ZGlmZiAtLWdpdCBhL2ZzL0tjb25maWcgYi9mcy9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNGFkNGIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9LY29uZmlnCkBAIC0wLDAgKzEsMTcyOSBAQAorIworIyBGaWxlIHN5c3RlbSBjb25maWd1cmF0aW9uCisjCisKK21lbnUgIkZpbGUgc3lzdGVtcyIKKworY29uZmlnIEVYVDJfRlMKKwl0cmlzdGF0ZSAiU2Vjb25kIGV4dGVuZGVkIGZzIHN1cHBvcnQiCisJaGVscAorCSAgRXh0MiBpcyBhIHN0YW5kYXJkIExpbnV4IGZpbGUgc3lzdGVtIGZvciBoYXJkIGRpc2tzLgorCisJICBUbyBjb21waWxlIHRoaXMgZmlsZSBzeXN0ZW0gc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZXh0Mi4gIEJlIGF3YXJlIGhvd2V2ZXIgdGhhdCB0aGUgZmlsZSBzeXN0ZW0KKwkgIG9mIHlvdXIgcm9vdCBwYXJ0aXRpb24gKHRoZSBvbmUgY29udGFpbmluZyB0aGUgZGlyZWN0b3J5IC8pIGNhbm5vdAorCSAgYmUgY29tcGlsZWQgYXMgYSBtb2R1bGUsIGFuZCBzbyB0aGlzIGNvdWxkIGJlIGRhbmdlcm91cy4KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIEVYVDJfRlNfWEFUVFIKKwlib29sICJFeHQyIGV4dGVuZGVkIGF0dHJpYnV0ZXMiCisJZGVwZW5kcyBvbiBFWFQyX0ZTCisJaGVscAorCSAgRXh0ZW5kZWQgYXR0cmlidXRlcyBhcmUgbmFtZTp2YWx1ZSBwYWlycyBhc3NvY2lhdGVkIHdpdGggaW5vZGVzIGJ5CisJICB0aGUga2VybmVsIG9yIGJ5IHVzZXJzIChzZWUgdGhlIGF0dHIoNSkgbWFudWFsIHBhZ2UsIG9yIHZpc2l0CisJICA8aHR0cDovL2FjbC5iZXN0Yml0cy5hdC8+IGZvciBkZXRhaWxzKS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEVYVDJfRlNfUE9TSVhfQUNMCisJYm9vbCAiRXh0MiBQT1NJWCBBY2Nlc3MgQ29udHJvbCBMaXN0cyIKKwlkZXBlbmRzIG9uIEVYVDJfRlNfWEFUVFIKKwloZWxwCisJICBQb3NpeCBBY2Nlc3MgQ29udHJvbCBMaXN0cyAoQUNMcykgc3VwcG9ydCBwZXJtaXNzaW9ucyBmb3IgdXNlcnMgYW5kCisJICBncm91cHMgYmV5b25kIHRoZSBvd25lci9ncm91cC93b3JsZCBzY2hlbWUuCisKKwkgIFRvIGxlYXJuIG1vcmUgYWJvdXQgQWNjZXNzIENvbnRyb2wgTGlzdHMsIHZpc2l0IHRoZSBQb3NpeCBBQ0xzIGZvcgorCSAgTGludXggd2Vic2l0ZSA8aHR0cDovL2FjbC5iZXN0Yml0cy5hdC8+LgorCisJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IEFjY2VzcyBDb250cm9sIExpc3RzIGFyZSwgc2F5IE4KKworY29uZmlnIEVYVDJfRlNfU0VDVVJJVFkKKwlib29sICJFeHQyIFNlY3VyaXR5IExhYmVscyIKKwlkZXBlbmRzIG9uIEVYVDJfRlNfWEFUVFIKKwloZWxwCisJICBTZWN1cml0eSBsYWJlbHMgc3VwcG9ydCBhbHRlcm5hdGl2ZSBhY2Nlc3MgY29udHJvbCBtb2RlbHMKKwkgIGltcGxlbWVudGVkIGJ5IHNlY3VyaXR5IG1vZHVsZXMgbGlrZSBTRUxpbnV4LiAgVGhpcyBvcHRpb24KKwkgIGVuYWJsZXMgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGhhbmRsZXIgZm9yIGZpbGUgc2VjdXJpdHkKKwkgIGxhYmVscyBpbiB0aGUgZXh0MiBmaWxlc3lzdGVtLgorCisJICBJZiB5b3UgYXJlIG5vdCB1c2luZyBhIHNlY3VyaXR5IG1vZHVsZSB0aGF0IHJlcXVpcmVzIHVzaW5nCisJICBleHRlbmRlZCBhdHRyaWJ1dGVzIGZvciBmaWxlIHNlY3VyaXR5IGxhYmVscywgc2F5IE4uCisKK2NvbmZpZyBFWFQzX0ZTCisJdHJpc3RhdGUgIkV4dDMgam91cm5hbGxpbmcgZmlsZSBzeXN0ZW0gc3VwcG9ydCIKKwloZWxwCisJICBUaGlzIGlzIHRoZSBqb3VybmFsaW5nIHZlcnNpb24gb2YgdGhlIFNlY29uZCBleHRlbmRlZCBmaWxlIHN5c3RlbQorCSAgKG9mdGVuIGNhbGxlZCBleHQzKSwgdGhlIGRlIGZhY3RvIHN0YW5kYXJkIExpbnV4IGZpbGUgc3lzdGVtCisJICAobWV0aG9kIHRvIG9yZ2FuaXplIGZpbGVzIG9uIGEgc3RvcmFnZSBkZXZpY2UpIGZvciBoYXJkIGRpc2tzLgorCisJICBUaGUgam91cm5hbGluZyBjb2RlIGluY2x1ZGVkIGluIHRoaXMgZHJpdmVyIG1lYW5zIHlvdSBkbyBub3QgaGF2ZQorCSAgdG8gcnVuIGUyZnNjayAoZmlsZSBzeXN0ZW0gY2hlY2tlcikgb24geW91ciBmaWxlIHN5c3RlbXMgYWZ0ZXIgYQorCSAgY3Jhc2guICBUaGUgam91cm5hbCBrZWVwcyB0cmFjayBvZiBhbnkgY2hhbmdlcyB0aGF0IHdlcmUgYmVpbmcgbWFkZQorCSAgYXQgdGhlIHRpbWUgdGhlIHN5c3RlbSBjcmFzaGVkLCBhbmQgY2FuIGVuc3VyZSB0aGF0IHlvdXIgZmlsZSBzeXN0ZW0KKwkgIGlzIGNvbnNpc3RlbnQgd2l0aG91dCB0aGUgbmVlZCBmb3IgYSBsZW5ndGh5IGNoZWNrLgorCisJICBPdGhlciB0aGFuIGFkZGluZyB0aGUgam91cm5hbCB0byB0aGUgZmlsZSBzeXN0ZW0sIHRoZSBvbi1kaXNrIGZvcm1hdAorCSAgb2YgZXh0MyBpcyBpZGVudGljYWwgdG8gZXh0Mi4gIEl0IGlzIHBvc3NpYmxlIHRvIGZyZWVseSBzd2l0Y2gKKwkgIGJldHdlZW4gdXNpbmcgdGhlIGV4dDMgZHJpdmVyIGFuZCB0aGUgZXh0MiBkcml2ZXIsIGFzIGxvbmcgYXMgdGhlCisJICBmaWxlIHN5c3RlbSBoYXMgYmVlbiBjbGVhbmx5IHVubW91bnRlZCwgb3IgZTJmc2NrIGlzIHJ1biBvbiB0aGUgZmlsZQorCSAgc3lzdGVtLgorCisJICBUbyBhZGQgYSBqb3VybmFsIG9uIGFuIGV4aXN0aW5nIGV4dDIgZmlsZSBzeXN0ZW0gb3IgY2hhbmdlIHRoZQorCSAgYmVoYXZpb3Igb2YgZXh0MyBmaWxlIHN5c3RlbXMsIHlvdSBjYW4gdXNlIHRoZSB0dW5lMmZzIHV0aWxpdHkgKCJtYW4KKwkgIHR1bmUyZnMiKS4gIFRvIG1vZGlmeSBhdHRyaWJ1dGVzIG9mIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBvbiBleHQzCisJICBmaWxlIHN5c3RlbXMsIHVzZSBjaGF0dHIgKCJtYW4gY2hhdHRyIikuICBZb3UgbmVlZCB0byBiZSB1c2luZworCSAgZTJmc3Byb2dzIHZlcnNpb24gMS4yMCBvciBsYXRlciBpbiBvcmRlciB0byBjcmVhdGUgZXh0MyBqb3VybmFscworCSAgKGF2YWlsYWJsZSBhdCA8aHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9lMmZzcHJvZ3MvPikuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBmaWxlIHN5c3RlbSBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBleHQzLiAgQmUgYXdhcmUgaG93ZXZlciB0aGF0IHRoZSBmaWxlIHN5c3RlbQorCSAgb2YgeW91ciByb290IHBhcnRpdGlvbiAodGhlIG9uZSBjb250YWluaW5nIHRoZSBkaXJlY3RvcnkgLykgY2Fubm90CisJICBiZSBjb21waWxlZCBhcyBhIG1vZHVsZSwgYW5kIHNvIHRoaXMgbWF5IGJlIGRhbmdlcm91cy4KKworY29uZmlnIEVYVDNfRlNfWEFUVFIKKwlib29sICJFeHQzIGV4dGVuZGVkIGF0dHJpYnV0ZXMiCisJZGVwZW5kcyBvbiBFWFQzX0ZTCisJZGVmYXVsdCB5CisJaGVscAorCSAgRXh0ZW5kZWQgYXR0cmlidXRlcyBhcmUgbmFtZTp2YWx1ZSBwYWlycyBhc3NvY2lhdGVkIHdpdGggaW5vZGVzIGJ5CisJICB0aGUga2VybmVsIG9yIGJ5IHVzZXJzIChzZWUgdGhlIGF0dHIoNSkgbWFudWFsIHBhZ2UsIG9yIHZpc2l0CisJICA8aHR0cDovL2FjbC5iZXN0Yml0cy5hdC8+IGZvciBkZXRhaWxzKS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworCSAgWW91IG5lZWQgdGhpcyBmb3IgUE9TSVggQUNMIHN1cHBvcnQgb24gZXh0My4KKworY29uZmlnIEVYVDNfRlNfUE9TSVhfQUNMCisJYm9vbCAiRXh0MyBQT1NJWCBBY2Nlc3MgQ29udHJvbCBMaXN0cyIKKwlkZXBlbmRzIG9uIEVYVDNfRlNfWEFUVFIKKwloZWxwCisJICBQb3NpeCBBY2Nlc3MgQ29udHJvbCBMaXN0cyAoQUNMcykgc3VwcG9ydCBwZXJtaXNzaW9ucyBmb3IgdXNlcnMgYW5kCisJICBncm91cHMgYmV5b25kIHRoZSBvd25lci9ncm91cC93b3JsZCBzY2hlbWUuCisKKwkgIFRvIGxlYXJuIG1vcmUgYWJvdXQgQWNjZXNzIENvbnRyb2wgTGlzdHMsIHZpc2l0IHRoZSBQb3NpeCBBQ0xzIGZvcgorCSAgTGludXggd2Vic2l0ZSA8aHR0cDovL2FjbC5iZXN0Yml0cy5hdC8+LgorCisJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IEFjY2VzcyBDb250cm9sIExpc3RzIGFyZSwgc2F5IE4KKworY29uZmlnIEVYVDNfRlNfU0VDVVJJVFkKKwlib29sICJFeHQzIFNlY3VyaXR5IExhYmVscyIKKwlkZXBlbmRzIG9uIEVYVDNfRlNfWEFUVFIKKwloZWxwCisJICBTZWN1cml0eSBsYWJlbHMgc3VwcG9ydCBhbHRlcm5hdGl2ZSBhY2Nlc3MgY29udHJvbCBtb2RlbHMKKwkgIGltcGxlbWVudGVkIGJ5IHNlY3VyaXR5IG1vZHVsZXMgbGlrZSBTRUxpbnV4LiAgVGhpcyBvcHRpb24KKwkgIGVuYWJsZXMgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGhhbmRsZXIgZm9yIGZpbGUgc2VjdXJpdHkKKwkgIGxhYmVscyBpbiB0aGUgZXh0MyBmaWxlc3lzdGVtLgorCisJICBJZiB5b3UgYXJlIG5vdCB1c2luZyBhIHNlY3VyaXR5IG1vZHVsZSB0aGF0IHJlcXVpcmVzIHVzaW5nCisJICBleHRlbmRlZCBhdHRyaWJ1dGVzIGZvciBmaWxlIHNlY3VyaXR5IGxhYmVscywgc2F5IE4uCisKK2NvbmZpZyBKQkQKKyMgQ09ORklHX0pCRCBjb3VsZCBiZSBpdHMgb3duIG9wdGlvbiAoZXZlbiBtb2R1bGFyKSwgYnV0IHVudGlsIHRoZXJlIGFyZQorIyBvdGhlciB1c2VycyB0aGFuIGV4dDMsIHdlIHdpbGwgc2ltcGx5IG1ha2UgaXQgYmUgdGhlIHNhbWUgYXMgQ09ORklHX0VYVDNfRlMKKyMgZGVwX3RyaXN0YXRlICcgIEpvdXJuYWwgQmxvY2sgRGV2aWNlIHN1cHBvcnQgKEpCRCBmb3IgZXh0MyknIENPTkZJR19KQkQgJENPTkZJR19FWFQzX0ZTCisJdHJpc3RhdGUKKwlkZWZhdWx0IEVYVDNfRlMKKwloZWxwCisJICBUaGlzIGlzIGEgZ2VuZXJpYyBqb3VybmFsaW5nIGxheWVyIGZvciBibG9jayBkZXZpY2VzLiAgSXQgaXMKKwkgIGN1cnJlbnRseSB1c2VkIGJ5IHRoZSBleHQzIGZpbGUgc3lzdGVtLCBidXQgaXQgY291bGQgYWxzbyBiZSB1c2VkIHRvCisJICBhZGQgam91cm5hbCBzdXBwb3J0IHRvIG90aGVyIGZpbGUgc3lzdGVtcyBvciBibG9jayBkZXZpY2VzIHN1Y2ggYXMKKwkgIFJBSUQgb3IgTFZNLgorCisJICBJZiB5b3UgYXJlIHVzaW5nIHRoZSBleHQzIGZpbGUgc3lzdGVtLCB5b3UgbmVlZCB0byBzYXkgWSBoZXJlLiBJZgorCSAgeW91IGFyZSBub3QgdXNpbmcgZXh0MyB0aGVuIHlvdSB3aWxsIHByb2JhYmx5IHdhbnQgdG8gc2F5IE4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkZXZpY2UgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIGpiZC4gIElmIHlvdSBhcmUgY29tcGlsaW5nIGV4dDMgaW50byB0aGUga2VybmVsLCB5b3UgY2Fubm90CisJICBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZS4KKworY29uZmlnIEpCRF9ERUJVRworCWJvb2wgIkpCRCAoZXh0MykgZGVidWdnaW5nIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBKQkQKKwloZWxwCisJICBJZiB5b3UgYXJlIHVzaW5nIHRoZSBleHQzIGpvdXJuYWxlZCBmaWxlIHN5c3RlbSAob3IgcG90ZW50aWFsbHkgYW55CisJICBvdGhlciBmaWxlIHN5c3RlbS9kZXZpY2UgdXNpbmcgSkJEKSwgdGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0bworCSAgZW5hYmxlIGRlYnVnZ2luZyBvdXRwdXQgd2hpbGUgdGhlIHN5c3RlbSBpcyBydW5uaW5nLCBpbiBvcmRlciB0bworCSAgaGVscCB0cmFjayBkb3duIGFueSBwcm9ibGVtcyB5b3UgYXJlIGhhdmluZy4gIEJ5IGRlZmF1bHQgdGhlCisJICBkZWJ1Z2dpbmcgb3V0cHV0IHdpbGwgYmUgdHVybmVkIG9mZi4KKworCSAgSWYgeW91IHNlbGVjdCBZIGhlcmUsIHRoZW4geW91IHdpbGwgYmUgYWJsZSB0byB0dXJuIG9uIGRlYnVnZ2luZworCSAgd2l0aCAiZWNobyBOID4gL3Byb2Mvc3lzL2ZzL2piZC1kZWJ1ZyIsIHdoZXJlIE4gaXMgYSBudW1iZXIgYmV0d2VlbgorCSAgMSBhbmQgNSwgdGhlIGhpZ2hlciB0aGUgbnVtYmVyLCB0aGUgbW9yZSBkZWJ1Z2dpbmcgb3V0cHV0IGlzCisJICBnZW5lcmF0ZWQuICBUbyB0dXJuIGRlYnVnZ2luZyBvZmYgYWdhaW4sIGRvCisJICAiZWNobyAwID4gL3Byb2Mvc3lzL2ZzL2piZC1kZWJ1ZyIuCisKK2NvbmZpZyBGU19NQkNBQ0hFCisjIE1ldGEgYmxvY2sgY2FjaGUgZm9yIEV4dGVuZGVkIEF0dHJpYnV0ZXMgKGV4dDIvZXh0MykKKwl0cmlzdGF0ZQorCWRlcGVuZHMgb24gRVhUMl9GU19YQVRUUiB8fCBFWFQzX0ZTX1hBVFRSCisJZGVmYXVsdCB5IGlmIEVYVDJfRlM9eSB8fCBFWFQzX0ZTPXkKKwlkZWZhdWx0IG0gaWYgRVhUMl9GUz1tIHx8IEVYVDNfRlM9bQorCitjb25maWcgUkVJU0VSRlNfRlMKKwl0cmlzdGF0ZSAiUmVpc2VyZnMgc3VwcG9ydCIKKwloZWxwCisJICBTdG9yZXMgbm90IGp1c3QgZmlsZW5hbWVzIGJ1dCB0aGUgZmlsZXMgdGhlbXNlbHZlcyBpbiBhIGJhbGFuY2VkCisJICB0cmVlLiAgVXNlcyBqb3VybmFsaW5nLgorCisJICBCYWxhbmNlZCB0cmVlcyBhcmUgbW9yZSBlZmZpY2llbnQgdGhhbiB0cmFkaXRpb25hbCBmaWxlIHN5c3RlbQorCSAgYXJjaGl0ZWN0dXJhbCBmb3VuZGF0aW9ucy4KKworCSAgSW4gZ2VuZXJhbCwgUmVpc2VyRlMgaXMgYXMgZmFzdCBhcyBleHQyLCBidXQgaXMgdmVyeSBlZmZpY2llbnQgd2l0aAorCSAgbGFyZ2UgZGlyZWN0b3JpZXMgYW5kIHNtYWxsIGZpbGVzLiAgQWRkaXRpb25hbCBwYXRjaGVzIGFyZSBuZWVkZWQKKwkgIGZvciBORlMgYW5kIHF1b3RhcywgcGxlYXNlIHNlZSA8aHR0cDovL3d3dy5uYW1lc3lzLmNvbS8+IGZvciBsaW5rcy4KKworCSAgSXQgaXMgbW9yZSBlYXNpbHkgZXh0ZW5kZWQgdG8gaGF2ZSBmZWF0dXJlcyBjdXJyZW50bHkgZm91bmQgaW4KKwkgIGRhdGFiYXNlIGFuZCBrZXl3b3JkIHNlYXJjaCBzeXN0ZW1zIHRoYW4gYmxvY2sgYWxsb2NhdGlvbiBiYXNlZCBmaWxlCisJICBzeXN0ZW1zIGFyZS4gIFRoZSBuZXh0IHZlcnNpb24gd2lsbCBiZSBzbyBleHRlbmRlZCwgYW5kIHdpbGwgc3VwcG9ydAorCSAgcGx1Z2lucyBjb25zaXN0ZW50IHdpdGggb3VyIG1vdHRvIGBgSXQgdGFrZXMgbW9yZSB0aGFuIGEgbGljZW5zZSB0bworCSAgbWFrZSBzb3VyY2UgY29kZSBvcGVuLicnCisKKwkgIFJlYWQgPGh0dHA6Ly93d3cubmFtZXN5cy5jb20vPiB0byBsZWFybiBtb3JlIGFib3V0IHJlaXNlcmZzLgorCisJICBTcG9uc29yZWQgYnkgVGhyZXNob2xkIE5ldHdvcmtzLCBFbXVzaWMuY29tLCBhbmQgQmlnc3RvcmFnZS5jb20uCisKKwkgIElmIHlvdSBsaWtlIGl0LCB5b3UgY2FuIHBheSB1cyB0byBhZGQgbmV3IGZlYXR1cmVzIHRvIGl0IHRoYXQgeW91CisJICBuZWVkLCBidXkgYSBzdXBwb3J0IGNvbnRyYWN0LCBvciBwYXkgdXMgdG8gcG9ydCBpdCB0byBhbm90aGVyIE9TLgorCitjb25maWcgUkVJU0VSRlNfQ0hFQ0sKKwlib29sICJFbmFibGUgcmVpc2VyZnMgZGVidWcgbW9kZSIKKwlkZXBlbmRzIG9uIFJFSVNFUkZTX0ZTCisJaGVscAorCSAgSWYgeW91IHNldCB0aGlzIHRvIFksIHRoZW4gUmVpc2VyRlMgd2lsbCBwZXJmb3JtIGV2ZXJ5IGNoZWNrIGl0IGNhbgorCSAgcG9zc2libHkgaW1hZ2luZSBvZiBpdHMgaW50ZXJuYWwgY29uc2lzdGVuY3kgdGhyb3VnaG91dCBpdHMKKwkgIG9wZXJhdGlvbi4gIEl0IHdpbGwgYWxzbyBnbyBzdWJzdGFudGlhbGx5IHNsb3dlci4gIE1vcmUgdGhhbiBvbmNlIHdlCisJICBoYXZlIGZvcmdvdHRlbiB0aGF0IHRoaXMgd2FzIG9uLCBhbmQgdGhlbiBnb25lIGRlc3BvbmRlbnQgb3ZlciB0aGUKKwkgIGxhdGVzdCBiZW5jaG1hcmtzLjotKSBVc2Ugb2YgdGhpcyBvcHRpb24gYWxsb3dzIG91ciB0ZWFtIHRvIGdvIGFsbAorCSAgb3V0IGluIGNoZWNraW5nIGZvciBjb25zaXN0ZW5jeSB3aGVuIGRlYnVnZ2luZyB3aXRob3V0IGZlYXIgb2YgaXRzCisJICBlZmZlY3Qgb24gZW5kIHVzZXJzLiAgSWYgeW91IGFyZSBvbiB0aGUgdmVyZ2Ugb2Ygc2VuZGluZyBpbiBhIGJ1ZworCSAgcmVwb3J0LCBzYXkgWSBhbmQgeW91IG1pZ2h0IGdldCBhIHVzZWZ1bCBlcnJvciBtZXNzYWdlLiAgQWxtb3N0CisJICBldmVyeW9uZSBzaG91bGQgc2F5IE4uCisKK2NvbmZpZyBSRUlTRVJGU19QUk9DX0lORk8KKwlib29sICJTdGF0cyBpbiAvcHJvYy9mcy9yZWlzZXJmcyIKKwlkZXBlbmRzIG9uIFJFSVNFUkZTX0ZTCisJaGVscAorCSAgQ3JlYXRlIHVuZGVyIC9wcm9jL2ZzL3JlaXNlcmZzIGEgaGllcmFyY2h5IG9mIGZpbGVzLCBkaXNwbGF5aW5nCisJICB2YXJpb3VzIFJlaXNlckZTIHN0YXRpc3RpY3MgYW5kIGludGVybmFsIGRhdGEgYXQgdGhlIGV4cGVuc2Ugb2YKKwkgIG1ha2luZyB5b3VyIGtlcm5lbCBvciBtb2R1bGUgc2xpZ2h0bHkgbGFyZ2VyICgrOCBLQikuIFRoaXMgYWxzbworCSAgaW5jcmVhc2VzIHRoZSBhbW91bnQgb2Yga2VybmVsIG1lbW9yeSByZXF1aXJlZCBmb3IgZWFjaCBtb3VudC4KKwkgIEFsbW9zdCBldmVyeW9uZSBidXQgUmVpc2VyRlMgZGV2ZWxvcGVycyBhbmQgcGVvcGxlIGZpbmUtdHVuaW5nCisJICByZWlzZXJmcyBvciB0cmFjaW5nIHByb2JsZW1zIHNob3VsZCBzYXkgTi4KKworY29uZmlnIFJFSVNFUkZTX0ZTX1hBVFRSCisJYm9vbCAiUmVpc2VyRlMgZXh0ZW5kZWQgYXR0cmlidXRlcyIKKwlkZXBlbmRzIG9uIFJFSVNFUkZTX0ZTCisJaGVscAorCSAgRXh0ZW5kZWQgYXR0cmlidXRlcyBhcmUgbmFtZTp2YWx1ZSBwYWlycyBhc3NvY2lhdGVkIHdpdGggaW5vZGVzIGJ5CisJICB0aGUga2VybmVsIG9yIGJ5IHVzZXJzIChzZWUgdGhlIGF0dHIoNSkgbWFudWFsIHBhZ2UsIG9yIHZpc2l0CisJICA8aHR0cDovL2FjbC5iZXN0Yml0cy5hdC8+IGZvciBkZXRhaWxzKS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFJFSVNFUkZTX0ZTX1BPU0lYX0FDTAorCWJvb2wgIlJlaXNlckZTIFBPU0lYIEFjY2VzcyBDb250cm9sIExpc3RzIgorCWRlcGVuZHMgb24gUkVJU0VSRlNfRlNfWEFUVFIKKwloZWxwCisJICBQb3NpeCBBY2Nlc3MgQ29udHJvbCBMaXN0cyAoQUNMcykgc3VwcG9ydCBwZXJtaXNzaW9ucyBmb3IgdXNlcnMgYW5kCisJICBncm91cHMgYmV5b25kIHRoZSBvd25lci9ncm91cC93b3JsZCBzY2hlbWUuCisKKwkgIFRvIGxlYXJuIG1vcmUgYWJvdXQgQWNjZXNzIENvbnRyb2wgTGlzdHMsIHZpc2l0IHRoZSBQb3NpeCBBQ0xzIGZvcgorCSAgTGludXggd2Vic2l0ZSA8aHR0cDovL2FjbC5iZXN0Yml0cy5hdC8+LgorCisJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IEFjY2VzcyBDb250cm9sIExpc3RzIGFyZSwgc2F5IE4KKworY29uZmlnIFJFSVNFUkZTX0ZTX1NFQ1VSSVRZCisJYm9vbCAiUmVpc2VyRlMgU2VjdXJpdHkgTGFiZWxzIgorCWRlcGVuZHMgb24gUkVJU0VSRlNfRlNfWEFUVFIKKwloZWxwCisJICBTZWN1cml0eSBsYWJlbHMgc3VwcG9ydCBhbHRlcm5hdGl2ZSBhY2Nlc3MgY29udHJvbCBtb2RlbHMKKwkgIGltcGxlbWVudGVkIGJ5IHNlY3VyaXR5IG1vZHVsZXMgbGlrZSBTRUxpbnV4LiAgVGhpcyBvcHRpb24KKwkgIGVuYWJsZXMgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGhhbmRsZXIgZm9yIGZpbGUgc2VjdXJpdHkKKwkgIGxhYmVscyBpbiB0aGUgUmVpc2VyRlMgZmlsZXN5c3RlbS4KKworCSAgSWYgeW91IGFyZSBub3QgdXNpbmcgYSBzZWN1cml0eSBtb2R1bGUgdGhhdCByZXF1aXJlcyB1c2luZworCSAgZXh0ZW5kZWQgYXR0cmlidXRlcyBmb3IgZmlsZSBzZWN1cml0eSBsYWJlbHMsIHNheSBOLgorCitjb25maWcgSkZTX0ZTCisJdHJpc3RhdGUgIkpGUyBmaWxlc3lzdGVtIHN1cHBvcnQiCisJc2VsZWN0IE5MUworCWhlbHAKKwkgIFRoaXMgaXMgYSBwb3J0IG9mIElCTSdzIEpvdXJuYWxlZCBGaWxlc3lzdGVtIC4gIE1vcmUgaW5mb3JtYXRpb24gaXMKKwkgIGF2YWlsYWJsZSBpbiB0aGUgZmlsZSA8ZmlsZTpEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2pmcy50eHQ+LgorCisJICBJZiB5b3UgZG8gbm90IGludGVuZCB0byB1c2UgdGhlIEpGUyBmaWxlc3lzdGVtLCBzYXkgTi4KKworY29uZmlnIEpGU19QT1NJWF9BQ0wKKwlib29sICJKRlMgUE9TSVggQWNjZXNzIENvbnRyb2wgTGlzdHMiCisJZGVwZW5kcyBvbiBKRlNfRlMKKwloZWxwCisJICBQb3NpeCBBY2Nlc3MgQ29udHJvbCBMaXN0cyAoQUNMcykgc3VwcG9ydCBwZXJtaXNzaW9ucyBmb3IgdXNlcnMgYW5kCisJICBncm91cHMgYmV5b25kIHRoZSBvd25lci9ncm91cC93b3JsZCBzY2hlbWUuCisKKwkgIFRvIGxlYXJuIG1vcmUgYWJvdXQgQWNjZXNzIENvbnRyb2wgTGlzdHMsIHZpc2l0IHRoZSBQb3NpeCBBQ0xzIGZvcgorCSAgTGludXggd2Vic2l0ZSA8aHR0cDovL2FjbC5iZXN0Yml0cy5hdC8+LgorCisJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IEFjY2VzcyBDb250cm9sIExpc3RzIGFyZSwgc2F5IE4KKworY29uZmlnIEpGU19TRUNVUklUWQorCWJvb2wgIkpGUyBTZWN1cml0eSBMYWJlbHMiCisJZGVwZW5kcyBvbiBKRlNfRlMKKwloZWxwCisJICBTZWN1cml0eSBsYWJlbHMgc3VwcG9ydCBhbHRlcm5hdGl2ZSBhY2Nlc3MgY29udHJvbCBtb2RlbHMKKwkgIGltcGxlbWVudGVkIGJ5IHNlY3VyaXR5IG1vZHVsZXMgbGlrZSBTRUxpbnV4LiAgVGhpcyBvcHRpb24KKwkgIGVuYWJsZXMgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGhhbmRsZXIgZm9yIGZpbGUgc2VjdXJpdHkKKwkgIGxhYmVscyBpbiB0aGUgamZzIGZpbGVzeXN0ZW0uCisKKwkgIElmIHlvdSBhcmUgbm90IHVzaW5nIGEgc2VjdXJpdHkgbW9kdWxlIHRoYXQgcmVxdWlyZXMgdXNpbmcKKwkgIGV4dGVuZGVkIGF0dHJpYnV0ZXMgZm9yIGZpbGUgc2VjdXJpdHkgbGFiZWxzLCBzYXkgTi4KKworY29uZmlnIEpGU19ERUJVRworCWJvb2wgIkpGUyBkZWJ1Z2dpbmciCisJZGVwZW5kcyBvbiBKRlNfRlMKKwloZWxwCisJICBJZiB5b3UgYXJlIGV4cGVyaWVuY2luZyBhbnkgcHJvYmxlbXMgd2l0aCB0aGUgSkZTIGZpbGVzeXN0ZW0sIHNheQorCSAgWSBoZXJlLiAgVGhpcyB3aWxsIHJlc3VsdCBpbiBhZGRpdGlvbmFsIGRlYnVnZ2luZyBtZXNzYWdlcyB0byBiZQorCSAgd3JpdHRlbiB0byB0aGUgc3lzdGVtIGxvZy4gIFVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzLCB0aGlzCisJICByZXN1bHRzIGluIHZlcnkgbGl0dGxlIG92ZXJoZWFkLgorCitjb25maWcgSkZTX1NUQVRJU1RJQ1MKKwlib29sICJKRlMgc3RhdGlzdGljcyIKKwlkZXBlbmRzIG9uIEpGU19GUworCWhlbHAKKwkgIEVuYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgY2F1c2Ugc3RhdGlzdGljcyBmcm9tIHRoZSBKRlMgZmlsZSBzeXN0ZW0KKwkgIHRvIGJlIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSB1c2VyIGluIHRoZSAvcHJvYy9mcy9qZnMvIGRpcmVjdG9yeS4KKworY29uZmlnIEZTX1BPU0lYX0FDTAorIyBQb3NpeCBBQ0wgdXRpbGl0eSByb3V0aW5lcyAoZm9yIG5vdywgb25seSBleHQyL2V4dDMvamZzL3JlaXNlcmZzKQorIworIyBOT1RFOiB5b3UgY2FuIGltcGxlbWVudCBQb3NpeCBBQ0xzIHdpdGhvdXQgdGhlc2UgaGVscGVycyAoWEZTIGRvZXMpLgorIyAJTmV2ZXIgdXNlIHRoaXMgc3ltYm9sIGZvciBpZmRlZnMuCisjCisJYm9vbAorCWRlcGVuZHMgb24gRVhUMl9GU19QT1NJWF9BQ0wgfHwgRVhUM19GU19QT1NJWF9BQ0wgfHwgSkZTX1BPU0lYX0FDTCB8fCBSRUlTRVJGU19GU19QT1NJWF9BQ0wgfHwgTkZTRF9WNAorCWRlZmF1bHQgeQorCitzb3VyY2UgImZzL3hmcy9LY29uZmlnIgorCitjb25maWcgTUlOSVhfRlMKKwl0cmlzdGF0ZSAiTWluaXggZnMgc3VwcG9ydCIKKwloZWxwCisJICBNaW5peCBpcyBhIHNpbXBsZSBvcGVyYXRpbmcgc3lzdGVtIHVzZWQgaW4gbWFueSBjbGFzc2VzIGFib3V0IE9TJ3MuCisJICBUaGUgbWluaXggZmlsZSBzeXN0ZW0gKG1ldGhvZCB0byBvcmdhbml6ZSBmaWxlcyBvbiBhIGhhcmQgZGlzaworCSAgcGFydGl0aW9uIG9yIGEgZmxvcHB5IGRpc2spIHdhcyB0aGUgb3JpZ2luYWwgZmlsZSBzeXN0ZW0gZm9yIExpbnV4LAorCSAgYnV0IGhhcyBiZWVuIHN1cGVyc2VkZWQgYnkgdGhlIHNlY29uZCBleHRlbmRlZCBmaWxlIHN5c3RlbSBleHQyZnMuCisJICBZb3UgZG9uJ3Qgd2FudCB0byB1c2UgdGhlIG1pbml4IGZpbGUgc3lzdGVtIG9uIHlvdXIgaGFyZCBkaXNrCisJICBiZWNhdXNlIG9mIGNlcnRhaW4gYnVpbHQtaW4gcmVzdHJpY3Rpb25zLCBidXQgaXQgaXMgc29tZXRpbWVzIGZvdW5kCisJICBvbiBvbGRlciBMaW51eCBmbG9wcHkgZGlza3MuICBUaGlzIG9wdGlvbiB3aWxsIGVubGFyZ2UgeW91ciBrZXJuZWwKKwkgIGJ5IGFib3V0IDI4IEtCLiBJZiB1bnN1cmUsIHNheSBOLgorCisJICBUbyBjb21waWxlIHRoaXMgZmlsZSBzeXN0ZW0gc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbWluaXguICBOb3RlIHRoYXQgdGhlIGZpbGUgc3lzdGVtIG9mIHlvdXIgcm9vdAorCSAgcGFydGl0aW9uICh0aGUgb25lIGNvbnRhaW5pbmcgdGhlIGRpcmVjdG9yeSAvKSBjYW5ub3QgYmUgY29tcGlsZWQgYXMKKwkgIGEgbW9kdWxlLgorCitjb25maWcgUk9NRlNfRlMKKwl0cmlzdGF0ZSAiUk9NIGZpbGUgc3lzdGVtIHN1cHBvcnQiCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhIHZlcnkgc21hbGwgcmVhZC1vbmx5IGZpbGUgc3lzdGVtIG1haW5seSBpbnRlbmRlZCBmb3IKKwkgIGluaXRpYWwgcmFtIGRpc2tzIG9mIGluc3RhbGxhdGlvbiBkaXNrcywgYnV0IGl0IGNvdWxkIGJlIHVzZWQgZm9yCisJICBvdGhlciByZWFkLW9ubHkgbWVkaWEgYXMgd2VsbC4gIFJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcm9tZnMudHh0PiBmb3IgZGV0YWlscy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGZpbGUgc3lzdGVtIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHJvbWZzLiAgTm90ZSB0aGF0IHRoZSBmaWxlIHN5c3RlbSBvZiB5b3VyCisJICByb290IHBhcnRpdGlvbiAodGhlIG9uZSBjb250YWluaW5nIHRoZSBkaXJlY3RvcnkgLykgY2Fubm90IGJlIGEKKwkgIG1vZHVsZS4KKworCSAgSWYgeW91IGRvbid0IGtub3cgd2hldGhlciB5b3UgbmVlZCBpdCwgdGhlbiB5b3UgZG9uJ3QgbmVlZCBpdDoKKwkgIGFuc3dlciBOLgorCitjb25maWcgUVVPVEEKKwlib29sICJRdW90YSBzdXBwb3J0IgorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIHNldCBwZXIgdXNlciBsaW1pdHMgZm9yIGRpc2sKKwkgIHVzYWdlIChhbHNvIGNhbGxlZCBkaXNrIHF1b3RhcykuIEN1cnJlbnRseSwgaXQgd29ya3MgZm9yIHRoZQorCSAgZXh0MiwgZXh0MywgYW5kIHJlaXNlcmZzIGZpbGUgc3lzdGVtLiBleHQzIGFsc28gc3VwcG9ydHMgam91cm5hbGxlZAorCSAgcXVvdGFzIGZvciB3aGljaCB5b3UgZG9uJ3QgbmVlZCB0byBydW4gcXVvdGFjaGVjayg4KSBhZnRlciBhbiB1bmNsZWFuCisJICBzaHV0ZG93bi4gWW91IG5lZWQgYWRkaXRpb25hbCBzb2Z0d2FyZSBpbiBvcmRlciB0byB1c2UgcXVvdGEgc3VwcG9ydAorCSAgKHlvdSBjYW4gZG93bmxvYWQgc291cmNlcyBmcm9tCisJICA8aHR0cDovL3d3dy5zZi5uZXQvcHJvamVjdHMvbGludXhxdW90YS8+KS4gRm9yIGZ1cnRoZXIgZGV0YWlscywgcmVhZAorCSAgdGhlIFF1b3RhIG1pbmktSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LCBvciB0aGUgZG9jdW1lbnRhdGlvbiBwcm92aWRlZAorCSAgd2l0aCB0aGUgcXVvdGEgdG9vbHMuIFByb2JhYmx5IHRoZSBxdW90YSBzdXBwb3J0IGlzIG9ubHkgdXNlZnVsIGZvcgorCSAgbXVsdGkgdXNlciBzeXN0ZW1zLiBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgUUZNVF9WMQorCXRyaXN0YXRlICJPbGQgcXVvdGEgZm9ybWF0IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBRVU9UQQorCWhlbHAKKwkgIFRoaXMgcXVvdGEgZm9ybWF0IHdhcyAoaXMpIHVzZWQgYnkga2VybmVscyBlYXJsaWVyIHRoYW4gMi40LjIyLiBJZgorCSAgeW91IGhhdmUgcXVvdGEgd29ya2luZyBhbmQgeW91IGRvbid0IHdhbnQgdG8gY29udmVydCB0byBuZXcgcXVvdGEKKwkgIGZvcm1hdCBzYXkgWSBoZXJlLgorCitjb25maWcgUUZNVF9WMgorCXRyaXN0YXRlICJRdW90YSBmb3JtYXQgdjIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFFVT1RBCisJaGVscAorCSAgVGhpcyBxdW90YSBmb3JtYXQgYWxsb3dzIHVzaW5nIHF1b3RhcyB3aXRoIDMyLWJpdCBVSURzL0dJRHMuIElmIHlvdQorCSAgbmVlZCB0aGlzIGZ1bmN0aW9uYWxpdHkgc2F5IFkgaGVyZS4gTm90ZSB0aGF0IHlvdSB3aWxsIG5lZWQgcmVjZW50CisJICBxdW90YSB1dGlsaXRpZXMgKD49IDMuMDEpIGZvciBuZXcgcXVvdGEgZm9ybWF0IHdpdGggdGhpcyBrZXJuZWwuCisKK2NvbmZpZyBRVU9UQUNUTAorCWJvb2wKKwlkZXBlbmRzIG9uIFhGU19RVU9UQSB8fCBRVU9UQQorCWRlZmF1bHQgeQorCitjb25maWcgRE5PVElGWQorCWJvb2wgIkRub3RpZnkgc3VwcG9ydCIgaWYgRU1CRURERUQKKwlkZWZhdWx0IHkKKwloZWxwCisJICBEbm90aWZ5IGlzIGEgZGlyZWN0b3J5LWJhc2VkIHBlci1mZCBmaWxlIGNoYW5nZSBub3RpZmljYXRpb24gc3lzdGVtCisJICB0aGF0IHVzZXMgc2lnbmFscyB0byBjb21tdW5pY2F0ZSBldmVudHMgdG8gdXNlci1zcGFjZS4gIFRoZXJlIGV4aXN0CisJICBzdXBlcmlvciBhbHRlcm5hdGl2ZXMsIGJ1dCBzb21lIGFwcGxpY2F0aW9ucyBtYXkgc3RpbGwgcmVseSBvbgorCSAgZG5vdGlmeS4KKworCSAgQmVjYXVzZSBvZiB0aGlzLCBpZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgQVVUT0ZTX0ZTCisJdHJpc3RhdGUgIktlcm5lbCBhdXRvbW91bnRlciBzdXBwb3J0IgorCWhlbHAKKwkgIFRoZSBhdXRvbW91bnRlciBpcyBhIHRvb2wgdG8gYXV0b21hdGljYWxseSBtb3VudCByZW1vdGUgZmlsZSBzeXN0ZW1zCisJICBvbiBkZW1hbmQuIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgcGFydGlhbGx5IGtlcm5lbC1iYXNlZCB0byByZWR1Y2UKKwkgIG92ZXJoZWFkIGluIHRoZSBhbHJlYWR5LW1vdW50ZWQgY2FzZTsgdGhpcyBpcyB1bmxpa2UgdGhlIEJTRAorCSAgYXV0b21vdW50ZXIgKGFtZCksIHdoaWNoIGlzIGEgcHVyZSB1c2VyIHNwYWNlIGRhZW1vbi4KKworCSAgVG8gdXNlIHRoZSBhdXRvbW91bnRlciB5b3UgbmVlZCB0aGUgdXNlci1zcGFjZSB0b29scyBmcm9tIHRoZSBhdXRvZnMKKwkgIHBhY2thZ2U7IHlvdSBjYW4gZmluZCB0aGUgbG9jYXRpb24gaW4gPGZpbGU6RG9jdW1lbnRhdGlvbi9DaGFuZ2VzPi4KKwkgIFlvdSBhbHNvIHdhbnQgdG8gYW5zd2VyIFkgdG8gIk5GUyBmaWxlIHN5c3RlbSBzdXBwb3J0IiwgYmVsb3cuCisKKwkgIElmIHlvdSB3YW50IHRvIHVzZSB0aGUgbmV3ZXIgdmVyc2lvbiBvZiB0aGUgYXV0b21vdW50ZXIgd2l0aCBtb3JlCisJICBmZWF0dXJlcywgc2F5IE4gaGVyZSBhbmQgc2F5IFkgdG8gIktlcm5lbCBhdXRvbW91bnRlciB2NCBzdXBwb3J0IiwKKwkgIGJlbG93LgorCisJICBUbyBjb21waWxlIHRoaXMgc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgYXV0b2ZzLgorCisJICBJZiB5b3UgYXJlIG5vdCBhIHBhcnQgb2YgYSBmYWlybHkgbGFyZ2UsIGRpc3RyaWJ1dGVkIG5ldHdvcmssIHlvdQorCSAgcHJvYmFibHkgZG8gbm90IG5lZWQgYW4gYXV0b21vdW50ZXIsIGFuZCBjYW4gc2F5IE4gaGVyZS4KKworY29uZmlnIEFVVE9GUzRfRlMKKwl0cmlzdGF0ZSAiS2VybmVsIGF1dG9tb3VudGVyIHZlcnNpb24gNCBzdXBwb3J0IChhbHNvIHN1cHBvcnRzIHYzKSIKKwloZWxwCisJICBUaGUgYXV0b21vdW50ZXIgaXMgYSB0b29sIHRvIGF1dG9tYXRpY2FsbHkgbW91bnQgcmVtb3RlIGZpbGUgc3lzdGVtcworCSAgb24gZGVtYW5kLiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHBhcnRpYWxseSBrZXJuZWwtYmFzZWQgdG8gcmVkdWNlCisJICBvdmVyaGVhZCBpbiB0aGUgYWxyZWFkeS1tb3VudGVkIGNhc2U7IHRoaXMgaXMgdW5saWtlIHRoZSBCU0QKKwkgIGF1dG9tb3VudGVyIChhbWQpLCB3aGljaCBpcyBhIHB1cmUgdXNlciBzcGFjZSBkYWVtb24uCisKKwkgIFRvIHVzZSB0aGUgYXV0b21vdW50ZXIgeW91IG5lZWQgdGhlIHVzZXItc3BhY2UgdG9vbHMgZnJvbQorCSAgPGZ0cDovL2Z0cC5rZXJuZWwub3JnL3B1Yi9saW51eC9kYWVtb25zL2F1dG9mcy92NC8+OyB5b3UgYWxzbworCSAgd2FudCB0byBhbnN3ZXIgWSB0byAiTkZTIGZpbGUgc3lzdGVtIHN1cHBvcnQiLCBiZWxvdy4KKworCSAgVG8gY29tcGlsZSB0aGlzIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIGF1dG9mczQuICBZb3Ugd2lsbCBuZWVkIHRvIGFkZCAiYWxpYXMgYXV0b2ZzIGF1dG9mczQiIHRvIHlvdXIKKwkgIG1vZHVsZXMgY29uZmlndXJhdGlvbiBmaWxlLgorCisJICBJZiB5b3UgYXJlIG5vdCBhIHBhcnQgb2YgYSBmYWlybHkgbGFyZ2UsIGRpc3RyaWJ1dGVkIG5ldHdvcmsgb3IKKwkgIGRvbid0IGhhdmUgYSBsYXB0b3Agd2hpY2ggbmVlZHMgdG8gZHluYW1pY2FsbHkgcmVjb25maWd1cmUgdG8gdGhlCisJICBsb2NhbCBuZXR3b3JrLCB5b3UgcHJvYmFibHkgZG8gbm90IG5lZWQgYW4gYXV0b21vdW50ZXIsIGFuZCBjYW4gc2F5CisJICBOIGhlcmUuCisKK21lbnUgIkNELVJPTS9EVkQgRmlsZXN5c3RlbXMiCisKK2NvbmZpZyBJU085NjYwX0ZTCisJdHJpc3RhdGUgIklTTyA5NjYwIENEUk9NIGZpbGUgc3lzdGVtIHN1cHBvcnQiCisJaGVscAorCSAgVGhpcyBpcyB0aGUgc3RhbmRhcmQgZmlsZSBzeXN0ZW0gdXNlZCBvbiBDRC1ST01zLiAgSXQgd2FzIHByZXZpb3VzbHkKKwkgIGtub3duIGFzICJIaWdoIFNpZXJyYSBGaWxlIFN5c3RlbSIgYW5kIGlzIGNhbGxlZCAiaHNmcyIgb24gb3RoZXIKKwkgIFVuaXggc3lzdGVtcy4gIFRoZSBzby1jYWxsZWQgUm9jay1SaWRnZSBleHRlbnNpb25zIHdoaWNoIGFsbG93IGZvcgorCSAgbG9uZyBVbml4IGZpbGVuYW1lcyBhbmQgc3ltYm9saWMgbGlua3MgYXJlIGFsc28gc3VwcG9ydGVkIGJ5IHRoaXMKKwkgIGRyaXZlci4gIElmIHlvdSBoYXZlIGEgQ0QtUk9NIGRyaXZlIGFuZCB3YW50IHRvIGRvIG1vcmUgd2l0aCBpdCB0aGFuCisJICBqdXN0IGxpc3RlbiB0byBhdWRpbyBDRHMgYW5kIHdhdGNoIGl0cyBMRURzLCBzYXkgWSAoYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvaXNvZnMudHh0PiBhbmQgdGhlIENELVJPTS1IT1dUTywKKwkgIGF2YWlsYWJsZSBmcm9tIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4pLCB0aGVyZWJ5CisJICBlbmxhcmdpbmcgeW91ciBrZXJuZWwgYnkgYWJvdXQgMjcgS0I7IG90aGVyd2lzZSBzYXkgTi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGZpbGUgc3lzdGVtIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGlzb2ZzLgorCitjb25maWcgSk9MSUVUCisJYm9vbCAiTWljcm9zb2Z0IEpvbGlldCBDRFJPTSBleHRlbnNpb25zIgorCWRlcGVuZHMgb24gSVNPOTY2MF9GUworCXNlbGVjdCBOTFMKKwloZWxwCisJICBKb2xpZXQgaXMgYSBNaWNyb3NvZnQgZXh0ZW5zaW9uIGZvciB0aGUgSVNPIDk2NjAgQ0QtUk9NIGZpbGUgc3lzdGVtCisJICB3aGljaCBhbGxvd3MgZm9yIGxvbmcgZmlsZW5hbWVzIGluIHVuaWNvZGUgZm9ybWF0ICh1bmljb2RlIGlzIHRoZQorCSAgbmV3IDE2IGJpdCBjaGFyYWN0ZXIgY29kZSwgc3VjY2Vzc29yIHRvIEFTQ0lJLCB3aGljaCBlbmNvZGVzIHRoZQorCSAgY2hhcmFjdGVycyBvZiBhbG1vc3QgYWxsIGxhbmd1YWdlcyBvZiB0aGUgd29ybGQ7IHNlZQorCSAgPGh0dHA6Ly93d3cudW5pY29kZS5vcmcvPiBmb3IgbW9yZSBpbmZvcm1hdGlvbikuICBTYXkgWSBoZXJlIGlmIHlvdQorCSAgd2FudCB0byBiZSBhYmxlIHRvIHJlYWQgSm9saWV0IENELVJPTXMgdW5kZXIgTGludXguCisKK2NvbmZpZyBaSVNPRlMKKwlib29sICJUcmFuc3BhcmVudCBkZWNvbXByZXNzaW9uIGV4dGVuc2lvbiIKKwlkZXBlbmRzIG9uIElTTzk2NjBfRlMKKwlzZWxlY3QgWkxJQl9JTkZMQVRFCisJaGVscAorCSAgVGhpcyBpcyBhIExpbnV4LXNwZWNpZmljIGV4dGVuc2lvbiB0byBSb2NrUmlkZ2Ugd2hpY2ggbGV0cyB5b3Ugc3RvcmUKKwkgIGRhdGEgaW4gY29tcHJlc3NlZCBmb3JtIG9uIGEgQ0QtUk9NIGFuZCBoYXZlIGl0IHRyYW5zcGFyZW50bHkKKwkgIGRlY29tcHJlc3NlZCB3aGVuIHRoZSBDRC1ST00gaXMgYWNjZXNzZWQuICBTZWUKKwkgIDxodHRwOi8vd3d3Lmtlcm5lbC5vcmcvcHViL2xpbnV4L3V0aWxzL2ZzL3ppc29mcy8+IGZvciB0aGUgdG9vbHMKKwkgIG5lY2Vzc2FyeSB0byBjcmVhdGUgc3VjaCBhIGZpbGVzeXN0ZW0uICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJlCisJICBhYmxlIHRvIHJlYWQgc3VjaCBjb21wcmVzc2VkIENELVJPTXMuCisKK2NvbmZpZyBaSVNPRlNfRlMKKyMgZm9yIGZzL25scy9Db25maWcuaW4KKwl0cmlzdGF0ZQorCWRlcGVuZHMgb24gWklTT0ZTCisJZGVmYXVsdCBJU085NjYwX0ZTCisKK2NvbmZpZyBVREZfRlMKKwl0cmlzdGF0ZSAiVURGIGZpbGUgc3lzdGVtIHN1cHBvcnQiCisJaGVscAorCSAgVGhpcyBpcyB0aGUgbmV3IGZpbGUgc3lzdGVtIHVzZWQgb24gc29tZSBDRC1ST01zIGFuZCBEVkRzLiBTYXkgWSBpZgorCSAgeW91IGludGVuZCB0byBtb3VudCBEVkQgZGlzY3Mgb3IgQ0RSVydzIHdyaXR0ZW4gaW4gcGFja2V0IG1vZGUsIG9yCisJICBpZiB3cml0dGVuIHRvIGJ5IG90aGVyIFVERiB1dGlsaXRpZXMsIHN1Y2ggYXMgRGlyZWN0Q0QuCisJICBQbGVhc2UgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3VkZi50eHQ+LgorCisJICBUbyBjb21waWxlIHRoaXMgZmlsZSBzeXN0ZW0gc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdWRmLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgVURGX05MUworCWJvb2wKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIChVREZfRlM9bSAmJiBOTFMpIHx8IChVREZfRlM9eSAmJiBOTFM9eSkKKworZW5kbWVudQorCittZW51ICJET1MvRkFUL05UIEZpbGVzeXN0ZW1zIgorCitjb25maWcgRkFUX0ZTCisJdHJpc3RhdGUKKwlzZWxlY3QgTkxTCisJaGVscAorCSAgSWYgeW91IHdhbnQgdG8gdXNlIG9uZSBvZiB0aGUgRkFULWJhc2VkIGZpbGUgc3lzdGVtcyAodGhlIE1TLURPUyBhbmQKKwkgIFZGQVQgKFdpbmRvd3MgOTUpIGZpbGUgc3lzdGVtcyksIHRoZW4geW91IG11c3Qgc2F5IFkgb3IgTSBoZXJlCisJICB0byBpbmNsdWRlIEZBVCBzdXBwb3J0LiBZb3Ugd2lsbCB0aGVuIGJlIGFibGUgdG8gbW91bnQgcGFydGl0aW9ucyBvcgorCSAgZGlza2V0dGVzIHdpdGggRkFULWJhc2VkIGZpbGUgc3lzdGVtcyBhbmQgdHJhbnNwYXJlbnRseSBhY2Nlc3MgdGhlCisJICBmaWxlcyBvbiB0aGVtLCBpLmUuIE1TRE9TIGZpbGVzIHdpbGwgbG9vayBhbmQgYmVoYXZlIGp1c3QgbGlrZSBhbGwKKwkgIG90aGVyIFVuaXggZmlsZXMuCisKKwkgIFRoaXMgRkFUIHN1cHBvcnQgaXMgbm90IGEgZmlsZSBzeXN0ZW0gaW4gaXRzZWxmLCBpdCBvbmx5IHByb3ZpZGVzCisJICB0aGUgZm91bmRhdGlvbiBmb3IgdGhlIG90aGVyIGZpbGUgc3lzdGVtcy4gWW91IHdpbGwgaGF2ZSB0byBzYXkgWSBvcgorCSAgTSB0byBhdCBsZWFzdCBvbmUgb2YgIk1TRE9TIGZzIHN1cHBvcnQiIG9yICJWRkFUIGZzIHN1cHBvcnQiIGluCisJICBvcmRlciB0byBtYWtlIHVzZSBvZiBpdC4KKworCSAgQW5vdGhlciB3YXkgdG8gcmVhZCBhbmQgd3JpdGUgTVNET1MgZmxvcHBpZXMgYW5kIGhhcmQgZHJpdmUKKwkgIHBhcnRpdGlvbnMgZnJvbSB3aXRoaW4gTGludXggKGJ1dCBub3QgdHJhbnNwYXJlbnRseSkgaXMgd2l0aCB0aGUKKwkgIG10b29scyAoIm1hbiBtdG9vbHMiKSBwcm9ncmFtIHN1aXRlLiBZb3UgZG9uJ3QgbmVlZCB0byBzYXkgWSBoZXJlIGluCisJICBvcmRlciB0byBkbyB0aGF0LgorCisJICBJZiB5b3UgbmVlZCB0byBtb3ZlIGxhcmdlIGZpbGVzIG9uIGZsb3BwaWVzIGJldHdlZW4gYSBET1MgYW5kIGEKKwkgIExpbnV4IGJveCwgc2F5IFkgaGVyZSwgbW91bnQgdGhlIGZsb3BweSB1bmRlciBMaW51eCB3aXRoIGFuIE1TRE9TCisJICBmaWxlIHN5c3RlbSBhbmQgdXNlIEdOVSB0YXIncyBNIG9wdGlvbi4gR05VIHRhciBpcyBhIHByb2dyYW0KKwkgIGF2YWlsYWJsZSBmb3IgVW5peCBhbmQgRE9TICgibWFuIHRhciIgb3IgImluZm8gdGFyIikuCisKKwkgIEl0IGlzIG5vdyBhbHNvIGJlY29taW5nIHBvc3NpYmxlIHRvIHJlYWQgYW5kIHdyaXRlIGNvbXByZXNzZWQgRkFUCisJICBmaWxlIHN5c3RlbXM7IHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9mYXRfY3ZmLnR4dD4gZm9yCisJICBkZXRhaWxzLgorCisJICBUaGUgRkFUIHN1cHBvcnQgd2lsbCBlbmxhcmdlIHlvdXIga2VybmVsIGJ5IGFib3V0IDM3IEtCLiBJZiB1bnN1cmUsCisJICBzYXkgWS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkCisJICBmYXQuICBOb3RlIHRoYXQgaWYgeW91IGNvbXBpbGUgdGhlIEZBVCBzdXBwb3J0IGFzIGEgbW9kdWxlLCB5b3UKKwkgIGNhbm5vdCBjb21waWxlIGFueSBvZiB0aGUgRkFULWJhc2VkIGZpbGUgc3lzdGVtcyBpbnRvIHRoZSBrZXJuZWwKKwkgIC0tIHRoZXkgd2lsbCBoYXZlIHRvIGJlIG1vZHVsZXMgYXMgd2VsbC4KKworY29uZmlnIE1TRE9TX0ZTCisJdHJpc3RhdGUgIk1TRE9TIGZzIHN1cHBvcnQiCisJc2VsZWN0IEZBVF9GUworCWhlbHAKKwkgIFRoaXMgYWxsb3dzIHlvdSB0byBtb3VudCBNU0RPUyBwYXJ0aXRpb25zIG9mIHlvdXIgaGFyZCBkcml2ZSAodW5sZXNzCisJICB0aGV5IGFyZSBjb21wcmVzc2VkOyB0byBhY2Nlc3MgY29tcHJlc3NlZCBNU0RPUyBwYXJ0aXRpb25zIHVuZGVyCisJICBMaW51eCwgeW91IGNhbiBlaXRoZXIgdXNlIHRoZSBET1MgZW11bGF0b3IgRE9TRU1VLCBkZXNjcmliZWQgaW4gdGhlCisJICBET1NFTVUtSE9XVE8sIGF2YWlsYWJsZSBmcm9tCisJICA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LCBvciB0cnkgZG1zZG9zZnMgaW4KKwkgIDxmdHA6Ly9pYmlibGlvLm9yZy9wdWIvTGludXgvc3lzdGVtL2ZpbGVzeXN0ZW1zL2Rvc2ZzLz4uIElmIHlvdQorCSAgaW50ZW5kIHRvIHVzZSBkb3NlbXUgd2l0aCBhIG5vbi1jb21wcmVzc2VkIE1TRE9TIHBhcnRpdGlvbiwgc2F5IFkKKwkgIGhlcmUpIGFuZCBNU0RPUyBmbG9wcGllcy4gVGhpcyBtZWFucyB0aGF0IGZpbGUgYWNjZXNzIGJlY29tZXMKKwkgIHRyYW5zcGFyZW50LCBpLmUuIHRoZSBNU0RPUyBmaWxlcyBsb29rIGFuZCBiZWhhdmUganVzdCBsaWtlIGFsbAorCSAgb3RoZXIgVW5peCBmaWxlcy4KKworCSAgSWYgeW91IGhhdmUgV2luZG93cyA5NSBvciBXaW5kb3dzIE5UIGluc3RhbGxlZCBvbiB5b3VyIE1TRE9TCisJICBwYXJ0aXRpb25zLCB5b3Ugc2hvdWxkIHVzZSB0aGUgVkZBVCBmaWxlIHN5c3RlbSAoc2F5IFkgdG8gIlZGQVQgZnMKKwkgIHN1cHBvcnQiIGJlbG93KSwgb3IgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gc2VlIHRoZSBsb25nIGZpbGVuYW1lcworCSAgZ2VuZXJhdGVkIGJ5IFdpbmRvd3MgOTUgLyBXaW5kb3dzIE5ULgorCisJICBUaGlzIG9wdGlvbiB3aWxsIGVubGFyZ2UgeW91ciBrZXJuZWwgYnkgYWJvdXQgNyBLQi4gSWYgdW5zdXJlLAorCSAgYW5zd2VyIFkuIFRoaXMgd2lsbCBvbmx5IHdvcmsgaWYgeW91IHNhaWQgWSB0byAiRE9TIEZBVCBmcyBzdXBwb3J0IgorCSAgYXMgd2VsbC4gVG8gY29tcGlsZSB0aGlzIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBtc2Rvcy4KKworY29uZmlnIFZGQVRfRlMKKwl0cmlzdGF0ZSAiVkZBVCAoV2luZG93cy05NSkgZnMgc3VwcG9ydCIKKwlzZWxlY3QgRkFUX0ZTCisJaGVscAorCSAgVGhpcyBvcHRpb24gcHJvdmlkZXMgc3VwcG9ydCBmb3Igbm9ybWFsIFdpbmRvd3MgZmlsZSBzeXN0ZW1zIHdpdGgKKwkgIGxvbmcgZmlsZW5hbWVzLiAgVGhhdCBpbmNsdWRlcyBub24tY29tcHJlc3NlZCBGQVQtYmFzZWQgZmlsZSBzeXN0ZW1zCisJICB1c2VkIGJ5IFdpbmRvd3MgOTUsIFdpbmRvd3MgOTgsIFdpbmRvd3MgTlQgNC4wLCBhbmQgdGhlIFVuaXgKKwkgIHByb2dyYW1zIGZyb20gdGhlIG10b29scyBwYWNrYWdlLgorCisJICBUaGUgVkZBVCBzdXBwb3J0IGVubGFyZ2VzIHlvdXIga2VybmVsIGJ5IGFib3V0IDEwIEtCIGFuZCBpdCBvbmx5CisJICB3b3JrcyBpZiB5b3Ugc2FpZCBZIHRvIHRoZSAiRE9TIEZBVCBmcyBzdXBwb3J0IiBhYm92ZS4gIFBsZWFzZSByZWFkCisJICB0aGUgZmlsZSA8ZmlsZTpEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3ZmYXQudHh0PiBmb3IgZGV0YWlscy4gIElmCisJICB1bnN1cmUsIHNheSBZLgorCisJICBUbyBjb21waWxlIHRoaXMgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQKKwkgIHZmYXQuCisKK2NvbmZpZyBGQVRfREVGQVVMVF9DT0RFUEFHRQorCWludCAiRGVmYXVsdCBjb2RlcGFnZSBmb3IgRkFUIgorCWRlcGVuZHMgb24gTVNET1NfRlMgfHwgVkZBVF9GUworCWRlZmF1bHQgNDM3CisJaGVscAorCSAgVGhpcyBvcHRpb24gc2hvdWxkIGJlIHNldCB0byB0aGUgY29kZXBhZ2Ugb2YgeW91ciBGQVQgZmlsZXN5c3RlbXMuCisJICBJdCBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIHRoZSAiY29kZXBhZ2UiIG1vdW50IG9wdGlvbi4KKwkgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3ZmYXQudHh0PiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworY29uZmlnIEZBVF9ERUZBVUxUX0lPQ0hBUlNFVAorCXN0cmluZyAiRGVmYXVsdCBpb2NoYXJzZXQgZm9yIEZBVCIKKwlkZXBlbmRzIG9uIFZGQVRfRlMKKwlkZWZhdWx0ICJpc284ODU5LTEiCisJaGVscAorCSAgU2V0IHRoaXMgdG8gdGhlIGRlZmF1bHQgaW5wdXQvb3V0cHV0IGNoYXJhY3RlciBzZXQgeW91J2QKKwkgIGxpa2UgRkFUIHRvIHVzZS4gSXQgc2hvdWxkIHByb2JhYmx5IG1hdGNoIHRoZSBjaGFyYWN0ZXIgc2V0CisJICB0aGF0IG1vc3Qgb2YgeW91ciBGQVQgZmlsZXN5c3RlbXMgdXNlLCBhbmQgY2FuIGJlIG92ZXJyaWRkZW4KKwkgIHdpdGggdGhlICJpb2NoYXJzZXQiIG1vdW50IG9wdGlvbiBmb3IgRkFUIGZpbGVzeXN0ZW1zLgorCSAgTm90ZSB0aGF0ICJ1dGY4IiBpcyBub3QgcmVjb21tZW5kZWQgZm9yIEZBVCBmaWxlc3lzdGVtcy4KKwkgIElmIHVuc3VyZSwgeW91IHNob3VsZG4ndCBzZXQgInV0ZjgiIGhlcmUuCisJICBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92ZmF0LnR4dD4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK2NvbmZpZyBOVEZTX0ZTCisJdHJpc3RhdGUgIk5URlMgZmlsZSBzeXN0ZW0gc3VwcG9ydCIKKwlzZWxlY3QgTkxTCisJaGVscAorCSAgTlRGUyBpcyB0aGUgZmlsZSBzeXN0ZW0gb2YgTWljcm9zb2Z0IFdpbmRvd3MgTlQsIDIwMDAsIFhQIGFuZCAyMDAzLgorCisJICBTYXlpbmcgWSBvciBNIGhlcmUgZW5hYmxlcyByZWFkIHN1cHBvcnQuICBUaGVyZSBpcyBwYXJ0aWFsLCBidXQKKwkgIHNhZmUsIHdyaXRlIHN1cHBvcnQgYXZhaWxhYmxlLiAgRm9yIHdyaXRlIHN1cHBvcnQgeW91IG11c3QgYWxzbworCSAgc2F5IFkgdG8gIk5URlMgd3JpdGUgc3VwcG9ydCIgYmVsb3cuCisKKwkgIFRoZXJlIGFyZSBhbHNvIGEgbnVtYmVyIG9mIHVzZXItc3BhY2UgdG9vbHMgYXZhaWxhYmxlLCBjYWxsZWQKKwkgIG50ZnNwcm9ncy4gIFRoZXNlIGluY2x1ZGUgbnRmc3VuZGVsZXRlIGFuZCBudGZzcmVzaXplLCB0aGF0IHdvcmsKKwkgIHdpdGhvdXQgTlRGUyBzdXBwb3J0IGVuYWJsZWQgaW4gdGhlIGtlcm5lbC4KKworCSAgVGhpcyBpcyBhIHJld3JpdGUgZnJvbSBzY3JhdGNoIG9mIExpbnV4IE5URlMgc3VwcG9ydCBhbmQgcmVwbGFjZWQKKwkgIHRoZSBvbGQgTlRGUyBjb2RlIHN0YXJ0aW5nIHdpdGggTGludXggMi41LjExLiAgQSBiYWNrcG9ydCB0bworCSAgdGhlIExpbnV4IDIuNCBrZXJuZWwgc2VyaWVzIGlzIHNlcGFyYXRlbHkgYXZhaWxhYmxlIGFzIGEgcGF0Y2gKKwkgIGZyb20gdGhlIHByb2plY3Qgd2ViIHNpdGUuCisKKwkgIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL250ZnMudHh0PgorCSAgYW5kIDxodHRwOi8vbGludXgtbnRmcy5zb3VyY2Vmb3JnZS5uZXQvPi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGZpbGUgc3lzdGVtIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG50ZnMuCisKKwkgIElmIHlvdSBhcmUgbm90IHVzaW5nIFdpbmRvd3MgTlQsIDIwMDAsIFhQIG9yIDIwMDMgaW4gYWRkaXRpb24gdG8KKwkgIExpbnV4IG9uIHlvdXIgY29tcHV0ZXIgaXQgaXMgc2FmZSB0byBzYXkgTi4KKworY29uZmlnIE5URlNfREVCVUcKKwlib29sICJOVEZTIGRlYnVnZ2luZyBzdXBwb3J0IgorCWRlcGVuZHMgb24gTlRGU19GUworCWhlbHAKKwkgIElmIHlvdSBhcmUgZXhwZXJpZW5jaW5nIGFueSBwcm9ibGVtcyB3aXRoIHRoZSBOVEZTIGZpbGUgc3lzdGVtLCBzYXkKKwkgIFkgaGVyZS4gIFRoaXMgd2lsbCByZXN1bHQgaW4gYWRkaXRpb25hbCBjb25zaXN0ZW5jeSBjaGVja3MgdG8gYmUKKwkgIHBlcmZvcm1lZCBieSB0aGUgZHJpdmVyIGFzIHdlbGwgYXMgYWRkaXRpb25hbCBkZWJ1Z2dpbmcgbWVzc2FnZXMgdG8KKwkgIGJlIHdyaXR0ZW4gdG8gdGhlIHN5c3RlbSBsb2cuICBOb3RlIHRoYXQgZGVidWdnaW5nIG1lc3NhZ2VzIGFyZQorCSAgZGlzYWJsZWQgYnkgZGVmYXVsdC4gIFRvIGVuYWJsZSB0aGVtLCBzdXBwbHkgdGhlIG9wdGlvbiBkZWJ1Z19tc2dzPTEKKwkgIGF0IHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lIHdoZW4gYm9vdGluZyB0aGUga2VybmVsIG9yIGFzIGFuIG9wdGlvbgorCSAgdG8gaW5zbW9kIHdoZW4gbG9hZGluZyB0aGUgbnRmcyBtb2R1bGUuICBPbmNlIHRoZSBkcml2ZXIgaXMgYWN0aXZlLAorCSAgeW91IGNhbiBlbmFibGUgZGVidWdnaW5nIG1lc3NhZ2VzIGJ5IGRvaW5nIChhcyByb290KToKKwkgIGVjaG8gMSA+IC9wcm9jL3N5cy9mcy9udGZzLWRlYnVnCisJICBSZXBsYWNpbmcgdGhlICIxIiB3aXRoICIwIiB3b3VsZCBkaXNhYmxlIGRlYnVnIG1lc3NhZ2VzLgorCisJICBJZiB5b3UgbGVhdmUgZGVidWdnaW5nIG1lc3NhZ2VzIGRpc2FibGVkLCB0aGlzIHJlc3VsdHMgaW4gbGl0dGxlCisJICBvdmVyaGVhZCwgYnV0IGVuYWJsaW5nIGRlYnVnIG1lc3NhZ2VzIHJlc3VsdHMgaW4gdmVyeSBzaWduaWZpY2FudAorCSAgc2xvd2Rvd24gb2YgdGhlIHN5c3RlbS4KKworCSAgV2hlbiByZXBvcnRpbmcgYnVncywgcGxlYXNlIHRyeSB0byBoYXZlIGF2YWlsYWJsZSBhIGZ1bGwgZHVtcCBvZgorCSAgZGVidWdnaW5nIG1lc3NhZ2VzIHdoaWxlIHRoZSBtaXNiZWhhdmlvdXIgd2FzIG9jY3VycmluZy4KKworY29uZmlnIE5URlNfUlcKKwlib29sICJOVEZTIHdyaXRlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBOVEZTX0ZTCisJaGVscAorCSAgVGhpcyBlbmFibGVzIHRoZSBwYXJ0aWFsLCBidXQgc2FmZSwgd3JpdGUgc3VwcG9ydCBpbiB0aGUgTlRGUyBkcml2ZXIuCisKKwkgIFRoZSBvbmx5IHN1cHBvcnRlZCBvcGVyYXRpb24gaXMgb3ZlcndyaXRpbmcgZXhpc3RpbmcgZmlsZXMsIHdpdGhvdXQKKwkgIGNoYW5naW5nIHRoZSBmaWxlIGxlbmd0aC4gIE5vIGZpbGUgb3IgZGlyZWN0b3J5IGNyZWF0aW9uLCBkZWxldGlvbiBvcgorCSAgcmVuYW1pbmcgaXMgcG9zc2libGUuICBOb3RlIG9ubHkgbm9uLXJlc2lkZW50IGZpbGVzIGNhbiBiZSB3cml0dGVuIHRvCisJICBzbyB5b3UgbWF5IGZpbmQgdGhhdCBzb21lIHZlcnkgc21hbGwgZmlsZXMgKDw1MDAgYnl0ZXMgb3Igc28pIGNhbm5vdAorCSAgYmUgd3JpdHRlbiB0by4KKworCSAgV2hpbGUgd2UgY2Fubm90IGd1YXJhbnRlZSB0aGF0IGl0IHdpbGwgbm90IGRhbWFnZSBhbnkgZGF0YSwgd2UgaGF2ZQorCSAgc28gZmFyIG5vdCByZWNlaXZlZCBhIHNpbmdsZSByZXBvcnQgd2hlcmUgdGhlIGRyaXZlciB3b3VsZCBoYXZlCisJICBkYW1hZ2VkIHNvbWVvbmVzIGRhdGEgc28gd2UgYXNzdW1lIGl0IGlzIHBlcmZlY3RseSBzYWZlIHRvIHVzZS4KKworCSAgTm90ZTogIFdoaWxlIHdyaXRlIHN1cHBvcnQgaXMgc2FmZSBpbiB0aGlzIHZlcnNpb24gKGEgcmV3cml0ZSBmcm9tCisJICBzY3JhdGNoIG9mIHRoZSBOVEZTIHN1cHBvcnQpLCBpdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGUgb2xkIE5URlMKKwkgIHdyaXRlIHN1cHBvcnQsIGluY2x1ZGVkIGluIExpbnV4IDIuNS4xMCBhbmQgYmVmb3JlIChzaW5jZSAxOTk3KSwKKwkgIGlzIG5vdCBzYWZlLgorCisJICBUaGlzIGlzIGN1cnJlbnRseSB1c2VmdWwgd2l0aCBUb3BvbG9naUxpbnV4LiAgVG9wb2xvZ2lMaW51eCBpcyBydW4KKwkgIG9uIHRvcCBvZiBhbnkgRE9TL01pY3Jvc29mdCBXaW5kb3dzIHN5c3RlbSB3aXRob3V0IHBhcnRpdGlvbmluZyB5b3VyCisJICBoYXJkIGRpc2suICBVbmxpa2Ugb3RoZXIgTGludXggZGlzdHJpYnV0aW9ucyBUb3BvbG9naUxpbnV4IGRvZXMgbm90CisJICBuZWVkIGl0cyBvd24gcGFydGl0aW9uLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlCisJICA8aHR0cDovL3RvcG9sb2dpLWxpbnV4LnNvdXJjZWZvcmdlLm5ldC8+CisKKwkgIEl0IGlzIHBlcmZlY3RseSBzYWZlIHRvIHNheSBOIGhlcmUuCisKK2VuZG1lbnUKKworbWVudSAiUHNldWRvIGZpbGVzeXN0ZW1zIgorCitjb25maWcgUFJPQ19GUworCWJvb2wgIi9wcm9jIGZpbGUgc3lzdGVtIHN1cHBvcnQiCisJaGVscAorCSAgVGhpcyBpcyBhIHZpcnR1YWwgZmlsZSBzeXN0ZW0gcHJvdmlkaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMKKwkgIG9mIHRoZSBzeXN0ZW0uICJWaXJ0dWFsIiBtZWFucyB0aGF0IGl0IGRvZXNuJ3QgdGFrZSB1cCBhbnkgc3BhY2Ugb24KKwkgIHlvdXIgaGFyZCBkaXNrOiB0aGUgZmlsZXMgYXJlIGNyZWF0ZWQgb24gdGhlIGZseSBieSB0aGUga2VybmVsIHdoZW4KKwkgIHlvdSB0cnkgdG8gYWNjZXNzIHRoZW0uIEFsc28sIHlvdSBjYW5ub3QgcmVhZCB0aGUgZmlsZXMgd2l0aCBvbGRlcgorCSAgdmVyc2lvbiBvZiB0aGUgcHJvZ3JhbSBsZXNzOiB5b3UgbmVlZCB0byB1c2UgbW9yZSBvciBjYXQuCisKKwkgIEl0J3MgdG90YWxseSBjb29sOyBmb3IgZXhhbXBsZSwgImNhdCAvcHJvYy9pbnRlcnJ1cHRzIiBnaXZlcworCSAgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCB0aGUgZGlmZmVyZW50IElSUXMgYXJlIHVzZWQgZm9yIGF0IHRoZSBtb21lbnQKKwkgICh0aGVyZSBpcyBhIHNtYWxsIG51bWJlciBvZiBJbnRlcnJ1cHQgUmVRdWVzdCBsaW5lcyBpbiB5b3VyIGNvbXB1dGVyCisJICB0aGF0IGFyZSB1c2VkIGJ5IHRoZSBhdHRhY2hlZCBkZXZpY2VzIHRvIGdhaW4gdGhlIENQVSdzIGF0dGVudGlvbiAtLQorCSAgb2Z0ZW4gYSBzb3VyY2Ugb2YgdHJvdWJsZSBpZiB0d28gZGV2aWNlcyBhcmUgbWlzdGFrZW5seSBjb25maWd1cmVkCisJICB0byB1c2UgdGhlIHNhbWUgSVJRKS4gVGhlIHByb2dyYW0gcHJvY2luZm8gdG8gZGlzcGxheSBzb21lCisJICBpbmZvcm1hdGlvbiBhYm91dCB5b3VyIHN5c3RlbSBnYXRoZXJlZCBmcm9tIHRoZSAvcHJvYyBmaWxlIHN5c3RlbS4KKworCSAgQmVmb3JlIHlvdSBjYW4gdXNlIHRoZSAvcHJvYyBmaWxlIHN5c3RlbSwgaXQgaGFzIHRvIGJlIG1vdW50ZWQsCisJICBtZWFuaW5nIGl0IGhhcyB0byBiZSBnaXZlbiBhIGxvY2F0aW9uIGluIHRoZSBkaXJlY3RvcnkgaGllcmFyY2h5LgorCSAgVGhhdCBsb2NhdGlvbiBzaG91bGQgYmUgL3Byb2MuIEEgY29tbWFuZCBzdWNoIGFzICJtb3VudCAtdCBwcm9jIHByb2MKKwkgIC9wcm9jIiBvciB0aGUgZXF1aXZhbGVudCBsaW5lIGluIC9ldGMvZnN0YWIgZG9lcyB0aGUgam9iLgorCisJICBUaGUgL3Byb2MgZmlsZSBzeXN0ZW0gaXMgZXhwbGFpbmVkIGluIHRoZSBmaWxlCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Byb2MudHh0PiBhbmQgb24gdGhlIHByb2MoNSkgbWFucGFnZQorCSAgKCJtYW4gNSBwcm9jIikuCisKKwkgIFRoaXMgb3B0aW9uIHdpbGwgZW5sYXJnZSB5b3VyIGtlcm5lbCBieSBhYm91dCA2NyBLQi4gU2V2ZXJhbAorCSAgcHJvZ3JhbXMgZGVwZW5kIG9uIHRoaXMsIHNvIGV2ZXJ5b25lIHNob3VsZCBzYXkgWSBoZXJlLgorCitjb25maWcgUFJPQ19LQ09SRQorCWJvb2wgIi9wcm9jL2tjb3JlIHN1cHBvcnQiIGlmICFBUk0KKwlkZXBlbmRzIG9uIFBST0NfRlMgJiYgTU1VCisKK2NvbmZpZyBTWVNGUworCWJvb2wgInN5c2ZzIGZpbGUgc3lzdGVtIHN1cHBvcnQiIGlmIEVNQkVEREVECisJZGVmYXVsdCB5CisJaGVscAorCVRoZSBzeXNmcyBmaWxlc3lzdGVtIGlzIGEgdmlydHVhbCBmaWxlc3lzdGVtIHRoYXQgdGhlIGtlcm5lbCB1c2VzIHRvCisJZXhwb3J0IGludGVybmFsIGtlcm5lbCBvYmplY3RzLCB0aGVpciBhdHRyaWJ1dGVzLCBhbmQgdGhlaXIKKwlyZWxhdGlvbnNoaXBzIHRvIG9uZSBhbm90aGVyLgorCisJVXNlcnMgY2FuIHVzZSBzeXNmcyB0byBhc2NlcnRhaW4gdXNlZnVsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBydW5uaW5nCisJa2VybmVsLCBzdWNoIGFzIHRoZSBkZXZpY2VzIHRoZSBrZXJuZWwgaGFzIGRpc2NvdmVyZWQgb24gZWFjaCBidXMgYW5kCisJd2hpY2ggZHJpdmVyIGVhY2ggaXMgYm91bmQgdG8uIHN5c2ZzIGNhbiBhbHNvIGJlIHVzZWQgdG8gdHVuZSBkZXZpY2VzCisJYW5kIG90aGVyIGtlcm5lbCBzdWJzeXN0ZW1zLgorCisJU29tZSBzeXN0ZW0gYWdlbnRzIHJlbHkgb24gdGhlIGluZm9ybWF0aW9uIGluIHN5c2ZzIHRvIG9wZXJhdGUuCisJL3NiaW4vaG90cGx1ZyB1c2VzIGRldmljZSBhbmQgb2JqZWN0IGF0dHJpYnV0ZXMgaW4gc3lzZnMgdG8gYXNzaXN0IGluCisJZGVsZWdhdGluZyBwb2xpY3kgZGVjaXNpb25zLCBsaWtlIHBlcnNpc3RhbnRseSBuYW1pbmcgZGV2aWNlcy4KKworCXN5c2ZzIGlzIGN1cnJlbnRseSB1c2VkIGJ5IHRoZSBibG9jayBzdWJzeXN0ZW0gdG8gbW91bnQgdGhlIHJvb3QKKwlwYXJ0aXRpb24uICBJZiBzeXNmcyBpcyBkaXNhYmxlZCB5b3UgbXVzdCBzcGVjaWZ5IHRoZSBib290IGRldmljZSBvbgorCXRoZSBrZXJuZWwgYm9vdCBjb21tYW5kIGxpbmUgdmlhIGl0cyBtYWpvciBhbmQgbWlub3IgbnVtYmVycy4gIEZvcgorCWV4YW1wbGUsICJyb290PTAzOjAxIiBmb3IgL2Rldi9oZGExLgorCisJRGVzaWduZXJzIG9mIGVtYmVkZGVkIHN5c3RlbXMgbWF5IHdpc2ggdG8gc2F5IE4gaGVyZSB0byBjb25zZXJ2ZSBzcGFjZS4KKworY29uZmlnIERFVkZTX0ZTCisJYm9vbCAiL2RldiBmaWxlIHN5c3RlbSBzdXBwb3J0IChPQlNPTEVURSkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBUaGlzIGlzIHN1cHBvcnQgZm9yIGRldmZzLCBhIHZpcnR1YWwgZmlsZSBzeXN0ZW0gKGxpa2UgL3Byb2MpIHdoaWNoCisJICBwcm92aWRlcyB0aGUgZmlsZSBzeXN0ZW0gaW50ZXJmYWNlIHRvIGRldmljZSBkcml2ZXJzLCBub3JtYWxseSBmb3VuZAorCSAgaW4gL2Rldi4gRGV2ZnMgZG9lcyBub3QgZGVwZW5kIG9uIG1ham9yIGFuZCBtaW5vciBudW1iZXIKKwkgIGFsbG9jYXRpb25zLiBEZXZpY2UgZHJpdmVycyByZWdpc3RlciBlbnRyaWVzIGluIC9kZXYgd2hpY2ggdGhlbgorCSAgYXBwZWFyIGF1dG9tYXRpY2FsbHksIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHN5c3RlbSBhZG1pbmlzdHJhdG9yIGRvZXMKKwkgIG5vdCBoYXZlIHRvIGNyZWF0ZSBjaGFyYWN0ZXIgYW5kIGJsb2NrIHNwZWNpYWwgZGV2aWNlIGZpbGVzIGluIHRoZQorCSAgL2RldiBkaXJlY3RvcnkgdXNpbmcgdGhlIG1rbm9kIGNvbW1hbmQgKG9yIE1BS0VERVYgc2NyaXB0KSBhbnltb3JlLgorCisJICBUaGlzIGlzIHdvcmsgaW4gcHJvZ3Jlc3MuIElmIHlvdSB3YW50IHRvIHVzZSB0aGlzLCB5b3UgKm11c3QqIHJlYWQKKwkgIHRoZSBtYXRlcmlhbCBpbiA8ZmlsZTpEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2RldmZzLz4sIGVzcGVjaWFsbHkKKwkgIHRoZSBmaWxlIFJFQURNRSB0aGVyZS4KKworCSAgTm90ZSB0aGF0IGRldmZzIG5vIGxvbmdlciBtYW5hZ2VzIC9kZXYvcHRzISAgSWYgeW91IGFyZSB1c2luZyBVTklYOTgKKwkgIHB0eXMsIHlvdSB3aWxsIGFsc28gbmVlZCB0byBtb3VudCB0aGUgL2Rldi9wdHMgZmlsZXN5c3RlbSAoZGV2cHRzKS4KKworCSAgTm90ZSB0aGF0IGRldmZzIGhhcyBiZWVuIG9ic29sZXRlZCBieSB1ZGV2LAorCSAgPGh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvbGludXgvdXRpbHMva2VybmVsL2hvdHBsdWcvPi4KKwkgIEl0IGhhcyBiZWVuIHN0cmlwcGVkIGRvd24gdG8gYSBiYXJlIG1pbmltdW0gYW5kIGlzIG9ubHkgcHJvdmlkZWQgZm9yCisJICBsZWdhY3kgaW5zdGFsbGF0aW9ucyB0aGF0IHVzZSBpdHMgbmFtaW5nIHNjaGVtZSB3aGljaCBpcworCSAgdW5mb3J0dW5hdGVseSBkaWZmZXJlbnQgZnJvbSB0aGUgbmFtZXMgbm9ybWFsIExpbnV4IGluc3RhbGxhdGlvbnMKKwkgIHVzZS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIERFVkZTX01PVU5UCisJYm9vbCAiQXV0b21hdGljYWxseSBtb3VudCBhdCBib290IgorCWRlcGVuZHMgb24gREVWRlNfRlMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhcHBlYXJzIGlmIHlvdSBoYXZlIENPTkZJR19ERVZGU19GUyBlbmFibGVkLiBTZXR0aW5nCisJICB0aGlzIHRvICdZJyB3aWxsIG1ha2UgdGhlIGtlcm5lbCBhdXRvbWF0aWNhbGx5IG1vdW50IGRldmZzIG9udG8gL2RldgorCSAgd2hlbiB0aGUgc3lzdGVtIGlzIGJvb3RlZCwgYmVmb3JlIHRoZSBpbml0IHRocmVhZCBpcyBzdGFydGVkLgorCSAgWW91IGNhbiBvdmVycmlkZSB0aGlzIHdpdGggdGhlICJkZXZmcz1ub21vdW50IiBib290IG9wdGlvbi4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIERFVkZTX0RFQlVHCisJYm9vbCAiRGVidWcgZGV2ZnMiCisJZGVwZW5kcyBvbiBERVZGU19GUworCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB0aGVuIHRoZSAvZGV2IGZpbGUgc3lzdGVtIGNvZGUgd2lsbCBnZW5lcmF0ZQorCSAgZGVidWdnaW5nIG1lc3NhZ2VzLiBTZWUgdGhlIGZpbGUKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZGV2ZnMvYm9vdC1vcHRpb25zPiBmb3IgbW9yZQorCSAgZGV0YWlscy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIERFVlBUU19GU19YQVRUUgorCWJvb2wgIi9kZXYvcHRzIEV4dGVuZGVkIEF0dHJpYnV0ZXMiCisJZGVwZW5kcyBvbiBVTklYOThfUFRZUworCWhlbHAKKwkgIEV4dGVuZGVkIGF0dHJpYnV0ZXMgYXJlIG5hbWU6dmFsdWUgcGFpcnMgYXNzb2NpYXRlZCB3aXRoIGlub2RlcyBieQorCSAgdGhlIGtlcm5lbCBvciBieSB1c2VycyAoc2VlIHRoZSBhdHRyKDUpIG1hbnVhbCBwYWdlLCBvciB2aXNpdAorCSAgPGh0dHA6Ly9hY2wuYmVzdGJpdHMuYXQvPiBmb3IgZGV0YWlscykuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBERVZQVFNfRlNfU0VDVVJJVFkKKwlib29sICIvZGV2L3B0cyBTZWN1cml0eSBMYWJlbHMiCisJZGVwZW5kcyBvbiBERVZQVFNfRlNfWEFUVFIKKwloZWxwCisJICBTZWN1cml0eSBsYWJlbHMgc3VwcG9ydCBhbHRlcm5hdGl2ZSBhY2Nlc3MgY29udHJvbCBtb2RlbHMKKwkgIGltcGxlbWVudGVkIGJ5IHNlY3VyaXR5IG1vZHVsZXMgbGlrZSBTRUxpbnV4LiAgVGhpcyBvcHRpb24KKwkgIGVuYWJsZXMgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGhhbmRsZXIgZm9yIGZpbGUgc2VjdXJpdHkKKwkgIGxhYmVscyBpbiB0aGUgL2Rldi9wdHMgZmlsZXN5c3RlbS4KKworCSAgSWYgeW91IGFyZSBub3QgdXNpbmcgYSBzZWN1cml0eSBtb2R1bGUgdGhhdCByZXF1aXJlcyB1c2luZworCSAgZXh0ZW5kZWQgYXR0cmlidXRlcyBmb3IgZmlsZSBzZWN1cml0eSBsYWJlbHMsIHNheSBOLgorCitjb25maWcgVE1QRlMKKwlib29sICJWaXJ0dWFsIG1lbW9yeSBmaWxlIHN5c3RlbSBzdXBwb3J0IChmb3JtZXIgc2htIGZzKSIKKwloZWxwCisJICBUbXBmcyBpcyBhIGZpbGUgc3lzdGVtIHdoaWNoIGtlZXBzIGFsbCBmaWxlcyBpbiB2aXJ0dWFsIG1lbW9yeS4KKworCSAgRXZlcnl0aGluZyBpbiB0bXBmcyBpcyB0ZW1wb3JhcnkgaW4gdGhlIHNlbnNlIHRoYXQgbm8gZmlsZXMgd2lsbCBiZQorCSAgY3JlYXRlZCBvbiB5b3VyIGhhcmQgZHJpdmUuIFRoZSBmaWxlcyBsaXZlIGluIG1lbW9yeSBhbmQgc3dhcAorCSAgc3BhY2UuIElmIHlvdSB1bm1vdW50IGEgdG1wZnMgaW5zdGFuY2UsIGV2ZXJ5dGhpbmcgc3RvcmVkIHRoZXJlaW4gaXMKKwkgIGxvc3QuCisKKwkgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3RtcGZzLnR4dD4gZm9yIGRldGFpbHMuCisKK2NvbmZpZyBUTVBGU19YQVRUUgorCWJvb2wgInRtcGZzIEV4dGVuZGVkIEF0dHJpYnV0ZXMiCisJZGVwZW5kcyBvbiBUTVBGUworCWhlbHAKKwkgIEV4dGVuZGVkIGF0dHJpYnV0ZXMgYXJlIG5hbWU6dmFsdWUgcGFpcnMgYXNzb2NpYXRlZCB3aXRoIGlub2RlcyBieQorCSAgdGhlIGtlcm5lbCBvciBieSB1c2VycyAoc2VlIHRoZSBhdHRyKDUpIG1hbnVhbCBwYWdlLCBvciB2aXNpdAorCSAgPGh0dHA6Ly9hY2wuYmVzdGJpdHMuYXQvPiBmb3IgZGV0YWlscykuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBUTVBGU19TRUNVUklUWQorCWJvb2wgInRtcGZzIFNlY3VyaXR5IExhYmVscyIKKwlkZXBlbmRzIG9uIFRNUEZTX1hBVFRSCisJaGVscAorCSAgU2VjdXJpdHkgbGFiZWxzIHN1cHBvcnQgYWx0ZXJuYXRpdmUgYWNjZXNzIGNvbnRyb2wgbW9kZWxzCisJICBpbXBsZW1lbnRlZCBieSBzZWN1cml0eSBtb2R1bGVzIGxpa2UgU0VMaW51eC4gIFRoaXMgb3B0aW9uCisJICBlbmFibGVzIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZSBoYW5kbGVyIGZvciBmaWxlIHNlY3VyaXR5CisJICBsYWJlbHMgaW4gdGhlIHRtcGZzIGZpbGVzeXN0ZW0uCisJICBJZiB5b3UgYXJlIG5vdCB1c2luZyBhIHNlY3VyaXR5IG1vZHVsZSB0aGF0IHJlcXVpcmVzIHVzaW5nCisJICBleHRlbmRlZCBhdHRyaWJ1dGVzIGZvciBmaWxlIHNlY3VyaXR5IGxhYmVscywgc2F5IE4uCisKK2NvbmZpZyBIVUdFVExCRlMKKwlib29sICJIdWdlVExCIGZpbGUgc3lzdGVtIHN1cHBvcnQiCisJZGVwZW5kcyBYODYgfHwgSUE2NCB8fCBQUEM2NCB8fCBTUEFSQzY0IHx8IFNVUEVSSCB8fCBYODZfNjQgfHwgQlJPS0VOCisKK2NvbmZpZyBIVUdFVExCX1BBR0UKKwlkZWZfYm9vbCBIVUdFVExCRlMKKworY29uZmlnIFJBTUZTCisJYm9vbAorCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwkgIFJhbWZzIGlzIGEgZmlsZSBzeXN0ZW0gd2hpY2gga2VlcHMgYWxsIGZpbGVzIGluIFJBTS4gSXQgYWxsb3dzCisJICByZWFkIGFuZCB3cml0ZSBhY2Nlc3MuCisKKwkgIEl0IGlzIG1vcmUgb2YgYW4gcHJvZ3JhbW1pbmcgZXhhbXBsZSB0aGFuIGEgdXNlYWJsZSBmaWxlIHN5c3RlbS4gIElmCisJICB5b3UgbmVlZCBhIGZpbGUgc3lzdGVtIHdoaWNoIGxpdmVzIGluIFJBTSB3aXRoIGxpbWl0IGNoZWNraW5nIHVzZQorCSAgdG1wZnMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAorCSAgcmFtZnMuCisKK2VuZG1lbnUKKworbWVudSAiTWlzY2VsbGFuZW91cyBmaWxlc3lzdGVtcyIKKworY29uZmlnIEFERlNfRlMKKwl0cmlzdGF0ZSAiQURGUyBmaWxlIHN5c3RlbSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJaGVscAorCSAgVGhlIEFjb3JuIERpc2MgRmlsaW5nIFN5c3RlbSBpcyB0aGUgc3RhbmRhcmQgZmlsZSBzeXN0ZW0gb2YgdGhlCisJICBSaXNjT1Mgb3BlcmF0aW5nIHN5c3RlbSB3aGljaCBydW5zIG9uIEFjb3JuJ3MgQVJNLWJhc2VkIFJpc2MgUEMKKwkgIHN5c3RlbXMgYW5kIHRoZSBBY29ybiBBcmNoaW1lZGVzIHJhbmdlIG9mIG1hY2hpbmVzLiBJZiB5b3Ugc2F5IFkKKwkgIGhlcmUsIExpbnV4IHdpbGwgYmUgYWJsZSB0byByZWFkIGZyb20gQURGUyBwYXJ0aXRpb25zIG9uIGhhcmQgZHJpdmVzCisJICBhbmQgZnJvbSBBREZTLWZvcm1hdHRlZCBmbG9wcHkgZGlzY3MuIElmIHlvdSBhbHNvIHdhbnQgdG8gYmUgYWJsZSB0bworCSAgd3JpdGUgdG8gdGhvc2UgZGV2aWNlcywgc2F5IFkgdG8gIkFERlMgd3JpdGUgc3VwcG9ydCIgYmVsb3cuCisKKwkgIFRoZSBBREZTIHBhcnRpdGlvbiBzaG91bGQgYmUgdGhlIGZpcnN0IHBhcnRpdGlvbiAoaS5lLiwKKwkgIC9kZXYvW2hzXWQ/MSkgb24gZWFjaCBvZiB5b3VyIGRyaXZlcy4gUGxlYXNlIHJlYWQgdGhlIGZpbGUKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvYWRmcy50eHQ+IGZvciBmdXJ0aGVyIGRldGFpbHMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBhZGZzLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgQURGU19GU19SVworCWJvb2wgIkFERlMgd3JpdGUgc3VwcG9ydCAoREFOR0VST1VTKSIKKwlkZXBlbmRzIG9uIEFERlNfRlMKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IHdpbGwgYmUgYWJsZSB0byB3cml0ZSB0byBBREZTIHBhcnRpdGlvbnMgb24KKwkgIGhhcmQgZHJpdmVzIGFuZCBBREZTLWZvcm1hdHRlZCBmbG9wcHkgZGlza3MuIFRoaXMgaXMgZXhwZXJpbWVudGFsCisJICBjb2Rlcywgc28gaWYgeW91J3JlIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBBRkZTX0ZTCisJdHJpc3RhdGUgIkFtaWdhIEZGUyBmaWxlIHN5c3RlbSBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJaGVscAorCSAgVGhlIEZhc3QgRmlsZSBTeXN0ZW0gKEZGUykgaXMgdGhlIGNvbW1vbiBmaWxlIHN5c3RlbSB1c2VkIG9uIGhhcmQKKwkgIGRpc2tzIGJ5IEFtaWdhKHRtKSBzeXN0ZW1zIHNpbmNlIEFtaWdhT1MgVmVyc2lvbiAxLjMgKDM0LjIwKS4gIFNheSBZCisJICBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHJlYWQgYW5kIHdyaXRlIGZpbGVzIGZyb20gYW5kIHRvIGFuIEFtaWdhCisJICBGRlMgcGFydGl0aW9uIG9uIHlvdXIgaGFyZCBkcml2ZS4gIEFtaWdhIGZsb3BwaWVzIGhvd2V2ZXIgY2Fubm90IGJlCisJICByZWFkIHdpdGggdGhpcyBkcml2ZXIgZHVlIHRvIGFuIGluY29tcGF0aWJpbGl0eSBvZiB0aGUgZmxvcHB5CisJICBjb250cm9sbGVyIHVzZWQgaW4gYW4gQW1pZ2EgYW5kIHRoZSBzdGFuZGFyZCBmbG9wcHkgY29udHJvbGxlciBpbgorCSAgUENzIGFuZCB3b3Jrc3RhdGlvbnMuIFJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9hZmZzLnR4dD4KKwkgIGFuZCA8ZmlsZTpmcy9hZmZzL0NoYW5nZXM+LgorCisJICBXaXRoIHRoaXMgZHJpdmVyIHlvdSBjYW4gYWxzbyBtb3VudCBkaXNrIGZpbGVzIHVzZWQgYnkgQmVybmQKKwkgIFNjaG1pZHQncyBVbipYIEFtaWdhIEVtdWxhdG9yCisJICAoPGh0dHA6Ly93d3cuZnJlaWJ1cmcubGludXguZGUvfnVhZS8+KS4KKwkgIElmIHlvdSB3YW50IHRvIGRvIHRoaXMsIHlvdSB3aWxsIGFsc28gbmVlZCB0byBzYXkgWSBvciBNIHRvICJMb29wCisJICBkZXZpY2Ugc3VwcG9ydCIsIGFib3ZlLgorCisJICBUbyBjb21waWxlIHRoaXMgZmlsZSBzeXN0ZW0gc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYWZmcy4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBIRlNfRlMKKwl0cmlzdGF0ZSAiQXBwbGUgTWFjaW50b3NoIGZpbGUgc3lzdGVtIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IHdpbGwgYmUgYWJsZSB0byBtb3VudCBNYWNpbnRvc2gtZm9ybWF0dGVkCisJICBmbG9wcHkgZGlza3MgYW5kIGhhcmQgZHJpdmUgcGFydGl0aW9ucyB3aXRoIGZ1bGwgcmVhZC13cml0ZSBhY2Nlc3MuCisJICBQbGVhc2UgcmVhZCA8ZmlsZTpmcy9oZnMvSEZTLnR4dD4gdG8gbGVhcm4gYWJvdXQgdGhlIGF2YWlsYWJsZSBtb3VudAorCSAgb3B0aW9ucy4KKworCSAgVG8gY29tcGlsZSB0aGlzIGZpbGUgc3lzdGVtIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGhmcy4KKworY29uZmlnIEhGU1BMVVNfRlMKKwl0cmlzdGF0ZSAiQXBwbGUgRXh0ZW5kZWQgSEZTIGZpbGUgc3lzdGVtIHN1cHBvcnQiCisJc2VsZWN0IE5MUworCXNlbGVjdCBOTFNfVVRGOAorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIG1vdW50IGV4dGVuZGVkIGZvcm1hdAorCSAgTWFjaW50b3NoLWZvcm1hdHRlZCBoYXJkIGRyaXZlIHBhcnRpdGlvbnMgd2l0aCBmdWxsIHJlYWQtd3JpdGUgYWNjZXNzLgorCisJICBUaGlzIGZpbGUgc3lzdGVtIGlzIG9mdGVuIGNhbGxlZCBIRlMrIGFuZCB3YXMgaW50cm9kdWNlZCB3aXRoCisJICBNYWNPUyA4LiBJdCBpbmNsdWRlcyBhbGwgTWFjIHNwZWNpZmljIGZpbGVzeXN0ZW0gZGF0YSBzdWNoIGFzCisJICBkYXRhIGZvcmtzIGFuZCBjcmVhdG9yIGNvZGVzLCBidXQgaXQgYWxzbyBoYXMgc2V2ZXJhbCBVTklYCisJICBzdHlsZSBmZWF0dXJlcyBzdWNoIGFzIGZpbGUgb3duZXJzaGlwIGFuZCBwZXJtaXNzaW9ucy4KKworY29uZmlnIEJFRlNfRlMKKwl0cmlzdGF0ZSAiQmVPUyBmaWxlIHN5c3RlbSAoQmVGUykgc3VwcG9ydCAocmVhZCBvbmx5KSAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBOTFMKKwloZWxwCisJICBUaGUgQmVPUyBGaWxlIFN5c3RlbSAoQmVGUykgaXMgdGhlIG5hdGl2ZSBmaWxlIHN5c3RlbSBvZiBCZSwgSW5jJ3MKKwkgIEJlT1MuIE5vdGFibGUgZmVhdHVyZXMgaW5jbHVkZSBzdXBwb3J0IGZvciBhcmJpdHJhcnkgYXR0cmlidXRlcworCSAgb24gZmlsZXMgYW5kIGRpcmVjdG9yaWVzLCBhbmQgZGF0YWJhc2UtbGlrZSBpbmRlY2VzIG9uIHNlbGVjdGVkCisJICBhdHRyaWJ1dGVzLiAoQWxzbyBub3RlIHRoYXQgdGhpcyBkcml2ZXIgZG9lc24ndCBtYWtlIHRob3NlIGZlYXR1cmVzCisJICBhdmFpbGFibGUgYXQgdGhpcyB0aW1lKS4gSXQgaXMgYSA2NCBiaXQgZmlsZXN5c3RlbSwgc28gaXQgc3VwcG9ydHMKKwkgIGV4dHJlbWx5IGxhcmdlIHZvbHVtZXMgYW5kIGZpbGVzLgorCisJICBJZiB5b3UgdXNlIHRoaXMgZmlsZXN5c3RlbSwgeW91IHNob3VsZCBhbHNvIHNheSBZIHRvIGF0IGxlYXN0IG9uZQorCSAgb2YgdGhlIE5MUyAobmF0aXZlIGxhbmd1YWdlIHN1cHBvcnQpIG9wdGlvbnMgYmVsb3cuCisKKwkgIElmIHlvdSBkb24ndCBrbm93IHdoYXQgdGhpcyBpcyBhYm91dCwgc2F5IE4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgYmVmcy4KKworY29uZmlnIEJFRlNfREVCVUcKKwlib29sICJEZWJ1ZyBCZUZTIgorCWRlcGVuZHMgb24gQkVGU19GUworCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3UgY2FuIHVzZSB0aGUgJ2RlYnVnJyBtb3VudCBvcHRpb24gdG8gZW5hYmxlCisJICBkZWJ1Z2dpbmcgb3V0cHV0IGZyb20gdGhlIGRyaXZlci4gCisKK2NvbmZpZyBCRlNfRlMKKwl0cmlzdGF0ZSAiQkZTIGZpbGUgc3lzdGVtIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBCb290IEZpbGUgU3lzdGVtIChCRlMpIGlzIGEgZmlsZSBzeXN0ZW0gdXNlZCB1bmRlciBTQ08gVW5peFdhcmUgdG8KKwkgIGFsbG93IHRoZSBib290bG9hZGVyIGFjY2VzcyB0byB0aGUga2VybmVsIGltYWdlIGFuZCBvdGhlciBpbXBvcnRhbnQKKwkgIGZpbGVzIGR1cmluZyB0aGUgYm9vdCBwcm9jZXNzLiAgSXQgaXMgdXN1YWxseSBtb3VudGVkIHVuZGVyIC9zdGFuZAorCSAgYW5kIGNvcnJlc3BvbmRzIHRvIHRoZSBzbGljZSBtYXJrZWQgYXMgIlNUQU5EIiBpbiB0aGUgVW5peFdhcmUKKwkgIHBhcnRpdGlvbi4gIFlvdSBzaG91bGQgc2F5IFkgaWYgeW91IHdhbnQgdG8gcmVhZCBvciB3cml0ZSB0aGUgZmlsZXMKKwkgIG9uIHlvdXIgL3N0YW5kIHNsaWNlIGZyb20gd2l0aGluIExpbnV4LiAgWW91IHRoZW4gYWxzbyBuZWVkIHRvIHNheSBZCisJICB0byAiVW5peFdhcmUgc2xpY2VzIHN1cHBvcnQiLCBiZWxvdy4gIE1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEJGUworCSAgZmlsZSBzeXN0ZW0gaXMgY29udGFpbmVkIGluIHRoZSBmaWxlCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2Jmcy50eHQ+LgorCisJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRoaXMgaXMgYWJvdXQsIHNheSBOLgorCisJICBUbyBjb21waWxlIHRoaXMgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQKKwkgIGJmcy4gIE5vdGUgdGhhdCB0aGUgZmlsZSBzeXN0ZW0gb2YgeW91ciByb290IHBhcnRpdGlvbiAodGhlIG9uZQorCSAgY29udGFpbmluZyB0aGUgZGlyZWN0b3J5IC8pIGNhbm5vdCBiZSBjb21waWxlZCBhcyBhIG1vZHVsZS4KKworCisKK2NvbmZpZyBFRlNfRlMKKwl0cmlzdGF0ZSAiRUZTIGZpbGUgc3lzdGVtIHN1cHBvcnQgKHJlYWQgb25seSkgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBFRlMgaXMgYW4gb2xkZXIgZmlsZSBzeXN0ZW0gdXNlZCBmb3Igbm9uLUlTTzk2NjAgQ0QtUk9NcyBhbmQgaGFyZAorCSAgZGlzayBwYXJ0aXRpb25zIGJ5IFNHSSdzIElSSVggb3BlcmF0aW5nIHN5c3RlbSAoSVJJWCA2LjAgYW5kIG5ld2VyCisJICB1c2VzIHRoZSBYRlMgZmlsZSBzeXN0ZW0gZm9yIGhhcmQgZGlzayBwYXJ0aXRpb25zIGhvd2V2ZXIpLgorCisJICBUaGlzIGltcGxlbWVudGF0aW9uIG9ubHkgb2ZmZXJzIHJlYWQtb25seSBhY2Nlc3MuIElmIHlvdSBkb24ndCBrbm93CisJICB3aGF0IGFsbCB0aGlzIGlzIGFib3V0LCBpdCdzIHNhZmUgdG8gc2F5IE4uIEZvciBtb3JlIGluZm9ybWF0aW9uCisJICBhYm91dCBFRlMgc2VlIGl0cyBob21lIHBhZ2UgYXQgPGh0dHA6Ly9hZXNjaGkuY2guZXUub3JnL2Vmcy8+LgorCisJICBUbyBjb21waWxlIHRoZSBFRlMgZmlsZSBzeXN0ZW0gc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZWZzLgorCitjb25maWcgSkZGU19GUworCXRyaXN0YXRlICJKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSAoSkZGUykgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE1URAorCWhlbHAKKwkgIEpGRlMgaXMgdGhlIEpvdXJuYWxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0gZGV2ZWxvcGVkIGJ5IEF4aXMKKwkgIENvbW11bmljYXRpb25zIGluIFN3ZWRlbiwgYWltZWQgYXQgcHJvdmlkaW5nIGEgY3Jhc2gvcG93ZXJkb3duLXNhZmUKKwkgIGZpbGUgc3lzdGVtIGZvciBkaXNrLWxlc3MgZW1iZWRkZWQgZGV2aWNlcy4gRnVydGhlciBpbmZvcm1hdGlvbiBpcworCSAgYXZhaWxhYmxlIGF0ICg8aHR0cDovL2RldmVsb3Blci5heGlzLmNvbS9zb2Z0d2FyZS9qZmZzLz4pLgorCitjb25maWcgSkZGU19GU19WRVJCT1NFCisJaW50ICJKRkZTIGRlYnVnZ2luZyB2ZXJib3NpdHkgKDAgPSBxdWlldCwgMyA9IG5vaXN5KSIKKwlkZXBlbmRzIG9uIEpGRlNfRlMKKwlkZWZhdWx0ICIwIgorCWhlbHAKKwkgIERldGVybWluZXMgdGhlIHZlcmJvc2l0eSBsZXZlbCBvZiB0aGUgSkZGUyBkZWJ1Z2dpbmcgbWVzc2FnZXMuCisKK2NvbmZpZyBKRkZTX1BST0NfRlMKKwlib29sICJKRkZTIHN0YXRzIGF2YWlsYWJsZSBpbiAvcHJvYyBmaWxlc3lzdGVtIgorCWRlcGVuZHMgb24gSkZGU19GUyAmJiBQUk9DX0ZTCisJaGVscAorCSAgRW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBjYXVzZSBzdGF0aXN0aWNzIGZyb20gbW91bnRlZCBKRkZTIGZpbGUgc3lzdGVtcworCSAgdG8gYmUgbWFkZSBhdmFpbGFibGUgdG8gdGhlIHVzZXIgaW4gdGhlIC9wcm9jL2ZzL2pmZnMvIGRpcmVjdG9yeS4KKworY29uZmlnIEpGRlMyX0ZTCisJdHJpc3RhdGUgIkpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtIHYyIChKRkZTMikgc3VwcG9ydCIKKwlzZWxlY3QgQ1JDMzIKKwlkZXBlbmRzIG9uIE1URAorCWhlbHAKKwkgIEpGRlMyIGlzIHRoZSBzZWNvbmQgZ2VuZXJhdGlvbiBvZiB0aGUgSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0KKwkgIGZvciB1c2Ugb24gZGlza2xlc3MgZW1iZWRkZWQgZGV2aWNlcy4gSXQgcHJvdmlkZXMgaW1wcm92ZWQgd2VhcgorCSAgbGV2ZWxsaW5nLCBjb21wcmVzc2lvbiBhbmQgc3VwcG9ydCBmb3IgaGFyZCBsaW5rcy4gWW91IGNhbm5vdCB1c2UKKwkgIHRoaXMgb24gbm9ybWFsIGJsb2NrIGRldmljZXMsIG9ubHkgb24gJ01URCcgZGV2aWNlcy4KKworCSAgRnVydGhlciBpbmZvcm1hdGlvbiBvbiB0aGUgZGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBvZiBKRkZTMiBpcworCSAgYXZhaWxhYmxlIGF0IDxodHRwOi8vc291cmNlcy5yZWRoYXQuY29tL2pmZnMyLz4uCisKK2NvbmZpZyBKRkZTMl9GU19ERUJVRworCWludCAiSkZGUzIgZGVidWdnaW5nIHZlcmJvc2l0eSAoMCA9IHF1aWV0LCAyID0gbm9pc3kpIgorCWRlcGVuZHMgb24gSkZGUzJfRlMKKwlkZWZhdWx0ICIwIgorCWhlbHAKKwkgIFRoaXMgY29udHJvbHMgdGhlIGFtb3VudCBvZiBkZWJ1Z2dpbmcgbWVzc2FnZXMgcHJvZHVjZWQgYnkgdGhlIEpGRlMyCisJICBjb2RlLiBTZXQgaXQgdG8gemVybyBmb3IgdXNlIGluIHByb2R1Y3Rpb24gc3lzdGVtcy4gRm9yIGV2YWx1YXRpb24sCisJICB0ZXN0aW5nIGFuZCBkZWJ1Z2dpbmcsIGl0J3MgYWR2aXNhYmxlIHRvIHNldCBpdCB0byBvbmUuIFRoaXMgd2lsbAorCSAgZW5hYmxlIGEgZmV3IGFzc2VydGlvbnMgYW5kIHdpbGwgcHJpbnQgZGVidWdnaW5nIG1lc3NhZ2VzIGF0IHRoZQorCSAgS0VSTl9ERUJVRyBsb2dsZXZlbCwgd2hlcmUgdGhleSB3b24ndCBub3JtYWxseSBiZSB2aXNpYmxlLiBMZXZlbCAyCisJICBpcyB1bmxpa2VseSB0byBiZSB1c2VmdWwgLSBpdCBlbmFibGVzIGV4dHJhIGRlYnVnZ2luZyBpbiBjZXJ0YWluCisJICBhcmVhcyB3aGljaCBhdCBvbmUgcG9pbnQgbmVlZGVkIGRlYnVnZ2luZywgYnV0IHdoZW4gdGhlIGJ1Z3Mgd2VyZQorCSAgbG9jYXRlZCBhbmQgZml4ZWQsIHRoZSBkZXRhaWxlZCBtZXNzYWdlcyB3ZXJlIHJlbGVnYXRlZCB0byBsZXZlbCAyLgorCisJICBJZiByZXBvcnRpbmcgYnVncywgcGxlYXNlIHRyeSB0byBoYXZlIGF2YWlsYWJsZSBhIGZ1bGwgZHVtcCBvZiB0aGUKKwkgIG1lc3NhZ2VzIGF0IGRlYnVnIGxldmVsIDEgd2hpbGUgdGhlIG1pc2JlaGF2aW91ciB3YXMgb2NjdXJyaW5nLgorCitjb25maWcgSkZGUzJfRlNfTkFORAorCWJvb2wgIkpGRlMyIHN1cHBvcnQgZm9yIE5BTkQgZmxhc2giCisJZGVwZW5kcyBvbiBKRkZTMl9GUworCWRlZmF1bHQgbgorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyB0aGUgc3VwcG9ydCBmb3IgTkFORCBmbGFzaCBpbiBKRkZTMi4gTkFORCBpcyBhIG5ld2VyCisJICB0eXBlIG9mIGZsYXNoIGNoaXAgZGVzaWduIHRoYW4gdGhlIHRyYWRpdGlvbmFsIE5PUiBmbGFzaCwgd2l0aAorCSAgaGlnaGVyIGRlbnNpdHkgYnV0IGEgaGFuZGZ1bCBvZiBjaGFyYWN0ZXJpc3RpY3Mgd2hpY2ggbWFrZSBpdCBtb3JlCisJICBpbnRlcmVzdGluZyBmb3IgdGhlIGZpbGUgc3lzdGVtIHRvIHVzZS4KKworCSAgU2F5ICdOJyB1bmxlc3MgeW91IGhhdmUgTkFORCBmbGFzaC4KKworY29uZmlnIEpGRlMyX0ZTX05PUl9FQ0MKKyAgICAgICAgYm9vbCAiSkZGUzIgc3VwcG9ydCBmb3IgRUNDJ2QgTk9SIGZsYXNoIChFWFBFUklNRU5UQUwpIgorICAgICAgICBkZXBlbmRzIG9uIEpGRlMyX0ZTICYmIEVYUEVSSU1FTlRBTAorICAgICAgICBkZWZhdWx0IG4KKyAgICAgICAgaGVscAorICAgICAgICAgIFRoaXMgZW5hYmxlcyB0aGUgZXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIE5PUiBmbGFzaCB3aXRoIHRyYW5zcGFyZW50CisgICAgICAgICAgRUNDIGZvciBKRkZTMi4gVGhpcyB0eXBlIG9mIGZsYXNoIGNoaXAgaXMgbm90IGNvbW1vbiwgaG93ZXZlciBpdCBpcworICAgICAgICAgIGF2YWlsYWJsZSBmcm9tIFNUIE1pY3JvZWxlY3Ryb25pY3MuCisKK2NvbmZpZyBKRkZTMl9DT01QUkVTU0lPTl9PUFRJT05TCisJYm9vbCAiQWR2YW5jZWQgY29tcHJlc3Npb24gb3B0aW9ucyBmb3IgSkZGUzIiCisJZGVwZW5kcyBvbiBKRkZTMl9GUworCWRlZmF1bHQgbgorCWhlbHAKKwkgIEVuYWJsaW5nIHRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gZXhwbGljaXRseSBjaG9vc2Ugd2hpY2gKKwkgIGNvbXByZXNzaW9uIG1vZHVsZXMsIGlmIGFueSwgYXJlIGVuYWJsZWQgaW4gSkZGUzIuIFJlbW92aW5nCisJICBjb21wcmVzc29ycyBhbmQgbWVhbiB5b3UgY2Fubm90IHJlYWQgZXhpc3RpbmcgZmlsZSBzeXN0ZW1zLAorCSAgYW5kIGVuYWJsaW5nIGV4cGVyaW1lbnRhbCBjb21wcmVzc29ycyBjYW4gbWVhbiB0aGF0IHlvdQorCSAgd3JpdGUgYSBmaWxlIHN5c3RlbSB3aGljaCBjYW5ub3QgYmUgcmVhZCBieSBhIHN0YW5kYXJkIGtlcm5lbC4KKworCSAgSWYgdW5zdXJlLCB5b3Ugc2hvdWxkIF9kZWZpbml0ZWx5XyBzYXkgJ04nLgorCitjb25maWcgSkZGUzJfWkxJQgorCWJvb2wgIkpGRlMyIFpMSUIgY29tcHJlc3Npb24gc3VwcG9ydCIgaWYgSkZGUzJfQ09NUFJFU1NJT05fT1BUSU9OUworCXNlbGVjdCBaTElCX0lORkxBVEUKKwlzZWxlY3QgWkxJQl9ERUZMQVRFCisJZGVwZW5kcyBvbiBKRkZTMl9GUworCWRlZmF1bHQgeQorICAgICAgICBoZWxwCisgICAgICAgICAgWmxpYiBpcyBkZXNpZ25lZCB0byBiZSBhIGZyZWUsIGdlbmVyYWwtcHVycG9zZSwgbGVnYWxseSB1bmVuY3VtYmVyZWQsCisgICAgICAgICAgbG9zc2xlc3MgZGF0YS1jb21wcmVzc2lvbiBsaWJyYXJ5IGZvciB1c2Ugb24gdmlydHVhbGx5IGFueSBjb21wdXRlciAKKyAgICAgICAgICBoYXJkd2FyZSBhbmQgb3BlcmF0aW5nIHN5c3RlbS4gU2VlIDxodHRwOi8vd3d3Lmd6aXAub3JnL3psaWIvPiBmb3IKKyAgICAgICAgICBmdXJ0aGVyIGluZm9ybWF0aW9uLgorICAgICAgICAgIAorICAgICAgICAgIFNheSAnWScgaWYgdW5zdXJlLgorCitjb25maWcgSkZGUzJfUlRJTUUKKwlib29sICJKRkZTMiBSVElNRSBjb21wcmVzc2lvbiBzdXBwb3J0IiBpZiBKRkZTMl9DT01QUkVTU0lPTl9PUFRJT05TCisJZGVwZW5kcyBvbiBKRkZTMl9GUworCWRlZmF1bHQgeQorICAgICAgICBoZWxwCisgICAgICAgICAgUnRpbWUgZG9lcyBtYW5hZ2UgdG8gcmVjb21wcmVzcyBhbHJlYWR5LWNvbXByZXNzZWQgZGF0YS4gU2F5ICdZJyBpZiB1bnN1cmUuCisKK2NvbmZpZyBKRkZTMl9SVUJJTgorCWJvb2wgIkpGRlMyIFJVQklOIGNvbXByZXNzaW9uIHN1cHBvcnQiIGlmIEpGRlMyX0NPTVBSRVNTSU9OX09QVElPTlMKKwlkZXBlbmRzIG9uIEpGRlMyX0ZTCisJZGVmYXVsdCBuCisgICAgICAgIGhlbHAKKyAgICAgICAgICBSVUJJTk1JUFMgYW5kIERZTlJVQklOIGNvbXByZXNzb3JzLiBTYXkgJ04nIGlmIHVuc3VyZS4KKworY2hvaWNlCisgICAgICAgIHByb21wdCAiSkZGUzIgZGVmYXVsdCBjb21wcmVzc2lvbiBtb2RlIiBpZiBKRkZTMl9DT01QUkVTU0lPTl9PUFRJT05TCisgICAgICAgIGRlZmF1bHQgSkZGUzJfQ01PREVfUFJJT1JJVFkKKyAgICAgICAgZGVwZW5kcyBvbiBKRkZTMl9GUworICAgICAgICBoZWxwCisgICAgICAgICAgWW91IGNhbiBzZXQgaGVyZSB0aGUgZGVmYXVsdCBjb21wcmVzc2lvbiBtb2RlIG9mIEpGRlMyIGZyb20gCisgICAgICAgICAgdGhlIGF2YWlsYWJsZSBjb21wcmVzc2lvbiBtb2Rlcy4gRG9uJ3QgdG91Y2ggaWYgdW5zdXJlLgorCitjb25maWcgSkZGUzJfQ01PREVfTk9ORQorICAgICAgICBib29sICJubyBjb21wcmVzc2lvbiIKKyAgICAgICAgaGVscAorICAgICAgICAgIFVzZXMgbm8gY29tcHJlc3Npb24uCisKK2NvbmZpZyBKRkZTMl9DTU9ERV9QUklPUklUWQorICAgICAgICBib29sICJwcmlvcml0eSIKKyAgICAgICAgaGVscAorICAgICAgICAgIFRyaWVzIHRoZSBjb21wcmVzc29ycyBpbiBhIHByZWRlZmluaWVkIG9yZGVyIGFuZCBjaG9vc2VzIHRoZSBmaXJzdCAKKyAgICAgICAgICBzdWNjZXNzZnVsIG9uZS4KKworY29uZmlnIEpGRlMyX0NNT0RFX1NJWkUKKyAgICAgICAgYm9vbCAic2l6ZSAoRVhQRVJJTUVOVEFMKSIKKyAgICAgICAgaGVscAorICAgICAgICAgIFRyaWVzIGFsbCBjb21wcmVzc29ycyBhbmQgY2hvb3NlcyB0aGUgb25lIHdoaWNoIGhhcyB0aGUgc21hbGxlc3QgCisgICAgICAgICAgcmVzdWx0LgorCitlbmRjaG9pY2UKKworY29uZmlnIENSQU1GUworCXRyaXN0YXRlICJDb21wcmVzc2VkIFJPTSBmaWxlIHN5c3RlbSBzdXBwb3J0IChjcmFtZnMpIgorCXNlbGVjdCBaTElCX0lORkxBVEUKKwloZWxwCisJICBTYXlpbmcgWSBoZXJlIGluY2x1ZGVzIHN1cHBvcnQgZm9yIENyYW1GcyAoQ29tcHJlc3NlZCBST00gRmlsZQorCSAgU3lzdGVtKS4gIENyYW1GcyBpcyBkZXNpZ25lZCB0byBiZSBhIHNpbXBsZSwgc21hbGwsIGFuZCBjb21wcmVzc2VkCisJICBmaWxlIHN5c3RlbSBmb3IgUk9NIGJhc2VkIGVtYmVkZGVkIHN5c3RlbXMuICBDcmFtRnMgaXMgcmVhZC1vbmx5LAorCSAgbGltaXRlZCB0byAyNTZNQiBmaWxlIHN5c3RlbXMgKHdpdGggMTZNQiBmaWxlcyksIGFuZCBkb2Vzbid0IHN1cHBvcnQKKwkgIDE2LzMyIGJpdHMgdWlkL2dpZCwgaGFyZCBsaW5rcyBhbmQgdGltZXN0YW1wcy4KKworCSAgU2VlIDxmaWxlOkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY3JhbWZzLnR4dD4gYW5kCisJICA8ZmlsZTpmcy9jcmFtZnMvUkVBRE1FPiBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkCisJICBjcmFtZnMuICBOb3RlIHRoYXQgdGhlIHJvb3QgZmlsZSBzeXN0ZW0gKHRoZSBvbmUgY29udGFpbmluZyB0aGUKKwkgIGRpcmVjdG9yeSAvKSBjYW5ub3QgYmUgY29tcGlsZWQgYXMgYSBtb2R1bGUuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBWWEZTX0ZTCisJdHJpc3RhdGUgIkZyZWVWeEZTIGZpbGUgc3lzdGVtIHN1cHBvcnQgKFZFUklUQVMgVnhGUyhUTSkgY29tcGF0aWJsZSkiCisJaGVscAorCSAgRnJlZVZ4RlMgaXMgYSBmaWxlIHN5c3RlbSBkcml2ZXIgdGhhdCBzdXBwb3J0IHRoZSBWRVJJVEFTIFZ4RlMoVE0pCisJICBmaWxlIHN5c3RlbSBmb3JtYXQuICBWRVJJVEFTIFZ4RlMoVE0pIGlzIHRoZSBzdGFuZGFyZCBmaWxlIHN5c3RlbQorCSAgb2YgU0NPIFVuaXhXYXJlIChhbmQgcG9zc2libHkgb3RoZXJzKSBhbmQgb3B0aW9uYWxseSBhdmFpbGFibGUKKwkgIGZvciBTdW5zb2Z0IFNvbGFyaXMsIEhQLVVYIGFuZCBtYW55IG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zLgorCSAgQ3VycmVudGx5IG9ubHkgcmVhZG9ubHkgYWNjZXNzIGlzIHN1cHBvcnRlZC4KKworCSAgTk9URTogdGhlIGZpbGUgc3lzdGVtIHR5cGUgYXMgdXNlZCBieSBtb3VudCgxKSwgbW91bnQoMikgYW5kCisJICBmc3RhYig1KSBpcyAndnhmcycgYXMgaXQgZGVzY3JpYmVzIHRoZSBmaWxlIHN5c3RlbSBmb3JtYXQsIG5vdAorCSAgdGhlIGFjdHVhbCBkcml2ZXIuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgZnJlZXZ4ZnMuICBJZiB1bnN1cmUsIHNheSBOLgorCisKK2NvbmZpZyBIUEZTX0ZTCisJdHJpc3RhdGUgIk9TLzIgSFBGUyBmaWxlIHN5c3RlbSBzdXBwb3J0IgorCWhlbHAKKwkgIE9TLzIgaXMgSUJNJ3Mgb3BlcmF0aW5nIHN5c3RlbSBmb3IgUEMncywgdGhlIHNhbWUgYXMgV2FycCwgYW5kIEhQRlMKKwkgIGlzIHRoZSBmaWxlIHN5c3RlbSB1c2VkIGZvciBvcmdhbml6aW5nIGZpbGVzIG9uIE9TLzIgaGFyZCBkaXNrCisJICBwYXJ0aXRpb25zLiBTYXkgWSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHJlYWQgZmlsZXMgZnJvbSBhbmQKKwkgIHdyaXRlIGZpbGVzIHRvIGFuIE9TLzIgSFBGUyBwYXJ0aXRpb24gb24geW91ciBoYXJkIGRyaXZlLiBPUy8yCisJICBmbG9wcGllcyBob3dldmVyIGFyZSBpbiByZWd1bGFyIE1TRE9TIGZvcm1hdCwgc28geW91IGRvbid0IG5lZWQgdGhpcworCSAgb3B0aW9uIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gcmVhZCB0aGVtLiBSZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2hwZnMudHh0Pi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGZpbGUgc3lzdGVtIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGhwZnMuICBJZiB1bnN1cmUsIHNheSBOLgorCisKKworY29uZmlnIFFOWDRGU19GUworCXRyaXN0YXRlICJRTlg0IGZpbGUgc3lzdGVtIHN1cHBvcnQgKHJlYWQgb25seSkiCisJaGVscAorCSAgVGhpcyBpcyB0aGUgZmlsZSBzeXN0ZW0gdXNlZCBieSB0aGUgcmVhbC10aW1lIG9wZXJhdGluZyBzeXN0ZW1zCisJICBRTlggNCBhbmQgUU5YIDYgKHRoZSBsYXR0ZXIgaXMgYWxzbyBjYWxsZWQgUU5YIFJUUCkuCisJICBGdXJ0aGVyIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBhdCA8aHR0cDovL3d3dy5xbnguY29tLz4uCisJICBTYXkgWSBpZiB5b3UgaW50ZW5kIHRvIG1vdW50IFFOWCBoYXJkIGRpc2tzIG9yIGZsb3BwaWVzLgorCSAgVW5sZXNzIHlvdSBzYXkgWSB0byAiUU5YNEZTIHJlYWQtd3JpdGUgc3VwcG9ydCIgYmVsb3csIHlvdSB3aWxsCisJICBvbmx5IGJlIGFibGUgdG8gcmVhZCB0aGVzZSBmaWxlIHN5c3RlbXMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBmaWxlIHN5c3RlbSBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBxbng0LgorCisJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGV0aGVyIHlvdSBuZWVkIGl0LCB0aGVuIHlvdSBkb24ndCBuZWVkIGl0OgorCSAgYW5zd2VyIE4uCisKK2NvbmZpZyBRTlg0RlNfUlcKKwlib29sICJRTlg0RlMgd3JpdGUgc3VwcG9ydCAoREFOR0VST1VTKSIKKwlkZXBlbmRzIG9uIFFOWDRGU19GUyAmJiBFWFBFUklNRU5UQUwgJiYgQlJPS0VOCisJaGVscAorCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gdGVzdCB3cml0ZSBzdXBwb3J0IGZvciBRTlg0IGZpbGUgc3lzdGVtcy4KKworCSAgSXQncyBjdXJyZW50bHkgYnJva2VuLCBzbyBmb3Igbm93OgorCSAgYW5zd2VyIE4uCisKKworCitjb25maWcgU1lTVl9GUworCXRyaXN0YXRlICJTeXN0ZW0gVi9YZW5peC9WNy9Db2hlcmVudCBmaWxlIHN5c3RlbSBzdXBwb3J0IgorCWhlbHAKKwkgIFNDTywgWGVuaXggYW5kIENvaGVyZW50IGFyZSBjb21tZXJjaWFsIFVuaXggc3lzdGVtcyBmb3IgSW50ZWwKKwkgIG1hY2hpbmVzLCBhbmQgVmVyc2lvbiA3IHdhcyB1c2VkIG9uIHRoZSBERUMgUERQLTExLiBTYXlpbmcgWQorCSAgaGVyZSB3b3VsZCBhbGxvdyB5b3UgdG8gcmVhZCBmcm9tIHRoZWlyIGZsb3BwaWVzIGFuZCBoYXJkIGRpc2sKKwkgIHBhcnRpdGlvbnMuCisKKwkgIElmIHlvdSBoYXZlIGZsb3BwaWVzIG9yIGhhcmQgZGlzayBwYXJ0aXRpb25zIGxpa2UgdGhhdCwgaXQgaXMgbGlrZWx5CisJICB0aGF0IHRoZXkgY29udGFpbiBiaW5hcmllcyBmcm9tIHRob3NlIG90aGVyIFVuaXggc3lzdGVtczsgaW4gb3JkZXIKKwkgIHRvIHJ1biB0aGVzZSBiaW5hcmllcywgeW91IHdpbGwgd2FudCB0byBpbnN0YWxsIGxpbnV4LWFiaSB3aGljaCBpcyBhCisJICBhIHNldCBvZiBrZXJuZWwgbW9kdWxlcyB0aGF0IGxldHMgeW91IHJ1biBTQ08sIFhlbml4LCBXeXNlLAorCSAgVW5peFdhcmUsIERlbGwgVW5peCBhbmQgU3lzdGVtIFYgcHJvZ3JhbXMgdW5kZXIgTGludXguICBJdCBpcworCSAgYXZhaWxhYmxlIHZpYSBGVFAgKHVzZXI6IGZ0cCkgZnJvbQorCSAgPGZ0cDovL2Z0cC5vcGVubGludXgub3JnL3B1Yi9wZW9wbGUvaGNoL2xpbnV4LWFiaS8+KS4KKwkgIE5PVEU6IHRoYXQgd2lsbCB3b3JrIG9ubHkgZm9yIGJpbmFyaWVzIGZyb20gSW50ZWwtYmFzZWQgc3lzdGVtczsKKwkgIFBEUCBvbmVzIHdpbGwgaGF2ZSB0byB3YWl0IHVudGlsIHNvbWVib2R5IHBvcnRzIExpbnV4IHRvIC0xMSA7LSkKKworCSAgSWYgeW91IG9ubHkgaW50ZW5kIHRvIG1vdW50IGZpbGVzIGZyb20gc29tZSBvdGhlciBVbml4IG92ZXIgdGhlCisJICBuZXR3b3JrIHVzaW5nIE5GUywgeW91IGRvbid0IG5lZWQgdGhlIFN5c3RlbSBWIGZpbGUgc3lzdGVtIHN1cHBvcnQKKwkgIChidXQgeW91IG5lZWQgTkZTIGZpbGUgc3lzdGVtIHN1cHBvcnQgb2J2aW91c2x5KS4KKworCSAgTm90ZSB0aGF0IHRoaXMgb3B0aW9uIGlzIGdlbmVyYWxseSBub3QgbmVlZGVkIGZvciBmbG9wcGllcywgc2luY2UgYQorCSAgZ29vZCBwb3J0YWJsZSB3YXkgdG8gdHJhbnNwb3J0IGZpbGVzIGFuZCBkaXJlY3RvcmllcyBiZXR3ZWVuIHVuaXhlcworCSAgKGFuZCBldmVuIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zKSBpcyBnaXZlbiBieSB0aGUgdGFyIHByb2dyYW0gKCJtYW4KKwkgIHRhciIgb3IgcHJlZmVyYWJseSAiaW5mbyB0YXIiKS4gIE5vdGUgYWxzbyB0aGF0IHRoaXMgb3B0aW9uIGhhcworCSAgbm90aGluZyB3aGF0c29ldmVyIHRvIGRvIHdpdGggdGhlIG9wdGlvbiAiU3lzdGVtIFYgSVBDIi4gUmVhZCBhYm91dAorCSAgdGhlIFN5c3RlbSBWIGZpbGUgc3lzdGVtIGluCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3N5c3YtZnMudHh0Pi4KKwkgIFNheWluZyBZIGhlcmUgd2lsbCBlbmxhcmdlIHlvdXIga2VybmVsIGJ5IGFib3V0IDI3IEtCLgorCisJICBUbyBjb21waWxlIHRoaXMgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQKKwkgIHN5c3YuCisKKwkgIElmIHlvdSBoYXZlbid0IGhlYXJkIGFib3V0IGFsbCBvZiB0aGlzIGJlZm9yZSwgaXQncyBzYWZlIHRvIHNheSBOLgorCisKKworY29uZmlnIFVGU19GUworCXRyaXN0YXRlICJVRlMgZmlsZSBzeXN0ZW0gc3VwcG9ydCAocmVhZCBvbmx5KSIKKwloZWxwCisJICBCU0QgYW5kIGRlcml2YXRlIHZlcnNpb25zIG9mIFVuaXggKHN1Y2ggYXMgU3VuT1MsIEZyZWVCU0QsIE5ldEJTRCwKKwkgIE9wZW5CU0QgYW5kIE5lWFRzdGVwKSB1c2UgYSBmaWxlIHN5c3RlbSBjYWxsZWQgVUZTLiBTb21lIFN5c3RlbSBWCisJICBVbml4ZXMgY2FuIGNyZWF0ZSBhbmQgbW91bnQgaGFyZCBkaXNrIHBhcnRpdGlvbnMgYW5kIGRpc2tldHRlcyB1c2luZworCSAgdGhpcyBmaWxlIHN5c3RlbSBhcyB3ZWxsLiBTYXlpbmcgWSBoZXJlIHdpbGwgYWxsb3cgeW91IHRvIHJlYWQgZnJvbQorCSAgdGhlc2UgcGFydGl0aW9uczsgaWYgeW91IGFsc28gd2FudCB0byB3cml0ZSB0byB0aGVtLCBzYXkgWSB0byB0aGUKKwkgIGV4cGVyaW1lbnRhbCAiVUZTIGZpbGUgc3lzdGVtIHdyaXRlIHN1cHBvcnQiLCBiZWxvdy4gUGxlYXNlIHJlYWQgdGhlCisJICBmaWxlIDxmaWxlOkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdWZzLnR4dD4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKyAgICAgICAgICBUaGUgcmVjZW50bHkgcmVsZWFzZWQgVUZTMiB2YXJpYW50ICh1c2VkIGluIEZyZWVCU0QgNS54KSBpcworICAgICAgICAgIFJFQUQtT05MWSBzdXBwb3J0ZWQuCisKKwkgIElmIHlvdSBvbmx5IGludGVuZCB0byBtb3VudCBmaWxlcyBmcm9tIHNvbWUgb3RoZXIgVW5peCBvdmVyIHRoZQorCSAgbmV0d29yayB1c2luZyBORlMsIHlvdSBkb24ndCBuZWVkIHRoZSBVRlMgZmlsZSBzeXN0ZW0gc3VwcG9ydCAoYnV0CisJICB5b3UgbmVlZCBORlMgZmlsZSBzeXN0ZW0gc3VwcG9ydCBvYnZpb3VzbHkpLgorCisJICBOb3RlIHRoYXQgdGhpcyBvcHRpb24gaXMgZ2VuZXJhbGx5IG5vdCBuZWVkZWQgZm9yIGZsb3BwaWVzLCBzaW5jZSBhCisJICBnb29kIHBvcnRhYmxlIHdheSB0byB0cmFuc3BvcnQgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGJldHdlZW4gdW5peGVzCisJICAoYW5kIGV2ZW4gb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMpIGlzIGdpdmVuIGJ5IHRoZSB0YXIgcHJvZ3JhbSAoIm1hbgorCSAgdGFyIiBvciBwcmVmZXJhYmx5ICJpbmZvIHRhciIpLgorCisJICBXaGVuIGFjY2Vzc2luZyBOZVhUc3RlcCBmaWxlcywgeW91IG1heSBuZWVkIHRvIGNvbnZlcnQgdGhlbSBmcm9tIHRoZQorCSAgTmVYVCBjaGFyYWN0ZXIgc2V0IHRvIHRoZSBMYXRpbjEgY2hhcmFjdGVyIHNldDsgdXNlIHRoZSBwcm9ncmFtCisJICByZWNvZGUgKCJpbmZvIHJlY29kZSIpIGZvciB0aGlzIHB1cnBvc2UuCisKKwkgIFRvIGNvbXBpbGUgdGhlIFVGUyBmaWxlIHN5c3RlbSBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB1ZnMuCisKKwkgIElmIHlvdSBoYXZlbid0IGhlYXJkIGFib3V0IGFsbCBvZiB0aGlzIGJlZm9yZSwgaXQncyBzYWZlIHRvIHNheSBOLgorCitjb25maWcgVUZTX0ZTX1dSSVRFCisJYm9vbCAiVUZTIGZpbGUgc3lzdGVtIHdyaXRlIHN1cHBvcnQgKERBTkdFUk9VUykiCisJZGVwZW5kcyBvbiBVRlNfRlMgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB0cnkgd3JpdGluZyB0byBVRlMgcGFydGl0aW9ucy4gVGhpcyBpcworCSAgZXhwZXJpbWVudGFsLCBzbyB5b3Ugc2hvdWxkIGJhY2sgdXAgeW91ciBVRlMgcGFydGl0aW9ucyBiZWZvcmVoYW5kLgorCitlbmRtZW51CisKK21lbnUgIk5ldHdvcmsgRmlsZSBTeXN0ZW1zIgorCWRlcGVuZHMgb24gTkVUCisKK2NvbmZpZyBORlNfRlMKKwl0cmlzdGF0ZSAiTkZTIGZpbGUgc3lzdGVtIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBJTkVUCisJc2VsZWN0IExPQ0tECisJc2VsZWN0IFNVTlJQQworCWhlbHAKKwkgIElmIHlvdSBhcmUgY29ubmVjdGVkIHRvIHNvbWUgb3RoZXIgKHVzdWFsbHkgbG9jYWwpIFVuaXggY29tcHV0ZXIKKwkgICh1c2luZyBTTElQLCBQTElQLCBQUFAgb3IgRXRoZXJuZXQpIGFuZCB3YW50IHRvIG1vdW50IGZpbGVzIHJlc2lkaW5nCisJICBvbiB0aGF0IGNvbXB1dGVyICh0aGUgTkZTIHNlcnZlcikgdXNpbmcgdGhlIE5ldHdvcmsgRmlsZSBTaGFyaW5nCisJICBwcm90b2NvbCwgc2F5IFkuICJNb3VudGluZyBmaWxlcyIgbWVhbnMgdGhhdCB0aGUgY2xpZW50IGNhbiBhY2Nlc3MKKwkgIHRoZSBmaWxlcyB3aXRoIHVzdWFsIFVOSVggY29tbWFuZHMgYXMgaWYgdGhleSB3ZXJlIHNpdHRpbmcgb24gdGhlCisJICBjbGllbnQncyBoYXJkIGRpc2suIEZvciB0aGlzIHRvIHdvcmssIHRoZSBzZXJ2ZXIgbXVzdCBydW4gdGhlCisJICBwcm9ncmFtcyBuZnNkIGFuZCBtb3VudGQgKGJ1dCBkb2VzIG5vdCBuZWVkIHRvIGhhdmUgTkZTIGZpbGUgc3lzdGVtCisJICBzdXBwb3J0IGVuYWJsZWQgaW4gaXRzIGtlcm5lbCkuIE5GUyBpcyBleHBsYWluZWQgaW4gdGhlIE5ldHdvcmsKKwkgIEFkbWluaXN0cmF0b3IncyBHdWlkZSwgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNndWlkZT4sIG9uIGl0cyBtYW4gcGFnZTogIm1hbgorCSAgbmZzIiwgYW5kIGluIHRoZSBORlMtSE9XVE8uCisKKwkgIEEgc3VwZXJpb3IgYnV0IGxlc3Mgd2lkZWx5IHVzZWQgYWx0ZXJuYXRpdmUgdG8gTkZTIGlzIHByb3ZpZGVkIGJ5CisJICB0aGUgQ29kYSBmaWxlIHN5c3RlbTsgc2VlICJDb2RhIGZpbGUgc3lzdGVtIHN1cHBvcnQiIGJlbG93LgorCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IHNob3VsZCBoYXZlIHNhaWQgWSB0byBUQ1AvSVAgbmV0d29ya2luZyBhbHNvLgorCSAgVGhpcyBvcHRpb24gd291bGQgZW5sYXJnZSB5b3VyIGtlcm5lbCBieSBhYm91dCAyNyBLQi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGZpbGUgc3lzdGVtIHN1cHBvcnQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG5mcy4KKworCSAgSWYgeW91IGFyZSBjb25maWd1cmluZyBhIGRpc2tsZXNzIG1hY2hpbmUgd2hpY2ggd2lsbCBtb3VudCBpdHMgcm9vdAorCSAgZmlsZSBzeXN0ZW0gb3ZlciBORlMgYXQgYm9vdCB0aW1lLCBzYXkgWSBoZXJlIGFuZCB0byAiS2VybmVsCisJICBsZXZlbCBJUCBhdXRvY29uZmlndXJhdGlvbiIgYWJvdmUgYW5kIHRvICJSb290IGZpbGUgc3lzdGVtIG9uIE5GUyIKKwkgIGJlbG93LiBZb3UgY2Fubm90IGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUgaW4gdGhpcyBjYXNlLgorCSAgVGhlcmUgYXJlIHR3byBwYWNrYWdlcyBkZXNpZ25lZCBmb3IgYm9vdGluZyBkaXNrbGVzcyBtYWNoaW5lcyBvdmVyCisJICB0aGUgbmV0OiBuZXRib290LCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly9mdHAxLnNvdXJjZWZvcmdlLm5ldC9uZXRib290Lz4sIGFuZCBFdGhlcmJvb3QsCisJICBhdmFpbGFibGUgZnJvbSA8aHR0cDovL2Z0cDEuc291cmNlZm9yZ2UubmV0L2V0aGVyYm9vdC8+LgorCisJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IGFsbCB0aGlzIGlzIGFib3V0LCBzYXkgTi4KKworY29uZmlnIE5GU19WMworCWJvb2wgIlByb3ZpZGUgTkZTdjMgY2xpZW50IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORlNfRlMKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHlvdXIgTkZTIGNsaWVudCB0byBiZSBhYmxlIHRvIHNwZWFrIHZlcnNpb24KKwkgIDMgb2YgdGhlIE5GUyBwcm90b2NvbC4KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIE5GU19WNAorCWJvb2wgIlByb3ZpZGUgTkZTdjQgY2xpZW50IHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBORlNfRlMgJiYgRVhQRVJJTUVOVEFMCisJc2VsZWN0IFJQQ1NFQ19HU1NfS1JCNQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgeW91ciBORlMgY2xpZW50IHRvIGJlIGFibGUgdG8gc3BlYWsgdGhlIG5ld2VyCisJICB2ZXJzaW9uIDQgb2YgdGhlIE5GUyBwcm90b2NvbC4KKworCSAgTm90ZTogUmVxdWlyZXMgYXV4aWxpYXJ5IHVzZXJzcGFjZSBkYWVtb25zIHdoaWNoIG1heSBiZSBmb3VuZCBvbgorCQlodHRwOi8vd3d3LmNpdGkudW1pY2guZWR1L3Byb2plY3RzL25mc3Y0LworCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTkZTX0RJUkVDVElPCisJYm9vbCAiQWxsb3cgZGlyZWN0IEkvTyBvbiBORlMgZmlsZXMgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBORlNfRlMgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBhcHBsaWNhdGlvbnMgdG8gcGVyZm9ybSB1bmNhY2hlZCBJL08gb24gZmlsZXMKKwkgIGluIE5GUyBmaWxlIHN5c3RlbXMgdXNpbmcgdGhlIE9fRElSRUNUIG9wZW4oKSBmbGFnLiAgV2hlbiBPX0RJUkVDVAorCSAgaXMgc2V0IGZvciBhIGZpbGUsIGl0cyBkYXRhIGlzIG5vdCBjYWNoZWQgaW4gdGhlIHN5c3RlbSdzIHBhZ2UKKwkgIGNhY2hlLiAgRGF0YSBpcyBtb3ZlZCB0byBhbmQgZnJvbSB1c2VyLWxldmVsIGFwcGxpY2F0aW9uIGJ1ZmZlcnMKKwkgIGRpcmVjdGx5LiAgVW5saWtlIGxvY2FsIGRpc2stYmFzZWQgZmlsZSBzeXN0ZW1zLCBORlMgT19ESVJFQ1QgaGFzCisJICBubyBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zLgorCisJICBVbmxlc3MgeW91ciBwcm9ncmFtIGlzIGRlc2lnbmVkIHRvIHVzZSBPX0RJUkVDVCBwcm9wZXJseSwgeW91IGFyZQorCSAgbXVjaCBiZXR0ZXIgb2ZmIGFsbG93aW5nIHRoZSBORlMgY2xpZW50IHRvIG1hbmFnZSBkYXRhIGNhY2hpbmcgZm9yCisJICB5b3UuICBNaXN1c2luZyBPX0RJUkVDVCBjYW4gY2F1c2UgcG9vciBzZXJ2ZXIgcGVyZm9ybWFuY2Ugb3IgbmV0d29yaworCSAgc3Rvcm1zLiAgVGhpcyBrZXJuZWwgYnVpbGQgb3B0aW9uIGRlZmF1bHRzIE9GRiB0byBhdm9pZCBleHBvc2luZworCSAgc3lzdGVtIGFkbWluaXN0cmF0b3JzIHVud2l0dGluZ2x5IHRvIGEgcG90ZW50aWFsbHkgaGF6YXJkb3VzCisJICBmZWF0dXJlLgorCisJICBGb3IgbW9yZSBkZXRhaWxzIG9uIE5GUyBPX0RJUkVDVCwgc2VlIGZzL25mcy9kaXJlY3QuYy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4gIFRoaXMgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgTkZTIGNsaWVudCwgYW5kCisJICBjYXVzZXMgb3BlbigpIHRvIHJldHVybiBFSU5WQUwgaWYgYSBmaWxlIHJlc2lkaW5nIGluIE5GUyBpcworCSAgb3BlbmVkIHdpdGggdGhlIE9fRElSRUNUIGZsYWcuCisKK2NvbmZpZyBORlNECisJdHJpc3RhdGUgIk5GUyBzZXJ2ZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIElORVQKKwlzZWxlY3QgTE9DS0QKKwlzZWxlY3QgU1VOUlBDCisJc2VsZWN0IEVYUE9SVEZTCisJaGVscAorCSAgSWYgeW91IHdhbnQgeW91ciBMaW51eCBib3ggdG8gYWN0IGFzIGFuIE5GUyAqc2VydmVyKiwgc28gdGhhdCBvdGhlcgorCSAgY29tcHV0ZXJzIG9uIHlvdXIgbG9jYWwgbmV0d29yayB3aGljaCBzdXBwb3J0IE5GUyBjYW4gYWNjZXNzIGNlcnRhaW4KKwkgIGRpcmVjdG9yaWVzIG9uIHlvdXIgYm94IHRyYW5zcGFyZW50bHksIHlvdSBoYXZlIHR3byBvcHRpb25zOiB5b3UgY2FuCisJICB1c2UgdGhlIHNlbGYtY29udGFpbmVkIHVzZXIgc3BhY2UgcHJvZ3JhbSBuZnNkLCBpbiB3aGljaCBjYXNlIHlvdQorCSAgc2hvdWxkIHNheSBOIGhlcmUsIG9yIHlvdSBjYW4gc2F5IFkgYW5kIHVzZSB0aGUga2VybmVsIGJhc2VkIE5GUworCSAgc2VydmVyLiBUaGUgYWR2YW50YWdlIG9mIHRoZSBrZXJuZWwgYmFzZWQgc29sdXRpb24gaXMgdGhhdCBpdCBpcworCSAgZmFzdGVyLgorCisJICBJbiBlaXRoZXIgY2FzZSwgeW91IHdpbGwgbmVlZCBzdXBwb3J0IHNvZnR3YXJlOyB0aGUgcmVzcGVjdGl2ZQorCSAgbG9jYXRpb25zIGFyZSBnaXZlbiBpbiB0aGUgZmlsZSA8ZmlsZTpEb2N1bWVudGF0aW9uL0NoYW5nZXM+IGluIHRoZQorCSAgTkZTIHNlY3Rpb24uCisKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBnZXQgc3VwcG9ydCBmb3IgdmVyc2lvbiAyIG9mIHRoZSBORlMKKwkgIHByb3RvY29sIChORlN2MikuIElmIHlvdSBhbHNvIHdhbnQgTkZTdjMsIHNheSBZIHRvIHRoZSBuZXh0IHF1ZXN0aW9uCisJICBhcyB3ZWxsLgorCisJICBQbGVhc2UgcmVhZCB0aGUgTkZTLUhPV1RPLCBhdmFpbGFibGUgZnJvbQorCSAgPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgVG8gY29tcGlsZSB0aGUgTkZTIHNlcnZlciBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBuZnNkLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE5GU0RfVjMKKwlib29sICJQcm92aWRlIE5GU3YzIHNlcnZlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkZTRAorCWhlbHAKKwkgIElmIHlvdSB3b3VsZCBsaWtlIHRvIGluY2x1ZGUgdGhlIE5GU3YzIHNlcnZlciBhcyB3ZWxsIGFzIHRoZSBORlN2MgorCSAgc2VydmVyLCBzYXkgWSBoZXJlLiAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIE5GU0RfVjQKKwlib29sICJQcm92aWRlIE5GU3Y0IHNlcnZlciBzdXBwb3J0IChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gTkZTRF9WMyAmJiBFWFBFUklNRU5UQUwKKwlzZWxlY3QgTkZTRF9UQ1AKKwloZWxwCisJICBJZiB5b3Ugd291bGQgbGlrZSB0byBpbmNsdWRlIHRoZSBORlN2NCBzZXJ2ZXIgYXMgd2VsbCBhcyB0aGUgTkZTdjIKKwkgIGFuZCBORlN2MyBzZXJ2ZXJzLCBzYXkgWSBoZXJlLiAgVGhpcyBmZWF0dXJlIGlzIGV4cGVyaW1lbnRhbCwgYW5kCisJICBzaG91bGQgb25seSBiZSB1c2VkIGlmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBoZWxwaW5nIHRvIHRlc3QgTkZTdjQuCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTkZTRF9UQ1AKKwlib29sICJQcm92aWRlIE5GUyBzZXJ2ZXIgb3ZlciBUQ1Agc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5GU0QKKwlkZWZhdWx0IHkKKwloZWxwCisJICBJZiB5b3Ugd2FudCB5b3VyIE5GUyBzZXJ2ZXIgdG8gc3VwcG9ydCBUQ1AgY29ubmVjdGlvbnMsIHNheSBZIGhlcmUuCisJICBUQ1AgY29ubmVjdGlvbnMgdXN1YWxseSBwZXJmb3JtIGJldHRlciB0aGFuIHRoZSBkZWZhdWx0IFVEUCB3aGVuCisJICB0aGUgbmV0d29yayBpcyBsb3NzeSBvciBjb25nZXN0ZWQuICBJZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgUk9PVF9ORlMKKwlib29sICJSb290IGZpbGUgc3lzdGVtIG9uIE5GUyIKKwlkZXBlbmRzIG9uIE5GU19GUz15ICYmIElQX1BOUAorCWhlbHAKKwkgIElmIHlvdSB3YW50IHlvdXIgTGludXggYm94IHRvIG1vdW50IGl0cyB3aG9sZSByb290IGZpbGUgc3lzdGVtICh0aGUKKwkgIG9uZSBjb250YWluaW5nIHRoZSBkaXJlY3RvcnkgLykgZnJvbSBzb21lIG90aGVyIGNvbXB1dGVyIG92ZXIgdGhlCisJICBuZXQgdmlhIE5GUyAocHJlc3VtYWJseSBiZWNhdXNlIHlvdXIgYm94IGRvZXNuJ3QgaGF2ZSBhIGhhcmQgZGlzayksCisJICBzYXkgWS4gUmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL25mc3Jvb3QudHh0PiBmb3IgZGV0YWlscy4gSXQgaXMKKwkgIGxpa2VseSB0aGF0IGluIHRoaXMgY2FzZSwgeW91IGFsc28gd2FudCB0byBzYXkgWSB0byAiS2VybmVsIGxldmVsIElQCisJICBhdXRvY29uZmlndXJhdGlvbiIgc28gdGhhdCB5b3VyIGJveCBjYW4gZGlzY292ZXIgaXRzIG5ldHdvcmsgYWRkcmVzcworCSAgYXQgYm9vdCB0aW1lLgorCisJICBNb3N0IHBlb3BsZSBzYXkgTiBoZXJlLgorCitjb25maWcgTE9DS0QKKwl0cmlzdGF0ZQorCitjb25maWcgTE9DS0RfVjQKKwlib29sCisJZGVwZW5kcyBvbiBORlNEX1YzIHx8IE5GU19WMworCWRlZmF1bHQgeQorCitjb25maWcgRVhQT1JURlMKKwl0cmlzdGF0ZQorCitjb25maWcgU1VOUlBDCisJdHJpc3RhdGUKKworY29uZmlnIFNVTlJQQ19HU1MKKwl0cmlzdGF0ZQorCitjb25maWcgUlBDU0VDX0dTU19LUkI1CisJdHJpc3RhdGUgIlNlY3VyZSBSUEM6IEtlcmJlcm9zIFYgbWVjaGFuaXNtIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gU1VOUlBDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBTVU5SUENfR1NTCisJc2VsZWN0IENSWVBUTworCXNlbGVjdCBDUllQVE9fTUQ1CisJc2VsZWN0IENSWVBUT19ERVMKKwloZWxwCisJICBQcm92aWRlcyBmb3Igc2VjdXJlIFJQQyBjYWxscyBieSBtZWFucyBvZiBhIGdzcy1hcGkKKwkgIG1lY2hhbmlzbSBiYXNlZCBvbiBLZXJiZXJvcyBWNS4gVGhpcyBpcyByZXF1aXJlZCBmb3IKKwkgIE5GU3Y0LgorCisJICBOb3RlOiBSZXF1aXJlcyBhbiBhdXhpbGlhcnkgdXNlcnNwYWNlIGRhZW1vbiB3aGljaCBtYXkgYmUgZm91bmQgb24KKwkJaHR0cDovL3d3dy5jaXRpLnVtaWNoLmVkdS9wcm9qZWN0cy9uZnN2NC8KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFJQQ1NFQ19HU1NfU1BLTTMKKwl0cmlzdGF0ZSAiU2VjdXJlIFJQQzogU1BLTTMgbWVjaGFuaXNtIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gU1VOUlBDICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBTVU5SUENfR1NTCisJc2VsZWN0IENSWVBUTworCXNlbGVjdCBDUllQVE9fTUQ1CisJc2VsZWN0IENSWVBUT19ERVMKKwloZWxwCisJICBQcm92aWRlcyBmb3Igc2VjdXJlIFJQQyBjYWxscyBieSBtZWFucyBvZiBhIGdzcy1hcGkKKwkgIG1lY2hhbmlzbSBiYXNlZCBvbiB0aGUgU1BLTTMgcHVibGljLWtleSBtZWNoYW5pc20uCisKKwkgIE5vdGU6IFJlcXVpcmVzIGFuIGF1eGlsaWFyeSB1c2Vyc3BhY2UgZGFlbW9uIHdoaWNoIG1heSBiZSBmb3VuZCBvbgorCSAgCWh0dHA6Ly93d3cuY2l0aS51bWljaC5lZHUvcHJvamVjdHMvbmZzdjQvCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBTTUJfRlMKKwl0cmlzdGF0ZSAiU01CIGZpbGUgc3lzdGVtIHN1cHBvcnQgKHRvIG1vdW50IFdpbmRvd3Mgc2hhcmVzIGV0Yy4pIgorCWRlcGVuZHMgb24gSU5FVAorCXNlbGVjdCBOTFMKKwloZWxwCisJICBTTUIgKFNlcnZlciBNZXNzYWdlIEJsb2NrKSBpcyB0aGUgcHJvdG9jb2wgV2luZG93cyBmb3IgV29ya2dyb3VwcworCSAgKFdmVyksIFdpbmRvd3MgOTUvOTgsIFdpbmRvd3MgTlQgYW5kIE9TLzIgTGFuIE1hbmFnZXIgdXNlIHRvIHNoYXJlCisJICBmaWxlcyBhbmQgcHJpbnRlcnMgb3ZlciBsb2NhbCBuZXR3b3Jrcy4gIFNheWluZyBZIGhlcmUgYWxsb3dzIHlvdSB0bworCSAgbW91bnQgdGhlaXIgZmlsZSBzeXN0ZW1zIChvZnRlbiBjYWxsZWQgInNoYXJlcyIgaW4gdGhpcyBjb250ZXh0KSBhbmQKKwkgIGFjY2VzcyB0aGVtIGp1c3QgbGlrZSBhbnkgb3RoZXIgVW5peCBkaXJlY3RvcnkuICBDdXJyZW50bHksIHRoaXMKKwkgIHdvcmtzIG9ubHkgaWYgdGhlIFdpbmRvd3MgbWFjaGluZXMgdXNlIFRDUC9JUCBhcyB0aGUgdW5kZXJseWluZworCSAgdHJhbnNwb3J0IHByb3RvY29sLCBhbmQgbm90IE5ldEJFVUkuICBGb3IgZGV0YWlscywgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9zbWJmcy50eHQ+IGFuZCB0aGUgU01CLUhPV1RPLAorCSAgYXZhaWxhYmxlIGZyb20gPGh0dHA6Ly93d3cudGxkcC5vcmcvZG9jcy5odG1sI2hvd3RvPi4KKworCSAgTm90ZTogaWYgeW91IGp1c3Qgd2FudCB5b3VyIGJveCB0byBhY3QgYXMgYW4gU01CICpzZXJ2ZXIqIGFuZCBtYWtlCisJICBmaWxlcyBhbmQgcHJpbnRpbmcgc2VydmljZXMgYXZhaWxhYmxlIHRvIFdpbmRvd3MgY2xpZW50cyAod2hpY2ggbmVlZAorCSAgdG8gaGF2ZSBhIFRDUC9JUCBzdGFjayksIHlvdSBkb24ndCBuZWVkIHRvIHNheSBZIGhlcmU7IHlvdSBjYW4gdXNlCisJICB0aGUgcHJvZ3JhbSBTQU1CQSAoYXZhaWxhYmxlIGZyb20gPGZ0cDovL2Z0cC5zYW1iYS5vcmcvcHViL3NhbWJhLz4pCisJICBmb3IgdGhhdC4KKworCSAgR2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gY29ubmVjdCBMaW51eCwgV2luZG93cyBtYWNoaW5lcyBhbmQKKwkgIE1hY3MgaXMgb24gdGhlIFdXVyBhdCA8aHR0cDovL3d3dy5lYXRzLmNvbS9saW51eF9tYWNfd2luLmh0bWw+LgorCisJICBUbyBjb21waWxlIHRoZSBTTUIgc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgc21iZnMuICBNb3N0IHBlb3BsZSBzYXkgTiwgaG93ZXZlci4KKworY29uZmlnIFNNQl9OTFNfREVGQVVMVAorCWJvb2wgIlVzZSBhIGRlZmF1bHQgTkxTIgorCWRlcGVuZHMgb24gU01CX0ZTCisJaGVscAorCSAgRW5hYmxpbmcgdGhpcyB3aWxsIG1ha2Ugc21iZnMgdXNlIG5scyB0cmFuc2xhdGlvbnMgYnkgZGVmYXVsdC4gWW91CisJICBuZWVkIHRvIHNwZWNpZnkgdGhlIGxvY2FsIGNoYXJzZXQgKENPTkZJR19OTFNfREVGQVVMVCkgaW4gdGhlIG5scworCSAgc2V0dGluZ3MgYW5kIHlvdSBuZWVkIHRvIGdpdmUgdGhlIGRlZmF1bHQgbmxzIGZvciB0aGUgU01CIHNlcnZlciBhcworCSAgQ09ORklHX1NNQl9OTFNfUkVNT1RFLgorCisJICBUaGUgbmxzIHNldHRpbmdzIGNhbiBiZSBjaGFuZ2VkIGF0IG1vdW50IHRpbWUsIGlmIHlvdXIgc21ibW91bnQKKwkgIHN1cHBvcnRzIHRoYXQsIHVzaW5nIHRoZSBjb2RlcGFnZSBhbmQgaW9jaGFyc2V0IHBhcmFtZXRlcnMuCisKKwkgIHNtYm1vdW50IGZyb20gc2FtYmEgMi4yLjAgb3IgbGF0ZXIgc3VwcG9ydHMgdGhpcy4KKworY29uZmlnIFNNQl9OTFNfUkVNT1RFCisJc3RyaW5nICJEZWZhdWx0IFJlbW90ZSBOTFMgT3B0aW9uIgorCWRlcGVuZHMgb24gU01CX05MU19ERUZBVUxUCisJZGVmYXVsdCAiY3A0MzciCisJaGVscAorCSAgVGhpcyBzZXR0aW5nIGFsbG93cyB5b3UgdG8gc3BlY2lmeSBhIGRlZmF1bHQgdmFsdWUgZm9yIHdoaWNoCisJICBjb2RlcGFnZSB0aGUgc2VydmVyIHVzZXMuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayBubworCSAgdHJhbnNsYXRpb25zIHdpbGwgYmUgZG9uZSBieSBkZWZhdWx0LiBUaGUgbG9jYWwgY29kZXBhZ2UvY2hhcnNldAorCSAgZGVmYXVsdCB0byBDT05GSUdfTkxTX0RFRkFVTFQuCisKKwkgIFRoZSBubHMgc2V0dGluZ3MgY2FuIGJlIGNoYW5nZWQgYXQgbW91bnQgdGltZSwgaWYgeW91ciBzbWJtb3VudAorCSAgc3VwcG9ydHMgdGhhdCwgdXNpbmcgdGhlIGNvZGVwYWdlIGFuZCBpb2NoYXJzZXQgcGFyYW1ldGVycy4KKworCSAgc21ibW91bnQgZnJvbSBzYW1iYSAyLjIuMCBvciBsYXRlciBzdXBwb3J0cyB0aGlzLgorCitjb25maWcgQ0lGUworCXRyaXN0YXRlICJDSUZTIHN1cHBvcnQgKGFkdmFuY2VkIG5ldHdvcmsgZmlsZXN5c3RlbSBmb3IgU2FtYmEsIFdpbmRvdyBhbmQgb3RoZXIgQ0lGUyBjb21wbGlhbnQgc2VydmVycykiCisJZGVwZW5kcyBvbiBJTkVUCisJc2VsZWN0IE5MUworCWhlbHAKKwkgIFRoaXMgaXMgdGhlIGNsaWVudCBWRlMgbW9kdWxlIGZvciB0aGUgQ29tbW9uIEludGVybmV0IEZpbGUgU3lzdGVtCisJICAoQ0lGUykgcHJvdG9jb2wgd2hpY2ggaXMgdGhlIHN1Y2Nlc3NvciB0byB0aGUgU2VydmVyIE1lc3NhZ2UgQmxvY2sgCisJICAoU01CKSBwcm90b2NvbCwgdGhlIG5hdGl2ZSBmaWxlIHNoYXJpbmcgbWVjaGFuaXNtIGZvciBtb3N0IGVhcmx5CisJICBQQyBvcGVyYXRpbmcgc3lzdGVtcy4gIFRoZSBDSUZTIHByb3RvY29sIGlzIGZ1bGx5IHN1cHBvcnRlZCBieSAKKwkgIGZpbGUgc2VydmVycyBzdWNoIGFzIFdpbmRvd3MgMjAwMCAoaW5jbHVkaW5nIFdpbmRvd3MgMjAwMywgTlQgNCAgCisJICBhbmQgV2luZG93cyBYUCkgYXMgd2VsbCBieSBTYW1iYSAod2hpY2ggcHJvdmlkZXMgZXhjZWxsZW50IENJRlMKKwkgIHNlcnZlciBzdXBwb3J0IGZvciBMaW51eCBhbmQgbWFueSBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcykuIEN1cnJlbnRseQorCSAgeW91IG11c3QgdXNlIHRoZSBzbWJmcyBjbGllbnQgZmlsZXN5c3RlbSB0byBhY2Nlc3Mgb2xkZXIgU01CIHNlcnZlcnMKKwkgIHN1Y2ggYXMgV2luZG93cyA5eCBhbmQgT1MvMi4KKworCSAgVGhlIGludGVudCBvZiB0aGUgY2lmcyBtb2R1bGUgaXMgdG8gcHJvdmlkZSBhbiBhZHZhbmNlZAorCSAgbmV0d29yayBmaWxlIHN5c3RlbSBjbGllbnQgZm9yIG1vdW50aW5nIHRvIENJRlMgY29tcGxpYW50IHNlcnZlcnMsIAorCSAgaW5jbHVkaW5nIHN1cHBvcnQgZm9yIGRmcyAoaGllcmFyY2hpY2FsIG5hbWUgc3BhY2UpLCBzZWN1cmUgcGVyLXVzZXIKKwkgIHNlc3Npb24gZXN0YWJsaXNobWVudCwgc2FmZSBkaXN0cmlidXRlZCBjYWNoaW5nIChvcGxvY2spLCBvcHRpb25hbAorCSAgcGFja2V0IHNpZ25pbmcsIFVuaWNvZGUgYW5kIG90aGVyIGludGVybmF0aW9uYWxpemF0aW9uIGltcHJvdmVtZW50cywgCisJICBhbmQgb3B0aW9uYWwgV2luYmluZCAobnNzd2l0Y2gpIGludGVncmF0aW9uLiBZb3UgZG8gbm90IG5lZWQgdG8gZW5hYmxlCisJICBjaWZzIGlmIHJ1bm5pbmcgb25seSBhIChTYW1iYSkgc2VydmVyLiBJdCBpcyBwb3NzaWJsZSB0byBlbmFibGUgYm90aAorCSAgc21iZnMgYW5kIGNpZnMgKGUuZy4gaWYgeW91IGFyZSB1c2luZyBDSUZTIGZvciBhY2Nlc3NpbmcgV2luZG93cyAyMDAzCisJICBhbmQgU2FtYmEgMyBzZXJ2ZXJzLCBhbmQgc21iZnMgZm9yIGFjY2Vzc2luZyBvbGQgc2VydmVycykuIElmIHlvdSBuZWVkIAorCSAgdG8gbW91bnQgdG8gU2FtYmEgb3IgV2luZG93cyAyMDAzIHNlcnZlcnMgZnJvbSB0aGlzIG1hY2hpbmUsIHNheSBZLgorCitjb25maWcgQ0lGU19TVEFUUworICAgICAgICBib29sICJDSUZTIHN0YXRpc3RpY3MiCisgICAgICAgIGRlcGVuZHMgb24gQ0lGUworICAgICAgICBoZWxwCisgICAgICAgICAgRW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBjYXVzZSBzdGF0aXN0aWNzIGZvciBlYWNoIHNlcnZlciBzaGFyZQorCSAgbW91bnRlZCBieSB0aGUgY2lmcyBjbGllbnQgdG8gYmUgZGlzcGxheWVkIGluIC9wcm9jL2ZzL2NpZnMvU3RhdHMKKworY29uZmlnIENJRlNfWEFUVFIKKyAgICAgICAgYm9vbCAiQ0lGUyBleHRlbmRlZCBhdHRyaWJ1dGVzIChFWFBFUklNRU5UQUwpIgorICAgICAgICBkZXBlbmRzIG9uIENJRlMKKyAgICAgICAgaGVscAorICAgICAgICAgIEV4dGVuZGVkIGF0dHJpYnV0ZXMgYXJlIG5hbWU6dmFsdWUgcGFpcnMgYXNzb2NpYXRlZCB3aXRoIGlub2RlcyBieQorICAgICAgICAgIHRoZSBrZXJuZWwgb3IgYnkgdXNlcnMgKHNlZSB0aGUgYXR0cig1KSBtYW51YWwgcGFnZSwgb3IgdmlzaXQKKyAgICAgICAgICA8aHR0cDovL2FjbC5iZXN0Yml0cy5hdC8+IGZvciBkZXRhaWxzKS4gIENJRlMgbWFwcyB0aGUgbmFtZSBvZgorICAgICAgICAgIGV4dGVuZGVkIGF0dHJpYnV0ZXMgYmVnaW5uaW5nIHdpdGggdGhlIHVzZXIgbmFtZXNwYWNlIHByZWZpeAorICAgICAgICAgIHRvIFNNQi9DSUZTIEVBcy4gRUFzIGFyZSBzdG9yZWQgb24gV2luZG93cyBzZXJ2ZXJzIHdpdGhvdXQgdGhlCisgICAgICAgICAgdXNlciBuYW1lc3BhY2UgcHJlZml4LCBidXQgdGhlaXIgbmFtZXMgYXJlIHNlZW4gYnkgTGludXggY2lmcyBjbGllbnRzCisgICAgICAgICAgcHJlZmFjZWQgYnkgdGhlIHVzZXIgbmFtZXNwYWNlIHByZWZpeC4gVGhlIHN5c3RlbSBuYW1lc3BhY2UKKyAgICAgICAgICAodXNlZCBieSBzb21lIGZpbGVzeXN0ZW1zIHRvIHN0b3JlIEFDTHMpIGlzIG5vdCBzdXBwb3J0ZWQgYXQKKyAgICAgICAgICB0aGlzIHRpbWUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIENJRlNfUE9TSVgKKyAgICAgICAgYm9vbCAiQ0lGUyBQT1NJWCBFeHRlbnNpb25zIChFWFBFUklNRU5UQUwpIgorICAgICAgICBkZXBlbmRzIG9uIENJRlNfWEFUVFIKKyAgICAgICAgaGVscAorICAgICAgICAgIEVuYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgY2F1c2UgdGhlIGNpZnMgY2xpZW50IHRvIGF0dGVtcHQgdG8KKwkgIG5lZ290aWF0ZSBhIG5ld2VyIGRpYWxlY3Qgd2l0aCBzZXJ2ZXJzLCBzdWNoIGFzIFNhbWJhIDMuMC41CisJICBvciBsYXRlciwgdGhhdCBvcHRpb25hbGx5IGNhbiBoYW5kbGUgbW9yZSBQT1NJWCBsaWtlIChyYXRoZXIKKwkgIHRoYW4gV2luZG93cyBsaWtlKSBmaWxlIGJlaGF2aW9yLiAgSXQgYWxzbyBlbmFibGVzCisJICBzdXBwb3J0IGZvciBQT1NJWCBBQ0xzIChnZXRmYWNsIGFuZCBzZXRmYWNsKSB0byBzZXJ2ZXJzCisJICAoc3VjaCBhcyBTYW1iYSAzLjEwIGFuZCBsYXRlcikgd2hpY2ggY2FuIG5lZ290aWF0ZQorCSAgQ0lGUyBQT1NJWCBBQ0wgc3VwcG9ydC4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBDSUZTX0VYUEVSSU1FTlRBTAorCSAgYm9vbCAiQ0lGUyBFeHBlcmltZW50YWwgRmVhdHVyZXMgKEVYUEVSSU1FTlRBTCkiCisJICBkZXBlbmRzIG9uIENJRlMKKwkgIGhlbHAKKwkgICAgRW5hYmxlcyBjaWZzIGZlYXR1cmVzIHVuZGVyIHRlc3RpbmcuIFRoZXNlIGZlYXR1cmVzCisJICAgIGFyZSBoaWdobHkgZXhwZXJpbWVudGFsLiAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE5DUF9GUworCXRyaXN0YXRlICJOQ1AgZmlsZSBzeXN0ZW0gc3VwcG9ydCAodG8gbW91bnQgTmV0V2FyZSB2b2x1bWVzKSIKKwlkZXBlbmRzIG9uIElQWCE9biB8fCBJTkVUCisJaGVscAorCSAgTkNQIChOZXRXYXJlIENvcmUgUHJvdG9jb2wpIGlzIGEgcHJvdG9jb2wgdGhhdCBydW5zIG92ZXIgSVBYIGFuZCBpcworCSAgdXNlZCBieSBOb3ZlbGwgTmV0V2FyZSBjbGllbnRzIHRvIHRhbGsgdG8gZmlsZSBzZXJ2ZXJzLiAgSXQgaXMgdG8KKwkgIElQWCB3aGF0IE5GUyBpcyB0byBUQ1AvSVAsIGlmIHRoYXQgaGVscHMuICBTYXlpbmcgWSBoZXJlIGFsbG93cyB5b3UKKwkgIHRvIG1vdW50IE5ldFdhcmUgZmlsZSBzZXJ2ZXIgdm9sdW1lcyBhbmQgdG8gYWNjZXNzIHRoZW0ganVzdCBsaWtlCisJICBhbnkgb3RoZXIgVW5peCBkaXJlY3RvcnkuICBGb3IgZGV0YWlscywgcGxlYXNlIHJlYWQgdGhlIGZpbGUKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbmNwZnMudHh0PiBpbiB0aGUga2VybmVsIHNvdXJjZSBhbmQKKwkgIHRoZSBJUFgtSE9XVE8gZnJvbSA8aHR0cDovL3d3dy50bGRwLm9yZy9kb2NzLmh0bWwjaG93dG8+LgorCisJICBZb3UgZG8gbm90IGhhdmUgdG8gc2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB5b3VyIExpbnV4IGJveCB0byBhY3QgYXMgYQorCSAgZmlsZSAqc2VydmVyKiBmb3IgTm92ZWxsIE5ldFdhcmUgY2xpZW50cy4KKworCSAgR2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCBob3cgdG8gY29ubmVjdCBMaW51eCwgV2luZG93cyBtYWNoaW5lcyBhbmQKKwkgIE1hY3MgaXMgb24gdGhlIFdXVyBhdCA8aHR0cDovL3d3dy5lYXRzLmNvbS9saW51eF9tYWNfd2luLmh0bWw+LgorCisJICBUbyBjb21waWxlIHRoaXMgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQKKwkgIG5jcGZzLiAgU2F5IE4gdW5sZXNzIHlvdSBhcmUgY29ubmVjdGVkIHRvIGEgTm92ZWxsIG5ldHdvcmsuCisKK3NvdXJjZSAiZnMvbmNwZnMvS2NvbmZpZyIKKworY29uZmlnIENPREFfRlMKKwl0cmlzdGF0ZSAiQ29kYSBmaWxlIHN5c3RlbSBzdXBwb3J0IChhZHZhbmNlZCBuZXR3b3JrIGZzKSIKKwlkZXBlbmRzIG9uIElORVQKKwloZWxwCisJICBDb2RhIGlzIGFuIGFkdmFuY2VkIG5ldHdvcmsgZmlsZSBzeXN0ZW0sIHNpbWlsYXIgdG8gTkZTIGluIHRoYXQgaXQKKwkgIGVuYWJsZXMgeW91IHRvIG1vdW50IGZpbGUgc3lzdGVtcyBvZiBhIHJlbW90ZSBzZXJ2ZXIgYW5kIGFjY2VzcyB0aGVtCisJICB3aXRoIHJlZ3VsYXIgVW5peCBjb21tYW5kcyBhcyBpZiB0aGV5IHdlcmUgc2l0dGluZyBvbiB5b3VyIGhhcmQKKwkgIGRpc2suICBDb2RhIGhhcyBzZXZlcmFsIGFkdmFudGFnZXMgb3ZlciBORlM6IHN1cHBvcnQgZm9yCisJICBkaXNjb25uZWN0ZWQgb3BlcmF0aW9uIChlLmcuIGZvciBsYXB0b3BzKSwgcmVhZC93cml0ZSBzZXJ2ZXIKKwkgIHJlcGxpY2F0aW9uLCBzZWN1cml0eSBtb2RlbCBmb3IgYXV0aGVudGljYXRpb24gYW5kIGVuY3J5cHRpb24sCisJICBwZXJzaXN0ZW50IGNsaWVudCBjYWNoZXMgYW5kIHdyaXRlIGJhY2sgY2FjaGluZy4KKworCSAgSWYgeW91IHNheSBZIGhlcmUsIHlvdXIgTGludXggYm94IHdpbGwgYmUgYWJsZSB0byBhY3QgYXMgYSBDb2RhCisJICAqY2xpZW50Ki4gIFlvdSB3aWxsIG5lZWQgdXNlciBsZXZlbCBjb2RlIGFzIHdlbGwsIGJvdGggZm9yIHRoZQorCSAgY2xpZW50IGFuZCBzZXJ2ZXIuICBTZXJ2ZXJzIGFyZSBjdXJyZW50bHkgdXNlciBsZXZlbCwgaS5lLiB0aGV5IG5lZWQKKwkgIG5vIGtlcm5lbCBzdXBwb3J0LiAgUGxlYXNlIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvY29kYS50eHQ+IGFuZCBjaGVjayBvdXQgdGhlIENvZGEKKwkgIGhvbWUgcGFnZSA8aHR0cDovL3d3dy5jb2RhLmNzLmNtdS5lZHUvPi4KKworCSAgVG8gY29tcGlsZSB0aGUgY29kYSBjbGllbnQgc3VwcG9ydCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgY29kYS4KKworY29uZmlnIENPREFfRlNfT0xEX0FQSQorCWJvb2wgIlVzZSA5Ni1iaXQgQ29kYSBmaWxlIGlkZW50aWZpZXJzIgorCWRlcGVuZHMgb24gQ09EQV9GUworCWhlbHAKKwkgIEEgbmV3IGtlcm5lbC11c2Vyc3BhY2UgQVBJIGhhZCB0byBiZSBpbnRyb2R1Y2VkIGZvciBDb2RhIHY2LjAKKwkgIHRvIHN1cHBvcnQgbGFyZ2VyIDEyOC1iaXQgZmlsZSBpZGVudGlmaWVycyBhcyBuZWVkZWQgYnkgdGhlCisJICBuZXcgcmVhbG1zIGltcGxlbWVudGF0aW9uLgorCisJICBIb3dldmVyIHRoaXMgbmV3IEFQSSBpcyBub3QgYmFja3dhcmQgY29tcGF0aWJsZSB3aXRoIG9sZGVyCisJICBjbGllbnRzLiBJZiB5b3UgcmVhbGx5IG5lZWQgdG8gcnVuIHRoZSBvbGQgQ29kYSB1c2Vyc3BhY2UKKwkgIGNhY2hlIG1hbmFnZXIgdGhlbiBzYXkgWS4KKwkgIAorCSAgRm9yIG1vc3QgY2FzZXMgeW91IHByb2JhYmx5IHdhbnQgdG8gc2F5IE4uCisKK2NvbmZpZyBBRlNfRlMKKyMgZm9yIGZzL25scy9Db25maWcuaW4KKwl0cmlzdGF0ZSAiQW5kcmV3IEZpbGUgU3lzdGVtIHN1cHBvcnQgKEFGUykgKEV4cGVyaW1lbnRhbCkiCisJZGVwZW5kcyBvbiBJTkVUICYmIEVYUEVSSU1FTlRBTAorCXNlbGVjdCBSWFJQQworCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBnZXQgYW4gZXhwZXJpbWVudGFsIEFuZHJldyBGaWxlIFN5c3RlbQorCSAgZHJpdmVyLiBJdCBjdXJyZW50bHkgb25seSBzdXBwb3J0cyB1bnNlY3VyZWQgcmVhZC1vbmx5IEFGUyBhY2Nlc3MuCisKKwkgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2Fmcy50eHQ+IGZvciBtb3JlIGludG9ybWF0aW9uLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgUlhSUEMKKwl0cmlzdGF0ZQorCitlbmRtZW51CisKK21lbnUgIlBhcnRpdGlvbiBUeXBlcyIKKworc291cmNlICJmcy9wYXJ0aXRpb25zL0tjb25maWciCisKK2VuZG1lbnUKKworc291cmNlICJmcy9ubHMvS2NvbmZpZyIKKworZW5kbWVudQorCmRpZmYgLS1naXQgYS9mcy9LY29uZmlnLmJpbmZtdCBiL2ZzL0tjb25maWcuYmluZm10Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNGMxOWQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9LY29uZmlnLmJpbmZtdApAQCAtMCwwICsxLDEzNCBAQAorY29uZmlnIEJJTkZNVF9FTEYKKwlib29sICJLZXJuZWwgc3VwcG9ydCBmb3IgRUxGIGJpbmFyaWVzIgorCWRlcGVuZHMgb24gTU1VCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgRUxGIChFeGVjdXRhYmxlIGFuZCBMaW5rYWJsZSBGb3JtYXQpIGlzIGEgZm9ybWF0IGZvciBsaWJyYXJpZXMgYW5kCisJICBleGVjdXRhYmxlcyB1c2VkIGFjcm9zcyBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlcyBhbmQgb3BlcmF0aW5nCisJICBzeXN0ZW1zLiBTYXlpbmcgWSBoZXJlIHdpbGwgZW5hYmxlIHlvdXIga2VybmVsIHRvIHJ1biBFTEYgYmluYXJpZXMKKwkgIGFuZCBlbmxhcmdlIGl0IGJ5IGFib3V0IDEzIEtCLiBFTEYgc3VwcG9ydCB1bmRlciBMaW51eCBoYXMgbm93IGFsbAorCSAgYnV0IHJlcGxhY2VkIHRoZSB0cmFkaXRpb25hbCBMaW51eCBhLm91dCBmb3JtYXRzIChRTUFHSUMgYW5kIFpNQUdJQykKKwkgIGJlY2F1c2UgaXQgaXMgcG9ydGFibGUgKHRoaXMgZG9lcyAqbm90KiBtZWFuIHRoYXQgeW91IHdpbGwgYmUgYWJsZQorCSAgdG8gcnVuIGV4ZWN1dGFibGVzIGZyb20gZGlmZmVyZW50IGFyY2hpdGVjdHVyZXMgb3Igb3BlcmF0aW5nIHN5c3RlbXMKKwkgIGhvd2V2ZXIpIGFuZCBtYWtlcyBidWlsZGluZyBydW4tdGltZSBsaWJyYXJpZXMgdmVyeSBlYXN5LiBNYW55IG5ldworCSAgZXhlY3V0YWJsZXMgYXJlIGRpc3RyaWJ1dGVkIHNvbGVseSBpbiBFTEYgZm9ybWF0LiBZb3UgZGVmaW5pdGVseQorCSAgd2FudCB0byBzYXkgWSBoZXJlLgorCisJICBJbmZvcm1hdGlvbiBhYm91dCBFTEYgaXMgY29udGFpbmVkIGluIHRoZSBFTEYgSE9XVE8gYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4uCisKKwkgIElmIHlvdSBmaW5kIHRoYXQgYWZ0ZXIgdXBncmFkaW5nIGZyb20gTGludXgga2VybmVsIDEuMiBhbmQgc2F5aW5nIFkKKwkgIGhlcmUsIHlvdSBzdGlsbCBjYW4ndCBydW4gYW55IEVMRiBiaW5hcmllcyAodGhleSBqdXN0IGNyYXNoKSwgdGhlbgorCSAgeW91J2xsIGhhdmUgdG8gaW5zdGFsbCB0aGUgbmV3ZXN0IEVMRiBydW50aW1lIGxpYnJhcmllcywgaW5jbHVkaW5nCisJICBsZC5zbyAoY2hlY2sgdGhlIGZpbGUgPGZpbGU6RG9jdW1lbnRhdGlvbi9DaGFuZ2VzPiBmb3IgbG9jYXRpb24gYW5kCisJICBsYXRlc3QgdmVyc2lvbikuCisKK2NvbmZpZyBCSU5GTVRfRUxGX0ZEUElDCisJYm9vbCAiS2VybmVsIHN1cHBvcnQgZm9yIEZEUElDIEVMRiBiaW5hcmllcyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZSVgorCWhlbHAKKwkgIEVMRiBGRFBJQyBiaW5hcmllcyBhcmUgYmFzZWQgb24gRUxGLCBidXQgYWxsb3cgdGhlIGluZGl2aWR1YWwgbG9hZAorCSAgc2VnbWVudHMgb2YgYSBiaW5hcnkgdG8gYmUgbG9jYXRlZCBpbiBtZW1vcnkgaW5kZXBlbmRlbnRseSBvZiBlYWNoCisJICBvdGhlci4gVGhpcyBtYWtlcyB0aGlzIGZvcm1hdCBpZGVhbCBmb3IgdXNlIGluIGVudmlyb25tZW50cyB3aGVyZSBubworCSAgTU1VIGlzIGF2YWlsYWJsZSBhcyBpdCBzdGlsbCBwZXJtaXRzIHRleHQgc2VnbWVudHMgdG8gYmUgc2hhcmVkLAorCSAgZXZlbiBpZiBkYXRhIHNlZ21lbnRzIGFyZSBub3QuCisKKwkgIEl0IGlzIGFsc28gcG9zc2libGUgdG8gcnVuIEZEUElDIEVMRiBiaW5hcmllcyBvbiBNTVUgbGludXggYWxzby4KKworY29uZmlnIEJJTkZNVF9GTEFUCisJdHJpc3RhdGUgIktlcm5lbCBzdXBwb3J0IGZvciBmbGF0IGJpbmFyaWVzIgorCWRlcGVuZHMgb24gIU1NVSB8fCBTVVBFUkgKKwloZWxwCisJICBTdXBwb3J0IHVDbGludXggRkxBVCBmb3JtYXQgYmluYXJpZXMuCisKK2NvbmZpZyBCSU5GTVRfWkZMQVQKKwlib29sICJFbmFibGUgWkZMQVQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEJJTkZNVF9GTEFUCisJc2VsZWN0IFpMSUJfSU5GTEFURQorCWhlbHAKKwkgIFN1cHBvcnQgRkxBVCBmb3JtYXQgY29tcHJlc3NlZCBiaW5hcmllcworCitjb25maWcgQklORk1UX1NIQVJFRF9GTEFUCisJYm9vbCAiRW5hYmxlIHNoYXJlZCBGTEFUIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBCSU5GTVRfRkxBVAorCWhlbHAKKwkgIFN1cHBvcnQgRkxBVCBzaGFyZWQgbGlicmFyaWVzCisKK2NvbmZpZyBCSU5GTVRfQU9VVAorCXRyaXN0YXRlICJLZXJuZWwgc3VwcG9ydCBmb3IgYS5vdXQgYW5kIEVDT0ZGIGJpbmFyaWVzIgorCWRlcGVuZHMgb24gKFg4NiAmJiAhWDg2XzY0KSB8fCBBTFBIQSB8fCBBUk0gfHwgTTY4SyB8fCBTUEFSQzMyCisJLS0taGVscC0tLQorCSAgQS5vdXQgKEFzc2VtYmxlci5PVVRwdXQpIGlzIGEgc2V0IG9mIGZvcm1hdHMgZm9yIGxpYnJhcmllcyBhbmQKKwkgIGV4ZWN1dGFibGVzIHVzZWQgaW4gdGhlIGVhcmxpZXN0IHZlcnNpb25zIG9mIFVOSVguICBMaW51eCB1c2VkCisJICB0aGUgYS5vdXQgZm9ybWF0cyBRTUFHSUMgYW5kIFpNQUdJQyB1bnRpbCB0aGV5IHdlcmUgcmVwbGFjZWQKKwkgIHdpdGggdGhlIEVMRiBmb3JtYXQuCisKKwkgIFRoZSBjb252ZXJzaW9uIHRvIEVMRiBzdGFydGVkIGluIDE5OTUuICBUaGlzIG9wdGlvbiBpcyBwcmltYXJpbHkKKwkgIHByb3ZpZGVkIGZvciBoaXN0b3JpY2FsIGludGVyZXN0IGFuZCBmb3IgdGhlIGJlbmVmaXQgb2YgdGhvc2UKKwkgIHdobyBuZWVkIHRvIHJ1biBiaW5hcmllcyBmcm9tIHRoYXQgZXJhLgorCisJICBNb3N0IHBlb3BsZSBzaG91bGQgYW5zd2VyIE4gaGVyZS4gIElmIHlvdSB0aGluayB5b3UgbWF5IGhhdmUKKwkgIG9jY2FzaW9uYWwgdXNlIGZvciB0aGlzIGZvcm1hdCwgZW5hYmxlIG1vZHVsZSBzdXBwb3J0IGFib3ZlCisJICBhbmQgYW5zd2VyIE0gaGVyZSB0byBjb21waWxlIHRoaXMgc3VwcG9ydCBhcyBhIG1vZHVsZSBjYWxsZWQKKwkgIGJpbmZtdF9hb3V0LgorCisJICBJZiBhbnkgY3J1Y2lhbCBjb21wb25lbnRzIG9mIHlvdXIgc3lzdGVtIChzdWNoIGFzIC9zYmluL2luaXQKKwkgIG9yIC9saWIvbGQuc28pIGFyZSBzdGlsbCBpbiBhLm91dCBmb3JtYXQsIHlvdSB3aWxsIGhhdmUgdG8KKwkgIHNheSBZIGhlcmUuCisKK2NvbmZpZyBPU0Y0X0NPTVBBVAorCWJvb2wgIk9TRi8xIHY0IHJlYWR2L3dyaXRldiBjb21wYXRpYmlsaXR5IgorCWRlcGVuZHMgb24gQUxQSEEgJiYgQklORk1UX0FPVVQKKwloZWxwCisJICBTYXkgWSBpZiB5b3UgYXJlIHVzaW5nIE9TRi8xIGJpbmFyaWVzIChsaWtlIE5ldHNjYXBlIGFuZCBBY3JvYmF0KQorCSAgd2l0aCB2NCBzaGFyZWQgbGlicmFyaWVzIGZyZWVseSBhdmFpbGFibGUgZnJvbSBDb21wYXEuIElmIHlvdSdyZQorCSAgZ29pbmcgdG8gdXNlIHNoYXJlZCBsaWJyYXJpZXMgZnJvbSBUcnU2NCB2ZXJzaW9uIDUuMCBvciBsYXRlciwgc2F5IE4uCisKK2NvbmZpZyBCSU5GTVRfRU04NgorCXRyaXN0YXRlICJLZXJuZWwgc3VwcG9ydCBmb3IgTGludXgvSW50ZWwgRUxGIGJpbmFyaWVzIgorCWRlcGVuZHMgb24gQUxQSEEKKwktLS1oZWxwLS0tCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gZXhlY3V0ZSBMaW51eC9JbnRlbCBFTEYKKwkgIGJpbmFyaWVzIGp1c3QgbGlrZSBuYXRpdmUgQWxwaGEgYmluYXJpZXMgb24geW91ciBBbHBoYSBtYWNoaW5lLiBGb3IKKwkgIHRoaXMgdG8gd29yaywgeW91IG5lZWQgdG8gaGF2ZSB0aGUgZW11bGF0b3IgL3Vzci9iaW4vZW04NiBpbiBwbGFjZS4KKworCSAgWW91IGNhbiBnZXQgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBieSBzYXlpbmcgTiBoZXJlIGFuZCBzYXlpbmcgWSB0bworCSAgIktlcm5lbCBzdXBwb3J0IGZvciBNSVNDIGJpbmFyaWVzIi4KKworCSAgWW91IG1heSBhbnN3ZXIgTSB0byBjb21waWxlIHRoZSBlbXVsYXRpb24gc3VwcG9ydCBhcyBhIG1vZHVsZSBhbmQKKwkgIGxhdGVyIGxvYWQgdGhlIG1vZHVsZSB3aGVuIHlvdSB3YW50IHRvIHVzZSBhIExpbnV4L0ludGVsIGJpbmFyeS4gVGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYmluZm10X2VtODYuIElmIHVuc3VyZSwgc2F5IFkuCisKK2NvbmZpZyBCSU5GTVRfU09NCisJdHJpc3RhdGUgIktlcm5lbCBzdXBwb3J0IGZvciBTT00gYmluYXJpZXMiCisJZGVwZW5kcyBvbiBQQVJJU0MgJiYgSFBVWAorCWhlbHAKKwkgIFNPTSBpcyBhIGJpbmFyeSBleGVjdXRhYmxlIGZvcm1hdCBpbmhlcml0ZWQgZnJvbSBIUC9VWC4gIFNheQorCSAgWSBoZXJlIHRvIGJlIGFibGUgdG8gbG9hZCBhbmQgZXhlY3V0ZSBTT00gYmluYXJpZXMgZGlyZWN0bHkuCisKK2NvbmZpZyBCSU5GTVRfTUlTQworCXRyaXN0YXRlICJLZXJuZWwgc3VwcG9ydCBmb3IgTUlTQyBiaW5hcmllcyIKKwktLS1oZWxwLS0tCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgaXQgd2lsbCBiZSBwb3NzaWJsZSB0byBwbHVnIHdyYXBwZXItZHJpdmVuIGJpbmFyeQorCSAgZm9ybWF0cyBpbnRvIHRoZSBrZXJuZWwuIFlvdSB3aWxsIGxpa2UgdGhpcyBlc3BlY2lhbGx5IHdoZW4geW91IHVzZQorCSAgcHJvZ3JhbXMgdGhhdCBuZWVkIGFuIGludGVycHJldGVyIHRvIHJ1biBsaWtlIEphdmEsIFB5dGhvbiwgLk5FVCBvcgorCSAgRW1hY3MtTGlzcC4gSXQncyBhbHNvIHVzZWZ1bCBpZiB5b3Ugb2Z0ZW4gcnVuIERPUyBleGVjdXRhYmxlcyB1bmRlcgorCSAgdGhlIExpbnV4IERPUyBlbXVsYXRvciBET1NFTVUgKHJlYWQgdGhlIERPU0VNVS1IT1dUTywgYXZhaWxhYmxlIGZyb20KKwkgIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4pLiBPbmNlIHlvdSBoYXZlCisJICByZWdpc3RlcmVkIHN1Y2ggYSBiaW5hcnkgY2xhc3Mgd2l0aCB0aGUga2VybmVsLCB5b3UgY2FuIHN0YXJ0IG9uZSBvZgorCSAgdGhvc2UgcHJvZ3JhbXMgc2ltcGx5IGJ5IHR5cGluZyBpbiBpdHMgbmFtZSBhdCBhIHNoZWxsIHByb21wdDsgTGludXgKKwkgIHdpbGwgYXV0b21hdGljYWxseSBmZWVkIGl0IHRvIHRoZSBjb3JyZWN0IGludGVycHJldGVyLgorCisJICBZb3UgY2FuIGRvIG90aGVyIG5pY2UgdGhpbmdzLCB0b28uIFJlYWQgdGhlIGZpbGUKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vYmluZm10X21pc2MudHh0PiB0byBsZWFybiBob3cgdG8gdXNlIHRoaXMKKwkgIGZlYXR1cmUsIDxmaWxlOkRvY3VtZW50YXRpb24vamF2YS50eHQ+IGZvciBpbmZvcm1hdGlvbiBhYm91dCBob3cKKwkgIHRvIGluY2x1ZGUgSmF2YSBzdXBwb3J0LiBhbmQgPGZpbGU6RG9jdW1lbnRhdGlvbi9tb25vLnR4dD4gZm9yCisgICAgICAgICAgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIGluY2x1ZGUgTW9uby1iYXNlZCAuTkVUIHN1cHBvcnQuCisKKyAgICAgICAgICBUbyB1c2UgYmluZm10X21pc2MsIHlvdSB3aWxsIG5lZWQgdG8gbW91bnQgaXQ6CisJCW1vdW50IGJpbmZtdF9taXNjIC10IGJpbmZtdF9taXNjIC9wcm9jL3N5cy9mcy9iaW5mbXRfbWlzYworCisJICBZb3UgbWF5IHNheSBNIGhlcmUgZm9yIG1vZHVsZSBzdXBwb3J0IGFuZCBsYXRlciBsb2FkIHRoZSBtb2R1bGUgd2hlbgorCSAgeW91IGhhdmUgdXNlIGZvciBpdDsgdGhlIG1vZHVsZSBpcyBjYWxsZWQgYmluZm10X21pc2MuIElmIHlvdQorCSAgZG9uJ3Qga25vdyB3aGF0IHRvIGFuc3dlciBhdCB0aGlzIHBvaW50LCBzYXkgWS4KZGlmZiAtLWdpdCBhL2ZzL01ha2VmaWxlIGIvZnMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQzZjJiYwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL01ha2VmaWxlCkBAIC0wLDAgKzEsOTcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBmaWxlc3lzdGVtcy4KKyMKKyMgMTQgU2VwIDIwMDAsIENocmlzdG9waCBIZWxsd2lnIDxoY2hAaW5mcmFkZWFkLm9yZz4KKyMgUmV3cml0dGVuIHRvIHVzZSBsaXN0cyBpbnN0ZWFkIG9mIGlmLXN0YXRlbWVudHMuCisjIAorCitvYmoteSA6PQlvcGVuLm8gcmVhZF93cml0ZS5vIGZpbGVfdGFibGUubyBidWZmZXIubyAgYmlvLm8gc3VwZXIubyBcCisJCWJsb2NrX2Rldi5vIGNoYXJfZGV2Lm8gc3RhdC5vIGV4ZWMubyBwaXBlLm8gbmFtZWkubyBmY250bC5vIFwKKwkJaW9jdGwubyByZWFkZGlyLm8gc2VsZWN0Lm8gZmlmby5vIGxvY2tzLm8gZGNhY2hlLm8gaW5vZGUubyBcCisJCWF0dHIubyBiYWRfaW5vZGUubyBmaWxlLm8gZmlsZXN5c3RlbXMubyBuYW1lc3BhY2UubyBhaW8ubyBcCisJCXNlcV9maWxlLm8geGF0dHIubyBsaWJmcy5vIGZzLXdyaXRlYmFjay5vIG1wYWdlLm8gZGlyZWN0LWlvLm8gXAorCitvYmotJChDT05GSUdfRVBPTEwpCQkrPSBldmVudHBvbGwubworb2JqLSQoQ09ORklHX0NPTVBBVCkJCSs9IGNvbXBhdC5vCisKK25mc2QtJChDT05GSUdfTkZTRCkJCTo9IG5mc2N0bC5vCitvYmoteQkJCQkrPSAkKG5mc2QteSkgJChuZnNkLW0pCisKK29iai0kKENPTkZJR19CSU5GTVRfQU9VVCkJKz0gYmluZm10X2FvdXQubworb2JqLSQoQ09ORklHX0JJTkZNVF9FTTg2KQkrPSBiaW5mbXRfZW04Ni5vCitvYmotJChDT05GSUdfQklORk1UX01JU0MpCSs9IGJpbmZtdF9taXNjLm8KKworIyBiaW5mbXRfc2NyaXB0IGlzIGFsd2F5cyB0aGVyZQorb2JqLXkJCQkJKz0gYmluZm10X3NjcmlwdC5vCisKK29iai0kKENPTkZJR19CSU5GTVRfRUxGKQkrPSBiaW5mbXRfZWxmLm8KK29iai0kKENPTkZJR19CSU5GTVRfRUxGX0ZEUElDKQkrPSBiaW5mbXRfZWxmX2ZkcGljLm8KK29iai0kKENPTkZJR19CSU5GTVRfU09NKQkrPSBiaW5mbXRfc29tLm8KK29iai0kKENPTkZJR19CSU5GTVRfRkxBVCkJKz0gYmluZm10X2ZsYXQubworCitvYmotJChDT05GSUdfRlNfTUJDQUNIRSkJKz0gbWJjYWNoZS5vCitvYmotJChDT05GSUdfRlNfUE9TSVhfQUNMKQkrPSBwb3NpeF9hY2wubyB4YXR0cl9hY2wubworCitvYmotJChDT05GSUdfUVVPVEEpCQkrPSBkcXVvdC5vCitvYmotJChDT05GSUdfUUZNVF9WMSkJCSs9IHF1b3RhX3YxLm8KK29iai0kKENPTkZJR19RRk1UX1YyKQkJKz0gcXVvdGFfdjIubworb2JqLSQoQ09ORklHX1FVT1RBQ1RMKQkJKz0gcXVvdGEubworCitvYmotJChDT05GSUdfRE5PVElGWSkJCSs9IGRub3RpZnkubworCitvYmotJChDT05GSUdfUFJPQ19GUykJCSs9IHByb2MvCitvYmoteQkJCQkrPSBwYXJ0aXRpb25zLworb2JqLSQoQ09ORklHX1NZU0ZTKQkJKz0gc3lzZnMvCitvYmoteQkJCQkrPSBkZXZwdHMvCisKK29iai0kKENPTkZJR19QUk9GSUxJTkcpCQkrPSBkY29va2llcy5vCisgCisjIERvIG5vdCBhZGQgYW55IGZpbGVzeXN0ZW1zIGJlZm9yZSB0aGlzIGxpbmUKK29iai0kKENPTkZJR19SRUlTRVJGU19GUykJKz0gcmVpc2VyZnMvCitvYmotJChDT05GSUdfRVhUM19GUykJCSs9IGV4dDMvICMgQmVmb3JlIGV4dDIgc28gcm9vdCBmcyBjYW4gYmUgZXh0Mworb2JqLSQoQ09ORklHX0pCRCkJCSs9IGpiZC8KK29iai0kKENPTkZJR19FWFQyX0ZTKQkJKz0gZXh0Mi8KK29iai0kKENPTkZJR19DUkFNRlMpCQkrPSBjcmFtZnMvCitvYmotJChDT05GSUdfUkFNRlMpCQkrPSByYW1mcy8KK29iai0kKENPTkZJR19IVUdFVExCRlMpCQkrPSBodWdldGxiZnMvCitvYmotJChDT05GSUdfQ09EQV9GUykJCSs9IGNvZGEvCitvYmotJChDT05GSUdfTUlOSVhfRlMpCQkrPSBtaW5peC8KK29iai0kKENPTkZJR19GQVRfRlMpCQkrPSBmYXQvCitvYmotJChDT05GSUdfTVNET1NfRlMpCQkrPSBtc2Rvcy8KK29iai0kKENPTkZJR19WRkFUX0ZTKQkJKz0gdmZhdC8KK29iai0kKENPTkZJR19CRlNfRlMpCQkrPSBiZnMvCitvYmotJChDT05GSUdfSVNPOTY2MF9GUykJKz0gaXNvZnMvCitvYmotJChDT05GSUdfREVWRlNfRlMpCQkrPSBkZXZmcy8KK29iai0kKENPTkZJR19IRlNQTFVTX0ZTKQkrPSBoZnNwbHVzLyAjIEJlZm9yZSBoZnMgdG8gZmluZCB3cmFwcGVkIEhGUysKK29iai0kKENPTkZJR19IRlNfRlMpCQkrPSBoZnMvCitvYmotJChDT05GSUdfVlhGU19GUykJCSs9IGZyZWV2eGZzLworb2JqLSQoQ09ORklHX05GU19GUykJCSs9IG5mcy8KK29iai0kKENPTkZJR19FWFBPUlRGUykJCSs9IGV4cG9ydGZzLworb2JqLSQoQ09ORklHX05GU0QpCQkrPSBuZnNkLworb2JqLSQoQ09ORklHX0xPQ0tEKQkJKz0gbG9ja2QvCitvYmotJChDT05GSUdfTkxTKQkJKz0gbmxzLworb2JqLSQoQ09ORklHX1NZU1ZfRlMpCQkrPSBzeXN2Lworb2JqLSQoQ09ORklHX1NNQl9GUykJCSs9IHNtYmZzLworb2JqLSQoQ09ORklHX0NJRlMpCQkrPSBjaWZzLworb2JqLSQoQ09ORklHX05DUF9GUykJCSs9IG5jcGZzLworb2JqLSQoQ09ORklHX0hQRlNfRlMpCQkrPSBocGZzLworb2JqLSQoQ09ORklHX05URlNfRlMpCQkrPSBudGZzLworb2JqLSQoQ09ORklHX1VGU19GUykJCSs9IHVmcy8KK29iai0kKENPTkZJR19FRlNfRlMpCQkrPSBlZnMvCitvYmotJChDT05GSUdfSkZGU19GUykJCSs9IGpmZnMvCitvYmotJChDT05GSUdfSkZGUzJfRlMpCQkrPSBqZmZzMi8KK29iai0kKENPTkZJR19BRkZTX0ZTKQkJKz0gYWZmcy8KK29iai0kKENPTkZJR19ST01GU19GUykJCSs9IHJvbWZzLworb2JqLSQoQ09ORklHX1FOWDRGU19GUykJCSs9IHFueDQvCitvYmotJChDT05GSUdfQVVUT0ZTX0ZTKQkJKz0gYXV0b2ZzLworb2JqLSQoQ09ORklHX0FVVE9GUzRfRlMpCSs9IGF1dG9mczQvCitvYmotJChDT05GSUdfQURGU19GUykJCSs9IGFkZnMvCitvYmotJChDT05GSUdfVURGX0ZTKQkJKz0gdWRmLworb2JqLSQoQ09ORklHX1NVTl9PUEVOUFJPTUZTKQkrPSBvcGVucHJvbWZzLworb2JqLSQoQ09ORklHX0pGU19GUykJCSs9IGpmcy8KK29iai0kKENPTkZJR19YRlNfRlMpCQkrPSB4ZnMvCitvYmotJChDT05GSUdfQUZTX0ZTKQkJKz0gYWZzLworb2JqLSQoQ09ORklHX0JFRlNfRlMpCQkrPSBiZWZzLworb2JqLSQoQ09ORklHX0hPU1RGUykJCSs9IGhvc3Rmcy8KK29iai0kKENPTkZJR19IUFBGUykJCSs9IGhwcGZzLworb2JqLSQoQ09ORklHX0RFQlVHX0ZTKQkJKz0gZGVidWdmcy8KZGlmZiAtLWdpdCBhL2ZzL2FkZnMvTWFrZWZpbGUgYi9mcy9hZGZzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMmQ3MWEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZGZzL01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGFkZnMgZmlsZXN5c3RlbSByb3V0aW5lcy4KKyMKKworb2JqLSQoQ09ORklHX0FERlNfRlMpICs9IGFkZnMubworCithZGZzLW9ianMgOj0gZGlyLm8gZGlyX2YubyBkaXJfZnBsdXMubyBmaWxlLm8gaW5vZGUubyBtYXAubyBzdXBlci5vCmRpZmYgLS1naXQgYS9mcy9hZGZzL2FkZnMuaCBiL2ZzL2FkZnMvYWRmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZjVkZjkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZGZzL2FkZnMuaApAQCAtMCwwICsxLDEyNyBAQAorLyogSW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzIGZvciBBREZTICovCisKKyNkZWZpbmUgQURGU19GUkVFX0ZSQUcJCSAwCisjZGVmaW5lIEFERlNfQkFEX0ZSQUcJCSAxCisjZGVmaW5lIEFERlNfUk9PVF9GUkFHCQkgMgorCisjZGVmaW5lIEFERlNfTkRBX09XTkVSX1JFQUQJKDEgPDwgMCkKKyNkZWZpbmUgQURGU19OREFfT1dORVJfV1JJVEUJKDEgPDwgMSkKKyNkZWZpbmUgQURGU19OREFfTE9DS0VECQkoMSA8PCAyKQorI2RlZmluZSBBREZTX05EQV9ESVJFQ1RPUlkJKDEgPDwgMykKKyNkZWZpbmUgQURGU19OREFfRVhFQ1VURQkoMSA8PCA0KQorI2RlZmluZSBBREZTX05EQV9QVUJMSUNfUkVBRAkoMSA8PCA1KQorI2RlZmluZSBBREZTX05EQV9QVUJMSUNfV1JJVEUJKDEgPDwgNikKKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlICJkaXJfZi5oIgorCitzdHJ1Y3QgYnVmZmVyX2hlYWQ7CisKKy8qCisgKiBEaXJlY3RvcnkgaGFuZGxpbmcKKyAqLworc3RydWN0IGFkZnNfZGlyIHsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sJKnNiOworCisJaW50CQkJbnJfYnVmZmVyczsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoWzRdOworCXVuc2lnbmVkIGludAkJcG9zOworCXVuc2lnbmVkIGludAkJcGFyZW50X2lkOworCisJc3RydWN0IGFkZnNfZGlyaGVhZGVyCWRpcmhlYWQ7CisJdW5pb24gIGFkZnNfZGlydGFpbAlkaXJ0YWlsOworfTsKKworLyoKKyAqIFRoaXMgaXMgdGhlIG92ZXJhbGwgbWF4aW11bSBuYW1lIGxlbmd0aAorICovCisjZGVmaW5lIEFERlNfTUFYX05BTUVfTEVOCTI1Ngorc3RydWN0IG9iamVjdF9pbmZvIHsKKwlfX3UzMgkJcGFyZW50X2lkOwkJLyogcGFyZW50IG9iamVjdCBpZAkqLworCV9fdTMyCQlmaWxlX2lkOwkJLyogb2JqZWN0IGlkCQkqLworCV9fdTMyCQlsb2FkYWRkcjsJCS8qIGxvYWQgYWRkcmVzcwkJKi8KKwlfX3UzMgkJZXhlY2FkZHI7CQkvKiBleGVjdXRpb24gYWRkcmVzcwkqLworCV9fdTMyCQlzaXplOwkJCS8qIHNpemUJCQkqLworCV9fdTgJCWF0dHI7CQkJLyogUklTQyBPUyBhdHRyaWJ1dGVzCSovCisJdW5zaWduZWQgY2hhcgluYW1lX2xlbjsJCS8qIG5hbWUgbGVuZ3RoCQkqLworCWNoYXIJCW5hbWVbQURGU19NQVhfTkFNRV9MRU5dOy8qIGZpbGUgbmFtZQkJKi8KK307CisKK3N0cnVjdCBhZGZzX2Rpcl9vcHMgeworCWludAkoKnJlYWQpKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGludCBpZCwgdW5zaWduZWQgaW50IHN6LCBzdHJ1Y3QgYWRmc19kaXIgKmRpcik7CisJaW50CSgqc2V0cG9zKShzdHJ1Y3QgYWRmc19kaXIgKmRpciwgdW5zaWduZWQgaW50IGZwb3MpOworCWludAkoKmdldG5leHQpKHN0cnVjdCBhZGZzX2RpciAqZGlyLCBzdHJ1Y3Qgb2JqZWN0X2luZm8gKm9iaik7CisJaW50CSgqdXBkYXRlKShzdHJ1Y3QgYWRmc19kaXIgKmRpciwgc3RydWN0IG9iamVjdF9pbmZvICpvYmopOworCWludAkoKmNyZWF0ZSkoc3RydWN0IGFkZnNfZGlyICpkaXIsIHN0cnVjdCBvYmplY3RfaW5mbyAqb2JqKTsKKwlpbnQJKCpyZW1vdmUpKHN0cnVjdCBhZGZzX2RpciAqZGlyLCBzdHJ1Y3Qgb2JqZWN0X2luZm8gKm9iaik7CisJdm9pZAkoKmZyZWUpKHN0cnVjdCBhZGZzX2RpciAqZGlyKTsKK307CisKK3N0cnVjdCBhZGZzX2Rpc2NtYXAgeworCXN0cnVjdCBidWZmZXJfaGVhZAkqZG1fYmg7CisJX191MzIJCQlkbV9zdGFydGJsazsKKwl1bnNpZ25lZCBpbnQJCWRtX3N0YXJ0Yml0OworCXVuc2lnbmVkIGludAkJZG1fZW5kYml0OworfTsKKworLyogSW5vZGUgc3R1ZmYgKi8KK3N0cnVjdCBpbm9kZSAqYWRmc19pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBvYmplY3RfaW5mbyAqb2JqKTsKK2ludCBhZGZzX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsaW50IHVudXNlZCk7CitpbnQgYWRmc19ub3RpZnlfY2hhbmdlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICphdHRyKTsKKworLyogbWFwLmMgKi8KK2V4dGVybiBpbnQgYWRmc19tYXBfbG9va3VwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGludCBmcmFnX2lkLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgYWRmc19tYXBfZnJlZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKKworLyogTWlzYyAqLwordm9pZCBfX2FkZnNfZXJyb3Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqZnVuY3Rpb24sCisJCSAgY29uc3QgY2hhciAqZm10LCAuLi4pOworI2RlZmluZSBhZGZzX2Vycm9yKHNiLCBmbXQuLi4pIF9fYWRmc19lcnJvcihzYiwgX19GVU5DVElPTl9fLCBmbXQpCisKKy8qIHN1cGVyLmMgKi8KKworLyoKKyAqIElub2RlcyBhbmQgZmlsZSBvcGVyYXRpb25zCisgKi8KKworLyogZGlyXyouYyAqLworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGFkZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhZGZzX2Rpcl9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBhZGZzX2RlbnRyeV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBhZGZzX2Rpcl9vcHMgYWRmc19mX2Rpcl9vcHM7CitleHRlcm4gc3RydWN0IGFkZnNfZGlyX29wcyBhZGZzX2ZwbHVzX2Rpcl9vcHM7CisKK2V4dGVybiBpbnQgYWRmc19kaXJfdXBkYXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBvYmplY3RfaW5mbyAqb2JqKTsKKworLyogZmlsZS5jICovCitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgYWRmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhZGZzX2ZpbGVfb3BlcmF0aW9uczsKKworZXh0ZXJuIGlubGluZSBfX3UzMiBzaWduZWRfYXNsKF9fdTMyIHZhbCwgc2lnbmVkIGludCBzaGlmdCkKK3sKKwlpZiAoc2hpZnQgPj0gMCkKKwkJdmFsIDw8PSBzaGlmdDsKKwllbHNlCisJCXZhbCA+Pj0gLXNoaWZ0OworCXJldHVybiB2YWw7Cit9CisKKy8qCisgKiBDYWxjdWxhdGUgdGhlIGFkZHJlc3Mgb2YgYSBibG9jayBpbiBhbiBvYmplY3QgZ2l2ZW4gdGhlIGJsb2NrIG9mZnNldAorICogYW5kIHRoZSBvYmplY3QgaWRlbnRpdHkuCisgKgorICogVGhlIHJvb3QgZGlyZWN0b3J5IElEIHNob3VsZCBhbHdheXMgYmUgbG9va2VkIHVwIGluIHRoZSBtYXAgWzMuNF0KKyAqLworZXh0ZXJuIGlubGluZSBpbnQKK19fYWRmc19ibG9ja19tYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IG9iamVjdF9pZCwKKwkJIHVuc2lnbmVkIGludCBibG9jaykKK3sKKwlpZiAob2JqZWN0X2lkICYgMjU1KSB7CisJCXVuc2lnbmVkIGludCBvZmY7CisKKwkJb2ZmID0gKG9iamVjdF9pZCAmIDI1NSkgLSAxOworCQlibG9jayArPSBvZmYgPDwgQURGU19TQihzYiktPnNfbG9nMnNoYXJlc2l6ZTsKKwl9CisKKwlyZXR1cm4gYWRmc19tYXBfbG9va3VwKHNiLCBvYmplY3RfaWQgPj4gOCwgYmxvY2spOworfQpkaWZmIC0tZ2l0IGEvZnMvYWRmcy9kaXIuYyBiL2ZzL2FkZnMvZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI0YzNhMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2FkZnMvZGlyLmMKQEAgLTAsMCArMSwzMDIgQEAKKy8qCisgKiAgbGludXgvZnMvYWRmcy9kaXIuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMCBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBDb21tb24gZGlyZWN0b3J5IGhhbmRsaW5nIGZvciBBREZTCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYWRmc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CQkvKiBmb3IgZmlsZV9mc3luYygpICovCisKKyNpbmNsdWRlICJhZGZzLmgiCisKKy8qCisgKiBGb3IgZnV0dXJlLiAgVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgcGVyLWRpcmVjdG9yeS4KKyAqLworc3RhdGljIERFRklORV9SV0xPQ0soYWRmc19kaXJfbG9jayk7CisKK3N0YXRpYyBpbnQKK2FkZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBhZGZzX2Rpcl9vcHMgKm9wcyA9IEFERlNfU0Ioc2IpLT5zX2RpcjsKKwlzdHJ1Y3Qgb2JqZWN0X2luZm8gb2JqOworCXN0cnVjdCBhZGZzX2RpciBkaXI7CisJaW50IHJldCA9IDA7CisKKwlsb2NrX2tlcm5lbCgpOwkKKworCWlmIChmaWxwLT5mX3BvcyA+PiAzMikKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBvcHMtPnJlYWQoc2IsIGlub2RlLT5pX2lubywgaW5vZGUtPmlfc2l6ZSwgJmRpcik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlzd2l0Y2ggKCh1bnNpZ25lZCBsb25nKWZpbHAtPmZfcG9zKSB7CisJY2FzZSAwOgorCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuIiwgMSwgMCwgaW5vZGUtPmlfaW5vLCBEVF9ESVIpIDwgMCkKKwkJCWdvdG8gZnJlZV9vdXQ7CisJCWZpbHAtPmZfcG9zICs9IDE7CisKKwljYXNlIDE6CisJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4uIiwgMiwgMSwgZGlyLnBhcmVudF9pZCwgRFRfRElSKSA8IDApCisJCQlnb3RvIGZyZWVfb3V0OworCQlmaWxwLT5mX3BvcyArPSAxOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmVhZF9sb2NrKCZhZGZzX2Rpcl9sb2NrKTsKKworCXJldCA9IG9wcy0+c2V0cG9zKCZkaXIsIGZpbHAtPmZfcG9zIC0gMik7CisJaWYgKHJldCkKKwkJZ290byB1bmxvY2tfb3V0OworCXdoaWxlIChvcHMtPmdldG5leHQoJmRpciwgJm9iaikgPT0gMCkgeworCQlpZiAoZmlsbGRpcihkaXJlbnQsIG9iai5uYW1lLCBvYmoubmFtZV9sZW4sCisJCQkgICAgZmlscC0+Zl9wb3MsIG9iai5maWxlX2lkLCBEVF9VTktOT1dOKSA8IDApCisJCQlnb3RvIHVubG9ja19vdXQ7CisJCWZpbHAtPmZfcG9zICs9IDE7CisJfQorCit1bmxvY2tfb3V0OgorCXJlYWRfdW5sb2NrKCZhZGZzX2Rpcl9sb2NrKTsKKworZnJlZV9vdXQ6CisJb3BzLT5mcmVlKCZkaXIpOworCitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXQ7Cit9CisKK2ludAorYWRmc19kaXJfdXBkYXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBvYmplY3RfaW5mbyAqb2JqKQoreworCWludCByZXQgPSAtRUlOVkFMOworI2lmZGVmIENPTkZJR19BREZTX0ZTX1JXCisJc3RydWN0IGFkZnNfZGlyX29wcyAqb3BzID0gQURGU19TQihzYiktPnNfZGlyOworCXN0cnVjdCBhZGZzX2RpciBkaXI7CisKKwlwcmludGsoS0VSTl9JTkZPICJhZGZzX2Rpcl91cGRhdGU6IG9iamVjdCAlMDZYIGluIGRpciAlMDZYXG4iLAorCQkgb2JqLT5maWxlX2lkLCBvYmotPnBhcmVudF9pZCk7CisKKwlpZiAoIW9wcy0+dXBkYXRlKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG9wcy0+cmVhZChzYiwgb2JqLT5wYXJlbnRfaWQsIDAsICZkaXIpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJd3JpdGVfbG9jaygmYWRmc19kaXJfbG9jayk7CisJcmV0ID0gb3BzLT51cGRhdGUoJmRpciwgb2JqKTsKKwl3cml0ZV91bmxvY2soJmFkZnNfZGlyX2xvY2spOworCisJb3BzLT5mcmVlKCZkaXIpOworb3V0OgorI2VuZGlmCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorYWRmc19tYXRjaChzdHJ1Y3QgcXN0ciAqbmFtZSwgc3RydWN0IG9iamVjdF9pbmZvICpvYmopCit7CisJaW50IGk7CisKKwlpZiAobmFtZS0+bGVuICE9IG9iai0+bmFtZV9sZW4pCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IG5hbWUtPmxlbjsgaSsrKSB7CisJCWNoYXIgYzEsIGMyOworCisJCWMxID0gbmFtZS0+bmFtZVtpXTsKKwkJYzIgPSBvYmotPm5hbWVbaV07CisKKwkJaWYgKGMxID49ICdBJyAmJiBjMSA8PSAnWicpCisJCQljMSArPSAnYScgLSAnQSc7CisJCWlmIChjMiA+PSAnQScgJiYgYzIgPD0gJ1onKQorCQkJYzIgKz0gJ2EnIC0gJ0EnOworCisJCWlmIChjMSAhPSBjMikKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludAorYWRmc19kaXJfbG9va3VwX2J5bmFtZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcXN0ciAqbmFtZSwgc3RydWN0IG9iamVjdF9pbmZvICpvYmopCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBhZGZzX2Rpcl9vcHMgKm9wcyA9IEFERlNfU0Ioc2IpLT5zX2RpcjsKKwlzdHJ1Y3QgYWRmc19kaXIgZGlyOworCWludCByZXQ7CisKKwlyZXQgPSBvcHMtPnJlYWQoc2IsIGlub2RlLT5pX2lubywgaW5vZGUtPmlfc2l6ZSwgJmRpcik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlpZiAoQURGU19JKGlub2RlKS0+cGFyZW50X2lkICE9IGRpci5wYXJlbnRfaWQpIHsKKwkJYWRmc19lcnJvcihzYiwgInBhcmVudCBkaXJlY3RvcnkgY2hhbmdlZCB1bmRlciBtZSEgKCVseCBidXQgZ290ICVseClcbiIsCisJCQkgICBBREZTX0koaW5vZGUpLT5wYXJlbnRfaWQsIGRpci5wYXJlbnRfaWQpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIGZyZWVfb3V0OworCX0KKworCW9iai0+cGFyZW50X2lkID0gaW5vZGUtPmlfaW5vOworCisJLyoKKwkgKiAnLicgaXMgaGFuZGxlZCBieSByZXNlcnZlZF9sb29rdXAoKSBpbiBmcy9uYW1laS5jCisJICovCisJaWYgKG5hbWUtPmxlbiA9PSAyICYmIG5hbWUtPm5hbWVbMF0gPT0gJy4nICYmIG5hbWUtPm5hbWVbMV0gPT0gJy4nKSB7CisJCS8qCisJCSAqIEN1cnJlbnRseSB1bmFibGUgdG8gZmlsbCBpbiB0aGUgcmVzdCBvZiAnb2JqJywKKwkJICogYnV0IHRoaXMgaXMgYmV0dGVyIHRoYW4gbm90aGluZy4gIFdlIG5lZWQgdG8KKwkJICogYXNjZW5kIG9uZSBsZXZlbCB0byBmaW5kIGl0J3MgcGFyZW50LgorCQkgKi8KKwkJb2JqLT5uYW1lX2xlbiA9IDA7CisJCW9iai0+ZmlsZV9pZCAgPSBvYmotPnBhcmVudF9pZDsKKwkJZ290byBmcmVlX291dDsKKwl9CisKKwlyZWFkX2xvY2soJmFkZnNfZGlyX2xvY2spOworCisJcmV0ID0gb3BzLT5zZXRwb3MoJmRpciwgMCk7CisJaWYgKHJldCkKKwkJZ290byB1bmxvY2tfb3V0OworCisJcmV0ID0gLUVOT0VOVDsKKwl3aGlsZSAob3BzLT5nZXRuZXh0KCZkaXIsIG9iaikgPT0gMCkgeworCQlpZiAoYWRmc19tYXRjaChuYW1lLCBvYmopKSB7CisJCQlyZXQgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisKK3VubG9ja19vdXQ6CisJcmVhZF91bmxvY2soJmFkZnNfZGlyX2xvY2spOworCitmcmVlX291dDoKKwlvcHMtPmZyZWUoJmRpcik7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhZGZzX2Rpcl9vcGVyYXRpb25zID0geworCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIJPSBhZGZzX3JlYWRkaXIsCisJLmZzeW5jCQk9IGZpbGVfZnN5bmMsCit9OworCitzdGF0aWMgaW50CithZGZzX2hhc2goc3RydWN0IGRlbnRyeSAqcGFyZW50LCBzdHJ1Y3QgcXN0ciAqcXN0cikKK3sKKwljb25zdCB1bnNpZ25lZCBpbnQgbmFtZV9sZW4gPSBBREZTX1NCKHBhcmVudC0+ZF9zYiktPnNfbmFtZWxlbjsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lOworCXVuc2lnbmVkIGxvbmcgaGFzaDsKKwlpbnQgaTsKKworCWlmIChxc3RyLT5sZW4gPCBuYW1lX2xlbikKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIFRydW5jYXRlIHRoZSBuYW1lIGluIHBsYWNlLCBhdm9pZHMKKwkgKiBoYXZpbmcgdG8gZGVmaW5lIGEgY29tcGFyZSBmdW5jdGlvbi4KKwkgKi8KKwlxc3RyLT5sZW4gPSBpID0gbmFtZV9sZW47CisJbmFtZSA9IHFzdHItPm5hbWU7CisJaGFzaCA9IGluaXRfbmFtZV9oYXNoKCk7CisJd2hpbGUgKGktLSkgeworCQljaGFyIGM7CisKKwkJYyA9ICpuYW1lKys7CisJCWlmIChjID49ICdBJyAmJiBjIDw9ICdaJykKKwkJCWMgKz0gJ2EnIC0gJ0EnOworCisJCWhhc2ggPSBwYXJ0aWFsX25hbWVfaGFzaChjLCBoYXNoKTsKKwl9CisJcXN0ci0+aGFzaCA9IGVuZF9uYW1lX2hhc2goaGFzaCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENvbXBhcmUgdHdvIG5hbWVzLCB0YWtpbmcgbm90ZSBvZiB0aGUgbmFtZSBsZW5ndGgKKyAqIHJlcXVpcmVtZW50cyBvZiB0aGUgdW5kZXJseWluZyBmaWxlc3lzdGVtLgorICovCitzdGF0aWMgaW50CithZGZzX2NvbXBhcmUoc3RydWN0IGRlbnRyeSAqcGFyZW50LCBzdHJ1Y3QgcXN0ciAqZW50cnksIHN0cnVjdCBxc3RyICpuYW1lKQoreworCWludCBpOworCisJaWYgKGVudHJ5LT5sZW4gIT0gbmFtZS0+bGVuKQorCQlyZXR1cm4gMTsKKworCWZvciAoaSA9IDA7IGkgPCBuYW1lLT5sZW47IGkrKykgeworCQljaGFyIGEsIGI7CisKKwkJYSA9IGVudHJ5LT5uYW1lW2ldOworCQliID0gbmFtZS0+bmFtZVtpXTsKKworCQlpZiAoYSA+PSAnQScgJiYgYSA8PSAnWicpCisJCQlhICs9ICdhJyAtICdBJzsKKwkJaWYgKGIgPj0gJ0EnICYmIGIgPD0gJ1onKQorCQkJYiArPSAnYScgLSAnQSc7CisKKwkJaWYgKGEgIT0gYikKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGFkZnNfZGVudHJ5X29wZXJhdGlvbnMgPSB7CisJLmRfaGFzaAkJPSBhZGZzX2hhc2gsCisJLmRfY29tcGFyZQk9IGFkZnNfY29tcGFyZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICoKK2FkZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOworCXN0cnVjdCBvYmplY3RfaW5mbyBvYmo7CisJaW50IGVycm9yOworCisJZGVudHJ5LT5kX29wID0gJmFkZnNfZGVudHJ5X29wZXJhdGlvbnM7CQorCWxvY2tfa2VybmVsKCk7CisJZXJyb3IgPSBhZGZzX2Rpcl9sb29rdXBfYnluYW1lKGRpciwgJmRlbnRyeS0+ZF9uYW1lLCAmb2JqKTsKKwlpZiAoZXJyb3IgPT0gMCkgeworCQllcnJvciA9IC1FQUNDRVM7CisJCS8qCisJCSAqIFRoaXMgb25seSByZXR1cm5zIE5VTEwgaWYgZ2V0X2VtcHR5X2lub2RlCisJCSAqIGZhaWxzLgorCQkgKi8KKwkJaW5vZGUgPSBhZGZzX2lnZXQoZGlyLT5pX3NiLCAmb2JqKTsKKwkJaWYgKGlub2RlKQorCQkJZXJyb3IgPSAwOworCX0KKwl1bmxvY2tfa2VybmVsKCk7CisJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CisJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOworfQorCisvKgorICogZGlyZWN0b3JpZXMgY2FuIGhhbmRsZSBtb3N0IG9wZXJhdGlvbnMuLi4KKyAqLworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgYWRmc19kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkubG9va3VwCQk9IGFkZnNfbG9va3VwLAorCS5zZXRhdHRyCT0gYWRmc19ub3RpZnlfY2hhbmdlLAorfTsKZGlmZiAtLWdpdCBhL2ZzL2FkZnMvZGlyX2YuYyBiL2ZzL2FkZnMvZGlyX2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmZjODYyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWRmcy9kaXJfZi5jCkBAIC0wLDAgKzEsNDYwIEBACisvKgorICogIGxpbnV4L2ZzL2FkZnMvZGlyX2YuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ny0xOTk5IFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIEUgYW5kIEYgZm9ybWF0IGRpcmVjdG9yeSBoYW5kbGluZworICovCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2FkZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworI2luY2x1ZGUgImFkZnMuaCIKKyNpbmNsdWRlICJkaXJfZi5oIgorCitzdGF0aWMgdm9pZCBhZGZzX2ZfZnJlZShzdHJ1Y3QgYWRmc19kaXIgKmRpcik7CisKKy8qCisgKiBSZWFkIGFuICh1bmFsaWduZWQpIHZhbHVlIG9mIGxlbmd0aCAxLi40IGJ5dGVzCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGFkZnNfcmVhZHZhbCh1bnNpZ25lZCBjaGFyICpwLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGludCB2YWwgPSAwOworCisJc3dpdGNoIChsZW4pIHsKKwljYXNlIDQ6CQl2YWwgfD0gcFszXSA8PCAyNDsKKwljYXNlIDM6CQl2YWwgfD0gcFsyXSA8PCAxNjsKKwljYXNlIDI6CQl2YWwgfD0gcFsxXSA8PCA4OworCWRlZmF1bHQ6CXZhbCB8PSBwWzBdOworCX0KKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWRmc193cml0ZXZhbCh1bnNpZ25lZCBjaGFyICpwLCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCXN3aXRjaCAobGVuKSB7CisJY2FzZSA0OgkJcFszXSA9IHZhbCA+PiAyNDsKKwljYXNlIDM6CQlwWzJdID0gdmFsID4+IDE2OworCWNhc2UgMjoJCXBbMV0gPSB2YWwgPj4gODsKKwlkZWZhdWx0OglwWzBdID0gdmFsOworCX0KK30KKworc3RhdGljIGlubGluZSBpbnQgYWRmc19yZWFkbmFtZShjaGFyICpidWYsIGNoYXIgKnB0ciwgaW50IG1heGxlbikKK3sKKwljaGFyICpvbGRfYnVmID0gYnVmOworCisJd2hpbGUgKCpwdHIgPj0gJyAnICYmIG1heGxlbi0tKSB7CisJCWlmICgqcHRyID09ICcvJykKKwkJCSpidWYrKyA9ICcuJzsKKwkJZWxzZQorCQkJKmJ1ZisrID0gKnB0cjsKKwkJcHRyKys7CisJfQorCSpidWYgPSAnXDAnOworCisJcmV0dXJuIGJ1ZiAtIG9sZF9idWY7Cit9CisKKyNkZWZpbmUgcm9yMTModikgKCh2ID4+IDEzKSB8ICh2IDw8IDE5KSkKKworI2RlZmluZSBkaXJfdTgoaWR4KQkJCQlcCisJKHsgaW50IF9idWYgPSBpZHggPj4gYmxvY2tzaXplX2JpdHM7CVwKKwkgICBpbnQgX29mZiA9IGlkeCAtIChfYnVmIDw8IGJsb2Nrc2l6ZV9iaXRzKTtcCisJICAqKHU4ICopKGJoW19idWZdLT5iX2RhdGEgKyBfb2ZmKTsJXAorCX0pCisKKyNkZWZpbmUgZGlyX3UzMihpZHgpCQkJCVwKKwkoeyBpbnQgX2J1ZiA9IGlkeCA+PiBibG9ja3NpemVfYml0czsJXAorCSAgIGludCBfb2ZmID0gaWR4IC0gKF9idWYgPDwgYmxvY2tzaXplX2JpdHMpO1wKKwkgICooX19sZTMyICopKGJoW19idWZdLT5iX2RhdGEgKyBfb2ZmKTsJXAorCX0pCisKKyNkZWZpbmUgYnVmb2ZmKF9iaCxfaWR4KQkJCVwKKwkoeyBpbnQgX2J1ZiA9IF9pZHggPj4gYmxvY2tzaXplX2JpdHM7CVwKKwkgICBpbnQgX29mZiA9IF9pZHggLSAoX2J1ZiA8PCBibG9ja3NpemVfYml0cyk7XAorCSAgKHU4ICopKF9iaFtfYnVmXS0+Yl9kYXRhICsgX29mZik7CVwKKwl9KQorCisvKgorICogVGhlcmUgYXJlIHNvbWUgYWxnb3JpdGhtcyB0aGF0IGFyZSBuaWNlIGluCisgKiBhc3NlbWJsZXIsIGJ1dCBhIGJpdGNoIGluIEMuLi4gIFRoaXMgaXMgb25lCisgKiBvZiB0aGVtLgorICovCitzdGF0aWMgdTgKK2FkZnNfZGlyX2NoZWNrYnl0ZShjb25zdCBzdHJ1Y3QgYWRmc19kaXIgKmRpcikKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBjb25zdCAqYmggPSBkaXItPmJoOworCWNvbnN0IGludCBibG9ja3NpemVfYml0cyA9IGRpci0+c2ItPnNfYmxvY2tzaXplX2JpdHM7CisJdW5pb24geyBfX2xlMzIgKnB0cjMyOyB1OCAqcHRyODsgfSBwdHIsIGVuZDsKKwl1MzIgZGlyY2hlY2sgPSAwOworCWludCBsYXN0ID0gNSAtIDI2OworCWludCBpID0gMDsKKworCS8qCisJICogQWNjdW11bGF0ZSBlYWNoIHdvcmQgdXAgdG8gdGhlIGxhc3Qgd2hvbGUKKwkgKiB3b3JkIG9mIHRoZSBsYXN0IGRpcmVjdG9yeSBlbnRyeS4gIFRoaXMKKwkgKiBjYW4gc3ByZWFkIGFjcm9zcyBzZXZlcmFsIGJ1ZmZlciBoZWFkcy4KKwkgKi8KKwlkbyB7CisJCWxhc3QgKz0gMjY7CisJCWRvIHsKKwkJCWRpcmNoZWNrID0gbGUzMl90b19jcHUoZGlyX3UzMihpKSkgXiByb3IxMyhkaXJjaGVjayk7CisKKwkJCWkgKz0gc2l6ZW9mKHUzMik7CisJCX0gd2hpbGUgKGkgPCAobGFzdCAmIH4zKSk7CisJfSB3aGlsZSAoZGlyX3U4KGxhc3QpICE9IDApOworCisJLyoKKwkgKiBBY2N1bXVsYXRlIHRoZSBsYXN0IGZldyBieXRlcy4gIFRoZXNlCisJICogYnl0ZXMgd2lsbCBiZSB3aXRoaW4gdGhlIHNhbWUgYmguCisJICovCisJaWYgKGkgIT0gbGFzdCkgeworCQlwdHIucHRyOCA9IGJ1Zm9mZihiaCwgaSk7CisJCWVuZC5wdHI4ID0gcHRyLnB0cjggKyBsYXN0IC0gaTsKKworCQlkbworCQkJZGlyY2hlY2sgPSAqcHRyLnB0cjgrKyBeIHJvcjEzKGRpcmNoZWNrKTsKKwkJd2hpbGUgKHB0ci5wdHI4IDwgZW5kLnB0cjgpOworCX0KKworCS8qCisJICogVGhlIGRpcmVjdG9yeSB0YWlsIGlzIGluIHRoZSBmaW5hbCBiaAorCSAqIE5vdGUgdGhhdCBjb250YXJ5IHRvIHRoZSBSSVNDIE9TIFBSTXMsCisJICogdGhlIGZpcnN0IGZldyBieXRlcyBhcmUgTk9UIGluY2x1ZGVkCisJICogaW4gdGhlIGNoZWNrLiAgQWxsIGJ5dGVzIGFyZSBpbiB0aGUKKwkgKiBzYW1lIGJoLgorCSAqLworCXB0ci5wdHI4ID0gYnVmb2ZmKGJoLCAyMDA4KTsKKwllbmQucHRyOCA9IHB0ci5wdHI4ICsgMzY7CisKKwlkbyB7CisJCV9fbGUzMiB2ID0gKnB0ci5wdHIzMisrOworCQlkaXJjaGVjayA9IGxlMzJfdG9fY3B1KHYpIF4gcm9yMTMoZGlyY2hlY2spOworCX0gd2hpbGUgKHB0ci5wdHIzMiA8IGVuZC5wdHIzMik7CisKKwlyZXR1cm4gKGRpcmNoZWNrIF4gKGRpcmNoZWNrID4+IDgpIF4gKGRpcmNoZWNrID4+IDE2KSBeIChkaXJjaGVjayA+PiAyNCkpICYgMHhmZjsKK30KKworLyoKKyAqIFJlYWQgYW5kIGNoZWNrIHRoYXQgYSBkaXJlY3RvcnkgaXMgdmFsaWQKKyAqLworc3RhdGljIGludAorYWRmc19kaXJfcmVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBsb25nIG9iamVjdF9pZCwKKwkgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgc3RydWN0IGFkZnNfZGlyICpkaXIpCit7CisJY29uc3QgdW5zaWduZWQgaW50IGJsb2Nrc2l6ZV9iaXRzID0gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJaW50IGJsayA9IDA7CisKKwkvKgorCSAqIERpcmVjdG9yaWVzIHdoaWNoIGFyZSBub3QgYSBtdWx0aXBsZSBvZiAyMDQ4IGJ5dGVzCisJICogYXJlIGNvbnNpZGVyZWQgYmFkIHYyIFszLjZdCisJICovCisJaWYgKHNpemUgJiAyMDQ3KQorCQlnb3RvIGJhZF9kaXI7CisKKwlzaXplID4+PSBibG9ja3NpemVfYml0czsKKworCWRpci0+bnJfYnVmZmVycyA9IDA7CisJZGlyLT5zYiA9IHNiOworCisJZm9yIChibGsgPSAwOyBibGsgPCBzaXplOyBibGsrKykgeworCQlpbnQgcGh5czsKKworCQlwaHlzID0gX19hZGZzX2Jsb2NrX21hcChzYiwgb2JqZWN0X2lkLCBibGspOworCQlpZiAoIXBoeXMpIHsKKwkJCWFkZnNfZXJyb3Ioc2IsICJkaXIgb2JqZWN0ICVsWCBoYXMgYSBob2xlIGF0IG9mZnNldCAlZCIsCisJCQkJICAgb2JqZWN0X2lkLCBibGspOworCQkJZ290byByZWxlYXNlX2J1ZmZlcnM7CisJCX0KKworCQlkaXItPmJoW2Jsa10gPSBzYl9icmVhZChzYiwgcGh5cyk7CisJCWlmICghZGlyLT5iaFtibGtdKQorCQkJZ290byByZWxlYXNlX2J1ZmZlcnM7CisJfQorCisJbWVtY3B5KCZkaXItPmRpcmhlYWQsIGJ1Zm9mZihkaXItPmJoLCAwKSwgc2l6ZW9mKGRpci0+ZGlyaGVhZCkpOworCW1lbWNweSgmZGlyLT5kaXJ0YWlsLCBidWZvZmYoZGlyLT5iaCwgMjAwNyksIHNpemVvZihkaXItPmRpcnRhaWwpKTsKKworCWlmIChkaXItPmRpcmhlYWQuc3RhcnRtYXNzZXEgIT0gZGlyLT5kaXJ0YWlsLm5ldy5lbmRtYXNzZXEgfHwKKwkgICAgbWVtY21wKCZkaXItPmRpcmhlYWQuc3RhcnRuYW1lLCAmZGlyLT5kaXJ0YWlsLm5ldy5lbmRuYW1lLCA0KSkKKwkJZ290byBiYWRfZGlyOworCisJaWYgKG1lbWNtcCgmZGlyLT5kaXJoZWFkLnN0YXJ0bmFtZSwgIk5pY2siLCA0KSAmJgorCSAgICBtZW1jbXAoJmRpci0+ZGlyaGVhZC5zdGFydG5hbWUsICJIdWdvIiwgNCkpCisJCWdvdG8gYmFkX2RpcjsKKworCWlmIChhZGZzX2Rpcl9jaGVja2J5dGUoZGlyKSAhPSBkaXItPmRpcnRhaWwubmV3LmRpcmNoZWNrYnl0ZSkKKwkJZ290byBiYWRfZGlyOworCisJZGlyLT5ucl9idWZmZXJzID0gYmxrOworCisJcmV0dXJuIDA7CisKK2JhZF9kaXI6CisJYWRmc19lcnJvcihzYiwgImNvcnJ1cHRlZCBkaXJlY3RvcnkgZnJhZ21lbnQgJWxYIiwKKwkJICAgb2JqZWN0X2lkKTsKK3JlbGVhc2VfYnVmZmVyczoKKwlmb3IgKGJsayAtPSAxOyBibGsgPj0gMDsgYmxrIC09IDEpCisJCWJyZWxzZShkaXItPmJoW2Jsa10pOworCisJZGlyLT5zYiA9IE5VTEw7CisKKwlyZXR1cm4gLUVJTzsKK30KKworLyoKKyAqIGNvbnZlcnQgYSBkaXNrLWJhc2VkIGRpcmVjdG9yeSBlbnRyeSB0byBhIExpbnV4IEFERlMgZGlyZWN0b3J5IGVudHJ5CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorYWRmc19kaXIyb2JqKHN0cnVjdCBvYmplY3RfaW5mbyAqb2JqLCBzdHJ1Y3QgYWRmc19kaXJlbnRyeSAqZGUpCit7CisJb2JqLT5uYW1lX2xlbiA9CWFkZnNfcmVhZG5hbWUob2JqLT5uYW1lLCBkZS0+ZGlyb2JuYW1lLCBBREZTX0ZfTkFNRV9MRU4pOworCW9iai0+ZmlsZV9pZCAgPSBhZGZzX3JlYWR2YWwoZGUtPmRpcmluZGRpc2NhZGQsIDMpOworCW9iai0+bG9hZGFkZHIgPSBhZGZzX3JlYWR2YWwoZGUtPmRpcmxvYWQsIDQpOworCW9iai0+ZXhlY2FkZHIgPSBhZGZzX3JlYWR2YWwoZGUtPmRpcmV4ZWMsIDQpOworCW9iai0+c2l6ZSAgICAgPSBhZGZzX3JlYWR2YWwoZGUtPmRpcmxlbiwgIDQpOworCW9iai0+YXR0ciAgICAgPSBkZS0+bmV3ZGlyYXR0czsKK30KKworLyoKKyAqIGNvbnZlcnQgYSBMaW51eCBBREZTIGRpcmVjdG9yeSBlbnRyeSB0byBhIGRpc2stYmFzZWQgZGlyZWN0b3J5IGVudHJ5CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorYWRmc19vYmoyZGlyKHN0cnVjdCBhZGZzX2RpcmVudHJ5ICpkZSwgc3RydWN0IG9iamVjdF9pbmZvICpvYmopCit7CisJYWRmc193cml0ZXZhbChkZS0+ZGlyaW5kZGlzY2FkZCwgMywgb2JqLT5maWxlX2lkKTsKKwlhZGZzX3dyaXRldmFsKGRlLT5kaXJsb2FkLCA0LCBvYmotPmxvYWRhZGRyKTsKKwlhZGZzX3dyaXRldmFsKGRlLT5kaXJleGVjLCA0LCBvYmotPmV4ZWNhZGRyKTsKKwlhZGZzX3dyaXRldmFsKGRlLT5kaXJsZW4sICA0LCBvYmotPnNpemUpOworCWRlLT5uZXdkaXJhdHRzID0gb2JqLT5hdHRyOworfQorCisvKgorICogZ2V0IGEgZGlyZWN0b3J5IGVudHJ5LiAgTm90ZSB0aGF0IHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUKKyAqIGZvciBob2xkaW5nIHRoZSByZWxldmFudCBsb2Nrcy4KKyAqLworc3RhdGljIGludAorX19hZGZzX2Rpcl9nZXQoc3RydWN0IGFkZnNfZGlyICpkaXIsIGludCBwb3MsIHN0cnVjdCBvYmplY3RfaW5mbyAqb2JqKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPnNiOworCXN0cnVjdCBhZGZzX2RpcmVudHJ5IGRlOworCWludCB0aGlzc2l6ZSwgYnVmZmVyLCBvZmZzZXQ7CisKKwlidWZmZXIgPSBwb3MgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisKKwlpZiAoYnVmZmVyID4gZGlyLT5ucl9idWZmZXJzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9mZnNldCA9IHBvcyAmIChzYi0+c19ibG9ja3NpemUgLSAxKTsKKwl0aGlzc2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZSAtIG9mZnNldDsKKwlpZiAodGhpc3NpemUgPiAyNikKKwkJdGhpc3NpemUgPSAyNjsKKworCW1lbWNweSgmZGUsIGRpci0+YmhbYnVmZmVyXS0+Yl9kYXRhICsgb2Zmc2V0LCB0aGlzc2l6ZSk7CisJaWYgKHRoaXNzaXplICE9IDI2KQorCQltZW1jcHkoKChjaGFyICopJmRlKSArIHRoaXNzaXplLCBkaXItPmJoW2J1ZmZlciArIDFdLT5iX2RhdGEsCisJCSAgICAgICAyNiAtIHRoaXNzaXplKTsKKworCWlmICghZGUuZGlyb2JuYW1lWzBdKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWFkZnNfZGlyMm9iaihvYmosICZkZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorX19hZGZzX2Rpcl9wdXQoc3RydWN0IGFkZnNfZGlyICpkaXIsIGludCBwb3MsIHN0cnVjdCBvYmplY3RfaW5mbyAqb2JqKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPnNiOworCXN0cnVjdCBhZGZzX2RpcmVudHJ5IGRlOworCWludCB0aGlzc2l6ZSwgYnVmZmVyLCBvZmZzZXQ7CisKKwlidWZmZXIgPSBwb3MgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisKKwlpZiAoYnVmZmVyID4gZGlyLT5ucl9idWZmZXJzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9mZnNldCA9IHBvcyAmIChzYi0+c19ibG9ja3NpemUgLSAxKTsKKwl0aGlzc2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZSAtIG9mZnNldDsKKwlpZiAodGhpc3NpemUgPiAyNikKKwkJdGhpc3NpemUgPSAyNjsKKworCS8qCisJICogR2V0IHRoZSBlbnRyeSBpbiB0b3RhbAorCSAqLworCW1lbWNweSgmZGUsIGRpci0+YmhbYnVmZmVyXS0+Yl9kYXRhICsgb2Zmc2V0LCB0aGlzc2l6ZSk7CisJaWYgKHRoaXNzaXplICE9IDI2KQorCQltZW1jcHkoKChjaGFyICopJmRlKSArIHRoaXNzaXplLCBkaXItPmJoW2J1ZmZlciArIDFdLT5iX2RhdGEsCisJCSAgICAgICAyNiAtIHRoaXNzaXplKTsKKworCS8qCisJICogdXBkYXRlIGl0CisJICovCisJYWRmc19vYmoyZGlyKCZkZSwgb2JqKTsKKworCS8qCisJICogUHV0IHRoZSBuZXcgZW50cnkgYmFjaworCSAqLworCW1lbWNweShkaXItPmJoW2J1ZmZlcl0tPmJfZGF0YSArIG9mZnNldCwgJmRlLCB0aGlzc2l6ZSk7CisJaWYgKHRoaXNzaXplICE9IDI2KQorCQltZW1jcHkoZGlyLT5iaFtidWZmZXIgKyAxXS0+Yl9kYXRhLCAoKGNoYXIgKikmZGUpICsgdGhpc3NpemUsCisJCSAgICAgICAyNiAtIHRoaXNzaXplKTsKKworCXJldHVybiAwOworfQorCisvKgorICogdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgaG9sZGluZyB0aGUgbmVjZXNzYXJ5CisgKiBsb2Nrcy4KKyAqLworc3RhdGljIGludAorYWRmc19kaXJfZmluZF9lbnRyeShzdHJ1Y3QgYWRmc19kaXIgKmRpciwgdW5zaWduZWQgbG9uZyBvYmplY3RfaWQpCit7CisJaW50IHBvcywgcmV0OworCisJcmV0ID0gLUVOT0VOVDsKKworCWZvciAocG9zID0gNTsgcG9zIDwgQURGU19OVU1fRElSX0VOVFJJRVMgKiAyNiArIDU7IHBvcyArPSAyNikgeworCQlzdHJ1Y3Qgb2JqZWN0X2luZm8gb2JqOworCisJCWlmICghX19hZGZzX2Rpcl9nZXQoZGlyLCBwb3MsICZvYmopKQorCQkJYnJlYWs7CisKKwkJaWYgKG9iai5maWxlX2lkID09IG9iamVjdF9pZCkgeworCQkJcmV0ID0gcG9zOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CithZGZzX2ZfcmVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBpbnQgaWQsIHVuc2lnbmVkIGludCBzeiwgc3RydWN0IGFkZnNfZGlyICpkaXIpCit7CisJaW50IHJldDsKKworCWlmIChzeiAhPSBBREZTX05FV0RJUl9TSVpFKQorCQlyZXR1cm4gLUVJTzsKKworCXJldCA9IGFkZnNfZGlyX3JlYWQoc2IsIGlkLCBzeiwgZGlyKTsKKwlpZiAocmV0KQorCQlhZGZzX2Vycm9yKHNiLCAidW5hYmxlIHRvIHJlYWQgZGlyZWN0b3J5Iik7CisJZWxzZQorCQlkaXItPnBhcmVudF9pZCA9IGFkZnNfcmVhZHZhbChkaXItPmRpcnRhaWwubmV3LmRpcnBhcmVudCwgMyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CithZGZzX2Zfc2V0cG9zKHN0cnVjdCBhZGZzX2RpciAqZGlyLCB1bnNpZ25lZCBpbnQgZnBvcykKK3sKKwlpZiAoZnBvcyA+PSBBREZTX05VTV9ESVJfRU5UUklFUykKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlkaXItPnBvcyA9IDUgKyBmcG9zICogMjY7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2FkZnNfZl9nZXRuZXh0KHN0cnVjdCBhZGZzX2RpciAqZGlyLCBzdHJ1Y3Qgb2JqZWN0X2luZm8gKm9iaikKK3sKKwl1bnNpZ25lZCBpbnQgcmV0OworCisJcmV0ID0gX19hZGZzX2Rpcl9nZXQoZGlyLCBkaXItPnBvcywgb2JqKTsKKwlpZiAocmV0ID09IDApCisJCWRpci0+cG9zICs9IDI2OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorYWRmc19mX3VwZGF0ZShzdHJ1Y3QgYWRmc19kaXIgKmRpciwgc3RydWN0IG9iamVjdF9pbmZvICpvYmopCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRpci0+c2I7CisJaW50IHJldCwgaTsKKworCXJldCA9IGFkZnNfZGlyX2ZpbmRfZW50cnkoZGlyLCBvYmotPmZpbGVfaWQpOworCWlmIChyZXQgPCAwKSB7CisJCWFkZnNfZXJyb3IoZGlyLT5zYiwgInVuYWJsZSB0byBsb2NhdGUgZW50cnkgdG8gdXBkYXRlIik7CisJCWdvdG8gb3V0OworCX0KKworCV9fYWRmc19kaXJfcHV0KGRpciwgcmV0LCBvYmopOworIAorCS8qCisJICogSW5jcmVtZW50IGRpcmVjdG9yeSBzZXF1ZW5jZSBudW1iZXIKKwkgKi8KKwlkaXItPmJoWzBdLT5iX2RhdGFbMF0gKz0gMTsKKwlkaXItPmJoW2Rpci0+bnJfYnVmZmVycyAtIDFdLT5iX2RhdGFbc2ItPnNfYmxvY2tzaXplIC0gNl0gKz0gMTsKKworCXJldCA9IGFkZnNfZGlyX2NoZWNrYnl0ZShkaXIpOworCS8qCisJICogVXBkYXRlIGRpcmVjdG9yeSBjaGVjayBieXRlCisJICovCisJZGlyLT5iaFtkaXItPm5yX2J1ZmZlcnMgLSAxXS0+Yl9kYXRhW3NiLT5zX2Jsb2Nrc2l6ZSAtIDFdID0gcmV0OworCisjaWYgMQorCXsKKwljb25zdCB1bnNpZ25lZCBpbnQgYmxvY2tzaXplX2JpdHMgPSBzYi0+c19ibG9ja3NpemVfYml0czsKKworCW1lbWNweSgmZGlyLT5kaXJoZWFkLCBidWZvZmYoZGlyLT5iaCwgMCksIHNpemVvZihkaXItPmRpcmhlYWQpKTsKKwltZW1jcHkoJmRpci0+ZGlydGFpbCwgYnVmb2ZmKGRpci0+YmgsIDIwMDcpLCBzaXplb2YoZGlyLT5kaXJ0YWlsKSk7CisKKwlpZiAoZGlyLT5kaXJoZWFkLnN0YXJ0bWFzc2VxICE9IGRpci0+ZGlydGFpbC5uZXcuZW5kbWFzc2VxIHx8CisJICAgIG1lbWNtcCgmZGlyLT5kaXJoZWFkLnN0YXJ0bmFtZSwgJmRpci0+ZGlydGFpbC5uZXcuZW5kbmFtZSwgNCkpCisJCWdvdG8gYmFkX2RpcjsKKworCWlmIChtZW1jbXAoJmRpci0+ZGlyaGVhZC5zdGFydG5hbWUsICJOaWNrIiwgNCkgJiYKKwkgICAgbWVtY21wKCZkaXItPmRpcmhlYWQuc3RhcnRuYW1lLCAiSHVnbyIsIDQpKQorCQlnb3RvIGJhZF9kaXI7CisKKwlpZiAoYWRmc19kaXJfY2hlY2tieXRlKGRpcikgIT0gZGlyLT5kaXJ0YWlsLm5ldy5kaXJjaGVja2J5dGUpCisJCWdvdG8gYmFkX2RpcjsKKwl9CisjZW5kaWYKKwlmb3IgKGkgPSBkaXItPm5yX2J1ZmZlcnMgLSAxOyBpID49IDA7IGktLSkKKwkJbWFya19idWZmZXJfZGlydHkoZGlyLT5iaFtpXSk7CisKKwlyZXQgPSAwOworb3V0OgorCXJldHVybiByZXQ7CisjaWYgMQorYmFkX2RpcjoKKwlhZGZzX2Vycm9yKGRpci0+c2IsICJ3aG9vcHMhICBJIGJyb2tlIGEgZGlyZWN0b3J5ISIpOworCXJldHVybiAtRUlPOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCithZGZzX2ZfZnJlZShzdHJ1Y3QgYWRmc19kaXIgKmRpcikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IGRpci0+bnJfYnVmZmVycyAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCWJyZWxzZShkaXItPmJoW2ldKTsKKwkJZGlyLT5iaFtpXSA9IE5VTEw7CisJfQorCisJZGlyLT5ucl9idWZmZXJzID0gMDsKKwlkaXItPnNiID0gTlVMTDsKK30KKworc3RydWN0IGFkZnNfZGlyX29wcyBhZGZzX2ZfZGlyX29wcyA9IHsKKwkucmVhZAkJPSBhZGZzX2ZfcmVhZCwKKwkuc2V0cG9zCQk9IGFkZnNfZl9zZXRwb3MsCisJLmdldG5leHQJPSBhZGZzX2ZfZ2V0bmV4dCwKKwkudXBkYXRlCQk9IGFkZnNfZl91cGRhdGUsCisJLmZyZWUJCT0gYWRmc19mX2ZyZWUKK307CmRpZmYgLS1naXQgYS9mcy9hZGZzL2Rpcl9mLmggYi9mcy9hZGZzL2Rpcl9mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ3MTM0MAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2FkZnMvZGlyX2YuaApAQCAtMCwwICsxLDY1IEBACisvKgorICogIGxpbnV4L2ZzL2FkZnMvZGlyX2YuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTkgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgU3RydWN0dXJlcyBvZiBkaXJlY3RvcmllcyBvbiB0aGUgRiBmb3JtYXQgZGlzaworICovCisjaWZuZGVmIEFERlNfRElSX0ZfSAorI2RlZmluZSBBREZTX0RJUl9GX0gKKworLyoKKyAqIERpcmVjdG9yeSBoZWFkZXIKKyAqLworc3RydWN0IGFkZnNfZGlyaGVhZGVyIHsKKwl1bnNpZ25lZCBjaGFyIHN0YXJ0bWFzc2VxOworCXVuc2lnbmVkIGNoYXIgc3RhcnRuYW1lWzRdOworfTsKKworI2RlZmluZSBBREZTX05FV0RJUl9TSVpFCTIwNDgKKyNkZWZpbmUgQURGU19OVU1fRElSX0VOVFJJRVMJNzcKKworLyoKKyAqIERpcmVjdG9yeSBlbnRyaWVzCisgKi8KK3N0cnVjdCBhZGZzX2RpcmVudHJ5IHsKKyNkZWZpbmUgQURGU19GX05BTUVfTEVOIDEwCisJY2hhciBkaXJvYm5hbWVbQURGU19GX05BTUVfTEVOXTsKKwlfX3U4IGRpcmxvYWRbNF07CisJX191OCBkaXJleGVjWzRdOworCV9fdTggZGlybGVuWzRdOworCV9fdTggZGlyaW5kZGlzY2FkZFszXTsKKwlfX3U4IG5ld2RpcmF0dHM7Cit9OworCisvKgorICogRGlyZWN0b3J5IHRhaWwKKyAqLwordW5pb24gYWRmc19kaXJ0YWlsIHsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIGRpcmxhc3RtYXNrOworCQljaGFyIGRpcm5hbWVbMTBdOworCQl1bnNpZ25lZCBjaGFyIGRpcnBhcmVudFszXTsKKwkJY2hhciBkaXJ0aXRsZVsxOV07CisJCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRbMTRdOworCQl1bnNpZ25lZCBjaGFyIGVuZG1hc3NlcTsKKwkJdW5zaWduZWQgY2hhciBlbmRuYW1lWzRdOworCQl1bnNpZ25lZCBjaGFyIGRpcmNoZWNrYnl0ZTsKKwl9IG9sZDsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIGRpcmxhc3RtYXNrOworCQl1bnNpZ25lZCBjaGFyIHJlc2VydmVkWzJdOworCQl1bnNpZ25lZCBjaGFyIGRpcnBhcmVudFszXTsKKwkJY2hhciBkaXJ0aXRsZVsxOV07CisJCWNoYXIgZGlybmFtZVsxMF07CisJCXVuc2lnbmVkIGNoYXIgZW5kbWFzc2VxOworCQl1bnNpZ25lZCBjaGFyIGVuZG5hbWVbNF07CisJCXVuc2lnbmVkIGNoYXIgZGlyY2hlY2tieXRlOworCX0gbmV3OworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9hZGZzL2Rpcl9mcGx1cy5jIGIvZnMvYWRmcy9kaXJfZnBsdXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWM2NDRlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWRmcy9kaXJfZnBsdXMuYwpAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqICBsaW51eC9mcy9hZGZzL2Rpcl9mcGx1cy5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5Ny0xOTk5IFJ1c3NlbGwgS2luZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYWRmc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCisjaW5jbHVkZSAiYWRmcy5oIgorI2luY2x1ZGUgImRpcl9mcGx1cy5oIgorCitzdGF0aWMgaW50CithZGZzX2ZwbHVzX3JlYWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IGlkLCB1bnNpZ25lZCBpbnQgc3osIHN0cnVjdCBhZGZzX2RpciAqZGlyKQoreworCXN0cnVjdCBhZGZzX2JpZ2RpcmhlYWRlciAqaDsKKwlzdHJ1Y3QgYWRmc19iaWdkaXJ0YWlsICp0OworCXVuc2lnbmVkIGxvbmcgYmxvY2s7CisJdW5zaWduZWQgaW50IGJsaywgc2l6ZTsKKwlpbnQgaSwgcmV0ID0gLUVJTzsKKworCWRpci0+bnJfYnVmZmVycyA9IDA7CisKKwlibG9jayA9IF9fYWRmc19ibG9ja19tYXAoc2IsIGlkLCAwKTsKKwlpZiAoIWJsb2NrKSB7CisJCWFkZnNfZXJyb3Ioc2IsICJkaXIgb2JqZWN0ICVYIGhhcyBhIGhvbGUgYXQgb2Zmc2V0IDAiLCBpZCk7CisJCWdvdG8gb3V0OworCX0KKworCWRpci0+YmhbMF0gPSBzYl9icmVhZChzYiwgYmxvY2spOworCWlmICghZGlyLT5iaFswXSkKKwkJZ290byBvdXQ7CisJZGlyLT5ucl9idWZmZXJzICs9IDE7CisKKwloID0gKHN0cnVjdCBhZGZzX2JpZ2RpcmhlYWRlciAqKWRpci0+YmhbMF0tPmJfZGF0YTsKKwlzaXplID0gbGUzMl90b19jcHUoaC0+YmlnZGlyc2l6ZSk7CisJaWYgKHNpemUgIT0gc3opIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWRmczogYWRmc19mcGx1c19yZWFkOiBkaXJlY3RvcnkgaGVhZGVyIHNpemVcbiIKKwkJCQkiIGRvZXMgbm90IG1hdGNoIGRpcmVjdG9yeSBzaXplXG4iKTsKKwl9CisKKwlpZiAoaC0+YmlnZGlydmVyc2lvblswXSAhPSAwIHx8IGgtPmJpZ2RpcnZlcnNpb25bMV0gIT0gMCB8fAorCSAgICBoLT5iaWdkaXJ2ZXJzaW9uWzJdICE9IDAgfHwgc2l6ZSAmIDIwNDcgfHwKKwkgICAgaC0+YmlnZGlyc3RhcnRuYW1lICE9IGNwdV90b19sZTMyKEJJR0RJUlNUQVJUTkFNRSkpCisJCWdvdG8gb3V0OworCisJc2l6ZSA+Pj0gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJZm9yIChibGsgPSAxOyBibGsgPCBzaXplOyBibGsrKykgeworCQlibG9jayA9IF9fYWRmc19ibG9ja19tYXAoc2IsIGlkLCBibGspOworCQlpZiAoIWJsb2NrKSB7CisJCQlhZGZzX2Vycm9yKHNiLCAiZGlyIG9iamVjdCAlWCBoYXMgYSBob2xlIGF0IG9mZnNldCAlZCIsIGlkLCBibGspOworCQkJZ290byBvdXQ7CisJCX0KKworCQlkaXItPmJoW2Jsa10gPSBzYl9icmVhZChzYiwgYmxvY2spOworCQlpZiAoIWRpci0+YmhbYmxrXSkKKwkJCWdvdG8gb3V0OworCQlkaXItPm5yX2J1ZmZlcnMgPSBibGs7CisJfQorCisJdCA9IChzdHJ1Y3QgYWRmc19iaWdkaXJ0YWlsICopKGRpci0+Ymhbc2l6ZSAtIDFdLT5iX2RhdGEgKyAoc2ItPnNfYmxvY2tzaXplIC0gOCkpOworCisJaWYgKHQtPmJpZ2RpcmVuZG5hbWUgIT0gY3B1X3RvX2xlMzIoQklHRElSRU5ETkFNRSkgfHwKKwkgICAgdC0+YmlnZGlyZW5kbWFzc2VxICE9IGgtPnN0YXJ0bWFzc2VxIHx8CisJICAgIHQtPnJlc2VydmVkWzBdICE9IDAgfHwgdC0+cmVzZXJ2ZWRbMV0gIT0gMCkKKwkJZ290byBvdXQ7CisKKwlkaXItPnBhcmVudF9pZCA9IGxlMzJfdG9fY3B1KGgtPmJpZ2RpcnBhcmVudCk7CisJZGlyLT5zYiA9IHNiOworCXJldHVybiAwOworb3V0OgorCWZvciAoaSA9IDA7IGkgPCBkaXItPm5yX2J1ZmZlcnM7IGkrKykKKwkJYnJlbHNlKGRpci0+YmhbaV0pOworCWRpci0+c2IgPSBOVUxMOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2FkZnNfZnBsdXNfc2V0cG9zKHN0cnVjdCBhZGZzX2RpciAqZGlyLCB1bnNpZ25lZCBpbnQgZnBvcykKK3sKKwlzdHJ1Y3QgYWRmc19iaWdkaXJoZWFkZXIgKmggPSAoc3RydWN0IGFkZnNfYmlnZGlyaGVhZGVyICopZGlyLT5iaFswXS0+Yl9kYXRhOworCWludCByZXQgPSAtRU5PRU5UOworCisJaWYgKGZwb3MgPD0gbGUzMl90b19jcHUoaC0+YmlnZGlyZW50cmllcykpIHsKKwkJZGlyLT5wb3MgPSBmcG9zOworCQlyZXQgPSAwOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitkaXJfbWVtY3B5KHN0cnVjdCBhZGZzX2RpciAqZGlyLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB2b2lkICp0bywgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLT5zYjsKKwl1bnNpZ25lZCBpbnQgYnVmZmVyLCBwYXJ0aWFsLCByZW1haW5kZXI7CisKKwlidWZmZXIgPSBvZmZzZXQgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJb2Zmc2V0ICY9IHNiLT5zX2Jsb2Nrc2l6ZSAtIDE7CisKKwlwYXJ0aWFsID0gc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0OworCisJaWYgKHBhcnRpYWwgPj0gbGVuKQorCQltZW1jcHkodG8sIGRpci0+YmhbYnVmZmVyXS0+Yl9kYXRhICsgb2Zmc2V0LCBsZW4pOworCWVsc2UgeworCQljaGFyICpjID0gKGNoYXIgKil0bzsKKworCQlyZW1haW5kZXIgPSBsZW4gLSBwYXJ0aWFsOworCisJCW1lbWNweShjLCBkaXItPmJoW2J1ZmZlcl0tPmJfZGF0YSArIG9mZnNldCwgcGFydGlhbCk7CisJCW1lbWNweShjICsgcGFydGlhbCwgZGlyLT5iaFtidWZmZXIgKyAxXS0+Yl9kYXRhLCByZW1haW5kZXIpOworCX0KK30KKworc3RhdGljIGludAorYWRmc19mcGx1c19nZXRuZXh0KHN0cnVjdCBhZGZzX2RpciAqZGlyLCBzdHJ1Y3Qgb2JqZWN0X2luZm8gKm9iaikKK3sKKwlzdHJ1Y3QgYWRmc19iaWdkaXJoZWFkZXIgKmggPSAoc3RydWN0IGFkZnNfYmlnZGlyaGVhZGVyICopZGlyLT5iaFswXS0+Yl9kYXRhOworCXN0cnVjdCBhZGZzX2JpZ2RpcmVudHJ5IGJkZTsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCWludCBpLCByZXQgPSAtRU5PRU5UOworCisJaWYgKGRpci0+cG9zID49IGxlMzJfdG9fY3B1KGgtPmJpZ2RpcmVudHJpZXMpKQorCQlnb3RvIG91dDsKKworCW9mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBhZGZzX2JpZ2RpcmhlYWRlciwgYmlnZGlybmFtZSk7CisJb2Zmc2V0ICs9ICgobGUzMl90b19jcHUoaC0+YmlnZGlybmFtZWxlbikgKyA0KSAmIH4zKTsKKwlvZmZzZXQgKz0gZGlyLT5wb3MgKiBzaXplb2Yoc3RydWN0IGFkZnNfYmlnZGlyZW50cnkpOworCisJZGlyX21lbWNweShkaXIsIG9mZnNldCwgJmJkZSwgc2l6ZW9mKHN0cnVjdCBhZGZzX2JpZ2RpcmVudHJ5KSk7CisKKwlvYmotPmxvYWRhZGRyID0gbGUzMl90b19jcHUoYmRlLmJpZ2RpcmxvYWQpOworCW9iai0+ZXhlY2FkZHIgPSBsZTMyX3RvX2NwdShiZGUuYmlnZGlyZXhlYyk7CisJb2JqLT5zaXplICAgICA9IGxlMzJfdG9fY3B1KGJkZS5iaWdkaXJsZW4pOworCW9iai0+ZmlsZV9pZCAgPSBsZTMyX3RvX2NwdShiZGUuYmlnZGlyaW5kYWRkcik7CisJb2JqLT5hdHRyICAgICA9IGxlMzJfdG9fY3B1KGJkZS5iaWdkaXJhdHRyKTsKKwlvYmotPm5hbWVfbGVuID0gbGUzMl90b19jcHUoYmRlLmJpZ2Rpcm9ibmFtZWxlbik7CisKKwlvZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgYWRmc19iaWdkaXJoZWFkZXIsIGJpZ2Rpcm5hbWUpOworCW9mZnNldCArPSAoKGxlMzJfdG9fY3B1KGgtPmJpZ2Rpcm5hbWVsZW4pICsgNCkgJiB+Myk7CisJb2Zmc2V0ICs9IGxlMzJfdG9fY3B1KGgtPmJpZ2RpcmVudHJpZXMpICogc2l6ZW9mKHN0cnVjdCBhZGZzX2JpZ2RpcmVudHJ5KTsKKwlvZmZzZXQgKz0gbGUzMl90b19jcHUoYmRlLmJpZ2Rpcm9ibmFtZXB0cik7CisKKwlkaXJfbWVtY3B5KGRpciwgb2Zmc2V0LCBvYmotPm5hbWUsIG9iai0+bmFtZV9sZW4pOworCWZvciAoaSA9IDA7IGkgPCBvYmotPm5hbWVfbGVuOyBpKyspCisJCWlmIChvYmotPm5hbWVbaV0gPT0gJy8nKQorCQkJb2JqLT5uYW1lW2ldID0gJy4nOworCisJZGlyLT5wb3MgKz0gMTsKKwlyZXQgPSAwOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCithZGZzX2ZwbHVzX2ZyZWUoc3RydWN0IGFkZnNfZGlyICpkaXIpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGlyLT5ucl9idWZmZXJzOyBpKyspCisJCWJyZWxzZShkaXItPmJoW2ldKTsKKwlkaXItPnNiID0gTlVMTDsKK30KKworc3RydWN0IGFkZnNfZGlyX29wcyBhZGZzX2ZwbHVzX2Rpcl9vcHMgPSB7CisJLnJlYWQJCT0gYWRmc19mcGx1c19yZWFkLAorCS5zZXRwb3MJCT0gYWRmc19mcGx1c19zZXRwb3MsCisJLmdldG5leHQJPSBhZGZzX2ZwbHVzX2dldG5leHQsCisJLmZyZWUJCT0gYWRmc19mcGx1c19mcmVlCit9OwpkaWZmIC0tZ2l0IGEvZnMvYWRmcy9kaXJfZnBsdXMuaCBiL2ZzL2FkZnMvZGlyX2ZwbHVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1YWE0MQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2FkZnMvZGlyX2ZwbHVzLmgKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqICBsaW51eC9mcy9hZGZzL2Rpcl9mcGx1cy5oCisgKgorICogIENvcHlyaWdodCAoQykgMTk5OSBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBTdHJ1Y3R1cmVzIG9mIGRpcmVjdG9yaWVzIG9uIHRoZSBGKyBmb3JtYXQgZGlzaworICovCisKKyNkZWZpbmUgQURGU19GUExVU19OQU1FX0xFTgkyNTUKKworI2RlZmluZSBCSUdESVJTVEFSVE5BTUUgKCdTJyB8ICdCJyA8PCA4IHwgJ1AnIDw8IDE2IHwgJ3InIDw8IDI0KQorI2RlZmluZSBCSUdESVJFTkROQU1FCSgnbycgfCAndicgPDwgOCB8ICdlJyA8PCAxNiB8ICduJyA8PCAyNCkKKworc3RydWN0IGFkZnNfYmlnZGlyaGVhZGVyIHsKKwlfX3U4CXN0YXJ0bWFzc2VxOworCV9fdTgJYmlnZGlydmVyc2lvblszXTsKKwlfX2xlMzIJYmlnZGlyc3RhcnRuYW1lOworCV9fbGUzMgliaWdkaXJuYW1lbGVuOworCV9fbGUzMgliaWdkaXJzaXplOworCV9fbGUzMgliaWdkaXJlbnRyaWVzOworCV9fbGUzMgliaWdkaXJuYW1lc2l6ZTsKKwlfX2xlMzIJYmlnZGlycGFyZW50OworCWNoYXIJYmlnZGlybmFtZVsxXTsKK307CisKK3N0cnVjdCBhZGZzX2JpZ2RpcmVudHJ5IHsKKwlfX2xlMzIJYmlnZGlybG9hZDsKKwlfX2xlMzIJYmlnZGlyZXhlYzsKKwlfX2xlMzIJYmlnZGlybGVuOworCV9fbGUzMgliaWdkaXJpbmRhZGRyOworCV9fbGUzMgliaWdkaXJhdHRyOworCV9fbGUzMgliaWdkaXJvYm5hbWVsZW47CisJX19sZTMyCWJpZ2Rpcm9ibmFtZXB0cjsKK307CisKK3N0cnVjdCBhZGZzX2JpZ2RpcnRhaWwgeworCV9fbGUzMgliaWdkaXJlbmRuYW1lOworCV9fdTgJYmlnZGlyZW5kbWFzc2VxOworCV9fdTgJcmVzZXJ2ZWRbMl07CisJX191OAliaWdkaXJjaGVja2J5dGU7Cit9OwpkaWZmIC0tZ2l0IGEvZnMvYWRmcy9maWxlLmMgYi9mcy9hZGZzL2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmViYmZkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWRmcy9maWxlLmMKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqICBsaW51eC9mcy9hZGZzL2ZpbGUuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ny0xOTk5IFJ1c3NlbGwgS2luZworICogZnJvbToKKyAqCisgKiAgbGludXgvZnMvZXh0Mi9maWxlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUKKyAqIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKKyAqIExhYm9yYXRvaXJlIE1BU0kgLSBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogIGZyb20KKyAqCisgKiAgbGludXgvZnMvbWluaXgvZmlsZS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgYWRmcyByZWd1bGFyIGZpbGUgaGFuZGxpbmcgcHJpbWl0aXZlcyAgICAgICAgICAgCisgKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CQkJLyogZm9yIGZpbGVfZnN5bmMoKSAqLworI2luY2x1ZGUgPGxpbnV4L2FkZnNfZnMuaD4KKworI2luY2x1ZGUgImFkZnMuaCIKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhZGZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlYWQJCT0gZ2VuZXJpY19maWxlX3JlYWQsCisJLm1tYXAJCT0gZ2VuZXJpY19maWxlX21tYXAsCisJLmZzeW5jCQk9IGZpbGVfZnN5bmMsCisJLndyaXRlCQk9IGdlbmVyaWNfZmlsZV93cml0ZSwKKwkuc2VuZGZpbGUJPSBnZW5lcmljX2ZpbGVfc2VuZGZpbGUsCit9OworCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBhZGZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkuc2V0YXR0cgk9IGFkZnNfbm90aWZ5X2NoYW5nZSwKK307CmRpZmYgLS1naXQgYS9mcy9hZGZzL2lub2RlLmMgYi9mcy9hZGZzL2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAyODAyYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2FkZnMvaW5vZGUuYwpAQCAtMCwwICsxLDM5NSBAQAorLyoKKyAqICBsaW51eC9mcy9hZGZzL2lub2RlLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3LTE5OTkgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9hZGZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKworI2luY2x1ZGUgImFkZnMuaCIKKworLyoKKyAqIExvb2t1cC9DcmVhdGUgYSBibG9jayBhdCBvZmZzZXQgJ2Jsb2NrJyBpbnRvICdpbm9kZScuICBXZSBjdXJyZW50bHkgZG8KKyAqIG5vdCBzdXBwb3J0IGNyZWF0aW9uIG9mIG5ldyBibG9ja3MsIHNvIHdlIHJldHVybiAtRUlPIGZvciB0aGlzIGNhc2UuCisgKi8KK3N0YXRpYyBpbnQKK2FkZnNfZ2V0X2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGJsb2NrLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAorCSAgICAgICBpbnQgY3JlYXRlKQoreworCWlmIChibG9jayA8IDApCisJCWdvdG8gYWJvcnRfbmVnYXRpdmU7CisKKwlpZiAoIWNyZWF0ZSkgeworCQlpZiAoYmxvY2sgPj0gaW5vZGUtPmlfYmxvY2tzKQorCQkJZ290byBhYm9ydF90b29iaWc7CisKKwkJYmxvY2sgPSBfX2FkZnNfYmxvY2tfbWFwKGlub2RlLT5pX3NiLCBpbm9kZS0+aV9pbm8sIGJsb2NrKTsKKwkJaWYgKGJsb2NrKQorCQkJbWFwX2JoKGJoLCBpbm9kZS0+aV9zYiwgYmxvY2spOworCQlyZXR1cm4gMDsKKwl9CisJLyogZG9uJ3Qgc3VwcG9ydCBhbGxvY2F0aW9uIG9mIGJsb2NrcyB5ZXQgKi8KKwlyZXR1cm4gLUVJTzsKKworYWJvcnRfbmVnYXRpdmU6CisJYWRmc19lcnJvcihpbm9kZS0+aV9zYiwgImJsb2NrICVkIDwgMCIsIGJsb2NrKTsKKwlyZXR1cm4gLUVJTzsKKworYWJvcnRfdG9vYmlnOgorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkZnNfd3JpdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlyZXR1cm4gYmxvY2tfd3JpdGVfZnVsbF9wYWdlKHBhZ2UsIGFkZnNfZ2V0X2Jsb2NrLCB3YmMpOworfQorCitzdGF0aWMgaW50IGFkZnNfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiBibG9ja19yZWFkX2Z1bGxfcGFnZShwYWdlLCBhZGZzX2dldF9ibG9jayk7Cit9CisKK3N0YXRpYyBpbnQgYWRmc19wcmVwYXJlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgaW50IGZyb20sIHVuc2lnbmVkIGludCB0bykKK3sKKwlyZXR1cm4gY29udF9wcmVwYXJlX3dyaXRlKHBhZ2UsIGZyb20sIHRvLCBhZGZzX2dldF9ibG9jaywKKwkJJkFERlNfSShwYWdlLT5tYXBwaW5nLT5ob3N0KS0+bW11X3ByaXZhdGUpOworfQorCitzdGF0aWMgc2VjdG9yX3QgX2FkZnNfYm1hcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc2VjdG9yX3QgYmxvY2spCit7CisJcmV0dXJuIGdlbmVyaWNfYmxvY2tfYm1hcChtYXBwaW5nLCBibG9jaywgYWRmc19nZXRfYmxvY2spOworfQorCitzdGF0aWMgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBhZGZzX2FvcHMgPSB7CisJLnJlYWRwYWdlCT0gYWRmc19yZWFkcGFnZSwKKwkud3JpdGVwYWdlCT0gYWRmc193cml0ZXBhZ2UsCisJLnN5bmNfcGFnZQk9IGJsb2NrX3N5bmNfcGFnZSwKKwkucHJlcGFyZV93cml0ZQk9IGFkZnNfcHJlcGFyZV93cml0ZSwKKwkuY29tbWl0X3dyaXRlCT0gZ2VuZXJpY19jb21taXRfd3JpdGUsCisJLmJtYXAJCT0gX2FkZnNfYm1hcAorfTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKK2FkZnNfZmlsZXR5cGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwl1bnNpZ25lZCBpbnQgdHlwZTsKKworCWlmIChBREZTX0koaW5vZGUpLT5zdGFtcGVkKQorCQl0eXBlID0gKEFERlNfSShpbm9kZSktPmxvYWRhZGRyID4+IDgpICYgMHhmZmY7CisJZWxzZQorCQl0eXBlID0gKHVuc2lnbmVkIGludCkgLTE7CisKKwlyZXR1cm4gdHlwZTsKK30KKworLyoKKyAqIENvbnZlcnQgQURGUyBhdHRyaWJ1dGVzIGFuZCBmaWxldHlwZSB0byBMaW51eCBwZXJtaXNzaW9uLgorICovCitzdGF0aWMgdW1vZGVfdAorYWRmc19hdHRzMm1vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwl1bnNpZ25lZCBpbnQgZmlsZXR5cGUsIGF0dHIgPSBBREZTX0koaW5vZGUpLT5hdHRyOworCXVtb2RlX3QgbW9kZSwgcm1hc2s7CisJc3RydWN0IGFkZnNfc2JfaW5mbyAqYXNiID0gQURGU19TQihzYik7CisKKwlpZiAoYXR0ciAmIEFERlNfTkRBX0RJUkVDVE9SWSkgeworCQltb2RlID0gU19JUlVHTyAmIGFzYi0+c19vd25lcl9tYXNrOworCQlyZXR1cm4gU19JRkRJUiB8IFNfSVhVR08gfCBtb2RlOworCX0KKworCWZpbGV0eXBlID0gYWRmc19maWxldHlwZShpbm9kZSk7CisKKwlzd2l0Y2ggKGZpbGV0eXBlKSB7CisJY2FzZSAweGZjMDoJLyogTGlua0ZTICovCisJCXJldHVybiBTX0lGTE5LfFNfSVJXWFVHTzsKKworCWNhc2UgMHhmZTY6CS8qIFVuaXhFeGVjICovCisJCXJtYXNrID0gU19JUlVHTyB8IFNfSVhVR087CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcm1hc2sgPSBTX0lSVUdPOworCX0KKworCW1vZGUgPSBTX0lGUkVHOworCisJaWYgKGF0dHIgJiBBREZTX05EQV9PV05FUl9SRUFEKQorCQltb2RlIHw9IHJtYXNrICYgYXNiLT5zX293bmVyX21hc2s7CisKKwlpZiAoYXR0ciAmIEFERlNfTkRBX09XTkVSX1dSSVRFKQorCQltb2RlIHw9IFNfSVdVR08gJiBhc2ItPnNfb3duZXJfbWFzazsKKworCWlmIChhdHRyICYgQURGU19OREFfUFVCTElDX1JFQUQpCisJCW1vZGUgfD0gcm1hc2sgJiBhc2ItPnNfb3RoZXJfbWFzazsKKworCWlmIChhdHRyICYgQURGU19OREFfUFVCTElDX1dSSVRFKQorCQltb2RlIHw9IFNfSVdVR08gJiBhc2ItPnNfb3RoZXJfbWFzazsKKwlyZXR1cm4gbW9kZTsKK30KKworLyoKKyAqIENvbnZlcnQgTGludXggcGVybWlzc2lvbiB0byBBREZTIGF0dHJpYnV0ZS4gIFdlIHRyeSB0byBkbyB0aGUgcmV2ZXJzZQorICogb2YgYXR0czJtb2RlLCBidXQgdGhlcmUgaXMgbm90IGEgMToxIHRyYW5zbGF0aW9uLgorICovCitzdGF0aWMgaW50CithZGZzX21vZGUyYXR0cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXVtb2RlX3QgbW9kZTsKKwlpbnQgYXR0cjsKKwlzdHJ1Y3QgYWRmc19zYl9pbmZvICphc2IgPSBBREZTX1NCKHNiKTsKKworCS8qIEZJWE1FOiBzaG91bGQgd2UgYmUgYWJsZSB0byBhbHRlciBhIGxpbms/ICovCisJaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiBBREZTX0koaW5vZGUpLT5hdHRyOworCisJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCWF0dHIgPSBBREZTX05EQV9ESVJFQ1RPUlk7CisJZWxzZQorCQlhdHRyID0gMDsKKworCW1vZGUgPSBpbm9kZS0+aV9tb2RlICYgYXNiLT5zX293bmVyX21hc2s7CisJaWYgKG1vZGUgJiBTX0lSVUdPKQorCQlhdHRyIHw9IEFERlNfTkRBX09XTkVSX1JFQUQ7CisJaWYgKG1vZGUgJiBTX0lXVUdPKQorCQlhdHRyIHw9IEFERlNfTkRBX09XTkVSX1dSSVRFOworCisJbW9kZSA9IGlub2RlLT5pX21vZGUgJiBhc2ItPnNfb3RoZXJfbWFzazsKKwltb2RlICY9IH5hc2ItPnNfb3duZXJfbWFzazsKKwlpZiAobW9kZSAmIFNfSVJVR08pCisJCWF0dHIgfD0gQURGU19OREFfUFVCTElDX1JFQUQ7CisJaWYgKG1vZGUgJiBTX0lXVUdPKQorCQlhdHRyIHw9IEFERlNfTkRBX1BVQkxJQ19XUklURTsKKworCXJldHVybiBhdHRyOworfQorCisvKgorICogQ29udmVydCBhbiBBREZTIHRpbWUgdG8gVW5peCB0aW1lLiAgQURGUyBoYXMgYSA0MC1iaXQgY2VudGktc2Vjb25kIHRpbWUKKyAqIHJlZmVyZW5jZWQgdG8gMSBKYW4gMTkwMCAodGlsIDIyNDgpCisgKi8KK3N0YXRpYyB2b2lkCithZGZzX2FkZnMydW5peF90aW1lKHN0cnVjdCB0aW1lc3BlYyAqdHYsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJdW5zaWduZWQgaW50IGhpZ2gsIGxvdzsKKworCWlmIChBREZTX0koaW5vZGUpLT5zdGFtcGVkID09IDApCisJCWdvdG8gY3VyX3RpbWU7CisKKwloaWdoID0gQURGU19JKGlub2RlKS0+bG9hZGFkZHIgPDwgMjQ7CisJbG93ICA9IEFERlNfSShpbm9kZSktPmV4ZWNhZGRyOworCisJaGlnaCB8PSBsb3cgPj4gODsKKwlsb3cgICY9IDI1NTsKKworCS8qIEZpbGVzIGRhdGVkIHByZSAgMDEgSmFuIDE5NzAgMDA6MDA6MDAuICovCisJaWYgKGhpZ2ggPCAweDMzNmU5OTZhKQorCQlnb3RvIHRvb19lYXJseTsKKworCS8qIEZpbGVzIGRhdGVkIHBvc3QgMTggSmFuIDIwMzggMDM6MTQ6MDUuICovCisJaWYgKGhpZ2ggPj0gMHg2NTZlOTk2OSkKKwkJZ290byB0b29fbGF0ZTsKKworCS8qIGRpc2NhcmQgMjIwODk4ODgwMCAoMHgzMzZlOTk2YTAwKSBzZWNvbmRzIG9mIHRpbWUgKi8KKwloaWdoIC09IDB4MzM2ZTk5NmE7CisKKwkvKiBjb252ZXJ0IDQwLWJpdCBjZW50aS1zZWNvbmRzIHRvIDMyLWJpdCBzZWNvbmRzICovCisJdHYtPnR2X3NlYyA9ICgoKGhpZ2ggJSAxMDApIDw8IDgpICsgbG93KSAvIDEwMCArIChoaWdoIC8gMTAwIDw8IDgpOworCXR2LT50dl9uc2VjID0gMDsKKwlyZXR1cm47CisKKyBjdXJfdGltZToKKwkqdHYgPSBDVVJSRU5UX1RJTUVfU0VDOworCXJldHVybjsKKworIHRvb19lYXJseToKKwl0di0+dHZfc2VjID0gdHYtPnR2X25zZWMgPSAwOworCXJldHVybjsKKworIHRvb19sYXRlOgorCXR2LT50dl9zZWMgPSAweDdmZmZmZmZkOworCXR2LT50dl9uc2VjID0gMDsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBDb252ZXJ0IGFuIFVuaXggdGltZSB0byBBREZTIHRpbWUuICBXZSBvbmx5IGRvIHRoaXMgaWYgdGhlIGVudHJ5IGhhcyBhCisgKiB0aW1lL2RhdGUgc3RhbXAgYWxyZWFkeS4KKyAqLworc3RhdGljIHZvaWQKK2FkZnNfdW5peDJhZGZzX3RpbWUoc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgaW50IHNlY3MpCit7CisJdW5zaWduZWQgaW50IGhpZ2gsIGxvdzsKKworCWlmIChBREZTX0koaW5vZGUpLT5zdGFtcGVkKSB7CisJCS8qIGNvbnZlcnQgMzItYml0IHNlY29uZHMgdG8gNDAtYml0IGNlbnRpLXNlY29uZHMgKi8KKwkJbG93ICA9IChzZWNzICYgMjU1KSAqIDEwMDsKKwkJaGlnaCA9IChzZWNzIC8gMjU2KSAqIDEwMCArIChsb3cgPj4gOCkgKyAweDMzNmU5OTZhOworCisJCUFERlNfSShpbm9kZSktPmxvYWRhZGRyID0gKGhpZ2ggPj4gMjQpIHwKKwkJCQkoQURGU19JKGlub2RlKS0+bG9hZGFkZHIgJiB+MHhmZik7CisJCUFERlNfSShpbm9kZSktPmV4ZWNhZGRyID0gKGxvdyAmIDI1NSkgfCAoaGlnaCA8PCA4KTsKKwl9Cit9CisKKy8qCisgKiBGaWxsIGluIHRoZSBpbm9kZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvYmplY3QgaW5mb3JtYXRpb24uCisgKgorICogTm90ZSB0aGF0IHRoaXMgaXMgYW4gaW5vZGUtbGVzcyBmaWxlc3lzdGVtLCBzbyB3ZSBjYW4ndCB1c2UgdGhlIGlub2RlCisgKiBudW1iZXIgdG8gcmVmZXJlbmNlIHRoZSBtZXRhZGF0YSBvbiB0aGUgbWVkaWEuICBJbnN0ZWFkLCB3ZSB1c2UgdGhlCisgKiBpbm9kZSBudW1iZXIgdG8gaG9sZCB0aGUgb2JqZWN0IElELCB3aGljaCBpbiB0dXJuIHdpbGwgdGVsbCB1cyB3aGVyZQorICogdGhlIGRhdGEgaXMgaGVsZC4gIFdlIGFsc28gc2F2ZSB0aGUgcGFyZW50IG9iamVjdCBJRCwgYW5kIHdpdGggdGhlc2UKKyAqIHR3bywgd2UgY2FuIGxvY2F0ZSB0aGUgbWV0YWRhdGEuCisgKgorICogVGhpcyBkb2VzIG1lYW4gdGhhdCB3ZSByZWx5IG9uIGFuIG9iamVjdHMgcGFyZW50IHJlbWFpbmluZyB0aGUgc2FtZSBhdAorICogYWxsIHRpbWVzIC0gd2UgY2Fubm90IGNvcGUgd2l0aCBhIGNyb3NzLWRpcmVjdG9yeSByZW5hbWUgKHlldCkuCisgKi8KK3N0cnVjdCBpbm9kZSAqCithZGZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IG9iamVjdF9pbmZvICpvYmopCit7CisJc3RydWN0IGlub2RlICppbm9kZTsKKworCWlub2RlID0gbmV3X2lub2RlKHNiKTsKKwlpZiAoIWlub2RlKQorCQlnb3RvIG91dDsKKworCWlub2RlLT5pX3VpZAkgPSBBREZTX1NCKHNiKS0+c191aWQ7CisJaW5vZGUtPmlfZ2lkCSA9IEFERlNfU0Ioc2IpLT5zX2dpZDsKKwlpbm9kZS0+aV9pbm8JID0gb2JqLT5maWxlX2lkOworCWlub2RlLT5pX3NpemUJID0gb2JqLT5zaXplOworCWlub2RlLT5pX25saW5rCSA9IDI7CisJaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfU0laRTsKKwlpbm9kZS0+aV9ibG9ja3MJID0gKGlub2RlLT5pX3NpemUgKyBzYi0+c19ibG9ja3NpemUgLSAxKSA+PgorCQkJICAgIHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCisJLyoKKwkgKiB3ZSBuZWVkIHRvIHNhdmUgdGhlIHBhcmVudCBkaXJlY3RvcnkgSUQgc28gdGhhdAorCSAqIHdyaXRlX2lub2RlIGNhbiB1cGRhdGUgdGhlIGRpcmVjdG9yeSBpbmZvcm1hdGlvbgorCSAqIGZvciB0aGlzIGZpbGUuICBUaGlzIHdpbGwgbmVlZCBzcGVjaWFsIGhhbmRsaW5nCisJICogZm9yIGNyb3NzLWRpcmVjdG9yeSByZW5hbWVzLgorCSAqLworCUFERlNfSShpbm9kZSktPnBhcmVudF9pZCA9IG9iai0+cGFyZW50X2lkOworCUFERlNfSShpbm9kZSktPmxvYWRhZGRyICA9IG9iai0+bG9hZGFkZHI7CisJQURGU19JKGlub2RlKS0+ZXhlY2FkZHIgID0gb2JqLT5leGVjYWRkcjsKKwlBREZTX0koaW5vZGUpLT5hdHRyICAgICAgPSBvYmotPmF0dHI7CisJQURGU19JKGlub2RlKS0+c3RhbXBlZAkgID0gKChvYmotPmxvYWRhZGRyICYgMHhmZmYwMDAwMCkgPT0gMHhmZmYwMDAwMCk7CisKKwlpbm9kZS0+aV9tb2RlCSA9IGFkZnNfYXR0czJtb2RlKHNiLCBpbm9kZSk7CisJYWRmc19hZGZzMnVuaXhfdGltZSgmaW5vZGUtPmlfbXRpbWUsIGlub2RlKTsKKwlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lOworCWlub2RlLT5pX2N0aW1lID0gaW5vZGUtPmlfbXRpbWU7CisKKwlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgeworCQlpbm9kZS0+aV9vcAk9ICZhZGZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9mb3AJPSAmYWRmc19kaXJfb3BlcmF0aW9uczsKKwl9IGVsc2UgaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaW5vZGUtPmlfb3AJPSAmYWRmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcAk9ICZhZGZzX2ZpbGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmYWRmc19hb3BzOworCQlBREZTX0koaW5vZGUpLT5tbXVfcHJpdmF0ZSA9IGlub2RlLT5pX3NpemU7CisJfQorCisJaW5zZXJ0X2lub2RlX2hhc2goaW5vZGUpOworCitvdXQ6CisJcmV0dXJuIGlub2RlOworfQorCisvKgorICogVmFsaWRhdGUgYW5kIGNvbnZlcnQgYSBjaGFuZ2VkIGFjY2VzcyBtb2RlL3RpbWUgdG8gdGhlaXIgQURGUyBlcXVpdmFsZW50cy4KKyAqIGFkZnNfd3JpdGVfaW5vZGUgd2lsbCBhY3R1YWxseSB3cml0ZSB0aGUgaW5mb3JtYXRpb24gYmFjayB0byB0aGUgZGlyZWN0b3J5CisgKiBsYXRlci4KKyAqLworaW50CithZGZzX25vdGlmeV9jaGFuZ2Uoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmF0dHIpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJdW5zaWduZWQgaW50IGlhX3ZhbGlkID0gYXR0ci0+aWFfdmFsaWQ7CisJaW50IGVycm9yOworCQorCWxvY2tfa2VybmVsKCk7CisKKwllcnJvciA9IGlub2RlX2NoYW5nZV9vayhpbm9kZSwgYXR0cik7CisKKwkvKgorCSAqIHdlIGNhbid0IGNoYW5nZSB0aGUgVUlEIG9yIEdJRCBvZiBhbnkgZmlsZSAtCisJICogd2UgaGF2ZSBhIGdsb2JhbCBVSUQvR0lEIGluIHRoZSBzdXBlcmJsb2NrCisJICovCisJaWYgKChpYV92YWxpZCAmIEFUVFJfVUlEICYmIGF0dHItPmlhX3VpZCAhPSBBREZTX1NCKHNiKS0+c191aWQpIHx8CisJICAgIChpYV92YWxpZCAmIEFUVFJfR0lEICYmIGF0dHItPmlhX2dpZCAhPSBBREZTX1NCKHNiKS0+c19naWQpKQorCQllcnJvciA9IC1FUEVSTTsKKworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisKKwlpZiAoaWFfdmFsaWQgJiBBVFRSX1NJWkUpCisJCWVycm9yID0gdm10cnVuY2F0ZShpbm9kZSwgYXR0ci0+aWFfc2l6ZSk7CisKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCisJaWYgKGlhX3ZhbGlkICYgQVRUUl9NVElNRSkgeworCQlpbm9kZS0+aV9tdGltZSA9IGF0dHItPmlhX210aW1lOworCQlhZGZzX3VuaXgyYWRmc190aW1lKGlub2RlLCBhdHRyLT5pYV9tdGltZS50dl9zZWMpOworCX0KKwkvKgorCSAqIEZJWE1FOiBzaG91bGQgd2UgbWFrZSB0aGVzZSA9PSB0byBpX210aW1lIHNpbmNlIHdlIGRvbid0CisJICogaGF2ZSB0aGUgYWJpbGl0eSB0byByZXByZXNlbnQgdGhlbSBpbiBvdXIgZmlsZXN5c3RlbT8KKwkgKi8KKwlpZiAoaWFfdmFsaWQgJiBBVFRSX0FUSU1FKQorCQlpbm9kZS0+aV9hdGltZSA9IGF0dHItPmlhX2F0aW1lOworCWlmIChpYV92YWxpZCAmIEFUVFJfQ1RJTUUpCisJCWlub2RlLT5pX2N0aW1lID0gYXR0ci0+aWFfY3RpbWU7CisJaWYgKGlhX3ZhbGlkICYgQVRUUl9NT0RFKSB7CisJCUFERlNfSShpbm9kZSktPmF0dHIgPSBhZGZzX21vZGUyYXR0cyhzYiwgaW5vZGUpOworCQlpbm9kZS0+aV9tb2RlID0gYWRmc19hdHRzMm1vZGUoc2IsIGlub2RlKTsKKwl9CisKKwkvKgorCSAqIEZJWE1FOiBzaG91bGQgd2UgYmUgbWFya2luZyB0aGlzIGlub2RlIGRpcnR5IGV2ZW4gaWYKKwkgKiB3ZSBkb24ndCBoYXZlIGFueSBtZXRhZGF0YSB0byB3cml0ZSBiYWNrPworCSAqLworCWlmIChpYV92YWxpZCAmIChBVFRSX1NJWkUgfCBBVFRSX01USU1FIHwgQVRUUl9NT0RFKSkKKwkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIHdyaXRlIGFuIGV4aXN0aW5nIGlub2RlIGJhY2sgdG8gdGhlIGRpcmVjdG9yeSwgYW5kIHRoZXJlZm9yZSB0aGUgZGlzay4KKyAqIFRoZSBhZGZzLXNwZWNpZmljIGlub2RlIGRhdGEgaGFzIGFscmVhZHkgYmVlbiB1cGRhdGVkIGJ5CisgKiBhZGZzX25vdGlmeV9jaGFuZ2UoKQorICovCitpbnQgYWRmc193cml0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdW51c2VkKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3Qgb2JqZWN0X2luZm8gb2JqOworCWludCByZXQ7CisKKwlsb2NrX2tlcm5lbCgpOworCW9iai5maWxlX2lkCT0gaW5vZGUtPmlfaW5vOworCW9iai5uYW1lX2xlbgk9IDA7CisJb2JqLnBhcmVudF9pZAk9IEFERlNfSShpbm9kZSktPnBhcmVudF9pZDsKKwlvYmoubG9hZGFkZHIJPSBBREZTX0koaW5vZGUpLT5sb2FkYWRkcjsKKwlvYmouZXhlY2FkZHIJPSBBREZTX0koaW5vZGUpLT5leGVjYWRkcjsKKwlvYmouYXR0cgk9IEFERlNfSShpbm9kZSktPmF0dHI7CisJb2JqLnNpemUJPSBpbm9kZS0+aV9zaXplOworCisJcmV0ID0gYWRmc19kaXJfdXBkYXRlKHNiLCAmb2JqKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJldDsKK30KK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL2FkZnMvbWFwLmMgYi9mcy9hZGZzL21hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYWI0ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZGZzL21hcC5jCkBAIC0wLDAgKzEsMjk2IEBACisvKgorICogIGxpbnV4L2ZzL2FkZnMvbWFwLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDIgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9hZGZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorCisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCisjaW5jbHVkZSAiYWRmcy5oIgorCisvKgorICogVGhlIEFERlMgbWFwIGlzIGJhc2ljYWxseSBhIHNldCBvZiBzZWN0b3JzLiAgRWFjaCBzZWN0b3IgaXMgY2FsbGVkIGEKKyAqIHpvbmUgd2hpY2ggY29udGFpbnMgYSBiaXRzdHJlYW0gbWFkZSB1cCBvZiB2YXJpYWJsZSBzaXplZCBmcmFnbWVudHMuCisgKiBFYWNoIGJpdCByZWZlcnMgdG8gYSBzZXQgb2YgYnl0ZXMgaW4gdGhlIGZpbGVzeXN0ZW0sIGRlZmluZWQgYnkKKyAqIGxvZzJicG1iLiAgVGhpcyBtYXkgYmUgbGFyZ2VyIG9yIHNtYWxsZXIgdGhhbiB0aGUgc2VjdG9yIHNpemUsIGJ1dAorICogdGhlIG92ZXJhbGwgc2l6ZSBpdCBkZXNjcmliZXMgd2lsbCBhbHdheXMgYmUgYSByb3VuZCBudW1iZXIgb2YKKyAqIHNlY3RvcnMuICBBIGZyYWdtZW50IGlkIGlzIGFsd2F5cyBpZGxlbiBiaXRzIGxvbmcuCisgKgorICogIDwgaWRsZW4gPiA8ICAgICAgIG4gICAgICAgID4gPDE+CisgKiArLS0tLS0tLS0tKy0tLS0tLS0vLy0tLS0tLS0tLSstLS0rCisgKiB8IGZyYWcgaWQgfCAgMDAwMC4uLi4wMDAwMDAgIHwgMSB8CisgKiArLS0tLS0tLS0tKy0tLS0tLS0vLy0tLS0tLS0tLSstLS0rCisgKgorICogVGhlIHBoeXNpY2FsIGRpc2sgc3BhY2UgdXNlZCBieSBhIGZyYWdtZW50IGlzIHRha2VuIGZyb20gdGhlIHN0YXJ0IG9mCisgKiB0aGUgZnJhZ21lbnQgaWQgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgJzEnIGJpdCAtIGllLCBpZGxlbiArIG4gKyAxCisgKiBiaXRzLgorICoKKyAqIEEgZnJhZ21lbnQgaWQgY2FuIGJlIHJlcGVhdGVkIG11bHRpcGxlIHRpbWVzIGluIHRoZSB3aG9sZSBtYXAgZm9yCisgKiBsYXJnZSBvciBmcmFnbWVudGVkIGZpbGVzLiAgVGhlIGZpcnN0IG1hcCB6b25lIGEgZnJhZ21lbnQgc3RhcnRzIGluCisgKiBpcyBnaXZlbiBieSBmcmFnbWVudCBpZCAvIGlkc19wZXJfem9uZSAtIHRoaXMgYWxsb3dzIG9iamVjdHMgdG8gc3RhcnQKKyAqIGZyb20gYW55IHpvbmUgb24gdGhlIGRpc2suCisgKgorICogRnJlZSBzcGFjZSBpcyBkZXNjcmliZWQgYnkgYSBsaW5rZWQgbGlzdCBvZiBmcmFnbWVudHMuICBFYWNoIGZyZWUKKyAqIGZyYWdtZW50IGRlc2NyaWJlcyBmcmVlIHNwYWNlIGluIHRoZSBzYW1lIHdheSBhcyB0aGUgb3RoZXIgZnJhZ21lbnRzLAorICogaG93ZXZlciwgdGhlIGZyYWcgaWQgc3BlY2lmaWVzIGFuIG9mZnNldCAoaW4gbWFwIGJpdHMpIGZyb20gdGhlIGVuZAorICogb2YgdGhpcyBmcmFnbWVudCB0byB0aGUgc3RhcnQgb2YgdGhlIG5leHQgZnJlZSBmcmFnbWVudC4KKyAqCisgKiBPYmplY3RzIHN0b3JlZCBvbiB0aGUgZGlzayBhcmUgYWxsb2NhdGVkIG9iamVjdCBpZHMgKHdlIHVzZSB0aGVzZSBhcworICogb3VyIGlub2RlIG51bWJlcnMuKSAgT2JqZWN0IGlkcyBjb250YWluIGEgZnJhZ21lbnQgaWQgYW5kIGFuIG9wdGlvbmFsCisgKiBvZmZzZXQuICBUaGlzIGFsbG93cyBhIGRpcmVjdG9yeSBmcmFnbWVudCB0byBjb250YWluIHNtYWxsIGZpbGVzCisgKiBhc3NvY2lhdGVkIHdpdGggdGhhdCBkaXJlY3RvcnkuCisgKi8KKworLyoKKyAqIEZvciB0aGUgZnV0dXJlLi4uCisgKi8KK3N0YXRpYyBERUZJTkVfUldMT0NLKGFkZnNfbWFwX2xvY2spOworCisvKgorICogVGhpcyBpcyBmdW4uICBXZSBuZWVkIHRvIGxvYWQgdXAgdG8gMTkgYml0cyBmcm9tIHRoZSBtYXAgYXQgYW4KKyAqIGFyYml0YXJ5IGJpdCBhbGlnbm1lbnQuICAoV2UncmUgbGltaXRlZCB0byAxOSBiaXRzIGJ5IEYrIHZlcnNpb24gMikuCisgKi8KKyNkZWZpbmUgR0VUX0ZSQUdfSUQoX21hcCxfc3RhcnQsX2lkbWFzaykJCQkJXAorCSh7CQkJCQkJCQlcCisJCXVuc2lnbmVkIGNoYXIgKl9tID0gX21hcCArIChfc3RhcnQgPj4gMyk7CQlcCisJCXUzMiBfZnJhZyA9IGdldF91bmFsaWduZWQoKHUzMiAqKV9tKTsJCQlcCisJCV9mcmFnID4+PSAoX3N0YXJ0ICYgNyk7CQkJCQlcCisJCV9mcmFnICYgX2lkbWFzazsJCQkJCVwKKwl9KQorCisvKgorICogcmV0dXJuIHRoZSBtYXAgYml0IG9mZnNldCBvZiB0aGUgZnJhZ21lbnQgZnJhZ19pZCBpbiB0aGUgem9uZSBkbS4KKyAqIE5vdGUgdGhhdCB0aGUgbG9vcCBpcyBvcHRpbWlzZWQgZm9yIGJlc3QgYXNtIGNvZGUgLSBsb29rIGF0IHRoZQorICogb3V0cHV0IG9mOgorICogIGdjYyAtRF9fS0VSTkVMX18gLU8yIC1JLi4vLi4vaW5jbHVkZSAtbyAtIC1TIG1hcC5jCisgKi8KK3N0YXRpYyBpbnQKK2xvb2t1cF96b25lKGNvbnN0IHN0cnVjdCBhZGZzX2Rpc2NtYXAgKmRtLCBjb25zdCB1bnNpZ25lZCBpbnQgaWRsZW4sCisJICAgIGNvbnN0IHVuc2lnbmVkIGludCBmcmFnX2lkLCB1bnNpZ25lZCBpbnQgKm9mZnNldCkKK3sKKwljb25zdCB1bnNpZ25lZCBpbnQgbWFwc2l6ZSA9IGRtLT5kbV9lbmRiaXQ7CisJY29uc3QgdTMyIGlkbWFzayA9ICgxIDw8IGlkbGVuKSAtIDE7CisJdW5zaWduZWQgY2hhciAqbWFwID0gZG0tPmRtX2JoLT5iX2RhdGEgKyA0OworCXVuc2lnbmVkIGludCBzdGFydCA9IGRtLT5kbV9zdGFydGJpdDsKKwl1bnNpZ25lZCBpbnQgbWFwcHRyOworCXUzMiBmcmFnOworCisJZG8geworCQlmcmFnID0gR0VUX0ZSQUdfSUQobWFwLCBzdGFydCwgaWRtYXNrKTsKKwkJbWFwcHRyID0gc3RhcnQgKyBpZGxlbjsKKworCQkvKgorCQkgKiBmaW5kIGVuZCBvZiBmcmFnbWVudAorCQkgKi8KKwkJeworCQkJX19sZTMyICpfbWFwID0gKF9fbGUzMiAqKW1hcDsKKwkJCXUzMiB2ID0gbGUzMl90b19jcHUoX21hcFttYXBwdHIgPj4gNV0pID4+IChtYXBwdHIgJiAzMSk7CisJCQl3aGlsZSAodiA9PSAwKSB7CisJCQkJbWFwcHRyID0gKG1hcHB0ciAmIH4zMSkgKyAzMjsKKwkJCQlpZiAobWFwcHRyID49IG1hcHNpemUpCisJCQkJCWdvdG8gZXJyb3I7CisJCQkJdiA9IGxlMzJfdG9fY3B1KF9tYXBbbWFwcHRyID4+IDVdKTsKKwkJCX0KKworCQkJbWFwcHRyICs9IDEgKyBmZnoofnYpOworCQl9CisKKwkJaWYgKGZyYWcgPT0gZnJhZ19pZCkKKwkJCWdvdG8gZm91bmQ7CithZ2FpbjoKKwkJc3RhcnQgPSBtYXBwdHI7CisJfSB3aGlsZSAobWFwcHRyIDwgbWFwc2l6ZSk7CisJcmV0dXJuIC0xOworCitlcnJvcjoKKwlwcmludGsoS0VSTl9FUlIgImFkZnM6IG92ZXJzaXplZCBmcmFnbWVudCAweCV4IGF0IDB4JXgtMHgleFxuIiwKKwkJZnJhZywgc3RhcnQsIG1hcHB0cik7CisJcmV0dXJuIC0xOworCitmb3VuZDoKKwl7CisJCWludCBsZW5ndGggPSBtYXBwdHIgLSBzdGFydDsKKwkJaWYgKCpvZmZzZXQgPj0gbGVuZ3RoKSB7CisJCQkqb2Zmc2V0IC09IGxlbmd0aDsKKwkJCWdvdG8gYWdhaW47CisJCX0KKwl9CisJcmV0dXJuIHN0YXJ0ICsgKm9mZnNldDsKK30KKworLyoKKyAqIFNjYW4gdGhlIGZyZWUgc3BhY2UgbWFwLCBmb3IgdGhpcyB6b25lLCBjYWxjdWxhdGluZyB0aGUgdG90YWwKKyAqIG51bWJlciBvZiBtYXAgYml0cyBpbiBlYWNoIGZyZWUgc3BhY2UgZnJhZ21lbnQuCisgKgorICogTm90ZTogaWRtYXNrIGlzIGxpbWl0ZWQgdG8gMTUgYml0cyBbMy4yXQorICovCitzdGF0aWMgdW5zaWduZWQgaW50CitzY2FuX2ZyZWVfbWFwKHN0cnVjdCBhZGZzX3NiX2luZm8gKmFzYiwgc3RydWN0IGFkZnNfZGlzY21hcCAqZG0pCit7CisJY29uc3QgdW5zaWduZWQgaW50IG1hcHNpemUgPSBkbS0+ZG1fZW5kYml0ICsgMzI7CisJY29uc3QgdW5zaWduZWQgaW50IGlkbGVuICA9IGFzYi0+c19pZGxlbjsKKwljb25zdCB1bnNpZ25lZCBpbnQgZnJhZ19pZGxlbiA9IGlkbGVuIDw9IDE1ID8gaWRsZW4gOiAxNTsKKwljb25zdCB1MzIgaWRtYXNrID0gKDEgPDwgZnJhZ19pZGxlbikgLSAxOworCXVuc2lnbmVkIGNoYXIgKm1hcCA9IGRtLT5kbV9iaC0+Yl9kYXRhOworCXVuc2lnbmVkIGludCBzdGFydCA9IDgsIG1hcHB0cjsKKwl1MzIgZnJhZzsKKwl1bnNpZ25lZCBsb25nIHRvdGFsID0gMDsKKworCS8qCisJICogZ2V0IGZyYWdtZW50IGlkCisJICovCisJZnJhZyA9IEdFVF9GUkFHX0lEKG1hcCwgc3RhcnQsIGlkbWFzayk7CisKKwkvKgorCSAqIElmIHRoZSBmcmVlbGluayBpcyBudWxsLCB0aGVuIG5vIGZyZWUgZnJhZ21lbnRzCisJICogZXhpc3QgaW4gdGhpcyB6b25lLgorCSAqLworCWlmIChmcmFnID09IDApCisJCXJldHVybiAwOworCisJZG8geworCQlzdGFydCArPSBmcmFnOworCisJCS8qCisJCSAqIGdldCBmcmFnbWVudCBpZAorCQkgKi8KKwkJZnJhZyA9IEdFVF9GUkFHX0lEKG1hcCwgc3RhcnQsIGlkbWFzayk7CisJCW1hcHB0ciA9IHN0YXJ0ICsgaWRsZW47CisKKwkJLyoKKwkJICogZmluZCBlbmQgb2YgZnJhZ21lbnQKKwkJICovCisJCXsKKwkJCV9fbGUzMiAqX21hcCA9IChfX2xlMzIgKiltYXA7CisJCQl1MzIgdiA9IGxlMzJfdG9fY3B1KF9tYXBbbWFwcHRyID4+IDVdKSA+PiAobWFwcHRyICYgMzEpOworCQkJd2hpbGUgKHYgPT0gMCkgeworCQkJCW1hcHB0ciA9IChtYXBwdHIgJiB+MzEpICsgMzI7CisJCQkJaWYgKG1hcHB0ciA+PSBtYXBzaXplKQorCQkJCQlnb3RvIGVycm9yOworCQkJCXYgPSBsZTMyX3RvX2NwdShfbWFwW21hcHB0ciA+PiA1XSk7CisJCQl9CisKKwkJCW1hcHB0ciArPSAxICsgZmZ6KH52KTsKKwkJfQorCisJCXRvdGFsICs9IG1hcHB0ciAtIHN0YXJ0OworCX0gd2hpbGUgKGZyYWcgPj0gaWRsZW4gKyAxKTsKKworCWlmIChmcmFnICE9IDApCisJCXByaW50ayhLRVJOX0VSUiAiYWRmczogdW5kZXJzaXplZCBmcmVlIGZyYWdtZW50XG4iKTsKKworCXJldHVybiB0b3RhbDsKK2Vycm9yOgorCXByaW50ayhLRVJOX0VSUiAiYWRmczogb3ZlcnNpemVkIGZyZWUgZnJhZ21lbnRcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzY2FuX21hcChzdHJ1Y3QgYWRmc19zYl9pbmZvICphc2IsIHVuc2lnbmVkIGludCB6b25lLAorCSBjb25zdCB1bnNpZ25lZCBpbnQgZnJhZ19pZCwgdW5zaWduZWQgaW50IG1hcG9mZikKK3sKKwljb25zdCB1bnNpZ25lZCBpbnQgaWRsZW4gPSBhc2ItPnNfaWRsZW47CisJc3RydWN0IGFkZnNfZGlzY21hcCAqZG0sICpkbV9lbmQ7CisJaW50IHJlc3VsdDsKKworCWRtCT0gYXNiLT5zX21hcCArIHpvbmU7CisJem9uZQk9IGFzYi0+c19tYXBfc2l6ZTsKKwlkbV9lbmQJPSBhc2ItPnNfbWFwICsgem9uZTsKKworCWRvIHsKKwkJcmVzdWx0ID0gbG9va3VwX3pvbmUoZG0sIGlkbGVuLCBmcmFnX2lkLCAmbWFwb2ZmKTsKKworCQlpZiAocmVzdWx0ICE9IC0xKQorCQkJZ290byBmb3VuZDsKKworCQlkbSArKzsKKwkJaWYgKGRtID09IGRtX2VuZCkKKwkJCWRtID0gYXNiLT5zX21hcDsKKwl9IHdoaWxlICgtLXpvbmUgPiAwKTsKKworCXJldHVybiAtMTsKK2ZvdW5kOgorCXJlc3VsdCAtPSBkbS0+ZG1fc3RhcnRiaXQ7CisJcmVzdWx0ICs9IGRtLT5kbV9zdGFydGJsazsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBjYWxjdWxhdGUgdGhlIGFtb3VudCBvZiBmcmVlIGJsb2NrcyBpbiB0aGUgbWFwLgorICoKKyAqICAgICAgICAgICAgICBuPTEKKyAqICB0b3RhbF9mcmVlID0gRShmcmVlX2luX3pvbmVfbikKKyAqICAgICAgICAgICAgICBuem9uZXMKKyAqLwordW5zaWduZWQgaW50CithZGZzX21hcF9mcmVlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGFkZnNfc2JfaW5mbyAqYXNiID0gQURGU19TQihzYik7CisJc3RydWN0IGFkZnNfZGlzY21hcCAqZG07CisJdW5zaWduZWQgaW50IHRvdGFsID0gMDsKKwl1bnNpZ25lZCBpbnQgem9uZTsKKworCWRtICAgPSBhc2ItPnNfbWFwOworCXpvbmUgPSBhc2ItPnNfbWFwX3NpemU7CisKKwlkbyB7CisJCXRvdGFsICs9IHNjYW5fZnJlZV9tYXAoYXNiLCBkbSsrKTsKKwl9IHdoaWxlICgtLXpvbmUgPiAwKTsKKworCXJldHVybiBzaWduZWRfYXNsKHRvdGFsLCBhc2ItPnNfbWFwMmJsayk7Cit9CisKK2ludAorYWRmc19tYXBfbG9va3VwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGludCBmcmFnX2lkLAorCQl1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCXN0cnVjdCBhZGZzX3NiX2luZm8gKmFzYiA9IEFERlNfU0Ioc2IpOworCXVuc2lnbmVkIGludCB6b25lLCBtYXBvZmY7CisJaW50IHJlc3VsdDsKKworCS8qCisJICogbWFwICYgcm9vdCBmcmFnbWVudCBpcyBzcGVjaWFsIC0gaXQgc3RhcnRzIGluIHRoZSBjZW50ZXIgb2YgdGhlCisJICogZGlzay4gIFRoZSBvdGhlciBmcmFnbWVudHMgc3RhcnQgYXQgem9uZSAoZnJhZyAvIGlkc19wZXJfem9uZSkKKwkgKi8KKwlpZiAoZnJhZ19pZCA9PSBBREZTX1JPT1RfRlJBRykKKwkJem9uZSA9IGFzYi0+c19tYXBfc2l6ZSA+PiAxOworCWVsc2UKKwkJem9uZSA9IGZyYWdfaWQgLyBhc2ItPnNfaWRzX3Blcl96b25lOworCisJaWYgKHpvbmUgPj0gYXNiLT5zX21hcF9zaXplKQorCQlnb3RvIGJhZF9mcmFnbWVudDsKKworCS8qIENvbnZlcnQgc2VjdG9yIG9mZnNldCB0byBtYXAgb2Zmc2V0ICovCisJbWFwb2ZmID0gc2lnbmVkX2FzbChvZmZzZXQsIC1hc2ItPnNfbWFwMmJsayk7CisKKwlyZWFkX2xvY2soJmFkZnNfbWFwX2xvY2spOworCXJlc3VsdCA9IHNjYW5fbWFwKGFzYiwgem9uZSwgZnJhZ19pZCwgbWFwb2ZmKTsKKwlyZWFkX3VubG9jaygmYWRmc19tYXBfbG9jayk7CisKKwlpZiAocmVzdWx0ID4gMCkgeworCQl1bnNpZ25lZCBpbnQgc2Vjb2ZmOworCisJCS8qIENhbGN1bGF0ZSBzZWN0b3Igb2Zmc2V0IGludG8gbWFwIGJsb2NrICovCisJCXNlY29mZiA9IG9mZnNldCAtIHNpZ25lZF9hc2wobWFwb2ZmLCBhc2ItPnNfbWFwMmJsayk7CisJCXJldHVybiBzZWNvZmYgKyBzaWduZWRfYXNsKHJlc3VsdCwgYXNiLT5zX21hcDJibGspOworCX0KKworCWFkZnNfZXJyb3Ioc2IsICJmcmFnbWVudCAweCUwNHggYXQgb2Zmc2V0ICVkIG5vdCBmb3VuZCBpbiBtYXAiLAorCQkgICBmcmFnX2lkLCBvZmZzZXQpOworCXJldHVybiAwOworCitiYWRfZnJhZ21lbnQ6CisJYWRmc19lcnJvcihzYiwgImludmFsaWQgZnJhZ21lbnQgMHglMDR4ICh6b25lID0gJWQsIG1heCA9ICVkKSIsCisJCSAgIGZyYWdfaWQsIHpvbmUsIGFzYi0+c19tYXBfc2l6ZSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy9hZGZzL3N1cGVyLmMgYi9mcy9hZGZzL3N1cGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQzOTYzMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2FkZnMvc3VwZXIuYwpAQCAtMCwwICsxLDUwOCBAQAorLyoKKyAqICBsaW51eC9mcy9hZGZzL3N1cGVyLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3LTE5OTkgUnVzc2VsbCBLaW5nCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9hZGZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjaW5jbHVkZSAiYWRmcy5oIgorI2luY2x1ZGUgImRpcl9mLmgiCisjaW5jbHVkZSAiZGlyX2ZwbHVzLmgiCisKK3ZvaWQgX19hZGZzX2Vycm9yKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKmZ1bmN0aW9uLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwljaGFyIGVycm9yX2J1ZlsxMjhdOworCXZhX2xpc3QgYXJnczsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJdnNwcmludGYoZXJyb3JfYnVmLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKworCXByaW50ayhLRVJOX0NSSVQgIkFERlMtZnMgZXJyb3IgKGRldmljZSAlcyklcyVzOiAlc1xuIiwKKwkJc2ItPnNfaWQsIGZ1bmN0aW9uID8gIjogIiA6ICIiLAorCQlmdW5jdGlvbiA/IGZ1bmN0aW9uIDogIiIsIGVycm9yX2J1Zik7Cit9CisKK3N0YXRpYyBpbnQgYWRmc19jaGVja2Rpc2NyZWNvcmQoc3RydWN0IGFkZnNfZGlzY3JlY29yZCAqZHIpCit7CisJaW50IGk7CisKKwkvKiBzZWN0b3Igc2l6ZSBtdXN0IGJlIDI1NiwgNTEyIG9yIDEwMjQgYnl0ZXMgKi8KKwlpZiAoZHItPmxvZzJzZWNzaXplICE9IDggJiYKKwkgICAgZHItPmxvZzJzZWNzaXplICE9IDkgJiYKKwkgICAgZHItPmxvZzJzZWNzaXplICE9IDEwKQorCQlyZXR1cm4gMTsKKworCS8qIGlkbGVuIG11c3QgYmUgYXQgbGVhc3QgbG9nMnNlY3NpemUgKyAzICovCisJaWYgKGRyLT5pZGxlbiA8IGRyLT5sb2cyc2Vjc2l6ZSArIDMpCisJCXJldHVybiAxOworCisJLyogd2UgY2Fubm90IGhhdmUgc3VjaCBhIGxhcmdlIGRpc2MgdGhhdCB3ZQorCSAqIGFyZSB1bmFibGUgdG8gcmVwcmVzZW50IHNlY3RvciBvZmZzZXRzIGluCisJICogMzIgYml0cy4gIFRoaXMgd29ya3Mgb3V0IGF0IDIuMCBUQi4KKwkgKi8KKwlpZiAobGUzMl90b19jcHUoZHItPmRpc2Nfc2l6ZV9oaWdoKSA+PiBkci0+bG9nMnNlY3NpemUpCisJCXJldHVybiAxOworCisJLyogaWRsZW4gbXVzdCBiZSBubyBncmVhdGVyIHRoYW4gMTkgdjIgWzEuMF0gKi8KKwlpZiAoZHItPmlkbGVuID4gMTkpCisJCXJldHVybiAxOworCisJLyogcmVzZXJ2ZWQgYnl0ZXMgc2hvdWxkIGJlIHplcm8gKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGRyLT51bnVzZWQ1Mik7IGkrKykKKwkJaWYgKGRyLT51bnVzZWQ1MltpXSAhPSAwKQorCQkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYWRmc19jYWxjem9uZWNoZWNrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGNoYXIgKm1hcCkKK3sKKwl1bnNpZ25lZCBpbnQgdjAsIHYxLCB2MiwgdjM7CisJaW50IGk7CisKKwl2MCA9IHYxID0gdjIgPSB2MyA9IDA7CisJZm9yIChpID0gc2ItPnNfYmxvY2tzaXplIC0gNDsgaTsgaSAtPSA0KSB7CisJCXYwICs9IG1hcFtpXSAgICAgKyAodjMgPj4gOCk7CisJCXYzICY9IDB4ZmY7CisJCXYxICs9IG1hcFtpICsgMV0gKyAodjAgPj4gOCk7CisJCXYwICY9IDB4ZmY7CisJCXYyICs9IG1hcFtpICsgMl0gKyAodjEgPj4gOCk7CisJCXYxICY9IDB4ZmY7CisJCXYzICs9IG1hcFtpICsgM10gKyAodjIgPj4gOCk7CisJCXYyICY9IDB4ZmY7CisJfQorCXYwICs9ICAgICAgICAgICB2MyA+PiA4OworCXYxICs9IG1hcFsxXSArICh2MCA+PiA4KTsKKwl2MiArPSBtYXBbMl0gKyAodjEgPj4gOCk7CisJdjMgKz0gbWFwWzNdICsgKHYyID4+IDgpOworCisJcmV0dXJuIHYwIF4gdjEgXiB2MiBeIHYzOworfQorCitzdGF0aWMgaW50IGFkZnNfY2hlY2ttYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGFkZnNfZGlzY21hcCAqZG0pCit7CisJdW5zaWduZWQgY2hhciBjcm9zc2NoZWNrID0gMCwgem9uZWNoZWNrID0gMTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBREZTX1NCKHNiKS0+c19tYXBfc2l6ZTsgaSsrKSB7CisJCXVuc2lnbmVkIGNoYXIgKm1hcDsKKworCQltYXAgPSBkbVtpXS5kbV9iaC0+Yl9kYXRhOworCisJCWlmIChhZGZzX2NhbGN6b25lY2hlY2soc2IsIG1hcCkgIT0gbWFwWzBdKSB7CisJCQlhZGZzX2Vycm9yKHNiLCAiem9uZSAlZCBmYWlscyB6b25lY2hlY2siLCBpKTsKKwkJCXpvbmVjaGVjayA9IDA7CisJCX0KKwkJY3Jvc3NjaGVjayBePSBtYXBbM107CisJfQorCWlmIChjcm9zc2NoZWNrICE9IDB4ZmYpCisJCWFkZnNfZXJyb3Ioc2IsICJjcm9zc2NoZWNrICE9IDB4ZmYiKTsKKwlyZXR1cm4gY3Jvc3NjaGVjayA9PSAweGZmICYmIHpvbmVjaGVjazsKK30KKworc3RhdGljIHZvaWQgYWRmc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYWRmc19zYl9pbmZvICphc2IgPSBBREZTX1NCKHNiKTsKKworCWZvciAoaSA9IDA7IGkgPCBhc2ItPnNfbWFwX3NpemU7IGkrKykKKwkJYnJlbHNlKGFzYi0+c19tYXBbaV0uZG1fYmgpOworCWtmcmVlKGFzYi0+c19tYXApOworCWtmcmVlKGFzYik7CisJc2ItPnNfZnNfaW5mbyA9IE5VTEw7Cit9CisKK2VudW0ge09wdF91aWQsIE9wdF9naWQsIE9wdF9vd25tYXNrLCBPcHRfb3RobWFzaywgT3B0X2Vycn07CisKK3N0YXRpYyBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKKwl7T3B0X3VpZCwgInVpZD0ldSJ9LAorCXtPcHRfZ2lkLCAiZ2lkPSV1In0sCisJe09wdF9vd25tYXNrLCAib3dubWFzaz0lbyJ9LAorCXtPcHRfb3RobWFzaywgIm90aG1hc2s9JW8ifSwKKwl7T3B0X2VyciwgTlVMTH0KK307CisKK3N0YXRpYyBpbnQgcGFyc2Vfb3B0aW9ucyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjaGFyICpvcHRpb25zKQoreworCWNoYXIgKnA7CisJc3RydWN0IGFkZnNfc2JfaW5mbyAqYXNiID0gQURGU19TQihzYik7CisJaW50IG9wdGlvbjsKKworCWlmICghb3B0aW9ucykKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAoKHAgPSBzdHJzZXAoJm9wdGlvbnMsICIsIikpICE9IE5VTEwpIHsKKwkJc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOworCQlpbnQgdG9rZW47CisJCWlmICghKnApCisJCQljb250aW51ZTsKKworCQl0b2tlbiA9IG1hdGNoX3Rva2VuKHAsIHRva2VucywgYXJncyk7CisJCXN3aXRjaCAodG9rZW4pIHsKKwkJY2FzZSBPcHRfdWlkOgorCQkJaWYgKG1hdGNoX2ludChhcmdzLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWFzYi0+c191aWQgPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZ2lkOgorCQkJaWYgKG1hdGNoX2ludChhcmdzLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWFzYi0+c19naWQgPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfb3dubWFzazoKKwkJCWlmIChtYXRjaF9vY3RhbChhcmdzLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWFzYi0+c19vd25lcl9tYXNrID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X290aG1hc2s6CisJCQlpZiAobWF0Y2hfb2N0YWwoYXJncywgJm9wdGlvbikpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlhc2ItPnNfb3RoZXJfbWFzayA9IG9wdGlvbjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKCJBREZTLWZzOiB1bnJlY29nbmlzZWQgbW91bnQgb3B0aW9uIFwiJXNcIiAiCisJCQkJCSJvciBtaXNzaW5nIHZhbHVlXG4iLCBwKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkZnNfcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpkYXRhKQoreworCSpmbGFncyB8PSBNU19OT0RJUkFUSU1FOworCXJldHVybiBwYXJzZV9vcHRpb25zKHNiLCBkYXRhKTsKK30KKworc3RhdGljIGludCBhZGZzX3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQoreworCXN0cnVjdCBhZGZzX3NiX2luZm8gKmFzYiA9IEFERlNfU0Ioc2IpOworCisJYnVmLT5mX3R5cGUgICAgPSBBREZTX1NVUEVSX01BR0lDOworCWJ1Zi0+Zl9uYW1lbGVuID0gYXNiLT5zX25hbWVsZW47CisJYnVmLT5mX2JzaXplICAgPSBzYi0+c19ibG9ja3NpemU7CisJYnVmLT5mX2Jsb2NrcyAgPSBhc2ItPnNfc2l6ZTsKKwlidWYtPmZfZmlsZXMgICA9IGFzYi0+c19pZHNfcGVyX3pvbmUgKiBhc2ItPnNfbWFwX3NpemU7CisJYnVmLT5mX2JhdmFpbCAgPQorCWJ1Zi0+Zl9iZnJlZSAgID0gYWRmc19tYXBfZnJlZShzYik7CisJYnVmLT5mX2ZmcmVlICAgPSAobG9uZykoYnVmLT5mX2JmcmVlICogYnVmLT5mX2ZpbGVzKSAvIChsb25nKWJ1Zi0+Zl9ibG9ja3M7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGttZW1fY2FjaGVfdCAqYWRmc19pbm9kZV9jYWNoZXA7CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmFkZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgYWRmc19pbm9kZV9pbmZvICplaTsKKwllaSA9IChzdHJ1Y3QgYWRmc19pbm9kZV9pbmZvICopa21lbV9jYWNoZV9hbGxvYyhhZGZzX2lub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCWlmICghZWkpCisJCXJldHVybiBOVUxMOworCXJldHVybiAmZWktPnZmc19pbm9kZTsKK30KKworc3RhdGljIHZvaWQgYWRmc19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJa21lbV9jYWNoZV9mcmVlKGFkZnNfaW5vZGVfY2FjaGVwLCBBREZTX0koaW5vZGUpKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKiBmb28sIGttZW1fY2FjaGVfdCAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgYWRmc19pbm9kZV9pbmZvICplaSA9IChzdHJ1Y3QgYWRmc19pbm9kZV9pbmZvICopIGZvbzsKKworCWlmICgoZmxhZ3MgJiAoU0xBQl9DVE9SX1ZFUklGWXxTTEFCX0NUT1JfQ09OU1RSVUNUT1IpKSA9PQorCSAgICBTTEFCX0NUT1JfQ09OU1RSVUNUT1IpCisJCWlub2RlX2luaXRfb25jZSgmZWktPnZmc19pbm9kZSk7Cit9CisgCitzdGF0aWMgaW50IGluaXRfaW5vZGVjYWNoZSh2b2lkKQoreworCWFkZnNfaW5vZGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoImFkZnNfaW5vZGVfY2FjaGUiLAorCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgYWRmc19pbm9kZV9pbmZvKSwKKwkJCQkJICAgICAwLCBTTEFCX1JFQ0xBSU1fQUNDT1VOVCwKKwkJCQkJICAgICBpbml0X29uY2UsIE5VTEwpOworCWlmIChhZGZzX2lub2RlX2NhY2hlcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGVzdHJveV9pbm9kZWNhY2hlKHZvaWQpCit7CisJaWYgKGttZW1fY2FjaGVfZGVzdHJveShhZGZzX2lub2RlX2NhY2hlcCkpCisJCXByaW50ayhLRVJOX0lORk8gImFkZnNfaW5vZGVfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGFkZnNfc29wcyA9IHsKKwkuYWxsb2NfaW5vZGUJPSBhZGZzX2FsbG9jX2lub2RlLAorCS5kZXN0cm95X2lub2RlCT0gYWRmc19kZXN0cm95X2lub2RlLAorCS53cml0ZV9pbm9kZQk9IGFkZnNfd3JpdGVfaW5vZGUsCisJLnB1dF9zdXBlcgk9IGFkZnNfcHV0X3N1cGVyLAorCS5zdGF0ZnMJCT0gYWRmc19zdGF0ZnMsCisJLnJlbW91bnRfZnMJPSBhZGZzX3JlbW91bnQsCit9OworCitzdGF0aWMgc3RydWN0IGFkZnNfZGlzY21hcCAqYWRmc19yZWFkX21hcChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgYWRmc19kaXNjcmVjb3JkICpkcikKK3sKKwlzdHJ1Y3QgYWRmc19kaXNjbWFwICpkbTsKKwl1bnNpZ25lZCBpbnQgbWFwX2FkZHIsIHpvbmVfc2l6ZSwgbnpvbmVzOworCWludCBpLCB6b25lOworCXN0cnVjdCBhZGZzX3NiX2luZm8gKmFzYiA9IEFERlNfU0Ioc2IpOworCisJbnpvbmVzICAgID0gYXNiLT5zX21hcF9zaXplOworCXpvbmVfc2l6ZSA9ICg4IDw8IGRyLT5sb2cyc2Vjc2l6ZSkgLSBsZTE2X3RvX2NwdShkci0+em9uZV9zcGFyZSk7CisJbWFwX2FkZHIgID0gKG56b25lcyA+PiAxKSAqIHpvbmVfc2l6ZSAtCisJCSAgICAgKChuem9uZXMgPiAxKSA/IEFERlNfRFJfU0laRV9CSVRTIDogMCk7CisJbWFwX2FkZHIgID0gc2lnbmVkX2FzbChtYXBfYWRkciwgYXNiLT5zX21hcDJibGspOworCisJYXNiLT5zX2lkc19wZXJfem9uZSA9IHpvbmVfc2l6ZSAvIChhc2ItPnNfaWRsZW4gKyAxKTsKKworCWRtID0ga21hbGxvYyhuem9uZXMgKiBzaXplb2YoKmRtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRtID09IE5VTEwpIHsKKwkJYWRmc19lcnJvcihzYiwgIm5vdCBlbm91Z2ggbWVtb3J5Iik7CisJCXJldHVybiBOVUxMOworCX0KKworCWZvciAoem9uZSA9IDA7IHpvbmUgPCBuem9uZXM7IHpvbmUrKywgbWFwX2FkZHIrKykgeworCQlkbVt6b25lXS5kbV9zdGFydGJpdCA9IDA7CisJCWRtW3pvbmVdLmRtX2VuZGJpdCAgID0gem9uZV9zaXplOworCQlkbVt6b25lXS5kbV9zdGFydGJsayA9IHpvbmUgKiB6b25lX3NpemUgLSBBREZTX0RSX1NJWkVfQklUUzsKKwkJZG1bem9uZV0uZG1fYmggICAgICAgPSBzYl9icmVhZChzYiwgbWFwX2FkZHIpOworCisJCWlmICghZG1bem9uZV0uZG1fYmgpIHsKKwkJCWFkZnNfZXJyb3Ioc2IsICJ1bmFibGUgdG8gcmVhZCBtYXAiKTsKKwkJCWdvdG8gZXJyb3JfZnJlZTsKKwkJfQorCX0KKworCS8qIGFkanVzdCB0aGUgbGltaXRzIGZvciB0aGUgZmlyc3QgYW5kIGxhc3QgbWFwIHpvbmVzICovCisJaSA9IHpvbmUgLSAxOworCWRtWzBdLmRtX3N0YXJ0YmxrID0gMDsKKwlkbVswXS5kbV9zdGFydGJpdCA9IEFERlNfRFJfU0laRV9CSVRTOworCWRtW2ldLmRtX2VuZGJpdCAgID0gKGxlMzJfdG9fY3B1KGRyLT5kaXNjX3NpemVfaGlnaCkgPDwgKDMyIC0gZHItPmxvZzJicG1iKSkgKworCQkJICAgIChsZTMyX3RvX2NwdShkci0+ZGlzY19zaXplKSA+PiBkci0+bG9nMmJwbWIpICsKKwkJCSAgICAoQURGU19EUl9TSVpFX0JJVFMgLSBpICogem9uZV9zaXplKTsKKworCWlmIChhZGZzX2NoZWNrbWFwKHNiLCBkbSkpCisJCXJldHVybiBkbTsKKworCWFkZnNfZXJyb3Ioc2IsIE5VTEwsICJtYXAgY29ycnVwdGVkIik7CisKK2Vycm9yX2ZyZWU6CisJd2hpbGUgKC0tem9uZSA+PSAwKQorCQlicmVsc2UoZG1bem9uZV0uZG1fYmgpOworCisJa2ZyZWUoZG0pOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYWRmc19kaXNjc2l6ZShzdHJ1Y3QgYWRmc19kaXNjcmVjb3JkICpkciwgaW50IGJsb2NrX2JpdHMpCit7CisJdW5zaWduZWQgbG9uZyBkaXNjc2l6ZTsKKworCWRpc2NzaXplICA9IGxlMzJfdG9fY3B1KGRyLT5kaXNjX3NpemVfaGlnaCkgPDwgKDMyIC0gYmxvY2tfYml0cyk7CisJZGlzY3NpemUgfD0gbGUzMl90b19jcHUoZHItPmRpc2Nfc2l6ZSkgPj4gYmxvY2tfYml0czsKKworCXJldHVybiBkaXNjc2l6ZTsKK30KKworc3RhdGljIGludCBhZGZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgYWRmc19kaXNjcmVjb3JkICpkcjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBvYmplY3RfaW5mbyByb290X29iajsKKwl1bnNpZ25lZCBjaGFyICpiX2RhdGE7CisJc3RydWN0IGFkZnNfc2JfaW5mbyAqYXNiOworCXN0cnVjdCBpbm9kZSAqcm9vdDsKKworCXNiLT5zX2ZsYWdzIHw9IE1TX05PRElSQVRJTUU7CisKKwlhc2IgPSBrbWFsbG9jKHNpemVvZigqYXNiKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhc2IpCisJCXJldHVybiAtRU5PTUVNOworCXNiLT5zX2ZzX2luZm8gPSBhc2I7CisJbWVtc2V0KGFzYiwgMCwgc2l6ZW9mKCphc2IpKTsKKworCS8qIHNldCBkZWZhdWx0IG9wdGlvbnMgKi8KKwlhc2ItPnNfdWlkID0gMDsKKwlhc2ItPnNfZ2lkID0gMDsKKwlhc2ItPnNfb3duZXJfbWFzayA9IFNfSVJXWFU7CisJYXNiLT5zX290aGVyX21hc2sgPSBTX0lSV1hHIHwgU19JUldYTzsKKworCWlmIChwYXJzZV9vcHRpb25zKHNiLCBkYXRhKSkKKwkJZ290byBlcnJvcjsKKworCXNiX3NldF9ibG9ja3NpemUoc2IsIEJMT0NLX1NJWkUpOworCWlmICghKGJoID0gc2JfYnJlYWQoc2IsIEFERlNfRElTQ1JFQ09SRCAvIEJMT0NLX1NJWkUpKSkgeworCQlhZGZzX2Vycm9yKHNiLCAidW5hYmxlIHRvIHJlYWQgc3VwZXJibG9jayIpOworCQlnb3RvIGVycm9yOworCX0KKworCWJfZGF0YSA9IGJoLT5iX2RhdGEgKyAoQURGU19ESVNDUkVDT1JEICUgQkxPQ0tfU0laRSk7CisKKwlpZiAoYWRmc19jaGVja2JibGsoYl9kYXRhKSkgeworCQlpZiAoIXNpbGVudCkKKwkJCXByaW50aygiVkZTOiBDYW4ndCBmaW5kIGFuIGFkZnMgZmlsZXN5c3RlbSBvbiBkZXYgIgorCQkJCSIlcy5cbiIsIHNiLT5zX2lkKTsKKwkJZ290byBlcnJvcl9mcmVlX2JoOworCX0KKworCWRyID0gKHN0cnVjdCBhZGZzX2Rpc2NyZWNvcmQgKikoYl9kYXRhICsgQURGU19EUl9PRkZTRVQpOworCisJLyoKKwkgKiBEbyBzb21lIHNhbml0eSBjaGVja3Mgb24gdGhlIEFERlMgZGlzYyByZWNvcmQKKwkgKi8KKwlpZiAoYWRmc19jaGVja2Rpc2NyZWNvcmQoZHIpKSB7CisJCWlmICghc2lsZW50KQorCQkJcHJpbnRrKCJWUFM6IENhbid0IGZpbmQgYW4gYWRmcyBmaWxlc3lzdGVtIG9uIGRldiAiCisJCQkJIiVzLlxuIiwgc2ItPnNfaWQpOworCQlnb3RvIGVycm9yX2ZyZWVfYmg7CisJfQorCisJYnJlbHNlKGJoKTsKKwlpZiAoc2Jfc2V0X2Jsb2Nrc2l6ZShzYiwgMSA8PCBkci0+bG9nMnNlY3NpemUpKSB7CisJCWJoID0gc2JfYnJlYWQoc2IsIEFERlNfRElTQ1JFQ09SRCAvIHNiLT5zX2Jsb2Nrc2l6ZSk7CisJCWlmICghYmgpIHsKKwkJCWFkZnNfZXJyb3Ioc2IsICJjb3VsZG4ndCByZWFkIHN1cGVyYmxvY2sgb24gIgorCQkJCSIybmQgdHJ5LiIpOworCQkJZ290byBlcnJvcjsKKwkJfQorCQliX2RhdGEgPSBiaC0+Yl9kYXRhICsgKEFERlNfRElTQ1JFQ09SRCAlIHNiLT5zX2Jsb2Nrc2l6ZSk7CisJCWlmIChhZGZzX2NoZWNrYmJsayhiX2RhdGEpKSB7CisJCQlhZGZzX2Vycm9yKHNiLCAiZGlzYyByZWNvcmQgbWlzbWF0Y2gsIHZlcnkgd2VpcmQhIik7CisJCQlnb3RvIGVycm9yX2ZyZWVfYmg7CisJCX0KKwkJZHIgPSAoc3RydWN0IGFkZnNfZGlzY3JlY29yZCAqKShiX2RhdGEgKyBBREZTX0RSX09GRlNFVCk7CisJfSBlbHNlIHsKKwkJaWYgKCFzaWxlbnQpCisJCQlwcmludGsoS0VSTl9FUlIgIlZGUzogVW5zdXBwb3J0ZWQgYmxvY2tzaXplIG9uIGRldiAiCisJCQkJIiVzLlxuIiwgc2ItPnNfaWQpOworCQlnb3RvIGVycm9yOworCX0KKworCS8qCisJICogYmxvY2tzaXplIG9uIHRoaXMgZGV2aWNlIHNob3VsZCBub3cgYmUgc2V0IHRvIHRoZSBBREZTIGxvZzJzZWNzaXplCisJICovCisKKwlzYi0+c19tYWdpYwkJPSBBREZTX1NVUEVSX01BR0lDOworCWFzYi0+c19pZGxlbgkJPSBkci0+aWRsZW47CisJYXNiLT5zX21hcF9zaXplCQk9IGRyLT5uem9uZXMgfCAoZHItPm56b25lc19oaWdoIDw8IDgpOworCWFzYi0+c19tYXAyYmxrCQk9IGRyLT5sb2cyYnBtYiAtIGRyLT5sb2cyc2Vjc2l6ZTsKKwlhc2ItPnNfc2l6ZSAgICAJCT0gYWRmc19kaXNjc2l6ZShkciwgc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCWFzYi0+c192ZXJzaW9uIAkJPSBkci0+Zm9ybWF0X3ZlcnNpb247CisJYXNiLT5zX2xvZzJzaGFyZXNpemUJPSBkci0+bG9nMnNoYXJlc2l6ZTsKKwkKKwlhc2ItPnNfbWFwID0gYWRmc19yZWFkX21hcChzYiwgZHIpOworCWlmICghYXNiLT5zX21hcCkKKwkJZ290byBlcnJvcl9mcmVlX2JoOworCisJYnJlbHNlKGJoKTsKKworCS8qCisJICogc2V0IHVwIGVub3VnaCBzbyB0aGF0IHdlIGNhbiByZWFkIGFuIGlub2RlCisJICovCisJc2ItPnNfb3AgPSAmYWRmc19zb3BzOworCisJZHIgPSAoc3RydWN0IGFkZnNfZGlzY3JlY29yZCAqKShhc2ItPnNfbWFwWzBdLmRtX2JoLT5iX2RhdGEgKyA0KTsKKworCXJvb3Rfb2JqLnBhcmVudF9pZCA9IHJvb3Rfb2JqLmZpbGVfaWQgPSBsZTMyX3RvX2NwdShkci0+cm9vdCk7CisJcm9vdF9vYmoubmFtZV9sZW4gID0gMDsKKwlyb290X29iai5sb2FkYWRkciAgPSAwOworCXJvb3Rfb2JqLmV4ZWNhZGRyICA9IDA7CisJcm9vdF9vYmouc2l6ZQkgICA9IEFERlNfTkVXRElSX1NJWkU7CisJcm9vdF9vYmouYXR0cgkgICA9IEFERlNfTkRBX0RJUkVDVE9SWSAgIHwgQURGU19OREFfT1dORVJfUkVBRCB8CisJCQkgICAgIEFERlNfTkRBX09XTkVSX1dSSVRFIHwgQURGU19OREFfUFVCTElDX1JFQUQ7CisKKwkvKgorCSAqIElmIHRoaXMgaXMgYSBGKyBkaXNrIHdpdGggdmFyaWFibGUgbGVuZ3RoIGRpcmVjdG9yaWVzLAorCSAqIGdldCB0aGUgcm9vdF9zaXplIGZyb20gdGhlIGRpc2MgcmVjb3JkLgorCSAqLworCWlmIChhc2ItPnNfdmVyc2lvbikgeworCQlyb290X29iai5zaXplID0gbGUzMl90b19jcHUoZHItPnJvb3Rfc2l6ZSk7CisJCWFzYi0+c19kaXIgICAgID0gJmFkZnNfZnBsdXNfZGlyX29wczsKKwkJYXNiLT5zX25hbWVsZW4gPSBBREZTX0ZQTFVTX05BTUVfTEVOOworCX0gZWxzZSB7CisJCWFzYi0+c19kaXIgICAgID0gJmFkZnNfZl9kaXJfb3BzOworCQlhc2ItPnNfbmFtZWxlbiA9IEFERlNfRl9OQU1FX0xFTjsKKwl9CisKKwlyb290ID0gYWRmc19pZ2V0KHNiLCAmcm9vdF9vYmopOworCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdCk7CisJaWYgKCFzYi0+c19yb290KSB7CisJCWludCBpOworCQlpcHV0KHJvb3QpOworCQlmb3IgKGkgPSAwOyBpIDwgYXNiLT5zX21hcF9zaXplOyBpKyspCisJCQlicmVsc2UoYXNiLT5zX21hcFtpXS5kbV9iaCk7CisJCWtmcmVlKGFzYi0+c19tYXApOworCQlhZGZzX2Vycm9yKHNiLCAiZ2V0IHJvb3QgaW5vZGUgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJvcjsKKwl9IGVsc2UKKwkJc2ItPnNfcm9vdC0+ZF9vcCA9ICZhZGZzX2RlbnRyeV9vcGVyYXRpb25zOworCXJldHVybiAwOworCitlcnJvcl9mcmVlX2JoOgorCWJyZWxzZShiaCk7CitlcnJvcjoKKwlzYi0+c19mc19pbmZvID0gTlVMTDsKKwlrZnJlZShhc2IpOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICphZGZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoreworCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIGFkZnNfZmlsbF9zdXBlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBhZGZzX2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJhZGZzIiwKKwkuZ2V0X3NiCQk9IGFkZnNfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9ibG9ja19zdXBlciwKKwkuZnNfZmxhZ3MJPSBGU19SRVFVSVJFU19ERVYsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2FkZnNfZnModm9pZCkKK3sKKwlpbnQgZXJyID0gaW5pdF9pbm9kZWNhY2hlKCk7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCWVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmFkZnNfZnNfdHlwZSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJcmV0dXJuIDA7CitvdXQ6CisJZGVzdHJveV9pbm9kZWNhY2hlKCk7CitvdXQxOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2FkZnNfZnModm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmFkZnNfZnNfdHlwZSk7CisJZGVzdHJveV9pbm9kZWNhY2hlKCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfYWRmc19mcykKK21vZHVsZV9leGl0KGV4aXRfYWRmc19mcykKZGlmZiAtLWdpdCBhL2ZzL2FmZnMvQ2hhbmdlcyBiL2ZzL2FmZnMvQ2hhbmdlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjk0MDljCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZmcy9DaGFuZ2VzCkBAIC0wLDAgKzEsMzQzIEBACisoTm90ZTogSSBjb25zaWRlciB2ZXJzaW9uIG51bWJlcnMgYXMgY2hlYXAuIFRoYXQgbWVhbnMKK3RoYXQgSSBkbyBub3QgbGlrZSBudW1iZXJzIGxpa2UgMC4xIGFuZCB0aGUgbGlrZSBmb3IKK3RoaW5ncyB0aGF0IGNhbiBiZSB1c2VkIHNpbmNlIHF1aXRlIHNvbWUgdGltZS4gQnV0Cit0aGVuLCAzLjEgZG9lc24ndCBtZWFuICdwZXJmZWN0bHkgc3RhYmxlJywgdG9vLikKKworS25vd24gYnVnczoKKy0tLS0tLS0tLS0tCisKKy0gRG9lc24ndCB3b3JrIG9uIHRoZSBhbHBoYS4gVGhlIG9ubHkgNjQvMzItYml0CisgIHByb2JsZW0gdGhhdCBJJ20gYXdhcmUgb2YgKHBvaW50ZXIvaW50IGNvbnZlcnNpb24KKyAgaW4gcmVhZGRpcigpKSBnaXZlcyBjb21waWxlciB3YXJuaW5ncyBidXQgaXMKKyAgYXBwYXJlbnRseSBub3QgY2F1c2luZyB0aGUgZmFpbHVyZSwgYXMgZGlyZWN0b3J5CisgIHJlYWRzIGJhc2ljYWxseSB3b3JrIChidXQgYWxsIGZpbGVzIGFyZSBvZiBzaXplIDApLgorICBBbGFzLCBJJ3ZlIGdvdCBubyBhbHBoYSB0byBkZWJ1Zy4gOi0oCisKKy0gVGhlIHBhcnRpdGlvbiBjaGVja2VyIChkcml2ZXJzL2Jsb2NrL2dlbmhkLmMpCisgIGRvZXNuJ3Qgd29yayB3aXRoIGRldmljZXMgd2hpY2ggaGF2ZSAyNTYgYnl0ZQorICBibG9ja3MgKHNvbWUgdmVyeSBvbGQgU0NTSSBkcml2ZXMpLiAKKworLSBUaGUgZmVhdHVyZSB0byBhdXRvbWF0aWNhbGx5IG1ha2UgdGhlIGZzIGNsZWFuCisgIG1pZ2h0IGxlYXZlIGEgdHJhc2hlZCBmaWxlIHN5c3RlbSB3aXRoIHRoZQorICBiaXRtYXAgZmxhZyBzZXQgdmFsaWQuCisKKy0gV2hlbiBhIGZpbGUgaXMgdHJ1bmNhdGVkIHRvIGEgc2l6ZSB0aGF0IGlzIG5vdAorICBhIG11bHRpcGxlIG9mIHRoZSBibG9ja3NpemUsIHRoZSByZXN0IG9mIHRoZQorICBsYXN0IGFsbG9jYXRlZCBibG9jayBpcyBub3QgY2xlYXJlZC4gV2VsbCwKKyAgdGhpcyBmcyBuZXZlciBjbGFpbWVkIHRvIGJlIFBvc2l4IGNvbmZvcm1hbnQuCisKK1BsZWFzZSBkaXJlY3QgYnVnIHJlcG9ydHMgdG86IHppcHBlbEBsaW51eC1tNjhrLm9yZworCitWZXJzaW9uIDMuMjAKKy0tLS0tLS0tLS0tLQorLSBraWxsIGtlcm5lbCBsb2NrCistIGZpeCBmb3IgYSBwb3NzaWJsZSBiaXRtYXAgY29ycnVwdGlvbgorCitWZXJzaW9uIDMuMTkKKy0tLS0tLS0tLS0tLQorCistIHNpemVvZiBjaGFuZ2VzIGZyb20gS2VybmVsIEphbml0b3IgUHJvamVjdAorLSBzZXZlcmFsIGJ1ZyBmaXhlcyBmb3VuZCB3aXRoIGZzeAorCitWZXJzaW9uIDMuMTgKKy0tLS0tLS0tLS0tLQorCistIGNoYW5nZSB0byBnbG9iYWwgbWluIG1hY3JvICsgd2FybmluZyBmaXhlcworLSBhZGQgbW9kdWxlIHRhZ3MKKworVmVyc2lvbiAzLjE3CistLS0tLS0tLS0tLS0KKworLSBsb2NraW5nIGZpeGVzCistIHdyb25nIHNpZ24gaW4gX19hZmZzX2hhc2hfZGVudHJ5CistIHJlbW92ZSB1bm5lY2Vzc2FyeSBjaGVjayBpbiBhZmZzX25ld19pbm9kZQorLSBlbmFibGUgaW50ZXJuYXRpb25hbCBtb2RlIGZvciBkaXJjYWNoZSBmcworCitWZXJzaW9uIDMuMTYKKy0tLS0tLS0tLS0tLQorCistIHVzZSBtYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZSBpbnN0ZWFkIG9mIG1hcmtfYnVmZmVyX2RpcnR5LgorLSBpbnRyb2R1Y2UgYWZmc19sb2NrX3tsaW5rfGRpcnxleHR9LgorCitWZXJzaW9uIDMuMTUKKy0tLS0tLS0tLS0tLQorCistIGRpc2FibGUgbGluayB0byBkaXJlY3RvcmllcyB1bnRpbCB3ZSBjYW4gcHJvcGVybHkgc3VwcG9ydCB0aGVtLgorLSBsb2NraW5nIGZpeGVzIGZvciBsaW5rIGNyZWF0aW9uL3JlbW92YWwuCisKK1ZlcnNpb24gMy4xNAorLS0tLS0tLS0tLS0tCisKKy0gY29ycmVjdGx5IGN1dCBvZmYgbG9uZyBmaWxlIG5hbWVzIGZvciBjb21wYXJlcworLSBjb3JyZWN0bHkgaW5pdGlhbGl6ZSBzX2xhc3RfYm1hcAorCitWZXJzaW9uIDMuMTMKKy0tLS0tLS0tLS0tLQorCitNYWpvciBjbGVhbnVwIGZvciAyLjQgW1JvbWFuIFppcHBlbF0KKy0gbmV3IGV4dGVuZGVkIGJsb2NrIGhhbmRsaW5nCistIG5ldyBiaXRtYXAgYWxsb2NhdGlvbiBmdW5jdGlvbnMKKy0gbG9ja2luZyBzaG91bGQgYmUgc2FmZSBmb3IgdGhlIGZ1dHVyZQorLSBjbGVhbnVwIG9mIHNvbWUgaW50ZXJmYWNlcworCitWZXJzaW9uIDMuMTIKKy0tLS0tLS0tLS0tLQorCittb3JlIDIuNCBmaXhlczogW1JvbWFuIFppcHBlbF0KKy0gc19sb2NrIGNoYW5nZXMKKy0gaW5jcmVhc2VkIGdldGJsb2NrIG1lc3MKKy0gY2xlYXIgbWV0YSBibG9ja3MgCisKK1ZlcnNpb24gMy4xMQorLS0tLS0tLS0tLS0tCisKKy0gQ29udmVydGVkIHRvIHVzZSAyLjMueCBwYWdlIGNhY2hlIFtEYXZlIEpvbmVzIDxkYXZlQHBvd2VydHdlYWsuY29tPl0KKy0gQ29ycnVwdGlvbiBpbiB0cnVuY2F0ZSgpIGJ1Z2ZpeCBbS2VuIFR5bGVyIDxrZW50QHdlcnBsZS5uZXQuYXU+XQorCitWZXJzaW9uIDMuMTAKKy0tLS0tLS0tLS0tLQorCistIENoYW5nZWQgcGFydGl0aW9uIGNoZWNrZXIgdG8gYWxsb3cgZGV2aWNlcworICB3aXRoIHBoeXNpY2FsIGJsb2NrcyAhPSA1MTIgYnl0ZXMuCisKKy0gVGhlIHBhcnRpdGlvbiBjaGVja2VyIG5vdyBhbHNvIGlnbm9yZXMgdGhlCisgIHdvcmQgYXQgMHhkMCB0aGF0IFdpbmRvd3MgbGlrZXMgdG8gd3JpdGUgdG8uCisKK1ZlcnNpb24gMy45CistLS0tLS0tLS0tLQorCistIE1vdmVkIGNsZWFudXAgZnJvbSByZWxlYXNlX2ZpbGUoKSB0byBwdXRfaW5vZGUoKS4KKyAgVGhpcyBtYWtlcyB0aGUgZmlyc3Qgb25lIG9ic29sZXRlLgorCistIHRydW5jYXRlKCkgemVyb2VzIHRoZSB1bnVzZWQgcmVtYWluZGVyIG9mIGEKKyAgcGFydGlhbGx5IHVzZWQgbGFzdCBibG9jayB3aGVuIGEgZmlsZSBpcyB0cnVuY2F0ZWQuCisgIEl0IGFsc28gbWFya3MgdGhlIGlub2RlIGRpcnR5IG5vdyAod2hpY2ggaXMgbm90CisgIHJlYWxseSBuZWNlc3NhcnkgYXMgbm90aWZ5X2NoYW5nZSgpIHdpbGwgZG8KKyAgaXQgYW55d2F5KS4KKworLSBBZGRlZCBhIGZldyBjb21tZW50cywgZml4ZWQgc29tZSB0eXBvcyAoYW5kCisgIGludHJvZHVjZWQgc29tZSBuZXcgb25lcyksIG1hZGUgdGhlIGRlYnVnIG1lc3NhZ2VzCisgIG1vcmUgY29uc2lzdGVudC4gQ2hhbmdlZCBhIGJhZCBleGFtcGxlIGluIHRoZQorICBkb2MgZmlsZSAoYWZmcy50eHQpLgorCistIFNldHMgdGhlIE5PRVhFQyBmbGFnIGluIHJlYWRfc3VwZXIoKSBmb3Igb2xkIGZpbGUKKyAgc3lzdGVtcywgc2luY2UgeW91IGNhbid0IHJ1biBwcm9ncmFtcyBvbiB0aGVtLgorCitWZXJzaW9uIDMuOAorLS0tLS0tLS0tLS0KK0JpbGwgSGF3ZXMga2luZGx5IHJldmlld2VkIHRoZSBhZmZzIGFuZCBzZW50IG1lIHRoZQorcGF0Y2hlcyBoZSBkaWQuIFRoZXkncmUgbWFya2VkIChCSCkuIFRoYW5rcywgQmlsbCEKKworLSBDbGVhbnVwIG9mIGVycm9yIGhhbmRsaW5nIGluIHJlYWRfc3VwZXIoKS4KKyAgRGlkbid0IHJlbGVhc2UgYWxsIHJlc291cmNlcyBpbiBjYXNlIG9mIGFuCisgIGVycm9yLiAoQkgpCisKKy0gcHV0X2lub2RlKCkgcmVsZWFzZXMgdGhlIGV4dCBjYWNoZSBvbmx5IGlmIGl0J3MKKyAgbm8gbG9uZ2VyIG5lZWRlZC4gKEJIKQorCistIE9uZSBzZXQgb2YgZGVudHJ5IGNhbGxiYWNrcyBpcyBlbm91Z2guIChCSCkKKworLSBDbGVhbnVwIG9mIGVycm9yIGhhbmRsaW5nIGluIG5hbWVpLmMuIChCSCkKKworLSBDbGVhbnVwIG9mIGVycm9yIGhhbmRsaW5nIGluIGZpbGUuYy4gKEJIKQorCistIFRoZSBvcmlnaW5hbCBibG9ja3NpemUgb2YgdGhlIGRldmljZSBpcworICByZXN0b3JlZCB3aGVuIHRoZSBmcyBpcyB1bm1vdW50ZWQuIChCSCkKKworLSBnZXRibG9jaygpIGRpZCBub3QgaW52YWxpZGF0ZSB0aGUga2V5IGNhY2hlCisgIHdoZW4gaXQgYWxsb2NhdGVkIGEgbmV3IGJsb2NrLgorCistIFJlbW92ZWQgc29tZSB1bm5lY2Vzc2FyeSBsb2NrcyBhcyBCaWxsCisgIHN1Z2dlc3RlZC4KKworLSBTaW1wbGlmaWVkIG1hdGNoX25hbWUoKSwgY2hhbmdlZCBhbGwgaGFzaGluZworICBhbmQgY2FzZSBpbnNlbnNpdGl2ZSBuYW1lIGNvbXBhcmlzb25zIHRvIHVzZQorICB1cHBlcmNhc2UuIFRoaXMgbWFrZXMgdGhlIHRvbG93ZXIoKSByb3V0aW5lcworICBvYnNvbGV0ZS4KKworLSBBZGRlZCBtb3VudCBvcHRpb24gJ211ZnMnIHRvIGZvcmNlIG11RlMKKyAgdWlkL2dpZCBpbnRlcnByZXRhdGlvbi4KKworLSBGaWxlIG1vZGUgY2hhbmdlcyB3ZXJlIG5vdCB1cGRhdGVkIG9uIGRpc2suCisgIFRoaXMgd2FzIGZpeGVkIGJlZm9yZSwgYnV0IHNvbWVob3cgZ290IGxvc3QuCisKK1ZlcnNpb24gMy43CistLS0tLS0tLS0tLQorCistIEFkZGVkIGRlbnRyeSBjYWxsYmFja3MgdG8gYWxsb3cgdGhlIGRjYWNoZSB0bworICBvcGVyYXRlIGNhc2UgaW5zZW5zaXRpdmUgYW5kIGxlbmd0aCBpZ25vcmFudAorICBsaWtlIHRoZSBhZmZzIGl0c2VsZi4KKworLSBnZXRibG9jaygpIGRpZG4ndCB1cGRhdGUgdGhlIGxhc3RibG9jayBmaWVsZCBpbiB0aGUKKyAgaW5vZGUgaWYgdGhlIGZzIHdhcyBub3QgYW4gT0ZTLiBUaGlzIGJ1ZyBvbmx5IHNob3dzCisgIHVwIGlmIGEgZmlsZSB3YXMgZW5sYXJnZWQgdmlhIHRydW5jYXRlKCkgYW5kIHRoZXJlCisgIHdhcyBub3QgZW5vdWdoIHNwYWNlLgorCistIFJlbW92ZSBzb21lIG1vcmUgc3VwZXJmbHVvdXMgY29kZSBsZWZ0IG92ZXIgZnJvbQorICB0aGUgb2xkIGxpbmsgZGF5cyAuLi4KKworLSBGaXhlZCBzb21lIG92ZXJzaWdodHMgd2hpY2ggd2VyZSBpbiBwYXRjaCAyLjEuNzguCisKKy0gRml4ZWQgYSBmZXcgdHlwb3MuCisKK1ZlcnNpb24gMy42CistLS0tLS0tLS0tLQorCistIGRlbnRyeSBjaGFuZ2VzLiAoVGhhbmtzIHRvIEplcyBTb3JlbnNlbiBmb3IgaGlzIGhlbHAuKQorCistIEZpeGVkIGJ1ZyBpbiBiYWxsb2MoKTogU3VwZXJibG9jayB3YXMgbm90IHNldCBkaXJ0eSBhZnRlcgorICB0aGUgYml0bWFwIHdhcyBjaGFuZ2VkLCBzbyB0aGUgYml0bWFwIHdhc24ndCBzeW5jJ2QuCisKKy0gRml4ZWQgbmFzdHkgYnVnIGluIGZpbmRfbmV3X3pvbmUoKTogSWYgdGhlIGN1cnJlbnQKKyAgem9uZSBudW1iZXIgd2FzIHplcm8sIHRoZSBsb29wIGRpZG4ndCB0ZXJtaW5hdGUsCisgIGNhdXNpbmcgYSBzb2xpZCBsb2NrLXVwLgorCistIFJlbW92ZWQgc3VwcG9ydCBmb3Igb2xkLXN0eWxlIGRpcmVjdG9yeSByZWFkcy4KKworLSBGaXhlZCBidWcgaW4gYWRkX2VudHJ5KCk6IFdoZW4gZG9pbmcgYSBzb3J0ZWQgaW5zZXJ0LAorICB0aGUgcG9pbnRlciB0byB0aGUgbmV4dCBlbnRyeSBpbiB0aGUgaGFzaCBjaGFpbiB3YXNuJ3QKKyAgY29ycmVjdGx5IGJ5dGUtc3dhcHBlZC4gU2luY2UgbW9zdCBvZiB0aGUgdXNlcnMgb2YgdGhlCisgIGFmZnMgdXNlIGl0IG9uIGEgNjhrLCB0aGV5IGRpZG4ndCBub3RpY2UuIEJ1dCB3aHkgZGlkCisgIEkgbm90IGZpbmQgdGhpcyBkdXJpbmcgbXkgdGVzdHM/CisKKy0gRml4ZWQgc29tZSBvdmVyc2lnaHRzICh2ZXJzaW9uIHdhc24ndCB1cGRhdGVkIG9uIHNvbWUKKyAgZGlyZWN0b3J5IGNoYW5nZXMpLgorCistIEhhbmRsaW5nIG9mIGhhcmQgbGlua3MgcmV3cml0dGVuLiBUbyB0aGUgVkZTCisgIHRoZXkgYXBwZWFyIG5vdyBhcyBub3JtYWwgVW5peCBsaW5rcy4gVGhleSBhcmUKKyAgbm93IHJlc29sdmVkIG9ubHkgb25jZSBpbiBsb29rdXAoKS4gVGhlIGJhY2tzaWRlCisgIGlzIHRoYXQgdW5saW5rKCksIHJlbmFtZSgpIGFuZCBybWRpcigpIGhhdmUgdG8KKyAgYmUgc21hcnQgYWJvdXQgdGhlbSwgYnV0IHRoZSByZXN1bHQgaXMgd29ydGggdGhlCisgIGVmZm9ydC4gVGhpcyBhbHNvIGxlZCB0byBzb21lIGNvZGUgY2xlYW51cC4KKworLSBDaGFuZ2VkIG5hbWUgdHlwZSB0byB1bnNpZ25lZCBjaGFyOyB0aGUgdGVzdCBmb3IKKyAgaW52YWxpZCBmaWxlbmFtZXMgZGlkbid0IHdvcmsgY29ycmVjdGx5LgorICAoVGhhbmtzIHRvIE1pY2hhZWwgS3JhdXNlIGZvciBwb2ludGluZyBhdCB0aGlzLikKKworLSBDaGFuZ2VkIG1hcHBpbmcgb2YgZXhlY3V0YWJsZSBmbGFnLgorCistIENoYW5nZWQgYWxsIG5ldHdvcmsgYnl0ZS1vcmRlciBtYWNyb3MgdG8gdGhlCisgIHJlY29tbWVuZGVkIG9uZXMuCisKKy0gQWRkZWQgYSByZW1vdW50IGZ1bmN0aW9uLCBzbyBhdHRlbXB0cyB0byByZW1vdW50CisgIGEgZGlyY2FjaGUgZmlsZXN5c3RlbSBvciBvbmUgd2l0aCBlcnJvcnMgcmVhZC93cml0ZQorICBjYW4gYmUgdHJhcHBlZC4gUHJldmlvdXNseSwgcm8gcmVtb3VudHMgZGlkbid0CisgIGZsdXNoIHRoZSBzdXBlciBibG9jaywgYW5kIHJ3IHJlbW91bnRzIGRpZG4ndAorICBjcmVhdGUgYWxsb2NhdGlvbiB6b25lcyAuLi4KKworLSBDYWxsIHNocmlua19kY2FjaGVfcGFyZW50KCkgaW4gcm1kaXIoKS4KKyAgKFRoYW5rcyB0byBCaWxsIEhhd2VzLikKKworLSBQZXJtaXNzaW9uIGNoZWNrcyBpbiB1bmxpbmsoKS4KKworLSBBbGxvdyBtb3VudGluZyBvZiB2b2x1bWVzIHdpdGggc3VwZXJmbHVvdXMKKyAgYml0bWFwIHBvaW50ZXJzIHJlYWQgb25seSwgYWxzbyBhbGxvd3MgdGhlbQorICB0byBiZSByZW1vdW50ZWQgcmVhZC93cml0ZS4KKworLSBPd25lci9Hcm91cCBkZWZhdWx0cyBub3cgdG8gdGhlIGZzIHVzZXIgKGkuZS4KKyAgdGhlIG9uZSB0aGF0IG1vdW50ZWQgaXQpIGluc3RlYWQgb2Ygcm9vdC4gVGhpcworICBvYnNvbGV0ZXMgdGhlIG1vdW50IG9wdGlvbnMgdWlkIGFuZCBnaWQuCisKKy0gQXJndW1lbnQgdG8gdm9sdW1lIG9wdGlvbiBjb3VsZCBvdmVyZmxvdyB0aGUKKyAgbmFtZSBidWZmZXIuIEl0IGlzIG5vdyBzaWxlbnRseSB0cnVuY2F0ZWQgdG8KKyAgMzAgY2hhcmFjdGVycy4gKERhbW4gaXQhIFRoaXMga2luZCBvZiBidWcKKyAgaXMgdG9vIGVtYmFycmFzc2luZy4pCisKKy0gU3BsaXQgaW5vZGUuYyBpbnRvIDIgZmlsZXMsIHRoZSBzdXBlcmJsb2NrCisgIHJvdXRpbmVzIGRlc3BlcmF0ZWx5IHdhbnRlZCB0aGVpciBvd24gZmlsZS4KKworLSB0cnVuY2F0ZSgpIGRpZG4ndCBhbGxvY2F0ZSBhbiBleHRlbnNpb24gYmxvY2sKKyAgY2FjaGUuIElmIGEgZmlsZSB3YXMgZXh0ZW5kZWQgYnkgbWVhbnMgb2YKKyAgdHJ1bmNhdGUoKSwgdGhpcyBsZWQgdG8gYW4gT29wcy4KKworLSBmc3VzZXIgaXMgbm93IGNoZWNrZWQgbGFzdC4KKworLSByZW5hbWUoKSB3aWxsIG5vdCBpZ25vcmUgY2hhbmdlcyBpbiBmaWxlbmFtZQorICBjYXNpbmcgYW55IG1vcmUgKHRob3VnaCBtdigxKSBzdGlsbCB3b24ndCBhbGxvdworICB5b3UgdG8gZG8gIm12IG9sZG5hbWUgT2xkTmFtZSIpLgorCitWZXJzaW9uIDMuNQorLS0tLS0tLS0tLS0KKworLSBFeHRlbnNpb24gYmxvY2sgY2FjaGVzIGFyZSBub3cgYWxsb2NhdGVkIG9uCisgIGRlbWFuZCBpbnN0ZWFkIG9mIHdoZW4gYSBmaWxlIGlzIG9wZW5lZCwgYXMKKyAgZmlsZXMgY2FuIGJlIHJlYWQgYW5kIHdyaXR0ZW4gd2l0aG91dCBvcGVuaW5nCisgIHRoZW0gKGUuIGcuIHRoZSBsb29wYmFjayBkZXZpY2UgZG9lcyB0aGlzKS4KKworLSBSZW1vdmVkIGFuIHVudXNlZCBmdW5jdGlvbi4KKworVmVyc2lvbiAzLjQKKy0tLS0tLS0tLS0tCisKKy0gSGFzaCBjaGFpbnMgYXJlIG5vdyBzb3J0ZWQgYnkgYmxvY2sgbnVtYmVycy4KKyAgKFRoYW5rcyB0byBLYXJzIGRlIEpvbmcgZm9yIGZpbmRpbmcgdGhpcy4pCistIFJlbW92ZWQgYWxsIHVubmVjZXNzYXJ5IGV4dGVybmFsIHN5bWJvbHMuCisKK1ZlcnNpb24gMy4zCistLS0tLS0tLS0tLQorCistIFRyaWVkIHRvIG1ha2UgYWxsIHR5cGVzICdjb3JyZWN0JyBhbmQgY29uc2lzdGVudC4KKy0gRXJyb3JzIGFuZCB3YXJuaW5ncyBhcmUgbm93IHJlcG9ydGVkIHZpYSBhCisgIGZ1bmN0aW9uLiBUaGV5IGFyZSBhbGwgcHJlZml4ZWQgYnkgYSBzZXZlcml0eQorICBhbmQgaGF2ZSB0aGUgc2FtZSBhcHBlYXJhbmNlOgorICAgICJBRkZTOiA8ZnVuY3Rpb24+OiA8ZXJyb3IgbWVzc2FnZT4iCisgIChUaGVyZSdzIG9uZSBleGNlcHRpb24gdG8gdGhpcywgYXMgaW4gdGhhdCBmdW5jdGlvbgorICBpcyBubyBwb2ludGVyIHRvIHRoZSBzdXBlciBibG9jayBhdmFpbGFibGUuKQorLSBUaGUgZmlsZXN5c3RlbSBpcyByZW1vdW50ZWQgcmVhZC1vbmx5IGFmdGVyIGFuCisgIGVycm9yLgorLSBUaGUgbmFtZXMgb2YgbmV3bHkgY3JlYXRlZCBmaWxlc3lzdGVtIG9iamVjdHMgYXJlCisgIG5vdyBjaGVja2VkIGZvciB2YWxpZGl0eS4KKy0gTWlub3IgY2xlYW51cHMgaW4gY29tbWVudHMuCistIEFkZGVkIHRoaXMgQ2hhbmdlcyBmaWxlLiBBdCBsYXN0IQorCitWZXJzaW9uIDMuMgorLS0tLS0tLS0tLS0KKworLSBFeHRlbnNpb24gYmxvY2sgY2FjaGU6IFJlYWRpbmcvd3JpdGluZyBvZiBodWdlIGZpbGVzCisgIChzZXZlcmFsIE1CKSBpcyBtdWNoIGZhc3RlciAob2YgY291cnNlIHRoZSBhZGRlZAorICBvdmVyaGVhZCBzbG93cyBkb3duIG9wZW5pbmcsIGJ1dCB0aGlzIGlzIGhhcmRseQorICBub3RpY2VhYmxlKS4KKy0gVGhlIHNhbWUgZ2V0X2Jsb2NrKCktcm91dGluZSBjYW4gbm93IGJlIHVzZWQgZm9yCisgIGJvdGggT0ZTIGFuZCBGRlMuCistIFRoZSBzdXBlciBibG9jayBpcyBub3cgc2VhcmNoZWQgaW4gdGhlIGJsb2NrIHRoYXQKKyAgd2FzIGNhbGN1bGF0ZWQgYW5kIGluIHRoZSBvbmUgZm9sbG93aW5nLiBUaGlzCisgIHNob3VsZCByZW1lZHkgdGhlIHJvdW5kLW9mZiBlcnJvciBpbnRyb2R1Y2VkIGJ5CisgIHRoZSAxLWsgYmxvY2tzIHRoYXQgTGludXggdXNlcy4KKy0gTWlub3IgY2hhbmdlcyB0byBhZGhlcmUgdG8gdGhlIG5ldyBWRlMgaW50ZXJmYWNlLgorLSBUaGUgbnVtYmVyIG9mIHVzZWQgYmxvY2tzIGlzIG5vdyBhbHNvIGNhbGN1bGF0ZWQKKyAgaWYgdGhlIGZpbGVzeXN0ZW0gaXMgbW91bnRlZCByZWFkLW9ubHkuCistIFByZWZpeGVkIHNvbWUgY29uc3RhbnRzIHdpdGggQUZGU18gdG8gYXZvaWQgbmFtZQorICBjbGFzaGVzLgorLSBSZW1vdmVkICdFWFBFUklNRU5UQUwnIHN0YXR1cy4KKworVmVyc2lvbiAzLjEKKy0tLS0tLS0tLS0tCisKKy0gRml4ZWQgYSBuYXN0eSBidWcgd2hpY2ggZGlkbid0IGFsbG93IHJlYWQtb25seQorICBtb3VudHMuCistIEFsbG93IGRpci1jYWNoZSBmaWxlc3lzdGVtcyB0byBiZSBtb3VudGVkCisgIHJlYWQgb25seS4KKy0gT0ZTIHN1cHBvcnQuCistIFNldmVyYWwgb3RoZXIgY2hhbmdlcyBJIGp1c3QgY2Fubm90IHJlbWVtYmVyCisgIGFueSBtb3JlLgorCitWZXJzaW9uIDMuMAorLS0tLS0tLS0tLS0KKworLSBBbG1vc3QgY29tcGxldGUgcmV3cml0ZSBmb3IgdGhlIG5ldyBWRlMKKyAgaW50ZXJmYWNlIGluIExpbnV4IDEuMy4KKy0gV3JpdGUgc3VwcG9ydC4KKy0gU3VwcG9ydCBmb3IgaGFyZCBhbmQgc3ltYm9saWMgbGlua3MuCistIExvdHMgb2YgdGhpbmdzIEkgcmVtZW1iZXIgZXZlbiBsZXNzIC4uLgorCitWZXJzaW9uIDIuMAorLS0tLS0tLS0tLS0KKworLSBGaXhlZCBhIGZldyB0aGluZ3MgdG8gZ2V0IGl0IGNvbXBpbGVkLgorLSBBdXRvbWF0aWMgcm9vdCBibG9jayBjYWxjdWxhdGlvbi4KKy0gUGFydGl0aW9uIGNoZWNrZXIgZm9yIGdlbmhkLmMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitMZXQncyBqdXN0IGNhbGwgUmF5IEJ1cnIncyBvcmlnaW5hbCBhZmZzCisnVmVyc2lvbiAxLjAnLgpkaWZmIC0tZ2l0IGEvZnMvYWZmcy9NYWtlZmlsZSBiL2ZzL2FmZnMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJjNGY1NAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2FmZnMvTWFrZWZpbGUKQEAgLTAsMCArMSw5IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGludXggYWZmcyBmaWxlc3lzdGVtIHJvdXRpbmVzLgorIworCisjRVhUUkFfQ0ZMQUdTPS1EREVCVUc9MQorCitvYmotJChDT05GSUdfQUZGU19GUykgKz0gYWZmcy5vCisKK2FmZnMtb2JqcyA6PSBzdXBlci5vIG5hbWVpLm8gaW5vZGUubyBmaWxlLm8gZGlyLm8gYW1pZ2FmZnMubyBiaXRtYXAubyBzeW1saW5rLm8KZGlmZiAtLWdpdCBhL2ZzL2FmZnMvYWZmcy5oIGIvZnMvYWZmcy9hZmZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM2Nzk5ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2FmZnMvYWZmcy5oCkBAIC0wLDAgKzEsMzA0IEBACisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvYWZmc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2FtaWdhZmZzLmg+CisKKy8qIEFtaWdhT1MgYWxsb3dzIGZpbGUgbmFtZXMgd2l0aCB1cCB0byAzMCBjaGFyYWN0ZXJzIGxlbmd0aC4KKyAqIE5hbWVzIGxvbmdlciB0aGFuIHRoYXQgd2lsbCBiZSBzaWxlbnRseSB0cnVuY2F0ZWQuIElmIHlvdQorICogd2FudCB0byBkaXNhbGxvdyB0aGlzLCBjb21tZW50IG91dCB0aGUgZm9sbG93aW5nICNkZWZpbmUuCisgKiBDcmVhdGluZyBmaWxlc3lzdGVtIG9iamVjdHMgd2l0aCBsb25nZXIgbmFtZXMgd2lsbCB0aGVuCisgKiByZXN1bHQgaW4gYW4gZXJyb3IgKEVOQU1FVE9PTE9ORykuCisgKi8KKy8qI2RlZmluZSBBRkZTX05PX1RSVU5DQVRFICovCisKKy8qIFVnbHkgbWFjcm9zIG1ha2UgdGhlIGNvZGUgbW9yZSBwcmV0dHkuICovCisKKyNkZWZpbmUgR0VUX0VORF9QVFIoc3QscCxzeikJCSAoKHN0ICopKChjaGFyICopKHApKygoc3opLXNpemVvZihzdCkpKSkKKyNkZWZpbmUgQUZGU19HRVRfSEFTSEVOVFJZKGRhdGEsaGFzaGtleSkgYmUzMl90b19jcHUoKChzdHJ1Y3QgZGlyX2Zyb250ICopZGF0YSktPmhhc2h0YWJsZVtoYXNoa2V5XSkKKyNkZWZpbmUgQUZGU19CTE9DSyhzYiwgYmgsIGJsaykJCShBRkZTX0hFQUQoYmgpLT50YWJsZVtBRkZTX1NCKHNiKS0+c19oYXNoc2l6ZS0xLShibGspXSkKKworI2lmZGVmIF9fTElUVExFX0VORElBTgorI2RlZmluZSBCT19FWEJJVFMJMHgxOFVMCisjZWxpZiBkZWZpbmVkKF9fQklHX0VORElBTikKKyNkZWZpbmUgQk9fRVhCSVRTCTB4MDBVTAorI2Vsc2UKKyNlcnJvciBFbmRpYW5uZXNzIG11c3QgYmUga25vd24gZm9yIGFmZnMgdG8gd29yay4KKyNlbmRpZgorCisjZGVmaW5lIEFGRlNfSEVBRChiaCkJCSgoc3RydWN0IGFmZnNfaGVhZCAqKShiaCktPmJfZGF0YSkKKyNkZWZpbmUgQUZGU19UQUlMKHNiLCBiaCkJKChzdHJ1Y3QgYWZmc190YWlsICopKChiaCktPmJfZGF0YSsoc2IpLT5zX2Jsb2Nrc2l6ZS1zaXplb2Yoc3RydWN0IGFmZnNfdGFpbCkpKQorI2RlZmluZSBBRkZTX1JPT1RfSEVBRChiaCkJKChzdHJ1Y3QgYWZmc19yb290X2hlYWQgKikoYmgpLT5iX2RhdGEpCisjZGVmaW5lIEFGRlNfUk9PVF9UQUlMKHNiLCBiaCkJKChzdHJ1Y3QgYWZmc19yb290X3RhaWwgKikoKGJoKS0+Yl9kYXRhKyhzYiktPnNfYmxvY2tzaXplLXNpemVvZihzdHJ1Y3QgYWZmc19yb290X3RhaWwpKSkKKyNkZWZpbmUgQUZGU19EQVRBX0hFQUQoYmgpCSgoc3RydWN0IGFmZnNfZGF0YV9oZWFkICopKGJoKS0+Yl9kYXRhKQorI2RlZmluZSBBRkZTX0RBVEEoYmgpCQkoKChzdHJ1Y3QgYWZmc19kYXRhX2hlYWQgKikoYmgpLT5iX2RhdGEpLT5kYXRhKQorCisjZGVmaW5lIEFGRlNfQ0FDSEVfU0laRQkJUEFHRV9TSVpFCisKKyNkZWZpbmUgQUZGU19NQVhfUFJFQUxMT0MJMzIKKyNkZWZpbmUgQUZGU19MQ19TSVpFCQkoQUZGU19DQUNIRV9TSVpFL3NpemVvZih1MzIpLzIpCisjZGVmaW5lIEFGRlNfQUNfU0laRQkJKEFGRlNfQ0FDSEVfU0laRS9zaXplb2Yoc3RydWN0IGFmZnNfZXh0X2tleSkvMikKKyNkZWZpbmUgQUZGU19BQ19NQVNLCQkoQUZGU19BQ19TSVpFLTEpCisKK3N0cnVjdCBhZmZzX2V4dF9rZXkgeworCXUzMglleHQ7CQkJCS8qIGlkeCBvZiB0aGUgZXh0ZW5kZWQgYmxvY2sgKi8KKwl1MzIJa2V5OwkJCQkvKiBibG9jayBudW1iZXIgKi8KK307CisKKy8qCisgKiBhZmZzIGZzIGlub2RlIGRhdGEgaW4gbWVtb3J5CisgKi8KK3N0cnVjdCBhZmZzX2lub2RlX2luZm8geworCXUzMgkgaV9vcGVuY250OworCXN0cnVjdCBzZW1hcGhvcmUgaV9saW5rX2xvY2s7CQkvKiBQcm90ZWN0cyBpbnRlcm5hbCBpbm9kZSBhY2Nlc3MuICovCisJc3RydWN0IHNlbWFwaG9yZSBpX2V4dF9sb2NrOwkJLyogUHJvdGVjdHMgaW50ZXJuYWwgaW5vZGUgYWNjZXNzLiAqLworI2RlZmluZSBpX2hhc2hfbG9jayBpX2V4dF9sb2NrCisJdTMyCSBpX2Jsa2NudDsJCQkvKiBibG9jayBjb3VudCAqLworCXUzMgkgaV9leHRjbnQ7CQkJLyogZXh0ZW5kZWQgYmxvY2sgY291bnQgKi8KKwl1MzIJKmlfbGM7CQkJCS8qIGxpbmVhciBjYWNoZSBvZiBleHRlbmRlZCBibG9ja3MgKi8KKwl1MzIJIGlfbGNfc2l6ZTsKKwl1MzIJIGlfbGNfc2hpZnQ7CisJdTMyCSBpX2xjX21hc2s7CisJc3RydWN0IGFmZnNfZXh0X2tleSAqaV9hYzsJCS8qIGFzc29jaWF0aXZlIGNhY2hlIG9mIGV4dGVuZGVkIGJsb2NrcyAqLworCXUzMgkgaV9leHRfbGFzdDsJCQkvKiBsYXN0IGFjY2Vzc2VkIGV4dGVuZGVkIGJsb2NrICovCisJc3RydWN0IGJ1ZmZlcl9oZWFkICppX2V4dF9iaDsJCS8qIGJoIG9mIGxhc3QgZXh0ZW5kZWQgYmxvY2sgKi8KKwlsb2ZmX3QJIG1tdV9wcml2YXRlOworCXUzMgkgaV9wcm90ZWN0OwkJCS8qIHVudXNlZCBhdHRyaWJ1dGUgYml0cyAqLworCXUzMgkgaV9sYXN0YWxsb2M7CQkJLyogbGFzdCBhbGxvY2F0ZWQgYmxvY2sgKi8KKwlpbnQJIGlfcGFfY250OwkJCS8qIG51bWJlciBvZiBwcmVhbGxvY2F0ZWQgYmxvY2tzICovCisJc3RydWN0IGlub2RlIHZmc19pbm9kZTsKK307CisKKy8qIHNob3J0IGN1dCB0byBnZXQgdG8gdGhlIGFmZnMgc3BlY2lmaWMgaW5vZGUgZGF0YSAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgYWZmc19pbm9kZV9pbmZvICpBRkZTX0koc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gbGlzdF9lbnRyeShpbm9kZSwgc3RydWN0IGFmZnNfaW5vZGVfaW5mbywgdmZzX2lub2RlKTsKK30KKworLyoKKyAqIHN1cGVyLWJsb2NrIGRhdGEgaW4gbWVtb3J5CisgKgorICogQmxvY2sgbnVtYmVycyBhcmUgYWRqdXN0ZWQgZm9yIHRoZWlyIGFjdHVhbCBzaXplCisgKgorICovCisKK3N0cnVjdCBhZmZzX2JtX2luZm8geworCXUzMiBibV9rZXk7CQkJLyogRGlzayBibG9jayBudW1iZXIgKi8KKwl1MzIgYm1fZnJlZTsJCQkvKiBGcmVlIGJsb2NrcyBpbiBoZXJlICovCit9OworCitzdHJ1Y3QgYWZmc19zYl9pbmZvIHsKKwlpbnQgc19wYXJ0aXRpb25fc2l6ZTsJCS8qIFBhcnRpdGlvbiBzaXplIGluIGJsb2Nrcy4gKi8KKwlpbnQgc19yZXNlcnZlZDsJCQkvKiBOdW1iZXIgb2YgcmVzZXJ2ZWQgYmxvY2tzLiAqLworCS8vdTMyIHNfYmxrc2l6ZTsJCQkvKiBJbml0aWFsIGRldmljZSBibGtzaXplICovCisJdTMyIHNfZGF0YV9ibGtzaXplOwkJLyogc2l6ZSBvZiB0aGUgZGF0YSBibG9jayB3L28gaGVhZGVyICovCisJdTMyIHNfcm9vdF9ibG9jazsJCS8qIEZGUyByb290IGJsb2NrIG51bWJlci4gKi8KKwlpbnQgc19oYXNoc2l6ZTsJCQkvKiBTaXplIG9mIGhhc2ggdGFibGUuICovCisJdW5zaWduZWQgbG9uZyBzX2ZsYWdzOwkJLyogU2VlIGJlbG93LiAqLworCXVpZF90IHNfdWlkOwkJCS8qIHVpZCB0byBvdmVycmlkZSAqLworCWdpZF90IHNfZ2lkOwkJCS8qIGdpZCB0byBvdmVycmlkZSAqLworCXVtb2RlX3Qgc19tb2RlOwkJCS8qIG1vZGUgdG8gb3ZlcnJpZGUgKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnNfcm9vdF9iaDsJLyogQ2FjaGVkIHJvb3QgYmxvY2suICovCisJc3RydWN0IHNlbWFwaG9yZSBzX2JtbG9jazsJLyogUHJvdGVjdHMgYml0bWFwIGFjY2Vzcy4gKi8KKwlzdHJ1Y3QgYWZmc19ibV9pbmZvICpzX2JpdG1hcDsJLyogQml0bWFwIGluZm9zLiAqLworCXUzMiBzX2JtYXBfY291bnQ7CQkvKiAjIG9mIGJpdG1hcCBibG9ja3MuICovCisJdTMyIHNfYm1hcF9iaXRzOwkJLyogIyBvZiBiaXRzIGluIG9uZSBiaXRtYXAgYmxvY2tzICovCisJdTMyIHNfbGFzdF9ibWFwOworCXN0cnVjdCBidWZmZXJfaGVhZCAqc19ibWFwX2JoOworCWNoYXIgKnNfcHJlZml4OwkJCS8qIFByZWZpeCBmb3Igdm9sdW1lcyBhbmQgYXNzaWducy4gKi8KKwlpbnQgc19wcmVmaXhfbGVuOwkJLyogTGVuZ3RoIG9mIHByZWZpeC4gKi8KKwljaGFyIHNfdm9sdW1lWzMyXTsJCS8qIFZvbHVtZSBwcmVmaXggZm9yIGFic29sdXRlIHN5bWxpbmtzLiAqLworfTsKKworI2RlZmluZSBTRl9JTlRMCQkweDAwMDEJCS8qIEludGVybmF0aW9uYWwgZmlsZXN5c3RlbS4gKi8KKyNkZWZpbmUgU0ZfQk1fVkFMSUQJMHgwMDAyCQkvKiBCaXRtYXAgaXMgdmFsaWQuICovCisjZGVmaW5lIFNGX0lNTVVUQUJMRQkweDAwMDQJCS8qIFByb3RlY3Rpb24gYml0cyBjYW5ub3QgYmUgY2hhbmdlZCAqLworI2RlZmluZSBTRl9RVUlFVAkweDAwMDgJCS8qIGNobW9kIGVycm9ycyB3aWxsIGJlIG5vdCByZXBvcnRlZCAqLworI2RlZmluZSBTRl9TRVRVSUQJMHgwMDEwCQkvKiBJZ25vcmUgQW1pZ2EgdWlkICovCisjZGVmaW5lIFNGX1NFVEdJRAkweDAwMjAJCS8qIElnbm9yZSBBbWlnYSBnaWQgKi8KKyNkZWZpbmUgU0ZfU0VUTU9ERQkweDAwNDAJCS8qIElnbm9yZSBBbWlnYSBwcm90ZWN0aW9uIGJpdHMgKi8KKyNkZWZpbmUgU0ZfTVVGUwkJMHgwMTAwCQkvKiBVc2UgTVVGUyB1aWQvZ2lkIG1hcHBpbmcgKi8KKyNkZWZpbmUgU0ZfT0ZTCQkweDAyMDAJCS8qIE9sZCBmaWxlc3lzdGVtICovCisjZGVmaW5lIFNGX1BSRUZJWAkweDA0MDAJCS8qIEJ1ZmZlciBmb3IgcHJlZml4IGlzIGFsbG9jYXRlZCAqLworI2RlZmluZSBTRl9WRVJCT1NFCTB4MDgwMAkJLyogVGFsayBhYm91dCBmcyB3aGVuIG1vdW50aW5nICovCisKKy8qIHNob3J0IGN1dCB0byBnZXQgdG8gdGhlIGFmZnMgc3BlY2lmaWMgc2IgZGF0YSAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgYWZmc19zYl9pbmZvICpBRkZTX1NCKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJcmV0dXJuIHNiLT5zX2ZzX2luZm87Cit9CisKKy8qIGFtaWdhZmZzLmMgKi8KKworZXh0ZXJuIGludAlhZmZzX2luc2VydF9oYXNoKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOworZXh0ZXJuIGludAlhZmZzX3JlbW92ZV9oYXNoKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnJlbV9iaCk7CitleHRlcm4gaW50CWFmZnNfcmVtb3ZlX2hlYWRlcihzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOworZXh0ZXJuIHUzMglhZmZzX2NoZWNrc3VtX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpOworZXh0ZXJuIHZvaWQJYWZmc19maXhfY2hlY2tzdW0oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCk7CitleHRlcm4gdm9pZAlzZWNzX3RvX2RhdGVzdGFtcCh0aW1lX3Qgc2Vjcywgc3RydWN0IGFmZnNfZGF0ZSAqZHMpOworZXh0ZXJuIG1vZGVfdAlwcm90X3RvX21vZGUodTMyIHByb3QpOworZXh0ZXJuIHZvaWQJbW9kZV90b19wcm90KHN0cnVjdCBpbm9kZSAqaW5vZGUpOworZXh0ZXJuIHZvaWQJYWZmc19lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpmdW5jdGlvbiwgY29uc3QgY2hhciAqZm10LCAuLi4pOworZXh0ZXJuIHZvaWQJYWZmc193YXJuaW5nKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKmZ1bmN0aW9uLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CitleHRlcm4gaW50CWFmZnNfY2hlY2tfbmFtZShjb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lLCBpbnQgbGVuKTsKK2V4dGVybiBpbnQJYWZmc19jb3B5X25hbWUodW5zaWduZWQgY2hhciAqYnN0ciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKKworLyogYml0bWFwLiBjICovCisKK2V4dGVybiB1MzIJYWZmc19jb3VudF9mcmVlX2Jsb2NrcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpOworZXh0ZXJuIHZvaWQJYWZmc19mcmVlX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHUzMiBibG9jayk7CitleHRlcm4gdTMyCWFmZnNfYWxsb2NfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgdTMyIGdvYWwpOworZXh0ZXJuIGludAlhZmZzX2luaXRfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MpOworZXh0ZXJuIHZvaWQJYWZmc19mcmVlX2JpdG1hcChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKKworLyogbmFtZWkuYyAqLworCitleHRlcm4gaW50CWFmZnNfaGFzaF9uYW1lKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IHU4ICpuYW1lLCB1bnNpZ25lZCBpbnQgbGVuKTsKK2V4dGVybiBzdHJ1Y3QgZGVudHJ5ICphZmZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICopOworZXh0ZXJuIGludAlhZmZzX3VubGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKK2V4dGVybiBpbnQJYWZmc19jcmVhdGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsIHN0cnVjdCBuYW1laWRhdGEgKik7CitleHRlcm4gaW50CWFmZnNfbWtkaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpOworZXh0ZXJuIGludAlhZmZzX3JtZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOworZXh0ZXJuIGludAlhZmZzX2xpbmsoc3RydWN0IGRlbnRyeSAqb2xkZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJCSAgc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKK2V4dGVybiBpbnQJYWZmc19zeW1saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkgICAgIGNvbnN0IGNoYXIgKnN5bW5hbWUpOworZXh0ZXJuIGludAlhZmZzX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCisJCQkgICAgc3RydWN0IGlub2RlICpuZXdfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KTsKKworLyogaW5vZGUuYyAqLworCitleHRlcm4gdW5zaWduZWQgbG9uZwkJIGFmZnNfcGFyZW50X2lubyhzdHJ1Y3QgaW5vZGUgKmRpcik7CitleHRlcm4gc3RydWN0IGlub2RlCQkqYWZmc19uZXdfaW5vZGUoc3RydWN0IGlub2RlICpkaXIpOworZXh0ZXJuIGludAkJCSBhZmZzX25vdGlmeV9jaGFuZ2Uoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmF0dHIpOworZXh0ZXJuIHZvaWQJCQkgYWZmc19wdXRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CitleHRlcm4gdm9pZAkJCSBhZmZzX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK2V4dGVybiB2b2lkCQkJIGFmZnNfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CitleHRlcm4gdm9pZAkJCSBhZmZzX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CitleHRlcm4gaW50CQkJIGFmZnNfd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50KTsKK2V4dGVybiBpbnQJCQkgYWZmc19hZGRfZW50cnkoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgczMyIHR5cGUpOworCisvKiBmaWxlLmMgKi8KKwordm9pZAkJYWZmc19mcmVlX3ByZWFsbG9jKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworZXh0ZXJuIHZvaWQJYWZmc190cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKik7CisKKy8qIGRpci5jICovCisKK2V4dGVybiB2b2lkICAgYWZmc19kaXJfdHJ1bmNhdGUoc3RydWN0IGlub2RlICopOworCisvKiBqdW1wIHRhYmxlcyAqLworCitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMJIGFmZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zCSBhZmZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zICAgYWZmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucwkgYWZmc19maWxlX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucwkgYWZmc19maWxlX29wZXJhdGlvbnNfb2ZzOworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMJIGFmZnNfZGlyX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucwkgYWZmc19zeW1saW5rX2FvcHM7CitleHRlcm4gc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucwkgYWZmc19hb3BzOworZXh0ZXJuIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMJIGFmZnNfYW9wc19vZnM7CisKK2V4dGVybiBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMJIGFmZnNfZGVudHJ5X29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zCSBhZmZzX2RlbnRyeV9vcGVyYXRpb25zX2ludGw7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorYWZmc19zZXRfYmxvY2tzaXplKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBzaXplKQoreworCXNiX3NldF9ibG9ja3NpemUoc2IsIHNpemUpOworfQorc3RhdGljIGlubGluZSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKgorYWZmc19icmVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgYmxvY2spCit7CisJcHJfZGVidWcoImFmZnNfYnJlYWQ6ICVkXG4iLCBibG9jayk7CisJaWYgKGJsb2NrID49IEFGRlNfU0Ioc2IpLT5zX3Jlc2VydmVkICYmIGJsb2NrIDwgQUZGU19TQihzYiktPnNfcGFydGl0aW9uX3NpemUpCisJCXJldHVybiBzYl9icmVhZChzYiwgYmxvY2spOworCXJldHVybiBOVUxMOworfQorc3RhdGljIGlubGluZSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKgorYWZmc19nZXRibGsoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGJsb2NrKQoreworCXByX2RlYnVnKCJhZmZzX2dldGJsazogJWRcbiIsIGJsb2NrKTsKKwlpZiAoYmxvY2sgPj0gQUZGU19TQihzYiktPnNfcmVzZXJ2ZWQgJiYgYmxvY2sgPCBBRkZTX1NCKHNiKS0+c19wYXJ0aXRpb25fc2l6ZSkKKwkJcmV0dXJuIHNiX2dldGJsayhzYiwgYmxvY2spOworCXJldHVybiBOVUxMOworfQorc3RhdGljIGlubGluZSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKgorYWZmc19nZXR6ZXJvYmxrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBibG9jaykKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXByX2RlYnVnKCJhZmZzX2dldHplcm9ibGs6ICVkXG4iLCBibG9jayk7CisJaWYgKGJsb2NrID49IEFGRlNfU0Ioc2IpLT5zX3Jlc2VydmVkICYmIGJsb2NrIDwgQUZGU19TQihzYiktPnNfcGFydGl0aW9uX3NpemUpIHsKKwkJYmggPSBzYl9nZXRibGsoc2IsIGJsb2NrKTsKKwkJbG9ja19idWZmZXIoYmgpOworCQltZW1zZXQoYmgtPmJfZGF0YSwgMCAsIHNiLT5zX2Jsb2Nrc2l6ZSk7CisJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJcmV0dXJuIGJoOworCX0KKwlyZXR1cm4gTlVMTDsKK30KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJ1ZmZlcl9oZWFkICoKK2FmZnNfZ2V0ZW1wdHlibGsoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGJsb2NrKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJcHJfZGVidWcoImFmZnNfZ2V0ZW1wdHlibGs6ICVkXG4iLCBibG9jayk7CisJaWYgKGJsb2NrID49IEFGRlNfU0Ioc2IpLT5zX3Jlc2VydmVkICYmIGJsb2NrIDwgQUZGU19TQihzYiktPnNfcGFydGl0aW9uX3NpemUpIHsKKwkJYmggPSBzYl9nZXRibGsoc2IsIGJsb2NrKTsKKwkJd2FpdF9vbl9idWZmZXIoYmgpOworCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJcmV0dXJuIGJoOworCX0KKwlyZXR1cm4gTlVMTDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZAorYWZmc19icmVsc2Uoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlpZiAoYmgpCisJCXByX2RlYnVnKCJhZmZzX2JyZWxzZTogJWxsZFxuIiwgKGxvbmcgbG9uZykgYmgtPmJfYmxvY2tucik7CisJYnJlbHNlKGJoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCithZmZzX2FkanVzdF9jaGVja3N1bShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCB1MzIgdmFsKQoreworCXUzMiB0bXAgPSBiZTMyX3RvX2NwdSgoKF9fYmUzMiAqKWJoLT5iX2RhdGEpWzVdKTsKKwkoKF9fYmUzMiAqKWJoLT5iX2RhdGEpWzVdID0gY3B1X3RvX2JlMzIodG1wIC0gdmFsKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZAorYWZmc19hZGp1c3RfYml0bWFwY2hlY2tzdW0oc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgdTMyIHZhbCkKK3sKKwl1MzIgdG1wID0gYmUzMl90b19jcHUoKChfX2JlMzIgKiliaC0+Yl9kYXRhKVswXSk7CisJKChfX2JlMzIgKiliaC0+Yl9kYXRhKVswXSA9IGNwdV90b19iZTMyKHRtcCAtIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorYWZmc19sb2NrX2xpbmsoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlkb3duKCZBRkZTX0koaW5vZGUpLT5pX2xpbmtfbG9jayk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQKK2FmZnNfdW5sb2NrX2xpbmsoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwl1cCgmQUZGU19JKGlub2RlKS0+aV9saW5rX2xvY2spOworfQorc3RhdGljIGlubGluZSB2b2lkCithZmZzX2xvY2tfZGlyKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJZG93bigmQUZGU19JKGlub2RlKS0+aV9oYXNoX2xvY2spOworfQorc3RhdGljIGlubGluZSB2b2lkCithZmZzX3VubG9ja19kaXIoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwl1cCgmQUZGU19JKGlub2RlKS0+aV9oYXNoX2xvY2spOworfQorc3RhdGljIGlubGluZSB2b2lkCithZmZzX2xvY2tfZXh0KHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJZG93bigmQUZGU19JKGlub2RlKS0+aV9leHRfbG9jayk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQKK2FmZnNfdW5sb2NrX2V4dChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXVwKCZBRkZTX0koaW5vZGUpLT5pX2V4dF9sb2NrKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2FmZnMvYW1pZ2FmZnMuYyBiL2ZzL2FmZnMvYW1pZ2FmZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2Q2MjRlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZmcy9hbWlnYWZmcy5jCkBAIC0wLDAgKzEsNTA5IEBACisvKgorICogIGxpbnV4L2ZzL2FmZnMvYW1pZ2FmZnMuYworICoKKyAqICAoYykgMTk5NiAgSGFucy1Kb2FjaGltIFdpZG1haWVyIC0gUmV3cml0dGVuCisgKgorICogIChDKSAxOTkzICBSYXkgQnVyciAtIEFtaWdhIEZGUyBmaWxlc3lzdGVtLgorICoKKyAqICBQbGVhc2Ugc2VuZCBidWcgcmVwb3J0cyB0bzogaGp3QHp2dy5kZQorICovCisKKyNpbmNsdWRlICJhZmZzLmgiCisKK2V4dGVybiBzdHJ1Y3QgdGltZXpvbmUgc3lzX3R6OworCitzdGF0aWMgY2hhciBFcnJvckJ1ZmZlclsyNTZdOworCisvKgorICogRnVuY3Rpb25zIGZvciBhY2Nlc3NpbmcgQW1pZ2EtRkZTIHN0cnVjdHVyZXMuCisgKi8KKworCisvKiBJbnNlcnQgYSBoZWFkZXIgYmxvY2sgYmggaW50byB0aGUgZGlyZWN0b3J5IGRpcgorICogY2FsbGVyIG11c3QgaG9sZCBBRkZTX0RJUi0+aV9oYXNoX2xvY2shCisgKi8KKworaW50CithZmZzX2luc2VydF9oYXNoKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPmlfc2I7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaXJfYmg7CisJdTMyIGlubywgaGFzaF9pbm87CisJaW50IG9mZnNldDsKKworCWlubyA9IGJoLT5iX2Jsb2NrbnI7CisJb2Zmc2V0ID0gYWZmc19oYXNoX25hbWUoc2IsIEFGRlNfVEFJTChzYiwgYmgpLT5uYW1lICsgMSwgQUZGU19UQUlMKHNiLCBiaCktPm5hbWVbMF0pOworCisJcHJfZGVidWcoIkFGRlM6IGluc2VydF9oYXNoKGRpcj0ldSwgaW5vPSVkKVxuIiwgKHUzMilkaXItPmlfaW5vLCBpbm8pOworCisJZGlyX2JoID0gYWZmc19icmVhZChzYiwgZGlyLT5pX2lubyk7CisJaWYgKCFkaXJfYmgpCisJCXJldHVybiAtRUlPOworCisJaGFzaF9pbm8gPSBiZTMyX3RvX2NwdShBRkZTX0hFQUQoZGlyX2JoKS0+dGFibGVbb2Zmc2V0XSk7CisJd2hpbGUgKGhhc2hfaW5vKSB7CisJCWFmZnNfYnJlbHNlKGRpcl9iaCk7CisJCWRpcl9iaCA9IGFmZnNfYnJlYWQoc2IsIGhhc2hfaW5vKTsKKwkJaWYgKCFkaXJfYmgpCisJCQlyZXR1cm4gLUVJTzsKKwkJaGFzaF9pbm8gPSBiZTMyX3RvX2NwdShBRkZTX1RBSUwoc2IsIGRpcl9iaCktPmhhc2hfY2hhaW4pOworCX0KKwlBRkZTX1RBSUwoc2IsIGJoKS0+cGFyZW50ID0gY3B1X3RvX2JlMzIoZGlyLT5pX2lubyk7CisJQUZGU19UQUlMKHNiLCBiaCktPmhhc2hfY2hhaW4gPSAwOworCWFmZnNfZml4X2NoZWNrc3VtKHNiLCBiaCk7CisKKwlpZiAoZGlyLT5pX2lubyA9PSBkaXJfYmgtPmJfYmxvY2tucikKKwkJQUZGU19IRUFEKGRpcl9iaCktPnRhYmxlW29mZnNldF0gPSBjcHVfdG9fYmUzMihpbm8pOworCWVsc2UKKwkJQUZGU19UQUlMKHNiLCBkaXJfYmgpLT5oYXNoX2NoYWluID0gY3B1X3RvX2JlMzIoaW5vKTsKKworCWFmZnNfYWRqdXN0X2NoZWNrc3VtKGRpcl9iaCwgaW5vKTsKKwltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShkaXJfYmgsIGRpcik7CisJYWZmc19icmVsc2UoZGlyX2JoKTsKKworCWRpci0+aV9tdGltZSA9IGRpci0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJZGlyLT5pX3ZlcnNpb24rKzsKKwltYXJrX2lub2RlX2RpcnR5KGRpcik7CisKKwlyZXR1cm4gMDsKK30KKworLyogUmVtb3ZlIGEgaGVhZGVyIGJsb2NrIGZyb20gaXRzIGRpcmVjdG9yeS4KKyAqIGNhbGxlciBtdXN0IGhvbGQgQUZGU19ESVItPmlfaGFzaF9sb2NrIQorICovCisKK2ludAorYWZmc19yZW1vdmVfaGFzaChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGJ1ZmZlcl9oZWFkICpyZW1fYmgpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXUzMiByZW1faW5vLCBoYXNoX2lubzsKKwlfX2JlMzIgaW5vOworCWludCBvZmZzZXQsIHJldHZhbDsKKworCXNiID0gZGlyLT5pX3NiOworCXJlbV9pbm8gPSByZW1fYmgtPmJfYmxvY2tucjsKKwlvZmZzZXQgPSBhZmZzX2hhc2hfbmFtZShzYiwgQUZGU19UQUlMKHNiLCByZW1fYmgpLT5uYW1lKzEsIEFGRlNfVEFJTChzYiwgcmVtX2JoKS0+bmFtZVswXSk7CisJcHJfZGVidWcoIkFGRlM6IHJlbW92ZV9oYXNoKGRpcj0lZCwgaW5vPSVkLCBoYXNodmFsPSVkKVxuIiwgKHUzMilkaXItPmlfaW5vLCByZW1faW5vLCBvZmZzZXQpOworCisJYmggPSBhZmZzX2JyZWFkKHNiLCBkaXItPmlfaW5vKTsKKwlpZiAoIWJoKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHZhbCA9IC1FTk9FTlQ7CisJaGFzaF9pbm8gPSBiZTMyX3RvX2NwdShBRkZTX0hFQUQoYmgpLT50YWJsZVtvZmZzZXRdKTsKKwl3aGlsZSAoaGFzaF9pbm8pIHsKKwkJaWYgKGhhc2hfaW5vID09IHJlbV9pbm8pIHsKKwkJCWlubyA9IEFGRlNfVEFJTChzYiwgcmVtX2JoKS0+aGFzaF9jaGFpbjsKKwkJCWlmIChkaXItPmlfaW5vID09IGJoLT5iX2Jsb2NrbnIpCisJCQkJQUZGU19IRUFEKGJoKS0+dGFibGVbb2Zmc2V0XSA9IGlubzsKKwkJCWVsc2UKKwkJCQlBRkZTX1RBSUwoc2IsIGJoKS0+aGFzaF9jaGFpbiA9IGlubzsKKwkJCWFmZnNfYWRqdXN0X2NoZWNrc3VtKGJoLCBiZTMyX3RvX2NwdShpbm8pIC0gaGFzaF9pbm8pOworCQkJbWFya19idWZmZXJfZGlydHlfaW5vZGUoYmgsIGRpcik7CisJCQlBRkZTX1RBSUwoc2IsIHJlbV9iaCktPnBhcmVudCA9IDA7CisJCQlyZXR2YWwgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJYWZmc19icmVsc2UoYmgpOworCQliaCA9IGFmZnNfYnJlYWQoc2IsIGhhc2hfaW5vKTsKKwkJaWYgKCFiaCkKKwkJCXJldHVybiAtRUlPOworCQloYXNoX2lubyA9IGJlMzJfdG9fY3B1KEFGRlNfVEFJTChzYiwgYmgpLT5oYXNoX2NoYWluKTsKKwl9CisKKwlhZmZzX2JyZWxzZShiaCk7CisKKwlkaXItPmlfbXRpbWUgPSBkaXItPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCWRpci0+aV92ZXJzaW9uKys7CisJbWFya19pbm9kZV9kaXJ0eShkaXIpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQKK2FmZnNfZml4X2RjYWNoZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHUzMiBlbnRyeV9pbm8pCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwl2b2lkICpkYXRhID0gZGVudHJ5LT5kX2ZzZGF0YTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCAqbmV4dDsKKworCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCWhlYWQgPSAmaW5vZGUtPmlfZGVudHJ5OworCW5leHQgPSBoZWFkLT5uZXh0OworCXdoaWxlIChuZXh0ICE9IGhlYWQpIHsKKwkJZGVudHJ5ID0gbGlzdF9lbnRyeShuZXh0LCBzdHJ1Y3QgZGVudHJ5LCBkX2FsaWFzKTsKKwkJaWYgKGVudHJ5X2lubyA9PSAodTMyKShsb25nKWRlbnRyeS0+ZF9mc2RhdGEpIHsKKwkJCWRlbnRyeS0+ZF9mc2RhdGEgPSBkYXRhOworCQkJYnJlYWs7CisJCX0KKwkJbmV4dCA9IG5leHQtPm5leHQ7CisJfQorCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7Cit9CisKKworLyogUmVtb3ZlIGhlYWRlciBmcm9tIGxpbmsgY2hhaW4gKi8KKworc3RhdGljIGludAorYWZmc19yZW1vdmVfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGlub2RlICpkaXIsICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEwsICpsaW5rX2JoID0gTlVMTDsKKwl1MzIgbGlua19pbm8sIGlubzsKKwlpbnQgcmV0dmFsOworCisJcHJfZGVidWcoIkFGRlM6IHJlbW92ZV9saW5rKGtleT0lbGQpXG4iLCBpbm9kZS0+aV9pbm8pOworCXJldHZhbCA9IC1FSU87CisJYmggPSBhZmZzX2JyZWFkKHNiLCBpbm9kZS0+aV9pbm8pOworCWlmICghYmgpCisJCWdvdG8gZG9uZTsKKworCWxpbmtfaW5vID0gKHUzMikobG9uZylkZW50cnktPmRfZnNkYXRhOworCWlmIChpbm9kZS0+aV9pbm8gPT0gbGlua19pbm8pIHsKKwkJLyogd2UgY2FuJ3QgcmVtb3ZlIHRoZSBoZWFkIG9mIHRoZSBsaW5rLCBhcyBpdHMgYmxvY2tuciBpcyBzdGlsbCB1c2VkIGFzIGlubywKKwkJICogc28gd2UgcmVtb3ZlIHRoZSBibG9jayBvZiB0aGUgZmlyc3QgbGluayBpbnN0ZWFkLgorCQkgKi8gCisJCWxpbmtfaW5vID0gYmUzMl90b19jcHUoQUZGU19UQUlMKHNiLCBiaCktPmxpbmtfY2hhaW4pOworCQlsaW5rX2JoID0gYWZmc19icmVhZChzYiwgbGlua19pbm8pOworCQlpZiAoIWxpbmtfYmgpCisJCQlnb3RvIGRvbmU7CisKKwkJZGlyID0gaWdldChzYiwgYmUzMl90b19jcHUoQUZGU19UQUlMKHNiLCBsaW5rX2JoKS0+cGFyZW50KSk7CisJCWlmICghZGlyKQorCQkJZ290byBkb25lOworCisJCWFmZnNfbG9ja19kaXIoZGlyKTsKKwkJYWZmc19maXhfZGNhY2hlKGRlbnRyeSwgbGlua19pbm8pOworCQlyZXR2YWwgPSBhZmZzX3JlbW92ZV9oYXNoKGRpciwgbGlua19iaCk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGRvbmU7CisJCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKGxpbmtfYmgsIGlub2RlKTsKKworCQltZW1jcHkoQUZGU19UQUlMKHNiLCBiaCktPm5hbWUsIEFGRlNfVEFJTChzYiwgbGlua19iaCktPm5hbWUsIDMyKTsKKwkJcmV0dmFsID0gYWZmc19pbnNlcnRfaGFzaChkaXIsIGJoKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gZG9uZTsKKwkJbWFya19idWZmZXJfZGlydHlfaW5vZGUoYmgsIGlub2RlKTsKKworCQlhZmZzX3VubG9ja19kaXIoZGlyKTsKKwkJaXB1dChkaXIpOworCX0gZWxzZSB7CisJCWxpbmtfYmggPSBhZmZzX2JyZWFkKHNiLCBsaW5rX2lubyk7CisJCWlmICghbGlua19iaCkKKwkJCWdvdG8gZG9uZTsKKwl9CisKKwl3aGlsZSAoKGlubyA9IGJlMzJfdG9fY3B1KEFGRlNfVEFJTChzYiwgYmgpLT5saW5rX2NoYWluKSkgIT0gMCkgeworCQlpZiAoaW5vID09IGxpbmtfaW5vKSB7CisJCQlfX2JlMzIgaW5vMiA9IEFGRlNfVEFJTChzYiwgbGlua19iaCktPmxpbmtfY2hhaW47CisJCQlBRkZTX1RBSUwoc2IsIGJoKS0+bGlua19jaGFpbiA9IGlubzI7CisJCQlhZmZzX2FkanVzdF9jaGVja3N1bShiaCwgYmUzMl90b19jcHUoaW5vMikgLSBsaW5rX2lubyk7CisJCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShiaCwgaW5vZGUpOworCQkJcmV0dmFsID0gMDsKKwkJCS8qIEZpeCB0aGUgbGluayBjb3VudCwgaWYgYmggaXMgYSBub3JtYWwgaGVhZGVyIGJsb2NrIHdpdGhvdXQgbGlua3MgKi8KKwkJCXN3aXRjaCAoYmUzMl90b19jcHUoQUZGU19UQUlMKHNiLCBiaCktPnN0eXBlKSkgeworCQkJY2FzZSBTVF9MSU5LRElSOgorCQkJY2FzZSBTVF9MSU5LRklMRToKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJaWYgKCFBRkZTX1RBSUwoc2IsIGJoKS0+bGlua19jaGFpbikKKwkJCQkJaW5vZGUtPmlfbmxpbmsgPSAxOworCQkJfQorCQkJYWZmc19mcmVlX2Jsb2NrKHNiLCBsaW5rX2lubyk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJYWZmc19icmVsc2UoYmgpOworCQliaCA9IGFmZnNfYnJlYWQoc2IsIGlubyk7CisJCWlmICghYmgpCisJCQlnb3RvIGRvbmU7CisJfQorCXJldHZhbCA9IC1FTk9FTlQ7Citkb25lOgorCWFmZnNfYnJlbHNlKGxpbmtfYmgpOworCWFmZnNfYnJlbHNlKGJoKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisKK3N0YXRpYyBpbnQKK2FmZnNfZW1wdHlfZGlyKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaW50IHJldHZhbCwgc2l6ZTsKKworCXJldHZhbCA9IC1FSU87CisJYmggPSBhZmZzX2JyZWFkKHNiLCBpbm9kZS0+aV9pbm8pOworCWlmICghYmgpCisJCWdvdG8gZG9uZTsKKworCXJldHZhbCA9IC1FTk9URU1QVFk7CisJZm9yIChzaXplID0gQUZGU19TQihzYiktPnNfaGFzaHNpemUgLSAxOyBzaXplID49IDA7IHNpemUtLSkKKwkJaWYgKEFGRlNfSEVBRChiaCktPnRhYmxlW3NpemVdKQorCQkJZ290byBub3RfZW1wdHk7CisJcmV0dmFsID0gMDsKK25vdF9lbXB0eToKKwlhZmZzX2JyZWxzZShiaCk7Citkb25lOgorCXJldHVybiByZXR2YWw7Cit9CisKKworLyogUmVtb3ZlIGEgZmlsZXN5c3RlbSBvYmplY3QuIElmIHRoZSBvYmplY3QgdG8gYmUgcmVtb3ZlZCBoYXMKKyAqIGxpbmtzIHRvIGl0LCBvbmUgb2YgdGhlIGxpbmtzIG11c3QgYmUgY2hhbmdlZCB0byBpbmhlcml0CisgKiB0aGUgZmlsZSBvciBkaXJlY3RvcnkuIEFzIGFib3ZlLCBhbnkgaW5vZGUgd2lsbCBkby4KKyAqIFRoZSBidWZmZXIgd2lsbCBub3QgYmUgZnJlZWQuIElmIHRoZSBoZWFkZXIgaXMgYSBsaW5rLCB0aGUKKyAqIGJsb2NrIHdpbGwgYmUgbWFya2VkIGFzIGZyZWUuCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIgaW4gY2FzZSBvZgorICogYW4gZXJyb3IsIGVsc2UgMCBpZiB0aGUgaW5vZGUgaXMgdG8gYmUgZGVsZXRlZCBvciAxIGlmIG5vdC4KKyAqLworCitpbnQKK2FmZnNfcmVtb3ZlX2hlYWRlcihzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlLCAqZGlyOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCWludCByZXR2YWw7CisKKwlkaXIgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOworCXNiID0gZGlyLT5pX3NiOworCisJcmV0dmFsID0gLUVOT0VOVDsKKwlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpZiAoIWlub2RlKQorCQlnb3RvIGRvbmU7CisKKwlwcl9kZWJ1ZygiQUZGUzogcmVtb3ZlX2hlYWRlcihrZXk9JWxkKVxuIiwgaW5vZGUtPmlfaW5vKTsKKwlyZXR2YWwgPSAtRUlPOworCWJoID0gYWZmc19icmVhZChzYiwgKHUzMikobG9uZylkZW50cnktPmRfZnNkYXRhKTsKKwlpZiAoIWJoKQorCQlnb3RvIGRvbmU7CisKKwlhZmZzX2xvY2tfbGluayhpbm9kZSk7CisJYWZmc19sb2NrX2RpcihkaXIpOworCXN3aXRjaCAoYmUzMl90b19jcHUoQUZGU19UQUlMKHNiLCBiaCktPnN0eXBlKSkgeworCWNhc2UgU1RfVVNFUkRJUjoKKwkJLyogaWYgd2UgZXZlciB3YW50IHRvIHN1cHBvcnQgbGlua3MgdG8gZGlycworCQkgKiBpX2hhc2hfbG9jayBvZiB0aGUgaW5vZGUgbXVzdCBvbmx5IGJlCisJCSAqIHRha2VuIGFmdGVyIHNvbWUgY2hlY2tzCisJCSAqLworCQlhZmZzX2xvY2tfZGlyKGlub2RlKTsKKwkJcmV0dmFsID0gYWZmc19lbXB0eV9kaXIoaW5vZGUpOworCQlhZmZzX3VubG9ja19kaXIoaW5vZGUpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBkb25lX3VubG9jazsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dmFsID0gYWZmc19yZW1vdmVfaGFzaChkaXIsIGJoKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGRvbmVfdW5sb2NrOworCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKGJoLCBpbm9kZSk7CisKKwlhZmZzX3VubG9ja19kaXIoZGlyKTsKKworCWlmIChpbm9kZS0+aV9ubGluayA+IDEpCisJCXJldHZhbCA9IGFmZnNfcmVtb3ZlX2xpbmsoZGVudHJ5KTsKKwllbHNlCisJCWlub2RlLT5pX25saW5rID0gMDsKKwlhZmZzX3VubG9ja19saW5rKGlub2RlKTsKKwlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisKK2RvbmU6CisJYWZmc19icmVsc2UoYmgpOworCXJldHVybiByZXR2YWw7CisKK2RvbmVfdW5sb2NrOgorCWFmZnNfdW5sb2NrX2RpcihkaXIpOworCWFmZnNfdW5sb2NrX2xpbmsoaW5vZGUpOworCWdvdG8gZG9uZTsKK30KKworLyogQ2hlY2tzdW0gYSBibG9jaywgZG8gdmFyaW91cyBjb25zaXN0ZW5jeSBjaGVja3MgYW5kIG9wdGlvbmFsbHkgcmV0dXJuCisgICB0aGUgYmxvY2tzIHR5cGUgbnVtYmVyLiAgREFUQSBwb2ludHMgdG8gdGhlIGJsb2NrLiAgSWYgdGhlaXIgcG9pbnRlcnMKKyAgIGFyZSBub24tbnVsbCwgKlBUWVBFIGFuZCAqU1RZUEUgYXJlIHNldCB0byB0aGUgcHJpbWFyeSBhbmQgc2Vjb25kYXJ5CisgICBibG9jayB0eXBlcyByZXNwZWN0aXZlbHksICpIQVNIU0laRSBpcyBzZXQgdG8gdGhlIHNpemUgb2YgdGhlIGhhc2h0YWJsZQorICAgKHdoaWNoIGxldHMgdXMgY2FsY3VsYXRlIHRoZSBibG9jayBzaXplKS4KKyAgIFJldHVybnMgbm9uLXplcm8gaWYgdGhlIGJsb2NrIGlzIG5vdCBjb25zaXN0ZW50LiAqLworCit1MzIKK2FmZnNfY2hlY2tzdW1fYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlfX2JlMzIgKnB0ciA9IChfX2JlMzIgKiliaC0+Yl9kYXRhOworCXUzMiBzdW07CisJaW50IGJzaXplOworCisJc3VtID0gMDsKKwlmb3IgKGJzaXplID0gc2ItPnNfYmxvY2tzaXplIC8gc2l6ZW9mKF9fYmUzMik7IGJzaXplID4gMDsgYnNpemUtLSkKKwkJc3VtICs9IGJlMzJfdG9fY3B1KCpwdHIrKyk7CisJcmV0dXJuIHN1bTsKK30KKworLyoKKyAqIENhbGN1bGF0ZSB0aGUgY2hlY2tzdW0gb2YgYSBkaXNrIGJsb2NrIGFuZCBzdG9yZSBpdAorICogYXQgdGhlIGluZGljYXRlZCBwb3NpdGlvbi4KKyAqLworCit2b2lkCithZmZzX2ZpeF9jaGVja3N1bShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWludCBjbnQgPSBzYi0+c19ibG9ja3NpemUgLyBzaXplb2YoX19iZTMyKTsKKwlfX2JlMzIgKnB0ciA9IChfX2JlMzIgKiliaC0+Yl9kYXRhOworCXUzMiBjaGVja3N1bTsKKwlfX2JlMzIgKmNoZWNrc3VtcHRyOworCisJY2hlY2tzdW1wdHIgPSBwdHIgKyA1OworCSpjaGVja3N1bXB0ciA9IDA7CisJZm9yIChjaGVja3N1bSA9IDA7IGNudCA+IDA7IHB0cisrLCBjbnQtLSkKKwkJY2hlY2tzdW0gKz0gYmUzMl90b19jcHUoKnB0cik7CisJKmNoZWNrc3VtcHRyID0gY3B1X3RvX2JlMzIoLWNoZWNrc3VtKTsKK30KKwordm9pZAorc2Vjc190b19kYXRlc3RhbXAodGltZV90IHNlY3MsIHN0cnVjdCBhZmZzX2RhdGUgKmRzKQoreworCXUzMgkgZGF5czsKKwl1MzIJIG1pbnV0ZTsKKworCXNlY3MgLT0gc3lzX3R6LnR6X21pbnV0ZXN3ZXN0ICogNjAgKyAoKDggKiAzNjUgKyAyKSAqIDI0ICogNjAgKiA2MCk7CisJaWYgKHNlY3MgPCAwKQorCQlzZWNzID0gMDsKKwlkYXlzICAgID0gc2VjcyAvIDg2NDAwOworCXNlY3MgICAtPSBkYXlzICogODY0MDA7CisJbWludXRlICA9IHNlY3MgLyA2MDsKKwlzZWNzICAgLT0gbWludXRlICogNjA7CisKKwlkcy0+ZGF5cyA9IGNwdV90b19iZTMyKGRheXMpOworCWRzLT5taW5zID0gY3B1X3RvX2JlMzIobWludXRlKTsKKwlkcy0+dGlja3MgPSBjcHVfdG9fYmUzMihzZWNzICogNTApOworfQorCittb2RlX3QKK3Byb3RfdG9fbW9kZSh1MzIgcHJvdCkKK3sKKwlpbnQgbW9kZSA9IDA7CisKKwlpZiAoIShwcm90ICYgRklCRl9OT1dSSVRFKSkKKwkJbW9kZSB8PSBTX0lXVVNSOworCWlmICghKHByb3QgJiBGSUJGX05PUkVBRCkpCisJCW1vZGUgfD0gU19JUlVTUjsKKwlpZiAoIShwcm90ICYgRklCRl9OT0VYRUNVVEUpKQorCQltb2RlIHw9IFNfSVhVU1I7CisJaWYgKHByb3QgJiBGSUJGX0dSUF9XUklURSkKKwkJbW9kZSB8PSBTX0lXR1JQOworCWlmIChwcm90ICYgRklCRl9HUlBfUkVBRCkKKwkJbW9kZSB8PSBTX0lSR1JQOworCWlmIChwcm90ICYgRklCRl9HUlBfRVhFQ1VURSkKKwkJbW9kZSB8PSBTX0lYR1JQOworCWlmIChwcm90ICYgRklCRl9PVFJfV1JJVEUpCisJCW1vZGUgfD0gU19JV09USDsKKwlpZiAocHJvdCAmIEZJQkZfT1RSX1JFQUQpCisJCW1vZGUgfD0gU19JUk9USDsKKwlpZiAocHJvdCAmIEZJQkZfT1RSX0VYRUNVVEUpCisJCW1vZGUgfD0gU19JWE9USDsKKworCXJldHVybiBtb2RlOworfQorCit2b2lkCittb2RlX3RvX3Byb3Qoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwl1MzIgcHJvdCA9IEFGRlNfSShpbm9kZSktPmlfcHJvdGVjdDsKKwltb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7CisKKwlpZiAoIShtb2RlICYgU19JWFVTUikpCisJCXByb3QgfD0gRklCRl9OT0VYRUNVVEU7CisJaWYgKCEobW9kZSAmIFNfSVJVU1IpKQorCQlwcm90IHw9IEZJQkZfTk9SRUFEOworCWlmICghKG1vZGUgJiBTX0lXVVNSKSkKKwkJcHJvdCB8PSBGSUJGX05PV1JJVEU7CisJaWYgKG1vZGUgJiBTX0lYR1JQKQorCQlwcm90IHw9IEZJQkZfR1JQX0VYRUNVVEU7CisJaWYgKG1vZGUgJiBTX0lSR1JQKQorCQlwcm90IHw9IEZJQkZfR1JQX1JFQUQ7CisJaWYgKG1vZGUgJiBTX0lXR1JQKQorCQlwcm90IHw9IEZJQkZfR1JQX1dSSVRFOworCWlmIChtb2RlICYgU19JWE9USCkKKwkJcHJvdCB8PSBGSUJGX09UUl9FWEVDVVRFOworCWlmIChtb2RlICYgU19JUk9USCkKKwkJcHJvdCB8PSBGSUJGX09UUl9SRUFEOworCWlmIChtb2RlICYgU19JV09USCkKKwkJcHJvdCB8PSBGSUJGX09UUl9XUklURTsKKworCUFGRlNfSShpbm9kZSktPmlfcHJvdGVjdCA9IHByb3Q7Cit9CisKK3ZvaWQKK2FmZnNfZXJyb3Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqZnVuY3Rpb24sIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QJIGFyZ3M7CisKKwl2YV9zdGFydChhcmdzLGZtdCk7CisJdnNwcmludGYoRXJyb3JCdWZmZXIsZm10LGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKworCXByaW50ayhLRVJOX0NSSVQgIkFGRlMgZXJyb3IgKGRldmljZSAlcyk6ICVzKCk6ICVzXG4iLCBzYi0+c19pZCwKKwkJZnVuY3Rpb24sRXJyb3JCdWZmZXIpOworCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQUZGUzogUmVtb3VudGluZyBmaWxlc3lzdGVtIHJlYWQtb25seVxuIik7CisJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworfQorCit2b2lkCithZmZzX3dhcm5pbmcoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqZnVuY3Rpb24sIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QJIGFyZ3M7CisKKwl2YV9zdGFydChhcmdzLGZtdCk7CisJdnNwcmludGYoRXJyb3JCdWZmZXIsZm10LGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgIkFGRlMgd2FybmluZyAoZGV2aWNlICVzKTogJXMoKTogJXNcbiIsIHNiLT5zX2lkLAorCQlmdW5jdGlvbixFcnJvckJ1ZmZlcik7Cit9CisKKy8qIENoZWNrIGlmIHRoZSBuYW1lIGlzIHZhbGlkIGZvciBhIGFmZnMgb2JqZWN0LiAqLworCitpbnQKK2FmZnNfY2hlY2tfbmFtZShjb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lLCBpbnQgbGVuKQoreworCWludAkgaTsKKworCWlmIChsZW4gPiAzMCkKKyNpZmRlZiBBRkZTX05PX1RSVU5DQVRFCisJCXJldHVybiAtRU5BTUVUT09MT05HOworI2Vsc2UKKwkJbGVuID0gMzA7CisjZW5kaWYKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlpZiAobmFtZVtpXSA8ICcgJyB8fCBuYW1lW2ldID09ICc6JworCQkgICAgfHwgKG5hbWVbaV0gPiAweDdlICYmIG5hbWVbaV0gPCAweGEwKSkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGNvcGllcyBuYW1lIHRvIGJzdHIsIHdpdGggYXQgbW9zdCAzMAorICogY2hhcmFjdGVycyBsZW5ndGguIFRoZSBic3RyIHdpbGwgYmUgcHJlcGVuZGVkIGJ5CisgKiBhIGxlbmd0aCBieXRlLgorICogTk9URTogVGhlIG5hbWUgd2lsbCBtdXN0IGJlIGFscmVhZHkgY2hlY2tlZCBieQorICogICAgICAgYWZmc19jaGVja19uYW1lKCkhCisgKi8KKworaW50CithZmZzX2NvcHlfbmFtZSh1bnNpZ25lZCBjaGFyICpic3RyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJaW50IGxlbiA9IG1pbihkZW50cnktPmRfbmFtZS5sZW4sIDMwdSk7CisKKwkqYnN0cisrID0gbGVuOworCW1lbWNweShic3RyLCBkZW50cnktPmRfbmFtZS5uYW1lLCBsZW4pOworCXJldHVybiBsZW47Cit9CmRpZmYgLS1naXQgYS9mcy9hZmZzL2JpdG1hcC5jIGIvZnMvYWZmcy9iaXRtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGI5NTM2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZmcy9iaXRtYXAuYwpAQCAtMCwwICsxLDM5MCBAQAorLyoKKyAqICBsaW51eC9mcy9hZmZzL2JpdG1hcC5jCisgKgorICogIChjKSAxOTk2IEhhbnMtSm9hY2hpbSBXaWRtYWllcgorICoKKyAqICBiaXRtYXAuYyBjb250YWlucyB0aGUgY29kZSB0aGF0IGhhbmRsZXMgYWxsIGJpdG1hcCByZWxhdGVkIHN0dWZmIC0KKyAqICBibG9jayBhbGxvY2F0aW9uLCBkZWFsbG9jYXRpb24sIGNhbGN1bGF0aW9uIG9mIGZyZWUgc3BhY2UuCisgKi8KKworI2luY2x1ZGUgImFmZnMuaCIKKworLyogVGhpcyBpcywgb2YgY291cnNlLCBzaGFtZWxlc3NseSBzdG9sZW4gZnJvbSBmcy9taW5peCAqLworCitzdGF0aWMgaW50IG5pYmJsZW1hcFtdID0geyAwLDEsMSwyLDEsMiwyLDMsMSwyLDIsMywyLDMsMyw0IH07CisKK3N0YXRpYyB1MzIKK2FmZnNfY291bnRfZnJlZV9iaXRzKHUzMiBibG9ja3NpemUsIGNvbnN0IHZvaWQgKmRhdGEpCit7CisJY29uc3QgdTMyICptYXA7CisJdTMyIGZyZWU7CisJdTMyIHRtcDsKKworCW1hcCA9IGRhdGE7CisJZnJlZSA9IDA7CisJZm9yIChibG9ja3NpemUgLz0gNDsgYmxvY2tzaXplID4gMDsgYmxvY2tzaXplLS0pIHsKKwkJdG1wID0gKm1hcCsrOworCQl3aGlsZSAodG1wKSB7CisJCQlmcmVlICs9IG5pYmJsZW1hcFt0bXAgJiAweGZdOworCQkJdG1wID4+PSA0OworCQl9CisJfQorCisJcmV0dXJuIGZyZWU7Cit9CisKK3UzMgorYWZmc19jb3VudF9mcmVlX2Jsb2NrcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBhZmZzX2JtX2luZm8gKmJtOworCXUzMiBmcmVlOworCWludCBpOworCisJcHJfZGVidWcoIkFGRlM6IGNvdW50X2ZyZWVfYmxvY2tzKClcbiIpOworCisJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQorCQlyZXR1cm4gMDsKKworCWRvd24oJkFGRlNfU0Ioc2IpLT5zX2JtbG9jayk7CisKKwlibSA9IEFGRlNfU0Ioc2IpLT5zX2JpdG1hcDsKKwlmcmVlID0gMDsKKwlmb3IgKGkgPSBBRkZTX1NCKHNiKS0+c19ibWFwX2NvdW50OyBpID4gMDsgYm0rKywgaS0tKQorCQlmcmVlICs9IGJtLT5ibV9mcmVlOworCisJdXAoJkFGRlNfU0Ioc2IpLT5zX2JtbG9jayk7CisKKwlyZXR1cm4gZnJlZTsKK30KKwordm9pZAorYWZmc19mcmVlX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHUzMiBibG9jaykKK3sKKwlzdHJ1Y3QgYWZmc19zYl9pbmZvICpzYmkgPSBBRkZTX1NCKHNiKTsKKwlzdHJ1Y3QgYWZmc19ibV9pbmZvICpibTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXUzMiBibGssIGJtYXAsIGJpdCwgbWFzaywgdG1wOworCV9fYmUzMiAqZGF0YTsKKworCXByX2RlYnVnKCJBRkZTOiBmcmVlX2Jsb2NrKCV1KVxuIiwgYmxvY2spOworCisJaWYgKGJsb2NrID4gc2JpLT5zX3BhcnRpdGlvbl9zaXplKQorCQlnb3RvIGVycl9yYW5nZTsKKworCWJsayAgICAgPSBibG9jayAtIHNiaS0+c19yZXNlcnZlZDsKKwlibWFwICAgID0gYmxrIC8gc2JpLT5zX2JtYXBfYml0czsKKwliaXQgICAgID0gYmxrICUgc2JpLT5zX2JtYXBfYml0czsKKwlibSAgICAgID0gJnNiaS0+c19iaXRtYXBbYm1hcF07CisKKwlkb3duKCZzYmktPnNfYm1sb2NrKTsKKworCWJoID0gc2JpLT5zX2JtYXBfYmg7CisJaWYgKHNiaS0+c19sYXN0X2JtYXAgIT0gYm1hcCkgeworCQlhZmZzX2JyZWxzZShiaCk7CisJCWJoID0gYWZmc19icmVhZChzYiwgYm0tPmJtX2tleSk7CisJCWlmICghYmgpCisJCQlnb3RvIGVycl9iaF9yZWFkOworCQlzYmktPnNfYm1hcF9iaCA9IGJoOworCQlzYmktPnNfbGFzdF9ibWFwID0gYm1hcDsKKwl9CisKKwltYXNrID0gMSA8PCAoYml0ICYgMzEpOworCWRhdGEgPSAoX19iZTMyICopYmgtPmJfZGF0YSArIGJpdCAvIDMyICsgMTsKKworCS8qIG1hcmsgYmxvY2sgZnJlZSAqLworCXRtcCA9IGJlMzJfdG9fY3B1KCpkYXRhKTsKKwlpZiAodG1wICYgbWFzaykKKwkJZ290byBlcnJfZnJlZTsKKwkqZGF0YSA9IGNwdV90b19iZTMyKHRtcCB8IG1hc2spOworCisJLyogZml4IGNoZWNrc3VtICovCisJdG1wID0gYmUzMl90b19jcHUoKihfX2JlMzIgKiliaC0+Yl9kYXRhKTsKKwkqKF9fYmUzMiAqKWJoLT5iX2RhdGEgPSBjcHVfdG9fYmUzMih0bXAgLSBtYXNrKTsKKworCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwlzYi0+c19kaXJ0ID0gMTsKKwlibS0+Ym1fZnJlZSsrOworCisJdXAoJnNiaS0+c19ibWxvY2spOworCXJldHVybjsKKworZXJyX2ZyZWU6CisJYWZmc193YXJuaW5nKHNiLCJhZmZzX2ZyZWVfYmxvY2siLCJUcnlpbmcgdG8gZnJlZSBibG9jayAldSB3aGljaCBpcyBhbHJlYWR5IGZyZWUiLCBibG9jayk7CisJdXAoJnNiaS0+c19ibWxvY2spOworCXJldHVybjsKKworZXJyX2JoX3JlYWQ6CisJYWZmc19lcnJvcihzYiwiYWZmc19mcmVlX2Jsb2NrIiwiQ2Fubm90IHJlYWQgYml0bWFwIGJsb2NrICV1IiwgYm0tPmJtX2tleSk7CisJc2JpLT5zX2JtYXBfYmggPSBOVUxMOworCXNiaS0+c19sYXN0X2JtYXAgPSB+MDsKKwl1cCgmc2JpLT5zX2JtbG9jayk7CisJcmV0dXJuOworCitlcnJfcmFuZ2U6CisJYWZmc19lcnJvcihzYiwgImFmZnNfZnJlZV9ibG9jayIsIkJsb2NrICV1IG91dHNpZGUgcGFydGl0aW9uIiwgYmxvY2spOworCXJldHVybjsKK30KKworLyoKKyAqIEFsbG9jYXRlIGEgYmxvY2sgaW4gdGhlIGdpdmVuIGFsbG9jYXRpb24gem9uZS4KKyAqIFNpbmNlIHdlIGhhdmUgdG8gYnl0ZS1zd2FwIHRoZSBiaXRtYXAgb24gbGl0dGxlLWVuZGlhbgorICogbWFjaGluZXMsIHRoaXMgaXMgcmF0aGVyIGV4cGVuc2l2ZS4gVGhlcmVmb3Igd2Ugd2lsbAorICogcHJlYWxsb2NhdGUgdXAgdG8gMTYgYmxvY2tzIGZyb20gdGhlIHNhbWUgd29yZCwgaWYKKyAqIHBvc3NpYmxlLiBXZSBhcmUgbm90IGRvaW5nIHByZWFsbG9jYXRpb25zIGluIHRoZQorICogaGVhZGVyIHpvbmUsIHRob3VnaC4KKyAqLworCit1MzIKK2FmZnNfYWxsb2NfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgdTMyIGdvYWwpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwlzdHJ1Y3QgYWZmc19zYl9pbmZvICpzYmk7CisJc3RydWN0IGFmZnNfYm1faW5mbyAqYm07CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlfX2JlMzIgKmRhdGEsICplbmRkYXRhOworCXUzMiBibGssIGJtYXAsIGJpdCwgbWFzaywgbWFzazIsIHRtcDsKKwlpbnQgaTsKKworCXNiID0gaW5vZGUtPmlfc2I7CisJc2JpID0gQUZGU19TQihzYik7CisKKwlwcl9kZWJ1ZygiQUZGUzogYmFsbG9jKGlub2RlPSVsdSxnb2FsPSV1KTogIiwgaW5vZGUtPmlfaW5vLCBnb2FsKTsKKworCWlmIChBRkZTX0koaW5vZGUpLT5pX3BhX2NudCkgeworCQlwcl9kZWJ1ZygiJWRcbiIsIEFGRlNfSShpbm9kZSktPmlfbGFzdGFsbG9jKzEpOworCQlBRkZTX0koaW5vZGUpLT5pX3BhX2NudC0tOworCQlyZXR1cm4gKytBRkZTX0koaW5vZGUpLT5pX2xhc3RhbGxvYzsKKwl9CisKKwlpZiAoIWdvYWwgfHwgZ29hbCA+IHNiaS0+c19wYXJ0aXRpb25fc2l6ZSkgeworCQlpZiAoZ29hbCkKKwkJCWFmZnNfd2FybmluZyhzYiwgImFmZnNfYmFsbG9jIiwgImludmFsaWQgZ29hbCAlZCIsIGdvYWwpOworCQkvL2lmICghQUZGU19JKGlub2RlKS0+aV9sYXN0X2Jsb2NrKQorCQkvLwlhZmZzX3dhcm5pbmcoc2IsICJhZmZzX2JhbGxvYyIsICJubyBsYXN0IGFsbG9jIGJsb2NrIik7CisJCWdvYWwgPSBzYmktPnNfcmVzZXJ2ZWQ7CisJfQorCisJYmxrID0gZ29hbCAtIHNiaS0+c19yZXNlcnZlZDsKKwlibWFwID0gYmxrIC8gc2JpLT5zX2JtYXBfYml0czsKKwlibSA9ICZzYmktPnNfYml0bWFwW2JtYXBdOworCisJZG93bigmc2JpLT5zX2JtbG9jayk7CisKKwlpZiAoYm0tPmJtX2ZyZWUpCisJCWdvdG8gZmluZF9ibWFwX2JpdDsKKworZmluZF9ibWFwOgorCS8qIHNlYXJjaCBmb3IgdGhlIG5leHQgYm1hcCBidWZmZXIgd2l0aCBmcmVlIGJpdHMgKi8KKwlpID0gc2JpLT5zX2JtYXBfY291bnQ7CisJZG8geworCQlpZiAoLS1pIDwgMCkKKwkJCWdvdG8gZXJyX2Z1bGw7CisJCWJtYXArKzsKKwkJYm0rKzsKKwkJaWYgKGJtYXAgPCBzYmktPnNfYm1hcF9jb3VudCkKKwkJCWNvbnRpbnVlOworCQkvKiByZXN0YXJ0IHNlYXJjaCBhdCB6ZXJvICovCisJCWJtYXAgPSAwOworCQlibSA9IHNiaS0+c19iaXRtYXA7CisJfSB3aGlsZSAoIWJtLT5ibV9mcmVlKTsKKwlibGsgPSBibWFwICogc2JpLT5zX2JtYXBfYml0czsKKworZmluZF9ibWFwX2JpdDoKKworCWJoID0gc2JpLT5zX2JtYXBfYmg7CisJaWYgKHNiaS0+c19sYXN0X2JtYXAgIT0gYm1hcCkgeworCQlhZmZzX2JyZWxzZShiaCk7CisJCWJoID0gYWZmc19icmVhZChzYiwgYm0tPmJtX2tleSk7CisJCWlmICghYmgpCisJCQlnb3RvIGVycl9iaF9yZWFkOworCQlzYmktPnNfYm1hcF9iaCA9IGJoOworCQlzYmktPnNfbGFzdF9ibWFwID0gYm1hcDsKKwl9CisKKwkvKiBmaW5kIGFuIHVudXNlZCBibG9jayBpbiB0aGlzIGJpdG1hcCBibG9jayAqLworCWJpdCA9IGJsayAlIHNiaS0+c19ibWFwX2JpdHM7CisJZGF0YSA9IChfX2JlMzIgKiliaC0+Yl9kYXRhICsgYml0IC8gMzIgKyAxOworCWVuZGRhdGEgPSAoX19iZTMyICopKCh1OCAqKWJoLT5iX2RhdGEgKyBzYi0+c19ibG9ja3NpemUpOworCW1hc2sgPSB+MFVMIDw8IChiaXQgJiAzMSk7CisJYmxrICY9IH4zMVVMOworCisJdG1wID0gYmUzMl90b19jcHUoKmRhdGEpOworCWlmICh0bXAgJiBtYXNrKQorCQlnb3RvIGZpbmRfYml0OworCisJLyogc2NhbiB0aGUgcmVzdCBvZiB0aGUgYnVmZmVyICovCisJZG8geworCQlibGsgKz0gMzI7CisJCWlmICgrK2RhdGEgPj0gZW5kZGF0YSkKKwkJCS8qIGRpZG4ndCBmaW5kIHNvbWV0aGluZywgY2FuIG9ubHkgaGFwcGVuCisJCQkgKiBpZiBzY2FuIGRpZG4ndCBzdGFydCBhdCAwLCB0cnkgbmV4dCBibWFwCisJCQkgKi8KKwkJCWdvdG8gZmluZF9ibWFwOworCX0gd2hpbGUgKCEqZGF0YSk7CisJdG1wID0gYmUzMl90b19jcHUoKmRhdGEpOworCW1hc2sgPSB+MDsKKworZmluZF9iaXQ6CisJLyogZmluYWxseSBsb29rIGZvciBhIGZyZWUgYml0IGluIHRoZSB3b3JkICovCisJYml0ID0gZmZzKHRtcCAmIG1hc2spIC0gMTsKKwlibGsgKz0gYml0ICsgc2JpLT5zX3Jlc2VydmVkOworCW1hc2syID0gbWFzayA9IDEgPDwgKGJpdCAmIDMxKTsKKwlBRkZTX0koaW5vZGUpLT5pX2xhc3RhbGxvYyA9IGJsazsKKworCS8qIHByZWFsbG9jIGFzIG11Y2ggYXMgcG9zc2libGUgd2l0aGluIHRoaXMgd29yZCAqLworCXdoaWxlICgobWFzazIgPDw9IDEpKSB7CisJCWlmICghKHRtcCAmIG1hc2syKSkKKwkJCWJyZWFrOworCQlBRkZTX0koaW5vZGUpLT5pX3BhX2NudCsrOworCQltYXNrIHw9IG1hc2syOworCX0KKwlibS0+Ym1fZnJlZSAtPSBBRkZTX0koaW5vZGUpLT5pX3BhX2NudCArIDE7CisKKwkqZGF0YSA9IGNwdV90b19iZTMyKHRtcCAmIH5tYXNrKTsKKworCS8qIGZpeCBjaGVja3N1bSAqLworCXRtcCA9IGJlMzJfdG9fY3B1KCooX19iZTMyICopYmgtPmJfZGF0YSk7CisJKihfX2JlMzIgKiliaC0+Yl9kYXRhID0gY3B1X3RvX2JlMzIodG1wICsgbWFzayk7CisKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJc2ItPnNfZGlydCA9IDE7CisKKwl1cCgmc2JpLT5zX2JtbG9jayk7CisKKwlwcl9kZWJ1ZygiJWRcbiIsIGJsayk7CisJcmV0dXJuIGJsazsKKworZXJyX2JoX3JlYWQ6CisJYWZmc19lcnJvcihzYiwiYWZmc19yZWFkX2Jsb2NrIiwiQ2Fubm90IHJlYWQgYml0bWFwIGJsb2NrICV1IiwgYm0tPmJtX2tleSk7CisJc2JpLT5zX2JtYXBfYmggPSBOVUxMOworCXNiaS0+c19sYXN0X2JtYXAgPSB+MDsKK2Vycl9mdWxsOgorCXVwKCZzYmktPnNfYm1sb2NrKTsKKwlwcl9kZWJ1ZygiZmFpbGVkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGFmZnNfaW5pdF9iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50ICpmbGFncykKK3sKKwlzdHJ1Y3QgYWZmc19ibV9pbmZvICpibTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJtYXBfYmggPSBOVUxMLCAqYmggPSBOVUxMOworCV9fYmUzMiAqYm1hcF9ibGs7CisJdTMyIHNpemUsIGJsaywgZW5kLCBvZmZzZXQsIG1hc2s7CisJaW50IGksIHJlcyA9IDA7CisJc3RydWN0IGFmZnNfc2JfaW5mbyAqc2JpID0gQUZGU19TQihzYik7CisKKwlpZiAoKmZsYWdzICYgTVNfUkRPTkxZKQorCQlyZXR1cm4gMDsKKworCWlmICghQUZGU19ST09UX1RBSUwoc2IsIHNiaS0+c19yb290X2JoKS0+Ym1fZmxhZykgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIkFGRlM6IEJpdG1hcCBpbnZhbGlkIC0gbW91bnRpbmcgJXMgcmVhZCBvbmx5XG4iLAorCQkJc2ItPnNfaWQpOworCQkqZmxhZ3MgfD0gTVNfUkRPTkxZOworCQlyZXR1cm4gMDsKKwl9CisKKwlzYmktPnNfbGFzdF9ibWFwID0gfjA7CisJc2JpLT5zX2JtYXBfYmggPSBOVUxMOworCXNiaS0+c19ibWFwX2JpdHMgPSBzYi0+c19ibG9ja3NpemUgKiA4IC0gMzI7CisJc2JpLT5zX2JtYXBfY291bnQgPSAoc2JpLT5zX3BhcnRpdGlvbl9zaXplIC0gc2JpLT5zX3Jlc2VydmVkICsKKwkJCQkgc2JpLT5zX2JtYXBfYml0cyAtIDEpIC8gc2JpLT5zX2JtYXBfYml0czsKKwlzaXplID0gc2JpLT5zX2JtYXBfY291bnQgKiBzaXplb2YoKmJtKTsKKwlibSA9IHNiaS0+c19iaXRtYXAgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghc2JpLT5zX2JpdG1hcCkgeworCQlwcmludGsoS0VSTl9FUlIgIkFGRlM6IEJpdG1hcCBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoc2JpLT5zX2JpdG1hcCwgMCwgc2l6ZSk7CisKKwlibWFwX2JsayA9IChfX2JlMzIgKilzYmktPnNfcm9vdF9iaC0+Yl9kYXRhOworCWJsayA9IHNiLT5zX2Jsb2Nrc2l6ZSAvIDQgLSA0OTsKKwllbmQgPSBibGsgKyAyNTsKKworCWZvciAoaSA9IHNiaS0+c19ibWFwX2NvdW50OyBpID4gMDsgYm0rKywgaS0tKSB7CisJCWFmZnNfYnJlbHNlKGJoKTsKKworCQlibS0+Ym1fa2V5ID0gYmUzMl90b19jcHUoYm1hcF9ibGtbYmxrXSk7CisJCWJoID0gYWZmc19icmVhZChzYiwgYm0tPmJtX2tleSk7CisJCWlmICghYmgpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiQUZGUzogQ2Fubm90IHJlYWQgYml0bWFwXG4iKTsKKwkJCXJlcyA9IC1FSU87CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoYWZmc19jaGVja3N1bV9ibG9jayhzYiwgYmgpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJBRkZTOiBCaXRtYXAgJXUgaW52YWxpZCAtIG1vdW50aW5nICVzIHJlYWQgb25seS5cbiIsCisJCQkgICAgICAgYm0tPmJtX2tleSwgc2ItPnNfaWQpOworCQkJKmZsYWdzIHw9IE1TX1JET05MWTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXByX2RlYnVnKCJBRkZTOiByZWFkIGJpdG1hcCBibG9jayAlZDogJWRcbiIsIGJsaywgYm0tPmJtX2tleSk7CisJCWJtLT5ibV9mcmVlID0gYWZmc19jb3VudF9mcmVlX2JpdHMoc2ItPnNfYmxvY2tzaXplIC0gNCwgYmgtPmJfZGF0YSArIDQpOworCisJCS8qIERvbid0IHRyeSByZWFkIHRoZSBleHRlbnNpb24gaWYgdGhpcyBpcyB0aGUgbGFzdCBibG9jaywKKwkJICogYnV0IHdlIGFsc28gbmVlZCB0aGUgcmlnaHQgYm0gcG9pbnRlciBiZWxvdworCQkgKi8KKwkJaWYgKCsrYmxrIDwgZW5kIHx8IGkgPT0gMSkKKwkJCWNvbnRpbnVlOworCQlpZiAoYm1hcF9iaCkKKwkJCWFmZnNfYnJlbHNlKGJtYXBfYmgpOworCQlibWFwX2JoID0gYWZmc19icmVhZChzYiwgYmUzMl90b19jcHUoYm1hcF9ibGtbYmxrXSkpOworCQlpZiAoIWJtYXBfYmgpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiQUZGUzogQ2Fubm90IHJlYWQgYml0bWFwIGV4dGVuc2lvblxuIik7CisJCQlyZXMgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwkJYm1hcF9ibGsgPSAoX19iZTMyICopYm1hcF9iaC0+Yl9kYXRhOworCQlibGsgPSAwOworCQllbmQgPSBzYi0+c19ibG9ja3NpemUgLyA0IC0gMTsKKwl9CisKKwlvZmZzZXQgPSAoc2JpLT5zX3BhcnRpdGlvbl9zaXplIC0gc2JpLT5zX3Jlc2VydmVkKSAlIHNiaS0+c19ibWFwX2JpdHM7CisJbWFzayA9IH4oMHhGRkZGRkZGRlUgPDwgKG9mZnNldCAmIDMxKSk7CisJcHJfZGVidWcoImxhc3Qgd29yZDogJWQgJWQgJWRcbiIsIG9mZnNldCwgb2Zmc2V0IC8gMzIgKyAxLCBtYXNrKTsKKwlvZmZzZXQgPSBvZmZzZXQgLyAzMiArIDE7CisKKwlpZiAobWFzaykgeworCQl1MzIgb2xkLCBuZXc7CisKKwkJLyogTWFyayB1bnVzZWQgYml0cyBpbiB0aGUgbGFzdCB3b3JkIGFzIGFsbG9jYXRlZCAqLworCQlvbGQgPSBiZTMyX3RvX2NwdSgoKF9fYmUzMiAqKWJoLT5iX2RhdGEpW29mZnNldF0pOworCQluZXcgPSBvbGQgJiBtYXNrOworCQkvL2lmIChvbGQgIT0gbmV3KSB7CisJCQkoKF9fYmUzMiAqKWJoLT5iX2RhdGEpW29mZnNldF0gPSBjcHVfdG9fYmUzMihuZXcpOworCQkJLyogZml4IGNoZWNrc3VtICovCisJCQkvL25ldyAtPSBvbGQ7CisJCQkvL29sZCA9IGJlMzJfdG9fY3B1KCooX19iZTMyICopYmgtPmJfZGF0YSk7CisJCQkvLyooX19iZTMyICopYmgtPmJfZGF0YSA9IGNwdV90b19iZTMyKG9sZCAtIG5ldyk7CisJCQkvL21hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwkJLy99CisJCS8qIGNvcnJlY3Qgb2Zmc2V0IGZvciB0aGUgYml0bWFwIGNvdW50IGJlbG93ICovCisJCS8vb2Zmc2V0Kys7CisJfQorCXdoaWxlICgrK29mZnNldCA8IHNiLT5zX2Jsb2Nrc2l6ZSAvIDQpCisJCSgoX19iZTMyICopYmgtPmJfZGF0YSlbb2Zmc2V0XSA9IDA7CisJKChfX2JlMzIgKiliaC0+Yl9kYXRhKVswXSA9IDA7CisJKChfX2JlMzIgKiliaC0+Yl9kYXRhKVswXSA9IGNwdV90b19iZTMyKC1hZmZzX2NoZWNrc3VtX2Jsb2NrKHNiLCBiaCkpOworCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKworCS8qIHJlY2FsY3VsYXRlIGJpdG1hcCBjb3VudCBmb3IgbGFzdCBibG9jayAqLworCWJtLS07CisJYm0tPmJtX2ZyZWUgPSBhZmZzX2NvdW50X2ZyZWVfYml0cyhzYi0+c19ibG9ja3NpemUgLSA0LCBiaC0+Yl9kYXRhICsgNCk7CisKK291dDoKKwlhZmZzX2JyZWxzZShiaCk7CisJYWZmc19icmVsc2UoYm1hcF9iaCk7CisJcmV0dXJuIHJlczsKK30KKwordm9pZCBhZmZzX2ZyZWVfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGFmZnNfc2JfaW5mbyAqc2JpID0gQUZGU19TQihzYik7CisKKwlpZiAoIXNiaS0+c19iaXRtYXApCisJCXJldHVybjsKKworCWFmZnNfYnJlbHNlKHNiaS0+c19ibWFwX2JoKTsKKwlzYmktPnNfYm1hcF9iaCA9IE5VTEw7CisJc2JpLT5zX2xhc3RfYm1hcCA9IH4wOworCWtmcmVlKHNiaS0+c19iaXRtYXApOworCXNiaS0+c19iaXRtYXAgPSBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZnMvYWZmcy9kaXIuYyBiL2ZzL2FmZnMvZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ4ZWZkMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2FmZnMvZGlyLmMKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiAgbGludXgvZnMvYWZmcy9kaXIuYworICoKKyAqICAoYykgMTk5NiAgSGFucy1Kb2FjaGltIFdpZG1haWVyIC0gUmV3cml0dGVuCisgKgorICogIChDKSAxOTkzICBSYXkgQnVyciAtIE1vZGlmaWVkIGZvciBBbWlnYSBGRlMgZmlsZXN5c3RlbS4KKyAqCisgKiAgKEMpIDE5OTIgIEVyaWMgWW91bmdkYWxlIE1vZGlmaWVkIGZvciBJU08gOTY2MCBmaWxlc3lzdGVtLgorICoKKyAqICAoQykgMTk5MSAgTGludXMgVG9ydmFsZHMgLSBtaW5peCBmaWxlc3lzdGVtCisgKgorICogIGFmZnMgZGlyZWN0b3J5IGhhbmRsaW5nIGZ1bmN0aW9ucworICoKKyAqLworCisjaW5jbHVkZSAiYWZmcy5oIgorCitzdGF0aWMgaW50IGFmZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqLCB2b2lkICosIGZpbGxkaXJfdCk7CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWZmc19kaXJfb3BlcmF0aW9ucyA9IHsKKwkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAorCS5yZWFkZGlyCT0gYWZmc19yZWFkZGlyLAorCS5mc3luYwkJPSBmaWxlX2ZzeW5jLAorfTsKKworLyoKKyAqIGRpcmVjdG9yaWVzIGNhbiBoYW5kbGUgbW9zdCBvcGVyYXRpb25zLi4uCisgKi8KK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGFmZnNfZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLmNyZWF0ZQkJPSBhZmZzX2NyZWF0ZSwKKwkubG9va3VwCQk9IGFmZnNfbG9va3VwLAorCS5saW5rCQk9IGFmZnNfbGluaywKKwkudW5saW5rCQk9IGFmZnNfdW5saW5rLAorCS5zeW1saW5rCT0gYWZmc19zeW1saW5rLAorCS5ta2RpcgkJPSBhZmZzX21rZGlyLAorCS5ybWRpcgkJPSBhZmZzX3JtZGlyLAorCS5yZW5hbWUJCT0gYWZmc19yZW5hbWUsCisJLnNldGF0dHIJPSBhZmZzX25vdGlmeV9jaGFuZ2UsCit9OworCitzdGF0aWMgaW50CithZmZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJc3RydWN0IGlub2RlCQkqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sJKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGJ1ZmZlcl9oZWFkCSpkaXJfYmg7CisJc3RydWN0IGJ1ZmZlcl9oZWFkCSpmaF9iaDsKKwl1bnNpZ25lZCBjaGFyCQkqbmFtZTsKKwlpbnQJCQkgbmFtZWxlbjsKKwl1MzIJCQkgaTsKKwlpbnQJCQkgaGFzaF9wb3M7CisJaW50CQkJIGNoYWluX3BvczsKKwl1MzIJCQkgZl9wb3M7CisJdTMyCQkJIGlubzsKKwlpbnQJCQkgc3RvcmVkOworCWludAkJCSByZXM7CisKKwlwcl9kZWJ1ZygiQUZGUzogcmVhZGRpcihpbm89JWx1LGZfcG9zPSVseClcbiIsaW5vZGUtPmlfaW5vLCh1bnNpZ25lZCBsb25nKWZpbHAtPmZfcG9zKTsKKworCXN0b3JlZCA9IDA7CisJcmVzICAgID0gLUVJTzsKKwlkaXJfYmggPSBOVUxMOworCWZoX2JoICA9IE5VTEw7CisJZl9wb3MgID0gZmlscC0+Zl9wb3M7CisKKwlpZiAoZl9wb3MgPT0gMCkgeworCQlmaWxwLT5wcml2YXRlX2RhdGEgPSAodm9pZCAqKTA7CisJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4iLCAxLCBmX3BvcywgaW5vZGUtPmlfaW5vLCBEVF9ESVIpIDwgMCkKKwkJCXJldHVybiAwOworCQlmaWxwLT5mX3BvcyA9IGZfcG9zID0gMTsKKwkJc3RvcmVkKys7CisJfQorCWlmIChmX3BvcyA9PSAxKSB7CisJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4uIiwgMiwgZl9wb3MsIHBhcmVudF9pbm8oZmlscC0+Zl9kZW50cnkpLCBEVF9ESVIpIDwgMCkKKwkJCXJldHVybiBzdG9yZWQ7CisJCWZpbHAtPmZfcG9zID0gZl9wb3MgPSAyOworCQlzdG9yZWQrKzsKKwl9CisKKwlhZmZzX2xvY2tfZGlyKGlub2RlKTsKKwljaGFpbl9wb3MgPSAoZl9wb3MgLSAyKSAmIDB4ZmZmZjsKKwloYXNoX3BvcyAgPSAoZl9wb3MgLSAyKSA+PiAxNjsKKwlpZiAoY2hhaW5fcG9zID09IDB4ZmZmZikgeworCQlhZmZzX3dhcm5pbmcoc2IsICJyZWFkZGlyIiwgIk1vcmUgdGhhbiA2NTUzNSBlbnRyaWVzIGluIGNoYWluIik7CisJCWNoYWluX3BvcyA9IDA7CisJCWhhc2hfcG9zKys7CisJCWZpbHAtPmZfcG9zID0gKChoYXNoX3BvcyA8PCAxNikgfCBjaGFpbl9wb3MpICsgMjsKKwl9CisJZGlyX2JoID0gYWZmc19icmVhZChzYiwgaW5vZGUtPmlfaW5vKTsKKwlpZiAoIWRpcl9iaCkKKwkJZ290byByZWFkZGlyX291dDsKKworCS8qIElmIHRoZSBkaXJlY3RvcnkgaGFzbid0IGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgY2FsbCB0byByZWFkZGlyKCksCisJICogd2UgY2FuIGp1bXAgZGlyZWN0bHkgdG8gd2hlcmUgd2UgbGVmdCBvZmYuCisJICovCisJaW5vID0gKHUzMikobG9uZylmaWxwLT5wcml2YXRlX2RhdGE7CisJaWYgKGlubyAmJiBmaWxwLT5mX3ZlcnNpb24gPT0gaW5vZGUtPmlfdmVyc2lvbikgeworCQlwcl9kZWJ1ZygiQUZGUzogcmVhZGRpcigpIGxlZnQgb2ZmPSVkXG4iLCBpbm8pOworCQlnb3RvIGluc2lkZTsKKwl9CisKKwlpbm8gPSBiZTMyX3RvX2NwdShBRkZTX0hFQUQoZGlyX2JoKS0+dGFibGVbaGFzaF9wb3NdKTsKKwlmb3IgKGkgPSAwOyBpbm8gJiYgaSA8IGNoYWluX3BvczsgaSsrKSB7CisJCWZoX2JoID0gYWZmc19icmVhZChzYiwgaW5vKTsKKwkJaWYgKCFmaF9iaCkgeworCQkJYWZmc19lcnJvcihzYiwgInJlYWRkaXIiLCJDYW5ub3QgcmVhZCBibG9jayAlZCIsIGkpOworCQkJZ290byByZWFkZGlyX291dDsKKwkJfQorCQlpbm8gPSBiZTMyX3RvX2NwdShBRkZTX1RBSUwoc2IsIGZoX2JoKS0+aGFzaF9jaGFpbik7CisJCWFmZnNfYnJlbHNlKGZoX2JoKTsKKwkJZmhfYmggPSBOVUxMOworCX0KKwlpZiAoaW5vKQorCQlnb3RvIGluc2lkZTsKKwloYXNoX3BvcysrOworCisJZm9yICg7IGhhc2hfcG9zIDwgQUZGU19TQihzYiktPnNfaGFzaHNpemU7IGhhc2hfcG9zKyspIHsKKwkJaW5vID0gYmUzMl90b19jcHUoQUZGU19IRUFEKGRpcl9iaCktPnRhYmxlW2hhc2hfcG9zXSk7CisJCWlmICghaW5vKQorCQkJY29udGludWU7CisJCWZfcG9zID0gKGhhc2hfcG9zIDw8IDE2KSArIDI7CitpbnNpZGU6CisJCWRvIHsKKwkJCWZoX2JoID0gYWZmc19icmVhZChzYiwgaW5vKTsKKwkJCWlmICghZmhfYmgpIHsKKwkJCQlhZmZzX2Vycm9yKHNiLCAicmVhZGRpciIsIkNhbm5vdCByZWFkIGJsb2NrICVkIiwgaW5vKTsKKwkJCQlnb3RvIHJlYWRkaXJfZG9uZTsKKwkJCX0KKworCQkJbmFtZWxlbiA9IG1pbihBRkZTX1RBSUwoc2IsIGZoX2JoKS0+bmFtZVswXSwgKHU4KTMwKTsKKwkJCW5hbWUgPSBBRkZTX1RBSUwoc2IsIGZoX2JoKS0+bmFtZSArIDE7CisJCQlwcl9kZWJ1ZygiQUZGUzogcmVhZGRpcigpOiBmaWxsZGlyKFwiJS4qc1wiLCBpbm89JXUpLCBoYXNoPSVkLCBmX3Bvcz0leFxuIiwKKwkJCQkgbmFtZWxlbiwgbmFtZSwgaW5vLCBoYXNoX3BvcywgZl9wb3MpOworCQkJaWYgKGZpbGxkaXIoZGlyZW50LCBuYW1lLCBuYW1lbGVuLCBmX3BvcywgaW5vLCBEVF9VTktOT1dOKSA8IDApCisJCQkJZ290byByZWFkZGlyX2RvbmU7CisJCQlzdG9yZWQrKzsKKwkJCWZfcG9zKys7CisJCQlpbm8gPSBiZTMyX3RvX2NwdShBRkZTX1RBSUwoc2IsIGZoX2JoKS0+aGFzaF9jaGFpbik7CisJCQlhZmZzX2JyZWxzZShmaF9iaCk7CisJCQlmaF9iaCA9IE5VTEw7CisJCX0gd2hpbGUgKGlubyk7CisJfQorcmVhZGRpcl9kb25lOgorCWZpbHAtPmZfcG9zID0gZl9wb3M7CisJZmlscC0+Zl92ZXJzaW9uID0gaW5vZGUtPmlfdmVyc2lvbjsKKwlmaWxwLT5wcml2YXRlX2RhdGEgPSAodm9pZCAqKShsb25nKWlubzsKKwlyZXMgPSBzdG9yZWQ7CisKK3JlYWRkaXJfb3V0OgorCWFmZnNfYnJlbHNlKGRpcl9iaCk7CisJYWZmc19icmVsc2UoZmhfYmgpOworCWFmZnNfdW5sb2NrX2Rpcihpbm9kZSk7CisJcHJfZGVidWcoIkFGRlM6IHJlYWRkaXIoKT0lZFxuIiwgc3RvcmVkKTsKKwlyZXR1cm4gcmVzOworfQpkaWZmIC0tZ2l0IGEvZnMvYWZmcy9maWxlLmMgYi9mcy9hZmZzL2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzQ0OTI0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZmcy9maWxlLmMKQEAgLTAsMCArMSw5MjAgQEAKKy8qCisgKiAgbGludXgvZnMvYWZmcy9maWxlLmMKKyAqCisgKiAgKGMpIDE5OTYgIEhhbnMtSm9hY2hpbSBXaWRtYWllciAtIFJld3JpdHRlbgorICoKKyAqICAoQykgMTk5MyAgUmF5IEJ1cnIgLSBNb2RpZmllZCBmb3IgQW1pZ2EgRkZTIGZpbGVzeXN0ZW0uCisgKgorICogIChDKSAxOTkyICBFcmljIFlvdW5nZGFsZSBNb2RpZmllZCBmb3IgSVNPIDk2NjAgZmlsZXN5c3RlbS4KKyAqCisgKiAgKEMpIDE5OTEgIExpbnVzIFRvcnZhbGRzIC0gbWluaXggZmlsZXN5c3RlbQorICoKKyAqICBhZmZzIHJlZ3VsYXIgZmlsZSBoYW5kbGluZyBwcmltaXRpdmVzCisgKi8KKworI2luY2x1ZGUgImFmZnMuaCIKKworI2lmIFBBR0VfU0laRSA8IDQwOTYKKyNlcnJvciBQQUdFX1NJWkUgbXVzdCBiZSBhdCBsZWFzdCA0MDk2CisjZW5kaWYKKworc3RhdGljIGludCBhZmZzX2dyb3dfZXh0Y2FjaGUoc3RydWN0IGlub2RlICppbm9kZSwgdTMyIGxjX2lkeCk7CitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICphZmZzX2FsbG9jX2V4dGJsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIHUzMiBleHQpOworc3RhdGljIGlubGluZSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmFmZnNfZ2V0X2V4dGJsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHUzMiBleHQpOworc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqYWZmc19nZXRfZXh0YmxvY2tfc2xvdyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1MzIgZXh0KTsKK3N0YXRpYyBzc2l6ZV90IGFmZnNfZmlsZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworc3RhdGljIGludCBhZmZzX2ZpbGVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCk7CitzdGF0aWMgaW50IGFmZnNfZmlsZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhZmZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlYWQJCT0gZ2VuZXJpY19maWxlX3JlYWQsCisJLndyaXRlCQk9IGFmZnNfZmlsZV93cml0ZSwKKwkubW1hcAkJPSBnZW5lcmljX2ZpbGVfbW1hcCwKKwkub3BlbgkJPSBhZmZzX2ZpbGVfb3BlbiwKKwkucmVsZWFzZQk9IGFmZnNfZmlsZV9yZWxlYXNlLAorCS5mc3luYwkJPSBmaWxlX2ZzeW5jLAorCS5zZW5kZmlsZQk9IGdlbmVyaWNfZmlsZV9zZW5kZmlsZSwKK307CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGFmZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zID0geworCS50cnVuY2F0ZQk9IGFmZnNfdHJ1bmNhdGUsCisJLnNldGF0dHIJPSBhZmZzX25vdGlmeV9jaGFuZ2UsCit9OworCitzdGF0aWMgaW50CithZmZzX2ZpbGVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlpZiAoYXRvbWljX3JlYWQoJmZpbHAtPmZfY291bnQpICE9IDEpCisJCXJldHVybiAwOworCXByX2RlYnVnKCJBRkZTOiBvcGVuKCVkKVxuIiwgQUZGU19JKGlub2RlKS0+aV9vcGVuY250KTsKKwlBRkZTX0koaW5vZGUpLT5pX29wZW5jbnQrKzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYWZmc19maWxlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJaWYgKGF0b21pY19yZWFkKCZmaWxwLT5mX2NvdW50KSAhPSAwKQorCQlyZXR1cm4gMDsKKwlwcl9kZWJ1ZygiQUZGUzogcmVsZWFzZSglZClcbiIsIEFGRlNfSShpbm9kZSktPmlfb3BlbmNudCk7CisJQUZGU19JKGlub2RlKS0+aV9vcGVuY250LS07CisJaWYgKCFBRkZTX0koaW5vZGUpLT5pX29wZW5jbnQpCisJCWFmZnNfZnJlZV9wcmVhbGxvYyhpbm9kZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYWZmc19ncm93X2V4dGNhY2hlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHUzMiBsY19pZHgpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrCSpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBidWZmZXJfaGVhZAkqYmg7CisJdTMyIGxjX21heDsKKwlpbnQgaSwgaiwga2V5OworCisJaWYgKCFBRkZTX0koaW5vZGUpLT5pX2xjKSB7CisJCWNoYXIgKnB0ciA9IChjaGFyICopZ2V0X3plcm9lZF9wYWdlKEdGUF9OT0ZTKTsKKwkJaWYgKCFwdHIpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJQUZGU19JKGlub2RlKS0+aV9sYyA9ICh1MzIgKilwdHI7CisJCUFGRlNfSShpbm9kZSktPmlfYWMgPSAoc3RydWN0IGFmZnNfZXh0X2tleSAqKShwdHIgKyBBRkZTX0NBQ0hFX1NJWkUgLyAyKTsKKwl9CisKKwlsY19tYXggPSBBRkZTX0xDX1NJWkUgPDwgQUZGU19JKGlub2RlKS0+aV9sY19zaGlmdDsKKworCWlmIChBRkZTX0koaW5vZGUpLT5pX2V4dGNudCA+IGxjX21heCkgeworCQl1MzIgbGNfc2hpZnQsIGxjX21hc2ssIHRtcCwgb2ZmOworCisJCS8qIG5lZWQgdG8gcmVjYWxjdWxhdGUgbGluZWFyIGNhY2hlLCBzdGFydCBmcm9tIG9sZCBzaXplICovCisJCWxjX3NoaWZ0ID0gQUZGU19JKGlub2RlKS0+aV9sY19zaGlmdDsKKwkJdG1wID0gKEFGRlNfSShpbm9kZSktPmlfZXh0Y250IC8gQUZGU19MQ19TSVpFKSA+PiBsY19zaGlmdDsKKwkJZm9yICg7IHRtcDsgdG1wID4+PSAxKQorCQkJbGNfc2hpZnQrKzsKKwkJbGNfbWFzayA9ICgxIDw8IGxjX3NoaWZ0KSAtIDE7CisKKwkJLyogZml4IGlkeCBhbmQgb2xkIHNpemUgdG8gbmV3IHNoaWZ0ICovCisJCWxjX2lkeCA+Pj0gKGxjX3NoaWZ0IC0gQUZGU19JKGlub2RlKS0+aV9sY19zaGlmdCk7CisJCUFGRlNfSShpbm9kZSktPmlfbGNfc2l6ZSA+Pj0gKGxjX3NoaWZ0IC0gQUZGU19JKGlub2RlKS0+aV9sY19zaGlmdCk7CisKKwkJLyogZmlyc3Qgc2hyaW5rIG9sZCBjYWNoZSB0byBtYWtlIG1vcmUgc3BhY2UgKi8KKwkJb2ZmID0gMSA8PCAobGNfc2hpZnQgLSBBRkZTX0koaW5vZGUpLT5pX2xjX3NoaWZ0KTsKKwkJZm9yIChpID0gMSwgaiA9IG9mZjsgaiA8IEFGRlNfTENfU0laRTsgaSsrLCBqICs9IG9mZikKKwkJCUFGRlNfSShpbm9kZSktPmlfYWNbaV0gPSBBRkZTX0koaW5vZGUpLT5pX2FjW2pdOworCisJCUFGRlNfSShpbm9kZSktPmlfbGNfc2hpZnQgPSBsY19zaGlmdDsKKwkJQUZGU19JKGlub2RlKS0+aV9sY19tYXNrID0gbGNfbWFzazsKKwl9CisKKwkvKiBmaWxsIGNhY2hlIHRvIHRoZSBuZWVkZWQgaW5kZXggKi8KKwlpID0gQUZGU19JKGlub2RlKS0+aV9sY19zaXplOworCUFGRlNfSShpbm9kZSktPmlfbGNfc2l6ZSA9IGxjX2lkeCArIDE7CisJZm9yICg7IGkgPD0gbGNfaWR4OyBpKyspIHsKKwkJaWYgKCFpKSB7CisJCQlBRkZTX0koaW5vZGUpLT5pX2xjWzBdID0gaW5vZGUtPmlfaW5vOworCQkJY29udGludWU7CisJCX0KKwkJa2V5ID0gQUZGU19JKGlub2RlKS0+aV9sY1tpIC0gMV07CisJCWogPSBBRkZTX0koaW5vZGUpLT5pX2xjX21hc2sgKyAxOworCQkvLyB1bmxvY2sgY2FjaGUKKwkJZm9yICg7IGogPiAwOyBqLS0pIHsKKwkJCWJoID0gYWZmc19icmVhZChzYiwga2V5KTsKKwkJCWlmICghYmgpCisJCQkJZ290byBlcnI7CisJCQlrZXkgPSBiZTMyX3RvX2NwdShBRkZTX1RBSUwoc2IsIGJoKS0+ZXh0ZW5zaW9uKTsKKwkJCWFmZnNfYnJlbHNlKGJoKTsKKwkJfQorCQkvLyBsb2NrIGNhY2hlCisJCUFGRlNfSShpbm9kZSktPmlfbGNbaV0gPSBrZXk7CisJfQorCisJcmV0dXJuIDA7CisKK2VycjoKKwkvLyBsb2NrIGNhY2hlCisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKgorYWZmc19hbGxvY19leHRibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCB1MzIgZXh0KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5ld19iaDsKKwl1MzIgYmxvY2tuciwgdG1wOworCisJYmxvY2tuciA9IGFmZnNfYWxsb2NfYmxvY2soaW5vZGUsIGJoLT5iX2Jsb2NrbnIpOworCWlmICghYmxvY2tucikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT1NQQyk7CisKKwluZXdfYmggPSBhZmZzX2dldHplcm9ibGsoc2IsIGJsb2NrbnIpOworCWlmICghbmV3X2JoKSB7CisJCWFmZnNfZnJlZV9ibG9jayhzYiwgYmxvY2tucik7CisJCXJldHVybiBFUlJfUFRSKC1FSU8pOworCX0KKworCUFGRlNfSEVBRChuZXdfYmgpLT5wdHlwZSA9IGNwdV90b19iZTMyKFRfTElTVCk7CisJQUZGU19IRUFEKG5ld19iaCktPmtleSA9IGNwdV90b19iZTMyKGJsb2NrbnIpOworCUFGRlNfVEFJTChzYiwgbmV3X2JoKS0+c3R5cGUgPSBjcHVfdG9fYmUzMihTVF9GSUxFKTsKKwlBRkZTX1RBSUwoc2IsIG5ld19iaCktPnBhcmVudCA9IGNwdV90b19iZTMyKGlub2RlLT5pX2lubyk7CisJYWZmc19maXhfY2hlY2tzdW0oc2IsIG5ld19iaCk7CisKKwltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShuZXdfYmgsIGlub2RlKTsKKworCXRtcCA9IGJlMzJfdG9fY3B1KEFGRlNfVEFJTChzYiwgYmgpLT5leHRlbnNpb24pOworCWlmICh0bXApCisJCWFmZnNfd2FybmluZyhzYiwgImFsbG9jX2V4dCIsICJwcmV2aW91cyBleHRlbnNpb24gc2V0ICgleCkiLCB0bXApOworCUFGRlNfVEFJTChzYiwgYmgpLT5leHRlbnNpb24gPSBjcHVfdG9fYmUzMihibG9ja25yKTsKKwlhZmZzX2FkanVzdF9jaGVja3N1bShiaCwgYmxvY2tuciAtIHRtcCk7CisJbWFya19idWZmZXJfZGlydHlfaW5vZGUoYmgsIGlub2RlKTsKKworCUFGRlNfSShpbm9kZSktPmlfZXh0Y250Kys7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisKKwlyZXR1cm4gbmV3X2JoOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBidWZmZXJfaGVhZCAqCithZmZzX2dldF9leHRibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1MzIgZXh0KQoreworCS8qIGlubGluZSB0aGUgc2ltcGxlc3QgY2FzZTogc2FtZSBleHRlbmRlZCBibG9jayBhcyBsYXN0IHRpbWUgKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gQUZGU19JKGlub2RlKS0+aV9leHRfYmg7CisJaWYgKGV4dCA9PSBBRkZTX0koaW5vZGUpLT5pX2V4dF9sYXN0KQorCQlhdG9taWNfaW5jKCZiaC0+Yl9jb3VudCk7CisJZWxzZQorCQkvKiB3ZSBoYXZlIHRvIGRvIG1vcmUgKG5vdCBpbmxpbmVkKSAqLworCQliaCA9IGFmZnNfZ2V0X2V4dGJsb2NrX3Nsb3coaW5vZGUsIGV4dCk7CisKKwlyZXR1cm4gYmg7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKgorYWZmc19nZXRfZXh0YmxvY2tfc2xvdyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1MzIgZXh0KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXUzMiBleHRfa2V5OworCXUzMiBsY19pZHgsIGxjX29mZiwgYWNfaWR4OworCXUzMiB0bXAsIGlkeDsKKworCWlmIChleHQgPT0gQUZGU19JKGlub2RlKS0+aV9leHRfbGFzdCArIDEpIHsKKwkJLyogcmVhZCB0aGUgbmV4dCBleHRlbmRlZCBibG9jayBmcm9tIHRoZSBjdXJyZW50IG9uZSAqLworCQliaCA9IEFGRlNfSShpbm9kZSktPmlfZXh0X2JoOworCQlleHRfa2V5ID0gYmUzMl90b19jcHUoQUZGU19UQUlMKHNiLCBiaCktPmV4dGVuc2lvbik7CisJCWlmIChleHQgPCBBRkZTX0koaW5vZGUpLT5pX2V4dGNudCkKKwkJCWdvdG8gcmVhZF9leHQ7CisJCWlmIChleHQgPiBBRkZTX0koaW5vZGUpLT5pX2V4dGNudCkKKwkJCUJVRygpOworCQliaCA9IGFmZnNfYWxsb2NfZXh0YmxvY2soaW5vZGUsIGJoLCBleHQpOworCQlpZiAoSVNfRVJSKGJoKSkKKwkJCXJldHVybiBiaDsKKwkJZ290byBzdG9yZV9leHQ7CisJfQorCisJaWYgKGV4dCA9PSAwKSB7CisJCS8qIHdlIHNlZWsgYmFjayB0byB0aGUgZmlsZSBoZWFkZXIgYmxvY2sgKi8KKwkJZXh0X2tleSA9IGlub2RlLT5pX2lubzsKKwkJZ290byByZWFkX2V4dDsKKwl9CisKKwlpZiAoZXh0ID49IEFGRlNfSShpbm9kZSktPmlfZXh0Y250KSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqcHJldl9iaDsKKworCQkvKiBhbGxvY2F0ZSBhIG5ldyBleHRlbmRlZCBibG9jayAqLworCQlpZiAoZXh0ID4gQUZGU19JKGlub2RlKS0+aV9leHRjbnQpCisJCQlCVUcoKTsKKworCQkvKiBnZXQgcHJldmlvdXMgZXh0ZW5kZWQgYmxvY2sgKi8KKwkJcHJldl9iaCA9IGFmZnNfZ2V0X2V4dGJsb2NrKGlub2RlLCBleHQgLSAxKTsKKwkJaWYgKElTX0VSUihwcmV2X2JoKSkKKwkJCXJldHVybiBwcmV2X2JoOworCQliaCA9IGFmZnNfYWxsb2NfZXh0YmxvY2soaW5vZGUsIHByZXZfYmgsIGV4dCk7CisJCWFmZnNfYnJlbHNlKHByZXZfYmgpOworCQlpZiAoSVNfRVJSKGJoKSkKKwkJCXJldHVybiBiaDsKKwkJZ290byBzdG9yZV9leHQ7CisJfQorCithZ2FpbjoKKwkvKiBjaGVjayBpZiB0aGVyZSBpcyBhbiBleHRlbmRlZCBjYWNoZSBhbmQgd2hldGhlciBpdCdzIGxhcmdlIGVub3VnaCAqLworCWxjX2lkeCA9IGV4dCA+PiBBRkZTX0koaW5vZGUpLT5pX2xjX3NoaWZ0OworCWxjX29mZiA9IGV4dCAmIEFGRlNfSShpbm9kZSktPmlfbGNfbWFzazsKKworCWlmIChsY19pZHggPj0gQUZGU19JKGlub2RlKS0+aV9sY19zaXplKSB7CisJCWludCBlcnI7CisKKwkJZXJyID0gYWZmc19ncm93X2V4dGNhY2hlKGlub2RlLCBsY19pZHgpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwkJZ290byBhZ2FpbjsKKwl9CisKKwkvKiBldmVyeSBuJ3RoIGtleSB3ZSBmaW5kIGluIHRoZSBsaW5lYXIgY2FjaGUgKi8KKwlpZiAoIWxjX29mZikgeworCQlleHRfa2V5ID0gQUZGU19JKGlub2RlKS0+aV9sY1tsY19pZHhdOworCQlnb3RvIHJlYWRfZXh0OworCX0KKworCS8qIG1heWJlIGl0J3Mgc3RpbGwgaW4gdGhlIGFzc29jaWF0aXZlIGNhY2hlICovCisJYWNfaWR4ID0gKGV4dCAtIGxjX2lkeCAtIDEpICYgQUZGU19BQ19NQVNLOworCWlmIChBRkZTX0koaW5vZGUpLT5pX2FjW2FjX2lkeF0uZXh0ID09IGV4dCkgeworCQlleHRfa2V5ID0gQUZGU19JKGlub2RlKS0+aV9hY1thY19pZHhdLmtleTsKKwkJZ290byByZWFkX2V4dDsKKwl9CisKKwkvKiB0cnkgdG8gZmluZCBvbmUgb2YgdGhlIHByZXZpb3VzIGV4dGVuZGVkIGJsb2NrcyAqLworCXRtcCA9IGV4dDsKKwlpZHggPSBhY19pZHg7CisJd2hpbGUgKC0tdG1wLCAtLWxjX29mZiA+IDApIHsKKwkJaWR4ID0gKGlkeCAtIDEpICYgQUZGU19BQ19NQVNLOworCQlpZiAoQUZGU19JKGlub2RlKS0+aV9hY1tpZHhdLmV4dCA9PSB0bXApIHsKKwkJCWV4dF9rZXkgPSBBRkZTX0koaW5vZGUpLT5pX2FjW2lkeF0ua2V5OworCQkJZ290byBmaW5kX2V4dDsKKwkJfQorCX0KKworCS8qIGZhbGwgYmFjayB0byB0aGUgbGluZWFyIGNhY2hlICovCisJZXh0X2tleSA9IEFGRlNfSShpbm9kZSktPmlfbGNbbGNfaWR4XTsKK2ZpbmRfZXh0OgorCS8qIHJlYWQgYWxsIGV4dGVuZGVkIGJsb2NrcyB1bnRpbCB3ZSBmaW5kIHRoZSBvbmUgd2UgbmVlZCAqLworCS8vdW5sb2NrIGNhY2hlCisJZG8geworCQliaCA9IGFmZnNfYnJlYWQoc2IsIGV4dF9rZXkpOworCQlpZiAoIWJoKQorCQkJZ290byBlcnJfYnJlYWQ7CisJCWV4dF9rZXkgPSBiZTMyX3RvX2NwdShBRkZTX1RBSUwoc2IsIGJoKS0+ZXh0ZW5zaW9uKTsKKwkJYWZmc19icmVsc2UoYmgpOworCQl0bXArKzsKKwl9IHdoaWxlICh0bXAgPCBleHQpOworCS8vbG9jayBjYWNoZQorCisJLyogc3RvcmUgaXQgaW4gdGhlIGFzc29jaWF0aXZlIGNhY2hlICovCisJLy8gcmVjYWxjdWxhdGUgYWNfaWR4PworCUFGRlNfSShpbm9kZSktPmlfYWNbYWNfaWR4XS5leHQgPSBleHQ7CisJQUZGU19JKGlub2RlKS0+aV9hY1thY19pZHhdLmtleSA9IGV4dF9rZXk7CisKK3JlYWRfZXh0OgorCS8qIGZpbmFsbHkgcmVhZCB0aGUgcmlnaHQgZXh0ZW5kZWQgYmxvY2sgKi8KKwkvL3VubG9jayBjYWNoZQorCWJoID0gYWZmc19icmVhZChzYiwgZXh0X2tleSk7CisJaWYgKCFiaCkKKwkJZ290byBlcnJfYnJlYWQ7CisJLy9sb2NrIGNhY2hlCisKK3N0b3JlX2V4dDoKKwkvKiByZWxlYXNlIG9sZCBjYWNoZWQgZXh0ZW5kZWQgYmxvY2sgYW5kIHN0b3JlIHRoZSBuZXcgb25lICovCisJYWZmc19icmVsc2UoQUZGU19JKGlub2RlKS0+aV9leHRfYmgpOworCUFGRlNfSShpbm9kZSktPmlfZXh0X2xhc3QgPSBleHQ7CisJQUZGU19JKGlub2RlKS0+aV9leHRfYmggPSBiaDsKKwlhdG9taWNfaW5jKCZiaC0+Yl9jb3VudCk7CisKKwlyZXR1cm4gYmg7CisKK2Vycl9icmVhZDoKKwlhZmZzX2JyZWxzZShiaCk7CisJcmV0dXJuIEVSUl9QVFIoLUVJTyk7Cit9CisKK3N0YXRpYyBpbnQKK2FmZnNfZ2V0X2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGJsb2NrLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sJKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGJ1ZmZlcl9oZWFkCSpleHRfYmg7CisJdTMyCQkJIGV4dDsKKworCXByX2RlYnVnKCJBRkZTOiBnZXRfYmxvY2soJXUsICVsdSlcbiIsICh1MzIpaW5vZGUtPmlfaW5vLCAodW5zaWduZWQgbG9uZylibG9jayk7CisKKworCWlmIChibG9jayA+IChzZWN0b3JfdCkweDdmZmZmZmZmVUwpCisJCUJVRygpOworCisJaWYgKGJsb2NrID49IEFGRlNfSShpbm9kZSktPmlfYmxrY250KSB7CisJCWlmIChibG9jayA+IEFGRlNfSShpbm9kZSktPmlfYmxrY250IHx8ICFjcmVhdGUpCisJCQlnb3RvIGVycl9iaWc7CisJfSBlbHNlCisJCWNyZWF0ZSA9IDA7CisKKwkvL2xvY2sgY2FjaGUKKwlhZmZzX2xvY2tfZXh0KGlub2RlKTsKKworCWV4dCA9ICh1MzIpYmxvY2sgLyBBRkZTX1NCKHNiKS0+c19oYXNoc2l6ZTsKKwlibG9jayAtPSBleHQgKiBBRkZTX1NCKHNiKS0+c19oYXNoc2l6ZTsKKwlleHRfYmggPSBhZmZzX2dldF9leHRibG9jayhpbm9kZSwgZXh0KTsKKwlpZiAoSVNfRVJSKGV4dF9iaCkpCisJCWdvdG8gZXJyX2V4dDsKKwltYXBfYmgoYmhfcmVzdWx0LCBzYiwgKHNlY3Rvcl90KWJlMzJfdG9fY3B1KEFGRlNfQkxPQ0soc2IsIGV4dF9iaCwgYmxvY2spKSk7CisKKwlpZiAoY3JlYXRlKSB7CisJCXUzMiBibG9ja25yID0gYWZmc19hbGxvY19ibG9jayhpbm9kZSwgZXh0X2JoLT5iX2Jsb2NrbnIpOworCQlpZiAoIWJsb2NrbnIpCisJCQlnb3RvIGVycl9hbGxvYzsKKwkJc2V0X2J1ZmZlcl9uZXcoYmhfcmVzdWx0KTsKKwkJQUZGU19JKGlub2RlKS0+bW11X3ByaXZhdGUgKz0gQUZGU19TQihzYiktPnNfZGF0YV9ibGtzaXplOworCQlBRkZTX0koaW5vZGUpLT5pX2Jsa2NudCsrOworCisJCS8qIHN0b3JlIG5ldyBibG9jayAqLworCQlpZiAoYmhfcmVzdWx0LT5iX2Jsb2NrbnIpCisJCQlhZmZzX3dhcm5pbmcoc2IsICJnZXRfYmxvY2siLCAiYmxvY2sgYWxyZWFkeSBzZXQgKCV4KSIsIGJoX3Jlc3VsdC0+Yl9ibG9ja25yKTsKKwkJQUZGU19CTE9DSyhzYiwgZXh0X2JoLCBibG9jaykgPSBjcHVfdG9fYmUzMihibG9ja25yKTsKKwkJQUZGU19IRUFEKGV4dF9iaCktPmJsb2NrX2NvdW50ID0gY3B1X3RvX2JlMzIoYmxvY2sgKyAxKTsKKwkJYWZmc19hZGp1c3RfY2hlY2tzdW0oZXh0X2JoLCBibG9ja25yIC0gYmhfcmVzdWx0LT5iX2Jsb2NrbnIgKyAxKTsKKwkJYmhfcmVzdWx0LT5iX2Jsb2NrbnIgPSBibG9ja25yOworCisJCWlmICghYmxvY2spIHsKKwkJCS8qIGluc2VydCBmaXJzdCBibG9jayBpbnRvIGhlYWRlciBibG9jayAqLworCQkJdTMyIHRtcCA9IGJlMzJfdG9fY3B1KEFGRlNfSEVBRChleHRfYmgpLT5maXJzdF9kYXRhKTsKKwkJCWlmICh0bXApCisJCQkJYWZmc193YXJuaW5nKHNiLCAiZ2V0X2Jsb2NrIiwgImZpcnN0IGJsb2NrIGFscmVhZHkgc2V0ICglZCkiLCB0bXApOworCQkJQUZGU19IRUFEKGV4dF9iaCktPmZpcnN0X2RhdGEgPSBjcHVfdG9fYmUzMihibG9ja25yKTsKKwkJCWFmZnNfYWRqdXN0X2NoZWNrc3VtKGV4dF9iaCwgYmxvY2tuciAtIHRtcCk7CisJCX0KKwl9CisKKwlhZmZzX2JyZWxzZShleHRfYmgpOworCS8vdW5sb2NrIGNhY2hlCisJYWZmc191bmxvY2tfZXh0KGlub2RlKTsKKwlyZXR1cm4gMDsKKworZXJyX2JpZzoKKwlhZmZzX2Vycm9yKGlub2RlLT5pX3NiLCJnZXRfYmxvY2siLCJzdHJhbmdlIGJsb2NrIHJlcXVlc3QgJWQiLCBibG9jayk7CisJcmV0dXJuIC1FSU87CitlcnJfZXh0OgorCS8vIHVubG9jayBjYWNoZQorCWFmZnNfdW5sb2NrX2V4dChpbm9kZSk7CisJcmV0dXJuIFBUUl9FUlIoZXh0X2JoKTsKK2Vycl9hbGxvYzoKKwlicmVsc2UoZXh0X2JoKTsKKwljbGVhcl9idWZmZXJfbWFwcGVkKGJoX3Jlc3VsdCk7CisJYmhfcmVzdWx0LT5iX2JkZXYgPSBOVUxMOworCS8vIHVubG9jayBjYWNoZQorCWFmZnNfdW5sb2NrX2V4dChpbm9kZSk7CisJcmV0dXJuIC1FTk9TUEM7Cit9CisKK3N0YXRpYyBpbnQgYWZmc193cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCXJldHVybiBibG9ja193cml0ZV9mdWxsX3BhZ2UocGFnZSwgYWZmc19nZXRfYmxvY2ssIHdiYyk7Cit9CitzdGF0aWMgaW50IGFmZnNfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiBibG9ja19yZWFkX2Z1bGxfcGFnZShwYWdlLCBhZmZzX2dldF9ibG9jayk7Cit9CitzdGF0aWMgaW50IGFmZnNfcHJlcGFyZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCXJldHVybiBjb250X3ByZXBhcmVfd3JpdGUocGFnZSwgZnJvbSwgdG8sIGFmZnNfZ2V0X2Jsb2NrLAorCQkmQUZGU19JKHBhZ2UtPm1hcHBpbmctPmhvc3QpLT5tbXVfcHJpdmF0ZSk7Cit9CitzdGF0aWMgc2VjdG9yX3QgX2FmZnNfYm1hcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc2VjdG9yX3QgYmxvY2spCit7CisJcmV0dXJuIGdlbmVyaWNfYmxvY2tfYm1hcChtYXBwaW5nLGJsb2NrLGFmZnNfZ2V0X2Jsb2NrKTsKK30KK3N0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgYWZmc19hb3BzID0geworCS5yZWFkcGFnZSA9IGFmZnNfcmVhZHBhZ2UsCisJLndyaXRlcGFnZSA9IGFmZnNfd3JpdGVwYWdlLAorCS5zeW5jX3BhZ2UgPSBibG9ja19zeW5jX3BhZ2UsCisJLnByZXBhcmVfd3JpdGUgPSBhZmZzX3ByZXBhcmVfd3JpdGUsCisJLmNvbW1pdF93cml0ZSA9IGdlbmVyaWNfY29tbWl0X3dyaXRlLAorCS5ibWFwID0gX2FmZnNfYm1hcAorfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKgorYWZmc19icmVhZF9pbm8oc3RydWN0IGlub2RlICppbm9kZSwgaW50IGJsb2NrLCBpbnQgY3JlYXRlKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIHRtcF9iaDsKKwlpbnQgZXJyOworCisJdG1wX2JoLmJfc3RhdGUgPSAwOworCWVyciA9IGFmZnNfZ2V0X2Jsb2NrKGlub2RlLCBibG9jaywgJnRtcF9iaCwgY3JlYXRlKTsKKwlpZiAoIWVycikgeworCQliaCA9IGFmZnNfYnJlYWQoaW5vZGUtPmlfc2IsIHRtcF9iaC5iX2Jsb2NrbnIpOworCQlpZiAoYmgpIHsKKwkJCWJoLT5iX3N0YXRlIHw9IHRtcF9iaC5iX3N0YXRlOworCQkJcmV0dXJuIGJoOworCQl9CisJCWVyciA9IC1FSU87CisJfQorCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJ1ZmZlcl9oZWFkICoKK2FmZnNfZ2V0emVyb2Jsa19pbm8oc3RydWN0IGlub2RlICppbm9kZSwgaW50IGJsb2NrKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIHRtcF9iaDsKKwlpbnQgZXJyOworCisJdG1wX2JoLmJfc3RhdGUgPSAwOworCWVyciA9IGFmZnNfZ2V0X2Jsb2NrKGlub2RlLCBibG9jaywgJnRtcF9iaCwgMSk7CisJaWYgKCFlcnIpIHsKKwkJYmggPSBhZmZzX2dldHplcm9ibGsoaW5vZGUtPmlfc2IsIHRtcF9iaC5iX2Jsb2NrbnIpOworCQlpZiAoYmgpIHsKKwkJCWJoLT5iX3N0YXRlIHw9IHRtcF9iaC5iX3N0YXRlOworCQkJcmV0dXJuIGJoOworCQl9CisJCWVyciA9IC1FSU87CisJfQorCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJ1ZmZlcl9oZWFkICoKK2FmZnNfZ2V0ZW1wdHlibGtfaW5vKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBibG9jaykKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCB0bXBfYmg7CisJaW50IGVycjsKKworCXRtcF9iaC5iX3N0YXRlID0gMDsKKwllcnIgPSBhZmZzX2dldF9ibG9jayhpbm9kZSwgYmxvY2ssICZ0bXBfYmgsIDEpOworCWlmICghZXJyKSB7CisJCWJoID0gYWZmc19nZXRlbXB0eWJsayhpbm9kZS0+aV9zYiwgdG1wX2JoLmJfYmxvY2tucik7CisJCWlmIChiaCkgeworCQkJYmgtPmJfc3RhdGUgfD0gdG1wX2JoLmJfc3RhdGU7CisJCQlyZXR1cm4gYmg7CisJCX0KKwkJZXJyID0gLUVJTzsKKwl9CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworc3RhdGljIHNzaXplX3QKK2FmZnNfZmlsZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3NpemVfdCByZXR2YWw7CisKKwlyZXR2YWwgPSBnZW5lcmljX2ZpbGVfd3JpdGUgKGZpbGUsIGJ1ZiwgY291bnQsIHBwb3MpOworCWlmIChyZXR2YWwgPjApIHsKKwkJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCQlpbm9kZS0+aV9jdGltZSA9IGlub2RlLT5pX210aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQKK2FmZnNfZG9fcmVhZHBhZ2Vfb2ZzKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJY2hhciAqZGF0YTsKKwl1MzIgYmlkeCwgYm9mZiwgYnNpemU7CisJdTMyIHRtcDsKKworCXByX2RlYnVnKCJBRkZTOiByZWFkX3BhZ2UoJXUsICVsZCwgJWQsICVkKVxuIiwgKHUzMilpbm9kZS0+aV9pbm8sIHBhZ2UtPmluZGV4LCBmcm9tLCB0byk7CisJaWYgKGZyb20gPiB0byB8fCB0byA+IFBBR0VfQ0FDSEVfU0laRSkKKwkJQlVHKCk7CisJa21hcChwYWdlKTsKKwlkYXRhID0gcGFnZV9hZGRyZXNzKHBhZ2UpOworCWJzaXplID0gQUZGU19TQihzYiktPnNfZGF0YV9ibGtzaXplOworCXRtcCA9IChwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKSArIGZyb207CisJYmlkeCA9IHRtcCAvIGJzaXplOworCWJvZmYgPSB0bXAgJSBic2l6ZTsKKworCXdoaWxlIChmcm9tIDwgdG8pIHsKKwkJYmggPSBhZmZzX2JyZWFkX2lubyhpbm9kZSwgYmlkeCwgMCk7CisJCWlmIChJU19FUlIoYmgpKQorCQkJcmV0dXJuIFBUUl9FUlIoYmgpOworCQl0bXAgPSBtaW4oYnNpemUgLSBib2ZmLCB0byAtIGZyb20pOworCQlpZiAoZnJvbSArIHRtcCA+IHRvIHx8IHRtcCA+IGJzaXplKQorCQkJQlVHKCk7CisJCW1lbWNweShkYXRhICsgZnJvbSwgQUZGU19EQVRBKGJoKSArIGJvZmYsIHRtcCk7CisJCWFmZnNfYnJlbHNlKGJoKTsKKwkJYmlkeCsrOworCQlmcm9tICs9IHRtcDsKKwkJYm9mZiA9IDA7CisJfQorCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCWt1bm1hcChwYWdlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYWZmc19leHRlbnRfZmlsZV9vZnMoc3RydWN0IGlub2RlICppbm9kZSwgdTMyIG5ld3NpemUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICpwcmV2X2JoOworCXUzMiBiaWR4LCBib2ZmOworCXUzMiBzaXplLCBic2l6ZTsKKwl1MzIgdG1wOworCisJcHJfZGVidWcoIkFGRlM6IGV4dGVudF9maWxlKCV1LCAlZClcbiIsICh1MzIpaW5vZGUtPmlfaW5vLCBuZXdzaXplKTsKKwlic2l6ZSA9IEFGRlNfU0Ioc2IpLT5zX2RhdGFfYmxrc2l6ZTsKKwliaCA9IE5VTEw7CisJc2l6ZSA9IEFGRlNfSShpbm9kZSktPm1tdV9wcml2YXRlOworCWJpZHggPSBzaXplIC8gYnNpemU7CisJYm9mZiA9IHNpemUgJSBic2l6ZTsKKwlpZiAoYm9mZikgeworCQliaCA9IGFmZnNfYnJlYWRfaW5vKGlub2RlLCBiaWR4LCAwKTsKKwkJaWYgKElTX0VSUihiaCkpCisJCQlyZXR1cm4gUFRSX0VSUihiaCk7CisJCXRtcCA9IG1pbihic2l6ZSAtIGJvZmYsIG5ld3NpemUgLSBzaXplKTsKKwkJaWYgKGJvZmYgKyB0bXAgPiBic2l6ZSB8fCB0bXAgPiBic2l6ZSkKKwkJCUJVRygpOworCQltZW1zZXQoQUZGU19EQVRBKGJoKSArIGJvZmYsIDAsIHRtcCk7CisJCUFGRlNfREFUQV9IRUFEKGJoKS0+c2l6ZSA9IGNwdV90b19iZTMyKGJlMzJfdG9fY3B1KEFGRlNfREFUQV9IRUFEKGJoKS0+c2l6ZSkgKyB0bXApOworCQlhZmZzX2ZpeF9jaGVja3N1bShzYiwgYmgpOworCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShiaCwgaW5vZGUpOworCQlzaXplICs9IHRtcDsKKwkJYmlkeCsrOworCX0gZWxzZSBpZiAoYmlkeCkgeworCQliaCA9IGFmZnNfYnJlYWRfaW5vKGlub2RlLCBiaWR4IC0gMSwgMCk7CisJCWlmIChJU19FUlIoYmgpKQorCQkJcmV0dXJuIFBUUl9FUlIoYmgpOworCX0KKworCXdoaWxlIChzaXplIDwgbmV3c2l6ZSkgeworCQlwcmV2X2JoID0gYmg7CisJCWJoID0gYWZmc19nZXR6ZXJvYmxrX2lubyhpbm9kZSwgYmlkeCk7CisJCWlmIChJU19FUlIoYmgpKQorCQkJZ290byBvdXQ7CisJCXRtcCA9IG1pbihic2l6ZSwgbmV3c2l6ZSAtIHNpemUpOworCQlpZiAodG1wID4gYnNpemUpCisJCQlCVUcoKTsKKwkJQUZGU19EQVRBX0hFQUQoYmgpLT5wdHlwZSA9IGNwdV90b19iZTMyKFRfREFUQSk7CisJCUFGRlNfREFUQV9IRUFEKGJoKS0+a2V5ID0gY3B1X3RvX2JlMzIoaW5vZGUtPmlfaW5vKTsKKwkJQUZGU19EQVRBX0hFQUQoYmgpLT5zZXF1ZW5jZSA9IGNwdV90b19iZTMyKGJpZHgpOworCQlBRkZTX0RBVEFfSEVBRChiaCktPnNpemUgPSBjcHVfdG9fYmUzMih0bXApOworCQlhZmZzX2ZpeF9jaGVja3N1bShzYiwgYmgpOworCQliaC0+Yl9zdGF0ZSAmPSB+KDFVTCA8PCBCSF9OZXcpOworCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShiaCwgaW5vZGUpOworCQlpZiAocHJldl9iaCkgeworCQkJdTMyIHRtcCA9IGJlMzJfdG9fY3B1KEFGRlNfREFUQV9IRUFEKHByZXZfYmgpLT5uZXh0KTsKKwkJCWlmICh0bXApCisJCQkJYWZmc193YXJuaW5nKHNiLCAiZXh0ZW50X2ZpbGVfb2ZzIiwgIm5leHQgYmxvY2sgYWxyZWFkeSBzZXQgZm9yICVkICglZCkiLCBiaWR4LCB0bXApOworCQkJQUZGU19EQVRBX0hFQUQocHJldl9iaCktPm5leHQgPSBjcHVfdG9fYmUzMihiaC0+Yl9ibG9ja25yKTsKKwkJCWFmZnNfYWRqdXN0X2NoZWNrc3VtKHByZXZfYmgsIGJoLT5iX2Jsb2NrbnIgLSB0bXApOworCQkJbWFya19idWZmZXJfZGlydHlfaW5vZGUocHJldl9iaCwgaW5vZGUpOworCQkJYWZmc19icmVsc2UocHJldl9iaCk7CisJCX0KKwkJc2l6ZSArPSBic2l6ZTsKKwkJYmlkeCsrOworCX0KKwlhZmZzX2JyZWxzZShiaCk7CisJaW5vZGUtPmlfc2l6ZSA9IEFGRlNfSShpbm9kZSktPm1tdV9wcml2YXRlID0gbmV3c2l6ZTsKKwlyZXR1cm4gMDsKKworb3V0OgorCWlub2RlLT5pX3NpemUgPSBBRkZTX0koaW5vZGUpLT5tbXVfcHJpdmF0ZSA9IG5ld3NpemU7CisJcmV0dXJuIFBUUl9FUlIoYmgpOworfQorCitzdGF0aWMgaW50CithZmZzX3JlYWRwYWdlX29mcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJdTMyIHRvOworCWludCBlcnI7CisKKwlwcl9kZWJ1ZygiQUZGUzogcmVhZF9wYWdlKCV1LCAlbGQpXG4iLCAodTMyKWlub2RlLT5pX2lubywgcGFnZS0+aW5kZXgpOworCXRvID0gUEFHRV9DQUNIRV9TSVpFOworCWlmICgoKHBhZ2UtPmluZGV4ICsgMSkgPDwgUEFHRV9DQUNIRV9TSElGVCkgPiBpbm9kZS0+aV9zaXplKSB7CisJCXRvID0gaW5vZGUtPmlfc2l6ZSAmIH5QQUdFX0NBQ0hFX01BU0s7CisJCW1lbXNldChwYWdlX2FkZHJlc3MocGFnZSkgKyB0bywgMCwgUEFHRV9DQUNIRV9TSVpFIC0gdG8pOworCX0KKworCWVyciA9IGFmZnNfZG9fcmVhZHBhZ2Vfb2ZzKGZpbGUsIHBhZ2UsIDAsIHRvKTsKKwlpZiAoIWVycikKKwkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYWZmc19wcmVwYXJlX3dyaXRlX29mcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCXUzMiBzaXplLCBvZmZzZXQ7CisJdTMyIHRtcDsKKwlpbnQgZXJyID0gMDsKKworCXByX2RlYnVnKCJBRkZTOiBwcmVwYXJlX3dyaXRlKCV1LCAlbGQsICVkLCAlZClcbiIsICh1MzIpaW5vZGUtPmlfaW5vLCBwYWdlLT5pbmRleCwgZnJvbSwgdG8pOworCW9mZnNldCA9IHBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisJaWYgKG9mZnNldCArIGZyb20gPiBBRkZTX0koaW5vZGUpLT5tbXVfcHJpdmF0ZSkgeworCQllcnIgPSBhZmZzX2V4dGVudF9maWxlX29mcyhpbm9kZSwgb2Zmc2V0ICsgZnJvbSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKwlzaXplID0gaW5vZGUtPmlfc2l6ZTsKKworCWlmIChQYWdlVXB0b2RhdGUocGFnZSkpCisJCXJldHVybiAwOworCisJaWYgKGZyb20pIHsKKwkJZXJyID0gYWZmc19kb19yZWFkcGFnZV9vZnMoZmlsZSwgcGFnZSwgMCwgZnJvbSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKwlpZiAodG8gPCBQQUdFX0NBQ0hFX1NJWkUpIHsKKwkJY2hhciAqa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisKKwkJbWVtc2V0KGthZGRyICsgdG8sIDAsIFBBR0VfQ0FDSEVfU0laRSAtIHRvKTsKKwkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJaWYgKHNpemUgPiBvZmZzZXQgKyB0bykgeworCQkJaWYgKHNpemUgPCBvZmZzZXQgKyBQQUdFX0NBQ0hFX1NJWkUpCisJCQkJdG1wID0gc2l6ZSAmIH5QQUdFX0NBQ0hFX01BU0s7CisJCQllbHNlCisJCQkJdG1wID0gUEFHRV9DQUNIRV9TSVpFOworCQkJZXJyID0gYWZmc19kb19yZWFkcGFnZV9vZnMoZmlsZSwgcGFnZSwgdG8sIHRtcCk7CisJCX0KKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBhZmZzX2NvbW1pdF93cml0ZV9vZnMoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKnByZXZfYmg7CisJY2hhciAqZGF0YTsKKwl1MzIgYmlkeCwgYm9mZiwgYnNpemU7CisJdTMyIHRtcDsKKwlpbnQgd3JpdHRlbjsKKworCXByX2RlYnVnKCJBRkZTOiBjb21taXRfd3JpdGUoJXUsICVsZCwgJWQsICVkKVxuIiwgKHUzMilpbm9kZS0+aV9pbm8sIHBhZ2UtPmluZGV4LCBmcm9tLCB0byk7CisJYnNpemUgPSBBRkZTX1NCKHNiKS0+c19kYXRhX2Jsa3NpemU7CisJZGF0YSA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKworCWJoID0gTlVMTDsKKwl3cml0dGVuID0gMDsKKwl0bXAgPSAocGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgKyBmcm9tOworCWJpZHggPSB0bXAgLyBic2l6ZTsKKwlib2ZmID0gdG1wICUgYnNpemU7CisJaWYgKGJvZmYpIHsKKwkJYmggPSBhZmZzX2JyZWFkX2lubyhpbm9kZSwgYmlkeCwgMCk7CisJCWlmIChJU19FUlIoYmgpKQorCQkJcmV0dXJuIFBUUl9FUlIoYmgpOworCQl0bXAgPSBtaW4oYnNpemUgLSBib2ZmLCB0byAtIGZyb20pOworCQlpZiAoYm9mZiArIHRtcCA+IGJzaXplIHx8IHRtcCA+IGJzaXplKQorCQkJQlVHKCk7CisJCW1lbWNweShBRkZTX0RBVEEoYmgpICsgYm9mZiwgZGF0YSArIGZyb20sIHRtcCk7CisJCUFGRlNfREFUQV9IRUFEKGJoKS0+c2l6ZSA9IGNwdV90b19iZTMyKGJlMzJfdG9fY3B1KEFGRlNfREFUQV9IRUFEKGJoKS0+c2l6ZSkgKyB0bXApOworCQlhZmZzX2ZpeF9jaGVja3N1bShzYiwgYmgpOworCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShiaCwgaW5vZGUpOworCQl3cml0dGVuICs9IHRtcDsKKwkJZnJvbSArPSB0bXA7CisJCWJpZHgrKzsKKwl9IGVsc2UgaWYgKGJpZHgpIHsKKwkJYmggPSBhZmZzX2JyZWFkX2lubyhpbm9kZSwgYmlkeCAtIDEsIDApOworCQlpZiAoSVNfRVJSKGJoKSkKKwkJCXJldHVybiBQVFJfRVJSKGJoKTsKKwl9CisJd2hpbGUgKGZyb20gKyBic2l6ZSA8PSB0bykgeworCQlwcmV2X2JoID0gYmg7CisJCWJoID0gYWZmc19nZXRlbXB0eWJsa19pbm8oaW5vZGUsIGJpZHgpOworCQlpZiAoSVNfRVJSKGJoKSkKKwkJCWdvdG8gb3V0OworCQltZW1jcHkoQUZGU19EQVRBKGJoKSwgZGF0YSArIGZyb20sIGJzaXplKTsKKwkJaWYgKGJ1ZmZlcl9uZXcoYmgpKSB7CisJCQlBRkZTX0RBVEFfSEVBRChiaCktPnB0eXBlID0gY3B1X3RvX2JlMzIoVF9EQVRBKTsKKwkJCUFGRlNfREFUQV9IRUFEKGJoKS0+a2V5ID0gY3B1X3RvX2JlMzIoaW5vZGUtPmlfaW5vKTsKKwkJCUFGRlNfREFUQV9IRUFEKGJoKS0+c2VxdWVuY2UgPSBjcHVfdG9fYmUzMihiaWR4KTsKKwkJCUFGRlNfREFUQV9IRUFEKGJoKS0+c2l6ZSA9IGNwdV90b19iZTMyKGJzaXplKTsKKwkJCUFGRlNfREFUQV9IRUFEKGJoKS0+bmV4dCA9IDA7CisJCQliaC0+Yl9zdGF0ZSAmPSB+KDFVTCA8PCBCSF9OZXcpOworCQkJaWYgKHByZXZfYmgpIHsKKwkJCQl1MzIgdG1wID0gYmUzMl90b19jcHUoQUZGU19EQVRBX0hFQUQocHJldl9iaCktPm5leHQpOworCQkJCWlmICh0bXApCisJCQkJCWFmZnNfd2FybmluZyhzYiwgImNvbW1pdF93cml0ZV9vZnMiLCAibmV4dCBibG9jayBhbHJlYWR5IHNldCBmb3IgJWQgKCVkKSIsIGJpZHgsIHRtcCk7CisJCQkJQUZGU19EQVRBX0hFQUQocHJldl9iaCktPm5leHQgPSBjcHVfdG9fYmUzMihiaC0+Yl9ibG9ja25yKTsKKwkJCQlhZmZzX2FkanVzdF9jaGVja3N1bShwcmV2X2JoLCBiaC0+Yl9ibG9ja25yIC0gdG1wKTsKKwkJCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShwcmV2X2JoLCBpbm9kZSk7CisJCQl9CisJCX0KKwkJYWZmc19icmVsc2UocHJldl9iaCk7CisJCWFmZnNfZml4X2NoZWNrc3VtKHNiLCBiaCk7CisJCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKGJoLCBpbm9kZSk7CisJCXdyaXR0ZW4gKz0gYnNpemU7CisJCWZyb20gKz0gYnNpemU7CisJCWJpZHgrKzsKKwl9CisJaWYgKGZyb20gPCB0bykgeworCQlwcmV2X2JoID0gYmg7CisJCWJoID0gYWZmc19icmVhZF9pbm8oaW5vZGUsIGJpZHgsIDEpOworCQlpZiAoSVNfRVJSKGJoKSkKKwkJCWdvdG8gb3V0OworCQl0bXAgPSBtaW4oYnNpemUsIHRvIC0gZnJvbSk7CisJCWlmICh0bXAgPiBic2l6ZSkKKwkJCUJVRygpOworCQltZW1jcHkoQUZGU19EQVRBKGJoKSwgZGF0YSArIGZyb20sIHRtcCk7CisJCWlmIChidWZmZXJfbmV3KGJoKSkgeworCQkJQUZGU19EQVRBX0hFQUQoYmgpLT5wdHlwZSA9IGNwdV90b19iZTMyKFRfREFUQSk7CisJCQlBRkZTX0RBVEFfSEVBRChiaCktPmtleSA9IGNwdV90b19iZTMyKGlub2RlLT5pX2lubyk7CisJCQlBRkZTX0RBVEFfSEVBRChiaCktPnNlcXVlbmNlID0gY3B1X3RvX2JlMzIoYmlkeCk7CisJCQlBRkZTX0RBVEFfSEVBRChiaCktPnNpemUgPSBjcHVfdG9fYmUzMih0bXApOworCQkJQUZGU19EQVRBX0hFQUQoYmgpLT5uZXh0ID0gMDsKKwkJCWJoLT5iX3N0YXRlICY9IH4oMVVMIDw8IEJIX05ldyk7CisJCQlpZiAocHJldl9iaCkgeworCQkJCXUzMiB0bXAgPSBiZTMyX3RvX2NwdShBRkZTX0RBVEFfSEVBRChwcmV2X2JoKS0+bmV4dCk7CisJCQkJaWYgKHRtcCkKKwkJCQkJYWZmc193YXJuaW5nKHNiLCAiY29tbWl0X3dyaXRlX29mcyIsICJuZXh0IGJsb2NrIGFscmVhZHkgc2V0IGZvciAlZCAoJWQpIiwgYmlkeCwgdG1wKTsKKwkJCQlBRkZTX0RBVEFfSEVBRChwcmV2X2JoKS0+bmV4dCA9IGNwdV90b19iZTMyKGJoLT5iX2Jsb2NrbnIpOworCQkJCWFmZnNfYWRqdXN0X2NoZWNrc3VtKHByZXZfYmgsIGJoLT5iX2Jsb2NrbnIgLSB0bXApOworCQkJCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKHByZXZfYmgsIGlub2RlKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChiZTMyX3RvX2NwdShBRkZTX0RBVEFfSEVBRChiaCktPnNpemUpIDwgdG1wKQorCQkJQUZGU19EQVRBX0hFQUQoYmgpLT5zaXplID0gY3B1X3RvX2JlMzIodG1wKTsKKwkJYWZmc19icmVsc2UocHJldl9iaCk7CisJCWFmZnNfZml4X2NoZWNrc3VtKHNiLCBiaCk7CisJCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKGJoLCBpbm9kZSk7CisJCXdyaXR0ZW4gKz0gdG1wOworCQlmcm9tICs9IHRtcDsKKwkJYmlkeCsrOworCX0KKwlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisKK2RvbmU6CisJYWZmc19icmVsc2UoYmgpOworCXRtcCA9IChwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKSArIGZyb207CisJaWYgKHRtcCA+IGlub2RlLT5pX3NpemUpCisJCWlub2RlLT5pX3NpemUgPSBBRkZTX0koaW5vZGUpLT5tbXVfcHJpdmF0ZSA9IHRtcDsKKworCXJldHVybiB3cml0dGVuOworCitvdXQ6CisJYmggPSBwcmV2X2JoOworCWlmICghd3JpdHRlbikKKwkJd3JpdHRlbiA9IFBUUl9FUlIoYmgpOworCWdvdG8gZG9uZTsKK30KKworc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBhZmZzX2FvcHNfb2ZzID0geworCS5yZWFkcGFnZSA9IGFmZnNfcmVhZHBhZ2Vfb2ZzLAorCS8vLndyaXRlcGFnZSA9IGFmZnNfd3JpdGVwYWdlX29mcywKKwkvLy5zeW5jX3BhZ2UgPSBhZmZzX3N5bmNfcGFnZV9vZnMsCisJLnByZXBhcmVfd3JpdGUgPSBhZmZzX3ByZXBhcmVfd3JpdGVfb2ZzLAorCS5jb21taXRfd3JpdGUgPSBhZmZzX2NvbW1pdF93cml0ZV9vZnMKK307CisKKy8qIEZyZWUgYW55IHByZWFsbG9jYXRlZCBibG9ja3MuICovCisKK3ZvaWQKK2FmZnNfZnJlZV9wcmVhbGxvYyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKworCXByX2RlYnVnKCJBRkZTOiBmcmVlX3ByZWFsbG9jKGlubz0lbHUpXG4iLCBpbm9kZS0+aV9pbm8pOworCisJd2hpbGUgKEFGRlNfSShpbm9kZSktPmlfcGFfY250KSB7CisJCUFGRlNfSShpbm9kZSktPmlfcGFfY250LS07CisJCWFmZnNfZnJlZV9ibG9jayhzYiwgKytBRkZTX0koaW5vZGUpLT5pX2xhc3RhbGxvYyk7CisJfQorfQorCisvKiBUcnVuY2F0ZSAob3IgZW5sYXJnZSkgYSBmaWxlIHRvIHRoZSByZXF1ZXN0ZWQgc2l6ZS4gKi8KKwordm9pZAorYWZmc190cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwl1MzIgZXh0LCBleHRfa2V5OworCXUzMiBsYXN0X2JsaywgYmxrY250LCBibGs7CisJdTMyIHNpemU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpleHRfYmg7CisJaW50IGk7CisKKwlwcl9kZWJ1ZygiQUZGUzogdHJ1bmNhdGUoaW5vZGU9JWQsIG9sZHNpemU9JXUsIG5ld3NpemU9JXUpXG4iLAorCQkgKHUzMilpbm9kZS0+aV9pbm8sICh1MzIpQUZGU19JKGlub2RlKS0+bW11X3ByaXZhdGUsICh1MzIpaW5vZGUtPmlfc2l6ZSk7CisKKwlsYXN0X2JsayA9IDA7CisJZXh0ID0gMDsKKwlpZiAoaW5vZGUtPmlfc2l6ZSkgeworCQlsYXN0X2JsayA9ICgodTMyKWlub2RlLT5pX3NpemUgLSAxKSAvIEFGRlNfU0Ioc2IpLT5zX2RhdGFfYmxrc2l6ZTsKKwkJZXh0ID0gbGFzdF9ibGsgLyBBRkZTX1NCKHNiKS0+c19oYXNoc2l6ZTsKKwl9CisKKwlpZiAoaW5vZGUtPmlfc2l6ZSA+IEFGRlNfSShpbm9kZSktPm1tdV9wcml2YXRlKSB7CisJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisJCXUzMiBzaXplID0gaW5vZGUtPmlfc2l6ZSAtIDE7CisJCWludCByZXM7CisKKwkJcGFnZSA9IGdyYWJfY2FjaGVfcGFnZShtYXBwaW5nLCBzaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQpOworCQlpZiAoIXBhZ2UpCisJCQlyZXR1cm47CisJCXNpemUgPSAoc2l6ZSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSkgKyAxOworCQlyZXMgPSBtYXBwaW5nLT5hX29wcy0+cHJlcGFyZV93cml0ZShOVUxMLCBwYWdlLCBzaXplLCBzaXplKTsKKwkJaWYgKCFyZXMpCisJCQlyZXMgPSBtYXBwaW5nLT5hX29wcy0+Y29tbWl0X3dyaXRlKE5VTEwsIHBhZ2UsIHNpemUsIHNpemUpOworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJcmV0dXJuOworCX0gZWxzZSBpZiAoaW5vZGUtPmlfc2l6ZSA9PSBBRkZTX0koaW5vZGUpLT5tbXVfcHJpdmF0ZSkKKwkJcmV0dXJuOworCisJLy8gbG9jayBjYWNoZQorCWV4dF9iaCA9IGFmZnNfZ2V0X2V4dGJsb2NrKGlub2RlLCBleHQpOworCWlmIChJU19FUlIoZXh0X2JoKSkgeworCQlhZmZzX3dhcm5pbmcoc2IsICJ0cnVuY2F0ZSIsICJ1bmV4cGVjdGVkIHJlYWQgZXJyb3IgZm9yIGV4dCBibG9jayAldSAoJWQpIiwKKwkJCSAgICAgZXh0LCBQVFJfRVJSKGV4dF9iaCkpOworCQlyZXR1cm47CisJfQorCWlmIChBRkZTX0koaW5vZGUpLT5pX2xjKSB7CisJCS8qIGNsZWFyIGxpbmVhciBjYWNoZSAqLworCQlpID0gKGV4dCArIDEpID4+IEFGRlNfSShpbm9kZSktPmlfbGNfc2hpZnQ7CisJCWlmIChBRkZTX0koaW5vZGUpLT5pX2xjX3NpemUgPiBpKSB7CisJCQlBRkZTX0koaW5vZGUpLT5pX2xjX3NpemUgPSBpOworCQkJZm9yICg7IGkgPCBBRkZTX0xDX1NJWkU7IGkrKykKKwkJCQlBRkZTX0koaW5vZGUpLT5pX2xjW2ldID0gMDsKKwkJfQorCQkvKiBjbGVhciBhc3NvY2lhdGl2ZSBjYWNoZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgQUZGU19BQ19TSVpFOyBpKyspCisJCQlpZiAoQUZGU19JKGlub2RlKS0+aV9hY1tpXS5leHQgPj0gZXh0KQorCQkJCUFGRlNfSShpbm9kZSktPmlfYWNbaV0uZXh0ID0gMDsKKwl9CisJZXh0X2tleSA9IGJlMzJfdG9fY3B1KEFGRlNfVEFJTChzYiwgZXh0X2JoKS0+ZXh0ZW5zaW9uKTsKKworCWJsa2NudCA9IEFGRlNfSShpbm9kZSktPmlfYmxrY250OworCWkgPSAwOworCWJsayA9IGxhc3RfYmxrOworCWlmIChpbm9kZS0+aV9zaXplKSB7CisJCWkgPSBsYXN0X2JsayAlIEFGRlNfU0Ioc2IpLT5zX2hhc2hzaXplICsgMTsKKwkJYmxrKys7CisJfSBlbHNlCisJCUFGRlNfSEVBRChleHRfYmgpLT5maXJzdF9kYXRhID0gMDsKKwlzaXplID0gQUZGU19TQihzYiktPnNfaGFzaHNpemU7CisJaWYgKHNpemUgPiBibGtjbnQgLSBibGsgKyBpKQorCQlzaXplID0gYmxrY250IC0gYmxrICsgaTsKKwlmb3IgKDsgaSA8IHNpemU7IGkrKywgYmxrKyspIHsKKwkJYWZmc19mcmVlX2Jsb2NrKHNiLCBiZTMyX3RvX2NwdShBRkZTX0JMT0NLKHNiLCBleHRfYmgsIGkpKSk7CisJCUFGRlNfQkxPQ0soc2IsIGV4dF9iaCwgaSkgPSAwOworCX0KKwlBRkZTX1RBSUwoc2IsIGV4dF9iaCktPmV4dGVuc2lvbiA9IDA7CisJYWZmc19maXhfY2hlY2tzdW0oc2IsIGV4dF9iaCk7CisJbWFya19idWZmZXJfZGlydHlfaW5vZGUoZXh0X2JoLCBpbm9kZSk7CisJYWZmc19icmVsc2UoZXh0X2JoKTsKKworCWlmIChpbm9kZS0+aV9zaXplKSB7CisJCUFGRlNfSShpbm9kZSktPmlfYmxrY250ID0gbGFzdF9ibGsgKyAxOworCQlBRkZTX0koaW5vZGUpLT5pX2V4dGNudCA9IGV4dCArIDE7CisJCWlmIChBRkZTX1NCKHNiKS0+c19mbGFncyAmIFNGX09GUykgeworCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGFmZnNfYnJlYWRfaW5vKGlub2RlLCBsYXN0X2JsaywgMCk7CisJCQl1MzIgdG1wOworCQkJaWYgKElTX0VSUihleHRfYmgpKSB7CisJCQkJYWZmc193YXJuaW5nKHNiLCAidHJ1bmNhdGUiLCAidW5leHBlY3RlZCByZWFkIGVycm9yIGZvciBsYXN0IGJsb2NrICV1ICglZCkiLAorCQkJCQkgICAgIGV4dCwgUFRSX0VSUihleHRfYmgpKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQl0bXAgPSBiZTMyX3RvX2NwdShBRkZTX0RBVEFfSEVBRChiaCktPm5leHQpOworCQkJQUZGU19EQVRBX0hFQUQoYmgpLT5uZXh0ID0gMDsKKwkJCWFmZnNfYWRqdXN0X2NoZWNrc3VtKGJoLCAtdG1wKTsKKwkJCWFmZnNfYnJlbHNlKGJoKTsKKwkJfQorCX0gZWxzZSB7CisJCUFGRlNfSShpbm9kZSktPmlfYmxrY250ID0gMDsKKwkJQUZGU19JKGlub2RlKS0+aV9leHRjbnQgPSAxOworCX0KKwlBRkZTX0koaW5vZGUpLT5tbXVfcHJpdmF0ZSA9IGlub2RlLT5pX3NpemU7CisJLy8gdW5sb2NrIGNhY2hlCisKKwl3aGlsZSAoZXh0X2tleSkgeworCQlleHRfYmggPSBhZmZzX2JyZWFkKHNiLCBleHRfa2V5KTsKKwkJc2l6ZSA9IEFGRlNfU0Ioc2IpLT5zX2hhc2hzaXplOworCQlpZiAoc2l6ZSA+IGJsa2NudCAtIGJsaykKKwkJCXNpemUgPSBibGtjbnQgLSBibGs7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyssIGJsaysrKQorCQkJYWZmc19mcmVlX2Jsb2NrKHNiLCBiZTMyX3RvX2NwdShBRkZTX0JMT0NLKHNiLCBleHRfYmgsIGkpKSk7CisJCWFmZnNfZnJlZV9ibG9jayhzYiwgZXh0X2tleSk7CisJCWV4dF9rZXkgPSBiZTMyX3RvX2NwdShBRkZTX1RBSUwoc2IsIGV4dF9iaCktPmV4dGVuc2lvbik7CisJCWFmZnNfYnJlbHNlKGV4dF9iaCk7CisJfQorCWFmZnNfZnJlZV9wcmVhbGxvYyhpbm9kZSk7Cit9CmRpZmYgLS1naXQgYS9mcy9hZmZzL2lub2RlLmMgYi9mcy9hZmZzL2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FhNmYyMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2FmZnMvaW5vZGUuYwpAQCAtMCwwICsxLDQxMSBAQAorLyoKKyAqICBsaW51eC9mcy9hZmZzL2lub2RlLmMKKyAqCisgKiAgKGMpIDE5OTYgIEhhbnMtSm9hY2hpbSBXaWRtYWllciAtIFJld3JpdHRlbgorICoKKyAqICAoQykgMTk5MyAgUmF5IEJ1cnIgLSBNb2RpZmllZCBmb3IgQW1pZ2EgRkZTIGZpbGVzeXN0ZW0uCisgKgorICogIChDKSAxOTkyICBFcmljIFlvdW5nZGFsZSBNb2RpZmllZCBmb3IgSVNPOTY2MCBmaWxlc3lzdGVtLgorICoKKyAqICAoQykgMTk5MSAgTGludXMgVG9ydmFsZHMgLSBtaW5peCBmaWxlc3lzdGVtCisgKi8KKworI2luY2x1ZGUgImFmZnMuaCIKKworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGFmZnNfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCB0aW1lem9uZSBzeXNfdHo7CisKK3ZvaWQKK2FmZnNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jawkqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgYWZmc19zYl9pbmZvCSpzYmkgPSBBRkZTX1NCKHNiKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoOworCXN0cnVjdCBhZmZzX2hlYWQJKmhlYWQ7CisJc3RydWN0IGFmZnNfdGFpbAkqdGFpbDsKKwl1MzIJCQkgYmxvY2s7CisJdTMyCQkJIHNpemU7CisJdTMyCQkJIHByb3Q7CisJdTE2CQkJIGlkOworCisJcHJfZGVidWcoIkFGRlM6IHJlYWRfaW5vZGUoJWx1KVxuIixpbm9kZS0+aV9pbm8pOworCisJYmxvY2sgPSBpbm9kZS0+aV9pbm87CisJYmggPSBhZmZzX2JyZWFkKHNiLCBibG9jayk7CisJaWYgKCFiaCkgeworCQlhZmZzX3dhcm5pbmcoc2IsICJyZWFkX2lub2RlIiwgIkNhbm5vdCByZWFkIGJsb2NrICVkIiwgYmxvY2spOworCQlnb3RvIGJhZF9pbm9kZTsKKwl9CisJaWYgKGFmZnNfY2hlY2tzdW1fYmxvY2soc2IsIGJoKSB8fCBiZTMyX3RvX2NwdShBRkZTX0hFQUQoYmgpLT5wdHlwZSkgIT0gVF9TSE9SVCkgeworCQlhZmZzX3dhcm5pbmcoc2IsInJlYWRfaW5vZGUiLAorCQkJICAgIkNoZWNrc3VtIG9yIHR5cGUgKHB0eXBlPSVkKSBlcnJvciBvbiBpbm9kZSAlZCIsCisJCQkgICBBRkZTX0hFQUQoYmgpLT5wdHlwZSwgYmxvY2spOworCQlnb3RvIGJhZF9pbm9kZTsKKwl9CisKKwloZWFkID0gQUZGU19IRUFEKGJoKTsKKwl0YWlsID0gQUZGU19UQUlMKHNiLCBiaCk7CisJcHJvdCA9IGJlMzJfdG9fY3B1KHRhaWwtPnByb3RlY3QpOworCisJaW5vZGUtPmlfc2l6ZSA9IDA7CisJaW5vZGUtPmlfbmxpbmsgPSAxOworCWlub2RlLT5pX21vZGUgPSAwOworCUFGRlNfSShpbm9kZSktPmlfZXh0Y250ID0gMTsKKwlBRkZTX0koaW5vZGUpLT5pX2V4dF9sYXN0ID0gfjE7CisJQUZGU19JKGlub2RlKS0+aV9wcm90ZWN0ID0gcHJvdDsKKwlBRkZTX0koaW5vZGUpLT5pX29wZW5jbnQgPSAwOworCUFGRlNfSShpbm9kZSktPmlfYmxrY250ID0gMDsKKwlBRkZTX0koaW5vZGUpLT5pX2xjID0gTlVMTDsKKwlBRkZTX0koaW5vZGUpLT5pX2xjX3NpemUgPSAwOworCUFGRlNfSShpbm9kZSktPmlfbGNfc2hpZnQgPSAwOworCUFGRlNfSShpbm9kZSktPmlfbGNfbWFzayA9IDA7CisJQUZGU19JKGlub2RlKS0+aV9hYyA9IE5VTEw7CisJQUZGU19JKGlub2RlKS0+aV9leHRfYmggPSBOVUxMOworCUFGRlNfSShpbm9kZSktPm1tdV9wcml2YXRlID0gMDsKKwlBRkZTX0koaW5vZGUpLT5pX2xhc3RhbGxvYyA9IDA7CisJQUZGU19JKGlub2RlKS0+aV9wYV9jbnQgPSAwOworCisJaWYgKHNiaS0+c19mbGFncyAmIFNGX1NFVE1PREUpCisJCWlub2RlLT5pX21vZGUgPSBzYmktPnNfbW9kZTsKKwllbHNlCisJCWlub2RlLT5pX21vZGUgPSBwcm90X3RvX21vZGUocHJvdCk7CisKKwlpZCA9IGJlMTZfdG9fY3B1KHRhaWwtPnVpZCk7CisJaWYgKGlkID09IDAgfHwgc2JpLT5zX2ZsYWdzICYgU0ZfU0VUVUlEKQorCQlpbm9kZS0+aV91aWQgPSBzYmktPnNfdWlkOworCWVsc2UgaWYgKGlkID09IDB4RkZGRiAmJiBzYmktPnNfZmxhZ3MgJiBTRl9NVUZTKQorCQlpbm9kZS0+aV91aWQgPSAwOworCWVsc2UKKwkJaW5vZGUtPmlfdWlkID0gaWQ7CisKKwlpZCA9IGJlMTZfdG9fY3B1KHRhaWwtPmdpZCk7CisJaWYgKGlkID09IDAgfHwgc2JpLT5zX2ZsYWdzICYgU0ZfU0VUR0lEKQorCQlpbm9kZS0+aV9naWQgPSBzYmktPnNfZ2lkOworCWVsc2UgaWYgKGlkID09IDB4RkZGRiAmJiBzYmktPnNfZmxhZ3MgJiBTRl9NVUZTKQorCQlpbm9kZS0+aV9naWQgPSAwOworCWVsc2UKKwkJaW5vZGUtPmlfZ2lkID0gaWQ7CisKKwlzd2l0Y2ggKGJlMzJfdG9fY3B1KHRhaWwtPnN0eXBlKSkgeworCWNhc2UgU1RfUk9PVDoKKwkJaW5vZGUtPmlfdWlkID0gc2JpLT5zX3VpZDsKKwkJaW5vZGUtPmlfZ2lkID0gc2JpLT5zX2dpZDsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBTVF9VU0VSRElSOgorCQlpZiAoYmUzMl90b19jcHUodGFpbC0+c3R5cGUpID09IFNUX1VTRVJESVIgfHwKKwkJICAgIHNiaS0+c19mbGFncyAmIFNGX1NFVE1PREUpIHsKKwkJCWlmIChpbm9kZS0+aV9tb2RlICYgU19JUlVTUikKKwkJCQlpbm9kZS0+aV9tb2RlIHw9IFNfSVhVU1I7CisJCQlpZiAoaW5vZGUtPmlfbW9kZSAmIFNfSVJHUlApCisJCQkJaW5vZGUtPmlfbW9kZSB8PSBTX0lYR1JQOworCQkJaWYgKGlub2RlLT5pX21vZGUgJiBTX0lST1RIKQorCQkJCWlub2RlLT5pX21vZGUgfD0gU19JWE9USDsKKwkJCWlub2RlLT5pX21vZGUgfD0gU19JRkRJUjsKKwkJfSBlbHNlCisJCQlpbm9kZS0+aV9tb2RlID0gU19JUlVHTyB8IFNfSVhVR08gfCBTX0lXVVNSIHwgU19JRkRJUjsKKwkJaWYgKHRhaWwtPmxpbmtfY2hhaW4pCisJCQlpbm9kZS0+aV9ubGluayA9IDI7CisJCS8qIE1heWJlIGl0IHNob3VsZCBiZSBjb250cm9sbGVkIGJ5IG1vdW50IHBhcmFtZXRlcj8gKi8KKwkJLy9pbm9kZS0+aV9tb2RlIHw9IFNfSVNWVFg7CisJCWlub2RlLT5pX29wID0gJmFmZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZhZmZzX2Rpcl9vcGVyYXRpb25zOworCQlicmVhazsKKwljYXNlIFNUX0xJTktESVI6CisjaWYgMAorCQlhZmZzX3dhcm5pbmcoc2IsICJyZWFkX2lub2RlIiwgImlub2RlIGlzIExJTktESVIiKTsKKwkJZ290byBiYWRfaW5vZGU7CisjZWxzZQorCQlpbm9kZS0+aV9tb2RlIHw9IFNfSUZESVI7CisJCWlub2RlLT5pX29wID0gTlVMTDsKKwkJaW5vZGUtPmlfZm9wID0gTlVMTDsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIFNUX0xJTktGSUxFOgorCQlhZmZzX3dhcm5pbmcoc2IsICJyZWFkX2lub2RlIiwgImlub2RlIGlzIExJTktGSUxFIik7CisJCWdvdG8gYmFkX2lub2RlOworCWNhc2UgU1RfRklMRToKKwkJc2l6ZSA9IGJlMzJfdG9fY3B1KHRhaWwtPnNpemUpOworCQlpbm9kZS0+aV9tb2RlIHw9IFNfSUZSRUc7CisJCUFGRlNfSShpbm9kZSktPm1tdV9wcml2YXRlID0gaW5vZGUtPmlfc2l6ZSA9IHNpemU7CisJCWlmIChpbm9kZS0+aV9zaXplKSB7CisJCQlBRkZTX0koaW5vZGUpLT5pX2Jsa2NudCA9IChzaXplIC0gMSkgLworCQkJCQkgICAgICAgc2JpLT5zX2RhdGFfYmxrc2l6ZSArIDE7CisJCQlBRkZTX0koaW5vZGUpLT5pX2V4dGNudCA9IChBRkZTX0koaW5vZGUpLT5pX2Jsa2NudCAtIDEpIC8KKwkJCQkJICAgICAgIHNiaS0+c19oYXNoc2l6ZSArIDE7CisJCX0KKwkJaWYgKHRhaWwtPmxpbmtfY2hhaW4pCisJCQlpbm9kZS0+aV9ubGluayA9IDI7CisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gKHNiaS0+c19mbGFncyAmIFNGX09GUykgPyAmYWZmc19hb3BzX29mcyA6ICZhZmZzX2FvcHM7CisJCWlub2RlLT5pX29wID0gJmFmZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9mb3AgPSAmYWZmc19maWxlX29wZXJhdGlvbnM7CisJCWJyZWFrOworCWNhc2UgU1RfU09GVExJTks6CisJCWlub2RlLT5pX21vZGUgfD0gU19JRkxOSzsKKwkJaW5vZGUtPmlfb3AgPSAmYWZmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2RhdGEuYV9vcHMgPSAmYWZmc19zeW1saW5rX2FvcHM7CisJCWJyZWFrOworCX0KKworCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IGlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IGlub2RlLT5pX2N0aW1lLnR2X3NlYworCQkgICAgICAgPSAoYmUzMl90b19jcHUodGFpbC0+Y2hhbmdlLmRheXMpICogKDI0ICogNjAgKiA2MCkgKworCQkgICAgICAgICBiZTMyX3RvX2NwdSh0YWlsLT5jaGFuZ2UubWlucykgKiA2MCArCisJCQkgYmUzMl90b19jcHUodGFpbC0+Y2hhbmdlLnRpY2tzKSAvIDUwICsKKwkJCSAoKDggKiAzNjUgKyAyKSAqIDI0ICogNjAgKiA2MCkpICsKKwkJCSBzeXNfdHoudHpfbWludXRlc3dlc3QgKiA2MDsKKwlpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gaW5vZGUtPmlfY3RpbWUudHZfbnNlYyA9IGlub2RlLT5pX2F0aW1lLnR2X25zZWMgPSAwOworCWFmZnNfYnJlbHNlKGJoKTsKKwlyZXR1cm47CisKK2JhZF9pbm9kZToKKwltYWtlX2JhZF9pbm9kZShpbm9kZSk7CisJYWZmc19icmVsc2UoYmgpOworCXJldHVybjsKK30KKworaW50CithZmZzX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB1bnVzZWQpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrCSpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBidWZmZXJfaGVhZAkqYmg7CisJc3RydWN0IGFmZnNfdGFpbAkqdGFpbDsKKwl1aWRfdAkJCSB1aWQ7CisJZ2lkX3QJCQkgZ2lkOworCisJcHJfZGVidWcoIkFGRlM6IHdyaXRlX2lub2RlKCVsdSlcbiIsaW5vZGUtPmlfaW5vKTsKKworCWlmICghaW5vZGUtPmlfbmxpbmspCisJCS8vIHBvc3NpYmx5IGZyZWUgYmxvY2sKKwkJcmV0dXJuIDA7CisJYmggPSBhZmZzX2JyZWFkKHNiLCBpbm9kZS0+aV9pbm8pOworCWlmICghYmgpIHsKKwkJYWZmc19lcnJvcihzYiwid3JpdGVfaW5vZGUiLCJDYW5ub3QgcmVhZCBibG9jayAlbHUiLGlub2RlLT5pX2lubyk7CisJCXJldHVybiAtRUlPOworCX0KKwl0YWlsID0gQUZGU19UQUlMKHNiLCBiaCk7CisJaWYgKHRhaWwtPnN0eXBlID09IGNwdV90b19iZTMyKFNUX1JPT1QpKSB7CisJCXNlY3NfdG9fZGF0ZXN0YW1wKGlub2RlLT5pX210aW1lLnR2X3NlYywmQUZGU19ST09UX1RBSUwoc2IsIGJoKS0+cm9vdF9jaGFuZ2UpOworCX0gZWxzZSB7CisJCXRhaWwtPnByb3RlY3QgPSBjcHVfdG9fYmUzMihBRkZTX0koaW5vZGUpLT5pX3Byb3RlY3QpOworCQl0YWlsLT5zaXplID0gY3B1X3RvX2JlMzIoaW5vZGUtPmlfc2l6ZSk7CisJCXNlY3NfdG9fZGF0ZXN0YW1wKGlub2RlLT5pX210aW1lLnR2X3NlYywmdGFpbC0+Y2hhbmdlKTsKKwkJaWYgKCEoaW5vZGUtPmlfaW5vID09IEFGRlNfU0Ioc2IpLT5zX3Jvb3RfYmxvY2spKSB7CisJCQl1aWQgPSBpbm9kZS0+aV91aWQ7CisJCQlnaWQgPSBpbm9kZS0+aV9naWQ7CisJCQlpZiAoQUZGU19TQihzYiktPnNfZmxhZ3MgJiBTRl9NVUZTKSB7CisJCQkJaWYgKGlub2RlLT5pX3VpZCA9PSAwIHx8IGlub2RlLT5pX3VpZCA9PSAweEZGRkYpCisJCQkJCXVpZCA9IGlub2RlLT5pX3VpZCBeIH4wOworCQkJCWlmIChpbm9kZS0+aV9naWQgPT0gMCB8fCBpbm9kZS0+aV9naWQgPT0gMHhGRkZGKQorCQkJCQlnaWQgPSBpbm9kZS0+aV9naWQgXiB+MDsKKwkJCX0KKwkJCWlmICghKEFGRlNfU0Ioc2IpLT5zX2ZsYWdzICYgU0ZfU0VUVUlEKSkKKwkJCQl0YWlsLT51aWQgPSBjcHVfdG9fYmUxNih1aWQpOworCQkJaWYgKCEoQUZGU19TQihzYiktPnNfZmxhZ3MgJiBTRl9TRVRHSUQpKQorCQkJCXRhaWwtPmdpZCA9IGNwdV90b19iZTE2KGdpZCk7CisJCX0KKwl9CisJYWZmc19maXhfY2hlY2tzdW0oc2IsIGJoKTsKKwltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShiaCwgaW5vZGUpOworCWFmZnNfYnJlbHNlKGJoKTsKKwlhZmZzX2ZyZWVfcHJlYWxsb2MoaW5vZGUpOworCXJldHVybiAwOworfQorCitpbnQKK2FmZnNfbm90aWZ5X2NoYW5nZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqYXR0cikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludCBlcnJvcjsKKworCXByX2RlYnVnKCJBRkZTOiBub3RpZnlfY2hhbmdlKCVsdSwweCV4KVxuIixpbm9kZS0+aV9pbm8sYXR0ci0+aWFfdmFsaWQpOworCisJZXJyb3IgPSBpbm9kZV9jaGFuZ2Vfb2soaW5vZGUsYXR0cik7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKworCWlmICgoKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9VSUQpICYmIChBRkZTX1NCKGlub2RlLT5pX3NiKS0+c19mbGFncyAmIFNGX1NFVFVJRCkpIHx8CisJICAgICgoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0dJRCkgJiYgKEFGRlNfU0IoaW5vZGUtPmlfc2IpLT5zX2ZsYWdzICYgU0ZfU0VUR0lEKSkgfHwKKwkgICAgKChhdHRyLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkgJiYKKwkgICAgIChBRkZTX1NCKGlub2RlLT5pX3NiKS0+c19mbGFncyAmIChTRl9TRVRNT0RFIHwgU0ZfSU1NVVRBQkxFKSkpKSB7CisJCWlmICghKEFGRlNfU0IoaW5vZGUtPmlfc2IpLT5zX2ZsYWdzICYgU0ZfUVVJRVQpKQorCQkJZXJyb3IgPSAtRVBFUk07CisJCWdvdG8gb3V0OworCX0KKworCWVycm9yID0gaW5vZGVfc2V0YXR0cihpbm9kZSwgYXR0cik7CisJaWYgKCFlcnJvciAmJiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01PREUpKQorCQltb2RlX3RvX3Byb3QoaW5vZGUpOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKwordm9pZAorYWZmc19wdXRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlwcl9kZWJ1ZygiQUZGUzogcHV0X2lub2RlKGlubz0lbHUsIG5saW5rPSV1KVxuIiwgaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV9ubGluayk7CisJYWZmc19mcmVlX3ByZWFsbG9jKGlub2RlKTsKKwlpZiAoYXRvbWljX3JlYWQoJmlub2RlLT5pX2NvdW50KSA9PSAxKSB7CisJCWRvd24oJmlub2RlLT5pX3NlbSk7CisJCWlmIChpbm9kZS0+aV9zaXplICE9IEFGRlNfSShpbm9kZSktPm1tdV9wcml2YXRlKQorCQkJYWZmc190cnVuY2F0ZShpbm9kZSk7CisJCXVwKCZpbm9kZS0+aV9zZW0pOworCX0KK30KKwordm9pZAorYWZmc19kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlwcl9kZWJ1ZygiQUZGUzogZGVsZXRlX2lub2RlKGlubz0lbHUsIG5saW5rPSV1KVxuIiwgaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV9ubGluayk7CisJaW5vZGUtPmlfc2l6ZSA9IDA7CisJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCisJCWFmZnNfdHJ1bmNhdGUoaW5vZGUpOworCWNsZWFyX2lub2RlKGlub2RlKTsKKwlhZmZzX2ZyZWVfYmxvY2soaW5vZGUtPmlfc2IsIGlub2RlLT5pX2lubyk7Cit9CisKK3ZvaWQKK2FmZnNfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwl1bnNpZ25lZCBsb25nIGNhY2hlX3BhZ2UgPSAodW5zaWduZWQgbG9uZykgQUZGU19JKGlub2RlKS0+aV9sYzsKKworCXByX2RlYnVnKCJBRkZTOiBjbGVhcl9pbm9kZShpbm89JWx1LCBubGluaz0ldSlcbiIsIGlub2RlLT5pX2lubywgaW5vZGUtPmlfbmxpbmspOworCWlmIChjYWNoZV9wYWdlKSB7CisJCXByX2RlYnVnKCJBRkZTOiBmcmVlaW5nIGV4dCBjYWNoZVxuIik7CisJCUFGRlNfSShpbm9kZSktPmlfbGMgPSBOVUxMOworCQlBRkZTX0koaW5vZGUpLT5pX2FjID0gTlVMTDsKKwkJZnJlZV9wYWdlKGNhY2hlX3BhZ2UpOworCX0KKwlhZmZzX2JyZWxzZShBRkZTX0koaW5vZGUpLT5pX2V4dF9iaCk7CisJQUZGU19JKGlub2RlKS0+aV9leHRfbGFzdCA9IH4xOworCUFGRlNfSShpbm9kZSktPmlfZXh0X2JoID0gTlVMTDsKK30KKworc3RydWN0IGlub2RlICoKK2FmZnNfbmV3X2lub2RlKHN0cnVjdCBpbm9kZSAqZGlyKQoreworCXN0cnVjdCBzdXBlcl9ibG9jawkqc2IgPSBkaXItPmlfc2I7CisJc3RydWN0IGlub2RlCQkqaW5vZGU7CisJdTMyCQkJIGJsb2NrOworCXN0cnVjdCBidWZmZXJfaGVhZAkqYmg7CisKKwlpZiAoIShpbm9kZSA9IG5ld19pbm9kZShzYikpKQorCQlnb3RvIGVycl9pbm9kZTsKKworCWlmICghKGJsb2NrID0gYWZmc19hbGxvY19ibG9jayhkaXIsIGRpci0+aV9pbm8pKSkKKwkJZ290byBlcnJfYmxvY2s7CisKKwliaCA9IGFmZnNfZ2V0emVyb2JsayhzYiwgYmxvY2spOworCWlmICghYmgpCisJCWdvdG8gZXJyX2JoOworCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKGJoLCBpbm9kZSk7CisJYWZmc19icmVsc2UoYmgpOworCisJaW5vZGUtPmlfdWlkICAgICA9IGN1cnJlbnQtPmZzdWlkOworCWlub2RlLT5pX2dpZCAgICAgPSBjdXJyZW50LT5mc2dpZDsKKwlpbm9kZS0+aV9pbm8gICAgID0gYmxvY2s7CisJaW5vZGUtPmlfbmxpbmsgICA9IDE7CisJaW5vZGUtPmlfbXRpbWUgICA9IGlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCUFGRlNfSShpbm9kZSktPmlfb3BlbmNudCA9IDA7CisJQUZGU19JKGlub2RlKS0+aV9ibGtjbnQgPSAwOworCUFGRlNfSShpbm9kZSktPmlfbGMgPSBOVUxMOworCUFGRlNfSShpbm9kZSktPmlfbGNfc2l6ZSA9IDA7CisJQUZGU19JKGlub2RlKS0+aV9sY19zaGlmdCA9IDA7CisJQUZGU19JKGlub2RlKS0+aV9sY19tYXNrID0gMDsKKwlBRkZTX0koaW5vZGUpLT5pX2FjID0gTlVMTDsKKwlBRkZTX0koaW5vZGUpLT5pX2V4dF9iaCA9IE5VTEw7CisJQUZGU19JKGlub2RlKS0+bW11X3ByaXZhdGUgPSAwOworCUFGRlNfSShpbm9kZSktPmlfcHJvdGVjdCA9IDA7CisJQUZGU19JKGlub2RlKS0+aV9sYXN0YWxsb2MgPSAwOworCUFGRlNfSShpbm9kZSktPmlfcGFfY250ID0gMDsKKwlBRkZTX0koaW5vZGUpLT5pX2V4dGNudCA9IDE7CisJQUZGU19JKGlub2RlKS0+aV9leHRfbGFzdCA9IH4xOworCisJaW5zZXJ0X2lub2RlX2hhc2goaW5vZGUpOworCisJcmV0dXJuIGlub2RlOworCitlcnJfYmg6CisJYWZmc19mcmVlX2Jsb2NrKHNiLCBibG9jayk7CitlcnJfYmxvY2s6CisJaXB1dChpbm9kZSk7CitlcnJfaW5vZGU6CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBBZGQgYW4gZW50cnkgdG8gYSBkaXJlY3RvcnkuIENyZWF0ZSB0aGUgaGVhZGVyIGJsb2NrCisgKiBhbmQgaW5zZXJ0IGl0IGludG8gdGhlIGhhc2ggdGFibGUuCisgKi8KKworaW50CithZmZzX2FkZF9lbnRyeShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzMzIgdHlwZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLT5pX3NiOworCXN0cnVjdCBidWZmZXJfaGVhZCAqaW5vZGVfYmggPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCXUzMiBibG9jayA9IDA7CisJaW50IHJldHZhbDsKKworCXByX2RlYnVnKCJBRkZTOiBhZGRfZW50cnkoZGlyPSV1LCBpbm9kZT0ldSwgXCIlKnNcIiwgdHlwZT0lZClcbiIsICh1MzIpZGlyLT5pX2lubywKKwkgICAgICAgICAodTMyKWlub2RlLT5pX2lubywgKGludClkZW50cnktPmRfbmFtZS5sZW4sIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIHR5cGUpOworCisJcmV0dmFsID0gLUVJTzsKKwliaCA9IGFmZnNfYnJlYWQoc2IsIGlub2RlLT5pX2lubyk7CisJaWYgKCFiaCkKKwkJZ290byBkb25lOworCisJYWZmc19sb2NrX2xpbmsoaW5vZGUpOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgU1RfTElOS0ZJTEU6CisJY2FzZSBTVF9MSU5LRElSOgorCQlpbm9kZV9iaCA9IGJoOworCQlyZXR2YWwgPSAtRU5PU1BDOworCQlibG9jayA9IGFmZnNfYWxsb2NfYmxvY2soZGlyLCBkaXItPmlfaW5vKTsKKwkJaWYgKCFibG9jaykKKwkJCWdvdG8gZXJyOworCQlyZXR2YWwgPSAtRUlPOworCQliaCA9IGFmZnNfZ2V0emVyb2JsayhzYiwgYmxvY2spOworCQlpZiAoIWJoKQorCQkJZ290byBlcnI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCUFGRlNfSEVBRChiaCktPnB0eXBlID0gY3B1X3RvX2JlMzIoVF9TSE9SVCk7CisJQUZGU19IRUFEKGJoKS0+a2V5ID0gY3B1X3RvX2JlMzIoYmgtPmJfYmxvY2tucik7CisJYWZmc19jb3B5X25hbWUoQUZGU19UQUlMKHNiLCBiaCktPm5hbWUsIGRlbnRyeSk7CisJQUZGU19UQUlMKHNiLCBiaCktPnN0eXBlID0gY3B1X3RvX2JlMzIodHlwZSk7CisJQUZGU19UQUlMKHNiLCBiaCktPnBhcmVudCA9IGNwdV90b19iZTMyKGRpci0+aV9pbm8pOworCisJaWYgKGlub2RlX2JoKSB7CisJCV9fYmUzMiBjaGFpbjsKKwkgICAgICAgCWNoYWluID0gQUZGU19UQUlMKHNiLCBpbm9kZV9iaCktPmxpbmtfY2hhaW47CisJCUFGRlNfVEFJTChzYiwgYmgpLT5vcmlnaW5hbCA9IGNwdV90b19iZTMyKGlub2RlLT5pX2lubyk7CisJCUFGRlNfVEFJTChzYiwgYmgpLT5saW5rX2NoYWluID0gY2hhaW47CisJCUFGRlNfVEFJTChzYiwgaW5vZGVfYmgpLT5saW5rX2NoYWluID0gY3B1X3RvX2JlMzIoYmxvY2spOworCQlhZmZzX2FkanVzdF9jaGVja3N1bShpbm9kZV9iaCwgYmxvY2sgLSBiZTMyX3RvX2NwdShjaGFpbikpOworCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShpbm9kZV9iaCwgaW5vZGUpOworCQlpbm9kZS0+aV9ubGluayA9IDI7CisJCWF0b21pY19pbmMoJmlub2RlLT5pX2NvdW50KTsKKwl9CisJYWZmc19maXhfY2hlY2tzdW0oc2IsIGJoKTsKKwltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShiaCwgaW5vZGUpOworCWRlbnRyeS0+ZF9mc2RhdGEgPSAodm9pZCAqKShsb25nKWJoLT5iX2Jsb2NrbnI7CisKKwlhZmZzX2xvY2tfZGlyKGRpcik7CisJcmV0dmFsID0gYWZmc19pbnNlcnRfaGFzaChkaXIsIGJoKTsKKwltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShiaCwgaW5vZGUpOworCWFmZnNfdW5sb2NrX2RpcihkaXIpOworCWFmZnNfdW5sb2NrX2xpbmsoaW5vZGUpOworCisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKK2RvbmU6CisJYWZmc19icmVsc2UoaW5vZGVfYmgpOworCWFmZnNfYnJlbHNlKGJoKTsKKwlyZXR1cm4gcmV0dmFsOworZXJyOgorCWlmIChibG9jaykKKwkJYWZmc19mcmVlX2Jsb2NrKHNiLCBibG9jayk7CisJYWZmc191bmxvY2tfbGluayhpbm9kZSk7CisJZ290byBkb25lOworfQpkaWZmIC0tZ2l0IGEvZnMvYWZmcy9uYW1laS5jIGIvZnMvYWZmcy9uYW1laS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YzJkNjMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZmZzL25hbWVpLmMKQEAgLTAsMCArMSw0NDMgQEAKKy8qCisgKiAgbGludXgvZnMvYWZmcy9uYW1laS5jCisgKgorICogIChjKSAxOTk2ICBIYW5zLUpvYWNoaW0gV2lkbWFpZXIgLSBSZXdyaXR0ZW4KKyAqCisgKiAgKEMpIDE5OTMgIFJheSBCdXJyIC0gTW9kaWZpZWQgZm9yIEFtaWdhIEZGUyBmaWxlc3lzdGVtLgorICoKKyAqICAoQykgMTk5MSAgTGludXMgVG9ydmFsZHMgLSBtaW5peCBmaWxlc3lzdGVtCisgKi8KKworI2luY2x1ZGUgImFmZnMuaCIKKwordHlwZWRlZiBpbnQgKCp0b3VwcGVyX3QpKGludCk7CisKK3N0YXRpYyBpbnQJIGFmZnNfdG91cHBlcihpbnQgY2gpOworc3RhdGljIGludAkgYWZmc19oYXNoX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBxc3RyICopOworc3RhdGljIGludCAgICAgICBhZmZzX2NvbXBhcmVfZGVudHJ5KHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IHFzdHIgKiwgc3RydWN0IHFzdHIgKik7CitzdGF0aWMgaW50CSBhZmZzX2ludGxfdG91cHBlcihpbnQgY2gpOworc3RhdGljIGludAkgYWZmc19pbnRsX2hhc2hfZGVudHJ5KHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IHFzdHIgKik7CitzdGF0aWMgaW50ICAgICAgIGFmZnNfaW50bF9jb21wYXJlX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBxc3RyICosIHN0cnVjdCBxc3RyICopOworCitzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgYWZmc19kZW50cnlfb3BlcmF0aW9ucyA9IHsKKwkuZF9oYXNoCQk9IGFmZnNfaGFzaF9kZW50cnksCisJLmRfY29tcGFyZQk9IGFmZnNfY29tcGFyZV9kZW50cnksCit9OworCitzdGF0aWMgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGFmZnNfaW50bF9kZW50cnlfb3BlcmF0aW9ucyA9IHsKKwkuZF9oYXNoCQk9IGFmZnNfaW50bF9oYXNoX2RlbnRyeSwKKwkuZF9jb21wYXJlCT0gYWZmc19pbnRsX2NvbXBhcmVfZGVudHJ5LAorfTsKKworCisvKiBTaW1wbGUgdG91cHBlcigpIGZvciBET1NcMSAqLworCitzdGF0aWMgaW50CithZmZzX3RvdXBwZXIoaW50IGNoKQoreworCXJldHVybiBjaCA+PSAnYScgJiYgY2ggPD0gJ3onID8gY2ggLT0gKCdhJyAtICdBJykgOiBjaDsKK30KKworLyogSW50ZXJuYXRpb25hbCB0b3VwcGVyKCkgZm9yIERPU1wzICgiaW50ZXJuYXRpb25hbCIpICovCisKK3N0YXRpYyBpbnQKK2FmZnNfaW50bF90b3VwcGVyKGludCBjaCkKK3sKKwlyZXR1cm4gKGNoID49ICdhJyAmJiBjaCA8PSAneicpIHx8IChjaCA+PSAweEUwCisJCSYmIGNoIDw9IDB4RkUgJiYgY2ggIT0gMHhGNykgPworCQljaCAtICgnYScgLSAnQScpIDogY2g7Cit9CisKK3N0YXRpYyBpbmxpbmUgdG91cHBlcl90CithZmZzX2dldF90b3VwcGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJcmV0dXJuIEFGRlNfU0Ioc2IpLT5zX2ZsYWdzICYgU0ZfSU5UTCA/IGFmZnNfaW50bF90b3VwcGVyIDogYWZmc190b3VwcGVyOworfQorCisvKgorICogTm90ZTogdGhlIGRlbnRyeSBhcmd1bWVudCBpcyB0aGUgcGFyZW50IGRlbnRyeS4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK19fYWZmc19oYXNoX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICpxc3RyLCB0b3VwcGVyX3QgdG91cHBlcikKK3sKKwljb25zdCB1OCAqbmFtZSA9IHFzdHItPm5hbWU7CisJdW5zaWduZWQgbG9uZyBoYXNoOworCWludCBpOworCisJaSA9IGFmZnNfY2hlY2tfbmFtZShxc3RyLT5uYW1lLHFzdHItPmxlbik7CisJaWYgKGkpCisJCXJldHVybiBpOworCisJaGFzaCA9IGluaXRfbmFtZV9oYXNoKCk7CisJaSA9IG1pbihxc3RyLT5sZW4sIDMwdSk7CisJZm9yICg7IGkgPiAwOyBuYW1lKyssIGktLSkKKwkJaGFzaCA9IHBhcnRpYWxfbmFtZV9oYXNoKHRvdXBwZXIoKm5hbWUpLCBoYXNoKTsKKwlxc3RyLT5oYXNoID0gZW5kX25hbWVfaGFzaChoYXNoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CithZmZzX2hhc2hfZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHFzdHIgKnFzdHIpCit7CisJcmV0dXJuIF9fYWZmc19oYXNoX2RlbnRyeShkZW50cnksIHFzdHIsIGFmZnNfdG91cHBlcik7Cit9CitzdGF0aWMgaW50CithZmZzX2ludGxfaGFzaF9kZW50cnkoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqcXN0cikKK3sKKwlyZXR1cm4gX19hZmZzX2hhc2hfZGVudHJ5KGRlbnRyeSwgcXN0ciwgYWZmc19pbnRsX3RvdXBwZXIpOworfQorCitzdGF0aWMgaW5saW5lIGludAorX19hZmZzX2NvbXBhcmVfZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHFzdHIgKmEsIHN0cnVjdCBxc3RyICpiLCB0b3VwcGVyX3QgdG91cHBlcikKK3sKKwljb25zdCB1OCAqYW5hbWUgPSBhLT5uYW1lOworCWNvbnN0IHU4ICpibmFtZSA9IGItPm5hbWU7CisJaW50IGxlbjsKKworCS8qICdhJyBpcyB0aGUgcXN0ciBvZiBhbiBhbHJlYWR5IGV4aXN0aW5nIGRlbnRyeSwgc28gdGhlIG5hbWUKKwkgKiBtdXN0IGJlIHZhbGlkLiAnYicgbXVzdCBiZSB2YWxpZGF0ZWQgZmlyc3QuCisJICovCisKKwlpZiAoYWZmc19jaGVja19uYW1lKGItPm5hbWUsYi0+bGVuKSkKKwkJcmV0dXJuIDE7CisKKwkvKiBJZiB0aGUgbmFtZXMgYXJlIGxvbmdlciB0aGFuIHRoZSBhbGxvd2VkIDMwIGNoYXJzLAorCSAqIHRoZSBleGNlc3MgaXMgaWdub3JlZCwgc28gdGhlaXIgbGVuZ3RoIG1heSBkaWZmZXIuCisJICovCisJbGVuID0gYS0+bGVuOworCWlmIChsZW4gPj0gMzApIHsKKwkJaWYgKGItPmxlbiA8IDMwKQorCQkJcmV0dXJuIDE7CisJCWxlbiA9IDMwOworCX0gZWxzZSBpZiAobGVuICE9IGItPmxlbikKKwkJcmV0dXJuIDE7CisKKwlmb3IgKDsgbGVuID4gMDsgbGVuLS0pCisJCWlmICh0b3VwcGVyKCphbmFtZSsrKSAhPSB0b3VwcGVyKCpibmFtZSsrKSkKKwkJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2FmZnNfY29tcGFyZV9kZW50cnkoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqYSwgc3RydWN0IHFzdHIgKmIpCit7CisJcmV0dXJuIF9fYWZmc19jb21wYXJlX2RlbnRyeShkZW50cnksIGEsIGIsIGFmZnNfdG91cHBlcik7Cit9CitzdGF0aWMgaW50CithZmZzX2ludGxfY29tcGFyZV9kZW50cnkoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqYSwgc3RydWN0IHFzdHIgKmIpCit7CisJcmV0dXJuIF9fYWZmc19jb21wYXJlX2RlbnRyeShkZW50cnksIGEsIGIsIGFmZnNfaW50bF90b3VwcGVyKTsKK30KKworLyoKKyAqIE5PVEUhIHVubGlrZSBzdHJuY21wLCBhZmZzX21hdGNoIHJldHVybnMgMSBmb3Igc3VjY2VzcywgMCBmb3IgZmFpbHVyZS4KKyAqLworCitzdGF0aWMgaW5saW5lIGludAorYWZmc19tYXRjaChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IHU4ICpuYW1lMiwgdG91cHBlcl90IHRvdXBwZXIpCit7CisJY29uc3QgdTggKm5hbWUgPSBkZW50cnktPmRfbmFtZS5uYW1lOworCWludCBsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisKKwlpZiAobGVuID49IDMwKSB7CisJCWlmICgqbmFtZTIgPCAzMCkKKwkJCXJldHVybiAwOworCQlsZW4gPSAzMDsKKwl9IGVsc2UgaWYgKGxlbiAhPSAqbmFtZTIpCisJCXJldHVybiAwOworCisJZm9yIChuYW1lMisrOyBsZW4gPiAwOyBsZW4tLSkKKwkJaWYgKHRvdXBwZXIoKm5hbWUrKykgIT0gdG91cHBlcigqbmFtZTIrKykpCisJCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworaW50CithZmZzX2hhc2hfbmFtZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCB1OCAqbmFtZSwgdW5zaWduZWQgaW50IGxlbikKK3sKKwl0b3VwcGVyX3QgdG91cHBlciA9IGFmZnNfZ2V0X3RvdXBwZXIoc2IpOworCWludCBoYXNoOworCisJaGFzaCA9IGxlbiA9IG1pbihsZW4sIDMwdSk7CisJZm9yICg7IGxlbiA+IDA7IGxlbi0tKQorCQloYXNoID0gKGhhc2ggKiAxMyArIHRvdXBwZXIoKm5hbWUrKykpICYgMHg3ZmY7CisKKwlyZXR1cm4gaGFzaCAlIEFGRlNfU0Ioc2IpLT5zX2hhc2hzaXplOworfQorCitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICoKK2FmZnNfZmluZF9lbnRyeShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPmlfc2I7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwl0b3VwcGVyX3QgdG91cHBlciA9IGFmZnNfZ2V0X3RvdXBwZXIoc2IpOworCXUzMiBrZXk7CisKKwlwcl9kZWJ1ZygiQUZGUzogZmluZF9lbnRyeShcIiUuKnNcIilcbiIsIChpbnQpZGVudHJ5LT5kX25hbWUubGVuLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCWJoID0gYWZmc19icmVhZChzYiwgZGlyLT5pX2lubyk7CisJaWYgKCFiaCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CisKKwlrZXkgPSBiZTMyX3RvX2NwdShBRkZTX0hFQUQoYmgpLT50YWJsZVthZmZzX2hhc2hfbmFtZShzYiwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuKV0pOworCisJZm9yICg7OykgeworCQlhZmZzX2JyZWxzZShiaCk7CisJCWlmIChrZXkgPT0gMCkKKwkJCXJldHVybiBOVUxMOworCQliaCA9IGFmZnNfYnJlYWQoc2IsIGtleSk7CisJCWlmICghYmgpCisJCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKKwkJaWYgKGFmZnNfbWF0Y2goZGVudHJ5LCBBRkZTX1RBSUwoc2IsIGJoKS0+bmFtZSwgdG91cHBlcikpCisJCQlyZXR1cm4gYmg7CisJCWtleSA9IGJlMzJfdG9fY3B1KEFGRlNfVEFJTChzYiwgYmgpLT5oYXNoX2NoYWluKTsKKwl9Cit9CisKK3N0cnVjdCBkZW50cnkgKgorYWZmc19sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRpci0+aV9zYjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOworCisJcHJfZGVidWcoIkFGRlM6IGxvb2t1cChcIiUuKnNcIilcbiIsKGludClkZW50cnktPmRfbmFtZS5sZW4sZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwlhZmZzX2xvY2tfZGlyKGRpcik7CisJYmggPSBhZmZzX2ZpbmRfZW50cnkoZGlyLCBkZW50cnkpOworCWFmZnNfdW5sb2NrX2RpcihkaXIpOworCWlmIChJU19FUlIoYmgpKSB7CisJCXJldHVybiBFUlJfUFRSKFBUUl9FUlIoYmgpKTsKKwl9CisJaWYgKGJoKSB7CisJCXUzMiBpbm8gPSBiaC0+Yl9ibG9ja25yOworCisJCS8qIHN0b3JlIHRoZSByZWFsIGhlYWRlciBpbm8gaW4gZF9mc2RhdGEgZm9yIGZhc3RlciBsb29rdXBzICovCisJCWRlbnRyeS0+ZF9mc2RhdGEgPSAodm9pZCAqKShsb25nKWlubzsKKwkJc3dpdGNoIChiZTMyX3RvX2NwdShBRkZTX1RBSUwoc2IsIGJoKS0+c3R5cGUpKSB7CisJCS8vbGluayB0byBkaXJzIGRpc2FibGVkCisJCS8vY2FzZSBTVF9MSU5LRElSOgorCQljYXNlIFNUX0xJTktGSUxFOgorCQkJaW5vID0gYmUzMl90b19jcHUoQUZGU19UQUlMKHNiLCBiaCktPm9yaWdpbmFsKTsKKwkJfQorCQlhZmZzX2JyZWxzZShiaCk7CisJCWlub2RlID0gaWdldChzYiwgaW5vKTsKKwkJaWYgKCFpbm9kZSkgeworCQkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CisJCX0KKwl9CisJZGVudHJ5LT5kX29wID0gQUZGU19TQihzYiktPnNfZmxhZ3MgJiBTRl9JTlRMID8gJmFmZnNfaW50bF9kZW50cnlfb3BlcmF0aW9ucyA6ICZhZmZzX2RlbnRyeV9vcGVyYXRpb25zOworCWRfYWRkKGRlbnRyeSwgaW5vZGUpOworCXJldHVybiBOVUxMOworfQorCitpbnQKK2FmZnNfdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJcHJfZGVidWcoIkFGRlM6IHVubGluayhkaXI9JWQsIFwiJS4qc1wiKVxuIiwgKHUzMilkaXItPmlfaW5vLAorCQkgKGludClkZW50cnktPmRfbmFtZS5sZW4sIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJcmV0dXJuIGFmZnNfcmVtb3ZlX2hlYWRlcihkZW50cnkpOworfQorCitpbnQKK2FmZnNfY3JlYXRlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLT5pX3NiOworCXN0cnVjdCBpbm9kZQkqaW5vZGU7CisJaW50CQkgZXJyb3I7CisKKwlwcl9kZWJ1ZygiQUZGUzogY3JlYXRlKCVsdSxcIiUuKnNcIiwwJW8pXG4iLGRpci0+aV9pbm8sKGludClkZW50cnktPmRfbmFtZS5sZW4sCisJCSBkZW50cnktPmRfbmFtZS5uYW1lLG1vZGUpOworCisJaW5vZGUgPSBhZmZzX25ld19pbm9kZShkaXIpOworCWlmICghaW5vZGUpCisJCXJldHVybiAtRU5PU1BDOworCisJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisJbW9kZV90b19wcm90KGlub2RlKTsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKworCWlub2RlLT5pX29wID0gJmFmZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCWlub2RlLT5pX2ZvcCA9ICZhZmZzX2ZpbGVfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9IChBRkZTX1NCKHNiKS0+c19mbGFncyAmIFNGX09GUykgPyAmYWZmc19hb3BzX29mcyA6ICZhZmZzX2FvcHM7CisJZXJyb3IgPSBhZmZzX2FkZF9lbnRyeShkaXIsIGlub2RlLCBkZW50cnksIFNUX0ZJTEUpOworCWlmIChlcnJvcikgeworCQlpbm9kZS0+aV9ubGluayA9IDA7CisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCXJldHVybiAwOworfQorCitpbnQKK2FmZnNfbWtkaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpCit7CisJc3RydWN0IGlub2RlCQkqaW5vZGU7CisJaW50CQkJIGVycm9yOworCisJcHJfZGVidWcoIkFGRlM6IG1rZGlyKCVsdSxcIiUuKnNcIiwwJW8pXG4iLGRpci0+aV9pbm8sCisJCSAoaW50KWRlbnRyeS0+ZF9uYW1lLmxlbixkZW50cnktPmRfbmFtZS5uYW1lLG1vZGUpOworCisJaW5vZGUgPSBhZmZzX25ld19pbm9kZShkaXIpOworCWlmICghaW5vZGUpCisJCXJldHVybiAtRU5PU1BDOworCisJaW5vZGUtPmlfbW9kZSA9IFNfSUZESVIgfCBtb2RlOworCW1vZGVfdG9fcHJvdChpbm9kZSk7CisKKwlpbm9kZS0+aV9vcCA9ICZhZmZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCWlub2RlLT5pX2ZvcCA9ICZhZmZzX2Rpcl9vcGVyYXRpb25zOworCisJZXJyb3IgPSBhZmZzX2FkZF9lbnRyeShkaXIsIGlub2RlLCBkZW50cnksIFNUX1VTRVJESVIpOworCWlmIChlcnJvcikgeworCQlpbm9kZS0+aV9ubGluayA9IDA7CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50CithZmZzX3JtZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJcHJfZGVidWcoIkFGRlM6IHJtZGlyKGRpcj0ldSwgXCIlLipzXCIpXG4iLCAodTMyKWRpci0+aV9pbm8sCisJCSAoaW50KWRlbnRyeS0+ZF9uYW1lLmxlbiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwlyZXR1cm4gYWZmc19yZW1vdmVfaGVhZGVyKGRlbnRyeSk7Cit9CisKK2ludAorYWZmc19zeW1saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKnN5bW5hbWUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrCSpzYiA9IGRpci0+aV9zYjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoOworCXN0cnVjdCBpbm9kZQkJKmlub2RlOworCWNoYXIJCQkqcDsKKwlpbnQJCQkgaSwgbWF4bGVuLCBlcnJvcjsKKwljaGFyCQkJIGMsIGxjOworCisJcHJfZGVidWcoIkFGRlM6IHN5bWxpbmsoJWx1LFwiJS4qc1wiIC0+IFwiJXNcIilcbiIsZGlyLT5pX2lubywKKwkJIChpbnQpZGVudHJ5LT5kX25hbWUubGVuLGRlbnRyeS0+ZF9uYW1lLm5hbWUsc3ltbmFtZSk7CisKKwltYXhsZW4gPSBBRkZTX1NCKHNiKS0+c19oYXNoc2l6ZSAqIHNpemVvZih1MzIpIC0gMTsKKwlpbm9kZSAgPSBhZmZzX25ld19pbm9kZShkaXIpOworCWlmICghaW5vZGUpCisJCXJldHVybiAtRU5PU1BDOworCisJaW5vZGUtPmlfb3AgPSAmYWZmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfZGF0YS5hX29wcyA9ICZhZmZzX3N5bWxpbmtfYW9wczsKKwlpbm9kZS0+aV9tb2RlID0gU19JRkxOSyB8IDA3Nzc7CisJbW9kZV90b19wcm90KGlub2RlKTsKKworCWVycm9yID0gLUVJTzsKKwliaCA9IGFmZnNfYnJlYWQoc2IsIGlub2RlLT5pX2lubyk7CisJaWYgKCFiaCkKKwkJZ290byBlcnI7CisJaSAgPSAwOworCXAgID0gKGNoYXIgKilBRkZTX0hFQUQoYmgpLT50YWJsZTsKKwlsYyA9ICcvJzsKKwlpZiAoKnN5bW5hbWUgPT0gJy8nKSB7CisJCXdoaWxlICgqc3ltbmFtZSA9PSAnLycpCisJCQlzeW1uYW1lKys7CisJCXdoaWxlIChBRkZTX1NCKHNiKS0+c192b2x1bWVbaV0pCS8qIENhbm5vdCBvdmVyZmxvdyAqLworCQkJKnArKyA9IEFGRlNfU0Ioc2IpLT5zX3ZvbHVtZVtpKytdOworCX0KKwl3aGlsZSAoaSA8IG1heGxlbiAmJiAoYyA9ICpzeW1uYW1lKyspKSB7CisJCWlmIChjID09ICcuJyAmJiBsYyA9PSAnLycgJiYgKnN5bW5hbWUgPT0gJy4nICYmIHN5bW5hbWVbMV0gPT0gJy8nKSB7CisJCQkqcCsrID0gJy8nOworCQkJaSsrOworCQkJc3ltbmFtZSArPSAyOworCQkJbGMgPSAnLyc7CisJCX0gZWxzZSBpZiAoYyA9PSAnLicgJiYgbGMgPT0gJy8nICYmICpzeW1uYW1lID09ICcvJykgeworCQkJc3ltbmFtZSsrOworCQkJbGMgPSAnLyc7CisJCX0gZWxzZSB7CisJCQkqcCsrID0gYzsKKwkJCWxjICAgPSBjOworCQkJaSsrOworCQl9CisJCWlmIChsYyA9PSAnLycpCisJCQl3aGlsZSAoKnN5bW5hbWUgPT0gJy8nKQorCQkJCXN5bW5hbWUrKzsKKwl9CisJKnAgPSAwOworCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKGJoLCBpbm9kZSk7CisJYWZmc19icmVsc2UoYmgpOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCisJZXJyb3IgPSBhZmZzX2FkZF9lbnRyeShkaXIsIGlub2RlLCBkZW50cnksIFNUX1NPRlRMSU5LKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyOworCisJcmV0dXJuIDA7CisKK2VycjoKKwlpbm9kZS0+aV9ubGluayA9IDA7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJaXB1dChpbm9kZSk7CisJcmV0dXJuIGVycm9yOworfQorCitpbnQKK2FmZnNfbGluayhzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBvbGRfZGVudHJ5LT5kX2lub2RlOworCisJcHJfZGVidWcoIkFGRlM6IGxpbmsoJXUsICV1LCBcIiUuKnNcIilcbiIsICh1MzIpaW5vZGUtPmlfaW5vLCAodTMyKWRpci0+aV9pbm8sCisJCSAoaW50KWRlbnRyeS0+ZF9uYW1lLmxlbixkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCXJldHVybiBhZmZzX2FkZF9lbnRyeShkaXIsIGlub2RlLCBkZW50cnksIFNUX0xJTktGSUxFKTsKK30KKworaW50CithZmZzX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCisJICAgIHN0cnVjdCBpbm9kZSAqbmV3X2Rpciwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gb2xkX2Rpci0+aV9zYjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwlpbnQgcmV0dmFsOworCisJcHJfZGVidWcoIkFGRlM6IHJlbmFtZShvbGQ9JXUsXCIlKnNcIiB0byBuZXc9JXUsXCIlKnNcIilcbiIsCisJCSAodTMyKW9sZF9kaXItPmlfaW5vLCAoaW50KW9sZF9kZW50cnktPmRfbmFtZS5sZW4sIG9sZF9kZW50cnktPmRfbmFtZS5uYW1lLAorCQkgKHUzMiluZXdfZGlyLT5pX2lubywgKGludCluZXdfZGVudHJ5LT5kX25hbWUubGVuLCBuZXdfZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwlyZXR2YWwgPSBhZmZzX2NoZWNrX25hbWUobmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUsbmV3X2RlbnRyeS0+ZF9uYW1lLmxlbik7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCS8qIFVubGluayBkZXN0aW5hdGlvbiBpZiBpdCBhbHJlYWR5IGV4aXN0cyAqLworCWlmIChuZXdfZGVudHJ5LT5kX2lub2RlKSB7CisJCXJldHZhbCA9IGFmZnNfcmVtb3ZlX2hlYWRlcihuZXdfZGVudHJ5KTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCisJcmV0dmFsID0gLUVJTzsKKwliaCA9IGFmZnNfYnJlYWQoc2IsIG9sZF9kZW50cnktPmRfaW5vZGUtPmlfaW5vKTsKKwlpZiAoIWJoKQorCQlnb3RvIGRvbmU7CisKKwkvKiBSZW1vdmUgaGVhZGVyIGZyb20gaXRzIHBhcmVudCBkaXJlY3RvcnkuICovCisJYWZmc19sb2NrX2RpcihvbGRfZGlyKTsKKwlyZXR2YWwgPSBhZmZzX3JlbW92ZV9oYXNoKG9sZF9kaXIsIGJoKTsKKwlhZmZzX3VubG9ja19kaXIob2xkX2Rpcik7CisJaWYgKHJldHZhbCkKKwkJZ290byBkb25lOworCisJLyogQW5kIGluc2VydCBpdCBpbnRvIHRoZSBuZXcgZGlyZWN0b3J5IHdpdGggdGhlIG5ldyBuYW1lLiAqLworCWFmZnNfY29weV9uYW1lKEFGRlNfVEFJTChzYiwgYmgpLT5uYW1lLCBuZXdfZGVudHJ5KTsKKwlhZmZzX2ZpeF9jaGVja3N1bShzYiwgYmgpOworCWFmZnNfbG9ja19kaXIobmV3X2Rpcik7CisJcmV0dmFsID0gYWZmc19pbnNlcnRfaGFzaChuZXdfZGlyLCBiaCk7CisJYWZmc191bmxvY2tfZGlyKG5ld19kaXIpOworCS8qIFRPRE86IG1vdmUgaXQgYmFjayB0byBvbGRfZGlyLCBpZiBlcnJvcj8gKi8KKworZG9uZToKKwltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShiaCwgcmV0dmFsID8gb2xkX2RpciA6IG5ld19kaXIpOworCWFmZnNfYnJlbHNlKGJoKTsKKwlyZXR1cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvZnMvYWZmcy9zdXBlci5jIGIvZnMvYWZmcy9zdXBlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMzA4MDcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZmZzL3N1cGVyLmMKQEAgLTAsMCArMSw1NjkgQEAKKy8qCisgKiAgbGludXgvZnMvYWZmcy9pbm9kZS5jCisgKgorICogIChjKSAxOTk2ICBIYW5zLUpvYWNoaW0gV2lkbWFpZXIgLSBSZXdyaXR0ZW4KKyAqCisgKiAgKEMpIDE5OTMgIFJheSBCdXJyIC0gTW9kaWZpZWQgZm9yIEFtaWdhIEZGUyBmaWxlc3lzdGVtLgorICoKKyAqICAoQykgMTk5MiAgRXJpYyBZb3VuZ2RhbGUgTW9kaWZpZWQgZm9yIElTTyA5NjYwIGZpbGVzeXN0ZW0uCisgKgorICogIChDKSAxOTkxICBMaW51cyBUb3J2YWxkcyAtIG1pbml4IGZpbGVzeXN0ZW0KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXRmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgorI2luY2x1ZGUgImFmZnMuaCIKKworZXh0ZXJuIHN0cnVjdCB0aW1lem9uZSBzeXNfdHo7CisKK3N0YXRpYyBpbnQgYWZmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1Zik7CitzdGF0aWMgaW50IGFmZnNfcmVtb3VudCAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50ICpmbGFncywgY2hhciAqZGF0YSk7CisKK3N0YXRpYyB2b2lkCithZmZzX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBhZmZzX3NiX2luZm8gKnNiaSA9IEFGRlNfU0Ioc2IpOworCXByX2RlYnVnKCJBRkZTOiBwdXRfc3VwZXIoKVxuIik7CisKKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJQUZGU19ST09UX1RBSUwoc2IsIHNiaS0+c19yb290X2JoKS0+Ym1fZmxhZyA9IGNwdV90b19iZTMyKDEpOworCQlzZWNzX3RvX2RhdGVzdGFtcChnZXRfc2Vjb25kcygpLAorCQkJCSAgJkFGRlNfUk9PVF9UQUlMKHNiLCBzYmktPnNfcm9vdF9iaCktPmRpc2tfY2hhbmdlKTsKKwkJYWZmc19maXhfY2hlY2tzdW0oc2IsIHNiaS0+c19yb290X2JoKTsKKwkJbWFya19idWZmZXJfZGlydHkoc2JpLT5zX3Jvb3RfYmgpOworCX0KKworCWlmIChzYmktPnNfcHJlZml4KQorCQlrZnJlZShzYmktPnNfcHJlZml4KTsKKwlhZmZzX2ZyZWVfYml0bWFwKHNiKTsKKwlhZmZzX2JyZWxzZShzYmktPnNfcm9vdF9iaCk7CisJa2ZyZWUoc2JpKTsKKwlzYi0+c19mc19pbmZvID0gTlVMTDsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCithZmZzX3dyaXRlX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJaW50IGNsZWFuID0gMjsKKwlzdHJ1Y3QgYWZmc19zYl9pbmZvICpzYmkgPSBBRkZTX1NCKHNiKTsKKworCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQkvLwlpZiAoc2JpLT5zX2JpdG1hcFtpXS5ibV9iaCkgeworCQkvLwkJaWYgKGJ1ZmZlcl9kaXJ0eShzYmktPnNfYml0bWFwW2ldLmJtX2JoKSkgeworCQkvLwkJCWNsZWFuID0gMDsKKwkJQUZGU19ST09UX1RBSUwoc2IsIHNiaS0+c19yb290X2JoKS0+Ym1fZmxhZyA9IGNwdV90b19iZTMyKGNsZWFuKTsKKwkJc2Vjc190b19kYXRlc3RhbXAoZ2V0X3NlY29uZHMoKSwKKwkJCQkgICZBRkZTX1JPT1RfVEFJTChzYiwgc2JpLT5zX3Jvb3RfYmgpLT5kaXNrX2NoYW5nZSk7CisJCWFmZnNfZml4X2NoZWNrc3VtKHNiLCBzYmktPnNfcm9vdF9iaCk7CisJCW1hcmtfYnVmZmVyX2RpcnR5KHNiaS0+c19yb290X2JoKTsKKwkJc2ItPnNfZGlydCA9ICFjbGVhbjsJLyogcmVkbyB1bnRpbCBiaXRtYXAgc3luY2VkICovCisJfSBlbHNlCisJCXNiLT5zX2RpcnQgPSAwOworCisJcHJfZGVidWcoIkFGRlM6IHdyaXRlX3N1cGVyKCkgYXQgJWx1LCBjbGVhbj0lZFxuIiwgZ2V0X3NlY29uZHMoKSwgY2xlYW4pOworfQorCitzdGF0aWMga21lbV9jYWNoZV90ICogYWZmc19pbm9kZV9jYWNoZXA7CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmFmZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgYWZmc19pbm9kZV9pbmZvICplaTsKKwllaSA9IChzdHJ1Y3QgYWZmc19pbm9kZV9pbmZvICopa21lbV9jYWNoZV9hbGxvYyhhZmZzX2lub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCWlmICghZWkpCisJCXJldHVybiBOVUxMOworCWVpLT52ZnNfaW5vZGUuaV92ZXJzaW9uID0gMTsKKwlyZXR1cm4gJmVpLT52ZnNfaW5vZGU7Cit9CisKK3N0YXRpYyB2b2lkIGFmZnNfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWttZW1fY2FjaGVfZnJlZShhZmZzX2lub2RlX2NhY2hlcCwgQUZGU19JKGlub2RlKSk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICogZm9vLCBrbWVtX2NhY2hlX3QgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IGFmZnNfaW5vZGVfaW5mbyAqZWkgPSAoc3RydWN0IGFmZnNfaW5vZGVfaW5mbyAqKSBmb287CisKKwlpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRll8U0xBQl9DVE9SX0NPTlNUUlVDVE9SKSkgPT0KKwkgICAgU0xBQl9DVE9SX0NPTlNUUlVDVE9SKSB7CisJCWluaXRfTVVURVgoJmVpLT5pX2xpbmtfbG9jayk7CisJCWluaXRfTVVURVgoJmVpLT5pX2V4dF9sb2NrKTsKKwkJaW5vZGVfaW5pdF9vbmNlKCZlaS0+dmZzX2lub2RlKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9pbm9kZWNhY2hlKHZvaWQpCit7CisJYWZmc19pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiYWZmc19pbm9kZV9jYWNoZSIsCisJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBhZmZzX2lub2RlX2luZm8pLAorCQkJCQkgICAgIDAsIFNMQUJfUkVDTEFJTV9BQ0NPVU5ULAorCQkJCQkgICAgIGluaXRfb25jZSwgTlVMTCk7CisJaWYgKGFmZnNfaW5vZGVfY2FjaGVwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X2lub2RlY2FjaGUodm9pZCkKK3sKKwlpZiAoa21lbV9jYWNoZV9kZXN0cm95KGFmZnNfaW5vZGVfY2FjaGVwKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYWZmc19pbm9kZV9jYWNoZTogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgYWZmc19zb3BzID0geworCS5hbGxvY19pbm9kZQk9IGFmZnNfYWxsb2NfaW5vZGUsCisJLmRlc3Ryb3lfaW5vZGUJPSBhZmZzX2Rlc3Ryb3lfaW5vZGUsCisJLnJlYWRfaW5vZGUJPSBhZmZzX3JlYWRfaW5vZGUsCisJLndyaXRlX2lub2RlCT0gYWZmc193cml0ZV9pbm9kZSwKKwkucHV0X2lub2RlCT0gYWZmc19wdXRfaW5vZGUsCisJLmRlbGV0ZV9pbm9kZQk9IGFmZnNfZGVsZXRlX2lub2RlLAorCS5jbGVhcl9pbm9kZQk9IGFmZnNfY2xlYXJfaW5vZGUsCisJLnB1dF9zdXBlcgk9IGFmZnNfcHV0X3N1cGVyLAorCS53cml0ZV9zdXBlcgk9IGFmZnNfd3JpdGVfc3VwZXIsCisJLnN0YXRmcwkJPSBhZmZzX3N0YXRmcywKKwkucmVtb3VudF9mcwk9IGFmZnNfcmVtb3VudCwKK307CisKK2VudW0geworCU9wdF9icywgT3B0X21vZGUsIE9wdF9tdWZzLCBPcHRfcHJlZml4LCBPcHRfcHJvdGVjdCwKKwlPcHRfcmVzZXJ2ZWQsIE9wdF9yb290LCBPcHRfc2V0Z2lkLCBPcHRfc2V0dWlkLAorCU9wdF92ZXJib3NlLCBPcHRfdm9sdW1lLCBPcHRfaWdub3JlLCBPcHRfZXJyLAorfTsKKworc3RhdGljIG1hdGNoX3RhYmxlX3QgdG9rZW5zID0geworCXtPcHRfYnMsICJicz0ldSJ9LAorCXtPcHRfbW9kZSwgIm1vZGU9JW8ifSwKKwl7T3B0X211ZnMsICJtdWZzIn0sCisJe09wdF9wcmVmaXgsICJwcmVmaXg9JXMifSwKKwl7T3B0X3Byb3RlY3QsICJwcm90ZWN0In0sCisJe09wdF9yZXNlcnZlZCwgInJlc2VydmVkPSV1In0sCisJe09wdF9yb290LCAicm9vdD0ldSJ9LAorCXtPcHRfc2V0Z2lkLCAic2V0Z2lkPSV1In0sCisJe09wdF9zZXR1aWQsICJzZXR1aWQ9JXUifSwKKwl7T3B0X3ZlcmJvc2UsICJ2ZXJib3NlIn0sCisJe09wdF92b2x1bWUsICJ2b2x1bWU9JXMifSwKKwl7T3B0X2lnbm9yZSwgImdycHF1b3RhIn0sCisJe09wdF9pZ25vcmUsICJub3F1b3RhIn0sCisJe09wdF9pZ25vcmUsICJxdW90YSJ9LAorCXtPcHRfaWdub3JlLCAidXNycXVvdGEifSwKKwl7T3B0X2VyciwgTlVMTH0sCit9OworCitzdGF0aWMgaW50CitwYXJzZV9vcHRpb25zKGNoYXIgKm9wdGlvbnMsIHVpZF90ICp1aWQsIGdpZF90ICpnaWQsIGludCAqbW9kZSwgaW50ICpyZXNlcnZlZCwgczMyICpyb290LAorCQlpbnQgKmJsb2Nrc2l6ZSwgY2hhciAqKnByZWZpeCwgY2hhciAqdm9sdW1lLCB1bnNpZ25lZCBsb25nICptb3VudF9vcHRzKQoreworCWNoYXIgKnA7CisJc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOworCisJLyogRmlsbCBpbiBkZWZhdWx0cyAqLworCisJKnVpZCAgICAgICAgPSBjdXJyZW50LT51aWQ7CisJKmdpZCAgICAgICAgPSBjdXJyZW50LT5naWQ7CisJKnJlc2VydmVkICAgPSAyOworCSpyb290ICAgICAgID0gLTE7CisJKmJsb2Nrc2l6ZSAgPSAtMTsKKwl2b2x1bWVbMF0gICA9ICc6JzsKKwl2b2x1bWVbMV0gICA9IDA7CisJKm1vdW50X29wdHMgPSAwOworCWlmICghb3B0aW9ucykKKwkJcmV0dXJuIDE7CisKKwl3aGlsZSAoKHAgPSBzdHJzZXAoJm9wdGlvbnMsICIsIikpICE9IE5VTEwpIHsKKwkJaW50IHRva2VuLCBuLCBvcHRpb247CisJCWlmICghKnApCisJCQljb250aW51ZTsKKworCQl0b2tlbiA9IG1hdGNoX3Rva2VuKHAsIHRva2VucywgYXJncyk7CisJCXN3aXRjaCAodG9rZW4pIHsKKwkJY2FzZSBPcHRfYnM6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmbikpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAobiAhPSA1MTIgJiYgbiAhPSAxMDI0ICYmIG4gIT0gMjA0OAorCQkJICAgICYmIG4gIT0gNDA5NikgeworCQkJCXByaW50ayAoIkFGRlM6IEludmFsaWQgYmxvY2tzaXplICg1MTIsIDEwMjQsIDIwNDgsIDQwOTYgYWxsb3dlZClcbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJKmJsb2Nrc2l6ZSA9IG47CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbW9kZToKKwkJCWlmIChtYXRjaF9vY3RhbCgmYXJnc1swXSwgJm9wdGlvbikpCisJCQkJcmV0dXJuIDE7CisJCQkqbW9kZSA9IG9wdGlvbiAmIDA3Nzc7CisJCQkqbW91bnRfb3B0cyB8PSBTRl9TRVRNT0RFOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X211ZnM6CisJCQkqbW91bnRfb3B0cyB8PSBTRl9NVUZTOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3ByZWZpeDoKKwkJCWlmICgqcHJlZml4KSB7CQkvKiBGcmVlIGFueSBwcmV2aW91cyBwcmVmaXggKi8KKwkJCQlrZnJlZSgqcHJlZml4KTsKKwkJCQkqcHJlZml4ID0gTlVMTDsKKwkJCX0KKwkJCSpwcmVmaXggPSBtYXRjaF9zdHJkdXAoJmFyZ3NbMF0pOworCQkJaWYgKCEqcHJlZml4KQorCQkJCXJldHVybiAwOworCQkJKm1vdW50X29wdHMgfD0gU0ZfUFJFRklYOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3Byb3RlY3Q6CisJCQkqbW91bnRfb3B0cyB8PSBTRl9JTU1VVEFCTEU7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfcmVzZXJ2ZWQ6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCByZXNlcnZlZCkpCisJCQkJcmV0dXJuIDE7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfcm9vdDoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sIHJvb3QpKQorCQkJCXJldHVybiAxOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3NldGdpZDoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAxOworCQkJKmdpZCA9IG9wdGlvbjsKKwkJCSptb3VudF9vcHRzIHw9IFNGX1NFVEdJRDsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9zZXR1aWQ6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCSp1aWQgPSBvcHRpb247CisJCQkqbW91bnRfb3B0cyB8PSBTRl9TRVRVSUQ7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfdmVyYm9zZToKKwkJCSptb3VudF9vcHRzIHw9IFNGX1ZFUkJPU0U7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfdm9sdW1lOiB7CisJCQljaGFyICp2b2wgPSBtYXRjaF9zdHJkdXAoJmFyZ3NbMF0pOworCQkJc3RybGNweSh2b2x1bWUsIHZvbCwgMzIpOworCQkJa2ZyZWUodm9sKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgT3B0X2lnbm9yZToKKwkJIAkvKiBTaWxlbnRseSBpZ25vcmUgdGhlIHF1b3RhIG9wdGlvbnMgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKCJBRkZTOiBVbnJlY29nbml6ZWQgbW91bnQgb3B0aW9uIFwiJXNcIiAiCisJCQkJCSJvciBtaXNzaW5nIHZhbHVlXG4iLCBwKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAxOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIGRlZmluaXRlbHkgbmVlZHMgdG8gYmUgc3BsaXQgdXAuIFNvbWUgZmluZSBkYXkgSSdsbAorICogaG9wZWZ1bGx5IGhhdmUgdGhlIGd1dHMgdG8gZG8gc28uIFVudGlsIHRoZW46IHNvcnJ5IGZvciB0aGUgbWVzcy4KKyAqLworCitzdGF0aWMgaW50IGFmZnNfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQoreworCXN0cnVjdCBhZmZzX3NiX2luZm8JKnNiaTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJKnJvb3RfYmggPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZAkqYm9vdF9iaDsKKwlzdHJ1Y3QgaW5vZGUJCSpyb290X2lub2RlID0gTlVMTDsKKwlzMzIJCQkgcm9vdF9ibG9jazsKKwlpbnQJCQkgc2l6ZSwgYmxvY2tzaXplOworCXUzMgkJCSBjaGtzdW07CisJaW50CQkJIG51bV9ibTsKKwlpbnQJCQkgaSwgajsKKwlzMzIJCQkga2V5OworCXVpZF90CQkJIHVpZDsKKwlnaWRfdAkJCSBnaWQ7CisJaW50CQkJIHJlc2VydmVkOworCXVuc2lnbmVkIGxvbmcJCSBtb3VudF9mbGFnczsKKwlpbnQJCQkgdG1wX2ZsYWdzOwkvKiBmaXggcmVtb3VudCBwcm90b3R5cGUuLi4gKi8KKworCXByX2RlYnVnKCJBRkZTOiByZWFkX3N1cGVyKCVzKVxuIixkYXRhID8gKGNvbnN0IGNoYXIgKilkYXRhIDogIm5vIG9wdGlvbnMiKTsKKworCXNiLT5zX21hZ2ljICAgICAgICAgICAgID0gQUZGU19TVVBFUl9NQUdJQzsKKwlzYi0+c19vcCAgICAgICAgICAgICAgICA9ICZhZmZzX3NvcHM7CisJc2ItPnNfZmxhZ3MgfD0gTVNfTk9ESVJBVElNRTsKKworCXNiaSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhZmZzX3NiX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNiaSkKKwkJcmV0dXJuIC1FTk9NRU07CisJc2ItPnNfZnNfaW5mbyA9IHNiaTsKKwltZW1zZXQoc2JpLCAwLCBzaXplb2YoKnNiaSkpOworCWluaXRfTVVURVgoJnNiaS0+c19ibWxvY2spOworCisJaWYgKCFwYXJzZV9vcHRpb25zKGRhdGEsJnVpZCwmZ2lkLCZpLCZyZXNlcnZlZCwmcm9vdF9ibG9jaywKKwkJCQkmYmxvY2tzaXplLCZzYmktPnNfcHJlZml4LAorCQkJCXNiaS0+c192b2x1bWUsICZtb3VudF9mbGFncykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJBRkZTOiBFcnJvciBwYXJzaW5nIG9wdGlvbnNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJLyogTi5CLiBhZnRlciB0aGlzIHBvaW50IHNfcHJlZml4IG11c3QgYmUgcmVsZWFzZWQgKi8KKworCXNiaS0+c19mbGFncyAgID0gbW91bnRfZmxhZ3M7CisJc2JpLT5zX21vZGUgICAgPSBpOworCXNiaS0+c191aWQgICAgID0gdWlkOworCXNiaS0+c19naWQgICAgID0gZ2lkOworCXNiaS0+c19yZXNlcnZlZD0gcmVzZXJ2ZWQ7CisKKwkvKiBHZXQgdGhlIHNpemUgb2YgdGhlIGRldmljZSBpbiA1MTItYnl0ZSBibG9ja3MuCisJICogSWYgd2UgbGF0ZXIgc2VlIHRoYXQgdGhlIHBhcnRpdGlvbiB1c2VzIGJpZ2dlcgorCSAqIGJsb2Nrcywgd2Ugd2lsbCBoYXZlIHRvIGNoYW5nZSBpdC4KKwkgKi8KKworCXNpemUgPSBzYi0+c19iZGV2LT5iZF9pbm9kZS0+aV9zaXplID4+IDk7CisJcHJfZGVidWcoIkFGRlM6IGluaXRpYWwgYmxvY2tzaXplPSVkLCAjYmxvY2tzPSVkXG4iLCA1MTIsIHNpemUpOworCisJYWZmc19zZXRfYmxvY2tzaXplKHNiLCBQQUdFX1NJWkUpOworCS8qIFRyeSB0byBmaW5kIHJvb3QgYmxvY2suIEl0cyBsb2NhdGlvbiBkZXBlbmRzIG9uIHRoZSBibG9jayBzaXplLiAqLworCisJaSA9IDUxMjsKKwlqID0gNDA5NjsKKwlpZiAoYmxvY2tzaXplID4gMCkgeworCQlpID0gaiA9IGJsb2Nrc2l6ZTsKKwkJc2l6ZSA9IHNpemUgLyAoYmxvY2tzaXplIC8gNTEyKTsKKwl9CisJZm9yIChibG9ja3NpemUgPSBpLCBrZXkgPSAwOyBibG9ja3NpemUgPD0gajsgYmxvY2tzaXplIDw8PSAxLCBzaXplID4+PSAxKSB7CisJCXNiaS0+c19yb290X2Jsb2NrID0gcm9vdF9ibG9jazsKKwkJaWYgKHJvb3RfYmxvY2sgPCAwKQorCQkJc2JpLT5zX3Jvb3RfYmxvY2sgPSAocmVzZXJ2ZWQgKyBzaXplIC0gMSkgLyAyOworCQlwcl9kZWJ1ZygiQUZGUzogc2V0dGluZyBibG9ja3NpemUgdG8gJWRcbiIsIGJsb2Nrc2l6ZSk7CisJCWFmZnNfc2V0X2Jsb2Nrc2l6ZShzYiwgYmxvY2tzaXplKTsKKwkJc2JpLT5zX3BhcnRpdGlvbl9zaXplID0gc2l6ZTsKKworCQkvKiBUaGUgcm9vdCBibG9jayBsb2NhdGlvbiB0aGF0IHdhcyBjYWxjdWxhdGVkIGFib3ZlIGlzIG5vdAorCQkgKiBjb3JyZWN0IGlmIHRoZSBwYXJ0aXRpb24gc2l6ZSBpcyBhbiBvZGQgbnVtYmVyIG9mIDUxMi0KKwkJICogYnl0ZSBibG9ja3MsIHdoaWNoIHdpbGwgYmUgcm91bmRlZCBkb3duIHRvIGEgbnVtYmVyIG9mCisJCSAqIDEwMjQtYnl0ZSBibG9ja3MsIGFuZCBpZiB0aGVyZSB3ZXJlIGFuIGV2ZW4gbnVtYmVyIG9mCisJCSAqIHJlc2VydmVkIGJsb2Nrcy4gSWRlYWxseSwgYWxsIHBhcnRpdGlvbiBjaGVja2VycyBzaG91bGQKKwkJICogcmVwb3J0IHRoZSByZWFsIG51bWJlciBvZiBibG9ja3Mgb2YgdGhlIHJlYWwgYmxvY2tzaXplLAorCQkgKiBidXQgc2luY2UgdGhpcyBqdXN0IGNhbm5vdCBiZSBkb25lLCB3ZSBoYXZlIHRvIHRyeSB0bworCQkgKiBmaW5kIHRoZSByb290IGJsb2NrIGFueXdheXMuIEluIHRoZSBhYm92ZSBjYXNlLCBpdCBpcyBvbmUKKwkJICogYmxvY2sgYmVoaW5kIHRoZSBjYWxjdWxhdGVkIG9uZS4gU28gd2UgY2hlY2sgdGhpcyBvbmUsIHRvby4KKwkJICovCisJCWZvciAobnVtX2JtID0gMDsgbnVtX2JtIDwgMjsgbnVtX2JtKyspIHsKKwkJCXByX2RlYnVnKCJBRkZTOiBEZXYgJXMsIHRyeWluZyByb290PSV1LCBicz0lZCwgIgorCQkJCSJzaXplPSVkLCByZXNlcnZlZD0lZFxuIiwKKwkJCQlzYi0+c19pZCwKKwkJCQlzYmktPnNfcm9vdF9ibG9jayArIG51bV9ibSwKKwkJCQlibG9ja3NpemUsIHNpemUsIHJlc2VydmVkKTsKKwkJCXJvb3RfYmggPSBhZmZzX2JyZWFkKHNiLCBzYmktPnNfcm9vdF9ibG9jayArIG51bV9ibSk7CisJCQlpZiAoIXJvb3RfYmgpCisJCQkJY29udGludWU7CisJCQlpZiAoIWFmZnNfY2hlY2tzdW1fYmxvY2soc2IsIHJvb3RfYmgpICYmCisJCQkgICAgYmUzMl90b19jcHUoQUZGU19ST09UX0hFQUQocm9vdF9iaCktPnB0eXBlKSA9PSBUX1NIT1JUICYmCisJCQkgICAgYmUzMl90b19jcHUoQUZGU19ST09UX1RBSUwoc2IsIHJvb3RfYmgpLT5zdHlwZSkgPT0gU1RfUk9PVCkgeworCQkJCXNiaS0+c19oYXNoc2l6ZSAgICA9IGJsb2Nrc2l6ZSAvIDQgLSA1NjsKKwkJCQlzYmktPnNfcm9vdF9ibG9jayArPSBudW1fYm07CisJCQkJa2V5ICAgICAgICAgICAgICAgICAgICAgICAgPSAxOworCQkJCWdvdG8gZ290X3Jvb3Q7CisJCQl9CisJCQlhZmZzX2JyZWxzZShyb290X2JoKTsKKwkJCXJvb3RfYmggPSBOVUxMOworCQl9CisJfQorCWlmICghc2lsZW50KQorCQlwcmludGsoS0VSTl9FUlIgIkFGRlM6IE5vIHZhbGlkIHJvb3QgYmxvY2sgb24gZGV2aWNlICVzXG4iLAorCQkJc2ItPnNfaWQpOworCWdvdG8gb3V0X2Vycm9yOworCisJLyogTi5CLiBhZnRlciB0aGlzIHBvaW50IGJoIG11c3QgYmUgcmVsZWFzZWQgKi8KK2dvdF9yb290OgorCXJvb3RfYmxvY2sgPSBzYmktPnNfcm9vdF9ibG9jazsKKworCS8qIEZpbmQgb3V0IHdoaWNoIGtpbmQgb2YgRlMgd2UgaGF2ZSAqLworCWJvb3RfYmggPSBzYl9icmVhZChzYiwgMCk7CisJaWYgKCFib290X2JoKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQUZGUzogQ2Fubm90IHJlYWQgYm9vdCBibG9ja1xuIik7CisJCWdvdG8gb3V0X2Vycm9yOworCX0KKwljaGtzdW0gPSBiZTMyX3RvX2NwdSgqKF9fYmUzMiAqKWJvb3RfYmgtPmJfZGF0YSk7CisJYnJlbHNlKGJvb3RfYmgpOworCisJLyogRGlyY2FjaGUgZmlsZXN5c3RlbXMgYXJlIGNvbXBhdGlibGUgd2l0aCBub24tZGlyY2FjaGUgb25lcworCSAqIHdoZW4gcmVhZGluZy4gQXMgbG9uZyBhcyB0aGV5IGFyZW4ndCBzdXBwb3J0ZWQsIHdyaXRpbmcgaXMKKwkgKiBub3QgcmVjb21tZW5kZWQuCisJICovCisJaWYgKChjaGtzdW0gPT0gRlNfRENGRlMgfHwgY2hrc3VtID09IE1VRlNfRENGRlMgfHwgY2hrc3VtID09IEZTX0RDT0ZTCisJICAgICB8fCBjaGtzdW0gPT0gTVVGU19EQ09GUykgJiYgIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJBRkZTOiBEaXJjYWNoZSBGUyAtIG1vdW50aW5nICVzIHJlYWQgb25seVxuIiwKKwkJCXNiLT5zX2lkKTsKKwkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCX0KKwlzd2l0Y2ggKGNoa3N1bSkgeworCQljYXNlIE1VRlNfRlM6CisJCWNhc2UgTVVGU19JTlRMRkZTOgorCQljYXNlIE1VRlNfRENGRlM6CisJCQlzYmktPnNfZmxhZ3MgfD0gU0ZfTVVGUzsKKwkJCS8qIGZhbGwgdGhydSAqLworCQljYXNlIEZTX0lOVExGRlM6CisJCWNhc2UgRlNfRENGRlM6CisJCQlzYmktPnNfZmxhZ3MgfD0gU0ZfSU5UTDsKKwkJCWJyZWFrOworCQljYXNlIE1VRlNfRkZTOgorCQkJc2JpLT5zX2ZsYWdzIHw9IFNGX01VRlM7CisJCQlicmVhazsKKwkJY2FzZSBGU19GRlM6CisJCQlicmVhazsKKwkJY2FzZSBNVUZTX09GUzoKKwkJCXNiaS0+c19mbGFncyB8PSBTRl9NVUZTOworCQkJLyogZmFsbCB0aHJ1ICovCisJCWNhc2UgRlNfT0ZTOgorCQkJc2JpLT5zX2ZsYWdzIHw9IFNGX09GUzsKKwkJCXNiLT5zX2ZsYWdzIHw9IE1TX05PRVhFQzsKKwkJCWJyZWFrOworCQljYXNlIE1VRlNfRENPRlM6CisJCWNhc2UgTVVGU19JTlRMT0ZTOgorCQkJc2JpLT5zX2ZsYWdzIHw9IFNGX01VRlM7CisJCWNhc2UgRlNfRENPRlM6CisJCWNhc2UgRlNfSU5UTE9GUzoKKwkJCXNiaS0+c19mbGFncyB8PSBTRl9JTlRMIHwgU0ZfT0ZTOworCQkJc2ItPnNfZmxhZ3MgfD0gTVNfTk9FWEVDOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgIkFGRlM6IFVua25vd24gZmlsZXN5c3RlbSBvbiBkZXZpY2UgJXM6ICUwOFhcbiIsCisJCQkJc2ItPnNfaWQsIGNoa3N1bSk7CisJCQlnb3RvIG91dF9lcnJvcjsKKwl9CisKKwlpZiAobW91bnRfZmxhZ3MgJiBTRl9WRVJCT1NFKSB7CisJCWNoa3N1bSA9IGNwdV90b19iZTMyKGNoa3N1bSk7CisJCXByaW50ayhLRVJOX05PVElDRSAiQUZGUzogTW91bnRpbmcgdm9sdW1lIFwiJSpzXCI6IFR5cGU9JS4zc1xcJWMsIEJsb2Nrc2l6ZT0lZFxuIiwKKwkJCUFGRlNfUk9PVF9UQUlMKHNiLCByb290X2JoKS0+ZGlza19uYW1lWzBdLAorCQkJQUZGU19ST09UX1RBSUwoc2IsIHJvb3RfYmgpLT5kaXNrX25hbWUgKyAxLAorCQkJKGNoYXIgKikmY2hrc3VtLCgoY2hhciAqKSZjaGtzdW0pWzNdICsgJzAnLGJsb2Nrc2l6ZSk7CisJfQorCisJc2ItPnNfZmxhZ3MgfD0gTVNfTk9ERVYgfCBNU19OT1NVSUQ7CisKKwlzYmktPnNfZGF0YV9ibGtzaXplID0gc2ItPnNfYmxvY2tzaXplOworCWlmIChzYmktPnNfZmxhZ3MgJiBTRl9PRlMpCisJCXNiaS0+c19kYXRhX2Jsa3NpemUgLT0gMjQ7CisKKwkvKiBLZWVwIHN1cGVyIGJsb2NrIGluIGNhY2hlICovCisJc2JpLT5zX3Jvb3RfYmggPSByb290X2JoOworCS8qIE4uQi4gYWZ0ZXIgdGhpcyBwb2ludCBzX3Jvb3RfYmggbXVzdCBiZSByZWxlYXNlZCAqLworCisJdG1wX2ZsYWdzID0gc2ItPnNfZmxhZ3M7CisJaWYgKGFmZnNfaW5pdF9iaXRtYXAoc2IsICZ0bXBfZmxhZ3MpKQorCQlnb3RvIG91dF9lcnJvcjsKKwlzYi0+c19mbGFncyA9IHRtcF9mbGFnczsKKworCS8qIHNldCB1cCBlbm91Z2ggc28gdGhhdCBpdCBjYW4gcmVhZCBhbiBpbm9kZSAqLworCisJcm9vdF9pbm9kZSA9IGlnZXQoc2IsIHJvb3RfYmxvY2spOworCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdF9pbm9kZSk7CisJaWYgKCFzYi0+c19yb290KSB7CisJCXByaW50ayhLRVJOX0VSUiAiQUZGUzogR2V0IHJvb3QgaW5vZGUgZmFpbGVkXG4iKTsKKwkJZ290byBvdXRfZXJyb3I7CisJfQorCXNiLT5zX3Jvb3QtPmRfb3AgPSAmYWZmc19kZW50cnlfb3BlcmF0aW9uczsKKworCXByX2RlYnVnKCJBRkZTOiBzX2ZsYWdzPSVsWFxuIixzYi0+c19mbGFncyk7CisJcmV0dXJuIDA7CisKKwkvKgorCSAqIEJlZ2luIHRoZSBjYXNjYWRlZCBjbGVhbnVwIC4uLgorCSAqLworb3V0X2Vycm9yOgorCWlmIChyb290X2lub2RlKQorCQlpcHV0KHJvb3RfaW5vZGUpOworCWlmIChzYmktPnNfYml0bWFwKQorCQlrZnJlZShzYmktPnNfYml0bWFwKTsKKwlhZmZzX2JyZWxzZShyb290X2JoKTsKKwlpZiAoc2JpLT5zX3ByZWZpeCkKKwkJa2ZyZWUoc2JpLT5zX3ByZWZpeCk7CisJa2ZyZWUoc2JpKTsKKwlzYi0+c19mc19pbmZvID0gTlVMTDsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludAorYWZmc19yZW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpCit7CisJc3RydWN0IGFmZnNfc2JfaW5mbwkqc2JpID0gQUZGU19TQihzYik7CisJaW50CQkJIGJsb2Nrc2l6ZTsKKwl1aWRfdAkJCSB1aWQ7CisJZ2lkX3QJCQkgZ2lkOworCWludAkJCSBtb2RlOworCWludAkJCSByZXNlcnZlZDsKKwlpbnQJCQkgcm9vdF9ibG9jazsKKwl1bnNpZ25lZCBsb25nCQkgbW91bnRfZmxhZ3M7CisJaW50CQkJIHJlcyA9IDA7CisKKwlwcl9kZWJ1ZygiQUZGUzogcmVtb3VudChmbGFncz0weCV4LG9wdHM9XCIlc1wiKVxuIiwqZmxhZ3MsZGF0YSk7CisKKwkqZmxhZ3MgfD0gTVNfTk9ESVJBVElNRTsKKworCWlmICghcGFyc2Vfb3B0aW9ucyhkYXRhLCZ1aWQsJmdpZCwmbW9kZSwmcmVzZXJ2ZWQsJnJvb3RfYmxvY2ssCisJICAgICZibG9ja3NpemUsJnNiaS0+c19wcmVmaXgsc2JpLT5zX3ZvbHVtZSwmbW91bnRfZmxhZ3MpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzYmktPnNfZmxhZ3MgPSBtb3VudF9mbGFnczsKKwlzYmktPnNfbW9kZSAgPSBtb2RlOworCXNiaS0+c191aWQgICA9IHVpZDsKKwlzYmktPnNfZ2lkICAgPSBnaWQ7CisKKwlpZiAoKCpmbGFncyAmIE1TX1JET05MWSkgPT0gKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkKKwkJcmV0dXJuIDA7CisJaWYgKCpmbGFncyAmIE1TX1JET05MWSkgeworCQlzYi0+c19kaXJ0ID0gMTsKKwkJd2hpbGUgKHNiLT5zX2RpcnQpCisJCQlhZmZzX3dyaXRlX3N1cGVyKHNiKTsKKwkJYWZmc19mcmVlX2JpdG1hcChzYik7CisJfSBlbHNlCisJCXJlcyA9IGFmZnNfaW5pdF9iaXRtYXAoc2IsIGZsYWdzKTsKKworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQKK2FmZnNfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICpidWYpCit7CisJaW50CQkgZnJlZTsKKworCXByX2RlYnVnKCJBRkZTOiBzdGF0ZnMoKSBwYXJ0c2l6ZT0lZCwgcmVzZXJ2ZWQ9JWRcbiIsQUZGU19TQihzYiktPnNfcGFydGl0aW9uX3NpemUsCisJICAgICBBRkZTX1NCKHNiKS0+c19yZXNlcnZlZCk7CisKKwlmcmVlICAgICAgICAgID0gYWZmc19jb3VudF9mcmVlX2Jsb2NrcyhzYik7CisJYnVmLT5mX3R5cGUgICAgPSBBRkZTX1NVUEVSX01BR0lDOworCWJ1Zi0+Zl9ic2l6ZSAgID0gc2ItPnNfYmxvY2tzaXplOworCWJ1Zi0+Zl9ibG9ja3MgID0gQUZGU19TQihzYiktPnNfcGFydGl0aW9uX3NpemUgLSBBRkZTX1NCKHNiKS0+c19yZXNlcnZlZDsKKwlidWYtPmZfYmZyZWUgICA9IGZyZWU7CisJYnVmLT5mX2JhdmFpbCAgPSBmcmVlOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICphZmZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoreworCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIGFmZnNfZmlsbF9zdXBlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBhZmZzX2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJhZmZzIiwKKwkuZ2V0X3NiCQk9IGFmZnNfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9ibG9ja19zdXBlciwKKwkuZnNfZmxhZ3MJPSBGU19SRVFVSVJFU19ERVYsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2FmZnNfZnModm9pZCkKK3sKKwlpbnQgZXJyID0gaW5pdF9pbm9kZWNhY2hlKCk7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCWVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmFmZnNfZnNfdHlwZSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJcmV0dXJuIDA7CitvdXQ6CisJZGVzdHJveV9pbm9kZWNhY2hlKCk7CitvdXQxOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2FmZnNfZnModm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmFmZnNfZnNfdHlwZSk7CisJZGVzdHJveV9pbm9kZWNhY2hlKCk7Cit9CisKK01PRFVMRV9ERVNDUklQVElPTigiQW1pZ2EgZmlsZXN5c3RlbSBzdXBwb3J0IGZvciBMaW51eCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChpbml0X2FmZnNfZnMpCittb2R1bGVfZXhpdChleGl0X2FmZnNfZnMpCmRpZmYgLS1naXQgYS9mcy9hZmZzL3N5bWxpbmsuYyBiL2ZzL2FmZnMvc3ltbGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNmYwZjAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZmZzL3N5bWxpbmsuYwpAQCAtMCwwICsxLDc4IEBACisvKgorICogIGxpbnV4L2ZzL2FmZnMvc3ltbGluay5jCisgKgorICogIDE5OTUgIEhhbnMtSm9hY2hpbSBXaWRtYWllciAtIE1vZGlmaWVkIGZvciBhZmZzLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKgorICogIGFmZnMgc3ltbGluayBoYW5kbGluZyBjb2RlCisgKi8KKworI2luY2x1ZGUgImFmZnMuaCIKKworc3RhdGljIGludCBhZmZzX3N5bWxpbmtfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJY2hhciAqbGluayA9IGttYXAocGFnZSk7CisJc3RydWN0IHNsaW5rX2Zyb250ICpsZjsKKwlpbnQgZXJyOworCWludAkJCSBpLCBqOworCWNoYXIJCQkgYzsKKwljaGFyCQkJIGxjOworCWNoYXIJCQkqcGY7CisKKwlwcl9kZWJ1ZygiQUZGUzogZm9sbG93X2xpbmsoaW5vPSVsdSlcbiIsaW5vZGUtPmlfaW5vKTsKKworCWVyciA9IC1FSU87CisJYmggPSBhZmZzX2JyZWFkKGlub2RlLT5pX3NiLCBpbm9kZS0+aV9pbm8pOworCWlmICghYmgpCisJCWdvdG8gZmFpbDsKKwlpICA9IDA7CisJaiAgPSAwOworCWxmID0gKHN0cnVjdCBzbGlua19mcm9udCAqKWJoLT5iX2RhdGE7CisJbGMgPSAwOworCXBmID0gQUZGU19TQihpbm9kZS0+aV9zYiktPnNfcHJlZml4ID8gQUZGU19TQihpbm9kZS0+aV9zYiktPnNfcHJlZml4IDogIi8iOworCisJaWYgKHN0cmNocihsZi0+c3ltbmFtZSwnOicpKSB7CS8qIEhhbmRsZSBhc3NpZ24gb3Igdm9sdW1lIG5hbWUgKi8KKwkJd2hpbGUgKGkgPCAxMDIzICYmIChjID0gcGZbaV0pKQorCQkJbGlua1tpKytdID0gYzsKKwkJd2hpbGUgKGkgPCAxMDIzICYmIGxmLT5zeW1uYW1lW2pdICE9ICc6JykKKwkJCWxpbmtbaSsrXSA9IGxmLT5zeW1uYW1lW2orK107CisJCWlmIChpIDwgMTAyMykKKwkJCWxpbmtbaSsrXSA9ICcvJzsKKwkJaisrOworCQlsYyA9ICcvJzsKKwl9CisJd2hpbGUgKGkgPCAxMDIzICYmIChjID0gbGYtPnN5bW5hbWVbal0pKSB7CisJCWlmIChjID09ICcvJyAmJiBsYyA9PSAnLycgJiYgaSA8IDEwMjApIHsJLyogcGFyZW50IGRpciAqLworCQkJbGlua1tpKytdID0gJy4nOworCQkJbGlua1tpKytdID0gJy4nOworCQl9CisJCWxpbmtbaSsrXSA9IGM7CisJCWxjID0gYzsKKwkJaisrOworCX0KKwlsaW5rW2ldID0gJ1wwJzsKKwlhZmZzX2JyZWxzZShiaCk7CisJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCWt1bm1hcChwYWdlKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXR1cm4gMDsKK2ZhaWw6CisJU2V0UGFnZUVycm9yKHBhZ2UpOworCWt1bm1hcChwYWdlKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXR1cm4gZXJyOworfQorCitzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGFmZnNfc3ltbGlua19hb3BzID0geworCS5yZWFkcGFnZQk9IGFmZnNfc3ltbGlua19yZWFkcGFnZSwKK307CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGFmZnNfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zID0geworCS5yZWFkbGluawk9IGdlbmVyaWNfcmVhZGxpbmssCisJLmZvbGxvd19saW5rCT0gcGFnZV9mb2xsb3dfbGlua19saWdodCwKKwkucHV0X2xpbmsJPSBwYWdlX3B1dF9saW5rLAorCS5zZXRhdHRyCT0gYWZmc19ub3RpZnlfY2hhbmdlLAorfTsKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9NYWtlZmlsZSBiL2ZzL2Fmcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDI5YzlkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL01ha2VmaWxlCkBAIC0wLDAgKzEsMjggQEAKKyMKKyMgTWFrZWZpbGUgZm9yIFJlZCBIYXQgTGludXggQUZTIGNsaWVudC4KKyMKKworI0NGTEFHUyArPSAtZmluc3RydW1lbnQtZnVuY3Rpb25zCisKK2thZnMtb2JqcyA6PSBcCisJY2FsbGJhY2subyBcCisJY2VsbC5vIFwKKwljbXNlcnZpY2UubyBcCisJZGlyLm8gXAorCWZpbGUubyBcCisJZnNjbGllbnQubyBcCisJaW5vZGUubyBcCisJa2Fmc2FzeW5jZC5vIFwKKwlrYWZzdGltb2QubyBcCisJbWFpbi5vIFwKKwltaXNjLm8gXAorCW1udHB0Lm8gXAorCXByb2MubyBcCisJc2VydmVyLm8gXAorCXN1cGVyLm8gXAorCXZsY2xpZW50Lm8gXAorCXZsb2NhdGlvbi5vIFwKKwl2bm9kZS5vIFwKKwl2b2x1bWUubworCitvYmotJChDT05GSUdfQUZTX0ZTKSAgOj0ga2Fmcy5vCmRpZmYgLS1naXQgYS9mcy9hZnMvY2FjaGUuaCBiL2ZzL2Fmcy9jYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYjc3MjIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZnMvY2FjaGUuaApAQCAtMCwwICsxLDI3IEBACisvKiBjYWNoZS5oOiBBRlMgbG9jYWwgY2FjaGUgbWFuYWdlbWVudCBpbnRlcmZhY2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfTElOVVhfQUZTX0NBQ0hFX0gKKyNkZWZpbmUgX0xJTlVYX0FGU19DQUNIRV9ICisKKyN1bmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKKyNpbmNsdWRlIDxsaW51eC9jYWNoZWZzLmg+CisjZW5kaWYKKyNpbmNsdWRlICJ0eXBlcy5oIgorCisjaWZkZWYgX19LRVJORUxfXworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZW5kaWYgLyogX0xJTlVYX0FGU19DQUNIRV9IICovCmRpZmYgLS1naXQgYS9mcy9hZnMvY2FsbGJhY2suYyBiL2ZzL2Fmcy9jYWxsYmFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZDYyZjgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZnMvY2FsbGJhY2suYwpAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgZnJlZWx5IHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiBBdXRob3JzOiBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGNhbWJyaWRnZS5yZWRoYXQuY29tPgorICogICAgICAgICAgRGF2aWQgSG93ZWxscyA8ZGhvd2VsbHNAcmVkaGF0LmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlICJzZXJ2ZXIuaCIKKyNpbmNsdWRlICJ2bm9kZS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBhbGxvdyB0aGUgZmlsZXNlcnZlciB0byByZXF1ZXN0IGNhbGxiYWNrIHN0YXRlIChyZS0paW5pdGlhbGlzYXRpb24KKyAqLworaW50IFNSWEFGU0NNX0luaXRDYWxsQmFja1N0YXRlKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIpCit7CisJc3RydWN0IGxpc3RfaGVhZCBjYWxsYmFja3M7CisKKwlfZW50ZXIoIiVwIiwgc2VydmVyKTsKKworCUlOSVRfTElTVF9IRUFEKCZjYWxsYmFja3MpOworCisJLyogdHJhbnNmZXIgdGhlIGNhbGxiYWNrIGxpc3QgZnJvbSB0aGUgc2VydmVyIHRvIGEgdGVtcCBob2xkaW5nIGFyZWEgKi8KKwlzcGluX2xvY2soJnNlcnZlci0+Y2JfbG9jayk7CisKKwlsaXN0X2FkZCgmY2FsbGJhY2tzLCAmc2VydmVyLT5jYl9wcm9taXNlcyk7CisJbGlzdF9kZWxfaW5pdCgmc2VydmVyLT5jYl9wcm9taXNlcyk7CisKKwkvKiBtdW5jaCBvdXIgd2F5IHRocm91Z2ggdGhlIGxpc3QsIGdyYWJiaW5nIHRoZSBpbm9kZSwgZHJvcHBpbmcgYWxsIHRoZQorCSAqIGxvY2tzIGFuZCByZWdldHRpbmcgdGhlbSBpbiB0aGUgcmlnaHQgb3JkZXIKKwkgKi8KKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmNhbGxiYWNrcykpIHsKKwkJc3RydWN0IGFmc192bm9kZSAqdm5vZGU7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwkJdm5vZGUgPSBsaXN0X2VudHJ5KGNhbGxiYWNrcy5uZXh0LCBzdHJ1Y3QgYWZzX3Zub2RlLCBjYl9saW5rKTsKKwkJbGlzdF9kZWxfaW5pdCgmdm5vZGUtPmNiX2xpbmspOworCisJCS8qIHRyeSBhbmQgZ3JhYiB0aGUgaW5vZGUgLSBtYXkgZmFpbCAqLworCQlpbm9kZSA9IGlncmFiKEFGU19WTk9ERV9UT19JKHZub2RlKSk7CisJCWlmIChpbm9kZSkgeworCQkJaW50IHJlbGVhc2UgPSAwOworCisJCQlzcGluX3VubG9jaygmc2VydmVyLT5jYl9sb2NrKTsKKwkJCXNwaW5fbG9jaygmdm5vZGUtPmxvY2spOworCisJCQlpZiAodm5vZGUtPmNiX3NlcnZlciA9PSBzZXJ2ZXIpIHsKKwkJCQl2bm9kZS0+Y2Jfc2VydmVyID0gTlVMTDsKKwkJCQlhZnNfa2Fmc3RpbW9kX2RlbF90aW1lcigmdm5vZGUtPmNiX3RpbWVvdXQpOworCQkJCXNwaW5fbG9jaygmYWZzX2NiX2hhc2hfbG9jayk7CisJCQkJbGlzdF9kZWxfaW5pdCgmdm5vZGUtPmNiX2hhc2hfbGluayk7CisJCQkJc3Bpbl91bmxvY2soJmFmc19jYl9oYXNoX2xvY2spOworCQkJCXJlbGVhc2UgPSAxOworCQkJfQorCisJCQlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCisJCQlpcHV0KGlub2RlKTsKKwkJCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CisKKwkJCXNwaW5fbG9jaygmc2VydmVyLT5jYl9sb2NrKTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrKCZzZXJ2ZXItPmNiX2xvY2spOworCisJX2xlYXZlKCIgPSAwIik7CisJcmV0dXJuIDA7Cit9IC8qIGVuZCBTUlhBRlNDTV9Jbml0Q2FsbEJhY2tTdGF0ZSgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBhbGxvdyB0aGUgZmlsZXNlcnZlciB0byBicmVhayBjYWxsYmFjayBwcm9taXNlcworICovCitpbnQgU1JYQUZTQ01fQ2FsbEJhY2soc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwgc2l6ZV90IGNvdW50LAorCQkgICAgICBzdHJ1Y3QgYWZzX2NhbGxiYWNrIGNhbGxiYWNrc1tdKQoreworCV9lbnRlcigiJXAsJXUsIiwgc2VydmVyLCBjb3VudCk7CisKKwlmb3IgKDsgY291bnQgPiAwOyBjYWxsYmFja3MrKywgY291bnQtLSkgeworCQlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IE5VTEw7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOworCQlpbnQgdmFsaWQgPSAwOworCisJCV9kZWJ1ZygiLSBGaWQgeyB2bD0lMDh4IG49JXUgdT0ldSB9ICBDQiB7IHY9JXUgeD0ldSB0PSV1IH0iLAorCQkgICAgICAgY2FsbGJhY2tzLT5maWQudmlkLAorCQkgICAgICAgY2FsbGJhY2tzLT5maWQudm5vZGUsCisJCSAgICAgICBjYWxsYmFja3MtPmZpZC51bmlxdWUsCisJCSAgICAgICBjYWxsYmFja3MtPnZlcnNpb24sCisJCSAgICAgICBjYWxsYmFja3MtPmV4cGlyeSwKKwkJICAgICAgIGNhbGxiYWNrcy0+dHlwZQorCQkgICAgICAgKTsKKworCQkvKiBmaW5kIHRoZSBpbm9kZSBmb3IgdGhpcyBmaWQgKi8KKwkJc3Bpbl9sb2NrKCZhZnNfY2JfaGFzaF9sb2NrKTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZub2RlLAorCQkJCSAgICAmYWZzX2NiX2hhc2goc2VydmVyLCAmY2FsbGJhY2tzLT5maWQpLAorCQkJCSAgICBjYl9oYXNoX2xpbmspIHsKKwkJCWlmIChtZW1jbXAoJnZub2RlLT5maWQsICZjYWxsYmFja3MtPmZpZCwKKwkJCQkgICBzaXplb2Yoc3RydWN0IGFmc19maWQpKSAhPSAwKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiByaWdodCB2bm9kZSwgYnV0IGlzIGl0IHNhbWUgc2VydmVyPyAqLworCQkJaWYgKHZub2RlLT5jYl9zZXJ2ZXIgIT0gc2VydmVyKQorCQkJCWJyZWFrOyAvKiBubyAqLworCisJCQkvKiB0cnkgYW5kIG5haWwgdGhlIGlub2RlIGRvd24gKi8KKwkJCWlub2RlID0gaWdyYWIoQUZTX1ZOT0RFX1RPX0kodm5vZGUpKTsKKwkJCWJyZWFrOworCQl9CisKKwkJc3Bpbl91bmxvY2soJmFmc19jYl9oYXNoX2xvY2spOworCisJCWlmIChpbm9kZSkgeworCQkJLyogd2UndmUgZm91bmQgdGhlIHJlY29yZCBmb3IgdGhpcyB2bm9kZSAqLworCQkJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7CisJCQlpZiAodm5vZGUtPmNiX3NlcnZlciA9PSBzZXJ2ZXIpIHsKKwkJCQkvKiB0aGUgY2FsbGJhY2sgX2lzXyBvbiB0aGUgY2FsbGluZyBzZXJ2ZXIgKi8KKwkJCQl2bm9kZS0+Y2Jfc2VydmVyID0gTlVMTDsKKwkJCQl2YWxpZCA9IDE7CisKKwkJCQlhZnNfa2Fmc3RpbW9kX2RlbF90aW1lcigmdm5vZGUtPmNiX3RpbWVvdXQpOworCQkJCXZub2RlLT5mbGFncyB8PSBBRlNfVk5PREVfQ0hBTkdFRDsKKworCQkJCXNwaW5fbG9jaygmc2VydmVyLT5jYl9sb2NrKTsKKwkJCQlsaXN0X2RlbF9pbml0KCZ2bm9kZS0+Y2JfbGluayk7CisJCQkJc3Bpbl91bmxvY2soJnNlcnZlci0+Y2JfbG9jayk7CisKKwkJCQlzcGluX2xvY2soJmFmc19jYl9oYXNoX2xvY2spOworCQkJCWxpc3RfZGVsX2luaXQoJnZub2RlLT5jYl9oYXNoX2xpbmspOworCQkJCXNwaW5fdW5sb2NrKCZhZnNfY2JfaGFzaF9sb2NrKTsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisKKwkJCWlmICh2YWxpZCkgeworCQkJCWludmFsaWRhdGVfcmVtb3RlX2lub2RlKGlub2RlKTsKKwkJCQlhZnNfcHV0X3NlcnZlcihzZXJ2ZXIpOworCQkJfQorCQkJaXB1dChpbm9kZSk7CisJCX0KKwl9CisKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKK30gLyogZW5kIFNSWEFGU0NNX0NhbGxCYWNrKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGFsbG93IHRoZSBmaWxlc2VydmVyIHRvIHNlZSBpZiB0aGUgY2FjaGUgbWFuYWdlciBpcyBzdGlsbCBhbGl2ZQorICovCitpbnQgU1JYQUZTQ01fUHJvYmUoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcikKK3sKKwlfZGVidWcoIlNSWEFGU0NNX1Byb2JlKCVwKVxuIiwgc2VydmVyKTsKKwlyZXR1cm4gMDsKK30gLyogZW5kIFNSWEFGU0NNX1Byb2JlKCkgKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9jZWxsLmMgYi9mcy9hZnMvY2VsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwOWE5YWUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZnMvY2VsbC5jCkBAIC0wLDAgKzEsNTY5IEBACisvKiBjZWxsLmM6IEFGUyBjZWxsIGFuZCBzZXJ2ZXIgcmVjb3JkIG1hbmFnZW1lbnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPHJ4cnBjL3BlZXIuaD4KKyNpbmNsdWRlIDxyeHJwYy9jb25uZWN0aW9uLmg+CisjaW5jbHVkZSAidm9sdW1lLmgiCisjaW5jbHVkZSAiY2VsbC5oIgorI2luY2x1ZGUgInNlcnZlci5oIgorI2luY2x1ZGUgInRyYW5zcG9ydC5oIgorI2luY2x1ZGUgInZsY2xpZW50LmgiCisjaW5jbHVkZSAia2Fmc3RpbW9kLmgiCisjaW5jbHVkZSAic3VwZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitERUNMQVJFX1JXU0VNKGFmc19wcm9jX2NlbGxzX3NlbSk7CitMSVNUX0hFQUQoYWZzX3Byb2NfY2VsbHMpOworCitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBhZnNfY2VsbHMgPSBMSVNUX0hFQURfSU5JVChhZnNfY2VsbHMpOworc3RhdGljIERFRklORV9SV0xPQ0soYWZzX2NlbGxzX2xvY2spOworc3RhdGljIERFQ0xBUkVfUldTRU0oYWZzX2NlbGxzX3NlbSk7IC8qIGFkZC9yZW1vdmUgc2VyaWFsaXNhdGlvbiAqLworc3RhdGljIHN0cnVjdCBhZnNfY2VsbCAqYWZzX2NlbGxfcm9vdDsKKworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKK3N0YXRpYyBjYWNoZWZzX21hdGNoX3ZhbF90IGFmc19jZWxsX2NhY2hlX21hdGNoKHZvaWQgKnRhcmdldCwKKwkJCQkJCWNvbnN0IHZvaWQgKmVudHJ5KTsKK3N0YXRpYyB2b2lkIGFmc19jZWxsX2NhY2hlX3VwZGF0ZSh2b2lkICpzb3VyY2UsIHZvaWQgKmVudHJ5KTsKKworc3RydWN0IGNhY2hlZnNfaW5kZXhfZGVmIGFmc19jYWNoZV9jZWxsX2luZGV4X2RlZiA9IHsKKwkubmFtZQkJCT0gImNlbGxfaXgiLAorCS5kYXRhX3NpemUJCT0gc2l6ZW9mKHN0cnVjdCBhZnNfY2FjaGVfY2VsbCksCisJLmtleXNbMF0JCT0geyBDQUNIRUZTX0lOREVYX0tFWVNfQVNDSUlaLCA2NCB9LAorCS5tYXRjaAkJCT0gYWZzX2NlbGxfY2FjaGVfbWF0Y2gsCisJLnVwZGF0ZQkJCT0gYWZzX2NlbGxfY2FjaGVfdXBkYXRlLAorfTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogY3JlYXRlIGEgY2VsbCByZWNvcmQKKyAqIC0gIm5hbWUiIGlzIHRoZSBuYW1lIG9mIHRoZSBjZWxsCisgKiAtICJ2bGxpc3QiIGlzIGEgY29sb24gc2VwYXJhdGVkIGxpc3Qgb2YgSVAgYWRkcmVzc2VzIGluICJhLmIuYy5kIiBmb3JtYXQKKyAqLworaW50IGFmc19jZWxsX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lLCBjaGFyICp2bGxpc3QsIHN0cnVjdCBhZnNfY2VsbCAqKl9jZWxsKQoreworCXN0cnVjdCBhZnNfY2VsbCAqY2VsbDsKKwljaGFyICpuZXh0OworCWludCByZXQ7CisKKwlfZW50ZXIoIiVzIiwgbmFtZSk7CisKKwlCVUdfT04oIW5hbWUpOyAvKiBUT0RPOiB3YW50IHRvIGxvb2sgdXAgInRoaXMgY2VsbCIgaW4gdGhlIGNhY2hlICovCisKKwkvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGlzZSBhIGNlbGwgcmVjb3JkICovCisJY2VsbCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhZnNfY2VsbCkgKyBzdHJsZW4obmFtZSkgKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNlbGwpIHsKKwkJX2xlYXZlKCIgPSAtRU5PTUVNIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWRvd25fd3JpdGUoJmFmc19jZWxsc19zZW0pOworCisJbWVtc2V0KGNlbGwsIDAsIHNpemVvZihzdHJ1Y3QgYWZzX2NlbGwpKTsKKwlhdG9taWNfc2V0KCZjZWxsLT51c2FnZSwgMCk7CisKKwlJTklUX0xJU1RfSEVBRCgmY2VsbC0+bGluayk7CisKKwlyd2xvY2tfaW5pdCgmY2VsbC0+c3ZfbG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJmNlbGwtPnN2X2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZjZWxsLT5zdl9ncmF2ZXlhcmQpOworCXNwaW5fbG9ja19pbml0KCZjZWxsLT5zdl9neWxvY2spOworCisJaW5pdF9yd3NlbSgmY2VsbC0+dmxfc2VtKTsKKwlJTklUX0xJU1RfSEVBRCgmY2VsbC0+dmxfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmNlbGwtPnZsX2dyYXZleWFyZCk7CisJc3Bpbl9sb2NrX2luaXQoJmNlbGwtPnZsX2d5bG9jayk7CisKKwlzdHJjcHkoY2VsbC0+bmFtZSxuYW1lKTsKKworCS8qIGZpbGwgaW4gdGhlIFZMIHNlcnZlciBsaXN0IGZyb20gdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyAqLworCXJldCA9IC1FSU5WQUw7CisJZG8geworCQl1bnNpZ25lZCBhLCBiLCBjLCBkOworCisJCW5leHQgPSBzdHJjaHIodmxsaXN0LCAnOicpOworCQlpZiAobmV4dCkKKwkJCSpuZXh0KysgPSAwOworCisJCWlmIChzc2NhbmYodmxsaXN0LCAiJXUuJXUuJXUuJXUiLCAmYSwgJmIsICZjLCAmZCkgIT0gNCkKKwkJCWdvdG8gYmFkYWRkcjsKKworCQlpZiAoYSA+IDI1NSB8fCBiID4gMjU1IHx8IGMgPiAyNTUgfHwgZCA+IDI1NSkKKwkJCWdvdG8gYmFkYWRkcjsKKworCQljZWxsLT52bF9hZGRyc1tjZWxsLT52bF9uYWRkcnMrK10uc19hZGRyID0KKwkJCWh0b25sKChhIDw8IDI0KSB8IChiIDw8IDE2KSB8IChjIDw8IDgpIHwgZCk7CisKKwkJaWYgKGNlbGwtPnZsX25hZGRycyA+PSBBRlNfQ0VMTF9NQVhfQUREUlMpCisJCQlicmVhazsKKworCX0gd2hpbGUodmxsaXN0ID0gbmV4dCwgdmxsaXN0KTsKKworCS8qIGFkZCBhIHByb2MgZGlyIGZvciB0aGlzIGNlbGwgKi8KKwlyZXQgPSBhZnNfcHJvY19jZWxsX3NldHVwKGNlbGwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorCS8qIHB1dCBpdCB1cCBmb3IgY2FjaGluZyAqLworCWNhY2hlZnNfYWNxdWlyZV9jb29raWUoYWZzX2NhY2hlX25ldGZzLnByaW1hcnlfaW5kZXgsCisJCQkgICAgICAgJmFmc192bG9jYXRpb25fY2FjaGVfaW5kZXhfZGVmLAorCQkJICAgICAgIGNlbGwsCisJCQkgICAgICAgJmNlbGwtPmNhY2hlKTsKKyNlbmRpZgorCisJLyogYWRkIHRvIHRoZSBjZWxsIGxpc3RzICovCisJd3JpdGVfbG9jaygmYWZzX2NlbGxzX2xvY2spOworCWxpc3RfYWRkX3RhaWwoJmNlbGwtPmxpbmssICZhZnNfY2VsbHMpOworCXdyaXRlX3VubG9jaygmYWZzX2NlbGxzX2xvY2spOworCisJZG93bl93cml0ZSgmYWZzX3Byb2NfY2VsbHNfc2VtKTsKKwlsaXN0X2FkZF90YWlsKCZjZWxsLT5wcm9jX2xpbmssICZhZnNfcHJvY19jZWxscyk7CisJdXBfd3JpdGUoJmFmc19wcm9jX2NlbGxzX3NlbSk7CisKKwkqX2NlbGwgPSBjZWxsOworCXVwX3dyaXRlKCZhZnNfY2VsbHNfc2VtKTsKKworCV9sZWF2ZSgiID0gMCAoJXApIiwgY2VsbCk7CisJcmV0dXJuIDA7CisKKyBiYWRhZGRyOgorCXByaW50ayhLRVJOX0VSUiAia0FGUzogYmFkIFZMIHNlcnZlciBJUCBhZGRyZXNzOiAnJXMnXG4iLCB2bGxpc3QpOworIGVycm9yOgorCXVwX3dyaXRlKCZhZnNfY2VsbHNfc2VtKTsKKwlrZnJlZShjZWxsKTsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfSAvKiBlbmQgYWZzX2NlbGxfY3JlYXRlKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGluaXRpYWxpc2UgdGhlIGNlbGwgZGF0YWJhc2UgZnJvbSBtb2R1bGUgcGFyYW1ldGVycworICovCitpbnQgYWZzX2NlbGxfaW5pdChjaGFyICpyb290Y2VsbCkKK3sKKwlzdHJ1Y3QgYWZzX2NlbGwgKm9sZF9yb290LCAqbmV3X3Jvb3Q7CisJY2hhciAqY3A7CisJaW50IHJldDsKKworCV9lbnRlcigiIik7CisKKwlpZiAoIXJvb3RjZWxsKSB7CisJCS8qIG1vZHVsZSBpcyBsb2FkZWQgd2l0aCBubyBwYXJhbWV0ZXJzLCBvciBidWlsdCBzdGF0aWNhbGx5LgorCQkgKiAtIGluIHRoZSBmdXR1cmUgd2UgbWlnaHQgaW5pdGlhbGl6ZSBjZWxsIERCIGhlcmUuCisJCSAqLworCQlfbGVhdmUoIiA9IDAgKGJ1dCBubyByb290KSIpOworCQlyZXR1cm4gMDsKKwl9CisKKwljcCA9IHN0cmNocihyb290Y2VsbCwgJzonKTsKKwlpZiAoIWNwKSB7CisJCXByaW50ayhLRVJOX0VSUiAia0FGUzogbm8gVkwgc2VydmVyIElQIGFkZHJlc3NlcyBzcGVjaWZpZWRcbiIpOworCQlfbGVhdmUoIiA9ICVkIChubyBjb2xvbikiLCAtRUlOVkFMKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogYWxsb2NhdGUgYSBjZWxsIHJlY29yZCBmb3IgdGhlIHJvb3QgY2VsbCAqLworCSpjcCsrID0gMDsKKwlyZXQgPSBhZnNfY2VsbF9jcmVhdGUocm9vdGNlbGwsIGNwLCAmbmV3X3Jvb3QpOworCWlmIChyZXQgPCAwKSB7CisJCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIGFzIGFmc19wdXRfY2VsbCgpIHRha2VzIGxvY2tzIGJ5IGl0c2VsZiwgd2UgaGF2ZSB0byBkbworCSAqIGEgbGl0dGxlIGd5bW5hc3RpY3MgdG8gYmUgcmFjZS1mcmVlLgorCSAqLworCWFmc19nZXRfY2VsbChuZXdfcm9vdCk7CisKKwl3cml0ZV9sb2NrKCZhZnNfY2VsbHNfbG9jayk7CisJd2hpbGUgKGFmc19jZWxsX3Jvb3QpIHsKKwkJb2xkX3Jvb3QgPSBhZnNfY2VsbF9yb290OworCQlhZnNfY2VsbF9yb290ID0gTlVMTDsKKwkJd3JpdGVfdW5sb2NrKCZhZnNfY2VsbHNfbG9jayk7CisJCWFmc19wdXRfY2VsbChvbGRfcm9vdCk7CisJCXdyaXRlX2xvY2soJmFmc19jZWxsc19sb2NrKTsKKwl9CisJYWZzX2NlbGxfcm9vdCA9IG5ld19yb290OworCXdyaXRlX3VubG9jaygmYWZzX2NlbGxzX2xvY2spOworCisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKKworfSAvKiBlbmQgYWZzX2NlbGxfaW5pdCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBsb29rdXAgYSBjZWxsIHJlY29yZAorICovCitpbnQgYWZzX2NlbGxfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIG5hbWVzeiwgc3RydWN0IGFmc19jZWxsICoqX2NlbGwpCit7CisJc3RydWN0IGFmc19jZWxsICpjZWxsOworCWludCByZXQ7CisKKwlfZW50ZXIoIlwiJSouKnNcIiwiLCBuYW1lc3osIG5hbWVzeiwgbmFtZSA/IG5hbWUgOiAiIik7CisKKwkqX2NlbGwgPSBOVUxMOworCisJaWYgKG5hbWUpIHsKKwkJLyogaWYgdGhlIGNlbGwgd2FzIG5hbWVkLCBsb29rIGZvciBpdCBpbiB0aGUgY2VsbCByZWNvcmQgbGlzdCAqLworCQlyZXQgPSAtRU5PRU5UOworCQljZWxsID0gTlVMTDsKKwkJcmVhZF9sb2NrKCZhZnNfY2VsbHNfbG9jayk7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjZWxsLCAmYWZzX2NlbGxzLCBsaW5rKSB7CisJCQlpZiAoc3RybmNtcChjZWxsLT5uYW1lLCBuYW1lLCBuYW1lc3opID09IDApIHsKKwkJCQlhZnNfZ2V0X2NlbGwoY2VsbCk7CisJCQkJZ290byBmb3VuZDsKKwkJCX0KKwkJfQorCQljZWxsID0gTlVMTDsKKwlmb3VuZDoKKworCQlyZWFkX3VubG9jaygmYWZzX2NlbGxzX2xvY2spOworCisJCWlmIChjZWxsKQorCQkJcmV0ID0gMDsKKwl9CisJZWxzZSB7CisJCXJlYWRfbG9jaygmYWZzX2NlbGxzX2xvY2spOworCisJCWNlbGwgPSBhZnNfY2VsbF9yb290OworCQlpZiAoIWNlbGwpIHsKKwkJCS8qIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gdW5sZXNzIHVzZXIgdHJpZXMgdG8gbW91bnQKKwkJCSAqIHdoZW4gcm9vdCBjZWxsIGlzIG5vdCBzZXQuIFJldHVybiBhbiBpbXBvc3NpYmx5CisJCQkgKiBiaXp6YXJlIGVycm5vIHRvIGFsZXJ0IHRoZSB1c2VyLiBUaGluZ3MgbGlrZQorCQkJICogRU5PRU5UIG1pZ2h0IGJlICJtb3JlIGFwcHJvcHJpYXRlIiBidXQgdGhleSBoYXBwZW4KKwkJCSAqIGZvciBvdGhlciByZWFzb25zLgorCQkJICovCisJCQlyZXQgPSAtRURFU1RBRERSUkVROworCQl9CisJCWVsc2UgeworCQkJYWZzX2dldF9jZWxsKGNlbGwpOworCQkJcmV0ID0gMDsKKwkJfQorCisJCXJlYWRfdW5sb2NrKCZhZnNfY2VsbHNfbG9jayk7CisJfQorCisJKl9jZWxsID0gY2VsbDsKKwlfbGVhdmUoIiA9ICVkICglcCkiLCByZXQsIGNlbGwpOworCXJldHVybiByZXQ7CisKK30gLyogZW5kIGFmc19jZWxsX2xvb2t1cCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiB0cnkgYW5kIGdldCBhIGNlbGwgcmVjb3JkCisgKi8KK3N0cnVjdCBhZnNfY2VsbCAqYWZzX2dldF9jZWxsX21heWJlKHN0cnVjdCBhZnNfY2VsbCAqKl9jZWxsKQoreworCXN0cnVjdCBhZnNfY2VsbCAqY2VsbDsKKworCXdyaXRlX2xvY2soJmFmc19jZWxsc19sb2NrKTsKKworCWNlbGwgPSAqX2NlbGw7CisJaWYgKGNlbGwgJiYgIWxpc3RfZW1wdHkoJmNlbGwtPmxpbmspKQorCQlhZnNfZ2V0X2NlbGwoY2VsbCk7CisJZWxzZQorCQljZWxsID0gTlVMTDsKKworCXdyaXRlX3VubG9jaygmYWZzX2NlbGxzX2xvY2spOworCisJcmV0dXJuIGNlbGw7Cit9IC8qIGVuZCBhZnNfZ2V0X2NlbGxfbWF5YmUoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZGVzdHJveSBhIGNlbGwgcmVjb3JkCisgKi8KK3ZvaWQgYWZzX3B1dF9jZWxsKHN0cnVjdCBhZnNfY2VsbCAqY2VsbCkKK3sKKwlpZiAoIWNlbGwpCisJCXJldHVybjsKKworCV9lbnRlcigiJXB7JWQsJXN9IiwgY2VsbCwgYXRvbWljX3JlYWQoJmNlbGwtPnVzYWdlKSwgY2VsbC0+bmFtZSk7CisKKwkvKiBzYW5pdHkgY2hlY2sgKi8KKwlCVUdfT04oYXRvbWljX3JlYWQoJmNlbGwtPnVzYWdlKSA8PSAwKTsKKworCS8qIHRvIHByZXZlbnQgYSByYWNlLCB0aGUgZGVjcmVtZW50IGFuZCB0aGUgZGVxdWV1ZSBtdXN0IGJlIGVmZmVjdGl2ZWx5CisJICogYXRvbWljICovCisJd3JpdGVfbG9jaygmYWZzX2NlbGxzX2xvY2spOworCisJaWYgKGxpa2VseSghYXRvbWljX2RlY19hbmRfdGVzdCgmY2VsbC0+dXNhZ2UpKSkgeworCQl3cml0ZV91bmxvY2soJmFmc19jZWxsc19sb2NrKTsKKwkJX2xlYXZlKCIiKTsKKwkJcmV0dXJuOworCX0KKworCXdyaXRlX3VubG9jaygmYWZzX2NlbGxzX2xvY2spOworCisJQlVHX09OKCFsaXN0X2VtcHR5KCZjZWxsLT5zdl9saXN0KSk7CisJQlVHX09OKCFsaXN0X2VtcHR5KCZjZWxsLT5zdl9ncmF2ZXlhcmQpKTsKKwlCVUdfT04oIWxpc3RfZW1wdHkoJmNlbGwtPnZsX2xpc3QpKTsKKwlCVUdfT04oIWxpc3RfZW1wdHkoJmNlbGwtPnZsX2dyYXZleWFyZCkpOworCisJX2xlYXZlKCIgW3VudXNlZF0iKTsKK30gLyogZW5kIGFmc19wdXRfY2VsbCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBkZXN0cm95IGEgY2VsbCByZWNvcmQKKyAqLworc3RhdGljIHZvaWQgYWZzX2NlbGxfZGVzdHJveShzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwpCit7CisJX2VudGVyKCIlcHslZCwlc30iLCBjZWxsLCBhdG9taWNfcmVhZCgmY2VsbC0+dXNhZ2UpLCBjZWxsLT5uYW1lKTsKKworCS8qIHRvIHByZXZlbnQgYSByYWNlLCB0aGUgZGVjcmVtZW50IGFuZCB0aGUgZGVxdWV1ZSBtdXN0IGJlIGVmZmVjdGl2ZWx5CisJICogYXRvbWljICovCisJd3JpdGVfbG9jaygmYWZzX2NlbGxzX2xvY2spOworCisJLyogc2FuaXR5IGNoZWNrICovCisJQlVHX09OKGF0b21pY19yZWFkKCZjZWxsLT51c2FnZSkgIT0gMCk7CisKKwlsaXN0X2RlbF9pbml0KCZjZWxsLT5saW5rKTsKKworCXdyaXRlX3VubG9jaygmYWZzX2NlbGxzX2xvY2spOworCisJZG93bl93cml0ZSgmYWZzX2NlbGxzX3NlbSk7CisKKwlhZnNfcHJvY19jZWxsX3JlbW92ZShjZWxsKTsKKworCWRvd25fd3JpdGUoJmFmc19wcm9jX2NlbGxzX3NlbSk7CisJbGlzdF9kZWxfaW5pdCgmY2VsbC0+cHJvY19saW5rKTsKKwl1cF93cml0ZSgmYWZzX3Byb2NfY2VsbHNfc2VtKTsKKworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKKwljYWNoZWZzX3JlbGlucXVpc2hfY29va2llKGNlbGwtPmNhY2hlLCAwKTsKKyNlbmRpZgorCisJdXBfd3JpdGUoJmFmc19jZWxsc19zZW0pOworCisJQlVHX09OKCFsaXN0X2VtcHR5KCZjZWxsLT5zdl9saXN0KSk7CisJQlVHX09OKCFsaXN0X2VtcHR5KCZjZWxsLT5zdl9ncmF2ZXlhcmQpKTsKKwlCVUdfT04oIWxpc3RfZW1wdHkoJmNlbGwtPnZsX2xpc3QpKTsKKwlCVUdfT04oIWxpc3RfZW1wdHkoJmNlbGwtPnZsX2dyYXZleWFyZCkpOworCisJLyogZmluaXNoIGNsZWFuaW5nIHVwIHRoZSBjZWxsICovCisJa2ZyZWUoY2VsbCk7CisKKwlfbGVhdmUoIiBbZGVzdHJveWVkXSIpOworfSAvKiBlbmQgYWZzX2NlbGxfZGVzdHJveSgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBsb29rdXAgdGhlIHNlcnZlciByZWNvcmQgY29ycmVzcG9uZGluZyB0byBhbiBSeCBSUEMgcGVlcgorICovCitpbnQgYWZzX3NlcnZlcl9maW5kX2J5X3BlZXIoY29uc3Qgc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIsCisJCQkgICAgc3RydWN0IGFmc19zZXJ2ZXIgKipfc2VydmVyKQoreworCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7CisJc3RydWN0IGFmc19jZWxsICpjZWxsOworCisJX2VudGVyKCIlcHthPSUwOHh9LCIsIHBlZXIsIG50b2hsKHBlZXItPmFkZHIuc19hZGRyKSk7CisKKwkvKiBzZWFyY2ggdGhlIGNlbGwgbGlzdCAqLworCXJlYWRfbG9jaygmYWZzX2NlbGxzX2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjZWxsLCAmYWZzX2NlbGxzLCBsaW5rKSB7CisKKwkJX2RlYnVnKCI/IGNlbGwgJXMiLGNlbGwtPm5hbWUpOworCisJCXdyaXRlX2xvY2soJmNlbGwtPnN2X2xvY2spOworCisJCS8qIGNoZWNrIHRoZSBhY3RpdmUgbGlzdCAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlcnZlciwgJmNlbGwtPnN2X2xpc3QsIGxpbmspIHsKKwkJCV9kZWJ1ZygiPz8gc2VydmVyICUwOHgiLCBudG9obChzZXJ2ZXItPmFkZHIuc19hZGRyKSk7CisKKwkJCWlmIChtZW1jbXAoJnNlcnZlci0+YWRkciwgJnBlZXItPmFkZHIsCisJCQkJICAgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkgPT0gMCkKKwkJCQlnb3RvIGZvdW5kX3NlcnZlcjsKKwkJfQorCisJCS8qIGNoZWNrIHRoZSBpbmFjdGl2ZSBsaXN0ICovCisJCXNwaW5fbG9jaygmY2VsbC0+c3ZfZ3lsb2NrKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShzZXJ2ZXIsICZjZWxsLT5zdl9ncmF2ZXlhcmQsIGxpbmspIHsKKwkJCV9kZWJ1ZygiPz8gZGVhZCBzZXJ2ZXIgJTA4eCIsCisJCQkgICAgICAgbnRvaGwoc2VydmVyLT5hZGRyLnNfYWRkcikpOworCisJCQlpZiAobWVtY21wKCZzZXJ2ZXItPmFkZHIsICZwZWVyLT5hZGRyLAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpID09IDApCisJCQkJZ290byBmb3VuZF9kZWFkX3NlcnZlcjsKKwkJfQorCQlzcGluX3VubG9jaygmY2VsbC0+c3ZfZ3lsb2NrKTsKKworCQl3cml0ZV91bmxvY2soJmNlbGwtPnN2X2xvY2spOworCX0KKwlyZWFkX3VubG9jaygmYWZzX2NlbGxzX2xvY2spOworCisJX2xlYXZlKCIgPSAtRU5PRU5UIik7CisJcmV0dXJuIC1FTk9FTlQ7CisKKwkvKiB3ZSBmb3VuZCBpdCBpbiB0aGUgZ3JhdmV5YXJkIC0gcmVzdXJyZWN0IGl0ICovCisgZm91bmRfZGVhZF9zZXJ2ZXI6CisJbGlzdF9kZWwoJnNlcnZlci0+bGluayk7CisJbGlzdF9hZGRfdGFpbCgmc2VydmVyLT5saW5rLCAmY2VsbC0+c3ZfbGlzdCk7CisJYWZzX2dldF9zZXJ2ZXIoc2VydmVyKTsKKwlhZnNfa2Fmc3RpbW9kX2RlbF90aW1lcigmc2VydmVyLT50aW1lb3V0KTsKKwlzcGluX3VubG9jaygmY2VsbC0+c3ZfZ3lsb2NrKTsKKwlnb3RvIHN1Y2Nlc3M7CisKKwkvKiB3ZSBmb3VuZCBpdCAtIGluY3JlbWVudCBpdHMgcmVmIGNvdW50IGFuZCByZXR1cm4gaXQgKi8KKyBmb3VuZF9zZXJ2ZXI6CisJYWZzX2dldF9zZXJ2ZXIoc2VydmVyKTsKKworIHN1Y2Nlc3M6CisJd3JpdGVfdW5sb2NrKCZjZWxsLT5zdl9sb2NrKTsKKwlyZWFkX3VubG9jaygmYWZzX2NlbGxzX2xvY2spOworCisJKl9zZXJ2ZXIgPSBzZXJ2ZXI7CisJX2xlYXZlKCIgPSAwIChzPSVwIGM9JXApIiwgc2VydmVyLCBjZWxsKTsKKwlyZXR1cm4gMDsKKworfSAvKiBlbmQgYWZzX3NlcnZlcl9maW5kX2J5X3BlZXIoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogcHVyZ2UgaW4tbWVtb3J5IGNlbGwgZGF0YWJhc2Ugb24gbW9kdWxlIHVubG9hZCBvciBhZnNfaW5pdCgpIGZhaWx1cmUKKyAqIC0gdGhlIHRpbWVvdXQgZGFlbW9uIGlzIHN0b3BwZWQgYmVmb3JlIGNhbGxpbmcgdGhpcworICovCit2b2lkIGFmc19jZWxsX3B1cmdlKHZvaWQpCit7CisJc3RydWN0IGFmc192bG9jYXRpb24gKnZsb2NhdGlvbjsKKwlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGw7CisKKwlfZW50ZXIoIiIpOworCisJYWZzX3B1dF9jZWxsKGFmc19jZWxsX3Jvb3QpOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZhZnNfY2VsbHMpKSB7CisJCWNlbGwgPSBOVUxMOworCisJCS8qIHJlbW92ZSB0aGUgbmV4dCBjZWxsIGZyb20gdGhlIGZyb250IG9mIHRoZSBsaXN0ICovCisJCXdyaXRlX2xvY2soJmFmc19jZWxsc19sb2NrKTsKKworCQlpZiAoIWxpc3RfZW1wdHkoJmFmc19jZWxscykpIHsKKwkJCWNlbGwgPSBsaXN0X2VudHJ5KGFmc19jZWxscy5uZXh0LAorCQkJCQkgIHN0cnVjdCBhZnNfY2VsbCwgbGluayk7CisJCQlsaXN0X2RlbF9pbml0KCZjZWxsLT5saW5rKTsKKwkJfQorCisJCXdyaXRlX3VubG9jaygmYWZzX2NlbGxzX2xvY2spOworCisJCWlmIChjZWxsKSB7CisJCQlfZGVidWcoIlBVUkdJTkcgQ0VMTCAlcyAoJWQpIiwKKwkJCSAgICAgICBjZWxsLT5uYW1lLCBhdG9taWNfcmVhZCgmY2VsbC0+dXNhZ2UpKTsKKworCQkJQlVHX09OKCFsaXN0X2VtcHR5KCZjZWxsLT5zdl9saXN0KSk7CisJCQlCVUdfT04oIWxpc3RfZW1wdHkoJmNlbGwtPnZsX2xpc3QpKTsKKworCQkJLyogcHVyZ2UgdGhlIGNlbGwncyBWTCBncmF2ZXlhcmQgbGlzdCAqLworCQkJX2RlYnVnKCIgLSBjbGVhcmluZyBWTCBncmF2ZXlhcmQiKTsKKworCQkJc3Bpbl9sb2NrKCZjZWxsLT52bF9neWxvY2spOworCisJCQl3aGlsZSAoIWxpc3RfZW1wdHkoJmNlbGwtPnZsX2dyYXZleWFyZCkpIHsKKwkJCQl2bG9jYXRpb24gPSBsaXN0X2VudHJ5KGNlbGwtPnZsX2dyYXZleWFyZC5uZXh0LAorCQkJCQkJICAgICAgIHN0cnVjdCBhZnNfdmxvY2F0aW9uLAorCQkJCQkJICAgICAgIGxpbmspOworCQkJCWxpc3RfZGVsX2luaXQoJnZsb2NhdGlvbi0+bGluayk7CisKKwkJCQlhZnNfa2Fmc3RpbW9kX2RlbF90aW1lcigmdmxvY2F0aW9uLT50aW1lb3V0KTsKKworCQkJCXNwaW5fdW5sb2NrKCZjZWxsLT52bF9neWxvY2spOworCisJCQkJYWZzX3Zsb2NhdGlvbl9kb190aW1lb3V0KHZsb2NhdGlvbik7CisJCQkJLyogVE9ETzogcmFjZSBpZiBtb3ZlIHRvIHVzZSBrcnh0aW1vZCBpbnN0ZWFkCisJCQkJICogb2Yga2Fmc3RpbW9kICovCisKKwkJCQlzcGluX2xvY2soJmNlbGwtPnZsX2d5bG9jayk7CisJCQl9CisKKwkJCXNwaW5fdW5sb2NrKCZjZWxsLT52bF9neWxvY2spOworCisJCQkvKiBwdXJnZSB0aGUgY2VsbCdzIHNlcnZlciBncmF2ZXlhcmQgbGlzdCAqLworCQkJX2RlYnVnKCIgLSBjbGVhcmluZyBzZXJ2ZXIgZ3JhdmV5YXJkIik7CisKKwkJCXNwaW5fbG9jaygmY2VsbC0+c3ZfZ3lsb2NrKTsKKworCQkJd2hpbGUgKCFsaXN0X2VtcHR5KCZjZWxsLT5zdl9ncmF2ZXlhcmQpKSB7CisJCQkJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcjsKKworCQkJCXNlcnZlciA9IGxpc3RfZW50cnkoY2VsbC0+c3ZfZ3JhdmV5YXJkLm5leHQsCisJCQkJCQkgICAgc3RydWN0IGFmc19zZXJ2ZXIsIGxpbmspOworCQkJCWxpc3RfZGVsX2luaXQoJnNlcnZlci0+bGluayk7CisKKwkJCQlhZnNfa2Fmc3RpbW9kX2RlbF90aW1lcigmc2VydmVyLT50aW1lb3V0KTsKKworCQkJCXNwaW5fdW5sb2NrKCZjZWxsLT5zdl9neWxvY2spOworCisJCQkJYWZzX3NlcnZlcl9kb190aW1lb3V0KHNlcnZlcik7CisKKwkJCQlzcGluX2xvY2soJmNlbGwtPnN2X2d5bG9jayk7CisJCQl9CisKKwkJCXNwaW5fdW5sb2NrKCZjZWxsLT5zdl9neWxvY2spOworCisJCQkvKiBub3cgdGhlIGNlbGwgc2hvdWxkIGJlIGxlZnQgd2l0aCBubyByZWZlcmVuY2VzICovCisJCQlhZnNfY2VsbF9kZXN0cm95KGNlbGwpOworCQl9CisJfQorCisJX2xlYXZlKCIiKTsKK30gLyogZW5kIGFmc19jZWxsX3B1cmdlKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIG1hdGNoIGEgY2VsbCByZWNvcmQgb2J0YWluZWQgZnJvbSB0aGUgY2FjaGUKKyAqLworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKK3N0YXRpYyBjYWNoZWZzX21hdGNoX3ZhbF90IGFmc19jZWxsX2NhY2hlX21hdGNoKHZvaWQgKnRhcmdldCwKKwkJCQkJCWNvbnN0IHZvaWQgKmVudHJ5KQoreworCWNvbnN0IHN0cnVjdCBhZnNfY2FjaGVfY2VsbCAqY2NlbGwgPSBlbnRyeTsKKwlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSB0YXJnZXQ7CisKKwlfZW50ZXIoInslc30seyVzfSIsIGNjZWxsLT5uYW1lLCBjZWxsLT5uYW1lKTsKKworCWlmIChzdHJuY21wKGNjZWxsLT5uYW1lLCBjZWxsLT5uYW1lLCBzaXplb2YoY2NlbGwtPm5hbWUpKSA9PSAwKSB7CisJCV9sZWF2ZSgiID0gU1VDQ0VTUyIpOworCQlyZXR1cm4gQ0FDSEVGU19NQVRDSF9TVUNDRVNTOworCX0KKworCV9sZWF2ZSgiID0gRkFJTEVEIik7CisJcmV0dXJuIENBQ0hFRlNfTUFUQ0hfRkFJTEVEOworfSAvKiBlbmQgYWZzX2NlbGxfY2FjaGVfbWF0Y2goKSAqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiB1cGRhdGUgYSBjZWxsIHJlY29yZCBpbiB0aGUgY2FjaGUKKyAqLworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKK3N0YXRpYyB2b2lkIGFmc19jZWxsX2NhY2hlX3VwZGF0ZSh2b2lkICpzb3VyY2UsIHZvaWQgKmVudHJ5KQoreworCXN0cnVjdCBhZnNfY2FjaGVfY2VsbCAqY2NlbGwgPSBlbnRyeTsKKwlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSBzb3VyY2U7CisKKwlfZW50ZXIoIiVwLCVwIiwgc291cmNlLCBlbnRyeSk7CisKKwlzdHJuY3B5KGNjZWxsLT5uYW1lLCBjZWxsLT5uYW1lLCBzaXplb2YoY2NlbGwtPm5hbWUpKTsKKworCW1lbWNweShjY2VsbC0+dmxfc2VydmVycywKKwkgICAgICAgY2VsbC0+dmxfYWRkcnMsCisJICAgICAgIG1pbihzaXplb2YoY2NlbGwtPnZsX3NlcnZlcnMpLCBzaXplb2YoY2VsbC0+dmxfYWRkcnMpKSk7CisKK30gLyogZW5kIGFmc19jZWxsX2NhY2hlX3VwZGF0ZSgpICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9jZWxsLmggYi9mcy9hZnMvY2VsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MzQ5MTAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZnMvY2VsbC5oCkBAIC0wLDAgKzEsNzggQEAKKy8qIGNlbGwuaDogQUZTIGNlbGwgcmVjb3JkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0FGU19DRUxMX0gKKyNkZWZpbmUgX0xJTlVYX0FGU19DRUxMX0gKKworI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAiY2FjaGUuaCIKKworI2RlZmluZSBBRlNfQ0VMTF9NQVhfQUREUlMgMTUKKworZXh0ZXJuIHZvbGF0aWxlIGludCBhZnNfY2VsbHNfYmVpbmdfcHVyZ2VkOyAvKiBUIHdoZW4gY2VsbHMgYXJlIGJlaW5nIHB1cmdlZCBieSBybW1vZCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZW50cnkgaW4gdGhlIGNhY2hlZCBjZWxsIGNhdGFsb2d1ZQorICovCitzdHJ1Y3QgYWZzX2NhY2hlX2NlbGwKK3sKKwljaGFyCQkJbmFtZVs2NF07CS8qIGNlbGwgbmFtZSAocGFkZGVkIHdpdGggTlVMcykgKi8KKwlzdHJ1Y3QgaW5fYWRkcgkJdmxfc2VydmVyc1sxNV07CS8qIGNhY2hlZCBjZWxsIFZMIHNlcnZlcnMgKi8KK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBBRlMgY2VsbCByZWNvcmQKKyAqLworc3RydWN0IGFmc19jZWxsCit7CisJYXRvbWljX3QJCXVzYWdlOworCXN0cnVjdCBsaXN0X2hlYWQJbGluazsJCS8qIG1haW4gY2VsbCBsaXN0IGxpbmsgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXByb2NfbGluazsJLyogL3Byb2MgY2VsbCBsaXN0IGxpbmsgKi8KKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKnByb2NfZGlyOwkvKiAvcHJvYyBkaXIgZm9yIHRoaXMgY2VsbCAqLworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKKwlzdHJ1Y3QgY2FjaGVmc19jb29raWUJKmNhY2hlOwkJLyogY2FjaGluZyBjb29raWUgKi8KKyNlbmRpZgorCisJLyogc2VydmVyIHJlY29yZCBtYW5hZ2VtZW50ICovCisJcndsb2NrX3QJCXN2X2xvY2s7CS8qIGFjdGl2ZSBzZXJ2ZXIgbGlzdCBsb2NrICovCisJc3RydWN0IGxpc3RfaGVhZAlzdl9saXN0OwkvKiBhY3RpdmUgc2VydmVyIGxpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXN2X2dyYXZleWFyZDsJLyogaW5hY3RpdmUgc2VydmVyIGxpc3QgKi8KKwlzcGlubG9ja190CQlzdl9neWxvY2s7CS8qIGluYWN0aXZlIHNlcnZlciBsaXN0IGxvY2sgKi8KKworCS8qIHZvbHVtZSBsb2NhdGlvbiByZWNvcmQgbWFuYWdlbWVudCAqLworCXN0cnVjdCByd19zZW1hcGhvcmUJdmxfc2VtOwkJLyogdm9sdW1lIG1hbmFnZW1lbnQgc2VyaWFsaXNhdGlvbiBzZW1hcGhvcmUgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXZsX2xpc3Q7CS8qIGNlbGwncyBhY3RpdmUgVkwgcmVjb3JkIGxpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXZsX2dyYXZleWFyZDsJLyogY2VsbCdzIGluYWN0aXZlIFZMIHJlY29yZCBsaXN0ICovCisJc3BpbmxvY2tfdAkJdmxfZ3lsb2NrOwkvKiBncmF2ZXlhcmQgbG9jayAqLworCXVuc2lnbmVkIHNob3J0CQl2bF9uYWRkcnM7CS8qIG51bWJlciBvZiBWTCBzZXJ2ZXJzIGluIGFkZHIgbGlzdCAqLworCXVuc2lnbmVkIHNob3J0CQl2bF9jdXJyX3N2aXg7CS8qIGN1cnJlbnQgc2VydmVyIGluZGV4ICovCisJc3RydWN0IGluX2FkZHIJCXZsX2FkZHJzW0FGU19DRUxMX01BWF9BRERSU107CS8qIGNlbGwgVkwgc2VydmVyIGFkZHJlc3NlcyAqLworCisJY2hhcgkJCW5hbWVbMF07CS8qIGNlbGwgbmFtZSAtIG11c3QgZ28gbGFzdCAqLworfTsKKworZXh0ZXJuIGludCBhZnNfY2VsbF9pbml0KGNoYXIgKnJvb3RjZWxsKTsKKworZXh0ZXJuIGludCBhZnNfY2VsbF9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqdmxsaXN0LCBzdHJ1Y3QgYWZzX2NlbGwgKipfY2VsbCk7CisKK2V4dGVybiBpbnQgYWZzX2NlbGxfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIG5tc2l6ZSwgc3RydWN0IGFmc19jZWxsICoqX2NlbGwpOworCisjZGVmaW5lIGFmc19nZXRfY2VsbChDKSBkbyB7IGF0b21pY19pbmMoJihDKS0+dXNhZ2UpOyB9IHdoaWxlKDApCisKK2V4dGVybiBzdHJ1Y3QgYWZzX2NlbGwgKmFmc19nZXRfY2VsbF9tYXliZShzdHJ1Y3QgYWZzX2NlbGwgKipfY2VsbCk7CisKK2V4dGVybiB2b2lkIGFmc19wdXRfY2VsbChzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwpOworCitleHRlcm4gdm9pZCBhZnNfY2VsbF9wdXJnZSh2b2lkKTsKKworI2VuZGlmIC8qIF9MSU5VWF9BRlNfQ0VMTF9IICovCmRpZmYgLS1naXQgYS9mcy9hZnMvY21zZXJ2aWNlLmMgYi9mcy9hZnMvY21zZXJ2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE1N2ZkNwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Fmcy9jbXNlcnZpY2UuYwpAQCAtMCwwICsxLDY1MiBAQAorLyogY21zZXJ2aWNlLmM6IEFGUyBDYWNoZSBNYW5hZ2VyIFNlcnZpY2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlICJzZXJ2ZXIuaCIKKyNpbmNsdWRlICJjZWxsLmgiCisjaW5jbHVkZSAidHJhbnNwb3J0LmgiCisjaW5jbHVkZSA8cnhycGMvcnhycGMuaD4KKyNpbmNsdWRlIDxyeHJwYy90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxyeHJwYy9jb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8cnhycGMvY2FsbC5oPgorI2luY2x1ZGUgImNtc2VydmljZS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyB1bnNpZ25lZCBhZnNjbV91c2FnZTsJCS8qIEFGUyBjYWNoZSBtYW5hZ2VyIHVzYWdlIGNvdW50ICovCitzdGF0aWMgc3RydWN0IHJ3X3NlbWFwaG9yZSBhZnNjbV9zZW07CS8qIEFGUyBjYWNoZSBtYW5hZ2VyIHN0YXJ0L3N0b3Agc2VtYXBob3JlICovCisKK3N0YXRpYyBpbnQgYWZzY21fbmV3X2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpOworc3RhdGljIHZvaWQgYWZzY21fYXR0ZW50aW9uKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKTsKK3N0YXRpYyB2b2lkIGFmc2NtX2Vycm9yKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKTsKK3N0YXRpYyB2b2lkIGFmc2NtX2FlbWFwKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKTsKKworc3RhdGljIHZvaWQgX1NSWEFGU0NNX0NhbGxCYWNrKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKTsKK3N0YXRpYyB2b2lkIF9TUlhBRlNDTV9Jbml0Q2FsbEJhY2tTdGF0ZShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCk7CitzdGF0aWMgdm9pZCBfU1JYQUZTQ01fUHJvYmUoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpOworCit0eXBlZGVmIHZvaWQgKCpfU1JYQUZTQ01feHh4eF90KShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnhycGNfb3BlcmF0aW9uIEFGU0NNX29wc1tdID0geworCXsKKwkJLmlkCT0gMjA0LAorCQkuYXNpemUJPSBSWFJQQ19BUFBfTUFSS19FT0YsCisJCS5uYW1lCT0gIkNhbGxCYWNrIiwKKwkJLnVzZXIJPSBfU1JYQUZTQ01fQ2FsbEJhY2ssCisJfSwKKwl7CisJCS5pZAk9IDIwNSwKKwkJLmFzaXplCT0gUlhSUENfQVBQX01BUktfRU9GLAorCQkubmFtZQk9ICJJbml0Q2FsbEJhY2tTdGF0ZSIsCisJCS51c2VyCT0gX1NSWEFGU0NNX0luaXRDYWxsQmFja1N0YXRlLAorCX0sCisJeworCQkuaWQJPSAyMDYsCisJCS5hc2l6ZQk9IFJYUlBDX0FQUF9NQVJLX0VPRiwKKwkJLm5hbWUJPSAiUHJvYmUiLAorCQkudXNlcgk9IF9TUlhBRlNDTV9Qcm9iZSwKKwl9LAorI2lmIDAKKwl7CisJCS5pZAk9IDIwNywKKwkJLmFzaXplCT0gUlhSUENfQVBQX01BUktfRU9GLAorCQkubmFtZQk9ICJHZXRMb2NrIiwKKwkJLnVzZXIJPSBfU1JYQUZTQ01fR2V0TG9jaywKKwl9LAorCXsKKwkJLmlkCT0gMjA4LAorCQkuYXNpemUJPSBSWFJQQ19BUFBfTUFSS19FT0YsCisJCS5uYW1lCT0gIkdldENFIiwKKwkJLnVzZXIJPSBfU1JYQUZTQ01fR2V0Q0UsCisJfSwKKwl7CisJCS5pZAk9IDIwOSwKKwkJLmFzaXplCT0gUlhSUENfQVBQX01BUktfRU9GLAorCQkubmFtZQk9ICJHZXRYU3RhdHNWZXJzaW9uIiwKKwkJLnVzZXIJPSBfU1JYQUZTQ01fR2V0WFN0YXRzVmVyc2lvbiwKKwl9LAorCXsKKwkJLmlkCT0gMjEwLAorCQkuYXNpemUJPSBSWFJQQ19BUFBfTUFSS19FT0YsCisJCS5uYW1lCT0gIkdldFhTdGF0cyIsCisJCS51c2VyCT0gX1NSWEFGU0NNX0dldFhTdGF0cywKKwl9CisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3QgcnhycGNfc2VydmljZSBBRlNDTV9zZXJ2aWNlID0geworCS5uYW1lCQk9ICJBRlMvQ00iLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGluawkJPSBMSVNUX0hFQURfSU5JVChBRlNDTV9zZXJ2aWNlLmxpbmspLAorCS5uZXdfY2FsbAk9IGFmc2NtX25ld19jYWxsLAorCS5zZXJ2aWNlX2lkCT0gMSwKKwkuYXR0bl9mdW5jCT0gYWZzY21fYXR0ZW50aW9uLAorCS5lcnJvcl9mdW5jCT0gYWZzY21fZXJyb3IsCisJLmFlbWFwX2Z1bmMJPSBhZnNjbV9hZW1hcCwKKwkub3BzX2JlZ2luCT0gJkFGU0NNX29wc1swXSwKKwkub3BzX2VuZAk9ICZBRlNDTV9vcHNbc2l6ZW9mKEFGU0NNX29wcykgLyBzaXplb2YoQUZTQ01fb3BzWzBdKV0sCit9OworCitzdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKGthZnNjbWRfYWxpdmUpOworc3RhdGljIERFQ0xBUkVfQ09NUExFVElPTihrYWZzY21kX2RlYWQpOworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGthZnNjbWRfc2xlZXBxKTsKK3N0YXRpYyBMSVNUX0hFQUQoa2Fmc2NtZF9hdHRlbnRpb25fbGlzdCk7CitzdGF0aWMgTElTVF9IRUFEKGFmc2NtX2NhbGxzKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soYWZzY21fY2FsbHNfbG9jayk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGthZnNjbWRfYXR0ZW50aW9uX2xvY2spOworc3RhdGljIGludCBrYWZzY21kX2RpZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEFGUyBDYWNoZSBNYW5hZ2VyIGtlcm5lbCB0aHJlYWQKKyAqLworc3RhdGljIGludCBrYWZzY21kKHZvaWQgKmFyZykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRShteXNlbGYsIGN1cnJlbnQpOworCisJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGw7CisJX1NSWEFGU0NNX3h4eHhfdCBmdW5jOworCWludCBkaWU7CisKKwlwcmludGsoImtBRlM6IFN0YXJ0ZWQga2Fmc2NtZCAlZFxuIiwgY3VycmVudC0+cGlkKTsKKworCWRhZW1vbml6ZSgia2Fmc2NtZCIpOworCisJY29tcGxldGUoJmthZnNjbWRfYWxpdmUpOworCisJLyogbG9vcCBhcm91bmQgbG9va2luZyBmb3IgdGhpbmdzIHRvIGF0dGVuZCB0byAqLworCWRvIHsKKwkJaWYgKGxpc3RfZW1wdHkoJmthZnNjbWRfYXR0ZW50aW9uX2xpc3QpKSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJYWRkX3dhaXRfcXVldWUoJmthZnNjbWRfc2xlZXBxLCAmbXlzZWxmKTsKKworCQkJZm9yICg7OykgeworCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQkJaWYgKCFsaXN0X2VtcHR5KCZrYWZzY21kX2F0dGVudGlvbl9saXN0KSB8fAorCQkJCSAgICBzaWduYWxfcGVuZGluZyhjdXJyZW50KSB8fAorCQkJCSAgICBrYWZzY21kX2RpZSkKKwkJCQkJYnJlYWs7CisKKwkJCQlzY2hlZHVsZSgpOworCQkJfQorCisJCQlyZW1vdmVfd2FpdF9xdWV1ZSgma2Fmc2NtZF9zbGVlcHEsICZteXNlbGYpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJfQorCisJCWRpZSA9IGthZnNjbWRfZGllOworCisJCS8qIGRlcXVldWUgdGhlIG5leHQgY2FsbCByZXF1aXJpbmcgYXR0ZW50aW9uICovCisJCWNhbGwgPSBOVUxMOworCQlzcGluX2xvY2soJmthZnNjbWRfYXR0ZW50aW9uX2xvY2spOworCisJCWlmICghbGlzdF9lbXB0eSgma2Fmc2NtZF9hdHRlbnRpb25fbGlzdCkpIHsKKwkJCWNhbGwgPSBsaXN0X2VudHJ5KGthZnNjbWRfYXR0ZW50aW9uX2xpc3QubmV4dCwKKwkJCQkJICBzdHJ1Y3QgcnhycGNfY2FsbCwKKwkJCQkJICBhcHBfYXR0bl9saW5rKTsKKwkJCWxpc3RfZGVsX2luaXQoJmNhbGwtPmFwcF9hdHRuX2xpbmspOworCQkJZGllID0gMDsKKwkJfQorCisJCXNwaW5fdW5sb2NrKCZrYWZzY21kX2F0dGVudGlvbl9sb2NrKTsKKworCQlpZiAoY2FsbCkgeworCQkJLyogYWN0IHVwb24gaXQgKi8KKwkJCV9kZWJ1ZygiQEBAIEJlZ2luIEF0dGVuZCBDYWxsICVwIiwgY2FsbCk7CisKKwkJCWZ1bmMgPSBjYWxsLT5hcHBfdXNlcjsKKwkJCWlmIChmdW5jKQorCQkJCWZ1bmMoY2FsbCk7CisKKwkJCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOworCisJCQlfZGVidWcoIkBAQCBFbmQgQXR0ZW5kIENhbGwgJXAiLCBjYWxsKTsKKwkJfQorCisJfSB3aGlsZSghZGllKTsKKworCS8qIGFuZCB0aGF0J3MgYWxsICovCisJY29tcGxldGVfYW5kX2V4aXQoJmthZnNjbWRfZGVhZCwgMCk7CisKK30gLyogZW5kIGthZnNjbWQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogaGFuZGxlIGEgY2FsbCBjb21pbmcgaW4gdG8gdGhlIGNhY2hlIG1hbmFnZXIKKyAqIC0gaWYgSSB3YW50IHRvIGtlZXAgdGhlIGNhbGwsIEkgbXVzdCBpbmNyZW1lbnQgaXRzIHVzYWdlIGNvdW50CisgKiAtIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBuZWdhdGVkIGFuZCBwYXNzZWQgYmFjayBpbiBhbiBhYm9ydCBwYWNrZXQgaWYKKyAqICAgbm9uLXplcm8KKyAqIC0gc2VyaWFsaXNlZCBieSB2aXJ0dWUgb2YgdGhlcmUgb25seSBiZWluZyBvbmUga3J4aW9kCisgKi8KK3N0YXRpYyBpbnQgYWZzY21fbmV3X2NhbGwoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCit7CisJX2VudGVyKCIlcHtjaWQ9JXUgdT0lZH0iLAorCSAgICAgICBjYWxsLCBudG9obChjYWxsLT5jYWxsX2lkKSwgYXRvbWljX3JlYWQoJmNhbGwtPnVzYWdlKSk7CisKKwlyeHJwY19nZXRfY2FsbChjYWxsKTsKKworCS8qIGFkZCB0byBteSBjdXJyZW50IGNhbGwgbGlzdCAqLworCXNwaW5fbG9jaygmYWZzY21fY2FsbHNfbG9jayk7CisJbGlzdF9hZGQoJmNhbGwtPmFwcF9saW5rLCZhZnNjbV9jYWxscyk7CisJc3Bpbl91bmxvY2soJmFmc2NtX2NhbGxzX2xvY2spOworCisJX2xlYXZlKCIgPSAwIik7CisJcmV0dXJuIDA7CisKK30gLyogZW5kIGFmc2NtX25ld19jYWxsKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHF1ZXVlIG9uIHRoZSBrYWZzY21kIHF1ZXVlIGZvciBhdHRlbnRpb24KKyAqLworc3RhdGljIHZvaWQgYWZzY21fYXR0ZW50aW9uKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworCV9lbnRlcigiJXB7Y2lkPSV1IHU9JWR9IiwKKwkgICAgICAgY2FsbCwgbnRvaGwoY2FsbC0+Y2FsbF9pZCksIGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSkpOworCisJc3Bpbl9sb2NrKCZrYWZzY21kX2F0dGVudGlvbl9sb2NrKTsKKworCWlmIChsaXN0X2VtcHR5KCZjYWxsLT5hcHBfYXR0bl9saW5rKSkgeworCQlsaXN0X2FkZF90YWlsKCZjYWxsLT5hcHBfYXR0bl9saW5rLCAma2Fmc2NtZF9hdHRlbnRpb25fbGlzdCk7CisJCXJ4cnBjX2dldF9jYWxsKGNhbGwpOworCX0KKworCXNwaW5fdW5sb2NrKCZrYWZzY21kX2F0dGVudGlvbl9sb2NrKTsKKworCXdha2VfdXAoJmthZnNjbWRfc2xlZXBxKTsKKworCV9sZWF2ZSgiIHt1PSVkfSIsIGF0b21pY19yZWFkKCZjYWxsLT51c2FnZSkpOworfSAvKiBlbmQgYWZzY21fYXR0ZW50aW9uKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGhhbmRsZSBteSBjYWxsIGJlaW5nIGFib3J0ZWQKKyAqIC0gY2xlYW4gdXAsIGRlcXVldWUgYW5kIHB1dCBteSByZWYgdG8gdGhlIGNhbGwKKyAqLworc3RhdGljIHZvaWQgYWZzY21fZXJyb3Ioc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCit7CisJaW50IHJlbW92ZWQ7CisKKwlfZW50ZXIoIiVwe2VzdD0lcyBhYz0ldSBlcj0lZH0iLAorCSAgICAgICBjYWxsLAorCSAgICAgICByeHJwY19jYWxsX2Vycm9yX3N0YXRlc1tjYWxsLT5hcHBfZXJyX3N0YXRlXSwKKwkgICAgICAgY2FsbC0+YXBwX2Fib3J0X2NvZGUsCisJICAgICAgIGNhbGwtPmFwcF9lcnJubyk7CisKKwlzcGluX2xvY2soJmthZnNjbWRfYXR0ZW50aW9uX2xvY2spOworCisJaWYgKGxpc3RfZW1wdHkoJmNhbGwtPmFwcF9hdHRuX2xpbmspKSB7CisJCWxpc3RfYWRkX3RhaWwoJmNhbGwtPmFwcF9hdHRuX2xpbmssICZrYWZzY21kX2F0dGVudGlvbl9saXN0KTsKKwkJcnhycGNfZ2V0X2NhbGwoY2FsbCk7CisJfQorCisJc3Bpbl91bmxvY2soJmthZnNjbWRfYXR0ZW50aW9uX2xvY2spOworCisJcmVtb3ZlZCA9IDA7CisJc3Bpbl9sb2NrKCZhZnNjbV9jYWxsc19sb2NrKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmNhbGwtPmFwcF9saW5rKSkgeworCQlsaXN0X2RlbF9pbml0KCZjYWxsLT5hcHBfbGluayk7CisJCXJlbW92ZWQgPSAxOworCX0KKwlzcGluX3VubG9jaygmYWZzY21fY2FsbHNfbG9jayk7CisKKwlpZiAocmVtb3ZlZCkKKwkJcnhycGNfcHV0X2NhbGwoY2FsbCk7CisKKwl3YWtlX3VwKCZrYWZzY21kX3NsZWVwcSk7CisKKwlfbGVhdmUoIiIpOworfSAvKiBlbmQgYWZzY21fZXJyb3IoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogbWFwIGFmcyBhYm9ydCBjb2RlcyB0by9mcm9tIExpbnV4IGVycm9yIGNvZGVzCisgKiAtIGNhbGxlZCB3aXRoIGNhbGwtPmxvY2sgaGVsZAorICovCitzdGF0aWMgdm9pZCBhZnNjbV9hZW1hcChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3sKKwlzd2l0Y2ggKGNhbGwtPmFwcF9lcnJfc3RhdGUpIHsKKwljYXNlIFJYUlBDX0VTVEFURV9MT0NBTF9BQk9SVDoKKwkJY2FsbC0+YXBwX2Fib3J0X2NvZGUgPSAtY2FsbC0+YXBwX2Vycm5vOworCQlicmVhazsKKwljYXNlIFJYUlBDX0VTVEFURV9QRUVSX0FCT1JUOgorCQljYWxsLT5hcHBfZXJybm8gPSAtRUNPTk5BQk9SVEVEOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9IC8qIGVuZCBhZnNjbV9hZW1hcCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBzdGFydCB0aGUgY2FjaGUgbWFuYWdlciBzZXJ2aWNlIGlmIG5vdCBhbHJlYWR5IHN0YXJ0ZWQKKyAqLworaW50IGFmc2NtX3N0YXJ0KHZvaWQpCit7CisJaW50IHJldDsKKworCWRvd25fd3JpdGUoJmFmc2NtX3NlbSk7CisJaWYgKCFhZnNjbV91c2FnZSkgeworCQlyZXQgPSBrZXJuZWxfdGhyZWFkKGthZnNjbWQsIE5VTEwsIDApOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0OworCisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmthZnNjbWRfYWxpdmUpOworCisJCXJldCA9IHJ4cnBjX2FkZF9zZXJ2aWNlKGFmc190cmFuc3BvcnQsICZBRlNDTV9zZXJ2aWNlKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGtpbGw7CisKKwkJYWZzX2thZnN0aW1vZF9hZGRfdGltZXIoJmFmc19tbnRwdF9leHBpcnlfdGltZXIsCisJCQkJCWFmc19tbnRwdF9leHBpcnlfdGltZW91dCAqIEhaKTsKKwl9CisKKwlhZnNjbV91c2FnZSsrOworCXVwX3dyaXRlKCZhZnNjbV9zZW0pOworCisJcmV0dXJuIDA7CisKKyBraWxsOgorCWthZnNjbWRfZGllID0gMTsKKwl3YWtlX3VwKCZrYWZzY21kX3NsZWVwcSk7CisJd2FpdF9mb3JfY29tcGxldGlvbigma2Fmc2NtZF9kZWFkKTsKKworIG91dDoKKwl1cF93cml0ZSgmYWZzY21fc2VtKTsKKwlyZXR1cm4gcmV0OworCit9IC8qIGVuZCBhZnNjbV9zdGFydCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBzdG9wIHRoZSBjYWNoZSBtYW5hZ2VyIHNlcnZpY2UKKyAqLwordm9pZCBhZnNjbV9zdG9wKHZvaWQpCit7CisJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGw7CisKKwlkb3duX3dyaXRlKCZhZnNjbV9zZW0pOworCisJQlVHX09OKGFmc2NtX3VzYWdlID09IDApOworCWFmc2NtX3VzYWdlLS07CisKKwlpZiAoYWZzY21fdXNhZ2UgPT0gMCkgeworCQkvKiBkb24ndCB3YW50IG1vcmUgaW5jb21pbmcgY2FsbHMgKi8KKwkJcnhycGNfZGVsX3NlcnZpY2UoYWZzX3RyYW5zcG9ydCwgJkFGU0NNX3NlcnZpY2UpOworCisJCS8qIGFib3J0IGFueSBjYWxscyBJJ3ZlIHN0aWxsIGdvdCBvcGVuICh0aGUgYWZzY21fZXJyb3IoKSB3aWxsCisJCSAqIGRlcXVldWUgdGhlbSkgKi8KKwkJc3Bpbl9sb2NrKCZhZnNjbV9jYWxsc19sb2NrKTsKKwkJd2hpbGUgKCFsaXN0X2VtcHR5KCZhZnNjbV9jYWxscykpIHsKKwkJCWNhbGwgPSBsaXN0X2VudHJ5KGFmc2NtX2NhbGxzLm5leHQsCisJCQkJCSAgc3RydWN0IHJ4cnBjX2NhbGwsCisJCQkJCSAgYXBwX2xpbmspOworCisJCQlsaXN0X2RlbF9pbml0KCZjYWxsLT5hcHBfbGluayk7CisJCQlyeHJwY19nZXRfY2FsbChjYWxsKTsKKwkJCXNwaW5fdW5sb2NrKCZhZnNjbV9jYWxsc19sb2NrKTsKKworCQkJcnhycGNfY2FsbF9hYm9ydChjYWxsLCAtRVNSQ0gpOyAvKiBhYm9ydCwgZGVxdWV1ZSBhbmQKKwkJCQkJCQkgKiBwdXQgKi8KKworCQkJX2RlYnVnKCJudWtpbmcgYWN0aXZlIGNhbGwgJTA4eC4lZCIsCisJCQkgICAgICAgbnRvaGwoY2FsbC0+Y29ubi0+Y29ubl9pZCksCisJCQkgICAgICAgbnRvaGwoY2FsbC0+Y2FsbF9pZCkpOworCQkJcnhycGNfcHV0X2NhbGwoY2FsbCk7CisJCQlyeHJwY19wdXRfY2FsbChjYWxsKTsKKworCQkJc3Bpbl9sb2NrKCZhZnNjbV9jYWxsc19sb2NrKTsKKwkJfQorCQlzcGluX3VubG9jaygmYWZzY21fY2FsbHNfbG9jayk7CisKKwkJLyogZ2V0IHJpZCBvZiBteSBkYWVtb24gKi8KKwkJa2Fmc2NtZF9kaWUgPSAxOworCQl3YWtlX3VwKCZrYWZzY21kX3NsZWVwcSk7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmthZnNjbWRfZGVhZCk7CisKKwkJLyogZGlzcG9zZSBvZiBhbnkgY2FsbHMgd2FpdGluZyBmb3IgYXR0ZW50aW9uICovCisJCXNwaW5fbG9jaygma2Fmc2NtZF9hdHRlbnRpb25fbG9jayk7CisJCXdoaWxlICghbGlzdF9lbXB0eSgma2Fmc2NtZF9hdHRlbnRpb25fbGlzdCkpIHsKKwkJCWNhbGwgPSBsaXN0X2VudHJ5KGthZnNjbWRfYXR0ZW50aW9uX2xpc3QubmV4dCwKKwkJCQkJICBzdHJ1Y3QgcnhycGNfY2FsbCwKKwkJCQkJICBhcHBfYXR0bl9saW5rKTsKKworCQkJbGlzdF9kZWxfaW5pdCgmY2FsbC0+YXBwX2F0dG5fbGluayk7CisJCQlzcGluX3VubG9jaygma2Fmc2NtZF9hdHRlbnRpb25fbG9jayk7CisKKwkJCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOworCisJCQlzcGluX2xvY2soJmthZnNjbWRfYXR0ZW50aW9uX2xvY2spOworCQl9CisJCXNwaW5fdW5sb2NrKCZrYWZzY21kX2F0dGVudGlvbl9sb2NrKTsKKworCQlhZnNfa2Fmc3RpbW9kX2RlbF90aW1lcigmYWZzX21udHB0X2V4cGlyeV90aW1lcik7CisJfQorCisJdXBfd3JpdGUoJmFmc2NtX3NlbSk7CisKK30gLyogZW5kIGFmc2NtX3N0b3AoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogaGFuZGxlIHRoZSBmaWxlc2VydmVyIGJyZWFraW5nIGEgc2V0IG9mIGNhbGxiYWNrcworICovCitzdGF0aWMgdm9pZCBfU1JYQUZTQ01fQ2FsbEJhY2soc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCit7CisJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcjsKKwlzaXplX3QgY291bnQsIHF0eSwgdG1wOworCWludCByZXQgPSAwLCByZW1vdmVkOworCisJX2VudGVyKCIlcHthY3M9JXN9IiwgY2FsbCwgcnhycGNfY2FsbF9zdGF0ZXNbY2FsbC0+YXBwX2NhbGxfc3RhdGVdKTsKKworCXNlcnZlciA9IGFmc19zZXJ2ZXJfZ2V0X2Zyb21fcGVlcihjYWxsLT5jb25uLT5wZWVyKTsKKworCXN3aXRjaCAoY2FsbC0+YXBwX2NhbGxfc3RhdGUpIHsKKwkJLyogd2UndmUgcmVjZWl2ZWQgdGhlIGxhc3QgcGFja2V0CisJCSAqIC0gZHJhaW4gYWxsIHRoZSBkYXRhIGZyb20gdGhlIGNhbGwgYW5kIHNlbmQgdGhlIHJlcGx5CisJCSAqLworCWNhc2UgUlhSUENfQ1NUQVRFX1NSVlJfR09UX0FSR1M6CisJCXJldCA9IC1FQkFETVNHOworCQlxdHkgPSBjYWxsLT5hcHBfcmVhZHlfcXR5OworCQlpZiAocXR5IDwgOCB8fCBxdHkgPiA1MCAqICg2ICogNCkgKyA4KQorCQkJYnJlYWs7CisKKwkJeworCQkJc3RydWN0IGFmc19jYWxsYmFjayAqY2IsICpwY2I7CisJCQlpbnQgbG9vcDsKKwkJCV9fYmUzMiAqZnAsICpicDsKKworCQkJZnAgPSByeHJwY19jYWxsX2FsbG9jX3NjcmF0Y2goY2FsbCwgcXR5KTsKKworCQkJLyogZHJhZyB0aGUgZW50aXJlIGFyZ3VtZW50IGJsb2NrIG91dCB0byB0aGUgc2NyYXRjaAorCQkJICogc3BhY2UgKi8KKwkJCXJldCA9IHJ4cnBjX2NhbGxfcmVhZF9kYXRhKGNhbGwsIGZwLCBxdHksIDApOworCQkJaWYgKHJldCA8IDApCisJCQkJYnJlYWs7CisKKwkJCS8qIGFuZCB1bm1hcnNoYWxsIHRoZSBwYXJhbWV0ZXIgYmxvY2sgKi8KKwkJCXJldCA9IC1FQkFETVNHOworCQkJY291bnQgPSBudG9obCgqZnArKyk7CisJCQlpZiAoY291bnQ+QUZTQ0JNQVggfHwKKwkJCSAgICAoY291bnQgKiAoMyAqIDQpICsgOCAhPSBxdHkgJiYKKwkJCSAgICAgY291bnQgKiAoNiAqIDQpICsgOCAhPSBxdHkpKQorCQkJCWJyZWFrOworCisJCQlicCA9IGZwICsgY291bnQqMzsKKwkJCXRtcCA9IG50b2hsKCpicCsrKTsKKwkJCWlmICh0bXAgPiAwICYmIHRtcCAhPSBjb3VudCkKKwkJCQlicmVhazsKKwkJCWlmICh0bXAgPT0gMCkKKwkJCQlicCA9IE5VTEw7CisKKwkJCXBjYiA9IGNiID0gcnhycGNfY2FsbF9hbGxvY19zY3JhdGNoX3MoCisJCQkJY2FsbCwgc3RydWN0IGFmc19jYWxsYmFjayk7CisKKwkJCWZvciAobG9vcCA9IGNvdW50IC0gMTsgbG9vcCA+PSAwOyBsb29wLS0pIHsKKwkJCQlwY2ItPmZpZC52aWQJPSBudG9obCgqZnArKyk7CisJCQkJcGNiLT5maWQudm5vZGUJPSBudG9obCgqZnArKyk7CisJCQkJcGNiLT5maWQudW5pcXVlCT0gbnRvaGwoKmZwKyspOworCQkJCWlmIChicCkgeworCQkJCQlwY2ItPnZlcnNpb24JPSBudG9obCgqYnArKyk7CisJCQkJCXBjYi0+ZXhwaXJ5CT0gbnRvaGwoKmJwKyspOworCQkJCQlwY2ItPnR5cGUJPSBudG9obCgqYnArKyk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlwY2ItPnZlcnNpb24JPSAwOworCQkJCQlwY2ItPmV4cGlyeQk9IDA7CisJCQkJCXBjYi0+dHlwZQk9IEFGU0NNX0NCX1VOVFlQRUQ7CisJCQkJfQorCQkJCXBjYisrOworCQkJfQorCisJCQkvKiBpbnZva2UgdGhlIGFjdHVhbCBzZXJ2aWNlIHJvdXRpbmUgKi8KKwkJCXJldCA9IFNSWEFGU0NNX0NhbGxCYWNrKHNlcnZlciwgY291bnQsIGNiKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWJyZWFrOworCQl9CisKKwkJLyogc2VuZCB0aGUgcmVwbHkgKi8KKwkJcmV0ID0gcnhycGNfY2FsbF93cml0ZV9kYXRhKGNhbGwsIDAsIE5VTEwsIFJYUlBDX0xBU1RfUEFDS0VULAorCQkJCQkgICAgR0ZQX0tFUk5FTCwgMCwgJmNvdW50KTsKKwkJaWYgKHJldCA8IDApCisJCQlicmVhazsKKwkJYnJlYWs7CisKKwkJLyogb3BlcmF0aW9uIGNvbXBsZXRlICovCisJY2FzZSBSWFJQQ19DU1RBVEVfQ09NUExFVEU6CisJCWNhbGwtPmFwcF91c2VyID0gTlVMTDsKKwkJcmVtb3ZlZCA9IDA7CisJCXNwaW5fbG9jaygmYWZzY21fY2FsbHNfbG9jayk7CisJCWlmICghbGlzdF9lbXB0eSgmY2FsbC0+YXBwX2xpbmspKSB7CisJCQlsaXN0X2RlbF9pbml0KCZjYWxsLT5hcHBfbGluayk7CisJCQlyZW1vdmVkID0gMTsKKwkJfQorCQlzcGluX3VubG9jaygmYWZzY21fY2FsbHNfbG9jayk7CisKKwkJaWYgKHJlbW92ZWQpCisJCQlyeHJwY19wdXRfY2FsbChjYWxsKTsKKwkJYnJlYWs7CisKKwkJLyogb3BlcmF0aW9uIHRlcm1pbmF0ZWQgb24gZXJyb3IgKi8KKwljYXNlIFJYUlBDX0NTVEFURV9FUlJPUjoKKwkJY2FsbC0+YXBwX3VzZXIgPSBOVUxMOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWlmIChyZXQgPCAwKQorCQlyeHJwY19jYWxsX2Fib3J0KGNhbGwsIHJldCk7CisKKwlhZnNfcHV0X3NlcnZlcihzZXJ2ZXIpOworCisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisKK30gLyogZW5kIF9TUlhBRlNDTV9DYWxsQmFjaygpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBoYW5kbGUgdGhlIGZpbGVzZXJ2ZXIgYXNraW5nIHVzIHRvIGluaXRpYWxpc2Ugb3VyIGNhbGxiYWNrIHN0YXRlCisgKi8KK3N0YXRpYyB2b2lkIF9TUlhBRlNDTV9Jbml0Q2FsbEJhY2tTdGF0ZShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3sKKwlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOworCXNpemVfdCBjb3VudDsKKwlpbnQgcmV0ID0gMCwgcmVtb3ZlZDsKKworCV9lbnRlcigiJXB7YWNzPSVzfSIsIGNhbGwsIHJ4cnBjX2NhbGxfc3RhdGVzW2NhbGwtPmFwcF9jYWxsX3N0YXRlXSk7CisKKwlzZXJ2ZXIgPSBhZnNfc2VydmVyX2dldF9mcm9tX3BlZXIoY2FsbC0+Y29ubi0+cGVlcik7CisKKwlzd2l0Y2ggKGNhbGwtPmFwcF9jYWxsX3N0YXRlKSB7CisJCS8qIHdlJ3ZlIHJlY2VpdmVkIHRoZSBsYXN0IHBhY2tldCAtIGRyYWluIGFsbCB0aGUgZGF0YSBmcm9tIHRoZQorCQkgKiBjYWxsICovCisJY2FzZSBSWFJQQ19DU1RBVEVfU1JWUl9HT1RfQVJHUzoKKwkJLyogc2hvdWxkbid0IGJlIGFueSBhcmdzICovCisJCXJldCA9IC1FQkFETVNHOworCQlicmVhazsKKworCQkvKiBzZW5kIHRoZSByZXBseSB3aGVuIGFza2VkIGZvciBpdCAqLworCWNhc2UgUlhSUENfQ1NUQVRFX1NSVlJfU05EX1JFUExZOgorCQkvKiBpbnZva2UgdGhlIGFjdHVhbCBzZXJ2aWNlIHJvdXRpbmUgKi8KKwkJcmV0ID0gU1JYQUZTQ01fSW5pdENhbGxCYWNrU3RhdGUoc2VydmVyKTsKKwkJaWYgKHJldCA8IDApCisJCQlicmVhazsKKworCQlyZXQgPSByeHJwY19jYWxsX3dyaXRlX2RhdGEoY2FsbCwgMCwgTlVMTCwgUlhSUENfTEFTVF9QQUNLRVQsCisJCQkJCSAgICBHRlBfS0VSTkVMLCAwLCAmY291bnQpOworCQlpZiAocmV0IDwgMCkKKwkJCWJyZWFrOworCQlicmVhazsKKworCQkvKiBvcGVyYXRpb24gY29tcGxldGUgKi8KKwljYXNlIFJYUlBDX0NTVEFURV9DT01QTEVURToKKwkJY2FsbC0+YXBwX3VzZXIgPSBOVUxMOworCQlyZW1vdmVkID0gMDsKKwkJc3Bpbl9sb2NrKCZhZnNjbV9jYWxsc19sb2NrKTsKKwkJaWYgKCFsaXN0X2VtcHR5KCZjYWxsLT5hcHBfbGluaykpIHsKKwkJCWxpc3RfZGVsX2luaXQoJmNhbGwtPmFwcF9saW5rKTsKKwkJCXJlbW92ZWQgPSAxOworCQl9CisJCXNwaW5fdW5sb2NrKCZhZnNjbV9jYWxsc19sb2NrKTsKKworCQlpZiAocmVtb3ZlZCkKKwkJCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOworCQlicmVhazsKKworCQkvKiBvcGVyYXRpb24gdGVybWluYXRlZCBvbiBlcnJvciAqLworCWNhc2UgUlhSUENfQ1NUQVRFX0VSUk9SOgorCQljYWxsLT5hcHBfdXNlciA9IE5VTEw7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJaWYgKHJldCA8IDApCisJCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwgcmV0KTsKKworCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CisKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKworfSAvKiBlbmQgX1NSWEFGU0NNX0luaXRDYWxsQmFja1N0YXRlKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGhhbmRsZSBhIHByb2JlIGZyb20gYSBmaWxlc2VydmVyCisgKi8KK3N0YXRpYyB2b2lkIF9TUlhBRlNDTV9Qcm9iZShzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3sKKwlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOworCXNpemVfdCBjb3VudDsKKwlpbnQgcmV0ID0gMCwgcmVtb3ZlZDsKKworCV9lbnRlcigiJXB7YWNzPSVzfSIsIGNhbGwsIHJ4cnBjX2NhbGxfc3RhdGVzW2NhbGwtPmFwcF9jYWxsX3N0YXRlXSk7CisKKwlzZXJ2ZXIgPSBhZnNfc2VydmVyX2dldF9mcm9tX3BlZXIoY2FsbC0+Y29ubi0+cGVlcik7CisKKwlzd2l0Y2ggKGNhbGwtPmFwcF9jYWxsX3N0YXRlKSB7CisJCS8qIHdlJ3ZlIHJlY2VpdmVkIHRoZSBsYXN0IHBhY2tldCAtIGRyYWluIGFsbCB0aGUgZGF0YSBmcm9tIHRoZQorCQkgKiBjYWxsICovCisJY2FzZSBSWFJQQ19DU1RBVEVfU1JWUl9HT1RfQVJHUzoKKwkJLyogc2hvdWxkbid0IGJlIGFueSBhcmdzICovCisJCXJldCA9IC1FQkFETVNHOworCQlicmVhazsKKworCQkvKiBzZW5kIHRoZSByZXBseSB3aGVuIGFza2VkIGZvciBpdCAqLworCWNhc2UgUlhSUENfQ1NUQVRFX1NSVlJfU05EX1JFUExZOgorCQkvKiBpbnZva2UgdGhlIGFjdHVhbCBzZXJ2aWNlIHJvdXRpbmUgKi8KKwkJcmV0ID0gU1JYQUZTQ01fUHJvYmUoc2VydmVyKTsKKwkJaWYgKHJldCA8IDApCisJCQlicmVhazsKKworCQlyZXQgPSByeHJwY19jYWxsX3dyaXRlX2RhdGEoY2FsbCwgMCwgTlVMTCwgUlhSUENfTEFTVF9QQUNLRVQsCisJCQkJCSAgICBHRlBfS0VSTkVMLCAwLCAmY291bnQpOworCQlpZiAocmV0IDwgMCkKKwkJCWJyZWFrOworCQlicmVhazsKKworCQkvKiBvcGVyYXRpb24gY29tcGxldGUgKi8KKwljYXNlIFJYUlBDX0NTVEFURV9DT01QTEVURToKKwkJY2FsbC0+YXBwX3VzZXIgPSBOVUxMOworCQlyZW1vdmVkID0gMDsKKwkJc3Bpbl9sb2NrKCZhZnNjbV9jYWxsc19sb2NrKTsKKwkJaWYgKCFsaXN0X2VtcHR5KCZjYWxsLT5hcHBfbGluaykpIHsKKwkJCWxpc3RfZGVsX2luaXQoJmNhbGwtPmFwcF9saW5rKTsKKwkJCXJlbW92ZWQgPSAxOworCQl9CisJCXNwaW5fdW5sb2NrKCZhZnNjbV9jYWxsc19sb2NrKTsKKworCQlpZiAocmVtb3ZlZCkKKwkJCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOworCQlicmVhazsKKworCQkvKiBvcGVyYXRpb24gdGVybWluYXRlZCBvbiBlcnJvciAqLworCWNhc2UgUlhSUENfQ1NUQVRFX0VSUk9SOgorCQljYWxsLT5hcHBfdXNlciA9IE5VTEw7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJaWYgKHJldCA8IDApCisJCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwgcmV0KTsKKworCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CisKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKworfSAvKiBlbmQgX1NSWEFGU0NNX1Byb2JlKCkgKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9jbXNlcnZpY2UuaCBiL2ZzL2Fmcy9jbXNlcnZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjhkNGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL2Ntc2VydmljZS5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qIGNtc2VydmljZS5oOiBBRlMgQ2FjaGUgTWFuYWdlciBTZXJ2aWNlIGRlY2xhcmF0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9BRlNfQ01TRVJWSUNFX0gKKyNkZWZpbmUgX0xJTlVYX0FGU19DTVNFUlZJQ0VfSAorCisjaW5jbHVkZSA8cnhycGMvdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSAidHlwZXMuaCIKKworLyogY2FjaGUgbWFuYWdlciBzdGFydC9zdG9wICovCitleHRlcm4gaW50IGFmc2NtX3N0YXJ0KHZvaWQpOworZXh0ZXJuIHZvaWQgYWZzY21fc3RvcCh2b2lkKTsKKworLyogY2FjaGUgbWFuYWdlciBzZXJ2ZXIgZnVuY3Rpb25zICovCitleHRlcm4gaW50IFNSWEFGU0NNX0luaXRDYWxsQmFja1N0YXRlKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIpOworZXh0ZXJuIGludCBTUlhBRlNDTV9DYWxsQmFjayhzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAorCQkJICAgICBzaXplX3QgY291bnQsCisJCQkgICAgIHN0cnVjdCBhZnNfY2FsbGJhY2sgY2FsbGJhY2tzW10pOworZXh0ZXJuIGludCBTUlhBRlNDTV9Qcm9iZShzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyKTsKKworI2VuZGlmIC8qIF9MSU5VWF9BRlNfQ01TRVJWSUNFX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9kaXIuYyBiL2ZzL2Fmcy9kaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjgyZDZkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL2Rpci5jCkBAIC0wLDAgKzEsNjY2IEBACisvKiBkaXIuYzogQUZTIGZpbGVzeXN0ZW0gZGlyZWN0b3J5IGhhbmRsaW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlICJ2bm9kZS5oIgorI2luY2x1ZGUgInZvbHVtZS5oIgorI2luY2x1ZGUgPHJ4cnBjL2NhbGwuaD4KKyNpbmNsdWRlICJzdXBlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICphZnNfZGlyX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJCSAgICAgc3RydWN0IG5hbWVpZGF0YSAqbmQpOworc3RhdGljIGludCBhZnNfZGlyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIGludCBhZnNfZGlyX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpOworc3RhdGljIGludCBhZnNfZF9yZXZhbGlkYXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpOworc3RhdGljIGludCBhZnNfZF9kZWxldGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKK3N0YXRpYyBpbnQgYWZzX2Rpcl9sb29rdXBfZmlsbGRpcih2b2lkICpfY29va2llLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmxlbiwKKwkJCQkgIGxvZmZfdCBmcG9zLCBpbm9fdCBpbm8sIHVuc2lnbmVkIGR0eXBlKTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhZnNfZGlyX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSBhZnNfZGlyX29wZW4sCisJLnJlYWRkaXIJPSBhZnNfZGlyX3JlYWRkaXIsCit9OworCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBhZnNfZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLmxvb2t1cAkJPSBhZnNfZGlyX2xvb2t1cCwKKwkuZ2V0YXR0cgk9IGFmc19pbm9kZV9nZXRhdHRyLAorI2lmIDAgLyogVE9ETyAqLworCS5jcmVhdGUJCT0gYWZzX2Rpcl9jcmVhdGUsCisJLmxpbmsJCT0gYWZzX2Rpcl9saW5rLAorCS51bmxpbmsJCT0gYWZzX2Rpcl91bmxpbmssCisJLnN5bWxpbmsJPSBhZnNfZGlyX3N5bWxpbmssCisJLm1rZGlyCQk9IGFmc19kaXJfbWtkaXIsCisJLnJtZGlyCQk9IGFmc19kaXJfcm1kaXIsCisJLm1rbm9kCQk9IGFmc19kaXJfbWtub2QsCisJLnJlbmFtZQkJPSBhZnNfZGlyX3JlbmFtZSwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBhZnNfZnNfZGVudHJ5X29wZXJhdGlvbnMgPSB7CisJLmRfcmV2YWxpZGF0ZQk9IGFmc19kX3JldmFsaWRhdGUsCisJLmRfZGVsZXRlCT0gYWZzX2RfZGVsZXRlLAorfTsKKworI2RlZmluZSBBRlNfRElSX0hBU0hUQkxfU0laRQkxMjgKKyNkZWZpbmUgQUZTX0RJUl9ESVJFTlRfU0laRQkzMgorI2RlZmluZSBBRlNfRElSRU5UX1BFUl9CTE9DSwk2NAorCit1bmlvbiBhZnNfZGlyZW50IHsKKwlzdHJ1Y3QgeworCQl1aW50OF90CQl2YWxpZDsKKwkJdWludDhfdAkJdW51c2VkWzFdOworCQlfX2JlMTYJCWhhc2hfbmV4dDsKKwkJX19iZTMyCQl2bm9kZTsKKwkJX19iZTMyCQl1bmlxdWU7CisJCXVpbnQ4X3QJCW5hbWVbMTZdOworCQl1aW50OF90CQlvdmVyZmxvd1s0XTsJLyogaWYgYW55IGNoYXIgb2YgdGhlIG5hbWUgKGluYworCQkJCQkJICogTlVMKSByZWFjaGVzIGhlcmUsIGNvbnN1bWUKKwkJCQkJCSAqIHRoZSBuZXh0IGRpcmVudCB0b28gKi8KKwl9IHU7CisJdWludDhfdAlleHRlbmRlZF9uYW1lWzMyXTsKK307CisKKy8qIEFGUyBkaXJlY3RvcnkgcGFnZSBoZWFkZXIgKG9uZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGV2ZXJ5IDIwNDgtYnl0ZSBjaHVuaykgKi8KK3N0cnVjdCBhZnNfZGlyX3BhZ2VoZHIgeworCV9fYmUxNgkJbnBhZ2VzOworCV9fYmUxNgkJbWFnaWM7CisjZGVmaW5lIEFGU19ESVJfTUFHSUMgaHRvbnMoMTIzNCkKKwl1aW50OF90CQluZW50cmllczsKKwl1aW50OF90CQliaXRtYXBbOF07CisJdWludDhfdAkJcGFkWzE5XTsKK307CisKKy8qIGRpcmVjdG9yeSBibG9jayBsYXlvdXQgKi8KK3VuaW9uIGFmc19kaXJfYmxvY2sgeworCisJc3RydWN0IGFmc19kaXJfcGFnZWhkciBwYWdlaGRyOworCisJc3RydWN0IHsKKwkJc3RydWN0IGFmc19kaXJfcGFnZWhkcglwYWdlaGRyOworCQl1aW50OF90CQkJYWxsb2NfY3Ryc1sxMjhdOworCQkvKiBkaXIgaGFzaCB0YWJsZSAqLworCQl1aW50MTZfdAkJaGFzaHRhYmxlW0FGU19ESVJfSEFTSFRCTF9TSVpFXTsKKwl9IGhkcjsKKworCXVuaW9uIGFmc19kaXJlbnQgZGlyZW50c1tBRlNfRElSRU5UX1BFUl9CTE9DS107Cit9OworCisvKiBsYXlvdXQgb24gYSBsaW51eCBWTSBwYWdlICovCitzdHJ1Y3QgYWZzX2Rpcl9wYWdlIHsKKwl1bmlvbiBhZnNfZGlyX2Jsb2NrIGJsb2Nrc1tQQUdFX1NJWkUgLyBzaXplb2YodW5pb24gYWZzX2Rpcl9ibG9jayldOworfTsKKworc3RydWN0IGFmc19kaXJfbG9va3VwX2Nvb2tpZSB7CisJc3RydWN0IGFmc19maWQJZmlkOworCWNvbnN0IGNoYXIJKm5hbWU7CisJc2l6ZV90CQlubGVuOworCWludAkJZm91bmQ7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogY2hlY2sgdGhhdCBhIGRpcmVjdG9yeSBwYWdlIGlzIHZhbGlkCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhZnNfZGlyX2NoZWNrX3BhZ2Uoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBhZnNfZGlyX3BhZ2UgKmRidWY7CisJbG9mZl90IGxhdHRlcjsKKwlpbnQgdG1wLCBxdHk7CisKKyNpZiAwCisJLyogY2hlY2sgdGhlIHBhZ2UgY291bnQgKi8KKwlxdHkgPSBkZXNjLnNpemUgLyBzaXplb2YoZGJ1Zi0+YmxvY2tzWzBdKTsKKwlpZiAocXR5ID09IDApCisJCWdvdG8gZXJyb3I7CisKKwlpZiAocGFnZS0+aW5kZXg9PTAgJiYgcXR5IT1udG9ocyhkYnVmLT5ibG9ja3NbMF0ucGFnZWhkci5ucGFnZXMpKSB7CisJCXByaW50aygia0FGUzogJXMoJWx1KTogd3JvbmcgbnVtYmVyIG9mIGRpciBibG9ja3MgJWQhPSVodVxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXyxkaXItPmlfaW5vLHF0eSxudG9ocyhkYnVmLT5ibG9ja3NbMF0ucGFnZWhkci5ucGFnZXMpKTsKKwkJZ290byBlcnJvcjsKKwl9CisjZW5kaWYKKworCS8qIGRldGVybWluZSBob3cgbWFueSBtYWdpYyBudW1iZXJzIHRoZXJlIHNob3VsZCBiZSBpbiB0aGlzIHBhZ2UgKi8KKwlsYXR0ZXIgPSBkaXItPmlfc2l6ZSAtIChwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKTsKKwlpZiAobGF0dGVyID49IFBBR0VfU0laRSkKKwkJcXR5ID0gUEFHRV9TSVpFOworCWVsc2UKKwkJcXR5ID0gbGF0dGVyOworCXF0eSAvPSBzaXplb2YodW5pb24gYWZzX2Rpcl9ibG9jayk7CisKKwkvKiBjaGVjayB0aGVtICovCisJZGJ1ZiA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwlmb3IgKHRtcCA9IDA7IHRtcCA8IHF0eTsgdG1wKyspIHsKKwkJaWYgKGRidWYtPmJsb2Nrc1t0bXBdLnBhZ2VoZHIubWFnaWMgIT0gQUZTX0RJUl9NQUdJQykgeworCQkJcHJpbnRrKCJrQUZTOiAlcyglbHUpOiBiYWQgbWFnaWMgJWQvJWQgaXMgJTA0aHhcbiIsCisJCQkgICAgICAgX19GVU5DVElPTl9fLCBkaXItPmlfaW5vLCB0bXAsIHF0eSwKKwkJCSAgICAgICBudG9ocyhkYnVmLT5ibG9ja3NbdG1wXS5wYWdlaGRyLm1hZ2ljKSk7CisJCQlnb3RvIGVycm9yOworCQl9CisJfQorCisJU2V0UGFnZUNoZWNrZWQocGFnZSk7CisJcmV0dXJuOworCisgZXJyb3I6CisJU2V0UGFnZUNoZWNrZWQocGFnZSk7CisJU2V0UGFnZUVycm9yKHBhZ2UpOworCit9IC8qIGVuZCBhZnNfZGlyX2NoZWNrX3BhZ2UoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZGlzY2FyZCBhIHBhZ2UgY2FjaGVkIGluIHRoZSBwYWdlY2FjaGUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGFmc19kaXJfcHV0X3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJa3VubWFwKHBhZ2UpOworCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKworfSAvKiBlbmQgYWZzX2Rpcl9wdXRfcGFnZSgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBnZXQgYSBwYWdlIGludG8gdGhlIHBhZ2VjYWNoZQorICovCitzdGF0aWMgc3RydWN0IHBhZ2UgKmFmc19kaXJfZ2V0X3BhZ2Uoc3RydWN0IGlub2RlICpkaXIsIHVuc2lnbmVkIGxvbmcgaW5kZXgpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlfZW50ZXIoInslbHV9LCVsdSIsIGRpci0+aV9pbm8sIGluZGV4KTsKKworCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UoZGlyLT5pX21hcHBpbmcsaW5kZXgsCisJCQkgICAgICAgKGZpbGxlcl90ICopIGRpci0+aV9tYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2UsCisJCQkgICAgICAgTlVMTCk7CisJaWYgKCFJU19FUlIocGFnZSkpIHsKKwkJd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKKwkJa21hcChwYWdlKTsKKwkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpCisJCQlnb3RvIGZhaWw7CisJCWlmICghUGFnZUNoZWNrZWQocGFnZSkpCisJCQlhZnNfZGlyX2NoZWNrX3BhZ2UoZGlyLCBwYWdlKTsKKwkJaWYgKFBhZ2VFcnJvcihwYWdlKSkKKwkJCWdvdG8gZmFpbDsKKwl9CisJcmV0dXJuIHBhZ2U7CisKKyBmYWlsOgorCWFmc19kaXJfcHV0X3BhZ2UocGFnZSk7CisJcmV0dXJuIEVSUl9QVFIoLUVJTyk7Cit9IC8qIGVuZCBhZnNfZGlyX2dldF9wYWdlKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIG9wZW4gYW4gQUZTIGRpcmVjdG9yeSBmaWxlCisgKi8KK3N0YXRpYyBpbnQgYWZzX2Rpcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCV9lbnRlcigieyVsdX0iLCBpbm9kZS0+aV9pbm8pOworCisJQlVHX09OKHNpemVvZih1bmlvbiBhZnNfZGlyX2Jsb2NrKSAhPSAyMDQ4KTsKKwlCVUdfT04oc2l6ZW9mKHVuaW9uIGFmc19kaXJlbnQpICE9IDMyKTsKKworCWlmIChBRlNfRlNfSShpbm9kZSktPmZsYWdzICYgQUZTX1ZOT0RFX0RFTEVURUQpCisJCXJldHVybiAtRU5PRU5UOworCisJX2xlYXZlKCIgPSAwIik7CisJcmV0dXJuIDA7CisKK30gLyogZW5kIGFmc19kaXJfb3BlbigpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBkZWFsIHdpdGggb25lIGJsb2NrIGluIGFuIEFGUyBkaXJlY3RvcnkKKyAqLworc3RhdGljIGludCBhZnNfZGlyX2l0ZXJhdGVfYmxvY2sodW5zaWduZWQgKmZwb3MsCisJCQkJIHVuaW9uIGFmc19kaXJfYmxvY2sgKmJsb2NrLAorCQkJCSB1bnNpZ25lZCBibGtvZmYsCisJCQkJIHZvaWQgKmNvb2tpZSwKKwkJCQkgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJdW5pb24gYWZzX2RpcmVudCAqZGlyZTsKKwl1bnNpZ25lZCBvZmZzZXQsIG5leHQsIGN1cnI7CisJc2l6ZV90IG5sZW47CisJaW50IHRtcCwgcmV0OworCisJX2VudGVyKCIldSwleCwlcCwsIiwqZnBvcyxibGtvZmYsYmxvY2spOworCisJY3VyciA9ICgqZnBvcyAtIGJsa29mZikgLyBzaXplb2YodW5pb24gYWZzX2RpcmVudCk7CisKKwkvKiB3YWxrIHRocm91Z2ggdGhlIGJsb2NrLCBhbiBlbnRyeSBhdCBhIHRpbWUgKi8KKwlmb3IgKG9mZnNldCA9IEFGU19ESVJFTlRfUEVSX0JMT0NLIC0gYmxvY2stPnBhZ2VoZHIubmVudHJpZXM7CisJICAgICBvZmZzZXQgPCBBRlNfRElSRU5UX1BFUl9CTE9DSzsKKwkgICAgIG9mZnNldCA9IG5leHQKKwkgICAgICkgeworCQluZXh0ID0gb2Zmc2V0ICsgMTsKKworCQkvKiBza2lwIGVudHJpZXMgbWFya2VkIHVudXNlZCBpbiB0aGUgYml0bWFwICovCisJCWlmICghKGJsb2NrLT5wYWdlaGRyLmJpdG1hcFtvZmZzZXQgLyA4XSAmCisJCSAgICAgICgxIDw8IChvZmZzZXQgJSA4KSkpKSB7CisJCQlfZGVidWcoIkVOVFslWnUuJXVdOiB1bnVzZWRcbiIsCisJCQkgICAgICAgYmxrb2ZmIC8gc2l6ZW9mKHVuaW9uIGFmc19kaXJfYmxvY2spLCBvZmZzZXQpOworCQkJaWYgKG9mZnNldCA+PSBjdXJyKQorCQkJCSpmcG9zID0gYmxrb2ZmICsKKwkJCQkJbmV4dCAqIHNpemVvZih1bmlvbiBhZnNfZGlyZW50KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogZ290IGEgdmFsaWQgZW50cnkgKi8KKwkJZGlyZSA9ICZibG9jay0+ZGlyZW50c1tvZmZzZXRdOworCQlubGVuID0gc3RybmxlbihkaXJlLT51Lm5hbWUsCisJCQkgICAgICAgc2l6ZW9mKCpibG9jaykgLQorCQkJICAgICAgIG9mZnNldCAqIHNpemVvZih1bmlvbiBhZnNfZGlyZW50KSk7CisKKwkJX2RlYnVnKCJFTlRbJVp1LiV1XTogJXMgJVp1IFwiJXNcIlxuIiwKKwkJICAgICAgIGJsa29mZiAvIHNpemVvZih1bmlvbiBhZnNfZGlyX2Jsb2NrKSwgb2Zmc2V0LAorCQkgICAgICAgKG9mZnNldCA8IGN1cnIgPyAic2tpcCIgOiAiZmlsbCIpLAorCQkgICAgICAgbmxlbiwgZGlyZS0+dS5uYW1lKTsKKworCQkvKiB3b3JrIG91dCB3aGVyZSB0aGUgbmV4dCBwb3NzaWJsZSBlbnRyeSBpcyAqLworCQlmb3IgKHRtcCA9IG5sZW47IHRtcCA+IDE1OyB0bXAgLT0gc2l6ZW9mKHVuaW9uIGFmc19kaXJlbnQpKSB7CisJCQlpZiAobmV4dCA+PSBBRlNfRElSRU5UX1BFUl9CTE9DSykgeworCQkJCV9kZWJ1ZygiRU5UWyVadS4ldV06IgorCQkJCSAgICAgICAiICV1IHRyYXZlbGxlZCBiZXlvbmQgZW5kIGRpciBibG9jayIKKwkJCQkgICAgICAgIiAobGVuICV1LyVadSlcbiIsCisJCQkJICAgICAgIGJsa29mZiAvIHNpemVvZih1bmlvbiBhZnNfZGlyX2Jsb2NrKSwKKwkJCQkgICAgICAgb2Zmc2V0LCBuZXh0LCB0bXAsIG5sZW4pOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJaWYgKCEoYmxvY2stPnBhZ2VoZHIuYml0bWFwW25leHQgLyA4XSAmCisJCQkgICAgICAoMSA8PCAobmV4dCAlIDgpKSkpIHsKKwkJCQlfZGVidWcoIkVOVFslWnUuJXVdOiIKKwkJCQkgICAgICAgIiAldSB1bm1hcmtlZCBleHRlbnNpb24gKGxlbiAldS8lWnUpXG4iLAorCQkJCSAgICAgICBibGtvZmYgLyBzaXplb2YodW5pb24gYWZzX2Rpcl9ibG9jayksCisJCQkJICAgICAgIG9mZnNldCwgbmV4dCwgdG1wLCBubGVuKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKworCQkJX2RlYnVnKCJFTlRbJVp1LiV1XTogZXh0ICV1LyVadVxuIiwKKwkJCSAgICAgICBibGtvZmYgLyBzaXplb2YodW5pb24gYWZzX2Rpcl9ibG9jayksCisJCQkgICAgICAgbmV4dCwgdG1wLCBubGVuKTsKKwkJCW5leHQrKzsKKwkJfQorCisJCS8qIHNraXAgaWYgc3RhcnRzIGJlZm9yZSB0aGUgY3VycmVudCBwb3NpdGlvbiAqLworCQlpZiAob2Zmc2V0IDwgY3VycikKKwkJCWNvbnRpbnVlOworCisJCS8qIGZvdW5kIHRoZSBuZXh0IGVudHJ5ICovCisJCXJldCA9IGZpbGxkaXIoY29va2llLAorCQkJICAgICAgZGlyZS0+dS5uYW1lLAorCQkJICAgICAgbmxlbiwKKwkJCSAgICAgIGJsa29mZiArIG9mZnNldCAqIHNpemVvZih1bmlvbiBhZnNfZGlyZW50KSwKKwkJCSAgICAgIG50b2hsKGRpcmUtPnUudm5vZGUpLAorCQkJICAgICAgZmlsbGRpciA9PSBhZnNfZGlyX2xvb2t1cF9maWxsZGlyID8KKwkJCSAgICAgIG50b2hsKGRpcmUtPnUudW5pcXVlKSA6IERUX1VOS05PV04pOworCQlpZiAocmV0IDwgMCkgeworCQkJX2xlYXZlKCIgPSAwIFtmdWxsXSIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkqZnBvcyA9IGJsa29mZiArIG5leHQgKiBzaXplb2YodW5pb24gYWZzX2RpcmVudCk7CisJfQorCisJX2xlYXZlKCIgPSAxIFttb3JlXSIpOworCXJldHVybiAxOworfSAvKiBlbmQgYWZzX2Rpcl9pdGVyYXRlX2Jsb2NrKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHJlYWQgYW4gQUZTIGRpcmVjdG9yeQorICovCitzdGF0aWMgaW50IGFmc19kaXJfaXRlcmF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgdW5zaWduZWQgKmZwb3MsIHZvaWQgKmNvb2tpZSwKKwkJCSAgIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCXVuaW9uIGFmc19kaXJfYmxvY2sJKmRibG9jazsKKwlzdHJ1Y3QgYWZzX2Rpcl9wYWdlICpkYnVmOworCXN0cnVjdCBwYWdlICpwYWdlOworCXVuc2lnbmVkIGJsa29mZiwgbGltaXQ7CisJaW50IHJldDsKKworCV9lbnRlcigieyVsdX0sJXUsLCIsIGRpci0+aV9pbm8sICpmcG9zKTsKKworCWlmIChBRlNfRlNfSShkaXIpLT5mbGFncyAmIEFGU19WTk9ERV9ERUxFVEVEKSB7CisJCV9sZWF2ZSgiID0gLUVTVEFMRSIpOworCQlyZXR1cm4gLUVTVEFMRTsKKwl9CisKKwkvKiByb3VuZCB0aGUgZmlsZSBwb3NpdGlvbiB1cCB0byB0aGUgbmV4dCBlbnRyeSBib3VuZGFyeSAqLworCSpmcG9zICs9IHNpemVvZih1bmlvbiBhZnNfZGlyZW50KSAtIDE7CisJKmZwb3MgJj0gfihzaXplb2YodW5pb24gYWZzX2RpcmVudCkgLSAxKTsKKworCS8qIHdhbGsgdGhyb3VnaCB0aGUgYmxvY2tzIGluIHNlcXVlbmNlICovCisJcmV0ID0gMDsKKwl3aGlsZSAoKmZwb3MgPCBkaXItPmlfc2l6ZSkgeworCQlibGtvZmYgPSAqZnBvcyAmIH4oc2l6ZW9mKHVuaW9uIGFmc19kaXJfYmxvY2spIC0gMSk7CisKKwkJLyogZmV0Y2ggdGhlIGFwcHJvcHJpYXRlIHBhZ2UgZnJvbSB0aGUgZGlyZWN0b3J5ICovCisJCXBhZ2UgPSBhZnNfZGlyX2dldF9wYWdlKGRpciwgYmxrb2ZmIC8gUEFHRV9TSVpFKTsKKwkJaWYgKElTX0VSUihwYWdlKSkgeworCQkJcmV0ID0gUFRSX0VSUihwYWdlKTsKKwkJCWJyZWFrOworCQl9CisKKwkJbGltaXQgPSBibGtvZmYgJiB+KFBBR0VfU0laRSAtIDEpOworCisJCWRidWYgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisKKwkJLyogZGVhbCB3aXRoIHRoZSBpbmRpdmlkdWFsIGJsb2NrcyBzdGFzaGVkIG9uIHRoaXMgcGFnZSAqLworCQlkbyB7CisJCQlkYmxvY2sgPSAmZGJ1Zi0+YmxvY2tzWyhibGtvZmYgJSBQQUdFX1NJWkUpIC8KKwkJCQkJICAgICAgIHNpemVvZih1bmlvbiBhZnNfZGlyX2Jsb2NrKV07CisJCQlyZXQgPSBhZnNfZGlyX2l0ZXJhdGVfYmxvY2soZnBvcywgZGJsb2NrLCBibGtvZmYsCisJCQkJCQkgICAgY29va2llLCBmaWxsZGlyKTsKKwkJCWlmIChyZXQgIT0gMSkgeworCQkJCWFmc19kaXJfcHV0X3BhZ2UocGFnZSk7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCWJsa29mZiArPSBzaXplb2YodW5pb24gYWZzX2Rpcl9ibG9jayk7CisKKwkJfSB3aGlsZSAoKmZwb3MgPCBkaXItPmlfc2l6ZSAmJiBibGtvZmYgPCBsaW1pdCk7CisKKwkJYWZzX2Rpcl9wdXRfcGFnZShwYWdlKTsKKwkJcmV0ID0gMDsKKwl9CisKKyBvdXQ6CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30gLyogZW5kIGFmc19kaXJfaXRlcmF0ZSgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiByZWFkIGFuIEFGUyBkaXJlY3RvcnkKKyAqLworc3RhdGljIGludCBhZnNfZGlyX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmNvb2tpZSwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJdW5zaWduZWQgZnBvczsKKwlpbnQgcmV0OworCisJX2VudGVyKCJ7JUxkLHslbHV9fSIsIGZpbGUtPmZfcG9zLCBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9pbm8pOworCisJZnBvcyA9IGZpbGUtPmZfcG9zOworCXJldCA9IGFmc19kaXJfaXRlcmF0ZShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgJmZwb3MsIGNvb2tpZSwgZmlsbGRpcik7CisJZmlsZS0+Zl9wb3MgPSBmcG9zOworCisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30gLyogZW5kIGFmc19kaXJfcmVhZGRpcigpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBzZWFyY2ggdGhlIGRpcmVjdG9yeSBmb3IgYSBuYW1lCisgKiAtIGlmIGFmc19kaXJfaXRlcmF0ZV9ibG9jaygpIHNwb3RzIHRoaXMgZnVuY3Rpb24sIGl0J2xsIHBhc3MgdGhlIEZJRAorICogICB1bmlxdWlmaWVyIHRocm91Z2ggZHR5cGUKKyAqLworc3RhdGljIGludCBhZnNfZGlyX2xvb2t1cF9maWxsZGlyKHZvaWQgKl9jb29raWUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBubGVuLAorCQkJCSAgbG9mZl90IGZwb3MsIGlub190IGlubywgdW5zaWduZWQgZHR5cGUpCit7CisJc3RydWN0IGFmc19kaXJfbG9va3VwX2Nvb2tpZSAqY29va2llID0gX2Nvb2tpZTsKKworCV9lbnRlcigieyVzLCVadX0sJXMsJXUsLCVsdSwldSIsCisJICAgICAgIGNvb2tpZS0+bmFtZSwgY29va2llLT5ubGVuLCBuYW1lLCBubGVuLCBpbm8sIGR0eXBlKTsKKworCWlmIChjb29raWUtPm5sZW4gIT0gbmxlbiB8fCBtZW1jbXAoY29va2llLT5uYW1lLCBuYW1lLCBubGVuKSAhPSAwKSB7CisJCV9sZWF2ZSgiID0gMCBbbm9dIik7CisJCXJldHVybiAwOworCX0KKworCWNvb2tpZS0+ZmlkLnZub2RlID0gaW5vOworCWNvb2tpZS0+ZmlkLnVuaXF1ZSA9IGR0eXBlOworCWNvb2tpZS0+Zm91bmQgPSAxOworCisJX2xlYXZlKCIgPSAtMSBbZm91bmRdIik7CisJcmV0dXJuIC0xOworfSAvKiBlbmQgYWZzX2Rpcl9sb29rdXBfZmlsbGRpcigpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBsb29rIHVwIGFuIGVudHJ5IGluIGEgZGlyZWN0b3J5CisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICphZnNfZGlyX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJCSAgICAgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGFmc19kaXJfbG9va3VwX2Nvb2tpZSBjb29raWU7CisJc3RydWN0IGFmc19zdXBlcl9pbmZvICphczsKKwlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXVuc2lnbmVkIGZwb3M7CisJaW50IHJldDsKKworCV9lbnRlcigieyVsdX0sJXB7JXN9IiwgZGlyLT5pX2lubywgZGVudHJ5LCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCS8qIGluc2FuaXR5IGNoZWNrcyBmaXJzdCAqLworCUJVR19PTihzaXplb2YodW5pb24gYWZzX2Rpcl9ibG9jaykgIT0gMjA0OCk7CisJQlVHX09OKHNpemVvZih1bmlvbiBhZnNfZGlyZW50KSAhPSAzMik7CisKKwlpZiAoZGVudHJ5LT5kX25hbWUubGVuID4gMjU1KSB7CisJCV9sZWF2ZSgiID0gLUVOQU1FVE9PTE9ORyIpOworCQlyZXR1cm4gRVJSX1BUUigtRU5BTUVUT09MT05HKTsKKwl9CisKKwl2bm9kZSA9IEFGU19GU19JKGRpcik7CisJaWYgKHZub2RlLT5mbGFncyAmIEFGU19WTk9ERV9ERUxFVEVEKSB7CisJCV9sZWF2ZSgiID0gLUVTVEFMRSIpOworCQlyZXR1cm4gRVJSX1BUUigtRVNUQUxFKTsKKwl9CisKKwlhcyA9IGRpci0+aV9zYi0+c19mc19pbmZvOworCisJLyogc2VhcmNoIHRoZSBkaXJlY3RvcnkgKi8KKwljb29raWUubmFtZQk9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7CisJY29va2llLm5sZW4JPSBkZW50cnktPmRfbmFtZS5sZW47CisJY29va2llLmZpZC52aWQJPSBhcy0+dm9sdW1lLT52aWQ7CisJY29va2llLmZvdW5kCT0gMDsKKworCWZwb3MgPSAwOworCXJldCA9IGFmc19kaXJfaXRlcmF0ZShkaXIsICZmcG9zLCAmY29va2llLCBhZnNfZGlyX2xvb2t1cF9maWxsZGlyKTsKKwlpZiAocmV0IDwgMCkgeworCQlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwl9CisKKwlyZXQgPSAtRU5PRU5UOworCWlmICghY29va2llLmZvdW5kKSB7CisJCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCX0KKworCS8qIGluc3RhbnRpYXRlIHRoZSBkZW50cnkgKi8KKwlyZXQgPSBhZnNfaWdldChkaXItPmlfc2IsICZjb29raWUuZmlkLCAmaW5vZGUpOworCWlmIChyZXQgPCAwKSB7CisJCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCX0KKworCWRlbnRyeS0+ZF9vcCA9ICZhZnNfZnNfZGVudHJ5X29wZXJhdGlvbnM7CisJZGVudHJ5LT5kX2ZzZGF0YSA9ICh2b2lkICopICh1bnNpZ25lZCBsb25nKSB2bm9kZS0+c3RhdHVzLnZlcnNpb247CisKKwlkX2FkZChkZW50cnksIGlub2RlKTsKKwlfbGVhdmUoIiA9IDAgeyB2bj0ldSB1PSV1IH0gLT4geyBpbm89JWx1IHY9JWx1IH0iLAorCSAgICAgICBjb29raWUuZmlkLnZub2RlLAorCSAgICAgICBjb29raWUuZmlkLnVuaXF1ZSwKKwkgICAgICAgZGVudHJ5LT5kX2lub2RlLT5pX2lubywKKwkgICAgICAgZGVudHJ5LT5kX2lub2RlLT5pX3ZlcnNpb24pOworCisJcmV0dXJuIE5VTEw7Cit9IC8qIGVuZCBhZnNfZGlyX2xvb2t1cCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBjaGVjayB0aGF0IGEgZGVudHJ5IGxvb2t1cCBoaXQgaGFzIGZvdW5kIGEgdmFsaWQgZW50cnkKKyAqIC0gTk9URSEgdGhlIGhpdCBjYW4gYmUgYSBuZWdhdGl2ZSBoaXQgdG9vLCBzbyB3ZSBjYW4ndCBhc3N1bWUgd2UgaGF2ZSBhbgorICogICBpbm9kZQorICogKGRlcml2ZWQgZnJvbSBuZnNfbG9va3VwX3JldmFsaWRhdGUpCisgKi8KK3N0YXRpYyBpbnQgYWZzX2RfcmV2YWxpZGF0ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBhZnNfZGlyX2xvb2t1cF9jb29raWUgY29va2llOworCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlLCAqZGlyOworCXVuc2lnbmVkIGZwb3M7CisJaW50IHJldDsKKworCV9lbnRlcigie3NiPSVwIG49JXN9LCIsIGRlbnRyeS0+ZF9zYiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwkvKiBsb2NrIGRvd24gdGhlIHBhcmVudCBkZW50cnkgc28gd2UgY2FuIHBlZXIgYXQgaXQgKi8KKwlwYXJlbnQgPSBkZ2V0X3BhcmVudChkZW50cnktPmRfcGFyZW50KTsKKworCWRpciA9IHBhcmVudC0+ZF9pbm9kZTsKKwlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKworCS8qIGhhbmRsZSBhIG5lZ2F0aXZlIGRlbnRyeSAqLworCWlmICghaW5vZGUpCisJCWdvdG8gb3V0X2JhZDsKKworCS8qIGhhbmRsZSBhIGJhZCBpbm9kZSAqLworCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpKSB7CisJCXByaW50aygia0FGUzogYWZzX2RfcmV2YWxpZGF0ZTogJXMvJXMgaGFzIGJhZCBpbm9kZVxuIiwKKwkJICAgICAgIGRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwkJZ290byBvdXRfYmFkOworCX0KKworCS8qIGZvcmNlIGEgZnVsbCBsb29rIHVwIGlmIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGNoYW5nZWQgc2luY2UgbGFzdCB0aGUKKwkgKiBzZXJ2ZXIgd2FzIGNvbnN1bHRlZAorCSAqIC0gb3RoZXJ3aXNlIHRoaXMgaW5vZGUgbXVzdCBzdGlsbCBleGlzdCwgZXZlbiBpZiB0aGUgaW5vZGUgZGV0YWlscworCSAqICAgdGhlbXNlbHZlcyBoYXZlIGNoYW5nZWQKKwkgKi8KKwlpZiAoQUZTX0ZTX0koZGlyKS0+ZmxhZ3MgJiBBRlNfVk5PREVfQ0hBTkdFRCkKKwkJYWZzX3Zub2RlX2ZldGNoX3N0YXR1cyhBRlNfRlNfSShkaXIpKTsKKworCWlmIChBRlNfRlNfSShkaXIpLT5mbGFncyAmIEFGU19WTk9ERV9ERUxFVEVEKSB7CisJCV9kZWJ1ZygiJXM6IHBhcmVudCBkaXIgZGVsZXRlZCIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCQlnb3RvIG91dF9iYWQ7CisJfQorCisJaWYgKEFGU19GU19JKGlub2RlKS0+ZmxhZ3MgJiBBRlNfVk5PREVfREVMRVRFRCkgeworCQlfZGVidWcoIiVzOiBmaWxlIGFscmVhZHkgZGVsZXRlZCIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCQlnb3RvIG91dF9iYWQ7CisJfQorCisJaWYgKCh1bnNpZ25lZCBsb25nKSBkZW50cnktPmRfZnNkYXRhICE9CisJICAgICh1bnNpZ25lZCBsb25nKSBBRlNfRlNfSShkaXIpLT5zdGF0dXMudmVyc2lvbikgeworCQlfZGVidWcoIiVzOiBwYXJlbnQgY2hhbmdlZCAlbHUgLT4gJXUiLAorCQkgICAgICAgZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSBkZW50cnktPmRfZnNkYXRhLAorCQkgICAgICAgKHVuc2lnbmVkKSBBRlNfRlNfSShkaXIpLT5zdGF0dXMudmVyc2lvbik7CisKKwkJLyogc2VhcmNoIHRoZSBkaXJlY3RvcnkgZm9yIHRoaXMgdm5vZGUgKi8KKwkJY29va2llLm5hbWUJPSBkZW50cnktPmRfbmFtZS5uYW1lOworCQljb29raWUubmxlbgk9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKKwkJY29va2llLmZpZC52aWQJPSBBRlNfRlNfSShpbm9kZSktPnZvbHVtZS0+dmlkOworCQljb29raWUuZm91bmQJPSAwOworCisJCWZwb3MgPSAwOworCQlyZXQgPSBhZnNfZGlyX2l0ZXJhdGUoZGlyLCAmZnBvcywgJmNvb2tpZSwKKwkJCQkgICAgICBhZnNfZGlyX2xvb2t1cF9maWxsZGlyKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCV9kZWJ1ZygiZmFpbGVkIHRvIGl0ZXJhdGUgZGlyICVzOiAlZCIsCisJCQkgICAgICAgcGFyZW50LT5kX25hbWUubmFtZSwgcmV0KTsKKwkJCWdvdG8gb3V0X2JhZDsKKwkJfQorCisJCWlmICghY29va2llLmZvdW5kKSB7CisJCQlfZGVidWcoIiVzOiBkaXJlbnQgbm90IGZvdW5kIiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisJCQlnb3RvIG5vdF9mb3VuZDsKKwkJfQorCisJCS8qIGlmIHRoZSB2bm9kZSBJRCBoYXMgY2hhbmdlZCwgdGhlbiB0aGUgZGlyZW50IHBvaW50cyB0byBhCisJCSAqIGRpZmZlcmVudCBmaWxlICovCisJCWlmIChjb29raWUuZmlkLnZub2RlICE9IEFGU19GU19JKGlub2RlKS0+ZmlkLnZub2RlKSB7CisJCQlfZGVidWcoIiVzOiBkaXJlbnQgY2hhbmdlZCIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCQkJZ290byBub3RfZm91bmQ7CisJCX0KKworCQkvKiBpZiB0aGUgdm5vZGUgSUQgdW5pcWlmaWVyIGhhcyBjaGFuZ2VkLCB0aGVuIHRoZSBmaWxlIGhhcworCQkgKiBiZWVuIGRlbGV0ZWQgKi8KKwkJaWYgKGNvb2tpZS5maWQudW5pcXVlICE9IEFGU19GU19JKGlub2RlKS0+ZmlkLnVuaXF1ZSkgeworCQkJX2RlYnVnKCIlczogZmlsZSBkZWxldGVkICh1cSAldSAtPiAldSBJOiVsdSkiLAorCQkJICAgICAgIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkgICAgICAgY29va2llLmZpZC51bmlxdWUsCisJCQkgICAgICAgQUZTX0ZTX0koaW5vZGUpLT5maWQudW5pcXVlLAorCQkJICAgICAgIGlub2RlLT5pX3ZlcnNpb24pOworCQkJc3Bpbl9sb2NrKCZBRlNfRlNfSShpbm9kZSktPmxvY2spOworCQkJQUZTX0ZTX0koaW5vZGUpLT5mbGFncyB8PSBBRlNfVk5PREVfREVMRVRFRDsKKwkJCXNwaW5fdW5sb2NrKCZBRlNfRlNfSShpbm9kZSktPmxvY2spOworCQkJaW52YWxpZGF0ZV9yZW1vdGVfaW5vZGUoaW5vZGUpOworCQkJZ290byBvdXRfYmFkOworCQl9CisKKwkJZGVudHJ5LT5kX2ZzZGF0YSA9CisJCQkodm9pZCAqKSAodW5zaWduZWQgbG9uZykgQUZTX0ZTX0koZGlyKS0+c3RhdHVzLnZlcnNpb247CisJfQorCisgb3V0X3ZhbGlkOgorCWRwdXQocGFyZW50KTsKKwlfbGVhdmUoIiA9IDEgW3ZhbGlkXSIpOworCXJldHVybiAxOworCisJLyogdGhlIGRpcmVudCwgaWYgaXQgZXhpc3RzLCBub3cgcG9pbnRzIHRvIGEgZGlmZmVyZW50IHZub2RlICovCisgbm90X2ZvdW5kOgorCXNwaW5fbG9jaygmZGVudHJ5LT5kX2xvY2spOworCWRlbnRyeS0+ZF9mbGFncyB8PSBEQ0FDSEVfTkZTRlNfUkVOQU1FRDsKKwlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCisgb3V0X2JhZDoKKwlpZiAoaW5vZGUpIHsKKwkJLyogZG9uJ3QgdW5oYXNoIGlmIHdlIGhhdmUgc3VibW91bnRzICovCisJCWlmIChoYXZlX3N1Ym1vdW50cyhkZW50cnkpKQorCQkJZ290byBvdXRfdmFsaWQ7CisJfQorCisJc2hyaW5rX2RjYWNoZV9wYXJlbnQoZGVudHJ5KTsKKworCV9kZWJ1ZygiZHJvcHBpbmcgZGVudHJ5ICVzLyVzIiwKKwkgICAgICAgZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCWRfZHJvcChkZW50cnkpOworCisJZHB1dChwYXJlbnQpOworCisJX2xlYXZlKCIgPSAwIFtiYWRdIik7CisJcmV0dXJuIDA7Cit9IC8qIGVuZCBhZnNfZF9yZXZhbGlkYXRlKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGFsbG93IHRoZSBWRlMgdG8gZW5xdWlyZSBhcyB0byB3aGV0aGVyIGEgZGVudHJ5IHNob3VsZCBiZSB1bmhhc2hlZCAobXVzdG4ndAorICogc2xlZXApCisgKiAtIGNhbGxlZCBmcm9tIGRwdXQoKSB3aGVuIGRfY291bnQgaXMgZ29pbmcgdG8gMC4KKyAqIC0gcmV0dXJuIDEgdG8gcmVxdWVzdCBkZW50cnkgYmUgdW5oYXNoZWQsIDAgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgYWZzX2RfZGVsZXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlfZW50ZXIoIiVzIiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwlpZiAoZGVudHJ5LT5kX2ZsYWdzICYgRENBQ0hFX05GU0ZTX1JFTkFNRUQpCisJCWdvdG8gemFwOworCisJaWYgKGRlbnRyeS0+ZF9pbm9kZSkgeworCQlpZiAoQUZTX0ZTX0koZGVudHJ5LT5kX2lub2RlKS0+ZmxhZ3MgJiBBRlNfVk5PREVfREVMRVRFRCkKKwkJCWdvdG8gemFwOworCX0KKworCV9sZWF2ZSgiID0gMCBba2VlcF0iKTsKKwlyZXR1cm4gMDsKKworIHphcDoKKwlfbGVhdmUoIiA9IDEgW3phcF0iKTsKKwlyZXR1cm4gMTsKK30gLyogZW5kIGFmc19kX2RlbGV0ZSgpICovCmRpZmYgLS1naXQgYS9mcy9hZnMvZXJyb3JzLmggYi9mcy9hZnMvZXJyb3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc0ZDk0YQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Fmcy9lcnJvcnMuaApAQCAtMCwwICsxLDM0IEBACisvKiBlcnJvcnMuaDogQUZTIGFib3J0L2Vycm9yIGNvZGVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0FGU19FUlJPUlNfSAorI2RlZmluZSBfTElOVVhfQUZTX0VSUk9SU19ICisKKyNpbmNsdWRlICJ0eXBlcy5oIgorCisvKiBmaWxlIHNlcnZlciBhYm9ydCBjb2RlcyAqLwordHlwZWRlZiBlbnVtIHsKKwlWU0FMVkFHRQk9IDEwMSwJLyogdm9sdW1lIG5lZWRzIHNhbHZhZ2luZyAqLworCVZOT1ZOT0RFCT0gMTAyLAkvKiBubyBzdWNoIGZpbGUvZGlyICh2bm9kZSkgKi8KKwlWTk9WT0wJCT0gMTAzLAkvKiBubyBzdWNoIHZvbHVtZSBvciB2b2x1bWUgdW5hdmFpbGFibGUgKi8KKwlWVk9MRVhJU1RTCT0gMTA0LAkvKiB2b2x1bWUgbmFtZSBhbHJlYWR5IGV4aXN0cyAqLworCVZOT1NFUlZJQ0UJPSAxMDUsCS8qIHZvbHVtZSBub3QgY3VycmVudGx5IGluIHNlcnZpY2UgKi8KKwlWT0ZGTElORQk9IDEwNiwJLyogdm9sdW1lIGlzIGN1cnJlbnRseSBvZmZsaW5lIChtb3JlIGluZm8gYXZhaWxhYmxlIFtWVkwtc3BlY10pICovCisJVk9OTElORQkJPSAxMDcsCS8qIHZvbHVtZSBpcyBhbHJlYWR5IG9ubGluZSAqLworCVZESVNLRlVMTAk9IDEwOCwJLyogZGlzayBwYXJ0aXRpb24gaXMgZnVsbCAqLworCVZPVkVSUVVPVEEJPSAxMDksCS8qIHZvbHVtZSdzIG1heGltdW0gcXVvdGEgZXhjZWVkZWQgKi8KKwlWQlVTWQkJPSAxMTAsCS8qIHZvbHVtZSBpcyB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZSAqLworCVZNT1ZFRAkJPSAxMTEsCS8qIHZvbHVtZSBtb3ZlZCB0byBuZXcgc2VydmVyIC0gYXNrIHRoaXMgRlMgd2hlcmUgKi8KK30gYWZzX3J4ZnNfYWJvcnRfdDsKKworZXh0ZXJuIGludCBhZnNfYWJvcnRfdG9fZXJyb3IoaW50IGFib3J0Y29kZSk7CisKKyNlbmRpZiAvKiBfTElOVVhfQUZTX0VSUk9SU19IICovCmRpZmYgLS1naXQgYS9mcy9hZnMvZmlsZS5jIGIvZnMvYWZzL2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjZiYjdjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL2ZpbGUuYwpAQCAtMCwwICsxLDMwNSBAQAorLyogZmlsZS5jOiBBRlMgZmlsZXN5c3RlbSBmaWxlIGhhbmRsaW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlICJ2b2x1bWUuaCIKKyNpbmNsdWRlICJ2bm9kZS5oIgorI2luY2x1ZGUgPHJ4cnBjL2NhbGwuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjaWYgMAorc3RhdGljIGludCBhZnNfZmlsZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgYWZzX2ZpbGVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CisjZW5kaWYKKworc3RhdGljIGludCBhZnNfZmlsZV9yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpOworc3RhdGljIGludCBhZnNfZmlsZV9pbnZhbGlkYXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQpOworc3RhdGljIGludCBhZnNfZmlsZV9yZWxlYXNlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IGdmcF9mbGFncyk7CisKK3N0YXRpYyBzc2l6ZV90IGFmc19maWxlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgICAgc2l6ZV90IHNpemUsIGxvZmZfdCAqb2ZmKTsKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgYWZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkuZ2V0YXR0cgk9IGFmc19pbm9kZV9nZXRhdHRyLAorfTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhZnNfZmlsZV9maWxlX29wZXJhdGlvbnMgPSB7CisJLnJlYWQJCT0gZ2VuZXJpY19maWxlX3JlYWQsCisJLndyaXRlCQk9IGFmc19maWxlX3dyaXRlLAorCS5tbWFwCQk9IGdlbmVyaWNfZmlsZV9tbWFwLAorI2lmIDAKKwkub3BlbgkJPSBhZnNfZmlsZV9vcGVuLAorCS5yZWxlYXNlCT0gYWZzX2ZpbGVfcmVsZWFzZSwKKwkuZnN5bmMJCT0gYWZzX2ZpbGVfZnN5bmMsCisjZW5kaWYKK307CisKK3N0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgYWZzX2ZzX2FvcHMgPSB7CisJLnJlYWRwYWdlCT0gYWZzX2ZpbGVfcmVhZHBhZ2UsCisJLnN5bmNfcGFnZQk9IGJsb2NrX3N5bmNfcGFnZSwKKwkuc2V0X3BhZ2VfZGlydHkJPSBfX3NldF9wYWdlX2RpcnR5X25vYnVmZmVycywKKwkucmVsZWFzZXBhZ2UJPSBhZnNfZmlsZV9yZWxlYXNlcGFnZSwKKwkuaW52YWxpZGF0ZXBhZ2UJPSBhZnNfZmlsZV9pbnZhbGlkYXRlcGFnZSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBBRlMgZmlsZSB3cml0ZQorICovCitzdGF0aWMgc3NpemVfdCBhZnNfZmlsZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICAgIHNpemVfdCBzaXplLCBsb2ZmX3QgKm9mZikKK3sKKwlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZTsKKworCXZub2RlID0gQUZTX0ZTX0koZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCWlmICh2bm9kZS0+ZmxhZ3MgJiBBRlNfVk5PREVfREVMRVRFRCkKKwkJcmV0dXJuIC1FU1RBTEU7CisKKwlyZXR1cm4gLUVJTzsKK30gLyogZW5kIGFmc19maWxlX3dyaXRlKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGRlYWwgd2l0aCBub3RpZmljYXRpb24gdGhhdCBhIHBhZ2Ugd2FzIHJlYWQgZnJvbSB0aGUgY2FjaGUKKyAqLworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKK3N0YXRpYyB2b2lkIGFmc19maWxlX3JlYWRwYWdlX3JlYWRfY29tcGxldGUodm9pZCAqY29va2llX2RhdGEsCisJCQkJCSAgICBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkJICAgIHZvaWQgKmRhdGEsCisJCQkJCSAgICBpbnQgZXJyb3IpCit7CisJX2VudGVyKCIlcCwlcCwlcCwlZCIsIGNvb2tpZV9kYXRhLCBwYWdlLCBkYXRhLCBlcnJvcik7CisKKwlpZiAoZXJyb3IpCisJCVNldFBhZ2VFcnJvcihwYWdlKTsKKwllbHNlCisJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKworfSAvKiBlbmQgYWZzX2ZpbGVfcmVhZHBhZ2VfcmVhZF9jb21wbGV0ZSgpICovCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGRlYWwgd2l0aCBub3RpZmljYXRpb24gdGhhdCBhIHBhZ2Ugd2FzIHdyaXR0ZW4gdG8gdGhlIGNhY2hlCisgKi8KKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCitzdGF0aWMgdm9pZCBhZnNfZmlsZV9yZWFkcGFnZV93cml0ZV9jb21wbGV0ZSh2b2lkICpjb29raWVfZGF0YSwKKwkJCQkJICAgICBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQkJICAgICB2b2lkICpkYXRhLAorCQkJCQkgICAgIGludCBlcnJvcikKK3sKKwlfZW50ZXIoIiVwLCVwLCVwLCVkIiwgY29va2llX2RhdGEsIHBhZ2UsIGRhdGEsIGVycm9yKTsKKworCXVubG9ja19wYWdlKHBhZ2UpOworCit9IC8qIGVuZCBhZnNfZmlsZV9yZWFkcGFnZV93cml0ZV9jb21wbGV0ZSgpICovCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEFGUyByZWFkIHBhZ2UgZnJvbSBmaWxlIChvciBzeW1saW5rKQorICovCitzdGF0aWMgaW50IGFmc19maWxlX3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlzdHJ1Y3QgYWZzX3J4ZnNfZmV0Y2hfZGVzY3JpcHRvciBkZXNjOworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKKwlzdHJ1Y3QgY2FjaGVmc19wYWdlICpwYWdlaW87CisjZW5kaWYKKwlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWludCByZXQ7CisKKwlpbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisKKwlfZW50ZXIoInslbHV9LHslbHV9IiwgaW5vZGUtPmlfaW5vLCBwYWdlLT5pbmRleCk7CisKKwl2bm9kZSA9IEFGU19GU19JKGlub2RlKTsKKworCWlmICghUGFnZUxvY2tlZChwYWdlKSkKKwkJUEFHRV9CVUcocGFnZSk7CisKKwlyZXQgPSAtRVNUQUxFOworCWlmICh2bm9kZS0+ZmxhZ3MgJiBBRlNfVk5PREVfREVMRVRFRCkKKwkJZ290byBlcnJvcjsKKworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKKwlyZXQgPSBjYWNoZWZzX3BhZ2VfZ2V0X3ByaXZhdGUocGFnZSwgJnBhZ2VpbywgR0ZQX05PSU8pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogaXMgaXQgY2FjaGVkPyAqLworCXJldCA9IGNhY2hlZnNfcmVhZF9vcl9hbGxvY19wYWdlKHZub2RlLT5jYWNoZSwKKwkJCQkJIHBhZ2UsCisJCQkJCSBhZnNfZmlsZV9yZWFkcGFnZV9yZWFkX2NvbXBsZXRlLAorCQkJCQkgTlVMTCwKKwkJCQkJIEdGUF9LRVJORUwpOworI2Vsc2UKKwlyZXQgPSAtRU5PQlVGUzsKKyNlbmRpZgorCisJc3dpdGNoIChyZXQpIHsKKwkJLyogcmVhZCBCSU8gc3VibWl0dGVkIGFuZCB3Yi1qb3VybmFsIGVudHJ5IGZvdW5kICovCisJY2FzZSAxOgorCQlCVUcoKTsgLy8gVE9ETyAtIGhhbmRsZSB3Yi1qb3VybmFsIG1hdGNoCisKKwkJLyogcmVhZCBCSU8gc3VibWl0dGVkIChwYWdlIGluIGNhY2hlKSAqLworCWNhc2UgMDoKKwkJYnJlYWs7CisKKwkJLyogbm8gcGFnZSBhdmFpbGFibGUgaW4gY2FjaGUgKi8KKwljYXNlIC1FTk9CVUZTOgorCWNhc2UgLUVOT0RBVEE6CisJZGVmYXVsdDoKKwkJZGVzYy5maWQJPSB2bm9kZS0+ZmlkOworCQlkZXNjLm9mZnNldAk9IHBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisJCWRlc2Muc2l6ZQk9IG1pbigoc2l6ZV90KSAoaW5vZGUtPmlfc2l6ZSAtIGRlc2Mub2Zmc2V0KSwKKwkJCQkgICAgICAoc2l6ZV90KSBQQUdFX1NJWkUpOworCQlkZXNjLmJ1ZmZlcgk9IGttYXAocGFnZSk7CisKKwkJY2xlYXJfcGFnZShkZXNjLmJ1ZmZlcik7CisKKwkJLyogcmVhZCB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgZnJvbSB0aGUgc2VydmVyIGludG8gdGhlCisJCSAqIHBhZ2UgKi8KKwkJcmV0ID0gYWZzX3Zub2RlX2ZldGNoX2RhdGEodm5vZGUsICZkZXNjKTsKKwkJa3VubWFwKHBhZ2UpOworCQlpZiAocmV0IDwgMCkgeworCQkJaWYgKHJldD09LUVOT0VOVCkgeworCQkJCV9kZWJ1ZygiZ290IE5PRU5UIGZyb20gc2VydmVyIgorCQkJCSAgICAgICAiIC0gbWFya2luZyBmaWxlIGRlbGV0ZWQgYW5kIHN0YWxlIik7CisJCQkJdm5vZGUtPmZsYWdzIHw9IEFGU19WTk9ERV9ERUxFVEVEOworCQkJCXJldCA9IC1FU1RBTEU7CisJCQl9CisKKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCisJCQljYWNoZWZzX3VuY2FjaGVfcGFnZSh2bm9kZS0+Y2FjaGUsIHBhZ2UpOworI2VuZGlmCisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorCQlpZiAoY2FjaGVmc193cml0ZV9wYWdlKHZub2RlLT5jYWNoZSwKKwkJCQkgICAgICAgcGFnZSwKKwkJCQkgICAgICAgYWZzX2ZpbGVfcmVhZHBhZ2Vfd3JpdGVfY29tcGxldGUsCisJCQkJICAgICAgIE5VTEwsCisJCQkJICAgICAgIEdGUF9LRVJORUwpICE9IDAKKwkJICAgICkgeworCQkJY2FjaGVmc191bmNhY2hlX3BhZ2Uodm5vZGUtPmNhY2hlLCBwYWdlKTsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCQl9CisjZWxzZQorCQl1bmxvY2tfcGFnZShwYWdlKTsKKyNlbmRpZgorCX0KKworCV9sZWF2ZSgiID0gMCIpOworCXJldHVybiAwOworCisgZXJyb3I6CisJU2V0UGFnZUVycm9yKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKKworfSAvKiBlbmQgYWZzX2ZpbGVfcmVhZHBhZ2UoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZ2V0IGEgcGFnZSBjb29raWUgZm9yIHRoZSBzcGVjaWZpZWQgcGFnZQorICovCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAoraW50IGFmc19jYWNoZV9nZXRfcGFnZV9jb29raWUoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkgICAgICBzdHJ1Y3QgY2FjaGVmc19wYWdlICoqX3BhZ2VfY29va2llKQoreworCWludCByZXQ7CisKKwlfZW50ZXIoIiIpOworCXJldCA9IGNhY2hlZnNfcGFnZV9nZXRfcHJpdmF0ZShwYWdlLF9wYWdlX2Nvb2tpZSwgR0ZQX05PSU8pOworCisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30gLyogZW5kIGFmc19jYWNoZV9nZXRfcGFnZV9jb29raWUoKSAqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBpbnZhbGlkYXRlIHBhcnQgb3IgYWxsIG9mIGEgcGFnZQorICovCitzdGF0aWMgaW50IGFmc19maWxlX2ludmFsaWRhdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKK3sKKwlpbnQgcmV0ID0gMTsKKworCV9lbnRlcigieyVsdX0sJWx1IiwgcGFnZS0+aW5kZXgsIG9mZnNldCk7CisKKwlCVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOworCisJaWYgKFBhZ2VQcml2YXRlKHBhZ2UpKSB7CisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorCQlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IEFGU19GU19JKHBhZ2UtPm1hcHBpbmctPmhvc3QpOworCQljYWNoZWZzX3VuY2FjaGVfcGFnZSh2bm9kZS0+Y2FjaGUscGFnZSk7CisjZW5kaWYKKworCQkvKiBXZSByZWxlYXNlIGJ1ZmZlcnMgb25seSBpZiB0aGUgZW50aXJlIHBhZ2UgaXMgYmVpbmcKKwkJICogaW52YWxpZGF0ZWQuCisJCSAqIFRoZSBnZXRfYmxvY2sgY2FjaGVkIHZhbHVlIGhhcyBiZWVuIHVuY29uZGl0aW9uYWxseQorCQkgKiBpbnZhbGlkYXRlZCwgc28gcmVhbCBJTyBpcyBub3QgcG9zc2libGUgYW55bW9yZS4KKwkJICovCisJCWlmIChvZmZzZXQgPT0gMCkgeworCQkJQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKKworCQkJcmV0ID0gMDsKKwkJCWlmICghUGFnZVdyaXRlYmFjayhwYWdlKSkKKwkJCQlyZXQgPSBwYWdlLT5tYXBwaW5nLT5hX29wcy0+cmVsZWFzZXBhZ2UocGFnZSwKKwkJCQkJCQkJCTApOworCQl9CisJfQorCisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30gLyogZW5kIGFmc19maWxlX2ludmFsaWRhdGVwYWdlKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHJlbGVhc2UgYSBwYWdlIGFuZCBjbGVhbnVwIGl0cyBwcml2YXRlIGRhdGEKKyAqLworc3RhdGljIGludCBhZnNfZmlsZV9yZWxlYXNlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IGdmcF9mbGFncykKK3sKKwlzdHJ1Y3QgY2FjaGVmc19wYWdlICpwYWdlaW87CisKKwlfZW50ZXIoInslbHV9LCV4IiwgcGFnZS0+aW5kZXgsIGdmcF9mbGFncyk7CisKKwlpZiAoUGFnZVByaXZhdGUocGFnZSkpIHsKKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCisJCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlID0gQUZTX0ZTX0kocGFnZS0+bWFwcGluZy0+aG9zdCk7CisJCWNhY2hlZnNfdW5jYWNoZV9wYWdlKHZub2RlLT5jYWNoZSwgcGFnZSk7CisjZW5kaWYKKworCQlwYWdlaW8gPSAoc3RydWN0IGNhY2hlZnNfcGFnZSAqKSBwYWdlLT5wcml2YXRlOworCQlwYWdlLT5wcml2YXRlID0gMDsKKwkJQ2xlYXJQYWdlUHJpdmF0ZShwYWdlKTsKKworCQlpZiAocGFnZWlvKQorCQkJa2ZyZWUocGFnZWlvKTsKKwl9CisKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKK30gLyogZW5kIGFmc19maWxlX3JlbGVhc2VwYWdlKCkgKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9mc2NsaWVudC5jIGIvZnMvYWZzL2ZzY2xpZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFiYzM3MQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Fmcy9mc2NsaWVudC5jCkBAIC0wLDAgKzEsODM3IEBACisvKiBmc2NsaWVudC5jOiBBRlMgRmlsZSBTZXJ2ZXIgY2xpZW50IHN0dWJzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxyeHJwYy9yeHJwYy5oPgorI2luY2x1ZGUgPHJ4cnBjL3RyYW5zcG9ydC5oPgorI2luY2x1ZGUgPHJ4cnBjL2Nvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxyeHJwYy9jYWxsLmg+CisjaW5jbHVkZSAiZnNjbGllbnQuaCIKKyNpbmNsdWRlICJjbXNlcnZpY2UuaCIKKyNpbmNsdWRlICJ2bm9kZS5oIgorI2luY2x1ZGUgInNlcnZlci5oIgorI2luY2x1ZGUgImVycm9ycy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgRlNGRVRDSFNUQVRVUwkJMTMyCS8qIEFGUyBGZXRjaCBmaWxlIHN0YXR1cyAqLworI2RlZmluZSBGU0ZFVENIREFUQQkJMTMwCS8qIEFGUyBGZXRjaCBmaWxlIGRhdGEgKi8KKyNkZWZpbmUgRlNHSVZFVVBDQUxMQkFDS1MJMTQ3CS8qIEFGUyBEaXNjYXJkIGNhbGxiYWNrIHByb21pc2VzICovCisjZGVmaW5lIEZTR0VUVk9MVU1FSU5GTwkJMTQ4CS8qIEFGUyBHZXQgcm9vdCB2b2x1bWUgaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgRlNHRVRST09UVk9MVU1FCQkxNTEJLyogQUZTIEdldCByb290IHZvbHVtZSBuYW1lICovCisjZGVmaW5lIEZTTE9PS1VQCQkxNjEJLyogQUZTIGxvb2t1cCBmaWxlIGluIGRpcmVjdG9yeSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogbWFwIGFmcyBhYm9ydCBjb2RlcyB0by9mcm9tIExpbnV4IGVycm9yIGNvZGVzCisgKiAtIGNhbGxlZCB3aXRoIGNhbGwtPmxvY2sgaGVsZAorICovCitzdGF0aWMgdm9pZCBhZnNfcnhmc19hZW1hcChzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3sKKwlzd2l0Y2ggKGNhbGwtPmFwcF9lcnJfc3RhdGUpIHsKKwljYXNlIFJYUlBDX0VTVEFURV9MT0NBTF9BQk9SVDoKKwkJY2FsbC0+YXBwX2Fib3J0X2NvZGUgPSAtY2FsbC0+YXBwX2Vycm5vOworCQlicmVhazsKKwljYXNlIFJYUlBDX0VTVEFURV9QRUVSX0FCT1JUOgorCQljYWxsLT5hcHBfZXJybm8gPSBhZnNfYWJvcnRfdG9fZXJyb3IoY2FsbC0+YXBwX2Fib3J0X2NvZGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9IC8qIGVuZCBhZnNfcnhmc19hZW1hcCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBnZXQgdGhlIHJvb3Qgdm9sdW1lIG5hbWUgZnJvbSBhIGZpbGVzZXJ2ZXIKKyAqIC0gdGhpcyBvcGVyYXRpb24gZG9lc24ndCBzZWVtIHRvIHdvcmsgY29ycmVjdGx5IGluIE9wZW5BRlMgc2VydmVyIDEuMi4yCisgKi8KKyNpZiAwCitpbnQgYWZzX3J4ZnNfZ2V0X3Jvb3Rfdm9sdW1lKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCQkgICAgIGNoYXIgKmJ1Ziwgc2l6ZV90ICpidWZsZW4pCit7CisJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm47CisJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGw7CisJc3RydWN0IGt2ZWMgcGlvdlsyXTsKKwlzaXplX3Qgc2VudDsKKwlpbnQgcmV0OworCXUzMiBwYXJhbVsxXTsKKworCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7CisKKwlrZW50ZXIoIiVwLCVwLCV1IixzZXJ2ZXIsIGJ1ZiwgKmJ1Zmxlbik7CisKKwkvKiBnZXQgaG9sZCBvZiB0aGUgZmlsZXNlcnZlciBjb25uZWN0aW9uICovCisJcmV0ID0gYWZzX3NlcnZlcl9nZXRfZnNjb25uKHNlcnZlciwgJmNvbm4pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIGNyZWF0ZSBhIGNhbGwgdGhyb3VnaCB0aGF0IGNvbm5lY3Rpb24gKi8KKwlyZXQgPSByeHJwY19jcmVhdGVfY2FsbChjb25uLCBOVUxMLCBOVUxMLCBhZnNfcnhmc19hZW1hcCwgJmNhbGwpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50aygia0FGUzogVW5hYmxlIHRvIGNyZWF0ZSBjYWxsOiAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXRfcHV0X2Nvbm47CisJfQorCWNhbGwtPmFwcF9vcGNvZGUgPSBGU0dFVFJPT1RWT0xVTUU7CisKKwkvKiB3ZSB3YW50IHRvIGdldCBldmVudCBub3RpZmljYXRpb25zIGZyb20gdGhlIGNhbGwgKi8KKwlhZGRfd2FpdF9xdWV1ZSgmY2FsbC0+d2FpdHEsICZteXNlbGYpOworCisJLyogbWFyc2hhbGwgdGhlIHBhcmFtZXRlcnMgKi8KKwlwYXJhbVswXSA9IGh0b25sKEZTR0VUUk9PVFZPTFVNRSk7CisKKwlwaW92WzBdLmlvdl9sZW4gPSBzaXplb2YocGFyYW0pOworCXBpb3ZbMF0uaW92X2Jhc2UgPSBwYXJhbTsKKworCS8qIHNlbmQgdGhlIHBhcmFtZXRlcnMgdG8gdGhlIHNlcnZlciAqLworCXJldCA9IHJ4cnBjX2NhbGxfd3JpdGVfZGF0YShjYWxsLCAxLCBwaW92LCBSWFJQQ19MQVNUX1BBQ0tFVCwgR0ZQX05PRlMsCisJCQkJICAgIDAsICZzZW50KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBhYm9ydDsKKworCS8qIHdhaXQgZm9yIHRoZSByZXBseSB0byBjb21wbGV0ZWx5IGFycml2ZSAqLworCWZvciAoOzspIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKGNhbGwtPmFwcF9jYWxsX3N0YXRlICE9IFJYUlBDX0NTVEFURV9DTE5UX1JDVl9SRVBMWSB8fAorCQkgICAgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlicmVhazsKKwkJc2NoZWR1bGUoKTsKKwl9CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworCXJldCA9IC1FSU5UUjsKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCWdvdG8gYWJvcnQ7CisKKwlzd2l0Y2ggKGNhbGwtPmFwcF9jYWxsX3N0YXRlKSB7CisJY2FzZSBSWFJQQ19DU1RBVEVfRVJST1I6CisJCXJldCA9IGNhbGwtPmFwcF9lcnJubzsKKwkJa2RlYnVnKCJHb3QgRXJyb3I6ICVkIiwgcmV0KTsKKwkJZ290byBvdXRfdW53YWl0OworCisJY2FzZSBSWFJQQ19DU1RBVEVfQ0xOVF9HT1RfUkVQTFk6CisJCS8qIHJlYWQgdGhlIHJlcGx5ICovCisJCWtkZWJ1ZygiR290IFJlcGx5OiBxdHk9JWQiLCBjYWxsLT5hcHBfcmVhZHlfcXR5KTsKKworCQlyZXQgPSAtRUJBRE1TRzsKKwkJaWYgKGNhbGwtPmFwcF9yZWFkeV9xdHkgPD0gNCkKKwkJCWdvdG8gYWJvcnQ7CisKKwkJcmV0ID0gcnhycGNfY2FsbF9yZWFkX2RhdGEoY2FsbCwgTlVMTCwgY2FsbC0+YXBwX3JlYWR5X3F0eSwgMCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBhYm9ydDsKKworI2lmIDAKKwkJLyogdW5tYXJzaGFsbCB0aGUgcmVwbHkgKi8KKwkJYnAgPSBidWZmZXI7CisJCWZvciAobG9vcCA9IDA7IGxvb3AgPCA2NTsgbG9vcCsrKQorCQkJZW50cnktPm5hbWVbbG9vcF0gPSBudG9obCgqYnArKyk7CisJCWVudHJ5LT5uYW1lWzY0XSA9IDA7CisKKwkJZW50cnktPnR5cGUgPSBudG9obCgqYnArKyk7CisJCWVudHJ5LT5udW1fc2VydmVycyA9IG50b2hsKCpicCsrKTsKKworCQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgODsgbG9vcCsrKQorCQkJZW50cnktPnNlcnZlcnNbbG9vcF0uYWRkci5zX2FkZHIgPSAqYnArKzsKKworCQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgODsgbG9vcCsrKQorCQkJZW50cnktPnNlcnZlcnNbbG9vcF0ucGFydGl0aW9uID0gbnRvaGwoKmJwKyspOworCisJCWZvciAobG9vcCA9IDA7IGxvb3AgPCA4OyBsb29wKyspCisJCQllbnRyeS0+c2VydmVyc1tsb29wXS5mbGFncyA9IG50b2hsKCpicCsrKTsKKworCQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgMzsgbG9vcCsrKQorCQkJZW50cnktPnZvbHVtZV9pZHNbbG9vcF0gPSBudG9obCgqYnArKyk7CisKKwkJZW50cnktPmNsb25lX2lkID0gbnRvaGwoKmJwKyspOworCQllbnRyeS0+ZmxhZ3MgPSBudG9obCgqYnApOworI2VuZGlmCisKKwkJLyogc3VjY2VzcyAqLworCQlyZXQgPSAwOworCQlnb3RvIG91dF91bndhaXQ7CisKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKyBhYm9ydDoKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJcnhycGNfY2FsbF9hYm9ydChjYWxsLCByZXQpOworCXNjaGVkdWxlKCk7Cisgb3V0X3Vud2FpdDoKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZjYWxsLT53YWl0cSwgJm15c2VsZik7CisJcnhycGNfcHV0X2NhbGwoY2FsbCk7Cisgb3V0X3B1dF9jb25uOgorCWFmc19zZXJ2ZXJfcmVsZWFzZV9mc2Nvbm4oc2VydmVyLCBjb25uKTsKKyBvdXQ6CisJa2xlYXZlKCIiKTsKKwlyZXR1cm4gcmV0OworfSAvKiBlbmQgYWZzX3J4ZnNfZ2V0X3Jvb3Rfdm9sdW1lKCkgKi8KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZ2V0IGluZm9ybWF0aW9uIGFib3V0IGEgdm9sdW1lCisgKi8KKyNpZiAwCitpbnQgYWZzX3J4ZnNfZ2V0X3ZvbHVtZV9pbmZvKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICAgIHN0cnVjdCBhZnNfdm9sdW1lX2luZm8gKnZpbmZvKQoreworCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uOworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOworCXN0cnVjdCBrdmVjIHBpb3ZbM107CisJc2l6ZV90IHNlbnQ7CisJaW50IHJldDsKKwl1MzIgcGFyYW1bMl0sICpicCwgemVybzsKKworCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7CisKKwlfZW50ZXIoIiVwLCVzLCVwIiwgc2VydmVyLCBuYW1lLCB2aW5mbyk7CisKKwkvKiBnZXQgaG9sZCBvZiB0aGUgZmlsZXNlcnZlciBjb25uZWN0aW9uICovCisJcmV0ID0gYWZzX3NlcnZlcl9nZXRfZnNjb25uKHNlcnZlciwgJmNvbm4pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIGNyZWF0ZSBhIGNhbGwgdGhyb3VnaCB0aGF0IGNvbm5lY3Rpb24gKi8KKwlyZXQgPSByeHJwY19jcmVhdGVfY2FsbChjb25uLCBOVUxMLCBOVUxMLCBhZnNfcnhmc19hZW1hcCwgJmNhbGwpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50aygia0FGUzogVW5hYmxlIHRvIGNyZWF0ZSBjYWxsOiAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXRfcHV0X2Nvbm47CisJfQorCWNhbGwtPmFwcF9vcGNvZGUgPSBGU0dFVFZPTFVNRUlORk87CisKKwkvKiB3ZSB3YW50IHRvIGdldCBldmVudCBub3RpZmljYXRpb25zIGZyb20gdGhlIGNhbGwgKi8KKwlhZGRfd2FpdF9xdWV1ZSgmY2FsbC0+d2FpdHEsICZteXNlbGYpOworCisJLyogbWFyc2hhbGwgdGhlIHBhcmFtZXRlcnMgKi8KKwlwaW92WzFdLmlvdl9sZW4gPSBzdHJsZW4obmFtZSk7CisJcGlvdlsxXS5pb3ZfYmFzZSA9IChjaGFyICopIG5hbWU7CisKKwl6ZXJvID0gMDsKKwlwaW92WzJdLmlvdl9sZW4gPSAoNCAtIChwaW92WzFdLmlvdl9sZW4gJiAzKSkgJiAzOworCXBpb3ZbMl0uaW92X2Jhc2UgPSAmemVybzsKKworCXBhcmFtWzBdID0gaHRvbmwoRlNHRVRWT0xVTUVJTkZPKTsKKwlwYXJhbVsxXSA9IGh0b25sKHBpb3ZbMV0uaW92X2xlbik7CisKKwlwaW92WzBdLmlvdl9sZW4gPSBzaXplb2YocGFyYW0pOworCXBpb3ZbMF0uaW92X2Jhc2UgPSBwYXJhbTsKKworCS8qIHNlbmQgdGhlIHBhcmFtZXRlcnMgdG8gdGhlIHNlcnZlciAqLworCXJldCA9IHJ4cnBjX2NhbGxfd3JpdGVfZGF0YShjYWxsLCAzLCBwaW92LCBSWFJQQ19MQVNUX1BBQ0tFVCwgR0ZQX05PRlMsCisJCQkJICAgIDAsICZzZW50KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBhYm9ydDsKKworCS8qIHdhaXQgZm9yIHRoZSByZXBseSB0byBjb21wbGV0ZWx5IGFycml2ZSAqLworCWJwID0gcnhycGNfY2FsbF9hbGxvY19zY3JhdGNoKGNhbGwsIDY0KTsKKworCXJldCA9IHJ4cnBjX2NhbGxfcmVhZF9kYXRhKGNhbGwsIGJwLCA2NCwKKwkJCQkgICBSWFJQQ19DQUxMX1JFQURfQkxPQ0sgfAorCQkJCSAgIFJYUlBDX0NBTExfUkVBRF9BTEwpOworCWlmIChyZXQgPCAwKSB7CisJCWlmIChyZXQgPT0gLUVDT05OQUJPUlRFRCkgeworCQkJcmV0ID0gY2FsbC0+YXBwX2Vycm5vOworCQkJZ290byBvdXRfdW53YWl0OworCQl9CisJCWdvdG8gYWJvcnQ7CisJfQorCisJLyogdW5tYXJzaGFsbCB0aGUgcmVwbHkgKi8KKwl2aW5mby0+dmlkID0gbnRvaGwoKmJwKyspOworCXZpbmZvLT50eXBlID0gbnRvaGwoKmJwKyspOworCisJdmluZm8tPnR5cGVfdmlkc1swXSA9IG50b2hsKCpicCsrKTsKKwl2aW5mby0+dHlwZV92aWRzWzFdID0gbnRvaGwoKmJwKyspOworCXZpbmZvLT50eXBlX3ZpZHNbMl0gPSBudG9obCgqYnArKyk7CisJdmluZm8tPnR5cGVfdmlkc1szXSA9IG50b2hsKCpicCsrKTsKKwl2aW5mby0+dHlwZV92aWRzWzRdID0gbnRvaGwoKmJwKyspOworCisJdmluZm8tPm5zZXJ2ZXJzID0gbnRvaGwoKmJwKyspOworCXZpbmZvLT5zZXJ2ZXJzWzBdLmFkZHIuc19hZGRyID0gKmJwKys7CisJdmluZm8tPnNlcnZlcnNbMV0uYWRkci5zX2FkZHIgPSAqYnArKzsKKwl2aW5mby0+c2VydmVyc1syXS5hZGRyLnNfYWRkciA9ICpicCsrOworCXZpbmZvLT5zZXJ2ZXJzWzNdLmFkZHIuc19hZGRyID0gKmJwKys7CisJdmluZm8tPnNlcnZlcnNbNF0uYWRkci5zX2FkZHIgPSAqYnArKzsKKwl2aW5mby0+c2VydmVyc1s1XS5hZGRyLnNfYWRkciA9ICpicCsrOworCXZpbmZvLT5zZXJ2ZXJzWzZdLmFkZHIuc19hZGRyID0gKmJwKys7CisJdmluZm8tPnNlcnZlcnNbN10uYWRkci5zX2FkZHIgPSAqYnArKzsKKworCXJldCA9IC1FQkFETVNHOworCWlmICh2aW5mby0+bnNlcnZlcnMgPiA4KQorCQlnb3RvIGFib3J0OworCisJLyogc3VjY2VzcyAqLworCXJldCA9IDA7CisKKyBvdXRfdW53YWl0OgorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJmNhbGwtPndhaXRxLCAmbXlzZWxmKTsKKwlyeHJwY19wdXRfY2FsbChjYWxsKTsKKyBvdXRfcHV0X2Nvbm46CisJYWZzX3NlcnZlcl9yZWxlYXNlX2ZzY29ubihzZXJ2ZXIsIGNvbm4pOworIG91dDoKKwlfbGVhdmUoIiIpOworCXJldHVybiByZXQ7CisKKyBhYm9ydDoKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJcnhycGNfY2FsbF9hYm9ydChjYWxsLCByZXQpOworCXNjaGVkdWxlKCk7CisJZ290byBvdXRfdW53YWl0OworCit9IC8qIGVuZCBhZnNfcnhmc19nZXRfdm9sdW1lX2luZm8oKSAqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBmZXRjaCB0aGUgc3RhdHVzIGluZm9ybWF0aW9uIGZvciBhIGZpbGUKKyAqLworaW50IGFmc19yeGZzX2ZldGNoX2ZpbGVfc3RhdHVzKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCQkgICAgICAgc3RydWN0IGFmc192bm9kZSAqdm5vZGUsCisJCQkgICAgICAgc3RydWN0IGFmc192b2xzeW5jICp2b2xzeW5jKQoreworCXN0cnVjdCBhZnNfc2VydmVyX2NhbGxzbG90IGNhbGxzbG90OworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOworCXN0cnVjdCBrdmVjIHBpb3ZbMV07CisJc2l6ZV90IHNlbnQ7CisJaW50IHJldDsKKwlfX2JlMzIgKmJwOworCisJREVDTEFSRV9XQUlUUVVFVUUobXlzZWxmLCBjdXJyZW50KTsKKworCV9lbnRlcigiJXAseyV1LCV1LCV1fSIsCisJICAgICAgIHNlcnZlciwgdm5vZGUtPmZpZC52aWQsIHZub2RlLT5maWQudm5vZGUsIHZub2RlLT5maWQudW5pcXVlKTsKKworCS8qIGdldCBob2xkIG9mIHRoZSBmaWxlc2VydmVyIGNvbm5lY3Rpb24gKi8KKwlyZXQgPSBhZnNfc2VydmVyX3JlcXVlc3RfY2FsbHNsb3Qoc2VydmVyLCAmY2FsbHNsb3QpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIGNyZWF0ZSBhIGNhbGwgdGhyb3VnaCB0aGF0IGNvbm5lY3Rpb24gKi8KKwlyZXQgPSByeHJwY19jcmVhdGVfY2FsbChjYWxsc2xvdC5jb25uLCBOVUxMLCBOVUxMLCBhZnNfcnhmc19hZW1hcCwKKwkJCQkmY2FsbCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKCJrQUZTOiBVbmFibGUgdG8gY3JlYXRlIGNhbGw6ICVkXG4iLCByZXQpOworCQlnb3RvIG91dF9wdXRfY29ubjsKKwl9CisJY2FsbC0+YXBwX29wY29kZSA9IEZTRkVUQ0hTVEFUVVM7CisKKwkvKiB3ZSB3YW50IHRvIGdldCBldmVudCBub3RpZmljYXRpb25zIGZyb20gdGhlIGNhbGwgKi8KKwlhZGRfd2FpdF9xdWV1ZSgmY2FsbC0+d2FpdHEsICZteXNlbGYpOworCisJLyogbWFyc2hhbGwgdGhlIHBhcmFtZXRlcnMgKi8KKwlicCA9IHJ4cnBjX2NhbGxfYWxsb2Nfc2NyYXRjaChjYWxsLCAxNik7CisJYnBbMF0gPSBodG9ubChGU0ZFVENIU1RBVFVTKTsKKwlicFsxXSA9IGh0b25sKHZub2RlLT5maWQudmlkKTsKKwlicFsyXSA9IGh0b25sKHZub2RlLT5maWQudm5vZGUpOworCWJwWzNdID0gaHRvbmwodm5vZGUtPmZpZC51bmlxdWUpOworCisJcGlvdlswXS5pb3ZfbGVuID0gMTY7CisJcGlvdlswXS5pb3ZfYmFzZSA9IGJwOworCisJLyogc2VuZCB0aGUgcGFyYW1ldGVycyB0byB0aGUgc2VydmVyICovCisJcmV0ID0gcnhycGNfY2FsbF93cml0ZV9kYXRhKGNhbGwsIDEsIHBpb3YsIFJYUlBDX0xBU1RfUEFDS0VULCBHRlBfTk9GUywKKwkJCQkgICAgMCwgJnNlbnQpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGFib3J0OworCisJLyogd2FpdCBmb3IgdGhlIHJlcGx5IHRvIGNvbXBsZXRlbHkgYXJyaXZlICovCisJYnAgPSByeHJwY19jYWxsX2FsbG9jX3NjcmF0Y2goY2FsbCwgMTIwKTsKKworCXJldCA9IHJ4cnBjX2NhbGxfcmVhZF9kYXRhKGNhbGwsIGJwLCAxMjAsCisJCQkJICAgUlhSUENfQ0FMTF9SRUFEX0JMT0NLIHwKKwkJCQkgICBSWFJQQ19DQUxMX1JFQURfQUxMKTsKKwlpZiAocmV0IDwgMCkgeworCQlpZiAocmV0ID09IC1FQ09OTkFCT1JURUQpIHsKKwkJCXJldCA9IGNhbGwtPmFwcF9lcnJubzsKKwkJCWdvdG8gb3V0X3Vud2FpdDsKKwkJfQorCQlnb3RvIGFib3J0OworCX0KKworCS8qIHVubWFyc2hhbGwgdGhlIHJlcGx5ICovCisJdm5vZGUtPnN0YXR1cy5pZl92ZXJzaW9uCT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5zdGF0dXMudHlwZQkJPSBudG9obCgqYnArKyk7CisJdm5vZGUtPnN0YXR1cy5ubGluawkJPSBudG9obCgqYnArKyk7CisJdm5vZGUtPnN0YXR1cy5zaXplCQk9IG50b2hsKCpicCsrKTsKKwl2bm9kZS0+c3RhdHVzLnZlcnNpb24JCT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5zdGF0dXMuYXV0aG9yCQk9IG50b2hsKCpicCsrKTsKKwl2bm9kZS0+c3RhdHVzLm93bmVyCQk9IG50b2hsKCpicCsrKTsKKwl2bm9kZS0+c3RhdHVzLmNhbGxlcl9hY2Nlc3MJPSBudG9obCgqYnArKyk7CisJdm5vZGUtPnN0YXR1cy5hbm9uX2FjY2Vzcwk9IG50b2hsKCpicCsrKTsKKwl2bm9kZS0+c3RhdHVzLm1vZGUJCT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5zdGF0dXMucGFyZW50LnZpZAk9IHZub2RlLT5maWQudmlkOworCXZub2RlLT5zdGF0dXMucGFyZW50LnZub2RlCT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5zdGF0dXMucGFyZW50LnVuaXF1ZQk9IG50b2hsKCpicCsrKTsKKwlicCsrOyAvKiBzZWcgc2l6ZSAqLworCXZub2RlLT5zdGF0dXMubXRpbWVfY2xpZW50CT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5zdGF0dXMubXRpbWVfc2VydmVyCT0gbnRvaGwoKmJwKyspOworCWJwKys7IC8qIGdyb3VwICovCisJYnArKzsgLyogc3luYyBjb3VudGVyICovCisJdm5vZGUtPnN0YXR1cy52ZXJzaW9uIHw9ICgodW5zaWduZWQgbG9uZyBsb25nKSBudG9obCgqYnArKykpIDw8IDMyOworCWJwKys7IC8qIHNwYXJlMiAqLworCWJwKys7IC8qIHNwYXJlMyAqLworCWJwKys7IC8qIHNwYXJlNCAqLworCisJdm5vZGUtPmNiX3ZlcnNpb24JCT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5jYl9leHBpcnkJCT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5jYl90eXBlCQkJPSBudG9obCgqYnArKyk7CisKKwlpZiAodm9sc3luYykgeworCQl2b2xzeW5jLT5jcmVhdGlvbgk9IG50b2hsKCpicCsrKTsKKwkJYnArKzsgLyogc3BhcmUyICovCisJCWJwKys7IC8qIHNwYXJlMyAqLworCQlicCsrOyAvKiBzcGFyZTQgKi8KKwkJYnArKzsgLyogc3BhcmU1ICovCisJCWJwKys7IC8qIHNwYXJlNiAqLworCX0KKworCS8qIHN1Y2Nlc3MgKi8KKwlyZXQgPSAwOworCisgb3V0X3Vud2FpdDoKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZjYWxsLT53YWl0cSwgJm15c2VsZik7CisJcnhycGNfcHV0X2NhbGwoY2FsbCk7Cisgb3V0X3B1dF9jb25uOgorCWFmc19zZXJ2ZXJfcmVsZWFzZV9jYWxsc2xvdChzZXJ2ZXIsICZjYWxsc2xvdCk7Cisgb3V0OgorCV9sZWF2ZSgiIik7CisJcmV0dXJuIHJldDsKKworIGFib3J0OgorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwlyeHJwY19jYWxsX2Fib3J0KGNhbGwsIHJldCk7CisJc2NoZWR1bGUoKTsKKwlnb3RvIG91dF91bndhaXQ7Cit9IC8qIGVuZCBhZnNfcnhmc19mZXRjaF9maWxlX3N0YXR1cygpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBmZXRjaCB0aGUgY29udGVudHMgb2YgYSBmaWxlIG9yIGRpcmVjdG9yeQorICovCitpbnQgYWZzX3J4ZnNfZmV0Y2hfZmlsZV9kYXRhKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCQkgICAgIHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLAorCQkJICAgICBzdHJ1Y3QgYWZzX3J4ZnNfZmV0Y2hfZGVzY3JpcHRvciAqZGVzYywKKwkJCSAgICAgc3RydWN0IGFmc192b2xzeW5jICp2b2xzeW5jKQoreworCXN0cnVjdCBhZnNfc2VydmVyX2NhbGxzbG90IGNhbGxzbG90OworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOworCXN0cnVjdCBrdmVjIHBpb3ZbMV07CisJc2l6ZV90IHNlbnQ7CisJaW50IHJldDsKKwlfX2JlMzIgKmJwOworCisJREVDTEFSRV9XQUlUUVVFVUUobXlzZWxmLCBjdXJyZW50KTsKKworCV9lbnRlcigiJXAse2ZpZD17JXUsJXUsJXV9LHN6PSVadSxvZj0lbHV9IiwKKwkgICAgICAgc2VydmVyLAorCSAgICAgICBkZXNjLT5maWQudmlkLAorCSAgICAgICBkZXNjLT5maWQudm5vZGUsCisJICAgICAgIGRlc2MtPmZpZC51bmlxdWUsCisJICAgICAgIGRlc2MtPnNpemUsCisJICAgICAgIGRlc2MtPm9mZnNldCk7CisKKwkvKiBnZXQgaG9sZCBvZiB0aGUgZmlsZXNlcnZlciBjb25uZWN0aW9uICovCisJcmV0ID0gYWZzX3NlcnZlcl9yZXF1ZXN0X2NhbGxzbG90KHNlcnZlciwgJmNhbGxzbG90KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiBjcmVhdGUgYSBjYWxsIHRocm91Z2ggdGhhdCBjb25uZWN0aW9uICovCisJcmV0ID0gcnhycGNfY3JlYXRlX2NhbGwoY2FsbHNsb3QuY29ubiwgTlVMTCwgTlVMTCwgYWZzX3J4ZnNfYWVtYXAsICZjYWxsKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoImtBRlM6IFVuYWJsZSB0byBjcmVhdGUgY2FsbDogJWRcbiIsIHJldCk7CisJCWdvdG8gb3V0X3B1dF9jb25uOworCX0KKwljYWxsLT5hcHBfb3Bjb2RlID0gRlNGRVRDSERBVEE7CisKKwkvKiB3ZSB3YW50IHRvIGdldCBldmVudCBub3RpZmljYXRpb25zIGZyb20gdGhlIGNhbGwgKi8KKwlhZGRfd2FpdF9xdWV1ZSgmY2FsbC0+d2FpdHEsICZteXNlbGYpOworCisJLyogbWFyc2hhbGwgdGhlIHBhcmFtZXRlcnMgKi8KKwlicCA9IHJ4cnBjX2NhbGxfYWxsb2Nfc2NyYXRjaChjYWxsLCAyNCk7CisJYnBbMF0gPSBodG9ubChGU0ZFVENIREFUQSk7CisJYnBbMV0gPSBodG9ubChkZXNjLT5maWQudmlkKTsKKwlicFsyXSA9IGh0b25sKGRlc2MtPmZpZC52bm9kZSk7CisJYnBbM10gPSBodG9ubChkZXNjLT5maWQudW5pcXVlKTsKKwlicFs0XSA9IGh0b25sKGRlc2MtPm9mZnNldCk7CisJYnBbNV0gPSBodG9ubChkZXNjLT5zaXplKTsKKworCXBpb3ZbMF0uaW92X2xlbiA9IDI0OworCXBpb3ZbMF0uaW92X2Jhc2UgPSBicDsKKworCS8qIHNlbmQgdGhlIHBhcmFtZXRlcnMgdG8gdGhlIHNlcnZlciAqLworCXJldCA9IHJ4cnBjX2NhbGxfd3JpdGVfZGF0YShjYWxsLCAxLCBwaW92LCBSWFJQQ19MQVNUX1BBQ0tFVCwgR0ZQX05PRlMsCisJCQkJICAgIDAsICZzZW50KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBhYm9ydDsKKworCS8qIHdhaXQgZm9yIHRoZSBkYXRhIGNvdW50IHRvIGFycml2ZSAqLworCXJldCA9IHJ4cnBjX2NhbGxfcmVhZF9kYXRhKGNhbGwsIGJwLCA0LCBSWFJQQ19DQUxMX1JFQURfQkxPQ0spOworCWlmIChyZXQgPCAwKQorCQlnb3RvIHJlYWRfZmFpbGVkOworCisJZGVzYy0+YWN0dWFsID0gbnRvaGwoYnBbMF0pOworCWlmIChkZXNjLT5hY3R1YWwgIT0gZGVzYy0+c2l6ZSkgeworCQlyZXQgPSAtRUJBRE1TRzsKKwkJZ290byBhYm9ydDsKKwl9CisKKwkvKiBjYWxsIHRoZSBhcHAgdG8gcmVhZCB0aGUgYWN0dWFsIGRhdGEgKi8KKwlyeHJwY19jYWxsX3Jlc2V0X3NjcmF0Y2goY2FsbCk7CisKKwlyZXQgPSByeHJwY19jYWxsX3JlYWRfZGF0YShjYWxsLCBkZXNjLT5idWZmZXIsIGRlc2MtPmFjdHVhbCwKKwkJCQkgICBSWFJQQ19DQUxMX1JFQURfQkxPQ0spOworCWlmIChyZXQgPCAwKQorCQlnb3RvIHJlYWRfZmFpbGVkOworCisJLyogd2FpdCBmb3IgdGhlIHJlc3Qgb2YgdGhlIHJlcGx5IHRvIGNvbXBsZXRlbHkgYXJyaXZlICovCisJcnhycGNfY2FsbF9yZXNldF9zY3JhdGNoKGNhbGwpOworCWJwID0gcnhycGNfY2FsbF9hbGxvY19zY3JhdGNoKGNhbGwsIDEyMCk7CisKKwlyZXQgPSByeHJwY19jYWxsX3JlYWRfZGF0YShjYWxsLCBicCwgMTIwLAorCQkJCSAgIFJYUlBDX0NBTExfUkVBRF9CTE9DSyB8CisJCQkJICAgUlhSUENfQ0FMTF9SRUFEX0FMTCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gcmVhZF9mYWlsZWQ7CisKKwkvKiB1bm1hcnNoYWxsIHRoZSByZXBseSAqLworCXZub2RlLT5zdGF0dXMuaWZfdmVyc2lvbgk9IG50b2hsKCpicCsrKTsKKwl2bm9kZS0+c3RhdHVzLnR5cGUJCT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5zdGF0dXMubmxpbmsJCT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5zdGF0dXMuc2l6ZQkJPSBudG9obCgqYnArKyk7CisJdm5vZGUtPnN0YXR1cy52ZXJzaW9uCQk9IG50b2hsKCpicCsrKTsKKwl2bm9kZS0+c3RhdHVzLmF1dGhvcgkJPSBudG9obCgqYnArKyk7CisJdm5vZGUtPnN0YXR1cy5vd25lcgkJPSBudG9obCgqYnArKyk7CisJdm5vZGUtPnN0YXR1cy5jYWxsZXJfYWNjZXNzCT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5zdGF0dXMuYW5vbl9hY2Nlc3MJPSBudG9obCgqYnArKyk7CisJdm5vZGUtPnN0YXR1cy5tb2RlCQk9IG50b2hsKCpicCsrKTsKKwl2bm9kZS0+c3RhdHVzLnBhcmVudC52aWQJPSBkZXNjLT5maWQudmlkOworCXZub2RlLT5zdGF0dXMucGFyZW50LnZub2RlCT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5zdGF0dXMucGFyZW50LnVuaXF1ZQk9IG50b2hsKCpicCsrKTsKKwlicCsrOyAvKiBzZWcgc2l6ZSAqLworCXZub2RlLT5zdGF0dXMubXRpbWVfY2xpZW50CT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5zdGF0dXMubXRpbWVfc2VydmVyCT0gbnRvaGwoKmJwKyspOworCWJwKys7IC8qIGdyb3VwICovCisJYnArKzsgLyogc3luYyBjb3VudGVyICovCisJdm5vZGUtPnN0YXR1cy52ZXJzaW9uIHw9ICgodW5zaWduZWQgbG9uZyBsb25nKSBudG9obCgqYnArKykpIDw8IDMyOworCWJwKys7IC8qIHNwYXJlMiAqLworCWJwKys7IC8qIHNwYXJlMyAqLworCWJwKys7IC8qIHNwYXJlNCAqLworCisJdm5vZGUtPmNiX3ZlcnNpb24JCT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5jYl9leHBpcnkJCT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5jYl90eXBlCQkJPSBudG9obCgqYnArKyk7CisKKwlpZiAodm9sc3luYykgeworCQl2b2xzeW5jLT5jcmVhdGlvbgk9IG50b2hsKCpicCsrKTsKKwkJYnArKzsgLyogc3BhcmUyICovCisJCWJwKys7IC8qIHNwYXJlMyAqLworCQlicCsrOyAvKiBzcGFyZTQgKi8KKwkJYnArKzsgLyogc3BhcmU1ICovCisJCWJwKys7IC8qIHNwYXJlNiAqLworCX0KKworCS8qIHN1Y2Nlc3MgKi8KKwlyZXQgPSAwOworCisgb3V0X3Vud2FpdDoKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZjYWxsLT53YWl0cSwmbXlzZWxmKTsKKwlyeHJwY19wdXRfY2FsbChjYWxsKTsKKyBvdXRfcHV0X2Nvbm46CisJYWZzX3NlcnZlcl9yZWxlYXNlX2NhbGxzbG90KHNlcnZlciwgJmNhbGxzbG90KTsKKyBvdXQ6CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKKworIHJlYWRfZmFpbGVkOgorCWlmIChyZXQgPT0gLUVDT05OQUJPUlRFRCkgeworCQlyZXQgPSBjYWxsLT5hcHBfZXJybm87CisJCWdvdG8gb3V0X3Vud2FpdDsKKwl9CisKKyBhYm9ydDoKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJcnhycGNfY2FsbF9hYm9ydChjYWxsLCByZXQpOworCXNjaGVkdWxlKCk7CisJZ290byBvdXRfdW53YWl0OworCit9IC8qIGVuZCBhZnNfcnhmc19mZXRjaF9maWxlX2RhdGEoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogYXNrIHRoZSBBRlMgZmlsZXNlcnZlciB0byBkaXNjYXJkIGEgY2FsbGJhY2sgcmVxdWVzdCBvbiBhIGZpbGUKKyAqLworaW50IGFmc19yeGZzX2dpdmVfdXBfY2FsbGJhY2soc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKKwkJCSAgICAgIHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlKQoreworCXN0cnVjdCBhZnNfc2VydmVyX2NhbGxzbG90IGNhbGxzbG90OworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOworCXN0cnVjdCBrdmVjIHBpb3ZbMV07CisJc2l6ZV90IHNlbnQ7CisJaW50IHJldDsKKwlfX2JlMzIgKmJwOworCisJREVDTEFSRV9XQUlUUVVFVUUobXlzZWxmLCBjdXJyZW50KTsKKworCV9lbnRlcigiJXAseyV1LCV1LCV1fSIsCisJICAgICAgIHNlcnZlciwgdm5vZGUtPmZpZC52aWQsIHZub2RlLT5maWQudm5vZGUsIHZub2RlLT5maWQudW5pcXVlKTsKKworCS8qIGdldCBob2xkIG9mIHRoZSBmaWxlc2VydmVyIGNvbm5lY3Rpb24gKi8KKwlyZXQgPSBhZnNfc2VydmVyX3JlcXVlc3RfY2FsbHNsb3Qoc2VydmVyLCAmY2FsbHNsb3QpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIGNyZWF0ZSBhIGNhbGwgdGhyb3VnaCB0aGF0IGNvbm5lY3Rpb24gKi8KKwlyZXQgPSByeHJwY19jcmVhdGVfY2FsbChjYWxsc2xvdC5jb25uLCBOVUxMLCBOVUxMLCBhZnNfcnhmc19hZW1hcCwgJmNhbGwpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50aygia0FGUzogVW5hYmxlIHRvIGNyZWF0ZSBjYWxsOiAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXRfcHV0X2Nvbm47CisJfQorCWNhbGwtPmFwcF9vcGNvZGUgPSBGU0dJVkVVUENBTExCQUNLUzsKKworCS8qIHdlIHdhbnQgdG8gZ2V0IGV2ZW50IG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgY2FsbCAqLworCWFkZF93YWl0X3F1ZXVlKCZjYWxsLT53YWl0cSwgJm15c2VsZik7CisKKwkvKiBtYXJzaGFsbCB0aGUgcGFyYW1ldGVycyAqLworCWJwID0gcnhycGNfY2FsbF9hbGxvY19zY3JhdGNoKGNhbGwsICgxICsgNCArIDQpICogNCk7CisKKwlwaW92WzBdLmlvdl9sZW4gPSAoMSArIDQgKyA0KSAqIDQ7CisJcGlvdlswXS5pb3ZfYmFzZSA9IGJwOworCisJKmJwKysgPSBodG9ubChGU0dJVkVVUENBTExCQUNLUyk7CisJKmJwKysgPSBodG9ubCgxKTsKKwkqYnArKyA9IGh0b25sKHZub2RlLT5maWQudmlkKTsKKwkqYnArKyA9IGh0b25sKHZub2RlLT5maWQudm5vZGUpOworCSpicCsrID0gaHRvbmwodm5vZGUtPmZpZC51bmlxdWUpOworCSpicCsrID0gaHRvbmwoMSk7CisJKmJwKysgPSBodG9ubCh2bm9kZS0+Y2JfdmVyc2lvbik7CisJKmJwKysgPSBodG9ubCh2bm9kZS0+Y2JfZXhwaXJ5KTsKKwkqYnArKyA9IGh0b25sKHZub2RlLT5jYl90eXBlKTsKKworCS8qIHNlbmQgdGhlIHBhcmFtZXRlcnMgdG8gdGhlIHNlcnZlciAqLworCXJldCA9IHJ4cnBjX2NhbGxfd3JpdGVfZGF0YShjYWxsLCAxLCBwaW92LCBSWFJQQ19MQVNUX1BBQ0tFVCwgR0ZQX05PRlMsCisJCQkJICAgIDAsICZzZW50KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBhYm9ydDsKKworCS8qIHdhaXQgZm9yIHRoZSByZXBseSB0byBjb21wbGV0ZWx5IGFycml2ZSAqLworCWZvciAoOzspIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKGNhbGwtPmFwcF9jYWxsX3N0YXRlICE9IFJYUlBDX0NTVEFURV9DTE5UX1JDVl9SRVBMWSB8fAorCQkgICAgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlicmVhazsKKwkJc2NoZWR1bGUoKTsKKwl9CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworCXJldCA9IC1FSU5UUjsKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCWdvdG8gYWJvcnQ7CisKKwlzd2l0Y2ggKGNhbGwtPmFwcF9jYWxsX3N0YXRlKSB7CisJY2FzZSBSWFJQQ19DU1RBVEVfRVJST1I6CisJCXJldCA9IGNhbGwtPmFwcF9lcnJubzsKKwkJZ290byBvdXRfdW53YWl0OworCisJY2FzZSBSWFJQQ19DU1RBVEVfQ0xOVF9HT1RfUkVQTFk6CisJCXJldCA9IDA7CisJCWdvdG8gb3V0X3Vud2FpdDsKKworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworIG91dF91bndhaXQ6CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmY2FsbC0+d2FpdHEsICZteXNlbGYpOworCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOworIG91dF9wdXRfY29ubjoKKwlhZnNfc2VydmVyX3JlbGVhc2VfY2FsbHNsb3Qoc2VydmVyLCAmY2FsbHNsb3QpOworIG91dDoKKwlfbGVhdmUoIiIpOworCXJldHVybiByZXQ7CisKKyBhYm9ydDoKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJcnhycGNfY2FsbF9hYm9ydChjYWxsLCByZXQpOworCXNjaGVkdWxlKCk7CisJZ290byBvdXRfdW53YWl0OworfSAvKiBlbmQgYWZzX3J4ZnNfZ2l2ZV91cF9jYWxsYmFjaygpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBsb29rIGEgZmlsZW5hbWUgdXAgaW4gYSBkaXJlY3RvcnkKKyAqIC0gdGhpcyBvcGVyYXRpb24gZG9lc24ndCBzZWVtIHRvIHdvcmsgY29ycmVjdGx5IGluIE9wZW5BRlMgc2VydmVyIDEuMi4yCisgKi8KKyNpZiAwCitpbnQgYWZzX3J4ZnNfbG9va3VwKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCSAgICBzdHJ1Y3QgYWZzX3Zub2RlICpkaXIsCisJCSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwKKwkJICAgIHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLAorCQkgICAgc3RydWN0IGFmc192b2xzeW5jICp2b2xzeW5jKQoreworCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uOworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOworCXN0cnVjdCBrdmVjIHBpb3ZbM107CisJc2l6ZV90IHNlbnQ7CisJaW50IHJldDsKKwl1MzIgKmJwLCB6ZXJvOworCisJREVDTEFSRV9XQUlUUVVFVUUobXlzZWxmLCBjdXJyZW50KTsKKworCWtlbnRlcigiJXAseyV1LCV1LCV1fSwlcyIsCisJICAgICAgIHNlcnZlciwgZmlkLT52aWQsIGZpZC0+dm5vZGUsIGZpZC0+dW5pcXVlLCBmaWxlbmFtZSk7CisKKwkvKiBnZXQgaG9sZCBvZiB0aGUgZmlsZXNlcnZlciBjb25uZWN0aW9uICovCisJcmV0ID0gYWZzX3NlcnZlcl9nZXRfZnNjb25uKHNlcnZlciwgJmNvbm4pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIGNyZWF0ZSBhIGNhbGwgdGhyb3VnaCB0aGF0IGNvbm5lY3Rpb24gKi8KKwlyZXQgPSByeHJwY19jcmVhdGVfY2FsbChjb25uLCBOVUxMLCBOVUxMLCBhZnNfcnhmc19hZW1hcCwgJmNhbGwpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50aygia0FGUzogVW5hYmxlIHRvIGNyZWF0ZSBjYWxsOiAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXRfcHV0X2Nvbm47CisJfQorCWNhbGwtPmFwcF9vcGNvZGUgPSBGU0xPT0tVUDsKKworCS8qIHdlIHdhbnQgdG8gZ2V0IGV2ZW50IG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgY2FsbCAqLworCWFkZF93YWl0X3F1ZXVlKCZjYWxsLT53YWl0cSwmbXlzZWxmKTsKKworCS8qIG1hcnNoYWxsIHRoZSBwYXJhbWV0ZXJzICovCisJYnAgPSByeHJwY19jYWxsX2FsbG9jX3NjcmF0Y2goY2FsbCwgMjApOworCisJemVybyA9IDA7CisKKwlwaW92WzBdLmlvdl9sZW4gPSAyMDsKKwlwaW92WzBdLmlvdl9iYXNlID0gYnA7CisJcGlvdlsxXS5pb3ZfbGVuID0gc3RybGVuKGZpbGVuYW1lKTsKKwlwaW92WzFdLmlvdl9iYXNlID0gKGNoYXIgKikgZmlsZW5hbWU7CisJcGlvdlsyXS5pb3ZfbGVuID0gKDQgLSAocGlvdlsxXS5pb3ZfbGVuICYgMykpICYgMzsKKwlwaW92WzJdLmlvdl9iYXNlID0gJnplcm87CisKKwkqYnArKyA9IGh0b25sKEZTTE9PS1VQKTsKKwkqYnArKyA9IGh0b25sKGRpcmZpZC0+dmlkKTsKKwkqYnArKyA9IGh0b25sKGRpcmZpZC0+dm5vZGUpOworCSpicCsrID0gaHRvbmwoZGlyZmlkLT51bmlxdWUpOworCSpicCsrID0gaHRvbmwocGlvdlsxXS5pb3ZfbGVuKTsKKworCS8qIHNlbmQgdGhlIHBhcmFtZXRlcnMgdG8gdGhlIHNlcnZlciAqLworCXJldCA9IHJ4cnBjX2NhbGxfd3JpdGVfZGF0YShjYWxsLCAzLCBwaW92LCBSWFJQQ19MQVNUX1BBQ0tFVCwgR0ZQX05PRlMsCisJCQkJICAgIDAsICZzZW50KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBhYm9ydDsKKworCS8qIHdhaXQgZm9yIHRoZSByZXBseSB0byBjb21wbGV0ZWx5IGFycml2ZSAqLworCWJwID0gcnhycGNfY2FsbF9hbGxvY19zY3JhdGNoKGNhbGwsIDIyMCk7CisKKwlyZXQgPSByeHJwY19jYWxsX3JlYWRfZGF0YShjYWxsLCBicCwgMjIwLAorCQkJCSAgIFJYUlBDX0NBTExfUkVBRF9CTE9DSyB8CisJCQkJICAgUlhSUENfQ0FMTF9SRUFEX0FMTCk7CisJaWYgKHJldCA8IDApIHsKKwkJaWYgKHJldCA9PSAtRUNPTk5BQk9SVEVEKSB7CisJCQlyZXQgPSBjYWxsLT5hcHBfZXJybm87CisJCQlnb3RvIG91dF91bndhaXQ7CisJCX0KKwkJZ290byBhYm9ydDsKKwl9CisKKwkvKiB1bm1hcnNoYWxsIHRoZSByZXBseSAqLworCWZpZC0+dmlkCQk9IG50b2hsKCpicCsrKTsKKwlmaWQtPnZub2RlCQk9IG50b2hsKCpicCsrKTsKKwlmaWQtPnVuaXF1ZQkJPSBudG9obCgqYnArKyk7CisKKwl2bm9kZS0+c3RhdHVzLmlmX3ZlcnNpb24JPSBudG9obCgqYnArKyk7CisJdm5vZGUtPnN0YXR1cy50eXBlCQk9IG50b2hsKCpicCsrKTsKKwl2bm9kZS0+c3RhdHVzLm5saW5rCQk9IG50b2hsKCpicCsrKTsKKwl2bm9kZS0+c3RhdHVzLnNpemUJCT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5zdGF0dXMudmVyc2lvbgkJPSBudG9obCgqYnArKyk7CisJdm5vZGUtPnN0YXR1cy5hdXRob3IJCT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5zdGF0dXMub3duZXIJCT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5zdGF0dXMuY2FsbGVyX2FjY2Vzcwk9IG50b2hsKCpicCsrKTsKKwl2bm9kZS0+c3RhdHVzLmFub25fYWNjZXNzCT0gbnRvaGwoKmJwKyspOworCXZub2RlLT5zdGF0dXMubW9kZQkJPSBudG9obCgqYnArKyk7CisJdm5vZGUtPnN0YXR1cy5wYXJlbnQudmlkCT0gZGlyZmlkLT52aWQ7CisJdm5vZGUtPnN0YXR1cy5wYXJlbnQudm5vZGUJPSBudG9obCgqYnArKyk7CisJdm5vZGUtPnN0YXR1cy5wYXJlbnQudW5pcXVlCT0gbnRvaGwoKmJwKyspOworCWJwKys7IC8qIHNlZyBzaXplICovCisJdm5vZGUtPnN0YXR1cy5tdGltZV9jbGllbnQJPSBudG9obCgqYnArKyk7CisJdm5vZGUtPnN0YXR1cy5tdGltZV9zZXJ2ZXIJPSBudG9obCgqYnArKyk7CisJYnArKzsgLyogZ3JvdXAgKi8KKwlicCsrOyAvKiBzeW5jIGNvdW50ZXIgKi8KKwl2bm9kZS0+c3RhdHVzLnZlcnNpb24gfD0gKCh1bnNpZ25lZCBsb25nIGxvbmcpIG50b2hsKCpicCsrKSkgPDwgMzI7CisJYnArKzsgLyogc3BhcmUyICovCisJYnArKzsgLyogc3BhcmUzICovCisJYnArKzsgLyogc3BhcmU0ICovCisKKwlkaXItPnN0YXR1cy5pZl92ZXJzaW9uCQk9IG50b2hsKCpicCsrKTsKKwlkaXItPnN0YXR1cy50eXBlCQk9IG50b2hsKCpicCsrKTsKKwlkaXItPnN0YXR1cy5ubGluawkJPSBudG9obCgqYnArKyk7CisJZGlyLT5zdGF0dXMuc2l6ZQkJPSBudG9obCgqYnArKyk7CisJZGlyLT5zdGF0dXMudmVyc2lvbgkJPSBudG9obCgqYnArKyk7CisJZGlyLT5zdGF0dXMuYXV0aG9yCQk9IG50b2hsKCpicCsrKTsKKwlkaXItPnN0YXR1cy5vd25lcgkJPSBudG9obCgqYnArKyk7CisJZGlyLT5zdGF0dXMuY2FsbGVyX2FjY2Vzcwk9IG50b2hsKCpicCsrKTsKKwlkaXItPnN0YXR1cy5hbm9uX2FjY2VzcwkJPSBudG9obCgqYnArKyk7CisJZGlyLT5zdGF0dXMubW9kZQkJPSBudG9obCgqYnArKyk7CisJZGlyLT5zdGF0dXMucGFyZW50LnZpZAkJPSBkaXJmaWQtPnZpZDsKKwlkaXItPnN0YXR1cy5wYXJlbnQudm5vZGUJPSBudG9obCgqYnArKyk7CisJZGlyLT5zdGF0dXMucGFyZW50LnVuaXF1ZQk9IG50b2hsKCpicCsrKTsKKwlicCsrOyAvKiBzZWcgc2l6ZSAqLworCWRpci0+c3RhdHVzLm10aW1lX2NsaWVudAk9IG50b2hsKCpicCsrKTsKKwlkaXItPnN0YXR1cy5tdGltZV9zZXJ2ZXIJPSBudG9obCgqYnArKyk7CisJYnArKzsgLyogZ3JvdXAgKi8KKwlicCsrOyAvKiBzeW5jIGNvdW50ZXIgKi8KKwlkaXItPnN0YXR1cy52ZXJzaW9uIHw9ICgodW5zaWduZWQgbG9uZyBsb25nKSBudG9obCgqYnArKykpIDw8IDMyOworCWJwKys7IC8qIHNwYXJlMiAqLworCWJwKys7IC8qIHNwYXJlMyAqLworCWJwKys7IC8qIHNwYXJlNCAqLworCisJY2FsbGJhY2stPmZpZAkJPSAqZmlkOworCWNhbGxiYWNrLT52ZXJzaW9uCT0gbnRvaGwoKmJwKyspOworCWNhbGxiYWNrLT5leHBpcnkJPSBudG9obCgqYnArKyk7CisJY2FsbGJhY2stPnR5cGUJCT0gbnRvaGwoKmJwKyspOworCisJaWYgKHZvbHN5bmMpIHsKKwkJdm9sc3luYy0+Y3JlYXRpb24JPSBudG9obCgqYnArKyk7CisJCWJwKys7IC8qIHNwYXJlMiAqLworCQlicCsrOyAvKiBzcGFyZTMgKi8KKwkJYnArKzsgLyogc3BhcmU0ICovCisJCWJwKys7IC8qIHNwYXJlNSAqLworCQlicCsrOyAvKiBzcGFyZTYgKi8KKwl9CisKKwkvKiBzdWNjZXNzICovCisJcmV0ID0gMDsKKworIG91dF91bndhaXQ6CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmY2FsbC0+d2FpdHEsICZteXNlbGYpOworCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOworIG91dF9wdXRfY29ubjoKKwlhZnNfc2VydmVyX3JlbGVhc2VfZnNjb25uKHNlcnZlciwgY29ubik7Cisgb3V0OgorCWtsZWF2ZSgiIik7CisJcmV0dXJuIHJldDsKKworIGFib3J0OgorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwlyeHJwY19jYWxsX2Fib3J0KGNhbGwsIHJldCk7CisJc2NoZWR1bGUoKTsKKwlnb3RvIG91dF91bndhaXQ7Cit9IC8qIGVuZCBhZnNfcnhmc19sb29rdXAoKSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9hZnMvZnNjbGllbnQuaCBiL2ZzL2Fmcy9mc2NsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYTNlNzQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZnMvZnNjbGllbnQuaApAQCAtMCwwICsxLDU0IEBACisvKiBmc2NsaWVudC5oOiBBRlMgRmlsZSBTZXJ2ZXIgY2xpZW50IHN0dWIgZGVjbGFyYXRpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0FGU19GU0NMSUVOVF9ICisjZGVmaW5lIF9MSU5VWF9BRlNfRlNDTElFTlRfSAorCisjaW5jbHVkZSAic2VydmVyLmgiCisKK2V4dGVybiBpbnQgYWZzX3J4ZnNfZ2V0X3ZvbHVtZV9pbmZvKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCQkJICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgIHN0cnVjdCBhZnNfdm9sdW1lX2luZm8gKnZpbmZvKTsKKworZXh0ZXJuIGludCBhZnNfcnhmc19mZXRjaF9maWxlX3N0YXR1cyhzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAorCQkJCSAgICAgIHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLAorCQkJCSAgICAgIHN0cnVjdCBhZnNfdm9sc3luYyAqdm9sc3luYyk7CisKK3N0cnVjdCBhZnNfcnhmc19mZXRjaF9kZXNjcmlwdG9yIHsKKwlzdHJ1Y3QgYWZzX2ZpZAlmaWQ7CQkvKiBmaWxlIElEIHRvIGZldGNoICovCisJc2l6ZV90CQlzaXplOwkJLyogdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHRvIGZldGNoICovCisJb2ZmX3QJCW9mZnNldDsJCS8qIG9mZnNldCBpbiBmaWxlIHRvIHN0YXJ0IGZyb20gKi8KKwl2b2lkCQkqYnVmZmVyOwkvKiByZWFkIGJ1ZmZlciAqLworCXNpemVfdAkJYWN0dWFsOwkJLyogYWN0dWFsIHNpemUgc2VudCBiYWNrIGJ5IHNlcnZlciAqLworfTsKKworZXh0ZXJuIGludCBhZnNfcnhmc19mZXRjaF9maWxlX2RhdGEoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKKwkJCQkgICAgc3RydWN0IGFmc192bm9kZSAqdm5vZGUsCisJCQkJICAgIHN0cnVjdCBhZnNfcnhmc19mZXRjaF9kZXNjcmlwdG9yICpkZXNjLAorCQkJCSAgICBzdHJ1Y3QgYWZzX3ZvbHN5bmMgKnZvbHN5bmMpOworCitleHRlcm4gaW50IGFmc19yeGZzX2dpdmVfdXBfY2FsbGJhY2soc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKKwkJCQkgICAgIHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlKTsKKworLyogdGhpcyBkb2Vzbid0IGFwcGVhciB0byB3b3JrIGluIE9wZW5BRlMgc2VydmVyICovCitleHRlcm4gaW50IGFmc19yeGZzX2xvb2t1cChzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAorCQkJICAgc3RydWN0IGFmc192bm9kZSAqZGlyLAorCQkJICAgY29uc3QgY2hhciAqZmlsZW5hbWUsCisJCQkgICBzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSwKKwkJCSAgIHN0cnVjdCBhZnNfdm9sc3luYyAqdm9sc3luYyk7CisKKy8qIHRoaXMgaXMgYXBwYXJlbnRseSBtaXMtaW1wbGVtZW50ZWQgaW4gT3BlbkFGUyBzZXJ2ZXIgKi8KK2V4dGVybiBpbnQgYWZzX3J4ZnNfZ2V0X3Jvb3Rfdm9sdW1lKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCQkJICAgIGNoYXIgKmJ1ZiwKKwkJCQkgICAgc2l6ZV90ICpidWZsZW4pOworCisKKyNlbmRpZiAvKiBfTElOVVhfQUZTX0ZTQ0xJRU5UX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9pbm9kZS5jIGIvZnMvYWZzL2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ3NmZkZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Fmcy9pbm9kZS5jCkBAIC0wLDAgKzEsMjg3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBmcmVlbHkgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIEF1dGhvcnM6IERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAY2FtYnJpZGdlLnJlZGhhdC5jb20+CisgKiAgICAgICAgICBEYXZpZCBIb3dlbGxzIDxkaG93ZWxsc0ByZWRoYXQuY29tPgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgInZvbHVtZS5oIgorI2luY2x1ZGUgInZub2RlLmgiCisjaW5jbHVkZSAic3VwZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitzdHJ1Y3QgYWZzX2lnZXRfZGF0YSB7CisJc3RydWN0IGFmc19maWQJCWZpZDsKKwlzdHJ1Y3QgYWZzX3ZvbHVtZQkqdm9sdW1lOwkvKiB2b2x1bWUgb24gd2hpY2ggcmVzaWRlcyAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIG1hcCB0aGUgQUZTIGZpbGUgc3RhdHVzIHRvIHRoZSBpbm9kZSBtZW1iZXIgdmFyaWFibGVzCisgKi8KK3N0YXRpYyBpbnQgYWZzX2lub2RlX21hcF9zdGF0dXMoc3RydWN0IGFmc192bm9kZSAqdm5vZGUpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IEFGU19WTk9ERV9UT19JKHZub2RlKTsKKworCV9kZWJ1ZygiRlM6IGZ0PSVkIGxrPSVkIHN6PSVadSB2ZXI9JUx1IG1vZD0laHUiLAorCSAgICAgICB2bm9kZS0+c3RhdHVzLnR5cGUsCisJICAgICAgIHZub2RlLT5zdGF0dXMubmxpbmssCisJICAgICAgIHZub2RlLT5zdGF0dXMuc2l6ZSwKKwkgICAgICAgdm5vZGUtPnN0YXR1cy52ZXJzaW9uLAorCSAgICAgICB2bm9kZS0+c3RhdHVzLm1vZGUpOworCisJc3dpdGNoICh2bm9kZS0+c3RhdHVzLnR5cGUpIHsKKwljYXNlIEFGU19GVFlQRV9GSUxFOgorCQlpbm9kZS0+aV9tb2RlCT0gU19JRlJFRyB8IHZub2RlLT5zdGF0dXMubW9kZTsKKwkJaW5vZGUtPmlfb3AJPSAmYWZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wCT0gJmFmc19maWxlX2ZpbGVfb3BlcmF0aW9uczsKKwkJYnJlYWs7CisJY2FzZSBBRlNfRlRZUEVfRElSOgorCQlpbm9kZS0+aV9tb2RlCT0gU19JRkRJUiB8IHZub2RlLT5zdGF0dXMubW9kZTsKKwkJaW5vZGUtPmlfb3AJPSAmYWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9mb3AJPSAmYWZzX2Rpcl9maWxlX29wZXJhdGlvbnM7CisJCWJyZWFrOworCWNhc2UgQUZTX0ZUWVBFX1NZTUxJTks6CisJCWlub2RlLT5pX21vZGUJPSBTX0lGTE5LIHwgdm5vZGUtPnN0YXR1cy5tb2RlOworCQlpbm9kZS0+aV9vcAk9ICZwYWdlX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKCJrQUZTOiBBRlMgdm5vZGUgd2l0aCB1bmRlZmluZWQgdHlwZVxuIik7CisJCXJldHVybiAtRUJBRE1TRzsKKwl9CisKKwlpbm9kZS0+aV9ubGluawkJPSB2bm9kZS0+c3RhdHVzLm5saW5rOworCWlub2RlLT5pX3VpZAkJPSB2bm9kZS0+c3RhdHVzLm93bmVyOworCWlub2RlLT5pX2dpZAkJPSAwOworCWlub2RlLT5pX3NpemUJCT0gdm5vZGUtPnN0YXR1cy5zaXplOworCWlub2RlLT5pX2N0aW1lLnR2X3NlYwk9IHZub2RlLT5zdGF0dXMubXRpbWVfc2VydmVyOworCWlub2RlLT5pX2N0aW1lLnR2X25zZWMJPSAwOworCWlub2RlLT5pX2F0aW1lCQk9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWU7CisJaW5vZGUtPmlfYmxrc2l6ZQk9IFBBR0VfQ0FDSEVfU0laRTsKKwlpbm9kZS0+aV9ibG9ja3MJCT0gMDsKKwlpbm9kZS0+aV92ZXJzaW9uCT0gdm5vZGUtPmZpZC51bmlxdWU7CisJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMJPSAmYWZzX2ZzX2FvcHM7CisKKwkvKiBjaGVjayB0byBzZWUgd2hldGhlciBhIHN5bWJvbGljIGxpbmsgaXMgcmVhbGx5IGEgbW91bnRwb2ludCAqLworCWlmICh2bm9kZS0+c3RhdHVzLnR5cGUgPT0gQUZTX0ZUWVBFX1NZTUxJTkspIHsKKwkJYWZzX21udHB0X2NoZWNrX3N5bWxpbmsodm5vZGUpOworCisJCWlmICh2bm9kZS0+ZmxhZ3MgJiBBRlNfVk5PREVfTU9VTlRQT0lOVCkgeworCQkJaW5vZGUtPmlfbW9kZQk9IFNfSUZESVIgfCB2bm9kZS0+c3RhdHVzLm1vZGU7CisJCQlpbm9kZS0+aV9vcAk9ICZhZnNfbW50cHRfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWlub2RlLT5pX2ZvcAk9ICZhZnNfbW50cHRfZmlsZV9vcGVyYXRpb25zOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9IC8qIGVuZCBhZnNfaW5vZGVfbWFwX3N0YXR1cygpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBhdHRlbXB0IHRvIGZldGNoIHRoZSBzdGF0dXMgb2YgYW4gaW5vZGUsIGNvZWxlc2NpbmcgbXVsdGlwbGUgc2ltdWx0YW5lb3VzCisgKiBmZXRjaGVzCisgKi8KK3N0YXRpYyBpbnQgYWZzX2lub2RlX2ZldGNoX3N0YXR1cyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlOworCWludCByZXQ7CisKKwl2bm9kZSA9IEFGU19GU19JKGlub2RlKTsKKworCXJldCA9IGFmc192bm9kZV9mZXRjaF9zdGF0dXModm5vZGUpOworCisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSBhZnNfaW5vZGVfbWFwX3N0YXR1cyh2bm9kZSk7CisKKwlyZXR1cm4gcmV0OworCit9IC8qIGVuZCBhZnNfaW5vZGVfZmV0Y2hfc3RhdHVzKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGlnZXQ1KCkgY29tcGFyYXRvcgorICovCitzdGF0aWMgaW50IGFmc19pZ2V0NV90ZXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKm9wYXF1ZSkKK3sKKwlzdHJ1Y3QgYWZzX2lnZXRfZGF0YSAqZGF0YSA9IG9wYXF1ZTsKKworCXJldHVybiBpbm9kZS0+aV9pbm8gPT0gZGF0YS0+ZmlkLnZub2RlICYmCisJCWlub2RlLT5pX3ZlcnNpb24gPT0gZGF0YS0+ZmlkLnVuaXF1ZTsKK30gLyogZW5kIGFmc19pZ2V0NV90ZXN0KCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGlnZXQ1KCkgaW5vZGUgaW5pdGlhbGlzZXIKKyAqLworc3RhdGljIGludCBhZnNfaWdldDVfc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKm9wYXF1ZSkKK3sKKwlzdHJ1Y3QgYWZzX2lnZXRfZGF0YSAqZGF0YSA9IG9wYXF1ZTsKKwlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSA9IEFGU19GU19JKGlub2RlKTsKKworCWlub2RlLT5pX2lubyA9IGRhdGEtPmZpZC52bm9kZTsKKwlpbm9kZS0+aV92ZXJzaW9uID0gZGF0YS0+ZmlkLnVuaXF1ZTsKKwl2bm9kZS0+ZmlkID0gZGF0YS0+ZmlkOworCXZub2RlLT52b2x1bWUgPSBkYXRhLT52b2x1bWU7CisKKwlyZXR1cm4gMDsKK30gLyogZW5kIGFmc19pZ2V0NV9zZXQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogaW5vZGUgcmV0cmlldmFsCisgKi8KK2lubGluZSBpbnQgYWZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGFmc19maWQgKmZpZCwKKwkJICAgIHN0cnVjdCBpbm9kZSAqKl9pbm9kZSkKK3sKKwlzdHJ1Y3QgYWZzX2lnZXRfZGF0YSBkYXRhID0geyAuZmlkID0gKmZpZCB9OworCXN0cnVjdCBhZnNfc3VwZXJfaW5mbyAqYXM7CisJc3RydWN0IGFmc192bm9kZSAqdm5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgcmV0OworCisJX2VudGVyKCIseyV1LCV1LCV1fSwsIiwgZmlkLT52aWQsIGZpZC0+dm5vZGUsIGZpZC0+dW5pcXVlKTsKKworCWFzID0gc2ItPnNfZnNfaW5mbzsKKwlkYXRhLnZvbHVtZSA9IGFzLT52b2x1bWU7CisKKwlpbm9kZSA9IGlnZXQ1X2xvY2tlZChzYiwgZmlkLT52bm9kZSwgYWZzX2lnZXQ1X3Rlc3QsIGFmc19pZ2V0NV9zZXQsCisJCQkgICAgICZkYXRhKTsKKwlpZiAoIWlub2RlKSB7CisJCV9sZWF2ZSgiID0gLUVOT01FTSIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl2bm9kZSA9IEFGU19GU19JKGlub2RlKTsKKworCS8qIGRlYWwgd2l0aCBhbiBleGlzdGluZyBpbm9kZSAqLworCWlmICghKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpKSB7CisJCXJldCA9IGFmc192bm9kZV9mZXRjaF9zdGF0dXModm5vZGUpOworCQlpZiAocmV0PT0wKQorCQkJKl9pbm9kZSA9IGlub2RlOworCQllbHNlCisJCQlpcHV0KGlub2RlKTsKKwkJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorCS8qIHNldCB1cCBjYWNoaW5nIGJlZm9yZSByZWFkaW5nIHRoZSBzdGF0dXMsIGFzIGZldGNoLXN0YXR1cyByZWFkcyB0aGUKKwkgKiBmaXJzdCBwYWdlIG9mIHN5bWxpbmtzIHRvIHNlZSBpZiB0aGV5J3JlIHJlYWxseSBtbnRwdHMgKi8KKwljYWNoZWZzX2FjcXVpcmVfY29va2llKHZub2RlLT52b2x1bWUtPmNhY2hlLAorCQkJICAgICAgIE5VTEwsCisJCQkgICAgICAgdm5vZGUsCisJCQkgICAgICAgJnZub2RlLT5jYWNoZSk7CisjZW5kaWYKKworCS8qIG9rYXkuLi4gaXQncyBhIG5ldyBpbm9kZSAqLworCWlub2RlLT5pX2ZsYWdzIHw9IFNfTk9BVElNRTsKKwl2bm9kZS0+ZmxhZ3MgfD0gQUZTX1ZOT0RFX0NIQU5HRUQ7CisJcmV0ID0gYWZzX2lub2RlX2ZldGNoX3N0YXR1cyhpbm9kZSk7CisJaWYgKHJldDwwKQorCQlnb3RvIGJhZF9pbm9kZTsKKworCS8qIHN1Y2Nlc3MgKi8KKwl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKKworCSpfaW5vZGUgPSBpbm9kZTsKKwlfbGVhdmUoIiA9IDAgW0NCIHsgdj0ldSB4PSVsdSB0PSV1IH1dIiwKKwkgICAgICAgdm5vZGUtPmNiX3ZlcnNpb24sCisJICAgICAgIHZub2RlLT5jYl90aW1lb3V0LnRpbW9famlmLAorCSAgICAgICB2bm9kZS0+Y2JfdHlwZSk7CisJcmV0dXJuIDA7CisKKwkvKiBmYWlsdXJlICovCisgYmFkX2lub2RlOgorCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwl1bmxvY2tfbmV3X2lub2RlKGlub2RlKTsKKwlpcHV0KGlub2RlKTsKKworCV9sZWF2ZSgiID0gJWQgW2JhZF0iLCByZXQpOworCXJldHVybiByZXQ7Cit9IC8qIGVuZCBhZnNfaWdldCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiByZWFkIHRoZSBhdHRyaWJ1dGVzIG9mIGFuIGlub2RlCisgKi8KK2ludCBhZnNfaW5vZGVfZ2V0YXR0cihzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkgICAgICBzdHJ1Y3Qga3N0YXQgKnN0YXQpCit7CisJc3RydWN0IGFmc192bm9kZSAqdm5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgcmV0OworCisJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisKKwlfZW50ZXIoInsgaW5vPSVsdSB2PSVsdSB9IiwgaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV92ZXJzaW9uKTsKKworCXZub2RlID0gQUZTX0ZTX0koaW5vZGUpOworCisJcmV0ID0gYWZzX2lub2RlX2ZldGNoX3N0YXR1cyhpbm9kZSk7CisJaWYgKHJldCA9PSAtRU5PRU5UKSB7CisJCV9sZWF2ZSgiID0gJWQgWyVkICVwXSIsCisJCSAgICAgICByZXQsIGF0b21pY19yZWFkKCZkZW50cnktPmRfY291bnQpLCBkZW50cnktPmRfaW5vZGUpOworCQlyZXR1cm4gcmV0OworCX0KKwllbHNlIGlmIChyZXQgPCAwKSB7CisJCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwkJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogdHJhbnNmZXIgYXR0cmlidXRlcyBmcm9tIHRoZSBpbm9kZSBzdHJ1Y3R1cmUgdG8gdGhlIHN0YXQKKwkgKiBzdHJ1Y3R1cmUgKi8KKwlnZW5lcmljX2ZpbGxhdHRyKGlub2RlLCBzdGF0KTsKKworCV9sZWF2ZSgiID0gMCBDQiB7IHY9JXUgeD0ldSB0PSV1IH0iLAorCSAgICAgICB2bm9kZS0+Y2JfdmVyc2lvbiwKKwkgICAgICAgdm5vZGUtPmNiX2V4cGlyeSwKKwkgICAgICAgdm5vZGUtPmNiX3R5cGUpOworCisJcmV0dXJuIDA7Cit9IC8qIGVuZCBhZnNfaW5vZGVfZ2V0YXR0cigpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBjbGVhciBhbiBBRlMgaW5vZGUKKyAqLwordm9pZCBhZnNfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZTsKKworCXZub2RlID0gQUZTX0ZTX0koaW5vZGUpOworCisJX2VudGVyKCJpbm89JWx1IHsgdm49JTA4eCB2PSV1IHg9JXUgdD0ldSB9IiwKKwkgICAgICAgaW5vZGUtPmlfaW5vLAorCSAgICAgICB2bm9kZS0+ZmlkLnZub2RlLAorCSAgICAgICB2bm9kZS0+Y2JfdmVyc2lvbiwKKwkgICAgICAgdm5vZGUtPmNiX2V4cGlyeSwKKwkgICAgICAgdm5vZGUtPmNiX3R5cGUKKwkgICAgICAgKTsKKworCUJVR19PTihpbm9kZS0+aV9pbm8gIT0gdm5vZGUtPmZpZC52bm9kZSk7CisKKwlhZnNfdm5vZGVfZ2l2ZV91cF9jYWxsYmFjayh2bm9kZSk7CisKKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCisJY2FjaGVmc19yZWxpbnF1aXNoX2Nvb2tpZSh2bm9kZS0+Y2FjaGUsIDApOworCXZub2RlLT5jYWNoZSA9IE5VTEw7CisjZW5kaWYKKworCV9sZWF2ZSgiIik7Cit9IC8qIGVuZCBhZnNfY2xlYXJfaW5vZGUoKSAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL2ludGVybmFsLmggYi9mcy9hZnMvaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDk4NjBiCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL2ludGVybmFsLmgKQEAgLTAsMCArMSwxNDAgQEAKKy8qIGludGVybmFsLmg6IGludGVybmFsIEFGUyBzdHVmZgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIEFGU19JTlRFUk5BTF9ICisjZGVmaW5lIEFGU19JTlRFUk5BTF9ICisKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorCisvKgorICogZGVidWcgdHJhY2luZworICovCisjZGVmaW5lIGtlbnRlcihGTVQsIGEuLi4pCXByaW50aygiPT0+ICVzKCJGTVQiKVxuIixfX0ZVTkNUSU9OX18gLCAjIyBhKQorI2RlZmluZSBrbGVhdmUoRk1ULCBhLi4uKQlwcmludGsoIjw9PSAlcygpIkZNVCJcbiIsX19GVU5DVElPTl9fICwgIyMgYSkKKyNkZWZpbmUga2RlYnVnKEZNVCwgYS4uLikJcHJpbnRrKEZNVCJcbiIgLCAjIyBhKQorI2RlZmluZSBrcHJvdG8oRk1ULCBhLi4uKQlwcmludGsoIiMjIyAiRk1UIlxuIiAsICMjIGEpCisjZGVmaW5lIGtuZXQoRk1ULCBhLi4uKQkJcHJpbnRrKEZNVCJcbiIgLCAjIyBhKQorCisjaWZkZWYgX19LREVCVUcKKyNkZWZpbmUgX2VudGVyKEZNVCwgYS4uLikJa2VudGVyKEZNVCAsICMjIGEpCisjZGVmaW5lIF9sZWF2ZShGTVQsIGEuLi4pCWtsZWF2ZShGTVQgLCAjIyBhKQorI2RlZmluZSBfZGVidWcoRk1ULCBhLi4uKQlrZGVidWcoRk1UICwgIyMgYSkKKyNkZWZpbmUgX3Byb3RvKEZNVCwgYS4uLikJa3Byb3RvKEZNVCAsICMjIGEpCisjZGVmaW5lIF9uZXQoRk1ULCBhLi4uKQkJa25ldChGTVQgLCAjIyBhKQorI2Vsc2UKKyNkZWZpbmUgX2VudGVyKEZNVCwgYS4uLikJZG8geyB9IHdoaWxlKDApCisjZGVmaW5lIF9sZWF2ZShGTVQsIGEuLi4pCWRvIHsgfSB3aGlsZSgwKQorI2RlZmluZSBfZGVidWcoRk1ULCBhLi4uKQlkbyB7IH0gd2hpbGUoMCkKKyNkZWZpbmUgX3Byb3RvKEZNVCwgYS4uLikJZG8geyB9IHdoaWxlKDApCisjZGVmaW5lIF9uZXQoRk1ULCBhLi4uKQkJZG8geyB9IHdoaWxlKDApCisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkIGFmc19kaXNjYXJkX215X3NpZ25hbHModm9pZCkKK3sKKwl3aGlsZSAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJc2lnaW5mb190IHNpbmZvOworCisJCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCQlkZXF1ZXVlX3NpZ25hbChjdXJyZW50LCZjdXJyZW50LT5ibG9ja2VkLCAmc2luZm8pOworCQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCX0KK30KKworLyoKKyAqIGNlbGwuYworICovCitleHRlcm4gc3RydWN0IHJ3X3NlbWFwaG9yZSBhZnNfcHJvY19jZWxsc19zZW07CitleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBhZnNfcHJvY19jZWxsczsKKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCitleHRlcm4gc3RydWN0IGNhY2hlZnNfaW5kZXhfZGVmIGFmc19jYWNoZV9jZWxsX2luZGV4X2RlZjsKKyNlbmRpZgorCisvKgorICogZGlyLmMKKyAqLworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGFmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFmc19kaXJfZmlsZV9vcGVyYXRpb25zOworCisvKgorICogZmlsZS5jCisgKi8KK2V4dGVybiBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGFmc19mc19hb3BzOworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGFmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhZnNfZmlsZV9maWxlX29wZXJhdGlvbnM7CisKKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCitleHRlcm4gaW50IGFmc19jYWNoZV9nZXRfcGFnZV9jb29raWUoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJICAgICBzdHJ1Y3QgY2FjaGVmc19wYWdlICoqX3BhZ2VfY29va2llKTsKKyNlbmRpZgorCisvKgorICogaW5vZGUuYworICovCitleHRlcm4gaW50IGFmc19pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBhZnNfZmlkICpmaWQsCisJCSAgICBzdHJ1Y3QgaW5vZGUgKipfaW5vZGUpOworZXh0ZXJuIGludCBhZnNfaW5vZGVfZ2V0YXR0cihzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJICAgICBzdHJ1Y3Qga3N0YXQgKnN0YXQpOworZXh0ZXJuIHZvaWQgYWZzX2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworCisvKgorICoga2V5X2Fmcy5jCisgKi8KKyNpZmRlZiBDT05GSUdfS0VZUworZXh0ZXJuIGludCBhZnNfa2V5X3JlZ2lzdGVyKHZvaWQpOworZXh0ZXJuIHZvaWQgYWZzX2tleV91bnJlZ2lzdGVyKHZvaWQpOworI2VuZGlmCisKKy8qCisgKiBtYWluLmMKKyAqLworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKK2V4dGVybiBzdHJ1Y3QgY2FjaGVmc19uZXRmcyBhZnNfY2FjaGVfbmV0ZnM7CisjZW5kaWYKKworLyoKKyAqIG1udHB0LmMKKyAqLworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGFmc19tbnRwdF9pbm9kZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWZzX21udHB0X2ZpbGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgYWZzX3RpbWVyIGFmc19tbnRwdF9leHBpcnlfdGltZXI7CitleHRlcm4gc3RydWN0IGFmc190aW1lcl9vcHMgYWZzX21udHB0X2V4cGlyeV90aW1lcl9vcHM7CitleHRlcm4gdW5zaWduZWQgbG9uZyBhZnNfbW50cHRfZXhwaXJ5X3RpbWVvdXQ7CisKK2V4dGVybiBpbnQgYWZzX21udHB0X2NoZWNrX3N5bWxpbmsoc3RydWN0IGFmc192bm9kZSAqdm5vZGUpOworCisvKgorICogc3VwZXIuYworICovCitleHRlcm4gaW50IGFmc19mc19pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgYWZzX2ZzX2V4aXQodm9pZCk7CisKKyNkZWZpbmUgQUZTX0NCX0hBU0hfQ09VTlQgKFBBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKSkKKworZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgYWZzX2NiX2hhc2hfdGJsW107CitleHRlcm4gc3BpbmxvY2tfdCBhZnNfY2JfaGFzaF9sb2NrOworCisjZGVmaW5lIGFmc19jYl9oYXNoKFNSVixGSUQpIFwKKwlhZnNfY2JfaGFzaF90YmxbKCh1bnNpZ25lZCBsb25nKShTUlYpICsgXAorCQkJKEZJRCktPnZpZCArIChGSUQpLT52bm9kZSArIChGSUQpLT51bmlxdWUpICUgXAorCQkJQUZTX0NCX0hBU0hfQ09VTlRdCisKKy8qCisgKiBwcm9jLmMKKyAqLworZXh0ZXJuIGludCBhZnNfcHJvY19pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgYWZzX3Byb2NfY2xlYW51cCh2b2lkKTsKK2V4dGVybiBpbnQgYWZzX3Byb2NfY2VsbF9zZXR1cChzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwpOworZXh0ZXJuIHZvaWQgYWZzX3Byb2NfY2VsbF9yZW1vdmUoc3RydWN0IGFmc19jZWxsICpjZWxsKTsKKworI2VuZGlmIC8qIEFGU19JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9mcy9hZnMva2Fmc2FzeW5jZC5jIGIvZnMvYWZzL2thZnNhc3luY2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmM4OGFlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL2thZnNhc3luY2QuYwpAQCAtMCwwICsxLDI1NyBAQAorLyoga2Fmc2FzeW5jZC5jOiBBRlMgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBkYWVtb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoKKyAqIFRoZSBBRlMgYXN5bmMgZGFlbW9uIGlzIHVzZWQgdG8gdGhlIGZvbGxvd2luZzoKKyAqIC0gcHJvYmUgImRlYWQiIHNlcnZlcnMgdG8gc2VlIHdoZXRoZXIgdGhleSd2ZSBjb21lIGJhY2sgdG8gbGlmZSB5ZXQuCisgKiAtIHByb2JlICJsaXZlIiBzZXJ2ZXJzIHRoYXQgd2UgaGF2ZW4ndCB0YWxrZWQgdG8gZm9yIGEgd2hpbGUgdG8gc2VlIGlmIHRoZXkgYXJlIGJldHRlcgorICogICBjYW5kaWRhdGVzIGZvciBzZXJ2aW5nIHRoYW4gd2hhdCB3ZSdyZSBjdXJyZW50bHkgdXNpbmcKKyAqIC0gcG9sbCB2b2x1bWUgbG9jYXRpb24gc2VydmVycyB0byBrZWVwIHVwIHRvIGRhdGUgdm9sdW1lIGxvY2F0aW9uIGxpc3RzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlICJjZWxsLmgiCisjaW5jbHVkZSAic2VydmVyLmgiCisjaW5jbHVkZSAidm9sdW1lLmgiCisjaW5jbHVkZSAia2Fmc2FzeW5jZC5oIgorI2luY2x1ZGUgImthZnN0aW1vZC5oIgorI2luY2x1ZGUgPHJ4cnBjL2NhbGwuaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitzdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKGthZnNhc3luY2RfYWxpdmUpOworc3RhdGljIERFQ0xBUkVfQ09NUExFVElPTihrYWZzYXN5bmNkX2RlYWQpOworc3RhdGljIERFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGthZnNhc3luY2Rfc2xlZXBxKTsKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmthZnNhc3luY2RfdGFzazsKK3N0YXRpYyBpbnQga2Fmc2FzeW5jZF9kaWU7CisKK3N0YXRpYyBpbnQga2Fmc2FzeW5jZCh2b2lkICphcmcpOworCitzdGF0aWMgTElTVF9IRUFEKGthZnNhc3luY2RfYXN5bmNfYXR0bnEpOworc3RhdGljIExJU1RfSEVBRChrYWZzYXN5bmNkX2FzeW5jX2J1c3lxKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soa2Fmc2FzeW5jZF9hc3luY19sb2NrKTsKKworc3RhdGljIHZvaWQga2Fmc2FzeW5jZF9udWxsX2NhbGxfYXR0bl9mdW5jKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworfQorCitzdGF0aWMgdm9pZCBrYWZzYXN5bmNkX251bGxfY2FsbF9lcnJvcl9mdW5jKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKQoreworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogc3RhcnQgdGhlIGFzeW5jIGRhZW1vbgorICovCitpbnQgYWZzX2thZnNhc3luY2Rfc3RhcnQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0ga2VybmVsX3RocmVhZChrYWZzYXN5bmNkLCBOVUxMLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmthZnNhc3luY2RfYWxpdmUpOworCisJcmV0dXJuIHJldDsKK30gLyogZW5kIGFmc19rYWZzYXN5bmNkX3N0YXJ0KCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHN0b3AgdGhlIGFzeW5jIGRhZW1vbgorICovCit2b2lkIGFmc19rYWZzYXN5bmNkX3N0b3Aodm9pZCkKK3sKKwkvKiBnZXQgcmlkIG9mIG15IGRhZW1vbiAqLworCWthZnNhc3luY2RfZGllID0gMTsKKwl3YWtlX3VwKCZrYWZzYXN5bmNkX3NsZWVwcSk7CisJd2FpdF9mb3JfY29tcGxldGlvbigma2Fmc2FzeW5jZF9kZWFkKTsKKworfSAvKiBlbmQgYWZzX2thZnNhc3luY2Rfc3RvcCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBwcm9iaW5nIGRhZW1vbgorICovCitzdGF0aWMgaW50IGthZnNhc3luY2Qodm9pZCAqYXJnKQoreworCXN0cnVjdCBhZnNfYXN5bmNfb3AgKm9wOworCWludCBkaWU7CisKKwlERUNMQVJFX1dBSVRRVUVVRShteXNlbGYsIGN1cnJlbnQpOworCisJa2Fmc2FzeW5jZF90YXNrID0gY3VycmVudDsKKworCXByaW50aygia0FGUzogU3RhcnRlZCBrYWZzYXN5bmNkICVkXG4iLCBjdXJyZW50LT5waWQpOworCisJZGFlbW9uaXplKCJrYWZzYXN5bmNkIik7CisKKwljb21wbGV0ZSgma2Fmc2FzeW5jZF9hbGl2ZSk7CisKKwkvKiBsb29wIGFyb3VuZCBsb29raW5nIGZvciB0aGluZ3MgdG8gYXR0ZW5kIHRvICovCisJZG8geworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlhZGRfd2FpdF9xdWV1ZSgma2Fmc2FzeW5jZF9zbGVlcHEsICZteXNlbGYpOworCisJCWZvciAoOzspIHsKKwkJCWlmICghbGlzdF9lbXB0eSgma2Fmc2FzeW5jZF9hc3luY19hdHRucSkgfHwKKwkJCSAgICBzaWduYWxfcGVuZGluZyhjdXJyZW50KSB8fAorCQkJICAgIGthZnNhc3luY2RfZGllKQorCQkJCWJyZWFrOworCisJCQlzY2hlZHVsZSgpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJfQorCisJCXJlbW92ZV93YWl0X3F1ZXVlKCZrYWZzYXN5bmNkX3NsZWVwcSwgJm15c2VsZik7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisKKwkJdHJ5X3RvX2ZyZWV6ZShQRl9GUkVFWkUpOworCisJCS8qIGRpc2NhcmQgcGVuZGluZyBzaWduYWxzICovCisJCWFmc19kaXNjYXJkX215X3NpZ25hbHMoKTsKKworCQlkaWUgPSBrYWZzYXN5bmNkX2RpZTsKKworCQkvKiBkZWFsIHdpdGggdGhlIG5leHQgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiByZXF1aXJpbmcKKwkJICogYXR0ZW50aW9uICovCisJCWlmICghbGlzdF9lbXB0eSgma2Fmc2FzeW5jZF9hc3luY19hdHRucSkpIHsKKwkJCXN0cnVjdCBhZnNfYXN5bmNfb3AgKm9wOworCisJCQlfZGVidWcoIkBAQCBCZWdpbiBBc3luY2hyb25vdXMgT3BlcmF0aW9uIik7CisKKwkJCW9wID0gTlVMTDsKKwkJCXNwaW5fbG9jaygma2Fmc2FzeW5jZF9hc3luY19sb2NrKTsKKworCQkJaWYgKCFsaXN0X2VtcHR5KCZrYWZzYXN5bmNkX2FzeW5jX2F0dG5xKSkgeworCQkJCW9wID0gbGlzdF9lbnRyeShrYWZzYXN5bmNkX2FzeW5jX2F0dG5xLm5leHQsCisJCQkJCQlzdHJ1Y3QgYWZzX2FzeW5jX29wLCBsaW5rKTsKKwkJCQlsaXN0X2RlbCgmb3AtPmxpbmspOworCQkJCWxpc3RfYWRkX3RhaWwoJm9wLT5saW5rLAorCQkJCQkgICAgICAma2Fmc2FzeW5jZF9hc3luY19idXN5cSk7CisJCQl9CisKKwkJCXNwaW5fdW5sb2NrKCZrYWZzYXN5bmNkX2FzeW5jX2xvY2spOworCisJCQlfZGVidWcoIkBAQCBPcGVyYXRpb24gJXAgeyVwfVxuIiwKKwkJCSAgICAgICBvcCwgb3AgPyBvcC0+b3BzIDogTlVMTCk7CisKKwkJCWlmIChvcCkKKwkJCQlvcC0+b3BzLT5hdHRlbmQob3ApOworCisJCQlfZGVidWcoIkBAQCBFbmQgQXN5bmNocm9ub3VzIE9wZXJhdGlvbiIpOworCQl9CisKKwl9IHdoaWxlKCFkaWUpOworCisJLyogbmVlZCB0byBraWxsIGFsbCBvdXRzdGFuZGluZyBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBiZWZvcmUKKwkgKiBleGl0aW5nICovCisJa2Fmc2FzeW5jZF90YXNrID0gTlVMTDsKKwlzcGluX2xvY2soJmthZnNhc3luY2RfYXN5bmNfbG9jayk7CisKKwkvKiBmb2xkIHRoZSBidXN5IGFuZCBhdHRlbnRpb24gcXVldWVzIHRvZ2V0aGVyICovCisJbGlzdF9zcGxpY2VfaW5pdCgma2Fmc2FzeW5jZF9hc3luY19idXN5cSwKKwkJCSAma2Fmc2FzeW5jZF9hc3luY19hdHRucSk7CisKKwkvKiBkZXF1ZXVlIGthZnNhc3luY2QgZnJvbSBhbGwgdGhlaXIgd2FpdCBxdWV1ZXMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9wLCAma2Fmc2FzeW5jZF9hc3luY19hdHRucSwgbGluaykgeworCQlvcC0+Y2FsbC0+YXBwX2F0dG5fZnVuYyA9IGthZnNhc3luY2RfbnVsbF9jYWxsX2F0dG5fZnVuYzsKKwkJb3AtPmNhbGwtPmFwcF9lcnJvcl9mdW5jID0ga2Fmc2FzeW5jZF9udWxsX2NhbGxfZXJyb3JfZnVuYzsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJm9wLT5jYWxsLT53YWl0cSwgJm9wLT53YWl0ZXIpOworCX0KKworCXNwaW5fdW5sb2NrKCZrYWZzYXN5bmNkX2FzeW5jX2xvY2spOworCisJLyogYWJvcnQgYWxsIHRoZSBvcGVyYXRpb25zICovCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZrYWZzYXN5bmNkX2FzeW5jX2F0dG5xKSkgeworCQlvcCA9IGxpc3RfZW50cnkoa2Fmc2FzeW5jZF9hc3luY19hdHRucS5uZXh0LCBzdHJ1Y3QgYWZzX2FzeW5jX29wLCBsaW5rKTsKKwkJbGlzdF9kZWxfaW5pdCgmb3AtPmxpbmspOworCisJCXJ4cnBjX2NhbGxfYWJvcnQob3AtPmNhbGwsIC1FSU8pOworCQlyeHJwY19wdXRfY2FsbChvcC0+Y2FsbCk7CisJCW9wLT5jYWxsID0gTlVMTDsKKworCQlvcC0+b3BzLT5kaXNjYXJkKG9wKTsKKwl9CisKKwkvKiBhbmQgdGhhdCdzIGFsbCAqLworCV9sZWF2ZSgiIik7CisJY29tcGxldGVfYW5kX2V4aXQoJmthZnNhc3luY2RfZGVhZCwgMCk7CisKK30gLyogZW5kIGthZnNhc3luY2QoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogYmVnaW4gYW4gb3BlcmF0aW9uCisgKiAtIHBsYWNlIG9wZXJhdGlvbiBvbiBidXN5IHF1ZXVlCisgKi8KK3ZvaWQgYWZzX2thZnNhc3luY2RfYmVnaW5fb3Aoc3RydWN0IGFmc19hc3luY19vcCAqb3ApCit7CisJX2VudGVyKCIiKTsKKworCXNwaW5fbG9jaygma2Fmc2FzeW5jZF9hc3luY19sb2NrKTsKKworCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZvcC0+d2FpdGVyLCBrYWZzYXN5bmNkX3Rhc2spOworCWFkZF93YWl0X3F1ZXVlKCZvcC0+Y2FsbC0+d2FpdHEsICZvcC0+d2FpdGVyKTsKKworCWxpc3RfZGVsKCZvcC0+bGluayk7CisJbGlzdF9hZGRfdGFpbCgmb3AtPmxpbmssICZrYWZzYXN5bmNkX2FzeW5jX2J1c3lxKTsKKworCXNwaW5fdW5sb2NrKCZrYWZzYXN5bmNkX2FzeW5jX2xvY2spOworCisJX2xlYXZlKCIiKTsKK30gLyogZW5kIGFmc19rYWZzYXN5bmNkX2JlZ2luX29wKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHJlcXVlc3QgYXR0ZW50aW9uIGZvciBhbiBvcGVyYXRpb24KKyAqIC0gbW92ZSB0byBhdHRlbnRpb24gcXVldWUKKyAqLwordm9pZCBhZnNfa2Fmc2FzeW5jZF9hdHRlbmRfb3Aoc3RydWN0IGFmc19hc3luY19vcCAqb3ApCit7CisJX2VudGVyKCIiKTsKKworCXNwaW5fbG9jaygma2Fmc2FzeW5jZF9hc3luY19sb2NrKTsKKworCWxpc3RfZGVsKCZvcC0+bGluayk7CisJbGlzdF9hZGRfdGFpbCgmb3AtPmxpbmssICZrYWZzYXN5bmNkX2FzeW5jX2F0dG5xKTsKKworCXNwaW5fdW5sb2NrKCZrYWZzYXN5bmNkX2FzeW5jX2xvY2spOworCisJd2FrZV91cCgma2Fmc2FzeW5jZF9zbGVlcHEpOworCisJX2xlYXZlKCIiKTsKK30gLyogZW5kIGFmc19rYWZzYXN5bmNkX2F0dGVuZF9vcCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiB0ZXJtaW5hdGUgYW4gb3BlcmF0aW9uCisgKiAtIHJlbW92ZSBmcm9tIGVpdGhlciBxdWV1ZQorICovCit2b2lkIGFmc19rYWZzYXN5bmNkX3Rlcm1pbmF0ZV9vcChzdHJ1Y3QgYWZzX2FzeW5jX29wICpvcCkKK3sKKwlfZW50ZXIoIiIpOworCisJc3Bpbl9sb2NrKCZrYWZzYXN5bmNkX2FzeW5jX2xvY2spOworCisJaWYgKCFsaXN0X2VtcHR5KCZvcC0+bGluaykpIHsKKwkJbGlzdF9kZWxfaW5pdCgmb3AtPmxpbmspOworCQlyZW1vdmVfd2FpdF9xdWV1ZSgmb3AtPmNhbGwtPndhaXRxLCAmb3AtPndhaXRlcik7CisJfQorCisJc3Bpbl91bmxvY2soJmthZnNhc3luY2RfYXN5bmNfbG9jayk7CisKKwl3YWtlX3VwKCZrYWZzYXN5bmNkX3NsZWVwcSk7CisKKwlfbGVhdmUoIiIpOworfSAvKiBlbmQgYWZzX2thZnNhc3luY2RfdGVybWluYXRlX29wKCkgKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9rYWZzYXN5bmNkLmggYi9mcy9hZnMva2Fmc2FzeW5jZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MTgwM2YKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZnMva2Fmc2FzeW5jZC5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qIGthZnNhc3luY2QuaDogQUZTIGFzeW5jaHJvbm91cyBvcGVyYXRpb24gZGFlbW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0FGU19LQUZTQVNZTkNEX0gKKyNkZWZpbmUgX0xJTlVYX0FGU19LQUZTQVNZTkNEX0gKKworI2luY2x1ZGUgInR5cGVzLmgiCisKK3N0cnVjdCBhZnNfYXN5bmNfb3A7CisKK3N0cnVjdCBhZnNfYXN5bmNfb3Bfb3BzIHsKKwl2b2lkICgqYXR0ZW5kKShzdHJ1Y3QgYWZzX2FzeW5jX29wICpvcCk7CisJdm9pZCAoKmRpc2NhcmQpKHN0cnVjdCBhZnNfYXN5bmNfb3AgKm9wKTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHJlY29yZAorICovCitzdHJ1Y3QgYWZzX2FzeW5jX29wCit7CisJc3RydWN0IGxpc3RfaGVhZAkJbGluazsKKwlzdHJ1Y3QgYWZzX3NlcnZlcgkJKnNlcnZlcjsJLyogc2VydmVyIGJlaW5nIGNvbnRhY3RlZCAqLworCXN0cnVjdCByeHJwY19jYWxsCQkqY2FsbDsJCS8qIFJ4UlBDIGNhbGwgcGVyZm9ybWluZyBvcCAqLworCXdhaXRfcXVldWVfdAkJCXdhaXRlcjsJCS8qIHdhaXQgcXVldWUgZm9yIGthZnNhc3luY2QgKi8KKwljb25zdCBzdHJ1Y3QgYWZzX2FzeW5jX29wX29wcwkqb3BzOwkJLyogb3BlcmF0aW9ucyAqLworfTsKKworc3RhdGljIGlubGluZSB2b2lkIGFmc19hc3luY19vcF9pbml0KHN0cnVjdCBhZnNfYXN5bmNfb3AgKm9wLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IGFmc19hc3luY19vcF9vcHMgKm9wcykKK3sKKwlJTklUX0xJU1RfSEVBRCgmb3AtPmxpbmspOworCW9wLT5jYWxsID0gTlVMTDsKKwlvcC0+b3BzID0gb3BzOworfQorCitleHRlcm4gaW50IGFmc19rYWZzYXN5bmNkX3N0YXJ0KHZvaWQpOworZXh0ZXJuIHZvaWQgYWZzX2thZnNhc3luY2Rfc3RvcCh2b2lkKTsKKworZXh0ZXJuIHZvaWQgYWZzX2thZnNhc3luY2RfYmVnaW5fb3Aoc3RydWN0IGFmc19hc3luY19vcCAqb3ApOworZXh0ZXJuIHZvaWQgYWZzX2thZnNhc3luY2RfYXR0ZW5kX29wKHN0cnVjdCBhZnNfYXN5bmNfb3AgKm9wKTsKK2V4dGVybiB2b2lkIGFmc19rYWZzYXN5bmNkX3Rlcm1pbmF0ZV9vcChzdHJ1Y3QgYWZzX2FzeW5jX29wICpvcCk7CisKKyNlbmRpZiAvKiBfTElOVVhfQUZTX0tBRlNBU1lOQ0RfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL2thZnN0aW1vZC5jIGIvZnMvYWZzL2thZnN0aW1vZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZTcxMGQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZnMva2Fmc3RpbW9kLmMKQEAgLTAsMCArMSwyMDQgQEAKKy8qIGthZnN0aW1vZC5jOiBBRlMgdGltZW91dCBkYWVtb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlICJjZWxsLmgiCisjaW5jbHVkZSAidm9sdW1lLmgiCisjaW5jbHVkZSAia2Fmc3RpbW9kLmgiCisjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworc3RhdGljIERFQ0xBUkVfQ09NUExFVElPTihrYWZzdGltb2RfYWxpdmUpOworc3RhdGljIERFQ0xBUkVfQ09NUExFVElPTihrYWZzdGltb2RfZGVhZCk7CitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoa2Fmc3RpbW9kX3NsZWVwcSk7CitzdGF0aWMgaW50IGthZnN0aW1vZF9kaWU7CisKK3N0YXRpYyBMSVNUX0hFQUQoa2Fmc3RpbW9kX2xpc3QpOworc3RhdGljIERFRklORV9TUElOTE9DSyhrYWZzdGltb2RfbG9jayk7CisKK3N0YXRpYyBpbnQga2Fmc3RpbW9kKHZvaWQgKmFyZyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBzdGFydCB0aGUgdGltZW91dCBkYWVtb24KKyAqLworaW50IGFmc19rYWZzdGltb2Rfc3RhcnQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0ga2VybmVsX3RocmVhZChrYWZzdGltb2QsIE5VTEwsIDApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJd2FpdF9mb3JfY29tcGxldGlvbigma2Fmc3RpbW9kX2FsaXZlKTsKKworCXJldHVybiByZXQ7Cit9IC8qIGVuZCBhZnNfa2Fmc3RpbW9kX3N0YXJ0KCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHN0b3AgdGhlIHRpbWVvdXQgZGFlbW9uCisgKi8KK3ZvaWQgYWZzX2thZnN0aW1vZF9zdG9wKHZvaWQpCit7CisJLyogZ2V0IHJpZCBvZiBteSBkYWVtb24gKi8KKwlrYWZzdGltb2RfZGllID0gMTsKKwl3YWtlX3VwKCZrYWZzdGltb2Rfc2xlZXBxKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZrYWZzdGltb2RfZGVhZCk7CisKK30gLyogZW5kIGFmc19rYWZzdGltb2Rfc3RvcCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiB0aW1lb3V0IHByb2Nlc3NpbmcgZGFlbW9uCisgKi8KK3N0YXRpYyBpbnQga2Fmc3RpbW9kKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgYWZzX3RpbWVyICp0aW1lcjsKKworCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7CisKKwlwcmludGsoImtBRlM6IFN0YXJ0ZWQga2Fmc3RpbW9kICVkXG4iLCBjdXJyZW50LT5waWQpOworCisJZGFlbW9uaXplKCJrYWZzdGltb2QiKTsKKworCWNvbXBsZXRlKCZrYWZzdGltb2RfYWxpdmUpOworCisJLyogbG9vcCBhcm91bmQgbG9va2luZyBmb3IgdGhpbmdzIHRvIGF0dGVuZCB0byAqLworIGxvb3A6CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlhZGRfd2FpdF9xdWV1ZSgma2Fmc3RpbW9kX3NsZWVwcSwgJm15c2VsZik7CisKKwlmb3IgKDs7KSB7CisJCXVuc2lnbmVkIGxvbmcgamlmOworCQlzaWduZWQgbG9uZyB0aW1lb3V0OworCisJCS8qIGRlYWwgd2l0aCB0aGUgc2VydmVyIGJlaW5nIGFza2VkIHRvIGRpZSAqLworCQlpZiAoa2Fmc3RpbW9kX2RpZSkgeworCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmthZnN0aW1vZF9zbGVlcHEsICZteXNlbGYpOworCQkJX2xlYXZlKCIiKTsKKwkJCWNvbXBsZXRlX2FuZF9leGl0KCZrYWZzdGltb2RfZGVhZCwgMCk7CisJCX0KKworCQl0cnlfdG9fZnJlZXplKFBGX0ZSRUVaRSk7CisKKwkJLyogZGlzY2FyZCBwZW5kaW5nIHNpZ25hbHMgKi8KKwkJYWZzX2Rpc2NhcmRfbXlfc2lnbmFscygpOworCisJCS8qIHdvcmsgb3V0IHRoZSB0aW1lIHRvIGVsYXBzZSBiZWZvcmUgdGhlIG5leHQgZXZlbnQgKi8KKwkJc3Bpbl9sb2NrKCZrYWZzdGltb2RfbG9jayk7CisJCWlmIChsaXN0X2VtcHR5KCZrYWZzdGltb2RfbGlzdCkpIHsKKwkJCXRpbWVvdXQgPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKKwkJfQorCQllbHNlIHsKKwkJCXRpbWVyID0gbGlzdF9lbnRyeShrYWZzdGltb2RfbGlzdC5uZXh0LAorCQkJCQkgICBzdHJ1Y3QgYWZzX3RpbWVyLCBsaW5rKTsKKwkJCXRpbWVvdXQgPSB0aW1lci0+dGltb19qaWY7CisJCQlqaWYgPSBqaWZmaWVzOworCisJCQlpZiAodGltZV9iZWZvcmVfZXEoKHVuc2lnbmVkIGxvbmcpIHRpbWVvdXQsIGppZikpCisJCQkJZ290byBpbW1lZGlhdGU7CisKKwkJCWVsc2UgeworCQkJCXRpbWVvdXQgPSAobG9uZykgdGltZW91dCAtIChsb25nKSBqaWZmaWVzOworCQkJfQorCQl9CisJCXNwaW5fdW5sb2NrKCZrYWZzdGltb2RfbG9jayk7CisKKwkJc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKKworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCX0KKworCS8qIHRoZSB0aGluZyBvbiB0aGUgZnJvbnQgb2YgdGhlIHF1ZXVlIG5lZWRzIHByb2Nlc3NpbmcKKwkgKiAtIHdlIGNvbWUgaGVyZSB3aXRoIHRoZSBsb2NrIGhlbGQgYW5kIHRpbWVyIHBvaW50aW5nIHRvIHRoZSBleHBpcmVkCisJICogICBlbnRyeQorCSAqLworIGltbWVkaWF0ZToKKwlyZW1vdmVfd2FpdF9xdWV1ZSgma2Fmc3RpbW9kX3NsZWVwcSwgJm15c2VsZik7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworCV9kZWJ1ZygiQEBAIEJlZ2luIFRpbWVvdXQgb2YgJXAiLCB0aW1lcik7CisKKwkvKiBkZXF1ZXVlIHRoZSB0aW1lciAqLworCWxpc3RfZGVsX2luaXQoJnRpbWVyLT5saW5rKTsKKwlzcGluX3VubG9jaygma2Fmc3RpbW9kX2xvY2spOworCisJLyogY2FsbCB0aGUgdGltZW91dCBmdW5jdGlvbiAqLworCXRpbWVyLT5vcHMtPnRpbWVkX291dCh0aW1lcik7CisKKwlfZGVidWcoIkBAQCBFbmQgVGltZW91dCIpOworCWdvdG8gbG9vcDsKKworfSAvKiBlbmQga2Fmc3RpbW9kKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIChyZS0pcXVldWUgYSB0aW1lcgorICovCit2b2lkIGFmc19rYWZzdGltb2RfYWRkX3RpbWVyKHN0cnVjdCBhZnNfdGltZXIgKnRpbWVyLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCit7CisJc3RydWN0IGFmc190aW1lciAqcHRpbWVyOworCXN0cnVjdCBsaXN0X2hlYWQgKl9wOworCisJX2VudGVyKCIlcCwlbHUiLCB0aW1lciwgdGltZW91dCk7CisKKwlzcGluX2xvY2soJmthZnN0aW1vZF9sb2NrKTsKKworCWxpc3RfZGVsKCZ0aW1lci0+bGluayk7CisKKwkvKiB0aGUgdGltZXIgd2FzIGRlZmVycmVkIG9yIHJlc2V0IC0gcHV0IGl0IGJhY2sgaW4gdGhlIHF1ZXVlIGF0IHRoZQorCSAqIHJpZ2h0IHBsYWNlICovCisJdGltZXItPnRpbW9famlmID0gamlmZmllcyArIHRpbWVvdXQ7CisKKwlsaXN0X2Zvcl9lYWNoKF9wLCAma2Fmc3RpbW9kX2xpc3QpIHsKKwkJcHRpbWVyID0gbGlzdF9lbnRyeShfcCwgc3RydWN0IGFmc190aW1lciwgbGluayk7CisJCWlmICh0aW1lX2JlZm9yZSh0aW1lci0+dGltb19qaWYsIHB0aW1lci0+dGltb19qaWYpKQorCQkJYnJlYWs7CisJfQorCisJbGlzdF9hZGRfdGFpbCgmdGltZXItPmxpbmssIF9wKTsgLyogaW5zZXJ0IGJlZm9yZSBzdG9wcGluZyBwb2ludCAqLworCisJc3Bpbl91bmxvY2soJmthZnN0aW1vZF9sb2NrKTsKKworCXdha2VfdXAoJmthZnN0aW1vZF9zbGVlcHEpOworCisJX2xlYXZlKCIiKTsKK30gLyogZW5kIGFmc19rYWZzdGltb2RfYWRkX3RpbWVyKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGRlcXVldWUgYSB0aW1lcgorICogLSByZXR1cm5zIDAgaWYgdGhlIHRpbWVyIHdhcyBkZWxldGVkIG9yIC1FTk9FTlQgaWYgaXQgd2Fzbid0IHF1ZXVlZAorICovCitpbnQgYWZzX2thZnN0aW1vZF9kZWxfdGltZXIoc3RydWN0IGFmc190aW1lciAqdGltZXIpCit7CisJaW50IHJldCA9IDA7CisKKwlfZW50ZXIoIiVwIiwgdGltZXIpOworCisJc3Bpbl9sb2NrKCZrYWZzdGltb2RfbG9jayk7CisKKwlpZiAobGlzdF9lbXB0eSgmdGltZXItPmxpbmspKQorCQlyZXQgPSAtRU5PRU5UOworCWVsc2UKKwkJbGlzdF9kZWxfaW5pdCgmdGltZXItPmxpbmspOworCisJc3Bpbl91bmxvY2soJmthZnN0aW1vZF9sb2NrKTsKKworCXdha2VfdXAoJmthZnN0aW1vZF9zbGVlcHEpOworCisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30gLyogZW5kIGFmc19rYWZzdGltb2RfZGVsX3RpbWVyKCkgKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9rYWZzdGltb2QuaCBiL2ZzL2Fmcy9rYWZzdGltb2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzEyZjFhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL2thZnN0aW1vZC5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qIGthZnN0aW1vZC5oOiBBRlMgdGltZW91dCBkYWVtb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfTElOVVhfQUZTX0tBRlNUSU1PRF9ICisjZGVmaW5lIF9MSU5VWF9BRlNfS0FGU1RJTU9EX0gKKworI2luY2x1ZGUgInR5cGVzLmgiCisKK3N0cnVjdCBhZnNfdGltZXI7CisKK3N0cnVjdCBhZnNfdGltZXJfb3BzIHsKKwkvKiBjYWxsZWQgd2hlbiB0aGUgZnJvbnQgb2YgdGhlIHRpbWVyIHF1ZXVlIGhhcyB0aW1lZCBvdXQgKi8KKwl2b2lkICgqdGltZWRfb3V0KShzdHJ1Y3QgYWZzX3RpbWVyICp0aW1lcik7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQUZTIHRpbWVyL3RpbWVvdXQgcmVjb3JkCisgKi8KK3N0cnVjdCBhZnNfdGltZXIKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlsaW5rOwkJLyogbGluayBpbiB0aW1lciBxdWV1ZSAqLworCXVuc2lnbmVkIGxvbmcJCQl0aW1vX2ppZjsJLyogdGltZW91dCB0aW1lICovCisJY29uc3Qgc3RydWN0IGFmc190aW1lcl9vcHMJKm9wczsJCS8qIHRpbWVvdXQgZXhwaXJ5IGZ1bmN0aW9uICovCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgYWZzX3RpbWVyX2luaXQoc3RydWN0IGFmc190aW1lciAqdGltZXIsCisJCQkJICBjb25zdCBzdHJ1Y3QgYWZzX3RpbWVyX29wcyAqb3BzKQoreworCUlOSVRfTElTVF9IRUFEKCZ0aW1lci0+bGluayk7CisJdGltZXItPm9wcyA9IG9wczsKK30KKworZXh0ZXJuIGludCBhZnNfa2Fmc3RpbW9kX3N0YXJ0KHZvaWQpOworZXh0ZXJuIHZvaWQgYWZzX2thZnN0aW1vZF9zdG9wKHZvaWQpOworCitleHRlcm4gdm9pZCBhZnNfa2Fmc3RpbW9kX2FkZF90aW1lcihzdHJ1Y3QgYWZzX3RpbWVyICp0aW1lciwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKK2V4dGVybiBpbnQgYWZzX2thZnN0aW1vZF9kZWxfdGltZXIoc3RydWN0IGFmc190aW1lciAqdGltZXIpOworCisjZW5kaWYgLyogX0xJTlVYX0FGU19LQUZTVElNT0RfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL21haW4uYyBiL2ZzL2Fmcy9tYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEzYzY4OQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Fmcy9tYWluLmMKQEAgLTAsMCArMSwyODYgQEAKKy8qIG1haW4uYzogQUZTIGNsaWVudCBmaWxlIHN5c3RlbQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8cnhycGMvcnhycGMuaD4KKyNpbmNsdWRlIDxyeHJwYy90cmFuc3BvcnQuaD4KKyNpbmNsdWRlIDxyeHJwYy9jYWxsLmg+CisjaW5jbHVkZSA8cnhycGMvcGVlci5oPgorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiY2VsbC5oIgorI2luY2x1ZGUgInNlcnZlci5oIgorI2luY2x1ZGUgImZzY2xpZW50LmgiCisjaW5jbHVkZSAiY21zZXJ2aWNlLmgiCisjaW5jbHVkZSAia2Fmc3RpbW9kLmgiCisjaW5jbHVkZSAia2Fmc2FzeW5jZC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0cnVjdCByeHJwY190cmFuc3BvcnQgKmFmc190cmFuc3BvcnQ7CisKK3N0YXRpYyBpbnQgYWZzX2FkZGluZ19wZWVyKHN0cnVjdCByeHJwY19wZWVyICpwZWVyKTsKK3N0YXRpYyB2b2lkIGFmc19kaXNjYXJkaW5nX3BlZXIoc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIpOworCisKK01PRFVMRV9ERVNDUklQVElPTigiQUZTIENsaWVudCBGaWxlIFN5c3RlbSIpOworTU9EVUxFX0FVVEhPUigiUmVkIEhhdCwgSW5jLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgY2hhciAqcm9vdGNlbGw7CisKK21vZHVsZV9wYXJhbShyb290Y2VsbCwgY2hhcnAsIDApOworTU9EVUxFX1BBUk1fREVTQyhyb290Y2VsbCwgInJvb3QgQUZTIGNlbGwgbmFtZSBhbmQgVkwgc2VydmVyIElQIGFkZHIgbGlzdCIpOworCisKK3N0YXRpYyBzdHJ1Y3QgcnhycGNfcGVlcl9vcHMgYWZzX3BlZXJfb3BzID0geworCS5hZGRpbmcJCT0gYWZzX2FkZGluZ19wZWVyLAorCS5kaXNjYXJkaW5nCT0gYWZzX2Rpc2NhcmRpbmdfcGVlciwKK307CisKK3N0cnVjdCBsaXN0X2hlYWQgYWZzX2NiX2hhc2hfdGJsW0FGU19DQl9IQVNIX0NPVU5UXTsKK0RFRklORV9TUElOTE9DSyhhZnNfY2JfaGFzaF9sb2NrKTsKKworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKK3N0YXRpYyBzdHJ1Y3QgY2FjaGVmc19uZXRmc19vcGVyYXRpb25zIGFmc19jYWNoZV9vcHMgPSB7CisJLmdldF9wYWdlX2Nvb2tpZQk9IGFmc19jYWNoZV9nZXRfcGFnZV9jb29raWUsCit9OworCitzdHJ1Y3QgY2FjaGVmc19uZXRmcyBhZnNfY2FjaGVfbmV0ZnMgPSB7CisJLm5hbWUJCQk9ICJhZnMiLAorCS52ZXJzaW9uCQk9IDAsCisJLm9wcwkJCT0gJmFmc19jYWNoZV9vcHMsCit9OworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBpbml0aWFsaXNlIHRoZSBBRlMgY2xpZW50IEZTIG1vZHVsZQorICovCitzdGF0aWMgaW50IF9faW5pdCBhZnNfaW5pdCh2b2lkKQoreworCWludCBsb29wLCByZXQ7CisKKwlwcmludGsoS0VSTl9JTkZPICJrQUZTOiBSZWQgSGF0IEFGUyBjbGllbnQgdjAuMSByZWdpc3RlcmluZy5cbiIpOworCisJLyogaW5pdGlhbGlzZSB0aGUgY2FsbGJhY2sgaGFzaCB0YWJsZSAqLworCXNwaW5fbG9ja19pbml0KCZhZnNfY2JfaGFzaF9sb2NrKTsKKwlmb3IgKGxvb3AgPSBBRlNfQ0JfSEFTSF9DT1VOVCAtIDE7IGxvb3AgPj0gMDsgbG9vcC0tKQorCQlJTklUX0xJU1RfSEVBRCgmYWZzX2NiX2hhc2hfdGJsW2xvb3BdKTsKKworCS8qIHJlZ2lzdGVyIHRoZSAvcHJvYyBzdHVmZiAqLworCXJldCA9IGFmc19wcm9jX2luaXQoKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKKwkvKiB3ZSB3YW50IHRvIGJlIGFibGUgdG8gY2FjaGUgKi8KKwlyZXQgPSBjYWNoZWZzX3JlZ2lzdGVyX25ldGZzKCZhZnNfY2FjaGVfbmV0ZnMsCisJCQkJICAgICAmYWZzX2NhY2hlX2NlbGxfaW5kZXhfZGVmKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0tFWVNfVFVSTkVEX09GRgorCXJldCA9IGFmc19rZXlfcmVnaXN0ZXIoKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcl9jYWNoZTsKKyNlbmRpZgorCisJLyogaW5pdGlhbGlzZSB0aGUgY2VsbCBEQiAqLworCXJldCA9IGFmc19jZWxsX2luaXQocm9vdGNlbGwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yX2tleXM7CisKKwkvKiBzdGFydCB0aGUgdGltZW91dCBkYWVtb24gKi8KKwlyZXQgPSBhZnNfa2Fmc3RpbW9kX3N0YXJ0KCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3Jfa2V5czsKKworCS8qIHN0YXJ0IHRoZSBhc3luYyBvcGVyYXRpb24gZGFlbW9uICovCisJcmV0ID0gYWZzX2thZnNhc3luY2Rfc3RhcnQoKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcl9rYWZzdGltb2Q7CisKKwkvKiBjcmVhdGUgdGhlIFJ4UlBDIHRyYW5zcG9ydCAqLworCXJldCA9IHJ4cnBjX2NyZWF0ZV90cmFuc3BvcnQoNzAwMSwgJmFmc190cmFuc3BvcnQpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yX2thZnNhc3luY2Q7CisKKwlhZnNfdHJhbnNwb3J0LT5wZWVyX29wcyA9ICZhZnNfcGVlcl9vcHM7CisKKwkvKiByZWdpc3RlciB0aGUgZmlsZXN5c3RlbXMgKi8KKwlyZXQgPSBhZnNfZnNfaW5pdCgpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yX3RyYW5zcG9ydDsKKworCXJldHVybiByZXQ7CisKKyBlcnJvcl90cmFuc3BvcnQ6CisJcnhycGNfcHV0X3RyYW5zcG9ydChhZnNfdHJhbnNwb3J0KTsKKyBlcnJvcl9rYWZzYXN5bmNkOgorCWFmc19rYWZzYXN5bmNkX3N0b3AoKTsKKyBlcnJvcl9rYWZzdGltb2Q6CisJYWZzX2thZnN0aW1vZF9zdG9wKCk7CisgZXJyb3Jfa2V5czoKKyNpZmRlZiBDT05GSUdfS0VZU19UVVJORURfT0ZGCisJYWZzX2tleV91bnJlZ2lzdGVyKCk7CisgZXJyb3JfY2FjaGU6CisjZW5kaWYKKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCisJY2FjaGVmc191bnJlZ2lzdGVyX25ldGZzKCZhZnNfY2FjaGVfbmV0ZnMpOworIGVycm9yOgorI2VuZGlmCisJYWZzX2NlbGxfcHVyZ2UoKTsKKwlhZnNfcHJvY19jbGVhbnVwKCk7CisJcHJpbnRrKEtFUk5fRVJSICJrQUZTOiBmYWlsZWQgdG8gcmVnaXN0ZXI6ICVkXG4iLCByZXQpOworCXJldHVybiByZXQ7Cit9IC8qIGVuZCBhZnNfaW5pdCgpICovCisKKy8qIFhYWCBsYXRlX2luaXRjYWxsIGlzIGtsdWRneSwgYnV0IHRoZSBvbmx5IGFsdGVybmF0aXZlIHNlZW1zIHRvIGNyZWF0ZQorICogYSB0cmFuc3BvcnQgdXBvbiB0aGUgZmlyc3QgbW91bnQsIHdoaWNoIGlzIHdvcnNlLiBPciBpcyBpdD8KKyAqLworbGF0ZV9pbml0Y2FsbChhZnNfaW5pdCk7CS8qIG11c3QgYmUgY2FsbGVkIGFmdGVyIG5ldC8gdG8gY3JlYXRlIHNvY2tldCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGNsZWFuIHVwIG9uIG1vZHVsZSByZW1vdmFsCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBhZnNfZXhpdCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gImtBRlM6IFJlZCBIYXQgQUZTIGNsaWVudCB2MC4xIHVucmVnaXN0ZXJpbmcuXG4iKTsKKworCWFmc19mc19leGl0KCk7CisJcnhycGNfcHV0X3RyYW5zcG9ydChhZnNfdHJhbnNwb3J0KTsKKwlhZnNfa2Fmc3RpbW9kX3N0b3AoKTsKKwlhZnNfa2Fmc2FzeW5jZF9zdG9wKCk7CisJYWZzX2NlbGxfcHVyZ2UoKTsKKyNpZmRlZiBDT05GSUdfS0VZU19UVVJORURfT0ZGCisJYWZzX2tleV91bnJlZ2lzdGVyKCk7CisjZW5kaWYKKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCisJY2FjaGVmc191bnJlZ2lzdGVyX25ldGZzKCZhZnNfY2FjaGVfbmV0ZnMpOworI2VuZGlmCisJYWZzX3Byb2NfY2xlYW51cCgpOworCit9IC8qIGVuZCBhZnNfZXhpdCgpICovCisKK21vZHVsZV9leGl0KGFmc19leGl0KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIG5vdGlmaWNhdGlvbiB0aGF0IG5ldyBwZWVyIHJlY29yZCBpcyBiZWluZyBhZGRlZAorICogLSBjYWxsZWQgZnJvbSBrcnhzZWNkCisgKiAtIHJldHVybiBhbiBlcnJvciB0byBpbmR1Y2UgYW4gYWJvcnQKKyAqIC0gbXVzdG4ndCBzbGVlcCAoY2FsbGVyIGhvbGRzIGFuIHJ3bG9jaykKKyAqLworc3RhdGljIGludCBhZnNfYWRkaW5nX3BlZXIoc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIpCit7CisJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcjsKKwlpbnQgcmV0OworCisJX2RlYnVnKCJrQUZTOiBBZGRpbmcgbmV3IHBlZXIgJTA4eFxuIiwgbnRvaGwocGVlci0+YWRkci5zX2FkZHIpKTsKKworCS8qIGRldGVybWluZSB3aGljaCBzZXJ2ZXIgdGhlIHBlZXIgcmVzaWRlcyBpbiAoaWYgYW55KSAqLworCXJldCA9IGFmc19zZXJ2ZXJfZmluZF9ieV9wZWVyKHBlZXIsICZzZXJ2ZXIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OyAvKiBub25lIHRoYXQgd2UgcmVjb2duaXNlLCBzbyBhYm9ydCAqLworCisJX2RlYnVnKCJTZXJ2ZXIgJXB7dT0lZH1cbiIsIHNlcnZlciwgYXRvbWljX3JlYWQoJnNlcnZlci0+dXNhZ2UpKTsKKworCV9kZWJ1ZygiQ2VsbCAlcHt1PSVkfVxuIiwKKwkgICAgICAgc2VydmVyLT5jZWxsLCBhdG9taWNfcmVhZCgmc2VydmVyLT5jZWxsLT51c2FnZSkpOworCisJLyogY3Jvc3MtcG9pbnQgdGhlIHN0cnVjdHMgdW5kZXIgYSBnbG9iYWwgbG9jayAqLworCXNwaW5fbG9jaygmYWZzX3NlcnZlcl9wZWVyX2xvY2spOworCXBlZXItPnVzZXIgPSBzZXJ2ZXI7CisJc2VydmVyLT5wZWVyID0gcGVlcjsKKwlzcGluX3VubG9jaygmYWZzX3NlcnZlcl9wZWVyX2xvY2spOworCisJYWZzX3B1dF9zZXJ2ZXIoc2VydmVyKTsKKworCXJldHVybiAwOworfSAvKiBlbmQgYWZzX2FkZGluZ19wZWVyKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIG5vdGlmaWNhdGlvbiB0aGF0IGEgcGVlciByZWNvcmQgaXMgYmVpbmcgZGlzY2FyZGVkCisgKiAtIGNhbGxlZCBmcm9tIGtyeGlvZCBvciBrcnhzZWNkCisgKi8KK3N0YXRpYyB2b2lkIGFmc19kaXNjYXJkaW5nX3BlZXIoc3RydWN0IHJ4cnBjX3BlZXIgKnBlZXIpCit7CisJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlcjsKKworCV9lbnRlcigiJXAiLHBlZXIpOworCisJX2RlYnVnKCJEaXNjYXJkaW5nIHBlZXIgJTA4eCAocnR0PSVsdS4lbHVtUylcbiIsCisJICAgICAgIG50b2hsKHBlZXItPmFkZHIuc19hZGRyKSwKKwkgICAgICAgKGxvbmcpIChwZWVyLT5ydHQgLyAxMDAwKSwKKwkgICAgICAgKGxvbmcpIChwZWVyLT5ydHQgJSAxMDAwKSk7CisKKwkvKiB1bmNyb3NzLXBvaW50IHRoZSBzdHJ1Y3RzIHVuZGVyIGEgZ2xvYmFsIGxvY2sgKi8KKwlzcGluX2xvY2soJmFmc19zZXJ2ZXJfcGVlcl9sb2NrKTsKKwlzZXJ2ZXIgPSBwZWVyLT51c2VyOworCWlmIChzZXJ2ZXIpIHsKKwkJcGVlci0+dXNlciA9IE5VTEw7CisJCXNlcnZlci0+cGVlciA9IE5VTEw7CisJfQorCXNwaW5fdW5sb2NrKCZhZnNfc2VydmVyX3BlZXJfbG9jayk7CisKKwlfbGVhdmUoIiIpOworCit9IC8qIGVuZCBhZnNfZGlzY2FyZGluZ19wZWVyKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGNsZWFyIHRoZSBkZWFkIHNwYWNlIGJldHdlZW4gdGFza19zdHJ1Y3QgYW5kIGtlcm5lbCBzdGFjaworICogLSBjYWxsZWQgYnkgc3VwcGx5aW5nIC1maW5zdHJ1bWVudC1mdW5jdGlvbnMgdG8gZ2NjCisgKi8KKyNpZiAwCit2b2lkIF9fY3lnX3Byb2ZpbGVfZnVuY19lbnRlciAodm9pZCAqdGhpc19mbiwgdm9pZCAqY2FsbF9zaXRlKQorX19hdHRyaWJ1dGVfXygobm9faW5zdHJ1bWVudF9mdW5jdGlvbikpOworCit2b2lkIF9fY3lnX3Byb2ZpbGVfZnVuY19lbnRlciAodm9pZCAqdGhpc19mbiwgdm9pZCAqY2FsbF9zaXRlKQoreworICAgICAgIGFzbSB2b2xhdGlsZSgiICBtb3ZsICAgICUlZXNwLCUlZWRpICAgICBcbiIKKyAgICAgICAgICAgICAgICAgICAgIiAgYW5kbCAgICAlMCwlJWVkaSAgICAgICAgXG4iCisgICAgICAgICAgICAgICAgICAgICIgIGFkZGwgICAgJTEsJSVlZGkgICAgICAgIFxuIgorICAgICAgICAgICAgICAgICAgICAiICBtb3ZsICAgICUlZXNwLCUlZWN4ICAgICBcbiIKKyAgICAgICAgICAgICAgICAgICAgIiAgc3VibCAgICAlJWVkaSwlJWVjeCAgICAgXG4iCisgICAgICAgICAgICAgICAgICAgICIgIHNocmwgICAgJDIsJSVlY3ggICAgICAgIFxuIgorICAgICAgICAgICAgICAgICAgICAiICBtb3ZsICAgICQweGVkZWRlZGVkLCUlZWF4ICAgICBcbiIKKyAgICAgICAgICAgICAgICAgICAgIiAgcmVwIHN0b3NsICAgICAgICAgICAgICAgXG4iCisgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgICAgICAgOiAiaSIofihUSFJFQURfU0laRSAtIDEpKSwgImkiKHNpemVvZihzdHJ1Y3QgdGhyZWFkX2luZm8pKQorICAgICAgICAgICAgICAgICAgICA6ICJlYXgiLCAiZWN4IiwgImVkaSIsICJtZW1vcnkiLCAiY2MiCisgICAgICAgICAgICAgICAgICAgICk7Cit9CisKK3ZvaWQgX19jeWdfcHJvZmlsZV9mdW5jX2V4aXQodm9pZCAqdGhpc19mbiwgdm9pZCAqY2FsbF9zaXRlKQorX19hdHRyaWJ1dGVfXygobm9faW5zdHJ1bWVudF9mdW5jdGlvbikpOworCit2b2lkIF9fY3lnX3Byb2ZpbGVfZnVuY19leGl0KHZvaWQgKnRoaXNfZm4sIHZvaWQgKmNhbGxfc2l0ZSkKK3sKKyAgICAgICBhc20gdm9sYXRpbGUoIiAgbW92bCAgICAlJWVzcCwlJWVkaSAgICAgXG4iCisgICAgICAgICAgICAgICAgICAgICIgIGFuZGwgICAgJTAsJSVlZGkgICAgICAgIFxuIgorICAgICAgICAgICAgICAgICAgICAiICBhZGRsICAgICUxLCUlZWRpICAgICAgICBcbiIKKyAgICAgICAgICAgICAgICAgICAgIiAgbW92bCAgICAlJWVzcCwlJWVjeCAgICAgXG4iCisgICAgICAgICAgICAgICAgICAgICIgIHN1YmwgICAgJSVlZGksJSVlY3ggICAgIFxuIgorICAgICAgICAgICAgICAgICAgICAiICBzaHJsICAgICQyLCUlZWN4ICAgICAgICBcbiIKKyAgICAgICAgICAgICAgICAgICAgIiAgbW92bCAgICAkMHhkYWRhZGFkYSwlJWVheCAgICAgXG4iCisgICAgICAgICAgICAgICAgICAgICIgIHJlcCBzdG9zbCAgICAgICAgICAgICAgIFxuIgorICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgICAgIDogImkiKH4oVEhSRUFEX1NJWkUgLSAxKSksICJpIihzaXplb2Yoc3RydWN0IHRocmVhZF9pbmZvKSkKKyAgICAgICAgICAgICAgICAgICAgOiAiZWF4IiwgImVjeCIsICJlZGkiLCAibWVtb3J5IiwgImNjIgorICAgICAgICAgICAgICAgICAgICApOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9hZnMvbWlzYy5jIGIvZnMvYWZzL21pc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGZjZTY2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL21pc2MuYwpAQCAtMCwwICsxLDM5IEBACisvKiBtaXNjLmM6IG1pc2NlbGxhbmVvdXMgYml0cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlICJlcnJvcnMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogY29udmVydCBhbiBBRlMgYWJvcnQgY29kZSB0byBhIExpbnV4IGVycm9yIG51bWJlcgorICovCitpbnQgYWZzX2Fib3J0X3RvX2Vycm9yKGludCBhYm9ydGNvZGUpCit7CisJc3dpdGNoIChhYm9ydGNvZGUpIHsKKwljYXNlIFZTQUxWQUdFOgkJcmV0dXJuIC1FSU87CisJY2FzZSBWTk9WTk9ERToJCXJldHVybiAtRU5PRU5UOworCWNhc2UgVk5PVk9MOgkJcmV0dXJuIC1FTlhJTzsKKwljYXNlIFZWT0xFWElTVFM6CXJldHVybiAtRUVYSVNUOworCWNhc2UgVk5PU0VSVklDRToJcmV0dXJuIC1FSU87CisJY2FzZSBWT0ZGTElORToJCXJldHVybiAtRU5PRU5UOworCWNhc2UgVk9OTElORToJCXJldHVybiAtRUVYSVNUOworCWNhc2UgVkRJU0tGVUxMOgkJcmV0dXJuIC1FTk9TUEM7CisJY2FzZSBWT1ZFUlFVT1RBOglyZXR1cm4gLUVEUVVPVDsKKwljYXNlIFZCVVNZOgkJcmV0dXJuIC1FQlVTWTsKKwljYXNlIFZNT1ZFRDoJCXJldHVybiAtRU5YSU87CisJZGVmYXVsdDoJCXJldHVybiAtRUlPOworCX0KKworfSAvKiBlbmQgYWZzX2Fib3J0X3RvX2Vycm9yKCkgKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9tbnRwdC5jIGIvZnMvYWZzL21udHB0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZjMjhhYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Fmcy9tbnRwdC5jCkBAIC0wLDAgKzEsMjg3IEBACisvKiBtbnRwdC5jOiBtb3VudHBvaW50IG1hbmFnZW1lbnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZXNwYWNlLmg+CisjaW5jbHVkZSAic3VwZXIuaCIKKyNpbmNsdWRlICJjZWxsLmgiCisjaW5jbHVkZSAidm9sdW1lLmgiCisjaW5jbHVkZSAidm5vZGUuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICphZnNfbW50cHRfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLAorCQkJCSAgICAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkJICAgICAgIHN0cnVjdCBuYW1laWRhdGEgKm5kKTsKK3N0YXRpYyBpbnQgYWZzX21udHB0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIGludCBhZnNfbW50cHRfZm9sbG93X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCk7CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWZzX21udHB0X2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSBhZnNfbW50cHRfb3BlbiwKK307CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGFmc19tbnRwdF9pbm9kZV9vcGVyYXRpb25zID0geworCS5sb29rdXAJCT0gYWZzX21udHB0X2xvb2t1cCwKKwkuZm9sbG93X2xpbmsJPSBhZnNfbW50cHRfZm9sbG93X2xpbmssCisJLnJlYWRsaW5rCT0gcGFnZV9yZWFkbGluaywKKwkuZ2V0YXR0cgk9IGFmc19pbm9kZV9nZXRhdHRyLAorfTsKKworc3RhdGljIExJU1RfSEVBRChhZnNfdmZzbW91bnRzKTsKKworc3RhdGljIHZvaWQgYWZzX21udHB0X2V4cGlyeV90aW1lZF9vdXQoc3RydWN0IGFmc190aW1lciAqdGltZXIpOworCitzdHJ1Y3QgYWZzX3RpbWVyX29wcyBhZnNfbW50cHRfZXhwaXJ5X3RpbWVyX29wcyA9IHsKKwkudGltZWRfb3V0CT0gYWZzX21udHB0X2V4cGlyeV90aW1lZF9vdXQsCit9OworCitzdHJ1Y3QgYWZzX3RpbWVyIGFmc19tbnRwdF9leHBpcnlfdGltZXI7CisKK3Vuc2lnbmVkIGxvbmcgYWZzX21udHB0X2V4cGlyeV90aW1lb3V0ID0gMjA7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBjaGVjayBhIHN5bWJvbGljIGxpbmsgdG8gc2VlIHdoZXRoZXIgaXQgYWN0dWFsbHkgZW5jb2RlcyBhIG1vdW50cG9pbnQKKyAqIC0gc2V0cyB0aGUgQUZTX1ZOT0RFX01PVU5UUE9JTlQgZmxhZyBvbiB0aGUgdm5vZGUgYXBwcm9wcmlhdGVseQorICovCitpbnQgYWZzX21udHB0X2NoZWNrX3N5bWxpbmsoc3RydWN0IGFmc192bm9kZSAqdm5vZGUpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJZmlsbGVyX3QgKmZpbGxlcjsKKwlzaXplX3Qgc2l6ZTsKKwljaGFyICpidWY7CisJaW50IHJldDsKKworCV9lbnRlcigieyV1LCV1fSIsIHZub2RlLT5maWQudm5vZGUsIHZub2RlLT5maWQudW5pcXVlKTsKKworCS8qIHJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzeW1saW5rIGludG8gdGhlIHBhZ2VjYWNoZSAqLworCWZpbGxlciA9IChmaWxsZXJfdCAqKSBBRlNfVk5PREVfVE9fSSh2bm9kZSktPmlfbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlOworCisJcGFnZSA9IHJlYWRfY2FjaGVfcGFnZShBRlNfVk5PREVfVE9fSSh2bm9kZSktPmlfbWFwcGluZywgMCwKKwkJCSAgICAgICBmaWxsZXIsIE5VTEwpOworCWlmIChJU19FUlIocGFnZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihwYWdlKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gLUVJTzsKKwl3YWl0X29uX3BhZ2VfbG9ja2VkKHBhZ2UpOworCWJ1ZiA9IGttYXAocGFnZSk7CisJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpCisJCWdvdG8gb3V0X2ZyZWU7CisJaWYgKFBhZ2VFcnJvcihwYWdlKSkKKwkJZ290byBvdXRfZnJlZTsKKworCS8qIGV4YW1pbmUgdGhlIHN5bWxpbmsncyBjb250ZW50cyAqLworCXNpemUgPSB2bm9kZS0+c3RhdHVzLnNpemU7CisJX2RlYnVnKCJzeW1saW5rIHRvICUqLipzIiwgc2l6ZSwgKGludCkgc2l6ZSwgYnVmKTsKKworCWlmIChzaXplID4gMiAmJgorCSAgICAoYnVmWzBdID09ICclJyB8fCBidWZbMF0gPT0gJyMnKSAmJgorCSAgICBidWZbc2l6ZSAtIDFdID09ICcuJworCSAgICApIHsKKwkJX2RlYnVnKCJzeW1saW5rIGlzIGEgbW91bnRwb2ludCIpOworCQlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKKwkJdm5vZGUtPmZsYWdzIHw9IEFGU19WTk9ERV9NT1VOVFBPSU5UOworCQlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCX0KKworCXJldCA9IDA7CisKKyBvdXRfZnJlZToKKwlrdW5tYXAocGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworIG91dDoKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworCit9IC8qIGVuZCBhZnNfbW50cHRfY2hlY2tfc3ltbGluaygpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBubyB2YWxpZCBsb29rdXAgcHJvY2VkdXJlIG9uIHRoaXMgc29ydCBvZiBkaXIKKyAqLworc3RhdGljIHN0cnVjdCBkZW50cnkgKmFmc19tbnRwdF9sb29rdXAoc3RydWN0IGlub2RlICpkaXIsCisJCQkJICAgICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCQkgICAgICAgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJa2VudGVyKCIlcCwlcHslcHslc30sJXN9IiwKKwkgICAgICAgZGlyLAorCSAgICAgICBkZW50cnksCisJICAgICAgIGRlbnRyeS0+ZF9wYXJlbnQsCisJICAgICAgIGRlbnRyeS0+ZF9wYXJlbnQgPworCSAgICAgICBkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSA6IChjb25zdCB1bnNpZ25lZCBjaGFyICopICIiLAorCSAgICAgICBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCXJldHVybiBFUlJfUFRSKC1FUkVNT1RFKTsKK30gLyogZW5kIGFmc19tbnRwdF9sb29rdXAoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogbm8gdmFsaWQgb3BlbiBwcm9jZWR1cmUgb24gdGhpcyBzb3J0IG9mIGRpcgorICovCitzdGF0aWMgaW50IGFmc19tbnRwdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWtlbnRlcigiJXAsJXB7JXB7JXN9LCVzfSIsCisJICAgICAgIGlub2RlLCBmaWxlLAorCSAgICAgICBmaWxlLT5mX2RlbnRyeS0+ZF9wYXJlbnQsCisJICAgICAgIGZpbGUtPmZfZGVudHJ5LT5kX3BhcmVudCA/CisJICAgICAgIGZpbGUtPmZfZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUgOgorCSAgICAgICAoY29uc3QgdW5zaWduZWQgY2hhciAqKSAiIiwKKwkgICAgICAgZmlsZS0+Zl9kZW50cnktPmRfbmFtZS5uYW1lKTsKKworCXJldHVybiAtRVJFTU9URTsKK30gLyogZW5kIGFmc19tbnRwdF9vcGVuKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGNyZWF0ZSBhIHZmc21vdW50IHRvIGJlIGF1dG9tb3VudGVkCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKmFmc19tbnRwdF9kb19hdXRvbW91bnQoc3RydWN0IGRlbnRyeSAqbW50cHQpCit7CisJc3RydWN0IGFmc19zdXBlcl9pbmZvICpzdXBlcjsKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CisJc2l6ZV90IHNpemU7CisJY2hhciAqYnVmLCAqZGV2bmFtZSA9IE5VTEwsICpvcHRpb25zID0gTlVMTDsKKwlmaWxsZXJfdCAqZmlsbGVyOworCWludCByZXQ7CisKKwlrZW50ZXIoInslc30iLCBtbnRwdC0+ZF9uYW1lLm5hbWUpOworCisJQlVHX09OKCFtbnRwdC0+ZF9pbm9kZSk7CisKKwlyZXQgPSAtRUlOVkFMOworCXNpemUgPSBtbnRwdC0+ZF9pbm9kZS0+aV9zaXplOworCWlmIChzaXplID4gUEFHRV9TSVpFIC0gMSkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IC1FTk9NRU07CisJZGV2bmFtZSA9IChjaGFyICopIGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIWRldm5hbWUpCisJCWdvdG8gZXJyb3I7CisKKwlvcHRpb25zID0gKGNoYXIgKikgZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWlmICghb3B0aW9ucykKKwkJZ290byBlcnJvcjsKKworCS8qIHJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBBRlMgc3BlY2lhbCBzeW1saW5rICovCisJZmlsbGVyID0gKGZpbGxlcl90ICopbW50cHQtPmRfaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlOworCisJcGFnZSA9IHJlYWRfY2FjaGVfcGFnZShtbnRwdC0+ZF9pbm9kZS0+aV9tYXBwaW5nLCAwLCBmaWxsZXIsIE5VTEwpOworCWlmIChJU19FUlIocGFnZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihwYWdlKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyZXQgPSAtRUlPOworCXdhaXRfb25fcGFnZV9sb2NrZWQocGFnZSk7CisJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkgfHwgUGFnZUVycm9yKHBhZ2UpKQorCQlnb3RvIGVycm9yOworCisJYnVmID0ga21hcChwYWdlKTsKKwltZW1jcHkoZGV2bmFtZSwgYnVmLCBzaXplKTsKKwlrdW5tYXAocGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCXBhZ2UgPSBOVUxMOworCisJLyogd29yayBvdXQgd2hhdCBvcHRpb25zIHdlIHdhbnQgKi8KKwlzdXBlciA9IEFGU19GU19TKG1udHB0LT5kX3NiKTsKKwltZW1jcHkob3B0aW9ucywgImNlbGw9IiwgNSk7CisJc3RyY3B5KG9wdGlvbnMgKyA1LCBzdXBlci0+dm9sdW1lLT5jZWxsLT5uYW1lKTsKKwlpZiAoc3VwZXItPnZvbHVtZS0+dHlwZSA9PSBBRlNWTF9SV1ZPTCkKKwkJc3RyY2F0KG9wdGlvbnMsICIscndwYXRoIik7CisKKwkvKiB0cnkgYW5kIGRvIHRoZSBtb3VudCAqLworCWtkZWJ1ZygiLS0tIGF0dGVtcHRpbmcgbW91bnQgJXMgLW8gJXMgLS0tIiwgZGV2bmFtZSwgb3B0aW9ucyk7CisJbW50ID0gZG9fa2Vybl9tb3VudCgiYWZzIiwgMCwgZGV2bmFtZSwgb3B0aW9ucyk7CisJa2RlYnVnKCItLS0gbW91bnQgcmVzdWx0ICVwIC0tLSIsIG1udCk7CisKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGRldm5hbWUpOworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgb3B0aW9ucyk7CisJa2xlYXZlKCIgPSAlcCIsIG1udCk7CisJcmV0dXJuIG1udDsKKworIGVycm9yOgorCWlmIChwYWdlKQorCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJaWYgKGRldm5hbWUpCisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgZGV2bmFtZSk7CisJaWYgKG9wdGlvbnMpCisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgb3B0aW9ucyk7CisJa2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIEVSUl9QVFIocmV0KTsKK30gLyogZW5kIGFmc19tbnRwdF9kb19hdXRvbW91bnQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZm9sbG93IGEgbGluayBmcm9tIGEgbW91bnRwb2ludCBkaXJlY3RvcnksIHRodXMgY2F1c2luZyBpdCB0byBiZSBtb3VudGVkCisgKi8KK3N0YXRpYyBpbnQgYWZzX21udHB0X2ZvbGxvd19saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IHZmc21vdW50ICpuZXdtbnQ7CisJc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeTsKKwlpbnQgZXJyOworCisJa2VudGVyKCIlcHslc30seyVzOiVweyVzfX0iLAorCSAgICAgICBkZW50cnksCisJICAgICAgIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJICAgICAgIG5kLT5tbnQtPm1udF9kZXZuYW1lLAorCSAgICAgICBkZW50cnksCisJICAgICAgIG5kLT5kZW50cnktPmRfbmFtZS5uYW1lKTsKKworCW5ld21udCA9IGFmc19tbnRwdF9kb19hdXRvbW91bnQoZGVudHJ5KTsKKwlpZiAoSVNfRVJSKG5ld21udCkpIHsKKwkJcGF0aF9yZWxlYXNlKG5kKTsKKwkJcmV0dXJuIFBUUl9FUlIobmV3bW50KTsKKwl9CisKKwlvbGRfZGVudHJ5ID0gbmQtPmRlbnRyeTsKKwluZC0+ZGVudHJ5ID0gZGVudHJ5OworCWVyciA9IGRvX2FkZF9tb3VudChuZXdtbnQsIG5kLCAwLCAmYWZzX3Zmc21vdW50cyk7CisJbmQtPmRlbnRyeSA9IG9sZF9kZW50cnk7CisKKwlwYXRoX3JlbGVhc2UobmQpOworCisJaWYgKCFlcnIpIHsKKwkJbW50Z2V0KG5ld21udCk7CisJCW5kLT5tbnQgPSBuZXdtbnQ7CisJCWRnZXQobmV3bW50LT5tbnRfcm9vdCk7CisJCW5kLT5kZW50cnkgPSBuZXdtbnQtPm1udF9yb290OworCX0KKworCWtsZWF2ZSgiID0gJWQiLCBlcnIpOworCXJldHVybiBlcnI7Cit9IC8qIGVuZCBhZnNfbW50cHRfZm9sbG93X2xpbmsoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogaGFuZGxlIG1vdW50cG9pbnQgZXhwaXJ5IHRpbWVyIGdvaW5nIG9mZgorICovCitzdGF0aWMgdm9pZCBhZnNfbW50cHRfZXhwaXJ5X3RpbWVkX291dChzdHJ1Y3QgYWZzX3RpbWVyICp0aW1lcikKK3sKKwlrZW50ZXIoIiIpOworCisJbWFya19tb3VudHNfZm9yX2V4cGlyeSgmYWZzX3Zmc21vdW50cyk7CisKKwlhZnNfa2Fmc3RpbW9kX2FkZF90aW1lcigmYWZzX21udHB0X2V4cGlyeV90aW1lciwKKwkJCQlhZnNfbW50cHRfZXhwaXJ5X3RpbWVvdXQgKiBIWik7CisKKwlrbGVhdmUoIiIpOworfSAvKiBlbmQgYWZzX21udHB0X2V4cGlyeV90aW1lZF9vdXQoKSAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL21vdW50LmggYi9mcy9hZnMvbW91bnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDJmNDZlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL21vdW50LmgKQEAgLTAsMCArMSwyMyBAQAorLyogbW91bnQuaDogbW91bnQgcGFyYW1ldGVycworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9BRlNfTU9VTlRfSAorI2RlZmluZSBfTElOVVhfQUZTX01PVU5UX0gKKworc3RydWN0IGFmc19tb3VudGRhdGEgeworCWNvbnN0IGNoYXIJCSp2b2x1bWU7CS8qIG5hbWUgb2Ygdm9sdW1lICovCisJY29uc3QgY2hhcgkJKmNlbGw7CQkvKiBuYW1lIG9mIGNlbGwgY29udGFpbmluZyB2b2x1bWUgKi8KKwljb25zdCBjaGFyCQkqY2FjaGU7CQkvKiBuYW1lIG9mIGNhY2hlIGJsb2NrIGRldmljZSAqLworCXNpemVfdAkJCW5zZXJ2ZXJzOwkvKiBudW1iZXIgb2Ygc2VydmVyIGFkZHJlc3NlcyBsaXN0ZWQgKi8KKwl1aW50MzJfdAkJc2VydmVyc1sxMF07CS8qIElQIGFkZHJlc3NlcyBvZiBzZXJ2ZXJzIGluIHRoaXMgY2VsbCAqLworfTsKKworI2VuZGlmIC8qIF9MSU5VWF9BRlNfTU9VTlRfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL3Byb2MuYyBiL2ZzL2Fmcy9wcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM4MWI4ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Fmcy9wcm9jLmMKQEAgLTAsMCArMSw4NTcgQEAKKy8qIHByb2MuYzogL3Byb2MgaW50ZXJmYWNlIGZvciBBRlMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgImNlbGwuaCIKKyNpbmNsdWRlICJ2b2x1bWUuaCIKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfYWZzOworCisKK3N0YXRpYyBpbnQgYWZzX3Byb2NfY2VsbHNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgdm9pZCAqYWZzX3Byb2NfY2VsbHNfc3RhcnQoc3RydWN0IHNlcV9maWxlICpwLCBsb2ZmX3QgKnBvcyk7CitzdGF0aWMgdm9pZCAqYWZzX3Byb2NfY2VsbHNfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKTsKK3N0YXRpYyB2b2lkIGFmc19wcm9jX2NlbGxzX3N0b3Aoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KTsKK3N0YXRpYyBpbnQgYWZzX3Byb2NfY2VsbHNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpOworc3RhdGljIHNzaXplX3QgYWZzX3Byb2NfY2VsbHNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkJICAgIHNpemVfdCBzaXplLCBsb2ZmX3QgKl9wb3MpOworCitzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGFmc19wcm9jX2NlbGxzX29wcyA9IHsKKwkuc3RhcnQJPSBhZnNfcHJvY19jZWxsc19zdGFydCwKKwkubmV4dAk9IGFmc19wcm9jX2NlbGxzX25leHQsCisJLnN0b3AJPSBhZnNfcHJvY19jZWxsc19zdG9wLAorCS5zaG93CT0gYWZzX3Byb2NfY2VsbHNfc2hvdywKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFmc19wcm9jX2NlbGxzX2ZvcHMgPSB7CisJLm9wZW4JCT0gYWZzX3Byb2NfY2VsbHNfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkud3JpdGUJCT0gYWZzX3Byb2NfY2VsbHNfd3JpdGUsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzZXFfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgYWZzX3Byb2Nfcm9vdGNlbGxfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50IGFmc19wcm9jX3Jvb3RjZWxsX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIHNzaXplX3QgYWZzX3Byb2Nfcm9vdGNlbGxfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkgICAgICBzaXplX3Qgc2l6ZSwgbG9mZl90ICpfcG9zKTsKK3N0YXRpYyBzc2l6ZV90IGFmc19wcm9jX3Jvb3RjZWxsX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSAgICAgICBzaXplX3Qgc2l6ZSwgbG9mZl90ICpfcG9zKTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWZzX3Byb2Nfcm9vdGNlbGxfZm9wcyA9IHsKKwkub3BlbgkJPSBhZnNfcHJvY19yb290Y2VsbF9vcGVuLAorCS5yZWFkCQk9IGFmc19wcm9jX3Jvb3RjZWxsX3JlYWQsCisJLndyaXRlCQk9IGFmc19wcm9jX3Jvb3RjZWxsX3dyaXRlLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5yZWxlYXNlCT0gYWZzX3Byb2Nfcm9vdGNlbGxfcmVsZWFzZQorfTsKKworc3RhdGljIGludCBhZnNfcHJvY19jZWxsX3ZvbHVtZXNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50IGFmc19wcm9jX2NlbGxfdm9sdW1lc19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgdm9pZCAqYWZzX3Byb2NfY2VsbF92b2x1bWVzX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqcCwgbG9mZl90ICpwb3MpOworc3RhdGljIHZvaWQgKmFmc19wcm9jX2NlbGxfdm9sdW1lc19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdiwKKwkJCQkJbG9mZl90ICpwb3MpOworc3RhdGljIHZvaWQgYWZzX3Byb2NfY2VsbF92b2x1bWVzX3N0b3Aoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KTsKK3N0YXRpYyBpbnQgYWZzX3Byb2NfY2VsbF92b2x1bWVzX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KTsKKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBhZnNfcHJvY19jZWxsX3ZvbHVtZXNfb3BzID0geworCS5zdGFydAk9IGFmc19wcm9jX2NlbGxfdm9sdW1lc19zdGFydCwKKwkubmV4dAk9IGFmc19wcm9jX2NlbGxfdm9sdW1lc19uZXh0LAorCS5zdG9wCT0gYWZzX3Byb2NfY2VsbF92b2x1bWVzX3N0b3AsCisJLnNob3cJPSBhZnNfcHJvY19jZWxsX3ZvbHVtZXNfc2hvdywKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFmc19wcm9jX2NlbGxfdm9sdW1lc19mb3BzID0geworCS5vcGVuCQk9IGFmc19wcm9jX2NlbGxfdm9sdW1lc19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gYWZzX3Byb2NfY2VsbF92b2x1bWVzX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IGFmc19wcm9jX2NlbGxfdmxzZXJ2ZXJzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIGludCBhZnNfcHJvY19jZWxsX3Zsc2VydmVyc19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSAgIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyB2b2lkICphZnNfcHJvY19jZWxsX3Zsc2VydmVyc19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIGxvZmZfdCAqcG9zKTsKK3N0YXRpYyB2b2lkICphZnNfcHJvY19jZWxsX3Zsc2VydmVyc19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdiwKKwkJCQkJICBsb2ZmX3QgKnBvcyk7CitzdGF0aWMgdm9pZCBhZnNfcHJvY19jZWxsX3Zsc2VydmVyc19zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdik7CitzdGF0aWMgaW50IGFmc19wcm9jX2NlbGxfdmxzZXJ2ZXJzX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KTsKKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBhZnNfcHJvY19jZWxsX3Zsc2VydmVyc19vcHMgPSB7CisJLnN0YXJ0CT0gYWZzX3Byb2NfY2VsbF92bHNlcnZlcnNfc3RhcnQsCisJLm5leHQJPSBhZnNfcHJvY19jZWxsX3Zsc2VydmVyc19uZXh0LAorCS5zdG9wCT0gYWZzX3Byb2NfY2VsbF92bHNlcnZlcnNfc3RvcCwKKwkuc2hvdwk9IGFmc19wcm9jX2NlbGxfdmxzZXJ2ZXJzX3Nob3csCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhZnNfcHJvY19jZWxsX3Zsc2VydmVyc19mb3BzID0geworCS5vcGVuCQk9IGFmc19wcm9jX2NlbGxfdmxzZXJ2ZXJzX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBhZnNfcHJvY19jZWxsX3Zsc2VydmVyc19yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBhZnNfcHJvY19jZWxsX3NlcnZlcnNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50IGFmc19wcm9jX2NlbGxfc2VydmVyc19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgdm9pZCAqYWZzX3Byb2NfY2VsbF9zZXJ2ZXJzX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqcCwgbG9mZl90ICpwb3MpOworc3RhdGljIHZvaWQgKmFmc19wcm9jX2NlbGxfc2VydmVyc19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdiwKKwkJCQkJbG9mZl90ICpwb3MpOworc3RhdGljIHZvaWQgYWZzX3Byb2NfY2VsbF9zZXJ2ZXJzX3N0b3Aoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KTsKK3N0YXRpYyBpbnQgYWZzX3Byb2NfY2VsbF9zZXJ2ZXJzX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KTsKKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBhZnNfcHJvY19jZWxsX3NlcnZlcnNfb3BzID0geworCS5zdGFydAk9IGFmc19wcm9jX2NlbGxfc2VydmVyc19zdGFydCwKKwkubmV4dAk9IGFmc19wcm9jX2NlbGxfc2VydmVyc19uZXh0LAorCS5zdG9wCT0gYWZzX3Byb2NfY2VsbF9zZXJ2ZXJzX3N0b3AsCisJLnNob3cJPSBhZnNfcHJvY19jZWxsX3NlcnZlcnNfc2hvdywKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFmc19wcm9jX2NlbGxfc2VydmVyc19mb3BzID0geworCS5vcGVuCQk9IGFmc19wcm9jX2NlbGxfc2VydmVyc19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gYWZzX3Byb2NfY2VsbF9zZXJ2ZXJzX3JlbGVhc2UsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogaW5pdGlhbGlzZSB0aGUgL3Byb2MvZnMvYWZzLyBkaXJlY3RvcnkKKyAqLworaW50IGFmc19wcm9jX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnA7CisKKwlfZW50ZXIoIiIpOworCisJcHJvY19hZnMgPSBwcm9jX21rZGlyKCJmcy9hZnMiLCBOVUxMKTsKKwlpZiAoIXByb2NfYWZzKQorCQlnb3RvIGVycm9yOworCXByb2NfYWZzLT5vd25lciA9IFRISVNfTU9EVUxFOworCisJcCA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJjZWxscyIsIDAsIHByb2NfYWZzKTsKKwlpZiAoIXApCisJCWdvdG8gZXJyb3JfcHJvYzsKKwlwLT5wcm9jX2ZvcHMgPSAmYWZzX3Byb2NfY2VsbHNfZm9wczsKKwlwLT5vd25lciA9IFRISVNfTU9EVUxFOworCisJcCA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJyb290Y2VsbCIsIDAsIHByb2NfYWZzKTsKKwlpZiAoIXApCisJCWdvdG8gZXJyb3JfY2VsbHM7CisJcC0+cHJvY19mb3BzID0gJmFmc19wcm9jX3Jvb3RjZWxsX2ZvcHM7CisJcC0+b3duZXIgPSBUSElTX01PRFVMRTsKKworCV9sZWF2ZSgiID0gMCIpOworCXJldHVybiAwOworCisgZXJyb3JfY2VsbHM6CisgCXJlbW92ZV9wcm9jX2VudHJ5KCJjZWxscyIsIHByb2NfYWZzKTsKKyBlcnJvcl9wcm9jOgorCXJlbW92ZV9wcm9jX2VudHJ5KCJmcy9hZnMiLCBOVUxMKTsKKyBlcnJvcjoKKwlfbGVhdmUoIiA9IC1FTk9NRU0iKTsKKwlyZXR1cm4gLUVOT01FTTsKKworfSAvKiBlbmQgYWZzX3Byb2NfaW5pdCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBjbGVhbiB1cCB0aGUgL3Byb2MvZnMvYWZzLyBkaXJlY3RvcnkKKyAqLwordm9pZCBhZnNfcHJvY19jbGVhbnVwKHZvaWQpCit7CisJcmVtb3ZlX3Byb2NfZW50cnkoImNlbGxzIiwgcHJvY19hZnMpOworCisJcmVtb3ZlX3Byb2NfZW50cnkoImZzL2FmcyIsIE5VTEwpOworCit9IC8qIGVuZCBhZnNfcHJvY19jbGVhbnVwKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIG9wZW4gIi9wcm9jL2ZzL2Fmcy9jZWxscyIgd2hpY2ggcHJvdmlkZXMgYSBzdW1tYXJ5IG9mIGV4dGFudCBjZWxscworICovCitzdGF0aWMgaW50IGFmc19wcm9jX2NlbGxzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNlcV9maWxlICptOworCWludCByZXQ7CisKKwlyZXQgPSBzZXFfb3BlbihmaWxlLCAmYWZzX3Byb2NfY2VsbHNfb3BzKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCW0gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJbS0+cHJpdmF0ZSA9IFBERShpbm9kZSktPmRhdGE7CisKKwlyZXR1cm4gMDsKK30gLyogZW5kIGFmc19wcm9jX2NlbGxzX29wZW4oKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogc2V0IHVwIHRoZSBpdGVyYXRvciB0byBzdGFydCByZWFkaW5nIGZyb20gdGhlIGNlbGxzIGxpc3QgYW5kIHJldHVybiB0aGUKKyAqIGZpcnN0IGl0ZW0KKyAqLworc3RhdGljIHZvaWQgKmFmc19wcm9jX2NlbGxzX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpfcG9zKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKl9wOworCWxvZmZfdCBwb3MgPSAqX3BvczsKKworCS8qIGxvY2sgdGhlIGxpc3QgYWdhaW5zdCBtb2RpZmljYXRpb24gKi8KKwlkb3duX3JlYWQoJmFmc19wcm9jX2NlbGxzX3NlbSk7CisKKwkvKiBhbGxvdyBmb3IgdGhlIGhlYWRlciBsaW5lICovCisJaWYgKCFwb3MpCisJCXJldHVybiAodm9pZCAqKSAxOworCXBvcy0tOworCisJLyogZmluZCB0aGUgbid0aCBlbGVtZW50IGluIHRoZSBsaXN0ICovCisJbGlzdF9mb3JfZWFjaChfcCwgJmFmc19wcm9jX2NlbGxzKQorCQlpZiAoIXBvcy0tKQorCQkJYnJlYWs7CisKKwlyZXR1cm4gX3AgIT0gJmFmc19wcm9jX2NlbGxzID8gX3AgOiBOVUxMOworfSAvKiBlbmQgYWZzX3Byb2NfY2VsbHNfc3RhcnQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogbW92ZSB0byBuZXh0IGNlbGwgaW4gY2VsbHMgbGlzdAorICovCitzdGF0aWMgdm9pZCAqYWZzX3Byb2NfY2VsbHNfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKl9wOworCisJKCpwb3MpKys7CisKKwlfcCA9IHY7CisJX3AgPSB2ID09ICh2b2lkICopIDEgPyBhZnNfcHJvY19jZWxscy5uZXh0IDogX3AtPm5leHQ7CisKKwlyZXR1cm4gX3AgIT0gJmFmc19wcm9jX2NlbGxzID8gX3AgOiBOVUxMOworfSAvKiBlbmQgYWZzX3Byb2NfY2VsbHNfbmV4dCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBjbGVhbiB1cCBhZnRlciByZWFkaW5nIGZyb20gdGhlIGNlbGxzIGxpc3QKKyAqLworc3RhdGljIHZvaWQgYWZzX3Byb2NfY2VsbHNfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpCit7CisJdXBfcmVhZCgmYWZzX3Byb2NfY2VsbHNfc2VtKTsKKworfSAvKiBlbmQgYWZzX3Byb2NfY2VsbHNfc3RvcCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBkaXNwbGF5IGEgaGVhZGVyIGxpbmUgZm9sbG93ZWQgYnkgYSBsb2FkIG9mIGNlbGwgbGluZXMKKyAqLworc3RhdGljIGludCBhZnNfcHJvY19jZWxsc19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSBsaXN0X2VudHJ5KHYsIHN0cnVjdCBhZnNfY2VsbCwgcHJvY19saW5rKTsKKworCS8qIGRpc3BsYXkgaGVhZGVyIG9uIGxpbmUgMSAqLworCWlmICh2ID09ICh2b2lkICopIDEpIHsKKwkJc2VxX3B1dHMobSwgIlVTRSBOQU1FXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogZGlzcGxheSBvbmUgY2VsbCBwZXIgbGluZSBvbiBzdWJzZXF1ZW50IGxpbmVzICovCisJc2VxX3ByaW50ZihtLCAiJTNkICVzXG4iLCBhdG9taWNfcmVhZCgmY2VsbC0+dXNhZ2UpLCBjZWxsLT5uYW1lKTsKKworCXJldHVybiAwOworfSAvKiBlbmQgYWZzX3Byb2NfY2VsbHNfc2hvdygpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBoYW5kbGUgd3JpdGVzIHRvIC9wcm9jL2ZzL2Fmcy9jZWxscworICogLSB0byBhZGQgY2VsbHM6IGVjaG8gImFkZCA8Y2VsbG5hbWU+IDxJUD5bOjxJUD5dWzo8SVA+XSIKKyAqLworc3RhdGljIHNzaXplX3QgYWZzX3Byb2NfY2VsbHNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkJICAgIHNpemVfdCBzaXplLCBsb2ZmX3QgKl9wb3MpCit7CisJY2hhciAqa2J1ZiwgKm5hbWUsICphcmdzOworCWludCByZXQ7CisKKwkvKiBzdGFydCBieSBkcmFnZ2luZyB0aGUgY29tbWFuZCBpbnRvIG1lbW9yeSAqLworCWlmIChzaXplIDw9IDEgfHwgc2l6ZSA+PSBQQUdFX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCisJa2J1ZiA9IGttYWxsb2Moc2l6ZSArIDEsIEdGUF9LRVJORUwpOworCWlmICgha2J1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSAtRUZBVUxUOworCWlmIChjb3B5X2Zyb21fdXNlcihrYnVmLCBidWYsIHNpemUpICE9IDApCisJCWdvdG8gZG9uZTsKKwlrYnVmW3NpemVdID0gMDsKKworCS8qIHRyaW0gdG8gZmlyc3QgTkwgKi8KKwluYW1lID0gbWVtY2hyKGtidWYsICdcbicsIHNpemUpOworCWlmIChuYW1lKQorCQkqbmFtZSA9IDA7CisKKwkvKiBzcGxpdCBpbnRvIGNvbW1hbmQsIG5hbWUgYW5kIGFyZ3NsaXN0ICovCisJbmFtZSA9IHN0cmNocihrYnVmLCAnICcpOworCWlmICghbmFtZSkKKwkJZ290byBpbnZhbDsKKwlkbyB7CisJCSpuYW1lKysgPSAwOworCX0gd2hpbGUoKm5hbWUgPT0gJyAnKTsKKwlpZiAoISpuYW1lKQorCQlnb3RvIGludmFsOworCisJYXJncyA9IHN0cmNocihuYW1lLCAnICcpOworCWlmICghYXJncykKKwkJZ290byBpbnZhbDsKKwlkbyB7CisJCSphcmdzKysgPSAwOworCX0gd2hpbGUoKmFyZ3MgPT0gJyAnKTsKKwlpZiAoISphcmdzKQorCQlnb3RvIGludmFsOworCisJLyogZGV0ZXJtaW5lIGNvbW1hbmQgdG8gcGVyZm9ybSAqLworCV9kZWJ1ZygiY21kPSVzIG5hbWU9JXMgYXJncz0lcyIsIGtidWYsIG5hbWUsIGFyZ3MpOworCisJaWYgKHN0cmNtcChrYnVmLCAiYWRkIikgPT0gMCkgeworCQlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGw7CisJCXJldCA9IGFmc19jZWxsX2NyZWF0ZShuYW1lLCBhcmdzLCAmY2VsbCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBkb25lOworCisJCXByaW50aygia0FGUzogQWRkZWQgbmV3IGNlbGwgJyVzJ1xuIiwgbmFtZSk7CisJfQorCWVsc2UgeworCQlnb3RvIGludmFsOworCX0KKworCXJldCA9IHNpemU7CisKKyBkb25lOgorCWtmcmVlKGtidWYpOworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7CisKKyBpbnZhbDoKKwlyZXQgPSAtRUlOVkFMOworCXByaW50aygia0FGUzogSW52YWxpZCBDb21tYW5kIG9uIC9wcm9jL2ZzL2Fmcy9jZWxscyBmaWxlXG4iKTsKKwlnb3RvIGRvbmU7Cit9IC8qIGVuZCBhZnNfcHJvY19jZWxsc193cml0ZSgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBTdHVicyBmb3IgL3Byb2MvZnMvYWZzL3Jvb3RjZWxsCisgKi8KK3N0YXRpYyBpbnQgYWZzX3Byb2Nfcm9vdGNlbGxfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZnNfcHJvY19yb290Y2VsbF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBhZnNfcHJvY19yb290Y2VsbF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSAgICAgIHNpemVfdCBzaXplLCBsb2ZmX3QgKl9wb3MpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBoYW5kbGUgd3JpdGVzIHRvIC9wcm9jL2ZzL2Fmcy9yb290Y2VsbAorICogLSB0byBpbml0aWFsaXplIHJvb3RjZWxsOiBlY2hvICJjZWxsLm5hbWU6MTkyLjE2OC4yMzEuMTQiCisgKi8KK3N0YXRpYyBzc2l6ZV90IGFmc19wcm9jX3Jvb3RjZWxsX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSAgICAgICBzaXplX3Qgc2l6ZSwgbG9mZl90ICpfcG9zKQoreworCWNoYXIgKmtidWYsICpzOworCWludCByZXQ7CisKKwkvKiBzdGFydCBieSBkcmFnZ2luZyB0aGUgY29tbWFuZCBpbnRvIG1lbW9yeSAqLworCWlmIChzaXplIDw9IDEgfHwgc2l6ZSA+PSBQQUdFX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gLUVOT01FTTsKKwlrYnVmID0ga21hbGxvYyhzaXplICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFrYnVmKQorCQlnb3RvIG5vbWVtOworCisJcmV0ID0gLUVGQVVMVDsKKwlpZiAoY29weV9mcm9tX3VzZXIoa2J1ZiwgYnVmLCBzaXplKSAhPSAwKQorCQlnb3RvIGluZmF1bHQ7CisJa2J1ZltzaXplXSA9IDA7CisKKwkvKiB0cmltIHRvIGZpcnN0IE5MICovCisJcyA9IG1lbWNocihrYnVmLCAnXG4nLCBzaXplKTsKKwlpZiAocykKKwkJKnMgPSAwOworCisJLyogZGV0ZXJtaW5lIGNvbW1hbmQgdG8gcGVyZm9ybSAqLworCV9kZWJ1Zygicm9vdGNlbGw9JXMiLCBrYnVmKTsKKworCXJldCA9IGFmc19jZWxsX2luaXQoa2J1Zik7CisJaWYgKHJldCA+PSAwKQorCQlyZXQgPSBzaXplOwkvKiBjb25zdW1lIGV2ZXJ5dGhpbmcsIGFsd2F5cyAqLworCisgaW5mYXVsdDoKKwlrZnJlZShrYnVmKTsKKyBub21lbToKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfSAvKiBlbmQgYWZzX3Byb2Nfcm9vdGNlbGxfd3JpdGUoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogaW5pdGlhbGlzZSAvcHJvYy9mcy9hZnMvPGNlbGw+LworICovCitpbnQgYWZzX3Byb2NfY2VsbF9zZXR1cChzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwOworCisJX2VudGVyKCIlcHslc30iLCBjZWxsLCBjZWxsLT5uYW1lKTsKKworCWNlbGwtPnByb2NfZGlyID0gcHJvY19ta2RpcihjZWxsLT5uYW1lLCBwcm9jX2Fmcyk7CisJaWYgKCFjZWxsLT5wcm9jX2RpcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwID0gY3JlYXRlX3Byb2NfZW50cnkoInNlcnZlcnMiLCAwLCBjZWxsLT5wcm9jX2Rpcik7CisJaWYgKCFwKQorCQlnb3RvIGVycm9yX3Byb2M7CisJcC0+cHJvY19mb3BzID0gJmFmc19wcm9jX2NlbGxfc2VydmVyc19mb3BzOworCXAtPm93bmVyID0gVEhJU19NT0RVTEU7CisJcC0+ZGF0YSA9IGNlbGw7CisKKwlwID0gY3JlYXRlX3Byb2NfZW50cnkoInZsc2VydmVycyIsIDAsIGNlbGwtPnByb2NfZGlyKTsKKwlpZiAoIXApCisJCWdvdG8gZXJyb3Jfc2VydmVyczsKKwlwLT5wcm9jX2ZvcHMgPSAmYWZzX3Byb2NfY2VsbF92bHNlcnZlcnNfZm9wczsKKwlwLT5vd25lciA9IFRISVNfTU9EVUxFOworCXAtPmRhdGEgPSBjZWxsOworCisJcCA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJ2b2x1bWVzIiwgMCwgY2VsbC0+cHJvY19kaXIpOworCWlmICghcCkKKwkJZ290byBlcnJvcl92bHNlcnZlcnM7CisJcC0+cHJvY19mb3BzID0gJmFmc19wcm9jX2NlbGxfdm9sdW1lc19mb3BzOworCXAtPm93bmVyID0gVEhJU19NT0RVTEU7CisJcC0+ZGF0YSA9IGNlbGw7CisKKwlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKKworIGVycm9yX3Zsc2VydmVyczoKKwlyZW1vdmVfcHJvY19lbnRyeSgidmxzZXJ2ZXJzIiwgY2VsbC0+cHJvY19kaXIpOworIGVycm9yX3NlcnZlcnM6CisJcmVtb3ZlX3Byb2NfZW50cnkoInNlcnZlcnMiLCBjZWxsLT5wcm9jX2Rpcik7CisgZXJyb3JfcHJvYzoKKwlyZW1vdmVfcHJvY19lbnRyeShjZWxsLT5uYW1lLCBwcm9jX2Fmcyk7CisJX2xlYXZlKCIgPSAtRU5PTUVNIik7CisJcmV0dXJuIC1FTk9NRU07Cit9IC8qIGVuZCBhZnNfcHJvY19jZWxsX3NldHVwKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHJlbW92ZSAvcHJvYy9mcy9hZnMvPGNlbGw+LworICovCit2b2lkIGFmc19wcm9jX2NlbGxfcmVtb3ZlKHN0cnVjdCBhZnNfY2VsbCAqY2VsbCkKK3sKKwlfZW50ZXIoIiIpOworCisJcmVtb3ZlX3Byb2NfZW50cnkoInZvbHVtZXMiLCBjZWxsLT5wcm9jX2Rpcik7CisJcmVtb3ZlX3Byb2NfZW50cnkoInZsc2VydmVycyIsIGNlbGwtPnByb2NfZGlyKTsKKwlyZW1vdmVfcHJvY19lbnRyeSgic2VydmVycyIsIGNlbGwtPnByb2NfZGlyKTsKKwlyZW1vdmVfcHJvY19lbnRyeShjZWxsLT5uYW1lLCBwcm9jX2Fmcyk7CisKKwlfbGVhdmUoIiIpOworfSAvKiBlbmQgYWZzX3Byb2NfY2VsbF9yZW1vdmUoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogb3BlbiAiL3Byb2MvZnMvYWZzLzxjZWxsPi92b2x1bWVzIiB3aGljaCBwcm92aWRlcyBhIHN1bW1hcnkgb2YgZXh0YW50IGNlbGxzCisgKi8KK3N0YXRpYyBpbnQgYWZzX3Byb2NfY2VsbF92b2x1bWVzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGFmc19jZWxsICpjZWxsOworCXN0cnVjdCBzZXFfZmlsZSAqbTsKKwlpbnQgcmV0OworCisJY2VsbCA9IGFmc19nZXRfY2VsbF9tYXliZSgoc3RydWN0IGFmc19jZWxsICoqKSAmUERFKGlub2RlKS0+ZGF0YSk7CisJaWYgKCFjZWxsKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCXJldCA9IHNlcV9vcGVuKGZpbGUsICZhZnNfcHJvY19jZWxsX3ZvbHVtZXNfb3BzKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCW0gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJbS0+cHJpdmF0ZSA9IGNlbGw7CisKKwlyZXR1cm4gMDsKK30gLyogZW5kIGFmc19wcm9jX2NlbGxfdm9sdW1lc19vcGVuKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGNsb3NlIHRoZSBmaWxlIGFuZCByZWxlYXNlIHRoZSByZWYgdG8gdGhlIGNlbGwKKyAqLworc3RhdGljIGludCBhZnNfcHJvY19jZWxsX3ZvbHVtZXNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSBQREUoaW5vZGUpLT5kYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBzZXFfcmVsZWFzZShpbm9kZSxmaWxlKTsKKworCWFmc19wdXRfY2VsbChjZWxsKTsKKworCXJldHVybiByZXQ7Cit9IC8qIGVuZCBhZnNfcHJvY19jZWxsX3ZvbHVtZXNfcmVsZWFzZSgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBzZXQgdXAgdGhlIGl0ZXJhdG9yIHRvIHN0YXJ0IHJlYWRpbmcgZnJvbSB0aGUgY2VsbHMgbGlzdCBhbmQgcmV0dXJuIHRoZQorICogZmlyc3QgaXRlbQorICovCitzdGF0aWMgdm9pZCAqYWZzX3Byb2NfY2VsbF92b2x1bWVzX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpfcG9zKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKl9wOworCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IG0tPnByaXZhdGU7CisJbG9mZl90IHBvcyA9ICpfcG9zOworCisJX2VudGVyKCJjZWxsPSVwIHBvcz0lTGQiLCBjZWxsLCAqX3Bvcyk7CisKKwkvKiBsb2NrIHRoZSBsaXN0IGFnYWluc3QgbW9kaWZpY2F0aW9uICovCisJZG93bl9yZWFkKCZjZWxsLT52bF9zZW0pOworCisJLyogYWxsb3cgZm9yIHRoZSBoZWFkZXIgbGluZSAqLworCWlmICghcG9zKQorCQlyZXR1cm4gKHZvaWQgKikgMTsKKwlwb3MtLTsKKworCS8qIGZpbmQgdGhlIG4ndGggZWxlbWVudCBpbiB0aGUgbGlzdCAqLworCWxpc3RfZm9yX2VhY2goX3AsICZjZWxsLT52bF9saXN0KQorCQlpZiAoIXBvcy0tKQorCQkJYnJlYWs7CisKKwlyZXR1cm4gX3AgIT0gJmNlbGwtPnZsX2xpc3QgPyBfcCA6IE5VTEw7Cit9IC8qIGVuZCBhZnNfcHJvY19jZWxsX3ZvbHVtZXNfc3RhcnQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogbW92ZSB0byBuZXh0IGNlbGwgaW4gY2VsbHMgbGlzdAorICovCitzdGF0aWMgdm9pZCAqYWZzX3Byb2NfY2VsbF92b2x1bWVzX25leHQoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2LAorCQkJCQlsb2ZmX3QgKl9wb3MpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqX3A7CisJc3RydWN0IGFmc19jZWxsICpjZWxsID0gcC0+cHJpdmF0ZTsKKworCV9lbnRlcigiY2VsbD0lcCBwb3M9JUxkIiwgY2VsbCwgKl9wb3MpOworCisJKCpfcG9zKSsrOworCisJX3AgPSB2OworCV9wID0gdiA9PSAodm9pZCAqKSAxID8gY2VsbC0+dmxfbGlzdC5uZXh0IDogX3AtPm5leHQ7CisKKwlyZXR1cm4gX3AgIT0gJmNlbGwtPnZsX2xpc3QgPyBfcCA6IE5VTEw7Cit9IC8qIGVuZCBhZnNfcHJvY19jZWxsX3ZvbHVtZXNfbmV4dCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBjbGVhbiB1cCBhZnRlciByZWFkaW5nIGZyb20gdGhlIGNlbGxzIGxpc3QKKyAqLworc3RhdGljIHZvaWQgYWZzX3Byb2NfY2VsbF92b2x1bWVzX3N0b3Aoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KQoreworCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IHAtPnByaXZhdGU7CisKKwl1cF9yZWFkKCZjZWxsLT52bF9zZW0pOworCit9IC8qIGVuZCBhZnNfcHJvY19jZWxsX3ZvbHVtZXNfc3RvcCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBkaXNwbGF5IGEgaGVhZGVyIGxpbmUgZm9sbG93ZWQgYnkgYSBsb2FkIG9mIHZvbHVtZSBsaW5lcworICovCitzdGF0aWMgaW50IGFmc19wcm9jX2NlbGxfdm9sdW1lc19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmxvY2F0aW9uID0KKwkJbGlzdF9lbnRyeSh2LCBzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiwgbGluayk7CisKKwkvKiBkaXNwbGF5IGhlYWRlciBvbiBsaW5lIDEgKi8KKwlpZiAodiA9PSAodm9pZCAqKSAxKSB7CisJCXNlcV9wdXRzKG0sICJVU0UgVkxJRFswXSAgVkxJRFsxXSAgVkxJRFsyXSAgTkFNRVxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIGRpc3BsYXkgb25lIGNlbGwgcGVyIGxpbmUgb24gc3Vic2VxdWVudCBsaW5lcyAqLworCXNlcV9wcmludGYobSwgIiUzZCAlMDh4ICUwOHggJTA4eCAlc1xuIiwKKwkJICAgYXRvbWljX3JlYWQoJnZsb2NhdGlvbi0+dXNhZ2UpLAorCQkgICB2bG9jYXRpb24tPnZsZGIudmlkWzBdLAorCQkgICB2bG9jYXRpb24tPnZsZGIudmlkWzFdLAorCQkgICB2bG9jYXRpb24tPnZsZGIudmlkWzJdLAorCQkgICB2bG9jYXRpb24tPnZsZGIubmFtZQorCQkgICApOworCisJcmV0dXJuIDA7Cit9IC8qIGVuZCBhZnNfcHJvY19jZWxsX3ZvbHVtZXNfc2hvdygpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBvcGVuICIvcHJvYy9mcy9hZnMvPGNlbGw+L3Zsc2VydmVycyIgd2hpY2ggcHJvdmlkZXMgYSBsaXN0IG9mIHZvbHVtZQorICogbG9jYXRpb24gc2VydmVyCisgKi8KK3N0YXRpYyBpbnQgYWZzX3Byb2NfY2VsbF92bHNlcnZlcnNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGw7CisJc3RydWN0IHNlcV9maWxlICptOworCWludCByZXQ7CisKKwljZWxsID0gYWZzX2dldF9jZWxsX21heWJlKChzdHJ1Y3QgYWZzX2NlbGwqKikmUERFKGlub2RlKS0+ZGF0YSk7CisJaWYgKCFjZWxsKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCXJldCA9IHNlcV9vcGVuKGZpbGUsJmFmc19wcm9jX2NlbGxfdmxzZXJ2ZXJzX29wcyk7CisJaWYgKHJldDwwKQorCQlyZXR1cm4gcmV0OworCisJbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwltLT5wcml2YXRlID0gY2VsbDsKKworCXJldHVybiAwOworfSAvKiBlbmQgYWZzX3Byb2NfY2VsbF92bHNlcnZlcnNfb3BlbigpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBjbG9zZSB0aGUgZmlsZSBhbmQgcmVsZWFzZSB0aGUgcmVmIHRvIHRoZSBjZWxsCisgKi8KK3N0YXRpYyBpbnQgYWZzX3Byb2NfY2VsbF92bHNlcnZlcnNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkgICBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSBQREUoaW5vZGUpLT5kYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBzZXFfcmVsZWFzZShpbm9kZSxmaWxlKTsKKworCWFmc19wdXRfY2VsbChjZWxsKTsKKworCXJldHVybiByZXQ7Cit9IC8qIGVuZCBhZnNfcHJvY19jZWxsX3Zsc2VydmVyc19yZWxlYXNlKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHNldCB1cCB0aGUgaXRlcmF0b3IgdG8gc3RhcnQgcmVhZGluZyBmcm9tIHRoZSBjZWxscyBsaXN0IGFuZCByZXR1cm4gdGhlCisgKiBmaXJzdCBpdGVtCisgKi8KK3N0YXRpYyB2b2lkICphZnNfcHJvY19jZWxsX3Zsc2VydmVyc19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqX3BvcykKK3sKKwlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSBtLT5wcml2YXRlOworCWxvZmZfdCBwb3MgPSAqX3BvczsKKworCV9lbnRlcigiY2VsbD0lcCBwb3M9JUxkIiwgY2VsbCwgKl9wb3MpOworCisJLyogbG9jayB0aGUgbGlzdCBhZ2FpbnN0IG1vZGlmaWNhdGlvbiAqLworCWRvd25fcmVhZCgmY2VsbC0+dmxfc2VtKTsKKworCS8qIGFsbG93IGZvciB0aGUgaGVhZGVyIGxpbmUgKi8KKwlpZiAoIXBvcykKKwkJcmV0dXJuICh2b2lkICopIDE7CisJcG9zLS07CisKKwlpZiAocG9zID49IGNlbGwtPnZsX25hZGRycykKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gJmNlbGwtPnZsX2FkZHJzW3Bvc107Cit9IC8qIGVuZCBhZnNfcHJvY19jZWxsX3Zsc2VydmVyc19zdGFydCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBtb3ZlIHRvIG5leHQgY2VsbCBpbiBjZWxscyBsaXN0CisgKi8KK3N0YXRpYyB2b2lkICphZnNfcHJvY19jZWxsX3Zsc2VydmVyc19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdiwKKwkJCQkJICBsb2ZmX3QgKl9wb3MpCit7CisJc3RydWN0IGFmc19jZWxsICpjZWxsID0gcC0+cHJpdmF0ZTsKKwlsb2ZmX3QgcG9zOworCisJX2VudGVyKCJjZWxsPSVwe25hZD0ldX0gcG9zPSVMZCIsIGNlbGwsIGNlbGwtPnZsX25hZGRycywgKl9wb3MpOworCisJcG9zID0gKl9wb3M7CisJKCpfcG9zKSsrOworCWlmIChwb3MgPj0gY2VsbC0+dmxfbmFkZHJzKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiAmY2VsbC0+dmxfYWRkcnNbcG9zXTsKK30gLyogZW5kIGFmc19wcm9jX2NlbGxfdmxzZXJ2ZXJzX25leHQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogY2xlYW4gdXAgYWZ0ZXIgcmVhZGluZyBmcm9tIHRoZSBjZWxscyBsaXN0CisgKi8KK3N0YXRpYyB2b2lkIGFmc19wcm9jX2NlbGxfdmxzZXJ2ZXJzX3N0b3Aoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KQoreworCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IHAtPnByaXZhdGU7CisKKwl1cF9yZWFkKCZjZWxsLT52bF9zZW0pOworCit9IC8qIGVuZCBhZnNfcHJvY19jZWxsX3Zsc2VydmVyc19zdG9wKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGRpc3BsYXkgYSBoZWFkZXIgbGluZSBmb2xsb3dlZCBieSBhIGxvYWQgb2Ygdm9sdW1lIGxpbmVzCisgKi8KK3N0YXRpYyBpbnQgYWZzX3Byb2NfY2VsbF92bHNlcnZlcnNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJc3RydWN0IGluX2FkZHIgKmFkZHIgPSB2OworCisJLyogZGlzcGxheSBoZWFkZXIgb24gbGluZSAxICovCisJaWYgKHYgPT0gKHN0cnVjdCBpbl9hZGRyICopIDEpIHsKKwkJc2VxX3B1dHMobSwgIkFERFJFU1NcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBkaXNwbGF5IG9uZSBjZWxsIHBlciBsaW5lIG9uIHN1YnNlcXVlbnQgbGluZXMgKi8KKwlzZXFfcHJpbnRmKG0sICIldS4ldS4ldS4ldVxuIiwgTklQUVVBRChhZGRyLT5zX2FkZHIpKTsKKworCXJldHVybiAwOworfSAvKiBlbmQgYWZzX3Byb2NfY2VsbF92bHNlcnZlcnNfc2hvdygpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBvcGVuICIvcHJvYy9mcy9hZnMvPGNlbGw+L3NlcnZlcnMiIHdoaWNoIHByb3ZpZGVzIGEgc3VtbWFyeSBvZiBhY3RpdmUKKyAqIHNlcnZlcnMKKyAqLworc3RhdGljIGludCBhZnNfcHJvY19jZWxsX3NlcnZlcnNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGw7CisJc3RydWN0IHNlcV9maWxlICptOworCWludCByZXQ7CisKKwljZWxsID0gYWZzX2dldF9jZWxsX21heWJlKChzdHJ1Y3QgYWZzX2NlbGwgKiopICZQREUoaW5vZGUpLT5kYXRhKTsKKwlpZiAoIWNlbGwpCisJCXJldHVybiAtRU5PRU5UOworCisJcmV0ID0gc2VxX29wZW4oZmlsZSwgJmFmc19wcm9jX2NlbGxfc2VydmVyc19vcHMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwltLT5wcml2YXRlID0gY2VsbDsKKworCXJldHVybiAwOworfSAvKiBlbmQgYWZzX3Byb2NfY2VsbF9zZXJ2ZXJzX29wZW4oKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogY2xvc2UgdGhlIGZpbGUgYW5kIHJlbGVhc2UgdGhlIHJlZiB0byB0aGUgY2VsbAorICovCitzdGF0aWMgaW50IGFmc19wcm9jX2NlbGxfc2VydmVyc19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSBQREUoaW5vZGUpLT5kYXRhOworCWludCByZXQ7CisKKwlyZXQgPSBzZXFfcmVsZWFzZShpbm9kZSwgZmlsZSk7CisKKwlhZnNfcHV0X2NlbGwoY2VsbCk7CisKKwlyZXR1cm4gcmV0OworfSAvKiBlbmQgYWZzX3Byb2NfY2VsbF9zZXJ2ZXJzX3JlbGVhc2UoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogc2V0IHVwIHRoZSBpdGVyYXRvciB0byBzdGFydCByZWFkaW5nIGZyb20gdGhlIGNlbGxzIGxpc3QgYW5kIHJldHVybiB0aGUKKyAqIGZpcnN0IGl0ZW0KKyAqLworc3RhdGljIHZvaWQgKmFmc19wcm9jX2NlbGxfc2VydmVyc19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqX3BvcykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKKwlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSBtLT5wcml2YXRlOworCWxvZmZfdCBwb3MgPSAqX3BvczsKKworCV9lbnRlcigiY2VsbD0lcCBwb3M9JUxkIiwgY2VsbCwgKl9wb3MpOworCisJLyogbG9jayB0aGUgbGlzdCBhZ2FpbnN0IG1vZGlmaWNhdGlvbiAqLworCXJlYWRfbG9jaygmY2VsbC0+c3ZfbG9jayk7CisKKwkvKiBhbGxvdyBmb3IgdGhlIGhlYWRlciBsaW5lICovCisJaWYgKCFwb3MpCisJCXJldHVybiAodm9pZCAqKSAxOworCXBvcy0tOworCisJLyogZmluZCB0aGUgbid0aCBlbGVtZW50IGluIHRoZSBsaXN0ICovCisJbGlzdF9mb3JfZWFjaChfcCwgJmNlbGwtPnN2X2xpc3QpCisJCWlmICghcG9zLS0pCisJCQlicmVhazsKKworCXJldHVybiBfcCAhPSAmY2VsbC0+c3ZfbGlzdCA/IF9wIDogTlVMTDsKK30gLyogZW5kIGFmc19wcm9jX2NlbGxfc2VydmVyc19zdGFydCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBtb3ZlIHRvIG5leHQgY2VsbCBpbiBjZWxscyBsaXN0CisgKi8KK3N0YXRpYyB2b2lkICphZnNfcHJvY19jZWxsX3NlcnZlcnNfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYsCisJCQkJCWxvZmZfdCAqX3BvcykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpfcDsKKwlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSBwLT5wcml2YXRlOworCisJX2VudGVyKCJjZWxsPSVwIHBvcz0lTGQiLCBjZWxsLCAqX3Bvcyk7CisKKwkoKl9wb3MpKys7CisKKwlfcCA9IHY7CisJX3AgPSB2ID09ICh2b2lkICopIDEgPyBjZWxsLT5zdl9saXN0Lm5leHQgOiBfcC0+bmV4dDsKKworCXJldHVybiBfcCAhPSAmY2VsbC0+c3ZfbGlzdCA/IF9wIDogTlVMTDsKK30gLyogZW5kIGFmc19wcm9jX2NlbGxfc2VydmVyc19uZXh0KCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGNsZWFuIHVwIGFmdGVyIHJlYWRpbmcgZnJvbSB0aGUgY2VsbHMgbGlzdAorICovCitzdGF0aWMgdm9pZCBhZnNfcHJvY19jZWxsX3NlcnZlcnNfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpCit7CisJc3RydWN0IGFmc19jZWxsICpjZWxsID0gcC0+cHJpdmF0ZTsKKworCXJlYWRfdW5sb2NrKCZjZWxsLT5zdl9sb2NrKTsKKworfSAvKiBlbmQgYWZzX3Byb2NfY2VsbF9zZXJ2ZXJzX3N0b3AoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZGlzcGxheSBhIGhlYWRlciBsaW5lIGZvbGxvd2VkIGJ5IGEgbG9hZCBvZiB2b2x1bWUgbGluZXMKKyAqLworc3RhdGljIGludCBhZnNfcHJvY19jZWxsX3NlcnZlcnNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciA9IGxpc3RfZW50cnkodiwgc3RydWN0IGFmc19zZXJ2ZXIsIGxpbmspOworCWNoYXIgaXBhZGRyWzIwXTsKKworCS8qIGRpc3BsYXkgaGVhZGVyIG9uIGxpbmUgMSAqLworCWlmICh2ID09ICh2b2lkICopIDEpIHsKKwkJc2VxX3B1dHMobSwgIlVTRSBBRERSICAgICAgICAgICAgU1RBVEVcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBkaXNwbGF5IG9uZSBjZWxsIHBlciBsaW5lIG9uIHN1YnNlcXVlbnQgbGluZXMgKi8KKwlzcHJpbnRmKGlwYWRkciwgIiV1LiV1LiV1LiV1IiwgTklQUVVBRChzZXJ2ZXItPmFkZHIpKTsKKwlzZXFfcHJpbnRmKG0sICIlM2QgJS0xNS4xNXMgJTVkXG4iLAorCQkgICBhdG9taWNfcmVhZCgmc2VydmVyLT51c2FnZSksCisJCSAgIGlwYWRkciwKKwkJICAgc2VydmVyLT5mc19zdGF0ZQorCQkgICApOworCisJcmV0dXJuIDA7Cit9IC8qIGVuZCBhZnNfcHJvY19jZWxsX3NlcnZlcnNfc2hvdygpICovCmRpZmYgLS1naXQgYS9mcy9hZnMvc2VydmVyLmMgYi9mcy9hZnMvc2VydmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJiMDkzYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Fmcy9zZXJ2ZXIuYwpAQCAtMCwwICsxLDUwMiBAQAorLyogc2VydmVyLmM6IEFGUyBzZXJ2ZXIgcmVjb3JkIG1hbmFnZW1lbnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPHJ4cnBjL3BlZXIuaD4KKyNpbmNsdWRlIDxyeHJwYy9jb25uZWN0aW9uLmg+CisjaW5jbHVkZSAidm9sdW1lLmgiCisjaW5jbHVkZSAiY2VsbC5oIgorI2luY2x1ZGUgInNlcnZlci5oIgorI2luY2x1ZGUgInRyYW5zcG9ydC5oIgorI2luY2x1ZGUgInZsY2xpZW50LmgiCisjaW5jbHVkZSAia2Fmc3RpbW9kLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworREVGSU5FX1NQSU5MT0NLKGFmc19zZXJ2ZXJfcGVlcl9sb2NrKTsKKworI2RlZmluZSBGU19TRVJWSUNFX0lECQkxCS8qIEFGUyBWb2x1bWUgTG9jYXRpb24gU2VydmljZSBJRCAqLworI2RlZmluZSBWTF9TRVJWSUNFX0lECQk1MgkvKiBBRlMgVm9sdW1lIExvY2F0aW9uIFNlcnZpY2UgSUQgKi8KKworc3RhdGljIHZvaWQgX19hZnNfc2VydmVyX3RpbWVvdXQoc3RydWN0IGFmc190aW1lciAqdGltZXIpCit7CisJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciA9CisJCWxpc3RfZW50cnkodGltZXIsIHN0cnVjdCBhZnNfc2VydmVyLCB0aW1lb3V0KTsKKworCV9kZWJ1ZygiU0VSVkVSIFRJTUVPVVQgWyVwe3U9JWR9XSIsCisJICAgICAgIHNlcnZlciwgYXRvbWljX3JlYWQoJnNlcnZlci0+dXNhZ2UpKTsKKworCWFmc19zZXJ2ZXJfZG9fdGltZW91dChzZXJ2ZXIpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGFmc190aW1lcl9vcHMgYWZzX3NlcnZlcl90aW1lcl9vcHMgPSB7CisJLnRpbWVkX291dAk9IF9fYWZzX3NlcnZlcl90aW1lb3V0LAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGxvb2t1cCBhIHNlcnZlciByZWNvcmQgaW4gYSBjZWxsCisgKiAtIFRPRE86IHNlYXJjaCB0aGUgY2VsbCdzIHNlcnZlciBsaXN0CisgKi8KK2ludCBhZnNfc2VydmVyX2xvb2t1cChzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwsIGNvbnN0IHN0cnVjdCBpbl9hZGRyICphZGRyLAorCQkgICAgICBzdHJ1Y3QgYWZzX3NlcnZlciAqKl9zZXJ2ZXIpCit7CisJc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwgKmFjdGl2ZSwgKnpvbWJpZTsKKwlpbnQgbG9vcDsKKworCV9lbnRlcigiJXAsJTA4eCwiLCBjZWxsLCBudG9obChhZGRyLT5zX2FkZHIpKTsKKworCS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXNlIGEgc2VydmVyIHJlY29yZCAqLworCXNlcnZlciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhZnNfc2VydmVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZXJ2ZXIpIHsKKwkJX2xlYXZlKCIgPSAtRU5PTUVNIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldChzZXJ2ZXIsIDAsIHNpemVvZihzdHJ1Y3QgYWZzX3NlcnZlcikpOworCWF0b21pY19zZXQoJnNlcnZlci0+dXNhZ2UsIDEpOworCisJSU5JVF9MSVNUX0hFQUQoJnNlcnZlci0+bGluayk7CisJaW5pdF9yd3NlbSgmc2VydmVyLT5zZW0pOworCUlOSVRfTElTVF9IRUFEKCZzZXJ2ZXItPmZzX2NhbGxxKTsKKwlzcGluX2xvY2tfaW5pdCgmc2VydmVyLT5mc19sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmc2VydmVyLT5jYl9wcm9taXNlcyk7CisJc3Bpbl9sb2NrX2luaXQoJnNlcnZlci0+Y2JfbG9jayk7CisKKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgQUZTX1NFUlZFUl9DT05OX0xJU1RfU0laRTsgbG9vcCsrKQorCQlzZXJ2ZXItPmZzX2Nvbm5fY250W2xvb3BdID0gNDsKKworCW1lbWNweSgmc2VydmVyLT5hZGRyLCBhZGRyLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKKwlzZXJ2ZXItPmFkZHIuc19hZGRyID0gYWRkci0+c19hZGRyOworCisJYWZzX3RpbWVyX2luaXQoJnNlcnZlci0+dGltZW91dCwgJmFmc19zZXJ2ZXJfdGltZXJfb3BzKTsKKworCS8qIGFkZCB0byB0aGUgY2VsbCAqLworCXdyaXRlX2xvY2soJmNlbGwtPnN2X2xvY2spOworCisJLyogY2hlY2sgdGhlIGFjdGl2ZSBsaXN0ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShhY3RpdmUsICZjZWxsLT5zdl9saXN0LCBsaW5rKSB7CisJCWlmIChhY3RpdmUtPmFkZHIuc19hZGRyID09IGFkZHItPnNfYWRkcikKKwkJCWdvdG8gdXNlX2FjdGl2ZV9zZXJ2ZXI7CisJfQorCisJLyogY2hlY2sgdGhlIGluYWN0aXZlIGxpc3QgKi8KKwlzcGluX2xvY2soJmNlbGwtPnN2X2d5bG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh6b21iaWUsICZjZWxsLT5zdl9ncmF2ZXlhcmQsIGxpbmspIHsKKwkJaWYgKHpvbWJpZS0+YWRkci5zX2FkZHIgPT0gYWRkci0+c19hZGRyKQorCQkJZ290byByZXN1cnJlY3Rfc2VydmVyOworCX0KKwlzcGluX3VubG9jaygmY2VsbC0+c3ZfZ3lsb2NrKTsKKworCWFmc19nZXRfY2VsbChjZWxsKTsKKwlzZXJ2ZXItPmNlbGwgPSBjZWxsOworCWxpc3RfYWRkX3RhaWwoJnNlcnZlci0+bGluaywgJmNlbGwtPnN2X2xpc3QpOworCisJd3JpdGVfdW5sb2NrKCZjZWxsLT5zdl9sb2NrKTsKKworCSpfc2VydmVyID0gc2VydmVyOworCV9sZWF2ZSgiID0gMCAoJXApIiwgc2VydmVyKTsKKwlyZXR1cm4gMDsKKworCS8qIGZvdW5kIGEgbWF0Y2hpbmcgYWN0aXZlIHNlcnZlciAqLworIHVzZV9hY3RpdmVfc2VydmVyOgorCV9kZWJ1ZygiYWN0aXZlIHNlcnZlciIpOworCWFmc19nZXRfc2VydmVyKGFjdGl2ZSk7CisJd3JpdGVfdW5sb2NrKCZjZWxsLT5zdl9sb2NrKTsKKworCWtmcmVlKHNlcnZlcik7CisKKwkqX3NlcnZlciA9IGFjdGl2ZTsKKwlfbGVhdmUoIiA9IDAgKCVwKSIsIGFjdGl2ZSk7CisJcmV0dXJuIDA7CisKKwkvKiBmb3VuZCBhIG1hdGNoaW5nIHNlcnZlciBpbiB0aGUgZ3JhdmV5YXJkLCBzbyByZXN1cnJlY3QgaXQgYW5kCisJICogZGlzcG9zZSBvZiB0aGUgbmV3IHJlY29yZCAqLworIHJlc3VycmVjdF9zZXJ2ZXI6CisJX2RlYnVnKCJyZXN1cnJlY3Rpbmcgc2VydmVyIik7CisKKwlsaXN0X2RlbCgmem9tYmllLT5saW5rKTsKKwlsaXN0X2FkZF90YWlsKCZ6b21iaWUtPmxpbmssICZjZWxsLT5zdl9saXN0KTsKKwlhZnNfZ2V0X3NlcnZlcih6b21iaWUpOworCWFmc19rYWZzdGltb2RfZGVsX3RpbWVyKCZ6b21iaWUtPnRpbWVvdXQpOworCXNwaW5fdW5sb2NrKCZjZWxsLT5zdl9neWxvY2spOworCXdyaXRlX3VubG9jaygmY2VsbC0+c3ZfbG9jayk7CisKKwlrZnJlZShzZXJ2ZXIpOworCisJKl9zZXJ2ZXIgPSB6b21iaWU7CisJX2xlYXZlKCIgPSAwICglcCkiLCB6b21iaWUpOworCXJldHVybiAwOworCit9IC8qIGVuZCBhZnNfc2VydmVyX2xvb2t1cCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBkZXN0cm95IGEgc2VydmVyIHJlY29yZAorICogLSByZW1vdmVzIGZyb20gdGhlIGNlbGwgbGlzdAorICovCit2b2lkIGFmc19wdXRfc2VydmVyKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIpCit7CisJc3RydWN0IGFmc19jZWxsICpjZWxsOworCisJaWYgKCFzZXJ2ZXIpCisJCXJldHVybjsKKworCV9lbnRlcigiJXAiLCBzZXJ2ZXIpOworCisJY2VsbCA9IHNlcnZlci0+Y2VsbDsKKworCS8qIHNhbml0eSBjaGVjayAqLworCUJVR19PTihhdG9taWNfcmVhZCgmc2VydmVyLT51c2FnZSkgPD0gMCk7CisKKwkvKiB0byBwcmV2ZW50IGEgcmFjZSwgdGhlIGRlY3JlbWVudCBhbmQgdGhlIGRlcXVldWUgbXVzdCBiZSBlZmZlY3RpdmVseQorCSAqIGF0b21pYyAqLworCXdyaXRlX2xvY2soJmNlbGwtPnN2X2xvY2spOworCisJaWYgKGxpa2VseSghYXRvbWljX2RlY19hbmRfdGVzdCgmc2VydmVyLT51c2FnZSkpKSB7CisJCXdyaXRlX3VubG9jaygmY2VsbC0+c3ZfbG9jayk7CisJCV9sZWF2ZSgiIik7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2soJmNlbGwtPnN2X2d5bG9jayk7CisJbGlzdF9kZWwoJnNlcnZlci0+bGluayk7CisJbGlzdF9hZGRfdGFpbCgmc2VydmVyLT5saW5rLCAmY2VsbC0+c3ZfZ3JhdmV5YXJkKTsKKworCS8qIHRpbWUgb3V0IGluIDEwIHNlY3MgKi8KKwlhZnNfa2Fmc3RpbW9kX2FkZF90aW1lcigmc2VydmVyLT50aW1lb3V0LCAxMCAqIEhaKTsKKworCXNwaW5fdW5sb2NrKCZjZWxsLT5zdl9neWxvY2spOworCXdyaXRlX3VubG9jaygmY2VsbC0+c3ZfbG9jayk7CisKKwlfbGVhdmUoIiBba2lsbGVkXSIpOworfSAvKiBlbmQgYWZzX3B1dF9zZXJ2ZXIoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogdGltZW91dCBzZXJ2ZXIgcmVjb3JkCisgKiAtIHJlbW92ZXMgZnJvbSB0aGUgY2VsbCdzIGdyYXZleWFyZCBpZiB0aGUgdXNhZ2UgY291bnQgaXMgemVybworICovCit2b2lkIGFmc19zZXJ2ZXJfZG9fdGltZW91dChzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyKQoreworCXN0cnVjdCByeHJwY19wZWVyICpwZWVyOworCXN0cnVjdCBhZnNfY2VsbCAqY2VsbDsKKwlpbnQgbG9vcDsKKworCV9lbnRlcigiJXAiLCBzZXJ2ZXIpOworCisJY2VsbCA9IHNlcnZlci0+Y2VsbDsKKworCUJVR19PTihhdG9taWNfcmVhZCgmc2VydmVyLT51c2FnZSkgPCAwKTsKKworCS8qIHJlbW92ZSBmcm9tIGdyYXZleWFyZCBpZiBzdGlsbCBkZWFkICovCisJc3Bpbl9sb2NrKCZjZWxsLT52bF9neWxvY2spOworCWlmIChhdG9taWNfcmVhZCgmc2VydmVyLT51c2FnZSkgPT0gMCkKKwkJbGlzdF9kZWxfaW5pdCgmc2VydmVyLT5saW5rKTsKKwllbHNlCisJCXNlcnZlciA9IE5VTEw7CisJc3Bpbl91bmxvY2soJmNlbGwtPnZsX2d5bG9jayk7CisKKwlpZiAoIXNlcnZlcikgeworCQlfbGVhdmUoIiIpOworCQlyZXR1cm47IC8qIHJlc3VycmVjdGVkICovCisJfQorCisJLyogd2UgY2FuIG5vdyBkZXN0cm95IGl0IHByb3Blcmx5ICovCisJYWZzX3B1dF9jZWxsKGNlbGwpOworCisJLyogdW5jcm9zcy1wb2ludCB0aGUgc3RydWN0cyB1bmRlciBhIGdsb2JhbCBsb2NrICovCisJc3Bpbl9sb2NrKCZhZnNfc2VydmVyX3BlZXJfbG9jayk7CisJcGVlciA9IHNlcnZlci0+cGVlcjsKKwlpZiAocGVlcikgeworCQlzZXJ2ZXItPnBlZXIgPSBOVUxMOworCQlwZWVyLT51c2VyID0gTlVMTDsKKwl9CisJc3Bpbl91bmxvY2soJmFmc19zZXJ2ZXJfcGVlcl9sb2NrKTsKKworCS8qIGZpbmlzaCBjbGVhbmluZyB1cCB0aGUgc2VydmVyICovCisJZm9yIChsb29wID0gQUZTX1NFUlZFUl9DT05OX0xJU1RfU0laRSAtIDE7IGxvb3AgPj0gMDsgbG9vcC0tKQorCQlpZiAoc2VydmVyLT5mc19jb25uW2xvb3BdKQorCQkJcnhycGNfcHV0X2Nvbm5lY3Rpb24oc2VydmVyLT5mc19jb25uW2xvb3BdKTsKKworCWlmIChzZXJ2ZXItPnZsc2VydmVyKQorCQlyeHJwY19wdXRfY29ubmVjdGlvbihzZXJ2ZXItPnZsc2VydmVyKTsKKworCWtmcmVlKHNlcnZlcik7CisKKwlfbGVhdmUoIiBbZGVzdHJveWVkXSIpOworfSAvKiBlbmQgYWZzX3NlcnZlcl9kb190aW1lb3V0KCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGdldCBhIGNhbGxzbG90IG9uIGEgY29ubmVjdGlvbiB0byB0aGUgZmlsZXNlcnZlciBvbiB0aGUgc3BlY2lmaWVkIHNlcnZlcgorICovCitpbnQgYWZzX3NlcnZlcl9yZXF1ZXN0X2NhbGxzbG90KHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCQkJc3RydWN0IGFmc19zZXJ2ZXJfY2FsbHNsb3QgKmNhbGxzbG90KQoreworCXN0cnVjdCBhZnNfc2VydmVyX2NhbGxzbG90ICpwY2FsbHNsb3Q7CisJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm47CisJaW50IG5jb25uLCByZXQ7CisKKwlfZW50ZXIoIiVwLCIsc2VydmVyKTsKKworCUlOSVRfTElTVF9IRUFEKCZjYWxsc2xvdC0+bGluayk7CisJY2FsbHNsb3QtPnRhc2sgPSBjdXJyZW50OworCWNhbGxzbG90LT5jb25uID0gTlVMTDsKKwljYWxsc2xvdC0+bmNvbm4gPSAtMTsKKwljYWxsc2xvdC0+cmVhZHkgPSAwOworCisJcmV0ID0gMDsKKwljb25uID0gTlVMTDsKKworCS8qIGdldCBob2xkIG9mIGEgY2FsbHNsb3QgZmlyc3QgKi8KKwlzcGluX2xvY2soJnNlcnZlci0+ZnNfbG9jayk7CisKKwkvKiByZXN1cnJlY3QgdGhlIHNlcnZlciBpZiBpdCdzIGRlYXRoIHRpbWVvdXQgaGFzIGV4cGlyZWQgKi8KKwlpZiAoc2VydmVyLT5mc19zdGF0ZSkgeworCQlpZiAodGltZV9iZWZvcmUoamlmZmllcywgc2VydmVyLT5mc19kZWFkX2ppZikpIHsKKwkJCXJldCA9IHNlcnZlci0+ZnNfc3RhdGU7CisJCQlzcGluX3VubG9jaygmc2VydmVyLT5mc19sb2NrKTsKKwkJCV9sZWF2ZSgiID0gJWQgW3N0aWxsIGRlYWRdIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlzZXJ2ZXItPmZzX3N0YXRlID0gMDsKKwl9CisKKwkvKiB0cnkgYW5kIGZpbmQgYSBjb25uZWN0aW9uIHRoYXQgaGFzIHNwYXJlIGNhbGxzbG90cyAqLworCWZvciAobmNvbm4gPSAwOyBuY29ubiA8IEFGU19TRVJWRVJfQ09OTl9MSVNUX1NJWkU7IG5jb25uKyspIHsKKwkJaWYgKHNlcnZlci0+ZnNfY29ubl9jbnRbbmNvbm5dID4gMCkgeworCQkJc2VydmVyLT5mc19jb25uX2NudFtuY29ubl0tLTsKKwkJCXNwaW5fdW5sb2NrKCZzZXJ2ZXItPmZzX2xvY2spOworCQkJY2FsbHNsb3QtPm5jb25uID0gbmNvbm47CisJCQlnb3RvIG9idGFpbmVkX3Nsb3Q7CisJCX0KKwl9CisKKwkvKiBub25lIHdlcmUgYXZhaWxhYmxlIC0gd2FpdCBpbnRlcnJ1cHRpYmx5IGZvciBvbmUgdG8gYmVjb21lCisJICogYXZhaWxhYmxlICovCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlsaXN0X2FkZF90YWlsKCZjYWxsc2xvdC0+bGluaywgJnNlcnZlci0+ZnNfY2FsbHEpOworCXNwaW5fdW5sb2NrKCZzZXJ2ZXItPmZzX2xvY2spOworCisJd2hpbGUgKCFjYWxsc2xvdC0+cmVhZHkgJiYgIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCXNjaGVkdWxlKCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJfQorCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworCS8qIGV2ZW4gaWYgd2Ugd2VyZSBpbnRlcnJ1cHRlZCB3ZSBtYXkgc3RpbGwgYmUgcXVldWVkICovCisJaWYgKCFjYWxsc2xvdC0+cmVhZHkpIHsKKwkJc3Bpbl9sb2NrKCZzZXJ2ZXItPmZzX2xvY2spOworCQlsaXN0X2RlbF9pbml0KCZjYWxsc2xvdC0+bGluayk7CisJCXNwaW5fdW5sb2NrKCZzZXJ2ZXItPmZzX2xvY2spOworCX0KKworCW5jb25uID0gY2FsbHNsb3QtPm5jb25uOworCisJLyogaWYgaW50ZXJydXB0ZWQsIHdlIG11c3QgcmVsZWFzZSBhbnkgc2xvdCB3ZSBhbHNvIGdvdCBiZWZvcmUKKwkgKiByZXR1cm5pbmcgYW4gZXJyb3IgKi8KKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJcmV0ID0gLUVJTlRSOworCQlnb3RvIGVycm9yX3JlbGVhc2U7CisJfQorCisJLyogaWYgd2Ugd2VyZSB3b2tlbiB1cCB3aXRoIGFuIGVycm9yLCB0aGVuIHBhc3MgdGhhdCBlcnJvciBiYWNrIHRvIHRoZQorCSAqIGNhbGxlZCAqLworCWlmIChuY29ubiA8IDApIHsKKwkJX2xlYXZlKCIgPSAlZCIsIGNhbGxzbG90LT5lcnJubyk7CisJCXJldHVybiBjYWxsc2xvdC0+ZXJybm87CisJfQorCisJLyogd2VyZSB3ZSBnaXZlbiBhIGNvbm5lY3Rpb24gZGlyZWN0bHk/ICovCisJaWYgKGNhbGxzbG90LT5jb25uKSB7CisJCS8qIHllcyAtIHVzZSBpdCAqLworCQlfbGVhdmUoIiA9IDAgKG5jPSVkKSIsIG5jb25uKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogZ290IGEgY2FsbHNsb3QsIGJ1dCBubyBjb25uZWN0aW9uICovCisgb2J0YWluZWRfc2xvdDoKKworCS8qIG5lZWQgdG8gZ2V0IGhvbGQgb2YgdGhlIFJ4UlBDIGNvbm5lY3Rpb24gKi8KKwlkb3duX3dyaXRlKCZzZXJ2ZXItPnNlbSk7CisKKwkvKiBxdWljayBjaGVjayB0byBzZWUgaWYgdGhlcmUncyBhbiBvdXRzdGFuZGluZyBlcnJvciAqLworCXJldCA9IHNlcnZlci0+ZnNfc3RhdGU7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcl9yZWxlYXNlX3VwdzsKKworCWlmIChzZXJ2ZXItPmZzX2Nvbm5bbmNvbm5dKSB7CisJCS8qIHJldXNlIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24gKi8KKwkJcnhycGNfZ2V0X2Nvbm5lY3Rpb24oc2VydmVyLT5mc19jb25uW25jb25uXSk7CisJCWNhbGxzbG90LT5jb25uID0gc2VydmVyLT5mc19jb25uW25jb25uXTsKKwl9CisJZWxzZSB7CisJCS8qIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uICovCisJCXJldCA9IHJ4cnBjX2NyZWF0ZV9jb25uZWN0aW9uKGFmc190cmFuc3BvcnQsCisJCQkJCSAgICAgIGh0b25zKDcwMDApLAorCQkJCQkgICAgICBzZXJ2ZXItPmFkZHIuc19hZGRyLAorCQkJCQkgICAgICBGU19TRVJWSUNFX0lELAorCQkJCQkgICAgICBOVUxMLAorCQkJCQkgICAgICAmc2VydmVyLT5mc19jb25uW25jb25uXSk7CisKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycm9yX3JlbGVhc2VfdXB3OworCisJCWNhbGxzbG90LT5jb25uID0gc2VydmVyLT5mc19jb25uWzBdOworCQlyeHJwY19nZXRfY29ubmVjdGlvbihjYWxsc2xvdC0+Y29ubik7CisJfQorCisJdXBfd3JpdGUoJnNlcnZlci0+c2VtKTsKKworIAlfbGVhdmUoIiA9IDAiKTsKKwlyZXR1cm4gMDsKKworCS8qIGhhbmRsZSBhbiBlcnJvciBvY2N1cnJpbmcgKi8KKyBlcnJvcl9yZWxlYXNlX3VwdzoKKwl1cF93cml0ZSgmc2VydmVyLT5zZW0pOworCisgZXJyb3JfcmVsZWFzZToKKwkvKiBlaXRoZXIgcmVsZWFzZSB0aGUgY2FsbHNsb3Qgb3IgcGFzcyBpdCBhbG9uZyB0byBhbm90aGVyIGRlc2VydmluZworCSAqIHRhc2sgKi8KKwlzcGluX2xvY2soJnNlcnZlci0+ZnNfbG9jayk7CisKKwlpZiAobmNvbm4gPCAwKSB7CisJCS8qIG5vIGNhbGxzbG90IGFsbG9jYXRlZCAqLworCX0KKwllbHNlIGlmIChsaXN0X2VtcHR5KCZzZXJ2ZXItPmZzX2NhbGxxKSkgeworCQkvKiBubyBvbmUgd2FpdGluZyAqLworCQlzZXJ2ZXItPmZzX2Nvbm5fY250W25jb25uXSsrOworCQlzcGluX3VubG9jaygmc2VydmVyLT5mc19sb2NrKTsKKwl9CisJZWxzZSB7CisJCS8qIHNvbWVvbmUncyB3YWl0aW5nIC0gZGVxdWV1ZSB0aGVtIGFuZCB3YWtlIHRoZW0gdXAgKi8KKwkJcGNhbGxzbG90ID0gbGlzdF9lbnRyeShzZXJ2ZXItPmZzX2NhbGxxLm5leHQsCisJCQkJICAgICAgIHN0cnVjdCBhZnNfc2VydmVyX2NhbGxzbG90LCBsaW5rKTsKKwkJbGlzdF9kZWxfaW5pdCgmcGNhbGxzbG90LT5saW5rKTsKKworCQlwY2FsbHNsb3QtPmVycm5vID0gc2VydmVyLT5mc19zdGF0ZTsKKwkJaWYgKCFwY2FsbHNsb3QtPmVycm5vKSB7CisJCQkvKiBwYXNzIHRoZW0gb3V0IGNhbGxzbG90IGRldGFpbHMgKi8KKwkJCWNhbGxzbG90LT5jb25uID0geGNoZygmcGNhbGxzbG90LT5jb25uLAorCQkJCQkgICAgICBjYWxsc2xvdC0+Y29ubik7CisJCQlwY2FsbHNsb3QtPm5jb25uID0gbmNvbm47CisJCQljYWxsc2xvdC0+bmNvbm4gPSBuY29ubiA9IC0xOworCQl9CisJCXBjYWxsc2xvdC0+cmVhZHkgPSAxOworCQl3YWtlX3VwX3Byb2Nlc3MocGNhbGxzbG90LT50YXNrKTsKKwkJc3Bpbl91bmxvY2soJnNlcnZlci0+ZnNfbG9jayk7CisJfQorCisJcnhycGNfcHV0X2Nvbm5lY3Rpb24oY2FsbHNsb3QtPmNvbm4pOworCWNhbGxzbG90LT5jb25uID0gTlVMTDsKKworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7CisKK30gLyogZW5kIGFmc19zZXJ2ZXJfcmVxdWVzdF9jYWxsc2xvdCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiByZWxlYXNlIGEgY2FsbHNsb3QgYmFjayB0byB0aGUgc2VydmVyCisgKiAtIHRyYW5zZmVycyB0aGUgUnhSUEMgY29ubmVjdGlvbiB0byB0aGUgbmV4dCBwZW5kaW5nIGNhbGxzbG90IGlmIHBvc3NpYmxlCisgKi8KK3ZvaWQgYWZzX3NlcnZlcl9yZWxlYXNlX2NhbGxzbG90KHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCQkJIHN0cnVjdCBhZnNfc2VydmVyX2NhbGxzbG90ICpjYWxsc2xvdCkKK3sKKwlzdHJ1Y3QgYWZzX3NlcnZlcl9jYWxsc2xvdCAqcGNhbGxzbG90OworCisJX2VudGVyKCJ7YWQ9JTA4eCxjbnQ9JXV9LHslZH0iLAorCSAgICAgICBudG9obChzZXJ2ZXItPmFkZHIuc19hZGRyKSwKKwkgICAgICAgc2VydmVyLT5mc19jb25uX2NudFtjYWxsc2xvdC0+bmNvbm5dLAorCSAgICAgICBjYWxsc2xvdC0+bmNvbm4pOworCisJQlVHX09OKGNhbGxzbG90LT5uY29ubiA8IDApOworCisJc3Bpbl9sb2NrKCZzZXJ2ZXItPmZzX2xvY2spOworCisJaWYgKGxpc3RfZW1wdHkoJnNlcnZlci0+ZnNfY2FsbHEpKSB7CisJCS8qIG5vIG9uZSB3YWl0aW5nICovCisJCXNlcnZlci0+ZnNfY29ubl9jbnRbY2FsbHNsb3QtPm5jb25uXSsrOworCQlzcGluX3VubG9jaygmc2VydmVyLT5mc19sb2NrKTsKKwl9CisJZWxzZSB7CisJCS8qIHNvbWVvbmUncyB3YWl0aW5nIC0gZGVxdWV1ZSB0aGVtIGFuZCB3YWtlIHRoZW0gdXAgKi8KKwkJcGNhbGxzbG90ID0gbGlzdF9lbnRyeShzZXJ2ZXItPmZzX2NhbGxxLm5leHQsCisJCQkJICAgICAgIHN0cnVjdCBhZnNfc2VydmVyX2NhbGxzbG90LCBsaW5rKTsKKwkJbGlzdF9kZWxfaW5pdCgmcGNhbGxzbG90LT5saW5rKTsKKworCQlwY2FsbHNsb3QtPmVycm5vID0gc2VydmVyLT5mc19zdGF0ZTsKKwkJaWYgKCFwY2FsbHNsb3QtPmVycm5vKSB7CisJCQkvKiBwYXNzIHRoZW0gb3V0IGNhbGxzbG90IGRldGFpbHMgKi8KKwkJCWNhbGxzbG90LT5jb25uID0geGNoZygmcGNhbGxzbG90LT5jb25uLCBjYWxsc2xvdC0+Y29ubik7CisJCQlwY2FsbHNsb3QtPm5jb25uID0gY2FsbHNsb3QtPm5jb25uOworCQkJY2FsbHNsb3QtPm5jb25uID0gLTE7CisJCX0KKworCQlwY2FsbHNsb3QtPnJlYWR5ID0gMTsKKwkJd2FrZV91cF9wcm9jZXNzKHBjYWxsc2xvdC0+dGFzayk7CisJCXNwaW5fdW5sb2NrKCZzZXJ2ZXItPmZzX2xvY2spOworCX0KKworCXJ4cnBjX3B1dF9jb25uZWN0aW9uKGNhbGxzbG90LT5jb25uKTsKKworCV9sZWF2ZSgiIik7Cit9IC8qIGVuZCBhZnNfc2VydmVyX3JlbGVhc2VfY2FsbHNsb3QoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZ2V0IGEgaGFuZGxlIHRvIGEgY29ubmVjdGlvbiB0byB0aGUgdmxzZXJ2ZXIgKHZvbHVtZSBsb2NhdGlvbikgb24gdGhlCisgKiBzcGVjaWZpZWQgc2VydmVyCisgKi8KK2ludCBhZnNfc2VydmVyX2dldF92bGNvbm4oc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKKwkJCSAgc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKipfY29ubikKK3sKKwlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubjsKKwlpbnQgcmV0OworCisJX2VudGVyKCIlcCwiLCBzZXJ2ZXIpOworCisJcmV0ID0gMDsKKwljb25uID0gTlVMTDsKKwlkb3duX3JlYWQoJnNlcnZlci0+c2VtKTsKKworCWlmIChzZXJ2ZXItPnZsc2VydmVyKSB7CisJCS8qIHJldXNlIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24gKi8KKwkJcnhycGNfZ2V0X2Nvbm5lY3Rpb24oc2VydmVyLT52bHNlcnZlcik7CisJCWNvbm4gPSBzZXJ2ZXItPnZsc2VydmVyOworCQl1cF9yZWFkKCZzZXJ2ZXItPnNlbSk7CisJfQorCWVsc2UgeworCQkvKiBjcmVhdGUgYSBuZXcgY29ubmVjdGlvbiAqLworCQl1cF9yZWFkKCZzZXJ2ZXItPnNlbSk7CisJCWRvd25fd3JpdGUoJnNlcnZlci0+c2VtKTsKKwkJaWYgKCFzZXJ2ZXItPnZsc2VydmVyKSB7CisJCQlyZXQgPSByeHJwY19jcmVhdGVfY29ubmVjdGlvbihhZnNfdHJhbnNwb3J0LAorCQkJCQkJICAgICAgaHRvbnMoNzAwMyksCisJCQkJCQkgICAgICBzZXJ2ZXItPmFkZHIuc19hZGRyLAorCQkJCQkJICAgICAgVkxfU0VSVklDRV9JRCwKKwkJCQkJCSAgICAgIE5VTEwsCisJCQkJCQkgICAgICAmc2VydmVyLT52bHNlcnZlcik7CisJCX0KKwkJaWYgKHJldCA9PSAwKSB7CisJCQlyeHJwY19nZXRfY29ubmVjdGlvbihzZXJ2ZXItPnZsc2VydmVyKTsKKwkJCWNvbm4gPSBzZXJ2ZXItPnZsc2VydmVyOworCQl9CisJCXVwX3dyaXRlKCZzZXJ2ZXItPnNlbSk7CisJfQorCisJKl9jb25uID0gY29ubjsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfSAvKiBlbmQgYWZzX3NlcnZlcl9nZXRfdmxjb25uKCkgKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9zZXJ2ZXIuaCBiL2ZzL2Fmcy9zZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2QyNDExCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL3NlcnZlci5oCkBAIC0wLDAgKzEsMTAyIEBACisvKiBzZXJ2ZXIuaDogQUZTIHNlcnZlciByZWNvcmQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfTElOVVhfQUZTX1NFUlZFUl9ICisjZGVmaW5lIF9MSU5VWF9BRlNfU0VSVkVSX0gKKworI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAia2Fmc3RpbW9kLmgiCisjaW5jbHVkZSA8cnhycGMvcGVlci5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisKK2V4dGVybiBzcGlubG9ja190IGFmc19zZXJ2ZXJfcGVlcl9sb2NrOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQUZTIHNlcnZlciByZWNvcmQKKyAqLworc3RydWN0IGFmc19zZXJ2ZXIKK3sKKwlhdG9taWNfdAkJdXNhZ2U7CisJc3RydWN0IGFmc19jZWxsCQkqY2VsbDsJCS8qIGNlbGwgaW4gd2hpY2ggc2VydmVyIHJlc2lkZXMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpbms7CQkvKiBsaW5rIGluIGNlbGwncyBzZXJ2ZXIgbGlzdCAqLworCXN0cnVjdCByd19zZW1hcGhvcmUJc2VtOwkJLyogYWNjZXNzIGxvY2sgKi8KKwlzdHJ1Y3QgYWZzX3RpbWVyCXRpbWVvdXQ7CS8qIGdyYXZleWFyZCB0aW1lb3V0ICovCisJc3RydWN0IGluX2FkZHIJCWFkZHI7CQkvKiBzZXJ2ZXIgYWRkcmVzcyAqLworCXN0cnVjdCByeHJwY19wZWVyCSpwZWVyOwkJLyogcGVlciByZWNvcmQgZm9yIHRoaXMgc2VydmVyICovCisJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24JKnZsc2VydmVyOwkvKiBjb25uZWN0aW9uIHRvIHRoZSB2b2x1bWUgbG9jYXRpb24gc2VydmljZSAqLworCisJLyogZmlsZSBzZXJ2aWNlIGFjY2VzcyAqLworI2RlZmluZSBBRlNfU0VSVkVSX0NPTk5fTElTVF9TSVpFIDIKKwlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbgkqZnNfY29ubltBRlNfU0VSVkVSX0NPTk5fTElTVF9TSVpFXTsgLyogRlMgY29ubmVjdGlvbnMgKi8KKwl1bnNpZ25lZAkJZnNfY29ubl9jbnRbQUZTX1NFUlZFUl9DT05OX0xJU1RfU0laRV07CS8qIHBlciBjb25uIGNhbGwgY291bnQgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWZzX2NhbGxxOwkvKiBxdWV1ZSBvZiBwcm9jZXNzZXMgd2FpdGluZyB0byBtYWtlIGEgY2FsbCAqLworCXNwaW5sb2NrX3QJCWZzX2xvY2s7CS8qIGFjY2VzcyBsb2NrICovCisJaW50CQkJZnNfc3RhdGU7ICAgICAgCS8qIDAgb3IgcmVhc29uIEZTIGN1cnJlbnRseSBtYXJrZWQgZGVhZCAoLWVycm5vKSAqLworCXVuc2lnbmVkCQlmc19ydHQ7CQkvKiBGUyByb3VuZCB0cmlwIHRpbWUgKi8KKwl1bnNpZ25lZCBsb25nCQlmc19hY3RfamlmOwkvKiB0aW1lIGF0IHdoaWNoIGxhc3QgYWN0aXZpdHkgb2NjdXJyZWQgKi8KKwl1bnNpZ25lZCBsb25nCQlmc19kZWFkX2ppZjsJLyogdGltZSBhdCB3aGljaCBubyBsb25nZXIgdG8gYmUgY29uc2lkZXJlZCBkZWFkICovCisKKwkvKiBjYWxsYmFjayBwcm9taXNlIG1hbmFnZW1lbnQgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWNiX3Byb21pc2VzOwkvKiBhcyB5ZXQgdW5icm9rZW4gcHJvbWlzZXMgZnJvbSB0aGlzIHNlcnZlciAqLworCXNwaW5sb2NrX3QJCWNiX2xvY2s7CS8qIGFjY2VzcyBsb2NrICovCit9OworCitleHRlcm4gaW50IGFmc19zZXJ2ZXJfbG9va3VwKHN0cnVjdCBhZnNfY2VsbCAqY2VsbCwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGluX2FkZHIgKmFkZHIsCisJCQkgICAgIHN0cnVjdCBhZnNfc2VydmVyICoqX3NlcnZlcik7CisKKyNkZWZpbmUgYWZzX2dldF9zZXJ2ZXIoUykgZG8geyBhdG9taWNfaW5jKCYoUyktPnVzYWdlKTsgfSB3aGlsZSgwKQorCitleHRlcm4gdm9pZCBhZnNfcHV0X3NlcnZlcihzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyKTsKK2V4dGVybiB2b2lkIGFmc19zZXJ2ZXJfZG9fdGltZW91dChzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyKTsKKworZXh0ZXJuIGludCBhZnNfc2VydmVyX2ZpbmRfYnlfcGVlcihjb25zdCBzdHJ1Y3QgcnhycGNfcGVlciAqcGVlciwKKwkJCQkgICBzdHJ1Y3QgYWZzX3NlcnZlciAqKl9zZXJ2ZXIpOworCitleHRlcm4gaW50IGFmc19zZXJ2ZXJfZ2V0X3ZsY29ubihzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAorCQkJCSBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqKl9jb25uKTsKKworc3RhdGljIGlubGluZQorc3RydWN0IGFmc19zZXJ2ZXIgKmFmc19zZXJ2ZXJfZ2V0X2Zyb21fcGVlcihzdHJ1Y3QgcnhycGNfcGVlciAqcGVlcikKK3sKKwlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOworCisJc3Bpbl9sb2NrKCZhZnNfc2VydmVyX3BlZXJfbG9jayk7CisJc2VydmVyID0gcGVlci0+dXNlcjsKKwlpZiAoc2VydmVyKQorCQlhZnNfZ2V0X3NlcnZlcihzZXJ2ZXIpOworCXNwaW5fdW5sb2NrKCZhZnNfc2VydmVyX3BlZXJfbG9jayk7CisKKwlyZXR1cm4gc2VydmVyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQUZTIHNlcnZlciBjYWxsc2xvdCBncmFudCByZWNvcmQKKyAqLworc3RydWN0IGFmc19zZXJ2ZXJfY2FsbHNsb3QKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpbms7CQkvKiBsaW5rIGluIHNlcnZlcidzIGxpc3QgKi8KKwlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnRhc2s7CQkvKiBwcm9jZXNzIHdhaXRpbmcgdG8gbWFrZSBjYWxsICovCisJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24JKmNvbm47CQkvKiBjb25uZWN0aW9uIHRvIHVzZSAob3IgTlVMTCBvbiBlcnJvcikgKi8KKwlzaG9ydAkJCW5jb25uOwkJLyogY29ubmVjdGlvbiBzbG90IG51bWJlciAoLTEgb24gZXJyb3IpICovCisJY2hhcgkJCXJlYWR5OwkJLyogVCB3aGVuIHJlYWR5ICovCisJaW50CQkJZXJybm87CQkvKiBlcnJvciBudW1iZXIgaWYgbmNvbm49PS0xICovCit9OworCitleHRlcm4gaW50IGFmc19zZXJ2ZXJfcmVxdWVzdF9jYWxsc2xvdChzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAorCQkJCSAgICAgICBzdHJ1Y3QgYWZzX3NlcnZlcl9jYWxsc2xvdCAqY2FsbHNsb3QpOworCitleHRlcm4gdm9pZCBhZnNfc2VydmVyX3JlbGVhc2VfY2FsbHNsb3Qoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKKwkJCQkJc3RydWN0IGFmc19zZXJ2ZXJfY2FsbHNsb3QgKmNhbGxzbG90KTsKKworI2VuZGlmIC8qIF9MSU5VWF9BRlNfU0VSVkVSX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy9zdXBlci5jIGIvZnMvYWZzL3N1cGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZmYThlNQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Fmcy9zdXBlci5jCkBAIC0wLDAgKzEsNDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBmcmVlbHkgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIEF1dGhvcnM6IERhdmlkIEhvd2VsbHMgPGRob3dlbGxzQHJlZGhhdC5jb20+CisgKiAgICAgICAgICBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGNhbWJyaWRnZS5yZWRoYXQuY29tPgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlICJ2bm9kZS5oIgorI2luY2x1ZGUgInZvbHVtZS5oIgorI2luY2x1ZGUgImNlbGwuaCIKKyNpbmNsdWRlICJjbXNlcnZpY2UuaCIKKyNpbmNsdWRlICJmc2NsaWVudC5oIgorI2luY2x1ZGUgInN1cGVyLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBBRlNfRlNfTUFHSUMgMHg2QjQxNDY1MyAvKiAna0FGUycgKi8KKworc3RydWN0IGFmc19tb3VudF9wYXJhbXMgeworCWludAkJCXJ3cGF0aDsKKwlzdHJ1Y3QgYWZzX2NlbGwJCSpkZWZhdWx0X2NlbGw7CisJc3RydWN0IGFmc192b2x1bWUJKnZvbHVtZTsKK307CisKK3N0YXRpYyB2b2lkIGFmc19pX2luaXRfb25jZSh2b2lkICpmb28sIGttZW1fY2FjaGVfdCAqY2FjaGVwLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICphZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCQkJCSAgICAgIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsCisJCQkJICAgICAgdm9pZCAqZGF0YSk7CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmFmc19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKKworc3RhdGljIHZvaWQgYWZzX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKKworc3RhdGljIHZvaWQgYWZzX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBhZnNfZnNfdHlwZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImFmcyIsCisJLmdldF9zYgkJPSBhZnNfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9hbm9uX3N1cGVyLAorCS5mc19mbGFncwk9IEZTX0JJTkFSWV9NT1VOVERBVEEsCit9OworCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgYWZzX3N1cGVyX29wcyA9IHsKKwkuc3RhdGZzCQk9IHNpbXBsZV9zdGF0ZnMsCisJLmFsbG9jX2lub2RlCT0gYWZzX2FsbG9jX2lub2RlLAorCS5kcm9wX2lub2RlCT0gZ2VuZXJpY19kZWxldGVfaW5vZGUsCisJLmRlc3Ryb3lfaW5vZGUJPSBhZnNfZGVzdHJveV9pbm9kZSwKKwkuY2xlYXJfaW5vZGUJPSBhZnNfY2xlYXJfaW5vZGUsCisJLnB1dF9zdXBlcgk9IGFmc19wdXRfc3VwZXIsCit9OworCitzdGF0aWMga21lbV9jYWNoZV90ICphZnNfaW5vZGVfY2FjaGVwOworc3RhdGljIGF0b21pY190IGFmc19jb3VudF9hY3RpdmVfaW5vZGVzOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogaW5pdGlhbGlzZSB0aGUgZmlsZXN5c3RlbQorICovCitpbnQgX19pbml0IGFmc19mc19pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCV9lbnRlcigiIik7CisKKwlhZnNfdGltZXJfaW5pdCgmYWZzX21udHB0X2V4cGlyeV90aW1lciwgJmFmc19tbnRwdF9leHBpcnlfdGltZXJfb3BzKTsKKworCS8qIGNyZWF0ZSBvdXJzZWx2ZXMgYW4gaW5vZGUgY2FjaGUgKi8KKwlhdG9taWNfc2V0KCZhZnNfY291bnRfYWN0aXZlX2lub2RlcywgMCk7CisKKwlyZXQgPSAtRU5PTUVNOworCWFmc19pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiYWZzX2lub2RlX2NhY2hlIiwKKwkJCQkJICAgICBzaXplb2Yoc3RydWN0IGFmc192bm9kZSksCisJCQkJCSAgICAgMCwKKwkJCQkJICAgICBTTEFCX0hXQ0FDSEVfQUxJR04sCisJCQkJCSAgICAgYWZzX2lfaW5pdF9vbmNlLAorCQkJCQkgICAgIE5VTEwpOworCWlmICghYWZzX2lub2RlX2NhY2hlcCkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgImtBRlM6IEZhaWxlZCB0byBhbGxvY2F0ZSBpbm9kZSBjYWNoZVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogbm93IGV4cG9ydCBvdXIgZmlsZXN5c3RlbSB0byBsZXNzZXIgbW9ydGFscyAqLworCXJldCA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmFmc19mc190eXBlKTsKKwlpZiAocmV0IDwgMCkgeworCQlrbWVtX2NhY2hlX2Rlc3Ryb3koYWZzX2lub2RlX2NhY2hlcCk7CisJCWtsZWF2ZSgiID0gJWQiLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWtsZWF2ZSgiID0gMCIpOworCXJldHVybiAwOworfSAvKiBlbmQgYWZzX2ZzX2luaXQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogY2xlYW4gdXAgdGhlIGZpbGVzeXN0ZW0KKyAqLwordm9pZCBfX2V4aXQgYWZzX2ZzX2V4aXQodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmFmc19mc190eXBlKTsKKworCWlmIChhdG9taWNfcmVhZCgmYWZzX2NvdW50X2FjdGl2ZV9pbm9kZXMpICE9IDApIHsKKwkJcHJpbnRrKCJrQUZTOiAlZCBhY3RpdmUgaW5vZGUgb2JqZWN0cyBzdGlsbCBwcmVzZW50XG4iLAorCQkgICAgICAgYXRvbWljX3JlYWQoJmFmc19jb3VudF9hY3RpdmVfaW5vZGVzKSk7CisJCUJVRygpOworCX0KKworCWttZW1fY2FjaGVfZGVzdHJveShhZnNfaW5vZGVfY2FjaGVwKTsKKworfSAvKiBlbmQgYWZzX2ZzX2V4aXQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogY2hlY2sgdGhhdCBhbiBhcmd1bWVudCBoYXMgYSB2YWx1ZQorICovCitzdGF0aWMgaW50IHdhbnRfYXJnKGNoYXIgKipfdmFsdWUsIGNvbnN0IGNoYXIgKm9wdGlvbikKK3sKKwlpZiAoIV92YWx1ZSB8fCAhKl92YWx1ZSB8fCAhKipfdmFsdWUpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJrQUZTOiAlczogYXJndW1lbnQgbWlzc2luZ1xuIiwgb3B0aW9uKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfSAvKiBlbmQgd2FudF9hcmcoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogY2hlY2sgdGhhdCB0aGVyZSdzIG5vIHN1YnNlcXVlbnQgdmFsdWUKKyAqLworc3RhdGljIGludCB3YW50X25vX3ZhbHVlKGNoYXIgKmNvbnN0ICpfdmFsdWUsIGNvbnN0IGNoYXIgKm9wdGlvbikKK3sKKwlpZiAoKl92YWx1ZSAmJiAqKl92YWx1ZSkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgImtBRlM6ICVzOiBJbnZhbGlkIGFyZ3VtZW50OiAlc1xuIiwKKwkJICAgICAgIG9wdGlvbiwgKl92YWx1ZSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30gLyogZW5kIHdhbnRfbm9fdmFsdWUoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogcGFyc2UgdGhlIG1vdW50IG9wdGlvbnMKKyAqIC0gdGhpcyBmdW5jdGlvbiBoYXMgYmVlbiBzaGFtZWxlc3NseSBhZGFwdGVkIGZyb20gdGhlIGV4dDMgZnMgd2hpY2gKKyAqICAgc2hhbWVsZXNzbHkgYWRhcHRlZCBpdCBmcm9tIHRoZSBtc2RvcyBmcworICovCitzdGF0aWMgaW50IGFmc19zdXBlcl9wYXJzZV9vcHRpb25zKHN0cnVjdCBhZnNfbW91bnRfcGFyYW1zICpwYXJhbXMsCisJCQkJICAgY2hhciAqb3B0aW9ucywKKwkJCQkgICBjb25zdCBjaGFyICoqZGV2bmFtZSkKK3sKKwljaGFyICprZXksICp2YWx1ZTsKKwlpbnQgcmV0OworCisJX2VudGVyKCIlcyIsIG9wdGlvbnMpOworCisJb3B0aW9uc1tQQUdFX1NJWkUgLSAxXSA9IDA7CisKKwlyZXQgPSAwOworCXdoaWxlICgoa2V5ID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSAwKQorCXsKKwkJdmFsdWUgPSBzdHJjaHIoa2V5LCAnPScpOworCQlpZiAodmFsdWUpCisJCQkqdmFsdWUrKyA9IDA7CisKKwkJcHJpbnRrKCJrQUZTOiBLRVk6ICVzLCBWQUw6JXNcbiIsIGtleSwgdmFsdWUgPzogIi0iKTsKKworCQlpZiAoc3RyY21wKGtleSwgInJ3cGF0aCIpID09IDApIHsKKwkJCWlmICghd2FudF9ub192YWx1ZSgmdmFsdWUsICJyd3BhdGgiKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXBhcmFtcy0+cndwYXRoID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWVsc2UgaWYgKHN0cmNtcChrZXksICJ2b2wiKSA9PSAwKSB7CisJCQlpZiAoIXdhbnRfYXJnKCZ2YWx1ZSwgInZvbCIpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJKmRldm5hbWUgPSB2YWx1ZTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWVsc2UgaWYgKHN0cmNtcChrZXksICJjZWxsIikgPT0gMCkgeworCQkJaWYgKCF3YW50X2FyZygmdmFsdWUsICJjZWxsIikpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlhZnNfcHV0X2NlbGwocGFyYW1zLT5kZWZhdWx0X2NlbGwpOworCQkJcmV0ID0gYWZzX2NlbGxfbG9va3VwKHZhbHVlLAorCQkJCQkgICAgICBzdHJsZW4odmFsdWUpLAorCQkJCQkgICAgICAmcGFyYW1zLT5kZWZhdWx0X2NlbGwpOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQljb250aW51ZTsKKwkJfQorCisJCXByaW50aygia0FGUzogVW5rbm93biBtb3VudCBvcHRpb246ICclcydcbiIsICBrZXkpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOworCX0KKworCXJldCA9IDA7CisKKyBlcnJvcjoKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfSAvKiBlbmQgYWZzX3N1cGVyX3BhcnNlX29wdGlvbnMoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogY2hlY2sgYSBzdXBlcmJsb2NrIHRvIHNlZSBpZiBpdCdzIHRoZSBvbmUgd2UncmUgbG9va2luZyBmb3IKKyAqLworc3RhdGljIGludCBhZnNfdGVzdF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBhZnNfbW91bnRfcGFyYW1zICpwYXJhbXMgPSBkYXRhOworCXN0cnVjdCBhZnNfc3VwZXJfaW5mbyAqYXMgPSBzYi0+c19mc19pbmZvOworCisJcmV0dXJuIGFzLT52b2x1bWUgPT0gcGFyYW1zLT52b2x1bWU7Cit9IC8qIGVuZCBhZnNfdGVzdF9zdXBlcigpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBmaWxsIGluIHRoZSBzdXBlcmJsb2NrCisgKi8KK3N0YXRpYyBpbnQgYWZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgYWZzX21vdW50X3BhcmFtcyAqcGFyYW1zID0gZGF0YTsKKwlzdHJ1Y3QgYWZzX3N1cGVyX2luZm8gKmFzID0gTlVMTDsKKwlzdHJ1Y3QgYWZzX2ZpZCBmaWQ7CisJc3RydWN0IGRlbnRyeSAqcm9vdCA9IE5VTEw7CisJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CisJaW50IHJldDsKKworCWtlbnRlcigiIik7CisKKwkvKiBhbGxvY2F0ZSBhIHN1cGVyYmxvY2sgaW5mbyByZWNvcmQgKi8KKwlhcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhZnNfc3VwZXJfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghYXMpIHsKKwkJX2xlYXZlKCIgPSAtRU5PTUVNIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldChhcywgMCwgc2l6ZW9mKHN0cnVjdCBhZnNfc3VwZXJfaW5mbykpOworCisJYWZzX2dldF92b2x1bWUocGFyYW1zLT52b2x1bWUpOworCWFzLT52b2x1bWUgPSBwYXJhbXMtPnZvbHVtZTsKKworCS8qIGZpbGwgaW4gdGhlIHN1cGVyYmxvY2sgKi8KKwlzYi0+c19ibG9ja3NpemUJCT0gUEFHRV9DQUNIRV9TSVpFOworCXNiLT5zX2Jsb2Nrc2l6ZV9iaXRzCT0gUEFHRV9DQUNIRV9TSElGVDsKKwlzYi0+c19tYWdpYwkJPSBBRlNfRlNfTUFHSUM7CisJc2ItPnNfb3AJCT0gJmFmc19zdXBlcl9vcHM7CisJc2ItPnNfZnNfaW5mbwkJPSBhczsKKworCS8qIGFsbG9jYXRlIHRoZSByb290IGlub2RlIGFuZCBkZW50cnkgKi8KKwlmaWQudmlkCQk9IGFzLT52b2x1bWUtPnZpZDsKKwlmaWQudm5vZGUJPSAxOworCWZpZC51bmlxdWUJPSAxOworCXJldCA9IGFmc19pZ2V0KHNiLCAmZmlkLCAmaW5vZGUpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJcmV0ID0gLUVOT01FTTsKKwlyb290ID0gZF9hbGxvY19yb290KGlub2RlKTsKKwlpZiAoIXJvb3QpCisJCWdvdG8gZXJyb3I7CisKKwlzYi0+c19yb290ID0gcm9vdDsKKworCWtsZWF2ZSgiID0gMCIpOworCXJldHVybiAwOworCisgZXJyb3I6CisJaXB1dChpbm9kZSk7CisJYWZzX3B1dF92b2x1bWUoYXMtPnZvbHVtZSk7CisJa2ZyZWUoYXMpOworCisJc2ItPnNfZnNfaW5mbyA9IE5VTEw7CisKKwlrbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfSAvKiBlbmQgYWZzX2ZpbGxfc3VwZXIoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZ2V0IGFuIEFGUyBzdXBlcmJsb2NrCisgKiAtIFRPRE86IGRvbid0IHVzZSBnZXRfc2Jfbm9kZXYoKSwgYnV0IHJhdGhlciBjYWxsIHNnZXQoKSBkaXJlY3RseQorICovCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICphZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCQkJCSAgICAgIGludCBmbGFncywKKwkJCQkgICAgICBjb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJCQkgICAgICB2b2lkICpvcHRpb25zKQoreworCXN0cnVjdCBhZnNfbW91bnRfcGFyYW1zIHBhcmFtczsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCWludCByZXQ7CisKKwlfZW50ZXIoIiwsJXMsJXAiLCBkZXZfbmFtZSwgb3B0aW9ucyk7CisKKwltZW1zZXQoJnBhcmFtcywgMCwgc2l6ZW9mKHBhcmFtcykpOworCisJLyogc3RhcnQgdGhlIGNhY2hlIG1hbmFnZXIgKi8KKwlyZXQgPSBhZnNjbV9zdGFydCgpOworCWlmIChyZXQgPCAwKSB7CisJCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCX0KKworCS8qIHBhcnNlIHRoZSBvcHRpb25zICovCisJaWYgKG9wdGlvbnMpIHsKKwkJcmV0ID0gYWZzX3N1cGVyX3BhcnNlX29wdGlvbnMoJnBhcmFtcywgb3B0aW9ucywgJmRldl9uYW1lKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycm9yOworCQlpZiAoIWRldl9uYW1lKSB7CisJCQlwcmludGsoImtBRlM6IG5vIHZvbHVtZSBuYW1lIHNwZWNpZmllZFxuIik7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKworCS8qIHBhcnNlIHRoZSBkZXZpY2UgbmFtZSAqLworCXJldCA9IGFmc192b2x1bWVfbG9va3VwKGRldl9uYW1lLAorCQkJCXBhcmFtcy5kZWZhdWx0X2NlbGwsCisJCQkJcGFyYW1zLnJ3cGF0aCwKKwkJCQkmcGFyYW1zLnZvbHVtZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBhbGxvY2F0ZSBhIGRldmljZWxlc3Mgc3VwZXJibG9jayAqLworCXNiID0gc2dldChmc190eXBlLCBhZnNfdGVzdF9zdXBlciwgc2V0X2Fub25fc3VwZXIsICZwYXJhbXMpOworCWlmIChJU19FUlIoc2IpKQorCQlnb3RvIGVycm9yOworCisJc2ItPnNfZmxhZ3MgPSBmbGFnczsKKworCXJldCA9IGFmc19maWxsX3N1cGVyKHNiLCAmcGFyYW1zLCBmbGFncyAmIE1TX1ZFUkJPU0UgPyAxIDogMCk7CisJaWYgKHJldCA8IDApIHsKKwkJdXBfd3JpdGUoJnNiLT5zX3Vtb3VudCk7CisJCWRlYWN0aXZhdGVfc3VwZXIoc2IpOworCQlnb3RvIGVycm9yOworCX0KKwlzYi0+c19mbGFncyB8PSBNU19BQ1RJVkU7CisKKwlhZnNfcHV0X3ZvbHVtZShwYXJhbXMudm9sdW1lKTsKKwlhZnNfcHV0X2NlbGwocGFyYW1zLmRlZmF1bHRfY2VsbCk7CisJX2xlYXZlKCIgPSAlcCIsIHNiKTsKKwlyZXR1cm4gc2I7CisKKyBlcnJvcjoKKwlhZnNfcHV0X3ZvbHVtZShwYXJhbXMudm9sdW1lKTsKKwlhZnNfcHV0X2NlbGwocGFyYW1zLmRlZmF1bHRfY2VsbCk7CisJYWZzY21fc3RvcCgpOworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiBFUlJfUFRSKHJldCk7Cit9IC8qIGVuZCBhZnNfZ2V0X3NiKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGZpbmlzaCB0aGUgdW5tb3VudGluZyBwcm9jZXNzIG9uIHRoZSBzdXBlcmJsb2NrCisgKi8KK3N0YXRpYyB2b2lkIGFmc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgYWZzX3N1cGVyX2luZm8gKmFzID0gc2ItPnNfZnNfaW5mbzsKKworCV9lbnRlcigiIik7CisKKwlhZnNfcHV0X3ZvbHVtZShhcy0+dm9sdW1lKTsKKwlhZnNjbV9zdG9wKCk7CisKKwlfbGVhdmUoIiIpOworfSAvKiBlbmQgYWZzX3B1dF9zdXBlcigpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBpbml0aWFsaXNlIGFuIGlub2RlIGNhY2hlIHNsYWIgZWxlbWVudCBwcmlvciB0byBhbnkgdXNlCisgKi8KK3N0YXRpYyB2b2lkIGFmc19pX2luaXRfb25jZSh2b2lkICpfdm5vZGUsIGttZW1fY2FjaGVfdCAqY2FjaGVwLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IGFmc192bm9kZSAqdm5vZGUgPSAoc3RydWN0IGFmc192bm9kZSAqKSBfdm5vZGU7CisKKwlpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRll8U0xBQl9DVE9SX0NPTlNUUlVDVE9SKSkgPT0KKwkgICAgU0xBQl9DVE9SX0NPTlNUUlVDVE9SKSB7CisJCW1lbXNldCh2bm9kZSwgMCwgc2l6ZW9mKCp2bm9kZSkpOworCQlpbm9kZV9pbml0X29uY2UoJnZub2RlLT52ZnNfaW5vZGUpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ2bm9kZS0+dXBkYXRlX3dhaXRxKTsKKwkJc3Bpbl9sb2NrX2luaXQoJnZub2RlLT5sb2NrKTsKKwkJSU5JVF9MSVNUX0hFQUQoJnZub2RlLT5jYl9saW5rKTsKKwkJSU5JVF9MSVNUX0hFQUQoJnZub2RlLT5jYl9oYXNoX2xpbmspOworCQlhZnNfdGltZXJfaW5pdCgmdm5vZGUtPmNiX3RpbWVvdXQsCisJCQkgICAgICAgJmFmc192bm9kZV9jYl90aW1lZF9vdXRfb3BzKTsKKwl9CisKK30gLyogZW5kIGFmc19pX2luaXRfb25jZSgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBhbGxvY2F0ZSBhbiBBRlMgaW5vZGUgc3RydWN0IGZyb20gb3VyIHNsYWIgY2FjaGUKKyAqLworc3RhdGljIHN0cnVjdCBpbm9kZSAqYWZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGFmc192bm9kZSAqdm5vZGU7CisKKwl2bm9kZSA9IChzdHJ1Y3QgYWZzX3Zub2RlICopCisJCWttZW1fY2FjaGVfYWxsb2MoYWZzX2lub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCWlmICghdm5vZGUpCisJCXJldHVybiBOVUxMOworCisJYXRvbWljX2luYygmYWZzX2NvdW50X2FjdGl2ZV9pbm9kZXMpOworCisJbWVtc2V0KCZ2bm9kZS0+ZmlkLCAwLCBzaXplb2Yodm5vZGUtPmZpZCkpOworCW1lbXNldCgmdm5vZGUtPnN0YXR1cywgMCwgc2l6ZW9mKHZub2RlLT5zdGF0dXMpKTsKKworCXZub2RlLT52b2x1bWUJCT0gTlVMTDsKKwl2bm9kZS0+dXBkYXRlX2NudAk9IDA7CisJdm5vZGUtPmZsYWdzCQk9IDA7CisKKwlyZXR1cm4gJnZub2RlLT52ZnNfaW5vZGU7Cit9IC8qIGVuZCBhZnNfYWxsb2NfaW5vZGUoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZGVzdHJveSBhbiBBRlMgaW5vZGUgc3RydWN0CisgKi8KK3N0YXRpYyB2b2lkIGFmc19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJX2VudGVyKCJ7JWx1fSIsIGlub2RlLT5pX2lubyk7CisKKwlrbWVtX2NhY2hlX2ZyZWUoYWZzX2lub2RlX2NhY2hlcCwgQUZTX0ZTX0koaW5vZGUpKTsKKworCWF0b21pY19kZWMoJmFmc19jb3VudF9hY3RpdmVfaW5vZGVzKTsKKworfSAvKiBlbmQgYWZzX2Rlc3Ryb3lfaW5vZGUoKSAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL3N1cGVyLmggYi9mcy9hZnMvc3VwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzExMzYyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL3N1cGVyLmgKQEAgLTAsMCArMSw0MyBAQAorLyogc3VwZXIuaDogQUZTIGZpbGVzeXN0ZW0gaW50ZXJuYWwgcHJpdmF0ZSBkYXRhCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSBmcmVlbHkgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIEF1dGhvcnM6IERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAY2FtYnJpZGdlLnJlZGhhdC5jb20+CisgKiAgICAgICAgICBEYXZpZCBIb3dlbGxzIDxkaG93ZWxsc0ByZWRoYXQuY29tPgorICoKKyAqLworCisjaWZuZGVmIF9MSU5VWF9BRlNfU1VQRVJfSAorI2RlZmluZSBfTElOVVhfQUZTX1NVUEVSX0gKKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSAic2VydmVyLmgiCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBBRlMgc3VwZXJibG9jayBwcml2YXRlIGRhdGEKKyAqIC0gdGhlcmUncyBvbmUgc3VwZXJibG9jayBwZXIgdm9sdW1lCisgKi8KK3N0cnVjdCBhZnNfc3VwZXJfaW5mbworeworCXN0cnVjdCBhZnNfdm9sdW1lCSp2b2x1bWU7CS8qIHZvbHVtZSByZWNvcmQgKi8KKwljaGFyCQkJcndwYXJlbnQ7CS8qIFQgaWYgcGFyZW50IGlzIFIvVyBBRlMgdm9sdW1lICovCit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhZnNfc3VwZXJfaW5mbyAqQUZTX0ZTX1Moc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlyZXR1cm4gc2ItPnNfZnNfaW5mbzsKK30KKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmIC8qIF9MSU5VWF9BRlNfU1VQRVJfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL3RyYW5zcG9ydC5oIGIvZnMvYWZzL3RyYW5zcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMTNhZTYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZnMvdHJhbnNwb3J0LmgKQEAgLTAsMCArMSwyMSBAQAorLyogdHJhbnNwb3J0Lmg6IEFGUyB0cmFuc3BvcnQgbWFuYWdlbWVudAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9BRlNfVFJBTlNQT1JUX0gKKyNkZWZpbmUgX0xJTlVYX0FGU19UUkFOU1BPUlRfSAorCisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlIDxyeHJwYy90cmFuc3BvcnQuaD4KKworLyogdGhlIGNhY2hlIG1hbmFnZXIgdHJhbnNwb3J0IGVuZHBvaW50ICovCitleHRlcm4gc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqYWZzX3RyYW5zcG9ydDsKKworI2VuZGlmIC8qIF9MSU5VWF9BRlNfVFJBTlNQT1JUX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy90eXBlcy5oIGIvZnMvYWZzL3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFhMjM2NwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Fmcy90eXBlcy5oCkBAIC0wLDAgKzEsMTI1IEBACisvKiB0eXBlcy5oOiBBRlMgdHlwZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfTElOVVhfQUZTX1RZUEVTX0gKKyNkZWZpbmUgX0xJTlVYX0FGU19UWVBFU19ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8cnhycGMvdHlwZXMuaD4KKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKK3R5cGVkZWYgdW5zaWduZWQJCQlhZnNfdm9saWRfdDsKK3R5cGVkZWYgdW5zaWduZWQJCQlhZnNfdm5vZGVpZF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcJCWFmc19kYXRhdmVyc2lvbl90OworCit0eXBlZGVmIGVudW0geworCUFGU1ZMX1JXVk9MLAkJCS8qIHJlYWQvd3JpdGUgdm9sdW1lICovCisJQUZTVkxfUk9WT0wsCQkJLyogcmVhZC1vbmx5IHZvbHVtZSAqLworCUFGU1ZMX0JBQ0tWT0wsCQkJLyogYmFja3VwIHZvbHVtZSAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBhZnNfdm9sdHlwZV90OworCit0eXBlZGVmIGVudW0geworCUFGU19GVFlQRV9JTlZBTElECT0gMCwKKwlBRlNfRlRZUEVfRklMRQkJPSAxLAorCUFGU19GVFlQRV9ESVIJCT0gMiwKKwlBRlNfRlRZUEVfU1lNTElOSwk9IDMsCit9IGFmc19maWxlX3R5cGVfdDsKKworI2lmZGVmIF9fS0VSTkVMX18KKworc3RydWN0IGFmc19jZWxsOworc3RydWN0IGFmc192bm9kZTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEFGUyBmaWxlIGlkZW50aWZpZXIKKyAqLworc3RydWN0IGFmc19maWQKK3sKKwlhZnNfdm9saWRfdAl2aWQ7CQkvKiB2b2x1bWUgSUQgKi8KKwlhZnNfdm5vZGVpZF90CXZub2RlOwkJLyogZmlsZSBpbmRleCB3aXRoaW4gdm9sdW1lICovCisJdW5zaWduZWQJdW5pcXVlOwkJLyogdW5pcXVlIElEIG51bWJlciAoZmlsZSBpbmRleCB2ZXJzaW9uKSAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEFGUyBjYWxsYmFjayBub3RpZmljYXRpb24KKyAqLwordHlwZWRlZiBlbnVtIHsKKwlBRlNDTV9DQl9VTlRZUEVECT0gMCwJLyogbm8gdHlwZSBzZXQgb24gQ0IgYnJlYWsgKi8KKwlBRlNDTV9DQl9FWENMVVNJVkUJPSAxLAkvKiBDQiBleGNsdXNpdmUgdG8gQ00gW25vdCBpbXBsZW1lbnRlZF0gKi8KKwlBRlNDTV9DQl9TSEFSRUQJCT0gMiwJLyogQ0Igc2hhcmVkIGJ5IG90aGVyIENNJ3MgKi8KKwlBRlNDTV9DQl9EUk9QUEVECT0gMywJLyogQ0IgcHJvbWlzZSBjYW5jZWxsZWQgYnkgZmlsZSBzZXJ2ZXIgKi8KK30gYWZzX2NhbGxiYWNrX3R5cGVfdDsKKworc3RydWN0IGFmc19jYWxsYmFjaworeworCXN0cnVjdCBhZnNfc2VydmVyCSpzZXJ2ZXI7CS8qIHNlcnZlciB0aGF0IG1hZGUgdGhlIHByb21pc2UgKi8KKwlzdHJ1Y3QgYWZzX2ZpZAkJZmlkOwkJLyogZmlsZSBpZGVudGlmaWVyICovCisJdW5zaWduZWQJCXZlcnNpb247CS8qIGNhbGxiYWNrIHZlcnNpb24gKi8KKwl1bnNpZ25lZAkJZXhwaXJ5OwkJLyogdGltZSBhdCB3aGljaCBleHBpcmVzICovCisJYWZzX2NhbGxiYWNrX3R5cGVfdAl0eXBlOwkJLyogdHlwZSBvZiBjYWxsYmFjayAqLworfTsKKworI2RlZmluZSBBRlNDQk1BWCA1MAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQUZTIHZvbHVtZSBpbmZvcm1hdGlvbgorICovCitzdHJ1Y3QgYWZzX3ZvbHVtZV9pbmZvCit7CisJYWZzX3ZvbGlkX3QJCXZpZDsJCS8qIHZvbHVtZSBJRCAqLworCWFmc192b2x0eXBlX3QJCXR5cGU7CQkvKiB0eXBlIG9mIHRoaXMgdm9sdW1lICovCisJYWZzX3ZvbGlkX3QJCXR5cGVfdmlkc1s1XTsJLyogdm9sdW1lIElEJ3MgZm9yIHBvc3NpYmxlIHR5cGVzIGZvciB0aGlzIHZvbCAqLworCQorCS8qIGxpc3Qgb2YgZmlsZXNlcnZlcnMgc2VydmluZyB0aGlzIHZvbHVtZSAqLworCXNpemVfdAkJCW5zZXJ2ZXJzOwkvKiBudW1iZXIgb2YgZW50cmllcyB1c2VkIGluIHNlcnZlcnNbXSAqLworCXN0cnVjdCB7CisJCXN0cnVjdCBpbl9hZGRyCWFkZHI7CQkvKiBmaWxlc2VydmVyIGFkZHJlc3MgKi8KKwl9IHNlcnZlcnNbOF07Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQUZTIGZpbGUgc3RhdHVzIGluZm9ybWF0aW9uCisgKi8KK3N0cnVjdCBhZnNfZmlsZV9zdGF0dXMKK3sKKwl1bnNpZ25lZAkJaWZfdmVyc2lvbjsJLyogaW50ZXJmYWNlIHZlcnNpb24gKi8KKyNkZWZpbmUgQUZTX0ZTVEFUVVNfVkVSU0lPTgkxCisKKwlhZnNfZmlsZV90eXBlX3QJCXR5cGU7CQkvKiBmaWxlIHR5cGUgKi8KKwl1bnNpZ25lZAkJbmxpbms7CQkvKiBsaW5rIGNvdW50ICovCisJc2l6ZV90CQkJc2l6ZTsJCS8qIGZpbGUgc2l6ZSAqLworCWFmc19kYXRhdmVyc2lvbl90CXZlcnNpb247CS8qIGN1cnJlbnQgZGF0YSB2ZXJzaW9uICovCisJdW5zaWduZWQJCWF1dGhvcjsJCS8qIGF1dGhvciBJRCAqLworCXVuc2lnbmVkCQlvd25lcjsJCS8qIG93bmVyIElEICovCisJdW5zaWduZWQJCWNhbGxlcl9hY2Nlc3M7CS8qIGFjY2VzcyByaWdodHMgZm9yIGF1dGhlbnRpY2F0ZWQgY2FsbGVyICovCisJdW5zaWduZWQJCWFub25fYWNjZXNzOwkvKiBhY2Nlc3MgcmlnaHRzIGZvciB1bmF1dGhlbnRpY2F0ZWQgY2FsbGVyICovCisJdW1vZGVfdAkJCW1vZGU7CQkvKiBVTklYIG1vZGUgKi8KKwlzdHJ1Y3QgYWZzX2ZpZAkJcGFyZW50OwkJLyogcGFyZW50IGZpbGUgSUQgKi8KKwl0aW1lX3QJCQltdGltZV9jbGllbnQ7CS8qIGxhc3QgdGltZSBjbGllbnQgY2hhbmdlZCBkYXRhICovCisJdGltZV90CQkJbXRpbWVfc2VydmVyOwkvKiBsYXN0IHRpbWUgc2VydmVyIGNoYW5nZWQgZGF0YSAqLworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIEFGUyB2b2x1bWUgc3luY2hyb25pc2F0aW9uIGluZm9ybWF0aW9uCisgKi8KK3N0cnVjdCBhZnNfdm9sc3luYworeworCXRpbWVfdAkJCWNyZWF0aW9uOwkvKiB2b2x1bWUgY3JlYXRpb24gdGltZSAqLworfTsKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmIC8qIF9MSU5VWF9BRlNfVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvYWZzL3ZsY2xpZW50LmMgYi9mcy9hZnMvdmxjbGllbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjBlMzE5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL3ZsY2xpZW50LmMKQEAgLTAsMCArMSw2OTUgQEAKKy8qIHZsY2xpZW50LmM6IEFGUyBWb2x1bWUgTG9jYXRpb24gU2VydmljZSBjbGllbnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPHJ4cnBjL3J4cnBjLmg+CisjaW5jbHVkZSA8cnhycGMvdHJhbnNwb3J0Lmg+CisjaW5jbHVkZSA8cnhycGMvY29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPHJ4cnBjL2NhbGwuaD4KKyNpbmNsdWRlICJzZXJ2ZXIuaCIKKyNpbmNsdWRlICJ2b2x1bWUuaCIKKyNpbmNsdWRlICJ2bGNsaWVudC5oIgorI2luY2x1ZGUgImthZnNhc3luY2QuaCIKKyNpbmNsdWRlICJrYWZzdGltb2QuaCIKKyNpbmNsdWRlICJlcnJvcnMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIFZMR0VURU5UUllCWUlECQk1MDMJLyogQUZTIEdldCBDYWNoZSBFbnRyeSBCeSBJRCBvcGVyYXRpb24gSUQgKi8KKyNkZWZpbmUgVkxHRVRFTlRSWUJZTkFNRQk1MDQJLyogQUZTIEdldCBDYWNoZSBFbnRyeSBCeSBOYW1lIG9wZXJhdGlvbiBJRCAqLworI2RlZmluZSBWTFBST0JFCQkJNTE0CS8qIEFGUyBQcm9iZSBWb2x1bWUgTG9jYXRpb24gU2VydmljZSBvcGVyYXRpb24gSUQgKi8KKworc3RhdGljIHZvaWQgYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X2lkX2F0dG4oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpOworc3RhdGljIHZvaWQgYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X2lkX2Vycm9yKHN0cnVjdCByeHJwY19jYWxsICpjYWxsKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIG1hcCBhZnMgVkwgYWJvcnQgY29kZXMgdG8vZnJvbSBMaW51eCBlcnJvciBjb2RlcworICogLSBjYWxsZWQgd2l0aCBjYWxsLT5sb2NrIGhlbGQKKyAqLworc3RhdGljIHZvaWQgYWZzX3J4dmxfYWVtYXAoc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCit7CisJaW50IGVycjsKKworCV9lbnRlcigieyV1LCV1LCVkfSIsCisJICAgICAgIGNhbGwtPmFwcF9lcnJfc3RhdGUsIGNhbGwtPmFwcF9hYm9ydF9jb2RlLCBjYWxsLT5hcHBfZXJybm8pOworCisJc3dpdGNoIChjYWxsLT5hcHBfZXJyX3N0YXRlKSB7CisJY2FzZSBSWFJQQ19FU1RBVEVfTE9DQUxfQUJPUlQ6CisJCWNhbGwtPmFwcF9hYm9ydF9jb2RlID0gLWNhbGwtPmFwcF9lcnJubzsKKwkJcmV0dXJuOworCisJY2FzZSBSWFJQQ19FU1RBVEVfUEVFUl9BQk9SVDoKKwkJc3dpdGNoIChjYWxsLT5hcHBfYWJvcnRfY29kZSkgeworCQljYXNlIEFGU1ZMX0lERVhJU1Q6CQllcnIgPSAtRUVYSVNUOwkJYnJlYWs7CisJCWNhc2UgQUZTVkxfSU86CQkJZXJyID0gLUVSRU1PVEVJTzsJYnJlYWs7CisJCWNhc2UgQUZTVkxfTkFNRUVYSVNUOgkJZXJyID0gLUVFWElTVDsJCWJyZWFrOworCQljYXNlIEFGU1ZMX0NSRUFURUZBSUw6CQllcnIgPSAtRVJFTU9URUlPOwlicmVhazsKKwkJY2FzZSBBRlNWTF9OT0VOVDoJCWVyciA9IC1FTk9NRURJVU07CWJyZWFrOworCQljYXNlIEFGU1ZMX0VNUFRZOgkJZXJyID0gLUVOT01FRElVTTsJYnJlYWs7CisJCWNhc2UgQUZTVkxfRU5UREVMRVRFRDoJCWVyciA9IC1FTk9NRURJVU07CWJyZWFrOworCQljYXNlIEFGU1ZMX0JBRE5BTUU6CQllcnIgPSAtRUlOVkFMOwkJYnJlYWs7CisJCWNhc2UgQUZTVkxfQkFESU5ERVg6CQllcnIgPSAtRUlOVkFMOwkJYnJlYWs7CisJCWNhc2UgQUZTVkxfQkFEVk9MVFlQRToJCWVyciA9IC1FSU5WQUw7CQlicmVhazsKKwkJY2FzZSBBRlNWTF9CQURTRVJWRVI6CQllcnIgPSAtRUlOVkFMOwkJYnJlYWs7CisJCWNhc2UgQUZTVkxfQkFEUEFSVElUSU9OOgllcnIgPSAtRUlOVkFMOwkJYnJlYWs7CisJCWNhc2UgQUZTVkxfUkVQU0ZVTEw6CQllcnIgPSAtRUZCSUc7CQlicmVhazsKKwkJY2FzZSBBRlNWTF9OT1JFUFNFUlZFUjoJCWVyciA9IC1FTk9FTlQ7CQlicmVhazsKKwkJY2FzZSBBRlNWTF9EVVBSRVBTRVJWRVI6CWVyciA9IC1FRVhJU1Q7CQlicmVhazsKKwkJY2FzZSBBRlNWTF9SV05PVEZPVU5EOgkJZXJyID0gLUVOT0VOVDsJCWJyZWFrOworCQljYXNlIEFGU1ZMX0JBRFJFRkNPVU5UOgkJZXJyID0gLUVJTlZBTDsJCWJyZWFrOworCQljYXNlIEFGU1ZMX1NJWkVFWENFRURFRDoJZXJyID0gLUVJTlZBTDsJCWJyZWFrOworCQljYXNlIEFGU1ZMX0JBREVOVFJZOgkJZXJyID0gLUVJTlZBTDsJCWJyZWFrOworCQljYXNlIEFGU1ZMX0JBRFZPTElEQlVNUDoJZXJyID0gLUVJTlZBTDsJCWJyZWFrOworCQljYXNlIEFGU1ZMX0lEQUxSRUFEWUhBU0hFRDoJZXJyID0gLUVJTlZBTDsJCWJyZWFrOworCQljYXNlIEFGU1ZMX0VOVFJZTE9DS0VEOgkJZXJyID0gLUVCVVNZOwkJYnJlYWs7CisJCWNhc2UgQUZTVkxfQkFEVk9MT1BFUjoJCWVyciA9IC1FQkFEUlFDOwkJYnJlYWs7CisJCWNhc2UgQUZTVkxfQkFEUkVMTE9DS1RZUEU6CWVyciA9IC1FSU5WQUw7CQlicmVhazsKKwkJY2FzZSBBRlNWTF9SRVJFTEVBU0U6CQllcnIgPSAtRVJFTU9URUlPOwlicmVhazsKKwkJY2FzZSBBRlNWTF9CQURTRVJWRVJGTEFHOgllcnIgPSAtRUlOVkFMOwkJYnJlYWs7CisJCWNhc2UgQUZTVkxfUEVSTToJCWVyciA9IC1FQUNDRVM7CQlicmVhazsKKwkJY2FzZSBBRlNWTF9OT01FTToJCWVyciA9IC1FUkVNT1RFSU87CWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyID0gYWZzX2Fib3J0X3RvX2Vycm9yKGNhbGwtPmFwcF9hYm9ydF9jb2RlKTsKKwkJCWJyZWFrOworCQl9CisJCWNhbGwtPmFwcF9lcnJubyA9IGVycjsKKwkJcmV0dXJuOworCisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KK30gLyogZW5kIGFmc19yeHZsX2FlbWFwKCkgKi8KKworI2lmIDAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBwcm9iZSBhIHZvbHVtZSBsb2NhdGlvbiBzZXJ2ZXIgdG8gc2VlIGlmIGl0IGlzIHN0aWxsIGFsaXZlIC0tIHVudXNlZAorICovCitzdGF0aWMgaW50IGFmc19yeHZsX3Byb2JlKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsIGludCBhbGxvY19mbGFncykKK3sKKwlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubjsKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKKwlzdHJ1Y3Qga3ZlYyBwaW92WzFdOworCXNpemVfdCBzZW50OworCWludCByZXQ7CisJX19iZTMyIHBhcmFtWzFdOworCisJREVDTEFSRV9XQUlUUVVFVUUobXlzZWxmLCBjdXJyZW50KTsKKworCS8qIGdldCBob2xkIG9mIHRoZSB2bHNlcnZlciBjb25uZWN0aW9uICovCisJcmV0ID0gYWZzX3NlcnZlcl9nZXRfdmxjb25uKHNlcnZlciwgJmNvbm4pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIGNyZWF0ZSBhIGNhbGwgdGhyb3VnaCB0aGF0IGNvbm5lY3Rpb24gKi8KKwlyZXQgPSByeHJwY19jcmVhdGVfY2FsbChjb25uLCBOVUxMLCBOVUxMLCBhZnNfcnh2bF9hZW1hcCwgJmNhbGwpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50aygia0FGUzogVW5hYmxlIHRvIGNyZWF0ZSBjYWxsOiAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXRfcHV0X2Nvbm47CisJfQorCWNhbGwtPmFwcF9vcGNvZGUgPSBWTFBST0JFOworCisJLyogd2Ugd2FudCB0byBnZXQgZXZlbnQgbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBjYWxsICovCisJYWRkX3dhaXRfcXVldWUoJmNhbGwtPndhaXRxLCAmbXlzZWxmKTsKKworCS8qIG1hcnNoYWxsIHRoZSBwYXJhbWV0ZXJzICovCisJcGFyYW1bMF0gPSBodG9ubChWTFBST0JFKTsKKwlwaW92WzBdLmlvdl9sZW4gPSBzaXplb2YocGFyYW0pOworCXBpb3ZbMF0uaW92X2Jhc2UgPSBwYXJhbTsKKworCS8qIHNlbmQgdGhlIHBhcmFtZXRlcnMgdG8gdGhlIHNlcnZlciAqLworCXJldCA9IHJ4cnBjX2NhbGxfd3JpdGVfZGF0YShjYWxsLCAxLCBwaW92LCBSWFJQQ19MQVNUX1BBQ0tFVCwKKwkJCQkgICAgYWxsb2NfZmxhZ3MsIDAsICZzZW50KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBhYm9ydDsKKworCS8qIHdhaXQgZm9yIHRoZSByZXBseSB0byBjb21wbGV0ZWx5IGFycml2ZSAqLworCWZvciAoOzspIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKGNhbGwtPmFwcF9jYWxsX3N0YXRlICE9IFJYUlBDX0NTVEFURV9DTE5UX1JDVl9SRVBMWSB8fAorCQkgICAgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlicmVhazsKKwkJc2NoZWR1bGUoKTsKKwl9CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworCXJldCA9IC1FSU5UUjsKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCWdvdG8gYWJvcnQ7CisKKwlzd2l0Y2ggKGNhbGwtPmFwcF9jYWxsX3N0YXRlKSB7CisJY2FzZSBSWFJQQ19DU1RBVEVfRVJST1I6CisJCXJldCA9IGNhbGwtPmFwcF9lcnJubzsKKwkJZ290byBvdXRfdW53YWl0OworCisJY2FzZSBSWFJQQ19DU1RBVEVfQ0xOVF9HT1RfUkVQTFk6CisJCXJldCA9IDA7CisJCWdvdG8gb3V0X3Vud2FpdDsKKworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKworIGFib3J0OgorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwlyeHJwY19jYWxsX2Fib3J0KGNhbGwsIHJldCk7CisJc2NoZWR1bGUoKTsKKworIG91dF91bndhaXQ6CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmY2FsbC0+d2FpdHEsICZteXNlbGYpOworCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOworIG91dF9wdXRfY29ubjoKKwlyeHJwY19wdXRfY29ubmVjdGlvbihjb25uKTsKKyBvdXQ6CisJcmV0dXJuIHJldDsKKworfSAvKiBlbmQgYWZzX3J4dmxfcHJvYmUoKSAqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBsb29rIHVwIGEgdm9sdW1lIGxvY2F0aW9uIGRhdGFiYXNlIGVudHJ5IGJ5IG5hbWUKKyAqLworaW50IGFmc19yeHZsX2dldF9lbnRyeV9ieV9uYW1lKHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCQkgICAgICAgY29uc3QgY2hhciAqdm9sbmFtZSwKKwkJCSAgICAgICB1bnNpZ25lZCB2b2xuYW1lc3osCisJCQkgICAgICAgc3RydWN0IGFmc19jYWNoZV92bG9jYXRpb24gKmVudHJ5KQoreworCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7CisKKwlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubjsKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKKwlzdHJ1Y3Qga3ZlYyBwaW92WzNdOworCXVuc2lnbmVkIHRtcDsKKwlzaXplX3Qgc2VudDsKKwlpbnQgcmV0LCBsb29wOworCV9fYmUzMiAqYnAsIHBhcmFtWzJdLCB6ZXJvOworCisJX2VudGVyKCIsJSouKnMsJXUsIiwgdm9sbmFtZXN6LCB2b2xuYW1lc3osIHZvbG5hbWUsIHZvbG5hbWVzeik7CisKKwltZW1zZXQoZW50cnksIDAsIHNpemVvZigqZW50cnkpKTsKKworCS8qIGdldCBob2xkIG9mIHRoZSB2bHNlcnZlciBjb25uZWN0aW9uICovCisJcmV0ID0gYWZzX3NlcnZlcl9nZXRfdmxjb25uKHNlcnZlciwgJmNvbm4pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIGNyZWF0ZSBhIGNhbGwgdGhyb3VnaCB0aGF0IGNvbm5lY3Rpb24gKi8KKwlyZXQgPSByeHJwY19jcmVhdGVfY2FsbChjb25uLCBOVUxMLCBOVUxMLCBhZnNfcnh2bF9hZW1hcCwgJmNhbGwpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50aygia0FGUzogVW5hYmxlIHRvIGNyZWF0ZSBjYWxsOiAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXRfcHV0X2Nvbm47CisJfQorCWNhbGwtPmFwcF9vcGNvZGUgPSBWTEdFVEVOVFJZQllOQU1FOworCisJLyogd2Ugd2FudCB0byBnZXQgZXZlbnQgbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBjYWxsICovCisJYWRkX3dhaXRfcXVldWUoJmNhbGwtPndhaXRxLCAmbXlzZWxmKTsKKworCS8qIG1hcnNoYWxsIHRoZSBwYXJhbWV0ZXJzICovCisJcGlvdlsxXS5pb3ZfbGVuID0gdm9sbmFtZXN6OworCXBpb3ZbMV0uaW92X2Jhc2UgPSAoY2hhciAqKSB2b2xuYW1lOworCisJemVybyA9IDA7CisJcGlvdlsyXS5pb3ZfbGVuID0gKDQgLSAocGlvdlsxXS5pb3ZfbGVuICYgMykpICYgMzsKKwlwaW92WzJdLmlvdl9iYXNlID0gJnplcm87CisKKwlwYXJhbVswXSA9IGh0b25sKFZMR0VURU5UUllCWU5BTUUpOworCXBhcmFtWzFdID0gaHRvbmwocGlvdlsxXS5pb3ZfbGVuKTsKKworCXBpb3ZbMF0uaW92X2xlbiA9IHNpemVvZihwYXJhbSk7CisJcGlvdlswXS5pb3ZfYmFzZSA9IHBhcmFtOworCisJLyogc2VuZCB0aGUgcGFyYW1ldGVycyB0byB0aGUgc2VydmVyICovCisJcmV0ID0gcnhycGNfY2FsbF93cml0ZV9kYXRhKGNhbGwsIDMsIHBpb3YsIFJYUlBDX0xBU1RfUEFDS0VULCBHRlBfTk9GUywKKwkJCQkgICAgMCwgJnNlbnQpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGFib3J0OworCisJLyogd2FpdCBmb3IgdGhlIHJlcGx5IHRvIGNvbXBsZXRlbHkgYXJyaXZlICovCisJYnAgPSByeHJwY19jYWxsX2FsbG9jX3NjcmF0Y2goY2FsbCwgMzg0KTsKKworCXJldCA9IHJ4cnBjX2NhbGxfcmVhZF9kYXRhKGNhbGwsIGJwLCAzODQsCisJCQkJICAgUlhSUENfQ0FMTF9SRUFEX0JMT0NLIHwKKwkJCQkgICBSWFJQQ19DQUxMX1JFQURfQUxMKTsKKwlpZiAocmV0IDwgMCkgeworCQlpZiAocmV0ID09IC1FQ09OTkFCT1JURUQpIHsKKwkJCXJldCA9IGNhbGwtPmFwcF9lcnJubzsKKwkJCWdvdG8gb3V0X3Vud2FpdDsKKwkJfQorCQlnb3RvIGFib3J0OworCX0KKworCS8qIHVubWFyc2hhbGwgdGhlIHJlcGx5ICovCisJZm9yIChsb29wID0gMDsgbG9vcCA8IDY0OyBsb29wKyspCisJCWVudHJ5LT5uYW1lW2xvb3BdID0gbnRvaGwoKmJwKyspOworCWJwKys7IC8qIGZpbmFsIE5VTCAqLworCisJYnArKzsgLyogdHlwZSAqLworCWVudHJ5LT5uc2VydmVycyA9IG50b2hsKCpicCsrKTsKKworCWZvciAobG9vcCA9IDA7IGxvb3AgPCA4OyBsb29wKyspCisJCWVudHJ5LT5zZXJ2ZXJzW2xvb3BdLnNfYWRkciA9ICpicCsrOworCisJYnAgKz0gODsgLyogcGFydGl0aW9uIElEcyAqLworCisJZm9yIChsb29wID0gMDsgbG9vcCA8IDg7IGxvb3ArKykgeworCQl0bXAgPSBudG9obCgqYnArKyk7CisJCWlmICh0bXAgJiBBRlNfVkxTRl9SV1ZPTCkKKwkJCWVudHJ5LT5zcnZ0bWFza1tsb29wXSB8PSBBRlNfVk9MX1ZUTV9SVzsKKwkJaWYgKHRtcCAmIEFGU19WTFNGX1JPVk9MKQorCQkJZW50cnktPnNydnRtYXNrW2xvb3BdIHw9IEFGU19WT0xfVlRNX1JPOworCQlpZiAodG1wICYgQUZTX1ZMU0ZfQkFDS1ZPTCkKKwkJCWVudHJ5LT5zcnZ0bWFza1tsb29wXSB8PSBBRlNfVk9MX1ZUTV9CQUs7CisJfQorCisJZW50cnktPnZpZFswXSA9IG50b2hsKCpicCsrKTsKKwllbnRyeS0+dmlkWzFdID0gbnRvaGwoKmJwKyspOworCWVudHJ5LT52aWRbMl0gPSBudG9obCgqYnArKyk7CisKKwlicCsrOyAvKiBjbG9uZSBJRCAqLworCisJdG1wID0gbnRvaGwoKmJwKyspOyAvKiBmbGFncyAqLworCWlmICh0bXAgJiBBRlNfVkxGX1JXRVhJU1RTKQorCQllbnRyeS0+dmlkbWFzayB8PSBBRlNfVk9MX1ZUTV9SVzsKKwlpZiAodG1wICYgQUZTX1ZMRl9ST0VYSVNUUykKKwkJZW50cnktPnZpZG1hc2sgfD0gQUZTX1ZPTF9WVE1fUk87CisJaWYgKHRtcCAmIEFGU19WTEZfQkFDS0VYSVNUUykKKwkJZW50cnktPnZpZG1hc2sgfD0gQUZTX1ZPTF9WVE1fQkFLOworCisJcmV0ID0gLUVOT01FRElVTTsKKwlpZiAoIWVudHJ5LT52aWRtYXNrKQorCQlnb3RvIGFib3J0OworCisJLyogc3VjY2VzcyAqLworCWVudHJ5LT5ydGltZSA9IGdldF9zZWNvbmRzKCk7CisJcmV0ID0gMDsKKworIG91dF91bndhaXQ6CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmY2FsbC0+d2FpdHEsICZteXNlbGYpOworCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOworIG91dF9wdXRfY29ubjoKKwlyeHJwY19wdXRfY29ubmVjdGlvbihjb25uKTsKKyBvdXQ6CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKKworIGFib3J0OgorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwlyeHJwY19jYWxsX2Fib3J0KGNhbGwsIHJldCk7CisJc2NoZWR1bGUoKTsKKwlnb3RvIG91dF91bndhaXQ7Cit9IC8qIGVuZCBhZnNfcnh2bF9nZXRfZW50cnlfYnlfbmFtZSgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBsb29rIHVwIGEgdm9sdW1lIGxvY2F0aW9uIGRhdGFiYXNlIGVudHJ5IGJ5IElECisgKi8KK2ludCBhZnNfcnh2bF9nZXRfZW50cnlfYnlfaWQoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKKwkJCSAgICAgYWZzX3ZvbGlkX3Qgdm9saWQsCisJCQkgICAgIGFmc192b2x0eXBlX3Qgdm9sdHlwZSwKKwkJCSAgICAgc3RydWN0IGFmc19jYWNoZV92bG9jYXRpb24gKmVudHJ5KQoreworCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7CisKKwlzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqY29ubjsKKwlzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbDsKKwlzdHJ1Y3Qga3ZlYyBwaW92WzFdOworCXVuc2lnbmVkIHRtcDsKKwlzaXplX3Qgc2VudDsKKwlpbnQgcmV0LCBsb29wOworCV9fYmUzMiAqYnAsIHBhcmFtWzNdOworCisJX2VudGVyKCIsJXgsJWQsIiwgdm9saWQsIHZvbHR5cGUpOworCisJbWVtc2V0KGVudHJ5LCAwLCBzaXplb2YoKmVudHJ5KSk7CisKKwkvKiBnZXQgaG9sZCBvZiB0aGUgdmxzZXJ2ZXIgY29ubmVjdGlvbiAqLworCXJldCA9IGFmc19zZXJ2ZXJfZ2V0X3ZsY29ubihzZXJ2ZXIsICZjb25uKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKiBjcmVhdGUgYSBjYWxsIHRocm91Z2ggdGhhdCBjb25uZWN0aW9uICovCisJcmV0ID0gcnhycGNfY3JlYXRlX2NhbGwoY29ubiwgTlVMTCwgTlVMTCwgYWZzX3J4dmxfYWVtYXAsICZjYWxsKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoImtBRlM6IFVuYWJsZSB0byBjcmVhdGUgY2FsbDogJWRcbiIsIHJldCk7CisJCWdvdG8gb3V0X3B1dF9jb25uOworCX0KKwljYWxsLT5hcHBfb3Bjb2RlID0gVkxHRVRFTlRSWUJZSUQ7CisKKwkvKiB3ZSB3YW50IHRvIGdldCBldmVudCBub3RpZmljYXRpb25zIGZyb20gdGhlIGNhbGwgKi8KKwlhZGRfd2FpdF9xdWV1ZSgmY2FsbC0+d2FpdHEsICZteXNlbGYpOworCisJLyogbWFyc2hhbGwgdGhlIHBhcmFtZXRlcnMgKi8KKwlwYXJhbVswXSA9IGh0b25sKFZMR0VURU5UUllCWUlEKTsKKwlwYXJhbVsxXSA9IGh0b25sKHZvbGlkKTsKKwlwYXJhbVsyXSA9IGh0b25sKHZvbHR5cGUpOworCisJcGlvdlswXS5pb3ZfbGVuID0gc2l6ZW9mKHBhcmFtKTsKKwlwaW92WzBdLmlvdl9iYXNlID0gcGFyYW07CisKKwkvKiBzZW5kIHRoZSBwYXJhbWV0ZXJzIHRvIHRoZSBzZXJ2ZXIgKi8KKwlyZXQgPSByeHJwY19jYWxsX3dyaXRlX2RhdGEoY2FsbCwgMSwgcGlvdiwgUlhSUENfTEFTVF9QQUNLRVQsIEdGUF9OT0ZTLAorCQkJCSAgICAwLCAmc2VudCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gYWJvcnQ7CisKKwkvKiB3YWl0IGZvciB0aGUgcmVwbHkgdG8gY29tcGxldGVseSBhcnJpdmUgKi8KKwlicCA9IHJ4cnBjX2NhbGxfYWxsb2Nfc2NyYXRjaChjYWxsLCAzODQpOworCisJcmV0ID0gcnhycGNfY2FsbF9yZWFkX2RhdGEoY2FsbCwgYnAsIDM4NCwKKwkJCQkgICBSWFJQQ19DQUxMX1JFQURfQkxPQ0sgfAorCQkJCSAgIFJYUlBDX0NBTExfUkVBRF9BTEwpOworCWlmIChyZXQgPCAwKSB7CisJCWlmIChyZXQgPT0gLUVDT05OQUJPUlRFRCkgeworCQkJcmV0ID0gY2FsbC0+YXBwX2Vycm5vOworCQkJZ290byBvdXRfdW53YWl0OworCQl9CisJCWdvdG8gYWJvcnQ7CisJfQorCisJLyogdW5tYXJzaGFsbCB0aGUgcmVwbHkgKi8KKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgNjQ7IGxvb3ArKykKKwkJZW50cnktPm5hbWVbbG9vcF0gPSBudG9obCgqYnArKyk7CisJYnArKzsgLyogZmluYWwgTlVMICovCisKKwlicCsrOyAvKiB0eXBlICovCisJZW50cnktPm5zZXJ2ZXJzID0gbnRvaGwoKmJwKyspOworCisJZm9yIChsb29wID0gMDsgbG9vcCA8IDg7IGxvb3ArKykKKwkJZW50cnktPnNlcnZlcnNbbG9vcF0uc19hZGRyID0gKmJwKys7CisKKwlicCArPSA4OyAvKiBwYXJ0aXRpb24gSURzICovCisKKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgODsgbG9vcCsrKSB7CisJCXRtcCA9IG50b2hsKCpicCsrKTsKKwkJaWYgKHRtcCAmIEFGU19WTFNGX1JXVk9MKQorCQkJZW50cnktPnNydnRtYXNrW2xvb3BdIHw9IEFGU19WT0xfVlRNX1JXOworCQlpZiAodG1wICYgQUZTX1ZMU0ZfUk9WT0wpCisJCQllbnRyeS0+c3J2dG1hc2tbbG9vcF0gfD0gQUZTX1ZPTF9WVE1fUk87CisJCWlmICh0bXAgJiBBRlNfVkxTRl9CQUNLVk9MKQorCQkJZW50cnktPnNydnRtYXNrW2xvb3BdIHw9IEFGU19WT0xfVlRNX0JBSzsKKwl9CisKKwllbnRyeS0+dmlkWzBdID0gbnRvaGwoKmJwKyspOworCWVudHJ5LT52aWRbMV0gPSBudG9obCgqYnArKyk7CisJZW50cnktPnZpZFsyXSA9IG50b2hsKCpicCsrKTsKKworCWJwKys7IC8qIGNsb25lIElEICovCisKKwl0bXAgPSBudG9obCgqYnArKyk7IC8qIGZsYWdzICovCisJaWYgKHRtcCAmIEFGU19WTEZfUldFWElTVFMpCisJCWVudHJ5LT52aWRtYXNrIHw9IEFGU19WT0xfVlRNX1JXOworCWlmICh0bXAgJiBBRlNfVkxGX1JPRVhJU1RTKQorCQllbnRyeS0+dmlkbWFzayB8PSBBRlNfVk9MX1ZUTV9STzsKKwlpZiAodG1wICYgQUZTX1ZMRl9CQUNLRVhJU1RTKQorCQllbnRyeS0+dmlkbWFzayB8PSBBRlNfVk9MX1ZUTV9CQUs7CisKKwlyZXQgPSAtRU5PTUVESVVNOworCWlmICghZW50cnktPnZpZG1hc2spCisJCWdvdG8gYWJvcnQ7CisKKyNpZiAwIC8qIFRPRE86IHJlbW92ZSAqLworCWVudHJ5LT5uc2VydmVycyA9IDM7CisJZW50cnktPnNlcnZlcnNbMF0uc19hZGRyID0gaHRvbmwoMHhhYzEwMTI0OSk7CisJZW50cnktPnNlcnZlcnNbMV0uc19hZGRyID0gaHRvbmwoMHhhYzEwMTI0Myk7CisJZW50cnktPnNlcnZlcnNbMl0uc19hZGRyID0gaHRvbmwoMHhhYzEwMTI1YiAvKjB4YWMxMDEyNWIqLyk7CisKKwllbnRyeS0+c3J2dG1hc2tbMF0gPSBBRlNfVk9MX1ZUTV9STzsKKwllbnRyeS0+c3J2dG1hc2tbMV0gPSBBRlNfVk9MX1ZUTV9STzsKKwllbnRyeS0+c3J2dG1hc2tbMl0gPSBBRlNfVk9MX1ZUTV9STyB8IEFGU19WT0xfVlRNX1JXOworI2VuZGlmCisKKwkvKiBzdWNjZXNzICovCisJZW50cnktPnJ0aW1lID0gZ2V0X3NlY29uZHMoKTsKKwlyZXQgPSAwOworCisgb3V0X3Vud2FpdDoKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZjYWxsLT53YWl0cSwgJm15c2VsZik7CisJcnhycGNfcHV0X2NhbGwoY2FsbCk7Cisgb3V0X3B1dF9jb25uOgorCXJ4cnBjX3B1dF9jb25uZWN0aW9uKGNvbm4pOworIG91dDoKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworCisgYWJvcnQ6CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwgcmV0KTsKKwlzY2hlZHVsZSgpOworCWdvdG8gb3V0X3Vud2FpdDsKK30gLyogZW5kIGFmc19yeHZsX2dldF9lbnRyeV9ieV9pZCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBsb29rIHVwIGEgdm9sdW1lIGxvY2F0aW9uIGRhdGFiYXNlIGVudHJ5IGJ5IElEIGFzeW5jaHJvbm91c2x5CisgKi8KK2ludCBhZnNfcnh2bF9nZXRfZW50cnlfYnlfaWRfYXN5bmMoc3RydWN0IGFmc19hc3luY19vcCAqb3AsCisJCQkJICAgYWZzX3ZvbGlkX3Qgdm9saWQsCisJCQkJICAgYWZzX3ZvbHR5cGVfdCB2b2x0eXBlKQoreworCXN0cnVjdCByeHJwY19jb25uZWN0aW9uICpjb25uOworCXN0cnVjdCByeHJwY19jYWxsICpjYWxsOworCXN0cnVjdCBrdmVjIHBpb3ZbMV07CisJc2l6ZV90IHNlbnQ7CisJaW50IHJldDsKKwlfX2JlMzIgcGFyYW1bM107CisKKwlfZW50ZXIoIiwleCwlZCwiLCB2b2xpZCwgdm9sdHlwZSk7CisKKwkvKiBnZXQgaG9sZCBvZiB0aGUgdmxzZXJ2ZXIgY29ubmVjdGlvbiAqLworCXJldCA9IGFmc19zZXJ2ZXJfZ2V0X3ZsY29ubihvcC0+c2VydmVyLCAmY29ubik7CisJaWYgKHJldCA8IDApIHsKKwkJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogY3JlYXRlIGEgY2FsbCB0aHJvdWdoIHRoYXQgY29ubmVjdGlvbiAqLworCXJldCA9IHJ4cnBjX2NyZWF0ZV9jYWxsKGNvbm4sCisJCQkJYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X2lkX2F0dG4sCisJCQkJYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X2lkX2Vycm9yLAorCQkJCWFmc19yeHZsX2FlbWFwLAorCQkJCSZvcC0+Y2FsbCk7CisJcnhycGNfcHV0X2Nvbm5lY3Rpb24oY29ubik7CisKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoImtBRlM6IFVuYWJsZSB0byBjcmVhdGUgY2FsbDogJWRcbiIsIHJldCk7CisJCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCW9wLT5jYWxsLT5hcHBfb3Bjb2RlID0gVkxHRVRFTlRSWUJZSUQ7CisJb3AtPmNhbGwtPmFwcF91c2VyID0gb3A7CisKKwljYWxsID0gb3AtPmNhbGw7CisJcnhycGNfZ2V0X2NhbGwoY2FsbCk7CisKKwkvKiBzZW5kIGV2ZW50IG5vdGlmaWNhdGlvbnMgZnJvbSB0aGUgY2FsbCB0byBrYWZzYXN5bmNkICovCisJYWZzX2thZnNhc3luY2RfYmVnaW5fb3Aob3ApOworCisJLyogbWFyc2hhbGwgdGhlIHBhcmFtZXRlcnMgKi8KKwlwYXJhbVswXSA9IGh0b25sKFZMR0VURU5UUllCWUlEKTsKKwlwYXJhbVsxXSA9IGh0b25sKHZvbGlkKTsKKwlwYXJhbVsyXSA9IGh0b25sKHZvbHR5cGUpOworCisJcGlvdlswXS5pb3ZfbGVuID0gc2l6ZW9mKHBhcmFtKTsKKwlwaW92WzBdLmlvdl9iYXNlID0gcGFyYW07CisKKwkvKiBhbGxvY2F0ZSByZXN1bHQgcmVhZCBidWZmZXIgaW4gc2NyYXRjaCBzcGFjZSAqLworCWNhbGwtPmFwcF9zY3JfcHRyID0gcnhycGNfY2FsbF9hbGxvY19zY3JhdGNoKG9wLT5jYWxsLCAzODQpOworCisJLyogc2VuZCB0aGUgcGFyYW1ldGVycyB0byB0aGUgc2VydmVyICovCisJcmV0ID0gcnhycGNfY2FsbF93cml0ZV9kYXRhKGNhbGwsIDEsIHBpb3YsIFJYUlBDX0xBU1RfUEFDS0VULCBHRlBfTk9GUywKKwkJCQkgICAgMCwgJnNlbnQpOworCWlmIChyZXQgPCAwKSB7CisJCXJ4cnBjX2NhbGxfYWJvcnQoY2FsbCwgcmV0KTsgLyogaGFuZGxlIGZyb20ga2Fmc2FzeW5jZCAqLworCQlyZXQgPSAwOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiB3YWl0IGZvciB0aGUgcmVwbHkgdG8gY29tcGxldGVseSBhcnJpdmUgKi8KKwlyZXQgPSByeHJwY19jYWxsX3JlYWRfZGF0YShjYWxsLCBjYWxsLT5hcHBfc2NyX3B0ciwgMzg0LCAwKTsKKwlzd2l0Y2ggKHJldCkgeworCWNhc2UgMDoKKwljYXNlIC1FQUdBSU46CisJY2FzZSAtRUNPTk5BQk9SVEVEOgorCQlyZXQgPSAwOworCQlicmVhazsJLyogYWxsIGhhbmRsZWQgYnkga2Fmc2FzeW5jZCAqLworCisJZGVmYXVsdDoKKwkJcnhycGNfY2FsbF9hYm9ydChjYWxsLCByZXQpOyAvKiBtYWtlIGthZnNhc3luY2QgaGFuZGxlIGl0ICovCisJCXJldCA9IDA7CisJCWJyZWFrOworCX0KKworIG91dDoKKwlyeHJwY19wdXRfY2FsbChjYWxsKTsKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworCit9IC8qIGVuZCBhZnNfcnh2bF9nZXRfZW50cnlfYnlfaWRfYXN5bmMoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogYXR0ZW5kIHRvIHRoZSBhc3luY2hyb25vdXMgZ2V0IFZMREIgZW50cnkgYnkgSUQKKyAqLworaW50IGFmc19yeHZsX2dldF9lbnRyeV9ieV9pZF9hc3luYzIoc3RydWN0IGFmc19hc3luY19vcCAqb3AsCisJCQkJICAgIHN0cnVjdCBhZnNfY2FjaGVfdmxvY2F0aW9uICplbnRyeSkKK3sKKwlfX2JlMzIgKmJwOworCV9fdTMyIHRtcDsKKwlpbnQgbG9vcCwgcmV0OworCisJX2VudGVyKCJ7b3A9JXAgY3N0PSV1fSIsIG9wLCBvcC0+Y2FsbC0+YXBwX2NhbGxfc3RhdGUpOworCisJbWVtc2V0KGVudHJ5LCAwLCBzaXplb2YoKmVudHJ5KSk7CisKKwlpZiAob3AtPmNhbGwtPmFwcF9jYWxsX3N0YXRlID09IFJYUlBDX0NTVEFURV9DT01QTEVURSkgeworCQkvKiBvcGVyYXRpb24gZmluaXNoZWQgKi8KKwkJYWZzX2thZnNhc3luY2RfdGVybWluYXRlX29wKG9wKTsKKworCQlicCA9IG9wLT5jYWxsLT5hcHBfc2NyX3B0cjsKKworCQkvKiB1bm1hcnNoYWxsIHRoZSByZXBseSAqLworCQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgNjQ7IGxvb3ArKykKKwkJCWVudHJ5LT5uYW1lW2xvb3BdID0gbnRvaGwoKmJwKyspOworCQlicCsrOyAvKiBmaW5hbCBOVUwgKi8KKworCQlicCsrOyAvKiB0eXBlICovCisJCWVudHJ5LT5uc2VydmVycyA9IG50b2hsKCpicCsrKTsKKworCQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgODsgbG9vcCsrKQorCQkJZW50cnktPnNlcnZlcnNbbG9vcF0uc19hZGRyID0gKmJwKys7CisKKwkJYnAgKz0gODsgLyogcGFydGl0aW9uIElEcyAqLworCisJCWZvciAobG9vcCA9IDA7IGxvb3AgPCA4OyBsb29wKyspIHsKKwkJCXRtcCA9IG50b2hsKCpicCsrKTsKKwkJCWlmICh0bXAgJiBBRlNfVkxTRl9SV1ZPTCkKKwkJCQllbnRyeS0+c3J2dG1hc2tbbG9vcF0gfD0gQUZTX1ZPTF9WVE1fUlc7CisJCQlpZiAodG1wICYgQUZTX1ZMU0ZfUk9WT0wpCisJCQkJZW50cnktPnNydnRtYXNrW2xvb3BdIHw9IEFGU19WT0xfVlRNX1JPOworCQkJaWYgKHRtcCAmIEFGU19WTFNGX0JBQ0tWT0wpCisJCQkJZW50cnktPnNydnRtYXNrW2xvb3BdIHw9IEFGU19WT0xfVlRNX0JBSzsKKwkJfQorCisJCWVudHJ5LT52aWRbMF0gPSBudG9obCgqYnArKyk7CisJCWVudHJ5LT52aWRbMV0gPSBudG9obCgqYnArKyk7CisJCWVudHJ5LT52aWRbMl0gPSBudG9obCgqYnArKyk7CisKKwkJYnArKzsgLyogY2xvbmUgSUQgKi8KKworCQl0bXAgPSBudG9obCgqYnArKyk7IC8qIGZsYWdzICovCisJCWlmICh0bXAgJiBBRlNfVkxGX1JXRVhJU1RTKQorCQkJZW50cnktPnZpZG1hc2sgfD0gQUZTX1ZPTF9WVE1fUlc7CisJCWlmICh0bXAgJiBBRlNfVkxGX1JPRVhJU1RTKQorCQkJZW50cnktPnZpZG1hc2sgfD0gQUZTX1ZPTF9WVE1fUk87CisJCWlmICh0bXAgJiBBRlNfVkxGX0JBQ0tFWElTVFMpCisJCQllbnRyeS0+dmlkbWFzayB8PSBBRlNfVk9MX1ZUTV9CQUs7CisKKwkJcmV0ID0gLUVOT01FRElVTTsKKwkJaWYgKCFlbnRyeS0+dmlkbWFzaykgeworCQkJcnhycGNfY2FsbF9hYm9ydChvcC0+Y2FsbCwgcmV0KTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisjaWYgMCAvKiBUT0RPOiByZW1vdmUgKi8KKwkJZW50cnktPm5zZXJ2ZXJzID0gMzsKKwkJZW50cnktPnNlcnZlcnNbMF0uc19hZGRyID0gaHRvbmwoMHhhYzEwMTI0OSk7CisJCWVudHJ5LT5zZXJ2ZXJzWzFdLnNfYWRkciA9IGh0b25sKDB4YWMxMDEyNDMpOworCQllbnRyeS0+c2VydmVyc1syXS5zX2FkZHIgPSBodG9ubCgweGFjMTAxMjViIC8qMHhhYzEwMTI1YiovKTsKKworCQllbnRyeS0+c3J2dG1hc2tbMF0gPSBBRlNfVk9MX1ZUTV9STzsKKwkJZW50cnktPnNydnRtYXNrWzFdID0gQUZTX1ZPTF9WVE1fUk87CisJCWVudHJ5LT5zcnZ0bWFza1syXSA9IEFGU19WT0xfVlRNX1JPIHwgQUZTX1ZPTF9WVE1fUlc7CisjZW5kaWYKKworCQkvKiBzdWNjZXNzICovCisJCWVudHJ5LT5ydGltZSA9IGdldF9zZWNvbmRzKCk7CisJCXJldCA9IDA7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAob3AtPmNhbGwtPmFwcF9jYWxsX3N0YXRlID09IFJYUlBDX0NTVEFURV9FUlJPUikgeworCQkvKiBvcGVyYXRpb24gZXJyb3IgKi8KKwkJcmV0ID0gb3AtPmNhbGwtPmFwcF9lcnJubzsKKwkJZ290byBkb25lOworCX0KKworCV9sZWF2ZSgiID0gLUVBR0FJTiIpOworCXJldHVybiAtRUFHQUlOOworCisgZG9uZToKKwlyeHJwY19wdXRfY2FsbChvcC0+Y2FsbCk7CisJb3AtPmNhbGwgPSBOVUxMOworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9IC8qIGVuZCBhZnNfcnh2bF9nZXRfZW50cnlfYnlfaWRfYXN5bmMyKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGhhbmRsZSBhdHRlbnRpb24gZXZlbnRzIG9uIGFuIGFzeW5jIGdldC1lbnRyeS1ieS1JRCBvcAorICogLSBjYWxsZWQgZnJvbSBrcnhpb2QKKyAqLworc3RhdGljIHZvaWQgYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X2lkX2F0dG4oc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwpCit7CisJc3RydWN0IGFmc19hc3luY19vcCAqb3AgPSBjYWxsLT5hcHBfdXNlcjsKKworCV9lbnRlcigie29wPSVwIGNzdD0ldX0iLCBvcCwgY2FsbC0+YXBwX2NhbGxfc3RhdGUpOworCisJc3dpdGNoIChjYWxsLT5hcHBfY2FsbF9zdGF0ZSkgeworCWNhc2UgUlhSUENfQ1NUQVRFX0NPTVBMRVRFOgorCQlhZnNfa2Fmc2FzeW5jZF9hdHRlbmRfb3Aob3ApOworCQlicmVhazsKKwljYXNlIFJYUlBDX0NTVEFURV9DTE5UX1JDVl9SRVBMWToKKwkJaWYgKGNhbGwtPmFwcF9hc3luY19yZWFkKQorCQkJYnJlYWs7CisJY2FzZSBSWFJQQ19DU1RBVEVfQ0xOVF9HT1RfUkVQTFk6CisJCWlmIChjYWxsLT5hcHBfcmVhZF9jb3VudCA9PSAwKQorCQkJYnJlYWs7CisJCXByaW50aygia0FGUzogUmVwbHkgYmlnZ2VyIHRoYW4gZXhwZWN0ZWQiCisJCSAgICAgICAiIHtjc3Q9JXUgYXN5bj0lZCBtYXJrPSVadSByZHk9JVp1IHByPSV1JXN9IiwKKwkJICAgICAgIGNhbGwtPmFwcF9jYWxsX3N0YXRlLAorCQkgICAgICAgY2FsbC0+YXBwX2FzeW5jX3JlYWQsCisJCSAgICAgICBjYWxsLT5hcHBfbWFyaywKKwkJICAgICAgIGNhbGwtPmFwcF9yZWFkeV9xdHksCisJCSAgICAgICBjYWxsLT5wa3RfcmN2X2NvdW50LAorCQkgICAgICAgY2FsbC0+YXBwX2xhc3RfcmN2ID8gIiBsYXN0IiA6ICIiKTsKKworCQlyeHJwY19jYWxsX2Fib3J0KGNhbGwsIC1FQkFETVNHKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCisJX2xlYXZlKCIiKTsKKworfSAvKiBlbmQgYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X2lkX2F0dG4oKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogaGFuZGxlIGVycm9yIGV2ZW50cyBvbiBhbiBhc3luYyBnZXQtZW50cnktYnktSUQgb3AKKyAqIC0gY2FsbGVkIGZyb20ga3J4aW9kCisgKi8KK3N0YXRpYyB2b2lkIGFmc19yeHZsX2dldF9lbnRyeV9ieV9pZF9lcnJvcihzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCkKK3sKKwlzdHJ1Y3QgYWZzX2FzeW5jX29wICpvcCA9IGNhbGwtPmFwcF91c2VyOworCisJX2VudGVyKCJ7b3A9JXAgY3N0PSV1fSIsIG9wLCBjYWxsLT5hcHBfY2FsbF9zdGF0ZSk7CisKKwlhZnNfa2Fmc2FzeW5jZF9hdHRlbmRfb3Aob3ApOworCisJX2xlYXZlKCIiKTsKKworfSAvKiBlbmQgYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X2lkX2Vycm9yKCkgKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy92bGNsaWVudC5oIGIvZnMvYWZzL3ZsY2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNkNjAxMQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Fmcy92bGNsaWVudC5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qIHZsY2xpZW50Lmg6IFZvbHVtZSBMb2NhdGlvbiBTZXJ2aWNlIGNsaWVudCBpbnRlcmZhY2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBfTElOVVhfQUZTX1ZMQ0xJRU5UX0gKKyNkZWZpbmUgX0xJTlVYX0FGU19WTENMSUVOVF9ICisKKyNpbmNsdWRlICJ0eXBlcy5oIgorCitlbnVtIEFGU1ZMX0Vycm9ycyB7CisJQUZTVkxfSURFWElTVCAJCT0gMzYzNTIwLAkvKiBWb2x1bWUgSWQgZW50cnkgZXhpc3RzIGluIHZsIGRhdGFiYXNlICovCisJQUZTVkxfSU8gCQk9IDM2MzUyMSwJLyogSS9PIHJlbGF0ZWQgZXJyb3IgKi8KKwlBRlNWTF9OQU1FRVhJU1QgCT0gMzYzNTIyLAkvKiBWb2x1bWUgbmFtZSBlbnRyeSBleGlzdHMgaW4gdmwgZGF0YWJhc2UgKi8KKwlBRlNWTF9DUkVBVEVGQUlMIAk9IDM2MzUyMywJLyogSW50ZXJuYWwgY3JlYXRpb24gZmFpbHVyZSAqLworCUFGU1ZMX05PRU5UIAkJPSAzNjM1MjQsCS8qIE5vIHN1Y2ggZW50cnkgKi8KKwlBRlNWTF9FTVBUWSAJCT0gMzYzNTI1LAkvKiBWbCBkYXRhYmFzZSBpcyBlbXB0eSAqLworCUFGU1ZMX0VOVERFTEVURUQgCT0gMzYzNTI2LAkvKiBFbnRyeSBpcyBkZWxldGVkIChzb2Z0IGRlbGV0ZSkgKi8KKwlBRlNWTF9CQUROQU1FIAkJPSAzNjM1MjcsCS8qIFZvbHVtZSBuYW1lIGlzIGlsbGVnYWwgKi8KKwlBRlNWTF9CQURJTkRFWCAJCT0gMzYzNTI4LAkvKiBJbmRleCBpcyBvdXQgb2YgcmFuZ2UgKi8KKwlBRlNWTF9CQURWT0xUWVBFIAk9IDM2MzUyOSwJLyogQmFkIHZvbHVtZSB0eXBlICovCisJQUZTVkxfQkFEU0VSVkVSIAk9IDM2MzUzMCwJLyogSWxsZWdhbCBzZXJ2ZXIgbnVtYmVyIChvdXQgb2YgcmFuZ2UpICovCisJQUZTVkxfQkFEUEFSVElUSU9OIAk9IDM2MzUzMSwJLyogQmFkIHBhcnRpdGlvbiBudW1iZXIgKi8KKwlBRlNWTF9SRVBTRlVMTCAJCT0gMzYzNTMyLAkvKiBSdW4gb3V0IG9mIHNwYWNlIGZvciBSZXBsaWNhdGlvbiBzaXRlcyAqLworCUFGU1ZMX05PUkVQU0VSVkVSIAk9IDM2MzUzMywJLyogTm8gc3VjaCBSZXBsaWNhdGlvbiBzZXJ2ZXIgc2l0ZSBleGlzdHMgKi8KKwlBRlNWTF9EVVBSRVBTRVJWRVIgCT0gMzYzNTM0LAkvKiBSZXBsaWNhdGlvbiBzaXRlIGFscmVhZHkgZXhpc3RzICovCisJQUZTVkxfUldOT1RGT1VORCAJPSAzNjM1MzUsCS8qIFBhcmVudCBSL1cgZW50cnkgbm90IGZvdW5kICovCisJQUZTVkxfQkFEUkVGQ09VTlQgCT0gMzYzNTM2LAkvKiBJbGxlZ2FsIFJlZmVyZW5jZSBDb3VudCBudW1iZXIgKi8KKwlBRlNWTF9TSVpFRVhDRUVERUQgCT0gMzYzNTM3LAkvKiBWbCBzaXplIGZvciBhdHRyaWJ1dGVzIGV4Y2VlZGVkICovCisJQUZTVkxfQkFERU5UUlkgCQk9IDM2MzUzOCwJLyogQmFkIGluY29taW5nIHZsIGVudHJ5ICovCisJQUZTVkxfQkFEVk9MSURCVU1QIAk9IDM2MzUzOSwJLyogSWxsZWdhbCBtYXggdm9saWQgaW5jcmVtZW50ICovCisJQUZTVkxfSURBTFJFQURZSEFTSEVEIAk9IDM2MzU0MCwJLyogUk8vQkFDSyBpZCBhbHJlYWR5IGhhc2hlZCAqLworCUFGU1ZMX0VOVFJZTE9DS0VEIAk9IDM2MzU0MSwJLyogVmwgZW50cnkgaXMgYWxyZWFkeSBsb2NrZWQgKi8KKwlBRlNWTF9CQURWT0xPUEVSIAk9IDM2MzU0MiwJLyogQmFkIHZvbHVtZSBvcGVyYXRpb24gY29kZSAqLworCUFGU1ZMX0JBRFJFTExPQ0tUWVBFIAk9IDM2MzU0MywJLyogQmFkIHJlbGVhc2UgbG9jayB0eXBlICovCisJQUZTVkxfUkVSRUxFQVNFIAk9IDM2MzU0NCwJLyogU3RhdHVzIHJlcG9ydDogbGFzdCByZWxlYXNlIHdhcyBhYm9ydGVkICovCisJQUZTVkxfQkFEU0VSVkVSRkxBRyAJPSAzNjM1NDUsCS8qIEludmFsaWQgcmVwbGljYXRpb24gc2l0ZSBzZXJ2ZXIgsGFnICovCisJQUZTVkxfUEVSTSAJCT0gMzYzNTQ2LAkvKiBObyBwZXJtaXNzaW9uIGFjY2VzcyAqLworCUFGU1ZMX05PTUVNIAkJPSAzNjM1NDcsCS8qIG1hbGxvYy9yZWFsbG9jIGZhaWxlZCB0byBhbGxvYyBlbm91Z2ggbWVtb3J5ICovCit9OworCisvKiBtYXBzIHRvICJzdHJ1Y3QgdmxkYmVudHJ5IiBpbiB2dmwtc3BlYy5wZGYgKi8KK3N0cnVjdCBhZnNfdmxkYmVudHJ5IHsKKwljaGFyCQluYW1lWzY1XTsJCS8qIG5hbWUgb2Ygdm9sdW1lIChpbmNsdWRpbmcgTlVMIGNoYXIpICovCisJYWZzX3ZvbHR5cGVfdAl0eXBlOwkJCS8qIHZvbHVtZSB0eXBlICovCisJdW5zaWduZWQJbnVtX3NlcnZlcnM7CQkvKiBudW0gc2VydmVycyB0aGF0IGhvbGQgaW5zdGFuY2VzIG9mIHRoaXMgdm9sICovCisJdW5zaWduZWQJY2xvbmVfaWQ7CQkvKiBjbG9uaW5nIElEICovCisKKwl1bnNpZ25lZAlmbGFnczsKKyNkZWZpbmUgQUZTX1ZMRl9SV0VYSVNUUwkweDEwMDAJCS8qIFIvVyB2b2x1bWUgZXhpc3RzICovCisjZGVmaW5lIEFGU19WTEZfUk9FWElTVFMJMHgyMDAwCQkvKiBSL08gdm9sdW1lIGV4aXN0cyAqLworI2RlZmluZSBBRlNfVkxGX0JBQ0tFWElTVFMJMHg0MDAwCQkvKiBiYWNrdXAgdm9sdW1lIGV4aXN0cyAqLworCisJYWZzX3ZvbGlkX3QJdm9sdW1lX2lkc1szXTsJCS8qIHZvbHVtZSBJRHMgKi8KKworCXN0cnVjdCB7CisJCXN0cnVjdCBpbl9hZGRyCWFkZHI7CQkvKiBzZXJ2ZXIgYWRkcmVzcyAqLworCQl1bnNpZ25lZAlwYXJ0aXRpb247CS8qIHBhcnRpdGlvbiBJRCBvbiB0aGlzIHNlcnZlciAqLworCQl1bnNpZ25lZAlmbGFnczsJCS8qIHNlcnZlciBzcGVjaWZpYyBmbGFncyAqLworI2RlZmluZSBBRlNfVkxTRl9ORVdSRVBTSVRFCTB4MDAwMQkvKiB1bnVzZWQgKi8KKyNkZWZpbmUgQUZTX1ZMU0ZfUk9WT0wJCTB4MDAwMgkvKiB0aGlzIHNlcnZlciBob2xkcyBhIFIvTyBpbnN0YW5jZSBvZiB0aGUgdm9sdW1lICovCisjZGVmaW5lIEFGU19WTFNGX1JXVk9MCQkweDAwMDQJLyogdGhpcyBzZXJ2ZXIgaG9sZHMgYSBSL1cgaW5zdGFuY2Ugb2YgdGhlIHZvbHVtZSAqLworI2RlZmluZSBBRlNfVkxTRl9CQUNLVk9MCTB4MDAwOAkvKiB0aGlzIHNlcnZlciBob2xkcyBhIGJhY2t1cCBpbnN0YW5jZSBvZiB0aGUgdm9sdW1lICovCisJfSBzZXJ2ZXJzWzhdOworCit9OworCisvKiBsb29rIHVwIGEgdm9sdW1lIGxvY2F0aW9uIGRhdGFiYXNlIGVudHJ5IGJ5IG5hbWUgKi8KK2V4dGVybiBpbnQgYWZzX3J4dmxfZ2V0X2VudHJ5X2J5X25hbWUoc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKKwkJCQkgICAgICBjb25zdCBjaGFyICp2b2xuYW1lLAorCQkJCSAgICAgIHVuc2lnbmVkIHZvbG5hbWVzeiwKKwkJCQkgICAgICBzdHJ1Y3QgYWZzX2NhY2hlX3Zsb2NhdGlvbiAqZW50cnkpOworCisvKiBsb29rIHVwIGEgdm9sdW1lIGxvY2F0aW9uIGRhdGFiYXNlIGVudHJ5IGJ5IElEICovCitleHRlcm4gaW50IGFmc19yeHZsX2dldF9lbnRyeV9ieV9pZChzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAorCQkJCSAgICBhZnNfdm9saWRfdAl2b2xpZCwKKwkJCQkgICAgYWZzX3ZvbHR5cGVfdCB2b2x0eXBlLAorCQkJCSAgICBzdHJ1Y3QgYWZzX2NhY2hlX3Zsb2NhdGlvbiAqZW50cnkpOworCitleHRlcm4gaW50IGFmc19yeHZsX2dldF9lbnRyeV9ieV9pZF9hc3luYyhzdHJ1Y3QgYWZzX2FzeW5jX29wICpvcCwKKwkJCQkJICBhZnNfdm9saWRfdCB2b2xpZCwKKwkJCQkJICBhZnNfdm9sdHlwZV90IHZvbHR5cGUpOworCitleHRlcm4gaW50IGFmc19yeHZsX2dldF9lbnRyeV9ieV9pZF9hc3luYzIoc3RydWN0IGFmc19hc3luY19vcCAqb3AsCisJCQkJCSAgIHN0cnVjdCBhZnNfY2FjaGVfdmxvY2F0aW9uICplbnRyeSk7CisKKyNlbmRpZiAvKiBfTElOVVhfQUZTX1ZMQ0xJRU5UX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2Fmcy92bG9jYXRpb24uYyBiL2ZzL2Fmcy92bG9jYXRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2VkMjA2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvYWZzL3Zsb2NhdGlvbi5jCkBAIC0wLDAgKzEsOTU0IEBACisvKiB2bG9jYXRpb24uYzogdm9sdW1lIGxvY2F0aW9uIG1hbmFnZW1lbnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSAidm9sdW1lLmgiCisjaW5jbHVkZSAiY2VsbC5oIgorI2luY2x1ZGUgImNtc2VydmljZS5oIgorI2luY2x1ZGUgImZzY2xpZW50LmgiCisjaW5jbHVkZSAidmxjbGllbnQuaCIKKyNpbmNsdWRlICJrYWZzdGltb2QuaCIKKyNpbmNsdWRlIDxyeHJwYy9jb25uZWN0aW9uLmg+CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBBRlNfVkxEQl9USU1FT1VUIEhaKjEwMDAKKworc3RhdGljIHZvaWQgYWZzX3Zsb2NhdGlvbl91cGRhdGVfdGltZXIoc3RydWN0IGFmc190aW1lciAqdGltZXIpOworc3RhdGljIHZvaWQgYWZzX3Zsb2NhdGlvbl91cGRhdGVfYXR0ZW5kKHN0cnVjdCBhZnNfYXN5bmNfb3AgKm9wKTsKK3N0YXRpYyB2b2lkIGFmc192bG9jYXRpb25fdXBkYXRlX2Rpc2NhcmQoc3RydWN0IGFmc19hc3luY19vcCAqb3ApOworc3RhdGljIHZvaWQgX19hZnNfcHV0X3Zsb2NhdGlvbihzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmxvY2F0aW9uKTsKKworc3RhdGljIHZvaWQgX19hZnNfdmxvY2F0aW9uX3RpbWVvdXQoc3RydWN0IGFmc190aW1lciAqdGltZXIpCit7CisJc3RydWN0IGFmc192bG9jYXRpb24gKnZsb2NhdGlvbiA9CisJCWxpc3RfZW50cnkodGltZXIsIHN0cnVjdCBhZnNfdmxvY2F0aW9uLCB0aW1lb3V0KTsKKworCV9kZWJ1ZygiVkwgVElNRU9VVCBbJXN7dT0lZH1dIiwKKwkgICAgICAgdmxvY2F0aW9uLT52bGRiLm5hbWUsIGF0b21pY19yZWFkKCZ2bG9jYXRpb24tPnVzYWdlKSk7CisKKwlhZnNfdmxvY2F0aW9uX2RvX3RpbWVvdXQodmxvY2F0aW9uKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBhZnNfdGltZXJfb3BzIGFmc192bG9jYXRpb25fdGltZXJfb3BzID0geworCS50aW1lZF9vdXQJPSBfX2Fmc192bG9jYXRpb25fdGltZW91dCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWZzX3RpbWVyX29wcyBhZnNfdmxvY2F0aW9uX3VwZGF0ZV90aW1lcl9vcHMgPSB7CisJLnRpbWVkX291dAk9IGFmc192bG9jYXRpb25fdXBkYXRlX3RpbWVyLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhZnNfYXN5bmNfb3Bfb3BzIGFmc192bG9jYXRpb25fdXBkYXRlX29wX29wcyA9IHsKKwkuYXR0ZW5kCQk9IGFmc192bG9jYXRpb25fdXBkYXRlX2F0dGVuZCwKKwkuZGlzY2FyZAk9IGFmc192bG9jYXRpb25fdXBkYXRlX2Rpc2NhcmQsCit9OworCitzdGF0aWMgTElTVF9IRUFEKGFmc192bG9jYXRpb25fdXBkYXRlX3BlbmRxKTsJLyogcXVldWUgb2YgVkxzIGF3YWl0aW5nIHVwZGF0ZSAqLworc3RhdGljIHN0cnVjdCBhZnNfdmxvY2F0aW9uICphZnNfdmxvY2F0aW9uX3VwZGF0ZTsJLyogVkwgY3VycmVudGx5IGJlaW5nIHVwZGF0ZWQgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soYWZzX3Zsb2NhdGlvbl91cGRhdGVfbG9jayk7IC8qIGxvY2sgZ3VhcmRpbmcgdXBkYXRlIHF1ZXVlICovCisKKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCitzdGF0aWMgY2FjaGVmc19tYXRjaF92YWxfdCBhZnNfdmxvY2F0aW9uX2NhY2hlX21hdGNoKHZvaWQgKnRhcmdldCwKKwkJCQkJCSAgICAgY29uc3Qgdm9pZCAqZW50cnkpOworc3RhdGljIHZvaWQgYWZzX3Zsb2NhdGlvbl9jYWNoZV91cGRhdGUodm9pZCAqc291cmNlLCB2b2lkICplbnRyeSk7CisKK3N0cnVjdCBjYWNoZWZzX2luZGV4X2RlZiBhZnNfdmxvY2F0aW9uX2NhY2hlX2luZGV4X2RlZiA9IHsKKwkubmFtZQkJPSAidmxkYiIsCisJLmRhdGFfc2l6ZQk9IHNpemVvZihzdHJ1Y3QgYWZzX2NhY2hlX3Zsb2NhdGlvbiksCisJLmtleXNbMF0JPSB7IENBQ0hFRlNfSU5ERVhfS0VZU19BU0NJSVosIDY0IH0sCisJLm1hdGNoCQk9IGFmc192bG9jYXRpb25fY2FjaGVfbWF0Y2gsCisJLnVwZGF0ZQkJPSBhZnNfdmxvY2F0aW9uX2NhY2hlX3VwZGF0ZSwKK307CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGl0ZXJhdGUgdGhyb3VnaCB0aGUgVkwgc2VydmVycyBpbiBhIGNlbGwgdW50aWwgb25lIG9mIHRoZW0gYWRtaXRzIGtub3dpbmcKKyAqIGFib3V0IHRoZSB2b2x1bWUgaW4gcXVlc3Rpb24KKyAqIC0gY2FsbGVyIG11c3QgaGF2ZSBjZWxsLT52bF9zZW0gd3JpdGUtbG9ja2VkCisgKi8KK3N0YXRpYyBpbnQgYWZzX3Zsb2NhdGlvbl9hY2Nlc3NfdmxfYnlfbmFtZShzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmxvY2F0aW9uLAorCQkJCQkgICBjb25zdCBjaGFyICpuYW1lLAorCQkJCQkgICB1bnNpZ25lZCBuYW1lc3osCisJCQkJCSAgIHN0cnVjdCBhZnNfY2FjaGVfdmxvY2F0aW9uICp2bGRiKQoreworCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIgPSBOVUxMOworCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IHZsb2NhdGlvbi0+Y2VsbDsKKwlpbnQgY291bnQsIHJldDsKKworCV9lbnRlcigiJXMsJSouKnMsJXUiLCBjZWxsLT5uYW1lLCBuYW1lc3osIG5hbWVzeiwgbmFtZSwgbmFtZXN6KTsKKworCXJldCA9IC1FTk9NRURJVU07CisJZm9yIChjb3VudCA9IGNlbGwtPnZsX25hZGRyczsgY291bnQgPiAwOyBjb3VudC0tKSB7CisJCV9kZWJ1ZygiQ2VsbFNlcnZbJWh1XTogJTA4eCIsCisJCSAgICAgICBjZWxsLT52bF9jdXJyX3N2aXgsCisJCSAgICAgICBjZWxsLT52bF9hZGRyc1tjZWxsLT52bF9jdXJyX3N2aXhdLnNfYWRkcik7CisKKwkJLyogdHJ5IGFuZCBjcmVhdGUgYSBzZXJ2ZXIgKi8KKwkJcmV0ID0gYWZzX3NlcnZlcl9sb29rdXAoY2VsbCwKKwkJCQkJJmNlbGwtPnZsX2FkZHJzW2NlbGwtPnZsX2N1cnJfc3ZpeF0sCisJCQkJCSZzZXJ2ZXIpOworCQlzd2l0Y2ggKHJldCkgeworCQljYXNlIDA6CisJCQlicmVhazsKKwkJY2FzZSAtRU5PTUVNOgorCQljYXNlIC1FTk9ORVQ6CisJCQlnb3RvIG91dDsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gcm90YXRlOworCQl9CisKKwkJLyogYXR0ZW1wdCB0byBhY2Nlc3MgdGhlIFZMIHNlcnZlciAqLworCQlyZXQgPSBhZnNfcnh2bF9nZXRfZW50cnlfYnlfbmFtZShzZXJ2ZXIsIG5hbWUsIG5hbWVzeiwgdmxkYik7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgMDoKKwkJCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CisJCQlnb3RvIG91dDsKKwkJY2FzZSAtRU5PTUVNOgorCQljYXNlIC1FTk9ORVQ6CisJCWNhc2UgLUVORVRVTlJFQUNIOgorCQljYXNlIC1FSE9TVFVOUkVBQ0g6CisJCWNhc2UgLUVDT05OUkVGVVNFRDoKKwkJCWRvd25fd3JpdGUoJnNlcnZlci0+c2VtKTsKKwkJCWlmIChzZXJ2ZXItPnZsc2VydmVyKSB7CisJCQkJcnhycGNfcHV0X2Nvbm5lY3Rpb24oc2VydmVyLT52bHNlcnZlcik7CisJCQkJc2VydmVyLT52bHNlcnZlciA9IE5VTEw7CisJCQl9CisJCQl1cF93cml0ZSgmc2VydmVyLT5zZW0pOworCQkJYWZzX3B1dF9zZXJ2ZXIoc2VydmVyKTsKKwkJCWlmIChyZXQgPT0gLUVOT01FTSB8fCByZXQgPT0gLUVOT05FVCkKKwkJCQlnb3RvIG91dDsKKwkJCWdvdG8gcm90YXRlOworCQljYXNlIC1FTk9NRURJVU06CisJCQlhZnNfcHV0X3NlcnZlcihzZXJ2ZXIpOworCQkJZ290byBvdXQ7CisJCWRlZmF1bHQ6CisJCQlhZnNfcHV0X3NlcnZlcihzZXJ2ZXIpOworCQkJcmV0ID0gLUVOT01FRElVTTsKKwkJCWdvdG8gcm90YXRlOworCQl9CisKKwkJLyogcm90YXRlIHRoZSBzZXJ2ZXIgcmVjb3JkcyB1cG9uIGxvb2t1cCBmYWlsdXJlICovCisJcm90YXRlOgorCQljZWxsLT52bF9jdXJyX3N2aXgrKzsKKwkJY2VsbC0+dmxfY3Vycl9zdml4ICU9IGNlbGwtPnZsX25hZGRyczsKKwl9CisKKyBvdXQ6CisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKKworfSAvKiBlbmQgYWZzX3Zsb2NhdGlvbl9hY2Nlc3NfdmxfYnlfbmFtZSgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBpdGVyYXRlIHRocm91Z2ggdGhlIFZMIHNlcnZlcnMgaW4gYSBjZWxsIHVudGlsIG9uZSBvZiB0aGVtIGFkbWl0cyBrbm93aW5nCisgKiBhYm91dCB0aGUgdm9sdW1lIGluIHF1ZXN0aW9uCisgKiAtIGNhbGxlciBtdXN0IGhhdmUgY2VsbC0+dmxfc2VtIHdyaXRlLWxvY2tlZAorICovCitzdGF0aWMgaW50IGFmc192bG9jYXRpb25fYWNjZXNzX3ZsX2J5X2lkKHN0cnVjdCBhZnNfdmxvY2F0aW9uICp2bG9jYXRpb24sCisJCQkJCSBhZnNfdm9saWRfdCB2b2xpZCwKKwkJCQkJIGFmc192b2x0eXBlX3Qgdm9sdHlwZSwKKwkJCQkJIHN0cnVjdCBhZnNfY2FjaGVfdmxvY2F0aW9uICp2bGRiKQoreworCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIgPSBOVUxMOworCXN0cnVjdCBhZnNfY2VsbCAqY2VsbCA9IHZsb2NhdGlvbi0+Y2VsbDsKKwlpbnQgY291bnQsIHJldDsKKworCV9lbnRlcigiJXMsJXgsJWQsIiwgY2VsbC0+bmFtZSwgdm9saWQsIHZvbHR5cGUpOworCisJcmV0ID0gLUVOT01FRElVTTsKKwlmb3IgKGNvdW50ID0gY2VsbC0+dmxfbmFkZHJzOyBjb3VudCA+IDA7IGNvdW50LS0pIHsKKwkJX2RlYnVnKCJDZWxsU2VydlslaHVdOiAlMDh4IiwKKwkJICAgICAgIGNlbGwtPnZsX2N1cnJfc3ZpeCwKKwkJICAgICAgIGNlbGwtPnZsX2FkZHJzW2NlbGwtPnZsX2N1cnJfc3ZpeF0uc19hZGRyKTsKKworCQkvKiB0cnkgYW5kIGNyZWF0ZSBhIHNlcnZlciAqLworCQlyZXQgPSBhZnNfc2VydmVyX2xvb2t1cChjZWxsLAorCQkJCQkmY2VsbC0+dmxfYWRkcnNbY2VsbC0+dmxfY3Vycl9zdml4XSwKKwkJCQkJJnNlcnZlcik7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgMDoKKwkJCWJyZWFrOworCQljYXNlIC1FTk9NRU06CisJCWNhc2UgLUVOT05FVDoKKwkJCWdvdG8gb3V0OworCQlkZWZhdWx0OgorCQkJZ290byByb3RhdGU7CisJCX0KKworCQkvKiBhdHRlbXB0IHRvIGFjY2VzcyB0aGUgVkwgc2VydmVyICovCisJCXJldCA9IGFmc19yeHZsX2dldF9lbnRyeV9ieV9pZChzZXJ2ZXIsIHZvbGlkLCB2b2x0eXBlLCB2bGRiKTsKKwkJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSAwOgorCQkJYWZzX3B1dF9zZXJ2ZXIoc2VydmVyKTsKKwkJCWdvdG8gb3V0OworCQljYXNlIC1FTk9NRU06CisJCWNhc2UgLUVOT05FVDoKKwkJY2FzZSAtRU5FVFVOUkVBQ0g6CisJCWNhc2UgLUVIT1NUVU5SRUFDSDoKKwkJY2FzZSAtRUNPTk5SRUZVU0VEOgorCQkJZG93bl93cml0ZSgmc2VydmVyLT5zZW0pOworCQkJaWYgKHNlcnZlci0+dmxzZXJ2ZXIpIHsKKwkJCQlyeHJwY19wdXRfY29ubmVjdGlvbihzZXJ2ZXItPnZsc2VydmVyKTsKKwkJCQlzZXJ2ZXItPnZsc2VydmVyID0gTlVMTDsKKwkJCX0KKwkJCXVwX3dyaXRlKCZzZXJ2ZXItPnNlbSk7CisJCQlhZnNfcHV0X3NlcnZlcihzZXJ2ZXIpOworCQkJaWYgKHJldCA9PSAtRU5PTUVNIHx8IHJldCA9PSAtRU5PTkVUKQorCQkJCWdvdG8gb3V0OworCQkJZ290byByb3RhdGU7CisJCWNhc2UgLUVOT01FRElVTToKKwkJCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CisJCQlnb3RvIG91dDsKKwkJZGVmYXVsdDoKKwkJCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CisJCQlyZXQgPSAtRU5PTUVESVVNOworCQkJZ290byByb3RhdGU7CisJCX0KKworCQkvKiByb3RhdGUgdGhlIHNlcnZlciByZWNvcmRzIHVwb24gbG9va3VwIGZhaWx1cmUgKi8KKwlyb3RhdGU6CisJCWNlbGwtPnZsX2N1cnJfc3ZpeCsrOworCQljZWxsLT52bF9jdXJyX3N2aXggJT0gY2VsbC0+dmxfbmFkZHJzOworCX0KKworIG91dDoKKwlfbGVhdmUoIiA9ICVkIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworCit9IC8qIGVuZCBhZnNfdmxvY2F0aW9uX2FjY2Vzc192bF9ieV9pZCgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBsb29rdXAgdm9sdW1lIGxvY2F0aW9uCisgKiAtIGNhbGxlciBtdXN0IGhhdmUgY2VsbC0+dm9sX3NlbSB3cml0ZS1sb2NrZWQKKyAqIC0gaXRlcmF0ZSB0aHJvdWdoIHRoZSBWTCBzZXJ2ZXJzIGluIGEgY2VsbCB1bnRpbCBvbmUgb2YgdGhlbSBhZG1pdHMga25vd2luZworICogICBhYm91dCB0aGUgdm9sdW1lIGluIHF1ZXN0aW9uCisgKiAtIGxvb2t1cCBpbiB0aGUgbG9jYWwgY2FjaGUgaWYgbm90IGFibGUgdG8gZmluZCBvbiB0aGUgVkwgc2VydmVyCisgKiAtIGluc2VydC91cGRhdGUgaW4gdGhlIGxvY2FsIGNhY2hlIGlmIGRpZCBnZXQgYSBWTCByZXNwb25zZQorICovCitpbnQgYWZzX3Zsb2NhdGlvbl9sb29rdXAoc3RydWN0IGFmc19jZWxsICpjZWxsLAorCQkJIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgdW5zaWduZWQgbmFtZXN6LAorCQkJIHN0cnVjdCBhZnNfdmxvY2F0aW9uICoqX3Zsb2NhdGlvbikKK3sKKwlzdHJ1Y3QgYWZzX2NhY2hlX3Zsb2NhdGlvbiB2bGRiOworCXN0cnVjdCBhZnNfdmxvY2F0aW9uICp2bG9jYXRpb247CisJYWZzX3ZvbHR5cGVfdCB2b2x0eXBlOworCWFmc192b2xpZF90IHZpZDsKKwlpbnQgYWN0aXZlID0gMCwgcmV0OworCisJX2VudGVyKCJ7JXN9LCUqLipzLCV1LCIsIGNlbGwtPm5hbWUsIG5hbWVzeiwgbmFtZXN6LCBuYW1lLCBuYW1lc3opOworCisJaWYgKG5hbWVzeiA+IHNpemVvZih2bG9jYXRpb24tPnZsZGIubmFtZSkpIHsKKwkJX2xlYXZlKCIgPSAtRU5BTUVUT09MT05HIik7CisJCXJldHVybiAtRU5BTUVUT09MT05HOworCX0KKworCS8qIHNlYXJjaCB0aGUgY2VsbCdzIGFjdGl2ZSBsaXN0IGZpcnN0ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2bG9jYXRpb24sICZjZWxsLT52bF9saXN0LCBsaW5rKSB7CisJCWlmIChuYW1lc3ogPCBzaXplb2YodmxvY2F0aW9uLT52bGRiLm5hbWUpICYmCisJCSAgICB2bG9jYXRpb24tPnZsZGIubmFtZVtuYW1lc3pdICE9ICdcMCcpCisJCQljb250aW51ZTsKKworCQlpZiAobWVtY21wKHZsb2NhdGlvbi0+dmxkYi5uYW1lLCBuYW1lLCBuYW1lc3opID09IDApCisJCQlnb3RvIGZvdW5kX2luX21lbW9yeTsKKwl9CisKKwkvKiBzZWFyY2ggdGhlIGNlbGwncyBncmF2ZXlhcmQgbGlzdCBzZWNvbmQgKi8KKwlzcGluX2xvY2soJmNlbGwtPnZsX2d5bG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2bG9jYXRpb24sICZjZWxsLT52bF9ncmF2ZXlhcmQsIGxpbmspIHsKKwkJaWYgKG5hbWVzeiA8IHNpemVvZih2bG9jYXRpb24tPnZsZGIubmFtZSkgJiYKKwkJICAgIHZsb2NhdGlvbi0+dmxkYi5uYW1lW25hbWVzel0gIT0gJ1wwJykKKwkJCWNvbnRpbnVlOworCisJCWlmIChtZW1jbXAodmxvY2F0aW9uLT52bGRiLm5hbWUsIG5hbWUsIG5hbWVzeikgPT0gMCkKKwkJCWdvdG8gZm91bmRfaW5fZ3JhdmV5YXJkOworCX0KKwlzcGluX3VubG9jaygmY2VsbC0+dmxfZ3lsb2NrKTsKKworCS8qIG5vdCBpbiB0aGUgY2VsbCdzIGluLW1lbW9yeSBsaXN0cyAtIGNyZWF0ZSBhIG5ldyByZWNvcmQgKi8KKwl2bG9jYXRpb24gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiksIEdGUF9LRVJORUwpOworCWlmICghdmxvY2F0aW9uKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldCh2bG9jYXRpb24sIDAsIHNpemVvZihzdHJ1Y3QgYWZzX3Zsb2NhdGlvbikpOworCWF0b21pY19zZXQoJnZsb2NhdGlvbi0+dXNhZ2UsIDEpOworCUlOSVRfTElTVF9IRUFEKCZ2bG9jYXRpb24tPmxpbmspOworCXJ3bG9ja19pbml0KCZ2bG9jYXRpb24tPmxvY2spOworCW1lbWNweSh2bG9jYXRpb24tPnZsZGIubmFtZSwgbmFtZSwgbmFtZXN6KTsKKworCWFmc190aW1lcl9pbml0KCZ2bG9jYXRpb24tPnRpbWVvdXQsICZhZnNfdmxvY2F0aW9uX3RpbWVyX29wcyk7CisJYWZzX3RpbWVyX2luaXQoJnZsb2NhdGlvbi0+dXBkX3RpbWVyLCAmYWZzX3Zsb2NhdGlvbl91cGRhdGVfdGltZXJfb3BzKTsKKwlhZnNfYXN5bmNfb3BfaW5pdCgmdmxvY2F0aW9uLT51cGRfb3AsICZhZnNfdmxvY2F0aW9uX3VwZGF0ZV9vcF9vcHMpOworCisJYWZzX2dldF9jZWxsKGNlbGwpOworCXZsb2NhdGlvbi0+Y2VsbCA9IGNlbGw7CisKKwlsaXN0X2FkZF90YWlsKCZ2bG9jYXRpb24tPmxpbmssICZjZWxsLT52bF9saXN0KTsKKworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKKwkvKiB3ZSB3YW50IHRvIHN0b3JlIGl0IGluIHRoZSBjYWNoZSwgcGx1cyBpdCBtaWdodCBhbHJlYWR5IGJlCisJICogZW5jYWNoZWQgKi8KKwljYWNoZWZzX2FjcXVpcmVfY29va2llKGNlbGwtPmNhY2hlLAorCQkJICAgICAgICZhZnNfdm9sdW1lX2NhY2hlX2luZGV4X2RlZiwKKwkJCSAgICAgICB2bG9jYXRpb24sCisJCQkgICAgICAgJnZsb2NhdGlvbi0+Y2FjaGUpOworCisJaWYgKHZsb2NhdGlvbi0+dmFsaWQpCisJCWdvdG8gZm91bmRfaW5fY2FjaGU7CisjZW5kaWYKKworCS8qIHRyeSB0byBsb29rIHVwIGFuIHVua25vd24gdm9sdW1lIGluIHRoZSBjZWxsIFZMIGRhdGFiYXNlcyBieSBuYW1lICovCisJcmV0ID0gYWZzX3Zsb2NhdGlvbl9hY2Nlc3NfdmxfYnlfbmFtZSh2bG9jYXRpb24sIG5hbWUsIG5hbWVzeiwgJnZsZGIpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50aygia0FGUzogZmFpbGVkIHRvIGxvY2F0ZSAnJSouKnMnIGluIGNlbGwgJyVzJ1xuIiwKKwkJICAgICAgIG5hbWVzeiwgbmFtZXN6LCBuYW1lLCBjZWxsLT5uYW1lKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlnb3RvIGZvdW5kX29uX3Zsc2VydmVyOworCisgZm91bmRfaW5fZ3JhdmV5YXJkOgorCS8qIGZvdW5kIGluIHRoZSBncmF2ZXlhcmQgLSByZXN1cnJlY3QgKi8KKwlfZGVidWcoImZvdW5kIGluIGdyYXZleWFyZCIpOworCWF0b21pY19pbmMoJnZsb2NhdGlvbi0+dXNhZ2UpOworCWxpc3RfZGVsKCZ2bG9jYXRpb24tPmxpbmspOworCWxpc3RfYWRkX3RhaWwoJnZsb2NhdGlvbi0+bGluaywgJmNlbGwtPnZsX2xpc3QpOworCXNwaW5fdW5sb2NrKCZjZWxsLT52bF9neWxvY2spOworCisJYWZzX2thZnN0aW1vZF9kZWxfdGltZXIoJnZsb2NhdGlvbi0+dGltZW91dCk7CisJZ290byBhY3RpdmU7CisKKyBmb3VuZF9pbl9tZW1vcnk6CisJLyogZm91bmQgaW4gbWVtb3J5IC0gY2hlY2sgdG8gc2VlIGlmIGl0J3MgYWN0aXZlICovCisJX2RlYnVnKCJmb3VuZCBpbiBtZW1vcnkiKTsKKwlhdG9taWNfaW5jKCZ2bG9jYXRpb24tPnVzYWdlKTsKKworIGFjdGl2ZToKKwlhY3RpdmUgPSAxOworCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorIGZvdW5kX2luX2NhY2hlOgorI2VuZGlmCisJLyogdHJ5IHRvIGxvb2sgdXAgYSBjYWNoZWQgdm9sdW1lIGluIHRoZSBjZWxsIFZMIGRhdGFiYXNlcyBieSBJRCAqLworCV9kZWJ1ZygiZm91bmQgaW4gY2FjaGUiKTsKKworCV9kZWJ1ZygiTG9jYWxseSBDYWNoZWQ6ICVzICUwMnggeyAlMDh4KCV4KSAlMDh4KCV4KSAlMDh4KCV4KSB9IiwKKwkgICAgICAgdmxvY2F0aW9uLT52bGRiLm5hbWUsCisJICAgICAgIHZsb2NhdGlvbi0+dmxkYi52aWRtYXNrLAorCSAgICAgICBudG9obCh2bG9jYXRpb24tPnZsZGIuc2VydmVyc1swXS5zX2FkZHIpLAorCSAgICAgICB2bG9jYXRpb24tPnZsZGIuc3J2dG1hc2tbMF0sCisJICAgICAgIG50b2hsKHZsb2NhdGlvbi0+dmxkYi5zZXJ2ZXJzWzFdLnNfYWRkciksCisJICAgICAgIHZsb2NhdGlvbi0+dmxkYi5zcnZ0bWFza1sxXSwKKwkgICAgICAgbnRvaGwodmxvY2F0aW9uLT52bGRiLnNlcnZlcnNbMl0uc19hZGRyKSwKKwkgICAgICAgdmxvY2F0aW9uLT52bGRiLnNydnRtYXNrWzJdCisJICAgICAgICk7CisKKwlfZGVidWcoIlZpZHM6ICUwOHggJTA4eCAlMDh4IiwKKwkgICAgICAgdmxvY2F0aW9uLT52bGRiLnZpZFswXSwKKwkgICAgICAgdmxvY2F0aW9uLT52bGRiLnZpZFsxXSwKKwkgICAgICAgdmxvY2F0aW9uLT52bGRiLnZpZFsyXSk7CisKKwlpZiAodmxvY2F0aW9uLT52bGRiLnZpZG1hc2sgJiBBRlNfVk9MX1ZUTV9SVykgeworCQl2aWQgPSB2bG9jYXRpb24tPnZsZGIudmlkWzBdOworCQl2b2x0eXBlID0gQUZTVkxfUldWT0w7CisJfQorCWVsc2UgaWYgKHZsb2NhdGlvbi0+dmxkYi52aWRtYXNrICYgQUZTX1ZPTF9WVE1fUk8pIHsKKwkJdmlkID0gdmxvY2F0aW9uLT52bGRiLnZpZFsxXTsKKwkJdm9sdHlwZSA9IEFGU1ZMX1JPVk9MOworCX0KKwllbHNlIGlmICh2bG9jYXRpb24tPnZsZGIudmlkbWFzayAmIEFGU19WT0xfVlRNX0JBSykgeworCQl2aWQgPSB2bG9jYXRpb24tPnZsZGIudmlkWzJdOworCQl2b2x0eXBlID0gQUZTVkxfQkFDS1ZPTDsKKwl9CisJZWxzZSB7CisJCUJVRygpOworCQl2aWQgPSAwOworCQl2b2x0eXBlID0gMDsKKwl9CisKKwlyZXQgPSBhZnNfdmxvY2F0aW9uX2FjY2Vzc192bF9ieV9pZCh2bG9jYXRpb24sIHZpZCwgdm9sdHlwZSwgJnZsZGIpOworCXN3aXRjaCAocmV0KSB7CisJCS8qIG5ldCBlcnJvciAqLworCWRlZmF1bHQ6CisJCXByaW50aygia0FGUzogZmFpbGVkIHRvIHZvbHVtZSAnJSouKnMnICgleCkgdXAgaW4gJyVzJzogJWRcbiIsCisJCSAgICAgICBuYW1lc3osIG5hbWVzeiwgbmFtZSwgdmlkLCBjZWxsLT5uYW1lLCByZXQpOworCQlnb3RvIGVycm9yOworCisJCS8qIHB1bGxlZCBmcm9tIGxvY2FsIGNhY2hlIGludG8gbWVtb3J5ICovCisJY2FzZSAwOgorCQlnb3RvIGZvdW5kX29uX3Zsc2VydmVyOworCisJCS8qIHVoIG9oLi4uIGxvb2tzIGxpa2UgdGhlIHZvbHVtZSBnb3QgZGVsZXRlZCAqLworCWNhc2UgLUVOT01FRElVTToKKwkJcHJpbnRrKCJrQUZTOiB2b2x1bWUgJyUqLipzJyAoJXgpIGRvZXMgbm90IGV4aXN0ICclcydcbiIsCisJCSAgICAgICBuYW1lc3osIG5hbWVzeiwgbmFtZSwgdmlkLCBjZWxsLT5uYW1lKTsKKworCQkvKiBUT0RPOiBtYWtlIGV4aXN0aW5nIHJlY29yZCB1bmF2YWlsYWJsZSAqLworCQlnb3RvIGVycm9yOworCX0KKworIGZvdW5kX29uX3Zsc2VydmVyOgorCV9kZWJ1ZygiRG9uZSBWTCBMb29rdXA6ICUqLipzICUwMnggeyAlMDh4KCV4KSAlMDh4KCV4KSAlMDh4KCV4KSB9IiwKKwkgICAgICAgbmFtZXN6LCBuYW1lc3osIG5hbWUsCisJICAgICAgIHZsZGIudmlkbWFzaywKKwkgICAgICAgbnRvaGwodmxkYi5zZXJ2ZXJzWzBdLnNfYWRkciksIHZsZGIuc3J2dG1hc2tbMF0sCisJICAgICAgIG50b2hsKHZsZGIuc2VydmVyc1sxXS5zX2FkZHIpLCB2bGRiLnNydnRtYXNrWzFdLAorCSAgICAgICBudG9obCh2bGRiLnNlcnZlcnNbMl0uc19hZGRyKSwgdmxkYi5zcnZ0bWFza1syXQorCSAgICAgICApOworCisJX2RlYnVnKCJWaWRzOiAlMDh4ICUwOHggJTA4eCIsIHZsZGIudmlkWzBdLCB2bGRiLnZpZFsxXSwgdmxkYi52aWRbMl0pOworCisJaWYgKChuYW1lc3ogPCBzaXplb2YodmxvY2F0aW9uLT52bGRiLm5hbWUpICYmCisJICAgICB2bG9jYXRpb24tPnZsZGIubmFtZVtuYW1lc3pdICE9ICdcMCcpIHx8CisJICAgIG1lbWNtcCh2bGRiLm5hbWUsIG5hbWUsIG5hbWVzeikgIT0gMCkKKwkJcHJpbnRrKCJrQUZTOiBuYW1lIG9mIHZvbHVtZSAnJSouKnMnIGNoYW5nZWQgdG8gJyVzJyBvbiBzZXJ2ZXJcbiIsCisJCSAgICAgICBuYW1lc3osIG5hbWVzeiwgbmFtZSwgdmxkYi5uYW1lKTsKKworCW1lbWNweSgmdmxvY2F0aW9uLT52bGRiLCAmdmxkYiwgc2l6ZW9mKHZsb2NhdGlvbi0+dmxkYikpOworCisJYWZzX2thZnN0aW1vZF9hZGRfdGltZXIoJnZsb2NhdGlvbi0+dXBkX3RpbWVyLCAxMCAqIEhaKTsKKworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKKwkvKiB1cGRhdGUgdm9sdW1lIGVudHJ5IGluIGxvY2FsIGNhY2hlICovCisJY2FjaGVmc191cGRhdGVfY29va2llKHZsb2NhdGlvbi0+Y2FjaGUpOworI2VuZGlmCisKKwkqX3Zsb2NhdGlvbiA9IHZsb2NhdGlvbjsKKwlfbGVhdmUoIiA9IDAgKCVwKSIsdmxvY2F0aW9uKTsKKwlyZXR1cm4gMDsKKworIGVycm9yOgorCWlmICh2bG9jYXRpb24pIHsKKwkJaWYgKGFjdGl2ZSkgeworCQkJX19hZnNfcHV0X3Zsb2NhdGlvbih2bG9jYXRpb24pOworCQl9CisJCWVsc2UgeworCQkJbGlzdF9kZWwoJnZsb2NhdGlvbi0+bGluayk7CisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorCQkJY2FjaGVmc19yZWxpbnF1aXNoX2Nvb2tpZSh2bG9jYXRpb24tPmNhY2hlLCAwKTsKKyNlbmRpZgorCQkJYWZzX3B1dF9jZWxsKHZsb2NhdGlvbi0+Y2VsbCk7CisJCQlrZnJlZSh2bG9jYXRpb24pOworCQl9CisJfQorCisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30gLyogZW5kIGFmc192bG9jYXRpb25fbG9va3VwKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGZpbmlzaCB1c2luZyBhIHZvbHVtZSBsb2NhdGlvbiByZWNvcmQKKyAqIC0gY2FsbGVyIG11c3QgaGF2ZSBjZWxsLT52b2xfc2VtIHdyaXRlLWxvY2tlZAorICovCitzdGF0aWMgdm9pZCBfX2Fmc19wdXRfdmxvY2F0aW9uKHN0cnVjdCBhZnNfdmxvY2F0aW9uICp2bG9jYXRpb24pCit7CisJc3RydWN0IGFmc19jZWxsICpjZWxsOworCisJaWYgKCF2bG9jYXRpb24pCisJCXJldHVybjsKKworCV9lbnRlcigiJXMiLCB2bG9jYXRpb24tPnZsZGIubmFtZSk7CisKKwljZWxsID0gdmxvY2F0aW9uLT5jZWxsOworCisJLyogc2FuaXR5IGNoZWNrICovCisJQlVHX09OKGF0b21pY19yZWFkKCZ2bG9jYXRpb24tPnVzYWdlKSA8PSAwKTsKKworCXNwaW5fbG9jaygmY2VsbC0+dmxfZ3lsb2NrKTsKKwlpZiAobGlrZWx5KCFhdG9taWNfZGVjX2FuZF90ZXN0KCZ2bG9jYXRpb24tPnVzYWdlKSkpIHsKKwkJc3Bpbl91bmxvY2soJmNlbGwtPnZsX2d5bG9jayk7CisJCV9sZWF2ZSgiIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBtb3ZlIHRvIGdyYXZleWFyZCBxdWV1ZSAqLworCWxpc3RfZGVsKCZ2bG9jYXRpb24tPmxpbmspOworCWxpc3RfYWRkX3RhaWwoJnZsb2NhdGlvbi0+bGluaywmY2VsbC0+dmxfZ3JhdmV5YXJkKTsKKworCS8qIHJlbW92ZSBmcm9tIHBlbmRpbmcgdGltZW91dCBxdWV1ZSAocmVmY291bnRlZCBpZiBhY3R1YWxseSBiZWluZworCSAqIHVwZGF0ZWQpICovCisJbGlzdF9kZWxfaW5pdCgmdmxvY2F0aW9uLT51cGRfb3AubGluayk7CisKKwkvKiB0aW1lIG91dCBpbiAxMCBzZWNzICovCisJYWZzX2thZnN0aW1vZF9kZWxfdGltZXIoJnZsb2NhdGlvbi0+dXBkX3RpbWVyKTsKKwlhZnNfa2Fmc3RpbW9kX2FkZF90aW1lcigmdmxvY2F0aW9uLT50aW1lb3V0LCAxMCAqIEhaKTsKKworCXNwaW5fdW5sb2NrKCZjZWxsLT52bF9neWxvY2spOworCisJX2xlYXZlKCIgW2tpbGxlZF0iKTsKK30gLyogZW5kIF9fYWZzX3B1dF92bG9jYXRpb24oKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZmluaXNoIHVzaW5nIGEgdm9sdW1lIGxvY2F0aW9uIHJlY29yZAorICovCit2b2lkIGFmc19wdXRfdmxvY2F0aW9uKHN0cnVjdCBhZnNfdmxvY2F0aW9uICp2bG9jYXRpb24pCit7CisJaWYgKHZsb2NhdGlvbikgeworCQlzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwgPSB2bG9jYXRpb24tPmNlbGw7CisKKwkJZG93bl93cml0ZSgmY2VsbC0+dmxfc2VtKTsKKwkJX19hZnNfcHV0X3Zsb2NhdGlvbih2bG9jYXRpb24pOworCQl1cF93cml0ZSgmY2VsbC0+dmxfc2VtKTsKKwl9Cit9IC8qIGVuZCBhZnNfcHV0X3Zsb2NhdGlvbigpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiB0aW1lb3V0IHZsb2NhdGlvbiByZWNvcmQKKyAqIC0gcmVtb3ZlcyBmcm9tIHRoZSBjZWxsJ3MgZ3JhdmV5YXJkIGlmIHRoZSB1c2FnZSBjb3VudCBpcyB6ZXJvCisgKi8KK3ZvaWQgYWZzX3Zsb2NhdGlvbl9kb190aW1lb3V0KHN0cnVjdCBhZnNfdmxvY2F0aW9uICp2bG9jYXRpb24pCit7CisJc3RydWN0IGFmc19jZWxsICpjZWxsOworCisJX2VudGVyKCIlcyIsIHZsb2NhdGlvbi0+dmxkYi5uYW1lKTsKKworCWNlbGwgPSB2bG9jYXRpb24tPmNlbGw7CisKKwlCVUdfT04oYXRvbWljX3JlYWQoJnZsb2NhdGlvbi0+dXNhZ2UpIDwgMCk7CisKKwkvKiByZW1vdmUgZnJvbSBncmF2ZXlhcmQgaWYgc3RpbGwgZGVhZCAqLworCXNwaW5fbG9jaygmY2VsbC0+dmxfZ3lsb2NrKTsKKwlpZiAoYXRvbWljX3JlYWQoJnZsb2NhdGlvbi0+dXNhZ2UpID09IDApCisJCWxpc3RfZGVsX2luaXQoJnZsb2NhdGlvbi0+bGluayk7CisJZWxzZQorCQl2bG9jYXRpb24gPSBOVUxMOworCXNwaW5fdW5sb2NrKCZjZWxsLT52bF9neWxvY2spOworCisJaWYgKCF2bG9jYXRpb24pIHsKKwkJX2xlYXZlKCIiKTsKKwkJcmV0dXJuOyAvKiByZXN1cnJlY3RlZCAqLworCX0KKworCS8qIHdlIGNhbiBub3cgZGVzdHJveSBpdCBwcm9wZXJseSAqLworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKKwljYWNoZWZzX3JlbGlucXVpc2hfY29va2llKHZsb2NhdGlvbi0+Y2FjaGUsIDApOworI2VuZGlmCisJYWZzX3B1dF9jZWxsKGNlbGwpOworCisJa2ZyZWUodmxvY2F0aW9uKTsKKworCV9sZWF2ZSgiIFtkZXN0cm95ZWRdIik7Cit9IC8qIGVuZCBhZnNfdmxvY2F0aW9uX2RvX3RpbWVvdXQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogc2VuZCBhbiB1cGRhdGUgb3BlcmF0aW9uIHRvIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgc2VydmVyCisgKi8KK3N0YXRpYyBpbnQgYWZzX3Zsb2NhdGlvbl91cGRhdGVfYmVnaW4oc3RydWN0IGFmc192bG9jYXRpb24gKnZsb2NhdGlvbikKK3sKKwlhZnNfdm9sdHlwZV90IHZvbHR5cGU7CisJYWZzX3ZvbGlkX3QgdmlkOworCWludCByZXQ7CisKKwlfZW50ZXIoIiVze3Vmcz0ldSB1Y3M9JXV9IiwKKwkgICAgICAgdmxvY2F0aW9uLT52bGRiLm5hbWUsCisJICAgICAgIHZsb2NhdGlvbi0+dXBkX2ZpcnN0X3N2aXgsCisJICAgICAgIHZsb2NhdGlvbi0+dXBkX2N1cnJfc3ZpeCk7CisKKwkvKiB0cnkgdG8gbG9vayB1cCBhIGNhY2hlZCB2b2x1bWUgaW4gdGhlIGNlbGwgVkwgZGF0YWJhc2VzIGJ5IElEICovCisJaWYgKHZsb2NhdGlvbi0+dmxkYi52aWRtYXNrICYgQUZTX1ZPTF9WVE1fUlcpIHsKKwkJdmlkID0gdmxvY2F0aW9uLT52bGRiLnZpZFswXTsKKwkJdm9sdHlwZSA9IEFGU1ZMX1JXVk9MOworCX0KKwllbHNlIGlmICh2bG9jYXRpb24tPnZsZGIudmlkbWFzayAmIEFGU19WT0xfVlRNX1JPKSB7CisJCXZpZCA9IHZsb2NhdGlvbi0+dmxkYi52aWRbMV07CisJCXZvbHR5cGUgPSBBRlNWTF9ST1ZPTDsKKwl9CisJZWxzZSBpZiAodmxvY2F0aW9uLT52bGRiLnZpZG1hc2sgJiBBRlNfVk9MX1ZUTV9CQUspIHsKKwkJdmlkID0gdmxvY2F0aW9uLT52bGRiLnZpZFsyXTsKKwkJdm9sdHlwZSA9IEFGU1ZMX0JBQ0tWT0w7CisJfQorCWVsc2UgeworCQlCVUcoKTsKKwkJdmlkID0gMDsKKwkJdm9sdHlwZSA9IDA7CisJfQorCisJLyogY29udGFjdCB0aGUgY2hvc2VuIHNlcnZlciAqLworCXJldCA9IGFmc19zZXJ2ZXJfbG9va3VwKAorCQl2bG9jYXRpb24tPmNlbGwsCisJCSZ2bG9jYXRpb24tPmNlbGwtPnZsX2FkZHJzW3Zsb2NhdGlvbi0+dXBkX2N1cnJfc3ZpeF0sCisJCSZ2bG9jYXRpb24tPnVwZF9vcC5zZXJ2ZXIpOworCisJc3dpdGNoIChyZXQpIHsKKwljYXNlIDA6CisJCWJyZWFrOworCWNhc2UgLUVOT01FTToKKwljYXNlIC1FTk9ORVQ6CisJZGVmYXVsdDoKKwkJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogaW5pdGlhdGUgdGhlIHVwZGF0ZSBvcGVyYXRpb24gKi8KKwlyZXQgPSBhZnNfcnh2bF9nZXRfZW50cnlfYnlfaWRfYXN5bmMoJnZsb2NhdGlvbi0+dXBkX29wLCB2aWQsIHZvbHR5cGUpOworCWlmIChyZXQgPCAwKSB7CisJCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9IC8qIGVuZCBhZnNfdmxvY2F0aW9uX3VwZGF0ZV9iZWdpbigpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBhYmFuZG9uIHVwZGF0aW5nIGEgVkwgcmVjb3JkCisgKiAtIGRvZXMgbm90IHJlc3RhcnQgdGhlIHVwZGF0ZSB0aW1lcgorICovCitzdGF0aWMgdm9pZCBhZnNfdmxvY2F0aW9uX3VwZGF0ZV9hYmFuZG9uKHN0cnVjdCBhZnNfdmxvY2F0aW9uICp2bG9jYXRpb24sCisJCQkJCSBhZnNfdmxvY2F0aW9uX3VwZF90IHN0YXRlLAorCQkJCQkgaW50IHJldCkKK3sKKwlfZW50ZXIoIiVzLCV1IiwgdmxvY2F0aW9uLT52bGRiLm5hbWUsIHN0YXRlKTsKKworCWlmIChyZXQgPCAwKQorCQlwcmludGsoImtBRlM6IEFiYW5kb25pbmcgVkwgdXBkYXRlICclcyc6ICVkXG4iLAorCQkgICAgICAgdmxvY2F0aW9uLT52bGRiLm5hbWUsIHJldCk7CisKKwkvKiBkaXNjYXJkIHRoZSBzZXJ2ZXIgcmVjb3JkICovCisJYWZzX3B1dF9zZXJ2ZXIodmxvY2F0aW9uLT51cGRfb3Auc2VydmVyKTsKKwl2bG9jYXRpb24tPnVwZF9vcC5zZXJ2ZXIgPSBOVUxMOworCisJc3Bpbl9sb2NrKCZhZnNfdmxvY2F0aW9uX3VwZGF0ZV9sb2NrKTsKKwlhZnNfdmxvY2F0aW9uX3VwZGF0ZSA9IE5VTEw7CisJdmxvY2F0aW9uLT51cGRfc3RhdGUgPSBzdGF0ZTsKKworCS8qIFRPRE86IHN0YXJ0IHVwZGF0aW5nIG5leHQgVkwgcmVjb3JkIG9uIHBlbmRpbmcgbGlzdCAqLworCisJc3Bpbl91bmxvY2soJmFmc192bG9jYXRpb25fdXBkYXRlX2xvY2spOworCisJX2xlYXZlKCIiKTsKK30gLyogZW5kIGFmc192bG9jYXRpb25fdXBkYXRlX2FiYW5kb24oKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogaGFuZGxlIHBlcmlvZGljIHVwZGF0ZSB0aW1lb3V0cyBhbmQgYnVzeSByZXRyeSB0aW1lb3V0cworICogLSBjYWxsZWQgZnJvbSBrYWZzdGltb2QKKyAqLworc3RhdGljIHZvaWQgYWZzX3Zsb2NhdGlvbl91cGRhdGVfdGltZXIoc3RydWN0IGFmc190aW1lciAqdGltZXIpCit7CisJc3RydWN0IGFmc192bG9jYXRpb24gKnZsb2NhdGlvbiA9CisJCWxpc3RfZW50cnkodGltZXIsIHN0cnVjdCBhZnNfdmxvY2F0aW9uLCB1cGRfdGltZXIpOworCWludCByZXQ7CisKKwlfZW50ZXIoIiVzIiwgdmxvY2F0aW9uLT52bGRiLm5hbWUpOworCisJLyogb25seSB1cGRhdGUgaWYgbm90IGluIHRoZSBncmF2ZXlhcmQgKGRlZmVuZCBhZ2FpbnN0IHB1dHRpbmcgdG9vKSAqLworCXNwaW5fbG9jaygmdmxvY2F0aW9uLT5jZWxsLT52bF9neWxvY2spOworCisJaWYgKCFhdG9taWNfcmVhZCgmdmxvY2F0aW9uLT51c2FnZSkpCisJCWdvdG8gb3V0X3VubG9jazE7CisKKwlzcGluX2xvY2soJmFmc192bG9jYXRpb25fdXBkYXRlX2xvY2spOworCisJLyogaWYgd2Ugd2VyZSB3b2tlbiB1cCBkdWUgdG8gRUJVU1kgc2xlZXAgdGhlbiByZXN0YXJ0IGltbWVkaWF0ZWx5IGlmCisJICogcG9zc2libGUgb3IgZWxzZSBqdW1wIHRvIGZyb250IG9mIHBlbmRpbmcgcXVldWUgKi8KKwlpZiAodmxvY2F0aW9uLT51cGRfc3RhdGUgPT0gQUZTX1ZMVVBEX0JVU1lTTEVFUCkgeworCQlpZiAoYWZzX3Zsb2NhdGlvbl91cGRhdGUpIHsKKwkJCWxpc3RfYWRkKCZ2bG9jYXRpb24tPnVwZF9vcC5saW5rLAorCQkJCSAmYWZzX3Zsb2NhdGlvbl91cGRhdGVfcGVuZHEpOworCQl9CisJCWVsc2UgeworCQkJYWZzX2dldF92bG9jYXRpb24odmxvY2F0aW9uKTsKKwkJCWFmc192bG9jYXRpb25fdXBkYXRlID0gdmxvY2F0aW9uOworCQkJdmxvY2F0aW9uLT51cGRfc3RhdGUgPSBBRlNfVkxVUERfSU5QUk9HUkVTUzsKKwkJfQorCQlnb3RvIG91dF91bmxvY2syOworCX0KKworCS8qIHB1dCBvbiBwZW5kaW5nIHF1ZXVlIGlmIHRoZXJlJ3MgYWxyZWFkeSBhbm90aGVyIHVwZGF0ZSBpbiBwcm9ncmVzcyAqLworCWlmIChhZnNfdmxvY2F0aW9uX3VwZGF0ZSkgeworCQl2bG9jYXRpb24tPnVwZF9zdGF0ZSA9IEFGU19WTFVQRF9QRU5ESU5HOworCQlsaXN0X2FkZF90YWlsKCZ2bG9jYXRpb24tPnVwZF9vcC5saW5rLAorCQkJICAgICAgJmFmc192bG9jYXRpb25fdXBkYXRlX3BlbmRxKTsKKwkJZ290byBvdXRfdW5sb2NrMjsKKwl9CisKKwkvKiBob2xkIGEgcmVmIG9uIGl0IHdoaWxlIGFjdHVhbGx5IHVwZGF0aW5nICovCisJYWZzX2dldF92bG9jYXRpb24odmxvY2F0aW9uKTsKKwlhZnNfdmxvY2F0aW9uX3VwZGF0ZSA9IHZsb2NhdGlvbjsKKwl2bG9jYXRpb24tPnVwZF9zdGF0ZSA9IEFGU19WTFVQRF9JTlBST0dSRVNTOworCisJc3Bpbl91bmxvY2soJmFmc192bG9jYXRpb25fdXBkYXRlX2xvY2spOworCXNwaW5fdW5sb2NrKCZ2bG9jYXRpb24tPmNlbGwtPnZsX2d5bG9jayk7CisKKwkvKiBva2F5Li4uIHdlIGNhbiBzdGFydCB0aGUgdXBkYXRlICovCisJX2RlYnVnKCJCRUdJTiBWTCBVUERBVEUgWyVzXSIsIHZsb2NhdGlvbi0+dmxkYi5uYW1lKTsKKwl2bG9jYXRpb24tPnVwZF9maXJzdF9zdml4ID0gdmxvY2F0aW9uLT5jZWxsLT52bF9jdXJyX3N2aXg7CisJdmxvY2F0aW9uLT51cGRfY3Vycl9zdml4ID0gdmxvY2F0aW9uLT51cGRfZmlyc3Rfc3ZpeDsKKwl2bG9jYXRpb24tPnVwZF9yZWpfY250ID0gMDsKKwl2bG9jYXRpb24tPnVwZF9idXN5X2NudCA9IDA7CisKKwlyZXQgPSBhZnNfdmxvY2F0aW9uX3VwZGF0ZV9iZWdpbih2bG9jYXRpb24pOworCWlmIChyZXQgPCAwKSB7CisJCWFmc192bG9jYXRpb25fdXBkYXRlX2FiYW5kb24odmxvY2F0aW9uLCBBRlNfVkxVUERfU0xFRVAsIHJldCk7CisJCWFmc19rYWZzdGltb2RfYWRkX3RpbWVyKCZ2bG9jYXRpb24tPnVwZF90aW1lciwKKwkJCQkJQUZTX1ZMREJfVElNRU9VVCk7CisJCWFmc19wdXRfdmxvY2F0aW9uKHZsb2NhdGlvbik7CisJfQorCisJX2xlYXZlKCIiKTsKKwlyZXR1cm47CisKKyBvdXRfdW5sb2NrMjoKKwlzcGluX3VubG9jaygmYWZzX3Zsb2NhdGlvbl91cGRhdGVfbG9jayk7Cisgb3V0X3VubG9jazE6CisJc3Bpbl91bmxvY2soJnZsb2NhdGlvbi0+Y2VsbC0+dmxfZ3lsb2NrKTsKKwlfbGVhdmUoIiIpOworCXJldHVybjsKKworfSAvKiBlbmQgYWZzX3Zsb2NhdGlvbl91cGRhdGVfdGltZXIoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogYXR0ZW5kIHRvIGFuIHVwZGF0ZSBvcGVyYXRpb24gdXBvbiB3aGljaCBhbiBldmVudCBoYXBwZW5lZAorICogLSBjYWxsZWQgaW4ga2Fmc2FzeW5jZCBjb250ZXh0CisgKi8KK3N0YXRpYyB2b2lkIGFmc192bG9jYXRpb25fdXBkYXRlX2F0dGVuZChzdHJ1Y3QgYWZzX2FzeW5jX29wICpvcCkKK3sKKwlzdHJ1Y3QgYWZzX2NhY2hlX3Zsb2NhdGlvbiB2bGRiOworCXN0cnVjdCBhZnNfdmxvY2F0aW9uICp2bG9jYXRpb24gPQorCQlsaXN0X2VudHJ5KG9wLCBzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiwgdXBkX29wKTsKKwl1bnNpZ25lZCB0bXA7CisJaW50IHJldDsKKworCV9lbnRlcigiJXMiLCB2bG9jYXRpb24tPnZsZGIubmFtZSk7CisKKwlyZXQgPSBhZnNfcnh2bF9nZXRfZW50cnlfYnlfaWRfYXN5bmMyKG9wLCAmdmxkYik7CisJc3dpdGNoIChyZXQpIHsKKwljYXNlIC1FQUdBSU46CisJCV9sZWF2ZSgiIFt1bmZpbmlzaGVkXSIpOworCQlyZXR1cm47CisKKwljYXNlIDA6CisJCV9kZWJ1ZygiRU5EIFZMIFVQREFURTogJWRcbiIsIHJldCk7CisJCXZsb2NhdGlvbi0+dmFsaWQgPSAxOworCisJCV9kZWJ1ZygiRG9uZSBWTCBMb29rdXA6ICUwMnggeyAlMDh4KCV4KSAlMDh4KCV4KSAlMDh4KCV4KSB9IiwKKwkJICAgICAgIHZsZGIudmlkbWFzaywKKwkJICAgICAgIG50b2hsKHZsZGIuc2VydmVyc1swXS5zX2FkZHIpLCB2bGRiLnNydnRtYXNrWzBdLAorCQkgICAgICAgbnRvaGwodmxkYi5zZXJ2ZXJzWzFdLnNfYWRkciksIHZsZGIuc3J2dG1hc2tbMV0sCisJCSAgICAgICBudG9obCh2bGRiLnNlcnZlcnNbMl0uc19hZGRyKSwgdmxkYi5zcnZ0bWFza1syXQorCQkgICAgICAgKTsKKworCQlfZGVidWcoIlZpZHM6ICUwOHggJTA4eCAlMDh4IiwKKwkJICAgICAgIHZsZGIudmlkWzBdLCB2bGRiLnZpZFsxXSwgdmxkYi52aWRbMl0pOworCisJCWFmc192bG9jYXRpb25fdXBkYXRlX2FiYW5kb24odmxvY2F0aW9uLCBBRlNfVkxVUERfU0xFRVAsIDApOworCisJCWRvd25fd3JpdGUoJnZsb2NhdGlvbi0+Y2VsbC0+dmxfc2VtKTsKKworCQkvKiBhY3R1YWxseSB1cGRhdGUgdGhlIGNhY2hlICovCisJCWlmIChzdHJuY21wKHZsZGIubmFtZSwgdmxvY2F0aW9uLT52bGRiLm5hbWUsCisJCQkgICAgc2l6ZW9mKHZsb2NhdGlvbi0+dmxkYi5uYW1lKSkgIT0gMCkKKwkJCXByaW50aygia0FGUzogbmFtZSBvZiB2b2x1bWUgJyVzJyIKKwkJCSAgICAgICAiIGNoYW5nZWQgdG8gJyVzJyBvbiBzZXJ2ZXJcbiIsCisJCQkgICAgICAgdmxvY2F0aW9uLT52bGRiLm5hbWUsIHZsZGIubmFtZSk7CisKKwkJbWVtY3B5KCZ2bG9jYXRpb24tPnZsZGIsICZ2bGRiLCBzaXplb2YodmxvY2F0aW9uLT52bGRiKSk7CisKKyNpZiAwCisJCS8qIFRPRE8gdXBkYXRlIHZvbHVtZSBlbnRyeSBpbiBsb2NhbCBjYWNoZSAqLworI2VuZGlmCisKKwkJdXBfd3JpdGUoJnZsb2NhdGlvbi0+Y2VsbC0+dmxfc2VtKTsKKworCQlpZiAocmV0IDwgMCkKKwkJCXByaW50aygia0FGUzogZmFpbGVkIHRvIHVwZGF0ZSBsb2NhbCBjYWNoZTogJWRcbiIsIHJldCk7CisKKwkJYWZzX2thZnN0aW1vZF9hZGRfdGltZXIoJnZsb2NhdGlvbi0+dXBkX3RpbWVyLAorCQkJCQlBRlNfVkxEQl9USU1FT1VUKTsKKwkJYWZzX3B1dF92bG9jYXRpb24odmxvY2F0aW9uKTsKKwkJX2xlYXZlKCIgW2ZvdW5kXSIpOworCQlyZXR1cm47CisKKwljYXNlIC1FTk9NRURJVU06CisJCXZsb2NhdGlvbi0+dXBkX3Jlal9jbnQrKzsKKwkJZ290byB0cnlfbmV4dDsKKworCQkvKiB0aGUgc2VydmVyIGlzIGxvY2tlZCAtIHJldHJ5IGluIGEgdmVyeSBzaG9ydCB3aGlsZSAqLworCWNhc2UgLUVCVVNZOgorCQl2bG9jYXRpb24tPnVwZF9idXN5X2NudCsrOworCQlpZiAodmxvY2F0aW9uLT51cGRfYnVzeV9jbnQgPiAzKQorCQkJZ290byB0cnlfbmV4dDsgLyogdG9vIG1hbnkgcmV0cmllcyAqLworCisJCWFmc192bG9jYXRpb25fdXBkYXRlX2FiYW5kb24odmxvY2F0aW9uLAorCQkJCQkgICAgIEFGU19WTFVQRF9CVVNZU0xFRVAsIDApOworCQlhZnNfa2Fmc3RpbW9kX2FkZF90aW1lcigmdmxvY2F0aW9uLT51cGRfdGltZXIsIEhaIC8gMik7CisJCWFmc19wdXRfdmxvY2F0aW9uKHZsb2NhdGlvbik7CisJCV9sZWF2ZSgiIFtidXN5XSIpOworCQlyZXR1cm47CisKKwljYXNlIC1FTkVUVU5SRUFDSDoKKwljYXNlIC1FSE9TVFVOUkVBQ0g6CisJY2FzZSAtRUNPTk5SRUZVU0VEOgorCWNhc2UgLUVSRU1PVEVJTzoKKwkJLyogcmVjb3JkIGJhZCB2bHNlcnZlciBpbmZvIGluIHRoZSBjZWxsIHRvbworCQkgKiAtIFRPRE86IHVzZSBkb3duX3dyaXRlX3RyeWxvY2soKSBpZiBhdmFpbGFibGUKKwkJICovCisJCWlmICh2bG9jYXRpb24tPnVwZF9jdXJyX3N2aXggPT0gdmxvY2F0aW9uLT5jZWxsLT52bF9jdXJyX3N2aXgpCisJCQl2bG9jYXRpb24tPmNlbGwtPnZsX2N1cnJfc3ZpeCA9CisJCQkJdmxvY2F0aW9uLT5jZWxsLT52bF9jdXJyX3N2aXggJQorCQkJCXZsb2NhdGlvbi0+Y2VsbC0+dmxfbmFkZHJzOworCisJY2FzZSAtRUJBRFJRQzoKKwljYXNlIC1FSU5WQUw6CisJY2FzZSAtRUFDQ0VTOgorCWNhc2UgLUVCQURNU0c6CisJCWdvdG8gdHJ5X25leHQ7CisKKwlkZWZhdWx0OgorCQlnb3RvIGFiYW5kb247CisJfQorCisJLyogdHJ5IGNvbnRhY3RpbmcgdGhlIG5leHQgc2VydmVyICovCisgdHJ5X25leHQ6CisJdmxvY2F0aW9uLT51cGRfYnVzeV9jbnQgPSAwOworCisJLyogZGlzY2FyZCB0aGUgc2VydmVyIHJlY29yZCAqLworCWFmc19wdXRfc2VydmVyKHZsb2NhdGlvbi0+dXBkX29wLnNlcnZlcik7CisJdmxvY2F0aW9uLT51cGRfb3Auc2VydmVyID0gTlVMTDsKKworCXRtcCA9IHZsb2NhdGlvbi0+Y2VsbC0+dmxfbmFkZHJzOworCWlmICh0bXAgPT0gMCkKKwkJZ290byBhYmFuZG9uOworCisJdmxvY2F0aW9uLT51cGRfY3Vycl9zdml4Kys7CisJaWYgKHZsb2NhdGlvbi0+dXBkX2N1cnJfc3ZpeCA+PSB0bXApCisJCXZsb2NhdGlvbi0+dXBkX2N1cnJfc3ZpeCA9IDA7CisJaWYgKHZsb2NhdGlvbi0+dXBkX2ZpcnN0X3N2aXggPj0gdG1wKQorCQl2bG9jYXRpb24tPnVwZF9maXJzdF9zdml4ID0gdG1wIC0gMTsKKworCS8qIG1vdmUgdG8gdGhlIG5leHQgc2VydmVyICovCisJaWYgKHZsb2NhdGlvbi0+dXBkX2N1cnJfc3ZpeCAhPSB2bG9jYXRpb24tPnVwZF9maXJzdF9zdml4KSB7CisJCWFmc192bG9jYXRpb25fdXBkYXRlX2JlZ2luKHZsb2NhdGlvbik7CisJCV9sZWF2ZSgiIFtuZXh0XSIpOworCQlyZXR1cm47CisJfQorCisJLyogcnVuIG91dCBvZiBzZXJ2ZXJzIHRvIHRyeSAtIHdhcyB0aGUgdm9sdW1lIHJlamVjdGVkPyAqLworCWlmICh2bG9jYXRpb24tPnVwZF9yZWpfY250ID4gMCkgeworCQlwcmludGsoImtBRlM6IEFjdGl2ZSB2b2x1bWUgbm8gbG9uZ2VyIHZhbGlkICclcydcbiIsCisJCSAgICAgICB2bG9jYXRpb24tPnZsZGIubmFtZSk7CisJCXZsb2NhdGlvbi0+dmFsaWQgPSAwOworCQlhZnNfdmxvY2F0aW9uX3VwZGF0ZV9hYmFuZG9uKHZsb2NhdGlvbiwgQUZTX1ZMVVBEX1NMRUVQLCAwKTsKKwkJYWZzX2thZnN0aW1vZF9hZGRfdGltZXIoJnZsb2NhdGlvbi0+dXBkX3RpbWVyLAorCQkJCQlBRlNfVkxEQl9USU1FT1VUKTsKKwkJYWZzX3B1dF92bG9jYXRpb24odmxvY2F0aW9uKTsKKwkJX2xlYXZlKCIgW2ludmFsaWRhdGVkXSIpOworCQlyZXR1cm47CisJfQorCisJLyogYWJhbmRvbiB0aGUgdXBkYXRlICovCisgYWJhbmRvbjoKKwlhZnNfdmxvY2F0aW9uX3VwZGF0ZV9hYmFuZG9uKHZsb2NhdGlvbiwgQUZTX1ZMVVBEX1NMRUVQLCByZXQpOworCWFmc19rYWZzdGltb2RfYWRkX3RpbWVyKCZ2bG9jYXRpb24tPnVwZF90aW1lciwgSFogKiAxMCk7CisJYWZzX3B1dF92bG9jYXRpb24odmxvY2F0aW9uKTsKKwlfbGVhdmUoIiBbYWJhbmRvbmVkXSIpOworCit9IC8qIGVuZCBhZnNfdmxvY2F0aW9uX3VwZGF0ZV9hdHRlbmQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZGVhbCB3aXRoIGFuIHVwZGF0ZSBvcGVyYXRpb24gYmVpbmcgZGlzY2FyZGVkCisgKiAtIGNhbGxlZCBpbiBrYWZzYXN5bmNkIGNvbnRleHQgd2hlbiBpdCdzIGR5aW5nIGR1ZSB0byBybW1vZAorICogLSB0aGUgY2FsbCBoYXMgYWxyZWFkeSBiZWVuIGFib3J0ZWQgYW5kIHB1dCgpJ2QKKyAqLworc3RhdGljIHZvaWQgYWZzX3Zsb2NhdGlvbl91cGRhdGVfZGlzY2FyZChzdHJ1Y3QgYWZzX2FzeW5jX29wICpvcCkKK3sKKwlzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmxvY2F0aW9uID0KKwkJbGlzdF9lbnRyeShvcCwgc3RydWN0IGFmc192bG9jYXRpb24sIHVwZF9vcCk7CisKKwlfZW50ZXIoIiVzIiwgdmxvY2F0aW9uLT52bGRiLm5hbWUpOworCisJYWZzX3B1dF9zZXJ2ZXIob3AtPnNlcnZlcik7CisJb3AtPnNlcnZlciA9IE5VTEw7CisKKwlhZnNfcHV0X3Zsb2NhdGlvbih2bG9jYXRpb24pOworCisJX2xlYXZlKCIiKTsKK30gLyogZW5kIGFmc192bG9jYXRpb25fdXBkYXRlX2Rpc2NhcmQoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogbWF0Y2ggYSBWTERCIHJlY29yZCBzdG9yZWQgaW4gdGhlIGNhY2hlCisgKiAtIG1heSBhbHNvIGxvYWQgdGFyZ2V0IGZyb20gZW50cnkKKyAqLworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKK3N0YXRpYyBjYWNoZWZzX21hdGNoX3ZhbF90IGFmc192bG9jYXRpb25fY2FjaGVfbWF0Y2godm9pZCAqdGFyZ2V0LAorCQkJCQkJICAgICBjb25zdCB2b2lkICplbnRyeSkKK3sKKwljb25zdCBzdHJ1Y3QgYWZzX2NhY2hlX3Zsb2NhdGlvbiAqdmxkYiA9IGVudHJ5OworCXN0cnVjdCBhZnNfdmxvY2F0aW9uICp2bG9jYXRpb24gPSB0YXJnZXQ7CisKKwlfZW50ZXIoInslc30seyVzfSIsIHZsb2NhdGlvbi0+dmxkYi5uYW1lLCB2bGRiLT5uYW1lKTsKKworCWlmIChzdHJuY21wKHZsb2NhdGlvbi0+dmxkYi5uYW1lLCB2bGRiLT5uYW1lLCBzaXplb2YodmxkYi0+bmFtZSkpID09IDAKKwkgICAgKSB7CisJCWlmICghdmxvY2F0aW9uLT52YWxpZCB8fAorCQkgICAgdmxvY2F0aW9uLT52bGRiLnJ0aW1lID09IHZsZGItPnJ0aW1lCisJCSAgICApIHsKKwkJCXZsb2NhdGlvbi0+dmxkYiA9ICp2bGRiOworCQkJdmxvY2F0aW9uLT52YWxpZCA9IDE7CisJCQlfbGVhdmUoIiA9IFNVQ0NFU1MgW2MtPm1dIik7CisJCQlyZXR1cm4gQ0FDSEVGU19NQVRDSF9TVUNDRVNTOworCQl9CisJCS8qIG5lZWQgdG8gdXBkYXRlIGNhY2hlIGlmIGNhY2hlZCBpbmZvIGRpZmZlcnMgKi8KKwkJZWxzZSBpZiAobWVtY21wKCZ2bG9jYXRpb24tPnZsZGIsIHZsZGIsIHNpemVvZigqdmxkYikpICE9IDApIHsKKwkJCS8qIGRlbGV0ZSBpZiBWSURzIGZvciB0aGlzIG5hbWUgZGlmZmVyICovCisJCQlpZiAobWVtY21wKCZ2bG9jYXRpb24tPnZsZGIudmlkLAorCQkJCSAgICZ2bGRiLT52aWQsCisJCQkJICAgc2l6ZW9mKHZsZGItPnZpZCkpICE9IDApIHsKKwkJCQlfbGVhdmUoIiA9IERFTEVURSIpOworCQkJCXJldHVybiBDQUNIRUZTX01BVENIX1NVQ0NFU1NfREVMRVRFOworCQkJfQorCisJCQlfbGVhdmUoIiA9IFVQREFURSIpOworCQkJcmV0dXJuIENBQ0hFRlNfTUFUQ0hfU1VDQ0VTU19VUERBVEU7CisJCX0KKwkJZWxzZSB7CisJCQlfbGVhdmUoIiA9IFNVQ0NFU1MiKTsKKwkJCXJldHVybiBDQUNIRUZTX01BVENIX1NVQ0NFU1M7CisJCX0KKwl9CisKKwlfbGVhdmUoIiA9IEZBSUxFRCIpOworCXJldHVybiBDQUNIRUZTX01BVENIX0ZBSUxFRDsKK30gLyogZW5kIGFmc192bG9jYXRpb25fY2FjaGVfbWF0Y2goKSAqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiB1cGRhdGUgYSBWTERCIHJlY29yZCBzdG9yZWQgaW4gdGhlIGNhY2hlCisgKi8KKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCitzdGF0aWMgdm9pZCBhZnNfdmxvY2F0aW9uX2NhY2hlX3VwZGF0ZSh2b2lkICpzb3VyY2UsIHZvaWQgKmVudHJ5KQoreworCXN0cnVjdCBhZnNfY2FjaGVfdmxvY2F0aW9uICp2bGRiID0gZW50cnk7CisJc3RydWN0IGFmc192bG9jYXRpb24gKnZsb2NhdGlvbiA9IHNvdXJjZTsKKworCV9lbnRlcigiIik7CisKKwkqdmxkYiA9IHZsb2NhdGlvbi0+dmxkYjsKKworfSAvKiBlbmQgYWZzX3Zsb2NhdGlvbl9jYWNoZV91cGRhdGUoKSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9hZnMvdm5vZGUuYyBiL2ZzL2Fmcy92bm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NjdmZWYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZnMvdm5vZGUuYwpAQCAtMCwwICsxLDM5NSBAQAorLyogdm5vZGUuYzogQUZTIHZub2RlIG1hbmFnZW1lbnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSAidm9sdW1lLmgiCisjaW5jbHVkZSAiY2VsbC5oIgorI2luY2x1ZGUgImNtc2VydmljZS5oIgorI2luY2x1ZGUgImZzY2xpZW50LmgiCisjaW5jbHVkZSAidmxjbGllbnQuaCIKKyNpbmNsdWRlICJ2bm9kZS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyB2b2lkIGFmc192bm9kZV9jYl90aW1lZF9vdXQoc3RydWN0IGFmc190aW1lciAqdGltZXIpOworCitzdHJ1Y3QgYWZzX3RpbWVyX29wcyBhZnNfdm5vZGVfY2JfdGltZWRfb3V0X29wcyA9IHsKKwkudGltZWRfb3V0CT0gYWZzX3Zub2RlX2NiX3RpbWVkX291dCwKK307CisKKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCitzdGF0aWMgY2FjaGVmc19tYXRjaF92YWxfdCBhZnNfdm5vZGVfY2FjaGVfbWF0Y2godm9pZCAqdGFyZ2V0LAorCQkJCQkJIGNvbnN0IHZvaWQgKmVudHJ5KTsKK3N0YXRpYyB2b2lkIGFmc192bm9kZV9jYWNoZV91cGRhdGUodm9pZCAqc291cmNlLCB2b2lkICplbnRyeSk7CisKK3N0cnVjdCBjYWNoZWZzX2luZGV4X2RlZiBhZnNfdm5vZGVfY2FjaGVfaW5kZXhfZGVmID0geworCS5uYW1lCQk9ICJ2bm9kZSIsCisJLmRhdGFfc2l6ZQk9IHNpemVvZihzdHJ1Y3QgYWZzX2NhY2hlX3Zub2RlKSwKKwkua2V5c1swXQk9IHsgQ0FDSEVGU19JTkRFWF9LRVlTX0JJTiwgNCB9LAorCS5tYXRjaAkJPSBhZnNfdm5vZGVfY2FjaGVfbWF0Y2gsCisJLnVwZGF0ZQkJPSBhZnNfdm5vZGVfY2FjaGVfdXBkYXRlLAorfTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogaGFuZGxlIGEgY2FsbGJhY2sgdGltaW5nIG91dAorICogVE9ETzogcmV0YWluIGEgcmVmIHRvIHZub2RlIHN0cnVjdCBmb3IgYW4gb3V0c3RhbmRpbmcgY2FsbGJhY2sgdGltZW91dAorICovCitzdGF0aWMgdm9pZCBhZnNfdm5vZGVfY2JfdGltZWRfb3V0KHN0cnVjdCBhZnNfdGltZXIgKnRpbWVyKQoreworCXN0cnVjdCBhZnNfc2VydmVyICpvbGRzZXJ2ZXI7CisJc3RydWN0IGFmc192bm9kZSAqdm5vZGU7CisKKwl2bm9kZSA9IGxpc3RfZW50cnkodGltZXIsIHN0cnVjdCBhZnNfdm5vZGUsIGNiX3RpbWVvdXQpOworCisJX2VudGVyKCIlcCIsIHZub2RlKTsKKworCS8qIHNldCB0aGUgY2hhbmdlZCBmbGFnIGluIHRoZSB2bm9kZSBhbmQgcmVsZWFzZSB0aGUgc2VydmVyICovCisJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7CisKKwlvbGRzZXJ2ZXIgPSB4Y2hnKCZ2bm9kZS0+Y2Jfc2VydmVyLCBOVUxMKTsKKwlpZiAob2xkc2VydmVyKSB7CisJCXZub2RlLT5mbGFncyB8PSBBRlNfVk5PREVfQ0hBTkdFRDsKKworCQlzcGluX2xvY2soJmFmc19jYl9oYXNoX2xvY2spOworCQlsaXN0X2RlbF9pbml0KCZ2bm9kZS0+Y2JfaGFzaF9saW5rKTsKKwkJc3Bpbl91bmxvY2soJmFmc19jYl9oYXNoX2xvY2spOworCisJCXNwaW5fbG9jaygmb2xkc2VydmVyLT5jYl9sb2NrKTsKKwkJbGlzdF9kZWxfaW5pdCgmdm5vZGUtPmNiX2xpbmspOworCQlzcGluX3VubG9jaygmb2xkc2VydmVyLT5jYl9sb2NrKTsKKwl9CisKKwlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCisJYWZzX3B1dF9zZXJ2ZXIob2xkc2VydmVyKTsKKworCV9sZWF2ZSgiIik7Cit9IC8qIGVuZCBhZnNfdm5vZGVfY2JfdGltZWRfb3V0KCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGZpbmlzaCBvZmYgdXBkYXRpbmcgdGhlIHJlY29yZGVkIHN0YXR1cyBvZiBhIGZpbGUKKyAqIC0gc3RhcnRzIGNhbGxiYWNrIGV4cGlyeSB0aW1lcgorICogLSBhZGRzIHRvIHNlcnZlcidzIGNhbGxiYWNrIGxpc3QKKyAqLworc3RhdGljIHZvaWQgYWZzX3Zub2RlX2ZpbmFsaXNlX3N0YXR1c191cGRhdGUoc3RydWN0IGFmc192bm9kZSAqdm5vZGUsCisJCQkJCSAgICAgc3RydWN0IGFmc19zZXJ2ZXIgKnNlcnZlciwKKwkJCQkJICAgICBpbnQgcmV0KQoreworCXN0cnVjdCBhZnNfc2VydmVyICpvbGRzZXJ2ZXIgPSBOVUxMOworCisJX2VudGVyKCIlcCwlcCwlZCIsIHZub2RlLCBzZXJ2ZXIsIHJldCk7CisKKwlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKKworCXZub2RlLT5mbGFncyAmPSB+QUZTX1ZOT0RFX0NIQU5HRUQ7CisKKwlpZiAocmV0ID09IDApIHsKKwkJLyogYWRqdXN0IHRoZSBjYWxsYmFjayB0aW1lb3V0IGFwcHJvcHJpYXRlbHkgKi8KKwkJYWZzX2thZnN0aW1vZF9hZGRfdGltZXIoJnZub2RlLT5jYl90aW1lb3V0LAorCQkJCQl2bm9kZS0+Y2JfZXhwaXJ5ICogSFopOworCisJCXNwaW5fbG9jaygmYWZzX2NiX2hhc2hfbG9jayk7CisJCWxpc3RfZGVsKCZ2bm9kZS0+Y2JfaGFzaF9saW5rKTsKKwkJbGlzdF9hZGRfdGFpbCgmdm5vZGUtPmNiX2hhc2hfbGluaywKKwkJCSAgICAgICZhZnNfY2JfaGFzaChzZXJ2ZXIsICZ2bm9kZS0+ZmlkKSk7CisJCXNwaW5fdW5sb2NrKCZhZnNfY2JfaGFzaF9sb2NrKTsKKworCQkvKiBzd2FwIHJlZiB0byBvbGQgY2FsbGJhY2sgc2VydmVyIHdpdGggdGhhdCBmb3IgbmV3IGNhbGxiYWNrCisJCSAqIHNlcnZlciAqLworCQlvbGRzZXJ2ZXIgPSB4Y2hnKCZ2bm9kZS0+Y2Jfc2VydmVyLCBzZXJ2ZXIpOworCQlpZiAob2xkc2VydmVyICE9IHNlcnZlcikgeworCQkJaWYgKG9sZHNlcnZlcikgeworCQkJCXNwaW5fbG9jaygmb2xkc2VydmVyLT5jYl9sb2NrKTsKKwkJCQlsaXN0X2RlbF9pbml0KCZ2bm9kZS0+Y2JfbGluayk7CisJCQkJc3Bpbl91bmxvY2soJm9sZHNlcnZlci0+Y2JfbG9jayk7CisJCQl9CisKKwkJCWFmc19nZXRfc2VydmVyKHNlcnZlcik7CisJCQlzcGluX2xvY2soJnNlcnZlci0+Y2JfbG9jayk7CisJCQlsaXN0X2FkZF90YWlsKCZ2bm9kZS0+Y2JfbGluaywgJnNlcnZlci0+Y2JfcHJvbWlzZXMpOworCQkJc3Bpbl91bmxvY2soJnNlcnZlci0+Y2JfbG9jayk7CisJCX0KKwkJZWxzZSB7CisJCQkvKiBzYW1lIHNlcnZlciAqLworCQkJb2xkc2VydmVyID0gTlVMTDsKKwkJfQorCX0KKwllbHNlIGlmIChyZXQgPT0gLUVOT0VOVCkgeworCQkvKiB0aGUgZmlsZSB3YXMgZGVsZXRlZCAtIGNsZWFyIHRoZSBjYWxsYmFjayB0aW1lb3V0ICovCisJCW9sZHNlcnZlciA9IHhjaGcoJnZub2RlLT5jYl9zZXJ2ZXIsIE5VTEwpOworCQlhZnNfa2Fmc3RpbW9kX2RlbF90aW1lcigmdm5vZGUtPmNiX3RpbWVvdXQpOworCisJCV9kZWJ1ZygiZ290IE5PRU5UIGZyb20gc2VydmVyIC0gbWFya2luZyBmaWxlIGRlbGV0ZWQiKTsKKwkJdm5vZGUtPmZsYWdzIHw9IEFGU19WTk9ERV9ERUxFVEVEOworCX0KKworCXZub2RlLT51cGRhdGVfY250LS07CisKKwlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCisJd2FrZV91cF9hbGwoJnZub2RlLT51cGRhdGVfd2FpdHEpOworCisJYWZzX3B1dF9zZXJ2ZXIob2xkc2VydmVyKTsKKworCV9sZWF2ZSgiIik7CisKK30gLyogZW5kIGFmc192bm9kZV9maW5hbGlzZV9zdGF0dXNfdXBkYXRlKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGZldGNoIGZpbGUgc3RhdHVzIGZyb20gdGhlIHZvbHVtZQorICogLSBkb24ndCBpc3N1ZSBhIGZldGNoIGlmOgorICogICAtIHRoZSBjaGFuZ2VkIGJpdCBpcyBub3Qgc2V0IGFuZCB0aGVyZSdzIGEgdmFsaWQgY2FsbGJhY2sKKyAqICAgLSB0aGVyZSBhcmUgYW55IG91dHN0YW5kaW5nIG9wcyB0aGF0IHdpbGwgZmV0Y2ggdGhlIHN0YXR1cworICogLSBUT0RPIGltcGxlbWVudCBsb2NhbCBjYWNoaW5nCisgKi8KK2ludCBhZnNfdm5vZGVfZmV0Y2hfc3RhdHVzKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlKQoreworCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7CisJaW50IHJldDsKKworCURFQ0xBUkVfV0FJVFFVRVVFKG15c2VsZiwgY3VycmVudCk7CisKKwlfZW50ZXIoIiVzLHsldSwldSwldX0iLAorCSAgICAgICB2bm9kZS0+dm9sdW1lLT52bG9jYXRpb24tPnZsZGIubmFtZSwKKwkgICAgICAgdm5vZGUtPmZpZC52aWQsIHZub2RlLT5maWQudm5vZGUsIHZub2RlLT5maWQudW5pcXVlKTsKKworCWlmICghKHZub2RlLT5mbGFncyAmIEFGU19WTk9ERV9DSEFOR0VEKSAmJiB2bm9kZS0+Y2Jfc2VydmVyKSB7CisJCV9sZWF2ZSgiIFt1bmNoYW5nZWRdIik7CisJCXJldHVybiAwOworCX0KKworCWlmICh2bm9kZS0+ZmxhZ3MgJiBBRlNfVk5PREVfREVMRVRFRCkgeworCQlfbGVhdmUoIiBbZGVsZXRlZF0iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJc3Bpbl9sb2NrKCZ2bm9kZS0+bG9jayk7CisKKwlpZiAoISh2bm9kZS0+ZmxhZ3MgJiBBRlNfVk5PREVfQ0hBTkdFRCkpIHsKKwkJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKwkJX2xlYXZlKCIgW3VuY2hhbmdlZF0iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHZub2RlLT51cGRhdGVfY250ID4gMCkgeworCQkvKiBzb21lb25lIGVsc2Ugc3RhcnRlZCBhIGZldGNoICovCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJYWRkX3dhaXRfcXVldWUoJnZub2RlLT51cGRhdGVfd2FpdHEsICZteXNlbGYpOworCisJCS8qIHdhaXQgZm9yIHRoZSBzdGF0dXMgdG8gYmUgdXBkYXRlZCAqLworCQlmb3IgKDs7KSB7CisJCQlpZiAoISh2bm9kZS0+ZmxhZ3MgJiBBRlNfVk5PREVfQ0hBTkdFRCkpCisJCQkJYnJlYWs7CisJCQlpZiAodm5vZGUtPmZsYWdzICYgQUZTX1ZOT0RFX0RFTEVURUQpCisJCQkJYnJlYWs7CisKKwkJCS8qIGl0IGdvdCB1cGRhdGVkIGFuZCBpbnZhbGlkYXRlZCBhbGwgYmVmb3JlIHdlIHNhdworCQkJICogaXQgKi8KKwkJCWlmICh2bm9kZS0+dXBkYXRlX2NudCA9PSAwKSB7CisJCQkJcmVtb3ZlX3dhaXRfcXVldWUoJnZub2RlLT51cGRhdGVfd2FpdHEsCisJCQkJCQkgICZteXNlbGYpOworCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCQkJZ290byBnZXRfYW55d2F5OworCQkJfQorCisJCQlzcGluX3VubG9jaygmdm5vZGUtPmxvY2spOworCisJCQlzY2hlZHVsZSgpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCisJCQlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKKwkJfQorCisJCXJlbW92ZV93YWl0X3F1ZXVlKCZ2bm9kZS0+dXBkYXRlX3dhaXRxLCAmbXlzZWxmKTsKKwkJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworCQlyZXR1cm4gdm5vZGUtPmZsYWdzICYgQUZTX1ZOT0RFX0RFTEVURUQgPyAtRU5PRU5UIDogMDsKKwl9CisKKyBnZXRfYW55d2F5OgorCS8qIG9rYXkuLi4gd2UncmUgZ29pbmcgdG8gaGF2ZSB0byBpbml0aWF0ZSB0aGUgb3AgKi8KKwl2bm9kZS0+dXBkYXRlX2NudCsrOworCisJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKworCS8qIG1lcmdlIEFGUyBzdGF0dXMgZmV0Y2hlcyBhbmQgY2xlYXIgb3V0c3RhbmRpbmcgY2FsbGJhY2sgb24gdGhpcworCSAqIHZub2RlICovCisJZG8geworCQkvKiBwaWNrIGEgc2VydmVyIHRvIHF1ZXJ5ICovCisJCXJldCA9IGFmc192b2x1bWVfcGlja19maWxlc2VydmVyKHZub2RlLT52b2x1bWUsICZzZXJ2ZXIpOworCQlpZiAocmV0PDApCisJCQlyZXR1cm4gcmV0OworCisJCV9kZWJ1ZygiVVNJTkcgU0VSVkVSOiAlMDh4XG4iLCBudG9obChzZXJ2ZXItPmFkZHIuc19hZGRyKSk7CisKKwkJcmV0ID0gYWZzX3J4ZnNfZmV0Y2hfZmlsZV9zdGF0dXMoc2VydmVyLCB2bm9kZSwgTlVMTCk7CisKKwl9IHdoaWxlICghYWZzX3ZvbHVtZV9yZWxlYXNlX2ZpbGVzZXJ2ZXIodm5vZGUtPnZvbHVtZSwgc2VydmVyLCByZXQpKTsKKworCS8qIGFkanVzdCB0aGUgZmxhZ3MgKi8KKwlhZnNfdm5vZGVfZmluYWxpc2Vfc3RhdHVzX3VwZGF0ZSh2bm9kZSwgc2VydmVyLCByZXQpOworCisJX2xlYXZlKCIgPSAlZCIsIHJldCk7CisJcmV0dXJuIHJldDsKK30gLyogZW5kIGFmc192bm9kZV9mZXRjaF9zdGF0dXMoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZmV0Y2ggZmlsZSBkYXRhIGZyb20gdGhlIHZvbHVtZQorICogLSBUT0RPIGltcGxlbWVudCBjYWNoaW5nIGFuZCBzZXJ2ZXIgZmFpbG92ZXIKKyAqLworaW50IGFmc192bm9kZV9mZXRjaF9kYXRhKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlLAorCQkJIHN0cnVjdCBhZnNfcnhmc19mZXRjaF9kZXNjcmlwdG9yICpkZXNjKQoreworCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7CisJaW50IHJldDsKKworCV9lbnRlcigiJXMseyV1LCV1LCV1fSIsCisJICAgICAgIHZub2RlLT52b2x1bWUtPnZsb2NhdGlvbi0+dmxkYi5uYW1lLAorCSAgICAgICB2bm9kZS0+ZmlkLnZpZCwKKwkgICAgICAgdm5vZGUtPmZpZC52bm9kZSwKKwkgICAgICAgdm5vZGUtPmZpZC51bmlxdWUpOworCisJLyogdGhpcyBvcCB3aWxsIGZldGNoIHRoZSBzdGF0dXMgKi8KKwlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKKwl2bm9kZS0+dXBkYXRlX2NudCsrOworCXNwaW5fdW5sb2NrKCZ2bm9kZS0+bG9jayk7CisKKwkvKiBtZXJnZSBpbiBBRlMgc3RhdHVzIGZldGNoZXMgYW5kIGNsZWFyIG91dHN0YW5kaW5nIGNhbGxiYWNrIG9uIHRoaXMKKwkgKiB2bm9kZSAqLworCWRvIHsKKwkJLyogcGljayBhIHNlcnZlciB0byBxdWVyeSAqLworCQlyZXQgPSBhZnNfdm9sdW1lX3BpY2tfZmlsZXNlcnZlcih2bm9kZS0+dm9sdW1lLCAmc2VydmVyKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCV9kZWJ1ZygiVVNJTkcgU0VSVkVSOiAlMDh4XG4iLCBudG9obChzZXJ2ZXItPmFkZHIuc19hZGRyKSk7CisKKwkJcmV0ID0gYWZzX3J4ZnNfZmV0Y2hfZmlsZV9kYXRhKHNlcnZlciwgdm5vZGUsIGRlc2MsIE5VTEwpOworCisJfSB3aGlsZSAoIWFmc192b2x1bWVfcmVsZWFzZV9maWxlc2VydmVyKHZub2RlLT52b2x1bWUsIHNlcnZlciwgcmV0KSk7CisKKwkvKiBhZGp1c3QgdGhlIGZsYWdzICovCisJYWZzX3Zub2RlX2ZpbmFsaXNlX3N0YXR1c191cGRhdGUodm5vZGUsIHNlcnZlciwgcmV0KTsKKworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7CisKK30gLyogZW5kIGFmc192bm9kZV9mZXRjaF9kYXRhKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGJyZWFrIGFueSBvdXRzdGFuZGluZyBjYWxsYmFjayBvbiBhIHZub2RlCisgKiAtIG9ubHkgcmVsZXZlbnQgdG8gc2VydmVyIHRoYXQgaXNzdWVkIGl0CisgKi8KK2ludCBhZnNfdm5vZGVfZ2l2ZV91cF9jYWxsYmFjayhzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSkKK3sKKwlzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyOworCWludCByZXQ7CisKKwlfZW50ZXIoIiVzLHsldSwldSwldX0iLAorCSAgICAgICB2bm9kZS0+dm9sdW1lLT52bG9jYXRpb24tPnZsZGIubmFtZSwKKwkgICAgICAgdm5vZGUtPmZpZC52aWQsCisJICAgICAgIHZub2RlLT5maWQudm5vZGUsCisJICAgICAgIHZub2RlLT5maWQudW5pcXVlKTsKKworCXNwaW5fbG9jaygmYWZzX2NiX2hhc2hfbG9jayk7CisJbGlzdF9kZWxfaW5pdCgmdm5vZGUtPmNiX2hhc2hfbGluayk7CisJc3Bpbl91bmxvY2soJmFmc19jYl9oYXNoX2xvY2spOworCisJLyogc2V0IHRoZSBjaGFuZ2VkIGZsYWcgaW4gdGhlIHZub2RlIGFuZCByZWxlYXNlIHRoZSBzZXJ2ZXIgKi8KKwlzcGluX2xvY2soJnZub2RlLT5sb2NrKTsKKworCWFmc19rYWZzdGltb2RfZGVsX3RpbWVyKCZ2bm9kZS0+Y2JfdGltZW91dCk7CisKKwlzZXJ2ZXIgPSB4Y2hnKCZ2bm9kZS0+Y2Jfc2VydmVyLCBOVUxMKTsKKwlpZiAoc2VydmVyKSB7CisJCXZub2RlLT5mbGFncyB8PSBBRlNfVk5PREVfQ0hBTkdFRDsKKworCQlzcGluX2xvY2soJnNlcnZlci0+Y2JfbG9jayk7CisJCWxpc3RfZGVsX2luaXQoJnZub2RlLT5jYl9saW5rKTsKKwkJc3Bpbl91bmxvY2soJnNlcnZlci0+Y2JfbG9jayk7CisJfQorCisJc3Bpbl91bmxvY2soJnZub2RlLT5sb2NrKTsKKworCXJldCA9IDA7CisJaWYgKHNlcnZlcikgeworCQlyZXQgPSBhZnNfcnhmc19naXZlX3VwX2NhbGxiYWNrKHNlcnZlciwgdm5vZGUpOworCQlhZnNfcHV0X3NlcnZlcihzZXJ2ZXIpOworCX0KKworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9IC8qIGVuZCBhZnNfdm5vZGVfZ2l2ZV91cF9jYWxsYmFjaygpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBtYXRjaCBhIHZub2RlIHJlY29yZCBzdG9yZWQgaW4gdGhlIGNhY2hlCisgKi8KKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCitzdGF0aWMgY2FjaGVmc19tYXRjaF92YWxfdCBhZnNfdm5vZGVfY2FjaGVfbWF0Y2godm9pZCAqdGFyZ2V0LAorCQkJCQkJIGNvbnN0IHZvaWQgKmVudHJ5KQoreworCWNvbnN0IHN0cnVjdCBhZnNfY2FjaGVfdm5vZGUgKmN2bm9kZSA9IGVudHJ5OworCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlID0gdGFyZ2V0OworCisJX2VudGVyKCJ7JXgsJXgsJUx4fSx7JXgsJXgsJUx4fSIsCisJICAgICAgIHZub2RlLT5maWQudm5vZGUsCisJICAgICAgIHZub2RlLT5maWQudW5pcXVlLAorCSAgICAgICB2bm9kZS0+c3RhdHVzLnZlcnNpb24sCisJICAgICAgIGN2bm9kZS0+dm5vZGVfaWQsCisJICAgICAgIGN2bm9kZS0+dm5vZGVfdW5pcXVlLAorCSAgICAgICBjdm5vZGUtPmRhdGFfdmVyc2lvbik7CisKKwlpZiAodm5vZGUtPmZpZC52bm9kZSAhPSBjdm5vZGUtPnZub2RlX2lkKSB7CisJCV9sZWF2ZSgiID0gRkFJTEVEIik7CisJCXJldHVybiBDQUNIRUZTX01BVENIX0ZBSUxFRDsKKwl9CisKKwlpZiAodm5vZGUtPmZpZC51bmlxdWUgIT0gY3Zub2RlLT52bm9kZV91bmlxdWUgfHwKKwkgICAgdm5vZGUtPnN0YXR1cy52ZXJzaW9uICE9IGN2bm9kZS0+ZGF0YV92ZXJzaW9uKSB7CisJCV9sZWF2ZSgiID0gREVMRVRFIik7CisJCXJldHVybiBDQUNIRUZTX01BVENIX1NVQ0NFU1NfREVMRVRFOworCX0KKworCV9sZWF2ZSgiID0gU1VDQ0VTUyIpOworCXJldHVybiBDQUNIRUZTX01BVENIX1NVQ0NFU1M7Cit9IC8qIGVuZCBhZnNfdm5vZGVfY2FjaGVfbWF0Y2goKSAqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiB1cGRhdGUgYSB2bm9kZSByZWNvcmQgc3RvcmVkIGluIHRoZSBjYWNoZQorICovCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorc3RhdGljIHZvaWQgYWZzX3Zub2RlX2NhY2hlX3VwZGF0ZSh2b2lkICpzb3VyY2UsIHZvaWQgKmVudHJ5KQoreworCXN0cnVjdCBhZnNfY2FjaGVfdm5vZGUgKmN2bm9kZSA9IGVudHJ5OworCXN0cnVjdCBhZnNfdm5vZGUgKnZub2RlID0gc291cmNlOworCisJX2VudGVyKCIiKTsKKworCWN2bm9kZS0+dm5vZGVfaWQJPSB2bm9kZS0+ZmlkLnZub2RlOworCWN2bm9kZS0+dm5vZGVfdW5pcXVlCT0gdm5vZGUtPmZpZC51bmlxdWU7CisJY3Zub2RlLT5kYXRhX3ZlcnNpb24JPSB2bm9kZS0+c3RhdHVzLnZlcnNpb247CisKK30gLyogZW5kIGFmc192bm9kZV9jYWNoZV91cGRhdGUoKSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9hZnMvdm5vZGUuaCBiL2ZzL2Fmcy92bm9kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NmE5NzEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hZnMvdm5vZGUuaApAQCAtMCwwICsxLDk0IEBACisvKiB2bm9kZS5oOiBBRlMgdm5vZGUgcmVjb3JkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0FGU19WTk9ERV9ICisjZGVmaW5lIF9MSU5VWF9BRlNfVk5PREVfSAorCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlICJzZXJ2ZXIuaCIKKyNpbmNsdWRlICJrYWZzdGltb2QuaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorCisjaWZkZWYgX19LRVJORUxfXworCitzdHJ1Y3QgYWZzX3J4ZnNfZmV0Y2hfZGVzY3JpcHRvcjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHZub2RlIGNhdGFsb2d1ZSBlbnRyeQorICovCitzdHJ1Y3QgYWZzX2NhY2hlX3Zub2RlCit7CisJYWZzX3Zub2RlaWRfdAkJdm5vZGVfaWQ7CS8qIHZub2RlIElEICovCisJdW5zaWduZWQJCXZub2RlX3VuaXF1ZTsJLyogdm5vZGUgSUQgdW5pcXVpZmllciAqLworCWFmc19kYXRhdmVyc2lvbl90CWRhdGFfdmVyc2lvbjsJLyogZGF0YSB2ZXJzaW9uICovCit9OworCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorZXh0ZXJuIHN0cnVjdCBjYWNoZWZzX2luZGV4X2RlZiBhZnNfdm5vZGVfY2FjaGVfaW5kZXhfZGVmOworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBBRlMgaW5vZGUgcHJpdmF0ZSBkYXRhCisgKi8KK3N0cnVjdCBhZnNfdm5vZGUKK3sKKwlzdHJ1Y3QgaW5vZGUJCXZmc19pbm9kZTsJLyogdGhlIFZGUydzIGlub2RlIHJlY29yZCAqLworCisJc3RydWN0IGFmc192b2x1bWUJKnZvbHVtZTsJLyogdm9sdW1lIG9uIHdoaWNoIHZub2RlIHJlc2lkZXMgKi8KKwlzdHJ1Y3QgYWZzX2ZpZAkJZmlkOwkJLyogdGhlIGZpbGUgaWRlbnRpZmllciBmb3IgdGhpcyBpbm9kZSAqLworCXN0cnVjdCBhZnNfZmlsZV9zdGF0dXMJc3RhdHVzOwkJLyogQUZTIHN0YXR1cyBpbmZvIGZvciB0aGlzIGZpbGUgKi8KKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCisJc3RydWN0IGNhY2hlZnNfY29va2llCSpjYWNoZTsJCS8qIGNhY2hpbmcgY29va2llICovCisjZW5kaWYKKworCXdhaXRfcXVldWVfaGVhZF90CXVwZGF0ZV93YWl0cTsJLyogc3RhdHVzIGZldGNoIHdhaXRxdWV1ZSAqLworCXVuc2lnbmVkCQl1cGRhdGVfY250OwkvKiBudW1iZXIgb2Ygb3V0c3RhbmRpbmcgb3BzIHRoYXQgd2lsbCB1cGRhdGUgdGhlCisJCQkJCQkgKiBzdGF0dXMgKi8KKwlzcGlubG9ja190CQlsb2NrOwkJLyogd2FpdHF1ZXVlL2ZsYWdzIGxvY2sgKi8KKwl1bnNpZ25lZAkJZmxhZ3M7CisjZGVmaW5lIEFGU19WTk9ERV9DSEFOR0VECTB4MDAwMDAwMDEJLyogc2V0IGlmIHZub2RlIHJlcG9ydGVkIGNoYW5nZWQgYnkgY2FsbGJhY2sgKi8KKyNkZWZpbmUgQUZTX1ZOT0RFX0RFTEVURUQJMHgwMDAwMDAwMgkvKiBzZXQgaWYgdm5vZGUgZGVsZXRlZCBvbiBzZXJ2ZXIgKi8KKyNkZWZpbmUgQUZTX1ZOT0RFX01PVU5UUE9JTlQJMHgwMDAwMDAwNAkvKiBzZXQgaWYgdm5vZGUgaXMgYSBtb3VudHBvaW50IHN5bWxpbmsgKi8KKworCS8qIG91dHN0YW5kaW5nIGNhbGxiYWNrIG5vdGlmaWNhdGlvbiBvbiB0aGlzIGZpbGUgKi8KKwlzdHJ1Y3QgYWZzX3NlcnZlcgkqY2Jfc2VydmVyOwkvKiBzZXJ2ZXIgdGhhdCBtYWRlIHRoZSBjdXJyZW50IHByb21pc2UgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWNiX2xpbms7CS8qIGxpbmsgaW4gc2VydmVyJ3MgcHJvbWlzZXMgbGlzdCAqLworCXN0cnVjdCBsaXN0X2hlYWQJY2JfaGFzaF9saW5rOwkvKiBsaW5rIGluIG1hc3RlciBjYWxsYmFjayBoYXNoICovCisJc3RydWN0IGFmc190aW1lcgljYl90aW1lb3V0OwkvKiB0aW1lb3V0IG9uIHByb21pc2UgKi8KKwl1bnNpZ25lZAkJY2JfdmVyc2lvbjsJLyogY2FsbGJhY2sgdmVyc2lvbiAqLworCXVuc2lnbmVkCQljYl9leHBpcnk7CS8qIGNhbGxiYWNrIGV4cGlyeSB0aW1lICovCisJYWZzX2NhbGxiYWNrX3R5cGVfdAljYl90eXBlOwkvKiB0eXBlIG9mIGNhbGxiYWNrICovCit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhZnNfdm5vZGUgKkFGU19GU19JKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihpbm9kZSxzdHJ1Y3QgYWZzX3Zub2RlLHZmc19pbm9kZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlub2RlICpBRlNfVk5PREVfVE9fSShzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSkKK3sKKwlyZXR1cm4gJnZub2RlLT52ZnNfaW5vZGU7Cit9CisKK2V4dGVybiBpbnQgYWZzX3Zub2RlX2ZldGNoX3N0YXR1cyhzdHJ1Y3QgYWZzX3Zub2RlICp2bm9kZSk7CisKK2V4dGVybiBpbnQgYWZzX3Zub2RlX2ZldGNoX2RhdGEoc3RydWN0IGFmc192bm9kZSAqdm5vZGUsCisJCQkJc3RydWN0IGFmc19yeGZzX2ZldGNoX2Rlc2NyaXB0b3IgKmRlc2MpOworCitleHRlcm4gaW50IGFmc192bm9kZV9naXZlX3VwX2NhbGxiYWNrKHN0cnVjdCBhZnNfdm5vZGUgKnZub2RlKTsKKworZXh0ZXJuIHN0cnVjdCBhZnNfdGltZXJfb3BzIGFmc192bm9kZV9jYl90aW1lZF9vdXRfb3BzOworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZW5kaWYgLyogX0xJTlVYX0FGU19WTk9ERV9IICovCmRpZmYgLS1naXQgYS9mcy9hZnMvdm9sdW1lLmMgYi9mcy9hZnMvdm9sdW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZmNGI4NgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Fmcy92b2x1bWUuYwpAQCAtMCwwICsxLDUyMCBAQAorLyogdm9sdW1lLmM6IEFGUyB2b2x1bWUgbWFuYWdlbWVudAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlICJ2b2x1bWUuaCIKKyNpbmNsdWRlICJ2bm9kZS5oIgorI2luY2x1ZGUgImNlbGwuaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorI2luY2x1ZGUgImNtc2VydmljZS5oIgorI2luY2x1ZGUgImZzY2xpZW50LmgiCisjaW5jbHVkZSAidmxjbGllbnQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjaWZkZWYgX19LREVCVUcKK3N0YXRpYyBjb25zdCBjaGFyICphZnNfdm9sdHlwZXNbXSA9IHsgIlIvVyIsICJSL08iLCAiQkFLIiB9OworI2VuZGlmCisKKyNpZmRlZiBBRlNfQ0FDSElOR19TVVBQT1JUCitzdGF0aWMgY2FjaGVmc19tYXRjaF92YWxfdCBhZnNfdm9sdW1lX2NhY2hlX21hdGNoKHZvaWQgKnRhcmdldCwKKwkJCQkJCSAgY29uc3Qgdm9pZCAqZW50cnkpOworc3RhdGljIHZvaWQgYWZzX3ZvbHVtZV9jYWNoZV91cGRhdGUodm9pZCAqc291cmNlLCB2b2lkICplbnRyeSk7CisKK3N0cnVjdCBjYWNoZWZzX2luZGV4X2RlZiBhZnNfdm9sdW1lX2NhY2hlX2luZGV4X2RlZiA9IHsKKwkubmFtZQkJPSAidm9sdW1lIiwKKwkuZGF0YV9zaXplCT0gc2l6ZW9mKHN0cnVjdCBhZnNfY2FjaGVfdmhhc2gpLAorCS5rZXlzWzBdCT0geyBDQUNIRUZTX0lOREVYX0tFWVNfQklOLCAxIH0sCisJLmtleXNbMV0JPSB7IENBQ0hFRlNfSU5ERVhfS0VZU19CSU4sIDEgfSwKKwkubWF0Y2gJCT0gYWZzX3ZvbHVtZV9jYWNoZV9tYXRjaCwKKwkudXBkYXRlCQk9IGFmc192b2x1bWVfY2FjaGVfdXBkYXRlLAorfTsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogbG9va3VwIGEgdm9sdW1lIGJ5IG5hbWUKKyAqIC0gdGhpcyBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgKgkiJVtjZWxsOl12b2x1bWVbLl0iCQlSL1cgdm9sdW1lCisgKgkiI1tjZWxsOl12b2x1bWVbLl0iCQlSL08gb3IgUi9XIHZvbHVtZSAocndwYXJlbnQ9MCksCisgKgkJCQkJIG9yIFIvVyAocndwYXJlbnQ9MSkgdm9sdW1lCisgKgkiJVtjZWxsOl12b2x1bWUucmVhZG9ubHkiCVIvTyB2b2x1bWUKKyAqCSIjW2NlbGw6XXZvbHVtZS5yZWFkb25seSIJUi9PIHZvbHVtZQorICoJIiVbY2VsbDpddm9sdW1lLmJhY2t1cCIJCUJhY2t1cCB2b2x1bWUKKyAqCSIjW2NlbGw6XXZvbHVtZS5iYWNrdXAiCQlCYWNrdXAgdm9sdW1lCisgKgorICogVGhlIGNlbGwgbmFtZSBpcyBvcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IGNlbGwuCisgKgorICogU2VlICJUaGUgUnVsZXMgb2YgTW91bnQgUG9pbnQgVHJhdmVyc2FsIiBpbiBDaGFwdGVyIDUgb2YgdGhlIEFGUyBTeXNBZG1pbgorICogR3VpZGUKKyAqIC0gUnVsZSAxOiBFeHBsaWNpdCB0eXBlIHN1ZmZpeCBmb3JjZXMgYWNjZXNzIG9mIHRoYXQgdHlwZSBvciBub3RoaW5nCisgKiAgICAgICAgICAgKG5vIHN1ZmZpeCwgdGhlbiB1c2UgUnVsZSAyICYgMykKKyAqIC0gUnVsZSAyOiBJZiBwYXJlbnQgdm9sdW1lIGlzIFIvTywgdGhlbiBtb3VudCBSL08gdm9sdW1lIGJ5IHByZWZlcmVuY2UsIFIvVworICogICAgICAgICAgIGlmIG5vdCBhdmFpbGFibGUKKyAqIC0gUnVsZSAzOiBJZiBwYXJlbnQgdm9sdW1lIGlzIFIvVywgdGhlbiBvbmx5IG1vdW50IFIvVyB2b2x1bWUgdW5sZXNzCisgKiAgICAgICAgICAgZXhwbGljaXRseSB0b2xkIG90aGVyd2lzZQorICovCitpbnQgYWZzX3ZvbHVtZV9sb29rdXAoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGFmc19jZWxsICpjZWxsLCBpbnQgcndwYXRoLAorCQkgICAgICBzdHJ1Y3QgYWZzX3ZvbHVtZSAqKl92b2x1bWUpCit7CisJc3RydWN0IGFmc192bG9jYXRpb24gKnZsb2NhdGlvbiA9IE5VTEw7CisJc3RydWN0IGFmc192b2x1bWUgKnZvbHVtZSA9IE5VTEw7CisJYWZzX3ZvbHR5cGVfdCB0eXBlOworCWNvbnN0IGNoYXIgKmNlbGxuYW1lLCAqdm9sbmFtZSwgKnN1ZmZpeDsKKwljaGFyIHNydnRtYXNrOworCWludCBmb3JjZSwgcmV0LCBsb29wLCBjZWxsbmFtZXN6LCB2b2xuYW1lc3o7CisKKwlfZW50ZXIoIiVzLCwlZCwiLCBuYW1lLCByd3BhdGgpOworCisJaWYgKCFuYW1lIHx8IChuYW1lWzBdICE9ICclJyAmJiBuYW1lWzBdICE9ICcjJykgfHwgIW5hbWVbMV0pIHsKKwkJcHJpbnRrKCJrQUZTOiB1bnBhcnNhYmxlIHZvbHVtZSBuYW1lXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIHZvbHVtZSB3ZSdyZSBsb29raW5nIGZvciAqLworCWZvcmNlID0gMDsKKwl0eXBlID0gQUZTVkxfUk9WT0w7CisKKwlpZiAocndwYXRoIHx8IG5hbWVbMF0gPT0gJyUnKSB7CisJCXR5cGUgPSBBRlNWTF9SV1ZPTDsKKwkJZm9yY2UgPSAxOworCX0KKworCXN1ZmZpeCA9IHN0cnJjaHIobmFtZSwgJy4nKTsKKwlpZiAoc3VmZml4KSB7CisJCWlmIChzdHJjbXAoc3VmZml4LCAiLnJlYWRvbmx5IikgPT0gMCkgeworCQkJdHlwZSA9IEFGU1ZMX1JPVk9MOworCQkJZm9yY2UgPSAxOworCQl9CisJCWVsc2UgaWYgKHN0cmNtcChzdWZmaXgsICIuYmFja3VwIikgPT0gMCkgeworCQkJdHlwZSA9IEFGU1ZMX0JBQ0tWT0w7CisJCQlmb3JjZSA9IDE7CisJCX0KKwkJZWxzZSBpZiAoc3VmZml4WzFdID09IDApIHsKKwkJfQorCQllbHNlIHsKKwkJCXN1ZmZpeCA9IE5VTEw7CisJCX0KKwl9CisKKwkvKiBzcGxpdCB0aGUgY2VsbCBhbmQgdm9sdW1lIG5hbWVzICovCisJbmFtZSsrOworCXZvbG5hbWUgPSBzdHJjaHIobmFtZSwgJzonKTsKKwlpZiAodm9sbmFtZSkgeworCQljZWxsbmFtZSA9IG5hbWU7CisJCWNlbGxuYW1lc3ogPSB2b2xuYW1lIC0gbmFtZTsKKwkJdm9sbmFtZSsrOworCX0KKwllbHNlIHsKKwkJdm9sbmFtZSA9IG5hbWU7CisJCWNlbGxuYW1lID0gTlVMTDsKKwkJY2VsbG5hbWVzeiA9IDA7CisJfQorCisJdm9sbmFtZXN6ID0gc3VmZml4ID8gc3VmZml4IC0gdm9sbmFtZSA6IHN0cmxlbih2b2xuYW1lKTsKKworCV9kZWJ1ZygiQ0VMTDolKi4qcyBbJXBdIFZPTFVNRTolKi4qcyBTVUZGSVg6JXMgVFlQRTolZCVzIiwKKwkgICAgICAgY2VsbG5hbWVzeiwgY2VsbG5hbWVzeiwgY2VsbG5hbWUgPzogIiIsIGNlbGwsCisJICAgICAgIHZvbG5hbWVzeiwgdm9sbmFtZXN6LCB2b2xuYW1lLCBzdWZmaXggPzogIi0iLAorCSAgICAgICB0eXBlLAorCSAgICAgICBmb3JjZSA/ICIgRk9SQ0UiIDogIiIpOworCisJLyogbG9va3VwIHRoZSBjZWxsIHJlY29yZCAqLworCWlmIChjZWxsbmFtZSB8fCAhY2VsbCkgeworCQlyZXQgPSBhZnNfY2VsbF9sb29rdXAoY2VsbG5hbWUsIGNlbGxuYW1lc3osICZjZWxsKTsKKwkJaWYgKHJldDwwKSB7CisJCQlwcmludGsoImtBRlM6IHVuYWJsZSB0byBsb29rdXAgY2VsbCAnJXMnXG4iLAorCQkJICAgICAgIGNlbGxuYW1lID86ICIiKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9CisJZWxzZSB7CisJCWFmc19nZXRfY2VsbChjZWxsKTsKKwl9CisKKwkvKiBsb29rdXAgdGhlIHZvbHVtZSBsb2NhdGlvbiByZWNvcmQgKi8KKwlyZXQgPSBhZnNfdmxvY2F0aW9uX2xvb2t1cChjZWxsLCB2b2xuYW1lLCB2b2xuYW1lc3osICZ2bG9jYXRpb24pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogbWFrZSB0aGUgZmluYWwgZGVjaXNpb24gb24gdGhlIHR5cGUgd2Ugd2FudCAqLworCXJldCA9IC1FTk9NRURJVU07CisJaWYgKGZvcmNlICYmICEodmxvY2F0aW9uLT52bGRiLnZpZG1hc2sgJiAoMSA8PCB0eXBlKSkpCisJCWdvdG8gZXJyb3I7CisKKwlzcnZ0bWFzayA9IDA7CisJZm9yIChsb29wID0gMDsgbG9vcCA8IHZsb2NhdGlvbi0+dmxkYi5uc2VydmVyczsgbG9vcCsrKQorCQlzcnZ0bWFzayB8PSB2bG9jYXRpb24tPnZsZGIuc3J2dG1hc2tbbG9vcF07CisKKwlpZiAoZm9yY2UpIHsKKwkJaWYgKCEoc3J2dG1hc2sgJiAoMSA8PCB0eXBlKSkpCisJCQlnb3RvIGVycm9yOworCX0KKwllbHNlIGlmIChzcnZ0bWFzayAmIEFGU19WT0xfVlRNX1JPKSB7CisJCXR5cGUgPSBBRlNWTF9ST1ZPTDsKKwl9CisJZWxzZSBpZiAoc3J2dG1hc2sgJiBBRlNfVk9MX1ZUTV9SVykgeworCQl0eXBlID0gQUZTVkxfUldWT0w7CisJfQorCWVsc2UgeworCQlnb3RvIGVycm9yOworCX0KKworCWRvd25fd3JpdGUoJmNlbGwtPnZsX3NlbSk7CisKKwkvKiBpcyB0aGUgdm9sdW1lIGFscmVhZHkgYWN0aXZlPyAqLworCWlmICh2bG9jYXRpb24tPnZvbHNbdHlwZV0pIHsKKwkJLyogeWVzIC0gcmUtdXNlIGl0ICovCisJCXZvbHVtZSA9IHZsb2NhdGlvbi0+dm9sc1t0eXBlXTsKKwkJYWZzX2dldF92b2x1bWUodm9sdW1lKTsKKwkJZ290byBzdWNjZXNzOworCX0KKworCS8qIGNyZWF0ZSBhIG5ldyB2b2x1bWUgcmVjb3JkICovCisJX2RlYnVnKCJjcmVhdGluZyBuZXcgdm9sdW1lIHJlY29yZCIpOworCisJcmV0ID0gLUVOT01FTTsKKwl2b2x1bWUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWZzX3ZvbHVtZSksIEdGUF9LRVJORUwpOworCWlmICghdm9sdW1lKQorCQlnb3RvIGVycm9yX3VwOworCisJbWVtc2V0KHZvbHVtZSwgMCwgc2l6ZW9mKHN0cnVjdCBhZnNfdm9sdW1lKSk7CisJYXRvbWljX3NldCgmdm9sdW1lLT51c2FnZSwgMSk7CisJdm9sdW1lLT50eXBlCQk9IHR5cGU7CisJdm9sdW1lLT50eXBlX2ZvcmNlCT0gZm9yY2U7CisJdm9sdW1lLT5jZWxsCQk9IGNlbGw7CisJdm9sdW1lLT52aWQJCT0gdmxvY2F0aW9uLT52bGRiLnZpZFt0eXBlXTsKKworCWluaXRfcndzZW0oJnZvbHVtZS0+c2VydmVyX3NlbSk7CisKKwkvKiBsb29rIHVwIGFsbCB0aGUgYXBwbGljYWJsZSBzZXJ2ZXIgcmVjb3JkcyAqLworCWZvciAobG9vcCA9IDA7IGxvb3AgPCA4OyBsb29wKyspIHsKKwkJaWYgKHZsb2NhdGlvbi0+dmxkYi5zcnZ0bWFza1tsb29wXSAmICgxIDw8IHZvbHVtZS0+dHlwZSkpIHsKKwkJCXJldCA9IGFmc19zZXJ2ZXJfbG9va3VwKAorCQkJCXZvbHVtZS0+Y2VsbCwKKwkJCQkmdmxvY2F0aW9uLT52bGRiLnNlcnZlcnNbbG9vcF0sCisJCQkJJnZvbHVtZS0+c2VydmVyc1t2b2x1bWUtPm5zZXJ2ZXJzXSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIGVycm9yX2Rpc2NhcmQ7CisKKwkJCXZvbHVtZS0+bnNlcnZlcnMrKzsKKwkJfQorCX0KKworCS8qIGF0dGFjaCB0aGUgY2FjaGUgYW5kIHZvbHVtZSBsb2NhdGlvbiAqLworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKKwljYWNoZWZzX2FjcXVpcmVfY29va2llKHZsb2NhdGlvbi0+Y2FjaGUsCisJCQkgICAgICAgJmFmc192bm9kZV9jYWNoZV9pbmRleF9kZWYsCisJCQkgICAgICAgdm9sdW1lLAorCQkJICAgICAgICZ2b2x1bWUtPmNhY2hlKTsKKyNlbmRpZgorCisJYWZzX2dldF92bG9jYXRpb24odmxvY2F0aW9uKTsKKwl2b2x1bWUtPnZsb2NhdGlvbiA9IHZsb2NhdGlvbjsKKworCXZsb2NhdGlvbi0+dm9sc1t0eXBlXSA9IHZvbHVtZTsKKworIHN1Y2Nlc3M6CisJX2RlYnVnKCJrQUZTIHNlbGVjdGVkICVzIHZvbHVtZSAlMDh4IiwKKwkgICAgICAgYWZzX3ZvbHR5cGVzW3ZvbHVtZS0+dHlwZV0sIHZvbHVtZS0+dmlkKTsKKwkqX3ZvbHVtZSA9IHZvbHVtZTsKKwlyZXQgPSAwOworCisJLyogY2xlYW4gdXAgKi8KKyBlcnJvcl91cDoKKwl1cF93cml0ZSgmY2VsbC0+dmxfc2VtKTsKKyBlcnJvcjoKKwlhZnNfcHV0X3Zsb2NhdGlvbih2bG9jYXRpb24pOworCWFmc19wdXRfY2VsbChjZWxsKTsKKworCV9sZWF2ZSgiID0gJWQgKCVwKSIsIHJldCwgdm9sdW1lKTsKKwlyZXR1cm4gcmV0OworCisgZXJyb3JfZGlzY2FyZDoKKwl1cF93cml0ZSgmY2VsbC0+dmxfc2VtKTsKKworCWZvciAobG9vcCA9IHZvbHVtZS0+bnNlcnZlcnMgLSAxOyBsb29wID49IDA7IGxvb3AtLSkKKwkJYWZzX3B1dF9zZXJ2ZXIodm9sdW1lLT5zZXJ2ZXJzW2xvb3BdKTsKKworCWtmcmVlKHZvbHVtZSk7CisJZ290byBlcnJvcjsKK30gLyogZW5kIGFmc192b2x1bWVfbG9va3VwKCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGRlc3Ryb3kgYSB2b2x1bWUgcmVjb3JkCisgKi8KK3ZvaWQgYWZzX3B1dF92b2x1bWUoc3RydWN0IGFmc192b2x1bWUgKnZvbHVtZSkKK3sKKwlzdHJ1Y3QgYWZzX3Zsb2NhdGlvbiAqdmxvY2F0aW9uOworCWludCBsb29wOworCisJaWYgKCF2b2x1bWUpCisJCXJldHVybjsKKworCV9lbnRlcigiJXAiLCB2b2x1bWUpOworCisJdmxvY2F0aW9uID0gdm9sdW1lLT52bG9jYXRpb247CisKKwkvKiBzYW5pdHkgY2hlY2sgKi8KKwlCVUdfT04oYXRvbWljX3JlYWQoJnZvbHVtZS0+dXNhZ2UpIDw9IDApOworCisJLyogdG8gcHJldmVudCBhIHJhY2UsIHRoZSBkZWNyZW1lbnQgYW5kIHRoZSBkZXF1ZXVlIG11c3QgYmUgZWZmZWN0aXZlbHkKKwkgKiBhdG9taWMgKi8KKwlkb3duX3dyaXRlKCZ2bG9jYXRpb24tPmNlbGwtPnZsX3NlbSk7CisKKwlpZiAobGlrZWx5KCFhdG9taWNfZGVjX2FuZF90ZXN0KCZ2b2x1bWUtPnVzYWdlKSkpIHsKKwkJdXBfd3JpdGUoJnZsb2NhdGlvbi0+Y2VsbC0+dmxfc2VtKTsKKwkJX2xlYXZlKCIiKTsKKwkJcmV0dXJuOworCX0KKworCXZsb2NhdGlvbi0+dm9sc1t2b2x1bWUtPnR5cGVdID0gTlVMTDsKKworCXVwX3dyaXRlKCZ2bG9jYXRpb24tPmNlbGwtPnZsX3NlbSk7CisKKwkvKiBmaW5pc2ggY2xlYW5pbmcgdXAgdGhlIHZvbHVtZSAqLworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKKwljYWNoZWZzX3JlbGlucXVpc2hfY29va2llKHZvbHVtZS0+Y2FjaGUsIDApOworI2VuZGlmCisJYWZzX3B1dF92bG9jYXRpb24odmxvY2F0aW9uKTsKKworCWZvciAobG9vcCA9IHZvbHVtZS0+bnNlcnZlcnMgLSAxOyBsb29wID49IDA7IGxvb3AtLSkKKwkJYWZzX3B1dF9zZXJ2ZXIodm9sdW1lLT5zZXJ2ZXJzW2xvb3BdKTsKKworCWtmcmVlKHZvbHVtZSk7CisKKwlfbGVhdmUoIiBbZGVzdHJveWVkXSIpOworfSAvKiBlbmQgYWZzX3B1dF92b2x1bWUoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogcGljayBhIHNlcnZlciB0byB1c2UgdG8gdHJ5IGFjY2Vzc2luZyB0aGlzIHZvbHVtZQorICogLSByZXR1cm5zIHdpdGggYW4gZWxldmF0ZWQgdXNhZ2UgY291bnQgb24gdGhlIHNlcnZlciBjaG9zZW4KKyAqLworaW50IGFmc192b2x1bWVfcGlja19maWxlc2VydmVyKHN0cnVjdCBhZnNfdm9sdW1lICp2b2x1bWUsCisJCQkgICAgICAgc3RydWN0IGFmc19zZXJ2ZXIgKipfc2VydmVyKQoreworCXN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXI7CisJaW50IHJldCwgc3RhdGUsIGxvb3A7CisKKwlfZW50ZXIoIiVzIiwgdm9sdW1lLT52bG9jYXRpb24tPnZsZGIubmFtZSk7CisKKwlkb3duX3JlYWQoJnZvbHVtZS0+c2VydmVyX3NlbSk7CisKKwkvKiBoYW5kbGUgdGhlIG5vLXNlcnZlciBjYXNlICovCisJaWYgKHZvbHVtZS0+bnNlcnZlcnMgPT0gMCkgeworCQlyZXQgPSB2b2x1bWUtPnJqc2VydmVycyA/IC1FTk9NRURJVU0gOiAtRVNUQUxFOworCQl1cF9yZWFkKCZ2b2x1bWUtPnNlcnZlcl9zZW0pOworCQlfbGVhdmUoIiA9ICVkIFtubyBzZXJ2ZXJzXSIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogYmFzaWNhbGx5LCBqdXN0IHNlYXJjaCB0aGUgbGlzdCBmb3IgdGhlIGZpcnN0IGxpdmUgc2VydmVyIGFuZCB1c2UKKwkgKiB0aGF0ICovCisJcmV0ID0gMDsKKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgdm9sdW1lLT5uc2VydmVyczsgbG9vcCsrKSB7CisJCXNlcnZlciA9IHZvbHVtZS0+c2VydmVyc1tsb29wXTsKKwkJc3RhdGUgPSBzZXJ2ZXItPmZzX3N0YXRlOworCisJCXN3aXRjaCAoc3RhdGUpIHsKKwkJCS8qIGZvdW5kIGFuIGFwcGFyZW50bHkgaGVhbHRoeSBzZXJ2ZXIgKi8KKwkJY2FzZSAwOgorCQkJYWZzX2dldF9zZXJ2ZXIoc2VydmVyKTsKKwkJCXVwX3JlYWQoJnZvbHVtZS0+c2VydmVyX3NlbSk7CisJCQkqX3NlcnZlciA9IHNlcnZlcjsKKwkJCV9sZWF2ZSgiID0gMCAocGlja2VkICUwOHgpIiwKKwkJCSAgICAgICBudG9obChzZXJ2ZXItPmFkZHIuc19hZGRyKSk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIC1FTkVUVU5SRUFDSDoKKwkJCWlmIChyZXQgPT0gMCkKKwkJCQlyZXQgPSBzdGF0ZTsKKwkJCWJyZWFrOworCisJCWNhc2UgLUVIT1NUVU5SRUFDSDoKKwkJCWlmIChyZXQgPT0gMCB8fAorCQkJICAgIHJldCA9PSAtRU5FVFVOUkVBQ0gpCisJCQkJcmV0ID0gc3RhdGU7CisJCQlicmVhazsKKworCQljYXNlIC1FQ09OTlJFRlVTRUQ6CisJCQlpZiAocmV0ID09IDAgfHwKKwkJCSAgICByZXQgPT0gLUVORVRVTlJFQUNIIHx8CisJCQkgICAgcmV0ID09IC1FSE9TVFVOUkVBQ0gpCisJCQkJcmV0ID0gc3RhdGU7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQljYXNlIC1FUkVNT1RFSU86CisJCQlpZiAocmV0ID09IDAgfHwKKwkJCSAgICByZXQgPT0gLUVORVRVTlJFQUNIIHx8CisJCQkgICAgcmV0ID09IC1FSE9TVFVOUkVBQ0ggfHwKKwkJCSAgICByZXQgPT0gLUVDT05OUkVGVVNFRCkKKwkJCQlyZXQgPSBzdGF0ZTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogbm8gYXZhaWxhYmxlIHNlcnZlcnMKKwkgKiAtIFRPRE86IGhhbmRsZSB0aGUgbm8gYWN0aXZlIHNlcnZlcnMgY2FzZSBiZXR0ZXIKKwkgKi8KKwl1cF9yZWFkKCZ2b2x1bWUtPnNlcnZlcl9zZW0pOworCV9sZWF2ZSgiID0gJWQiLCByZXQpOworCXJldHVybiByZXQ7Cit9IC8qIGVuZCBhZnNfdm9sdW1lX3BpY2tfZmlsZXNlcnZlcigpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiByZWxlYXNlIGEgc2VydmVyIGFmdGVyIHVzZQorICogLSByZWxlYXNlcyB0aGUgcmVmIG9uIHRoZSBzZXJ2ZXIgc3RydWN0IHRoYXQgd2FzIGFjcXVpcmVkIGJ5IHBpY2tpbmcKKyAqIC0gcmVjb3JkcyByZXN1bHQgb2YgdXNpbmcgYSBwYXJ0aWN1bGFyIHNlcnZlciB0byBhY2Nlc3MgYSB2b2x1bWUKKyAqIC0gcmV0dXJuIDAgdG8gdHJ5IGFnYWluLCAxIGlmIG9rYXkgb3IgdG8gaXNzdWUgZXJyb3IKKyAqLworaW50IGFmc192b2x1bWVfcmVsZWFzZV9maWxlc2VydmVyKHN0cnVjdCBhZnNfdm9sdW1lICp2b2x1bWUsCisJCQkJICBzdHJ1Y3QgYWZzX3NlcnZlciAqc2VydmVyLAorCQkJCSAgaW50IHJlc3VsdCkKK3sKKwl1bnNpZ25lZCBsb29wOworCisJX2VudGVyKCIlcywlMDh4LCVkIiwKKwkgICAgICAgdm9sdW1lLT52bG9jYXRpb24tPnZsZGIubmFtZSwgbnRvaGwoc2VydmVyLT5hZGRyLnNfYWRkciksCisJICAgICAgIHJlc3VsdCk7CisKKwlzd2l0Y2ggKHJlc3VsdCkgeworCQkvKiBzdWNjZXNzICovCisJY2FzZSAwOgorCQlzZXJ2ZXItPmZzX2FjdF9qaWYgPSBqaWZmaWVzOworCQlicmVhazsKKworCQkvKiB0aGUgZmlsZXNlcnZlciBkZW5pZWQgYWxsIGtub3dsZWRnZSBvZiB0aGUgdm9sdW1lICovCisJY2FzZSAtRU5PTUVESVVNOgorCQlzZXJ2ZXItPmZzX2FjdF9qaWYgPSBqaWZmaWVzOworCQlkb3duX3dyaXRlKCZ2b2x1bWUtPnNlcnZlcl9zZW0pOworCisJCS8qIGZpcnN0LCBmaW5kIHdoZXJlIHRoZSBzZXJ2ZXIgaXMgaW4gdGhlIGFjdGl2ZSBsaXN0IChpZiBpdAorCQkgKiBpcykgKi8KKwkJZm9yIChsb29wID0gMDsgbG9vcCA8IHZvbHVtZS0+bnNlcnZlcnM7IGxvb3ArKykKKwkJCWlmICh2b2x1bWUtPnNlcnZlcnNbbG9vcF0gPT0gc2VydmVyKQorCQkJCWdvdG8gcHJlc2VudDsKKworCQkvKiBubyBsb25nZXIgdGhlcmUgLSBtYXkgaGF2ZSBiZWVuIGRpc2NhcmRlZCBieSBhbm90aGVyIG9wICovCisJCWdvdG8gdHJ5X25leHRfc2VydmVyX3VwdzsKKworCXByZXNlbnQ6CisJCXZvbHVtZS0+bnNlcnZlcnMtLTsKKwkJbWVtbW92ZSgmdm9sdW1lLT5zZXJ2ZXJzW2xvb3BdLAorCQkJJnZvbHVtZS0+c2VydmVyc1tsb29wICsgMV0sCisJCQlzaXplb2Yodm9sdW1lLT5zZXJ2ZXJzW2xvb3BdKSAqCisJCQkodm9sdW1lLT5uc2VydmVycyAtIGxvb3ApKTsKKwkJdm9sdW1lLT5zZXJ2ZXJzW3ZvbHVtZS0+bnNlcnZlcnNdID0gTlVMTDsKKwkJYWZzX3B1dF9zZXJ2ZXIoc2VydmVyKTsKKwkJdm9sdW1lLT5yanNlcnZlcnMrKzsKKworCQlpZiAodm9sdW1lLT5uc2VydmVycyA+IDApCisJCQkvKiBhbm90aGVyIHNlcnZlciBtaWdodCBhY2tub3dsZWRnZSBpdHMgZXhpc3RlbmNlICovCisJCQlnb3RvIHRyeV9uZXh0X3NlcnZlcl91cHc7CisKKwkJLyogaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGFsbCB0aGUgZmlsZXNlcnZlcnMgaGF2ZSByZWplY3RlZCB0aGUKKwkJICogdm9sdW1lCisJCSAqIC0gVE9ETzogdHJ5IGFza2luZyB0aGUgZmlsZXNlcnZlcnMgZm9yIHZvbHVtZSBpbmZvcm1hdGlvbgorCQkgKiAtIFRPRE86IGNvbnRhY3QgdGhlIFZMIHNlcnZlciBhZ2FpbiB0byBzZWUgaWYgdGhlIHZvbHVtZSBpcworCQkgKiAgICAgICAgIG5vIGxvbmdlciByZWdpc3RlcmVkCisJCSAqLworCQl1cF93cml0ZSgmdm9sdW1lLT5zZXJ2ZXJfc2VtKTsKKwkJYWZzX3B1dF9zZXJ2ZXIoc2VydmVyKTsKKwkJX2xlYXZlKCIgW2NvbXBsZXRlbHkgcmVqZWN0ZWRdIik7CisJCXJldHVybiAxOworCisJCS8qIHByb2JsZW0gcmVhY2hpbmcgdGhlIHNlcnZlciAqLworCWNhc2UgLUVORVRVTlJFQUNIOgorCWNhc2UgLUVIT1NUVU5SRUFDSDoKKwljYXNlIC1FQ09OTlJFRlVTRUQ6CisJY2FzZSAtRVRJTUVET1VUOgorCWNhc2UgLUVSRU1PVEVJTzoKKwkJLyogbWFyayB0aGUgc2VydmVyIGFzIGRlYWQKKwkJICogVE9ETzogdmFyeSBkZWFkIHRpbWVvdXQgZGVwZW5kaW5nIG9uIGVycm9yCisJCSAqLworCQlzcGluX2xvY2soJnNlcnZlci0+ZnNfbG9jayk7CisJCWlmICghc2VydmVyLT5mc19zdGF0ZSkgeworCQkJc2VydmVyLT5mc19kZWFkX2ppZiA9IGppZmZpZXMgKyBIWiAqIDEwOworCQkJc2VydmVyLT5mc19zdGF0ZSA9IHJlc3VsdDsKKwkJCXByaW50aygia0FGUzogU0VSVkVSIERFQUQgc3RhdGU9JWRcbiIsIHJlc3VsdCk7CisJCX0KKwkJc3Bpbl91bmxvY2soJnNlcnZlci0+ZnNfbG9jayk7CisJCWdvdG8gdHJ5X25leHRfc2VydmVyOworCisJCS8qIG1pc2NlbGxhbmVvdXMgZXJyb3IgKi8KKwlkZWZhdWx0OgorCQlzZXJ2ZXItPmZzX2FjdF9qaWYgPSBqaWZmaWVzOworCWNhc2UgLUVOT01FTToKKwljYXNlIC1FTk9ORVQ6CisJCWJyZWFrOworCX0KKworCS8qIHRlbGwgdGhlIGNhbGxlciB0byBhY2NlcHQgdGhlIHJlc3VsdCAqLworCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CisJX2xlYXZlKCIiKTsKKwlyZXR1cm4gMTsKKworCS8qIHRlbGwgdGhlIGNhbGxlciB0byBsb29wIGFyb3VuZCBhbmQgdHJ5IHRoZSBuZXh0IHNlcnZlciAqLworIHRyeV9uZXh0X3NlcnZlcl91cHc6CisJdXBfd3JpdGUoJnZvbHVtZS0+c2VydmVyX3NlbSk7CisgdHJ5X25leHRfc2VydmVyOgorCWFmc19wdXRfc2VydmVyKHNlcnZlcik7CisJX2xlYXZlKCIgW3RyeSBuZXh0IHNlcnZlcl0iKTsKKwlyZXR1cm4gMDsKKworfSAvKiBlbmQgYWZzX3ZvbHVtZV9yZWxlYXNlX2ZpbGVzZXJ2ZXIoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogbWF0Y2ggYSB2b2x1bWUgaGFzaCByZWNvcmQgc3RvcmVkIGluIHRoZSBjYWNoZQorICovCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorc3RhdGljIGNhY2hlZnNfbWF0Y2hfdmFsX3QgYWZzX3ZvbHVtZV9jYWNoZV9tYXRjaCh2b2lkICp0YXJnZXQsCisJCQkJCQkgIGNvbnN0IHZvaWQgKmVudHJ5KQoreworCWNvbnN0IHN0cnVjdCBhZnNfY2FjaGVfdmhhc2ggKnZoYXNoID0gZW50cnk7CisJc3RydWN0IGFmc192b2x1bWUgKnZvbHVtZSA9IHRhcmdldDsKKworCV9lbnRlcigieyV1fSx7JXV9Iiwgdm9sdW1lLT50eXBlLCB2aGFzaC0+dnR5cGUpOworCisJaWYgKHZvbHVtZS0+dHlwZSA9PSB2aGFzaC0+dnR5cGUpIHsKKwkJX2xlYXZlKCIgPSBTVUNDRVNTIik7CisJCXJldHVybiBDQUNIRUZTX01BVENIX1NVQ0NFU1M7CisJfQorCisJX2xlYXZlKCIgPSBGQUlMRUQiKTsKKwlyZXR1cm4gQ0FDSEVGU19NQVRDSF9GQUlMRUQ7Cit9IC8qIGVuZCBhZnNfdm9sdW1lX2NhY2hlX21hdGNoKCkgKi8KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogdXBkYXRlIGEgdm9sdW1lIGhhc2ggcmVjb3JkIHN0b3JlZCBpbiB0aGUgY2FjaGUKKyAqLworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKK3N0YXRpYyB2b2lkIGFmc192b2x1bWVfY2FjaGVfdXBkYXRlKHZvaWQgKnNvdXJjZSwgdm9pZCAqZW50cnkpCit7CisJc3RydWN0IGFmc19jYWNoZV92aGFzaCAqdmhhc2ggPSBlbnRyeTsKKwlzdHJ1Y3QgYWZzX3ZvbHVtZSAqdm9sdW1lID0gc291cmNlOworCisJX2VudGVyKCIiKTsKKworCXZoYXNoLT52dHlwZSA9IHZvbHVtZS0+dHlwZTsKKworfSAvKiBlbmQgYWZzX3ZvbHVtZV9jYWNoZV91cGRhdGUoKSAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9hZnMvdm9sdW1lLmggYi9mcy9hZnMvdm9sdW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU2OTE4OAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Fmcy92b2x1bWUuaApAQCAtMCwwICsxLDE0MiBAQAorLyogdm9sdW1lLmg6IEFGUyB2b2x1bWUgbWFuYWdlbWVudAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9BRlNfVk9MVU1FX0gKKyNkZWZpbmUgX0xJTlVYX0FGU19WT0xVTUVfSAorCisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJmc2NsaWVudC5oIgorI2luY2x1ZGUgImthZnN0aW1vZC5oIgorI2luY2x1ZGUgImthZnNhc3luY2QuaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorCisjZGVmaW5lIF9fcGFja2VkIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpCisKK3R5cGVkZWYgZW51bSB7CisJQUZTX1ZMVVBEX1NMRUVQLAkJLyogc2xlZXBpbmcgd2FpdGluZyBmb3IgdXBkYXRlIHRpbWVyIHRvIGZpcmUgKi8KKwlBRlNfVkxVUERfUEVORElORywJCS8qIG9uIHBlbmRpbmcgcXVldWUgKi8KKwlBRlNfVkxVUERfSU5QUk9HUkVTUywJCS8qIG9wIGluIHByb2dyZXNzICovCisJQUZTX1ZMVVBEX0JVU1lTTEVFUCwJCS8qIHNsZWVwaW5nIGJlY2F1c2Ugc2VydmVyIHJldHVybmVkIEVCVVNZICovCisJCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGFmc192bG9jYXRpb25fdXBkX3Q7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBlbnRyeSBpbiB0aGUgY2FjaGVkIHZvbHVtZSBsb2NhdGlvbiBjYXRhbG9ndWUKKyAqLworc3RydWN0IGFmc19jYWNoZV92bG9jYXRpb24KK3sKKwl1aW50OF90CQkJbmFtZVs2NF07CS8qIHZvbHVtZSBuYW1lIChsb3dlcmNhc2UsIHBhZGRlZCB3aXRoIE5VTHMpICovCisJdWludDhfdAkJCW5zZXJ2ZXJzOwkvKiBudW1iZXIgb2YgZW50cmllcyB1c2VkIGluIHNlcnZlcnNbXSAqLworCXVpbnQ4X3QJCQl2aWRtYXNrOwkvKiB2b2x0eXBlIG1hc2sgZm9yIHZpZFtdICovCisJdWludDhfdAkJCXNydnRtYXNrWzhdOwkvKiB2b2x0eXBlIG1hc2tzIGZvciBzZXJ2ZXJzW10gKi8KKyNkZWZpbmUgQUZTX1ZPTF9WVE1fUlcJMHgwMSAvKiBSL1cgdmVyc2lvbiBvZiB0aGUgdm9sdW1lIGlzIGF2YWlsYWJsZSAob24gdGhpcyBzZXJ2ZXIpICovCisjZGVmaW5lIEFGU19WT0xfVlRNX1JPCTB4MDIgLyogUi9PIHZlcnNpb24gb2YgdGhlIHZvbHVtZSBpcyBhdmFpbGFibGUgKG9uIHRoaXMgc2VydmVyKSAqLworI2RlZmluZSBBRlNfVk9MX1ZUTV9CQUsJMHgwNCAvKiBiYWNrdXAgdmVyc2lvbiBvZiB0aGUgdm9sdW1lIGlzIGF2YWlsYWJsZSAob24gdGhpcyBzZXJ2ZXIpICovCisKKwlhZnNfdm9saWRfdAkJdmlkWzNdOwkJLyogdm9sdW1lIElEcyBmb3IgUi9XLCBSL08gYW5kIEJhayB2b2x1bWVzICovCisJc3RydWN0IGluX2FkZHIJCXNlcnZlcnNbOF07CS8qIGZpbGVzZXJ2ZXIgYWRkcmVzc2VzICovCisJdGltZV90CQkJcnRpbWU7CQkvKiBsYXN0IHJldHJpZXZhbCB0aW1lICovCit9OworCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorZXh0ZXJuIHN0cnVjdCBjYWNoZWZzX2luZGV4X2RlZiBhZnNfdmxvY2F0aW9uX2NhY2hlX2luZGV4X2RlZjsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogdm9sdW1lIC0+IHZub2RlIGhhc2ggdGFibGUgZW50cnkKKyAqLworc3RydWN0IGFmc19jYWNoZV92aGFzaAoreworCWFmc192b2x0eXBlX3QJCXZ0eXBlOwkJLyogd2hpY2ggdm9sdW1lIHZhcmlhdGlvbiAqLworCXVpbnQ4X3QJCQloYXNoX2J1Y2tldDsJLyogd2hpY2ggaGFzaCBidWNrZXQgdGhpcyByZXByZXNlbnRzICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorZXh0ZXJuIHN0cnVjdCBjYWNoZWZzX2luZGV4X2RlZiBhZnNfdm9sdW1lX2NhY2hlX2luZGV4X2RlZjsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQUZTIHZvbHVtZSBsb2NhdGlvbiByZWNvcmQKKyAqLworc3RydWN0IGFmc192bG9jYXRpb24KK3sKKwlhdG9taWNfdAkJdXNhZ2U7CisJc3RydWN0IGxpc3RfaGVhZAlsaW5rOwkJLyogbGluayBpbiBjZWxsIHZvbHVtZSBsb2NhdGlvbiBsaXN0ICovCisJc3RydWN0IGFmc190aW1lcgl0aW1lb3V0OwkvKiBkZWNhY2hpbmcgdGltZXIgKi8KKwlzdHJ1Y3QgYWZzX2NlbGwJCSpjZWxsOwkJLyogY2VsbCB0byB3aGljaCB2b2x1bWUgYmVsb25ncyAqLworI2lmZGVmIEFGU19DQUNISU5HX1NVUFBPUlQKKwlzdHJ1Y3QgY2FjaGVmc19jb29raWUJKmNhY2hlOwkJLyogY2FjaGluZyBjb29raWUgKi8KKyNlbmRpZgorCXN0cnVjdCBhZnNfY2FjaGVfdmxvY2F0aW9uIHZsZGI7CS8qIHZvbHVtZSBpbmZvcm1hdGlvbiBEQiByZWNvcmQgKi8KKwlzdHJ1Y3QgYWZzX3ZvbHVtZQkqdm9sc1szXTsJLyogdm9sdW1lIGFjY2VzcyByZWNvcmQgcG9pbnRlciAoaW5kZXggYnkgdHlwZSkgKi8KKwlyd2xvY2tfdAkJbG9jazsJCS8qIGFjY2VzcyBsb2NrICovCisJdW5zaWduZWQgbG9uZwkJcmVhZF9qaWY7CS8qIHRpbWUgYXQgd2hpY2ggbGFzdCByZWFkIGZyb20gdmxzZXJ2ZXIgKi8KKwlzdHJ1Y3QgYWZzX3RpbWVyCXVwZF90aW1lcjsJLyogdXBkYXRlIHRpbWVyICovCisJc3RydWN0IGFmc19hc3luY19vcAl1cGRfb3A7CQkvKiB1cGRhdGUgb3BlcmF0aW9uICovCisJYWZzX3Zsb2NhdGlvbl91cGRfdAl1cGRfc3RhdGU7CS8qIHVwZGF0ZSBzdGF0ZSAqLworCXVuc2lnbmVkIHNob3J0CQl1cGRfZmlyc3Rfc3ZpeDsJLyogZmlyc3Qgc2VydmVyIGluZGV4IGR1cmluZyB1cGRhdGUgKi8KKwl1bnNpZ25lZCBzaG9ydAkJdXBkX2N1cnJfc3ZpeDsJLyogY3VycmVudCBzZXJ2ZXIgaW5kZXggZHVyaW5nIHVwZGF0ZSAqLworCXVuc2lnbmVkIHNob3J0CQl1cGRfcmVqX2NudDsJLyogRU5PTUVESVVNIGNvdW50IGR1cmluZyB1cGRhdGUgKi8KKwl1bnNpZ25lZCBzaG9ydAkJdXBkX2J1c3lfY250OwkvKiBFQlVTWSBjb3VudCBkdXJpbmcgdXBkYXRlICovCisJdW5zaWduZWQgc2hvcnQJCXZhbGlkOwkJLyogVCBpZiB2YWxpZCAqLworfTsKKworZXh0ZXJuIGludCBhZnNfdmxvY2F0aW9uX2xvb2t1cChzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwsCisJCQkJY29uc3QgY2hhciAqbmFtZSwKKwkJCQl1bnNpZ25lZCBuYW1lc3osCisJCQkJc3RydWN0IGFmc192bG9jYXRpb24gKipfdmxvY2F0aW9uKTsKKworI2RlZmluZSBhZnNfZ2V0X3Zsb2NhdGlvbihWKSBkbyB7IGF0b21pY19pbmMoJihWKS0+dXNhZ2UpOyB9IHdoaWxlKDApCisKK2V4dGVybiB2b2lkIGFmc19wdXRfdmxvY2F0aW9uKHN0cnVjdCBhZnNfdmxvY2F0aW9uICp2bG9jYXRpb24pOworZXh0ZXJuIHZvaWQgYWZzX3Zsb2NhdGlvbl9kb190aW1lb3V0KHN0cnVjdCBhZnNfdmxvY2F0aW9uICp2bG9jYXRpb24pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogQUZTIHZvbHVtZSBhY2Nlc3MgcmVjb3JkCisgKi8KK3N0cnVjdCBhZnNfdm9sdW1lCit7CisJYXRvbWljX3QJCXVzYWdlOworCXN0cnVjdCBhZnNfY2VsbAkJKmNlbGw7CQkvKiBjZWxsIHRvIHdoaWNoIGJlbG9uZ3MgKHVucmVmZCBwdHIpICovCisJc3RydWN0IGFmc192bG9jYXRpb24JKnZsb2NhdGlvbjsJLyogdm9sdW1lIGxvY2F0aW9uICovCisjaWZkZWYgQUZTX0NBQ0hJTkdfU1VQUE9SVAorCXN0cnVjdCBjYWNoZWZzX2Nvb2tpZQkqY2FjaGU7CQkvKiBjYWNoaW5nIGNvb2tpZSAqLworI2VuZGlmCisJYWZzX3ZvbGlkX3QJCXZpZDsJCS8qIHZvbHVtZSBJRCAqLworCWFmc192b2x0eXBlX3QgX19wYWNrZWQJdHlwZTsJCS8qIHR5cGUgb2Ygdm9sdW1lICovCisJY2hhcgkJCXR5cGVfZm9yY2U7CS8qIGZvcmNlIHZvbHVtZSB0eXBlIChzdXBwcmVzcyBSL08gLT4gUi9XKSAqLworCXVuc2lnbmVkIHNob3J0CQluc2VydmVyczsJLyogbnVtYmVyIG9mIHNlcnZlciBzbG90cyBmaWxsZWQgKi8KKwl1bnNpZ25lZCBzaG9ydAkJcmpzZXJ2ZXJzOwkvKiBudW1iZXIgb2Ygc2VydmVycyBkaXNjYXJkZWQgZHVlIHRvIC1FTk9NRURJVU0gKi8KKwlzdHJ1Y3QgYWZzX3NlcnZlcgkqc2VydmVyc1s4XTsJLyogc2VydmVycyBvbiB3aGljaCB2b2x1bWUgcmVzaWRlcyAob3JkZXJlZCkgKi8KKwlzdHJ1Y3Qgcndfc2VtYXBob3JlCXNlcnZlcl9zZW07CS8qIGxvY2sgZm9yIGFjY2Vzc2luZyBjdXJyZW50IHNlcnZlciAqLworfTsKKworZXh0ZXJuIGludCBhZnNfdm9sdW1lX2xvb2t1cChjb25zdCBjaGFyICpuYW1lLAorCQkJICAgICBzdHJ1Y3QgYWZzX2NlbGwgKmNlbGwsCisJCQkgICAgIGludCByd3BhdGgsCisJCQkgICAgIHN0cnVjdCBhZnNfdm9sdW1lICoqX3ZvbHVtZSk7CisKKyNkZWZpbmUgYWZzX2dldF92b2x1bWUoVikgZG8geyBhdG9taWNfaW5jKCYoViktPnVzYWdlKTsgfSB3aGlsZSgwKQorCitleHRlcm4gdm9pZCBhZnNfcHV0X3ZvbHVtZShzdHJ1Y3QgYWZzX3ZvbHVtZSAqdm9sdW1lKTsKKworZXh0ZXJuIGludCBhZnNfdm9sdW1lX3BpY2tfZmlsZXNlcnZlcihzdHJ1Y3QgYWZzX3ZvbHVtZSAqdm9sdW1lLAorCQkJCSAgICAgIHN0cnVjdCBhZnNfc2VydmVyICoqX3NlcnZlcik7CisKK2V4dGVybiBpbnQgYWZzX3ZvbHVtZV9yZWxlYXNlX2ZpbGVzZXJ2ZXIoc3RydWN0IGFmc192b2x1bWUgKnZvbHVtZSwKKwkJCQkJIHN0cnVjdCBhZnNfc2VydmVyICpzZXJ2ZXIsCisJCQkJCSBpbnQgcmVzdWx0KTsKKworI2VuZGlmIC8qIF9MSU5VWF9BRlNfVk9MVU1FX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2Fpby5jIGIvZnMvYWlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA2YTI2NjcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9haW8uYwpAQCAtMCwwICsxLDE3MjkgQEAKKy8qCisgKglBbiBhc3luYyBJTyBpbXBsZW1lbnRhdGlvbiBmb3IgTGludXgKKyAqCVdyaXR0ZW4gYnkgQmVuamFtaW4gTGFIYWlzZSA8YmNybEBrdmFjay5vcmc+CisgKgorICoJSW1wbGVtZW50cyBhbiBlZmZpY2llbnQgYXN5bmNocm9ub3VzIGlvIGludGVyZmFjZS4KKyAqCisgKglDb3B5cmlnaHQgMjAwMCwgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqCVNlZSAuLi9DT1BZSU5HIGZvciBsaWNlbnNpbmcgdGVybXMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvYWlvX2FiaS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisKKyNkZWZpbmUgREVCVUcgMAorCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9haW8uaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKworI2luY2x1ZGUgPGFzbS9rbWFwX3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KKworI2lmIERFQlVHID4gMQorI2RlZmluZSBkcHJpbnRrCQlwcmludGsKKyNlbHNlCisjZGVmaW5lIGRwcmludGsoeC4uLikJZG8geyA7IH0gd2hpbGUgKDApCisjZW5kaWYKKworbG9uZyBhaW9fcnVuID0gMDsgLyogZm9yIHRlc3Rpbmcgb25seSAqLworbG9uZyBhaW9fd2FrZXVwcyA9IDA7IC8qIGZvciB0ZXN0aW5nIG9ubHkgKi8KKworLyotLS0tLS0gc3lzY3RsIHZhcmlhYmxlcy0tLS0qLworYXRvbWljX3QgYWlvX25yID0gQVRPTUlDX0lOSVQoMCk7CS8qIGN1cnJlbnQgc3lzdGVtIHdpZGUgbnVtYmVyIG9mIGFpbyByZXF1ZXN0cyAqLwordW5zaWduZWQgYWlvX21heF9uciA9IDB4MTAwMDA7CS8qIHN5c3RlbSB3aWRlIG1heGltdW0gbnVtYmVyIG9mIGFpbyByZXF1ZXN0cyAqLworLyotLS0tZW5kIHN5c2N0bCB2YXJpYWJsZXMtLS0qLworCitzdGF0aWMga21lbV9jYWNoZV90CSpraW9jYl9jYWNoZXA7CitzdGF0aWMga21lbV9jYWNoZV90CSpraW9jdHhfY2FjaGVwOworCitzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmFpb193cTsKKworLyogVXNlZCBmb3IgcmFyZSBmcHV0IGNvbXBsZXRpb24uICovCitzdGF0aWMgdm9pZCBhaW9fZnB1dF9yb3V0aW5lKHZvaWQgKik7CitzdGF0aWMgREVDTEFSRV9XT1JLKGZwdXRfd29yaywgYWlvX2ZwdXRfcm91dGluZSwgTlVMTCk7CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZnB1dF9sb2NrKTsKK0xJU1RfSEVBRChmcHV0X2hlYWQpOworCitzdGF0aWMgdm9pZCBhaW9fa2lja19oYW5kbGVyKHZvaWQgKik7CisKKy8qIGFpb19zZXR1cAorICoJQ3JlYXRlcyB0aGUgc2xhYiBjYWNoZXMgdXNlZCBieSB0aGUgYWlvIHJvdXRpbmVzLCBwYW5pYyBvbgorICoJZmFpbHVyZSBhcyB0aGlzIGlzIGRvbmUgZWFybHkgZHVyaW5nIHRoZSBib290IHNlcXVlbmNlLgorICovCitzdGF0aWMgaW50IF9faW5pdCBhaW9fc2V0dXAodm9pZCkKK3sKKwlraW9jYl9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgia2lvY2IiLCBzaXplb2Yoc3RydWN0IGtpb2NiKSwKKwkJCQkwLCBTTEFCX0hXQ0FDSEVfQUxJR058U0xBQl9QQU5JQywgTlVMTCwgTlVMTCk7CisJa2lvY3R4X2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJraW9jdHgiLCBzaXplb2Yoc3RydWN0IGtpb2N0eCksCisJCQkJMCwgU0xBQl9IV0NBQ0hFX0FMSUdOfFNMQUJfUEFOSUMsIE5VTEwsIE5VTEwpOworCisJYWlvX3dxID0gY3JlYXRlX3dvcmtxdWV1ZSgiYWlvIik7CisKKwlwcl9kZWJ1ZygiYWlvX3NldHVwOiBzaXplb2Yoc3RydWN0IHBhZ2UpID0gJWRcbiIsIChpbnQpc2l6ZW9mKHN0cnVjdCBwYWdlKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWlvX2ZyZWVfcmluZyhzdHJ1Y3Qga2lvY3R4ICpjdHgpCit7CisJc3RydWN0IGFpb19yaW5nX2luZm8gKmluZm8gPSAmY3R4LT5yaW5nX2luZm87CisJbG9uZyBpOworCisJZm9yIChpPTA7IGk8aW5mby0+bnJfcGFnZXM7IGkrKykKKwkJcHV0X3BhZ2UoaW5mby0+cmluZ19wYWdlc1tpXSk7CisKKwlpZiAoaW5mby0+bW1hcF9zaXplKSB7CisJCWRvd25fd3JpdGUoJmN0eC0+bW0tPm1tYXBfc2VtKTsKKwkJZG9fbXVubWFwKGN0eC0+bW0sIGluZm8tPm1tYXBfYmFzZSwgaW5mby0+bW1hcF9zaXplKTsKKwkJdXBfd3JpdGUoJmN0eC0+bW0tPm1tYXBfc2VtKTsKKwl9CisKKwlpZiAoaW5mby0+cmluZ19wYWdlcyAmJiBpbmZvLT5yaW5nX3BhZ2VzICE9IGluZm8tPmludGVybmFsX3BhZ2VzKQorCQlrZnJlZShpbmZvLT5yaW5nX3BhZ2VzKTsKKwlpbmZvLT5yaW5nX3BhZ2VzID0gTlVMTDsKKwlpbmZvLT5uciA9IDA7Cit9CisKK3N0YXRpYyBpbnQgYWlvX3NldHVwX3Jpbmcoc3RydWN0IGtpb2N0eCAqY3R4KQoreworCXN0cnVjdCBhaW9fcmluZyAqcmluZzsKKwlzdHJ1Y3QgYWlvX3JpbmdfaW5mbyAqaW5mbyA9ICZjdHgtPnJpbmdfaW5mbzsKKwl1bnNpZ25lZCBucl9ldmVudHMgPSBjdHgtPm1heF9yZXFzOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwlpbnQgbnJfcGFnZXM7CisKKwkvKiBDb21wZW5zYXRlIGZvciB0aGUgcmluZyBidWZmZXIncyBoZWFkL3RhaWwgb3ZlcmxhcCBlbnRyeSAqLworCW5yX2V2ZW50cyArPSAyOwkvKiAxIGlzIHJlcXVpcmVkLCAyIGZvciBnb29kIGx1Y2sgKi8KKworCXNpemUgPSBzaXplb2Yoc3RydWN0IGFpb19yaW5nKTsKKwlzaXplICs9IHNpemVvZihzdHJ1Y3QgaW9fZXZlbnQpICogbnJfZXZlbnRzOworCW5yX3BhZ2VzID0gKHNpemUgKyBQQUdFX1NJWkUtMSkgPj4gUEFHRV9TSElGVDsKKworCWlmIChucl9wYWdlcyA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJbnJfZXZlbnRzID0gKFBBR0VfU0laRSAqIG5yX3BhZ2VzIC0gc2l6ZW9mKHN0cnVjdCBhaW9fcmluZykpIC8gc2l6ZW9mKHN0cnVjdCBpb19ldmVudCk7CisKKwlpbmZvLT5uciA9IDA7CisJaW5mby0+cmluZ19wYWdlcyA9IGluZm8tPmludGVybmFsX3BhZ2VzOworCWlmIChucl9wYWdlcyA+IEFJT19SSU5HX1BBR0VTKSB7CisJCWluZm8tPnJpbmdfcGFnZXMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGFnZSAqKSAqIG5yX3BhZ2VzLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFpbmZvLT5yaW5nX3BhZ2VzKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCW1lbXNldChpbmZvLT5yaW5nX3BhZ2VzLCAwLCBzaXplb2Yoc3RydWN0IHBhZ2UgKikgKiBucl9wYWdlcyk7CisJfQorCisJaW5mby0+bW1hcF9zaXplID0gbnJfcGFnZXMgKiBQQUdFX1NJWkU7CisJZHByaW50aygiYXR0ZW1wdGluZyBtbWFwIG9mICVsdSBieXRlc1xuIiwgaW5mby0+bW1hcF9zaXplKTsKKwlkb3duX3dyaXRlKCZjdHgtPm1tLT5tbWFwX3NlbSk7CisJaW5mby0+bW1hcF9iYXNlID0gZG9fbW1hcChOVUxMLCAwLCBpbmZvLT5tbWFwX3NpemUsIAorCQkJCSAgUFJPVF9SRUFEfFBST1RfV1JJVEUsIE1BUF9BTk9OfE1BUF9QUklWQVRFLAorCQkJCSAgMCk7CisJaWYgKElTX0VSUigodm9pZCAqKWluZm8tPm1tYXBfYmFzZSkpIHsKKwkJdXBfd3JpdGUoJmN0eC0+bW0tPm1tYXBfc2VtKTsKKwkJcHJpbnRrKCJtbWFwIGVycjogJWxkXG4iLCAtaW5mby0+bW1hcF9iYXNlKTsKKwkJaW5mby0+bW1hcF9zaXplID0gMDsKKwkJYWlvX2ZyZWVfcmluZyhjdHgpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlkcHJpbnRrKCJtbWFwIGFkZHJlc3M6IDB4JTA4bHhcbiIsIGluZm8tPm1tYXBfYmFzZSk7CisJaW5mby0+bnJfcGFnZXMgPSBnZXRfdXNlcl9wYWdlcyhjdXJyZW50LCBjdHgtPm1tLAorCQkJCQlpbmZvLT5tbWFwX2Jhc2UsIG5yX3BhZ2VzLCAKKwkJCQkJMSwgMCwgaW5mby0+cmluZ19wYWdlcywgTlVMTCk7CisJdXBfd3JpdGUoJmN0eC0+bW0tPm1tYXBfc2VtKTsKKworCWlmICh1bmxpa2VseShpbmZvLT5ucl9wYWdlcyAhPSBucl9wYWdlcykpIHsKKwkJYWlvX2ZyZWVfcmluZyhjdHgpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwljdHgtPnVzZXJfaWQgPSBpbmZvLT5tbWFwX2Jhc2U7CisKKwlpbmZvLT5uciA9IG5yX2V2ZW50czsJCS8qIHRydXN0ZWQgY29weSAqLworCisJcmluZyA9IGttYXBfYXRvbWljKGluZm8tPnJpbmdfcGFnZXNbMF0sIEtNX1VTRVIwKTsKKwlyaW5nLT5uciA9IG5yX2V2ZW50czsJLyogdXNlciBjb3B5ICovCisJcmluZy0+aWQgPSBjdHgtPnVzZXJfaWQ7CisJcmluZy0+aGVhZCA9IHJpbmctPnRhaWwgPSAwOworCXJpbmctPm1hZ2ljID0gQUlPX1JJTkdfTUFHSUM7CisJcmluZy0+Y29tcGF0X2ZlYXR1cmVzID0gQUlPX1JJTkdfQ09NUEFUX0ZFQVRVUkVTOworCXJpbmctPmluY29tcGF0X2ZlYXR1cmVzID0gQUlPX1JJTkdfSU5DT01QQVRfRkVBVFVSRVM7CisJcmluZy0+aGVhZGVyX2xlbmd0aCA9IHNpemVvZihzdHJ1Y3QgYWlvX3JpbmcpOworCWt1bm1hcF9hdG9taWMocmluZywgS01fVVNFUjApOworCisJcmV0dXJuIDA7Cit9CisKKworLyogYWlvX3JpbmdfZXZlbnQ6IHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBldmVudCBhdCB0aGUgZ2l2ZW4gaW5kZXggZnJvbQorICoga21hcF9hdG9taWMoLCBrbSkuICBSZWxlYXNlIHRoZSBwb2ludGVyIHdpdGggcHV0X2Fpb19yaW5nX2V2ZW50KCk7CisgKi8KKyNkZWZpbmUgQUlPX0VWRU5UU19QRVJfUEFHRQkoUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBpb19ldmVudCkpCisjZGVmaW5lIEFJT19FVkVOVFNfRklSU1RfUEFHRQkoKFBBR0VfU0laRSAtIHNpemVvZihzdHJ1Y3QgYWlvX3JpbmcpKSAvIHNpemVvZihzdHJ1Y3QgaW9fZXZlbnQpKQorI2RlZmluZSBBSU9fRVZFTlRTX09GRlNFVAkoQUlPX0VWRU5UU19QRVJfUEFHRSAtIEFJT19FVkVOVFNfRklSU1RfUEFHRSkKKworI2RlZmluZSBhaW9fcmluZ19ldmVudChpbmZvLCBuciwga20pICh7CQkJCQlcCisJdW5zaWduZWQgcG9zID0gKG5yKSArIEFJT19FVkVOVFNfT0ZGU0VUOwkJCVwKKwlzdHJ1Y3QgaW9fZXZlbnQgKl9fZXZlbnQ7CQkJCQlcCisJX19ldmVudCA9IGttYXBfYXRvbWljKAkJCQkJCVwKKwkJCShpbmZvKS0+cmluZ19wYWdlc1twb3MgLyBBSU9fRVZFTlRTX1BFUl9QQUdFXSwga20pOyBcCisJX19ldmVudCArPSBwb3MgJSBBSU9fRVZFTlRTX1BFUl9QQUdFOwkJCQlcCisJX19ldmVudDsJCQkJCQkJXAorfSkKKworI2RlZmluZSBwdXRfYWlvX3JpbmdfZXZlbnQoZXZlbnQsIGttKSBkbyB7CVwKKwlzdHJ1Y3QgaW9fZXZlbnQgKl9fZXZlbnQgPSAoZXZlbnQpOwlcCisJKHZvaWQpX19ldmVudDsJCQkJXAorCWt1bm1hcF9hdG9taWMoKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpX19ldmVudCAmIFBBR0VfTUFTSyksIGttKTsgXAorfSB3aGlsZSgwKQorCisvKiBpb2N0eF9hbGxvYworICoJQWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyBhbiBpb2N0eC4gIFJldHVybnMgYW4gRVJSX1BUUiBpZiBpdCBmYWlsZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qga2lvY3R4ICppb2N0eF9hbGxvYyh1bnNpZ25lZCBucl9ldmVudHMpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqbW07CisJc3RydWN0IGtpb2N0eCAqY3R4OworCisJLyogUHJldmVudCBvdmVyZmxvd3MgKi8KKwlpZiAoKG5yX2V2ZW50cyA+ICgweDEwMDAwMDAwVSAvIHNpemVvZihzdHJ1Y3QgaW9fZXZlbnQpKSkgfHwKKwkgICAgKG5yX2V2ZW50cyA+ICgweDEwMDAwMDAwVSAvIHNpemVvZihzdHJ1Y3Qga2lvY2IpKSkpIHsKKwkJcHJfZGVidWcoIkVOT01FTTogbnJfZXZlbnRzIHRvbyBoaWdoXG4iKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJaWYgKG5yX2V2ZW50cyA+IGFpb19tYXhfbnIpCisJCXJldHVybiBFUlJfUFRSKC1FQUdBSU4pOworCisJY3R4ID0ga21lbV9jYWNoZV9hbGxvYyhraW9jdHhfY2FjaGVwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWN0eCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwltZW1zZXQoY3R4LCAwLCBzaXplb2YoKmN0eCkpOworCWN0eC0+bWF4X3JlcXMgPSBucl9ldmVudHM7CisJbW0gPSBjdHgtPm1tID0gY3VycmVudC0+bW07CisJYXRvbWljX2luYygmbW0tPm1tX2NvdW50KTsKKworCWF0b21pY19zZXQoJmN0eC0+dXNlcnMsIDEpOworCXNwaW5fbG9ja19pbml0KCZjdHgtPmN0eF9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmY3R4LT5yaW5nX2luZm8ucmluZ19sb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjdHgtPndhaXQpOworCisJSU5JVF9MSVNUX0hFQUQoJmN0eC0+YWN0aXZlX3JlcXMpOworCUlOSVRfTElTVF9IRUFEKCZjdHgtPnJ1bl9saXN0KTsKKwlJTklUX1dPUksoJmN0eC0+d3EsIGFpb19raWNrX2hhbmRsZXIsIGN0eCk7CisKKwlpZiAoYWlvX3NldHVwX3JpbmcoY3R4KSA8IDApCisJCWdvdG8gb3V0X2ZyZWVjdHg7CisKKwkvKiBsaW1pdCB0aGUgbnVtYmVyIG9mIHN5c3RlbSB3aWRlIGFpb3MgKi8KKwlhdG9taWNfYWRkKGN0eC0+bWF4X3JlcXMsICZhaW9fbnIpOwkvKiB1bmRvbmUgYnkgX19wdXRfaW9jdHggKi8KKwlpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJmFpb19ucikgPiBhaW9fbWF4X25yKSkKKwkJZ290byBvdXRfY2xlYW51cDsKKworCS8qIG5vdyBsaW5rIGludG8gZ2xvYmFsIGxpc3QuICBrbHVkZ2UuICBGSVhNRSAqLworCXdyaXRlX2xvY2soJm1tLT5pb2N0eF9saXN0X2xvY2spOworCWN0eC0+bmV4dCA9IG1tLT5pb2N0eF9saXN0OworCW1tLT5pb2N0eF9saXN0ID0gY3R4OworCXdyaXRlX3VubG9jaygmbW0tPmlvY3R4X2xpc3RfbG9jayk7CisKKwlkcHJpbnRrKCJhaW86IGFsbG9jYXRlZCBpb2N0eCAlcFslbGRdOiBtbT0lcCBtYXNrPTB4JXhcbiIsCisJCWN0eCwgY3R4LT51c2VyX2lkLCBjdXJyZW50LT5tbSwgY3R4LT5yaW5nX2luZm8ubnIpOworCXJldHVybiBjdHg7CisKK291dF9jbGVhbnVwOgorCWF0b21pY19zdWIoY3R4LT5tYXhfcmVxcywgJmFpb19ucik7CisJY3R4LT5tYXhfcmVxcyA9IDA7CS8qIHByZXZlbnQgX19wdXRfaW9jdHggZnJvbSBzdWInaW5nIGFpb19uciAqLworCV9fcHV0X2lvY3R4KGN0eCk7CisJcmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7CisKK291dF9mcmVlY3R4OgorCW1tZHJvcChtbSk7CisJa21lbV9jYWNoZV9mcmVlKGtpb2N0eF9jYWNoZXAsIGN0eCk7CisJY3R4ID0gRVJSX1BUUigtRU5PTUVNKTsKKworCWRwcmludGsoImFpbzogZXJyb3IgYWxsb2NhdGluZyBpb2N0eCAlcFxuIiwgY3R4KTsKKwlyZXR1cm4gY3R4OworfQorCisvKiBhaW9fY2FuY2VsX2FsbAorICoJQ2FuY2VscyBhbGwgb3V0c3RhbmRpbmcgYWlvIHJlcXVlc3RzIG9uIGFuIGFpbyBjb250ZXh0LiAgVXNlZCAKKyAqCXdoZW4gdGhlIHByb2Nlc3NlcyBvd25pbmcgYSBjb250ZXh0IGhhdmUgYWxsIGV4aXRlZCB0byBlbmNvdXJhZ2UgCisgKgl0aGUgcmFwaWQgZGVzdHJ1Y3Rpb24gb2YgdGhlIGtpb2N0eC4KKyAqLworc3RhdGljIHZvaWQgYWlvX2NhbmNlbF9hbGwoc3RydWN0IGtpb2N0eCAqY3R4KQoreworCWludCAoKmNhbmNlbCkoc3RydWN0IGtpb2NiICosIHN0cnVjdCBpb19ldmVudCAqKTsKKwlzdHJ1Y3QgaW9fZXZlbnQgcmVzOworCXNwaW5fbG9ja19pcnEoJmN0eC0+Y3R4X2xvY2spOworCWN0eC0+ZGVhZCA9IDE7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZjdHgtPmFjdGl2ZV9yZXFzKSkgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MgPSBjdHgtPmFjdGl2ZV9yZXFzLm5leHQ7CisJCXN0cnVjdCBraW9jYiAqaW9jYiA9IGxpc3Rfa2lvY2IocG9zKTsKKwkJbGlzdF9kZWxfaW5pdCgmaW9jYi0+a2lfbGlzdCk7CisJCWNhbmNlbCA9IGlvY2ItPmtpX2NhbmNlbDsKKwkJa2lvY2JTZXRDYW5jZWxsZWQoaW9jYik7CisJCWlmIChjYW5jZWwpIHsKKwkJCWlvY2ItPmtpX3VzZXJzKys7CisJCQlzcGluX3VubG9ja19pcnEoJmN0eC0+Y3R4X2xvY2spOworCQkJY2FuY2VsKGlvY2IsICZyZXMpOworCQkJc3Bpbl9sb2NrX2lycSgmY3R4LT5jdHhfbG9jayk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZjdHgtPmN0eF9sb2NrKTsKK30KKwordm9pZCB3YWl0X2Zvcl9hbGxfYWlvcyhzdHJ1Y3Qga2lvY3R4ICpjdHgpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIHRzayk7CisKKwlpZiAoIWN0eC0+cmVxc19hY3RpdmUpCisJCXJldHVybjsKKworCWFkZF93YWl0X3F1ZXVlKCZjdHgtPndhaXQsICZ3YWl0KTsKKwlzZXRfdGFza19zdGF0ZSh0c2ssIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwl3aGlsZSAoY3R4LT5yZXFzX2FjdGl2ZSkgeworCQlzY2hlZHVsZSgpOworCQlzZXRfdGFza19zdGF0ZSh0c2ssIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwl9CisJX19zZXRfdGFza19zdGF0ZSh0c2ssIFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJmN0eC0+d2FpdCwgJndhaXQpOworfQorCisvKiB3YWl0X29uX3N5bmNfa2lvY2I6CisgKglXYWl0cyBvbiB0aGUgZ2l2ZW4gc3luYyBraW9jYiB0byBjb21wbGV0ZS4KKyAqLworc3NpemVfdCBmYXN0Y2FsbCB3YWl0X29uX3N5bmNfa2lvY2Ioc3RydWN0IGtpb2NiICppb2NiKQoreworCXdoaWxlIChpb2NiLT5raV91c2VycykgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCWlmICghaW9jYi0+a2lfdXNlcnMpCisJCQlicmVhazsKKwkJc2NoZWR1bGUoKTsKKwl9CisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJldHVybiBpb2NiLT5raV91c2VyX2RhdGE7Cit9CisKKy8qIGV4aXRfYWlvOiBjYWxsZWQgd2hlbiB0aGUgbGFzdCB1c2VyIG9mIG1tIGdvZXMgYXdheS4gIEF0IHRoaXMgcG9pbnQsIAorICogdGhlcmUgaXMgbm8gd2F5IGZvciBhbnkgbmV3IHJlcXVlc3RzIHRvIGJlIHN1Ym1pdGVkIG9yIGFueSBvZiB0aGUgCisgKiBpb18qIHN5c2NhbGxzIHRvIGJlIGNhbGxlZCBvbiB0aGUgY29udGV4dC4gIEhvd2V2ZXIsIHRoZXJlIG1heSBiZSAKKyAqIG91dHN0YW5kaW5nIHJlcXVlc3RzIHdoaWNoIGhvbGQgcmVmZXJlbmNlcyB0byB0aGUgY29udGV4dDsgYXMgdGhleSAKKyAqIGdvIGF3YXksIHRoZXkgd2lsbCBjYWxsIHB1dF9pb2N0eCBhbmQgcmVsZWFzZSBhbnkgcGlubmVkIG1lbW9yeQorICogYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0IChoZWxkIHZpYSBzdHJ1Y3QgcGFnZSAqIHJlZmVyZW5jZXMpLgorICovCit2b2lkIGZhc3RjYWxsIGV4aXRfYWlvKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCXN0cnVjdCBraW9jdHggKmN0eCA9IG1tLT5pb2N0eF9saXN0OworCW1tLT5pb2N0eF9saXN0ID0gTlVMTDsKKwl3aGlsZSAoY3R4KSB7CisJCXN0cnVjdCBraW9jdHggKm5leHQgPSBjdHgtPm5leHQ7CisJCWN0eC0+bmV4dCA9IE5VTEw7CisJCWFpb19jYW5jZWxfYWxsKGN0eCk7CisKKwkJd2FpdF9mb3JfYWxsX2Fpb3MoY3R4KTsKKwkJLyoKKwkJICogdGhpcyBpcyBhbiBvdmVya2lsbCwgYnV0IGVuc3VyZXMgd2UgZG9uJ3QgbGVhdmUKKwkJICogdGhlIGN0eCBvbiB0aGUgYWlvX3dxCisJCSAqLworCQlmbHVzaF93b3JrcXVldWUoYWlvX3dxKTsKKworCQlpZiAoMSAhPSBhdG9taWNfcmVhZCgmY3R4LT51c2VycykpCisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSJleGl0X2Fpbzppb2N0eCBzdGlsbCBhbGl2ZTogJWQgJWQgJWRcbiIsCisJCQkJYXRvbWljX3JlYWQoJmN0eC0+dXNlcnMpLCBjdHgtPmRlYWQsCisJCQkJY3R4LT5yZXFzX2FjdGl2ZSk7CisJCXB1dF9pb2N0eChjdHgpOworCQljdHggPSBuZXh0OworCX0KK30KKworLyogX19wdXRfaW9jdHgKKyAqCUNhbGxlZCB3aGVuIHRoZSBsYXN0IHVzZXIgb2YgYW4gYWlvIGNvbnRleHQgaGFzIGdvbmUgYXdheSwKKyAqCWFuZCB0aGUgc3RydWN0IG5lZWRzIHRvIGJlIGZyZWVkLgorICovCit2b2lkIGZhc3RjYWxsIF9fcHV0X2lvY3R4KHN0cnVjdCBraW9jdHggKmN0eCkKK3sKKwl1bnNpZ25lZCBucl9ldmVudHMgPSBjdHgtPm1heF9yZXFzOworCisJaWYgKHVubGlrZWx5KGN0eC0+cmVxc19hY3RpdmUpKQorCQlCVUcoKTsKKworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmN0eC0+d3EpOworCWZsdXNoX3dvcmtxdWV1ZShhaW9fd3EpOworCWFpb19mcmVlX3JpbmcoY3R4KTsKKwltbWRyb3AoY3R4LT5tbSk7CisJY3R4LT5tbSA9IE5VTEw7CisJcHJfZGVidWcoIl9fcHV0X2lvY3R4OiBmcmVlaW5nICVwXG4iLCBjdHgpOworCWttZW1fY2FjaGVfZnJlZShraW9jdHhfY2FjaGVwLCBjdHgpOworCisJYXRvbWljX3N1Yihucl9ldmVudHMsICZhaW9fbnIpOworfQorCisvKiBhaW9fZ2V0X3JlcQorICoJQWxsb2NhdGUgYSBzbG90IGZvciBhbiBhaW8gcmVxdWVzdC4gIEluY3JlbWVudHMgdGhlIHVzZXJzIGNvdW50CisgKiBvZiB0aGUga2lvY3R4IHNvIHRoYXQgdGhlIGtpb2N0eCBzdGF5cyBhcm91bmQgdW50aWwgYWxsIHJlcXVlc3RzIGFyZQorICogY29tcGxldGUuICBSZXR1cm5zIE5VTEwgaWYgbm8gcmVxdWVzdHMgYXJlIGZyZWUuCisgKgorICogUmV0dXJucyB3aXRoIGtpb2NiLT51c2VycyBzZXQgdG8gMi4gIFRoZSBpbyBzdWJtaXQgY29kZSBwYXRoIGhvbGRzCisgKiBhbiBleHRyYSByZWZlcmVuY2Ugd2hpbGUgc3VibWl0dGluZyB0aGUgaS9vLgorICogVGhpcyBwcmV2ZW50cyByYWNlcyBiZXR3ZWVuIHRoZSBhaW8gY29kZSBwYXRoIHJlZmVyZW5jaW5nIHRoZQorICogcmVxIChhZnRlciBzdWJtaXR0aW5nIGl0KSBhbmQgYWlvX2NvbXBsZXRlKCkgZnJlZWluZyB0aGUgcmVxLgorICovCitzdGF0aWMgc3RydWN0IGtpb2NiICpGQVNUQ0FMTChfX2Fpb19nZXRfcmVxKHN0cnVjdCBraW9jdHggKmN0eCkpOworc3RhdGljIHN0cnVjdCBraW9jYiBmYXN0Y2FsbCAqX19haW9fZ2V0X3JlcShzdHJ1Y3Qga2lvY3R4ICpjdHgpCit7CisJc3RydWN0IGtpb2NiICpyZXEgPSBOVUxMOworCXN0cnVjdCBhaW9fcmluZyAqcmluZzsKKwlpbnQgb2theSA9IDA7CisKKwlyZXEgPSBrbWVtX2NhY2hlX2FsbG9jKGtpb2NiX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KCFyZXEpKQorCQlyZXR1cm4gTlVMTDsKKworCXJlcS0+a2lfZmxhZ3MgPSAxIDw8IEtJRl9MT0NLRUQ7CisJcmVxLT5raV91c2VycyA9IDI7CisJcmVxLT5raV9rZXkgPSAwOworCXJlcS0+a2lfY3R4ID0gY3R4OworCXJlcS0+a2lfY2FuY2VsID0gTlVMTDsKKwlyZXEtPmtpX3JldHJ5ID0gTlVMTDsKKwlyZXEtPmtpX29iai51c2VyID0gTlVMTDsKKwlyZXEtPmtpX2R0b3IgPSBOVUxMOworCXJlcS0+cHJpdmF0ZSA9IE5VTEw7CisJSU5JVF9MSVNUX0hFQUQoJnJlcS0+a2lfcnVuX2xpc3QpOworCisJLyogQ2hlY2sgaWYgdGhlIGNvbXBsZXRpb24gcXVldWUgaGFzIGVub3VnaCBmcmVlIHNwYWNlIHRvCisJICogYWNjZXB0IGFuIGV2ZW50IGZyb20gdGhpcyBpby4KKwkgKi8KKwlzcGluX2xvY2tfaXJxKCZjdHgtPmN0eF9sb2NrKTsKKwlyaW5nID0ga21hcF9hdG9taWMoY3R4LT5yaW5nX2luZm8ucmluZ19wYWdlc1swXSwgS01fVVNFUjApOworCWlmIChjdHgtPnJlcXNfYWN0aXZlIDwgYWlvX3JpbmdfYXZhaWwoJmN0eC0+cmluZ19pbmZvLCByaW5nKSkgeworCQlsaXN0X2FkZCgmcmVxLT5raV9saXN0LCAmY3R4LT5hY3RpdmVfcmVxcyk7CisJCWdldF9pb2N0eChjdHgpOworCQljdHgtPnJlcXNfYWN0aXZlKys7CisJCW9rYXkgPSAxOworCX0KKwlrdW5tYXBfYXRvbWljKHJpbmcsIEtNX1VTRVIwKTsKKwlzcGluX3VubG9ja19pcnEoJmN0eC0+Y3R4X2xvY2spOworCisJaWYgKCFva2F5KSB7CisJCWttZW1fY2FjaGVfZnJlZShraW9jYl9jYWNoZXAsIHJlcSk7CisJCXJlcSA9IE5VTEw7CisJfQorCisJcmV0dXJuIHJlcTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qga2lvY2IgKmFpb19nZXRfcmVxKHN0cnVjdCBraW9jdHggKmN0eCkKK3sKKwlzdHJ1Y3Qga2lvY2IgKnJlcTsKKwkvKiBIYW5kbGUgYSBwb3RlbnRpYWwgc3RhcnZhdGlvbiBjYXNlIC0tIHNob3VsZCBiZSBleGNlZWRpbmdseSByYXJlIGFzIAorCSAqIHJlcXVlc3RzIHdpbGwgYmUgc3R1Y2sgb24gZnB1dF9oZWFkIG9ubHkgaWYgdGhlIGFpb19mcHV0X3JvdXRpbmUgaXMgCisJICogZGVsYXllZCBhbmQgdGhlIHJlcXVlc3RzIHdlcmUgdGhlIGxhc3QgdXNlciBvZiB0aGUgc3RydWN0IGZpbGUuCisJICovCisJcmVxID0gX19haW9fZ2V0X3JlcShjdHgpOworCWlmICh1bmxpa2VseShOVUxMID09IHJlcSkpIHsKKwkJYWlvX2ZwdXRfcm91dGluZShOVUxMKTsKKwkJcmVxID0gX19haW9fZ2V0X3JlcShjdHgpOworCX0KKwlyZXR1cm4gcmVxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVhbGx5X3B1dF9yZXEoc3RydWN0IGtpb2N0eCAqY3R4LCBzdHJ1Y3Qga2lvY2IgKnJlcSkKK3sKKwlpZiAocmVxLT5raV9kdG9yKQorCQlyZXEtPmtpX2R0b3IocmVxKTsKKwlyZXEtPmtpX2N0eCA9IE5VTEw7CisJcmVxLT5raV9maWxwID0gTlVMTDsKKwlyZXEtPmtpX29iai51c2VyID0gTlVMTDsKKwlyZXEtPmtpX2R0b3IgPSBOVUxMOworCXJlcS0+cHJpdmF0ZSA9IE5VTEw7CisJa21lbV9jYWNoZV9mcmVlKGtpb2NiX2NhY2hlcCwgcmVxKTsKKwljdHgtPnJlcXNfYWN0aXZlLS07CisKKwlpZiAodW5saWtlbHkoIWN0eC0+cmVxc19hY3RpdmUgJiYgY3R4LT5kZWFkKSkKKwkJd2FrZV91cCgmY3R4LT53YWl0KTsKK30KKworc3RhdGljIHZvaWQgYWlvX2ZwdXRfcm91dGluZSh2b2lkICpkYXRhKQoreworCXNwaW5fbG9ja19pcnEoJmZwdXRfbG9jayk7CisJd2hpbGUgKGxpa2VseSghbGlzdF9lbXB0eSgmZnB1dF9oZWFkKSkpIHsKKwkJc3RydWN0IGtpb2NiICpyZXEgPSBsaXN0X2tpb2NiKGZwdXRfaGVhZC5uZXh0KTsKKwkJc3RydWN0IGtpb2N0eCAqY3R4ID0gcmVxLT5raV9jdHg7CisKKwkJbGlzdF9kZWwoJnJlcS0+a2lfbGlzdCk7CisJCXNwaW5fdW5sb2NrX2lycSgmZnB1dF9sb2NrKTsKKworCQkvKiBDb21wbGV0ZSB0aGUgZnB1dCAqLworCQlfX2ZwdXQocmVxLT5raV9maWxwKTsKKworCQkvKiBMaW5rIHRoZSBpb2NiIGludG8gdGhlIGNvbnRleHQncyBmcmVlIGxpc3QgKi8KKwkJc3Bpbl9sb2NrX2lycSgmY3R4LT5jdHhfbG9jayk7CisJCXJlYWxseV9wdXRfcmVxKGN0eCwgcmVxKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjdHgtPmN0eF9sb2NrKTsKKworCQlwdXRfaW9jdHgoY3R4KTsKKwkJc3Bpbl9sb2NrX2lycSgmZnB1dF9sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZmcHV0X2xvY2spOworfQorCisvKiBfX2Fpb19wdXRfcmVxCisgKglSZXR1cm5zIHRydWUgaWYgdGhpcyBwdXQgd2FzIHRoZSBsYXN0IHVzZXIgb2YgdGhlIHJlcXVlc3QuCisgKi8KK3N0YXRpYyBpbnQgX19haW9fcHV0X3JlcShzdHJ1Y3Qga2lvY3R4ICpjdHgsIHN0cnVjdCBraW9jYiAqcmVxKQoreworCWRwcmludGsoS0VSTl9ERUJVRyAiYWlvX3B1dCglcCk6IGZfY291bnQ9JWRcbiIsCisJCXJlcSwgYXRvbWljX3JlYWQoJnJlcS0+a2lfZmlscC0+Zl9jb3VudCkpOworCisJcmVxLT5raV91c2VycyAtLTsKKwlpZiAodW5saWtlbHkocmVxLT5raV91c2VycyA8IDApKQorCQlCVUcoKTsKKwlpZiAobGlrZWx5KHJlcS0+a2lfdXNlcnMpKQorCQlyZXR1cm4gMDsKKwlsaXN0X2RlbCgmcmVxLT5raV9saXN0KTsJCS8qIHJlbW92ZSBmcm9tIGFjdGl2ZV9yZXFzICovCisJcmVxLT5raV9jYW5jZWwgPSBOVUxMOworCXJlcS0+a2lfcmV0cnkgPSBOVUxMOworCisJLyogTXVzdCBiZSBkb25lIHVuZGVyIHRoZSBsb2NrIHRvIHNlcmlhbGlzZSBhZ2FpbnN0IGNhbmNlbGxhdGlvbi4KKwkgKiBDYWxsIHRoaXMgYWlvX2ZwdXQgYXMgaXQgZHVwbGljYXRlcyBmcHV0IHZpYSB0aGUgZnB1dF93b3JrLgorCSAqLworCWlmICh1bmxpa2VseShhdG9taWNfZGVjX2FuZF90ZXN0KCZyZXEtPmtpX2ZpbHAtPmZfY291bnQpKSkgeworCQlnZXRfaW9jdHgoY3R4KTsKKwkJc3Bpbl9sb2NrKCZmcHV0X2xvY2spOworCQlsaXN0X2FkZCgmcmVxLT5raV9saXN0LCAmZnB1dF9oZWFkKTsKKwkJc3Bpbl91bmxvY2soJmZwdXRfbG9jayk7CisJCXF1ZXVlX3dvcmsoYWlvX3dxLCAmZnB1dF93b3JrKTsKKwl9IGVsc2UKKwkJcmVhbGx5X3B1dF9yZXEoY3R4LCByZXEpOworCXJldHVybiAxOworfQorCisvKiBhaW9fcHV0X3JlcQorICoJUmV0dXJucyB0cnVlIGlmIHRoaXMgcHV0IHdhcyB0aGUgbGFzdCB1c2VyIG9mIHRoZSBraW9jYiwKKyAqCWZhbHNlIGlmIHRoZSByZXF1ZXN0IGlzIHN0aWxsIGluIHVzZS4KKyAqLworaW50IGZhc3RjYWxsIGFpb19wdXRfcmVxKHN0cnVjdCBraW9jYiAqcmVxKQoreworCXN0cnVjdCBraW9jdHggKmN0eCA9IHJlcS0+a2lfY3R4OworCWludCByZXQ7CisJc3Bpbl9sb2NrX2lycSgmY3R4LT5jdHhfbG9jayk7CisJcmV0ID0gX19haW9fcHV0X3JlcShjdHgsIHJlcSk7CisJc3Bpbl91bmxvY2tfaXJxKCZjdHgtPmN0eF9sb2NrKTsKKwlpZiAocmV0KQorCQlwdXRfaW9jdHgoY3R4KTsKKwlyZXR1cm4gcmV0OworfQorCisvKglMb29rdXAgYW4gaW9jdHggaWQuICBpb2N0eF9saXN0IGlzIGxvY2tsZXNzIGZvciByZWFkcy4KKyAqCUZJWE1FOiB0aGlzIGlzIE8obikgYW5kIGlzIG9ubHkgc3VpdGFibGUgZm9yIGRldmVsb3BtZW50LgorICovCitzdHJ1Y3Qga2lvY3R4ICpsb29rdXBfaW9jdHgodW5zaWduZWQgbG9uZyBjdHhfaWQpCit7CisJc3RydWN0IGtpb2N0eCAqaW9jdHg7CisJc3RydWN0IG1tX3N0cnVjdCAqbW07CisKKwltbSA9IGN1cnJlbnQtPm1tOworCXJlYWRfbG9jaygmbW0tPmlvY3R4X2xpc3RfbG9jayk7CisJZm9yIChpb2N0eCA9IG1tLT5pb2N0eF9saXN0OyBpb2N0eDsgaW9jdHggPSBpb2N0eC0+bmV4dCkKKwkJaWYgKGxpa2VseShpb2N0eC0+dXNlcl9pZCA9PSBjdHhfaWQgJiYgIWlvY3R4LT5kZWFkKSkgeworCQkJZ2V0X2lvY3R4KGlvY3R4KTsKKwkJCWJyZWFrOworCQl9CisJcmVhZF91bmxvY2soJm1tLT5pb2N0eF9saXN0X2xvY2spOworCisJcmV0dXJuIGlvY3R4OworfQorCisvKgorICogdXNlX21tCisgKglNYWtlcyB0aGUgY2FsbGluZyBrZXJuZWwgdGhyZWFkIHRha2Ugb24gdGhlIHNwZWNpZmllZAorICoJbW0gY29udGV4dC4KKyAqCUNhbGxlZCBieSB0aGUgcmV0cnkgdGhyZWFkIGV4ZWN1dGUgcmV0cmllcyB3aXRoaW4gdGhlCisgKglpb2NiIGlzc3VlcidzIG1tIGNvbnRleHQsIHNvIHRoYXQgY29weV9mcm9tL3RvX3VzZXIKKyAqCW9wZXJhdGlvbnMgd29yayBzZWFtbGVzc2x5IGZvciBhaW8uCisgKgkoTm90ZTogdGhpcyByb3V0aW5lIGlzIGludGVuZGVkIHRvIGJlIGNhbGxlZCBvbmx5CisgKglmcm9tIGEga2VybmVsIHRocmVhZCBjb250ZXh0KQorICovCitzdGF0aWMgdm9pZCB1c2VfbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJc3RydWN0IG1tX3N0cnVjdCAqYWN0aXZlX21tOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKworCXRhc2tfbG9jayh0c2spOworCXRzay0+ZmxhZ3MgfD0gUEZfQk9SUk9XRURfTU07CisJYWN0aXZlX21tID0gdHNrLT5hY3RpdmVfbW07CisJYXRvbWljX2luYygmbW0tPm1tX2NvdW50KTsKKwl0c2stPm1tID0gbW07CisJdHNrLT5hY3RpdmVfbW0gPSBtbTsKKwlhY3RpdmF0ZV9tbShhY3RpdmVfbW0sIG1tKTsKKwl0YXNrX3VubG9jayh0c2spOworCisJbW1kcm9wKGFjdGl2ZV9tbSk7Cit9CisKKy8qCisgKiB1bnVzZV9tbQorICoJUmV2ZXJzZXMgdGhlIGVmZmVjdCBvZiB1c2VfbW0sIGkuZS4gcmVsZWFzZXMgdGhlCisgKglzcGVjaWZpZWQgbW0gY29udGV4dCB3aGljaCB3YXMgZWFybGllciB0YWtlbiBvbgorICoJYnkgdGhlIGNhbGxpbmcga2VybmVsIHRocmVhZAorICoJKE5vdGU6IHRoaXMgcm91dGluZSBpcyBpbnRlbmRlZCB0byBiZSBjYWxsZWQgb25seQorICoJZnJvbSBhIGtlcm5lbCB0aHJlYWQgY29udGV4dCkKKyAqCisgKiBDb21tZW50czogQ2FsbGVkIHdpdGggY3R4LT5jdHhfbG9jayBoZWxkLiBUaGlzIG5lc3RzCisgKiB0YXNrX2xvY2sgaW5zdGVhZCBjdHhfbG9jay4KKyAqLwordm9pZCB1bnVzZV9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CisKKwl0YXNrX2xvY2sodHNrKTsKKwl0c2stPmZsYWdzICY9IH5QRl9CT1JST1dFRF9NTTsKKwl0c2stPm1tID0gTlVMTDsKKwkvKiBhY3RpdmVfbW0gaXMgc3RpbGwgJ21tJyAqLworCWVudGVyX2xhenlfdGxiKG1tLCB0c2spOworCXRhc2tfdW5sb2NrKHRzayk7Cit9CisKKy8qCisgKiBRdWV1ZSB1cCBhIGtpb2NiIHRvIGJlIHJldHJpZWQuIEFzc3VtZXMgdGhhdCB0aGUga2lvY2IKKyAqIGhhcyBhbHJlYWR5IGJlZW4gbWFya2VkIGFzIGtpY2tlZCwgYW5kIHBsYWNlcyBpdCBvbgorICogdGhlIHJldHJ5IHJ1biBsaXN0IGZvciB0aGUgY29ycmVzcG9uZGluZyBpb2N0eCwgaWYgaXQKKyAqIGlzbid0IGFscmVhZHkgcXVldWVkLiBSZXR1cm5zIDEgaWYgaXQgYWN0dWFsbHkgcXVldWVkCisgKiB0aGUga2lvY2IgKHRvIHRlbGwgdGhlIGNhbGxlciB0byBhY3RpdmF0ZSB0aGUgd29yaworICogcXVldWUgdG8gcHJvY2VzcyBpdCksIG9yIDAsIGlmIGl0IGZvdW5kIHRoYXQgaXQgd2FzCisgKiBhbHJlYWR5IHF1ZXVlZC4KKyAqCisgKiBTaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIHNwaW4gbG9jayBpb2NiLT5raV9jdHgtPmN0eF9sb2NrCisgKiBoZWxkCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IF9fcXVldWVfa2lja2VkX2lvY2Ioc3RydWN0IGtpb2NiICppb2NiKQoreworCXN0cnVjdCBraW9jdHggKmN0eCA9IGlvY2ItPmtpX2N0eDsKKworCWlmIChsaXN0X2VtcHR5KCZpb2NiLT5raV9ydW5fbGlzdCkpIHsKKwkJbGlzdF9hZGRfdGFpbCgmaW9jYi0+a2lfcnVuX2xpc3QsCisJCQkmY3R4LT5ydW5fbGlzdCk7CisJCWlvY2ItPmtpX3F1ZXVlZCsrOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIGFpb19ydW5faW9jYgorICoJVGhpcyBpcyB0aGUgY29yZSBhaW8gZXhlY3V0aW9uIHJvdXRpbmUuIEl0IGlzCisgKglpbnZva2VkIGJvdGggZm9yIGluaXRpYWwgaS9vIHN1Ym1pc3Npb24gYW5kCisgKglzdWJzZXF1ZW50IHJldHJpZXMgdmlhIHRoZSBhaW9fa2lja19oYW5kbGVyLgorICoJRXhwZWN0cyB0byBiZSBpbnZva2VkIHdpdGggaW9jYi0+a2lfY3R4LT5sb2NrCisgKglhbHJlYWR5IGhlbGQuIFRoZSBsb2NrIGlzIHJlbGVhc2VkIGFuZCByZWFxdWlyZWQKKyAqCWFzIG5lZWRlZCBkdXJpbmcgcHJvY2Vzc2luZy4KKyAqCisgKiBDYWxscyB0aGUgaW9jYiByZXRyeSBtZXRob2QgKGFscmVhZHkgc2V0dXAgZm9yIHRoZQorICogaW9jYiBvbiBpbml0aWFsIHN1Ym1pc3Npb24pIGZvciBvcGVyYXRpb24gc3BlY2lmaWMKKyAqIGhhbmRsaW5nLCBidXQgdGFrZXMgY2FyZSBvZiBtb3N0IG9mIGNvbW1vbiByZXRyeQorICogZXhlY3V0aW9uIGRldGFpbHMgZm9yIGEgZ2l2ZW4gaW9jYi4gVGhlIHJldHJ5IG1ldGhvZAorICogbmVlZHMgdG8gYmUgbm9uLWJsb2NraW5nIGFzIGZhciBhcyBwb3NzaWJsZSwgdG8gYXZvaWQKKyAqIGhvbGRpbmcgdXAgb3RoZXIgaW9jYnMgd2FpdGluZyB0byBiZSBzZXJ2aWNlZCBieSB0aGUKKyAqIHJldHJ5IGtlcm5lbCB0aHJlYWQuCisgKgorICogVGhlIHRyaWNraWVyIHBhcnRzIGluIHRoaXMgY29kZSBoYXZlIHRvIGRvIHdpdGgKKyAqIGVuc3VyaW5nIHRoYXQgb25seSBvbmUgcmV0cnkgaW5zdGFuY2UgaXMgaW4gcHJvZ3Jlc3MKKyAqIGZvciBhIGdpdmVuIGlvY2IgYXQgYW55IHRpbWUuIFByb3ZpZGluZyB0aGF0IGd1YXJhbnRlZQorICogc2ltcGxpZmllcyB0aGUgY29kaW5nIG9mIGluZGl2aWR1YWwgYWlvIG9wZXJhdGlvbnMgYXMKKyAqIGl0IGF2b2lkcyB2YXJpb3VzIHBvdGVudGlhbCByYWNlcy4KKyAqLworc3RhdGljIHNzaXplX3QgYWlvX3J1bl9pb2NiKHN0cnVjdCBraW9jYiAqaW9jYikKK3sKKwlzdHJ1Y3Qga2lvY3R4CSpjdHggPSBpb2NiLT5raV9jdHg7CisJc3NpemVfdCAoKnJldHJ5KShzdHJ1Y3Qga2lvY2IgKik7CisJc3NpemVfdCByZXQ7CisKKwlpZiAoaW9jYi0+a2lfcmV0cmllZCsrID4gMTAyNCoxMDI0KSB7CisJCXByaW50aygiTWF4aW1hbCByZXRyeSBjb3VudC4gIEJ5dGVzIGRvbmUgJVpkXG4iLAorCQkJaW9jYi0+a2lfbmJ5dGVzIC0gaW9jYi0+a2lfbGVmdCk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCWlmICghKGlvY2ItPmtpX3JldHJpZWQgJiAweGZmKSkgeworCQlwcl9kZWJ1ZygiJWxkIHJldHJ5OiAlZCBvZiAlZCAoa2ljayAlbGQsIFEgJWxkIHJ1biAlbGQsIHdha2UgJWxkKVxuIiwKKwkJCWlvY2ItPmtpX3JldHJpZWQsCisJCQlpb2NiLT5raV9uYnl0ZXMgLSBpb2NiLT5raV9sZWZ0LCBpb2NiLT5raV9uYnl0ZXMsCisJCQlpb2NiLT5raV9raWNrZWQsIGlvY2ItPmtpX3F1ZXVlZCwgYWlvX3J1biwgYWlvX3dha2V1cHMpOworCX0KKworCWlmICghKHJldHJ5ID0gaW9jYi0+a2lfcmV0cnkpKSB7CisJCXByaW50aygiYWlvX3J1bl9pb2NiOiBpb2NiLT5raV9yZXRyeSA9IE5VTExcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFdlIGRvbid0IHdhbnQgdGhlIG5leHQgcmV0cnkgaXRlcmF0aW9uIGZvciB0aGlzCisJICogb3BlcmF0aW9uIHRvIHN0YXJ0IHVudGlsIHRoaXMgb25lIGhhcyByZXR1cm5lZCBhbmQKKwkgKiB1cGRhdGVkIHRoZSBpb2NiIHN0YXRlLiBIb3dldmVyLCB3YWl0X3F1ZXVlIGZ1bmN0aW9ucworCSAqIGNhbiB0cmlnZ2VyIGEga2lja19pb2NiIGZyb20gaW50ZXJydXB0IGNvbnRleHQgaW4gdGhlCisJICogbWVhbnRpbWUsIGluZGljYXRpbmcgdGhhdCBkYXRhIGlzIGF2YWlsYWJsZSBmb3IgdGhlIG5leHQKKwkgKiBpdGVyYXRpb24uIFdlIHdhbnQgdG8gcmVtZW1iZXIgdGhhdCBhbmQgZW5hYmxlIHRoZQorCSAqIG5leHQgcmV0cnkgaXRlcmF0aW9uIF9hZnRlcl8gd2UgYXJlIHRocm91Z2ggd2l0aAorCSAqIHRoaXMgb25lLgorCSAqCisJICogU28sIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gcmVnaXN0ZXIgYSAia2ljayIsIGJ1dAorCSAqIHByZXZlbnQgaXQgZnJvbSBiZWluZyBxdWV1ZWQgbm93LCB3ZSBjbGVhciB0aGUga2ljaworCSAqIGZsYWcsIGJ1dCBtYWtlIHRoZSBraWNrIGNvZGUgKnRoaW5rKiB0aGF0IHRoZSBpb2NiIGlzCisJICogc3RpbGwgb24gdGhlIHJ1biBsaXN0IHVudGlsIHdlIGFyZSBhY3R1YWxseSBkb25lLgorCSAqIFdoZW4gd2UgYXJlIGRvbmUgd2l0aCB0aGlzIGl0ZXJhdGlvbiwgd2UgY2hlY2sgaWYKKwkgKiB0aGUgaW9jYiB3YXMga2lja2VkIGluIHRoZSBtZWFudGltZSBhbmQgaWYgc28sIHF1ZXVlCisJICogaXQgdXAgYWZyZXNoLgorCSAqLworCisJa2lvY2JDbGVhcktpY2tlZChpb2NiKTsKKworCS8qCisJICogVGhpcyBpcyBzbyB0aGF0IGFpb19jb21wbGV0ZSBrbm93cyBpdCBkb2Vzbid0IG5lZWQgdG8KKwkgKiBwdWxsIHRoZSBpb2NiIG9mZiB0aGUgcnVuIGxpc3QgKFdlIGNhbid0IGp1c3QgY2FsbAorCSAqIElOSVRfTElTVF9IRUFEIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCBhIGtpY2tfaW9jYiB0bworCSAqIHF1ZXVlIHRoaXMgb24gdGhlIHJ1biBsaXN0IHlldCkKKwkgKi8KKwlpb2NiLT5raV9ydW5fbGlzdC5uZXh0ID0gaW9jYi0+a2lfcnVuX2xpc3QucHJldiA9IE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxKCZjdHgtPmN0eF9sb2NrKTsKKworCS8qIFF1aXQgcmV0cnlpbmcgaWYgdGhlIGkvbyBoYXMgYmVlbiBjYW5jZWxsZWQgKi8KKwlpZiAoa2lvY2JJc0NhbmNlbGxlZChpb2NiKSkgeworCQlyZXQgPSAtRUlOVFI7CisJCWFpb19jb21wbGV0ZShpb2NiLCByZXQsIDApOworCQkvKiBtdXN0IG5vdCBhY2Nlc3MgdGhlIGlvY2IgYWZ0ZXIgdGhpcyAqLworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIE5vdyB3ZSBhcmUgYWxsIHNldCB0byBjYWxsIHRoZSByZXRyeSBtZXRob2QgaW4gYXN5bmMKKwkgKiBjb250ZXh0LiBCeSBzZXR0aW5nIHRoaXMgdGhyZWFkJ3MgaW9fd2FpdCBjb250ZXh0CisJICogdG8gcG9pbnQgdG8gdGhlIHdhaXQgcXVldWUgZW50cnkgaW5zaWRlIHRoZSBjdXJyZW50bHkKKwkgKiBydW5uaW5nIGlvY2IgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgcmV0cnksIHdlIGVuc3VyZQorCSAqIHRoYXQgYXN5bmMgbm90aWZpY2F0aW9uIHdha2V1cHMgYXJlIHF1ZXVlZCBieSB0aGUKKwkgKiBvcGVyYXRpb24gaW5zdGVhZCBvZiBibG9ja2luZyB3YWl0cywgYW5kIHdoZW4gbm90aWZpZWQsCisJICogY2F1c2UgdGhlIGlvY2IgdG8gYmUga2lja2VkIGZvciBjb250aW51YXRpb24gKHRocm91Z2gKKwkgKiB0aGUgYWlvX3dha2VfZnVuY3Rpb24gY2FsbGJhY2spLgorCSAqLworCUJVR19PTihjdXJyZW50LT5pb193YWl0ICE9IE5VTEwpOworCWN1cnJlbnQtPmlvX3dhaXQgPSAmaW9jYi0+a2lfd2FpdDsKKwlyZXQgPSByZXRyeShpb2NiKTsKKwljdXJyZW50LT5pb193YWl0ID0gTlVMTDsKKworCWlmICgtRUlPQ0JSRVRSWSAhPSByZXQpIHsKKyAJCWlmICgtRUlPQ0JRVUVVRUQgIT0gcmV0KSB7CisJCQlCVUdfT04oIWxpc3RfZW1wdHkoJmlvY2ItPmtpX3dhaXQudGFza19saXN0KSk7CisJCQlhaW9fY29tcGxldGUoaW9jYiwgcmV0LCAwKTsKKwkJCS8qIG11c3Qgbm90IGFjY2VzcyB0aGUgaW9jYiBhZnRlciB0aGlzICovCisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBJc3N1ZSBhbiBhZGRpdGlvbmFsIHJldHJ5IHRvIGF2b2lkIHdhaXRpbmcgZm9yZXZlciBpZgorCQkgKiBubyB3YWl0cyB3ZXJlIHF1ZXVlZCAoZS5nLiBpbiBjYXNlIG9mIGEgc2hvcnQgcmVhZCkuCisJCSAqLworCQlpZiAobGlzdF9lbXB0eSgmaW9jYi0+a2lfd2FpdC50YXNrX2xpc3QpKQorCQkJa2lvY2JTZXRLaWNrZWQoaW9jYik7CisJfQorb3V0OgorCXNwaW5fbG9ja19pcnEoJmN0eC0+Y3R4X2xvY2spOworCisJaWYgKC1FSU9DQlJFVFJZID09IHJldCkgeworCQkvKgorCQkgKiBPSywgbm93IHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGlzIGl0ZXJhdGlvbgorCQkgKiBhbmQga25vdyB0aGF0IHRoZXJlIGlzIG1vcmUgbGVmdCB0byBnbywKKwkJICogdGhpcyBpcyB3aGVyZSB3ZSBsZXQgZ28gc28gdGhhdCBhIHN1YnNlcXVlbnQKKwkJICogImtpY2siIGNhbiBzdGFydCB0aGUgbmV4dCBpdGVyYXRpb24KKwkJICovCisKKwkJLyogd2lsbCBtYWtlIF9fcXVldWVfa2lja2VkX2lvY2Igc3VjY2VlZCBmcm9tIGhlcmUgb24gKi8KKwkJSU5JVF9MSVNUX0hFQUQoJmlvY2ItPmtpX3J1bl9saXN0KTsKKwkJLyogd2UgbXVzdCBxdWV1ZSB0aGUgbmV4dCBpdGVyYXRpb24gb3Vyc2VsdmVzLCBpZiBpdAorCQkgKiBoYXMgYWxyZWFkeSBiZWVuIGtpY2tlZCAqLworCQlpZiAoa2lvY2JJc0tpY2tlZChpb2NiKSkgeworCQkJX19xdWV1ZV9raWNrZWRfaW9jYihpb2NiKTsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCisvKgorICogX19haW9fcnVuX2lvY2JzOgorICogCVByb2Nlc3MgYWxsIHBlbmRpbmcgcmV0cmllcyBxdWV1ZWQgb24gdGhlIGlvY3R4CisgKiAJcnVuIGxpc3QuCisgKiBBc3N1bWVzIGl0IGlzIG9wZXJhdGluZyB3aXRoaW4gdGhlIGFpbyBpc3N1ZXIncyBtbQorICogY29udGV4dC4gRXhwZWN0cyB0byBiZSBjYWxsZWQgd2l0aCBjdHgtPmN0eF9sb2NrIGhlbGQKKyAqLworc3RhdGljIGludCBfX2Fpb19ydW5faW9jYnMoc3RydWN0IGtpb2N0eCAqY3R4KQoreworCXN0cnVjdCBraW9jYiAqaW9jYjsKKwlpbnQgY291bnQgPSAwOworCUxJU1RfSEVBRChydW5fbGlzdCk7CisKKwlsaXN0X3NwbGljZV9pbml0KCZjdHgtPnJ1bl9saXN0LCAmcnVuX2xpc3QpOworCXdoaWxlICghbGlzdF9lbXB0eSgmcnVuX2xpc3QpKSB7CisJCWlvY2IgPSBsaXN0X2VudHJ5KHJ1bl9saXN0Lm5leHQsIHN0cnVjdCBraW9jYiwKKwkJCWtpX3J1bl9saXN0KTsKKwkJbGlzdF9kZWwoJmlvY2ItPmtpX3J1bl9saXN0KTsKKwkJLyoKKwkJICogSG9sZCBhbiBleHRyYSByZWZlcmVuY2Ugd2hpbGUgcmV0cnlpbmcgaS9vLgorCQkgKi8KKwkJaW9jYi0+a2lfdXNlcnMrKzsgICAgICAgLyogZ3JhYiBleHRyYSByZWZlcmVuY2UgKi8KKwkJYWlvX3J1bl9pb2NiKGlvY2IpOworCQlpZiAoX19haW9fcHV0X3JlcShjdHgsIGlvY2IpKSAgLyogZHJvcCBleHRyYSByZWYgKi8KKwkJCXB1dF9pb2N0eChjdHgpOworCQljb3VudCsrOworIAl9CisJYWlvX3J1bisrOworCWlmICghbGlzdF9lbXB0eSgmY3R4LT5ydW5fbGlzdCkpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhaW9fcXVldWVfd29yayhzdHJ1Y3Qga2lvY3R4ICogY3R4KQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwkvKgorCSAqIGlmIHNvbWVvbmUgaXMgd2FpdGluZywgZ2V0IHRoZSB3b3JrIHN0YXJ0ZWQgcmlnaHQKKwkgKiBhd2F5LCBvdGhlcndpc2UsIHVzZSBhIGxvbmdlciBkZWxheQorCSAqLworCXNtcF9tYigpOworCWlmICh3YWl0cXVldWVfYWN0aXZlKCZjdHgtPndhaXQpKQorCQl0aW1lb3V0ID0gMTsKKwllbHNlCisJCXRpbWVvdXQgPSBIWi8xMDsKKwlxdWV1ZV9kZWxheWVkX3dvcmsoYWlvX3dxLCAmY3R4LT53cSwgdGltZW91dCk7Cit9CisKKworLyoKKyAqIGFpb19ydW5faW9jYnM6CisgKiAJUHJvY2VzcyBhbGwgcGVuZGluZyByZXRyaWVzIHF1ZXVlZCBvbiB0aGUgaW9jdHgKKyAqIAlydW4gbGlzdC4KKyAqIEFzc3VtZXMgaXQgaXMgb3BlcmF0aW5nIHdpdGhpbiB0aGUgYWlvIGlzc3VlcidzIG1tCisgKiBjb250ZXh0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYWlvX3J1bl9pb2NicyhzdHJ1Y3Qga2lvY3R4ICpjdHgpCit7CisJaW50IHJlcXVldWU7CisKKwlzcGluX2xvY2tfaXJxKCZjdHgtPmN0eF9sb2NrKTsKKworCXJlcXVldWUgPSBfX2Fpb19ydW5faW9jYnMoY3R4KTsKKwlzcGluX3VubG9ja19pcnEoJmN0eC0+Y3R4X2xvY2spOworCWlmIChyZXF1ZXVlKQorCQlhaW9fcXVldWVfd29yayhjdHgpOworfQorCisvKgorICoganVzdCBsaWtlIGFpb19ydW5faW9jYnMsIGJ1dCBrZWVwcyBydW5uaW5nIHRoZW0gdW50aWwKKyAqIHRoZSBsaXN0IHN0YXlzIGVtcHR5CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhaW9fcnVuX2FsbF9pb2NicyhzdHJ1Y3Qga2lvY3R4ICpjdHgpCit7CisJc3Bpbl9sb2NrX2lycSgmY3R4LT5jdHhfbG9jayk7CisJd2hpbGUgKF9fYWlvX3J1bl9pb2NicyhjdHgpKQorCQk7CisJc3Bpbl91bmxvY2tfaXJxKCZjdHgtPmN0eF9sb2NrKTsKK30KKworLyoKKyAqIGFpb19raWNrX2hhbmRsZXI6CisgKiAJV29yayBxdWV1ZSBoYW5kbGVyIHRyaWdnZXJlZCB0byBwcm9jZXNzIHBlbmRpbmcKKyAqIAlyZXRyaWVzIG9uIGFuIGlvY3R4LiBUYWtlcyBvbiB0aGUgYWlvIGlzc3VlcidzCisgKgltbSBjb250ZXh0IGJlZm9yZSBydW5uaW5nIHRoZSBpb2Nicywgc28gdGhhdAorICoJY29weV94eHhfdXNlciBvcGVyYXRlcyBvbiB0aGUgaXNzdWVyJ3MgYWRkcmVzcworICogICAgICBzcGFjZS4KKyAqIFJ1biBvbiBhaW9kJ3MgY29udGV4dC4KKyAqLworc3RhdGljIHZvaWQgYWlvX2tpY2tfaGFuZGxlcih2b2lkICpkYXRhKQoreworCXN0cnVjdCBraW9jdHggKmN0eCA9IGRhdGE7CisJbW1fc2VnbWVudF90IG9sZGZzID0gZ2V0X2ZzKCk7CisJaW50IHJlcXVldWU7CisKKwlzZXRfZnMoVVNFUl9EUyk7CisJdXNlX21tKGN0eC0+bW0pOworCXNwaW5fbG9ja19pcnEoJmN0eC0+Y3R4X2xvY2spOworCXJlcXVldWUgPV9fYWlvX3J1bl9pb2NicyhjdHgpOworIAl1bnVzZV9tbShjdHgtPm1tKTsKKwlzcGluX3VubG9ja19pcnEoJmN0eC0+Y3R4X2xvY2spOworCXNldF9mcyhvbGRmcyk7CisJLyoKKwkgKiB3ZSdyZSBpbiBhIHdvcmtlciB0aHJlYWQgYWxyZWFkeSwgZG9uJ3QgdXNlIHF1ZXVlX2RlbGF5ZWRfd29yaywKKwkgKi8KKwlpZiAocmVxdWV1ZSkKKwkJcXVldWVfd29yayhhaW9fd3EsICZjdHgtPndxKTsKK30KKworCisvKgorICogQ2FsbGVkIGJ5IGtpY2tfaW9jYiB0byBxdWV1ZSB0aGUga2lvY2IgZm9yIHJldHJ5CisgKiBhbmQgaWYgcmVxdWlyZWQgYWN0aXZhdGUgdGhlIGFpbyB3b3JrIHF1ZXVlIHRvIHByb2Nlc3MKKyAqIGl0CisgKi8KK3ZvaWQgcXVldWVfa2lja2VkX2lvY2Ioc3RydWN0IGtpb2NiICppb2NiKQoreworIAlzdHJ1Y3Qga2lvY3R4CSpjdHggPSBpb2NiLT5raV9jdHg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcnVuID0gMDsKKworCVdBUk5fT04oKCFsaXN0X2VtcHR5KCZpb2NiLT5raV93YWl0LnRhc2tfbGlzdCkpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjdHgtPmN0eF9sb2NrLCBmbGFncyk7CisJcnVuID0gX19xdWV1ZV9raWNrZWRfaW9jYihpb2NiKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdHgtPmN0eF9sb2NrLCBmbGFncyk7CisJaWYgKHJ1bikgeworCQlhaW9fcXVldWVfd29yayhjdHgpOworCQlhaW9fd2FrZXVwcysrOworCX0KK30KKworLyoKKyAqIGtpY2tfaW9jYjoKKyAqICAgICAgQ2FsbGVkIHR5cGljYWxseSBmcm9tIGEgd2FpdCBxdWV1ZSBjYWxsYmFjayBjb250ZXh0CisgKiAgICAgIChhaW9fd2FrZV9mdW5jdGlvbikgdG8gdHJpZ2dlciBhIHJldHJ5IG9mIHRoZSBpb2NiLgorICogICAgICBUaGUgcmV0cnkgaXMgdXN1YWxseSBleGVjdXRlZCBieSBhaW8gd29ya3F1ZXVlCisgKiAgICAgIHRocmVhZHMgKFNlZSBhaW9fa2lja19oYW5kbGVyKS4KKyAqLwordm9pZCBmYXN0Y2FsbCBraWNrX2lvY2Ioc3RydWN0IGtpb2NiICppb2NiKQoreworCS8qIHN5bmMgaW9jYnMgYXJlIGVhc3k6IHRoZXkgY2FuIG9ubHkgZXZlciBiZSBleGVjdXRpbmcgZnJvbSBhIAorCSAqIHNpbmdsZSBjb250ZXh0LiAqLworCWlmIChpc19zeW5jX2tpb2NiKGlvY2IpKSB7CisJCWtpb2NiU2V0S2lja2VkKGlvY2IpOworCSAgICAgICAgd2FrZV91cF9wcm9jZXNzKGlvY2ItPmtpX29iai50c2spOworCQlyZXR1cm47CisJfQorCisJaW9jYi0+a2lfa2lja2VkKys7CisJLyogSWYgaXRzIGFscmVhZHkga2lja2VkIHdlIHNob3VsZG4ndCBxdWV1ZSBpdCBhZ2FpbiAqLworCWlmICgha2lvY2JUcnlLaWNrKGlvY2IpKSB7CisJCXF1ZXVlX2tpY2tlZF9pb2NiKGlvY2IpOworCX0KK30KK0VYUE9SVF9TWU1CT0woa2lja19pb2NiKTsKKworLyogYWlvX2NvbXBsZXRlCisgKglDYWxsZWQgd2hlbiB0aGUgaW8gcmVxdWVzdCBvbiB0aGUgZ2l2ZW4gaW9jYiBpcyBjb21wbGV0ZS4KKyAqCVJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBsYXN0IHVzZXIgb2YgdGhlIHJlcXVlc3QuICBUaGUgCisgKglvbmx5IG90aGVyIHVzZXIgb2YgdGhlIHJlcXVlc3QgY2FuIGJlIHRoZSBjYW5jZWxsYXRpb24gY29kZS4KKyAqLworaW50IGZhc3RjYWxsIGFpb19jb21wbGV0ZShzdHJ1Y3Qga2lvY2IgKmlvY2IsIGxvbmcgcmVzLCBsb25nIHJlczIpCit7CisJc3RydWN0IGtpb2N0eAkqY3R4ID0gaW9jYi0+a2lfY3R4OworCXN0cnVjdCBhaW9fcmluZ19pbmZvCSppbmZvOworCXN0cnVjdCBhaW9fcmluZwkqcmluZzsKKwlzdHJ1Y3QgaW9fZXZlbnQJKmV2ZW50OworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJdW5zaWduZWQgbG9uZwl0YWlsOworCWludAkJcmV0OworCisJLyogU3BlY2lhbCBjYXNlIGhhbmRsaW5nIGZvciBzeW5jIGlvY2JzOiBldmVudHMgZ28gZGlyZWN0bHkKKwkgKiBpbnRvIHRoZSBpb2NiIGZvciBmYXN0IGhhbmRsaW5nLiAgTm90ZSB0aGF0IHRoaXMgd2lsbCBub3QgCisJICogd29yayBpZiB3ZSBhbGxvdyBzeW5jIGtpb2NicyB0byBiZSBjYW5jZWxsZWQuIGluIHdoaWNoCisJICogY2FzZSB0aGUgdXNhZ2UgY291bnQgY2hlY2tzIHdpbGwgaGF2ZSB0byBtb3ZlIHVuZGVyIGN0eF9sb2NrCisJICogZm9yIGFsbCBjYXNlcy4KKwkgKi8KKwlpZiAoaXNfc3luY19raW9jYihpb2NiKSkgeworCQlpbnQgcmV0OworCisJCWlvY2ItPmtpX3VzZXJfZGF0YSA9IHJlczsKKwkJaWYgKGlvY2ItPmtpX3VzZXJzID09IDEpIHsKKwkJCWlvY2ItPmtpX3VzZXJzID0gMDsKKwkJCXJldCA9IDE7CisJCX0gZWxzZSB7CisJCQlzcGluX2xvY2tfaXJxKCZjdHgtPmN0eF9sb2NrKTsKKwkJCWlvY2ItPmtpX3VzZXJzLS07CisJCQlyZXQgPSAoMCA9PSBpb2NiLT5raV91c2Vycyk7CisJCQlzcGluX3VubG9ja19pcnEoJmN0eC0+Y3R4X2xvY2spOworCQl9CisJCS8qIHN5bmMgaW9jYnMgcHV0IHRoZSB0YXNrIGhlcmUgZm9yIHVzICovCisJCXdha2VfdXBfcHJvY2Vzcyhpb2NiLT5raV9vYmoudHNrKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpbmZvID0gJmN0eC0+cmluZ19pbmZvOworCisJLyogYWRkIGEgY29tcGxldGlvbiBldmVudCB0byB0aGUgcmluZyBidWZmZXIuCisJICogbXVzdCBiZSBkb25lIGhvbGRpbmcgY3R4LT5jdHhfbG9jayB0byBwcmV2ZW50CisJICogb3RoZXIgY29kZSBmcm9tIG1lc3Npbmcgd2l0aCB0aGUgdGFpbAorCSAqIHBvaW50ZXIgc2luY2Ugd2UgbWlnaHQgYmUgY2FsbGVkIGZyb20gaXJxCisJICogY29udGV4dC4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3R4LT5jdHhfbG9jaywgZmxhZ3MpOworCisJaWYgKGlvY2ItPmtpX3J1bl9saXN0LnByZXYgJiYgIWxpc3RfZW1wdHkoJmlvY2ItPmtpX3J1bl9saXN0KSkKKwkJbGlzdF9kZWxfaW5pdCgmaW9jYi0+a2lfcnVuX2xpc3QpOworCisJLyoKKwkgKiBjYW5jZWxsZWQgcmVxdWVzdHMgZG9uJ3QgZ2V0IGV2ZW50cywgdXNlcmxhbmQgd2FzIGdpdmVuIG9uZQorCSAqIHdoZW4gdGhlIGV2ZW50IGdvdCBjYW5jZWxsZWQuCisJICovCisJaWYgKGtpb2NiSXNDYW5jZWxsZWQoaW9jYikpCisJCWdvdG8gcHV0X3JxOworCisJcmluZyA9IGttYXBfYXRvbWljKGluZm8tPnJpbmdfcGFnZXNbMF0sIEtNX0lSUTEpOworCisJdGFpbCA9IGluZm8tPnRhaWw7CisJZXZlbnQgPSBhaW9fcmluZ19ldmVudChpbmZvLCB0YWlsLCBLTV9JUlEwKTsKKwl0YWlsID0gKHRhaWwgKyAxKSAlIGluZm8tPm5yOworCisJZXZlbnQtPm9iaiA9ICh1NjQpKHVuc2lnbmVkIGxvbmcpaW9jYi0+a2lfb2JqLnVzZXI7CisJZXZlbnQtPmRhdGEgPSBpb2NiLT5raV91c2VyX2RhdGE7CisJZXZlbnQtPnJlcyA9IHJlczsKKwlldmVudC0+cmVzMiA9IHJlczI7CisKKwlkcHJpbnRrKCJhaW9fY29tcGxldGU6ICVwWyVsdV06ICVwOiAlcCAlTHggJWx4ICVseFxuIiwKKwkJY3R4LCB0YWlsLCBpb2NiLCBpb2NiLT5raV9vYmoudXNlciwgaW9jYi0+a2lfdXNlcl9kYXRhLAorCQlyZXMsIHJlczIpOworCisJLyogYWZ0ZXIgZmxhZ2dpbmcgdGhlIHJlcXVlc3QgYXMgZG9uZSwgd2UKKwkgKiBtdXN0IG5ldmVyIGV2ZW4gbG9vayBhdCBpdCBhZ2FpbgorCSAqLworCXNtcF93bWIoKTsJLyogbWFrZSBldmVudCB2aXNpYmxlIGJlZm9yZSB1cGRhdGluZyB0YWlsICovCisKKwlpbmZvLT50YWlsID0gdGFpbDsKKwlyaW5nLT50YWlsID0gdGFpbDsKKworCXB1dF9haW9fcmluZ19ldmVudChldmVudCwgS01fSVJRMCk7CisJa3VubWFwX2F0b21pYyhyaW5nLCBLTV9JUlExKTsKKworCXByX2RlYnVnKCJhZGRlZCB0byByaW5nICVwIGF0IFslbHVdXG4iLCBpb2NiLCB0YWlsKTsKKworCXByX2RlYnVnKCIlbGQgcmV0cmllczogJWQgb2YgJWQgKGtpY2tlZCAlbGQsIFEgJWxkIHJ1biAlbGQgd2FrZSAlbGQpXG4iLAorCQlpb2NiLT5raV9yZXRyaWVkLAorCQlpb2NiLT5raV9uYnl0ZXMgLSBpb2NiLT5raV9sZWZ0LCBpb2NiLT5raV9uYnl0ZXMsCisJCWlvY2ItPmtpX2tpY2tlZCwgaW9jYi0+a2lfcXVldWVkLCBhaW9fcnVuLCBhaW9fd2FrZXVwcyk7CitwdXRfcnE6CisJLyogZXZlcnl0aGluZyB0dXJuZWQgb3V0IHdlbGwsIGRpc3Bvc2Ugb2YgdGhlIGFpb2NiLiAqLworCXJldCA9IF9fYWlvX3B1dF9yZXEoY3R4LCBpb2NiKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN0eC0+Y3R4X2xvY2ssIGZsYWdzKTsKKworCWlmICh3YWl0cXVldWVfYWN0aXZlKCZjdHgtPndhaXQpKQorCQl3YWtlX3VwKCZjdHgtPndhaXQpOworCisJaWYgKHJldCkKKwkJcHV0X2lvY3R4KGN0eCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBhaW9fcmVhZF9ldnQKKyAqCVB1bGwgYW4gZXZlbnQgb2ZmIG9mIHRoZSBpb2N0eCdzIGV2ZW50IHJpbmcuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgCisgKglldmVudHMgZmV0Y2hlZCAoMCBvciAxIDstKQorICoJRklYTUU6IG1ha2UgdGhpcyB1c2UgY21weGNoZy4KKyAqCVRPRE86IG1ha2UgdGhlIHJpbmdidWZmZXIgdXNlciBtbWFwKClhYmxlIChyZXF1aXJlcyBGSVhNRSkuCisgKi8KK3N0YXRpYyBpbnQgYWlvX3JlYWRfZXZ0KHN0cnVjdCBraW9jdHggKmlvY3R4LCBzdHJ1Y3QgaW9fZXZlbnQgKmVudCkKK3sKKwlzdHJ1Y3QgYWlvX3JpbmdfaW5mbyAqaW5mbyA9ICZpb2N0eC0+cmluZ19pbmZvOworCXN0cnVjdCBhaW9fcmluZyAqcmluZzsKKwl1bnNpZ25lZCBsb25nIGhlYWQ7CisJaW50IHJldCA9IDA7CisKKwlyaW5nID0ga21hcF9hdG9taWMoaW5mby0+cmluZ19wYWdlc1swXSwgS01fVVNFUjApOworCWRwcmludGsoImluIGFpb19yZWFkX2V2dCBoJWx1IHQlbHUgbSVsdVxuIiwKKwkJICh1bnNpZ25lZCBsb25nKXJpbmctPmhlYWQsICh1bnNpZ25lZCBsb25nKXJpbmctPnRhaWwsCisJCSAodW5zaWduZWQgbG9uZylyaW5nLT5ucik7CisKKwlpZiAocmluZy0+aGVhZCA9PSByaW5nLT50YWlsKQorCQlnb3RvIG91dDsKKworCXNwaW5fbG9jaygmaW5mby0+cmluZ19sb2NrKTsKKworCWhlYWQgPSByaW5nLT5oZWFkICUgaW5mby0+bnI7CisJaWYgKGhlYWQgIT0gcmluZy0+dGFpbCkgeworCQlzdHJ1Y3QgaW9fZXZlbnQgKmV2cCA9IGFpb19yaW5nX2V2ZW50KGluZm8sIGhlYWQsIEtNX1VTRVIxKTsKKwkJKmVudCA9ICpldnA7CisJCWhlYWQgPSAoaGVhZCArIDEpICUgaW5mby0+bnI7CisJCXNtcF9tYigpOyAvKiBmaW5pc2ggcmVhZGluZyB0aGUgZXZlbnQgYmVmb3JlIHVwZGF0bmcgdGhlIGhlYWQgKi8KKwkJcmluZy0+aGVhZCA9IGhlYWQ7CisJCXJldCA9IDE7CisJCXB1dF9haW9fcmluZ19ldmVudChldnAsIEtNX1VTRVIxKTsKKwl9CisJc3Bpbl91bmxvY2soJmluZm8tPnJpbmdfbG9jayk7CisKK291dDoKKwlrdW5tYXBfYXRvbWljKHJpbmcsIEtNX1VTRVIwKTsKKwlkcHJpbnRrKCJsZWF2aW5nIGFpb19yZWFkX2V2dDogJWQgIGglbHUgdCVsdVxuIiwgcmV0LAorCQkgKHVuc2lnbmVkIGxvbmcpcmluZy0+aGVhZCwgKHVuc2lnbmVkIGxvbmcpcmluZy0+dGFpbCk7CisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IGFpb190aW1lb3V0IHsKKwlzdHJ1Y3QgdGltZXJfbGlzdAl0aW1lcjsKKwlpbnQJCQl0aW1lZF9vdXQ7CisJc3RydWN0IHRhc2tfc3RydWN0CSpwOworfTsKKworc3RhdGljIHZvaWQgdGltZW91dF9mdW5jKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgYWlvX3RpbWVvdXQgKnRvID0gKHN0cnVjdCBhaW9fdGltZW91dCAqKWRhdGE7CisKKwl0by0+dGltZWRfb3V0ID0gMTsKKwl3YWtlX3VwX3Byb2Nlc3ModG8tPnApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF90aW1lb3V0KHN0cnVjdCBhaW9fdGltZW91dCAqdG8pCit7CisJaW5pdF90aW1lcigmdG8tPnRpbWVyKTsKKwl0by0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXRvOworCXRvLT50aW1lci5mdW5jdGlvbiA9IHRpbWVvdXRfZnVuYzsKKwl0by0+dGltZWRfb3V0ID0gMDsKKwl0by0+cCA9IGN1cnJlbnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfdGltZW91dChsb25nIHN0YXJ0X2ppZmZpZXMsIHN0cnVjdCBhaW9fdGltZW91dCAqdG8sCisJCQkgICAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0cykKK3sKKwl0by0+dGltZXIuZXhwaXJlcyA9IHN0YXJ0X2ppZmZpZXMgKyB0aW1lc3BlY190b19qaWZmaWVzKHRzKTsKKwlpZiAodGltZV9hZnRlcih0by0+dGltZXIuZXhwaXJlcywgamlmZmllcykpCisJCWFkZF90aW1lcigmdG8tPnRpbWVyKTsKKwllbHNlCisJCXRvLT50aW1lZF9vdXQgPSAxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfdGltZW91dChzdHJ1Y3QgYWlvX3RpbWVvdXQgKnRvKQoreworCWRlbF9zaW5nbGVzaG90X3RpbWVyX3N5bmMoJnRvLT50aW1lcik7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9ldmVudHMoc3RydWN0IGtpb2N0eCAqY3R4LAorCQkJbG9uZyBtaW5fbnIsIGxvbmcgbnIsCisJCQlzdHJ1Y3QgaW9fZXZlbnQgX191c2VyICpldmVudCwKKwkJCXN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKnRpbWVvdXQpCit7CisJbG9uZwkJCXN0YXJ0X2ppZmZpZXMgPSBqaWZmaWVzOworCXN0cnVjdCB0YXNrX3N0cnVjdAkqdHNrID0gY3VycmVudDsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCB0c2spOworCWludAkJCXJldDsKKwlpbnQJCQlpID0gMDsKKwlzdHJ1Y3QgaW9fZXZlbnQJCWVudDsKKwlzdHJ1Y3QgYWlvX3RpbWVvdXQJdG87CisJaW50IAkJCWV2ZW50X2xvb3AgPSAwOyAvKiB0ZXN0aW5nIG9ubHkgKi8KKwlpbnQJCQlyZXRyeSA9IDA7CisKKwkvKiBuZWVkZWQgdG8gemVybyBhbnkgcGFkZGluZyB3aXRoaW4gYW4gZW50cnkgKHRoZXJlIHNob3VsZG4ndCBiZSAKKwkgKiBhbnksIGJ1dCBDIGlzIGZ1biEKKwkgKi8KKwltZW1zZXQoJmVudCwgMCwgc2l6ZW9mKGVudCkpOworcmV0cnk6CisJcmV0ID0gMDsKKwl3aGlsZSAobGlrZWx5KGkgPCBucikpIHsKKwkJcmV0ID0gYWlvX3JlYWRfZXZ0KGN0eCwgJmVudCk7CisJCWlmICh1bmxpa2VseShyZXQgPD0gMCkpCisJCQlicmVhazsKKworCQlkcHJpbnRrKCJyZWFkIGV2ZW50OiAlTHggJUx4ICVMeCAlTHhcbiIsCisJCQllbnQuZGF0YSwgZW50Lm9iaiwgZW50LnJlcywgZW50LnJlczIpOworCisJCS8qIENvdWxkIHdlIHNwbGl0IHRoZSBjaGVjayBpbiB0d28/ICovCisJCXJldCA9IC1FRkFVTFQ7CisJCWlmICh1bmxpa2VseShjb3B5X3RvX3VzZXIoZXZlbnQsICZlbnQsIHNpemVvZihlbnQpKSkpIHsKKwkJCWRwcmludGsoImFpbzogbG9zdCBhbiBldmVudCBkdWUgdG8gRUZBVUxULlxuIik7CisJCQlicmVhazsKKwkJfQorCQlyZXQgPSAwOworCisJCS8qIEdvb2QsIGV2ZW50IGNvcGllZCB0byB1c2VybGFuZCwgdXBkYXRlIGNvdW50cy4gKi8KKwkJZXZlbnQgKys7CisJCWkgKys7CisJfQorCisJaWYgKG1pbl9uciA8PSBpKQorCQlyZXR1cm4gaTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogRW5kIGZhc3QgcGF0aCAqLworCisJLyogcmFjZXkgY2hlY2ssIGJ1dCBpdCBnZXRzIHJlZG9uZSAqLworCWlmICghcmV0cnkgJiYgdW5saWtlbHkoIWxpc3RfZW1wdHkoJmN0eC0+cnVuX2xpc3QpKSkgeworCQlyZXRyeSA9IDE7CisJCWFpb19ydW5fYWxsX2lvY2JzKGN0eCk7CisJCWdvdG8gcmV0cnk7CisJfQorCisJaW5pdF90aW1lb3V0KCZ0byk7CisJaWYgKHRpbWVvdXQpIHsKKwkJc3RydWN0IHRpbWVzcGVjCXRzOworCQlyZXQgPSAtRUZBVUxUOworCQlpZiAodW5saWtlbHkoY29weV9mcm9tX3VzZXIoJnRzLCB0aW1lb3V0LCBzaXplb2YodHMpKSkpCisJCQlnb3RvIG91dDsKKworCQlzZXRfdGltZW91dChzdGFydF9qaWZmaWVzLCAmdG8sICZ0cyk7CisJfQorCisJd2hpbGUgKGxpa2VseShpIDwgbnIpKSB7CisJCWFkZF93YWl0X3F1ZXVlX2V4Y2x1c2l2ZSgmY3R4LT53YWl0LCAmd2FpdCk7CisJCWRvIHsKKwkJCXNldF90YXNrX3N0YXRlKHRzaywgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXJldCA9IGFpb19yZWFkX2V2dChjdHgsICZlbnQpOworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKKwkJCWlmIChtaW5fbnIgPD0gaSkKKwkJCQlicmVhazsKKwkJCXJldCA9IDA7CisJCQlpZiAodG8udGltZWRfb3V0KQkvKiBPbmx5IGNoZWNrIGFmdGVyIHJlYWQgZXZ0ICovCisJCQkJYnJlYWs7CisJCQlzY2hlZHVsZSgpOworCQkJZXZlbnRfbG9vcCsrOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKHRzaykpIHsKKwkJCQlyZXQgPSAtRUlOVFI7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKnJldCA9IGFpb19yZWFkX2V2dChjdHgsICZlbnQpOyovCisJCX0gd2hpbGUgKDEpIDsKKworCQlzZXRfdGFza19zdGF0ZSh0c2ssIFRBU0tfUlVOTklORyk7CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZjdHgtPndhaXQsICZ3YWl0KTsKKworCQlpZiAodW5saWtlbHkocmV0IDw9IDApKQorCQkJYnJlYWs7CisKKwkJcmV0ID0gLUVGQVVMVDsKKwkJaWYgKHVubGlrZWx5KGNvcHlfdG9fdXNlcihldmVudCwgJmVudCwgc2l6ZW9mKGVudCkpKSkgeworCQkJZHByaW50aygiYWlvOiBsb3N0IGFuIGV2ZW50IGR1ZSB0byBFRkFVTFQuXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogR29vZCwgZXZlbnQgY29waWVkIHRvIHVzZXJsYW5kLCB1cGRhdGUgY291bnRzLiAqLworCQlldmVudCArKzsKKwkJaSArKzsKKwl9CisKKwlpZiAodGltZW91dCkKKwkJY2xlYXJfdGltZW91dCgmdG8pOworb3V0OgorCXByX2RlYnVnKCJldmVudCBsb29wIGV4ZWN1dGVkICVkIHRpbWVzXG4iLCBldmVudF9sb29wKTsKKwlwcl9kZWJ1ZygiYWlvX3J1biAlbGRcbiIsIGFpb19ydW4pOworCXByX2RlYnVnKCJhaW9fd2FrZXVwcyAlbGRcbiIsIGFpb193YWtldXBzKTsKKwlyZXR1cm4gaSA/IGkgOiByZXQ7Cit9CisKKy8qIFRha2UgYW4gaW9jdHggYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0IG9mIGlvY3R4J3MuICBQcm90ZWN0cyAKKyAqIGFnYWluc3QgcmFjZXMgd2l0aCBpdHNlbGYgdmlhIC0+ZGVhZC4KKyAqLworc3RhdGljIHZvaWQgaW9fZGVzdHJveShzdHJ1Y3Qga2lvY3R4ICppb2N0eCkKK3sKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOworCXN0cnVjdCBraW9jdHggKip0bXA7CisJaW50IHdhc19kZWFkOworCisJLyogZGVsZXRlIHRoZSBlbnRyeSBmcm9tIHRoZSBsaXN0IGlzIHNvbWVvbmUgZWxzZSBoYXNuJ3QgYWxyZWFkeSAqLworCXdyaXRlX2xvY2soJm1tLT5pb2N0eF9saXN0X2xvY2spOworCXdhc19kZWFkID0gaW9jdHgtPmRlYWQ7CisJaW9jdHgtPmRlYWQgPSAxOworCWZvciAodG1wID0gJm1tLT5pb2N0eF9saXN0OyAqdG1wICYmICp0bXAgIT0gaW9jdHg7CisJICAgICB0bXAgPSAmKCp0bXApLT5uZXh0KQorCQk7CisJaWYgKCp0bXApCisJCSp0bXAgPSBpb2N0eC0+bmV4dDsKKwl3cml0ZV91bmxvY2soJm1tLT5pb2N0eF9saXN0X2xvY2spOworCisJZHByaW50aygiYWlvX3JlbGVhc2UoJXApXG4iLCBpb2N0eCk7CisJaWYgKGxpa2VseSghd2FzX2RlYWQpKQorCQlwdXRfaW9jdHgoaW9jdHgpOwkvKiB0d2ljZSBmb3IgdGhlIGxpc3QgKi8KKworCWFpb19jYW5jZWxfYWxsKGlvY3R4KTsKKwl3YWl0X2Zvcl9hbGxfYWlvcyhpb2N0eCk7CisJcHV0X2lvY3R4KGlvY3R4KTsJLyogb25jZSBmb3IgdGhlIGxvb2t1cCAqLworfQorCisvKiBzeXNfaW9fc2V0dXA6CisgKglDcmVhdGUgYW4gYWlvX2NvbnRleHQgY2FwYWJsZSBvZiByZWNlaXZpbmcgYXQgbGVhc3QgbnJfZXZlbnRzLgorICoJY3R4cCBtdXN0IG5vdCBwb2ludCB0byBhbiBhaW9fY29udGV4dCB0aGF0IGFscmVhZHkgZXhpc3RzLCBhbmQKKyAqCW11c3QgYmUgaW5pdGlhbGl6ZWQgdG8gMCBwcmlvciB0byB0aGUgY2FsbC4gIE9uIHN1Y2Nlc3NmdWwKKyAqCWNyZWF0aW9uIG9mIHRoZSBhaW9fY29udGV4dCwgKmN0eHAgaXMgZmlsbGVkIGluIHdpdGggdGhlIHJlc3VsdGluZyAKKyAqCWhhbmRsZS4gIE1heSBmYWlsIHdpdGggLUVJTlZBTCBpZiAqY3R4cCBpcyBub3QgaW5pdGlhbGl6ZWQsCisgKglpZiB0aGUgc3BlY2lmaWVkIG5yX2V2ZW50cyBleGNlZWRzIGludGVybmFsIGxpbWl0cy4gIE1heSBmYWlsIAorICoJd2l0aCAtRUFHQUlOIGlmIHRoZSBzcGVjaWZpZWQgbnJfZXZlbnRzIGV4Y2VlZHMgdGhlIHVzZXIncyBsaW1pdCAKKyAqCW9mIGF2YWlsYWJsZSBldmVudHMuICBNYXkgZmFpbCB3aXRoIC1FTk9NRU0gaWYgaW5zdWZmaWNpZW50IGtlcm5lbAorICoJcmVzb3VyY2VzIGFyZSBhdmFpbGFibGUuICBNYXkgZmFpbCB3aXRoIC1FRkFVTFQgaWYgYW4gaW52YWxpZAorICoJcG9pbnRlciBpcyBwYXNzZWQgZm9yIGN0eHAuICBXaWxsIGZhaWwgd2l0aCAtRU5PU1lTIGlmIG5vdAorICoJaW1wbGVtZW50ZWQuCisgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfaW9fc2V0dXAodW5zaWduZWQgbnJfZXZlbnRzLCBhaW9fY29udGV4dF90IF9fdXNlciAqY3R4cCkKK3sKKwlzdHJ1Y3Qga2lvY3R4ICppb2N0eCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBjdHg7CisJbG9uZyByZXQ7CisKKwlyZXQgPSBnZXRfdXNlcihjdHgsIGN0eHApOworCWlmICh1bmxpa2VseShyZXQpKQorCQlnb3RvIG91dDsKKworCXJldCA9IC1FSU5WQUw7CisJaWYgKHVubGlrZWx5KGN0eCB8fCAoaW50KW5yX2V2ZW50cyA8PSAwKSkgeworCQlwcl9kZWJ1ZygiRUlOVkFMOiBpb19zZXR1cDogY3R4IG9yIG5yX2V2ZW50cyA+IG1heFxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWlvY3R4ID0gaW9jdHhfYWxsb2MobnJfZXZlbnRzKTsKKwlyZXQgPSBQVFJfRVJSKGlvY3R4KTsKKwlpZiAoIUlTX0VSUihpb2N0eCkpIHsKKwkJcmV0ID0gcHV0X3VzZXIoaW9jdHgtPnVzZXJfaWQsIGN0eHApOworCQlpZiAoIXJldCkKKwkJCXJldHVybiAwOworCisJCWdldF9pb2N0eChpb2N0eCk7IC8qIGlvX2Rlc3Ryb3koKSBleHBlY3RzIHVzIHRvIGhvbGQgYSByZWYgKi8KKwkJaW9fZGVzdHJveShpb2N0eCk7CisJfQorCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyogc3lzX2lvX2Rlc3Ryb3k6CisgKglEZXN0cm95IHRoZSBhaW9fY29udGV4dCBzcGVjaWZpZWQuICBNYXkgY2FuY2VsIGFueSBvdXRzdGFuZGluZyAKKyAqCUFJT3MgYW5kIGJsb2NrIG9uIGNvbXBsZXRpb24uICBXaWxsIGZhaWwgd2l0aCAtRU5PU1lTIGlmIG5vdAorICoJaW1wbGVtZW50ZWQuICBNYXkgZmFpbCB3aXRoIC1FRkFVTFQgaWYgdGhlIGNvbnRleHQgcG9pbnRlZCB0bworICoJaXMgaW52YWxpZC4KKyAqLworYXNtbGlua2FnZSBsb25nIHN5c19pb19kZXN0cm95KGFpb19jb250ZXh0X3QgY3R4KQoreworCXN0cnVjdCBraW9jdHggKmlvY3R4ID0gbG9va3VwX2lvY3R4KGN0eCk7CisJaWYgKGxpa2VseShOVUxMICE9IGlvY3R4KSkgeworCQlpb19kZXN0cm95KGlvY3R4KTsKKwkJcmV0dXJuIDA7CisJfQorCXByX2RlYnVnKCJFSU5WQUw6IGlvX2Rlc3Ryb3k6IGludmFsaWQgY29udGV4dCBpZFxuIik7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qCisgKiBEZWZhdWx0IHJldHJ5IG1ldGhvZCBmb3IgYWlvX3JlYWQgKGFsc28gdXNlZCBmb3IgZmlyc3QgdGltZSBzdWJtaXQpCisgKiBSZXNwb25zaWJsZSBmb3IgdXBkYXRpbmcgaW9jYiBzdGF0ZSBhcyByZXRyaWVzIHByb2dyZXNzCisgKi8KK3N0YXRpYyBzc2l6ZV90IGFpb19wcmVhZChzdHJ1Y3Qga2lvY2IgKmlvY2IpCit7CisJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZmlsZS0+Zl9tYXBwaW5nOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCXNzaXplX3QgcmV0ID0gMDsKKworCXJldCA9IGZpbGUtPmZfb3AtPmFpb19yZWFkKGlvY2IsIGlvY2ItPmtpX2J1ZiwKKwkJaW9jYi0+a2lfbGVmdCwgaW9jYi0+a2lfcG9zKTsKKworCS8qCisJICogQ2FuJ3QganVzdCBkZXBlbmQgb24gaW9jYi0+a2lfbGVmdCB0byBkZXRlcm1pbmUKKwkgKiB3aGV0aGVyIHdlIGFyZSBkb25lLiBUaGlzIG1heSBoYXZlIGJlZW4gYSBzaG9ydCByZWFkLgorCSAqLworCWlmIChyZXQgPiAwKSB7CisJCWlvY2ItPmtpX2J1ZiArPSByZXQ7CisJCWlvY2ItPmtpX2xlZnQgLT0gcmV0OworCQkvKgorCQkgKiBGb3IgcGlwZXMgYW5kIHNvY2tldHMgd2UgcmV0dXJuIG9uY2Ugd2UgaGF2ZQorCQkgKiBzb21lIGRhdGE7IGZvciByZWd1bGFyIGZpbGVzIHdlIHJldHJ5IHRpbGwgd2UKKwkJICogY29tcGxldGUgdGhlIGVudGlyZSByZWFkIG9yIGZpbmQgdGhhdCB3ZSBjYW4ndAorCQkgKiByZWFkIGFueSBtb3JlIGRhdGEgKGUuZyBzaG9ydCByZWFkcykuCisJCSAqLworCQlpZiAoIVNfSVNGSUZPKGlub2RlLT5pX21vZGUpICYmICFTX0lTU09DSyhpbm9kZS0+aV9tb2RlKSkKKwkJCXJldCA9IC1FSU9DQlJFVFJZOworCX0KKworCS8qIFRoaXMgbWVhbnMgd2UgbXVzdCBoYXZlIHRyYW5zZmVycmVkIGFsbCB0aGF0IHdlIGNvdWxkICovCisJLyogTm8gbmVlZCB0byByZXRyeSBhbnltb3JlICovCisJaWYgKChyZXQgPT0gMCkgfHwgKGlvY2ItPmtpX2xlZnQgPT0gMCkpCisJCXJldCA9IGlvY2ItPmtpX25ieXRlcyAtIGlvY2ItPmtpX2xlZnQ7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRGVmYXVsdCByZXRyeSBtZXRob2QgZm9yIGFpb193cml0ZSAoYWxzbyB1c2VkIGZvciBmaXJzdCB0aW1lIHN1Ym1pdCkKKyAqIFJlc3BvbnNpYmxlIGZvciB1cGRhdGluZyBpb2NiIHN0YXRlIGFzIHJldHJpZXMgcHJvZ3Jlc3MKKyAqLworc3RhdGljIHNzaXplX3QgYWlvX3B3cml0ZShzdHJ1Y3Qga2lvY2IgKmlvY2IpCit7CisJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOworCXNzaXplX3QgcmV0ID0gMDsKKworCXJldCA9IGZpbGUtPmZfb3AtPmFpb193cml0ZShpb2NiLCBpb2NiLT5raV9idWYsCisJCWlvY2ItPmtpX2xlZnQsIGlvY2ItPmtpX3Bvcyk7CisKKwlpZiAocmV0ID4gMCkgeworCQlpb2NiLT5raV9idWYgKz0gcmV0OworCQlpb2NiLT5raV9sZWZ0IC09IHJldDsKKworCQlyZXQgPSAtRUlPQ0JSRVRSWTsKKwl9CisKKwkvKiBUaGlzIG1lYW5zIHdlIG11c3QgaGF2ZSB0cmFuc2ZlcnJlZCBhbGwgdGhhdCB3ZSBjb3VsZCAqLworCS8qIE5vIG5lZWQgdG8gcmV0cnkgYW55bW9yZSAqLworCWlmICgocmV0ID09IDApIHx8IChpb2NiLT5raV9sZWZ0ID09IDApKQorCQlyZXQgPSBpb2NiLT5raV9uYnl0ZXMgLSBpb2NiLT5raV9sZWZ0OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYWlvX2Zkc3luYyhzdHJ1Y3Qga2lvY2IgKmlvY2IpCit7CisJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOworCXNzaXplX3QgcmV0ID0gLUVJTlZBTDsKKworCWlmIChmaWxlLT5mX29wLT5haW9fZnN5bmMpCisJCXJldCA9IGZpbGUtPmZfb3AtPmFpb19mc3luYyhpb2NiLCAxKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhaW9fZnN5bmMoc3RydWN0IGtpb2NiICppb2NiKQoreworCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKKwlzc2l6ZV90IHJldCA9IC1FSU5WQUw7CisKKwlpZiAoZmlsZS0+Zl9vcC0+YWlvX2ZzeW5jKQorCQlyZXQgPSBmaWxlLT5mX29wLT5haW9fZnN5bmMoaW9jYiwgMCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGFpb19zZXR1cF9pb2NiOgorICoJUGVyZm9ybXMgdGhlIGluaXRpYWwgY2hlY2tzIGFuZCBhaW8gcmV0cnkgbWV0aG9kCisgKglzZXR1cCBmb3IgdGhlIGtpb2NiIGF0IHRoZSB0aW1lIG9mIGlvIHN1Ym1pc3Npb24uCisgKi8KK3NzaXplX3QgYWlvX3NldHVwX2lvY2Ioc3RydWN0IGtpb2NiICpraW9jYikKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGtpb2NiLT5raV9maWxwOworCXNzaXplX3QgcmV0ID0gMDsKKworCXN3aXRjaCAoa2lvY2ItPmtpX29wY29kZSkgeworCWNhc2UgSU9DQl9DTURfUFJFQUQ6CisJCXJldCA9IC1FQkFERjsKKwkJaWYgKHVubGlrZWx5KCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpKQorCQkJYnJlYWs7CisJCXJldCA9IC1FRkFVTFQ7CisJCWlmICh1bmxpa2VseSghYWNjZXNzX29rKFZFUklGWV9XUklURSwga2lvY2ItPmtpX2J1ZiwKKwkJCWtpb2NiLT5raV9sZWZ0KSkpCisJCQlicmVhazsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJaWYgKGZpbGUtPmZfb3AtPmFpb19yZWFkKQorCQkJa2lvY2ItPmtpX3JldHJ5ID0gYWlvX3ByZWFkOworCQlicmVhazsKKwljYXNlIElPQ0JfQ01EX1BXUklURToKKwkJcmV0ID0gLUVCQURGOworCQlpZiAodW5saWtlbHkoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpKQorCQkJYnJlYWs7CisJCXJldCA9IC1FRkFVTFQ7CisJCWlmICh1bmxpa2VseSghYWNjZXNzX29rKFZFUklGWV9SRUFELCBraW9jYi0+a2lfYnVmLAorCQkJa2lvY2ItPmtpX2xlZnQpKSkKKwkJCWJyZWFrOworCQlyZXQgPSAtRUlOVkFMOworCQlpZiAoZmlsZS0+Zl9vcC0+YWlvX3dyaXRlKQorCQkJa2lvY2ItPmtpX3JldHJ5ID0gYWlvX3B3cml0ZTsKKwkJYnJlYWs7CisJY2FzZSBJT0NCX0NNRF9GRFNZTkM6CisJCXJldCA9IC1FSU5WQUw7CisJCWlmIChmaWxlLT5mX29wLT5haW9fZnN5bmMpCisJCQlraW9jYi0+a2lfcmV0cnkgPSBhaW9fZmRzeW5jOworCQlicmVhazsKKwljYXNlIElPQ0JfQ01EX0ZTWU5DOgorCQlyZXQgPSAtRUlOVkFMOworCQlpZiAoZmlsZS0+Zl9vcC0+YWlvX2ZzeW5jKQorCQkJa2lvY2ItPmtpX3JldHJ5ID0gYWlvX2ZzeW5jOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkcHJpbnRrKCJFSU5WQUw6IGlvX3N1Ym1pdDogbm8gb3BlcmF0aW9uIHByb3ZpZGVkXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWtpb2NiLT5raV9yZXRyeSkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCisvKgorICogYWlvX3dha2VfZnVuY3Rpb246CisgKiAJd2FpdCBxdWV1ZSBjYWxsYmFjayBmdW5jdGlvbiBmb3IgYWlvIG5vdGlmaWNhdGlvbiwKKyAqIAlTaW1wbHkgdHJpZ2dlcnMgYSByZXRyeSBvZiB0aGUgb3BlcmF0aW9uIHZpYSBraWNrX2lvY2IuCisgKgorICogCVRoaXMgY2FsbGJhY2sgaXMgc3BlY2lmaWVkIGluIHRoZSB3YWl0IHF1ZXVlIGVudHJ5IGluCisgKglhIGtpb2NiCShjdXJyZW50LT5pb193YWl0IHBvaW50cyB0byB0aGlzIHdhaXQgcXVldWUKKyAqCWVudHJ5IHdoZW4gYW4gYWlvIG9wZXJhdGlvbiBleGVjdXRlczsgaXQgaXMgdXNlZAorICogCWluc3RlYWQgb2YgYSBzeW5jaHJvbm91cyB3YWl0IHdoZW4gYW4gaS9vIGJsb2NraW5nCisgKgljb25kaXRpb24gaXMgZW5jb3VudGVyZWQgZHVyaW5nIGFpbykuCisgKgorICogTm90ZToKKyAqIFRoaXMgcm91dGluZSBpcyBleGVjdXRlZCB3aXRoIHRoZSB3YWl0IHF1ZXVlIGxvY2sgaGVsZC4KKyAqIFNpbmNlIGtpY2tfaW9jYiBhY3F1aXJlcyBpb2NiLT5jdHgtPmN0eF9sb2NrLCBpdCBuZXN0cworICogdGhlIGlvY3R4IGxvY2sgaW5zaWRlIHRoZSB3YWl0IHF1ZXVlIGxvY2suIFRoaXMgaXMgc2FmZQorICogYmVjYXVzZSB0aGlzIGNhbGxiYWNrIGlzbid0IHVzZWQgZm9yIHdhaXQgcXVldWVzIHdoaWNoCisgKiBhcmUgbmVzdGVkIGluc2lkZSBpb2N0eCBsb2NrIChpLmUuIGN0eC0+d2FpdCkKKyAqLworaW50IGFpb193YWtlX2Z1bmN0aW9uKHdhaXRfcXVldWVfdCAqd2FpdCwgdW5zaWduZWQgbW9kZSwgaW50IHN5bmMsIHZvaWQgKmtleSkKK3sKKwlzdHJ1Y3Qga2lvY2IgKmlvY2IgPSBjb250YWluZXJfb2Yod2FpdCwgc3RydWN0IGtpb2NiLCBraV93YWl0KTsKKworCWxpc3RfZGVsX2luaXQoJndhaXQtPnRhc2tfbGlzdCk7CisJa2lja19pb2NiKGlvY2IpOworCXJldHVybiAxOworfQorCitpbnQgZmFzdGNhbGwgaW9fc3VibWl0X29uZShzdHJ1Y3Qga2lvY3R4ICpjdHgsIHN0cnVjdCBpb2NiIF9fdXNlciAqdXNlcl9pb2NiLAorCQkJIHN0cnVjdCBpb2NiICppb2NiKQoreworCXN0cnVjdCBraW9jYiAqcmVxOworCXN0cnVjdCBmaWxlICpmaWxlOworCXNzaXplX3QgcmV0OworCisJLyogZW5mb3JjZSBmb3J3YXJkcyBjb21wYXRpYmlsaXR5IG9uIHVzZXJzICovCisJaWYgKHVubGlrZWx5KGlvY2ItPmFpb19yZXNlcnZlZDEgfHwgaW9jYi0+YWlvX3Jlc2VydmVkMiB8fAorCQkgICAgIGlvY2ItPmFpb19yZXNlcnZlZDMpKSB7CisJCXByX2RlYnVnKCJFSU5WQUw6IGlvX3N1Ym1pdDogcmVzZXJ2ZSBmaWVsZCBzZXRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBwcmV2ZW50IG92ZXJmbG93cyAqLworCWlmICh1bmxpa2VseSgKKwkgICAgKGlvY2ItPmFpb19idWYgIT0gKHVuc2lnbmVkIGxvbmcpaW9jYi0+YWlvX2J1ZikgfHwKKwkgICAgKGlvY2ItPmFpb19uYnl0ZXMgIT0gKHNpemVfdClpb2NiLT5haW9fbmJ5dGVzKSB8fAorCSAgICAoKHNzaXplX3QpaW9jYi0+YWlvX25ieXRlcyA8IDApCisJICAgKSkgeworCQlwcl9kZWJ1ZygiRUlOVkFMOiBpb19zdWJtaXQ6IG92ZXJmbG93IGNoZWNrXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZmlsZSA9IGZnZXQoaW9jYi0+YWlvX2ZpbGRlcyk7CisJaWYgKHVubGlrZWx5KCFmaWxlKSkKKwkJcmV0dXJuIC1FQkFERjsKKworCXJlcSA9IGFpb19nZXRfcmVxKGN0eCk7CQkvKiByZXR1cm5zIHdpdGggMiByZWZlcmVuY2VzIHRvIHJlcSAqLworCWlmICh1bmxpa2VseSghcmVxKSkgeworCQlmcHV0KGZpbGUpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlyZXEtPmtpX2ZpbHAgPSBmaWxlOworCWlvY2ItPmFpb19rZXkgPSByZXEtPmtpX2tleTsKKwlyZXQgPSBwdXRfdXNlcihpb2NiLT5haW9fa2V5LCAmdXNlcl9pb2NiLT5haW9fa2V5KTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlkcHJpbnRrKCJFRkFVTFQ6IGFpb19rZXlcbiIpOworCQlnb3RvIG91dF9wdXRfcmVxOworCX0KKworCXJlcS0+a2lfb2JqLnVzZXIgPSB1c2VyX2lvY2I7CisJcmVxLT5raV91c2VyX2RhdGEgPSBpb2NiLT5haW9fZGF0YTsKKwlyZXEtPmtpX3BvcyA9IGlvY2ItPmFpb19vZmZzZXQ7CisKKwlyZXEtPmtpX2J1ZiA9IChjaGFyIF9fdXNlciAqKSh1bnNpZ25lZCBsb25nKWlvY2ItPmFpb19idWY7CisJcmVxLT5raV9sZWZ0ID0gcmVxLT5raV9uYnl0ZXMgPSBpb2NiLT5haW9fbmJ5dGVzOworCXJlcS0+a2lfb3Bjb2RlID0gaW9jYi0+YWlvX2xpb19vcGNvZGU7CisJaW5pdF93YWl0cXVldWVfZnVuY19lbnRyeSgmcmVxLT5raV93YWl0LCBhaW9fd2FrZV9mdW5jdGlvbik7CisJSU5JVF9MSVNUX0hFQUQoJnJlcS0+a2lfd2FpdC50YXNrX2xpc3QpOworCXJlcS0+a2lfcnVuX2xpc3QubmV4dCA9IHJlcS0+a2lfcnVuX2xpc3QucHJldiA9IE5VTEw7CisJcmVxLT5raV9yZXRyeSA9IE5VTEw7CisJcmVxLT5raV9yZXRyaWVkID0gMDsKKwlyZXEtPmtpX2tpY2tlZCA9IDA7CisJcmVxLT5raV9xdWV1ZWQgPSAwOworCWFpb19ydW4gPSAwOworCWFpb193YWtldXBzID0gMDsKKworCXJldCA9IGFpb19zZXR1cF9pb2NiKHJlcSk7CisKKwlpZiAocmV0KQorCQlnb3RvIG91dF9wdXRfcmVxOworCisJc3Bpbl9sb2NrX2lycSgmY3R4LT5jdHhfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmcmVxLT5raV9ydW5fbGlzdCwgJmN0eC0+cnVuX2xpc3QpOworCS8qIGRyYWluIHRoZSBydW4gbGlzdCAqLworCXdoaWxlIChfX2Fpb19ydW5faW9jYnMoY3R4KSkKKwkJOworCXNwaW5fdW5sb2NrX2lycSgmY3R4LT5jdHhfbG9jayk7CisJYWlvX3B1dF9yZXEocmVxKTsJLyogZHJvcCBleHRyYSByZWYgdG8gcmVxICovCisJcmV0dXJuIDA7CisKK291dF9wdXRfcmVxOgorCWFpb19wdXRfcmVxKHJlcSk7CS8qIGRyb3AgZXh0cmEgcmVmIHRvIHJlcSAqLworCWFpb19wdXRfcmVxKHJlcSk7CS8qIGRyb3AgaS9vIHJlZiB0byByZXEgKi8KKwlyZXR1cm4gcmV0OworfQorCisvKiBzeXNfaW9fc3VibWl0OgorICoJUXVldWUgdGhlIG5yIGlvY2JzIHBvaW50ZWQgdG8gYnkgaW9jYnBwIGZvciBwcm9jZXNzaW5nLiAgUmV0dXJucworICoJdGhlIG51bWJlciBvZiBpb2NicyBxdWV1ZWQuICBNYXkgcmV0dXJuIC1FSU5WQUwgaWYgdGhlIGFpb19jb250ZXh0CisgKglzcGVjaWZpZWQgYnkgY3R4X2lkIGlzIGludmFsaWQsIGlmIG5yIGlzIDwgMCwgaWYgdGhlIGlvY2IgYXQKKyAqCSppb2NicHBbMF0gaXMgbm90IHByb3Blcmx5IGluaXRpYWxpemVkLCBpZiB0aGUgb3BlcmF0aW9uIHNwZWNpZmllZAorICoJaXMgaW52YWxpZCBmb3IgdGhlIGZpbGUgZGVzY3JpcHRvciBpbiB0aGUgaW9jYi4gIE1heSBmYWlsIHdpdGgKKyAqCS1FRkFVTFQgaWYgYW55IG9mIHRoZSBkYXRhIHN0cnVjdHVyZXMgcG9pbnQgdG8gaW52YWxpZCBkYXRhLiAgTWF5CisgKglmYWlsIHdpdGggLUVCQURGIGlmIHRoZSBmaWxlIGRlc2NyaXB0b3Igc3BlY2lmaWVkIGluIHRoZSBmaXJzdAorICoJaW9jYiBpcyBpbnZhbGlkLiAgTWF5IGZhaWwgd2l0aCAtRUFHQUlOIGlmIGluc3VmZmljaWVudCByZXNvdXJjZXMKKyAqCWFyZSBhdmFpbGFibGUgdG8gcXVldWUgYW55IGlvY2JzLiAgV2lsbCByZXR1cm4gMCBpZiBuciBpcyAwLiAgV2lsbAorICoJZmFpbCB3aXRoIC1FTk9TWVMgaWYgbm90IGltcGxlbWVudGVkLgorICovCithc21saW5rYWdlIGxvbmcgc3lzX2lvX3N1Ym1pdChhaW9fY29udGV4dF90IGN0eF9pZCwgbG9uZyBuciwKKwkJCSAgICAgIHN0cnVjdCBpb2NiIF9fdXNlciAqIF9fdXNlciAqaW9jYnBwKQoreworCXN0cnVjdCBraW9jdHggKmN0eDsKKwlsb25nIHJldCA9IDA7CisJaW50IGk7CisKKwlpZiAodW5saWtlbHkobnIgPCAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodW5saWtlbHkoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgaW9jYnBwLCAobnIqc2l6ZW9mKCppb2NicHApKSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWN0eCA9IGxvb2t1cF9pb2N0eChjdHhfaWQpOworCWlmICh1bmxpa2VseSghY3R4KSkgeworCQlwcl9kZWJ1ZygiRUlOVkFMOiBpb19zdWJtaXQ6IGludmFsaWQgY29udGV4dCBpZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogQUtQTTogc2hvdWxkIHRoaXMgcmV0dXJuIGEgcGFydGlhbCByZXN1bHQgaWYgc29tZSBvZiB0aGUgSU9zIHdlcmUKKwkgKiBzdWNjZXNzZnVsbHkgc3VibWl0dGVkPworCSAqLworCWZvciAoaT0wOyBpPG5yOyBpKyspIHsKKwkJc3RydWN0IGlvY2IgX191c2VyICp1c2VyX2lvY2I7CisJCXN0cnVjdCBpb2NiIHRtcDsKKworCQlpZiAodW5saWtlbHkoX19nZXRfdXNlcih1c2VyX2lvY2IsIGlvY2JwcCArIGkpKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHVubGlrZWx5KGNvcHlfZnJvbV91c2VyKCZ0bXAsIHVzZXJfaW9jYiwgc2l6ZW9mKHRtcCkpKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJcmV0ID0gaW9fc3VibWl0X29uZShjdHgsIHVzZXJfaW9jYiwgJnRtcCk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwl9CisKKwlwdXRfaW9jdHgoY3R4KTsKKwlyZXR1cm4gaSA/IGkgOiByZXQ7Cit9CisKKy8qIGxvb2t1cF9raW9jYgorICoJRmluZHMgYSBnaXZlbiBpb2NiIGZvciBjYW5jZWxsYXRpb24uCisgKglNVVNUIGJlIGNhbGxlZCB3aXRoIGN0eC0+Y3R4X2xvY2sgaGVsZC4KKyAqLworc3RydWN0IGtpb2NiICpsb29rdXBfa2lvY2Ioc3RydWN0IGtpb2N0eCAqY3R4LCBzdHJ1Y3QgaW9jYiBfX3VzZXIgKmlvY2IsIHUzMiBrZXkpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCS8qIFRPRE86IHVzZSBhIGhhc2ggb3IgYXJyYXksIHRoaXMgc3Vja3MuICovCisJbGlzdF9mb3JfZWFjaChwb3MsICZjdHgtPmFjdGl2ZV9yZXFzKSB7CisJCXN0cnVjdCBraW9jYiAqa2lvY2IgPSBsaXN0X2tpb2NiKHBvcyk7CisJCWlmIChraW9jYi0+a2lfb2JqLnVzZXIgPT0gaW9jYiAmJiBraW9jYi0+a2lfa2V5ID09IGtleSkKKwkJCXJldHVybiBraW9jYjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIHN5c19pb19jYW5jZWw6CisgKglBdHRlbXB0cyB0byBjYW5jZWwgYW4gaW9jYiBwcmV2aW91c2x5IHBhc3NlZCB0byBpb19zdWJtaXQuICBJZgorICoJdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsbHkgY2FuY2VsbGVkLCB0aGUgcmVzdWx0aW5nIGV2ZW50IGlzCisgKgljb3BpZWQgaW50byB0aGUgbWVtb3J5IHBvaW50ZWQgdG8gYnkgcmVzdWx0IHdpdGhvdXQgYmVpbmcgcGxhY2VkCisgKglpbnRvIHRoZSBjb21wbGV0aW9uIHF1ZXVlIGFuZCAwIGlzIHJldHVybmVkLiAgTWF5IGZhaWwgd2l0aAorICoJLUVGQVVMVCBpZiBhbnkgb2YgdGhlIGRhdGEgc3RydWN0dXJlcyBwb2ludGVkIHRvIGFyZSBpbnZhbGlkLgorICoJTWF5IGZhaWwgd2l0aCAtRUlOVkFMIGlmIGFpb19jb250ZXh0IHNwZWNpZmllZCBieSBjdHhfaWQgaXMKKyAqCWludmFsaWQuICBNYXkgZmFpbCB3aXRoIC1FQUdBSU4gaWYgdGhlIGlvY2Igc3BlY2lmaWVkIHdhcyBub3QKKyAqCWNhbmNlbGxlZC4gIFdpbGwgZmFpbCB3aXRoIC1FTk9TWVMgaWYgbm90IGltcGxlbWVudGVkLgorICovCithc21saW5rYWdlIGxvbmcgc3lzX2lvX2NhbmNlbChhaW9fY29udGV4dF90IGN0eF9pZCwgc3RydWN0IGlvY2IgX191c2VyICppb2NiLAorCQkJICAgICAgc3RydWN0IGlvX2V2ZW50IF9fdXNlciAqcmVzdWx0KQoreworCWludCAoKmNhbmNlbCkoc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3QgaW9fZXZlbnQgKnJlcyk7CisJc3RydWN0IGtpb2N0eCAqY3R4OworCXN0cnVjdCBraW9jYiAqa2lvY2I7CisJdTMyIGtleTsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2V0X3VzZXIoa2V5LCAmaW9jYi0+YWlvX2tleSk7CisJaWYgKHVubGlrZWx5KHJldCkpCisJCXJldHVybiAtRUZBVUxUOworCisJY3R4ID0gbG9va3VwX2lvY3R4KGN0eF9pZCk7CisJaWYgKHVubGlrZWx5KCFjdHgpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnEoJmN0eC0+Y3R4X2xvY2spOworCXJldCA9IC1FQUdBSU47CisJa2lvY2IgPSBsb29rdXBfa2lvY2IoY3R4LCBpb2NiLCBrZXkpOworCWlmIChraW9jYiAmJiBraW9jYi0+a2lfY2FuY2VsKSB7CisJCWNhbmNlbCA9IGtpb2NiLT5raV9jYW5jZWw7CisJCWtpb2NiLT5raV91c2VycyArKzsKKwkJa2lvY2JTZXRDYW5jZWxsZWQoa2lvY2IpOworCX0gZWxzZQorCQljYW5jZWwgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycSgmY3R4LT5jdHhfbG9jayk7CisKKwlpZiAoTlVMTCAhPSBjYW5jZWwpIHsKKwkJc3RydWN0IGlvX2V2ZW50IHRtcDsKKwkJcHJfZGVidWcoImNhbGxpbmcgY2FuY2VsXG4iKTsKKwkJbWVtc2V0KCZ0bXAsIDAsIHNpemVvZih0bXApKTsKKwkJdG1wLm9iaiA9ICh1NjQpKHVuc2lnbmVkIGxvbmcpa2lvY2ItPmtpX29iai51c2VyOworCQl0bXAuZGF0YSA9IGtpb2NiLT5raV91c2VyX2RhdGE7CisJCXJldCA9IGNhbmNlbChraW9jYiwgJnRtcCk7CisJCWlmICghcmV0KSB7CisJCQkvKiBDYW5jZWxsYXRpb24gc3VjY2VlZGVkIC0tIGNvcHkgdGhlIHJlc3VsdAorCQkJICogaW50byB0aGUgdXNlcidzIGJ1ZmZlci4KKwkJCSAqLworCQkJaWYgKGNvcHlfdG9fdXNlcihyZXN1bHQsICZ0bXAsIHNpemVvZih0bXApKSkKKwkJCQlyZXQgPSAtRUZBVUxUOworCQl9CisJfSBlbHNlCisJCXByaW50ayhLRVJOX0RFQlVHICJpb2NiIGhhcyBubyBjYW5jZWwgb3BlcmF0aW9uXG4iKTsKKworCXB1dF9pb2N0eChjdHgpOworCisJcmV0dXJuIHJldDsKK30KKworLyogaW9fZ2V0ZXZlbnRzOgorICoJQXR0ZW1wdHMgdG8gcmVhZCBhdCBsZWFzdCBtaW5fbnIgZXZlbnRzIGFuZCB1cCB0byBuciBldmVudHMgZnJvbQorICoJdGhlIGNvbXBsZXRpb24gcXVldWUgZm9yIHRoZSBhaW9fY29udGV4dCBzcGVjaWZpZWQgYnkgY3R4X2lkLiAgTWF5CisgKglmYWlsIHdpdGggLUVJTlZBTCBpZiBjdHhfaWQgaXMgaW52YWxpZCwgaWYgbWluX25yIGlzIG91dCBvZiByYW5nZSwKKyAqCWlmIG5yIGlzIG91dCBvZiByYW5nZSwgaWYgd2hlbiBpcyBvdXQgb2YgcmFuZ2UuICBNYXkgZmFpbCB3aXRoCisgKgktRUZBVUxUIGlmIGFueSBvZiB0aGUgbWVtb3J5IHNwZWNpZmllZCB0byBpcyBpbnZhbGlkLiAgTWF5IHJldHVybgorICoJMCBvciA8IG1pbl9uciBpZiBubyBldmVudHMgYXJlIGF2YWlsYWJsZSBhbmQgdGhlIHRpbWVvdXQgc3BlY2lmaWVkCisgKglieSB3aGVuCWhhcyBlbGFwc2VkLCB3aGVyZSB3aGVuID09IE5VTEwgc3BlY2lmaWVzIGFuIGluZmluaXRlCisgKgl0aW1lb3V0LiAgTm90ZSB0aGF0IHRoZSB0aW1lb3V0IHBvaW50ZWQgdG8gYnkgd2hlbiBpcyByZWxhdGl2ZSBhbmQKKyAqCXdpbGwgYmUgdXBkYXRlZCBpZiBub3QgTlVMTCBhbmQgdGhlIG9wZXJhdGlvbiBibG9ja3MuICBXaWxsIGZhaWwKKyAqCXdpdGggLUVOT1NZUyBpZiBub3QgaW1wbGVtZW50ZWQuCisgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfaW9fZ2V0ZXZlbnRzKGFpb19jb250ZXh0X3QgY3R4X2lkLAorCQkJCSBsb25nIG1pbl9uciwKKwkJCQkgbG9uZyBuciwKKwkJCQkgc3RydWN0IGlvX2V2ZW50IF9fdXNlciAqZXZlbnRzLAorCQkJCSBzdHJ1Y3QgdGltZXNwZWMgX191c2VyICp0aW1lb3V0KQoreworCXN0cnVjdCBraW9jdHggKmlvY3R4ID0gbG9va3VwX2lvY3R4KGN0eF9pZCk7CisJbG9uZyByZXQgPSAtRUlOVkFMOworCisJaWYgKGxpa2VseShpb2N0eCkpIHsKKwkJaWYgKGxpa2VseShtaW5fbnIgPD0gbnIgJiYgbWluX25yID49IDAgJiYgbnIgPj0gMCkpCisJCQlyZXQgPSByZWFkX2V2ZW50cyhpb2N0eCwgbWluX25yLCBuciwgZXZlbnRzLCB0aW1lb3V0KTsKKwkJcHV0X2lvY3R4KGlvY3R4KTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitfX2luaXRjYWxsKGFpb19zZXR1cCk7CisKK0VYUE9SVF9TWU1CT0woYWlvX2NvbXBsZXRlKTsKK0VYUE9SVF9TWU1CT0woYWlvX3B1dF9yZXEpOworRVhQT1JUX1NZTUJPTCh3YWl0X29uX3N5bmNfa2lvY2IpOwpkaWZmIC0tZ2l0IGEvZnMvYXR0ci5jIGIvZnMvYXR0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYzc2ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hdHRyLmMKQEAgLTAsMCArMSwyMDggQEAKKy8qCisgKiAgbGludXgvZnMvYXR0ci5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqICBjaGFuZ2VzIGJ5IFRob21hcyBTY2hvZWJlbC1UaGV1ZXIKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kbm90aWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorCisvKiBUYWtlbiBvdmVyIGZyb20gdGhlIG9sZCBjb2RlLi4uICovCisKKy8qIFBPU0lYIFVJRC9HSUQgdmVyaWZpY2F0aW9uIGZvciBzZXR0aW5nIGlub2RlIGF0dHJpYnV0ZXMuICovCitpbnQgaW5vZGVfY2hhbmdlX29rKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpYXR0ciAqYXR0cikKK3sKKwlpbnQgcmV0dmFsID0gLUVQRVJNOworCXVuc2lnbmVkIGludCBpYV92YWxpZCA9IGF0dHItPmlhX3ZhbGlkOworCisJLyogSWYgZm9yY2UgaXMgc2V0IGRvIGl0IGFueXdheS4gKi8KKwlpZiAoaWFfdmFsaWQgJiBBVFRSX0ZPUkNFKQorCQlnb3RvIGZpbmU7CisKKwkvKiBNYWtlIHN1cmUgYSBjYWxsZXIgY2FuIGNob3duLiAqLworCWlmICgoaWFfdmFsaWQgJiBBVFRSX1VJRCkgJiYKKwkgICAgKGN1cnJlbnQtPmZzdWlkICE9IGlub2RlLT5pX3VpZCB8fAorCSAgICAgYXR0ci0+aWFfdWlkICE9IGlub2RlLT5pX3VpZCkgJiYgIWNhcGFibGUoQ0FQX0NIT1dOKSkKKwkJZ290byBlcnJvcjsKKworCS8qIE1ha2Ugc3VyZSBjYWxsZXIgY2FuIGNoZ3JwLiAqLworCWlmICgoaWFfdmFsaWQgJiBBVFRSX0dJRCkgJiYKKwkgICAgKGN1cnJlbnQtPmZzdWlkICE9IGlub2RlLT5pX3VpZCB8fAorCSAgICAoIWluX2dyb3VwX3AoYXR0ci0+aWFfZ2lkKSAmJiBhdHRyLT5pYV9naWQgIT0gaW5vZGUtPmlfZ2lkKSkgJiYKKwkgICAgIWNhcGFibGUoQ0FQX0NIT1dOKSkKKwkJZ290byBlcnJvcjsKKworCS8qIE1ha2Ugc3VyZSBhIGNhbGxlciBjYW4gY2htb2QuICovCisJaWYgKGlhX3ZhbGlkICYgQVRUUl9NT0RFKSB7CisJCWlmICgoY3VycmVudC0+ZnN1aWQgIT0gaW5vZGUtPmlfdWlkKSAmJiAhY2FwYWJsZShDQVBfRk9XTkVSKSkKKwkJCWdvdG8gZXJyb3I7CisJCS8qIEFsc28gY2hlY2sgdGhlIHNldGdpZCBiaXQhICovCisJCWlmICghaW5fZ3JvdXBfcCgoaWFfdmFsaWQgJiBBVFRSX0dJRCkgPyBhdHRyLT5pYV9naWQgOgorCQkJCWlub2RlLT5pX2dpZCkgJiYgIWNhcGFibGUoQ0FQX0ZTRVRJRCkpCisJCQlhdHRyLT5pYV9tb2RlICY9IH5TX0lTR0lEOworCX0KKworCS8qIENoZWNrIGZvciBzZXR0aW5nIHRoZSBpbm9kZSB0aW1lLiAqLworCWlmIChpYV92YWxpZCAmIChBVFRSX01USU1FX1NFVCB8IEFUVFJfQVRJTUVfU0VUKSkgeworCQlpZiAoY3VycmVudC0+ZnN1aWQgIT0gaW5vZGUtPmlfdWlkICYmICFjYXBhYmxlKENBUF9GT1dORVIpKQorCQkJZ290byBlcnJvcjsKKwl9CitmaW5lOgorCXJldHZhbCA9IDA7CitlcnJvcjoKKwlyZXR1cm4gcmV0dmFsOworfQorCitFWFBPUlRfU1lNQk9MKGlub2RlX2NoYW5nZV9vayk7CisKK2ludCBpbm9kZV9zZXRhdHRyKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgaWF0dHIgKiBhdHRyKQoreworCXVuc2lnbmVkIGludCBpYV92YWxpZCA9IGF0dHItPmlhX3ZhbGlkOworCWludCBlcnJvciA9IDA7CisKKwlpZiAoaWFfdmFsaWQgJiBBVFRSX1NJWkUpIHsKKwkJaWYgKGF0dHItPmlhX3NpemUgIT0gaV9zaXplX3JlYWQoaW5vZGUpKSB7CisJCQllcnJvciA9IHZtdHJ1bmNhdGUoaW5vZGUsIGF0dHItPmlhX3NpemUpOworCQkJaWYgKGVycm9yIHx8IChpYV92YWxpZCA9PSBBVFRSX1NJWkUpKQorCQkJCWdvdG8gb3V0OworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFdlIHNraXBwZWQgdGhlIHRydW5jYXRlIGJ1dCBtdXN0IHN0aWxsIHVwZGF0ZQorCQkJICogdGltZXN0YW1wcworCQkJICovCisJCQlpYV92YWxpZCB8PSBBVFRSX01USU1FfEFUVFJfQ1RJTUU7CisJCX0KKwl9CisKKwlpZiAoaWFfdmFsaWQgJiBBVFRSX1VJRCkKKwkJaW5vZGUtPmlfdWlkID0gYXR0ci0+aWFfdWlkOworCWlmIChpYV92YWxpZCAmIEFUVFJfR0lEKQorCQlpbm9kZS0+aV9naWQgPSBhdHRyLT5pYV9naWQ7CisJaWYgKGlhX3ZhbGlkICYgQVRUUl9BVElNRSkKKwkJaW5vZGUtPmlfYXRpbWUgPSB0aW1lc3BlY190cnVuYyhhdHRyLT5pYV9hdGltZSwKKwkJCQkJCWlub2RlLT5pX3NiLT5zX3RpbWVfZ3Jhbik7CisJaWYgKGlhX3ZhbGlkICYgQVRUUl9NVElNRSkKKwkJaW5vZGUtPmlfbXRpbWUgPSB0aW1lc3BlY190cnVuYyhhdHRyLT5pYV9tdGltZSwKKwkJCQkJCWlub2RlLT5pX3NiLT5zX3RpbWVfZ3Jhbik7CisJaWYgKGlhX3ZhbGlkICYgQVRUUl9DVElNRSkKKwkJaW5vZGUtPmlfY3RpbWUgPSB0aW1lc3BlY190cnVuYyhhdHRyLT5pYV9jdGltZSwKKwkJCQkJCWlub2RlLT5pX3NiLT5zX3RpbWVfZ3Jhbik7CisJaWYgKGlhX3ZhbGlkICYgQVRUUl9NT0RFKSB7CisJCXVtb2RlX3QgbW9kZSA9IGF0dHItPmlhX21vZGU7CisKKwkJaWYgKCFpbl9ncm91cF9wKGlub2RlLT5pX2dpZCkgJiYgIWNhcGFibGUoQ0FQX0ZTRVRJRCkpCisJCQltb2RlICY9IH5TX0lTR0lEOworCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKKwl9CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitFWFBPUlRfU1lNQk9MKGlub2RlX3NldGF0dHIpOworCitpbnQgc2V0YXR0cl9tYXNrKHVuc2lnbmVkIGludCBpYV92YWxpZCkKK3sKKwl1bnNpZ25lZCBsb25nIGRuX21hc2sgPSAwOworCisJaWYgKGlhX3ZhbGlkICYgQVRUUl9VSUQpCisJCWRuX21hc2sgfD0gRE5fQVRUUklCOworCWlmIChpYV92YWxpZCAmIEFUVFJfR0lEKQorCQlkbl9tYXNrIHw9IEROX0FUVFJJQjsKKwlpZiAoaWFfdmFsaWQgJiBBVFRSX1NJWkUpCisJCWRuX21hc2sgfD0gRE5fTU9ESUZZOworCS8qIGJvdGggdGltZXMgaW1wbGllcyBhIHV0aW1lKHMpIGNhbGwgKi8KKwlpZiAoKGlhX3ZhbGlkICYgKEFUVFJfQVRJTUV8QVRUUl9NVElNRSkpID09IChBVFRSX0FUSU1FfEFUVFJfTVRJTUUpKQorCQlkbl9tYXNrIHw9IEROX0FUVFJJQjsKKwllbHNlIGlmIChpYV92YWxpZCAmIEFUVFJfQVRJTUUpCisJCWRuX21hc2sgfD0gRE5fQUNDRVNTOworCWVsc2UgaWYgKGlhX3ZhbGlkICYgQVRUUl9NVElNRSkKKwkJZG5fbWFzayB8PSBETl9NT0RJRlk7CisJaWYgKGlhX3ZhbGlkICYgQVRUUl9NT0RFKQorCQlkbl9tYXNrIHw9IEROX0FUVFJJQjsKKwlyZXR1cm4gZG5fbWFzazsKK30KKworaW50IG5vdGlmeV9jaGFuZ2Uoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgc3RydWN0IGlhdHRyICogYXR0cikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCW1vZGVfdCBtb2RlOworCWludCBlcnJvcjsKKwlzdHJ1Y3QgdGltZXNwZWMgbm93OworCXVuc2lnbmVkIGludCBpYV92YWxpZCA9IGF0dHItPmlhX3ZhbGlkOworCisJaWYgKCFpbm9kZSkKKwkJQlVHKCk7CisKKwltb2RlID0gaW5vZGUtPmlfbW9kZTsKKwlub3cgPSBjdXJyZW50X2ZzX3RpbWUoaW5vZGUtPmlfc2IpOworCisJYXR0ci0+aWFfY3RpbWUgPSBub3c7CisJaWYgKCEoaWFfdmFsaWQgJiBBVFRSX0FUSU1FX1NFVCkpCisJCWF0dHItPmlhX2F0aW1lID0gbm93OworCWlmICghKGlhX3ZhbGlkICYgQVRUUl9NVElNRV9TRVQpKQorCQlhdHRyLT5pYV9tdGltZSA9IG5vdzsKKwlpZiAoaWFfdmFsaWQgJiBBVFRSX0tJTExfU1VJRCkgeworCQlhdHRyLT5pYV92YWxpZCAmPSB+QVRUUl9LSUxMX1NVSUQ7CisJCWlmIChtb2RlICYgU19JU1VJRCkgeworCQkJaWYgKCEoaWFfdmFsaWQgJiBBVFRSX01PREUpKSB7CisJCQkJaWFfdmFsaWQgPSBhdHRyLT5pYV92YWxpZCB8PSBBVFRSX01PREU7CisJCQkJYXR0ci0+aWFfbW9kZSA9IGlub2RlLT5pX21vZGU7CisJCQl9CisJCQlhdHRyLT5pYV9tb2RlICY9IH5TX0lTVUlEOworCQl9CisJfQorCWlmIChpYV92YWxpZCAmIEFUVFJfS0lMTF9TR0lEKSB7CisJCWF0dHItPmlhX3ZhbGlkICY9IH4gQVRUUl9LSUxMX1NHSUQ7CisJCWlmICgobW9kZSAmIChTX0lTR0lEIHwgU19JWEdSUCkpID09IChTX0lTR0lEIHwgU19JWEdSUCkpIHsKKwkJCWlmICghKGlhX3ZhbGlkICYgQVRUUl9NT0RFKSkgeworCQkJCWlhX3ZhbGlkID0gYXR0ci0+aWFfdmFsaWQgfD0gQVRUUl9NT0RFOworCQkJCWF0dHItPmlhX21vZGUgPSBpbm9kZS0+aV9tb2RlOworCQkJfQorCQkJYXR0ci0+aWFfbW9kZSAmPSB+U19JU0dJRDsKKwkJfQorCX0KKwlpZiAoIWF0dHItPmlhX3ZhbGlkKQorCQlyZXR1cm4gMDsKKworCWlmIChpYV92YWxpZCAmIEFUVFJfU0laRSkKKwkJZG93bl93cml0ZSgmZGVudHJ5LT5kX2lub2RlLT5pX2FsbG9jX3NlbSk7CisKKwlpZiAoaW5vZGUtPmlfb3AgJiYgaW5vZGUtPmlfb3AtPnNldGF0dHIpIHsKKwkJZXJyb3IgPSBzZWN1cml0eV9pbm9kZV9zZXRhdHRyKGRlbnRyeSwgYXR0cik7CisJCWlmICghZXJyb3IpCisJCQllcnJvciA9IGlub2RlLT5pX29wLT5zZXRhdHRyKGRlbnRyeSwgYXR0cik7CisJfSBlbHNlIHsKKwkJZXJyb3IgPSBpbm9kZV9jaGFuZ2Vfb2soaW5vZGUsIGF0dHIpOworCQlpZiAoIWVycm9yKQorCQkJZXJyb3IgPSBzZWN1cml0eV9pbm9kZV9zZXRhdHRyKGRlbnRyeSwgYXR0cik7CisJCWlmICghZXJyb3IpIHsKKwkJCWlmICgoaWFfdmFsaWQgJiBBVFRSX1VJRCAmJiBhdHRyLT5pYV91aWQgIT0gaW5vZGUtPmlfdWlkKSB8fAorCQkJICAgIChpYV92YWxpZCAmIEFUVFJfR0lEICYmIGF0dHItPmlhX2dpZCAhPSBpbm9kZS0+aV9naWQpKQorCQkJCWVycm9yID0gRFFVT1RfVFJBTlNGRVIoaW5vZGUsIGF0dHIpID8gLUVEUVVPVCA6IDA7CisJCQlpZiAoIWVycm9yKQorCQkJCWVycm9yID0gaW5vZGVfc2V0YXR0cihpbm9kZSwgYXR0cik7CisJCX0KKwl9CisKKwlpZiAoaWFfdmFsaWQgJiBBVFRSX1NJWkUpCisJCXVwX3dyaXRlKCZkZW50cnktPmRfaW5vZGUtPmlfYWxsb2Nfc2VtKTsKKworCWlmICghZXJyb3IpIHsKKwkJdW5zaWduZWQgbG9uZyBkbl9tYXNrID0gc2V0YXR0cl9tYXNrKGlhX3ZhbGlkKTsKKwkJaWYgKGRuX21hc2spCisJCQlkbm90aWZ5X3BhcmVudChkZW50cnksIGRuX21hc2spOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKK0VYUE9SVF9TWU1CT0wobm90aWZ5X2NoYW5nZSk7CmRpZmYgLS1naXQgYS9mcy9hdXRvZnMvTWFrZWZpbGUgYi9mcy9hdXRvZnMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUzYTYwZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2F1dG9mcy9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBhdXRvZnMtZmlsZXN5c3RlbSByb3V0aW5lcy4KKyMKKworb2JqLSQoQ09ORklHX0FVVE9GU19GUykgKz0gYXV0b2ZzLm8KKworYXV0b2ZzLW9ianMgOj0gZGlyaGFzaC5vIGluaXQubyBpbm9kZS5vIHJvb3QubyBzeW1saW5rLm8gd2FpdHEubwpkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzL2F1dG9mc19pLmggYi9mcy9hdXRvZnMvYXV0b2ZzX2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTcxNDMxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYXV0b2ZzL2F1dG9mc19pLmgKQEAgLTAsMCArMSwxNjQgQEAKKy8qIC0qLSBsaW51eC1jIC0qLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqICAgCisgKiBsaW51eC9mcy9hdXRvZnMvYXV0b2ZzX2kuaAorICoKKyAqICAgQ29weXJpZ2h0IDE5OTctMTk5OCBUcmFuc21ldGEgQ29ycG9yYXRpb24gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCBhbmQgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgb3IgYXQgeW91cgorICogb3B0aW9uLCBhbnkgbGF0ZXIgdmVyc2lvbiwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogSW50ZXJuYWwgaGVhZGVyIGZpbGUgZm9yIGF1dG9mcyAqLworCisjaW5jbHVkZSA8bGludXgvYXV0b19mcy5oPgorCisvKiBUaGlzIGlzIHRoZSByYW5nZSBvZiBpb2N0bCgpIG51bWJlcnMgd2UgY2xhaW0gYXMgb3VycyAqLworI2RlZmluZSBBVVRPRlNfSU9DX0ZJUlNUICAgICBBVVRPRlNfSU9DX1JFQURZCisjZGVmaW5lIEFVVE9GU19JT0NfQ09VTlQgICAgIDMyCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2lmZGVmIERFQlVHCisjZGVmaW5lIERQUklOVEsoRCkgKHByaW50ayBEKQorI2Vsc2UKKyNkZWZpbmUgRFBSSU5USyhEKSAoKHZvaWQpMCkKKyNlbmRpZgorCisjZGVmaW5lIEFVVE9GU19TVVBFUl9NQUdJQyAweDAxODcKKworLyoKKyAqIElmIHRoZSBkYWVtb24gcmV0dXJucyBhIG5lZ2F0aXZlIHJlc3BvbnNlIChBVVRPRlNfSU9DX0ZBSUwpIHRoZW4gdGhlCisgKiBrZXJuZWwgd2lsbCBrZWVwIHRoZSBuZWdhdGl2ZSByZXNwb25zZSBjYWNoZWQgZm9yIHVwIHRvIHRoZSB0aW1lIGdpdmVuCisgKiBoZXJlLCBhbHRob3VnaCB0aGUgdGltZSBjYW4gYmUgc2hvcnRlciBpZiB0aGUga2VybmVsIHRocm93cyB0aGUgZGNhY2hlCisgKiBlbnRyeSBhd2F5LiAgVGhpcyBwcm9iYWJseSBzaG91bGQgYmUgc2V0dGFibGUgZnJvbSB1c2VyIHNwYWNlLgorICovCisjZGVmaW5lIEFVVE9GU19ORUdBVElWRV9USU1FT1VUICg2MCpIWikJLyogMSBtaW51dGUgKi8KKworLyogU3RydWN0dXJlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJvb3QgZGlyZWN0b3J5IGhhc2ggdGFibGUgKi8KKworI2RlZmluZSBBVVRPRlNfSEFTSF9TSVpFIDY3CisKK3N0cnVjdCBhdXRvZnNfZGlyX2VudCB7CisJaW50IGhhc2g7CisJY2hhciAqbmFtZTsKKwlpbnQgbGVuOworCWlub190IGlubzsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJLyogTGlua2VkIGxpc3Qgb2YgZW50cmllcyAqLworCXN0cnVjdCBhdXRvZnNfZGlyX2VudCAqbmV4dDsKKwlzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKipiYWNrOworCS8qIFRoZSBmb2xsb3dpbmcgZW50cmllcyBhcmUgZm9yIHRoZSBleHBpcnkgc3lzdGVtICovCisJdW5zaWduZWQgbG9uZyBsYXN0X3VzYWdlOworCXN0cnVjdCBsaXN0X2hlYWQgZXhwOworfTsKKworc3RydWN0IGF1dG9mc19kaXJoYXNoIHsKKwlzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKmhbQVVUT0ZTX0hBU0hfU0laRV07CisJc3RydWN0IGxpc3RfaGVhZCBleHBpcnlfaGVhZDsKK307CisKK3N0cnVjdCBhdXRvZnNfd2FpdF9xdWV1ZSB7CisJd2FpdF9xdWV1ZV9oZWFkX3QgcXVldWU7CisJc3RydWN0IGF1dG9mc193YWl0X3F1ZXVlICpuZXh0OworCWF1dG9mc193cXRfdCB3YWl0X3F1ZXVlX3Rva2VuOworCS8qIFdlIHVzZSB0aGUgZm9sbG93aW5nIHRvIHNlZSB3aGF0IHdlIGFyZSB3YWl0aW5nIGZvciAqLworCWludCBoYXNoOworCWludCBsZW47CisJY2hhciAqbmFtZTsKKwkvKiBUaGlzIGlzIGZvciBzdGF0dXMgcmVwb3J0aW5nIHVwb24gcmV0dXJuICovCisJaW50IHN0YXR1czsKKwlpbnQgd2FpdF9jdHI7Cit9OworCitzdHJ1Y3QgYXV0b2ZzX3N5bWxpbmsgeworCWNoYXIgKmRhdGE7CisJaW50IGxlbjsKKwl0aW1lX3QgbXRpbWU7Cit9OworCisjZGVmaW5lIEFVVE9GU19NQVhfU1lNTElOS1MgMjU2CisKKyNkZWZpbmUgQVVUT0ZTX1JPT1RfSU5PICAgICAgMQorI2RlZmluZSBBVVRPRlNfRklSU1RfU1lNTElOSyAyCisjZGVmaW5lIEFVVE9GU19GSVJTVF9ESVJfSU5PIChBVVRPRlNfRklSU1RfU1lNTElOSytBVVRPRlNfTUFYX1NZTUxJTktTKQorCisjZGVmaW5lIEFVVE9GU19TWU1MSU5LX0JJVE1BUF9MRU4gXAorCSgoQVVUT0ZTX01BWF9TWU1MSU5LUysoKHNpemVvZihsb25nKSoxKS0xKSkvKHNpemVvZihsb25nKSo4KSkKKworI2RlZmluZSBBVVRPRlNfU0JJX01BR0lDIDB4NmQ0YTU1NmQKKworc3RydWN0IGF1dG9mc19zYl9pbmZvIHsKKwl1MzIgbWFnaWM7CisJc3RydWN0IGZpbGUgKnBpcGU7CisJcGlkX3Qgb3pfcGdycDsKKwlpbnQgY2F0YXRvbmljOworCXVuc2lnbmVkIGxvbmcgZXhwX3RpbWVvdXQ7CisJaW5vX3QgbmV4dF9kaXJfaW5vOworCXN0cnVjdCBhdXRvZnNfd2FpdF9xdWV1ZSAqcXVldWVzOyAvKiBXYWl0IHF1ZXVlIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgYXV0b2ZzX2Rpcmhhc2ggZGlyaGFzaDsgLyogUm9vdCBkaXJlY3RvcnkgaGFzaCAqLworCXN0cnVjdCBhdXRvZnNfc3ltbGluayBzeW1saW5rW0FVVE9GU19NQVhfU1lNTElOS1NdOworCXVuc2lnbmVkIGxvbmcgc3ltbGlua19iaXRtYXBbQVVUT0ZTX1NZTUxJTktfQklUTUFQX0xFTl07Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqYXV0b2ZzX3NiaShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXJldHVybiAoc3RydWN0IGF1dG9mc19zYl9pbmZvICopKHNiLT5zX2ZzX2luZm8pOworfQorCisvKiBhdXRvZnNfb3pfbW9kZSgpOiBkbyB3ZSBzZWUgdGhlIG1hbiBiZWhpbmQgdGhlIGN1cnRhaW4/ICAoVGhlCisgICBwcm9jZXNzZXMgd2hpY2ggZG8gbWFuaXB1bGF0aW9ucyBmb3IgdXMgaW4gdXNlciBzcGFjZSBzZWVzIHRoZSByYXcKKyAgIGZpbGVzeXN0ZW0gd2l0aG91dCAibWFnaWMiLikgKi8KKworc3RhdGljIGlubGluZSBpbnQgYXV0b2ZzX296X21vZGUoc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmkpIHsKKwlyZXR1cm4gc2JpLT5jYXRhdG9uaWMgfHwgcHJvY2Vzc19ncm91cChjdXJyZW50KSA9PSBzYmktPm96X3BncnA7Cit9CisKKy8qIEhhc2ggb3BlcmF0aW9ucyAqLworCit2b2lkIGF1dG9mc19pbml0aWFsaXplX2hhc2goc3RydWN0IGF1dG9mc19kaXJoYXNoICopOworc3RydWN0IGF1dG9mc19kaXJfZW50ICphdXRvZnNfaGFzaF9sb29rdXAoY29uc3Qgc3RydWN0IGF1dG9mc19kaXJoYXNoICosc3RydWN0IHFzdHIgKik7Cit2b2lkIGF1dG9mc19oYXNoX2luc2VydChzdHJ1Y3QgYXV0b2ZzX2Rpcmhhc2ggKixzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKik7Cit2b2lkIGF1dG9mc19oYXNoX2RlbGV0ZShzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKik7CitzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKmF1dG9mc19oYXNoX2VudW0oY29uc3Qgc3RydWN0IGF1dG9mc19kaXJoYXNoICosb2ZmX3QgKixzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKik7Cit2b2lkIGF1dG9mc19oYXNoX2RwdXRhbGwoc3RydWN0IGF1dG9mc19kaXJoYXNoICopOwordm9pZCBhdXRvZnNfaGFzaF9udWtlKHN0cnVjdCBhdXRvZnNfZGlyaGFzaCAqKTsKKworLyogRXhwaXJhdGlvbi1oYW5kbGluZyBmdW5jdGlvbnMgKi8KKwordm9pZCBhdXRvZnNfdXBkYXRlX3VzYWdlKHN0cnVjdCBhdXRvZnNfZGlyaGFzaCAqLHN0cnVjdCBhdXRvZnNfZGlyX2VudCAqKTsKK3N0cnVjdCBhdXRvZnNfZGlyX2VudCAqYXV0b2ZzX2V4cGlyZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKixzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKiwgc3RydWN0IHZmc21vdW50ICptbnQpOworCisvKiBPcGVyYXRpb25zIHN0cnVjdHVyZXMgKi8KKworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGF1dG9mc19yb290X2lub2RlX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgYXV0b2ZzX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1dG9mc19yb290X29wZXJhdGlvbnM7CisKKy8qIEluaXRpYWxpemluZyBmdW5jdGlvbiAqLworCitpbnQgYXV0b2ZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICosIHZvaWQgKiwgaW50KTsKKworLyogUXVldWUgbWFuYWdlbWVudCBmdW5jdGlvbnMgKi8KKworaW50IGF1dG9mc193YWl0KHN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqLHN0cnVjdCBxc3RyICopOworaW50IGF1dG9mc193YWl0X3JlbGVhc2Uoc3RydWN0IGF1dG9mc19zYl9pbmZvICosYXV0b2ZzX3dxdF90LGludCk7Cit2b2lkIGF1dG9mc19jYXRhdG9uaWNfbW9kZShzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKik7CisKKyNpZmRlZiBERUJVRwordm9pZCBhdXRvZnNfc2F5KGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4pOworI2Vsc2UKKyNkZWZpbmUgYXV0b2ZzX3NheShuLGwpICgodm9pZCkwKQorI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9hdXRvZnMvZGlyaGFzaC5jIGIvZnMvYXV0b2ZzL2Rpcmhhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDgxNDNmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYXV0b2ZzL2Rpcmhhc2guYwpAQCAtMCwwICsxLDI0OSBAQAorLyogLSotIGxpbnV4LWMgLSotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogbGludXgvZnMvYXV0b2ZzL2Rpcmhhc2guYworICoKKyAqICBDb3B5cmlnaHQgMTk5Ny0xOTk4IFRyYW5zbWV0YSBDb3Jwb3JhdGlvbiAtLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCBhbmQgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgb3IgYXQgeW91cgorICogb3B0aW9uLCBhbnkgbGF0ZXIgdmVyc2lvbiwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSAiYXV0b2ZzX2kuaCIKKworLyogRnVuY3Rpb25zIGZvciBtYWludGVuYW5jZSBvZiBleHBpcnkgcXVldWUgKi8KKworc3RhdGljIHZvaWQgYXV0b2ZzX2luaXRfdXNhZ2Uoc3RydWN0IGF1dG9mc19kaXJoYXNoICpkaCwKKwkJCSAgICAgIHN0cnVjdCBhdXRvZnNfZGlyX2VudCAqZW50KQoreworCWxpc3RfYWRkX3RhaWwoJmVudC0+ZXhwLCAmZGgtPmV4cGlyeV9oZWFkKTsKKwllbnQtPmxhc3RfdXNhZ2UgPSBqaWZmaWVzOworfQorCitzdGF0aWMgdm9pZCBhdXRvZnNfZGVsZXRlX3VzYWdlKHN0cnVjdCBhdXRvZnNfZGlyX2VudCAqZW50KQoreworCWxpc3RfZGVsKCZlbnQtPmV4cCk7Cit9CisKK3ZvaWQgYXV0b2ZzX3VwZGF0ZV91c2FnZShzdHJ1Y3QgYXV0b2ZzX2Rpcmhhc2ggKmRoLAorCQkJIHN0cnVjdCBhdXRvZnNfZGlyX2VudCAqZW50KQoreworCWF1dG9mc19kZWxldGVfdXNhZ2UoZW50KTsgICAvKiBVbmxpbmsgZnJvbSBjdXJyZW50IHBvc2l0aW9uICovCisJYXV0b2ZzX2luaXRfdXNhZ2UoZGgsZW50KTsgIC8qIFJlbGluayBhdCBxdWV1ZSB0YWlsICovCit9CisKK3N0cnVjdCBhdXRvZnNfZGlyX2VudCAqYXV0b2ZzX2V4cGlyZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgICAgc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmksCisJCQkJICAgICBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKK3sKKwlzdHJ1Y3QgYXV0b2ZzX2Rpcmhhc2ggKmRoID0gJnNiaS0+ZGlyaGFzaDsKKwlzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKmVudDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gc2JpLT5leHBfdGltZW91dDsKKworCXdoaWxlICgxKSB7CisJCWlmICggbGlzdF9lbXB0eSgmZGgtPmV4cGlyeV9oZWFkKSB8fCBzYmktPmNhdGF0b25pYyApCisJCQlyZXR1cm4gTlVMTDsJLyogTm8gZW50cmllcyAqLworCQkvKiBXZSBrZWVwIHRoZSBsaXN0IHNvcnRlZCBieSBsYXN0X3VzYWdlIGFuZCB3YW50IG9sZCBzdHVmZiAqLworCQllbnQgPSBsaXN0X2VudHJ5KGRoLT5leHBpcnlfaGVhZC5uZXh0LCBzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQsIGV4cCk7CisJCWlmIChqaWZmaWVzIC0gZW50LT5sYXN0X3VzYWdlIDwgdGltZW91dCkKKwkJCWJyZWFrOworCQkvKiBNb3ZlIHRvIGVuZCBvZiBsaXN0IGluIGNhc2UgZXhwaXJ5IGlzbid0IGRlc2lyYWJsZSAqLworCQlhdXRvZnNfdXBkYXRlX3VzYWdlKGRoLCBlbnQpOworCisJCS8qIENoZWNrIHRvIHNlZSB0aGF0IGVudHJ5IGlzIGV4cGlyYWJsZSAqLworCQlpZiAoIGVudC0+aW5vIDwgQVVUT0ZTX0ZJUlNUX0RJUl9JTk8gKQorCQkJcmV0dXJuIGVudDsgLyogU3ltbGlua3MgYXJlIGFsd2F5cyBleHBpcmFibGUgKi8KKworCQkvKiBHZXQgdGhlIGRlbnRyeSBmb3IgdGhlIGF1dG9mcyBzdWJkaXJlY3RvcnkgKi8KKwkJZGVudHJ5ID0gZW50LT5kZW50cnk7CisKKwkJaWYgKCAhZGVudHJ5ICkgeworCQkJLyogU2hvdWxkIG9ubHkgaGFwcGVuIGluIGNhdGF0b25pYyBtb2RlICovCisJCQlwcmludGsoImF1dG9mczogZGVudHJ5ID09IE5VTEwgYnV0IGlub2RlIHJhbmdlIGlzIGRpcmVjdG9yeSwgZW50cnkgJXNcbiIsIGVudC0+bmFtZSk7CisJCQlhdXRvZnNfZGVsZXRlX3VzYWdlKGVudCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICggIWRlbnRyeS0+ZF9pbm9kZSApIHsKKwkJCWRwdXQoZGVudHJ5KTsKKwkJCXByaW50aygiYXV0b2ZzOiBuZWdhdGl2ZSBkZW50cnkgb24gZXhwaXJ5IHF1ZXVlOiAlc1xuIiwKKwkJCSAgICAgICBlbnQtPm5hbWUpOworCQkJYXV0b2ZzX2RlbGV0ZV91c2FnZShlbnQpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBNYWtlIHN1cmUgZW50cnkgaXMgbW91bnRlZCBhbmQgdW51c2VkOyBub3RlIHRoYXQgZGVudHJ5IHdpbGwKKwkJICAgcG9pbnQgdG8gdGhlIG1vdW50ZWQtb24tdG9wIHJvb3QuICovCisJCWlmICghU19JU0RJUihkZW50cnktPmRfaW5vZGUtPmlfbW9kZSl8fCFkX21vdW50cG9pbnQoZGVudHJ5KSkgeworCQkJRFBSSU5USygoImF1dG9mczogbm90IGV4cGlyYWJsZSAobm90IGEgbW91bnRlZCBkaXJlY3RvcnkpOiAlc1xuIiwgZW50LT5uYW1lKSk7CisJCQljb250aW51ZTsKKwkJfQorCQltbnRnZXQobW50KTsKKwkJZGdldChkZW50cnkpOworCQlpZiAoIWZvbGxvd19kb3duKCZtbnQsICZkZW50cnkpKSB7CisJCQlkcHV0KGRlbnRyeSk7CisJCQltbnRwdXQobW50KTsKKwkJCURQUklOVEsoKCJhdXRvZnM6IG5vdCBleHBpcmFibGUgKG5vdCBhIG1vdW50ZWQgZGlyZWN0b3J5KTogJXNcbiIsIGVudC0+bmFtZSkpOworCQkJY29udGludWU7CisJCX0KKwkJd2hpbGUgKGRfbW91bnRwb2ludChkZW50cnkpICYmIGZvbGxvd19kb3duKCZtbnQsICZkZW50cnkpKQorCQkJOworCQlkcHV0KGRlbnRyeSk7CisKKwkJaWYgKCBtYXlfdW1vdW50KG1udCkgPT0gMCApIHsKKwkJCW1udHB1dChtbnQpOworCQkJRFBSSU5USygoImF1dG9mczogc2lnbmFsaW5nIGV4cGlyZSBvbiAlc1xuIiwgZW50LT5uYW1lKSk7CisJCQlyZXR1cm4gZW50OyAvKiBFeHBpcmFibGUhICovCisJCX0KKwkJRFBSSU5USygoImF1dG9mczogZGlkbid0IGV4cGlyZSBkdWUgdG8gbWF5X3Vtb3VudDogJXNcbiIsIGVudC0+bmFtZSkpOworCQltbnRwdXQobW50KTsKKwl9CisJcmV0dXJuIE5VTEw7CQkvKiBObyBleHBpcmFibGUgZW50cmllcyAqLworfQorCit2b2lkIGF1dG9mc19pbml0aWFsaXplX2hhc2goc3RydWN0IGF1dG9mc19kaXJoYXNoICpkaCkgeworCW1lbXNldCgmZGgtPmgsIDAsIEFVVE9GU19IQVNIX1NJWkUqc2l6ZW9mKHN0cnVjdCBhdXRvZnNfZGlyX2VudCAqKSk7CisJSU5JVF9MSVNUX0hFQUQoJmRoLT5leHBpcnlfaGVhZCk7Cit9CisKK3N0cnVjdCBhdXRvZnNfZGlyX2VudCAqYXV0b2ZzX2hhc2hfbG9va3VwKGNvbnN0IHN0cnVjdCBhdXRvZnNfZGlyaGFzaCAqZGgsIHN0cnVjdCBxc3RyICpuYW1lKQoreworCXN0cnVjdCBhdXRvZnNfZGlyX2VudCAqZGhuOworCisJRFBSSU5USygoImF1dG9mc19oYXNoX2xvb2t1cDogaGFzaCA9IDB4JTA4eCwgbmFtZSA9ICIsIG5hbWUtPmhhc2gpKTsKKwlhdXRvZnNfc2F5KG5hbWUtPm5hbWUsbmFtZS0+bGVuKTsKKworCWZvciAoIGRobiA9IGRoLT5oWyh1bnNpZ25lZCkgbmFtZS0+aGFzaCAlIEFVVE9GU19IQVNIX1NJWkVdIDsgZGhuIDsgZGhuID0gZGhuLT5uZXh0ICkgeworCQlpZiAoIG5hbWUtPmhhc2ggPT0gZGhuLT5oYXNoICYmCisJCSAgICAgbmFtZS0+bGVuID09IGRobi0+bGVuICYmCisJCSAgICAgIW1lbWNtcChuYW1lLT5uYW1lLCBkaG4tPm5hbWUsIG5hbWUtPmxlbikgKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGRobjsKK30KKwordm9pZCBhdXRvZnNfaGFzaF9pbnNlcnQoc3RydWN0IGF1dG9mc19kaXJoYXNoICpkaCwgc3RydWN0IGF1dG9mc19kaXJfZW50ICplbnQpCit7CisJc3RydWN0IGF1dG9mc19kaXJfZW50ICoqZGhucDsKKworCURQUklOVEsoKCJhdXRvZnNfaGFzaF9pbnNlcnQ6IGhhc2ggPSAweCUwOHgsIG5hbWUgPSAiLCBlbnQtPmhhc2gpKTsKKwlhdXRvZnNfc2F5KGVudC0+bmFtZSxlbnQtPmxlbik7CisKKwlhdXRvZnNfaW5pdF91c2FnZShkaCxlbnQpOworCWlmIChlbnQtPmRlbnRyeSkKKwkJZGdldChlbnQtPmRlbnRyeSk7CisKKwlkaG5wID0gJmRoLT5oWyh1bnNpZ25lZCkgZW50LT5oYXNoICUgQVVUT0ZTX0hBU0hfU0laRV07CisJZW50LT5uZXh0ID0gKmRobnA7CisJZW50LT5iYWNrID0gZGhucDsKKwkqZGhucCA9IGVudDsKKwlpZiAoIGVudC0+bmV4dCApCisJCWVudC0+bmV4dC0+YmFjayA9ICYoZW50LT5uZXh0KTsKK30KKwordm9pZCBhdXRvZnNfaGFzaF9kZWxldGUoc3RydWN0IGF1dG9mc19kaXJfZW50ICplbnQpCit7CisJKihlbnQtPmJhY2spID0gZW50LT5uZXh0OworCWlmICggZW50LT5uZXh0ICkKKwkJZW50LT5uZXh0LT5iYWNrID0gZW50LT5iYWNrOworCisJYXV0b2ZzX2RlbGV0ZV91c2FnZShlbnQpOworCisJaWYgKCBlbnQtPmRlbnRyeSApCisJCWRwdXQoZW50LT5kZW50cnkpOworCWtmcmVlKGVudC0+bmFtZSk7CisJa2ZyZWUoZW50KTsKK30KKworLyoKKyAqIFVzZWQgYnkgcmVhZGRpcigpLiAgV2UgbXVzdCB2YWxpZGF0ZSAicHRyIiwgc28gd2UgY2FuJ3Qgc2ltcGx5IG1ha2UgaXQKKyAqIGEgcG9pbnRlci4gIFZhbHVlcyBiZWxvdyAweGZmZmYgYXJlIHJlc2VydmVkOyBjYWxsaW5nIHdpdGggYW55IHZhbHVlCisgKiA8PSAweDEwMDAwIHdpbGwgcmV0dXJuIHRoZSBmaXJzdCBlbnRyeSBmb3VuZC4KKyAqCisgKiAibGFzdCIgY2FuIGJlIE5VTEwgb3IgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBsYXN0IHNlYXJjaCAqaWYqIHdlCisgKiB3YW50IHRoZSBuZXh0IHNlcXVlbnRpYWwgZW50cnkuCisgKi8KK3N0cnVjdCBhdXRvZnNfZGlyX2VudCAqYXV0b2ZzX2hhc2hfZW51bShjb25zdCBzdHJ1Y3QgYXV0b2ZzX2Rpcmhhc2ggKmRoLAorCQkJCQlvZmZfdCAqcHRyLCBzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKmxhc3QpCit7CisJaW50IGJ1Y2tldCwgZWNvdW50LCBpOworCXN0cnVjdCBhdXRvZnNfZGlyX2VudCAqZW50OworCisJYnVja2V0ID0gKCpwdHIgPj4gMTYpIC0gMTsKKwllY291bnQgPSAqcHRyICYgMHhmZmZmOworCisJaWYgKCBidWNrZXQgPCAwICkgeworCQlidWNrZXQgPSBlY291bnQgPSAwOworCX0gCisKKwlEUFJJTlRLKCgiYXV0b2ZzX2hhc2hfZW51bTogYnVja2V0ICVkLCBlbnRyeSAlZFxuIiwgYnVja2V0LCBlY291bnQpKTsKKworCWVudCA9IGxhc3QgPyBsYXN0LT5uZXh0IDogTlVMTDsKKworCWlmICggZW50ICkgeworCQllY291bnQrKzsKKwl9IGVsc2UgeworCQl3aGlsZSAgKCBidWNrZXQgPCBBVVRPRlNfSEFTSF9TSVpFICkgeworCQkJZW50ID0gZGgtPmhbYnVja2V0XTsKKwkJCWZvciAoIGkgPSBlY291bnQgOyBlbnQgJiYgaSA7IGktLSApCisJCQkJZW50ID0gZW50LT5uZXh0OworCQkJCisJCQlpZiAoZW50KSB7CisJCQkJZWNvdW50Kys7IC8qIFBvaW50IHRvICpuZXh0KiBlbnRyeSAqLworCQkJCWJyZWFrOworCQkJfQorCQkJCisJCQlidWNrZXQrKzsgZWNvdW50ID0gMDsKKwkJfQorCX0KKworI2lmZGVmIERFQlVHCisJaWYgKCAhZW50ICkKKwkJcHJpbnRrKCJhdXRvZnNfaGFzaF9lbnVtOiBub3RoaW5nIGZvdW5kXG4iKTsKKwllbHNlIHsKKwkJcHJpbnRrKCJhdXRvZnNfaGFzaF9lbnVtOiBmb3VuZCBoYXNoICUwOHgsIG5hbWUiLCBlbnQtPmhhc2gpOworCQlhdXRvZnNfc2F5KGVudC0+bmFtZSxlbnQtPmxlbik7CisJfQorI2VuZGlmCisKKwkqcHRyID0gKChidWNrZXQrMSkgPDwgMTYpICsgZWNvdW50OworCXJldHVybiBlbnQ7Cit9CisKKy8qIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGVudHMsIGFuZCByZW1vdmUgYWxsIGRlbnRyeSBwb2ludGVycy4gIFVzZWQgb24KKyAgIGVudGVyaW5nIGNhdGF0b25pYyBtb2RlLCBpbiBvcmRlciB0byBtYWtlIHRoZSBmaWxlc3lzdGVtIHVubW91bnRhYmxlLiAqLwordm9pZCBhdXRvZnNfaGFzaF9kcHV0YWxsKHN0cnVjdCBhdXRvZnNfZGlyaGFzaCAqZGgpCit7CisJaW50IGk7CisJc3RydWN0IGF1dG9mc19kaXJfZW50ICplbnQ7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBBVVRPRlNfSEFTSF9TSVpFIDsgaSsrICkgeworCQlmb3IgKCBlbnQgPSBkaC0+aFtpXSA7IGVudCA7IGVudCA9IGVudC0+bmV4dCApIHsKKwkJCWlmICggZW50LT5kZW50cnkgKSB7CisJCQkJZHB1dChlbnQtPmRlbnRyeSk7CisJCQkJZW50LT5kZW50cnkgPSBOVUxMOworCQkJfQorCQl9CisJfQorfQorCisvKiBEZWxldGUgZXZlcnl0aGluZy4gIFRoaXMgaXMgdXNlZCBvbiBmaWxlc3lzdGVtIGRlc3RydWN0aW9uLCBzbyB3ZQorICAgbWFrZSBubyBhdHRlbXB0IHRvIGtlZXAgdGhlIHBvaW50ZXJzIHZhbGlkICovCit2b2lkIGF1dG9mc19oYXNoX251a2Uoc3RydWN0IGF1dG9mc19kaXJoYXNoICpkaCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKmVudCwgKm5lbnQ7CisKKwlmb3IgKCBpID0gMCA7IGkgPCBBVVRPRlNfSEFTSF9TSVpFIDsgaSsrICkgeworCQlmb3IgKCBlbnQgPSBkaC0+aFtpXSA7IGVudCA7IGVudCA9IG5lbnQgKSB7CisJCQluZW50ID0gZW50LT5uZXh0OworCQkJaWYgKCBlbnQtPmRlbnRyeSApCisJCQkJZHB1dChlbnQtPmRlbnRyeSk7CisJCQlrZnJlZShlbnQtPm5hbWUpOworCQkJa2ZyZWUoZW50KTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2ZzL2F1dG9mcy9pbml0LmMgYi9mcy9hdXRvZnMvaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NzdlY2UKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hdXRvZnMvaW5pdC5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qIC0qLSBsaW51eC1jIC0qLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqIGxpbnV4L2ZzL2F1dG9mcy9pbml0LmMKKyAqCisgKiAgQ29weXJpZ2h0IDE5OTctMTk5OCBUcmFuc21ldGEgQ29ycG9yYXRpb24gLS0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIG9yIGF0IHlvdXIKKyAqIG9wdGlvbiwgYW55IGxhdGVyIHZlcnNpb24sIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlICJhdXRvZnNfaS5oIgorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICphdXRvZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9ub2Rldihmc190eXBlLCBmbGFncywgZGF0YSwgYXV0b2ZzX2ZpbGxfc3VwZXIpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgYXV0b2ZzX2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJhdXRvZnMiLAorCS5nZXRfc2IJCT0gYXV0b2ZzX2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfYW5vbl9zdXBlciwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfYXV0b2ZzX2ZzKHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmF1dG9mc19mc190eXBlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfYXV0b2ZzX2ZzKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZhdXRvZnNfZnNfdHlwZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfYXV0b2ZzX2ZzKTsKK21vZHVsZV9leGl0KGV4aXRfYXV0b2ZzX2ZzKTsKKworI2lmZGVmIERFQlVHCit2b2lkIGF1dG9mc19zYXkoY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbikKK3sKKwlwcmludGsoIiglZDogIiwgbGVuKTsKKwl3aGlsZSAoIGxlbi0tICkKKwkJcHJpbnRrKCIlYyIsICpuYW1lKyspOworCXByaW50aygiKVxuIik7Cit9CisjZW5kaWYKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL2F1dG9mcy9pbm9kZS5jIGIvZnMvYXV0b2ZzL2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg4OGMxZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2F1dG9mcy9pbm9kZS5jCkBAIC0wLDAgKzEsMjUwIEBACisvKiAtKi0gbGludXgtYyAtKi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiBsaW51eC9mcy9hdXRvZnMvaW5vZGUuYworICoKKyAqICBDb3B5cmlnaHQgMTk5Ny0xOTk4IFRyYW5zbWV0YSBDb3Jwb3JhdGlvbiAtLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCBhbmQgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgb3IgYXQgeW91cgorICogb3B0aW9uLCBhbnkgbGF0ZXIgdmVyc2lvbiwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgImF1dG9mc19pLmgiCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKK3N0YXRpYyB2b2lkIGF1dG9mc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSA9IGF1dG9mc19zYmkoc2IpOworCXVuc2lnbmVkIGludCBuOworCisJaWYgKCAhc2JpLT5jYXRhdG9uaWMgKQorCQlhdXRvZnNfY2F0YXRvbmljX21vZGUoc2JpKTsgLyogRnJlZSB3YWl0IHF1ZXVlcywgY2xvc2UgcGlwZSAqLworCisJYXV0b2ZzX2hhc2hfbnVrZSgmc2JpLT5kaXJoYXNoKTsKKwlmb3IgKCBuID0gMCA7IG4gPCBBVVRPRlNfTUFYX1NZTUxJTktTIDsgbisrICkgeworCQlpZiAoIHRlc3RfYml0KG4sIHNiaS0+c3ltbGlua19iaXRtYXApICkKKwkJCWtmcmVlKHNiaS0+c3ltbGlua1tuXS5kYXRhKTsKKwl9CisKKwlrZnJlZShzYi0+c19mc19pbmZvKTsKKworCURQUklOVEsoKCJhdXRvZnM6IHNodXR0aW5nIGRvd25cbiIpKTsKK30KKworc3RhdGljIHZvaWQgYXV0b2ZzX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBhdXRvZnNfc29wcyA9IHsKKwkucmVhZF9pbm9kZQk9IGF1dG9mc19yZWFkX2lub2RlLAorCS5wdXRfc3VwZXIJPSBhdXRvZnNfcHV0X3N1cGVyLAorCS5zdGF0ZnMJCT0gc2ltcGxlX3N0YXRmcywKK307CisKK2VudW0ge09wdF9lcnIsIE9wdF9mZCwgT3B0X3VpZCwgT3B0X2dpZCwgT3B0X3BncnAsIE9wdF9taW5wcm90bywgT3B0X21heHByb3RvfTsKKworc3RhdGljIG1hdGNoX3RhYmxlX3QgYXV0b2ZzX3Rva2VucyA9IHsKKwl7T3B0X2ZkLCAiZmQ9JXUifSwKKwl7T3B0X3VpZCwgInVpZD0ldSJ9LAorCXtPcHRfZ2lkLCAiZ2lkPSV1In0sCisJe09wdF9wZ3JwLCAicGdycD0ldSJ9LAorCXtPcHRfbWlucHJvdG8sICJtaW5wcm90bz0ldSJ9LAorCXtPcHRfbWF4cHJvdG8sICJtYXhwcm90bz0ldSJ9LAorCXtPcHRfZXJyLCBOVUxMfQorfTsKKworc3RhdGljIGludCBwYXJzZV9vcHRpb25zKGNoYXIgKm9wdGlvbnMsIGludCAqcGlwZWZkLCB1aWRfdCAqdWlkLCBnaWRfdCAqZ2lkLCBwaWRfdCAqcGdycCwgaW50ICptaW5wcm90bywgaW50ICptYXhwcm90bykKK3sKKwljaGFyICpwOworCXN1YnN0cmluZ190IGFyZ3NbTUFYX09QVF9BUkdTXTsKKwlpbnQgb3B0aW9uOworCisJKnVpZCA9IGN1cnJlbnQtPnVpZDsKKwkqZ2lkID0gY3VycmVudC0+Z2lkOworCSpwZ3JwID0gcHJvY2Vzc19ncm91cChjdXJyZW50KTsKKworCSptaW5wcm90byA9ICptYXhwcm90byA9IEFVVE9GU19QUk9UT19WRVJTSU9OOworCisJKnBpcGVmZCA9IC0xOworCisJaWYgKCFvcHRpb25zKQorCQlyZXR1cm4gMTsKKworCXdoaWxlICgocCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgeworCQlpbnQgdG9rZW47CisJCWlmICghKnApCisJCQljb250aW51ZTsKKworCQl0b2tlbiA9IG1hdGNoX3Rva2VuKHAsIGF1dG9mc190b2tlbnMsIGFyZ3MpOworCQlzd2l0Y2ggKHRva2VuKSB7CisJCWNhc2UgT3B0X2ZkOgorCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpCisJCQkJcmV0dXJuIDE7CisJCQkqcGlwZWZkID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3VpZDoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAxOworCQkJKnVpZCA9IG9wdGlvbjsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9naWQ6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMTsKKwkJCSpnaWQgPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfcGdycDoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAxOworCQkJKnBncnAgPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbWlucHJvdG86CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMTsKKwkJCSptaW5wcm90byA9IG9wdGlvbjsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9tYXhwcm90bzoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAxOworCQkJKm1heHByb3RvID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gKCpwaXBlZmQgPCAwKTsKK30KKworaW50IGF1dG9mc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKiByb290X2lub2RlOworCXN0cnVjdCBkZW50cnkgKiByb290OworCXN0cnVjdCBmaWxlICogcGlwZTsKKwlpbnQgcGlwZWZkOworCXN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpOworCWludCBtaW5wcm90bywgbWF4cHJvdG87CisKKwlzYmkgPSBrbWFsbG9jKHNpemVvZigqc2JpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCAhc2JpICkKKwkJZ290byBmYWlsX3VubG9jazsKKwltZW1zZXQoc2JpLCAwLCBzaXplb2YoKnNiaSkpOworCURQUklOVEsoKCJhdXRvZnM6IHN0YXJ0aW5nIHVwLCBzYmkgPSAlcFxuIixzYmkpKTsKKworCXMtPnNfZnNfaW5mbyA9IHNiaTsKKwlzYmktPm1hZ2ljID0gQVVUT0ZTX1NCSV9NQUdJQzsKKwlzYmktPmNhdGF0b25pYyA9IDA7CisJc2JpLT5leHBfdGltZW91dCA9IDA7CisJc2JpLT5vel9wZ3JwID0gcHJvY2Vzc19ncm91cChjdXJyZW50KTsKKwlhdXRvZnNfaW5pdGlhbGl6ZV9oYXNoKCZzYmktPmRpcmhhc2gpOworCXNiaS0+cXVldWVzID0gTlVMTDsKKwltZW1zZXQoc2JpLT5zeW1saW5rX2JpdG1hcCwgMCwgc2l6ZW9mKGxvbmcpKkFVVE9GU19TWU1MSU5LX0JJVE1BUF9MRU4pOworCXNiaS0+bmV4dF9kaXJfaW5vID0gQVVUT0ZTX0ZJUlNUX0RJUl9JTk87CisJcy0+c19ibG9ja3NpemUgPSAxMDI0OworCXMtPnNfYmxvY2tzaXplX2JpdHMgPSAxMDsKKwlzLT5zX21hZ2ljID0gQVVUT0ZTX1NVUEVSX01BR0lDOworCXMtPnNfb3AgPSAmYXV0b2ZzX3NvcHM7CisJcy0+c190aW1lX2dyYW4gPSAxOworCisJcm9vdF9pbm9kZSA9IGlnZXQocywgQVVUT0ZTX1JPT1RfSU5PKTsKKwlyb290ID0gZF9hbGxvY19yb290KHJvb3RfaW5vZGUpOworCXBpcGUgPSBOVUxMOworCisJaWYgKCFyb290KQorCQlnb3RvIGZhaWxfaXB1dDsKKworCS8qIENhbiB0aGlzIGNhbGwgYmxvY2s/ICAtIFdURiBjYXJlcz8gcyBpcyBsb2NrZWQuICovCisJaWYgKCBwYXJzZV9vcHRpb25zKGRhdGEsJnBpcGVmZCwmcm9vdF9pbm9kZS0+aV91aWQsJnJvb3RfaW5vZGUtPmlfZ2lkLCZzYmktPm96X3BncnAsJm1pbnByb3RvLCZtYXhwcm90bykgKSB7CisJCXByaW50aygiYXV0b2ZzOiBjYWxsZWQgd2l0aCBib2d1cyBvcHRpb25zXG4iKTsKKwkJZ290byBmYWlsX2RwdXQ7CisJfQorCisJLyogQ291bGRuJ3QgdGhpcyBiZSB0ZXN0ZWQgZWFybGllcj8gKi8KKwlpZiAoIG1pbnByb3RvID4gQVVUT0ZTX1BST1RPX1ZFUlNJT04gfHwgCisJICAgICBtYXhwcm90byA8IEFVVE9GU19QUk9UT19WRVJTSU9OICkgeworCQlwcmludGsoImF1dG9mczoga2VybmVsIGRvZXMgbm90IG1hdGNoIGRhZW1vbiB2ZXJzaW9uXG4iKTsKKwkJZ290byBmYWlsX2RwdXQ7CisJfQorCisJRFBSSU5USygoImF1dG9mczogcGlwZSBmZCA9ICVkLCBwZ3JwID0gJXVcbiIsIHBpcGVmZCwgc2JpLT5vel9wZ3JwKSk7CisJcGlwZSA9IGZnZXQocGlwZWZkKTsKKwkKKwlpZiAoICFwaXBlICkgeworCQlwcmludGsoImF1dG9mczogY291bGQgbm90IG9wZW4gcGlwZSBmaWxlIGRlc2NyaXB0b3JcbiIpOworCQlnb3RvIGZhaWxfZHB1dDsKKwl9CisJaWYgKCAhcGlwZS0+Zl9vcCB8fCAhcGlwZS0+Zl9vcC0+d3JpdGUgKQorCQlnb3RvIGZhaWxfZnB1dDsKKwlzYmktPnBpcGUgPSBwaXBlOworCisJLyoKKwkgKiBTdWNjZXNzISBJbnN0YWxsIHRoZSByb290IGRlbnRyeSBub3cgdG8gaW5kaWNhdGUgY29tcGxldGlvbi4KKwkgKi8KKwlzLT5zX3Jvb3QgPSByb290OworCXJldHVybiAwOworCitmYWlsX2ZwdXQ6CisJcHJpbnRrKCJhdXRvZnM6IHBpcGUgZmlsZSBkZXNjcmlwdG9yIGRvZXMgbm90IGNvbnRhaW4gcHJvcGVyIG9wc1xuIik7CisJZnB1dChwaXBlKTsKK2ZhaWxfZHB1dDoKKwlkcHV0KHJvb3QpOworCWdvdG8gZmFpbF9mcmVlOworZmFpbF9pcHV0OgorCXByaW50aygiYXV0b2ZzOiBnZXQgcm9vdCBkZW50cnkgZmFpbGVkXG4iKTsKKwlpcHV0KHJvb3RfaW5vZGUpOworZmFpbF9mcmVlOgorCWtmcmVlKHNiaSk7CitmYWlsX3VubG9jazoKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQgYXV0b2ZzX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpbm9fdCBpbm8gPSBpbm9kZS0+aV9pbm87CisJdW5zaWduZWQgaW50IG47CisJc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmkgPSBhdXRvZnNfc2JpKGlub2RlLT5pX3NiKTsKKworCS8qIEluaXRpYWxpemUgdG8gdGhlIGRlZmF1bHQgY2FzZSAoc3R1YiBkaXJlY3RvcnkpICovCisKKwlpbm9kZS0+aV9vcCA9ICZzaW1wbGVfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfZm9wID0gJnNpbXBsZV9kaXJfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9tb2RlID0gU19JRkRJUiB8IFNfSVJVR08gfCBTX0lYVUdPOworCWlub2RlLT5pX25saW5rID0gMjsKKwlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisJaW5vZGUtPmlfYmxvY2tzID0gMDsKKwlpbm9kZS0+aV9ibGtzaXplID0gMTAyNDsKKworCWlmICggaW5vID09IEFVVE9GU19ST09UX0lOTyApIHsKKwkJaW5vZGUtPmlfbW9kZSA9IFNfSUZESVIgfCBTX0lSVUdPIHwgU19JWFVHTyB8IFNfSVdVU1I7CisJCWlub2RlLT5pX29wID0gJmF1dG9mc19yb290X2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZhdXRvZnNfcm9vdF9vcGVyYXRpb25zOworCQlpbm9kZS0+aV91aWQgPSBpbm9kZS0+aV9naWQgPSAwOyAvKiBDaGFuZ2VkIGluIHJlYWRfc3VwZXIgKi8KKwkJcmV0dXJuOworCX0gCisJCisJaW5vZGUtPmlfdWlkID0gaW5vZGUtPmlfc2ItPnNfcm9vdC0+ZF9pbm9kZS0+aV91aWQ7CisJaW5vZGUtPmlfZ2lkID0gaW5vZGUtPmlfc2ItPnNfcm9vdC0+ZF9pbm9kZS0+aV9naWQ7CisJCisJaWYgKCBpbm8gPj0gQVVUT0ZTX0ZJUlNUX1NZTUxJTksgJiYgaW5vIDwgQVVUT0ZTX0ZJUlNUX0RJUl9JTk8gKSB7CisJCS8qIFN5bWxpbmsgaW5vZGUgLSBzaG91bGQgYmUgaW4gc3ltbGluayBsaXN0ICovCisJCXN0cnVjdCBhdXRvZnNfc3ltbGluayAqc2w7CisKKwkJbiA9IGlubyAtIEFVVE9GU19GSVJTVF9TWU1MSU5LOworCQlpZiAoIG4gPj0gQVVUT0ZTX01BWF9TWU1MSU5LUyB8fCAhdGVzdF9iaXQobixzYmktPnN5bWxpbmtfYml0bWFwKSkgeworCQkJcHJpbnRrKCJhdXRvZnM6IExvb2tpbmcgZm9yIGJhZCBzeW1saW5rIGlub2RlICV1XG4iLCAodW5zaWduZWQgaW50KSBpbm8pOworCQkJcmV0dXJuOworCQl9CisJCQorCQlpbm9kZS0+aV9vcCA9ICZhdXRvZnNfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCQlzbCA9ICZzYmktPnN5bWxpbmtbbl07CisJCWlub2RlLT51LmdlbmVyaWNfaXAgPSBzbDsKKwkJaW5vZGUtPmlfbW9kZSA9IFNfSUZMTksgfCBTX0lSV1hVR087CisJCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IGlub2RlLT5pX2N0aW1lLnR2X3NlYyA9IHNsLT5tdGltZTsKKwkJaW5vZGUtPmlfbXRpbWUudHZfbnNlYyA9IGlub2RlLT5pX2N0aW1lLnR2X25zZWMgPSAwOworCQlpbm9kZS0+aV9zaXplID0gc2wtPmxlbjsKKwkJaW5vZGUtPmlfbmxpbmsgPSAxOworCX0KK30KZGlmZiAtLWdpdCBhL2ZzL2F1dG9mcy9yb290LmMgYi9mcy9hdXRvZnMvcm9vdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYWIxYzAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hdXRvZnMvcm9vdC5jCkBAIC0wLDAgKzEsNTY0IEBACisvKiAtKi0gbGludXgtYyAtKi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiBsaW51eC9mcy9hdXRvZnMvcm9vdC5jCisgKgorICogIENvcHlyaWdodCAxOTk3LTE5OTggVHJhbnNtZXRhIENvcnBvcmF0aW9uIC0tIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBvciBhdCB5b3VyCisgKiBvcHRpb24sIGFueSBsYXRlciB2ZXJzaW9uLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgImF1dG9mc19pLmgiCisKK3N0YXRpYyBpbnQgYXV0b2ZzX3Jvb3RfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqLHZvaWQgKixmaWxsZGlyX3QpOworc3RhdGljIHN0cnVjdCBkZW50cnkgKmF1dG9mc19yb290X2xvb2t1cChzdHJ1Y3QgaW5vZGUgKixzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBuYW1laWRhdGEgKik7CitzdGF0aWMgaW50IGF1dG9mc19yb290X3N5bWxpbmsoc3RydWN0IGlub2RlICosc3RydWN0IGRlbnRyeSAqLGNvbnN0IGNoYXIgKik7CitzdGF0aWMgaW50IGF1dG9mc19yb290X3VubGluayhzdHJ1Y3QgaW5vZGUgKixzdHJ1Y3QgZGVudHJ5ICopOworc3RhdGljIGludCBhdXRvZnNfcm9vdF9ybWRpcihzdHJ1Y3QgaW5vZGUgKixzdHJ1Y3QgZGVudHJ5ICopOworc3RhdGljIGludCBhdXRvZnNfcm9vdF9ta2RpcihzdHJ1Y3QgaW5vZGUgKixzdHJ1Y3QgZGVudHJ5ICosaW50KTsKK3N0YXRpYyBpbnQgYXV0b2ZzX3Jvb3RfaW9jdGwoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICosdW5zaWduZWQgaW50LHVuc2lnbmVkIGxvbmcpOworCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1dG9mc19yb290X29wZXJhdGlvbnMgPSB7CisJLnJlYWQJCT0gZ2VuZXJpY19yZWFkX2RpciwKKwkucmVhZGRpcgk9IGF1dG9mc19yb290X3JlYWRkaXIsCisJLmlvY3RsCQk9IGF1dG9mc19yb290X2lvY3RsLAorfTsKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgYXV0b2ZzX3Jvb3RfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKyAgICAgICAgLmxvb2t1cAkJPSBhdXRvZnNfcm9vdF9sb29rdXAsCisgICAgICAgIC51bmxpbmsJCT0gYXV0b2ZzX3Jvb3RfdW5saW5rLAorICAgICAgICAuc3ltbGluawk9IGF1dG9mc19yb290X3N5bWxpbmssCisgICAgICAgIC5ta2RpcgkJPSBhdXRvZnNfcm9vdF9ta2RpciwKKyAgICAgICAgLnJtZGlyCQk9IGF1dG9mc19yb290X3JtZGlyLAorfTsKKworc3RhdGljIGludCBhdXRvZnNfcm9vdF9yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCXN0cnVjdCBhdXRvZnNfZGlyX2VudCAqZW50ID0gTlVMTDsKKwlzdHJ1Y3QgYXV0b2ZzX2Rpcmhhc2ggKmRpcmhhc2g7CisJc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmk7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlvZmZfdCBvbnIsIG5yOworCisJbG9ja19rZXJuZWwoKTsKKworCXNiaSA9IGF1dG9mc19zYmkoaW5vZGUtPmlfc2IpOworCWRpcmhhc2ggPSAmc2JpLT5kaXJoYXNoOworCW5yID0gZmlscC0+Zl9wb3M7CisKKwlzd2l0Y2gobnIpCisJeworCWNhc2UgMDoKKwkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLiIsIDEsIG5yLCBpbm9kZS0+aV9pbm8sIERUX0RJUikgPCAwKQorCQkJZ290byBvdXQ7CisJCWZpbHAtPmZfcG9zID0gKytucjsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSAxOgorCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuLiIsIDIsIG5yLCBpbm9kZS0+aV9pbm8sIERUX0RJUikgPCAwKQorCQkJZ290byBvdXQ7CisJCWZpbHAtPmZfcG9zID0gKytucjsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJZGVmYXVsdDoKKwkJd2hpbGUgKCBvbnIgPSBuciwgZW50ID0gYXV0b2ZzX2hhc2hfZW51bShkaXJoYXNoLCZucixlbnQpICkgeworCQkJaWYgKCAhZW50LT5kZW50cnkgfHwgZF9tb3VudHBvaW50KGVudC0+ZGVudHJ5KSApIHsKKwkJCQlpZiAoZmlsbGRpcihkaXJlbnQsZW50LT5uYW1lLGVudC0+bGVuLG9ucixlbnQtPmlubyxEVF9VTktOT1dOKSA8IDApCisJCQkJCWdvdG8gb3V0OworCQkJCWZpbHAtPmZfcG9zID0gbnI7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJfQorCitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRyeV90b19maWxsX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCXN0cnVjdCBhdXRvZnNfZGlyX2VudCAqZW50OworCWludCBzdGF0dXMgPSAwOworCisJaWYgKCAhKGVudCA9IGF1dG9mc19oYXNoX2xvb2t1cCgmc2JpLT5kaXJoYXNoLCAmZGVudHJ5LT5kX25hbWUpKSApIHsKKwkJZG8geworCQkJaWYgKCBzdGF0dXMgJiYgZGVudHJ5LT5kX2lub2RlICkgeworCQkJCWlmICggc3RhdHVzICE9IC1FTk9FTlQgKQorCQkJCQlwcmludGsoImF1dG9mcyB3YXJuaW5nOiBsb29rdXAgZmFpbHVyZSBvbiBwb3NpdGl2ZSBkZW50cnksIHN0YXR1cyA9ICVkLCBuYW1lID0gJXNcbiIsIHN0YXR1cywgZGVudHJ5LT5kX25hbWUubmFtZSk7CisJCQkJcmV0dXJuIDA7IC8qIFRyeSB0byBnZXQgdGhlIGtlcm5lbCB0byBpbnZhbGlkYXRlIHRoaXMgZGVudHJ5ICovCisJCQl9CisKKwkJCS8qIFR1cm4gdGhpcyBpbnRvIGEgcmVhbCBuZWdhdGl2ZSBkZW50cnk/ICovCisJCQlpZiAoc3RhdHVzID09IC1FTk9FTlQpIHsKKwkJCQlkZW50cnktPmRfdGltZSA9IGppZmZpZXMgKyBBVVRPRlNfTkVHQVRJVkVfVElNRU9VVDsKKwkJCQlkZW50cnktPmRfZmxhZ3MgJj0gfkRDQUNIRV9BVVRPRlNfUEVORElORzsKKwkJCQlyZXR1cm4gMTsKKwkJCX0gZWxzZSBpZiAoc3RhdHVzKSB7CisJCQkJLyogUmV0dXJuIGEgbmVnYXRpdmUgZGVudHJ5LCBidXQgbGVhdmUgaXQgInBlbmRpbmciICovCisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlzdGF0dXMgPSBhdXRvZnNfd2FpdChzYmksICZkZW50cnktPmRfbmFtZSk7CisJCX0gd2hpbGUgKCEoZW50ID0gYXV0b2ZzX2hhc2hfbG9va3VwKCZzYmktPmRpcmhhc2gsICZkZW50cnktPmRfbmFtZSkpICk7CisJfQorCisJLyogQWJ1c2UgdGhpcyBmaWVsZCBhcyBhIHBvaW50ZXIgdG8gdGhlIGRpcmVjdG9yeSBlbnRyeSwgdXNlZCB0bworCSAgIGZpbmQgdGhlIGV4cGlyZSBsaXN0IHBvaW50ZXJzICovCisJZGVudHJ5LT5kX3RpbWUgPSAodW5zaWduZWQgbG9uZykgZW50OworCQorCWlmICghZGVudHJ5LT5kX2lub2RlKSB7CisJCWlub2RlID0gaWdldChzYiwgZW50LT5pbm8pOworCQlpZiAoIWlub2RlKSB7CisJCQkvKiBGYWlsZWQsIGJ1dCBsZWF2ZSBwZW5kaW5nIGZvciBuZXh0IHRpbWUgKi8KKwkJCXJldHVybiAxOworCQl9CisJCWRlbnRyeS0+ZF9pbm9kZSA9IGlub2RlOworCX0KKworCS8qIElmIHRoaXMgaXMgYSBkaXJlY3RvcnkgdGhhdCBpc24ndCBhIG1vdW50IHBvaW50LCBiaXRjaCBhdCB0aGUKKwkgICBkYWVtb24gYW5kIGZpeCBpdCBpbiB1c2VyIHNwYWNlICovCisJaWYgKCBTX0lTRElSKGRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSAmJiAhZF9tb3VudHBvaW50KGRlbnRyeSkgKSB7CisJCXJldHVybiAhYXV0b2ZzX3dhaXQoc2JpLCAmZGVudHJ5LT5kX25hbWUpOworCX0KKworCS8qIFdlIGRvbid0IHVwZGF0ZSB0aGUgdXNhZ2VzIGZvciB0aGUgYXV0b2ZzIGRhZW1vbiBpdHNlbGYsIHRoaXMKKwkgICBpcyBuZWNlc3NhcnkgZm9yIHJlY3Vyc2l2ZSBhdXRvZnMgbW91bnRzICovCisJaWYgKCAhYXV0b2ZzX296X21vZGUoc2JpKSApIHsKKwkJYXV0b2ZzX3VwZGF0ZV91c2FnZSgmc2JpLT5kaXJoYXNoLGVudCk7CisJfQorCisJZGVudHJ5LT5kX2ZsYWdzICY9IH5EQ0FDSEVfQVVUT0ZTX1BFTkRJTkc7CisJcmV0dXJuIDE7Cit9CisKKworLyoKKyAqIFJldmFsaWRhdGUgaXMgY2FsbGVkIG9uIGV2ZXJ5IGNhY2hlIGxvb2t1cC4gIFNvbWUgb2YgdGhvc2UKKyAqIGNhY2hlIGxvb2t1cHMgbWF5IGFjdHVhbGx5IGhhcHBlbiB3aGlsZSB0aGUgZGVudHJ5IGlzIG5vdAorICogeWV0IGNvbXBsZXRlbHkgZmlsbGVkIGluLCBhbmQgcmV2YWxpZGF0ZSBoYXMgdG8gZGVsYXkgc3VjaAorICogbG9va3Vwcy4uCisgKi8KK3N0YXRpYyBpbnQgYXV0b2ZzX3JldmFsaWRhdGUoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGlub2RlICogZGlyOworCXN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpOworCXN0cnVjdCBhdXRvZnNfZGlyX2VudCAqZW50OworCWludCByZXM7CisKKwlsb2NrX2tlcm5lbCgpOworCWRpciA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CisJc2JpID0gYXV0b2ZzX3NiaShkaXItPmlfc2IpOworCisJLyogUGVuZGluZyBkZW50cnkgKi8KKwlpZiAoIGRlbnRyeS0+ZF9mbGFncyAmIERDQUNIRV9BVVRPRlNfUEVORElORyApIHsKKwkJaWYgKGF1dG9mc19vel9tb2RlKHNiaSkpCisJCQlyZXMgPSAxOworCQllbHNlCisJCQlyZXMgPSB0cnlfdG9fZmlsbF9kZW50cnkoZGVudHJ5LCBkaXItPmlfc2IsIHNiaSk7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwkvKiBOZWdhdGl2ZSBkZW50cnkuLiBpbnZhbGlkYXRlIGlmICJvbGQiICovCisJaWYgKCFkZW50cnktPmRfaW5vZGUpIHsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gKGRlbnRyeS0+ZF90aW1lIC0gamlmZmllcyA8PSBBVVRPRlNfTkVHQVRJVkVfVElNRU9VVCk7CisJfQorCQkKKwkvKiBDaGVjayBmb3IgYSBub24tbW91bnRwb2ludCBkaXJlY3RvcnkgKi8KKwlpZiAoIFNfSVNESVIoZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpICYmICFkX21vdW50cG9pbnQoZGVudHJ5KSApIHsKKwkJaWYgKGF1dG9mc19vel9tb2RlKHNiaSkpCisJCQlyZXMgPSAxOworCQllbHNlCisJCQlyZXMgPSB0cnlfdG9fZmlsbF9kZW50cnkoZGVudHJ5LCBkaXItPmlfc2IsIHNiaSk7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwkvKiBVcGRhdGUgdGhlIHVzYWdlIGxpc3QgKi8KKwlpZiAoICFhdXRvZnNfb3pfbW9kZShzYmkpICkgeworCQllbnQgPSAoc3RydWN0IGF1dG9mc19kaXJfZW50ICopIGRlbnRyeS0+ZF90aW1lOworCQlpZiAoIGVudCApCisJCQlhdXRvZnNfdXBkYXRlX3VzYWdlKCZzYmktPmRpcmhhc2gsZW50KTsKKwl9CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGF1dG9mc19kZW50cnlfb3BlcmF0aW9ucyA9IHsKKwkuZF9yZXZhbGlkYXRlCT0gYXV0b2ZzX3JldmFsaWRhdGUsCit9OworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqYXV0b2ZzX3Jvb3RfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpOworCWludCBvel9tb2RlOworCisJRFBSSU5USygoImF1dG9mc19yb290X2xvb2t1cDogbmFtZSA9ICIpKTsKKwlsb2NrX2tlcm5lbCgpOworCWF1dG9mc19zYXkoZGVudHJ5LT5kX25hbWUubmFtZSxkZW50cnktPmRfbmFtZS5sZW4pOworCisJaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+IE5BTUVfTUFYKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7LyogRmlsZSBuYW1lIHRvbyBsb25nIHRvIGV4aXN0ICovCisJfQorCisJc2JpID0gYXV0b2ZzX3NiaShkaXItPmlfc2IpOworCisJb3pfbW9kZSA9IGF1dG9mc19vel9tb2RlKHNiaSk7CisJRFBSSU5USygoImF1dG9mc19sb29rdXA6IHBpZCA9ICV1LCBwZ3JwID0gJXUsIGNhdGF0b25pYyA9ICVkLCBvel9tb2RlID0gJWRcbiIsCisJCSBjdXJyZW50LT5waWQsIHByb2Nlc3NfZ3JvdXAoY3VycmVudCksIHNiaS0+Y2F0YXRvbmljLCBvel9tb2RlKSk7CisKKwkvKgorCSAqIE1hcmsgdGhlIGRlbnRyeSBpbmNvbXBsZXRlLCBidXQgYWRkIGl0LiBUaGlzIGlzIG5lZWRlZCBzbworCSAqIHRoYXQgdGhlIFZGUyBsYXllciBrbm93cyBhYm91dCB0aGUgZGVudHJ5LCBhbmQgd2UgY2FuIGNvdW50CisJICogb24gY2F0Y2hpbmcgYW55IGxvb2t1cHMgdGhyb3VnaCB0aGUgcmV2YWxpZGF0ZS4KKwkgKgorCSAqIExldCBhbGwgdGhlIGhhcmQgd29yayBiZSBkb25lIGJ5IHRoZSByZXZhbGlkYXRlIGZ1bmN0aW9uIHRoYXQKKwkgKiBuZWVkcyB0byBiZSBhYmxlIHRvIGRvIHRoaXMgYW55d2F5Li4KKwkgKgorCSAqIFdlIG5lZWQgdG8gZG8gdGhpcyBiZWZvcmUgd2UgcmVsZWFzZSB0aGUgZGlyZWN0b3J5IHNlbWFwaG9yZS4KKwkgKi8KKwlkZW50cnktPmRfb3AgPSAmYXV0b2ZzX2RlbnRyeV9vcGVyYXRpb25zOworCWRlbnRyeS0+ZF9mbGFncyB8PSBEQ0FDSEVfQVVUT0ZTX1BFTkRJTkc7CisJZF9hZGQoZGVudHJ5LCBOVUxMKTsKKworCXVwKCZkaXItPmlfc2VtKTsKKwlhdXRvZnNfcmV2YWxpZGF0ZShkZW50cnksIG5kKTsKKwlkb3duKCZkaXItPmlfc2VtKTsKKworCS8qCisJICogSWYgd2UgYXJlIHN0aWxsIHBlbmRpbmcsIGNoZWNrIGlmIHdlIGhhZCB0byBoYW5kbGUKKwkgKiBhIHNpZ25hbC4gSWYgc28gd2UgY2FuIGZvcmNlIGEgcmVzdGFydC4uCisJICovCisJaWYgKGRlbnRyeS0+ZF9mbGFncyAmIERDQUNIRV9BVVRPRlNfUEVORElORykgeworCQkvKiBTZWUgaWYgd2Ugd2VyZSBpbnRlcnJ1cHRlZCAqLworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXNpZ3NldF90ICpzaWdzZXQgPSAmY3VycmVudC0+cGVuZGluZy5zaWduYWw7CisJCQlpZiAoc2lnaXNtZW1iZXIgKHNpZ3NldCwgU0lHS0lMTCkgfHwKKwkJCSAgICBzaWdpc21lbWJlciAoc2lnc2V0LCBTSUdRVUlUKSB8fAorCQkJICAgIHNpZ2lzbWVtYmVyIChzaWdzZXQsIFNJR0lOVCkpIHsKKwkJCQl1bmxvY2tfa2VybmVsKCk7CisJCQkJcmV0dXJuIEVSUl9QVFIoLUVSRVNUQVJUTk9JTlRSKTsKKwkJCX0KKwkJfQorCX0KKwl1bmxvY2tfa2VybmVsKCk7CisKKwkvKgorCSAqIElmIHRoaXMgZGVudHJ5IGlzIHVuaGFzaGVkLCB0aGVuIHdlIHNob3VsZG4ndCBob25vdXIgdGhpcworCSAqIGxvb2t1cCBldmVuIGlmIHRoZSBkZW50cnkgaXMgcG9zaXRpdmUuICBSZXR1cm5pbmcgRU5PRU5UIGhlcmUKKwkgKiBkb2Vzbid0IGRvIHRoZSByaWdodCB0aGluZyBmb3IgYWxsIHN5c3RlbSBjYWxscywgYnV0IGl0IHNob3VsZAorCSAqIGJlIE9LIGZvciB0aGUgb3BlcmF0aW9ucyB3ZSBwZXJtaXQgZnJvbSBhbiBhdXRvZnMuCisJICovCisJaWYgKCBkZW50cnktPmRfaW5vZGUgJiYgZF91bmhhc2hlZChkZW50cnkpICkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBhdXRvZnNfcm9vdF9zeW1saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKnN5bW5hbWUpCit7CisJc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmkgPSBhdXRvZnNfc2JpKGRpci0+aV9zYik7CisJc3RydWN0IGF1dG9mc19kaXJoYXNoICpkaCA9ICZzYmktPmRpcmhhc2g7CisJc3RydWN0IGF1dG9mc19kaXJfZW50ICplbnQ7CisJdW5zaWduZWQgaW50IG47CisJaW50IHNsc2l6ZTsKKwlzdHJ1Y3QgYXV0b2ZzX3N5bWxpbmsgKnNsOworCisJRFBSSU5USygoImF1dG9mc19yb290X3N5bWxpbms6ICVzIDwtICIsIHN5bW5hbWUpKTsKKwlhdXRvZnNfc2F5KGRlbnRyeS0+ZF9uYW1lLm5hbWUsZGVudHJ5LT5kX25hbWUubGVuKTsKKworCWxvY2tfa2VybmVsKCk7CisJaWYgKCAhYXV0b2ZzX296X21vZGUoc2JpKSApIHsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisKKwlpZiAoIGF1dG9mc19oYXNoX2xvb2t1cChkaCwgJmRlbnRyeS0+ZF9uYW1lKSApIHsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVFWElTVDsKKwl9CisKKwluID0gZmluZF9maXJzdF96ZXJvX2JpdChzYmktPnN5bWxpbmtfYml0bWFwLEFVVE9GU19NQVhfU1lNTElOS1MpOworCWlmICggbiA+PSBBVVRPRlNfTUFYX1NZTUxJTktTICkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRU5PU1BDOworCX0KKworCXNldF9iaXQobixzYmktPnN5bWxpbmtfYml0bWFwKTsKKwlzbCA9ICZzYmktPnN5bWxpbmtbbl07CisJc2wtPmxlbiA9IHN0cmxlbihzeW1uYW1lKTsKKwlzbC0+ZGF0YSA9IGttYWxsb2Moc2xzaXplID0gc2wtPmxlbisxLCBHRlBfS0VSTkVMKTsKKwlpZiAoICFzbC0+ZGF0YSApIHsKKwkJY2xlYXJfYml0KG4sc2JpLT5zeW1saW5rX2JpdG1hcCk7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCisJZW50ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF1dG9mc19kaXJfZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCAhZW50ICkgeworCQlrZnJlZShzbC0+ZGF0YSk7CisJCWNsZWFyX2JpdChuLHNiaS0+c3ltbGlua19iaXRtYXApOworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRU5PU1BDOworCX0KKworCWVudC0+bmFtZSA9IGttYWxsb2MoZGVudHJ5LT5kX25hbWUubGVuKzEsIEdGUF9LRVJORUwpOworCWlmICggIWVudC0+bmFtZSApIHsKKwkJa2ZyZWUoc2wtPmRhdGEpOworCQlrZnJlZShlbnQpOworCQljbGVhcl9iaXQobixzYmktPnN5bWxpbmtfYml0bWFwKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVOT1NQQzsKKwl9CisKKwltZW1jcHkoc2wtPmRhdGEsc3ltbmFtZSxzbHNpemUpOworCXNsLT5tdGltZSA9IGdldF9zZWNvbmRzKCk7CisKKwllbnQtPmlubyA9IEFVVE9GU19GSVJTVF9TWU1MSU5LICsgbjsKKwllbnQtPmhhc2ggPSBkZW50cnktPmRfbmFtZS5oYXNoOworCW1lbWNweShlbnQtPm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIDErKGVudC0+bGVuID0gZGVudHJ5LT5kX25hbWUubGVuKSk7CisJZW50LT5kZW50cnkgPSBOVUxMOwkvKiBXZSBkb24ndCBrZWVwIHRoZSBkZW50cnkgZm9yIHN5bWxpbmtzICovCisKKwlhdXRvZnNfaGFzaF9pbnNlcnQoZGgsZW50KTsKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaWdldChkaXItPmlfc2IsZW50LT5pbm8pKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBOT1RFIQorICoKKyAqIE5vcm1hbCBmaWxlc3lzdGVtcyB3b3VsZCBkbyBhICJkX2RlbGV0ZSgpIiB0byB0ZWxsIHRoZSBWRlMgZGNhY2hlCisgKiB0aGF0IHRoZSBmaWxlIG5vIGxvbmdlciBleGlzdHMuIEhvd2V2ZXIsIGRvaW5nIHRoYXQgbWVhbnMgdGhhdCB0aGUKKyAqIFZGUyBsYXllciBjYW4gdHVybiB0aGUgZGVudHJ5IGludG8gYSBuZWdhdGl2ZSBkZW50cnksIHdoaWNoIHdlCisgKiBvYnZpb3VzbHkgZG8gbm90IHdhbnQgKHdlJ3JlIGRyb3BwaW5nIHRoZSBlbnRyeSBub3QgYmVjYXVzZSBpdAorICogZG9lc24ndCBleGlzdCwgYnV0IGJlY2F1c2UgaXQgaGFzIHRpbWVkIG91dCkuCisgKgorICogQWxzbyBzZWUgYXV0b2ZzX3Jvb3Rfcm1kaXIoKS4uCisgKi8KK3N0YXRpYyBpbnQgYXV0b2ZzX3Jvb3RfdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmkgPSBhdXRvZnNfc2JpKGRpci0+aV9zYik7CisJc3RydWN0IGF1dG9mc19kaXJoYXNoICpkaCA9ICZzYmktPmRpcmhhc2g7CisJc3RydWN0IGF1dG9mc19kaXJfZW50ICplbnQ7CisJdW5zaWduZWQgaW50IG47CisKKwkvKiBUaGlzIGFsbG93cyByb290IHRvIHJlbW92ZSBzeW1saW5rcyAqLworCWxvY2tfa2VybmVsKCk7CisJaWYgKCAhYXV0b2ZzX296X21vZGUoc2JpKSAmJiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSApIHsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisKKwllbnQgPSBhdXRvZnNfaGFzaF9sb29rdXAoZGgsICZkZW50cnktPmRfbmFtZSk7CisJaWYgKCAhZW50ICkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCW4gPSBlbnQtPmlubyAtIEFVVE9GU19GSVJTVF9TWU1MSU5LOworCWlmICggbiA+PSBBVVRPRlNfTUFYX1NZTUxJTktTICkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRUlTRElSOwkvKiBJdCdzIGEgZGlyZWN0b3J5LCBkdW1teSAqLworCX0KKwlpZiAoICF0ZXN0X2JpdChuLHNiaS0+c3ltbGlua19iaXRtYXApICkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRUlOVkFMOwkvKiBOb25leGlzdGVudCBzeW1saW5rPyAgU2hvdWxkbid0IGhhcHBlbiAqLworCX0KKwkKKwlkZW50cnktPmRfdGltZSA9ICh1bnNpZ25lZCBsb25nKShzdHJ1Y3QgYXV0b2ZzX2Rpcmhhc2ggKilOVUxMOworCWF1dG9mc19oYXNoX2RlbGV0ZShlbnQpOworCWNsZWFyX2JpdChuLHNiaS0+c3ltbGlua19iaXRtYXApOworCWtmcmVlKHNiaS0+c3ltbGlua1tuXS5kYXRhKTsKKwlkX2Ryb3AoZGVudHJ5KTsKKwkKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXV0b2ZzX3Jvb3Rfcm1kaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSA9IGF1dG9mc19zYmkoZGlyLT5pX3NiKTsKKwlzdHJ1Y3QgYXV0b2ZzX2Rpcmhhc2ggKmRoID0gJnNiaS0+ZGlyaGFzaDsKKwlzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKmVudDsKKworCWxvY2tfa2VybmVsKCk7CisJaWYgKCAhYXV0b2ZzX296X21vZGUoc2JpKSApIHsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisKKwllbnQgPSBhdXRvZnNfaGFzaF9sb29rdXAoZGgsICZkZW50cnktPmRfbmFtZSk7CisJaWYgKCAhZW50ICkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCWlmICggKHVuc2lnbmVkIGludCllbnQtPmlubyA8IEFVVE9GU19GSVJTVF9ESVJfSU5PICkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRU5PVERJUjsgLyogTm90IGEgZGlyZWN0b3J5ICovCisJfQorCisJaWYgKCBlbnQtPmRlbnRyeSAhPSBkZW50cnkgKSB7CisJCXByaW50aygiYXV0b2ZzX3JtZGlyOiBvZGVudHJ5ICE9IGRlbnRyeSBmb3IgZW50cnkgJXNcbiIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCX0KKworCWRlbnRyeS0+ZF90aW1lID0gKHVuc2lnbmVkIGxvbmcpKHN0cnVjdCBhdXRvZnNfZGlyX2VudCAqKU5VTEw7CisJYXV0b2ZzX2hhc2hfZGVsZXRlKGVudCk7CisJZGlyLT5pX25saW5rLS07CisJZF9kcm9wKGRlbnRyeSk7CisJdW5sb2NrX2tlcm5lbCgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXV0b2ZzX3Jvb3RfbWtkaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpCit7CisJc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmkgPSBhdXRvZnNfc2JpKGRpci0+aV9zYik7CisJc3RydWN0IGF1dG9mc19kaXJoYXNoICpkaCA9ICZzYmktPmRpcmhhc2g7CisJc3RydWN0IGF1dG9mc19kaXJfZW50ICplbnQ7CisJaW5vX3QgaW5vOworCisJbG9ja19rZXJuZWwoKTsKKwlpZiAoICFhdXRvZnNfb3pfbW9kZShzYmkpICkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKworCWVudCA9IGF1dG9mc19oYXNoX2xvb2t1cChkaCwgJmRlbnRyeS0+ZF9uYW1lKTsKKwlpZiAoIGVudCApIHsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVFWElTVDsKKwl9CisKKwlpZiAoIHNiaS0+bmV4dF9kaXJfaW5vIDwgQVVUT0ZTX0ZJUlNUX0RJUl9JTk8gKSB7CisJCXByaW50aygiYXV0b2ZzOiBPdXQgb2YgaW5vZGUgbnVtYmVycyAtLSB3aGF0IHRoZSBoZWNrIGRpZCB5b3UgZG8/P1xuIik7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCWlubyA9IHNiaS0+bmV4dF9kaXJfaW5vKys7CisKKwllbnQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoICFlbnQgKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCisJZW50LT5uYW1lID0ga21hbGxvYyhkZW50cnktPmRfbmFtZS5sZW4rMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCAhZW50LT5uYW1lICkgeworCQlrZnJlZShlbnQpOworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRU5PU1BDOworCX0KKworCWVudC0+aGFzaCA9IGRlbnRyeS0+ZF9uYW1lLmhhc2g7CisJbWVtY3B5KGVudC0+bmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSwgMSsoZW50LT5sZW4gPSBkZW50cnktPmRfbmFtZS5sZW4pKTsKKwllbnQtPmlubyA9IGlubzsKKwllbnQtPmRlbnRyeSA9IGRlbnRyeTsKKwlhdXRvZnNfaGFzaF9pbnNlcnQoZGgsZW50KTsKKworCWRpci0+aV9ubGluaysrOworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpZ2V0KGRpci0+aV9zYixpbm8pKTsKKwl1bmxvY2tfa2VybmVsKCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogR2V0L3NldCB0aW1lb3V0IGlvY3RsKCkgb3BlcmF0aW9uICovCitzdGF0aWMgaW5saW5lIGludCBhdXRvZnNfZ2V0X3NldF90aW1lb3V0KHN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpLAorCQkJCQkgdW5zaWduZWQgbG9uZyBfX3VzZXIgKnApCit7CisJdW5zaWduZWQgbG9uZyBudGltZW91dDsKKworCWlmIChnZXRfdXNlcihudGltZW91dCwgcCkgfHwKKwkgICAgcHV0X3VzZXIoc2JpLT5leHBfdGltZW91dCAvIEhaLCBwKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoIG50aW1lb3V0ID4gVUxPTkdfTUFYL0haICkKKwkJc2JpLT5leHBfdGltZW91dCA9IDA7CisJZWxzZQorCQlzYmktPmV4cF90aW1lb3V0ID0gbnRpbWVvdXQgKiBIWjsKKworCXJldHVybiAwOworfQorCisvKiBSZXR1cm4gcHJvdG9jb2wgdmVyc2lvbiAqLworc3RhdGljIGlubGluZSBpbnQgYXV0b2ZzX2dldF9wcm90b3ZlcihpbnQgX191c2VyICpwKQoreworCXJldHVybiBwdXRfdXNlcihBVVRPRlNfUFJPVE9fVkVSU0lPTiwgcCk7Cit9CisKKy8qIFBlcmZvcm0gYW4gZXhwaXJ5IG9wZXJhdGlvbiAqLworc3RhdGljIGlubGluZSBpbnQgYXV0b2ZzX2V4cGlyZV9ydW4oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgICAgc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmksCisJCQkJICAgIHN0cnVjdCB2ZnNtb3VudCAqbW50LAorCQkJCSAgICBzdHJ1Y3QgYXV0b2ZzX3BhY2tldF9leHBpcmUgX191c2VyICpwa3RfcCkKK3sKKwlzdHJ1Y3QgYXV0b2ZzX2Rpcl9lbnQgKmVudDsKKwlzdHJ1Y3QgYXV0b2ZzX3BhY2tldF9leHBpcmUgcGt0OworCisJbWVtc2V0KCZwa3QsMCxzaXplb2YgcGt0KTsKKworCXBrdC5oZHIucHJvdG9fdmVyc2lvbiA9IEFVVE9GU19QUk9UT19WRVJTSU9OOworCXBrdC5oZHIudHlwZSA9IGF1dG9mc19wdHlwZV9leHBpcmU7CisKKwlpZiAoICFzYmktPmV4cF90aW1lb3V0IHx8CisJICAgICAhKGVudCA9IGF1dG9mc19leHBpcmUoc2Isc2JpLG1udCkpICkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlwa3QubGVuID0gZW50LT5sZW47CisJbWVtY3B5KHBrdC5uYW1lLCBlbnQtPm5hbWUsIHBrdC5sZW4pOworCXBrdC5uYW1lW3BrdC5sZW5dID0gJ1wwJzsKKworCWlmICggY29weV90b191c2VyKHBrdF9wLCAmcGt0LCBzaXplb2Yoc3RydWN0IGF1dG9mc19wYWNrZXRfZXhwaXJlKSkgKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCisvKgorICogaW9jdGwoKSdzIG9uIHRoZSByb290IGRpcmVjdG9yeSBpcyB0aGUgY2hpZWYgbWV0aG9kIGZvciB0aGUgZGFlbW9uIHRvCisgKiBnZW5lcmF0ZSBrZXJuZWwgcmVhY3Rpb25zCisgKi8KK3N0YXRpYyBpbnQgYXV0b2ZzX3Jvb3RfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpID0gYXV0b2ZzX3NiaShpbm9kZS0+aV9zYik7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwlEUFJJTlRLKCgiYXV0b2ZzX2lvY3RsOiBjbWQgPSAweCUwOHgsIGFyZyA9IDB4JTA4bHgsIHNiaSA9ICVwLCBwZ3JwID0gJXVcbiIsY21kLGFyZyxzYmkscHJvY2Vzc19ncm91cChjdXJyZW50KSkpOworCisJaWYgKCBfSU9DX1RZUEUoY21kKSAhPSBfSU9DX1RZUEUoQVVUT0ZTX0lPQ19GSVJTVCkgfHwKKwkgICAgIF9JT0NfTlIoY21kKSAtIF9JT0NfTlIoQVVUT0ZTX0lPQ19GSVJTVCkgPj0gQVVUT0ZTX0lPQ19DT1VOVCApCisJCXJldHVybiAtRU5PVFRZOworCQorCWlmICggIWF1dG9mc19vel9tb2RlKHNiaSkgJiYgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikgKQorCQlyZXR1cm4gLUVQRVJNOworCQorCXN3aXRjaChjbWQpIHsKKwljYXNlIEFVVE9GU19JT0NfUkVBRFk6CS8qIFdhaXQgcXVldWU6IGdvIGFoZWFkIGFuZCByZXRyeSAqLworCQlyZXR1cm4gYXV0b2ZzX3dhaXRfcmVsZWFzZShzYmksKGF1dG9mc193cXRfdClhcmcsMCk7CisJY2FzZSBBVVRPRlNfSU9DX0ZBSUw6CS8qIFdhaXQgcXVldWU6IGZhaWwgd2l0aCBFTk9FTlQgKi8KKwkJcmV0dXJuIGF1dG9mc193YWl0X3JlbGVhc2Uoc2JpLChhdXRvZnNfd3F0X3QpYXJnLC1FTk9FTlQpOworCWNhc2UgQVVUT0ZTX0lPQ19DQVRBVE9OSUM6IC8qIEVudGVyIGNhdGF0b25pYyBtb2RlIChkYWVtb24gc2h1dGRvd24pICovCisJCWF1dG9mc19jYXRhdG9uaWNfbW9kZShzYmkpOworCQlyZXR1cm4gMDsKKwljYXNlIEFVVE9GU19JT0NfUFJPVE9WRVI6IC8qIEdldCBwcm90b2NvbCB2ZXJzaW9uICovCisJCXJldHVybiBhdXRvZnNfZ2V0X3Byb3RvdmVyKGFyZ3ApOworCWNhc2UgQVVUT0ZTX0lPQ19TRVRUSU1FT1VUOgorCQlyZXR1cm4gYXV0b2ZzX2dldF9zZXRfdGltZW91dChzYmksIGFyZ3ApOworCWNhc2UgQVVUT0ZTX0lPQ19FWFBJUkU6CisJCXJldHVybiBhdXRvZnNfZXhwaXJlX3J1bihpbm9kZS0+aV9zYiwgc2JpLCBmaWxwLT5mX3Zmc21udCwKKwkJCQkJIGFyZ3ApOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PU1lTOworCX0KK30KZGlmZiAtLWdpdCBhL2ZzL2F1dG9mcy9zeW1saW5rLmMgYi9mcy9hdXRvZnMvc3ltbGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMjgzOTYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hdXRvZnMvc3ltbGluay5jCkBAIC0wLDAgKzEsMjUgQEAKKy8qIC0qLSBsaW51eC1jIC0qLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqIGxpbnV4L2ZzL2F1dG9mcy9zeW1saW5rLmMKKyAqCisgKiAgQ29weXJpZ2h0IDE5OTctMTk5OCBUcmFuc21ldGEgQ29ycG9yYXRpb24gLS0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIG9yIGF0IHlvdXIKKyAqIG9wdGlvbiwgYW55IGxhdGVyIHZlcnNpb24sIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgImF1dG9mc19pLmgiCisKK3N0YXRpYyBpbnQgYXV0b2ZzX2ZvbGxvd19saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJY2hhciAqcz0oKHN0cnVjdCBhdXRvZnNfc3ltbGluayAqKWRlbnRyeS0+ZF9pbm9kZS0+dS5nZW5lcmljX2lwKS0+ZGF0YTsKKwluZF9zZXRfbGluayhuZCwgcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGF1dG9mc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnJlYWRsaW5rCT0gZ2VuZXJpY19yZWFkbGluaywKKwkuZm9sbG93X2xpbmsJPSBhdXRvZnNfZm9sbG93X2xpbmsKK307CmRpZmYgLS1naXQgYS9mcy9hdXRvZnMvd2FpdHEuYyBiL2ZzL2F1dG9mcy93YWl0cS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmY2FhMTUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hdXRvZnMvd2FpdHEuYwpAQCAtMCwwICsxLDIwNiBAQAorLyogLSotIGxpbnV4LWMgLSotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogbGludXgvZnMvYXV0b2ZzL3dhaXRxLmMKKyAqCisgKiAgQ29weXJpZ2h0IDE5OTctMTk5OCBUcmFuc21ldGEgQ29ycG9yYXRpb24gLS0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIG9yIGF0IHlvdXIKKyAqIG9wdGlvbiwgYW55IGxhdGVyIHZlcnNpb24sIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgImF1dG9mc19pLmgiCisKKy8qIFdlIG1ha2UgdGhpcyBhIHN0YXRpYyB2YXJpYWJsZSByYXRoZXIgdGhhbiBhIHBhcnQgb2YgdGhlIHN1cGVyYmxvY2s7IGl0CisgICBpcyBiZXR0ZXIgaWYgd2UgZG9uJ3QgcmVhc3NpZ24gbnVtYmVycyBlYXNpbHkgZXZlbiBhY3Jvc3MgZmlsZXN5c3RlbXMgKi8KK3N0YXRpYyBhdXRvZnNfd3F0X3QgYXV0b2ZzX25leHRfd2FpdF9xdWV1ZSA9IDE7CisKKy8qIFRoZXNlIGFyZSB0aGUgc2lnbmFscyB3ZSBhbGxvdyBpbnRlcnJ1cHRpbmcgYSBwZW5kaW5nIG1vdW50ICovCisjZGVmaW5lIFNIVVRET1dOX1NJR1MJKHNpZ21hc2soU0lHS0lMTCkgfCBzaWdtYXNrKFNJR0lOVCkgfCBzaWdtYXNrKFNJR1FVSVQpKQorCit2b2lkIGF1dG9mc19jYXRhdG9uaWNfbW9kZShzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSkKK3sKKwlzdHJ1Y3QgYXV0b2ZzX3dhaXRfcXVldWUgKndxLCAqbndxOworCisJRFBSSU5USygoImF1dG9mczogZW50ZXJpbmcgY2F0YXRvbmljIG1vZGVcbiIpKTsKKworCXNiaS0+Y2F0YXRvbmljID0gMTsKKwl3cSA9IHNiaS0+cXVldWVzOworCXNiaS0+cXVldWVzID0gTlVMTDsJLyogRXJhc2UgYWxsIHdhaXQgcXVldWVzICovCisJd2hpbGUgKCB3cSApIHsKKwkJbndxID0gd3EtPm5leHQ7CisJCXdxLT5zdGF0dXMgPSAtRU5PRU5UOyAvKiBNYWdpYyBpcyBnb25lIC0gcmVwb3J0IGZhaWx1cmUgKi8KKwkJa2ZyZWUod3EtPm5hbWUpOworCQl3cS0+bmFtZSA9IE5VTEw7CisJCXdha2VfdXAoJndxLT5xdWV1ZSk7CisJCXdxID0gbndxOworCX0KKwlmcHV0KHNiaS0+cGlwZSk7CS8qIENsb3NlIHRoZSBwaXBlICovCisJYXV0b2ZzX2hhc2hfZHB1dGFsbCgmc2JpLT5kaXJoYXNoKTsgLyogUmVtb3ZlIGFsbCBkZW50cnkgcG9pbnRlcnMgKi8KK30KKworc3RhdGljIGludCBhdXRvZnNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IHZvaWQgKmFkZHIsIGludCBieXRlcykKK3sKKwl1bnNpZ25lZCBsb25nIHNpZ3BpcGUsIGZsYWdzOworCW1tX3NlZ21lbnRfdCBmczsKKwljb25zdCBjaGFyICpkYXRhID0gKGNvbnN0IGNoYXIgKilhZGRyOworCXNzaXplX3Qgd3IgPSAwOworCisJLyoqIFdBUk5JTkc6IHRoaXMgaXMgbm90IHNhZmUgZm9yIHdyaXRpbmcgbW9yZSB0aGFuIFBJUEVfQlVGIGJ5dGVzISAqKi8KKworCXNpZ3BpcGUgPSBzaWdpc21lbWJlcigmY3VycmVudC0+cGVuZGluZy5zaWduYWwsIFNJR1BJUEUpOworCisJLyogU2F2ZSBwb2ludGVyIHRvIHVzZXIgc3BhY2UgYW5kIHBvaW50IGJhY2sgdG8ga2VybmVsIHNwYWNlICovCisJZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKworCXdoaWxlIChieXRlcyAmJgorCSAgICAgICAod3IgPSBmaWxlLT5mX29wLT53cml0ZShmaWxlLGRhdGEsYnl0ZXMsJmZpbGUtPmZfcG9zKSkgPiAwKSB7CisJCWRhdGEgKz0gd3I7CisJCWJ5dGVzIC09IHdyOworCX0KKworCXNldF9mcyhmcyk7CisKKwkvKiBLZWVwIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHByb2Nlc3MgZnJvbSByZWNlaXZpbmcgYQorCSAgIFNJR1BJUEUgdW5sZXNzIGl0IHdhcyBhbHJlYWR5IHN1cHBvc2VkIHRvIGdldCBvbmUgKi8KKwlpZiAod3IgPT0gLUVQSVBFICYmICFzaWdwaXBlKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CisJCXNpZ2RlbHNldCgmY3VycmVudC0+cGVuZGluZy5zaWduYWwsIFNJR1BJUEUpOworCQlyZWNhbGNfc2lncGVuZGluZygpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJuIChieXRlcyA+IDApOworfQorCQorc3RhdGljIHZvaWQgYXV0b2ZzX25vdGlmeV9kYWVtb24oc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmksIHN0cnVjdCBhdXRvZnNfd2FpdF9xdWV1ZSAqd3EpCit7CisJc3RydWN0IGF1dG9mc19wYWNrZXRfbWlzc2luZyBwa3Q7CisKKwlEUFJJTlRLKCgiYXV0b2ZzX3dhaXQ6IHdhaXQgaWQgPSAweCUwOGx4LCBuYW1lID0gIiwgd3EtPndhaXRfcXVldWVfdG9rZW4pKTsKKwlhdXRvZnNfc2F5KHdxLT5uYW1lLHdxLT5sZW4pOworCisJbWVtc2V0KCZwa3QsMCxzaXplb2YgcGt0KTsgLyogRm9yIHNlY3VyaXR5IHJlYXNvbnMgKi8KKworCXBrdC5oZHIucHJvdG9fdmVyc2lvbiA9IEFVVE9GU19QUk9UT19WRVJTSU9OOworCXBrdC5oZHIudHlwZSA9IGF1dG9mc19wdHlwZV9taXNzaW5nOworCXBrdC53YWl0X3F1ZXVlX3Rva2VuID0gd3EtPndhaXRfcXVldWVfdG9rZW47CisJcGt0LmxlbiA9IHdxLT5sZW47CisgICAgICAgIG1lbWNweShwa3QubmFtZSwgd3EtPm5hbWUsIHBrdC5sZW4pOworCXBrdC5uYW1lW3BrdC5sZW5dID0gJ1wwJzsKKworCWlmICggYXV0b2ZzX3dyaXRlKHNiaS0+cGlwZSwmcGt0LHNpemVvZihzdHJ1Y3QgYXV0b2ZzX3BhY2tldF9taXNzaW5nKSkgKQorCQlhdXRvZnNfY2F0YXRvbmljX21vZGUoc2JpKTsKK30KKworaW50IGF1dG9mc193YWl0KHN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpLCBzdHJ1Y3QgcXN0ciAqbmFtZSkKK3sKKwlzdHJ1Y3QgYXV0b2ZzX3dhaXRfcXVldWUgKndxOworCWludCBzdGF0dXM7CisKKwkvKiBJbiBjYXRhdG9uaWMgbW9kZSwgd2UgZG9uJ3Qgd2FpdCBmb3Igbm9ib2R5ICovCisJaWYgKCBzYmktPmNhdGF0b25pYyApCisJCXJldHVybiAtRU5PRU5UOworCQorCS8qIFdlIHNob3VsZG4ndCBiZSBhYmxlIHRvIGdldCBoZXJlLCBidXQganVzdCBpbiBjYXNlICovCisJaWYgKCBuYW1lLT5sZW4gPiBOQU1FX01BWCApCisJCXJldHVybiAtRU5PRU5UOworCisJZm9yICggd3EgPSBzYmktPnF1ZXVlcyA7IHdxIDsgd3EgPSB3cS0+bmV4dCApIHsKKwkJaWYgKCB3cS0+aGFzaCA9PSBuYW1lLT5oYXNoICYmCisJCSAgICAgd3EtPmxlbiA9PSBuYW1lLT5sZW4gJiYKKwkJICAgICB3cS0+bmFtZSAmJiAhbWVtY21wKHdxLT5uYW1lLG5hbWUtPm5hbWUsbmFtZS0+bGVuKSApCisJCQlicmVhazsKKwl9CisJCisJaWYgKCAhd3EgKSB7CisJCS8qIENyZWF0ZSBhIG5ldyB3YWl0IHF1ZXVlICovCisJCXdxID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGF1dG9mc193YWl0X3F1ZXVlKSxHRlBfS0VSTkVMKTsKKwkJaWYgKCAhd3EgKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJd3EtPm5hbWUgPSBrbWFsbG9jKG5hbWUtPmxlbixHRlBfS0VSTkVMKTsKKwkJaWYgKCAhd3EtPm5hbWUgKSB7CisJCQlrZnJlZSh3cSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQl3cS0+d2FpdF9xdWV1ZV90b2tlbiA9IGF1dG9mc19uZXh0X3dhaXRfcXVldWUrKzsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmd3EtPnF1ZXVlKTsKKwkJd3EtPmhhc2ggPSBuYW1lLT5oYXNoOworCQl3cS0+bGVuID0gbmFtZS0+bGVuOworCQl3cS0+c3RhdHVzID0gLUVJTlRSOyAvKiBTdGF0dXMgcmV0dXJuIGlmIGludGVycnVwdGVkICovCisJCW1lbWNweSh3cS0+bmFtZSwgbmFtZS0+bmFtZSwgbmFtZS0+bGVuKTsKKwkJd3EtPm5leHQgPSBzYmktPnF1ZXVlczsKKwkJc2JpLT5xdWV1ZXMgPSB3cTsKKworCQkvKiBhdXRvZnNfbm90aWZ5X2RhZW1vbigpIG1heSBibG9jayAqLworCQl3cS0+d2FpdF9jdHIgPSAyOworCQlhdXRvZnNfbm90aWZ5X2RhZW1vbihzYmksd3EpOworCX0gZWxzZQorCQl3cS0+d2FpdF9jdHIrKzsKKworCS8qIHdxLT5uYW1lIGlzIE5VTEwgaWYgYW5kIG9ubHkgaWYgdGhlIGxvY2sgaXMgYWxyZWFkeSByZWxlYXNlZCAqLworCisJaWYgKCBzYmktPmNhdGF0b25pYyApIHsKKwkJLyogV2UgbWlnaHQgaGF2ZSBzbGVwdCwgc28gY2hlY2sgYWdhaW4gZm9yIGNhdGF0b25pYyBtb2RlICovCisJCXdxLT5zdGF0dXMgPSAtRU5PRU5UOworCQlpZiAoIHdxLT5uYW1lICkgeworCQkJa2ZyZWUod3EtPm5hbWUpOworCQkJd3EtPm5hbWUgPSBOVUxMOworCQl9CisJfQorCisJaWYgKCB3cS0+bmFtZSApIHsKKwkJLyogQmxvY2sgYWxsIGJ1dCAic2h1dGRvd24iIHNpZ25hbHMgd2hpbGUgd2FpdGluZyAqLworCQlzaWdzZXRfdCBzaWdtYXNrOworCisJCXNpZ2luaXRzZXRpbnYoJnNpZ21hc2ssIFNIVVRET1dOX1NJR1MpOworCQlzaWdwcm9jbWFzayhTSUdfQkxPQ0ssICZzaWdtYXNrLCAmc2lnbWFzayk7CisKKwkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmd3EtPnF1ZXVlKTsKKworCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJnNpZ21hc2ssIE5VTEwpOworCX0gZWxzZSB7CisJCURQUklOVEsoKCJhdXRvZnNfd2FpdDogc2tpcHBlZCBzbGVlcGluZ1xuIikpOworCX0KKworCXN0YXR1cyA9IHdxLT5zdGF0dXM7CisKKwlpZiAoICEgLS13cS0+d2FpdF9jdHIgKQkvKiBBcmUgd2UgdGhlIGxhc3QgcHJvY2VzcyB0byBuZWVkIHN0YXR1cz8gKi8KKwkJa2ZyZWUod3EpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworCitpbnQgYXV0b2ZzX3dhaXRfcmVsZWFzZShzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSwgYXV0b2ZzX3dxdF90IHdhaXRfcXVldWVfdG9rZW4sIGludCBzdGF0dXMpCit7CisJc3RydWN0IGF1dG9mc193YWl0X3F1ZXVlICp3cSwgKip3cWw7CisKKwlmb3IgKCB3cWwgPSAmc2JpLT5xdWV1ZXMgOyAod3EgPSAqd3FsKSAhPSAwIDsgd3FsID0gJndxLT5uZXh0ICkgeworCQlpZiAoIHdxLT53YWl0X3F1ZXVlX3Rva2VuID09IHdhaXRfcXVldWVfdG9rZW4gKQorCQkJYnJlYWs7CisJfQorCWlmICggIXdxICkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqd3FsID0gd3EtPm5leHQ7CS8qIFVubGluayBmcm9tIGNoYWluICovCisJa2ZyZWUod3EtPm5hbWUpOworCXdxLT5uYW1lID0gTlVMTDsJLyogRG8gbm90IHdhaXQgb24gdGhpcyBxdWV1ZSAqLworCisJd3EtPnN0YXR1cyA9IHN0YXR1czsKKworCWlmICggISAtLXdxLT53YWl0X2N0ciApCS8qIElzIGFueW9uZSBzdGlsbCB3YWl0aW5nIGZvciB0aGlzIGd1eT8gKi8KKwkJa2ZyZWUod3EpOworCWVsc2UKKwkJd2FrZV91cCgmd3EtPnF1ZXVlKTsKKworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9mcy9hdXRvZnM0L01ha2VmaWxlIGIvZnMvYXV0b2ZzNC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmMzYjc5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvYXV0b2ZzNC9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBhdXRvZnMtZmlsZXN5c3RlbSByb3V0aW5lcy4KKyMKKworb2JqLSQoQ09ORklHX0FVVE9GUzRfRlMpICs9IGF1dG9mczQubworCithdXRvZnM0LW9ianMgOj0gaW5pdC5vIGlub2RlLm8gcm9vdC5vIHN5bWxpbmsubyB3YWl0cS5vIGV4cGlyZS5vCmRpZmYgLS1naXQgYS9mcy9hdXRvZnM0L2F1dG9mc19pLmggYi9mcy9hdXRvZnM0L2F1dG9mc19pLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVhNTJjOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2F1dG9mczQvYXV0b2ZzX2kuaApAQCAtMCwwICsxLDE5MyBAQAorLyogLSotIGMgLSotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICogICAKKyAqIGxpbnV4L2ZzL2F1dG9mcy9hdXRvZnNfaS5oCisgKgorICogICBDb3B5cmlnaHQgMTk5Ny0xOTk4IFRyYW5zbWV0YSBDb3Jwb3JhdGlvbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBvciBhdCB5b3VyCisgKiBvcHRpb24sIGFueSBsYXRlciB2ZXJzaW9uLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBJbnRlcm5hbCBoZWFkZXIgZmlsZSBmb3IgYXV0b2ZzICovCisKKyNpbmNsdWRlIDxsaW51eC9hdXRvX2ZzNC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworLyogVGhpcyBpcyB0aGUgcmFuZ2Ugb2YgaW9jdGwoKSBudW1iZXJzIHdlIGNsYWltIGFzIG91cnMgKi8KKyNkZWZpbmUgQVVUT0ZTX0lPQ19GSVJTVCAgICAgQVVUT0ZTX0lPQ19SRUFEWQorI2RlZmluZSBBVVRPRlNfSU9DX0NPVU5UICAgICAzMgorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisvKiAjZGVmaW5lIERFQlVHICovCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBEUFJJTlRLKGZtdCxhcmdzLi4uKSBkbyB7IHByaW50ayhLRVJOX0RFQlVHICJwaWQgJWQ6ICVzOiAiIGZtdCAiXG4iICwgY3VycmVudC0+cGlkICwgX19GVU5DVElPTl9fICwgIyNhcmdzKTsgfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgRFBSSU5USyhmbXQsYXJncy4uLikgZG8ge30gd2hpbGUoMCkKKyNlbmRpZgorCisjZGVmaW5lIEFVVE9GU19TVVBFUl9NQUdJQyAweDAxODcKKworLyoKKyAqIElmIHRoZSBkYWVtb24gcmV0dXJucyBhIG5lZ2F0aXZlIHJlc3BvbnNlIChBVVRPRlNfSU9DX0ZBSUwpIHRoZW4gdGhlCisgKiBrZXJuZWwgd2lsbCBrZWVwIHRoZSBuZWdhdGl2ZSByZXNwb25zZSBjYWNoZWQgZm9yIHVwIHRvIHRoZSB0aW1lIGdpdmVuCisgKiBoZXJlLCBhbHRob3VnaCB0aGUgdGltZSBjYW4gYmUgc2hvcnRlciBpZiB0aGUga2VybmVsIHRocm93cyB0aGUgZGNhY2hlCisgKiBlbnRyeSBhd2F5LiAgVGhpcyBwcm9iYWJseSBzaG91bGQgYmUgc2V0dGFibGUgZnJvbSB1c2VyIHNwYWNlLgorICovCisjZGVmaW5lIEFVVE9GU19ORUdBVElWRV9USU1FT1VUICg2MCpIWikJLyogMSBtaW51dGUgKi8KKworLyogVW5pZmllZCBpbmZvIHN0cnVjdHVyZS4gIFRoaXMgaXMgcG9pbnRlZCB0byBieSBib3RoIHRoZSBkZW50cnkgYW5kCisgICBpbm9kZSBzdHJ1Y3R1cmVzLiAgRWFjaCBmaWxlIGluIHRoZSBmaWxlc3lzdGVtIGhhcyBhbiBpbnN0YW5jZSBvZiB0aGlzCisgICBzdHJ1Y3R1cmUuICBJdCBob2xkcyBhIHJlZmVyZW5jZSB0byB0aGUgZGVudHJ5LCBzbyBkZW50cmllcyBhcmUgbmV2ZXIKKyAgIGZsdXNoZWQgd2hpbGUgdGhlIGZpbGUgZXhpc3RzLiAgQWxsIG5hbWUgbG9va3VwcyBhcmUgZGVhbHQgd2l0aCBhdCB0aGUKKyAgIGRlbnRyeSBsZXZlbCwgYWx0aG91Z2ggdGhlIGZpbGVzeXN0ZW0gY2FuIGludGVyZmVyZSBpbiB0aGUgdmFsaWRhdGlvbgorICAgcHJvY2Vzcy4gIFJlYWRkaXIgaXMgaW1wbGVtZW50ZWQgYnkgdHJhdmVyc2luZyB0aGUgZGVudHJ5IGxpc3RzLiAqLworc3RydWN0IGF1dG9mc19pbmZvIHsKKwlzdHJ1Y3QgZGVudHJ5CSpkZW50cnk7CisJc3RydWN0IGlub2RlCSppbm9kZTsKKworCWludAkJZmxhZ3M7CisKKwlzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaTsKKwl1bnNpZ25lZCBsb25nIGxhc3RfdXNlZDsKKworCW1vZGVfdAltb2RlOworCXNpemVfdAlzaXplOworCisJdm9pZCAoKmZyZWUpKHN0cnVjdCBhdXRvZnNfaW5mbyAqKTsKKwl1bmlvbiB7CisJCWNvbnN0IGNoYXIgKnN5bWxpbms7CisJfSB1OworfTsKKworI2RlZmluZSBBVVRPRlNfSU5GX0VYUElSSU5HCSgxPDwwKSAvKiBkZW50cnkgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgZXhwaXJpbmcgKi8KKworc3RydWN0IGF1dG9mc193YWl0X3F1ZXVlIHsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBxdWV1ZTsKKwlzdHJ1Y3QgYXV0b2ZzX3dhaXRfcXVldWUgKm5leHQ7CisJYXV0b2ZzX3dxdF90IHdhaXRfcXVldWVfdG9rZW47CisJLyogV2UgdXNlIHRoZSBmb2xsb3dpbmcgdG8gc2VlIHdoYXQgd2UgYXJlIHdhaXRpbmcgZm9yICovCisJaW50IGhhc2g7CisJaW50IGxlbjsKKwljaGFyICpuYW1lOworCS8qIFRoaXMgaXMgZm9yIHN0YXR1cyByZXBvcnRpbmcgdXBvbiByZXR1cm4gKi8KKwlpbnQgc3RhdHVzOworCWF0b21pY190IHdhaXRfY3RyOworfTsKKworI2RlZmluZSBBVVRPRlNfU0JJX01BR0lDIDB4NmQ0YTU1NmQKKworc3RydWN0IGF1dG9mc19zYl9pbmZvIHsKKwl1MzIgbWFnaWM7CisJc3RydWN0IGZpbGUgKnBpcGU7CisJcGlkX3Qgb3pfcGdycDsKKwlpbnQgY2F0YXRvbmljOworCWludCB2ZXJzaW9uOworCWludCBzdWJfdmVyc2lvbjsKKwl1bnNpZ25lZCBsb25nIGV4cF90aW1lb3V0OworCWludCByZWdob3N0X2VuYWJsZWQ7CisJaW50IG5lZWRzX3JlZ2hvc3Q7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHdxX3NlbTsKKwlzdHJ1Y3QgYXV0b2ZzX3dhaXRfcXVldWUgKnF1ZXVlczsgLyogV2FpdCBxdWV1ZSBwb2ludGVyICovCit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqYXV0b2ZzNF9zYmkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlyZXR1cm4gKHN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqKShzYi0+c19mc19pbmZvKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYXV0b2ZzX2luZm8gKmF1dG9mczRfZGVudHJ5X2lubyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJcmV0dXJuIChzdHJ1Y3QgYXV0b2ZzX2luZm8gKikoZGVudHJ5LT5kX2ZzZGF0YSk7Cit9CisKKy8qIGF1dG9mczRfb3pfbW9kZSgpOiBkbyB3ZSBzZWUgdGhlIG1hbiBiZWhpbmQgdGhlIGN1cnRhaW4/ICAoVGhlCisgICBwcm9jZXNzZXMgd2hpY2ggZG8gbWFuaXB1bGF0aW9ucyBmb3IgdXMgaW4gdXNlciBzcGFjZSBzZWVzIHRoZSByYXcKKyAgIGZpbGVzeXN0ZW0gd2l0aG91dCAibWFnaWMiLikgKi8KKworc3RhdGljIGlubGluZSBpbnQgYXV0b2ZzNF9vel9tb2RlKHN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpKSB7CisJcmV0dXJuIHNiaS0+Y2F0YXRvbmljIHx8IHByb2Nlc3NfZ3JvdXAoY3VycmVudCkgPT0gc2JpLT5vel9wZ3JwOworfQorCisvKiBEb2VzIGEgZGVudHJ5IGhhdmUgc29tZSBwZW5kaW5nIGFjdGl2aXR5PyAqLworc3RhdGljIGlubGluZSBpbnQgYXV0b2ZzNF9pc3BlbmRpbmcoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBhdXRvZnNfaW5mbyAqaW5mID0gYXV0b2ZzNF9kZW50cnlfaW5vKGRlbnRyeSk7CisKKwlyZXR1cm4gKGRlbnRyeS0+ZF9mbGFncyAmIERDQUNIRV9BVVRPRlNfUEVORElORykgfHwKKwkJKGluZiAhPSBOVUxMICYmIGluZi0+ZmxhZ3MgJiBBVVRPRlNfSU5GX0VYUElSSU5HKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGF1dG9mczRfY29weV9hdGltZShzdHJ1Y3QgZmlsZSAqc3JjLCBzdHJ1Y3QgZmlsZSAqZHN0KQoreworCWRzdC0+Zl9kZW50cnktPmRfaW5vZGUtPmlfYXRpbWUgPSBzcmMtPmZfZGVudHJ5LT5kX2lub2RlLT5pX2F0aW1lOworCXJldHVybjsKK30KKworc3RydWN0IGlub2RlICphdXRvZnM0X2dldF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGF1dG9mc19pbmZvICopOwordm9pZCBhdXRvZnM0X2ZyZWVfaW5vKHN0cnVjdCBhdXRvZnNfaW5mbyAqKTsKKworLyogRXhwaXJhdGlvbiAqLworaW50IGlzX2F1dG9mczRfZGVudHJ5KHN0cnVjdCBkZW50cnkgKik7CitpbnQgYXV0b2ZzNF9leHBpcmVfcnVuKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgdmZzbW91bnQgKiwKKwkJCXN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqLAorCQkJc3RydWN0IGF1dG9mc19wYWNrZXRfZXhwaXJlIF9fdXNlciAqKTsKK2ludCBhdXRvZnM0X2V4cGlyZV9tdWx0aShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IHZmc21vdW50ICosCisJCQlzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKiwgaW50IF9fdXNlciAqKTsKKworLyogT3BlcmF0aW9ucyBzdHJ1Y3R1cmVzICovCisKK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBhdXRvZnM0X3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBhdXRvZnM0X2Rpcl9pbm9kZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGF1dG9mczRfcm9vdF9pbm9kZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXV0b2ZzNF9kaXJfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1dG9mczRfcm9vdF9vcGVyYXRpb25zOworCisvKiBJbml0aWFsaXppbmcgZnVuY3Rpb24gKi8KKworaW50IGF1dG9mczRfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdm9pZCAqLCBpbnQpOworc3RydWN0IGF1dG9mc19pbmZvICphdXRvZnM0X2luaXRfaW5vKHN0cnVjdCBhdXRvZnNfaW5mbyAqLCBzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSwgbW9kZV90IG1vZGUpOworCisvKiBRdWV1ZSBtYW5hZ2VtZW50IGZ1bmN0aW9ucyAqLworCitlbnVtIGF1dG9mc19ub3RpZnkKK3sKKwlORllfTk9ORSwKKwlORllfTU9VTlQsCisJTkZZX0VYUElSRQorfTsKKworaW50IGF1dG9mczRfd2FpdChzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKixzdHJ1Y3QgZGVudHJ5ICosIGVudW0gYXV0b2ZzX25vdGlmeSk7CitpbnQgYXV0b2ZzNF93YWl0X3JlbGVhc2Uoc3RydWN0IGF1dG9mc19zYl9pbmZvICosYXV0b2ZzX3dxdF90LGludCk7Cit2b2lkIGF1dG9mczRfY2F0YXRvbmljX21vZGUoc3RydWN0IGF1dG9mc19zYl9pbmZvICopOworCitzdGF0aWMgaW5saW5lIGludCBzaW1wbGVfcG9zaXRpdmUoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXJldHVybiBkZW50cnktPmRfaW5vZGUgJiYgIWRfdW5oYXNoZWQoZGVudHJ5KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2ltcGxlX2VtcHR5X25vbG9jayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGRlbnRyeSAqY2hpbGQ7CisJaW50IHJldCA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkLCAmZGVudHJ5LT5kX3N1YmRpcnMsIGRfY2hpbGQpCisJCWlmIChzaW1wbGVfcG9zaXRpdmUoY2hpbGQpKQorCQkJZ290byBvdXQ7CisJcmV0ID0gMTsKK291dDoKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzNC9leHBpcmUuYyBiL2ZzL2F1dG9mczQvZXhwaXJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE1NDBhNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2F1dG9mczQvZXhwaXJlLmMKQEAgLTAsMCArMSwzNTggQEAKKy8qIC0qLSBjIC0qLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqIGxpbnV4L2ZzL2F1dG9mcy9leHBpcmUuYworICoKKyAqICBDb3B5cmlnaHQgMTk5Ny0xOTk4IFRyYW5zbWV0YSBDb3Jwb3JhdGlvbiAtLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgQ29weXJpZ2h0IDE5OTktMjAwMCBKZXJlbXkgRml0emhhcmRpbmdlIDxqZXJlbXlAZ29vcC5vcmc+CisgKiAgQ29weXJpZ2h0IDIwMDEtMjAwMyBJYW4gS2VudCA8cmF2ZW5AdGhlbWF3Lm5ldD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBvciBhdCB5b3VyCisgKiBvcHRpb24sIGFueSBsYXRlciB2ZXJzaW9uLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlICJhdXRvZnNfaS5oIgorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBub3c7CisKKy8qIENoZWNrIGlmIGEgZGVudHJ5IGNhbiBiZSBleHBpcmVkIHJldHVybiAxIGlmIGl0IGNhbiBlbHNlIHJldHVybiAwICovCitzdGF0aWMgaW5saW5lIGludCBhdXRvZnM0X2Nhbl9leHBpcmUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJCQl1bnNpZ25lZCBsb25nIHRpbWVvdXQsIGludCBkb19ub3cpCit7CisJc3RydWN0IGF1dG9mc19pbmZvICppbm8gPSBhdXRvZnM0X2RlbnRyeV9pbm8oZGVudHJ5KTsKKworCS8qIGRlbnRyeSBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBkZWxldGVkICovCisJaWYgKGlubyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCS8qIE5vIHBvaW50IGV4cGlyaW5nIGEgcGVuZGluZyBtb3VudCAqLworCWlmIChkZW50cnktPmRfZmxhZ3MgJiBEQ0FDSEVfQVVUT0ZTX1BFTkRJTkcpCisJCXJldHVybiAwOworCisJaWYgKCFkb19ub3cpIHsKKwkJLyogVG9vIHlvdW5nIHRvIGRpZSAqLworCQlpZiAodGltZV9hZnRlcihpbm8tPmxhc3RfdXNlZCArIHRpbWVvdXQsIG5vdykpCisJCQlyZXR1cm4gMDsKKworCQkvKiB1cGRhdGUgbGFzdF91c2VkIGhlcmUgOi0KKwkJICAgLSBvYnZpb3VzbHkgbWFrZXMgc2Vuc2UgaWYgaXQgaXMgaW4gdXNlIG5vdworCQkgICAtIGxlc3Mgb2J2aW91c2x5LCBwcmV2ZW50cyByYXBpZC1maXJlIGV4cGlyZQorCQkgICAgIGF0dGVtcHRzIGlmIGV4cGlyZSBmYWlscyB0aGUgZmlyc3QgdGltZSAqLworCQlpbm8tPmxhc3RfdXNlZCA9IG5vdzsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyogQ2hlY2sgYSBtb3VudCBwb2ludCBmb3IgYnVzeW5lc3MgcmV0dXJuIDEgaWYgbm90IGJ1c3ksIG90aGVyd2lzZSAqLworc3RhdGljIGludCBhdXRvZnM0X2NoZWNrX21vdW50KHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJaW50IHN0YXR1cyA9IDA7CisKKwlEUFJJTlRLKCJkZW50cnkgJXAgJS4qcyIsCisJCWRlbnRyeSwgKGludClkZW50cnktPmRfbmFtZS5sZW4sIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJbW50Z2V0KG1udCk7CisJZGdldChkZW50cnkpOworCisJaWYgKCFmb2xsb3dfZG93bigmbW50LCAmZGVudHJ5KSkKKwkJZ290byBkb25lOworCisJd2hpbGUgKGRfbW91bnRwb2ludChkZW50cnkpICYmIGZvbGxvd19kb3duKCZtbnQsICZkZW50cnkpKQorCQk7CisKKwkvKiBUaGlzIGlzIGFuIGF1dG9mcyBzdWJtb3VudCwgd2UgY2FuJ3QgZXhwaXJlIGl0ICovCisJaWYgKGlzX2F1dG9mczRfZGVudHJ5KGRlbnRyeSkpCisJCWdvdG8gZG9uZTsKKworCS8qIFRoZSBiaWcgcXVlc3Rpb24gKi8KKwlpZiAobWF5X3Vtb3VudF90cmVlKG1udCkgPT0gMCkKKwkJc3RhdHVzID0gMTsKK2RvbmU6CisJRFBSSU5USygicmV0dXJuaW5nID0gJWQiLCBzdGF0dXMpOworCW1udHB1dChtbnQpOworCWRwdXQoZGVudHJ5KTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBDaGVjayBhIGRpcmVjdG9yeSB0cmVlIG9mIG1vdW50IHBvaW50cyBmb3IgYnVzeW5lc3MKKyAqIFRoZSB0cmVlIGlzIG5vdCBidXN5IGlmZiBubyBtb3VudHBvaW50cyBhcmUgYnVzeQorICogUmV0dXJuIDEgaWYgdGhlIHRyZWUgaXMgYnVzeSBvciAwIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IGF1dG9mczRfY2hlY2tfdHJlZShzdHJ1Y3QgdmZzbW91bnQgKm1udCwKKwkgICAgICAgCQkgICAgICBzdHJ1Y3QgZGVudHJ5ICp0b3AsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIHRpbWVvdXQsCisJCQkgICAgICBpbnQgZG9fbm93KQoreworCXN0cnVjdCBkZW50cnkgKnRoaXNfcGFyZW50ID0gdG9wOworCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQ7CisKKwlEUFJJTlRLKCJwYXJlbnQgJXAgJS4qcyIsCisJCXRvcCwgKGludCl0b3AtPmRfbmFtZS5sZW4sIHRvcC0+ZF9uYW1lLm5hbWUpOworCisJLyogTmVnYXRpdmUgZGVudHJ5IC0gZ2l2ZSB1cCAqLworCWlmICghc2ltcGxlX3Bvc2l0aXZlKHRvcCkpCisJCXJldHVybiAwOworCisJLyogVGltZW91dCBvZiBhIHRyZWUgbW91bnQgaXMgZGV0ZXJtaW5lZCBieSBpdHMgdG9wIGRlbnRyeSAqLworCWlmICghYXV0b2ZzNF9jYW5fZXhwaXJlKHRvcCwgdGltZW91dCwgZG9fbm93KSkKKwkJcmV0dXJuIDA7CisKKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKK3JlcGVhdDoKKwluZXh0ID0gdGhpc19wYXJlbnQtPmRfc3ViZGlycy5uZXh0OworcmVzdW1lOgorCXdoaWxlIChuZXh0ICE9ICZ0aGlzX3BhcmVudC0+ZF9zdWJkaXJzKSB7CisJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGxpc3RfZW50cnkobmV4dCwgc3RydWN0IGRlbnRyeSwgZF9jaGlsZCk7CisKKwkJLyogTmVnYXRpdmUgZGVudHJ5IC0gZ2l2ZSB1cCAqLworCQlpZiAoIXNpbXBsZV9wb3NpdGl2ZShkZW50cnkpKSB7CisJCQluZXh0ID0gbmV4dC0+bmV4dDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJRFBSSU5USygiZGVudHJ5ICVwICUuKnMiLAorCQkJZGVudHJ5LCAoaW50KWRlbnRyeS0+ZF9uYW1lLmxlbiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwkJaWYgKCFzaW1wbGVfZW1wdHlfbm9sb2NrKGRlbnRyeSkpIHsKKwkJCXRoaXNfcGFyZW50ID0gZGVudHJ5OworCQkJZ290byByZXBlYXQ7CisJCX0KKworCQlkZW50cnkgPSBkZ2V0KGRlbnRyeSk7CisJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisKKwkJaWYgKGRfbW91bnRwb2ludChkZW50cnkpKSB7CisJCQkvKiBGaXJzdCBidXN5ID0+IHRyZWUgYnVzeSAqLworCQkJaWYgKCFhdXRvZnM0X2NoZWNrX21vdW50KG1udCwgZGVudHJ5KSkgeworCQkJCWRwdXQoZGVudHJ5KTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCisJCWRwdXQoZGVudHJ5KTsKKwkJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJCW5leHQgPSBuZXh0LT5uZXh0OworCX0KKworCWlmICh0aGlzX3BhcmVudCAhPSB0b3ApIHsKKwkJbmV4dCA9IHRoaXNfcGFyZW50LT5kX2NoaWxkLm5leHQ7CisJCXRoaXNfcGFyZW50ID0gdGhpc19wYXJlbnQtPmRfcGFyZW50OworCQlnb3RvIHJlc3VtZTsKKwl9CisJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqYXV0b2ZzNF9jaGVja19sZWF2ZXMoc3RydWN0IHZmc21vdW50ICptbnQsCisJCQkJCSAgIHN0cnVjdCBkZW50cnkgKnBhcmVudCwKKwkJCQkJICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0LAorCQkJCQkgICBpbnQgZG9fbm93KQoreworCXN0cnVjdCBkZW50cnkgKnRoaXNfcGFyZW50ID0gcGFyZW50OworCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQ7CisKKwlEUFJJTlRLKCJwYXJlbnQgJXAgJS4qcyIsCisJCXBhcmVudCwgKGludClwYXJlbnQtPmRfbmFtZS5sZW4sIHBhcmVudC0+ZF9uYW1lLm5hbWUpOworCisJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CityZXBlYXQ6CisJbmV4dCA9IHRoaXNfcGFyZW50LT5kX3N1YmRpcnMubmV4dDsKK3Jlc3VtZToKKwl3aGlsZSAobmV4dCAhPSAmdGhpc19wYXJlbnQtPmRfc3ViZGlycykgeworCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBsaXN0X2VudHJ5KG5leHQsIHN0cnVjdCBkZW50cnksIGRfY2hpbGQpOworCisJCS8qIE5lZ2F0aXZlIGRlbnRyeSAtIGdpdmUgdXAgKi8KKwkJaWYgKCFzaW1wbGVfcG9zaXRpdmUoZGVudHJ5KSkgeworCQkJbmV4dCA9IG5leHQtPm5leHQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCURQUklOVEsoImRlbnRyeSAlcCAlLipzIiwKKwkJCWRlbnRyeSwgKGludClkZW50cnktPmRfbmFtZS5sZW4sIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJCWlmICghbGlzdF9lbXB0eSgmZGVudHJ5LT5kX3N1YmRpcnMpKSB7CisJCQl0aGlzX3BhcmVudCA9IGRlbnRyeTsKKwkJCWdvdG8gcmVwZWF0OworCQl9CisKKwkJZGVudHJ5ID0gZGdldChkZW50cnkpOworCQlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCisJCWlmIChkX21vdW50cG9pbnQoZGVudHJ5KSkgeworCQkJLyogQ2FuIHdlIGV4cGlyZSB0aGlzIGd1eSAqLworCQkJaWYgKCFhdXRvZnM0X2Nhbl9leHBpcmUoZGVudHJ5LCB0aW1lb3V0LCBkb19ub3cpKQorCQkJCWdvdG8gY29udDsKKworCQkJLyogQ2FuIHdlIHVtb3VudCB0aGlzIGd1eSAqLworCQkJaWYgKGF1dG9mczRfY2hlY2tfbW91bnQobW50LCBkZW50cnkpKQorCQkJCXJldHVybiBkZW50cnk7CisKKwkJfQorY29udDoKKwkJZHB1dChkZW50cnkpOworCQlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwkJbmV4dCA9IG5leHQtPm5leHQ7CisJfQorCisJaWYgKHRoaXNfcGFyZW50ICE9IHBhcmVudCkgeworCQluZXh0ID0gdGhpc19wYXJlbnQtPmRfY2hpbGQubmV4dDsKKwkJdGhpc19wYXJlbnQgPSB0aGlzX3BhcmVudC0+ZF9wYXJlbnQ7CisJCWdvdG8gcmVzdW1lOworCX0KKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBGaW5kIGFuIGVsaWdpYmxlIHRyZWUgdG8gdGltZS1vdXQKKyAqIEEgdHJlZSBpcyBlbGlnaWJsZSBpZiA6LQorICogIC0gaXQgaXMgdW51c2VkIGJ5IGFueSB1c2VyIHByb2Nlc3MKKyAqICAtIGl0IGhhcyBiZWVuIHVudXNlZCBmb3IgZXhwX3RpbWVvdXQgdGltZQorICovCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqYXV0b2ZzNF9leHBpcmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgICAgIHN0cnVjdCB2ZnNtb3VudCAqbW50LAorCQkJCSAgICAgc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmksCisJCQkJICAgICBpbnQgaG93KQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlzdHJ1Y3QgZGVudHJ5ICpyb290ID0gc2ItPnNfcm9vdDsKKwlzdHJ1Y3QgZGVudHJ5ICpleHBpcmVkID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0OworCWludCBkb19ub3cgPSBob3cgJiBBVVRPRlNfRVhQX0lNTUVESUFURTsKKwlpbnQgZXhwX2xlYXZlcyA9IGhvdyAmIEFVVE9GU19FWFBfTEVBVkVTOworCisJaWYgKCAhc2JpLT5leHBfdGltZW91dCB8fCAhcm9vdCApCisJCXJldHVybiBOVUxMOworCisJbm93ID0gamlmZmllczsKKwl0aW1lb3V0ID0gc2JpLT5leHBfdGltZW91dDsKKworCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCW5leHQgPSByb290LT5kX3N1YmRpcnMubmV4dDsKKworCS8qIE9uIGV4aXQgZnJvbSB0aGUgbG9vcCBleHBpcmUgaXMgc2V0IHRvIGEgZGdvdCBkZW50cnkKKwkgKiB0byBleHBpcmUgb3IgaXQncyBOVUxMICovCisJd2hpbGUgKCBuZXh0ICE9ICZyb290LT5kX3N1YmRpcnMgKSB7CisJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGxpc3RfZW50cnkobmV4dCwgc3RydWN0IGRlbnRyeSwgZF9jaGlsZCk7CisKKwkJLyogTmVnYXRpdmUgZGVudHJ5IC0gZ2l2ZSB1cCAqLworCQlpZiAoICFzaW1wbGVfcG9zaXRpdmUoZGVudHJ5KSApIHsKKwkJCW5leHQgPSBuZXh0LT5uZXh0OworCQkJY29udGludWU7CisJCX0KKworCQlkZW50cnkgPSBkZ2V0KGRlbnRyeSk7CisJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisKKwkJLyogQ2FzZSAxOiBpbmRpcmVjdCBtb3VudCBvciB0b3AgbGV2ZWwgZGlyZWN0IG1vdW50ICovCisJCWlmIChkX21vdW50cG9pbnQoZGVudHJ5KSkgeworCQkJRFBSSU5USygiY2hlY2tpbmcgbW91bnRwb2ludCAlcCAlLipzIiwKKwkJCQlkZW50cnksIChpbnQpZGVudHJ5LT5kX25hbWUubGVuLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCQkJLyogQ2FuIHdlIGV4cGlyZSB0aGlzIGd1eSAqLworCQkJaWYgKCFhdXRvZnM0X2Nhbl9leHBpcmUoZGVudHJ5LCB0aW1lb3V0LCBkb19ub3cpKQorCQkJCWdvdG8gbmV4dDsKKworCQkJLyogQ2FuIHdlIHVtb3VudCB0aGlzIGd1eSAqLworCQkJaWYgKGF1dG9mczRfY2hlY2tfbW91bnQobW50LCBkZW50cnkpKSB7CisJCQkJZXhwaXJlZCA9IGRlbnRyeTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWdvdG8gbmV4dDsKKwkJfQorCisJCWlmICggc2ltcGxlX2VtcHR5KGRlbnRyeSkgKQorCQkJZ290byBuZXh0OworCisJCS8qIENhc2UgMjogdHJlZSBtb3VudCwgZXhwaXJlIGlmZiBlbnRpcmUgdHJlZSBpcyBub3QgYnVzeSAqLworCQlpZiAoIWV4cF9sZWF2ZXMpIHsKKwkJCWlmIChhdXRvZnM0X2NoZWNrX3RyZWUobW50LCBkZW50cnksIHRpbWVvdXQsIGRvX25vdykpIHsKKwkJCWV4cGlyZWQgPSBkZW50cnk7CisJCQlicmVhazsKKwkJCX0KKwkJLyogQ2FzZSAzOiBkaXJlY3QgbW91bnQsIGV4cGlyZSBpbmRpdmlkdWFsIGxlYXZlcyAqLworCQl9IGVsc2UgeworCQkJZXhwaXJlZCA9IGF1dG9mczRfY2hlY2tfbGVhdmVzKG1udCwgZGVudHJ5LCB0aW1lb3V0LCBkb19ub3cpOworCQkJaWYgKGV4cGlyZWQpIHsKKwkJCQlkcHV0KGRlbnRyeSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KK25leHQ6CisJCWRwdXQoZGVudHJ5KTsKKwkJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJCW5leHQgPSBuZXh0LT5uZXh0OworCX0KKworCWlmICggZXhwaXJlZCApIHsKKwkJRFBSSU5USygicmV0dXJuaW5nICVwICUuKnMiLAorCQkJZXhwaXJlZCwgKGludClleHBpcmVkLT5kX25hbWUubGVuLCBleHBpcmVkLT5kX25hbWUubmFtZSk7CisJCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCQlsaXN0X2RlbCgmZXhwaXJlZC0+ZF9wYXJlbnQtPmRfc3ViZGlycyk7CisJCWxpc3RfYWRkKCZleHBpcmVkLT5kX3BhcmVudC0+ZF9zdWJkaXJzLCAmZXhwaXJlZC0+ZF9jaGlsZCk7CisJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJCXJldHVybiBleHBpcmVkOworCX0KKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIFBlcmZvcm0gYW4gZXhwaXJ5IG9wZXJhdGlvbiAqLworaW50IGF1dG9mczRfZXhwaXJlX3J1bihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkgICAgICBzdHJ1Y3QgdmZzbW91bnQgKm1udCwKKwkJICAgICAgc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmksCisJCSAgICAgIHN0cnVjdCBhdXRvZnNfcGFja2V0X2V4cGlyZSBfX3VzZXIgKnBrdF9wKQoreworCXN0cnVjdCBhdXRvZnNfcGFja2V0X2V4cGlyZSBwa3Q7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCisJbWVtc2V0KCZwa3QsMCxzaXplb2YgcGt0KTsKKworCXBrdC5oZHIucHJvdG9fdmVyc2lvbiA9IHNiaS0+dmVyc2lvbjsKKwlwa3QuaGRyLnR5cGUgPSBhdXRvZnNfcHR5cGVfZXhwaXJlOworCisJaWYgKChkZW50cnkgPSBhdXRvZnM0X2V4cGlyZShzYiwgbW50LCBzYmksIDApKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCXBrdC5sZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisJbWVtY3B5KHBrdC5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lLCBwa3QubGVuKTsKKwlwa3QubmFtZVtwa3QubGVuXSA9ICdcMCc7CisJZHB1dChkZW50cnkpOworCisJaWYgKCBjb3B5X3RvX3VzZXIocGt0X3AsICZwa3QsIHNpemVvZihzdHJ1Y3QgYXV0b2ZzX3BhY2tldF9leHBpcmUpKSApCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGwgcmVwZWF0ZWRseSB1bnRpbCBpdCByZXR1cm5zIC1FQUdBSU4sIG1lYW5pbmcgdGhlcmUncyBub3RoaW5nCisgICBtb3JlIHRvIGJlIGRvbmUgKi8KK2ludCBhdXRvZnM0X2V4cGlyZV9tdWx0aShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCwKKwkJCXN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpLCBpbnQgX191c2VyICphcmcpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCWludCByZXQgPSAtRUFHQUlOOworCWludCBkb19ub3cgPSAwOworCisJaWYgKGFyZyAmJiBnZXRfdXNlcihkb19ub3csIGFyZykpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKChkZW50cnkgPSBhdXRvZnM0X2V4cGlyZShzYiwgbW50LCBzYmksIGRvX25vdykpICE9IE5VTEwpIHsKKwkJc3RydWN0IGF1dG9mc19pbmZvICpkZV9pbmZvID0gYXV0b2ZzNF9kZW50cnlfaW5vKGRlbnRyeSk7CisKKwkJLyogVGhpcyBpcyBzeW5jaHJvbm91cyBiZWNhdXNlIGl0IG1ha2VzIHRoZSBkYWVtb24gYQorICAgICAgICAgICAgICAgICAgIGxpdHRsZSBlYXNpZXIgKi8KKwkJZGVfaW5mby0+ZmxhZ3MgfD0gQVVUT0ZTX0lORl9FWFBJUklORzsKKwkJcmV0ID0gYXV0b2ZzNF93YWl0KHNiaSwgZGVudHJ5LCBORllfRVhQSVJFKTsKKwkJZGVfaW5mby0+ZmxhZ3MgJj0gfkFVVE9GU19JTkZfRVhQSVJJTkc7CisJCWRwdXQoZGVudHJ5KTsKKwl9CisJCQorCXJldHVybiByZXQ7Cit9CisKZGlmZiAtLWdpdCBhL2ZzL2F1dG9mczQvaW5pdC5jIGIvZnMvYXV0b2ZzNC9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNlY2VjOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2F1dG9mczQvaW5pdC5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qIC0qLSBjIC0qLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqIGxpbnV4L2ZzL2F1dG9mcy9pbml0LmMKKyAqCisgKiAgQ29weXJpZ2h0IDE5OTctMTk5OCBUcmFuc21ldGEgQ29ycG9yYXRpb24gLS0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIG9yIGF0IHlvdXIKKyAqIG9wdGlvbiwgYW55IGxhdGVyIHZlcnNpb24sIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlICJhdXRvZnNfaS5oIgorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICphdXRvZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9ub2Rldihmc190eXBlLCBmbGFncywgZGF0YSwgYXV0b2ZzNF9maWxsX3N1cGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGF1dG9mc19mc190eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiYXV0b2ZzIiwKKwkuZ2V0X3NiCQk9IGF1dG9mc19nZXRfc2IsCisJLmtpbGxfc2IJPSBraWxsX2Fub25fc3VwZXIsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2F1dG9mczRfZnModm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmYXV0b2ZzX2ZzX3R5cGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9hdXRvZnM0X2ZzKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZhdXRvZnNfZnNfdHlwZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfYXV0b2ZzNF9mcykgCittb2R1bGVfZXhpdChleGl0X2F1dG9mczRfZnMpCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9mcy9hdXRvZnM0L2lub2RlLmMgYi9mcy9hdXRvZnM0L2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUyNTYwNwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2F1dG9mczQvaW5vZGUuYwpAQCAtMCwwICsxLDMyNCBAQAorLyogLSotIGMgLSotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogbGludXgvZnMvYXV0b2ZzL2lub2RlLmMKKyAqCisgKiAgQ29weXJpZ2h0IDE5OTctMTk5OCBUcmFuc21ldGEgQ29ycG9yYXRpb24gLS0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIG9yIGF0IHlvdXIKKyAqIG9wdGlvbiwgYW55IGxhdGVyIHZlcnNpb24sIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgImF1dG9mc19pLmgiCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKK3N0YXRpYyB2b2lkIGlub19sbmtmcmVlKHN0cnVjdCBhdXRvZnNfaW5mbyAqaW5vKQoreworCWlmIChpbm8tPnUuc3ltbGluaykgeworCQlrZnJlZShpbm8tPnUuc3ltbGluayk7CisJCWluby0+dS5zeW1saW5rID0gTlVMTDsKKwl9Cit9CisKK3N0cnVjdCBhdXRvZnNfaW5mbyAqYXV0b2ZzNF9pbml0X2lubyhzdHJ1Y3QgYXV0b2ZzX2luZm8gKmlubywKKwkJCQkgICAgIHN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpLCBtb2RlX3QgbW9kZSkKK3sKKwlpbnQgcmVpbml0ID0gMTsKKworCWlmIChpbm8gPT0gTlVMTCkgeworCQlyZWluaXQgPSAwOworCQlpbm8gPSBrbWFsbG9jKHNpemVvZigqaW5vKSwgR0ZQX0tFUk5FTCk7CisJfQorCisJaWYgKGlubyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWluby0+ZmxhZ3MgPSAwOworCWluby0+bW9kZSA9IG1vZGU7CisJaW5vLT5pbm9kZSA9IE5VTEw7CisJaW5vLT5kZW50cnkgPSBOVUxMOworCWluby0+c2l6ZSA9IDA7CisKKwlpbm8tPmxhc3RfdXNlZCA9IGppZmZpZXM7CisKKwlpbm8tPnNiaSA9IHNiaTsKKworCWlmIChyZWluaXQgJiYgaW5vLT5mcmVlKQorCQkoaW5vLT5mcmVlKShpbm8pOworCisJbWVtc2V0KCZpbm8tPnUsIDAsIHNpemVvZihpbm8tPnUpKTsKKworCWluby0+ZnJlZSA9IE5VTEw7CisKKwlpZiAoU19JU0xOSyhtb2RlKSkKKwkJaW5vLT5mcmVlID0gaW5vX2xua2ZyZWU7CisKKwlyZXR1cm4gaW5vOworfQorCit2b2lkIGF1dG9mczRfZnJlZV9pbm8oc3RydWN0IGF1dG9mc19pbmZvICppbm8pCit7CisJaWYgKGluby0+ZGVudHJ5KSB7CisJCWluby0+ZGVudHJ5LT5kX2ZzZGF0YSA9IE5VTEw7CisJCWlmIChpbm8tPmRlbnRyeS0+ZF9pbm9kZSkKKwkJCWRwdXQoaW5vLT5kZW50cnkpOworCQlpbm8tPmRlbnRyeSA9IE5VTEw7CisJfQorCWlmIChpbm8tPmZyZWUpCisJCShpbm8tPmZyZWUpKGlubyk7CisJa2ZyZWUoaW5vKTsKK30KKworc3RhdGljIHZvaWQgYXV0b2ZzNF9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSA9IGF1dG9mczRfc2JpKHNiKTsKKworCXNiLT5zX2ZzX2luZm8gPSBOVUxMOworCisJaWYgKCAhc2JpLT5jYXRhdG9uaWMgKQorCQlhdXRvZnM0X2NhdGF0b25pY19tb2RlKHNiaSk7IC8qIEZyZWUgd2FpdCBxdWV1ZXMsIGNsb3NlIHBpcGUgKi8KKworCWtmcmVlKHNiaSk7CisKKwlEUFJJTlRLKCJzaHV0dGluZyBkb3duIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBhdXRvZnM0X3NvcHMgPSB7CisJLnB1dF9zdXBlcgk9IGF1dG9mczRfcHV0X3N1cGVyLAorCS5zdGF0ZnMJCT0gc2ltcGxlX3N0YXRmcywKK307CisKK2VudW0ge09wdF9lcnIsIE9wdF9mZCwgT3B0X3VpZCwgT3B0X2dpZCwgT3B0X3BncnAsIE9wdF9taW5wcm90bywgT3B0X21heHByb3RvfTsKKworc3RhdGljIG1hdGNoX3RhYmxlX3QgdG9rZW5zID0geworCXtPcHRfZmQsICJmZD0ldSJ9LAorCXtPcHRfdWlkLCAidWlkPSV1In0sCisJe09wdF9naWQsICJnaWQ9JXUifSwKKwl7T3B0X3BncnAsICJwZ3JwPSV1In0sCisJe09wdF9taW5wcm90bywgIm1pbnByb3RvPSV1In0sCisJe09wdF9tYXhwcm90bywgIm1heHByb3RvPSV1In0sCisJe09wdF9lcnIsIE5VTEx9Cit9OworCitzdGF0aWMgaW50IHBhcnNlX29wdGlvbnMoY2hhciAqb3B0aW9ucywgaW50ICpwaXBlZmQsIHVpZF90ICp1aWQsIGdpZF90ICpnaWQsCisJCQkgcGlkX3QgKnBncnAsIGludCAqbWlucHJvdG8sIGludCAqbWF4cHJvdG8pCit7CisJY2hhciAqcDsKKwlzdWJzdHJpbmdfdCBhcmdzW01BWF9PUFRfQVJHU107CisJaW50IG9wdGlvbjsKKworCSp1aWQgPSBjdXJyZW50LT51aWQ7CisJKmdpZCA9IGN1cnJlbnQtPmdpZDsKKwkqcGdycCA9IHByb2Nlc3NfZ3JvdXAoY3VycmVudCk7CisKKwkqbWlucHJvdG8gPSBBVVRPRlNfTUlOX1BST1RPX1ZFUlNJT047CisJKm1heHByb3RvID0gQVVUT0ZTX01BWF9QUk9UT19WRVJTSU9OOworCisJKnBpcGVmZCA9IC0xOworCisJaWYgKCFvcHRpb25zKQorCQlyZXR1cm4gMTsKKworCXdoaWxlICgocCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgeworCQlpbnQgdG9rZW47CisJCWlmICghKnApCisJCQljb250aW51ZTsKKworCQl0b2tlbiA9IG1hdGNoX3Rva2VuKHAsIHRva2VucywgYXJncyk7CisJCXN3aXRjaCAodG9rZW4pIHsKKwkJY2FzZSBPcHRfZmQ6CisJCQlpZiAobWF0Y2hfaW50KGFyZ3MsIHBpcGVmZCkpCisJCQkJcmV0dXJuIDE7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfdWlkOgorCQkJaWYgKG1hdGNoX2ludChhcmdzLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMTsKKwkJCSp1aWQgPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZ2lkOgorCQkJaWYgKG1hdGNoX2ludChhcmdzLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMTsKKwkJCSpnaWQgPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfcGdycDoKKwkJCWlmIChtYXRjaF9pbnQoYXJncywgJm9wdGlvbikpCisJCQkJcmV0dXJuIDE7CisJCQkqcGdycCA9IG9wdGlvbjsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9taW5wcm90bzoKKwkJCWlmIChtYXRjaF9pbnQoYXJncywgJm9wdGlvbikpCisJCQkJcmV0dXJuIDE7CisJCQkqbWlucHJvdG8gPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbWF4cHJvdG86CisJCQlpZiAobWF0Y2hfaW50KGFyZ3MsICZvcHRpb24pKQorCQkJCXJldHVybiAxOworCQkJKm1heHByb3RvID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlyZXR1cm4gKCpwaXBlZmQgPCAwKTsKK30KKworc3RhdGljIHN0cnVjdCBhdXRvZnNfaW5mbyAqYXV0b2ZzNF9ta3Jvb3Qoc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmkpCit7CisJc3RydWN0IGF1dG9mc19pbmZvICppbm87CisKKwlpbm8gPSBhdXRvZnM0X2luaXRfaW5vKE5VTEwsIHNiaSwgU19JRkRJUiB8IDA3NTUpOworCWlmICghaW5vKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBpbm87Cit9CisKK2ludCBhdXRvZnM0X2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQoreworCXN0cnVjdCBpbm9kZSAqIHJvb3RfaW5vZGU7CisJc3RydWN0IGRlbnRyeSAqIHJvb3Q7CisJc3RydWN0IGZpbGUgKiBwaXBlOworCWludCBwaXBlZmQ7CisJc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmk7CisJc3RydWN0IGF1dG9mc19pbmZvICppbm87CisJaW50IG1pbnByb3RvLCBtYXhwcm90bzsKKworCXNiaSA9IChzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKikga21hbGxvYyhzaXplb2YoKnNiaSksIEdGUF9LRVJORUwpOworCWlmICggIXNiaSApCisJCWdvdG8gZmFpbF91bmxvY2s7CisJRFBSSU5USygic3RhcnRpbmcgdXAsIHNiaSA9ICVwIixzYmkpOworCisJbWVtc2V0KHNiaSwgMCwgc2l6ZW9mKCpzYmkpKTsKKworCXMtPnNfZnNfaW5mbyA9IHNiaTsKKwlzYmktPm1hZ2ljID0gQVVUT0ZTX1NCSV9NQUdJQzsKKwlzYmktPmNhdGF0b25pYyA9IDA7CisJc2JpLT5leHBfdGltZW91dCA9IDA7CisJc2JpLT5vel9wZ3JwID0gcHJvY2Vzc19ncm91cChjdXJyZW50KTsKKwlzYmktPnNiID0gczsKKwlzYmktPnZlcnNpb24gPSAwOworCXNiaS0+c3ViX3ZlcnNpb24gPSAwOworCWluaXRfTVVURVgoJnNiaS0+d3Ffc2VtKTsKKwlzYmktPnF1ZXVlcyA9IE5VTEw7CisJcy0+c19ibG9ja3NpemUgPSAxMDI0OworCXMtPnNfYmxvY2tzaXplX2JpdHMgPSAxMDsKKwlzLT5zX21hZ2ljID0gQVVUT0ZTX1NVUEVSX01BR0lDOworCXMtPnNfb3AgPSAmYXV0b2ZzNF9zb3BzOworCXMtPnNfdGltZV9ncmFuID0gMTsKKworCS8qCisJICogR2V0IHRoZSByb290IGlub2RlIGFuZCBkZW50cnksIGJ1dCBkZWZlciBjaGVja2luZyBmb3IgZXJyb3JzLgorCSAqLworCWlubyA9IGF1dG9mczRfbWtyb290KHNiaSk7CisJaWYgKCFpbm8pCisJCWdvdG8gZmFpbF9mcmVlOworCXJvb3RfaW5vZGUgPSBhdXRvZnM0X2dldF9pbm9kZShzLCBpbm8pOworCWtmcmVlKGlubyk7CisJaWYgKCFyb290X2lub2RlKQorCQlnb3RvIGZhaWxfZnJlZTsKKworCXJvb3RfaW5vZGUtPmlfb3AgPSAmYXV0b2ZzNF9yb290X2lub2RlX29wZXJhdGlvbnM7CisJcm9vdF9pbm9kZS0+aV9mb3AgPSAmYXV0b2ZzNF9yb290X29wZXJhdGlvbnM7CisJcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290X2lub2RlKTsKKwlwaXBlID0gTlVMTDsKKworCWlmICghcm9vdCkKKwkJZ290byBmYWlsX2lwdXQ7CisKKwkvKiBDYW4gdGhpcyBjYWxsIGJsb2NrPyAqLworCWlmIChwYXJzZV9vcHRpb25zKGRhdGEsICZwaXBlZmQsCisJCQkgICZyb290X2lub2RlLT5pX3VpZCwgJnJvb3RfaW5vZGUtPmlfZ2lkLAorCQkJICAmc2JpLT5vel9wZ3JwLAorCQkJICAmbWlucHJvdG8sICZtYXhwcm90bykpIHsKKwkJcHJpbnRrKCJhdXRvZnM6IGNhbGxlZCB3aXRoIGJvZ3VzIG9wdGlvbnNcbiIpOworCQlnb3RvIGZhaWxfZHB1dDsKKwl9CisKKwkvKiBDb3VsZG4ndCB0aGlzIGJlIHRlc3RlZCBlYXJsaWVyPyAqLworCWlmIChtYXhwcm90byA8IEFVVE9GU19NSU5fUFJPVE9fVkVSU0lPTiB8fAorCSAgICBtaW5wcm90byA+IEFVVE9GU19NQVhfUFJPVE9fVkVSU0lPTikgeworCQlwcmludGsoImF1dG9mczoga2VybmVsIGRvZXMgbm90IG1hdGNoIGRhZW1vbiB2ZXJzaW9uICIKKwkJICAgICAgICJkYWVtb24gKCVkLCAlZCkga2VybmVsICglZCwgJWQpXG4iLAorCQkJbWlucHJvdG8sIG1heHByb3RvLAorCQkJQVVUT0ZTX01JTl9QUk9UT19WRVJTSU9OLCBBVVRPRlNfTUFYX1BST1RPX1ZFUlNJT04pOworCQlnb3RvIGZhaWxfZHB1dDsKKwl9CisKKwlzYmktPnZlcnNpb24gPSBtYXhwcm90byA+IEFVVE9GU19NQVhfUFJPVE9fVkVSU0lPTiA/IEFVVE9GU19NQVhfUFJPVE9fVkVSU0lPTiA6IG1heHByb3RvOworCXNiaS0+c3ViX3ZlcnNpb24gPSBBVVRPRlNfUFJPVE9fU1VCVkVSU0lPTjsKKworCURQUklOVEsoInBpcGUgZmQgPSAlZCwgcGdycCA9ICV1IiwgcGlwZWZkLCBzYmktPm96X3BncnApOworCXBpcGUgPSBmZ2V0KHBpcGVmZCk7CisJCisJaWYgKCAhcGlwZSApIHsKKwkJcHJpbnRrKCJhdXRvZnM6IGNvdWxkIG5vdCBvcGVuIHBpcGUgZmlsZSBkZXNjcmlwdG9yXG4iKTsKKwkJZ290byBmYWlsX2RwdXQ7CisJfQorCWlmICggIXBpcGUtPmZfb3AgfHwgIXBpcGUtPmZfb3AtPndyaXRlICkKKwkJZ290byBmYWlsX2ZwdXQ7CisJc2JpLT5waXBlID0gcGlwZTsKKworCS8qCisJICogU3VjY2VzcyEgSW5zdGFsbCB0aGUgcm9vdCBkZW50cnkgbm93IHRvIGluZGljYXRlIGNvbXBsZXRpb24uCisJICovCisJcy0+c19yb290ID0gcm9vdDsKKwlyZXR1cm4gMDsKKwkKKwkvKgorCSAqIEZhaWx1cmUgLi4uIGNsZWFuIHVwLgorCSAqLworZmFpbF9mcHV0OgorCXByaW50aygiYXV0b2ZzOiBwaXBlIGZpbGUgZGVzY3JpcHRvciBkb2VzIG5vdCBjb250YWluIHByb3BlciBvcHNcbiIpOworCWZwdXQocGlwZSk7CisJLyogZmFsbCB0aHJvdWdoICovCitmYWlsX2RwdXQ6CisJZHB1dChyb290KTsKKwlnb3RvIGZhaWxfZnJlZTsKK2ZhaWxfaXB1dDoKKwlwcmludGsoImF1dG9mczogZ2V0IHJvb3QgZGVudHJ5IGZhaWxlZFxuIik7CisJaXB1dChyb290X2lub2RlKTsKK2ZhaWxfZnJlZToKKwlrZnJlZShzYmkpOworZmFpbF91bmxvY2s6CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0cnVjdCBpbm9kZSAqYXV0b2ZzNF9nZXRfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQlzdHJ1Y3QgYXV0b2ZzX2luZm8gKmluZikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbmV3X2lub2RlKHNiKTsKKworCWlmIChpbm9kZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWluZi0+aW5vZGUgPSBpbm9kZTsKKwlpbm9kZS0+aV9tb2RlID0gaW5mLT5tb2RlOworCWlmIChzYi0+c19yb290KSB7CisJCWlub2RlLT5pX3VpZCA9IHNiLT5zX3Jvb3QtPmRfaW5vZGUtPmlfdWlkOworCQlpbm9kZS0+aV9naWQgPSBzYi0+c19yb290LT5kX2lub2RlLT5pX2dpZDsKKwl9IGVsc2UgeworCQlpbm9kZS0+aV91aWQgPSAwOworCQlpbm9kZS0+aV9naWQgPSAwOworCX0KKwlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9DQUNIRV9TSVpFOworCWlub2RlLT5pX2Jsb2NrcyA9IDA7CisJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCisJaWYgKFNfSVNESVIoaW5mLT5tb2RlKSkgeworCQlpbm9kZS0+aV9ubGluayA9IDI7CisJCWlub2RlLT5pX29wID0gJmF1dG9mczRfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZhdXRvZnM0X2Rpcl9vcGVyYXRpb25zOworCX0gZWxzZSBpZiAoU19JU0xOSyhpbmYtPm1vZGUpKSB7CisJCWlub2RlLT5pX3NpemUgPSBpbmYtPnNpemU7CisJCWlub2RlLT5pX29wID0gJmF1dG9mczRfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCX0KKworCXJldHVybiBpbm9kZTsKK30KZGlmZiAtLWdpdCBhL2ZzL2F1dG9mczQvcm9vdC5jIGIvZnMvYXV0b2ZzNC9yb290LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc2NWMwNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2F1dG9mczQvcm9vdC5jCkBAIC0wLDAgKzEsODA4IEBACisvKiAtKi0gYyAtKi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiBsaW51eC9mcy9hdXRvZnMvcm9vdC5jCisgKgorICogIENvcHlyaWdodCAxOTk3LTE5OTggVHJhbnNtZXRhIENvcnBvcmF0aW9uIC0tIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICBDb3B5cmlnaHQgMTk5OS0yMDAwIEplcmVteSBGaXR6aGFyZGluZ2UgPGplcmVteUBnb29wLm9yZz4KKyAqICBDb3B5cmlnaHQgMjAwMS0yMDAzIElhbiBLZW50IDxyYXZlbkB0aGVtYXcubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIG9yIGF0IHlvdXIKKyAqIG9wdGlvbiwgYW55IGxhdGVyIHZlcnNpb24sIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSAiYXV0b2ZzX2kuaCIKKworc3RhdGljIGludCBhdXRvZnM0X2Rpcl9zeW1saW5rKHN0cnVjdCBpbm9kZSAqLHN0cnVjdCBkZW50cnkgKixjb25zdCBjaGFyICopOworc3RhdGljIGludCBhdXRvZnM0X2Rpcl91bmxpbmsoc3RydWN0IGlub2RlICosc3RydWN0IGRlbnRyeSAqKTsKK3N0YXRpYyBpbnQgYXV0b2ZzNF9kaXJfcm1kaXIoc3RydWN0IGlub2RlICosc3RydWN0IGRlbnRyeSAqKTsKK3N0YXRpYyBpbnQgYXV0b2ZzNF9kaXJfbWtkaXIoc3RydWN0IGlub2RlICosc3RydWN0IGRlbnRyeSAqLGludCk7CitzdGF0aWMgaW50IGF1dG9mczRfcm9vdF9pb2N0bChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKix1bnNpZ25lZCBpbnQsdW5zaWduZWQgbG9uZyk7CitzdGF0aWMgaW50IGF1dG9mczRfZGlyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworc3RhdGljIGludCBhdXRvZnM0X2Rpcl9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50IGF1dG9mczRfZGlyX3JlYWRkaXIoc3RydWN0IGZpbGUgKiBmaWxwLCB2b2lkICogZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcik7CitzdGF0aWMgaW50IGF1dG9mczRfcm9vdF9yZWFkZGlyKHN0cnVjdCBmaWxlICogZmlscCwgdm9pZCAqIGRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpOworc3RhdGljIHN0cnVjdCBkZW50cnkgKmF1dG9mczRfbG9va3VwKHN0cnVjdCBpbm9kZSAqLHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IG5hbWVpZGF0YSAqKTsKK3N0YXRpYyBpbnQgYXV0b2ZzNF9kY2FjaGVfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqLCB2b2lkICosIGZpbGxkaXJfdCk7CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXV0b2ZzNF9yb290X29wZXJhdGlvbnMgPSB7CisJLm9wZW4JCT0gZGNhY2hlX2Rpcl9vcGVuLAorCS5yZWxlYXNlCT0gZGNhY2hlX2Rpcl9jbG9zZSwKKwkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAorCS5yZWFkZGlyCT0gYXV0b2ZzNF9yb290X3JlYWRkaXIsCisJLmlvY3RsCQk9IGF1dG9mczRfcm9vdF9pb2N0bCwKK307CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgYXV0b2ZzNF9kaXJfb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSBhdXRvZnM0X2Rpcl9vcGVuLAorCS5yZWxlYXNlCT0gYXV0b2ZzNF9kaXJfY2xvc2UsCisJLnJlYWQJCT0gZ2VuZXJpY19yZWFkX2RpciwKKwkucmVhZGRpcgk9IGF1dG9mczRfZGlyX3JlYWRkaXIsCit9OworCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBhdXRvZnM0X3Jvb3RfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkubG9va3VwCQk9IGF1dG9mczRfbG9va3VwLAorCS51bmxpbmsJCT0gYXV0b2ZzNF9kaXJfdW5saW5rLAorCS5zeW1saW5rCT0gYXV0b2ZzNF9kaXJfc3ltbGluaywKKwkubWtkaXIJCT0gYXV0b2ZzNF9kaXJfbWtkaXIsCisJLnJtZGlyCQk9IGF1dG9mczRfZGlyX3JtZGlyLAorfTsKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgYXV0b2ZzNF9kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkubG9va3VwCQk9IGF1dG9mczRfbG9va3VwLAorCS51bmxpbmsJCT0gYXV0b2ZzNF9kaXJfdW5saW5rLAorCS5zeW1saW5rCT0gYXV0b2ZzNF9kaXJfc3ltbGluaywKKwkubWtkaXIJCT0gYXV0b2ZzNF9kaXJfbWtkaXIsCisJLnJtZGlyCQk9IGF1dG9mczRfZGlyX3JtZGlyLAorfTsKKworc3RhdGljIGludCBhdXRvZnM0X3Jvb3RfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZGlyZW50LAorCQkJCWZpbGxkaXJfdCBmaWxsZGlyKQoreworCXN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpID0gYXV0b2ZzNF9zYmkoZmlsZS0+Zl9kZW50cnktPmRfc2IpOworCWludCBvel9tb2RlID0gYXV0b2ZzNF9vel9tb2RlKHNiaSk7CisKKwlEUFJJTlRLKCJjYWxsZWQsIGZpbHAtPmZfcG9zID0gJWxsZCIsIGZpbGUtPmZfcG9zKTsKKworCS8qCisJICogRG9uJ3Qgc2V0IHJlZ2hvc3QgZmxhZyBpZjoKKwkgKiAxKSBmX3BvcyBpcyBsYXJnZXIgdGhhbiB6ZXJvIC0tIHdlJ3ZlIGFscmVhZHkgYmVlbiBoZXJlLgorCSAqIDIpIHdlIGhhdmVuJ3QgZXZlbiBlbmFibGVkIHJlZ2hvc3RpbmcgaW4gdGhlIDFzdCBwbGFjZS4KKwkgKiAzKSB0aGlzIGlzIHRoZSBkYWVtb24gZG9pbmcgYSByZWFkZGlyCisJICovCisJaWYgKG96X21vZGUgJiYgZmlsZS0+Zl9wb3MgPT0gMCAmJiBzYmktPnJlZ2hvc3RfZW5hYmxlZCkKKwkJc2JpLT5uZWVkc19yZWdob3N0ID0gMTsKKworCURQUklOVEsoIm5lZWRzX3JlZ2hvc3QgPSAlZCIsIHNiaS0+bmVlZHNfcmVnaG9zdCk7CisKKwlyZXR1cm4gYXV0b2ZzNF9kY2FjaGVfcmVhZGRpcihmaWxlLCBkaXJlbnQsIGZpbGxkaXIpOworfQorCisvKiBVcGRhdGUgdXNhZ2UgZnJvbSBoZXJlIHRvIHRvcCBvZiB0cmVlLCBzbyB0aGF0IHNjYW4gb2YKKyAgIHRvcC1sZXZlbCBkaXJlY3RvcmllcyB3aWxsIGdpdmUgYSB1c2VmdWwgcmVzdWx0ICovCitzdGF0aWMgdm9pZCBhdXRvZnM0X3VwZGF0ZV91c2FnZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGRlbnRyeSAqdG9wID0gZGVudHJ5LT5kX3NiLT5zX3Jvb3Q7CisKKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwlmb3IoOyBkZW50cnkgIT0gdG9wOyBkZW50cnkgPSBkZW50cnktPmRfcGFyZW50KSB7CisJCXN0cnVjdCBhdXRvZnNfaW5mbyAqaW5vID0gYXV0b2ZzNF9kZW50cnlfaW5vKGRlbnRyeSk7CisKKwkJaWYgKGlubykgeworCQkJdXBkYXRlX2F0aW1lKGRlbnRyeS0+ZF9pbm9kZSk7CisJCQlpbm8tPmxhc3RfdXNlZCA9IGppZmZpZXM7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKK30KKworLyoKKyAqIEZyb20gMi40IGtlcm5lbCByZWFkZGlyLmMKKyAqLworc3RhdGljIGludCBhdXRvZnM0X2RjYWNoZV9yZWFkZGlyKHN0cnVjdCBmaWxlICogZmlscCwgdm9pZCAqIGRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJaW50IGk7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlscC0+Zl9kZW50cnk7CisKKwlpID0gZmlscC0+Zl9wb3M7CisJc3dpdGNoIChpKSB7CisJCWNhc2UgMDoKKwkJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4iLCAxLCBpLCBkZW50cnktPmRfaW5vZGUtPmlfaW5vLCBEVF9ESVIpIDwgMCkKKwkJCQlicmVhazsKKwkJCWkrKzsKKwkJCWZpbHAtPmZfcG9zKys7CisJCQkvKiBmYWxsdGhyb3VnaCAqLworCQljYXNlIDE6CisJCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuLiIsIDIsIGksIGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGUtPmlfaW5vLCBEVF9ESVIpIDwgMCkKKwkJCQlicmVhazsKKwkJCWkrKzsKKwkJCWZpbHAtPmZfcG9zKys7CisJCQkvKiBmYWxsdGhyb3VnaCAqLworCQlkZWZhdWx0OiB7CisJCQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCQkJaW50IGogPSBpLTI7CisKKwkJCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCQkJbGlzdCA9IGRlbnRyeS0+ZF9zdWJkaXJzLm5leHQ7CisKKwkJCWZvciAoOzspIHsKKwkJCQlpZiAobGlzdCA9PSAmZGVudHJ5LT5kX3N1YmRpcnMpIHsKKwkJCQkJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJCWlmICghaikKKwkJCQkJYnJlYWs7CisJCQkJai0tOworCQkJCWxpc3QgPSBsaXN0LT5uZXh0OworCQkJfQorCisJCQl3aGlsZSgxKSB7CisJCQkJc3RydWN0IGRlbnRyeSAqZGUgPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBkZW50cnksIGRfY2hpbGQpOworCisJCQkJaWYgKCFkX3VuaGFzaGVkKGRlKSAmJiBkZS0+ZF9pbm9kZSkgeworCQkJCQlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCQkJCQlpZiAoZmlsbGRpcihkaXJlbnQsIGRlLT5kX25hbWUubmFtZSwgZGUtPmRfbmFtZS5sZW4sIGZpbHAtPmZfcG9zLCBkZS0+ZF9pbm9kZS0+aV9pbm8sIERUX1VOS05PV04pIDwgMCkKKwkJCQkJCWJyZWFrOworCQkJCQlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwkJCQl9CisJCQkJZmlscC0+Zl9wb3MrKzsKKwkJCQlsaXN0ID0gbGlzdC0+bmV4dDsKKwkJCQlpZiAobGlzdCAhPSAmZGVudHJ5LT5kX3N1YmRpcnMpCisJCQkJCWNvbnRpbnVlOworCQkJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXV0b2ZzNF9kaXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IGZpbGUtPmZfdmZzbW50OworCXN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpID0gYXV0b2ZzNF9zYmkoZGVudHJ5LT5kX3NiKTsKKwlpbnQgc3RhdHVzOworCisJRFBSSU5USygiZmlsZT0lcCBkZW50cnk9JXAgJS4qcyIsCisJCWZpbGUsIGRlbnRyeSwgZGVudHJ5LT5kX25hbWUubGVuLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCWlmIChhdXRvZnM0X296X21vZGUoc2JpKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoYXV0b2ZzNF9pc3BlbmRpbmcoZGVudHJ5KSkgeworCQlEUFJJTlRLKCJkZW50cnkgYnVzeSIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmICghZF9tb3VudHBvaW50KGRlbnRyeSkgJiYgZGVudHJ5LT5kX29wICYmIGRlbnRyeS0+ZF9vcC0+ZF9yZXZhbGlkYXRlKSB7CisJCXN0cnVjdCBuYW1laWRhdGEgbmQ7CisJCWludCBlbXB0eTsKKworCQkvKiBJbiBjYXNlIHRoZXJlIGFyZSBzdGFsZSBkaXJlY3RvcnkgZGVudHJ5cyBmcm9tIGEgZmFpbGVkIG1vdW50ICovCisJCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCQllbXB0eSA9IGxpc3RfZW1wdHkoJmRlbnRyeS0+ZF9zdWJkaXJzKTsKKwkJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKworCQlpZiAoIWVtcHR5KQorCQkJZF9pbnZhbGlkYXRlKGRlbnRyeSk7CisKKwkJbmQuZmxhZ3MgPSBMT09LVVBfRElSRUNUT1JZOworCQlzdGF0dXMgPSAoZGVudHJ5LT5kX29wLT5kX3JldmFsaWRhdGUpKGRlbnRyeSwgJm5kKTsKKworCQlpZiAoIXN0YXR1cykKKwkJCXJldHVybiAtRU5PRU5UOworCX0KKworCWlmIChkX21vdW50cG9pbnQoZGVudHJ5KSkgeworCQlzdHJ1Y3QgZmlsZSAqZnAgPSBOVUxMOworCQlzdHJ1Y3QgdmZzbW91bnQgKmZwX21udCA9IG1udGdldChtbnQpOworCQlzdHJ1Y3QgZGVudHJ5ICpmcF9kZW50cnkgPSBkZ2V0KGRlbnRyeSk7CisKKwkJd2hpbGUgKGZvbGxvd19kb3duKCZmcF9tbnQsICZmcF9kZW50cnkpICYmIGRfbW91bnRwb2ludChmcF9kZW50cnkpKTsKKworCQlmcCA9IGRlbnRyeV9vcGVuKGZwX2RlbnRyeSwgZnBfbW50LCBmaWxlLT5mX2ZsYWdzKTsKKwkJc3RhdHVzID0gUFRSX0VSUihmcCk7CisJCWlmIChJU19FUlIoZnApKSB7CisJCQlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCQkJcmV0dXJuIHN0YXR1czsKKwkJfQorCQlmaWxlLT5wcml2YXRlX2RhdGEgPSBmcDsKKwl9CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXV0b2ZzNF9kaXJfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmkgPSBhdXRvZnM0X3NiaShkZW50cnktPmRfc2IpOworCisJRFBSSU5USygiZmlsZT0lcCBkZW50cnk9JXAgJS4qcyIsCisJCWZpbGUsIGRlbnRyeSwgZGVudHJ5LT5kX25hbWUubGVuLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCWlmIChhdXRvZnM0X296X21vZGUoc2JpKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoYXV0b2ZzNF9pc3BlbmRpbmcoZGVudHJ5KSkgeworCQlEUFJJTlRLKCJkZW50cnkgYnVzeSIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmIChkX21vdW50cG9pbnQoZGVudHJ5KSkgeworCQlzdHJ1Y3QgZmlsZSAqZnAgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwkJaWYgKCFmcCkKKwkJCXJldHVybiAtRU5PRU5UOworCisJCWZpbHBfY2xvc2UoZnAsIGN1cnJlbnQtPmZpbGVzKTsKKwkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwl9CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXV0b2ZzNF9kaXJfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSA9IGF1dG9mczRfc2JpKGRlbnRyeS0+ZF9zYik7CisJaW50IHN0YXR1czsKKworCURQUklOVEsoImZpbGU9JXAgZGVudHJ5PSVwICUuKnMiLAorCQlmaWxlLCBkZW50cnksIGRlbnRyeS0+ZF9uYW1lLmxlbiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwlpZiAoYXV0b2ZzNF9vel9tb2RlKHNiaSkpCisJCWdvdG8gb3V0OworCisJaWYgKGF1dG9mczRfaXNwZW5kaW5nKGRlbnRyeSkpIHsKKwkJRFBSSU5USygiZGVudHJ5IGJ1c3kiKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAoZF9tb3VudHBvaW50KGRlbnRyeSkpIHsKKwkJc3RydWN0IGZpbGUgKmZwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJCWlmICghZnApCisJCQlyZXR1cm4gLUVOT0VOVDsKKworCQlpZiAoIWZwLT5mX29wIHx8ICFmcC0+Zl9vcC0+cmVhZGRpcikKKwkJCWdvdG8gb3V0OworCisJCXN0YXR1cyA9IHZmc19yZWFkZGlyKGZwLCBmaWxsZGlyLCBkaXJlbnQpOworCQlmaWxlLT5mX3BvcyA9IGZwLT5mX3BvczsKKwkJaWYgKHN0YXR1cykKKwkJCWF1dG9mczRfY29weV9hdGltZShmaWxlLCBmcCk7CisJCXJldHVybiBzdGF0dXM7CisJfQorb3V0OgorCXJldHVybiBhdXRvZnM0X2RjYWNoZV9yZWFkZGlyKGZpbGUsIGRpcmVudCwgZmlsbGRpcik7Cit9CisKK3N0YXRpYyBpbnQgdHJ5X3RvX2ZpbGxfZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgCisJCQkgICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJICAgICAgc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmksIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgYXV0b2ZzX2luZm8gKmRlX2luZm8gPSBhdXRvZnM0X2RlbnRyeV9pbm8oZGVudHJ5KTsKKwlpbnQgc3RhdHVzID0gMDsKKworCS8qIEJsb2NrIG9uIGFueSBwZW5kaW5nIGV4cGlyeSBoZXJlOyBpbnZhbGlkYXRlIHRoZSBkZW50cnkKKyAgICAgICAgICAgd2hlbiBleHBpcmF0aW9uIGlzIGRvbmUgdG8gdHJpZ2dlciBtb3VudCByZXF1ZXN0IHdpdGggYSBuZXcKKyAgICAgICAgICAgZGVudHJ5ICovCisJaWYgKGRlX2luZm8gJiYgKGRlX2luZm8tPmZsYWdzICYgQVVUT0ZTX0lORl9FWFBJUklORykpIHsKKwkJRFBSSU5USygid2FpdGluZyBmb3IgZXhwaXJlICVwIG5hbWU9JS4qcyIsCisJCQkgZGVudHJ5LCBkZW50cnktPmRfbmFtZS5sZW4sIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJCXN0YXR1cyA9IGF1dG9mczRfd2FpdChzYmksIGRlbnRyeSwgTkZZX05PTkUpOworCQkKKwkJRFBSSU5USygiZXhwaXJlIGRvbmUgc3RhdHVzPSVkIiwgc3RhdHVzKTsKKwkJCisJCXJldHVybiAwOworCX0KKworCURQUklOVEsoImRlbnRyeT0lcCAlLipzIGlubz0lcCIsCisJCSBkZW50cnksIGRlbnRyeS0+ZF9uYW1lLmxlbiwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX2lub2RlKTsKKworCS8qIFdhaXQgZm9yIGEgcGVuZGluZyBtb3VudCwgdHJpZ2dlcmluZyBvbmUgaWYgdGhlcmUgaXNuJ3Qgb25lIGFscmVhZHkgKi8KKwlpZiAoZGVudHJ5LT5kX2lub2RlID09IE5VTEwpIHsKKwkJRFBSSU5USygid2FpdGluZyBmb3IgbW91bnQgbmFtZT0lLipzIiwKKwkJCSBkZW50cnktPmRfbmFtZS5sZW4sIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJCXN0YXR1cyA9IGF1dG9mczRfd2FpdChzYmksIGRlbnRyeSwgTkZZX01PVU5UKTsKKwkJIAorCQlEUFJJTlRLKCJtb3VudCBkb25lIHN0YXR1cz0lZCIsIHN0YXR1cyk7CisKKwkJaWYgKHN0YXR1cyAmJiBkZW50cnktPmRfaW5vZGUpCisJCQlyZXR1cm4gMDsgLyogVHJ5IHRvIGdldCB0aGUga2VybmVsIHRvIGludmFsaWRhdGUgdGhpcyBkZW50cnkgKi8KKwkJCisJCS8qIFR1cm4gdGhpcyBpbnRvIGEgcmVhbCBuZWdhdGl2ZSBkZW50cnk/ICovCisJCWlmIChzdGF0dXMgPT0gLUVOT0VOVCkgeworCQkJZGVudHJ5LT5kX3RpbWUgPSBqaWZmaWVzICsgQVVUT0ZTX05FR0FUSVZFX1RJTUVPVVQ7CisJCQlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwkJCWRlbnRyeS0+ZF9mbGFncyAmPSB+RENBQ0hFX0FVVE9GU19QRU5ESU5HOworCQkJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwkJCXJldHVybiAxOworCQl9IGVsc2UgaWYgKHN0YXR1cykgeworCQkJLyogUmV0dXJuIGEgbmVnYXRpdmUgZGVudHJ5LCBidXQgbGVhdmUgaXQgInBlbmRpbmciICovCisJCQlyZXR1cm4gMTsKKwkJfQorCS8qIFRyaWdnZXIgbW91bnQgZm9yIHBhdGggY29tcG9uZW50IG9yIGZvbGxvdyBsaW5rICovCisJfSBlbHNlIGlmIChmbGFncyAmIChMT09LVVBfQ09OVElOVUUgfCBMT09LVVBfRElSRUNUT1JZKSB8fAorCQkJY3VycmVudC0+bGlua19jb3VudCkgeworCQlEUFJJTlRLKCJ3YWl0aW5nIGZvciBtb3VudCBuYW1lPSUuKnMiLAorCQkJZGVudHJ5LT5kX25hbWUubGVuLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCQlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwkJZGVudHJ5LT5kX2ZsYWdzIHw9IERDQUNIRV9BVVRPRlNfUEVORElORzsKKwkJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwkJc3RhdHVzID0gYXV0b2ZzNF93YWl0KHNiaSwgZGVudHJ5LCBORllfTU9VTlQpOworCisJCURQUklOVEsoIm1vdW50IGRvbmUgc3RhdHVzPSVkIiwgc3RhdHVzKTsKKworCQlpZiAoc3RhdHVzKSB7CisJCQlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwkJCWRlbnRyeS0+ZF9mbGFncyAmPSB+RENBQ0hFX0FVVE9GU19QRU5ESU5HOworCQkJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyogV2UgZG9uJ3QgdXBkYXRlIHRoZSB1c2FnZXMgZm9yIHRoZSBhdXRvZnMgZGFlbW9uIGl0c2VsZiwgdGhpcworCSAgIGlzIG5lY2Vzc2FyeSBmb3IgcmVjdXJzaXZlIGF1dG9mcyBtb3VudHMgKi8KKwlpZiAoIWF1dG9mczRfb3pfbW9kZShzYmkpKQorCQlhdXRvZnM0X3VwZGF0ZV91c2FnZShkZW50cnkpOworCisJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7CisJZGVudHJ5LT5kX2ZsYWdzICY9IH5EQ0FDSEVfQVVUT0ZTX1BFTkRJTkc7CisJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFJldmFsaWRhdGUgaXMgY2FsbGVkIG9uIGV2ZXJ5IGNhY2hlIGxvb2t1cC4gIFNvbWUgb2YgdGhvc2UKKyAqIGNhY2hlIGxvb2t1cHMgbWF5IGFjdHVhbGx5IGhhcHBlbiB3aGlsZSB0aGUgZGVudHJ5IGlzIG5vdAorICogeWV0IGNvbXBsZXRlbHkgZmlsbGVkIGluLCBhbmQgcmV2YWxpZGF0ZSBoYXMgdG8gZGVsYXkgc3VjaAorICogbG9va3Vwcy4uCisgKi8KK3N0YXRpYyBpbnQgYXV0b2ZzNF9yZXZhbGlkYXRlKHN0cnVjdCBkZW50cnkgKiBkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZSAqIGRpciA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CisJc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmkgPSBhdXRvZnM0X3NiaShkaXItPmlfc2IpOworCWludCBvel9tb2RlID0gYXV0b2ZzNF9vel9tb2RlKHNiaSk7CisJaW50IGZsYWdzID0gbmQgPyBuZC0+ZmxhZ3MgOiAwOworCWludCBzdGF0dXMgPSAxOworCisJLyogUGVuZGluZyBkZW50cnkgKi8KKwlpZiAoYXV0b2ZzNF9pc3BlbmRpbmcoZGVudHJ5KSkgeworCQlpZiAoIW96X21vZGUpCisJCQlzdGF0dXMgPSB0cnlfdG9fZmlsbF9kZW50cnkoZGVudHJ5LCBkaXItPmlfc2IsIHNiaSwgZmxhZ3MpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCS8qIE5lZ2F0aXZlIGRlbnRyeS4uIGludmFsaWRhdGUgaWYgIm9sZCIgKi8KKwlpZiAoZGVudHJ5LT5kX2lub2RlID09IE5VTEwpCisJCXJldHVybiAoZGVudHJ5LT5kX3RpbWUgLSBqaWZmaWVzIDw9IEFVVE9GU19ORUdBVElWRV9USU1FT1VUKTsKKworCS8qIENoZWNrIGZvciBhIG5vbi1tb3VudHBvaW50IGRpcmVjdG9yeSB3aXRoIG5vIGNvbnRlbnRzICovCisJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJaWYgKFNfSVNESVIoZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpICYmCisJICAgICFkX21vdW50cG9pbnQoZGVudHJ5KSAmJiAKKwkgICAgbGlzdF9lbXB0eSgmZGVudHJ5LT5kX3N1YmRpcnMpKSB7CisJCURQUklOVEsoImRlbnRyeT0lcCAlLipzLCBlbXB0eWRpciIsCisJCQkgZGVudHJ5LCBkZW50cnktPmRfbmFtZS5sZW4sIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCQlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCQlpZiAoIW96X21vZGUpCisJCQlzdGF0dXMgPSB0cnlfdG9fZmlsbF9kZW50cnkoZGVudHJ5LCBkaXItPmlfc2IsIHNiaSwgZmxhZ3MpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCisJLyogVXBkYXRlIHRoZSB1c2FnZSBsaXN0ICovCisJaWYgKCFvel9tb2RlKQorCQlhdXRvZnM0X3VwZGF0ZV91c2FnZShkZW50cnkpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGF1dG9mczRfZGVudHJ5X3JlbGVhc2Uoc3RydWN0IGRlbnRyeSAqZGUpCit7CisJc3RydWN0IGF1dG9mc19pbmZvICppbmY7CisKKwlEUFJJTlRLKCJyZWxlYXNpbmcgJXAiLCBkZSk7CisKKwlpbmYgPSBhdXRvZnM0X2RlbnRyeV9pbm8oZGUpOworCWRlLT5kX2ZzZGF0YSA9IE5VTEw7CisKKwlpZiAoaW5mKSB7CisJCWluZi0+ZGVudHJ5ID0gTlVMTDsKKwkJaW5mLT5pbm9kZSA9IE5VTEw7CisKKwkJYXV0b2ZzNF9mcmVlX2lubyhpbmYpOworCX0KK30KKworLyogRm9yIGRlbnRyaWVzIG9mIGRpcmVjdG9yaWVzIGluIHRoZSByb290IGRpciAqLworc3RhdGljIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBhdXRvZnM0X3Jvb3RfZGVudHJ5X29wZXJhdGlvbnMgPSB7CisJLmRfcmV2YWxpZGF0ZQk9IGF1dG9mczRfcmV2YWxpZGF0ZSwKKwkuZF9yZWxlYXNlCT0gYXV0b2ZzNF9kZW50cnlfcmVsZWFzZSwKK307CisKKy8qIEZvciBvdGhlciBkZW50cmllcyAqLworc3RhdGljIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBhdXRvZnM0X2RlbnRyeV9vcGVyYXRpb25zID0geworCS5kX3JldmFsaWRhdGUJPSBhdXRvZnM0X3JldmFsaWRhdGUsCisJLmRfcmVsZWFzZQk9IGF1dG9mczRfZGVudHJ5X3JlbGVhc2UsCit9OworCisvKiBMb29rdXBzIGluIHRoZSByb290IGRpcmVjdG9yeSAqLworc3RhdGljIHN0cnVjdCBkZW50cnkgKmF1dG9mczRfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpOworCWludCBvel9tb2RlOworCisJRFBSSU5USygibmFtZSA9ICUuKnMiLAorCQlkZW50cnktPmRfbmFtZS5sZW4sIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+IE5BTUVfTUFYKQorCQlyZXR1cm4gRVJSX1BUUigtRU5BTUVUT09MT05HKTsvKiBGaWxlIG5hbWUgdG9vIGxvbmcgdG8gZXhpc3QgKi8KKworCXNiaSA9IGF1dG9mczRfc2JpKGRpci0+aV9zYik7CisKKwlvel9tb2RlID0gYXV0b2ZzNF9vel9tb2RlKHNiaSk7CisJRFBSSU5USygicGlkID0gJXUsIHBncnAgPSAldSwgY2F0YXRvbmljID0gJWQsIG96X21vZGUgPSAlZCIsCisJCSBjdXJyZW50LT5waWQsIHByb2Nlc3NfZ3JvdXAoY3VycmVudCksIHNiaS0+Y2F0YXRvbmljLCBvel9tb2RlKTsKKworCS8qCisJICogTWFyayB0aGUgZGVudHJ5IGluY29tcGxldGUsIGJ1dCBhZGQgaXQuIFRoaXMgaXMgbmVlZGVkIHNvCisJICogdGhhdCB0aGUgVkZTIGxheWVyIGtub3dzIGFib3V0IHRoZSBkZW50cnksIGFuZCB3ZSBjYW4gY291bnQKKwkgKiBvbiBjYXRjaGluZyBhbnkgbG9va3VwcyB0aHJvdWdoIHRoZSByZXZhbGlkYXRlLgorCSAqCisJICogTGV0IGFsbCB0aGUgaGFyZCB3b3JrIGJlIGRvbmUgYnkgdGhlIHJldmFsaWRhdGUgZnVuY3Rpb24gdGhhdAorCSAqIG5lZWRzIHRvIGJlIGFibGUgdG8gZG8gdGhpcyBhbnl3YXkuLgorCSAqCisJICogV2UgbmVlZCB0byBkbyB0aGlzIGJlZm9yZSB3ZSByZWxlYXNlIHRoZSBkaXJlY3Rvcnkgc2VtYXBob3JlLgorCSAqLworCWRlbnRyeS0+ZF9vcCA9ICZhdXRvZnM0X3Jvb3RfZGVudHJ5X29wZXJhdGlvbnM7CisKKwlpZiAoIW96X21vZGUpIHsKKwkJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7CisJCWRlbnRyeS0+ZF9mbGFncyB8PSBEQ0FDSEVfQVVUT0ZTX1BFTkRJTkc7CisJCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CisJfQorCWRlbnRyeS0+ZF9mc2RhdGEgPSBOVUxMOworCWRfYWRkKGRlbnRyeSwgTlVMTCk7CisKKwlpZiAoZGVudHJ5LT5kX29wICYmIGRlbnRyeS0+ZF9vcC0+ZF9yZXZhbGlkYXRlKSB7CisJCXVwKCZkaXItPmlfc2VtKTsKKwkJKGRlbnRyeS0+ZF9vcC0+ZF9yZXZhbGlkYXRlKShkZW50cnksIG5kKTsKKwkJZG93bigmZGlyLT5pX3NlbSk7CisJfQorCisJLyoKKwkgKiBJZiB3ZSBhcmUgc3RpbGwgcGVuZGluZywgY2hlY2sgaWYgd2UgaGFkIHRvIGhhbmRsZQorCSAqIGEgc2lnbmFsLiBJZiBzbyB3ZSBjYW4gZm9yY2UgYSByZXN0YXJ0Li4KKwkgKi8KKwlpZiAoZGVudHJ5LT5kX2ZsYWdzICYgRENBQ0hFX0FVVE9GU19QRU5ESU5HKSB7CisJCS8qIFNlZSBpZiB3ZSB3ZXJlIGludGVycnVwdGVkICovCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJc2lnc2V0X3QgKnNpZ3NldCA9ICZjdXJyZW50LT5wZW5kaW5nLnNpZ25hbDsKKwkJCWlmIChzaWdpc21lbWJlciAoc2lnc2V0LCBTSUdLSUxMKSB8fAorCQkJICAgIHNpZ2lzbWVtYmVyIChzaWdzZXQsIFNJR1FVSVQpIHx8CisJCQkgICAgc2lnaXNtZW1iZXIgKHNpZ3NldCwgU0lHSU5UKSkgeworCQkJICAgIHJldHVybiBFUlJfUFRSKC1FUkVTVEFSVE5PSU5UUik7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIElmIHRoaXMgZGVudHJ5IGlzIHVuaGFzaGVkLCB0aGVuIHdlIHNob3VsZG4ndCBob25vdXIgdGhpcworCSAqIGxvb2t1cCBldmVuIGlmIHRoZSBkZW50cnkgaXMgcG9zaXRpdmUuICBSZXR1cm5pbmcgRU5PRU5UIGhlcmUKKwkgKiBkb2Vzbid0IGRvIHRoZSByaWdodCB0aGluZyBmb3IgYWxsIHN5c3RlbSBjYWxscywgYnV0IGl0IHNob3VsZAorCSAqIGJlIE9LIGZvciB0aGUgb3BlcmF0aW9ucyB3ZSBwZXJtaXQgZnJvbSBhbiBhdXRvZnMuCisJICovCisJaWYgKCBkZW50cnktPmRfaW5vZGUgJiYgZF91bmhhc2hlZChkZW50cnkpICkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBhdXRvZnM0X2Rpcl9zeW1saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCAKKwkJCSAgICAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkgICAgICAgY29uc3QgY2hhciAqc3ltbmFtZSkKK3sKKwlzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSA9IGF1dG9mczRfc2JpKGRpci0+aV9zYik7CisJc3RydWN0IGF1dG9mc19pbmZvICppbm8gPSBhdXRvZnM0X2RlbnRyeV9pbm8oZGVudHJ5KTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWNoYXIgKmNwOworCisJRFBSSU5USygiJXMgPC0gJS4qcyIsIHN5bW5hbWUsCisJCWRlbnRyeS0+ZF9uYW1lLmxlbiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwlpZiAoIWF1dG9mczRfb3pfbW9kZShzYmkpKQorCQlyZXR1cm4gLUVBQ0NFUzsKKworCWlubyA9IGF1dG9mczRfaW5pdF9pbm8oaW5vLCBzYmksIFNfSUZMTksgfCAwNTU1KTsKKwlpZiAoaW5vID09IE5VTEwpCisJCXJldHVybiAtRU5PU1BDOworCisJaW5vLT5zaXplID0gc3RybGVuKHN5bW5hbWUpOworCWluby0+dS5zeW1saW5rID0gY3AgPSBrbWFsbG9jKGluby0+c2l6ZSArIDEsIEdGUF9LRVJORUwpOworCisJaWYgKGNwID09IE5VTEwpIHsKKwkJa2ZyZWUoaW5vKTsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCisJc3RyY3B5KGNwLCBzeW1uYW1lKTsKKworCWlub2RlID0gYXV0b2ZzNF9nZXRfaW5vZGUoZGlyLT5pX3NiLCBpbm8pOworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisKKwlpZiAoZGlyID09IGRpci0+aV9zYi0+c19yb290LT5kX2lub2RlKQorCQlkZW50cnktPmRfb3AgPSAmYXV0b2ZzNF9yb290X2RlbnRyeV9vcGVyYXRpb25zOworCWVsc2UKKwkJZGVudHJ5LT5kX29wID0gJmF1dG9mczRfZGVudHJ5X29wZXJhdGlvbnM7CisKKwlkZW50cnktPmRfZnNkYXRhID0gaW5vOworCWluby0+ZGVudHJ5ID0gZGdldChkZW50cnkpOworCWluby0+aW5vZGUgPSBpbm9kZTsKKworCWRpci0+aV9tdGltZSA9IENVUlJFTlRfVElNRTsKKworCXJldHVybiAwOworfQorCisvKgorICogTk9URSEKKyAqCisgKiBOb3JtYWwgZmlsZXN5c3RlbXMgd291bGQgZG8gYSAiZF9kZWxldGUoKSIgdG8gdGVsbCB0aGUgVkZTIGRjYWNoZQorICogdGhhdCB0aGUgZmlsZSBubyBsb25nZXIgZXhpc3RzLiBIb3dldmVyLCBkb2luZyB0aGF0IG1lYW5zIHRoYXQgdGhlCisgKiBWRlMgbGF5ZXIgY2FuIHR1cm4gdGhlIGRlbnRyeSBpbnRvIGEgbmVnYXRpdmUgZGVudHJ5LiAgV2UgZG9uJ3Qgd2FudAorICogdGhpcywgYmVjYXVzZSBzaW5jZSB0aGUgdW5saW5rIGlzIHByb2JhYmx5IHRoZSByZXN1bHQgb2YgYW4gZXhwaXJlLgorICogV2Ugc2ltcGx5IGRfZHJvcCBpdCwgd2hpY2ggYWxsb3dzIHRoZSBkZW50cnkgbG9va3VwIHRvIHJlbW91bnQgaXQKKyAqIGlmIG5lY2Vzc2FyeS4KKyAqCisgKiBJZiBhIHByb2Nlc3MgaXMgYmxvY2tlZCBvbiB0aGUgZGVudHJ5IHdhaXRpbmcgZm9yIHRoZSBleHBpcmUgdG8gZmluaXNoLAorICogaXQgd2lsbCBpbnZhbGlkYXRlIHRoZSBkZW50cnkgYW5kIHRyeSB0byBtb3VudCB3aXRoIGEgbmV3IG9uZS4KKyAqCisgKiBBbHNvIHNlZSBhdXRvZnM0X2Rpcl9ybWRpcigpLi4KKyAqLworc3RhdGljIGludCBhdXRvZnM0X2Rpcl91bmxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSA9IGF1dG9mczRfc2JpKGRpci0+aV9zYik7CisJc3RydWN0IGF1dG9mc19pbmZvICppbm8gPSBhdXRvZnM0X2RlbnRyeV9pbm8oZGVudHJ5KTsKKwkKKwkvKiBUaGlzIGFsbG93cyByb290IHRvIHJlbW92ZSBzeW1saW5rcyAqLworCWlmICggIWF1dG9mczRfb3pfbW9kZShzYmkpICYmICFjYXBhYmxlKENBUF9TWVNfQURNSU4pICkKKwkJcmV0dXJuIC1FQUNDRVM7CisKKwlkcHV0KGluby0+ZGVudHJ5KTsKKworCWRlbnRyeS0+ZF9pbm9kZS0+aV9zaXplID0gMDsKKwlkZW50cnktPmRfaW5vZGUtPmlfbmxpbmsgPSAwOworCisJZGlyLT5pX210aW1lID0gQ1VSUkVOVF9USU1FOworCisJZF9kcm9wKGRlbnRyeSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdXRvZnM0X2Rpcl9ybWRpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpID0gYXV0b2ZzNF9zYmkoZGlyLT5pX3NiKTsKKwlzdHJ1Y3QgYXV0b2ZzX2luZm8gKmlubyA9IGF1dG9mczRfZGVudHJ5X2lubyhkZW50cnkpOworCQorCWlmICghYXV0b2ZzNF9vel9tb2RlKHNiaSkpCisJCXJldHVybiAtRUFDQ0VTOworCisJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJaWYgKCFsaXN0X2VtcHR5KCZkZW50cnktPmRfc3ViZGlycykpIHsKKwkJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwkJcmV0dXJuIC1FTk9URU1QVFk7CisJfQorCXNwaW5fbG9jaygmZGVudHJ5LT5kX2xvY2spOworCV9fZF9kcm9wKGRlbnRyeSk7CisJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCisJZHB1dChpbm8tPmRlbnRyeSk7CisKKwlkZW50cnktPmRfaW5vZGUtPmlfc2l6ZSA9IDA7CisJZGVudHJ5LT5kX2lub2RlLT5pX25saW5rID0gMDsKKworCWlmIChkaXItPmlfbmxpbmspCisJCWRpci0+aV9ubGluay0tOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXV0b2ZzNF9kaXJfbWtkaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpCit7CisJc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmkgPSBhdXRvZnM0X3NiaShkaXItPmlfc2IpOworCXN0cnVjdCBhdXRvZnNfaW5mbyAqaW5vID0gYXV0b2ZzNF9kZW50cnlfaW5vKGRlbnRyeSk7CisJc3RydWN0IGlub2RlICppbm9kZTsKKworCWlmICggIWF1dG9mczRfb3pfbW9kZShzYmkpICkKKwkJcmV0dXJuIC1FQUNDRVM7CisKKwlEUFJJTlRLKCJkZW50cnkgJXAsIGNyZWF0aW5nICUuKnMiLAorCQlkZW50cnksIGRlbnRyeS0+ZF9uYW1lLmxlbiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwlpbm8gPSBhdXRvZnM0X2luaXRfaW5vKGlubywgc2JpLCBTX0lGRElSIHwgMDU1NSk7CisJaWYgKGlubyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCWlub2RlID0gYXV0b2ZzNF9nZXRfaW5vZGUoZGlyLT5pX3NiLCBpbm8pOworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisKKwlpZiAoZGlyID09IGRpci0+aV9zYi0+c19yb290LT5kX2lub2RlKQorCQlkZW50cnktPmRfb3AgPSAmYXV0b2ZzNF9yb290X2RlbnRyeV9vcGVyYXRpb25zOworCWVsc2UKKwkJZGVudHJ5LT5kX29wID0gJmF1dG9mczRfZGVudHJ5X29wZXJhdGlvbnM7CisKKwlkZW50cnktPmRfZnNkYXRhID0gaW5vOworCWluby0+ZGVudHJ5ID0gZGdldChkZW50cnkpOworCWluby0+aW5vZGUgPSBpbm9kZTsKKwlkaXItPmlfbmxpbmsrKzsKKwlkaXItPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUU7CisKKwlyZXR1cm4gMDsKK30KKworLyogR2V0L3NldCB0aW1lb3V0IGlvY3RsKCkgb3BlcmF0aW9uICovCitzdGF0aWMgaW5saW5lIGludCBhdXRvZnM0X2dldF9zZXRfdGltZW91dChzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSwKKwkJCQkJIHVuc2lnbmVkIGxvbmcgX191c2VyICpwKQoreworCWludCBydjsKKwl1bnNpZ25lZCBsb25nIG50aW1lb3V0OworCisJaWYgKCAocnYgPSBnZXRfdXNlcihudGltZW91dCwgcCkpIHx8CisJICAgICAocnYgPSBwdXRfdXNlcihzYmktPmV4cF90aW1lb3V0L0haLCBwKSkgKQorCQlyZXR1cm4gcnY7CisKKwlpZiAoIG50aW1lb3V0ID4gVUxPTkdfTUFYL0haICkKKwkJc2JpLT5leHBfdGltZW91dCA9IDA7CisJZWxzZQorCQlzYmktPmV4cF90aW1lb3V0ID0gbnRpbWVvdXQgKiBIWjsKKworCXJldHVybiAwOworfQorCisvKiBSZXR1cm4gcHJvdG9jb2wgdmVyc2lvbiAqLworc3RhdGljIGlubGluZSBpbnQgYXV0b2ZzNF9nZXRfcHJvdG92ZXIoc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmksIGludCBfX3VzZXIgKnApCit7CisJcmV0dXJuIHB1dF91c2VyKHNiaS0+dmVyc2lvbiwgcCk7Cit9CisKKy8qIFJldHVybiBwcm90b2NvbCBzdWIgdmVyc2lvbiAqLworc3RhdGljIGlubGluZSBpbnQgYXV0b2ZzNF9nZXRfcHJvdG9zdWJ2ZXIoc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmksIGludCBfX3VzZXIgKnApCit7CisJcmV0dXJuIHB1dF91c2VyKHNiaS0+c3ViX3ZlcnNpb24sIHApOworfQorCisvKgorICogVGVsbHMgdGhlIGRhZW1vbiB3aGV0aGVyIHdlIG5lZWQgdG8gcmVnaG9zdCBvciBub3QuIEFsc28sIGNsZWFycworICogdGhlIHJlZ2hvc3RfbmVlZGVkIGZsYWcuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGF1dG9mczRfYXNrX3JlZ2hvc3Qoc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmksIGludCBfX3VzZXIgKnApCit7CisJaW50IHN0YXR1czsKKworCURQUklOVEsoInJldHVybmluZyAlZCIsIHNiaS0+bmVlZHNfcmVnaG9zdCk7CisKKwlzdGF0dXMgPSBwdXRfdXNlcihzYmktPm5lZWRzX3JlZ2hvc3QsIHApOworCWlmICggc3RhdHVzICkKKwkJcmV0dXJuIHN0YXR1czsKKworCXNiaS0+bmVlZHNfcmVnaG9zdCA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBFbmFibGUgLyBEaXNhYmxlIHJlZ2hvc3RpbmcgaW9jdGwoKSBvcGVyYXRpb24KKyAqLworc3RhdGljIGlubGluZSBpbnQgYXV0b2ZzNF90b2dnbGVfcmVnaG9zdChzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSwgaW50IF9fdXNlciAqcCkKK3sKKwlpbnQgc3RhdHVzOworCWludCB2YWw7CisKKwlzdGF0dXMgPSBnZXRfdXNlcih2YWwsIHApOworCisJRFBSSU5USygicmVnaG9zdCA9ICVkIiwgdmFsKTsKKworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisKKwkvKiB0dXJuIG9uL29mZiByZWdob3N0aW5nLCB3aXRoIHRoZSB2YWwgKi8KKwlzYmktPnJlZ2hvc3RfZW5hYmxlZCA9IHZhbDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyogVGVsbHMgdGhlIGRhZW1vbiB3aGV0aGVyIGl0IGNhbiB1bW91bnQgdGhlIGF1dG9mcyBtb3VudC4KKyovCitzdGF0aWMgaW5saW5lIGludCBhdXRvZnM0X2Fza191bW91bnQoc3RydWN0IHZmc21vdW50ICptbnQsIGludCBfX3VzZXIgKnApCit7CisJaW50IHN0YXR1cyA9IDA7CisKKwlpZiAobWF5X3Vtb3VudChtbnQpID09IDApCisJCXN0YXR1cyA9IDE7CisKKwlEUFJJTlRLKCJyZXR1cm5pbmcgJWQiLCBzdGF0dXMpOworCisJc3RhdHVzID0gcHV0X3VzZXIoc3RhdHVzLCBwKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIElkZW50aWZ5IGF1dG9mczRfZGVudHJpZXMgLSB0aGlzIGlzIHNvIHdlIGNhbiB0ZWxsIGlmIHRoZXJlJ3MKKyAgIGFuIGV4dHJhIGRlbnRyeSByZWZjb3VudCBvciBub3QuICBXZSBvbmx5IGhvbGQgYSByZWZjb3VudCBvbiB0aGUKKyAgIGRlbnRyeSBpZiBpdHMgbm9uLW5lZ2F0aXZlIChpZSwgZF9pbm9kZSAhPSBOVUxMKQorKi8KK2ludCBpc19hdXRvZnM0X2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJcmV0dXJuIGRlbnRyeSAmJiBkZW50cnktPmRfaW5vZGUgJiYKKwkJKGRlbnRyeS0+ZF9vcCA9PSAmYXV0b2ZzNF9yb290X2RlbnRyeV9vcGVyYXRpb25zIHx8CisJCSBkZW50cnktPmRfb3AgPT0gJmF1dG9mczRfZGVudHJ5X29wZXJhdGlvbnMpICYmCisJCWRlbnRyeS0+ZF9mc2RhdGEgIT0gTlVMTDsKK30KKworLyoKKyAqIGlvY3RsKCkncyBvbiB0aGUgcm9vdCBkaXJlY3RvcnkgaXMgdGhlIGNoaWVmIG1ldGhvZCBmb3IgdGhlIGRhZW1vbiB0bworICogZ2VuZXJhdGUga2VybmVsIHJlYWN0aW9ucworICovCitzdGF0aWMgaW50IGF1dG9mczRfcm9vdF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmkgPSBhdXRvZnM0X3NiaShpbm9kZS0+aV9zYik7CisJdm9pZCBfX3VzZXIgKnAgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwlEUFJJTlRLKCJjbWQgPSAweCUwOHgsIGFyZyA9IDB4JTA4bHgsIHNiaSA9ICVwLCBwZ3JwID0gJXUiLAorCQljbWQsYXJnLHNiaSxwcm9jZXNzX2dyb3VwKGN1cnJlbnQpKTsKKworCWlmICggX0lPQ19UWVBFKGNtZCkgIT0gX0lPQ19UWVBFKEFVVE9GU19JT0NfRklSU1QpIHx8CisJICAgICBfSU9DX05SKGNtZCkgLSBfSU9DX05SKEFVVE9GU19JT0NfRklSU1QpID49IEFVVE9GU19JT0NfQ09VTlQgKQorCQlyZXR1cm4gLUVOT1RUWTsKKwkKKwlpZiAoICFhdXRvZnM0X296X21vZGUoc2JpKSAmJiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSApCisJCXJldHVybiAtRVBFUk07CisJCisJc3dpdGNoKGNtZCkgeworCWNhc2UgQVVUT0ZTX0lPQ19SRUFEWToJLyogV2FpdCBxdWV1ZTogZ28gYWhlYWQgYW5kIHJldHJ5ICovCisJCXJldHVybiBhdXRvZnM0X3dhaXRfcmVsZWFzZShzYmksKGF1dG9mc193cXRfdClhcmcsMCk7CisJY2FzZSBBVVRPRlNfSU9DX0ZBSUw6CS8qIFdhaXQgcXVldWU6IGZhaWwgd2l0aCBFTk9FTlQgKi8KKwkJcmV0dXJuIGF1dG9mczRfd2FpdF9yZWxlYXNlKHNiaSwoYXV0b2ZzX3dxdF90KWFyZywtRU5PRU5UKTsKKwljYXNlIEFVVE9GU19JT0NfQ0FUQVRPTklDOiAvKiBFbnRlciBjYXRhdG9uaWMgbW9kZSAoZGFlbW9uIHNodXRkb3duKSAqLworCQlhdXRvZnM0X2NhdGF0b25pY19tb2RlKHNiaSk7CisJCXJldHVybiAwOworCWNhc2UgQVVUT0ZTX0lPQ19QUk9UT1ZFUjogLyogR2V0IHByb3RvY29sIHZlcnNpb24gKi8KKwkJcmV0dXJuIGF1dG9mczRfZ2V0X3Byb3RvdmVyKHNiaSwgcCk7CisJY2FzZSBBVVRPRlNfSU9DX1BST1RPU1VCVkVSOiAvKiBHZXQgcHJvdG9jb2wgc3ViIHZlcnNpb24gKi8KKwkJcmV0dXJuIGF1dG9mczRfZ2V0X3Byb3Rvc3VidmVyKHNiaSwgcCk7CisJY2FzZSBBVVRPRlNfSU9DX1NFVFRJTUVPVVQ6CisJCXJldHVybiBhdXRvZnM0X2dldF9zZXRfdGltZW91dChzYmksIHApOworCisJY2FzZSBBVVRPRlNfSU9DX1RPR0dMRVJFR0hPU1Q6CisJCXJldHVybiBhdXRvZnM0X3RvZ2dsZV9yZWdob3N0KHNiaSwgcCk7CisJY2FzZSBBVVRPRlNfSU9DX0FTS1JFR0hPU1Q6CisJCXJldHVybiBhdXRvZnM0X2Fza19yZWdob3N0KHNiaSwgcCk7CisKKwljYXNlIEFVVE9GU19JT0NfQVNLVU1PVU5UOgorCQlyZXR1cm4gYXV0b2ZzNF9hc2tfdW1vdW50KGZpbHAtPmZfdmZzbW50LCBwKTsKKworCS8qIHJldHVybiBhIHNpbmdsZSB0aGluZyB0byBleHBpcmUgKi8KKwljYXNlIEFVVE9GU19JT0NfRVhQSVJFOgorCQlyZXR1cm4gYXV0b2ZzNF9leHBpcmVfcnVuKGlub2RlLT5pX3NiLGZpbHAtPmZfdmZzbW50LHNiaSwgcCk7CisJLyogc2FtZSBhcyBhYm92ZSwgYnV0IGNhbiBzZW5kIG11bHRpcGxlIGV4cGlyZXMgdGhyb3VnaCBwaXBlICovCisJY2FzZSBBVVRPRlNfSU9DX0VYUElSRV9NVUxUSToKKwkJcmV0dXJuIGF1dG9mczRfZXhwaXJlX211bHRpKGlub2RlLT5pX3NiLGZpbHAtPmZfdmZzbW50LHNiaSwgcCk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1NZUzsKKwl9Cit9CmRpZmYgLS1naXQgYS9mcy9hdXRvZnM0L3N5bWxpbmsuYyBiL2ZzL2F1dG9mczQvc3ltbGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNjVhNjYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hdXRvZnM0L3N5bWxpbmsuYwpAQCAtMCwwICsxLDI1IEBACisvKiAtKi0gYyAtKi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiBsaW51eC9mcy9hdXRvZnMvc3ltbGluay5jCisgKgorICogIENvcHlyaWdodCAxOTk3LTE5OTggVHJhbnNtZXRhIENvcnBvcmF0aW9uIC0tIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBvciBhdCB5b3VyCisgKiBvcHRpb24sIGFueSBsYXRlciB2ZXJzaW9uLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlICJhdXRvZnNfaS5oIgorCitzdGF0aWMgaW50IGF1dG9mczRfZm9sbG93X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgYXV0b2ZzX2luZm8gKmlubyA9IGF1dG9mczRfZGVudHJ5X2lubyhkZW50cnkpOworCW5kX3NldF9saW5rKG5kLCAoY2hhciAqKWluby0+dS5zeW1saW5rKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgYXV0b2ZzNF9zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnJlYWRsaW5rCT0gZ2VuZXJpY19yZWFkbGluaywKKwkuZm9sbG93X2xpbmsJPSBhdXRvZnM0X2ZvbGxvd19saW5rCit9OwpkaWZmIC0tZ2l0IGEvZnMvYXV0b2ZzNC93YWl0cS5jIGIvZnMvYXV0b2ZzNC93YWl0cS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYjI0YTYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9hdXRvZnM0L3dhaXRxLmMKQEAgLTAsMCArMSwzMDMgQEAKKy8qIC0qLSBjIC0qLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqIGxpbnV4L2ZzL2F1dG9mcy93YWl0cS5jCisgKgorICogIENvcHlyaWdodCAxOTk3LTE5OTggVHJhbnNtZXRhIENvcnBvcmF0aW9uIC0tIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICBDb3B5cmlnaHQgMjAwMS0yMDAzIElhbiBLZW50IDxyYXZlbkB0aGVtYXcubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIG9yIGF0IHlvdXIKKyAqIG9wdGlvbiwgYW55IGxhdGVyIHZlcnNpb24sIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgImF1dG9mc19pLmgiCisKKy8qIFdlIG1ha2UgdGhpcyBhIHN0YXRpYyB2YXJpYWJsZSByYXRoZXIgdGhhbiBhIHBhcnQgb2YgdGhlIHN1cGVyYmxvY2s7IGl0CisgICBpcyBiZXR0ZXIgaWYgd2UgZG9uJ3QgcmVhc3NpZ24gbnVtYmVycyBlYXNpbHkgZXZlbiBhY3Jvc3MgZmlsZXN5c3RlbXMgKi8KK3N0YXRpYyBhdXRvZnNfd3F0X3QgYXV0b2ZzNF9uZXh0X3dhaXRfcXVldWUgPSAxOworCisvKiBUaGVzZSBhcmUgdGhlIHNpZ25hbHMgd2UgYWxsb3cgaW50ZXJydXB0aW5nIGEgcGVuZGluZyBtb3VudCAqLworI2RlZmluZSBTSFVURE9XTl9TSUdTCShzaWdtYXNrKFNJR0tJTEwpIHwgc2lnbWFzayhTSUdJTlQpIHwgc2lnbWFzayhTSUdRVUlUKSkKKwordm9pZCBhdXRvZnM0X2NhdGF0b25pY19tb2RlKHN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpKQoreworCXN0cnVjdCBhdXRvZnNfd2FpdF9xdWV1ZSAqd3EsICpud3E7CisKKwlEUFJJTlRLKCJlbnRlcmluZyBjYXRhdG9uaWMgbW9kZSIpOworCisJc2JpLT5jYXRhdG9uaWMgPSAxOworCXdxID0gc2JpLT5xdWV1ZXM7CisJc2JpLT5xdWV1ZXMgPSBOVUxMOwkvKiBFcmFzZSBhbGwgd2FpdCBxdWV1ZXMgKi8KKwl3aGlsZSAoIHdxICkgeworCQlud3EgPSB3cS0+bmV4dDsKKwkJd3EtPnN0YXR1cyA9IC1FTk9FTlQ7IC8qIE1hZ2ljIGlzIGdvbmUgLSByZXBvcnQgZmFpbHVyZSAqLworCQlrZnJlZSh3cS0+bmFtZSk7CisJCXdxLT5uYW1lID0gTlVMTDsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ3cS0+cXVldWUpOworCQl3cSA9IG53cTsKKwl9CisJaWYgKHNiaS0+cGlwZSkgeworCQlmcHV0KHNiaS0+cGlwZSk7CS8qIENsb3NlIHRoZSBwaXBlICovCisJCXNiaS0+cGlwZSA9IE5VTEw7CisJfQorCisJc2hyaW5rX2RjYWNoZV9zYihzYmktPnNiKTsKK30KKworc3RhdGljIGludCBhdXRvZnM0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCB2b2lkICphZGRyLCBpbnQgYnl0ZXMpCit7CisJdW5zaWduZWQgbG9uZyBzaWdwaXBlLCBmbGFnczsKKwltbV9zZWdtZW50X3QgZnM7CisJY29uc3QgY2hhciAqZGF0YSA9IChjb25zdCBjaGFyICopYWRkcjsKKwlzc2l6ZV90IHdyID0gMDsKKworCS8qKiBXQVJOSU5HOiB0aGlzIGlzIG5vdCBzYWZlIGZvciB3cml0aW5nIG1vcmUgdGhhbiBQSVBFX0JVRiBieXRlcyEgKiovCisKKwlzaWdwaXBlID0gc2lnaXNtZW1iZXIoJmN1cnJlbnQtPnBlbmRpbmcuc2lnbmFsLCBTSUdQSVBFKTsKKworCS8qIFNhdmUgcG9pbnRlciB0byB1c2VyIHNwYWNlIGFuZCBwb2ludCBiYWNrIHRvIGtlcm5lbCBzcGFjZSAqLworCWZzID0gZ2V0X2ZzKCk7CisJc2V0X2ZzKEtFUk5FTF9EUyk7CisKKwl3aGlsZSAoYnl0ZXMgJiYKKwkgICAgICAgKHdyID0gZmlsZS0+Zl9vcC0+d3JpdGUoZmlsZSxkYXRhLGJ5dGVzLCZmaWxlLT5mX3BvcykpID4gMCkgeworCQlkYXRhICs9IHdyOworCQlieXRlcyAtPSB3cjsKKwl9CisKKwlzZXRfZnMoZnMpOworCisJLyogS2VlcCB0aGUgY3VycmVudGx5IGV4ZWN1dGluZyBwcm9jZXNzIGZyb20gcmVjZWl2aW5nIGEKKwkgICBTSUdQSVBFIHVubGVzcyBpdCB3YXMgYWxyZWFkeSBzdXBwb3NlZCB0byBnZXQgb25lICovCisJaWYgKHdyID09IC1FUElQRSAmJiAhc2lncGlwZSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworCQlzaWdkZWxzZXQoJmN1cnJlbnQtPnBlbmRpbmcuc2lnbmFsLCBTSUdQSVBFKTsKKwkJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybiAoYnl0ZXMgPiAwKTsKK30KKwkKK3N0YXRpYyB2b2lkIGF1dG9mczRfbm90aWZ5X2RhZW1vbihzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSwKKwkJCQkgc3RydWN0IGF1dG9mc193YWl0X3F1ZXVlICp3cSwKKwkJCQkgaW50IHR5cGUpCit7CisJdW5pb24gYXV0b2ZzX3BhY2tldF91bmlvbiBwa3Q7CisJc2l6ZV90IHBrdHN6OworCisJRFBSSU5USygid2FpdCBpZCA9IDB4JTA4bHgsIG5hbWUgPSAlLipzLCB0eXBlPSVkIiwKKwkJd3EtPndhaXRfcXVldWVfdG9rZW4sIHdxLT5sZW4sIHdxLT5uYW1lLCB0eXBlKTsKKworCW1lbXNldCgmcGt0LDAsc2l6ZW9mIHBrdCk7IC8qIEZvciBzZWN1cml0eSByZWFzb25zICovCisKKwlwa3QuaGRyLnByb3RvX3ZlcnNpb24gPSBzYmktPnZlcnNpb247CisJcGt0Lmhkci50eXBlID0gdHlwZTsKKwlpZiAodHlwZSA9PSBhdXRvZnNfcHR5cGVfbWlzc2luZykgeworCQlzdHJ1Y3QgYXV0b2ZzX3BhY2tldF9taXNzaW5nICptcCA9ICZwa3QubWlzc2luZzsKKworCQlwa3RzeiA9IHNpemVvZigqbXApOworCisJCW1wLT53YWl0X3F1ZXVlX3Rva2VuID0gd3EtPndhaXRfcXVldWVfdG9rZW47CisJCW1wLT5sZW4gPSB3cS0+bGVuOworCQltZW1jcHkobXAtPm5hbWUsIHdxLT5uYW1lLCB3cS0+bGVuKTsKKwkJbXAtPm5hbWVbd3EtPmxlbl0gPSAnXDAnOworCX0gZWxzZSBpZiAodHlwZSA9PSBhdXRvZnNfcHR5cGVfZXhwaXJlX211bHRpKSB7CisJCXN0cnVjdCBhdXRvZnNfcGFja2V0X2V4cGlyZV9tdWx0aSAqZXAgPSAmcGt0LmV4cGlyZV9tdWx0aTsKKworCQlwa3RzeiA9IHNpemVvZigqZXApOworCisJCWVwLT53YWl0X3F1ZXVlX3Rva2VuID0gd3EtPndhaXRfcXVldWVfdG9rZW47CisJCWVwLT5sZW4gPSB3cS0+bGVuOworCQltZW1jcHkoZXAtPm5hbWUsIHdxLT5uYW1lLCB3cS0+bGVuKTsKKwkJZXAtPm5hbWVbd3EtPmxlbl0gPSAnXDAnOworCX0gZWxzZSB7CisJCXByaW50aygiYXV0b2ZzNF9ub3RpZnlfZGFlbW9uOiBiYWQgdHlwZSAlZCFcbiIsIHR5cGUpOworCQlyZXR1cm47CisJfQorCisJaWYgKGF1dG9mczRfd3JpdGUoc2JpLT5waXBlLCAmcGt0LCBwa3RzeikpCisJCWF1dG9mczRfY2F0YXRvbmljX21vZGUoc2JpKTsKK30KKworc3RhdGljIGludCBhdXRvZnM0X2dldHBhdGgoc3RydWN0IGF1dG9mc19zYl9pbmZvICpzYmksCisJCQkgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgKipuYW1lKQoreworCXN0cnVjdCBkZW50cnkgKnJvb3QgPSBzYmktPnNiLT5zX3Jvb3Q7CisJc3RydWN0IGRlbnRyeSAqdG1wOworCWNoYXIgKmJ1ZiA9ICpuYW1lOworCWNoYXIgKnA7CisJaW50IGxlbiA9IDA7CisKKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwlmb3IgKHRtcCA9IGRlbnRyeSA7IHRtcCAhPSByb290IDsgdG1wID0gdG1wLT5kX3BhcmVudCkKKwkJbGVuICs9IHRtcC0+ZF9uYW1lLmxlbiArIDE7CisKKwlpZiAoLS1sZW4gPiBOQU1FX01BWCkgeworCQlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCQlyZXR1cm4gMDsKKwl9CisKKwkqKGJ1ZiArIGxlbikgPSAnXDAnOworCXAgPSBidWYgKyBsZW4gLSBkZW50cnktPmRfbmFtZS5sZW47CisJc3RybmNweShwLCBkZW50cnktPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5sZW4pOworCisJZm9yICh0bXAgPSBkZW50cnktPmRfcGFyZW50OyB0bXAgIT0gcm9vdCA7IHRtcCA9IHRtcC0+ZF9wYXJlbnQpIHsKKwkJKigtLXApID0gJy8nOworCQlwIC09IHRtcC0+ZF9uYW1lLmxlbjsKKwkJc3RybmNweShwLCB0bXAtPmRfbmFtZS5uYW1lLCB0bXAtPmRfbmFtZS5sZW4pOworCX0KKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCisJcmV0dXJuIGxlbjsKK30KKworaW50IGF1dG9mczRfd2FpdChzdHJ1Y3QgYXV0b2ZzX3NiX2luZm8gKnNiaSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQllbnVtIGF1dG9mc19ub3RpZnkgbm90aWZ5KQoreworCXN0cnVjdCBhdXRvZnNfd2FpdF9xdWV1ZSAqd3E7CisJY2hhciAqbmFtZTsKKwlpbnQgbGVuLCBzdGF0dXM7CisKKwkvKiBJbiBjYXRhdG9uaWMgbW9kZSwgd2UgZG9uJ3Qgd2FpdCBmb3Igbm9ib2R5ICovCisJaWYgKCBzYmktPmNhdGF0b25pYyApCisJCXJldHVybiAtRU5PRU5UOworCQorCW5hbWUgPSBrbWFsbG9jKE5BTUVfTUFYICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuYW1lKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxlbiA9IGF1dG9mczRfZ2V0cGF0aChzYmksIGRlbnRyeSwgJm5hbWUpOworCWlmICghbGVuKSB7CisJCWtmcmVlKG5hbWUpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKCZzYmktPndxX3NlbSkpIHsKKwkJa2ZyZWUobmFtZSk7CisJCXJldHVybiAtRUlOVFI7CisJfQorCisJZm9yICh3cSA9IHNiaS0+cXVldWVzIDsgd3EgOyB3cSA9IHdxLT5uZXh0KSB7CisJCWlmICh3cS0+aGFzaCA9PSBkZW50cnktPmRfbmFtZS5oYXNoICYmCisJCSAgICB3cS0+bGVuID09IGxlbiAmJgorCQkgICAgd3EtPm5hbWUgJiYgIW1lbWNtcCh3cS0+bmFtZSwgbmFtZSwgbGVuKSkKKwkJCWJyZWFrOworCX0KKworCWlmICggIXdxICkgeworCQkvKiBDcmVhdGUgYSBuZXcgd2FpdCBxdWV1ZSAqLworCQl3cSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdXRvZnNfd2FpdF9xdWV1ZSksR0ZQX0tFUk5FTCk7CisJCWlmICggIXdxICkgeworCQkJa2ZyZWUobmFtZSk7CisJCQl1cCgmc2JpLT53cV9zZW0pOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQl3cS0+d2FpdF9xdWV1ZV90b2tlbiA9IGF1dG9mczRfbmV4dF93YWl0X3F1ZXVlOworCQlpZiAoKythdXRvZnM0X25leHRfd2FpdF9xdWV1ZSA9PSAwKQorCQkJYXV0b2ZzNF9uZXh0X3dhaXRfcXVldWUgPSAxOworCQl3cS0+bmV4dCA9IHNiaS0+cXVldWVzOworCQlzYmktPnF1ZXVlcyA9IHdxOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ3cS0+cXVldWUpOworCQl3cS0+aGFzaCA9IGRlbnRyeS0+ZF9uYW1lLmhhc2g7CisJCXdxLT5uYW1lID0gbmFtZTsKKwkJd3EtPmxlbiA9IGxlbjsKKwkJd3EtPnN0YXR1cyA9IC1FSU5UUjsgLyogU3RhdHVzIHJldHVybiBpZiBpbnRlcnJ1cHRlZCAqLworCQlhdG9taWNfc2V0KCZ3cS0+d2FpdF9jdHIsIDIpOworCQl1cCgmc2JpLT53cV9zZW0pOworCisJCURQUklOVEsoIm5ldyB3YWl0IGlkID0gMHglMDhseCwgbmFtZSA9ICUuKnMsIG5meT0lZCIsCisJCQkodW5zaWduZWQgbG9uZykgd3EtPndhaXRfcXVldWVfdG9rZW4sIHdxLT5sZW4sIHdxLT5uYW1lLCBub3RpZnkpOworCQkvKiBhdXRvZnM0X25vdGlmeV9kYWVtb24oKSBtYXkgYmxvY2sgKi8KKwkJaWYgKG5vdGlmeSAhPSBORllfTk9ORSkgeworCQkJYXV0b2ZzNF9ub3RpZnlfZGFlbW9uKHNiaSx3cSwgCisJCQkJCW5vdGlmeSA9PSBORllfTU9VTlQgPworCQkJCQkJICBhdXRvZnNfcHR5cGVfbWlzc2luZyA6CisJCQkJCQkgIGF1dG9mc19wdHlwZV9leHBpcmVfbXVsdGkpOworCQl9CisJfSBlbHNlIHsKKwkJYXRvbWljX2luYygmd3EtPndhaXRfY3RyKTsKKwkJdXAoJnNiaS0+d3Ffc2VtKTsKKwkJa2ZyZWUobmFtZSk7CisJCURQUklOVEsoImV4aXN0aW5nIHdhaXQgaWQgPSAweCUwOGx4LCBuYW1lID0gJS4qcywgbmZ5PSVkIiwKKwkJCSh1bnNpZ25lZCBsb25nKSB3cS0+d2FpdF9xdWV1ZV90b2tlbiwgd3EtPmxlbiwgd3EtPm5hbWUsIG5vdGlmeSk7CisJfQorCisJLyogd3EtPm5hbWUgaXMgTlVMTCBpZiBhbmQgb25seSBpZiB0aGUgbG9jayBpcyBhbHJlYWR5IHJlbGVhc2VkICovCisKKwlpZiAoIHNiaS0+Y2F0YXRvbmljICkgeworCQkvKiBXZSBtaWdodCBoYXZlIHNsZXB0LCBzbyBjaGVjayBhZ2FpbiBmb3IgY2F0YXRvbmljIG1vZGUgKi8KKwkJd3EtPnN0YXR1cyA9IC1FTk9FTlQ7CisJCWlmICggd3EtPm5hbWUgKSB7CisJCQlrZnJlZSh3cS0+bmFtZSk7CisJCQl3cS0+bmFtZSA9IE5VTEw7CisJCX0KKwl9CisKKwlpZiAoIHdxLT5uYW1lICkgeworCQkvKiBCbG9jayBhbGwgYnV0ICJzaHV0ZG93biIgc2lnbmFscyB3aGlsZSB3YWl0aW5nICovCisJCXNpZ3NldF90IG9sZHNldDsKKwkJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgaXJxZmxhZ3MpOworCQlvbGRzZXQgPSBjdXJyZW50LT5ibG9ja2VkOworCQlzaWdpbml0c2V0aW52KCZjdXJyZW50LT5ibG9ja2VkLCBTSFVURE9XTl9TSUdTICYgfm9sZHNldC5zaWdbMF0pOworCQlyZWNhbGNfc2lncGVuZGluZygpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBpcnFmbGFncyk7CisKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHdxLT5xdWV1ZSwgd3EtPm5hbWUgPT0gTlVMTCk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2ssIGlycWZsYWdzKTsKKwkJY3VycmVudC0+YmxvY2tlZCA9IG9sZHNldDsKKwkJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgaXJxZmxhZ3MpOworCX0gZWxzZSB7CisJCURQUklOVEsoInNraXBwZWQgc2xlZXBpbmciKTsKKwl9CisKKwlzdGF0dXMgPSB3cS0+c3RhdHVzOworCisJLyogQXJlIHdlIHRoZSBsYXN0IHByb2Nlc3MgdG8gbmVlZCBzdGF0dXM/ICovCisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJndxLT53YWl0X2N0cikpCisJCWtmcmVlKHdxKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKworaW50IGF1dG9mczRfd2FpdF9yZWxlYXNlKHN0cnVjdCBhdXRvZnNfc2JfaW5mbyAqc2JpLCBhdXRvZnNfd3F0X3Qgd2FpdF9xdWV1ZV90b2tlbiwgaW50IHN0YXR1cykKK3sKKwlzdHJ1Y3QgYXV0b2ZzX3dhaXRfcXVldWUgKndxLCAqKndxbDsKKworCWRvd24oJnNiaS0+d3Ffc2VtKTsKKwlmb3IgKCB3cWwgPSAmc2JpLT5xdWV1ZXMgOyAod3EgPSAqd3FsKSAhPSAwIDsgd3FsID0gJndxLT5uZXh0ICkgeworCQlpZiAoIHdxLT53YWl0X3F1ZXVlX3Rva2VuID09IHdhaXRfcXVldWVfdG9rZW4gKQorCQkJYnJlYWs7CisJfQorCisJaWYgKCAhd3EgKSB7CisJCXVwKCZzYmktPndxX3NlbSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCSp3cWwgPSB3cS0+bmV4dDsJLyogVW5saW5rIGZyb20gY2hhaW4gKi8KKwl1cCgmc2JpLT53cV9zZW0pOworCWtmcmVlKHdxLT5uYW1lKTsKKwl3cS0+bmFtZSA9IE5VTEw7CS8qIERvIG5vdCB3YWl0IG9uIHRoaXMgcXVldWUgKi8KKworCXdxLT5zdGF0dXMgPSBzdGF0dXM7CisKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmd3EtPndhaXRfY3RyKSkJLyogSXMgYW55b25lIHN0aWxsIHdhaXRpbmcgZm9yIHRoaXMgZ3V5PyAqLworCQlrZnJlZSh3cSk7CisJZWxzZQorCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJndxLT5xdWV1ZSk7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZnMvYmFkX2lub2RlLmMgYi9mcy9iYWRfaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzJhMzE5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvYmFkX2lub2RlLmMKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiAgbGludXgvZnMvYmFkX2lub2RlLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3LCBTdGVwaGVuIFR3ZWVkaWUKKyAqCisgKiAgUHJvdmlkZSBzdHViIGZ1bmN0aW9ucyBmb3IgdW5yZWFkYWJsZSBpbm9kZXMKKyAqCisgKiAgRmFiaWFuIEZyZWRlcmljayA6IEF1Z3VzdCAyMDAzIC0gQWxsIGZpbGUgb3BlcmF0aW9ucyBhc3NpZ25lZCB0byBFSU8KKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKworc3RhdGljIGludCByZXR1cm5fRUlPKHZvaWQpCit7CisJcmV0dXJuIC1FSU87Cit9CisKKyNkZWZpbmUgRUlPX0VSUk9SICgodm9pZCAqKSAocmV0dXJuX0VJTykpCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJhZF9maWxlX29wcyA9Cit7CisJLmxsc2VlawkJPSBFSU9fRVJST1IsCisJLmFpb19yZWFkCT0gRUlPX0VSUk9SLAorCS5yZWFkCQk9IEVJT19FUlJPUiwKKwkud3JpdGUJCT0gRUlPX0VSUk9SLAorCS5haW9fd3JpdGUJPSBFSU9fRVJST1IsCisJLnJlYWRkaXIJPSBFSU9fRVJST1IsCisJLnBvbGwJCT0gRUlPX0VSUk9SLAorCS5pb2N0bAkJPSBFSU9fRVJST1IsCisJLm1tYXAJCT0gRUlPX0VSUk9SLAorCS5vcGVuCQk9IEVJT19FUlJPUiwKKwkuZmx1c2gJCT0gRUlPX0VSUk9SLAorCS5yZWxlYXNlCT0gRUlPX0VSUk9SLAorCS5mc3luYwkJPSBFSU9fRVJST1IsCisJLmFpb19mc3luYwk9IEVJT19FUlJPUiwKKwkuZmFzeW5jCQk9IEVJT19FUlJPUiwKKwkubG9jawkJPSBFSU9fRVJST1IsCisJLnJlYWR2CQk9IEVJT19FUlJPUiwKKwkud3JpdGV2CQk9IEVJT19FUlJPUiwKKwkuc2VuZGZpbGUJPSBFSU9fRVJST1IsCisJLnNlbmRwYWdlCT0gRUlPX0VSUk9SLAorCS5nZXRfdW5tYXBwZWRfYXJlYSA9IEVJT19FUlJPUiwKK307CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGJhZF9pbm9kZV9vcHMgPQoreworCS5jcmVhdGUJCT0gRUlPX0VSUk9SLAorCS5sb29rdXAJCT0gRUlPX0VSUk9SLAorCS5saW5rCQk9IEVJT19FUlJPUiwKKwkudW5saW5rCQk9IEVJT19FUlJPUiwKKwkuc3ltbGluawk9IEVJT19FUlJPUiwKKwkubWtkaXIJCT0gRUlPX0VSUk9SLAorCS5ybWRpcgkJPSBFSU9fRVJST1IsCisJLm1rbm9kCQk9IEVJT19FUlJPUiwKKwkucmVuYW1lCQk9IEVJT19FUlJPUiwKKwkucmVhZGxpbmsJPSBFSU9fRVJST1IsCisJLyogZm9sbG93X2xpbmsgbXVzdCBiZSBuby1vcCwgb3RoZXJ3aXNlIHVubW91bnRpbmcgdGhpcyBpbm9kZQorCSAgIHdvbid0IHdvcmsgKi8KKwkudHJ1bmNhdGUJPSBFSU9fRVJST1IsCisJLnBlcm1pc3Npb24JPSBFSU9fRVJST1IsCisJLmdldGF0dHIJPSBFSU9fRVJST1IsCisJLnNldGF0dHIJPSBFSU9fRVJST1IsCisJLnNldHhhdHRyCT0gRUlPX0VSUk9SLAorCS5nZXR4YXR0cgk9IEVJT19FUlJPUiwKKwkubGlzdHhhdHRyCT0gRUlPX0VSUk9SLAorCS5yZW1vdmV4YXR0cgk9IEVJT19FUlJPUiwKK307CisKKworLyoKKyAqIFdoZW4gYSBmaWxlc3lzdGVtIGlzIHVuYWJsZSB0byByZWFkIGFuIGlub2RlIGR1ZSB0byBhbiBJL08gZXJyb3IgaW4KKyAqIGl0cyByZWFkX2lub2RlKCkgZnVuY3Rpb24sIGl0IGNhbiBjYWxsIG1ha2VfYmFkX2lub2RlKCkgdG8gcmV0dXJuIGEKKyAqIHNldCBvZiBzdHVicyB3aGljaCB3aWxsIHJldHVybiBFSU8gZXJyb3JzIGFzIHJlcXVpcmVkLiAKKyAqCisgKiBXZSBvbmx5IG5lZWQgdG8gZG8gbGltaXRlZCBpbml0aWFsaXNhdGlvbjogYWxsIG90aGVyIGZpZWxkcyBhcmUKKyAqIHByZWluaXRpYWxpc2VkIHRvIHplcm8gYXV0b21hdGljYWxseS4KKyAqLworIAorLyoqCisgKgltYWtlX2JhZF9pbm9kZSAtIG1hcmsgYW4gaW5vZGUgYmFkIGR1ZSB0byBhbiBJL08gZXJyb3IKKyAqCUBpbm9kZTogSW5vZGUgdG8gbWFyayBiYWQKKyAqCisgKglXaGVuIGFuIGlub2RlIGNhbm5vdCBiZSByZWFkIGR1ZSB0byBhIG1lZGlhIG9yIHJlbW90ZSBuZXR3b3JrCisgKglmYWlsdXJlIHRoaXMgZnVuY3Rpb24gbWFrZXMgdGhlIGlub2RlICJiYWQiIGFuZCBjYXVzZXMgSS9PIG9wZXJhdGlvbnMKKyAqCW9uIGl0IHRvIGZhaWwgZnJvbSB0aGlzIHBvaW50IG9uLgorICovCisgCit2b2lkIG1ha2VfYmFkX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlKSAKK3sKKwlyZW1vdmVfaW5vZGVfaGFzaChpbm9kZSk7CisKKwlpbm9kZS0+aV9tb2RlID0gU19JRlJFRzsKKwlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPQorCQljdXJyZW50X2ZzX3RpbWUoaW5vZGUtPmlfc2IpOworCWlub2RlLT5pX29wID0gJmJhZF9pbm9kZV9vcHM7CQorCWlub2RlLT5pX2ZvcCA9ICZiYWRfZmlsZV9vcHM7CQorfQorRVhQT1JUX1NZTUJPTChtYWtlX2JhZF9pbm9kZSk7CisKKy8qCisgKiBUaGlzIHRlc3RzIHdoZXRoZXIgYW4gaW5vZGUgaGFzIGJlZW4gZmxhZ2dlZCBhcyBiYWQuIFRoZSB0ZXN0IHVzZXMKKyAqICZiYWRfaW5vZGVfb3BzIHRvIGNvdmVyIHRoZSBjYXNlIG9mIGludmFsaWRhdGVkIGlub2RlcyBhcyB3ZWxsIGFzCisgKiB0aG9zZSBjcmVhdGVkIGJ5IG1ha2VfYmFkX2lub2RlKCkgYWJvdmUuCisgKi8KKyAKKy8qKgorICoJaXNfYmFkX2lub2RlIC0gaXMgYW4gaW5vZGUgZXJyb3JlZAorICoJQGlub2RlOiBpbm9kZSB0byB0ZXN0CisgKgorICoJUmV0dXJucyB0cnVlIGlmIHRoZSBpbm9kZSBpbiBxdWVzdGlvbiBoYXMgYmVlbiBtYXJrZWQgYXMgYmFkLgorICovCisgCitpbnQgaXNfYmFkX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlKSAKK3sKKwlyZXR1cm4gKGlub2RlLT5pX29wID09ICZiYWRfaW5vZGVfb3BzKTsJCit9CisKK0VYUE9SVF9TWU1CT0woaXNfYmFkX2lub2RlKTsKZGlmZiAtLWdpdCBhL2ZzL2JlZnMvQ2hhbmdlTG9nIGIvZnMvYmVmcy9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U4Yzc4NwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2JlZnMvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsNDE3IEBACitWZXJzaW9uIDAuOTIgKDIwMDItMDMtMjkpCis9PT09PT09PT09CisqIE1pbm9yIGNsZWFudXAuIFJhbiBMaW5kZW50IG9uIHRoZSBzb3VyY2VzLgorCitWZXJzaW9uIDAuOTIgKDIwMDItMDMtMjcpCis9PT09PT09PT09CisqIEZpeGVkIG1vZHVsZSBtYWtlZmlsZSBwcm9ibGVtLiBJdCB3YXMgbm90IGNvbXBpbGluZyBhbGwgdGhlIGNvcnJlY3QgCisgICAgc291cmNlIGZpbGVzIQorKiBSZW1vdmVkIGR1cGxpY2F0ZWQgZnVuY3Rpb24gZGVmaW5pdGlvbgorKiBGaXhlZCBwb3RlbnRpYWwgbnVsbCBwb2ludGVyIGRlcmVmZXJlbmNlIHdoZW4gcmVwb3J0aW5nIGFuIGVycm9yCisKK1ZlcnNpb24gMC45MSAoMjAwMi0wMy0yNikKKz09PT09PT09PT0KKyogT3khIEZpeGVkIHN0dXBpZCBidWcgdGhhdCB3b3VsZCBjYXVzZSBhbiB1bnJlc29sdmVkIHN5bWJvbCBlcnJvci4KKwlUaGFua3MgdG8gTGFzemxvIEJvc3pvcm1lbnlpIGZvciBwb2ludGluZyB0aGlzIG91dCB0byBtZS4KKworVmVyc2lvbiAwLjkgKDIwMDItMDMtMTQpCis9PT09PT09PT09CisqIEFkZGVkIFNlcmdleSBTLiBLb3N0eWxpb3YncyBwYXRjaCB0byBlbGltaW5hdGUgbWVtY3B5KCkgb3ZlcmhlYWQKKwlmcm9tIGIrdHJlZSBvcGVyYXRpb25zLiBDaGFuZ2VzIHRoZSBiZWZzX3JlYWRfZGF0YXN0cmVhbSgpIGludGVyZmFjZS4KKworKiBTZWdyZWdhdGVkIHRoZSBmdW5jdGlvbnMgdGhhdCBpbnRlcmZhY2UgZGlyZWN0bHkgd2l0aCB0aGUgbGludXggIHZmcyAKKwlpbnRlcmZhY2UgaW50byB0aGVpciBvd24gZmlsZSBjYWxsZWQgbGludXh2ZnMuYy4gW1dEXQorCitWZXJzaW9uIDAuNjQgKDIwMDItMDItMDcpCis9PT09PT09PT09CisqIERpZCB0aGUgc3RyaW5nIGNvbXBhcmlzaW9uIHJlYWxseSByaWdodCB0aGlzIHRpbWUgKGJ0cmVlLmMpIFtXRF0KKworKiBGaXhlZCB1cCBzb21lIHBsYWNlcyB3aGVyZSBJIGFzc3VtZWQgdGhhdCBhIGxvbmcgaW50IGNvdWxkIGhvbGQKKwlhIHBvaW50ZXIgdmFsdWUuIChidHJlZS5jKSBbV0RdCisKKyogQW5kcmV3IEZhcm5oYW0gPGFuZHJld2Zhcm5oYW1AdXEubmV0LmF1PiBwb2ludGVkIG91dCB0aGF0IHRoZSBtb2R1bGUKKwl3b3VsZG4ndCB3b3JrIG9uIG9sZGVyICg8Mi40LjEwKSBrZXJuZWxzIGR1ZSB0byBhbiB1bnJlc29sdmVkIHN5bWJvbC4KKwlUaGlzIGlzIGJhZCwgc2luY2UgMi40LjkgaXMgc3RpbGwgdGhlIGN1cnJlbnQgUmVkSGF0IGtlcm5lbC4gSSBhZGRlZAorCWEgd29ya2Fyb3VuZCBmb3IgdGhpcyBwcm9ibGVtIChjb21wYXRpYmlsaXR5LmgpIFtXRF0KKworKiBTZXJnZXkgUy4gS29zdHlsaW92IG1hZGUgYmVmc19maW5kX2tleSgpIHVzZSBhIGJpbmFyeSBzZWFyY2ggdG8gZmluZCAKKwlrZXlzIHdpdGhpbiBidHJlZSBub2RlcywgcmF0aGVyIHRoYW4gdGhlIGxpbmVhciBzZWFyY2ggd2Ugd2VyZSB1c2luZyAKKwliZWZvcmUuIChidHJlZS5jKSBbU2VyZ2V5IFMuIEtvc3R5bGlvdiA8cmF0aGFtYWhhdGFAcGhwNC5ydT5dCisKKyogTWFkZSBhIGRlYmlhbiBwYWNrYWdlIG9mIHRoZSBzb3VyY2UgZm9yIHVzZSB3aXRoIGtlcm5lbC1wYWNrYWdlLiBbV0RdCisKKworVmVyc2lvbiAwLjYzICgyMDAyLTAxLTMxKQorPT09PT09PT09PQorKiBGaXhlZCBidWcgaW4gYmVmc19maW5kX2JydW5faW5kaXJlY3QoKSB0aGF0IHdvdWxkIHJlc3VsdCBpbiB0aGUgd3JvbmcKKwlibG9jayBiZWluZyByZWFkLiBJdCB3YXMgaW50cm9kdWNlZCB3aGVuIGFkZGluZyBieXRlc3dhcHBpbmcgaW4gCisJMC42MS4gKGRhdGFzdHJlYW0uYykgW1dEXQorCisqIEZpeGVkIGEgbG9uZ3N0YW5kaW5nIGJ1ZyBpbiBiZWZzX2ZpbmRfa2V5KCkgdGhhdCB3b3VsZCByZXN1bHQgaW4gaXQgCisJZmluZGluZyB0aGUgZmlyc3Qga2V5IHRoYXQgaXMgYSBzdWJzdHJpbmcgb2YgdGhlIHN0cmluZyBpdCBpcyBzZWFyY2hpbmcKKwlmb3IuIEZvciBleGFtcGxlLCB0aGlzIHdvdWxkIGNhdXNlIGZpbGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeSB3aXRoIAorCW5hbWVzIGxpa2UgZmlsZTEgYW5kIGZpbGUyIHRvIG15c3RlcmlvdXNseSBiZSBkdXBsaWNhdGVzIG9mIGVhY2ggb3RoZXIgCisJKGJlY2F1c2UgdGhleSBoYXZlIHRoZSBzYW1lIGlub2RlIG51bWJlcikuIE1hbnkgdGhhbmtzIHRvIFBhdmVsIFJvc2tpbiAKKwlmb3IgcmVwb3J0aW5nIHRoaXMgc2VyaW91cyBidWchISEKKwkoYnRyZWUuYykgW1dEXQorCisqIEFkZGVkIHN1cHBvcnQgZm9yIGxvbmcgc3ltbGlua3MsIGFmdGVyIEF4ZWwgRG9yZmxlciBleHBsYWluZWQgdXAgaG93IAorCXRoZXkgd29yay4gSSBoYWQgZm9yZ290dGVuIGFsbCBhYm91dCB0aGVtLiAoaW5vZGUuYywgc3ltbGluay5jKSBbV0RdCisKKyogRG9jdW1lbnRhdGlvbiBpbXByb3ZlbWVudHMgaW4gc291cmNlLiBbV0RdCisKKyogTWFrZWZpbGUgZml4IGZvciBpbmRlcGVuZGVudCBtb2R1bGUgd2hlbiBDT05GSUdfTU9EVkVSU0lPTiBpcyBzZXQgaW4gCisJa2VybmVsIGNvbmZpZyBbUGF2ZWwgUm9za2luIDxwcm9za2lAZ251Lm9yZz5dCisKKyogQ29tcGlsZSB3YXJuaW5nIGZpeCBmb3IgbmFtZWkuYy4gW1NlcmdleSBTLiBLb3N0eWxpb3YgPHJhdGhhbWFoYXRhQHBocDQucnU+XQorCisKK1ZlcnNpb24gMC42MgorPT09PT09PT09PQorKiBGaXhlZCBtYWtlZmlsZSBmb3IgbW9kdWxlIGluc3RhbGwgW1dEXQorCisKK1ZlcnNpb24gMC42MSAoMjAwMi0wMS0yMCkKKz09PT09PT09PT0KKyogTWFkZSBmdW5jdGlvbnMgaW4gZW5kaWFuLmggdG8gZG8gdGhlIGNvcnJlY3QgYnl0ZXN3YXBwaW5nLCBubyBtYXR0ZXIKKwl0aGUgYXJjaC4gW1dEXQorCisqIEFiYmFuZG9uZWQgc2lsbHkgY2hlY2tzIGZvciBhIE5VTEwgc3VwZXJibG9jayBwb2ludGVyIGluIGRlYnVnLmMuIFtXRF0KKworKiBNaXNjIGNvZGUgY2xlYW51cHMuIEFsc28gY2xlYW51cCBvZiB0aGlzIGNoYW5nZWxvZyBmaWxlLiBbV0RdCisKKyogQWRkZWQgYnl0ZXN3YXBwaW5nIHRvIGFsbCBtZXRhZGF0YSByZWFkcyBmcm9tIGRpc2suCisJVXNlcyB0aGUgZnVuY3Rpb25zIGZyb20gZW5kaWFuLmggW1dEXQorCisqIFJlbW92ZSB0aGUgdHlwZWRlZiBvZiBzdHJ1Y3Qgc3VwZXJfYmxvY2sgdG8gdmZzX3NiLCBhcyBpdCBvZmZlbmRlZAorCWNlcnRhaW4gcGVvcGxlcycgYWVzdGhldGljIHNlbnNlLiBbV0RdCisKKyogRGl0dG8gd2l0aCB0aGUgYmVmc19yZWFkX2Jsb2NrKCkgaW50ZXJmYWNlLiBbV0RdCisgCisKK1ZlcnNpb24gMC42ICgyMDAxLTEyLTE1KQorPT09PT09PT09PQorKiBDbGVhbnVwIG9mIE5MUyBmdW5jdGlvbnMgKHV0aWwuYykgW1dEXQorCisqIE1ha2UgZGlyZWN0b3J5IGxvb2t1cC9yZWFkIHVzZSB0aGUgTkxTIGlmIGFuIGlvY2hhcnNldCBpcyBwcm92aWRlZC4gW1dEXQorCisqIEZpeGVkIHN0dXBpZCBidWcgd2hlcmUgc3BlY2lmeWluZyB0aGUgdWlkIG9yIGdpZCBtb3VudCBvcHRpb25zIGFzICcwJyAKKwl3b3VsZCByZXN1bHQgaW4gdGhlIGZpbGVzeXN0ZW0gdXNpbmcgdGhlIG9uLWRpc2sgdWlkIGFuZCBnaWQuIFtXRF0KKworKiBBZGRlZCBtb3VudCBvcHRpb24gdG8gY29udHJvbCBkZWJ1ZyBwcmludGluZy4gCisJVGhlIG9wdGlvbiBpcywgc2ltcGx5IGVub3VnaCwgJ2RlYnVnJy4gCisJKHN1cGVyLmMsIGRlYnVnLmMpIFtXRF0KKworKiBSZW1vdmVkIG5vdGlvbiBvZiBidHJlZSBoYW5kbGUgZnJvbSBidHJlZS5jLiBJdCB3YXMgdW5uZWNlc3NhcnksIGFzIHRoZQorCWxpbnV4IFZGUyBkb2Vzbid0IGFsbG93IHVzIHRvIGtlZXAgYW55IHN0YXRlIGJldHdlZW4gY2FsbHMuIFVwZGF0ZWQgCisJZGlyLmMsIG5hbWVpLmMgYmVmc19mcy5oIHRvIGFjY291bnQgZm9yIGl0LiBbV0RdCisKKyogSW1wcm92ZWQgaGFuZGxlaW5nIG9mIG92ZXJmbG93IG5vZGVzIHdoZW4gbGlzdGluZyBkaXJlY3Rvcmllcy4gCisJTm93IHdvcmtzIGZvciBvdmVyZmxvdyBub2RlcyBoYW5naW5nIG9mZiBvZiBub2RlcyBvdGhlciB0aGFuIHRoZSByb290IAorCW5vZGUuIFRoaXMgaXMgdGhlIGNsZWFuZXIgc29sdXRpb24gdG8gQnJlbnQgTWlzemFsYXNraSdzIHByb2JsZW0uIFtXRF0KKworKiBBZGRlZCBuZXcgZGVidWcvd2FybmluZy9lcnJvciBwcmludCBmdW5jdGlvbnMgaW4gZGVidWcuYy4gCisJTW9yZSBmbGV4aWJsZS4gV2lsbCBzb29uIGJlIGNvbnRyb2xsYWJsZSBhdCBtb3VudCB0aW1lIAorCShzZWUgVE9ETykuIFtXRF0KKworKiBSZXdyb3RlIGRhdGFzdHJlYW0gcG9zaXRvbiBsb29rdXBzLgorCShkYXRhc3RyZWFtLmMpIFtXRF0KKworKiBNb3ZlZCB0aGUgVE9ETyBsaXN0IHRvIGl0cyBvd24gZmlsZS4KKworCitWZXJzaW9uIDAuNTAgKDIwMDEtMTEtMTMpCis9PT09PT09PT09CisqIEFkZGVkIHdvcmthcm91bmQgZm9yIG1pcy11bmRlcnN0YW5kaW5nIG9mIHRoZSBuYXR1cmUgb2YgdGhlIGIrdHJlZXMgdXNlZCAKKwlpbiBkaXJlY3Rvcmllcy4gQSBjbGVhbmVyIHNvbHV0aW9uIHdpbGwgY29tZSBhZnRlciBJJ3ZlIHRob3VnaHQgYWJvdXQgaXQgCisJZm9yIGEgd2hpbGUuIFRoYW5rcyB0byBCcmVudCBNaXN6YWxhc2tpIGZvciBmaW5kaW5nIGFuZCByZXBvcnRpbmcgdGhpcyBidWcuIAorCShidHJlZS5jKSBbV0RdCisKKyogTWlub3IgY2xlYW51cHMKKworKiBBZGRlZCB0ZXN0IGZvciAiaW1wb3NzaWJsZSIgY29uZGl0aW9uIG9mIGVtcHR5IGludGVybmFsIG5vZGVzIGluIAorCXNlZWtsZWFmKCkgaW4gYnRyZWUuYyBbV0RdCisKKyogSW1wbGVtZW50ZWQgdGhlIGFic3RyYWN0ZWQgcmVhZF9ibG9jaygpIGluIGlvLmMgW1dEXQorCisqIENsZWFuZWQgdXAgdGhlIGlub2RlIHZhbGlkYXRpb24gaW4gaW5vZGUuYyBbV0RdCisKKyogQW50b24gQWx0YXBhcm1ha292IGZpZ3VyZWQgb3V0IChieSBhc2tpbmcgTGludXMgOikgKSB3aGF0IHdhcyBjYXVzaW5nIHRoZSAKKyAJaGFuZ2luZyBkaXNrIGlvIHByb2JsZW0uIEl0IHR1cm5zIG91dCB5b3UgbmVlZCB0byBoYXZlIHRoZSBzeW5jX3BhZ2VzIAorCWNhbGxiYWNrIGRlZmluZWQgaW4geW91ciBhZGRyZXNzX3NwYWNlX29wcywgZXZlbiBpZiBpdCBqdXN0IHVzZXMgdGhlIAorCWRlZmF1bHQgbGludXgtc3VwcGxpZWQgaW1wbGVtZW50YXRpb24uIEZpeGVkLiBXb3JrcyBub3cuCisJKGZpbGUuYykgW1dEXQorCisqIEFudG9uIEFsdGFwYXJtYWtvdiBhbmQgQ2hyaXN0b3BoIEhlbGx3aWcgYWxlcnRlZCBtZSB0byB0aGUgZmFjdCB0aGF0IAorCWZpbGVzeXN0ZW0gY29kZSBzaG91bGQgYmUgdXNpbmcgR0ZQX05PRlMgaW5zdGVhZCBvZiBHRlBfS0VSTkVMIGFzIHRoZSAKKwlwcmlvcml0eSBwYXJhbWV0ZXIgdG8ga21hbGxvYygpLiBGaXhlZC4gCisJKGRhdGFzdHJlYW0uYywgYnRyZWUuYyBzdXBlci5jIGlub2RlLmMpIFtXRF0KKworKiBBbnRvbiBhbHNvIHRvbGQgbWUgdGhhdCB0aGUgYmxvY2tzaXplIGlzIG5vdCBhbGxvd2VkIHRvIGJlIGxhcmdlciB0aGFuIAorCXRoZSBwYWdlIHNpemUgaW4gbGludXgsIHdoaWNoIGlzIDRrIGkzODYuIE9vcHMuIEFkZGVkIGEgdGVzdCBmb3IgCisJKGJsb2Nrc2l6ZSA+IFBBR0VfU0laRSksIGFuZCByZWZ1c2UgdG8gbW91bnQgaW4gdGhhdCBjYXNlLiBXaGF0IHRoaXMgCisJcHJhY3RpY2FseSBtZWFucyBpcyB0aGF0IDhrIGJsb2Nrc2l6ZSB2b2x1bWVzIHdvbid0IHdvcmsgd2l0aG91dCBhIG1ham9yCisJcmVzdHJ1Y3R1cmluZyBvZiB0aGUgZHJpdmVyIChvciBhbiBhbHBoYSBvciBvdGhlciA2NGJpdCBoYXJkd2FyZSkuIFtXRF0KKworKiBDbGVhbmVkIHVwIHRoZSBiZWZzX2NvdW50X2Jsb2NrcygpIGZ1bmN0aW9uLiBNdWNoIHNtYXJ0ZXIgbm93LiAKKwlBbmQgc29tZXdoYXQgc21hbGxlciB0b28uIFtXRF0KKworKiBNYWRlIGlub2RlIGFsbG9jYXRpb25zIHVzZSBhIHNsYWIgY2FjaGUgCisJKHN1cGVyLmMgaW5vZGUuYykgW1dEXQorCisqIE1vdmVkIHRoZSBmcmVlaW5nIG9mIHRoZSBwcml2YXRlIGlub2RlIHNlY3Rpb24gZnJvbSBwdXRfaW5vZGUoKSB0byAKKwljbGVhcl9pbm9kZSgpLiBUaGlzIGZpeGVzIGEgcG90ZW50aWFsIGZyZWUgdHdpY2UgdHlwZSBidWcuIFB1dF9pbm9kZSgpIAorCWNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIGVhY2ggaW5vZGUgc3RydWN0LiBbV0RdCisKKyogQ29udmVydGVkIGFsbCBub24gdmZzLWNhbGxiYWNrIGZ1bmN0aW9ucyB0byB1c2UgYmVmc19zYl9pbmZvIGFzIHRoZSAKKwlzdXBlcmJsb2NrIHR5cGUsIHJhdGhlciB0aGFuIHN0cnVjdCBzdXBlcl9ibG9jay4gVGhpcyBpcyBmb3IgCisJcG9ydGFibGl0eS4gW1dEXQorCisqIEZpeGVkIGEgY291cGxlIG9mIGNvbXBpbGUgd2FybmluZ3MgZHVlIHRvIHVzZSBvZiBtYWxsb2MuaCwgd2hlbiBzbGFiLmggCisJaXMgdGhlIG5ldyB3YXkuIChpbm9kZS5jLCBzdXBlci5jKSBbV0RdCisKKyogRml4ZWQgZXJyb25vdXMgaW5jbHVkZXMgb2YgbGludXgvYmVmc19mc19pLmggYW5kIGxpbnV4L2JlZnNfZnNfc2IuaCAKKwlpbiBpbm9kZS5jIFtXRF0KKworVmVyc2lvbiAwLjQ1ICgyMDAxLTEwLTI5KQorPT09PT09PT09PQorKiBBZGRlZCBmdW5jdGlvbnMgdG8gZ2V0IHRoZSBwcml2YXRlIHN1cGVyYmxvY2sgYW5kIGlub2RlIHN0cnVjdHVyZXMgZnJvbSAKKwl0aGVpciBlbmNsb3NpbmcgcHVibGljIHN0cnVjdHVyZXMuIFN3aXRjaGVkIGFsbCByZWZlcmVuY2VzIHRvIHRoZSAKKwlwcml2YXRlIHBvcnRpb25zIHRvIHVzZSB0aGVtLiAobWFueSBmaWxlcykgW1dEXQorCisqIE1hZGUgcmVhZF9zdXBlciBhbmQgcmVhZF9pbm9kZSBhbGxvY2F0ZSB0aGUgcHJpdmF0ZSBwb3J0aW9ucyBvZiB0aG9zZSAKKwlzdHJ1Y3R1cmVzIGludG8gdGhlIGdlbmVyaWMgcG9pbnRlciBmaWVsZHMgb2YgdGhlIHB1YmxpYyBzdHJ1Y3R1cmVzIAorCXdpdGgga21hbGxvYygpLiBwdXRfc3VwZXIgYW5kIHB1dF9pbm9kZSBmcmVlIHRoZW0uIFRoaXMgYWxsb3dzIHVzIG5vdCAKKwl0byBoYXZlIHRvIHRvdWNoIHRoZSBkZWZpbml0aW9ucyBvZiB0aGUgcHVibGljIHN0cnVjdHVyZXMgaW4gCisJaW5jbHVkZS9saW51eC9mcy5oLiBBbHNvLCBiZWZzX2lub2RlX2luZm8gaXMgaHVnZSAoYmVjdWFzZSBvZiB0aGUgCisJc3ltbGluayBzdHJpbmcpLiAoc3VwZXIuYywgaW5vZGUuYywgYmVmc19mcy5oKSBbV0RdCisKKyogRml4ZWQgYSB0aGlua28gdGhhdCB3YXMgY29ycnVwdGluZyBmaWxlIHJlYWRzIGFmdGVyIHRoZSBmaXJzdCBibG9ja19ydW4gCisJaXMgZG9uZSBiZWluZyByZWFkLiAoZGF0YXN0cmVhbS5jKSBbV0RdCisKKyogUmVtb3ZlZCBmc3luYygpIGhvb2tzLCBzaW5jZSBhIHJlYWQtb25seSBmaWxlc3lzdGVtIGRvZXNuJ3QgbmVlZCB0aGVtLiAKKwlbQ2hyaXN0b3BoIEhlbGx3aWddLgorCisqIEZpeGVkIGJlZnNfcmVhZGxpbmsoKSAoc3ltbGluay5jKSBbQ2hyaXN0b3BoIEhlbGx3aWddLgorCisqIFJlbW92ZWQgYWxsIHRoZSBSZWFkLVdyaXRlIHN0dWZmLiBJJ2xsIHJlZG8gaXQgd2hlbiBpdCBpcyB0aW1lIHRvIGFkZCAKKwl3cml0ZSBzdXBwb3J0ICh2YXJpb3VzIGZpbGVzKSBbV0RdLgorCisqIFJlbW92ZWQgcHJvdG90eXBlcyBmb3IgZnVuY3Rpb25zIHdobydzIGRlZmluaXRpb25zIGhhdmUgYmVlbiByZW1vdmVkIAorCShiZWZzX2ZzLmgpIFtXRF0uCisKKworVmVyc2lvbiAwLjQgKDIwMDEtMTAtMjgpCis9PT09PT09PT09CisqIE1hZGUgaXQgYW4gb3B0aW9uIHRvIHVzZSB0aGUgb2xkIG5vbi1wYWdlY2FjaGUgYmVmc19maWxlX3JlYWQoKSBmb3IgCisJdGVzdGluZyBwdXJwb3Nlcy4gKGZzL0NvbmZpZy5pbikKKworKiBGaXhlZCB1bnVzZWQgdmFyaWFibGUgd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgd2l0aG91dCBkZWJ1Z2dpbmcuCisKKyogRml4ZWQgYSBidWcgd2hlcmUgdGhlIGlub2RlIGFuZCBzdXBlcl9ibG9jayBkaWRuJ3QgZ2V0IHRoZWlyIGJsb2NrYml0cyAKKwlmaWVsZHMgc2V0IChpbm9kZS5jIGFuZCBzdXBlci5jKS4gCisKKyogUmVsZWFzZSBwYXRjaCB2ZXJzaW9uIDExLiBBS0EgYmVmcy1kcml2ZXIgdmVyc2lvbiAwLjQuCisKKyogVGhhdHMgcmlnaHQuIE5ldyB2ZXJzaW9uaW5nIHNjaGVtZS4gCisJSSd2ZSBkb25lIHNvbWUgc2VyaW91cyB0ZXN0aW5nIG9uIGl0IG5vdyAob24gbXkgYm94IGFueWhvdyksIGFuZCBpdCAKKwlzZWVtcyBzdGFibGUgYW5kIG5vdCBvdXRyYWdvdXNseSBzbG93LiBFeGlzdGluZyBmZWF0dXJlcyBhcmUgbW9yZS1vci1sZXNzIAorCWNvcnJlY3QgKHNlZSBUT0RPIGxpc3QpLiBCdXQgaXQgaXNuJ3QgMS4wIHlldC4gSSB0aGluayAwLjQgZ2l2ZXMgbWUgc29tZSAKKwloZWFkcm9vbSBiZWZvcmUgdGhlIGJpZyAxLjAuCisKKworMjAwMS0xMC0yNgorPT09PT09PT09PQorKiBGaXhlZCBkYXRlIGZvcm1hdCBpbiB0aGlzIGZpbGUuIFdhcyBJIHNtb2tpbmcgY3JhY2s/CisKKyogUmVtb3ZlZCBvbGQgZGF0YXN0cmVhbSBjb2RlIGZyb20gZmlsZS5jLCBzaW5jZSBpdCBpcyBub2xvbmdlciB1c2VkLgorCisqIEdlbmVyaWNfcmVhZF9maWxlKCkgaXMgbm93IHVzZWQgdG8gcmVhZCByZWd1bGFyIGZpbGUgZGF0YS4gCisJSXQgZG9lc24ndCBjaGV3IHVwIHRoZSBidWZmZXIgY2FjaGUgKGl0IGRvZXMgcGFnZSBpbyBpbnN0ZWFkKSwgYW5kIHNlZW1zIAorCXRvIGJlIGFib3V0IGFzIGZhc3QgKGV2ZW4gdGhvdWdoIGl0IGhhcyB0byBsb29rIHVwIGVhY2ggZmlsZSBibG9jayAKKwlpbmRpdmR1YWx5KS4gQW5kIGl0IGtub3dzIGFib3V0IGRvaW5nIHJlYWRhaGVhZCwgd2hpY2ggaXMgYSBtYWpvciBwbHVzLiAKKwlTbyBpdCBkb2VzIGkvbyBpbiBtdWNoIGxhcmdlciBjaHVua3MuIEl0IGlzIHRoZSBjb3JyZWN0IGxpbnV4IHdheS4gSXQgCisJdXNlcyBiZWZzX2dldF9ibG9jaygpIGJ5IHdheSBvZiBiZWZzX3JlYWRwYWdlKCkgdG8gZmluZCB0aGUgZGlzayBvZmZzZXRzIAorCW9mIGJsb2Nrcywgd2hpY2ggaW4gdHVybiBjYWxscyBiZWZzX2Zwb3MyYnJ1bigpIGluIGRhdGFzdHJlYW0uYyB0byBkbyAKKwl0aGUgaGFyZCB3b3JrIG9mIGZpbmRpbmcgdGhlIGRpc2sgYmxvY2sgbnVtYmVyLgorCisqIENoYW5nZWQgbWV0aG9kIG9mIGNoZWNraW5nIGZvciBhIGRpcnR5IGZpbGVzeXN0ZW0gaW4gYmVmc19yZWFkX3N1cGVyIAorCShzdXBlci5jKS4gTm93IHdlIGNoZWNrIHRvIHNlZSBpZiBsb2dfc3RhcnQgYW5kIGxvZ19lbmQgZGlmZmVyLiBJZiBzbywgCisJdGhlIGpvdXJuYWwgbmVlZHMgdG8gYmUgcmVwbGF5ZWQsIGFuZCB0aGUgZmlsZXN5c3RlbSBjYW5ub3QgYmUgbW91bnRlZC4KKworKiBGaXhlZCBhbiBleHRyYSBpbnN0YW5jZSBvZiBNT0RfREVDX1VTRV9DT1VOVCBpbiBzdXBlci5jCisKKyogRml4ZWQgYSBwcm9ibGVtIHdpdGggcmVhZGluZyB0aGUgc3VwZXJibG9jayBvbiBkZXZpY2VzIHdpdGggbGFyZ2Ugc2VjdG9yIAorCXNpemVzIChzdWNoIGFzIGNkcm9tcykgb24gbGludXggMi40LjEwIGFuZCB1cC4KKworMjAwMS0xMC0yNAorPT09PT09PT09PQorKiBGaXggbmFzdHkgYnVnIGluIGNvbnZlcnRpbmcgYmxvY2sgbnVtYmVycyB0byBzdHJ1Y3QgYmVmc19pbm9kZV9hZGRyLiAKKwlTdWJ0bGUsIGJlY2F1c2UgdGhlIG9sZCB2ZXJzaW9uIHdhcyBvbmx5IHNvbWV0aW1lcyB3cm9uZy4gCisJUHJvYmFibHkgcmVzcG9uc2libGUgZm9yIGxvdHMgb2YgcHJvYmxlbXMuIChpbm9kZS5jKQorCisqIEZpeCBidWcgd2l0aCByZWFkaW5nIGFuIGVtcHR5IGRpcmVjdG9yeS4gKGJ0cmVlLmMgYW5kIGRpci5jKQorCisqIFRoaXMgb25lIGxvb2tzIGdvb2QuIFJlbGVhc2UgcGF0Y2ggdmVyc2lvbiAxMAorCisyMDAxLTEwLTIzCis9PT09PT09PT09CisqIEFkZGVkIGJ0cmVlIHNlYXJjaGluZyBmdW5jdGlvbi4KKworKiBVc2UgYmVmc19idHJlZV9maW5kIGluIGJlZnNfbG9va3VwIChuYW1laS5jKQorCisqIEFkZGl0aW9uYWwgY29tbWVudHMgaW4gYnRyZWUuYworCisyMDAxLTEwLTIyCis9PT09PT09PT09CisqIEFkZGVkIEIrdHJlZSByZWFkaW5nIGZ1bmN0aW9ucyAoaW4gYnRyZWUuYykuIAorCU1hZGUgYmVmc19yZWFkZGlyKCkgdXNlIHRoZW0gdGhlbSBpbnN0ZWFkIG9mIHRoZSBjcnVmdCBpbiBpbmRleC5jLgorCisyMDAxLTA5LTExCis9PT09PT09PT09CisqIENvbnZlcnRlZCBiZWZzX3JlYWRfZmlsZSgpIHRvIHVzZSB0aGUgbmV3IGRhdGFzdHJlYW0gY29kZS4KKworKiBGaW5hbGx5IHVwZGF0ZWQgdGhlIFJFQURNRSBmaWxlLgorCisqIEFkZGVkIG1hbnkgY29tbWVudHMuCisKKyogUG9zdGVkIHZlcnNpb24gNgorCisqIFJlbW92ZWQgYnl0ZS1vcmRlciBjb252ZXJzaW9uIGNvZGUuIAorCUkgaGF2ZSBubyBpbnRlbnRpb24gb2Ygc3VwcG9ydGluZyBpdCwgYW5kIGl0IHdhcyB2ZXJ5IHVnbHkuIAorCUZsb3cgY29udHJvbCB3aXRoICNpZmRlZiAodWdoKS4gTWF5YmUgSSdsbCByZWRvIGl0IG9uY2UgCisJbmF0aXZlIGJ5dGVvcmRlciB3b3JrcyAxMDAlLgorCisyMDAxLTA5LTEwCis9PT09PT09PT09CisqIEZpbmlzaGVkIGltcGxlbWVudGluZyByZWFkX2RhdGFzdHJlYW0oKQorCisqIG1hZGUgYmVmc19yZWFkX2JydW4oKSBtb3JlIGdlbmVyYWwKKwlTdXBwb3J0cyBhbiBvZmZzZXQgdG8gc3RhcnQgYXQgYW5kIGEgbWF4IGJ5dGVzIHRvIHJlYWQKKwlBZGRlZCBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gZ2l2ZSB0aGUgb2xkIGNhbGwKKworMjAwMS0wOS0zMAorPT09PT09PT09PQorKiBEaXNjb3ZlcmVkIHRoYXQgdGhlIGRhdGFzdHJlYW0gaGFuZGxlaW5nIGNvZGUgaW4gZmlsZS5jIGlzIHF1aXRlIGRlZmljaWVudCAKKwlpbiBzZXZlcmFsIHJlc3BlY3RzLiBGb3Igb25lIHRoaW5nLCBpdCBkb2Vzbid0IGRlYWwgd2l0aCBpbmRpcmVjdCBibG9ja3MKKworKiBSZXdyb3RlIGRhdGFzdHJlYW0gaGFuZGxlaW5nLgorCisqIENyZWF0ZWQgaW8uYywgZm9yIGlvIHJlbGF0ZWQgZnVuY3Rpb25zLgorCVByZXZpb3VzbHksIHRoZSBiZWZzX2JyZWFkKCkgZnVudGlvbnMgbGl2ZWQgaW4gZmlsZS5jCisJQ3JlYXRlZCB0aGUgYmVmc19yZWFkX2JydW4oKSBmdW5jdGlvbi4KKworCisyMDAxLTA5LTA3Cis9PT09PT09PT09CisqIE1hZGUgYSBmdW5jdGlvbiB0byBhY3R1YWxseSBjb3VudCB0aGUgbnVtYmVyIG9mIGZzIGJsb2NrcyB1c2VkIGJ5IGEgZmlsZS4KKwlBbmQgaGVscGVyIGZ1bmN0aW9ucy4KKwkoZnMvYmVmcy9pbm9kZS5jKQorCisyMDAxLTA5LTA1Cis9PT09PT09PT09CisqIEZpeGVkIGEgbWlzdW5kZXJzdGFuZGluZyBvZiB0aGUgaW5vZGUgZmllbGRzLiAKKwlUaGlzIGZpeGVkIHRoZSBwcm9ibG1lbSB3aXRoIHdyb25nIGZpbGUgc2l6ZXMgZnJvbSBkdSBhbmQgb3RoZXJzLgorCVRoZSBpX2Jsb2NrcyBmaWVsZCBvZiB0aGUgaW5vZGUgc3RydWN0IGlzIG5vdCB0aGUgbnVtYmVyIG9mIGJsb2NrcyBmb3IgdGhlCisJaW5vZGUsIGl0IGlzIHRoZSBudW1iZXIgb2YgYmxvY2tzIGZvciB0aGUgZmlsZS4JQWxzbywgaV9ibGtzaXplIGlzIG5vdAorCW5lY2Vzc2FyaWx5IHRoZSBzaXplIG9mIHRoZSBpbm9kZSwgYWx0aG91Z2ggaW4gIHByYWN0aWNlIGl0IHdvcmtzIG91dC4KKwlDaGFuZ2VkIHRvIGJsb2Nrc2l6ZSBvZiBmaWxlc3lzdGVtLgorCShmcy9iZWZzL2lub2RlLmMpCisKKyogUGVybWFuZW50bHkgcmVtb3ZlZCBjb2RlIHRoYXQgaGFkIGJlZW4gcHJvdmlzaW9uYWxseSBpZmRlZmVkIG91dCBvZiBiZWZzX2ZzLmgKKworKiBTaW5jZSB3ZSBkb24ndCBzdXBwb3J0IGFjY2VzcyB0aW1lLCBtYWtlIHRoYXQgZmllbGQgemVybywgaW5zdGVhZCBvZiAKKwljb3B5aW5nIG1fdGltZS4KKwkoZnMvYmVmcy9pbm9kZS5jKQorCisqIEFkZGVkIHNhbml0eSBjaGVjayBmb3IgaW5vZGUgcmVhZGluZworCU1ha2Ugc3VyZSBpbm9kZSB3ZSBnb3Qgd2FzIHRoZSBvbmUgd2UgYXNrZWQgZm9yLiAKKwkoZnMvYmVmcy9pbm9kZS5jKQorCisqIENvZGUgY2xlYW51cAorCUxvY2FsIHBvaW50ZXJzIHRvIGNvbW1vbmx5IHVzZWQgc3RydWN0dXJlcyBpbiBpbm9kZS5jLgorCUdvdCByaWQgb2YgYWJvbWluYXRpb25zIGJlZnNfaWFkZHIyaW5vZGUoKSBhbmQgYmVmc19pbm9kZTJpbm8oKS4gCisJUmVwbGFjZWQgd2l0aCBzaW5nbGUgZnVuY3Rpb24gaWFkZHIyYmxvY2tubygpLgorCShmcy9iZWZzL3N1cGVyLmMpIChmcy9iZWZzL2lub2RlLmMpCisKKzIwMDEtMDktMDEKKz09PT09PT09PT0KKyogRml4ZWQgdGhlIHByb2JsZW0gd2l0aCBzdGF0ZnMgd2hlcmUgaXQgd291bGQgYWx3YXlzIGNsYWltIHRoZSBkaXNrIHdhcyAKKwloYWxmIGZ1bGwsIGR1ZSB0byBpbXByb3BlciB1bmRlcnN0YW5kaW5nIG9mIHRoZSBzdGF0ZnMgZmllbGRzLgorCShmcy9iZWZzL3N1cGVyLmMpCisKKyogUG9zdGVkIHZlcmlvbiA0IG9mIHRoZSBwYXRjaAorCisyMDAxLTA5LTAxCis9PT09PT09PT09CisqIENoYW5nZWQgdGhlIG1hY3JvcyBpbiBiZWZzX2ZzLmggdG8gaW5saW5lIGZ1bmN0aW9ucy4KKwlNb3JlIHJlYWRhYmxlLiBUeXBlc2FmZS4gQmV0dGVyCisJKGluY2x1ZGUvbGludXgvYmVmc19mcy5oKQorCisqIE1vdmVkIHR5cGUgZGVmaW5pdGlvbnMgZnJvbSBiZWZzX2ZzLmggdG8gYSBuZXcgZmlsZSwgYmVmc19mc190eXBlcy5oIAorCUJlY2F1c2UgYmVmc19mc19pLmggYW5kIGJlZnNfZnNfc2IuaCB3ZXJlIGluY2x1ZGluZyBiZWZzX2ZzLmggZm9yIHRoZSAKKwl0eXBlZGVmcywgYW5kIHRoZXkgYXJlIGlubGN1ZGVkIGluIDxsaW51eC9mcy5oPiwgd2hpY2ggaGFzIGRlZmluaXRpb25zIAorCXRoYXQgSSB3YW50IHRoZSBpbmxpbmUgZnVuY3Rpb25zIGluIGJlZnNfZnMuaCB0byBiZSBhYmxlIHRvIHNlZS4gTmFzdHkKKwljaXJjdWxhcml0eS4KKwkoaW5jbHVkZS9saW51eC9iZWZzX2ZzLmgpCisKKzIwMDEtMDgtMzAKKz09PT09PT09PT0KKyogQ2xlYW5lZCB1cCBzb21lIHdvcmRpbmcuCisKKyogQWRkZWQgYWRkaXRpb25hbCBjb25zaXRlbmN5IGNoZWNrcyBvbiBtb3VudAorCUNoZWNrIGJsb2NrX3NpemUgYWdyZWVzIHdpdGggYmxvY2tfc2hpZnQKKwlDaGVjayBmbGFncyA9PSBCRUZTX0NMRUFOCisJKGZzL2JlZnMvc3VwZXIuYykKKworKiBUZWxsIHRoZSBrZXJuZWwgdG8gb25seSBtb3VudCBiZWZzIHJlYWQtb25seS4gCisJQnkgc2V0dGluZyB0aGUgTVNfUkRPTkxZIGZsYWcgaW4gYmVmc19yZWFkX3N1cGVyKCkuCisJTm90IHRoYXQgaXQgd2FzIHBvc3NpYmxlIHRvIHdyaXRlIGJlZm9yZS4gQnV0IG5vdyB0aGUga2VybmVsIHdvbid0IGV2ZW4gdHJ5LgorCShmcy9iZWZzL3N1cGVyLmMpCisKKyogR290IHJpZCBvZiBrZXJuZWwgd2FybmluZyBvbiBtb3VudC4KKwlUaGUga2VybmVsIGRvZXNuJ3QgbGlrZSBpdCBpZiB5b3UgY2FsbCBzZXRfYmxvY2tzaXplKCkgb24gYSBkZXZpY2Ugd2hlbiAKKwl5b3UgaGF2ZSBzb21lIG9mIGl0cyBibG9ja3Mgb3Blbi4gTW92ZWQgdGhlIHNlY29uZCBzZXRfYmxvY2tzaXplKCkgdG8gdGhlCisJdmVyeSBlbmQgb2YgYmVmc19yZWFkX3N1cGVyKCksIGFmdGVyIHdlIGFyZSBkb25lIHdpdGggdGhlIGRpc2sgc3VwZXJibG9jay4KKwkoZnMvYmVmcy9zdXBlci5jKQorCQorKiBGaXhlZCB3cm9uZyBudW1iZXIgb2YgYXJncyBidWcgaW4gYmVmc19kdW1wX2lub2RlCisJKGZzL2JlZnMvZGVidWcuYykKKworKiBTb2x2ZWQgbG90cyBvZiB0eXBlIG1pc21hdGNoZXMgaW4ga3ByaW50KClzCisJKGV2ZXJ3aGVyZSkKKworMjAwMS0wOC0yNworPT09PT09PT09PQorKiBDbGVhbmVkIHVwIHRoZSBmcy9Db25maWcuaW4gZW50cmllcyBhIGJpdCwgbm93IHNsaWdodGx5IG1vcmUgZGVzY3JpcHRpdmUuCisKKyogQmVGUyBkZXBlbmRzIG9uIE5MUywgc28gSSBtYWRlIGFjdGl2YXRpbmcgQmVGUyBlbmFibGUgdGhlIE5MUyBxdWVzdGlvbnMKKwkoZnMvbmxzL0NvbmZpZy5pbikKKworKiBBZGRlZCBDb25maWd1cmUuaGVscCBlbnRyaWVzIGZvciBDT05GSUdfQkVGU19GUyBhbmQgQ09ORklHX0RFQlVHX0JFRlMKKwkoRG9jdW1lbnRhdGlvbi9Db25maWd1cmUuaGVscCkKKworMjAwMS0wOC0/PworPT09PT09PT09PQorKiBSZW1vdmVkIHN1cGVyYmxvY2sgbG9ja2luZyBjYWxscyBpbiBiZWZzX3JlYWRfc3VwZXIoKS4gSW4gMi40LCB0aGUgVkZTIAorCWhhbmRzIHVzIGEgc3VwZXJfYmxvY2sgc3RydWN0IHRoYXQgaXMgYWxyZWFkeSBsb2NrZWQuCisKKzIwMDEtMDgtMTMKKz09PT09PT09PT0KKyogV2lsbCBEeXNvbiA8d2lsbF9keXNvbkBwb2JveC5jb20+IGlzIG5vdyBhdHRlbXB0aW5nIHRvIG1haW50YWluIHRoaXMgbW9kdWxlCisJTWFrb3RvIEthdG8gPG1fa2F0b0BnYTIuc28tbmV0Lm5lLmpwPiBpcyBvcmlnaW5hbCBhdXRob3IuRGFuaWVsIEJlcmxpbiAKKwlhbHNvIGRpZCBzb21lIHdvcmsgb24gaXQgKGZpeGluZyBpdCB1cCBmb3IgdGhlIGxhdGVyIDIuMy54IGtlcm5lbHMsIElJUkMpLgorCisqIEZpeGVkIGNvbXBpbGUgZXJyb3JzIG9uIDIuNC4xIGtlcm5lbCAoV0QpCisJUmVzb2x2ZSByZWplY3RlZCBwYXRjaGVzCisJQWNjb21vZGF0ZSBjaGFuZ2VkIE5MUyBpbnRlcmZhY2UgKHV0aWwuaCkKKwlOZWVkZWQgdG8gaW5jbHVkZSA8bGludXgvc2xhYi5oPiBpbiBtb3N0IGZpbGVzCisJTWFrZWZpbGUgY2hhbmdlcworCWZzL0NvbmZpZy5pbiBjaGFuZ2VzCisKKyogVHJpZWQgdG8gbmljZWlmeSB0aGUgY29kZSB1c2luZyB0aGUgZXh0MiBmcyBhcyBhIGd1aWRlCisJRGVjbGFyZSBiZWZzX2ZzX3R5cGUgdXNpbmcgdGhlIERFQ0xBUkVfRlNUWVBFX0RFVigpIG1hY3JvCisKKyogTWFkZSBpdCBhIGNvbmZpZ3VyZSBvcHRpb24gdG8gdHVybiBvbiBkZWJ1Z2dpbmcgKGZzL0NvbmZpZy5pbikKKworKiBDb21waWxlcyBvbiAyLjQuNwpkaWZmIC0tZ2l0IGEvZnMvYmVmcy9NYWtlZmlsZSBiL2ZzL2JlZnMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYzNzBiZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2JlZnMvTWFrZWZpbGUKQEAgLTAsMCArMSw3IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgbGludXggQmVPUyBmaWxlc3lzdGVtIHJvdXRpbmVzLgorIworIAorb2JqLSQoQ09ORklHX0JFRlNfRlMpICs9IGJlZnMubworCitiZWZzLW9ianMgOj0gZGF0YXN0cmVhbS5vIGJ0cmVlLm8gc3VwZXIubyBpbm9kZS5vIGRlYnVnLm8gaW8ubyBsaW51eHZmcy5vCmRpZmYgLS1naXQgYS9mcy9iZWZzL1RPRE8gYi9mcy9iZWZzL1RPRE8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI1MDkyMQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2JlZnMvVE9ETwpAQCAtMCwwICsxLDE0IEBACitUT0RPCis9PT09PT09PT09CisKKyogQ29udmVydCBjb21tZW50cyB0byB0aGUgS2VybmVsLURvYyBmb3JtYXQuCisKKyogQmVmc19mcy5oIGhhcyBnb3R0ZW4gYmlnIGFuZCBtZXNzeS4gTm8gcmVhc29uIG5vdCB0byBicmVhayBpdCB1cCBpbnRvIAorCXNtYWxsZXIgcGVpY2VzLgorCisqIFNlZSBpZiBBbGV4YW5kZXIgVmlybydzIG9wdGlvbiBwYXJzZXIgbWFkZSBpdCBpbnRvIHRoZSBrZXJuZWwgdHJlZS4gCisJVXNlIHRoYXQgaWYgd2UgY2FuLiAoaW5jbHVkZS9saW51eC9wYXJzZXIuaCkKKworKiBTZWUgaWYgd2UgcmVhbGx5IG5lZWQgc2VwYXJhdGUgdHlwZXMgZm9yIG9uLWRpc2sgYW5kIGluLW1lbW9yeSAKKwlyZXByZXNlbnRhdGlvbnMgb2YgdGhlIHN1cGVyYmxvY2sgYW5kIGlub2RlLgorCmRpZmYgLS1naXQgYS9mcy9iZWZzL2F0dHJpYnV0ZS5jIGIvZnMvYmVmcy9hdHRyaWJ1dGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzI5ZDcyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYmVmcy9hdHRyaWJ1dGUuYwpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIGxpbnV4L2ZzL2JlZnMvYXR0cmlidXRlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgV2lsbCBEeXNvbiA8d2lsbF9keXNvbkBwb2JveC5jb20+CisgKgorICogTWFueSB0aGFua3MgdG8gRG9taW5pYyBHaWFtcGFvbG8sIGF1dGhvciBvZiAiUHJhY3RpY2FsIEZpbGUgU3lzdGVtCisgKiBEZXNpZ24gd2l0aCB0aGUgQmUgRmlsZSBTeXN0ZW0iLCBmb3Igc3VjaCBhIGhlbHBmdWwgYm9vay4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKKyNpbmNsdWRlICJiZWZzLmgiCisjaW5jbHVkZSAiZW5kaWFuLmgiCisKKyNkZWZpbmUgU0RfREFUQShzZClcCisJKHZvaWQqKSgoY2hhciopc2QgKyBzaXplb2YoKnNkKSArIChzZC0+bmFtZV9zaXplIC0gc2l6ZW9mKHNkLT5uYW1lKSkpCisKKyNkZWZpbmUgU0RfTkVYVChzZClcCisJKGJlZnNfc21hbGxfZGF0YSopKChjaGFyKilzZCArIHNpemVvZigqc2QpICsgKHNkLT5uYW1lX3NpemUgLSBcCisJc2l6ZW9mKHNkLT5uYW1lKSArIHNkLT5kYXRhX3NpemUpKQorCitpbnQKK2xpc3Rfc21hbGxfZGF0YShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2lub2RlICogaW5vZGUsIGZpbGxkaXJfdCBmaWxsZGlyKTsKKworYmVmc19zbWFsbF9kYXRhICoKK2ZpbmRfc21hbGxfZGF0YShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2lub2RlICogaW5vZGUsCisJCQkJIGNvbnN0IGNoYXIgKm5hbWUpOworaW50CityZWFkX3NtYWxsX2RhdGEoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYmVmc19pbm9kZSAqIGlub2RlLAorCQkgYmVmc19zbWFsbF9kYXRhICogc2RhdGEsIHZvaWQgKmJ1Ziwgc2l6ZV90IGJ1ZnNpemUpOworCisvKioKKyAqCisgKgorICoKKyAqCisgKgorICovCitiZWZzX3NtYWxsX2RhdGEgKgorZmluZF9zbWFsbF9kYXRhKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGJlZnNfaW5vZGUgKiBpbm9kZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwliZWZzX3NtYWxsX2RhdGEgKnNkYXRhID0gaW5vZGUtPnNtYWxsX2RhdGE7CisKKwl3aGlsZSAoc2RhdGEtPnR5cGUgIT0gMCkgeworCQlpZiAoc3RyY21wKG5hbWUsIHNkYXRhLT5uYW1lKSAhPSAwKSB7CisJCQlyZXR1cm4gc2RhdGE7CisJCX0KKwkJc2RhdGEgPSBTRF9ORVhUKHNkYXRhKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICoKKyAqCisgKgorICoKKyAqCisgKi8KK2ludAorcmVhZF9zbWFsbF9kYXRhKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGJlZnNfaW5vZGUgKiBpbm9kZSwKKwkJY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqYnVmLCBzaXplX3QgYnVmc2l6ZSkKK3sKKwliZWZzX3NtYWxsX2RhdGEgKnNkYXRhOworCisJc2RhdGEgPSBmaW5kX3NtYWxsX2RhdGEoc2IsIGlub2RlLCBuYW1lKTsKKwlpZiAoc2RhdGEgPT0gTlVMTCkKKwkJcmV0dXJuIEJFRlNfRVJSOworCWVsc2UgaWYgKHNkYXRhLT5kYXRhX3NpemUgPiBidWZzaXplKQorCQlyZXR1cm4gQkVGU19FUlI7CisKKwltZW1jcHkoYnVmLCBTRF9EQVRBKHNkYXRhKSwgc2RhdGEtPmRhdGFfc2l6ZSk7CisKKwlyZXR1cm4gQkVGU19PSzsKK30KKworLyoqCisgKgorICoKKyAqCisgKgorICoKKyAqLworaW50CitsaXN0X3NtYWxsX2RhdGEoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYmVmc19pbm9kZSAqIGlub2RlKQoreworCit9CisKKy8qKgorICoKKyAqCisgKgorICoKKyAqCisgKi8KK2ludAorbGlzdF9hdHRyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGJlZnNfaW5vZGUgKiBpbm9kZSkKK3sKKworfQorCisvKioKKyAqCisgKgorICoKKyAqCisgKgorICovCitpbnQKK3JlYWRfYXR0cihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2lub2RlICogaW5vZGUpCit7CisKK30KZGlmZiAtLWdpdCBhL2ZzL2JlZnMvYmVmcy5oIGIvZnMvYmVmcy9iZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU3YTJjMwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2JlZnMvYmVmcy5oCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogYmVmcy5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDIgV2lsbCBEeXNvbiA8d2lsbF9keXNvbkBwb2JveC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTWFrb3RvIEthdG8gKG1fa2F0b0BnYTIuc28tbmV0Lm5lLmpwKQorICovCisKKyNpZm5kZWYgX0xJTlVYX0JFRlNfSAorI2RlZmluZSBfTElOVVhfQkVGU19ICisKKyNpbmNsdWRlICJiZWZzX2ZzX3R5cGVzLmgiCisKKy8qIHVzZWQgaW4gZGVidWcuYyAqLworI2RlZmluZSBCRUZTX1ZFUlNJT04gIjAuOS4zIgorCisKK3R5cGVkZWYgdTY0IGJlZnNfYmxvY2tucl90OworLyoKKyAqIEJlRlMgaW4gbWVtb3J5IHN0cnVjdHVyZXMKKyAqLworCit0eXBlZGVmIHN0cnVjdCBiZWZzX21vdW50X29wdGlvbnMgeworCWdpZF90IGdpZDsKKwl1aWRfdCB1aWQ7CisJaW50IHVzZV9naWQ7CisJaW50IHVzZV91aWQ7CisJaW50IGRlYnVnOworCWNoYXIgKmlvY2hhcnNldDsKK30gYmVmc19tb3VudF9vcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBiZWZzX3NiX2luZm8geworCXUzMiBtYWdpYzE7CisJdTMyIGJsb2NrX3NpemU7CisJdTMyIGJsb2NrX3NoaWZ0OworCWludCBieXRlX29yZGVyOworCWJlZnNfb2ZmX3QgbnVtX2Jsb2NrczsKKwliZWZzX29mZl90IHVzZWRfYmxvY2tzOworCXUzMiBpbm9kZV9zaXplOworCXUzMiBtYWdpYzI7CisKKwkvKiBBbGxvY2F0aW9uIGdyb3VwIGluZm9ybWF0aW9uICovCisJdTMyIGJsb2Nrc19wZXJfYWc7CisJdTMyIGFnX3NoaWZ0OworCXUzMiBudW1fYWdzOworCisJLyogam9ybmFsIGxvZyBlbnRyeSAqLworCWJlZnNfYmxvY2tfcnVuIGxvZ19ibG9ja3M7CisJYmVmc19vZmZfdCBsb2dfc3RhcnQ7CisJYmVmc19vZmZfdCBsb2dfZW5kOworCisJYmVmc19pbm9kZV9hZGRyIHJvb3RfZGlyOworCWJlZnNfaW5vZGVfYWRkciBpbmRpY2VzOworCXUzMiBtYWdpYzM7CisKKwliZWZzX21vdW50X29wdGlvbnMgbW91bnRfb3B0czsKKwlzdHJ1Y3QgbmxzX3RhYmxlICpubHM7CisKK30gYmVmc19zYl9pbmZvOworCit0eXBlZGVmIHN0cnVjdCBiZWZzX2lub2RlX2luZm8geworCXUzMiBpX2ZsYWdzOworCXUzMiBpX3R5cGU7CisKKwliZWZzX2lub2RlX2FkZHIgaV9pbm9kZV9udW07CisJYmVmc19pbm9kZV9hZGRyIGlfcGFyZW50OworCWJlZnNfaW5vZGVfYWRkciBpX2F0dHJpYnV0ZTsKKworCXVuaW9uIHsKKwkJYmVmc19kYXRhX3N0cmVhbSBkczsKKwkJY2hhciBzeW1saW5rW0JFRlNfU1lNTElOS19MRU5dOworCX0gaV9kYXRhOworCisJc3RydWN0IGlub2RlIHZmc19pbm9kZTsKKworfSBiZWZzX2lub2RlX2luZm87CisKK2VudW0gYmVmc19lcnIgeworCUJFRlNfT0ssCisJQkVGU19FUlIsCisJQkVGU19CQURfSU5PREUsCisJQkVGU19CVF9FTkQsCisJQkVGU19CVF9FTVBUWSwKKwlCRUZTX0JUX01BVENILAorCUJFRlNfQlRfUEFSTUFUQ0gsCisJQkVGU19CVF9OT1RfRk9VTkQKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBkZWJ1Zy5jICovCit2b2lkIGJlZnNfZXJyb3IoY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqZm10LCAuLi4pOwordm9pZCBiZWZzX3dhcm5pbmcoY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqZm10LCAuLi4pOwordm9pZCBiZWZzX2RlYnVnKGNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKwordm9pZCBiZWZzX2R1bXBfc3VwZXJfYmxvY2soY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYmVmc19zdXBlcl9ibG9jayAqKTsKK3ZvaWQgYmVmc19kdW1wX2lub2RlKGNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGJlZnNfaW5vZGUgKik7Cit2b2lkIGJlZnNfZHVtcF9pbmRleF9lbnRyeShjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2J0cmVlX3N1cGVyICopOwordm9pZCBiZWZzX2R1bXBfaW5kZXhfbm9kZShjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2J0cmVlX25vZGVoZWFkICopOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyogR2V0cyBhIHBvaW50ZXIgdG8gdGhlIHByaXZhdGUgcG9ydGlvbiBvZiB0aGUgc3VwZXJfYmxvY2sKKyAqIHN0cnVjdHVyZSBmcm9tIHRoZSBwdWJsaWMgcGFydAorICovCitzdGF0aWMgaW5saW5lIGJlZnNfc2JfaW5mbyAqCitCRUZTX1NCKGNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jayAqc3VwZXIpCit7CisJcmV0dXJuIChiZWZzX3NiX2luZm8gKikgc3VwZXItPnNfZnNfaW5mbzsKK30KKworc3RhdGljIGlubGluZSBiZWZzX2lub2RlX2luZm8gKgorQkVGU19JKGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIGxpc3RfZW50cnkoaW5vZGUsIHN0cnVjdCBiZWZzX2lub2RlX2luZm8sIHZmc19pbm9kZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYmVmc19ibG9ja25yX3QKK2lhZGRyMmJsb2Nrbm8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYmVmc19pbm9kZV9hZGRyICogaWFkZHIpCit7CisJcmV0dXJuICgoaWFkZHItPmFsbG9jYXRpb25fZ3JvdXAgPDwgQkVGU19TQihzYiktPmFnX3NoaWZ0KSArCisJCWlhZGRyLT5zdGFydCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYmVmc19pbm9kZV9hZGRyCitibG9ja25vMmlhZGRyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGJlZnNfYmxvY2tucl90IGJsb2Nrbm8pCit7CisJYmVmc19pbm9kZV9hZGRyIGlhZGRyOworCWlhZGRyLmFsbG9jYXRpb25fZ3JvdXAgPSBibG9ja25vID4+IEJFRlNfU0Ioc2IpLT5hZ19zaGlmdDsKKwlpYWRkci5zdGFydCA9CisJICAgIGJsb2Nrbm8gLSAoaWFkZHIuYWxsb2NhdGlvbl9ncm91cCA8PCBCRUZTX1NCKHNiKS0+YWdfc2hpZnQpOworCWlhZGRyLmxlbiA9IDE7CisKKwlyZXR1cm4gaWFkZHI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CitiZWZzX2lhZGRyc19wZXJfYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlyZXR1cm4gQkVGU19TQihzYiktPmJsb2NrX3NpemUgLyBzaXplb2YgKGJlZnNfaW5vZGVfYWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitiZWZzX2lhZGRyX2lzX2VtcHR5KGJlZnNfaW5vZGVfYWRkciAqIGlhZGRyKQoreworCXJldHVybiAoIWlhZGRyLT5hbGxvY2F0aW9uX2dyb3VwKSAmJiAoIWlhZGRyLT5zdGFydCkgJiYgKCFpYWRkci0+bGVuKTsKK30KKworc3RhdGljIGlubGluZSBzaXplX3QKK2JlZnNfYnJ1bl9zaXplKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGJlZnNfYmxvY2tfcnVuIHJ1bikKK3sKKwlyZXR1cm4gQkVGU19TQihzYiktPmJsb2NrX3NpemUgKiBydW4ubGVuOworfQorCisjZW5kaWYJCQkJLyogX0xJTlVYX0JFRlNfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvYmVmcy9iZWZzX2ZzX3R5cGVzLmggYi9mcy9iZWZzL2JlZnNfZnNfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDk1NTE4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvYmVmcy9iZWZzX2ZzX3R5cGVzLmgKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiBpbmNsdWRlL2xpbnV4L2JlZnNfZnNfdHlwZXMuaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBXaWxsIER5c29uICh3aWxsQGNzLmVhcmxoYW0uZWR1KQorICoKKyAqCisgKgorICogZnJvbSBsaW51eC9pbmNsdWRlL2xpbnV4L2JlZnNfZnMuaAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBNYWtvdG8gS2F0byAobV9rYXRvQGdhMi5zby1uZXQubmUuanApCisgKgorICovCisKKyNpZm5kZWYgX0xJTlVYX0JFRlNfRlNfVFlQRVMKKyNkZWZpbmUgX0xJTlVYX0JFRlNfRlNfVFlQRVMKKworI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2VuZGlmIC8qX19LRVJORUxfXyovCisKKyNkZWZpbmUgUEFDS0VEIF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKKworLyoKKyAqIE1heCBuYW1lIGxlbmd0aHMgb2YgQkZTCisgKi8KKworI2RlZmluZSBCRUZTX05BTUVfTEVOIDI1NQorCisjZGVmaW5lIEJFRlNfU1lNTElOS19MRU4gMTQ0CisjZGVmaW5lIEJFRlNfTlVNX0RJUkVDVF9CTE9DS1MgMTIKKyNkZWZpbmUgQl9PU19OQU1FX0xFTkdUSCAzMgorCisvKiBUaGUgZGF0YXN0cmVhbSBibG9ja3MgbWFwcGVkIGJ5IHRoZSBkb3VibGUtaW5kaXJlY3QKKyAqIGJsb2NrIGFyZSBhbHdheXMgNCBmcyBibG9ja3MgbG9uZy4KKyAqIFRoaXMgZWxpbWluYXRlcyB0aGUgbmVlZCBmb3IgbGluZWFyIHNlYXJjaGVzIGFtb25nCisgKiB0aGUgcG90ZW50aWFsbHkgaHVnZSBudW1iZXIgb2YgaW5kaXJlY3QgYmxvY2tzCisgKgorICogRXJyLiBTaG91bGQgdGhhdCBiZSA0IGZzIGJsb2NrcyBvciA0az8/PworICogSXQgbWF0dGVycyBvbiBsYXJnZSBibG9ja3NpemUgdm9sdW1lcworICovCisjZGVmaW5lIEJFRlNfREJMSU5ESVJfQlJVTl9MRU4gNAorCisvKgorICogRmxhZ3Mgb2Ygc3VwZXJibG9jaworICovCisKK2VudW0gc3VwZXJfZmxhZ3MgeworCUJFRlNfQllURVNFWF9CRSwKKwlCRUZTX0JZVEVTRVhfTEUsCisJQkVGU19DTEVBTiA9IDB4NDM0YzQ1NGUsCisJQkVGU19ESVJUWSA9IDB4NDQ0OTUyNTQsCisJQkVGU19TVVBFUl9NQUdJQzEgPSAweDQyNDY1MzMxLAkvKiBCRlMxICovCisJQkVGU19TVVBFUl9NQUdJQzIgPSAweGRkMTIxMDMxLAorCUJFRlNfU1VQRVJfTUFHSUMzID0gMHgxNWI2ODMwZSwKK307CisKKyNkZWZpbmUgQkVGU19CWVRFT1JERVJfTkFUSVZFIDB4NDI0OTQ3NDUKKworI2RlZmluZSBCRUZTX1NVUEVSX01BR0lDIEJFRlNfU1VQRVJfTUFHSUMxCisKKy8qCisgKiBGbGFncyBvZiBpbm9kZQorICovCisKKyNkZWZpbmUgQkVGU19JTk9ERV9NQUdJQzEgMHgzYmJlMGFkOQorCitlbnVtIGlub2RlX2ZsYWdzIHsKKwlCRUZTX0lOT0RFX0lOX1VTRSA9IDB4MDAwMDAwMDEsCisJQkVGU19BVFRSX0lOT0RFID0gMHgwMDAwMDAwNCwKKwlCRUZTX0lOT0RFX0xPR0dFRCA9IDB4MDAwMDAwMDgsCisJQkVGU19JTk9ERV9ERUxFVEVEID0gMHgwMDAwMDAxMCwKKwlCRUZTX0xPTkdfU1lNTElOSyA9IDB4MDAwMDAwNDAsCisJQkVGU19QRVJNQU5FTlRfRkxBRyA9IDB4MDAwMGZmZmYsCisJQkVGU19JTk9ERV9OT19DUkVBVEUgPSAweDAwMDEwMDAwLAorCUJFRlNfSU5PREVfV0FTX1dSSVRURU4gPSAweDAwMDIwMDAwLAorCUJFRlNfTk9fVFJBTlNBQ1RJT04gPSAweDAwMDQwMDAwLAorfTsKKy8qIAorICogT24tRGlzayBkYXRhc3RydWN0dXJlcyBvZiBCZUZTCisgKi8KKwordHlwZWRlZiB1NjQgYmVmc19vZmZfdDsKK3R5cGVkZWYgdTY0IGJlZnNfdGltZV90OwordHlwZWRlZiB2b2lkIGJlZnNfYmlub2RlX2V0YzsKKworLyogQmxvY2sgcnVucyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXUzMiBhbGxvY2F0aW9uX2dyb3VwOworCXUxNiBzdGFydDsKKwl1MTYgbGVuOworfSBQQUNLRUQgYmVmc19ibG9ja19ydW47CisKK3R5cGVkZWYgYmVmc19ibG9ja19ydW4gYmVmc19pbm9kZV9hZGRyOworCisvKgorICogVGhlIFN1cGVyYmxvY2sgU3RydWN0dXJlCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwljaGFyIG5hbWVbQl9PU19OQU1FX0xFTkdUSF07CisJdTMyIG1hZ2ljMTsKKwl1MzIgZnNfYnl0ZV9vcmRlcjsKKworCXUzMiBibG9ja19zaXplOworCXUzMiBibG9ja19zaGlmdDsKKworCWJlZnNfb2ZmX3QgbnVtX2Jsb2NrczsKKwliZWZzX29mZl90IHVzZWRfYmxvY2tzOworCisJdTMyIGlub2RlX3NpemU7CisKKwl1MzIgbWFnaWMyOworCXUzMiBibG9ja3NfcGVyX2FnOworCXUzMiBhZ19zaGlmdDsKKwl1MzIgbnVtX2FnczsKKworCXUzMiBmbGFnczsKKworCWJlZnNfYmxvY2tfcnVuIGxvZ19ibG9ja3M7CisJYmVmc19vZmZfdCBsb2dfc3RhcnQ7CisJYmVmc19vZmZfdCBsb2dfZW5kOworCisJdTMyIG1hZ2ljMzsKKwliZWZzX2lub2RlX2FkZHIgcm9vdF9kaXI7CisJYmVmc19pbm9kZV9hZGRyIGluZGljZXM7CisKK30gUEFDS0VEIGJlZnNfc3VwZXJfYmxvY2s7CisKKy8qIAorICogTm90ZTogdGhlIGluZGlyZWN0IGFuZCBkYmxfaW5kaXIgYmxvY2tfcnVucyBtYXkKKyAqIGJlIGxvbmdlciB0aGFuIG9uZSBibG9jayEKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWJlZnNfYmxvY2tfcnVuIGRpcmVjdFtCRUZTX05VTV9ESVJFQ1RfQkxPQ0tTXTsKKwliZWZzX29mZl90IG1heF9kaXJlY3RfcmFuZ2U7CisJYmVmc19ibG9ja19ydW4gaW5kaXJlY3Q7CisJYmVmc19vZmZfdCBtYXhfaW5kaXJlY3RfcmFuZ2U7CisJYmVmc19ibG9ja19ydW4gZG91YmxlX2luZGlyZWN0OworCWJlZnNfb2ZmX3QgbWF4X2RvdWJsZV9pbmRpcmVjdF9yYW5nZTsKKwliZWZzX29mZl90IHNpemU7Cit9IFBBQ0tFRCBiZWZzX2RhdGFfc3RyZWFtOworCisvKiBBdHRyaWJ1dGUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIgdHlwZTsKKwl1MTYgbmFtZV9zaXplOworCXUxNiBkYXRhX3NpemU7CisJY2hhciBuYW1lWzFdOworfSBQQUNLRUQgYmVmc19zbWFsbF9kYXRhOworCisvKiBJbm9kZSBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIgbWFnaWMxOworCWJlZnNfaW5vZGVfYWRkciBpbm9kZV9udW07CisJdTMyIHVpZDsKKwl1MzIgZ2lkOworCXUzMiBtb2RlOworCXUzMiBmbGFnczsKKwliZWZzX3RpbWVfdCBjcmVhdGVfdGltZTsKKwliZWZzX3RpbWVfdCBsYXN0X21vZGlmaWVkX3RpbWU7CisJYmVmc19pbm9kZV9hZGRyIHBhcmVudDsKKwliZWZzX2lub2RlX2FkZHIgYXR0cmlidXRlczsKKwl1MzIgdHlwZTsKKworCXUzMiBpbm9kZV9zaXplOworCXUzMiBldGM7CQkvKiBub3QgdXNlICovCisKKwl1bmlvbiB7CisJCWJlZnNfZGF0YV9zdHJlYW0gZGF0YXN0cmVhbTsKKwkJY2hhciBzeW1saW5rW0JFRlNfU1lNTElOS19MRU5dOworCX0gZGF0YTsKKworCXUzMiBwYWRbNF07CQkvKiBub3QgdXNlICovCisJYmVmc19zbWFsbF9kYXRhIHNtYWxsX2RhdGFbMV07Cit9IFBBQ0tFRCBiZWZzX2lub2RlOworCisvKgorICogQit0cmVlIHN1cGVyYmxvY2sKKyAqLworCisjZGVmaW5lIEJFRlNfQlRSRUVfTUFHSUMgMHg2OWY2YzJlOAorCitlbnVtIGJ0cmVlX3R5cGVzIHsKKwlCVFJFRV9TVFJJTkdfVFlQRSA9IDAsCisJQlRSRUVfSU5UMzJfVFlQRSA9IDEsCisJQlRSRUVfVUlOVDMyX1RZUEUgPSAyLAorCUJUUkVFX0lOVDY0X1RZUEUgPSAzLAorCUJUUkVFX1VJTlQ2NF9UWVBFID0gNCwKKwlCVFJFRV9GTE9BVF9UWVBFID0gNSwKKwlCVFJFRV9ET1VCTEVfVFlQRSA9IDYKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1MzIgbWFnaWM7CisJdTMyIG5vZGVfc2l6ZTsKKwl1MzIgbWF4X2RlcHRoOworCXUzMiBkYXRhX3R5cGU7CisJYmVmc19vZmZfdCByb290X25vZGVfcHRyOworCWJlZnNfb2ZmX3QgZnJlZV9ub2RlX3B0cjsKKwliZWZzX29mZl90IG1heF9zaXplOworfSBQQUNLRUQgYmVmc19idHJlZV9zdXBlcjsKKworLyoKKyAqIEhlYWRlciBzdHVjdHVyZSBvZiBlYWNoIGJ0cmVlIG5vZGUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWJlZnNfb2ZmX3QgbGVmdDsKKwliZWZzX29mZl90IHJpZ2h0OworCWJlZnNfb2ZmX3Qgb3ZlcmZsb3c7CisJdTE2IGFsbF9rZXlfY291bnQ7CisJdTE2IGFsbF9rZXlfbGVuZ3RoOworfSBQQUNLRUQgYmVmc19idHJlZV9ub2RlaGVhZDsKKworI2VuZGlmCQkJCS8qIF9MSU5VWF9CRUZTX0ZTX1RZUEVTICovCmRpZmYgLS1naXQgYS9mcy9iZWZzL2J0cmVlLmMgYi9mcy9iZWZzL2J0cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZlMjE5NwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2JlZnMvYnRyZWUuYwpAQCAtMCwwICsxLDc4OCBAQAorLyoKKyAqIGxpbnV4L2ZzL2JlZnMvYnRyZWUuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAyIFdpbGwgRHlzb24gPHdpbGxfZHlzb25AcG9ib3guY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR1BMLiBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgZGV0YWlscy4KKyAqCisgKiAyMDAyLTAyLTA1OiBTZXJnZXkgUy4gS29zdHlsaW92IGFkZGVkIGJpbmFyeSBzZWFyY2ggd2l0aGluZworICogCQlidHJlZSBub2Rlcy4KKyAqCisgKiBNYW55IHRoYW5rcyB0bzoKKyAqCisgKiBEb21pbmljIEdpYW1wYW9sbywgYXV0aG9yIG9mICJQcmFjdGljYWwgRmlsZSBTeXN0ZW0KKyAqIERlc2lnbiB3aXRoIHRoZSBCZSBGaWxlIFN5c3RlbSIsIGZvciBzdWNoIGEgaGVscGZ1bCBib29rLgorICogCisgKiBNYXJjdXMgSi4gUmFudW0sIGF1dGhvciBvZiB0aGUgYit0cmVlIHBhY2thZ2UgaW4gCisgKiBjb21wLnNvdXJjZXMubWlzYyB2b2x1bWUgMTAuIFRoaXMgY29kZSBpcyBub3QgY29waWVkIGZyb20gdGhhdAorICogd29yaywgYnV0IGl0IGlzIHBhcnRpYWxseSBiYXNlZCBvbiBpdC4KKyAqCisgKiBNYWtvdG8gS2F0bywgYXV0aG9yIG9mIHRoZSBvcmlnaW5hbCBCZUZTIGZvciBsaW51eCBmaWxlc3lzdGVtCisgKiBkcml2ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisKKyNpbmNsdWRlICJiZWZzLmgiCisjaW5jbHVkZSAiYnRyZWUuaCIKKyNpbmNsdWRlICJkYXRhc3RyZWFtLmgiCisjaW5jbHVkZSAiZW5kaWFuLmgiCisKKy8qCisgKiBUaGUgYnRyZWUgZnVuY3Rpb25zIGluIHRoaXMgZmlsZSBhcmUgYnVpbHQgb24gdG9wIG9mIHRoZQorICogZGF0YXN0cmVhbS5jIGludGVyZmFjZSwgd2hpY2ggaXMgaW4gdHVybiBidWlsdCBvbiB0b3Agb2YgdGhlCisgKiBpby5jIGludGVyZmFjZS4KKyAqLworCisvKiBCZWZzIEIrdHJlZSBzdHJ1Y3R1cmU6CisgKiAKKyAqIFRoZSBmaXJzdCB0aGluZyBpbiB0aGUgdHJlZSBpcyB0aGUgdHJlZSBzdXBlcmJsb2NrLiBJdCB0ZWxscyB5b3UKKyAqIGFsbCBraW5kcyBvZiB1c2VmdWwgdGhpbmdzIGFib3V0IHRoZSB0cmVlLCBsaWtlIHdoZXJlIHRoZSByb290bm9kZQorICogaXMgbG9jYXRlZCwgYW5kIHRoZSBzaXplIG9mIHRoZSBub2RlcyAoYWx3YXlzIDEwMjQgd2l0aCBjdXJyZW50IHZlcnNpb24KKyAqIG9mIEJlT1MpLgorICoKKyAqIFRoZSByZXN0IG9mIHRoZSB0cmVlIGNvbnNpc3RzIG9mIGEgc2VyaWVzIG9mIG5vZGVzLiBOb2RlcyBjb250YWluIGEgaGVhZGVyCisgKiAoc3RydWN0IGJlZnNfYnRyZWVfbm9kZWhlYWQpLCB0aGUgcGFja2VkIGtleSBkYXRhLCBhbiBhcnJheSBvZiBzaG9ydHMgCisgKiBjb250YWluaW5nIHRoZSBlbmRpbmcgb2Zmc2V0cyBmb3IgZWFjaCBvZiB0aGUga2V5cywgYW5kIGFuIGFycmF5IG9mCisgKiBiZWZzX29mZl90IHZhbHVlcy4gSW4gaW50ZXJpb3Igbm9kZXMsIHRoZSBrZXlzIGFyZSB0aGUgZW5kaW5nIGtleXMgZm9yIAorICogdGhlIGNoaWxkbm9kZSB0aGV5IHBvaW50IHRvLCBhbmQgdGhlIHZhbHVlcyBhcmUgb2Zmc2V0cyBpbnRvIHRoZSAKKyAqIGRhdGFzdHJlYW0gY29udGFpbmluZyB0aGUgdHJlZS4gCisgKi8KKworLyogTm90ZToKKyAqIAorICogVGhlIGJvb2sgc3RhdGVzIDIgY29uZnVzaW5nIHRoaW5ncyBhYm91dCBiZWZzIGIrdHJlZXMuIEZpcnN0LCAKKyAqIGl0IHN0YXRlcyB0aGF0IHRoZSBvdmVyZmxvdyBmaWVsZCBvZiBub2RlIGhlYWRlcnMgaXMgdXNlZCBieSBpbnRlcm5hbCBub2RlcworICogdG8gcG9pbnQgdG8gYW5vdGhlciBub2RlIHRoYXQgImVmZmVjdGl2ZWx5IGNvbnRpbnVlcyB0aGlzIG9uZSIuIEhlcmUgaXMgd2hhdAorICogSSBiZWxpZXZlIHRoYXQgbWVhbnMuIEVhY2gga2V5IGluIGludGVybmFsIG5vZGVzIHBvaW50cyB0byBhbm90aGVyIG5vZGUgdGhhdAorICogY29udGFpbnMga2V5IHZhbHVlcyBsZXNzIHRoYW4gaXRzZWxmLiBJbnNwZWN0aW9uIHJldmVhbHMgdGhhdCB0aGUgbGFzdCBrZXkgCisgKiBpbiB0aGUgaW50ZXJuYWwgbm9kZSBpcyBub3QgdGhlIGxhc3Qga2V5IGluIHRoZSBpbmRleC4gS2V5cyB0aGF0IGFyZSAKKyAqIGdyZWF0ZXIgdGhhbiB0aGUgbGFzdCBrZXkgaW4gdGhlIGludGVybmFsIG5vZGUgZ28gaW50byB0aGUgb3ZlcmZsb3cgbm9kZS4gCisgKiBJIGltYWdpbmUgdGhlcmUgaXMgYSBwZXJmb3JtYW5jZSByZWFzb24gZm9yIHRoaXMuCisgKgorICogU2Vjb25kLCBpdCBzdGF0ZXMgdGhhdCB0aGUgaGVhZGVyIG9mIGEgYnRyZWUgbm9kZSBpcyBzdWZmaWNpZW50IHRvIAorICogZGlzdGluZ3Vpc2ggaW50ZXJuYWwgbm9kZXMgZnJvbSBsZWFmIG5vZGVzLiBXaXRob3V0IHNheWluZyBleGFjdGx5IGhvdy4gCisgKiBBZnRlciBmaWd1cmluZyBvdXQgdGhlIGZpcnN0LCBpdCBiZWNvbWVzIG9idmlvdXMgdGhhdCBpbnRlcm5hbCBub2RlcyBoYXZlCisgKiBvdmVyZmxvdyBub2RlcyBhbmQgbGVhZm5vZGVzIGRvIG5vdC4KKyAqLworCisvKiAKKyAqIEN1cnJlbnRseSwgdGhpcyBjb2RlIGlzIG9ubHkgZ29vZCBmb3IgZGlyZWN0b3J5IEIrdHJlZXMuCisgKiBJbiBvcmRlciB0byBiZSB1c2VkIGZvciBvdGhlciBCRlMgaW5kZXhlcywgaXQgbmVlZHMgdG8gYmUgZXh0ZW5kZWQgdG8gaGFuZGxlCisgKiBkdXBsaWNhdGUga2V5cyBhbmQgbm9uLXN0cmluZyBrZXl0eXBlcyAoaW50MzIsIGludDY0LCBmbG9hdCwgZG91YmxlKS4KKyAqLworCisvKgorICogSW4gbWVtb3J5IHN0cnVjdHVyZSBvZiBlYWNoIGJ0cmVlIG5vZGUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWJlZnNfYnRyZWVfbm9kZWhlYWQgaGVhZDsJLyogaGVhZCBvZiBub2RlIGNvbnZlcnRlZCB0byBjcHUgYnl0ZW9yZGVyICovCisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwliZWZzX2J0cmVlX25vZGVoZWFkICpvZF9ub2RlOwkvKiBvbiBkaXNrIG5vZGUgKi8KK30gYmVmc19idHJlZV9ub2RlOworCisvKiBsb2NhbCBjb25zdGFudHMgKi8KK3N0YXRpYyBjb25zdCBiZWZzX29mZl90IGJlZnNfYnRfaW52YWwgPSAweGZmZmZmZmZmZmZmZmZmZmZVTEw7CisKKy8qIGxvY2FsIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBiZWZzX2J0cmVlX3NlZWtsZWFmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGJlZnNfZGF0YV9zdHJlYW0gKiBkcywKKwkJCSAgICAgICBiZWZzX2J0cmVlX3N1cGVyICogYnRfc3VwZXIsCisJCQkgICAgICAgYmVmc19idHJlZV9ub2RlICogdGhpc19ub2RlLAorCQkJICAgICAgIGJlZnNfb2ZmX3QgKiBub2RlX29mZik7CisKK3N0YXRpYyBpbnQgYmVmc19idF9yZWFkX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGJlZnNfZGF0YV9zdHJlYW0gKiBkcywKKwkJCSAgICAgIGJlZnNfYnRyZWVfc3VwZXIgKiBzdXApOworCitzdGF0aWMgaW50IGJlZnNfYnRfcmVhZF9ub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGJlZnNfZGF0YV9zdHJlYW0gKiBkcywKKwkJCSAgICAgYmVmc19idHJlZV9ub2RlICogbm9kZSwgYmVmc19vZmZfdCBub2RlX29mZik7CisKK3N0YXRpYyBpbnQgYmVmc19sZWFmbm9kZShiZWZzX2J0cmVlX25vZGUgKiBub2RlKTsKKworc3RhdGljIHUxNiAqYmVmc19idF9rZXlsZW5faW5kZXgoYmVmc19idHJlZV9ub2RlICogbm9kZSk7CisKK3N0YXRpYyBiZWZzX29mZl90ICpiZWZzX2J0X3ZhbGFycmF5KGJlZnNfYnRyZWVfbm9kZSAqIG5vZGUpOworCitzdGF0aWMgY2hhciAqYmVmc19idF9rZXlkYXRhKGJlZnNfYnRyZWVfbm9kZSAqIG5vZGUpOworCitzdGF0aWMgaW50IGJlZnNfZmluZF9rZXkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYmVmc19idHJlZV9ub2RlICogbm9kZSwKKwkJCSBjb25zdCBjaGFyICpmaW5ka2V5LCBiZWZzX29mZl90ICogdmFsdWUpOworCitzdGF0aWMgY2hhciAqYmVmc19idF9nZXRfa2V5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGJlZnNfYnRyZWVfbm9kZSAqIG5vZGUsCisJCQkgICAgIGludCBpbmRleCwgdTE2ICoga2V5bGVuKTsKKworc3RhdGljIGludCBiZWZzX2NvbXBhcmVfc3RyaW5ncyhjb25zdCB2b2lkICprZXkxLCBpbnQga2V5bGVuMSwKKwkJCQljb25zdCB2b2lkICprZXkyLCBpbnQga2V5bGVuMik7CisKKy8qKgorICogYmVmc19idF9yZWFkX3N1cGVyIC0gcmVhZCBpbiBidHJlZSBzdXBlcmJsb2NrIGNvbnZlcnQgdG8gY3B1IGJ5dGVvcmRlcgorICogQHNiOiBGaWxlc3lzdGVtIHN1cGVyYmxvY2sKKyAqIEBkczogRGF0YXN0cmVhbSB0byByZWFkIGZyb20KKyAqIEBzdXA6IEJ1ZmZlciBpbiB3aGljaCB0byBwbGFjZSB0aGUgYnRyZWUgc3VwZXJibG9jaworICoKKyAqIENhbGxzIGJlZnNfcmVhZF9kYXRhc3RyZWFtIHRvIHJlYWQgaW4gdGhlIGJ0cmVlIHN1cGVyYmxvY2sgYW5kCisgKiBtYWtlcyBzdXJlIGl0IGlzIGluIGNwdSBieXRlb3JkZXIsIGJ5dGVzd2FwcGluZyBpZiBuZWNlc3NhcnkuCisgKgorICogT24gc3VjY2VzcywgcmV0dXJucyBCRUZTX09LIGFuZCAqQHN1cCBjb250YWlucyB0aGUgYnRyZWUgc3VwZXJibG9jaywKKyAqIGluIGNwdSBieXRlIG9yZGVyLgorICoKKyAqIE9uIGZhaWx1cmUsIEJFRlNfRVJSIGlzIHJldHVybmVkLgorICovCitzdGF0aWMgaW50CitiZWZzX2J0X3JlYWRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYmVmc19kYXRhX3N0cmVhbSAqIGRzLAorCQkgICBiZWZzX2J0cmVlX3N1cGVyICogc3VwKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCWJlZnNfYnRyZWVfc3VwZXIgKm9kX3N1cCA9IE5VTEw7CisKKwliZWZzX2RlYnVnKHNiLCAiLS0tPiBiZWZzX2J0cmVlX3JlYWRfc3VwZXIoKSIpOworCisJYmggPSBiZWZzX3JlYWRfZGF0YXN0cmVhbShzYiwgZHMsIDAsIE5VTEwpOworCisJaWYgKCFiaCkgeworCQliZWZzX2Vycm9yKHNiLCAiQ291bGRuJ3QgcmVhZCBpbmRleCBoZWFkZXIuIik7CisJCWdvdG8gZXJyb3I7CisJfQorCW9kX3N1cCA9IChiZWZzX2J0cmVlX3N1cGVyICopIGJoLT5iX2RhdGE7CisJYmVmc19kdW1wX2luZGV4X2VudHJ5KHNiLCBvZF9zdXApOworCisJc3VwLT5tYWdpYyA9IGZzMzJfdG9fY3B1KHNiLCBvZF9zdXAtPm1hZ2ljKTsKKwlzdXAtPm5vZGVfc2l6ZSA9IGZzMzJfdG9fY3B1KHNiLCBvZF9zdXAtPm5vZGVfc2l6ZSk7CisJc3VwLT5tYXhfZGVwdGggPSBmczMyX3RvX2NwdShzYiwgb2Rfc3VwLT5tYXhfZGVwdGgpOworCXN1cC0+ZGF0YV90eXBlID0gZnMzMl90b19jcHUoc2IsIG9kX3N1cC0+ZGF0YV90eXBlKTsKKwlzdXAtPnJvb3Rfbm9kZV9wdHIgPSBmczY0X3RvX2NwdShzYiwgb2Rfc3VwLT5yb290X25vZGVfcHRyKTsKKwlzdXAtPmZyZWVfbm9kZV9wdHIgPSBmczY0X3RvX2NwdShzYiwgb2Rfc3VwLT5mcmVlX25vZGVfcHRyKTsKKwlzdXAtPm1heF9zaXplID0gZnM2NF90b19jcHUoc2IsIG9kX3N1cC0+bWF4X3NpemUpOworCisJYnJlbHNlKGJoKTsKKwlpZiAoc3VwLT5tYWdpYyAhPSBCRUZTX0JUUkVFX01BR0lDKSB7CisJCWJlZnNfZXJyb3Ioc2IsICJJbmRleCBoZWFkZXIgaGFzIGJhZCBtYWdpYy4iKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwliZWZzX2RlYnVnKHNiLCAiPC0tLSBiZWZzX2J0cmVlX3JlYWRfc3VwZXIoKSIpOworCXJldHVybiBCRUZTX09LOworCisgICAgICBlcnJvcjoKKwliZWZzX2RlYnVnKHNiLCAiPC0tLSBiZWZzX2J0cmVlX3JlYWRfc3VwZXIoKSBFUlJPUiIpOworCXJldHVybiBCRUZTX0VSUjsKK30KKworLyoqCisgKiBiZWZzX2J0X3JlYWRfbm9kZSAtIHJlYWQgaW4gYnRyZWUgbm9kZSBhbmQgY29udmVydCB0byBjcHUgYnl0ZW9yZGVyCisgKiBAc2I6IEZpbGVzeXN0ZW0gc3VwZXJibG9jaworICogQGRzOiBEYXRhc3RyZWFtIHRvIHJlYWQgZnJvbQorICogQG5vZGU6IEJ1ZmZlciBpbiB3aGljaCB0byBwbGFjZSB0aGUgYnRyZWUgbm9kZQorICogQG5vZGVfb2ZmOiBTdGFydGluZyBvZmZzZXQgKGluIGJ5dGVzKSBvZiB0aGUgbm9kZSBpbiBAZHMKKyAqCisgKiBDYWxscyBiZWZzX3JlYWRfZGF0YXN0cmVhbSB0byByZWFkIGluIHRoZSBpbmRpY2F0ZWQgYnRyZWUgbm9kZSBhbmQKKyAqIG1ha2VzIHN1cmUgaXRzIGhlYWRlciBmaWVsZHMgYXJlIGluIGNwdSBieXRlb3JkZXIsIGJ5dGVzd2FwcGluZyBpZgorICogbmVjZXNzYXJ5LgorICogTm90ZTogbm9kZS0+YmggbXVzdCBiZSBOVUxMIHdoZW4gdGhpcyBmdW5jdGlvbiBjYWxsZWQgZmlyc3QKKyAqIHRpbWUuIERvbid0IGZvcmdldCBicmVsc2Uobm9kZS0+YmgpIGFmdGVyIGxhc3QgY2FsbC4KKyAqCisgKiBPbiBzdWNjZXNzLCByZXR1cm5zIEJFRlNfT0sgYW5kICpAbm9kZSBjb250YWlucyB0aGUgYnRyZWUgbm9kZSB0aGF0CisgKiBzdGFydHMgYXQgQG5vZGVfb2ZmLCB3aXRoIHRoZSBub2RlLT5oZWFkIGZpZWxkcyBpbiBjcHUgYnl0ZSBvcmRlci4KKyAqCisgKiBPbiBmYWlsdXJlLCBCRUZTX0VSUiBpcyByZXR1cm5lZC4KKyAqLworCitzdGF0aWMgaW50CitiZWZzX2J0X3JlYWRfbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2RhdGFfc3RyZWFtICogZHMsCisJCSAgYmVmc19idHJlZV9ub2RlICogbm9kZSwgYmVmc19vZmZfdCBub2RlX29mZikKK3sKKwl1aW50IG9mZiA9IDA7CisKKwliZWZzX2RlYnVnKHNiLCAiLS0tPiBiZWZzX2J0X3JlYWRfbm9kZSgpIik7CisKKwlpZiAobm9kZS0+YmgpCisJCWJyZWxzZShub2RlLT5iaCk7CisKKwlub2RlLT5iaCA9IGJlZnNfcmVhZF9kYXRhc3RyZWFtKHNiLCBkcywgbm9kZV9vZmYsICZvZmYpOworCWlmICghbm9kZS0+YmgpIHsKKwkJYmVmc19lcnJvcihzYiwgImJlZnNfYnRfcmVhZF9ub2RlKCkgZmFpbGVkIHRvIHJlYWQgIgorCQkJICAgIm5vZGUgYXQgJUx1Iiwgbm9kZV9vZmYpOworCQliZWZzX2RlYnVnKHNiLCAiPC0tLSBiZWZzX2J0X3JlYWRfbm9kZSgpIEVSUk9SIik7CisKKwkJcmV0dXJuIEJFRlNfRVJSOworCX0KKwlub2RlLT5vZF9ub2RlID0KKwkgICAgKGJlZnNfYnRyZWVfbm9kZWhlYWQgKikgKCh2b2lkICopIG5vZGUtPmJoLT5iX2RhdGEgKyBvZmYpOworCisJYmVmc19kdW1wX2luZGV4X25vZGUoc2IsIG5vZGUtPm9kX25vZGUpOworCisJbm9kZS0+aGVhZC5sZWZ0ID0gZnM2NF90b19jcHUoc2IsIG5vZGUtPm9kX25vZGUtPmxlZnQpOworCW5vZGUtPmhlYWQucmlnaHQgPSBmczY0X3RvX2NwdShzYiwgbm9kZS0+b2Rfbm9kZS0+cmlnaHQpOworCW5vZGUtPmhlYWQub3ZlcmZsb3cgPSBmczY0X3RvX2NwdShzYiwgbm9kZS0+b2Rfbm9kZS0+b3ZlcmZsb3cpOworCW5vZGUtPmhlYWQuYWxsX2tleV9jb3VudCA9CisJICAgIGZzMTZfdG9fY3B1KHNiLCBub2RlLT5vZF9ub2RlLT5hbGxfa2V5X2NvdW50KTsKKwlub2RlLT5oZWFkLmFsbF9rZXlfbGVuZ3RoID0KKwkgICAgZnMxNl90b19jcHUoc2IsIG5vZGUtPm9kX25vZGUtPmFsbF9rZXlfbGVuZ3RoKTsKKworCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfYnRyZWVfcmVhZF9ub2RlKCkiKTsKKwlyZXR1cm4gQkVGU19PSzsKK30KKworLyoqCisgKiBiZWZzX2J0cmVlX2ZpbmQgLSBGaW5kIGEga2V5IGluIGEgYmVmcyBCK3RyZWUKKyAqIEBzYjogRmlsZXN5c3RlbSBzdXBlcmJsb2NrCisgKiBAZHM6IERhdGFzdHJlYW0gY29udGFpbmluZyBidHJlZQorICogQGtleTogS2V5IHN0cmluZyB0byBsb29rdXAgaW4gYnRyZWUKKyAqIEB2YWx1ZTogVmFsdWUgc3RvcmVkIHdpdGggQGtleQorICoKKyAqIE9uIHN1Y2VzcywgcmV0dXJucyBCRUZTX09LIGFuZCBzZXRzICpAdmFsdWUgdG8gdGhlIHZhbHVlIHN0b3JlZAorICogd2l0aCBAa2V5ICh1c3VhbGx5IHRoZSBkaXNrIGJsb2NrIG51bWJlciBvZiBhbiBpbm9kZSkuCisgKgorICogT24gZmFpbHVyZSwgcmV0dXJucyBCRUZTX0VSUiBvciBCRUZTX0JUX05PVF9GT1VORC4KKyAqIAorICogQWxnb3JpdGhtOiAKKyAqICAgUmVhZCB0aGUgc3VwZXJibG9jayBhbmQgcm9vdG5vZGUgb2YgdGhlIGIrdHJlZS4KKyAqICAgRHJpbGwgZG93biB0aHJvdWdoIHRoZSBpbnRlcmlvciBub2RlcyB1c2luZyBiZWZzX2ZpbmRfa2V5KCkuCisgKiAgIE9uY2UgYXQgdGhlIGNvcnJlY3QgbGVhZiBub2RlLCB1c2UgYmVmc19maW5kX2tleSgpIGFnYWluIHRvIGdldCB0aGUKKyAqICAgYWN0dWFsbCB2YWx1ZSBzdG9yZWQgd2l0aCB0aGUga2V5LgorICovCitpbnQKK2JlZnNfYnRyZWVfZmluZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2RhdGFfc3RyZWFtICogZHMsCisJCWNvbnN0IGNoYXIgKmtleSwgYmVmc19vZmZfdCAqIHZhbHVlKQoreworCWJlZnNfYnRyZWVfbm9kZSAqdGhpc19ub2RlID0gTlVMTDsKKwliZWZzX2J0cmVlX3N1cGVyIGJ0X3N1cGVyOworCWJlZnNfb2ZmX3Qgbm9kZV9vZmY7CisJaW50IHJlczsKKworCWJlZnNfZGVidWcoc2IsICItLS0+IGJlZnNfYnRyZWVfZmluZCgpIEtleTogJXMiLCBrZXkpOworCisJaWYgKGJlZnNfYnRfcmVhZF9zdXBlcihzYiwgZHMsICZidF9zdXBlcikgIT0gQkVGU19PSykgeworCQliZWZzX2Vycm9yKHNiLAorCQkJICAgImJlZnNfYnRyZWVfZmluZCgpIGZhaWxlZCB0byByZWFkIGluZGV4IHN1cGVyYmxvY2siKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwl0aGlzX25vZGUgPSAoYmVmc19idHJlZV9ub2RlICopIGttYWxsb2Moc2l6ZW9mIChiZWZzX2J0cmVlX25vZGUpLAorCQkJCQkJR0ZQX05PRlMpOworCWlmICghdGhpc19ub2RlKSB7CisJCWJlZnNfZXJyb3Ioc2IsICJiZWZzX2J0cmVlX2ZpbmQoKSBmYWlsZWQgdG8gYWxsb2NhdGUgJXUgIgorCQkJICAgImJ5dGVzIG9mIG1lbW9yeSIsIHNpemVvZiAoYmVmc19idHJlZV9ub2RlKSk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJdGhpc19ub2RlLT5iaCA9IE5VTEw7CisKKwkvKiByZWFkIGluIHJvb3Qgbm9kZSAqLworCW5vZGVfb2ZmID0gYnRfc3VwZXIucm9vdF9ub2RlX3B0cjsKKwlpZiAoYmVmc19idF9yZWFkX25vZGUoc2IsIGRzLCB0aGlzX25vZGUsIG5vZGVfb2ZmKSAhPSBCRUZTX09LKSB7CisJCWJlZnNfZXJyb3Ioc2IsICJiZWZzX2J0cmVlX2ZpbmQoKSBmYWlsZWQgdG8gcmVhZCAiCisJCQkgICAibm9kZSBhdCAlTHUiLCBub2RlX29mZik7CisJCWdvdG8gZXJyb3JfYWxsb2M7CisJfQorCisJd2hpbGUgKCFiZWZzX2xlYWZub2RlKHRoaXNfbm9kZSkpIHsKKwkJcmVzID0gYmVmc19maW5kX2tleShzYiwgdGhpc19ub2RlLCBrZXksICZub2RlX29mZik7CisJCWlmIChyZXMgPT0gQkVGU19CVF9OT1RfRk9VTkQpCisJCQlub2RlX29mZiA9IHRoaXNfbm9kZS0+aGVhZC5vdmVyZmxvdzsKKwkJLyogaWYgbm8gbWF0Y2gsIGdvIHRvIG92ZXJmbG93IG5vZGUgKi8KKwkJaWYgKGJlZnNfYnRfcmVhZF9ub2RlKHNiLCBkcywgdGhpc19ub2RlLCBub2RlX29mZikgIT0gQkVGU19PSykgeworCQkJYmVmc19lcnJvcihzYiwgImJlZnNfYnRyZWVfZmluZCgpIGZhaWxlZCB0byByZWFkICIKKwkJCQkgICAibm9kZSBhdCAlTHUiLCBub2RlX29mZik7CisJCQlnb3RvIGVycm9yX2FsbG9jOworCQl9CisJfQorCisJLyogYXQgdGhlIGNvcnJlY3QgbGVhZiBub2RlIG5vdyAqLworCisJcmVzID0gYmVmc19maW5kX2tleShzYiwgdGhpc19ub2RlLCBrZXksIHZhbHVlKTsKKworCWJyZWxzZSh0aGlzX25vZGUtPmJoKTsKKwlrZnJlZSh0aGlzX25vZGUpOworCisJaWYgKHJlcyAhPSBCRUZTX0JUX01BVENIKSB7CisJCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfYnRyZWVfZmluZCgpIEtleSAlcyBub3QgZm91bmQiLCBrZXkpOworCQkqdmFsdWUgPSAwOworCQlyZXR1cm4gQkVGU19CVF9OT1RfRk9VTkQ7CisJfQorCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfYnRyZWVfZmluZCgpIEZvdW5kIGtleSAlcywgdmFsdWUgJUx1IiwKKwkJICAga2V5LCAqdmFsdWUpOworCXJldHVybiBCRUZTX09LOworCisgICAgICBlcnJvcl9hbGxvYzoKKwlrZnJlZSh0aGlzX25vZGUpOworICAgICAgZXJyb3I6CisJKnZhbHVlID0gMDsKKwliZWZzX2RlYnVnKHNiLCAiPC0tLSBiZWZzX2J0cmVlX2ZpbmQoKSBFUlJPUiIpOworCXJldHVybiBCRUZTX0VSUjsKK30KKworLyoqCisgKiBiZWZzX2ZpbmRfa2V5IC0gU2VhcmNoIGZvciBhIGtleSB3aXRoaW4gYSBub2RlCisgKiBAc2I6IEZpbGVzeXN0ZW0gc3VwZXJibG9jaworICogQG5vZGU6IE5vZGUgdG8gZmluZCB0aGUga2V5IHdpdGhpbgorICogQGtleTogS2V5c3RyaW5nIHRvIHNlYXJjaCBmb3IKKyAqIEB2YWx1ZTogSWYga2V5IGlzIGZvdW5kLCB0aGUgdmFsdWUgc3RvcmVkIHdpdGggdGhlIGtleSBpcyBwdXQgaGVyZQorICoKKyAqIGZpbmRzIGV4YWN0IG1hdGNoIGlmIG9uZSBleGlzdHMsIGFuZCByZXR1cm5zIEJFRlNfQlRfTUFUQ0gKKyAqIElmIG5vIGV4YWN0IG1hdGNoLCBmaW5kcyBmaXJzdCBrZXkgaW4gbm9kZSB0aGF0IGlzIGdyZWF0ZXIKKyAqIChhbHBoYWJldGljYWxseSkgdGhhbiB0aGUgc2VhcmNoIGtleSBhbmQgcmV0dXJucyBCRUZTX0JUX1BBUk1BVENICisgKiAoZm9yIHBhcnRpYWwgbWF0Y2gsIEkgZ3Vlc3MpLiBDYW4geW91IHRoaW5rIG9mIHNvbWV0aGluZyBiZXR0ZXIgdG8KKyAqIGNhbGwgaXQ/CisgKgorICogSWYgbm8ga2V5IHdhcyBhIG1hdGNoIG9yIGdyZWF0ZXIgdGhhbiB0aGUgc2VhcmNoIGtleSwgcmV0dXJuCisgKiBCRUZTX0JUX05PVF9GT1VORC4KKyAqCisgKiBVc2UgYmluYXJ5IHNlYXJjaCBpbnN0ZWFkIG9mIGEgbGluZWFyLgorICovCitzdGF0aWMgaW50CitiZWZzX2ZpbmRfa2V5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGJlZnNfYnRyZWVfbm9kZSAqIG5vZGUsCisJICAgICAgY29uc3QgY2hhciAqZmluZGtleSwgYmVmc19vZmZfdCAqIHZhbHVlKQoreworCWludCBmaXJzdCwgbGFzdCwgbWlkOworCWludCBlcTsKKwl1MTYga2V5bGVuOworCWludCBmaW5ka2V5X2xlbjsKKwljaGFyICp0aGlza2V5OworCWJlZnNfb2ZmX3QgKnZhbGFycmF5OworCisJYmVmc19kZWJ1ZyhzYiwgIi0tLT4gYmVmc19maW5kX2tleSgpICVzIiwgZmluZGtleSk7CisKKwkqdmFsdWUgPSAwOworCisJZmluZGtleV9sZW4gPSBzdHJsZW4oZmluZGtleSk7CisKKwkvKiBpZiBub2RlIGNhbiBub3QgY29udGFpbiBrZXksIGp1c3Qgc2tlZXAgdGhpcyBub2RlICovCisJbGFzdCA9IG5vZGUtPmhlYWQuYWxsX2tleV9jb3VudCAtIDE7CisJdGhpc2tleSA9IGJlZnNfYnRfZ2V0X2tleShzYiwgbm9kZSwgbGFzdCwgJmtleWxlbik7CisKKwllcSA9IGJlZnNfY29tcGFyZV9zdHJpbmdzKHRoaXNrZXksIGtleWxlbiwgZmluZGtleSwgZmluZGtleV9sZW4pOworCWlmIChlcSA8IDApIHsKKwkJYmVmc19kZWJ1ZyhzYiwgIjwtLS0gYmVmc19maW5kX2tleSgpICVzIG5vdCBmb3VuZCIsIGZpbmRrZXkpOworCQlyZXR1cm4gQkVGU19CVF9OT1RfRk9VTkQ7CisJfQorCisJdmFsYXJyYXkgPSBiZWZzX2J0X3ZhbGFycmF5KG5vZGUpOworCisJLyogc2ltcGxlIGJpbmFyeSBzZWFyY2ggKi8KKwlmaXJzdCA9IDA7CisJbWlkID0gMDsKKwl3aGlsZSAobGFzdCA+PSBmaXJzdCkgeworCQltaWQgPSAobGFzdCArIGZpcnN0KSAvIDI7CisJCWJlZnNfZGVidWcoc2IsICJmaXJzdDogJWQsIGxhc3Q6ICVkLCBtaWQ6ICVkIiwgZmlyc3QsIGxhc3QsCisJCQkgICBtaWQpOworCQl0aGlza2V5ID0gYmVmc19idF9nZXRfa2V5KHNiLCBub2RlLCBtaWQsICZrZXlsZW4pOworCQllcSA9IGJlZnNfY29tcGFyZV9zdHJpbmdzKHRoaXNrZXksIGtleWxlbiwgZmluZGtleSwKKwkJCQkJICBmaW5ka2V5X2xlbik7CisKKwkJaWYgKGVxID09IDApIHsKKwkJCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfZmluZF9rZXkoKSBmb3VuZCAlcyBhdCAlZCIsCisJCQkJICAgdGhpc2tleSwgbWlkKTsKKworCQkJKnZhbHVlID0gZnM2NF90b19jcHUoc2IsIHZhbGFycmF5W21pZF0pOworCQkJcmV0dXJuIEJFRlNfQlRfTUFUQ0g7CisJCX0KKwkJaWYgKGVxID4gMCkKKwkJCWxhc3QgPSBtaWQgLSAxOworCQllbHNlCisJCQlmaXJzdCA9IG1pZCArIDE7CisJfQorCWlmIChlcSA8IDApCisJCSp2YWx1ZSA9IGZzNjRfdG9fY3B1KHNiLCB2YWxhcnJheVttaWQgKyAxXSk7CisJZWxzZQorCQkqdmFsdWUgPSBmczY0X3RvX2NwdShzYiwgdmFsYXJyYXlbbWlkXSk7CisJYmVmc19kZWJ1ZyhzYiwgIjwtLS0gYmVmc19maW5kX2tleSgpIGZvdW5kICVzIGF0ICVkIiwgdGhpc2tleSwgbWlkKTsKKwlyZXR1cm4gQkVGU19CVF9QQVJNQVRDSDsKK30KKworLyoqCisgKiBiZWZzX2J0cmVlX3JlYWQgLSBUcmF2ZXJzZSBsZWFmbm9kZXMgb2YgYSBidHJlZQorICogQHNiOiBGaWxlc3lzdGVtIHN1cGVyYmxvY2sKKyAqIEBkczogRGF0YXN0cmVhbSBjb250YWluaW5nIGJ0cmVlCisgKiBAa2V5X25vOiBLZXkgbnVtYmVyIChhbHBoYWJldGljYWwgb3JkZXIpIG9mIGtleSB0byByZWFkCisgKiBAYnVmc2l6ZTogU2l6ZSBvZiB0aGUgYnVmZmVyIHRvIHJldHVybiBrZXkgaW4KKyAqIEBrZXlidWY6IFBvaW50ZXIgdG8gYSBidWZmZXIgdG8gcHV0IHRoZSBrZXkgaW4KKyAqIEBrZXlzaXplOiBMZW5ndGggb2YgdGhlIHJldHVybmVkIGtleQorICogQHZhbHVlOiBWYWx1ZSBzdG9yZWQgd2l0aCB0aGUgcmV0dXJuZWQga2V5CisgKgorICogSGVyZXMgaG93IGl0IHdvcmtzOiBLZXlfbm8gaXMgdGhlIGluZGV4IG9mIHRoZSBrZXkvdmFsdWUgcGFpciB0byAKKyAqIHJldHVybiBpbiBrZXlidWYvdmFsdWUuCisgKiBCdWZzaXplIGlzIHRoZSBzaXplIG9mIGtleWJ1ZiAoQkVGU19OQU1FX0xFTisxIGlzIGEgZ29vZCBzaXplKS4gS2V5c2l6ZSBpcyAKKyAqIHRoZSBudW1iZXIgb2YgY2hhcmVjdGVycyBpbiB0aGUga2V5IChqdXN0IGEgY29udmVuaWVuY2UpLgorICoKKyAqIEFsZ29yaXRobToKKyAqICAgR2V0IHRoZSBmaXJzdCBsZWFmbm9kZSBvZiB0aGUgdHJlZS4gU2VlIGlmIHRoZSByZXF1ZXN0ZWQga2V5IGlzIGluIHRoYXQKKyAqICAgbm9kZS4gSWYgbm90LCBmb2xsb3cgdGhlIG5vZGUtPnJpZ2h0IGxpbmsgdG8gdGhlIG5leHQgbGVhZm5vZGUuIFJlcGVhdCAKKyAqICAgdW50aWwgdGhlIChrZXlfbm8pdGgga2V5IGlzIGZvdW5kIG9yIHRoZSB0cmVlIGlzIG91dCBvZiBrZXlzLgorICovCitpbnQKK2JlZnNfYnRyZWVfcmVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2RhdGFfc3RyZWFtICogZHMsCisJCWxvZmZfdCBrZXlfbm8sIHNpemVfdCBidWZzaXplLCBjaGFyICprZXlidWYsIHNpemVfdCAqIGtleXNpemUsCisJCWJlZnNfb2ZmX3QgKiB2YWx1ZSkKK3sKKwliZWZzX2J0cmVlX25vZGUgKnRoaXNfbm9kZTsKKwliZWZzX2J0cmVlX3N1cGVyIGJ0X3N1cGVyOworCWJlZnNfb2ZmX3Qgbm9kZV9vZmYgPSAwOworCWludCBjdXJfa2V5OworCWJlZnNfb2ZmX3QgKnZhbGFycmF5OworCWNoYXIgKmtleXN0YXJ0OworCXUxNiBrZXlsZW47CisJaW50IHJlczsKKworCXVpbnQga2V5X3N1bSA9IDA7CisKKwliZWZzX2RlYnVnKHNiLCAiLS0tPiBiZWZzX2J0cmVlX3JlYWQoKSIpOworCisJaWYgKGJlZnNfYnRfcmVhZF9zdXBlcihzYiwgZHMsICZidF9zdXBlcikgIT0gQkVGU19PSykgeworCQliZWZzX2Vycm9yKHNiLAorCQkJICAgImJlZnNfYnRyZWVfcmVhZCgpIGZhaWxlZCB0byByZWFkIGluZGV4IHN1cGVyYmxvY2siKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAoKHRoaXNfbm9kZSA9IChiZWZzX2J0cmVlX25vZGUgKikKKwkgICAgIGttYWxsb2Moc2l6ZW9mIChiZWZzX2J0cmVlX25vZGUpLCBHRlBfTk9GUykpID09IE5VTEwpIHsKKwkJYmVmc19lcnJvcihzYiwgImJlZnNfYnRyZWVfcmVhZCgpIGZhaWxlZCB0byBhbGxvY2F0ZSAldSAiCisJCQkgICAiYnl0ZXMgb2YgbWVtb3J5Iiwgc2l6ZW9mIChiZWZzX2J0cmVlX25vZGUpKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlub2RlX29mZiA9IGJ0X3N1cGVyLnJvb3Rfbm9kZV9wdHI7CisJdGhpc19ub2RlLT5iaCA9IE5VTEw7CisKKwkvKiBzZWVrcyBkb3duIHRvIGZpcnN0IGxlYWZub2RlLCByZWFkcyBpdCBpbnRvIHRoaXNfbm9kZSAqLworCXJlcyA9IGJlZnNfYnRyZWVfc2Vla2xlYWYoc2IsIGRzLCAmYnRfc3VwZXIsIHRoaXNfbm9kZSwgJm5vZGVfb2ZmKTsKKwlpZiAocmVzID09IEJFRlNfQlRfRU1QVFkpIHsKKwkJYnJlbHNlKHRoaXNfbm9kZS0+YmgpOworCQlrZnJlZSh0aGlzX25vZGUpOworCQkqdmFsdWUgPSAwOworCQkqa2V5c2l6ZSA9IDA7CisJCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfYnRyZWVfcmVhZCgpIFRyZWUgaXMgRU1QVFkiKTsKKwkJcmV0dXJuIEJFRlNfQlRfRU1QVFk7CisJfSBlbHNlIGlmIChyZXMgPT0gQkVGU19FUlIpIHsKKwkJZ290byBlcnJvcl9hbGxvYzsKKwl9CisKKwkvKiBmaW5kIHRoZSBsZWFmIG5vZGUgY29udGFpbmluZyB0aGUga2V5X25vIGtleSAqLworCisJd2hpbGUgKGtleV9zdW0gKyB0aGlzX25vZGUtPmhlYWQuYWxsX2tleV9jb3VudCA8PSBrZXlfbm8pIHsKKworCQkvKiBubyBtb3JlIG5vZGVzIHRvIGxvb2sgaW46IGtleV9ubyBpcyB0b28gbGFyZ2UgKi8KKwkJaWYgKHRoaXNfbm9kZS0+aGVhZC5yaWdodCA9PSBiZWZzX2J0X2ludmFsKSB7CisJCQkqa2V5c2l6ZSA9IDA7CisJCQkqdmFsdWUgPSAwOworCQkJYmVmc19kZWJ1ZyhzYiwKKwkJCQkgICAiPC0tLSBiZWZzX2J0cmVlX3JlYWQoKSBFTkQgb2Yga2V5cyBhdCAlTHUiLAorCQkJCSAgIGtleV9zdW0gKyB0aGlzX25vZGUtPmhlYWQuYWxsX2tleV9jb3VudCk7CisJCQlicmVsc2UodGhpc19ub2RlLT5iaCk7CisJCQlrZnJlZSh0aGlzX25vZGUpOworCQkJcmV0dXJuIEJFRlNfQlRfRU5EOworCQl9CisKKwkJa2V5X3N1bSArPSB0aGlzX25vZGUtPmhlYWQuYWxsX2tleV9jb3VudDsKKwkJbm9kZV9vZmYgPSB0aGlzX25vZGUtPmhlYWQucmlnaHQ7CisKKwkJaWYgKGJlZnNfYnRfcmVhZF9ub2RlKHNiLCBkcywgdGhpc19ub2RlLCBub2RlX29mZikgIT0gQkVGU19PSykgeworCQkJYmVmc19lcnJvcihzYiwgImJlZnNfYnRyZWVfcmVhZCgpIGZhaWxlZCB0byByZWFkICIKKwkJCQkgICAibm9kZSBhdCAlTHUiLCBub2RlX29mZik7CisJCQlnb3RvIGVycm9yX2FsbG9jOworCQl9CisJfQorCisJLyogaG93IG1hbnkga2V5cyBpbnRvIHRoaXNfbm9kZSBpcyBrZXlfbm8gKi8KKwljdXJfa2V5ID0ga2V5X25vIC0ga2V5X3N1bTsKKworCS8qIGdldCBwb2ludGVycyB0byBkYXRhc3RydWN0dXJlcyB3aXRoaW4gdGhlIG5vZGUgYm9keSAqLworCXZhbGFycmF5ID0gYmVmc19idF92YWxhcnJheSh0aGlzX25vZGUpOworCisJa2V5c3RhcnQgPSBiZWZzX2J0X2dldF9rZXkoc2IsIHRoaXNfbm9kZSwgY3VyX2tleSwgJmtleWxlbik7CisKKwliZWZzX2RlYnVnKHNiLCAiUmVhZCBbJUx1LCVkXToga2V5c2l6ZSAlZCIsIG5vZGVfb2ZmLCBjdXJfa2V5LCBrZXlsZW4pOworCisJaWYgKGJ1ZnNpemUgPCBrZXlsZW4gKyAxKSB7CisJCWJlZnNfZXJyb3Ioc2IsICJiZWZzX2J0cmVlX3JlYWQoKSBrZXlidWYgdG9vIHNtYWxsICgldSkgIgorCQkJICAgImZvciBrZXkgb2Ygc2l6ZSAlZCIsIGJ1ZnNpemUsIGtleWxlbik7CisJCWJyZWxzZSh0aGlzX25vZGUtPmJoKTsKKwkJZ290byBlcnJvcl9hbGxvYzsKKwl9OworCisJc3RybmNweShrZXlidWYsIGtleXN0YXJ0LCBrZXlsZW4pOworCSp2YWx1ZSA9IGZzNjRfdG9fY3B1KHNiLCB2YWxhcnJheVtjdXJfa2V5XSk7CisJKmtleXNpemUgPSBrZXlsZW47CisJa2V5YnVmW2tleWxlbl0gPSAnXDAnOworCisJYmVmc19kZWJ1ZyhzYiwgIlJlYWQgWyVMdSwlZF06IEtleSBcIiUuKnNcIiwgVmFsdWUgJUx1Iiwgbm9kZV9vZmYsCisJCSAgIGN1cl9rZXksIGtleWxlbiwga2V5YnVmLCAqdmFsdWUpOworCisJYnJlbHNlKHRoaXNfbm9kZS0+YmgpOworCWtmcmVlKHRoaXNfbm9kZSk7CisKKwliZWZzX2RlYnVnKHNiLCAiPC0tLSBiZWZzX2J0cmVlX3JlYWQoKSIpOworCisJcmV0dXJuIEJFRlNfT0s7CisKKyAgICAgIGVycm9yX2FsbG9jOgorCWtmcmVlKHRoaXNfbm9kZSk7CisKKyAgICAgIGVycm9yOgorCSprZXlzaXplID0gMDsKKwkqdmFsdWUgPSAwOworCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfYnRyZWVfcmVhZCgpIEVSUk9SIik7CisJcmV0dXJuIEJFRlNfRVJSOworfQorCisvKioKKyAqIGJlZnNfYnRyZWVfc2Vla2xlYWYgLSBGaW5kIHRoZSBmaXJzdCBsZWFmbm9kZSBpbiB0aGUgYnRyZWUKKyAqIEBzYjogRmlsZXN5c3RlbSBzdXBlcmJsb2NrCisgKiBAZHM6IERhdGFzdHJlYW0gY29udGFpbmluZyBidHJlZQorICogQGJ0X3N1cGVyOiBQb2ludGVyIHRvIHRoZSBzdXBlcmJsb2NrIG9mIHRoZSBidHJlZQorICogQHRoaXNfbm9kZTogQnVmZmVyIHRvIHJldHVybiB0aGUgbGVhZm5vZGUgaW4KKyAqIEBub2RlX29mZjogUG9pbnRlciB0byBvZmZzZXQgb2YgY3VycmVudCBub2RlIHdpdGhpbiBkYXRhc3RyZWFtLiBNb2RpZmllZAorICogCQlieSB0aGUgZnVuY3Rpb24uCisgKgorICoKKyAqIEhlbHBlciBmdW5jdGlvbiBmb3IgYnRyZWUgdHJhdmVyc2UuIE1vdmVzIHRoZSBjdXJyZW50IHBvc2l0aW9uIHRvIHRoZSAKKyAqIHN0YXJ0IG9mIHRoZSBmaXJzdCBsZWFmIG5vZGUuCisgKgorICogQWxzbyBjaGVja3MgZm9yIGFuIGVtcHR5IHRyZWUuIElmIHRoZXJlIGFyZSBubyBrZXlzLCByZXR1cm5zIEJFRlNfQlRfRU1QVFkuCisgKi8KK3N0YXRpYyBpbnQKK2JlZnNfYnRyZWVfc2Vla2xlYWYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYmVmc19kYXRhX3N0cmVhbSAqIGRzLAorCQkgICAgYmVmc19idHJlZV9zdXBlciAqIGJ0X3N1cGVyLCBiZWZzX2J0cmVlX25vZGUgKiB0aGlzX25vZGUsCisJCSAgICBiZWZzX29mZl90ICogbm9kZV9vZmYpCit7CisKKwliZWZzX2RlYnVnKHNiLCAiLS0tPiBiZWZzX2J0cmVlX3NlZWtsZWFmKCkiKTsKKworCWlmIChiZWZzX2J0X3JlYWRfbm9kZShzYiwgZHMsIHRoaXNfbm9kZSwgKm5vZGVfb2ZmKSAhPSBCRUZTX09LKSB7CisJCWJlZnNfZXJyb3Ioc2IsICJiZWZzX2J0cmVlX3NlZWtsZWFmKCkgZmFpbGVkIHRvIHJlYWQgIgorCQkJICAgIm5vZGUgYXQgJUx1IiwgKm5vZGVfb2ZmKTsKKwkJZ290byBlcnJvcjsKKwl9CisJYmVmc19kZWJ1ZyhzYiwgIlNlZWtsZWFmIHRvIHJvb3Qgbm9kZSAlTHUiLCAqbm9kZV9vZmYpOworCisJaWYgKHRoaXNfbm9kZS0+aGVhZC5hbGxfa2V5X2NvdW50ID09IDAgJiYgYmVmc19sZWFmbm9kZSh0aGlzX25vZGUpKSB7CisJCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfYnRyZWVfc2Vla2xlYWYoKSBUcmVlIGlzIEVNUFRZIik7CisJCXJldHVybiBCRUZTX0JUX0VNUFRZOworCX0KKworCXdoaWxlICghYmVmc19sZWFmbm9kZSh0aGlzX25vZGUpKSB7CisKKwkJaWYgKHRoaXNfbm9kZS0+aGVhZC5hbGxfa2V5X2NvdW50ID09IDApIHsKKwkJCWJlZnNfZGVidWcoc2IsICJiZWZzX2J0cmVlX3NlZWtsZWFmKCkgZW5jb3VudGVyZWQgIgorCQkJCSAgICJhbiBlbXB0eSBpbnRlcmlvciBub2RlOiAlTHUuIFVzaW5nIE92ZXJmbG93ICIKKwkJCQkgICAibm9kZTogJUx1IiwgKm5vZGVfb2ZmLAorCQkJCSAgIHRoaXNfbm9kZS0+aGVhZC5vdmVyZmxvdyk7CisJCQkqbm9kZV9vZmYgPSB0aGlzX25vZGUtPmhlYWQub3ZlcmZsb3c7CisJCX0gZWxzZSB7CisJCQliZWZzX29mZl90ICp2YWxhcnJheSA9IGJlZnNfYnRfdmFsYXJyYXkodGhpc19ub2RlKTsKKwkJCSpub2RlX29mZiA9IGZzNjRfdG9fY3B1KHNiLCB2YWxhcnJheVswXSk7CisJCX0KKwkJaWYgKGJlZnNfYnRfcmVhZF9ub2RlKHNiLCBkcywgdGhpc19ub2RlLCAqbm9kZV9vZmYpICE9IEJFRlNfT0spIHsKKwkJCWJlZnNfZXJyb3Ioc2IsICJiZWZzX2J0cmVlX3NlZWtsZWFmKCkgZmFpbGVkIHRvIHJlYWQgIgorCQkJCSAgICJub2RlIGF0ICVMdSIsICpub2RlX29mZik7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJYmVmc19kZWJ1ZyhzYiwgIlNlZWtsZWFmIHRvIGNoaWxkIG5vZGUgJUx1IiwgKm5vZGVfb2ZmKTsKKwl9CisJYmVmc19kZWJ1ZyhzYiwgIk5vZGUgJUx1IGlzIGEgbGVhZiBub2RlIiwgKm5vZGVfb2ZmKTsKKworCXJldHVybiBCRUZTX09LOworCisgICAgICBlcnJvcjoKKwliZWZzX2RlYnVnKHNiLCAiPC0tLSBiZWZzX2J0cmVlX3NlZWtsZWFmKCkgRVJST1IiKTsKKwlyZXR1cm4gQkVGU19FUlI7Cit9CisKKy8qKgorICogYmVmc19sZWFmbm9kZSAtIERldGVybWluZSBpZiB0aGUgYnRyZWUgbm9kZSBpcyBhIGxlYWYgbm9kZSBvciBhbiAKKyAqIGludGVyaW9yIG5vZGUKKyAqIEBub2RlOiBQb2ludGVyIHRvIG5vZGUgc3RydWN0dXJlIHRvIHRlc3QKKyAqIAorICogUmV0dXJuIDEgaWYgbGVhZiwgMCBpZiBpbnRlcmlvcgorICovCitzdGF0aWMgaW50CitiZWZzX2xlYWZub2RlKGJlZnNfYnRyZWVfbm9kZSAqIG5vZGUpCit7CisJLyogYWxsIGludGVyaW9yIG5vZGVzIChhbmQgb25seSBpbnRlcmlvciBub2RlcykgaGF2ZSBhbiBvdmVyZmxvdyBub2RlICovCisJaWYgKG5vZGUtPmhlYWQub3ZlcmZsb3cgPT0gYmVmc19idF9pbnZhbCkKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworLyoqCisgKiBiZWZzX2J0X2tleWxlbl9pbmRleCAtIEZpbmRzIHN0YXJ0IG9mIGtleWxlbiBpbmRleCBpbiBhIG5vZGUKKyAqIEBub2RlOiBQb2ludGVyIHRvIHRoZSBub2RlIHN0cnVjdHVyZSB0byBmaW5kIHRoZSBrZXlsZW4gaW5kZXggd2l0aGluCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBrZXkgbGVuZ3RoIGluZGV4IGFycmF5CisgKiBvZiB0aGUgQit0cmVlIG5vZGUgKkBub2RlCisgKgorICogIlRoZSBsZW5ndGggb2YgYWxsIHRoZSBrZXlzIGluIHRoZSBub2RlIGlzIGFkZGVkIHRvIHRoZSBzaXplIG9mIHRoZQorICogaGVhZGVyIGFuZCB0aGVuIHJvdW5kZWQgdXAgdG8gYSBtdWx0aXBsZSBvZiBmb3VyIHRvIGdldCB0aGUgYmVnaW5uaW5nCisgKiBvZiB0aGUga2V5IGxlbmd0aCBpbmRleCIgKHAuODgsIHByYWN0aWNhbCBmaWxlc3lzdGVtIGRlc2lnbikuCisgKgorICogRXhjZXB0IHRoYXQgcm91bmRpbmcgdXAgdG8gOCB3b3JrcywgYW5kIHJvdW5kaW5nIHVwIHRvIDQgZG9lc24ndC4KKyAqLworc3RhdGljIHUxNiAqCitiZWZzX2J0X2tleWxlbl9pbmRleChiZWZzX2J0cmVlX25vZGUgKiBub2RlKQoreworCWNvbnN0IGludCBrZXlsZW5fYWxpZ24gPSA4OworCXVuc2lnbmVkIGxvbmcgaW50IG9mZiA9CisJICAgIChzaXplb2YgKGJlZnNfYnRyZWVfbm9kZWhlYWQpICsgbm9kZS0+aGVhZC5hbGxfa2V5X2xlbmd0aCk7CisJdWxvbmcgdG1wID0gb2ZmICUga2V5bGVuX2FsaWduOworCisJaWYgKHRtcCkKKwkJb2ZmICs9IGtleWxlbl9hbGlnbiAtIHRtcDsKKworCXJldHVybiAodTE2ICopICgodm9pZCAqKSBub2RlLT5vZF9ub2RlICsgb2ZmKTsKK30KKworLyoqCisgKiBiZWZzX2J0X3ZhbGFycmF5IC0gRmluZHMgdGhlIHN0YXJ0IG9mIHZhbHVlIGFycmF5IGluIGEgbm9kZQorICogQG5vZGU6IFBvaW50ZXIgdG8gdGhlIG5vZGUgc3RydWN0dXJlIHRvIGZpbmQgdGhlIHZhbHVlIGFycmF5IHdpdGhpbgorICoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgdmFsdWUgYXJyYXkKKyAqIG9mIHRoZSBub2RlIHBvaW50ZWQgdG8gYnkgdGhlIG5vZGUgaGVhZGVyCisgKi8KK3N0YXRpYyBiZWZzX29mZl90ICoKK2JlZnNfYnRfdmFsYXJyYXkoYmVmc19idHJlZV9ub2RlICogbm9kZSkKK3sKKwl2b2lkICprZXlsZW5faW5kZXhfc3RhcnQgPSAodm9pZCAqKSBiZWZzX2J0X2tleWxlbl9pbmRleChub2RlKTsKKwlzaXplX3Qga2V5bGVuX2luZGV4X3NpemUgPSBub2RlLT5oZWFkLmFsbF9rZXlfY291bnQgKiBzaXplb2YgKHUxNik7CisKKwlyZXR1cm4gKGJlZnNfb2ZmX3QgKikgKGtleWxlbl9pbmRleF9zdGFydCArIGtleWxlbl9pbmRleF9zaXplKTsKK30KKworLyoqCisgKiBiZWZzX2J0X2tleWRhdGEgLSBGaW5kcyBzdGFydCBvZiBrZXlkYXRhIGFycmF5IGluIGEgbm9kZQorICogQG5vZGU6IFBvaW50ZXIgdG8gdGhlIG5vZGUgc3RydWN0dXJlIHRvIGZpbmQgdGhlIGtleWRhdGEgYXJyYXkgd2l0aGluCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBrZXlkYXRhIGFycmF5CisgKiBvZiB0aGUgbm9kZSBwb2ludGVkIHRvIGJ5IHRoZSBub2RlIGhlYWRlciAKKyAqLworc3RhdGljIGNoYXIgKgorYmVmc19idF9rZXlkYXRhKGJlZnNfYnRyZWVfbm9kZSAqIG5vZGUpCit7CisJcmV0dXJuIChjaGFyICopICgodm9pZCAqKSBub2RlLT5vZF9ub2RlICsgc2l6ZW9mIChiZWZzX2J0cmVlX25vZGVoZWFkKSk7Cit9CisKKy8qKgorICogYmVmc19idF9nZXRfa2V5IC0gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGEga2V5CisgKiBAc2I6IGZpbGVzeXN0ZW0gc3VwZXJibG9jaworICogQG5vZGU6IG5vZGUgaW4gd2hpY2ggdG8gbG9vayBmb3IgdGhlIGtleQorICogQGluZGV4OiB0aGUgaW5kZXggb2YgdGhlIGtleSB0byBnZXQKKyAqIEBrZXlsZW46IG1vZGlmaWVkIHRvIGJlIHRoZSBsZW5ndGggb2YgdGhlIGtleSBhdCBAaW5kZXgKKyAqCisgKiBSZXR1cm5zIGEgdmFsaWQgcG9pbnRlciBpbnRvIEBub2RlIG9uIHN1Y2Nlc3MuCisgKiBSZXR1cm5zIE5VTEwgb24gZmFpbHVyZSAoYmFkIGlucHV0KSBhbmQgc2V0cyAqQGtleWxlbiA9IDAKKyAqLworc3RhdGljIGNoYXIgKgorYmVmc19idF9nZXRfa2V5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGJlZnNfYnRyZWVfbm9kZSAqIG5vZGUsCisJCWludCBpbmRleCwgdTE2ICoga2V5bGVuKQoreworCWludCBwcmV2X2tleV9lbmQ7CisJY2hhciAqa2V5c3RhcnQ7CisJdTE2ICprZXlsZW5faW5kZXg7CisKKwlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gbm9kZS0+aGVhZC5hbGxfa2V5X2NvdW50KSB7CisJCSprZXlsZW4gPSAwOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlrZXlzdGFydCA9IGJlZnNfYnRfa2V5ZGF0YShub2RlKTsKKwlrZXlsZW5faW5kZXggPSBiZWZzX2J0X2tleWxlbl9pbmRleChub2RlKTsKKworCWlmIChpbmRleCA9PSAwKQorCQlwcmV2X2tleV9lbmQgPSAwOworCWVsc2UKKwkJcHJldl9rZXlfZW5kID0gZnMxNl90b19jcHUoc2IsIGtleWxlbl9pbmRleFtpbmRleCAtIDFdKTsKKworCSprZXlsZW4gPSBmczE2X3RvX2NwdShzYiwga2V5bGVuX2luZGV4W2luZGV4XSkgLSBwcmV2X2tleV9lbmQ7CisKKwlyZXR1cm4ga2V5c3RhcnQgKyBwcmV2X2tleV9lbmQ7Cit9CisKKy8qKgorICogYmVmc19jb21wYXJlX3N0cmluZ3MgLSBjb21wYXJlIHR3byBzdHJpbmdzCisgKiBAa2V5MTogcG9pbnRlciB0byB0aGUgZmlyc3Qga2V5IHRvIGJlIGNvbXBhcmVkIAorICogQGtleWxlbjE6IGxlbmd0aCBpbiBieXRlcyBvZiBrZXkxCisgKiBAa2V5MjogcG9pbnRlciB0byB0aGUgc2Vjb25kIGtleSB0byBiZSBjb21wYXJlZAorICogQGtlbGVuMjogbGVuZ3RoIGluIGJ5dGVzIG9mIGtleTIKKyAqCisgKiBSZXR1cm5zIDAgaWYgQGtleTEgYW5kIEBrZXkyIGFyZSBlcXVhbC4KKyAqIFJldHVybnMgPjAgaWYgQGtleTEgaXMgZ3JlYXRlci4KKyAqIFJldHVybnMgPDAgaWYgQGtleTIgaXMgZ3JlYXRlci4uCisgKi8KK3N0YXRpYyBpbnQKK2JlZnNfY29tcGFyZV9zdHJpbmdzKGNvbnN0IHZvaWQgKmtleTEsIGludCBrZXlsZW4xLAorCQkgICAgIGNvbnN0IHZvaWQgKmtleTIsIGludCBrZXlsZW4yKQoreworCWludCBsZW4gPSBtaW5fdChpbnQsIGtleWxlbjEsIGtleWxlbjIpOworCWludCByZXN1bHQgPSBzdHJuY21wKGtleTEsIGtleTIsIGxlbik7CisJaWYgKHJlc3VsdCA9PSAwKQorCQlyZXN1bHQgPSBrZXlsZW4xIC0ga2V5bGVuMjsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBUaGVzZSB3aWxsIGJlIHVzZWQgZm9yIG5vbi1zdHJpbmcga2V5ZWQgYnRyZWVzICovCisjaWYgMAorc3RhdGljIGludAorYnRyZWVfY29tcGFyZV9pbnQzMihjb250IHZvaWQgKmtleTEsIGludCBrZXlsZW4xLCBjb25zdCB2b2lkICprZXkyLCBpbnQga2V5bGVuMikKK3sKKwlyZXR1cm4gKihpbnQzMl90ICopIGtleTEgLSAqKGludDMyX3QgKikga2V5MjsKK30KKworc3RhdGljIGludAorYnRyZWVfY29tcGFyZV91aW50MzIoY29udCB2b2lkICprZXkxLCBpbnQga2V5bGVuMSwKKwkJICAgICBjb25zdCB2b2lkICprZXkyLCBpbnQga2V5bGVuMikKK3sKKwlpZiAoKih1X2ludDMyX3QgKikga2V5MSA9PSAqKHVfaW50MzJfdCAqKSBrZXkyKQorCQlyZXR1cm4gMDsKKwllbHNlIGlmICgqKHVfaW50MzJfdCAqKSBrZXkxID4gKih1X2ludDMyX3QgKikga2V5MikKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gLTE7Cit9CitzdGF0aWMgaW50CitidHJlZV9jb21wYXJlX2ludDY0KGNvbnQgdm9pZCAqa2V5MSwgaW50IGtleWxlbjEsIGNvbnN0IHZvaWQgKmtleTIsIGludCBrZXlsZW4yKQoreworCWlmICgqKGludDY0X3QgKikga2V5MSA9PSAqKGludDY0X3QgKikga2V5MikKKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAoKihpbnQ2NF90ICopIGtleTEgPiAqKGludDY0X3QgKikga2V5MikKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQKK2J0cmVlX2NvbXBhcmVfdWludDY0KGNvbnQgdm9pZCAqa2V5MSwgaW50IGtleWxlbjEsCisJCSAgICAgY29uc3Qgdm9pZCAqa2V5MiwgaW50IGtleWxlbjIpCit7CisJaWYgKCoodV9pbnQ2NF90ICopIGtleTEgPT0gKih1X2ludDY0X3QgKikga2V5MikKKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAoKih1X2ludDY0X3QgKikga2V5MSA+ICoodV9pbnQ2NF90ICopIGtleTIpCisJCXJldHVybiAxOworCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50CitidHJlZV9jb21wYXJlX2Zsb2F0KGNvbnQgdm9pZCAqa2V5MSwgaW50IGtleWxlbjEsIGNvbnN0IHZvaWQgKmtleTIsIGludCBrZXlsZW4yKQoreworCWZsb2F0IHJlc3VsdCA9ICooZmxvYXQgKikga2V5MSAtICooZmxvYXQgKikga2V5MjsKKwlpZiAocmVzdWx0ID09IDAuMGYpCisJCXJldHVybiAwOworCisJcmV0dXJuIChyZXN1bHQgPCAwLjBmKSA/IC0xIDogMTsKK30KKworc3RhdGljIGludAorYnRyZWVfY29tcGFyZV9kb3VibGUoY29udCB2b2lkICprZXkxLCBpbnQga2V5bGVuMSwKKwkJICAgICBjb25zdCB2b2lkICprZXkyLCBpbnQga2V5bGVuMikKK3sKKwlkb3VibGUgcmVzdWx0ID0gKihkb3VibGUgKikga2V5MSAtICooZG91YmxlICopIGtleTI7CisJaWYgKHJlc3VsdCA9PSAwLjApCisJCXJldHVybiAwOworCisJcmV0dXJuIChyZXN1bHQgPCAwLjApID8gLTEgOiAxOworfQorI2VuZGlmCQkJCS8vMApkaWZmIC0tZ2l0IGEvZnMvYmVmcy9idHJlZS5oIGIvZnMvYmVmcy9idHJlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZTc4MWUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9iZWZzL2J0cmVlLmgKQEAgLTAsMCArMSwxMyBAQAorLyoKKyAqIGJ0cmVlLmgKKyAqIAorICovCisKKworaW50IGJlZnNfYnRyZWVfZmluZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2RhdGFfc3RyZWFtICogZHMsCisJCSAgICBjb25zdCBjaGFyICprZXksIGJlZnNfb2ZmX3QgKiB2YWx1ZSk7CisKK2ludCBiZWZzX2J0cmVlX3JlYWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYmVmc19kYXRhX3N0cmVhbSAqIGRzLAorCQkgICAgbG9mZl90IGtleV9ubywgc2l6ZV90IGJ1ZnNpemUsIGNoYXIgKmtleWJ1ZiwKKwkJICAgIHNpemVfdCAqIGtleXNpemUsIGJlZnNfb2ZmX3QgKiB2YWx1ZSk7CisKZGlmZiAtLWdpdCBhL2ZzL2JlZnMvZGF0YXN0cmVhbS5jIGIvZnMvYmVmcy9kYXRhc3RyZWFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg1ZjZiMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2JlZnMvZGF0YXN0cmVhbS5jCkBAIC0wLDAgKzEsNTI4IEBACisvKgorICogbGludXgvZnMvYmVmcy9kYXRhc3RyZWFtLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgV2lsbCBEeXNvbiA8d2lsbF9keXNvbkBwb2JveC5jb20+CisgKgorICogQmFzZWQgb24gcG9ydGlvbnMgb2YgZmlsZS5jIGJ5IE1ha290byBLYXRvIDxtX2thdG9AZ2EyLnNvLW5ldC5uZS5qcD4KKyAqCisgKiBNYW55IHRoYW5rcyB0byBEb21pbmljIEdpYW1wYW9sbywgYXV0aG9yIG9mICJQcmFjdGljYWwgRmlsZSBTeXN0ZW0KKyAqIERlc2lnbiB3aXRoIHRoZSBCZSBGaWxlIFN5c3RlbSIsIGZvciBzdWNoIGEgaGVscGZ1bCBib29rLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKKyNpbmNsdWRlICJiZWZzLmgiCisjaW5jbHVkZSAiZGF0YXN0cmVhbS5oIgorI2luY2x1ZGUgImlvLmgiCisjaW5jbHVkZSAiZW5kaWFuLmgiCisKK2NvbnN0IGJlZnNfaW5vZGVfYWRkciBCQURfSUFERFIgPSB7IDAsIDAsIDAgfTsKKworc3RhdGljIGludCBiZWZzX2ZpbmRfYnJ1bl9kaXJlY3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgYmVmc19kYXRhX3N0cmVhbSAqIGRhdGEsCisJCQkJIGJlZnNfYmxvY2tucl90IGJsb2Nrbm8sIGJlZnNfYmxvY2tfcnVuICogcnVuKTsKKworc3RhdGljIGludCBiZWZzX2ZpbmRfYnJ1bl9pbmRpcmVjdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgIGJlZnNfZGF0YV9zdHJlYW0gKiBkYXRhLAorCQkJCSAgIGJlZnNfYmxvY2tucl90IGJsb2Nrbm8sCisJCQkJICAgYmVmc19ibG9ja19ydW4gKiBydW4pOworCitzdGF0aWMgaW50IGJlZnNfZmluZF9icnVuX2RibGluZGlyZWN0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgICAgYmVmc19kYXRhX3N0cmVhbSAqIGRhdGEsCisJCQkJICAgICAgYmVmc19ibG9ja25yX3QgYmxvY2tubywKKwkJCQkgICAgICBiZWZzX2Jsb2NrX3J1biAqIHJ1bik7CisKKy8qKgorICogYmVmc19yZWFkX2RhdGFzdHJlYW0gLSBnZXQgYnVmZmVyX2hlYWQgY29udGFpbmluZyBkYXRhLCBzdGFydGluZyBmcm9tIHBvcy4KKyAqIEBzYjogRmlsZXN5c3RlbSBzdXBlcmJsb2NrCisgKiBAZHM6IGRhdGFzdHJlbSB0byBmaW5kIGRhdGEgd2l0aAorICogQHBvczogc3RhcnQgb2YgZGF0YQorICogQG9mZjogb2Zmc2V0IG9mIGRhdGEgaW4gYnVmZmVyX2hlYWQtPmJfZGF0YQorICoKKyAqIFJldHVybnMgcG9pbnRlciB0byBidWZmZXJfaGVhZCBjb250YWluaW5nIGRhdGEgc3RhcnRpbmcgd2l0aCBvZmZzZXQgQG9mZiwKKyAqIGlmIHlvdSBkb24ndCBuZWVkIHRvIGtub3cgb2Zmc2V0IGp1c3Qgc2V0IEBvZmYgPSBOVUxMLgorICovCitzdHJ1Y3QgYnVmZmVyX2hlYWQgKgorYmVmc19yZWFkX2RhdGFzdHJlYW0oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYmVmc19kYXRhX3N0cmVhbSAqIGRzLAorCQkgICAgIGJlZnNfb2ZmX3QgcG9zLCB1aW50ICogb2ZmKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCWJlZnNfYmxvY2tfcnVuIHJ1bjsKKwliZWZzX2Jsb2NrbnJfdCBibG9jazsJLyogYmxvY2sgY29yZXNwb25kaW5nIHRvIHBvcyAqLworCisJYmVmc19kZWJ1ZyhzYiwgIi0tLT4gYmVmc19yZWFkX2RhdGFzdHJlYW0oKSAlTHUiLCBwb3MpOworCWJsb2NrID0gcG9zID4+IEJFRlNfU0Ioc2IpLT5ibG9ja19zaGlmdDsKKwlpZiAob2ZmKQorCQkqb2ZmID0gcG9zIC0gKGJsb2NrIDw8IEJFRlNfU0Ioc2IpLT5ibG9ja19zaGlmdCk7CisKKwlpZiAoYmVmc19mYmxvY2syYnJ1bihzYiwgZHMsIGJsb2NrLCAmcnVuKSAhPSBCRUZTX09LKSB7CisJCWJlZnNfZXJyb3Ioc2IsICJCZUZTOiBFcnJvciBmaW5kaW5nIGRpc2sgYWRkciBvZiBibG9jayAlbHUiLAorCQkJICAgYmxvY2spOworCQliZWZzX2RlYnVnKHNiLCAiPC0tLSBiZWZzX3JlYWRfZGF0YXN0cmVhbSgpIEVSUk9SIik7CisJCXJldHVybiBOVUxMOworCX0KKwliaCA9IGJlZnNfYnJlYWRfaWFkZHIoc2IsIHJ1bik7CisJaWYgKCFiaCkgeworCQliZWZzX2Vycm9yKHNiLCAiQmVGUzogRXJyb3IgcmVhZGluZyBibG9jayAlbHUgZnJvbSBkYXRhc3RyZWFtIiwKKwkJCSAgIGJsb2NrKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJYmVmc19kZWJ1ZyhzYiwgIjwtLS0gYmVmc19yZWFkX2RhdGFzdHJlYW0oKSByZWFkIGRhdGEsIHN0YXJ0aW5nIGF0ICVMdSIsCisJCSAgIHBvcyk7CisKKwlyZXR1cm4gYmg7Cit9CisKKy8qCisgKiBUYWtlcyBhIGZpbGUgcG9zaXRpb24gYW5kIGdpdmVzIGJhY2sgYSBicnVuIHdobydzIHN0YXJ0aW5nIGJsb2NrCisgKiBpcyBibG9jayBudW1iZXIgZmJsb2NrIG9mIHRoZSBmaWxlLgorICogCisgKiBSZXR1cm5zIEJFRlNfT0sgb3IgQkVGU19FUlIuCisgKiAKKyAqIENhbGxzIHNwZWNpYWxpemVkIGZ1bmN0aW9ucyBmb3IgZWFjaCBvZiB0aGUgdGhyZWUgcG9zc2libGUKKyAqIGRhdGFzdHJlYW0gcmVnaW9ucy4KKyAqCisgKiAyMDAxLTExLTE1IFdpbGwgRHlzb24KKyAqLworaW50CitiZWZzX2ZibG9jazJicnVuKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGJlZnNfZGF0YV9zdHJlYW0gKiBkYXRhLAorCQkgYmVmc19ibG9ja25yX3QgZmJsb2NrLCBiZWZzX2Jsb2NrX3J1biAqIHJ1bikKK3sKKwlpbnQgZXJyOworCWJlZnNfb2ZmX3QgcG9zID0gZmJsb2NrIDw8IEJFRlNfU0Ioc2IpLT5ibG9ja19zaGlmdDsKKworCWlmIChwb3MgPCBkYXRhLT5tYXhfZGlyZWN0X3JhbmdlKSB7CisJCWVyciA9IGJlZnNfZmluZF9icnVuX2RpcmVjdChzYiwgZGF0YSwgZmJsb2NrLCBydW4pOworCisJfSBlbHNlIGlmIChwb3MgPCBkYXRhLT5tYXhfaW5kaXJlY3RfcmFuZ2UpIHsKKwkJZXJyID0gYmVmc19maW5kX2JydW5faW5kaXJlY3Qoc2IsIGRhdGEsIGZibG9jaywgcnVuKTsKKworCX0gZWxzZSBpZiAocG9zIDwgZGF0YS0+bWF4X2RvdWJsZV9pbmRpcmVjdF9yYW5nZSkgeworCQllcnIgPSBiZWZzX2ZpbmRfYnJ1bl9kYmxpbmRpcmVjdChzYiwgZGF0YSwgZmJsb2NrLCBydW4pOworCisJfSBlbHNlIHsKKwkJYmVmc19lcnJvcihzYiwKKwkJCSAgICJiZWZzX2ZibG9jazJicnVuKCkgd2FzIGFza2VkIHRvIGZpbmQgYmxvY2sgJWx1LCAiCisJCQkgICAid2hpY2ggaXMgbm90IG1hcHBlZCBieSB0aGUgZGF0YXN0cmVhbVxuIiwgZmJsb2NrKTsKKwkJZXJyID0gQkVGU19FUlI7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogYmVmc19yZWFkX2xzbXlsaW5rIC0gcmVhZCBsb25nIHN5bWxpbmsgZnJvbSBkYXRhc3RyZWFtLgorICogQHNiOiBGaWxlc3lzdGVtIHN1cGVyYmxvY2sgCisgKiBAZHM6IERhdGFzdHJlbSB0byByZWFkIGZyb20KKyAqIEBidWY6IEJ1ZmZlciBpbiB3aWNoIHRvIHBsYWNlIGxvbmcgc3ltbGluayBkYXRhCisgKiBAbGVuOiBMZW5ndGggb2YgdGhlIGxvbmcgc3ltbGluayBpbiBieXRlcworICoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkCisgKi8KK3NpemVfdAorYmVmc19yZWFkX2xzeW1saW5rKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBiZWZzX2RhdGFfc3RyZWFtICogZHMsIHZvaWQgKmJ1ZmYsCisJCSAgIGJlZnNfb2ZmX3QgbGVuKQoreworCWJlZnNfb2ZmX3QgYnl0ZXNfcmVhZCA9IDA7CS8qIGJ5dGVzIHJlYWRlZCAqLworCXUxNiBwbGVuOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCWJlZnNfZGVidWcoc2IsICItLS0+IGJlZnNfcmVhZF9sc3ltbGluaygpIGxlbmd0aDogJUx1IiwgbGVuKTsKKworCXdoaWxlIChieXRlc19yZWFkIDwgbGVuKSB7CisJCWJoID0gYmVmc19yZWFkX2RhdGFzdHJlYW0oc2IsIGRzLCBieXRlc19yZWFkLCBOVUxMKTsKKwkJaWYgKCFiaCkgeworCQkJYmVmc19lcnJvcihzYiwgIkJlRlM6IEVycm9yIHJlYWRpbmcgZGF0YXN0cmVhbSBibG9jayAiCisJCQkJICAgInN0YXJ0aW5nIGZyb20gJUx1IiwgYnl0ZXNfcmVhZCk7CisJCQliZWZzX2RlYnVnKHNiLCAiPC0tLSBiZWZzX3JlYWRfbHN5bWxpbmsoKSBFUlJPUiIpOworCQkJcmV0dXJuIGJ5dGVzX3JlYWQ7CisKKwkJfQorCQlwbGVuID0gKChieXRlc19yZWFkICsgQkVGU19TQihzYiktPmJsb2NrX3NpemUpIDwgbGVuKSA/CisJCSAgICBCRUZTX1NCKHNiKS0+YmxvY2tfc2l6ZSA6IGxlbiAtIGJ5dGVzX3JlYWQ7CisJCW1lbWNweShidWZmICsgYnl0ZXNfcmVhZCwgYmgtPmJfZGF0YSwgcGxlbik7CisJCWJyZWxzZShiaCk7CisJCWJ5dGVzX3JlYWQgKz0gcGxlbjsKKwl9CisKKwliZWZzX2RlYnVnKHNiLCAiPC0tLSBiZWZzX3JlYWRfbHN5bWxpbmsoKSByZWFkICV1IGJ5dGVzIiwgYnl0ZXNfcmVhZCk7CisJcmV0dXJuIGJ5dGVzX3JlYWQ7Cit9CisKKy8qKgorICogYmVmc19jb3VudF9ibG9ja3MgLSBibG9ja3MgdXNlZCBieSBhIGZpbGUKKyAqIEBzYjogRmlsZXN5c3RlbSBzdXBlcmJsb2NrCisgKiBAZHM6IERhdGFzdHJlYW0gb2YgdGhlIGZpbGUKKyAqCisgKiBDb3VudHMgdGhlIG51bWJlciBvZiBmcyBibG9ja3MgdGhhdCB0aGUgZmlsZSByZXByZXNlbnRlZCBieQorICogaW5vZGUgb2NjdXBpZXMgb24gdGhlIGZpbGVzeXN0ZW0sIGNvdW50aW5nIGJvdGggcmVndWxhciBmaWxlCisgKiBkYXRhIGFuZCBmaWxlc3lzdGVtIG1ldGFkYXRhIChhbmQgZXZlbnR1YWxseSBhdHRyaWJ1dGUgZGF0YQorICogd2hlbiB3ZSBzdXBwb3J0IGF0dHJpYnV0ZXMpCisqLworCitiZWZzX2Jsb2NrbnJfdAorYmVmc19jb3VudF9ibG9ja3Moc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIGJlZnNfZGF0YV9zdHJlYW0gKiBkcykKK3sKKwliZWZzX2Jsb2NrbnJfdCBibG9ja3M7CisJYmVmc19ibG9ja25yX3QgZGF0YWJsb2NrczsJLyogRmlsZSBkYXRhIGJsb2NrcyAqLworCWJlZnNfYmxvY2tucl90IG1ldGFibG9ja3M7CS8qIEZTIG1ldGFkYXRhIGJsb2NrcyAqLworCWJlZnNfc2JfaW5mbyAqYmVmc19zYiA9IEJFRlNfU0Ioc2IpOworCisJYmVmc19kZWJ1ZyhzYiwgIi0tLT4gYmVmc19jb3VudF9ibG9ja3MoKSIpOworCisJZGF0YWJsb2NrcyA9IGRzLT5zaXplID4+IGJlZnNfc2ItPmJsb2NrX3NoaWZ0OworCWlmIChkcy0+c2l6ZSAmIChiZWZzX3NiLT5ibG9ja19zaXplIC0gMSkpCisJCWRhdGFibG9ja3MgKz0gMTsKKworCW1ldGFibG9ja3MgPSAxOwkJLyogU3RhcnQgd2l0aCAxIGJsb2NrIGZvciBpbm9kZSAqLworCisJLyogU2l6ZSBvZiBpbmRpcmVjdCBibG9jayAqLworCWlmIChkcy0+c2l6ZSA+IGRzLT5tYXhfZGlyZWN0X3JhbmdlKQorCQltZXRhYmxvY2tzICs9IGRzLT5pbmRpcmVjdC5sZW47CisKKwkvKgorCSAgIERvdWJsZSBpbmRpciBibG9jaywgcGx1cyBhbGwgdGhlIGluZGlyZWN0IGJsb2NrcyBpdCBtYXBwcworCSAgIEluIHRoZSBkb3VibGUtaW5kaXJlY3QgcmFuZ2UsIGFsbCBibG9jayBydW5zIG9mIGRhdGEgYXJlCisJICAgQkVGU19EQkxJTkRJUl9CUlVOX0xFTiBibG9ja3MgbG9uZy4gVGhlcmVmb3JlLCB3ZSBrbm93IAorCSAgIGhvdyBtYW55IGRhdGEgYmxvY2sgcnVucyBhcmUgaW4gdGhlIGRvdWJsZS1pbmRpcmVjdCByZWdpb24sCisJICAgYW5kIGZyb20gdGhhdCB3ZSBrbm93IGhvdyBtYW55IGluZGlyZWN0IGJsb2NrcyBpdCB0YWtlcyB0bworCSAgIG1hcCB0aGVtLiBXZSBhc3N1bWUgdGhhdCB0aGUgaW5kaXJlY3QgYmxvY2tzIGFyZSBhbHNvCisJICAgQkVGU19EQkxJTkRJUl9CUlVOX0xFTiBibG9ja3MgbG9uZy4KKwkgKi8KKwlpZiAoZHMtPnNpemUgPiBkcy0+bWF4X2luZGlyZWN0X3JhbmdlICYmIGRzLT5tYXhfaW5kaXJlY3RfcmFuZ2UgIT0gMCkgeworCQl1aW50IGRibF9ieXRlczsKKwkJdWludCBkYmxfYnJ1bnM7CisJCXVpbnQgaW5kaXJibG9ja3M7CisKKwkJZGJsX2J5dGVzID0KKwkJICAgIGRzLT5tYXhfZG91YmxlX2luZGlyZWN0X3JhbmdlIC0gZHMtPm1heF9pbmRpcmVjdF9yYW5nZTsKKwkJZGJsX2JydW5zID0KKwkJICAgIGRibF9ieXRlcyAvIChiZWZzX3NiLT5ibG9ja19zaXplICogQkVGU19EQkxJTkRJUl9CUlVOX0xFTik7CisJCWluZGlyYmxvY2tzID0gZGJsX2JydW5zIC8gYmVmc19pYWRkcnNfcGVyX2Jsb2NrKHNiKTsKKworCQltZXRhYmxvY2tzICs9IGRzLT5kb3VibGVfaW5kaXJlY3QubGVuOworCQltZXRhYmxvY2tzICs9IGluZGlyYmxvY2tzOworCX0KKworCWJsb2NrcyA9IGRhdGFibG9ja3MgKyBtZXRhYmxvY2tzOworCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfY291bnRfYmxvY2tzKCkgJXUgYmxvY2tzIiwgYmxvY2tzKTsKKworCXJldHVybiBibG9ja3M7Cit9CisKKy8qCisJRmluZHMgdGhlIGJsb2NrIHJ1biB0aGF0IHN0YXJ0cyBhdCBmaWxlIGJsb2NrIG51bWJlciBibG9ja25vCisJaW4gdGhlIGZpbGUgcmVwcmVzZW50ZWQgYnkgdGhlIGRhdGFzdHJlYW0gZGF0YSwgaWYgdGhhdCAKKwlibG9ja25vIGlzIGluIHRoZSBkaXJlY3QgcmVnaW9uIG9mIHRoZSBkYXRhc3RyZWFtLgorCQorCXNiOiB0aGUgc3VwZXJibG9jaworCWRhdGE6IHRoZSBkYXRhc3RyZWFtCisJYmxvY2tubzogdGhlIGJsb2NrbnVtYmVyIHRvIGZpbmQKKwlydW46IFRoZSBmb3VuZCBydW4gaXMgcGFzc2VkIGJhY2sgdGhyb3VnaCB0aGlzIHBvaW50ZXIKKwkKKwlSZXR1cm4gdmFsdWUgaXMgQkVGU19PSyBpZiB0aGUgYmxvY2tydW4gaXMgZm91bmQsIEJFRlNfRVJSCisJb3RoZXJ3aXNlLgorCQorCUFsZ29yaXRobToKKwlMaW5lYXIgc2VhcmNoLiBDaGVja3MgZWFjaCBlbGVtZW50IG9mIGFycmF5W10gdG8gc2VlIGlmIGl0CisJY29udGFpbnMgdGhlIGJsb2Nrbm8tdGggZmlsZXN5c3RlbSBibG9jay4gVGhpcyBpcyBuZWNlc3NhcnkKKwliZWNhdXNlIHRoZSBibG9jayBydW5zIG1hcCB2YXJpYWJsZSBhbW91bnRzIG9mIGRhdGEuIFNpbXBseQorCWtlZXBzIGEgY291bnQgb2YgdGhlIG51bWJlciBvZiBibG9ja3Mgc2VhcmNoZWQgc28gZmFyIChzdW0pLAorCWluY3JlbWVudGluZyB0aGlzIGJ5IHRoZSBsZW5ndGggb2YgZWFjaCBibG9jayBydW4gYXMgd2UgY29tZQorCWFjcm9zcyBpdC4gQWRkcyBzdW0gdG8gKmNvdW50IGJlZm9yZSByZXR1cm5pbmcgKHRoaXMgaXMgc28KKwl5b3UgY2FuIHNlYXJjaCBtdWx0aXBsZSBhcnJheXMgdGhhdCBhcmUgbG9naWNhbHkgb25lIGFycmF5LAorCWFzIGluIHRoZSBpbmRpcmVjdCByZWdpb24gY29kZSkuCisJCisJV2hlbi9pZiBibG9ja25vIGlzIGZvdW5kLCBpZiBibG9ja25vIGlzIGluc2lkZSBvZiBhIGJsb2NrIAorCXJ1biBhcyBzdG9yZWQgb24gZGlzaywgd2Ugb2Zmc2V0IHRoZSBzdGFydCBhbmQgbGVuZ2h0IG1lbWJlcnMgCisJb2YgdGhlIGJsb2NrIHJ1biwgc28gdGhhdCBibG9ja25vIGlzIHRoZSBzdGFydCBhbmQgbGVuIGlzCisJc3RpbGwgdmFsaWQgKHRoZSBydW4gZW5kcyBpbiB0aGUgc2FtZSBwbGFjZSkuCisJCisJMjAwMS0xMS0xNSBXaWxsIER5c29uCisqLworc3RhdGljIGludAorYmVmc19maW5kX2JydW5fZGlyZWN0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGJlZnNfZGF0YV9zdHJlYW0gKiBkYXRhLAorCQkgICAgICBiZWZzX2Jsb2NrbnJfdCBibG9ja25vLCBiZWZzX2Jsb2NrX3J1biAqIHJ1bikKK3sKKwlpbnQgaTsKKwliZWZzX2Jsb2NrX3J1biAqYXJyYXkgPSBkYXRhLT5kaXJlY3Q7CisJYmVmc19ibG9ja25yX3Qgc3VtOworCWJlZnNfYmxvY2tucl90IG1heF9ibG9jayA9CisJICAgIGRhdGEtPm1heF9kaXJlY3RfcmFuZ2UgPj4gQkVGU19TQihzYiktPmJsb2NrX3NoaWZ0OworCisJYmVmc19kZWJ1ZyhzYiwgIi0tLT4gYmVmc19maW5kX2JydW5fZGlyZWN0KCksIGZpbmQgJWx1IiwgYmxvY2tubyk7CisKKwlpZiAoYmxvY2tubyA+IG1heF9ibG9jaykgeworCQliZWZzX2Vycm9yKHNiLCAiYmVmc19maW5kX2JydW5fZGlyZWN0KCkgcGFzc2VkIGJsb2NrIG91dHNpZGUgb2YiCisJCQkgICAiZGlyZWN0IHJlZ2lvbiIpOworCQlyZXR1cm4gQkVGU19FUlI7CisJfQorCisJZm9yIChpID0gMCwgc3VtID0gMDsgaSA8IEJFRlNfTlVNX0RJUkVDVF9CTE9DS1M7CisJICAgICBzdW0gKz0gYXJyYXlbaV0ubGVuLCBpKyspIHsKKwkJaWYgKGJsb2Nrbm8gPj0gc3VtICYmIGJsb2Nrbm8gPCBzdW0gKyAoYXJyYXlbaV0ubGVuKSkgeworCQkJaW50IG9mZnNldCA9IGJsb2Nrbm8gLSBzdW07CisJCQlydW4tPmFsbG9jYXRpb25fZ3JvdXAgPSBhcnJheVtpXS5hbGxvY2F0aW9uX2dyb3VwOworCQkJcnVuLT5zdGFydCA9IGFycmF5W2ldLnN0YXJ0ICsgb2Zmc2V0OworCQkJcnVuLT5sZW4gPSBhcnJheVtpXS5sZW4gLSBvZmZzZXQ7CisKKwkJCWJlZnNfZGVidWcoc2IsICItLS0+IGJlZnNfZmluZF9icnVuX2RpcmVjdCgpLCAiCisJCQkJICAgImZvdW5kICVsdSBhdCBkaXJlY3RbJWRdIiwgYmxvY2tubywgaSk7CisJCQlyZXR1cm4gQkVGU19PSzsKKwkJfQorCX0KKworCWJlZnNfZGVidWcoc2IsICItLS0+IGJlZnNfZmluZF9icnVuX2RpcmVjdCgpIEVSUk9SIik7CisJcmV0dXJuIEJFRlNfRVJSOworfQorCisvKgorCUZpbmRzIHRoZSBibG9jayBydW4gdGhhdCBzdGFydHMgYXQgZmlsZSBibG9jayBudW1iZXIgYmxvY2tubworCWluIHRoZSBmaWxlIHJlcHJlc2VudGVkIGJ5IHRoZSBkYXRhc3RyZWFtIGRhdGEsIGlmIHRoYXQgCisJYmxvY2tubyBpcyBpbiB0aGUgaW5kaXJlY3QgcmVnaW9uIG9mIHRoZSBkYXRhc3RyZWFtLgorCQorCXNiOiB0aGUgc3VwZXJibG9jaworCWRhdGE6IHRoZSBkYXRhc3RyZWFtCisJYmxvY2tubzogdGhlIGJsb2NrbnVtYmVyIHRvIGZpbmQKKwlydW46IFRoZSBmb3VuZCBydW4gaXMgcGFzc2VkIGJhY2sgdGhyb3VnaCB0aGlzIHBvaW50ZXIKKwkKKwlSZXR1cm4gdmFsdWUgaXMgQkVGU19PSyBpZiB0aGUgYmxvY2tydW4gaXMgZm91bmQsIEJFRlNfRVJSCisJb3RoZXJ3aXNlLgorCQorCUFsZ29yaXRobToKKwlGb3IgZWFjaCBibG9jayBpbiB0aGUgaW5kaXJlY3QgcnVuIG9mIHRoZSBkYXRhc3RyZWFtLCByZWFkCisJaXQgaW4gYW5kIHNlYXJjaCB0aHJvdWdoIGl0IGZvcglzZWFyY2hfYmxrLgorCQorCVhYWDoKKwlSZWFsbHkgc2hvdWxkIGNoZWNrIHRvIG1ha2Ugc3VyZSBibG9ja25vIGlzIGluc2lkZSBpbmRpcmVjdAorCXJlZ2lvbi4KKwkKKwkyMDAxLTExLTE1IFdpbGwgRHlzb24KKyovCitzdGF0aWMgaW50CitiZWZzX2ZpbmRfYnJ1bl9pbmRpcmVjdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJYmVmc19kYXRhX3N0cmVhbSAqIGRhdGEsIGJlZnNfYmxvY2tucl90IGJsb2Nrbm8sCisJCQliZWZzX2Jsb2NrX3J1biAqIHJ1bikKK3sKKwlpbnQgaSwgajsKKwliZWZzX2Jsb2NrbnJfdCBzdW0gPSAwOworCWJlZnNfYmxvY2tucl90IGluZGlyX3N0YXJ0X2JsazsKKwliZWZzX2Jsb2NrbnJfdCBzZWFyY2hfYmxrOworCXN0cnVjdCBidWZmZXJfaGVhZCAqaW5kaXJibG9jazsKKwliZWZzX2Jsb2NrX3J1biAqYXJyYXk7CisKKwliZWZzX2Jsb2NrX3J1biBpbmRpcmVjdCA9IGRhdGEtPmluZGlyZWN0OworCWJlZnNfYmxvY2tucl90IGluZGlyYmxvY2tubyA9IGlhZGRyMmJsb2Nrbm8oc2IsICZpbmRpcmVjdCk7CisJaW50IGFycmF5bGVuID0gYmVmc19pYWRkcnNfcGVyX2Jsb2NrKHNiKTsKKworCWJlZnNfZGVidWcoc2IsICItLS0+IGJlZnNfZmluZF9icnVuX2luZGlyZWN0KCksIGZpbmQgJWx1IiwgYmxvY2tubyk7CisKKwlpbmRpcl9zdGFydF9ibGsgPSBkYXRhLT5tYXhfZGlyZWN0X3JhbmdlID4+IEJFRlNfU0Ioc2IpLT5ibG9ja19zaGlmdDsKKwlzZWFyY2hfYmxrID0gYmxvY2tubyAtIGluZGlyX3N0YXJ0X2JsazsKKworCS8qIEV4YW1pbmUgYmxvY2tzIG9mIHRoZSBpbmRpcmVjdCBydW4gb25lIGF0IGEgdGltZSAqLworCWZvciAoaSA9IDA7IGkgPCBpbmRpcmVjdC5sZW47IGkrKykgeworCQlpbmRpcmJsb2NrID0gYmVmc19icmVhZChzYiwgaW5kaXJibG9ja25vICsgaSk7CisJCWlmIChpbmRpcmJsb2NrID09IE5VTEwpIHsKKwkJCWJlZnNfZGVidWcoc2IsCisJCQkJICAgIi0tLT4gYmVmc19maW5kX2JydW5faW5kaXJlY3QoKSBmYWlsZWQgdG8gIgorCQkJCSAgICJyZWFkIGRpc2sgYmxvY2sgJWx1IGZyb20gdGhlIGluZGlyZWN0IGJydW4iLAorCQkJCSAgIGluZGlyYmxvY2tubyArIGkpOworCQkJcmV0dXJuIEJFRlNfRVJSOworCQl9CisKKwkJYXJyYXkgPSAoYmVmc19ibG9ja19ydW4gKikgaW5kaXJibG9jay0+Yl9kYXRhOworCisJCWZvciAoaiA9IDA7IGogPCBhcnJheWxlbjsgKytqKSB7CisJCQlpbnQgbGVuID0gZnMxNl90b19jcHUoc2IsIGFycmF5W2pdLmxlbik7CisKKwkJCWlmIChzZWFyY2hfYmxrID49IHN1bSAmJiBzZWFyY2hfYmxrIDwgc3VtICsgbGVuKSB7CisJCQkJaW50IG9mZnNldCA9IHNlYXJjaF9ibGsgLSBzdW07CisJCQkJcnVuLT5hbGxvY2F0aW9uX2dyb3VwID0KKwkJCQkgICAgZnMzMl90b19jcHUoc2IsIGFycmF5W2pdLmFsbG9jYXRpb25fZ3JvdXApOworCQkJCXJ1bi0+c3RhcnQgPQorCQkJCSAgICBmczE2X3RvX2NwdShzYiwgYXJyYXlbal0uc3RhcnQpICsgb2Zmc2V0OworCQkJCXJ1bi0+bGVuID0KKwkJCQkgICAgZnMxNl90b19jcHUoc2IsIGFycmF5W2pdLmxlbikgLSBvZmZzZXQ7CisKKwkJCQlicmVsc2UoaW5kaXJibG9jayk7CisJCQkJYmVmc19kZWJ1ZyhzYiwKKwkJCQkJICAgIjwtLS0gYmVmc19maW5kX2JydW5faW5kaXJlY3QoKSBmb3VuZCAiCisJCQkJCSAgICJmaWxlIGJsb2NrICVsdSBhdCBpbmRpcmVjdFslZF0iLAorCQkJCQkgICBibG9ja25vLCBqICsgKGkgKiBhcnJheWxlbikpOworCQkJCXJldHVybiBCRUZTX09LOworCQkJfQorCQkJc3VtICs9IGxlbjsKKwkJfQorCisJCWJyZWxzZShpbmRpcmJsb2NrKTsKKwl9CisKKwkvKiBPbmx5IGZhbGx0aHJvdWdoIGlzIGFuIGVycm9yICovCisJYmVmc19lcnJvcihzYiwgIkJlRlM6IGJlZnNfZmluZF9icnVuX2luZGlyZWN0KCkgZmFpbGVkIHRvIGZpbmQgIgorCQkgICAiZmlsZSBibG9jayAlbHUiLCBibG9ja25vKTsKKworCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfZmluZF9icnVuX2luZGlyZWN0KCkgRVJST1IiKTsKKwlyZXR1cm4gQkVGU19FUlI7Cit9CisKKy8qCisJRmluZHMgdGhlIGJsb2NrIHJ1biB0aGF0IHN0YXJ0cyBhdCBmaWxlIGJsb2NrIG51bWJlciBibG9ja25vCisJaW4gdGhlIGZpbGUgcmVwcmVzZW50ZWQgYnkgdGhlIGRhdGFzdHJlYW0gZGF0YSwgaWYgdGhhdCAKKwlibG9ja25vIGlzIGluIHRoZSBkb3VibGUtaW5kaXJlY3QgcmVnaW9uIG9mIHRoZSBkYXRhc3RyZWFtLgorCQorCXNiOiB0aGUgc3VwZXJibG9jaworCWRhdGE6IHRoZSBkYXRhc3RyZWFtCisJYmxvY2tubzogdGhlIGJsb2NrbnVtYmVyIHRvIGZpbmQKKwlydW46IFRoZSBmb3VuZCBydW4gaXMgcGFzc2VkIGJhY2sgdGhyb3VnaCB0aGlzIHBvaW50ZXIKKwkKKwlSZXR1cm4gdmFsdWUgaXMgQkVGU19PSyBpZiB0aGUgYmxvY2tydW4gaXMgZm91bmQsIEJFRlNfRVJSCisJb3RoZXJ3aXNlLgorCQorCUFsZ29yaXRobToKKwlUaGUgYmxvY2sgcnVucyBpbiB0aGUgZG91YmxlLWluZGlyZWN0IHJlZ2lvbiBhcmUgZGlmZmVyZW50LgorCVRoZXkgYXJlIGFsd2F5cyBhbGxvY2F0ZWQgNCBmcyBibG9ja3MgYXQgYSB0aW1lLCBzbyBlYWNoCisJYmxvY2sgcnVuIG1hcHMgYSBjb25zdGFudCBhbW91bnQgb2YgZmlsZSBkYXRhLiBUaGlzIG1lYW5zCisJdGhhdCB3ZSBjYW4gZGlyZWN0bHkgY2FsY3VsYXRlIGhvdyBtYW55IGJsb2NrIHJ1bnMgaW50byB0aGUKKwlkb3VibGUtaW5kaXJlY3QgcmVnaW9uIHdlIG5lZWQgdG8gZ28gdG8gZ2V0IHRvIHRoZSBvbmUgdGhhdAorCW1hcHMgYSBwYXJ0aWN1bGFyIGZpbGVzeXN0ZW0gYmxvY2suCisJCisJV2UgZG8gdGhpcyBpbiB0d28gc3RhZ2VzLiBGaXJzdCB3ZSBjYWxjdWxhdGUgd2hpY2ggb2YgdGhlCisJaW5vZGUgYWRkcmVzc2VzIGluIHRoZSBkb3VibGUtaW5kaXJlY3QgYmxvY2sgd2lsbCBwb2ludCB1cworCXRvIHRoZSBpbmRpcmVjdCBibG9jayB0aGF0IGNvbnRhaW5zIHRoZSBtYXBwaW5nIGZvciB0aGUgZGF0YSwKKwl0aGVuIHdlIGNhbGN1bGF0ZSB3aGljaCBvZiB0aGUgaW5vZGUgYWRkcmVzc2VzIGluIHRoYXQgCisJaW5kaXJlY3QgYmxvY2sgbWFwcyB0aGUgZGF0YSBibG9jayB3ZSBhcmUgYWZ0ZXIuCisJCisJT2gsIGFuZCBvbmNlIHdlJ3ZlIGRvbmUgdGhhdCwgd2UgYWN0dWFsbHkgcmVhZCBpbiB0aGUgYmxvY2tzIAorCXRoYXQgY29udGFpbiB0aGUgaW5vZGUgYWRkcmVzc2VzIHdlIGNhbGN1bGF0ZWQgYWJvdmUuIEV2ZW4gCisJdGhvdWdoIHRoZSBkb3VibGUtaW5kaXJlY3QgcnVuIG1heSBiZSBzZXZlcmFsIGJsb2NrcyBsb25nLCAKKwl3ZSBjYW4gY2FsY3VsYXRlIHdoaWNoIG9mIHRob3NlIGJsb2NrcyB3aWxsIGNvbnRhaW4gdGhlIGluZGV4CisJd2UgYXJlIGFmdGVyIGFuZCBvbmx5IHJlYWQgdGhhdCBvbmUuIFdlIHRoZW4gZm9sbG93IGl0IHRvIAorCXRoZSBpbmRpcmVjdCBibG9jayBhbmQgcGVyZm9ybSBhICBzaW1pbGFyIHByb2Nlc3MgdG8gZmluZAorCXRoZSBhY3R1YWwgYmxvY2sgcnVuIHRoYXQgbWFwcyB0aGUgZGF0YSBibG9jayB3ZSBhcmUgaW50ZXJlc3RlZAorCWluLgorCQorCVRoZW4gd2Ugb2Zmc2V0IHRoZSBydW4gYXMgaW4gYmVmc19maW5kX2JydW5fYXJyYXkoKSBhbmQgd2UgYXJlIAorCWRvbmUuCisJCisJMjAwMS0xMS0xNSBXaWxsIER5c29uCisqLworc3RhdGljIGludAorYmVmc19maW5kX2JydW5fZGJsaW5kaXJlY3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCSAgIGJlZnNfZGF0YV9zdHJlYW0gKiBkYXRhLCBiZWZzX2Jsb2NrbnJfdCBibG9ja25vLAorCQkJICAgYmVmc19ibG9ja19ydW4gKiBydW4pCit7CisJaW50IGRibGluZGlyX2luZHg7CisJaW50IGluZGlyX2luZHg7CisJaW50IG9mZnNldDsKKwlpbnQgZGJsX3doaWNoX2Jsb2NrOworCWludCB3aGljaF9ibG9jazsKKwlpbnQgZGJsX2Jsb2NrX2luZHg7CisJaW50IGJsb2NrX2luZHg7CisJb2ZmX3QgZGJsaW5kaXJfbGVmdG92ZXI7CisJYmVmc19ibG9ja25yX3QgYmxvY2tub19hdF9ydW5fc3RhcnQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkYmxfaW5kaXJfYmxvY2s7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICppbmRpcl9ibG9jazsKKwliZWZzX2Jsb2NrX3J1biBpbmRpcl9ydW47CisJYmVmc19pbm9kZV9hZGRyICppYWRkcl9hcnJheSA9IE5VTEw7CisJYmVmc19zYl9pbmZvICpiZWZzX3NiID0gQkVGU19TQihzYik7CisKKwliZWZzX2Jsb2NrbnJfdCBpbmRpcl9zdGFydF9ibGsgPQorCSAgICBkYXRhLT5tYXhfaW5kaXJlY3RfcmFuZ2UgPj4gYmVmc19zYi0+YmxvY2tfc2hpZnQ7CisKKwlvZmZfdCBkYmxfaW5kaXJfb2ZmID0gYmxvY2tubyAtIGluZGlyX3N0YXJ0X2JsazsKKworCS8qIG51bWJlciBvZiBkYXRhIGJsb2NrcyBtYXBwZWQgYnkgZWFjaCBvZiB0aGUgaWFkZHJzIGluCisJICogdGhlIGluZGlyZWN0IGJsb2NrIHBvaW50ZWQgdG8gYnkgdGhlIGRvdWJsZSBpbmRpcmVjdCBibG9jaworCSAqLworCXNpemVfdCBpYmxrbGVuID0gQkVGU19EQkxJTkRJUl9CUlVOX0xFTjsKKworCS8qIG51bWJlciBvZiBkYXRhIGJsb2NrcyBtYXBwZWQgYnkgZWFjaCBvZiB0aGUgaWFkZHJzIGluCisJICogdGhlIGRvdWJsZSBpbmRpcmVjdCBibG9jaworCSAqLworCXNpemVfdCBkaWJsa2xlbiA9IGlibGtsZW4gKiBiZWZzX2lhZGRyc19wZXJfYmxvY2soc2IpCisJICAgICogQkVGU19EQkxJTkRJUl9CUlVOX0xFTjsKKworCWJlZnNfZGVidWcoc2IsICItLS0+IGJlZnNfZmluZF9icnVuX2RibGluZGlyZWN0KCkgZmluZCAlbHUiLCBibG9ja25vKTsKKworCS8qIEZpcnN0LCBkaXNjb3ZlciB3aGljaCBvZiB0aGUgZG91YmxlX2luZGlyLT5pbmRpciBibG9ja3MKKwkgKiBjb250YWlucyBwb3MuIFRoZW4gZmlndXJlIG91dCBob3cgbXVjaCBvZiBwb3MgdGhhdAorCSAqIGFjY291bnRlZCBmb3IuIFRoZW4gZGlzY292ZXIgd2hpY2ggb2YgdGhlIGlhZGRycyBpbgorCSAqIHRoZSBpbmRpcmVjdCBibG9jayBjb250YWlucyBwb3MuCisJICovCisKKwlkYmxpbmRpcl9pbmR4ID0gZGJsX2luZGlyX29mZiAvIGRpYmxrbGVuOworCWRibGluZGlyX2xlZnRvdmVyID0gZGJsX2luZGlyX29mZiAlIGRpYmxrbGVuOworCWluZGlyX2luZHggPSBkYmxpbmRpcl9sZWZ0b3ZlciAvIGRpYmxrbGVuOworCisJLyogUmVhZCBkb3VibGUgaW5kaXJlY3QgYmxvY2sgKi8KKwlkYmxfd2hpY2hfYmxvY2sgPSBkYmxpbmRpcl9pbmR4IC8gYmVmc19pYWRkcnNfcGVyX2Jsb2NrKHNiKTsKKwlpZiAoZGJsX3doaWNoX2Jsb2NrID4gZGF0YS0+ZG91YmxlX2luZGlyZWN0LmxlbikgeworCQliZWZzX2Vycm9yKHNiLCAiVGhlIGRvdWJsZS1pbmRpcmVjdCBpbmRleCBjYWxjdWxhdGVkIGJ5ICIKKwkJCSAgICJiZWZzX3JlYWRfYnJ1bl9kYmxpbmRpcmVjdCgpLCAlZCwgaXMgb3V0c2lkZSB0aGUgcmFuZ2UgIgorCQkJICAgIm9mIHRoZSBkb3VibGUtaW5kaXJlY3QgYmxvY2siLCBkYmxpbmRpcl9pbmR4KTsKKwkJcmV0dXJuIEJFRlNfRVJSOworCX0KKworCWRibF9pbmRpcl9ibG9jayA9CisJICAgIGJlZnNfYnJlYWQoc2IsIGlhZGRyMmJsb2Nrbm8oc2IsICZkYXRhLT5kb3VibGVfaW5kaXJlY3QpICsKKwkJCQkJZGJsX3doaWNoX2Jsb2NrKTsKKwlpZiAoZGJsX2luZGlyX2Jsb2NrID09IE5VTEwpIHsKKwkJYmVmc19lcnJvcihzYiwgImJlZnNfcmVhZF9icnVuX2RibGluZGlyZWN0KCkgY291bGRuJ3QgcmVhZCB0aGUgIgorCQkJICAgImRvdWJsZS1pbmRpcmVjdCBibG9jayBhdCBibG9ja25vICVsdSIsCisJCQkgICBpYWRkcjJibG9ja25vKHNiLAorCQkJCQkgJmRhdGEtPmRvdWJsZV9pbmRpcmVjdCkgKworCQkJICAgZGJsX3doaWNoX2Jsb2NrKTsKKwkJYnJlbHNlKGRibF9pbmRpcl9ibG9jayk7CisJCXJldHVybiBCRUZTX0VSUjsKKwl9CisKKwlkYmxfYmxvY2tfaW5keCA9CisJICAgIGRibGluZGlyX2luZHggLSAoZGJsX3doaWNoX2Jsb2NrICogYmVmc19pYWRkcnNfcGVyX2Jsb2NrKHNiKSk7CisJaWFkZHJfYXJyYXkgPSAoYmVmc19pbm9kZV9hZGRyICopIGRibF9pbmRpcl9ibG9jay0+Yl9kYXRhOworCWluZGlyX3J1biA9IGZzcnVuX3RvX2NwdShzYiwgaWFkZHJfYXJyYXlbZGJsX2Jsb2NrX2luZHhdKTsKKwlicmVsc2UoZGJsX2luZGlyX2Jsb2NrKTsKKwlpYWRkcl9hcnJheSA9IE5VTEw7CisKKwkvKiBSZWFkIGluZGlyZWN0IGJsb2NrICovCisJd2hpY2hfYmxvY2sgPSBpbmRpcl9pbmR4IC8gYmVmc19pYWRkcnNfcGVyX2Jsb2NrKHNiKTsKKwlpZiAod2hpY2hfYmxvY2sgPiBpbmRpcl9ydW4ubGVuKSB7CisJCWJlZnNfZXJyb3Ioc2IsICJUaGUgaW5kaXJlY3QgaW5kZXggY2FsY3VsYXRlZCBieSAiCisJCQkgICAiYmVmc19yZWFkX2JydW5fZGJsaW5kaXJlY3QoKSwgJWQsIGlzIG91dHNpZGUgdGhlIHJhbmdlICIKKwkJCSAgICJvZiB0aGUgaW5kaXJlY3QgYmxvY2siLCBpbmRpcl9pbmR4KTsKKwkJcmV0dXJuIEJFRlNfRVJSOworCX0KKworCWluZGlyX2Jsb2NrID0KKwkgICAgYmVmc19icmVhZChzYiwgaWFkZHIyYmxvY2tubyhzYiwgJmluZGlyX3J1bikgKyB3aGljaF9ibG9jayk7CisJaWYgKGluZGlyX2Jsb2NrID09IE5VTEwpIHsKKwkJYmVmc19lcnJvcihzYiwgImJlZnNfcmVhZF9icnVuX2RibGluZGlyZWN0KCkgY291bGRuJ3QgcmVhZCB0aGUgIgorCQkJICAgImluZGlyZWN0IGJsb2NrIGF0IGJsb2Nrbm8gJWx1IiwKKwkJCSAgIGlhZGRyMmJsb2Nrbm8oc2IsICZpbmRpcl9ydW4pICsgd2hpY2hfYmxvY2spOworCQlicmVsc2UoaW5kaXJfYmxvY2spOworCQlyZXR1cm4gQkVGU19FUlI7CisJfQorCisJYmxvY2tfaW5keCA9IGluZGlyX2luZHggLSAod2hpY2hfYmxvY2sgKiBiZWZzX2lhZGRyc19wZXJfYmxvY2soc2IpKTsKKwlpYWRkcl9hcnJheSA9IChiZWZzX2lub2RlX2FkZHIgKikgaW5kaXJfYmxvY2stPmJfZGF0YTsKKwkqcnVuID0gZnNydW5fdG9fY3B1KHNiLCBpYWRkcl9hcnJheVtibG9ja19pbmR4XSk7CisJYnJlbHNlKGluZGlyX2Jsb2NrKTsKKwlpYWRkcl9hcnJheSA9IE5VTEw7CisKKwlibG9ja25vX2F0X3J1bl9zdGFydCA9IGluZGlyX3N0YXJ0X2JsazsKKwlibG9ja25vX2F0X3J1bl9zdGFydCArPSBkaWJsa2xlbiAqIGRibGluZGlyX2luZHg7CisJYmxvY2tub19hdF9ydW5fc3RhcnQgKz0gaWJsa2xlbiAqIGluZGlyX2luZHg7CisJb2Zmc2V0ID0gYmxvY2tubyAtIGJsb2Nrbm9fYXRfcnVuX3N0YXJ0OworCisJcnVuLT5zdGFydCArPSBvZmZzZXQ7CisJcnVuLT5sZW4gLT0gb2Zmc2V0OworCisJYmVmc19kZWJ1ZyhzYiwgIkZvdW5kIGZpbGUgYmxvY2sgJWx1IGluIGRvdWJsZV9pbmRpcmVjdFslZF1bJWRdLCIKKwkJICAgIiBkb3VibGVfaW5kaXJlY3RfbGVmdG92ZXIgPSAlbHUiLAorCQkgICBibG9ja25vLCBkYmxpbmRpcl9pbmR4LCBpbmRpcl9pbmR4LCBkYmxpbmRpcl9sZWZ0b3Zlcik7CisKKwlyZXR1cm4gQkVGU19PSzsKK30KZGlmZiAtLWdpdCBhL2ZzL2JlZnMvZGF0YXN0cmVhbS5oIGIvZnMvYmVmcy9kYXRhc3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVlOGEzYwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2JlZnMvZGF0YXN0cmVhbS5oCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBkYXRhc3RyZWFtLmgKKyAqCisgKi8KKworc3RydWN0IGJ1ZmZlcl9oZWFkICpiZWZzX3JlYWRfZGF0YXN0cmVhbShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCQkgYmVmc19kYXRhX3N0cmVhbSAqIGRzLCBiZWZzX29mZl90IHBvcywKKwkJCQkJIHVpbnQgKiBvZmYpOworCitpbnQgYmVmc19mYmxvY2syYnJ1bihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2RhdGFfc3RyZWFtICogZGF0YSwKKwkJICAgICBiZWZzX2Jsb2NrbnJfdCBmYmxvY2ssIGJlZnNfYmxvY2tfcnVuICogcnVuKTsKKworc2l6ZV90IGJlZnNfcmVhZF9sc3ltbGluayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2RhdGFfc3RyZWFtICogZGF0YSwKKwkJCSAgdm9pZCAqYnVmZiwgYmVmc19vZmZfdCBsZW4pOworCitiZWZzX2Jsb2NrbnJfdCBiZWZzX2NvdW50X2Jsb2NrcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2RhdGFfc3RyZWFtICogZHMpOworCitleHRlcm4gY29uc3QgYmVmc19pbm9kZV9hZGRyIEJBRF9JQUREUjsKKwpkaWZmIC0tZ2l0IGEvZnMvYmVmcy9kZWJ1Zy5jIGIvZnMvYmVmcy9kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NWNjMGEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9iZWZzL2RlYnVnLmMKQEAgLTAsMCArMSwyODMgQEAKKy8qCisgKiAgbGludXgvZnMvYmVmcy9kZWJ1Zy5jCisgKiAKKyAqIENvcHlyaWdodCAoQykgMjAwMSBXaWxsIER5c29uICh3aWxsX2R5c29uIGF0IHBvYm94LmNvbSkKKyAqCisgKiBXaXRoIGhlbHAgZnJvbSB0aGUgbnRmcy10bmcgZHJpdmVyIGJ5IEFudG9uIEFsdHBhcm1ha292CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5ICBNYWtvdG8gS2F0byAobV9rYXRvQGdhMi5zby1uZXQubmUuanApCisgKgorICogZGVidWcgZnVuY3Rpb25zCisgKi8KKworI2lmZGVmIF9fS0VSTkVMX18KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKworI2VuZGlmCQkJCS8qIF9fS0VSTkVMX18gKi8KKworI2luY2x1ZGUgImJlZnMuaCIKKyNpbmNsdWRlICJlbmRpYW4uaCIKKworI2RlZmluZSBFUlJCVUZTSVpFIDEwMjQKKwordm9pZAorYmVmc19lcnJvcihjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJY2hhciAqZXJyX2J1ZiA9IChjaGFyICopIGttYWxsb2MoRVJSQlVGU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKGVycl9idWYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImNvdWxkIG5vdCBhbGxvY2F0ZSAlZCBieXRlc1xuIiwgRVJSQlVGU0laRSk7CisJCXJldHVybjsKKwl9CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXZzbnByaW50ZihlcnJfYnVmLCBFUlJCVUZTSVpFLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKworCXByaW50ayhLRVJOX0VSUiAiQmVGUyglcyk6ICVzXG4iLCBzYi0+c19pZCwgZXJyX2J1Zik7CisJa2ZyZWUoZXJyX2J1Zik7Cit9CisKK3ZvaWQKK2JlZnNfd2FybmluZyhjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJY2hhciAqZXJyX2J1ZiA9IChjaGFyICopIGttYWxsb2MoRVJSQlVGU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKGVycl9idWYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImNvdWxkIG5vdCBhbGxvY2F0ZSAlZCBieXRlc1xuIiwgRVJSQlVGU0laRSk7CisJCXJldHVybjsKKwl9CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXZzbnByaW50ZihlcnJfYnVmLCBFUlJCVUZTSVpFLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgIkJlRlMoJXMpOiAlc1xuIiwgc2ItPnNfaWQsIGVycl9idWYpOworCisJa2ZyZWUoZXJyX2J1Zik7Cit9CisKK3ZvaWQKK2JlZnNfZGVidWcoY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisjaWZkZWYgQ09ORklHX0JFRlNfREVCVUcKKworCXZhX2xpc3QgYXJnczsKKwljaGFyICplcnJfYnVmID0gTlVMTDsKKworCWlmIChCRUZTX1NCKHNiKS0+bW91bnRfb3B0cy5kZWJ1ZykgeworCQllcnJfYnVmID0gKGNoYXIgKikga21hbGxvYyhFUlJCVUZTSVpFLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGVycl9idWYgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJjb3VsZCBub3QgYWxsb2NhdGUgJWQgYnl0ZXNcbiIsCisJCQkJRVJSQlVGU0laRSk7CisJCQlyZXR1cm47CisJCX0KKworCQl2YV9zdGFydChhcmdzLCBmbXQpOworCQl2c25wcmludGYoZXJyX2J1ZiwgRVJSQlVGU0laRSwgZm10LCBhcmdzKTsKKwkJdmFfZW5kKGFyZ3MpOworCisJCXByaW50ayhLRVJOX0RFQlVHICJCZUZTKCVzKTogJXNcbiIsIHNiLT5zX2lkLCBlcnJfYnVmKTsKKworCQlrZnJlZShlcnJfYnVmKTsKKwl9CisKKyNlbmRpZgkJCQkvL0NPTkZJR19CRUZTX0RFQlVHCit9CisKK3ZvaWQKK2JlZnNfZHVtcF9pbm9kZShjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2lub2RlICogaW5vZGUpCit7CisjaWZkZWYgQ09ORklHX0JFRlNfREVCVUcKKworCWJlZnNfYmxvY2tfcnVuIHRtcF9ydW47CisKKwliZWZzX2RlYnVnKHNiLCAiYmVmc19pbm9kZSBpbmZvcm1hdGlvbiIpOworCisJYmVmc19kZWJ1ZyhzYiwgIiAgbWFnaWMxICUwOHgiLCBmczMyX3RvX2NwdShzYiwgaW5vZGUtPm1hZ2ljMSkpOworCisJdG1wX3J1biA9IGZzcnVuX3RvX2NwdShzYiwgaW5vZGUtPmlub2RlX251bSk7CisJYmVmc19kZWJ1ZyhzYiwgIiAgaW5vZGVfbnVtICV1LCAlaHUsICVodSIsCisJCSAgIHRtcF9ydW4uYWxsb2NhdGlvbl9ncm91cCwgdG1wX3J1bi5zdGFydCwgdG1wX3J1bi5sZW4pOworCisJYmVmc19kZWJ1ZyhzYiwgIiAgdWlkICV1IiwgZnMzMl90b19jcHUoc2IsIGlub2RlLT51aWQpKTsKKwliZWZzX2RlYnVnKHNiLCAiICBnaWQgJXUiLCBmczMyX3RvX2NwdShzYiwgaW5vZGUtPmdpZCkpOworCWJlZnNfZGVidWcoc2IsICIgIG1vZGUgJTA4eCIsIGZzMzJfdG9fY3B1KHNiLCBpbm9kZS0+bW9kZSkpOworCWJlZnNfZGVidWcoc2IsICIgIGZsYWdzICUwOHgiLCBmczMyX3RvX2NwdShzYiwgaW5vZGUtPmZsYWdzKSk7CisJYmVmc19kZWJ1ZyhzYiwgIiAgY3JlYXRlX3RpbWUgJUx1IiwKKwkJICAgZnM2NF90b19jcHUoc2IsIGlub2RlLT5jcmVhdGVfdGltZSkpOworCWJlZnNfZGVidWcoc2IsICIgIGxhc3RfbW9kaWZpZWRfdGltZSAlTHUiLAorCQkgICBmczY0X3RvX2NwdShzYiwgaW5vZGUtPmxhc3RfbW9kaWZpZWRfdGltZSkpOworCisJdG1wX3J1biA9IGZzcnVuX3RvX2NwdShzYiwgaW5vZGUtPnBhcmVudCk7CisJYmVmc19kZWJ1ZyhzYiwgIiAgcGFyZW50IFsldSwgJWh1LCAlaHVdIiwKKwkJICAgdG1wX3J1bi5hbGxvY2F0aW9uX2dyb3VwLCB0bXBfcnVuLnN0YXJ0LCB0bXBfcnVuLmxlbik7CisKKwl0bXBfcnVuID0gZnNydW5fdG9fY3B1KHNiLCBpbm9kZS0+YXR0cmlidXRlcyk7CisJYmVmc19kZWJ1ZyhzYiwgIiAgYXR0cmlidXRlcyBbJXUsICVodSwgJWh1XSIsCisJCSAgIHRtcF9ydW4uYWxsb2NhdGlvbl9ncm91cCwgdG1wX3J1bi5zdGFydCwgdG1wX3J1bi5sZW4pOworCisJYmVmc19kZWJ1ZyhzYiwgIiAgdHlwZSAlMDh4IiwgZnMzMl90b19jcHUoc2IsIGlub2RlLT50eXBlKSk7CisJYmVmc19kZWJ1ZyhzYiwgIiAgaW5vZGVfc2l6ZSAldSIsIGZzMzJfdG9fY3B1KHNiLCBpbm9kZS0+aW5vZGVfc2l6ZSkpOworCisJaWYgKFNfSVNMTksoaW5vZGUtPm1vZGUpKSB7CisJCWJlZnNfZGVidWcoc2IsICIgIFN5bWJvbGljIGxpbmsgWyVzXSIsIGlub2RlLT5kYXRhLnN5bWxpbmspOworCX0gZWxzZSB7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBCRUZTX05VTV9ESVJFQ1RfQkxPQ0tTOyBpKyspIHsKKwkJCXRtcF9ydW4gPQorCQkJICAgIGZzcnVuX3RvX2NwdShzYiwgaW5vZGUtPmRhdGEuZGF0YXN0cmVhbS5kaXJlY3RbaV0pOworCQkJYmVmc19kZWJ1ZyhzYiwgIiAgZGlyZWN0ICVkIFsldSwgJWh1LCAlaHVdIiwgaSwKKwkJCQkgICB0bXBfcnVuLmFsbG9jYXRpb25fZ3JvdXAsIHRtcF9ydW4uc3RhcnQsCisJCQkJICAgdG1wX3J1bi5sZW4pOworCQl9CisJCWJlZnNfZGVidWcoc2IsICIgIG1heF9kaXJlY3RfcmFuZ2UgJUx1IiwKKwkJCSAgIGZzNjRfdG9fY3B1KHNiLAorCQkJCSAgICAgICBpbm9kZS0+ZGF0YS5kYXRhc3RyZWFtLgorCQkJCSAgICAgICBtYXhfZGlyZWN0X3JhbmdlKSk7CisKKwkJdG1wX3J1biA9IGZzcnVuX3RvX2NwdShzYiwgaW5vZGUtPmRhdGEuZGF0YXN0cmVhbS5pbmRpcmVjdCk7CisJCWJlZnNfZGVidWcoc2IsICIgIGluZGlyZWN0IFsldSwgJWh1LCAlaHVdIiwKKwkJCSAgIHRtcF9ydW4uYWxsb2NhdGlvbl9ncm91cCwKKwkJCSAgIHRtcF9ydW4uc3RhcnQsIHRtcF9ydW4ubGVuKTsKKworCQliZWZzX2RlYnVnKHNiLCAiICBtYXhfaW5kaXJlY3RfcmFuZ2UgJUx1IiwKKwkJCSAgIGZzNjRfdG9fY3B1KHNiLAorCQkJCSAgICAgICBpbm9kZS0+ZGF0YS5kYXRhc3RyZWFtLgorCQkJCSAgICAgICBtYXhfaW5kaXJlY3RfcmFuZ2UpKTsKKworCQl0bXBfcnVuID0KKwkJICAgIGZzcnVuX3RvX2NwdShzYiwgaW5vZGUtPmRhdGEuZGF0YXN0cmVhbS5kb3VibGVfaW5kaXJlY3QpOworCQliZWZzX2RlYnVnKHNiLCAiICBkb3VibGUgaW5kaXJlY3QgWyV1LCAlaHUsICVodV0iLAorCQkJICAgdG1wX3J1bi5hbGxvY2F0aW9uX2dyb3VwLCB0bXBfcnVuLnN0YXJ0LAorCQkJICAgdG1wX3J1bi5sZW4pOworCisJCWJlZnNfZGVidWcoc2IsICIgIG1heF9kb3VibGVfaW5kaXJlY3RfcmFuZ2UgJUx1IiwKKwkJCSAgIGZzNjRfdG9fY3B1KHNiLAorCQkJCSAgICAgICBpbm9kZS0+ZGF0YS5kYXRhc3RyZWFtLgorCQkJCSAgICAgICBtYXhfZG91YmxlX2luZGlyZWN0X3JhbmdlKSk7CisKKwkJYmVmc19kZWJ1ZyhzYiwgIiAgc2l6ZSAlTHUiLAorCQkJICAgZnM2NF90b19jcHUoc2IsIGlub2RlLT5kYXRhLmRhdGFzdHJlYW0uc2l6ZSkpOworCX0KKworI2VuZGlmCQkJCS8vQ09ORklHX0JFRlNfREVCVUcKK30KKworLyoKKyAqIERpc3BsYXkgc3VwZXIgYmxvY2sgc3RydWN0dXJlIGZvciBkZWJ1Zy4KKyAqLworCit2b2lkCitiZWZzX2R1bXBfc3VwZXJfYmxvY2soY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYmVmc19zdXBlcl9ibG9jayAqIHN1cCkKK3sKKyNpZmRlZiBDT05GSUdfQkVGU19ERUJVRworCisJYmVmc19ibG9ja19ydW4gdG1wX3J1bjsKKworCWJlZnNfZGVidWcoc2IsICJiZWZzX3N1cGVyX2Jsb2NrIGluZm9ybWF0aW9uIik7CisKKwliZWZzX2RlYnVnKHNiLCAiICBuYW1lICVzIiwgc3VwLT5uYW1lKTsKKwliZWZzX2RlYnVnKHNiLCAiICBtYWdpYzEgJTA4eCIsIGZzMzJfdG9fY3B1KHNiLCBzdXAtPm1hZ2ljMSkpOworCWJlZnNfZGVidWcoc2IsICIgIGZzX2J5dGVfb3JkZXIgJTA4eCIsCisJCSAgIGZzMzJfdG9fY3B1KHNiLCBzdXAtPmZzX2J5dGVfb3JkZXIpKTsKKworCWJlZnNfZGVidWcoc2IsICIgIGJsb2NrX3NpemUgJXUiLCBmczMyX3RvX2NwdShzYiwgc3VwLT5ibG9ja19zaXplKSk7CisJYmVmc19kZWJ1ZyhzYiwgIiAgYmxvY2tfc2hpZnQgJXUiLCBmczMyX3RvX2NwdShzYiwgc3VwLT5ibG9ja19zaGlmdCkpOworCisJYmVmc19kZWJ1ZyhzYiwgIiAgbnVtX2Jsb2NrcyAlTHUiLCBmczY0X3RvX2NwdShzYiwgc3VwLT5udW1fYmxvY2tzKSk7CisJYmVmc19kZWJ1ZyhzYiwgIiAgdXNlZF9ibG9ja3MgJUx1IiwgZnM2NF90b19jcHUoc2IsIHN1cC0+dXNlZF9ibG9ja3MpKTsKKworCWJlZnNfZGVidWcoc2IsICIgIG1hZ2ljMiAlMDh4IiwgZnMzMl90b19jcHUoc2IsIHN1cC0+bWFnaWMyKSk7CisJYmVmc19kZWJ1ZyhzYiwgIiAgYmxvY2tzX3Blcl9hZyAldSIsCisJCSAgIGZzMzJfdG9fY3B1KHNiLCBzdXAtPmJsb2Nrc19wZXJfYWcpKTsKKwliZWZzX2RlYnVnKHNiLCAiICBhZ19zaGlmdCAldSIsIGZzMzJfdG9fY3B1KHNiLCBzdXAtPmFnX3NoaWZ0KSk7CisJYmVmc19kZWJ1ZyhzYiwgIiAgbnVtX2FncyAldSIsIGZzMzJfdG9fY3B1KHNiLCBzdXAtPm51bV9hZ3MpKTsKKworCWJlZnNfZGVidWcoc2IsICIgIGZsYWdzICUwOHgiLCBmczMyX3RvX2NwdShzYiwgc3VwLT5mbGFncykpOworCisJdG1wX3J1biA9IGZzcnVuX3RvX2NwdShzYiwgc3VwLT5sb2dfYmxvY2tzKTsKKwliZWZzX2RlYnVnKHNiLCAiICBsb2dfYmxvY2tzICV1LCAlaHUsICVodSIsCisJCSAgIHRtcF9ydW4uYWxsb2NhdGlvbl9ncm91cCwgdG1wX3J1bi5zdGFydCwgdG1wX3J1bi5sZW4pOworCisJYmVmc19kZWJ1ZyhzYiwgIiAgbG9nX3N0YXJ0ICVMZCIsIGZzNjRfdG9fY3B1KHNiLCBzdXAtPmxvZ19zdGFydCkpOworCWJlZnNfZGVidWcoc2IsICIgIGxvZ19lbmQgJUxkIiwgZnM2NF90b19jcHUoc2IsIHN1cC0+bG9nX2VuZCkpOworCisJYmVmc19kZWJ1ZyhzYiwgIiAgbWFnaWMzICUwOHgiLCBmczMyX3RvX2NwdShzYiwgc3VwLT5tYWdpYzMpKTsKKworCXRtcF9ydW4gPSBmc3J1bl90b19jcHUoc2IsIHN1cC0+cm9vdF9kaXIpOworCWJlZnNfZGVidWcoc2IsICIgIHJvb3RfZGlyICV1LCAlaHUsICVodSIsCisJCSAgIHRtcF9ydW4uYWxsb2NhdGlvbl9ncm91cCwgdG1wX3J1bi5zdGFydCwgdG1wX3J1bi5sZW4pOworCisJdG1wX3J1biA9IGZzcnVuX3RvX2NwdShzYiwgc3VwLT5pbmRpY2VzKTsKKwliZWZzX2RlYnVnKHNiLCAiICBpbmRpY2VzICV1LCAlaHUsICVodSIsCisJCSAgIHRtcF9ydW4uYWxsb2NhdGlvbl9ncm91cCwgdG1wX3J1bi5zdGFydCwgdG1wX3J1bi5sZW4pOworCisjZW5kaWYJCQkJLy9DT05GSUdfQkVGU19ERUJVRworfQorCisjaWYgMAorLyogdW51c2VkICovCit2b2lkCitiZWZzX2R1bXBfc21hbGxfZGF0YShjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX3NtYWxsX2RhdGEgKiBzZCkKK3sKK30KKworLyogdW51c2VkICovCit2b2lkCitiZWZzX2R1bXBfcnVuKGNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGJlZnNfYmxvY2tfcnVuIHJ1bikKK3sKKyNpZmRlZiBDT05GSUdfQkVGU19ERUJVRworCisJcnVuID0gZnNydW5fdG9fY3B1KHNiLCBydW4pOworCisJYmVmc19kZWJ1ZyhzYiwgIlsldSwgJWh1LCAlaHVdIiwKKwkJICAgcnVuLmFsbG9jYXRpb25fZ3JvdXAsIHJ1bi5zdGFydCwgcnVuLmxlbik7CisKKyNlbmRpZgkJCQkvL0NPTkZJR19CRUZTX0RFQlVHCit9CisjZW5kaWYgIC8qICAwICAqLworCit2b2lkCitiZWZzX2R1bXBfaW5kZXhfZW50cnkoY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYmVmc19idHJlZV9zdXBlciAqIHN1cGVyKQoreworI2lmZGVmIENPTkZJR19CRUZTX0RFQlVHCisKKwliZWZzX2RlYnVnKHNiLCAiQnRyZWUgc3VwZXIgc3RydWN0dXJlIik7CisJYmVmc19kZWJ1ZyhzYiwgIiAgbWFnaWMgJTA4eCIsIGZzMzJfdG9fY3B1KHNiLCBzdXBlci0+bWFnaWMpKTsKKwliZWZzX2RlYnVnKHNiLCAiICBub2RlX3NpemUgJXUiLCBmczMyX3RvX2NwdShzYiwgc3VwZXItPm5vZGVfc2l6ZSkpOworCWJlZnNfZGVidWcoc2IsICIgIG1heF9kZXB0aCAlMDh4IiwgZnMzMl90b19jcHUoc2IsIHN1cGVyLT5tYXhfZGVwdGgpKTsKKworCWJlZnNfZGVidWcoc2IsICIgIGRhdGFfdHlwZSAlMDh4IiwgZnMzMl90b19jcHUoc2IsIHN1cGVyLT5kYXRhX3R5cGUpKTsKKwliZWZzX2RlYnVnKHNiLCAiICByb290X25vZGVfcG9pbnRlciAlMDE2TFgiLAorCQkgICBmczY0X3RvX2NwdShzYiwgc3VwZXItPnJvb3Rfbm9kZV9wdHIpKTsKKwliZWZzX2RlYnVnKHNiLCAiICBmcmVlX25vZGVfcG9pbnRlciAlMDE2TFgiLAorCQkgICBmczY0X3RvX2NwdShzYiwgc3VwZXItPmZyZWVfbm9kZV9wdHIpKTsKKwliZWZzX2RlYnVnKHNiLCAiICBtYXhpbXVtIHNpemUgJTAxNkxYIiwKKwkJICAgZnM2NF90b19jcHUoc2IsIHN1cGVyLT5tYXhfc2l6ZSkpOworCisjZW5kaWYJCQkJLy9DT05GSUdfQkVGU19ERUJVRworfQorCit2b2lkCitiZWZzX2R1bXBfaW5kZXhfbm9kZShjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2J0cmVlX25vZGVoZWFkICogbm9kZSkKK3sKKyNpZmRlZiBDT05GSUdfQkVGU19ERUJVRworCisJYmVmc19kZWJ1ZyhzYiwgIkJ0cmVlIG5vZGUgc3RydWN0dXJlIik7CisJYmVmc19kZWJ1ZyhzYiwgIiAgbGVmdCAlMDE2TFgiLCBmczY0X3RvX2NwdShzYiwgbm9kZS0+bGVmdCkpOworCWJlZnNfZGVidWcoc2IsICIgIHJpZ2h0ICUwMTZMWCIsIGZzNjRfdG9fY3B1KHNiLCBub2RlLT5yaWdodCkpOworCWJlZnNfZGVidWcoc2IsICIgIG92ZXJmbG93ICUwMTZMWCIsIGZzNjRfdG9fY3B1KHNiLCBub2RlLT5vdmVyZmxvdykpOworCWJlZnNfZGVidWcoc2IsICIgIGFsbF9rZXlfY291bnQgJWh1IiwKKwkJICAgZnMxNl90b19jcHUoc2IsIG5vZGUtPmFsbF9rZXlfY291bnQpKTsKKwliZWZzX2RlYnVnKHNiLCAiICBhbGxfa2V5X2xlbmd0aCAlaHUiLAorCQkgICBmczE2X3RvX2NwdShzYiwgbm9kZS0+YWxsX2tleV9sZW5ndGgpKTsKKworI2VuZGlmCQkJCS8vQ09ORklHX0JFRlNfREVCVUcKK30KZGlmZiAtLWdpdCBhL2ZzL2JlZnMvZW5kaWFuLmggYi9mcy9iZWZzL2VuZGlhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllY2FlYTQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9iZWZzL2VuZGlhbi5oCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogbGludXgvZnMvYmVmcy9lbmRpYW4uaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBXaWxsIER5c29uIDx3aWxsX2R5c29uQHBvYm94LmNvbT4KKyAqCisgKiBQYXJ0aWFsbHkgYmFzZWQgb24gc2ltaWxhciBmdW50aW9ucyBpbiB0aGUgc3lzdiBkcml2ZXIuCisgKi8KKworI2lmbmRlZiBMSU5VWF9CRUZTX0VORElBTgorI2RlZmluZSBMSU5VWF9CRUZTX0VORElBTgorCisjaW5jbHVkZSA8bGludXgvYnl0ZW9yZGVyL2dlbmVyaWMuaD4KKyNpbmNsdWRlICJiZWZzLmgiCisKK3N0YXRpYyBpbmxpbmUgdTY0CitmczY0X3RvX2NwdShjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1NjQgbikKK3sKKwlpZiAoQkVGU19TQihzYiktPmJ5dGVfb3JkZXIgPT0gQkVGU19CWVRFU0VYX0xFKQorCQlyZXR1cm4gbGU2NF90b19jcHUobik7CisJZWxzZQorCQlyZXR1cm4gYmU2NF90b19jcHUobik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTY0CitjcHVfdG9fZnM2NChjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1NjQgbikKK3sKKwlpZiAoQkVGU19TQihzYiktPmJ5dGVfb3JkZXIgPT0gQkVGU19CWVRFU0VYX0xFKQorCQlyZXR1cm4gY3B1X3RvX2xlNjQobik7CisJZWxzZQorCQlyZXR1cm4gY3B1X3RvX2JlNjQobik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyCitmczMyX3RvX2NwdShjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1MzIgbikKK3sKKwlpZiAoQkVGU19TQihzYiktPmJ5dGVfb3JkZXIgPT0gQkVGU19CWVRFU0VYX0xFKQorCQlyZXR1cm4gbGUzMl90b19jcHUobik7CisJZWxzZQorCQlyZXR1cm4gYmUzMl90b19jcHUobik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyCitjcHVfdG9fZnMzMihjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1MzIgbikKK3sKKwlpZiAoQkVGU19TQihzYiktPmJ5dGVfb3JkZXIgPT0gQkVGU19CWVRFU0VYX0xFKQorCQlyZXR1cm4gY3B1X3RvX2xlMzIobik7CisJZWxzZQorCQlyZXR1cm4gY3B1X3RvX2JlMzIobik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2CitmczE2X3RvX2NwdShjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1MTYgbikKK3sKKwlpZiAoQkVGU19TQihzYiktPmJ5dGVfb3JkZXIgPT0gQkVGU19CWVRFU0VYX0xFKQorCQlyZXR1cm4gbGUxNl90b19jcHUobik7CisJZWxzZQorCQlyZXR1cm4gYmUxNl90b19jcHUobik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2CitjcHVfdG9fZnMxNihjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1MTYgbikKK3sKKwlpZiAoQkVGU19TQihzYiktPmJ5dGVfb3JkZXIgPT0gQkVGU19CWVRFU0VYX0xFKQorCQlyZXR1cm4gY3B1X3RvX2xlMTYobik7CisJZWxzZQorCQlyZXR1cm4gY3B1X3RvX2JlMTYobik7Cit9CisKKy8qIENvbXBvc2l0ZSB0eXBlcyBiZWxvdyBoZXJlICovCisKK3N0YXRpYyBpbmxpbmUgYmVmc19ibG9ja19ydW4KK2ZzcnVuX3RvX2NwdShjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2Jsb2NrX3J1biBuKQoreworCWJlZnNfYmxvY2tfcnVuIHJ1bjsKKworCWlmIChCRUZTX1NCKHNiKS0+Ynl0ZV9vcmRlciA9PSBCRUZTX0JZVEVTRVhfTEUpIHsKKwkJcnVuLmFsbG9jYXRpb25fZ3JvdXAgPSBsZTMyX3RvX2NwdShuLmFsbG9jYXRpb25fZ3JvdXApOworCQlydW4uc3RhcnQgPSBsZTE2X3RvX2NwdShuLnN0YXJ0KTsKKwkJcnVuLmxlbiA9IGxlMTZfdG9fY3B1KG4ubGVuKTsKKwl9IGVsc2UgeworCQlydW4uYWxsb2NhdGlvbl9ncm91cCA9IGJlMzJfdG9fY3B1KG4uYWxsb2NhdGlvbl9ncm91cCk7CisJCXJ1bi5zdGFydCA9IGJlMTZfdG9fY3B1KG4uc3RhcnQpOworCQlydW4ubGVuID0gYmUxNl90b19jcHUobi5sZW4pOworCX0KKwlyZXR1cm4gcnVuOworfQorCitzdGF0aWMgaW5saW5lIGJlZnNfYmxvY2tfcnVuCitjcHVfdG9fZnNydW4oY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYmVmc19ibG9ja19ydW4gbikKK3sKKwliZWZzX2Jsb2NrX3J1biBydW47CisKKwlpZiAoQkVGU19TQihzYiktPmJ5dGVfb3JkZXIgPT0gQkVGU19CWVRFU0VYX0xFKSB7CisJCXJ1bi5hbGxvY2F0aW9uX2dyb3VwID0gY3B1X3RvX2xlMzIobi5hbGxvY2F0aW9uX2dyb3VwKTsKKwkJcnVuLnN0YXJ0ID0gY3B1X3RvX2xlMTYobi5zdGFydCk7CisJCXJ1bi5sZW4gPSBjcHVfdG9fbGUxNihuLmxlbik7CisJfSBlbHNlIHsKKwkJcnVuLmFsbG9jYXRpb25fZ3JvdXAgPSBjcHVfdG9fYmUzMihuLmFsbG9jYXRpb25fZ3JvdXApOworCQlydW4uc3RhcnQgPSBjcHVfdG9fYmUxNihuLnN0YXJ0KTsKKwkJcnVuLmxlbiA9IGNwdV90b19iZTE2KG4ubGVuKTsKKwl9CisJcmV0dXJuIHJ1bjsKK30KKworc3RhdGljIGlubGluZSBiZWZzX2RhdGFfc3RyZWFtCitmc2RzX3RvX2NwdShjb25zdCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2RhdGFfc3RyZWFtIG4pCit7CisJYmVmc19kYXRhX3N0cmVhbSBkYXRhOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEJFRlNfTlVNX0RJUkVDVF9CTE9DS1M7ICsraSkKKwkJZGF0YS5kaXJlY3RbaV0gPSBmc3J1bl90b19jcHUoc2IsIG4uZGlyZWN0W2ldKTsKKworCWRhdGEubWF4X2RpcmVjdF9yYW5nZSA9IGZzNjRfdG9fY3B1KHNiLCBuLm1heF9kaXJlY3RfcmFuZ2UpOworCWRhdGEuaW5kaXJlY3QgPSBmc3J1bl90b19jcHUoc2IsIG4uaW5kaXJlY3QpOworCWRhdGEubWF4X2luZGlyZWN0X3JhbmdlID0gZnM2NF90b19jcHUoc2IsIG4ubWF4X2luZGlyZWN0X3JhbmdlKTsKKwlkYXRhLmRvdWJsZV9pbmRpcmVjdCA9IGZzcnVuX3RvX2NwdShzYiwgbi5kb3VibGVfaW5kaXJlY3QpOworCWRhdGEubWF4X2RvdWJsZV9pbmRpcmVjdF9yYW5nZSA9IGZzNjRfdG9fY3B1KHNiLAorCQkJCQkJICAgICBuLgorCQkJCQkJICAgICBtYXhfZG91YmxlX2luZGlyZWN0X3JhbmdlKTsKKwlkYXRhLnNpemUgPSBmczY0X3RvX2NwdShzYiwgbi5zaXplKTsKKworCXJldHVybiBkYXRhOworfQorCisjZW5kaWYJCQkJLy9MSU5VWF9CRUZTX0VORElBTgpkaWZmIC0tZ2l0IGEvZnMvYmVmcy9pbm9kZS5jIGIvZnMvYmVmcy9pbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MWM5MjQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9iZWZzL2lub2RlLmMKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIGlub2RlLmMKKyAqIAorICogQ29weXJpZ2h0IChDKSAyMDAxIFdpbGwgRHlzb24gPHdpbGxfZHlzb25AcG9ib3guY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorCisjaW5jbHVkZSAiYmVmcy5oIgorI2luY2x1ZGUgImlub2RlLmgiCisjaW5jbHVkZSAiZW5kaWFuLmgiCisKKy8qCisJVmFsaWRhdGVzIHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgYmVmcyBpbm9kZQorCVJldHVybnMgQkVGU19PSyBpZiB0aGUgaW5vZGUgc2hvdWxkIGJlIHVzZWQsIG90aGVyd2lzZQorCXJldHVybnMgQkVGU19CQURfSU5PREUKKyovCitpbnQKK2JlZnNfY2hlY2tfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYmVmc19pbm9kZSAqIHJhd19pbm9kZSwKKwkJIGJlZnNfYmxvY2tucl90IGlub2RlKQoreworCXUzMiBtYWdpYzEgPSBmczMyX3RvX2NwdShzYiwgcmF3X2lub2RlLT5tYWdpYzEpOworCWJlZnNfaW5vZGVfYWRkciBpbm9fbnVtID0gZnNydW5fdG9fY3B1KHNiLCByYXdfaW5vZGUtPmlub2RlX251bSk7CisJdTMyIGZsYWdzID0gZnMzMl90b19jcHUoc2IsIHJhd19pbm9kZS0+ZmxhZ3MpOworCisJLyogY2hlY2sgbWFnaWMgaGVhZGVyLiAqLworCWlmIChtYWdpYzEgIT0gQkVGU19JTk9ERV9NQUdJQzEpIHsKKwkJYmVmc19lcnJvcihzYiwKKwkJCSAgICJJbm9kZSBoYXMgYSBiYWQgbWFnaWMgaGVhZGVyIC0gaW5vZGUgPSAlbHUiLCBpbm9kZSk7CisJCXJldHVybiBCRUZTX0JBRF9JTk9ERTsKKwl9CisKKwkvKgorCSAqIFNhbml0eSBjaGVjazI6IGlub2RlcyBzdG9yZSB0aGVpciBvd24gYmxvY2sgYWRkcmVzcy4gQ2hlY2sgaXQuCisJICovCisJaWYgKGlub2RlICE9IGlhZGRyMmJsb2Nrbm8oc2IsICZpbm9fbnVtKSkgeworCQliZWZzX2Vycm9yKHNiLCAiaW5vZGUgYmxvY2tuciBmaWVsZCBkaXNhZ3JlZXMgd2l0aCB2ZnMgIgorCQkJICAgIlZGUzogJWx1LCBJbm9kZSAlbHUiLAorCQkJICAgaW5vZGUsIGlhZGRyMmJsb2Nrbm8oc2IsICZpbm9fbnVtKSk7CisJCXJldHVybiBCRUZTX0JBRF9JTk9ERTsKKwl9CisKKwkvKgorCSAqIGNoZWNrIGZsYWcKKwkgKi8KKworCWlmICghKGZsYWdzICYgQkVGU19JTk9ERV9JTl9VU0UpKSB7CisJCWJlZnNfZXJyb3Ioc2IsICJpbm9kZSBpcyBub3QgdXNlZCAtIGlub2RlID0gJWx1IiwgaW5vZGUpOworCQlyZXR1cm4gQkVGU19CQURfSU5PREU7CisJfQorCisJcmV0dXJuIEJFRlNfT0s7Cit9CmRpZmYgLS1naXQgYS9mcy9iZWZzL2lub2RlLmggYi9mcy9iZWZzL2lub2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRjN2ZkOQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2JlZnMvaW5vZGUuaApAQCAtMCwwICsxLDggQEAKKy8qCisgKiBpbm9kZS5oCisgKiAKKyAqLworCitpbnQgYmVmc19jaGVja19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2lub2RlICogcmF3X2lub2RlLAorCQkgICAgIGJlZnNfYmxvY2tucl90IGlub2RlKTsKKwpkaWZmIC0tZ2l0IGEvZnMvYmVmcy9pby5jIGIvZnMvYmVmcy9pby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZWY5OGEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9iZWZzL2lvLmMKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIGxpbnV4L2ZzL2JlZnMvaW8uYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBXaWxsIER5c29uIDx3aWxsX2R5c29uQHBvYm94LmNvbQorICoKKyAqIEJhc2VkIG9uIHBvcnRpb25zIG9mIGZpbGUuYyBhbmQgaW5vZGUuYyAKKyAqIGJ5IE1ha290byBLYXRvIChtX2thdG9AZ2EyLnNvLW5ldC5uZS5qcCkKKyAqCisgKiBNYW55IHRoYW5rcyB0byBEb21pbmljIEdpYW1wYW9sbywgYXV0aG9yIG9mIFByYWN0aWNhbCBGaWxlIFN5c3RlbQorICogRGVzaWduIHdpdGggdGhlIEJlIEZpbGUgU3lzdGVtLCBmb3Igc3VjaCBhIGhlbHBmdWwgYm9vay4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisKKyNpbmNsdWRlICJiZWZzLmgiCisjaW5jbHVkZSAiaW8uaCIKKworLyoKKyAqIENvbnZlcnRzIGJlZnMgbm90aW9uIG9mIGRpc2sgYWRkciB0byBhIGRpc2sgb2Zmc2V0IGFuZCB1c2VzCisgKiBsaW51eCBrZXJuZWwgZnVuY3Rpb24gc2JfYnJlYWQoKSB0byBnZXQgdGhlIGJ1ZmZlciBjb250YWluaW5nCisgKiB0aGUgb2Zmc2V0LiAtV2lsbCBEeXNvbgorICoKKyAqLworCitzdHJ1Y3QgYnVmZmVyX2hlYWQgKgorYmVmc19icmVhZF9pYWRkcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBiZWZzX2lub2RlX2FkZHIgaWFkZHIpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJYmVmc19ibG9ja25yX3QgYmxvY2sgPSAwOworCWJlZnNfc2JfaW5mbyAqYmVmc19zYiA9IEJFRlNfU0Ioc2IpOworCisJYmVmc19kZWJ1ZyhzYiwgIi0tLT4gRW50ZXIgYmVmc19yZWFkX2lhZGRyKCkgIgorCQkgICAiWyV1LCAlaHUsICVodV0iLAorCQkgICBpYWRkci5hbGxvY2F0aW9uX2dyb3VwLCBpYWRkci5zdGFydCwgaWFkZHIubGVuKTsKKworCWlmIChpYWRkci5hbGxvY2F0aW9uX2dyb3VwID4gYmVmc19zYi0+bnVtX2FncykgeworCQliZWZzX2Vycm9yKHNiLCAiQkVGUzogSW52YWxpZCBhbGxvY2F0aW9uIGdyb3VwICV1LCBtYXggaXMgJXUiLAorCQkJICAgaWFkZHIuYWxsb2NhdGlvbl9ncm91cCwgYmVmc19zYi0+bnVtX2Fncyk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJYmxvY2sgPSBpYWRkcjJibG9ja25vKHNiLCAmaWFkZHIpOworCisJYmVmc19kZWJ1ZyhzYiwgImJlZnNfcmVhZF9pYWRkcjogb2Zmc2V0ID0gJWx1IiwgYmxvY2spOworCisJYmggPSBzYl9icmVhZChzYiwgYmxvY2spOworCisJaWYgKGJoID09IE5VTEwpIHsKKwkJYmVmc19lcnJvcihzYiwgIkZhaWxlZCB0byByZWFkIGJsb2NrICVsdSIsIGJsb2NrKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwliZWZzX2RlYnVnKHNiLCAiPC0tLSBiZWZzX3JlYWRfaWFkZHIoKSIpOworCXJldHVybiBiaDsKKworICAgICAgZXJyb3I6CisJYmVmc19kZWJ1ZyhzYiwgIjwtLS0gYmVmc19yZWFkX2lhZGRyKCkgRVJST1IiKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGJ1ZmZlcl9oZWFkICoKK2JlZnNfYnJlYWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYmVmc19ibG9ja25yX3QgYmxvY2spCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisKKwliZWZzX2RlYnVnKHNiLCAiLS0tPiBFbnRlciBiZWZzX3JlYWQoKSAlTHUiLCBibG9jayk7CisKKwliaCA9IHNiX2JyZWFkKHNiLCBibG9jayk7CisKKwlpZiAoYmggPT0gTlVMTCkgeworCQliZWZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIHJlYWQgYmxvY2sgJWx1IiwgYmxvY2spOworCQlnb3RvIGVycm9yOworCX0KKworCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfcmVhZCgpIik7CisKKwlyZXR1cm4gYmg7CisKKyAgICAgIGVycm9yOgorCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfcmVhZCgpIEVSUk9SIik7CisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9mcy9iZWZzL2lvLmggYi9mcy9iZWZzL2lvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI3ODI2NgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2JlZnMvaW8uaApAQCAtMCwwICsxLDkgQEAKKy8qCisgKiBpby5oCisgKi8KKworc3RydWN0IGJ1ZmZlcl9oZWFkICpiZWZzX2JyZWFkX2lhZGRyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgICBiZWZzX2lub2RlX2FkZHIgaWFkZHIpOworCitzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJlZnNfYnJlYWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYmVmc19ibG9ja25yX3QgYmxvY2spOworCmRpZmYgLS1naXQgYS9mcy9iZWZzL2xpbnV4dmZzLmMgYi9mcy9iZWZzL2xpbnV4dmZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU1YmIyOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2JlZnMvbGludXh2ZnMuYwpAQCAtMCwwICsxLDk2NCBAQAorLyoKKyAqIGxpbnV4L2ZzL2JlZnMvbGludXh2ZnMuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBXaWxsIER5c29uIDx3aWxsX2R5c29uQHBvYm94LmNvbQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJzZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorCisjaW5jbHVkZSAiYmVmcy5oIgorI2luY2x1ZGUgImJ0cmVlLmgiCisjaW5jbHVkZSAiaW5vZGUuaCIKKyNpbmNsdWRlICJkYXRhc3RyZWFtLmgiCisjaW5jbHVkZSAic3VwZXIuaCIKKyNpbmNsdWRlICJpby5oIgorI2luY2x1ZGUgImVuZGlhbi5oIgorCitNT0RVTEVfREVTQ1JJUFRJT04oIkJlT1MgRmlsZSBTeXN0ZW0gKEJlRlMpIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiV2lsbCBEeXNvbiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKiBUaGUgdW5pdHMgdGhlIHZmcyBleHBlY3RzIGlub2RlLT5pX2Jsb2NrcyB0byBiZSBpbiAqLworI2RlZmluZSBWRlNfQkxPQ0tfU0laRSA1MTIKKworc3RhdGljIGludCBiZWZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKiwgdm9pZCAqLCBmaWxsZGlyX3QpOworc3RhdGljIGludCBiZWZzX2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKiwgc2VjdG9yX3QsIHN0cnVjdCBidWZmZXJfaGVhZCAqLCBpbnQpOworc3RhdGljIGludCBiZWZzX3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSk7CitzdGF0aWMgc2VjdG9yX3QgYmVmc19ibWFwKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzZWN0b3JfdCBibG9jayk7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqYmVmc19sb29rdXAoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IG5hbWVpZGF0YSAqKTsKK3N0YXRpYyB2b2lkIGJlZnNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlubyk7CitzdGF0aWMgc3RydWN0IGlub2RlICpiZWZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworc3RhdGljIHZvaWQgYmVmc19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworc3RhdGljIGludCBiZWZzX2luaXRfaW5vZGVjYWNoZSh2b2lkKTsKK3N0YXRpYyB2b2lkIGJlZnNfZGVzdHJveV9pbm9kZWNhY2hlKHZvaWQpOworc3RhdGljIGludCBiZWZzX2ZvbGxvd19saW5rKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IG5hbWVpZGF0YSAqKTsKK3N0YXRpYyB2b2lkIGJlZnNfcHV0X2xpbmsoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgbmFtZWlkYXRhICopOworc3RhdGljIGludCBiZWZzX3V0ZjJubHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqaW4sIGludCBpbl9sZW4sCisJCQljaGFyICoqb3V0LCBpbnQgKm91dF9sZW4pOworc3RhdGljIGludCBiZWZzX25sczJ1dGYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqaW4sIGludCBpbl9sZW4sCisJCQljaGFyICoqb3V0LCBpbnQgKm91dF9sZW4pOworc3RhdGljIHZvaWQgYmVmc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICopOworc3RhdGljIGludCBiZWZzX3JlbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCAqLCBjaGFyICopOworc3RhdGljIGludCBiZWZzX3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGtzdGF0ZnMgKik7CitzdGF0aWMgaW50IHBhcnNlX29wdGlvbnMoY2hhciAqLCBiZWZzX21vdW50X29wdGlvbnMgKik7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBiZWZzX3NvcHMgPSB7CisJLnJlYWRfaW5vZGUJPSBiZWZzX3JlYWRfaW5vZGUsCS8qIGluaXRpYWxpemUgJiByZWFkIGlub2RlICovCisJLmFsbG9jX2lub2RlCT0gYmVmc19hbGxvY19pbm9kZSwJLyogYWxsb2NhdGUgYSBuZXcgaW5vZGUgKi8KKwkuZGVzdHJveV9pbm9kZQk9IGJlZnNfZGVzdHJveV9pbm9kZSwgLyogZGVhbGxvY2F0ZSBhbiBpbm9kZSAqLworCS5wdXRfc3VwZXIJPSBiZWZzX3B1dF9zdXBlciwJLyogdW5pbml0IHN1cGVyICovCisJLnN0YXRmcwkJPSBiZWZzX3N0YXRmcywJLyogc3RhdGZzICovCisJLnJlbW91bnRfZnMJPSBiZWZzX3JlbW91bnQsCit9OworCisvKiBzbGFiIGNhY2hlIGZvciBiZWZzX2lub2RlX2luZm8gb2JqZWN0cyAqLworc3RhdGljIGttZW1fY2FjaGVfdCAqYmVmc19pbm9kZV9jYWNoZXA7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJlZnNfZGlyX29wZXJhdGlvbnMgPSB7CisJLnJlYWQJCT0gZ2VuZXJpY19yZWFkX2RpciwKKwkucmVhZGRpcgk9IGJlZnNfcmVhZGRpciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBiZWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0geworCS5sb29rdXAJCT0gYmVmc19sb29rdXAsCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBiZWZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkubGxzZWVrCQk9IGRlZmF1bHRfbGxzZWVrLAorCS5yZWFkCQk9IGdlbmVyaWNfZmlsZV9yZWFkLAorCS5tbWFwCQk9IGdlbmVyaWNfZmlsZV9yZWFkb25seV9tbWFwLAorfTsKKworc3RhdGljIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgYmVmc19hb3BzID0geworCS5yZWFkcGFnZQk9IGJlZnNfcmVhZHBhZ2UsCisJLnN5bmNfcGFnZQk9IGJsb2NrX3N5bmNfcGFnZSwKKwkuYm1hcAkJPSBiZWZzX2JtYXAsCit9OworCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgYmVmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnJlYWRsaW5rCT0gZ2VuZXJpY19yZWFkbGluaywKKwkuZm9sbG93X2xpbmsJPSBiZWZzX2ZvbGxvd19saW5rLAorCS5wdXRfbGluawk9IGJlZnNfcHV0X2xpbmssCit9OworCisvKiAKKyAqIENhbGxlZCBieSBnZW5lcmljX2ZpbGVfcmVhZCgpIHRvIHJlYWQgYSBwYWdlIG9mIGRhdGEKKyAqIAorICogSW4gdHVybiwgc2ltcGx5IGNhbGxzIGEgZ2VuZXJpYyBibG9jayByZWFkIGZ1bmN0aW9uIGFuZAorICogcGFzc2VzIGl0IHRoZSBhZGRyZXNzIG9mIGJlZnNfZ2V0X2Jsb2NrLCBmb3IgbWFwcGluZyBmaWxlCisgKiBwb3NpdGlvbnMgdG8gZGlzayBibG9ja3MuCisgKi8KK3N0YXRpYyBpbnQKK2JlZnNfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiBibG9ja19yZWFkX2Z1bGxfcGFnZShwYWdlLCBiZWZzX2dldF9ibG9jayk7Cit9CisKK3N0YXRpYyBzZWN0b3JfdAorYmVmc19ibWFwKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzZWN0b3JfdCBibG9jaykKK3sKKwlyZXR1cm4gZ2VuZXJpY19ibG9ja19ibWFwKG1hcHBpbmcsIGJsb2NrLCBiZWZzX2dldF9ibG9jayk7Cit9CisKKy8qIAorICogR2VuZXJpYyBmdW5jdGlvbiB0byBtYXAgYSBmaWxlIHBvc2l0aW9uIChibG9jaykgdG8gYSAKKyAqIGRpc2sgb2Zmc2V0IChwYXNzZWQgYmFjayBpbiBiaF9yZXN1bHQpLgorICoKKyAqIFVzZWQgYnkgbWFueSBoaWdoZXIgbGV2ZWwgZnVuY3Rpb25zLgorICoKKyAqIENhbGxzIGJlZnNfZmJsb2NrMmJydW4oKSBpbiBkYXRhc3RyZWFtLmMgdG8gZG8gdGhlIHJlYWwgd29yay4KKyAqCisgKiAtV0QgMTAtMjYtMDEKKyAqLworCitzdGF0aWMgaW50CitiZWZzX2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBibG9jaywKKwkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCWJlZnNfZGF0YV9zdHJlYW0gKmRzID0gJkJFRlNfSShpbm9kZSktPmlfZGF0YS5kczsKKwliZWZzX2Jsb2NrX3J1biBydW4gPSBCQURfSUFERFI7CisJaW50IHJlcyA9IDA7CisJdWxvbmcgZGlza19vZmY7CisKKwliZWZzX2RlYnVnKHNiLCAiLS0tPiBiZWZzX2dldF9ibG9jaygpIGZvciBpbm9kZSAlbHUsIGJsb2NrICVsZCIsCisJCSAgIGlub2RlLT5pX2lubywgYmxvY2spOworCisJaWYgKGJsb2NrIDwgMCkgeworCQliZWZzX2Vycm9yKHNiLCAiYmVmc19nZXRfYmxvY2soKSB3YXMgYXNrZWQgZm9yIGEgYmxvY2sgIgorCQkJICAgIm51bWJlciBsZXNzIHRoYW4gemVybzogYmxvY2sgJWxkIGluIGlub2RlICVsdSIsCisJCQkgICBibG9jaywgaW5vZGUtPmlfaW5vKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKGNyZWF0ZSkgeworCQliZWZzX2Vycm9yKHNiLCAiYmVmc19nZXRfYmxvY2soKSB3YXMgYXNrZWQgdG8gd3JpdGUgdG8gIgorCQkJICAgImJsb2NrICVsZCBpbiBpbm9kZSAlbHUiLCBibG9jaywgaW5vZGUtPmlfaW5vKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlyZXMgPSBiZWZzX2ZibG9jazJicnVuKHNiLCBkcywgYmxvY2ssICZydW4pOworCWlmIChyZXMgIT0gQkVGU19PSykgeworCQliZWZzX2Vycm9yKHNiLAorCQkJICAgIjwtLS0gYmVmc19nZXRfYmxvY2soKSBmb3IgaW5vZGUgJWx1LCBibG9jayAiCisJCQkgICAiJWxkIEVSUk9SIiwgaW5vZGUtPmlfaW5vLCBibG9jayk7CisJCXJldHVybiAtRUZCSUc7CisJfQorCisJZGlza19vZmYgPSAodWxvbmcpIGlhZGRyMmJsb2Nrbm8oc2IsICZydW4pOworCisJbWFwX2JoKGJoX3Jlc3VsdCwgaW5vZGUtPmlfc2IsIGRpc2tfb2ZmKTsKKworCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfZ2V0X2Jsb2NrKCkgZm9yIGlub2RlICVsdSwgYmxvY2sgJWxkLCAiCisJCSAgICJkaXNrIGFkZHJlc3MgJWx1IiwgaW5vZGUtPmlfaW5vLCBibG9jaywgZGlza19vZmYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICoKK2JlZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPmlfc2I7CisJYmVmc19kYXRhX3N0cmVhbSAqZHMgPSAmQkVGU19JKGRpciktPmlfZGF0YS5kczsKKwliZWZzX29mZl90IG9mZnNldDsKKwlpbnQgcmV0OworCWludCB1dGZuYW1lbGVuOworCWNoYXIgKnV0Zm5hbWU7CisJY29uc3QgY2hhciAqbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7CisKKwliZWZzX2RlYnVnKHNiLCAiLS0tPiBiZWZzX2xvb2t1cCgpICIKKwkJICAgIm5hbWUgJXMgaW5vZGUgJWxkIiwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGlyLT5pX2lubyk7CisKKwkvKiBDb252ZXJ0IHRvIFVURi04ICovCisJaWYgKEJFRlNfU0Ioc2IpLT5ubHMpIHsKKwkJcmV0ID0KKwkJICAgIGJlZnNfbmxzMnV0ZihzYiwgbmFtZSwgc3RybGVuKG5hbWUpLCAmdXRmbmFtZSwgJnV0Zm5hbWVsZW4pOworCQlpZiAocmV0IDwgMCkgeworCQkJYmVmc19kZWJ1ZyhzYiwgIjwtLS0gYmVmc19sb29rdXAoKSBFUlJPUiIpOworCQkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwkJfQorCQlyZXQgPSBiZWZzX2J0cmVlX2ZpbmQoc2IsIGRzLCB1dGZuYW1lLCAmb2Zmc2V0KTsKKwkJa2ZyZWUodXRmbmFtZSk7CisKKwl9IGVsc2UgeworCQlyZXQgPSBiZWZzX2J0cmVlX2ZpbmQoc2IsIGRzLCBkZW50cnktPmRfbmFtZS5uYW1lLCAmb2Zmc2V0KTsKKwl9CisKKwlpZiAocmV0ID09IEJFRlNfQlRfTk9UX0ZPVU5EKSB7CisJCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfbG9va3VwKCkgJXMgbm90IGZvdW5kIiwKKwkJCSAgIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKKworCX0gZWxzZSBpZiAocmV0ICE9IEJFRlNfT0sgfHwgb2Zmc2V0ID09IDApIHsKKwkJYmVmc193YXJuaW5nKHNiLCAiPC0tLSBiZWZzX2xvb2t1cCgpIEVycm9yIik7CisJCXJldHVybiBFUlJfUFRSKC1FTk9EQVRBKTsKKwl9CisKKwlpbm9kZSA9IGlnZXQoZGlyLT5pX3NiLCAoaW5vX3QpIG9mZnNldCk7CisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CisKKwlkX2FkZChkZW50cnksIGlub2RlKTsKKworCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfbG9va3VwKCkiKTsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50CitiZWZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwliZWZzX2RhdGFfc3RyZWFtICpkcyA9ICZCRUZTX0koaW5vZGUpLT5pX2RhdGEuZHM7CisJYmVmc19vZmZfdCB2YWx1ZTsKKwlpbnQgcmVzdWx0OworCXNpemVfdCBrZXlzaXplOworCXVuc2lnbmVkIGNoYXIgZF90eXBlOworCWNoYXIga2V5YnVmW0JFRlNfTkFNRV9MRU4gKyAxXTsKKwljaGFyICpubHNuYW1lOworCWludCBubHNuYW1lbGVuOworCWNvbnN0IGNoYXIgKmRpcm5hbWUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9uYW1lLm5hbWU7CisKKwliZWZzX2RlYnVnKHNiLCAiLS0tPiBiZWZzX3JlYWRkaXIoKSAiCisJCSAgICJuYW1lICVzLCBpbm9kZSAlbGQsIGZpbHAtPmZfcG9zICVMZCIsCisJCSAgIGRpcm5hbWUsIGlub2RlLT5pX2lubywgZmlscC0+Zl9wb3MpOworCisJcmVzdWx0ID0gYmVmc19idHJlZV9yZWFkKHNiLCBkcywgZmlscC0+Zl9wb3MsIEJFRlNfTkFNRV9MRU4gKyAxLAorCQkJCSBrZXlidWYsICZrZXlzaXplLCAmdmFsdWUpOworCisJaWYgKHJlc3VsdCA9PSBCRUZTX0VSUikgeworCQliZWZzX2RlYnVnKHNiLCAiPC0tLSBiZWZzX3JlYWRkaXIoKSBFUlJPUiIpOworCQliZWZzX2Vycm9yKHNiLCAiSU8gZXJyb3IgcmVhZGluZyAlcyAoaW5vZGUgJWx1KSIsCisJCQkgICBkaXJuYW1lLCBpbm9kZS0+aV9pbm8pOworCQlyZXR1cm4gLUVJTzsKKworCX0gZWxzZSBpZiAocmVzdWx0ID09IEJFRlNfQlRfRU5EKSB7CisJCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfcmVhZGRpcigpIEVORCIpOworCQlyZXR1cm4gMDsKKworCX0gZWxzZSBpZiAocmVzdWx0ID09IEJFRlNfQlRfRU1QVFkpIHsKKwkJYmVmc19kZWJ1ZyhzYiwgIjwtLS0gYmVmc19yZWFkZGlyKCkgRW1wdHkgZGlyZWN0b3J5Iik7CisJCXJldHVybiAwOworCX0KKworCWRfdHlwZSA9IERUX1VOS05PV047CisKKwkvKiBDb252ZXJ0IHRvIE5MUyAqLworCWlmIChCRUZTX1NCKHNiKS0+bmxzKSB7CisJCXJlc3VsdCA9CisJCSAgICBiZWZzX3V0ZjJubHMoc2IsIGtleWJ1Ziwga2V5c2l6ZSwgJm5sc25hbWUsICZubHNuYW1lbGVuKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfcmVhZGRpcigpIEVSUk9SIik7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCXJlc3VsdCA9IGZpbGxkaXIoZGlyZW50LCBubHNuYW1lLCBubHNuYW1lbGVuLCBmaWxwLT5mX3BvcywKKwkJCQkgKGlub190KSB2YWx1ZSwgZF90eXBlKTsKKwkJa2ZyZWUobmxzbmFtZSk7CisKKwl9IGVsc2UgeworCQlyZXN1bHQgPSBmaWxsZGlyKGRpcmVudCwga2V5YnVmLCBrZXlzaXplLCBmaWxwLT5mX3BvcywKKwkJCQkgKGlub190KSB2YWx1ZSwgZF90eXBlKTsKKwl9CisKKwlmaWxwLT5mX3BvcysrOworCisJYmVmc19kZWJ1ZyhzYiwgIjwtLS0gYmVmc19yZWFkZGlyKCkgZmlscC0+Zl9wb3MgJUxkIiwgZmlscC0+Zl9wb3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKgorYmVmc19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworICAgICAgICBzdHJ1Y3QgYmVmc19pbm9kZV9pbmZvICpiaTsKKyAgICAgICAgYmkgPSAoc3RydWN0IGJlZnNfaW5vZGVfaW5mbyAqKWttZW1fY2FjaGVfYWxsb2MoYmVmc19pbm9kZV9jYWNoZXAsCisJCQkJCQkJU0xBQl9LRVJORUwpOworICAgICAgICBpZiAoIWJpKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gJmJpLT52ZnNfaW5vZGU7Cit9CisKK3N0YXRpYyB2b2lkCitiZWZzX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKyAgICAgICAga21lbV9jYWNoZV9mcmVlKGJlZnNfaW5vZGVfY2FjaGVwLCBCRUZTX0koaW5vZGUpKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKiBmb28sIGttZW1fY2FjaGVfdCAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKyAgICAgICAgc3RydWN0IGJlZnNfaW5vZGVfaW5mbyAqYmkgPSAoc3RydWN0IGJlZnNfaW5vZGVfaW5mbyAqKSBmb287CisJCisJICAgICAgICBpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRll8U0xBQl9DVE9SX0NPTlNUUlVDVE9SKSkgPT0KKwkJICAgICAgICAgICAgU0xBQl9DVE9SX0NPTlNUUlVDVE9SKSB7CisJCQlpbm9kZV9pbml0X29uY2UoJmJpLT52ZnNfaW5vZGUpOworCQl9Cit9CisKK3N0YXRpYyB2b2lkCitiZWZzX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwliZWZzX2lub2RlICpyYXdfaW5vZGUgPSBOVUxMOworCisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCWJlZnNfc2JfaW5mbyAqYmVmc19zYiA9IEJFRlNfU0Ioc2IpOworCWJlZnNfaW5vZGVfaW5mbyAqYmVmc19pbm8gPSBOVUxMOworCisJYmVmc19kZWJ1ZyhzYiwgIi0tLT4gYmVmc19yZWFkX2lub2RlKCkgIiAiaW5vZGUgPSAlbHUiLCBpbm9kZS0+aV9pbm8pOworCisJYmVmc19pbm8gPSBCRUZTX0koaW5vZGUpOworCisJLyogY29udmVydCBmcm9tIHZmcydzIGlub2RlIG51bWJlciB0byBiZWZzJ3MgaW5vZGUgbnVtYmVyICovCisJYmVmc19pbm8tPmlfaW5vZGVfbnVtID0gYmxvY2tubzJpYWRkcihzYiwgaW5vZGUtPmlfaW5vKTsKKworCWJlZnNfZGVidWcoc2IsICIgIHJlYWwgaW5vZGUgbnVtYmVyIFsldSwgJWh1LCAlaHVdIiwKKwkJICAgYmVmc19pbm8tPmlfaW5vZGVfbnVtLmFsbG9jYXRpb25fZ3JvdXAsCisJCSAgIGJlZnNfaW5vLT5pX2lub2RlX251bS5zdGFydCwgYmVmc19pbm8tPmlfaW5vZGVfbnVtLmxlbik7CisKKwliaCA9IGJlZnNfYnJlYWQoc2IsIGlub2RlLT5pX2lubyk7CisJaWYgKCFiaCkgeworCQliZWZzX2Vycm9yKHNiLCAidW5hYmxlIHRvIHJlYWQgaW5vZGUgYmxvY2sgLSAiCisJCQkgICAiaW5vZGUgPSAlbHUiLCBpbm9kZS0+aV9pbm8pOworCQlnb3RvIHVuYXF1aXJlX25vbmU7CisJfQorCisJcmF3X2lub2RlID0gKGJlZnNfaW5vZGUgKikgYmgtPmJfZGF0YTsKKworCWJlZnNfZHVtcF9pbm9kZShzYiwgcmF3X2lub2RlKTsKKworCWlmIChiZWZzX2NoZWNrX2lub2RlKHNiLCByYXdfaW5vZGUsIGlub2RlLT5pX2lubykgIT0gQkVGU19PSykgeworCQliZWZzX2Vycm9yKHNiLCAiQmFkIGlub2RlOiAlbHUiLCBpbm9kZS0+aV9pbm8pOworCQlnb3RvIHVuYXF1aXJlX2JoOworCX0KKworCWlub2RlLT5pX21vZGUgPSAodW1vZGVfdCkgZnMzMl90b19jcHUoc2IsIHJhd19pbm9kZS0+bW9kZSk7CisKKwkvKgorCSAqIHNldCB1aWQgYW5kIGdpZC4gIEJ1dCBzaW5jZSBjdXJyZW50IEJlT1MgaXMgc2luZ2xlIHVzZXIgT1MsIHNvCisJICogeW91IGNhbiBjaGFuZ2UgYnkgInVpZCIgb3IgImdpZCIgb3B0aW9ucy4KKwkgKi8gICAKKworCWlub2RlLT5pX3VpZCA9IGJlZnNfc2ItPm1vdW50X29wdHMudXNlX3VpZCA/CisJICAgIGJlZnNfc2ItPm1vdW50X29wdHMudWlkIDogKHVpZF90KSBmczMyX3RvX2NwdShzYiwgcmF3X2lub2RlLT51aWQpOworCWlub2RlLT5pX2dpZCA9IGJlZnNfc2ItPm1vdW50X29wdHMudXNlX2dpZCA/CisJICAgIGJlZnNfc2ItPm1vdW50X29wdHMuZ2lkIDogKGdpZF90KSBmczMyX3RvX2NwdShzYiwgcmF3X2lub2RlLT5naWQpOworCisJaW5vZGUtPmlfbmxpbmsgPSAxOworCisJLyoKKwkgKiBCRUZTJ3MgdGltZSBpcyA2NCBiaXRzLCBidXQgY3VycmVudCBWRlMgaXMgMzIgYml0cy4uLgorCSAqIEJFRlMgZG9uJ3QgaGF2ZSBhY2Nlc3MgdGltZS4gTm9yIGlub2RlIGNoYW5nZSB0aW1lLiBWRlMKKwkgKiBkb2Vzbid0IGhhdmUgY3JlYXRpb24gdGltZS4KKwkgKiBBbHNvLCB0aGUgbG93ZXIgMTYgYml0cyBvZiB0aGUgbGFzdF9tb2RpZmllZF90aW1lIGFuZCAKKwkgKiBjcmVhdGVfdGltZSBhcmUganVzdCBhIGNvdW50ZXIgdG8gaGVscCBlbnN1cmUgdW5pcXVlbmVzcworCSAqIGZvciBpbmRleGluZyBwdXJwb3Nlcy4gKFBGRCwgcGFnZSA1NCkKKwkgKi8KKworCWlub2RlLT5pX210aW1lLnR2X3NlYyA9CisJICAgIGZzNjRfdG9fY3B1KHNiLCByYXdfaW5vZGUtPmxhc3RfbW9kaWZpZWRfdGltZSkgPj4gMTY7CisJaW5vZGUtPmlfbXRpbWUudHZfbnNlYyA9IDA7ICAgLyogbG93ZXIgMTYgYml0cyBhcmUgbm90IGEgdGltZSAqLwkKKwlpbm9kZS0+aV9jdGltZSA9IGlub2RlLT5pX210aW1lOworCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWU7CisJaW5vZGUtPmlfYmxrc2l6ZSA9IGJlZnNfc2ItPmJsb2NrX3NpemU7CisKKwliZWZzX2luby0+aV9pbm9kZV9udW0gPSBmc3J1bl90b19jcHUoc2IsIHJhd19pbm9kZS0+aW5vZGVfbnVtKTsKKwliZWZzX2luby0+aV9wYXJlbnQgPSBmc3J1bl90b19jcHUoc2IsIHJhd19pbm9kZS0+cGFyZW50KTsKKwliZWZzX2luby0+aV9hdHRyaWJ1dGUgPSBmc3J1bl90b19jcHUoc2IsIHJhd19pbm9kZS0+YXR0cmlidXRlcyk7CisJYmVmc19pbm8tPmlfZmxhZ3MgPSBmczMyX3RvX2NwdShzYiwgcmF3X2lub2RlLT5mbGFncyk7CisKKwlpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSAmJiAhKGJlZnNfaW5vLT5pX2ZsYWdzICYgQkVGU19MT05HX1NZTUxJTkspKXsKKwkJaW5vZGUtPmlfc2l6ZSA9IDA7CisJCWlub2RlLT5pX2Jsb2NrcyA9IGJlZnNfc2ItPmJsb2NrX3NpemUgLyBWRlNfQkxPQ0tfU0laRTsKKwkJc3RybmNweShiZWZzX2luby0+aV9kYXRhLnN5bWxpbmssIHJhd19pbm9kZS0+ZGF0YS5zeW1saW5rLAorCQkJQkVGU19TWU1MSU5LX0xFTik7CisJfSBlbHNlIHsKKwkJaW50IG51bV9ibGtzOworCisJCWJlZnNfaW5vLT5pX2RhdGEuZHMgPQorCQkgICAgZnNkc190b19jcHUoc2IsIHJhd19pbm9kZS0+ZGF0YS5kYXRhc3RyZWFtKTsKKworCQludW1fYmxrcyA9IGJlZnNfY291bnRfYmxvY2tzKHNiLCAmYmVmc19pbm8tPmlfZGF0YS5kcyk7CisJCWlub2RlLT5pX2Jsb2NrcyA9CisJCSAgICBudW1fYmxrcyAqIChiZWZzX3NiLT5ibG9ja19zaXplIC8gVkZTX0JMT0NLX1NJWkUpOworCQlpbm9kZS0+aV9zaXplID0gYmVmc19pbm8tPmlfZGF0YS5kcy5zaXplOworCX0KKworCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmJlZnNfYW9wczsKKworCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisJCWlub2RlLT5pX2ZvcCA9ICZiZWZzX2ZpbGVfb3BlcmF0aW9uczsKKwl9IGVsc2UgaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaW5vZGUtPmlfb3AgPSAmYmVmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJmJlZnNfZGlyX29wZXJhdGlvbnM7CisJfSBlbHNlIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKSB7CisJCWlub2RlLT5pX29wID0gJmJlZnNfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCX0gZWxzZSB7CisJCWJlZnNfZXJyb3Ioc2IsICJJbm9kZSAlbHUgaXMgbm90IGEgcmVndWxhciBmaWxlLCAiCisJCQkgICAiZGlyZWN0b3J5IG9yIHN5bWxpbmsuIFRIQVQgSVMgV1JPTkchIEJlRlMgaGFzIG5vICIKKwkJCSAgICJvbiBkaXNrIHNwZWNpYWwgZmlsZXMiLCBpbm9kZS0+aV9pbm8pOworCQlnb3RvIHVuYXF1aXJlX2JoOworCX0KKworCWJyZWxzZShiaCk7CisJYmVmc19kZWJ1ZyhzYiwgIjwtLS0gYmVmc19yZWFkX2lub2RlKCkiKTsKKwlyZXR1cm47CisKKyAgICAgIHVuYXF1aXJlX2JoOgorCWJyZWxzZShiaCk7CisKKyAgICAgIHVuYXF1aXJlX25vbmU6CisJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCWJlZnNfZGVidWcoc2IsICI8LS0tIGJlZnNfcmVhZF9pbm9kZSgpIC0gQmFkIGlub2RlIik7CisJcmV0dXJuOworfQorCisvKiBJbml0aWFsaXplIHRoZSBpbm9kZSBjYWNoZS4gQ2FsbGVkIGF0IGZzIHNldHVwLgorICogCisgKiBUYWtlbiBmcm9tIE5GUyBpbXBsZW1lbnRhdGlvbiBieSBBbCBWaXJvLgorICovCitzdGF0aWMgaW50CitiZWZzX2luaXRfaW5vZGVjYWNoZSh2b2lkKQoreworCWJlZnNfaW5vZGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoImJlZnNfaW5vZGVfY2FjaGUiLAorCQkJCQkgICAgICBzaXplb2YgKHN0cnVjdCBiZWZzX2lub2RlX2luZm8pLAorCQkJCQkgICAgICAwLCBTTEFCX1JFQ0xBSU1fQUNDT1VOVCwKKwkJCQkJICAgICAgaW5pdF9vbmNlLCBOVUxMKTsKKwlpZiAoYmVmc19pbm9kZV9jYWNoZXAgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImJlZnNfaW5pdF9pbm9kZWNhY2hlOiAiCisJCSAgICAgICAiQ291bGRuJ3QgaW5pdGFsaXplIGlub2RlIHNsYWJjYWNoZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorCisvKiBDYWxsZWQgYXQgZnMgdGVhcmRvd24uCisgKiAKKyAqIFRha2VuIGZyb20gTkZTIGltcGxlbWVudGF0aW9uIGJ5IEFsIFZpcm8uCisgKi8KK3N0YXRpYyB2b2lkCitiZWZzX2Rlc3Ryb3lfaW5vZGVjYWNoZSh2b2lkKQoreworCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3koYmVmc19pbm9kZV9jYWNoZXApKQorCQlwcmludGsoS0VSTl9FUlIgImJlZnNfZGVzdHJveV9pbm9kZWNhY2hlOiAiCisJCSAgICAgICAibm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOworfQorCisvKgorICogVGhlIGlub2RlIG9mIHN5bWJvbGljIGxpbmsgaXMgZGlmZmVyZW50IHRvIGRhdGEgc3RyZWFtLgorICogVGhlIGRhdGEgc3RyZWFtIGJlY29tZSBsaW5rIG5hbWUuIFVubGVzcyB0aGUgTE9OR19TWU1MSU5LCisgKiBmbGFnIGlzIHNldC4KKyAqLworc3RhdGljIGludAorYmVmc19mb2xsb3dfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWJlZnNfaW5vZGVfaW5mbyAqYmVmc19pbm8gPSBCRUZTX0koZGVudHJ5LT5kX2lub2RlKTsKKwljaGFyICpsaW5rOworCisJaWYgKGJlZnNfaW5vLT5pX2ZsYWdzICYgQkVGU19MT05HX1NZTUxJTkspIHsKKwkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRlbnRyeS0+ZF9zYjsKKwkJYmVmc19kYXRhX3N0cmVhbSAqZGF0YSA9ICZiZWZzX2luby0+aV9kYXRhLmRzOworCQliZWZzX29mZl90IGxlbiA9IGRhdGEtPnNpemU7CisKKwkJYmVmc19kZWJ1ZyhzYiwgIkZvbGxvdyBsb25nIHN5bWxpbmsiKTsKKworCQlsaW5rID0ga21hbGxvYyhsZW4sIEdGUF9OT0ZTKTsKKwkJaWYgKCFsaW5rKSB7CisJCQlsaW5rID0gRVJSX1BUUigtRU5PTUVNKTsKKwkJfSBlbHNlIGlmIChiZWZzX3JlYWRfbHN5bWxpbmsoc2IsIGRhdGEsIGxpbmssIGxlbikgIT0gbGVuKSB7CisJCQlrZnJlZShsaW5rKTsKKwkJCWJlZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gcmVhZCBlbnRpcmUgbG9uZyBzeW1saW5rIik7CisJCQlsaW5rID0gRVJSX1BUUigtRUlPKTsKKwkJfQorCX0gZWxzZSB7CisJCWxpbmsgPSBiZWZzX2luby0+aV9kYXRhLnN5bWxpbms7CisJfQorCisJbmRfc2V0X2xpbmsobmQsIGxpbmspOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBiZWZzX3B1dF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJYmVmc19pbm9kZV9pbmZvICpiZWZzX2lubyA9IEJFRlNfSShkZW50cnktPmRfaW5vZGUpOworCWlmIChiZWZzX2luby0+aV9mbGFncyAmIEJFRlNfTE9OR19TWU1MSU5LKSB7CisJCWNoYXIgKnAgPSBuZF9nZXRfbGluayhuZCk7CisJCWlmICghSVNfRVJSKHApKQorCQkJa2ZyZWUocCk7CisJfQorfQorCisvKgorICogVVRGLTggdG8gTkxTIGNoYXJzZXQgIGNvbnZlcnQgcm91dGluZQorICogCisgKgorICogQ2hhbmdlZCA4LzEwLzAxIGJ5IFdpbGwgRHlzb24uIE5vdyB1c2UgdW5pMmNoYXIoKSAvIGNoYXIydW5pKCkgcmF0aGVyIHRoYW4KKyAqIHRoZSBubHMgdGFibGVzIGRpcmVjdGx5CisgKi8KKworc3RhdGljIGludAorYmVmc191dGYybmxzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKmluLAorCSAgICAgaW50IGluX2xlbiwgY2hhciAqKm91dCwgaW50ICpvdXRfbGVuKQoreworCXN0cnVjdCBubHNfdGFibGUgKm5scyA9IEJFRlNfU0Ioc2IpLT5ubHM7CisJaW50IGksIG87CisJd2NoYXJfdCB1bmk7CisJaW50IHVuaWxlbiwgdXRmbGVuOworCWNoYXIgKnJlc3VsdDsKKwlpbnQgbWF4bGVuID0gaW5fbGVuOyAvKiBUaGUgdXRmOC0+bmxzIGNvbnZlcnNpb24gY2FuJ3QgbWFrZSBtb3JlIGNoYXJzICovCisKKwliZWZzX2RlYnVnKHNiLCAiLS0tPiB1dGYybmxzKCkiKTsKKworCWlmICghbmxzKSB7CisJCWJlZnNfZXJyb3Ioc2IsICJiZWZzX3V0ZjJubHMgY2FsbGVkIHdpdGggbm8gTkxTIHRhYmxlIGxvYWRlZCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkqb3V0ID0gcmVzdWx0ID0ga21hbGxvYyhtYXhsZW4sIEdGUF9OT0ZTKTsKKwlpZiAoISpvdXQpIHsKKwkJYmVmc19lcnJvcihzYiwgImJlZnNfdXRmMm5scygpIGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkiKTsKKwkJKm91dF9sZW4gPSAwOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmb3IgKGkgPSBvID0gMDsgaSA8IGluX2xlbjsgaSArPSB1dGZsZW4sIG8gKz0gdW5pbGVuKSB7CisKKwkJLyogY29udmVydCBmcm9tIFVURi04IHRvIFVuaWNvZGUgKi8KKwkJdXRmbGVuID0gdXRmOF9tYnRvd2MoJnVuaSwgJmluW2ldLCBpbl9sZW4gLSBpKTsKKwkJaWYgKHV0ZmxlbiA8IDApIHsKKwkJCWdvdG8gY29udl9lcnI7CisJCX0KKworCQkvKiBjb252ZXJ0IGZyb20gVW5pY29kZSB0byBubHMgKi8KKwkJdW5pbGVuID0gbmxzLT51bmkyY2hhcih1bmksICZyZXN1bHRbb10sIGluX2xlbiAtIG8pOworCQlpZiAodW5pbGVuIDwgMCkgeworCQkJZ290byBjb252X2VycjsKKwkJfQorCX0KKwlyZXN1bHRbb10gPSAnXDAnOworCSpvdXRfbGVuID0gbzsKKworCWJlZnNfZGVidWcoc2IsICI8LS0tIHV0ZjJubHMoKSIpOworCisJcmV0dXJuIG87CisKKyAgICAgIGNvbnZfZXJyOgorCWJlZnNfZXJyb3Ioc2IsICJOYW1lIHVzaW5nIGNoYXJhY3RlciBzZXQgJXMgY29udGFpbnMgYSBjaGFyYWN0ZXIgdGhhdCAiCisJCSAgICJjYW5ub3QgYmUgY29udmVydGVkIHRvIHVuaWNvZGUuIiwgbmxzLT5jaGFyc2V0KTsKKwliZWZzX2RlYnVnKHNiLCAiPC0tLSB1dGYybmxzKCkiKTsKKwlrZnJlZShyZXN1bHQpOworCXJldHVybiAtRUlMU0VROworfQorCisvKioKKyAqIGJlZnNfbmxzMnV0ZiAtIENvbnZlcnQgTkxTIHN0cmluZyB0byB1dGY4IGVuY29kZWluZworICogQHNiOiBTdXBlcmJsb2NrCisgKiBAc3JjOiBJbnB1dCBzdHJpbmcgYnVmZmVyIGluIE5MUyBmb3JtYXQKKyAqIEBzcmNsZW46IExlbmd0aCBvZiBpbnB1dCBzdHJpbmcgaW4gYnl0ZXMKKyAqIEBkZXN0OiBUaGUgb3V0cHV0IHN0cmluZyBpbiBVVEY4IGZvcm1hdAorICogQGRlc3RsZW46IExlbmd0aCBvZiB0aGUgb3V0cHV0IGJ1ZmZlcgorICogCisgKiBDb252ZXJ0cyBpbnB1dCBzdHJpbmcgQHNyYywgd2hpY2ggaXMgaW4gdGhlIGZvcm1hdCBvZiB0aGUgbG9hZGVkIE5MUyBtYXAsCisgKiBpbnRvIGEgdXRmOCBzdHJpbmcuCisgKiAKKyAqIFRoZSBkZXN0aW5hdGlvbiBzdHJpbmcgQGRlc3QgaXMgYWxsb2NhdGVkIGJ5IHRoaXMgZnVuY3Rpb24gYW5kIHRoZSBjYWxsZXIgaXMKKyAqIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIGl0IHdpdGgga2ZyZWUoKQorICogCisgKiBPbiByZXR1cm4sICpAZGVzdGxlbiBpcyB0aGUgbGVuZ3RoIG9mIEBkZXN0IGluIGJ5dGVzLgorICoKKyAqIE9uIHN1Y2Nlc3MsIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIG51bWJlciBvZiB1dGY4IGNoYXJhY3RlcnMgd3JpdHRlbiB0bworICogdGhlIG91dHB1dCBidWZmZXIgQGRlc3QuCisgKiAgCisgKiBPbiBGYWlsdXJlLCBhIG5lZ2F0aXZlIG51bWJlciBjb3Jlc3BvbmRpbmcgdG8gdGhlIGVycm9yIGNvZGUgaXMgcmV0dXJuZWQuCisgKi8KKworc3RhdGljIGludAorYmVmc19ubHMydXRmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKmluLAorCSAgICAgaW50IGluX2xlbiwgY2hhciAqKm91dCwgaW50ICpvdXRfbGVuKQoreworCXN0cnVjdCBubHNfdGFibGUgKm5scyA9IEJFRlNfU0Ioc2IpLT5ubHM7CisJaW50IGksIG87CisJd2NoYXJfdCB1bmk7CisJaW50IHVuaWxlbiwgdXRmbGVuOworCWNoYXIgKnJlc3VsdDsKKwlpbnQgbWF4bGVuID0gMyAqIGluX2xlbjsKKworCWJlZnNfZGVidWcoc2IsICItLS0+IG5sczJ1dGYoKVxuIik7CisKKwlpZiAoIW5scykgeworCQliZWZzX2Vycm9yKHNiLCAiYmVmc19ubHMydXRmIGNhbGxlZCB3aXRoIG5vIE5MUyB0YWJsZSBsb2FkZWQuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCSpvdXQgPSByZXN1bHQgPSBrbWFsbG9jKG1heGxlbiwgR0ZQX05PRlMpOworCWlmICghKm91dCkgeworCQliZWZzX2Vycm9yKHNiLCAiYmVmc19ubHMydXRmKCkgY2Fubm90IGFsbG9jYXRlIG1lbW9yeSIpOworCQkqb3V0X2xlbiA9IDA7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWZvciAoaSA9IG8gPSAwOyBpIDwgaW5fbGVuOyBpICs9IHVuaWxlbiwgbyArPSB1dGZsZW4pIHsKKworCQkvKiBjb252ZXJ0IGZyb20gbmxzIHRvIHVuaWNvZGUgKi8KKwkJdW5pbGVuID0gbmxzLT5jaGFyMnVuaSgmaW5baV0sIGluX2xlbiAtIGksICZ1bmkpOworCQlpZiAodW5pbGVuIDwgMCkgeworCQkJZ290byBjb252X2VycjsKKwkJfQorCisJCS8qIGNvbnZlcnQgZnJvbSB1bmljb2RlIHRvIFVURi04ICovCisJCXV0ZmxlbiA9IHV0Zjhfd2N0b21iKCZyZXN1bHRbb10sIHVuaSwgMyk7CisJCWlmICh1dGZsZW4gPD0gMCkgeworCQkJZ290byBjb252X2VycjsKKwkJfQorCX0KKworCXJlc3VsdFtvXSA9ICdcMCc7CisJKm91dF9sZW4gPSBvOworCisJYmVmc19kZWJ1ZyhzYiwgIjwtLS0gbmxzMnV0ZigpIik7CisKKwlyZXR1cm4gaTsKKworICAgICAgY29udl9lcnI6CisJYmVmc19lcnJvcihzYiwgIk5hbWUgdXNpbmcgY2hhcmVjdGVyIHNldCAlcyBjb250YWlucyBhIGNoYXJlY3RlciB0aGF0ICIKKwkJICAgImNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gdW5pY29kZS4iLCBubHMtPmNoYXJzZXQpOworCWJlZnNfZGVidWcoc2IsICI8LS0tIG5sczJ1dGYoKSIpOworCWtmcmVlKHJlc3VsdCk7CisJcmV0dXJuIC1FSUxTRVE7Cit9CisKKy8qKgorICogVXNlIHRoZQorICoKKyAqLworZW51bSB7CisJT3B0X3VpZCwgT3B0X2dpZCwgT3B0X2NoYXJzZXQsIE9wdF9kZWJ1ZywgT3B0X2VyciwKK307CisKK3N0YXRpYyBtYXRjaF90YWJsZV90IGJlZnNfdG9rZW5zID0geworCXtPcHRfdWlkLCAidWlkPSVkIn0sCisJe09wdF9naWQsICJnaWQ9JWQifSwKKwl7T3B0X2NoYXJzZXQsICJpb2NoYXJzZXQ9JXMifSwKKwl7T3B0X2RlYnVnLCAiZGVidWcifSwKKwl7T3B0X2VyciwgTlVMTH0KK307CisKK3N0YXRpYyBpbnQKK3BhcnNlX29wdGlvbnMoY2hhciAqb3B0aW9ucywgYmVmc19tb3VudF9vcHRpb25zICogb3B0cykKK3sKKwljaGFyICpwOworCXN1YnN0cmluZ190IGFyZ3NbTUFYX09QVF9BUkdTXTsKKwlpbnQgb3B0aW9uOworCisJLyogSW5pdGlhbGl6ZSBvcHRpb25zICovCisJb3B0cy0+dWlkID0gMDsKKwlvcHRzLT5naWQgPSAwOworCW9wdHMtPnVzZV91aWQgPSAwOworCW9wdHMtPnVzZV9naWQgPSAwOworCW9wdHMtPmlvY2hhcnNldCA9IE5VTEw7CisJb3B0cy0+ZGVidWcgPSAwOworCisJaWYgKCFvcHRpb25zKQorCQlyZXR1cm4gMTsKKworCXdoaWxlICgocCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgeworCQlpbnQgdG9rZW47CisJCWlmICghKnApCisJCQljb250aW51ZTsKKworCQl0b2tlbiA9IG1hdGNoX3Rva2VuKHAsIGJlZnNfdG9rZW5zLCBhcmdzKTsKKwkJc3dpdGNoICh0b2tlbikgeworCQljYXNlIE9wdF91aWQ6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmIChvcHRpb24gPCAwKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJCZUZTOiBJbnZhbGlkIHVpZCAlZCwgIgorCQkJCQkJInVzaW5nIGRlZmF1bHRcbiIsIG9wdGlvbik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlvcHRzLT51aWQgPSBvcHRpb247CisJCQlvcHRzLT51c2VfdWlkID0gMTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9naWQ6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmIChvcHRpb24gPCAwKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJCZUZTOiBJbnZhbGlkIGdpZCAlZCwgIgorCQkJCQkJInVzaW5nIGRlZmF1bHRcbiIsIG9wdGlvbik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlvcHRzLT5naWQgPSBvcHRpb247CisJCQlvcHRzLT51c2VfZ2lkID0gMTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9jaGFyc2V0OgorCQkJa2ZyZWUob3B0cy0+aW9jaGFyc2V0KTsKKwkJCW9wdHMtPmlvY2hhcnNldCA9IG1hdGNoX3N0cmR1cCgmYXJnc1swXSk7CisJCQlpZiAoIW9wdHMtPmlvY2hhcnNldCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiQmVGUzogYWxsb2NhdGlvbiBmYWlsdXJlIGZvciAiCisJCQkJCQkiaW9jaGFyc2V0IHN0cmluZ1xuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZGVidWc6CisJCQlvcHRzLT5kZWJ1ZyA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiQmVGUzogVW5yZWNvZ25pemVkIG1vdW50IG9wdGlvbiBcIiVzXCIgIgorCQkJCQkib3IgbWlzc2luZyB2YWx1ZVxuIiwgcCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBoYXMgdGhlIHJlc3BvbnNpYmlsdGl5IG9mIGdldHRpbmcgdGhlCisgKiBmaWxlc3lzdGVtIHJlYWR5IGZvciB1bm1vdW50aW5nLiAKKyAqIEJhc2ljbHksIHdlIGZyZWUgZXZlcnl0aGluZyB0aGF0IHdlIGFsbG9jYXRlZCBpbgorICogYmVmc19yZWFkX2lub2RlCisgKi8KK3N0YXRpYyB2b2lkCitiZWZzX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCWlmIChCRUZTX1NCKHNiKS0+bW91bnRfb3B0cy5pb2NoYXJzZXQpIHsKKwkJa2ZyZWUoQkVGU19TQihzYiktPm1vdW50X29wdHMuaW9jaGFyc2V0KTsKKwkJQkVGU19TQihzYiktPm1vdW50X29wdHMuaW9jaGFyc2V0ID0gTlVMTDsKKwl9CisKKwlpZiAoQkVGU19TQihzYiktPm5scykgeworCQl1bmxvYWRfbmxzKEJFRlNfU0Ioc2IpLT5ubHMpOworCQlCRUZTX1NCKHNiKS0+bmxzID0gTlVMTDsKKwl9CisKKwlpZiAoc2ItPnNfZnNfaW5mbykgeworCQlrZnJlZShzYi0+c19mc19pbmZvKTsKKwkJc2ItPnNfZnNfaW5mbyA9IE5VTEw7CisJfQorCXJldHVybjsKK30KKworLyogQWxsb2NhdGUgcHJpdmF0ZSBmaWVsZCBvZiB0aGUgc3VwZXJibG9jaywgZmlsbCBpdC4KKyAqCisgKiBGaW5pc2ggZmlsbGluZyB0aGUgcHVibGljIHN1cGVyYmxvY2sgZmllbGRzCisgKiBNYWtlIHRoZSByb290IGRpcmVjdG9yeQorICogTG9hZCBhIHNldCBvZiBOTFMgdHJhbnNsYXRpb25zIGlmIG5lZWRlZC4KKyAqLworc3RhdGljIGludAorYmVmc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwliZWZzX3NiX2luZm8gKmJlZnNfc2I7CisJYmVmc19zdXBlcl9ibG9jayAqZGlza19zYjsKKwlzdHJ1Y3QgaW5vZGUgKnJvb3Q7CisKKwljb25zdCB1bnNpZ25lZCBsb25nIHNiX2Jsb2NrID0gMDsKKwljb25zdCBvZmZfdCB4ODZfc2Jfb2ZmID0gNTEyOworCisJc2ItPnNfZnNfaW5mbyA9IGttYWxsb2Moc2l6ZW9mICgqYmVmc19zYiksIEdGUF9LRVJORUwpOworCWlmIChzYi0+c19mc19pbmZvID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAiQmVGUyglcyk6IFVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHByaXZhdGUgIgorCQkgICAgICAgInBvcnRpb24gb2Ygc3VwZXJibG9jay4gQmFpbGluZy5cbiIsIHNiLT5zX2lkKTsKKwkJZ290byB1bmFxdWlyZV9ub25lOworCX0KKwliZWZzX3NiID0gQkVGU19TQihzYik7CisJbWVtc2V0KGJlZnNfc2IsIDAsIHNpemVvZihiZWZzX3NiX2luZm8pKTsKKworCWlmICghcGFyc2Vfb3B0aW9ucygoY2hhciAqKSBkYXRhLCAmYmVmc19zYi0+bW91bnRfb3B0cykpIHsKKwkJYmVmc19lcnJvcihzYiwgImNhbm5vdCBwYXJzZSBtb3VudCBvcHRpb25zIik7CisJCWdvdG8gdW5hcXVpcmVfcHJpdl9zYnA7CisJfQorCisJYmVmc19kZWJ1ZyhzYiwgIi0tLT4gYmVmc19maWxsX3N1cGVyKCkiKTsKKworI2lmbmRlZiBDT05GSUdfQkVGU19SVworCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQliZWZzX3dhcm5pbmcoc2IsCisJCQkgICAgICJObyB3cml0ZSBzdXBwb3J0LiBNYXJraW5nIGZpbGVzeXN0ZW0gcmVhZC1vbmx5Iik7CisJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKKwl9CisjZW5kaWYJCQkJLyogQ09ORklHX0JFRlNfUlcgKi8KKworCS8qCisJICogU2V0IGR1bW15IGJsb2Nrc2l6ZSB0byByZWFkIHN1cGVyIGJsb2NrLgorCSAqIFdpbGwgYmUgc2V0IHRvIHJlYWwgZnMgYmxvY2tzaXplIGxhdGVyLgorCSAqCisJICogTGludXggMi40LjEwIGFuZCBsYXRlciByZWZ1c2UgdG8gcmVhZCBibG9ja3Mgc21hbGxlciB0aGFuCisJICogdGhlIGhhcmRzZWN0IHNpemUgZm9yIHRoZSBkZXZpY2UuIEJ1dCB3ZSBhbHNvIG5lZWQgdG8gcmVhZCBhdCAKKwkgKiBsZWFzdCAxayB0byBnZXQgdGhlIHNlY29uZCA1MTIgYnl0ZXMgb2YgdGhlIHZvbHVtZS4KKwkgKiAtV0QgMTAtMjYtMDEKKwkgKi8gCisJc2JfbWluX2Jsb2Nrc2l6ZShzYiwgMTAyNCk7CisKKwlpZiAoIShiaCA9IHNiX2JyZWFkKHNiLCBzYl9ibG9jaykpKSB7CisJCWJlZnNfZXJyb3Ioc2IsICJ1bmFibGUgdG8gcmVhZCBzdXBlcmJsb2NrIik7CisJCWdvdG8gdW5hcXVpcmVfcHJpdl9zYnA7CisJfQorCisJLyogYWNjb3VudCBmb3Igb2Zmc2V0IG9mIHN1cGVyIGJsb2NrIG9uIHg4NiAqLworCWRpc2tfc2IgPSAoYmVmc19zdXBlcl9ibG9jayAqKSBiaC0+Yl9kYXRhOworCWlmICgobGUzMl90b19jcHUoZGlza19zYi0+bWFnaWMxKSA9PSBCRUZTX1NVUEVSX01BR0lDMSkgfHwKKwkgICAgKGJlMzJfdG9fY3B1KGRpc2tfc2ItPm1hZ2ljMSkgPT0gQkVGU19TVVBFUl9NQUdJQzEpKSB7CisJCWJlZnNfZGVidWcoc2IsICJVc2luZyBQUEMgc3VwZXJibG9jayBsb2NhdGlvbiIpOworCX0gZWxzZSB7CisJCWJlZnNfZGVidWcoc2IsICJVc2luZyB4ODYgc3VwZXJibG9jayBsb2NhdGlvbiIpOworCQlkaXNrX3NiID0KKwkJICAgIChiZWZzX3N1cGVyX2Jsb2NrICopICgodm9pZCAqKSBiaC0+Yl9kYXRhICsgeDg2X3NiX29mZik7CisJfQorCisJaWYgKGJlZnNfbG9hZF9zYihzYiwgZGlza19zYikgIT0gQkVGU19PSykKKwkJZ290byB1bmFxdWlyZV9iaDsKKworCWJlZnNfZHVtcF9zdXBlcl9ibG9jayhzYiwgZGlza19zYik7CisKKwlicmVsc2UoYmgpOworCisJaWYgKGJlZnNfY2hlY2tfc2Ioc2IpICE9IEJFRlNfT0spCisJCWdvdG8gdW5hcXVpcmVfcHJpdl9zYnA7CisKKwlpZiggYmVmc19zYi0+bnVtX2Jsb2NrcyA+IH4oKHNlY3Rvcl90KTApICkgeworCQliZWZzX2Vycm9yKHNiLCAiYmxvY2tzIGNvdW50OiAlTHUgIgorCQkJImlzIGxhcmdlciB0aGFuIHRoZSBob3N0IGNhbiB1c2UiLAorCQkJYmVmc19zYi0+bnVtX2Jsb2Nrcyk7CisJCWdvdG8gdW5hcXVpcmVfcHJpdl9zYnA7CisJfQorCisJLyoKKwkgKiBzZXQgdXAgZW5vdWdoIHNvIHRoYXQgaXQgY2FuIHJlYWQgYW4gaW5vZGUKKwkgKiBGaWxsIGluIGtlcm5lbCBzdXBlcmJsb2NrIGZpZWxkcyBmcm9tIHByaXZhdGUgc2IKKwkgKi8KKwlzYi0+c19tYWdpYyA9IEJFRlNfU1VQRVJfTUFHSUM7CisJLyogU2V0IHJlYWwgYmxvY2tzaXplIG9mIGZzICovCisJc2Jfc2V0X2Jsb2Nrc2l6ZShzYiwgKHVsb25nKSBiZWZzX3NiLT5ibG9ja19zaXplKTsKKwlzYi0+c19vcCA9IChzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyAqKSAmYmVmc19zb3BzOworCXJvb3QgPSBpZ2V0KHNiLCBpYWRkcjJibG9ja25vKHNiLCAmKGJlZnNfc2ItPnJvb3RfZGlyKSkpOworCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdCk7CisJaWYgKCFzYi0+c19yb290KSB7CisJCWlwdXQocm9vdCk7CisJCWJlZnNfZXJyb3Ioc2IsICJnZXQgcm9vdCBpbm9kZSBmYWlsZWQiKTsKKwkJZ290byB1bmFxdWlyZV9wcml2X3NicDsKKwl9CisKKwkvKiBsb2FkIG5scyBsaWJyYXJ5ICovCisJaWYgKGJlZnNfc2ItPm1vdW50X29wdHMuaW9jaGFyc2V0KSB7CisJCWJlZnNfZGVidWcoc2IsICJMb2FkaW5nIG5sczogJXMiLAorCQkJICAgYmVmc19zYi0+bW91bnRfb3B0cy5pb2NoYXJzZXQpOworCQliZWZzX3NiLT5ubHMgPSBsb2FkX25scyhiZWZzX3NiLT5tb3VudF9vcHRzLmlvY2hhcnNldCk7CisJCWlmICghYmVmc19zYi0+bmxzKSB7CisJCQliZWZzX3dhcm5pbmcoc2IsICJDYW5ub3QgbG9hZCBubHMgJXMiCisJCQkJCSIgbG9hZGluZyBkZWZhdWx0IG5scyIsCisJCQkJCWJlZnNfc2ItPm1vdW50X29wdHMuaW9jaGFyc2V0KTsKKwkJCWJlZnNfc2ItPm5scyA9IGxvYWRfbmxzX2RlZmF1bHQoKTsKKwkJfQorCS8qIGxvYWQgZGVmYXVsdCBubHMgaWYgbm9uZSBpcyBzcGVjaWZpZWQgIGluIG1vdW50IG9wdGlvbnMgKi8KKwl9IGVsc2UgeworCQliZWZzX2RlYnVnKHNiLCAiTG9hZGluZyBkZWZhdWx0IG5scyIpOworCQliZWZzX3NiLT5ubHMgPSBsb2FkX25sc19kZWZhdWx0KCk7CisJfQorCisJcmV0dXJuIDA7CisvKioqKioqKioqKioqKioqKiovCisgICAgICB1bmFxdWlyZV9iaDoKKwlicmVsc2UoYmgpOworCisgICAgICB1bmFxdWlyZV9wcml2X3NicDoKKwlrZnJlZShzYi0+c19mc19pbmZvKTsKKworICAgICAgdW5hcXVpcmVfbm9uZToKKwlzYi0+c19mc19pbmZvID0gTlVMTDsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludAorYmVmc19yZW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpCit7CisJaWYgKCEoKmZsYWdzICYgTVNfUkRPTkxZKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2JlZnNfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICpidWYpCit7CisKKwliZWZzX2RlYnVnKHNiLCAiLS0tPiBiZWZzX3N0YXRmcygpIik7CisKKwlidWYtPmZfdHlwZSA9IEJFRlNfU1VQRVJfTUFHSUM7CisJYnVmLT5mX2JzaXplID0gc2ItPnNfYmxvY2tzaXplOworCWJ1Zi0+Zl9ibG9ja3MgPSBCRUZTX1NCKHNiKS0+bnVtX2Jsb2NrczsKKwlidWYtPmZfYmZyZWUgPSBCRUZTX1NCKHNiKS0+bnVtX2Jsb2NrcyAtIEJFRlNfU0Ioc2IpLT51c2VkX2Jsb2NrczsKKwlidWYtPmZfYmF2YWlsID0gYnVmLT5mX2JmcmVlOworCWJ1Zi0+Zl9maWxlcyA9IDA7CS8qIFVOS05PV04gKi8KKwlidWYtPmZfZmZyZWUgPSAwOwkvKiBVTktOT1dOICovCisJYnVmLT5mX25hbWVsZW4gPSBCRUZTX05BTUVfTEVOOworCisJYmVmc19kZWJ1ZyhzYiwgIjwtLS0gYmVmc19zdGF0ZnMoKSIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKgorYmVmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsCisJICAgIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgYmVmc19maWxsX3N1cGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGJlZnNfZnNfdHlwZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImJlZnMiLAorCS5nZXRfc2IJCT0gYmVmc19nZXRfc2IsCisJLmtpbGxfc2IJPSBraWxsX2Jsb2NrX3N1cGVyLAorCS5mc19mbGFncwk9IEZTX1JFUVVJUkVTX0RFViwJCit9OworCitzdGF0aWMgaW50IF9faW5pdAoraW5pdF9iZWZzX2ZzKHZvaWQpCit7CisJaW50IGVycjsKKworCXByaW50ayhLRVJOX0lORk8gIkJlRlMgdmVyc2lvbjogJXNcbiIsIEJFRlNfVkVSU0lPTik7CisKKwllcnIgPSBiZWZzX2luaXRfaW5vZGVjYWNoZSgpOworCWlmIChlcnIpCisJCWdvdG8gdW5hcXVpcmVfbm9uZTsKKworCWVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmJlZnNfZnNfdHlwZSk7CisJaWYgKGVycikKKwkJZ290byB1bmFxdWlyZV9pbm9kZWNhY2hlOworCisJcmV0dXJuIDA7CisKK3VuYXF1aXJlX2lub2RlY2FjaGU6CisJYmVmc19kZXN0cm95X2lub2RlY2FjaGUoKTsKKwordW5hcXVpcmVfbm9uZToKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2V4aXRfYmVmc19mcyh2b2lkKQoreworCWJlZnNfZGVzdHJveV9pbm9kZWNhY2hlKCk7CisKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmJlZnNfZnNfdHlwZSk7Cit9CisKKy8qCitNYWNyb3MgdGhhdCB0eXBlY2hlY2sgdGhlIGluaXQgYW5kIGV4aXQgZnVuY3Rpb25zLAorZW5zdXJlcyB0aGF0IHRoZXkgYXJlIGNhbGxlZCBhdCBpbml0IGFuZCBjbGVhbnVwLAorYW5kIGVsaW1pbmF0ZXMgd2FybmluZ3MgYWJvdXQgdW51c2VkIGZ1bmN0aW9ucy4KKyovCittb2R1bGVfaW5pdChpbml0X2JlZnNfZnMpCittb2R1bGVfZXhpdChleGl0X2JlZnNfZnMpCmRpZmYgLS1naXQgYS9mcy9iZWZzL3N1cGVyLmMgYi9mcy9iZWZzL3N1cGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU1N2FjYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2JlZnMvc3VwZXIuYwpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIHN1cGVyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMiBXaWxsIER5c29uIDx3aWxsX2R5c29uQHBvYm94LmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR05VIEdQTC4gU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorCisjaW5jbHVkZSAiYmVmcy5oIgorI2luY2x1ZGUgInN1cGVyLmgiCisjaW5jbHVkZSAiZW5kaWFuLmgiCisKKy8qKgorICogbG9hZF9iZWZzX3NiIC0tIFJlYWQgZnJvbSBkaXNrIGFuZCBwcm9wZXJseSBieXRlc3dhcCBhbGwgdGhlIGZpZWxkcworICogb2YgdGhlIGJlZnMgc3VwZXJibG9jaworICoKKyAqCisgKgorICoKKyAqLworaW50CitiZWZzX2xvYWRfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYmVmc19zdXBlcl9ibG9jayAqIGRpc2tfc2IpCit7CisJYmVmc19zYl9pbmZvICpiZWZzX3NiID0gQkVGU19TQihzYik7CisKKwkvKiBDaGVjayB0aGUgYnl0ZSBvcmRlciBvZiB0aGUgZmlsZXN5c3RlbSAqLworCWlmIChsZTMyX3RvX2NwdShkaXNrX3NiLT5mc19ieXRlX29yZGVyKSA9PSBCRUZTX0JZVEVPUkRFUl9OQVRJVkUpCisJICAgIGJlZnNfc2ItPmJ5dGVfb3JkZXIgPSBCRUZTX0JZVEVTRVhfTEU7CisJZWxzZSBpZiAoYmUzMl90b19jcHUoZGlza19zYi0+ZnNfYnl0ZV9vcmRlcikgPT0gQkVGU19CWVRFT1JERVJfTkFUSVZFKQorCSAgICBiZWZzX3NiLT5ieXRlX29yZGVyID0gQkVGU19CWVRFU0VYX0JFOwkKKworCWJlZnNfc2ItPm1hZ2ljMSA9IGZzMzJfdG9fY3B1KHNiLCBkaXNrX3NiLT5tYWdpYzEpOworCWJlZnNfc2ItPm1hZ2ljMiA9IGZzMzJfdG9fY3B1KHNiLCBkaXNrX3NiLT5tYWdpYzIpOworCWJlZnNfc2ItPm1hZ2ljMyA9IGZzMzJfdG9fY3B1KHNiLCBkaXNrX3NiLT5tYWdpYzMpOworCWJlZnNfc2ItPmJsb2NrX3NpemUgPSBmczMyX3RvX2NwdShzYiwgZGlza19zYi0+YmxvY2tfc2l6ZSk7CisJYmVmc19zYi0+YmxvY2tfc2hpZnQgPSBmczMyX3RvX2NwdShzYiwgZGlza19zYi0+YmxvY2tfc2hpZnQpOworCWJlZnNfc2ItPm51bV9ibG9ja3MgPSBmczY0X3RvX2NwdShzYiwgZGlza19zYi0+bnVtX2Jsb2Nrcyk7CisJYmVmc19zYi0+dXNlZF9ibG9ja3MgPSBmczY0X3RvX2NwdShzYiwgZGlza19zYi0+dXNlZF9ibG9ja3MpOworCWJlZnNfc2ItPmlub2RlX3NpemUgPSBmczMyX3RvX2NwdShzYiwgZGlza19zYi0+aW5vZGVfc2l6ZSk7CisKKwliZWZzX3NiLT5ibG9ja3NfcGVyX2FnID0gZnMzMl90b19jcHUoc2IsIGRpc2tfc2ItPmJsb2Nrc19wZXJfYWcpOworCWJlZnNfc2ItPmFnX3NoaWZ0ID0gZnMzMl90b19jcHUoc2IsIGRpc2tfc2ItPmFnX3NoaWZ0KTsKKwliZWZzX3NiLT5udW1fYWdzID0gZnMzMl90b19jcHUoc2IsIGRpc2tfc2ItPm51bV9hZ3MpOworCisJYmVmc19zYi0+bG9nX2Jsb2NrcyA9IGZzcnVuX3RvX2NwdShzYiwgZGlza19zYi0+bG9nX2Jsb2Nrcyk7CisJYmVmc19zYi0+bG9nX3N0YXJ0ID0gZnM2NF90b19jcHUoc2IsIGRpc2tfc2ItPmxvZ19zdGFydCk7CisJYmVmc19zYi0+bG9nX2VuZCA9IGZzNjRfdG9fY3B1KHNiLCBkaXNrX3NiLT5sb2dfZW5kKTsKKworCWJlZnNfc2ItPnJvb3RfZGlyID0gZnNydW5fdG9fY3B1KHNiLCBkaXNrX3NiLT5yb290X2Rpcik7CisJYmVmc19zYi0+aW5kaWNlcyA9IGZzcnVuX3RvX2NwdShzYiwgZGlza19zYi0+aW5kaWNlcyk7CisJYmVmc19zYi0+bmxzID0gTlVMTDsKKworCXJldHVybiBCRUZTX09LOworfQorCitpbnQKK2JlZnNfY2hlY2tfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwliZWZzX3NiX2luZm8gKmJlZnNfc2IgPSBCRUZTX1NCKHNiKTsKKworCS8qIENoZWNrIG1hZ2ljIGhlYWRlcnMgb2Ygc3VwZXIgYmxvY2sgKi8KKwlpZiAoKGJlZnNfc2ItPm1hZ2ljMSAhPSBCRUZTX1NVUEVSX01BR0lDMSkKKwkgICAgfHwgKGJlZnNfc2ItPm1hZ2ljMiAhPSBCRUZTX1NVUEVSX01BR0lDMikKKwkgICAgfHwgKGJlZnNfc2ItPm1hZ2ljMyAhPSBCRUZTX1NVUEVSX01BR0lDMykpIHsKKwkJYmVmc19lcnJvcihzYiwgImludmFsaWQgbWFnaWMgaGVhZGVyIik7CisJCXJldHVybiBCRUZTX0VSUjsKKwl9CisKKwkvKgorCSAqIENoZWNrIGJsb2Nrc2l6ZSBvZiBCRUZTLgorCSAqCisJICogQmxvY2tzaXplIG9mIEJFRlMgaXMgMTAyNCwgMjA0OCwgNDA5NiBvciA4MTkyLgorCSAqLworCisJaWYgKChiZWZzX3NiLT5ibG9ja19zaXplICE9IDEwMjQpCisJICAgICYmIChiZWZzX3NiLT5ibG9ja19zaXplICE9IDIwNDgpCisJICAgICYmIChiZWZzX3NiLT5ibG9ja19zaXplICE9IDQwOTYpCisJICAgICYmIChiZWZzX3NiLT5ibG9ja19zaXplICE9IDgxOTIpKSB7CisJCWJlZnNfZXJyb3Ioc2IsICJpbnZhbGlkIGJsb2Nrc2l6ZTogJXUiLCBiZWZzX3NiLT5ibG9ja19zaXplKTsKKwkJcmV0dXJuIEJFRlNfRVJSOworCX0KKworCWlmIChiZWZzX3NiLT5ibG9ja19zaXplID4gUEFHRV9TSVpFKSB7CisJCWJlZnNfZXJyb3Ioc2IsICJibG9ja3NpemUoJXUpIGNhbm5vdCBiZSBsYXJnZXIiCisJCQkgICAidGhhbiBzeXN0ZW0gcGFnZXNpemUoJWx1KSIsIGJlZnNfc2ItPmJsb2NrX3NpemUsCisJCQkgICBQQUdFX1NJWkUpOworCQlyZXR1cm4gQkVGU19FUlI7CisJfQorCisJLyoKKwkgICAqIGJsb2NrX3NoaWZ0IGFuZCBibG9ja19zaXplIGVuY29kZSB0aGUgc2FtZSBpbmZvcm1hdGlvbgorCSAgICogaW4gZGlmZmVyZW50IHdheXMgYXMgYSBjb25zaXN0ZW5jeSBjaGVjay4KKwkgKi8KKworCWlmICgoMSA8PCBiZWZzX3NiLT5ibG9ja19zaGlmdCkgIT0gYmVmc19zYi0+YmxvY2tfc2l6ZSkgeworCQliZWZzX2Vycm9yKHNiLCAiYmxvY2tfc2hpZnQgZGlzYWdyZWVzIHdpdGggYmxvY2tfc2l6ZS4gIgorCQkJICAgIkNvcnJ1cHRpb24gbGlrZWx5LiIpOworCQlyZXR1cm4gQkVGU19FUlI7CisJfQorCisJaWYgKGJlZnNfc2ItPmxvZ19zdGFydCAhPSBiZWZzX3NiLT5sb2dfZW5kKSB7CisJCWJlZnNfZXJyb3Ioc2IsICJGaWxlc3lzdGVtIG5vdCBjbGVhbiEgVGhlcmUgYXJlIGJsb2NrcyBpbiB0aGUgIgorCQkJICAgImpvdXJuYWwuIFlvdSBtdXN0IGJvb3QgaW50byBCZU9TIGFuZCBtb3VudCB0aGlzIHZvbHVtZSAiCisJCQkgICAidG8gbWFrZSBpdCBjbGVhbi4iKTsKKwkJcmV0dXJuIEJFRlNfRVJSOworCX0KKworCXJldHVybiBCRUZTX09LOworfQpkaWZmIC0tZ2l0IGEvZnMvYmVmcy9zdXBlci5oIGIvZnMvYmVmcy9zdXBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNDU1NjMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9iZWZzL3N1cGVyLmgKQEAgLTAsMCArMSw4IEBACisvKgorICogc3VwZXIuaAorICovCisKK2ludCBiZWZzX2xvYWRfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgYmVmc19zdXBlcl9ibG9jayAqIGRpc2tfc2IpOworCitpbnQgYmVmc19jaGVja19zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKKwpkaWZmIC0tZ2l0IGEvZnMvYmZzL01ha2VmaWxlIGIvZnMvYmZzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ODdiMzYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9iZnMvTWFrZWZpbGUKQEAgLTAsMCArMSw3IEBACisjCisjIE1ha2VmaWxlIGZvciBCRlMgZmlsZXN5c3RlbS4KKyMKKworb2JqLSQoQ09ORklHX0JGU19GUykgKz0gYmZzLm8KKworYmZzLW9ianMgOj0gaW5vZGUubyBmaWxlLm8gZGlyLm8KZGlmZiAtLWdpdCBhL2ZzL2Jmcy9iZnMuaCBiL2ZzL2Jmcy9iZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDIwZGJjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYmZzL2Jmcy5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKglmcy9iZnMvYmZzLmgKKyAqCUNvcHlyaWdodCAoQykgMTk5OSBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkB2ZXJpdGFzLmNvbT4KKyAqLworI2lmbmRlZiBfRlNfQkZTX0JGU19ICisjZGVmaW5lIF9GU19CRlNfQkZTX0gKKworI2luY2x1ZGUgPGxpbnV4L2Jmc19mcy5oPgorCisvKgorICogQkZTIGZpbGUgc3lzdGVtIGluLWNvcmUgc3VwZXJibG9jayBpbmZvCisgKi8KK3N0cnVjdCBiZnNfc2JfaW5mbyB7CisJdW5zaWduZWQgbG9uZyBzaV9ibG9ja3M7CisJdW5zaWduZWQgbG9uZyBzaV9mcmVlYjsKKwl1bnNpZ25lZCBsb25nIHNpX2ZyZWVpOworCXVuc2lnbmVkIGxvbmcgc2lfbGZfaW9mZjsKKwl1bnNpZ25lZCBsb25nIHNpX2xmX3NibGs7CisJdW5zaWduZWQgbG9uZyBzaV9sZl9lYmxrOworCXVuc2lnbmVkIGxvbmcgc2lfbGFzdGk7CisJdW5zaWduZWQgbG9uZyAqIHNpX2ltYXA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogc2lfc2JoOwkJLyogYnVmZmVyIGhlYWRlciB3L3N1cGVyYmxvY2sgKi8KKwlzdHJ1Y3QgYmZzX3N1cGVyX2Jsb2NrICogc2lfYmZzX3NiOwkvKiBzdXBlcmJsb2NrIGluIHNpX3NiaC0+Yl9kYXRhICovCit9OworCisvKgorICogQkZTIGZpbGUgc3lzdGVtIGluLWNvcmUgaW5vZGUgaW5mbworICovCitzdHJ1Y3QgYmZzX2lub2RlX2luZm8geworCXVuc2lnbmVkIGxvbmcgaV9kc2tfaW5vOyAvKiBpbm9kZSBudW1iZXIgZnJvbSB0aGUgZGlzaywgY2FuIGJlIDAgKi8KKwl1bnNpZ25lZCBsb25nIGlfc2Jsb2NrOworCXVuc2lnbmVkIGxvbmcgaV9lYmxvY2s7CisJc3RydWN0IGlub2RlIHZmc19pbm9kZTsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJmc19zYl9pbmZvICpCRlNfU0Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlyZXR1cm4gc2ItPnNfZnNfaW5mbzsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYmZzX2lub2RlX2luZm8gKkJGU19JKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIGxpc3RfZW50cnkoaW5vZGUsIHN0cnVjdCBiZnNfaW5vZGVfaW5mbywgdmZzX2lub2RlKTsKK30KKworCisjZGVmaW5lIHByaW50Zihmb3JtYXQsIGFyZ3MuLi4pIFwKKwlwcmludGsoS0VSTl9FUlIgIkJGUy1mczogJXMoKTogIiBmb3JtYXQsIF9fRlVOQ1RJT05fXywgIyMgYXJncykKKworCisvKiBmaWxlLmMgKi8KK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBiZnNfZmlsZV9pbm9wczsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJmc19maWxlX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBiZnNfYW9wczsKKworLyogZGlyLmMgKi8KK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBiZnNfZGlyX2lub3BzOworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYmZzX2Rpcl9vcGVyYXRpb25zOworCisjZW5kaWYgLyogX0ZTX0JGU19CRlNfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvYmZzL2Rpci5jIGIvZnMvYmZzL2Rpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMWU1Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9iZnMvZGlyLmMKQEAgLTAsMCArMSwzNjIgQEAKKy8qCisgKglmcy9iZnMvZGlyLmMKKyAqCUJGUyBkaXJlY3Rvcnkgb3BlcmF0aW9ucy4KKyAqCUNvcHlyaWdodCAoQykgMTk5OSwyMDAwICBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkB2ZXJpdGFzLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSAiYmZzLmgiCisKKyN1bmRlZiBERUJVRworCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgZHByaW50Zih4Li4uKQlwcmludGYoeCkKKyNlbHNlCisjZGVmaW5lIGRwcmludGYoeC4uLikKKyNlbmRpZgorCitzdGF0aWMgaW50IGJmc19hZGRfZW50cnkoc3RydWN0IGlub2RlICogZGlyLCBjb25zdCBjaGFyICogbmFtZSwgaW50IG5hbWVsZW4sIGludCBpbm8pOworc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJmc19maW5kX2VudHJ5KHN0cnVjdCBpbm9kZSAqIGRpciwgCisJY29uc3QgY2hhciAqIG5hbWUsIGludCBuYW1lbGVuLCBzdHJ1Y3QgYmZzX2RpcmVudCAqKiByZXNfZGlyKTsKKworc3RhdGljIGludCBiZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqIGYsIHZvaWQgKiBkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCXN0cnVjdCBpbm9kZSAqIGRpciA9IGYtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXN0cnVjdCBiZnNfZGlyZW50ICogZGU7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwlpbnQgYmxvY2s7CisKKwlsb2NrX2tlcm5lbCgpOworCisJaWYgKGYtPmZfcG9zICYgKEJGU19ESVJFTlRfU0laRS0xKSkgeworCQlwcmludGYoIkJhZCBmX3Bvcz0lMDhseCBmb3IgJXM6JTA4bHhcbiIsICh1bnNpZ25lZCBsb25nKWYtPmZfcG9zLCAKKwkJCWRpci0+aV9zYi0+c19pZCwgZGlyLT5pX2lubyk7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIC1FQkFERjsKKwl9CisKKwl3aGlsZSAoZi0+Zl9wb3MgPCBkaXItPmlfc2l6ZSkgeworCQlvZmZzZXQgPSBmLT5mX3BvcyAmIChCRlNfQlNJWkUtMSk7CisJCWJsb2NrID0gQkZTX0koZGlyKS0+aV9zYmxvY2sgKyAoZi0+Zl9wb3MgPj4gQkZTX0JTSVpFX0JJVFMpOworCQliaCA9IHNiX2JyZWFkKGRpci0+aV9zYiwgYmxvY2spOworCQlpZiAoIWJoKSB7CisJCQlmLT5mX3BvcyArPSBCRlNfQlNJWkUgLSBvZmZzZXQ7CisJCQljb250aW51ZTsKKwkJfQorCQlkbyB7CisJCQlkZSA9IChzdHJ1Y3QgYmZzX2RpcmVudCAqKShiaC0+Yl9kYXRhICsgb2Zmc2V0KTsKKwkJCWlmIChkZS0+aW5vKSB7CisJCQkJaW50IHNpemUgPSBzdHJubGVuKGRlLT5uYW1lLCBCRlNfTkFNRUxFTik7CisJCQkJaWYgKGZpbGxkaXIoZGlyZW50LCBkZS0+bmFtZSwgc2l6ZSwgZi0+Zl9wb3MsIGRlLT5pbm8sIERUX1VOS05PV04pIDwgMCkgeworCQkJCQlicmVsc2UoYmgpOworCQkJCQl1bmxvY2tfa2VybmVsKCk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKwkJCW9mZnNldCArPSBCRlNfRElSRU5UX1NJWkU7CisJCQlmLT5mX3BvcyArPSBCRlNfRElSRU5UX1NJWkU7CisJCX0gd2hpbGUgKG9mZnNldCA8IEJGU19CU0laRSAmJiBmLT5mX3BvcyA8IGRpci0+aV9zaXplKTsKKwkJYnJlbHNlKGJoKTsKKwl9CisKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7CQorfQorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJmc19kaXJfb3BlcmF0aW9ucyA9IHsKKwkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAorCS5yZWFkZGlyCT0gYmZzX3JlYWRkaXIsCisJLmZzeW5jCQk9IGZpbGVfZnN5bmMsCit9OworCitleHRlcm4gdm9pZCBkdW1wX2ltYXAoY29uc3QgY2hhciAqLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CisKK3N0YXRpYyBpbnQgYmZzX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnksIGludCBtb2RlLAorCQlzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHMgPSBkaXItPmlfc2I7CisJc3RydWN0IGJmc19zYl9pbmZvICogaW5mbyA9IEJGU19TQihzKTsKKwl1bnNpZ25lZCBsb25nIGlubzsKKworCWlub2RlID0gbmV3X2lub2RlKHMpOworCWlmICghaW5vZGUpCisJCXJldHVybiAtRU5PU1BDOworCWxvY2tfa2VybmVsKCk7CisJaW5vID0gZmluZF9maXJzdF96ZXJvX2JpdChpbmZvLT5zaV9pbWFwLCBpbmZvLT5zaV9sYXN0aSk7CisJaWYgKGlubyA+IGluZm8tPnNpX2xhc3RpKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJaXB1dChpbm9kZSk7CisJCXJldHVybiAtRU5PU1BDOworCX0KKwlzZXRfYml0KGlubywgaW5mby0+c2lfaW1hcCk7CQorCWluZm8tPnNpX2ZyZWVpLS07CisJaW5vZGUtPmlfdWlkID0gY3VycmVudC0+ZnN1aWQ7CisJaW5vZGUtPmlfZ2lkID0gKGRpci0+aV9tb2RlICYgU19JU0dJRCkgPyBkaXItPmlfZ2lkIDogY3VycmVudC0+ZnNnaWQ7CisJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlpbm9kZS0+aV9ibG9ja3MgPSBpbm9kZS0+aV9ibGtzaXplID0gMDsKKwlpbm9kZS0+aV9vcCA9ICZiZnNfZmlsZV9pbm9wczsKKwlpbm9kZS0+aV9mb3AgPSAmYmZzX2ZpbGVfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZiZnNfYW9wczsKKwlpbm9kZS0+aV9tb2RlID0gbW9kZTsKKwlpbm9kZS0+aV9pbm8gPSBpbm87CisJQkZTX0koaW5vZGUpLT5pX2Rza19pbm8gPSBpbm87CisJQkZTX0koaW5vZGUpLT5pX3NibG9jayA9IDA7CisJQkZTX0koaW5vZGUpLT5pX2VibG9jayA9IDA7CisJaW5zZXJ0X2lub2RlX2hhc2goaW5vZGUpOworICAgICAgICBtYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwlkdW1wX2ltYXAoImNyZWF0ZSIscyk7CisKKwllcnIgPSBiZnNfYWRkX2VudHJ5KGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLCBpbm9kZS0+aV9pbm8pOworCWlmIChlcnIpIHsKKwkJaW5vZGUtPmlfbmxpbmstLTsKKwkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCWlwdXQoaW5vZGUpOworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiBlcnI7CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqIGJmc19sb29rdXAoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IE5VTEw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJc3RydWN0IGJmc19kaXJlbnQgKiBkZTsKKworCWlmIChkZW50cnktPmRfbmFtZS5sZW4gPiBCRlNfTkFNRUxFTikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7CisKKwlsb2NrX2tlcm5lbCgpOworCWJoID0gYmZzX2ZpbmRfZW50cnkoZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5sZW4sICZkZSk7CisJaWYgKGJoKSB7CisJCXVuc2lnbmVkIGxvbmcgaW5vID0gbGUzMl90b19jcHUoZGUtPmlubyk7CisJCWJyZWxzZShiaCk7CisJCWlub2RlID0gaWdldChkaXItPmlfc2IsIGlubyk7CisJCWlmICghaW5vZGUpIHsKKwkJCXVubG9ja19rZXJuZWwoKTsKKwkJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworCQl9CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlkX2FkZChkZW50cnksIGlub2RlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBiZnNfbGluayhzdHJ1Y3QgZGVudHJ5ICogb2xkLCBzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBuZXcpCit7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBvbGQtPmRfaW5vZGU7CisJaW50IGVycjsKKworCWxvY2tfa2VybmVsKCk7CisJZXJyID0gYmZzX2FkZF9lbnRyeShkaXIsIG5ldy0+ZF9uYW1lLm5hbWUsIG5ldy0+ZF9uYW1lLmxlbiwgaW5vZGUtPmlfaW5vKTsKKwlpZiAoZXJyKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJaW5vZGUtPmlfbmxpbmsrKzsKKwlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJYXRvbWljX2luYygmaW5vZGUtPmlfY291bnQpOworCWRfaW5zdGFudGlhdGUobmV3LCBpbm9kZSk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgYmZzX3VubGluayhzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnkpCit7CisJaW50IGVycm9yID0gLUVOT0VOVDsKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlzdHJ1Y3QgYmZzX2RpcmVudCAqIGRlOworCisJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJbG9ja19rZXJuZWwoKTsKKwliaCA9IGJmc19maW5kX2VudHJ5KGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLCAmZGUpOworCWlmICghYmggfHwgZGUtPmlubyAhPSBpbm9kZS0+aV9pbm8pIAorCQlnb3RvIG91dF9icmVsc2U7CisKKwlpZiAoIWlub2RlLT5pX25saW5rKSB7CisJCXByaW50ZigidW5saW5raW5nIG5vbi1leGlzdGVudCBmaWxlICVzOiVsdSAobmxpbms9JWQpXG4iLCBpbm9kZS0+aV9zYi0+c19pZCwgCisJCQkJaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV9ubGluayk7CisJCWlub2RlLT5pX25saW5rID0gMTsKKwl9CisJZGUtPmlubyA9IDA7CisJbWFya19idWZmZXJfZGlydHkoYmgpOworCWRpci0+aV9jdGltZSA9IGRpci0+aV9tdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJbWFya19pbm9kZV9kaXJ0eShkaXIpOworCWlub2RlLT5pX25saW5rLS07CisJaW5vZGUtPmlfY3RpbWUgPSBkaXItPmlfY3RpbWU7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJZXJyb3IgPSAwOworCitvdXRfYnJlbHNlOgorCWJyZWxzZShiaCk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBiZnNfcmVuYW1lKHN0cnVjdCBpbm9kZSAqIG9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKiBvbGRfZGVudHJ5LCAKKwkJCXN0cnVjdCBpbm9kZSAqIG5ld19kaXIsIHN0cnVjdCBkZW50cnkgKiBuZXdfZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqIG9sZF9pbm9kZSwgKiBuZXdfaW5vZGU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogb2xkX2JoLCAqIG5ld19iaDsKKwlzdHJ1Y3QgYmZzX2RpcmVudCAqIG9sZF9kZSwgKiBuZXdfZGU7CQkKKwlpbnQgZXJyb3IgPSAtRU5PRU5UOworCisJb2xkX2JoID0gbmV3X2JoID0gTlVMTDsKKwlvbGRfaW5vZGUgPSBvbGRfZGVudHJ5LT5kX2lub2RlOworCWlmIChTX0lTRElSKG9sZF9pbm9kZS0+aV9tb2RlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsb2NrX2tlcm5lbCgpOworCW9sZF9iaCA9IGJmc19maW5kX2VudHJ5KG9sZF9kaXIsIAorCQkJCW9sZF9kZW50cnktPmRfbmFtZS5uYW1lLCAKKwkJCQlvbGRfZGVudHJ5LT5kX25hbWUubGVuLCAmb2xkX2RlKTsKKworCWlmICghb2xkX2JoIHx8IG9sZF9kZS0+aW5vICE9IG9sZF9pbm9kZS0+aV9pbm8pCisJCWdvdG8gZW5kX3JlbmFtZTsKKworCWVycm9yID0gLUVQRVJNOworCW5ld19pbm9kZSA9IG5ld19kZW50cnktPmRfaW5vZGU7CisJbmV3X2JoID0gYmZzX2ZpbmRfZW50cnkobmV3X2RpciwgCisJCQkJbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUsIAorCQkJCW5ld19kZW50cnktPmRfbmFtZS5sZW4sICZuZXdfZGUpOworCisJaWYgKG5ld19iaCAmJiAhbmV3X2lub2RlKSB7CisJCWJyZWxzZShuZXdfYmgpOworCQluZXdfYmggPSBOVUxMOworCX0KKwlpZiAoIW5ld19iaCkgeworCQllcnJvciA9IGJmc19hZGRfZW50cnkobmV3X2RpciwgCisJCQkJCW5ld19kZW50cnktPmRfbmFtZS5uYW1lLAorCQkJIAkJbmV3X2RlbnRyeS0+ZF9uYW1lLmxlbiwgb2xkX2lub2RlLT5pX2lubyk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZW5kX3JlbmFtZTsKKwl9CisJb2xkX2RlLT5pbm8gPSAwOworCW9sZF9kaXItPmlfY3RpbWUgPSBvbGRfZGlyLT5pX210aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwltYXJrX2lub2RlX2RpcnR5KG9sZF9kaXIpOworCWlmIChuZXdfaW5vZGUpIHsKKwkJbmV3X2lub2RlLT5pX25saW5rLS07CisJCW5ld19pbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJCW1hcmtfaW5vZGVfZGlydHkobmV3X2lub2RlKTsKKwl9CisJbWFya19idWZmZXJfZGlydHkob2xkX2JoKTsKKwllcnJvciA9IDA7CisKK2VuZF9yZW5hbWU6CisJdW5sb2NrX2tlcm5lbCgpOworCWJyZWxzZShvbGRfYmgpOworCWJyZWxzZShuZXdfYmgpOworCXJldHVybiBlcnJvcjsKK30KKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgYmZzX2Rpcl9pbm9wcyA9IHsKKwkuY3JlYXRlCQkJPSBiZnNfY3JlYXRlLAorCS5sb29rdXAJCQk9IGJmc19sb29rdXAsCisJLmxpbmsJCQk9IGJmc19saW5rLAorCS51bmxpbmsJCQk9IGJmc191bmxpbmssCisJLnJlbmFtZQkJCT0gYmZzX3JlbmFtZSwKK307CisKK3N0YXRpYyBpbnQgYmZzX2FkZF9lbnRyeShzdHJ1Y3QgaW5vZGUgKiBkaXIsIGNvbnN0IGNoYXIgKiBuYW1lLCBpbnQgbmFtZWxlbiwgaW50IGlubykKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlzdHJ1Y3QgYmZzX2RpcmVudCAqIGRlOworCWludCBibG9jaywgc2Jsb2NrLCBlYmxvY2ssIG9mZiwgZW9mZjsKKwlpbnQgaTsKKworCWRwcmludGYoIm5hbWU9JXMsIG5hbWVsZW49JWRcbiIsIG5hbWUsIG5hbWVsZW4pOworCisJaWYgKCFuYW1lbGVuKQorCQlyZXR1cm4gLUVOT0VOVDsKKwlpZiAobmFtZWxlbiA+IEJGU19OQU1FTEVOKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCXNibG9jayA9IEJGU19JKGRpciktPmlfc2Jsb2NrOworCWVibG9jayA9IEJGU19JKGRpciktPmlfZWJsb2NrOworCWVvZmYgPSBkaXItPmlfc2l6ZSAlIEJGU19CU0laRTsKKwlmb3IgKGJsb2NrPXNibG9jazsgYmxvY2s8PWVibG9jazsgYmxvY2srKykgeworCQliaCA9IHNiX2JyZWFkKGRpci0+aV9zYiwgYmxvY2spOworCQlpZighYmgpIAorCQkJcmV0dXJuIC1FTk9TUEM7CisJCWZvciAob2ZmPTA7IG9mZjxCRlNfQlNJWkU7IG9mZis9QkZTX0RJUkVOVF9TSVpFKSB7CisJCQlkZSA9IChzdHJ1Y3QgYmZzX2RpcmVudCAqKShiaC0+Yl9kYXRhICsgb2ZmKTsKKwkJCWlmIChibG9jaz09ZWJsb2NrICYmIG9mZj49ZW9mZikgeworCQkJCS8qIERvIG5vdCByZWFkL2ludGVycHJldCB0aGUgZ2FyYmFnZSBpbiB0aGUgZW5kIG9mIGVibG9jay4gKi8KKwkJCQlkZS0+aW5vID0gMDsKKwkJCX0KKwkJCWlmICghZGUtPmlubykgeworCQkJCWlmICgoYmxvY2stc2Jsb2NrKSpCRlNfQlNJWkUgKyBvZmYgPj0gZGlyLT5pX3NpemUpIHsKKwkJCQkJZGlyLT5pX3NpemUgKz0gQkZTX0RJUkVOVF9TSVpFOworCQkJCQlkaXItPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCQkJCX0KKwkJCQlkaXItPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCQkJCW1hcmtfaW5vZGVfZGlydHkoZGlyKTsKKwkJCQlkZS0+aW5vID0gaW5vOworCQkJCWZvciAoaT0wOyBpPEJGU19OQU1FTEVOOyBpKyspCisJCQkJCWRlLT5uYW1lW2ldID0gKGkgPCBuYW1lbGVuKSA/IG5hbWVbaV0gOiAwOworCQkJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwkJCQlicmVsc2UoYmgpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJCWJyZWxzZShiaCk7CisJfQorCXJldHVybiAtRU5PU1BDOworfQorCitzdGF0aWMgaW5saW5lIGludCBiZnNfbmFtZWNtcChpbnQgbGVuLCBjb25zdCBjaGFyICogbmFtZSwgY29uc3QgY2hhciAqIGJ1ZmZlcikKK3sKKwlpZiAobGVuIDwgQkZTX05BTUVMRU4gJiYgYnVmZmVyW2xlbl0pCisJCXJldHVybiAwOworCXJldHVybiAhbWVtY21wKG5hbWUsIGJ1ZmZlciwgbGVuKTsKK30KKworc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJmc19maW5kX2VudHJ5KHN0cnVjdCBpbm9kZSAqIGRpciwgCisJY29uc3QgY2hhciAqIG5hbWUsIGludCBuYW1lbGVuLCBzdHJ1Y3QgYmZzX2RpcmVudCAqKiByZXNfZGlyKQoreworCXVuc2lnbmVkIGxvbmcgYmxvY2ssIG9mZnNldDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlzdHJ1Y3QgYmZzX2RpcmVudCAqIGRlOworCisJKnJlc19kaXIgPSBOVUxMOworCWlmIChuYW1lbGVuID4gQkZTX05BTUVMRU4pCisJCXJldHVybiBOVUxMOworCWJoID0gTlVMTDsKKwlibG9jayA9IG9mZnNldCA9IDA7CisJd2hpbGUgKGJsb2NrICogQkZTX0JTSVpFICsgb2Zmc2V0IDwgZGlyLT5pX3NpemUpIHsKKwkJaWYgKCFiaCkgeworCQkJYmggPSBzYl9icmVhZChkaXItPmlfc2IsIEJGU19JKGRpciktPmlfc2Jsb2NrICsgYmxvY2spOworCQkJaWYgKCFiaCkgeworCQkJCWJsb2NrKys7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJZGUgPSAoc3RydWN0IGJmc19kaXJlbnQgKikoYmgtPmJfZGF0YSArIG9mZnNldCk7CisJCW9mZnNldCArPSBCRlNfRElSRU5UX1NJWkU7CisJCWlmIChkZS0+aW5vICYmIGJmc19uYW1lY21wKG5hbWVsZW4sIG5hbWUsIGRlLT5uYW1lKSkgeworCQkJKnJlc19kaXIgPSBkZTsKKwkJCXJldHVybiBiaDsKKwkJfQorCQlpZiAob2Zmc2V0IDwgYmgtPmJfc2l6ZSkKKwkJCWNvbnRpbnVlOworCQlicmVsc2UoYmgpOworCQliaCA9IE5VTEw7CisJCW9mZnNldCA9IDA7CisJCWJsb2NrKys7CisJfQorCWJyZWxzZShiaCk7CisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9mcy9iZnMvZmlsZS5jIGIvZnMvYmZzL2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDdmZDFlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYmZzL2ZpbGUuYwpAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqCWZzL2Jmcy9maWxlLmMKKyAqCUJGUyBmaWxlIG9wZXJhdGlvbnMuCisgKglDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkB2ZXJpdGFzLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSAiYmZzLmgiCisKKyN1bmRlZiBERUJVRworCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgZHByaW50Zih4Li4uKQlwcmludGYoeCkKKyNlbHNlCisjZGVmaW5lIGRwcmludGYoeC4uLikKKyNlbmRpZgorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJmc19maWxlX29wZXJhdGlvbnMgPSB7CisJLmxsc2VlayAJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAorCS5yZWFkCQk9IGdlbmVyaWNfZmlsZV9yZWFkLAorCS53cml0ZQkJPSBnZW5lcmljX2ZpbGVfd3JpdGUsCisJLm1tYXAJCT0gZ2VuZXJpY19maWxlX21tYXAsCisJLnNlbmRmaWxlCT0gZ2VuZXJpY19maWxlX3NlbmRmaWxlLAorfTsKKworc3RhdGljIGludCBiZnNfbW92ZV9ibG9jayh1bnNpZ25lZCBsb25nIGZyb20sIHVuc2lnbmVkIGxvbmcgdG8sIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKm5ldzsKKworCWJoID0gc2JfYnJlYWQoc2IsIGZyb20pOworCWlmICghYmgpCisJCXJldHVybiAtRUlPOworCW5ldyA9IHNiX2dldGJsayhzYiwgdG8pOworCW1lbWNweShuZXctPmJfZGF0YSwgYmgtPmJfZGF0YSwgYmgtPmJfc2l6ZSk7CisJbWFya19idWZmZXJfZGlydHkobmV3KTsKKwliZm9yZ2V0KGJoKTsKKwlicmVsc2UobmV3KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiZnNfbW92ZV9ibG9ja3Moc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsIAorCQkJCXVuc2lnbmVkIGxvbmcgd2hlcmUpCit7CisJdW5zaWduZWQgbG9uZyBpOworCisJZHByaW50ZigiJTA4bHgtJTA4bHgtPiUwOGx4XG4iLCBzdGFydCwgZW5kLCB3aGVyZSk7CisJZm9yIChpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspCisJCWlmKGJmc19tb3ZlX2Jsb2NrKGksIHdoZXJlICsgaSwgc2IpKSB7CisJCQlkcHJpbnRmKCJmYWlsZWQgdG8gbW92ZSBibG9jayAlMDhseCAtPiAlMDhseFxuIiwgaSwgd2hlcmUgKyBpKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmZzX2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc2VjdG9yX3QgYmxvY2ssIAorCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkKK3sKKwlsb25nIHBoeXM7CisJaW50IGVycjsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGJmc19zYl9pbmZvICppbmZvID0gQkZTX1NCKHNiKTsKKwlzdHJ1Y3QgYmZzX2lub2RlX2luZm8gKmJpID0gQkZTX0koaW5vZGUpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqc2JoID0gaW5mby0+c2lfc2JoOworCisJaWYgKGJsb2NrIDwgMCB8fCBibG9jayA+IGluZm8tPnNpX2Jsb2NrcykKKwkJcmV0dXJuIC1FSU87CisKKwlwaHlzID0gYmktPmlfc2Jsb2NrICsgYmxvY2s7CisJaWYgKCFjcmVhdGUpIHsKKwkJaWYgKHBoeXMgPD0gYmktPmlfZWJsb2NrKSB7CisJCQlkcHJpbnRmKCJjPSVkLCBiPSUwOGx4LCBwaHlzPSUwOGx4IChncmFudGVkKVxuIiwgY3JlYXRlLCBibG9jaywgcGh5cyk7CisJCQltYXBfYmgoYmhfcmVzdWx0LCBzYiwgcGh5cyk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJLyogaWYgdGhlIGZpbGUgaXMgbm90IGVtcHR5IGFuZCB0aGUgcmVxdWVzdGVkIGJsb2NrIGlzIHdpdGhpbiB0aGUgcmFuZ2UKKwkgICBvZiBibG9ja3MgYWxsb2NhdGVkIGZvciB0aGlzIGZpbGUsIHdlIGNhbiBncmFudCBpdCAqLworCWlmIChpbm9kZS0+aV9zaXplICYmIHBoeXMgPD0gYmktPmlfZWJsb2NrKSB7CisJCWRwcmludGYoImM9JWQsIGI9JTA4bHgsIHBoeXM9JTA4bHggKGludGVyaW0gYmxvY2sgZ3JhbnRlZClcbiIsIAorCQkJCWNyZWF0ZSwgYmxvY2ssIHBoeXMpOworCQltYXBfYmgoYmhfcmVzdWx0LCBzYiwgcGh5cyk7CisJCXJldHVybiAwOworCX0KKworCS8qIHRoZSByZXN0IGhhcyB0byBiZSBwcm90ZWN0ZWQgYWdhaW5zdCBpdHNlbGYgKi8KKwlsb2NrX2tlcm5lbCgpOworCisJLyogaWYgdGhlIGxhc3QgZGF0YSBibG9jayBmb3IgdGhpcyBmaWxlIGlzIHRoZSBsYXN0IGFsbG9jYXRlZCBibG9jaywgd2UgY2FuCisJICAgZXh0ZW5kIHRoZSBmaWxlIHRyaXZpYWxseSwgd2l0aG91dCBtb3ZpbmcgaXQgYW55d2hlcmUgKi8KKwlpZiAoYmktPmlfZWJsb2NrID09IGluZm8tPnNpX2xmX2VibGspIHsKKwkJZHByaW50ZigiYz0lZCwgYj0lMDhseCwgcGh5cz0lMDhseCAoc2ltcGxlIGV4dGVuc2lvbilcbiIsIAorCQkJCWNyZWF0ZSwgYmxvY2ssIHBoeXMpOworCQltYXBfYmgoYmhfcmVzdWx0LCBzYiwgcGh5cyk7CisJCWluZm8tPnNpX2ZyZWViIC09IHBoeXMgLSBiaS0+aV9lYmxvY2s7CisJCWluZm8tPnNpX2xmX2VibGsgPSBiaS0+aV9lYmxvY2sgPSBwaHlzOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJbWFya19idWZmZXJfZGlydHkoc2JoKTsKKwkJZXJyID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogT2ssIHdlIGhhdmUgdG8gbW92ZSB0aGlzIGVudGlyZSBmaWxlIHRvIHRoZSBuZXh0IGZyZWUgYmxvY2sgKi8KKwlwaHlzID0gaW5mby0+c2lfbGZfZWJsayArIDE7CisJaWYgKGJpLT5pX3NibG9jaykgeyAvKiBpZiBkYXRhIHN0YXJ0cyBvbiBibG9jayAwIHRoZW4gdGhlcmUgaXMgbm8gZGF0YSAqLworCQllcnIgPSBiZnNfbW92ZV9ibG9ja3MoaW5vZGUtPmlfc2IsIGJpLT5pX3NibG9jaywgCisJCQkJYmktPmlfZWJsb2NrLCBwaHlzKTsKKwkJaWYgKGVycikgeworCQkJZHByaW50ZigiZmFpbGVkIHRvIG1vdmUgaW5vPSUwOGx4IC0+IGZzIGNvcnJ1cHRpb25cbiIsIGlub2RlLT5pX2lubyk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0gZWxzZQorCQllcnIgPSAwOworCisJZHByaW50ZigiYz0lZCwgYj0lMDhseCwgcGh5cz0lMDhseCAobW92ZWQpXG4iLCBjcmVhdGUsIGJsb2NrLCBwaHlzKTsKKwliaS0+aV9zYmxvY2sgPSBwaHlzOworCXBoeXMgKz0gYmxvY2s7CisJaW5mby0+c2lfbGZfZWJsayA9IGJpLT5pX2VibG9jayA9IHBoeXM7CisKKwkvKiB0aGlzIGFzc3VtZXMgbm90aGluZyBjYW4gd3JpdGUgdGhlIGlub2RlIGJhY2sgd2hpbGUgd2UgYXJlIGhlcmUKKwkgKiBhbmQgdGh1cyB1cGRhdGUgaW5vZGUtPmlfYmxvY2tzISAoWFhYKSovCisJaW5mby0+c2lfZnJlZWIgLT0gYmktPmlfZWJsb2NrIC0gYmktPmlfc2Jsb2NrICsgMSAtIGlub2RlLT5pX2Jsb2NrczsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwltYXJrX2J1ZmZlcl9kaXJ0eShzYmgpOworCW1hcF9iaChiaF9yZXN1bHQsIHNiLCBwaHlzKTsKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBiZnNfd3JpdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlyZXR1cm4gYmxvY2tfd3JpdGVfZnVsbF9wYWdlKHBhZ2UsIGJmc19nZXRfYmxvY2ssIHdiYyk7Cit9CisKK3N0YXRpYyBpbnQgYmZzX3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlyZXR1cm4gYmxvY2tfcmVhZF9mdWxsX3BhZ2UocGFnZSwgYmZzX2dldF9ibG9jayk7Cit9CisKK3N0YXRpYyBpbnQgYmZzX3ByZXBhcmVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKwlyZXR1cm4gYmxvY2tfcHJlcGFyZV93cml0ZShwYWdlLCBmcm9tLCB0bywgYmZzX2dldF9ibG9jayk7Cit9CisKK3N0YXRpYyBzZWN0b3JfdCBiZnNfYm1hcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc2VjdG9yX3QgYmxvY2spCit7CisJcmV0dXJuIGdlbmVyaWNfYmxvY2tfYm1hcChtYXBwaW5nLCBibG9jaywgYmZzX2dldF9ibG9jayk7Cit9CisKK3N0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgYmZzX2FvcHMgPSB7CisJLnJlYWRwYWdlCT0gYmZzX3JlYWRwYWdlLAorCS53cml0ZXBhZ2UJPSBiZnNfd3JpdGVwYWdlLAorCS5zeW5jX3BhZ2UJPSBibG9ja19zeW5jX3BhZ2UsCisJLnByZXBhcmVfd3JpdGUJPSBiZnNfcHJlcGFyZV93cml0ZSwKKwkuY29tbWl0X3dyaXRlCT0gZ2VuZXJpY19jb21taXRfd3JpdGUsCisJLmJtYXAJCT0gYmZzX2JtYXAsCit9OworCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBiZnNfZmlsZV9pbm9wczsKZGlmZiAtLWdpdCBhL2ZzL2Jmcy9pbm9kZS5jIGIvZnMvYmZzL2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRlMGZiMwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Jmcy9pbm9kZS5jCkBAIC0wLDAgKzEsNDIwIEBACisvKgorICoJZnMvYmZzL2lub2RlLmMKKyAqCUJGUyBzdXBlcmJsb2NrIGFuZCBpbm9kZSBvcGVyYXRpb25zLgorICoJQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAgVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5AdmVyaXRhcy5jb20+CisgKglGcm9tIGZzL21pbml4LCBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgTGludXMgVG9ydmFsZHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgImJmcy5oIgorCitNT0RVTEVfQVVUSE9SKCJUaWdyYW4gQS4gQWl2YXppYW4gPHRpZ3JhbkB2ZXJpdGFzLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU0NPIFVuaXhXYXJlIEJGUyBmaWxlc3lzdGVtIGZvciBMaW51eCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjdW5kZWYgREVCVUcKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIGRwcmludGYoeC4uLikJcHJpbnRmKHgpCisjZWxzZQorI2RlZmluZSBkcHJpbnRmKHguLi4pCisjZW5kaWYKKwordm9pZCBkdW1wX2ltYXAoY29uc3QgY2hhciAqcHJlZml4LCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzKTsKKworc3RhdGljIHZvaWQgYmZzX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJdW5zaWduZWQgbG9uZyBpbm8gPSBpbm9kZS0+aV9pbm87CisJc3RydWN0IGJmc19pbm9kZSAqIGRpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCWludCBibG9jaywgb2ZmOworCisJaWYgKGlubyA8IEJGU19ST09UX0lOTyB8fCBpbm8gPiBCRlNfU0IoaW5vZGUtPmlfc2IpLT5zaV9sYXN0aSkgeworCQlwcmludGYoIkJhZCBpbm9kZSBudW1iZXIgJXM6JTA4bHhcbiIsIGlub2RlLT5pX3NiLT5zX2lkLCBpbm8pOworCQltYWtlX2JhZF9pbm9kZShpbm9kZSk7CisJCXJldHVybjsKKwl9CisKKwlibG9jayA9IChpbm8gLSBCRlNfUk9PVF9JTk8pL0JGU19JTk9ERVNfUEVSX0JMT0NLICsgMTsKKwliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCBibG9jayk7CisJaWYgKCFiaCkgeworCQlwcmludGYoIlVuYWJsZSB0byByZWFkIGlub2RlICVzOiUwOGx4XG4iLCBpbm9kZS0+aV9zYi0+c19pZCwgaW5vKTsKKwkJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCQlyZXR1cm47CisJfQorCisJb2ZmID0gKGlubyAtIEJGU19ST09UX0lOTykgJSBCRlNfSU5PREVTX1BFUl9CTE9DSzsKKwlkaSA9IChzdHJ1Y3QgYmZzX2lub2RlICopYmgtPmJfZGF0YSArIG9mZjsKKworCWlub2RlLT5pX21vZGUgPSAweDAwMDBGRkZGICYgZGktPmlfbW9kZTsKKwlpZiAoZGktPmlfdnR5cGUgPT0gQkZTX1ZESVIpIHsKKwkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGRElSOworCQlpbm9kZS0+aV9vcCA9ICZiZnNfZGlyX2lub3BzOworCQlpbm9kZS0+aV9mb3AgPSAmYmZzX2Rpcl9vcGVyYXRpb25zOworCX0gZWxzZSBpZiAoZGktPmlfdnR5cGUgPT0gQkZTX1ZSRUcpIHsKKwkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGUkVHOworCQlpbm9kZS0+aV9vcCA9ICZiZnNfZmlsZV9pbm9wczsKKwkJaW5vZGUtPmlfZm9wID0gJmJmc19maWxlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmJmc19hb3BzOworCX0KKworCWlub2RlLT5pX3VpZCA9IGRpLT5pX3VpZDsKKwlpbm9kZS0+aV9naWQgPSBkaS0+aV9naWQ7CisJaW5vZGUtPmlfbmxpbmsgPSBkaS0+aV9ubGluazsKKwlpbm9kZS0+aV9zaXplID0gQkZTX0ZJTEVTSVpFKGRpKTsKKwlpbm9kZS0+aV9ibG9ja3MgPSBCRlNfRklMRUJMT0NLUyhkaSk7CisJaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfU0laRTsKKwlpbm9kZS0+aV9hdGltZS50dl9zZWMgPSBkaS0+aV9hdGltZTsKKwlpbm9kZS0+aV9tdGltZS50dl9zZWMgPSBkaS0+aV9tdGltZTsKKwlpbm9kZS0+aV9jdGltZS50dl9zZWMgPSBkaS0+aV9jdGltZTsKKwlpbm9kZS0+aV9hdGltZS50dl9uc2VjID0gMDsKKwlpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gMDsKKwlpbm9kZS0+aV9jdGltZS50dl9uc2VjID0gMDsKKwlCRlNfSShpbm9kZSktPmlfZHNrX2lubyA9IGRpLT5pX2lubzsgLyogY2FuIGJlIDAgc28gd2Ugc3RvcmUgYSBjb3B5ICovCisJQkZTX0koaW5vZGUpLT5pX3NibG9jayA9IGRpLT5pX3NibG9jazsKKwlCRlNfSShpbm9kZSktPmlfZWJsb2NrID0gZGktPmlfZWJsb2NrOworCisJYnJlbHNlKGJoKTsKK30KKworc3RhdGljIGludCBiZnNfd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICogaW5vZGUsIGludCB1bnVzZWQpCit7CisJdW5zaWduZWQgbG9uZyBpbm8gPSBpbm9kZS0+aV9pbm87CisJc3RydWN0IGJmc19pbm9kZSAqIGRpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCWludCBibG9jaywgb2ZmOworCisJaWYgKGlubyA8IEJGU19ST09UX0lOTyB8fCBpbm8gPiBCRlNfU0IoaW5vZGUtPmlfc2IpLT5zaV9sYXN0aSkgeworCQlwcmludGYoIkJhZCBpbm9kZSBudW1iZXIgJXM6JTA4bHhcbiIsIGlub2RlLT5pX3NiLT5zX2lkLCBpbm8pOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlsb2NrX2tlcm5lbCgpOworCWJsb2NrID0gKGlubyAtIEJGU19ST09UX0lOTykvQkZTX0lOT0RFU19QRVJfQkxPQ0sgKyAxOworCWJoID0gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIGJsb2NrKTsKKwlpZiAoIWJoKSB7CisJCXByaW50ZigiVW5hYmxlIHRvIHJlYWQgaW5vZGUgJXM6JTA4bHhcbiIsIGlub2RlLT5pX3NiLT5zX2lkLCBpbm8pOworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRUlPOworCX0KKworCW9mZiA9IChpbm8gLSBCRlNfUk9PVF9JTk8pJUJGU19JTk9ERVNfUEVSX0JMT0NLOworCWRpID0gKHN0cnVjdCBiZnNfaW5vZGUgKiliaC0+Yl9kYXRhICsgb2ZmOworCisJaWYgKGlub2RlLT5pX2lubyA9PSBCRlNfUk9PVF9JTk8pCisJCWRpLT5pX3Z0eXBlID0gQkZTX1ZESVI7CisJZWxzZQorCQlkaS0+aV92dHlwZSA9IEJGU19WUkVHOworCisJZGktPmlfaW5vID0gaW5vZGUtPmlfaW5vOworCWRpLT5pX21vZGUgPSBpbm9kZS0+aV9tb2RlOworCWRpLT5pX3VpZCA9IGlub2RlLT5pX3VpZDsKKwlkaS0+aV9naWQgPSBpbm9kZS0+aV9naWQ7CisJZGktPmlfbmxpbmsgPSBpbm9kZS0+aV9ubGluazsKKwlkaS0+aV9hdGltZSA9IGlub2RlLT5pX2F0aW1lLnR2X3NlYzsKKwlkaS0+aV9tdGltZSA9IGlub2RlLT5pX210aW1lLnR2X3NlYzsKKwlkaS0+aV9jdGltZSA9IGlub2RlLT5pX2N0aW1lLnR2X3NlYzsKKwlkaS0+aV9zYmxvY2sgPSBCRlNfSShpbm9kZSktPmlfc2Jsb2NrOworCWRpLT5pX2VibG9jayA9IEJGU19JKGlub2RlKS0+aV9lYmxvY2s7CisJZGktPmlfZW9mZnNldCA9IGRpLT5pX3NibG9jayAqIEJGU19CU0laRSArIGlub2RlLT5pX3NpemUgLSAxOworCisJbWFya19idWZmZXJfZGlydHkoYmgpOworCWJyZWxzZShiaCk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBiZnNfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCXVuc2lnbmVkIGxvbmcgaW5vID0gaW5vZGUtPmlfaW5vOworCXN0cnVjdCBiZnNfaW5vZGUgKiBkaTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlpbnQgYmxvY2ssIG9mZjsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGJmc19zYl9pbmZvICogaW5mbyA9IEJGU19TQihzKTsKKworCWRwcmludGYoImlubz0lMDhseFxuIiwgaW5vZGUtPmlfaW5vKTsKKworCWlmIChpbm9kZS0+aV9pbm8gPCBCRlNfUk9PVF9JTk8gfHwgaW5vZGUtPmlfaW5vID4gaW5mby0+c2lfbGFzdGkpIHsKKwkJcHJpbnRmKCJpbnZhbGlkIGlubz0lMDhseFxuIiwgaW5vZGUtPmlfaW5vKTsKKwkJcmV0dXJuOworCX0KKwkKKwlpbm9kZS0+aV9zaXplID0gMDsKKwlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCWxvY2tfa2VybmVsKCk7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJYmxvY2sgPSAoaW5vIC0gQkZTX1JPT1RfSU5PKS9CRlNfSU5PREVTX1BFUl9CTE9DSyArIDE7CisJYmggPSBzYl9icmVhZChzLCBibG9jayk7CisJaWYgKCFiaCkgeworCQlwcmludGYoIlVuYWJsZSB0byByZWFkIGlub2RlICVzOiUwOGx4XG4iLCBpbm9kZS0+aV9zYi0+c19pZCwgaW5vKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm47CisJfQorCW9mZiA9IChpbm8gLSBCRlNfUk9PVF9JTk8pJUJGU19JTk9ERVNfUEVSX0JMT0NLOworCWRpID0gKHN0cnVjdCBiZnNfaW5vZGUgKiliaC0+Yl9kYXRhICsgb2ZmOworCWlmIChkaS0+aV9pbm8pIHsKKwkJaW5mby0+c2lfZnJlZWIgKz0gQkZTX0ZJTEVCTE9DS1MoZGkpOworCQlpbmZvLT5zaV9mcmVlaSsrOworCQljbGVhcl9iaXQoZGktPmlfaW5vLCBpbmZvLT5zaV9pbWFwKTsKKwkJZHVtcF9pbWFwKCJkZWxldGVfaW5vZGUiLCBzKTsKKwl9CisJZGktPmlfaW5vID0gMDsKKwlkaS0+aV9zYmxvY2sgPSAwOworCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwlicmVsc2UoYmgpOworCisJLyogaWYgdGhpcyB3YXMgdGhlIGxhc3QgZmlsZSwgbWFrZSB0aGUgcHJldmlvdXMgCisJICAgYmxvY2sgImxhc3QgZmlsZXMgbGFzdCBibG9jayIgZXZlbiBpZiB0aGVyZSBpcyBubyByZWFsIGZpbGUgdGhlcmUsCisJICAgc2F2ZXMgdXMgMSBnYXAgKi8KKwlpZiAoaW5mby0+c2lfbGZfZWJsayA9PSBCRlNfSShpbm9kZSktPmlfZWJsb2NrKSB7CisJCWluZm8tPnNpX2xmX2VibGsgPSBCRlNfSShpbm9kZSktPmlfc2Jsb2NrIC0gMTsKKwkJbWFya19idWZmZXJfZGlydHkoaW5mby0+c2lfc2JoKTsKKwl9CisJdW5sb2NrX2tlcm5lbCgpOworCWNsZWFyX2lub2RlKGlub2RlKTsKK30KKworc3RhdGljIHZvaWQgYmZzX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCit7CisJc3RydWN0IGJmc19zYl9pbmZvICppbmZvID0gQkZTX1NCKHMpOworCWJyZWxzZShpbmZvLT5zaV9zYmgpOworCWtmcmVlKGluZm8tPnNpX2ltYXApOworCWtmcmVlKGluZm8pOworCXMtPnNfZnNfaW5mbyA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgYmZzX3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHN0cnVjdCBrc3RhdGZzICpidWYpCit7CisJc3RydWN0IGJmc19zYl9pbmZvICppbmZvID0gQkZTX1NCKHMpOworCXU2NCBpZCA9IGh1Z2VfZW5jb2RlX2RldihzLT5zX2JkZXYtPmJkX2Rldik7CisJYnVmLT5mX3R5cGUgPSBCRlNfTUFHSUM7CisJYnVmLT5mX2JzaXplID0gcy0+c19ibG9ja3NpemU7CisJYnVmLT5mX2Jsb2NrcyA9IGluZm8tPnNpX2Jsb2NrczsKKwlidWYtPmZfYmZyZWUgPSBidWYtPmZfYmF2YWlsID0gaW5mby0+c2lfZnJlZWI7CisJYnVmLT5mX2ZpbGVzID0gaW5mby0+c2lfbGFzdGkgKyAxIC0gQkZTX1JPT1RfSU5POworCWJ1Zi0+Zl9mZnJlZSA9IGluZm8tPnNpX2ZyZWVpOworCWJ1Zi0+Zl9mc2lkLnZhbFswXSA9ICh1MzIpaWQ7CisJYnVmLT5mX2ZzaWQudmFsWzFdID0gKHUzMikoaWQgPj4gMzIpOworCWJ1Zi0+Zl9uYW1lbGVuID0gQkZTX05BTUVMRU47CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJmc193cml0ZV9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCit7CisJbG9ja19rZXJuZWwoKTsKKwlpZiAoIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkKKwkJbWFya19idWZmZXJfZGlydHkoQkZTX1NCKHMpLT5zaV9zYmgpOworCXMtPnNfZGlydCA9IDA7CisJdW5sb2NrX2tlcm5lbCgpOworfQorCitzdGF0aWMga21lbV9jYWNoZV90ICogYmZzX2lub2RlX2NhY2hlcDsKKworc3RhdGljIHN0cnVjdCBpbm9kZSAqYmZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGJmc19pbm9kZV9pbmZvICpiaTsKKwliaSA9IGttZW1fY2FjaGVfYWxsb2MoYmZzX2lub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCWlmICghYmkpCisJCXJldHVybiBOVUxMOworCXJldHVybiAmYmktPnZmc19pbm9kZTsKK30KKworc3RhdGljIHZvaWQgYmZzX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlrbWVtX2NhY2hlX2ZyZWUoYmZzX2lub2RlX2NhY2hlcCwgQkZTX0koaW5vZGUpKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKiBmb28sIGttZW1fY2FjaGVfdCAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgYmZzX2lub2RlX2luZm8gKmJpID0gZm9vOworCisJaWYgKChmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CisJICAgIFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikKKwkJaW5vZGVfaW5pdF9vbmNlKCZiaS0+dmZzX2lub2RlKTsKK30KKyAKK3N0YXRpYyBpbnQgaW5pdF9pbm9kZWNhY2hlKHZvaWQpCit7CisJYmZzX2lub2RlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJiZnNfaW5vZGVfY2FjaGUiLAorCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgYmZzX2lub2RlX2luZm8pLAorCQkJCQkgICAgIDAsIFNMQUJfUkVDTEFJTV9BQ0NPVU5ULAorCQkJCQkgICAgIGluaXRfb25jZSwgTlVMTCk7CisJaWYgKGJmc19pbm9kZV9jYWNoZXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfaW5vZGVjYWNoZSh2b2lkKQoreworCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3koYmZzX2lub2RlX2NhY2hlcCkpCisJCXByaW50ayhLRVJOX0lORk8gImJmc19pbm9kZV9jYWNoZTogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgYmZzX3NvcHMgPSB7CisJLmFsbG9jX2lub2RlCT0gYmZzX2FsbG9jX2lub2RlLAorCS5kZXN0cm95X2lub2RlCT0gYmZzX2Rlc3Ryb3lfaW5vZGUsCisJLnJlYWRfaW5vZGUJPSBiZnNfcmVhZF9pbm9kZSwKKwkud3JpdGVfaW5vZGUJPSBiZnNfd3JpdGVfaW5vZGUsCisJLmRlbGV0ZV9pbm9kZQk9IGJmc19kZWxldGVfaW5vZGUsCisJLnB1dF9zdXBlcgk9IGJmc19wdXRfc3VwZXIsCisJLndyaXRlX3N1cGVyCT0gYmZzX3dyaXRlX3N1cGVyLAorCS5zdGF0ZnMJCT0gYmZzX3N0YXRmcywKK307CisKK3ZvaWQgZHVtcF9pbWFwKGNvbnN0IGNoYXIgKnByZWZpeCwgc3RydWN0IHN1cGVyX2Jsb2NrICogcykKK3sKKyNpZiAwCisJaW50IGk7CisJY2hhciAqdG1wYnVmID0gKGNoYXIgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXRtcGJ1ZikKKwkJcmV0dXJuOworCWZvciAoaT1CRlNfU0IocyktPnNpX2xhc3RpOyBpPj0wOyBpLS0pIHsKKwkJaWYgKGk+UEFHRV9TSVpFLTEwMCkgYnJlYWs7CisJCWlmICh0ZXN0X2JpdChpLCBCRlNfU0IocyktPnNpX2ltYXApKQorCQkJc3RyY2F0KHRtcGJ1ZiwgIjEiKTsKKwkJZWxzZQorCQkJc3RyY2F0KHRtcGJ1ZiwgIjAiKTsKKwl9CisJcHJpbnRrKEtFUk5fRVJSICJCRlMtZnM6ICVzOiBsYXN0aT0lMDhseCA8JXM+XG4iLCBwcmVmaXgsIEJGU19TQihzKS0+c2lfbGFzdGksIHRtcGJ1Zik7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXRtcGJ1Zik7CisjZW5kaWYKK30KKworc3RhdGljIGludCBiZnNfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJc3RydWN0IGJmc19zdXBlcl9ibG9jayAqIGJmc19zYjsKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKwlpbnQgaSwgaW1hcF9sZW47CisJc3RydWN0IGJmc19zYl9pbmZvICogaW5mbzsKKworCWluZm8gPSBrbWFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghaW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CisJcy0+c19mc19pbmZvID0gaW5mbzsKKwltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKCppbmZvKSk7CisKKwlzYl9zZXRfYmxvY2tzaXplKHMsIEJGU19CU0laRSk7CisKKwliaCA9IHNiX2JyZWFkKHMsIDApOworCWlmKCFiaCkKKwkJZ290byBvdXQ7CisJYmZzX3NiID0gKHN0cnVjdCBiZnNfc3VwZXJfYmxvY2sgKiliaC0+Yl9kYXRhOworCWlmIChiZnNfc2ItPnNfbWFnaWMgIT0gQkZTX01BR0lDKSB7CisJCWlmICghc2lsZW50KQorCQkJcHJpbnRmKCJObyBCRlMgZmlsZXN5c3RlbSBvbiAlcyAobWFnaWM9JTA4eClcbiIsIAorCQkJCXMtPnNfaWQsIGJmc19zYi0+c19tYWdpYyk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoQkZTX1VOQ0xFQU4oYmZzX3NiLCBzKSAmJiAhc2lsZW50KQorCQlwcmludGYoIiVzIGlzIHVuY2xlYW4sIGNvbnRpbnVpbmdcbiIsIHMtPnNfaWQpOworCisJcy0+c19tYWdpYyA9IEJGU19NQUdJQzsKKwlpbmZvLT5zaV9iZnNfc2IgPSBiZnNfc2I7CisJaW5mby0+c2lfc2JoID0gYmg7CisJaW5mby0+c2lfbGFzdGkgPSAoYmZzX3NiLT5zX3N0YXJ0IC0gQkZTX0JTSVpFKS9zaXplb2Yoc3RydWN0IGJmc19pbm9kZSkgCisJCQkrIEJGU19ST09UX0lOTyAtIDE7CisKKwlpbWFwX2xlbiA9IGluZm8tPnNpX2xhc3RpLzggKyAxOworCWluZm8tPnNpX2ltYXAgPSBrbWFsbG9jKGltYXBfbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluZm8tPnNpX2ltYXApCisJCWdvdG8gb3V0OworCW1lbXNldChpbmZvLT5zaV9pbWFwLCAwLCBpbWFwX2xlbik7CisJZm9yIChpPTA7IGk8QkZTX1JPT1RfSU5POyBpKyspIAorCQlzZXRfYml0KGksIGluZm8tPnNpX2ltYXApOworCisJcy0+c19vcCA9ICZiZnNfc29wczsKKwlpbm9kZSA9IGlnZXQocywgQkZTX1JPT1RfSU5PKTsKKwlpZiAoIWlub2RlKSB7CisJCWtmcmVlKGluZm8tPnNpX2ltYXApOworCQlnb3RvIG91dDsKKwl9CisJcy0+c19yb290ID0gZF9hbGxvY19yb290KGlub2RlKTsKKwlpZiAoIXMtPnNfcm9vdCkgeworCQlpcHV0KGlub2RlKTsKKwkJa2ZyZWUoaW5mby0+c2lfaW1hcCk7CisJCWdvdG8gb3V0OworCX0KKworCWluZm8tPnNpX2Jsb2NrcyA9IChiZnNfc2ItPnNfZW5kICsgMSk+PkJGU19CU0laRV9CSVRTOyAvKiBmb3Igc3RhdGZzKDIpICovCisJaW5mby0+c2lfZnJlZWIgPSAoYmZzX3NiLT5zX2VuZCArIDEgLSBiZnNfc2ItPnNfc3RhcnQpPj5CRlNfQlNJWkVfQklUUzsKKwlpbmZvLT5zaV9mcmVlaSA9IDA7CisJaW5mby0+c2lfbGZfZWJsayA9IDA7CisJaW5mby0+c2lfbGZfc2JsayA9IDA7CisJaW5mby0+c2lfbGZfaW9mZiA9IDA7CisJZm9yIChpPUJGU19ST09UX0lOTzsgaTw9aW5mby0+c2lfbGFzdGk7IGkrKykgeworCQlpbm9kZSA9IGlnZXQocyxpKTsKKwkJaWYgKEJGU19JKGlub2RlKS0+aV9kc2tfaW5vID09IDApCisJCQlpbmZvLT5zaV9mcmVlaSsrOworCQllbHNlIHsKKwkJCXNldF9iaXQoaSwgaW5mby0+c2lfaW1hcCk7CisJCQlpbmZvLT5zaV9mcmVlYiAtPSBpbm9kZS0+aV9ibG9ja3M7CisJCQlpZiAoQkZTX0koaW5vZGUpLT5pX2VibG9jayA+IGluZm8tPnNpX2xmX2VibGspIHsKKwkJCQlpbmZvLT5zaV9sZl9lYmxrID0gQkZTX0koaW5vZGUpLT5pX2VibG9jazsKKwkJCQlpbmZvLT5zaV9sZl9zYmxrID0gQkZTX0koaW5vZGUpLT5pX3NibG9jazsKKwkJCQlpbmZvLT5zaV9sZl9pb2ZmID0gQkZTX0lOTzJPRkYoaSk7CisJCQl9CisJCX0KKwkJaXB1dChpbm9kZSk7CisJfQorCWlmICghKHMtPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwkJcy0+c19kaXJ0ID0gMTsKKwl9IAorCWR1bXBfaW1hcCgicmVhZF9zdXBlciIsIHMpOworCXJldHVybiAwOworCitvdXQ6CisJYnJlbHNlKGJoKTsKKwlrZnJlZShpbmZvKTsKKwlzLT5zX2ZzX2luZm8gPSBOVUxMOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpiZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgYmZzX2ZpbGxfc3VwZXIpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgYmZzX2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJiZnMiLAorCS5nZXRfc2IJCT0gYmZzX2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfYmxvY2tfc3VwZXIsCisJLmZzX2ZsYWdzCT0gRlNfUkVRVUlSRVNfREVWLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9iZnNfZnModm9pZCkKK3sKKwlpbnQgZXJyID0gaW5pdF9pbm9kZWNhY2hlKCk7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworICAgICAgICBlcnIgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZiZnNfZnNfdHlwZSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJcmV0dXJuIDA7CitvdXQ6CisJZGVzdHJveV9pbm9kZWNhY2hlKCk7CitvdXQxOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2Jmc19mcyh2b2lkKQoreworCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmYmZzX2ZzX3R5cGUpOworCWRlc3Ryb3lfaW5vZGVjYWNoZSgpOworfQorCittb2R1bGVfaW5pdChpbml0X2Jmc19mcykKK21vZHVsZV9leGl0KGV4aXRfYmZzX2ZzKQpkaWZmIC0tZ2l0IGEvZnMvYmluZm10X2FvdXQuYyBiL2ZzL2JpbmZtdF9hb3V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA5Yjg5MgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2JpbmZtdF9hb3V0LmMKQEAgLTAsMCArMSw1NTAgQEAKKy8qCisgKiAgbGludXgvZnMvYmluZm10X2FvdXQuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTYgIExpbnVzIFRvcnZhbGRzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW1hbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Eub3V0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC91c2VyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpbmZtdHMuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJzb25hbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisKK3N0YXRpYyBpbnQgbG9hZF9hb3V0X2JpbmFyeShzdHJ1Y3QgbGludXhfYmlucHJtICosIHN0cnVjdCBwdF9yZWdzICogcmVncyk7CitzdGF0aWMgaW50IGxvYWRfYW91dF9saWJyYXJ5KHN0cnVjdCBmaWxlKik7CitzdGF0aWMgaW50IGFvdXRfY29yZV9kdW1wKGxvbmcgc2lnbnIsIHN0cnVjdCBwdF9yZWdzICogcmVncywgc3RydWN0IGZpbGUgKmZpbGUpOworCitleHRlcm4gdm9pZCBkdW1wX3RocmVhZChzdHJ1Y3QgcHRfcmVncyAqLCBzdHJ1Y3QgdXNlciAqKTsKKworc3RhdGljIHN0cnVjdCBsaW51eF9iaW5mbXQgYW91dF9mb3JtYXQgPSB7CisJLm1vZHVsZQkJPSBUSElTX01PRFVMRSwKKwkubG9hZF9iaW5hcnkJPSBsb2FkX2FvdXRfYmluYXJ5LAorCS5sb2FkX3NobGliCT0gbG9hZF9hb3V0X2xpYnJhcnksCisJLmNvcmVfZHVtcAk9IGFvdXRfY29yZV9kdW1wLAorCS5taW5fY29yZWR1bXAJPSBQQUdFX1NJWkUKK307CisKKyNkZWZpbmUgQkFEX0FERFIoeCkJKCh1bnNpZ25lZCBsb25nKSh4KSA+PSBUQVNLX1NJWkUpCisKK3N0YXRpYyBpbnQgc2V0X2Jyayh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKwlzdGFydCA9IFBBR0VfQUxJR04oc3RhcnQpOworCWVuZCA9IFBBR0VfQUxJR04oZW5kKTsKKwlpZiAoZW5kID4gc3RhcnQpIHsKKwkJdW5zaWduZWQgbG9uZyBhZGRyOworCQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCQlhZGRyID0gZG9fYnJrKHN0YXJ0LCBlbmQgLSBzdGFydCk7CisJCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCQlpZiAoQkFEX0FERFIoYWRkcikpCisJCQlyZXR1cm4gYWRkcjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIG9ubHkgdGhpbmdzIHlvdSBzaG91bGQgZG8gb24gYSBjb3JlLWZpbGU6IHVzZSBvbmx5IHRoZXNlCisgKiBtYWNyb3MgdG8gd3JpdGUgb3V0IGFsbCB0aGUgbmVjZXNzYXJ5IGluZm8uCisgKi8KKworc3RhdGljIGludCBkdW1wX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCB2b2lkICphZGRyLCBpbnQgbnIpCit7CisJcmV0dXJuIGZpbGUtPmZfb3AtPndyaXRlKGZpbGUsIGFkZHIsIG5yLCAmZmlsZS0+Zl9wb3MpID09IG5yOworfQorCisjZGVmaW5lIERVTVBfV1JJVEUoYWRkciwgbnIpCVwKKwlpZiAoIWR1bXBfd3JpdGUoZmlsZSwgKHZvaWQgKikoYWRkciksIChucikpKSBcCisJCWdvdG8gZW5kX2NvcmVkdW1wOworCisjZGVmaW5lIERVTVBfU0VFSyhvZmZzZXQpIFwKK2lmIChmaWxlLT5mX29wLT5sbHNlZWspIHsgXAorCWlmIChmaWxlLT5mX29wLT5sbHNlZWsoZmlsZSwob2Zmc2V0KSwwKSAhPSAob2Zmc2V0KSkgXAorIAkJZ290byBlbmRfY29yZWR1bXA7IFwKK30gZWxzZSBmaWxlLT5mX3BvcyA9IChvZmZzZXQpCisKKy8qCisgKiBSb3V0aW5lIHdyaXRlcyBhIGNvcmUgZHVtcCBpbWFnZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisgKiBDdXJyZW50bHkgb25seSBhIHN0dWItZnVuY3Rpb24uCisgKgorICogTm90ZSB0aGF0IHNldHVpZC9zZXRnaWQgZmlsZXMgd29uJ3QgbWFrZSBhIGNvcmUtZHVtcCBpZiB0aGUgdWlkL2dpZAorICogY2hhbmdlZCBkdWUgdG8gdGhlIHNldFt1fGddaWQuIEl0J3MgZW5mb3JjZWQgYnkgdGhlICJjdXJyZW50LT5tbS0+ZHVtcGFibGUiCisgKiBmaWVsZCwgd2hpY2ggYWxzbyBtYWtlcyBzdXJlIHRoZSBjb3JlLWR1bXBzIHdvbid0IGJlIHJlY3Vyc2l2ZSBpZiB0aGUKKyAqIGR1bXBpbmcgb2YgdGhlIHByb2Nlc3MgcmVzdWx0cyBpbiBhbm90aGVyIGVycm9yLi4KKyAqLworCitzdGF0aWMgaW50IGFvdXRfY29yZV9kdW1wKGxvbmcgc2lnbnIsIHN0cnVjdCBwdF9yZWdzICogcmVncywgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJbW1fc2VnbWVudF90IGZzOworCWludCBoYXNfZHVtcGVkID0gMDsKKwl1bnNpZ25lZCBsb25nIGR1bXBfc3RhcnQsIGR1bXBfc2l6ZTsKKwlzdHJ1Y3QgdXNlciBkdW1wOworI2lmIGRlZmluZWQoX19hbHBoYV9fKQorIyAgICAgICBkZWZpbmUgU1RBUlRfREFUQSh1KQkodS5zdGFydF9kYXRhKQorI2VsaWYgZGVmaW5lZChfX2FybV9fKQorIwlkZWZpbmUgU1RBUlRfREFUQSh1KQkoKHUudV90c2l6ZSA8PCBQQUdFX1NISUZUKSArIHUuc3RhcnRfY29kZSkKKyNlbGlmIGRlZmluZWQoX19zcGFyY19fKQorIyAgICAgICBkZWZpbmUgU1RBUlRfREFUQSh1KSAgICAodS51X3RzaXplKQorI2VsaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX21jNjgwMDBfXykgfHwgZGVmaW5lZChfX2FyY2hfdW1fXykKKyMgICAgICAgZGVmaW5lIFNUQVJUX0RBVEEodSkJKHUudV90c2l6ZSA8PCBQQUdFX1NISUZUKQorI2VuZGlmCisjaWZkZWYgX19zcGFyY19fCisjICAgICAgIGRlZmluZSBTVEFSVF9TVEFDSyh1KSAgICgocmVncy0+dV9yZWdzW1VSRUdfRlBdKSAmIH4oUEFHRV9TSVpFIC0gMSkpCisjZWxzZQorIyAgICAgICBkZWZpbmUgU1RBUlRfU1RBQ0sodSkgICAodS5zdGFydF9zdGFjaykKKyNlbmRpZgorCisJZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKwloYXNfZHVtcGVkID0gMTsKKwljdXJyZW50LT5mbGFncyB8PSBQRl9EVU1QQ09SRTsKKyAgICAgICAJc3RybmNweShkdW1wLnVfY29tbSwgY3VycmVudC0+Y29tbSwgc2l6ZW9mKGR1bXAudV9jb21tKSk7CisjaWZuZGVmIF9fc3BhcmNfXworCWR1bXAudV9hcjAgPSAodm9pZCAqKSgoKHVuc2lnbmVkIGxvbmcpKCZkdW1wLnJlZ3MpKSAtICgodW5zaWduZWQgbG9uZykoJmR1bXApKSk7CisjZW5kaWYKKwlkdW1wLnNpZ25hbCA9IHNpZ25yOworCWR1bXBfdGhyZWFkKHJlZ3MsICZkdW1wKTsKKworLyogSWYgdGhlIHNpemUgb2YgdGhlIGR1bXAgZmlsZSBleGNlZWRzIHRoZSBybGltaXQsIHRoZW4gc2VlIHdoYXQgd291bGQgaGFwcGVuCisgICBpZiB3ZSB3cm90ZSB0aGUgc3RhY2ssIGJ1dCBub3QgdGhlIGRhdGEgYXJlYS4gICovCisjaWZkZWYgX19zcGFyY19fCisJaWYgKChkdW1wLnVfZHNpemUrZHVtcC51X3NzaXplKSA+CisJICAgIGN1cnJlbnQtPnNpZ25hbC0+cmxpbVtSTElNSVRfQ09SRV0ucmxpbV9jdXIpCisJCWR1bXAudV9kc2l6ZSA9IDA7CisjZWxzZQorCWlmICgoZHVtcC51X2RzaXplK2R1bXAudV9zc2l6ZSsxKSAqIFBBR0VfU0laRSA+CisJICAgIGN1cnJlbnQtPnNpZ25hbC0+cmxpbVtSTElNSVRfQ09SRV0ucmxpbV9jdXIpCisJCWR1bXAudV9kc2l6ZSA9IDA7CisjZW5kaWYKKworLyogTWFrZSBzdXJlIHdlIGhhdmUgZW5vdWdoIHJvb20gdG8gd3JpdGUgdGhlIHN0YWNrIGFuZCBkYXRhIGFyZWFzLiAqLworI2lmZGVmIF9fc3BhcmNfXworCWlmICgoZHVtcC51X3NzaXplKSA+CisJICAgIGN1cnJlbnQtPnNpZ25hbC0+cmxpbVtSTElNSVRfQ09SRV0ucmxpbV9jdXIpCisJCWR1bXAudV9zc2l6ZSA9IDA7CisjZWxzZQorCWlmICgoZHVtcC51X3NzaXplKzEpICogUEFHRV9TSVpFID4KKwkgICAgY3VycmVudC0+c2lnbmFsLT5ybGltW1JMSU1JVF9DT1JFXS5ybGltX2N1cikKKwkJZHVtcC51X3NzaXplID0gMDsKKyNlbmRpZgorCisvKiBtYWtlIHN1cmUgd2UgYWN0dWFsbHkgaGF2ZSBhIGRhdGEgYW5kIHN0YWNrIGFyZWEgdG8gZHVtcCAqLworCXNldF9mcyhVU0VSX0RTKTsKKyNpZmRlZiBfX3NwYXJjX18KKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgKHZvaWQgX191c2VyICopU1RBUlRfREFUQShkdW1wKSwgZHVtcC51X2RzaXplKSkKKwkJZHVtcC51X2RzaXplID0gMDsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgKHZvaWQgX191c2VyICopU1RBUlRfU1RBQ0soZHVtcCksIGR1bXAudV9zc2l6ZSkpCisJCWR1bXAudV9zc2l6ZSA9IDA7CisjZWxzZQorCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCAodm9pZCBfX3VzZXIgKilTVEFSVF9EQVRBKGR1bXApLCBkdW1wLnVfZHNpemUgPDwgUEFHRV9TSElGVCkpCisJCWR1bXAudV9kc2l6ZSA9IDA7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsICh2b2lkIF9fdXNlciAqKVNUQVJUX1NUQUNLKGR1bXApLCBkdW1wLnVfc3NpemUgPDwgUEFHRV9TSElGVCkpCisJCWR1bXAudV9zc2l6ZSA9IDA7CisjZW5kaWYKKworCXNldF9mcyhLRVJORUxfRFMpOworLyogc3RydWN0IHVzZXIgKi8KKwlEVU1QX1dSSVRFKCZkdW1wLHNpemVvZihkdW1wKSk7CisvKiBOb3cgZHVtcCBhbGwgb2YgdGhlIHVzZXIgZGF0YS4gIEluY2x1ZGUgbWFsbG9jZWQgc3R1ZmYgYXMgd2VsbCAqLworI2lmbmRlZiBfX3NwYXJjX18KKwlEVU1QX1NFRUsoUEFHRV9TSVpFKTsKKyNlbmRpZgorLyogbm93IHdlIHN0YXJ0IHdyaXRpbmcgb3V0IHRoZSB1c2VyIHNwYWNlIGluZm8gKi8KKwlzZXRfZnMoVVNFUl9EUyk7CisvKiBEdW1wIHRoZSBkYXRhIGFyZWEgKi8KKwlpZiAoZHVtcC51X2RzaXplICE9IDApIHsKKwkJZHVtcF9zdGFydCA9IFNUQVJUX0RBVEEoZHVtcCk7CisjaWZkZWYgX19zcGFyY19fCisJCWR1bXBfc2l6ZSA9IGR1bXAudV9kc2l6ZTsKKyNlbHNlCisJCWR1bXBfc2l6ZSA9IGR1bXAudV9kc2l6ZSA8PCBQQUdFX1NISUZUOworI2VuZGlmCisJCURVTVBfV1JJVEUoZHVtcF9zdGFydCxkdW1wX3NpemUpOworCX0KKy8qIE5vdyBwcmVwYXJlIHRvIGR1bXAgdGhlIHN0YWNrIGFyZWEgKi8KKwlpZiAoZHVtcC51X3NzaXplICE9IDApIHsKKwkJZHVtcF9zdGFydCA9IFNUQVJUX1NUQUNLKGR1bXApOworI2lmZGVmIF9fc3BhcmNfXworCQlkdW1wX3NpemUgPSBkdW1wLnVfc3NpemU7CisjZWxzZQorCQlkdW1wX3NpemUgPSBkdW1wLnVfc3NpemUgPDwgUEFHRV9TSElGVDsKKyNlbmRpZgorCQlEVU1QX1dSSVRFKGR1bXBfc3RhcnQsZHVtcF9zaXplKTsKKwl9CisvKiBGaW5hbGx5IGR1bXAgdGhlIHRhc2sgc3RydWN0LiAgTm90IGJlIHVzZWQgYnkgZ2RiLCBidXQgY291bGQgYmUgdXNlZnVsICovCisJc2V0X2ZzKEtFUk5FTF9EUyk7CisJRFVNUF9XUklURShjdXJyZW50LHNpemVvZigqY3VycmVudCkpOworZW5kX2NvcmVkdW1wOgorCXNldF9mcyhmcyk7CisJcmV0dXJuIGhhc19kdW1wZWQ7Cit9CisKKy8qCisgKiBjcmVhdGVfYW91dF90YWJsZXMoKSBwYXJzZXMgdGhlIGVudi0gYW5kIGFyZy1zdHJpbmdzIGluIG5ldyB1c2VyCisgKiBtZW1vcnkgYW5kIGNyZWF0ZXMgdGhlIHBvaW50ZXIgdGFibGVzIGZyb20gdGhlbSwgYW5kIHB1dHMgdGhlaXIKKyAqIGFkZHJlc3NlcyBvbiB0aGUgInN0YWNrIiwgcmV0dXJuaW5nIHRoZSBuZXcgc3RhY2sgcG9pbnRlciB2YWx1ZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgX191c2VyICpjcmVhdGVfYW91dF90YWJsZXMoY2hhciBfX3VzZXIgKnAsIHN0cnVjdCBsaW51eF9iaW5wcm0gKiBicHJtKQoreworCWNoYXIgX191c2VyICogX191c2VyICphcmd2OworCWNoYXIgX191c2VyICogX191c2VyICplbnZwOworCXVuc2lnbmVkIGxvbmcgX191c2VyICpzcDsKKwlpbnQgYXJnYyA9IGJwcm0tPmFyZ2M7CisJaW50IGVudmMgPSBicHJtLT5lbnZjOworCisJc3AgPSAodm9pZCBfX3VzZXIgKikoKC0odW5zaWduZWQgbG9uZylzaXplb2YoY2hhciAqKSkgJiAodW5zaWduZWQgbG9uZykgcCk7CisjaWZkZWYgX19zcGFyY19fCisJLyogVGhpcyBpbXBvc2VzIHRoZSBwcm9wZXIgc3RhY2sgYWxpZ25tZW50IGZvciBhIG5ldyBwcm9jZXNzLiAqLworCXNwID0gKHZvaWQgX191c2VyICopICgoKHVuc2lnbmVkIGxvbmcpIHNwKSAmIH43KTsKKwlpZiAoKGVudmMrYXJnYyszKSYxKSAtLXNwOworI2VuZGlmCisjaWZkZWYgX19hbHBoYV9fCisvKiB3aGVlLi4gdGVzdC1wcm9ncmFtcyBhcmUgc28gbXVjaCBmdW4uICovCisJcHV0X3VzZXIoMCwgLS1zcCk7CisJcHV0X3VzZXIoMCwgLS1zcCk7CisJaWYgKGJwcm0tPmxvYWRlcikgeworCQlwdXRfdXNlcigwLCAtLXNwKTsKKwkJcHV0X3VzZXIoMHgzZWIsIC0tc3ApOworCQlwdXRfdXNlcihicHJtLT5sb2FkZXIsIC0tc3ApOworCQlwdXRfdXNlcigweDNlYSwgLS1zcCk7CisJfQorCXB1dF91c2VyKGJwcm0tPmV4ZWMsIC0tc3ApOworCXB1dF91c2VyKDB4M2U5LCAtLXNwKTsKKyNlbmRpZgorCXNwIC09IGVudmMrMTsKKwllbnZwID0gKGNoYXIgX191c2VyICogX191c2VyICopIHNwOworCXNwIC09IGFyZ2MrMTsKKwlhcmd2ID0gKGNoYXIgX191c2VyICogX191c2VyICopIHNwOworI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19tYzY4MDAwX18pIHx8IGRlZmluZWQoX19hcm1fXykgfHwgZGVmaW5lZChfX2FyY2hfdW1fXykKKwlwdXRfdXNlcigodW5zaWduZWQgbG9uZykgZW52cCwtLXNwKTsKKwlwdXRfdXNlcigodW5zaWduZWQgbG9uZykgYXJndiwtLXNwKTsKKyNlbmRpZgorCXB1dF91c2VyKGFyZ2MsLS1zcCk7CisJY3VycmVudC0+bW0tPmFyZ19zdGFydCA9ICh1bnNpZ25lZCBsb25nKSBwOworCXdoaWxlIChhcmdjLS0+MCkgeworCQljaGFyIGM7CisJCXB1dF91c2VyKHAsYXJndisrKTsKKwkJZG8geworCQkJZ2V0X3VzZXIoYyxwKyspOworCQl9IHdoaWxlIChjKTsKKwl9CisJcHV0X3VzZXIoTlVMTCxhcmd2KTsKKwljdXJyZW50LT5tbS0+YXJnX2VuZCA9IGN1cnJlbnQtPm1tLT5lbnZfc3RhcnQgPSAodW5zaWduZWQgbG9uZykgcDsKKwl3aGlsZSAoZW52Yy0tPjApIHsKKwkJY2hhciBjOworCQlwdXRfdXNlcihwLGVudnArKyk7CisJCWRvIHsKKwkJCWdldF91c2VyKGMscCsrKTsKKwkJfSB3aGlsZSAoYyk7CisJfQorCXB1dF91c2VyKE5VTEwsZW52cCk7CisJY3VycmVudC0+bW0tPmVudl9lbmQgPSAodW5zaWduZWQgbG9uZykgcDsKKwlyZXR1cm4gc3A7Cit9CisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIGZ1bmN0aW9ucyB1c2VkIHRvIGxvYWQgYS5vdXQgc3R5bGUgZXhlY3V0YWJsZXMgYW5kIHNoYXJlZAorICogbGlicmFyaWVzLiAgVGhlcmUgaXMgbm8gYmluYXJ5IGRlcGVuZGVudCBjb2RlIGFueXdoZXJlIGVsc2UuCisgKi8KKworc3RhdGljIGludCBsb2FkX2FvdXRfYmluYXJ5KHN0cnVjdCBsaW51eF9iaW5wcm0gKiBicHJtLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0IGV4ZWMgZXg7CisJdW5zaWduZWQgbG9uZyBlcnJvcjsKKwl1bnNpZ25lZCBsb25nIGZkX29mZnNldDsKKwl1bnNpZ25lZCBsb25nIHJsaW07CisJaW50IHJldHZhbDsKKworCWV4ID0gKigoc3RydWN0IGV4ZWMgKikgYnBybS0+YnVmKTsJCS8qIGV4ZWMtaGVhZGVyICovCisJaWYgKChOX01BR0lDKGV4KSAhPSBaTUFHSUMgJiYgTl9NQUdJQyhleCkgIT0gT01BR0lDICYmCisJICAgICBOX01BR0lDKGV4KSAhPSBRTUFHSUMgJiYgTl9NQUdJQyhleCkgIT0gTk1BR0lDKSB8fAorCSAgICBOX1RSU0laRShleCkgfHwgTl9EUlNJWkUoZXgpIHx8CisJICAgIGlfc2l6ZV9yZWFkKGJwcm0tPmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKSA8IGV4LmFfdGV4dCtleC5hX2RhdGErTl9TWU1TSVpFKGV4KStOX1RYVE9GRihleCkpIHsKKwkJcmV0dXJuIC1FTk9FWEVDOworCX0KKworCWZkX29mZnNldCA9IE5fVFhUT0ZGKGV4KTsKKworCS8qIENoZWNrIGluaXRpYWwgbGltaXRzLiBUaGlzIGF2b2lkcyBsZXR0aW5nIHBlb3BsZSBjaXJjdW12ZW50CisJICogc2l6ZSBsaW1pdHMgaW1wb3NlZCBvbiB0aGVtIGJ5IGNyZWF0aW5nIHByb2dyYW1zIHdpdGggbGFyZ2UKKwkgKiBhcnJheXMgaW4gdGhlIGRhdGEgb3IgYnNzLgorCSAqLworCXJsaW0gPSBjdXJyZW50LT5zaWduYWwtPnJsaW1bUkxJTUlUX0RBVEFdLnJsaW1fY3VyOworCWlmIChybGltID49IFJMSU1fSU5GSU5JVFkpCisJCXJsaW0gPSB+MDsKKwlpZiAoZXguYV9kYXRhICsgZXguYV9ic3MgPiBybGltKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIEZsdXNoIGFsbCB0cmFjZXMgb2YgdGhlIGN1cnJlbnRseSBydW5uaW5nIGV4ZWN1dGFibGUgKi8KKwlyZXR2YWwgPSBmbHVzaF9vbGRfZXhlYyhicHJtKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJLyogT0ssIFRoaXMgaXMgdGhlIHBvaW50IG9mIG5vIHJldHVybiAqLworI2lmIGRlZmluZWQoX19hbHBoYV9fKQorCVNFVF9BT1VUX1BFUlNPTkFMSVRZKGJwcm0sIGV4KTsKKyNlbGlmIGRlZmluZWQoX19zcGFyY19fKQorCXNldF9wZXJzb25hbGl0eShQRVJfU1VOT1MpOworI2lmICFkZWZpbmVkKF9fc3BhcmNfdjlfXykKKwltZW1jcHkoJmN1cnJlbnQtPnRocmVhZC5jb3JlX2V4ZWMsICZleCwgc2l6ZW9mKHN0cnVjdCBleGVjKSk7CisjZW5kaWYKKyNlbHNlCisJc2V0X3BlcnNvbmFsaXR5KFBFUl9MSU5VWCk7CisjZW5kaWYKKworCWN1cnJlbnQtPm1tLT5lbmRfY29kZSA9IGV4LmFfdGV4dCArCisJCShjdXJyZW50LT5tbS0+c3RhcnRfY29kZSA9IE5fVFhUQUREUihleCkpOworCWN1cnJlbnQtPm1tLT5lbmRfZGF0YSA9IGV4LmFfZGF0YSArCisJCShjdXJyZW50LT5tbS0+c3RhcnRfZGF0YSA9IE5fREFUQUREUihleCkpOworCWN1cnJlbnQtPm1tLT5icmsgPSBleC5hX2JzcyArCisJCShjdXJyZW50LT5tbS0+c3RhcnRfYnJrID0gTl9CU1NBRERSKGV4KSk7CisJY3VycmVudC0+bW0tPmZyZWVfYXJlYV9jYWNoZSA9IGN1cnJlbnQtPm1tLT5tbWFwX2Jhc2U7CisKKwlzZXRfbW1fY291bnRlcihjdXJyZW50LT5tbSwgcnNzLCAwKTsKKwljdXJyZW50LT5tbS0+bW1hcCA9IE5VTEw7CisJY29tcHV0ZV9jcmVkcyhicHJtKTsKKyAJY3VycmVudC0+ZmxhZ3MgJj0gflBGX0ZPUktOT0VYRUM7CisjaWZkZWYgX19zcGFyY19fCisJaWYgKE5fTUFHSUMoZXgpID09IE5NQUdJQykgeworCQlsb2ZmX3QgcG9zID0gZmRfb2Zmc2V0OworCQkvKiBGdWNrIG1lIHBsZW50eS4uLiAqLworCQkvKiA8QU9MPjwvQU9MPiAqLworCQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwkKKwkJZXJyb3IgPSBkb19icmsoTl9UWFRBRERSKGV4KSwgZXguYV90ZXh0KTsKKwkJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJCWJwcm0tPmZpbGUtPmZfb3AtPnJlYWQoYnBybS0+ZmlsZSwgKGNoYXIgKikgTl9UWFRBRERSKGV4KSwKKwkJCSAgZXguYV90ZXh0LCAmcG9zKTsKKwkJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwkJZXJyb3IgPSBkb19icmsoTl9EQVRBRERSKGV4KSwgZXguYV9kYXRhKTsKKwkJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJCWJwcm0tPmZpbGUtPmZfb3AtPnJlYWQoYnBybS0+ZmlsZSwgKGNoYXIgKikgTl9EQVRBRERSKGV4KSwKKwkJCSAgZXguYV9kYXRhLCAmcG9zKTsKKwkJZ290byBiZXlvbmRfaWY7CisJfQorI2VuZGlmCisKKwlpZiAoTl9NQUdJQyhleCkgPT0gT01BR0lDKSB7CisJCXVuc2lnbmVkIGxvbmcgdGV4dF9hZGRyLCBtYXBfc2l6ZTsKKwkJbG9mZl90IHBvczsKKworCQl0ZXh0X2FkZHIgPSBOX1RYVEFERFIoZXgpOworCisjaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX19zcGFyY19fKQorCQlwb3MgPSBmZF9vZmZzZXQ7CisJCW1hcF9zaXplID0gZXguYV90ZXh0K2V4LmFfZGF0YSArIFBBR0VfU0laRSAtIDE7CisjZWxzZQorCQlwb3MgPSAzMjsKKwkJbWFwX3NpemUgPSBleC5hX3RleHQrZXguYV9kYXRhOworI2VuZGlmCisJCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJCWVycm9yID0gZG9fYnJrKHRleHRfYWRkciAmIFBBR0VfTUFTSywgbWFwX3NpemUpOworCQl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwkJaWYgKGVycm9yICE9ICh0ZXh0X2FkZHIgJiBQQUdFX01BU0spKSB7CisJCQlzZW5kX3NpZyhTSUdLSUxMLCBjdXJyZW50LCAwKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCisJCWVycm9yID0gYnBybS0+ZmlsZS0+Zl9vcC0+cmVhZChicHJtLT5maWxlLAorCQkJICAoY2hhciBfX3VzZXIgKil0ZXh0X2FkZHIsCisJCQkgIGV4LmFfdGV4dCtleC5hX2RhdGEsICZwb3MpOworCQlpZiAoKHNpZ25lZCBsb25nKWVycm9yIDwgMCkgeworCQkJc2VuZF9zaWcoU0lHS0lMTCwgY3VycmVudCwgMCk7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJCSAKKwkJZmx1c2hfaWNhY2hlX3JhbmdlKHRleHRfYWRkciwgdGV4dF9hZGRyK2V4LmFfdGV4dCtleC5hX2RhdGEpOworCX0gZWxzZSB7CisJCXN0YXRpYyB1bnNpZ25lZCBsb25nIGVycm9yX3RpbWUsIGVycm9yX3RpbWUyOworCQlpZiAoKGV4LmFfdGV4dCAmIDB4ZmZmIHx8IGV4LmFfZGF0YSAmIDB4ZmZmKSAmJgorCQkgICAgKE5fTUFHSUMoZXgpICE9IE5NQUdJQykgJiYgKGppZmZpZXMtZXJyb3JfdGltZTIpID4gNSpIWikKKwkJeworCQkJcHJpbnRrKEtFUk5fTk9USUNFICJleGVjdXRhYmxlIG5vdCBwYWdlIGFsaWduZWRcbiIpOworCQkJZXJyb3JfdGltZTIgPSBqaWZmaWVzOworCQl9CisKKwkJaWYgKChmZF9vZmZzZXQgJiB+UEFHRV9NQVNLKSAhPSAwICYmCisJCSAgICAoamlmZmllcy1lcnJvcl90aW1lKSA+IDUqSFopCisJCXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgCisJCQkgICAgICAgImZkX29mZnNldCBpcyBub3QgcGFnZSBhbGlnbmVkLiBQbGVhc2UgY29udmVydCBwcm9ncmFtOiAlc1xuIiwKKwkJCSAgICAgICBicHJtLT5maWxlLT5mX2RlbnRyeS0+ZF9uYW1lLm5hbWUpOworCQkJZXJyb3JfdGltZSA9IGppZmZpZXM7CisJCX0KKworCQlpZiAoIWJwcm0tPmZpbGUtPmZfb3AtPm1tYXB8fCgoZmRfb2Zmc2V0ICYgflBBR0VfTUFTSykgIT0gMCkpIHsKKwkJCWxvZmZfdCBwb3MgPSBmZF9vZmZzZXQ7CisJCQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCQkJZG9fYnJrKE5fVFhUQUREUihleCksIGV4LmFfdGV4dCtleC5hX2RhdGEpOworCQkJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJCQlicHJtLT5maWxlLT5mX29wLT5yZWFkKGJwcm0tPmZpbGUsCisJCQkJCShjaGFyIF9fdXNlciAqKU5fVFhUQUREUihleCksCisJCQkJCWV4LmFfdGV4dCtleC5hX2RhdGEsICZwb3MpOworCQkJZmx1c2hfaWNhY2hlX3JhbmdlKCh1bnNpZ25lZCBsb25nKSBOX1RYVEFERFIoZXgpLAorCQkJCQkgICAodW5zaWduZWQgbG9uZykgTl9UWFRBRERSKGV4KSArCisJCQkJCSAgIGV4LmFfdGV4dCtleC5hX2RhdGEpOworCQkJZ290byBiZXlvbmRfaWY7CisJCX0KKworCQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCQllcnJvciA9IGRvX21tYXAoYnBybS0+ZmlsZSwgTl9UWFRBRERSKGV4KSwgZXguYV90ZXh0LAorCQkJUFJPVF9SRUFEIHwgUFJPVF9FWEVDLAorCQkJTUFQX0ZJWEVEIHwgTUFQX1BSSVZBVEUgfCBNQVBfREVOWVdSSVRFIHwgTUFQX0VYRUNVVEFCTEUsCisJCQlmZF9vZmZzZXQpOworCQl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKworCQlpZiAoZXJyb3IgIT0gTl9UWFRBRERSKGV4KSkgeworCQkJc2VuZF9zaWcoU0lHS0lMTCwgY3VycmVudCwgMCk7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKworCQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworIAkJZXJyb3IgPSBkb19tbWFwKGJwcm0tPmZpbGUsIE5fREFUQUREUihleCksIGV4LmFfZGF0YSwKKwkJCQlQUk9UX1JFQUQgfCBQUk9UX1dSSVRFIHwgUFJPVF9FWEVDLAorCQkJCU1BUF9GSVhFRCB8IE1BUF9QUklWQVRFIHwgTUFQX0RFTllXUklURSB8IE1BUF9FWEVDVVRBQkxFLAorCQkJCWZkX29mZnNldCArIGV4LmFfdGV4dCk7CisJCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCQlpZiAoZXJyb3IgIT0gTl9EQVRBRERSKGV4KSkgeworCQkJc2VuZF9zaWcoU0lHS0lMTCwgY3VycmVudCwgMCk7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwl9CitiZXlvbmRfaWY6CisJc2V0X2JpbmZtdCgmYW91dF9mb3JtYXQpOworCisJcmV0dmFsID0gc2V0X2JyayhjdXJyZW50LT5tbS0+c3RhcnRfYnJrLCBjdXJyZW50LT5tbS0+YnJrKTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQlzZW5kX3NpZyhTSUdLSUxMLCBjdXJyZW50LCAwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlyZXR2YWwgPSBzZXR1cF9hcmdfcGFnZXMoYnBybSwgU1RBQ0tfVE9QLCBFWFNUQUNLX0RFRkFVTFQpOworCWlmIChyZXR2YWwgPCAwKSB7IAorCQkvKiBTb21lb25lIGNoZWNrLW1lOiBpcyB0aGlzIGVycm9yIHBhdGggZW5vdWdoPyAqLyAKKwkJc2VuZF9zaWcoU0lHS0lMTCwgY3VycmVudCwgMCk7IAorCQlyZXR1cm4gcmV0dmFsOworCX0KKworCWN1cnJlbnQtPm1tLT5zdGFydF9zdGFjayA9CisJCSh1bnNpZ25lZCBsb25nKSBjcmVhdGVfYW91dF90YWJsZXMoKGNoYXIgX191c2VyICopIGJwcm0tPnAsIGJwcm0pOworI2lmZGVmIF9fYWxwaGFfXworCXJlZ3MtPmdwID0gZXguYV9ncHZhbHVlOworI2VuZGlmCisJc3RhcnRfdGhyZWFkKHJlZ3MsIGV4LmFfZW50cnksIGN1cnJlbnQtPm1tLT5zdGFydF9zdGFjayk7CisJaWYgKHVubGlrZWx5KGN1cnJlbnQtPnB0cmFjZSAmIFBUX1BUUkFDRUQpKSB7CisJCWlmIChjdXJyZW50LT5wdHJhY2UgJiBQVF9UUkFDRV9FWEVDKQorCQkJcHRyYWNlX25vdGlmeSAoKFBUUkFDRV9FVkVOVF9FWEVDIDw8IDgpIHwgU0lHVFJBUCk7CisJCWVsc2UKKwkJCXNlbmRfc2lnKFNJR1RSQVAsIGN1cnJlbnQsIDApOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsb2FkX2FvdXRfbGlicmFyeShzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKwl1bnNpZ25lZCBsb25nIGJzcywgc3RhcnRfYWRkciwgbGVuOworCXVuc2lnbmVkIGxvbmcgZXJyb3I7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgZXhlYyBleDsKKworCWlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisKKwlyZXR2YWwgPSAtRU5PRVhFQzsKKwllcnJvciA9IGtlcm5lbF9yZWFkKGZpbGUsIDAsIChjaGFyICopICZleCwgc2l6ZW9mKGV4KSk7CisJaWYgKGVycm9yICE9IHNpemVvZihleCkpCisJCWdvdG8gb3V0OworCisJLyogV2UgY29tZSBpbiBoZXJlIGZvciB0aGUgcmVndWxhciBhLm91dCBzdHlsZSBvZiBzaGFyZWQgbGlicmFyaWVzICovCisJaWYgKChOX01BR0lDKGV4KSAhPSBaTUFHSUMgJiYgTl9NQUdJQyhleCkgIT0gUU1BR0lDKSB8fCBOX1RSU0laRShleCkgfHwKKwkgICAgTl9EUlNJWkUoZXgpIHx8ICgoZXguYV9lbnRyeSAmIDB4ZmZmKSAmJiBOX01BR0lDKGV4KSA9PSBaTUFHSUMpIHx8CisJICAgIGlfc2l6ZV9yZWFkKGlub2RlKSA8IGV4LmFfdGV4dCtleC5hX2RhdGErTl9TWU1TSVpFKGV4KStOX1RYVE9GRihleCkpIHsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKE5fRkxBR1MoZXgpKQorCQlnb3RvIG91dDsKKworCS8qIEZvciAgUU1BR0lDLCB0aGUgc3RhcnRpbmcgYWRkcmVzcyBpcyAweDIwIGludG8gdGhlIHBhZ2UuICBXZSBtYXNrCisJICAgdGhpcyBvZmYgdG8gZ2V0IHRoZSBzdGFydGluZyBhZGRyZXNzIGZvciB0aGUgcGFnZSAqLworCisJc3RhcnRfYWRkciA9ICBleC5hX2VudHJ5ICYgMHhmZmZmZjAwMDsKKworCWlmICgoTl9UWFRPRkYoZXgpICYgflBBR0VfTUFTSykgIT0gMCkgeworCQlzdGF0aWMgdW5zaWduZWQgbG9uZyBlcnJvcl90aW1lOworCQlsb2ZmX3QgcG9zID0gTl9UWFRPRkYoZXgpOworCisJCWlmICgoamlmZmllcy1lcnJvcl90aW1lKSA+IDUqSFopCisJCXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgCisJCQkgICAgICAgIk5fVFhUT0ZGIGlzIG5vdCBwYWdlIGFsaWduZWQuIFBsZWFzZSBjb252ZXJ0IGxpYnJhcnk6ICVzXG4iLAorCQkJICAgICAgIGZpbGUtPmZfZGVudHJ5LT5kX25hbWUubmFtZSk7CisJCQllcnJvcl90aW1lID0gamlmZmllczsKKwkJfQorCQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCQlkb19icmsoc3RhcnRfYWRkciwgZXguYV90ZXh0ICsgZXguYV9kYXRhICsgZXguYV9ic3MpOworCQl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwkJCisJCWZpbGUtPmZfb3AtPnJlYWQoZmlsZSwgKGNoYXIgX191c2VyICopc3RhcnRfYWRkciwKKwkJCWV4LmFfdGV4dCArIGV4LmFfZGF0YSwgJnBvcyk7CisJCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWduZWQgbG9uZykgc3RhcnRfYWRkciwKKwkJCQkgICAodW5zaWduZWQgbG9uZykgc3RhcnRfYWRkciArIGV4LmFfdGV4dCArIGV4LmFfZGF0YSk7CisKKwkJcmV0dmFsID0gMDsKKwkJZ290byBvdXQ7CisJfQorCS8qIE5vdyB1c2UgbW1hcCB0byBtYXAgdGhlIGxpYnJhcnkgaW50byBtZW1vcnkuICovCisJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwllcnJvciA9IGRvX21tYXAoZmlsZSwgc3RhcnRfYWRkciwgZXguYV90ZXh0ICsgZXguYV9kYXRhLAorCQkJUFJPVF9SRUFEIHwgUFJPVF9XUklURSB8IFBST1RfRVhFQywKKwkJCU1BUF9GSVhFRCB8IE1BUF9QUklWQVRFIHwgTUFQX0RFTllXUklURSwKKwkJCU5fVFhUT0ZGKGV4KSk7CisJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJcmV0dmFsID0gZXJyb3I7CisJaWYgKGVycm9yICE9IHN0YXJ0X2FkZHIpCisJCWdvdG8gb3V0OworCisJbGVuID0gUEFHRV9BTElHTihleC5hX3RleHQgKyBleC5hX2RhdGEpOworCWJzcyA9IGV4LmFfdGV4dCArIGV4LmFfZGF0YSArIGV4LmFfYnNzOworCWlmIChic3MgPiBsZW4pIHsKKwkJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwkJZXJyb3IgPSBkb19icmsoc3RhcnRfYWRkciArIGxlbiwgYnNzIC0gbGVuKTsKKwkJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJCXJldHZhbCA9IGVycm9yOworCQlpZiAoZXJyb3IgIT0gc3RhcnRfYWRkciArIGxlbikKKwkJCWdvdG8gb3V0OworCX0KKwlyZXR2YWwgPSAwOworb3V0OgorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfYW91dF9iaW5mbXQodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfYmluZm10KCZhb3V0X2Zvcm1hdCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2FvdXRfYmluZm10KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9iaW5mbXQoJmFvdXRfZm9ybWF0KTsKK30KKworY29yZV9pbml0Y2FsbChpbml0X2FvdXRfYmluZm10KTsKK21vZHVsZV9leGl0KGV4aXRfYW91dF9iaW5mbXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvYmluZm10X2VsZi5jIGIvZnMvYmluZm10X2VsZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZWM5ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9iaW5mbXRfZWxmLmMKQEAgLTAsMCArMSwxNjc3IEBACisvKgorICogbGludXgvZnMvYmluZm10X2VsZi5jCisgKgorICogVGhlc2UgYXJlIHRoZSBmdW5jdGlvbnMgdXNlZCB0byBsb2FkIEVMRiBmb3JtYXQgZXhlY3V0YWJsZXMgYXMgdXNlZAorICogb24gU1ZyNCBtYWNoaW5lcy4gIEluZm9ybWF0aW9uIG9uIHRoZSBmb3JtYXQgbWF5IGJlIGZvdW5kIGluIHRoZSBib29rCisgKiAiVU5JWCBTWVNURU0gViBSRUxFQVNFIDQgUHJvZ3JhbW1lcnMgR3VpZGU6IEFuc2kgQyBhbmQgUHJvZ3JhbW1pbmcgU3VwcG9ydAorICogVG9vbHMiLgorICoKKyAqIENvcHlyaWdodCAxOTkzLCAxOTk0OiBFcmljIFlvdW5nZGFsZSAoZXJpY3lAY2Fpcy5jb20pLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CisjaW5jbHVkZSA8bGludXgvYS5vdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpbmZtdHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc2htLmg+CisjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9lbGZjb3JlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2h1aWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wYXJhbS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9lbGYuaD4KKworc3RhdGljIGludCBsb2FkX2VsZl9iaW5hcnkoc3RydWN0IGxpbnV4X2JpbnBybSAqIGJwcm0sIHN0cnVjdCBwdF9yZWdzICogcmVncyk7CitzdGF0aWMgaW50IGxvYWRfZWxmX2xpYnJhcnkoc3RydWN0IGZpbGUqKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGVsZl9tYXAgKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGxvbmcsIHN0cnVjdCBlbGZfcGhkciAqLCBpbnQsIGludCk7CitleHRlcm4gaW50IGR1bXBfZnB1IChzdHJ1Y3QgcHRfcmVncyAqLCBlbGZfZnByZWdzZXRfdCAqKTsKKworI2lmbmRlZiBlbGZfYWRkcl90CisjZGVmaW5lIGVsZl9hZGRyX3QgdW5zaWduZWQgbG9uZworI2VuZGlmCisKKy8qCisgKiBJZiB3ZSBkb24ndCBzdXBwb3J0IGNvcmUgZHVtcGluZywgdGhlbiBzdXBwbHkgYSBOVUxMIHNvIHdlCisgKiBkb24ndCBldmVuIHRyeS4KKyAqLworI2lmZGVmIFVTRV9FTEZfQ09SRV9EVU1QCitzdGF0aWMgaW50IGVsZl9jb3JlX2R1bXAobG9uZyBzaWduciwgc3RydWN0IHB0X3JlZ3MgKiByZWdzLCBzdHJ1Y3QgZmlsZSAqIGZpbGUpOworI2Vsc2UKKyNkZWZpbmUgZWxmX2NvcmVfZHVtcAlOVUxMCisjZW5kaWYKKworI2lmIEVMRl9FWEVDX1BBR0VTSVpFID4gUEFHRV9TSVpFCisjIGRlZmluZSBFTEZfTUlOX0FMSUdOCUVMRl9FWEVDX1BBR0VTSVpFCisjZWxzZQorIyBkZWZpbmUgRUxGX01JTl9BTElHTglQQUdFX1NJWkUKKyNlbmRpZgorCisjaWZuZGVmIEVMRl9DT1JFX0VGTEFHUworI2RlZmluZSBFTEZfQ09SRV9FRkxBR1MJMAorI2VuZGlmCisKKyNkZWZpbmUgRUxGX1BBR0VTVEFSVChfdikgKChfdikgJiB+KHVuc2lnbmVkIGxvbmcpKEVMRl9NSU5fQUxJR04tMSkpCisjZGVmaW5lIEVMRl9QQUdFT0ZGU0VUKF92KSAoKF92KSAmIChFTEZfTUlOX0FMSUdOLTEpKQorI2RlZmluZSBFTEZfUEFHRUFMSUdOKF92KSAoKChfdikgKyBFTEZfTUlOX0FMSUdOIC0gMSkgJiB+KEVMRl9NSU5fQUxJR04gLSAxKSkKKworc3RhdGljIHN0cnVjdCBsaW51eF9iaW5mbXQgZWxmX2Zvcm1hdCA9IHsKKwkJLm1vZHVsZQkJPSBUSElTX01PRFVMRSwKKwkJLmxvYWRfYmluYXJ5CT0gbG9hZF9lbGZfYmluYXJ5LAorCQkubG9hZF9zaGxpYgk9IGxvYWRfZWxmX2xpYnJhcnksCisJCS5jb3JlX2R1bXAJPSBlbGZfY29yZV9kdW1wLAorCQkubWluX2NvcmVkdW1wCT0gRUxGX0VYRUNfUEFHRVNJWkUKK307CisKKyNkZWZpbmUgQkFEX0FERFIoeCkJKCh1bnNpZ25lZCBsb25nKSh4KSA+IFRBU0tfU0laRSkKKworc3RhdGljIGludCBzZXRfYnJrKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXN0YXJ0ID0gRUxGX1BBR0VBTElHTihzdGFydCk7CisJZW5kID0gRUxGX1BBR0VBTElHTihlbmQpOworCWlmIChlbmQgPiBzdGFydCkgeworCQl1bnNpZ25lZCBsb25nIGFkZHI7CisJCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJCWFkZHIgPSBkb19icmsoc3RhcnQsIGVuZCAtIHN0YXJ0KTsKKwkJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJCWlmIChCQURfQUREUihhZGRyKSkKKwkJCXJldHVybiBhZGRyOworCX0KKwljdXJyZW50LT5tbS0+c3RhcnRfYnJrID0gY3VycmVudC0+bW0tPmJyayA9IGVuZDsKKwlyZXR1cm4gMDsKK30KKworCisvKiBXZSBuZWVkIHRvIGV4cGxpY2l0bHkgemVybyBhbnkgZnJhY3Rpb25hbCBwYWdlcworICAgYWZ0ZXIgdGhlIGRhdGEgc2VjdGlvbiAoaS5lLiBic3MpLiAgVGhpcyB3b3VsZAorICAgY29udGFpbiB0aGUganVuayBmcm9tIHRoZSBmaWxlIHRoYXQgc2hvdWxkIG5vdAorICAgYmUgaW4gbWVtb3J5ICovCisKKworc3RhdGljIGludCBwYWR6ZXJvKHVuc2lnbmVkIGxvbmcgZWxmX2JzcykKK3sKKwl1bnNpZ25lZCBsb25nIG5ieXRlOworCisJbmJ5dGUgPSBFTEZfUEFHRU9GRlNFVChlbGZfYnNzKTsKKwlpZiAobmJ5dGUpIHsKKwkJbmJ5dGUgPSBFTEZfTUlOX0FMSUdOIC0gbmJ5dGU7CisJCWlmIChjbGVhcl91c2VyKCh2b2lkIF9fdXNlciAqKSBlbGZfYnNzLCBuYnl0ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIExldCdzIHVzZSBzb21lIG1hY3JvcyB0byBtYWtlIHRoaXMgc3RhY2sgbWFuaXB1bGF0aW9uIGEgbGl0bGUgY2xlYXJlciAqLworI2lmZGVmIENPTkZJR19TVEFDS19HUk9XU1VQCisjZGVmaW5lIFNUQUNLX0FERChzcCwgaXRlbXMpICgoZWxmX2FkZHJfdCBfX3VzZXIgKikoc3ApICsgKGl0ZW1zKSkKKyNkZWZpbmUgU1RBQ0tfUk9VTkQoc3AsIGl0ZW1zKSBcCisJKCgxNSArICh1bnNpZ25lZCBsb25nKSAoKHNwKSArIChpdGVtcykpKSAmfiAxNVVMKQorI2RlZmluZSBTVEFDS19BTExPQyhzcCwgbGVuKSAoeyBlbGZfYWRkcl90IF9fdXNlciAqb2xkX3NwID0gKGVsZl9hZGRyX3QgX191c2VyICopc3A7IHNwICs9IGxlbjsgb2xkX3NwOyB9KQorI2Vsc2UKKyNkZWZpbmUgU1RBQ0tfQUREKHNwLCBpdGVtcykgKChlbGZfYWRkcl90IF9fdXNlciAqKShzcCkgLSAoaXRlbXMpKQorI2RlZmluZSBTVEFDS19ST1VORChzcCwgaXRlbXMpIFwKKwkoKCh1bnNpZ25lZCBsb25nKSAoc3AgLSBpdGVtcykpICZ+IDE1VUwpCisjZGVmaW5lIFNUQUNLX0FMTE9DKHNwLCBsZW4pICh7IHNwIC09IGxlbiA7IHNwOyB9KQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK2NyZWF0ZV9lbGZfdGFibGVzKHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0sIHN0cnVjdCBlbGZoZHIgKiBleGVjLAorCQlpbnQgaW50ZXJwX2FvdXQsIHVuc2lnbmVkIGxvbmcgbG9hZF9hZGRyLAorCQl1bnNpZ25lZCBsb25nIGludGVycF9sb2FkX2FkZHIpCit7CisJdW5zaWduZWQgbG9uZyBwID0gYnBybS0+cDsKKwlpbnQgYXJnYyA9IGJwcm0tPmFyZ2M7CisJaW50IGVudmMgPSBicHJtLT5lbnZjOworCWVsZl9hZGRyX3QgX191c2VyICphcmd2OworCWVsZl9hZGRyX3QgX191c2VyICplbnZwOworCWVsZl9hZGRyX3QgX191c2VyICpzcDsKKwllbGZfYWRkcl90IF9fdXNlciAqdV9wbGF0Zm9ybTsKKwljb25zdCBjaGFyICprX3BsYXRmb3JtID0gRUxGX1BMQVRGT1JNOworCWludCBpdGVtczsKKwllbGZfYWRkcl90ICplbGZfaW5mbzsKKwlpbnQgZWlfaW5kZXggPSAwOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKworCS8qCisJICogSWYgdGhpcyBhcmNoaXRlY3R1cmUgaGFzIGEgcGxhdGZvcm0gY2FwYWJpbGl0eSBzdHJpbmcsIGNvcHkgaXQKKwkgKiB0byB1c2Vyc3BhY2UuICBJbiBzb21lIGNhc2VzIChTcGFyYyksIHRoaXMgaW5mbyBpcyBpbXBvc3NpYmxlCisJICogZm9yIHVzZXJzcGFjZSB0byBnZXQgYW55IG90aGVyIHdheSwgaW4gb3RoZXJzIChpMzg2KSBpdCBpcworCSAqIG1lcmVseSBkaWZmaWN1bHQuCisJICovCisKKwl1X3BsYXRmb3JtID0gTlVMTDsKKwlpZiAoa19wbGF0Zm9ybSkgeworCQlzaXplX3QgbGVuID0gc3RybGVuKGtfcGxhdGZvcm0pICsgMTsKKworCQkvKgorCQkgKiBJbiBzb21lIGNhc2VzIChlLmcuIEh5cGVyLVRocmVhZGluZyksIHdlIHdhbnQgdG8gYXZvaWQgTDEKKwkJICogZXZpY3Rpb25zIGJ5IHRoZSBwcm9jZXNzZXMgcnVubmluZyBvbiB0aGUgc2FtZSBwYWNrYWdlLiBPbmUKKwkJICogdGhpbmcgd2UgY2FuIGRvIGlzIHRvIHNodWZmbGUgdGhlIGluaXRpYWwgc3RhY2sgZm9yIHRoZW0uCisJCSAqLworCSAKKwkJcCA9IGFyY2hfYWxpZ25fc3RhY2socCk7CisKKwkJdV9wbGF0Zm9ybSA9IChlbGZfYWRkcl90IF9fdXNlciAqKVNUQUNLX0FMTE9DKHAsIGxlbik7CisJCWlmIChfX2NvcHlfdG9fdXNlcih1X3BsYXRmb3JtLCBrX3BsYXRmb3JtLCBsZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJLyogQ3JlYXRlIHRoZSBFTEYgaW50ZXJwcmV0ZXIgaW5mbyAqLworCWVsZl9pbmZvID0gKGVsZl9hZGRyX3QgKikgY3VycmVudC0+bW0tPnNhdmVkX2F1eHY7CisjZGVmaW5lIE5FV19BVVhfRU5UKGlkLCB2YWwpIFwKKwlkbyB7IGVsZl9pbmZvW2VpX2luZGV4KytdID0gaWQ7IGVsZl9pbmZvW2VpX2luZGV4KytdID0gdmFsOyB9IHdoaWxlICgwKQorCisjaWZkZWYgQVJDSF9ETElORk8KKwkvKiAKKwkgKiBBUkNIX0RMSU5GTyBtdXN0IGNvbWUgZmlyc3Qgc28gUFBDIGNhbiBkbyBpdHMgc3BlY2lhbCBhbGlnbm1lbnQgb2YKKwkgKiBBVVhWLgorCSAqLworCUFSQ0hfRExJTkZPOworI2VuZGlmCisJTkVXX0FVWF9FTlQoQVRfSFdDQVAsIEVMRl9IV0NBUCk7CisJTkVXX0FVWF9FTlQoQVRfUEFHRVNaLCBFTEZfRVhFQ19QQUdFU0laRSk7CisJTkVXX0FVWF9FTlQoQVRfQ0xLVENLLCBDTE9DS1NfUEVSX1NFQyk7CisJTkVXX0FVWF9FTlQoQVRfUEhEUiwgbG9hZF9hZGRyICsgZXhlYy0+ZV9waG9mZik7CisJTkVXX0FVWF9FTlQoQVRfUEhFTlQsIHNpemVvZiAoc3RydWN0IGVsZl9waGRyKSk7CisJTkVXX0FVWF9FTlQoQVRfUEhOVU0sIGV4ZWMtPmVfcGhudW0pOworCU5FV19BVVhfRU5UKEFUX0JBU0UsIGludGVycF9sb2FkX2FkZHIpOworCU5FV19BVVhfRU5UKEFUX0ZMQUdTLCAwKTsKKwlORVdfQVVYX0VOVChBVF9FTlRSWSwgZXhlYy0+ZV9lbnRyeSk7CisJTkVXX0FVWF9FTlQoQVRfVUlELCAoZWxmX2FkZHJfdCkgdHNrLT51aWQpOworCU5FV19BVVhfRU5UKEFUX0VVSUQsIChlbGZfYWRkcl90KSB0c2stPmV1aWQpOworCU5FV19BVVhfRU5UKEFUX0dJRCwgKGVsZl9hZGRyX3QpIHRzay0+Z2lkKTsKKwlORVdfQVVYX0VOVChBVF9FR0lELCAoZWxmX2FkZHJfdCkgdHNrLT5lZ2lkKTsKKyAJTkVXX0FVWF9FTlQoQVRfU0VDVVJFLCAoZWxmX2FkZHJfdCkgc2VjdXJpdHlfYnBybV9zZWN1cmVleGVjKGJwcm0pKTsKKwlpZiAoa19wbGF0Zm9ybSkgeworCQlORVdfQVVYX0VOVChBVF9QTEFURk9STSwgKGVsZl9hZGRyX3QpKHVuc2lnbmVkIGxvbmcpdV9wbGF0Zm9ybSk7CisJfQorCWlmIChicHJtLT5pbnRlcnBfZmxhZ3MgJiBCSU5QUk1fRkxBR1NfRVhFQ0ZEKSB7CisJCU5FV19BVVhfRU5UKEFUX0VYRUNGRCwgKGVsZl9hZGRyX3QpIGJwcm0tPmludGVycF9kYXRhKTsKKwl9CisjdW5kZWYgTkVXX0FVWF9FTlQKKwkvKiBBVF9OVUxMIGlzIHplcm87IGNsZWFyIHRoZSByZXN0IHRvbyAqLworCW1lbXNldCgmZWxmX2luZm9bZWlfaW5kZXhdLCAwLAorCSAgICAgICBzaXplb2YgY3VycmVudC0+bW0tPnNhdmVkX2F1eHYgLSBlaV9pbmRleCAqIHNpemVvZiBlbGZfaW5mb1swXSk7CisKKwkvKiBBbmQgYWR2YW5jZSBwYXN0IHRoZSBBVF9OVUxMIGVudHJ5LiAgKi8KKwllaV9pbmRleCArPSAyOworCisJc3AgPSBTVEFDS19BREQocCwgZWlfaW5kZXgpOworCisJaXRlbXMgPSAoYXJnYyArIDEpICsgKGVudmMgKyAxKTsKKwlpZiAoaW50ZXJwX2FvdXQpIHsKKwkJaXRlbXMgKz0gMzsgLyogYS5vdXQgaW50ZXJwcmV0ZXJzIHJlcXVpcmUgYXJndiAmIGVudnAgdG9vICovCisJfSBlbHNlIHsKKwkJaXRlbXMgKz0gMTsgLyogRUxGIGludGVycHJldGVycyBvbmx5IHB1dCBhcmdjIG9uIHRoZSBzdGFjayAqLworCX0KKwlicHJtLT5wID0gU1RBQ0tfUk9VTkQoc3AsIGl0ZW1zKTsKKworCS8qIFBvaW50IHNwIGF0IHRoZSBsb3dlc3QgYWRkcmVzcyBvbiB0aGUgc3RhY2sgKi8KKyNpZmRlZiBDT05GSUdfU1RBQ0tfR1JPV1NVUAorCXNwID0gKGVsZl9hZGRyX3QgX191c2VyICopYnBybS0+cCAtIGl0ZW1zIC0gZWlfaW5kZXg7CisJYnBybS0+ZXhlYyA9ICh1bnNpZ25lZCBsb25nKSBzcDsgLyogWFhYOiBQQVJJU0MgSEFDSyAqLworI2Vsc2UKKwlzcCA9IChlbGZfYWRkcl90IF9fdXNlciAqKWJwcm0tPnA7CisjZW5kaWYKKworCS8qIE5vdywgbGV0J3MgcHV0IGFyZ2MgKGFuZCBhcmd2LCBlbnZwIGlmIGFwcHJvcHJpYXRlKSBvbiB0aGUgc3RhY2sgKi8KKwlpZiAoX19wdXRfdXNlcihhcmdjLCBzcCsrKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGludGVycF9hb3V0KSB7CisJCWFyZ3YgPSBzcCArIDI7CisJCWVudnAgPSBhcmd2ICsgYXJnYyArIDE7CisJCV9fcHV0X3VzZXIoKGVsZl9hZGRyX3QpKHVuc2lnbmVkIGxvbmcpYXJndiwgc3ArKyk7CisJCV9fcHV0X3VzZXIoKGVsZl9hZGRyX3QpKHVuc2lnbmVkIGxvbmcpZW52cCwgc3ArKyk7CisJfSBlbHNlIHsKKwkJYXJndiA9IHNwOworCQllbnZwID0gYXJndiArIGFyZ2MgKyAxOworCX0KKworCS8qIFBvcHVsYXRlIGFyZ3YgYW5kIGVudnAgKi8KKwlwID0gY3VycmVudC0+bW0tPmFyZ19zdGFydDsKKwl3aGlsZSAoYXJnYy0tID4gMCkgeworCQlzaXplX3QgbGVuOworCQlfX3B1dF91c2VyKChlbGZfYWRkcl90KXAsIGFyZ3YrKyk7CisJCWxlbiA9IHN0cm5sZW5fdXNlcigodm9pZCBfX3VzZXIgKilwLCBQQUdFX1NJWkUqTUFYX0FSR19QQUdFUyk7CisJCWlmICghbGVuIHx8IGxlbiA+IFBBR0VfU0laRSpNQVhfQVJHX1BBR0VTKQorCQkJcmV0dXJuIDA7CisJCXAgKz0gbGVuOworCX0KKwlpZiAoX19wdXRfdXNlcigwLCBhcmd2KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJY3VycmVudC0+bW0tPmFyZ19lbmQgPSBjdXJyZW50LT5tbS0+ZW52X3N0YXJ0ID0gcDsKKwl3aGlsZSAoZW52Yy0tID4gMCkgeworCQlzaXplX3QgbGVuOworCQlfX3B1dF91c2VyKChlbGZfYWRkcl90KXAsIGVudnArKyk7CisJCWxlbiA9IHN0cm5sZW5fdXNlcigodm9pZCBfX3VzZXIgKilwLCBQQUdFX1NJWkUqTUFYX0FSR19QQUdFUyk7CisJCWlmICghbGVuIHx8IGxlbiA+IFBBR0VfU0laRSpNQVhfQVJHX1BBR0VTKQorCQkJcmV0dXJuIDA7CisJCXAgKz0gbGVuOworCX0KKwlpZiAoX19wdXRfdXNlcigwLCBlbnZwKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJY3VycmVudC0+bW0tPmVudl9lbmQgPSBwOworCisJLyogUHV0IHRoZSBlbGZfaW5mbyBvbiB0aGUgc3RhY2sgaW4gdGhlIHJpZ2h0IHBsYWNlLiAgKi8KKwlzcCA9IChlbGZfYWRkcl90IF9fdXNlciAqKWVudnAgKyAxOworCWlmIChjb3B5X3RvX3VzZXIoc3AsIGVsZl9pbmZvLCBlaV9pbmRleCAqIHNpemVvZihlbGZfYWRkcl90KSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCisjaWZuZGVmIGVsZl9tYXAKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZWxmX21hcChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJCXN0cnVjdCBlbGZfcGhkciAqZXBwbnQsIGludCBwcm90LCBpbnQgdHlwZSkKK3sKKwl1bnNpZ25lZCBsb25nIG1hcF9hZGRyOworCisJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwltYXBfYWRkciA9IGRvX21tYXAoZmlsZXAsIEVMRl9QQUdFU1RBUlQoYWRkciksCisJCQkgICBlcHBudC0+cF9maWxlc3ogKyBFTEZfUEFHRU9GRlNFVChlcHBudC0+cF92YWRkciksIHByb3QsIHR5cGUsCisJCQkgICBlcHBudC0+cF9vZmZzZXQgLSBFTEZfUEFHRU9GRlNFVChlcHBudC0+cF92YWRkcikpOworCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCXJldHVybihtYXBfYWRkcik7Cit9CisKKyNlbmRpZiAvKiAhZWxmX21hcCAqLworCisvKiBUaGlzIGlzIG11Y2ggbW9yZSBnZW5lcmFsaXplZCB0aGFuIHRoZSBsaWJyYXJ5IHJvdXRpbmUgcmVhZCBmdW5jdGlvbiwKKyAgIHNvIHdlIGtlZXAgdGhpcyBzZXBhcmF0ZS4gIFRlY2huaWNhbGx5IHRoZSBsaWJyYXJ5IHJlYWQgZnVuY3Rpb24KKyAgIGlzIG9ubHkgcHJvdmlkZWQgc28gdGhhdCB3ZSBjYW4gcmVhZCBhLm91dCBsaWJyYXJpZXMgdGhhdCBoYXZlCisgICBhbiBFTEYgaGVhZGVyICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvYWRfZWxmX2ludGVycChzdHJ1Y3QgZWxmaGRyICogaW50ZXJwX2VsZl9leCwKKwkJCQkgICAgIHN0cnVjdCBmaWxlICogaW50ZXJwcmV0ZXIsCisJCQkJICAgICB1bnNpZ25lZCBsb25nICppbnRlcnBfbG9hZF9hZGRyKQoreworCXN0cnVjdCBlbGZfcGhkciAqZWxmX3BoZGF0YTsKKwlzdHJ1Y3QgZWxmX3BoZHIgKmVwcG50OworCXVuc2lnbmVkIGxvbmcgbG9hZF9hZGRyID0gMDsKKwlpbnQgbG9hZF9hZGRyX3NldCA9IDA7CisJdW5zaWduZWQgbG9uZyBsYXN0X2JzcyA9IDAsIGVsZl9ic3MgPSAwOworCXVuc2lnbmVkIGxvbmcgZXJyb3IgPSB+MFVMOworCWludCByZXR2YWwsIGksIHNpemU7CisKKwkvKiBGaXJzdCBvZiBhbGwsIHNvbWUgc2ltcGxlIGNvbnNpc3RlbmN5IGNoZWNrcyAqLworCWlmIChpbnRlcnBfZWxmX2V4LT5lX3R5cGUgIT0gRVRfRVhFQyAmJgorCSAgICBpbnRlcnBfZWxmX2V4LT5lX3R5cGUgIT0gRVRfRFlOKQorCQlnb3RvIG91dDsKKwlpZiAoIWVsZl9jaGVja19hcmNoKGludGVycF9lbGZfZXgpKQorCQlnb3RvIG91dDsKKwlpZiAoIWludGVycHJldGVyLT5mX29wIHx8ICFpbnRlcnByZXRlci0+Zl9vcC0+bW1hcCkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIElmIHRoZSBzaXplIG9mIHRoaXMgc3RydWN0dXJlIGhhcyBjaGFuZ2VkLCB0aGVuIHB1bnQsIHNpbmNlCisJICogd2Ugd2lsbCBiZSBkb2luZyB0aGUgd3JvbmcgdGhpbmcuCisJICovCisJaWYgKGludGVycF9lbGZfZXgtPmVfcGhlbnRzaXplICE9IHNpemVvZihzdHJ1Y3QgZWxmX3BoZHIpKQorCQlnb3RvIG91dDsKKwlpZiAoaW50ZXJwX2VsZl9leC0+ZV9waG51bSA8IDEgfHwKKwkJaW50ZXJwX2VsZl9leC0+ZV9waG51bSA+IDY1NTM2VSAvIHNpemVvZihzdHJ1Y3QgZWxmX3BoZHIpKQorCQlnb3RvIG91dDsKKworCS8qIE5vdyByZWFkIGluIGFsbCBvZiB0aGUgaGVhZGVyIGluZm9ybWF0aW9uICovCisKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBlbGZfcGhkcikgKiBpbnRlcnBfZWxmX2V4LT5lX3BobnVtOworCWlmIChzaXplID4gRUxGX01JTl9BTElHTikKKwkJZ290byBvdXQ7CisJZWxmX3BoZGF0YSA9IChzdHJ1Y3QgZWxmX3BoZHIgKikga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVsZl9waGRhdGEpCisJCWdvdG8gb3V0OworCisJcmV0dmFsID0ga2VybmVsX3JlYWQoaW50ZXJwcmV0ZXIsaW50ZXJwX2VsZl9leC0+ZV9waG9mZiwoY2hhciAqKWVsZl9waGRhdGEsc2l6ZSk7CisJZXJyb3IgPSAtRUlPOworCWlmIChyZXR2YWwgIT0gc2l6ZSkgeworCQlpZiAocmV0dmFsIDwgMCkKKwkJCWVycm9yID0gcmV0dmFsOwkKKwkJZ290byBvdXRfY2xvc2U7CisJfQorCisJZXBwbnQgPSBlbGZfcGhkYXRhOworCWZvciAoaT0wOyBpPGludGVycF9lbGZfZXgtPmVfcGhudW07IGkrKywgZXBwbnQrKykgeworCSAgaWYgKGVwcG50LT5wX3R5cGUgPT0gUFRfTE9BRCkgeworCSAgICBpbnQgZWxmX3R5cGUgPSBNQVBfUFJJVkFURSB8IE1BUF9ERU5ZV1JJVEU7CisJICAgIGludCBlbGZfcHJvdCA9IDA7CisJICAgIHVuc2lnbmVkIGxvbmcgdmFkZHIgPSAwOworCSAgICB1bnNpZ25lZCBsb25nIGssIG1hcF9hZGRyOworCisJICAgIGlmIChlcHBudC0+cF9mbGFncyAmIFBGX1IpIGVsZl9wcm90ID0gIFBST1RfUkVBRDsKKwkgICAgaWYgKGVwcG50LT5wX2ZsYWdzICYgUEZfVykgZWxmX3Byb3QgfD0gUFJPVF9XUklURTsKKwkgICAgaWYgKGVwcG50LT5wX2ZsYWdzICYgUEZfWCkgZWxmX3Byb3QgfD0gUFJPVF9FWEVDOworCSAgICB2YWRkciA9IGVwcG50LT5wX3ZhZGRyOworCSAgICBpZiAoaW50ZXJwX2VsZl9leC0+ZV90eXBlID09IEVUX0VYRUMgfHwgbG9hZF9hZGRyX3NldCkKKwkgICAgCWVsZl90eXBlIHw9IE1BUF9GSVhFRDsKKworCSAgICBtYXBfYWRkciA9IGVsZl9tYXAoaW50ZXJwcmV0ZXIsIGxvYWRfYWRkciArIHZhZGRyLCBlcHBudCwgZWxmX3Byb3QsIGVsZl90eXBlKTsKKwkgICAgZXJyb3IgPSBtYXBfYWRkcjsKKwkgICAgaWYgKEJBRF9BRERSKG1hcF9hZGRyKSkKKwkgICAgCWdvdG8gb3V0X2Nsb3NlOworCisJICAgIGlmICghbG9hZF9hZGRyX3NldCAmJiBpbnRlcnBfZWxmX2V4LT5lX3R5cGUgPT0gRVRfRFlOKSB7CisJCWxvYWRfYWRkciA9IG1hcF9hZGRyIC0gRUxGX1BBR0VTVEFSVCh2YWRkcik7CisJCWxvYWRfYWRkcl9zZXQgPSAxOworCSAgICB9CisKKwkgICAgLyoKKwkgICAgICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBzZWN0aW9uJ3Mgc2l6ZSB3aWxsIG92ZXJmbG93IHRoZQorCSAgICAgKiBhbGxvd2VkIHRhc2sgc2l6ZS4gTm90ZSB0aGF0IHBfZmlsZXN6IG11c3QgYWx3YXlzIGJlCisJICAgICAqIDw9IHBfbWVtc2l6ZSBzbyBpdCBpcyBvbmx5IG5lY2Vzc2FyeSB0byBjaGVjayBwX21lbXN6LgorCSAgICAgKi8KKwkgICAgayA9IGxvYWRfYWRkciArIGVwcG50LT5wX3ZhZGRyOworCSAgICBpZiAoayA+IFRBU0tfU0laRSB8fCBlcHBudC0+cF9maWxlc3ogPiBlcHBudC0+cF9tZW1zeiB8fAorCQllcHBudC0+cF9tZW1zeiA+IFRBU0tfU0laRSB8fCBUQVNLX1NJWkUgLSBlcHBudC0+cF9tZW1zeiA8IGspIHsKKwkgICAgICAgIGVycm9yID0gLUVOT01FTTsKKwkJZ290byBvdXRfY2xvc2U7CisJICAgIH0KKworCSAgICAvKgorCSAgICAgKiBGaW5kIHRoZSBlbmQgb2YgdGhlIGZpbGUgbWFwcGluZyBmb3IgdGhpcyBwaGRyLCBhbmQga2VlcAorCSAgICAgKiB0cmFjayBvZiB0aGUgbGFyZ2VzdCBhZGRyZXNzIHdlIHNlZSBmb3IgdGhpcy4KKwkgICAgICovCisJICAgIGsgPSBsb2FkX2FkZHIgKyBlcHBudC0+cF92YWRkciArIGVwcG50LT5wX2ZpbGVzejsKKwkgICAgaWYgKGsgPiBlbGZfYnNzKQorCQllbGZfYnNzID0gazsKKworCSAgICAvKgorCSAgICAgKiBEbyB0aGUgc2FtZSB0aGluZyBmb3IgdGhlIG1lbW9yeSBtYXBwaW5nIC0gYmV0d2VlbgorCSAgICAgKiBlbGZfYnNzIGFuZCBsYXN0X2JzcyBpcyB0aGUgYnNzIHNlY3Rpb24uCisJICAgICAqLworCSAgICBrID0gbG9hZF9hZGRyICsgZXBwbnQtPnBfbWVtc3ogKyBlcHBudC0+cF92YWRkcjsKKwkgICAgaWYgKGsgPiBsYXN0X2JzcykKKwkJbGFzdF9ic3MgPSBrOworCSAgfQorCX0KKworCS8qCisJICogTm93IGZpbGwgb3V0IHRoZSBic3Mgc2VjdGlvbi4gIEZpcnN0IHBhZCB0aGUgbGFzdCBwYWdlIHVwCisJICogdG8gdGhlIHBhZ2UgYm91bmRhcnksIGFuZCB0aGVuIHBlcmZvcm0gYSBtbWFwIHRvIG1ha2Ugc3VyZQorCSAqIHRoYXQgdGhlcmUgYXJlIHplcm8tbWFwcGVkIHBhZ2VzIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIAorCSAqIGxhc3QgYnNzIHBhZ2UuCisJICovCisJaWYgKHBhZHplcm8oZWxmX2JzcykpIHsKKwkJZXJyb3IgPSAtRUZBVUxUOworCQlnb3RvIG91dF9jbG9zZTsKKwl9CisKKwllbGZfYnNzID0gRUxGX1BBR0VTVEFSVChlbGZfYnNzICsgRUxGX01JTl9BTElHTiAtIDEpOwkvKiBXaGF0IHdlIGhhdmUgbWFwcGVkIHNvIGZhciAqLworCisJLyogTWFwIHRoZSBsYXN0IG9mIHRoZSBic3Mgc2VnbWVudCAqLworCWlmIChsYXN0X2JzcyA+IGVsZl9ic3MpIHsKKwkJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwkJZXJyb3IgPSBkb19icmsoZWxmX2JzcywgbGFzdF9ic3MgLSBlbGZfYnNzKTsKKwkJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJCWlmIChCQURfQUREUihlcnJvcikpCisJCQlnb3RvIG91dF9jbG9zZTsKKwl9CisKKwkqaW50ZXJwX2xvYWRfYWRkciA9IGxvYWRfYWRkcjsKKwllcnJvciA9ICgodW5zaWduZWQgbG9uZykgaW50ZXJwX2VsZl9leC0+ZV9lbnRyeSkgKyBsb2FkX2FkZHI7CisKK291dF9jbG9zZToKKwlrZnJlZShlbGZfcGhkYXRhKTsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvYWRfYW91dF9pbnRlcnAoc3RydWN0IGV4ZWMgKiBpbnRlcnBfZXgsCisJCQkgICAgIHN0cnVjdCBmaWxlICogaW50ZXJwcmV0ZXIpCit7CisJdW5zaWduZWQgbG9uZyB0ZXh0X2RhdGEsIGVsZl9lbnRyeSA9IH4wVUw7CisJY2hhciBfX3VzZXIgKiBhZGRyOworCWxvZmZfdCBvZmZzZXQ7CisKKwljdXJyZW50LT5tbS0+ZW5kX2NvZGUgPSBpbnRlcnBfZXgtPmFfdGV4dDsKKwl0ZXh0X2RhdGEgPSBpbnRlcnBfZXgtPmFfdGV4dCArIGludGVycF9leC0+YV9kYXRhOworCWN1cnJlbnQtPm1tLT5lbmRfZGF0YSA9IHRleHRfZGF0YTsKKwljdXJyZW50LT5tbS0+YnJrID0gaW50ZXJwX2V4LT5hX2JzcyArIHRleHRfZGF0YTsKKworCXN3aXRjaCAoTl9NQUdJQygqaW50ZXJwX2V4KSkgeworCWNhc2UgT01BR0lDOgorCQlvZmZzZXQgPSAzMjsKKwkJYWRkciA9IChjaGFyIF9fdXNlciAqKTA7CisJCWJyZWFrOworCWNhc2UgWk1BR0lDOgorCWNhc2UgUU1BR0lDOgorCQlvZmZzZXQgPSBOX1RYVE9GRigqaW50ZXJwX2V4KTsKKwkJYWRkciA9IChjaGFyIF9fdXNlciAqKSBOX1RYVEFERFIoKmludGVycF9leCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWdvdG8gb3V0OworCX0KKworCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CQorCWRvX2JyaygwLCB0ZXh0X2RhdGEpOworCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCWlmICghaW50ZXJwcmV0ZXItPmZfb3AgfHwgIWludGVycHJldGVyLT5mX29wLT5yZWFkKQorCQlnb3RvIG91dDsKKwlpZiAoaW50ZXJwcmV0ZXItPmZfb3AtPnJlYWQoaW50ZXJwcmV0ZXIsIGFkZHIsIHRleHRfZGF0YSwgJm9mZnNldCkgPCAwKQorCQlnb3RvIG91dDsKKwlmbHVzaF9pY2FjaGVfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpYWRkciwKKwkgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpYWRkciArIHRleHRfZGF0YSk7CisKKworCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CQorCWRvX2JyayhFTEZfUEFHRVNUQVJUKHRleHRfZGF0YSArIEVMRl9NSU5fQUxJR04gLSAxKSwKKwkJaW50ZXJwX2V4LT5hX2Jzcyk7CisJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJZWxmX2VudHJ5ID0gaW50ZXJwX2V4LT5hX2VudHJ5OworCitvdXQ6CisJcmV0dXJuIGVsZl9lbnRyeTsKK30KKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgZnVuY3Rpb25zIHVzZWQgdG8gbG9hZCBFTEYgc3R5bGUgZXhlY3V0YWJsZXMgYW5kIHNoYXJlZAorICogbGlicmFyaWVzLiAgVGhlcmUgaXMgbm8gYmluYXJ5IGRlcGVuZGVudCBjb2RlIGFueXdoZXJlIGVsc2UuCisgKi8KKworI2RlZmluZSBJTlRFUlBSRVRFUl9OT05FIDAKKyNkZWZpbmUgSU5URVJQUkVURVJfQU9VVCAxCisjZGVmaW5lIElOVEVSUFJFVEVSX0VMRiAyCisKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcmFuZG9taXplX3N0YWNrX3RvcCh1bnNpZ25lZCBsb25nIHN0YWNrX3RvcCkKK3sKKwl1bnNpZ25lZCBpbnQgcmFuZG9tX3ZhcmlhYmxlID0gMDsKKworCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX1JBTkRPTUlaRSkKKwkJcmFuZG9tX3ZhcmlhYmxlID0gZ2V0X3JhbmRvbV9pbnQoKSAlICg4KjEwMjQqMTAyNCk7CisjaWZkZWYgQ09ORklHX1NUQUNLX0dST1dTVVAKKwlyZXR1cm4gUEFHRV9BTElHTihzdGFja190b3AgKyByYW5kb21fdmFyaWFibGUpOworI2Vsc2UKKwlyZXR1cm4gUEFHRV9BTElHTihzdGFja190b3AgLSByYW5kb21fdmFyaWFibGUpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgbG9hZF9lbGZfYmluYXJ5KHN0cnVjdCBsaW51eF9iaW5wcm0gKiBicHJtLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0IGZpbGUgKmludGVycHJldGVyID0gTlVMTDsgLyogdG8gc2h1dCBnY2MgdXAgKi8KKyAJdW5zaWduZWQgbG9uZyBsb2FkX2FkZHIgPSAwLCBsb2FkX2JpYXMgPSAwOworCWludCBsb2FkX2FkZHJfc2V0ID0gMDsKKwljaGFyICogZWxmX2ludGVycHJldGVyID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgaW50ZXJwcmV0ZXJfdHlwZSA9IElOVEVSUFJFVEVSX05PTkU7CisJdW5zaWduZWQgY2hhciBpYmNzMl9pbnRlcnByZXRlciA9IDA7CisJdW5zaWduZWQgbG9uZyBlcnJvcjsKKwlzdHJ1Y3QgZWxmX3BoZHIgKiBlbGZfcHBudCwgKmVsZl9waGRhdGE7CisJdW5zaWduZWQgbG9uZyBlbGZfYnNzLCBlbGZfYnJrOworCWludCBlbGZfZXhlY19maWxlbm87CisJaW50IHJldHZhbCwgaTsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGVsZl9lbnRyeSwgaW50ZXJwX2xvYWRfYWRkciA9IDA7CisJdW5zaWduZWQgbG9uZyBzdGFydF9jb2RlLCBlbmRfY29kZSwgc3RhcnRfZGF0YSwgZW5kX2RhdGE7CisJdW5zaWduZWQgbG9uZyByZWxvY19mdW5jX2Rlc2MgPSAwOworCWNoYXIgcGFzc2VkX2ZpbGVub1s2XTsKKwlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlczsKKwlpbnQgaGF2ZV9wdF9nbnVfc3RhY2ssIGV4ZWN1dGFibGVfc3RhY2sgPSBFWFNUQUNLX0RFRkFVTFQ7CisJdW5zaWduZWQgbG9uZyBkZWZfZmxhZ3MgPSAwOworCXN0cnVjdCB7CisJCXN0cnVjdCBlbGZoZHIgZWxmX2V4OworCQlzdHJ1Y3QgZWxmaGRyIGludGVycF9lbGZfZXg7CisgIAkJc3RydWN0IGV4ZWMgaW50ZXJwX2V4OworCX0gKmxvYzsKKworCWxvYyA9IGttYWxsb2Moc2l6ZW9mKCpsb2MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxvYykgeworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIG91dF9yZXQ7CisJfQorCQorCS8qIEdldCB0aGUgZXhlYy1oZWFkZXIgKi8KKwlsb2MtPmVsZl9leCA9ICooKHN0cnVjdCBlbGZoZHIgKikgYnBybS0+YnVmKTsKKworCXJldHZhbCA9IC1FTk9FWEVDOworCS8qIEZpcnN0IG9mIGFsbCwgc29tZSBzaW1wbGUgY29uc2lzdGVuY3kgY2hlY2tzICovCisJaWYgKG1lbWNtcChsb2MtPmVsZl9leC5lX2lkZW50LCBFTEZNQUcsIFNFTEZNQUcpICE9IDApCisJCWdvdG8gb3V0OworCisJaWYgKGxvYy0+ZWxmX2V4LmVfdHlwZSAhPSBFVF9FWEVDICYmIGxvYy0+ZWxmX2V4LmVfdHlwZSAhPSBFVF9EWU4pCisJCWdvdG8gb3V0OworCWlmICghZWxmX2NoZWNrX2FyY2goJmxvYy0+ZWxmX2V4KSkKKwkJZ290byBvdXQ7CisJaWYgKCFicHJtLT5maWxlLT5mX29wfHwhYnBybS0+ZmlsZS0+Zl9vcC0+bW1hcCkKKwkJZ290byBvdXQ7CisKKwkvKiBOb3cgcmVhZCBpbiBhbGwgb2YgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiAqLworCisJaWYgKGxvYy0+ZWxmX2V4LmVfcGhlbnRzaXplICE9IHNpemVvZihzdHJ1Y3QgZWxmX3BoZHIpKQorCQlnb3RvIG91dDsKKwlpZiAobG9jLT5lbGZfZXguZV9waG51bSA8IDEgfHwKKwkgCWxvYy0+ZWxmX2V4LmVfcGhudW0gPiA2NTUzNlUgLyBzaXplb2Yoc3RydWN0IGVsZl9waGRyKSkKKwkJZ290byBvdXQ7CisJc2l6ZSA9IGxvYy0+ZWxmX2V4LmVfcGhudW0gKiBzaXplb2Yoc3RydWN0IGVsZl9waGRyKTsKKwlyZXR2YWwgPSAtRU5PTUVNOworCWVsZl9waGRhdGEgPSAoc3RydWN0IGVsZl9waGRyICopIGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlbGZfcGhkYXRhKQorCQlnb3RvIG91dDsKKworCXJldHZhbCA9IGtlcm5lbF9yZWFkKGJwcm0tPmZpbGUsIGxvYy0+ZWxmX2V4LmVfcGhvZmYsIChjaGFyICopIGVsZl9waGRhdGEsIHNpemUpOworCWlmIChyZXR2YWwgIT0gc2l6ZSkgeworCQlpZiAocmV0dmFsID49IDApCisJCQlyZXR2YWwgPSAtRUlPOworCQlnb3RvIG91dF9mcmVlX3BoOworCX0KKworCWZpbGVzID0gY3VycmVudC0+ZmlsZXM7CQkvKiBSZWZjb3VudGVkIHNvIG9rICovCisJcmV0dmFsID0gdW5zaGFyZV9maWxlcygpOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIG91dF9mcmVlX3BoOworCWlmIChmaWxlcyA9PSBjdXJyZW50LT5maWxlcykgeworCQlwdXRfZmlsZXNfc3RydWN0KGZpbGVzKTsKKwkJZmlsZXMgPSBOVUxMOworCX0KKworCS8qIGV4ZWMgd2lsbCBtYWtlIG91ciBmaWxlcyBwcml2YXRlIGFueXdheSwgYnV0IGZvciB0aGUgYS5vdXQKKwkgICBsb2FkZXIgc3R1ZmYgd2UgbmVlZCB0byBkbyBpdCBlYXJsaWVyICovCisKKwlyZXR2YWwgPSBnZXRfdW51c2VkX2ZkKCk7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gb3V0X2ZyZWVfZmg7CisJZ2V0X2ZpbGUoYnBybS0+ZmlsZSk7CisJZmRfaW5zdGFsbChlbGZfZXhlY19maWxlbm8gPSByZXR2YWwsIGJwcm0tPmZpbGUpOworCisJZWxmX3BwbnQgPSBlbGZfcGhkYXRhOworCWVsZl9ic3MgPSAwOworCWVsZl9icmsgPSAwOworCisJc3RhcnRfY29kZSA9IH4wVUw7CisJZW5kX2NvZGUgPSAwOworCXN0YXJ0X2RhdGEgPSAwOworCWVuZF9kYXRhID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBsb2MtPmVsZl9leC5lX3BobnVtOyBpKyspIHsKKwkJaWYgKGVsZl9wcG50LT5wX3R5cGUgPT0gUFRfSU5URVJQKSB7CisJCQkvKiBUaGlzIGlzIHRoZSBwcm9ncmFtIGludGVycHJldGVyIHVzZWQgZm9yCisJCQkgKiBzaGFyZWQgbGlicmFyaWVzIC0gZm9yIG5vdyBhc3N1bWUgdGhhdCB0aGlzCisJCQkgKiBpcyBhbiBhLm91dCBmb3JtYXQgYmluYXJ5CisJCQkgKi8KKworCQkJcmV0dmFsID0gLUVOT0VYRUM7CisJCQlpZiAoZWxmX3BwbnQtPnBfZmlsZXN6ID4gUEFUSF9NQVggfHwgCisJCQkgICAgZWxmX3BwbnQtPnBfZmlsZXN6IDwgMikKKwkJCQlnb3RvIG91dF9mcmVlX2ZpbGU7CisKKwkJCXJldHZhbCA9IC1FTk9NRU07CisJCQllbGZfaW50ZXJwcmV0ZXIgPSAoY2hhciAqKSBrbWFsbG9jKGVsZl9wcG50LT5wX2ZpbGVzeiwKKwkJCQkJCQkgICBHRlBfS0VSTkVMKTsKKwkJCWlmICghZWxmX2ludGVycHJldGVyKQorCQkJCWdvdG8gb3V0X2ZyZWVfZmlsZTsKKworCQkJcmV0dmFsID0ga2VybmVsX3JlYWQoYnBybS0+ZmlsZSwgZWxmX3BwbnQtPnBfb2Zmc2V0LAorCQkJCQkgICBlbGZfaW50ZXJwcmV0ZXIsCisJCQkJCSAgIGVsZl9wcG50LT5wX2ZpbGVzeik7CisJCQlpZiAocmV0dmFsICE9IGVsZl9wcG50LT5wX2ZpbGVzeikgeworCQkJCWlmIChyZXR2YWwgPj0gMCkKKwkJCQkJcmV0dmFsID0gLUVJTzsKKwkJCQlnb3RvIG91dF9mcmVlX2ludGVycDsKKwkJCX0KKwkJCS8qIG1ha2Ugc3VyZSBwYXRoIGlzIE5VTEwgdGVybWluYXRlZCAqLworCQkJcmV0dmFsID0gLUVOT0VYRUM7CisJCQlpZiAoZWxmX2ludGVycHJldGVyW2VsZl9wcG50LT5wX2ZpbGVzeiAtIDFdICE9ICdcMCcpCisJCQkJZ290byBvdXRfZnJlZV9pbnRlcnA7CisKKwkJCS8qIElmIHRoZSBwcm9ncmFtIGludGVycHJldGVyIGlzIG9uZSBvZiB0aGVzZSB0d28sCisJCQkgKiB0aGVuIGFzc3VtZSBhbiBpQkNTMiBpbWFnZS4gT3RoZXJ3aXNlIGFzc3VtZQorCQkJICogYSBuYXRpdmUgbGludXggaW1hZ2UuCisJCQkgKi8KKwkJCWlmIChzdHJjbXAoZWxmX2ludGVycHJldGVyLCIvdXNyL2xpYi9saWJjLnNvLjEiKSA9PSAwIHx8CisJCQkgICAgc3RyY21wKGVsZl9pbnRlcnByZXRlciwiL3Vzci9saWIvbGQuc28uMSIpID09IDApCisJCQkJaWJjczJfaW50ZXJwcmV0ZXIgPSAxOworCisJCQkvKgorCQkJICogVGhlIGVhcmx5IFNFVF9QRVJTT05BTElUWSBoZXJlIGlzIHNvIHRoYXQgdGhlIGxvb2t1cAorCQkJICogZm9yIHRoZSBpbnRlcnByZXRlciBoYXBwZW5zIGluIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIAorCQkJICogdG8tYmUtZXhlY2VkIGltYWdlLiAgU0VUX1BFUlNPTkFMSVRZIGNhbiBzZWxlY3QgYW4KKwkJCSAqIGFsdGVybmF0ZSByb290LgorCQkJICoKKwkJCSAqIEhvd2V2ZXIsIFNFVF9QRVJTT05BTElUWSBpcyBOT1QgYWxsb3dlZCB0byBzd2l0Y2gKKwkJCSAqIHRoaXMgdGFzayBpbnRvIHRoZSBuZXcgaW1hZ2VzJ3MgbWVtb3J5IG1hcHBpbmcKKwkJCSAqIHBvbGljeSAtIHRoYXQgaXMsIFRBU0tfU0laRSBtdXN0IHN0aWxsIGV2YWx1YXRlIHRvCisJCQkgKiB0aGF0IHdoaWNoIGlzIGFwcHJvcHJpYXRlIHRvIHRoZSBleGVjaW5nIGFwcGxpY2F0aW9uLgorCQkJICogVGhpcyBpcyBiZWNhdXNlIGV4aXRfbW1hcCgpIG5lZWRzIHRvIGhhdmUgVEFTS19TSVpFCisJCQkgKiBldmFsdWF0ZSB0byB0aGUgc2l6ZSBvZiB0aGUgb2xkIGltYWdlLgorCQkJICoKKwkJCSAqIFNvIGlmIChzYXkpIGEgNjQtYml0IGFwcGxpY2F0aW9uIGlzIGV4ZWNpbmcgYSAzMi1iaXQKKwkJCSAqIGFwcGxpY2F0aW9uIGl0IGlzIHRoZSBhcmNoaXRlY3R1cmUncyByZXNwb25zaWJpbGl0eQorCQkJICogdG8gZGVmZXIgY2hhbmdpbmcgdGhlIHZhbHVlIG9mIFRBU0tfU0laRSB1bnRpbCB0aGUKKwkJCSAqIHN3aXRjaCByZWFsbHkgaXMgZ29pbmcgdG8gaGFwcGVuIC0gZG8gdGhpcyBpbgorCQkJICogZmx1c2hfdGhyZWFkKCkuCS0gYWtwbQorCQkJICovCisJCQlTRVRfUEVSU09OQUxJVFkobG9jLT5lbGZfZXgsIGliY3MyX2ludGVycHJldGVyKTsKKworCQkJaW50ZXJwcmV0ZXIgPSBvcGVuX2V4ZWMoZWxmX2ludGVycHJldGVyKTsKKwkJCXJldHZhbCA9IFBUUl9FUlIoaW50ZXJwcmV0ZXIpOworCQkJaWYgKElTX0VSUihpbnRlcnByZXRlcikpCisJCQkJZ290byBvdXRfZnJlZV9pbnRlcnA7CisJCQlyZXR2YWwgPSBrZXJuZWxfcmVhZChpbnRlcnByZXRlciwgMCwgYnBybS0+YnVmLCBCSU5QUk1fQlVGX1NJWkUpOworCQkJaWYgKHJldHZhbCAhPSBCSU5QUk1fQlVGX1NJWkUpIHsKKwkJCQlpZiAocmV0dmFsID49IDApCisJCQkJCXJldHZhbCA9IC1FSU87CisJCQkJZ290byBvdXRfZnJlZV9kZW50cnk7CisJCQl9CisKKwkJCS8qIEdldCB0aGUgZXhlYyBoZWFkZXJzICovCisJCQlsb2MtPmludGVycF9leCA9ICooKHN0cnVjdCBleGVjICopIGJwcm0tPmJ1Zik7CisJCQlsb2MtPmludGVycF9lbGZfZXggPSAqKChzdHJ1Y3QgZWxmaGRyICopIGJwcm0tPmJ1Zik7CisJCQlicmVhazsKKwkJfQorCQllbGZfcHBudCsrOworCX0KKworCWVsZl9wcG50ID0gZWxmX3BoZGF0YTsKKwlmb3IgKGkgPSAwOyBpIDwgbG9jLT5lbGZfZXguZV9waG51bTsgaSsrLCBlbGZfcHBudCsrKQorCQlpZiAoZWxmX3BwbnQtPnBfdHlwZSA9PSBQVF9HTlVfU1RBQ0spIHsKKwkJCWlmIChlbGZfcHBudC0+cF9mbGFncyAmIFBGX1gpCisJCQkJZXhlY3V0YWJsZV9zdGFjayA9IEVYU1RBQ0tfRU5BQkxFX1g7CisJCQllbHNlCisJCQkJZXhlY3V0YWJsZV9zdGFjayA9IEVYU1RBQ0tfRElTQUJMRV9YOworCQkJYnJlYWs7CisJCX0KKwloYXZlX3B0X2dudV9zdGFjayA9IChpIDwgbG9jLT5lbGZfZXguZV9waG51bSk7CisKKwkvKiBTb21lIHNpbXBsZSBjb25zaXN0ZW5jeSBjaGVja3MgZm9yIHRoZSBpbnRlcnByZXRlciAqLworCWlmIChlbGZfaW50ZXJwcmV0ZXIpIHsKKwkJaW50ZXJwcmV0ZXJfdHlwZSA9IElOVEVSUFJFVEVSX0VMRiB8IElOVEVSUFJFVEVSX0FPVVQ7CisKKwkJLyogTm93IGZpZ3VyZSBvdXQgd2hpY2ggZm9ybWF0IG91ciBiaW5hcnkgaXMgKi8KKwkJaWYgKChOX01BR0lDKGxvYy0+aW50ZXJwX2V4KSAhPSBPTUFHSUMpICYmCisJCSAgICAoTl9NQUdJQyhsb2MtPmludGVycF9leCkgIT0gWk1BR0lDKSAmJgorCQkgICAgKE5fTUFHSUMobG9jLT5pbnRlcnBfZXgpICE9IFFNQUdJQykpCisJCQlpbnRlcnByZXRlcl90eXBlID0gSU5URVJQUkVURVJfRUxGOworCisJCWlmIChtZW1jbXAobG9jLT5pbnRlcnBfZWxmX2V4LmVfaWRlbnQsIEVMRk1BRywgU0VMRk1BRykgIT0gMCkKKwkJCWludGVycHJldGVyX3R5cGUgJj0gfklOVEVSUFJFVEVSX0VMRjsKKworCQlyZXR2YWwgPSAtRUxJQkJBRDsKKwkJaWYgKCFpbnRlcnByZXRlcl90eXBlKQorCQkJZ290byBvdXRfZnJlZV9kZW50cnk7CisKKwkJLyogTWFrZSBzdXJlIG9ubHkgb25lIHR5cGUgd2FzIHNlbGVjdGVkICovCisJCWlmICgoaW50ZXJwcmV0ZXJfdHlwZSAmIElOVEVSUFJFVEVSX0VMRikgJiYKKwkJICAgICBpbnRlcnByZXRlcl90eXBlICE9IElOVEVSUFJFVEVSX0VMRikgeworCSAgICAgCQkvLyBGSVhNRSAtIHJhdGVsaW1pdCB0aGlzIGJlZm9yZSByZS1lbmFibGluZworCQkJLy8gcHJpbnRrKEtFUk5fV0FSTklORyAiRUxGOiBBbWJpZ3VvdXMgdHlwZSwgdXNpbmcgRUxGXG4iKTsKKwkJCWludGVycHJldGVyX3R5cGUgPSBJTlRFUlBSRVRFUl9FTEY7CisJCX0KKwkJLyogVmVyaWZ5IHRoZSBpbnRlcnByZXRlciBoYXMgYSB2YWxpZCBhcmNoICovCisJCWlmICgoaW50ZXJwcmV0ZXJfdHlwZSA9PSBJTlRFUlBSRVRFUl9FTEYpICYmCisJCSAgICAhZWxmX2NoZWNrX2FyY2goJmxvYy0+aW50ZXJwX2VsZl9leCkpCisJCQlnb3RvIG91dF9mcmVlX2RlbnRyeTsKKwl9IGVsc2UgeworCQkvKiBFeGVjdXRhYmxlcyB3aXRob3V0IGFuIGludGVycHJldGVyIGFsc28gbmVlZCBhIHBlcnNvbmFsaXR5ICAqLworCQlTRVRfUEVSU09OQUxJVFkobG9jLT5lbGZfZXgsIGliY3MyX2ludGVycHJldGVyKTsKKwl9CisKKwkvKiBPSywgd2UgYXJlIGRvbmUgd2l0aCB0aGF0LCBub3cgc2V0IHVwIHRoZSBhcmcgc3R1ZmYsCisJICAgYW5kIHRoZW4gc3RhcnQgdGhpcyBzdWNrZXIgdXAgKi8KKworCWlmICgoIWJwcm0tPnNoX2JhbmcpICYmIChpbnRlcnByZXRlcl90eXBlID09IElOVEVSUFJFVEVSX0FPVVQpKSB7CisJCWNoYXIgKnBhc3NlZF9wID0gcGFzc2VkX2ZpbGVubzsKKwkJc3ByaW50ZihwYXNzZWRfZmlsZW5vLCAiJWQiLCBlbGZfZXhlY19maWxlbm8pOworCisJCWlmIChlbGZfaW50ZXJwcmV0ZXIpIHsKKwkJCXJldHZhbCA9IGNvcHlfc3RyaW5nc19rZXJuZWwoMSwgJnBhc3NlZF9wLCBicHJtKTsKKwkJCWlmIChyZXR2YWwpCisJCQkJZ290byBvdXRfZnJlZV9kZW50cnk7IAorCQkJYnBybS0+YXJnYysrOworCQl9CisJfQorCisJLyogRmx1c2ggYWxsIHRyYWNlcyBvZiB0aGUgY3VycmVudGx5IHJ1bm5pbmcgZXhlY3V0YWJsZSAqLworCXJldHZhbCA9IGZsdXNoX29sZF9leGVjKGJwcm0pOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0X2ZyZWVfZGVudHJ5OworCisJLyogRGlzY2FyZCBvdXIgdW5uZWVkZWQgb2xkIGZpbGVzIHN0cnVjdCAqLworCWlmIChmaWxlcykgeworCQlzdGVhbF9sb2NrcyhmaWxlcyk7CisJCXB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpOworCQlmaWxlcyA9IE5VTEw7CisJfQorCisJLyogT0ssIFRoaXMgaXMgdGhlIHBvaW50IG9mIG5vIHJldHVybiAqLworCWN1cnJlbnQtPm1tLT5zdGFydF9kYXRhID0gMDsKKwljdXJyZW50LT5tbS0+ZW5kX2RhdGEgPSAwOworCWN1cnJlbnQtPm1tLT5lbmRfY29kZSA9IDA7CisJY3VycmVudC0+bW0tPm1tYXAgPSBOVUxMOworCWN1cnJlbnQtPmZsYWdzICY9IH5QRl9GT1JLTk9FWEVDOworCWN1cnJlbnQtPm1tLT5kZWZfZmxhZ3MgPSBkZWZfZmxhZ3M7CisKKwkvKiBEbyB0aGlzIGltbWVkaWF0ZWx5LCBzaW5jZSBTVEFDS19UT1AgYXMgdXNlZCBpbiBzZXR1cF9hcmdfcGFnZXMKKwkgICBtYXkgZGVwZW5kIG9uIHRoZSBwZXJzb25hbGl0eS4gICovCisJU0VUX1BFUlNPTkFMSVRZKGxvYy0+ZWxmX2V4LCBpYmNzMl9pbnRlcnByZXRlcik7CisJaWYgKGVsZl9yZWFkX2ltcGxpZXNfZXhlYyhsb2MtPmVsZl9leCwgZXhlY3V0YWJsZV9zdGFjaykpCisJCWN1cnJlbnQtPnBlcnNvbmFsaXR5IHw9IFJFQURfSU1QTElFU19FWEVDOworCisJaWYgKCAhKGN1cnJlbnQtPnBlcnNvbmFsaXR5ICYgQUREUl9OT19SQU5ET01JWkUpICYmIHJhbmRvbWl6ZV92YV9zcGFjZSkKKwkJY3VycmVudC0+ZmxhZ3MgfD0gUEZfUkFORE9NSVpFOworCWFyY2hfcGlja19tbWFwX2xheW91dChjdXJyZW50LT5tbSk7CisKKwkvKiBEbyB0aGlzIHNvIHRoYXQgd2UgY2FuIGxvYWQgdGhlIGludGVycHJldGVyLCBpZiBuZWVkIGJlLiAgV2Ugd2lsbAorCSAgIGNoYW5nZSBzb21lIG9mIHRoZXNlIGxhdGVyICovCisJc2V0X21tX2NvdW50ZXIoY3VycmVudC0+bW0sIHJzcywgMCk7CisJY3VycmVudC0+bW0tPmZyZWVfYXJlYV9jYWNoZSA9IGN1cnJlbnQtPm1tLT5tbWFwX2Jhc2U7CisJcmV0dmFsID0gc2V0dXBfYXJnX3BhZ2VzKGJwcm0sIHJhbmRvbWl6ZV9zdGFja190b3AoU1RBQ0tfVE9QKSwKKwkJCQkgZXhlY3V0YWJsZV9zdGFjayk7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJc2VuZF9zaWcoU0lHS0lMTCwgY3VycmVudCwgMCk7CisJCWdvdG8gb3V0X2ZyZWVfZGVudHJ5OworCX0KKwkKKyNpZmRlZiBBUkNIX0hBU19TRVRVUF9BRERJVElPTkFMX1BBR0VTCisJcmV0dmFsID0gYXJjaF9zZXR1cF9hZGRpdGlvbmFsX3BhZ2VzKGJwcm0sIGV4ZWN1dGFibGVfc3RhY2spOworCWlmIChyZXR2YWwgPCAwKSB7CisJCXNlbmRfc2lnKFNJR0tJTEwsIGN1cnJlbnQsIDApOworCQlnb3RvIG91dF9mcmVlX2RlbnRyeTsKKwl9CisjZW5kaWYgLyogQVJDSF9IQVNfU0VUVVBfQURESVRJT05BTF9QQUdFUyAqLworCisJY3VycmVudC0+bW0tPnN0YXJ0X3N0YWNrID0gYnBybS0+cDsKKworCS8qIE5vdyB3ZSBkbyBhIGxpdHRsZSBncnVuZ3kgd29yayBieSBtbWFwaW5nIHRoZSBFTEYgaW1hZ2UgaW50bworCSAgIHRoZSBjb3JyZWN0IGxvY2F0aW9uIGluIG1lbW9yeS4gIEF0IHRoaXMgcG9pbnQsIHdlIGFzc3VtZSB0aGF0CisJICAgdGhlIGltYWdlIHNob3VsZCBiZSBsb2FkZWQgYXQgZml4ZWQgYWRkcmVzcywgbm90IGF0IGEgdmFyaWFibGUKKwkgICBhZGRyZXNzLiAqLworCisJZm9yKGkgPSAwLCBlbGZfcHBudCA9IGVsZl9waGRhdGE7IGkgPCBsb2MtPmVsZl9leC5lX3BobnVtOyBpKyssIGVsZl9wcG50KyspIHsKKwkJaW50IGVsZl9wcm90ID0gMCwgZWxmX2ZsYWdzOworCQl1bnNpZ25lZCBsb25nIGssIHZhZGRyOworCisJCWlmIChlbGZfcHBudC0+cF90eXBlICE9IFBUX0xPQUQpCisJCQljb250aW51ZTsKKworCQlpZiAodW5saWtlbHkgKGVsZl9icmsgPiBlbGZfYnNzKSkgeworCQkJdW5zaWduZWQgbG9uZyBuYnl0ZTsKKwkgICAgICAgICAgICAKKwkJCS8qIFRoZXJlIHdhcyBhIFBUX0xPQUQgc2VnbWVudCB3aXRoIHBfbWVtc3ogPiBwX2ZpbGVzegorCQkJICAgYmVmb3JlIHRoaXMgb25lLiBNYXAgYW5vbnltb3VzIHBhZ2VzLCBpZiBuZWVkZWQsCisJCQkgICBhbmQgY2xlYXIgdGhlIGFyZWEuICAqLworCQkJcmV0dmFsID0gc2V0X2JyayAoZWxmX2JzcyArIGxvYWRfYmlhcywKKwkJCQkJICBlbGZfYnJrICsgbG9hZF9iaWFzKTsKKwkJCWlmIChyZXR2YWwpIHsKKwkJCQlzZW5kX3NpZyhTSUdLSUxMLCBjdXJyZW50LCAwKTsKKwkJCQlnb3RvIG91dF9mcmVlX2RlbnRyeTsKKwkJCX0KKwkJCW5ieXRlID0gRUxGX1BBR0VPRkZTRVQoZWxmX2Jzcyk7CisJCQlpZiAobmJ5dGUpIHsKKwkJCQluYnl0ZSA9IEVMRl9NSU5fQUxJR04gLSBuYnl0ZTsKKwkJCQlpZiAobmJ5dGUgPiBlbGZfYnJrIC0gZWxmX2JzcykKKwkJCQkJbmJ5dGUgPSBlbGZfYnJrIC0gZWxmX2JzczsKKwkJCQlpZiAoY2xlYXJfdXNlcigodm9pZCBfX3VzZXIgKillbGZfYnNzICsKKwkJCQkJCQlsb2FkX2JpYXMsIG5ieXRlKSkgeworCQkJCQkvKgorCQkJCQkgKiBUaGlzIGJzcy16ZXJvaW5nIGNhbiBmYWlsIGlmIHRoZSBFTEYKKwkJCQkJICogZmlsZSBzcGVjaWZpZXMgb2RkIHByb3RlY3Rpb25zLiAgU28KKwkJCQkJICogd2UgZG9uJ3QgY2hlY2sgdGhlIHJldHVybiB2YWx1ZQorCQkJCQkgKi8KKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoZWxmX3BwbnQtPnBfZmxhZ3MgJiBQRl9SKSBlbGZfcHJvdCB8PSBQUk9UX1JFQUQ7CisJCWlmIChlbGZfcHBudC0+cF9mbGFncyAmIFBGX1cpIGVsZl9wcm90IHw9IFBST1RfV1JJVEU7CisJCWlmIChlbGZfcHBudC0+cF9mbGFncyAmIFBGX1gpIGVsZl9wcm90IHw9IFBST1RfRVhFQzsKKworCQllbGZfZmxhZ3MgPSBNQVBfUFJJVkFURXxNQVBfREVOWVdSSVRFfE1BUF9FWEVDVVRBQkxFOworCisJCXZhZGRyID0gZWxmX3BwbnQtPnBfdmFkZHI7CisJCWlmIChsb2MtPmVsZl9leC5lX3R5cGUgPT0gRVRfRVhFQyB8fCBsb2FkX2FkZHJfc2V0KSB7CisJCQllbGZfZmxhZ3MgfD0gTUFQX0ZJWEVEOworCQl9IGVsc2UgaWYgKGxvYy0+ZWxmX2V4LmVfdHlwZSA9PSBFVF9EWU4pIHsKKwkJCS8qIFRyeSBhbmQgZ2V0IGR5bmFtaWMgcHJvZ3JhbXMgb3V0IG9mIHRoZSB3YXkgb2YgdGhlIGRlZmF1bHQgbW1hcAorCQkJICAgYmFzZSwgYXMgd2VsbCBhcyB3aGF0ZXZlciBwcm9ncmFtIHRoZXkgbWlnaHQgdHJ5IHRvIGV4ZWMuICBUaGlzCisJCQkgICBpcyBiZWNhdXNlIHRoZSBicmsgd2lsbCBmb2xsb3cgdGhlIGxvYWRlciwgYW5kIGlzIG5vdCBtb3ZhYmxlLiAgKi8KKwkJCWxvYWRfYmlhcyA9IEVMRl9QQUdFU1RBUlQoRUxGX0VUX0RZTl9CQVNFIC0gdmFkZHIpOworCQl9CisKKwkJZXJyb3IgPSBlbGZfbWFwKGJwcm0tPmZpbGUsIGxvYWRfYmlhcyArIHZhZGRyLCBlbGZfcHBudCwgZWxmX3Byb3QsIGVsZl9mbGFncyk7CisJCWlmIChCQURfQUREUihlcnJvcikpIHsKKwkJCXNlbmRfc2lnKFNJR0tJTEwsIGN1cnJlbnQsIDApOworCQkJZ290byBvdXRfZnJlZV9kZW50cnk7CisJCX0KKworCQlpZiAoIWxvYWRfYWRkcl9zZXQpIHsKKwkJCWxvYWRfYWRkcl9zZXQgPSAxOworCQkJbG9hZF9hZGRyID0gKGVsZl9wcG50LT5wX3ZhZGRyIC0gZWxmX3BwbnQtPnBfb2Zmc2V0KTsKKwkJCWlmIChsb2MtPmVsZl9leC5lX3R5cGUgPT0gRVRfRFlOKSB7CisJCQkJbG9hZF9iaWFzICs9IGVycm9yIC0KKwkJCQkgICAgICAgICAgICAgRUxGX1BBR0VTVEFSVChsb2FkX2JpYXMgKyB2YWRkcik7CisJCQkJbG9hZF9hZGRyICs9IGxvYWRfYmlhczsKKwkJCQlyZWxvY19mdW5jX2Rlc2MgPSBsb2FkX2JpYXM7CisJCQl9CisJCX0KKwkJayA9IGVsZl9wcG50LT5wX3ZhZGRyOworCQlpZiAoayA8IHN0YXJ0X2NvZGUpIHN0YXJ0X2NvZGUgPSBrOworCQlpZiAoc3RhcnRfZGF0YSA8IGspIHN0YXJ0X2RhdGEgPSBrOworCisJCS8qCisJCSAqIENoZWNrIHRvIHNlZSBpZiB0aGUgc2VjdGlvbidzIHNpemUgd2lsbCBvdmVyZmxvdyB0aGUKKwkJICogYWxsb3dlZCB0YXNrIHNpemUuIE5vdGUgdGhhdCBwX2ZpbGVzeiBtdXN0IGFsd2F5cyBiZQorCQkgKiA8PSBwX21lbXN6IHNvIGl0IGlzIG9ubHkgbmVjZXNzYXJ5IHRvIGNoZWNrIHBfbWVtc3ouCisJCSAqLworCQlpZiAoayA+IFRBU0tfU0laRSB8fCBlbGZfcHBudC0+cF9maWxlc3ogPiBlbGZfcHBudC0+cF9tZW1zeiB8fAorCQkgICAgZWxmX3BwbnQtPnBfbWVtc3ogPiBUQVNLX1NJWkUgfHwKKwkJICAgIFRBU0tfU0laRSAtIGVsZl9wcG50LT5wX21lbXN6IDwgaykgeworCQkJLyogc2V0X2JyayBjYW4gbmV2ZXIgd29yay4gIEF2b2lkIG92ZXJmbG93cy4gICovCisJCQlzZW5kX3NpZyhTSUdLSUxMLCBjdXJyZW50LCAwKTsKKwkJCWdvdG8gb3V0X2ZyZWVfZGVudHJ5OworCQl9CisKKwkJayA9IGVsZl9wcG50LT5wX3ZhZGRyICsgZWxmX3BwbnQtPnBfZmlsZXN6OworCisJCWlmIChrID4gZWxmX2JzcykKKwkJCWVsZl9ic3MgPSBrOworCQlpZiAoKGVsZl9wcG50LT5wX2ZsYWdzICYgUEZfWCkgJiYgZW5kX2NvZGUgPCBrKQorCQkJZW5kX2NvZGUgPSBrOworCQlpZiAoZW5kX2RhdGEgPCBrKQorCQkJZW5kX2RhdGEgPSBrOworCQlrID0gZWxmX3BwbnQtPnBfdmFkZHIgKyBlbGZfcHBudC0+cF9tZW1zejsKKwkJaWYgKGsgPiBlbGZfYnJrKQorCQkJZWxmX2JyayA9IGs7CisJfQorCisJbG9jLT5lbGZfZXguZV9lbnRyeSArPSBsb2FkX2JpYXM7CisJZWxmX2JzcyArPSBsb2FkX2JpYXM7CisJZWxmX2JyayArPSBsb2FkX2JpYXM7CisJc3RhcnRfY29kZSArPSBsb2FkX2JpYXM7CisJZW5kX2NvZGUgKz0gbG9hZF9iaWFzOworCXN0YXJ0X2RhdGEgKz0gbG9hZF9iaWFzOworCWVuZF9kYXRhICs9IGxvYWRfYmlhczsKKworCS8qIENhbGxpbmcgc2V0X2JyayBlZmZlY3RpdmVseSBtbWFwcyB0aGUgcGFnZXMgdGhhdCB3ZSBuZWVkCisJICogZm9yIHRoZSBic3MgYW5kIGJyZWFrIHNlY3Rpb25zLiAgV2UgbXVzdCBkbyB0aGlzIGJlZm9yZQorCSAqIG1hcHBpbmcgaW4gdGhlIGludGVycHJldGVyLCB0byBtYWtlIHN1cmUgaXQgZG9lc24ndCB3aW5kCisJICogdXAgZ2V0dGluZyBwbGFjZWQgd2hlcmUgdGhlIGJzcyBuZWVkcyB0byBnby4KKwkgKi8KKwlyZXR2YWwgPSBzZXRfYnJrKGVsZl9ic3MsIGVsZl9icmspOworCWlmIChyZXR2YWwpIHsKKwkJc2VuZF9zaWcoU0lHS0lMTCwgY3VycmVudCwgMCk7CisJCWdvdG8gb3V0X2ZyZWVfZGVudHJ5OworCX0KKwlpZiAocGFkemVybyhlbGZfYnNzKSkgeworCQlzZW5kX3NpZyhTSUdTRUdWLCBjdXJyZW50LCAwKTsKKwkJcmV0dmFsID0gLUVGQVVMVDsgLyogTm9ib2R5IGdldHMgdG8gc2VlIHRoaXMsIGJ1dC4uICovCisJCWdvdG8gb3V0X2ZyZWVfZGVudHJ5OworCX0KKworCWlmIChlbGZfaW50ZXJwcmV0ZXIpIHsKKwkJaWYgKGludGVycHJldGVyX3R5cGUgPT0gSU5URVJQUkVURVJfQU9VVCkKKwkJCWVsZl9lbnRyeSA9IGxvYWRfYW91dF9pbnRlcnAoJmxvYy0+aW50ZXJwX2V4LAorCQkJCQkJICAgICBpbnRlcnByZXRlcik7CisJCWVsc2UKKwkJCWVsZl9lbnRyeSA9IGxvYWRfZWxmX2ludGVycCgmbG9jLT5pbnRlcnBfZWxmX2V4LAorCQkJCQkJICAgIGludGVycHJldGVyLAorCQkJCQkJICAgICZpbnRlcnBfbG9hZF9hZGRyKTsKKwkJaWYgKEJBRF9BRERSKGVsZl9lbnRyeSkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIGxvYWQgaW50ZXJwcmV0ZXIgJS4xMjhzXG4iLAorCQkJCWVsZl9pbnRlcnByZXRlcik7CisJCQlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7CisJCQlyZXR2YWwgPSAtRU5PRVhFQzsgLyogTm9ib2R5IGdldHMgdG8gc2VlIHRoaXMsIGJ1dC4uICovCisJCQlnb3RvIG91dF9mcmVlX2RlbnRyeTsKKwkJfQorCQlyZWxvY19mdW5jX2Rlc2MgPSBpbnRlcnBfbG9hZF9hZGRyOworCisJCWFsbG93X3dyaXRlX2FjY2VzcyhpbnRlcnByZXRlcik7CisJCWZwdXQoaW50ZXJwcmV0ZXIpOworCQlrZnJlZShlbGZfaW50ZXJwcmV0ZXIpOworCX0gZWxzZSB7CisJCWVsZl9lbnRyeSA9IGxvYy0+ZWxmX2V4LmVfZW50cnk7CisJfQorCisJa2ZyZWUoZWxmX3BoZGF0YSk7CisKKwlpZiAoaW50ZXJwcmV0ZXJfdHlwZSAhPSBJTlRFUlBSRVRFUl9BT1VUKQorCQlzeXNfY2xvc2UoZWxmX2V4ZWNfZmlsZW5vKTsKKworCXNldF9iaW5mbXQoJmVsZl9mb3JtYXQpOworCisJY29tcHV0ZV9jcmVkcyhicHJtKTsKKwljdXJyZW50LT5mbGFncyAmPSB+UEZfRk9SS05PRVhFQzsKKwljcmVhdGVfZWxmX3RhYmxlcyhicHJtLCAmbG9jLT5lbGZfZXgsIChpbnRlcnByZXRlcl90eXBlID09IElOVEVSUFJFVEVSX0FPVVQpLAorCQkJbG9hZF9hZGRyLCBpbnRlcnBfbG9hZF9hZGRyKTsKKwkvKiBOLkIuIHBhc3NlZF9maWxlbm8gbWlnaHQgbm90IGJlIGluaXRpYWxpemVkPyAqLworCWlmIChpbnRlcnByZXRlcl90eXBlID09IElOVEVSUFJFVEVSX0FPVVQpCisJCWN1cnJlbnQtPm1tLT5hcmdfc3RhcnQgKz0gc3RybGVuKHBhc3NlZF9maWxlbm8pICsgMTsKKwljdXJyZW50LT5tbS0+ZW5kX2NvZGUgPSBlbmRfY29kZTsKKwljdXJyZW50LT5tbS0+c3RhcnRfY29kZSA9IHN0YXJ0X2NvZGU7CisJY3VycmVudC0+bW0tPnN0YXJ0X2RhdGEgPSBzdGFydF9kYXRhOworCWN1cnJlbnQtPm1tLT5lbmRfZGF0YSA9IGVuZF9kYXRhOworCWN1cnJlbnQtPm1tLT5zdGFydF9zdGFjayA9IGJwcm0tPnA7CisKKwlpZiAoY3VycmVudC0+cGVyc29uYWxpdHkgJiBNTUFQX1BBR0VfWkVSTykgeworCQkvKiBXaHkgdGhpcywgeW91IGFzaz8/PyAgV2VsbCBTVnI0IG1hcHMgcGFnZSAwIGFzIHJlYWQtb25seSwKKwkJICAgYW5kIHNvbWUgYXBwbGljYXRpb25zICJkZXBlbmQiIHVwb24gdGhpcyBiZWhhdmlvci4KKwkJICAgU2luY2Ugd2UgZG8gbm90IGhhdmUgdGhlIHBvd2VyIHRvIHJlY29tcGlsZSB0aGVzZSwgd2UKKwkJICAgZW11bGF0ZSB0aGUgU1ZyNCBiZWhhdmlvci4gIFNpZ2guICAqLworCQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCQllcnJvciA9IGRvX21tYXAoTlVMTCwgMCwgUEFHRV9TSVpFLCBQUk9UX1JFQUQgfCBQUk9UX0VYRUMsCisJCQkJTUFQX0ZJWEVEIHwgTUFQX1BSSVZBVEUsIDApOworCQl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwl9CisKKyNpZmRlZiBFTEZfUExBVF9JTklUCisJLyoKKwkgKiBUaGUgQUJJIG1heSBzcGVjaWZ5IHRoYXQgY2VydGFpbiByZWdpc3RlcnMgYmUgc2V0IHVwIGluIHNwZWNpYWwKKwkgKiB3YXlzIChvbiBpMzg2ICVlZHggaXMgdGhlIGFkZHJlc3Mgb2YgYSBEVF9GSU5JIGZ1bmN0aW9uLCBmb3IKKwkgKiBleGFtcGxlLiAgSW4gYWRkaXRpb24sIGl0IG1heSBhbHNvIHNwZWNpZnkgKGVnLCBQb3dlclBDNjQgRUxGKQorCSAqIHRoYXQgdGhlIGVfZW50cnkgZmllbGQgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uIGRlc2NyaXB0b3IKKwkgKiBmb3IgdGhlIHN0YXJ0dXAgcm91dGluZSwgcmF0aGVyIHRoYW4gdGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0dXAKKwkgKiByb3V0aW5lIGl0c2VsZi4gIFRoaXMgbWFjcm8gcGVyZm9ybXMgd2hhdGV2ZXIgaW5pdGlhbGl6YXRpb24gdG8KKwkgKiB0aGUgcmVncyBzdHJ1Y3R1cmUgaXMgcmVxdWlyZWQgYXMgd2VsbCBhcyBhbnkgcmVsb2NhdGlvbnMgdG8gdGhlCisJICogZnVuY3Rpb24gZGVzY3JpcHRvciBlbnRyaWVzIHdoZW4gZXhlY3V0aW5nIGR5bmFtaWNhbGx5IGxpbmtzIGFwcHMuCisJICovCisJRUxGX1BMQVRfSU5JVChyZWdzLCByZWxvY19mdW5jX2Rlc2MpOworI2VuZGlmCisKKwlzdGFydF90aHJlYWQocmVncywgZWxmX2VudHJ5LCBicHJtLT5wKTsKKwlpZiAodW5saWtlbHkoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkpIHsKKwkJaWYgKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1RSQUNFX0VYRUMpCisJCQlwdHJhY2Vfbm90aWZ5ICgoUFRSQUNFX0VWRU5UX0VYRUMgPDwgOCkgfCBTSUdUUkFQKTsKKwkJZWxzZQorCQkJc2VuZF9zaWcoU0lHVFJBUCwgY3VycmVudCwgMCk7CisJfQorCXJldHZhbCA9IDA7CitvdXQ6CisJa2ZyZWUobG9jKTsKK291dF9yZXQ6CisJcmV0dXJuIHJldHZhbDsKKworCS8qIGVycm9yIGNsZWFudXAgKi8KK291dF9mcmVlX2RlbnRyeToKKwlhbGxvd193cml0ZV9hY2Nlc3MoaW50ZXJwcmV0ZXIpOworCWlmIChpbnRlcnByZXRlcikKKwkJZnB1dChpbnRlcnByZXRlcik7CitvdXRfZnJlZV9pbnRlcnA6CisJaWYgKGVsZl9pbnRlcnByZXRlcikKKwkJa2ZyZWUoZWxmX2ludGVycHJldGVyKTsKK291dF9mcmVlX2ZpbGU6CisJc3lzX2Nsb3NlKGVsZl9leGVjX2ZpbGVubyk7CitvdXRfZnJlZV9maDoKKwlpZiAoZmlsZXMpIHsKKwkJcHV0X2ZpbGVzX3N0cnVjdChjdXJyZW50LT5maWxlcyk7CisJCWN1cnJlbnQtPmZpbGVzID0gZmlsZXM7CisJfQorb3V0X2ZyZWVfcGg6CisJa2ZyZWUoZWxmX3BoZGF0YSk7CisJZ290byBvdXQ7Cit9CisKKy8qIFRoaXMgaXMgcmVhbGx5IHNpbXBsZW1pbmRlZCBhbmQgc3BlY2lhbGl6ZWQgLSB3ZSBhcmUgbG9hZGluZyBhbgorICAgYS5vdXQgbGlicmFyeSB0aGF0IGlzIGdpdmVuIGFuIEVMRiBoZWFkZXIuICovCisKK3N0YXRpYyBpbnQgbG9hZF9lbGZfbGlicmFyeShzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZWxmX3BoZHIgKmVsZl9waGRhdGE7CisJc3RydWN0IGVsZl9waGRyICplcHBudDsKKwl1bnNpZ25lZCBsb25nIGVsZl9ic3MsIGJzcywgbGVuOworCWludCByZXR2YWwsIGVycm9yLCBpLCBqOworCXN0cnVjdCBlbGZoZHIgZWxmX2V4OworCisJZXJyb3IgPSAtRU5PRVhFQzsKKwlyZXR2YWwgPSBrZXJuZWxfcmVhZChmaWxlLCAwLCAoY2hhciAqKSAmZWxmX2V4LCBzaXplb2YoZWxmX2V4KSk7CisJaWYgKHJldHZhbCAhPSBzaXplb2YoZWxmX2V4KSkKKwkJZ290byBvdXQ7CisKKwlpZiAobWVtY21wKGVsZl9leC5lX2lkZW50LCBFTEZNQUcsIFNFTEZNQUcpICE9IDApCisJCWdvdG8gb3V0OworCisJLyogRmlyc3Qgb2YgYWxsLCBzb21lIHNpbXBsZSBjb25zaXN0ZW5jeSBjaGVja3MgKi8KKwlpZiAoZWxmX2V4LmVfdHlwZSAhPSBFVF9FWEVDIHx8IGVsZl9leC5lX3BobnVtID4gMiB8fAorCSAgICFlbGZfY2hlY2tfYXJjaCgmZWxmX2V4KSB8fCAhZmlsZS0+Zl9vcCB8fCAhZmlsZS0+Zl9vcC0+bW1hcCkKKwkJZ290byBvdXQ7CisKKwkvKiBOb3cgcmVhZCBpbiBhbGwgb2YgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiAqLworCisJaiA9IHNpemVvZihzdHJ1Y3QgZWxmX3BoZHIpICogZWxmX2V4LmVfcGhudW07CisJLyogaiA8IEVMRl9NSU5fQUxJR04gYmVjYXVzZSBlbGZfZXguZV9waG51bSA8PSAyICovCisKKwllcnJvciA9IC1FTk9NRU07CisJZWxmX3BoZGF0YSA9IGttYWxsb2MoaiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlbGZfcGhkYXRhKQorCQlnb3RvIG91dDsKKworCWVwcG50ID0gZWxmX3BoZGF0YTsKKwllcnJvciA9IC1FTk9FWEVDOworCXJldHZhbCA9IGtlcm5lbF9yZWFkKGZpbGUsIGVsZl9leC5lX3Bob2ZmLCAoY2hhciAqKWVwcG50LCBqKTsKKwlpZiAocmV0dmFsICE9IGopCisJCWdvdG8gb3V0X2ZyZWVfcGg7CisKKwlmb3IgKGogPSAwLCBpID0gMDsgaTxlbGZfZXguZV9waG51bTsgaSsrKQorCQlpZiAoKGVwcG50ICsgaSktPnBfdHlwZSA9PSBQVF9MT0FEKQorCQkJaisrOworCWlmIChqICE9IDEpCisJCWdvdG8gb3V0X2ZyZWVfcGg7CisKKwl3aGlsZSAoZXBwbnQtPnBfdHlwZSAhPSBQVF9MT0FEKQorCQllcHBudCsrOworCisJLyogTm93IHVzZSBtbWFwIHRvIG1hcCB0aGUgbGlicmFyeSBpbnRvIG1lbW9yeS4gKi8KKwlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCWVycm9yID0gZG9fbW1hcChmaWxlLAorCQkJRUxGX1BBR0VTVEFSVChlcHBudC0+cF92YWRkciksCisJCQkoZXBwbnQtPnBfZmlsZXN6ICsKKwkJCSBFTEZfUEFHRU9GRlNFVChlcHBudC0+cF92YWRkcikpLAorCQkJUFJPVF9SRUFEIHwgUFJPVF9XUklURSB8IFBST1RfRVhFQywKKwkJCU1BUF9GSVhFRCB8IE1BUF9QUklWQVRFIHwgTUFQX0RFTllXUklURSwKKwkJCShlcHBudC0+cF9vZmZzZXQgLQorCQkJIEVMRl9QQUdFT0ZGU0VUKGVwcG50LT5wX3ZhZGRyKSkpOworCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCWlmIChlcnJvciAhPSBFTEZfUEFHRVNUQVJUKGVwcG50LT5wX3ZhZGRyKSkKKwkJZ290byBvdXRfZnJlZV9waDsKKworCWVsZl9ic3MgPSBlcHBudC0+cF92YWRkciArIGVwcG50LT5wX2ZpbGVzejsKKwlpZiAocGFkemVybyhlbGZfYnNzKSkgeworCQllcnJvciA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0X2ZyZWVfcGg7CisJfQorCisJbGVuID0gRUxGX1BBR0VTVEFSVChlcHBudC0+cF9maWxlc3ogKyBlcHBudC0+cF92YWRkciArIEVMRl9NSU5fQUxJR04gLSAxKTsKKwlic3MgPSBlcHBudC0+cF9tZW1zeiArIGVwcG50LT5wX3ZhZGRyOworCWlmIChic3MgPiBsZW4pIHsKKwkJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwkJZG9fYnJrKGxlbiwgYnNzIC0gbGVuKTsKKwkJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJfQorCWVycm9yID0gMDsKKworb3V0X2ZyZWVfcGg6CisJa2ZyZWUoZWxmX3BoZGF0YSk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogTm90ZSB0aGF0IHNvbWUgcGxhdGZvcm1zIHN0aWxsIHVzZSB0cmFkaXRpb25hbCBjb3JlIGR1bXBzIGFuZCBub3QKKyAqIHRoZSBFTEYgY29yZSBkdW1wLiAgRWFjaCBwbGF0Zm9ybSBjYW4gc2VsZWN0IGl0IGFzIGFwcHJvcHJpYXRlLgorICovCisjaWZkZWYgVVNFX0VMRl9DT1JFX0RVTVAKKworLyoKKyAqIEVMRiBjb3JlIGR1bXBlcgorICoKKyAqIE1vZGVsbGVkIG9uIGZzL2V4ZWMuYzphb3V0X2NvcmVfZHVtcCgpCisgKiBKZXJlbXkgRml0emhhcmRpbmdlIDxqZXJlbXlAc3cub3ouYXU+CisgKi8KKy8qCisgKiBUaGVzZSBhcmUgdGhlIG9ubHkgdGhpbmdzIHlvdSBzaG91bGQgZG8gb24gYSBjb3JlLWZpbGU6IHVzZSBvbmx5IHRoZXNlCisgKiBmdW5jdGlvbnMgdG8gd3JpdGUgb3V0IGFsbCB0aGUgbmVjZXNzYXJ5IGluZm8uCisgKi8KK3N0YXRpYyBpbnQgZHVtcF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3Qgdm9pZCAqYWRkciwgaW50IG5yKQoreworCXJldHVybiBmaWxlLT5mX29wLT53cml0ZShmaWxlLCBhZGRyLCBuciwgJmZpbGUtPmZfcG9zKSA9PSBucjsKK30KKworc3RhdGljIGludCBkdW1wX3NlZWsoc3RydWN0IGZpbGUgKmZpbGUsIG9mZl90IG9mZikKK3sKKwlpZiAoZmlsZS0+Zl9vcC0+bGxzZWVrKSB7CisJCWlmIChmaWxlLT5mX29wLT5sbHNlZWsoZmlsZSwgb2ZmLCAwKSAhPSBvZmYpCisJCQlyZXR1cm4gMDsKKwl9IGVsc2UKKwkJZmlsZS0+Zl9wb3MgPSBvZmY7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBEZWNpZGUgd2hldGhlciBhIHNlZ21lbnQgaXMgd29ydGggZHVtcGluZzsgZGVmYXVsdCBpcyB5ZXMgdG8gYmUKKyAqIHN1cmUgKG1pc3NpbmcgaW5mbyBpcyB3b3JzZSB0aGFuIHRvbyBtdWNoOyBldGMpLgorICogUGVyc29uYWxseSBJJ2QgaW5jbHVkZSBldmVyeXRoaW5nLCBhbmQgdXNlIHRoZSBjb3JlZHVtcCBsaW1pdC4uLgorICoKKyAqIEkgdGhpbmsgd2Ugc2hvdWxkIHNraXAgc29tZXRoaW5nLiBCdXQgSSBhbSBub3Qgc3VyZSBob3cuIEguSi4KKyAqLworc3RhdGljIGludCBtYXlkdW1wKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCS8qIERvIG5vdCBkdW1wIEkvTyBtYXBwZWQgZGV2aWNlcyBvciBzcGVjaWFsIG1hcHBpbmdzICovCisJaWYgKHZtYS0+dm1fZmxhZ3MgJiAoVk1fSU8gfCBWTV9SRVNFUlZFRCkpCisJCXJldHVybiAwOworCisJLyogRHVtcCBzaGFyZWQgbWVtb3J5IG9ubHkgaWYgbWFwcGVkIGZyb20gYW4gYW5vbnltb3VzIGZpbGUuICAqLworCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fU0hBUkVEKQorCQlyZXR1cm4gdm1hLT52bV9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9ubGluayA9PSAwOworCisJLyogSWYgaXQgaGFzbid0IGJlZW4gd3JpdHRlbiB0bywgZG9uJ3Qgd3JpdGUgaXQgb3V0ICovCisJaWYgKCF2bWEtPmFub25fdm1hKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCisjZGVmaW5lIHJvdW5kdXAoeCwgeSkgICgoKCh4KSsoKHkpLTEpKS8oeSkpKih5KSkKKworLyogQW4gRUxGIG5vdGUgaW4gbWVtb3J5ICovCitzdHJ1Y3QgbWVtZWxmbm90ZQoreworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IHR5cGU7CisJdW5zaWduZWQgaW50IGRhdGFzejsKKwl2b2lkICpkYXRhOworfTsKKworc3RhdGljIGludCBub3Rlc2l6ZShzdHJ1Y3QgbWVtZWxmbm90ZSAqZW4pCit7CisJaW50IHN6OworCisJc3ogPSBzaXplb2Yoc3RydWN0IGVsZl9ub3RlKTsKKwlzeiArPSByb3VuZHVwKHN0cmxlbihlbi0+bmFtZSkgKyAxLCA0KTsKKwlzeiArPSByb3VuZHVwKGVuLT5kYXRhc3osIDQpOworCisJcmV0dXJuIHN6OworfQorCisjZGVmaW5lIERVTVBfV1JJVEUoYWRkciwgbnIpCVwKKwlkbyB7IGlmICghZHVtcF93cml0ZShmaWxlLCAoYWRkciksIChucikpKSByZXR1cm4gMDsgfSB3aGlsZSgwKQorI2RlZmluZSBEVU1QX1NFRUsob2ZmKQlcCisJZG8geyBpZiAoIWR1bXBfc2VlayhmaWxlLCAob2ZmKSkpIHJldHVybiAwOyB9IHdoaWxlKDApCisKK3N0YXRpYyBpbnQgd3JpdGVub3RlKHN0cnVjdCBtZW1lbGZub3RlICptZW4sIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBlbGZfbm90ZSBlbjsKKworCWVuLm5fbmFtZXN6ID0gc3RybGVuKG1lbi0+bmFtZSkgKyAxOworCWVuLm5fZGVzY3N6ID0gbWVuLT5kYXRhc3o7CisJZW4ubl90eXBlID0gbWVuLT50eXBlOworCisJRFVNUF9XUklURSgmZW4sIHNpemVvZihlbikpOworCURVTVBfV1JJVEUobWVuLT5uYW1lLCBlbi5uX25hbWVzeik7CisJLyogWFhYIC0gY2FzdCBmcm9tIGxvbmcgbG9uZyB0byBsb25nIHRvIGF2b2lkIG5lZWQgZm9yIGxpYmdjYy5hICovCisJRFVNUF9TRUVLKHJvdW5kdXAoKHVuc2lnbmVkIGxvbmcpZmlsZS0+Zl9wb3MsIDQpKTsJLyogWFhYICovCisJRFVNUF9XUklURShtZW4tPmRhdGEsIG1lbi0+ZGF0YXN6KTsKKwlEVU1QX1NFRUsocm91bmR1cCgodW5zaWduZWQgbG9uZylmaWxlLT5mX3BvcywgNCkpOwkvKiBYWFggKi8KKworCXJldHVybiAxOworfQorI3VuZGVmIERVTVBfV1JJVEUKKyN1bmRlZiBEVU1QX1NFRUsKKworI2RlZmluZSBEVU1QX1dSSVRFKGFkZHIsIG5yKQlcCisJaWYgKChzaXplICs9IChucikpID4gbGltaXQgfHwgIWR1bXBfd3JpdGUoZmlsZSwgKGFkZHIpLCAobnIpKSkgXAorCQlnb3RvIGVuZF9jb3JlZHVtcDsKKyNkZWZpbmUgRFVNUF9TRUVLKG9mZikJXAorCWlmICghZHVtcF9zZWVrKGZpbGUsIChvZmYpKSkgXAorCQlnb3RvIGVuZF9jb3JlZHVtcDsKKworc3RhdGljIGlubGluZSB2b2lkIGZpbGxfZWxmX2hlYWRlcihzdHJ1Y3QgZWxmaGRyICplbGYsIGludCBzZWdzKQoreworCW1lbWNweShlbGYtPmVfaWRlbnQsIEVMRk1BRywgU0VMRk1BRyk7CisJZWxmLT5lX2lkZW50W0VJX0NMQVNTXSA9IEVMRl9DTEFTUzsKKwllbGYtPmVfaWRlbnRbRUlfREFUQV0gPSBFTEZfREFUQTsKKwllbGYtPmVfaWRlbnRbRUlfVkVSU0lPTl0gPSBFVl9DVVJSRU5UOworCWVsZi0+ZV9pZGVudFtFSV9PU0FCSV0gPSBFTEZfT1NBQkk7CisJbWVtc2V0KGVsZi0+ZV9pZGVudCtFSV9QQUQsIDAsIEVJX05JREVOVC1FSV9QQUQpOworCisJZWxmLT5lX3R5cGUgPSBFVF9DT1JFOworCWVsZi0+ZV9tYWNoaW5lID0gRUxGX0FSQ0g7CisJZWxmLT5lX3ZlcnNpb24gPSBFVl9DVVJSRU5UOworCWVsZi0+ZV9lbnRyeSA9IDA7CisJZWxmLT5lX3Bob2ZmID0gc2l6ZW9mKHN0cnVjdCBlbGZoZHIpOworCWVsZi0+ZV9zaG9mZiA9IDA7CisJZWxmLT5lX2ZsYWdzID0gRUxGX0NPUkVfRUZMQUdTOworCWVsZi0+ZV9laHNpemUgPSBzaXplb2Yoc3RydWN0IGVsZmhkcik7CisJZWxmLT5lX3BoZW50c2l6ZSA9IHNpemVvZihzdHJ1Y3QgZWxmX3BoZHIpOworCWVsZi0+ZV9waG51bSA9IHNlZ3M7CisJZWxmLT5lX3NoZW50c2l6ZSA9IDA7CisJZWxmLT5lX3NobnVtID0gMDsKKwllbGYtPmVfc2hzdHJuZHggPSAwOworCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZpbGxfZWxmX25vdGVfcGhkcihzdHJ1Y3QgZWxmX3BoZHIgKnBoZHIsIGludCBzeiwgb2ZmX3Qgb2Zmc2V0KQoreworCXBoZHItPnBfdHlwZSA9IFBUX05PVEU7CisJcGhkci0+cF9vZmZzZXQgPSBvZmZzZXQ7CisJcGhkci0+cF92YWRkciA9IDA7CisJcGhkci0+cF9wYWRkciA9IDA7CisJcGhkci0+cF9maWxlc3ogPSBzejsKKwlwaGRyLT5wX21lbXN6ID0gMDsKKwlwaGRyLT5wX2ZsYWdzID0gMDsKKwlwaGRyLT5wX2FsaWduID0gMDsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfbm90ZShzdHJ1Y3QgbWVtZWxmbm90ZSAqbm90ZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IHR5cGUsIAorCQl1bnNpZ25lZCBpbnQgc3osIHZvaWQgKmRhdGEpCit7CisJbm90ZS0+bmFtZSA9IG5hbWU7CisJbm90ZS0+dHlwZSA9IHR5cGU7CisJbm90ZS0+ZGF0YXN6ID0gc3o7CisJbm90ZS0+ZGF0YSA9IGRhdGE7CisJcmV0dXJuOworfQorCisvKgorICogZmlsbCB1cCBhbGwgdGhlIGZpZWxkcyBpbiBwcnN0YXR1cyBmcm9tIHRoZSBnaXZlbiB0YXNrIHN0cnVjdCwgZXhjZXB0IHJlZ2lzdGVycworICogd2hpY2ggbmVlZCB0byBiZSBmaWxsZWQgdXAgc2VwYXJhdGVseS4KKyAqLworc3RhdGljIHZvaWQgZmlsbF9wcnN0YXR1cyhzdHJ1Y3QgZWxmX3Byc3RhdHVzICpwcnN0YXR1cywKKwkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgbG9uZyBzaWducikgCit7CisJcHJzdGF0dXMtPnByX2luZm8uc2lfc2lnbm8gPSBwcnN0YXR1cy0+cHJfY3Vyc2lnID0gc2lnbnI7CisJcHJzdGF0dXMtPnByX3NpZ3BlbmQgPSBwLT5wZW5kaW5nLnNpZ25hbC5zaWdbMF07CisJcHJzdGF0dXMtPnByX3NpZ2hvbGQgPSBwLT5ibG9ja2VkLnNpZ1swXTsKKwlwcnN0YXR1cy0+cHJfcGlkID0gcC0+cGlkOworCXByc3RhdHVzLT5wcl9wcGlkID0gcC0+cGFyZW50LT5waWQ7CisJcHJzdGF0dXMtPnByX3BncnAgPSBwcm9jZXNzX2dyb3VwKHApOworCXByc3RhdHVzLT5wcl9zaWQgPSBwLT5zaWduYWwtPnNlc3Npb247CisJaWYgKHRocmVhZF9ncm91cF9sZWFkZXIocCkpIHsKKwkJLyoKKwkJICogVGhpcyBpcyB0aGUgcmVjb3JkIGZvciB0aGUgZ3JvdXAgbGVhZGVyLiAgQWRkIGluIHRoZQorCQkgKiBjdW11bGF0aXZlIHRpbWVzIG9mIHByZXZpb3VzIGRlYWQgdGhyZWFkcy4gIFRoaXMgdG90YWwKKwkJICogd29uJ3QgaW5jbHVkZSB0aGUgdGltZSBvZiBlYWNoIGxpdmUgdGhyZWFkIHdob3NlIHN0YXRlCisJCSAqIGlzIGluY2x1ZGVkIGluIHRoZSBjb3JlIGR1bXAuICBUaGUgZmluYWwgdG90YWwgcmVwb3J0ZWQKKwkJICogdG8gb3VyIHBhcmVudCBwcm9jZXNzIHdoZW4gaXQgY2FsbHMgd2FpdDQgd2lsbCBpbmNsdWRlCisJCSAqIHRob3NlIHN1bXMgYXMgd2VsbCBhcyB0aGUgbGl0dGxlIGJpdCBtb3JlIHRpbWUgaXQgdGFrZXMKKwkJICogdGhpcyBhbmQgZWFjaCBvdGhlciB0aHJlYWQgdG8gZmluaXNoIGR5aW5nIGFmdGVyIHRoZQorCQkgKiBjb3JlIGR1bXAgc3luY2hyb25pemF0aW9uIHBoYXNlLgorCQkgKi8KKwkJY3B1dGltZV90b190aW1ldmFsKGNwdXRpbWVfYWRkKHAtPnV0aW1lLCBwLT5zaWduYWwtPnV0aW1lKSwKKwkJCQkgICAmcHJzdGF0dXMtPnByX3V0aW1lKTsKKwkJY3B1dGltZV90b190aW1ldmFsKGNwdXRpbWVfYWRkKHAtPnN0aW1lLCBwLT5zaWduYWwtPnN0aW1lKSwKKwkJCQkgICAmcHJzdGF0dXMtPnByX3N0aW1lKTsKKwl9IGVsc2UgeworCQljcHV0aW1lX3RvX3RpbWV2YWwocC0+dXRpbWUsICZwcnN0YXR1cy0+cHJfdXRpbWUpOworCQljcHV0aW1lX3RvX3RpbWV2YWwocC0+c3RpbWUsICZwcnN0YXR1cy0+cHJfc3RpbWUpOworCX0KKwljcHV0aW1lX3RvX3RpbWV2YWwocC0+c2lnbmFsLT5jdXRpbWUsICZwcnN0YXR1cy0+cHJfY3V0aW1lKTsKKwljcHV0aW1lX3RvX3RpbWV2YWwocC0+c2lnbmFsLT5jc3RpbWUsICZwcnN0YXR1cy0+cHJfY3N0aW1lKTsKK30KKworc3RhdGljIGludCBmaWxsX3BzaW5mbyhzdHJ1Y3QgZWxmX3BycHNpbmZvICpwc2luZm8sIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwKKwkJICAgICAgIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCWludCBpLCBsZW47CisJCisJLyogZmlyc3QgY29weSB0aGUgcGFyYW1ldGVycyBmcm9tIHVzZXIgc3BhY2UgKi8KKwltZW1zZXQocHNpbmZvLCAwLCBzaXplb2Yoc3RydWN0IGVsZl9wcnBzaW5mbykpOworCisJbGVuID0gbW0tPmFyZ19lbmQgLSBtbS0+YXJnX3N0YXJ0OworCWlmIChsZW4gPj0gRUxGX1BSQVJHU1opCisJCWxlbiA9IEVMRl9QUkFSR1NaLTE7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZwc2luZm8tPnByX3BzYXJncywKKwkJICAgICAgICAgICAoY29uc3QgY2hhciBfX3VzZXIgKiltbS0+YXJnX3N0YXJ0LCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlmb3IoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJaWYgKHBzaW5mby0+cHJfcHNhcmdzW2ldID09IDApCisJCQlwc2luZm8tPnByX3BzYXJnc1tpXSA9ICcgJzsKKwlwc2luZm8tPnByX3BzYXJnc1tsZW5dID0gMDsKKworCXBzaW5mby0+cHJfcGlkID0gcC0+cGlkOworCXBzaW5mby0+cHJfcHBpZCA9IHAtPnBhcmVudC0+cGlkOworCXBzaW5mby0+cHJfcGdycCA9IHByb2Nlc3NfZ3JvdXAocCk7CisJcHNpbmZvLT5wcl9zaWQgPSBwLT5zaWduYWwtPnNlc3Npb247CisKKwlpID0gcC0+c3RhdGUgPyBmZnoofnAtPnN0YXRlKSArIDEgOiAwOworCXBzaW5mby0+cHJfc3RhdGUgPSBpOworCXBzaW5mby0+cHJfc25hbWUgPSAoaSA8IDAgfHwgaSA+IDUpID8gJy4nIDogIlJTRFRaVyJbaV07CisJcHNpbmZvLT5wcl96b21iID0gcHNpbmZvLT5wcl9zbmFtZSA9PSAnWic7CisJcHNpbmZvLT5wcl9uaWNlID0gdGFza19uaWNlKHApOworCXBzaW5mby0+cHJfZmxhZyA9IHAtPmZsYWdzOworCVNFVF9VSUQocHNpbmZvLT5wcl91aWQsIHAtPnVpZCk7CisJU0VUX0dJRChwc2luZm8tPnByX2dpZCwgcC0+Z2lkKTsKKwlzdHJuY3B5KHBzaW5mby0+cHJfZm5hbWUsIHAtPmNvbW0sIHNpemVvZihwc2luZm8tPnByX2ZuYW1lKSk7CisJCisJcmV0dXJuIDA7Cit9CisKKy8qIEhlcmUgaXMgdGhlIHN0cnVjdHVyZSBpbiB3aGljaCBzdGF0dXMgb2YgZWFjaCB0aHJlYWQgaXMgY2FwdHVyZWQuICovCitzdHJ1Y3QgZWxmX3RocmVhZF9zdGF0dXMKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGVsZl9wcnN0YXR1cyBwcnN0YXR1czsJLyogTlRfUFJTVEFUVVMgKi8KKwllbGZfZnByZWdzZXRfdCBmcHU7CQkvKiBOVF9QUkZQUkVHICovCisJc3RydWN0IHRhc2tfc3RydWN0ICp0aHJlYWQ7CisjaWZkZWYgRUxGX0NPUkVfQ09QWV9YRlBSRUdTCisJZWxmX2ZweHJlZ3NldF90IHhmcHU7CQkvKiBOVF9QUlhGUFJFRyAqLworI2VuZGlmCisJc3RydWN0IG1lbWVsZm5vdGUgbm90ZXNbM107CisJaW50IG51bV9ub3RlczsKK307CisKKy8qCisgKiBJbiBvcmRlciB0byBhZGQgdGhlIHNwZWNpZmljIHRocmVhZCBpbmZvcm1hdGlvbiBmb3IgdGhlIGVsZiBmaWxlIGZvcm1hdCwKKyAqIHdlIG5lZWQgdG8ga2VlcCBhIGxpbmtlZCBsaXN0IG9mIGV2ZXJ5IHRocmVhZHMgcHJfc3RhdHVzIGFuZCB0aGVuCisgKiBjcmVhdGUgYSBzaW5nbGUgc2VjdGlvbiBmb3IgdGhlbSBpbiB0aGUgZmluYWwgY29yZSBmaWxlLgorICovCitzdGF0aWMgaW50IGVsZl9kdW1wX3RocmVhZF9zdGF0dXMobG9uZyBzaWduciwgc3RydWN0IGVsZl90aHJlYWRfc3RhdHVzICp0KQoreworCWludCBzeiA9IDA7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwID0gdC0+dGhyZWFkOworCXQtPm51bV9ub3RlcyA9IDA7CisKKwlmaWxsX3Byc3RhdHVzKCZ0LT5wcnN0YXR1cywgcCwgc2lnbnIpOworCWVsZl9jb3JlX2NvcHlfdGFza19yZWdzKHAsICZ0LT5wcnN0YXR1cy5wcl9yZWcpOwkKKwkKKwlmaWxsX25vdGUoJnQtPm5vdGVzWzBdLCAiQ09SRSIsIE5UX1BSU1RBVFVTLCBzaXplb2YodC0+cHJzdGF0dXMpLCAmKHQtPnByc3RhdHVzKSk7CisJdC0+bnVtX25vdGVzKys7CisJc3ogKz0gbm90ZXNpemUoJnQtPm5vdGVzWzBdKTsKKworCWlmICgodC0+cHJzdGF0dXMucHJfZnB2YWxpZCA9IGVsZl9jb3JlX2NvcHlfdGFza19mcHJlZ3MocCwgTlVMTCwgJnQtPmZwdSkpKSB7CisJCWZpbGxfbm90ZSgmdC0+bm90ZXNbMV0sICJDT1JFIiwgTlRfUFJGUFJFRywgc2l6ZW9mKHQtPmZwdSksICYodC0+ZnB1KSk7CisJCXQtPm51bV9ub3RlcysrOworCQlzeiArPSBub3Rlc2l6ZSgmdC0+bm90ZXNbMV0pOworCX0KKworI2lmZGVmIEVMRl9DT1JFX0NPUFlfWEZQUkVHUworCWlmIChlbGZfY29yZV9jb3B5X3Rhc2tfeGZwcmVncyhwLCAmdC0+eGZwdSkpIHsKKwkJZmlsbF9ub3RlKCZ0LT5ub3Rlc1syXSwgIkxJTlVYIiwgTlRfUFJYRlBSRUcsIHNpemVvZih0LT54ZnB1KSwgJnQtPnhmcHUpOworCQl0LT5udW1fbm90ZXMrKzsKKwkJc3ogKz0gbm90ZXNpemUoJnQtPm5vdGVzWzJdKTsKKwl9CisjZW5kaWYJCisJcmV0dXJuIHN6OworfQorCisvKgorICogQWN0dWFsIGR1bXBlcgorICoKKyAqIFRoaXMgaXMgYSB0d28tcGFzcyBwcm9jZXNzOyBmaXJzdCB3ZSBmaW5kIHRoZSBvZmZzZXRzIG9mIHRoZSBiaXRzLAorICogYW5kIHRoZW4gdGhleSBhcmUgYWN0dWFsbHkgd3JpdHRlbiBvdXQuICBJZiB3ZSBydW4gb3V0IG9mIGNvcmUgbGltaXQKKyAqIHdlIGp1c3QgdHJ1bmNhdGUuCisgKi8KK3N0YXRpYyBpbnQgZWxmX2NvcmVfZHVtcChsb25nIHNpZ25yLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIHN0cnVjdCBmaWxlICogZmlsZSkKK3sKKyNkZWZpbmUJTlVNX05PVEVTCTYKKwlpbnQgaGFzX2R1bXBlZCA9IDA7CisJbW1fc2VnbWVudF90IGZzOworCWludCBzZWdzOworCXNpemVfdCBzaXplID0gMDsKKwlpbnQgaTsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKwlzdHJ1Y3QgZWxmaGRyICplbGYgPSBOVUxMOworCW9mZl90IG9mZnNldCA9IDAsIGRhdGFvZmY7CisJdW5zaWduZWQgbG9uZyBsaW1pdCA9IGN1cnJlbnQtPnNpZ25hbC0+cmxpbVtSTElNSVRfQ09SRV0ucmxpbV9jdXI7CisJaW50IG51bW5vdGU7CisJc3RydWN0IG1lbWVsZm5vdGUgKm5vdGVzID0gTlVMTDsKKwlzdHJ1Y3QgZWxmX3Byc3RhdHVzICpwcnN0YXR1cyA9IE5VTEw7CS8qIE5UX1BSU1RBVFVTICovCisJc3RydWN0IGVsZl9wcnBzaW5mbyAqcHNpbmZvID0gTlVMTDsJLyogTlRfUFJQU0lORk8gKi8KKyAJc3RydWN0IHRhc2tfc3RydWN0ICpnLCAqcDsKKyAJTElTVF9IRUFEKHRocmVhZF9saXN0KTsKKyAJc3RydWN0IGxpc3RfaGVhZCAqdDsKKwllbGZfZnByZWdzZXRfdCAqZnB1ID0gTlVMTDsKKyNpZmRlZiBFTEZfQ09SRV9DT1BZX1hGUFJFR1MKKwllbGZfZnB4cmVnc2V0X3QgKnhmcHUgPSBOVUxMOworI2VuZGlmCisJaW50IHRocmVhZF9zdGF0dXNfc2l6ZSA9IDA7CisJZWxmX2FkZHJfdCAqYXV4djsKKworCS8qCisJICogV2Ugbm8gbG9uZ2VyIHN0b3AgYWxsIFZNIG9wZXJhdGlvbnMuCisJICogCisJICogVGhpcyBpcyBiZWNhdXNlIHRob3NlIHByb2Nlc2VzIHRoYXQgY291bGQgcG9zc2libHkgY2hhbmdlIG1hcF9jb3VudCBvcgorCSAqIHRoZSBtbWFwIC8gdm1hIHBhZ2VzIGFyZSBub3cgYmxvY2tlZCBpbiBkb19leGl0IG9uIGN1cnJlbnQgZmluaXNoaW5nCisJICogdGhpcyBjb3JlIGR1bXAuCisJICoKKwkgKiBPbmx5IHB0cmFjZSBjYW4gdG91Y2ggdGhlc2UgbWVtb3J5IGFkZHJlc3NlcywgYnV0IGl0IGRvZXNuJ3QgY2hhbmdlCisJICogdGhlIG1hcF9jb3VudCBvciB0aGUgcGFnZXMgYWxsb2NhdGVkLiAgU28gbm8gcG9zc2liaWxpdHkgb2YgY3Jhc2hpbmcKKwkgKiBleGlzdHMgd2hpbGUgZHVtcGluZyB0aGUgbW0tPnZtX25leHQgYXJlYXMgdG8gdGhlIGNvcmUgZmlsZS4KKwkgKi8KKyAgCisJLyogYWxsb2MgbWVtb3J5IGZvciBsYXJnZSBkYXRhIHN0cnVjdHVyZXM6IHRvbyBsYXJnZSB0byBiZSBvbiBzdGFjayAqLworCWVsZiA9IGttYWxsb2Moc2l6ZW9mKCplbGYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVsZikKKwkJZ290byBjbGVhbnVwOworCXByc3RhdHVzID0ga21hbGxvYyhzaXplb2YoKnByc3RhdHVzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcnN0YXR1cykKKwkJZ290byBjbGVhbnVwOworCXBzaW5mbyA9IGttYWxsb2Moc2l6ZW9mKCpwc2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBzaW5mbykKKwkJZ290byBjbGVhbnVwOworCW5vdGVzID0ga21hbGxvYyhOVU1fTk9URVMgKiBzaXplb2Yoc3RydWN0IG1lbWVsZm5vdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5vdGVzKQorCQlnb3RvIGNsZWFudXA7CisJZnB1ID0ga21hbGxvYyhzaXplb2YoKmZwdSksIEdGUF9LRVJORUwpOworCWlmICghZnB1KQorCQlnb3RvIGNsZWFudXA7CisjaWZkZWYgRUxGX0NPUkVfQ09QWV9YRlBSRUdTCisJeGZwdSA9IGttYWxsb2Moc2l6ZW9mKCp4ZnB1KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF4ZnB1KQorCQlnb3RvIGNsZWFudXA7CisjZW5kaWYKKworCWlmIChzaWducikgeworCQlzdHJ1Y3QgZWxmX3RocmVhZF9zdGF0dXMgKnRtcDsKKwkJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwkJZG9fZWFjaF90aHJlYWQoZyxwKQorCQkJaWYgKGN1cnJlbnQtPm1tID09IHAtPm1tICYmIGN1cnJlbnQgIT0gcCkgeworCQkJCXRtcCA9IGttYWxsb2Moc2l6ZW9mKCp0bXApLCBHRlBfQVRPTUlDKTsKKwkJCQlpZiAoIXRtcCkgeworCQkJCQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisJCQkJCWdvdG8gY2xlYW51cDsKKwkJCQl9CisJCQkJbWVtc2V0KHRtcCwgMCwgc2l6ZW9mKCp0bXApKTsKKwkJCQlJTklUX0xJU1RfSEVBRCgmdG1wLT5saXN0KTsKKwkJCQl0bXAtPnRocmVhZCA9IHA7CisJCQkJbGlzdF9hZGQoJnRtcC0+bGlzdCwgJnRocmVhZF9saXN0KTsKKwkJCX0KKwkJd2hpbGVfZWFjaF90aHJlYWQoZyxwKTsKKwkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCQlsaXN0X2Zvcl9lYWNoKHQsICZ0aHJlYWRfbGlzdCkgeworCQkJc3RydWN0IGVsZl90aHJlYWRfc3RhdHVzICp0bXA7CisJCQlpbnQgc3o7CisKKwkJCXRtcCA9IGxpc3RfZW50cnkodCwgc3RydWN0IGVsZl90aHJlYWRfc3RhdHVzLCBsaXN0KTsKKwkJCXN6ID0gZWxmX2R1bXBfdGhyZWFkX3N0YXR1cyhzaWduciwgdG1wKTsKKwkJCXRocmVhZF9zdGF0dXNfc2l6ZSArPSBzejsKKwkJfQorCX0KKwkvKiBub3cgY29sbGVjdCB0aGUgZHVtcCBmb3IgdGhlIGN1cnJlbnQgKi8KKwltZW1zZXQocHJzdGF0dXMsIDAsIHNpemVvZigqcHJzdGF0dXMpKTsKKwlmaWxsX3Byc3RhdHVzKHByc3RhdHVzLCBjdXJyZW50LCBzaWducik7CisJZWxmX2NvcmVfY29weV9yZWdzKCZwcnN0YXR1cy0+cHJfcmVnLCByZWdzKTsKKwkKKwlzZWdzID0gY3VycmVudC0+bW0tPm1hcF9jb3VudDsKKyNpZmRlZiBFTEZfQ09SRV9FWFRSQV9QSERSUworCXNlZ3MgKz0gRUxGX0NPUkVfRVhUUkFfUEhEUlM7CisjZW5kaWYKKworCS8qIFNldCB1cCBoZWFkZXIgKi8KKwlmaWxsX2VsZl9oZWFkZXIoZWxmLCBzZWdzKzEpOwkvKiBpbmNsdWRpbmcgbm90ZXMgc2VjdGlvbiAqLworCisJaGFzX2R1bXBlZCA9IDE7CisJY3VycmVudC0+ZmxhZ3MgfD0gUEZfRFVNUENPUkU7CisKKwkvKgorCSAqIFNldCB1cCB0aGUgbm90ZXMgaW4gc2ltaWxhciBmb3JtIHRvIFNWUjQgY29yZSBkdW1wcyBtYWRlCisJICogd2l0aCBpbmZvIGZyb20gdGhlaXIgL3Byb2MuCisJICovCisKKwlmaWxsX25vdGUobm90ZXMgKzAsICJDT1JFIiwgTlRfUFJTVEFUVVMsIHNpemVvZigqcHJzdGF0dXMpLCBwcnN0YXR1cyk7CisJCisJZmlsbF9wc2luZm8ocHNpbmZvLCBjdXJyZW50LT5ncm91cF9sZWFkZXIsIGN1cnJlbnQtPm1tKTsKKwlmaWxsX25vdGUobm90ZXMgKzEsICJDT1JFIiwgTlRfUFJQU0lORk8sIHNpemVvZigqcHNpbmZvKSwgcHNpbmZvKTsKKwkKKwlmaWxsX25vdGUobm90ZXMgKzIsICJDT1JFIiwgTlRfVEFTS1NUUlVDVCwgc2l6ZW9mKCpjdXJyZW50KSwgY3VycmVudCk7CisgIAorCW51bW5vdGUgPSAzOworCisJYXV4diA9IChlbGZfYWRkcl90ICopIGN1cnJlbnQtPm1tLT5zYXZlZF9hdXh2OworCisJaSA9IDA7CisJZG8KKwkJaSArPSAyOworCXdoaWxlIChhdXh2W2kgLSAyXSAhPSBBVF9OVUxMKTsKKwlmaWxsX25vdGUoJm5vdGVzW251bW5vdGUrK10sICJDT1JFIiwgTlRfQVVYViwKKwkJICBpICogc2l6ZW9mIChlbGZfYWRkcl90KSwgYXV4dik7CisKKyAgCS8qIFRyeSB0byBkdW1wIHRoZSBGUFUuICovCisJaWYgKChwcnN0YXR1cy0+cHJfZnB2YWxpZCA9IGVsZl9jb3JlX2NvcHlfdGFza19mcHJlZ3MoY3VycmVudCwgcmVncywgZnB1KSkpCisJCWZpbGxfbm90ZShub3RlcyArIG51bW5vdGUrKywKKwkJCSAgIkNPUkUiLCBOVF9QUkZQUkVHLCBzaXplb2YoKmZwdSksIGZwdSk7CisjaWZkZWYgRUxGX0NPUkVfQ09QWV9YRlBSRUdTCisJaWYgKGVsZl9jb3JlX2NvcHlfdGFza194ZnByZWdzKGN1cnJlbnQsIHhmcHUpKQorCQlmaWxsX25vdGUobm90ZXMgKyBudW1ub3RlKyssCisJCQkgICJMSU5VWCIsIE5UX1BSWEZQUkVHLCBzaXplb2YoKnhmcHUpLCB4ZnB1KTsKKyNlbmRpZgkKKyAgCisJZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKworCURVTVBfV1JJVEUoZWxmLCBzaXplb2YoKmVsZikpOworCW9mZnNldCArPSBzaXplb2YoKmVsZik7CQkJCS8qIEVsZiBoZWFkZXIgKi8KKwlvZmZzZXQgKz0gKHNlZ3MrMSkgKiBzaXplb2Yoc3RydWN0IGVsZl9waGRyKTsJLyogUHJvZ3JhbSBoZWFkZXJzICovCisKKwkvKiBXcml0ZSBub3RlcyBwaGRyIGVudHJ5ICovCisJeworCQlzdHJ1Y3QgZWxmX3BoZHIgcGhkcjsKKwkJaW50IHN6ID0gMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgbnVtbm90ZTsgaSsrKQorCQkJc3ogKz0gbm90ZXNpemUobm90ZXMgKyBpKTsKKwkJCisJCXN6ICs9IHRocmVhZF9zdGF0dXNfc2l6ZTsKKworCQlmaWxsX2VsZl9ub3RlX3BoZHIoJnBoZHIsIHN6LCBvZmZzZXQpOworCQlvZmZzZXQgKz0gc3o7CisJCURVTVBfV1JJVEUoJnBoZHIsIHNpemVvZihwaGRyKSk7CisJfQorCisJLyogUGFnZS1hbGlnbiBkdW1wZWQgZGF0YSAqLworCWRhdGFvZmYgPSBvZmZzZXQgPSByb3VuZHVwKG9mZnNldCwgRUxGX0VYRUNfUEFHRVNJWkUpOworCisJLyogV3JpdGUgcHJvZ3JhbSBoZWFkZXJzIGZvciBzZWdtZW50cyBkdW1wICovCisJZm9yICh2bWEgPSBjdXJyZW50LT5tbS0+bW1hcDsgdm1hICE9IE5VTEw7IHZtYSA9IHZtYS0+dm1fbmV4dCkgeworCQlzdHJ1Y3QgZWxmX3BoZHIgcGhkcjsKKwkJc2l6ZV90IHN6OworCisJCXN6ID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OworCisJCXBoZHIucF90eXBlID0gUFRfTE9BRDsKKwkJcGhkci5wX29mZnNldCA9IG9mZnNldDsKKwkJcGhkci5wX3ZhZGRyID0gdm1hLT52bV9zdGFydDsKKwkJcGhkci5wX3BhZGRyID0gMDsKKwkJcGhkci5wX2ZpbGVzeiA9IG1heWR1bXAodm1hKSA/IHN6IDogMDsKKwkJcGhkci5wX21lbXN6ID0gc3o7CisJCW9mZnNldCArPSBwaGRyLnBfZmlsZXN6OworCQlwaGRyLnBfZmxhZ3MgPSB2bWEtPnZtX2ZsYWdzICYgVk1fUkVBRCA/IFBGX1IgOiAwOworCQlpZiAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSBwaGRyLnBfZmxhZ3MgfD0gUEZfVzsKKwkJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9FWEVDKSBwaGRyLnBfZmxhZ3MgfD0gUEZfWDsKKwkJcGhkci5wX2FsaWduID0gRUxGX0VYRUNfUEFHRVNJWkU7CisKKwkJRFVNUF9XUklURSgmcGhkciwgc2l6ZW9mKHBoZHIpKTsKKwl9CisKKyNpZmRlZiBFTEZfQ09SRV9XUklURV9FWFRSQV9QSERSUworCUVMRl9DT1JFX1dSSVRFX0VYVFJBX1BIRFJTOworI2VuZGlmCisKKyAJLyogd3JpdGUgb3V0IHRoZSBub3RlcyBzZWN0aW9uICovCisJZm9yIChpID0gMDsgaSA8IG51bW5vdGU7IGkrKykKKwkJaWYgKCF3cml0ZW5vdGUobm90ZXMgKyBpLCBmaWxlKSkKKwkJCWdvdG8gZW5kX2NvcmVkdW1wOworCisJLyogd3JpdGUgb3V0IHRoZSB0aHJlYWQgc3RhdHVzIG5vdGVzIHNlY3Rpb24gKi8KKwlsaXN0X2Zvcl9lYWNoKHQsICZ0aHJlYWRfbGlzdCkgeworCQlzdHJ1Y3QgZWxmX3RocmVhZF9zdGF0dXMgKnRtcCA9IGxpc3RfZW50cnkodCwgc3RydWN0IGVsZl90aHJlYWRfc3RhdHVzLCBsaXN0KTsKKwkJZm9yIChpID0gMDsgaSA8IHRtcC0+bnVtX25vdGVzOyBpKyspCisJCQlpZiAoIXdyaXRlbm90ZSgmdG1wLT5ub3Rlc1tpXSwgZmlsZSkpCisJCQkJZ290byBlbmRfY29yZWR1bXA7CisJfQorIAorCURVTVBfU0VFSyhkYXRhb2ZmKTsKKworCWZvciAodm1hID0gY3VycmVudC0+bW0tPm1tYXA7IHZtYSAhPSBOVUxMOyB2bWEgPSB2bWEtPnZtX25leHQpIHsKKwkJdW5zaWduZWQgbG9uZyBhZGRyOworCisJCWlmICghbWF5ZHVtcCh2bWEpKQorCQkJY29udGludWU7CisKKwkJZm9yIChhZGRyID0gdm1hLT52bV9zdGFydDsKKwkJICAgICBhZGRyIDwgdm1hLT52bV9lbmQ7CisJCSAgICAgYWRkciArPSBQQUdFX1NJWkUpIHsKKwkJCXN0cnVjdCBwYWdlKiBwYWdlOworCQkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisKKwkJCWlmIChnZXRfdXNlcl9wYWdlcyhjdXJyZW50LCBjdXJyZW50LT5tbSwgYWRkciwgMSwgMCwgMSwKKwkJCQkJCSZwYWdlLCAmdm1hKSA8PSAwKSB7CisJCQkJRFVNUF9TRUVLIChmaWxlLT5mX3BvcyArIFBBR0VfU0laRSk7CisJCQl9IGVsc2UgeworCQkJCWlmIChwYWdlID09IFpFUk9fUEFHRShhZGRyKSkgeworCQkJCQlEVU1QX1NFRUsgKGZpbGUtPmZfcG9zICsgUEFHRV9TSVpFKTsKKwkJCQl9IGVsc2UgeworCQkJCQl2b2lkICprYWRkcjsKKwkJCQkJZmx1c2hfY2FjaGVfcGFnZSh2bWEsIGFkZHIsIHBhZ2VfdG9fcGZuKHBhZ2UpKTsKKwkJCQkJa2FkZHIgPSBrbWFwKHBhZ2UpOworCQkJCQlpZiAoKHNpemUgKz0gUEFHRV9TSVpFKSA+IGxpbWl0IHx8CisJCQkJCSAgICAhZHVtcF93cml0ZShmaWxlLCBrYWRkciwKKwkJCQkJICAgIFBBR0VfU0laRSkpIHsKKwkJCQkJCWt1bm1hcChwYWdlKTsKKwkJCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJCQkJCWdvdG8gZW5kX2NvcmVkdW1wOworCQkJCQl9CisJCQkJCWt1bm1hcChwYWdlKTsKKwkJCQl9CisJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJfQorCQl9CisJfQorCisjaWZkZWYgRUxGX0NPUkVfV1JJVEVfRVhUUkFfREFUQQorCUVMRl9DT1JFX1dSSVRFX0VYVFJBX0RBVEE7CisjZW5kaWYKKworCWlmICgob2ZmX3QpIGZpbGUtPmZfcG9zICE9IG9mZnNldCkgeworCQkvKiBTYW5pdHkgY2hlY2sgKi8KKwkJcHJpbnRrKCJlbGZfY29yZV9kdW1wOiBmaWxlLT5mX3BvcyAoJWxkKSAhPSBvZmZzZXQgKCVsZClcbiIsCisJCSAgICAgICAob2ZmX3QpIGZpbGUtPmZfcG9zLCBvZmZzZXQpOworCX0KKworZW5kX2NvcmVkdW1wOgorCXNldF9mcyhmcyk7CisKK2NsZWFudXA6CisJd2hpbGUoIWxpc3RfZW1wdHkoJnRocmVhZF9saXN0KSkgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXAgPSB0aHJlYWRfbGlzdC5uZXh0OworCQlsaXN0X2RlbCh0bXApOworCQlrZnJlZShsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGVsZl90aHJlYWRfc3RhdHVzLCBsaXN0KSk7CisJfQorCisJa2ZyZWUoZWxmKTsKKwlrZnJlZShwcnN0YXR1cyk7CisJa2ZyZWUocHNpbmZvKTsKKwlrZnJlZShub3Rlcyk7CisJa2ZyZWUoZnB1KTsKKyNpZmRlZiBFTEZfQ09SRV9DT1BZX1hGUFJFR1MKKwlrZnJlZSh4ZnB1KTsKKyNlbmRpZgorCXJldHVybiBoYXNfZHVtcGVkOworI3VuZGVmIE5VTV9OT1RFUworfQorCisjZW5kaWYJCS8qIFVTRV9FTEZfQ09SRV9EVU1QICovCisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfZWxmX2JpbmZtdCh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9iaW5mbXQoJmVsZl9mb3JtYXQpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9lbGZfYmluZm10KHZvaWQpCit7CisJLyogUmVtb3ZlIHRoZSBDT0ZGIGFuZCBFTEYgbG9hZGVycy4gKi8KKwl1bnJlZ2lzdGVyX2JpbmZtdCgmZWxmX2Zvcm1hdCk7Cit9CisKK2NvcmVfaW5pdGNhbGwoaW5pdF9lbGZfYmluZm10KTsKK21vZHVsZV9leGl0KGV4aXRfZWxmX2JpbmZtdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfZWxmX2ZkcGljLmMgYi9mcy9iaW5mbXRfZWxmX2ZkcGljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM0YzljMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2JpbmZtdF9lbGZfZmRwaWMuYwpAQCAtMCwwICsxLDExMDEgQEAKKy8qIGJpbmZtdF9lbGZfZmRwaWMuYzogRkRQSUMgRUxGIGJpbmFyeSBmb3JtYXQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICogRGVyaXZlZCBmcm9tIGJpbmZtdF9lbGYuYworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpbmZtdHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcnNvbmFsaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZWxmLmg+CisjaW5jbHVkZSA8bGludXgvZWxmLWZkcGljLmg+CisjaW5jbHVkZSA8bGludXgvZWxmY29yZS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcGFyYW0uaD4KKyNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgorCit0eXBlZGVmIGNoYXIgKmVsZl9jYWRkcl90OworI2lmbmRlZiBlbGZfYWRkcl90CisjZGVmaW5lIGVsZl9hZGRyX3QgdW5zaWduZWQgbG9uZworI2VuZGlmCisKKyNpZiAwCisjZGVmaW5lIGtkZWJ1ZyhmbXQsIC4uLikgcHJpbnRrKCJGRFBJQyAiZm10IlxuIiAsIyNfX1ZBX0FSR1NfXyApCisjZWxzZQorI2RlZmluZSBrZGVidWcoZm10LCAuLi4pIGRvIHt9IHdoaWxlKDApCisjZW5kaWYKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IGxvYWRfZWxmX2ZkcGljX2JpbmFyeShzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisvL3N0YXRpYyBpbnQgbG9hZF9lbGZfZmRwaWNfbGlicmFyeShzdHJ1Y3QgZmlsZSAqKTsKK3N0YXRpYyBpbnQgZWxmX2ZkcGljX2ZldGNoX3BoZHJzKHN0cnVjdCBlbGZfZmRwaWNfcGFyYW1zICpwYXJhbXMsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgZWxmX2ZkcGljX21hcF9maWxlKHN0cnVjdCBlbGZfZmRwaWNfcGFyYW1zICpwYXJhbXMsCisJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICAgIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJICAgICAgY29uc3QgY2hhciAqd2hhdCk7CisKK3N0YXRpYyBpbnQgY3JlYXRlX2VsZl9mZHBpY190YWJsZXMoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSwKKwkJCQkgICBzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQkgICBzdHJ1Y3QgZWxmX2ZkcGljX3BhcmFtcyAqZXhlY19wYXJhbXMsCisJCQkJICAgc3RydWN0IGVsZl9mZHBpY19wYXJhbXMgKmludGVycF9wYXJhbXMpOworCisjaWZuZGVmIENPTkZJR19NTVUKK3N0YXRpYyBpbnQgZWxmX2ZkcGljX3RyYW5zZmVyX2FyZ3NfdG9fc3RhY2soc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSwgdW5zaWduZWQgbG9uZyAqX3NwKTsKK3N0YXRpYyBpbnQgZWxmX2ZkcGljX21hcF9maWxlX2NvbnN0ZGlzcF9vbl91Y2xpbnV4KHN0cnVjdCBlbGZfZmRwaWNfcGFyYW1zICpwYXJhbXMsCisJCQkJCQkgICBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJCSAgIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKKyNlbmRpZgorCitzdGF0aWMgaW50IGVsZl9mZHBpY19tYXBfZmlsZV9ieV9kaXJlY3RfbW1hcChzdHJ1Y3QgZWxmX2ZkcGljX3BhcmFtcyAqcGFyYW1zLAorCQkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQkgICAgIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKKworc3RhdGljIHN0cnVjdCBsaW51eF9iaW5mbXQgZWxmX2ZkcGljX2Zvcm1hdCA9IHsKKwkubW9kdWxlCQk9IFRISVNfTU9EVUxFLAorCS5sb2FkX2JpbmFyeQk9IGxvYWRfZWxmX2ZkcGljX2JpbmFyeSwKKy8vCS5sb2FkX3NobGliCT0gbG9hZF9lbGZfZmRwaWNfbGlicmFyeSwKKy8vCS5jb3JlX2R1bXAJPSBlbGZfZmRwaWNfY29yZV9kdW1wLAorCS5taW5fY29yZWR1bXAJPSBFTEZfRVhFQ19QQUdFU0laRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfZWxmX2ZkcGljX2JpbmZtdCh2b2lkKSAgeyByZXR1cm4gcmVnaXN0ZXJfYmluZm10KCZlbGZfZmRwaWNfZm9ybWF0KTsgfQorc3RhdGljIHZvaWQgX19leGl0IGV4aXRfZWxmX2ZkcGljX2JpbmZtdCh2b2lkKSB7IHVucmVnaXN0ZXJfYmluZm10KCZlbGZfZmRwaWNfZm9ybWF0KTsgfQorCittb2R1bGVfaW5pdChpbml0X2VsZl9mZHBpY19iaW5mbXQpCittb2R1bGVfZXhpdChleGl0X2VsZl9mZHBpY19iaW5mbXQpCisKK3N0YXRpYyBpbnQgaXNfZWxmX2ZkcGljKHN0cnVjdCBlbGZoZHIgKmhkciwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKG1lbWNtcChoZHItPmVfaWRlbnQsIEVMRk1BRywgU0VMRk1BRykgIT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKGhkci0+ZV90eXBlICE9IEVUX0VYRUMgJiYgaGRyLT5lX3R5cGUgIT0gRVRfRFlOKQorCQlyZXR1cm4gMDsKKwlpZiAoIWVsZl9jaGVja19hcmNoKGhkcikgfHwgIWVsZl9jaGVja19mZHBpYyhoZHIpKQorCQlyZXR1cm4gMDsKKwlpZiAoIWZpbGUtPmZfb3AgfHwgIWZpbGUtPmZfb3AtPm1tYXApCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogcmVhZCB0aGUgcHJvZ3JhbSBoZWFkZXJzIHRhYmxlIGludG8gbWVtb3J5CisgKi8KK3N0YXRpYyBpbnQgZWxmX2ZkcGljX2ZldGNoX3BoZHJzKHN0cnVjdCBlbGZfZmRwaWNfcGFyYW1zICpwYXJhbXMsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBlbGYzMl9waGRyICpwaGRyOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwlpbnQgcmV0dmFsLCBsb29wOworCisJaWYgKHBhcmFtcy0+aGRyLmVfcGhlbnRzaXplICE9IHNpemVvZihzdHJ1Y3QgZWxmX3BoZHIpKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAocGFyYW1zLT5oZHIuZV9waG51bSA+IDY1NTM2VSAvIHNpemVvZihzdHJ1Y3QgZWxmX3BoZHIpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNpemUgPSBwYXJhbXMtPmhkci5lX3BobnVtICogc2l6ZW9mKHN0cnVjdCBlbGZfcGhkcik7CisJcGFyYW1zLT5waGRycyA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwYXJhbXMtPnBoZHJzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHZhbCA9IGtlcm5lbF9yZWFkKGZpbGUsIHBhcmFtcy0+aGRyLmVfcGhvZmYsIChjaGFyICopIHBhcmFtcy0+cGhkcnMsIHNpemUpOworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJLyogZGV0ZXJtaW5lIHN0YWNrIHNpemUgZm9yIHRoaXMgYmluYXJ5ICovCisJcGhkciA9IHBhcmFtcy0+cGhkcnM7CisJZm9yIChsb29wID0gMDsgbG9vcCA8IHBhcmFtcy0+aGRyLmVfcGhudW07IGxvb3ArKywgcGhkcisrKSB7CisJCWlmIChwaGRyLT5wX3R5cGUgIT0gUFRfR05VX1NUQUNLKQorCQkJY29udGludWU7CisKKwkJaWYgKHBoZHItPnBfZmxhZ3MgJiBQRl9YKQorCQkJcGFyYW1zLT5mbGFncyB8PSBFTEZfRkRQSUNfRkxBR19FWEVDX1NUQUNLOworCQllbHNlCisJCQlwYXJhbXMtPmZsYWdzIHw9IEVMRl9GRFBJQ19GTEFHX05PRVhFQ19TVEFDSzsKKworCQlwYXJhbXMtPnN0YWNrX3NpemUgPSBwaGRyLT5wX21lbXN6OworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30gLyogZW5kIGVsZl9mZHBpY19mZXRjaF9waGRycygpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBsb2FkIGFuIGZkcGljIGJpbmFyeSBpbnRvIHZhcmlvdXMgYml0cyBvZiBtZW1vcnkKKyAqLworc3RhdGljIGludCBsb2FkX2VsZl9mZHBpY19iaW5hcnkoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGVsZl9mZHBpY19wYXJhbXMgZXhlY19wYXJhbXMsIGludGVycF9wYXJhbXM7CisJc3RydWN0IGVsZl9waGRyICpwaGRyOworCXVuc2lnbmVkIGxvbmcgc3RhY2tfc2l6ZTsKKwlzdHJ1Y3QgZmlsZSAqaW50ZXJwcmV0ZXIgPSBOVUxMOyAvKiB0byBzaHV0IGdjYyB1cCAqLworCWNoYXIgKmludGVycHJldGVyX25hbWUgPSBOVUxMOworCWludCBleGVjdXRhYmxlX3N0YWNrOworCWludCByZXR2YWwsIGk7CisKKwltZW1zZXQoJmV4ZWNfcGFyYW1zLCAwLCBzaXplb2YoZXhlY19wYXJhbXMpKTsKKwltZW1zZXQoJmludGVycF9wYXJhbXMsIDAsIHNpemVvZihpbnRlcnBfcGFyYW1zKSk7CisKKwlleGVjX3BhcmFtcy5oZHIgPSAqKHN0cnVjdCBlbGZoZHIgKikgYnBybS0+YnVmOworCWV4ZWNfcGFyYW1zLmZsYWdzID0gRUxGX0ZEUElDX0ZMQUdfUFJFU0VOVCB8IEVMRl9GRFBJQ19GTEFHX0VYRUNVVEFCTEU7CisKKwkvKiBjaGVjayB0aGF0IHRoaXMgaXMgYSBiaW5hcnkgd2Uga25vdyBob3cgdG8gZGVhbCB3aXRoICovCisJcmV0dmFsID0gLUVOT0VYRUM7CisJaWYgKCFpc19lbGZfZmRwaWMoJmV4ZWNfcGFyYW1zLmhkciwgYnBybS0+ZmlsZSkpCisJCWdvdG8gZXJyb3I7CisKKwkvKiByZWFkIHRoZSBwcm9ncmFtIGhlYWRlciB0YWJsZSAqLworCXJldHZhbCA9IGVsZl9mZHBpY19mZXRjaF9waGRycygmZXhlY19wYXJhbXMsIGJwcm0tPmZpbGUpOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogc2NhbiBmb3IgYSBwcm9ncmFtIGhlYWRlciB0aGF0IHNwZWNpZmllcyBhbiBpbnRlcnByZXRlciAqLworCXBoZHIgPSBleGVjX3BhcmFtcy5waGRyczsKKworCWZvciAoaSA9IDA7IGkgPCBleGVjX3BhcmFtcy5oZHIuZV9waG51bTsgaSsrLCBwaGRyKyspIHsKKwkJc3dpdGNoIChwaGRyLT5wX3R5cGUpIHsKKwkJY2FzZSBQVF9JTlRFUlA6CisJCQlyZXR2YWwgPSAtRU5PTUVNOworCQkJaWYgKHBoZHItPnBfZmlsZXN6ID4gUEFUSF9NQVgpCisJCQkJZ290byBlcnJvcjsKKwkJCXJldHZhbCA9IC1FTk9FTlQ7CisJCQlpZiAocGhkci0+cF9maWxlc3ogPCAyKQorCQkJCWdvdG8gZXJyb3I7CisKKwkJCS8qIHJlYWQgdGhlIG5hbWUgb2YgdGhlIGludGVycHJldGVyIGludG8gbWVtb3J5ICovCisJCQlpbnRlcnByZXRlcl9uYW1lID0gKGNoYXIgKikga21hbGxvYyhwaGRyLT5wX2ZpbGVzeiwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWludGVycHJldGVyX25hbWUpCisJCQkJZ290byBlcnJvcjsKKworCQkJcmV0dmFsID0ga2VybmVsX3JlYWQoYnBybS0+ZmlsZSwKKwkJCQkJICAgICBwaGRyLT5wX29mZnNldCwKKwkJCQkJICAgICBpbnRlcnByZXRlcl9uYW1lLAorCQkJCQkgICAgIHBoZHItPnBfZmlsZXN6KTsKKwkJCWlmIChyZXR2YWwgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisKKwkJCXJldHZhbCA9IC1FTk9FTlQ7CisJCQlpZiAoaW50ZXJwcmV0ZXJfbmFtZVtwaGRyLT5wX2ZpbGVzeiAtIDFdICE9ICdcMCcpCisJCQkJZ290byBlcnJvcjsKKworCQkJa2RlYnVnKCJVc2luZyBFTEYgaW50ZXJwcmV0ZXIgJXMiLCBpbnRlcnByZXRlcl9uYW1lKTsKKworCQkJLyogcmVwbGFjZSB0aGUgcHJvZ3JhbSB3aXRoIHRoZSBpbnRlcnByZXRlciAqLworCQkJaW50ZXJwcmV0ZXIgPSBvcGVuX2V4ZWMoaW50ZXJwcmV0ZXJfbmFtZSk7CisJCQlyZXR2YWwgPSBQVFJfRVJSKGludGVycHJldGVyKTsKKwkJCWlmIChJU19FUlIoaW50ZXJwcmV0ZXIpKSB7CisJCQkJaW50ZXJwcmV0ZXIgPSBOVUxMOworCQkJCWdvdG8gZXJyb3I7CisJCQl9CisKKwkJCXJldHZhbCA9IGtlcm5lbF9yZWFkKGludGVycHJldGVyLCAwLCBicHJtLT5idWYsIEJJTlBSTV9CVUZfU0laRSk7CisJCQlpZiAocmV0dmFsIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCisJCQlpbnRlcnBfcGFyYW1zLmhkciA9ICooKHN0cnVjdCBlbGZoZHIgKikgYnBybS0+YnVmKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUFRfTE9BRDoKKyNpZmRlZiBDT05GSUdfTU1VCisJCQlpZiAoZXhlY19wYXJhbXMubG9hZF9hZGRyID09IDApCisJCQkJZXhlY19wYXJhbXMubG9hZF9hZGRyID0gcGhkci0+cF92YWRkcjsKKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKworCX0KKworCWlmIChlbGZfY2hlY2tfY29uc3RfZGlzcGxhY2VtZW50KCZleGVjX3BhcmFtcy5oZHIpKQorCQlleGVjX3BhcmFtcy5mbGFncyB8PSBFTEZfRkRQSUNfRkxBR19DT05TVERJU1A7CisKKwkvKiBwZXJmb3JtIGluc2FuaXR5IGNoZWNrcyBvbiB0aGUgaW50ZXJwcmV0ZXIgKi8KKwlpZiAoaW50ZXJwcmV0ZXJfbmFtZSkgeworCQlyZXR2YWwgPSAtRUxJQkJBRDsKKwkJaWYgKCFpc19lbGZfZmRwaWMoJmludGVycF9wYXJhbXMuaGRyLCBpbnRlcnByZXRlcikpCisJCQlnb3RvIGVycm9yOworCisJCWludGVycF9wYXJhbXMuZmxhZ3MgPSBFTEZfRkRQSUNfRkxBR19QUkVTRU5UOworCisJCS8qIHJlYWQgdGhlIGludGVycHJldGVyJ3MgcHJvZ3JhbSBoZWFkZXIgdGFibGUgKi8KKwkJcmV0dmFsID0gZWxmX2ZkcGljX2ZldGNoX3BoZHJzKCZpbnRlcnBfcGFyYW1zLCBpbnRlcnByZXRlcik7CisJCWlmIChyZXR2YWwgPCAwKQorCQkJZ290byBlcnJvcjsKKwl9CisKKwlzdGFja19zaXplID0gZXhlY19wYXJhbXMuc3RhY2tfc2l6ZTsKKwlpZiAoc3RhY2tfc2l6ZSA8IGludGVycF9wYXJhbXMuc3RhY2tfc2l6ZSkKKwkJc3RhY2tfc2l6ZSA9IGludGVycF9wYXJhbXMuc3RhY2tfc2l6ZTsKKworCWlmIChleGVjX3BhcmFtcy5mbGFncyAmIEVMRl9GRFBJQ19GTEFHX0VYRUNfU1RBQ0spCisJCWV4ZWN1dGFibGVfc3RhY2sgPSBFWFNUQUNLX0VOQUJMRV9YOworCWVsc2UgaWYgKGV4ZWNfcGFyYW1zLmZsYWdzICYgRUxGX0ZEUElDX0ZMQUdfTk9FWEVDX1NUQUNLKQorCQlleGVjdXRhYmxlX3N0YWNrID0gRVhTVEFDS19ESVNBQkxFX1g7CisJZWxzZSBpZiAoaW50ZXJwX3BhcmFtcy5mbGFncyAmIEVMRl9GRFBJQ19GTEFHX0VYRUNfU1RBQ0spCisJCWV4ZWN1dGFibGVfc3RhY2sgPSBFWFNUQUNLX0VOQUJMRV9YOworCWVsc2UgaWYgKGludGVycF9wYXJhbXMuZmxhZ3MgJiBFTEZfRkRQSUNfRkxBR19OT0VYRUNfU1RBQ0spCisJCWV4ZWN1dGFibGVfc3RhY2sgPSBFWFNUQUNLX0RJU0FCTEVfWDsKKwllbHNlCisJCWV4ZWN1dGFibGVfc3RhY2sgPSBFWFNUQUNLX0RFRkFVTFQ7CisKKwlyZXR2YWwgPSAtRU5PRVhFQzsKKwlpZiAoc3RhY2tfc2l6ZSA9PSAwKQorCQlnb3RvIGVycm9yOworCisJaWYgKGVsZl9jaGVja19jb25zdF9kaXNwbGFjZW1lbnQoJmludGVycF9wYXJhbXMuaGRyKSkKKwkJaW50ZXJwX3BhcmFtcy5mbGFncyB8PSBFTEZfRkRQSUNfRkxBR19DT05TVERJU1A7CisKKwkvKiBmbHVzaCBhbGwgdHJhY2VzIG9mIHRoZSBjdXJyZW50bHkgcnVubmluZyBleGVjdXRhYmxlICovCisJcmV0dmFsID0gZmx1c2hfb2xkX2V4ZWMoYnBybSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBlcnJvcjsKKworCS8qIHRoZXJlJ3Mgbm93IG5vIHR1cm5pbmcgYmFjay4uLiB0aGUgb2xkIHVzZXJzcGFjZSBpbWFnZSBpcyBkZWFkLAorCSAqIGRlZnVuY3QsIGRlY2Vhc2VkLCBldGMuIGFmdGVyIHRoaXMgcG9pbnQgd2UgaGF2ZSB0byBleGl0IHZpYQorCSAqIGVycm9yX2tpbGwgKi8KKwlzZXRfcGVyc29uYWxpdHkoUEVSX0xJTlVYX0ZEUElDKTsKKwlzZXRfYmluZm10KCZlbGZfZmRwaWNfZm9ybWF0KTsKKworCWN1cnJlbnQtPm1tLT5zdGFydF9jb2RlID0gMDsKKwljdXJyZW50LT5tbS0+ZW5kX2NvZGUgPSAwOworCWN1cnJlbnQtPm1tLT5zdGFydF9zdGFjayA9IDA7CisJY3VycmVudC0+bW0tPnN0YXJ0X2RhdGEgPSAwOworCWN1cnJlbnQtPm1tLT5lbmRfZGF0YSA9IDA7CisJY3VycmVudC0+bW0tPmNvbnRleHQuZXhlY19mZHBpY19sb2FkbWFwID0gMDsKKwljdXJyZW50LT5tbS0+Y29udGV4dC5pbnRlcnBfZmRwaWNfbG9hZG1hcCA9IDA7CisKKwljdXJyZW50LT5mbGFncyAmPSB+UEZfRk9SS05PRVhFQzsKKworI2lmZGVmIENPTkZJR19NTVUKKwllbGZfZmRwaWNfYXJjaF9sYXlfb3V0X21tKCZleGVjX3BhcmFtcywKKwkJCQkgICZpbnRlcnBfcGFyYW1zLAorCQkJCSAgJmN1cnJlbnQtPm1tLT5zdGFydF9zdGFjaywKKwkJCQkgICZjdXJyZW50LT5tbS0+c3RhcnRfYnJrKTsKKyNlbmRpZgorCisJLyogZG8gdGhpcyBzbyB0aGF0IHdlIGNhbiBsb2FkIHRoZSBpbnRlcnByZXRlciwgaWYgbmVlZCBiZQorCSAqIC0gd2Ugd2lsbCBjaGFuZ2Ugc29tZSBvZiB0aGVzZSBsYXRlcgorCSAqLworCXNldF9tbV9jb3VudGVyKGN1cnJlbnQtPm1tLCByc3MsIDApOworCisjaWZkZWYgQ09ORklHX01NVQorCXJldHZhbCA9IHNldHVwX2FyZ19wYWdlcyhicHJtLCBjdXJyZW50LT5tbS0+c3RhcnRfc3RhY2ssIGV4ZWN1dGFibGVfc3RhY2spOworCWlmIChyZXR2YWwgPCAwKSB7CisJCXNlbmRfc2lnKFNJR0tJTEwsIGN1cnJlbnQsIDApOworCQlnb3RvIGVycm9yX2tpbGw7CisJfQorI2VuZGlmCisKKwkvKiBsb2FkIHRoZSBleGVjdXRhYmxlIGFuZCBpbnRlcnByZXRlciBpbnRvIG1lbW9yeSAqLworCXJldHZhbCA9IGVsZl9mZHBpY19tYXBfZmlsZSgmZXhlY19wYXJhbXMsIGJwcm0tPmZpbGUsIGN1cnJlbnQtPm1tLCAiZXhlY3V0YWJsZSIpOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIGVycm9yX2tpbGw7CisKKwlpZiAoaW50ZXJwcmV0ZXJfbmFtZSkgeworCQlyZXR2YWwgPSBlbGZfZmRwaWNfbWFwX2ZpbGUoJmludGVycF9wYXJhbXMsIGludGVycHJldGVyLAorCQkJCQkgICAgY3VycmVudC0+bW0sICJpbnRlcnByZXRlciIpOworCQlpZiAocmV0dmFsIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gbG9hZCBpbnRlcnByZXRlclxuIik7CisJCQlnb3RvIGVycm9yX2tpbGw7CisJCX0KKworCQlhbGxvd193cml0ZV9hY2Nlc3MoaW50ZXJwcmV0ZXIpOworCQlmcHV0KGludGVycHJldGVyKTsKKwkJaW50ZXJwcmV0ZXIgPSBOVUxMOworCX0KKworI2lmZGVmIENPTkZJR19NTVUKKwlpZiAoIWN1cnJlbnQtPm1tLT5zdGFydF9icmspCisJCWN1cnJlbnQtPm1tLT5zdGFydF9icmsgPSBjdXJyZW50LT5tbS0+ZW5kX2RhdGE7CisKKwljdXJyZW50LT5tbS0+YnJrID0gY3VycmVudC0+bW0tPnN0YXJ0X2JyayA9IFBBR0VfQUxJR04oY3VycmVudC0+bW0tPnN0YXJ0X2Jyayk7CisKKyNlbHNlCisJLyogY3JlYXRlIGEgc3RhY2sgYW5kIGJyayBhcmVhIGJpZyBlbm91Z2ggZm9yIGV2ZXJ5b25lCisJICogLSB0aGUgYnJrIGhlYXAgc3RhcnRzIGF0IHRoZSBib3R0b20gYW5kIHdvcmtzIHVwCisJICogLSB0aGUgc3RhY2sgc3RhcnRzIGF0IHRoZSB0b3AgYW5kIHdvcmtzIGRvd24KKwkgKi8KKwlzdGFja19zaXplID0gKHN0YWNrX3NpemUgKyBQQUdFX1NJWkUgLSAxKSAmIFBBR0VfTUFTSzsKKwlpZiAoc3RhY2tfc2l6ZSA8IFBBR0VfU0laRSAqIDIpCisJCXN0YWNrX3NpemUgPSBQQUdFX1NJWkUgKiAyOworCisJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwljdXJyZW50LT5tbS0+c3RhcnRfYnJrID0gZG9fbW1hcChOVUxMLAorCQkJCQkgMCwKKwkJCQkJIHN0YWNrX3NpemUsCisJCQkJCSBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFIHwgUFJPVF9FWEVDLAorCQkJCQkgTUFQX1BSSVZBVEUgfCBNQVBfQU5PTiB8IE1BUF9HUk9XU0RPV04sCisJCQkJCSAwKTsKKworCWlmIChJU19FUlIoKHZvaWQgKikgY3VycmVudC0+bW0tPnN0YXJ0X2JyaykpIHsKKwkJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJCXJldHZhbCA9IGN1cnJlbnQtPm1tLT5zdGFydF9icms7CisJCWN1cnJlbnQtPm1tLT5zdGFydF9icmsgPSAwOworCQlnb3RvIGVycm9yX2tpbGw7CisJfQorCisJaWYgKGRvX21yZW1hcChjdXJyZW50LT5tbS0+c3RhcnRfYnJrLAorCQkgICAgICBzdGFja19zaXplLAorCQkgICAgICBrc2l6ZSgoY2hhciAqKSBjdXJyZW50LT5tbS0+c3RhcnRfYnJrKSwKKwkJICAgICAgMCwgMAorCQkgICAgICApID09IGN1cnJlbnQtPm1tLT5zdGFydF9icmsKKwkgICAgKQorCQlzdGFja19zaXplID0ga3NpemUoKGNoYXIgKikgY3VycmVudC0+bW0tPnN0YXJ0X2Jyayk7CisJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisKKwljdXJyZW50LT5tbS0+YnJrID0gY3VycmVudC0+bW0tPnN0YXJ0X2JyazsKKwljdXJyZW50LT5tbS0+Y29udGV4dC5lbmRfYnJrID0gY3VycmVudC0+bW0tPnN0YXJ0X2JyazsKKwljdXJyZW50LT5tbS0+Y29udGV4dC5lbmRfYnJrICs9IChzdGFja19zaXplID4gUEFHRV9TSVpFKSA/IChzdGFja19zaXplIC0gUEFHRV9TSVpFKSA6IDA7CisJY3VycmVudC0+bW0tPnN0YXJ0X3N0YWNrID0gY3VycmVudC0+bW0tPnN0YXJ0X2JyayArIHN0YWNrX3NpemU7CisjZW5kaWYKKworCWNvbXB1dGVfY3JlZHMoYnBybSk7CisJY3VycmVudC0+ZmxhZ3MgJj0gflBGX0ZPUktOT0VYRUM7CisJaWYgKGNyZWF0ZV9lbGZfZmRwaWNfdGFibGVzKGJwcm0sIGN1cnJlbnQtPm1tLCAmZXhlY19wYXJhbXMsICZpbnRlcnBfcGFyYW1zKSA8IDApCisJCWdvdG8gZXJyb3Jfa2lsbDsKKworCWtkZWJ1ZygiLSBzdGFydF9jb2RlICAlbHgiLAkobG9uZykgY3VycmVudC0+bW0tPnN0YXJ0X2NvZGUpOworCWtkZWJ1ZygiLSBlbmRfY29kZSAgICAlbHgiLAkobG9uZykgY3VycmVudC0+bW0tPmVuZF9jb2RlKTsKKwlrZGVidWcoIi0gc3RhcnRfZGF0YSAgJWx4IiwJKGxvbmcpIGN1cnJlbnQtPm1tLT5zdGFydF9kYXRhKTsKKwlrZGVidWcoIi0gZW5kX2RhdGEgICAgJWx4IiwJKGxvbmcpIGN1cnJlbnQtPm1tLT5lbmRfZGF0YSk7CisJa2RlYnVnKCItIHN0YXJ0X2JyayAgICVseCIsCShsb25nKSBjdXJyZW50LT5tbS0+c3RhcnRfYnJrKTsKKwlrZGVidWcoIi0gYnJrICAgICAgICAgJWx4IiwJKGxvbmcpIGN1cnJlbnQtPm1tLT5icmspOworCWtkZWJ1ZygiLSBzdGFydF9zdGFjayAlbHgiLAkobG9uZykgY3VycmVudC0+bW0tPnN0YXJ0X3N0YWNrKTsKKworI2lmZGVmIEVMRl9GRFBJQ19QTEFUX0lOSVQKKwkvKgorCSAqIFRoZSBBQkkgbWF5IHNwZWNpZnkgdGhhdCBjZXJ0YWluIHJlZ2lzdGVycyBiZSBzZXQgdXAgaW4gc3BlY2lhbAorCSAqIHdheXMgKG9uIGkzODYgJWVkeCBpcyB0aGUgYWRkcmVzcyBvZiBhIERUX0ZJTkkgZnVuY3Rpb24sIGZvcgorCSAqIGV4YW1wbGUuICBUaGlzIG1hY3JvIHBlcmZvcm1zIHdoYXRldmVyIGluaXRpYWxpemF0aW9uIHRvCisJICogdGhlIHJlZ3Mgc3RydWN0dXJlIGlzIHJlcXVpcmVkLgorCSAqLworCUVMRl9GRFBJQ19QTEFUX0lOSVQocmVncywKKwkJCSAgICBleGVjX3BhcmFtcy5tYXBfYWRkciwKKwkJCSAgICBpbnRlcnBfcGFyYW1zLm1hcF9hZGRyLAorCQkJICAgIGludGVycF9wYXJhbXMuZHluYW1pY19hZGRyID86IGV4ZWNfcGFyYW1zLmR5bmFtaWNfYWRkcgorCQkJICAgICk7CisjZW5kaWYKKworCS8qIGV2ZXJ5dGhpbmcgaXMgbm93IHJlYWR5Li4uIGdldCB0aGUgdXNlcnNwYWNlIGNvbnRleHQgcmVhZHkgdG8gcm9sbCAqLworCXN0YXJ0X3RocmVhZChyZWdzLAorCQkgICAgIGludGVycF9wYXJhbXMuZW50cnlfYWRkciA/OiBleGVjX3BhcmFtcy5lbnRyeV9hZGRyLAorCQkgICAgIGN1cnJlbnQtPm1tLT5zdGFydF9zdGFjayk7CisKKwlpZiAodW5saWtlbHkoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkpIHsKKwkJaWYgKGN1cnJlbnQtPnB0cmFjZSAmIFBUX1RSQUNFX0VYRUMpCisJCQlwdHJhY2Vfbm90aWZ5ICgoUFRSQUNFX0VWRU5UX0VYRUMgPDwgOCkgfCBTSUdUUkFQKTsKKwkJZWxzZQorCQkJc2VuZF9zaWcoU0lHVFJBUCwgY3VycmVudCwgMCk7CisJfQorCisJcmV0dmFsID0gMDsKKworZXJyb3I6CisJaWYgKGludGVycHJldGVyKSB7CisJCWFsbG93X3dyaXRlX2FjY2VzcyhpbnRlcnByZXRlcik7CisJCWZwdXQoaW50ZXJwcmV0ZXIpOworCX0KKwlpZiAoaW50ZXJwcmV0ZXJfbmFtZSkKKwkJa2ZyZWUoaW50ZXJwcmV0ZXJfbmFtZSk7CisJaWYgKGV4ZWNfcGFyYW1zLnBoZHJzKQorCQlrZnJlZShleGVjX3BhcmFtcy5waGRycyk7CisJaWYgKGV4ZWNfcGFyYW1zLmxvYWRtYXApCisJCWtmcmVlKGV4ZWNfcGFyYW1zLmxvYWRtYXApOworCWlmIChpbnRlcnBfcGFyYW1zLnBoZHJzKQorCQlrZnJlZShpbnRlcnBfcGFyYW1zLnBoZHJzKTsKKwlpZiAoaW50ZXJwX3BhcmFtcy5sb2FkbWFwKQorCQlrZnJlZShpbnRlcnBfcGFyYW1zLmxvYWRtYXApOworCXJldHVybiByZXR2YWw7CisKKwkvKiB1bnJlY292ZXJhYmxlIGVycm9yIC0ga2lsbCB0aGUgcHJvY2VzcyAqLworIGVycm9yX2tpbGw6CisJc2VuZF9zaWcoU0lHU0VHViwgY3VycmVudCwgMCk7CisJZ290byBlcnJvcjsKKworfSAvKiBlbmQgbG9hZF9lbGZfZmRwaWNfYmluYXJ5KCkgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIHByZXNlbnQgdXNlZnVsIGluZm9ybWF0aW9uIHRvIHRoZSBwcm9ncmFtCisgKi8KK3N0YXRpYyBpbnQgY3JlYXRlX2VsZl9mZHBpY190YWJsZXMoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSwKKwkJCQkgICBzdHJ1Y3QgbW1fc3RydWN0ICptbSwKKwkJCQkgICBzdHJ1Y3QgZWxmX2ZkcGljX3BhcmFtcyAqZXhlY19wYXJhbXMsCisJCQkJICAgc3RydWN0IGVsZl9mZHBpY19wYXJhbXMgKmludGVycF9wYXJhbXMpCit7CisJdW5zaWduZWQgbG9uZyBzcCwgY3NwLCBuaXRlbXM7CisJZWxmX2NhZGRyX3QgKmFyZ3YsICplbnZwOworCXNpemVfdCBwbGF0Zm9ybV9sZW4gPSAwLCBsZW47CisJY2hhciAqa19wbGF0Zm9ybSwgKnVfcGxhdGZvcm0sICpwOworCWxvbmcgaHdjYXA7CisJaW50IGxvb3A7CisKKwkvKiB3ZSdyZSBnb2luZyB0byBzaG92ZWwgYSB3aG9sZSBsb2FkIG9mIHN0dWZmIG9udG8gdGhlIHN0YWNrICovCisjaWZkZWYgQ09ORklHX01NVQorCXNwID0gYnBybS0+cDsKKyNlbHNlCisJc3AgPSBtbS0+c3RhcnRfc3RhY2s7CisKKwkvKiBzdGFjayB0aGUgcHJvZ3JhbSBhcmd1bWVudHMgYW5kIGVudmlyb25tZW50ICovCisJaWYgKGVsZl9mZHBpY190cmFuc2Zlcl9hcmdzX3RvX3N0YWNrKGJwcm0sICZzcCkgPCAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKyNlbmRpZgorCisJLyogZ2V0IGhvbGQgb2YgcGxhdGZvcm0gYW5kIGhhcmR3YXJlIGNhcGFiaWxpdGllcyBtYXNrcyBmb3IgdGhlIG1hY2hpbmUKKwkgKiB3ZSBhcmUgcnVubmluZyBvbi4gIEluIHNvbWUgY2FzZXMgKFNwYXJjKSwgdGhpcyBpbmZvIGlzIGltcG9zc2libGUKKwkgKiB0byBnZXQsIGluIG90aGVycyAoaTM4NikgaXQgaXMgbWVyZWx5IGRpZmZpY3VsdC4KKwkgKi8KKwlod2NhcCA9IEVMRl9IV0NBUDsKKwlrX3BsYXRmb3JtID0gRUxGX1BMQVRGT1JNOworCisJaWYgKGtfcGxhdGZvcm0pIHsKKwkJcGxhdGZvcm1fbGVuID0gc3RybGVuKGtfcGxhdGZvcm0pICsgMTsKKwkJc3AgLT0gcGxhdGZvcm1fbGVuOworCQlpZiAoX19jb3B5X3RvX3VzZXIodV9wbGF0Zm9ybSwga19wbGF0Zm9ybSwgcGxhdGZvcm1fbGVuKSAhPSAwKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJdV9wbGF0Zm9ybSA9IChjaGFyICopIHNwOworCisjaWYgZGVmaW5lZChfX2kzODZfXykgJiYgZGVmaW5lZChDT05GSUdfU01QKQorCS8qIGluIHNvbWUgY2FzZXMgKGUuZy4gSHlwZXItVGhyZWFkaW5nKSwgd2Ugd2FudCB0byBhdm9pZCBMMSBldmljdGlvbnMKKwkgKiBieSB0aGUgcHJvY2Vzc2VzIHJ1bm5pbmcgb24gdGhlIHNhbWUgcGFja2FnZS4gT25lIHRoaW5nIHdlIGNhbiBkbworCSAqIGlzIHRvIHNodWZmbGUgdGhlIGluaXRpYWwgc3RhY2sgZm9yIHRoZW0uCisJICoKKwkgKiB0aGUgY29uZGl0aW9uYWxzIGhlcmUgYXJlIHVubmVlZGVkLCBidXQga2VwdCBpbiB0byBtYWtlIHRoZQorCSAqIGNvZGUgYmVoYXZpb3VyIHRoZSBzYW1lIGFzIHByZSBjaGFuZ2UgdW5sZXNzIHdlIGhhdmUgaHlwZXJ0aHJlYWRlZAorCSAqIHByb2Nlc3NvcnMuIFRoaXMga2VlcHMgTXIgTWFyY2VsbyBQZXJzb24gaGFwcGllciBidXQgc2hvdWxkIGJlCisJICogcmVtb3ZlZCBmb3IgMi41CisJICovCisJaWYgKHNtcF9udW1fc2libGluZ3MgPiAxKQorCQlzcCA9IHNwIC0gKChjdXJyZW50LT5waWQgJSA2NCkgPDwgNyk7CisjZW5kaWYKKworCXNwICY9IH43VUw7CisKKwkvKiBzdGFjayB0aGUgbG9hZCBtYXAocykgKi8KKwlsZW4gPSBzaXplb2Yoc3RydWN0IGVsZjMyX2ZkcGljX2xvYWRtYXApOworCWxlbiArPSBzaXplb2Yoc3RydWN0IGVsZjMyX2ZkcGljX2xvYWRzZWcpICogZXhlY19wYXJhbXMtPmxvYWRtYXAtPm5zZWdzOworCXNwID0gKHNwIC0gbGVuKSAmIH43VUw7CisJZXhlY19wYXJhbXMtPm1hcF9hZGRyID0gc3A7CisKKwlpZiAoY29weV90b191c2VyKCh2b2lkICopIHNwLCBleGVjX3BhcmFtcy0+bG9hZG1hcCwgbGVuKSAhPSAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWN1cnJlbnQtPm1tLT5jb250ZXh0LmV4ZWNfZmRwaWNfbG9hZG1hcCA9ICh1bnNpZ25lZCBsb25nKSBzcDsKKworCWlmIChpbnRlcnBfcGFyYW1zLT5sb2FkbWFwKSB7CisJCWxlbiA9IHNpemVvZihzdHJ1Y3QgZWxmMzJfZmRwaWNfbG9hZG1hcCk7CisJCWxlbiArPSBzaXplb2Yoc3RydWN0IGVsZjMyX2ZkcGljX2xvYWRzZWcpICogaW50ZXJwX3BhcmFtcy0+bG9hZG1hcC0+bnNlZ3M7CisJCXNwID0gKHNwIC0gbGVuKSAmIH43VUw7CisJCWludGVycF9wYXJhbXMtPm1hcF9hZGRyID0gc3A7CisKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBzcCwgaW50ZXJwX3BhcmFtcy0+bG9hZG1hcCwgbGVuKSAhPSAwKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJY3VycmVudC0+bW0tPmNvbnRleHQuaW50ZXJwX2ZkcGljX2xvYWRtYXAgPSAodW5zaWduZWQgbG9uZykgc3A7CisJfQorCisJLyogZm9yY2UgMTYgYnl0ZSBfZmluYWxfIGFsaWdubWVudCBoZXJlIGZvciBnZW5lcmFsaXR5ICovCisjZGVmaW5lIERMSU5GT19JVEVNUyAxMworCisJbml0ZW1zID0gMSArIERMSU5GT19JVEVNUyArIChrX3BsYXRmb3JtID8gMSA6IDApOworI2lmZGVmIERMSU5GT19BUkNIX0lURU1TCisJbml0ZW1zICs9IERMSU5GT19BUkNIX0lURU1TOworI2VuZGlmCisKKwljc3AgPSBzcDsKKwlzcCAtPSBuaXRlbXMgKiAyICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCXNwIC09IChicHJtLT5lbnZjICsgMSkgKiBzaXplb2YoY2hhciAqKTsJLyogZW52dltdICovCisJc3AgLT0gKGJwcm0tPmFyZ2MgKyAxKSAqIHNpemVvZihjaGFyICopOwkvKiBhcmd2W10gKi8KKwlzcCAtPSAxICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOwkJLyogYXJnYyAqLworCisJY3NwIC09IHNwICYgMTVVTDsKKwlzcCAtPSBzcCAmIDE1VUw7CisKKwkvKiBwdXQgdGhlIEVMRiBpbnRlcnByZXRlciBpbmZvIG9uIHRoZSBzdGFjayAqLworI2RlZmluZSBORVdfQVVYX0VOVChuciwgaWQsIHZhbCkJCQkJCQlcCisJZG8gewkJCQkJCQkJCVwKKwkJc3RydWN0IHsgdW5zaWduZWQgbG9uZyBfaWQsIF92YWw7IH0gKmVudCA9ICh2b2lkICopIGNzcDsJXAorCQlfX3B1dF91c2VyKChpZCksICZlbnRbbnJdLl9pZCk7CQkJCQlcCisJCV9fcHV0X3VzZXIoKHZhbCksICZlbnRbbnJdLl92YWwpOwkJCQlcCisJfSB3aGlsZSAoMCkKKworCWNzcCAtPSAyICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCU5FV19BVVhfRU5UKDAsIEFUX05VTEwsIDApOworCWlmIChrX3BsYXRmb3JtKSB7CisJCWNzcCAtPSAyICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCQlORVdfQVVYX0VOVCgwLCBBVF9QTEFURk9STSwgKGVsZl9hZGRyX3QpKHVuc2lnbmVkIGxvbmcpIHVfcGxhdGZvcm0pOworCX0KKworCWNzcCAtPSBETElORk9fSVRFTVMgKiAyICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCU5FV19BVVhfRU5UKCAwLCBBVF9IV0NBUCwJCWh3Y2FwKTsKKwlORVdfQVVYX0VOVCggMSwgQVRfUEFHRVNaLAkJUEFHRV9TSVpFKTsKKwlORVdfQVVYX0VOVCggMiwgQVRfQ0xLVENLLAkJQ0xPQ0tTX1BFUl9TRUMpOworCU5FV19BVVhfRU5UKCAzLCBBVF9QSERSLAkJZXhlY19wYXJhbXMtPnBoX2FkZHIpOworCU5FV19BVVhfRU5UKCA0LCBBVF9QSEVOVCwJCXNpemVvZihzdHJ1Y3QgZWxmX3BoZHIpKTsKKwlORVdfQVVYX0VOVCggNSwgQVRfUEhOVU0sCQlleGVjX3BhcmFtcy0+aGRyLmVfcGhudW0pOworCU5FV19BVVhfRU5UKCA2LAlBVF9CQVNFLAkJaW50ZXJwX3BhcmFtcy0+ZWxmaGRyX2FkZHIpOworCU5FV19BVVhfRU5UKCA3LCBBVF9GTEFHUywJCTApOworCU5FV19BVVhfRU5UKCA4LCBBVF9FTlRSWSwJCWV4ZWNfcGFyYW1zLT5lbnRyeV9hZGRyKTsKKwlORVdfQVVYX0VOVCggOSwgQVRfVUlELAkJCShlbGZfYWRkcl90KSBjdXJyZW50LT51aWQpOworCU5FV19BVVhfRU5UKDEwLCBBVF9FVUlELAkJKGVsZl9hZGRyX3QpIGN1cnJlbnQtPmV1aWQpOworCU5FV19BVVhfRU5UKDExLCBBVF9HSUQsCQkJKGVsZl9hZGRyX3QpIGN1cnJlbnQtPmdpZCk7CisJTkVXX0FVWF9FTlQoMTIsIEFUX0VHSUQsCQkoZWxmX2FkZHJfdCkgY3VycmVudC0+ZWdpZCk7CisKKyNpZmRlZiBBUkNIX0RMSU5GTworCS8qIEFSQ0hfRExJTkZPIG11c3QgY29tZSBsYXN0IHNvIHBsYXRmb3JtIHNwZWNpZmljIGNvZGUgY2FuIGVuZm9yY2UKKwkgKiBzcGVjaWFsIGFsaWdubWVudCByZXF1aXJlbWVudHMgb24gdGhlIEFVWFYgaWYgbmVjZXNzYXJ5IChlZy4gUFBDKS4KKwkgKi8KKwlBUkNIX0RMSU5GTzsKKyNlbmRpZgorI3VuZGVmIE5FV19BVVhfRU5UCisKKwkvKiBhbGxvY2F0ZSByb29tIGZvciBhcmd2W10gYW5kIGVudnZbXSAqLworCWNzcCAtPSAoYnBybS0+ZW52YyArIDEpICogc2l6ZW9mKGVsZl9jYWRkcl90KTsKKwllbnZwID0gKGVsZl9jYWRkcl90ICopIGNzcDsKKwljc3AgLT0gKGJwcm0tPmFyZ2MgKyAxKSAqIHNpemVvZihlbGZfY2FkZHJfdCk7CisJYXJndiA9IChlbGZfY2FkZHJfdCAqKSBjc3A7CisKKwkvKiBzdGFjayBhcmdjICovCisJY3NwIC09IHNpemVvZih1bnNpZ25lZCBsb25nKTsKKwlfX3B1dF91c2VyKGJwcm0tPmFyZ2MsICh1bnNpZ25lZCBsb25nICopIGNzcCk7CisKKwlpZiAoY3NwICE9IHNwKQorCQlCVUcoKTsKKworCS8qIGZpbGwgaW4gdGhlIGFyZ3ZbXSBhcnJheSAqLworI2lmZGVmIENPTkZJR19NTVUKKwljdXJyZW50LT5tbS0+YXJnX3N0YXJ0ID0gYnBybS0+cDsKKyNlbHNlCisJY3VycmVudC0+bW0tPmFyZ19zdGFydCA9IGN1cnJlbnQtPm1tLT5zdGFydF9zdGFjayAtIChNQVhfQVJHX1BBR0VTICogUEFHRV9TSVpFIC0gYnBybS0+cCk7CisjZW5kaWYKKworCXAgPSAoY2hhciAqKSBjdXJyZW50LT5tbS0+YXJnX3N0YXJ0OworCWZvciAobG9vcCA9IGJwcm0tPmFyZ2M7IGxvb3AgPiAwOyBsb29wLS0pIHsKKwkJX19wdXRfdXNlcigoZWxmX2NhZGRyX3QpIHAsIGFyZ3YrKyk7CisJCWxlbiA9IHN0cm5sZW5fdXNlcihwLCBQQUdFX1NJWkUgKiBNQVhfQVJHX1BBR0VTKTsKKwkJaWYgKCFsZW4gfHwgbGVuID4gUEFHRV9TSVpFICogTUFYX0FSR19QQUdFUykKKwkJCXJldHVybiAtRUlOVkFMOworCQlwICs9IGxlbjsKKwl9CisJX19wdXRfdXNlcihOVUxMLCBhcmd2KTsKKwljdXJyZW50LT5tbS0+YXJnX2VuZCA9ICh1bnNpZ25lZCBsb25nKSBwOworCisJLyogZmlsbCBpbiB0aGUgZW52dltdIGFycmF5ICovCisJY3VycmVudC0+bW0tPmVudl9zdGFydCA9ICh1bnNpZ25lZCBsb25nKSBwOworCWZvciAobG9vcCA9IGJwcm0tPmVudmM7IGxvb3AgPiAwOyBsb29wLS0pIHsKKwkJX19wdXRfdXNlcigoZWxmX2NhZGRyX3QpKHVuc2lnbmVkIGxvbmcpIHAsIGVudnArKyk7CisJCWxlbiA9IHN0cm5sZW5fdXNlcihwLCBQQUdFX1NJWkUgKiBNQVhfQVJHX1BBR0VTKTsKKwkJaWYgKCFsZW4gfHwgbGVuID4gUEFHRV9TSVpFICogTUFYX0FSR19QQUdFUykKKwkJCXJldHVybiAtRUlOVkFMOworCQlwICs9IGxlbjsKKwl9CisJX19wdXRfdXNlcihOVUxMLCBlbnZwKTsKKwljdXJyZW50LT5tbS0+ZW52X2VuZCA9ICh1bnNpZ25lZCBsb25nKSBwOworCisJbW0tPnN0YXJ0X3N0YWNrID0gKHVuc2lnbmVkIGxvbmcpIHNwOworCXJldHVybiAwOworfSAvKiBlbmQgY3JlYXRlX2VsZl9mZHBpY190YWJsZXMoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogdHJhbnNmZXIgdGhlIHByb2dyYW0gYXJndW1lbnRzIGFuZCBlbnZpcm9ubWVudCBmcm9tIHRoZSBob2xkaW5nIHBhZ2VzIG9udG8KKyAqIHRoZSBzdGFjaworICovCisjaWZuZGVmIENPTkZJR19NTVUKK3N0YXRpYyBpbnQgZWxmX2ZkcGljX3RyYW5zZmVyX2FyZ3NfdG9fc3RhY2soc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSwgdW5zaWduZWQgbG9uZyAqX3NwKQoreworCXVuc2lnbmVkIGxvbmcgaW5kZXgsIHN0b3AsIHNwOworCWNoYXIgKnNyYzsKKwlpbnQgcmV0ID0gMDsKKworCXN0b3AgPSBicHJtLT5wID4+IFBBR0VfU0hJRlQ7CisJc3AgPSAqX3NwOworCisJZm9yIChpbmRleCA9IE1BWF9BUkdfUEFHRVMgLSAxOyBpbmRleCA+PSBzdG9wOyBpbmRleC0tKSB7CisJCXNyYyA9IGttYXAoYnBybS0+cGFnZVtpbmRleF0pOworCQlzcCAtPSBQQUdFX1NJWkU7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKikgc3AsIHNyYywgUEFHRV9TSVpFKSAhPSAwKQorCQkJcmV0ID0gLUVGQVVMVDsKKwkJa3VubWFwKGJwcm0tPnBhZ2VbaW5kZXhdKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKwl9CisKKwkqX3NwID0gKCpfc3AgLSAoTUFYX0FSR19QQUdFUyAqIFBBR0VfU0laRSAtIGJwcm0tPnApKSAmIH4xNTsKKworIG91dDoKKwlyZXR1cm4gcmV0OworfSAvKiBlbmQgZWxmX2ZkcGljX3RyYW5zZmVyX2FyZ3NfdG9fc3RhY2soKSAqLworI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBsb2FkIHRoZSBhcHByb3ByaWF0ZSBiaW5hcnkgaW1hZ2UgKGV4ZWN1dGFibGUgb3IgaW50ZXJwcmV0ZXIpIGludG8gbWVtb3J5CisgKiAtIHdlIGFzc3VtZSBubyBNTVUgaXMgYXZhaWxhYmxlCisgKiAtIGlmIG5vIG90aGVyIFBJQyBiaXRzIGFyZSBzZXQgaW4gcGFyYW1zLT5oZHItPmVfZmxhZ3MKKyAqICAgLSB3ZSBhc3N1bWUgdGhhdCB0aGUgTE9BRGFibGUgc2VnbWVudHMgaW4gdGhlIGJpbmFyeSBhcmUgaW5kZXBlbmRlbnRseSByZWxvY2F0YWJsZQorICogICAtIHdlIGFzc3VtZSBSL08gZXhlY3V0YWJsZSBzZWdtZW50cyBhcmUgc2hhcmVhYmxlCisgKiAtIGVsc2UKKyAqICAgLSB3ZSBhc3N1bWUgdGhlIGxvYWRhYmxlIHBhcnRzIG9mIHRoZSBpbWFnZSB0byByZXF1aXJlIGZpeGVkIGRpc3BsYWNlbWVudAorICogICAtIHRoZSBpbWFnZSBpcyBub3Qgc2hhcmVhYmxlCisgKi8KK3N0YXRpYyBpbnQgZWxmX2ZkcGljX21hcF9maWxlKHN0cnVjdCBlbGZfZmRwaWNfcGFyYW1zICpwYXJhbXMsCisJCQkgICAgICBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICAgIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorCQkJICAgICAgY29uc3QgY2hhciAqd2hhdCkKK3sKKwlzdHJ1Y3QgZWxmMzJfZmRwaWNfbG9hZG1hcCAqbG9hZG1hcDsKKyNpZmRlZiBDT05GSUdfTU1VCisJc3RydWN0IGVsZjMyX2ZkcGljX2xvYWRzZWcgKm1zZWc7CisjZW5kaWYKKwlzdHJ1Y3QgZWxmMzJfZmRwaWNfbG9hZHNlZyAqc2VnOworCXN0cnVjdCBlbGYzMl9waGRyICpwaGRyOworCXVuc2lnbmVkIGxvbmcgbG9hZF9hZGRyLCBzdG9wOworCXVuc2lnbmVkIG5sb2FkcywgdG1wOworCXNpemVfdCBzaXplOworCWludCBsb29wLCByZXQ7CisKKwkvKiBhbGxvY2F0ZSBhIGxvYWQgbWFwIHRhYmxlICovCisJbmxvYWRzID0gMDsKKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgcGFyYW1zLT5oZHIuZV9waG51bTsgbG9vcCsrKQorCQlpZiAocGFyYW1zLT5waGRyc1tsb29wXS5wX3R5cGUgPT0gUFRfTE9BRCkKKwkJCW5sb2FkcysrOworCisJaWYgKG5sb2FkcyA9PSAwKQorCQlyZXR1cm4gLUVMSUJCQUQ7CisKKwlzaXplID0gc2l6ZW9mKCpsb2FkbWFwKSArIG5sb2FkcyAqIHNpemVvZigqc2VnKTsKKwlsb2FkbWFwID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxvYWRtYXApCisJCXJldHVybiAtRU5PTUVNOworCisJcGFyYW1zLT5sb2FkbWFwID0gbG9hZG1hcDsKKwltZW1zZXQobG9hZG1hcCwgMCwgc2l6ZSk7CisKKwlsb2FkbWFwLT52ZXJzaW9uID0gRUxGMzJfRkRQSUNfTE9BRE1BUF9WRVJTSU9OOworCWxvYWRtYXAtPm5zZWdzID0gbmxvYWRzOworCisJbG9hZF9hZGRyID0gcGFyYW1zLT5sb2FkX2FkZHI7CisJc2VnID0gbG9hZG1hcC0+c2VnczsKKworCS8qIG1hcCB0aGUgcmVxdWVzdGVkIExPQURzIGludG8gdGhlIG1lbW9yeSBzcGFjZSAqLworCXN3aXRjaCAocGFyYW1zLT5mbGFncyAmIEVMRl9GRFBJQ19GTEFHX0FSUkFOR0VNRU5UKSB7CisJY2FzZSBFTEZfRkRQSUNfRkxBR19DT05TVERJU1A6CisJY2FzZSBFTEZfRkRQSUNfRkxBR19DT05USUdVT1VTOgorI2lmbmRlZiBDT05GSUdfTU1VCisJCXJldCA9IGVsZl9mZHBpY19tYXBfZmlsZV9jb25zdGRpc3Bfb25fdWNsaW51eChwYXJhbXMsIGZpbGUsIG1tKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCXJldCA9IGVsZl9mZHBpY19tYXBfZmlsZV9ieV9kaXJlY3RfbW1hcChwYXJhbXMsIGZpbGUsIG1tKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlicmVhazsKKwl9CisKKwkvKiBtYXAgdGhlIGVudHJ5IHBvaW50ICovCisJaWYgKHBhcmFtcy0+aGRyLmVfZW50cnkpIHsKKwkJc2VnID0gbG9hZG1hcC0+c2VnczsKKwkJZm9yIChsb29wID0gbG9hZG1hcC0+bnNlZ3M7IGxvb3AgPiAwOyBsb29wLS0sIHNlZysrKSB7CisJCQlpZiAocGFyYW1zLT5oZHIuZV9lbnRyeSA+PSBzZWctPnBfdmFkZHIgJiYKKwkJCSAgICBwYXJhbXMtPmhkci5lX2VudHJ5IDwgc2VnLT5wX3ZhZGRyICsgc2VnLT5wX21lbXN6CisJCQkgICAgKSB7CisJCQkJcGFyYW1zLT5lbnRyeV9hZGRyID0KKwkJCQkJKHBhcmFtcy0+aGRyLmVfZW50cnkgLSBzZWctPnBfdmFkZHIpICsgc2VnLT5hZGRyOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJLyogZGV0ZXJtaW5lIHdoZXJlIHRoZSBwcm9ncmFtIGhlYWRlciB0YWJsZSBoYXMgd291bmQgdXAgaWYgbWFwcGVkICovCisJc3RvcCA9IHBhcmFtcy0+aGRyLmVfcGhvZmYgKyBwYXJhbXMtPmhkci5lX3BobnVtICogc2l6ZW9mIChzdHJ1Y3QgZWxmX3BoZHIpOworCXBoZHIgPSBwYXJhbXMtPnBoZHJzOworCisJZm9yIChsb29wID0gMDsgbG9vcCA8IHBhcmFtcy0+aGRyLmVfcGhudW07IGxvb3ArKywgcGhkcisrKSB7CisJCWlmIChwaGRyLT5wX3R5cGUgIT0gUFRfTE9BRCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChwaGRyLT5wX29mZnNldCA+IHBhcmFtcy0+aGRyLmVfcGhvZmYgfHwKKwkJICAgIHBoZHItPnBfb2Zmc2V0ICsgcGhkci0+cF9maWxlc3ogPCBzdG9wKQorCQkJY29udGludWU7CisKKwkJc2VnID0gbG9hZG1hcC0+c2VnczsKKwkJZm9yIChsb29wID0gbG9hZG1hcC0+bnNlZ3M7IGxvb3AgPiAwOyBsb29wLS0sIHNlZysrKSB7CisJCQlpZiAocGhkci0+cF92YWRkciA+PSBzZWctPnBfdmFkZHIgJiYKKwkJCSAgICBwaGRyLT5wX3ZhZGRyICsgcGhkci0+cF9maWxlc3ogPD0gc2VnLT5wX3ZhZGRyICsgc2VnLT5wX21lbXN6CisJCQkgICAgKSB7CisJCQkJcGFyYW1zLT5waF9hZGRyID0gKHBoZHItPnBfdmFkZHIgLSBzZWctPnBfdmFkZHIpICsgc2VnLT5hZGRyICsKKwkJCQkJcGFyYW1zLT5oZHIuZV9waG9mZiAtIHBoZHItPnBfb2Zmc2V0OworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWJyZWFrOworCX0KKworCS8qIGRldGVybWluZSB3aGVyZSB0aGUgZHluYW1pYyBzZWN0aW9uIGhhcyB3b3VuZCB1cCBpZiB0aGVyZSBpcyBvbmUgKi8KKwlwaGRyID0gcGFyYW1zLT5waGRyczsKKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgcGFyYW1zLT5oZHIuZV9waG51bTsgbG9vcCsrLCBwaGRyKyspIHsKKwkJaWYgKHBoZHItPnBfdHlwZSAhPSBQVF9EWU5BTUlDKQorCQkJY29udGludWU7CisKKwkJc2VnID0gbG9hZG1hcC0+c2VnczsKKwkJZm9yIChsb29wID0gbG9hZG1hcC0+bnNlZ3M7IGxvb3AgPiAwOyBsb29wLS0sIHNlZysrKSB7CisJCQlpZiAocGhkci0+cF92YWRkciA+PSBzZWctPnBfdmFkZHIgJiYKKwkJCSAgICBwaGRyLT5wX3ZhZGRyICsgcGhkci0+cF9tZW1zeiA8PSBzZWctPnBfdmFkZHIgKyBzZWctPnBfbWVtc3oKKwkJCSAgICApIHsKKwkJCQlwYXJhbXMtPmR5bmFtaWNfYWRkciA9IChwaGRyLT5wX3ZhZGRyIC0gc2VnLT5wX3ZhZGRyKSArIHNlZy0+YWRkcjsKKworCQkJCS8qIGNoZWNrIHRoZSBkeW5hbWljIHNlY3Rpb24gY29udGFpbnMgYXQgbGVhc3Qgb25lIGl0ZW0sIGFuZCB0aGF0CisJCQkJICogdGhlIGxhc3QgaXRlbSBpcyBhIE5VTEwgZW50cnkgKi8KKwkJCQlpZiAocGhkci0+cF9tZW1zeiA9PSAwIHx8CisJCQkJICAgIHBoZHItPnBfbWVtc3ogJSBzaXplb2YoRWxmMzJfRHluKSAhPSAwKQorCQkJCQlnb3RvIGR5bmFtaWNfZXJyb3I7CisKKwkJCQl0bXAgPSBwaGRyLT5wX21lbXN6IC8gc2l6ZW9mKEVsZjMyX0R5bik7CisJCQkJaWYgKCgoRWxmMzJfRHluICopIHBhcmFtcy0+ZHluYW1pY19hZGRyKVt0bXAgLSAxXS5kX3RhZyAhPSAwKQorCQkJCQlnb3RvIGR5bmFtaWNfZXJyb3I7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJfQorCisJLyogbm93IGVsaWRlIGFkamFjZW50IHNlZ21lbnRzIGluIHRoZSBsb2FkIG1hcCBvbiBNTVUgbGludXgKKwkgKiAtIG9uIHVDbGludXggdGhlIGhvbGVzIGJldHdlZW4gbWF5IGFjdHVhbGx5IGJlIGZpbGxlZCB3aXRoIHN5c3RlbSBzdHVmZiBvciBzdHVmZiBmcm9tCisJICogICBvdGhlciBwcm9jZXNzZXMKKwkgKi8KKyNpZmRlZiBDT05GSUdfTU1VCisJbmxvYWRzID0gbG9hZG1hcC0+bnNlZ3M7CisJbXNlZyA9IGxvYWRtYXAtPnNlZ3M7CisJc2VnID0gbXNlZyArIDE7CisJZm9yIChsb29wID0gMTsgbG9vcCA8IG5sb2FkczsgbG9vcCsrKSB7CisJCS8qIHNlZSBpZiB3ZSBoYXZlIGEgY2FuZGlkYXRlIGZvciBtZXJnaW5nICovCisJCWlmIChzZWctPnBfdmFkZHIgLSBtc2VnLT5wX3ZhZGRyID09IHNlZy0+YWRkciAtIG1zZWctPmFkZHIpIHsKKwkJCWxvYWRfYWRkciA9IFBBR0VfQUxJR04obXNlZy0+YWRkciArIG1zZWctPnBfbWVtc3opOworCQkJaWYgKGxvYWRfYWRkciA9PSAoc2VnLT5hZGRyICYgUEFHRV9NQVNLKSkgeworCQkJCW1zZWctPnBfbWVtc3ogKz0gbG9hZF9hZGRyIC0gKG1zZWctPmFkZHIgKyBtc2VnLT5wX21lbXN6KTsKKwkJCQltc2VnLT5wX21lbXN6ICs9IHNlZy0+YWRkciAmIH5QQUdFX01BU0s7CisJCQkJbXNlZy0+cF9tZW1zeiArPSBzZWctPnBfbWVtc3o7CisJCQkJbG9hZG1hcC0+bnNlZ3MtLTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCW1zZWcrKzsKKwkJaWYgKG1zZWcgIT0gc2VnKQorCQkJKm1zZWcgPSAqc2VnOworCX0KKyNlbmRpZgorCisJa2RlYnVnKCJNYXBwZWQgT2JqZWN0IFslc106Iiwgd2hhdCk7CisJa2RlYnVnKCItIGVsZmhkciAgIDogJWx4IiwgcGFyYW1zLT5lbGZoZHJfYWRkcik7CisJa2RlYnVnKCItIGVudHJ5ICAgIDogJWx4IiwgcGFyYW1zLT5lbnRyeV9hZGRyKTsKKwlrZGVidWcoIi0gUEhEUltdICAgOiAlbHgiLCBwYXJhbXMtPnBoX2FkZHIpOworCWtkZWJ1ZygiLSBEWU5BTUlDW106ICVseCIsIHBhcmFtcy0+ZHluYW1pY19hZGRyKTsKKwlzZWcgPSBsb2FkbWFwLT5zZWdzOworCWZvciAobG9vcCA9IDA7IGxvb3AgPCBsb2FkbWFwLT5uc2VnczsgbG9vcCsrLCBzZWcrKykKKwkJa2RlYnVnKCItIExPQURbJWRdIDogJTA4eC0lMDh4IFt2YT0leCBtcz0leF0iLAorCQkgICAgICAgbG9vcCwKKwkJICAgICAgIHNlZy0+YWRkciwgc2VnLT5hZGRyICsgc2VnLT5wX21lbXN6IC0gMSwKKwkJICAgICAgIHNlZy0+cF92YWRkciwgc2VnLT5wX21lbXN6KTsKKworCXJldHVybiAwOworCisgZHluYW1pY19lcnJvcjoKKwlwcmludGsoIkVMRiBGRFBJQyAlcyB3aXRoIGludmFsaWQgRFlOQU1JQyBzZWN0aW9uIChpbm9kZT0lbHUpXG4iLAorCSAgICAgICB3aGF0LCBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9pbm8pOworCXJldHVybiAtRUxJQkJBRDsKK30gLyogZW5kIGVsZl9mZHBpY19tYXBfZmlsZSgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBtYXAgYSBmaWxlIHdpdGggY29uc3RhbnQgZGlzcGxhY2VtZW50IHVuZGVyIHVDbGludXgKKyAqLworI2lmbmRlZiBDT05GSUdfTU1VCitzdGF0aWMgaW50IGVsZl9mZHBpY19tYXBfZmlsZV9jb25zdGRpc3Bfb25fdWNsaW51eChzdHJ1Y3QgZWxmX2ZkcGljX3BhcmFtcyAqcGFyYW1zLAorCQkJCQkJICAgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCQkgICBzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlzdHJ1Y3QgZWxmMzJfZmRwaWNfbG9hZHNlZyAqc2VnOworCXN0cnVjdCBlbGYzMl9waGRyICpwaGRyOworCXVuc2lnbmVkIGxvbmcgbG9hZF9hZGRyLCBiYXNlID0gVUxPTkdfTUFYLCB0b3AgPSAwLCBtYWRkciA9IDAsIG1mbGFnczsKKwlsb2ZmX3QgZnBvczsKKwlpbnQgbG9vcCwgcmV0OworCisJbG9hZF9hZGRyID0gcGFyYW1zLT5sb2FkX2FkZHI7CisJc2VnID0gcGFyYW1zLT5sb2FkbWFwLT5zZWdzOworCisJLyogZGV0ZXJtaW5lIHRoZSBib3VuZHMgb2YgdGhlIGNvbnRpZ3VvdXMgb3ZlcmFsbCBhbGxvY2F0aW9uIHdlIG11c3QgbWFrZSAqLworCXBoZHIgPSBwYXJhbXMtPnBoZHJzOworCWZvciAobG9vcCA9IDA7IGxvb3AgPCBwYXJhbXMtPmhkci5lX3BobnVtOyBsb29wKyssIHBoZHIrKykgeworCQlpZiAocGFyYW1zLT5waGRyc1tsb29wXS5wX3R5cGUgIT0gUFRfTE9BRCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChiYXNlID4gcGhkci0+cF92YWRkcikKKwkJCWJhc2UgPSBwaGRyLT5wX3ZhZGRyOworCQlpZiAodG9wIDwgcGhkci0+cF92YWRkciArIHBoZHItPnBfbWVtc3opCisJCQl0b3AgPSBwaGRyLT5wX3ZhZGRyICsgcGhkci0+cF9tZW1zejsKKwl9CisKKwkvKiBhbGxvY2F0ZSBvbmUgYmlnIGFub24gYmxvY2sgZm9yIGV2ZXJ5dGhpbmcgKi8KKwltZmxhZ3MgPSBNQVBfUFJJVkFURTsKKwlpZiAocGFyYW1zLT5mbGFncyAmIEVMRl9GRFBJQ19GTEFHX0VYRUNVVEFCTEUpCisJCW1mbGFncyB8PSBNQVBfRVhFQ1VUQUJMRTsKKworCWRvd25fd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisJbWFkZHIgPSBkb19tbWFwKE5VTEwsIGxvYWRfYWRkciwgdG9wIC0gYmFzZSwKKwkJCVBST1RfUkVBRCB8IFBST1RfV1JJVEUgfCBQUk9UX0VYRUMsIG1mbGFncywgMCk7CisJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisJaWYgKElTX0VSUigodm9pZCAqKSBtYWRkcikpCisJCXJldHVybiAoaW50KSBtYWRkcjsKKworCWlmIChsb2FkX2FkZHIgIT0gMCkKKwkJbG9hZF9hZGRyICs9IFBBR0VfQUxJR04odG9wIC0gYmFzZSk7CisKKwkvKiBhbmQgdGhlbiBsb2FkIHRoZSBmaWxlIHNlZ21lbnRzIGludG8gaXQgKi8KKwlwaGRyID0gcGFyYW1zLT5waGRyczsKKwlmb3IgKGxvb3AgPSAwOyBsb29wIDwgcGFyYW1zLT5oZHIuZV9waG51bTsgbG9vcCsrLCBwaGRyKyspIHsKKwkJaWYgKHBhcmFtcy0+cGhkcnNbbG9vcF0ucF90eXBlICE9IFBUX0xPQUQpCisJCQljb250aW51ZTsKKworCQlmcG9zID0gcGhkci0+cF9vZmZzZXQ7CisKKwkJc2VnLT5hZGRyID0gbWFkZHIgKyAocGhkci0+cF92YWRkciAtIGJhc2UpOworCQlzZWctPnBfdmFkZHIgPSBwaGRyLT5wX3ZhZGRyOworCQlzZWctPnBfbWVtc3ogPSBwaGRyLT5wX21lbXN6OworCisJCXJldCA9IGZpbGUtPmZfb3AtPnJlYWQoZmlsZSwgKHZvaWQgKikgc2VnLT5hZGRyLCBwaGRyLT5wX2ZpbGVzeiwgJmZwb3MpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJLyogbWFwIHRoZSBFTEYgaGVhZGVyIGFkZHJlc3MgaWYgaW4gdGhpcyBzZWdtZW50ICovCisJCWlmIChwaGRyLT5wX29mZnNldCA9PSAwKQorCQkJcGFyYW1zLT5lbGZoZHJfYWRkciA9IHNlZy0+YWRkcjsKKworCQkvKiBjbGVhciBhbnkgc3BhY2UgYWxsb2NhdGVkIGJ1dCBub3QgbG9hZGVkICovCisJCWlmIChwaGRyLT5wX2ZpbGVzeiA8IHBoZHItPnBfbWVtc3opCisJCQljbGVhcl91c2VyKCh2b2lkICopIChzZWctPmFkZHIgKyBwaGRyLT5wX2ZpbGVzeiksCisJCQkJICAgcGhkci0+cF9tZW1zeiAtIHBoZHItPnBfZmlsZXN6KTsKKworCQlpZiAobW0pIHsKKwkJCWlmIChwaGRyLT5wX2ZsYWdzICYgUEZfWCkgeworCQkJCW1tLT5zdGFydF9jb2RlID0gc2VnLT5hZGRyOworCQkJCW1tLT5lbmRfY29kZSA9IHNlZy0+YWRkciArIHBoZHItPnBfbWVtc3o7CisJCQl9CisJCQllbHNlIGlmICghbW0tPnN0YXJ0X2RhdGEpIHsKKwkJCQltbS0+c3RhcnRfZGF0YSA9IHNlZy0+YWRkcjsKKyNpZm5kZWYgQ09ORklHX01NVQorCQkJCW1tLT5lbmRfZGF0YSA9IHNlZy0+YWRkciArIHBoZHItPnBfbWVtc3o7CisjZW5kaWYKKwkJCX0KKworI2lmZGVmIENPTkZJR19NTVUKKwkJCWlmIChzZWctPmFkZHIgKyBwaGRyLT5wX21lbXN6ID4gbW0tPmVuZF9kYXRhKQorCQkJCW1tLT5lbmRfZGF0YSA9IHNlZy0+YWRkciArIHBoZHItPnBfbWVtc3o7CisjZW5kaWYKKwkJfQorCisJCXNlZysrOworCX0KKworCXJldHVybiAwOworfSAvKiBlbmQgZWxmX2ZkcGljX21hcF9maWxlX2NvbnN0ZGlzcF9vbl91Y2xpbnV4KCkgKi8KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogbWFwIGEgYmluYXJ5IGJ5IGRpcmVjdCBtbWFwKCkgb2YgdGhlIGluZGl2aWR1YWwgUFRfTE9BRCBzZWdtZW50cworICovCitzdGF0aWMgaW50IGVsZl9mZHBpY19tYXBfZmlsZV9ieV9kaXJlY3RfbW1hcChzdHJ1Y3QgZWxmX2ZkcGljX3BhcmFtcyAqcGFyYW1zLAorCQkJCQkgICAgIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQkgICAgIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCXN0cnVjdCBlbGYzMl9mZHBpY19sb2Fkc2VnICpzZWc7CisJc3RydWN0IGVsZjMyX3BoZHIgKnBoZHI7CisJdW5zaWduZWQgbG9uZyBsb2FkX2FkZHIsIGRlbHRhX3ZhZGRyOworCWludCBsb29wLCBkdnNldDsKKworCWxvYWRfYWRkciA9IHBhcmFtcy0+bG9hZF9hZGRyOworCWRlbHRhX3ZhZGRyID0gMDsKKwlkdnNldCA9IDA7CisKKwlzZWcgPSBwYXJhbXMtPmxvYWRtYXAtPnNlZ3M7CisKKwkvKiBkZWFsIHdpdGggZWFjaCBsb2FkIHNlZ21lbnQgc2VwYXJhdGVseSAqLworCXBoZHIgPSBwYXJhbXMtPnBoZHJzOworCWZvciAobG9vcCA9IDA7IGxvb3AgPCBwYXJhbXMtPmhkci5lX3BobnVtOyBsb29wKyssIHBoZHIrKykgeworCQl1bnNpZ25lZCBsb25nIG1hZGRyLCBkaXNwLCBleGNlc3MsIGV4Y2VzczE7CisJCWludCBwcm90ID0gMCwgZmxhZ3M7CisKKwkJaWYgKHBoZHItPnBfdHlwZSAhPSBQVF9MT0FEKQorCQkJY29udGludWU7CisKKwkJa2RlYnVnKCJbTE9BRF0gdmE9JWx4IG9mPSVseCBmcz0lbHggbXM9JWx4IiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSBwaGRyLT5wX3ZhZGRyLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHBoZHItPnBfb2Zmc2V0LAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHBoZHItPnBfZmlsZXN6LAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHBoZHItPnBfbWVtc3opOworCisJCS8qIGRldGVybWluZSB0aGUgbWFwcGluZyBwYXJhbWV0ZXJzICovCisJCWlmIChwaGRyLT5wX2ZsYWdzICYgUEZfUikgcHJvdCB8PSBQUk9UX1JFQUQ7CisJCWlmIChwaGRyLT5wX2ZsYWdzICYgUEZfVykgcHJvdCB8PSBQUk9UX1dSSVRFOworCQlpZiAocGhkci0+cF9mbGFncyAmIFBGX1gpIHByb3QgfD0gUFJPVF9FWEVDOworCisJCWZsYWdzID0gTUFQX1BSSVZBVEUgfCBNQVBfREVOWVdSSVRFOworCQlpZiAocGFyYW1zLT5mbGFncyAmIEVMRl9GRFBJQ19GTEFHX0VYRUNVVEFCTEUpCisJCQlmbGFncyB8PSBNQVBfRVhFQ1VUQUJMRTsKKworCQltYWRkciA9IDA7CisKKwkJc3dpdGNoIChwYXJhbXMtPmZsYWdzICYgRUxGX0ZEUElDX0ZMQUdfQVJSQU5HRU1FTlQpIHsKKwkJY2FzZSBFTEZfRkRQSUNfRkxBR19JTkRFUEVOREVOVDoKKwkJCS8qIFBUX0xPQURzIGFyZSBpbmRlcGVuZGVudGx5IGxvY2F0YWJsZSAqLworCQkJYnJlYWs7CisKKwkJY2FzZSBFTEZfRkRQSUNfRkxBR19IT05PVVJWQUREUjoKKwkJCS8qIHRoZSBzcGVjaWZpZWQgdmlydHVhbCBhZGRyZXNzIG11c3QgYmUgaG9ub3VyZWQgKi8KKwkJCW1hZGRyID0gcGhkci0+cF92YWRkcjsKKwkJCWZsYWdzIHw9IE1BUF9GSVhFRDsKKwkJCWJyZWFrOworCisJCWNhc2UgRUxGX0ZEUElDX0ZMQUdfQ09OU1RESVNQOgorCQkJLyogY29uc3RhbnQgZGlzcGxhY2VtZW50CisJCQkgKiAtIGNhbiBiZSBtYXBwZWQgYW55d2hlcmUsIGJ1dCBtdXN0IGJlIG1hcHBlZCBhcyBhIHVuaXQKKwkJCSAqLworCQkJaWYgKCFkdnNldCkgeworCQkJCW1hZGRyID0gbG9hZF9hZGRyOworCQkJCWRlbHRhX3ZhZGRyID0gcGhkci0+cF92YWRkcjsKKwkJCQlkdnNldCA9IDE7CisJCQl9CisJCQllbHNlIHsKKwkJCQltYWRkciA9IGxvYWRfYWRkciArIHBoZHItPnBfdmFkZHIgLSBkZWx0YV92YWRkcjsKKwkJCQlmbGFncyB8PSBNQVBfRklYRUQ7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEVMRl9GRFBJQ19GTEFHX0NPTlRJR1VPVVM6CisJCQkvKiBjb250aWd1aXR5IGhhbmRsZWQgbGF0ZXIgKi8KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlCVUcoKTsKKwkJfQorCisJCW1hZGRyICY9IFBBR0VfTUFTSzsKKworCQkvKiBjcmVhdGUgdGhlIG1hcHBpbmcgKi8KKwkJZGlzcCA9IHBoZHItPnBfdmFkZHIgJiB+UEFHRV9NQVNLOworCQlkb3duX3dyaXRlKCZtbS0+bW1hcF9zZW0pOworCQltYWRkciA9IGRvX21tYXAoZmlsZSwgbWFkZHIsIHBoZHItPnBfbWVtc3ogKyBkaXNwLCBwcm90LCBmbGFncywKKwkJCQlwaGRyLT5wX29mZnNldCAtIGRpc3ApOworCQl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKworCQlrZGVidWcoIm1tYXBbJWRdIDxmaWxlPiBzej0lbHggcHI9JXggZmw9JXggb2Y9JWx4IC0tPiAlMDhseCIsCisJCSAgICAgICBsb29wLCBwaGRyLT5wX21lbXN6ICsgZGlzcCwgcHJvdCwgZmxhZ3MsIHBoZHItPnBfb2Zmc2V0IC0gZGlzcCwKKwkJICAgICAgIG1hZGRyKTsKKworCQlpZiAoSVNfRVJSKCh2b2lkICopIG1hZGRyKSkKKwkJCXJldHVybiAoaW50KSBtYWRkcjsKKworCQlpZiAoKHBhcmFtcy0+ZmxhZ3MgJiBFTEZfRkRQSUNfRkxBR19BUlJBTkdFTUVOVCkgPT0gRUxGX0ZEUElDX0ZMQUdfQ09OVElHVU9VUykKKwkJCWxvYWRfYWRkciArPSBQQUdFX0FMSUdOKHBoZHItPnBfbWVtc3ogKyBkaXNwKTsKKworCQlzZWctPmFkZHIgPSBtYWRkciArIGRpc3A7CisJCXNlZy0+cF92YWRkciA9IHBoZHItPnBfdmFkZHI7CisJCXNlZy0+cF9tZW1zeiA9IHBoZHItPnBfbWVtc3o7CisKKwkJLyogbWFwIHRoZSBFTEYgaGVhZGVyIGFkZHJlc3MgaWYgaW4gdGhpcyBzZWdtZW50ICovCisJCWlmIChwaGRyLT5wX29mZnNldCA9PSAwKQorCQkJcGFyYW1zLT5lbGZoZHJfYWRkciA9IHNlZy0+YWRkcjsKKworCQkvKiBjbGVhciB0aGUgYml0IGJldHdlZW4gYmVnaW5uaW5nIG9mIG1hcHBpbmcgYW5kIGJlZ2lubmluZyBvZiBQVF9MT0FEICovCisJCWlmIChwcm90ICYgUFJPVF9XUklURSAmJiBkaXNwID4gMCkgeworCQkJa2RlYnVnKCJjbGVhclslZF0gYWQ9JWx4IHN6PSVseCIsIGxvb3AsIG1hZGRyLCBkaXNwKTsKKwkJCWNsZWFyX3VzZXIoKHZvaWQgKikgbWFkZHIsIGRpc3ApOworCQkJbWFkZHIgKz0gZGlzcDsKKwkJfQorCisJCS8qIGNsZWFyIGFueSBzcGFjZSBhbGxvY2F0ZWQgYnV0IG5vdCBsb2FkZWQKKwkJICogLSBvbiB1Q2xpbnV4IHdlIGNhbiBqdXN0IGNsZWFyIHRoZSBsb3QKKwkJICogLSBvbiBNTVUgbGludXggd2UnbGwgZ2V0IGEgU0lHQlVTIGJleW9uZCB0aGUgbGFzdCBwYWdlCisJCSAqICAgZXh0YW50IGluIHRoZSBmaWxlCisJCSAqLworCQlleGNlc3MgPSBwaGRyLT5wX21lbXN6IC0gcGhkci0+cF9maWxlc3o7CisJCWV4Y2VzczEgPSBQQUdFX1NJWkUgLSAoKG1hZGRyICsgcGhkci0+cF9maWxlc3opICYgflBBR0VfTUFTSyk7CisKKyNpZmRlZiBDT05GSUdfTU1VCisKKwkJaWYgKGV4Y2VzcyA+IGV4Y2VzczEpIHsKKwkJCXVuc2lnbmVkIGxvbmcgeGFkZHIgPSBtYWRkciArIHBoZHItPnBfZmlsZXN6ICsgZXhjZXNzMTsKKwkJCXVuc2lnbmVkIGxvbmcgeG1hZGRyOworCisJCQlmbGFncyB8PSBNQVBfRklYRUQgfCBNQVBfQU5PTllNT1VTOworCQkJZG93bl93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKwkJCXhtYWRkciA9IGRvX21tYXAoTlVMTCwgeGFkZHIsIGV4Y2VzcyAtIGV4Y2VzczEsIHByb3QsIGZsYWdzLCAwKTsKKwkJCXVwX3dyaXRlKCZtbS0+bW1hcF9zZW0pOworCisJCQlrZGVidWcoIm1tYXBbJWRdIDxhbm9uPiIKKwkJCSAgICAgICAiIGFkPSVseCBzej0lbHggcHI9JXggZmw9JXggb2Y9MCAtLT4gJTA4bHgiLAorCQkJICAgICAgIGxvb3AsIHhhZGRyLCBleGNlc3MgLSBleGNlc3MxLCBwcm90LCBmbGFncywgeG1hZGRyKTsKKworCQkJaWYgKHhtYWRkciAhPSB4YWRkcikKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCWlmIChwcm90ICYgUFJPVF9XUklURSAmJiBleGNlc3MxID4gMCkgeworCQkJa2RlYnVnKCJjbGVhclslZF0gYWQ9JWx4IHN6PSVseCIsCisJCQkgICAgICAgbG9vcCwgbWFkZHIgKyBwaGRyLT5wX2ZpbGVzeiwgZXhjZXNzMSk7CisJCQljbGVhcl91c2VyKCh2b2lkICopIG1hZGRyICsgcGhkci0+cF9maWxlc3osIGV4Y2VzczEpOworCQl9CisKKyNlbHNlCisJCWlmIChleGNlc3MgPiAwKSB7CisJCQlrZGVidWcoImNsZWFyWyVkXSBhZD0lbHggc3o9JWx4IiwKKwkJCSAgICAgICBsb29wLCBtYWRkciArIHBoZHItPnBfZmlsZXN6LCBleGNlc3MpOworCQkJY2xlYXJfdXNlcigodm9pZCAqKSBtYWRkciArIHBoZHItPnBfZmlsZXN6LCBleGNlc3MpOworCQl9CisjZW5kaWYKKworCQlpZiAobW0pIHsKKwkJCWlmIChwaGRyLT5wX2ZsYWdzICYgUEZfWCkgeworCQkJCW1tLT5zdGFydF9jb2RlID0gbWFkZHI7CisJCQkJbW0tPmVuZF9jb2RlID0gbWFkZHIgKyBwaGRyLT5wX21lbXN6OworCQkJfQorCQkJZWxzZSBpZiAoIW1tLT5zdGFydF9kYXRhKSB7CisJCQkJbW0tPnN0YXJ0X2RhdGEgPSBtYWRkcjsKKwkJCQltbS0+ZW5kX2RhdGEgPSBtYWRkciArIHBoZHItPnBfbWVtc3o7CisJCQl9CisJCX0KKworCQlzZWcrKzsKKwl9CisKKwlyZXR1cm4gMDsKK30gLyogZW5kIGVsZl9mZHBpY19tYXBfZmlsZV9ieV9kaXJlY3RfbW1hcCgpICovCmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfZW04Ni5jIGIvZnMvYmluZm10X2VtODYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjJkMWFkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYmluZm10X2VtODYuYwpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqICBsaW51eC9mcy9iaW5mbXRfZW04Ni5jCisgKgorICogIEJhc2VkIG9uIGxpbnV4L2ZzL2JpbmZtdF9zY3JpcHQuYworICogIENvcHlyaWdodCAoQykgMTk5NiAgTWFydGluIHZvbiBM9ndpcworICogIG9yaWdpbmFsICMhLWNoZWNraW5nIGltcGxlbWVudGVkIGJ5IHR5dHNvLgorICoKKyAqICBlbTg2IGNoYW5nZXMgQ29weXJpZ2h0IChDKSAxOTk3ICBKaW0gUGFyYWRpcworICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYmluZm10cy5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCisKKyNkZWZpbmUgRU04Nl9JTlRFUlAJIi91c3IvYmluL2VtODYiCisjZGVmaW5lIEVNODZfSV9OQU1FCSJlbTg2IgorCitzdGF0aWMgaW50IGxvYWRfZW04NihzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtLHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWNoYXIgKmludGVycCwgKmlfbmFtZSwgKmlfYXJnOworCXN0cnVjdCBmaWxlICogZmlsZTsKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBlbGZoZHIJZWxmX2V4OworCisJLyogTWFrZSBzdXJlIHRoaXMgaXMgYSBMaW51eC9JbnRlbCBFTEYgZXhlY3V0YWJsZS4uLiAqLworCWVsZl9leCA9ICooKHN0cnVjdCBlbGZoZHIgKilicHJtLT5idWYpOworCisJaWYgKG1lbWNtcChlbGZfZXguZV9pZGVudCwgRUxGTUFHLCBTRUxGTUFHKSAhPSAwKQorCQlyZXR1cm4gIC1FTk9FWEVDOworCisJLyogRmlyc3Qgb2YgYWxsLCBzb21lIHNpbXBsZSBjb25zaXN0ZW5jeSBjaGVja3MgKi8KKwlpZiAoKGVsZl9leC5lX3R5cGUgIT0gRVRfRVhFQyAmJiBlbGZfZXguZV90eXBlICE9IEVUX0RZTikgfHwKKwkJKCEoKGVsZl9leC5lX21hY2hpbmUgPT0gRU1fMzg2KSB8fCAoZWxmX2V4LmVfbWFjaGluZSA9PSBFTV80ODYpKSkgfHwKKwkJKCFicHJtLT5maWxlLT5mX29wIHx8ICFicHJtLT5maWxlLT5mX29wLT5tbWFwKSkgeworCQkJcmV0dXJuIC1FTk9FWEVDOworCX0KKworCWJwcm0tPnNoX2JhbmcrKzsJLyogV2VsbCwgdGhlIGJhbmctc2hlbGwgaXMgaW1wbGljaXQuLi4gKi8KKwlhbGxvd193cml0ZV9hY2Nlc3MoYnBybS0+ZmlsZSk7CisJZnB1dChicHJtLT5maWxlKTsKKwlicHJtLT5maWxlID0gTlVMTDsKKworCS8qIFVubGlrZSBpbiB0aGUgc2NyaXB0IGNhc2UsIHdlIGRvbid0IGhhdmUgdG8gZG8gYW55IGhhaXJ5CisJICogcGFyc2luZyB0byBmaW5kIG91ciBpbnRlcnByZXRlci4uLiBpdCdzIGhhcmRjb2RlZCEKKwkgKi8KKwlpbnRlcnAgPSBFTTg2X0lOVEVSUDsKKwlpX25hbWUgPSBFTTg2X0lfTkFNRTsKKwlpX2FyZyA9IE5VTEw7CQkvKiBXZSByZXNlcnZlIHRoZSByaWdodCB0byBhZGQgYW4gYXJnIGxhdGVyICovCisKKwkvKgorCSAqIFNwbGljZSBpbiAoMSkgdGhlIGludGVycHJldGVyJ3MgbmFtZSBmb3IgYXJndlswXQorCSAqICAgICAgICAgICAoMikgKG9wdGlvbmFsKSBhcmd1bWVudCB0byBpbnRlcnByZXRlcgorCSAqICAgICAgICAgICAoMykgZmlsZW5hbWUgb2YgZW11bGF0ZWQgZmlsZSAocmVwbGFjZSBhcmd2WzBdKQorCSAqCisJICogVGhpcyBpcyBkb25lIGluIHJldmVyc2Ugb3JkZXIsIGJlY2F1c2Ugb2YgaG93IHRoZQorCSAqIHVzZXIgZW52aXJvbm1lbnQgYW5kIGFyZ3VtZW50cyBhcmUgc3RvcmVkLgorCSAqLworCXJlbW92ZV9hcmdfemVybyhicHJtKTsKKwlyZXR2YWwgPSBjb3B5X3N0cmluZ3Nfa2VybmVsKDEsICZicHJtLT5maWxlbmFtZSwgYnBybSk7CisJaWYgKHJldHZhbCA8IDApIHJldHVybiByZXR2YWw7IAorCWJwcm0tPmFyZ2MrKzsKKwlpZiAoaV9hcmcpIHsKKwkJcmV0dmFsID0gY29weV9zdHJpbmdzX2tlcm5lbCgxLCAmaV9hcmcsIGJwcm0pOworCQlpZiAocmV0dmFsIDwgMCkgcmV0dXJuIHJldHZhbDsgCisJCWJwcm0tPmFyZ2MrKzsKKwl9CisJcmV0dmFsID0gY29weV9zdHJpbmdzX2tlcm5lbCgxLCAmaV9uYW1lLCBicHJtKTsKKwlpZiAocmV0dmFsIDwgMCkJcmV0dXJuIHJldHZhbDsKKwlicHJtLT5hcmdjKys7CisKKwkvKgorCSAqIE9LLCBub3cgcmVzdGFydCB0aGUgcHJvY2VzcyB3aXRoIHRoZSBpbnRlcnByZXRlcidzIGlub2RlLgorCSAqIE5vdGUgdGhhdCB3ZSB1c2Ugb3Blbl9leGVjKCkgYXMgdGhlIG5hbWUgaXMgbm93IGluIGtlcm5lbAorCSAqIHNwYWNlLCBhbmQgd2UgZG9uJ3QgbmVlZCB0byBjb3B5IGl0LgorCSAqLworCWZpbGUgPSBvcGVuX2V4ZWMoaW50ZXJwKTsKKwlpZiAoSVNfRVJSKGZpbGUpKQorCQlyZXR1cm4gUFRSX0VSUihmaWxlKTsKKworCWJwcm0tPmZpbGUgPSBmaWxlOworCisJcmV0dmFsID0gcHJlcGFyZV9iaW5wcm0oYnBybSk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlyZXR1cm4gc2VhcmNoX2JpbmFyeV9oYW5kbGVyKGJwcm0sIHJlZ3MpOworfQorCitzdGF0aWMgc3RydWN0IGxpbnV4X2JpbmZtdCBlbTg2X2Zvcm1hdCA9IHsKKwkubW9kdWxlCQk9IFRISVNfTU9EVUxFLAorCS5sb2FkX2JpbmFyeQk9IGxvYWRfZW04NiwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfZW04Nl9iaW5mbXQodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfYmluZm10KCZlbTg2X2Zvcm1hdCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2VtODZfYmluZm10KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9iaW5mbXQoJmVtODZfZm9ybWF0KTsKK30KKworY29yZV9pbml0Y2FsbChpbml0X2VtODZfYmluZm10KTsKK21vZHVsZV9leGl0KGV4aXRfZW04Nl9iaW5mbXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvYmluZm10X2ZsYXQuYyBiL2ZzL2JpbmZtdF9mbGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBjZDY3ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2JpbmZtdF9mbGF0LmMKQEAgLTAsMCArMSw5MDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqICBsaW51eC9mcy9iaW5mbXRfZmxhdC5jCisgKgorICoJQ29weXJpZ2h0IChDKSAyMDAwLTIwMDMgRGF2aWQgTWNDdWxsb3VnaCA8ZGF2aWRtQHNuYXBnZWFyLmNvbT4KKyAqCUNvcHlyaWdodCAoQykgMjAwMiBHcmVnIFVuZ2VyZXIgPGdlcmdAc25hcGdlYXIuY29tPgorICoJQ29weXJpZ2h0IChDKSAyMDAyIFNuYXBHZWFyLCBieSBQYXVsIERhbGUgPHBhdWxpQHNuYXBnZWFyLmNvbT4KKyAqCUNvcHlyaWdodCAoQykgMjAwMCwgMjAwMSBMaW5lbywgYnkgRGF2aWQgTWNDdWxsb3VnaCA8ZGF2aWRtQGxpbmVvLmNvbT4KKyAqICBiYXNlZCBoZWF2aWx5IG9uOgorICoKKyAqICBsaW51eC9mcy9iaW5mbXRfYW91dC5jOgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTYgIExpbnVzIFRvcnZhbGRzCisgKiAgbGludXgvZnMvYmluZm10X2ZsYXQuYyBmb3IgMi4wIGtlcm5lbAorICoJICAgIENvcHlyaWdodCAoQykgMTk5OCAgS2VubmV0aCBBbGJhbm93c2tpIDxramFoZHNAa2phaGRzLmNvbT4KKyAqCUpBTi85OSAtLSBjb2RlZCBmdWxsIHByb2dyYW0gcmVsb2NhdGlvbiAoZ2VyZ0BzbmFwZ2Vhci5jb20pCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CisjaW5jbHVkZSA8bGludXgvYS5vdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYmluZm10cy5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcnNvbmFsaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZsYXQuaD4KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAwCisjZGVmaW5lIERFQlVHIDEKKyNlbmRpZgorCisjaWZkZWYgREVCVUcKKyNkZWZpbmUJREJHX0ZMVChhLi4uKQlwcmludGsoYSkKKyNlbHNlCisjZGVmaW5lCURCR19GTFQoYS4uLikKKyNlbmRpZgorCisjZGVmaW5lIFJFTE9DX0ZBSUxFRCAweGZmMDBmZjAxCQkvKiBSZWxvY2F0aW9uIGluY29ycmVjdCBzb21ld2hlcmUgKi8KKyNkZWZpbmUgVU5MT0FERURfTElCIDB4N2ZmMDAwZmYJCS8qIFBsYWNlaG9sZGVyIGZvciB1bnVzZWQgbGlicmFyeSAqLworCitzdHJ1Y3QgbGliX2luZm8geworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGxvbmcgc3RhcnRfY29kZTsJCS8qIFN0YXJ0IG9mIHRleHQgc2VnbWVudCAqLworCQl1bnNpZ25lZCBsb25nIHN0YXJ0X2RhdGE7CQkvKiBTdGFydCBvZiBkYXRhIHNlZ21lbnQgKi8KKwkJdW5zaWduZWQgbG9uZyBzdGFydF9icms7CQkvKiBFbmQgb2YgZGF0YSBzZWdtZW50ICovCisJCXVuc2lnbmVkIGxvbmcgdGV4dF9sZW47CQkJLyogTGVuZ3RoIG9mIHRleHQgc2VnbWVudCAqLworCQl1bnNpZ25lZCBsb25nIGVudHJ5OwkJCS8qIFN0YXJ0IGFkZHJlc3MgZm9yIHRoaXMgbW9kdWxlICovCisJCXVuc2lnbmVkIGxvbmcgYnVpbGRfZGF0ZTsJCS8qIFdoZW4gdGhpcyBvbmUgd2FzIGNvbXBpbGVkICovCisJCXNob3J0IGxvYWRlZDsJCQkJLyogSGFzIHRoaXMgbGlicmFyeSBiZWVuIGxvYWRlZD8gKi8KKwl9IGxpYl9saXN0W01BWF9TSEFSRURfTElCU107Cit9OworCisjaWZkZWYgQ09ORklHX0JJTkZNVF9TSEFSRURfRkxBVAorc3RhdGljIGludCBsb2FkX2ZsYXRfc2hhcmVkX2xpYnJhcnkoaW50IGlkLCBzdHJ1Y3QgbGliX2luZm8gKnApOworI2VuZGlmCisKK3N0YXRpYyBpbnQgbG9hZF9mbGF0X2JpbmFyeShzdHJ1Y3QgbGludXhfYmlucHJtICosIHN0cnVjdCBwdF9yZWdzICogcmVncyk7CitzdGF0aWMgaW50IGZsYXRfY29yZV9kdW1wKGxvbmcgc2lnbnIsIHN0cnVjdCBwdF9yZWdzICogcmVncywgc3RydWN0IGZpbGUgKmZpbGUpOworCitleHRlcm4gdm9pZCBkdW1wX3RocmVhZChzdHJ1Y3QgcHRfcmVncyAqLCBzdHJ1Y3QgdXNlciAqKTsKKworc3RhdGljIHN0cnVjdCBsaW51eF9iaW5mbXQgZmxhdF9mb3JtYXQgPSB7CisJLm1vZHVsZQkJPSBUSElTX01PRFVMRSwKKwkubG9hZF9iaW5hcnkJPSBsb2FkX2ZsYXRfYmluYXJ5LAorCS5jb3JlX2R1bXAJPSBmbGF0X2NvcmVfZHVtcCwKKwkubWluX2NvcmVkdW1wCT0gUEFHRV9TSVpFCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBSb3V0aW5lIHdyaXRlcyBhIGNvcmUgZHVtcCBpbWFnZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisgKiBDdXJyZW50bHkgb25seSBhIHN0dWItZnVuY3Rpb24uCisgKi8KKworc3RhdGljIGludCBmbGF0X2NvcmVfZHVtcChsb25nIHNpZ25yLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXByaW50aygiUHJvY2VzcyAlczolZCByZWNlaXZlZCBzaWduciAlZCBhbmQgc2hvdWxkIGhhdmUgY29yZSBkdW1wZWRcbiIsCisJCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIChpbnQpIHNpZ25yKTsKKwlyZXR1cm4oMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGNyZWF0ZV9mbGF0X3RhYmxlcygpIHBhcnNlcyB0aGUgZW52LSBhbmQgYXJnLXN0cmluZ3MgaW4gbmV3IHVzZXIKKyAqIG1lbW9yeSBhbmQgY3JlYXRlcyB0aGUgcG9pbnRlciB0YWJsZXMgZnJvbSB0aGVtLCBhbmQgcHV0cyB0aGVpcgorICogYWRkcmVzc2VzIG9uIHRoZSAic3RhY2siLCByZXR1cm5pbmcgdGhlIG5ldyBzdGFjayBwb2ludGVyIHZhbHVlLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNyZWF0ZV9mbGF0X3RhYmxlcygKKwl1bnNpZ25lZCBsb25nIHBwLAorCXN0cnVjdCBsaW51eF9iaW5wcm0gKiBicHJtKQoreworCXVuc2lnbmVkIGxvbmcgKmFyZ3YsKmVudnA7CisJdW5zaWduZWQgbG9uZyAqIHNwOworCWNoYXIgKiBwID0gKGNoYXIqKXBwOworCWludCBhcmdjID0gYnBybS0+YXJnYzsKKwlpbnQgZW52YyA9IGJwcm0tPmVudmM7CisJY2hhciBkdW1teTsKKworCXNwID0gKHVuc2lnbmVkIGxvbmcgKikgKCgtKHVuc2lnbmVkIGxvbmcpc2l6ZW9mKGNoYXIgKikpJih1bnNpZ25lZCBsb25nKSBwKTsKKworCXNwIC09IGVudmMrMTsKKwllbnZwID0gc3A7CisJc3AgLT0gYXJnYysxOworCWFyZ3YgPSBzcDsKKworCWZsYXRfc3RhY2tfYWxpZ24oc3ApOworCWlmIChmbGF0X2FyZ3ZwX2VudnBfb25fc3RhY2soKSkgeworCQktLXNwOyBwdXRfdXNlcigodW5zaWduZWQgbG9uZykgZW52cCwgc3ApOworCQktLXNwOyBwdXRfdXNlcigodW5zaWduZWQgbG9uZykgYXJndiwgc3ApOworCX0KKworCXB1dF91c2VyKGFyZ2MsLS1zcCk7CisJY3VycmVudC0+bW0tPmFyZ19zdGFydCA9ICh1bnNpZ25lZCBsb25nKSBwOworCXdoaWxlIChhcmdjLS0+MCkgeworCQlwdXRfdXNlcigodW5zaWduZWQgbG9uZykgcCwgYXJndisrKTsKKwkJZG8geworCQkJZ2V0X3VzZXIoZHVtbXksIHApOyBwKys7CisJCX0gd2hpbGUgKGR1bW15KTsKKwl9CisJcHV0X3VzZXIoKHVuc2lnbmVkIGxvbmcpIE5VTEwsIGFyZ3YpOworCWN1cnJlbnQtPm1tLT5hcmdfZW5kID0gY3VycmVudC0+bW0tPmVudl9zdGFydCA9ICh1bnNpZ25lZCBsb25nKSBwOworCXdoaWxlIChlbnZjLS0+MCkgeworCQlwdXRfdXNlcigodW5zaWduZWQgbG9uZylwLCBlbnZwKTsgZW52cCsrOworCQlkbyB7CisJCQlnZXRfdXNlcihkdW1teSwgcCk7IHArKzsKKwkJfSB3aGlsZSAoZHVtbXkpOworCX0KKwlwdXRfdXNlcigodW5zaWduZWQgbG9uZykgTlVMTCwgZW52cCk7CisJY3VycmVudC0+bW0tPmVudl9lbmQgPSAodW5zaWduZWQgbG9uZykgcDsKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpc3A7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgQ09ORklHX0JJTkZNVF9aRkxBVAorCisjaW5jbHVkZSA8bGludXgvemxpYi5oPgorCisjZGVmaW5lIExCVUZTSVpFCTQwMDAKKworLyogZ3ppcCBmbGFnIGJ5dGUgKi8KKyNkZWZpbmUgQVNDSUlfRkxBRyAgIDB4MDEgLyogYml0IDAgc2V0OiBmaWxlIHByb2JhYmx5IEFTQ0lJIHRleHQgKi8KKyNkZWZpbmUgQ09OVElOVUFUSU9OIDB4MDIgLyogYml0IDEgc2V0OiBjb250aW51YXRpb24gb2YgbXVsdGktcGFydCBnemlwIGZpbGUgKi8KKyNkZWZpbmUgRVhUUkFfRklFTEQgIDB4MDQgLyogYml0IDIgc2V0OiBleHRyYSBmaWVsZCBwcmVzZW50ICovCisjZGVmaW5lIE9SSUdfTkFNRSAgICAweDA4IC8qIGJpdCAzIHNldDogb3JpZ2luYWwgZmlsZSBuYW1lIHByZXNlbnQgKi8KKyNkZWZpbmUgQ09NTUVOVCAgICAgIDB4MTAgLyogYml0IDQgc2V0OiBmaWxlIGNvbW1lbnQgcHJlc2VudCAqLworI2RlZmluZSBFTkNSWVBURUQgICAgMHgyMCAvKiBiaXQgNSBzZXQ6IGZpbGUgaXMgZW5jcnlwdGVkICovCisjZGVmaW5lIFJFU0VSVkVEICAgICAweEMwIC8qIGJpdCA2LDc6ICAgcmVzZXJ2ZWQgKi8KKworc3RhdGljIGludCBkZWNvbXByZXNzX2V4ZWMoCisJc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSwKKwl1bnNpZ25lZCBsb25nIG9mZnNldCwKKwljaGFyICpkc3QsCisJbG9uZyBsZW4sCisJaW50IGZkKQoreworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwl6X3N0cmVhbSBzdHJtOworCWxvZmZfdCBmcG9zOworCWludCByZXQsIHJldHZhbDsKKworCURCR19GTFQoImRlY29tcHJlc3NfZXhlYyhvZmZzZXQ9JXgsYnVmPSV4LGxlbj0leClcbiIsKGludClvZmZzZXQsIChpbnQpZHN0LCAoaW50KWxlbik7CisKKwltZW1zZXQoJnN0cm0sIDAsIHNpemVvZihzdHJtKSk7CisJc3RybS53b3Jrc3BhY2UgPSBrbWFsbG9jKHpsaWJfaW5mbGF0ZV93b3Jrc3BhY2VzaXplKCksIEdGUF9LRVJORUwpOworCWlmIChzdHJtLndvcmtzcGFjZSA9PSBOVUxMKSB7CisJCURCR19GTFQoImJpbmZtdF9mbGF0OiBubyBtZW1vcnkgZm9yIGRlY29tcHJlc3Mgd29ya3NwYWNlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWJ1ZiA9IGttYWxsb2MoTEJVRlNJWkUsIEdGUF9LRVJORUwpOworCWlmIChidWYgPT0gTlVMTCkgeworCQlEQkdfRkxUKCJiaW5mbXRfZmxhdDogbm8gbWVtb3J5IGZvciByZWFkIGJ1ZmZlclxuIik7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJLyogUmVhZCBpbiBmaXJzdCBjaHVuayBvZiBkYXRhIGFuZCBwYXJzZSBnemlwIGhlYWRlci4gKi8KKwlmcG9zID0gb2Zmc2V0OworCXJldCA9IGJwcm0tPmZpbGUtPmZfb3AtPnJlYWQoYnBybS0+ZmlsZSwgYnVmLCBMQlVGU0laRSwgJmZwb3MpOworCisJc3RybS5uZXh0X2luID0gYnVmOworCXN0cm0uYXZhaWxfaW4gPSByZXQ7CisJc3RybS50b3RhbF9pbiA9IDA7CisKKwlyZXR2YWwgPSAtRU5PRVhFQzsKKworCS8qIENoZWNrIG1pbmltdW0gc2l6ZSAtLSBnemlwIGhlYWRlciAqLworCWlmIChyZXQgPCAxMCkgeworCQlEQkdfRkxUKCJiaW5mbXRfZmxhdDogZmlsZSB0b28gc21hbGw/XG4iKTsKKwkJZ290byBvdXRfZnJlZV9idWY7CisJfQorCisJLyogQ2hlY2sgZ3ppcCBtYWdpYyBudW1iZXIgKi8KKwlpZiAoKGJ1ZlswXSAhPSAwMzcpIHx8ICgoYnVmWzFdICE9IDAyMTMpICYmIChidWZbMV0gIT0gMDIzNikpKSB7CisJCURCR19GTFQoImJpbmZtdF9mbGF0OiB1bmtub3duIGNvbXByZXNzaW9uIG1hZ2ljP1xuIik7CisJCWdvdG8gb3V0X2ZyZWVfYnVmOworCX0KKworCS8qIENoZWNrIGd6aXAgbWV0aG9kICovCisJaWYgKGJ1ZlsyXSAhPSA4KSB7CisJCURCR19GTFQoImJpbmZtdF9mbGF0OiB1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZD9cbiIpOworCQlnb3RvIG91dF9mcmVlX2J1ZjsKKwl9CisJLyogQ2hlY2sgZ3ppcCBmbGFncyAqLworCWlmICgoYnVmWzNdICYgRU5DUllQVEVEKSB8fCAoYnVmWzNdICYgQ09OVElOVUFUSU9OKSB8fAorCSAgICAoYnVmWzNdICYgUkVTRVJWRUQpKSB7CisJCURCR19GTFQoImJpbmZtdF9mbGF0OiB1bmtub3duIGZsYWdzP1xuIik7CisJCWdvdG8gb3V0X2ZyZWVfYnVmOworCX0KKworCXJldCA9IDEwOworCWlmIChidWZbM10gJiBFWFRSQV9GSUVMRCkgeworCQlyZXQgKz0gMiArIGJ1ZlsxMF0gKyAoYnVmWzExXSA8PCA4KTsKKwkJaWYgKHVubGlrZWx5KExCVUZTSVpFID09IHJldCkpIHsKKwkJCURCR19GTFQoImJpbmZtdF9mbGF0OiBidWZmZXIgb3ZlcmZsb3cgKEVYVFJBKT9cbiIpOworCQkJZ290byBvdXRfZnJlZV9idWY7CisJCX0KKwl9CisJaWYgKGJ1ZlszXSAmIE9SSUdfTkFNRSkgeworCQlmb3IgKDsgcmV0IDwgTEJVRlNJWkUgJiYgKGJ1ZltyZXRdICE9IDApOyByZXQrKykKKwkJCTsKKwkJaWYgKHVubGlrZWx5KExCVUZTSVpFID09IHJldCkpIHsKKwkJCURCR19GTFQoImJpbmZtdF9mbGF0OiBidWZmZXIgb3ZlcmZsb3cgKE9SSUdfTkFNRSk/XG4iKTsKKwkJCWdvdG8gb3V0X2ZyZWVfYnVmOworCQl9CisJfQorCWlmIChidWZbM10gJiBDT01NRU5UKSB7CisJCWZvciAoOyAgcmV0IDwgTEJVRlNJWkUgJiYgKGJ1ZltyZXRdICE9IDApOyByZXQrKykKKwkJCTsKKwkJaWYgKHVubGlrZWx5KExCVUZTSVpFID09IHJldCkpIHsKKwkJCURCR19GTFQoImJpbmZtdF9mbGF0OiBidWZmZXIgb3ZlcmZsb3cgKENPTU1FTlQpP1xuIik7CisJCQlnb3RvIG91dF9mcmVlX2J1ZjsKKwkJfQorCX0KKworCXN0cm0ubmV4dF9pbiArPSByZXQ7CisJc3RybS5hdmFpbF9pbiAtPSByZXQ7CisKKwlzdHJtLm5leHRfb3V0ID0gZHN0OworCXN0cm0uYXZhaWxfb3V0ID0gbGVuOworCXN0cm0udG90YWxfb3V0ID0gMDsKKworCWlmICh6bGliX2luZmxhdGVJbml0Migmc3RybSwgLU1BWF9XQklUUykgIT0gWl9PSykgeworCQlEQkdfRkxUKCJiaW5mbXRfZmxhdDogemxpYiBpbml0IGZhaWxlZD9cbiIpOworCQlnb3RvIG91dF9mcmVlX2J1ZjsKKwl9CisKKwl3aGlsZSAoKHJldCA9IHpsaWJfaW5mbGF0ZSgmc3RybSwgWl9OT19GTFVTSCkpID09IFpfT0spIHsKKwkJcmV0ID0gYnBybS0+ZmlsZS0+Zl9vcC0+cmVhZChicHJtLT5maWxlLCBidWYsIExCVUZTSVpFLCAmZnBvcyk7CisJCWlmIChyZXQgPD0gMCkKKwkJCWJyZWFrOworCQlpZiAocmV0ID49ICh1bnNpZ25lZCBsb25nKSAtNDA5NikKKwkJCWJyZWFrOworCQlsZW4gLT0gcmV0OworCisJCXN0cm0ubmV4dF9pbiA9IGJ1ZjsKKwkJc3RybS5hdmFpbF9pbiA9IHJldDsKKwkJc3RybS50b3RhbF9pbiA9IDA7CisJfQorCisJaWYgKHJldCA8IDApIHsKKwkJREJHX0ZMVCgiYmluZm10X2ZsYXQ6IGRlY29tcHJlc3Npb24gZmFpbGVkICglZCksICVzXG4iLAorCQkJcmV0LCBzdHJtLm1zZyk7CisJCWdvdG8gb3V0X3psaWI7CisJfQorCisJcmV0dmFsID0gMDsKK291dF96bGliOgorCXpsaWJfaW5mbGF0ZUVuZCgmc3RybSk7CitvdXRfZnJlZV9idWY6CisJa2ZyZWUoYnVmKTsKK291dF9mcmVlOgorCWtmcmVlKHN0cm0ud29ya3NwYWNlKTsKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfQorCisjZW5kaWYgLyogQ09ORklHX0JJTkZNVF9aRkxBVCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2NhbGNfcmVsb2ModW5zaWduZWQgbG9uZyByLCBzdHJ1Y3QgbGliX2luZm8gKnAsIGludCBjdXJpZCwgaW50IGludGVybmFscCkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJaW50IGlkOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfYnJrOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfZGF0YTsKKwl1bnNpZ25lZCBsb25nIHRleHRfbGVuOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfY29kZTsKKworI2lmZGVmIENPTkZJR19CSU5GTVRfU0hBUkVEX0ZMQVQKKwlpZiAociA9PSAwKQorCQlpZCA9IGN1cmlkOwkvKiBSZWxvY3Mgb2YgMCBhcmUgYWx3YXlzIHNlbGYgcmVmZXJyaW5nICovCisJZWxzZSB7CisJCWlkID0gKHIgPj4gMjQpICYgMHhmZjsJLyogRmluZCBJRCBmb3IgdGhpcyByZWxvYyAqLworCQlyICY9IDB4MDBmZmZmZmY7CS8qIFRyaW0gSUQgb2ZmIGhlcmUgKi8KKwl9CisJaWYgKGlkID49IE1BWF9TSEFSRURfTElCUykgeworCQlwcmludGsoIkJJTkZNVF9GTEFUOiByZWZlcmVuY2UgMHgleCB0byBzaGFyZWQgbGlicmFyeSAlZCIsCisJCQkJKHVuc2lnbmVkKSByLCBpZCk7CisJCWdvdG8gZmFpbGVkOworCX0KKwlpZiAoY3VyaWQgIT0gaWQpIHsKKwkJaWYgKGludGVybmFscCkgeworCQkJcHJpbnRrKCJCSU5GTVRfRkxBVDogcmVsb2MgYWRkcmVzcyAweCV4IG5vdCBpbiBzYW1lIG1vZHVsZSAiCisJCQkJCSIoJWQgIT0gJWQpIiwgKHVuc2lnbmVkKSByLCBjdXJpZCwgaWQpOworCQkJZ290byBmYWlsZWQ7CisJCX0gZWxzZSBpZiAoICEgcC0+bGliX2xpc3RbaWRdLmxvYWRlZCAmJgorCQkJCWxvYWRfZmxhdF9zaGFyZWRfbGlicmFyeShpZCwgcCkgPiAodW5zaWduZWQgbG9uZykgLTQwOTYpIHsKKwkJCXByaW50aygiQklORk1UX0ZMQVQ6IGZhaWxlZCB0byBsb2FkIGxpYnJhcnkgJWQiLCBpZCk7CisJCQlnb3RvIGZhaWxlZDsKKwkJfQorCQkvKiBDaGVjayB2ZXJzaW9uaW5nIGluZm9ybWF0aW9uIChpLmUuIHRpbWUgc3RhbXBzKSAqLworCQlpZiAocC0+bGliX2xpc3RbaWRdLmJ1aWxkX2RhdGUgJiYgcC0+bGliX2xpc3RbY3VyaWRdLmJ1aWxkX2RhdGUgJiYKKwkJCQlwLT5saWJfbGlzdFtjdXJpZF0uYnVpbGRfZGF0ZSA8IHAtPmxpYl9saXN0W2lkXS5idWlsZF9kYXRlKSB7CisJCQlwcmludGsoIkJJTkZNVF9GTEFUOiBsaWJyYXJ5ICVkIGlzIHlvdW5nZXIgdGhhbiAlZCIsIGlkLCBjdXJpZCk7CisJCQlnb3RvIGZhaWxlZDsKKwkJfQorCX0KKyNlbHNlCisJaWQgPSAwOworI2VuZGlmCisKKwlzdGFydF9icmsgPSBwLT5saWJfbGlzdFtpZF0uc3RhcnRfYnJrOworCXN0YXJ0X2RhdGEgPSBwLT5saWJfbGlzdFtpZF0uc3RhcnRfZGF0YTsKKwlzdGFydF9jb2RlID0gcC0+bGliX2xpc3RbaWRdLnN0YXJ0X2NvZGU7CisJdGV4dF9sZW4gPSBwLT5saWJfbGlzdFtpZF0udGV4dF9sZW47CisKKwlpZiAoIWZsYXRfcmVsb2NfdmFsaWQociwgc3RhcnRfYnJrIC0gc3RhcnRfZGF0YSArIHRleHRfbGVuKSkgeworCQlwcmludGsoIkJJTkZNVF9GTEFUOiByZWxvYyBvdXRzaWRlIHByb2dyYW0gMHgleCAoMCAtIDB4JXgvMHgleCkiLAorCQkgICAgICAgKGludCkgciwoaW50KShzdGFydF9icmstc3RhcnRfY29kZSksKGludCl0ZXh0X2xlbik7CisJCWdvdG8gZmFpbGVkOworCX0KKworCWlmIChyIDwgdGV4dF9sZW4pCQkJLyogSW4gdGV4dCBzZWdtZW50ICovCisJCWFkZHIgPSByICsgc3RhcnRfY29kZTsKKwllbHNlCQkJCQkvKiBJbiBkYXRhIHNlZ21lbnQgKi8KKwkJYWRkciA9IHIgLSB0ZXh0X2xlbiArIHN0YXJ0X2RhdGE7CisKKwkvKiBSYW5nZSBjaGVja2VkIGFscmVhZHkgYWJvdmUgc28gZG9pbmcgdGhlIHJhbmdlIHRlc3RzIGlzIHJlZHVuZGFudC4uLiovCisJcmV0dXJuKGFkZHIpOworCitmYWlsZWQ6CisJcHJpbnRrKCIsIGtpbGxpbmcgJXMhXG4iLCBjdXJyZW50LT5jb21tKTsKKwlzZW5kX3NpZyhTSUdTRUdWLCBjdXJyZW50LCAwKTsKKworCXJldHVybiBSRUxPQ19GQUlMRUQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIG9sZF9yZWxvYyh1bnNpZ25lZCBsb25nIHJsKQoreworI2lmZGVmIERFQlVHCisJY2hhciAqc2VnbWVudFtdID0geyAiVEVYVCIsICJEQVRBIiwgIkJTUyIsICIqVU5LTk9XTioiIH07CisjZW5kaWYKKwlmbGF0X3YyX3JlbG9jX3QJcjsKKwl1bnNpZ25lZCBsb25nICpwdHI7CisJCisJci52YWx1ZSA9IHJsOworI2lmIGRlZmluZWQoQ09ORklHX0NPTERGSVJFKQorCXB0ciA9ICh1bnNpZ25lZCBsb25nICopIChjdXJyZW50LT5tbS0+c3RhcnRfY29kZSArIHIucmVsb2Mub2Zmc2V0KTsKKyNlbHNlCisJcHRyID0gKHVuc2lnbmVkIGxvbmcgKikgKGN1cnJlbnQtPm1tLT5zdGFydF9kYXRhICsgci5yZWxvYy5vZmZzZXQpOworI2VuZGlmCisKKyNpZmRlZiBERUJVRworCXByaW50aygiUmVsb2NhdGlvbiBvZiB2YXJpYWJsZSBhdCBEQVRBU0VHKyV4ICIKKwkJIihhZGRyZXNzICVwLCBjdXJyZW50bHkgJXgpIGludG8gc2VnbWVudCAlc1xuIiwKKwkJci5yZWxvYy5vZmZzZXQsIHB0ciwgKGludCkqcHRyLCBzZWdtZW50W3IucmVsb2MudHlwZV0pOworI2VuZGlmCisJCisJc3dpdGNoIChyLnJlbG9jLnR5cGUpIHsKKwljYXNlIE9MRF9GTEFUX1JFTE9DX1RZUEVfVEVYVDoKKwkJKnB0ciArPSBjdXJyZW50LT5tbS0+c3RhcnRfY29kZTsKKwkJYnJlYWs7CisJY2FzZSBPTERfRkxBVF9SRUxPQ19UWVBFX0RBVEE6CisJCSpwdHIgKz0gY3VycmVudC0+bW0tPnN0YXJ0X2RhdGE7CisJCWJyZWFrOworCWNhc2UgT0xEX0ZMQVRfUkVMT0NfVFlQRV9CU1M6CisJCSpwdHIgKz0gY3VycmVudC0+bW0tPmVuZF9kYXRhOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoIkJJTkZNVF9GTEFUOiBVbmtub3duIHJlbG9jYXRpb24gdHlwZT0leFxuIiwgci5yZWxvYy50eXBlKTsKKwkJYnJlYWs7CisJfQorCisjaWZkZWYgREVCVUcKKwlwcmludGsoIlJlbG9jYXRpb24gYmVjYW1lICV4XG4iLCAoaW50KSpwdHIpOworI2VuZGlmCit9CQkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgbG9hZF9mbGF0X2ZpbGUoc3RydWN0IGxpbnV4X2JpbnBybSAqIGJwcm0sCisJCXN0cnVjdCBsaWJfaW5mbyAqbGliaW5mbywgaW50IGlkLCB1bnNpZ25lZCBsb25nICpleHRyYV9zdGFjaykKK3sKKwlzdHJ1Y3QgZmxhdF9oZHIgKiBoZHI7CisJdW5zaWduZWQgbG9uZyB0ZXh0cG9zID0gMCwgZGF0YXBvcyA9IDAsIHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIHJlYWxkYXRhc3RhcnQgPSAwOworCXVuc2lnbmVkIGxvbmcgdGV4dF9sZW4sIGRhdGFfbGVuLCBic3NfbGVuLCBzdGFja19sZW4sIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgbWVtcCA9IDA7IC8qIGZvciBmaW5kaW5nIHRoZSBicmsgYXJlYSAqLworCXVuc2lnbmVkIGxvbmcgZXh0cmEsIHJsaW07CisJdW5zaWduZWQgbG9uZyAqcmVsb2MgPSAwLCAqcnA7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgaSwgcmV2LCByZWxvY3MgPSAwOworCWxvZmZfdCBmcG9zOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfY29kZSwgZW5kX2NvZGU7CisKKwloZHIgPSAoKHN0cnVjdCBmbGF0X2hkciAqKSBicHJtLT5idWYpOwkJLyogZXhlYy1oZWFkZXIgKi8KKwlpbm9kZSA9IGJwcm0tPmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCisJdGV4dF9sZW4gID0gbnRvaGwoaGRyLT5kYXRhX3N0YXJ0KTsKKwlkYXRhX2xlbiAgPSBudG9obChoZHItPmRhdGFfZW5kKSAtIG50b2hsKGhkci0+ZGF0YV9zdGFydCk7CisJYnNzX2xlbiAgID0gbnRvaGwoaGRyLT5ic3NfZW5kKSAtIG50b2hsKGhkci0+ZGF0YV9lbmQpOworCXN0YWNrX2xlbiA9IG50b2hsKGhkci0+c3RhY2tfc2l6ZSk7CisJaWYgKGV4dHJhX3N0YWNrKSB7CisJCXN0YWNrX2xlbiArPSAqZXh0cmFfc3RhY2s7CisJCSpleHRyYV9zdGFjayA9IHN0YWNrX2xlbjsKKwl9CisJcmVsb2NzICAgID0gbnRvaGwoaGRyLT5yZWxvY19jb3VudCk7CisJZmxhZ3MgICAgID0gbnRvaGwoaGRyLT5mbGFncyk7CisJcmV2ICAgICAgID0gbnRvaGwoaGRyLT5yZXYpOworCisJaWYgKGZsYWdzICYgRkxBVF9GTEFHX0tUUkFDRSkKKwkJcHJpbnRrKCJCSU5GTVRfRkxBVDogTG9hZGluZyBmaWxlOiAlc1xuIiwgYnBybS0+ZmlsZW5hbWUpOworCisJaWYgKHN0cm5jbXAoaGRyLT5tYWdpYywgImJGTFQiLCA0KSB8fAorCQkJKHJldiAhPSBGTEFUX1ZFUlNJT04gJiYgcmV2ICE9IE9MRF9GTEFUX1ZFUlNJT04pKSB7CisJCS8qCisJCSAqIGJlY2F1c2UgYSBsb3Qgb2YgcGVvcGxlIGRvIG5vdCBtYW5hZ2UgdG8gcHJvZHVjZSBnb29kCisJCSAqIGZsYXQgYmluYXJpZXMsICB3ZSBsZWF2ZSB0aGlzIHByaW50ayB0byBoZWxwIHRoZW0gcmVhbGlzZQorCQkgKiB0aGUgcHJvYmxlbS4gIFdlIG9ubHkgcHJpbnQgdGhlIGVycm9yIGlmIGl0cyBub3QgYSBzY3JpcHQgZmlsZQorCQkgKi8KKwkJaWYgKHN0cm5jbXAoaGRyLT5tYWdpYywgIiMhIiwgMikpCisJCQlwcmludGsoIkJJTkZNVF9GTEFUOiBiYWQgbWFnaWMvcmV2ICgweCV4LCBuZWVkIDB4JXgpXG4iLAorCQkJCQlyZXYsIChpbnQpIEZMQVRfVkVSU0lPTik7CisJCXJldHVybiAtRU5PRVhFQzsKKwl9CisJCisJLyogRG9uJ3QgYWxsb3cgb2xkIGZvcm1hdCBleGVjdXRhYmxlcyB0byB1c2Ugc2hhcmVkIGxpYnJhcmllcyAqLworCWlmIChyZXYgPT0gT0xEX0ZMQVRfVkVSU0lPTiAmJiBpZCAhPSAwKSB7CisJCXByaW50aygiQklORk1UX0ZMQVQ6IHNoYXJlZCBsaWJyYXJpZXMgYXJlIG5vdCBhdmFpbGFibGUgYmVmb3JlIHJldiAweCV4XG4iLAorCQkJCShpbnQpIEZMQVRfVkVSU0lPTik7CisJCXJldHVybiAtRU5PRVhFQzsKKwl9CisKKwkvKgorCSAqIGZpeCB1cCB0aGUgZmxhZ3MgZm9yIHRoZSBvbGRlciBmb3JtYXQsICB0aGVyZSB3ZXJlIGFsbCBraW5kcworCSAqIG9mIGVuZGlhbiBoYWNrcywgIHRoaXMgb25seSB3b3JrcyBmb3IgdGhlIHNpbXBsZSBjYXNlcworCSAqLworCWlmIChyZXYgPT0gT0xEX0ZMQVRfVkVSU0lPTiAmJiBmbGF0X29sZF9yYW1fZmxhZyhmbGFncykpCisJCWZsYWdzID0gRkxBVF9GTEFHX1JBTTsKKworI2lmbmRlZiBDT05GSUdfQklORk1UX1pGTEFUCisJaWYgKGZsYWdzICYgKEZMQVRfRkxBR19HWklQfEZMQVRfRkxBR19HWkRBVEEpKSB7CisJCXByaW50aygiU3VwcG9ydCBmb3IgWkZMQVQgZXhlY3V0YWJsZXMgaXMgbm90IGVuYWJsZWQuXG4iKTsKKwkJcmV0dXJuIC1FTk9FWEVDOworCX0KKyNlbmRpZgorCisJLyoKKwkgKiBDaGVjayBpbml0aWFsIGxpbWl0cy4gVGhpcyBhdm9pZHMgbGV0dGluZyBwZW9wbGUgY2lyY3VtdmVudAorCSAqIHNpemUgbGltaXRzIGltcG9zZWQgb24gdGhlbSBieSBjcmVhdGluZyBwcm9ncmFtcyB3aXRoIGxhcmdlCisJICogYXJyYXlzIGluIHRoZSBkYXRhIG9yIGJzcy4KKwkgKi8KKwlybGltID0gY3VycmVudC0+c2lnbmFsLT5ybGltW1JMSU1JVF9EQVRBXS5ybGltX2N1cjsKKwlpZiAocmxpbSA+PSBSTElNX0lORklOSVRZKQorCQlybGltID0gfjA7CisJaWYgKGRhdGFfbGVuICsgYnNzX2xlbiA+IHJsaW0pCisJCXJldHVybiAtRU5PTUVNOworCisJLyogRmx1c2ggYWxsIHRyYWNlcyBvZiB0aGUgY3VycmVudGx5IHJ1bm5pbmcgZXhlY3V0YWJsZSAqLworCWlmIChpZCA9PSAwKSB7CisJCXJlc3VsdCA9IGZsdXNoX29sZF9leGVjKGJwcm0pOworCQlpZiAocmVzdWx0KQorCQkJcmV0dXJuIHJlc3VsdDsKKworCQkvKiBPSywgVGhpcyBpcyB0aGUgcG9pbnQgb2Ygbm8gcmV0dXJuICovCisJCXNldF9wZXJzb25hbGl0eShQRVJfTElOVVgpOworCX0KKworCS8qCisJICogY2FsY3VsYXRlIHRoZSBleHRyYSBzcGFjZSB3ZSBuZWVkIHRvIG1hcCBpbgorCSAqLworCWV4dHJhID0gbWF4KGJzc19sZW4gKyBzdGFja19sZW4sIHJlbG9jcyAqIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisKKwkvKgorCSAqIHRoZXJlIGFyZSBhIGNvdXBsZSBvZiBjYXNlcyBoZXJlLCAgdGhlIHNlcGFyYXRlIGNvZGUvZGF0YQorCSAqIGNhc2UsICBhbmQgdGhlbiB0aGUgZnVsbHkgY29waWVkIHRvIFJBTSBjYXNlIHdoaWNoIGx1bXBzCisJICogaXQgYWxsIHRvZ2V0aGVyLgorCSAqLworCWlmICgoZmxhZ3MgJiAoRkxBVF9GTEFHX1JBTXxGTEFUX0ZMQUdfR1pJUCkpID09IDApIHsKKwkJLyoKKwkJICogdGhpcyBzaG91bGQgZ2l2ZSB1cyBhIFJPTSBwdHIsICBidXQgaWYgaXQgZG9lc24ndCB3ZSBkb24ndAorCQkgKiByZWFsbHkgY2FyZQorCQkgKi8KKwkJREJHX0ZMVCgiQklORk1UX0ZMQVQ6IFJPTSBtYXBwaW5nIG9mIGZpbGUgKHdlIGhvcGUpXG4iKTsKKworCQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCQl0ZXh0cG9zID0gZG9fbW1hcChicHJtLT5maWxlLCAwLCB0ZXh0X2xlbiwgUFJPVF9SRUFEfFBST1RfRVhFQywgMCwgMCk7CisJCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCQlpZiAoIXRleHRwb3MgIHx8IHRleHRwb3MgPj0gKHVuc2lnbmVkIGxvbmcpIC00MDk2KSB7CisJCQlpZiAoIXRleHRwb3MpCisJCQkJdGV4dHBvcyA9ICh1bnNpZ25lZCBsb25nKSAtRU5PTUVNOworCQkJcHJpbnRrKCJVbmFibGUgdG8gbW1hcCBwcm9jZXNzIHRleHQsIGVycm5vICVkXG4iLCAoaW50KS10ZXh0cG9zKTsKKwkJCXJldHVybih0ZXh0cG9zKTsKKwkJfQorCisJCWRvd25fd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJCXJlYWxkYXRhc3RhcnQgPSBkb19tbWFwKDAsIDAsIGRhdGFfbGVuICsgZXh0cmEgKworCQkJCU1BWF9TSEFSRURfTElCUyAqIHNpemVvZih1bnNpZ25lZCBsb25nKSwKKwkJCQlQUk9UX1JFQUR8UFJPVF9XUklURXxQUk9UX0VYRUMsIDAsIDApOworCQl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKworCQlpZiAocmVhbGRhdGFzdGFydCA9PSAwIHx8IHJlYWxkYXRhc3RhcnQgPj0gKHVuc2lnbmVkIGxvbmcpLTQwOTYpIHsKKwkJCWlmICghcmVhbGRhdGFzdGFydCkKKwkJCQlyZWFsZGF0YXN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpIC1FTk9NRU07CisJCQlwcmludGsoIlVuYWJsZSB0byBhbGxvY2F0ZSBSQU0gZm9yIHByb2Nlc3MgZGF0YSwgZXJybm8gJWRcbiIsCisJCQkJCShpbnQpLWRhdGFwb3MpOworCQkJZG9fbXVubWFwKGN1cnJlbnQtPm1tLCB0ZXh0cG9zLCB0ZXh0X2xlbik7CisJCQlyZXR1cm4gcmVhbGRhdGFzdGFydDsKKwkJfQorCQlkYXRhcG9zID0gcmVhbGRhdGFzdGFydCArIE1BWF9TSEFSRURfTElCUyAqIHNpemVvZih1bnNpZ25lZCBsb25nKTsKKworCQlEQkdfRkxUKCJCSU5GTVRfRkxBVDogQWxsb2NhdGVkIGRhdGErYnNzK3N0YWNrICglZCBieXRlcyk6ICV4XG4iLAorCQkJCShpbnQpKGRhdGFfbGVuICsgYnNzX2xlbiArIHN0YWNrX2xlbiksIChpbnQpZGF0YXBvcyk7CisKKwkJZnBvcyA9IG50b2hsKGhkci0+ZGF0YV9zdGFydCk7CisjaWZkZWYgQ09ORklHX0JJTkZNVF9aRkxBVAorCQlpZiAoZmxhZ3MgJiBGTEFUX0ZMQUdfR1pEQVRBKSB7CisJCQlyZXN1bHQgPSBkZWNvbXByZXNzX2V4ZWMoYnBybSwgZnBvcywgKGNoYXIgKikgZGF0YXBvcywgCisJCQkJCQkgZGF0YV9sZW4gKyAocmVsb2NzICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSwgMCk7CisJCX0gZWxzZQorI2VuZGlmCisJCXsKKwkJCXJlc3VsdCA9IGJwcm0tPmZpbGUtPmZfb3AtPnJlYWQoYnBybS0+ZmlsZSwgKGNoYXIgKikgZGF0YXBvcywKKwkJCQkJZGF0YV9sZW4gKyAocmVsb2NzICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSwgJmZwb3MpOworCQl9CisJCWlmIChyZXN1bHQgPj0gKHVuc2lnbmVkIGxvbmcpLTQwOTYpIHsKKwkJCXByaW50aygiVW5hYmxlIHRvIHJlYWQgZGF0YStic3MsIGVycm5vICVkXG4iLCAoaW50KS1yZXN1bHQpOworCQkJZG9fbXVubWFwKGN1cnJlbnQtPm1tLCB0ZXh0cG9zLCB0ZXh0X2xlbik7CisJCQlkb19tdW5tYXAoY3VycmVudC0+bW0sIHJlYWxkYXRhc3RhcnQsIGRhdGFfbGVuICsgZXh0cmEpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCisJCXJlbG9jID0gKHVuc2lnbmVkIGxvbmcgKikgKGRhdGFwb3MrKG50b2hsKGhkci0+cmVsb2Nfc3RhcnQpLXRleHRfbGVuKSk7CisJCW1lbXAgPSByZWFsZGF0YXN0YXJ0OworCisJfSBlbHNlIHsKKworCQlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCQl0ZXh0cG9zID0gZG9fbW1hcCgwLCAwLCB0ZXh0X2xlbiArIGRhdGFfbGVuICsgZXh0cmEgKworCQkJCQlNQVhfU0hBUkVEX0xJQlMgKiBzaXplb2YodW5zaWduZWQgbG9uZyksCisJCQkJUFJPVF9SRUFEIHwgUFJPVF9FWEVDIHwgUFJPVF9XUklURSwgMCwgMCk7CisJCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCQlpZiAoIXRleHRwb3MgIHx8IHRleHRwb3MgPj0gKHVuc2lnbmVkIGxvbmcpIC00MDk2KSB7CisJCQlpZiAoIXRleHRwb3MpCisJCQkJdGV4dHBvcyA9ICh1bnNpZ25lZCBsb25nKSAtRU5PTUVNOworCQkJcHJpbnRrKCJVbmFibGUgdG8gYWxsb2NhdGUgUkFNIGZvciBwcm9jZXNzIHRleHQvZGF0YSwgZXJybm8gJWRcbiIsCisJCQkJCShpbnQpLXRleHRwb3MpOworCQkJcmV0dXJuKHRleHRwb3MpOworCQl9CisKKwkJcmVhbGRhdGFzdGFydCA9IHRleHRwb3MgKyBudG9obChoZHItPmRhdGFfc3RhcnQpOworCQlkYXRhcG9zID0gcmVhbGRhdGFzdGFydCArIE1BWF9TSEFSRURfTElCUyAqIHNpemVvZih1bnNpZ25lZCBsb25nKTsKKwkJcmVsb2MgPSAodW5zaWduZWQgbG9uZyAqKSAodGV4dHBvcyArIG50b2hsKGhkci0+cmVsb2Nfc3RhcnQpICsKKwkJCQlNQVhfU0hBUkVEX0xJQlMgKiBzaXplb2YodW5zaWduZWQgbG9uZykpOworCQltZW1wID0gdGV4dHBvczsKKworI2lmZGVmIENPTkZJR19CSU5GTVRfWkZMQVQKKwkJLyoKKwkJICogbG9hZCBpdCBhbGwgaW4gYW5kIHRyZWF0IGl0IGxpa2UgYSBSQU0gbG9hZCBmcm9tIG5vdyBvbgorCQkgKi8KKwkJaWYgKGZsYWdzICYgRkxBVF9GTEFHX0daSVApIHsKKwkJCXJlc3VsdCA9IGRlY29tcHJlc3NfZXhlYyhicHJtLCBzaXplb2YgKHN0cnVjdCBmbGF0X2hkciksCisJCQkJCSAoKChjaGFyICopIHRleHRwb3MpICsgc2l6ZW9mIChzdHJ1Y3QgZmxhdF9oZHIpKSwKKwkJCQkJICh0ZXh0X2xlbiArIGRhdGFfbGVuICsgKHJlbG9jcyAqIHNpemVvZih1bnNpZ25lZCBsb25nKSkKKwkJCQkJCSAgLSBzaXplb2YgKHN0cnVjdCBmbGF0X2hkcikpLAorCQkJCQkgMCk7CisJCQltZW1tb3ZlKCh2b2lkICopIGRhdGFwb3MsICh2b2lkICopIHJlYWxkYXRhc3RhcnQsCisJCQkJCWRhdGFfbGVuICsgKHJlbG9jcyAqIHNpemVvZih1bnNpZ25lZCBsb25nKSkpOworCQl9IGVsc2UgaWYgKGZsYWdzICYgRkxBVF9GTEFHX0daREFUQSkgeworCQkJZnBvcyA9IDA7CisJCQlyZXN1bHQgPSBicHJtLT5maWxlLT5mX29wLT5yZWFkKGJwcm0tPmZpbGUsCisJCQkJCShjaGFyICopIHRleHRwb3MsIHRleHRfbGVuLCAmZnBvcyk7CisJCQlpZiAocmVzdWx0IDwgKHVuc2lnbmVkIGxvbmcpIC00MDk2KQorCQkJCXJlc3VsdCA9IGRlY29tcHJlc3NfZXhlYyhicHJtLCB0ZXh0X2xlbiwgKGNoYXIgKikgZGF0YXBvcywKKwkJCQkJCSBkYXRhX2xlbiArIChyZWxvY3MgKiBzaXplb2YodW5zaWduZWQgbG9uZykpLCAwKTsKKwkJfQorCQllbHNlCisjZW5kaWYKKwkJeworCQkJZnBvcyA9IDA7CisJCQlyZXN1bHQgPSBicHJtLT5maWxlLT5mX29wLT5yZWFkKGJwcm0tPmZpbGUsCisJCQkJCShjaGFyICopIHRleHRwb3MsIHRleHRfbGVuLCAmZnBvcyk7CisJCQlpZiAocmVzdWx0IDwgKHVuc2lnbmVkIGxvbmcpIC00MDk2KSB7CisJCQkJZnBvcyA9IG50b2hsKGhkci0+ZGF0YV9zdGFydCk7CisJCQkJcmVzdWx0ID0gYnBybS0+ZmlsZS0+Zl9vcC0+cmVhZChicHJtLT5maWxlLCAoY2hhciAqKSBkYXRhcG9zLAorCQkJCQlkYXRhX2xlbiArIChyZWxvY3MgKiBzaXplb2YodW5zaWduZWQgbG9uZykpLCAmZnBvcyk7CisJCQl9CisJCX0KKwkJaWYgKHJlc3VsdCA+PSAodW5zaWduZWQgbG9uZyktNDA5NikgeworCQkJcHJpbnRrKCJVbmFibGUgdG8gcmVhZCBjb2RlK2RhdGErYnNzLCBlcnJubyAlZFxuIiwoaW50KS1yZXN1bHQpOworCQkJZG9fbXVubWFwKGN1cnJlbnQtPm1tLCB0ZXh0cG9zLCB0ZXh0X2xlbiArIGRhdGFfbGVuICsgZXh0cmEgKworCQkJCU1BWF9TSEFSRURfTElCUyAqIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJfQorCisJaWYgKGZsYWdzICYgRkxBVF9GTEFHX0tUUkFDRSkKKwkJcHJpbnRrKCJNYXBwaW5nIGlzICV4LCBFbnRyeSBwb2ludCBpcyAleCwgZGF0YV9zdGFydCBpcyAleFxuIiwKKwkJCShpbnQpdGV4dHBvcywgMHgwMGZmZmZmZiZudG9obChoZHItPmVudHJ5KSwgbnRvaGwoaGRyLT5kYXRhX3N0YXJ0KSk7CisKKwkvKiBUaGUgbWFpbiBwcm9ncmFtIG5lZWRzIGEgbGl0dGxlIGV4dHJhIHNldHVwIGluIHRoZSB0YXNrIHN0cnVjdHVyZSAqLworCXN0YXJ0X2NvZGUgPSB0ZXh0cG9zICsgc2l6ZW9mIChzdHJ1Y3QgZmxhdF9oZHIpOworCWVuZF9jb2RlID0gdGV4dHBvcyArIHRleHRfbGVuOworCWlmIChpZCA9PSAwKSB7CisJCWN1cnJlbnQtPm1tLT5zdGFydF9jb2RlID0gc3RhcnRfY29kZTsKKwkJY3VycmVudC0+bW0tPmVuZF9jb2RlID0gZW5kX2NvZGU7CisJCWN1cnJlbnQtPm1tLT5zdGFydF9kYXRhID0gZGF0YXBvczsKKwkJY3VycmVudC0+bW0tPmVuZF9kYXRhID0gZGF0YXBvcyArIGRhdGFfbGVuOworCQkvKgorCQkgKiBzZXQgdXAgdGhlIGJyayBzdHVmZiwgdXNlcyBhbnkgc2xhY2sgbGVmdCBpbiBkYXRhL2Jzcy9zdGFjaworCQkgKiBhbGxvY2F0aW9uLiAgV2UgcHV0IHRoZSBicmsgYWZ0ZXIgdGhlIGJzcyAoYmV0d2VlbiB0aGUgYnNzCisJCSAqIGFuZCBzdGFjaykgbGlrZSBvdGhlciBwbGF0Zm9ybXMuCisJCSAqLworCQljdXJyZW50LT5tbS0+c3RhcnRfYnJrID0gZGF0YXBvcyArIGRhdGFfbGVuICsgYnNzX2xlbjsKKwkJY3VycmVudC0+bW0tPmJyayA9IChjdXJyZW50LT5tbS0+c3RhcnRfYnJrICsgMykgJiB+MzsKKwkJY3VycmVudC0+bW0tPmNvbnRleHQuZW5kX2JyayA9IG1lbXAgKyBrc2l6ZSgodm9pZCAqKSBtZW1wKSAtIHN0YWNrX2xlbjsKKwkJc2V0X21tX2NvdW50ZXIoY3VycmVudC0+bW0sIHJzcywgMCk7CisJfQorCisJaWYgKGZsYWdzICYgRkxBVF9GTEFHX0tUUkFDRSkKKwkJcHJpbnRrKCIlcyAlczogVEVYVD0leC0leCBEQVRBPSV4LSV4IEJTUz0leC0leFxuIiwKKwkJCWlkID8gIkxpYiIgOiAiTG9hZCIsIGJwcm0tPmZpbGVuYW1lLAorCQkJKGludCkgc3RhcnRfY29kZSwgKGludCkgZW5kX2NvZGUsCisJCQkoaW50KSBkYXRhcG9zLAorCQkJKGludCkgKGRhdGFwb3MgKyBkYXRhX2xlbiksCisJCQkoaW50KSAoZGF0YXBvcyArIGRhdGFfbGVuKSwKKwkJCShpbnQpICgoKGRhdGFwb3MgKyBkYXRhX2xlbiArIGJzc19sZW4pICsgMykgJiB+MykpOworCisJdGV4dF9sZW4gLT0gc2l6ZW9mKHN0cnVjdCBmbGF0X2hkcik7IC8qIHRoZSByZWFsIGNvZGUgbGVuICovCisKKwkvKiBTdG9yZSB0aGUgY3VycmVudCBtb2R1bGUgdmFsdWVzIGludG8gdGhlIGdsb2JhbCBsaWJyYXJ5IHN0cnVjdHVyZSAqLworCWxpYmluZm8tPmxpYl9saXN0W2lkXS5zdGFydF9jb2RlID0gc3RhcnRfY29kZTsKKwlsaWJpbmZvLT5saWJfbGlzdFtpZF0uc3RhcnRfZGF0YSA9IGRhdGFwb3M7CisJbGliaW5mby0+bGliX2xpc3RbaWRdLnN0YXJ0X2JyayA9IGRhdGFwb3MgKyBkYXRhX2xlbiArIGJzc19sZW47CisJbGliaW5mby0+bGliX2xpc3RbaWRdLnRleHRfbGVuID0gdGV4dF9sZW47CisJbGliaW5mby0+bGliX2xpc3RbaWRdLmxvYWRlZCA9IDE7CisJbGliaW5mby0+bGliX2xpc3RbaWRdLmVudHJ5ID0gKDB4MDBmZmZmZmYgJiBudG9obChoZHItPmVudHJ5KSkgKyB0ZXh0cG9zOworCWxpYmluZm8tPmxpYl9saXN0W2lkXS5idWlsZF9kYXRlID0gbnRvaGwoaGRyLT5idWlsZF9kYXRlKTsKKwkKKwkvKgorCSAqIFdlIGp1c3QgbG9hZCB0aGUgYWxsb2NhdGlvbnMgaW50byBzb21lIHRlbXBvcmFyeSBtZW1vcnkgdG8KKwkgKiBoZWxwIHNpbXBsaWZ5IGFsbCB0aGlzIG11bWJvIGp1bWJvCisJICoKKwkgKiBXZSd2ZSBnb3QgdHdvIGRpZmZlcmVudCBzZWN0aW9ucyBvZiByZWxvY2F0aW9uIGVudHJpZXMuCisJICogVGhlIGZpcnN0IGlzIHRoZSBHT1Qgd2hpY2ggcmVzaWRlcyBhdCB0aGUgYmVnaW5pbmcgb2YgdGhlIGRhdGEgc2VnbWVudAorCSAqIGFuZCBpcyB0ZXJtaW5hdGVkIHdpdGggYSAtMS4gIFRoaXMgb25lIGNhbiBiZSByZWxvY2F0ZWQgaW4gcGxhY2UuCisJICogVGhlIHNlY29uZCBpcyB0aGUgZXh0cmEgcmVsb2NhdGlvbiBlbnRyaWVzIHRhY2tlZCBhZnRlciB0aGUgaW1hZ2UncworCSAqIGRhdGEgc2VnbWVudC4gVGhlc2UgcmVxdWlyZSBhIGxpdHRsZSBtb3JlIHByb2Nlc3NpbmcgYXMgdGhlIGVudHJ5IGlzCisJICogcmVhbGx5IGFuIG9mZnNldCBpbnRvIHRoZSBpbWFnZSB3aGljaCBjb250YWlucyBhbiBvZmZzZXQgaW50byB0aGUKKwkgKiBpbWFnZS4KKwkgKi8KKwlpZiAoZmxhZ3MgJiBGTEFUX0ZMQUdfR09UUElDKSB7CisJCWZvciAocnAgPSAodW5zaWduZWQgbG9uZyAqKWRhdGFwb3M7ICpycCAhPSAweGZmZmZmZmZmOyBycCsrKSB7CisJCQl1bnNpZ25lZCBsb25nIGFkZHI7CisJCQlpZiAoKnJwKSB7CisJCQkJYWRkciA9IGNhbGNfcmVsb2MoKnJwLCBsaWJpbmZvLCBpZCwgMCk7CisJCQkJaWYgKGFkZHIgPT0gUkVMT0NfRkFJTEVEKQorCQkJCQlyZXR1cm4gLUVOT0VYRUM7CisJCQkJKnJwID0gYWRkcjsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogTm93IHJ1biB0aHJvdWdoIHRoZSByZWxvY2F0aW9uIGVudHJpZXMuCisJICogV2UndmUgZ290IHRvIGJlIGNhcmVmdWwgaGVyZSBhcyBDKysgcHJvZHVjZXMgcmVsb2NhdGFibGUgemVybworCSAqIGVudHJpZXMgaW4gdGhlIGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIHRhYmxlcyB3aGljaCBhcmUgdGhlbgorCSAqIHRlc3RlZCBmb3IgYmVpbmcgbm90IHplcm8gKHdoaWNoIHdpbGwgYWx3YXlzIG9jY3VyIHVubGVzcyB3ZSdyZQorCSAqIGJhc2VkIGZyb20gYWRkcmVzcyB6ZXJvKS4gIFRoaXMgY2F1c2VzIGFuIGVuZGxlc3MgbG9vcCBhcyBfX3N0YXJ0CisJICogaXMgYXQgemVyby4gIFRoZSBzb2x1dGlvbiB1c2VkIGlzIHRvIG5vdCByZWxvY2F0ZSB6ZXJvIGFkZHJlc3Nlcy4KKwkgKiBUaGlzIGhhcyB0aGUgbmVnYXRpdmUgc2lkZSBlZmZlY3Qgb2Ygbm90IGFsbG93aW5nIGEgZ2xvYmFsIGRhdGEKKwkgKiByZWZlcmVuY2UgdG8gYmUgc3RhdGljYWxseSBpbml0aWFsaXNlZCB0byBfc3RleHQgKEkndmUgbW92ZWQKKwkgKiBfX3N0YXJ0IHRvIGFkZHJlc3MgNCBzbyB0aGF0IGlzIG9rYXkpLgorCSAqLworCWlmIChyZXYgPiBPTERfRkxBVF9WRVJTSU9OKSB7CisJCWZvciAoaT0wOyBpIDwgcmVsb2NzOyBpKyspIHsKKwkJCXVuc2lnbmVkIGxvbmcgYWRkciwgcmVsdmFsOworCisJCQkvKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHBvaW50ZXIgdG8gYmUKKwkJCSAgIHJlbG9jYXRlZCAob2YgY291cnNlLCB0aGUgYWRkcmVzcyBoYXMgdG8gYmUKKwkJCSAgIHJlbG9jYXRlZCBmaXJzdCkuICAqLworCQkJcmVsdmFsID0gbnRvaGwocmVsb2NbaV0pOworCQkJYWRkciA9IGZsYXRfZ2V0X3JlbG9jYXRlX2FkZHIocmVsdmFsKTsKKwkJCXJwID0gKHVuc2lnbmVkIGxvbmcgKikgY2FsY19yZWxvYyhhZGRyLCBsaWJpbmZvLCBpZCwgMSk7CisJCQlpZiAocnAgPT0gKHVuc2lnbmVkIGxvbmcgKilSRUxPQ19GQUlMRUQpCisJCQkJcmV0dXJuIC1FTk9FWEVDOworCisJCQkvKiBHZXQgdGhlIHBvaW50ZXIncyB2YWx1ZS4gICovCisJCQlhZGRyID0gZmxhdF9nZXRfYWRkcl9mcm9tX3JwKHJwLCByZWx2YWwsIGZsYWdzKTsKKwkJCWlmIChhZGRyICE9IDApIHsKKwkJCQkvKgorCQkJCSAqIERvIHRoZSByZWxvY2F0aW9uLiAgUElDIHJlbG9jcyBpbiB0aGUgZGF0YSBzZWN0aW9uIGFyZQorCQkJCSAqIGFscmVhZHkgaW4gdGFyZ2V0IG9yZGVyCisJCQkJICovCisJCQkJaWYgKChmbGFncyAmIEZMQVRfRkxBR19HT1RQSUMpID09IDApCisJCQkJCWFkZHIgPSBudG9obChhZGRyKTsKKwkJCQlhZGRyID0gY2FsY19yZWxvYyhhZGRyLCBsaWJpbmZvLCBpZCwgMCk7CisJCQkJaWYgKGFkZHIgPT0gUkVMT0NfRkFJTEVEKQorCQkJCQlyZXR1cm4gLUVOT0VYRUM7CisKKwkJCQkvKiBXcml0ZSBiYWNrIHRoZSByZWxvY2F0ZWQgcG9pbnRlci4gICovCisJCQkJZmxhdF9wdXRfYWRkcl9hdF9ycChycCwgYWRkciwgcmVsdmFsKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWZvciAoaT0wOyBpIDwgcmVsb2NzOyBpKyspCisJCQlvbGRfcmVsb2MobnRvaGwocmVsb2NbaV0pKTsKKwl9CisJCisJZmx1c2hfaWNhY2hlX3JhbmdlKHN0YXJ0X2NvZGUsIGVuZF9jb2RlKTsKKworCS8qIHplcm8gdGhlIEJTUywgIEJSSyBhbmQgc3RhY2sgYXJlYXMgKi8KKwltZW1zZXQoKHZvaWQqKShkYXRhcG9zICsgZGF0YV9sZW4pLCAwLCBic3NfbGVuICsgCisJCQkobWVtcCArIGtzaXplKCh2b2lkICopIG1lbXApIC0gc3RhY2tfbGVuIC0JLyogZW5kIGJyayAqLworCQkJbGliaW5mby0+bGliX2xpc3RbaWRdLnN0YXJ0X2JyaykgKwkJLyogc3RhcnQgYnJrICovCisJCQlzdGFja19sZW4pOworCisJcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQ09ORklHX0JJTkZNVF9TSEFSRURfRkxBVAorCisvKgorICogTG9hZCBhIHNoYXJlZCBsaWJyYXJ5IGludG8gbWVtb3J5LiAgVGhlIGxpYnJhcnkgZ2V0cyBpdHMgb3duIGRhdGEKKyAqIHNlZ21lbnQgKGluY2x1ZGluZyBic3MpIGJ1dCBub3QgYXJndi9hcmdjL2Vudmlyb24uCisgKi8KKworc3RhdGljIGludCBsb2FkX2ZsYXRfc2hhcmVkX2xpYnJhcnkoaW50IGlkLCBzdHJ1Y3QgbGliX2luZm8gKmxpYnMpCit7CisJc3RydWN0IGxpbnV4X2JpbnBybSBicHJtOworCWludCByZXM7CisJY2hhciBidWZbMTZdOworCisJLyogQ3JlYXRlIHRoZSBmaWxlIG5hbWUgKi8KKwlzcHJpbnRmKGJ1ZiwgIi9saWIvbGliJWQuc28iLCBpZCk7CisKKwkvKiBPcGVuIHRoZSBmaWxlIHVwICovCisJYnBybS5maWxlbmFtZSA9IGJ1ZjsKKwlicHJtLmZpbGUgPSBvcGVuX2V4ZWMoYnBybS5maWxlbmFtZSk7CisJcmVzID0gUFRSX0VSUihicHJtLmZpbGUpOworCWlmIChJU19FUlIoYnBybS5maWxlKSkKKwkJcmV0dXJuIHJlczsKKworCXJlcyA9IHByZXBhcmVfYmlucHJtKCZicHJtKTsKKworCWlmIChyZXMgPD0gKHVuc2lnbmVkIGxvbmcpLTQwOTYpCisJCXJlcyA9IGxvYWRfZmxhdF9maWxlKCZicHJtLCBsaWJzLCBpZCwgTlVMTCk7CisJaWYgKGJwcm0uZmlsZSkgeworCQlhbGxvd193cml0ZV9hY2Nlc3MoYnBybS5maWxlKTsKKwkJZnB1dChicHJtLmZpbGUpOworCQlicHJtLmZpbGUgPSBOVUxMOworCX0KKwlyZXR1cm4ocmVzKTsKK30KKworI2VuZGlmIC8qIENPTkZJR19CSU5GTVRfU0hBUkVEX0ZMQVQgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogVGhlc2UgYXJlIHRoZSBmdW5jdGlvbnMgdXNlZCB0byBsb2FkIGZsYXQgc3R5bGUgZXhlY3V0YWJsZXMgYW5kIHNoYXJlZAorICogbGlicmFyaWVzLiAgVGhlcmUgaXMgbm8gYmluYXJ5IGRlcGVuZGVudCBjb2RlIGFueXdoZXJlIGVsc2UuCisgKi8KKworc3RhdGljIGludCBsb2FkX2ZsYXRfYmluYXJ5KHN0cnVjdCBsaW51eF9iaW5wcm0gKiBicHJtLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0IGxpYl9pbmZvIGxpYmluZm87CisJdW5zaWduZWQgbG9uZyBwID0gYnBybS0+cDsKKwl1bnNpZ25lZCBsb25nIHN0YWNrX2xlbjsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHI7CisJdW5zaWduZWQgbG9uZyAqc3A7CisJaW50IHJlczsKKwlpbnQgaSwgajsKKworCW1lbXNldCgmbGliaW5mbywgMCwgc2l6ZW9mKGxpYmluZm8pKTsKKwkvKgorCSAqIFdlIGhhdmUgdG8gYWRkIHRoZSBzaXplIG9mIG91ciBhcmd1bWVudHMgdG8gb3VyIHN0YWNrIHNpemUKKwkgKiBvdGhlcndpc2UgaXQncyB0b28gZWFzeSBmb3IgdXNlcnMgdG8gY3JlYXRlIHN0YWNrIG92ZXJmbG93cworCSAqIGJ5IHBhc3NpbmcgaW4gYSBodWdlIGFyZ3VtZW50IGxpc3QuICBBbmQgeWVzLCAgd2UgaGF2ZSB0byBiZQorCSAqIHBlZGFudGljIGFuZCBpbmNsdWRlIHNwYWNlIGZvciB0aGUgYXJndi9lbnZwIGFycmF5IGFzIGl0IG1heSBoYXZlCisJICogYSBsb3Qgb2YgZW50cmllcy4KKwkgKi8KKyNkZWZpbmUgVE9QX09GX0FSR1MgKFBBR0VfU0laRSAqIE1BWF9BUkdfUEFHRVMgLSBzaXplb2Yodm9pZCAqKSkKKwlzdGFja19sZW4gPSBUT1BfT0ZfQVJHUyAtIGJwcm0tPnA7ICAgICAgICAgICAgIC8qIHRoZSBzdHJpbmdzICovCisJc3RhY2tfbGVuICs9IChicHJtLT5hcmdjICsgMSkgKiBzaXplb2YoY2hhciAqKTsgLyogdGhlIGFyZ3YgYXJyYXkgKi8KKwlzdGFja19sZW4gKz0gKGJwcm0tPmVudmMgKyAxKSAqIHNpemVvZihjaGFyICopOyAvKiB0aGUgZW52cCBhcnJheSAqLworCisJCisJcmVzID0gbG9hZF9mbGF0X2ZpbGUoYnBybSwgJmxpYmluZm8sIDAsICZzdGFja19sZW4pOworCWlmIChyZXMgPiAodW5zaWduZWQgbG9uZyktNDA5NikKKwkJcmV0dXJuIHJlczsKKwkKKwkvKiBVcGRhdGUgZGF0YSBzZWdtZW50IHBvaW50ZXJzIGZvciBhbGwgbGlicmFyaWVzICovCisJZm9yIChpPTA7IGk8TUFYX1NIQVJFRF9MSUJTOyBpKyspCisJCWlmIChsaWJpbmZvLmxpYl9saXN0W2ldLmxvYWRlZCkKKwkJCWZvciAoaj0wOyBqPE1BWF9TSEFSRURfTElCUzsgaisrKQorCQkJCSgtKGorMSkpWyh1bnNpZ25lZCBsb25nICopKGxpYmluZm8ubGliX2xpc3RbaV0uc3RhcnRfZGF0YSldID0KKwkJCQkJKGxpYmluZm8ubGliX2xpc3Rbal0ubG9hZGVkKT8KKwkJCQkJCWxpYmluZm8ubGliX2xpc3Rbal0uc3RhcnRfZGF0YTpVTkxPQURFRF9MSUI7CisKKwljb21wdXRlX2NyZWRzKGJwcm0pOworIAljdXJyZW50LT5mbGFncyAmPSB+UEZfRk9SS05PRVhFQzsKKworCXNldF9iaW5mbXQoJmZsYXRfZm9ybWF0KTsKKworCXAgPSAoKGN1cnJlbnQtPm1tLT5jb250ZXh0LmVuZF9icmsgKyBzdGFja19sZW4gKyAzKSAmIH4zKSAtIDQ7CisJREJHX0ZMVCgicD0leFxuIiwgKGludClwKTsKKworCS8qIGNvcHkgdGhlIGFyZyBwYWdlcyBvbnRvIHRoZSBzdGFjaywgdGhpcyBjb3VsZCBiZSBtb3JlIGVmZmljaWVudCA6LSkgKi8KKwlmb3IgKGkgPSBUT1BfT0ZfQVJHUyAtIDE7IGkgPj0gYnBybS0+cDsgaS0tKQorCQkqIChjaGFyICopIC0tcCA9CisJCQkoKGNoYXIgKikgcGFnZV9hZGRyZXNzKGJwcm0tPnBhZ2VbaS9QQUdFX1NJWkVdKSlbaSAlIFBBR0VfU0laRV07CisKKwlzcCA9ICh1bnNpZ25lZCBsb25nICopIGNyZWF0ZV9mbGF0X3RhYmxlcyhwLCBicHJtKTsKKwkKKwkvKiBGYWtlIHNvbWUgcmV0dXJuIGFkZHJlc3NlcyB0byBlbnN1cmUgdGhlIGNhbGwgY2hhaW4gd2lsbAorCSAqIGluaXRpYWxpc2UgbGlicmFyeSBpbiBvcmRlciBmb3IgdXMuICBXZSBhcmUgcmVxdWlyZWQgdG8gY2FsbAorCSAqIGxpYiAxIGZpcnN0LCB0aGVuIDIsIC4uLiBhbmQgZmluYWxseSB0aGUgbWFpbiBwcm9ncmFtIChpZCAwKS4KKwkgKi8KKwlzdGFydF9hZGRyID0gbGliaW5mby5saWJfbGlzdFswXS5lbnRyeTsKKworI2lmZGVmIENPTkZJR19CSU5GTVRfU0hBUkVEX0ZMQVQKKwlmb3IgKGkgPSBNQVhfU0hBUkVEX0xJQlMtMTsgaT4wOyBpLS0pIHsKKwkJaWYgKGxpYmluZm8ubGliX2xpc3RbaV0ubG9hZGVkKSB7CisJCQkvKiBQdXNoIHByZXZpb3MgZmlyc3QgdG8gY2FsbCBhZGRyZXNzICovCisJCQktLXNwOwlwdXRfdXNlcihzdGFydF9hZGRyLCBzcCk7CisJCQlzdGFydF9hZGRyID0gbGliaW5mby5saWJfbGlzdFtpXS5lbnRyeTsKKwkJfQorCX0KKyNlbmRpZgorCQorCS8qIFN0YXNoIG91ciBpbml0aWFsIHN0YWNrIHBvaW50ZXIgaW50byB0aGUgbW0gc3RydWN0dXJlICovCisJY3VycmVudC0+bW0tPnN0YXJ0X3N0YWNrID0gKHVuc2lnbmVkIGxvbmcgKXNwOworCisJCisJREJHX0ZMVCgic3RhcnRfdGhyZWFkKHJlZ3M9MHgleCwgZW50cnk9MHgleCwgc3RhcnRfc3RhY2s9MHgleClcbiIsCisJCShpbnQpcmVncywgKGludClzdGFydF9hZGRyLCAoaW50KWN1cnJlbnQtPm1tLT5zdGFydF9zdGFjayk7CisJCisJc3RhcnRfdGhyZWFkKHJlZ3MsIHN0YXJ0X2FkZHIsIGN1cnJlbnQtPm1tLT5zdGFydF9zdGFjayk7CisKKwlpZiAoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkKKwkJc2VuZF9zaWcoU0lHVFJBUCwgY3VycmVudCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfZmxhdF9iaW5mbXQodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfYmluZm10KCZmbGF0X2Zvcm1hdCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2ZsYXRfYmluZm10KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9iaW5mbXQoJmZsYXRfZm9ybWF0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2NvcmVfaW5pdGNhbGwoaW5pdF9mbGF0X2JpbmZtdCk7Cittb2R1bGVfZXhpdChleGl0X2ZsYXRfYmluZm10KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9mcy9iaW5mbXRfbWlzYy5jIGIvZnMvYmluZm10X21pc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWUwZGI2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvYmluZm10X21pc2MuYwpAQCAtMCwwICsxLDc4MCBAQAorLyoKKyAqICBiaW5mbXRfbWlzYy5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NyBSaWNoYXJkIEf8bnRoZXIKKyAqCisgKiAgYmluZm10X21pc2MgZGV0ZWN0cyBiaW5hcmllcyB2aWEgYSBtYWdpYyBvciBmaWxlbmFtZSBleHRlbnNpb24gYW5kIGludm9rZXMKKyAqICBhIHNwZWNpZmllZCB3cmFwcGVyLiBUaGlzIHNob3VsZCBvYnNvbGV0ZSBiaW5mbXRfamF2YSwgYmluZm10X2VtODYgYW5kCisgKiAgYmluZm10X216LgorICoKKyAqICAxOTk3LTA0LTI1IGZpcnN0IHZlcnNpb24KKyAqICBbLi4uXQorICogIDE5OTctMDUtMTkgY2xlYW51cAorICogIDE5OTctMDYtMjYgaHBhOiBwYXNzIHRoZSByZWFsIGZpbGVuYW1lIHJhdGhlciB0aGFuIGFyZ3ZbMF0KKyAqICAxOTk3LTA2LTMwIG1pbm9yIGNsZWFudXAKKyAqICAxOTk3LTA4LTA5IHJlbW92ZWQgZXh0ZW5zaW9uIHN0cmlwcGluZywgbG9ja2luZyBjbGVhbnVwCisgKiAgMjAwMS0wMi0yOCBBVjogcmV3cml0dGVuIGludG8gc29tZXRoaW5nIHRoYXQgcmVzZW1ibGVzIEMuIE9yaWdpbmFsIGRpZG4ndC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bGludXgvYmluZm10cy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitlbnVtIHsKKwlWRVJCT1NFX1NUQVRVUyA9IDEgLyogbWFrZSBpdCB6ZXJvIHRvIHNhdmUgNDAwIGJ5dGVzIGtlcm5lbCBtZW1vcnkgKi8KK307CisKK3N0YXRpYyBMSVNUX0hFQUQoZW50cmllcyk7CitzdGF0aWMgaW50IGVuYWJsZWQgPSAxOworCitlbnVtIHtFbmFibGVkLCBNYWdpY307CisjZGVmaW5lIE1JU0NfRk1UX1BSRVNFUlZFX0FSR1YwICgxPDwzMSkKKyNkZWZpbmUgTUlTQ19GTVRfT1BFTl9CSU5BUlkgKDE8PDMwKQorI2RlZmluZSBNSVNDX0ZNVF9DUkVERU5USUFMUyAoMTw8MjkpCisKK3R5cGVkZWYgc3RydWN0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdW5zaWduZWQgbG9uZyBmbGFnczsJCS8qIHR5cGUsIHN0YXR1cywgZXRjLiAqLworCWludCBvZmZzZXQ7CQkJLyogb2Zmc2V0IG9mIG1hZ2ljICovCisJaW50IHNpemU7CQkJLyogc2l6ZSBvZiBtYWdpYy9tYXNrICovCisJY2hhciAqbWFnaWM7CQkJLyogbWFnaWMgb3IgZmlsZW5hbWUgZXh0ZW5zaW9uICovCisJY2hhciAqbWFzazsJCQkvKiBtYXNrLCBOVUxMIGZvciBleGFjdCBtYXRjaCAqLworCWNoYXIgKmludGVycHJldGVyOwkJLyogZmlsZW5hbWUgb2YgaW50ZXJwcmV0ZXIgKi8KKwljaGFyICpuYW1lOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKK30gTm9kZTsKKworc3RhdGljIERFRklORV9SV0xPQ0soZW50cmllc19sb2NrKTsKK3N0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKmJtX21udDsKK3N0YXRpYyBpbnQgZW50cnlfY291bnQ7CisKKy8qIAorICogQ2hlY2sgaWYgd2Ugc3VwcG9ydCB0aGUgYmluZm10CisgKiBpZiB3ZSBkbywgcmV0dXJuIHRoZSBub2RlLCBlbHNlIE5VTEwKKyAqIGxvY2tpbmcgaXMgZG9uZSBpbiBsb2FkX21pc2NfYmluYXJ5CisgKi8KK3N0YXRpYyBOb2RlICpjaGVja19maWxlKHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pCit7CisJY2hhciAqcCA9IHN0cnJjaHIoYnBybS0+aW50ZXJwLCAnLicpOworCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisKKwlsaXN0X2Zvcl9lYWNoKGwsICZlbnRyaWVzKSB7CisJCU5vZGUgKmUgPSBsaXN0X2VudHJ5KGwsIE5vZGUsIGxpc3QpOworCQljaGFyICpzOworCQlpbnQgajsKKworCQlpZiAoIXRlc3RfYml0KEVuYWJsZWQsICZlLT5mbGFncykpCisJCQljb250aW51ZTsKKworCQlpZiAoIXRlc3RfYml0KE1hZ2ljLCAmZS0+ZmxhZ3MpKSB7CisJCQlpZiAocCAmJiAhc3RyY21wKGUtPm1hZ2ljLCBwICsgMSkpCisJCQkJcmV0dXJuIGU7CisJCQljb250aW51ZTsKKwkJfQorCisJCXMgPSBicHJtLT5idWYgKyBlLT5vZmZzZXQ7CisJCWlmIChlLT5tYXNrKSB7CisJCQlmb3IgKGogPSAwOyBqIDwgZS0+c2l6ZTsgaisrKQorCQkJCWlmICgoKnMrKyBeIGUtPm1hZ2ljW2pdKSAmIGUtPm1hc2tbal0pCisJCQkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJZm9yIChqID0gMDsgaiA8IGUtPnNpemU7IGorKykKKwkJCQlpZiAoKCpzKysgXiBlLT5tYWdpY1tqXSkpCisJCQkJCWJyZWFrOworCQl9CisJCWlmIChqID09IGUtPnNpemUpCisJCQlyZXR1cm4gZTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiB0aGUgbG9hZGVyIGl0c2VsZgorICovCitzdGF0aWMgaW50IGxvYWRfbWlzY19iaW5hcnkoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJTm9kZSAqZm10OworCXN0cnVjdCBmaWxlICogaW50ZXJwX2ZpbGUgPSBOVUxMOworCWNoYXIgaW5hbWVbQklOUFJNX0JVRl9TSVpFXTsKKwljaGFyICppbmFtZV9hZGRyID0gaW5hbWU7CisJaW50IHJldHZhbDsKKwlpbnQgZmRfYmluYXJ5ID0gLTE7CisJc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMgPSBOVUxMOworCisJcmV0dmFsID0gLUVOT0VYRUM7CisJaWYgKCFlbmFibGVkKQorCQlnb3RvIF9yZXQ7CisKKwkvKiB0byBrZWVwIGxvY2tpbmcgdGltZSBsb3csIHdlIGNvcHkgdGhlIGludGVycHJldGVyIHN0cmluZyAqLworCXJlYWRfbG9jaygmZW50cmllc19sb2NrKTsKKwlmbXQgPSBjaGVja19maWxlKGJwcm0pOworCWlmIChmbXQpCisJCXN0cmxjcHkoaW5hbWUsIGZtdC0+aW50ZXJwcmV0ZXIsIEJJTlBSTV9CVUZfU0laRSk7CisJcmVhZF91bmxvY2soJmVudHJpZXNfbG9jayk7CisJaWYgKCFmbXQpCisJCWdvdG8gX3JldDsKKworCWlmICghKGZtdC0+ZmxhZ3MgJiBNSVNDX0ZNVF9QUkVTRVJWRV9BUkdWMCkpIHsKKwkJcmVtb3ZlX2FyZ196ZXJvKGJwcm0pOworCX0KKworCWlmIChmbXQtPmZsYWdzICYgTUlTQ19GTVRfT1BFTl9CSU5BUlkpIHsKKworCQlmaWxlcyA9IGN1cnJlbnQtPmZpbGVzOworCQlyZXR2YWwgPSB1bnNoYXJlX2ZpbGVzKCk7CisJCWlmIChyZXR2YWwgPCAwKQorCQkJZ290byBfcmV0OworCQlpZiAoZmlsZXMgPT0gY3VycmVudC0+ZmlsZXMpIHsKKwkJCXB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpOworCQkJZmlsZXMgPSBOVUxMOworCQl9CisJCS8qIGlmIHRoZSBiaW5hcnkgc2hvdWxkIGJlIG9wZW5lZCBvbiBiZWhhbGYgb2YgdGhlCisJCSAqIGludGVycHJldGVyIHRoYW4ga2VlcCBpdCBvcGVuIGFuZCBhc3NpZ24gZGVzY3JpcHRvcgorCQkgKiB0byBpdCAqLworIAkJZmRfYmluYXJ5ID0gZ2V0X3VudXNlZF9mZCgpOworIAkJaWYgKGZkX2JpbmFyeSA8IDApIHsKKyAJCQlyZXR2YWwgPSBmZF9iaW5hcnk7CisgCQkJZ290byBfdW5zaGFyZTsKKyAJCX0KKyAJCWZkX2luc3RhbGwoZmRfYmluYXJ5LCBicHJtLT5maWxlKTsKKworCQkvKiBpZiB0aGUgYmluYXJ5IGlzIG5vdCByZWFkYWJsZSB0aGFuIGVuZm9yY2UgbW0tPmR1bXBhYmxlPTAKKwkJICAgcmVnYXJkbGVzcyBvZiB0aGUgaW50ZXJwcmV0ZXIncyBwZXJtaXNzaW9ucyAqLworCQlpZiAocGVybWlzc2lvbihicHJtLT5maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgTUFZX1JFQUQsIE5VTEwpKQorCQkJYnBybS0+aW50ZXJwX2ZsYWdzIHw9IEJJTlBSTV9GTEFHU19FTkZPUkNFX05PTkRVTVA7CisKKwkJYWxsb3dfd3JpdGVfYWNjZXNzKGJwcm0tPmZpbGUpOworCQlicHJtLT5maWxlID0gTlVMTDsKKworCQkvKiBtYXJrIHRoZSBicHJtIHRoYXQgZmQgc2hvdWxkIGJlIHBhc3NlZCB0byBpbnRlcnAgKi8KKwkJYnBybS0+aW50ZXJwX2ZsYWdzIHw9IEJJTlBSTV9GTEFHU19FWEVDRkQ7CisJCWJwcm0tPmludGVycF9kYXRhID0gZmRfYmluYXJ5OworCisgCX0gZWxzZSB7CisgCQlhbGxvd193cml0ZV9hY2Nlc3MoYnBybS0+ZmlsZSk7CisgCQlmcHV0KGJwcm0tPmZpbGUpOworIAkJYnBybS0+ZmlsZSA9IE5VTEw7CisgCX0KKwkvKiBtYWtlIGFyZ3ZbMV0gYmUgdGhlIHBhdGggdG8gdGhlIGJpbmFyeSAqLworCXJldHZhbCA9IGNvcHlfc3RyaW5nc19rZXJuZWwgKDEsICZicHJtLT5pbnRlcnAsIGJwcm0pOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIF9lcnJvcjsKKwlicHJtLT5hcmdjKys7CisKKwkvKiBhZGQgdGhlIGludGVycCBhcyBhcmd2WzBdICovCisJcmV0dmFsID0gY29weV9zdHJpbmdzX2tlcm5lbCAoMSwgJmluYW1lX2FkZHIsIGJwcm0pOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIF9lcnJvcjsKKwlicHJtLT5hcmdjICsrOworCisJYnBybS0+aW50ZXJwID0gaW5hbWU7CS8qIGZvciBiaW5mbXRfc2NyaXB0ICovCisKKwlpbnRlcnBfZmlsZSA9IG9wZW5fZXhlYyAoaW5hbWUpOworCXJldHZhbCA9IFBUUl9FUlIgKGludGVycF9maWxlKTsKKwlpZiAoSVNfRVJSIChpbnRlcnBfZmlsZSkpCisJCWdvdG8gX2Vycm9yOworCisJYnBybS0+ZmlsZSA9IGludGVycF9maWxlOworCWlmIChmbXQtPmZsYWdzICYgTUlTQ19GTVRfQ1JFREVOVElBTFMpIHsKKwkJLyoKKwkJICogTm8gbmVlZCB0byBjYWxsIHByZXBhcmVfYmlucHJtKCksIGl0J3MgYWxyZWFkeSBiZWVuCisJCSAqIGRvbmUuICBicHJtLT5idWYgaXMgc3RhbGUsIHVwZGF0ZSBmcm9tIGludGVycF9maWxlLgorCQkgKi8KKwkJbWVtc2V0KGJwcm0tPmJ1ZiwgMCwgQklOUFJNX0JVRl9TSVpFKTsKKwkJcmV0dmFsID0ga2VybmVsX3JlYWQoYnBybS0+ZmlsZSwgMCwgYnBybS0+YnVmLCBCSU5QUk1fQlVGX1NJWkUpOworCX0gZWxzZQorCQlyZXR2YWwgPSBwcmVwYXJlX2JpbnBybSAoYnBybSk7CisKKwlpZiAocmV0dmFsIDwgMCkKKwkJZ290byBfZXJyb3I7CisKKwlyZXR2YWwgPSBzZWFyY2hfYmluYXJ5X2hhbmRsZXIgKGJwcm0sIHJlZ3MpOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIF9lcnJvcjsKKworCWlmIChmaWxlcykgeworCQlzdGVhbF9sb2NrcyhmaWxlcyk7CisJCXB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpOworCQlmaWxlcyA9IE5VTEw7CisJfQorX3JldDoKKwlyZXR1cm4gcmV0dmFsOworX2Vycm9yOgorCWlmIChmZF9iaW5hcnkgPiAwKQorCQlzeXNfY2xvc2UoZmRfYmluYXJ5KTsKKwlicHJtLT5pbnRlcnBfZmxhZ3MgPSAwOworCWJwcm0tPmludGVycF9kYXRhID0gMDsKK191bnNoYXJlOgorCWlmIChmaWxlcykgeworCQlwdXRfZmlsZXNfc3RydWN0KGN1cnJlbnQtPmZpbGVzKTsKKwkJY3VycmVudC0+ZmlsZXMgPSBmaWxlczsKKwl9CisJZ290byBfcmV0OworfQorCisvKiBDb21tYW5kIHBhcnNlcnMgKi8KKworLyoKKyAqIHBhcnNlcyBhbmQgY29waWVzIG9uZSBhcmd1bWVudCBlbmNsb3NlZCBpbiBkZWwgZnJvbSAqc3AgdG8gKmRwLAorICogcmVjb2duaXNpbmcgdGhlIFx4IHNwZWNpYWwuCisgKiByZXR1cm5zIHBvaW50ZXIgdG8gdGhlIGNvcGllZCBhcmd1bWVudCBvciBOVUxMIGluIGNhc2Ugb2YgYW4KKyAqIGVycm9yIChhbmQgc2V0cyBlcnIpIG9yIG51bGwgYXJndW1lbnQgbGVuZ3RoLgorICovCitzdGF0aWMgY2hhciAqc2NhbmFyZyhjaGFyICpzLCBjaGFyIGRlbCkKK3sKKwljaGFyIGM7CisKKwl3aGlsZSAoKGMgPSAqcysrKSAhPSBkZWwpIHsKKwkJaWYgKGMgPT0gJ1xcJyAmJiAqcyA9PSAneCcpIHsKKwkJCXMrKzsKKwkJCWlmICghaXN4ZGlnaXQoKnMrKykpCisJCQkJcmV0dXJuIE5VTEw7CisJCQlpZiAoIWlzeGRpZ2l0KCpzKyspKQorCQkJCXJldHVybiBOVUxMOworCQl9CisJfQorCXJldHVybiBzOworfQorCitzdGF0aWMgaW50IHVucXVvdGUoY2hhciAqZnJvbSkKK3sKKwljaGFyIGMgPSAwLCAqcyA9IGZyb20sICpwID0gZnJvbTsKKworCXdoaWxlICgoYyA9ICpzKyspICE9ICdcMCcpIHsKKwkJaWYgKGMgPT0gJ1xcJyAmJiAqcyA9PSAneCcpIHsKKwkJCXMrKzsKKwkJCWMgPSB0b3VwcGVyKCpzKyspOworCQkJKnAgPSAoYyAtIChpc2RpZ2l0KGMpID8gJzAnIDogJ0EnIC0gMTApKSA8PCA0OworCQkJYyA9IHRvdXBwZXIoKnMrKyk7CisJCQkqcCsrIHw9IGMgLSAoaXNkaWdpdChjKSA/ICcwJyA6ICdBJyAtIDEwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCSpwKysgPSBjOworCX0KKwlyZXR1cm4gcCAtIGZyb207Cit9CisKK3N0YXRpYyBpbmxpbmUgY2hhciAqIGNoZWNrX3NwZWNpYWxfZmxhZ3MgKGNoYXIgKiBzZnMsIE5vZGUgKiBlKQoreworCWNoYXIgKiBwID0gc2ZzOworCWludCBjb250ID0gMTsKKworCS8qIHNwZWNpYWwgZmxhZ3MgKi8KKwl3aGlsZSAoY29udCkgeworCQlzd2l0Y2ggKCpwKSB7CisJCQljYXNlICdQJzoKKwkJCQlwKys7CisJCQkJZS0+ZmxhZ3MgfD0gTUlTQ19GTVRfUFJFU0VSVkVfQVJHVjA7CisJCQkJYnJlYWs7CisJCQljYXNlICdPJzoKKwkJCQlwKys7CisJCQkJZS0+ZmxhZ3MgfD0gTUlTQ19GTVRfT1BFTl9CSU5BUlk7CisJCQkJYnJlYWs7CisJCQljYXNlICdDJzoKKwkJCQlwKys7CisJCQkJLyogdGhpcyBmbGFncyBhbHNvIGltcGxpZXMgdGhlCisJCQkJICAgb3Blbi1iaW5hcnkgZmxhZyAqLworCQkJCWUtPmZsYWdzIHw9IChNSVNDX0ZNVF9DUkVERU5USUFMUyB8CisJCQkJCQlNSVNDX0ZNVF9PUEVOX0JJTkFSWSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWNvbnQgPSAwOworCQl9CisJfQorCisJcmV0dXJuIHA7Cit9CisvKgorICogVGhpcyByZWdpc3RlcnMgYSBuZXcgYmluYXJ5IGZvcm1hdCwgaXQgcmVjb2duaXNlcyB0aGUgc3ludGF4CisgKiAnOm5hbWU6dHlwZTpvZmZzZXQ6bWFnaWM6bWFzazppbnRlcnByZXRlcjpmbGFncycKKyAqIHdoZXJlIHRoZSAnOicgaXMgdGhlIElGUywgdGhhdCBjYW4gYmUgY2hvc2VuIHdpdGggdGhlIGZpcnN0IGNoYXIKKyAqLworc3RhdGljIE5vZGUgKmNyZWF0ZV9lbnRyeShjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpCit7CisJTm9kZSAqZTsKKwlpbnQgbWVtc2l6ZSwgZXJyOworCWNoYXIgKmJ1ZiwgKnA7CisJY2hhciBkZWw7CisKKwkvKiBzb21lIHNhbml0eSBjaGVja3MgKi8KKwllcnIgPSAtRUlOVkFMOworCWlmICgoY291bnQgPCAxMSkgfHwgKGNvdW50ID4gMjU2KSkKKwkJZ290byBvdXQ7CisKKwllcnIgPSAtRU5PTUVNOworCW1lbXNpemUgPSBzaXplb2YoTm9kZSkgKyBjb3VudCArIDg7CisJZSA9IChOb2RlICopIGttYWxsb2MobWVtc2l6ZSwgR0ZQX1VTRVIpOworCWlmICghZSkKKwkJZ290byBvdXQ7CisKKwlwID0gYnVmID0gKGNoYXIgKillICsgc2l6ZW9mKE5vZGUpOworCisJbWVtc2V0KGUsIDAsIHNpemVvZihOb2RlKSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgYnVmZmVyLCBjb3VudCkpCisJCWdvdG8gRWZhdWx0OworCisJZGVsID0gKnArKzsJLyogZGVsaW1ldGVyICovCisKKwltZW1zZXQoYnVmK2NvdW50LCBkZWwsIDgpOworCisJZS0+bmFtZSA9IHA7CisJcCA9IHN0cmNocihwLCBkZWwpOworCWlmICghcCkKKwkJZ290byBFaW52YWw7CisJKnArKyA9ICdcMCc7CisJaWYgKCFlLT5uYW1lWzBdIHx8CisJICAgICFzdHJjbXAoZS0+bmFtZSwgIi4iKSB8fAorCSAgICAhc3RyY21wKGUtPm5hbWUsICIuLiIpIHx8CisJICAgIHN0cmNocihlLT5uYW1lLCAnLycpKQorCQlnb3RvIEVpbnZhbDsKKwlzd2l0Y2ggKCpwKyspIHsKKwkJY2FzZSAnRSc6IGUtPmZsYWdzID0gMTw8RW5hYmxlZDsgYnJlYWs7CisJCWNhc2UgJ00nOiBlLT5mbGFncyA9ICgxPDxFbmFibGVkKSB8ICgxPDxNYWdpYyk7IGJyZWFrOworCQlkZWZhdWx0OiBnb3RvIEVpbnZhbDsKKwl9CisJaWYgKCpwKysgIT0gZGVsKQorCQlnb3RvIEVpbnZhbDsKKwlpZiAodGVzdF9iaXQoTWFnaWMsICZlLT5mbGFncykpIHsKKwkJY2hhciAqcyA9IHN0cmNocihwLCBkZWwpOworCQlpZiAoIXMpCisJCQlnb3RvIEVpbnZhbDsKKwkJKnMrKyA9ICdcMCc7CisJCWUtPm9mZnNldCA9IHNpbXBsZV9zdHJ0b3VsKHAsICZwLCAxMCk7CisJCWlmICgqcCsrKQorCQkJZ290byBFaW52YWw7CisJCWUtPm1hZ2ljID0gcDsKKwkJcCA9IHNjYW5hcmcocCwgZGVsKTsKKwkJaWYgKCFwKQorCQkJZ290byBFaW52YWw7CisJCXBbLTFdID0gJ1wwJzsKKwkJaWYgKCFlLT5tYWdpY1swXSkKKwkJCWdvdG8gRWludmFsOworCQllLT5tYXNrID0gcDsKKwkJcCA9IHNjYW5hcmcocCwgZGVsKTsKKwkJaWYgKCFwKQorCQkJZ290byBFaW52YWw7CisJCXBbLTFdID0gJ1wwJzsKKwkJaWYgKCFlLT5tYXNrWzBdKQorCQkJZS0+bWFzayA9IE5VTEw7CisJCWUtPnNpemUgPSB1bnF1b3RlKGUtPm1hZ2ljKTsKKwkJaWYgKGUtPm1hc2sgJiYgdW5xdW90ZShlLT5tYXNrKSAhPSBlLT5zaXplKQorCQkJZ290byBFaW52YWw7CisJCWlmIChlLT5zaXplICsgZS0+b2Zmc2V0ID4gQklOUFJNX0JVRl9TSVpFKQorCQkJZ290byBFaW52YWw7CisJfSBlbHNlIHsKKwkJcCA9IHN0cmNocihwLCBkZWwpOworCQlpZiAoIXApCisJCQlnb3RvIEVpbnZhbDsKKwkJKnArKyA9ICdcMCc7CisJCWUtPm1hZ2ljID0gcDsKKwkJcCA9IHN0cmNocihwLCBkZWwpOworCQlpZiAoIXApCisJCQlnb3RvIEVpbnZhbDsKKwkJKnArKyA9ICdcMCc7CisJCWlmICghZS0+bWFnaWNbMF0gfHwgc3RyY2hyKGUtPm1hZ2ljLCAnLycpKQorCQkJZ290byBFaW52YWw7CisJCXAgPSBzdHJjaHIocCwgZGVsKTsKKwkJaWYgKCFwKQorCQkJZ290byBFaW52YWw7CisJCSpwKysgPSAnXDAnOworCX0KKwllLT5pbnRlcnByZXRlciA9IHA7CisJcCA9IHN0cmNocihwLCBkZWwpOworCWlmICghcCkKKwkJZ290byBFaW52YWw7CisJKnArKyA9ICdcMCc7CisJaWYgKCFlLT5pbnRlcnByZXRlclswXSkKKwkJZ290byBFaW52YWw7CisKKworCXAgPSBjaGVja19zcGVjaWFsX2ZsYWdzIChwLCBlKTsKKworCWlmICgqcCA9PSAnXG4nKQorCQlwKys7CisJaWYgKHAgIT0gYnVmICsgY291bnQpCisJCWdvdG8gRWludmFsOworCXJldHVybiBlOworCitvdXQ6CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKworRWZhdWx0OgorCWtmcmVlKGUpOworCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOworRWludmFsOgorCWtmcmVlKGUpOworCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworfQorCisvKgorICogU2V0IHN0YXR1cyBvZiBlbnRyeS9iaW5mbXRfbWlzYzoKKyAqICcxJyBlbmFibGVzLCAnMCcgZGlzYWJsZXMgYW5kICctMScgY2xlYXJzIGVudHJ5L2JpbmZtdF9taXNjCisgKi8KK3N0YXRpYyBpbnQgcGFyc2VfY29tbWFuZChjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpCit7CisJY2hhciBzWzRdOworCisJaWYgKCFjb3VudCkKKwkJcmV0dXJuIDA7CisJaWYgKGNvdW50ID4gMykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGNvcHlfZnJvbV91c2VyKHMsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoc1tjb3VudC0xXSA9PSAnXG4nKQorCQljb3VudC0tOworCWlmIChjb3VudCA9PSAxICYmIHNbMF0gPT0gJzAnKQorCQlyZXR1cm4gMTsKKwlpZiAoY291bnQgPT0gMSAmJiBzWzBdID09ICcxJykKKwkJcmV0dXJuIDI7CisJaWYgKGNvdW50ID09IDIgJiYgc1swXSA9PSAnLScgJiYgc1sxXSA9PSAnMScpCisJCXJldHVybiAzOworCXJldHVybiAtRUlOVkFMOworfQorCisvKiBnZW5lcmljIHN0dWZmICovCisKK3N0YXRpYyB2b2lkIGVudHJ5X3N0YXR1cyhOb2RlICplLCBjaGFyICpwYWdlKQoreworCWNoYXIgKmRwOworCWNoYXIgKnN0YXR1cyA9ICJkaXNhYmxlZCI7CisJY29uc3QgY2hhciAqIGZsYWdzID0gImZsYWdzOiAiOworCisJaWYgKHRlc3RfYml0KEVuYWJsZWQsICZlLT5mbGFncykpCisJCXN0YXR1cyA9ICJlbmFibGVkIjsKKworCWlmICghVkVSQk9TRV9TVEFUVVMpIHsKKwkJc3ByaW50ZihwYWdlLCAiJXNcbiIsIHN0YXR1cyk7CisJCXJldHVybjsKKwl9CisKKwlzcHJpbnRmKHBhZ2UsICIlc1xuaW50ZXJwcmV0ZXIgJXNcbiIsIHN0YXR1cywgZS0+aW50ZXJwcmV0ZXIpOworCWRwID0gcGFnZSArIHN0cmxlbihwYWdlKTsKKworCS8qIHByaW50IHRoZSBzcGVjaWFsIGZsYWdzICovCisJc3ByaW50ZiAoZHAsICIlcyIsIGZsYWdzKTsKKwlkcCArPSBzdHJsZW4gKGZsYWdzKTsKKwlpZiAoZS0+ZmxhZ3MgJiBNSVNDX0ZNVF9QUkVTRVJWRV9BUkdWMCkgeworCQkqZHAgKysgPSAnUCc7CisJfQorCWlmIChlLT5mbGFncyAmIE1JU0NfRk1UX09QRU5fQklOQVJZKSB7CisJCSpkcCArKyA9ICdPJzsKKwl9CisJaWYgKGUtPmZsYWdzICYgTUlTQ19GTVRfQ1JFREVOVElBTFMpIHsKKwkJKmRwICsrID0gJ0MnOworCX0KKwkqZHAgKysgPSAnXG4nOworCisKKwlpZiAoIXRlc3RfYml0KE1hZ2ljLCAmZS0+ZmxhZ3MpKSB7CisJCXNwcmludGYoZHAsICJleHRlbnNpb24gLiVzXG4iLCBlLT5tYWdpYyk7CisJfSBlbHNlIHsKKwkJaW50IGk7CisKKwkJc3ByaW50ZihkcCwgIm9mZnNldCAlaVxubWFnaWMgIiwgZS0+b2Zmc2V0KTsKKwkJZHAgPSBwYWdlICsgc3RybGVuKHBhZ2UpOworCQlmb3IgKGkgPSAwOyBpIDwgZS0+c2l6ZTsgaSsrKSB7CisJCQlzcHJpbnRmKGRwLCAiJTAyeCIsIDB4ZmYgJiAoaW50KSAoZS0+bWFnaWNbaV0pKTsKKwkJCWRwICs9IDI7CisJCX0KKwkJaWYgKGUtPm1hc2spIHsKKwkJCXNwcmludGYoZHAsICJcbm1hc2sgIik7CisJCQlkcCArPSA2OworCQkJZm9yIChpID0gMDsgaSA8IGUtPnNpemU7IGkrKykgeworCQkJCXNwcmludGYoZHAsICIlMDJ4IiwgMHhmZiAmIChpbnQpIChlLT5tYXNrW2ldKSk7CisJCQkJZHAgKz0gMjsKKwkJCX0KKwkJfQorCQkqZHArKyA9ICdcbic7CisJCSpkcCA9ICdcMCc7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGlub2RlICpibV9nZXRfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IG1vZGUpCit7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBuZXdfaW5vZGUoc2IpOworCisJaWYgKGlub2RlKSB7CisJCWlub2RlLT5pX21vZGUgPSBtb2RlOworCQlpbm9kZS0+aV91aWQgPSAwOworCQlpbm9kZS0+aV9naWQgPSAwOworCQlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9DQUNIRV9TSVpFOworCQlpbm9kZS0+aV9ibG9ja3MgPSAwOworCQlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPQorCQkJY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKKwl9CisJcmV0dXJuIGlub2RlOworfQorCitzdGF0aWMgdm9pZCBibV9jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWtmcmVlKGlub2RlLT51LmdlbmVyaWNfaXApOworfQorCitzdGF0aWMgdm9pZCBraWxsX25vZGUoTm9kZSAqZSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisKKwl3cml0ZV9sb2NrKCZlbnRyaWVzX2xvY2spOworCWRlbnRyeSA9IGUtPmRlbnRyeTsKKwlpZiAoZGVudHJ5KSB7CisJCWxpc3RfZGVsX2luaXQoJmUtPmxpc3QpOworCQllLT5kZW50cnkgPSBOVUxMOworCX0KKwl3cml0ZV91bmxvY2soJmVudHJpZXNfbG9jayk7CisKKwlpZiAoZGVudHJ5KSB7CisJCWRlbnRyeS0+ZF9pbm9kZS0+aV9ubGluay0tOworCQlkX2Ryb3AoZGVudHJ5KTsKKwkJZHB1dChkZW50cnkpOworCQlzaW1wbGVfcmVsZWFzZV9mcygmYm1fbW50LCAmZW50cnlfY291bnQpOworCX0KK30KKworLyogLzxlbnRyeT4gKi8KKworc3RhdGljIHNzaXplX3QKK2JtX2VudHJ5X3JlYWQoc3RydWN0IGZpbGUgKiBmaWxlLCBjaGFyIF9fdXNlciAqIGJ1Ziwgc2l6ZV90IG5ieXRlcywgbG9mZl90ICpwcG9zKQoreworCU5vZGUgKmUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+dS5nZW5lcmljX2lwOworCWxvZmZfdCBwb3MgPSAqcHBvczsKKwlzc2l6ZV90IHJlczsKKwljaGFyICpwYWdlOworCWludCBsZW47CisKKwlpZiAoIShwYWdlID0gKGNoYXIqKSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCkpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVudHJ5X3N0YXR1cyhlLCBwYWdlKTsKKwlsZW4gPSBzdHJsZW4ocGFnZSk7CisKKwlyZXMgPSAtRUlOVkFMOworCWlmIChwb3MgPCAwKQorCQlnb3RvIG91dDsKKwlyZXMgPSAwOworCWlmIChwb3MgPj0gbGVuKQorCQlnb3RvIG91dDsKKwlpZiAobGVuIDwgcG9zICsgbmJ5dGVzKQorCQluYnl0ZXMgPSBsZW4gLSBwb3M7CisJcmVzID0gLUVGQVVMVDsKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgcGFnZSArIHBvcywgbmJ5dGVzKSkKKwkJZ290byBvdXQ7CisJKnBwb3MgPSBwb3MgKyBuYnl0ZXM7CisJcmVzID0gbmJ5dGVzOworb3V0OgorCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgcGFnZSk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHNzaXplX3QgYm1fZW50cnlfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGRlbnRyeSAqcm9vdDsKKwlOb2RlICplID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPnUuZ2VuZXJpY19pcDsKKwlpbnQgcmVzID0gcGFyc2VfY29tbWFuZChidWZmZXIsIGNvdW50KTsKKworCXN3aXRjaCAocmVzKSB7CisJCWNhc2UgMTogY2xlYXJfYml0KEVuYWJsZWQsICZlLT5mbGFncyk7CisJCQlicmVhazsKKwkJY2FzZSAyOiBzZXRfYml0KEVuYWJsZWQsICZlLT5mbGFncyk7CisJCQlicmVhazsKKwkJY2FzZSAzOiByb290ID0gZGdldChmaWxlLT5mX3Zmc21udC0+bW50X3NiLT5zX3Jvb3QpOworCQkJZG93bigmcm9vdC0+ZF9pbm9kZS0+aV9zZW0pOworCisJCQlraWxsX25vZGUoZSk7CisKKwkJCXVwKCZyb290LT5kX2lub2RlLT5pX3NlbSk7CisJCQlkcHV0KHJvb3QpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6IHJldHVybiByZXM7CisJfQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYm1fZW50cnlfb3BlcmF0aW9ucyA9IHsKKwkucmVhZAkJPSBibV9lbnRyeV9yZWFkLAorCS53cml0ZQkJPSBibV9lbnRyeV93cml0ZSwKK307CisKKy8qIC9yZWdpc3RlciAqLworCitzdGF0aWMgc3NpemVfdCBibV9yZWdpc3Rlcl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlOb2RlICplOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGRlbnRyeSAqcm9vdCwgKmRlbnRyeTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZmlsZS0+Zl92ZnNtbnQtPm1udF9zYjsKKwlpbnQgZXJyID0gMDsKKworCWUgPSBjcmVhdGVfZW50cnkoYnVmZmVyLCBjb3VudCk7CisKKwlpZiAoSVNfRVJSKGUpKQorCQlyZXR1cm4gUFRSX0VSUihlKTsKKworCXJvb3QgPSBkZ2V0KHNiLT5zX3Jvb3QpOworCWRvd24oJnJvb3QtPmRfaW5vZGUtPmlfc2VtKTsKKwlkZW50cnkgPSBsb29rdXBfb25lX2xlbihlLT5uYW1lLCByb290LCBzdHJsZW4oZS0+bmFtZSkpOworCWVyciA9IFBUUl9FUlIoZGVudHJ5KTsKKwlpZiAoSVNfRVJSKGRlbnRyeSkpCisJCWdvdG8gb3V0OworCisJZXJyID0gLUVFWElTVDsKKwlpZiAoZGVudHJ5LT5kX2lub2RlKQorCQlnb3RvIG91dDI7CisKKwlpbm9kZSA9IGJtX2dldF9pbm9kZShzYiwgU19JRlJFRyB8IDA2NDQpOworCisJZXJyID0gLUVOT01FTTsKKwlpZiAoIWlub2RlKQorCQlnb3RvIG91dDI7CisKKwllcnIgPSBzaW1wbGVfcGluX2ZzKCJiaW5mbXRfbWlzYyIsICZibV9tbnQsICZlbnRyeV9jb3VudCk7CisJaWYgKGVycikgeworCQlpcHV0KGlub2RlKTsKKwkJaW5vZGUgPSBOVUxMOworCQlnb3RvIG91dDI7CisJfQorCisJZS0+ZGVudHJ5ID0gZGdldChkZW50cnkpOworCWlub2RlLT51LmdlbmVyaWNfaXAgPSBlOworCWlub2RlLT5pX2ZvcCA9ICZibV9lbnRyeV9vcGVyYXRpb25zOworCisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwl3cml0ZV9sb2NrKCZlbnRyaWVzX2xvY2spOworCWxpc3RfYWRkKCZlLT5saXN0LCAmZW50cmllcyk7CisJd3JpdGVfdW5sb2NrKCZlbnRyaWVzX2xvY2spOworCisJZXJyID0gMDsKK291dDI6CisJZHB1dChkZW50cnkpOworb3V0OgorCXVwKCZyb290LT5kX2lub2RlLT5pX3NlbSk7CisJZHB1dChyb290KTsKKworCWlmIChlcnIpIHsKKwkJa2ZyZWUoZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJtX3JlZ2lzdGVyX29wZXJhdGlvbnMgPSB7CisJLndyaXRlCQk9IGJtX3JlZ2lzdGVyX3dyaXRlLAorfTsKKworLyogL3N0YXR1cyAqLworCitzdGF0aWMgc3NpemVfdAorYm1fc3RhdHVzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyICpzID0gZW5hYmxlZCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCI7CisJaW50IGxlbiA9IHN0cmxlbihzKTsKKwlsb2ZmX3QgcG9zID0gKnBwb3M7CisKKwlpZiAocG9zIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHBvcyA+PSBsZW4pCisJCXJldHVybiAwOworCWlmIChsZW4gPCBwb3MgKyBuYnl0ZXMpCisJCW5ieXRlcyA9IGxlbiAtIHBvczsKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgcyArIHBvcywgbmJ5dGVzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJKnBwb3MgPSBwb3MgKyBuYnl0ZXM7CisJcmV0dXJuIG5ieXRlczsKK30KKworc3RhdGljIHNzaXplX3QgYm1fc3RhdHVzX3dyaXRlKHN0cnVjdCBmaWxlICogZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCisJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWludCByZXMgPSBwYXJzZV9jb21tYW5kKGJ1ZmZlciwgY291bnQpOworCXN0cnVjdCBkZW50cnkgKnJvb3Q7CisKKwlzd2l0Y2ggKHJlcykgeworCQljYXNlIDE6IGVuYWJsZWQgPSAwOyBicmVhazsKKwkJY2FzZSAyOiBlbmFibGVkID0gMTsgYnJlYWs7CisJCWNhc2UgMzogcm9vdCA9IGRnZXQoZmlsZS0+Zl92ZnNtbnQtPm1udF9zYi0+c19yb290KTsKKwkJCWRvd24oJnJvb3QtPmRfaW5vZGUtPmlfc2VtKTsKKworCQkJd2hpbGUgKCFsaXN0X2VtcHR5KCZlbnRyaWVzKSkKKwkJCQlraWxsX25vZGUobGlzdF9lbnRyeShlbnRyaWVzLm5leHQsIE5vZGUsIGxpc3QpKTsKKworCQkJdXAoJnJvb3QtPmRfaW5vZGUtPmlfc2VtKTsKKwkJCWRwdXQocm9vdCk7CisJCWRlZmF1bHQ6IHJldHVybiByZXM7CisJfQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYm1fc3RhdHVzX29wZXJhdGlvbnMgPSB7CisJLnJlYWQJCT0gYm1fc3RhdHVzX3JlYWQsCisJLndyaXRlCQk9IGJtX3N0YXR1c193cml0ZSwKK307CisKKy8qIFN1cGVyYmxvY2sgaGFuZGxpbmcgKi8KKworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHNfb3BzID0geworCS5zdGF0ZnMJCT0gc2ltcGxlX3N0YXRmcywKKwkuY2xlYXJfaW5vZGUJPSBibV9jbGVhcl9pbm9kZSwKK307CisKK3N0YXRpYyBpbnQgYm1fZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgdm9pZCAqIGRhdGEsIGludCBzaWxlbnQpCit7CisJc3RhdGljIHN0cnVjdCB0cmVlX2Rlc2NyIGJtX2ZpbGVzW10gPSB7CisJCVsxXSA9IHsic3RhdHVzIiwgJmJtX3N0YXR1c19vcGVyYXRpb25zLCBTX0lXVVNSfFNfSVJVR099LAorCQlbMl0gPSB7InJlZ2lzdGVyIiwgJmJtX3JlZ2lzdGVyX29wZXJhdGlvbnMsIFNfSVdVU1J9LAorCQkvKiBsYXN0IG9uZSAqLyB7IiJ9CisJfTsKKwlpbnQgZXJyID0gc2ltcGxlX2ZpbGxfc3VwZXIoc2IsIDB4NDI0OTRlNGQsIGJtX2ZpbGVzKTsKKwlpZiAoIWVycikKKwkJc2ItPnNfb3AgPSAmc19vcHM7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqYm1fZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9zaW5nbGUoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIGJtX2ZpbGxfc3VwZXIpOworfQorCitzdGF0aWMgc3RydWN0IGxpbnV4X2JpbmZtdCBtaXNjX2Zvcm1hdCA9IHsKKwkubW9kdWxlID0gVEhJU19NT0RVTEUsCisJLmxvYWRfYmluYXJ5ID0gbG9hZF9taXNjX2JpbmFyeSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBibV9mc190eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiYmluZm10X21pc2MiLAorCS5nZXRfc2IJCT0gYm1fZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9saXR0ZXJfc3VwZXIsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X21pc2NfYmluZm10KHZvaWQpCit7CisJaW50IGVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmJtX2ZzX3R5cGUpOworCWlmICghZXJyKSB7CisJCWVyciA9IHJlZ2lzdGVyX2JpbmZtdCgmbWlzY19mb3JtYXQpOworCQlpZiAoZXJyKQorCQkJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZibV9mc190eXBlKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbWlzY19iaW5mbXQodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2JpbmZtdCgmbWlzY19mb3JtYXQpOworCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmYm1fZnNfdHlwZSk7Cit9CisKK2NvcmVfaW5pdGNhbGwoaW5pdF9taXNjX2JpbmZtdCk7Cittb2R1bGVfZXhpdChleGl0X21pc2NfYmluZm10KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL2JpbmZtdF9zY3JpcHQuYyBiL2ZzL2JpbmZtdF9zY3JpcHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWRiY2NhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYmluZm10X3NjcmlwdC5jCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogIGxpbnV4L2ZzL2JpbmZtdF9zY3JpcHQuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTYgIE1hcnRpbiB2b24gTPZ3aXMKKyAqICBvcmlnaW5hbCAjIS1jaGVja2luZyBpbXBsZW1lbnRlZCBieSB0eXRzby4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9iaW5mbXRzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisKK3N0YXRpYyBpbnQgbG9hZF9zY3JpcHQoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSxzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwljaGFyICpjcCwgKmlfbmFtZSwgKmlfYXJnOworCXN0cnVjdCBmaWxlICpmaWxlOworCWNoYXIgaW50ZXJwW0JJTlBSTV9CVUZfU0laRV07CisJaW50IHJldHZhbDsKKworCWlmICgoYnBybS0+YnVmWzBdICE9ICcjJykgfHwgKGJwcm0tPmJ1ZlsxXSAhPSAnIScpIHx8IChicHJtLT5zaF9iYW5nKSkgCisJCXJldHVybiAtRU5PRVhFQzsKKwkvKgorCSAqIFRoaXMgc2VjdGlvbiBkb2VzIHRoZSAjISBpbnRlcnByZXRhdGlvbi4KKwkgKiBTb3J0YSBjb21wbGljYXRlZCwgYnV0IGhvcGVmdWxseSBpdCB3aWxsIHdvcmsuICAtVFlUCisJICovCisKKwlicHJtLT5zaF9iYW5nKys7CisJYWxsb3dfd3JpdGVfYWNjZXNzKGJwcm0tPmZpbGUpOworCWZwdXQoYnBybS0+ZmlsZSk7CisJYnBybS0+ZmlsZSA9IE5VTEw7CisKKwlicHJtLT5idWZbQklOUFJNX0JVRl9TSVpFIC0gMV0gPSAnXDAnOworCWlmICgoY3AgPSBzdHJjaHIoYnBybS0+YnVmLCAnXG4nKSkgPT0gTlVMTCkKKwkJY3AgPSBicHJtLT5idWYrQklOUFJNX0JVRl9TSVpFLTE7CisJKmNwID0gJ1wwJzsKKwl3aGlsZSAoY3AgPiBicHJtLT5idWYpIHsKKwkJY3AtLTsKKwkJaWYgKCgqY3AgPT0gJyAnKSB8fCAoKmNwID09ICdcdCcpKQorCQkJKmNwID0gJ1wwJzsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCWZvciAoY3AgPSBicHJtLT5idWYrMjsgKCpjcCA9PSAnICcpIHx8ICgqY3AgPT0gJ1x0Jyk7IGNwKyspOworCWlmICgqY3AgPT0gJ1wwJykgCisJCXJldHVybiAtRU5PRVhFQzsgLyogTm8gaW50ZXJwcmV0ZXIgbmFtZSBmb3VuZCAqLworCWlfbmFtZSA9IGNwOworCWlfYXJnID0gTlVMTDsKKwlmb3IgKCA7ICpjcCAmJiAoKmNwICE9ICcgJykgJiYgKCpjcCAhPSAnXHQnKTsgY3ArKykKKwkJLyogbm90aGluZyAqLyA7CisJd2hpbGUgKCgqY3AgPT0gJyAnKSB8fCAoKmNwID09ICdcdCcpKQorCQkqY3ArKyA9ICdcMCc7CisJaWYgKCpjcCkKKwkJaV9hcmcgPSBjcDsKKwlzdHJjcHkgKGludGVycCwgaV9uYW1lKTsKKwkvKgorCSAqIE9LLCB3ZSd2ZSBwYXJzZWQgb3V0IHRoZSBpbnRlcnByZXRlciBuYW1lIGFuZAorCSAqIChvcHRpb25hbCkgYXJndW1lbnQuCisJICogU3BsaWNlIGluICgxKSB0aGUgaW50ZXJwcmV0ZXIncyBuYW1lIGZvciBhcmd2WzBdCisJICogICAgICAgICAgICgyKSAob3B0aW9uYWwpIGFyZ3VtZW50IHRvIGludGVycHJldGVyCisJICogICAgICAgICAgICgzKSBmaWxlbmFtZSBvZiBzaGVsbCBzY3JpcHQgKHJlcGxhY2UgYXJndlswXSkKKwkgKgorCSAqIFRoaXMgaXMgZG9uZSBpbiByZXZlcnNlIG9yZGVyLCBiZWNhdXNlIG9mIGhvdyB0aGUKKwkgKiB1c2VyIGVudmlyb25tZW50IGFuZCBhcmd1bWVudHMgYXJlIHN0b3JlZC4KKwkgKi8KKwlyZW1vdmVfYXJnX3plcm8oYnBybSk7CisJcmV0dmFsID0gY29weV9zdHJpbmdzX2tlcm5lbCgxLCAmYnBybS0+aW50ZXJwLCBicHJtKTsKKwlpZiAocmV0dmFsIDwgMCkgcmV0dXJuIHJldHZhbDsgCisJYnBybS0+YXJnYysrOworCWlmIChpX2FyZykgeworCQlyZXR2YWwgPSBjb3B5X3N0cmluZ3Nfa2VybmVsKDEsICZpX2FyZywgYnBybSk7CisJCWlmIChyZXR2YWwgPCAwKSByZXR1cm4gcmV0dmFsOyAKKwkJYnBybS0+YXJnYysrOworCX0KKwlyZXR2YWwgPSBjb3B5X3N0cmluZ3Nfa2VybmVsKDEsICZpX25hbWUsIGJwcm0pOworCWlmIChyZXR2YWwpIHJldHVybiByZXR2YWw7IAorCWJwcm0tPmFyZ2MrKzsKKwlicHJtLT5pbnRlcnAgPSBpbnRlcnA7CisKKwkvKgorCSAqIE9LLCBub3cgcmVzdGFydCB0aGUgcHJvY2VzcyB3aXRoIHRoZSBpbnRlcnByZXRlcidzIGRlbnRyeS4KKwkgKi8KKwlmaWxlID0gb3Blbl9leGVjKGludGVycCk7CisJaWYgKElTX0VSUihmaWxlKSkKKwkJcmV0dXJuIFBUUl9FUlIoZmlsZSk7CisKKwlicHJtLT5maWxlID0gZmlsZTsKKwlyZXR2YWwgPSBwcmVwYXJlX2JpbnBybShicHJtKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKwlyZXR1cm4gc2VhcmNoX2JpbmFyeV9oYW5kbGVyKGJwcm0scmVncyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbGludXhfYmluZm10IHNjcmlwdF9mb3JtYXQgPSB7CisJLm1vZHVsZQkJPSBUSElTX01PRFVMRSwKKwkubG9hZF9iaW5hcnkJPSBsb2FkX3NjcmlwdCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfc2NyaXB0X2JpbmZtdCh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9iaW5mbXQoJnNjcmlwdF9mb3JtYXQpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9zY3JpcHRfYmluZm10KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9iaW5mbXQoJnNjcmlwdF9mb3JtYXQpOworfQorCitjb3JlX2luaXRjYWxsKGluaXRfc2NyaXB0X2JpbmZtdCk7Cittb2R1bGVfZXhpdChleGl0X3NjcmlwdF9iaW5mbXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvYmluZm10X3NvbS5jIGIvZnMvYmluZm10X3NvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyN2EyNjgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9iaW5mbXRfc29tLmMKQEAgLTAsMCArMSwzMDkgQEAKKy8qCisgKiBsaW51eC9mcy9iaW5mbXRfc29tLmMKKyAqCisgKiBUaGVzZSBhcmUgdGhlIGZ1bmN0aW9ucyB1c2VkIHRvIGxvYWQgU09NIGZvcm1hdCBleGVjdXRhYmxlcyBhcyB1c2VkCisgKiBieSBIUC1VWC4gIAorICoKKyAqIENvcHlyaWdodCAxOTk5IE1hdHRoZXcgV2lsY294IDx3aWxseUBib2ZoLmFpPgorICogYmFzZWQgb24gYmluZm10X2VsZiB3aGljaCBpcworICogQ29weXJpZ2h0IDE5OTMsIDE5OTQ6IEVyaWMgWW91bmdkYWxlIChlcmljeUBjYWlzLmNvbSkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpbmZtdHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb20uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc2htLmg+CisjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgorCitzdGF0aWMgaW50IGxvYWRfc29tX2JpbmFyeShzdHJ1Y3QgbGludXhfYmlucHJtICogYnBybSwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKTsKK3N0YXRpYyBpbnQgbG9hZF9zb21fbGlicmFyeShzdHJ1Y3QgZmlsZSAqKTsKKworLyoKKyAqIElmIHdlIGRvbid0IHN1cHBvcnQgY29yZSBkdW1waW5nLCB0aGVuIHN1cHBseSBhIE5VTEwgc28gd2UKKyAqIGRvbid0IGV2ZW4gdHJ5LgorICovCisjaWYgMAorc3RhdGljIGludCBzb21fY29yZV9kdW1wKGxvbmcgc2lnbnIsIHN0cnVjdCBwdF9yZWdzICogcmVncyk7CisjZWxzZQorI2RlZmluZSBzb21fY29yZV9kdW1wCU5VTEwKKyNlbmRpZgorCisjZGVmaW5lIFNPTV9QQUdFU1RBUlQoX3YpICgoX3YpICYgfih1bnNpZ25lZCBsb25nKShTT01fUEFHRVNJWkUtMSkpCisjZGVmaW5lIFNPTV9QQUdFT0ZGU0VUKF92KSAoKF92KSAmIChTT01fUEFHRVNJWkUtMSkpCisjZGVmaW5lIFNPTV9QQUdFQUxJR04oX3YpICgoKF92KSArIFNPTV9QQUdFU0laRSAtIDEpICYgfihTT01fUEFHRVNJWkUgLSAxKSkKKworc3RhdGljIHN0cnVjdCBsaW51eF9iaW5mbXQgc29tX2Zvcm1hdCA9IHsKKwkubW9kdWxlCQk9IFRISVNfTU9EVUxFLAorCS5sb2FkX2JpbmFyeQk9IGxvYWRfc29tX2JpbmFyeSwKKwkubG9hZF9zaGxpYgk9IGxvYWRfc29tX2xpYnJhcnksCisJLmNvcmVfZHVtcAk9IHNvbV9jb3JlX2R1bXAsCisJLm1pbl9jb3JlZHVtcAk9IFNPTV9QQUdFU0laRQorfTsKKworLyoKKyAqIGNyZWF0ZV9zb21fdGFibGVzKCkgcGFyc2VzIHRoZSBlbnYtIGFuZCBhcmctc3RyaW5ncyBpbiBuZXcgdXNlcgorICogbWVtb3J5IGFuZCBjcmVhdGVzIHRoZSBwb2ludGVyIHRhYmxlcyBmcm9tIHRoZW0sIGFuZCBwdXRzIHRoZWlyCisgKiBhZGRyZXNzZXMgb24gdGhlICJzdGFjayIsIHJldHVybmluZyB0aGUgbmV3IHN0YWNrIHBvaW50ZXIgdmFsdWUuCisgKi8KK3N0YXRpYyB2b2lkIGNyZWF0ZV9zb21fdGFibGVzKHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pCit7CisJY2hhciAqKmFyZ3YsICoqZW52cDsKKwlpbnQgYXJnYyA9IGJwcm0tPmFyZ2M7CisJaW50IGVudmMgPSBicHJtLT5lbnZjOworCXVuc2lnbmVkIGxvbmcgcDsKKwl1bnNpZ25lZCBsb25nICpzcDsKKworCS8qIFdvcmQtYWxpZ24gdGhlIHN0YWNrIHBvaW50ZXIgKi8KKwlzcCA9ICh1bnNpZ25lZCBsb25nICopKChicHJtLT5wICsgMykgJiB+Myk7CisKKwllbnZwID0gKGNoYXIgKiopIHNwOworCXNwICs9IGVudmMgKyAxOworCWFyZ3YgPSAoY2hhciAqKikgc3A7CisJc3AgKz0gYXJnYyArIDE7CisKKwlfX3B1dF91c2VyKCh1bnNpZ25lZCBsb25nKSBlbnZwLCsrc3ApOworCV9fcHV0X3VzZXIoKHVuc2lnbmVkIGxvbmcpIGFyZ3YsKytzcCk7CisKKwlfX3B1dF91c2VyKGFyZ2MsICsrc3ApOworCisJYnBybS0+cCA9ICh1bnNpZ25lZCBsb25nKSBzcDsKKworCXAgPSBjdXJyZW50LT5tbS0+YXJnX3N0YXJ0OworCXdoaWxlIChhcmdjLS0gPiAwKSB7CisJCV9fcHV0X3VzZXIoKGNoYXIgKilwLGFyZ3YrKyk7CisJCXAgKz0gc3RybGVuX3VzZXIoKGNoYXIgKilwKTsKKwl9CisJX19wdXRfdXNlcihOVUxMLCBhcmd2KTsKKwljdXJyZW50LT5tbS0+YXJnX2VuZCA9IGN1cnJlbnQtPm1tLT5lbnZfc3RhcnQgPSBwOworCXdoaWxlIChlbnZjLS0gPiAwKSB7CisJCV9fcHV0X3VzZXIoKGNoYXIgKilwLGVudnArKyk7CisJCXAgKz0gc3RybGVuX3VzZXIoKGNoYXIgKilwKTsKKwl9CisJX19wdXRfdXNlcihOVUxMLCBlbnZwKTsKKwljdXJyZW50LT5tbS0+ZW52X2VuZCA9IHA7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfc29tX2hlYWRlcihzdHJ1Y3Qgc29tX2hkciAqc29tX2V4KQoreworCWludCAqYnVmID0gKGludCAqKXNvbV9leDsKKwlpbnQgaSwgY2s7CisKKwlpZiAoc29tX2V4LT5zeXN0ZW1faWQgIT0gU09NX1NJRF9QQVJJU0NfMV8wICYmCisJICAgIHNvbV9leC0+c3lzdGVtX2lkICE9IFNPTV9TSURfUEFSSVNDXzFfMSAmJgorCSAgICBzb21fZXgtPnN5c3RlbV9pZCAhPSBTT01fU0lEX1BBUklTQ18yXzApCisJCXJldHVybiAtRU5PRVhFQzsKKworCWlmIChzb21fZXgtPmFfbWFnaWMgIT0gU09NX0VYRUNfTk9OU0hBUkUgJiYKKwkgICAgc29tX2V4LT5hX21hZ2ljICE9IFNPTV9FWEVDX1NIQVJFICYmCisJICAgIHNvbV9leC0+YV9tYWdpYyAhPSBTT01fRVhFQ19ERU1BTkQpCisJCXJldHVybiAtRU5PRVhFQzsKKworCWlmIChzb21fZXgtPnZlcnNpb25faWQgIT0gU09NX0lEX09MRCAmJgorCSAgICBzb21fZXgtPnZlcnNpb25faWQgIT0gU09NX0lEX05FVykKKwkJcmV0dXJuIC1FTk9FWEVDOworCisJY2sgPSAwOworCWZvciAoaT0wOyBpPDMyOyBpKyspCisJCWNrIF49IGJ1ZltpXTsKKwlpZiAoY2sgIT0gMCkKKwkJcmV0dXJuIC1FTk9FWEVDOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFwX3NvbV9iaW5hcnkoc3RydWN0IGZpbGUgKmZpbGUsCisJCWNvbnN0IHN0cnVjdCBzb21fZXhlY19hdXhoZHIgKmhwdXhoZHIpCit7CisJdW5zaWduZWQgbG9uZyBjb2RlX3N0YXJ0LCBjb2RlX3NpemUsIGRhdGFfc3RhcnQsIGRhdGFfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGJzc19zdGFydCwgc29tX2JyazsKKwlpbnQgcmV0dmFsOworCWludCBwcm90ID0gUFJPVF9SRUFEIHwgUFJPVF9FWEVDOworCWludCBmbGFncyA9IE1BUF9GSVhFRHxNQVBfUFJJVkFURXxNQVBfREVOWVdSSVRFfE1BUF9FWEVDVVRBQkxFOworCisJbW1fc2VnbWVudF90IG9sZF9mcyA9IGdldF9mcygpOworCXNldF9mcyhnZXRfZHMoKSk7CisKKwljb2RlX3N0YXJ0ID0gU09NX1BBR0VTVEFSVChocHV4aGRyLT5leGVjX3RtZW0pOworCWNvZGVfc2l6ZSA9IFNPTV9QQUdFQUxJR04oaHB1eGhkci0+ZXhlY190c2l6ZSk7CisJY3VycmVudC0+bW0tPnN0YXJ0X2NvZGUgPSBjb2RlX3N0YXJ0OworCWN1cnJlbnQtPm1tLT5lbmRfY29kZSA9IGNvZGVfc3RhcnQgKyBjb2RlX3NpemU7CisJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwlyZXR2YWwgPSBkb19tbWFwKGZpbGUsIGNvZGVfc3RhcnQsIGNvZGVfc2l6ZSwgcHJvdCwKKwkJCWZsYWdzLCBTT01fUEFHRVNUQVJUKGhwdXhoZHItPmV4ZWNfdGZpbGUpKTsKKwl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwlpZiAocmV0dmFsIDwgMCAmJiByZXR2YWwgPiAtMTAyNCkKKwkJZ290byBvdXQ7CisKKwlkYXRhX3N0YXJ0ID0gU09NX1BBR0VTVEFSVChocHV4aGRyLT5leGVjX2RtZW0pOworCWRhdGFfc2l6ZSA9IFNPTV9QQUdFQUxJR04oaHB1eGhkci0+ZXhlY19kc2l6ZSk7CisJY3VycmVudC0+bW0tPnN0YXJ0X2RhdGEgPSBkYXRhX3N0YXJ0OworCWN1cnJlbnQtPm1tLT5lbmRfZGF0YSA9IGJzc19zdGFydCA9IGRhdGFfc3RhcnQgKyBkYXRhX3NpemU7CisJZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwlyZXR2YWwgPSBkb19tbWFwKGZpbGUsIGRhdGFfc3RhcnQsIGRhdGFfc2l6ZSwKKwkJCXByb3QgfCBQUk9UX1dSSVRFLCBmbGFncywKKwkJCVNPTV9QQUdFU1RBUlQoaHB1eGhkci0+ZXhlY19kZmlsZSkpOworCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCWlmIChyZXR2YWwgPCAwICYmIHJldHZhbCA+IC0xMDI0KQorCQlnb3RvIG91dDsKKworCXNvbV9icmsgPSBic3Nfc3RhcnQgKyBTT01fUEFHRUFMSUdOKGhwdXhoZHItPmV4ZWNfYnNpemUpOworCWN1cnJlbnQtPm1tLT5zdGFydF9icmsgPSBjdXJyZW50LT5tbS0+YnJrID0gc29tX2JyazsKKwlkb3duX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCXJldHZhbCA9IGRvX21tYXAoTlVMTCwgYnNzX3N0YXJ0LCBzb21fYnJrIC0gYnNzX3N0YXJ0LAorCQkJcHJvdCB8IFBST1RfV1JJVEUsIE1BUF9GSVhFRCB8IE1BUF9QUklWQVRFLCAwKTsKKwl1cF93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwlpZiAocmV0dmFsID4gMCB8fCByZXR2YWwgPCAtMTAyNCkKKwkJcmV0dmFsID0gMDsKK291dDoKKwlzZXRfZnMob2xkX2ZzKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIGZ1bmN0aW9ucyB1c2VkIHRvIGxvYWQgU09NIGV4ZWN1dGFibGVzIGFuZCBzaGFyZWQKKyAqIGxpYnJhcmllcy4gIFRoZXJlIGlzIG5vIGJpbmFyeSBkZXBlbmRlbnQgY29kZSBhbnl3aGVyZSBlbHNlLgorICovCisKK3N0YXRpYyBpbnQKK2xvYWRfc29tX2JpbmFyeShzdHJ1Y3QgbGludXhfYmlucHJtICogYnBybSwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCWludCBzb21fZXhlY19maWxlbm87CisJaW50IHJldHZhbDsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHNvbV9lbnRyeTsKKwlzdHJ1Y3Qgc29tX2hkciAqc29tX2V4OworCXN0cnVjdCBzb21fZXhlY19hdXhoZHIgKmhwdXhoZHI7CisKKwkvKiBHZXQgdGhlIGV4ZWMtaGVhZGVyICovCisJc29tX2V4ID0gKHN0cnVjdCBzb21faGRyICopIGJwcm0tPmJ1ZjsKKworCXJldHZhbCA9IGNoZWNrX3NvbV9oZWFkZXIoc29tX2V4KTsKKwlpZiAocmV0dmFsICE9IDApCisJCWdvdG8gb3V0OworCisJLyogTm93IHJlYWQgaW4gdGhlIGF1eGlsaWFyeSBoZWFkZXIgaW5mb3JtYXRpb24gKi8KKworCXJldHZhbCA9IC1FTk9NRU07CisJc2l6ZSA9IHNvbV9leC0+YXV4X2hlYWRlcl9zaXplOworCWlmIChzaXplID4gU09NX1BBR0VTSVpFKQorCQlnb3RvIG91dDsKKwlocHV4aGRyID0gKHN0cnVjdCBzb21fZXhlY19hdXhoZHIgKikga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhwdXhoZHIpCisJCWdvdG8gb3V0OworCisJcmV0dmFsID0ga2VybmVsX3JlYWQoYnBybS0+ZmlsZSwgc29tX2V4LT5hdXhfaGVhZGVyX2xvY2F0aW9uLAorCQkJKGNoYXIgKikgaHB1eGhkciwgc2l6ZSk7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisjZXJyb3IgIkZpeCBzZWN1cml0eSBob2xlIGJlZm9yZSBlbmFibGluZyBtZSIKKwlyZXR2YWwgPSBnZXRfdW51c2VkX2ZkKCk7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisJZ2V0X2ZpbGUoYnBybS0+ZmlsZSk7CisJZmRfaW5zdGFsbChzb21fZXhlY19maWxlbm8gPSByZXR2YWwsIGJwcm0tPmZpbGUpOworCisJLyogRmx1c2ggYWxsIHRyYWNlcyBvZiB0aGUgY3VycmVudGx5IHJ1bm5pbmcgZXhlY3V0YWJsZSAqLworCXJldHZhbCA9IGZsdXNoX29sZF9leGVjKGJwcm0pOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwkvKiBPSywgVGhpcyBpcyB0aGUgcG9pbnQgb2Ygbm8gcmV0dXJuICovCisJY3VycmVudC0+ZmxhZ3MgJj0gflBGX0ZPUktOT0VYRUM7CisJY3VycmVudC0+cGVyc29uYWxpdHkgPSBQRVJfSFBVWDsKKworCS8qIFNldCB0aGUgdGFzayBzaXplIGZvciBIUC1VWCBwcm9jZXNzZXMgc3VjaCB0aGF0CisJICogdGhlIGdhdGV3YXkgcGFnZSBpcyBvdXRzaWRlIHRoZSBhZGRyZXNzIHNwYWNlLgorCSAqIFRoaXMgY2FuIGJlIGZpeGVkIGxhdGVyLCBidXQgZm9yIG5vdywgdGhpcyBpcyBtdWNoCisJICogZWFzaWVyLgorCSAqLworCisJY3VycmVudC0+dGhyZWFkLnRhc2tfc2l6ZSA9IDB4YzAwMDAwMDA7CisKKwkvKiBTZXQgbWFwIGJhc2UgdG8gYWxsb3cgZW5vdWdoIHJvb20gZm9yIGhwLXV4IGhlYXAgZ3Jvd3RoICovCisKKwljdXJyZW50LT50aHJlYWQubWFwX2Jhc2UgPSAweDgwMDAwMDAwOworCisJcmV0dmFsID0gbWFwX3NvbV9iaW5hcnkoYnBybS0+ZmlsZSwgaHB1eGhkcik7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlzb21fZW50cnkgPSBocHV4aGRyLT5leGVjX2VudHJ5OworCWtmcmVlKGhwdXhoZHIpOworCisJc2V0X2JpbmZtdCgmc29tX2Zvcm1hdCk7CisJY29tcHV0ZV9jcmVkcyhicHJtKTsKKwlzZXR1cF9hcmdfcGFnZXMoYnBybSwgU1RBQ0tfVE9QLCBFWFNUQUNLX0RFRkFVTFQpOworCisJY3JlYXRlX3NvbV90YWJsZXMoYnBybSk7CisKKwljdXJyZW50LT5tbS0+c3RhcnRfc3RhY2sgPSBicHJtLT5wOworCXNldF9tbV9jb3VudGVyKGN1cnJlbnQtPm1tLCByc3MsIDApOworCisjaWYgMAorCXByaW50aygiKHN0YXJ0X2JyaykgJTA4bHhcbiIgLCAodW5zaWduZWQgbG9uZykgY3VycmVudC0+bW0tPnN0YXJ0X2Jyayk7CisJcHJpbnRrKCIoZW5kX2NvZGUpICUwOGx4XG4iICwgKHVuc2lnbmVkIGxvbmcpIGN1cnJlbnQtPm1tLT5lbmRfY29kZSk7CisJcHJpbnRrKCIoc3RhcnRfY29kZSkgJTA4bHhcbiIgLCAodW5zaWduZWQgbG9uZykgY3VycmVudC0+bW0tPnN0YXJ0X2NvZGUpOworCXByaW50aygiKGVuZF9kYXRhKSAlMDhseFxuIiAsICh1bnNpZ25lZCBsb25nKSBjdXJyZW50LT5tbS0+ZW5kX2RhdGEpOworCXByaW50aygiKHN0YXJ0X3N0YWNrKSAlMDhseFxuIiAsICh1bnNpZ25lZCBsb25nKSBjdXJyZW50LT5tbS0+c3RhcnRfc3RhY2spOworCXByaW50aygiKGJyaykgJTA4bHhcbiIgLCAodW5zaWduZWQgbG9uZykgY3VycmVudC0+bW0tPmJyayk7CisjZW5kaWYKKworCW1hcF9ocHV4X2dhdGV3YXlfcGFnZShjdXJyZW50LGN1cnJlbnQtPm1tKTsKKworCXN0YXJ0X3RocmVhZF9zb20ocmVncywgc29tX2VudHJ5LCBicHJtLT5wKTsKKwlpZiAoY3VycmVudC0+cHRyYWNlICYgUFRfUFRSQUNFRCkKKwkJc2VuZF9zaWcoU0lHVFJBUCwgY3VycmVudCwgMCk7CisJcmV0dXJuIDA7CisKKwkvKiBlcnJvciBjbGVhbnVwICovCitvdXRfZnJlZToKKwlrZnJlZShocHV4aGRyKTsKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGxvYWRfc29tX2xpYnJhcnkoc3RydWN0IGZpbGUgKmYpCit7CisvKiBObyBsaWIgc3VwcG9ydCBpbiBTT00geWV0LiAgZ2l6emEgY2hhbmNlLi4gKi8KKwlyZXR1cm4gLUVOT0VYRUM7Cit9CisJLyogSW5zdGFsbCB0aGUgU09NIGxvYWRlci4KKwkgKiBOLkIuIFdlICpyZWx5KiBvbiB0aGUgdGFibGUgYmVpbmcgdGhlIHJpZ2h0IHNpemUgd2l0aCB0aGUKKwkgKiByaWdodCBudW1iZXIgb2YgZnJlZSBzbG90cy4uLgorCSAqLworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3NvbV9iaW5mbXQodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfYmluZm10KCZzb21fZm9ybWF0KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfc29tX2JpbmZtdCh2b2lkKQoreworCS8qIFJlbW92ZSB0aGUgU09NIGxvYWRlci4gKi8KKwl1bnJlZ2lzdGVyX2JpbmZtdCgmc29tX2Zvcm1hdCk7Cit9CisKK2NvcmVfaW5pdGNhbGwoaW5pdF9zb21fYmluZm10KTsKK21vZHVsZV9leGl0KGV4aXRfc29tX2JpbmZtdCk7CmRpZmYgLS1naXQgYS9mcy9iaW8uYyBiL2ZzL2Jpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MzQ5ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9iaW8uYwpAQCAtMCwwICsxLDEwOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgSmVucyBBeGJvZSA8YXhib2VAc3VzZS5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VucworICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0KKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KKyNpbmNsdWRlIDxsaW51eC9iaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworI2RlZmluZSBCSU9fUE9PTF9TSVpFIDI1NgorCitzdGF0aWMga21lbV9jYWNoZV90ICpiaW9fc2xhYjsKKworI2RlZmluZSBCSU9WRUNfTlJfUE9PTFMgNgorCisvKgorICogYSBzbWFsbCBudW1iZXIgb2YgZW50cmllcyBpcyBmaW5lLCBub3QgZ29pbmcgdG8gYmUgcGVyZm9ybWFuY2UgY3JpdGljYWwuCisgKiBiYXNpY2FsbHkgd2UganVzdCBuZWVkIHRvIHN1cnZpdmUKKyAqLworI2RlZmluZSBCSU9fU1BMSVRfRU5UUklFUyA4CQorbWVtcG9vbF90ICpiaW9fc3BsaXRfcG9vbDsKKworc3RydWN0IGJpb3ZlY19zbGFiIHsKKwlpbnQgbnJfdmVjczsKKwljaGFyICpuYW1lOyAKKwlrbWVtX2NhY2hlX3QgKnNsYWI7Cit9OworCisvKgorICogaWYgeW91IGNoYW5nZSB0aGlzIGxpc3QsIGFsc28gY2hhbmdlIGJ2ZWNfYWxsb2Mgb3IgdGhpbmdzIHdpbGwKKyAqIGJyZWFrIGJhZGx5ISBjYW5ub3QgYmUgYmlnZ2VyIHRoYW4gd2hhdCB5b3UgY2FuIGZpdCBpbnRvIGFuCisgKiB1bnNpZ25lZCBzaG9ydAorICovCisKKyNkZWZpbmUgQlYoeCkgeyAubnJfdmVjcyA9IHgsIC5uYW1lID0gImJpb3ZlYy0iX19zdHJpbmdpZnkoeCkgfQorc3RhdGljIHN0cnVjdCBiaW92ZWNfc2xhYiBidmVjX3NsYWJzW0JJT1ZFQ19OUl9QT09MU10gPSB7CisJQlYoMSksIEJWKDQpLCBCVigxNiksIEJWKDY0KSwgQlYoMTI4KSwgQlYoQklPX01BWF9QQUdFUyksCit9OworI3VuZGVmIEJWCisKKy8qCisgKiBiaW9fc2V0IGlzIHVzZWQgdG8gYWxsb3cgb3RoZXIgcG9ydGlvbnMgb2YgdGhlIElPIHN5c3RlbSB0bworICogYWxsb2NhdGUgdGhlaXIgb3duIHByaXZhdGUgbWVtb3J5IHBvb2xzIGZvciBiaW8gYW5kIGlvdmVjIHN0cnVjdHVyZXMuCisgKiBUaGVzZSBtZW1vcnkgcG9vbHMgaW4gdHVybiBhbGwgYWxsb2NhdGUgZnJvbSB0aGUgYmlvX3NsYWIKKyAqIGFuZCB0aGUgYnZlY19zbGFic1tdLgorICovCitzdHJ1Y3QgYmlvX3NldCB7CisJbWVtcG9vbF90ICpiaW9fcG9vbDsKKwltZW1wb29sX3QgKmJ2ZWNfcG9vbHNbQklPVkVDX05SX1BPT0xTXTsKK307CisKKy8qCisgKiBmc19iaW9fc2V0IGlzIHRoZSBiaW9fc2V0IGNvbnRhaW5pbmcgYmlvIGFuZCBpb3ZlYyBtZW1vcnkgcG9vbHMgdXNlZCBieQorICogSU8gY29kZSB0aGF0IGRvZXMgbm90IG5lZWQgcHJpdmF0ZSBtZW1vcnkgcG9vbHMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYmlvX3NldCAqZnNfYmlvX3NldDsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYmlvX3ZlYyAqYnZlY19hbGxvY19icyh1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwX21hc2ssIGludCBuciwgdW5zaWduZWQgbG9uZyAqaWR4LCBzdHJ1Y3QgYmlvX3NldCAqYnMpCit7CisJc3RydWN0IGJpb192ZWMgKmJ2bDsKKwlzdHJ1Y3QgYmlvdmVjX3NsYWIgKmJwOworCisJLyoKKwkgKiBzZWUgY29tbWVudCBuZWFyIGJ2ZWNfYXJyYXkgZGVmaW5lIQorCSAqLworCXN3aXRjaCAobnIpIHsKKwkJY2FzZSAgIDEgICAgICAgIDogKmlkeCA9IDA7IGJyZWFrOworCQljYXNlICAgMiAuLi4gICA0OiAqaWR4ID0gMTsgYnJlYWs7CisJCWNhc2UgICA1IC4uLiAgMTY6ICppZHggPSAyOyBicmVhazsKKwkJY2FzZSAgMTcgLi4uICA2NDogKmlkeCA9IDM7IGJyZWFrOworCQljYXNlICA2NSAuLi4gMTI4OiAqaWR4ID0gNDsgYnJlYWs7CisJCWNhc2UgMTI5IC4uLiBCSU9fTUFYX1BBR0VTOiAqaWR4ID0gNTsgYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gTlVMTDsKKwl9CisJLyoKKwkgKiBpZHggbm93IHBvaW50cyB0byB0aGUgcG9vbCB3ZSB3YW50IHRvIGFsbG9jYXRlIGZyb20KKwkgKi8KKworCWJwID0gYnZlY19zbGFicyArICppZHg7CisJYnZsID0gbWVtcG9vbF9hbGxvYyhicy0+YnZlY19wb29sc1sqaWR4XSwgZ2ZwX21hc2spOworCWlmIChidmwpCisJCW1lbXNldChidmwsIDAsIGJwLT5ucl92ZWNzICogc2l6ZW9mKHN0cnVjdCBiaW9fdmVjKSk7CisKKwlyZXR1cm4gYnZsOworfQorCisvKgorICogZGVmYXVsdCBkZXN0cnVjdG9yIGZvciBhIGJpbyBhbGxvY2F0ZWQgd2l0aCBiaW9fYWxsb2NfYmlvc2V0KCkKKyAqLworc3RhdGljIHZvaWQgYmlvX2Rlc3RydWN0b3Ioc3RydWN0IGJpbyAqYmlvKQoreworCWNvbnN0IGludCBwb29sX2lkeCA9IEJJT19QT09MX0lEWChiaW8pOworCXN0cnVjdCBiaW9fc2V0ICpicyA9IGJpby0+Ymlfc2V0OworCisJQklPX0JVR19PTihwb29sX2lkeCA+PSBCSU9WRUNfTlJfUE9PTFMpOworCisJbWVtcG9vbF9mcmVlKGJpby0+YmlfaW9fdmVjLCBicy0+YnZlY19wb29sc1twb29sX2lkeF0pOworCW1lbXBvb2xfZnJlZShiaW8sIGJzLT5iaW9fcG9vbCk7Cit9CisKK2lubGluZSB2b2lkIGJpb19pbml0KHN0cnVjdCBiaW8gKmJpbykKK3sKKwliaW8tPmJpX25leHQgPSBOVUxMOworCWJpby0+YmlfZmxhZ3MgPSAxIDw8IEJJT19VUFRPREFURTsKKwliaW8tPmJpX3J3ID0gMDsKKwliaW8tPmJpX3ZjbnQgPSAwOworCWJpby0+YmlfaWR4ID0gMDsKKwliaW8tPmJpX3BoeXNfc2VnbWVudHMgPSAwOworCWJpby0+YmlfaHdfc2VnbWVudHMgPSAwOworCWJpby0+YmlfaHdfZnJvbnRfc2l6ZSA9IDA7CisJYmlvLT5iaV9od19iYWNrX3NpemUgPSAwOworCWJpby0+Ymlfc2l6ZSA9IDA7CisJYmlvLT5iaV9tYXhfdmVjcyA9IDA7CisJYmlvLT5iaV9lbmRfaW8gPSBOVUxMOworCWF0b21pY19zZXQoJmJpby0+YmlfY250LCAxKTsKKwliaW8tPmJpX3ByaXZhdGUgPSBOVUxMOworfQorCisvKioKKyAqIGJpb19hbGxvY19iaW9zZXQgLSBhbGxvY2F0ZSBhIGJpbyBmb3IgSS9PCisgKiBAZ2ZwX21hc2s6ICAgdGhlIEdGUF8gbWFzayBnaXZlbiB0byB0aGUgc2xhYiBhbGxvY2F0b3IKKyAqIEBucl9pb3ZlY3M6CW51bWJlciBvZiBpb3ZlY3MgdG8gcHJlLWFsbG9jYXRlCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIGJpb19hbGxvY19iaW9zZXQgd2lsbCBmaXJzdCB0cnkgaXQncyBvbiBtZW1wb29sIHRvIHNhdGlzZnkgdGhlIGFsbG9jYXRpb24uCisgKiAgIElmICVfX0dGUF9XQUlUIGlzIHNldCB0aGVuIHdlIHdpbGwgYmxvY2sgb24gdGhlIGludGVybmFsIHBvb2wgd2FpdGluZworICogICBmb3IgYSAmc3RydWN0IGJpbyB0byBiZWNvbWUgZnJlZS4KKyAqCisgKiAgIGFsbG9jYXRlIGJpbyBhbmQgaW92ZWNzIGZyb20gdGhlIG1lbW9yeSBwb29scyBzcGVjaWZpZWQgYnkgdGhlCisgKiAgIGJpb19zZXQgc3RydWN0dXJlLgorICoqLworc3RydWN0IGJpbyAqYmlvX2FsbG9jX2Jpb3NldCh1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwX21hc2ssIGludCBucl9pb3ZlY3MsIHN0cnVjdCBiaW9fc2V0ICpicykKK3sKKwlzdHJ1Y3QgYmlvICpiaW8gPSBtZW1wb29sX2FsbG9jKGJzLT5iaW9fcG9vbCwgZ2ZwX21hc2spOworCisJaWYgKGxpa2VseShiaW8pKSB7CisJCXN0cnVjdCBiaW9fdmVjICpidmwgPSBOVUxMOworCisJCWJpb19pbml0KGJpbyk7CisJCWlmIChsaWtlbHkobnJfaW92ZWNzKSkgeworCQkJdW5zaWduZWQgbG9uZyBpZHg7CisKKwkJCWJ2bCA9IGJ2ZWNfYWxsb2NfYnMoZ2ZwX21hc2ssIG5yX2lvdmVjcywgJmlkeCwgYnMpOworCQkJaWYgKHVubGlrZWx5KCFidmwpKSB7CisJCQkJbWVtcG9vbF9mcmVlKGJpbywgYnMtPmJpb19wb29sKTsKKwkJCQliaW8gPSBOVUxMOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJYmlvLT5iaV9mbGFncyB8PSBpZHggPDwgQklPX1BPT0xfT0ZGU0VUOworCQkJYmlvLT5iaV9tYXhfdmVjcyA9IGJ2ZWNfc2xhYnNbaWR4XS5ucl92ZWNzOworCQl9CisJCWJpby0+YmlfaW9fdmVjID0gYnZsOworCQliaW8tPmJpX2Rlc3RydWN0b3IgPSBiaW9fZGVzdHJ1Y3RvcjsKKwkJYmlvLT5iaV9zZXQgPSBiczsKKwl9CitvdXQ6CisJcmV0dXJuIGJpbzsKK30KKworc3RydWN0IGJpbyAqYmlvX2FsbG9jKHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnBfbWFzaywgaW50IG5yX2lvdmVjcykKK3sKKwlyZXR1cm4gYmlvX2FsbG9jX2Jpb3NldChnZnBfbWFzaywgbnJfaW92ZWNzLCBmc19iaW9fc2V0KTsKK30KKwordm9pZCB6ZXJvX2ZpbGxfYmlvKHN0cnVjdCBiaW8gKmJpbykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBiaW9fdmVjICpidjsKKwlpbnQgaTsKKworCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2LCBiaW8sIGkpIHsKKwkJY2hhciAqZGF0YSA9IGJ2ZWNfa21hcF9pcnEoYnYsICZmbGFncyk7CisJCW1lbXNldChkYXRhLCAwLCBidi0+YnZfbGVuKTsKKwkJZmx1c2hfZGNhY2hlX3BhZ2UoYnYtPmJ2X3BhZ2UpOworCQlidmVjX2t1bm1hcF9pcnEoZGF0YSwgJmZsYWdzKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHplcm9fZmlsbF9iaW8pOworCisvKioKKyAqIGJpb19wdXQgLSByZWxlYXNlIGEgcmVmZXJlbmNlIHRvIGEgYmlvCisgKiBAYmlvOiAgIGJpbyB0byByZWxlYXNlIHJlZmVyZW5jZSB0bworICoKKyAqIERlc2NyaXB0aW9uOgorICogICBQdXQgYSByZWZlcmVuY2UgdG8gYSAmc3RydWN0IGJpbywgZWl0aGVyIG9uZSB5b3UgaGF2ZSBnb3R0ZW4gd2l0aAorICogICBiaW9fYWxsb2Mgb3IgYmlvX2dldC4gVGhlIGxhc3QgcHV0IG9mIGEgYmlvIHdpbGwgZnJlZSBpdC4KKyAqKi8KK3ZvaWQgYmlvX3B1dChzdHJ1Y3QgYmlvICpiaW8pCit7CisJQklPX0JVR19PTighYXRvbWljX3JlYWQoJmJpby0+YmlfY250KSk7CisKKwkvKgorCSAqIGxhc3QgcHV0IGZyZWVzIGl0CisJICovCisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmJpby0+YmlfY250KSkgeworCQliaW8tPmJpX25leHQgPSBOVUxMOworCQliaW8tPmJpX2Rlc3RydWN0b3IoYmlvKTsKKwl9Cit9CisKK2lubGluZSBpbnQgYmlvX3BoeXNfc2VnbWVudHMocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgYmlvICpiaW8pCit7CisJaWYgKHVubGlrZWx5KCFiaW9fZmxhZ2dlZChiaW8sIEJJT19TRUdfVkFMSUQpKSkKKwkJYmxrX3JlY291bnRfc2VnbWVudHMocSwgYmlvKTsKKworCXJldHVybiBiaW8tPmJpX3BoeXNfc2VnbWVudHM7Cit9CisKK2lubGluZSBpbnQgYmlvX2h3X3NlZ21lbnRzKHJlcXVlc3RfcXVldWVfdCAqcSwgc3RydWN0IGJpbyAqYmlvKQoreworCWlmICh1bmxpa2VseSghYmlvX2ZsYWdnZWQoYmlvLCBCSU9fU0VHX1ZBTElEKSkpCisJCWJsa19yZWNvdW50X3NlZ21lbnRzKHEsIGJpbyk7CisKKwlyZXR1cm4gYmlvLT5iaV9od19zZWdtZW50czsKK30KKworLyoqCisgKiAJX19iaW9fY2xvbmUJLQljbG9uZSBhIGJpbworICogCUBiaW86IGRlc3RpbmF0aW9uIGJpbworICogCUBiaW9fc3JjOiBiaW8gdG8gY2xvbmUKKyAqCisgKglDbG9uZSBhICZiaW8uIENhbGxlciB3aWxsIG93biB0aGUgcmV0dXJuZWQgYmlvLCBidXQgbm90CisgKgl0aGUgYWN0dWFsIGRhdGEgaXQgcG9pbnRzIHRvLiBSZWZlcmVuY2UgY291bnQgb2YgcmV0dXJuZWQKKyAqIAliaW8gd2lsbCBiZSBvbmUuCisgKi8KK2lubGluZSB2b2lkIF9fYmlvX2Nsb25lKHN0cnVjdCBiaW8gKmJpbywgc3RydWN0IGJpbyAqYmlvX3NyYykKK3sKKwlyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBiZGV2X2dldF9xdWV1ZShiaW9fc3JjLT5iaV9iZGV2KTsKKworCW1lbWNweShiaW8tPmJpX2lvX3ZlYywgYmlvX3NyYy0+YmlfaW9fdmVjLCBiaW9fc3JjLT5iaV9tYXhfdmVjcyAqIHNpemVvZihzdHJ1Y3QgYmlvX3ZlYykpOworCisJYmlvLT5iaV9zZWN0b3IgPSBiaW9fc3JjLT5iaV9zZWN0b3I7CisJYmlvLT5iaV9iZGV2ID0gYmlvX3NyYy0+YmlfYmRldjsKKwliaW8tPmJpX2ZsYWdzIHw9IDEgPDwgQklPX0NMT05FRDsKKwliaW8tPmJpX3J3ID0gYmlvX3NyYy0+Ymlfcnc7CisKKwkvKgorCSAqIG5vdGVzIC0tIG1heWJlIGp1c3QgbGVhdmUgYmlfaWR4IGFsb25lLiBhc3N1bWUgaWRlbnRpY2FsIG1hcHBpbmcKKwkgKiBmb3IgdGhlIGNsb25lCisJICovCisJYmlvLT5iaV92Y250ID0gYmlvX3NyYy0+YmlfdmNudDsKKwliaW8tPmJpX3NpemUgPSBiaW9fc3JjLT5iaV9zaXplOworCWJpb19waHlzX3NlZ21lbnRzKHEsIGJpbyk7CisJYmlvX2h3X3NlZ21lbnRzKHEsIGJpbyk7Cit9CisKKy8qKgorICoJYmlvX2Nsb25lCS0JY2xvbmUgYSBiaW8KKyAqCUBiaW86IGJpbyB0byBjbG9uZQorICoJQGdmcF9tYXNrOiBhbGxvY2F0aW9uIHByaW9yaXR5CisgKgorICogCUxpa2UgX19iaW9fY2xvbmUsIG9ubHkgYWxzbyBhbGxvY2F0ZXMgdGhlIHJldHVybmVkIGJpbworICovCitzdHJ1Y3QgYmlvICpiaW9fY2xvbmUoc3RydWN0IGJpbyAqYmlvLCB1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwX21hc2spCit7CisJc3RydWN0IGJpbyAqYiA9IGJpb19hbGxvY19iaW9zZXQoZ2ZwX21hc2ssIGJpby0+YmlfbWF4X3ZlY3MsIGZzX2Jpb19zZXQpOworCisJaWYgKGIpCisJCV9fYmlvX2Nsb25lKGIsIGJpbyk7CisKKwlyZXR1cm4gYjsKK30KKworLyoqCisgKgliaW9fZ2V0X25yX3ZlY3MJCS0gcmV0dXJuIGFwcHJveCBudW1iZXIgb2YgdmVjcworICoJQGJkZXY6ICBJL08gdGFyZ2V0CisgKgorICoJUmV0dXJuIHRoZSBhcHByb3hpbWF0ZSBudW1iZXIgb2YgcGFnZXMgd2UgY2FuIHNlbmQgdG8gdGhpcyB0YXJnZXQuCisgKglUaGVyZSdzIG5vIGd1YXJhbnRlZSB0aGF0IHlvdSB3aWxsIGJlIGFibGUgdG8gZml0IHRoaXMgbnVtYmVyIG9mIHBhZ2VzCisgKglpbnRvIGEgYmlvLCBpdCBkb2VzIG5vdCBhY2NvdW50IGZvciBkeW5hbWljIHJlc3RyaWN0aW9ucyB0aGF0IHZhcnkKKyAqCW9uIG9mZnNldC4KKyAqLworaW50IGJpb19nZXRfbnJfdmVjcyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQoreworCXJlcXVlc3RfcXVldWVfdCAqcSA9IGJkZXZfZ2V0X3F1ZXVlKGJkZXYpOworCWludCBucl9wYWdlczsKKworCW5yX3BhZ2VzID0gKChxLT5tYXhfc2VjdG9ycyA8PCA5KSArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7CisJaWYgKG5yX3BhZ2VzID4gcS0+bWF4X3BoeXNfc2VnbWVudHMpCisJCW5yX3BhZ2VzID0gcS0+bWF4X3BoeXNfc2VnbWVudHM7CisJaWYgKG5yX3BhZ2VzID4gcS0+bWF4X2h3X3NlZ21lbnRzKQorCQlucl9wYWdlcyA9IHEtPm1heF9od19zZWdtZW50czsKKworCXJldHVybiBucl9wYWdlczsKK30KKworc3RhdGljIGludCBfX2Jpb19hZGRfcGFnZShyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBiaW8gKmJpbywgc3RydWN0IHBhZ2UKKwkJCSAgKnBhZ2UsIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJaW50IHJldHJpZWRfc2VnbWVudHMgPSAwOworCXN0cnVjdCBiaW9fdmVjICpidmVjOworCisJLyoKKwkgKiBjbG9uZWQgYmlvIG11c3Qgbm90IG1vZGlmeSB2ZWMgbGlzdAorCSAqLworCWlmICh1bmxpa2VseShiaW9fZmxhZ2dlZChiaW8sIEJJT19DTE9ORUQpKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoYmlvLT5iaV92Y250ID49IGJpby0+YmlfbWF4X3ZlY3MpCisJCXJldHVybiAwOworCisJaWYgKCgoYmlvLT5iaV9zaXplICsgbGVuKSA+PiA5KSA+IHEtPm1heF9zZWN0b3JzKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogd2UgbWlnaHQgbG9zZSBhIHNlZ21lbnQgb3IgdHdvIGhlcmUsIGJ1dCByYXRoZXIgdGhhdCB0aGFuCisJICogbWFrZSB0aGlzIHRvbyBjb21wbGV4LgorCSAqLworCisJd2hpbGUgKGJpby0+YmlfcGh5c19zZWdtZW50cyA+PSBxLT5tYXhfcGh5c19zZWdtZW50cworCSAgICAgICB8fCBiaW8tPmJpX2h3X3NlZ21lbnRzID49IHEtPm1heF9od19zZWdtZW50cworCSAgICAgICB8fCBCSU9WRUNfVklSVF9PVkVSU0laRShiaW8tPmJpX3NpemUpKSB7CisKKwkJaWYgKHJldHJpZWRfc2VnbWVudHMpCisJCQlyZXR1cm4gMDsKKworCQlyZXRyaWVkX3NlZ21lbnRzID0gMTsKKwkJYmxrX3JlY291bnRfc2VnbWVudHMocSwgYmlvKTsKKwl9CisKKwkvKgorCSAqIHNldHVwIHRoZSBuZXcgZW50cnksIHdlIG1pZ2h0IGNsZWFyIGl0IGFnYWluIGxhdGVyIGlmIHdlCisJICogY2Fubm90IGFkZCB0aGUgcGFnZQorCSAqLworCWJ2ZWMgPSAmYmlvLT5iaV9pb192ZWNbYmlvLT5iaV92Y250XTsKKwlidmVjLT5idl9wYWdlID0gcGFnZTsKKwlidmVjLT5idl9sZW4gPSBsZW47CisJYnZlYy0+YnZfb2Zmc2V0ID0gb2Zmc2V0OworCisJLyoKKwkgKiBpZiBxdWV1ZSBoYXMgb3RoZXIgcmVzdHJpY3Rpb25zIChlZyB2YXJ5aW5nIG1heCBzZWN0b3Igc2l6ZQorCSAqIGRlcGVuZGluZyBvbiBvZmZzZXQpLCBpdCBjYW4gc3BlY2lmeSBhIG1lcmdlX2J2ZWNfZm4gaW4gdGhlCisJICogcXVldWUgdG8gZ2V0IGZ1cnRoZXIgY29udHJvbAorCSAqLworCWlmIChxLT5tZXJnZV9idmVjX2ZuKSB7CisJCS8qCisJCSAqIG1lcmdlX2J2ZWNfZm4oKSByZXR1cm5zIG51bWJlciBvZiBieXRlcyBpdCBjYW4gYWNjZXB0CisJCSAqIGF0IHRoaXMgb2Zmc2V0CisJCSAqLworCQlpZiAocS0+bWVyZ2VfYnZlY19mbihxLCBiaW8sIGJ2ZWMpIDwgbGVuKSB7CisJCQlidmVjLT5idl9wYWdlID0gTlVMTDsKKwkJCWJ2ZWMtPmJ2X2xlbiA9IDA7CisJCQlidmVjLT5idl9vZmZzZXQgPSAwOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKiBJZiB3ZSBtYXkgYmUgYWJsZSB0byBtZXJnZSB0aGVzZSBiaW92ZWNzLCBmb3JjZSBhIHJlY291bnQgKi8KKwlpZiAoYmlvLT5iaV92Y250ICYmIChCSU9WRUNfUEhZU19NRVJHRUFCTEUoYnZlYy0xLCBidmVjKSB8fAorCSAgICBCSU9WRUNfVklSVF9NRVJHRUFCTEUoYnZlYy0xLCBidmVjKSkpCisJCWJpby0+YmlfZmxhZ3MgJj0gfigxIDw8IEJJT19TRUdfVkFMSUQpOworCisJYmlvLT5iaV92Y250Kys7CisJYmlvLT5iaV9waHlzX3NlZ21lbnRzKys7CisJYmlvLT5iaV9od19zZWdtZW50cysrOworCWJpby0+Ymlfc2l6ZSArPSBsZW47CisJcmV0dXJuIGxlbjsKK30KKworLyoqCisgKgliaW9fYWRkX3BhZ2UJLQlhdHRlbXB0IHRvIGFkZCBwYWdlIHRvIGJpbworICoJQGJpbzogZGVzdGluYXRpb24gYmlvCisgKglAcGFnZTogcGFnZSB0byBhZGQKKyAqCUBsZW46IHZlYyBlbnRyeSBsZW5ndGgKKyAqCUBvZmZzZXQ6IHZlYyBlbnRyeSBvZmZzZXQKKyAqCisgKglBdHRlbXB0IHRvIGFkZCBhIHBhZ2UgdG8gdGhlIGJpb192ZWMgbWFwbGlzdC4gVGhpcyBjYW4gZmFpbCBmb3IgYQorICoJbnVtYmVyIG9mIHJlYXNvbnMsIHN1Y2ggYXMgdGhlIGJpbyBiZWluZyBmdWxsIG9yIHRhcmdldCBibG9jaworICoJZGV2aWNlIGxpbWl0YXRpb25zLiBUaGUgdGFyZ2V0IGJsb2NrIGRldmljZSBtdXN0IGFsbG93IGJpbydzCisgKiAgICAgIHNtYWxsZXIgdGhhbiBQQUdFX1NJWkUsIHNvIGl0IGlzIGFsd2F5cyBwb3NzaWJsZSB0byBhZGQgYSBzaW5nbGUKKyAqICAgICAgcGFnZSB0byBhbiBlbXB0eSBiaW8uCisgKi8KK2ludCBiaW9fYWRkX3BhZ2Uoc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgaW50IGxlbiwKKwkJIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJcmV0dXJuIF9fYmlvX2FkZF9wYWdlKGJkZXZfZ2V0X3F1ZXVlKGJpby0+YmlfYmRldiksIGJpbywgcGFnZSwKKwkJCSAgICAgIGxlbiwgb2Zmc2V0KTsKK30KKworc3RydWN0IGJpb19tYXBfZGF0YSB7CisJc3RydWN0IGJpb192ZWMgKmlvdmVjczsKKwl2b2lkIF9fdXNlciAqdXNlcnB0cjsKK307CisKK3N0YXRpYyB2b2lkIGJpb19zZXRfbWFwX2RhdGEoc3RydWN0IGJpb19tYXBfZGF0YSAqYm1kLCBzdHJ1Y3QgYmlvICpiaW8pCit7CisJbWVtY3B5KGJtZC0+aW92ZWNzLCBiaW8tPmJpX2lvX3ZlYywgc2l6ZW9mKHN0cnVjdCBiaW9fdmVjKSAqIGJpby0+YmlfdmNudCk7CisJYmlvLT5iaV9wcml2YXRlID0gYm1kOworfQorCitzdGF0aWMgdm9pZCBiaW9fZnJlZV9tYXBfZGF0YShzdHJ1Y3QgYmlvX21hcF9kYXRhICpibWQpCit7CisJa2ZyZWUoYm1kLT5pb3ZlY3MpOworCWtmcmVlKGJtZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmlvX21hcF9kYXRhICpiaW9fYWxsb2NfbWFwX2RhdGEoaW50IG5yX3NlZ3MpCit7CisJc3RydWN0IGJpb19tYXBfZGF0YSAqYm1kID0ga21hbGxvYyhzaXplb2YoKmJtZCksIEdGUF9LRVJORUwpOworCisJaWYgKCFibWQpCisJCXJldHVybiBOVUxMOworCisJYm1kLT5pb3ZlY3MgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYmlvX3ZlYykgKiBucl9zZWdzLCBHRlBfS0VSTkVMKTsKKwlpZiAoYm1kLT5pb3ZlY3MpCisJCXJldHVybiBibWQ7CisKKwlrZnJlZShibWQpOworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqCWJpb191bmNvcHlfdXNlcgktCWZpbmlzaCBwcmV2aW91c2x5IG1hcHBlZCBiaW8KKyAqCUBiaW86IGJpbyBiZWluZyB0ZXJtaW5hdGVkCisgKgorICoJRnJlZSBwYWdlcyBhbGxvY2F0ZWQgZnJvbSBiaW9fY29weV91c2VyKCkgYW5kIHdyaXRlIGJhY2sgZGF0YQorICoJdG8gdXNlciBzcGFjZSBpbiBjYXNlIG9mIGEgcmVhZC4KKyAqLworaW50IGJpb191bmNvcHlfdXNlcihzdHJ1Y3QgYmlvICpiaW8pCit7CisJc3RydWN0IGJpb19tYXBfZGF0YSAqYm1kID0gYmlvLT5iaV9wcml2YXRlOworCWNvbnN0IGludCByZWFkID0gYmlvX2RhdGFfZGlyKGJpbykgPT0gUkVBRDsKKwlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYzsKKwlpbnQgaSwgcmV0ID0gMDsKKworCV9fYmlvX2Zvcl9lYWNoX3NlZ21lbnQoYnZlYywgYmlvLCBpLCAwKSB7CisJCWNoYXIgKmFkZHIgPSBwYWdlX2FkZHJlc3MoYnZlYy0+YnZfcGFnZSk7CisJCXVuc2lnbmVkIGludCBsZW4gPSBibWQtPmlvdmVjc1tpXS5idl9sZW47CisKKwkJaWYgKHJlYWQgJiYgIXJldCAmJiBjb3B5X3RvX3VzZXIoYm1kLT51c2VycHRyLCBhZGRyLCBsZW4pKQorCQkJcmV0ID0gLUVGQVVMVDsKKworCQlfX2ZyZWVfcGFnZShidmVjLT5idl9wYWdlKTsKKwkJYm1kLT51c2VycHRyICs9IGxlbjsKKwl9CisJYmlvX2ZyZWVfbWFwX2RhdGEoYm1kKTsKKwliaW9fcHV0KGJpbyk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKgliaW9fY29weV91c2VyCS0JY29weSB1c2VyIGRhdGEgdG8gYmlvCisgKglAcTogZGVzdGluYXRpb24gYmxvY2sgcXVldWUKKyAqCUB1YWRkcjogc3RhcnQgb2YgdXNlciBhZGRyZXNzCisgKglAbGVuOiBsZW5ndGggaW4gYnl0ZXMKKyAqCUB3cml0ZV90b192bTogYm9vbCBpbmRpY2F0aW5nIHdyaXRpbmcgdG8gcGFnZXMgb3Igbm90CisgKgorICoJUHJlcGFyZXMgYW5kIHJldHVybnMgYSBiaW8gZm9yIGluZGlyZWN0IHVzZXIgaW8sIGJvdW5jaW5nIGRhdGEKKyAqCXRvL2Zyb20ga2VybmVsIHBhZ2VzIGFzIG5lY2Vzc2FyeS4gTXVzdCBiZSBwYWlyZWQgd2l0aAorICoJY2FsbCBiaW9fdW5jb3B5X3VzZXIoKSBvbiBpbyBjb21wbGV0aW9uLgorICovCitzdHJ1Y3QgYmlvICpiaW9fY29weV91c2VyKHJlcXVlc3RfcXVldWVfdCAqcSwgdW5zaWduZWQgbG9uZyB1YWRkciwKKwkJCSAgdW5zaWduZWQgaW50IGxlbiwgaW50IHdyaXRlX3RvX3ZtKQoreworCXVuc2lnbmVkIGxvbmcgZW5kID0gKHVhZGRyICsgbGVuICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gdWFkZHIgPj4gUEFHRV9TSElGVDsKKwlzdHJ1Y3QgYmlvX21hcF9kYXRhICpibWQ7CisJc3RydWN0IGJpb192ZWMgKmJ2ZWM7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJc3RydWN0IGJpbyAqYmlvOworCWludCBpLCByZXQ7CisKKwlibWQgPSBiaW9fYWxsb2NfbWFwX2RhdGEoZW5kIC0gc3RhcnQpOworCWlmICghYm1kKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWJtZC0+dXNlcnB0ciA9ICh2b2lkIF9fdXNlciAqKSB1YWRkcjsKKworCXJldCA9IC1FTk9NRU07CisJYmlvID0gYmlvX2FsbG9jKEdGUF9LRVJORUwsIGVuZCAtIHN0YXJ0KTsKKwlpZiAoIWJpbykKKwkJZ290byBvdXRfYm1kOworCisJYmlvLT5iaV9ydyB8PSAoIXdyaXRlX3RvX3ZtIDw8IEJJT19SVyk7CisKKwlyZXQgPSAwOworCXdoaWxlIChsZW4pIHsKKwkJdW5zaWduZWQgaW50IGJ5dGVzID0gUEFHRV9TSVpFOworCisJCWlmIChieXRlcyA+IGxlbikKKwkJCWJ5dGVzID0gbGVuOworCisJCXBhZ2UgPSBhbGxvY19wYWdlKHEtPmJvdW5jZV9nZnAgfCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwYWdlKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoX19iaW9fYWRkX3BhZ2UocSwgYmlvLCBwYWdlLCBieXRlcywgMCkgPCBieXRlcykgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJbGVuIC09IGJ5dGVzOworCX0KKworCWlmIChyZXQpCisJCWdvdG8gY2xlYW51cDsKKworCS8qCisJICogc3VjY2VzcworCSAqLworCWlmICghd3JpdGVfdG9fdm0pIHsKKwkJY2hhciBfX3VzZXIgKnAgPSAoY2hhciBfX3VzZXIgKikgdWFkZHI7CisKKwkJLyoKKwkJICogZm9yIGEgd3JpdGUsIGNvcHkgaW4gZGF0YSB0byBrZXJuZWwgcGFnZXMKKwkJICovCisJCXJldCA9IC1FRkFVTFQ7CisJCWJpb19mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIGJpbywgaSkgeworCQkJY2hhciAqYWRkciA9IHBhZ2VfYWRkcmVzcyhidmVjLT5idl9wYWdlKTsKKworCQkJaWYgKGNvcHlfZnJvbV91c2VyKGFkZHIsIHAsIGJ2ZWMtPmJ2X2xlbikpCisJCQkJZ290byBjbGVhbnVwOworCQkJcCArPSBidmVjLT5idl9sZW47CisJCX0KKwl9CisKKwliaW9fc2V0X21hcF9kYXRhKGJtZCwgYmlvKTsKKwlyZXR1cm4gYmlvOworY2xlYW51cDoKKwliaW9fZm9yX2VhY2hfc2VnbWVudChidmVjLCBiaW8sIGkpCisJCV9fZnJlZV9wYWdlKGJ2ZWMtPmJ2X3BhZ2UpOworCisJYmlvX3B1dChiaW8pOworb3V0X2JtZDoKKwliaW9fZnJlZV9tYXBfZGF0YShibWQpOworCXJldHVybiBFUlJfUFRSKHJldCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmlvICpfX2Jpb19tYXBfdXNlcihyZXF1ZXN0X3F1ZXVlX3QgKnEsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJCQkJICB1bnNpZ25lZCBsb25nIHVhZGRyLCB1bnNpZ25lZCBpbnQgbGVuLAorCQkJCSAgaW50IHdyaXRlX3RvX3ZtKQoreworCXVuc2lnbmVkIGxvbmcgZW5kID0gKHVhZGRyICsgbGVuICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gdWFkZHIgPj4gUEFHRV9TSElGVDsKKwljb25zdCBpbnQgbnJfcGFnZXMgPSBlbmQgLSBzdGFydDsKKwlpbnQgcmV0LCBvZmZzZXQsIGk7CisJc3RydWN0IHBhZ2UgKipwYWdlczsKKwlzdHJ1Y3QgYmlvICpiaW87CisKKwkvKgorCSAqIHRyYW5zZmVyIGFuZCBidWZmZXIgbXVzdCBiZSBhbGlnbmVkIHRvIGF0IGxlYXN0IGhhcmRzZWN0b3IKKwkgKiBzaXplIGZvciBub3csIGluIHRoZSBmdXR1cmUgd2UgY2FuIHJlbGF4IHRoaXMgcmVzdHJpY3Rpb24KKwkgKi8KKwlpZiAoKHVhZGRyICYgcXVldWVfZG1hX2FsaWdubWVudChxKSkgfHwgKGxlbiAmIHF1ZXVlX2RtYV9hbGlnbm1lbnQocSkpKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCWJpbyA9IGJpb19hbGxvYyhHRlBfS0VSTkVMLCBucl9wYWdlcyk7CisJaWYgKCFiaW8pCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJcmV0ID0gLUVOT01FTTsKKwlwYWdlcyA9IGttYWxsb2MobnJfcGFnZXMgKiBzaXplb2Yoc3RydWN0IHBhZ2UgKiksIEdGUF9LRVJORUwpOworCWlmICghcGFnZXMpCisJCWdvdG8gb3V0OworCisJZG93bl9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCXJldCA9IGdldF91c2VyX3BhZ2VzKGN1cnJlbnQsIGN1cnJlbnQtPm1tLCB1YWRkciwgbnJfcGFnZXMsCisJCQkJCQl3cml0ZV90b192bSwgMCwgcGFnZXMsIE5VTEwpOworCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisKKwlpZiAocmV0IDwgbnJfcGFnZXMpCisJCWdvdG8gb3V0OworCisJYmlvLT5iaV9iZGV2ID0gYmRldjsKKworCW9mZnNldCA9IHVhZGRyICYgflBBR0VfTUFTSzsKKwlmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgYnl0ZXMgPSBQQUdFX1NJWkUgLSBvZmZzZXQ7CisKKwkJaWYgKGxlbiA8PSAwKQorCQkJYnJlYWs7CisKKwkJaWYgKGJ5dGVzID4gbGVuKQorCQkJYnl0ZXMgPSBsZW47CisKKwkJLyoKKwkJICogc29ycnkuLi4KKwkJICovCisJCWlmIChfX2Jpb19hZGRfcGFnZShxLCBiaW8sIHBhZ2VzW2ldLCBieXRlcywgb2Zmc2V0KSA8IGJ5dGVzKQorCQkJYnJlYWs7CisKKwkJbGVuIC09IGJ5dGVzOworCQlvZmZzZXQgPSAwOworCX0KKworCS8qCisJICogcmVsZWFzZSB0aGUgcGFnZXMgd2UgZGlkbid0IG1hcCBpbnRvIHRoZSBiaW8sIGlmIGFueQorCSAqLworCXdoaWxlIChpIDwgbnJfcGFnZXMpCisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlc1tpKytdKTsKKworCWtmcmVlKHBhZ2VzKTsKKworCS8qCisJICogc2V0IGRhdGEgZGlyZWN0aW9uLCBhbmQgY2hlY2sgaWYgbWFwcGVkIHBhZ2VzIG5lZWQgYm91bmNpbmcKKwkgKi8KKwlpZiAoIXdyaXRlX3RvX3ZtKQorCQliaW8tPmJpX3J3IHw9ICgxIDw8IEJJT19SVyk7CisKKwliaW8tPmJpX2ZsYWdzIHw9ICgxIDw8IEJJT19VU0VSX01BUFBFRCk7CisJcmV0dXJuIGJpbzsKK291dDoKKwlrZnJlZShwYWdlcyk7CisJYmlvX3B1dChiaW8pOworCXJldHVybiBFUlJfUFRSKHJldCk7Cit9CisKKy8qKgorICoJYmlvX21hcF91c2VyCS0JbWFwIHVzZXIgYWRkcmVzcyBpbnRvIGJpbworICoJQGJkZXY6IGRlc3RpbmF0aW9uIGJsb2NrIGRldmljZQorICoJQHVhZGRyOiBzdGFydCBvZiB1c2VyIGFkZHJlc3MKKyAqCUBsZW46IGxlbmd0aCBpbiBieXRlcworICoJQHdyaXRlX3RvX3ZtOiBib29sIGluZGljYXRpbmcgd3JpdGluZyB0byBwYWdlcyBvciBub3QKKyAqCisgKglNYXAgdGhlIHVzZXIgc3BhY2UgYWRkcmVzcyBpbnRvIGEgYmlvIHN1aXRhYmxlIGZvciBpbyB0byBhIGJsb2NrCisgKglkZXZpY2UuIFJldHVybnMgYW4gZXJyb3IgcG9pbnRlciBpbiBjYXNlIG9mIGVycm9yLgorICovCitzdHJ1Y3QgYmlvICpiaW9fbWFwX3VzZXIocmVxdWVzdF9xdWV1ZV90ICpxLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQkJIHVuc2lnbmVkIGxvbmcgdWFkZHIsIHVuc2lnbmVkIGludCBsZW4sIGludCB3cml0ZV90b192bSkKK3sKKwlzdHJ1Y3QgYmlvICpiaW87CisKKwliaW8gPSBfX2Jpb19tYXBfdXNlcihxLCBiZGV2LCB1YWRkciwgbGVuLCB3cml0ZV90b192bSk7CisKKwlpZiAoSVNfRVJSKGJpbykpCisJCXJldHVybiBiaW87CisKKwkvKgorCSAqIHN1YnRsZSAtLSBpZiBfX2Jpb19tYXBfdXNlcigpIGVuZGVkIHVwIGJvdW5jaW5nIGEgYmlvLAorCSAqIGl0IHdvdWxkIG5vcm1hbGx5IGRpc2FwcGVhciB3aGVuIGl0cyBiaV9lbmRfaW8gaXMgcnVuLgorCSAqIGhvd2V2ZXIsIHdlIG5lZWQgaXQgZm9yIHRoZSB1bm1hcCwgc28gZ3JhYiBhbiBleHRyYQorCSAqIHJlZmVyZW5jZSB0byBpdAorCSAqLworCWJpb19nZXQoYmlvKTsKKworCWlmIChiaW8tPmJpX3NpemUgPT0gbGVuKQorCQlyZXR1cm4gYmlvOworCisJLyoKKwkgKiBkb24ndCBzdXBwb3J0IHBhcnRpYWwgbWFwcGluZ3MKKwkgKi8KKwliaW9fZW5kaW8oYmlvLCBiaW8tPmJpX3NpemUsIDApOworCWJpb191bm1hcF91c2VyKGJpbyk7CisJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fYmlvX3VubWFwX3VzZXIoc3RydWN0IGJpbyAqYmlvKQoreworCXN0cnVjdCBiaW9fdmVjICpidmVjOworCWludCBpOworCisJLyoKKwkgKiBtYWtlIHN1cmUgd2UgZGlydHkgcGFnZXMgd2Ugd3JvdGUgdG8KKwkgKi8KKwlfX2Jpb19mb3JfZWFjaF9zZWdtZW50KGJ2ZWMsIGJpbywgaSwgMCkgeworCQlpZiAoYmlvX2RhdGFfZGlyKGJpbykgPT0gUkVBRCkKKwkJCXNldF9wYWdlX2RpcnR5X2xvY2soYnZlYy0+YnZfcGFnZSk7CisKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKGJ2ZWMtPmJ2X3BhZ2UpOworCX0KKworCWJpb19wdXQoYmlvKTsKK30KKworLyoqCisgKgliaW9fdW5tYXBfdXNlcgktCXVubWFwIGEgYmlvCisgKglAYmlvOgkJdGhlIGJpbyBiZWluZyB1bm1hcHBlZAorICoKKyAqCVVubWFwIGEgYmlvIHByZXZpb3VzbHkgbWFwcGVkIGJ5IGJpb19tYXBfdXNlcigpLiBNdXN0IGJlIGNhbGxlZCB3aXRoCisgKglhIHByb2Nlc3MgY29udGV4dC4KKyAqCisgKgliaW9fdW5tYXBfdXNlcigpIG1heSBzbGVlcC4KKyAqLwordm9pZCBiaW9fdW5tYXBfdXNlcihzdHJ1Y3QgYmlvICpiaW8pCit7CisJX19iaW9fdW5tYXBfdXNlcihiaW8pOworCWJpb19wdXQoYmlvKTsKK30KKworLyoKKyAqIGJpb19zZXRfcGFnZXNfZGlydHkoKSBhbmQgYmlvX2NoZWNrX3BhZ2VzX2RpcnR5KCkgYXJlIHN1cHBvcnQgZnVuY3Rpb25zCisgKiBmb3IgcGVyZm9ybWluZyBkaXJlY3QtSU8gaW4gQklPcy4KKyAqCisgKiBUaGUgcHJvYmxlbSBpcyB0aGF0IHdlIGNhbm5vdCBydW4gc2V0X3BhZ2VfZGlydHkoKSBmcm9tIGludGVycnVwdCBjb250ZXh0CisgKiBiZWNhdXNlIHRoZSByZXF1aXJlZCBsb2NrcyBhcmUgbm90IGludGVycnVwdC1zYWZlLiAgU28gd2hhdCB3ZSBjYW4gZG8gaXMgdG8KKyAqIG1hcmsgdGhlIHBhZ2VzIGRpcnR5IF9iZWZvcmVfIHBlcmZvcm1pbmcgSU8uICBBbmQgaW4gaW50ZXJydXB0IGNvbnRleHQsCisgKiBjaGVjayB0aGF0IHRoZSBwYWdlcyBhcmUgc3RpbGwgZGlydHkuICAgSWYgc28sIGZpbmUuICBJZiBub3QsIHJlZGlydHkgdGhlbQorICogaW4gcHJvY2VzcyBjb250ZXh0LgorICoKKyAqIFdlIHNwZWNpYWwtY2FzZSBjb21wb3VuZCBwYWdlcyBoZXJlOiBub3JtYWxseSB0aGlzIG1lYW5zIHJlYWRzIGludG8gaHVnZXRsYgorICogcGFnZXMuICBUaGUgbG9naWMgaW4gaGVyZSBkb2Vzbid0IHJlYWxseSB3b3JrIHJpZ2h0IGZvciBjb21wb3VuZCBwYWdlcworICogYmVjYXVzZSB0aGUgVk0gZG9lcyBub3QgdW5pZm9ybWx5IGNoYXNlIGRvd24gdGhlIGhlYWQgcGFnZSBpbiBhbGwgY2FzZXMuCisgKiBCdXQgZGlydGluZXNzIG9mIGNvbXBvdW5kIHBhZ2VzIGlzIHByZXR0eSBtZWFuaW5nbGVzcyBhbnl3YXk6IHRoZSBWTSBkb2Vzbid0CisgKiBoYW5kbGUgdGhlbSBhdCBhbGwuICBTbyB3ZSBza2lwIGNvbXBvdW5kIHBhZ2VzIGhlcmUgYXQgYW4gZWFybHkgc3RhZ2UuCisgKgorICogTm90ZSB0aGF0IHRoaXMgY29kZSBpcyB2ZXJ5IGhhcmQgdG8gdGVzdCB1bmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcyBiZWNhdXNlCisgKiBkaXJlY3QtaW8gcGlucyB0aGUgcGFnZXMgd2l0aCBnZXRfdXNlcl9wYWdlcygpLiAgVGhpcyBtYWtlcworICogaXNfcGFnZV9jYWNoZV9mcmVlYWJsZSByZXR1cm4gZmFsc2UsIGFuZCB0aGUgVk0gd2lsbCBub3QgY2xlYW4gdGhlIHBhZ2VzLgorICogQnV0IG90aGVyIGNvZGUgKGVnLCBwZGZsdXNoKSBjb3VsZCBjbGVhbiB0aGUgcGFnZXMgaWYgdGhleSBhcmUgbWFwcGVkCisgKiBwYWdlY2FjaGUuCisgKgorICogU2ltcGx5IGRpc2FibGluZyB0aGUgY2FsbCB0byBiaW9fc2V0X3BhZ2VzX2RpcnR5KCkgaXMgYSBnb29kIHdheSB0byB0ZXN0IHRoZQorICogZGVmZXJyZWQgYmlvIGRpcnR5aW5nIHBhdGhzLgorICovCisKKy8qCisgKiBiaW9fc2V0X3BhZ2VzX2RpcnR5KCkgd2lsbCBtYXJrIGFsbCB0aGUgYmlvJ3MgcGFnZXMgYXMgZGlydHkuCisgKi8KK3ZvaWQgYmlvX3NldF9wYWdlc19kaXJ0eShzdHJ1Y3QgYmlvICpiaW8pCit7CisJc3RydWN0IGJpb192ZWMgKmJ2ZWMgPSBiaW8tPmJpX2lvX3ZlYzsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBiaW8tPmJpX3ZjbnQ7IGkrKykgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGJ2ZWNbaV0uYnZfcGFnZTsKKworCQlpZiAocGFnZSAmJiAhUGFnZUNvbXBvdW5kKHBhZ2UpKQorCQkJc2V0X3BhZ2VfZGlydHlfbG9jayhwYWdlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJpb19yZWxlYXNlX3BhZ2VzKHN0cnVjdCBiaW8gKmJpbykKK3sKKwlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYyA9IGJpby0+YmlfaW9fdmVjOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGJpby0+YmlfdmNudDsgaSsrKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gYnZlY1tpXS5idl9wYWdlOworCisJCWlmIChwYWdlKQorCQkJcHV0X3BhZ2UocGFnZSk7CisJfQorfQorCisvKgorICogYmlvX2NoZWNrX3BhZ2VzX2RpcnR5KCkgd2lsbCBjaGVjayB0aGF0IGFsbCB0aGUgQklPJ3MgcGFnZXMgYXJlIHN0aWxsIGRpcnR5LgorICogSWYgdGhleSBhcmUsIHRoZW4gZmluZS4gIElmLCBob3dldmVyLCBzb21lIHBhZ2VzIGFyZSBjbGVhbiB0aGVuIHRoZXkgbXVzdAorICogaGF2ZSBiZWVuIHdyaXR0ZW4gb3V0IGR1cmluZyB0aGUgZGlyZWN0LUlPIHJlYWQuICBTbyB3ZSB0YWtlIGFub3RoZXIgcmVmIG9uCisgKiB0aGUgQklPIGFuZCB0aGUgb2ZmZW5kaW5nIHBhZ2VzIGFuZCByZS1kaXJ0eSB0aGUgcGFnZXMgaW4gcHJvY2VzcyBjb250ZXh0LgorICoKKyAqIEl0IGlzIGV4cGVjdGVkIHRoYXQgYmlvX2NoZWNrX3BhZ2VzX2RpcnR5KCkgd2lsbCB3aG9sbHkgb3duIHRoZSBCSU8gZnJvbQorICogaGVyZSBvbi4gIEl0IHdpbGwgcnVuIG9uZSBwYWdlX2NhY2hlX3JlbGVhc2UoKSBhZ2FpbnN0IGVhY2ggcGFnZSBhbmQgd2lsbAorICogcnVuIG9uZSBiaW9fcHV0KCkgYWdhaW5zdCB0aGUgQklPLgorICovCisKK3N0YXRpYyB2b2lkIGJpb19kaXJ0eV9mbih2b2lkICpkYXRhKTsKKworc3RhdGljIERFQ0xBUkVfV09SSyhiaW9fZGlydHlfd29yaywgYmlvX2RpcnR5X2ZuLCBOVUxMKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soYmlvX2RpcnR5X2xvY2spOworc3RhdGljIHN0cnVjdCBiaW8gKmJpb19kaXJ0eV9saXN0OworCisvKgorICogVGhpcyBydW5zIGluIHByb2Nlc3MgY29udGV4dAorICovCitzdGF0aWMgdm9pZCBiaW9fZGlydHlfZm4odm9pZCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBiaW8gKmJpbzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiaW9fZGlydHlfbG9jaywgZmxhZ3MpOworCWJpbyA9IGJpb19kaXJ0eV9saXN0OworCWJpb19kaXJ0eV9saXN0ID0gTlVMTDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaW9fZGlydHlfbG9jaywgZmxhZ3MpOworCisJd2hpbGUgKGJpbykgeworCQlzdHJ1Y3QgYmlvICpuZXh0ID0gYmlvLT5iaV9wcml2YXRlOworCisJCWJpb19zZXRfcGFnZXNfZGlydHkoYmlvKTsKKwkJYmlvX3JlbGVhc2VfcGFnZXMoYmlvKTsKKwkJYmlvX3B1dChiaW8pOworCQliaW8gPSBuZXh0OworCX0KK30KKwordm9pZCBiaW9fY2hlY2tfcGFnZXNfZGlydHkoc3RydWN0IGJpbyAqYmlvKQoreworCXN0cnVjdCBiaW9fdmVjICpidmVjID0gYmlvLT5iaV9pb192ZWM7CisJaW50IG5yX2NsZWFuX3BhZ2VzID0gMDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBiaW8tPmJpX3ZjbnQ7IGkrKykgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGJ2ZWNbaV0uYnZfcGFnZTsKKworCQlpZiAoUGFnZURpcnR5KHBhZ2UpIHx8IFBhZ2VDb21wb3VuZChwYWdlKSkgeworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJYnZlY1tpXS5idl9wYWdlID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCW5yX2NsZWFuX3BhZ2VzKys7CisJCX0KKwl9CisKKwlpZiAobnJfY2xlYW5fcGFnZXMpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmlvX2RpcnR5X2xvY2ssIGZsYWdzKTsKKwkJYmlvLT5iaV9wcml2YXRlID0gYmlvX2RpcnR5X2xpc3Q7CisJCWJpb19kaXJ0eV9saXN0ID0gYmlvOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiaW9fZGlydHlfbG9jaywgZmxhZ3MpOworCQlzY2hlZHVsZV93b3JrKCZiaW9fZGlydHlfd29yayk7CisJfSBlbHNlIHsKKwkJYmlvX3B1dChiaW8pOworCX0KK30KKworLyoqCisgKiBiaW9fZW5kaW8gLSBlbmQgSS9PIG9uIGEgYmlvCisgKiBAYmlvOgliaW8KKyAqIEBieXRlc19kb25lOgludW1iZXIgb2YgYnl0ZXMgY29tcGxldGVkCisgKiBAZXJyb3I6CWVycm9yLCBpZiBhbnkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgYmlvX2VuZGlvKCkgd2lsbCBlbmQgSS9PIG9uIEBieXRlc19kb25lIG51bWJlciBvZiBieXRlcy4gVGhpcyBtYXkgYmUKKyAqICAganVzdCBhIHBhcnRpYWwgcGFydCBvZiB0aGUgYmlvLCBvciBpdCBtYXkgYmUgdGhlIHdob2xlIGJpby4gYmlvX2VuZGlvKCkKKyAqICAgaXMgdGhlIHByZWZlcnJlZCB3YXkgdG8gZW5kIEkvTyBvbiBhIGJpbywgaXQgdGFrZXMgY2FyZSBvZiBkZWNyZW1lbnRpbmcKKyAqICAgYmlfc2l6ZSBhbmQgY2xlYXJpbmcgQklPX1VQVE9EQVRFIG9uIGVycm9yLiBAZXJyb3IgaXMgMCBvbiBzdWNjZXNzLCBhbmQKKyAqICAgYW5kIG9uZSBvZiB0aGUgZXN0YWJsaXNoZWQgLUV4eHh4ICgtRUlPLCBmb3IgaW5zdGFuY2UpIGVycm9yIHZhbHVlcyBpbgorICogICBjYXNlIHNvbWV0aGluZyB3ZW50IHdyb25nLiBOb29uZSBzaG91bGQgY2FsbCBiaV9lbmRfaW8oKSBkaXJlY3RseSBvbgorICogICBhIGJpbyB1bmxlc3MgdGhleSBvd24gaXQgYW5kIHRodXMga25vdyB0aGF0IGl0IGhhcyBhbiBlbmRfaW8gZnVuY3Rpb24uCisgKiovCit2b2lkIGJpb19lbmRpbyhzdHJ1Y3QgYmlvICpiaW8sIHVuc2lnbmVkIGludCBieXRlc19kb25lLCBpbnQgZXJyb3IpCit7CisJaWYgKGVycm9yKQorCQljbGVhcl9iaXQoQklPX1VQVE9EQVRFLCAmYmlvLT5iaV9mbGFncyk7CisKKwlpZiAodW5saWtlbHkoYnl0ZXNfZG9uZSA+IGJpby0+Ymlfc2l6ZSkpIHsKKwkJcHJpbnRrKCIlczogd2FudCAldSBieXRlcyBkb25lLCBvbmx5ICV1IGxlZnRcbiIsIF9fRlVOQ1RJT05fXywKKwkJCQkJCWJ5dGVzX2RvbmUsIGJpby0+Ymlfc2l6ZSk7CisJCWJ5dGVzX2RvbmUgPSBiaW8tPmJpX3NpemU7CisJfQorCisJYmlvLT5iaV9zaXplIC09IGJ5dGVzX2RvbmU7CisJYmlvLT5iaV9zZWN0b3IgKz0gKGJ5dGVzX2RvbmUgPj4gOSk7CisKKwlpZiAoYmlvLT5iaV9lbmRfaW8pCisJCWJpby0+YmlfZW5kX2lvKGJpbywgYnl0ZXNfZG9uZSwgZXJyb3IpOworfQorCit2b2lkIGJpb19wYWlyX3JlbGVhc2Uoc3RydWN0IGJpb19wYWlyICpicCkKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmYnAtPmNudCkpIHsKKwkJc3RydWN0IGJpbyAqbWFzdGVyID0gYnAtPmJpbzEuYmlfcHJpdmF0ZTsKKworCQliaW9fZW5kaW8obWFzdGVyLCBtYXN0ZXItPmJpX3NpemUsIGJwLT5lcnJvcik7CisJCW1lbXBvb2xfZnJlZShicCwgYnAtPmJpbzIuYmlfcHJpdmF0ZSk7CisJfQorfQorCitzdGF0aWMgaW50IGJpb19wYWlyX2VuZF8xKHN0cnVjdCBiaW8gKiBiaSwgdW5zaWduZWQgaW50IGRvbmUsIGludCBlcnIpCit7CisJc3RydWN0IGJpb19wYWlyICpicCA9IGNvbnRhaW5lcl9vZihiaSwgc3RydWN0IGJpb19wYWlyLCBiaW8xKTsKKworCWlmIChlcnIpCisJCWJwLT5lcnJvciA9IGVycjsKKworCWlmIChiaS0+Ymlfc2l6ZSkKKwkJcmV0dXJuIDE7CisKKwliaW9fcGFpcl9yZWxlYXNlKGJwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiaW9fcGFpcl9lbmRfMihzdHJ1Y3QgYmlvICogYmksIHVuc2lnbmVkIGludCBkb25lLCBpbnQgZXJyKQoreworCXN0cnVjdCBiaW9fcGFpciAqYnAgPSBjb250YWluZXJfb2YoYmksIHN0cnVjdCBiaW9fcGFpciwgYmlvMik7CisKKwlpZiAoZXJyKQorCQlicC0+ZXJyb3IgPSBlcnI7CisKKwlpZiAoYmktPmJpX3NpemUpCisJCXJldHVybiAxOworCisJYmlvX3BhaXJfcmVsZWFzZShicCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzcGxpdCBhIGJpbyAtIG9ubHkgd29ycnkgYWJvdXQgYSBiaW8gd2l0aCBhIHNpbmdsZSBwYWdlCisgKiBpbiBpdCdzIGlvdmVjCisgKi8KK3N0cnVjdCBiaW9fcGFpciAqYmlvX3NwbGl0KHN0cnVjdCBiaW8gKmJpLCBtZW1wb29sX3QgKnBvb2wsIGludCBmaXJzdF9zZWN0b3JzKQoreworCXN0cnVjdCBiaW9fcGFpciAqYnAgPSBtZW1wb29sX2FsbG9jKHBvb2wsIEdGUF9OT0lPKTsKKworCWlmICghYnApCisJCXJldHVybiBicDsKKworCUJVR19PTihiaS0+YmlfdmNudCAhPSAxKTsKKwlCVUdfT04oYmktPmJpX2lkeCAhPSAwKTsKKwlhdG9taWNfc2V0KCZicC0+Y250LCAzKTsKKwlicC0+ZXJyb3IgPSAwOworCWJwLT5iaW8xID0gKmJpOworCWJwLT5iaW8yID0gKmJpOworCWJwLT5iaW8yLmJpX3NlY3RvciArPSBmaXJzdF9zZWN0b3JzOworCWJwLT5iaW8yLmJpX3NpemUgLT0gZmlyc3Rfc2VjdG9ycyA8PCA5OworCWJwLT5iaW8xLmJpX3NpemUgPSBmaXJzdF9zZWN0b3JzIDw8IDk7CisKKwlicC0+YnYxID0gYmktPmJpX2lvX3ZlY1swXTsKKwlicC0+YnYyID0gYmktPmJpX2lvX3ZlY1swXTsKKwlicC0+YnYyLmJ2X29mZnNldCArPSBmaXJzdF9zZWN0b3JzIDw8IDk7CisJYnAtPmJ2Mi5idl9sZW4gLT0gZmlyc3Rfc2VjdG9ycyA8PCA5OworCWJwLT5idjEuYnZfbGVuID0gZmlyc3Rfc2VjdG9ycyA8PCA5OworCisJYnAtPmJpbzEuYmlfaW9fdmVjID0gJmJwLT5idjE7CisJYnAtPmJpbzIuYmlfaW9fdmVjID0gJmJwLT5idjI7CisKKwlicC0+YmlvMS5iaV9lbmRfaW8gPSBiaW9fcGFpcl9lbmRfMTsKKwlicC0+YmlvMi5iaV9lbmRfaW8gPSBiaW9fcGFpcl9lbmRfMjsKKworCWJwLT5iaW8xLmJpX3ByaXZhdGUgPSBiaTsKKwlicC0+YmlvMi5iaV9wcml2YXRlID0gcG9vbDsKKworCXJldHVybiBicDsKK30KKworc3RhdGljIHZvaWQgKmJpb19wYWlyX2FsbG9jKHVuc2lnbmVkIGludCBfX25vY2FzdCBnZnBfZmxhZ3MsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBiaW9fcGFpciksIGdmcF9mbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGJpb19wYWlyX2ZyZWUodm9pZCAqYnAsIHZvaWQgKmRhdGEpCit7CisJa2ZyZWUoYnApOworfQorCisKKy8qCisgKiBjcmVhdGUgbWVtb3J5IHBvb2xzIGZvciBiaW92ZWMncyBpbiBhIGJpb19zZXQuCisgKiB1c2UgdGhlIGdsb2JhbCBiaW92ZWMgc2xhYnMgY3JlYXRlZCBmb3IgZ2VuZXJhbCB1c2UuCisgKi8KK3N0YXRpYyBpbnQgYmlvdmVjX2NyZWF0ZV9wb29scyhzdHJ1Y3QgYmlvX3NldCAqYnMsIGludCBwb29sX2VudHJpZXMsIGludCBzY2FsZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBCSU9WRUNfTlJfUE9PTFM7IGkrKykgeworCQlzdHJ1Y3QgYmlvdmVjX3NsYWIgKmJwID0gYnZlY19zbGFicyArIGk7CisJCW1lbXBvb2xfdCAqKmJ2cCA9IGJzLT5idmVjX3Bvb2xzICsgaTsKKworCQlpZiAoaSA+PSBzY2FsZSkKKwkJCXBvb2xfZW50cmllcyA+Pj0gMTsKKworCQkqYnZwID0gbWVtcG9vbF9jcmVhdGUocG9vbF9lbnRyaWVzLCBtZW1wb29sX2FsbG9jX3NsYWIsCisJCQkJCW1lbXBvb2xfZnJlZV9zbGFiLCBicC0+c2xhYik7CisJCWlmICghKmJ2cCkKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYmlvdmVjX2ZyZWVfcG9vbHMoc3RydWN0IGJpb19zZXQgKmJzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEJJT1ZFQ19OUl9QT09MUzsgaSsrKSB7CisJCW1lbXBvb2xfdCAqYnZwID0gYnMtPmJ2ZWNfcG9vbHNbaV07CisKKwkJaWYgKGJ2cCkKKwkJCW1lbXBvb2xfZGVzdHJveShidnApOworCX0KKworfQorCit2b2lkIGJpb3NldF9mcmVlKHN0cnVjdCBiaW9fc2V0ICpicykKK3sKKwlpZiAoYnMtPmJpb19wb29sKQorCQltZW1wb29sX2Rlc3Ryb3koYnMtPmJpb19wb29sKTsKKworCWJpb3ZlY19mcmVlX3Bvb2xzKGJzKTsKKworCWtmcmVlKGJzKTsKK30KKworc3RydWN0IGJpb19zZXQgKmJpb3NldF9jcmVhdGUoaW50IGJpb19wb29sX3NpemUsIGludCBidmVjX3Bvb2xfc2l6ZSwgaW50IHNjYWxlKQoreworCXN0cnVjdCBiaW9fc2V0ICpicyA9IGttYWxsb2Moc2l6ZW9mKCpicyksIEdGUF9LRVJORUwpOworCisJaWYgKCFicykKKwkJcmV0dXJuIE5VTEw7CisKKwltZW1zZXQoYnMsIDAsIHNpemVvZigqYnMpKTsKKwlicy0+YmlvX3Bvb2wgPSBtZW1wb29sX2NyZWF0ZShiaW9fcG9vbF9zaXplLCBtZW1wb29sX2FsbG9jX3NsYWIsCisJCQltZW1wb29sX2ZyZWVfc2xhYiwgYmlvX3NsYWIpOworCisJaWYgKCFicy0+YmlvX3Bvb2wpCisJCWdvdG8gYmFkOworCisJaWYgKCFiaW92ZWNfY3JlYXRlX3Bvb2xzKGJzLCBidmVjX3Bvb2xfc2l6ZSwgc2NhbGUpKQorCQlyZXR1cm4gYnM7CisKK2JhZDoKKwliaW9zZXRfZnJlZShicyk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBiaW92ZWNfaW5pdF9zbGFicyh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEJJT1ZFQ19OUl9QT09MUzsgaSsrKSB7CisJCWludCBzaXplOworCQlzdHJ1Y3QgYmlvdmVjX3NsYWIgKmJ2cyA9IGJ2ZWNfc2xhYnMgKyBpOworCisJCXNpemUgPSBidnMtPm5yX3ZlY3MgKiBzaXplb2Yoc3RydWN0IGJpb192ZWMpOworCQlidnMtPnNsYWIgPSBrbWVtX2NhY2hlX2NyZWF0ZShidnMtPm5hbWUsIHNpemUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMQUJfSFdDQUNIRV9BTElHTnxTTEFCX1BBTklDLCBOVUxMLCBOVUxMKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfYmlvKHZvaWQpCit7CisJaW50IG1lZ2FieXRlcywgYnZlY19wb29sX2VudHJpZXM7CisJaW50IHNjYWxlID0gQklPVkVDX05SX1BPT0xTOworCisJYmlvX3NsYWIgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiYmlvIiwgc2l6ZW9mKHN0cnVjdCBiaW8pLCAwLAorCQkJCVNMQUJfSFdDQUNIRV9BTElHTnxTTEFCX1BBTklDLCBOVUxMLCBOVUxMKTsKKworCWJpb3ZlY19pbml0X3NsYWJzKCk7CisKKwltZWdhYnl0ZXMgPSBucl9mcmVlX3BhZ2VzKCkgPj4gKDIwIC0gUEFHRV9TSElGVCk7CisKKwkvKgorCSAqIGZpbmQgb3V0IHdoZXJlIHRvIHN0YXJ0IHNjYWxpbmcKKwkgKi8KKwlpZiAobWVnYWJ5dGVzIDw9IDE2KQorCQlzY2FsZSA9IDA7CisJZWxzZSBpZiAobWVnYWJ5dGVzIDw9IDMyKQorCQlzY2FsZSA9IDE7CisJZWxzZSBpZiAobWVnYWJ5dGVzIDw9IDY0KQorCQlzY2FsZSA9IDI7CisJZWxzZSBpZiAobWVnYWJ5dGVzIDw9IDk2KQorCQlzY2FsZSA9IDM7CisJZWxzZSBpZiAobWVnYWJ5dGVzIDw9IDEyOCkKKwkJc2NhbGUgPSA0OworCisJLyoKKwkgKiBzY2FsZSBudW1iZXIgb2YgZW50cmllcworCSAqLworCWJ2ZWNfcG9vbF9lbnRyaWVzID0gbWVnYWJ5dGVzICogMjsKKwlpZiAoYnZlY19wb29sX2VudHJpZXMgPiAyNTYpCisJCWJ2ZWNfcG9vbF9lbnRyaWVzID0gMjU2OworCisJZnNfYmlvX3NldCA9IGJpb3NldF9jcmVhdGUoQklPX1BPT0xfU0laRSwgYnZlY19wb29sX2VudHJpZXMsIHNjYWxlKTsKKwlpZiAoIWZzX2Jpb19zZXQpCisJCXBhbmljKCJiaW86IGNhbid0IGFsbG9jYXRlIGJpb3NcbiIpOworCisJYmlvX3NwbGl0X3Bvb2wgPSBtZW1wb29sX2NyZWF0ZShCSU9fU1BMSVRfRU5UUklFUywKKwkJCQliaW9fcGFpcl9hbGxvYywgYmlvX3BhaXJfZnJlZSwgTlVMTCk7CisJaWYgKCFiaW9fc3BsaXRfcG9vbCkKKwkJcGFuaWMoImJpbzogY2FuJ3QgY3JlYXRlIHNwbGl0IHBvb2xcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N1YnN5c19pbml0Y2FsbChpbml0X2Jpbyk7CisKK0VYUE9SVF9TWU1CT0woYmlvX2FsbG9jKTsKK0VYUE9SVF9TWU1CT0woYmlvX3B1dCk7CitFWFBPUlRfU1lNQk9MKGJpb19lbmRpbyk7CitFWFBPUlRfU1lNQk9MKGJpb19pbml0KTsKK0VYUE9SVF9TWU1CT0woX19iaW9fY2xvbmUpOworRVhQT1JUX1NZTUJPTChiaW9fY2xvbmUpOworRVhQT1JUX1NZTUJPTChiaW9fcGh5c19zZWdtZW50cyk7CitFWFBPUlRfU1lNQk9MKGJpb19od19zZWdtZW50cyk7CitFWFBPUlRfU1lNQk9MKGJpb19hZGRfcGFnZSk7CitFWFBPUlRfU1lNQk9MKGJpb19nZXRfbnJfdmVjcyk7CitFWFBPUlRfU1lNQk9MKGJpb19tYXBfdXNlcik7CitFWFBPUlRfU1lNQk9MKGJpb191bm1hcF91c2VyKTsKK0VYUE9SVF9TWU1CT0woYmlvX3BhaXJfcmVsZWFzZSk7CitFWFBPUlRfU1lNQk9MKGJpb19zcGxpdCk7CitFWFBPUlRfU1lNQk9MKGJpb19zcGxpdF9wb29sKTsKK0VYUE9SVF9TWU1CT0woYmlvX2NvcHlfdXNlcik7CitFWFBPUlRfU1lNQk9MKGJpb191bmNvcHlfdXNlcik7CitFWFBPUlRfU1lNQk9MKGJpb3NldF9jcmVhdGUpOworRVhQT1JUX1NZTUJPTChiaW9zZXRfZnJlZSk7CitFWFBPUlRfU1lNQk9MKGJpb19hbGxvY19iaW9zZXQpOwpkaWZmIC0tZ2l0IGEvZnMvYmxvY2tfZGV2LmMgYi9mcy9ibG9ja19kZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTlkMDdjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvYmxvY2tfZGV2LmMKQEAgLTAsMCArMSw5MjMgQEAKKy8qCisgKiAgbGludXgvZnMvYmxvY2tfZGV2LmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICogIENvcHlyaWdodCAoQykgMjAwMSAgQW5kcmVhIEFyY2FuZ2VsaSA8YW5kcmVhQHN1c2UuZGU+IFN1U0UKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYmxrcGcuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L21wYWdlLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK3N0cnVjdCBiZGV2X2lub2RlIHsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlIGJkZXY7CisJc3RydWN0IGlub2RlIHZmc19pbm9kZTsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJkZXZfaW5vZGUgKkJERVZfSShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiBjb250YWluZXJfb2YoaW5vZGUsIHN0cnVjdCBiZGV2X2lub2RlLCB2ZnNfaW5vZGUpOworfQorCitpbmxpbmUgc3RydWN0IGJsb2NrX2RldmljZSAqSV9CREVWKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuICZCREVWX0koaW5vZGUpLT5iZGV2OworfQorCitFWFBPUlRfU1lNQk9MKElfQkRFVik7CisKK3N0YXRpYyBzZWN0b3JfdCBtYXhfYmxvY2soc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKK3sKKwlzZWN0b3JfdCByZXR2YWwgPSB+KChzZWN0b3JfdCkwKTsKKwlsb2ZmX3Qgc3ogPSBpX3NpemVfcmVhZChiZGV2LT5iZF9pbm9kZSk7CisKKwlpZiAoc3opIHsKKwkJdW5zaWduZWQgaW50IHNpemUgPSBibG9ja19zaXplKGJkZXYpOworCQl1bnNpZ25lZCBpbnQgc2l6ZWJpdHMgPSBibGtzaXplX2JpdHMoc2l6ZSk7CisJCXJldHZhbCA9IChzeiA+PiBzaXplYml0cyk7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKKy8qIEtpbGwgX2FsbF8gYnVmZmVycywgZGlydHkgb3Igbm90Li4gKi8KK3N0YXRpYyB2b2lkIGtpbGxfYmRldihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQoreworCWludmFsaWRhdGVfYmRldihiZGV2LCAxKTsKKwl0cnVuY2F0ZV9pbm9kZV9wYWdlcyhiZGV2LT5iZF9pbm9kZS0+aV9tYXBwaW5nLCAwKTsKK30JCisKK2ludCBzZXRfYmxvY2tzaXplKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGludCBzaXplKQoreworCS8qIFNpemUgbXVzdCBiZSBhIHBvd2VyIG9mIHR3bywgYW5kIGJldHdlZW4gNTEyIGFuZCBQQUdFX1NJWkUgKi8KKwlpZiAoc2l6ZSA+IFBBR0VfU0laRSB8fCBzaXplIDwgNTEyIHx8IChzaXplICYgKHNpemUtMSkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFNpemUgY2Fubm90IGJlIHNtYWxsZXIgdGhhbiB0aGUgc2l6ZSBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZSAqLworCWlmIChzaXplIDwgYmRldl9oYXJkc2VjdF9zaXplKGJkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIERvbid0IGNoYW5nZSB0aGUgc2l6ZSBpZiBpdCBpcyBzYW1lIGFzIGN1cnJlbnQgKi8KKwlpZiAoYmRldi0+YmRfYmxvY2tfc2l6ZSAhPSBzaXplKSB7CisJCXN5bmNfYmxvY2tkZXYoYmRldik7CisJCWJkZXYtPmJkX2Jsb2NrX3NpemUgPSBzaXplOworCQliZGV2LT5iZF9pbm9kZS0+aV9ibGtiaXRzID0gYmxrc2l6ZV9iaXRzKHNpemUpOworCQlraWxsX2JkZXYoYmRldik7CisJfQorCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKHNldF9ibG9ja3NpemUpOworCitpbnQgc2Jfc2V0X2Jsb2Nrc2l6ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgc2l6ZSkKK3sKKwlpbnQgYml0cyA9IDk7IC8qIDJeOSA9IDUxMiAqLworCisJaWYgKHNldF9ibG9ja3NpemUoc2ItPnNfYmRldiwgc2l6ZSkpCisJCXJldHVybiAwOworCS8qIElmIHdlIGdldCBoZXJlLCB3ZSBrbm93IHNpemUgaXMgcG93ZXIgb2YgdHdvCisJICogYW5kIGl0J3MgdmFsdWUgaXMgYmV0d2VlbiA1MTIgYW5kIFBBR0VfU0laRSAqLworCXNiLT5zX2Jsb2Nrc2l6ZSA9IHNpemU7CisJZm9yIChzaXplID4+PSAxMDsgc2l6ZTsgc2l6ZSA+Pj0gMSkKKwkJKytiaXRzOworCXNiLT5zX2Jsb2Nrc2l6ZV9iaXRzID0gYml0czsKKwlyZXR1cm4gc2ItPnNfYmxvY2tzaXplOworfQorCitFWFBPUlRfU1lNQk9MKHNiX3NldF9ibG9ja3NpemUpOworCitpbnQgc2JfbWluX2Jsb2Nrc2l6ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgc2l6ZSkKK3sKKwlpbnQgbWluc2l6ZSA9IGJkZXZfaGFyZHNlY3Rfc2l6ZShzYi0+c19iZGV2KTsKKwlpZiAoc2l6ZSA8IG1pbnNpemUpCisJCXNpemUgPSBtaW5zaXplOworCXJldHVybiBzYl9zZXRfYmxvY2tzaXplKHNiLCBzaXplKTsKK30KKworRVhQT1JUX1NZTUJPTChzYl9taW5fYmxvY2tzaXplKTsKKworc3RhdGljIGludAorYmxrZGV2X2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBpYmxvY2ssCisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCBjcmVhdGUpCit7CisJaWYgKGlibG9jayA+PSBtYXhfYmxvY2soSV9CREVWKGlub2RlKSkpIHsKKwkJaWYgKGNyZWF0ZSkKKwkJCXJldHVybiAtRUlPOworCisJCS8qCisJCSAqIGZvciByZWFkcywgd2UncmUganVzdCB0cnlpbmcgdG8gZmlsbCBhIHBhcnRpYWwgcGFnZS4KKwkJICogcmV0dXJuIGEgaG9sZSwgdGhleSB3aWxsIGhhdmUgdG8gY2FsbCBnZXRfYmxvY2sgYWdhaW4KKwkJICogYmVmb3JlIHRoZXkgY2FuIGZpbGwgaXQsIGFuZCB0aGV5IHdpbGwgZ2V0IC1FSU8gYXQgdGhhdAorCQkgKiB0aW1lCisJCSAqLworCQlyZXR1cm4gMDsKKwl9CisJYmgtPmJfYmRldiA9IElfQkRFVihpbm9kZSk7CisJYmgtPmJfYmxvY2tuciA9IGlibG9jazsKKwlzZXRfYnVmZmVyX21hcHBlZChiaCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2Jsa2Rldl9nZXRfYmxvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGlibG9jaywKKwkJdW5zaWduZWQgbG9uZyBtYXhfYmxvY2tzLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgY3JlYXRlKQoreworCXNlY3Rvcl90IGVuZF9ibG9jayA9IG1heF9ibG9jayhJX0JERVYoaW5vZGUpKTsKKworCWlmICgoaWJsb2NrICsgbWF4X2Jsb2NrcykgPiBlbmRfYmxvY2spIHsKKwkJbWF4X2Jsb2NrcyA9IGVuZF9ibG9jayAtIGlibG9jazsKKwkJaWYgKChsb25nKW1heF9ibG9ja3MgPD0gMCkgeworCQkJaWYgKGNyZWF0ZSkKKwkJCQlyZXR1cm4gLUVJTzsJLyogd3JpdGUgZnVsbHkgYmV5b25kIEVPRiAqLworCQkJLyoKKwkJCSAqIEl0IGlzIGEgcmVhZCB3aGljaCBpcyBmdWxseSBiZXlvbmQgRU9GLiAgV2UgcmV0dXJuCisJCQkgKiBhICFidWZmZXJfbWFwcGVkIGJ1ZmZlcgorCQkJICovCisJCQltYXhfYmxvY2tzID0gMDsKKwkJfQorCX0KKworCWJoLT5iX2JkZXYgPSBJX0JERVYoaW5vZGUpOworCWJoLT5iX2Jsb2NrbnIgPSBpYmxvY2s7CisJYmgtPmJfc2l6ZSA9IG1heF9ibG9ja3MgPDwgaW5vZGUtPmlfYmxrYml0czsKKwlpZiAobWF4X2Jsb2NrcykKKwkJc2V0X2J1ZmZlcl9tYXBwZWQoYmgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdAorYmxrZGV2X2RpcmVjdF9JTyhpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCisJCQlsb2ZmX3Qgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIG5yX3NlZ3MpCit7CisJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CisKKwlyZXR1cm4gYmxvY2tkZXZfZGlyZWN0X0lPX25vX2xvY2tpbmcocncsIGlvY2IsIGlub2RlLCBJX0JERVYoaW5vZGUpLAorCQkJCWlvdiwgb2Zmc2V0LCBucl9zZWdzLCBibGtkZXZfZ2V0X2Jsb2NrcywgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgYmxrZGV2X3dyaXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7CisJcmV0dXJuIGJsb2NrX3dyaXRlX2Z1bGxfcGFnZShwYWdlLCBibGtkZXZfZ2V0X2Jsb2NrLCB3YmMpOworfQorCitzdGF0aWMgaW50IGJsa2Rldl9yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqIGZpbGUsIHN0cnVjdCBwYWdlICogcGFnZSkKK3sKKwlyZXR1cm4gYmxvY2tfcmVhZF9mdWxsX3BhZ2UocGFnZSwgYmxrZGV2X2dldF9ibG9jayk7Cit9CisKK3N0YXRpYyBpbnQgYmxrZGV2X3ByZXBhcmVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKwlyZXR1cm4gYmxvY2tfcHJlcGFyZV93cml0ZShwYWdlLCBmcm9tLCB0bywgYmxrZGV2X2dldF9ibG9jayk7Cit9CisKK3N0YXRpYyBpbnQgYmxrZGV2X2NvbW1pdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCXJldHVybiBibG9ja19jb21taXRfd3JpdGUocGFnZSwgZnJvbSwgdG8pOworfQorCisvKgorICogcHJpdmF0ZSBsbHNlZWs6CisgKiBmb3IgYSBibG9jayBzcGVjaWFsIGZpbGUgZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2l6ZSBpcyB6ZXJvCisgKiBzbyB3ZSBjb21wdXRlIHRoZSBzaXplIGJ5IGhhbmQgKGp1c3QgYXMgaW4gYmxvY2tfcmVhZC93cml0ZSBhYm92ZSkKKyAqLworc3RhdGljIGxvZmZfdCBibG9ja19sbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsIGludCBvcmlnaW4pCit7CisJc3RydWN0IGlub2RlICpiZF9pbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKKwlsb2ZmX3Qgc2l6ZTsKKwlsb2ZmX3QgcmV0dmFsOworCisJZG93bigmYmRfaW5vZGUtPmlfc2VtKTsKKwlzaXplID0gaV9zaXplX3JlYWQoYmRfaW5vZGUpOworCisJc3dpdGNoIChvcmlnaW4pIHsKKwkJY2FzZSAyOgorCQkJb2Zmc2V0ICs9IHNpemU7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJb2Zmc2V0ICs9IGZpbGUtPmZfcG9zOworCX0KKwlyZXR2YWwgPSAtRUlOVkFMOworCWlmIChvZmZzZXQgPj0gMCAmJiBvZmZzZXQgPD0gc2l6ZSkgeworCQlpZiAob2Zmc2V0ICE9IGZpbGUtPmZfcG9zKSB7CisJCQlmaWxlLT5mX3BvcyA9IG9mZnNldDsKKwkJfQorCQlyZXR2YWwgPSBvZmZzZXQ7CisJfQorCXVwKCZiZF9pbm9kZS0+aV9zZW0pOworCXJldHVybiByZXR2YWw7Cit9CisJCisvKgorICoJRmlscCBpcyBuZXZlciBOVUxMOyB0aGUgb25seSBjYXNlIHdoZW4gLT5mc3luYygpIGlzIGNhbGxlZCB3aXRoCisgKglOVUxMIGZpcnN0IGFyZ3VtZW50IGlzIG5mc2Rfc3luY19kaXIoKSBhbmQgdGhhdCdzIG5vdCBhIGRpcmVjdG9yeS4KKyAqLworIAorc3RhdGljIGludCBibG9ja19mc3luYyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgZGF0YXN5bmMpCit7CisJcmV0dXJuIHN5bmNfYmxvY2tkZXYoSV9CREVWKGZpbHAtPmZfbWFwcGluZy0+aG9zdCkpOworfQorCisvKgorICogcHNldWRvLWZzCisgKi8KKworc3RhdGljICBfX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcCBERUZJTkVfU1BJTkxPQ0soYmRldl9sb2NrKTsKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKiBiZGV2X2NhY2hlcDsKKworc3RhdGljIHN0cnVjdCBpbm9kZSAqYmRldl9hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBiZGV2X2lub2RlICplaSA9IGttZW1fY2FjaGVfYWxsb2MoYmRldl9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwlpZiAoIWVpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gJmVpLT52ZnNfaW5vZGU7Cit9CisKK3N0YXRpYyB2b2lkIGJkZXZfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBiZGV2X2lub2RlICpiZGkgPSBCREVWX0koaW5vZGUpOworCisJYmRpLT5iZGV2LmJkX2lub2RlX2JhY2tpbmdfZGV2X2luZm8gPSBOVUxMOworCWttZW1fY2FjaGVfZnJlZShiZGV2X2NhY2hlcCwgYmRpKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKiBmb28sIGttZW1fY2FjaGVfdCAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgYmRldl9pbm9kZSAqZWkgPSAoc3RydWN0IGJkZXZfaW5vZGUgKikgZm9vOworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSAmZWktPmJkZXY7CisKKwlpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRll8U0xBQl9DVE9SX0NPTlNUUlVDVE9SKSkgPT0KKwkgICAgU0xBQl9DVE9SX0NPTlNUUlVDVE9SKQorCXsKKwkJbWVtc2V0KGJkZXYsIDAsIHNpemVvZigqYmRldikpOworCQlzZW1hX2luaXQoJmJkZXYtPmJkX3NlbSwgMSk7CisJCXNlbWFfaW5pdCgmYmRldi0+YmRfbW91bnRfc2VtLCAxKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmJkZXYtPmJkX2lub2Rlcyk7CisJCUlOSVRfTElTVF9IRUFEKCZiZGV2LT5iZF9saXN0KTsKKwkJaW5vZGVfaW5pdF9vbmNlKCZlaS0+dmZzX2lub2RlKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2JkX2ZvcmdldChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWxpc3RfZGVsX2luaXQoJmlub2RlLT5pX2RldmljZXMpOworCWlub2RlLT5pX2JkZXYgPSBOVUxMOworCWlub2RlLT5pX21hcHBpbmcgPSAmaW5vZGUtPmlfZGF0YTsKK30KKworc3RhdGljIHZvaWQgYmRldl9jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYgPSAmQkRFVl9JKGlub2RlKS0+YmRldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCXNwaW5fbG9jaygmYmRldl9sb2NrKTsKKwl3aGlsZSAoIChwID0gYmRldi0+YmRfaW5vZGVzLm5leHQpICE9ICZiZGV2LT5iZF9pbm9kZXMgKSB7CisJCV9fYmRfZm9yZ2V0KGxpc3RfZW50cnkocCwgc3RydWN0IGlub2RlLCBpX2RldmljZXMpKTsKKwl9CisJbGlzdF9kZWxfaW5pdCgmYmRldi0+YmRfbGlzdCk7CisJc3Bpbl91bmxvY2soJmJkZXZfbG9jayk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBiZGV2X3NvcHMgPSB7CisJLnN0YXRmcyA9IHNpbXBsZV9zdGF0ZnMsCisJLmFsbG9jX2lub2RlID0gYmRldl9hbGxvY19pbm9kZSwKKwkuZGVzdHJveV9pbm9kZSA9IGJkZXZfZGVzdHJveV9pbm9kZSwKKwkuZHJvcF9pbm9kZSA9IGdlbmVyaWNfZGVsZXRlX2lub2RlLAorCS5jbGVhcl9pbm9kZSA9IGJkZXZfY2xlYXJfaW5vZGUsCit9OworCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpiZF9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZ2V0X3NiX3BzZXVkbyhmc190eXBlLCAiYmRldjoiLCAmYmRldl9zb3BzLCAweDYyNjQ2NTc2KTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGJkX3R5cGUgPSB7CisJLm5hbWUJCT0gImJkZXYiLAorCS5nZXRfc2IJCT0gYmRfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9hbm9uX3N1cGVyLAorfTsKKworc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqYmRfbW50Oworc3RydWN0IHN1cGVyX2Jsb2NrICpibG9ja2Rldl9zdXBlcmJsb2NrOworCit2b2lkIF9faW5pdCBiZGV2X2NhY2hlX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCWJkZXZfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoImJkZXZfY2FjaGUiLCBzaXplb2Yoc3RydWN0IGJkZXZfaW5vZGUpLAorCQkJMCwgU0xBQl9IV0NBQ0hFX0FMSUdOfFNMQUJfUkVDTEFJTV9BQ0NPVU5UfFNMQUJfUEFOSUMsCisJCQlpbml0X29uY2UsIE5VTEwpOworCWVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmJkX3R5cGUpOworCWlmIChlcnIpCisJCXBhbmljKCJDYW5ub3QgcmVnaXN0ZXIgYmRldiBwc2V1ZG8tZnMiKTsKKwliZF9tbnQgPSBrZXJuX21vdW50KCZiZF90eXBlKTsKKwllcnIgPSBQVFJfRVJSKGJkX21udCk7CisJaWYgKElTX0VSUihiZF9tbnQpKQorCQlwYW5pYygiQ2Fubm90IGNyZWF0ZSBiZGV2IHBzZXVkby1mcyIpOworCWJsb2NrZGV2X3N1cGVyYmxvY2sgPSBiZF9tbnQtPm1udF9zYjsJLyogRm9yIHdyaXRlYmFjayAqLworfQorCisvKgorICogTW9zdCBsaWtlbHkgX3ZlcnlfIGJhZCBvbmUgLSBidXQgdGhlbiBpdCdzIGhhcmRseSBjcml0aWNhbCBmb3Igc21hbGwKKyAqIC9kZXYgYW5kIGNhbiBiZSBmaXhlZCB3aGVuIHNvbWVib2R5IHdpbGwgbmVlZCByZWFsbHkgbGFyZ2Ugb25lLgorICogS2VlcCBpbiBtaW5kIHRoYXQgaXQgd2lsbCBiZSBmZWQgdGhyb3VnaCBpY2FjaGUgaGFzaCBmdW5jdGlvbiB0b28uCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBoYXNoKGRldl90IGRldikKK3sKKwlyZXR1cm4gTUFKT1IoZGV2KStNSU5PUihkZXYpOworfQorCitzdGF0aWMgaW50IGJkZXZfdGVzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpkYXRhKQoreworCXJldHVybiBCREVWX0koaW5vZGUpLT5iZGV2LmJkX2RldiA9PSAqKGRldl90ICopZGF0YTsKK30KKworc3RhdGljIGludCBiZGV2X3NldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpkYXRhKQoreworCUJERVZfSShpbm9kZSktPmJkZXYuYmRfZGV2ID0gKihkZXZfdCAqKWRhdGE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBMSVNUX0hFQUQoYWxsX2JkZXZzKTsKKworc3RydWN0IGJsb2NrX2RldmljZSAqYmRnZXQoZGV2X3QgZGV2KQoreworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CisJc3RydWN0IGlub2RlICppbm9kZTsKKworCWlub2RlID0gaWdldDVfbG9ja2VkKGJkX21udC0+bW50X3NiLCBoYXNoKGRldiksCisJCQliZGV2X3Rlc3QsIGJkZXZfc2V0LCAmZGV2KTsKKworCWlmICghaW5vZGUpCisJCXJldHVybiBOVUxMOworCisJYmRldiA9ICZCREVWX0koaW5vZGUpLT5iZGV2OworCisJaWYgKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpIHsKKwkJYmRldi0+YmRfY29udGFpbnMgPSBOVUxMOworCQliZGV2LT5iZF9pbm9kZSA9IGlub2RlOworCQliZGV2LT5iZF9ibG9ja19zaXplID0gKDEgPDwgaW5vZGUtPmlfYmxrYml0cyk7CisJCWJkZXYtPmJkX3BhcnRfY291bnQgPSAwOworCQliZGV2LT5iZF9pbnZhbGlkYXRlZCA9IDA7CisJCWlub2RlLT5pX21vZGUgPSBTX0lGQkxLOworCQlpbm9kZS0+aV9yZGV2ID0gZGV2OworCQlpbm9kZS0+aV9iZGV2ID0gYmRldjsKKwkJaW5vZGUtPmlfZGF0YS5hX29wcyA9ICZkZWZfYmxrX2FvcHM7CisJCW1hcHBpbmdfc2V0X2dmcF9tYXNrKCZpbm9kZS0+aV9kYXRhLCBHRlBfVVNFUik7CisJCWlub2RlLT5pX2RhdGEuYmFja2luZ19kZXZfaW5mbyA9ICZkZWZhdWx0X2JhY2tpbmdfZGV2X2luZm87CisJCXNwaW5fbG9jaygmYmRldl9sb2NrKTsKKwkJbGlzdF9hZGQoJmJkZXYtPmJkX2xpc3QsICZhbGxfYmRldnMpOworCQlzcGluX3VubG9jaygmYmRldl9sb2NrKTsKKwkJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CisJfQorCXJldHVybiBiZGV2OworfQorCitFWFBPUlRfU1lNQk9MKGJkZ2V0KTsKKworbG9uZyBucl9ibG9ja2Rldl9wYWdlcyh2b2lkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJbG9uZyByZXQgPSAwOworCXNwaW5fbG9jaygmYmRldl9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoKHAsICZhbGxfYmRldnMpIHsKKwkJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKKwkJYmRldiA9IGxpc3RfZW50cnkocCwgc3RydWN0IGJsb2NrX2RldmljZSwgYmRfbGlzdCk7CisJCXJldCArPSBiZGV2LT5iZF9pbm9kZS0+aV9tYXBwaW5nLT5ucnBhZ2VzOworCX0KKwlzcGluX3VubG9jaygmYmRldl9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGJkcHV0KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJaXB1dChiZGV2LT5iZF9pbm9kZSk7Cit9CisKK0VYUE9SVF9TWU1CT0woYmRwdXQpOworIAorc3RhdGljIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkX2FjcXVpcmUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OworCXNwaW5fbG9jaygmYmRldl9sb2NrKTsKKwliZGV2ID0gaW5vZGUtPmlfYmRldjsKKwlpZiAoYmRldiAmJiBpZ3JhYihiZGV2LT5iZF9pbm9kZSkpIHsKKwkJc3Bpbl91bmxvY2soJmJkZXZfbG9jayk7CisJCXJldHVybiBiZGV2OworCX0KKwlzcGluX3VubG9jaygmYmRldl9sb2NrKTsKKwliZGV2ID0gYmRnZXQoaW5vZGUtPmlfcmRldik7CisJaWYgKGJkZXYpIHsKKwkJc3Bpbl9sb2NrKCZiZGV2X2xvY2spOworCQlpZiAoaW5vZGUtPmlfYmRldikKKwkJCV9fYmRfZm9yZ2V0KGlub2RlKTsKKwkJaW5vZGUtPmlfYmRldiA9IGJkZXY7CisJCWlub2RlLT5pX21hcHBpbmcgPSBiZGV2LT5iZF9pbm9kZS0+aV9tYXBwaW5nOworCQlsaXN0X2FkZCgmaW5vZGUtPmlfZGV2aWNlcywgJmJkZXYtPmJkX2lub2Rlcyk7CisJCXNwaW5fdW5sb2NrKCZiZGV2X2xvY2spOworCX0KKwlyZXR1cm4gYmRldjsKK30KKworLyogQ2FsbCB3aGVuIHlvdSBmcmVlIGlub2RlICovCisKK3ZvaWQgYmRfZm9yZ2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3Bpbl9sb2NrKCZiZGV2X2xvY2spOworCWlmIChpbm9kZS0+aV9iZGV2KQorCQlfX2JkX2ZvcmdldChpbm9kZSk7CisJc3Bpbl91bmxvY2soJmJkZXZfbG9jayk7Cit9CisKK2ludCBiZF9jbGFpbShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCB2b2lkICpob2xkZXIpCit7CisJaW50IHJlczsKKwlzcGluX2xvY2soJmJkZXZfbG9jayk7CisKKwkvKiBmaXJzdCBkZWNpZGUgcmVzdWx0ICovCisJaWYgKGJkZXYtPmJkX2hvbGRlciA9PSBob2xkZXIpCisJCXJlcyA9IDA7CSAvKiBhbHJlYWR5IGEgaG9sZGVyICovCisJZWxzZSBpZiAoYmRldi0+YmRfaG9sZGVyICE9IE5VTEwpCisJCXJlcyA9IC1FQlVTWTsgCSAvKiBoZWxkIGJ5IHNvbWVvbmUgZWxzZSAqLworCWVsc2UgaWYgKGJkZXYtPmJkX2NvbnRhaW5zID09IGJkZXYpCisJCXJlcyA9IDA7ICAJIC8qIGlzIGEgd2hvbGUgZGV2aWNlIHdoaWNoIGlzbid0IGhlbGQgKi8KKworCWVsc2UgaWYgKGJkZXYtPmJkX2NvbnRhaW5zLT5iZF9ob2xkZXIgPT0gYmRfY2xhaW0pCisJCXJlcyA9IDA7IAkgLyogaXMgYSBwYXJ0aXRpb24gb2YgYSBkZXZpY2UgdGhhdCBpcyBiZWluZyBwYXJ0aXRpb25lZCAqLworCWVsc2UgaWYgKGJkZXYtPmJkX2NvbnRhaW5zLT5iZF9ob2xkZXIgIT0gTlVMTCkKKwkJcmVzID0gLUVCVVNZOwkgLyogaXMgYSBwYXJ0aXRpb24gb2YgYSBoZWxkIGRldmljZSAqLworCWVsc2UKKwkJcmVzID0gMDsJIC8qIGlzIGEgcGFydGl0aW9uIG9mIGFuIHVuLWhlbGQgZGV2aWNlICovCisKKwkvKiBub3cgaW1wb3NlIGNoYW5nZSAqLworCWlmIChyZXM9PTApIHsKKwkJLyogbm90ZSB0aGF0IGZvciBhIHdob2xlIGRldmljZSBiZF9ob2xkZXJzCisJCSAqIHdpbGwgYmUgaW5jcmVtZW50ZWQgdHdpY2UsIGFuZCBiZF9ob2xkZXIgd2lsbAorCQkgKiBiZSBzZXQgdG8gYmRfY2xhaW0gYmVmb3JlIGJlaW5nIHNldCB0byBob2xkZXIKKwkJICovCisJCWJkZXYtPmJkX2NvbnRhaW5zLT5iZF9ob2xkZXJzICsrOworCQliZGV2LT5iZF9jb250YWlucy0+YmRfaG9sZGVyID0gYmRfY2xhaW07CisJCWJkZXYtPmJkX2hvbGRlcnMrKzsKKwkJYmRldi0+YmRfaG9sZGVyID0gaG9sZGVyOworCX0KKwlzcGluX3VubG9jaygmYmRldl9sb2NrKTsKKwlyZXR1cm4gcmVzOworfQorCitFWFBPUlRfU1lNQk9MKGJkX2NsYWltKTsKKwordm9pZCBiZF9yZWxlYXNlKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJc3Bpbl9sb2NrKCZiZGV2X2xvY2spOworCWlmICghLS1iZGV2LT5iZF9jb250YWlucy0+YmRfaG9sZGVycykKKwkJYmRldi0+YmRfY29udGFpbnMtPmJkX2hvbGRlciA9IE5VTEw7CisJaWYgKCEtLWJkZXYtPmJkX2hvbGRlcnMpCisJCWJkZXYtPmJkX2hvbGRlciA9IE5VTEw7CisJc3Bpbl91bmxvY2soJmJkZXZfbG9jayk7Cit9CisKK0VYUE9SVF9TWU1CT0woYmRfcmVsZWFzZSk7CisKKy8qCisgKiBUcmllcyB0byBvcGVuIGJsb2NrIGRldmljZSBieSBkZXZpY2UgbnVtYmVyLiAgVXNlIGl0IE9OTFkgaWYgeW91CisgKiByZWFsbHkgZG8gbm90IGhhdmUgYW55dGhpbmcgYmV0dGVyIC0gaS5lLiB3aGVuIHlvdSBhcmUgYmVoaW5kIGEKKyAqIHRydWx5IHN1Y2t5IGludGVyZmFjZSBhbmQgYWxsIHlvdSBhcmUgZ2l2ZW4gaXMgYSBkZXZpY2UgbnVtYmVyLiAgX05ldmVyXworICogdG8gYmUgdXNlZCBmb3IgaW50ZXJuYWwgcHVycG9zZXMuICBJZiB5b3UgZXZlciBuZWVkIGl0IC0gcmVjb25zaWRlcgorICogeW91ciBBUEkuCisgKi8KK3N0cnVjdCBibG9ja19kZXZpY2UgKm9wZW5fYnlfZGV2bnVtKGRldl90IGRldiwgdW5zaWduZWQgbW9kZSkKK3sKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gYmRnZXQoZGV2KTsKKwlpbnQgZXJyID0gLUVOT01FTTsKKwlpbnQgZmxhZ3MgPSBtb2RlICYgRk1PREVfV1JJVEUgPyBPX1JEV1IgOiBPX1JET05MWTsKKwlpZiAoYmRldikKKwkJZXJyID0gYmxrZGV2X2dldChiZGV2LCBtb2RlLCBmbGFncyk7CisJcmV0dXJuIGVyciA/IEVSUl9QVFIoZXJyKSA6IGJkZXY7Cit9CisKK0VYUE9SVF9TWU1CT0wob3Blbl9ieV9kZXZudW0pOworCisvKgorICogVGhpcyByb3V0aW5lIGNoZWNrcyB3aGV0aGVyIGEgcmVtb3ZhYmxlIG1lZGlhIGhhcyBiZWVuIGNoYW5nZWQsCisgKiBhbmQgaW52YWxpZGF0ZXMgYWxsIGJ1ZmZlci1jYWNoZS1lbnRyaWVzIGluIHRoYXQgY2FzZS4gVGhpcworICogaXMgYSByZWxhdGl2ZWx5IHNsb3cgcm91dGluZSwgc28gd2UgaGF2ZSB0byB0cnkgdG8gbWluaW1pemUgdXNpbmcKKyAqIGl0LiBUaHVzIGl0IGlzIGNhbGxlZCBvbmx5IHVwb24gYSAnbW91bnQnIG9yICdvcGVuJy4gVGhpcworICogaXMgdGhlIGJlc3Qgd2F5IG9mIGNvbWJpbmluZyBzcGVlZCBhbmQgdXRpbGl0eSwgSSB0aGluay4KKyAqIFBlb3BsZSBjaGFuZ2luZyBkaXNrZXR0ZXMgaW4gdGhlIG1pZGRsZSBvZiBhbiBvcGVyYXRpb24gZGVzZXJ2ZQorICogdG8gbG9zZSA6LSkKKyAqLworaW50IGNoZWNrX2Rpc2tfY2hhbmdlKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBiZGV2LT5iZF9kaXNrOworCXN0cnVjdCBibG9ja19kZXZpY2Vfb3BlcmF0aW9ucyAqIGJkb3BzID0gZGlzay0+Zm9wczsKKworCWlmICghYmRvcHMtPm1lZGlhX2NoYW5nZWQpCisJCXJldHVybiAwOworCWlmICghYmRvcHMtPm1lZGlhX2NoYW5nZWQoYmRldi0+YmRfZGlzaykpCisJCXJldHVybiAwOworCisJaWYgKF9faW52YWxpZGF0ZV9kZXZpY2UoYmRldiwgMCkpCisJCXByaW50aygiVkZTOiBidXN5IGlub2RlcyBvbiBjaGFuZ2VkIG1lZGlhLlxuIik7CisKKwlpZiAoYmRvcHMtPnJldmFsaWRhdGVfZGlzaykKKwkJYmRvcHMtPnJldmFsaWRhdGVfZGlzayhiZGV2LT5iZF9kaXNrKTsKKwlpZiAoYmRldi0+YmRfZGlzay0+bWlub3JzID4gMSkKKwkJYmRldi0+YmRfaW52YWxpZGF0ZWQgPSAxOworCXJldHVybiAxOworfQorCitFWFBPUlRfU1lNQk9MKGNoZWNrX2Rpc2tfY2hhbmdlKTsKKwordm9pZCBiZF9zZXRfc2l6ZShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBsb2ZmX3Qgc2l6ZSkKK3sKKwl1bnNpZ25lZCBic2l6ZSA9IGJkZXZfaGFyZHNlY3Rfc2l6ZShiZGV2KTsKKworCWJkZXYtPmJkX2lub2RlLT5pX3NpemUgPSBzaXplOworCXdoaWxlIChic2l6ZSA8IFBBR0VfQ0FDSEVfU0laRSkgeworCQlpZiAoc2l6ZSAmIGJzaXplKQorCQkJYnJlYWs7CisJCWJzaXplIDw8PSAxOworCX0KKwliZGV2LT5iZF9ibG9ja19zaXplID0gYnNpemU7CisJYmRldi0+YmRfaW5vZGUtPmlfYmxrYml0cyA9IGJsa3NpemVfYml0cyhic2l6ZSk7Cit9CitFWFBPUlRfU1lNQk9MKGJkX3NldF9zaXplKTsKKworc3RhdGljIGludCBkb19vcGVuKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBtb2R1bGUgKm93bmVyID0gTlVMTDsKKwlzdHJ1Y3QgZ2VuZGlzayAqZGlzazsKKwlpbnQgcmV0ID0gLUVOWElPOworCWludCBwYXJ0OworCisJZmlsZS0+Zl9tYXBwaW5nID0gYmRldi0+YmRfaW5vZGUtPmlfbWFwcGluZzsKKwlsb2NrX2tlcm5lbCgpOworCWRpc2sgPSBnZXRfZ2VuZGlzayhiZGV2LT5iZF9kZXYsICZwYXJ0KTsKKwlpZiAoIWRpc2spIHsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQliZHB1dChiZGV2KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJb3duZXIgPSBkaXNrLT5mb3BzLT5vd25lcjsKKworCWRvd24oJmJkZXYtPmJkX3NlbSk7CisJaWYgKCFiZGV2LT5iZF9vcGVuZXJzKSB7CisJCWJkZXYtPmJkX2Rpc2sgPSBkaXNrOworCQliZGV2LT5iZF9jb250YWlucyA9IGJkZXY7CisJCWlmICghcGFydCkgeworCQkJc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaTsKKwkJCWlmIChkaXNrLT5mb3BzLT5vcGVuKSB7CisJCQkJcmV0ID0gZGlzay0+Zm9wcy0+b3BlbihiZGV2LT5iZF9pbm9kZSwgZmlsZSk7CisJCQkJaWYgKHJldCkKKwkJCQkJZ290byBvdXRfZmlyc3Q7CisJCQl9CisJCQlpZiAoIWJkZXYtPmJkX29wZW5lcnMpIHsKKwkJCQliZF9zZXRfc2l6ZShiZGV2LChsb2ZmX3QpZ2V0X2NhcGFjaXR5KGRpc2spPDw5KTsKKwkJCQliZGkgPSBibGtfZ2V0X2JhY2tpbmdfZGV2X2luZm8oYmRldik7CisJCQkJaWYgKGJkaSA9PSBOVUxMKQorCQkJCQliZGkgPSAmZGVmYXVsdF9iYWNraW5nX2Rldl9pbmZvOworCQkJCWJkZXYtPmJkX2lub2RlLT5pX2RhdGEuYmFja2luZ19kZXZfaW5mbyA9IGJkaTsKKwkJCX0KKwkJCWlmIChiZGV2LT5iZF9pbnZhbGlkYXRlZCkKKwkJCQlyZXNjYW5fcGFydGl0aW9ucyhkaXNrLCBiZGV2KTsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBoZF9zdHJ1Y3QgKnA7CisJCQlzdHJ1Y3QgYmxvY2tfZGV2aWNlICp3aG9sZTsKKwkJCXdob2xlID0gYmRnZXRfZGlzayhkaXNrLCAwKTsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlpZiAoIXdob2xlKQorCQkJCWdvdG8gb3V0X2ZpcnN0OworCQkJcmV0ID0gYmxrZGV2X2dldCh3aG9sZSwgZmlsZS0+Zl9tb2RlLCBmaWxlLT5mX2ZsYWdzKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBvdXRfZmlyc3Q7CisJCQliZGV2LT5iZF9jb250YWlucyA9IHdob2xlOworCQkJZG93bigmd2hvbGUtPmJkX3NlbSk7CisJCQl3aG9sZS0+YmRfcGFydF9jb3VudCsrOworCQkJcCA9IGRpc2stPnBhcnRbcGFydCAtIDFdOworCQkJYmRldi0+YmRfaW5vZGUtPmlfZGF0YS5iYWNraW5nX2Rldl9pbmZvID0KKwkJCSAgIHdob2xlLT5iZF9pbm9kZS0+aV9kYXRhLmJhY2tpbmdfZGV2X2luZm87CisJCQlpZiAoIShkaXNrLT5mbGFncyAmIEdFTkhEX0ZMX1VQKSB8fCAhcCB8fCAhcC0+bnJfc2VjdHMpIHsKKwkJCQl3aG9sZS0+YmRfcGFydF9jb3VudC0tOworCQkJCXVwKCZ3aG9sZS0+YmRfc2VtKTsKKwkJCQlyZXQgPSAtRU5YSU87CisJCQkJZ290byBvdXRfZmlyc3Q7CisJCQl9CisJCQlrb2JqZWN0X2dldCgmcC0+a29iaik7CisJCQliZGV2LT5iZF9wYXJ0ID0gcDsKKwkJCWJkX3NldF9zaXplKGJkZXYsIChsb2ZmX3QpIHAtPm5yX3NlY3RzIDw8IDkpOworCQkJdXAoJndob2xlLT5iZF9zZW0pOworCQl9CisJfSBlbHNlIHsKKwkJcHV0X2Rpc2soZGlzayk7CisJCW1vZHVsZV9wdXQob3duZXIpOworCQlpZiAoYmRldi0+YmRfY29udGFpbnMgPT0gYmRldikgeworCQkJaWYgKGJkZXYtPmJkX2Rpc2stPmZvcHMtPm9wZW4pIHsKKwkJCQlyZXQgPSBiZGV2LT5iZF9kaXNrLT5mb3BzLT5vcGVuKGJkZXYtPmJkX2lub2RlLCBmaWxlKTsKKwkJCQlpZiAocmV0KQorCQkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWlmIChiZGV2LT5iZF9pbnZhbGlkYXRlZCkKKwkJCQlyZXNjYW5fcGFydGl0aW9ucyhiZGV2LT5iZF9kaXNrLCBiZGV2KTsKKwkJfSBlbHNlIHsKKwkJCWRvd24oJmJkZXYtPmJkX2NvbnRhaW5zLT5iZF9zZW0pOworCQkJYmRldi0+YmRfY29udGFpbnMtPmJkX3BhcnRfY291bnQrKzsKKwkJCXVwKCZiZGV2LT5iZF9jb250YWlucy0+YmRfc2VtKTsKKwkJfQorCX0KKwliZGV2LT5iZF9vcGVuZXJzKys7CisJdXAoJmJkZXYtPmJkX3NlbSk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworCitvdXRfZmlyc3Q6CisJYmRldi0+YmRfZGlzayA9IE5VTEw7CisJYmRldi0+YmRfaW5vZGUtPmlfZGF0YS5iYWNraW5nX2Rldl9pbmZvID0gJmRlZmF1bHRfYmFja2luZ19kZXZfaW5mbzsKKwlpZiAoYmRldiAhPSBiZGV2LT5iZF9jb250YWlucykKKwkJYmxrZGV2X3B1dChiZGV2LT5iZF9jb250YWlucyk7CisJYmRldi0+YmRfY29udGFpbnMgPSBOVUxMOworCXB1dF9kaXNrKGRpc2spOworCW1vZHVsZV9wdXQob3duZXIpOworb3V0OgorCXVwKCZiZGV2LT5iZF9zZW0pOworCXVubG9ja19rZXJuZWwoKTsKKwlpZiAocmV0KQorCQliZHB1dChiZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYmxrZGV2X2dldChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBtb2RlX3QgbW9kZSwgdW5zaWduZWQgZmxhZ3MpCit7CisJLyoKKwkgKiBUaGlzIGNyb2NrbG9hZCBpcyBkdWUgdG8gYmFkIGNob2ljZSBvZiAtPm9wZW4oKSB0eXBlLgorCSAqIEl0IHdpbGwgZ28gYXdheS4KKwkgKiBGb3Igbm93LCBibG9jayBkZXZpY2UgLT5vcGVuKCkgcm91dGluZSBtdXN0IF9ub3RfCisJICogZXhhbWluZSBhbnl0aGluZyBpbiAnaW5vZGUnIGFyZ3VtZW50IGV4Y2VwdCAtPmlfcmRldi4KKwkgKi8KKwlzdHJ1Y3QgZmlsZSBmYWtlX2ZpbGUgPSB7fTsKKwlzdHJ1Y3QgZGVudHJ5IGZha2VfZGVudHJ5ID0ge307CisJZmFrZV9maWxlLmZfbW9kZSA9IG1vZGU7CisJZmFrZV9maWxlLmZfZmxhZ3MgPSBmbGFnczsKKwlmYWtlX2ZpbGUuZl9kZW50cnkgPSAmZmFrZV9kZW50cnk7CisJZmFrZV9kZW50cnkuZF9pbm9kZSA9IGJkZXYtPmJkX2lub2RlOworCisJcmV0dXJuIGRvX29wZW4oYmRldiwgJmZha2VfZmlsZSk7Cit9CisKK0VYUE9SVF9TWU1CT0woYmxrZGV2X2dldCk7CisKK3N0YXRpYyBpbnQgYmxrZGV2X29wZW4oc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OworCWludCByZXM7CisKKwkvKgorCSAqIFByZXNlcnZlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGFuZCBhbGxvdyBsYXJnZSBmaWxlIGFjY2VzcworCSAqIGV2ZW4gaWYgdXNlcnNwYWNlIGRvZXNuJ3QgYXNrIGZvciBpdCBleHBsaWNpdGx5LiBTb21lIG1rZnMKKwkgKiBiaW5hcnkgbmVlZHMgaXQuIFdlIG1pZ2h0IHdhbnQgdG8gZHJvcCB0aGlzIHdvcmthcm91bmQKKwkgKiBkdXJpbmcgYW4gdW5zdGFibGUgYnJhbmNoLgorCSAqLworCWZpbHAtPmZfZmxhZ3MgfD0gT19MQVJHRUZJTEU7CisKKwliZGV2ID0gYmRfYWNxdWlyZShpbm9kZSk7CisKKwlyZXMgPSBkb19vcGVuKGJkZXYsIGZpbHApOworCWlmIChyZXMpCisJCXJldHVybiByZXM7CisKKwlpZiAoIShmaWxwLT5mX2ZsYWdzICYgT19FWENMKSApCisJCXJldHVybiAwOworCisJaWYgKCEocmVzID0gYmRfY2xhaW0oYmRldiwgZmlscCkpKQorCQlyZXR1cm4gMDsKKworCWJsa2Rldl9wdXQoYmRldik7CisJcmV0dXJuIHJlczsKK30KKworaW50IGJsa2Rldl9wdXQoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgaW5vZGUgKmJkX2lub2RlID0gYmRldi0+YmRfaW5vZGU7CisJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBiZGV2LT5iZF9kaXNrOworCisJZG93bigmYmRldi0+YmRfc2VtKTsKKwlsb2NrX2tlcm5lbCgpOworCWlmICghLS1iZGV2LT5iZF9vcGVuZXJzKSB7CisJCXN5bmNfYmxvY2tkZXYoYmRldik7CisJCWtpbGxfYmRldihiZGV2KTsKKwl9CisJaWYgKGJkZXYtPmJkX2NvbnRhaW5zID09IGJkZXYpIHsKKwkJaWYgKGRpc2stPmZvcHMtPnJlbGVhc2UpCisJCQlyZXQgPSBkaXNrLT5mb3BzLT5yZWxlYXNlKGJkX2lub2RlLCBOVUxMKTsKKwl9IGVsc2UgeworCQlkb3duKCZiZGV2LT5iZF9jb250YWlucy0+YmRfc2VtKTsKKwkJYmRldi0+YmRfY29udGFpbnMtPmJkX3BhcnRfY291bnQtLTsKKwkJdXAoJmJkZXYtPmJkX2NvbnRhaW5zLT5iZF9zZW0pOworCX0KKwlpZiAoIWJkZXYtPmJkX29wZW5lcnMpIHsKKwkJc3RydWN0IG1vZHVsZSAqb3duZXIgPSBkaXNrLT5mb3BzLT5vd25lcjsKKworCQlwdXRfZGlzayhkaXNrKTsKKwkJbW9kdWxlX3B1dChvd25lcik7CisKKwkJaWYgKGJkZXYtPmJkX2NvbnRhaW5zICE9IGJkZXYpIHsKKwkJCWtvYmplY3RfcHV0KCZiZGV2LT5iZF9wYXJ0LT5rb2JqKTsKKwkJCWJkZXYtPmJkX3BhcnQgPSBOVUxMOworCQl9CisJCWJkZXYtPmJkX2Rpc2sgPSBOVUxMOworCQliZGV2LT5iZF9pbm9kZS0+aV9kYXRhLmJhY2tpbmdfZGV2X2luZm8gPSAmZGVmYXVsdF9iYWNraW5nX2Rldl9pbmZvOworCQlpZiAoYmRldiAhPSBiZGV2LT5iZF9jb250YWlucykgeworCQkJYmxrZGV2X3B1dChiZGV2LT5iZF9jb250YWlucyk7CisJCX0KKwkJYmRldi0+YmRfY29udGFpbnMgPSBOVUxMOworCX0KKwl1bmxvY2tfa2VybmVsKCk7CisJdXAoJmJkZXYtPmJkX3NlbSk7CisJYmRwdXQoYmRldik7CisJcmV0dXJuIHJldDsKK30KKworRVhQT1JUX1NZTUJPTChibGtkZXZfcHV0KTsKKworc3RhdGljIGludCBibGtkZXZfY2xvc2Uoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gSV9CREVWKGZpbHAtPmZfbWFwcGluZy0+aG9zdCk7CisJaWYgKGJkZXYtPmJkX2hvbGRlciA9PSBmaWxwKQorCQliZF9yZWxlYXNlKGJkZXYpOworCXJldHVybiBibGtkZXZfcHV0KGJkZXYpOworfQorCitzdGF0aWMgc3NpemVfdCBibGtkZXZfZmlsZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaW92ZWMgbG9jYWxfaW92ID0geyAuaW92X2Jhc2UgPSAodm9pZCBfX3VzZXIgKilidWYsIC5pb3ZfbGVuID0gY291bnQgfTsKKworCXJldHVybiBnZW5lcmljX2ZpbGVfd3JpdGVfbm9sb2NrKGZpbGUsICZsb2NhbF9pb3YsIDEsIHBwb3MpOworfQorCitzdGF0aWMgc3NpemVfdCBibGtkZXZfZmlsZV9haW9fd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90IHBvcykKK3sKKwlzdHJ1Y3QgaW92ZWMgbG9jYWxfaW92ID0geyAuaW92X2Jhc2UgPSAodm9pZCBfX3VzZXIgKilidWYsIC5pb3ZfbGVuID0gY291bnQgfTsKKworCXJldHVybiBnZW5lcmljX2ZpbGVfYWlvX3dyaXRlX25vbG9jayhpb2NiLCAmbG9jYWxfaW92LCAxLCAmaW9jYi0+a2lfcG9zKTsKK30KKworc3RhdGljIGludCBibG9ja19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgY21kLAorCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIGJsa2Rldl9pb2N0bChmaWxlLT5mX21hcHBpbmctPmhvc3QsIGZpbGUsIGNtZCwgYXJnKTsKK30KKworc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBkZWZfYmxrX2FvcHMgPSB7CisJLnJlYWRwYWdlCT0gYmxrZGV2X3JlYWRwYWdlLAorCS53cml0ZXBhZ2UJPSBibGtkZXZfd3JpdGVwYWdlLAorCS5zeW5jX3BhZ2UJPSBibG9ja19zeW5jX3BhZ2UsCisJLnByZXBhcmVfd3JpdGUJPSBibGtkZXZfcHJlcGFyZV93cml0ZSwKKwkuY29tbWl0X3dyaXRlCT0gYmxrZGV2X2NvbW1pdF93cml0ZSwKKwkud3JpdGVwYWdlcwk9IGdlbmVyaWNfd3JpdGVwYWdlcywKKwkuZGlyZWN0X0lPCT0gYmxrZGV2X2RpcmVjdF9JTywKK307CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGVmX2Jsa19mb3BzID0geworCS5vcGVuCQk9IGJsa2Rldl9vcGVuLAorCS5yZWxlYXNlCT0gYmxrZGV2X2Nsb3NlLAorCS5sbHNlZWsJCT0gYmxvY2tfbGxzZWVrLAorCS5yZWFkCQk9IGdlbmVyaWNfZmlsZV9yZWFkLAorCS53cml0ZQkJPSBibGtkZXZfZmlsZV93cml0ZSwKKyAgCS5haW9fcmVhZAk9IGdlbmVyaWNfZmlsZV9haW9fcmVhZCwKKyAgCS5haW9fd3JpdGUJPSBibGtkZXZfZmlsZV9haW9fd3JpdGUsIAorCS5tbWFwCQk9IGdlbmVyaWNfZmlsZV9tbWFwLAorCS5mc3luYwkJPSBibG9ja19mc3luYywKKwkuaW9jdGwJCT0gYmxvY2tfaW9jdGwsCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCS5jb21wYXRfaW9jdGwJPSBjb21wYXRfYmxrZGV2X2lvY3RsLAorI2VuZGlmCisJLnJlYWR2CQk9IGdlbmVyaWNfZmlsZV9yZWFkdiwKKwkud3JpdGV2CQk9IGdlbmVyaWNfZmlsZV93cml0ZV9ub2xvY2ssCisJLnNlbmRmaWxlCT0gZ2VuZXJpY19maWxlX3NlbmRmaWxlLAorfTsKKworaW50IGlvY3RsX2J5X2JkZXYoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcmVzOworCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKwlyZXMgPSBibGtkZXZfaW9jdGwoYmRldi0+YmRfaW5vZGUsIE5VTEwsIGNtZCwgYXJnKTsKKwlzZXRfZnMob2xkX2ZzKTsKKwlyZXR1cm4gcmVzOworfQorCitFWFBPUlRfU1lNQk9MKGlvY3RsX2J5X2JkZXYpOworCisvKioKKyAqIGxvb2t1cF9iZGV2ICAtIGxvb2t1cCBhIHN0cnVjdCBibG9ja19kZXZpY2UgYnkgbmFtZQorICoKKyAqIEBwYXRoOglzcGVjaWFsIGZpbGUgcmVwcmVzZW50aW5nIHRoZSBibG9jayBkZXZpY2UKKyAqCisgKiBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIGJsb2NrZGV2aWNlIGF0IEBwYXRoIGluIHRoZSBjdXJyZW50CisgKiBuYW1lc3BhY2UgaWYgcG9zc2libGUgYW5kIHJldHVybiBpdC4gIFJldHVybiBFUlJfUFRSKGVycm9yKQorICogb3RoZXJ3aXNlLgorICovCitzdHJ1Y3QgYmxvY2tfZGV2aWNlICpsb29rdXBfYmRldihjb25zdCBjaGFyICpwYXRoKQoreworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCWludCBlcnJvcjsKKworCWlmICghcGF0aCB8fCAhKnBhdGgpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJZXJyb3IgPSBwYXRoX2xvb2t1cChwYXRoLCBMT09LVVBfRk9MTE9XLCAmbmQpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOworCisJaW5vZGUgPSBuZC5kZW50cnktPmRfaW5vZGU7CisJZXJyb3IgPSAtRU5PVEJMSzsKKwlpZiAoIVNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpCisJCWdvdG8gZmFpbDsKKwllcnJvciA9IC1FQUNDRVM7CisJaWYgKG5kLm1udC0+bW50X2ZsYWdzICYgTU5UX05PREVWKQorCQlnb3RvIGZhaWw7CisJZXJyb3IgPSAtRU5PTUVNOworCWJkZXYgPSBiZF9hY3F1aXJlKGlub2RlKTsKKwlpZiAoIWJkZXYpCisJCWdvdG8gZmFpbDsKK291dDoKKwlwYXRoX3JlbGVhc2UoJm5kKTsKKwlyZXR1cm4gYmRldjsKK2ZhaWw6CisJYmRldiA9IEVSUl9QVFIoZXJyb3IpOworCWdvdG8gb3V0OworfQorCisvKioKKyAqIG9wZW5fYmRldl9leGNsICAtICBvcGVuIGEgYmxvY2sgZGV2aWNlIGJ5IG5hbWUgYW5kIHNldCBpdCB1cCBmb3IgdXNlCisgKgorICogQHBhdGg6CXNwZWNpYWwgZmlsZSByZXByZXNlbnRpbmcgdGhlIGJsb2NrIGRldmljZQorICogQGZsYWdzOgklTVNfUkRPTkxZIGZvciBvcGVuaW5nIHJlYWQtb25seQorICogQGhvbGRlcjoJb3duZXIgZm9yIGV4Y2x1c2lvbgorICoKKyAqIE9wZW4gdGhlIGJsb2NrZGV2aWNlIGRlc2NyaWJlZCBieSB0aGUgc3BlY2lhbCBmaWxlIGF0IEBwYXRoLCBjbGFpbSBpdAorICogZm9yIHRoZSBAaG9sZGVyLgorICovCitzdHJ1Y3QgYmxvY2tfZGV2aWNlICpvcGVuX2JkZXZfZXhjbChjb25zdCBjaGFyICpwYXRoLCBpbnQgZmxhZ3MsIHZvaWQgKmhvbGRlcikKK3sKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OworCW1vZGVfdCBtb2RlID0gRk1PREVfUkVBRDsKKwlpbnQgZXJyb3IgPSAwOworCisJYmRldiA9IGxvb2t1cF9iZGV2KHBhdGgpOworCWlmIChJU19FUlIoYmRldikpCisJCXJldHVybiBiZGV2OworCisJaWYgKCEoZmxhZ3MgJiBNU19SRE9OTFkpKQorCQltb2RlIHw9IEZNT0RFX1dSSVRFOworCWVycm9yID0gYmxrZGV2X2dldChiZGV2LCBtb2RlLCAwKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBFUlJfUFRSKGVycm9yKTsKKwllcnJvciA9IC1FQUNDRVM7CisJaWYgKCEoZmxhZ3MgJiBNU19SRE9OTFkpICYmIGJkZXZfcmVhZF9vbmx5KGJkZXYpKQorCQlnb3RvIGJsa2Rldl9wdXQ7CisJZXJyb3IgPSBiZF9jbGFpbShiZGV2LCBob2xkZXIpOworCWlmIChlcnJvcikKKwkJZ290byBibGtkZXZfcHV0OworCisJcmV0dXJuIGJkZXY7CisJCitibGtkZXZfcHV0OgorCWJsa2Rldl9wdXQoYmRldik7CisJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOworfQorCitFWFBPUlRfU1lNQk9MKG9wZW5fYmRldl9leGNsKTsKKworLyoqCisgKiBjbG9zZV9iZGV2X2V4Y2wgIC0gIHJlbGVhc2UgYSBibG9ja2RldmljZSBvcGVuZW4gYnkgb3Blbl9iZGV2X2V4Y2woKQorICoKKyAqIEBiZGV2OglibG9ja2RldmljZSB0byBjbG9zZQorICoKKyAqIFRoaXMgaXMgdGhlIGNvdW50ZXJwYXJ0IHRvIG9wZW5fYmRldl9leGNsKCkuCisgKi8KK3ZvaWQgY2xvc2VfYmRldl9leGNsKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJYmRfcmVsZWFzZShiZGV2KTsKKwlibGtkZXZfcHV0KGJkZXYpOworfQorCitFWFBPUlRfU1lNQk9MKGNsb3NlX2JkZXZfZXhjbCk7CmRpZmYgLS1naXQgYS9mcy9idWZmZXIuYyBiL2ZzL2J1ZmZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NjE2MDUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9idWZmZXIuYwpAQCAtMCwwICsxLDMxNTIgQEAKKy8qCisgKiAgbGludXgvZnMvYnVmZmVyLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyLCAyMDAyICBMaW51cyBUb3J2YWxkcworICovCisKKy8qCisgKiBTdGFydCBiZGZsdXNoKCkgd2l0aCBrZXJuZWxfdGhyZWFkIG5vdCBzeXNjYWxsIC0gUGF1bCBHb3J0bWFrZXIsIDEyLzk1CisgKgorICogUmVtb3ZlZCBhIGxvdCBvZiB1bm5lY2Vzc2FyeSBjb2RlIGFuZCBzaW1wbGlmaWVkIHRoaW5ncyBub3cgdGhhdAorICogdGhlIGJ1ZmZlciBjYWNoZSBpc24ndCBvdXIgcHJpbWFyeSBjYWNoZSAtIEFuZHJldyBUcmlkZ2VsbCAxMi85NgorICoKKyAqIFNwZWVkIHVwIGhhc2gsIGxydSwgYW5kIGZyZWUgbGlzdCBvcGVyYXRpb25zLiAgVXNlIGdmcCgpIGZvciBhbGxvY2F0aW5nCisgKiBoYXNoIHRhYmxlLCB1c2UgU0xBQiBjYWNoZSBmb3IgYnVmZmVyIGhlYWRzLiBTTVAgdGhyZWFkaW5nLiAgLURhdmVNCisgKgorICogQWRkZWQgMzJrIGJ1ZmZlciBibG9jayBzaXplcyAtIHRoZXNlIGFyZSByZXF1aXJlZCBvbGRlciBBUk0gc3lzdGVtcy4gLSBSTUsKKyAqCisgKiBhc3luYyBidWZmZXIgZmx1c2hpbmcsIDE5OTkgQW5kcmVhIEFyY2FuZ2VsaSA8YW5kcmVhQHN1c2UuZGU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KKyNpbmNsdWRlIDxsaW51eC9oYXNoLmg+CisjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvYmlvLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tcGFnZS5oPgorCitzdGF0aWMgaW50IGZzeW5jX2J1ZmZlcnNfbGlzdChzcGlubG9ja190ICpsb2NrLCBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KTsKK3N0YXRpYyB2b2lkIGludmFsaWRhdGVfYmhfbHJ1cyh2b2lkKTsKKworI2RlZmluZSBCSF9FTlRSWShsaXN0KSBsaXN0X2VudHJ5KChsaXN0KSwgc3RydWN0IGJ1ZmZlcl9oZWFkLCBiX2Fzc29jX2J1ZmZlcnMpCisKK2lubGluZSB2b2lkCitpbml0X2J1ZmZlcihzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBiaF9lbmRfaW9fdCAqaGFuZGxlciwgdm9pZCAqcHJpdmF0ZSkKK3sKKwliaC0+Yl9lbmRfaW8gPSBoYW5kbGVyOworCWJoLT5iX3ByaXZhdGUgPSBwcml2YXRlOworfQorCitzdGF0aWMgaW50IHN5bmNfYnVmZmVyKHZvaWQgKndvcmQpCit7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaAorCQk9IGNvbnRhaW5lcl9vZih3b3JkLCBzdHJ1Y3QgYnVmZmVyX2hlYWQsIGJfc3RhdGUpOworCisJc21wX21iKCk7CisJYmQgPSBiaC0+Yl9iZGV2OworCWlmIChiZCkKKwkJYmxrX3J1bl9hZGRyZXNzX3NwYWNlKGJkLT5iZF9pbm9kZS0+aV9tYXBwaW5nKTsKKwlpb19zY2hlZHVsZSgpOworCXJldHVybiAwOworfQorCit2b2lkIGZhc3RjYWxsIF9fbG9ja19idWZmZXIoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwl3YWl0X29uX2JpdF9sb2NrKCZiaC0+Yl9zdGF0ZSwgQkhfTG9jaywgc3luY19idWZmZXIsCisJCQkJCQkJVEFTS19VTklOVEVSUlVQVElCTEUpOworfQorRVhQT1JUX1NZTUJPTChfX2xvY2tfYnVmZmVyKTsKKwordm9pZCBmYXN0Y2FsbCB1bmxvY2tfYnVmZmVyKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJY2xlYXJfYnVmZmVyX2xvY2tlZChiaCk7CisJc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKTsKKwl3YWtlX3VwX2JpdCgmYmgtPmJfc3RhdGUsIEJIX0xvY2spOworfQorCisvKgorICogQmxvY2sgdW50aWwgYSBidWZmZXIgY29tZXMgdW5sb2NrZWQuICBUaGlzIGRvZXNuJ3Qgc3RvcCBpdAorICogZnJvbSBiZWNvbWluZyBsb2NrZWQgYWdhaW4gLSB5b3UgaGF2ZSB0byBsb2NrIGl0IHlvdXJzZWxmCisgKiBpZiB5b3Ugd2FudCB0byBwcmVzZXJ2ZSBpdHMgc3RhdGUuCisgKi8KK3ZvaWQgX193YWl0X29uX2J1ZmZlcihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCkKK3sKKwl3YWl0X29uX2JpdCgmYmgtPmJfc3RhdGUsIEJIX0xvY2ssIHN5bmNfYnVmZmVyLCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2NsZWFyX3BhZ2VfYnVmZmVycyhzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlDbGVhclBhZ2VQcml2YXRlKHBhZ2UpOworCXBhZ2UtPnByaXZhdGUgPSAwOworCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKK30KKworc3RhdGljIHZvaWQgYnVmZmVyX2lvX2Vycm9yKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJY2hhciBiW0JERVZOQU1FX1NJWkVdOworCisJcHJpbnRrKEtFUk5fRVJSICJCdWZmZXIgSS9PIGVycm9yIG9uIGRldmljZSAlcywgbG9naWNhbCBibG9jayAlTHVcbiIsCisJCQliZGV2bmFtZShiaC0+Yl9iZGV2LCBiKSwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tucik7Cit9CisKKy8qCisgKiBEZWZhdWx0IHN5bmNocm9ub3VzIGVuZC1vZi1JTyBoYW5kbGVyLi4gIEp1c3QgbWFyayBpdCB1cC10by1kYXRlIGFuZAorICogdW5sb2NrIHRoZSBidWZmZXIuIFRoaXMgaXMgd2hhdCBsbF9yd19ibG9jayB1c2VzIHRvby4KKyAqLwordm9pZCBlbmRfYnVmZmVyX3JlYWRfc3luYyhzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgdXB0b2RhdGUpCit7CisJaWYgKHVwdG9kYXRlKSB7CisJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCX0gZWxzZSB7CisJCS8qIFRoaXMgaGFwcGVucywgZHVlIHRvIGZhaWxlZCBSRUFEQSBhdHRlbXB0cy4gKi8KKwkJY2xlYXJfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwl9CisJdW5sb2NrX2J1ZmZlcihiaCk7CisJcHV0X2JoKGJoKTsKK30KKwordm9pZCBlbmRfYnVmZmVyX3dyaXRlX3N5bmMoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHVwdG9kYXRlKQoreworCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKKworCWlmICh1cHRvZGF0ZSkgeworCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwl9IGVsc2UgeworCQlpZiAoIWJ1ZmZlcl9lb3Bub3RzdXBwKGJoKSAmJiBwcmludGtfcmF0ZWxpbWl0KCkpIHsKKwkJCWJ1ZmZlcl9pb19lcnJvcihiaCk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJsb3N0IHBhZ2Ugd3JpdGUgZHVlIHRvICIKKwkJCQkJIkkvTyBlcnJvciBvbiAlc1xuIiwKKwkJCQkgICAgICAgYmRldm5hbWUoYmgtPmJfYmRldiwgYikpOworCQl9CisJCXNldF9idWZmZXJfd3JpdGVfaW9fZXJyb3IoYmgpOworCQljbGVhcl9idWZmZXJfdXB0b2RhdGUoYmgpOworCX0KKwl1bmxvY2tfYnVmZmVyKGJoKTsKKwlwdXRfYmgoYmgpOworfQorCisvKgorICogV3JpdGUgb3V0IGFuZCB3YWl0IHVwb24gYWxsIHRoZSBkaXJ0eSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIGJsb2NrCisgKiBkZXZpY2UgdmlhIGl0cyBtYXBwaW5nLiAgRG9lcyBub3QgdGFrZSB0aGUgc3VwZXJibG9jayBsb2NrLgorICovCitpbnQgc3luY19ibG9ja2RldihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQoreworCWludCByZXQgPSAwOworCisJaWYgKGJkZXYpIHsKKwkJaW50IGVycjsKKworCQlyZXQgPSBmaWxlbWFwX2ZkYXRhd3JpdGUoYmRldi0+YmRfaW5vZGUtPmlfbWFwcGluZyk7CisJCWVyciA9IGZpbGVtYXBfZmRhdGF3YWl0KGJkZXYtPmJkX2lub2RlLT5pX21hcHBpbmcpOworCQlpZiAoIXJldCkKKwkJCXJldCA9IGVycjsKKwl9CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woc3luY19ibG9ja2Rldik7CisKKy8qCisgKiBXcml0ZSBvdXQgYW5kIHdhaXQgdXBvbiBhbGwgZGlydHkgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcworICogc3VwZXJibG9jay4gIEZpbGVzeXN0ZW0gZGF0YSBhcyB3ZWxsIGFzIHRoZSB1bmRlcmx5aW5nIGJsb2NrCisgKiBkZXZpY2UuICBUYWtlcyB0aGUgc3VwZXJibG9jayBsb2NrLgorICovCitpbnQgZnN5bmNfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzeW5jX2lub2Rlc19zYihzYiwgMCk7CisJRFFVT1RfU1lOQyhzYik7CisJbG9ja19zdXBlcihzYik7CisJaWYgKHNiLT5zX2RpcnQgJiYgc2ItPnNfb3AtPndyaXRlX3N1cGVyKQorCQlzYi0+c19vcC0+d3JpdGVfc3VwZXIoc2IpOworCXVubG9ja19zdXBlcihzYik7CisJaWYgKHNiLT5zX29wLT5zeW5jX2ZzKQorCQlzYi0+c19vcC0+c3luY19mcyhzYiwgMSk7CisJc3luY19ibG9ja2RldihzYi0+c19iZGV2KTsKKwlzeW5jX2lub2Rlc19zYihzYiwgMSk7CisKKwlyZXR1cm4gc3luY19ibG9ja2RldihzYi0+c19iZGV2KTsKK30KKworLyoKKyAqIFdyaXRlIG91dCBhbmQgd2FpdCB1cG9uIGFsbCBkaXJ0eSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgKiBkZXZpY2UuICAgRmlsZXN5c3RlbSBkYXRhIGFzIHdlbGwgYXMgdGhlIHVuZGVybHlpbmcgYmxvY2sKKyAqIGRldmljZS4gIFRha2VzIHRoZSBzdXBlcmJsb2NrIGxvY2suCisgKi8KK2ludCBmc3luY19iZGV2KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGdldF9zdXBlcihiZGV2KTsKKwlpZiAoc2IpIHsKKwkJaW50IHJlcyA9IGZzeW5jX3N1cGVyKHNiKTsKKwkJZHJvcF9zdXBlcihzYik7CisJCXJldHVybiByZXM7CisJfQorCXJldHVybiBzeW5jX2Jsb2NrZGV2KGJkZXYpOworfQorCisvKioKKyAqIGZyZWV6ZV9iZGV2ICAtLSAgbG9jayBhIGZpbGVzeXN0ZW0gYW5kIGZvcmNlIGl0IGludG8gYSBjb25zaXN0ZW50IHN0YXRlCisgKiBAYmRldjoJYmxvY2tkZXZpY2UgdG8gbG9jaworICoKKyAqIFRoaXMgdGFrZXMgdGhlIGJsb2NrIGRldmljZSBiZF9tb3VudF9zZW0gdG8gbWFrZSBzdXJlIG5vIG5ldyBtb3VudHMKKyAqIGhhcHBlbiBvbiBiZGV2IHVudGlsIHRoYXdfYmRldigpIGlzIGNhbGxlZC4KKyAqIElmIGEgc3VwZXJibG9jayBpcyBmb3VuZCBvbiB0aGlzIGRldmljZSwgd2UgdGFrZSB0aGUgc191bW91bnQgc2VtYXBob3JlCisgKiBvbiBpdCB0byBtYWtlIHN1cmUgbm9ib2R5IHVubW91bnRzIHVudGlsIHRoZSBzbmFwc2hvdCBjcmVhdGlvbiBpcyBkb25lLgorICovCitzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmZyZWV6ZV9iZGV2KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKworCWRvd24oJmJkZXYtPmJkX21vdW50X3NlbSk7CisJc2IgPSBnZXRfc3VwZXIoYmRldik7CisJaWYgKHNiICYmICEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCXNiLT5zX2Zyb3plbiA9IFNCX0ZSRUVaRV9XUklURTsKKwkJd21iKCk7CisKKwkJc3luY19pbm9kZXNfc2Ioc2IsIDApOworCQlEUVVPVF9TWU5DKHNiKTsKKworCQlsb2NrX3N1cGVyKHNiKTsKKwkJaWYgKHNiLT5zX2RpcnQgJiYgc2ItPnNfb3AtPndyaXRlX3N1cGVyKQorCQkJc2ItPnNfb3AtPndyaXRlX3N1cGVyKHNiKTsKKwkJdW5sb2NrX3N1cGVyKHNiKTsKKworCQlpZiAoc2ItPnNfb3AtPnN5bmNfZnMpCisJCQlzYi0+c19vcC0+c3luY19mcyhzYiwgMSk7CisKKwkJc3luY19ibG9ja2RldihzYi0+c19iZGV2KTsKKwkJc3luY19pbm9kZXNfc2Ioc2IsIDEpOworCisJCXNiLT5zX2Zyb3plbiA9IFNCX0ZSRUVaRV9UUkFOUzsKKwkJd21iKCk7CisKKwkJc3luY19ibG9ja2RldihzYi0+c19iZGV2KTsKKworCQlpZiAoc2ItPnNfb3AtPndyaXRlX3N1cGVyX2xvY2tmcykKKwkJCXNiLT5zX29wLT53cml0ZV9zdXBlcl9sb2NrZnMoc2IpOworCX0KKworCXN5bmNfYmxvY2tkZXYoYmRldik7CisJcmV0dXJuIHNiOwkvKiB0aGF3X2JkZXYgcmVsZWFzZXMgcy0+c191bW91bnQgYW5kIGJkX21vdW50X3NlbSAqLworfQorRVhQT1JUX1NZTUJPTChmcmVlemVfYmRldik7CisKKy8qKgorICogdGhhd19iZGV2ICAtLSB1bmxvY2sgZmlsZXN5c3RlbQorICogQGJkZXY6CWJsb2NrZGV2aWNlIHRvIHVubG9jaworICogQHNiOgkJYXNzb2NpYXRlZCBzdXBlcmJsb2NrCisgKgorICogVW5sb2NrcyB0aGUgZmlsZXN5c3RlbSBhbmQgbWFya3MgaXQgd3JpdGVhYmxlIGFnYWluIGFmdGVyIGZyZWV6ZV9iZGV2KCkuCisgKi8KK3ZvaWQgdGhhd19iZGV2KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJaWYgKHNiKSB7CisJCUJVR19PTihzYi0+c19iZGV2ICE9IGJkZXYpOworCisJCWlmIChzYi0+c19vcC0+dW5sb2NrZnMpCisJCQlzYi0+c19vcC0+dW5sb2NrZnMoc2IpOworCQlzYi0+c19mcm96ZW4gPSBTQl9VTkZST1pFTjsKKwkJd21iKCk7CisJCXdha2VfdXAoJnNiLT5zX3dhaXRfdW5mcm96ZW4pOworCQlkcm9wX3N1cGVyKHNiKTsKKwl9CisKKwl1cCgmYmRldi0+YmRfbW91bnRfc2VtKTsKK30KK0VYUE9SVF9TWU1CT0wodGhhd19iZGV2KTsKKworLyoKKyAqIHN5bmMgZXZlcnl0aGluZy4gIFN0YXJ0IG91dCBieSB3YWtpbmcgcGRmbHVzaCwgYmVjYXVzZSB0aGF0IHdyaXRlcyBiYWNrCisgKiBhbGwgcXVldWVzIGluIHBhcmFsbGVsLgorICovCitzdGF0aWMgdm9pZCBkb19zeW5jKHVuc2lnbmVkIGxvbmcgd2FpdCkKK3sKKwl3YWtldXBfYmRmbHVzaCgwKTsKKwlzeW5jX2lub2RlcygwKTsJCS8qIEFsbCBtYXBwaW5ncywgaW5vZGVzIGFuZCB0aGVpciBibG9ja2RldnMgKi8KKwlEUVVPVF9TWU5DKE5VTEwpOworCXN5bmNfc3VwZXJzKCk7CQkvKiBXcml0ZSB0aGUgc3VwZXJibG9ja3MgKi8KKwlzeW5jX2ZpbGVzeXN0ZW1zKDApOwkvKiBTdGFydCBzeW5jaW5nIHRoZSBmaWxlc3lzdGVtcyAqLworCXN5bmNfZmlsZXN5c3RlbXMod2FpdCk7CS8qIFdhaXRpbmdseSBzeW5jIHRoZSBmaWxlc3lzdGVtcyAqLworCXN5bmNfaW5vZGVzKHdhaXQpOwkvKiBNYXBwaW5ncywgaW5vZGVzIGFuZCBibG9ja2RldnMsIGFnYWluLiAqLworCWlmICghd2FpdCkKKwkJcHJpbnRrKCJFbWVyZ2VuY3kgU3luYyBjb21wbGV0ZVxuIik7CisJaWYgKHVubGlrZWx5KGxhcHRvcF9tb2RlKSkKKwkJbGFwdG9wX3N5bmNfY29tcGxldGlvbigpOworfQorCithc21saW5rYWdlIGxvbmcgc3lzX3N5bmModm9pZCkKK3sKKwlkb19zeW5jKDEpOworCXJldHVybiAwOworfQorCit2b2lkIGVtZXJnZW5jeV9zeW5jKHZvaWQpCit7CisJcGRmbHVzaF9vcGVyYXRpb24oZG9fc3luYywgMCk7Cit9CisKKy8qCisgKiBHZW5lcmljIGZ1bmN0aW9uIHRvIGZzeW5jIGEgZmlsZS4KKyAqCisgKiBmaWxwIG1heSBiZSBOVUxMIGlmIGNhbGxlZCB2aWEgdGhlIG1zeW5jIG9mIGEgdm1hLgorICovCisgCitpbnQgZmlsZV9mc3luYyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgZGF0YXN5bmMpCit7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJaW50IHJldCwgZXJyOworCisJLyogc3luYyB0aGUgaW5vZGUgdG8gYnVmZmVycyAqLworCXJldCA9IHdyaXRlX2lub2RlX25vdyhpbm9kZSwgMCk7CisKKwkvKiBzeW5jIHRoZSBzdXBlcmJsb2NrIHRvIGJ1ZmZlcnMgKi8KKwlzYiA9IGlub2RlLT5pX3NiOworCWxvY2tfc3VwZXIoc2IpOworCWlmIChzYi0+c19vcC0+d3JpdGVfc3VwZXIpCisJCXNiLT5zX29wLT53cml0ZV9zdXBlcihzYik7CisJdW5sb2NrX3N1cGVyKHNiKTsKKworCS8qIC4uIGZpbmFsbHkgc3luYyB0aGUgYnVmZmVycyB0byBkaXNrICovCisJZXJyID0gc3luY19ibG9ja2RldihzYi0+c19iZGV2KTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gZXJyOworCXJldHVybiByZXQ7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfZnN5bmModW5zaWduZWQgaW50IGZkKQoreworCXN0cnVjdCBmaWxlICogZmlsZTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKKwlpbnQgcmV0LCBlcnI7CisKKwlyZXQgPSAtRUJBREY7CisJZmlsZSA9IGZnZXQoZmQpOworCWlmICghZmlsZSkKKwkJZ290byBvdXQ7CisKKwltYXBwaW5nID0gZmlsZS0+Zl9tYXBwaW5nOworCisJcmV0ID0gLUVJTlZBTDsKKwlpZiAoIWZpbGUtPmZfb3AgfHwgIWZpbGUtPmZfb3AtPmZzeW5jKSB7CisJCS8qIFdoeT8gIFdlIGNhbiBzdGlsbCBjYWxsIGZpbGVtYXBfZmRhdGF3cml0ZSAqLworCQlnb3RvIG91dF9wdXRmOworCX0KKworCWN1cnJlbnQtPmZsYWdzIHw9IFBGX1NZTkNXUklURTsKKwlyZXQgPSBmaWxlbWFwX2ZkYXRhd3JpdGUobWFwcGluZyk7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gcHJvdGVjdCBhZ2FpbnN0IGNvbmN1cnJlbnQgd3JpdGVycywKKwkgKiB3aGljaCBjb3VsZCBjYXVzZSBsaXZlbG9ja3MgaW4gZnN5bmNfYnVmZmVyc19saXN0CisJICovCisJZG93bigmbWFwcGluZy0+aG9zdC0+aV9zZW0pOworCWVyciA9IGZpbGUtPmZfb3AtPmZzeW5jKGZpbGUsIGZpbGUtPmZfZGVudHJ5LCAwKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gZXJyOworCXVwKCZtYXBwaW5nLT5ob3N0LT5pX3NlbSk7CisJZXJyID0gZmlsZW1hcF9mZGF0YXdhaXQobWFwcGluZyk7CisJaWYgKCFyZXQpCisJCXJldCA9IGVycjsKKwljdXJyZW50LT5mbGFncyAmPSB+UEZfU1lOQ1dSSVRFOworCitvdXRfcHV0ZjoKKwlmcHV0KGZpbGUpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfZmRhdGFzeW5jKHVuc2lnbmVkIGludCBmZCkKK3sKKwlzdHJ1Y3QgZmlsZSAqIGZpbGU7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CisJaW50IHJldCwgZXJyOworCisJcmV0ID0gLUVCQURGOworCWZpbGUgPSBmZ2V0KGZkKTsKKwlpZiAoIWZpbGUpCisJCWdvdG8gb3V0OworCisJcmV0ID0gLUVJTlZBTDsKKwlpZiAoIWZpbGUtPmZfb3AgfHwgIWZpbGUtPmZfb3AtPmZzeW5jKQorCQlnb3RvIG91dF9wdXRmOworCisJbWFwcGluZyA9IGZpbGUtPmZfbWFwcGluZzsKKworCWN1cnJlbnQtPmZsYWdzIHw9IFBGX1NZTkNXUklURTsKKwlyZXQgPSBmaWxlbWFwX2ZkYXRhd3JpdGUobWFwcGluZyk7CisJZG93bigmbWFwcGluZy0+aG9zdC0+aV9zZW0pOworCWVyciA9IGZpbGUtPmZfb3AtPmZzeW5jKGZpbGUsIGZpbGUtPmZfZGVudHJ5LCAxKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gZXJyOworCXVwKCZtYXBwaW5nLT5ob3N0LT5pX3NlbSk7CisJZXJyID0gZmlsZW1hcF9mZGF0YXdhaXQobWFwcGluZyk7CisJaWYgKCFyZXQpCisJCXJldCA9IGVycjsKKwljdXJyZW50LT5mbGFncyAmPSB+UEZfU1lOQ1dSSVRFOworCitvdXRfcHV0ZjoKKwlmcHV0KGZpbGUpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBWYXJpb3VzIGZpbGVzeXN0ZW1zIGFwcGVhciB0byB3YW50IF9fZmluZF9nZXRfYmxvY2sgdG8gYmUgbm9uLWJsb2NraW5nLgorICogQnV0IGl0J3MgdGhlIHBhZ2UgbG9jayB3aGljaCBwcm90ZWN0cyB0aGUgYnVmZmVycy4gIFRvIGdldCBhcm91bmQgdGhpcywKKyAqIHdlIGdldCBleGNsdXNpb24gZnJvbSB0cnlfdG9fZnJlZV9idWZmZXJzIHdpdGggdGhlIGJsb2NrZGV2IG1hcHBpbmcncworICogcHJpdmF0ZV9sb2NrLgorICoKKyAqIEhhY2sgaWRlYTogZm9yIHRoZSBibG9ja2RldiBtYXBwaW5nLCBpX2J1ZmZlcmxpc3RfbG9jayBjb250ZW50aW9uCisgKiBtYXkgYmUgcXVpdGUgaGlnaC4gIFRoaXMgY29kZSBjb3VsZCBUcnlMb2NrIHRoZSBwYWdlLCBhbmQgaWYgdGhhdAorICogc3VjY2VlZHMsIHRoZXJlIGlzIG5vIG5lZWQgdG8gdGFrZSBwcml2YXRlX2xvY2suIChCdXQgaWYKKyAqIHByaXZhdGVfbG9jayBpcyBjb250ZW5kZWQgdGhlbiBzbyBpcyBtYXBwaW5nLT50cmVlX2xvY2spLgorICovCitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICoKK19fZmluZF9nZXRfYmxvY2tfc2xvdyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBibG9jaywgaW50IHVudXNlZCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmJkX2lub2RlID0gYmRldi0+YmRfaW5vZGU7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKmJkX21hcHBpbmcgPSBiZF9pbm9kZS0+aV9tYXBwaW5nOworCXN0cnVjdCBidWZmZXJfaGVhZCAqcmV0ID0gTlVMTDsKKwlwZ29mZl90IGluZGV4OworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkOworCXN0cnVjdCBwYWdlICpwYWdlOworCWludCBhbGxfbWFwcGVkID0gMTsKKworCWluZGV4ID0gYmxvY2sgPj4gKFBBR0VfQ0FDSEVfU0hJRlQgLSBiZF9pbm9kZS0+aV9ibGtiaXRzKTsKKwlwYWdlID0gZmluZF9nZXRfcGFnZShiZF9tYXBwaW5nLCBpbmRleCk7CisJaWYgKCFwYWdlKQorCQlnb3RvIG91dDsKKworCXNwaW5fbG9jaygmYmRfbWFwcGluZy0+cHJpdmF0ZV9sb2NrKTsKKwlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpCisJCWdvdG8gb3V0X3VubG9jazsKKwloZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCWJoID0gaGVhZDsKKwlkbyB7CisJCWlmIChiaC0+Yl9ibG9ja25yID09IGJsb2NrKSB7CisJCQlyZXQgPSBiaDsKKwkJCWdldF9iaChiaCk7CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKwkJaWYgKCFidWZmZXJfbWFwcGVkKGJoKSkKKwkJCWFsbF9tYXBwZWQgPSAwOworCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKKwl9IHdoaWxlIChiaCAhPSBoZWFkKTsKKworCS8qIHdlIG1pZ2h0IGJlIGhlcmUgYmVjYXVzZSBzb21lIG9mIHRoZSBidWZmZXJzIG9uIHRoaXMgcGFnZSBhcmUKKwkgKiBub3QgbWFwcGVkLiAgVGhpcyBpcyBkdWUgdG8gdmFyaW91cyByYWNlcyBiZXR3ZWVuCisJICogZmlsZSBpbyBvbiB0aGUgYmxvY2sgZGV2aWNlIGFuZCBnZXRibGsuICBJdCBnZXRzIGRlYWx0IHdpdGgKKwkgKiBlbHNld2hlcmUsIGRvbid0IGJ1ZmZlcl9lcnJvciBpZiB3ZSBoYWQgc29tZSB1bm1hcHBlZCBidWZmZXJzCisJICovCisJaWYgKGFsbF9tYXBwZWQpIHsKKwkJcHJpbnRrKCJfX2ZpbmRfZ2V0X2Jsb2NrX3Nsb3coKSBmYWlsZWQuICIKKwkJCSJibG9jaz0lbGx1LCBiX2Jsb2NrbnI9JWxsdVxuIiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYmxvY2ssICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tucik7CisJCXByaW50aygiYl9zdGF0ZT0weCUwOGx4LCBiX3NpemU9JXVcbiIsIGJoLT5iX3N0YXRlLCBiaC0+Yl9zaXplKTsKKwkJcHJpbnRrKCJkZXZpY2UgYmxvY2tzaXplOiAlZFxuIiwgMSA8PCBiZF9pbm9kZS0+aV9ibGtiaXRzKTsKKwl9CitvdXRfdW5sb2NrOgorCXNwaW5fdW5sb2NrKCZiZF9tYXBwaW5nLT5wcml2YXRlX2xvY2spOworCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKiBJZiBpbnZhbGlkYXRlX2J1ZmZlcnMoKSB3aWxsIHRyYXNoIGRpcnR5IGJ1ZmZlcnMsIGl0IG1lYW5zIHNvbWUga2luZAorICAgb2YgZnMgY29ycnVwdGlvbiBpcyBnb2luZyBvbi4gVHJhc2hpbmcgZGlydHkgZGF0YSBhbHdheXMgaW1wbHkgbG9zaW5nCisgICBpbmZvcm1hdGlvbiB0aGF0IHdhcyBzdXBwb3NlZCB0byBiZSBqdXN0IHN0b3JlZCBvbiB0aGUgcGh5c2ljYWwgbGF5ZXIKKyAgIGJ5IHRoZSB1c2VyLgorCisgICBUaHVzIGludmFsaWRhdGVfYnVmZmVycyBpbiBnZW5lcmFsIHVzYWdlIGlzIG5vdCBhbGx3b3dlZCB0byB0cmFzaAorICAgZGlydHkgYnVmZmVycy4gRm9yIGV4YW1wbGUgaW9jdGwoRkxTQkxLQlVGKSBleHBlY3RzIGRpcnR5IGRhdGEgdG8KKyAgIGJlIHByZXNlcnZlZC4gIFRoZXNlIGJ1ZmZlcnMgYXJlIHNpbXBseSBza2lwcGVkLgorICAKKyAgIFdlIGFsc28gc2tpcCBidWZmZXJzIHdoaWNoIGFyZSBzdGlsbCBpbiB1c2UuICBGb3IgZXhhbXBsZSB0aGlzIGNhbgorICAgaGFwcGVuIGlmIGEgdXNlcnNwYWNlIHByb2dyYW0gaXMgcmVhZGluZyB0aGUgYmxvY2sgZGV2aWNlLgorCisgICBOT1RFOiBJbiB0aGUgY2FzZSB3aGVyZSB0aGUgdXNlciByZW1vdmVkIGEgcmVtb3ZhYmxlLW1lZGlhLWRpc2sgZXZlbiBpZgorICAgdGhlcmUncyBzdGlsbCBkaXJ0eSBkYXRhIG5vdCBzeW5jZWQgb24gZGlzayAoZHVlIGEgYnVnIGluIHRoZSBkZXZpY2UgZHJpdmVyCisgICBvciBkdWUgYW4gZXJyb3Igb2YgdGhlIHVzZXIpLCBieSBub3QgZGVzdHJveWluZyB0aGUgZGlydHkgYnVmZmVycyB3ZSBjb3VsZAorICAgZ2VuZXJhdGUgY29ycnVwdGlvbiBhbHNvIG9uIHRoZSBuZXh0IG1lZGlhIGluc2VydGVkLCB0aHVzIGEgcGFyYW1ldGVyIGlzCisgICBuZWNlc3NhcnkgdG8gaGFuZGxlIHRoaXMgY2FzZSBpbiB0aGUgbW9zdCBzYWZlIHdheSBwb3NzaWJsZSAodHJ5aW5nCisgICB0byBub3QgY29ycnVwdCBhbHNvIHRoZSBuZXcgZGlzayBpbnNlcnRlZCB3aXRoIHRoZSBkYXRhIGJlbG9uZ2luZyB0bworICAgdGhlIG9sZCBub3cgY29ycnVwdGVkIGRpc2spLiBBbHNvIGZvciB0aGUgcmFtZGlzayB0aGUgbmF0dXJhbCB0aGluZworICAgdG8gZG8gaW4gb3JkZXIgdG8gcmVsZWFzZSB0aGUgcmFtZGlzayBtZW1vcnkgaXMgdG8gZGVzdHJveSBkaXJ0eSBidWZmZXJzLgorCisgICBUaGVzZSBhcmUgdHdvIHNwZWNpYWwgY2FzZXMuIE5vcm1hbCB1c2FnZSBpbXBseSB0aGUgZGV2aWNlIGRyaXZlcgorICAgdG8gaXNzdWUgYSBzeW5jIG9uIHRoZSBkZXZpY2UgKHdpdGhvdXQgd2FpdGluZyBJL08gY29tcGxldGlvbikgYW5kCisgICB0aGVuIGFuIGludmFsaWRhdGVfYnVmZmVycyBjYWxsIHRoYXQgZG9lc24ndCB0cmFzaCBkaXJ0eSBidWZmZXJzLgorCisgICBGb3IgaGFuZGxpbmcgY2FjaGUgY29oZXJlbmN5IHdpdGggdGhlIGJsa2RldiBwYWdlY2FjaGUgdGhlICd1cGRhdGUnIGNhc2UKKyAgIGlzIGJlZW4gaW50cm9kdWNlZC4gSXQgaXMgbmVlZGVkIHRvIHJlLXJlYWQgZnJvbSBkaXNrIGFueSBwaW5uZWQKKyAgIGJ1ZmZlci4gTk9URTogcmUtcmVhZGluZyBmcm9tIGRpc2sgaXMgZGVzdHJ1Y3RpdmUgc28gd2UgY2FuIGRvIGl0IG9ubHkKKyAgIHdoZW4gd2UgYXNzdW1lIG5vYm9keSBpcyBjaGFuZ2luZyB0aGUgYnVmZmVyY2FjaGUgdW5kZXIgb3VyIEkvTyBhbmQgd2hlbgorICAgd2UgdGhpbmsgdGhlIGRpc2sgY29udGFpbnMgbW9yZSByZWNlbnQgaW5mb3JtYXRpb24gdGhhbiB0aGUgYnVmZmVyY2FjaGUuCisgICBUaGUgdXBkYXRlID09IDEgcGFzcyBtYXJrcyB0aGUgYnVmZmVycyB3ZSBuZWVkIHRvIHVwZGF0ZSwgdGhlIHVwZGF0ZSA9PSAyCisgICBwYXNzIGRvZXMgdGhlIGFjdHVhbCBJL08uICovCit2b2lkIGludmFsaWRhdGVfYmRldihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBpbnQgZGVzdHJveV9kaXJ0eV9idWZmZXJzKQoreworCWludmFsaWRhdGVfYmhfbHJ1cygpOworCS8qCisJICogRklYTUU6IHdoYXQgYWJvdXQgZGVzdHJveV9kaXJ0eV9idWZmZXJzPworCSAqIFdlIHJlYWxseSB3YW50IHRvIHVzZSBpbnZhbGlkYXRlX2lub2RlX3BhZ2VzMigpIGZvcgorCSAqIHRoYXQsIGJ1dCBub3QgdW50aWwgdGhhdCdzIGNsZWFuZWQgdXAuCisJICovCisJaW52YWxpZGF0ZV9pbm9kZV9wYWdlcyhiZGV2LT5iZF9pbm9kZS0+aV9tYXBwaW5nKTsKK30KKworLyoKKyAqIEtpY2sgcGRmbHVzaCB0aGVuIHRyeSB0byBmcmVlIHVwIHNvbWUgWk9ORV9OT1JNQUwgbWVtb3J5LgorICovCitzdGF0aWMgdm9pZCBmcmVlX21vcmVfbWVtb3J5KHZvaWQpCit7CisJc3RydWN0IHpvbmUgKip6b25lczsKKwlwZ19kYXRhX3QgKnBnZGF0OworCisJd2FrZXVwX2JkZmx1c2goMTAyNCk7CisJeWllbGQoKTsKKworCWZvcl9lYWNoX3BnZGF0KHBnZGF0KSB7CisJCXpvbmVzID0gcGdkYXQtPm5vZGVfem9uZWxpc3RzW0dGUF9OT0ZTJkdGUF9aT05FTUFTS10uem9uZXM7CisJCWlmICgqem9uZXMpCisJCQl0cnlfdG9fZnJlZV9wYWdlcyh6b25lcywgR0ZQX05PRlMsIDApOworCX0KK30KKworLyoKKyAqIEkvTyBjb21wbGV0aW9uIGhhbmRsZXIgZm9yIGJsb2NrX3JlYWRfZnVsbF9wYWdlKCkgLSBwYWdlcworICogd2hpY2ggY29tZSB1bmxvY2tlZCBhdCB0aGUgZW5kIG9mIEkvTy4KKyAqLworc3RhdGljIHZvaWQgZW5kX2J1ZmZlcl9hc3luY19yZWFkKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB1cHRvZGF0ZSkKK3sKKwlzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHBhZ2VfdXB0b2RhdGVfbG9jayk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRtcDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlpbnQgcGFnZV91cHRvZGF0ZSA9IDE7CisKKwlCVUdfT04oIWJ1ZmZlcl9hc3luY19yZWFkKGJoKSk7CisKKwlwYWdlID0gYmgtPmJfcGFnZTsKKwlpZiAodXB0b2RhdGUpIHsKKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJfSBlbHNlIHsKKwkJY2xlYXJfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKKwkJCWJ1ZmZlcl9pb19lcnJvcihiaCk7CisJCVNldFBhZ2VFcnJvcihwYWdlKTsKKwl9CisKKwkvKgorCSAqIEJlIF92ZXJ5XyBjYXJlZnVsIGZyb20gaGVyZSBvbi4gQmFkIHRoaW5ncyBjYW4gaGFwcGVuIGlmCisJICogdHdvIGJ1ZmZlciBoZWFkcyBlbmQgSU8gYXQgYWxtb3N0IHRoZSBzYW1lIHRpbWUgYW5kIGJvdGgKKwkgKiBkZWNpZGUgdGhhdCB0aGUgcGFnZSBpcyBub3cgY29tcGxldGVseSBkb25lLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwYWdlX3VwdG9kYXRlX2xvY2ssIGZsYWdzKTsKKwljbGVhcl9idWZmZXJfYXN5bmNfcmVhZChiaCk7CisJdW5sb2NrX2J1ZmZlcihiaCk7CisJdG1wID0gYmg7CisJZG8geworCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZSh0bXApKQorCQkJcGFnZV91cHRvZGF0ZSA9IDA7CisJCWlmIChidWZmZXJfYXN5bmNfcmVhZCh0bXApKSB7CisJCQlCVUdfT04oIWJ1ZmZlcl9sb2NrZWQodG1wKSk7CisJCQlnb3RvIHN0aWxsX2J1c3k7CisJCX0KKwkJdG1wID0gdG1wLT5iX3RoaXNfcGFnZTsKKwl9IHdoaWxlICh0bXAgIT0gYmgpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBhZ2VfdXB0b2RhdGVfbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBJZiBub25lIG9mIHRoZSBidWZmZXJzIGhhZCBlcnJvcnMgYW5kIHRoZXkgYXJlIGFsbAorCSAqIHVwdG9kYXRlIHRoZW4gd2UgY2FuIHNldCB0aGUgcGFnZSB1cHRvZGF0ZS4KKwkgKi8KKwlpZiAocGFnZV91cHRvZGF0ZSAmJiAhUGFnZUVycm9yKHBhZ2UpKQorCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuOworCitzdGlsbF9idXN5OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBhZ2VfdXB0b2RhdGVfbG9jaywgZmxhZ3MpOworCXJldHVybjsKK30KKworLyoKKyAqIENvbXBsZXRpb24gaGFuZGxlciBmb3IgYmxvY2tfd3JpdGVfZnVsbF9wYWdlKCkgLSBwYWdlcyB3aGljaCBhcmUgdW5sb2NrZWQKKyAqIGR1cmluZyBJL08sIGFuZCB3aGljaCBoYXZlIFBhZ2VXcml0ZWJhY2sgY2xlYXJlZCB1cG9uIEkvTyBjb21wbGV0aW9uLgorICovCit2b2lkIGVuZF9idWZmZXJfYXN5bmNfd3JpdGUoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHVwdG9kYXRlKQoreworCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKKwlzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHBhZ2VfdXB0b2RhdGVfbG9jayk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRtcDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCUJVR19PTighYnVmZmVyX2FzeW5jX3dyaXRlKGJoKSk7CisKKwlwYWdlID0gYmgtPmJfcGFnZTsKKwlpZiAodXB0b2RhdGUpIHsKKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJfSBlbHNlIHsKKwkJaWYgKHByaW50a19yYXRlbGltaXQoKSkgeworCQkJYnVmZmVyX2lvX2Vycm9yKGJoKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImxvc3QgcGFnZSB3cml0ZSBkdWUgdG8gIgorCQkJCQkiSS9PIGVycm9yIG9uICVzXG4iLAorCQkJICAgICAgIGJkZXZuYW1lKGJoLT5iX2JkZXYsIGIpKTsKKwkJfQorCQlzZXRfYml0KEFTX0VJTywgJnBhZ2UtPm1hcHBpbmctPmZsYWdzKTsKKwkJY2xlYXJfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJU2V0UGFnZUVycm9yKHBhZ2UpOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZwYWdlX3VwdG9kYXRlX2xvY2ssIGZsYWdzKTsKKwljbGVhcl9idWZmZXJfYXN5bmNfd3JpdGUoYmgpOworCXVubG9ja19idWZmZXIoYmgpOworCXRtcCA9IGJoLT5iX3RoaXNfcGFnZTsKKwl3aGlsZSAodG1wICE9IGJoKSB7CisJCWlmIChidWZmZXJfYXN5bmNfd3JpdGUodG1wKSkgeworCQkJQlVHX09OKCFidWZmZXJfbG9ja2VkKHRtcCkpOworCQkJZ290byBzdGlsbF9idXN5OworCQl9CisJCXRtcCA9IHRtcC0+Yl90aGlzX3BhZ2U7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBhZ2VfdXB0b2RhdGVfbG9jaywgZmxhZ3MpOworCWVuZF9wYWdlX3dyaXRlYmFjayhwYWdlKTsKKwlyZXR1cm47CisKK3N0aWxsX2J1c3k6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGFnZV91cHRvZGF0ZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuOworfQorCisvKgorICogSWYgYSBwYWdlJ3MgYnVmZmVycyBhcmUgdW5kZXIgYXN5bmMgcmVhZGluIChlbmRfYnVmZmVyX2FzeW5jX3JlYWQKKyAqIGNvbXBsZXRpb24pIHRoZW4gdGhlcmUgaXMgYSBwb3NzaWJpbGl0eSB0aGF0IGFub3RoZXIgdGhyZWFkIG9mCisgKiBjb250cm9sIGNvdWxkIGxvY2sgb25lIG9mIHRoZSBidWZmZXJzIGFmdGVyIGl0IGhhcyBjb21wbGV0ZWQKKyAqIGJ1dCB3aGlsZSBzb21lIG9mIHRoZSBvdGhlciBidWZmZXJzIGhhdmUgbm90IGNvbXBsZXRlZC4gIFRoaXMKKyAqIGxvY2tlZCBidWZmZXIgd291bGQgY29uZnVzZSBlbmRfYnVmZmVyX2FzeW5jX3JlYWQoKSBpbnRvIG5vdCB1bmxvY2tpbmcKKyAqIHRoZSBwYWdlLiAgU28gdGhlIGFic2VuY2Ugb2YgQkhfQXN5bmNfUmVhZCB0ZWxscyBlbmRfYnVmZmVyX2FzeW5jX3JlYWQoKQorICogdGhhdCB0aGlzIGJ1ZmZlciBpcyBub3QgdW5kZXIgYXN5bmMgSS9PLgorICoKKyAqIFRoZSBwYWdlIGNvbWVzIHVubG9ja2VkIHdoZW4gaXQgaGFzIG5vIGxvY2tlZCBidWZmZXJfYXN5bmMgYnVmZmVycworICogbGVmdC4KKyAqCisgKiBQYWdlTG9ja2VkIHByZXZlbnRzIGFueW9uZSBzdGFydGluZyBuZXcgYXN5bmMgSS9PIHJlYWRzIGFueSBvZgorICogdGhlIGJ1ZmZlcnMuCisgKgorICogUGFnZVdyaXRlYmFjayBpcyB1c2VkIHRvIHByZXZlbnQgc2ltdWx0YW5lb3VzIHdyaXRlb3V0IG9mIHRoZSBzYW1lCisgKiBwYWdlLgorICoKKyAqIFBhZ2VMb2NrZWQgcHJldmVudHMgYW55b25lIGZyb20gc3RhcnRpbmcgd3JpdGViYWNrIG9mIGEgcGFnZSB3aGljaCBpcworICogdW5kZXIgcmVhZCBJL08gKFBhZ2VXcml0ZWJhY2sgaXMgb25seSBldmVyIHNldCBhZ2FpbnN0IGEgbG9ja2VkIHBhZ2UpLgorICovCitzdGF0aWMgdm9pZCBtYXJrX2J1ZmZlcl9hc3luY19yZWFkKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJYmgtPmJfZW5kX2lvID0gZW5kX2J1ZmZlcl9hc3luY19yZWFkOworCXNldF9idWZmZXJfYXN5bmNfcmVhZChiaCk7Cit9CisKK3ZvaWQgbWFya19idWZmZXJfYXN5bmNfd3JpdGUoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwliaC0+Yl9lbmRfaW8gPSBlbmRfYnVmZmVyX2FzeW5jX3dyaXRlOworCXNldF9idWZmZXJfYXN5bmNfd3JpdGUoYmgpOworfQorRVhQT1JUX1NZTUJPTChtYXJrX2J1ZmZlcl9hc3luY193cml0ZSk7CisKKworLyoKKyAqIGZzL2J1ZmZlci5jIGNvbnRhaW5zIGhlbHBlciBmdW5jdGlvbnMgZm9yIGJ1ZmZlci1iYWNrZWQgYWRkcmVzcyBzcGFjZSdzCisgKiBmc3luYyBmdW5jdGlvbnMuICBBIGNvbW1vbiByZXF1aXJlbWVudCBmb3IgYnVmZmVyLWJhc2VkIGZpbGVzeXN0ZW1zIGlzCisgKiB0aGF0IGNlcnRhaW4gZGF0YSBmcm9tIHRoZSBiYWNraW5nIGJsb2NrZGV2IG5lZWRzIHRvIGJlIHdyaXR0ZW4gb3V0IGZvcgorICogYSBzdWNjZXNzZnVsIGZzeW5jKCkuICBGb3IgZXhhbXBsZSwgZXh0MiBpbmRpcmVjdCBibG9ja3MgbmVlZCB0byBiZQorICogd3JpdHRlbiBiYWNrIGFuZCB3YWl0ZWQgdXBvbiBiZWZvcmUgZnN5bmMoKSByZXR1cm5zLgorICoKKyAqIFRoZSBmdW5jdGlvbnMgbWFya19idWZmZXJfaW5vZGVfZGlydHkoKSwgZnN5bmNfaW5vZGVfYnVmZmVycygpLAorICogaW5vZGVfaGFzX2J1ZmZlcnMoKSBhbmQgaW52YWxpZGF0ZV9pbm9kZV9idWZmZXJzKCkgYXJlIHByb3ZpZGVkIGZvciB0aGUKKyAqIG1hbmFnZW1lbnQgb2YgYSBsaXN0IG9mIGRlcGVuZGVudCBidWZmZXJzIGF0IC0+aV9tYXBwaW5nLT5wcml2YXRlX2xpc3QuCisgKgorICogTG9ja2luZyBpcyBhIGxpdHRsZSBzdWJ0bGU6IHRyeV90b19mcmVlX2J1ZmZlcnMoKSB3aWxsIHJlbW92ZSBidWZmZXJzCisgKiBmcm9tIHRoZWlyIGNvbnRyb2xsaW5nIGlub2RlJ3MgcXVldWUgd2hlbiB0aGV5IGFyZSBiZWluZyBmcmVlZC4gIEJ1dAorICogdHJ5X3RvX2ZyZWVfYnVmZmVycygpIHdpbGwgYmUgb3BlcmF0aW5nIGFnYWluc3QgdGhlICpibG9ja2RldiogbWFwcGluZworICogYXQgdGhlIHRpbWUsIG5vdCBhZ2FpbnN0IHRoZSBTX0lTUkVHIGZpbGUgd2hpY2ggZGVwZW5kcyBvbiB0aG9zZSBidWZmZXJzLgorICogU28gdGhlIGxvY2tpbmcgZm9yIHByaXZhdGVfbGlzdCBpcyB2aWEgdGhlIHByaXZhdGVfbG9jayBpbiB0aGUgYWRkcmVzc19zcGFjZQorICogd2hpY2ggYmFja3MgdGhlIGJ1ZmZlcnMuICBXaGljaCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgYWRkcmVzc19zcGFjZSAKKyAqIGFnYWluc3Qgd2hpY2ggdGhlIGJ1ZmZlcnMgYXJlIGxpc3RlZC4gIFNvIGZvciBhIHBhcnRpY3VsYXIgYWRkcmVzc19zcGFjZSwKKyAqIG1hcHBpbmctPnByaXZhdGVfbG9jayBkb2VzICpub3QqIHByb3RlY3QgbWFwcGluZy0+cHJpdmF0ZV9saXN0ISAgSW4gZmFjdCwKKyAqIG1hcHBpbmctPnByaXZhdGVfbGlzdCB3aWxsIGFsd2F5cyBiZSBwcm90ZWN0ZWQgYnkgdGhlIGJhY2tpbmcgYmxvY2tkZXYncworICogLT5wcml2YXRlX2xvY2suCisgKgorICogV2hpY2ggaW50cm9kdWNlcyBhIHJlcXVpcmVtZW50OiBhbGwgYnVmZmVycyBvbiBhbiBhZGRyZXNzX3NwYWNlJ3MKKyAqIC0+cHJpdmF0ZV9saXN0IG11c3QgYmUgZnJvbSB0aGUgc2FtZSBhZGRyZXNzX3NwYWNlOiB0aGUgYmxvY2tkZXYncy4KKyAqCisgKiBhZGRyZXNzX3NwYWNlcyB3aGljaCBkbyBub3QgcGxhY2UgYnVmZmVycyBhdCAtPnByaXZhdGVfbGlzdCB2aWEgdGhlc2UKKyAqIHV0aWxpdHkgZnVuY3Rpb25zIGFyZSBmcmVlIHRvIHVzZSBwcml2YXRlX2xvY2sgYW5kIHByaXZhdGVfbGlzdCBmb3IKKyAqIHdoYXRldmVyIHRoZXkgd2FudC4gIFRoZSBvbmx5IHJlcXVpcmVtZW50IGlzIHRoYXQgbGlzdF9lbXB0eShwcml2YXRlX2xpc3QpCisgKiBiZSB0cnVlIGF0IGNsZWFyX2lub2RlKCkgdGltZS4KKyAqCisgKiBGSVhNRTogY2xlYXJfaW5vZGUgc2hvdWxkIG5vdCBjYWxsIGludmFsaWRhdGVfaW5vZGVfYnVmZmVycygpLiAgVGhlCisgKiBmaWxlc3lzdGVtcyBzaG91bGQgZG8gdGhhdC4gIGludmFsaWRhdGVfaW5vZGVfYnVmZmVycygpIHNob3VsZCBqdXN0IGdvCisgKiBCVUdfT04oIWxpc3RfZW1wdHkpLgorICoKKyAqIEZJWE1FOiBtYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZSgpIGlzIGEgZGF0YS1wbGFuZSBvcGVyYXRpb24uICBJdCBzaG91bGQKKyAqIHRha2UgYW4gYWRkcmVzc19zcGFjZSwgbm90IGFuIGlub2RlLiAgQW5kIGl0IHNob3VsZCBiZSBjYWxsZWQKKyAqIG1hcmtfYnVmZmVyX2RpcnR5X2ZzeW5jKCkgdG8gY2xlYXJseSBkZWZpbmUgd2h5IHRob3NlIGJ1ZmZlcnMgYXJlIGJlaW5nCisgKiBxdWV1ZWQgdXAuCisgKgorICogRklYTUU6IG1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKCkgZG9lc24ndCBuZWVkIHRvIGFkZCB0aGUgYnVmZmVyIHRvIHRoZQorICogbGlzdCBpZiBpdCBpcyBhbHJlYWR5IG9uIGEgbGlzdC4gIEJlY2F1c2UgaWYgdGhlIGJ1ZmZlciBpcyBvbiBhIGxpc3QsCisgKiBpdCAqbXVzdCogYWxyZWFkeSBiZSBvbiB0aGUgcmlnaHQgb25lLiAgSWYgbm90LCB0aGUgZmlsZXN5c3RlbSBpcyBiZWluZworICogc2lsbHkuICBUaGlzIHdpbGwgc2F2ZSBhIHRvbiBvZiBsb2NraW5nLiAgQnV0IGZpcnN0IHdlIGhhdmUgdG8gZW5zdXJlCisgKiB0aGF0IGJ1ZmZlcnMgYXJlIHRha2VuICpvZmYqIHRoZSBvbGQgaW5vZGUncyBsaXN0IHdoZW4gdGhleSBhcmUgZnJlZWQKKyAqIChwcmVzdW1hYmx5IGluIHRydW5jYXRlKS4gIFRoYXQgcmVxdWlyZXMgY2FyZWZ1bCBhdWRpdGluZyBvZiBhbGwKKyAqIGZpbGVzeXN0ZW1zIChkbyBpdCBpbnNpZGUgYmZvcmdldCgpKS4gIEl0IGNvdWxkIGFsc28gYmUgZG9uZSBieSBicmluZ2luZworICogYl9pbm9kZSBiYWNrLgorICovCisKKy8qCisgKiBUaGUgYnVmZmVyJ3MgYmFja2luZyBhZGRyZXNzX3NwYWNlJ3MgcHJpdmF0ZV9sb2NrIG11c3QgYmUgaGVsZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19yZW1vdmVfYXNzb2NfcXVldWUoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlsaXN0X2RlbF9pbml0KCZiaC0+Yl9hc3NvY19idWZmZXJzKTsKK30KKworaW50IGlub2RlX2hhc19idWZmZXJzKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuICFsaXN0X2VtcHR5KCZpbm9kZS0+aV9kYXRhLnByaXZhdGVfbGlzdCk7Cit9CisKKy8qCisgKiBvc3luYyBpcyBkZXNpZ25lZCB0byBzdXBwb3J0IE9fU1lOQyBpby4gIEl0IHdhaXRzIHN5bmNocm9ub3VzbHkgZm9yCisgKiBhbGwgYWxyZWFkeS1zdWJtaXR0ZWQgSU8gdG8gY29tcGxldGUsIGJ1dCBkb2VzIG5vdCBxdWV1ZSBhbnkgbmV3CisgKiB3cml0ZXMgdG8gdGhlIGRpc2suCisgKgorICogVG8gZG8gT19TWU5DIHdyaXRlcywganVzdCBxdWV1ZSB0aGUgYnVmZmVyIHdyaXRlcyB3aXRoIGxsX3J3X2Jsb2NrIGFzCisgKiB5b3UgZGlydHkgdGhlIGJ1ZmZlcnMsIGFuZCB0aGVuIHVzZSBvc3luY19pbm9kZV9idWZmZXJzIHRvIHdhaXQgZm9yCisgKiBjb21wbGV0aW9uLiAgQW55IG90aGVyIGRpcnR5IGJ1ZmZlcnMgd2hpY2ggYXJlIG5vdCB5ZXQgcXVldWVkIGZvcgorICogd3JpdGUgd2lsbCBub3QgYmUgZmx1c2hlZCB0byBkaXNrIGJ5IHRoZSBvc3luYy4KKyAqLworc3RhdGljIGludCBvc3luY19idWZmZXJzX2xpc3Qoc3BpbmxvY2tfdCAqbG9jaywgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJaW50IGVyciA9IDA7CisKKwlzcGluX2xvY2sobG9jayk7CityZXBlYXQ6CisJbGlzdF9mb3JfZWFjaF9wcmV2KHAsIGxpc3QpIHsKKwkJYmggPSBCSF9FTlRSWShwKTsKKwkJaWYgKGJ1ZmZlcl9sb2NrZWQoYmgpKSB7CisJCQlnZXRfYmgoYmgpOworCQkJc3Bpbl91bmxvY2sobG9jayk7CisJCQl3YWl0X29uX2J1ZmZlcihiaCk7CisJCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCQkJZXJyID0gLUVJTzsKKwkJCWJyZWxzZShiaCk7CisJCQlzcGluX2xvY2sobG9jayk7CisJCQlnb3RvIHJlcGVhdDsKKwkJfQorCX0KKwlzcGluX3VubG9jayhsb2NrKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIHN5bmNfbWFwcGluZ19idWZmZXJzIC0gd3JpdGUgb3V0IGFuZCB3YWl0IHVwb24gYSBtYXBwaW5nJ3MgImFzc29jaWF0ZWQiCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnMKKyAqIEBidWZmZXJfbWFwcGluZyAtIHRoZSBtYXBwaW5nIHdoaWNoIGJhY2tzIHRoZSBidWZmZXJzJyBkYXRhCisgKiBAbWFwcGluZyAtIHRoZSBtYXBwaW5nIHdoaWNoIHdhbnRzIHRob3NlIGJ1ZmZlcnMgd3JpdHRlbgorICoKKyAqIFN0YXJ0cyBJL08gYWdhaW5zdCB0aGUgYnVmZmVycyBhdCBtYXBwaW5nLT5wcml2YXRlX2xpc3QsIGFuZCB3YWl0cyB1cG9uCisgKiB0aGF0IEkvTy4KKyAqCisgKiBCYXNpY2FsbHksIHRoaXMgaXMgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgZnN5bmMoKS4gIEBidWZmZXJfbWFwcGluZyBpcworICogdGhlIGJsb2NrZGV2IHdoaWNoICJvd25zIiB0aGUgYnVmZmVycyBhbmQgQG1hcHBpbmcgaXMgYSBmaWxlIG9yIGRpcmVjdG9yeQorICogd2hpY2ggbmVlZHMgdGhvc2UgYnVmZmVycyB0byBiZSB3cml0dGVuIGZvciBhIHN1Y2Nlc3NmdWwgZnN5bmMoKS4KKyAqLworaW50IHN5bmNfbWFwcGluZ19idWZmZXJzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nKQoreworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICpidWZmZXJfbWFwcGluZyA9IG1hcHBpbmctPmFzc29jX21hcHBpbmc7CisKKwlpZiAoYnVmZmVyX21hcHBpbmcgPT0gTlVMTCB8fCBsaXN0X2VtcHR5KCZtYXBwaW5nLT5wcml2YXRlX2xpc3QpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBmc3luY19idWZmZXJzX2xpc3QoJmJ1ZmZlcl9tYXBwaW5nLT5wcml2YXRlX2xvY2ssCisJCQkJCSZtYXBwaW5nLT5wcml2YXRlX2xpc3QpOworfQorRVhQT1JUX1NZTUJPTChzeW5jX21hcHBpbmdfYnVmZmVycyk7CisKKy8qCisgKiBDYWxsZWQgd2hlbiB3ZSd2ZSByZWNlbnRseSB3cml0dGVuIGJsb2NrIGBiYmxvY2snLCBhbmQgaXQgaXMga25vd24gdGhhdAorICogYGJibG9jaycgd2FzIGZvciBhIGJ1ZmZlcl9ib3VuZGFyeSgpIGJ1ZmZlci4gIFRoaXMgbWVhbnMgdGhhdCB0aGUgYmxvY2sgYXQKKyAqIGBiYmxvY2sgKyAxJyBpcyBwcm9iYWJseSBhIGRpcnR5IGluZGlyZWN0IGJsb2NrLiAgSHVudCBpdCBkb3duIGFuZCwgaWYgaXQncworICogZGlydHksIHNjaGVkdWxlIGl0IGZvciBJTy4gIFNvIHRoYXQgaW5kaXJlY3RzIG1lcmdlIG5pY2VseSB3aXRoIHRoZWlyIGRhdGEuCisgKi8KK3ZvaWQgd3JpdGVfYm91bmRhcnlfYmxvY2soc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJCXNlY3Rvcl90IGJibG9jaywgdW5zaWduZWQgYmxvY2tzaXplKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBfX2ZpbmRfZ2V0X2Jsb2NrKGJkZXYsIGJibG9jayArIDEsIGJsb2Nrc2l6ZSk7CisJaWYgKGJoKSB7CisJCWlmIChidWZmZXJfZGlydHkoYmgpKQorCQkJbGxfcndfYmxvY2soV1JJVEUsIDEsICZiaCk7CisJCXB1dF9iaChiaCk7CisJfQorfQorCit2b2lkIG1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICpidWZmZXJfbWFwcGluZyA9IGJoLT5iX3BhZ2UtPm1hcHBpbmc7CisKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJaWYgKCFtYXBwaW5nLT5hc3NvY19tYXBwaW5nKSB7CisJCW1hcHBpbmctPmFzc29jX21hcHBpbmcgPSBidWZmZXJfbWFwcGluZzsKKwl9IGVsc2UgeworCQlpZiAobWFwcGluZy0+YXNzb2NfbWFwcGluZyAhPSBidWZmZXJfbWFwcGluZykKKwkJCUJVRygpOworCX0KKwlpZiAobGlzdF9lbXB0eSgmYmgtPmJfYXNzb2NfYnVmZmVycykpIHsKKwkJc3Bpbl9sb2NrKCZidWZmZXJfbWFwcGluZy0+cHJpdmF0ZV9sb2NrKTsKKwkJbGlzdF9tb3ZlX3RhaWwoJmJoLT5iX2Fzc29jX2J1ZmZlcnMsCisJCQkJJm1hcHBpbmctPnByaXZhdGVfbGlzdCk7CisJCXNwaW5fdW5sb2NrKCZidWZmZXJfbWFwcGluZy0+cHJpdmF0ZV9sb2NrKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKG1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKTsKKworLyoKKyAqIEFkZCBhIHBhZ2UgdG8gdGhlIGRpcnR5IHBhZ2UgbGlzdC4KKyAqCisgKiBJdCBpcyBhIHNhZCBmYWN0IG9mIGxpZmUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHNldmVyYWwgcGxhY2VzCisgKiBkZWVwbHkgdW5kZXIgc3BpbmxvY2tpbmcuICBJdCBtYXkgbm90IHNsZWVwLgorICoKKyAqIElmIHRoZSBwYWdlIGhhcyBidWZmZXJzLCB0aGUgdXB0b2RhdGUgYnVmZmVycyBhcmUgc2V0IGRpcnR5LCB0byBwcmVzZXJ2ZQorICogZGlydHktc3RhdGUgY29oZXJlbmN5IGJldHdlZW4gdGhlIHBhZ2UgYW5kIHRoZSBidWZmZXJzLiAgSXQgdGhlIHBhZ2UgZG9lcworICogbm90IGhhdmUgYnVmZmVycyB0aGVuIHdoZW4gdGhleSBhcmUgbGF0ZXIgYXR0YWNoZWQgdGhleSB3aWxsIGFsbCBiZSBzZXQKKyAqIGRpcnR5LgorICoKKyAqIFRoZSBidWZmZXJzIGFyZSBkaXJ0aWVkIGJlZm9yZSB0aGUgcGFnZSBpcyBkaXJ0aWVkLiAgVGhlcmUncyBhIHNtYWxsIHJhY2UKKyAqIHdpbmRvdyBpbiB3aGljaCBhIHdyaXRlcGFnZSBjYWxsZXIgbWF5IHNlZSB0aGUgcGFnZSBjbGVhbm5lc3MgYnV0IG5vdCB0aGUKKyAqIGJ1ZmZlciBkaXJ0aW5lc3MuICBUaGF0J3MgZmluZS4gIElmIHRoaXMgY29kZSB3ZXJlIHRvIHNldCB0aGUgcGFnZSBkaXJ0eQorICogYmVmb3JlIHRoZSBidWZmZXJzLCBhIGNvbmN1cnJlbnQgd3JpdGVwYWdlIGNhbGxlciBjb3VsZCBjbGVhciB0aGUgcGFnZSBkaXJ0eQorICogYml0LCBzZWUgYSBidW5jaCBvZiBjbGVhbiBidWZmZXJzIGFuZCB3ZSdkIGVuZCB1cCB3aXRoIGRpcnR5IGJ1ZmZlcnMvY2xlYW4KKyAqIHBhZ2Ugb24gdGhlIGRpcnR5IHBhZ2UgbGlzdC4KKyAqCisgKiBXZSB1c2UgcHJpdmF0ZV9sb2NrIHRvIGxvY2sgYWdhaW5zdCB0cnlfdG9fZnJlZV9idWZmZXJzIHdoaWxlIHVzaW5nIHRoZQorICogcGFnZSdzIGJ1ZmZlciBsaXN0LiAgQWxzbyB1c2UgdGhpcyB0byBwcm90ZWN0IGFnYWluc3QgY2xlYW4gYnVmZmVycyBiZWluZworICogYWRkZWQgdG8gdGhlIHBhZ2UgYWZ0ZXIgaXQgd2FzIHNldCBkaXJ0eS4KKyAqCisgKiBGSVhNRTogbWF5IG5lZWQgdG8gY2FsbCAtPnJlc2VydmVwYWdlIGhlcmUgYXMgd2VsbC4gIFRoYXQncyByYXRoZXIgdXAgdG8gdGhlCisgKiBhZGRyZXNzX3NwYWNlIHRob3VnaC4KKyAqLworaW50IF9fc2V0X3BhZ2VfZGlydHlfYnVmZmVycyhzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqIGNvbnN0IG1hcHBpbmcgPSBwYWdlLT5tYXBwaW5nOworCisJc3Bpbl9sb2NrKCZtYXBwaW5nLT5wcml2YXRlX2xvY2spOworCWlmIChwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGhlYWQ7CisKKwkJZG8geworCQkJc2V0X2J1ZmZlcl9kaXJ0eShiaCk7CisJCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKKwkJfSB3aGlsZSAoYmggIT0gaGVhZCk7CisJfQorCXNwaW5fdW5sb2NrKCZtYXBwaW5nLT5wcml2YXRlX2xvY2spOworCisJaWYgKCFUZXN0U2V0UGFnZURpcnR5KHBhZ2UpKSB7CisJCXdyaXRlX2xvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOworCQlpZiAocGFnZS0+bWFwcGluZykgewkvKiBSYWNlIHdpdGggdHJ1bmNhdGU/ICovCisJCQlpZiAobWFwcGluZ19jYXBfYWNjb3VudF9kaXJ0eShtYXBwaW5nKSkKKwkJCQlpbmNfcGFnZV9zdGF0ZShucl9kaXJ0eSk7CisJCQlyYWRpeF90cmVlX3RhZ19zZXQoJm1hcHBpbmctPnBhZ2VfdHJlZSwKKwkJCQkJCXBhZ2VfaW5kZXgocGFnZSksCisJCQkJCQlQQUdFQ0FDSEVfVEFHX0RJUlRZKTsKKwkJfQorCQl3cml0ZV91bmxvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOworCQlfX21hcmtfaW5vZGVfZGlydHkobWFwcGluZy0+aG9zdCwgSV9ESVJUWV9QQUdFUyk7CisJfQorCQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChfX3NldF9wYWdlX2RpcnR5X2J1ZmZlcnMpOworCisvKgorICogV3JpdGUgb3V0IGFuZCB3YWl0IHVwb24gYSBsaXN0IG9mIGJ1ZmZlcnMuCisgKgorICogV2UgaGF2ZSBjb25mbGljdGluZyBwcmVzc3VyZXM6IHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgYWxsCisgKiBpbml0aWFsbHkgZGlydHkgYnVmZmVycyBnZXQgd2FpdGVkIG9uLCBidXQgdGhhdCBhbnkgc3Vic2VxdWVudGx5CisgKiBkaXJ0aWVkIGJ1ZmZlcnMgZG9uJ3QuICBBZnRlciBhbGwsIHdlIGRvbid0IHdhbnQgZnN5bmMgdG8gbGFzdAorICogZm9yZXZlciBpZiBzb21lYm9keSBpcyBhY3RpdmVseSB3cml0aW5nIHRvIHRoZSBmaWxlLgorICoKKyAqIERvIHRoaXMgaW4gdHdvIG1haW4gc3RhZ2VzOiBmaXJzdCB3ZSBjb3B5IGRpcnR5IGJ1ZmZlcnMgdG8gYQorICogdGVtcG9yYXJ5IGlub2RlIGxpc3QsIHF1ZXVlaW5nIHRoZSB3cml0ZXMgYXMgd2UgZ28uICBUaGVuIHdlIGNsZWFuCisgKiB1cCwgd2FpdGluZyBmb3IgdGhvc2Ugd3JpdGVzIHRvIGNvbXBsZXRlLgorICogCisgKiBEdXJpbmcgdGhpcyBzZWNvbmQgc3RhZ2UsIGFueSBzdWJzZXF1ZW50IHVwZGF0ZXMgdG8gdGhlIGZpbGUgbWF5IGVuZAorICogdXAgcmVmaWxpbmcgdGhlIGJ1ZmZlciBvbiB0aGUgb3JpZ2luYWwgaW5vZGUncyBkaXJ0eSBsaXN0IGFnYWluLCBzbworICogdGhlcmUgaXMgYSBjaGFuY2Ugd2Ugd2lsbCBlbmQgdXAgd2l0aCBhIGJ1ZmZlciBxdWV1ZWQgZm9yIHdyaXRlIGJ1dAorICogbm90IHlldCBjb21wbGV0ZWQgb24gdGhhdCBsaXN0LiAgU28sIGFzIGEgZmluYWwgY2xlYW51cCB3ZSBnbyB0aHJvdWdoCisgKiB0aGUgb3N5bmMgY29kZSB0byBjYXRjaCB0aGVzZSBsb2NrZWQsIGRpcnR5IGJ1ZmZlcnMgd2l0aG91dCByZXF1ZXVpbmcKKyAqIGFueSBuZXdseSBkaXJ0eSBidWZmZXJzIGZvciB3cml0ZS4KKyAqLworc3RhdGljIGludCBmc3luY19idWZmZXJzX2xpc3Qoc3BpbmxvY2tfdCAqbG9jaywgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBsaXN0X2hlYWQgdG1wOworCWludCBlcnIgPSAwLCBlcnIyOworCisJSU5JVF9MSVNUX0hFQUQoJnRtcCk7CisKKwlzcGluX2xvY2sobG9jayk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KGxpc3QpKSB7CisJCWJoID0gQkhfRU5UUlkobGlzdC0+bmV4dCk7CisJCWxpc3RfZGVsX2luaXQoJmJoLT5iX2Fzc29jX2J1ZmZlcnMpOworCQlpZiAoYnVmZmVyX2RpcnR5KGJoKSB8fCBidWZmZXJfbG9ja2VkKGJoKSkgeworCQkJbGlzdF9hZGQoJmJoLT5iX2Fzc29jX2J1ZmZlcnMsICZ0bXApOworCQkJaWYgKGJ1ZmZlcl9kaXJ0eShiaCkpIHsKKwkJCQlnZXRfYmgoYmgpOworCQkJCXNwaW5fdW5sb2NrKGxvY2spOworCQkJCS8qCisJCQkJICogRW5zdXJlIGFueSBwZW5kaW5nIEkvTyBjb21wbGV0ZXMgc28gdGhhdAorCQkJCSAqIGxsX3J3X2Jsb2NrKCkgYWN0dWFsbHkgd3JpdGVzIHRoZSBjdXJyZW50CisJCQkJICogY29udGVudHMgLSBpdCBpcyBhIG5vb3AgaWYgSS9PIGlzIHN0aWxsIGluCisJCQkJICogZmxpZ2h0IG9uIHBvdGVudGlhbGx5IG9sZGVyIGNvbnRlbnRzLgorCQkJCSAqLworCQkJCXdhaXRfb25fYnVmZmVyKGJoKTsKKwkJCQlsbF9yd19ibG9jayhXUklURSwgMSwgJmJoKTsKKwkJCQlicmVsc2UoYmgpOworCQkJCXNwaW5fbG9jayhsb2NrKTsKKwkJCX0KKwkJfQorCX0KKworCXdoaWxlICghbGlzdF9lbXB0eSgmdG1wKSkgeworCQliaCA9IEJIX0VOVFJZKHRtcC5wcmV2KTsKKwkJX19yZW1vdmVfYXNzb2NfcXVldWUoYmgpOworCQlnZXRfYmgoYmgpOworCQlzcGluX3VubG9jayhsb2NrKTsKKwkJd2FpdF9vbl9idWZmZXIoYmgpOworCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCQllcnIgPSAtRUlPOworCQlicmVsc2UoYmgpOworCQlzcGluX2xvY2sobG9jayk7CisJfQorCQorCXNwaW5fdW5sb2NrKGxvY2spOworCWVycjIgPSBvc3luY19idWZmZXJzX2xpc3QobG9jaywgbGlzdCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwllbHNlCisJCXJldHVybiBlcnIyOworfQorCisvKgorICogSW52YWxpZGF0ZSBhbnkgYW5kIGFsbCBkaXJ0eSBidWZmZXJzIG9uIGEgZ2l2ZW4gaW5vZGUuICBXZSBhcmUKKyAqIHByb2JhYmx5IHVubW91bnRpbmcgdGhlIGZzLCBidXQgdGhhdCBkb2Vzbid0IG1lYW4gd2UgaGF2ZSBhbHJlYWR5CisgKiBkb25lIGEgc3luYygpLiAgSnVzdCBkcm9wIHRoZSBidWZmZXJzIGZyb20gdGhlIGlub2RlIGxpc3QuCisgKgorICogTk9URTogd2UgdGFrZSB0aGUgaW5vZGUncyBibG9ja2RldidzIG1hcHBpbmcncyBwcml2YXRlX2xvY2suICBXaGljaAorICogYXNzdW1lcyB0aGF0IGFsbCB0aGUgYnVmZmVycyBhcmUgYWdhaW5zdCB0aGUgYmxvY2tkZXYuICBOb3QgdHJ1ZQorICogZm9yIHJlaXNlcmZzLgorICovCit2b2lkIGludmFsaWRhdGVfaW5vZGVfYnVmZmVycyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmIChpbm9kZV9oYXNfYnVmZmVycyhpbm9kZSkpIHsKKwkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSAmaW5vZGUtPmlfZGF0YTsKKwkJc3RydWN0IGxpc3RfaGVhZCAqbGlzdCA9ICZtYXBwaW5nLT5wcml2YXRlX2xpc3Q7CisJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICpidWZmZXJfbWFwcGluZyA9IG1hcHBpbmctPmFzc29jX21hcHBpbmc7CisKKwkJc3Bpbl9sb2NrKCZidWZmZXJfbWFwcGluZy0+cHJpdmF0ZV9sb2NrKTsKKwkJd2hpbGUgKCFsaXN0X2VtcHR5KGxpc3QpKQorCQkJX19yZW1vdmVfYXNzb2NfcXVldWUoQkhfRU5UUlkobGlzdC0+bmV4dCkpOworCQlzcGluX3VubG9jaygmYnVmZmVyX21hcHBpbmctPnByaXZhdGVfbG9jayk7CisJfQorfQorCisvKgorICogUmVtb3ZlIGFueSBjbGVhbiBidWZmZXJzIGZyb20gdGhlIGlub2RlJ3MgYnVmZmVyIGxpc3QuICBUaGlzIGlzIGNhbGxlZAorICogd2hlbiB3ZSdyZSB0cnlpbmcgdG8gZnJlZSB0aGUgaW5vZGUgaXRzZWxmLiAgVGhvc2UgYnVmZmVycyBjYW4gcGluIGl0LgorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiBhbGwgYnVmZmVycyB3ZXJlIHJlbW92ZWQuCisgKi8KK2ludCByZW1vdmVfaW5vZGVfYnVmZmVycyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWludCByZXQgPSAxOworCisJaWYgKGlub2RlX2hhc19idWZmZXJzKGlub2RlKSkgeworCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9ICZpbm9kZS0+aV9kYXRhOworCQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0ID0gJm1hcHBpbmctPnByaXZhdGVfbGlzdDsKKwkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKmJ1ZmZlcl9tYXBwaW5nID0gbWFwcGluZy0+YXNzb2NfbWFwcGluZzsKKworCQlzcGluX2xvY2soJmJ1ZmZlcl9tYXBwaW5nLT5wcml2YXRlX2xvY2spOworCQl3aGlsZSAoIWxpc3RfZW1wdHkobGlzdCkpIHsKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBCSF9FTlRSWShsaXN0LT5uZXh0KTsKKwkJCWlmIChidWZmZXJfZGlydHkoYmgpKSB7CisJCQkJcmV0ID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCV9fcmVtb3ZlX2Fzc29jX3F1ZXVlKGJoKTsKKwkJfQorCQlzcGluX3VubG9jaygmYnVmZmVyX21hcHBpbmctPnByaXZhdGVfbG9jayk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBDcmVhdGUgdGhlIGFwcHJvcHJpYXRlIGJ1ZmZlcnMgd2hlbiBnaXZlbiBhIHBhZ2UgZm9yIGRhdGEgYXJlYSBhbmQKKyAqIHRoZSBzaXplIG9mIGVhY2ggYnVmZmVyLi4gVXNlIHRoZSBiaC0+Yl90aGlzX3BhZ2UgbGlua2VkIGxpc3QgdG8KKyAqIGZvbGxvdyB0aGUgYnVmZmVycyBjcmVhdGVkLiAgUmV0dXJuIE5VTEwgaWYgdW5hYmxlIHRvIGNyZWF0ZSBtb3JlCisgKiBidWZmZXJzLgorICoKKyAqIFRoZSByZXRyeSBmbGFnIGlzIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSBhc3luYyBJTyAocGFnaW5nLCBzd2FwcGluZykKKyAqIHdoaWNoIG1heSBub3QgZmFpbCBmcm9tIG9yZGluYXJ5IGJ1ZmZlciBhbGxvY2F0aW9ucy4KKyAqLworc3RydWN0IGJ1ZmZlcl9oZWFkICphbGxvY19wYWdlX2J1ZmZlcnMoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJaW50IHJldHJ5KQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICpoZWFkOworCWxvbmcgb2Zmc2V0OworCit0cnlfYWdhaW46CisJaGVhZCA9IE5VTEw7CisJb2Zmc2V0ID0gUEFHRV9TSVpFOworCXdoaWxlICgob2Zmc2V0IC09IHNpemUpID49IDApIHsKKwkJYmggPSBhbGxvY19idWZmZXJfaGVhZChHRlBfTk9GUyk7CisJCWlmICghYmgpCisJCQlnb3RvIG5vX2dyb3c7CisKKwkJYmgtPmJfYmRldiA9IE5VTEw7CisJCWJoLT5iX3RoaXNfcGFnZSA9IGhlYWQ7CisJCWJoLT5iX2Jsb2NrbnIgPSAtMTsKKwkJaGVhZCA9IGJoOworCisJCWJoLT5iX3N0YXRlID0gMDsKKwkJYXRvbWljX3NldCgmYmgtPmJfY291bnQsIDApOworCQliaC0+Yl9zaXplID0gc2l6ZTsKKworCQkvKiBMaW5rIHRoZSBidWZmZXIgdG8gaXRzIHBhZ2UgKi8KKwkJc2V0X2JoX3BhZ2UoYmgsIHBhZ2UsIG9mZnNldCk7CisKKwkJYmgtPmJfZW5kX2lvID0gTlVMTDsKKwl9CisJcmV0dXJuIGhlYWQ7CisvKgorICogSW4gY2FzZSBhbnl0aGluZyBmYWlsZWQsIHdlIGp1c3QgZnJlZSBldmVyeXRoaW5nIHdlIGdvdC4KKyAqLworbm9fZ3JvdzoKKwlpZiAoaGVhZCkgeworCQlkbyB7CisJCQliaCA9IGhlYWQ7CisJCQloZWFkID0gaGVhZC0+Yl90aGlzX3BhZ2U7CisJCQlmcmVlX2J1ZmZlcl9oZWFkKGJoKTsKKwkJfSB3aGlsZSAoaGVhZCk7CisJfQorCisJLyoKKwkgKiBSZXR1cm4gZmFpbHVyZSBmb3Igbm9uLWFzeW5jIElPIHJlcXVlc3RzLiAgQXN5bmMgSU8gcmVxdWVzdHMKKwkgKiBhcmUgbm90IGFsbG93ZWQgdG8gZmFpbCwgc28gd2UgaGF2ZSB0byB3YWl0IHVudGlsIGJ1ZmZlciBoZWFkcworCSAqIGJlY29tZSBhdmFpbGFibGUuICBCdXQgd2UgZG9uJ3Qgd2FudCB0YXNrcyBzbGVlcGluZyB3aXRoIAorCSAqIHBhcnRpYWxseSBjb21wbGV0ZSBidWZmZXJzLCBzbyBhbGwgd2VyZSByZWxlYXNlZCBhYm92ZS4KKwkgKi8KKwlpZiAoIXJldHJ5KQorCQlyZXR1cm4gTlVMTDsKKworCS8qIFdlJ3JlIF9yZWFsbHlfIGxvdyBvbiBtZW1vcnkuIE5vdyB3ZSBqdXN0CisJICogd2FpdCBmb3Igb2xkIGJ1ZmZlciBoZWFkcyB0byBiZWNvbWUgZnJlZSBkdWUgdG8KKwkgKiBmaW5pc2hpbmcgSU8uICBTaW5jZSB0aGlzIGlzIGFuIGFzeW5jIHJlcXVlc3QgYW5kCisJICogdGhlIHJlc2VydmUgbGlzdCBpcyBlbXB0eSwgd2UncmUgc3VyZSB0aGVyZSBhcmUgCisJICogYXN5bmMgYnVmZmVyIGhlYWRzIGluIHVzZS4KKwkgKi8KKwlmcmVlX21vcmVfbWVtb3J5KCk7CisJZ290byB0cnlfYWdhaW47Cit9CitFWFBPUlRfU1lNQk9MX0dQTChhbGxvY19wYWdlX2J1ZmZlcnMpOworCitzdGF0aWMgaW5saW5lIHZvaWQKK2xpbmtfZGV2X2J1ZmZlcnMoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqdGFpbDsKKworCWJoID0gaGVhZDsKKwlkbyB7CisJCXRhaWwgPSBiaDsKKwkJYmggPSBiaC0+Yl90aGlzX3BhZ2U7CisJfSB3aGlsZSAoYmgpOworCXRhaWwtPmJfdGhpc19wYWdlID0gaGVhZDsKKwlhdHRhY2hfcGFnZV9idWZmZXJzKHBhZ2UsIGhlYWQpOworfQorCisvKgorICogSW5pdGlhbGlzZSB0aGUgc3RhdGUgb2YgYSBibG9ja2RldiBwYWdlJ3MgYnVmZmVycy4KKyAqLyAKK3N0YXRpYyB2b2lkCitpbml0X3BhZ2VfYnVmZmVycyhzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJCXNlY3Rvcl90IGJsb2NrLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGhlYWQ7CisJaW50IHVwdG9kYXRlID0gUGFnZVVwdG9kYXRlKHBhZ2UpOworCisJZG8geworCQlpZiAoIWJ1ZmZlcl9tYXBwZWQoYmgpKSB7CisJCQlpbml0X2J1ZmZlcihiaCwgTlVMTCwgTlVMTCk7CisJCQliaC0+Yl9iZGV2ID0gYmRldjsKKwkJCWJoLT5iX2Jsb2NrbnIgPSBibG9jazsKKwkJCWlmICh1cHRvZGF0ZSkKKwkJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJCXNldF9idWZmZXJfbWFwcGVkKGJoKTsKKwkJfQorCQlibG9jaysrOworCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKKwl9IHdoaWxlIChiaCAhPSBoZWFkKTsKK30KKworLyoKKyAqIENyZWF0ZSB0aGUgcGFnZS1jYWNoZSBwYWdlIHRoYXQgY29udGFpbnMgdGhlIHJlcXVlc3RlZCBibG9jay4KKyAqCisgKiBUaGlzIGlzIHVzZXIgcHVyZWx5IGZvciBibG9ja2RldiBtYXBwaW5ncy4KKyAqLworc3RhdGljIHN0cnVjdCBwYWdlICoKK2dyb3dfZGV2X3BhZ2Uoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc2VjdG9yX3QgYmxvY2ssCisJCXBnb2ZmX3QgaW5kZXgsIGludCBzaXplKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBiZGV2LT5iZF9pbm9kZTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCisJcGFnZSA9IGZpbmRfb3JfY3JlYXRlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgaW5kZXgsIEdGUF9OT0ZTKTsKKwlpZiAoIXBhZ2UpCisJCXJldHVybiBOVUxMOworCisJaWYgKCFQYWdlTG9ja2VkKHBhZ2UpKQorCQlCVUcoKTsKKworCWlmIChwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSB7CisJCWJoID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCQlpZiAoYmgtPmJfc2l6ZSA9PSBzaXplKSB7CisJCQlpbml0X3BhZ2VfYnVmZmVycyhwYWdlLCBiZGV2LCBibG9jaywgc2l6ZSk7CisJCQlyZXR1cm4gcGFnZTsKKwkJfQorCQlpZiAoIXRyeV90b19mcmVlX2J1ZmZlcnMocGFnZSkpCisJCQlnb3RvIGZhaWxlZDsKKwl9CisKKwkvKgorCSAqIEFsbG9jYXRlIHNvbWUgYnVmZmVycyBmb3IgdGhpcyBwYWdlCisJICovCisJYmggPSBhbGxvY19wYWdlX2J1ZmZlcnMocGFnZSwgc2l6ZSwgMCk7CisJaWYgKCFiaCkKKwkJZ290byBmYWlsZWQ7CisKKwkvKgorCSAqIExpbmsgdGhlIHBhZ2UgdG8gdGhlIGJ1ZmZlcnMgYW5kIGluaXRpYWxpc2UgdGhlbS4gIFRha2UgdGhlCisJICogbG9jayB0byBiZSBhdG9taWMgd3J0IF9fZmluZF9nZXRfYmxvY2soKSwgd2hpY2ggZG9lcyBub3QKKwkgKiBydW4gdW5kZXIgdGhlIHBhZ2UgbG9jay4KKwkgKi8KKwlzcGluX2xvY2soJmlub2RlLT5pX21hcHBpbmctPnByaXZhdGVfbG9jayk7CisJbGlua19kZXZfYnVmZmVycyhwYWdlLCBiaCk7CisJaW5pdF9wYWdlX2J1ZmZlcnMocGFnZSwgYmRldiwgYmxvY2ssIHNpemUpOworCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9tYXBwaW5nLT5wcml2YXRlX2xvY2spOworCXJldHVybiBwYWdlOworCitmYWlsZWQ6CisJQlVHKCk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCXJldHVybiBOVUxMOworfQorCisvKgorICogQ3JlYXRlIGJ1ZmZlcnMgZm9yIHRoZSBzcGVjaWZpZWQgYmxvY2sgZGV2aWNlIGJsb2NrJ3MgcGFnZS4gIElmCisgKiB0aGF0IHBhZ2Ugd2FzIGRpcnR5LCB0aGUgYnVmZmVycyBhcmUgc2V0IGRpcnR5IGFsc28uCisgKgorICogRXhjZXB0IHRoYXQncyBhIGJ1Zy4gIEF0dGFjaGluZyBkaXJ0eSBidWZmZXJzIHRvIGEgZGlydHkKKyAqIGJsb2NrZGV2J3MgcGFnZSBjYW4gcmVzdWx0IGluIGZpbGVzeXN0ZW0gY29ycnVwdGlvbiwgYmVjYXVzZQorICogc29tZSBvZiB0aG9zZSBidWZmZXJzIG1heSBiZSBhbGlhc2VzIG9mIGZpbGVzeXN0ZW0gZGF0YS4KKyAqIGdyb3dfZGV2X3BhZ2UoKSB3aWxsIGdvIEJVRygpIGlmIHRoaXMgaGFwcGVucy4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK2dyb3dfYnVmZmVycyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBibG9jaywgaW50IHNpemUpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJcGdvZmZfdCBpbmRleDsKKwlpbnQgc2l6ZWJpdHM7CisKKwlzaXplYml0cyA9IC0xOworCWRvIHsKKwkJc2l6ZWJpdHMrKzsKKwl9IHdoaWxlICgoc2l6ZSA8PCBzaXplYml0cykgPCBQQUdFX1NJWkUpOworCisJaW5kZXggPSBibG9jayA+PiBzaXplYml0czsKKwlibG9jayA9IGluZGV4IDw8IHNpemViaXRzOworCisJLyogQ3JlYXRlIGEgcGFnZSB3aXRoIHRoZSBwcm9wZXIgc2l6ZSBidWZmZXJzLi4gKi8KKwlwYWdlID0gZ3Jvd19kZXZfcGFnZShiZGV2LCBibG9jaywgaW5kZXgsIHNpemUpOworCWlmICghcGFnZSkKKwkJcmV0dXJuIDA7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCXJldHVybiAxOworfQorCitzdHJ1Y3QgYnVmZmVyX2hlYWQgKgorX19nZXRibGtfc2xvdyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBibG9jaywgaW50IHNpemUpCit7CisJLyogU2l6ZSBtdXN0IGJlIG11bHRpcGxlIG9mIGhhcmQgc2VjdG9yc2l6ZSAqLworCWlmICh1bmxpa2VseShzaXplICYgKGJkZXZfaGFyZHNlY3Rfc2l6ZShiZGV2KS0xKSB8fAorCQkJKHNpemUgPCA1MTIgfHwgc2l6ZSA+IFBBR0VfU0laRSkpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZ2V0YmxrKCk6IGludmFsaWQgYmxvY2sgc2l6ZSAlZCByZXF1ZXN0ZWRcbiIsCisJCQkJCXNpemUpOworCQlwcmludGsoS0VSTl9FUlIgImhhcmRzZWN0IHNpemU6ICVkXG4iLAorCQkJCQliZGV2X2hhcmRzZWN0X3NpemUoYmRldikpOworCisJCWR1bXBfc3RhY2soKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZm9yICg7OykgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKworCQliaCA9IF9fZmluZF9nZXRfYmxvY2soYmRldiwgYmxvY2ssIHNpemUpOworCQlpZiAoYmgpCisJCQlyZXR1cm4gYmg7CisKKwkJaWYgKCFncm93X2J1ZmZlcnMoYmRldiwgYmxvY2ssIHNpemUpKQorCQkJZnJlZV9tb3JlX21lbW9yeSgpOworCX0KK30KKworLyoKKyAqIFRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBkaXJ0eSBidWZmZXJzIGFuZCBkaXJ0eSBwYWdlczoKKyAqCisgKiBXaGVuZXZlciBhIHBhZ2UgaGFzIGFueSBkaXJ0eSBidWZmZXJzLCB0aGUgcGFnZSdzIGRpcnR5IGJpdCBpcyBzZXQsIGFuZAorICogdGhlIHBhZ2UgaXMgdGFnZ2VkIGRpcnR5IGluIGl0cyByYWRpeCB0cmVlLgorICoKKyAqIEF0IGFsbCB0aW1lcywgdGhlIGRpcnRpbmVzcyBvZiB0aGUgYnVmZmVycyByZXByZXNlbnRzIHRoZSBkaXJ0aW5lc3Mgb2YKKyAqIHN1YnNlY3Rpb25zIG9mIHRoZSBwYWdlLiAgSWYgdGhlIHBhZ2UgaGFzIGJ1ZmZlcnMsIHRoZSBwYWdlIGRpcnR5IGJpdCBpcworICogbWVyZWx5IGEgaGludCBhYm91dCB0aGUgdHJ1ZSBkaXJ0eSBzdGF0ZS4KKyAqCisgKiBXaGVuIGEgcGFnZSBpcyBzZXQgZGlydHkgaW4gaXRzIGVudGlyZXR5LCBhbGwgaXRzIGJ1ZmZlcnMgYXJlIG1hcmtlZCBkaXJ0eQorICogKGlmIHRoZSBwYWdlIGhhcyBidWZmZXJzKS4KKyAqCisgKiBXaGVuIGEgYnVmZmVyIGlzIG1hcmtlZCBkaXJ0eSwgaXRzIHBhZ2UgaXMgZGlydGllZCwgYnV0IHRoZSBwYWdlJ3Mgb3RoZXIKKyAqIGJ1ZmZlcnMgYXJlIG5vdC4KKyAqCisgKiBBbHNvLiAgV2hlbiBibG9ja2RldiBidWZmZXJzIGFyZSBleHBsaWNpdGx5IHJlYWQgd2l0aCBicmVhZCgpLCB0aGV5CisgKiBpbmRpdmlkdWFsbHkgYmVjb21lIHVwdG9kYXRlLiAgQnV0IHRoZWlyIGJhY2tpbmcgcGFnZSByZW1haW5zIG5vdAorICogdXB0b2RhdGUgLSBldmVuIGlmIGFsbCBvZiBpdHMgYnVmZmVycyBhcmUgdXB0b2RhdGUuICBBIHN1YnNlcXVlbnQKKyAqIGJsb2NrX3JlYWRfZnVsbF9wYWdlKCkgYWdhaW5zdCB0aGF0IHBhZ2Ugd2lsbCBkaXNjb3ZlciBhbGwgdGhlIHVwdG9kYXRlCisgKiBidWZmZXJzLCB3aWxsIHNldCB0aGUgcGFnZSB1cHRvZGF0ZSBhbmQgd2lsbCBwZXJmb3JtIG5vIEkvTy4KKyAqLworCisvKioKKyAqIG1hcmtfYnVmZmVyX2RpcnR5IC0gbWFyayBhIGJ1ZmZlcl9oZWFkIGFzIG5lZWRpbmcgd3JpdGVvdXQKKyAqCisgKiBtYXJrX2J1ZmZlcl9kaXJ0eSgpIHdpbGwgc2V0IHRoZSBkaXJ0eSBiaXQgYWdhaW5zdCB0aGUgYnVmZmVyLCB0aGVuIHNldCBpdHMKKyAqIGJhY2tpbmcgcGFnZSBkaXJ0eSwgdGhlbiB0YWcgdGhlIHBhZ2UgYXMgZGlydHkgaW4gaXRzIGFkZHJlc3Nfc3BhY2UncyByYWRpeAorICogdHJlZSBhbmQgdGhlbiBhdHRhY2ggdGhlIGFkZHJlc3Nfc3BhY2UncyBpbm9kZSB0byBpdHMgc3VwZXJibG9jaydzIGRpcnR5CisgKiBpbm9kZSBsaXN0LgorICoKKyAqIG1hcmtfYnVmZmVyX2RpcnR5KCkgaXMgYXRvbWljLiAgSXQgdGFrZXMgYmgtPmJfcGFnZS0+bWFwcGluZy0+cHJpdmF0ZV9sb2NrLAorICogbWFwcGluZy0+dHJlZV9sb2NrIGFuZCB0aGUgZ2xvYmFsIGlub2RlX2xvY2suCisgKi8KK3ZvaWQgZmFzdGNhbGwgbWFya19idWZmZXJfZGlydHkoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlpZiAoIWJ1ZmZlcl9kaXJ0eShiaCkgJiYgIXRlc3Rfc2V0X2J1ZmZlcl9kaXJ0eShiaCkpCisJCV9fc2V0X3BhZ2VfZGlydHlfbm9idWZmZXJzKGJoLT5iX3BhZ2UpOworfQorCisvKgorICogRGVjcmVtZW50IGEgYnVmZmVyX2hlYWQncyByZWZlcmVuY2UgY291bnQuICBJZiBhbGwgYnVmZmVycyBhZ2FpbnN0IGEgcGFnZQorICogaGF2ZSB6ZXJvIHJlZmVyZW5jZSBjb3VudCwgYXJlIGNsZWFuIGFuZCB1bmxvY2tlZCwgYW5kIGlmIHRoZSBwYWdlIGlzIGNsZWFuCisgKiBhbmQgdW5sb2NrZWQgdGhlbiB0cnlfdG9fZnJlZV9idWZmZXJzKCkgbWF5IHN0cmlwIHRoZSBidWZmZXJzIGZyb20gdGhlIHBhZ2UKKyAqIGluIHByZXBhcmF0aW9uIGZvciBmcmVlaW5nIGl0IChzb21ldGltZXMsIHJhcmVseSwgYnVmZmVycyBhcmUgcmVtb3ZlZCBmcm9tCisgKiBhIHBhZ2UgYnV0IGl0IGVuZHMgdXAgbm90IGJlaW5nIGZyZWVkLCBhbmQgYnVmZmVycyBtYXkgbGF0ZXIgYmUgcmVhdHRhY2hlZCkuCisgKi8KK3ZvaWQgX19icmVsc2Uoc3RydWN0IGJ1ZmZlcl9oZWFkICogYnVmKQoreworCWlmIChhdG9taWNfcmVhZCgmYnVmLT5iX2NvdW50KSkgeworCQlwdXRfYmgoYnVmKTsKKwkJcmV0dXJuOworCX0KKwlwcmludGsoS0VSTl9FUlIgIlZGUzogYnJlbHNlOiBUcnlpbmcgdG8gZnJlZSBmcmVlIGJ1ZmZlclxuIik7CisJV0FSTl9PTigxKTsKK30KKworLyoKKyAqIGJmb3JnZXQoKSBpcyBsaWtlIGJyZWxzZSgpLCBleGNlcHQgaXQgZGlzY2FyZHMgYW55CisgKiBwb3RlbnRpYWxseSBkaXJ0eSBkYXRhLgorICovCit2b2lkIF9fYmZvcmdldChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisJaWYgKCFsaXN0X2VtcHR5KCZiaC0+Yl9hc3NvY19idWZmZXJzKSkgeworCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqYnVmZmVyX21hcHBpbmcgPSBiaC0+Yl9wYWdlLT5tYXBwaW5nOworCisJCXNwaW5fbG9jaygmYnVmZmVyX21hcHBpbmctPnByaXZhdGVfbG9jayk7CisJCWxpc3RfZGVsX2luaXQoJmJoLT5iX2Fzc29jX2J1ZmZlcnMpOworCQlzcGluX3VubG9jaygmYnVmZmVyX21hcHBpbmctPnByaXZhdGVfbG9jayk7CisJfQorCV9fYnJlbHNlKGJoKTsKK30KKworc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqX19icmVhZF9zbG93KHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJbG9ja19idWZmZXIoYmgpOworCWlmIChidWZmZXJfdXB0b2RhdGUoYmgpKSB7CisJCXVubG9ja19idWZmZXIoYmgpOworCQlyZXR1cm4gYmg7CisJfSBlbHNlIHsKKwkJZ2V0X2JoKGJoKTsKKwkJYmgtPmJfZW5kX2lvID0gZW5kX2J1ZmZlcl9yZWFkX3N5bmM7CisJCXN1Ym1pdF9iaChSRUFELCBiaCk7CisJCXdhaXRfb25fYnVmZmVyKGJoKTsKKwkJaWYgKGJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCQlyZXR1cm4gYmg7CisJfQorCWJyZWxzZShiaCk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBQZXItY3B1IGJ1ZmZlciBMUlUgaW1wbGVtZW50YXRpb24uICBUbyByZWR1Y2UgdGhlIGNvc3Qgb2YgX19maW5kX2dldF9ibG9jaygpLgorICogVGhlIGJoc1tdIGFycmF5IGlzIHNvcnRlZCAtIG5ld2VzdCBidWZmZXIgaXMgYXQgYmhzWzBdLiAgQnVmZmVycyBoYXZlIHRoZWlyCisgKiByZWZjb3VudCBlbGV2YXRlZCBieSBvbmUgd2hlbiB0aGV5J3JlIGluIGFuIExSVS4gIEEgYnVmZmVyIGNhbiBvbmx5IGFwcGVhcgorICogb25jZSBpbiBhIHBhcnRpY3VsYXIgQ1BVJ3MgTFJVLiAgQSBzaW5nbGUgYnVmZmVyIGNhbiBiZSBwcmVzZW50IGluIG11bHRpcGxlCisgKiBDUFUncyBMUlVzIGF0IHRoZSBzYW1lIHRpbWUuCisgKgorICogVGhpcyBpcyBhIHRyYW5zcGFyZW50IGNhY2hpbmcgZnJvbnQtZW5kIHRvIHNiX2JyZWFkKCksIHNiX2dldGJsaygpIGFuZAorICogc2JfZmluZF9nZXRfYmxvY2soKS4KKyAqCisgKiBUaGUgTFJVcyB0aGVtc2VsdmVzIG9ubHkgbmVlZCBsb2NraW5nIGFnYWluc3QgaW52YWxpZGF0ZV9iaF9scnVzLiAgV2UgdXNlCisgKiBhIGxvY2FsIGludGVycnVwdCBkaXNhYmxlIGZvciB0aGF0LgorICovCisKKyNkZWZpbmUgQkhfTFJVX1NJWkUJOAorCitzdHJ1Y3QgYmhfbHJ1IHsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoc1tCSF9MUlVfU0laRV07Cit9OworCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGJoX2xydSwgYmhfbHJ1cykgPSB7eyBOVUxMIH19OworCisjaWZkZWYgQ09ORklHX1NNUAorI2RlZmluZSBiaF9scnVfbG9jaygpCWxvY2FsX2lycV9kaXNhYmxlKCkKKyNkZWZpbmUgYmhfbHJ1X3VubG9jaygpCWxvY2FsX2lycV9lbmFibGUoKQorI2Vsc2UKKyNkZWZpbmUgYmhfbHJ1X2xvY2soKQlwcmVlbXB0X2Rpc2FibGUoKQorI2RlZmluZSBiaF9scnVfdW5sb2NrKCkJcHJlZW1wdF9lbmFibGUoKQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGVja19pcnFzX29uKHZvaWQpCit7CisjaWZkZWYgaXJxc19kaXNhYmxlZAorCUJVR19PTihpcnFzX2Rpc2FibGVkKCkpOworI2VuZGlmCit9CisKKy8qCisgKiBUaGUgTFJVIG1hbmFnZW1lbnQgYWxnb3JpdGhtIGlzIGRvcGV5LWJ1dC1zaW1wbGUuICBTb3JyeS4KKyAqLworc3RhdGljIHZvaWQgYmhfbHJ1X2luc3RhbGwoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmV2aWN0ZWUgPSBOVUxMOworCXN0cnVjdCBiaF9scnUgKmxydTsKKworCWNoZWNrX2lycXNfb24oKTsKKwliaF9scnVfbG9jaygpOworCWxydSA9ICZfX2dldF9jcHVfdmFyKGJoX2xydXMpOworCWlmIChscnUtPmJoc1swXSAhPSBiaCkgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoc1tCSF9MUlVfU0laRV07CisJCWludCBpbjsKKwkJaW50IG91dCA9IDA7CisKKwkJZ2V0X2JoKGJoKTsKKwkJYmhzW291dCsrXSA9IGJoOworCQlmb3IgKGluID0gMDsgaW4gPCBCSF9MUlVfU0laRTsgaW4rKykgeworCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDIgPSBscnUtPmJoc1tpbl07CisKKwkJCWlmIChiaDIgPT0gYmgpIHsKKwkJCQlfX2JyZWxzZShiaDIpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAob3V0ID49IEJIX0xSVV9TSVpFKSB7CisJCQkJCUJVR19PTihldmljdGVlICE9IE5VTEwpOworCQkJCQlldmljdGVlID0gYmgyOworCQkJCX0gZWxzZSB7CisJCQkJCWJoc1tvdXQrK10gPSBiaDI7CisJCQkJfQorCQkJfQorCQl9CisJCXdoaWxlIChvdXQgPCBCSF9MUlVfU0laRSkKKwkJCWJoc1tvdXQrK10gPSBOVUxMOworCQltZW1jcHkobHJ1LT5iaHMsIGJocywgc2l6ZW9mKGJocykpOworCX0KKwliaF9scnVfdW5sb2NrKCk7CisKKwlpZiAoZXZpY3RlZSkKKwkJX19icmVsc2UoZXZpY3RlZSk7Cit9CisKKy8qCisgKiBMb29rIHVwIHRoZSBiaCBpbiB0aGlzIGNwdSdzIExSVS4gIElmIGl0J3MgdGhlcmUsIG1vdmUgaXQgdG8gdGhlIGhlYWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IGJ1ZmZlcl9oZWFkICoKK2xvb2t1cF9iaF9scnUoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc2VjdG9yX3QgYmxvY2ssIGludCBzaXplKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqcmV0ID0gTlVMTDsKKwlzdHJ1Y3QgYmhfbHJ1ICpscnU7CisJaW50IGk7CisKKwljaGVja19pcnFzX29uKCk7CisJYmhfbHJ1X2xvY2soKTsKKwlscnUgPSAmX19nZXRfY3B1X3ZhcihiaF9scnVzKTsKKwlmb3IgKGkgPSAwOyBpIDwgQkhfTFJVX1NJWkU7IGkrKykgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gbHJ1LT5iaHNbaV07CisKKwkJaWYgKGJoICYmIGJoLT5iX2JkZXYgPT0gYmRldiAmJgorCQkJCWJoLT5iX2Jsb2NrbnIgPT0gYmxvY2sgJiYgYmgtPmJfc2l6ZSA9PSBzaXplKSB7CisJCQlpZiAoaSkgeworCQkJCXdoaWxlIChpKSB7CisJCQkJCWxydS0+YmhzW2ldID0gbHJ1LT5iaHNbaSAtIDFdOworCQkJCQlpLS07CisJCQkJfQorCQkJCWxydS0+YmhzWzBdID0gYmg7CisJCQl9CisJCQlnZXRfYmgoYmgpOworCQkJcmV0ID0gYmg7CisJCQlicmVhazsKKwkJfQorCX0KKwliaF9scnVfdW5sb2NrKCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFBlcmZvcm0gYSBwYWdlY2FjaGUgbG9va3VwIGZvciB0aGUgbWF0Y2hpbmcgYnVmZmVyLiAgSWYgaXQncyB0aGVyZSwgcmVmcmVzaAorICogaXQgaW4gdGhlIExSVSBhbmQgbWFyayBpdCBhcyBhY2Nlc3NlZC4gIElmIGl0IGlzIG5vdCBwcmVzZW50IHRoZW4gcmV0dXJuCisgKiBOVUxMCisgKi8KK3N0cnVjdCBidWZmZXJfaGVhZCAqCitfX2ZpbmRfZ2V0X2Jsb2NrKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IGJsb2NrLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gbG9va3VwX2JoX2xydShiZGV2LCBibG9jaywgc2l6ZSk7CisKKwlpZiAoYmggPT0gTlVMTCkgeworCQliaCA9IF9fZmluZF9nZXRfYmxvY2tfc2xvdyhiZGV2LCBibG9jaywgc2l6ZSk7CisJCWlmIChiaCkKKwkJCWJoX2xydV9pbnN0YWxsKGJoKTsKKwl9CisJaWYgKGJoKQorCQl0b3VjaF9idWZmZXIoYmgpOworCXJldHVybiBiaDsKK30KK0VYUE9SVF9TWU1CT0woX19maW5kX2dldF9ibG9jayk7CisKKy8qCisgKiBfX2dldGJsayB3aWxsIGxvY2F0ZSAoYW5kLCBpZiBuZWNlc3NhcnksIGNyZWF0ZSkgdGhlIGJ1ZmZlcl9oZWFkCisgKiB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgcGFzc2VkIGJsb2NrX2RldmljZSwgYmxvY2sgYW5kIHNpemUuIFRoZQorICogcmV0dXJuZWQgYnVmZmVyIGhhcyBpdHMgcmVmZXJlbmNlIGNvdW50IGluY3JlbWVudGVkLgorICoKKyAqIF9fZ2V0YmxrKCkgY2Fubm90IGZhaWwgLSBpdCBqdXN0IGtlZXBzIHRyeWluZy4gIElmIHlvdSBwYXNzIGl0IGFuCisgKiBpbGxlZ2FsIGJsb2NrIG51bWJlciwgX19nZXRibGsoKSB3aWxsIGhhcHBpbHkgcmV0dXJuIGEgYnVmZmVyX2hlYWQKKyAqIHdoaWNoIHJlcHJlc2VudHMgdGhlIG5vbi1leGlzdGVudCBibG9jay4gIFZlcnkgd2VpcmQuCisgKgorICogX19nZXRibGsoKSB3aWxsIGxvY2sgdXAgdGhlIG1hY2hpbmUgaWYgZ3Jvd19kZXZfcGFnZSdzIHRyeV90b19mcmVlX2J1ZmZlcnMoKQorICogYXR0ZW1wdCBpcyBmYWlsaW5nLiAgRklYTUUsIHBlcmhhcHM/CisgKi8KK3N0cnVjdCBidWZmZXJfaGVhZCAqCitfX2dldGJsayhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBibG9jaywgaW50IHNpemUpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IF9fZmluZF9nZXRfYmxvY2soYmRldiwgYmxvY2ssIHNpemUpOworCisJbWlnaHRfc2xlZXAoKTsKKwlpZiAoYmggPT0gTlVMTCkKKwkJYmggPSBfX2dldGJsa19zbG93KGJkZXYsIGJsb2NrLCBzaXplKTsKKwlyZXR1cm4gYmg7Cit9CitFWFBPUlRfU1lNQk9MKF9fZ2V0YmxrKTsKKworLyoKKyAqIERvIGFzeW5jIHJlYWQtYWhlYWQgb24gYSBidWZmZXIuLgorICovCit2b2lkIF9fYnJlYWRhaGVhZChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBibG9jaywgaW50IHNpemUpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IF9fZ2V0YmxrKGJkZXYsIGJsb2NrLCBzaXplKTsKKwlsbF9yd19ibG9jayhSRUFEQSwgMSwgJmJoKTsKKwlicmVsc2UoYmgpOworfQorRVhQT1JUX1NZTUJPTChfX2JyZWFkYWhlYWQpOworCisvKioKKyAqICBfX2JyZWFkKCkgLSByZWFkcyBhIHNwZWNpZmllZCBibG9jayBhbmQgcmV0dXJucyB0aGUgYmgKKyAqICBAYmxvY2s6IG51bWJlciBvZiBibG9jaworICogIEBzaXplOiBzaXplIChpbiBieXRlcykgdG8gcmVhZAorICogCisgKiAgUmVhZHMgYSBzcGVjaWZpZWQgYmxvY2ssIGFuZCByZXR1cm5zIGJ1ZmZlciBoZWFkIHRoYXQgY29udGFpbnMgaXQuCisgKiAgSXQgcmV0dXJucyBOVUxMIGlmIHRoZSBibG9jayB3YXMgdW5yZWFkYWJsZS4KKyAqLworc3RydWN0IGJ1ZmZlcl9oZWFkICoKK19fYnJlYWQoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc2VjdG9yX3QgYmxvY2ssIGludCBzaXplKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBfX2dldGJsayhiZGV2LCBibG9jaywgc2l6ZSk7CisKKwlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCWJoID0gX19icmVhZF9zbG93KGJoKTsKKwlyZXR1cm4gYmg7Cit9CitFWFBPUlRfU1lNQk9MKF9fYnJlYWQpOworCisvKgorICogaW52YWxpZGF0ZV9iaF9scnVzKCkgaXMgY2FsbGVkIHJhcmVseSAtIGJ1dCBub3Qgb25seSBhdCB1bm1vdW50LgorICogVGhpcyBkb2Vzbid0IHJhY2UgYmVjYXVzZSBpdCBydW5zIGluIGVhY2ggY3B1IGVpdGhlciBpbiBpcnEKKyAqIG9yIHdpdGggcHJlZW1wdCBkaXNhYmxlZC4KKyAqLworc3RhdGljIHZvaWQgaW52YWxpZGF0ZV9iaF9scnUodm9pZCAqYXJnKQoreworCXN0cnVjdCBiaF9scnUgKmIgPSAmZ2V0X2NwdV92YXIoYmhfbHJ1cyk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQkhfTFJVX1NJWkU7IGkrKykgeworCQlicmVsc2UoYi0+YmhzW2ldKTsKKwkJYi0+YmhzW2ldID0gTlVMTDsKKwl9CisJcHV0X2NwdV92YXIoYmhfbHJ1cyk7Cit9CisJCitzdGF0aWMgdm9pZCBpbnZhbGlkYXRlX2JoX2xydXModm9pZCkKK3sKKwlvbl9lYWNoX2NwdShpbnZhbGlkYXRlX2JoX2xydSwgTlVMTCwgMSwgMSk7Cit9CisKK3ZvaWQgc2V0X2JoX3BhZ2Uoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCWJoLT5iX3BhZ2UgPSBwYWdlOworCWlmIChvZmZzZXQgPj0gUEFHRV9TSVpFKQorCQlCVUcoKTsKKwlpZiAoUGFnZUhpZ2hNZW0ocGFnZSkpCisJCS8qCisJCSAqIFRoaXMgY2F0Y2hlcyBpbGxlZ2FsIHVzZXMgYW5kIHByZXNlcnZlcyB0aGUgb2Zmc2V0OgorCQkgKi8KKwkJYmgtPmJfZGF0YSA9IChjaGFyICopKDAgKyBvZmZzZXQpOworCWVsc2UKKwkJYmgtPmJfZGF0YSA9IHBhZ2VfYWRkcmVzcyhwYWdlKSArIG9mZnNldDsKK30KK0VYUE9SVF9TWU1CT0woc2V0X2JoX3BhZ2UpOworCisvKgorICogQ2FsbGVkIHdoZW4gdHJ1bmNhdGluZyBhIGJ1ZmZlciBvbiBhIHBhZ2UgY29tcGxldGVseS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGRpc2NhcmRfYnVmZmVyKHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoKQoreworCWxvY2tfYnVmZmVyKGJoKTsKKwljbGVhcl9idWZmZXJfZGlydHkoYmgpOworCWJoLT5iX2JkZXYgPSBOVUxMOworCWNsZWFyX2J1ZmZlcl9tYXBwZWQoYmgpOworCWNsZWFyX2J1ZmZlcl9yZXEoYmgpOworCWNsZWFyX2J1ZmZlcl9uZXcoYmgpOworCWNsZWFyX2J1ZmZlcl9kZWxheShiaCk7CisJdW5sb2NrX2J1ZmZlcihiaCk7Cit9CisKKy8qKgorICogdHJ5X3RvX3JlbGVhc2VfcGFnZSgpIC0gcmVsZWFzZSBvbGQgZnMtc3BlY2lmaWMgbWV0YWRhdGEgb24gYSBwYWdlCisgKgorICogQHBhZ2U6IHRoZSBwYWdlIHdoaWNoIHRoZSBrZXJuZWwgaXMgdHJ5aW5nIHRvIGZyZWUKKyAqIEBnZnBfbWFzazogbWVtb3J5IGFsbG9jYXRpb24gZmxhZ3MgKGFuZCBJL08gbW9kZSkKKyAqCisgKiBUaGUgYWRkcmVzc19zcGFjZSBpcyB0byB0cnkgdG8gcmVsZWFzZSBhbnkgZGF0YSBhZ2FpbnN0IHRoZSBwYWdlCisgKiAocHJlc3VtYWJseSBhdCBwYWdlLT5wcml2YXRlKS4gIElmIHRoZSByZWxlYXNlIHdhcyBzdWNjZXNzZnVsLCByZXR1cm4gYDEnLgorICogT3RoZXJ3aXNlIHJldHVybiB6ZXJvLgorICoKKyAqIFRoZSBAZ2ZwX21hc2sgYXJndW1lbnQgc3BlY2lmaWVzIHdoZXRoZXIgSS9PIG1heSBiZSBwZXJmb3JtZWQgdG8gcmVsZWFzZQorICogdGhpcyBwYWdlIChfX0dGUF9JTyksIGFuZCB3aGV0aGVyIHRoZSBjYWxsIG1heSBibG9jayAoX19HRlBfV0FJVCkuCisgKgorICogTk9URTogQGdmcF9tYXNrIG1heSBnbyBhd2F5LCBhbmQgdGhpcyBmdW5jdGlvbiBtYXkgYmVjb21lIG5vbi1ibG9ja2luZy4KKyAqLworaW50IHRyeV90b19yZWxlYXNlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBnZnBfbWFzaykKK3sKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqIGNvbnN0IG1hcHBpbmcgPSBwYWdlLT5tYXBwaW5nOworCisJQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKKwlpZiAoUGFnZVdyaXRlYmFjayhwYWdlKSkKKwkJcmV0dXJuIDA7CisJCisJaWYgKG1hcHBpbmcgJiYgbWFwcGluZy0+YV9vcHMtPnJlbGVhc2VwYWdlKQorCQlyZXR1cm4gbWFwcGluZy0+YV9vcHMtPnJlbGVhc2VwYWdlKHBhZ2UsIGdmcF9tYXNrKTsKKwlyZXR1cm4gdHJ5X3RvX2ZyZWVfYnVmZmVycyhwYWdlKTsKK30KK0VYUE9SVF9TWU1CT0wodHJ5X3RvX3JlbGVhc2VfcGFnZSk7CisKKy8qKgorICogYmxvY2tfaW52YWxpZGF0ZXBhZ2UgLSBpbnZhbGlkYXRlIHBhcnQgb2YgYWxsIG9mIGEgYnVmZmVyLWJhY2tlZCBwYWdlCisgKgorICogQHBhZ2U6IHRoZSBwYWdlIHdoaWNoIGlzIGFmZmVjdGVkCisgKiBAb2Zmc2V0OiB0aGUgaW5kZXggb2YgdGhlIHRydW5jYXRpb24gcG9pbnQKKyAqCisgKiBibG9ja19pbnZhbGlkYXRlcGFnZSgpIGlzIGNhbGxlZCB3aGVuIGFsbCBvciBwYXJ0IG9mIHRoZSBwYWdlIGhhcyBiZWNvbWUKKyAqIGludmFsaWRhdGVkYnkgYSB0cnVuY2F0ZSBvcGVyYXRpb24uCisgKgorICogYmxvY2tfaW52YWxpZGF0ZXBhZ2UoKSBkb2VzIG5vdCBoYXZlIHRvIHJlbGVhc2UgYWxsIGJ1ZmZlcnMsIGJ1dCBpdCBtdXN0CisgKiBlbnN1cmUgdGhhdCBubyBkaXJ0eSBidWZmZXIgaXMgbGVmdCBvdXRzaWRlIEBvZmZzZXQgYW5kIHRoYXQgbm8gSS9PCisgKiBpcyB1bmRlcndheSBhZ2FpbnN0IGFueSBvZiB0aGUgYmxvY2tzIHdoaWNoIGFyZSBvdXRzaWRlIHRoZSB0cnVuY2F0aW9uCisgKiBwb2ludC4gIEJlY2F1c2UgdGhlIGNhbGxlciBpcyBhYm91dCB0byBmcmVlIChhbmQgcG9zc2libHkgcmV1c2UpIHRob3NlCisgKiBibG9ja3Mgb24tZGlzay4KKyAqLworaW50IGJsb2NrX2ludmFsaWRhdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQsICpiaCwgKm5leHQ7CisJdW5zaWduZWQgaW50IGN1cnJfb2ZmID0gMDsKKwlpbnQgcmV0ID0gMTsKKworCUJVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CisJaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKQorCQlnb3RvIG91dDsKKworCWhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJYmggPSBoZWFkOworCWRvIHsKKwkJdW5zaWduZWQgaW50IG5leHRfb2ZmID0gY3Vycl9vZmYgKyBiaC0+Yl9zaXplOworCQluZXh0ID0gYmgtPmJfdGhpc19wYWdlOworCisJCS8qCisJCSAqIGlzIHRoaXMgYmxvY2sgZnVsbHkgaW52YWxpZGF0ZWQ/CisJCSAqLworCQlpZiAob2Zmc2V0IDw9IGN1cnJfb2ZmKQorCQkJZGlzY2FyZF9idWZmZXIoYmgpOworCQljdXJyX29mZiA9IG5leHRfb2ZmOworCQliaCA9IG5leHQ7CisJfSB3aGlsZSAoYmggIT0gaGVhZCk7CisKKwkvKgorCSAqIFdlIHJlbGVhc2UgYnVmZmVycyBvbmx5IGlmIHRoZSBlbnRpcmUgcGFnZSBpcyBiZWluZyBpbnZhbGlkYXRlZC4KKwkgKiBUaGUgZ2V0X2Jsb2NrIGNhY2hlZCB2YWx1ZSBoYXMgYmVlbiB1bmNvbmRpdGlvbmFsbHkgaW52YWxpZGF0ZWQsCisJICogc28gcmVhbCBJTyBpcyBub3QgcG9zc2libGUgYW55bW9yZS4KKwkgKi8KKwlpZiAob2Zmc2V0ID09IDApCisJCXJldCA9IHRyeV90b19yZWxlYXNlX3BhZ2UocGFnZSwgMCk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woYmxvY2tfaW52YWxpZGF0ZXBhZ2UpOworCisvKgorICogV2UgYXR0YWNoIGFuZCBwb3NzaWJseSBkaXJ0eSB0aGUgYnVmZmVycyBhdG9taWNhbGx5IHdydAorICogX19zZXRfcGFnZV9kaXJ0eV9idWZmZXJzKCkgdmlhIHByaXZhdGVfbG9jay4gIHRyeV90b19mcmVlX2J1ZmZlcnMKKyAqIGlzIGFscmVhZHkgZXhjbHVkZWQgdmlhIHRoZSBwYWdlIGxvY2suCisgKi8KK3ZvaWQgY3JlYXRlX2VtcHR5X2J1ZmZlcnMoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQl1bnNpZ25lZCBsb25nIGJsb2Nrc2l6ZSwgdW5zaWduZWQgbG9uZyBiX3N0YXRlKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICpoZWFkLCAqdGFpbDsKKworCWhlYWQgPSBhbGxvY19wYWdlX2J1ZmZlcnMocGFnZSwgYmxvY2tzaXplLCAxKTsKKwliaCA9IGhlYWQ7CisJZG8geworCQliaC0+Yl9zdGF0ZSB8PSBiX3N0YXRlOworCQl0YWlsID0gYmg7CisJCWJoID0gYmgtPmJfdGhpc19wYWdlOworCX0gd2hpbGUgKGJoKTsKKwl0YWlsLT5iX3RoaXNfcGFnZSA9IGhlYWQ7CisKKwlzcGluX2xvY2soJnBhZ2UtPm1hcHBpbmctPnByaXZhdGVfbG9jayk7CisJaWYgKFBhZ2VVcHRvZGF0ZShwYWdlKSB8fCBQYWdlRGlydHkocGFnZSkpIHsKKwkJYmggPSBoZWFkOworCQlkbyB7CisJCQlpZiAoUGFnZURpcnR5KHBhZ2UpKQorCQkJCXNldF9idWZmZXJfZGlydHkoYmgpOworCQkJaWYgKFBhZ2VVcHRvZGF0ZShwYWdlKSkKKwkJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJCWJoID0gYmgtPmJfdGhpc19wYWdlOworCQl9IHdoaWxlIChiaCAhPSBoZWFkKTsKKwl9CisJYXR0YWNoX3BhZ2VfYnVmZmVycyhwYWdlLCBoZWFkKTsKKwlzcGluX3VubG9jaygmcGFnZS0+bWFwcGluZy0+cHJpdmF0ZV9sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0woY3JlYXRlX2VtcHR5X2J1ZmZlcnMpOworCisvKgorICogV2UgYXJlIHRha2luZyBhIGJsb2NrIGZvciBkYXRhIGFuZCB3ZSBkb24ndCB3YW50IGFueSBvdXRwdXQgZnJvbSBhbnkKKyAqIGJ1ZmZlci1jYWNoZSBhbGlhc2VzIHN0YXJ0aW5nIGZyb20gcmV0dXJuIGZyb20gdGhhdCBmdW5jdGlvbiBhbmQKKyAqIHVudGlsIHRoZSBtb21lbnQgd2hlbiBzb21ldGhpbmcgd2lsbCBleHBsaWNpdGx5IG1hcmsgdGhlIGJ1ZmZlcgorICogZGlydHkgKGhvcGVmdWxseSB0aGF0IHdpbGwgbm90IGhhcHBlbiB1bnRpbCB3ZSB3aWxsIGZyZWUgdGhhdCBibG9jayA7LSkKKyAqIFdlIGRvbid0IGV2ZW4gbmVlZCB0byBtYXJrIGl0IG5vdC11cHRvZGF0ZSAtIG5vYm9keSBjYW4gZXhwZWN0CisgKiBhbnl0aGluZyBmcm9tIGEgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciBhbnl3YXkuIFdlIHVzZWQgdG8gdXNlZAorICogdW5tYXBfYnVmZmVyKCkgZm9yIHN1Y2ggaW52YWxpZGF0aW9uLCBidXQgdGhhdCB3YXMgd3JvbmcuIFdlIGRlZmluaXRlbHkKKyAqIGRvbid0IHdhbnQgdG8gbWFyayB0aGUgYWxpYXMgdW5tYXBwZWQsIGZvciBleGFtcGxlIC0gaXQgd291bGQgY29uZnVzZQorICogYW55b25lIHdobyBtaWdodCBwaWNrIGl0IHdpdGggYnJlYWQoKSBhZnRlcndhcmRzLi4uCisgKgorICogQWxzby4uICBOb3RlIHRoYXQgYmZvcmdldCgpIGRvZXNuJ3QgbG9jayB0aGUgYnVmZmVyLiAgU28gdGhlcmUgY2FuCisgKiBiZSB3cml0ZW91dCBJL08gZ29pbmcgb24gYWdhaW5zdCByZWNlbnRseS1mcmVlZCBidWZmZXJzLiAgV2UgZG9uJ3QKKyAqIHdhaXQgb24gdGhhdCBJL08gaW4gYmZvcmdldCgpIC0gaXQncyBtb3JlIGVmZmljaWVudCB0byB3YWl0IG9uIHRoZSBJL08KKyAqIG9ubHkgaWYgd2UgcmVhbGx5IG5lZWQgdG8uICBUaGF0IGhhcHBlbnMgaGVyZS4KKyAqLwordm9pZCB1bm1hcF91bmRlcmx5aW5nX21ldGFkYXRhKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IGJsb2NrKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqb2xkX2JoOworCisJbWlnaHRfc2xlZXAoKTsKKworCW9sZF9iaCA9IF9fZmluZF9nZXRfYmxvY2tfc2xvdyhiZGV2LCBibG9jaywgMCk7CisJaWYgKG9sZF9iaCkgeworCQljbGVhcl9idWZmZXJfZGlydHkob2xkX2JoKTsKKwkJd2FpdF9vbl9idWZmZXIob2xkX2JoKTsKKwkJY2xlYXJfYnVmZmVyX3JlcShvbGRfYmgpOworCQlfX2JyZWxzZShvbGRfYmgpOworCX0KK30KK0VYUE9SVF9TWU1CT0wodW5tYXBfdW5kZXJseWluZ19tZXRhZGF0YSk7CisKKy8qCisgKiBOT1RFISBBbGwgbWFwcGVkL3VwdG9kYXRlIGNvbWJpbmF0aW9ucyBhcmUgdmFsaWQ6CisgKgorICoJTWFwcGVkCVVwdG9kYXRlCU1lYW5pbmcKKyAqCisgKglObwlObwkJInVua25vd24iIC0gbXVzdCBkbyBnZXRfYmxvY2soKQorICoJTm8JWWVzCQkiaG9sZSIgLSB6ZXJvLWZpbGxlZAorICoJWWVzCU5vCQkiYWxsb2NhdGVkIiAtIGFsbG9jYXRlZCBvbiBkaXNrLCBub3QgcmVhZCBpbgorICoJWWVzCVllcwkJInZhbGlkIiAtIGFsbG9jYXRlZCBhbmQgdXAtdG8tZGF0ZSBpbiBtZW1vcnkuCisgKgorICogIkRpcnR5IiBpcyB2YWxpZCBvbmx5IHdpdGggdGhlIGxhc3QgY2FzZSAobWFwcGVkK3VwdG9kYXRlKS4KKyAqLworCisvKgorICogV2hpbGUgYmxvY2tfd3JpdGVfZnVsbF9wYWdlIGlzIHdyaXRpbmcgYmFjayB0aGUgZGlydHkgYnVmZmVycyB1bmRlcgorICogdGhlIHBhZ2UgbG9jaywgd2hvZXZlciBkaXJ0aWVkIHRoZSBidWZmZXJzIG1heSBkZWNpZGUgdG8gY2xlYW4gdGhlbQorICogYWdhaW4gYXQgYW55IHRpbWUuICBXZSBoYW5kbGUgdGhhdCBieSBvbmx5IGxvb2tpbmcgYXQgdGhlIGJ1ZmZlcgorICogc3RhdGUgaW5zaWRlIGxvY2tfYnVmZmVyKCkuCisgKgorICogSWYgYmxvY2tfd3JpdGVfZnVsbF9wYWdlKCkgaXMgY2FsbGVkIGZvciByZWd1bGFyIHdyaXRlYmFjaworICogKHdiYy0+c3luY19tb2RlID09IFdCX1NZTkNfTk9ORSkgdGhlbiBpdCB3aWxsIHJlZGlydHkgYSBwYWdlIHdoaWNoIGhhcyBhCisgKiBsb2NrZWQgYnVmZmVyLiAgIFRoaXMgb25seSBjYW4gaGFwcGVuIGlmIHNvbWVvbmUgaGFzIHdyaXR0ZW4gdGhlIGJ1ZmZlcgorICogZGlyZWN0bHksIHdpdGggc3VibWl0X2JoKCkuICBBdCB0aGUgYWRkcmVzc19zcGFjZSBsZXZlbCBQYWdlV3JpdGViYWNrCisgKiBwcmV2ZW50cyB0aGlzIGNvbnRlbnRpb24gZnJvbSBvY2N1cnJpbmcuCisgKi8KK3N0YXRpYyBpbnQgX19ibG9ja193cml0ZV9mdWxsX3BhZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQlnZXRfYmxvY2tfdCAqZ2V0X2Jsb2NrLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlpbnQgZXJyOworCXNlY3Rvcl90IGJsb2NrOworCXNlY3Rvcl90IGxhc3RfYmxvY2s7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKmhlYWQ7CisJaW50IG5yX3VuZGVyd2F5ID0gMDsKKworCUJVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CisKKwlsYXN0X2Jsb2NrID0gKGlfc2l6ZV9yZWFkKGlub2RlKSAtIDEpID4+IGlub2RlLT5pX2Jsa2JpdHM7CisKKwlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpIHsKKwkJY3JlYXRlX2VtcHR5X2J1ZmZlcnMocGFnZSwgMSA8PCBpbm9kZS0+aV9ibGtiaXRzLAorCQkJCQkoMSA8PCBCSF9EaXJ0eSl8KDEgPDwgQkhfVXB0b2RhdGUpKTsKKwl9CisKKwkvKgorCSAqIEJlIHZlcnkgY2FyZWZ1bC4gIFdlIGhhdmUgbm8gZXhjbHVzaW9uIGZyb20gX19zZXRfcGFnZV9kaXJ0eV9idWZmZXJzCisJICogaGVyZSwgYW5kIHRoZSAocG90ZW50aWFsbHkgdW5tYXBwZWQpIGJ1ZmZlcnMgbWF5IGJlY29tZSBkaXJ0eSBhdAorCSAqIGFueSB0aW1lLiAgSWYgYSBidWZmZXIgYmVjb21lcyBkaXJ0eSBoZXJlIGFmdGVyIHdlJ3ZlIGluc3BlY3RlZCBpdAorCSAqIHRoZW4gd2UganVzdCBtaXNzIHRoYXQgZmFjdCwgYW5kIHRoZSBwYWdlIHN0YXlzIGRpcnR5LgorCSAqCisJICogQnVmZmVycyBvdXRzaWRlIGlfc2l6ZSBtYXkgYmUgZGlydGllZCBieSBfX3NldF9wYWdlX2RpcnR5X2J1ZmZlcnM7CisJICogaGFuZGxlIHRoYXQgaGVyZSBieSBqdXN0IGNsZWFuaW5nIHRoZW0uCisJICovCisKKwlibG9jayA9IHBhZ2UtPmluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gaW5vZGUtPmlfYmxrYml0cyk7CisJaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwliaCA9IGhlYWQ7CisKKwkvKgorCSAqIEdldCBhbGwgdGhlIGRpcnR5IGJ1ZmZlcnMgbWFwcGVkIHRvIGRpc2sgYWRkcmVzc2VzIGFuZAorCSAqIGhhbmRsZSBhbnkgYWxpYXNlcyBmcm9tIHRoZSB1bmRlcmx5aW5nIGJsb2NrZGV2J3MgbWFwcGluZy4KKwkgKi8KKwlkbyB7CisJCWlmIChibG9jayA+IGxhc3RfYmxvY2spIHsKKwkJCS8qCisJCQkgKiBtYXBwZWQgYnVmZmVycyBvdXRzaWRlIGlfc2l6ZSB3aWxsIG9jY3VyLCBiZWNhdXNlCisJCQkgKiB0aGlzIHBhZ2UgY2FuIGJlIG91dHNpZGUgaV9zaXplIHdoZW4gdGhlcmUgaXMgYQorCQkJICogdHJ1bmNhdGUgaW4gcHJvZ3Jlc3MuCisJCQkgKi8KKwkJCS8qCisJCQkgKiBUaGUgYnVmZmVyIHdhcyB6ZXJvZWQgYnkgYmxvY2tfd3JpdGVfZnVsbF9wYWdlKCkKKwkJCSAqLworCQkJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKKwkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQl9IGVsc2UgaWYgKCFidWZmZXJfbWFwcGVkKGJoKSAmJiBidWZmZXJfZGlydHkoYmgpKSB7CisJCQllcnIgPSBnZXRfYmxvY2soaW5vZGUsIGJsb2NrLCBiaCwgMSk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gcmVjb3ZlcjsKKwkJCWlmIChidWZmZXJfbmV3KGJoKSkgeworCQkJCS8qIGJsb2NrZGV2IG1hcHBpbmdzIG5ldmVyIGNvbWUgaGVyZSAqLworCQkJCWNsZWFyX2J1ZmZlcl9uZXcoYmgpOworCQkJCXVubWFwX3VuZGVybHlpbmdfbWV0YWRhdGEoYmgtPmJfYmRldiwKKwkJCQkJCQliaC0+Yl9ibG9ja25yKTsKKwkJCX0KKwkJfQorCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKKwkJYmxvY2srKzsKKwl9IHdoaWxlIChiaCAhPSBoZWFkKTsKKworCWRvIHsKKwkJZ2V0X2JoKGJoKTsKKwkJaWYgKCFidWZmZXJfbWFwcGVkKGJoKSkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBJZiBpdCdzIGEgZnVsbHkgbm9uLWJsb2NraW5nIHdyaXRlIGF0dGVtcHQgYW5kIHdlIGNhbm5vdAorCQkgKiBsb2NrIHRoZSBidWZmZXIgdGhlbiByZWRpcnR5IHRoZSBwYWdlLiAgTm90ZSB0aGF0IHRoaXMgY2FuCisJCSAqIHBvdGVudGlhbGx5IGNhdXNlIGEgYnVzeS13YWl0IGxvb3AgZnJvbSBwZGZsdXNoIGFuZCBrc3dhcGQKKwkJICogYWN0aXZpdHksIGJ1dCB0aG9zZSBjb2RlIHBhdGhzIGhhdmUgdGhlaXIgb3duIGhpZ2hlci1sZXZlbAorCQkgKiB0aHJvdHRsaW5nLgorCQkgKi8KKwkJaWYgKHdiYy0+c3luY19tb2RlICE9IFdCX1NZTkNfTk9ORSB8fCAhd2JjLT5ub25ibG9ja2luZykgeworCQkJbG9ja19idWZmZXIoYmgpOworCQl9IGVsc2UgaWYgKHRlc3Rfc2V0X2J1ZmZlcl9sb2NrZWQoYmgpKSB7CisJCQlyZWRpcnR5X3BhZ2VfZm9yX3dyaXRlcGFnZSh3YmMsIHBhZ2UpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHRlc3RfY2xlYXJfYnVmZmVyX2RpcnR5KGJoKSkgeworCQkJbWFya19idWZmZXJfYXN5bmNfd3JpdGUoYmgpOworCQl9IGVsc2UgeworCQkJdW5sb2NrX2J1ZmZlcihiaCk7CisJCX0KKwl9IHdoaWxlICgoYmggPSBiaC0+Yl90aGlzX3BhZ2UpICE9IGhlYWQpOworCisJLyoKKwkgKiBUaGUgcGFnZSBhbmQgaXRzIGJ1ZmZlcnMgYXJlIHByb3RlY3RlZCBieSBQYWdlV3JpdGViYWNrKCksIHNvIHdlIGNhbgorCSAqIGRyb3AgdGhlIGJoIHJlZmNvdW50cyBlYXJseS4KKwkgKi8KKwlCVUdfT04oUGFnZVdyaXRlYmFjayhwYWdlKSk7CisJc2V0X3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCisJZG8geworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5leHQgPSBiaC0+Yl90aGlzX3BhZ2U7CisJCWlmIChidWZmZXJfYXN5bmNfd3JpdGUoYmgpKSB7CisJCQlzdWJtaXRfYmgoV1JJVEUsIGJoKTsKKwkJCW5yX3VuZGVyd2F5Kys7CisJCX0KKwkJcHV0X2JoKGJoKTsKKwkJYmggPSBuZXh0OworCX0gd2hpbGUgKGJoICE9IGhlYWQpOworCisJZXJyID0gMDsKK2RvbmU6CisJaWYgKG5yX3VuZGVyd2F5ID09IDApIHsKKwkJLyoKKwkJICogVGhlIHBhZ2Ugd2FzIG1hcmtlZCBkaXJ0eSwgYnV0IHRoZSBidWZmZXJzIHdlcmUKKwkJICogY2xlYW4uICBTb21lb25lIHdyb3RlIHRoZW0gYmFjayBieSBoYW5kIHdpdGgKKwkJICogbGxfcndfYmxvY2svc3VibWl0X2JoLiAgQSByYXJlIGNhc2UuCisJCSAqLworCQlpbnQgdXB0b2RhdGUgPSAxOworCQlkbyB7CisJCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKKwkJCQl1cHRvZGF0ZSA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKKwkJfSB3aGlsZSAoYmggIT0gaGVhZCk7CisJCWlmICh1cHRvZGF0ZSkKKwkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJZW5kX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCQkvKgorCQkgKiBUaGUgcGFnZSBhbmQgYnVmZmVyX2hlYWRzIGNhbiBiZSByZWxlYXNlZCBhdCBhbnkgdGltZSBmcm9tCisJCSAqIGhlcmUgb24uCisJCSAqLworCQl3YmMtPnBhZ2VzX3NraXBwZWQrKzsJLyogV2UgZGlkbid0IHdyaXRlIHRoaXMgcGFnZSAqLworCX0KKwlyZXR1cm4gZXJyOworCityZWNvdmVyOgorCS8qCisJICogRU5PU1BDLCBvciBzb21lIG90aGVyIGVycm9yLiAgV2UgbWF5IGFscmVhZHkgaGF2ZSBhZGRlZCBzb21lCisJICogYmxvY2tzIHRvIHRoZSBmaWxlLCBzbyB3ZSBuZWVkIHRvIHdyaXRlIHRoZXNlIG91dCB0byBhdm9pZAorCSAqIGV4cG9zaW5nIHN0YWxlIGRhdGEuCisJICogVGhlIHBhZ2UgaXMgY3VycmVudGx5IGxvY2tlZCBhbmQgbm90IG1hcmtlZCBmb3Igd3JpdGViYWNrCisJICovCisJYmggPSBoZWFkOworCS8qIFJlY292ZXJ5OiBsb2NrIGFuZCBzdWJtaXQgdGhlIG1hcHBlZCBidWZmZXJzICovCisJZG8geworCQlnZXRfYmgoYmgpOworCQlpZiAoYnVmZmVyX21hcHBlZChiaCkgJiYgYnVmZmVyX2RpcnR5KGJoKSkgeworCQkJbG9ja19idWZmZXIoYmgpOworCQkJbWFya19idWZmZXJfYXN5bmNfd3JpdGUoYmgpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFRoZSBidWZmZXIgbWF5IGhhdmUgYmVlbiBzZXQgZGlydHkgZHVyaW5nCisJCQkgKiBhdHRhY2htZW50IHRvIGEgZGlydHkgcGFnZS4KKwkJCSAqLworCQkJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKKwkJfQorCX0gd2hpbGUgKChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CisJU2V0UGFnZUVycm9yKHBhZ2UpOworCUJVR19PTihQYWdlV3JpdGViYWNrKHBhZ2UpKTsKKwlzZXRfcGFnZV93cml0ZWJhY2socGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJZG8geworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5leHQgPSBiaC0+Yl90aGlzX3BhZ2U7CisJCWlmIChidWZmZXJfYXN5bmNfd3JpdGUoYmgpKSB7CisJCQljbGVhcl9idWZmZXJfZGlydHkoYmgpOworCQkJc3VibWl0X2JoKFdSSVRFLCBiaCk7CisJCQlucl91bmRlcndheSsrOworCQl9CisJCXB1dF9iaChiaCk7CisJCWJoID0gbmV4dDsKKwl9IHdoaWxlIChiaCAhPSBoZWFkKTsKKwlnb3RvIGRvbmU7Cit9CisKK3N0YXRpYyBpbnQgX19ibG9ja19wcmVwYXJlX3dyaXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlICpwYWdlLAorCQl1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bywgZ2V0X2Jsb2NrX3QgKmdldF9ibG9jaykKK3sKKwl1bnNpZ25lZCBibG9ja19zdGFydCwgYmxvY2tfZW5kOworCXNlY3Rvcl90IGJsb2NrOworCWludCBlcnIgPSAwOworCXVuc2lnbmVkIGJsb2Nrc2l6ZSwgYmJpdHM7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKmhlYWQsICp3YWl0WzJdLCAqKndhaXRfYmg9d2FpdDsKKworCUJVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CisJQlVHX09OKGZyb20gPiBQQUdFX0NBQ0hFX1NJWkUpOworCUJVR19PTih0byA+IFBBR0VfQ0FDSEVfU0laRSk7CisJQlVHX09OKGZyb20gPiB0byk7CisKKwlibG9ja3NpemUgPSAxIDw8IGlub2RlLT5pX2Jsa2JpdHM7CisJaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKQorCQljcmVhdGVfZW1wdHlfYnVmZmVycyhwYWdlLCBibG9ja3NpemUsIDApOworCWhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisKKwliYml0cyA9IGlub2RlLT5pX2Jsa2JpdHM7CisJYmxvY2sgPSAoc2VjdG9yX3QpcGFnZS0+aW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBiYml0cyk7CisKKwlmb3IoYmggPSBoZWFkLCBibG9ja19zdGFydCA9IDA7IGJoICE9IGhlYWQgfHwgIWJsb2NrX3N0YXJ0OworCSAgICBibG9jaysrLCBibG9ja19zdGFydD1ibG9ja19lbmQsIGJoID0gYmgtPmJfdGhpc19wYWdlKSB7CisJCWJsb2NrX2VuZCA9IGJsb2NrX3N0YXJ0ICsgYmxvY2tzaXplOworCQlpZiAoYmxvY2tfZW5kIDw9IGZyb20gfHwgYmxvY2tfc3RhcnQgPj0gdG8pIHsKKwkJCWlmIChQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCQkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKGJ1ZmZlcl9uZXcoYmgpKQorCQkJY2xlYXJfYnVmZmVyX25ldyhiaCk7CisJCWlmICghYnVmZmVyX21hcHBlZChiaCkpIHsKKwkJCWVyciA9IGdldF9ibG9jayhpbm9kZSwgYmxvY2ssIGJoLCAxKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBvdXQ7CisJCQlpZiAoYnVmZmVyX25ldyhiaCkpIHsKKwkJCQljbGVhcl9idWZmZXJfbmV3KGJoKTsKKwkJCQl1bm1hcF91bmRlcmx5aW5nX21ldGFkYXRhKGJoLT5iX2JkZXYsCisJCQkJCQkJYmgtPmJfYmxvY2tucik7CisJCQkJaWYgKFBhZ2VVcHRvZGF0ZShwYWdlKSkgeworCQkJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWlmIChibG9ja19lbmQgPiB0byB8fCBibG9ja19zdGFydCA8IGZyb20pIHsKKwkJCQkJdm9pZCAqa2FkZHI7CisKKwkJCQkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCQkJCWlmIChibG9ja19lbmQgPiB0bykKKwkJCQkJCW1lbXNldChrYWRkcit0bywgMCwKKwkJCQkJCQlibG9ja19lbmQtdG8pOworCQkJCQlpZiAoYmxvY2tfc3RhcnQgPCBmcm9tKQorCQkJCQkJbWVtc2V0KGthZGRyK2Jsb2NrX3N0YXJ0LAorCQkJCQkJCTAsIGZyb20tYmxvY2tfc3RhcnQpOworCQkJCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJCQkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQlpZiAoUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCQljb250aW51ZTsgCisJCX0KKwkJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpICYmICFidWZmZXJfZGVsYXkoYmgpICYmCisJCSAgICAgKGJsb2NrX3N0YXJ0IDwgZnJvbSB8fCBibG9ja19lbmQgPiB0bykpIHsKKwkJCWxsX3J3X2Jsb2NrKFJFQUQsIDEsICZiaCk7CisJCQkqd2FpdF9iaCsrPWJoOworCQl9CisJfQorCS8qCisJICogSWYgd2UgaXNzdWVkIHJlYWQgcmVxdWVzdHMgLSBsZXQgdGhlbSBjb21wbGV0ZS4KKwkgKi8KKwl3aGlsZSh3YWl0X2JoID4gd2FpdCkgeworCQl3YWl0X29uX2J1ZmZlcigqLS13YWl0X2JoKTsKKwkJaWYgKCFidWZmZXJfdXB0b2RhdGUoKndhaXRfYmgpKQorCQkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworb3V0OgorCS8qCisJICogWmVybyBvdXQgYW55IG5ld2x5IGFsbG9jYXRlZCBibG9ja3MgdG8gYXZvaWQgZXhwb3Npbmcgc3RhbGUKKwkgKiBkYXRhLiAgSWYgQkhfTmV3IGlzIHNldCwgd2Uga25vdyB0aGF0IHRoZSBibG9jayB3YXMgbmV3bHkKKwkgKiBhbGxvY2F0ZWQgaW4gdGhlIGFib3ZlIGxvb3AuCisJICovCisJYmggPSBoZWFkOworCWJsb2NrX3N0YXJ0ID0gMDsKKwlkbyB7CisJCWJsb2NrX2VuZCA9IGJsb2NrX3N0YXJ0K2Jsb2Nrc2l6ZTsKKwkJaWYgKGJsb2NrX2VuZCA8PSBmcm9tKQorCQkJZ290byBuZXh0X2JoOworCQlpZiAoYmxvY2tfc3RhcnQgPj0gdG8pCisJCQlicmVhazsKKwkJaWYgKGJ1ZmZlcl9uZXcoYmgpKSB7CisJCQl2b2lkICprYWRkcjsKKworCQkJY2xlYXJfYnVmZmVyX25ldyhiaCk7CisJCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkJCW1lbXNldChrYWRkcitibG9ja19zdGFydCwgMCwgYmgtPmJfc2l6ZSk7CisJCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwkJfQorbmV4dF9iaDoKKwkJYmxvY2tfc3RhcnQgPSBibG9ja19lbmQ7CisJCWJoID0gYmgtPmJfdGhpc19wYWdlOworCX0gd2hpbGUgKGJoICE9IGhlYWQpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19ibG9ja19jb21taXRfd3JpdGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCXVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCXVuc2lnbmVkIGJsb2NrX3N0YXJ0LCBibG9ja19lbmQ7CisJaW50IHBhcnRpYWwgPSAwOworCXVuc2lnbmVkIGJsb2Nrc2l6ZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqaGVhZDsKKworCWJsb2Nrc2l6ZSA9IDEgPDwgaW5vZGUtPmlfYmxrYml0czsKKworCWZvcihiaCA9IGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSksIGJsb2NrX3N0YXJ0ID0gMDsKKwkgICAgYmggIT0gaGVhZCB8fCAhYmxvY2tfc3RhcnQ7CisJICAgIGJsb2NrX3N0YXJ0PWJsb2NrX2VuZCwgYmggPSBiaC0+Yl90aGlzX3BhZ2UpIHsKKwkJYmxvY2tfZW5kID0gYmxvY2tfc3RhcnQgKyBibG9ja3NpemU7CisJCWlmIChibG9ja19lbmQgPD0gZnJvbSB8fCBibG9ja19zdGFydCA+PSB0bykgeworCQkJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKQorCQkJCXBhcnRpYWwgPSAxOworCQl9IGVsc2UgeworCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCX0KKwl9CisKKwkvKgorCSAqIElmIHRoaXMgaXMgYSBwYXJ0aWFsIHdyaXRlIHdoaWNoIGhhcHBlbmVkIHRvIG1ha2UgYWxsIGJ1ZmZlcnMKKwkgKiB1cHRvZGF0ZSB0aGVuIHdlIGNhbiBvcHRpbWl6ZSBhd2F5IGEgYm9ndXMgcmVhZHBhZ2UoKSBmb3IKKwkgKiB0aGUgbmV4dCByZWFkKCkuIEhlcmUgd2UgJ2Rpc2NvdmVyJyB3aGV0aGVyIHRoZSBwYWdlIHdlbnQKKwkgKiB1cHRvZGF0ZSBhcyBhIHJlc3VsdCBvZiB0aGlzIChwb3RlbnRpYWxseSBwYXJ0aWFsKSB3cml0ZS4KKwkgKi8KKwlpZiAoIXBhcnRpYWwpCisJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEdlbmVyaWMgInJlYWQgcGFnZSIgZnVuY3Rpb24gZm9yIGJsb2NrIGRldmljZXMgdGhhdCBoYXZlIHRoZSBub3JtYWwKKyAqIGdldF9ibG9jayBmdW5jdGlvbmFsaXR5LiBUaGlzIGlzIG1vc3Qgb2YgdGhlIGJsb2NrIGRldmljZSBmaWxlc3lzdGVtcy4KKyAqIFJlYWRzIHRoZSBwYWdlIGFzeW5jaHJvbm91c2x5IC0tLSB0aGUgdW5sb2NrX2J1ZmZlcigpIGFuZAorICogc2V0L2NsZWFyX2J1ZmZlcl91cHRvZGF0ZSgpIGZ1bmN0aW9ucyBwcm9wYWdhdGUgYnVmZmVyIHN0YXRlIGludG8gdGhlCisgKiBwYWdlIHN0cnVjdCBvbmNlIElPIGhhcyBjb21wbGV0ZWQuCisgKi8KK2ludCBibG9ja19yZWFkX2Z1bGxfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgZ2V0X2Jsb2NrX3QgKmdldF9ibG9jaykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlzZWN0b3JfdCBpYmxvY2ssIGxibG9jazsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqaGVhZCwgKmFycltNQVhfQlVGX1BFUl9QQUdFXTsKKwl1bnNpZ25lZCBpbnQgYmxvY2tzaXplOworCWludCBuciwgaTsKKwlpbnQgZnVsbHlfbWFwcGVkID0gMTsKKworCWlmICghUGFnZUxvY2tlZChwYWdlKSkKKwkJUEFHRV9CVUcocGFnZSk7CisJYmxvY2tzaXplID0gMSA8PCBpbm9kZS0+aV9ibGtiaXRzOworCWlmICghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkKKwkJY3JlYXRlX2VtcHR5X2J1ZmZlcnMocGFnZSwgYmxvY2tzaXplLCAwKTsKKwloZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCisJaWJsb2NrID0gKHNlY3Rvcl90KXBhZ2UtPmluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gaW5vZGUtPmlfYmxrYml0cyk7CisJbGJsb2NrID0gKGlfc2l6ZV9yZWFkKGlub2RlKStibG9ja3NpemUtMSkgPj4gaW5vZGUtPmlfYmxrYml0czsKKwliaCA9IGhlYWQ7CisJbnIgPSAwOworCWkgPSAwOworCisJZG8geworCQlpZiAoYnVmZmVyX3VwdG9kYXRlKGJoKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICghYnVmZmVyX21hcHBlZChiaCkpIHsKKwkJCWZ1bGx5X21hcHBlZCA9IDA7CisJCQlpZiAoaWJsb2NrIDwgbGJsb2NrKSB7CisJCQkJaWYgKGdldF9ibG9jayhpbm9kZSwgaWJsb2NrLCBiaCwgMCkpCisJCQkJCVNldFBhZ2VFcnJvcihwYWdlKTsKKwkJCX0KKwkJCWlmICghYnVmZmVyX21hcHBlZChiaCkpIHsKKwkJCQl2b2lkICprYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkJCQltZW1zZXQoa2FkZHIgKyBpICogYmxvY2tzaXplLCAwLCBibG9ja3NpemUpOworCQkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQkJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qCisJCQkgKiBnZXRfYmxvY2soKSBtaWdodCBoYXZlIHVwZGF0ZWQgdGhlIGJ1ZmZlcgorCQkJICogc3luY2hyb25vdXNseQorCQkJICovCisJCQlpZiAoYnVmZmVyX3VwdG9kYXRlKGJoKSkKKwkJCQljb250aW51ZTsKKwkJfQorCQlhcnJbbnIrK10gPSBiaDsKKwl9IHdoaWxlIChpKyssIGlibG9jaysrLCAoYmggPSBiaC0+Yl90aGlzX3BhZ2UpICE9IGhlYWQpOworCisJaWYgKGZ1bGx5X21hcHBlZCkKKwkJU2V0UGFnZU1hcHBlZFRvRGlzayhwYWdlKTsKKworCWlmICghbnIpIHsKKwkJLyoKKwkJICogQWxsIGJ1ZmZlcnMgYXJlIHVwdG9kYXRlIC0gd2UgY2FuIHNldCB0aGUgcGFnZSB1cHRvZGF0ZQorCQkgKiBhcyB3ZWxsLiBCdXQgbm90IGlmIGdldF9ibG9jaygpIHJldHVybmVkIGFuIGVycm9yLgorCQkgKi8KKwkJaWYgKCFQYWdlRXJyb3IocGFnZSkpCisJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBTdGFnZSB0d286IGxvY2sgdGhlIGJ1ZmZlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykgeworCQliaCA9IGFycltpXTsKKwkJbG9ja19idWZmZXIoYmgpOworCQltYXJrX2J1ZmZlcl9hc3luY19yZWFkKGJoKTsKKwl9CisKKwkvKgorCSAqIFN0YWdlIDM6IHN0YXJ0IHRoZSBJTy4gIENoZWNrIGZvciB1cHRvZGF0ZW5lc3MKKwkgKiBpbnNpZGUgdGhlIGJ1ZmZlciBsb2NrIGluIGNhc2UgYW5vdGhlciBwcm9jZXNzIHJlYWRpbmcKKwkgKiB0aGUgdW5kZXJseWluZyBibG9ja2RldiBicm91Z2h0IGl0IHVwdG9kYXRlICh0aGUgc2N0IGZpeCkuCisJICovCisJZm9yIChpID0gMDsgaSA8IG5yOyBpKyspIHsKKwkJYmggPSBhcnJbaV07CisJCWlmIChidWZmZXJfdXB0b2RhdGUoYmgpKQorCQkJZW5kX2J1ZmZlcl9hc3luY19yZWFkKGJoLCAxKTsKKwkJZWxzZQorCQkJc3VibWl0X2JoKFJFQUQsIGJoKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIHV0aWxpdHkgZnVuY3Rpb24gZm9yIGZpbGVzeXN0ZW1zIHRoYXQgbmVlZCB0byBkbyB3b3JrIG9uIGV4cGFuZGluZworICogdHJ1bmNhdGVzLiAgVXNlcyBwcmVwYXJlL2NvbW1pdF93cml0ZSB0byBhbGxvdyB0aGUgZmlsZXN5c3RlbSB0bworICogZGVhbCB3aXRoIHRoZSBob2xlLiAgCisgKi8KK2ludCBnZW5lcmljX2NvbnRfZXhwYW5kKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBzaXplKQoreworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bnNpZ25lZCBsb25nIGluZGV4LCBvZmZzZXQsIGxpbWl0OworCWludCBlcnI7CisKKwllcnIgPSAtRUZCSUc7CisgICAgICAgIGxpbWl0ID0gY3VycmVudC0+c2lnbmFsLT5ybGltW1JMSU1JVF9GU0laRV0ucmxpbV9jdXI7CisJaWYgKGxpbWl0ICE9IFJMSU1fSU5GSU5JVFkgJiYgc2l6ZSA+IChsb2ZmX3QpbGltaXQpIHsKKwkJc2VuZF9zaWcoU0lHWEZTWiwgY3VycmVudCwgMCk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoc2l6ZSA+IGlub2RlLT5pX3NiLT5zX21heGJ5dGVzKQorCQlnb3RvIG91dDsKKworCW9mZnNldCA9IChzaXplICYgKFBBR0VfQ0FDSEVfU0laRS0xKSk7IC8qIFdpdGhpbiBwYWdlICovCisKKwkvKiB1Z2guICBpbiBwcmVwYXJlL2NvbW1pdF93cml0ZSwgaWYgZnJvbT09dG89PXN0YXJ0IG9mIGJsb2NrLCB3ZSAKKwkqKiBza2lwIHRoZSBwcmVwYXJlLiAgbWFrZSBzdXJlIHdlIG5ldmVyIHNlbmQgYW4gb2Zmc2V0IGZvciB0aGUgc3RhcnQKKwkqKiBvZiBhIGJsb2NrCisJKi8KKwlpZiAoKG9mZnNldCAmIChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSkgPT0gMCkgeworCQlvZmZzZXQrKzsKKwl9CisJaW5kZXggPSBzaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJZXJyID0gLUVOT01FTTsKKwlwYWdlID0gZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsIGluZGV4KTsKKwlpZiAoIXBhZ2UpCisJCWdvdG8gb3V0OworCWVyciA9IG1hcHBpbmctPmFfb3BzLT5wcmVwYXJlX3dyaXRlKE5VTEwsIHBhZ2UsIG9mZnNldCwgb2Zmc2V0KTsKKwlpZiAoIWVycikgeworCQllcnIgPSBtYXBwaW5nLT5hX29wcy0+Y29tbWl0X3dyaXRlKE5VTEwsIHBhZ2UsIG9mZnNldCwgb2Zmc2V0KTsKKwl9CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCWlmIChlcnIgPiAwKQorCQllcnIgPSAwOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBGb3IgbW9yb25pYyBmaWxlc3lzdGVtcyB0aGF0IGRvIG5vdCBhbGxvdyBob2xlcyBpbiBmaWxlLgorICogV2UgbWF5IGhhdmUgdG8gZXh0ZW5kIHRoZSBmaWxlLgorICovCisKK2ludCBjb250X3ByZXBhcmVfd3JpdGUoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIG9mZnNldCwKKwkJdW5zaWduZWQgdG8sIGdldF9ibG9ja190ICpnZXRfYmxvY2ssIGxvZmZfdCAqYnl0ZXMpCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBwYWdlLT5tYXBwaW5nOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCXN0cnVjdCBwYWdlICpuZXdfcGFnZTsKKwlwZ29mZl90IHBncG9zOworCWxvbmcgc3RhdHVzOworCXVuc2lnbmVkIHplcm9mcm9tOworCXVuc2lnbmVkIGJsb2Nrc2l6ZSA9IDEgPDwgaW5vZGUtPmlfYmxrYml0czsKKwl2b2lkICprYWRkcjsKKworCXdoaWxlKHBhZ2UtPmluZGV4ID4gKHBncG9zID0gKmJ5dGVzPj5QQUdFX0NBQ0hFX1NISUZUKSkgeworCQlzdGF0dXMgPSAtRU5PTUVNOworCQluZXdfcGFnZSA9IGdyYWJfY2FjaGVfcGFnZShtYXBwaW5nLCBwZ3Bvcyk7CisJCWlmICghbmV3X3BhZ2UpCisJCQlnb3RvIG91dDsKKwkJLyogd2UgbWlnaHQgc2xlZXAgKi8KKwkJaWYgKCpieXRlcz4+UEFHRV9DQUNIRV9TSElGVCAhPSBwZ3BvcykgeworCQkJdW5sb2NrX3BhZ2UobmV3X3BhZ2UpOworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKG5ld19wYWdlKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXplcm9mcm9tID0gKmJ5dGVzICYgflBBR0VfQ0FDSEVfTUFTSzsKKwkJaWYgKHplcm9mcm9tICYgKGJsb2Nrc2l6ZS0xKSkgeworCQkJKmJ5dGVzIHw9IChibG9ja3NpemUtMSk7CisJCQkoKmJ5dGVzKSsrOworCQl9CisJCXN0YXR1cyA9IF9fYmxvY2tfcHJlcGFyZV93cml0ZShpbm9kZSwgbmV3X3BhZ2UsIHplcm9mcm9tLAorCQkJCQkJUEFHRV9DQUNIRV9TSVpFLCBnZXRfYmxvY2spOworCQlpZiAoc3RhdHVzKQorCQkJZ290byBvdXRfdW5tYXA7CisJCWthZGRyID0ga21hcF9hdG9taWMobmV3X3BhZ2UsIEtNX1VTRVIwKTsKKwkJbWVtc2V0KGthZGRyK3plcm9mcm9tLCAwLCBQQUdFX0NBQ0hFX1NJWkUtemVyb2Zyb20pOworCQlmbHVzaF9kY2FjaGVfcGFnZShuZXdfcGFnZSk7CisJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJZ2VuZXJpY19jb21taXRfd3JpdGUoTlVMTCwgbmV3X3BhZ2UsIHplcm9mcm9tLCBQQUdFX0NBQ0hFX1NJWkUpOworCQl1bmxvY2tfcGFnZShuZXdfcGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShuZXdfcGFnZSk7CisJfQorCisJaWYgKHBhZ2UtPmluZGV4IDwgcGdwb3MpIHsKKwkJLyogY29tcGxldGVseSBpbnNpZGUgdGhlIGFyZWEgKi8KKwkJemVyb2Zyb20gPSBvZmZzZXQ7CisJfSBlbHNlIHsKKwkJLyogcGFnZSBjb3ZlcnMgdGhlIGJvdW5kYXJ5LCBmaW5kIHRoZSBib3VuZGFyeSBvZmZzZXQgKi8KKwkJemVyb2Zyb20gPSAqYnl0ZXMgJiB+UEFHRV9DQUNIRV9NQVNLOworCisJCS8qIGlmIHdlIHdpbGwgZXhwYW5kIHRoZSB0aGluZyBsYXN0IGJsb2NrIHdpbGwgYmUgZmlsbGVkICovCisJCWlmICh0byA+IHplcm9mcm9tICYmICh6ZXJvZnJvbSAmIChibG9ja3NpemUtMSkpKSB7CisJCQkqYnl0ZXMgfD0gKGJsb2Nrc2l6ZS0xKTsKKwkJCSgqYnl0ZXMpKys7CisJCX0KKworCQkvKiBzdGFydGluZyBiZWxvdyB0aGUgYm91bmRhcnk/IE5vdGhpbmcgdG8gemVybyBvdXQgKi8KKwkJaWYgKG9mZnNldCA8PSB6ZXJvZnJvbSkKKwkJCXplcm9mcm9tID0gb2Zmc2V0OworCX0KKwlzdGF0dXMgPSBfX2Jsb2NrX3ByZXBhcmVfd3JpdGUoaW5vZGUsIHBhZ2UsIHplcm9mcm9tLCB0bywgZ2V0X2Jsb2NrKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDE7CisJaWYgKHplcm9mcm9tIDwgb2Zmc2V0KSB7CisJCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQltZW1zZXQoa2FkZHIremVyb2Zyb20sIDAsIG9mZnNldC16ZXJvZnJvbSk7CisJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJCV9fYmxvY2tfY29tbWl0X3dyaXRlKGlub2RlLCBwYWdlLCB6ZXJvZnJvbSwgb2Zmc2V0KTsKKwl9CisJcmV0dXJuIDA7CitvdXQxOgorCUNsZWFyUGFnZVVwdG9kYXRlKHBhZ2UpOworCXJldHVybiBzdGF0dXM7CisKK291dF91bm1hcDoKKwlDbGVhclBhZ2VVcHRvZGF0ZShuZXdfcGFnZSk7CisJdW5sb2NrX3BhZ2UobmV3X3BhZ2UpOworCXBhZ2VfY2FjaGVfcmVsZWFzZShuZXdfcGFnZSk7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworaW50IGJsb2NrX3ByZXBhcmVfd3JpdGUoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvLAorCQkJZ2V0X2Jsb2NrX3QgKmdldF9ibG9jaykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlpbnQgZXJyID0gX19ibG9ja19wcmVwYXJlX3dyaXRlKGlub2RlLCBwYWdlLCBmcm9tLCB0bywgZ2V0X2Jsb2NrKTsKKwlpZiAoZXJyKQorCQlDbGVhclBhZ2VVcHRvZGF0ZShwYWdlKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgYmxvY2tfY29tbWl0X3dyaXRlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlfX2Jsb2NrX2NvbW1pdF93cml0ZShpbm9kZSxwYWdlLGZyb20sdG8pOworCXJldHVybiAwOworfQorCitpbnQgZ2VuZXJpY19jb21taXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLAorCQl1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlsb2ZmX3QgcG9zID0gKChsb2ZmX3QpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgKyB0bzsKKwlfX2Jsb2NrX2NvbW1pdF93cml0ZShpbm9kZSxwYWdlLGZyb20sdG8pOworCS8qCisJICogTm8gbmVlZCB0byB1c2UgaV9zaXplX3JlYWQoKSBoZXJlLCB0aGUgaV9zaXplCisJICogY2Fubm90IGNoYW5nZSB1bmRlciB1cyBiZWNhdXNlIHdlIGhvbGQgaV9zZW0uCisJICovCisJaWYgKHBvcyA+IGlub2RlLT5pX3NpemUpIHsKKwkJaV9zaXplX3dyaXRlKGlub2RlLCBwb3MpOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIG5vYmhfcHJlcGFyZV93cml0ZSgpJ3MgcHJlcmVhZHMgYXJlIHNwZWNpYWw6IHRoZSBidWZmZXJfaGVhZHMgYXJlIGZyZWVkCisgKiBpbW1lZGlhdGVseSwgd2hpbGUgdW5kZXIgdGhlIHBhZ2UgbG9jay4gIFNvIGl0IG5lZWRzIGEgc3BlY2lhbCBlbmRfaW8KKyAqIGhhbmRsZXIgd2hpY2ggZG9lcyBub3QgdG91Y2ggdGhlIGJoIGFmdGVyIHVubG9ja2luZyBpdC4KKyAqCisgKiBOb3RlOiB1bmxvY2tfYnVmZmVyKCkgc29ydC1vZiBkb2VzIHRvdWNoIHRoZSBiaCBhZnRlciB1bmxvY2tpbmcgaXQsIGJ1dAorICogYSByYWNlIHRoZXJlIGlzIGJlbmlnbjogdW5sb2NrX2J1ZmZlcigpIG9ubHkgdXNlIHRoZSBiaCdzIGFkZHJlc3MgZm9yCisgKiBoYXNoaW5nIGFmdGVyIHVubG9ja2luZyB0aGUgYnVmZmVyLCBzbyBpdCBkb2Vzbid0IGFjdHVhbGx5IHRvdWNoIHRoZSBiaAorICogaXRzZWxmLgorICovCitzdGF0aWMgdm9pZCBlbmRfYnVmZmVyX3JlYWRfbm9iaChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgdXB0b2RhdGUpCit7CisJaWYgKHVwdG9kYXRlKSB7CisJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCX0gZWxzZSB7CisJCS8qIFRoaXMgaGFwcGVucywgZHVlIHRvIGZhaWxlZCBSRUFEQSBhdHRlbXB0cy4gKi8KKwkJY2xlYXJfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwl9CisJdW5sb2NrX2J1ZmZlcihiaCk7Cit9CisKKy8qCisgKiBPbiBlbnRyeSwgdGhlIHBhZ2UgaXMgZnVsbHkgbm90IHVwdG9kYXRlLgorICogT24gZXhpdCB0aGUgcGFnZSBpcyBmdWxseSB1cHRvZGF0ZSBpbiB0aGUgYXJlYXMgb3V0c2lkZSAoZnJvbSx0bykKKyAqLworaW50IG5vYmhfcHJlcGFyZV93cml0ZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8sCisJCQlnZXRfYmxvY2tfdCAqZ2V0X2Jsb2NrKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCWNvbnN0IHVuc2lnbmVkIGJsa2JpdHMgPSBpbm9kZS0+aV9ibGtiaXRzOworCWNvbnN0IHVuc2lnbmVkIGJsb2Nrc2l6ZSA9IDEgPDwgYmxrYml0czsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgbWFwX2JoOworCXN0cnVjdCBidWZmZXJfaGVhZCAqcmVhZF9iaFtNQVhfQlVGX1BFUl9QQUdFXTsKKwl1bnNpZ25lZCBibG9ja19pbl9wYWdlOworCXVuc2lnbmVkIGJsb2NrX3N0YXJ0OworCXNlY3Rvcl90IGJsb2NrX2luX2ZpbGU7CisJY2hhciAqa2FkZHI7CisJaW50IG5yX3JlYWRzID0gMDsKKwlpbnQgaTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaXNfbWFwcGVkX3RvX2Rpc2sgPSAxOworCWludCBkaXJ0aWVkX2l0ID0gMDsKKworCWlmIChQYWdlTWFwcGVkVG9EaXNrKHBhZ2UpKQorCQlyZXR1cm4gMDsKKworCWJsb2NrX2luX2ZpbGUgPSAoc2VjdG9yX3QpcGFnZS0+aW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBibGtiaXRzKTsKKwltYXBfYmguYl9wYWdlID0gcGFnZTsKKworCS8qCisJICogV2UgbG9vcCBhY3Jvc3MgYWxsIGJsb2NrcyBpbiB0aGUgcGFnZSwgd2hldGhlciBvciBub3QgdGhleSBhcmUKKwkgKiBwYXJ0IG9mIHRoZSBhZmZlY3RlZCByZWdpb24uICBUaGlzIGlzIHNvIHdlIGNhbiBkaXNjb3ZlciBpZiB0aGUKKwkgKiBwYWdlIGlzIGZ1bGx5IG1hcHBlZC10by1kaXNrLgorCSAqLworCWZvciAoYmxvY2tfc3RhcnQgPSAwLCBibG9ja19pbl9wYWdlID0gMDsKKwkJICBibG9ja19zdGFydCA8IFBBR0VfQ0FDSEVfU0laRTsKKwkJICBibG9ja19pbl9wYWdlKyssIGJsb2NrX3N0YXJ0ICs9IGJsb2Nrc2l6ZSkgeworCQl1bnNpZ25lZCBibG9ja19lbmQgPSBibG9ja19zdGFydCArIGJsb2Nrc2l6ZTsKKwkJaW50IGNyZWF0ZTsKKworCQltYXBfYmguYl9zdGF0ZSA9IDA7CisJCWNyZWF0ZSA9IDE7CisJCWlmIChibG9ja19zdGFydCA+PSB0bykKKwkJCWNyZWF0ZSA9IDA7CisJCXJldCA9IGdldF9ibG9jayhpbm9kZSwgYmxvY2tfaW5fZmlsZSArIGJsb2NrX2luX3BhZ2UsCisJCQkJCSZtYXBfYmgsIGNyZWF0ZSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGZhaWxlZDsKKwkJaWYgKCFidWZmZXJfbWFwcGVkKCZtYXBfYmgpKQorCQkJaXNfbWFwcGVkX3RvX2Rpc2sgPSAwOworCQlpZiAoYnVmZmVyX25ldygmbWFwX2JoKSkKKwkJCXVubWFwX3VuZGVybHlpbmdfbWV0YWRhdGEobWFwX2JoLmJfYmRldiwKKwkJCQkJCQltYXBfYmguYl9ibG9ja25yKTsKKwkJaWYgKFBhZ2VVcHRvZGF0ZShwYWdlKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoYnVmZmVyX25ldygmbWFwX2JoKSB8fCAhYnVmZmVyX21hcHBlZCgmbWFwX2JoKSkgeworCQkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCQlpZiAoYmxvY2tfc3RhcnQgPCBmcm9tKSB7CisJCQkJbWVtc2V0KGthZGRyK2Jsb2NrX3N0YXJ0LCAwLCBmcm9tLWJsb2NrX3N0YXJ0KTsKKwkJCQlkaXJ0aWVkX2l0ID0gMTsKKwkJCX0KKwkJCWlmIChibG9ja19lbmQgPiB0bykgeworCQkJCW1lbXNldChrYWRkciArIHRvLCAwLCBibG9ja19lbmQgLSB0byk7CisJCQkJZGlydGllZF9pdCA9IDE7CisJCQl9CisJCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChidWZmZXJfdXB0b2RhdGUoJm1hcF9iaCkpCisJCQljb250aW51ZTsJLyogcmVpc2VyZnMgZG9lcyB0aGlzICovCisJCWlmIChibG9ja19zdGFydCA8IGZyb20gfHwgYmxvY2tfZW5kID4gdG8pIHsKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBhbGxvY19idWZmZXJfaGVhZChHRlBfTk9GUyk7CisKKwkJCWlmICghYmgpIHsKKwkJCQlyZXQgPSAtRU5PTUVNOworCQkJCWdvdG8gZmFpbGVkOworCQkJfQorCQkJYmgtPmJfc3RhdGUgPSBtYXBfYmguYl9zdGF0ZTsKKwkJCWF0b21pY19zZXQoJmJoLT5iX2NvdW50LCAwKTsKKwkJCWJoLT5iX3RoaXNfcGFnZSA9IE5VTEw7CisJCQliaC0+Yl9wYWdlID0gcGFnZTsKKwkJCWJoLT5iX2Jsb2NrbnIgPSBtYXBfYmguYl9ibG9ja25yOworCQkJYmgtPmJfc2l6ZSA9IGJsb2Nrc2l6ZTsKKwkJCWJoLT5iX2RhdGEgPSAoY2hhciAqKShsb25nKWJsb2NrX3N0YXJ0OworCQkJYmgtPmJfYmRldiA9IG1hcF9iaC5iX2JkZXY7CisJCQliaC0+Yl9wcml2YXRlID0gTlVMTDsKKwkJCXJlYWRfYmhbbnJfcmVhZHMrK10gPSBiaDsKKwkJfQorCX0KKworCWlmIChucl9yZWFkcykgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCisJCS8qCisJCSAqIFRoZSBwYWdlIGlzIGxvY2tlZCwgc28gdGhlc2UgYnVmZmVycyBhcmUgcHJvdGVjdGVkIGZyb20KKwkJICogYW55IFZNIG9yIHRydW5jYXRlIGFjdGl2aXR5LiAgSGVuY2Ugd2UgZG9uJ3QgbmVlZCB0byBjYXJlCisJCSAqIGZvciB0aGUgYnVmZmVyX2hlYWQgcmVmY291bnRzLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IG5yX3JlYWRzOyBpKyspIHsKKwkJCWJoID0gcmVhZF9iaFtpXTsKKwkJCWxvY2tfYnVmZmVyKGJoKTsKKwkJCWJoLT5iX2VuZF9pbyA9IGVuZF9idWZmZXJfcmVhZF9ub2JoOworCQkJc3VibWl0X2JoKFJFQUQsIGJoKTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgbnJfcmVhZHM7IGkrKykgeworCQkJYmggPSByZWFkX2JoW2ldOworCQkJd2FpdF9vbl9idWZmZXIoYmgpOworCQkJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKQorCQkJCXJldCA9IC1FSU87CisJCQlmcmVlX2J1ZmZlcl9oZWFkKGJoKTsKKwkJCXJlYWRfYmhbaV0gPSBOVUxMOworCQl9CisJCWlmIChyZXQpCisJCQlnb3RvIGZhaWxlZDsKKwl9CisKKwlpZiAoaXNfbWFwcGVkX3RvX2Rpc2spCisJCVNldFBhZ2VNYXBwZWRUb0Rpc2socGFnZSk7CisJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCisJLyoKKwkgKiBTZXR0aW5nIHRoZSBwYWdlIGRpcnR5IGhlcmUgaXNuJ3QgbmVjZXNzYXJ5IGZvciB0aGUgcHJlcGFyZV93cml0ZQorCSAqIGZ1bmN0aW9uIC0gY29tbWl0X3dyaXRlIHdpbGwgZG8gdGhhdC4gIEJ1dCBpZi93aGVuIHRoaXMgZnVuY3Rpb24gaXMKKwkgKiB1c2VkIHdpdGhpbiB0aGUgcGFnZWZhdWx0IGhhbmRsZXIgdG8gZW5zdXJlIHRoYXQgYWxsIG1tYXBwZWQgcGFnZXMKKwkgKiBoYXZlIGJhY2tpbmcgc3BhY2UgaW4gdGhlIGZpbGVzeXN0ZW0sIHdlIHdpbGwgbmVlZCB0byBkaXJ0eSB0aGUgcGFnZQorCSAqIGlmIGl0cyBjb250ZW50cyB3ZXJlIGFsdGVyZWQuCisJICovCisJaWYgKGRpcnRpZWRfaXQpCisJCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworCisJcmV0dXJuIDA7CisKK2ZhaWxlZDoKKwlmb3IgKGkgPSAwOyBpIDwgbnJfcmVhZHM7IGkrKykgeworCQlpZiAocmVhZF9iaFtpXSkKKwkJCWZyZWVfYnVmZmVyX2hlYWQocmVhZF9iaFtpXSk7CisJfQorCisJLyoKKwkgKiBFcnJvciByZWNvdmVyeSBpcyBwcmV0dHkgc2xhY2suICBDbGVhciB0aGUgcGFnZSBhbmQgbWFyayBpdCBkaXJ0eQorCSAqIHNvIHdlJ2xsIGxhdGVyIHplcm8gb3V0IGFueSBibG9ja3Mgd2hpY2ggX3dlcmVfIGFsbG9jYXRlZC4KKwkgKi8KKwlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwltZW1zZXQoa2FkZHIsIDAsIFBBR0VfQ0FDSEVfU0laRSk7CisJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChub2JoX3ByZXBhcmVfd3JpdGUpOworCitpbnQgbm9iaF9jb21taXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLAorCQl1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlsb2ZmX3QgcG9zID0gKChsb2ZmX3QpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgKyB0bzsKKworCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworCWlmIChwb3MgPiBpbm9kZS0+aV9zaXplKSB7CisJCWlfc2l6ZV93cml0ZShpbm9kZSwgcG9zKTsKKwkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChub2JoX2NvbW1pdF93cml0ZSk7CisKKy8qCisgKiBub2JoX3dyaXRlcGFnZSgpIC0gYmFzZWQgb24gYmxvY2tfZnVsbF93cml0ZV9wYWdlKCkgZXhjZXB0CisgKiB0aGF0IGl0IHRyaWVzIHRvIG9wZXJhdGUgd2l0aG91dCBhdHRhY2hpbmcgYnVmZmVyaGVhZHMgdG8KKyAqIHRoZSBwYWdlLgorICovCitpbnQgbm9iaF93cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGdldF9ibG9ja190ICpnZXRfYmxvY2ssCisJCQlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBjb25zdCBpbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJbG9mZl90IGlfc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKwljb25zdCBwZ29mZl90IGVuZF9pbmRleCA9IGlfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCXVuc2lnbmVkIG9mZnNldDsKKwl2b2lkICprYWRkcjsKKwlpbnQgcmV0OworCisJLyogSXMgdGhlIHBhZ2UgZnVsbHkgaW5zaWRlIGlfc2l6ZT8gKi8KKwlpZiAocGFnZS0+aW5kZXggPCBlbmRfaW5kZXgpCisJCWdvdG8gb3V0OworCisJLyogSXMgdGhlIHBhZ2UgZnVsbHkgb3V0c2lkZSBpX3NpemU/ICh0cnVuY2F0ZSBpbiBwcm9ncmVzcykgKi8KKwlvZmZzZXQgPSBpX3NpemUgJiAoUEFHRV9DQUNIRV9TSVpFLTEpOworCWlmIChwYWdlLT5pbmRleCA+PSBlbmRfaW5kZXgrMSB8fCAhb2Zmc2V0KSB7CisJCS8qCisJCSAqIFRoZSBwYWdlIG1heSBoYXZlIGRpcnR5LCB1bm1hcHBlZCBidWZmZXJzLiAgRm9yIGV4YW1wbGUsCisJCSAqIHRoZXkgbWF5IGhhdmUgYmVlbiBhZGRlZCBpbiBleHQzX3dyaXRlcGFnZSgpLiAgTWFrZSB0aGVtCisJCSAqIGZyZWVhYmxlIGhlcmUsIHNvIHRoZSBwYWdlIGRvZXMgbm90IGxlYWsuCisJCSAqLworI2lmIDAKKwkJLyogTm90IHJlYWxseSBzdXJlIGFib3V0IHRoaXMgIC0gZG8gd2UgbmVlZCB0aGlzID8gKi8KKwkJaWYgKHBhZ2UtPm1hcHBpbmctPmFfb3BzLT5pbnZhbGlkYXRlcGFnZSkKKwkJCXBhZ2UtPm1hcHBpbmctPmFfb3BzLT5pbnZhbGlkYXRlcGFnZShwYWdlLCBvZmZzZXQpOworI2VuZGlmCisJCXVubG9ja19wYWdlKHBhZ2UpOworCQlyZXR1cm4gMDsgLyogZG9uJ3QgY2FyZSAqLworCX0KKworCS8qCisJICogVGhlIHBhZ2Ugc3RyYWRkbGVzIGlfc2l6ZS4gIEl0IG11c3QgYmUgemVyb2VkIG91dCBvbiBlYWNoIGFuZCBldmVyeQorCSAqIHdyaXRlcGFnZSBpbnZvY2F0aW9uIGJlY2F1c2UgaXQgbWF5IGJlIG1tYXBwZWQuICAiQSBmaWxlIGlzIG1hcHBlZAorCSAqIGluIG11bHRpcGxlcyBvZiB0aGUgcGFnZSBzaXplLiAgRm9yIGEgZmlsZSB0aGF0IGlzIG5vdCBhIG11bHRpcGxlIG9mCisJICogdGhlICBwYWdlIHNpemUsIHRoZSByZW1haW5pbmcgbWVtb3J5IGlzIHplcm9lZCB3aGVuIG1hcHBlZCwgYW5kCisJICogd3JpdGVzIHRvIHRoYXQgcmVnaW9uIGFyZSBub3Qgd3JpdHRlbiBvdXQgdG8gdGhlIGZpbGUuIgorCSAqLworCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCW1lbXNldChrYWRkciArIG9mZnNldCwgMCwgUEFHRV9DQUNIRV9TSVpFIC0gb2Zmc2V0KTsKKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CitvdXQ6CisJcmV0ID0gbXBhZ2Vfd3JpdGVwYWdlKHBhZ2UsIGdldF9ibG9jaywgd2JjKTsKKwlpZiAocmV0ID09IC1FQUdBSU4pCisJCXJldCA9IF9fYmxvY2tfd3JpdGVfZnVsbF9wYWdlKGlub2RlLCBwYWdlLCBnZXRfYmxvY2ssIHdiYyk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wobm9iaF93cml0ZXBhZ2UpOworCisvKgorICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgLT5wcmVwYXJlX3dyaXRlKCkgdXNlcyBub2JoX3ByZXBhcmVfd3JpdGUoKS4KKyAqLworaW50IG5vYmhfdHJ1bmNhdGVfcGFnZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgbG9mZl90IGZyb20pCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisJdW5zaWduZWQgYmxvY2tzaXplID0gMSA8PCBpbm9kZS0+aV9ibGtiaXRzOworCXBnb2ZmX3QgaW5kZXggPSBmcm9tID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJdW5zaWduZWQgb2Zmc2V0ID0gZnJvbSAmIChQQUdFX0NBQ0hFX1NJWkUtMSk7CisJdW5zaWduZWQgdG87CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyAqYV9vcHMgPSBtYXBwaW5nLT5hX29wczsKKwljaGFyICprYWRkcjsKKwlpbnQgcmV0ID0gMDsKKworCWlmICgob2Zmc2V0ICYgKGJsb2Nrc2l6ZSAtIDEpKSA9PSAwKQorCQlnb3RvIG91dDsKKworCXJldCA9IC1FTk9NRU07CisJcGFnZSA9IGdyYWJfY2FjaGVfcGFnZShtYXBwaW5nLCBpbmRleCk7CisJaWYgKCFwYWdlKQorCQlnb3RvIG91dDsKKworCXRvID0gKG9mZnNldCArIGJsb2Nrc2l6ZSkgJiB+KGJsb2Nrc2l6ZSAtIDEpOworCXJldCA9IGFfb3BzLT5wcmVwYXJlX3dyaXRlKE5VTEwsIHBhZ2UsIG9mZnNldCwgdG8pOworCWlmIChyZXQgPT0gMCkgeworCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkJbWVtc2V0KGthZGRyICsgb2Zmc2V0LCAwLCBQQUdFX0NBQ0hFX1NJWkUgLSBvZmZzZXQpOworCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKwl9CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworb3V0OgorCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKG5vYmhfdHJ1bmNhdGVfcGFnZSk7CisKK2ludCBibG9ja190cnVuY2F0ZV9wYWdlKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJbG9mZl90IGZyb20sIGdldF9ibG9ja190ICpnZXRfYmxvY2spCit7CisJcGdvZmZfdCBpbmRleCA9IGZyb20gPj4gUEFHRV9DQUNIRV9TSElGVDsKKwl1bnNpZ25lZCBvZmZzZXQgPSBmcm9tICYgKFBBR0VfQ0FDSEVfU0laRS0xKTsKKwl1bnNpZ25lZCBibG9ja3NpemU7CisJcGdvZmZfdCBpYmxvY2s7CisJdW5zaWduZWQgbGVuZ3RoLCBwb3M7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwl2b2lkICprYWRkcjsKKwlpbnQgZXJyOworCisJYmxvY2tzaXplID0gMSA8PCBpbm9kZS0+aV9ibGtiaXRzOworCWxlbmd0aCA9IG9mZnNldCAmIChibG9ja3NpemUgLSAxKTsKKworCS8qIEJsb2NrIGJvdW5kYXJ5PyBOb3RoaW5nIHRvIGRvICovCisJaWYgKCFsZW5ndGgpCisJCXJldHVybiAwOworCisJbGVuZ3RoID0gYmxvY2tzaXplIC0gbGVuZ3RoOworCWlibG9jayA9IGluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gaW5vZGUtPmlfYmxrYml0cyk7CisJCisJcGFnZSA9IGdyYWJfY2FjaGVfcGFnZShtYXBwaW5nLCBpbmRleCk7CisJZXJyID0gLUVOT01FTTsKKwlpZiAoIXBhZ2UpCisJCWdvdG8gb3V0OworCisJaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKQorCQljcmVhdGVfZW1wdHlfYnVmZmVycyhwYWdlLCBibG9ja3NpemUsIDApOworCisJLyogRmluZCB0aGUgYnVmZmVyIHRoYXQgY29udGFpbnMgIm9mZnNldCIgKi8KKwliaCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwlwb3MgPSBibG9ja3NpemU7CisJd2hpbGUgKG9mZnNldCA+PSBwb3MpIHsKKwkJYmggPSBiaC0+Yl90aGlzX3BhZ2U7CisJCWlibG9jaysrOworCQlwb3MgKz0gYmxvY2tzaXplOworCX0KKworCWVyciA9IDA7CisJaWYgKCFidWZmZXJfbWFwcGVkKGJoKSkgeworCQllcnIgPSBnZXRfYmxvY2soaW5vZGUsIGlibG9jaywgYmgsIDApOworCQlpZiAoZXJyKQorCQkJZ290byB1bmxvY2s7CisJCS8qIHVubWFwcGVkPyBJdCdzIGEgaG9sZSAtIG5vdGhpbmcgdG8gZG8gKi8KKwkJaWYgKCFidWZmZXJfbWFwcGVkKGJoKSkKKwkJCWdvdG8gdW5sb2NrOworCX0KKworCS8qIE9rLCBpdCdzIG1hcHBlZC4gTWFrZSBzdXJlIGl0J3MgdXAtdG8tZGF0ZSAqLworCWlmIChQYWdlVXB0b2RhdGUocGFnZSkpCisJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCisJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpICYmICFidWZmZXJfZGVsYXkoYmgpKSB7CisJCWVyciA9IC1FSU87CisJCWxsX3J3X2Jsb2NrKFJFQUQsIDEsICZiaCk7CisJCXdhaXRfb25fYnVmZmVyKGJoKTsKKwkJLyogVWhodWguIFJlYWQgZXJyb3IuIENvbXBsYWluIGFuZCBwdW50LiAqLworCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCQlnb3RvIHVubG9jazsKKwl9CisKKwlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwltZW1zZXQoa2FkZHIgKyBvZmZzZXQsIDAsIGxlbmd0aCk7CisJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCisJbWFya19idWZmZXJfZGlydHkoYmgpOworCWVyciA9IDA7CisKK3VubG9jazoKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFRoZSBnZW5lcmljIC0+d3JpdGVwYWdlIGZ1bmN0aW9uIGZvciBidWZmZXItYmFja2VkIGFkZHJlc3Nfc3BhY2VzCisgKi8KK2ludCBibG9ja193cml0ZV9mdWxsX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGdldF9ibG9ja190ICpnZXRfYmxvY2ssCisJCQlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBjb25zdCBpbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJbG9mZl90IGlfc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKwljb25zdCBwZ29mZl90IGVuZF9pbmRleCA9IGlfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCXVuc2lnbmVkIG9mZnNldDsKKwl2b2lkICprYWRkcjsKKworCS8qIElzIHRoZSBwYWdlIGZ1bGx5IGluc2lkZSBpX3NpemU/ICovCisJaWYgKHBhZ2UtPmluZGV4IDwgZW5kX2luZGV4KQorCQlyZXR1cm4gX19ibG9ja193cml0ZV9mdWxsX3BhZ2UoaW5vZGUsIHBhZ2UsIGdldF9ibG9jaywgd2JjKTsKKworCS8qIElzIHRoZSBwYWdlIGZ1bGx5IG91dHNpZGUgaV9zaXplPyAodHJ1bmNhdGUgaW4gcHJvZ3Jlc3MpICovCisJb2Zmc2V0ID0gaV9zaXplICYgKFBBR0VfQ0FDSEVfU0laRS0xKTsKKwlpZiAocGFnZS0+aW5kZXggPj0gZW5kX2luZGV4KzEgfHwgIW9mZnNldCkgeworCQkvKgorCQkgKiBUaGUgcGFnZSBtYXkgaGF2ZSBkaXJ0eSwgdW5tYXBwZWQgYnVmZmVycy4gIEZvciBleGFtcGxlLAorCQkgKiB0aGV5IG1heSBoYXZlIGJlZW4gYWRkZWQgaW4gZXh0M193cml0ZXBhZ2UoKS4gIE1ha2UgdGhlbQorCQkgKiBmcmVlYWJsZSBoZXJlLCBzbyB0aGUgcGFnZSBkb2VzIG5vdCBsZWFrLgorCQkgKi8KKwkJYmxvY2tfaW52YWxpZGF0ZXBhZ2UocGFnZSwgMCk7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQlyZXR1cm4gMDsgLyogZG9uJ3QgY2FyZSAqLworCX0KKworCS8qCisJICogVGhlIHBhZ2Ugc3RyYWRkbGVzIGlfc2l6ZS4gIEl0IG11c3QgYmUgemVyb2VkIG91dCBvbiBlYWNoIGFuZCBldmVyeQorCSAqIHdyaXRlcGFnZSBpbnZva2F0aW9uIGJlY2F1c2UgaXQgbWF5IGJlIG1tYXBwZWQuICAiQSBmaWxlIGlzIG1hcHBlZAorCSAqIGluIG11bHRpcGxlcyBvZiB0aGUgcGFnZSBzaXplLiAgRm9yIGEgZmlsZSB0aGF0IGlzIG5vdCBhIG11bHRpcGxlIG9mCisJICogdGhlICBwYWdlIHNpemUsIHRoZSByZW1haW5pbmcgbWVtb3J5IGlzIHplcm9lZCB3aGVuIG1hcHBlZCwgYW5kCisJICogd3JpdGVzIHRvIHRoYXQgcmVnaW9uIGFyZSBub3Qgd3JpdHRlbiBvdXQgdG8gdGhlIGZpbGUuIgorCSAqLworCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCW1lbXNldChrYWRkciArIG9mZnNldCwgMCwgUEFHRV9DQUNIRV9TSVpFIC0gb2Zmc2V0KTsKKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJcmV0dXJuIF9fYmxvY2tfd3JpdGVfZnVsbF9wYWdlKGlub2RlLCBwYWdlLCBnZXRfYmxvY2ssIHdiYyk7Cit9CisKK3NlY3Rvcl90IGdlbmVyaWNfYmxvY2tfYm1hcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc2VjdG9yX3QgYmxvY2ssCisJCQkgICAgZ2V0X2Jsb2NrX3QgKmdldF9ibG9jaykKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgdG1wOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCXRtcC5iX3N0YXRlID0gMDsKKwl0bXAuYl9ibG9ja25yID0gMDsKKwlnZXRfYmxvY2soaW5vZGUsIGJsb2NrLCAmdG1wLCAwKTsKKwlyZXR1cm4gdG1wLmJfYmxvY2tucjsKK30KKworc3RhdGljIGludCBlbmRfYmlvX2JoX2lvX3N5bmMoc3RydWN0IGJpbyAqYmlvLCB1bnNpZ25lZCBpbnQgYnl0ZXNfZG9uZSwgaW50IGVycikKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gYmlvLT5iaV9wcml2YXRlOworCisJaWYgKGJpby0+Ymlfc2l6ZSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoZXJyID09IC1FT1BOT1RTVVBQKSB7CisJCXNldF9iaXQoQklPX0VPUE5PVFNVUFAsICZiaW8tPmJpX2ZsYWdzKTsKKwkJc2V0X2JpdChCSF9Fb3Bub3RzdXBwLCAmYmgtPmJfc3RhdGUpOworCX0KKworCWJoLT5iX2VuZF9pbyhiaCwgdGVzdF9iaXQoQklPX1VQVE9EQVRFLCAmYmlvLT5iaV9mbGFncykpOworCWJpb19wdXQoYmlvKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHN1Ym1pdF9iaChpbnQgcncsIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoKQoreworCXN0cnVjdCBiaW8gKmJpbzsKKwlpbnQgcmV0ID0gMDsKKworCUJVR19PTighYnVmZmVyX2xvY2tlZChiaCkpOworCUJVR19PTighYnVmZmVyX21hcHBlZChiaCkpOworCUJVR19PTighYmgtPmJfZW5kX2lvKTsKKworCWlmIChidWZmZXJfb3JkZXJlZChiaCkgJiYgKHJ3ID09IFdSSVRFKSkKKwkJcncgPSBXUklURV9CQVJSSUVSOworCisJLyoKKwkgKiBPbmx5IGNsZWFyIG91dCBhIHdyaXRlIGVycm9yIHdoZW4gcmV3cml0aW5nLCBzaG91bGQgdGhpcworCSAqIGluY2x1ZGUgV1JJVEVfU1lOQyBhcyB3ZWxsPworCSAqLworCWlmICh0ZXN0X3NldF9idWZmZXJfcmVxKGJoKSAmJiAocncgPT0gV1JJVEUgfHwgcncgPT0gV1JJVEVfQkFSUklFUikpCisJCWNsZWFyX2J1ZmZlcl93cml0ZV9pb19lcnJvcihiaCk7CisKKwkvKgorCSAqIGZyb20gaGVyZSBvbiBkb3duLCBpdCdzIGFsbCBiaW8gLS0gZG8gdGhlIGluaXRpYWwgbWFwcGluZywKKwkgKiBzdWJtaXRfYmlvIC0+IGdlbmVyaWNfbWFrZV9yZXF1ZXN0IG1heSBmdXJ0aGVyIG1hcCB0aGlzIGJpbyBhcm91bmQKKwkgKi8KKwliaW8gPSBiaW9fYWxsb2MoR0ZQX05PSU8sIDEpOworCisJYmlvLT5iaV9zZWN0b3IgPSBiaC0+Yl9ibG9ja25yICogKGJoLT5iX3NpemUgPj4gOSk7CisJYmlvLT5iaV9iZGV2ID0gYmgtPmJfYmRldjsKKwliaW8tPmJpX2lvX3ZlY1swXS5idl9wYWdlID0gYmgtPmJfcGFnZTsKKwliaW8tPmJpX2lvX3ZlY1swXS5idl9sZW4gPSBiaC0+Yl9zaXplOworCWJpby0+YmlfaW9fdmVjWzBdLmJ2X29mZnNldCA9IGJoX29mZnNldChiaCk7CisKKwliaW8tPmJpX3ZjbnQgPSAxOworCWJpby0+YmlfaWR4ID0gMDsKKwliaW8tPmJpX3NpemUgPSBiaC0+Yl9zaXplOworCisJYmlvLT5iaV9lbmRfaW8gPSBlbmRfYmlvX2JoX2lvX3N5bmM7CisJYmlvLT5iaV9wcml2YXRlID0gYmg7CisKKwliaW9fZ2V0KGJpbyk7CisJc3VibWl0X2JpbyhydywgYmlvKTsKKworCWlmIChiaW9fZmxhZ2dlZChiaW8sIEJJT19FT1BOT1RTVVBQKSkKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisKKwliaW9fcHV0KGJpbyk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBsbF9yd19ibG9jazogbG93LWxldmVsIGFjY2VzcyB0byBibG9jayBkZXZpY2VzIChERVBSRUNBVEVEKQorICogQHJ3OiB3aGV0aGVyIHRvICVSRUFEIG9yICVXUklURSBvciBtYXliZSAlUkVBREEgKHJlYWRhaGVhZCkKKyAqIEBucjogbnVtYmVyIG9mICZzdHJ1Y3QgYnVmZmVyX2hlYWRzIGluIHRoZSBhcnJheQorICogQGJoczogYXJyYXkgb2YgcG9pbnRlcnMgdG8gJnN0cnVjdCBidWZmZXJfaGVhZAorICoKKyAqIGxsX3J3X2Jsb2NrKCkgdGFrZXMgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gJnN0cnVjdCBidWZmZXJfaGVhZHMsCisgKiBhbmQgcmVxdWVzdHMgYW4gSS9PIG9wZXJhdGlvbiBvbiB0aGVtLCBlaXRoZXIgYSAlUkVBRCBvciBhICVXUklURS4KKyAqIFRoZSB0aGlyZCAlUkVBREEgb3B0aW9uIGlzIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IKKyAqIGdlbmVyaWNfbWFrZV9yZXF1ZXN0KCkgd2hpY2ggbGxfcndfYmxvY2soKSBjYWxscy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRyb3BzIGFueSBidWZmZXIgdGhhdCBpdCBjYW5ub3QgZ2V0IGEgbG9jayBvbiAod2l0aCB0aGUKKyAqIEJIX0xvY2sgc3RhdGUgYml0KSwgYW55IGJ1ZmZlciB0aGF0IGFwcGVhcnMgdG8gYmUgY2xlYW4gd2hlbiBkb2luZyBhCisgKiB3cml0ZSByZXF1ZXN0LCBhbmQgYW55IGJ1ZmZlciB0aGF0IGFwcGVhcnMgdG8gYmUgdXAtdG8tZGF0ZSB3aGVuIGRvaW5nCisgKiByZWFkIHJlcXVlc3QuICBGdXJ0aGVyIGl0IG1hcmtzIGFzIGNsZWFuIGJ1ZmZlcnMgdGhhdCBhcmUgcHJvY2Vzc2VkIGZvcgorICogd3JpdGluZyAodGhlIGJ1ZmZlciBjYWNoZSB3b24ndCBhc3N1bWUgdGhhdCB0aGV5IGFyZSBhY3R1YWxseSBjbGVhbiB1bnRpbAorICogdGhlIGJ1ZmZlciBnZXRzIHVubG9ja2VkKS4KKyAqCisgKiBsbF9yd19ibG9jayBzZXRzIGJfZW5kX2lvIHRvIHNpbXBsZSBjb21wbGV0aW9uIGhhbmRsZXIgdGhhdCBtYXJrcworICogdGhlIGJ1ZmZlciB1cC10by1kYXRlIChpZiBhcHByb3JpYXRlKSwgdW5sb2NrcyB0aGUgYnVmZmVyIGFuZCB3YWtlcworICogYW55IHdhaXRlcnMuIAorICoKKyAqIEFsbCBvZiB0aGUgYnVmZmVycyBtdXN0IGJlIGZvciB0aGUgc2FtZSBkZXZpY2UsIGFuZCBtdXN0IGFsc28gYmUgYQorICogbXVsdGlwbGUgb2YgdGhlIGN1cnJlbnQgYXBwcm92ZWQgc2l6ZSBmb3IgdGhlIGRldmljZS4KKyAqLwordm9pZCBsbF9yd19ibG9jayhpbnQgcncsIGludCBuciwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaHNbXSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBucjsgaSsrKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBiaHNbaV07CisKKwkJaWYgKHRlc3Rfc2V0X2J1ZmZlcl9sb2NrZWQoYmgpKQorCQkJY29udGludWU7CisKKwkJZ2V0X2JoKGJoKTsKKwkJaWYgKHJ3ID09IFdSSVRFKSB7CisJCQliaC0+Yl9lbmRfaW8gPSBlbmRfYnVmZmVyX3dyaXRlX3N5bmM7CisJCQlpZiAodGVzdF9jbGVhcl9idWZmZXJfZGlydHkoYmgpKSB7CisJCQkJc3VibWl0X2JoKFdSSVRFLCBiaCk7CisJCQkJY29udGludWU7CisJCQl9CisJCX0gZWxzZSB7CisJCQliaC0+Yl9lbmRfaW8gPSBlbmRfYnVmZmVyX3JlYWRfc3luYzsKKwkJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQkJCXN1Ym1pdF9iaChydywgYmgpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCXVubG9ja19idWZmZXIoYmgpOworCQlwdXRfYmgoYmgpOworCX0KK30KKworLyoKKyAqIEZvciBhIGRhdGEtaW50ZWdyaXR5IHdyaXRlb3V0LCB3ZSBuZWVkIHRvIHdhaXQgdXBvbiBhbnkgaW4tcHJvZ3Jlc3MgSS9PCisgKiBhbmQgdGhlbiBzdGFydCBuZXcgSS9PIGFuZCB0aGVuIHdhaXQgdXBvbiBpdC4gIFRoZSBjYWxsZXIgbXVzdCBoYXZlIGEgcmVmIG9uCisgKiB0aGUgYnVmZmVyX2hlYWQuCisgKi8KK2ludCBzeW5jX2RpcnR5X2J1ZmZlcihzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWludCByZXQgPSAwOworCisJV0FSTl9PTihhdG9taWNfcmVhZCgmYmgtPmJfY291bnQpIDwgMSk7CisJbG9ja19idWZmZXIoYmgpOworCWlmICh0ZXN0X2NsZWFyX2J1ZmZlcl9kaXJ0eShiaCkpIHsKKwkJZ2V0X2JoKGJoKTsKKwkJYmgtPmJfZW5kX2lvID0gZW5kX2J1ZmZlcl93cml0ZV9zeW5jOworCQlyZXQgPSBzdWJtaXRfYmgoV1JJVEUsIGJoKTsKKwkJd2FpdF9vbl9idWZmZXIoYmgpOworCQlpZiAoYnVmZmVyX2VvcG5vdHN1cHAoYmgpKSB7CisJCQljbGVhcl9idWZmZXJfZW9wbm90c3VwcChiaCk7CisJCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJfQorCQlpZiAoIXJldCAmJiAhYnVmZmVyX3VwdG9kYXRlKGJoKSkKKwkJCXJldCA9IC1FSU87CisJfSBlbHNlIHsKKwkJdW5sb2NrX2J1ZmZlcihiaCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiB0cnlfdG9fZnJlZV9idWZmZXJzKCkgY2hlY2tzIGlmIGFsbCB0aGUgYnVmZmVycyBvbiB0aGlzIHBhcnRpY3VsYXIgcGFnZQorICogYXJlIHVudXNlZCwgYW5kIHJlbGVhc2VzIHRoZW0gaWYgc28uCisgKgorICogRXhjbHVzaW9uIGFnYWluc3QgdHJ5X3RvX2ZyZWVfYnVmZmVycyBtYXkgYmUgb2J0YWluZWQgYnkgZWl0aGVyCisgKiBsb2NraW5nIHRoZSBwYWdlIG9yIGJ5IGhvbGRpbmcgaXRzIG1hcHBpbmcncyBwcml2YXRlX2xvY2suCisgKgorICogSWYgdGhlIHBhZ2UgaXMgZGlydHkgYnV0IGFsbCB0aGUgYnVmZmVycyBhcmUgY2xlYW4gdGhlbiB3ZSBuZWVkIHRvCisgKiBiZSBzdXJlIHRvIG1hcmsgdGhlIHBhZ2UgY2xlYW4gYXMgd2VsbC4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgcGFnZQorICogbWF5IGJlIGFnYWluc3QgYSBibG9jayBkZXZpY2UsIGFuZCBhIGxhdGVyIHJlYXR0YWNobWVudCBvZiBidWZmZXJzCisgKiB0byBhIGRpcnR5IHBhZ2Ugd2lsbCBzZXQgKmFsbCogYnVmZmVycyBkaXJ0eS4gIFdoaWNoIHdvdWxkIGNvcnJ1cHQKKyAqIGZpbGVzeXN0ZW0gZGF0YSBvbiB0aGUgc2FtZSBkZXZpY2UuCisgKgorICogVGhlIHNhbWUgYXBwbGllcyB0byByZWd1bGFyIGZpbGVzeXN0ZW0gcGFnZXM6IGlmIGFsbCB0aGUgYnVmZmVycyBhcmUKKyAqIGNsZWFuIHRoZW4gd2Ugc2V0IHRoZSBwYWdlIGNsZWFuIGFuZCBwcm9jZWVkLiAgVG8gZG8gdGhhdCwgd2UgcmVxdWlyZQorICogdG90YWwgZXhjbHVzaW9uIGZyb20gX19zZXRfcGFnZV9kaXJ0eV9idWZmZXJzKCkuICBUaGF0IGlzIG9idGFpbmVkIHdpdGgKKyAqIHByaXZhdGVfbG9jay4KKyAqCisgKiB0cnlfdG9fZnJlZV9idWZmZXJzKCkgaXMgbm9uLWJsb2NraW5nLgorICovCitzdGF0aWMgaW5saW5lIGludCBidWZmZXJfYnVzeShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXJldHVybiBhdG9taWNfcmVhZCgmYmgtPmJfY291bnQpIHwKKwkJKGJoLT5iX3N0YXRlICYgKCgxIDw8IEJIX0RpcnR5KSB8ICgxIDw8IEJIX0xvY2spKSk7Cit9CisKK3N0YXRpYyBpbnQKK2Ryb3BfYnVmZmVycyhzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYnVmZmVyc190b19mcmVlKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCisJYmggPSBoZWFkOworCWRvIHsKKwkJaWYgKGJ1ZmZlcl93cml0ZV9pb19lcnJvcihiaCkpCisJCQlzZXRfYml0KEFTX0VJTywgJnBhZ2UtPm1hcHBpbmctPmZsYWdzKTsKKwkJaWYgKGJ1ZmZlcl9idXN5KGJoKSkKKwkJCWdvdG8gZmFpbGVkOworCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKKwl9IHdoaWxlIChiaCAhPSBoZWFkKTsKKworCWRvIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpuZXh0ID0gYmgtPmJfdGhpc19wYWdlOworCisJCWlmICghbGlzdF9lbXB0eSgmYmgtPmJfYXNzb2NfYnVmZmVycykpCisJCQlfX3JlbW92ZV9hc3NvY19xdWV1ZShiaCk7CisJCWJoID0gbmV4dDsKKwl9IHdoaWxlIChiaCAhPSBoZWFkKTsKKwkqYnVmZmVyc190b19mcmVlID0gaGVhZDsKKwlfX2NsZWFyX3BhZ2VfYnVmZmVycyhwYWdlKTsKKwlyZXR1cm4gMTsKK2ZhaWxlZDoKKwlyZXR1cm4gMDsKK30KKworaW50IHRyeV90b19mcmVlX2J1ZmZlcnMoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKiBjb25zdCBtYXBwaW5nID0gcGFnZS0+bWFwcGluZzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJ1ZmZlcnNfdG9fZnJlZSA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwlCVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOworCWlmIChQYWdlV3JpdGViYWNrKHBhZ2UpKQorCQlyZXR1cm4gMDsKKworCWlmIChtYXBwaW5nID09IE5VTEwpIHsJCS8qIGNhbiB0aGlzIHN0aWxsIGhhcHBlbj8gKi8KKwkJcmV0ID0gZHJvcF9idWZmZXJzKHBhZ2UsICZidWZmZXJzX3RvX2ZyZWUpOworCQlnb3RvIG91dDsKKwl9CisKKwlzcGluX2xvY2soJm1hcHBpbmctPnByaXZhdGVfbG9jayk7CisJcmV0ID0gZHJvcF9idWZmZXJzKHBhZ2UsICZidWZmZXJzX3RvX2ZyZWUpOworCWlmIChyZXQpIHsKKwkJLyoKKwkJICogSWYgdGhlIGZpbGVzeXN0ZW0gd3JpdGVzIGl0cyBidWZmZXJzIGJ5IGhhbmQgKGVnIGV4dDMpCisJCSAqIHRoZW4gd2UgY2FuIGhhdmUgY2xlYW4gYnVmZmVycyBhZ2FpbnN0IGEgZGlydHkgcGFnZS4gIFdlCisJCSAqIGNsZWFuIHRoZSBwYWdlIGhlcmU7IG90aGVyd2lzZSBsYXRlciByZWF0dGFjaG1lbnQgb2YgYnVmZmVycworCQkgKiBjb3VsZCBlbmNvdW50ZXIgYSBub24tdXB0b2RhdGUgcGFnZSwgd2hpY2ggaXMgdW5yZXNvbHZhYmxlLgorCQkgKiBUaGlzIG9ubHkgYXBwbGllcyBpbiB0aGUgcmFyZSBjYXNlIHdoZXJlIHRyeV90b19mcmVlX2J1ZmZlcnMKKwkJICogc3VjY2VlZHMgYnV0IHRoZSBwYWdlIGlzIG5vdCBmcmVlZC4KKwkJICovCisJCWNsZWFyX3BhZ2VfZGlydHkocGFnZSk7CisJfQorCXNwaW5fdW5sb2NrKCZtYXBwaW5nLT5wcml2YXRlX2xvY2spOworb3V0OgorCWlmIChidWZmZXJzX3RvX2ZyZWUpIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGJ1ZmZlcnNfdG9fZnJlZTsKKworCQlkbyB7CisJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5leHQgPSBiaC0+Yl90aGlzX3BhZ2U7CisJCQlmcmVlX2J1ZmZlcl9oZWFkKGJoKTsKKwkJCWJoID0gbmV4dDsKKwkJfSB3aGlsZSAoYmggIT0gYnVmZmVyc190b19mcmVlKTsKKwl9CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wodHJ5X3RvX2ZyZWVfYnVmZmVycyk7CisKK2ludCBibG9ja19zeW5jX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CisKKwlzbXBfbWIoKTsKKwltYXBwaW5nID0gcGFnZV9tYXBwaW5nKHBhZ2UpOworCWlmIChtYXBwaW5nKQorCQlibGtfcnVuX2JhY2tpbmdfZGV2KG1hcHBpbmctPmJhY2tpbmdfZGV2X2luZm8sIHBhZ2UpOworCXJldHVybiAwOworfQorCisvKgorICogVGhlcmUgYXJlIG5vIGJkZmx1c2ggdHVuYWJsZXMgbGVmdC4gIEJ1dCBkaXN0cmlidXRpb25zIGFyZQorICogc3RpbGwgcnVubmluZyBvYnNvbGV0ZSBmbHVzaCBkYWVtb25zLCBzbyB3ZSB0ZXJtaW5hdGUgdGhlbSBoZXJlLgorICoKKyAqIFVzZSBvZiBiZGZsdXNoKCkgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIGtlcm5lbC4KKyAqIFRoZSBgcGRmbHVzaCcga2VybmVsIHRocmVhZHMgZnVsbHkgcmVwbGFjZSBiZGZsdXNoIGRhZW1vbnMgYW5kIHRoaXMgY2FsbC4KKyAqLworYXNtbGlua2FnZSBsb25nIHN5c19iZGZsdXNoKGludCBmdW5jLCBsb25nIGRhdGEpCit7CisJc3RhdGljIGludCBtc2dfY291bnQ7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAobXNnX2NvdW50IDwgNSkgeworCQltc2dfY291bnQrKzsKKwkJcHJpbnRrKEtFUk5fSU5GTworCQkJIndhcm5pbmc6IHByb2Nlc3MgYCVzJyB1c2VkIHRoZSBvYnNvbGV0ZSBiZGZsdXNoIgorCQkJIiBzeXN0ZW0gY2FsbFxuIiwgY3VycmVudC0+Y29tbSk7CisJCXByaW50ayhLRVJOX0lORk8gIkZpeCB5b3VyIGluaXRzY3JpcHRzP1xuIik7CisJfQorCisJaWYgKGZ1bmMgPT0gMSkKKwkJZG9fZXhpdCgwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEJ1ZmZlci1oZWFkIGFsbG9jYXRpb24KKyAqLworc3RhdGljIGttZW1fY2FjaGVfdCAqYmhfY2FjaGVwOworCisvKgorICogT25jZSB0aGUgbnVtYmVyIG9mIGJoJ3MgaW4gdGhlIG1hY2hpbmUgZXhjZWVkcyB0aGlzIGxldmVsLCB3ZSBzdGFydAorICogc3RyaXBwaW5nIHRoZW0gaW4gd3JpdGViYWNrLgorICovCitzdGF0aWMgaW50IG1heF9idWZmZXJfaGVhZHM7CisKK2ludCBidWZmZXJfaGVhZHNfb3Zlcl9saW1pdDsKKworc3RydWN0IGJoX2FjY291bnRpbmcgeworCWludCBucjsJCQkvKiBOdW1iZXIgb2YgbGl2ZSBiaCdzICovCisJaW50IHJhdGVsaW1pdDsJCS8qIExpbWl0IGNhY2hlbGluZSBib3VuY2luZyAqLworfTsKKworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBiaF9hY2NvdW50aW5nLCBiaF9hY2NvdW50aW5nKSA9IHswLCAwfTsKKworc3RhdGljIHZvaWQgcmVjYWxjX2JoX3N0YXRlKHZvaWQpCit7CisJaW50IGk7CisJaW50IHRvdCA9IDA7CisKKwlpZiAoX19nZXRfY3B1X3ZhcihiaF9hY2NvdW50aW5nKS5yYXRlbGltaXQrKyA8IDQwOTYpCisJCXJldHVybjsKKwlfX2dldF9jcHVfdmFyKGJoX2FjY291bnRpbmcpLnJhdGVsaW1pdCA9IDA7CisJZm9yX2VhY2hfY3B1KGkpCisJCXRvdCArPSBwZXJfY3B1KGJoX2FjY291bnRpbmcsIGkpLm5yOworCWJ1ZmZlcl9oZWFkc19vdmVyX2xpbWl0ID0gKHRvdCA+IG1heF9idWZmZXJfaGVhZHMpOworfQorCQorc3RydWN0IGJ1ZmZlcl9oZWFkICphbGxvY19idWZmZXJfaGVhZCh1bnNpZ25lZCBpbnQgX19ub2Nhc3QgZ2ZwX2ZsYWdzKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqcmV0ID0ga21lbV9jYWNoZV9hbGxvYyhiaF9jYWNoZXAsIGdmcF9mbGFncyk7CisJaWYgKHJldCkgeworCQlwcmVlbXB0X2Rpc2FibGUoKTsKKwkJX19nZXRfY3B1X3ZhcihiaF9hY2NvdW50aW5nKS5ucisrOworCQlyZWNhbGNfYmhfc3RhdGUoKTsKKwkJcHJlZW1wdF9lbmFibGUoKTsKKwl9CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woYWxsb2NfYnVmZmVyX2hlYWQpOworCit2b2lkIGZyZWVfYnVmZmVyX2hlYWQoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlCVUdfT04oIWxpc3RfZW1wdHkoJmJoLT5iX2Fzc29jX2J1ZmZlcnMpKTsKKwlrbWVtX2NhY2hlX2ZyZWUoYmhfY2FjaGVwLCBiaCk7CisJcHJlZW1wdF9kaXNhYmxlKCk7CisJX19nZXRfY3B1X3ZhcihiaF9hY2NvdW50aW5nKS5uci0tOworCXJlY2FsY19iaF9zdGF0ZSgpOworCXByZWVtcHRfZW5hYmxlKCk7Cit9CitFWFBPUlRfU1lNQk9MKGZyZWVfYnVmZmVyX2hlYWQpOworCitzdGF0aWMgdm9pZAoraW5pdF9idWZmZXJfaGVhZCh2b2lkICpkYXRhLCBrbWVtX2NhY2hlX3QgKmNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRll8U0xBQl9DVE9SX0NPTlNUUlVDVE9SKSkgPT0KKwkJCSAgICBTTEFCX0NUT1JfQ09OU1RSVUNUT1IpIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmggPSAoc3RydWN0IGJ1ZmZlcl9oZWFkICopZGF0YTsKKworCQltZW1zZXQoYmgsIDAsIHNpemVvZigqYmgpKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmJoLT5iX2Fzc29jX2J1ZmZlcnMpOworCX0KK30KKworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorc3RhdGljIHZvaWQgYnVmZmVyX2V4aXRfY3B1KGludCBjcHUpCit7CisJaW50IGk7CisJc3RydWN0IGJoX2xydSAqYiA9ICZwZXJfY3B1KGJoX2xydXMsIGNwdSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQkhfTFJVX1NJWkU7IGkrKykgeworCQlicmVsc2UoYi0+YmhzW2ldKTsKKwkJYi0+YmhzW2ldID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYnVmZmVyX2NwdV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCit7CisJaWYgKGFjdGlvbiA9PSBDUFVfREVBRCkKKwkJYnVmZmVyX2V4aXRfY3B1KCh1bnNpZ25lZCBsb25nKWhjcHUpOworCXJldHVybiBOT1RJRllfT0s7Cit9CisjZW5kaWYgLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCisKK3ZvaWQgX19pbml0IGJ1ZmZlcl9pbml0KHZvaWQpCit7CisJaW50IG5ycGFnZXM7CisKKwliaF9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiYnVmZmVyX2hlYWQiLAorCQkJc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCksIDAsCisJCQlTTEFCX1BBTklDLCBpbml0X2J1ZmZlcl9oZWFkLCBOVUxMKTsKKworCS8qCisJICogTGltaXQgdGhlIGJoIG9jY3VwYW5jeSB0byAxMCUgb2YgWk9ORV9OT1JNQUwKKwkgKi8KKwlucnBhZ2VzID0gKG5yX2ZyZWVfYnVmZmVyX3BhZ2VzKCkgKiAxMCkgLyAxMDA7CisJbWF4X2J1ZmZlcl9oZWFkcyA9IG5ycGFnZXMgKiAoUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCkpOworCWhvdGNwdV9ub3RpZmllcihidWZmZXJfY3B1X25vdGlmeSwgMCk7Cit9CisKK0VYUE9SVF9TWU1CT0woX19iZm9yZ2V0KTsKK0VYUE9SVF9TWU1CT0woX19icmVsc2UpOworRVhQT1JUX1NZTUJPTChfX3dhaXRfb25fYnVmZmVyKTsKK0VYUE9SVF9TWU1CT0woYmxvY2tfY29tbWl0X3dyaXRlKTsKK0VYUE9SVF9TWU1CT0woYmxvY2tfcHJlcGFyZV93cml0ZSk7CitFWFBPUlRfU1lNQk9MKGJsb2NrX3JlYWRfZnVsbF9wYWdlKTsKK0VYUE9SVF9TWU1CT0woYmxvY2tfc3luY19wYWdlKTsKK0VYUE9SVF9TWU1CT0woYmxvY2tfdHJ1bmNhdGVfcGFnZSk7CitFWFBPUlRfU1lNQk9MKGJsb2NrX3dyaXRlX2Z1bGxfcGFnZSk7CitFWFBPUlRfU1lNQk9MKGNvbnRfcHJlcGFyZV93cml0ZSk7CitFWFBPUlRfU1lNQk9MKGVuZF9idWZmZXJfYXN5bmNfd3JpdGUpOworRVhQT1JUX1NZTUJPTChlbmRfYnVmZmVyX3JlYWRfc3luYyk7CitFWFBPUlRfU1lNQk9MKGVuZF9idWZmZXJfd3JpdGVfc3luYyk7CitFWFBPUlRfU1lNQk9MKGZpbGVfZnN5bmMpOworRVhQT1JUX1NZTUJPTChmc3luY19iZGV2KTsKK0VYUE9SVF9TWU1CT0woZ2VuZXJpY19ibG9ja19ibWFwKTsKK0VYUE9SVF9TWU1CT0woZ2VuZXJpY19jb21taXRfd3JpdGUpOworRVhQT1JUX1NZTUJPTChnZW5lcmljX2NvbnRfZXhwYW5kKTsKK0VYUE9SVF9TWU1CT0woaW5pdF9idWZmZXIpOworRVhQT1JUX1NZTUJPTChpbnZhbGlkYXRlX2JkZXYpOworRVhQT1JUX1NZTUJPTChsbF9yd19ibG9jayk7CitFWFBPUlRfU1lNQk9MKG1hcmtfYnVmZmVyX2RpcnR5KTsKK0VYUE9SVF9TWU1CT0woc3VibWl0X2JoKTsKK0VYUE9SVF9TWU1CT0woc3luY19kaXJ0eV9idWZmZXIpOworRVhQT1JUX1NZTUJPTCh1bmxvY2tfYnVmZmVyKTsKZGlmZiAtLWdpdCBhL2ZzL2NoYXJfZGV2LmMgYi9mcy9jaGFyX2Rldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNTdhOTEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jaGFyX2Rldi5jCkBAIC0wLDAgKzEsNDQ5IEBACisvKgorICogIGxpbnV4L2ZzL2NoYXJfZGV2LmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZmc19mc19rZXJuZWwuaD4KKworI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KKyNpbmNsdWRlIDxsaW51eC9rb2JqX21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKworI2lmZGVmIENPTkZJR19LTU9ECisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qga29ial9tYXAgKmNkZXZfbWFwOworCisvKiBkZWdyYWRlIHRvIGxpbmtlZCBsaXN0IGZvciBzbWFsbCBzeXN0ZW1zICovCisjZGVmaW5lIE1BWF9QUk9CRV9IQVNIIChDT05GSUdfQkFTRV9TTUFMTCA/IDEgOiAyNTUpCisKK3N0YXRpYyBERUNMQVJFX01VVEVYKGNocmRldnNfbG9jayk7CisKK3N0YXRpYyBzdHJ1Y3QgY2hhcl9kZXZpY2Vfc3RydWN0IHsKKwlzdHJ1Y3QgY2hhcl9kZXZpY2Vfc3RydWN0ICpuZXh0OworCXVuc2lnbmVkIGludCBtYWpvcjsKKwl1bnNpZ25lZCBpbnQgYmFzZW1pbm9yOworCWludCBtaW5vcmN0OworCWNvbnN0IGNoYXIgKm5hbWU7CisJc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wczsKKwlzdHJ1Y3QgY2RldiAqY2RldjsJCS8qIHdpbGwgZGllICovCit9ICpjaHJkZXZzW01BWF9QUk9CRV9IQVNIXTsKKworLyogaW5kZXggaW4gdGhlIGFib3ZlICovCitzdGF0aWMgaW5saW5lIGludCBtYWpvcl90b19pbmRleChpbnQgbWFqb3IpCit7CisJcmV0dXJuIG1ham9yICUgTUFYX1BST0JFX0hBU0g7Cit9CisKKy8qIGdldCBjaGFyIGRldmljZSBuYW1lcyBpbiBzb21ld2hhdCByYW5kb20gb3JkZXIgKi8KK2ludCBnZXRfY2hyZGV2X2xpc3QoY2hhciAqcGFnZSkKK3sKKwlzdHJ1Y3QgY2hhcl9kZXZpY2Vfc3RydWN0ICpjZDsKKwlpbnQgaSwgbGVuOworCisJbGVuID0gc3ByaW50ZihwYWdlLCAiQ2hhcmFjdGVyIGRldmljZXM6XG4iKTsKKworCWRvd24oJmNocmRldnNfbG9jayk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY2hyZGV2cykgOyBpKyspIHsKKwkJZm9yIChjZCA9IGNocmRldnNbaV07IGNkOyBjZCA9IGNkLT5uZXh0KQorCQkJbGVuICs9IHNwcmludGYocGFnZStsZW4sICIlM2QgJXNcbiIsCisJCQkJICAgICAgIGNkLT5tYWpvciwgY2QtPm5hbWUpOworCX0KKwl1cCgmY2hyZGV2c19sb2NrKTsKKworCXJldHVybiBsZW47Cit9CisKKy8qCisgKiBSZWdpc3RlciBhIHNpbmdsZSBtYWpvciB3aXRoIGEgc3BlY2lmaWVkIG1pbm9yIHJhbmdlLgorICoKKyAqIElmIG1ham9yID09IDAgdGhpcyBmdW5jdGlvbnMgd2lsbCBkeW5hbWljYWxseSBhbGxvY2F0ZSBhIG1ham9yIGFuZCByZXR1cm4KKyAqIGl0cyBudW1iZXIuCisgKgorICogSWYgbWFqb3IgPiAwIHRoaXMgZnVuY3Rpb24gd2lsbCBhdHRlbXB0IHRvIHJlc2VydmUgdGhlIHBhc3NlZCByYW5nZSBvZgorICogbWlub3JzIGFuZCB3aWxsIHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MuCisgKgorICogUmV0dXJucyBhIC12ZSBlcnJubyBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgc3RydWN0IGNoYXJfZGV2aWNlX3N0cnVjdCAqCitfX3JlZ2lzdGVyX2NocmRldl9yZWdpb24odW5zaWduZWQgaW50IG1ham9yLCB1bnNpZ25lZCBpbnQgYmFzZW1pbm9yLAorCQkJICAgaW50IG1pbm9yY3QsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGNoYXJfZGV2aWNlX3N0cnVjdCAqY2QsICoqY3A7CisJaW50IHJldCA9IDA7CisJaW50IGk7CisKKwljZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjaGFyX2RldmljZV9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2QgPT0gTlVMTCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwltZW1zZXQoY2QsIDAsIHNpemVvZihzdHJ1Y3QgY2hhcl9kZXZpY2Vfc3RydWN0KSk7CisKKwlkb3duKCZjaHJkZXZzX2xvY2spOworCisJLyogdGVtcG9yYXJ5ICovCisJaWYgKG1ham9yID09IDApIHsKKwkJZm9yIChpID0gQVJSQVlfU0laRShjaHJkZXZzKS0xOyBpID4gMDsgaS0tKSB7CisJCQlpZiAoY2hyZGV2c1tpXSA9PSBOVUxMKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGkgPT0gMCkgeworCQkJcmV0ID0gLUVCVVNZOworCQkJZ290byBvdXQ7CisJCX0KKwkJbWFqb3IgPSBpOworCQlyZXQgPSBtYWpvcjsKKwl9CisKKwljZC0+bWFqb3IgPSBtYWpvcjsKKwljZC0+YmFzZW1pbm9yID0gYmFzZW1pbm9yOworCWNkLT5taW5vcmN0ID0gbWlub3JjdDsKKwljZC0+bmFtZSA9IG5hbWU7CisKKwlpID0gbWFqb3JfdG9faW5kZXgobWFqb3IpOworCisJZm9yIChjcCA9ICZjaHJkZXZzW2ldOyAqY3A7IGNwID0gJigqY3ApLT5uZXh0KQorCQlpZiAoKCpjcCktPm1ham9yID4gbWFqb3IgfHwKKwkJICAgICgoKmNwKS0+bWFqb3IgPT0gbWFqb3IgJiYgKCpjcCktPmJhc2VtaW5vciA+PSBiYXNlbWlub3IpKQorCQkJYnJlYWs7CisJaWYgKCpjcCAmJiAoKmNwKS0+bWFqb3IgPT0gbWFqb3IgJiYKKwkgICAgKCpjcCktPmJhc2VtaW5vciA8IGJhc2VtaW5vciArIG1pbm9yY3QpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisJY2QtPm5leHQgPSAqY3A7CisJKmNwID0gY2Q7CisJdXAoJmNocmRldnNfbG9jayk7CisJcmV0dXJuIGNkOworb3V0OgorCXVwKCZjaHJkZXZzX2xvY2spOworCWtmcmVlKGNkKTsKKwlyZXR1cm4gRVJSX1BUUihyZXQpOworfQorCitzdGF0aWMgc3RydWN0IGNoYXJfZGV2aWNlX3N0cnVjdCAqCitfX3VucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbih1bnNpZ25lZCBtYWpvciwgdW5zaWduZWQgYmFzZW1pbm9yLCBpbnQgbWlub3JjdCkKK3sKKwlzdHJ1Y3QgY2hhcl9kZXZpY2Vfc3RydWN0ICpjZCA9IE5VTEwsICoqY3A7CisJaW50IGkgPSBtYWpvcl90b19pbmRleChtYWpvcik7CisKKwl1cCgmY2hyZGV2c19sb2NrKTsKKwlmb3IgKGNwID0gJmNocmRldnNbaV07ICpjcDsgY3AgPSAmKCpjcCktPm5leHQpCisJCWlmICgoKmNwKS0+bWFqb3IgPT0gbWFqb3IgJiYKKwkJICAgICgqY3ApLT5iYXNlbWlub3IgPT0gYmFzZW1pbm9yICYmCisJCSAgICAoKmNwKS0+bWlub3JjdCA9PSBtaW5vcmN0KQorCQkJYnJlYWs7CisJaWYgKCpjcCkgeworCQljZCA9ICpjcDsKKwkJKmNwID0gY2QtPm5leHQ7CisJfQorCXVwKCZjaHJkZXZzX2xvY2spOworCXJldHVybiBjZDsKK30KKworaW50IHJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2X3QgZnJvbSwgdW5zaWduZWQgY291bnQsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGNoYXJfZGV2aWNlX3N0cnVjdCAqY2Q7CisJZGV2X3QgdG8gPSBmcm9tICsgY291bnQ7CisJZGV2X3QgbiwgbmV4dDsKKworCWZvciAobiA9IGZyb207IG4gPCB0bzsgbiA9IG5leHQpIHsKKwkJbmV4dCA9IE1LREVWKE1BSk9SKG4pKzEsIDApOworCQlpZiAobmV4dCA+IHRvKQorCQkJbmV4dCA9IHRvOworCQljZCA9IF9fcmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNQUpPUihuKSwgTUlOT1IobiksCisJCQkgICAgICAgbmV4dCAtIG4sIG5hbWUpOworCQlpZiAoSVNfRVJSKGNkKSkKKwkJCWdvdG8gZmFpbDsKKwl9CisJcmV0dXJuIDA7CitmYWlsOgorCXRvID0gbjsKKwlmb3IgKG4gPSBmcm9tOyBuIDwgdG87IG4gPSBuZXh0KSB7CisJCW5leHQgPSBNS0RFVihNQUpPUihuKSsxLCAwKTsKKwkJa2ZyZWUoX191bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oTUFKT1IobiksIE1JTk9SKG4pLCBuZXh0IC0gbikpOworCX0KKwlyZXR1cm4gUFRSX0VSUihjZCk7Cit9CisKK2ludCBhbGxvY19jaHJkZXZfcmVnaW9uKGRldl90ICpkZXYsIHVuc2lnbmVkIGJhc2VtaW5vciwgdW5zaWduZWQgY291bnQsCisJCQljb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBjaGFyX2RldmljZV9zdHJ1Y3QgKmNkOworCWNkID0gX19yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKDAsIGJhc2VtaW5vciwgY291bnQsIG5hbWUpOworCWlmIChJU19FUlIoY2QpKQorCQlyZXR1cm4gUFRSX0VSUihjZCk7CisJKmRldiA9IE1LREVWKGNkLT5tYWpvciwgY2QtPmJhc2VtaW5vcik7CisJcmV0dXJuIDA7Cit9CisKK2ludCByZWdpc3Rlcl9jaHJkZXYodW5zaWduZWQgaW50IG1ham9yLCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wcykKK3sKKwlzdHJ1Y3QgY2hhcl9kZXZpY2Vfc3RydWN0ICpjZDsKKwlzdHJ1Y3QgY2RldiAqY2RldjsKKwljaGFyICpzOworCWludCBlcnIgPSAtRU5PTUVNOworCisJY2QgPSBfX3JlZ2lzdGVyX2NocmRldl9yZWdpb24obWFqb3IsIDAsIDI1NiwgbmFtZSk7CisJaWYgKElTX0VSUihjZCkpCisJCXJldHVybiBQVFJfRVJSKGNkKTsKKwkKKwljZGV2ID0gY2Rldl9hbGxvYygpOworCWlmICghY2RldikKKwkJZ290byBvdXQyOworCisJY2Rldi0+b3duZXIgPSBmb3BzLT5vd25lcjsKKwljZGV2LT5vcHMgPSBmb3BzOworCWtvYmplY3Rfc2V0X25hbWUoJmNkZXYtPmtvYmosICIlcyIsIG5hbWUpOworCWZvciAocyA9IHN0cmNocihrb2JqZWN0X25hbWUoJmNkZXYtPmtvYmopLCcvJyk7IHM7IHMgPSBzdHJjaHIocywgJy8nKSkKKwkJKnMgPSAnISc7CisJCQorCWVyciA9IGNkZXZfYWRkKGNkZXYsIE1LREVWKGNkLT5tYWpvciwgMCksIDI1Nik7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwljZC0+Y2RldiA9IGNkZXY7CisKKwlyZXR1cm4gbWFqb3IgPyAwIDogY2QtPm1ham9yOworb3V0OgorCWtvYmplY3RfcHV0KCZjZGV2LT5rb2JqKTsKK291dDI6CisJa2ZyZWUoX191bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oY2QtPm1ham9yLCAwLCAyNTYpKTsKKwlyZXR1cm4gZXJyOworfQorCit2b2lkIHVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihkZXZfdCBmcm9tLCB1bnNpZ25lZCBjb3VudCkKK3sKKwlkZXZfdCB0byA9IGZyb20gKyBjb3VudDsKKwlkZXZfdCBuLCBuZXh0OworCisJZm9yIChuID0gZnJvbTsgbiA8IHRvOyBuID0gbmV4dCkgeworCQluZXh0ID0gTUtERVYoTUFKT1IobikrMSwgMCk7CisJCWlmIChuZXh0ID4gdG8pCisJCQluZXh0ID0gdG87CisJCWtmcmVlKF9fdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1BSk9SKG4pLCBNSU5PUihuKSwgbmV4dCAtIG4pKTsKKwl9Cit9CisKK2ludCB1bnJlZ2lzdGVyX2NocmRldih1bnNpZ25lZCBpbnQgbWFqb3IsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGNoYXJfZGV2aWNlX3N0cnVjdCAqY2Q7CisJY2QgPSBfX3VucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihtYWpvciwgMCwgMjU2KTsKKwlpZiAoY2QgJiYgY2QtPmNkZXYpCisJCWNkZXZfZGVsKGNkLT5jZGV2KTsKKwlrZnJlZShjZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soY2Rldl9sb2NrKTsKKworc3RhdGljIHN0cnVjdCBrb2JqZWN0ICpjZGV2X2dldChzdHJ1Y3QgY2RldiAqcCkKK3sKKwlzdHJ1Y3QgbW9kdWxlICpvd25lciA9IHAtPm93bmVyOworCXN0cnVjdCBrb2JqZWN0ICprb2JqOworCisJaWYgKG93bmVyICYmICF0cnlfbW9kdWxlX2dldChvd25lcikpCisJCXJldHVybiBOVUxMOworCWtvYmogPSBrb2JqZWN0X2dldCgmcC0+a29iaik7CisJaWYgKCFrb2JqKQorCQltb2R1bGVfcHV0KG93bmVyKTsKKwlyZXR1cm4ga29iajsKK30KKwordm9pZCBjZGV2X3B1dChzdHJ1Y3QgY2RldiAqcCkKK3sKKwlpZiAocCkgeworCQlrb2JqZWN0X3B1dCgmcC0+a29iaik7CisJCW1vZHVsZV9wdXQocC0+b3duZXIpOworCX0KK30KKworLyoKKyAqIENhbGxlZCBldmVyeSB0aW1lIGEgY2hhcmFjdGVyIHNwZWNpYWwgZmlsZSBpcyBvcGVuZWQKKyAqLworaW50IGNocmRldl9vcGVuKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJc3RydWN0IGNkZXYgKnA7CisJc3RydWN0IGNkZXYgKm5ldyA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2soJmNkZXZfbG9jayk7CisJcCA9IGlub2RlLT5pX2NkZXY7CisJaWYgKCFwKSB7CisJCXN0cnVjdCBrb2JqZWN0ICprb2JqOworCQlpbnQgaWR4OworCQlzcGluX3VubG9jaygmY2Rldl9sb2NrKTsKKwkJa29iaiA9IGtvYmpfbG9va3VwKGNkZXZfbWFwLCBpbm9kZS0+aV9yZGV2LCAmaWR4KTsKKwkJaWYgKCFrb2JqKQorCQkJcmV0dXJuIC1FTlhJTzsKKwkJbmV3ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBjZGV2LCBrb2JqKTsKKwkJc3Bpbl9sb2NrKCZjZGV2X2xvY2spOworCQlwID0gaW5vZGUtPmlfY2RldjsKKwkJaWYgKCFwKSB7CisJCQlpbm9kZS0+aV9jZGV2ID0gcCA9IG5ldzsKKwkJCWlub2RlLT5pX2NpbmRleCA9IGlkeDsKKwkJCWxpc3RfYWRkKCZpbm9kZS0+aV9kZXZpY2VzLCAmcC0+bGlzdCk7CisJCQluZXcgPSBOVUxMOworCQl9IGVsc2UgaWYgKCFjZGV2X2dldChwKSkKKwkJCXJldCA9IC1FTlhJTzsKKwl9IGVsc2UgaWYgKCFjZGV2X2dldChwKSkKKwkJcmV0ID0gLUVOWElPOworCXNwaW5fdW5sb2NrKCZjZGV2X2xvY2spOworCWNkZXZfcHV0KG5ldyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlmaWxwLT5mX29wID0gZm9wc19nZXQocC0+b3BzKTsKKwlpZiAoIWZpbHAtPmZfb3ApIHsKKwkJY2Rldl9wdXQocCk7CisJCXJldHVybiAtRU5YSU87CisJfQorCWlmIChmaWxwLT5mX29wLT5vcGVuKSB7CisJCWxvY2tfa2VybmVsKCk7CisJCXJldCA9IGZpbHAtPmZfb3AtPm9wZW4oaW5vZGUsZmlscCk7CisJCXVubG9ja19rZXJuZWwoKTsKKwl9CisJaWYgKHJldCkKKwkJY2Rldl9wdXQocCk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBjZF9mb3JnZXQoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzcGluX2xvY2soJmNkZXZfbG9jayk7CisJbGlzdF9kZWxfaW5pdCgmaW5vZGUtPmlfZGV2aWNlcyk7CisJaW5vZGUtPmlfY2RldiA9IE5VTEw7CisJc3Bpbl91bmxvY2soJmNkZXZfbG9jayk7Cit9CisKK3ZvaWQgY2Rldl9wdXJnZShzdHJ1Y3QgY2RldiAqY2RldikKK3sKKwlzcGluX2xvY2soJmNkZXZfbG9jayk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZjZGV2LT5saXN0KSkgeworCQlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCQlpbm9kZSA9IGNvbnRhaW5lcl9vZihjZGV2LT5saXN0Lm5leHQsIHN0cnVjdCBpbm9kZSwgaV9kZXZpY2VzKTsKKwkJbGlzdF9kZWxfaW5pdCgmaW5vZGUtPmlfZGV2aWNlcyk7CisJCWlub2RlLT5pX2NkZXYgPSBOVUxMOworCX0KKwlzcGluX3VubG9jaygmY2Rldl9sb2NrKTsKK30KKworLyoKKyAqIER1bW15IGRlZmF1bHQgZmlsZS1vcGVyYXRpb25zOiB0aGUgb25seSB0aGluZyB0aGlzIGRvZXMKKyAqIGlzIGNvbnRhaW4gdGhlIG9wZW4gdGhhdCB0aGVuIGZpbGxzIGluIHRoZSBjb3JyZWN0IG9wZXJhdGlvbnMKKyAqIGRlcGVuZGluZyBvbiB0aGUgc3BlY2lhbCBmaWxlLi4uCisgKi8KK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGVmX2Nocl9mb3BzID0geworCS5vcGVuID0gY2hyZGV2X29wZW4sCit9OworCitzdGF0aWMgc3RydWN0IGtvYmplY3QgKmV4YWN0X21hdGNoKGRldl90IGRldiwgaW50ICpwYXJ0LCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBjZGV2ICpwID0gZGF0YTsKKwlyZXR1cm4gJnAtPmtvYmo7Cit9CisKK3N0YXRpYyBpbnQgZXhhY3RfbG9jayhkZXZfdCBkZXYsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGNkZXYgKnAgPSBkYXRhOworCXJldHVybiBjZGV2X2dldChwKSA/IDAgOiAtMTsKK30KKworaW50IGNkZXZfYWRkKHN0cnVjdCBjZGV2ICpwLCBkZXZfdCBkZXYsIHVuc2lnbmVkIGNvdW50KQoreworCXAtPmRldiA9IGRldjsKKwlwLT5jb3VudCA9IGNvdW50OworCXJldHVybiBrb2JqX21hcChjZGV2X21hcCwgZGV2LCBjb3VudCwgTlVMTCwgZXhhY3RfbWF0Y2gsIGV4YWN0X2xvY2ssIHApOworfQorCitzdGF0aWMgdm9pZCBjZGV2X3VubWFwKGRldl90IGRldiwgdW5zaWduZWQgY291bnQpCit7CisJa29ial91bm1hcChjZGV2X21hcCwgZGV2LCBjb3VudCk7Cit9CisKK3ZvaWQgY2Rldl9kZWwoc3RydWN0IGNkZXYgKnApCit7CisJY2Rldl91bm1hcChwLT5kZXYsIHAtPmNvdW50KTsKKwlrb2JqZWN0X3B1dCgmcC0+a29iaik7Cit9CisKKworc3RhdGljIHZvaWQgY2Rldl9kZWZhdWx0X3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmtvYmopCit7CisJc3RydWN0IGNkZXYgKnAgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGNkZXYsIGtvYmopOworCWNkZXZfcHVyZ2UocCk7Cit9CisKK3N0YXRpYyB2b2lkIGNkZXZfZHluYW1pY19yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprb2JqKQoreworCXN0cnVjdCBjZGV2ICpwID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBjZGV2LCBrb2JqKTsKKwljZGV2X3B1cmdlKHApOworCWtmcmVlKHApOworfQorCitzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBrdHlwZV9jZGV2X2RlZmF1bHQgPSB7CisJLnJlbGVhc2UJPSBjZGV2X2RlZmF1bHRfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qga29ial90eXBlIGt0eXBlX2NkZXZfZHluYW1pYyA9IHsKKwkucmVsZWFzZQk9IGNkZXZfZHluYW1pY19yZWxlYXNlLAorfTsKKworc3RydWN0IGNkZXYgKmNkZXZfYWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3QgY2RldiAqcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKHApIHsKKwkJbWVtc2V0KHAsIDAsIHNpemVvZihzdHJ1Y3QgY2RldikpOworCQlwLT5rb2JqLmt0eXBlID0gJmt0eXBlX2NkZXZfZHluYW1pYzsKKwkJSU5JVF9MSVNUX0hFQUQoJnAtPmxpc3QpOworCQlrb2JqZWN0X2luaXQoJnAtPmtvYmopOworCX0KKwlyZXR1cm4gcDsKK30KKwordm9pZCBjZGV2X2luaXQoc3RydWN0IGNkZXYgKmNkZXYsIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHMpCit7CisJbWVtc2V0KGNkZXYsIDAsIHNpemVvZiAqY2Rldik7CisJSU5JVF9MSVNUX0hFQUQoJmNkZXYtPmxpc3QpOworCWNkZXYtPmtvYmoua3R5cGUgPSAma3R5cGVfY2Rldl9kZWZhdWx0OworCWtvYmplY3RfaW5pdCgmY2Rldi0+a29iaik7CisJY2Rldi0+b3BzID0gZm9wczsKK30KKworc3RhdGljIHN0cnVjdCBrb2JqZWN0ICpiYXNlX3Byb2JlKGRldl90IGRldiwgaW50ICpwYXJ0LCB2b2lkICpkYXRhKQoreworCWlmIChyZXF1ZXN0X21vZHVsZSgiY2hhci1tYWpvci0lZC0lZCIsIE1BSk9SKGRldiksIE1JTk9SKGRldikpID4gMCkKKwkJLyogTWFrZSBvbGQtc3R5bGUgMi40IGFsaWFzZXMgd29yayAqLworCQlyZXF1ZXN0X21vZHVsZSgiY2hhci1tYWpvci0lZCIsIE1BSk9SKGRldikpOworCXJldHVybiBOVUxMOworfQorCit2b2lkIF9faW5pdCBjaHJkZXZfaW5pdCh2b2lkKQoreworCWNkZXZfbWFwID0ga29ial9tYXBfaW5pdChiYXNlX3Byb2JlLCAmY2hyZGV2c19sb2NrKTsKK30KKworCisvKiBMZXQgbW9kdWxlcyBkbyBjaGFyIGRldiBzdHVmZiAqLworRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKTsKK0VYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKTsKK0VYUE9SVF9TWU1CT0woYWxsb2NfY2hyZGV2X3JlZ2lvbik7CitFWFBPUlRfU1lNQk9MKGNkZXZfaW5pdCk7CitFWFBPUlRfU1lNQk9MKGNkZXZfYWxsb2MpOworRVhQT1JUX1NZTUJPTChjZGV2X2RlbCk7CitFWFBPUlRfU1lNQk9MKGNkZXZfYWRkKTsKK0VYUE9SVF9TWU1CT0wocmVnaXN0ZXJfY2hyZGV2KTsKK0VYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl9jaHJkZXYpOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9BVVRIT1JTIGIvZnMvY2lmcy9BVVRIT1JTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjY2UzNmUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jaWZzL0FVVEhPUlMKQEAgLTAsMCArMSw0MiBAQAorT3JpZ2luYWwgQXV0aG9yCis9PT09PT09PT09PT09PT0KK1N0ZXZlIEZyZW5jaCAoc2ZyZW5jaEBzYW1iYS5vcmcpCisKK1RoZSBhdXRob3Igd2lzaGVzIHRvIGV4cHJlc3MgaGlzIGFwcHJlY2lhdGlvbiBhbmQgdGhhbmtzIHRvOgorQW5kcmV3IFRyaWRnZWxsIChTYW1iYSB0ZWFtKSBmb3IgaGlzIGVhcmx5IHN1Z2dlc3Rpb25zIGFib3V0IHNtYi9jaWZzIFZGUworaW1wcm92ZW1lbnRzLiBUaGFua3MgdG8gSUJNIGZvciBhbGxvd2luZyBtZSB0aGUgdGltZSBhbmQgdGVzdCByZXNvdXJjZXMgdG8gcHVyc3VlCit0aGlzIHByb2plY3QuIEppbSBNY0Rvbm91Z2ggZnJvbSBJQk0gKGFuZCB0aGUgU2FtYmEgVGVhbSkgZm9yIGhpcyBoZWxwLgorVGhlIElCTSBMaW51eCBKRlMgdGVhbSBmb3IgZXhwbGFpbmluZyBtYW55IGVzb3RlcmljIExpbnV4IGZpbGVzeXN0ZW0gZmVhdHVyZXMuCitEYXZlIEJvdXRjaGVyIG9mIElCTSBSb2NoZXN0ZXIgKGF1dGhvciBvZiB0aGUgT1MvNDAwIHNtYi9jaWZzIGZpbGVzeXN0ZW0gY2xpZW50KQorZm9yIHByb3ZpbmcgeWVhcnMgYWdvIHRoYXQgYSB2ZXJ5IGdvb2Qgc21iL2NpZnMgY2xpZW50IGNvdWxkIGJlIGRvbmUgb24gYSBVbml4IGxpa2UgCitvcGVyYXRpbmcgc3lzdGVtLiAgVm9sa2VyIExlbmRlY2tlLCBBbmRyZXcgVHJpZGdlbGwsIFVyYmFuIFdpZG1hcmssIEpvaG4gTmV3YmlnaW4gCithbmQgb3RoZXJzIGZvciB0aGVpciB3b3JrIG9uIHRoZSBMaW51eCBzbWJmcyBtb2R1bGUgb3ZlciB0aGUgeWVhcnMuIFRoYW5rcyB0bwordGhlIG90aGVyIG1lbWJlcnMgb2YgdGhlIFN0b3JhZ2UgTmV0d29yayBJbmR1c3RyeSBBc3NvY2lhdGlvbiBDSUZTIFRlY2huaWNhbAorV29ya2dyb3VwIGZvciB0aGVpciB3b3JrIHNwZWNpZnlpbmcgdGhpcyBoaWdobHkgY29tcGxleCBwcm90b2NvbCBhbmQgZmluYWxseQordGhhbmtzIHRvIHRoZSBTYW1iYSB0ZWFtIGZvciB0aGVpciB0ZWNobmljYWwgYWR2aWNlIGFuZCBlbmNvdXJhZ2VtZW50LgorCitQYXRjaCBDb250cmlidXRvcnMKKy0tLS0tLS0tLS0tLS0tLS0tLQorWndhbmUgTXdhaWthbWJvCitBbmRpIEtsZWVuCitBbXJ1dCBKb3NoaQorU2hvYmhpdCBEYXlhbAorU2VyZ2V5IFZsYXNvdgorUmljaGFyZCBIdWdoZXMKK1l1cnkgVW1hbmV0cworTWFyayBIYW16eQorRG9tZW4gUHVuY2VyCitKZXNwZXIgSnVobAorCitUZXN0IGNhc2UgYW5kIEJ1ZyBSZXBvcnQgY29udHJpYnV0b3JzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGFua3MgdG8gdGhvc2UgaW4gdGhlIGNvbW11bml0eSB3aG8gaGF2ZSBzdWJtaXR0ZWQgZGV0YWlsZWQgYnVnIHJlcG9ydHMKK2FuZCBkZWJ1ZyBvZiBwcm9ibGVtcyB0aGV5IGhhdmUgZm91bmQ6ICBKb2NoZW4gRG9semUsIERhdmlkIEJsYWluZSwKK1JlbmUgU2NoYXJmZSwgTWFydGluIEpvc2Vmc3NvbiwgQWxleGFuZGVyIFdpbGQsIEFudGhvbnkgTGlndW9yaSwKK0xhcnMgTXVsbGVyLCBVcmJhbiBXaWRtYXJrLCBNYXNzaW1pbGlhbm8gRmVycmVybywgSG93YXJkIE93ZW4sCitPbGFmIEtpcmNoLCBLaWVyb24gQnJpZ2dzLCBOaWNrIE1pbGxpbmd0b24gYW5kIG90aGVycy4gQWxzbyBzcGVjaWFsCittZW50aW9uIHRvIHRoZSBTdGFuZm9yZCBDaGVja2VyIChTV0FUKSB3aGljaCBwb2ludGVkIG91dCBtYW55IG1pbm9yCitidWdzIGluIGVycm9yIHBhdGhzLgorCitBbmQgdGhhbmtzIHRvIHRoZSBJQk0gTFRDIGFuZCBQb3dlciB0ZXN0IHRlYW1zIGFuZCBTdVNFIHRlc3RlcnMgZm9yCitmaW5kaW5nIG11bHRpcGxlIGJ1Z3MgZHVyaW5nIGV4Y2VsbGVudCBzdHJlc3MgdGVzdCBydW5zLgpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9DSEFOR0VTIGIvZnMvY2lmcy9DSEFOR0VTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMTZjOGQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jaWZzL0NIQU5HRVMKQEAgLTAsMCArMSw2NzEgQEAKK1ZlcnNpb24gMS4zMQorLS0tLS0tLS0tLS0tCitGaXggb29wcyBpbiBscyB3aGVuIFRyYW5zYWN0MiBGaW5kRmlyc3QgKG9yIEZpbmROZXh0KSByZXR1cm5zIG1vcmUgdGhhbiBvbmUKK3RyYW5zYWN0IHJlc3BvbnNlIGZvciBhbiBTTUIgcmVxdWVzdCBhbmQgc2VhcmNoIGVudHJ5IHNwbGl0IGFjcm9zcyB0d28gZnJhbWVzLgorRml4IHVwZGF0ZXMgb2YgRE9TIGF0dHJpYnV0ZXMgYW5kIHRpbWUgZmllbGRzIHNvIHRoYXQgZmlsZXMgb24gTlQ0IHNlcnZlcnMKK2RvIG5vdCBnZXQgbWFya2VkIGRlbGV0ZSBvbiBjbG9zZS4gRGlzcGxheSBzaXplcyBvZiBjaWZzIGJ1ZmZlciBwb29scyBpbgorY2lmcyBzdGF0cy4gRml4IG9vcHMgaW4gdW5tb3VudCB3aGVuIGNpZnNkIHRocmVhZCBiZWluZyBraWxsZWQgYnkgCitzaHV0ZG93bi4gQWRkIGdlbmVyaWMgcmVhZHYvd3JpdGV2IGFuZCBhaW8gc3VwcG9ydC4gUmVwb3J0IGlub2RlIG51bWJlcnMgCitjb25zaXN0ZW50bHkgaW4gcmVhZGRpciBhbmQgbG9va3VwICh3aGVuIHNlcnZlcmlubyBtb3VudCBvcHRpb24gaXMKK3NwZWNpZmllZCB1c2UgdGhlIGlub2RlIG51bWJlciB0aGF0IHRoZSBzZXJ2ZXIgcmVwb3J0cyAtIGZvciBib3RoIGxvb2t1cAorYW5kIHJlYWRkaXIsIG90aGVyd2lzZSBieSBkZWZhdWx0IHRoZSBsb2NhbGx5IGdlbmVyYXRlZCBpbm9kZSBudW1iZXIgaXMgdXNlZAorZm9yIGlub2RlcyBjcmVhdGVkIGluIGVpdGhlciBwYXRoIHNpbmNlIHNlcnZlcnMgYXJlIG5vdCBhbHdheXMgYWJsZSB0byAKK3Byb3ZpZGUgdW5pcXVlIGlub2RlIG51bWJlcnMgd2hlbiBleHBvcnRpbmcgbXVsdGlwbGUgdm9sdW1lcyBmcm9tIHVuZGVyIG9uZQorc2hhcmVuYW1lKS4KKworVmVyc2lvbiAxLjMwCistLS0tLS0tLS0tLS0KK0FsbG93IG5ldyBub3VzZXJfeGF0dHIgbW91bnQgcGFybSB0byBkaXNhYmxlIHhhdHRyIHN1cHBvcnQgZm9yIHVzZXIgbmFtZXNwYWNlLgorRG8gbm90IGZsYWcgdXNlcl94YXR0ciBtb3VudCBwYXJtIGluIGRtZXNnLiAgUmV0cnkgZmFpbHVyZXMgc2V0dGluZyBmaWxlIHRpbWUgIAorKG1vc3RseSBhZmZlY3RzIE5UNCBzZXJ2ZXJzKSBieSByZXRyeSB3aXRoIGhhbmRsZSBiYXNlZCBuZXR3b3JrIG9wZXJhdGlvbi4gCitBZGQgbmV3IFBPU0lYIFF1ZXJ5IEZTIEluZm8gZm9yIHJldHVybmluZyBzdGF0ZnMgaW5mbyBtb3JlIGFjY3VyYXRlbHkuCitIYW5kbGUgcGFzc3dvcmRzIHdpdGggbXVsdGlwbGUgY29tbWFzIGluIHRoZW0uCisKK1ZlcnNpb24gMS4yOQorLS0tLS0tLS0tLS0tCitGaXggZGVmYXVsdCBtb2RlIGluIHN5c2ZzIG9mIGNpZnMgbW9kdWxlIHBhcm1zLiAgUmVtb3ZlIG9sZCByZWFkZGlyIHJvdXRpbmUuCitGaXggY2FwYWJpbGl0aWVzIGZsYWdzIGZvciBsYXJnZSByZWFkeCBzbyBhcyB0byBhbGxvdyByZWFkcyBsYXJnZXIgdGhhbiA2NEsuCisKK1ZlcnNpb24gMS4yOAorLS0tLS0tLS0tLS0tCitBZGQgbW9kdWxlIGluaXQgcGFybSBmb3IgbGFyZ2UgU01CIGJ1ZmZlciBzaXplICh0byBhbGxvdyBpdCB0byBiZSBjaGFuZ2VkCitmcm9tIGl0cyBkZWZhdWx0IG9mIDE2Sykgd2hpY2ggaXMgZXNwZWNpYWxseSB1c2VmdWwgZm9yIGxhcmdlIGZpbGUgY29weQord2hlbiBtb3VudGluZyB3aXRoIHRoZSBkaXJlY3RpbyBtb3VudCBvcHRpb24uIEZpeCBvb3BzIGFmdGVyIAorcmV0dXJuaW5nIGZyb20gbW91bnQgd2hlbiBleHBlcmltZW50YWwgRXh0ZW5kZWRTZWN1cml0eSBlbmFibGVkIGFuZAorU3BuZWdvTmVnb3RpYXRlZCByZXR1cm5pbmcgaW52YWxpZCBlcnJvci4gRml4IGNhc2UgdG8gcmV0cnkgYmV0dGVyIHdoZW4gCitwZWVrIHJldHVybnMgZnJvbSAxIHRvIDMgYnl0ZXMgb24gc29ja2V0IHdoaWNoIHNob3VsZCBoYXZlIG1vcmUgZGF0YS4KK0ZpeGVkIHBhdGggYmFzZWQgY2FsbHMgKHN1Y2ggYXMgY2lmcyBsb29rdXApIHRvIGhhbmRsZSBwYXRoIG5hbWVzCitsb25nZXIgdGhhbiA1MzAgKG5vdyBjYW4gaGFuZGxlIFBBVEhfTUFYKS4gRml4IHBhc3MgdGhyb3VnaCBhdXRoZW50aWNhdGlvbgorZnJvbSBTYW1iYSBzZXJ2ZXIgdG8gREMgKFNhbWJhIHJlcXVpcmVkIGR1bW15IExNIHBhc3N3b3JkKS4KKworVmVyc2lvbiAxLjI3CistLS0tLS0tLS0tLS0KK1R1cm4gb2ZmIEROT1RJRlkgKGRpcmVjdG9yeSBjaGFuZ2Ugbm90aWZpY2F0aW9uIHN1cHBvcnQpIGJ5IGRlZmF1bHQKKyh1bmxlc3MgYnVpbHQgd2l0aCB0aGUgZXhwZXJpbWVudGFsIGZsYWcpIHRvIGZpeCBoYW5nIHdpdGggS0RFCitmaWxlIGJyb3dzZXIuIEZpeCBETk9USUZZIGZsYWcgbWFwcGluZ3MuICBGaXggaGFuZyAoaW4gd2FpdF9ldmVudAord2FpdGluZyBvbiBhbiBTTUIgcmVzcG9uc2UpIGluIFNlbmRSZWNlaXZlIHdoZW4gc2Vzc2lvbiBkaWVzIGJ1dAorcmVjb25uZWN0cyBxdWlja2x5IGZyb20gYW5vdGhlciB0YXNrLiAgQWRkIG1vZHVsZSBpbml0ICBwYXJtcyBmb3IKK21pbmltdW0gbnVtYmVyIG9mIGxhcmdlIGFuZCBzbWFsbCBuZXR3b3JrIGJ1ZmZlcnMgaW4gdGhlIGJ1ZmZlciBwb29scywKK2FuZCBmb3IgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNpbXVsdGFuZW91cyByZXF1ZXN0cy4KKworVmVyc2lvbiAxLjI2CistLS0tLS0tLS0tLS0KK0FkZCBzZXRmYWNsIHN1cHBvcnQgdG8gYWxsb3cgc2V0dGluZyBvZiBBQ0xzIHJlbW90ZWx5IHRvIFNhbWJhIDMuMTAgYW5kIGxhdGVyCithbmQgb3RoZXIgUE9TSVggQ0lGUyBjb21wbGlhbnQgc2VydmVycy4gIEZpeCBlcnJvciBtYXBwaW5nIGZvciBnZXRmYWNsIAordG8gRU9QTk9UU1VQUCB3aGVuIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHBvc2l4IGFjbHMgb24gdGhlIHdpcmUuIEZpeCAKK2ltcHJvcGVybHkgemVyb2VkIGJ1ZmZlciBpbiBDSUZTIFVuaXggZXh0ZW5zaW9ucyBzZXQgdGltZXMgY2FsbC4gCisKK1ZlcnNpb24gMS4yNQorLS0tLS0tLS0tLS0tCitGaXggaW50ZXJuYXRpb25saXphdGlvbiBwcm9ibGVtIGluIGNpZnMgcmVhZGRpciB3aXRoIGZpbGVuYW1lcyB0aGF0IG1hcCB0byAKK2xvbmdlciBVVEY4IHN0cmluZ3MgdGhhbiB0aGUgc3RyaW5nIG9uIHRoZSB3aXJlIHdhcyBpbiBVbmljb2RlLiAgQWRkIHdvcmthcm91bmQKK2ZvciByZWFkZGlyIHRvIG5ldGFwcCBzZXJ2ZXJzLiBGaXggc2VhcmNoIHJld2luZCAoc2VlayBpbnRvIHJlYWRkaXIgdG8gcmV0dXJuIAorbm9uLWNvbnNlY3V0aXZlIGVudHJpZXMpLiAgRG8gbm90IGRvIHJlYWRkaXIgd2hlbiBzZXJ2ZXIgbmVnb3RpYXRlcyAKK2J1ZmZlciBzaXplIHRvIHNtYWxsIHRvIGZpdCBmaWxlbmFtZS4gQWRkIHN1cHBvcnQgZm9yIHJlYWRpbmcgUE9TSVggQUNMcyBmcm9tCit0aGUgc2VydmVyIChhZGQgYWxzbyBhY2wgYW5kIG5vYWNsIG1vdW50IG9wdGlvbnMpLgorCitWZXJzaW9uIDEuMjQKKy0tLS0tLS0tLS0tLQorT3B0aW9uYWxseSBhbGxvdyB1c2luZyBzZXJ2ZXIgc2lkZSBpbm9kZSBudW1iZXJzLCByYXRoZXIgdGhhbiBjbGllbnQgZ2VuZXJhdGVkCitvbmVzIGJ5IHNwZWNpZnlpbmcgbW91bnQgb3B0aW9uICJzZXJ2ZXJpbm8iIC0gdGhpcyBpcyByZXF1aXJlZCBmb3Igc29tZSBhcHBzCit0byB3b3JrIHdoaWNoIGRvdWJsZSBjaGVjayBoYXJkbGlua2VkIGZpbGVzIGFuZCBoYXZlIHBlcnNpc3RlbnQgaW5vZGUgbnVtYmVycy4KKworVmVyc2lvbiAxLjIzCistLS0tLS0tLS0tLS0KK011bHRpcGxlIGJpZ2VuZGlhbiBmaXhlcy4gT24gbGl0dGxlIGVuZGlhbiBzeXN0ZW1zIChmb3IgcmVjb25uZWN0IGFmdGVyCituZXR3b3JrIGZhaWx1cmUpIGZpeCB0Y3Agc2Vzc2lvbiByZWNvbm5lY3QgY29kZSBzbyB3ZSBkbyBub3QgdHJ5IGZpcnN0Cit0byByZWNvbm5lY3Qgb24gcmV2ZXJzZSBvZiBwb3J0IDQ0NS4gVHJlYXQgcmVwYXJzZSBwb2ludHMgKE5URlMganVuY3Rpb25zKQorYXMgZGlyZWN0b3JpZXMgcmF0aGVyIHRoYW4gc3ltbGlua3MgYmVjYXVzZSB3ZSBjYW4gZG8gZm9sbG93IGxpbmsgb24gdGhlbS4KKworVmVyc2lvbiAxLjIyCistLS0tLS0tLS0tLS0KK0FkZCBjb25maWcgb3B0aW9uIHRvIGVuYWJsZSBYQVRUUiAoZXh0ZW5kZWQgYXR0cmlidXRlKSBzdXBwb3J0LCBtYXBwaW5nCit4YXR0ciBuYW1lcyBpbiB0aGUgInVzZXIuIiBuYW1lc3BhY2Ugc3BhY2UgdG8gU01CL0NJRlMgRUFzLiBMb3RzIG9mCittaW5vciBmaXhlcyBwb2ludGVkIG91dCBieSB0aGUgU3RhbmZvcmQgU1dBVCBjaGVja2VyIChtb3N0bHkgbWlzc2luZworb3Igb3V0IG9mIG9yZGVyIE5VTEwgcG9pbnRlciBjaGVja3MgaW4gbGl0dGxlIHVzZWQgZXJyb3IgcGF0aHMpLgorCitWZXJzaW9uIDEuMjEKKy0tLS0tLS0tLS0tLQorQWRkIG5ldyBtb3VudCBwYXJtIHRvIGNvbnRyb2wgd2hldGhlciBtb2RlIGNoZWNrIChnZW5lcmljX3Blcm1pc3Npb24pIGlzIGRvbmUKK29uIHRoZSBjbGllbnQuICBJZiBVbml4IGV4dGVuc2lvbnMgYXJlIGVuYWJsZWQgYW5kIHRoZSB1aWRzIG9uIHRoZSBjbGllbnQKK2FuZCBzZXJ2ZXIgZG8gbm90IG1hdGNoLCBjbGllbnQgcGVybWlzc2lvbiBjaGVja3MgYXJlIG1lYW5pbmdsZXNzIG9uCitzZXJ2ZXIgdWlkcyB0aGF0IGRvIG5vdCBleGlzdCBvbiB0aGUgY2xpZW50ICh0aGlzIGRvZXMgbm90IGFmZmVjdCB0aGUKK25vcm1hbCBBQ0wgY2hlY2sgd2hpY2ggb2NjdXJzIG9uIHRoZSBzZXJ2ZXIpLiAgRml4IGRlZmF1bHQgdWlkCitvbiBta25vZCB0byBtYXRjaCBjcmVhdGUgYW5kIG1rZGlyLiBBZGQgb3B0aW9uYWwgbW91bnQgcGFybSB0byBhbGxvdworb3ZlcnJpZGUgb2YgdGhlIGRlZmF1bHQgdWlkIGJlaGF2aW9yIChpbiB3aGljaCB0aGUgc2VydmVyIHNldHMgdGhlIHVpZAorYW5kIGdpZCBvZiBuZXdseSBjcmVhdGVkIGZpbGVzKS4gTm9ybWFsbHkgZm9yIG5ldHdvcmsgZmlsZXN5c3RlbSBtb3VudHMKK3VzZXIgd2FudCB0aGUgc2VydmVyIHRvIHNldCB0aGUgdWlkL2dpZCBvbiBuZXdseSBjcmVhdGVkIGZpbGVzIChyYXRoZXIgdGhhbiAKK3VzaW5nIHVpZCBvZiB0aGUgY2xpZW50IHByb2Nlc3NlcyB5b3Ugd291bGQgaW4gYSBsb2NhbCBmaWxlc3lzdGVtKS4KKworVmVyc2lvbiAxLjIwCistLS0tLS0tLS0tLS0KK01ha2UgdHJhbnNhY3Rpb24gY291bnRzIG1vcmUgY29uc2lzdGVudC4gTWVyZ2UgL3Byb2MvZnMvY2lmcy9TaW11bHRhbmVvdXNPcHMKK2luZm8gaW50byAvcHJvYy9mcy9jaWZzL0RlYnVnRGF0YS4gIEZpeCBvb3BzIGluIHJhcmUgb29wcyBpbiByZWFkZGlyIAorKGluIGJ1aWxkX3dpbGRjYXJkX3BhdGhfZnJvbV9kZW50cnkpLiAgRml4IG1rbm9kIHRvIHBhc3MgdHlwZSBmaWVsZAorKGJsb2NrL2NoYXIvZmlmbykgcHJvcGVybHkuICBSZW1vdmUgc3B1cmlvdXMgbW91bnQgd2FybmluZyBsb2cgZW50cnkgd2hlbgorY3JlZGVudGlhbHMgcGFzc2VkIGFzIG1vdW50IGFyZ3VtZW50LiBTZXQgbWFqb3IvbWlub3IgZGV2aWNlIG51bWJlciBpbgoraW5vZGUgZm9yIGJsb2NrIGFuZCBjaGFyIGRldmljZXMgd2hlbiB1bml4IGV4dGVuc2lvbnMgZW5hYmxlZC4KKworVmVyc2lvbiAxLjE5CistLS0tLS0tLS0tLS0KK0ZpeCAvcHJvYy9mcy9jaWZzL1N0YXRzIGFuZCBEZWJ1Z0RhdGEgZGlzcGxheSB0byBoYW5kbGUgbGFyZ2VyCithbW91bnRzIG9mIHJldHVybiBkYXRhLiBQcm9wZXJseSBsaW1pdCByZXF1ZXN0cyB0byBNQVhfUkVRICg1MAoraXMgdGhlIHVzdWFsIG1heGltdW0gYWN0aXZlIG11bHRpcGxleCBTTUIvQ0lGUyByZXF1ZXN0cyBwZXIgc2VydmVyKS4KK0RvIG5vdCBraWxsIGNpZnNkIChhbmQgdGh1cyBodXJ0IHRoZSBvdGhlciBTTUIgc2Vzc2lvbikgd2hlbiBtb3JlIHRoYW4gb25lCitzZXNzaW9uIHRvIHRoZSBzYW1lIHNlcnZlciAoYnV0IHdpdGggZGlmZmVyZW50IHVzZXJpZHMpIGV4aXN0cyBhbmQgb25lCitvZiB0aGUgdHdvIHVzZXIncyBzbWIgc2Vzc2lvbnMgaXMgYmVpbmcgcmVtb3ZlZCB3aGlsZSBsZWF2aW5nIHRoZSBvdGhlci4KK0RvIG5vdCBsb29wIHJlY29ubmVjdGluZyBpbiBjaWZzZCBkZW11bHRpcGxleCB0aHJlYWQgd2hlbiBhZG1pbgora2lsbHMgdGhlIHRocmVhZCB3aXRob3V0IGdvaW5nIHRocm91Z2ggdW5tb3VudC4KKworVmVyc2lvbiAxLjE4CistLS0tLS0tLS0tLS0KK0RvIG5vdCByZW5hbWUgaGFyZGxpbmtlZCBmaWxlcyAoc2luY2UgdGhhdCBzaG91bGQgYmUgYSBub29wKS4gRmx1c2gKK2NhY2hlZCB3cml0ZSBiZWhpbmQgZGF0YSB3aGVuIHJlb3BlbmluZyBhIGZpbGUgYWZ0ZXIgc2Vzc2lvbiBhYmVuZCwKK2V4Y2VwdCB3aGVuIGFscmVhZHkgaW4gd3JpdGUuIEdyYWIgcGVyIHNvY2tldCBzZW0gZHVyaW5nIHJlY29ubmVjdCAKK3RvIGF2b2lkIG9vcHMgaW4gc2VuZG1zZyBpZiBvdmVybGFwcGluZyB3aXRoIHJlY29ubmVjdC4gRG8gbm90CityZXNldCBjYWNoZWQgaW5vZGUgZmlsZSBzaXplIG9uIHJlYWRkaXIgZm9yIGZpbGVzIG9wZW4gZm9yIHdyaXRlIG9uIAorY2xpZW50LgorCisKK1ZlcnNpb24gMS4xNworLS0tLS0tLS0tLS0tCitVcGRhdGUgbnVtYmVyIG9mIGJsb2NrcyBpbiBmaWxlIHNvIGR1IGNvbW1hbmQgaXMgaGFwcGllciAoaW4gTGludXggYSBmYWtlCitibG9ja3NpemUgb2YgNTEyIGlzIHJlcXVpcmVkIGZvciBjYWxjdWxhdGluZyBudW1iZXIgb2YgYmxvY2tzIGluIGlub2RlKS4KK0ZpeCBwcmVwYXJlIHdyaXRlIG9mIHBhcnRpYWwgcGFnZXMgdG8gcmVhZCBpbiBkYXRhIGZyb20gc2VydmVyIGlmIHBvc3NpYmxlLgorRml4IHJhY2Ugb24gdGNwU3RhdHVzIGZpZWxkIGJldHdlZW4gdW5tb3VudCBhbmQgcmVjb25uZWN0aW9uIGNvZGUsIGNhdXNpbmcKK2NpZnNkIHByb2Nlc3Mgc29tZXRpbWVzIHRvIGhhbmcgYXJvdW5kIGZvcmV2ZXIuIEltcHJvdmUgb3V0IG9mIG1lbW9yeQorY2hlY2tzIGluIGNpZnNfZmlsbGRpcgorCitWZXJzaW9uIDEuMTYKKy0tLS0tLS0tLS0tLQorRml4IGluY29ycmVjdCBmaWxlIHNpemUgaW4gZmlsZSBoYW5kbGUgYmFzZWQgc2V0YXR0ciBvbiBiaWcgZW5kaWFuIGhhcmR3YXJlLgorRml4IG9vcHMgaW4gYnVpbGRfcGF0aF9mcm9tX2RlbnRyeSB3aGVuIG91dCBvZiBtZW1vcnkuICBBZGQgY2hlY2tzIGZvciBpbnZhbGlkCithbmQgY2xvc2luZyBmaWxlIHN0cnVjdHMgaW4gd3JpdGVwYWdlL3BhcnRpYWxwYWdld3JpdGUuICBBZGQgc3RhdGlzdGljcworZm9yIGVhY2ggbW91bnRlZCBzaGFyZSAobmV3IG1lbnVjb25maWcgb3B0aW9uKS4gRml4IGVuZGlhbm5lc3MgcHJvYmxlbSBpbgordm9sdW1lIGluZm9ybWF0aW9uIGRpc3BsYXllZCBpbiAvcHJvYy9mcy9jaWZzL0RlYnVnRGF0YSAob25seSBhZmZlY3RzCithZmZlY3RzIGJpZyBlbmRpYW4gYXJjaGl0ZWN0dXJlcykuIFByZXZlbnQgcmVuYW1lcyB3aGlsZSBjb25zdHJ1Y3RpbmcKK3BhdGggbmFtZXMgZm9yIG9wZW4sIG1rZGlyIGFuZCBybWRpci4KKworVmVyc2lvbiAxLjE1CistLS0tLS0tLS0tLS0KK0NoYW5nZSB0byBtZW1wb29scyBmb3IgYWxsb2Mgc21iIHJlcXVlc3QgYnVmZmVycyBhbmQgbXVsdGlwbGV4IHN0cnVjdHMKK3RvIGJldHRlciBoYW5kbGUgbG93IG1lbW9yeSBwcm9ibGVtcyAoYW5kIHBvdGVudGlhbCBkZWFkbG9ja3MpLgorCitWZXJzaW9uIDEuMTQKKy0tLS0tLS0tLS0tLQorRml4IGluY29tcGxldGUgbGlzdGluZ3Mgb2YgbGFyZ2UgZGlyZWN0b3JpZXMgb24gU2FtYmEgc2VydmVycyB3aGVuIFVuaXgKK2V4dGVuc2lvbnMgZW5hYmxlZC4gIEZpeCBvb3BzIHdoZW4gc21iX2J1ZmZlciBjYW4gbm90IGJlIGFsbG9jYXRlZC4gRml4CityZW5hbWUgZGVhZGxvY2sgd2hlbiB3cml0aW5nIG91dCBkaXJ0eSBwYWdlcyBhdCBzYW1lIHRpbWUuCisKK1ZlcnNpb24gMS4xMworLS0tLS0tLS0tLS0tCitGaXggb3BlbiBvZiBmaWxlcyBpbiB3aGljaCBPX0NSRUFURSBjYW4gY2F1c2UgdGhlIG1vZGUgdG8gY2hhbmdlIGluCitzb21lIGNhc2VzLiBGaXggY2FzZSBpbiB3aGljaCByZXRyeSBvZiB3cml0ZSBvdmVybGFwcyBmaWxlIGNsb3NlLgorRml4IFBQQzY0IGJ1aWxkIGVycm9yLiAgUmVkdWNlIGV4Y2Vzc2l2ZSBzdGFjayB1c2FnZSBpbiBzbWIgcGFzc3dvcmQKK2hhc2hpbmcuIEZpeCBvdmVyd3JpdGUgb2YgTGludXggdXNlcidzIHZpZXcgb2YgZmlsZSBtb2RlIHRvIFdpbmRvd3Mgc2VydmVycy4KKworVmVyc2lvbiAxLjEyCistLS0tLS0tLS0tLS0KK0ZpeGVzIGZvciBsYXJnZSBmaWxlIGNvcHksIHNpZ25hbCBoYW5kbGluZywgc29ja2V0IHJldHJ5LCBidWZmZXIKK2FsbG9jYXRpb24gYW5kIGxvdyBtZW1vcnkgc2l0dWF0aW9ucy4KKworVmVyc2lvbiAxLjExCistLS0tLS0tLS0tLS0KK0JldHRlciBwb3J0IDEzOSBzdXBwb3J0IHRvIFdpbmRvd3Mgc2VydmVycyAoUkZDMTAwMS9SRkMxMDAyIFNlc3Npb25fSW5pdGlhbGl6ZSkKK2Fsc28gbm93IGFsbG93aW5nIHN1cHBvcnQgZm9yIHNwZWNpZnlpbmcgY2xpZW50IG5ldGJpb3NuYW1lLiAgTlQ0IHN1cHBvcnQgYWRkZWQuCisKK1ZlcnNpb24gMS4xMAorLS0tLS0tLS0tLS0tCitGaXggcmVjb25uZWN0aW9uIChhbmQgY2VydGFpbiBmYWlsZWQgbW91bnRzKSB0byBwcm9wZXJseSB3YWtlIHVwIHRoZQorYmxvY2tlZCB1c2VycyB0aHJlYWQgc28gaXQgZG9lcyBub3Qgc2VlbSBodW5nIChpbiBzb21lIGNhc2VzIHdhcyBibG9ja2VkCit1bnRpbCB0aGUgY2lmcyByZWNlaXZlIHRpbWVvdXQgZXhwaXJlZCkuIEZpeCBzcHVyaW91cyBlcnJvciBsb2dnaW5nCit0byBrZXJuZWwgbG9nIHdoZW4gYXBwbGljYXRpb24gd2l0aCBvcGVuIG5ldHdvcmsgZmlsZXMga2lsbGVkLiAKKworVmVyc2lvbiAxLjA5CistLS0tLS0tLS0tLS0KK0ZpeCAvcHJvYy9mcyBtb2R1bGUgdW5sb2FkIHdhcm5pbmcgbWVzc2FnZSAodGhhdCBjb3VsZCBiZSBsb2dnZWQKK3RvIHRoZSBrZXJuZWwgbG9nKS4gRml4IGludGVybWl0dGVudCBmYWlsdXJlIGluIGNvbm5lY3RhdGhvbgordGVzdDcgKGhhcmRsaW5rIGNvdW50IG5vdCBpbW1lZGlhdGVseSByZWZyZXNoZWQgaW4gY2FzZSBpbiB3aGljaAoraW5vZGUgbWV0YWRhdGEgY2FuIGJlIGluY29ycmVjdGx5IGtlcHQgY2FjaGVkIHdoZW4gdGltZSBuZWFyIHplcm8pCisKK1ZlcnNpb24gMS4wOAorLS0tLS0tLS0tLS0tCitBbGxvdyBmaWxlX21vZGUgYW5kIGRpcl9tb2RlIChzcGVjaWZpZWQgYXQgbW91bnQgdGltZSkgdG8gYmUgZW5mb3JjZWQKK2xvY2FsbHkgKHRoZSBzZXJ2ZXIgYWxyZWFkeSBlbmZvcmNlZCBpdHMgb3duIEFDTHMgdG9vKSBmb3Igc2VydmVycwordGhhdCBkbyBub3QgcmVwb3J0IHRoZSBjb3JyZWN0IG1vZGUgKGRvIG5vdCBzdXBwb3J0IHRoZSAKK0NJRlMgVW5peCBFeHRlbnNpb25zKS4KKworVmVyc2lvbiAxLjA3CistLS0tLS0tLS0tLS0KK0ZpeCBzb21lIHNtYWxsIG1lbW9yeSBsZWFrcyBpbiBzb21lIHVubW91bnQgZXJyb3IgcGF0aHMuIEZpeCBtYWpvciBsZWFrCitvZiBjYWNoZSBwYWdlcyBpbiByZWFkcGFnZXMgY2F1c2luZyBtdWx0aXBsZSByZWFkIG9yaWVudGVkIHN0cmVzcwordGVzdGNhc2VzIChpbmNsdWRpbmcgZnN4LCBhbmQgZXZlbiBsYXJnZSBmaWxlIGNvcHkpIHRvIGZhaWwgb3ZlciB0aW1lLiAKKworVmVyc2lvbiAxLjA2CistLS0tLS0tLS0tLS0KK1NlbmQgTlRDcmVhdGVYIHdpdGggQVRUUl9QT1NJWCBpZiBMaW51eC9Vbml4IGV4dGVuc2lvbnMgbmVnb3RpYXRlZCB3aXRoIHNlcnZlci4KK1RoaXMgYWxsb3dzIGZpbGVzIHRoYXQgZGlmZmVyIG9ubHkgaW4gY2FzZSBhbmQgaW1wcm92ZXMgcGVyZm9ybWFuY2Ugb2YgZmlsZQorY3JlYXRpb24gYW5kIGZpbGUgb3BlbiB0byBzdWNoIHNlcnZlcnMuICBGaXggc2VtYXBob3JlIGNvbmZsaWN0IHdoaWNoIGNhdXNlcyAKK3Nsb3cgZGVsZXRlIG9mIG9wZW4gZmlsZSB0byBTYW1iYSAod2hpY2ggdW5mb3J0dW5hdGVseSBjYW4gY2F1c2UgYW4gb3Bsb2NrCiticmVhayB0byBzZWxmIHdoaWxlIHZmc191bmxpbmsgaGVsZCBpX3NlbSkgd2hpY2ggY2FuIGhhbmcgZm9yIDIwIHNlY29uZHMuCisKK1ZlcnNpb24gMS4wNQorLS0tLS0tLS0tLS0tCitmaXhlcyB0byBjaWZzX3JlYWRwYWdlcyBmb3IgZnN4IHRlc3QgY2FzZQorCitWZXJzaW9uIDEuMDQKKy0tLS0tLS0tLS0tLQorRml4IGNhY2hpbmcgZGF0YSBpbnRlZ3JpdHkgYnVnIHdoZW4gZXh0ZW5kaW5nIGZpbGUgc2l6ZSBlc3BlY2lhbGx5IHdoZW4gbm8KK29wbG9jayBvbiBmaWxlLiAgRml4IHNwdXJpb3VzIGxvZ2dpbmcgb2YgdmFsaWQgYWxyZWFkeSBwYXJzZWQgbW91bnQgb3B0aW9ucwordGhhdCBhcmUgcGFyc2VkIG91dHNpZGUgb2YgdGhlIGNpZnMgdmZzIHN1Y2ggYXMgbm9zdWlkLgorCisKK1ZlcnNpb24gMS4wMworLS0tLS0tLS0tLS0tCitDb25uZWN0IHRvIHNlcnZlciB3aGVuIHBvcnQgbnVtYmVyIG92ZXJyaWRlIG5vdCBzcGVjaWZpZWQsIGFuZCB0Y3AgcG9ydAordW5pdGlhbGl6ZWQuICBSZXNldCBzZWFyY2ggdG8gcmVzdGFydCBhdCBjb3JyZWN0IGZpbGUgd2hlbiBrZXJuZWwgcm91dGluZQorZmlsbGRpciByZXR1cm5zIGVycm9yIGR1cmluZyBsYXJnZSBkaXJlY3Rvcnkgc2VhcmNoZXMgKHJlYWRkaXIpLiAKKworVmVyc2lvbiAxLjAyCistLS0tLS0tLS0tLS0KK0ZpeCBjYWNoaW5nIHByb2JsZW0gd2hlbiBmaWxlcyBvcGVuZWQgYnkgbXVsdGlwbGUgY2xpZW50cyBpbiB3aGljaCAKK3BhZ2UgY2FjaGUgY291bGQgY29udGFpbiBzdGFsZSBkYXRhLCBhbmQgd3JpdGUgdGhyb3VnaCBkaWQKK25vdCBvY2N1ciBvZnRlbiBlbm91Z2ggd2hpbGUgZmlsZSB3YXMgc3RpbGwgb3BlbiB3aGVuIHJlYWQgYWhlYWQKKyhyZWFkIG9wbG9jaykgbm90IGFsbG93ZWQuICBUcmVhdCAic2VwPSIgd2hlbiBmaXJzdCBtb3VudCBvcHRpb24KK2FzIGFuIG92ZXJycmlkZSBvZiBjb21tYSBhcyB0aGUgZGVmYXVsdCBzZXBhcmF0b3IgYmV0d2VlbiBtb3VudAorb3B0aW9ucy4gCisKK1ZlcnNpb24gMS4wMQorLS0tLS0tLS0tLS0tCitBbGxvdyBwYXNzd29yZHMgbG9uZ2VyIHRoYW4gMTYgYnl0ZXMuIEFsbG93IG51bGwgcGFzc3dvcmQgc3RyaW5nLgorCitWZXJzaW9uIDEuMDAKKy0tLS0tLS0tLS0tLQorR3JhY2VmdWxseSBjbGVhbiB1cCBmYWlsZWQgbW91bnRzIHdoZW4gYXR0ZW1wdGluZyB0byBtb3VudCB0byBzZXJ2ZXJzIHN1Y2ggYXMKK1dpbmRvd3MgOTggdGhhdCB0ZXJtaW5hdGUgdGNwIHNlc3Npb25zIGR1cmluZyBwcm90b3RvY29sIG5lZ290aWF0aW9uLiAgSGFuZGxlCitlbWJlZGRlZCBjb21tYXMgaW4gbW91bnQgcGFyc2luZyBvZiBwYXNzd29yZHMuCisKK1ZlcnNpb24gMC45OQorLS0tLS0tLS0tLS0tCitJbnZhbGlkYXRlIGxvY2FsIGlub2RlIGNhY2hlZCBwYWdlcyBvbiBvcGxvY2sgYnJlYWsgYW5kIHdoZW4gbGFzdCBmaWxlCitpbnN0YW5jZSBpcyBjbG9zZWQgc28gdGhhdCB0aGUgY2xpZW50IGRvZXMgbm90IGNvbnRpbnVlIHVzaW5nIHN0YWxlIGxvY2FsCitjb3B5IHJhdGhlciB0aGFuIGxhdGVyIG1vZGlmaWVkIHNlcnZlciBjb3B5IG9mIGZpbGUuICBEbyBub3QgcmVjb25uZWN0Cit3aGVuIHNlcnZlciBkcm9wcyB0aGUgdGNwIHNlc3Npb24gcHJlbWF0dXJlbHkgYmVmb3JlIG5lZ290aWF0ZQorcHJvdG9jb2wgcmVzcG9uc2UuICBGaXggb29wcyBpbiByb2VwZW5fZmlsZSB3aGVuIGRlbnRyeSBmcmVlZC4gIEFsbG93Cit0aGUgc3VwcG9ydCBmb3IgQ0lGUyBVbml4IEV4dGVuc2lvbnMgdG8gYmUgZGlzYWJsZWQgdmlhIHByb2MgaW50ZXJmYWNlLgorCitWZXJzaW9uIDAuOTgKKy0tLS0tLS0tLS0tLQorRml4IGhhbmcgaW4gY29tbWl0X3dyaXRlIGR1cmluZyByZWNvbm5lY3Rpb24gb2Ygb3BlbiBmaWxlcyB1bmRlciBoZWF2eSBsb2FkLgorRml4IHVubG9hZF9ubHMgb29wcyBpbiBhIG1vdW50IGZhaWx1cmUgcGF0aC4gU2VyaWFsaXplIHdyaXRlcyB0byBzYW1lIHNvY2tldAord2hpY2ggYWxzbyBmaXhlcyBhbnkgcG9zc2libGUgcmFjZXMgd2hlbiBjaWZzIHNpZ25hdHVyZXMgYXJlIGVuYWJsZWQgaW4gU01CcworYmVpbmcgc2VudCBvdXQgb2Ygc2lnbmF0dXJlIHNlcXVlbmNlIG51bWJlciBvcmRlci4gICAgCisKK1ZlcnNpb24gMC45NworLS0tLS0tLS0tLS0tCitGaXggYnl0ZSByYW5nZSBsb2NraW5nIGJ1ZyAoZW5kaWFuIHByb2JsZW0pIGNhdXNpbmcgYmFkIG9mZnNldCBhbmQKK2xlbmd0aC4KKworVmVyc2lvbiAwLjk2CistLS0tLS0tLS0tLS0KK0ZpeCBvb3BzIChpbiBzZW5kX3NpZykgY2F1c2VkIGJ5IENJRlMgdW5tb3VudCBjb2RlIHRyeWluZyB0bword2FrZSB1cCB0aGUgZGVtdWx0aXBsZXggdGhyZWFkIGFmdGVyIGl0IGhhZCBleGl0ZWQuIERvIG5vdCBsb2cKK2Vycm9yIG9uIGhhcm1sZXNzIG9wbG9jayByZWxlYXNlIG9mIGNsb3NlZCBoYW5kbGUuCisKK1ZlcnNpb24gMC45NQorLS0tLS0tLS0tLS0tCitGaXggdW5zYWZlIGdsb2JhbCB2YXJpYWJsZSB1c2FnZSBhbmQgcGFzc3dvcmQgaGFzaCBmYWlsdXJlIG9uIGdjYyAzLjMuMQorRml4IHByb2JsZW0gcmVjb25uZWN0aW5nIHNlY29uZGFyeSBtb3VudHMgdG8gc2FtZSBzZXJ2ZXIgYWZ0ZXIgc2Vzc2lvbiAKK2ZhaWx1cmUuICBGaXggaW52YWxpZCBkZW50cnkgLSByYWNlIGluIG1rZGlyIHdoZW4gZGlyZWN0b3J5IGdldHMgY3JlYXRlZAorYnkgYW5vdGhlciBjbGllbnQgYmV0d2VlbiB0aGUgbG9va3VwIGFuZCBta2Rpci4KKyAKK1ZlcnNpb24gMC45NAorLS0tLS0tLS0tLS0tCitGaXggdG8gbGlzdCBwcm9jZXNzaW5nIGluIHJlb3Blbl9maWxlcy4gRml4IHJlY29ubmVjdGlvbiB3aGVuIHNlcnZlciBodW5nCitidXQgdGNwaXAgc2Vzc2lvbiBzdGlsbCBhbGl2ZS4gIFNldCBwcm9wZXIgdGltZW91dCBvbiBzb2NrZXQgcmVhZC4KKworVmVyc2lvbiAwLjkzCistLS0tLS0tLS0tLS0KK0FkZCBtaXNzaW5nIG1vdW50IG9wdGlvbnMgaW5jbHVkaW5nIGlvY2hhcnNldC4gIFNNUCBmaXhlcyBpbiB3cml0ZSBhbmQgb3Blbi4gCitGaXggZXJyb3JzIGluIHJlY29ubmVjdGluZyBhZnRlciBUQ1Agc2Vzc2lvbiBmYWlsdXJlLiAgRml4IG1vZHVsZSB1bmxvYWRpbmcKK29mIGRlZmF1bHQgbmxzIGNvZGVwYWdlCisKK1ZlcnNpb24gMC45MgorLS0tLS0tLS0tLS0tCitBY3RpdmUgc21iIHRyYW5zYWN0aW9ucyBzaG91bGQgbmV2ZXIgZ28gbmVnYXRpdmUgKGZpeCBkb3VibGUgRnJlZVhpZCkuIEZpeAorbGlzdCBwcm9jZXNzaW5nIGluIGZpbGUgcm91dGluZXMuIENoZWNrIHJldHVybiBjb2RlIG9uIGttYWxsb2MgaW4gb3Blbi4KK0ZpeCBzcGlubG9jayB1c2FnZSBmb3IgU01QLgorCitWZXJzaW9uIDAuOTEKKy0tLS0tLS0tLS0tLQorRml4IG9vcHMgaW4gcmVvcGVuX2ZpbGVzIHdoZW4gaW52YWxpZCBkZW50cnkuIGRyb3AgZGVudHJ5IG9uIHNlcnZlciByZW5hbWUgCithbmQgb24gcmV2YWxpZGF0ZSBlcnJvcnMuIEZpeCBjYXNlcyB3aGVyZSBwaWQgaXMgbm93IHRnaWQuICBGaXggcmV0dXJuIGNvZGUKK29uIGNyZWF0ZSBoYXJkIGxpbmsgd2hlbiBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGVtLiAKKworVmVyc2lvbiAwLjkwCistLS0tLS0tLS0tLS0KK0ZpeCBzY2hlZHVsaW5nIHdoaWxlIGF0b21pYyBlcnJvciBpbiBnZXR0aW5nIGlub2RlIGluZm8gb24gbmV3bHkgY3JlYXRlZCBmaWxlLiAKK0ZpeCB0cnVuY2F0ZSBvZiBleGlzdGluZyBmaWxlcyBvcGVuZWQgd2l0aCBPX0NSRUFUIGJ1dCBub3QgT19UUlVOQyBzZXQuCisKK1ZlcnNpb24gMC44OQorLS0tLS0tLS0tLS0tCitGaXggb29wcyBvbiB3cml0ZSB0byBkZWFkIHRjcCBzZXNzaW9uLiBSZW1vdmUgZXJyb3IgbG9nIHdyaXRlIGZvciBjYXNlIHdoZW4gZmlsZSBvcGVuCitPX0NSRUFUIGJ1dCBub3QgT19FWENMCisKK1ZlcnNpb24gMC44OAorLS0tLS0tLS0tLS0tCitGaXggbm9uLVBPU0lYIGJlaGF2aW9yIG9uIHJlbmFtZSBvZiBvcGVuIGZpbGUgYW5kIGRlbGV0ZSBvZiBvcGVuIGZpbGUgYnkgdGFraW5nIAorYWR2YW50YWdlIG9mIHRyYW5zMiBTZXRGaWxlSW5mbyByZW5hbWUgZmFjaWxpdHkgaWYgYXZhaWxhYmxlIG9uIHRhcmdldCBzZXJ2ZXIuCitSZXRyeSBvbiBFTk9TUEMgYW5kIEVBR0FJTiBzb2NrZXQgZXJyb3JzLgorCitWZXJzaW9uIDAuODcKKy0tLS0tLS0tLS0tLQorRml4IG9vcHMgb24gYmlnIGVuZGlhbiByZWFkZGlyLiAgU2V0IGJsa3NpemUgdG8gYmUgZXZlbiBwb3dlciBvZiB0d28gKDIqKmJsa2JpdHMpIHRvIGZpeAorYWxsb2NhdGlvbiBzaXplIG1pc2NhbGN1bGF0aW9uLiBBZnRlciBvcGxvY2sgdG9rZW4gbG9zdCBkbyBub3QgcmVhZCB0aHJvdWdoCitjYWNoZS4gCisKK1ZlcnNpb24gMC44NgorLS0tLS0tLS0tLS0tCitGaXggb29wcyBvbiBlbXB0eSBmaWxlIHJlYWRhaGVhZC4gIEZpeCBmb3IgZmlsZSBzaXplIGhhbmRsaW5nIGZvciBsb2NhbGx5IGNhY2hlZCBmaWxlcy4KKworVmVyc2lvbiAwLjg1CistLS0tLS0tLS0tLS0KK0ZpeCBvb3BzIGluIG1rZGlyIHdoZW4gc2VydmVyIGZhaWxzIHRvIHJldHVybiBpbm9kZSBpbmZvLiBGaXggb29wcyBpbiByZW9wZW5fZmlsZXMKK2R1cmluZyBhdXRvIHJlY29ubmVjdGlvbiB0byBzZXJ2ZXIgYWZ0ZXIgc2VydmVyIHJlY292ZXJlZCBmcm9tIGZhaWx1cmUuCisKK1ZlcnNpb24gMC44NAorLS0tLS0tLS0tLS0tCitGaW5pc2ggc3VwcG9ydCBmb3IgTGludXggMi41IG9wZW4vY3JlYXRlIGNoYW5nZXMsIHdoaWNoIHJlbW92ZXMgdGhlCityZWR1bmRhbnQgTlRDcmVhdGUvUVBhdGhJbmZvL2Nsb3NlIHRoYXQgd2FzIHNlbnQgZHVyaW5nIGZpbGUgY3JlYXRlLgorRW5hYmxlIG9wbG9jayBieSBkZWZhdWx0LiBFbmFibGUgcGFja2V0IHNpZ25pbmcgYnkgZGVmYXVsdCAobmVlZGVkIHRvIAorYWNjZXNzIG1hbnkgcmVjZW50IFdpbmRvd3Mgc2VydmVycykKKworVmVyc2lvbiAwLjgzCistLS0tLS0tLS0tLS0KK0ZpeCBvb3BzIHdoZW4gbW91bnRpbmcgdG8gbG9uZyBzZXJ2ZXIgbmFtZXMgY2F1c2VkIGJ5IGludmVydGVkIHBhcm1zIHRvIGttYWxsb2MuCitGaXggTXVsdGl1c2VyTW91bnQgKC9wcm9jL2ZzL2NpZnMgY29uZmlndXJhdGlvbiBzZXR0aW5nKSBzbyB0aGF0IHdoZW4gZW5hYmxlZAord2Ugd2lsbCBjaG9vc2UgYSBjaWZzIHVzZXIgc2Vzc2lvbiAoc21iIHVpZCkgdGhhdCBiZXR0ZXIgbWF0Y2hlcyB0aGUgbG9jYWwKK3VpZCBpZiBhKSB0aGUgbW91bnQgdWlkIGRvZXMgbm90IG1hdGNoIHRoZSBjdXJyZW50IHVpZCBhbmQgYikgd2UgaGF2ZSBhbm90aGVyCitzZXNzaW9uIHRvIHRoZSBzYW1lIHNlcnZlciAoaXAgYWRkcmVzcykgZm9yIGEgZGlmZmVyZW50IG1vdW50IHdoaWNoCittYXRjaGVzIHRoZSBjdXJyZW50IGxvY2FsIHVpZC4KKworVmVyc2lvbiAwLjgyCistLS0tLS0tLS0tLS0KK0FkZCBzdXBwb3J0IGZvciBta25vZCBvZiBibG9jayBvciBjaGFyYWN0ZXIgZGV2aWNlcy4gIEZpeCBvcGxvY2sKK2NvZGUgKGRpc3RyaWJ1dGVkIGNhY2hpbmcpIHRvIHByb3Blcmx5IHNlbmQgcmVzcG9uc2UgdG8gb3Bsb2NrCiticmVhayBmcm9tIHNlcnZlci4KKworVmVyc2lvbiAwLjgxCistLS0tLS0tLS0tLS0KK0ZpbmlzaCB1cCBDSUZTIHBhY2tldCBkaWdpdGFsIHNpZ25pbmcgZm9yIHRoZSBkZWZhdWx0CitOVExNIHNlY3VyaXR5IGNhc2UuIFRoaXMgc2hvdWxkIGhlbHAgV2luZG93cyAyMDAzCituZXR3b3JrIGludGVyb3BlcmFiaWxpdHkgc2luY2UgaXQgaXMgY29tbW9uIGZvcgorcGFja2V0IHNpZ25pbmcgdG8gYmUgcmVxdWlyZWQgbm93LiBGaXggc3RhdGZzIChzdGF0IC1mKQord2hpY2ggcmVjZW50bHkgc3RhcnRlZCByZXR1cm5pbmcgZXJyb3JzIGR1ZSB0byAKK2ludmFsaWQgdmFsdWUgKC0xIGluc3RlYWQgb2YgMCkgYmVpbmcgc2V0IGluIHRoZQorc3RydWN0IGtzdGF0ZnMgZl9mZmlsZXMgZmllbGQuCisKK1ZlcnNpb24gMC44MAorLS0tLS0tLS0tLS0KK0ZpeCBvb3BzIG9uIHN0b3BwaW5nIG9wbG9jayB0aHJlYWQgd2hlbiByZW1vdmluZyBjaWZzIHdoZW4KK2J1aWx0IGFzIG1vZHVsZS4KKworVmVyc2lvbiAwLjc5CistLS0tLS0tLS0tLS0KK0ZpeCBtb3VudCBvcHRpb25zIGZvciBybyAocmVhZG9ubHkpLCB1aWQsIGdpZCBhbmQgZmlsZSBhbmQgZGlyZWN0b3J5IG1vZGUuIAorCitWZXJzaW9uIDAuNzgKKy0tLS0tLS0tLS0tLQorRml4IGVycm9ycyBkaXNwbGF5ZWQgb24gZmFpbGVkIG1vdW50cyB0byBiZSBtb3JlIHVuZGVyc3RhbmRhYmxlLgorRml4ZWQgdmFyaW91cyBpbmNvcnJlY3Qgb3IgbWlzbGVhZGluZyBzbWIgdG8gcG9zaXggZXJyb3IgY29kZSBtYXBwaW5ncy4KKworVmVyc2lvbiAwLjc3CistLS0tLS0tLS0tLS0KK0ZpeCBkaXNwbGF5IG9mIE5URlMgREZTIGp1bmN0aW9ucyB0byBkaXNwbGF5IGFzIHN5bWxpbmtzLgorVGhleSBhcmUgdGhlIG5ldHdvcmsgZXF1aXZhbGVudC4gIEZpeCBvb3BzIGluIAorY2lmc19wYXJ0aWFscGFnZXdyaXRlIGNhdXNlZCBieSBtaXNzaW5nIHNwaW5sb2NrIHByb3RlY3Rpb24KK29mIG9wZW5maWxlIGxpbmtlZCBsaXN0LiAgQWxsb3cgd3JpdGViZWhpbmQgY2FjaGluZyBlcnJvcnMgdG8gCitiZSByZXR1cm5lZCB0byB0aGUgYXBwbGljYXRpb24gYXQgZmlsZSBjbG9zZS4KKworVmVyc2lvbiAwLjc2CistLS0tLS0tLS0tLS0KK0NsZWFuIHVwIG9wdGlvbnMgZGlzcGxheWVkIGluIC9wcm9jL21vdW50cyBieSBzaG93X29wdGlvbnMgdG8KK2JlIG1vcmUgY29uc2lzdGVudCB3aXRoIG90aGVyIGZpbGVzeXN0ZW1zLgorCitWZXJzaW9uIDAuNzUKKy0tLS0tLS0tLS0tLQorRml4IGRlbGV0ZSBvZiByZWFkb25seSBmaWxlIHRvIFdpbmRvd3Mgc2VydmVycy4gIFJlZmxlY3QKK3ByZXNlbmNlIG9yIGFic2VuY2Ugb2YgcmVhZCBvbmx5IGRvcyBhdHRyaWJ1dGUgaW4gbW9kZQorYml0cyBmb3Igc2VydmVycyB0aGF0IGRvIG5vdCBzdXBwb3J0IENJRlMgVW5peCBleHRlbnNpb25zLgorRml4IHNob3J0ZW5lZCByZXN1bHRzIG9uIHJlYWRkaXIgb2YgbGFyZ2UgZGlyZWN0b3JpZXMgdG8KK3NlcnZlcnMgc3VwcG9ydGluZyBDSUZTIFVuaXggZXh0ZW5zaW9ucyAoY2F1c2VkIGJ5CitpbmNvcnJlY3QgcmVzdW1lIGtleSkuCisKK1ZlcnNpb24gMC43NAorLS0tLS0tLS0tLS0tCitGaXggdHJ1bmNhdGUgYnVnIChzZXQgZmlsZSBzaXplKSB0aGF0IGNvdWxkIGNhdXNlIGhhbmdzIGUuZy4gcnVubmluZyBmc3gKKworVmVyc2lvbiAwLjczCistLS0tLS0tLS0tLS0KK3VubG9hZCBubHMgaWYgbW91bnQgZmFpbHMuCisKK1ZlcnNpb24gMC43MgorLS0tLS0tLS0tLS0tCitBZGQgcmVzdW1lIGtleSBzdXBwb3J0IHRvIHNlYXJjaCAocmVhZGRpcikgY29kZSB0byB3b3JrYXJvdW5kCitXaW5kb3dzIGJ1Zy4gIEFkZCAvcHJvYy9mcy9jaWZzL0xvb2t1cENhY2hlRW5hYmxlIHdoaWNoCithbGxvd3MgZGlzYWJsaW5nIGNhY2hpbmcgb2YgYXR0cmlidXRlIGluZm9ybWF0aW9uIGZvcgorbG9va3Vwcy4KKworVmVyc2lvbiAwLjcxCistLS0tLS0tLS0tLS0KK0FkZCBtb3JlIG9wbG9jayBoYW5kbGluZyAoZGlzdHJpYnV0ZWQgY2FjaGluZyBjb2RlKS4gIFJlbW92ZQorZGVhZCBjb2RlLiAgUmVtb3ZlIGV4Y2Vzc2l2ZSBzdGFjayBzcGFjZSB1dGlsaXphdGlvbiBmcm9tCitzeW1saW5rIHJvdXRpbmVzLgorCitWZXJzaW9uIDAuNzAKKy0tLS0tLS0tLS0tLQorRml4IG9vcHMgaW4gZ2V0IGRmcyByZWZlcnJhbCAodHJpZ2dlcmVkIHdoZW4gbnVsbCBwYXRoIHNlbnQgaW4gdG8KK21vdW50KS4gIEFkZCBzdXBwb3J0IGZvciBvdmVycmlkaW5nIHJzaXplIGF0IG1vdW50IHRpbWUuCisKK1ZlcnNpb24gMC42OQorLS0tLS0tLS0tLS0tCitGaXggYnVmZmVyIG92ZXJydW4gaW4gcmVhZGRpciB3aGljaCBjYXVzZWQgaW50ZXJtaXR0ZW50IGtlcm5lbCBvb3BzZXMuCitGaXggd3JpdGVwYWdlIGNvZGUgdG8gcmVsZWFzZSBrbWFwIG9uIHdyaXRlIGRhdGEuICBBbGxvdyAiLWlwPSIgbmV3IAorbW91bnQgb3B0aW9uIHRvIGJlIHBhc3NlZCBpbiBvbiBwYXJhbWV0ZXIgZGlzdGluY3QgZnJvbSB0aGUgZmlyc3QgcGFydAorKHNlcnZlciBuYW1lIHBvcnRpb24gb2YpIHRoZSBVTkMgbmFtZS4gIEFsbG93IG92ZXJyaWRlIG9mIHRoZQordGNwIHBvcnQgb2YgdGhlIHRhcmdldCBzZXJ2ZXIgdmlhIG5ldyBtb3VudCBvcHRpb24gIi1wb3J0PSIgIAorCitWZXJzaW9uIDAuNjgKKy0tLS0tLS0tLS0tLQorRml4IHNlYXJjaCBoYW5kbGUgbGVhayBvbiByZXdpbmQuICBGaXggc2V0dWlkIGFuZCBnaWQgc28gdGhhdCB0aGV5IGFyZSAKK3JlZmxlY3RlZCBpbiB0aGUgbG9jYWwgaW5vZGUgaW1tZWRpYXRlbHkuICBDbGVhbnVwIG9mIHdoaXRlc3BhY2UKK3RvIG1ha2UgMi40IGFuZCAyLjUgdmVyc2lvbnMgbW9yZSBjb25zaXN0ZW50LgorCisKK1ZlcnNpb24gMC42NworLS0tLS0tLS0tLS0tCitGaXggc2lnbmFsIHNlbmRpbmcgc28gdGhhdCBjYXB0aXZlIHRocmVhZCAoY2lmc2QpIGV4aXRzIG9uIHVtb3VudCAKKyh3aGljaCB3YXMgY2F1c2luZyB0aGUgd2FybmluZyBpbiBrbWVtX2NhY2hlX2ZyZWUgb2YgdGhlIHJlcXVlc3QgYnVmZmVycworYXQgcm1tb2QgdGltZSkuICBUaGlzIGhhZCBicm9rZW4gYXMgYSBzaWRlZWZmZWN0IG9mIHRoZSByZWNlbnQgZ2xvYmFsCitrZXJuZWwgY2hhbmdlIHRvIGRhZW1vbml6ZS4gIEZpeCBtZW1vcnkgbGVhayBpbiByZWFkZGlyIGNvZGUgd2hpY2gKK3Nob3dlZCB1cCBpbiAibHMgLVIiIChhbmQgYXBwbGljYXRpb25zIHRoYXQgZGlkIHNlYXJjaCByZXdpbmRpbmcpLgorCitWZXJzaW9uIDAuNjYKKy0tLS0tLS0tLS0tLQorUmVjb25uZWN0IHRpZHMgYW5kIGZpZHMgYWZ0ZXIgc2Vzc2lvbiByZWNvbm5lY3Rpb24gKHN0aWxsIGRvIG5vdAorcmVjb25uZWN0IGJ5dGUgcmFuZ2UgbG9ja3MgdGhvdWdoKS4gIEZpeCBwcm9ibGVtIGNhY2hpbmcKK2xvb2t1cCBpbmZvcm1hdGlvbiBmb3IgZGlyZWN0b3J5IGlub2RlcywgaW1wcm92aW5nIHBlcmZvcm1hbmNlLAorZXNwZWNpYWxseSBpbiBkZWVwIGRpcmVjdG9yeSB0cmVlcy4gIEZpeCB2YXJpb3VzIGJ1aWxkIHdhcm5pbmdzLgorCitWZXJzaW9uIDAuNjUKKy0tLS0tLS0tLS0tLQorRmluaXNoIGZpeGVzIHRvIGNvbW1pdCB3cml0ZSBmb3IgY2FjaGluZy9yZWFkYWhlYWQgY29uc2lzdGVuY3kuICBmc3ggCitub3cgd29ya3MgdG8gU2FtYmEgc2VydmVycy4gIEZpeCBvb3BzIGNhdXNlZCB3aGVuIHJlYWRhaGVhZAord2FzIGludGVycnVwdGVkIGJ5IGEgc2lnbmFsLgorCitWZXJzaW9uIDAuNjQKKy0tLS0tLS0tLS0tLQorRml4IGRhdGEgY29ycnVwdGlvbiAoaW4gcGFydGlhbCBwYWdlIGFmdGVyIHRydW5jYXRlKSB0aGF0IGNhdXNlZCBmc3ggdG8KK2ZhaWwgdG8gV2luZG93cyBzZXJ2ZXJzLiAgQ2xlYW5lZCB1cCBzb21lIGV4dHJhbmVvdXMgZXJyb3IgbG9nZ2luZyBpbgorY29tbW9uIGVycm9yIHBhdGhzLiAgQWRkIGdlbmVyaWMgc2VuZGZpbGUgc3VwcG9ydC4KKworVmVyc2lvbiAwLjYzCistLS0tLS0tLS0tLS0KK0ZpeCBtZW1vcnkgbGVhayBpbiBBbGxvY01pZFFFbnRyeS4KK0ZpbmlzaCByZWNvbm5lY3Rpb24gbG9naWMsIHNvIGNvbm5lY3Rpb24gd2l0aCBzZXJ2ZXIgY2FuIGJlIGRyb3BwZWQKKyhvciBzZXJ2ZXIgcmVib290ZWQpIGFuZCB0aGUgY2lmcyBjbGllbnQgd2lsbCByZWNvbm5lY3QuICAKKworVmVyc2lvbiAwLjYyCistLS0tLS0tLS0tLS0KK0ZpeCB0ZW1wb3Jhcnkgc29ja2V0IGxlYWsgd2hlbiBiYWQgdXNlcmlkIG9yIHBhc3N3b3JkIHNwZWNpZmllZCAKKyhvciBvdGhlciBTTUJTZXNzU2V0dXAgZmFpbHVyZSkuICBJbmNyZWFzZSBtYXhpbXVtIGJ1ZmZlciBzaXplIHRvIHNsaWdodGx5CitvdmVyIDE2SyB0byBhbGxvdyBuZWdvdGlhdGlvbiBvZiB1cCB0byBTYW1iYSBhbmQgV2luZG93cyBzZXJ2ZXIgZGVmYXVsdCByZWFkIAorc2l6ZXMuICBBZGQgc3VwcG9ydCBmb3IgcmVhZHBhZ2VzCisKK1ZlcnNpb24gMC42MQorLS0tLS0tLS0tLS0tCitGaXggb29wcyB3aGVuIHVzZXJuYW1lIG5vdCBwYXNzZWQgaW4gb24gbW91bnQuICBFeHRlbnNpdmUgZml4ZXMgYW5kIGltcHJvdmVtZW50cwordG8gZXJyb3IgbG9nZ2luZyAoc3RyaXAgcmVkdW5kYW50IG5ld2xpbmVzLCBjaGFuZ2UgZGVidWcgbWFjcm9zIHRvIGVuc3VyZSBuZXdsaW5lCitwYXNzZWQgaW4gYW5kIHRvIGJlIG1vcmUgY29uc2lzdGVudCkuICBGaXggd3JpdGVwYWdlIHdyb25nIGZpbGUgaGFuZGxlIHByb2JsZW0sCithIHJlYWRvbmx5IGZpbGUgaGFuZGxlIGNvdWxkIGJlIGluY29ycmVjdGx5IHVzZWQgdG8gYXR0ZW1wdCB0byB3cml0ZSBvdXQKK2ZpbGUgdXBkYXRlcyB0aHJvdWdoIHRoZSBwYWdlIGNhY2hlIHRvIG11bHRpcGx5IG9wZW4gZmlsZXMuICBUaGlzIGNvdWxkIGNhdXNlCit0aGUgaW96b25lIGJlbmNobWFyayB0byBmYWlsIG9uIHRoZSBmd3JpdGUgdGVzdC4gRml4IGJ1ZyBtb3VudGluZyB0d28gZGlmZmVyZW50CitzaGFyZXMgdG8gdGhlIHNhbWUgV2luZG93cyBzZXJ2ZXIgd2hlbiB1c2luZyBkaWZmZXJlbnQgdXNlcm5hbWVzCisoZG9pbmcgdGhpcyB0byBTYW1iYSBzZXJ2ZXJzIHdvcmtlZCBidXQgV2luZG93cyB3YXMgcmVqZWN0aW5nIGl0KSAtIG5vdyBpdCBpcworcG9zc2libGUgdG8gdXNlIGRpZmZlcmVudCB1c2VyaWRzIHdoZW4gY29ubmVjdGluZyB0byB0aGUgc2FtZSBzZXJ2ZXIgZnJvbSBhCitMaW51eCBjbGllbnQuIEZpeCBvb3BzIHdoZW4gdHJlZURpc2Nvbm5lY3QgY2FsbGVkIGR1cmluZyB1bm1vdW50IG9uCitwcmV2aW91c2x5IGZyZWVkIHNvY2tldC4KKworVmVyc2lvbiAwLjYwCistLS0tLS0tLS0tLS0KK0ZpeCBvb3BzIGluIHJlYWRwYWdlcyBjYXVzZWQgYnkgbm90IHNldHRpbmcgYWRkcmVzcyBzcGFjZSBvcGVyYXRpb25zIGluIGlub2RlIGluIAorcmFyZSBjb2RlIHBhdGguIAorCitWZXJzaW9uIDAuNTkKKy0tLS0tLS0tLS0tLQorSW5jbHVkZXMgc3VwcG9ydCBmb3IgZGVsZXRpbmcgb2Ygb3BlbiBmaWxlcyBhbmQgcmVuYW1pbmcgb3ZlciBleGlzdGluZyBmaWxlcyAocGVyIFBPU0lYCityZXF1aXJlbWVudCkuICBBZGQgcmVhZGxpbmsgc3VwcG9ydCBmb3IgV2luZG93cyBqdW5jdGlvbiBwb2ludHMgKGRpcmVjdG9yeSBzeW1saW5rcykuCisKK1ZlcnNpb24gMC41OAorLS0tLS0tLS0tLS0tCitDaGFuZ2VkIHJlYWQgYW5kIHdyaXRlIHRvIGdvIHRocm91Z2ggcGFnZWNhY2hlLiBBZGRlZCBhZGRpdGlvbmFsIGFkZHJlc3Mgc3BhY2Ugb3BlcmF0aW9ucy4KK01lbW9yeSBtYXBwZWQgb3BlcmF0aW9ucyBub3cgd29ya2luZy4KKworVmVyc2lvbiAwLjU3CistLS0tLS0tLS0tLS0KK0FkZGVkIHdyaXRlcGFnZSBjb2RlIGZvciBhZGRpdGlvbmFsIG1lbW9yeSBtYXBwaW5nIHN1cHBvcnQuICBGaXhlZCBsZWFrIGluIHhpZHMgY2F1c2luZwordGhlIHNpbXVsdGFuZW91cyBvcGVyYXRpb25zIGNvdW50ZXIgKC9wcm9jL2ZzL2NpZnMvU2ltdWx0YW5lb3VzT3BzKSB0byBpbmNyZWFzZSBvbiAKK2V2ZXJ5IHN0YXQgY2FsbC4gIEFkZGl0aW9uYWwgZm9ybWF0dGluZyBjbGVhbnVwLiAKKworVmVyc2lvbiAwLjU2CistLS0tLS0tLS0tLS0KK0ZpeCBiaWdlbmRpYW4gYnVnIGluIG9yZGVyIG9mIHRpbWUgY29udmVyc2lvbi4gTWVyZ2UgMi41IHRvIDIuNCB2ZXJzaW9uLiAgRm9ybWF0dGluZyBjbGVhbnVwLiAgIAorCitWZXJzaW9uIDAuNTUKKy0tLS0tLS0tLS0tLQorRml4ZXMgZnJvbSBad2FuZSBNd2Fpa2FtYm8gZm9yIGFkZGluZyBtaXNzaW5nIHJldHVybiBjb2RlIGNoZWNraW5nIGluIGEgZmV3IHBsYWNlcy4KK0Fsc28gaW5jbHVkZWQgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIGhpcyBmaXggdG8gcHJvdGVjdCBnbG9iYWwgbGlzdCBtYW5pcHVsYXRpb24gb2YKK3RoZSBzbWIgc2Vzc2lvbiBhbmQgdHJlZSBjb25uZWN0aW9uIGFuZCBtaWQgcmVsYXRlZCBnbG9iYWwgdmFyaWFibGVzLgorCitWZXJzaW9uIDAuNTQKKy0tLS0tLS0tLS0tLQorRml4IHByb2JsZW0gd2l0aCBjYXB0aXZlIHRocmVhZCBoYW5naW5nIGFyb3VuZCBhdCB1bm1vdW50IHRpbWUuICBBZGp1c3QgdG8gMi41LjQyLXByZQorY2hhbmdlcyB0byBzdXBlcmJsb2NrIGxheW91dC4gICBSZW1vdmUgd2FzdGVmdWwgYWxsb2NhdGlvbiBvZiBzbWIgYnVmZmVycyAobm93IHRoZSBzZW5kIAorYnVmZmVyIGlzIHJldXNlZCBmb3IgcmVzcG9uc2VzKS4gIEFkZCBtb3JlIG9wbG9jayBoYW5kbGluZy4gQWRkaXRpb25hbCBtaW5vciBjbGVhbnVwLgorCitWZXJzaW9uIDAuNTMKKy0tLS0tLS0tLS0tLQorTW9yZSBzdHlsaXN0aWMgdXBkYXRlcyB0byBiZXR0ZXIgbWF0Y2gga2VybmVsIHN0eWxlLiAgQWRkIGFkZGl0aW9uYWwgc3RhdGlzdGljcworZm9yIGZpbGVzeXN0ZW0gd2hpY2ggY2FuIGJlIHZpZXdlZCB2aWEgL3Byb2MvZnMvY2lmcy4gIEFkZCBtb3JlIHBpZWNlcyBvZiBOVExNdjIKK2FuZCBDSUZTIFBhY2tldCBTaWduaW5nIGVuYWJsZW1lbnQuCisKK1ZlcnNpb24gMC41MgorLS0tLS0tLS0tLS0tCitSZXBsYWNlIGNhbGwgdG8gc2xlZXBfb24gd2l0aCBzYWZlciB3YWl0X29uX2V2ZW50LgorTWFrZSBzdHlsaXN0aWMgY2hhbmdlcyB0byBiZXR0ZXIgbWF0Y2gga2VybmVsIHN0eWxlIHJlY29tbWVuZGF0aW9ucy4KK1JlbW92ZSBtb3N0IHR5cGVkZWYgdXNhZ2UgKGV4Y2VwdCBmb3IgdGhlIFBEVXMgdGhlbXNlbHZlcykuCisKK1ZlcnNpb24gMC41MQorLS0tLS0tLS0tLS0tCitVcGRhdGUgbW91bnQgc28gdGhlIC11bmMgbW91bnQgb3B0aW9uIGlzIG5vIGxvbmdlciByZXF1aXJlZCAodGhlIGlwIGFkZHJlc3MgY2FuIGJlIHNwZWNpZmllZAoraW4gYSBVTkMgc3R5bGUgZGV2aWNlIG5hbWUuICAgSW1wbGVtZW50YXRpb24gb2YgcmVhZHBhZ2Uvd3JpdGVwYWdlIHN0YXJ0ZWQuCisKK1ZlcnNpb24gMC41MAorLS0tLS0tLS0tLS0tCitGaXggaW50ZXJtaXR0ZW50IHByb2JsZW0gd2l0aCBpbmNvcnJlY3Qgc21iIGhlYWRlciBjaGVja2luZyBvbiBiYWRseSAKK2ZyYWdtZW50ZWQgdGNwIHJlc3BvbnNlcworCitWZXJzaW9uIDAuNDkKKy0tLS0tLS0tLS0tLQorRml4ZXMgdG8gc2V0dGluZyBvZiBhbGxvY2F0aW9uIHNpemUgYW5kIGZpbGUgc2l6ZS4KKworVmVyc2lvbiAwLjQ4CistLS0tLS0tLS0tLS0KK1ZhcmlvdXMgMi41LjM4IGZpeGVzLiAgTm93IHdvcmtzIG9uIDIuNS4zOAorCitWZXJzaW9uIDAuNDcKKy0tLS0tLS0tLS0tLQorUHJlcGFyZSBmb3IgMi41IGtlcm5lbCBtZXJnZS4gIFJlbW92ZSBpZmRlZnMuCisKK1ZlcnNpb24gMC40NgorLS0tLS0tLS0tLS0tCitTb2NrZXQgYnVmZmVyIG1hbmFnZW1lbnQgZml4ZXMuICBGaXggZHVhbCBmcmVlLgorCitWZXJzaW9uIDAuNDUKKy0tLS0tLS0tLS0tLQorVmFyaW91cyBiaWcgZW5kaWFuIGZpeGVzIGZvciBoYXJkbGlua3MgYW5kIHN5bWxpbmtzIGFuZCBhbHNvIGZvciBkZnMuCisKK1ZlcnNpb24gMC40NAorLS0tLS0tLS0tLS0tCitWYXJpb3VzIGJpZyBlbmRpYW4gZml4ZXMgZm9yIHNlcnZlcnMgd2l0aCBVbml4IGV4dGVuc2lvbnMgc3VjaCBhcyBTYW1iYQorCitWZXJzaW9uIDAuNDMKKy0tLS0tLS0tLS0tLQorVmFyaW91cyBGaW5kTmV4dCBmaXhlcyBmb3IgaW5jb3JyZWN0IGZpbGVuYW1lcyBvbiBsYXJnZSBkaXJlY3Rvcnkgc2VhcmNoZXMgb24gYmlnIGVuZGlhbgorY2xpZW50cy4gIGJhc2ljIHBvc2l4IGZpbGUgaS9vIHRlc3RzIG5vdyB3b3JrIG9uIGJpZyBlbmRpYW4gbWFjaGluZXMsIG5vdCBqdXN0IGxlCisKK1ZlcnNpb24gMC40MgorLS0tLS0tLS0tLS0tCitTZXNzaW9uU2V0dXAgYW5kIE5lZ290aWF0ZVByb3RvY29sIG5vdyB3b3JrIGZyb20gQmlnIEVuZGlhbiBtYWNoaW5lcy4KK1ZhcmlvdXMgQmlnIEVuZGlhbiBmaXhlcyBmb3VuZCBkdXJpbmcgdGVzdGluZyBvbiB0aGUgTGludXggb24gMzkwLiAgVmFyaW91cyBmaXhlcyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyCit2ZXJzaW9ucyBvZiAyLjQga2VybmVsIChub3cgYnVpbGRzIGFuZCB3b3JrcyBhZ2FpbiBvbiBrZXJuZWxzIGF0IGxlYXN0IGFzIGVhcmx5IGFzIDIuNC43KS4KKworVmVyc2lvbiAwLjQxCistLS0tLS0tLS0tLS0KK1ZhcmlvdXMgbWlub3IgZml4ZXMgZm9yIENvbm5lY3RhdGhvbiBQb3NpeCAiYmFzaWMiIGZpbGUgaS9vIHRlc3Qgc3VpdGUuICBEaXJlY3RvcnkgY2FjaGluZyBmaXhlZCBzbyBoYXJkbGlua2VkCitmaWxlcyBub3cgcmV0dXJuIHRoZSBjb3JyZWN0IHJ1bWJlciBvZiBsaW5rcyBvbiBmc3RhdCBhcyB0aGV5IGFyZSByZXBlYXRlZGx5IGxpbmtlZCBhbmQgdW5saW5rZWQuCisKK1ZlcnNpb24gMC40MAorLS0tLS0tLS0tLS0tCitJbXBsZW1lbnRlZCAiUmF3IiAoaS5lLiBub3QgZW5jYXBzdWxhdGVkIGluIFNQTkVHTykgTlRMTVNTUCAoaS5lLiB0aGUgU2VjdXJpdHkgUHJvdmlkZXIgSW50ZXJmYWNlIHVzZWQgdG8gbmVnb3RpYXRlCitzZXNzaW9uIGFkdmFuY2VkIHNlc3Npb24gYXV0aGVudGljYXRpb24pLiAgUmF3IE5UTE1TU1AgaXMgcHJlZmVycmVkIGJ5IFdpbmRvd3MgMjAwMCBQcm9mZXNzaW9uYWwgYW5kIFdpbmRvd3MgWFAuCitCZWdhbiBpbXBsZW1lbnRpbmcgc3VwcG9ydCBmb3IgU1BORUdPIGVuY2Fwc3VsYXRpb24gb2YgTlRMTVNTUCBiYXNlZCBzZXNzaW9uIGF1dGhlbnRpY2F0aW9uIGJsb2JzCisod2hpY2ggaXMgdGhlIG1lY2hhbmlzbSBwcmVmZXJyZWQgYnkgV2luZG93cyAyMDAwIHNlcnZlciBpbiB0aGUgYWJzZW5jZSBvZiBLZXJiZXJvcykuCisKK1ZlcnNpb24gMC4zOAorLS0tLS0tLS0tLS0tCitJbnRyb2R1Y2VkIG9wdGlvbmFsIG1vdW50IGhlbHBlciB1dGlsaXR5IG1vdW50LmNpZnMgYW5kIG1hZGUgY29yZXEgY2hhbmdlcyB0byBjaWZzIHZmcyB0byBlbmFibGUKK2l0LiBGaXhlZCBhIGZldyBidWdzIGluIHRoZSBERlMgY29kZSAoZS5nLiBiY2MgdHdvIGJ5dGVzIHRvbyBzaG9ydCBhbmQgaW5jb3JyZWN0IHVpZCBpbiBQRFUpLgorCitWZXJzaW9uIDAuMzcKKy0tLS0tLS0tLS0tLQorUmV3cm90ZSBtdWNoIG9mIGNvbm5lY3Rpb24gYW5kIG1vdW50L3VubW91bnQgbG9naWMgdG8gaGFuZGxlIGJ1Z3Mgd2l0aAorbXVsdGlwbGUgdXNlcyB0byBzYW1lIHNoYXJlLCBtdWx0aXBsZSB1c2VycyB0byBzYW1lIHNlcnZlciBldGMuCisKK1ZlcnNpb24gMC4zNgorLS0tLS0tLS0tLS0tCitGaXhlZCBtYWpvciBwcm9ibGVtIHdpdGggZGVudHJ5IGNvcnJ1cHRpb24gKG1pc3NpbmcgY2FsbCB0byBkcHV0KQorCitWZXJzaW9uIDAuMzUKKy0tLS0tLS0tLS0tLQorUmV3cml0ZSBvZiByZWFkZGlyIGNvZGUgdG8gZml4IGJ1Zy4gVmFyaW91cyBmaXhlcyBmb3IgYmlnZW5kaWFuIG1hY2hpbmVzLgorQmVnaW4gYWRkaW5nIG9wbG9jayBzdXBwb3J0LiAgTXVsdGl1c2VybW91bnQgYW5kIG9wbG9ja0VuYWJsZWQgZmxhZ3MgYWRkZWQgdG8gL3Byb2MvZnMvY2lmcworYWx0aG91Z2ggY29ycmVzcG9uZGluZyBmdW5jdGlvbiBub3QgZnVsbHkgaW1wbGVtZW50ZWQgaW4gdGhlIHZmcyB5ZXQKKworVmVyc2lvbiAwLjM0CistLS0tLS0tLS0tLS0KK0ZpeGVkIGRlbnRyeSBjYWNoaW5nIGJ1ZywgbWlzYy4gY2xlYW51cCAKKworVmVyc2lvbiAwLjMzCistLS0tLS0tLS0tLS0KK0ZpeGVkIDIuNSBzdXBwb3J0IHRvIGhhbmRsZSBidWlsZCBhbmQgY29uZmlndXJlIGNoYW5nZXMgYXMgd2VsbCBhcyBtaXNjLiAyLjUgY2hhbmdlcy4gIE5vdyBjYW4gYnVpbGQKK29uIGN1cnJlbnQgMi41IGJldGEgdmVyc2lvbiAoMi41LjI0KSBvZiB0aGUgTGludXgga2VybmVsIGFzIHdlbGwgYXMgb24gMi40IExpbnV4IGtlcm5lbHMuCitTdXBwb3J0IGZvciBTVEFUVVMgY29kZXMgKG5ld2VyIDMyIGJpdCBOVCBlcnJvciBjb2RlcykgYWRkZWQuICBERlMgc3VwcG9ydCBiZWd1biB0byBiZSBhZGRlZC4KKworVmVyc2lvbiAwLjMyCistLS0tLS0tLS0tLS0KK1VuaXggZXh0ZW5zaW9ucyAoc3ltbGluaywgcmVhZGxpbmssIGhhcmRsaW5rLCBjaG1vZCBhbmQgc29tZSBjaGdycCBhbmQgY2hvd24pIGltcGxlbWVudGVkCithbmQgdGVzdGVkIGFnYWluc3QgU2FtYmEgMi4yLjUKKworCitWZXJzaW9uIDAuMzEKKy0tLS0tLS0tLS0tLQorMSkgRml4ZWQgbG9ja3JhbmdlIHRvIGJlIGNvcnJlY3QgKGl0IHdhcyBvbmUgYnl0ZSB0b28gc2hvcnQpCisKKzIpIEZpeGVkIEdFVExLIChpLmUuIHRoZSBmY250bCBjYWxsIHRvIHRlc3QgYSByYW5nZSBvZiBieXRlcyBpbiBhIGZpbGUgdG8gc2VlIGlmIGxvY2tlZCkgdG8gY29ycmVjdGx5IAorc2hvdyByYW5nZSBhcyBsb2NrZWQgd2hlbiB0aGVyZSBpcyBhIGNvbmZsaWN0IHdpdGggYW4gZXhpc3RpbmcgbG9jay4KKworMykgZGVmYXVsdCBmaWxlIHBlcm1zIGFyZSBub3cgMjc2NyAoaW5kaWNhdGluZyBzdXBwb3J0IGZvciBtYW5kYXRvcnkgbG9ja3MpIGluc3RlYWQgb2YgNzc3IGZvciBkaXJlY3RvcmllcworaW4gbW9zdCBjYXNlcy4gIEV2ZW50dWFsbHkgd2lsbCBvZmZlciBvcHRpb25hbCBhYmlsaXR5IHRvIHF1ZXJ5IHNlcnZlciBmb3IgdGhlIGNvcnJlY3QgcGVybXMuCisKKzMpIEZpeGVkIGV2ZW50dWFsIHRyYXAgd2hlbiBtb3VudGluZyB0d2ljZSB0byBkaWZmZXJlbnQgc2hhcmVzIG9uIHRoZSBzYW1lIHNlcnZlciB3aGVuIHRoZSBmaXJzdCBzdWNjZWVkZWQgCitidXQgdGhlIHNlY29uZCBvbmUgd2FzIGludmFsaWQgYW5kIGZhaWxlZCAodGhlIHNlY29uZCBvbmUgd2FzIGluY29ycmVjdGx5IGRpc2Nvbm5lY3RpbmcgdGhlIHRjcCBhbmQgc21iCitzZXNzaW9uKSAKKworNCkgRml4ZWQgZXJyb3IgbG9nZ2luZyBvZiB2YWxpZCBtb3VudCBvcHRpb25zCisKKzUpIFJlbW92ZWQgbG9nZ2luZyBvZiBwYXNzd29yZCBmaWVsZC4KKworNikgTW92ZWQgbmVnb3RpYXRlLCB0cmVlRGlzY29ubmVjdCBhbmQgdWxvZ2dvZmZYIChvbmx5IHRDb254IGFuZCBTZXNzU2V0dXAgcmVtYWluIGluIGNvbm5lY3QuYykgdG8gY2lmc3NtYi5jCithbmQgY2xlYW5lZCB0aGVtIHVwIGFuZCBtYWRlIHRoZW0gbW9yZSBjb25zaXN0ZW50IHdpdGggb3RoZXIgY2lmcyBmdW5jdGlvbnMuIAorCis3KSBTZXJ2ZXIgc3VwcG9ydCBmb3IgVW5peCBleHRlbnNpb25zIGlzIG5vdyBmdWxseSBkZXRlY3RlZCBhbmQgRmluZEZpcnN0IGlzIGltcGxlbWVudGVkIGJvdGggd2F5cyAKKyh3aXRoIG9yIHdpdGhvdXQgVW5peCBleGVudGlvbnMpIGJ1dCBGaW5kTmV4dCBhbmQgUXVlcnlQYXRoSW5mbyB3aXRoIHRoZSBVbml4IGV4dGVuc2lvbnMgYXJlIG5vdCBjb21wbGV0ZWQsCitub3IgaXMgdGhlIHN5bWxpbmsgc3VwcG9ydCB1c2luZyB0aGUgVW5peCBleHRlbnNpb25zCisKKzgpIFN0YXJ0ZWQgYWRkaW5nIHRoZSByZWFkbGluayBhbmQgZm9sbG93X2xpbmsgY29kZSAKKworVmVyc2lvbiAwLjMgCistLS0tLS0tLS0tLQorSW5pdGlhbCBkcm9wCisKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvTWFrZWZpbGUgYi9mcy9jaWZzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczODQ5NDcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jaWZzL01ha2VmaWxlCkBAIC0wLDAgKzEsNiBAQAorIworIyBNYWtlZmlsZSBmb3IgTGludXggQ0lGUyBWRlMgY2xpZW50IAorIworb2JqLSQoQ09ORklHX0NJRlMpICs9IGNpZnMubworCitjaWZzLW9ianMgOj0gY2lmc2ZzLm8gY2lmc3NtYi5vIGNpZnNfZGVidWcubyBjb25uZWN0Lm8gZGlyLm8gZmlsZS5vIGlub2RlLm8gbGluay5vIG1pc2MubyBuZXRtaXNjLm8gc21iZGVzLm8gc21iZW5jcnlwdC5vIHRyYW5zcG9ydC5vIGFzbjEubyBtZDQubyBtZDUubyBjaWZzX3VuaWNvZGUubyBudGVyci5vIHhhdHRyLm8gY2lmc2VuY3J5cHQubyBmY250bC5vIHJlYWRkaXIubyBpb2N0bC5vCmRpZmYgLS1naXQgYS9mcy9jaWZzL1JFQURNRSBiL2ZzL2NpZnMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMjBlZGMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jaWZzL1JFQURNRQpAQCAtMCwwICsxLDQ3NSBAQAorVGhlIENJRlMgVkZTIHN1cHBvcnQgZm9yIExpbnV4IHN1cHBvcnRzIG1hbnkgYWR2YW5jZWQgbmV0d29yayBmaWxlc3lzdGVtIAorZmVhdHVyZXMgc3VjaCBhcyBoZWlyYXJjaGljYWwgZGZzIGxpa2UgbmFtZXNwYWNlLCBoYXJkbGlua3MsIGxvY2tpbmcgYW5kIG1vcmUuICAKK0l0IHdhcyBkZXNpZ25lZCB0byBjb21wbHkgd2l0aCB0aGUgU05JQSBDSUZTIFRlY2huaWNhbCBSZWZlcmVuY2UgKHdoaWNoIAorc3VwZXJzZWRlcyB0aGUgMTk5MiBYL09wZW4gU01CIFN0YW5kYXJkKSBhcyB3ZWxsIGFzIHRvIHBlcmZvcm0gYmVzdCBwcmFjdGljZSAKK3ByYWN0aWNhbCBpbnRlcm9wZXJhYmlsaXR5IHdpdGggV2luZG93cyAyMDAwLCBXaW5kb3dzIFhQLCBTYW1iYSBhbmQgZXF1aXZhbGVudCAKK3NlcnZlcnMuICAKKworRm9yIHF1ZXN0aW9ucyBvciBidWcgcmVwb3J0cyBwbGVhc2UgY29udGFjdDoKKyAgICBzZnJlbmNoQHNhbWJhLm9yZyAoc2ZyZW5jaEB1cy5pYm0uY29tKSAKKworQnVpbGQgaW5zdHJ1Y3Rpb25zOgorPT09PT09PT09PT09PT09PT09CitGb3IgTGludXggMi40OgorMSkgR2V0IHRoZSBrZXJuZWwgc291cmNlIChlLmcuZnJvbSBodHRwOi8vd3d3Lmtlcm5lbC5vcmcpCithbmQgZG93bmxvYWQgdGhlIGNpZnMgdmZzIHNvdXJjZSAoc2VlIHRoZSBwcm9qZWN0IHBhZ2UKK2F0IGh0dHA6Ly91czEuc2FtYmEub3JnL3NhbWJhL0xpbnV4X0NJRlNfY2xpZW50Lmh0bWwpCithbmQgY2hhbmdlIGRpcmVjdG9yeSBpbnRvIHRoZSB0b3Agb2YgdGhlIGtlcm5lbCBkaXJlY3RvcnkKK3RoZW4gcGF0Y2ggdGhlIGtlcm5lbCAoZS5nLiAicGF0Y2ggLXAxIDwgY2lmc18yNC5wYXRjaCIpIAordG8gYWRkIHRoZSBjaWZzIHZmcyB0byB5b3VyIGtlcm5lbCBjb25maWd1cmUgb3B0aW9ucyBpZgoraXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gYWRkZWQgKGUuZy4gY3VycmVudCBTdVNFIGFuZCBVTAordXNlcnMgZG8gbm90IG5lZWQgdG8gYXBwbHkgdGhlIGNpZnNfMjQucGF0Y2ggc2luY2UgdGhlIGNpZnMgdmZzIGlzCithbHJlYWR5IGluIHRoZSBrZXJuZWwgY29uZmlndXJlIG1lbnUpIGFuZCB0aGVuCitta2RpciBsaW51eC9mcy9jaWZzIGFuZCB0aGVuIGNvcHkgdGhlIGN1cnJlbnQgY2lmcyB2ZnMgZmlsZXMgZnJvbQordGhlIGNpZnMgZG93bmxvYWQgdG8geW91ciBrZXJuZWwgYnVpbGQgZGlyZWN0b3J5IGUuZy4KKworCWNwIDxjaWZzX2Rvd25sb2FkX2Rpcj4vZnMvY2lmcy8qIHRvIDxrZXJuZWxfZG93bmxvYWRfZGlyPi9mcy9jaWZzCisJCisyKSBtYWtlIG1lbnVjb25maWcgKG9yIG1ha2UgeGNvbmZpZykKKzMpIHNlbGVjdCBjaWZzIGZyb20gd2l0aGluIHRoZSBuZXR3b3JrIGZpbGVzeXN0ZW0gY2hvaWNlcworNCkgc2F2ZSBhbmQgZXhpdAorNSkgbWFrZSBkZXAKKzYpIG1ha2UgbW9kdWxlcyAob3IgIm1ha2UiIGlmIENJRlMgVkZTIG5vdCB0byBiZSBidWlsdCBhcyBhIG1vZHVsZSkKKworRm9yIExpbnV4IDIuNjoKKzEpIERvd25sb2FkIHRoZSBrZXJuZWwgKGUuZy4gZnJvbSBodHRwOi8vd3d3Lmtlcm5lbC5vcmcgb3IgZnJvbSBiaXRrZWVwZXIKK2F0IGJrOi8vbGludXguYmtiaXRzLm5ldC9saW51eC0yLjUpIGFuZCBjaGFuZ2UgZGlyZWN0b3J5IGludG8gdGhlIHRvcAorb2YgdGhlIGtlcm5lbCBkaXJlY3RvcnkgdHJlZSAoZS5nLiAvdXNyL3NyYy9saW51eC0yLjUuNzMpCisyKSBtYWtlIG1lbnVjb25maWcgKG9yIG1ha2UgeGNvbmZpZykKKzMpIHNlbGVjdCBjaWZzIGZyb20gd2l0aGluIHRoZSBuZXR3b3JrIGZpbGVzeXN0ZW0gY2hvaWNlcworNCkgc2F2ZSBhbmQgZXhpdAorNSkgbWFrZQorCisKK0luc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnM6Cis9PT09PT09PT09PT09PT09PT09PT09PT09CitJZiB5b3UgaGF2ZSBidWlsdCB0aGUgQ0lGUyB2ZnMgYXMgbW9kdWxlIChzdWNjZXNzZnVsbHkpIHNpbXBseQordHlwZSAibWFrZSBtb2R1bGVzX2luc3RhbGwiIChvciBpZiB5b3UgcHJlZmVyLCBtYW51YWxseSBjb3B5IHRoZSBmaWxlIHRvCit0aGUgbW9kdWxlcyBkaXJlY3RvcnkgZS5nLiAvbGliL21vZHVsZXMvMi40LjEwLTRHQi9rZXJuZWwvZnMvY2lmcy9jaWZzLm8pLgorCitJZiB5b3UgaGF2ZSBidWlsdCB0aGUgQ0lGUyB2ZnMgaW50byB0aGUga2VybmVsIGl0c2VsZiwgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMKK2ZvciB5b3VyIGRpc3RyaWJ1dGlvbiBvbiBob3cgdG8gaW5zdGFsbCBhIG5ldyBrZXJuZWwgKHVzdWFsbHkgeW91Cit3b3VsZCBzaW1wbHkgdHlwZSAibWFrZSBpbnN0YWxsIikuCisKK0lmIHlvdSBkbyBub3QgaGF2ZSB0aGUgdXRpbGl0eSBtb3VudC5jaWZzIChpbiB0aGUgU2FtYmEgMy4wIHNvdXJjZSB0cmVlIGFuZCBvbiAKK3RoZSBDSUZTIFZGUyB3ZWIgc2l0ZSkgY29weSBpdCB0byB0aGUgc2FtZSBkaXJlY3RvcnkgaW4gd2hpY2ggbW91bnQuc21iZnMgYW5kIAorc2ltaWxhciBmaWxlcyByZXNpZGUgKHVzdWFsbHkgL3NiaW4pLiAgQWx0aG91Z2ggdGhlIGhlbHBlciBzb2Z0d2FyZSBpcyBub3QgIAorcmVxdWlyZWQsIG1vdW50LmNpZnMgaXMgcmVjb21tZW5kZWQuICBFdmVudHVhbGx5IHRoZSBTYW1iYSAzLjAgdXRpbGl0eSBwcm9ncmFtIAorIm5ldCIgbWF5IGFsc28gYmUgaGVscGZ1bCBzaW5jZSBpdCBtYXkgc29tZWRheSBwcm92aWRlIGVhc2llciBtb3VudCBzeW50YXggZm9yCit1c2VycyB3aG8gYXJlIHVzZWQgdG8gV2luZG93cyBlLmcuICBuZXQgdXNlIDxtb3VudCBwb2ludD4gPFVOQyBuYW1lIG9yIGNpZnMgVVJMPgorTm90ZSB0aGF0IHJ1bm5pbmcgdGhlIFdpbmJpbmQgcGFtL25zcyBtb2R1bGUgKGxvZ29uIHNlcnZpY2UpIG9uIGFsbCBvZiB5b3VyCitMaW51eCBjbGllbnRzIGlzIHVzZWZ1bCBpbiBtYXBwaW5nIFVpZHMgYW5kIEdpZHMgY29uc2lzdGVudGx5IGFjcm9zcyB0aGUKK2RvbWFpbiB0byB0aGUgcHJvcGVyIG5ldHdvcmsgdXNlci4gIFRoZSBtb3VudC5jaWZzIG1vdW50IGhlbHBlciBjYW4gYmUKK3RyaXZpYWxseSBidWlsdCBmcm9tIFNhbWJhIDMuMCBvciBsYXRlciBzb3VyY2UgZS5nLiBieSBleGVjdXRpbmc6CisKKwlnY2Mgc2FtYmEvc291cmNlL2NsaWVudC9tb3VudC5jaWZzLmMgLW8gbW91bnQuY2lmcworCitJZiBjaWZzIGlzIGJ1aWx0IGFzIGEgbW9kdWxlLCB0aGVuIHRoZSBzaXplIGFuZCBudW1iZXIgb2YgbmV0d29yayBidWZmZXJzCithbmQgbWF4aW11bSBudW1iZXIgb2Ygc2ltdWx0YW5lb3VzIHJlcXVlc3RzIHRvIG9uZSBzZXJ2ZXIgY2FuIGJlIGNvbmZpZ3VyZWQuCitDaGFuZ2luZyB0aGVzZSBmcm9tIHRoZWlyIGRlZmF1bHRzIGlzIG5vdCByZWNvbW1lbmRlZC4gQnkgZXhlY3V0aW5nIG1vZGluZm8KKwltb2RpbmZvIGtlcm5lbC9mcy9jaWZzL2NpZnMua28KK29uIGtlcm5lbC9mcy9jaWZzL2NpZnMua28gdGhlIGxpc3Qgb2YgY29uZmlndXJhdGlvbiBjaGFuZ2VzIHRoYXQgY2FuIGJlIG1hZGUKK2F0IG1vZHVsZSBpbml0aWFsaXphdGlvbiB0aW1lIChieSBydW5uaW5nIGluc21vZCBjaWZzLmtvKSBjYW4gYmUgc2Vlbi4KKworQWxsb3dpbmcgVXNlciBNb3VudHMKKz09PT09PT09PT09PT09PT09PT09CitUbyBwZXJtaXQgdXNlcnMgdG8gbW91bnQgYW5kIHVubW91bnQgb3ZlciBkaXJlY3RvcmllcyB0aGV5IG93biBpcyBwb3NzaWJsZQord2l0aCB0aGUgY2lmcyB2ZnMuICBBIHdheSB0byBlbmFibGUgc3VjaCBtb3VudGluZyBpcyB0byBtYXJrIHRoZSBtb3VudC5jaWZzCit1dGlsaXR5IGFzIHN1aWQgKGUuZy4gImNobW9kICtzIC9zYmluL21vdW50L2NpZnMpLiBUbyBlbmFibGUgdXNlcnMgdG8gCit1bW91bnQgc2hhcmVzIHRoZXkgbW91bnQgcmVxdWlyZXMKKzEpIG1vdW50LmNpZnMgdmVyc2lvbiAxLjQgb3IgbGF0ZXIKKzIpIGFuIGVudHJ5IGZvciB0aGUgc2hhcmUgaW4gL2V0Yy9mc3RhYiBpbmRpY2F0aW5nIHRoYXQgYSB1c2VyIG1heQordW5tb3VudCBpdCBlLmcuCisvL3NlcnZlci91c2Vyc2hhcmVuYW1lICAvbW50L3VzZXJuYW1lIGNpZnMgdXNlciAwIDAKKworTm90ZSB0aGF0IHdoZW4gdGhlIG1vdW50LmNpZnMgdXRpbGl0eSBpcyBydW4gc3VpZCAoYWxsb3dpbmcgdXNlciBtb3VudHMpLCAKK2luIG9yZGVyIHRvIHJlZHVjZSByaXNrcywgdGhlICJub3N1aWQiIG1vdW50IGZsYWcgaXMgcGFzc2VkIGluIG9uIG1vdW50IHRvCitkaXNhbGxvdyBleGVjdXRpb24gb2YgYW4gc3VpZCBwcm9ncmFtIG1vdW50ZWQgb24gdGhlIHJlbW90ZSB0YXJnZXQuCitXaGVuIG1vdW50IGlzIGV4ZWN1dGVkIGFzIHJvb3QsIG5vc3VpZCBpcyBub3QgcGFzc2VkIGluIGJ5IGRlZmF1bHQsCithbmQgZXhlY3V0aW9uIG9mIHN1aWQgcHJvZ3JhbXMgb24gdGhlIHJlbW90ZSB0YXJnZXQgd291bGQgYmUgZW5hYmxlZAorYnkgZGVmYXVsdC4gVGhpcyBjYW4gYmUgY2hhbmdlZCwgYXMgd2l0aCBuZnMgYW5kIG90aGVyIGZpbGVzeXN0ZW1zLCAKK2J5IHNpbXBseSBzcGVjaWZ5aW5nICJub3N1aWQiIGFtb25nIHRoZSBtb3VudCBvcHRpb25zLiBGb3IgdXNlciBtb3VudHMgCit0aG91Z2ggdG8gYmUgYWJsZSB0byBwYXNzIHRoZSBzdWlkIGZsYWcgdG8gbW91bnQgcmVxdWlyZXMgcmVidWlsZGluZyAKK21vdW50LmNpZnMgd2l0aCB0aGUgZm9sbG93aW5nIGZsYWc6IAorIAorICAgICAgICBnY2Mgc2FtYmEvc291cmNlL2NsaWVudC9tb3VudC5jaWZzLmMgLURDSUZTX0FMTE9XX1VTUl9TVUlEIC1vIG1vdW50LmNpZnMKKworVGhlcmUgaXMgYSBjb3JyZXNwb25kaW5nIG1hbnVhbCBwYWdlIGZvciBjaWZzIG1vdW50aW5nIGluIHRoZSBTYW1iYSAzLjAgYW5kCitsYXRlciBzb3VyY2UgdHJlZSBpbiBkb2NzL21hbnBhZ2VzL21vdW50LmNpZnMuOCAKKworU2FtYmEgQ29uc2lkZXJhdGlvbnMgCis9PT09PT09PT09PT09PT09PT09PSAKK1RvIGdldCB0aGUgbWF4aW11bSBiZW5lZml0IGZyb20gdGhlIENJRlMgVkZTLCB3ZSByZWNvbW1lbmQgdXNpbmcgYSBzZXJ2ZXIgdGhhdCAKK3N1cHBvcnRzIHRoZSBTTklBIENJRlMgVW5peCBFeHRlbnNpb25zIHN0YW5kYXJkIChlLmcuICBTYW1iYSAyLjIuNSBvciBsYXRlciBvciAKK1NhbWJhIDMuMCkgYnV0IHRoZSBDSUZTIHZmcyB3b3JrcyBmaW5lIHdpdGggYSB3aWRlIHZhcmlldHkgb2YgQ0lGUyBzZXJ2ZXJzLiAgCitOb3RlIHRoYXQgdWlkLCBnaWQgYW5kIGZpbGUgcGVybWlzc2lvbnMgd2lsbCBkaXNwbGF5IGRlZmF1bHQgdmFsdWVzIGlmIHlvdSBkbyAKK25vdCBoYXZlIGEgc2VydmVyIHRoYXQgc3VwcG9ydHMgdGhlIFVuaXggZXh0ZW5zaW9ucyBmb3IgQ0lGUyAoc3VjaCBhcyBTYW1iYSAKKzIuMi41IG9yIGxhdGVyKS4gIFRvIGVuYWJsZSB0aGUgVW5peCBDSUZTIEV4dGVuc2lvbnMgaW4gdGhlIFNhbWJhIHNlcnZlciwgYWRkIAordGhlIGxpbmU6IAorCisJdW5peCBleHRlbnNpb25zID0geWVzCisJCit0byB5b3VyIHNtYi5jb25mIGZpbGUgb24gdGhlIHNlcnZlci4gIE5vdGUgdGhhdCB0aGUgZm9sbG93aW5nIHNtYi5jb25mIHNldHRpbmdzIAorYXJlIGFsc28gdXNlZnVsIChvbiB0aGUgU2FtYmEgc2VydmVyKSB3aGVuIHRoZSBtYWpvcml0eSBvZiBjbGllbnRzIGFyZSBVbml4IG9yIAorTGludXg6IAorCisJY2FzZSBzZW5zaXRpdmUgPSB5ZXMKKwlkZWxldGUgcmVhZG9ubHkgPSB5ZXMgCisJZWEgc3VwcG9ydCA9IHllcworCitOb3RlIHRoYXQgc2VydmVyIGVhIHN1cHBvcnQgaXMgcmVxdWlyZWQgZm9yIHN1cHBvcnRpbmcgeGF0dHJzIGZyb20gdGhlIExpbnV4CitjaWZzIGNsaWVudCwgYW5kIHRoYXQgRUEgc3VwcG9ydCBpcyBwcmVzZW50IGluIGxhdGVyIHZlcnNpb25zIG9mIFNhbWJhIChlLmcuIAorMy4wLjYgYW5kIGxhdGVyIChhbHNvIEVBIHN1cHBvcnQgd29ya3MgaW4gYWxsIHZlcnNpb25zIG9mIFdpbmRvd3MsIGF0IGxlYXN0IHRvCitzaGFyZXMgb24gTlRGUyBmaWxlc3lzdGVtcykuICBFeHRlbmRlZCBBdHRyaWJ1dGUgKHhhdHRyKSBzdXBwb3J0IGlzIGFuIG9wdGlvbmFsCitmZWF0dXJlIG9mIG1vc3QgTGludXggZmlsZXN5c3RlbXMgd2hpY2ggbWF5IHJlcXVpcmUgZW5hYmxpbmcgdmlhCittYWtlIG1lbnVjb25maWcuIENsaWVudCBzdXBwb3J0IGZvciBleHRlbmRlZCBhdHRyaWJ1dGVzICh1c2VyIHhhdHRyKSBjYW4gYmUKK2Rpc2FibGVkIG9uIGEgcGVyLW1vdW50IGJhc2lzIGJ5IHNwZWNpZnlpbmcgIm5vdXNlcl94YXR0ciIgb24gbW91bnQuCisKK1RoZSBDSUZTIGNsaWVudCBjYW4gZ2V0IGFuZCBzZXQgUE9TSVggQUNMcyAoZ2V0ZmFjbCwgc2V0ZmFjbCkgdG8gU2FtYmEgc2VydmVycwordmVyc2lvbiAzLjEwIGFuZCBsYXRlci4gIFNldHRpbmcgUE9TSVggQUNMcyByZXF1aXJlcyBlbmFibGluZyBib3RoIFhBVFRSIGFuZCAKK3RoZW4gUE9TSVggc3VwcG9ydCBpbiB0aGUgQ0lGUyBjb25maWd1cmF0aW9uIG9wdGlvbnMgd2hlbiBidWlsZGluZyB0aGUgY2lmcworbW9kdWxlLiAgUE9TSVggQUNMIHN1cHBvcnQgY2FuIGJlIGRpc2FibGVkIG9uIGEgcGVyIG1vdW50IGJhc2ljIGJ5IHNwZWNpZnlpbmcKKyJub2FjbCIgb24gbW91bnQuCisgCitTb21lIGFkbWluaXN0cmF0b3JzIG1heSB3YW50IHRvIGNoYW5nZSBTYW1iYSdzIHNtYi5jb25mICJtYXAgYXJjaGl2ZSIgYW5kIAorImNyZWF0ZSBtYXNrIiBwYXJhbWV0ZXJzIGZyb20gdGhlIGRlZmF1bHQuICBVbmxlc3MgdGhlIGNyZWF0ZSBtYXNrIGlzIGNoYW5nZWQKK25ld2x5IGNyZWF0ZWQgZmlsZXMgY2FuIGVuZCB1cCB3aXRoIGFuIHVubmVjZXNzYXJpbHkgcmVzdHJpY3RpdmUgZGVmYXVsdCBtb2RlLAord2hpY2ggbWF5IG5vdCBiZSB3aGF0IHlvdSB3YW50LCBhbHRob3VnaCBpZiB0aGUgQ0lGUyBVbml4IGV4dGVuc2lvbnMgYXJlCitlbmFibGVkIG9uIHRoZSBzZXJ2ZXIgYW5kIGNsaWVudCwgc3Vic2VxdWVudCBzZXRhdHRyIGNhbGxzIChlLmcuIGNobW9kKSBjYW4KK2ZpeCB0aGUgbW9kZS4gIE5vdGUgdGhhdCBjcmVhdGluZyBzcGVjaWFsIGRldmljZXMgKG1rbm9kKSByZW1vdGVseSAKK21heSByZXF1aXJlIHNwZWNpZnlpbmcgYSBta2RldiBmdW5jdGlvbiB0byBTYW1iYSBpZiB5b3UgYXJlIG5vdCB1c2luZyAKK1NhbWJhIDMuMC42IG9yIGxhdGVyLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlc2Ugc2VlIHRoZSBtYW51YWwgcGFnZXMKKygibWFuIHNtYi5jb25mIikgb24gdGhlIFNhbWJhIHNlcnZlciBzeXN0ZW0uICBOb3RlIHRoYXQgdGhlIGNpZnMgdmZzLAordW5saWtlIHRoZSBzbWJmcyB2ZnMsIGRvZXMgbm90IHJlYWQgdGhlIHNtYi5jb25mIG9uIHRoZSBjbGllbnQgc3lzdGVtIAorKHRoZSBmZXcgb3B0aW9uYWwgc2V0dGluZ3MgYXJlIHBhc3NlZCBpbiBvbiBtb3VudCB2aWEgLW8gcGFyYW1ldGVycyBpbnN0ZWFkKS4gIAorTm90ZSB0aGF0IFNhbWJhIDIuMi43IG9yIGxhdGVyIGluY2x1ZGVzIGEgZml4IHRoYXQgYWxsb3dzIHRoZSBDSUZTIFZGUyB0byBkZWxldGUKK29wZW4gZmlsZXMgKHJlcXVpcmVkIGZvciBzdHJpY3QgUE9TSVggY29tcGxpYW5jZSkuICBXaW5kb3dzIFNlcnZlcnMgYWxyZWFkeSAKK3N1cHBvcnRlZCB0aGlzIGZlYXR1cmUuIFNhbWJhIHNlcnZlciBkb2VzIG5vdCBhbGxvdyBzeW1saW5rcyB0aGF0IHJlZmVyIHRvIGZpbGVzCitvdXRzaWRlIG9mIHRoZSBzaGFyZSwgc28gaW4gU2FtYmEgdmVyc2lvbnMgcHJpb3IgdG8gMy4wLjYsIG1vc3Qgc3ltbGlua3MgdG8KK2ZpbGVzIHdpdGggYWJzb2x1dGUgcGF0aHMgKGllIGJlZ2lubmluZyB3aXRoIHNsYXNoKSBzdWNoIGFzOgorCSBsbiAtcyAvbW50L2ZvbyBiYXIKK3dvdWxkIGJlIGZvcmJpZGRlbi4gU2FtYmEgMy4wLjYgc2VydmVyIG9yIGxhdGVyIGluY2x1ZGVzIHRoZSBhYmlsaXR5IHRvIGNyZWF0ZSAKK3N1Y2ggc3ltbGlua3Mgc2FmZWx5IGJ5IGNvbnZlcnRpbmcgdW5zYWZlIHN5bWxpbmtzIChpZSBzeW1saW5rcyB0byBzZXJ2ZXIgCitmaWxlcyB0aGF0IGFyZSBvdXRzaWRlIG9mIHRoZSBzaGFyZSkgdG8gYSBzYW1iYSBzcGVjaWZpYyBmb3JtYXQgb24gdGhlIHNlcnZlcgordGhhdCBpcyBpZ25vcmVkIGJ5IGxvY2FsIHNlcnZlciBhcHBsaWNhdGlvbnMgYW5kIG5vbi1jaWZzIGNsaWVudHMgYW5kIHRoYXQgd2lsbAorbm90IGJlIHRyYXZlcnNlZCBieSB0aGUgU2FtYmEgc2VydmVyKS4gIFRoaXMgaXMgb3BhcXVlIHRvIHRoZSBMaW51eCBjbGllbnQKK2FwcGxpY2F0aW9uIHVzaW5nIHRoZSBjaWZzIHZmcy4gQWJzb2x1dGUgc3ltbGlua3Mgd2lsbCB3b3JrIHRvIFNhbWJhIDMuMC41IG9yCitsYXRlciwgYnV0IG9ubHkgZm9yIHJlbW90ZSBjbGllbnRzIHVzaW5nIHRoZSBDSUZTIFVuaXggZXh0ZW5zaW9ucywgYW5kIHdpbGwKK2JlIGludmlzYmlsZSB0byBXaW5kb3dzIGNsaWVudHMgYW5kIHR5cGljYWxseSB3aWxsIG5vdCBhZmZlY3QgbG9jYWwKK2FwcGxpY2F0aW9ucyBydW5uaW5nIG9uIHRoZSBzYW1lIHNlcnZlciBhcyBTYW1iYS4gIAorCitVc2UgaW5zdHJ1Y3Rpb25zOgorPT09PT09PT09PT09PT09PQorT25jZSB0aGUgQ0lGUyBWRlMgc3VwcG9ydCBpcyBidWlsdCBpbnRvIHRoZSBrZXJuZWwgb3IgaW5zdGFsbGVkIGFzIGEgbW9kdWxlIAorKGNpZnMubyksIHlvdSBjYW4gdXNlIG1vdW50IHN5bnRheCBsaWtlIHRoZSBmb2xsb3dpbmcgdG8gYWNjZXNzIFNhbWJhIG9yIFdpbmRvd3MgCitzZXJ2ZXJzOiAKKworICBtb3VudCAtdCBjaWZzIC8vOS41My4yMTYuMTEvZSQgL21udCAtbyB1c2VyPW15bmFtZSxwYXNzPW15cGFzc3dvcmQKKworQmVmb3JlIC1vIHRoZSBvcHRpb24gLXYgbWF5IGJlIHNwZWNpZmllZCB0byBtYWtlIHRoZSBtb3VudC5jaWZzCittb3VudCBoZWxwZXIgZGlzcGxheSB0aGUgbW91bnQgc3RlcHMgbW9yZSB2ZXJib3NlbHkuICAKK0FmdGVyIC1vIHRoZSBmb2xsb3dpbmcgY29tbW9ubHkgdXNlZCBjaWZzIHZmcyBzcGVjaWZpYyBvcHRpb25zCithcmUgc3VwcG9ydGVkOgorCisgIHVzZXI9PHVzZXJuYW1lPgorICBwYXNzPTxwYXNzd29yZD4KKyAgZG9tYWluPTxkb21haW4gbmFtZT4KKyAgCitPdGhlciBjaWZzIG1vdW50IG9wdGlvbnMgYXJlIGRlc2NyaWJlZCBiZWxvdy4gIFVzZSBvZiBUQ1AgbmFtZXMgKGluIGFkZGl0aW9uIHRvCitpcCBhZGRyZXNzZXMpIGlzIGF2YWlsYWJsZSBpZiB0aGUgbW91bnQgaGVscGVyIChtb3VudC5jaWZzKSBpcyBpbnN0YWxsZWQuIElmCit5b3UgZG8gbm90IHRydXN0IHRoZSBzZXJ2ZXIgdG8gd2hpY2ggYXJlIG1vdW50ZWQsIG9yIGlmIHlvdSBkbyBub3QgaGF2ZQorY2lmcyBzaWduaW5nIGVuYWJsZWQgKGFuZCB0aGUgcGh5c2ljYWwgbmV0d29yayBpcyBpbnNlY3VyZSksIGNvbnNpZGVyIHVzZQorb2YgdGhlIHN0YW5kYXJkIG1vdW50IG9wdGlvbnMgIm5vZXhlYyIgYW5kICJub3N1aWQiIHRvIHJlZHVjZSB0aGUgcmlzayBvZiAKK3J1bm5pbmcgYW4gYWx0ZXJlZCBiaW5hcnkgb24geW91ciBsb2NhbCBzeXN0ZW0gKGRvd25sb2FkZWQgZnJvbSBhIGhvc3RpbGUgc2VydmVyCitvciBhbHRlcmVkIGJ5IGEgaG9zdGlsZSByb3V0ZXIpLgorCitBbHRob3VnaCBtb3VudGluZyB1c2luZyBmb3JtYXQgY29ycmVzcG9uZGluZyB0byB0aGUgQ0lGUyBVUkwgc3BlY2lmaWNhdGlvbiBpcworbm90IHBvc3NpYmxlIGluIG1vdW50LmNpZnMgeWV0LCBpdCBpcyBwb3NzaWJsZSB0byB1c2UgYW4gYWx0ZXJuYXRlIGZvcm1hdAorZm9yIHRoZSBzZXJ2ZXIgYW5kIHNoYXJlbmFtZSAod2hpY2ggaXMgc29tZXdoYXQgc2ltaWxhciB0byBORlMgc3R5bGUgbW91bnQKK3N5bnRheCkgaW5zdGVhZCBvZiB0aGUgbW9yZSB3aWRlbHkgdXNlZCBVTkMgZm9ybWF0IChpLmUuIFxcc2VydmVyXHNoYXJlKToKKyAgbW91bnQgLXQgY2lmcyB0Y3BfbmFtZV9vZl9zZXJ2ZXI6c2hhcmVfbmFtZSAvbW50IC1vIHVzZXI9bXluYW1lLHBhc3M9bXlwYXNzd2QKKworV2hlbiB1c2luZyB0aGUgbW91bnQgaGVscGVyIG1vdW50LmNpZnMsIHBhc3N3b3JkcyBtYXkgYmUgc3BlY2lmaWVkIHZpYSBhbHRlcm5hdGUKK21lY2hhbmlzbXMsIGluc3RlYWQgb2Ygc3BlY2lmeWluZyBpdCBhZnRlciAtbyB1c2luZyB0aGUgbm9ybWFsICJwYXNzPSIgc3ludGF4CitvbiB0aGUgY29tbWFuZCBsaW5lOgorMSkgQnkgaW5jbHVkaW5nIGl0IGluIGEgY3JlZGVudGlhbCBmaWxlLiBTcGVjaWZ5IGNyZWRlbnRpYWxzPWZpbGVuYW1lIGFzIG9uZQorb2YgdGhlIG1vdW50IG9wdGlvbnMuIENyZWRlbnRpYWwgZmlsZXMgY29udGFpbiB0d28gbGluZXMKKyAgICAgICAgdXNlcm5hbWU9c29tZXVzZXIKKyAgICAgICAgcGFzc3dvcmQ9eW91cl9wYXNzd29yZAorMikgQnkgc3BlY2lmeWluZyB0aGUgcGFzc3dvcmQgaW4gdGhlIFBBU1NXRCBlbnZpcm9ubWVudCB2YXJpYWJsZSAoc2ltaWxhcmx5Cit0aGUgdXNlciBuYW1lIGNhbiBiZSB0YWtlbiBmcm9tIHRoZSBVU0VSIGVudmlyb25tZW50IHZhcmlhYmxlKS4KKzMpIEJ5IHNwZWNpZnlpbmcgdGhlIHBhc3N3b3JkIGluIGEgZmlsZSBieSBuYW1lIHZpYSBQQVNTV0RfRklMRQorNCkgQnkgc3BlY2lmeWluZyB0aGUgcGFzc3dvcmQgaW4gYSBmaWxlIGJ5IGZpbGUgZGVzY3JpcHRvciB2aWEgUEFTU1dEX0ZECisKK0lmIG5vIHBhc3N3b3JkIGlzIHByb3ZpZGVkLCBtb3VudC5jaWZzIHdpbGwgcHJvbXB0IGZvciBwYXNzd29yZCBlbnRyeQorCitSZXN0cmljdGlvbnMKKz09PT09PT09PT09PQorU2VydmVycyBtdXN0IHN1cHBvcnQgdGhlIE5UTE0gU01CIGRpYWxlY3QgKHdoaWNoIGlzIHRoZSBtb3N0IHJlY2VudCwgc3VwcG9ydGVkIAorYnkgU2FtYmEgYW5kIFdpbmRvd3MgTlQgdmVyc2lvbiA0LCAyMDAwIGFuZCBYUCBhbmQgbWFueSBvdGhlciBTTUIvQ0lGUyBzZXJ2ZXJzKSAKK1NlcnZlcnMgbXVzdCBzdXBwb3J0IGVpdGhlciAicHVyZS1UQ1AiIChwb3J0IDQ0NSBUQ1AvSVAgQ0lGUyBjb25uZWN0aW9ucykgb3IgUkZDIAorMTAwMS8xMDAyIHN1cHBvcnQgZm9yICJOZXRiaW9zLU92ZXItVENQL0lQLiIgTmVpdGhlciBvZiB0aGVzZSBpcyBsaWtlbHkgdG8gYmUgYSAKK3Byb2JsZW0gYXMgbW9zdCBzZXJ2ZXJzIHN1cHBvcnQgdGhpcy4gIElQdjYgc3VwcG9ydCBpcyBwbGFubmVkIGZvciB0aGUgZnV0dXJlLAorYW5kIGlzIGFsbW9zdCBjb21wbGV0ZS4KKworVmFsaWQgZmlsZW5hbWVzIGRpZmZlciBiZXR3ZWVuIFdpbmRvd3MgYW5kIExpbnV4LiAgV2luZG93cyB0eXBpY2FsbHkgcmVzdHJpY3RzCitmaWxlbmFtZXMgd2hpY2ggY29udGFpbiBjZXJ0YWluIHJlc2VydmVkIGNoYXJhY3RlcnMgKGUuZy50aGUgY2hhcmFjdGVyIDogCit3aGljaCBpcyB1c2VkIHRvIGRlbGltaXQgdGhlIGJlZ2lubmluZyBvZiBhIHN0cmVhbSBuYW1lIGJ5IFdpbmRvd3MpLCB3aGlsZQorTGludXggYWxsb3dzIGEgc2xpZ2h0bHkgd2lkZXIgc2V0IG9mIHZhbGlkIGNoYXJhY3RlcnMgaW4gZmlsZW5hbWVzLiBXaW5kb3dzCitzZXJ2ZXJzIGNhbiByZW1hcCBzdWNoIGNoYXJhY3RlcnMgd2hlbiBhbiBleHBsaWNpdCBtYXBwaW5nIGlzIHNwZWNpZmllZCBpbgordGhlIFNlcnZlcidzIHJlZ2lzdHJ5LiAgU2FtYmEgc3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDMuMTAgd2lsbCBhbGxvdyBzdWNoIAorZmlsZW5hbWVzIChpZSB0aG9zZSB3aGljaCBjb250YWluIHZhbGlkIExpbnV4IGNoYXJhY3RlcnMsIHdoaWNoIG5vcm1hbGx5Cit3b3VsZCBiZSBmb3JiaWRkZW4gZm9yIFdpbmRvd3MvQ0lGUyBzZW1hbnRpY3MpIGFzIGxvbmcgYXMgdGhlIHNlcnZlciBpcworY29uZmlndXJlZCBmb3IgVW5peCBFeHRlbnNpb25zIChhbmQgdGhlIGNsaWVudCBoYXMgbm90IGRpc2FibGVkCisvcHJvYy9mcy9jaWZzL0xpbnV4RXh0ZW5zaW9uc0VuYWJsZWQpLgorICAKKworQ0lGUyBWRlMgTW91bnQgT3B0aW9ucworPT09PT09PT09PT09PT09PT09PT09PQorQSBwYXJ0aWFsIGxpc3Qgb2YgdGhlIHN1cHBvcnRlZCBtb3VudCBvcHRpb25zIGZvbGxvd3M6CisgIHVzZXIJCVRoZSB1c2VyIG5hbWUgdG8gdXNlIHdoZW4gdHJ5aW5nIHRvIGVzdGFibGlzaAorCQl0aGUgQ0lGUyBzZXNzaW9uLgorICBwYXNzd29yZAlUaGUgdXNlciBwYXNzd29yZC4gIElmIHRoZSBtb3VudCBoZWxwZXIgaXMKKwkJaW5zdGFsbGVkLCB0aGUgdXNlciB3aWxsIGJlIHByb21wdGVkIGZvciBwYXNzd29yZAorCQlpZiBpdCBpcyBub3Qgc3VwcGxpZWQuCisgIGlwCQlUaGUgaXAgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IHNlcnZlcgorICB1bmMJCVRoZSB0YXJnZXQgc2VydmVyIFVuaXZlcnNhbCBOZXR3b3JrIE5hbWUgKGV4cG9ydCkgdG8gCisJCW1vdW50LgkKKyAgZG9tYWluCVNldCB0aGUgU01CL0NJRlMgd29ya2dyb3VwIG5hbWUgcHJlcGVuZGVkIHRvIHRoZQorCQl1c2VybmFtZSBkdXJpbmcgQ0lGUyBzZXNzaW9uIGVzdGFibGlzaG1lbnQKKyAgdWlkCQlJZiBDSUZTIFVuaXggZXh0ZW5zaW9ucyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgc2VydmVyCisJCXRoaXMgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHVpZCBmb3IgaW5vZGVzLiBGb3IgbW91bnRzIHRvCisJCXNlcnZlcnMgd2hpY2ggZG8gc3VwcG9ydCB0aGUgQ0lGUyBVbml4IGV4dGVuc2lvbnMsIHN1Y2gKKwkJYXMgYSBwcm9wZXJseSBjb25maWd1cmVkIFNhbWJhIHNlcnZlciwgdGhlIHNlcnZlciBwcm92aWRlcworCQl0aGUgdWlkLCBnaWQgYW5kIG1vZGUuICBGb3Igc2VydmVycyB3aGljaCBkbyBub3Qgc3VwcG9ydAorCQl0aGUgVW5peCBleHRlbnNpb25zLCB0aGUgZGVmYXVsdCB1aWQgKGFuZCBnaWQpIHJldHVybmVkIG9uCisJCWxvb2t1cCBvZiBleGlzdGluZyBmaWxlcyBpcyB0aGUgdWlkIChnaWQpIG9mIHRoZSBwZXJzb24KKwkJd2hvIGV4ZWN1dGVkIHRoZSBtb3VudCAocm9vdCwgZXhjZXB0IHdoZW4gbW91bnQuY2lmcworCQlpcyBjb25maWd1cmVkIHNldHVpZCBmb3IgdXNlciBtb3VudHMpIHVubGVzcyB0aGUgInVpZD0iIAorCQkoZ2lkKSBtb3VudCBvcHRpb24gaXMgc3BlY2lmaWVkLiAgRm9yIHRoZSB1aWQgKGdpZCkgb2YgbmV3bHkKKwkJY3JlYXRlZCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMsIGllIGZpbGVzIGNyZWF0ZWQgc2luY2UgCisJCXRoZSBsYXN0IG1vdW50IG9mIHRoZSBzZXJ2ZXIgc2hhcmUsIHRoZSBleHBlY3RlZCB1aWQgCisJCShnaWQpIGlzIGNhY2hlZCBhcyBhcyBsb25nIGFzIHRoZSBpbm9kZSByZW1haW5zIGluIAorCQltZW1vcnkgb24gdGhlIGNsaWVudC4gICBBbHNvIG5vdGUgdGhhdCBwZXJtaXNzaW9uCisJCWNoZWNrcyAoYXV0aG9yaXphdGlvbiBjaGVja3MpIG9uIGFjY2Vzc2VzIHRvIGEgZmlsZSBvY2N1cgorCQlhdCB0aGUgc2VydmVyLCBidXQgdGhlcmUgYXJlIGNhc2VzIGluIHdoaWNoIGFuIGFkbWluaXN0cmF0b3IKKwkJbWF5IHdhbnQgdG8gcmVzdHJpY3QgYXQgdGhlIGNsaWVudCBhcyB3ZWxsLiAgRm9yIHRob3NlCisJCXNlcnZlcnMgd2hpY2ggZG8gbm90IHJlcG9ydCBhIHVpZC9naWQgb3duZXIKKwkJKHN1Y2ggYXMgV2luZG93cyksIHBlcm1pc3Npb25zIGNhbiBhbHNvIGJlIGNoZWNrZWQgYXQgdGhlCisJCWNsaWVudCwgYW5kIGEgY3J1ZGUgZm9ybSBvZiBjbGllbnQgc2lkZSBwZXJtaXNzaW9uIGNoZWNraW5nIAorCQljYW4gYmUgZW5hYmxlZCBieSBzcGVjaWZ5aW5nIGZpbGVfbW9kZSBhbmQgZGlyX21vZGUgb24gCisJCXRoZSBjbGllbnQKKyAgZ2lkCQlJZiBDSUZTIFVuaXggZXh0ZW5zaW9ucyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgc2VydmVyCisJCXRoaXMgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGdpZCBmb3IgaW5vZGVzLgorICBmaWxlX21vZGUgICAgIElmIENJRlMgVW5peCBleHRlbnNpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBzZXJ2ZXIKKwkJdGhpcyBvdmVycmlkZXMgdGhlIGRlZmF1bHQgbW9kZSBmb3IgZmlsZSBpbm9kZXMuCisgIGRpcl9tb2RlICAgICAgSWYgQ0lGUyBVbml4IGV4dGVuc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZlciAKKwkJdGhpcyBvdmVycmlkZXMgdGhlIGRlZmF1bHQgbW9kZSBmb3IgZGlyZWN0b3J5IGlub2Rlcy4KKyAgcG9ydAkJYXR0ZW1wdCB0byBjb250YWN0IHRoZSBzZXJ2ZXIgb24gdGhpcyB0Y3AgcG9ydCwgYmVmb3JlCisJCXRyeWluZyB0aGUgdXN1YWwgcG9ydHMgKHBvcnQgNDQ1LCB0aGVuIDEzOSkuCisgIGlvY2hhcnNldCAgICAgQ29kZXBhZ2UgdXNlZCB0byBjb252ZXJ0IGxvY2FsIHBhdGggbmFtZXMgdG8gYW5kIGZyb20KKwkJVW5pY29kZS4gVW5pY29kZSBpcyB1c2VkIGJ5IGRlZmF1bHQgZm9yIG5ldHdvcmsgcGF0aAorCQluYW1lcyBpZiB0aGUgc2VydmVyIHN1cHBvcnRzIGl0LiAgSWYgaW9jaGFyc2V0IGlzCisJCW5vdCBzcGVjaWZpZWQgdGhlbiB0aGUgbmxzX2RlZmF1bHQgc3BlY2lmaWVkCisJCWR1cmluZyB0aGUgbG9jYWwgY2xpZW50IGtlcm5lbCBidWlsZCB3aWxsIGJlIHVzZWQuCisJCUlmIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IFVuaWNvZGUsIHRoaXMgcGFyYW1ldGVyIGlzCisJCXVudXNlZC4KKyAgcnNpemUJCWRlZmF1bHQgcmVhZCBzaXplCisgIHdzaXplCQlkZWZhdWx0IHdyaXRlIHNpemUKKyAgcncJCW1vdW50IHRoZSBuZXR3b3JrIHNoYXJlIHJlYWQtd3JpdGUgKG5vdGUgdGhhdCB0aGUKKwkJc2VydmVyIG1heSBzdGlsbCBjb25zaWRlciB0aGUgc2hhcmUgcmVhZC1vbmx5KQorICBybwkJbW91bnQgbmV0d29yayBzaGFyZSByZWFkLW9ubHkKKyAgdmVyc2lvbgl1c2VkIHRvIGRpc3Rpbmd1aXNoIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUKKwkJbW91bnQgaGVscGVyIHV0aWxpdHkgKG5vdCB0eXBpY2FsbHkgbmVlZGVkKQorICBzZXAJCWlmIGZpcnN0IG1vdW50IG9wdGlvbiAoYWZ0ZXIgdGhlIC1vKSwgb3ZlcnJpZGVzCisJCXRoZSBjb21tYSBhcyB0aGUgc2VwYXJhdG9yIGJldHdlZW4gdGhlIG1vdW50CisJCXBhcm1zLiBlLmcuCisJCQktbyB1c2VyPW15bmFtZSxwYXNzd29yZD1teXBhc3N3b3JkLGRvbWFpbj1teWRvbQorCQljb3VsZCBiZSBwYXNzZWQgaW5zdGVhZCB3aXRoIHBlcmlvZCBhcyB0aGUgc2VwYXJhdG9yIGJ5CisJCQktbyBzZXA9LnVzZXI9bXluYW1lLnBhc3N3b3JkPW15cGFzc3dvcmQuZG9tYWluPW15ZG9tCisJCXRoaXMgbWlnaHQgYmUgdXNlZnVsIHdoZW4gY29tbWEgaXMgY29udGFpbmVkIHdpdGhpbiB1c2VybmFtZQorCQlvciBwYXNzd29yZCBvciBkb21haW4uIFRoaXMgb3B0aW9uIGlzIGxlc3MgaW1wb3J0YW50CisJCXdoZW4gdGhlIGNpZnMgbW91bnQgaGVscGVyIGNpZnMubW91bnQgKHZlcnNpb24gMS4xIG9yIGxhdGVyKQorCQlpcyB1c2VkLgorICBub3N1aWQgICAgICAgIERvIG5vdCBhbGxvdyByZW1vdGUgZXhlY3V0YWJsZXMgd2l0aCB0aGUgc3VpZCBiaXQgCisJCXByb2dyYW0gdG8gYmUgZXhlY3V0ZWQuICBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3IgbW91bnRzCisJCXRvIHNlcnZlcnMgc3VjaCBhcyBTYW1iYSB3aGljaCBzdXBwb3J0IHRoZSBDSUZTIFVuaXggRXh0ZW5zaW9ucy4KKwkJSWYgeW91IGRvIG5vdCB0cnVzdCB0aGUgc2VydmVycyBpbiB5b3VyIG5ldHdvcmsgKHlvdXIgbW91bnQKKwkJdGFyZ2V0cykgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3Ugc3BlY2lmeSB0aGlzIG9wdGlvbiBmb3IKKwkJZ3JlYXRlciBzZWN1cml0eS4KKyAgZXhlYwkJUGVybWl0IGV4ZWN1dGlvbiBvZiBiaW5hcmllcyBvbiB0aGUgbW91bnQuCisgIG5vZXhlYwlEbyBub3QgcGVybWl0IGV4ZWN1dGlvbiBvZiBiaW5hcmllcyBvbiB0aGUgbW91bnQuCisgIGRldgkJUmVjb2duaXplIGJsb2NrIGRldmljZXMgb24gdGhlIHJlbW90ZSBtb3VudC4KKyAgbm9kZXYJCURvIG5vdCByZWNvZ25pemUgZGV2aWNlcyBvbiB0aGUgcmVtb3RlIG1vdW50LgorICBzdWlkICAgICAgICAgIEFsbG93IHJlbW90ZSBmaWxlcyBvbiB0aGlzIG1vdW50cG9pbnQgd2l0aCBzdWlkIGVuYWJsZWQgdG8gCisJCWJlIGV4ZWN1dGVkIChkZWZhdWx0IGZvciBtb3VudHMgd2hlbiBleGVjdXRlZCBhcyByb290LAorCQlub3N1aWQgaXMgZGVmYXVsdCBmb3IgdXNlciBtb3VudHMpLgorICBjcmVkZW50aWFscyAgIEFsdGhvdWdoIGlnbm9yZWQgYnkgdGhlIGNpZnMga2VybmVsIGNvbXBvbmVudCwgaXQgaXMgdXNlZCBieSAKKwkJdGhlIG1vdW50IGhlbHBlciwgbW91bnQuY2lmcy4gV2hlbiBtb3VudC5jaWZzIGlzIGluc3RhbGxlZCBpdAorCQlvcGVucyBhbmQgcmVhZHMgdGhlIGNyZWRlbnRpYWwgZmlsZSBzcGVjaWZpZWQgaW4gb3JkZXIgIAorCQl0byBvYnRhaW4gdGhlIHVzZXJpZCBhbmQgcGFzc3dvcmQgYXJndW1lbnRzIHdoaWNoIGFyZSBwYXNzZWQgdG8KKwkJdGhlIGNpZnMgdmZzLgorICBndWVzdCAgICAgICAgIEFsdGhvdWdoIGlnbm9yZWQgYnkgdGhlIGtlcm5lbCBjb21wb25lbnQsIHRoZSBtb3VudC5jaWZzCisJCW1vdW50IGhlbHBlciB3aWxsIG5vdCBwcm9tcHQgdGhlIHVzZXIgZm9yIGEgcGFzc3dvcmQKKwkJaWYgZ3Vlc3QgaXMgc3BlY2lmaWVkIG9uIHRoZSBtb3VudCBvcHRpb25zLiAgSWYgbm8KKwkJcGFzc3dvcmQgaXMgc3BlY2lmaWVkIGEgbnVsbCBwYXNzd29yZCB3aWxsIGJlIHVzZWQuCisgIHBlcm0gICAgICAgICAgQ2xpZW50IGRvZXMgcGVybWlzc2lvbiBjaGVja3MgKHZmc19wZXJtaXNzaW9uIGNoZWNrIG9mIHVpZAorCQlhbmQgZ2lkIG9mIHRoZSBmaWxlIGFnYWluc3QgdGhlIG1vZGUgYW5kIGRlc2lyZWQgb3BlcmF0aW9uKSwKKwkJTm90ZSB0aGF0IHRoaXMgaXMgaW4gYWRkaXRpb24gdG8gdGhlIG5vcm1hbCBBQ0wgY2hlY2sgb24gdGhlCisJCXRhcmdldCBtYWNoaW5lIGRvbmUgYnkgdGhlIHNlcnZlciBzb2Z0d2FyZS4gCisJCUNsaWVudCBwZXJtaXNzaW9uIGNoZWNraW5nIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4KKyAgbm9wZXJtICAgICAgICBDbGllbnQgZG9lcyBub3QgZG8gcGVybWlzc2lvbiBjaGVja3MuICBUaGlzIGNhbiBleHBvc2UKKwkJZmlsZXMgb24gdGhpcyBtb3VudCB0byBhY2Nlc3MgYnkgb3RoZXIgdXNlcnMgb24gdGhlIGxvY2FsCisJCWNsaWVudCBzeXN0ZW0uIEl0IGlzIHR5cGljYWxseSBvbmx5IG5lZWRlZCB3aGVuIHRoZSBzZXJ2ZXIKKwkJc3VwcG9ydHMgdGhlIENJRlMgVW5peCBFeHRlbnNpb25zIGJ1dCB0aGUgVUlEcy9HSURzIG9uIHRoZQorCQljbGllbnQgYW5kIHNlcnZlciBzeXN0ZW0gZG8gbm90IG1hdGNoIGNsb3NlbHkgZW5vdWdoIHRvIGFsbG93CisJCWFjY2VzcyBieSB0aGUgdXNlciBkb2luZyB0aGUgbW91bnQuCisJCU5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGFmZmVjdCB0aGUgbm9ybWFsIEFDTCBjaGVjayBvbiB0aGUKKwkJdGFyZ2V0IG1hY2hpbmUgZG9uZSBieSB0aGUgc2VydmVyIHNvZnR3YXJlIChvZiB0aGUgc2VydmVyCisJCUFDTCBhZ2FpbnN0IHRoZSB1c2VyIG5hbWUgcHJvdmlkZWQgYXQgbW91bnQgdGltZSkuCisgIHNlcnZlcmlubwlVc2Ugc2VydmVycyBpbm9kZSBudW1iZXJzIGluc3RlYWQgb2YgZ2VuZXJhdGluZyBhdXRvbWF0aWNhbGx5CisJCWluY3JlbWVudGluZyBpbm9kZSBudW1iZXJzIG9uIHRoZSBjbGllbnQuICBBbHRob3VnaCB0aGlzIHdpbGwKKwkJbWFrZSBpdCBlYXNpZXIgdG8gc3BvdCBoYXJkbGlua2VkIGZpbGVzIChhcyB0aGV5IHdpbGwgaGF2ZQorCQl0aGUgc2FtZSBpbm9kZSBudW1iZXJzKSBhbmQgaW5vZGUgbnVtYmVycyBtYXkgYmUgcGVyc2lzdGVudCwKKwkJbm90ZSB0aGF0IHRoZSBzZXJ2ZXIgZG9lcyBub3QgZ3VhcmFudGVlIHRoYXQgdGhlIGlub2RlIG51bWJlcnMKKwkJYXJlIHVuaXF1ZSBpZiBtdWx0aXBsZSBzZXJ2ZXIgc2lkZSBtb3VudHMgYXJlIGV4cG9ydGVkIHVuZGVyIGEKKwkJc2luZ2xlIHNoYXJlIChzaW5jZSBpbm9kZSBudW1iZXJzIG9uIHRoZSBzZXJ2ZXJzIG1pZ2h0IG5vdAorCQliZSB1bmlxdWUgaWYgbXVsdGlwbGUgZmlsZXN5c3RlbXMgYXJlIG1vdW50ZWQgdW5kZXIgdGhlIHNhbWUKKwkJc2hhcmVkIGhpZ2hlciBsZXZlbCBkaXJlY3RvcnkpLiAgTm90ZSB0aGF0IHRoaXMgcmVxdWlyZXMgdGhhdAorCQl0aGUgc2VydmVyIHN1cHBvcnQgdGhlIENJRlMgVW5peCBFeHRlbnNpb25zIGFzIG90aGVyIHNlcnZlcnMKKwkJZG8gbm90IHJldHVybiBhIHVuaXF1ZSBJbmRleE51bWJlciBvbiBTTUIgRmluZEZpcnN0IChtb3N0CisJCXNlcnZlcnMgcmV0dXJuIHplcm8gYXMgdGhlIEluZGV4TnVtYmVyKS4gIFBhcmFtZXRlciBoYXMgbm8KKwkJZWZmZWN0IHRvIFdpbmRvd3Mgc2VydmVycyBhbmQgb3RoZXJzIHdoaWNoIGRvIG5vdCBzdXBwb3J0IHRoZQorCQlDSUZTIFVuaXggRXh0ZW5zaW9ucy4KKyAgbm9zZXJ2ZXJpbm8gICBDbGllbnQgZ2VuZXJhdGVzIGlub2RlIG51bWJlcnMgKHJhdGhlciB0aGFuIHVzaW5nIHRoZSBhY3R1YWwgb25lCisJCWZyb20gdGhlIHNlcnZlcikgYnkgZGVmYXVsdC4KKyAgc2V0dWlkcyAgICAgICBJZiB0aGUgQ0lGUyBVbml4IGV4dGVuc2lvbnMgYXJlIG5lZ290aWF0ZWQgd2l0aCB0aGUgc2VydmVyCisJCXRoZSBjbGllbnQgd2lsbCBhdHRlbXB0IHRvIHNldCB0aGUgZWZmZWN0aXZlIHVpZCBhbmQgZ2lkIG9mCisJCXRoZSBsb2NhbCBwcm9jZXNzIG9uIG5ld2x5IGNyZWF0ZWQgZmlsZXMsIGRpcmVjdG9yaWVzLCBhbmQKKwkJZGV2aWNlcyAoY3JlYXRlLCBta2RpciwgbWtub2QpLgorICBub3NldHVpZHMgICAgIFRoZSBjbGllbnQgd2lsbCBub3QgYXR0ZW1wdCB0byBzZXQgdGhlIHVpZCBhbmQgZ2lkIG9uCisJCW9uIG5ld2x5IGNyZWF0ZWQgZmlsZXMsIGRpcmVjdG9yaWVzLCBhbmQgZGV2aWNlcyAoY3JlYXRlLCAKKwkJbWtkaXIsIG1rbm9kKSB3aGljaCB3aWxsIHJlc3VsdCBpbiB0aGUgc2VydmVyIHNldHRpbmcgdGhlCisJCXVpZCBhbmQgZ2lkIHRvIHRoZSBkZWZhdWx0ICh1c3VhbGx5IHRoZSBzZXJ2ZXIgdWlkIG9mIHRoZQorCQl1c2VybiB3aG8gbW91bnRlZCB0aGUgc2hhcmUpLiAgTGV0dGluZyB0aGUgc2VydmVyIChyYXRoZXIgdGhhbgorCQl0aGUgY2xpZW50KSBzZXQgdGhlIHVpZCBhbmQgZ2lkIGlzIHRoZSBkZWZhdWx0LiBUaGlzCisJCXBhcmFtZXRlciBoYXMgbm8gZWZmZWN0IGlmIHRoZSBDSUZTIFVuaXggRXh0ZW5zaW9ucyBhcmUgbm90CisJCW5lZ290aWF0ZWQuCisgIG5ldGJpb3NuYW1lICAgV2hlbiBtb3VudGluZyB0byBzZXJ2ZXJzIHZpYSBwb3J0IDEzOSwgc3BlY2lmaWVzIHRoZSBSRkMxMDAxCisJCXNvdXJjZSBuYW1lIHRvIHVzZSB0byByZXByZXNlbnQgdGhlIGNsaWVudCBuZXRiaW9zIG1hY2hpbmUgCisJCW5hbWUgd2hlbiBkb2luZyB0aGUgUkZDMTAwMSBuZXRiaW9zIHNlc3Npb24gaW5pdGlhbGl6ZS4KKyAgZGlyZWN0ICAgICAgICBEbyBub3QgZG8gaW5vZGUgZGF0YSBjYWNoaW5nIG9uIGZpbGVzIG9wZW5lZCBvbiB0aGlzIG1vdW50LgorCQlUaGlzIHByZWNsdWRlcyBtbWFwaW5nIGZpbGVzIG9uIHRoaXMgbW91bnQuIEluIHNvbWUgY2FzZXMKKwkJd2l0aCBmYXN0IG5ldHdvcmtzIGFuZCBsaXR0bGUgb3Igbm8gY2FjaGluZyBiZW5lZml0cyBvbiB0aGUKKwkJY2xpZW50IChlLmcuIHdoZW4gdGhlIGFwcGxpY2F0aW9uIGlzIGRvaW5nIGxhcmdlIHNlcXVlbnRpYWwKKwkJcmVhZHMgYmlnZ2VyIHRoYW4gcGFnZSBzaXplIHdpdGhvdXQgcmVyZWFkaW5nIHRoZSBzYW1lIGRhdGEpIAorCQl0aGlzIGNhbiBwcm92aWRlIGJldHRlciBwZXJmb3JtYW5jZSB0aGFuIHRoZSBkZWZhdWx0CisJCWJlaGF2aW9yIHdoaWNoIGNhY2hlcyByZWFkcyAocmVhYWRhaGVhZCkgYW5kIHdyaXRlcyAKKwkJKHdyaXRlYmVoaW5kKSB0aHJvdWdoIHRoZSBsb2NhbCBMaW51eCBjbGllbnQgcGFnZWNhY2hlIAorCQlpZiBvcGxvY2sgKGNhY2hpbmcgdG9rZW4pIGlzIGdyYW50ZWQgYW5kIGhlbGQuIE5vdGUgdGhhdAorCQlkaXJlY3QgYWxsb3dzIHdyaXRlIG9wZXJhdGlvbnMgbGFyZ2VyIHRoYW4gcGFnZSBzaXplCisJCXRvIGJlIHNlbnQgdG8gdGhlIHNlcnZlci4KKyAgYWNsICAgCUFsbG93IHNldGZhY2wgYW5kIGdldGZhY2wgdG8gbWFuYWdlIHBvc2l4IEFDTHMgaWYgc2VydmVyCisJCXN1cHBvcnRzIHRoZW0uICAoZGVmYXVsdCkKKyAgbm9hY2wgCURvIG5vdCBhbGxvdyBzZXRmYWNsIGFuZCBnZXRmYWNsIGNhbGxzIG9uIHRoaXMgbW91bnQKKyAgdXNlcl94YXR0ciAgICBBbGxvdyBnZXR0aW5nIGFuZCBzZXR0aW5nIHVzZXIgeGF0dHJzIGFzIE9TLzIgRUFzIChleHRlbmRlZAorCQlhdHRyaWJ1dGVzKSB0byB0aGUgc2VydmVyIChkZWZhdWx0KSBlLmcuIHZpYSBzZXRmYXR0ciAKKwkJYW5kIGdldGZhdHRyIHV0aWxpdGllcy4gCisgIG5vdXNlcl94YXR0ciAgRG8gbm90IGFsbG93IGdldGZhdHRyL3NldGZhdHRyIHRvIGdldC9zZXQgeGF0dHJzIAorCQkKK1RoZSBtb3VudC5jaWZzIG1vdW50IGhlbHBlciBhbHNvIGFjY2VwdHMgYSBmZXcgbW91bnQgb3B0aW9ucyBiZWZvcmUgLW8KK2luY2x1ZGluZzoKKworCS1TICAgICAgdGFrZSBwYXNzd29yZCBmcm9tIHN0ZGluIChlcXVpdmFsZW50IHRvIHNldHRpbmcgdGhlIGVudmlyb25tZW50CisJCXZhcmlhYmxlICJQQVNTV0RfRkQ9MCIKKwktViAgICAgIHByaW50IG1vdW50LmNpZnMgdmVyc2lvbgorCS0/ICAgICAgZGlzcGxheSBzaW1wbGUgdXNhZ2UgaW5mb3JtYXRpb24KKworV2l0aCByZWNlbnQgMi42IGtlcm5lbCB2ZXJzaW9ucyBvZiBtb2R1dGlscywgdGhlIHZlcnNpb24gb2YgdGhlIGNpZnMga2VybmVsCittb2R1bGUgY2FuIGJlIGRpc3BsYXllZCB2aWEgbW9kaW5mby4KKworTWlzYyAvcHJvYy9mcy9jaWZzIEZsYWdzIGFuZCBEZWJ1ZyBJbmZvCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0luZm9ybWF0aW9uYWwgcHNldWRvLWZpbGVzOgorRGVidWdEYXRhCQlEaXNwbGF5cyBpbmZvcm1hdGlvbiBhYm91dCBhY3RpdmUgQ0lGUyBzZXNzaW9ucworCQkJYW5kIHNoYXJlcy4KK1N0YXRzCQkJTGlzdHMgc3VtbWFyeSByZXNvdXJjZSB1c2FnZSBpbmZvcm1hdGlvbiBhcyB3ZWxsIGFzIHBlcgorCQkJc2hhcmUgc3RhdGlzdGljcywgaWYgQ09ORklHX0NJRlNfU1RBVFMgaW4gZW5hYmxlZAorCQkJaW4gdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uLgorCitDb25maWd1cmF0aW9uIHBzZXVkby1maWxlczoKK011bHRpdXNlck1vdW50CQlJZiBzZXQgdG8gb25lLCBtb3JlIHRoYW4gb25lIENJRlMgc2Vzc2lvbiB0byAKKwkJCXRoZSBzYW1lIHNlcnZlciBpcCBhZGRyZXNzIGNhbiBiZSBlc3RhYmxpc2hlZAorCQkJaWYgbW9yZSB0aGFuIG9uZSB1aWQgYWNjZXNzZXMgdGhlIHNhbWUgbW91bnQKKwkJCXBvaW50IGFuZCBpZiB0aGUgdWlkcyB1c2VyL3Bhc3N3b3JkIG1hcHBpbmcKKwkJCWluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS4gKGRlZmF1bHQgaXMgMCkKK1BhY2tldFNpZ25pbmdFbmFibGVkCUlmIHNldCB0byBvbmUsIGNpZnMgcGFja2V0IHNpZ25pbmcgaXMgZW5hYmxlZAorCQkJYW5kIHdpbGwgYmUgdXNlZCBpZiB0aGUgc2VydmVyIHJlcXVpcmVzIAorCQkJaXQuICBJZiBzZXQgdG8gdHdvLCBjaWZzIHBhY2tldCBzaWduaW5nIGlzCisJCQlyZXF1aXJlZCBldmVuIGlmIHRoZSBzZXJ2ZXIgY29uc2lkZXJzIHBhY2tldAorCQkJc2lnbmluZyBvcHRpb25hbC4gKGRlZmF1bHQgMSkKK2NpZnNGWUkJCQlJZiBzZXQgdG8gb25lLCBhZGRpdGlvbmFsIGRlYnVnIGluZm9ybWF0aW9uIGlzCisJCQlsb2dnZWQgdG8gdGhlIHN5c3RlbSBlcnJvciBsb2cuIChkZWZhdWx0IDApCitFeHRlbmRlZFNlY3VyaXR5CUlmIHNldCB0byBvbmUsIFNQTkVHTyBzZXNzaW9uIGVzdGFibGlzaG1lbnQKKwkJCWlzIGFsbG93ZWQgd2hpY2ggZW5hYmxlcyBtb3JlIGFkdmFuY2VkIAorCQkJc2VjdXJlIENJRlMgc2Vzc2lvbiBlc3RhYmxpc2htZW50IChkZWZhdWx0IDApCitOVExNVjJFbmFibGVkCQlJZiBzZXQgdG8gb25lLCBtb3JlIHNlY3VyZSBwYXNzd29yZCBoYXNoZXMKKwkJCWFyZSB1c2VkIHdoZW4gdGhlIHNlcnZlciBzdXBwb3J0cyB0aGVtIGFuZAorCQkJd2hlbiBrZXJiZXJvcyBpcyBub3QgbmVnb3RpYXRlZCAoZGVmYXVsdCAwKQordHJhY2VTTUIJCUlmIHNldCB0byBvbmUsIGRlYnVnIGluZm9ybWF0aW9uIGlzIGxvZ2dlZCB0byB0aGUKKwkJCXN5c3RlbSBlcnJvciBsb2cgd2l0aCB0aGUgc3RhcnQgb2Ygc21iIHJlcXVlc3RzCisJCQlhbmQgcmVzcG9uc2VzIChkZWZhdWx0IDApCitMb29rdXBDYWNoZUVuYWJsZQlJZiBzZXQgdG8gb25lLCBpbm9kZSBpbmZvcm1hdGlvbiBpcyBrZXB0IGNhY2hlZAorCQkJZm9yIG9uZSBzZWNvbmQgaW1wcm92aW5nIHBlcmZvcm1hbmNlIG9mIGxvb2t1cHMKKwkJCShkZWZhdWx0IDEpCitPcGxvY2tFbmFibGVkCQlJZiBzZXQgdG8gb25lLCBzYWZlIGRpc3RyaWJ1dGVkIGNhY2hpbmcgZW5hYmxlZC4KKwkJCShkZWZhdWx0IDEpCitMaW51eEV4dGVuc2lvbnNFbmFibGVkCUlmIHNldCB0byBvbmUgdGhlbiB0aGUgY2xpZW50IHdpbGwgYXR0ZW1wdCB0bworCQkJdXNlIHRoZSBDSUZTICJVTklYIiBleHRlbnNpb25zIHdoaWNoIGFyZSBvcHRpb25hbAorCQkJcHJvdG9jb2wgZW5oYW5jZW1lbnRzIHRoYXQgYWxsb3cgQ0lGUyBzZXJ2ZXJzCisJCQl0byByZXR1cm4gYWNjdXJhdGUgVUlEL0dJRCBpbmZvcm1hdGlvbiBhcyB3ZWxsCisJCQlhcyBzdXBwb3J0IHN5bWJvbGljIGxpbmtzLiBJZiB5b3UgdXNlIHNlcnZlcnMKKwkJCXN1Y2ggYXMgU2FtYmEgdGhhdCBzdXBwb3J0IHRoZSBDSUZTIFVuaXgKKwkJCWV4dGVuc2lvbnMgYnV0IGRvIG5vdCB3YW50IHRvIHVzZSBzeW1ib2xpYyBsaW5rCisJCQlzdXBwb3J0IGFuZCB3YW50IHRvIG1hcCB0aGUgdWlkIGFuZCBnaWQgZmllbGRzIAorCQkJdG8gdmFsdWVzIHN1cHBsaWVkIGF0IG1vdW50IChyYXRoZXIgdGhhbiB0aGUgCisJCQlhY3R1YWwgdmFsdWVzLCB0aGVuIHNldCB0aGlzIHRvIHplcm8uIChkZWZhdWx0IDEpCisKK1RoZXNlIGV4cGVyaW1lbnRhbCBmZWF0dXJlcyBhbmQgdHJhY2luZyBjYW4gYmUgZW5hYmxlZCBieSBjaGFuZ2luZyBmbGFncyBpbiAKKy9wcm9jL2ZzL2NpZnMgKGFmdGVyIHRoZSBjaWZzIG1vZHVsZSBoYXMgYmVlbiBpbnN0YWxsZWQgb3IgYnVpbHQgaW50byB0aGUgCitrZXJuZWwsIGUuZy4gIGluc21vZCBjaWZzKS4gIFRvIGVuYWJsZSBhIGZlYXR1cmUgc2V0IGl0IHRvIDEgZS5nLiAgdG8gZW5hYmxlIAordHJhY2luZyB0byB0aGUga2VybmVsIG1lc3NhZ2UgbG9nIHR5cGU6IAorCisJZWNobyAxID4gL3Byb2MvZnMvY2lmcy9jaWZzRllJCisJCithbmQgZm9yIG1vcmUgZXh0ZW5zaXZlIHRyYWNpbmcgaW5jbHVkaW5nIHRoZSBzdGFydCBvZiBzbWIgcmVxdWVzdHMgYW5kIHJlc3BvbnNlcworCisJZWNobyAxID4gL3Byb2MvZnMvY2lmcy90cmFjZVNNQgorCitUd28gb3RoZXIgZXhwZXJpbWVudGFsIGZlYXR1cmVzIGFyZSB1bmRlciBkZXZlbG9wbWVudCBhbmQgdG8gdGVzdCAKK3JlcXVpcmUgZW5hYmxpbmcgQ09ORklHX0NJRlNfRVhQRVJJTUVOVEFMCisKKwlNb3JlIGVmZmljaWVudCB3cml0ZSBvcGVyYXRpb25zIGFuZCBTTUIgYnVmZmVyIGhhbmRsaW5nCisKKwlETk9USUZZIGZjbnRsOiBuZWVkZWQgZm9yIHN1cHBvcnQgb2YgZGlyZWN0b3J5IGNoYW5nZSAKKwkJCSAgICBub3RpZmljYXRpb24gYW5kIHBlcmhhcHMgbGF0ZXIgZm9yIGZpbGUgbGVhc2VzKQorCitQZXIgc2hhcmUgKHBlciBjbGllbnQgbW91bnQpIHN0YXRpc3RpY3MgYXJlIGF2YWlsYWJsZSBpbiAvcHJvYy9mcy9jaWZzL1N0YXRzCitpZiB0aGUga2VybmVsIHdhcyBjb25maWd1cmVkIHdpdGggY2lmcyBzdGF0aXN0aWNzIGVuYWJsZWQuICBUaGUgc3RhdGlzdGljcworcmVwcmVzZW50IHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2Z1bCAoaWUgbm9uLXplcm8gcmV0dXJuIGNvZGUgZnJvbSB0aGUgc2VydmVyKSAKK1NNQiByZXNwb25zZXMgdG8gc29tZSBvZiB0aGUgbW9yZSBjb21tb24gY29tbWFuZHMgKG9wZW4sIGRlbGV0ZSwgbWtkaXIgZXRjLikuCitBbHNvIHJlY29yZGVkIGlzIHRoZSB0b3RhbCBieXRlcyByZWFkIGFuZCBieXRlcyB3cml0dGVuIHRvIHRoZSBzZXJ2ZXIgZm9yCit0aGF0IHNoYXJlLiAgTm90ZSB0aGF0IGR1ZSB0byBjbGllbnQgY2FjaGluZyBlZmZlY3RzIHRoaXMgY2FuIGJlIGxlc3MgdGhhbiB0aGUKK251bWJlciBvZiBieXRlcyByZWFkIGFuZCB3cml0dGVuIGJ5IHRoZSBhcHBsaWNhdGlvbiBydW5uaW5nIG9uIHRoZSBjbGllbnQuCitUaGUgc3RhdGlzdGljcyBmb3IgdGhlIG51bWJlciBvZiB0b3RhbCBTTUJzIGFuZCBvcGxvY2sgYnJlYWtzIGFyZSBkaWZmZXJlbnQgaW4KK3RoYXQgdGhleSByZXByZXNlbnQgYWxsIGZvciB0aGF0IHNoYXJlLCBub3QganVzdCB0aG9zZSBmb3Igd2hpY2ggdGhlIHNlcnZlcgorcmV0dXJuZWQgc3VjY2Vzcy4KKwkKK0Fsc28gbm90ZSB0aGF0ICJjYXQgL3Byb2MvZnMvY2lmcy9EZWJ1Z0RhdGEiIHdpbGwgZGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCAKK3RoZSBhY3RpdmUgc2Vzc2lvbnMgYW5kIHRoZSBzaGFyZXMgdGhhdCBhcmUgbW91bnRlZC4gIE5vdGU6IE5UTE12MiBlbmFibGVtZW50IAord2lsbCBub3Qgd29yayBzaW5jZSB0aGV5IGl0cyBpbXBsZW1lbnRhdGlvbiBpcyBub3QgcXVpdGUgY29tcGxldGUgeWV0LgorRG8gbm90IGFsdGVyIHRoZXNlIGNvbmZpZ3VyYXRpb24gdmFsdWVzIHVubGVzcyB5b3UgYXJlIGRvaW5nIHNwZWNpZmljIHRlc3RpbmcuICAKK0VuYWJsaW5nIGV4dGVuZGVkIHNlY3VyaXR5IHdvcmtzIHRvIFdpbmRvd3MgMjAwMCBXb3Jrc3RhdGlvbnMgYW5kIFhQIGJ1dCBub3QgdG8gCitXaW5kb3dzIDIwMDAgc2VydmVyIG9yIFNhbWJhIHNpbmNlIGl0IGRvZXMgbm90IHVzdWFsbHkgc2VuZCAicmF3IE5UTE1TU1AiIAorKGluc3RlYWQgaXQgc2VuZHMgTlRMTVNTUCBlbmNhcHN1bGF0ZWQgaW4gU1BORUdPL0dTU0FQSSwgd2hpY2ggc3VwcG9ydCBpcyBub3QgCitjb21wbGV0ZSBpbiB0aGUgQ0lGUyBWRlMgeWV0KS4gIApkaWZmIC0tZ2l0IGEvZnMvY2lmcy9UT0RPIGIvZnMvY2lmcy9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZTNlMWYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jaWZzL1RPRE8KQEAgLTAsMCArMSwxMDQgQEAKK3ZlcnNpb24gMS4yMiBKdWx5IDMwLCAyMDA0IAorCitBIFBhcnRpYWwgTGlzdCBvZiBNaXNzaW5nIEZlYXR1cmVzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NvbnRyaWJ1dGlvbnMgYXJlIHdlbGNvbWUuICBUaGVyZSBhcmUgcGxlbnR5IG9mIG9wcG9ydHVuaXRpZXMKK2ZvciB2aXNpYmxlLCBpbXBvcnRhbnQgY29udHJpYnV0aW9ucyB0byB0aGlzIG1vZHVsZS4gIEhlcmUKK2lzIGEgcGFydGlhbCBsaXN0IG9mIHRoZSBrbm93biBwcm9ibGVtcyBhbmQgbWlzc2luZyBmZWF0dXJlczoKKworYSkgU3VwcG9ydCBmb3IgU2VjdXJpdHlEZXNjcmlwdG9ycyBmb3IgY2htb2QvY2hncnAvY2hvd24gc28KK3RoZXNlIGNhbiBiZSBzdXBwb3J0ZWQgZm9yIFdpbmRvd3Mgc2VydmVycworCitiKSBCZXR0ZXIgcGFtL3dpbmJpbmQgaW50ZWdyYXRpb24gKGUuZy4gdG8gaGFuZGxlIHVpZCBtYXBwaW5nCitiZXR0ZXIpCisKK2MpIG11bHRpLXVzZXIgbW91bnRzIC0gbXVsdGlwbGV4ZWQgc2Vzc2lvbnNldHVwcyBvdmVyIHNpbmdsZSB2YworKGllIHRjcCBzZXNzaW9uKSAtIHByZXR0eWluZyB1cCBuZWVkZWQsIGFuZCBtb3JlIHRlc3RpbmcgbmVlZGVkCisKK2QpIEtlcmJlcm9zL1NQTkVHTyBzZXNzaW9uIHNldHVwIHN1cHBvcnQgLSAoc3RhcnRlZCkKKworZSkgTlRMTXYyIGF1dGhlbnRpY2F0aW9uIChtb3N0bHkgaW1wbGVtZW50ZWQpCisKK2YpIE1ENS1ITUFDIHNpZ25pbmcgU01CIFBEVXMgd2hlbiBTUE5FR08gc3R5bGUgU2Vzc2lvblNldHVwIAordXNlZCAoS2VyYmVyb3Mgb3IgTlRMTVNTUCkuIFNpZ25pbmcgYWxyZWFkeWltcGxlbWVudGVkIGZvciBOVExNCithbmQgcmF3IE5UTE1TU1AgYWxyZWFkeS4gVGhpcyBpcyBpbXBvcnRhbnQgd2hlbiBlbmFibGluZworZXh0ZW5kZWQgc2VjdXJpdHkgYW5kIG1vdW50aW5nIHRvIFdpbmRvd3MgMjAwMyBTZXJ2ZXJzCisKK2YpIERpcmVjdG9yeSBlbnRyeSBjYWNoaW5nIHJlbGllcyBvbiBhIDEgc2Vjb25kIHRpbWVyLCByYXRoZXIgdGhhbiAKK3VzaW5nIEZpbmROb3RpZnkgb3IgZXF1aXZhbGVudC4gIC0gKHN0YXJ0ZWQpCisKK2cpIEEgZmV3IGJ5dGUgcmFuZ2UgdGVzdGNhc2VzIGZhaWwgZHVlIHRvIFBPU0lYIHZzLiBXaW5kb3dzL0NJRlMKK3N0eWxlIGJ5dGUgcmFuZ2UgbG9jayBkaWZmZXJlbmNlcworCitoKSBxdW90YSBzdXBwb3J0CisKK2opIGZpbmlzaCB3cml0ZXBhZ2VzIHN1cHBvcnQgKG11bHRpLXBhZ2Ugd3JpdGUgYmVoaW5kIGZvciBpbXByb3ZlZAorcGVyZm9ybWFuY2UpIGFuZCBzeW5jcGFnZQorCitrKSBob29rIGxvd2VyIGludG8gdGhlIHNvY2tldHMgYXBpIChhcyBORlMvU3VuUlBDIGRvZXMpIHRvIGF2b2lkIHRoZQorZXh0cmEgY29weSBpbi9vdXQgb2YgdGhlIHNvY2tldCBidWZmZXJzIGluIHNvbWUgY2FzZXMuCisKK2wpIGZpbmlzaCBzdXBwb3J0IGZvciBJUHY2LiAgVGhpcyBpcyBtb3N0bHkgY29tcGxldGUgYnV0CituZWVkcyBhIHNpbXBsZSBjb252ZXJzaW9uIG9mIGlwdjYgdG8gc2luNl9hZGRyIGZyb20gdGhlCithZGRyZXNzIGluIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKworbSkgQmV0dGVyIG9wdGltaXplIG9wZW4gKGFuZCBwYXRoYmFzZWQgc2V0ZmlsZXNpemUpIHRvIHJlZHVjZSB0aGUKK29wbG9jayBicmVha3MgY29taW5nIGZyb20gd2luZG93cyBzcnYuICBQaWdneWJhY2sgaWRlbnRpY2FsIGZpbGUKK29wZW5zIG9uIHRvcCBvZiBlYWNoIG90aGVyIGJ5IGluY3JlbWVudGluZyByZWZlcmVuY2UgY291bnQgcmF0aGVyCit0aGFuIHJlc2VuZGluZyAoaGVscHMgcmVkdWNlIHNlcnZlciByZXNvdXJjZSB1dGlsaXphdGlvbiBhbmQgYXZvaWQKK3NwdXJpb3VzIG9wbG9jayBicmVha3MpLgorCitvKSBJbXByb3ZlIHBlcmZvcm1hbmNlIG9mIHJlYWRwYWdlcyBieSBzZW5kaW5nIG1vcmUgdGhhbiBvbmUgcmVhZAorYXQgYSB0aW1lIHdoZW4gOCBwYWdlcyBvciBtb3JlIGFyZSByZXF1ZXN0ZWQuIEluIGNvbmp1bnRpb24KK2FkZCBzdXBwb3J0IGZvciBhc3luY19jaWZzX3JlYWRwYWdlcy4KKworcCkgQWRkIHN1cHBvcnQgZm9yIHN0b3Jpbmcgc3ltbGluayBhbmQgZmlmbyBpbmZvIHRvIFdpbmRvd3Mgc2VydmVycyAKK2luIHRoZSBFeHRlbmRlZCBBdHRyaWJ1dGUgZm9ybWF0IHRoZWlyIFNGVSBjbGllbnRzIHdvdWxkIHJlY29nbml6ZS4KKworcSkgRmluaXNoIGZjbnRsIERfTk9USUZZIHN1cHBvcnQgc28ga2RlIGFuZCBnbm9tZSBmaWxlIGxpc3Qgd2luZG93cword2lsbCBhdXRvcmVmcmVzaCAoc3RhcnRlZCkKKworcikgQWRkIEdVSSB0b29sIHRvIGNvbmZpZ3VyZSAvcHJvYy9mcy9jaWZzIHNldHRpbmdzIGFuZCBmb3IgZGlzcGxheSBvZgordGhlIENJRlMgc3RhdGlzdGljcyAoc3RhcnRlZCkKKworcSkgaW1wbGVtZW50IHN1cHBvcnQgZm9yIHNlY3VyaXR5IGFuZCB0cnVzdGVkIGNhdGVnb3JpZXMgb2YgeGF0dHJzCisocmVxdWlyZXMgbWlub3IgcHJvdG9jb2wgZXh0ZW5zaW9uKSB0byBlbmFibGUgYmV0dGVyIHN1cHBvcnQgZm9yIFNFTElOVVgKKworcikgSW1wbGVtZW50IE9fRElSRUNUIGZsYWcgb24gb3BlbiAoYWxyZWFkeSBzdXBwb3J0ZWQgb24gbW91bnQpCisKK0tOT1dOIEJVR1MgKHVwZGF0ZWQgRGVjZW1iZXIgMTAsIDIwMDQpCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKzEpIGV4aXN0aW5nIHN5bWJvbGljIGxpbmtzIChXaW5kb3dzIHJlcGFyc2UgcG9pbnRzKSBhcmUgcmVjb2duaXplZCBidXQKK2NhbiBub3QgYmUgY3JlYXRlZCByZW1vdGVseS4gVGhleSBhcmUgaW1wbGVtZW50ZWQgZm9yIFNhbWJhIGFuZCB0aG9zZSB0aGF0CitzdXBwb3J0IHRoZSBDSUZTIFVuaXggZXh0ZW5zaW9ucyBidXQgU2FtYmEgaGFzIGEgYnVnIGN1cnJlbnRseSBoYW5kbGluZworc3ltbGluayB0ZXh0IGJlZ2lubmluZyB3aXRoIHNsYXNoCisyKSBmb2xsb3dfbGluayBhbmQgcmVhZGRpciBjb2RlIGRvZXMgbm90IGZvbGxvdyBkZnMganVuY3Rpb25zCitidXQgcmVjb2duaXplcyB0aGVtCiszKSBjcmVhdGUgb2YgbmV3IGZpbGVzIHRvIEZBVCBwYXJ0aXRpb25zIG9uIFdpbmRvd3Mgc2VydmVycyBjYW4KK3N1Y2NlZWQgYnV0IHN0aWxsIHJldHVybiBhY2Nlc3MgZGVuaWVkIChhcHBlYXJzIHRvIGJlIFdpbmRvd3MgCitzZXJ2ZXIgbm90IGNpZnMgY2xpZW50IHByb2JsZW0pIGFuZCBoYXMgbm90IGJlZW4gcmVwcm9kdWNlZCByZWNlbnRseS4KK05URlMgcGFydGl0aW9ucyBkbyBub3QgaGF2ZSB0aGlzIHByb2JsZW0uCis0KSBkZWJ1ZyBjb25uZWN0YXRob24gbG9jayB0ZXN0IGNhc2UgMTAgd2hpY2ggZmFpbHMgYWdhaW5zdAorU2FtYmEgKG1heSBiZSB1bm1hcHBhYmxlIGR1ZSB0byBQT1NJWCB0byBXaW5kb3dzIGxvY2sgbW9kZWwKK2RpZmZlcmVuY2VzIGJ1dCB3b3J0aCBpbnZlc3RpZ2F0aW5nKS4gIEFsc28gZGVidWcgU2FtYmEgdG8gCitzZWUgd2h5IGxvY2sgdGVzdCBjYXNlIDcgdGFrZXMgbG9uZ2VyIHRvIGNvbXBsZXRlIHRvIFNhbWJhCit0aGFuIHRvIFdpbmRvd3MuCisKK01pc2MgdGVzdGluZyB0byBkbworPT09PT09PT09PT09PT09PT09CisxKSBjaGVjayBvdXQgbWF4IHBhdGggbmFtZXMgYW5kIG1heCBwYXRoIG5hbWUgY29tcG9uZW50cyBhZ2FpbnN0IHZhcmlvdXMgc2VydmVyCit0eXBlcy4gVHJ5IG5lc3RlZCBzeW1saW5rcyAoOCBkZWVwKS4gUmV0dXJuIG1heCBwYXRoIG5hbWUgaW4gc3RhdCAtZiBpbmZvcm1hdGlvbgorCisyKSBNb2RpZnkgZmlsZSBwb3J0aW9uIG9mIGx0cCBzbyBpdCBjYW4gcnVuIGFnYWluc3QgYSBtb3VudGVkIG5ldHdvcmsKK3NoYXJlIGFuZCBydW4gaXQgYWdhaW5zdCBjaWZzIHZmcy4KKworMykgQWRkaXRpb25hbCBwZXJmb3JtYW5jZSB0ZXN0aW5nIGFuZCBvcHRpbWl6YXRpb24gdXNpbmcgaW96b25lIGFuZCBzaW1pbGFyIC0gCit0aGVyZSBhcmUgc29tZSBlYXN5IGNoYW5nZXMgdGhhdCBjYW4gYmUgZG9uZSB0byBwYXJhbGxlbGl6ZSBzZXF1ZW50aWFsIHdyaXRlcywKK2FuZCB3aGVuIHNpZ25pbmcgaXMgZGlzYWJsZWQgdG8gcmVxdWVzdCBsYXJnZXIgcmVhZCBzaXplcyAobGFyZ2VyIHRoYW4gCituZWdvdGlhdGVkIHNpemUpIGFuZCBzZW5kIGxhcmdlciB3cml0ZSBzaXplcyB0byBtb2Rlcm4gc2VydmVycy4KKworNCkgTW9yZSBleGhhdXN0aXZlbHkgdGVzdCB0aGUgcmVjZW50bHkgYWRkZWQgTlQ0IHN1cHBvcnQgYWdhaW5zdCB2YXJpb3VzCitOVDQgc2VydmljZSBwYWNrIGxldmVscywgYW5kIGZpeCBjaWZzX3NldGF0dHIgZm9yIHNldHRpbmcgZmlsZSB0aW1lcyBhbmQgCitzaXplIHRvIGZhbGwgYmFjayB0byBsZXZlbCAxIHdoZW4gZXJyb3IgaW52YWxpZCBsZXZlbCByZXR1cm5lZC4KKwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9hc24xLmMgYi9mcy9jaWZzL2FzbjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDIwMTBkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9hc24xLmMKQEAgLTAsMCArMSw2MTggQEAKKy8qIAorICogVGhlIEFTQi4xL0JFUiBwYXJzaW5nIGNvZGUgaXMgZGVyaXZlZCBmcm9tIGlwX25hdF9zbm1wX2Jhc2ljLmMgd2hpY2ggd2FzIGluCisgKiB0dXJuIGRlcml2ZWQgZnJvbSB0aGUgZ3hzbm1wIHBhY2thZ2UgYnkgR3JlZ29yeSBNY0xlYW4gJiBKb2NoZW4gRnJpZWRyaWNoCisgKiAgICAgIAorICogQ29weXJpZ2h0IChjKSAyMDAwIFJQIEludGVybmV0ICh3d3cucnBpLm5ldC5hdSkuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgImNpZnNwZHUuaCIKKyNpbmNsdWRlICJjaWZzZ2xvYi5oIgorI2luY2x1ZGUgImNpZnNfZGVidWcuaCIKKyNpbmNsdWRlICJjaWZzcHJvdG8uaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQmFzaWMgQVNOLjEgZGVjb2Rpbmcgcm91dGluZXMgKGd4c25tcCBhdXRob3IgRGlyayBXaXNzZSkKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENsYXNzICovCisjZGVmaW5lIEFTTjFfVU5JCTAJLyogVW5pdmVyc2FsICovCisjZGVmaW5lIEFTTjFfQVBMCTEJLyogQXBwbGljYXRpb24gKi8KKyNkZWZpbmUgQVNOMV9DVFgJMgkvKiBDb250ZXh0ICovCisjZGVmaW5lIEFTTjFfUFJWCTMJLyogUHJpdmF0ZSAqLworCisvKiBUYWcgKi8KKyNkZWZpbmUgQVNOMV9FT0MJMAkvKiBFbmQgT2YgQ29udGVudHMgb3IgTi9BICovCisjZGVmaW5lIEFTTjFfQk9MCTEJLyogQm9vbGVhbiAqLworI2RlZmluZSBBU04xX0lOVAkyCS8qIEludGVnZXIgKi8KKyNkZWZpbmUgQVNOMV9CVFMJMwkvKiBCaXQgU3RyaW5nICovCisjZGVmaW5lIEFTTjFfT1RTCTQJLyogT2N0ZXQgU3RyaW5nICovCisjZGVmaW5lIEFTTjFfTlVMCTUJLyogTnVsbCAqLworI2RlZmluZSBBU04xX09KSQk2CS8qIE9iamVjdCBJZGVudGlmaWVyICAqLworI2RlZmluZSBBU04xX09KRAk3CS8qIE9iamVjdCBEZXNjcmlwdGlvbiAqLworI2RlZmluZSBBU04xX0VYVAk4CS8qIEV4dGVybmFsICovCisjZGVmaW5lIEFTTjFfU0VRCTE2CS8qIFNlcXVlbmNlICovCisjZGVmaW5lIEFTTjFfU0VUCTE3CS8qIFNldCAqLworI2RlZmluZSBBU04xX05VTVNUUgkxOAkvKiBOdW1lcmljYWwgU3RyaW5nICovCisjZGVmaW5lIEFTTjFfUFJOU1RSCTE5CS8qIFByaW50YWJsZSBTdHJpbmcgKi8KKyNkZWZpbmUgQVNOMV9URVhTVFIJMjAJLyogVGVsZXRleHQgU3RyaW5nICovCisjZGVmaW5lIEFTTjFfVklEU1RSCTIxCS8qIFZpZGVvIFN0cmluZyAqLworI2RlZmluZSBBU04xX0lBNVNUUgkyMgkvKiBJQTUgU3RyaW5nICovCisjZGVmaW5lIEFTTjFfVU5JVElNCTIzCS8qIFVuaXZlcnNhbCBUaW1lICovCisjZGVmaW5lIEFTTjFfR0VOVElNCTI0CS8qIEdlbmVyYWwgVGltZSAqLworI2RlZmluZSBBU04xX0dSQVNUUgkyNQkvKiBHcmFwaGljYWwgU3RyaW5nICovCisjZGVmaW5lIEFTTjFfVklTU1RSCTI2CS8qIFZpc2libGUgU3RyaW5nICovCisjZGVmaW5lIEFTTjFfR0VOU1RSCTI3CS8qIEdlbmVyYWwgU3RyaW5nICovCisKKy8qIFByaW1pdGl2ZSAvIENvbnN0cnVjdGVkIG1ldGhvZHMqLworI2RlZmluZSBBU04xX1BSSQkwCS8qIFByaW1pdGl2ZSAqLworI2RlZmluZSBBU04xX0NPTgkxCS8qIENvbnN0cnVjdGVkICovCisKKy8qCisgKiBFcnJvciBjb2Rlcy4KKyAqLworI2RlZmluZSBBU04xX0VSUl9OT0VSUk9SCQkwCisjZGVmaW5lIEFTTjFfRVJSX0RFQ19FTVBUWQkJMgorI2RlZmluZSBBU04xX0VSUl9ERUNfRU9DX01JU01BVENICTMKKyNkZWZpbmUgQVNOMV9FUlJfREVDX0xFTkdUSF9NSVNNQVRDSAk0CisjZGVmaW5lIEFTTjFfRVJSX0RFQ19CQURWQUxVRQkJNQorCisjZGVmaW5lIFNQTkVHT19PSURfTEVOIDcKKyNkZWZpbmUgTlRMTVNTUF9PSURfTEVOICAxMAorc3RhdGljIHVuc2lnbmVkIGxvbmcgU1BORUdPX09JRFs3XSA9IHsgMSwgMywgNiwgMSwgNSwgNSwgMiB9Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgTlRMTVNTUF9PSURbMTBdID0geyAxLCAzLCA2LCAxLCA0LCAxLCAzMTEsIDIsIDIsIDEwIH07CisKKy8qIAorICogQVNOLjEgY29udGV4dC4KKyAqLworc3RydWN0IGFzbjFfY3R4IHsKKwlpbnQgZXJyb3I7CQkvKiBFcnJvciBjb25kaXRpb24gKi8KKwl1bnNpZ25lZCBjaGFyICpwb2ludGVyOwkvKiBPY3RldCBqdXN0IHRvIGJlIGRlY29kZWQgKi8KKwl1bnNpZ25lZCBjaGFyICpiZWdpbjsJLyogRmlyc3Qgb2N0ZXQgKi8KKwl1bnNpZ25lZCBjaGFyICplbmQ7CS8qIE9jdGV0IGFmdGVyIGxhc3Qgb2N0ZXQgKi8KK307CisKKy8qCisgKiBPY3RldCBzdHJpbmcgKG5vdCBudWxsIHRlcm1pbmF0ZWQpCisgKi8KK3N0cnVjdCBhc24xX29jdHN0ciB7CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKwl1bnNpZ25lZCBpbnQgbGVuOworfTsKKworc3RhdGljIHZvaWQKK2FzbjFfb3BlbihzdHJ1Y3QgYXNuMV9jdHggKmN0eCwgdW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCWN0eC0+YmVnaW4gPSBidWY7CisJY3R4LT5lbmQgPSBidWYgKyBsZW47CisJY3R4LT5wb2ludGVyID0gYnVmOworCWN0eC0+ZXJyb3IgPSBBU04xX0VSUl9OT0VSUk9SOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhcgorYXNuMV9vY3RldF9kZWNvZGUoc3RydWN0IGFzbjFfY3R4ICpjdHgsIHVuc2lnbmVkIGNoYXIgKmNoKQoreworCWlmIChjdHgtPnBvaW50ZXIgPj0gY3R4LT5lbmQpIHsKKwkJY3R4LT5lcnJvciA9IEFTTjFfRVJSX0RFQ19FTVBUWTsKKwkJcmV0dXJuIDA7CisJfQorCSpjaCA9ICooY3R4LT5wb2ludGVyKSsrOworCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhcgorYXNuMV90YWdfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LCB1bnNpZ25lZCBpbnQgKnRhZykKK3sKKwl1bnNpZ25lZCBjaGFyIGNoOworCisJKnRhZyA9IDA7CisKKwlkbyB7CisJCWlmICghYXNuMV9vY3RldF9kZWNvZGUoY3R4LCAmY2gpKQorCQkJcmV0dXJuIDA7CisJCSp0YWcgPDw9IDc7CisJCSp0YWcgfD0gY2ggJiAweDdGOworCX0gd2hpbGUgKChjaCAmIDB4ODApID09IDB4ODApOworCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhcgorYXNuMV9pZF9kZWNvZGUoc3RydWN0IGFzbjFfY3R4ICpjdHgsCisJICAgICAgIHVuc2lnbmVkIGludCAqY2xzLCB1bnNpZ25lZCBpbnQgKmNvbiwgdW5zaWduZWQgaW50ICp0YWcpCit7CisJdW5zaWduZWQgY2hhciBjaDsKKworCWlmICghYXNuMV9vY3RldF9kZWNvZGUoY3R4LCAmY2gpKQorCQlyZXR1cm4gMDsKKworCSpjbHMgPSAoY2ggJiAweEMwKSA+PiA2OworCSpjb24gPSAoY2ggJiAweDIwKSA+PiA1OworCSp0YWcgPSAoY2ggJiAweDFGKTsKKworCWlmICgqdGFnID09IDB4MUYpIHsKKwkJaWYgKCFhc24xX3RhZ19kZWNvZGUoY3R4LCB0YWcpKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhcgorYXNuMV9sZW5ndGhfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LCB1bnNpZ25lZCBpbnQgKmRlZiwgdW5zaWduZWQgaW50ICpsZW4pCit7CisJdW5zaWduZWQgY2hhciBjaCwgY250OworCisJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCisJCXJldHVybiAwOworCisJaWYgKGNoID09IDB4ODApCisJCSpkZWYgPSAwOworCWVsc2UgeworCQkqZGVmID0gMTsKKworCQlpZiAoY2ggPCAweDgwKQorCQkJKmxlbiA9IGNoOworCQllbHNlIHsKKwkJCWNudCA9ICh1bnNpZ25lZCBjaGFyKSAoY2ggJiAweDdGKTsKKwkJCSpsZW4gPSAwOworCisJCQl3aGlsZSAoY250ID4gMCkgeworCQkJCWlmICghYXNuMV9vY3RldF9kZWNvZGUoY3R4LCAmY2gpKQorCQkJCQlyZXR1cm4gMDsKKwkJCQkqbGVuIDw8PSA4OworCQkJCSpsZW4gfD0gY2g7CisJCQkJY250LS07CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyCithc24xX2hlYWRlcl9kZWNvZGUoc3RydWN0IGFzbjFfY3R4ICpjdHgsCisJCSAgIHVuc2lnbmVkIGNoYXIgKiplb2MsCisJCSAgIHVuc2lnbmVkIGludCAqY2xzLCB1bnNpZ25lZCBpbnQgKmNvbiwgdW5zaWduZWQgaW50ICp0YWcpCit7CisJdW5zaWduZWQgaW50IGRlZiwgbGVuOworCisJaWYgKCFhc24xX2lkX2RlY29kZShjdHgsIGNscywgY29uLCB0YWcpKQorCQlyZXR1cm4gMDsKKworCWlmICghYXNuMV9sZW5ndGhfZGVjb2RlKGN0eCwgJmRlZiwgJmxlbikpCisJCXJldHVybiAwOworCisJaWYgKGRlZikKKwkJKmVvYyA9IGN0eC0+cG9pbnRlciArIGxlbjsKKwllbHNlCisJCSplb2MgPSBOVUxMOworCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhcgorYXNuMV9lb2NfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LCB1bnNpZ25lZCBjaGFyICplb2MpCit7CisJdW5zaWduZWQgY2hhciBjaDsKKworCWlmIChlb2MgPT0gTlVMTCkgeworCQlpZiAoIWFzbjFfb2N0ZXRfZGVjb2RlKGN0eCwgJmNoKSkKKwkJCXJldHVybiAwOworCisJCWlmIChjaCAhPSAweDAwKSB7CisJCQljdHgtPmVycm9yID0gQVNOMV9FUlJfREVDX0VPQ19NSVNNQVRDSDsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCisJCQlyZXR1cm4gMDsKKworCQlpZiAoY2ggIT0gMHgwMCkgeworCQkJY3R4LT5lcnJvciA9IEFTTjFfRVJSX0RFQ19FT0NfTUlTTUFUQ0g7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gMTsKKwl9IGVsc2UgeworCQlpZiAoY3R4LT5wb2ludGVyICE9IGVvYykgeworCQkJY3R4LT5lcnJvciA9IEFTTjFfRVJSX0RFQ19MRU5HVEhfTUlTTUFUQ0g7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gMTsKKwl9Cit9CisKKy8qIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGFzbjFfbnVsbF9kZWNvZGUoc3RydWN0IGFzbjFfY3R4ICpjdHgsCisJCQkJICAgICAgdW5zaWduZWQgY2hhciAqZW9jKQoreworCWN0eC0+cG9pbnRlciA9IGVvYzsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgYXNuMV9sb25nX2RlY29kZShzdHJ1Y3QgYXNuMV9jdHggKmN0eCwKKwkJCQkgICAgICB1bnNpZ25lZCBjaGFyICplb2MsIGxvbmcgKmludGVnZXIpCit7CisJdW5zaWduZWQgY2hhciBjaDsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCisJCXJldHVybiAwOworCisJKmludGVnZXIgPSAoc2lnbmVkIGNoYXIpIGNoOworCWxlbiA9IDE7CisKKwl3aGlsZSAoY3R4LT5wb2ludGVyIDwgZW9jKSB7CisJCWlmICgrK2xlbiA+IHNpemVvZihsb25nKSkgeworCQkJY3R4LT5lcnJvciA9IEFTTjFfRVJSX0RFQ19CQURWQUxVRTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCisJCQlyZXR1cm4gMDsKKworCQkqaW50ZWdlciA8PD0gODsKKwkJKmludGVnZXIgfD0gY2g7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBhc24xX3VpbnRfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LAorCQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKmVvYywKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgKmludGVnZXIpCit7CisJdW5zaWduZWQgY2hhciBjaDsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCisJCXJldHVybiAwOworCisJKmludGVnZXIgPSBjaDsKKwlpZiAoY2ggPT0gMCkKKwkJbGVuID0gMDsKKwllbHNlCisJCWxlbiA9IDE7CisKKwl3aGlsZSAoY3R4LT5wb2ludGVyIDwgZW9jKSB7CisJCWlmICgrK2xlbiA+IHNpemVvZih1bnNpZ25lZCBpbnQpKSB7CisJCQljdHgtPmVycm9yID0gQVNOMV9FUlJfREVDX0JBRFZBTFVFOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoIWFzbjFfb2N0ZXRfZGVjb2RlKGN0eCwgJmNoKSkKKwkJCXJldHVybiAwOworCisJCSppbnRlZ2VyIDw8PSA4OworCQkqaW50ZWdlciB8PSBjaDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGFzbjFfdWxvbmdfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LAorCQkJCSAgICAgICB1bnNpZ25lZCBjaGFyICplb2MsCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKmludGVnZXIpCit7CisJdW5zaWduZWQgY2hhciBjaDsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCisJCXJldHVybiAwOworCisJKmludGVnZXIgPSBjaDsKKwlpZiAoY2ggPT0gMCkKKwkJbGVuID0gMDsKKwllbHNlCisJCWxlbiA9IDE7CisKKwl3aGlsZSAoY3R4LT5wb2ludGVyIDwgZW9jKSB7CisJCWlmICgrK2xlbiA+IHNpemVvZih1bnNpZ25lZCBsb25nKSkgeworCQkJY3R4LT5lcnJvciA9IEFTTjFfRVJSX0RFQ19CQURWQUxVRTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCisJCQlyZXR1cm4gMDsKKworCQkqaW50ZWdlciA8PD0gODsKKwkJKmludGVnZXIgfD0gY2g7CisJfQorCXJldHVybiAxOworfSAKKworc3RhdGljIHVuc2lnbmVkIGNoYXIKK2FzbjFfb2N0ZXRzX2RlY29kZShzdHJ1Y3QgYXNuMV9jdHggKmN0eCwKKwkJICAgdW5zaWduZWQgY2hhciAqZW9jLAorCQkgICB1bnNpZ25lZCBjaGFyICoqb2N0ZXRzLCB1bnNpZ25lZCBpbnQgKmxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICpwdHI7CisKKwkqbGVuID0gMDsKKworCSpvY3RldHMgPSBrbWFsbG9jKGVvYyAtIGN0eC0+cG9pbnRlciwgR0ZQX0FUT01JQyk7CisJaWYgKCpvY3RldHMgPT0gTlVMTCkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlwdHIgPSAqb2N0ZXRzOworCXdoaWxlIChjdHgtPnBvaW50ZXIgPCBlb2MpIHsKKwkJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICh1bnNpZ25lZCBjaGFyICopIHB0cisrKSkgeworCQkJa2ZyZWUoKm9jdGV0cyk7CisJCQkqb2N0ZXRzID0gTlVMTDsKKwkJCXJldHVybiAwOworCQl9CisJCSgqbGVuKSsrOworCX0KKwlyZXR1cm4gMTsKK30gKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIKK2FzbjFfc3ViaWRfZGVjb2RlKHN0cnVjdCBhc24xX2N0eCAqY3R4LCB1bnNpZ25lZCBsb25nICpzdWJpZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGNoOworCisJKnN1YmlkID0gMDsKKworCWRvIHsKKwkJaWYgKCFhc24xX29jdGV0X2RlY29kZShjdHgsICZjaCkpCisJCQlyZXR1cm4gMDsKKworCQkqc3ViaWQgPDw9IDc7CisJCSpzdWJpZCB8PSBjaCAmIDB4N0Y7CisJfSB3aGlsZSAoKGNoICYgMHg4MCkgPT0gMHg4MCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgCithc24xX29pZF9kZWNvZGUoc3RydWN0IGFzbjFfY3R4ICpjdHgsCisJCXVuc2lnbmVkIGNoYXIgKmVvYywgdW5zaWduZWQgbG9uZyAqKm9pZCwgdW5zaWduZWQgaW50ICpsZW4pCit7CisJdW5zaWduZWQgbG9uZyBzdWJpZDsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwl1bnNpZ25lZCBsb25nICpvcHRyOworCisJc2l6ZSA9IGVvYyAtIGN0eC0+cG9pbnRlciArIDE7CisJKm9pZCA9IGttYWxsb2Moc2l6ZSAqIHNpemVvZiAodW5zaWduZWQgbG9uZyksIEdGUF9BVE9NSUMpOworCWlmICgqb2lkID09IE5VTEwpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJb3B0ciA9ICpvaWQ7CisKKwlpZiAoIWFzbjFfc3ViaWRfZGVjb2RlKGN0eCwgJnN1YmlkKSkgeworCQlrZnJlZSgqb2lkKTsKKwkJKm9pZCA9IE5VTEw7CisJCXJldHVybiAwOworCX0KKworCWlmIChzdWJpZCA8IDQwKSB7CisJCW9wdHJbMF0gPSAwOworCQlvcHRyWzFdID0gc3ViaWQ7CisJfSBlbHNlIGlmIChzdWJpZCA8IDgwKSB7CisJCW9wdHJbMF0gPSAxOworCQlvcHRyWzFdID0gc3ViaWQgLSA0MDsKKwl9IGVsc2UgeworCQlvcHRyWzBdID0gMjsKKwkJb3B0clsxXSA9IHN1YmlkIC0gODA7CisJfQorCisJKmxlbiA9IDI7CisJb3B0ciArPSAyOworCisJd2hpbGUgKGN0eC0+cG9pbnRlciA8IGVvYykgeworCQlpZiAoKysoKmxlbikgPiBzaXplKSB7CisJCQljdHgtPmVycm9yID0gQVNOMV9FUlJfREVDX0JBRFZBTFVFOworCQkJa2ZyZWUoKm9pZCk7CisJCQkqb2lkID0gTlVMTDsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKCFhc24xX3N1YmlkX2RlY29kZShjdHgsIG9wdHIrKykpIHsKKwkJCWtmcmVlKCpvaWQpOworCQkJKm9pZCA9IE5VTEw7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludAorY29tcGFyZV9vaWQodW5zaWduZWQgbG9uZyAqb2lkMSwgdW5zaWduZWQgaW50IG9pZDFsZW4sCisJICAgIHVuc2lnbmVkIGxvbmcgKm9pZDIsIHVuc2lnbmVkIGludCBvaWQybGVuKQoreworCXVuc2lnbmVkIGludCBpOworCisJaWYgKG9pZDFsZW4gIT0gb2lkMmxlbikKKwkJcmV0dXJuIDA7CisJZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBvaWQxbGVuOyBpKyspIHsKKwkJCWlmIChvaWQxW2ldICE9IG9pZDJbaV0pCisJCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIDE7CisJfQorfQorCisJLyogQkIgY2hlY2sgZm9yIGVuZGlhbiBjb252ZXJzaW9uIGlzc3VlcyBoZXJlICovCisKK2ludAorZGVjb2RlX25lZ1Rva2VuSW5pdCh1bnNpZ25lZCBjaGFyICpzZWN1cml0eV9ibG9iLCBpbnQgbGVuZ3RoLAorCQkgICAgZW51bSBzZWN1cml0eUVudW0gKnNlY1R5cGUpCit7CisJc3RydWN0IGFzbjFfY3R4IGN0eDsKKwl1bnNpZ25lZCBjaGFyICplbmQ7CisJdW5zaWduZWQgY2hhciAqc2VxdWVuY2VfZW5kOworCXVuc2lnbmVkIGxvbmcgKm9pZCA9IE5VTEw7CisJdW5zaWduZWQgaW50IGNscywgY29uLCB0YWcsIG9pZGxlbiwgcmM7CisJaW50IHVzZV9udGxtc3NwID0gRkFMU0U7CisKKwkqc2VjVHlwZSA9IE5UTE07IC8qIEJCIGV2ZW50dWFsbHkgbWFrZSBLZXJiZXJvcyBvciBOTFRNU1NQIHRoZSBkZWZhdWx0ICovCisKKwkvKiBjaWZzX2R1bXBfbWVtKCIgUmVjZWl2ZWQgU2VjQmxvYiAiLCBzZWN1cml0eV9ibG9iLCBsZW5ndGgpOyAqLworCisJYXNuMV9vcGVuKCZjdHgsIHNlY3VyaXR5X2Jsb2IsIGxlbmd0aCk7CisKKwlpZiAoYXNuMV9oZWFkZXJfZGVjb2RlKCZjdHgsICZlbmQsICZjbHMsICZjb24sICZ0YWcpID09IDApIHsKKwkJY0ZZSSgxLCAoIkVycm9yIGRlY29kaW5nIG5lZ1Rva2VuSW5pdCBoZWFkZXIgIikpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKChjbHMgIT0gQVNOMV9BUEwpIHx8IChjb24gIT0gQVNOMV9DT04pCisJCSAgIHx8ICh0YWcgIT0gQVNOMV9FT0MpKSB7CisJCWNGWUkoMSwgKCJjbHMgPSAlZCBjb24gPSAlZCB0YWcgPSAlZCIsIGNscywgY29uLCB0YWcpKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJLyogICAgICByZW1lbWJlciB0byBmcmVlIG9iai0+b2lkICovCisJCXJjID0gYXNuMV9oZWFkZXJfZGVjb2RlKCZjdHgsICZlbmQsICZjbHMsICZjb24sICZ0YWcpOworCQlpZiAocmMpIHsKKwkJCWlmICgodGFnID09IEFTTjFfT0pJKSAmJiAoY2xzID09IEFTTjFfUFJJKSkgeworCQkJCXJjID0gYXNuMV9vaWRfZGVjb2RlKCZjdHgsIGVuZCwgJm9pZCwgJm9pZGxlbik7CisJCQkJaWYgKHJjKSB7CisJCQkJCXJjID0gY29tcGFyZV9vaWQob2lkLCBvaWRsZW4sCisJCQkJCQkJIFNQTkVHT19PSUQsCisJCQkJCQkJIFNQTkVHT19PSURfTEVOKTsKKwkJCQkJa2ZyZWUob2lkKTsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlyYyA9IDA7CisJCX0KKworCQlpZiAoIXJjKSB7CisJCQljRllJKDEsICgiRXJyb3IgZGVjb2RpbmcgbmVnVG9rZW5Jbml0IGhlYWRlciIpKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKGFzbjFfaGVhZGVyX2RlY29kZSgmY3R4LCAmZW5kLCAmY2xzLCAmY29uLCAmdGFnKSA9PSAwKSB7CisJCQljRllJKDEsICgiRXJyb3IgZGVjb2RpbmcgbmVnVG9rZW5Jbml0ICIpKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKChjbHMgIT0gQVNOMV9DVFgpIHx8IChjb24gIT0gQVNOMV9DT04pCisJCQkgICB8fCAodGFnICE9IEFTTjFfRU9DKSkgeworCQkJY0ZZSSgxLCgiY2xzID0gJWQgY29uID0gJWQgdGFnID0gJWQgZW5kID0gJXAgKCVkKSBleGl0IDAiLAorCQkJICAgICAgY2xzLCBjb24sIHRhZywgZW5kLCAqZW5kKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmIChhc24xX2hlYWRlcl9kZWNvZGUoJmN0eCwgJmVuZCwgJmNscywgJmNvbiwgJnRhZykgPT0gMCkgeworCQkJY0ZZSSgxLCAoIkVycm9yIGRlY29kaW5nIG5lZ1Rva2VuSW5pdCAiKSk7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmICgoY2xzICE9IEFTTjFfVU5JKSB8fCAoY29uICE9IEFTTjFfQ09OKQorCQkJICAgfHwgKHRhZyAhPSBBU04xX1NFUSkpIHsKKwkJCWNGWUkoMSwoImNscyA9ICVkIGNvbiA9ICVkIHRhZyA9ICVkIGVuZCA9ICVwICglZCkgZXhpdCAxIiwKKwkJCSAgICAgIGNscywgY29uLCB0YWcsIGVuZCwgKmVuZCkpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoYXNuMV9oZWFkZXJfZGVjb2RlKCZjdHgsICZlbmQsICZjbHMsICZjb24sICZ0YWcpID09IDApIHsKKwkJCWNGWUkoMSwgKCJFcnJvciBkZWNvZGluZyAybmQgcGFydCBvZiBuZWdUb2tlbkluaXQgIikpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAoKGNscyAhPSBBU04xX0NUWCkgfHwgKGNvbiAhPSBBU04xX0NPTikKKwkJCSAgIHx8ICh0YWcgIT0gQVNOMV9FT0MpKSB7CisJCQljRllJKDEsCisJCQkgICAgICgiY2xzID0gJWQgY29uID0gJWQgdGFnID0gJWQgZW5kID0gJXAgKCVkKSBleGl0IDAiLAorCQkJICAgICAgY2xzLCBjb24sIHRhZywgZW5kLCAqZW5kKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmIChhc24xX2hlYWRlcl9kZWNvZGUKKwkJICAgICgmY3R4LCAmc2VxdWVuY2VfZW5kLCAmY2xzLCAmY29uLCAmdGFnKSA9PSAwKSB7CisJCQljRllJKDEsICgiRXJyb3IgZGVjb2RpbmcgMm5kIHBhcnQgb2YgbmVnVG9rZW5Jbml0ICIpKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKChjbHMgIT0gQVNOMV9VTkkpIHx8IChjb24gIT0gQVNOMV9DT04pCisJCQkgICB8fCAodGFnICE9IEFTTjFfU0VRKSkgeworCQkJY0ZZSSgxLAorCQkJICAgICAoImNscyA9ICVkIGNvbiA9ICVkIHRhZyA9ICVkIGVuZCA9ICVwICglZCkgZXhpdCAxIiwKKwkJCSAgICAgIGNscywgY29uLCB0YWcsIGVuZCwgKmVuZCkpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQl3aGlsZSAoIWFzbjFfZW9jX2RlY29kZSgmY3R4LCBzZXF1ZW5jZV9lbmQpKSB7CisJCQlyYyA9IGFzbjFfaGVhZGVyX2RlY29kZSgmY3R4LCAmZW5kLCAmY2xzLCAmY29uLCAmdGFnKTsKKwkJCWlmICghcmMpIHsKKwkJCQljRllJKDEsCisJCQkJICAgICAoIkVycm9yIDEgZGVjb2RpbmcgbmVnVG9rZW5Jbml0IGhlYWRlciBleGl0IDIiKSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlpZiAoKHRhZyA9PSBBU04xX09KSSkgJiYgKGNvbiA9PSBBU04xX1BSSSkpIHsKKwkJCQlyYyA9IGFzbjFfb2lkX2RlY29kZSgmY3R4LCBlbmQsICZvaWQsICZvaWRsZW4pOworCQkJCWlmKHJjKSB7CQkKKwkJCQkJY0ZZSSgxLAorCQkJCQkgICgiT0lEIGxlbiA9ICVkIG9pZCA9IDB4JWx4IDB4JWx4IDB4JWx4IDB4JWx4IiwKKwkJCQkJICAgb2lkbGVuLCAqb2lkLCAqKG9pZCArIDEpLCAqKG9pZCArIDIpLAorCQkJCQkgICAqKG9pZCArIDMpKSk7CisJCQkJCXJjID0gY29tcGFyZV9vaWQob2lkLCBvaWRsZW4sIE5UTE1TU1BfT0lELAorCQkJCQkJIE5UTE1TU1BfT0lEX0xFTik7CisJCQkJCWlmKG9pZCkKKwkJCQkJCWtmcmVlKG9pZCk7CisJCQkJCWlmIChyYykKKwkJCQkJCXVzZV9udGxtc3NwID0gVFJVRTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWNGWUkoMSwoIlRoaXMgc2hvdWxkIGJlIGFuIG9pZCB3aGF0IGlzIGdvaW5nIG9uPyAiKSk7CisJCQl9CisJCX0KKworCQlpZiAoYXNuMV9oZWFkZXJfZGVjb2RlKCZjdHgsICZlbmQsICZjbHMsICZjb24sICZ0YWcpID09IDApIHsKKwkJCWNGWUkoMSwKKwkJCSAgICAgKCJFcnJvciBkZWNvZGluZyBsYXN0IHBhcnQgb2YgbmVnVG9rZW5Jbml0IGV4aXQgMyIpKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKChjbHMgIT0gQVNOMV9DVFgpIHx8IChjb24gIT0gQVNOMV9DT04pKSB7CS8qIHRhZyA9IDMgaW5kaWNhdGluZyBtZWNoTGlzdE1JQyAqLworCQkJY0ZZSSgxLAorCQkJICAgICAoIkV4aXQgNCBjbHMgPSAlZCBjb24gPSAlZCB0YWcgPSAlZCBlbmQgPSAlcCAoJWQpIiwKKwkJCSAgICAgIGNscywgY29uLCB0YWcsIGVuZCwgKmVuZCkpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGFzbjFfaGVhZGVyX2RlY29kZSgmY3R4LCAmZW5kLCAmY2xzLCAmY29uLCAmdGFnKSA9PSAwKSB7CisJCQljRllJKDEsCisJCQkgICAgICgiRXJyb3IgZGVjb2RpbmcgbGFzdCBwYXJ0IG9mIG5lZ1Rva2VuSW5pdCBleGl0IDUiKSk7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmICgoY2xzICE9IEFTTjFfVU5JKSB8fCAoY29uICE9IEFTTjFfQ09OKQorCQkJICAgfHwgKHRhZyAhPSBBU04xX1NFUSkpIHsKKwkJCWNGWUkoMSwKKwkJCSAgICAgKCJFeGl0IDYgY2xzID0gJWQgY29uID0gJWQgdGFnID0gJWQgZW5kID0gJXAgKCVkKSIsCisJCQkgICAgICBjbHMsIGNvbiwgdGFnLCBlbmQsICplbmQpKTsKKwkJfQorCisJCWlmIChhc24xX2hlYWRlcl9kZWNvZGUoJmN0eCwgJmVuZCwgJmNscywgJmNvbiwgJnRhZykgPT0gMCkgeworCQkJY0ZZSSgxLAorCQkJICAgICAoIkVycm9yIGRlY29kaW5nIGxhc3QgcGFydCBvZiBuZWdUb2tlbkluaXQgZXhpdCA3IikpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAoKGNscyAhPSBBU04xX0NUWCkgfHwgKGNvbiAhPSBBU04xX0NPTikpIHsKKwkJCWNGWUkoMSwKKwkJCSAgICAgKCJFeGl0IDggY2xzID0gJWQgY29uID0gJWQgdGFnID0gJWQgZW5kID0gJXAgKCVkKSIsCisJCQkgICAgICBjbHMsIGNvbiwgdGFnLCBlbmQsICplbmQpKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChhc24xX2hlYWRlcl9kZWNvZGUoJmN0eCwgJmVuZCwgJmNscywgJmNvbiwgJnRhZykgPT0gMCkgeworCQkJY0ZZSSgxLAorCQkJICAgICAoIkVycm9yIGRlY29kaW5nIGxhc3QgcGFydCBvZiBuZWdUb2tlbkluaXQgZXhpdCA5IikpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAoKGNscyAhPSBBU04xX1VOSSkgfHwgKGNvbiAhPSBBU04xX1BSSSkKKwkJCSAgIHx8ICh0YWcgIT0gQVNOMV9HRU5TVFIpKSB7CisJCQljRllJKDEsCisJCQkgICAgICgiRXhpdCAxMCBjbHMgPSAlZCBjb24gPSAlZCB0YWcgPSAlZCBlbmQgPSAlcCAoJWQpIiwKKwkJCSAgICAgIGNscywgY29uLCB0YWcsIGVuZCwgKmVuZCkpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJY0ZZSSgxLCAoIk5lZWQgdG8gY2FsbCBhc24xX29jdGV0c19kZWNvZGUoKSBmdW5jdGlvbiBmb3IgdGhpcyAlcyIsIGN0eC5wb2ludGVyKSk7CS8qIGlzIHRoaXMgVVRGLTggb3IgQVNDSUk/ICovCisJfQorCisJLyogaWYgKHVzZV9rZXJiZXJvcykgCisJICAgKnNlY1R5cGUgPSBLZXJiZXJvcyAKKwkgICBlbHNlICovCisJaWYgKHVzZV9udGxtc3NwKSB7CisJCSpzZWNUeXBlID0gTlRMTVNTUDsKKwl9CisKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc19kZWJ1Zy5jIGIvZnMvY2lmcy9jaWZzX2RlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIyOGI1NgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2NpZnMvY2lmc19kZWJ1Zy5jCkBAIC0wLDAgKzEsODA1IEBACisvKgorICogICBmcy9jaWZzX2RlYnVnLmMKKyAqCisgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyAgQ29ycC4sIDIwMDAsMjAwMworICoKKyAqICAgTW9kaWZpZWQgYnkgU3RldmUgRnJlbmNoIChzZnJlbmNoQHVzLmlibS5jb20pCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSAiY2lmc3BkdS5oIgorI2luY2x1ZGUgImNpZnNnbG9iLmgiCisjaW5jbHVkZSAiY2lmc3Byb3RvLmgiCisjaW5jbHVkZSAiY2lmc19kZWJ1Zy5oIgorCit2b2lkCitjaWZzX2R1bXBfbWVtKGNoYXIgKmxhYmVsLCB2b2lkICpkYXRhLCBpbnQgbGVuZ3RoKQoreworCWludCBpLCBqOworCWludCAqaW50cHRyID0gZGF0YTsKKwljaGFyICpjaGFycHRyID0gZGF0YTsKKwljaGFyIGJ1ZlsxMF0sIGxpbmVbODBdOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBkdW1wIG9mICVkIGJ5dGVzIG9mIGRhdGEgYXQgMHglcFxuXG4iLCAKKwkJbGFiZWwsIGxlbmd0aCwgZGF0YSk7CisJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxNikgeworCQlsaW5lWzBdID0gMDsKKwkJZm9yIChqID0gMDsgKGogPCA0KSAmJiAoaSArIGogKiA0IDwgbGVuZ3RoKTsgaisrKSB7CisJCQlzcHJpbnRmKGJ1ZiwgIiAlMDh4IiwgaW50cHRyW2kgLyA0ICsgal0pOworCQkJc3RyY2F0KGxpbmUsIGJ1Zik7CisJCX0KKwkJYnVmWzBdID0gJyAnOworCQlidWZbMl0gPSAwOworCQlmb3IgKGogPSAwOyAoaiA8IDE2KSAmJiAoaSArIGogPCBsZW5ndGgpOyBqKyspIHsKKwkJCWJ1ZlsxXSA9IGlzcHJpbnQoY2hhcnB0cltpICsgal0pID8gY2hhcnB0cltpICsgal0gOiAnLic7CisJCQlzdHJjYXQobGluZSwgYnVmKTsKKwkJfQorCQlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIGxpbmUpOworCX0KK30KKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitzdGF0aWMgaW50CitjaWZzX2RlYnVnX2RhdGFfcmVhZChjaGFyICpidWYsIGNoYXIgKipiZWdpbkJ1ZmZlciwgb2ZmX3Qgb2Zmc2V0LAorCQkgICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDE7CisJc3RydWN0IG1pZF9xX2VudHJ5ICogbWlkX2VudHJ5OworCXN0cnVjdCBjaWZzU2VzSW5mbyAqc2VzOworCXN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb247CisJaW50IGk7CisJaW50IGxlbmd0aCA9IDA7CisJY2hhciAqIG9yaWdpbmFsX2J1ZiA9IGJ1ZjsKKworCSpiZWdpbkJ1ZmZlciA9IGJ1ZiArIG9mZnNldDsKKworCQorCWxlbmd0aCA9CisJICAgIHNwcmludGYoYnVmLAorCQkgICAgIkRpc3BsYXkgSW50ZXJuYWwgQ0lGUyBEYXRhIFN0cnVjdHVyZXMgZm9yIERlYnVnZ2luZ1xuIgorCQkgICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJYnVmICs9IGxlbmd0aDsKKworCWxlbmd0aCA9IHNwcmludGYoYnVmLCAiU2VydmVyczpcbiIpOworCWJ1ZiArPSBsZW5ndGg7CisKKwlpID0gMDsKKwlyZWFkX2xvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCWxpc3RfZm9yX2VhY2godG1wLCAmR2xvYmFsU01CU2Vzc2lvbkxpc3QpIHsKKwkJaSsrOworCQlzZXMgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGNpZnNTZXNJbmZvLCBjaWZzU2Vzc2lvbkxpc3QpOworCQlsZW5ndGggPQorCQkgICAgc3ByaW50ZihidWYsCisJCQkgICAgIlxuJWQpIE5hbWU6ICVzICBEb21haW46ICVzIE1vdW50czogJWQgU2VydmVyT1M6ICVzICBcblx0U2VydmVyTk9TOiAlc1x0Q2FwYWJpbGl0aWVzOiAweCV4XG5cdFNNQiBzZXNzaW9uIHN0YXR1czogJWRcdCIsCisJCQkJaSwgc2VzLT5zZXJ2ZXJOYW1lLCBzZXMtPnNlcnZlckRvbWFpbiwgYXRvbWljX3JlYWQoJnNlcy0+aW5Vc2UpLAorCQkJCXNlcy0+c2VydmVyT1MsIHNlcy0+c2VydmVyTk9TLCBzZXMtPmNhcGFiaWxpdGllcyxzZXMtPnN0YXR1cyk7CisJCWJ1ZiArPSBsZW5ndGg7CisJCWlmKHNlcy0+c2VydmVyKSB7CisJCQlidWYgKz0gc3ByaW50ZihidWYsICJUQ1Agc3RhdHVzOiAlZFxuXHRMb2NhbCBVc2VycyBUbyBTZXJ2ZXI6ICVkIFNlY01vZGU6IDB4JXggUmVxIEFjdGl2ZTogJWQiLAorCQkJCXNlcy0+c2VydmVyLT50Y3BTdGF0dXMsCisJCQkJYXRvbWljX3JlYWQoJnNlcy0+c2VydmVyLT5zb2NrZXRVc2VDb3VudCksCisJCQkJc2VzLT5zZXJ2ZXItPnNlY01vZGUsCisJCQkJYXRvbWljX3JlYWQoJnNlcy0+c2VydmVyLT5pbkZsaWdodCkpOworCQkJCisJCQlsZW5ndGggPSBzcHJpbnRmKGJ1ZiwgIlxuTUlEczogXG4iKTsKKwkJCWJ1ZiArPSBsZW5ndGg7CisKKwkJCXNwaW5fbG9jaygmR2xvYmFsTWlkX0xvY2spOworCQkJbGlzdF9mb3JfZWFjaCh0bXAxLCAmc2VzLT5zZXJ2ZXItPnBlbmRpbmdfbWlkX3EpIHsKKwkJCQltaWRfZW50cnkgPSBsaXN0X2VudHJ5KHRtcDEsIHN0cnVjdAorCQkJCQltaWRfcV9lbnRyeSwKKwkJCQkJcWhlYWQpOworCQkJCWlmKG1pZF9lbnRyeSkgeworCQkJCQlsZW5ndGggPSBzcHJpbnRmKGJ1ZiwiU3RhdGU6ICVkIGNvbTogJWQgcGlkOiAlZCB0c2s6ICVwIG1pZCAlZFxuIixtaWRfZW50cnktPm1pZFN0YXRlLG1pZF9lbnRyeS0+Y29tbWFuZCxtaWRfZW50cnktPnBpZCxtaWRfZW50cnktPnRzayxtaWRfZW50cnktPm1pZCk7CisJCQkJCWJ1ZiArPSBsZW5ndGg7CisJCQkJfQorCQkJfQorCQkJc3Bpbl91bmxvY2soJkdsb2JhbE1pZF9Mb2NrKTsgCisJCX0KKworCX0KKwlyZWFkX3VubG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisJc3ByaW50ZihidWYsICJcbiIpOworCWJ1ZisrOworCisJbGVuZ3RoID0gc3ByaW50ZihidWYsICJcblNoYXJlczpcbiIpOworCWJ1ZiArPSBsZW5ndGg7CisKKwlpID0gMDsKKwlyZWFkX2xvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCWxpc3RfZm9yX2VhY2godG1wLCAmR2xvYmFsVHJlZUNvbm5lY3Rpb25MaXN0KSB7CisJCV9fdTMyIGRldl90eXBlOworCQlpKys7CisJCXRjb24gPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGNpZnNUY29uSW5mbywgY2lmc0Nvbm5lY3Rpb25MaXN0KTsKKwkJZGV2X3R5cGUgPSBsZTMyX3RvX2NwdSh0Y29uLT5mc0RldkluZm8uRGV2aWNlVHlwZSk7CisJCWxlbmd0aCA9CisJCSAgICBzcHJpbnRmKGJ1ZiwKKwkJCSAgICAiXG4lZCkgJXMgVXNlczogJWQgVHlwZTogJXMgQ2hhcmFjdGVyaXN0aWNzOiAweCV4IEF0dHJpYnV0ZXM6IDB4JXhcblBhdGhDb21wb25lbnRNYXg6ICVkIFN0YXR1czogJWQiLAorCQkJICAgIGksIHRjb24tPnRyZWVOYW1lLAorCQkJICAgIGF0b21pY19yZWFkKCZ0Y29uLT51c2VDb3VudCksCisJCQkgICAgdGNvbi0+bmF0aXZlRmlsZVN5c3RlbSwKKwkJCSAgICBsZTMyX3RvX2NwdSh0Y29uLT5mc0RldkluZm8uRGV2aWNlQ2hhcmFjdGVyaXN0aWNzKSwKKwkJCSAgICBsZTMyX3RvX2NwdSh0Y29uLT5mc0F0dHJJbmZvLkF0dHJpYnV0ZXMpLAorCQkJICAgIGxlMzJfdG9fY3B1KHRjb24tPmZzQXR0ckluZm8uTWF4UGF0aE5hbWVDb21wb25lbnRMZW5ndGgpLAorCQkJICAgIHRjb24tPnRpZFN0YXR1cyk7CisJCWJ1ZiArPSBsZW5ndGg7ICAgICAgICAKKwkJaWYgKGRldl90eXBlID09IEZJTEVfREVWSUNFX0RJU0spCisJCQlsZW5ndGggPSBzcHJpbnRmKGJ1ZiwgIiB0eXBlOiBESVNLICIpOworCQllbHNlIGlmIChkZXZfdHlwZSA9PSBGSUxFX0RFVklDRV9DRF9ST00pCisJCQlsZW5ndGggPSBzcHJpbnRmKGJ1ZiwgIiB0eXBlOiBDRFJPTSAiKTsKKwkJZWxzZQorCQkJbGVuZ3RoID0KKwkJCSAgICBzcHJpbnRmKGJ1ZiwgIiB0eXBlOiAlZCAiLCBkZXZfdHlwZSk7CisJCWJ1ZiArPSBsZW5ndGg7CisJCWlmKHRjb24tPnRpZFN0YXR1cyA9PSBDaWZzTmVlZFJlY29ubmVjdCkgeworCQkJYnVmICs9IHNwcmludGYoYnVmLCAiXHRESVNDT05ORUNURUQgIik7CisJCQlsZW5ndGggKz0gMTQ7CisJCX0KKwl9CisJcmVhZF91bmxvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCisJbGVuZ3RoID0gc3ByaW50ZihidWYsICJcbiIpOworCWJ1ZiArPSBsZW5ndGg7CisKKwkvKiBCQiBhZGQgY29kZSB0byBkdW1wIGFkZGl0aW9uYWwgaW5mbyBzdWNoIGFzIFRDUCBzZXNzaW9uIGluZm8gbm93ICovCisJLyogTm93IGNhbGN1bGF0ZSB0b3RhbCBzaXplIG9mIHJldHVybmVkIGRhdGEgKi8KKwlsZW5ndGggPSBidWYgLSBvcmlnaW5hbF9idWY7CisKKwlpZihvZmZzZXQgKyBjb3VudCA+PSBsZW5ndGgpCisJCSplb2YgPSAxOworCWlmKGxlbmd0aCA8IG9mZnNldCkgeworCQkqZW9mID0gMTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJbGVuZ3RoID0gbGVuZ3RoIC0gb2Zmc2V0OworCX0KKwlpZiAobGVuZ3RoID4gY291bnQpCisJCWxlbmd0aCA9IGNvdW50OworCisJcmV0dXJuIGxlbmd0aDsKK30KKworI2lmZGVmIENPTkZJR19DSUZTX1NUQVRTCitzdGF0aWMgaW50CitjaWZzX3N0YXRzX3JlYWQoY2hhciAqYnVmLCBjaGFyICoqYmVnaW5CdWZmZXIsIG9mZl90IG9mZnNldCwKKwkJICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWludCBpdGVtX2xlbmd0aCxpLGxlbmd0aDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisJc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbjsKKworCSpiZWdpbkJ1ZmZlciA9IGJ1ZiArIG9mZnNldDsKKworCWxlbmd0aCA9IHNwcmludGYoYnVmLAorCQkJIlJlc291cmNlcyBpbiB1c2VcbkNJRlMgU2Vzc2lvbjogJWRcbiIsCisJCQlzZXNJbmZvQWxsb2NDb3VudC5jb3VudGVyKTsKKwlidWYgKz0gbGVuZ3RoOworCWl0ZW1fbGVuZ3RoID0gCisJCXNwcmludGYoYnVmLCJTaGFyZSAodW5pcXVlIG1vdW50IHRhcmdldHMpOiAlZFxuIiwKKwkJCXRjb25JbmZvQWxsb2NDb3VudC5jb3VudGVyKTsKKwlsZW5ndGggKz0gaXRlbV9sZW5ndGg7CisJYnVmICs9IGl0ZW1fbGVuZ3RoOyAgICAgIAorCWl0ZW1fbGVuZ3RoID0gCisJCXNwcmludGYoYnVmLCJTTUIgUmVxdWVzdC9SZXNwb25zZSBCdWZmZXI6ICVkIFBvb2wgc2l6ZTogJWRcbiIsCisJCQlidWZBbGxvY0NvdW50LmNvdW50ZXIsY2lmc19taW5fcmN2ICsgdGNwU2VzQWxsb2NDb3VudC5jb3VudGVyKTsKKwlsZW5ndGggKz0gaXRlbV9sZW5ndGg7CisJYnVmICs9IGl0ZW1fbGVuZ3RoOworCWl0ZW1fbGVuZ3RoID0gCisJCXNwcmludGYoYnVmLCJTTUIgU21hbGwgUmVxL1Jlc3AgQnVmZmVyOiAlZCBQb29sIHNpemU6ICVkXG4iLAorCQkJc21CdWZBbGxvY0NvdW50LmNvdW50ZXIsY2lmc19taW5fc21hbGwpOworCWxlbmd0aCArPSBpdGVtX2xlbmd0aDsKKwlidWYgKz0gaXRlbV9sZW5ndGg7CisJaXRlbV9sZW5ndGggPSAKKwkJc3ByaW50ZihidWYsIk9wZXJhdGlvbnMgKE1JRHMpOiAlZFxuIiwKKwkJCW1pZENvdW50LmNvdW50ZXIpOworCWxlbmd0aCArPSBpdGVtX2xlbmd0aDsKKwlidWYgKz0gaXRlbV9sZW5ndGg7CisJaXRlbV9sZW5ndGggPSBzcHJpbnRmKGJ1ZiwKKwkJIlxuJWQgc2Vzc2lvbiAlZCBzaGFyZSByZWNvbm5lY3RzXG4iLAorCQl0Y3BTZXNSZWNvbm5lY3RDb3VudC5jb3VudGVyLHRjb25JbmZvUmVjb25uZWN0Q291bnQuY291bnRlcik7CisJbGVuZ3RoICs9IGl0ZW1fbGVuZ3RoOworCWJ1ZiArPSBpdGVtX2xlbmd0aDsKKworCWl0ZW1fbGVuZ3RoID0gc3ByaW50ZihidWYsCisJCSJUb3RhbCB2ZnMgb3BlcmF0aW9uczogJWQgbWF4aW11bSBhdCBvbmUgdGltZTogJWRcbiIsCisJCUdsb2JhbEN1cnJlbnRYaWQsR2xvYmFsTWF4QWN0aXZlWGlkKTsKKwlsZW5ndGggKz0gaXRlbV9sZW5ndGg7CisJYnVmICs9IGl0ZW1fbGVuZ3RoOworCisJaSA9IDA7CisJcmVhZF9sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKwlsaXN0X2Zvcl9lYWNoKHRtcCwgJkdsb2JhbFRyZWVDb25uZWN0aW9uTGlzdCkgeworCQlpKys7CisJCXRjb24gPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGNpZnNUY29uSW5mbywgY2lmc0Nvbm5lY3Rpb25MaXN0KTsKKwkJaXRlbV9sZW5ndGggPSBzcHJpbnRmKGJ1ZiwiXG4lZCkgJXMiLGksIHRjb24tPnRyZWVOYW1lKTsKKwkJYnVmICs9IGl0ZW1fbGVuZ3RoOworCQlsZW5ndGggKz0gaXRlbV9sZW5ndGg7CisJCWlmKHRjb24tPnRpZFN0YXR1cyA9PSBDaWZzTmVlZFJlY29ubmVjdCkgeworCQkJYnVmICs9IHNwcmludGYoYnVmLCAiXHRESVNDT05ORUNURUQgIik7CisJCQlsZW5ndGggKz0gMTQ7CisJCX0KKwkJaXRlbV9sZW5ndGggPSBzcHJpbnRmKGJ1ZiwiXG5TTUJzOiAlZCBPcGxvY2sgQnJlYWtzOiAlZCIsCisJCQlhdG9taWNfcmVhZCgmdGNvbi0+bnVtX3NtYnNfc2VudCksCisJCQlhdG9taWNfcmVhZCgmdGNvbi0+bnVtX29wbG9ja19icmtzKSk7CisJCWJ1ZiArPSBpdGVtX2xlbmd0aDsKKwkJbGVuZ3RoICs9IGl0ZW1fbGVuZ3RoOworCQlpdGVtX2xlbmd0aCA9IHNwcmludGYoYnVmLCJcblJlYWRzOiAlZCBCeXRlcyAlbGxkIiwKKwkJCWF0b21pY19yZWFkKCZ0Y29uLT5udW1fcmVhZHMpLAorCQkJKGxvbmcgbG9uZykodGNvbi0+Ynl0ZXNfcmVhZCkpOworCQlidWYgKz0gaXRlbV9sZW5ndGg7CisJCWxlbmd0aCArPSBpdGVtX2xlbmd0aDsKKwkJaXRlbV9sZW5ndGggPSBzcHJpbnRmKGJ1ZiwiXG5Xcml0ZXM6ICVkIEJ5dGVzOiAlbGxkIiwKKwkJCWF0b21pY19yZWFkKCZ0Y29uLT5udW1fd3JpdGVzKSwKKwkJCShsb25nIGxvbmcpKHRjb24tPmJ5dGVzX3dyaXR0ZW4pKTsKKwkJYnVmICs9IGl0ZW1fbGVuZ3RoOworCQlsZW5ndGggKz0gaXRlbV9sZW5ndGg7CisJCWl0ZW1fbGVuZ3RoID0gc3ByaW50ZihidWYsCisJCQkiXG5PcGVuczogJWQgRGVsZXRlczogJWRcbk1rZGlyczogJWQgUm1kaXJzOiAlZCIsCisJCQlhdG9taWNfcmVhZCgmdGNvbi0+bnVtX29wZW5zKSwKKwkJCWF0b21pY19yZWFkKCZ0Y29uLT5udW1fZGVsZXRlcyksCisJCQlhdG9taWNfcmVhZCgmdGNvbi0+bnVtX21rZGlycyksCisJCQlhdG9taWNfcmVhZCgmdGNvbi0+bnVtX3JtZGlycykpOworCQlidWYgKz0gaXRlbV9sZW5ndGg7CisJCWxlbmd0aCArPSBpdGVtX2xlbmd0aDsKKwkJaXRlbV9sZW5ndGggPSBzcHJpbnRmKGJ1ZiwKKwkJCSJcblJlbmFtZXM6ICVkIFQyIFJlbmFtZXMgJWQiLAorCQkJYXRvbWljX3JlYWQoJnRjb24tPm51bV9yZW5hbWVzKSwKKwkJCWF0b21pY19yZWFkKCZ0Y29uLT5udW1fdDJyZW5hbWVzKSk7CisJCWJ1ZiArPSBpdGVtX2xlbmd0aDsKKwkJbGVuZ3RoICs9IGl0ZW1fbGVuZ3RoOworCX0KKwlyZWFkX3VubG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisKKwlidWYgKz0gc3ByaW50ZihidWYsIlxuIik7CisJbGVuZ3RoKys7CisKKwlpZihvZmZzZXQgKyBjb3VudCA+PSBsZW5ndGgpCisJCSplb2YgPSAxOworCWlmKGxlbmd0aCA8IG9mZnNldCkgeworCQkqZW9mID0gMTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJbGVuZ3RoID0gbGVuZ3RoIC0gb2Zmc2V0OworCX0KKwlpZiAobGVuZ3RoID4gY291bnQpCisJCWxlbmd0aCA9IGNvdW50OworCQkKKwlyZXR1cm4gbGVuZ3RoOworfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfZnNfY2lmczsKK3JlYWRfcHJvY190IGNpZnNfdHhhbmNob3JfcmVhZDsKK3N0YXRpYyByZWFkX3Byb2NfdCBjaWZzRllJX3JlYWQ7CitzdGF0aWMgd3JpdGVfcHJvY190IGNpZnNGWUlfd3JpdGU7CitzdGF0aWMgcmVhZF9wcm9jX3Qgb3Bsb2NrRW5hYmxlZF9yZWFkOworc3RhdGljIHdyaXRlX3Byb2NfdCBvcGxvY2tFbmFibGVkX3dyaXRlOworc3RhdGljIHJlYWRfcHJvY190IGxvb2t1cEZsYWdfcmVhZDsKK3N0YXRpYyB3cml0ZV9wcm9jX3QgbG9va3VwRmxhZ193cml0ZTsKK3N0YXRpYyByZWFkX3Byb2NfdCB0cmFjZVNNQl9yZWFkOworc3RhdGljIHdyaXRlX3Byb2NfdCB0cmFjZVNNQl93cml0ZTsKK3N0YXRpYyByZWFkX3Byb2NfdCBtdWx0aXVzZXJfbW91bnRfcmVhZDsKK3N0YXRpYyB3cml0ZV9wcm9jX3QgbXVsdGl1c2VyX21vdW50X3dyaXRlOworc3RhdGljIHJlYWRfcHJvY190IGV4dGVuZGVkX3NlY3VyaXR5X3JlYWQ7CitzdGF0aWMgd3JpdGVfcHJvY190IGV4dGVuZGVkX3NlY3VyaXR5X3dyaXRlOworc3RhdGljIHJlYWRfcHJvY190IG50bG12Ml9lbmFibGVkX3JlYWQ7CitzdGF0aWMgd3JpdGVfcHJvY190IG50bG12Ml9lbmFibGVkX3dyaXRlOworc3RhdGljIHJlYWRfcHJvY190IHBhY2tldF9zaWduaW5nX2VuYWJsZWRfcmVhZDsKK3N0YXRpYyB3cml0ZV9wcm9jX3QgcGFja2V0X3NpZ25pbmdfZW5hYmxlZF93cml0ZTsKK3N0YXRpYyByZWFkX3Byb2NfdCBxdW90YUVuYWJsZWRfcmVhZDsKK3N0YXRpYyB3cml0ZV9wcm9jX3QgcXVvdGFFbmFibGVkX3dyaXRlOworc3RhdGljIHJlYWRfcHJvY190IGxpbnV4RXh0ZW5zaW9uc0VuYWJsZWRfcmVhZDsKK3N0YXRpYyB3cml0ZV9wcm9jX3QgbGludXhFeHRlbnNpb25zRW5hYmxlZF93cml0ZTsKKwordm9pZAorY2lmc19wcm9jX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBkZTsKKworCXByb2NfZnNfY2lmcyA9IHByb2NfbWtkaXIoImNpZnMiLCBwcm9jX3Jvb3RfZnMpOworCWlmIChwcm9jX2ZzX2NpZnMgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJcHJvY19mc19jaWZzLT5vd25lciA9IFRISVNfTU9EVUxFOworCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoIkRlYnVnRGF0YSIsIDAsIHByb2NfZnNfY2lmcywKKwkJCQljaWZzX2RlYnVnX2RhdGFfcmVhZCwgTlVMTCk7CisKKyNpZmRlZiBDT05GSUdfQ0lGU19TVEFUUworCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoIlN0YXRzIiwgMCwgcHJvY19mc19jaWZzLAorCQkJCWNpZnNfc3RhdHNfcmVhZCwgTlVMTCk7CisjZW5kaWYKKwlwZGUgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJjaWZzRllJIiwgMCwgcHJvY19mc19jaWZzLAorCQkJCWNpZnNGWUlfcmVhZCwgTlVMTCk7CisJaWYgKHBkZSkKKwkJcGRlLT53cml0ZV9wcm9jID0gY2lmc0ZZSV93cml0ZTsKKworCXBkZSA9CisJICAgIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInRyYWNlU01CIiwgMCwgcHJvY19mc19jaWZzLAorCQkJCXRyYWNlU01CX3JlYWQsIE5VTEwpOworCWlmIChwZGUpCisJCXBkZS0+d3JpdGVfcHJvYyA9IHRyYWNlU01CX3dyaXRlOworCisJcGRlID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiT3Bsb2NrRW5hYmxlZCIsIDAsIHByb2NfZnNfY2lmcywKKwkJCQlvcGxvY2tFbmFibGVkX3JlYWQsIE5VTEwpOworCWlmIChwZGUpCisJCXBkZS0+d3JpdGVfcHJvYyA9IG9wbG9ja0VuYWJsZWRfd3JpdGU7CisKKwlwZGUgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJSZWVuYWJsZU9sZENpZnNSZWFkZGlyQ29kZSIsIDAsIHByb2NfZnNfY2lmcywKKwkJCQlxdW90YUVuYWJsZWRfcmVhZCwgTlVMTCk7CisJaWYgKHBkZSkKKwkJcGRlLT53cml0ZV9wcm9jID0gcXVvdGFFbmFibGVkX3dyaXRlOworCisJcGRlID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiTGludXhFeHRlbnNpb25zRW5hYmxlZCIsIDAsIHByb2NfZnNfY2lmcywKKwkJCQlsaW51eEV4dGVuc2lvbnNFbmFibGVkX3JlYWQsIE5VTEwpOworCWlmIChwZGUpCisJCXBkZS0+d3JpdGVfcHJvYyA9IGxpbnV4RXh0ZW5zaW9uc0VuYWJsZWRfd3JpdGU7CisKKwlwZGUgPQorCSAgICBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJNdWx0aXVzZXJNb3VudCIsIDAsIHByb2NfZnNfY2lmcywKKwkJCQltdWx0aXVzZXJfbW91bnRfcmVhZCwgTlVMTCk7CisJaWYgKHBkZSkKKwkJcGRlLT53cml0ZV9wcm9jID0gbXVsdGl1c2VyX21vdW50X3dyaXRlOworCisJcGRlID0KKwkgICAgY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiRXh0ZW5kZWRTZWN1cml0eSIsIDAsIHByb2NfZnNfY2lmcywKKwkJCQlleHRlbmRlZF9zZWN1cml0eV9yZWFkLCBOVUxMKTsKKwlpZiAocGRlKQorCQlwZGUtPndyaXRlX3Byb2MgPSBleHRlbmRlZF9zZWN1cml0eV93cml0ZTsKKworCXBkZSA9CisJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiTG9va3VwQ2FjaGVFbmFibGVkIiwgMCwgcHJvY19mc19jaWZzLAorCQkJCWxvb2t1cEZsYWdfcmVhZCwgTlVMTCk7CisJaWYgKHBkZSkKKwkJcGRlLT53cml0ZV9wcm9jID0gbG9va3VwRmxhZ193cml0ZTsKKworCXBkZSA9CisJICAgIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoIk5UTE1WMkVuYWJsZWQiLCAwLCBwcm9jX2ZzX2NpZnMsCisJCQkJbnRsbXYyX2VuYWJsZWRfcmVhZCwgTlVMTCk7CisJaWYgKHBkZSkKKwkJcGRlLT53cml0ZV9wcm9jID0gbnRsbXYyX2VuYWJsZWRfd3JpdGU7CisKKwlwZGUgPQorCSAgICBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJQYWNrZXRTaWduaW5nRW5hYmxlZCIsIDAsIHByb2NfZnNfY2lmcywKKwkJCQlwYWNrZXRfc2lnbmluZ19lbmFibGVkX3JlYWQsIE5VTEwpOworCWlmIChwZGUpCisJCXBkZS0+d3JpdGVfcHJvYyA9IHBhY2tldF9zaWduaW5nX2VuYWJsZWRfd3JpdGU7Cit9CisKK3ZvaWQKK2NpZnNfcHJvY19jbGVhbih2b2lkKQoreworCWlmIChwcm9jX2ZzX2NpZnMgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJcmVtb3ZlX3Byb2NfZW50cnkoIkRlYnVnRGF0YSIsIHByb2NfZnNfY2lmcyk7CisJcmVtb3ZlX3Byb2NfZW50cnkoImNpZnNGWUkiLCBwcm9jX2ZzX2NpZnMpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJ0cmFjZVNNQiIsIHByb2NfZnNfY2lmcyk7CisjaWZkZWYgQ09ORklHX0NJRlNfU1RBVFMKKwlyZW1vdmVfcHJvY19lbnRyeSgiU3RhdHMiLCBwcm9jX2ZzX2NpZnMpOworI2VuZGlmCisJcmVtb3ZlX3Byb2NfZW50cnkoIk11bHRpdXNlck1vdW50IiwgcHJvY19mc19jaWZzKTsKKwlyZW1vdmVfcHJvY19lbnRyeSgiT3Bsb2NrRW5hYmxlZCIsIHByb2NfZnNfY2lmcyk7CisJcmVtb3ZlX3Byb2NfZW50cnkoIk5UTE1WMkVuYWJsZWQiLHByb2NfZnNfY2lmcyk7CisJcmVtb3ZlX3Byb2NfZW50cnkoIkV4dGVuZGVkU2VjdXJpdHkiLHByb2NfZnNfY2lmcyk7CisJcmVtb3ZlX3Byb2NfZW50cnkoIlBhY2tldFNpZ25pbmdFbmFibGVkIixwcm9jX2ZzX2NpZnMpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJMaW51eEV4dGVuc2lvbnNFbmFibGVkIixwcm9jX2ZzX2NpZnMpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJSZWVuYWJsZU9sZENpZnNSZWFkZGlyQ29kZSIscHJvY19mc19jaWZzKTsKKwlyZW1vdmVfcHJvY19lbnRyeSgiTG9va3VwQ2FjaGVFbmFibGVkIixwcm9jX2ZzX2NpZnMpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJjaWZzIiwgcHJvY19yb290X2ZzKTsKK30KKworc3RhdGljIGludAorY2lmc0ZZSV9yZWFkKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsCisJICAgICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgbGVuOworCisJbGVuID0gc3ByaW50ZihwYWdlLCAiJWRcbiIsIGNpZnNGWUkpOworCisJbGVuIC09IG9mZjsKKwkqc3RhcnQgPSBwYWdlICsgb2ZmOworCisJaWYgKGxlbiA+IGNvdW50KQorCQlsZW4gPSBjb3VudDsKKwllbHNlCisJCSplb2YgPSAxOworCisJaWYgKGxlbiA8IDApCisJCWxlbiA9IDA7CisKKwlyZXR1cm4gbGVuOworfQorc3RhdGljIGludAorY2lmc0ZZSV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkgICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQoreworCWNoYXIgYzsKKwlpbnQgcmM7CisKKwlyYyA9IGdldF91c2VyKGMsIGJ1ZmZlcik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisJaWYgKGMgPT0gJzAnIHx8IGMgPT0gJ24nIHx8IGMgPT0gJ04nKQorCQljaWZzRllJID0gMDsKKwllbHNlIGlmIChjID09ICcxJyB8fCBjID09ICd5JyB8fCBjID09ICdZJykKKwkJY2lmc0ZZSSA9IDE7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQKK29wbG9ja0VuYWJsZWRfcmVhZChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKwkJICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgbGVuOworCisJbGVuID0gc3ByaW50ZihwYWdlLCAiJWRcbiIsIG9wbG9ja0VuYWJsZWQpOworCisJbGVuIC09IG9mZjsKKwkqc3RhcnQgPSBwYWdlICsgb2ZmOworCisJaWYgKGxlbiA+IGNvdW50KQorCQlsZW4gPSBjb3VudDsKKwllbHNlCisJCSplb2YgPSAxOworCisJaWYgKGxlbiA8IDApCisJCWxlbiA9IDA7CisKKwlyZXR1cm4gbGVuOworfQorc3RhdGljIGludAorb3Bsb2NrRW5hYmxlZF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCit7CisJY2hhciBjOworCWludCByYzsKKworCXJjID0gZ2V0X3VzZXIoYywgYnVmZmVyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKwlpZiAoYyA9PSAnMCcgfHwgYyA9PSAnbicgfHwgYyA9PSAnTicpCisJCW9wbG9ja0VuYWJsZWQgPSAwOworCWVsc2UgaWYgKGMgPT0gJzEnIHx8IGMgPT0gJ3knIHx8IGMgPT0gJ1knKQorCQlvcGxvY2tFbmFibGVkID0gMTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludAorcXVvdGFFbmFibGVkX3JlYWQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKyAgICAgICAgaW50IGxlbjsKKworICAgICAgICBsZW4gPSBzcHJpbnRmKHBhZ2UsICIlZFxuIiwgZXhwZXJpbUVuYWJsZWQpOworLyogY291bGQgYWxzbyBjaGVjayBpZiBxdW90YXMgYXJlIGVuYWJsZWQgaW4ga2VybmVsCisJYXMgYSB3aG9sZSBmaXJzdCAqLworICAgICAgICBsZW4gLT0gb2ZmOworICAgICAgICAqc3RhcnQgPSBwYWdlICsgb2ZmOworCisgICAgICAgIGlmIChsZW4gPiBjb3VudCkKKyAgICAgICAgICAgICAgICBsZW4gPSBjb3VudDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICplb2YgPSAxOworCisgICAgICAgIGlmIChsZW4gPCAwKQorICAgICAgICAgICAgICAgIGxlbiA9IDA7CisKKyAgICAgICAgcmV0dXJuIGxlbjsKK30KK3N0YXRpYyBpbnQKK3F1b3RhRW5hYmxlZF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKK3sKKyAgICAgICAgY2hhciBjOworICAgICAgICBpbnQgcmM7CisKKyAgICAgICAgcmMgPSBnZXRfdXNlcihjLCBidWZmZXIpOworICAgICAgICBpZiAocmMpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJjOworICAgICAgICBpZiAoYyA9PSAnMCcgfHwgYyA9PSAnbicgfHwgYyA9PSAnTicpCisgICAgICAgICAgICAgICAgZXhwZXJpbUVuYWJsZWQgPSAwOworICAgICAgICBlbHNlIGlmIChjID09ICcxJyB8fCBjID09ICd5JyB8fCBjID09ICdZJykKKyAgICAgICAgICAgICAgICBleHBlcmltRW5hYmxlZCA9IDE7CisKKyAgICAgICAgcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50CitsaW51eEV4dGVuc2lvbnNFbmFibGVkX3JlYWQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKyAgICAgICAgaW50IGxlbjsKKworICAgICAgICBsZW4gPSBzcHJpbnRmKHBhZ2UsICIlZFxuIiwgbGludXhFeHRFbmFibGVkKTsKKy8qIGNvdWxkIGFsc28gY2hlY2sgaWYgcXVvdGFzIGFyZSBlbmFibGVkIGluIGtlcm5lbAorCWFzIGEgd2hvbGUgZmlyc3QgKi8KKyAgICAgICAgbGVuIC09IG9mZjsKKyAgICAgICAgKnN0YXJ0ID0gcGFnZSArIG9mZjsKKworICAgICAgICBpZiAobGVuID4gY291bnQpCisgICAgICAgICAgICAgICAgbGVuID0gY291bnQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAqZW9mID0gMTsKKworICAgICAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgICAgICAgICBsZW4gPSAwOworCisgICAgICAgIHJldHVybiBsZW47Cit9CitzdGF0aWMgaW50CitsaW51eEV4dGVuc2lvbnNFbmFibGVkX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQoreworICAgICAgICBjaGFyIGM7CisgICAgICAgIGludCByYzsKKworICAgICAgICByYyA9IGdldF91c2VyKGMsIGJ1ZmZlcik7CisgICAgICAgIGlmIChyYykKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgIGlmIChjID09ICcwJyB8fCBjID09ICduJyB8fCBjID09ICdOJykKKyAgICAgICAgICAgICAgICBsaW51eEV4dEVuYWJsZWQgPSAwOworICAgICAgICBlbHNlIGlmIChjID09ICcxJyB8fCBjID09ICd5JyB8fCBjID09ICdZJykKKyAgICAgICAgICAgICAgICBsaW51eEV4dEVuYWJsZWQgPSAxOworCisgICAgICAgIHJldHVybiBjb3VudDsKK30KKworCitzdGF0aWMgaW50Citsb29rdXBGbGFnX3JlYWQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCSAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaW50IGxlbjsKKworCWxlbiA9IHNwcmludGYocGFnZSwgIiVkXG4iLCBsb29rdXBDYWNoZUVuYWJsZWQpOworCisJbGVuIC09IG9mZjsKKwkqc3RhcnQgPSBwYWdlICsgb2ZmOworCisJaWYgKGxlbiA+IGNvdW50KQorCQlsZW4gPSBjb3VudDsKKwllbHNlCisJCSplb2YgPSAxOworCisJaWYgKGxlbiA8IDApCisJCWxlbiA9IDA7CisKKwlyZXR1cm4gbGVuOworfQorc3RhdGljIGludAorbG9va3VwRmxhZ193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCit7CisJY2hhciBjOworCWludCByYzsKKworCXJjID0gZ2V0X3VzZXIoYywgYnVmZmVyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKwlpZiAoYyA9PSAnMCcgfHwgYyA9PSAnbicgfHwgYyA9PSAnTicpCisJCWxvb2t1cENhY2hlRW5hYmxlZCA9IDA7CisJZWxzZSBpZiAoYyA9PSAnMScgfHwgYyA9PSAneScgfHwgYyA9PSAnWScpCisJCWxvb2t1cENhY2hlRW5hYmxlZCA9IDE7CisKKwlyZXR1cm4gY291bnQ7Cit9CitzdGF0aWMgaW50Cit0cmFjZVNNQl9yZWFkKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLCBpbnQgY291bnQsCisJICAgICAgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaW50IGxlbjsKKworCWxlbiA9IHNwcmludGYocGFnZSwgIiVkXG4iLCB0cmFjZVNNQik7CisKKwlsZW4gLT0gb2ZmOworCSpzdGFydCA9IHBhZ2UgKyBvZmY7CisKKwlpZiAobGVuID4gY291bnQpCisJCWxlbiA9IGNvdW50OworCWVsc2UKKwkJKmVvZiA9IDE7CisKKwlpZiAobGVuIDwgMCkKKwkJbGVuID0gMDsKKworCXJldHVybiBsZW47Cit9CitzdGF0aWMgaW50Cit0cmFjZVNNQl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKK3sKKwljaGFyIGM7CisJaW50IHJjOworCisJcmMgPSBnZXRfdXNlcihjLCBidWZmZXIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCWlmIChjID09ICcwJyB8fCBjID09ICduJyB8fCBjID09ICdOJykKKwkJdHJhY2VTTUIgPSAwOworCWVsc2UgaWYgKGMgPT0gJzEnIHx8IGMgPT0gJ3knIHx8IGMgPT0gJ1knKQorCQl0cmFjZVNNQiA9IDE7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQKK211bHRpdXNlcl9tb3VudF9yZWFkKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkgICAgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaW50IGxlbjsKKworCWxlbiA9IHNwcmludGYocGFnZSwgIiVkXG4iLCBtdWx0aXVzZXJfbW91bnQpOworCisJbGVuIC09IG9mZjsKKwkqc3RhcnQgPSBwYWdlICsgb2ZmOworCisJaWYgKGxlbiA+IGNvdW50KQorCQlsZW4gPSBjb3VudDsKKwllbHNlCisJCSplb2YgPSAxOworCisJaWYgKGxlbiA8IDApCisJCWxlbiA9IDA7CisKKwlyZXR1cm4gbGVuOworfQorc3RhdGljIGludAorbXVsdGl1c2VyX21vdW50X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkgICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQoreworCWNoYXIgYzsKKwlpbnQgcmM7CisKKwlyYyA9IGdldF91c2VyKGMsIGJ1ZmZlcik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisJaWYgKGMgPT0gJzAnIHx8IGMgPT0gJ24nIHx8IGMgPT0gJ04nKQorCQltdWx0aXVzZXJfbW91bnQgPSAwOworCWVsc2UgaWYgKGMgPT0gJzEnIHx8IGMgPT0gJ3knIHx8IGMgPT0gJ1knKQorCQltdWx0aXVzZXJfbW91bnQgPSAxOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50CitleHRlbmRlZF9zZWN1cml0eV9yZWFkKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkgICAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgbGVuOworCisJbGVuID0gc3ByaW50ZihwYWdlLCAiJWRcbiIsIGV4dGVuZGVkX3NlY3VyaXR5KTsKKworCWxlbiAtPSBvZmY7CisJKnN0YXJ0ID0gcGFnZSArIG9mZjsKKworCWlmIChsZW4gPiBjb3VudCkKKwkJbGVuID0gY291bnQ7CisJZWxzZQorCQkqZW9mID0gMTsKKworCWlmIChsZW4gPCAwKQorCQlsZW4gPSAwOworCisJcmV0dXJuIGxlbjsKK30KK3N0YXRpYyBpbnQKK2V4dGVuZGVkX3NlY3VyaXR5X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJdW5zaWduZWQgbG9uZyBjb3VudCwgdm9pZCAqZGF0YSkKK3sKKwljaGFyIGM7CisJaW50IHJjOworCisJcmMgPSBnZXRfdXNlcihjLCBidWZmZXIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCWlmIChjID09ICcwJyB8fCBjID09ICduJyB8fCBjID09ICdOJykKKwkJZXh0ZW5kZWRfc2VjdXJpdHkgPSAwOworCWVsc2UgaWYgKGMgPT0gJzEnIHx8IGMgPT0gJ3knIHx8IGMgPT0gJ1knKQorCQlleHRlbmRlZF9zZWN1cml0eSA9IDE7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQKK250bG12Ml9lbmFibGVkX3JlYWQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCSAgICAgICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWludCBsZW47CisKKwlsZW4gPSBzcHJpbnRmKHBhZ2UsICIlZFxuIiwgbnRsbXYyX3N1cHBvcnQpOworCisJbGVuIC09IG9mZjsKKwkqc3RhcnQgPSBwYWdlICsgb2ZmOworCisJaWYgKGxlbiA+IGNvdW50KQorCQlsZW4gPSBjb3VudDsKKwllbHNlCisJCSplb2YgPSAxOworCisJaWYgKGxlbiA8IDApCisJCWxlbiA9IDA7CisKKwlyZXR1cm4gbGVuOworfQorc3RhdGljIGludAorbnRsbXYyX2VuYWJsZWRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQl1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQoreworCWNoYXIgYzsKKwlpbnQgcmM7CisKKwlyYyA9IGdldF91c2VyKGMsIGJ1ZmZlcik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisJaWYgKGMgPT0gJzAnIHx8IGMgPT0gJ24nIHx8IGMgPT0gJ04nKQorCQludGxtdjJfc3VwcG9ydCA9IDA7CisJZWxzZSBpZiAoYyA9PSAnMScgfHwgYyA9PSAneScgfHwgYyA9PSAnWScpCisJCW50bG12Ml9zdXBwb3J0ID0gMTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludAorcGFja2V0X3NpZ25pbmdfZW5hYmxlZF9yZWFkKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkgICAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgbGVuOworCisJbGVuID0gc3ByaW50ZihwYWdlLCAiJWRcbiIsIHNpZ25fQ0lGU19QRFVzKTsKKworCWxlbiAtPSBvZmY7CisJKnN0YXJ0ID0gcGFnZSArIG9mZjsKKworCWlmIChsZW4gPiBjb3VudCkKKwkJbGVuID0gY291bnQ7CisJZWxzZQorCQkqZW9mID0gMTsKKworCWlmIChsZW4gPCAwKQorCQlsZW4gPSAwOworCisJcmV0dXJuIGxlbjsKK30KK3N0YXRpYyBpbnQKK3BhY2tldF9zaWduaW5nX2VuYWJsZWRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsCisJCQl1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQoreworCWNoYXIgYzsKKwlpbnQgcmM7CisKKwlyYyA9IGdldF91c2VyKGMsIGJ1ZmZlcik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisJaWYgKGMgPT0gJzAnIHx8IGMgPT0gJ24nIHx8IGMgPT0gJ04nKQorCQlzaWduX0NJRlNfUERVcyA9IDA7CisJZWxzZSBpZiAoYyA9PSAnMScgfHwgYyA9PSAneScgfHwgYyA9PSAnWScpCisJCXNpZ25fQ0lGU19QRFVzID0gMTsKKwllbHNlIGlmIChjID09ICcyJykKKwkJc2lnbl9DSUZTX1BEVXMgPSAyOworCisJcmV0dXJuIGNvdW50OworfQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzX2RlYnVnLmggYi9mcy9jaWZzL2NpZnNfZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjI0ZDI4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9jaWZzX2RlYnVnLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqCisgKiAgIENvcHlyaWdodCAoYykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyAgQ29ycC4sIDIwMDAsMjAwMgorICogICBNb2RpZmllZCBieSBTdGV2ZSBGcmVuY2ggKHNmcmVuY2hAdXMuaWJtLmNvbSkKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisqLworI2RlZmluZSBDSUZTX0RFQlVHCQkvKiBCQiB0ZW1wb3JhcnkgKi8KKworI2lmbmRlZiBfSF9DSUZTX0RFQlVHCisjZGVmaW5lIF9IX0NJRlNfREVCVUcKKwordm9pZCBjaWZzX2R1bXBfbWVtKGNoYXIgKmxhYmVsLCB2b2lkICpkYXRhLCBpbnQgbGVuZ3RoKTsKK2V4dGVybiBpbnQgdHJhY2VTTUI7CQkvKiBmbGFnIHdoaWNoIGVuYWJsZXMgdGhlIGZ1bmN0aW9uIGJlbG93ICovCit2b2lkIGR1bXBfc21iKHN0cnVjdCBzbWJfaGRyICosIGludCk7CisKKy8qCisgKglkZWJ1ZyBPTgorICoJLS0tLS0tLS0KKyAqLworI2lmZGVmIENJRlNfREVCVUcKKworCisvKiBpbmZvcm1hdGlvbiBtZXNzYWdlOiBlLmcuLCBjb25maWd1cmF0aW9uLCBtYWpvciBldmVudCAqLworZXh0ZXJuIGludCBjaWZzRllJOworI2RlZmluZSBjaWZzZnlpKGZvcm1hdCxhcmcuLi4pIGlmIChjaWZzRllJKSBwcmludGsoS0VSTl9ERUJVRyAiICIgX19GSUxFX18gIjogIiBmb3JtYXQgIlxuIiAiIiAsICMjIGFyZykKKworI2RlZmluZSBjRllJKGJ1dHRvbixwcnNwZWMpIGlmIChidXR0b24pIGNpZnNmeWkgcHJzcGVjCisKKyNkZWZpbmUgY2lmc3dhcm4oZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgIjogIiBmb3JtYXQgIlxuIiAsICMjIGFyZykKKworLyogZGVidWcgZXZlbnQgbWVzc2FnZTogKi8KK2V4dGVybiBpbnQgY2lmc0VSUk9SOworCisjZGVmaW5lIGNFVkVOVChmb3JtYXQsYXJnLi4uKSBpZiAoY2lmc0VSUk9SKSBwcmludGsoS0VSTl9FVkVOVCBfX0ZJTEVfXyAiOiAiIGZvcm1hdCAiXG4iICwgIyMgYXJnKQorCisvKiBlcnJvciBldmVudCBtZXNzYWdlOiBlLmcuLCBpL28gZXJyb3IgKi8KKyNkZWZpbmUgY2lmc2Vycm9yKGZvcm1hdCxhcmcuLi4pIGlmIChjaWZzRVJST1IpIHByaW50ayhLRVJOX0VSUiAiIENJRlMgVkZTOiAiIGZvcm1hdCAiXG4iICIiICwgIyMgYXJnKQorCisjZGVmaW5lIGNFUlJPUihidXR0b24sIHByc3BlYykgaWYgKGJ1dHRvbikgY2lmc2Vycm9yIHByc3BlYworCisvKgorICoJZGVidWcgT0ZGCisgKgktLS0tLS0tLS0KKyAqLworI2Vsc2UJCS8qIF9DSUZTX0RFQlVHICovCisjZGVmaW5lIGNFUlJPUihidXR0b24scHJzcGVjKQorI2RlZmluZSBjRVZFTlQoZm9ybWF0LGFyZy4uLikKKyNkZWZpbmUgY0ZZSShidXR0b24sIHByc3BlYykKKyNkZWZpbmUgY2lmc2Vycm9yKGZvcm1hdCxhcmcuLi4pCisjZW5kaWYJCS8qIF9DSUZTX0RFQlVHICovCisKKyNlbmRpZgkJCQkvKiBfSF9DSUZTX0RFQlVHICovCmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNfZnNfc2IuaCBiL2ZzL2NpZnMvY2lmc19mc19zYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZGE5MDIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jaWZzL2NpZnNfZnNfc2IuaApAQCAtMCwwICsxLDM5IEBACisvKgorICogICBmcy9jaWZzL2NpZnNfZnNfc2IuaAorICoKKyAqICAgQ29weXJpZ2h0IChjKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzICBDb3JwLiwgMjAwMiwyMDA0CisgKiAgIEF1dGhvcihzKTogU3RldmUgRnJlbmNoIChzZnJlbmNoQHVzLmlibS5jb20pCisgKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisjaWZuZGVmIF9DSUZTX0ZTX1NCX0gKKyNkZWZpbmUgX0NJRlNfRlNfU0JfSAorCisjZGVmaW5lIENJRlNfTU9VTlRfTk9fUEVSTSAgICAgIDEgLyogZG8gbm90IGRvIGNsaWVudCB2ZnNfcGVybSBjaGVjayAqLworI2RlZmluZSBDSUZTX01PVU5UX1NFVF9VSUQgICAgICAyIC8qIHNldCBjdXJyZW50LT5ldWlkIGluIGNyZWF0ZSBldGMuICovCisjZGVmaW5lIENJRlNfTU9VTlRfU0VSVkVSX0lOVU0gIDQgLyogaW5vZGUgbnVtYmVycyBmcm9tIHVuaXF1ZWlkIGZyb20gc2VydmVyICovCisjZGVmaW5lIENJRlNfTU9VTlRfRElSRUNUX0lPICAgIDggLyogZG8gbm90IHdyaXRlIG5vciByZWFkIHRocm91Z2ggcGFnZSBjYWNoZSAqLworI2RlZmluZSBDSUZTX01PVU5UX05PX1hBVFRSICAweDEwIC8qIGlmIHNldCAtIGRpc2FibGUgeGF0dHIgc3VwcG9ydCAqLworCitzdHJ1Y3QgY2lmc19zYl9pbmZvIHsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uOwkvKiBwcmltYXJ5IG1vdW50ICovCisJc3RydWN0IGxpc3RfaGVhZCBuZXN0ZWRfdGNvbl9xOworCXN0cnVjdCBubHNfdGFibGUgKmxvY2FsX25sczsKKwl1bnNpZ25lZCBpbnQgcnNpemU7CisJdW5zaWduZWQgaW50IHdzaXplOworCXVpZF90CW1udF91aWQ7CisJZ2lkX3QJbW50X2dpZDsKKwltb2RlX3QJbW50X2ZpbGVfbW9kZTsKKwltb2RlX3QJbW50X2Rpcl9tb2RlOworCWludCAgICAgbW50X2NpZnNfZmxhZ3M7Cit9OworI2VuZGlmCQkJCS8qIF9DSUZTX0ZTX1NCX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc191bmljb2RlLmMgYi9mcy9jaWZzL2NpZnNfdW5pY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExN2FkZjQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jaWZzL2NpZnNfdW5pY29kZS5jCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiAgIGZzL2NpZnMvY2lmc191bmljb2RlLmMKKyAqCisgKiAgIENvcHlyaWdodCAoYykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyAgQ29ycC4sIDIwMDAsMjAwMgorICogICBNb2RpZmllZCBieSBTdGV2ZSBGcmVuY2ggKHNmcmVuY2hAdXMuaWJtLmNvbSkKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSAiY2lmc191bmljb2RlLmgiCisjaW5jbHVkZSAiY2lmc191bml1cHIuaCIKKyNpbmNsdWRlICJjaWZzcGR1LmgiCisjaW5jbHVkZSAiY2lmc19kZWJ1Zy5oIgorCisvKgorICogTkFNRToJY2lmc19zdHJmcm9tVUNTKCkKKyAqCisgKiBGVU5DVElPTjoJQ29udmVydCBsaXR0bGUtZW5kaWFuIHVuaWNvZGUgc3RyaW5nIHRvIGNoYXJhY3RlciBzdHJpbmcKKyAqCisgKi8KK2ludAorY2lmc19zdHJmcm9tVUNTX2xlKGNoYXIgKnRvLCBjb25zdCB3Y2hhcl90ICogZnJvbSwJLyogTElUVExFIEVORElBTiAqLworCQkgICBpbnQgbGVuLCBjb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpjb2RlcGFnZSkKK3sKKwlpbnQgaTsKKwlpbnQgb3V0bGVuID0gMDsKKworCWZvciAoaSA9IDA7IChpIDwgbGVuKSAmJiBmcm9tW2ldOyBpKyspIHsKKwkJaW50IGNoYXJsZW47CisJCS8qIDIuNC4wIGtlcm5lbCBvciBncmVhdGVyICovCisJCWNoYXJsZW4gPQorCQkgICAgY29kZXBhZ2UtPnVuaTJjaGFyKGxlMTZfdG9fY3B1KGZyb21baV0pLCAmdG9bb3V0bGVuXSwKKwkJCQkgICAgICAgTkxTX01BWF9DSEFSU0VUX1NJWkUpOworCQlpZiAoY2hhcmxlbiA+IDApIHsKKwkJCW91dGxlbiArPSBjaGFybGVuOworCQl9IGVsc2UgeworCQkJdG9bb3V0bGVuKytdID0gJz8nOworCQl9CisJfQorCXRvW291dGxlbl0gPSAwOworCXJldHVybiBvdXRsZW47Cit9CisKKy8qCisgKiBOQU1FOgljaWZzX3N0cnRvVUNTKCkKKyAqCisgKiBGVU5DVElPTjoJQ29udmVydCBjaGFyYWN0ZXIgc3RyaW5nIHRvIHVuaWNvZGUgc3RyaW5nCisgKgorICovCitpbnQKK2NpZnNfc3RydG9VQ1Mod2NoYXJfdCAqIHRvLCBjb25zdCBjaGFyICpmcm9tLCBpbnQgbGVuLAorCSAgICAgIGNvbnN0IHN0cnVjdCBubHNfdGFibGUgKmNvZGVwYWdlKQoreworCWludCBjaGFybGVuOworCWludCBpOworCisJZm9yIChpID0gMDsgbGVuICYmICpmcm9tOyBpKyssIGZyb20gKz0gY2hhcmxlbiwgbGVuIC09IGNoYXJsZW4pIHsKKworCQkvKiB3b3JrcyBmb3IgMi40LjAga2VybmVsIG9yIGxhdGVyICovCisJCWNoYXJsZW4gPSBjb2RlcGFnZS0+Y2hhcjJ1bmkoZnJvbSwgbGVuLCAmdG9baV0pOworCQlpZiAoY2hhcmxlbiA8IDEpIHsKKwkJCWNFUlJPUigxLAorCQkJICAgICAgICgiY2lmc19zdHJ0b1VDUzogY2hhcjJ1bmkgcmV0dXJuZWQgJWQiLAorCQkJCWNoYXJsZW4pKTsKKwkJCXRvW2ldID0gY3B1X3RvX2xlMTYoMHgwMDNmKTsJLyogYSBxdWVzdGlvbiBtYXJrICovCisJCQljaGFybGVuID0gMTsKKwkJfQorCQl0b1tpXSA9IGNwdV90b19sZTE2KHRvW2ldKTsKKworCX0KKworCXRvW2ldID0gMDsKKwlyZXR1cm4gaTsKK30KKwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzX3VuaWNvZGUuaCBiL2ZzL2NpZnMvY2lmc191bmljb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE4ZGRlOQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2NpZnMvY2lmc191bmljb2RlLmgKQEAgLTAsMCArMSwzNTMgQEAKKy8qCisgKiBjaWZzX3VuaWNvZGU6ICBVbmljb2RlIGtlcm5lbCBjYXNlIHN1cHBvcnQKKyAqCisgKiBGdW5jdGlvbjoKKyAqICAgICBDb252ZXJ0IGEgdW5pY29kZSBjaGFyYWN0ZXIgdG8gdXBwZXIgb3IgbG93ZXIgY2FzZSB1c2luZworICogICAgIGNvbXByZXNzZWQgdGFibGVzLgorICoKKyAqICAgQ29weXJpZ2h0IChjKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzICBDb3JwLiwgMjAwMCwyMDAyCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKgorICoKKyAqIE5vdGVzOgorICogICAgIFRoZXNlIEFQSXMgYXJlIGJhc2VkIG9uIHRoZSBDIGxpYnJhcnkgZnVuY3Rpb25zLiAgVGhlIHNlbWFudGljcworICogICAgIHNob3VsZCBtYXRjaCB0aGUgQyBmdW5jdGlvbnMgYnV0IHdpdGggZXhwYW5kZWQgc2l6ZSBvcGVyYW5kcy4KKyAqCisgKiAgICAgVGhlIHVwcGVyL2xvd2VyIGZ1bmN0aW9ucyBhcmUgYmFzZWQgb24gYSB0YWJsZSBjcmVhdGVkIGJ5IG1rdXByLgorICogICAgIFRoaXMgaXMgYSBjb21wcmVzc2VkIHRhYmxlIG9mIHVwcGVyIGFuZCBsb3dlciBjYXNlIGNvbnZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKworI2RlZmluZSAgVU5JVVBSX05PTE9XRVIJCS8qIEV4YW1wbGUgdG8gbm90IGV4cGFuZCBsb3dlciBjYXNlIHRhYmxlcyAqLworCisvKiBKdXN0IGRlZmluZSB3aGF0IHdlIHdhbnQgZnJvbSB1bml1cHIuaC4gIFdlIGRvbid0IHdhbnQgdG8gZGVmaW5lIHRoZSB0YWJsZXMKKyAqIGluIGVhY2ggc291cmNlIGZpbGUuCisgKi8KKyNpZm5kZWYJVU5JQ0FTRVJBTkdFX0RFRklORUQKK3N0cnVjdCBVbmlDYXNlUmFuZ2UgeworCXdjaGFyX3Qgc3RhcnQ7CisJd2NoYXJfdCBlbmQ7CisJc2lnbmVkIGNoYXIgKnRhYmxlOworfTsKKyNlbmRpZgkJCQkvKiBVTklDQVNFUkFOR0VfREVGSU5FRCAqLworCisjaWZuZGVmIFVOSVVQUl9OT1VQUEVSCitleHRlcm4gc2lnbmVkIGNoYXIgQ2lmc1VuaVVwcGVyVGFibGVbNTEyXTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgVW5pQ2FzZVJhbmdlIENpZnNVbmlVcHBlclJhbmdlW107CisjZW5kaWYJCQkJLyogVU5JVVBSX05PVVBQRVIgKi8KKworI2lmbmRlZiBVTklVUFJfTk9MT1dFUgorZXh0ZXJuIHNpZ25lZCBjaGFyIFVuaUxvd2VyVGFibGVbNTEyXTsKK2V4dGVybiBzdHJ1Y3QgVW5pQ2FzZVJhbmdlIFVuaUxvd2VyUmFuZ2VbXTsKKyNlbmRpZgkJCQkvKiBVTklVUFJfTk9MT1dFUiAqLworCisjaWZkZWYgX19LRVJORUxfXworaW50IGNpZnNfc3RyZnJvbVVDU19sZShjaGFyICosIGNvbnN0IHdjaGFyX3QgKiwgaW50LCBjb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICopOworaW50IGNpZnNfc3RydG9VQ1Mod2NoYXJfdCAqLCBjb25zdCBjaGFyICosIGludCwgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqKTsKKyNlbmRpZgorCisvKgorICogVW5pU3RyY2F0OiAgQ29uY2F0ZW5hdGUgdGhlIHNlY29uZCBzdHJpbmcgdG8gdGhlIGZpcnN0CisgKgorICogUmV0dXJuczoKKyAqICAgICBBZGRyZXNzIG9mIHRoZSBmaXJzdCBzdHJpbmcKKyAqLworc3RhdGljIGlubGluZSB3Y2hhcl90ICoKK1VuaVN0cmNhdCh3Y2hhcl90ICogdWNzMSwgY29uc3Qgd2NoYXJfdCAqIHVjczIpCit7CisJd2NoYXJfdCAqYW5jaG9yID0gdWNzMTsJLyogc2F2ZSBhIHBvaW50ZXIgdG8gc3RhcnQgb2YgdWNzMSAqLworCisJd2hpbGUgKCp1Y3MxKyspIDsJLyogVG8gZW5kIG9mIGZpcnN0IHN0cmluZyAqLworCXVjczEtLTsJCQkvKiBSZXR1cm4gdG8gdGhlIG51bGwgKi8KKwl3aGlsZSAoKCp1Y3MxKysgPSAqdWNzMisrKSkgOwkvKiBjb3B5IHN0cmluZyAyIG92ZXIgKi8KKwlyZXR1cm4gYW5jaG9yOworfQorCisvKgorICogVW5pU3RyY2hyOiAgRmluZCBhIGNoYXJhY3RlciBpbiBhIHN0cmluZworICoKKyAqIFJldHVybnM6CisgKiAgICAgQWRkcmVzcyBvZiBmaXJzdCBvY2N1cnJlbmNlIG9mIGNoYXJhY3RlciBpbiBzdHJpbmcKKyAqICAgICBvciBOVUxMIGlmIHRoZSBjaGFyYWN0ZXIgaXMgbm90IGluIHRoZSBzdHJpbmcKKyAqLworc3RhdGljIGlubGluZSB3Y2hhcl90ICoKK1VuaVN0cmNocihjb25zdCB3Y2hhcl90ICogdWNzLCB3Y2hhcl90IHVjKQoreworCXdoaWxlICgoKnVjcyAhPSB1YykgJiYgKnVjcykKKwkJdWNzKys7CisKKwlpZiAoKnVjcyA9PSB1YykKKwkJcmV0dXJuICh3Y2hhcl90ICopIHVjczsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIFVuaVN0cmNtcDogIENvbXBhcmUgdHdvIHN0cmluZ3MKKyAqCisgKiBSZXR1cm5zOgorICogICAgIDwgMDogIEZpcnN0IHN0cmluZyBpcyBsZXNzIHRoYW4gc2Vjb25kCisgKiAgICAgPSAwOiAgU3RyaW5ncyBhcmUgZXF1YWwKKyAqICAgICA+IDA6ICBGaXJzdCBzdHJpbmcgaXMgZ3JlYXRlciB0aGFuIHNlY29uZAorICovCitzdGF0aWMgaW5saW5lIGludAorVW5pU3RyY21wKGNvbnN0IHdjaGFyX3QgKiB1Y3MxLCBjb25zdCB3Y2hhcl90ICogdWNzMikKK3sKKwl3aGlsZSAoKCp1Y3MxID09ICp1Y3MyKSAmJiAqdWNzMSkgeworCQl1Y3MxKys7CisJCXVjczIrKzsKKwl9CisJcmV0dXJuIChpbnQpICp1Y3MxIC0gKGludCkgKnVjczI7Cit9CisKKy8qCisgKiBVbmlTdHJjcHk6ICBDb3B5IGEgc3RyaW5nCisgKi8KK3N0YXRpYyBpbmxpbmUgd2NoYXJfdCAqCitVbmlTdHJjcHkod2NoYXJfdCAqIHVjczEsIGNvbnN0IHdjaGFyX3QgKiB1Y3MyKQoreworCXdjaGFyX3QgKmFuY2hvciA9IHVjczE7CS8qIHNhdmUgdGhlIHN0YXJ0IG9mIHJlc3VsdCBzdHJpbmcgKi8KKworCXdoaWxlICgoKnVjczErKyA9ICp1Y3MyKyspKSA7CisJcmV0dXJuIGFuY2hvcjsKK30KKworLyoKKyAqIFVuaVN0cmxlbjogIFJldHVybiB0aGUgbGVuZ3RoIG9mIGEgc3RyaW5nIChpbiAxNiBiaXQgVW5pY29kZSBjaGFycyBub3QgYnl0ZXMpCisgKi8KK3N0YXRpYyBpbmxpbmUgc2l6ZV90CitVbmlTdHJsZW4oY29uc3Qgd2NoYXJfdCAqIHVjczEpCit7CisJaW50IGkgPSAwOworCisJd2hpbGUgKCp1Y3MxKyspCisJCWkrKzsKKwlyZXR1cm4gaTsKK30KKworLyoKKyAqIFVuaVN0cm5sZW46ICBSZXR1cm4gdGhlIGxlbmd0aCAoaW4gMTYgYml0IFVuaWNvZGUgY2hhcnMgbm90IGJ5dGVzKSBvZiBhIHN0cmluZyAobGVuZ3RoIGxpbWl0ZWQpCisgKi8KK3N0YXRpYyBpbmxpbmUgc2l6ZV90CitVbmlTdHJubGVuKGNvbnN0IHdjaGFyX3QgKiB1Y3MxLCBpbnQgbWF4bGVuKQoreworCWludCBpID0gMDsKKworCXdoaWxlICgqdWNzMSsrKSB7CisJCWkrKzsKKwkJaWYgKGkgPj0gbWF4bGVuKQorCQkJYnJlYWs7CisJfQorCXJldHVybiBpOworfQorCisvKgorICogVW5pU3RybmNhdDogIENvbmNhdGVuYXRlIGxlbmd0aCBsaW1pdGVkIHN0cmluZworICovCitzdGF0aWMgaW5saW5lIHdjaGFyX3QgKgorVW5pU3RybmNhdCh3Y2hhcl90ICogdWNzMSwgY29uc3Qgd2NoYXJfdCAqIHVjczIsIHNpemVfdCBuKQoreworCXdjaGFyX3QgKmFuY2hvciA9IHVjczE7CS8qIHNhdmUgcG9pbnRlciB0byBzdHJpbmcgMSAqLworCisJd2hpbGUgKCp1Y3MxKyspIDsKKwl1Y3MxLS07CQkJLyogcG9pbnQgdG8gbnVsbCB0ZXJtaW5hdG9yIG9mIHMxICovCisJd2hpbGUgKG4tLSAmJiAoKnVjczEgPSAqdWNzMikpIHsJLyogY29weSBzMiBhZnRlciBzMSAqLworCQl1Y3MxKys7CisJCXVjczIrKzsKKwl9CisJKnVjczEgPSAwOwkJLyogTnVsbCB0ZXJtaW5hdGUgdGhlIHJlc3VsdCAqLworCXJldHVybiAoYW5jaG9yKTsKK30KKworLyoKKyAqIFVuaVN0cm5jbXA6ICBDb21wYXJlIGxlbmd0aCBsaW1pdGVkIHN0cmluZworICovCitzdGF0aWMgaW5saW5lIGludAorVW5pU3RybmNtcChjb25zdCB3Y2hhcl90ICogdWNzMSwgY29uc3Qgd2NoYXJfdCAqIHVjczIsIHNpemVfdCBuKQoreworCWlmICghbikKKwkJcmV0dXJuIDA7CS8qIE51bGwgc3RyaW5ncyBhcmUgZXF1YWwgKi8KKwl3aGlsZSAoKCp1Y3MxID09ICp1Y3MyKSAmJiAqdWNzMSAmJiAtLW4pIHsKKwkJdWNzMSsrOworCQl1Y3MyKys7CisJfQorCXJldHVybiAoaW50KSAqdWNzMSAtIChpbnQpICp1Y3MyOworfQorCisvKgorICogVW5pU3RybmNtcF9sZTogIENvbXBhcmUgbGVuZ3RoIGxpbWl0ZWQgc3RyaW5nIC0gbmF0aXZlIHRvIGxpdHRsZS1lbmRpYW4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK1VuaVN0cm5jbXBfbGUoY29uc3Qgd2NoYXJfdCAqIHVjczEsIGNvbnN0IHdjaGFyX3QgKiB1Y3MyLCBzaXplX3QgbikKK3sKKwlpZiAoIW4pCisJCXJldHVybiAwOwkvKiBOdWxsIHN0cmluZ3MgYXJlIGVxdWFsICovCisJd2hpbGUgKCgqdWNzMSA9PSBfX2xlMTZfdG9fY3B1KCp1Y3MyKSkgJiYgKnVjczEgJiYgLS1uKSB7CisJCXVjczErKzsKKwkJdWNzMisrOworCX0KKwlyZXR1cm4gKGludCkgKnVjczEgLSAoaW50KSBfX2xlMTZfdG9fY3B1KCp1Y3MyKTsKK30KKworLyoKKyAqIFVuaVN0cm5jcHk6ICBDb3B5IGxlbmd0aCBsaW1pdGVkIHN0cmluZyB3aXRoIHBhZAorICovCitzdGF0aWMgaW5saW5lIHdjaGFyX3QgKgorVW5pU3RybmNweSh3Y2hhcl90ICogdWNzMSwgY29uc3Qgd2NoYXJfdCAqIHVjczIsIHNpemVfdCBuKQoreworCXdjaGFyX3QgKmFuY2hvciA9IHVjczE7CisKKwl3aGlsZSAobi0tICYmICp1Y3MyKQkvKiBDb3B5IHRoZSBzdHJpbmdzICovCisJCSp1Y3MxKysgPSAqdWNzMisrOworCisJbisrOworCXdoaWxlIChuLS0pCQkvKiBQYWQgd2l0aCBudWxscyAqLworCQkqdWNzMSsrID0gMDsKKwlyZXR1cm4gYW5jaG9yOworfQorCisvKgorICogVW5pU3RybmNweV9sZTogIENvcHkgbGVuZ3RoIGxpbWl0ZWQgc3RyaW5nIHdpdGggcGFkIHRvIGxpdHRsZS1lbmRpYW4KKyAqLworc3RhdGljIGlubGluZSB3Y2hhcl90ICoKK1VuaVN0cm5jcHlfbGUod2NoYXJfdCAqIHVjczEsIGNvbnN0IHdjaGFyX3QgKiB1Y3MyLCBzaXplX3QgbikKK3sKKwl3Y2hhcl90ICphbmNob3IgPSB1Y3MxOworCisJd2hpbGUgKG4tLSAmJiAqdWNzMikJLyogQ29weSB0aGUgc3RyaW5ncyAqLworCQkqdWNzMSsrID0gX19sZTE2X3RvX2NwdSgqdWNzMisrKTsKKworCW4rKzsKKwl3aGlsZSAobi0tKQkJLyogUGFkIHdpdGggbnVsbHMgKi8KKwkJKnVjczErKyA9IDA7CisJcmV0dXJuIGFuY2hvcjsKK30KKworLyoKKyAqIFVuaVN0cnN0cjogIEZpbmQgYSBzdHJpbmcgaW4gYSBzdHJpbmcKKyAqCisgKiBSZXR1cm5zOgorICogICAgIEFkZHJlc3Mgb2YgZmlyc3QgbWF0Y2ggZm91bmQKKyAqICAgICBOVUxMIGlmIG5vIG1hdGNoaW5nIHN0cmluZyBpcyBmb3VuZAorICovCitzdGF0aWMgaW5saW5lIHdjaGFyX3QgKgorVW5pU3Ryc3RyKGNvbnN0IHdjaGFyX3QgKiB1Y3MxLCBjb25zdCB3Y2hhcl90ICogdWNzMikKK3sKKwljb25zdCB3Y2hhcl90ICphbmNob3IxID0gdWNzMTsKKwljb25zdCB3Y2hhcl90ICphbmNob3IyID0gdWNzMjsKKworCXdoaWxlICgqdWNzMSkgeworCQlpZiAoKnVjczEgPT0gKnVjczIpIHsJLyogUGFydGlhbCBtYXRjaCBmb3VuZCAqLworCQkJdWNzMSsrOworCQkJdWNzMisrOworCQl9IGVsc2UgeworCQkJaWYgKCEqdWNzMikJLyogTWF0Y2ggZm91bmQgKi8KKwkJCQlyZXR1cm4gKHdjaGFyX3QgKikgYW5jaG9yMTsKKwkJCXVjczEgPSArK2FuY2hvcjE7CS8qIE5vIG1hdGNoICovCisJCQl1Y3MyID0gYW5jaG9yMjsKKwkJfQorCX0KKworCWlmICghKnVjczIpCQkvKiBCb3RoIGVuZCB0b2dldGhlciAqLworCQlyZXR1cm4gKHdjaGFyX3QgKikgYW5jaG9yMTsJLyogTWF0Y2ggZm91bmQgKi8KKwlyZXR1cm4gTlVMTDsJCS8qIE5vIG1hdGNoICovCit9CisKKyNpZm5kZWYgVU5JVVBSX05PVVBQRVIKKy8qCisgKiBVbmlUb3VwcGVyOiAgQ29udmVydCBhIHVuaWNvZGUgY2hhcmFjdGVyIHRvIHVwcGVyIGNhc2UKKyAqLworc3RhdGljIGlubGluZSB3Y2hhcl90CitVbmlUb3VwcGVyKHJlZ2lzdGVyIHdjaGFyX3QgdWMpCit7CisJcmVnaXN0ZXIgY29uc3Qgc3RydWN0IFVuaUNhc2VSYW5nZSAqcnA7CisKKwlpZiAodWMgPCBzaXplb2YgKENpZnNVbmlVcHBlclRhYmxlKSkgewkvKiBMYXRpbiBjaGFyYWN0ZXJzICovCisJCXJldHVybiB1YyArIENpZnNVbmlVcHBlclRhYmxlW3VjXTsJLyogVXNlIGJhc2UgdGFibGVzICovCisJfSBlbHNlIHsKKwkJcnAgPSBDaWZzVW5pVXBwZXJSYW5nZTsJLyogVXNlIHJhbmdlIHRhYmxlcyAqLworCQl3aGlsZSAocnAtPnN0YXJ0KSB7CisJCQlpZiAodWMgPCBycC0+c3RhcnQpCS8qIEJlZm9yZSBzdGFydCBvZiByYW5nZSAqLworCQkJCXJldHVybiB1YzsJLyogVXBwZXJjYXNlID0gaW5wdXQgKi8KKwkJCWlmICh1YyA8PSBycC0+ZW5kKQkvKiBJbiByYW5nZSAqLworCQkJCXJldHVybiB1YyArIHJwLT50YWJsZVt1YyAtIHJwLT5zdGFydF07CisJCQlycCsrOwkvKiBUcnkgbmV4dCByYW5nZSAqLworCQl9CisJfQorCXJldHVybiB1YzsJCS8qIFBhc3QgbGFzdCByYW5nZSAqLworfQorCisvKgorICogVW5pU3RydXByOiAgVXBwZXIgY2FzZSBhIHVuaWNvZGUgc3RyaW5nCisgKi8KK3N0YXRpYyBpbmxpbmUgd2NoYXJfdCAqCitVbmlTdHJ1cHIocmVnaXN0ZXIgd2NoYXJfdCAqIHVwaW4pCit7CisJcmVnaXN0ZXIgd2NoYXJfdCAqdXA7CisKKwl1cCA9IHVwaW47CisJd2hpbGUgKCp1cCkgewkJLyogRm9yIGFsbCBjaGFyYWN0ZXJzICovCisJCSp1cCA9IFVuaVRvdXBwZXIoKnVwKTsKKwkJdXArKzsKKwl9CisJcmV0dXJuIHVwaW47CQkvKiBSZXR1cm4gaW5wdXQgcG9pbnRlciAqLworfQorI2VuZGlmCQkJCS8qIFVOSVVQUl9OT1VQUEVSICovCisKKyNpZm5kZWYgVU5JVVBSX05PTE9XRVIKKy8qCisgKiBVbmlUb2xvd2VyOiAgQ29udmVydCBhIHVuaWNvZGUgY2hhcmFjdGVyIHRvIGxvd2VyIGNhc2UKKyAqLworc3RhdGljIGlubGluZSB3Y2hhcl90CitVbmlUb2xvd2VyKHdjaGFyX3QgdWMpCit7CisJcmVnaXN0ZXIgc3RydWN0IFVuaUNhc2VSYW5nZSAqcnA7CisKKwlpZiAodWMgPCBzaXplb2YgKFVuaUxvd2VyVGFibGUpKSB7CS8qIExhdGluIGNoYXJhY3RlcnMgKi8KKwkJcmV0dXJuIHVjICsgVW5pTG93ZXJUYWJsZVt1Y107CS8qIFVzZSBiYXNlIHRhYmxlcyAqLworCX0gZWxzZSB7CisJCXJwID0gVW5pTG93ZXJSYW5nZTsJLyogVXNlIHJhbmdlIHRhYmxlcyAqLworCQl3aGlsZSAocnAtPnN0YXJ0KSB7CisJCQlpZiAodWMgPCBycC0+c3RhcnQpCS8qIEJlZm9yZSBzdGFydCBvZiByYW5nZSAqLworCQkJCXJldHVybiB1YzsJLyogVXBwZXJjYXNlID0gaW5wdXQgKi8KKwkJCWlmICh1YyA8PSBycC0+ZW5kKQkvKiBJbiByYW5nZSAqLworCQkJCXJldHVybiB1YyArIHJwLT50YWJsZVt1YyAtIHJwLT5zdGFydF07CisJCQlycCsrOwkvKiBUcnkgbmV4dCByYW5nZSAqLworCQl9CisJfQorCXJldHVybiB1YzsJCS8qIFBhc3QgbGFzdCByYW5nZSAqLworfQorCisvKgorICogVW5pU3RybHdyOiAgTG93ZXIgY2FzZSBhIHVuaWNvZGUgc3RyaW5nCisgKi8KK3N0YXRpYyBpbmxpbmUgd2NoYXJfdCAqCitVbmlTdHJsd3IocmVnaXN0ZXIgd2NoYXJfdCAqIHVwaW4pCit7CisJcmVnaXN0ZXIgd2NoYXJfdCAqdXA7CisKKwl1cCA9IHVwaW47CisJd2hpbGUgKCp1cCkgewkJLyogRm9yIGFsbCBjaGFyYWN0ZXJzICovCisJCSp1cCA9IFVuaVRvbG93ZXIoKnVwKTsKKwkJdXArKzsKKwl9CisJcmV0dXJuIHVwaW47CQkvKiBSZXR1cm4gaW5wdXQgcG9pbnRlciAqLworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc191bml1cHIuaCBiL2ZzL2NpZnMvY2lmc191bml1cHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWNkMTM4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9jaWZzX3VuaXVwci5oCkBAIC0wLDAgKzEsMjUzIEBACisvKgorICogICBDb3B5cmlnaHQgKGMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgIENvcnAuLCAyMDAwLDIwMDIKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqCisgKiB1bml1cHIuaCAtIFVuaWNvZGUgY29tcHJlc3NlZCBjYXNlIHJhbmdlcworICoKKyovCisKKyNpZm5kZWYgVU5JVVBSX05PVVBQRVIKKy8qCisgKiBMYXRpbiB1cHBlciBjYXNlCisgKi8KK3NpZ25lZCBjaGFyIENpZnNVbmlVcHBlclRhYmxlWzUxMl0gPSB7CisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogMDAwLTAwZiAqLworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDAxMC0wMWYgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAwMjAtMDJmICovCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogMDMwLTAzZiAqLworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDA0MC0wNGYgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAwNTAtMDVmICovCisJMCwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwJLyogMDYwLTA2ZiAqLworCS0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAwLCAwLCAwLCAwLCAwLAkvKiAwNzAtMDdmICovCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogMDgwLTA4ZiAqLworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDA5MC0wOWYgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAwYTAtMGFmICovCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogMGIwLTBiZiAqLworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDBjMC0wY2YgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAwZDAtMGRmICovCisJLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLAkvKiAwZTAtMGVmICovCisJLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAwLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIDEyMSwJLyogMGYwLTBmZiAqLworCTAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwJLyogMTAwLTEwZiAqLworCTAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwJLyogMTEwLTExZiAqLworCTAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwJLyogMTIwLTEyZiAqLworCTAsIDAsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsCS8qIDEzMC0xM2YgKi8KKwktMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIDAsIC0xLCAwLCAtMSwgMCwgLTEsCS8qIDE0MC0xNGYgKi8KKwkwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsCS8qIDE1MC0xNWYgKi8KKwkwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsCS8qIDE2MC0xNmYgKi8KKwkwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwJLyogMTcwLTE3ZiAqLworCTAsIDAsIDAsIC0xLCAwLCAtMSwgMCwgMCwgLTEsIDAsIDAsIDAsIC0xLCAwLCAwLCAwLAkvKiAxODAtMThmICovCisJMCwgMCwgLTEsIDAsIDAsIDAsIDAsIDAsIDAsIC0xLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAxOTAtMTlmICovCisJMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgMCwgLTEsIDAsIDAsIDAsIDAsIC0xLCAwLCAwLAkvKiAxYTAtMWFmICovCisJLTEsIDAsIDAsIDAsIC0xLCAwLCAtMSwgMCwgMCwgLTEsIDAsIDAsIDAsIC0xLCAwLCAwLAkvKiAxYjAtMWJmICovCisJMCwgMCwgMCwgMCwgMCwgLTEsIC0yLCAwLCAtMSwgLTIsIDAsIC0xLCAtMiwgMCwgLTEsIDAsCS8qIDFjMC0xY2YgKi8KKwktMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgLTc5LCAwLCAtMSwJLyogMWQwLTFkZiAqLworCTAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwJLyogMWUwLTFlZiAqLworCTAsIDAsIC0xLCAtMiwgMCwgLTEsIDAsIDAsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLAkvKiAxZjAtMWZmICovCit9OworCisvKiBVcHBlciBjYXNlIHJhbmdlIC0gR3JlZWsgKi8KK3N0YXRpYyBzaWduZWQgY2hhciBVbmlDYXNlUmFuZ2VVMDNhMFs0N10gPSB7CisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLTM4LCAtMzcsIC0zNywgLTM3LAkvKiAzYTAtM2FmICovCisJMCwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwJLyogM2IwLTNiZiAqLworCS0zMiwgLTMyLCAtMzEsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC02NCwKKwktNjMsIC02MywKK307CisKKy8qIFVwcGVyIGNhc2UgcmFuZ2UgLSBDeXJpbGxpYyAqLworc3RhdGljIHNpZ25lZCBjaGFyIFVuaUNhc2VSYW5nZVUwNDMwWzQ4XSA9IHsKKwktMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsCS8qIDQzMC00M2YgKi8KKwktMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsCS8qIDQ0MC00NGYgKi8KKwkwLCAtODAsIC04MCwgLTgwLCAtODAsIC04MCwgLTgwLCAtODAsIC04MCwgLTgwLCAtODAsIC04MCwgLTgwLCAwLCAtODAsIC04MCwJLyogNDUwLTQ1ZiAqLworfTsKKworLyogVXBwZXIgY2FzZSByYW5nZSAtIEV4dGVuZGVkIGN5cmlsbGljICovCitzdGF0aWMgc2lnbmVkIGNoYXIgVW5pQ2FzZVJhbmdlVTA0OTBbNjFdID0geworCTAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwJLyogNDkwLTQ5ZiAqLworCTAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwJLyogNGEwLTRhZiAqLworCTAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwJLyogNGIwLTRiZiAqLworCTAsIDAsIC0xLCAwLCAtMSwgMCwgMCwgMCwgLTEsIDAsIDAsIDAsIC0xLAorfTsKKworLyogVXBwZXIgY2FzZSByYW5nZSAtIEV4dGVuZGVkIGxhdGluIGFuZCBncmVlayAqLworc3RhdGljIHNpZ25lZCBjaGFyIFVuaUNhc2VSYW5nZVUxZTAwWzUwOV0gPSB7CisJMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLAkvKiAxZTAwLTFlMGYgKi8KKwkwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsCS8qIDFlMTAtMWUxZiAqLworCTAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwJLyogMWUyMC0xZTJmICovCisJMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLAkvKiAxZTMwLTFlM2YgKi8KKwkwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsCS8qIDFlNDAtMWU0ZiAqLworCTAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwJLyogMWU1MC0xZTVmICovCisJMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLAkvKiAxZTYwLTFlNmYgKi8KKwkwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsCS8qIDFlNzAtMWU3ZiAqLworCTAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwJLyogMWU4MC0xZThmICovCisJMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgMCwgMCwgMCwgMCwgLTU5LCAwLCAtMSwgMCwgLTEsCS8qIDFlOTAtMWU5ZiAqLworCTAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwJLyogMWVhMC0xZWFmICovCisJMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLAkvKiAxZWIwLTFlYmYgKi8KKwkwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsCS8qIDFlYzAtMWVjZiAqLworCTAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwJLyogMWVkMC0xZWRmICovCisJMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIC0xLAkvKiAxZWUwLTFlZWYgKi8KKwkwLCAtMSwgMCwgLTEsIDAsIC0xLCAwLCAtMSwgMCwgLTEsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDFlZjAtMWVmZiAqLworCTgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDFmMDAtMWYwZiAqLworCTgsIDgsIDgsIDgsIDgsIDgsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDFmMTAtMWYxZiAqLworCTgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDFmMjAtMWYyZiAqLworCTgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDFmMzAtMWYzZiAqLworCTgsIDgsIDgsIDgsIDgsIDgsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDFmNDAtMWY0ZiAqLworCTAsIDgsIDAsIDgsIDAsIDgsIDAsIDgsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDFmNTAtMWY1ZiAqLworCTgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDFmNjAtMWY2ZiAqLworCTc0LCA3NCwgODYsIDg2LCA4NiwgODYsIDEwMCwgMTAwLCAwLCAwLCAxMTIsIDExMiwgMTI2LCAxMjYsIDAsIDAsCS8qIDFmNzAtMWY3ZiAqLworCTgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDFmODAtMWY4ZiAqLworCTgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDFmOTAtMWY5ZiAqLworCTgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDFmYTAtMWZhZiAqLworCTgsIDgsIDAsIDksIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDFmYjAtMWZiZiAqLworCTAsIDAsIDAsIDksIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDFmYzAtMWZjZiAqLworCTgsIDgsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDFmZDAtMWZkZiAqLworCTgsIDgsIDAsIDAsIDAsIDcsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDFmZTAtMWZlZiAqLworCTAsIDAsIDAsIDksIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCit9OworCisvKiBVcHBlciBjYXNlIHJhbmdlIC0gV2lkZSBsYXRpbiAqLworc3RhdGljIHNpZ25lZCBjaGFyIFVuaUNhc2VSYW5nZVVmZjQwWzI3XSA9IHsKKwkwLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLAkvKiBmZjQwLWZmNGYgKi8KKwktMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMiwKK307CisKKy8qCisgKiBVcHBlciBDYXNlIFJhbmdlCisgKi8KK2NvbnN0IHN0cnVjdCBVbmlDYXNlUmFuZ2UgQ2lmc1VuaVVwcGVyUmFuZ2VbXSA9IHsKKwl7MHgwM2EwLCAweDAzY2UsIFVuaUNhc2VSYW5nZVUwM2EwfSwKKwl7MHgwNDMwLCAweDA0NWYsIFVuaUNhc2VSYW5nZVUwNDMwfSwKKwl7MHgwNDkwLCAweDA0Y2MsIFVuaUNhc2VSYW5nZVUwNDkwfSwKKwl7MHgxZTAwLCAweDFmZmMsIFVuaUNhc2VSYW5nZVUxZTAwfSwKKwl7MHhmZjQwLCAweGZmNWEsIFVuaUNhc2VSYW5nZVVmZjQwfSwKKwl7MH0KK307CisjZW5kaWYKKworI2lmbmRlZiBVTklVUFJfTk9MT1dFUgorLyoKKyAqIExhdGluIGxvd2VyIGNhc2UKKyAqLworc3RhdGljIHNpZ25lZCBjaGFyIENpZnNVbmlMb3dlclRhYmxlWzUxMl0gPSB7CisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogMDAwLTAwZiAqLworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDAxMC0wMWYgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAwMjAtMDJmICovCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogMDMwLTAzZiAqLworCTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCS8qIDA0MC0wNGYgKi8KKwkzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDAsIDAsIDAsIDAsIDAsCS8qIDA1MC0wNWYgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAwNjAtMDZmICovCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogMDcwLTA3ZiAqLworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDA4MC0wOGYgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAwOTAtMDlmICovCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwJLyogMGEwLTBhZiAqLworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDBiMC0wYmYgKi8KKwkzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwJLyogMGMwLTBjZiAqLworCTMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAwLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMCwJLyogMGQwLTBkZiAqLworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDBlMC0wZWYgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAwZjAtMGZmICovCisJMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwJLyogMTAwLTEwZiAqLworCTEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsCS8qIDExMC0xMWYgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLAkvKiAxMjAtMTJmICovCisJMCwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwJLyogMTMwLTEzZiAqLworCTAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDAsIDEsIDAsIDEsIDAsIDEsIDAsCS8qIDE0MC0xNGYgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLAkvKiAxNTAtMTVmICovCisJMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwJLyogMTYwLTE2ZiAqLworCTEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIC0xMjEsIDEsIDAsIDEsIDAsIDEsIDAsIDAsCS8qIDE3MC0xN2YgKi8KKwkwLCAwLCAxLCAwLCAxLCAwLCAwLCAxLCAwLCAwLCAwLCAxLCAwLCAwLCA3OSwgMCwJLyogMTgwLTE4ZiAqLworCTAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCS8qIDE5MC0xOWYgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAxLAkvKiAxYTAtMWFmICovCisJMCwgMCwgMCwgMSwgMCwgMSwgMCwgMCwgMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwJLyogMWIwLTFiZiAqLworCTAsIDAsIDAsIDAsIDIsIDEsIDAsIDIsIDEsIDAsIDIsIDEsIDAsIDEsIDAsIDEsCS8qIDFjMC0xY2YgKi8KKwkwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAwLCAxLCAwLAkvKiAxZDAtMWRmICovCisJMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwJLyogMWUwLTFlZiAqLworCTAsIDIsIDEsIDAsIDEsIDAsIDAsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsCS8qIDFmMC0xZmYgKi8KK307CisKKy8qIExvd2VyIGNhc2UgcmFuZ2UgLSBHcmVlayAqLworc3RhdGljIHNpZ25lZCBjaGFyIFVuaUNhc2VSYW5nZUwwMzgwWzQ0XSA9IHsKKwkwLCAwLCAwLCAwLCAwLCAwLCAzOCwgMCwgMzcsIDM3LCAzNywgMCwgNjQsIDAsIDYzLCA2MywJLyogMzgwLTM4ZiAqLworCTAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCS8qIDM5MC0zOWYgKi8KKwkzMiwgMzIsIDAsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCit9OworCisvKiBMb3dlciBjYXNlIHJhbmdlIC0gQ3lyaWxsaWMgKi8KK3N0YXRpYyBzaWduZWQgY2hhciBVbmlDYXNlUmFuZ2VMMDQwMFs0OF0gPSB7CisJMCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgODAsIDgwLCA4MCwgMCwgODAsIDgwLAkvKiA0MDAtNDBmICovCisJMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsCS8qIDQxMC00MWYgKi8KKwkzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwJLyogNDIwLTQyZiAqLworfTsKKworLyogTG93ZXIgY2FzZSByYW5nZSAtIEV4dGVuZGVkIGN5cmlsbGljICovCitzdGF0aWMgc2lnbmVkIGNoYXIgVW5pQ2FzZVJhbmdlTDA0OTBbNjBdID0geworCTEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsCS8qIDQ5MC00OWYgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLAkvKiA0YTAtNGFmICovCisJMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwJLyogNGIwLTRiZiAqLworCTAsIDEsIDAsIDEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDEsCit9OworCisvKiBMb3dlciBjYXNlIHJhbmdlIC0gRXh0ZW5kZWQgbGF0aW4gYW5kIGdyZWVrICovCitzdGF0aWMgc2lnbmVkIGNoYXIgVW5pQ2FzZVJhbmdlTDFlMDBbNTA0XSA9IHsKKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLAkvKiAxZTAwLTFlMGYgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLAkvKiAxZTEwLTFlMWYgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLAkvKiAxZTIwLTFlMmYgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLAkvKiAxZTMwLTFlM2YgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLAkvKiAxZTQwLTFlNGYgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLAkvKiAxZTUwLTFlNWYgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLAkvKiAxZTYwLTFlNmYgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLAkvKiAxZTcwLTFlN2YgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLAkvKiAxZTgwLTFlOGYgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAxLCAwLAkvKiAxZTkwLTFlOWYgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLAkvKiAxZWEwLTFlYWYgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLAkvKiAxZWIwLTFlYmYgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLAkvKiAxZWMwLTFlY2YgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLAkvKiAxZWQwLTFlZGYgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLAkvKiAxZWUwLTFlZWYgKi8KKwkxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAxZWYwLTFlZmYgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAtOCwgLTgsIC04LCAtOCwgLTgsIC04LCAtOCwgLTgsCS8qIDFmMDAtMWYwZiAqLworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC04LCAtOCwgLTgsIC04LCAtOCwgLTgsIDAsIDAsCS8qIDFmMTAtMWYxZiAqLworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC04LCAtOCwgLTgsIC04LCAtOCwgLTgsIC04LCAtOCwJLyogMWYyMC0xZjJmICovCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLTgsIC04LCAtOCwgLTgsIC04LCAtOCwgLTgsIC04LAkvKiAxZjMwLTFmM2YgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAtOCwgLTgsIC04LCAtOCwgLTgsIC04LCAwLCAwLAkvKiAxZjQwLTFmNGYgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAtOCwgMCwgLTgsIDAsIC04LCAwLCAtOCwJLyogMWY1MC0xZjVmICovCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLTgsIC04LCAtOCwgLTgsIC04LCAtOCwgLTgsIC04LAkvKiAxZjYwLTFmNmYgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkvKiAxZjcwLTFmN2YgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAtOCwgLTgsIC04LCAtOCwgLTgsIC04LCAtOCwgLTgsCS8qIDFmODAtMWY4ZiAqLworCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC04LCAtOCwgLTgsIC04LCAtOCwgLTgsIC04LCAtOCwJLyogMWY5MC0xZjlmICovCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLTgsIC04LCAtOCwgLTgsIC04LCAtOCwgLTgsIC04LAkvKiAxZmEwLTFmYWYgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAtOCwgLTgsIC03NCwgLTc0LCAtOSwgMCwgMCwgMCwJLyogMWZiMC0xZmJmICovCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLTg2LCAtODYsIC04NiwgLTg2LCAtOSwgMCwgMCwgMCwJLyogMWZjMC0xZmNmICovCisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLTgsIC04LCAtMTAwLCAtMTAwLCAwLCAwLCAwLCAwLAkvKiAxZmQwLTFmZGYgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAtOCwgLTgsIC0xMTIsIC0xMTIsIC03LCAwLCAwLCAwLAkvKiAxZmUwLTFmZWYgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorfTsKKworLyogTG93ZXIgY2FzZSByYW5nZSAtIFdpZGUgbGF0aW4gKi8KK3N0YXRpYyBzaWduZWQgY2hhciBVbmlDYXNlUmFuZ2VMZmYyMFsyN10gPSB7CisJMCwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwJLyogZmYyMC1mZjJmICovCisJMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLCAzMiwgMzIsIDMyLAorfTsKKworLyoKKyAqIExvd2VyIENhc2UgUmFuZ2UKKyAqLworY29uc3Qgc3RhdGljIHN0cnVjdCBVbmlDYXNlUmFuZ2UgQ2lmc1VuaUxvd2VyUmFuZ2VbXSA9IHsKKwkweDAzODAsIDB4MDNhYiwgVW5pQ2FzZVJhbmdlTDAzODAsCisJMHgwNDAwLCAweDA0MmYsIFVuaUNhc2VSYW5nZUwwNDAwLAorCTB4MDQ5MCwgMHgwNGNiLCBVbmlDYXNlUmFuZ2VMMDQ5MCwKKwkweDFlMDAsIDB4MWZmNywgVW5pQ2FzZVJhbmdlTDFlMDAsCisJMHhmZjIwLCAweGZmM2EsIFVuaUNhc2VSYW5nZUxmZjIwLAorCTAsIDAsIDAKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2VuY3J5cHQuYyBiL2ZzL2NpZnMvY2lmc2VuY3J5cHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODgyOWU3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9jaWZzZW5jcnlwdC5jCkBAIC0wLDAgKzEsMjA5IEBACisvKgorICogICBmcy9jaWZzL2NpZnNlbmNyeXB0LmMKKyAqCisgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyAgQ29ycC4sIDIwMDMKKyAqICAgQXV0aG9yKHMpOiBTdGV2ZSBGcmVuY2ggKHNmcmVuY2hAdXMuaWJtLmNvbSkKKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgImNpZnNwZHUuaCIKKyNpbmNsdWRlICJjaWZzZ2xvYi5oIiAKKyNpbmNsdWRlICJjaWZzX2RlYnVnLmgiCisjaW5jbHVkZSAibWQ1LmgiCisjaW5jbHVkZSAiY2lmc191bmljb2RlLmgiCisjaW5jbHVkZSAiY2lmc3Byb3RvLmgiCisKKy8qIENhbGN1bGF0ZSBhbmQgcmV0dXJuIHRoZSBDSUZTIHNpZ25hdHVyZSBiYXNlZCBvbiB0aGUgbWFjIGtleSBhbmQgdGhlIHNtYiBwZHUgKi8KKy8qIHRoZSAxNiBieXRlIHNpZ25hdHVyZSBtdXN0IGJlIGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyICAqLworLyogTm90ZSB3ZSBvbmx5IHVzZSB0aGUgMXN0IGVpZ2h0IGJ5dGVzICovCisvKiBOb3RlIHRoYXQgdGhlIHNtYiBoZWFkZXIgc2lnbmF0dXJlIGZpZWxkIG9uIGlucHV0IGNvbnRhaW5zIHRoZSAgCisJc2VxdWVuY2UgbnVtYmVyIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCAqLworCitleHRlcm4gdm9pZCBtZGZvdXIodW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBjaGFyICppbiwgaW50IG4pOworZXh0ZXJuIHZvaWQgRV9tZDRoYXNoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBhc3N3ZCwgdW5zaWduZWQgY2hhciAqcDE2KTsKKwkKK3N0YXRpYyBpbnQgY2lmc19jYWxjdWxhdGVfc2lnbmF0dXJlKGNvbnN0IHN0cnVjdCBzbWJfaGRyICogY2lmc19wZHUsIGNvbnN0IGNoYXIgKiBrZXksIGNoYXIgKiBzaWduYXR1cmUpCit7CisJc3RydWN0CU1ENUNvbnRleHQgY29udGV4dDsKKworCWlmKChjaWZzX3BkdSA9PSBOVUxMKSB8fCAoc2lnbmF0dXJlID09IE5VTEwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCU1ENUluaXQoJmNvbnRleHQpOworCU1ENVVwZGF0ZSgmY29udGV4dCxrZXksQ0lGU19TRVNTSU9OX0tFWV9TSVpFKzE2KTsKKwlNRDVVcGRhdGUoJmNvbnRleHQsY2lmc19wZHUtPlByb3RvY29sLGNpZnNfcGR1LT5zbWJfYnVmX2xlbmd0aCk7CisJTUQ1RmluYWwoc2lnbmF0dXJlLCZjb250ZXh0KTsKKwlyZXR1cm4gMDsKK30KKworaW50IGNpZnNfc2lnbl9zbWIoc3RydWN0IHNtYl9oZHIgKiBjaWZzX3BkdSwgc3RydWN0IGNpZnNTZXNJbmZvICogc2VzLAorCV9fdTMyICogcGV4cGVjdGVkX3Jlc3BvbnNlX3NlcXVlbmNlX251bWJlcikKK3sKKwlpbnQgcmMgPSAwOworCWNoYXIgc21iX3NpZ25hdHVyZVsyMF07CisKKwkvKiBCQiByZW1lbWJlciB0byBpbml0aWFsaXplIHNlcXVlbmNlIG51bWJlciBlbHNld2hlcmUgYW5kIGluaXRpYWxpemUgbWFjX3NpZ25pbmcga2V5IGVsc2V3aGVyZSBCQiAqLworCS8qIEJCIHJlbWVtYmVyIHRvIGFkZCBjb2RlIHRvIHNhdmUgZXhwZWN0ZWQgc2VxdWVuY2UgbnVtYmVyIGluIG1pZFEgZW50cnkgQkIgKi8KKworCWlmKChjaWZzX3BkdSA9PSBOVUxMKSB8fCAoc2VzID09IE5VTEwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmKChjaWZzX3BkdS0+RmxhZ3MyICYgU01CRkxHMl9TRUNVUklUWV9TSUdOQVRVUkUpID09IDApIAorCQlyZXR1cm4gcmM7CisKKwlzcGluX2xvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwljaWZzX3BkdS0+U2lnbmF0dXJlLlNlcXVlbmNlLlNlcXVlbmNlTnVtYmVyID0gY3B1X3RvX2xlMzIoc2VzLT5zZXF1ZW5jZV9udW1iZXIpOworCWNpZnNfcGR1LT5TaWduYXR1cmUuU2VxdWVuY2UuUmVzZXJ2ZWQgPSAwOworCQorCSpwZXhwZWN0ZWRfcmVzcG9uc2Vfc2VxdWVuY2VfbnVtYmVyID0gc2VzLT5zZXF1ZW5jZV9udW1iZXIrKzsKKwlzZXMtPnNlcXVlbmNlX251bWJlcisrOworCXNwaW5fdW5sb2NrKCZHbG9iYWxNaWRfTG9jayk7CisKKwlyYyA9IGNpZnNfY2FsY3VsYXRlX3NpZ25hdHVyZShjaWZzX3BkdSwgc2VzLT5tYWNfc2lnbmluZ19rZXksc21iX3NpZ25hdHVyZSk7CisJaWYocmMpCisJCW1lbXNldChjaWZzX3BkdS0+U2lnbmF0dXJlLlNlY3VyaXR5U2lnbmF0dXJlLCAwLCA4KTsKKwllbHNlCisJCW1lbWNweShjaWZzX3BkdS0+U2lnbmF0dXJlLlNlY3VyaXR5U2lnbmF0dXJlLCBzbWJfc2lnbmF0dXJlLCA4KTsKKworCXJldHVybiByYzsKK30KKworaW50IGNpZnNfdmVyaWZ5X3NpZ25hdHVyZShzdHJ1Y3Qgc21iX2hkciAqIGNpZnNfcGR1LCBjb25zdCBjaGFyICogbWFjX2tleSwKKwlfX3UzMiBleHBlY3RlZF9zZXF1ZW5jZV9udW1iZXIpCit7CisJdW5zaWduZWQgaW50IHJjOworCWNoYXIgc2VydmVyX3Jlc3BvbnNlX3NpZ1s4XTsKKwljaGFyIHdoYXRfd2VfdGhpbmtfc2lnX3Nob3VsZF9iZVsyMF07CisKKwlpZigoY2lmc19wZHUgPT0gTlVMTCkgfHwgKG1hY19rZXkgPT0gTlVMTCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGNpZnNfcGR1LT5Db21tYW5kID09IFNNQl9DT01fTkVHT1RJQVRFKQorCQlyZXR1cm4gMDsKKworCWlmIChjaWZzX3BkdS0+Q29tbWFuZCA9PSBTTUJfQ09NX0xPQ0tJTkdfQU5EWCkgeworCQlzdHJ1Y3Qgc21iX2NvbV9sb2NrX3JlcSAqIHBTTUIgPSAoc3RydWN0IHNtYl9jb21fbG9ja19yZXEgKiljaWZzX3BkdTsKKwkgICAgaWYocFNNQi0+TG9ja1R5cGUgJiBMT0NLSU5HX0FORFhfT1BMT0NLX1JFTEVBU0UpCisJCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBCQiB3aGF0IGlmIHNpZ25hdHVyZXMgYXJlIHN1cHBvc2VkIHRvIGJlIG9uIGZvciBzZXNzaW9uIGJ1dCBzZXJ2ZXIgZG9lcyBub3QKKwkJc2VuZCBvbmU/IEJCICovCisJCisJLyogRG8gbm90IG5lZWQgdG8gdmVyaWZ5IHNlc3Npb24gc2V0dXBzIHdpdGggc2lnbmF0dXJlICJCU1JTUFlMICIgICovCisJaWYobWVtY21wKGNpZnNfcGR1LT5TaWduYXR1cmUuU2VjdXJpdHlTaWduYXR1cmUsIkJTUlNQWUwgIiw4KT09MCkKKwkJY0ZZSSgxLCgiZHVtbXkgc2lnbmF0dXJlIHJlY2VpdmVkIGZvciBzbWIgY29tbWFuZCAweCV4IixjaWZzX3BkdS0+Q29tbWFuZCkpOworCisJLyogc2F2ZSBvZmYgdGhlIG9yaWdpZ2luYWwgc2lnbmF0dXJlIHNvIHdlIGNhbiBtb2RpZnkgdGhlIHNtYiBhbmQgY2hlY2sKKwkJaXRzIHNpZ25hdHVyZSBhZ2FpbnN0IHdoYXQgdGhlIHNlcnZlciBzZW50ICovCisJbWVtY3B5KHNlcnZlcl9yZXNwb25zZV9zaWcsY2lmc19wZHUtPlNpZ25hdHVyZS5TZWN1cml0eVNpZ25hdHVyZSw4KTsKKworCWNpZnNfcGR1LT5TaWduYXR1cmUuU2VxdWVuY2UuU2VxdWVuY2VOdW1iZXIgPSBjcHVfdG9fbGUzMihleHBlY3RlZF9zZXF1ZW5jZV9udW1iZXIpOworCWNpZnNfcGR1LT5TaWduYXR1cmUuU2VxdWVuY2UuUmVzZXJ2ZWQgPSAwOworCisJcmMgPSBjaWZzX2NhbGN1bGF0ZV9zaWduYXR1cmUoY2lmc19wZHUsIG1hY19rZXksCisJCXdoYXRfd2VfdGhpbmtfc2lnX3Nob3VsZF9iZSk7CisKKwlpZihyYykKKwkJcmV0dXJuIHJjOworCisJCisvKgljaWZzX2R1bXBfbWVtKCJ3aGF0IHdlIHRoaW5rIGl0IHNob3VsZCBiZTogIix3aGF0X3dlX3RoaW5rX3NpZ19zaG91bGRfYmUsMTYpOyAqLworCisJaWYobWVtY21wKHNlcnZlcl9yZXNwb25zZV9zaWcsIHdoYXRfd2VfdGhpbmtfc2lnX3Nob3VsZF9iZSwgOCkpCisJCXJldHVybiAtRUFDQ0VTOworCWVsc2UKKwkJcmV0dXJuIDA7CisKK30KKworLyogV2UgZmlsbCBpbiBrZXkgYnkgcHV0dGluZyBpbiA0MCBieXRlIGFycmF5IHdoaWNoIHdhcyBhbGxvY2F0ZWQgYnkgY2FsbGVyICovCitpbnQgY2lmc19jYWxjdWxhdGVfbWFjX2tleShjaGFyICoga2V5LCBjb25zdCBjaGFyICogcm4sIGNvbnN0IGNoYXIgKiBwYXNzd29yZCkKK3sKKwljaGFyIHRlbXBfa2V5WzE2XTsKKwlpZiAoKGtleSA9PSBOVUxMKSB8fCAocm4gPT0gTlVMTCkpCisJCXJldHVybiAtRUlOVkFMOworCisJRV9tZDRoYXNoKHBhc3N3b3JkLCB0ZW1wX2tleSk7CisJbWRmb3VyKGtleSx0ZW1wX2tleSwxNik7CisJbWVtY3B5KGtleSsxNixybiwgQ0lGU19TRVNTSU9OX0tFWV9TSVpFKTsKKwlyZXR1cm4gMDsKK30KKworaW50IENhbGNOVExNdjJfcGFydGlhbF9tYWNfa2V5KHN0cnVjdCBjaWZzU2VzSW5mbyAqIHNlcywgc3RydWN0IG5sc190YWJsZSAqIG5sc19pbmZvKQoreworCWNoYXIgdGVtcF9oYXNoWzE2XTsKKwlzdHJ1Y3QgSE1BQ01ENUNvbnRleHQgY3R4OworCWNoYXIgKiB1Y2FzZV9idWY7CisJd2NoYXJfdCAqIHVuaWNvZGVfYnVmOworCXVuc2lnbmVkIGludCBpLHVzZXJfbmFtZV9sZW4sZG9tX25hbWVfbGVuOworCisJaWYoc2VzID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJRV9tZDRoYXNoKHNlcy0+cGFzc3dvcmQsIHRlbXBfaGFzaCk7CisKKwlobWFjX21kNV9pbml0X2xpbUtfdG9fNjQodGVtcF9oYXNoLCAxNiwgJmN0eCk7CisJdXNlcl9uYW1lX2xlbiA9IHN0cmxlbihzZXMtPnVzZXJOYW1lKTsKKwlpZih1c2VyX25hbWVfbGVuID4gTUFYX1VTRVJOQU1FX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCWRvbV9uYW1lX2xlbiA9IHN0cmxlbihzZXMtPmRvbWFpbk5hbWUpOworCWlmKGRvbV9uYW1lX2xlbiA+IE1BWF9VU0VSTkFNRV9TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKyAgCisJdWNhc2VfYnVmID0ga21hbGxvYygoTUFYX1VTRVJOQU1FX1NJWkUrMSksIEdGUF9LRVJORUwpOworCWlmKHVjYXNlX2J1ZiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwl1bmljb2RlX2J1ZiA9IGttYWxsb2MoKE1BWF9VU0VSTkFNRV9TSVpFKzEpKjQsIEdGUF9LRVJORUwpOworCWlmKHVuaWNvZGVfYnVmID09IE5VTEwpIHsKKwkJa2ZyZWUodWNhc2VfYnVmKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorICAgCisJZm9yKGk9MDtpPHVzZXJfbmFtZV9sZW47aSsrKQorCQl1Y2FzZV9idWZbaV0gPSBubHNfaW5mby0+Y2hhcnNldDJ1cHBlclsoaW50KXNlcy0+dXNlck5hbWVbaV1dOworCXVjYXNlX2J1ZltpXSA9IDA7CisJdXNlcl9uYW1lX2xlbiA9IGNpZnNfc3RydG9VQ1ModW5pY29kZV9idWYsIHVjYXNlX2J1ZiwgTUFYX1VTRVJOQU1FX1NJWkUqMiwgbmxzX2luZm8pOworCXVuaWNvZGVfYnVmW3VzZXJfbmFtZV9sZW5dID0gMDsKKwl1c2VyX25hbWVfbGVuKys7CisKKwlmb3IoaT0wO2k8ZG9tX25hbWVfbGVuO2krKykKKwkJdWNhc2VfYnVmW2ldID0gbmxzX2luZm8tPmNoYXJzZXQydXBwZXJbKGludClzZXMtPmRvbWFpbk5hbWVbaV1dOworCXVjYXNlX2J1ZltpXSA9IDA7CisJZG9tX25hbWVfbGVuID0gY2lmc19zdHJ0b1VDUyh1bmljb2RlX2J1Zit1c2VyX25hbWVfbGVuLCB1Y2FzZV9idWYsIE1BWF9VU0VSTkFNRV9TSVpFKjIsIG5sc19pbmZvKTsKKworCXVuaWNvZGVfYnVmW3VzZXJfbmFtZV9sZW4gKyBkb21fbmFtZV9sZW5dID0gMDsKKwlobWFjX21kNV91cGRhdGUoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgdW5pY29kZV9idWYsCisJCSh1c2VyX25hbWVfbGVuK2RvbV9uYW1lX2xlbikqMiwmY3R4KTsKKworCWhtYWNfbWQ1X2ZpbmFsKHNlcy0+bWFjX3NpZ25pbmdfa2V5LCZjdHgpOworCWtmcmVlKHVjYXNlX2J1Zik7CisJa2ZyZWUodW5pY29kZV9idWYpOworCXJldHVybiAwOworfQordm9pZCBDYWxjTlRMTXYyX3Jlc3BvbnNlKGNvbnN0IHN0cnVjdCBjaWZzU2VzSW5mbyAqIHNlcyxjaGFyICogdjJfc2Vzc2lvbl9yZXNwb25zZSkKK3sKKwlzdHJ1Y3QgSE1BQ01ENUNvbnRleHQgY29udGV4dDsKKwltZW1jcHkodjJfc2Vzc2lvbl9yZXNwb25zZSArIDgsIHNlcy0+c2VydmVyLT5jcnlwdEtleSw4KTsKKwkvKiBnZW5fYmxvYih2Ml9zZXNzaW9uX3Jlc3BvbnNlICsgMTYpOyAqLworCWhtYWNfbWQ1X2luaXRfbGltS190b182NChzZXMtPm1hY19zaWduaW5nX2tleSwgMTYsICZjb250ZXh0KTsKKworCWhtYWNfbWQ1X3VwZGF0ZShzZXMtPnNlcnZlci0+Y3J5cHRLZXksOCwmY29udGV4dCk7CisvKglobWFjX21kNV91cGRhdGUodjJfc2Vzc2lvbl9yZXNwb25zZSsxNiljbGllbnQgdGhpbmcsOCwmY29udGV4dCk7ICovIC8qIEJCIGZpeCAqLworCisJaG1hY19tZDVfZmluYWwodjJfc2Vzc2lvbl9yZXNwb25zZSwmY29udGV4dCk7Cit9CmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNlbmNyeXB0LmggYi9mcy9jaWZzL2NpZnNlbmNyeXB0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNlMzU5YgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2NpZnMvY2lmc2VuY3J5cHQuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogICBmcy9jaWZzL2NpZnNlbmNyeXB0LmgKKyAqCisgKiAgIENvcHlyaWdodCAoYykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyAgQ29ycC4sIDIwMDUKKyAqICAgQXV0aG9yKHMpOiBTdGV2ZSBGcmVuY2ggKHNmcmVuY2hAdXMuaWJtLmNvbSkKKyAqCisgKiAgIEV4dGVybnMgZm9yIG1pc2MuIHNtYWxsIGVuY3J5cHRpb24gcm91dGluZXMKKyAqICAgc28gd2UgZG8gbm90IGhhdmUgdG8gcHV0IHRoZW0gaW4gY2lmc3Byb3RvLmgKKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qIG1kNC5jICovCitleHRlcm4gdm9pZCBtZGZvdXIodW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBjaGFyICppbiwgaW50IG4pOworLyogc21iZGVzLmMgKi8KK2V4dGVybiB2b2lkIEVfUDE2KHVuc2lnbmVkIGNoYXIgKnAxNCwgdW5zaWduZWQgY2hhciAqcDE2KTsKK2V4dGVybiB2b2lkIEVfUDI0KHVuc2lnbmVkIGNoYXIgKnAyMSwgdW5zaWduZWQgY2hhciAqYzgsIHVuc2lnbmVkIGNoYXIgKnAyNCk7CitleHRlcm4gdm9pZCBEX1AxNih1bnNpZ25lZCBjaGFyICpwMTQsIHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICpvdXQpOworZXh0ZXJuIHZvaWQgRV9vbGRfcHdfaGFzaCh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhciAqKTsKKworCisKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2ZzLmMgYi9mcy9jaWZzL2NpZnNmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwODJmY2UKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jaWZzL2NpZnNmcy5jCkBAIC0wLDAgKzEsOTEzIEBACisvKgorICogICBmcy9jaWZzL2NpZnNmcy5jCisgKgorICogICBDb3B5cmlnaHQgKEMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgIENvcnAuLCAyMDAyLDIwMDQKKyAqICAgQXV0aG9yKHMpOiBTdGV2ZSBGcmVuY2ggKHNmcmVuY2hAdXMuaWJtLmNvbSkKKyAqCisgKiAgIENvbW1vbiBJbnRlcm5ldCBGaWxlU3lzdGVtIChDSUZTKSBjbGllbnQKKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qIE5vdGUgdGhhdCBCQiBtZWFucyBCVUdCVUcgKGllIHNvbWV0aGluZyB0byBmaXggZXZlbnR1YWxseSkgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgorI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KKyNpbmNsdWRlICJjaWZzZnMuaCIKKyNpbmNsdWRlICJjaWZzcGR1LmgiCisjZGVmaW5lIERFQ0xBUkVfR0xPQkFMU19IRVJFCisjaW5jbHVkZSAiY2lmc2dsb2IuaCIKKyNpbmNsdWRlICJjaWZzcHJvdG8uaCIKKyNpbmNsdWRlICJjaWZzX2RlYnVnLmgiCisjaW5jbHVkZSAiY2lmc19mc19zYi5oIgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjZGVmaW5lIENJRlNfTUFHSUNfTlVNQkVSIDB4RkY1MzRENDIJLyogdGhlIGZpcnN0IGZvdXIgYnl0ZXMgb2YgU01CIFBEVXMgKi8KKworI2lmZGVmIENPTkZJR19DSUZTX1FVT1RBCitzdGF0aWMgc3RydWN0IHF1b3RhY3RsX29wcyBjaWZzX3F1b3RhY3RsX29wczsKKyNlbmRpZgorCitpbnQgY2lmc0ZZSSA9IDA7CitpbnQgY2lmc0VSUk9SID0gMTsKK2ludCB0cmFjZVNNQiA9IDA7Cit1bnNpZ25lZCBpbnQgb3Bsb2NrRW5hYmxlZCA9IDE7Cit1bnNpZ25lZCBpbnQgZXhwZXJpbUVuYWJsZWQgPSAwOwordW5zaWduZWQgaW50IGxpbnV4RXh0RW5hYmxlZCA9IDE7Cit1bnNpZ25lZCBpbnQgbG9va3VwQ2FjaGVFbmFibGVkID0gMTsKK3Vuc2lnbmVkIGludCBtdWx0aXVzZXJfbW91bnQgPSAwOwordW5zaWduZWQgaW50IGV4dGVuZGVkX3NlY3VyaXR5ID0gMDsKK3Vuc2lnbmVkIGludCBudGxtdjJfc3VwcG9ydCA9IDA7Cit1bnNpZ25lZCBpbnQgc2lnbl9DSUZTX1BEVXMgPSAxOworZXh0ZXJuIHN0cnVjdCB0YXNrX3N0cnVjdCAqIG9wbG9ja1RocmVhZDsgLyogcmVtb3ZlIHNwYXJzZSB3YXJuaW5nICovCitzdHJ1Y3QgdGFza19zdHJ1Y3QgKiBvcGxvY2tUaHJlYWQgPSBOVUxMOwordW5zaWduZWQgaW50IENJRlNNYXhCdWZTaXplID0gQ0lGU19NQVhfTVNHU0laRTsKK21vZHVsZV9wYXJhbShDSUZTTWF4QnVmU2l6ZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoQ0lGU01heEJ1ZlNpemUsIk5ldHdvcmsgYnVmZmVyIHNpemUgKG5vdCBpbmNsdWRpbmcgaGVhZGVyKS4gRGVmYXVsdDogMTYzODQgUmFuZ2U6IDgxOTIgdG8gMTMwMDQ4Iik7Cit1bnNpZ25lZCBpbnQgY2lmc19taW5fcmN2ID0gQ0lGU19NSU5fUkNWX1BPT0w7Cittb2R1bGVfcGFyYW0oY2lmc19taW5fcmN2LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhjaWZzX21pbl9yY3YsIk5ldHdvcmsgYnVmZmVycyBpbiBwb29sLiBEZWZhdWx0OiA0IFJhbmdlOiAxIHRvIDY0Iik7Cit1bnNpZ25lZCBpbnQgY2lmc19taW5fc21hbGwgPSAzMDsKK21vZHVsZV9wYXJhbShjaWZzX21pbl9zbWFsbCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoY2lmc19taW5fc21hbGwsIlNtYWxsIG5ldHdvcmsgYnVmZmVycyBpbiBwb29sLiBEZWZhdWx0OiAzMCBSYW5nZTogMiB0byAyNTYiKTsKK3Vuc2lnbmVkIGludCBjaWZzX21heF9wZW5kaW5nID0gQ0lGU19NQVhfUkVROworbW9kdWxlX3BhcmFtKGNpZnNfbWF4X3BlbmRpbmcsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGNpZnNfbWF4X3BlbmRpbmcsIlNpbXVsdGFuZW91cyByZXF1ZXN0cyB0byBzZXJ2ZXIuIERlZmF1bHQ6IDUwIFJhbmdlOiAyIHRvIDI1NiIpOworCitzdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKGNpZnNfb3Bsb2NrX2V4aXRlZCk7CisKK2V4dGVybiBtZW1wb29sX3QgKmNpZnNfc21fcmVxX3Bvb2xwOworZXh0ZXJuIG1lbXBvb2xfdCAqY2lmc19yZXFfcG9vbHA7CitleHRlcm4gbWVtcG9vbF90ICpjaWZzX21pZF9wb29scDsKKworZXh0ZXJuIGttZW1fY2FjaGVfdCAqY2lmc19vcGxvY2tfY2FjaGVwOworCitzdGF0aWMgaW50CitjaWZzX3JlYWRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwKKwkJY29uc3QgY2hhciAqZGV2bmFtZSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisJaW50IHJjID0gMDsKKworCXNiLT5zX2ZsYWdzIHw9IE1TX05PRElSQVRJTUU7IC8qIGFuZCBwcm9iYWJseSBldmVuIG5vYXRpbWUgKi8KKwlzYi0+c19mc19pbmZvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNpZnNfc2JfaW5mbyksR0ZQX0tFUk5FTCk7CisJY2lmc19zYiA9IENJRlNfU0Ioc2IpOworCWlmKGNpZnNfc2IgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJZWxzZQorCQltZW1zZXQoY2lmc19zYiwwLHNpemVvZihzdHJ1Y3QgY2lmc19zYl9pbmZvKSk7CisJCisKKwlyYyA9IGNpZnNfbW91bnQoc2IsIGNpZnNfc2IsIGRhdGEsIGRldm5hbWUpOworCisJaWYgKHJjKSB7CisJCWlmICghc2lsZW50KQorCQkJY0VSUk9SKDEsCisJCQkgICAgICAgKCJjaWZzX21vdW50IGZhaWxlZCB3L3JldHVybiBjb2RlID0gJWQiLCByYykpOworCQlnb3RvIG91dF9tb3VudF9mYWlsZWQ7CisJfQorCisJc2ItPnNfbWFnaWMgPSBDSUZTX01BR0lDX05VTUJFUjsKKwlzYi0+c19vcCA9ICZjaWZzX3N1cGVyX29wczsKKy8qCWlmKGNpZnNfc2ItPnRjb24tPnNlcy0+c2VydmVyLT5tYXhCdWYgPiBNQVhfQ0lGU19IRFJfU0laRSArIDUxMikKKwkgICAgc2ItPnNfYmxvY2tzaXplID0gY2lmc19zYi0+dGNvbi0+c2VzLT5zZXJ2ZXItPm1heEJ1ZiAtIE1BWF9DSUZTX0hEUl9TSVpFOyAqLworI2lmZGVmIENPTkZJR19DSUZTX1FVT1RBCisJc2ItPnNfcWNvcCA9ICZjaWZzX3F1b3RhY3RsX29wczsKKyNlbmRpZgorCXNiLT5zX2Jsb2Nrc2l6ZSA9IENJRlNfTUFYX01TR1NJWkU7CisJc2ItPnNfYmxvY2tzaXplX2JpdHMgPSAxNDsJLyogZGVmYXVsdCAyKioxNCA9IENJRlNfTUFYX01TR1NJWkUgKi8KKwlpbm9kZSA9IGlnZXQoc2IsIFJPT1RfSSk7CisKKwlpZiAoIWlub2RlKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXRfbm9fcm9vdDsKKwl9CisKKwlzYi0+c19yb290ID0gZF9hbGxvY19yb290KGlub2RlKTsKKworCWlmICghc2ItPnNfcm9vdCkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0X25vX3Jvb3Q7CisJfQorCisJcmV0dXJuIDA7CisKK291dF9ub19yb290OgorCWNFUlJPUigxLCAoImNpZnNfcmVhZF9zdXBlcjogZ2V0IHJvb3QgaW5vZGUgZmFpbGVkIikpOworCWlmIChpbm9kZSkKKwkJaXB1dChpbm9kZSk7CisKK291dF9tb3VudF9mYWlsZWQ6CisJaWYoY2lmc19zYikgeworCQlpZihjaWZzX3NiLT5sb2NhbF9ubHMpCisJCQl1bmxvYWRfbmxzKGNpZnNfc2ItPmxvY2FsX25scyk7CQorCQlrZnJlZShjaWZzX3NiKTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZAorY2lmc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisKKwljRllJKDEsICgiSW4gY2lmc19wdXRfc3VwZXIiKSk7CisJY2lmc19zYiA9IENJRlNfU0Ioc2IpOworCWlmKGNpZnNfc2IgPT0gTlVMTCkgeworCQljRllJKDEsKCJFbXB0eSBjaWZzIHN1cGVyYmxvY2sgaW5mbyBwYXNzZWQgdG8gdW5tb3VudCIpKTsKKwkJcmV0dXJuOworCX0KKwlyYyA9IGNpZnNfdW1vdW50KHNiLCBjaWZzX3NiKTsgCisJaWYgKHJjKSB7CisJCWNFUlJPUigxLCAoImNpZnNfdW1vdW50IGZhaWxlZCB3aXRoIHJldHVybiBjb2RlICVkIiwgcmMpKTsKKwl9CisJdW5sb2FkX25scyhjaWZzX3NiLT5sb2NhbF9ubHMpOworCWtmcmVlKGNpZnNfc2IpOworCXJldHVybjsKK30KKworc3RhdGljIGludAorY2lmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK3sKKwlpbnQgeGlkLCByYyA9IC1FT1BOT1RTVVBQOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisJc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb247CisKKwl4aWQgPSBHZXRYaWQoKTsKKworCWNpZnNfc2IgPSBDSUZTX1NCKHNiKTsKKwlwVGNvbiA9IGNpZnNfc2ItPnRjb247CisKKwlidWYtPmZfdHlwZSA9IENJRlNfTUFHSUNfTlVNQkVSOworCisJLyogaW5zdGVhZCBjb3VsZCBnZXQgdGhlIHJlYWwgdmFsdWUgdmlhIFNNQl9RVUVSWV9GU19BVFRSSUJVVEVfSU5GTyAqLworCWJ1Zi0+Zl9uYW1lbGVuID0gUEFUSF9NQVg7CS8qIFBBVEhfTUFYIG1heSBiZSB0b28gbG9uZyAtIGl0IHdvdWxkIHByZXN1bWFibHkKKwkJCQkJICAgYmUgbGVuZ3RoIG9mIHRvdGFsIHBhdGgsIG5vdGUgdGhhdCBzb21lIHNlcnZlcnMgbWF5IGJlIAorCQkJCQkgICBhYmxlIHRvIHN1cHBvcnQgbW9yZSB0aGFuIHRoaXMsIGJ1dCBiZXN0IHRvIGJlIHNhZmUKKwkJCQkJICAgc2luY2UgV2luMmsgYW5kIG90aGVycyBjYW4gbm90IGhhbmRsZSB2ZXJ5IGxvbmcgZmlsZW5hbWVzICovCisJYnVmLT5mX2ZpbGVzID0gMDsJLyogdW5kZWZpbmVkICovCisJYnVmLT5mX2ZmcmVlID0gMDsJLyogdW5saW1pdGVkICovCisKKyNpZmRlZiBDT05GSUdfQ0lGU19FWFBFUklNRU5UQUwKKy8qIEJCIHdlIGNvdWxkIGFkZCBhIHNlY29uZCBjaGVjayBmb3IgYSBRRlMgVW5peCBjYXBhYmlsaXR5IGJpdCAqLworICAgIGlmIChwVGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkKKwkgICAgcmMgPSBDSUZTU01CUUZTUG9zaXhJbmZvKHhpZCwgcFRjb24sIGJ1ZiwgY2lmc19zYi0+bG9jYWxfbmxzKTsKKworICAgIC8qIE9ubHkgbmVlZCB0byBjYWxsIHRoZSBvbGQgUUZTSW5mbyBpZiBmYWlsZWQKKyAgICBvbiBuZXdlciBvbmUgKi8KKyAgICBpZihyYykKKyNlbmRpZiAvKiBDSUZTX0VYUEVSSU1FTlRBTCAqLworCXJjID0gQ0lGU1NNQlFGU0luZm8oeGlkLCBwVGNvbiwgYnVmLCBjaWZzX3NiLT5sb2NhbF9ubHMpOworCisJLyogICAgIAorCSAgIGludCBmX3R5cGU7CisJICAgX19mc2lkX3QgZl9mc2lkOworCSAgIGludCBmX25hbWVsZW47ICAqLworCS8qIEJCIGdldCBmcm9tIGluZm8gcHV0IGluIHRjb24gc3RydWN0IGF0IG1vdW50IHRpbWUgd2l0aCBjYWxsIHRvIFFGU0F0dHJJbmZvICovCisJRnJlZVhpZCh4aWQpOworCXJldHVybiAwOwkJLyogYWx3YXlzIHJldHVybiBzdWNjZXNzPyB3aGF0IGlmIHZvbHVtZSBpcyBubyBsb25nZXIgYXZhaWxhYmxlPyAqLworfQorCitzdGF0aWMgaW50IGNpZnNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgaW50IG1hc2ssIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisKKwljaWZzX3NiID0gQ0lGU19TQihpbm9kZS0+aV9zYik7CisKKwlpZiAoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX05PX1BFUk0pIHsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIC8qIGZpbGUgbW9kZSBtaWdodCBoYXZlIGJlZW4gcmVzdHJpY3RlZCBhdCBtb3VudCB0aW1lIAorCQlvbiB0aGUgY2xpZW50IChhYm92ZSBhbmQgYmV5b25kIEFDTCBvbiBzZXJ2ZXJzKSBmb3IgIAorCQlzZXJ2ZXJzIHdoaWNoIGRvIG5vdCBzdXBwb3J0IHNldHRpbmcgYW5kIHZpZXdpbmcgbW9kZSBiaXRzLAorCQlzbyBhbGxvd2luZyBjbGllbnQgdG8gY2hlY2sgcGVybWlzc2lvbnMgaXMgdXNlZnVsICovIAorCQlyZXR1cm4gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrLCBOVUxMKTsKK30KKworc3RhdGljIGttZW1fY2FjaGVfdCAqY2lmc19pbm9kZV9jYWNoZXA7CitzdGF0aWMga21lbV9jYWNoZV90ICpjaWZzX3JlcV9jYWNoZXA7CitzdGF0aWMga21lbV9jYWNoZV90ICpjaWZzX21pZF9jYWNoZXA7CitrbWVtX2NhY2hlX3QgKmNpZnNfb3Bsb2NrX2NhY2hlcDsKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKmNpZnNfc21fcmVxX2NhY2hlcDsKK21lbXBvb2xfdCAqY2lmc19zbV9yZXFfcG9vbHA7CittZW1wb29sX3QgKmNpZnNfcmVxX3Bvb2xwOworbWVtcG9vbF90ICpjaWZzX21pZF9wb29scDsKKworc3RhdGljIHN0cnVjdCBpbm9kZSAqCitjaWZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGNpZnNJbm9kZUluZm8gKmNpZnNfaW5vZGU7CisJY2lmc19pbm9kZSA9IGttZW1fY2FjaGVfYWxsb2MoY2lmc19pbm9kZV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwlpZiAoIWNpZnNfaW5vZGUpCisJCXJldHVybiBOVUxMOworCWNpZnNfaW5vZGUtPmNpZnNBdHRycyA9IDB4MjA7CS8qIGRlZmF1bHQgKi8KKwlhdG9taWNfc2V0KCZjaWZzX2lub2RlLT5pblVzZSwgMCk7CisJY2lmc19pbm9kZS0+dGltZSA9IDA7CisJLyogVW50aWwgdGhlIGZpbGUgaXMgb3BlbiBhbmQgd2UgaGF2ZSBnb3R0ZW4gb3Bsb2NrCisJaW5mbyBiYWNrIGZyb20gdGhlIHNlcnZlciwgY2FuIG5vdCBhc3N1bWUgY2FjaGluZyBvZgorCWZpbGUgZGF0YSBvciBtZXRhZGF0YSAqLworCWNpZnNfaW5vZGUtPmNsaWVudENhbkNhY2hlUmVhZCA9IEZBTFNFOworCWNpZnNfaW5vZGUtPmNsaWVudENhbkNhY2hlQWxsID0gRkFMU0U7CisJY2lmc19pbm9kZS0+dmZzX2lub2RlLmlfYmxrc2l6ZSA9IENJRlNfTUFYX01TR1NJWkU7CisJY2lmc19pbm9kZS0+dmZzX2lub2RlLmlfYmxrYml0cyA9IDE0OyAgLyogMioqMTQgPSBDSUZTX01BWF9NU0dTSVpFICovCisKKwlJTklUX0xJU1RfSEVBRCgmY2lmc19pbm9kZS0+b3BlbkZpbGVMaXN0KTsKKwlyZXR1cm4gJmNpZnNfaW5vZGUtPnZmc19pbm9kZTsKK30KKworc3RhdGljIHZvaWQKK2NpZnNfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWttZW1fY2FjaGVfZnJlZShjaWZzX2lub2RlX2NhY2hlcCwgQ0lGU19JKGlub2RlKSk7Cit9CisKKy8qCisgKiBjaWZzX3Nob3dfb3B0aW9ucygpIGlzIGZvciBkaXNwbGF5aW5nIG1vdW50IG9wdGlvbnMgaW4gL3Byb2MvbW91bnRzLgorICogTm90IGFsbCBzZXR0YWJsZSBvcHRpb25zIGFyZSBkaXNwbGF5ZWQgYnV0IG1vc3Qgb2YgdGhlIGltcG9ydGFudAorICogb25lcyBhcmUuCisgKi8KK3N0YXRpYyBpbnQKK2NpZnNfc2hvd19vcHRpb25zKHN0cnVjdCBzZXFfZmlsZSAqcywgc3RydWN0IHZmc21vdW50ICptKQoreworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisKKwljaWZzX3NiID0gQ0lGU19TQihtLT5tbnRfc2IpOworCisJaWYgKGNpZnNfc2IpIHsKKwkJaWYgKGNpZnNfc2ItPnRjb24pIHsKKwkJCXNlcV9wcmludGYocywgIix1bmM9JXMiLCBjaWZzX3NiLT50Y29uLT50cmVlTmFtZSk7CisJCQlpZiAoY2lmc19zYi0+dGNvbi0+c2VzKSB7CisJCQkJaWYgKGNpZnNfc2ItPnRjb24tPnNlcy0+dXNlck5hbWUpCisJCQkJCXNlcV9wcmludGYocywgIix1c2VybmFtZT0lcyIsCisJCQkJCSAgIGNpZnNfc2ItPnRjb24tPnNlcy0+dXNlck5hbWUpOworCQkJCWlmKGNpZnNfc2ItPnRjb24tPnNlcy0+ZG9tYWluTmFtZSkKKwkJCQkJc2VxX3ByaW50ZihzLCAiLGRvbWFpbj0lcyIsCisJCQkJCSAgIGNpZnNfc2ItPnRjb24tPnNlcy0+ZG9tYWluTmFtZSk7CisJCQl9CisJCX0KKwkJc2VxX3ByaW50ZihzLCAiLHJzaXplPSVkIixjaWZzX3NiLT5yc2l6ZSk7CisJCXNlcV9wcmludGYocywgIix3c2l6ZT0lZCIsY2lmc19zYi0+d3NpemUpOworCX0KKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19DSUZTX1FVT1RBCitpbnQgY2lmc194cXVvdGFfc2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBpbnQgcXVvdGFfdHlwZSwgcWlkX3QgcWlkLAorCQlzdHJ1Y3QgZnNfZGlza19xdW90YSAqIHBkcXVvdGEpCit7CisJaW50IHhpZDsKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IgPSBDSUZTX1NCKHNiKTsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKwkKKwlpZihjaWZzX3NiKQorCQlwVGNvbiA9IGNpZnNfc2ItPnRjb247CisJZWxzZQorCQlyZXR1cm4gLUVJTzsKKworCisJeGlkID0gR2V0WGlkKCk7CisJaWYocFRjb24pIHsKKwkJY0ZZSSgxLCgic2V0IHR5cGU6IDB4JXggaWQ6ICVkIixxdW90YV90eXBlLHFpZCkpOwkJCisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJRnJlZVhpZCh4aWQpOworCXJldHVybiByYzsKK30KKworaW50IGNpZnNfeHF1b3RhX2dldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgaW50IHF1b3RhX3R5cGUsIHFpZF90IHFpZCwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgZnNfZGlza19xdW90YSAqIHBkcXVvdGEpCit7CisJaW50IHhpZDsKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IgPSBDSUZTX1NCKHNiKTsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKworCWlmKGNpZnNfc2IpCisJCXBUY29uID0gY2lmc19zYi0+dGNvbjsKKwllbHNlCisJCXJldHVybiAtRUlPOworCisJeGlkID0gR2V0WGlkKCk7CisJaWYocFRjb24pIHsKKyAgICAgICAgICAgICAgICBjRllJKDEsKCJzZXQgdHlwZTogMHgleCBpZDogJWQiLHF1b3RhX3R5cGUscWlkKSk7CisJfSBlbHNlIHsKKwkJcmMgPSAtRUlPOworCX0KKworCUZyZWVYaWQoeGlkKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBjaWZzX3hzdGF0ZV9zZXQoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIHVuc2lnbmVkIGludCBmbGFncywgaW50IG9wZXJhdGlvbikKK3sKKwlpbnQgeGlkOyAKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IgPSBDSUZTX1NCKHNiKTsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKworCWlmKGNpZnNfc2IpCisJCXBUY29uID0gY2lmc19zYi0+dGNvbjsKKwllbHNlCisJCXJldHVybiAtRUlPOworCisJeGlkID0gR2V0WGlkKCk7CisJaWYocFRjb24pIHsKKyAgICAgICAgICAgICAgICBjRllJKDEsKCJmbGFnczogMHgleCBvcGVyYXRpb246IDB4JXgiLGZsYWdzLG9wZXJhdGlvbikpOworCX0gZWxzZSB7CisJCXJjID0gLUVJTzsKKwl9CisKKwlGcmVlWGlkKHhpZCk7CisJcmV0dXJuIHJjOworfQorCitpbnQgY2lmc194c3RhdGVfZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBzdHJ1Y3QgZnNfcXVvdGFfc3RhdCAqcXN0YXRzKQoreworCWludCB4aWQ7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiID0gQ0lGU19TQihzYik7CisJc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb247CisKKwlpZihjaWZzX3NiKSB7CisJCXBUY29uID0gY2lmc19zYi0+dGNvbjsKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVJTzsKKwl9CisJeGlkID0gR2V0WGlkKCk7CisJaWYocFRjb24pIHsKKwkJY0ZZSSgxLCgicHFzdGF0cyAlcCIscXN0YXRzKSk7CQkKKwl9IGVsc2UgeworCQlyYyA9IC1FSU87CisJfQorCisJRnJlZVhpZCh4aWQpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHN0cnVjdCBxdW90YWN0bF9vcHMgY2lmc19xdW90YWN0bF9vcHMgPSB7CisJLnNldF94cXVvdGEJPSBjaWZzX3hxdW90YV9zZXQsCisJLmdldF94cXVvdGEJPSBjaWZzX3hxdW90YV9zZXQsCisJLnNldF94c3RhdGUJPSBjaWZzX3hzdGF0ZV9zZXQsCisJLmdldF94c3RhdGUJPSBjaWZzX3hzdGF0ZV9nZXQsCit9OworI2VuZGlmCisKK3N0YXRpYyBpbnQgY2lmc19yZW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpCit7CisJKmZsYWdzIHw9IE1TX05PRElSQVRJTUU7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGNpZnNfc3VwZXJfb3BzID0geworCS5yZWFkX2lub2RlID0gY2lmc19yZWFkX2lub2RlLAorCS5wdXRfc3VwZXIgPSBjaWZzX3B1dF9zdXBlciwKKwkuc3RhdGZzID0gY2lmc19zdGF0ZnMsCisJLmFsbG9jX2lub2RlID0gY2lmc19hbGxvY19pbm9kZSwKKwkuZGVzdHJveV9pbm9kZSA9IGNpZnNfZGVzdHJveV9pbm9kZSwKKy8qCS5kcm9wX2lub2RlCSAgICA9IGdlbmVyaWNfZGVsZXRlX2lub2RlLCAKKwkuZGVsZXRlX2lub2RlCT0gY2lmc19kZWxldGVfaW5vZGUsICAqLy8qIERvIG5vdCBuZWVkIHRoZSBhYm92ZSB0d28gZnVuY3Rpb25zICAgICAKKyAgIHVubGVzcyBsYXRlciB3ZSBhZGQgbGF6eSBjbG9zZSBvZiBpbm9kZXMgb3IgdW5sZXNzIHRoZSBrZXJuZWwgZm9yZ2V0cyB0byBjYWxsCisgICB1cyB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiByZWxlYXNlcyAoY2xvc2VzKSBhcyBvcGVucyAqLworCS5zaG93X29wdGlvbnMgPSBjaWZzX3Nob3dfb3B0aW9ucywKKy8qICAgIC51bW91bnRfYmVnaW4gICA9IGNpZnNfdW1vdW50X2JlZ2luLCAqLy8qIGNvbnNpZGVyIGFkZGluZyBpbiB0aGUgZnV0dXJlICovCisJLnJlbW91bnRfZnMgPSBjaWZzX3JlbW91bnQsCit9OworCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICoKK2NpZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCSAgICBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoreworCWludCByYzsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gc2dldChmc190eXBlLCBOVUxMLCBzZXRfYW5vbl9zdXBlciwgTlVMTCk7CisKKwljRllJKDEsICgiRGV2bmFtZTogJXMgZmxhZ3M6ICVkICIsIGRldl9uYW1lLCBmbGFncykpOworCisJaWYgKElTX0VSUihzYikpCisJCXJldHVybiBzYjsKKworCXNiLT5zX2ZsYWdzID0gZmxhZ3M7CisKKwlyYyA9IGNpZnNfcmVhZF9zdXBlcihzYiwgZGF0YSwgZGV2X25hbWUsIGZsYWdzICYgTVNfVkVSQk9TRSA/IDEgOiAwKTsKKwlpZiAocmMpIHsKKwkJdXBfd3JpdGUoJnNiLT5zX3Vtb3VudCk7CisJCWRlYWN0aXZhdGVfc3VwZXIoc2IpOworCQlyZXR1cm4gRVJSX1BUUihyYyk7CisJfQorCXNiLT5zX2ZsYWdzIHw9IE1TX0FDVElWRTsKKwlyZXR1cm4gc2I7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitjaWZzX3JlYWRfd3JhcHBlcihzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNoYXIgX191c2VyICpyZWFkX2RhdGEsIHNpemVfdCByZWFkX3NpemUsCisgICAgICAgICAgbG9mZl90ICogcG9mZnNldCkKK3sKKwlpZihmaWxlLT5mX2RlbnRyeSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTzsKKwllbHNlIGlmKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlID09IE5VTEwpCisJCXJldHVybiAtRUlPOworCisJY0ZZSSgxLCgiSW4gcmVhZF93cmFwcGVyIHNpemUgJXpkIGF0ICVsbGQiLHJlYWRfc2l6ZSwqcG9mZnNldCkpOworCisJaWYoQ0lGU19JKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKS0+Y2xpZW50Q2FuQ2FjaGVSZWFkKSB7CisJCXJldHVybiBnZW5lcmljX2ZpbGVfcmVhZChmaWxlLHJlYWRfZGF0YSxyZWFkX3NpemUscG9mZnNldCk7CisJfSBlbHNlIHsKKwkJLyogQkIgZG8gd2UgbmVlZCB0byBsb2NrIGlub2RlIGZyb20gaGVyZSB1bnRpbCBhZnRlciBpbnZhbGlkYXRlPyAqLworLyoJCWlmKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmcpIHsKKwkJCWZpbGVtYXBfZmRhdGF3cml0ZShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tYXBwaW5nKTsKKwkJCWZpbGVtYXBfZmRhdGF3YWl0KGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmcpOworCQl9Ki8KKy8qCQljaWZzX3JldmFsaWRhdGUoZmlsZS0+Zl9kZW50cnkpOyovIC8qIEJCIGZpeG1lICovCisKKwkJLyogQkIgd2Ugc2hvdWxkIG1ha2UgdGltZXIgY29uZmlndXJhYmxlIC0gcGVyaGFwcyAKKwkJICAgYnkgc2ltcGx5IGNhbGxpbmcgY2lmc19yZXZhbGlkYXRlIGhlcmUgKi8KKwkJLyogaW52YWxpZGF0ZV9yZW1vdGVfaW5vZGUoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOyovCisJCXJldHVybiBnZW5lcmljX2ZpbGVfcmVhZChmaWxlLHJlYWRfZGF0YSxyZWFkX3NpemUscG9mZnNldCk7CisJfQorfQorCitzdGF0aWMgc3NpemVfdAorY2lmc193cml0ZV93cmFwcGVyKHN0cnVjdCBmaWxlICogZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKndyaXRlX2RhdGEsCisgICAgICAgICAgIHNpemVfdCB3cml0ZV9zaXplLCBsb2ZmX3QgKiBwb2Zmc2V0KSAKK3sKKwlzc2l6ZV90IHdyaXR0ZW47CisKKwlpZihmaWxlLT5mX2RlbnRyeSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTzsKKwllbHNlIGlmKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlID09IE5VTEwpCisJCXJldHVybiAtRUlPOworCisJY0ZZSSgxLCgiSW4gd3JpdGVfd3JhcHBlciBzaXplICV6ZCBhdCAlbGxkIix3cml0ZV9zaXplLCpwb2Zmc2V0KSk7CisKKwl3cml0dGVuID0gZ2VuZXJpY19maWxlX3dyaXRlKGZpbGUsd3JpdGVfZGF0YSx3cml0ZV9zaXplLHBvZmZzZXQpOworCWlmKCFDSUZTX0koZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpLT5jbGllbnRDYW5DYWNoZUFsbCkgIHsKKwkJaWYoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZykgeworCQkJZmlsZW1hcF9mZGF0YXdyaXRlKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmcpOworCQl9CisJfQorCXJldHVybiB3cml0dGVuOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBjaWZzX2ZzX3R5cGUgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm5hbWUgPSAiY2lmcyIsCisJLmdldF9zYiA9IGNpZnNfZ2V0X3NiLAorCS5raWxsX3NiID0ga2lsbF9hbm9uX3N1cGVyLAorCS8qICAuZnNfZmxhZ3MgKi8KK307CitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBjaWZzX2Rpcl9pbm9kZV9vcHMgPSB7CisJLmNyZWF0ZSA9IGNpZnNfY3JlYXRlLAorCS5sb29rdXAgPSBjaWZzX2xvb2t1cCwKKwkuZ2V0YXR0ciA9IGNpZnNfZ2V0YXR0ciwKKwkudW5saW5rID0gY2lmc191bmxpbmssCisJLmxpbmsgPSBjaWZzX2hhcmRsaW5rLAorCS5ta2RpciA9IGNpZnNfbWtkaXIsCisJLnJtZGlyID0gY2lmc19ybWRpciwKKwkucmVuYW1lID0gY2lmc19yZW5hbWUsCisJLnBlcm1pc3Npb24gPSBjaWZzX3Blcm1pc3Npb24sCisvKglyZXZhbGlkYXRlOmNpZnNfcmV2YWxpZGF0ZSwgICAqLworCS5zZXRhdHRyID0gY2lmc19zZXRhdHRyLAorCS5zeW1saW5rID0gY2lmc19zeW1saW5rLAorCS5ta25vZCAgID0gY2lmc19ta25vZCwKKyNpZmRlZiBDT05GSUdfQ0lGU19YQVRUUgorCS5zZXR4YXR0ciA9IGNpZnNfc2V0eGF0dHIsCisJLmdldHhhdHRyID0gY2lmc19nZXR4YXR0ciwKKwkubGlzdHhhdHRyID0gY2lmc19saXN0eGF0dHIsCisJLnJlbW92ZXhhdHRyID0gY2lmc19yZW1vdmV4YXR0ciwKKyNlbmRpZgorfTsKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgY2lmc19maWxlX2lub2RlX29wcyA9IHsKKy8qCXJldmFsaWRhdGU6Y2lmc19yZXZhbGlkYXRlLCAqLworCS5zZXRhdHRyID0gY2lmc19zZXRhdHRyLAorCS5nZXRhdHRyID0gY2lmc19nZXRhdHRyLCAvKiBkbyB3ZSBuZWVkIHRoaXMgYW55bW9yZT8gKi8KKwkucmVuYW1lID0gY2lmc19yZW5hbWUsCisJLnBlcm1pc3Npb24gPSBjaWZzX3Blcm1pc3Npb24sCisjaWZkZWYgQ09ORklHX0NJRlNfWEFUVFIKKwkuc2V0eGF0dHIgPSBjaWZzX3NldHhhdHRyLAorCS5nZXR4YXR0ciA9IGNpZnNfZ2V0eGF0dHIsCisJLmxpc3R4YXR0ciA9IGNpZnNfbGlzdHhhdHRyLAorCS5yZW1vdmV4YXR0ciA9IGNpZnNfcmVtb3ZleGF0dHIsCisjZW5kaWYgCit9OworCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBjaWZzX3N5bWxpbmtfaW5vZGVfb3BzID0geworCS5yZWFkbGluayA9IGdlbmVyaWNfcmVhZGxpbmssIAorCS5mb2xsb3dfbGluayA9IGNpZnNfZm9sbG93X2xpbmssCisJLnB1dF9saW5rID0gY2lmc19wdXRfbGluaywKKwkucGVybWlzc2lvbiA9IGNpZnNfcGVybWlzc2lvbiwKKwkvKiBCQiBhZGQgdGhlIGZvbGxvd2luZyB0d28gZXZlbnR1YWxseSAqLworCS8qIHJldmFsaWRhdGU6IGNpZnNfcmV2YWxpZGF0ZSwKKwkgICBzZXRhdHRyOiAgICBjaWZzX25vdGlmeV9jaGFuZ2UsICovLyogQkIgZG8gd2UgbmVlZCBub3RpZnkgY2hhbmdlICovCisjaWZkZWYgQ09ORklHX0NJRlNfWEFUVFIKKwkuc2V0eGF0dHIgPSBjaWZzX3NldHhhdHRyLAorCS5nZXR4YXR0ciA9IGNpZnNfZ2V0eGF0dHIsCisJLmxpc3R4YXR0ciA9IGNpZnNfbGlzdHhhdHRyLAorCS5yZW1vdmV4YXR0ciA9IGNpZnNfcmVtb3ZleGF0dHIsCisjZW5kaWYgCit9OworCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNpZnNfZmlsZV9vcHMgPSB7CisJLnJlYWQgPSBjaWZzX3JlYWRfd3JhcHBlciwKKwkud3JpdGUgPSBjaWZzX3dyaXRlX3dyYXBwZXIsIAorCS5vcGVuID0gY2lmc19vcGVuLAorCS5yZWxlYXNlID0gY2lmc19jbG9zZSwKKwkubG9jayA9IGNpZnNfbG9jaywKKwkuZnN5bmMgPSBjaWZzX2ZzeW5jLAorCS5mbHVzaCA9IGNpZnNfZmx1c2gsCisJLm1tYXAgID0gY2lmc19maWxlX21tYXAsCisJLnNlbmRmaWxlID0gZ2VuZXJpY19maWxlX3NlbmRmaWxlLAorI2lmZGVmIENPTkZJR19DSUZTX0VYUEVSSU1FTlRBTAorCS5yZWFkdiA9IGdlbmVyaWNfZmlsZV9yZWFkdiwKKwkud3JpdGV2ID0gZ2VuZXJpY19maWxlX3dyaXRldiwKKwkuYWlvX3JlYWQgPSBnZW5lcmljX2ZpbGVfYWlvX3JlYWQsCisJLmFpb193cml0ZSA9IGdlbmVyaWNfZmlsZV9haW9fd3JpdGUsCisJLmRpcl9ub3RpZnkgPSBjaWZzX2Rpcl9ub3RpZnksCisjZW5kaWYgLyogQ09ORklHX0NJRlNfRVhQRVJJTUVOVEFMICovCit9OworCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNpZnNfZmlsZV9kaXJlY3Rfb3BzID0geworCS8qIG5vIG1tYXAsIG5vIGFpbywgbm8gcmVhZHYgLSAKKwkgICBCQiByZWV2YWx1YXRlIHdoZXRoZXIgdGhleSBjYW4gYmUgZG9uZSB3aXRoIGRpcmVjdGlvLCBubyBjYWNoZSAqLworCS5yZWFkID0gY2lmc191c2VyX3JlYWQsCisJLndyaXRlID0gY2lmc191c2VyX3dyaXRlLAorCS5vcGVuID0gY2lmc19vcGVuLAorCS5yZWxlYXNlID0gY2lmc19jbG9zZSwKKwkubG9jayA9IGNpZnNfbG9jaywKKwkuZnN5bmMgPSBjaWZzX2ZzeW5jLAorCS5mbHVzaCA9IGNpZnNfZmx1c2gsCisJLnNlbmRmaWxlID0gZ2VuZXJpY19maWxlX3NlbmRmaWxlLCAvKiBCQiByZW1vdmVtZSBCQiAqLworI2lmZGVmIENPTkZJR19DSUZTX0VYUEVSSU1FTlRBTAorCS5kaXJfbm90aWZ5ID0gY2lmc19kaXJfbm90aWZ5LAorI2VuZGlmIC8qIENPTkZJR19DSUZTX0VYUEVSSU1FTlRBTCAqLworfTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjaWZzX2Rpcl9vcHMgPSB7CisJLnJlYWRkaXIgPSBjaWZzX3JlYWRkaXIsCisJLnJlbGVhc2UgPSBjaWZzX2Nsb3NlZGlyLAorCS5yZWFkICAgID0gZ2VuZXJpY19yZWFkX2RpciwKKyNpZmRlZiBDT05GSUdfQ0lGU19FWFBFUklNRU5UQUwKKwkuZGlyX25vdGlmeSA9IGNpZnNfZGlyX25vdGlmeSwKKyNlbmRpZiAvKiBDT05GSUdfQ0lGU19FWFBFUklNRU5UQUwgKi8KK307CisKK3N0YXRpYyB2b2lkCitjaWZzX2luaXRfb25jZSh2b2lkICppbm9kZSwga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBjaWZzSW5vZGVJbmZvICpjaWZzaSA9IGlub2RlOworCisJaWYgKChmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZIHwgU0xBQl9DVE9SX0NPTlNUUlVDVE9SKSkgPT0KKwkgICAgU0xBQl9DVE9SX0NPTlNUUlVDVE9SKSB7CisJCWlub2RlX2luaXRfb25jZSgmY2lmc2ktPnZmc19pbm9kZSk7CisJCUlOSVRfTElTVF9IRUFEKCZjaWZzaS0+bG9ja0xpc3QpOworCX0KK30KKworc3RhdGljIGludAorY2lmc19pbml0X2lub2RlY2FjaGUodm9pZCkKK3sKKwljaWZzX2lub2RlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJjaWZzX2lub2RlX2NhY2hlIiwKKwkJCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgY2lmc0lub2RlSW5mbyksCisJCQkJCSAgICAgIDAsIFNMQUJfUkVDTEFJTV9BQ0NPVU5ULAorCQkJCQkgICAgICBjaWZzX2luaXRfb25jZSwgTlVMTCk7CisJaWYgKGNpZnNfaW5vZGVfY2FjaGVwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitjaWZzX2Rlc3Ryb3lfaW5vZGVjYWNoZSh2b2lkKQoreworCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3koY2lmc19pbm9kZV9jYWNoZXApKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJjaWZzX2lub2RlX2NhY2hlOiBlcnJvciBmcmVlaW5nXG4iKTsKK30KKworc3RhdGljIGludAorY2lmc19pbml0X3JlcXVlc3RfYnVmcyh2b2lkKQoreworCWlmKENJRlNNYXhCdWZTaXplIDwgODE5MikgeworCS8qIEJ1ZmZlciBzaXplIGNhbiBub3QgYmUgc21hbGxlciB0aGFuIDIgKiBQQVRIX01BWCBzaW5jZSBtYXhpbXVtCisJVW5pY29kZSBwYXRoIG5hbWUgaGFzIHRvIGZpdCBpbiBhbnkgU01CL0NJRlMgcGF0aCBiYXNlZCBmcmFtZXMgKi8KKwkJQ0lGU01heEJ1ZlNpemUgPSA4MTkyOworCX0gZWxzZSBpZiAoQ0lGU01heEJ1ZlNpemUgPiAxMDI0KjEyNykgeworCQlDSUZTTWF4QnVmU2l6ZSA9IDEwMjQgKiAxMjc7CisJfSBlbHNlIHsKKwkJQ0lGU01heEJ1ZlNpemUgJj0gMHgxRkUwMDsgLyogUm91bmQgc2l6ZSB0byBldmVuIDUxMiBieXRlIG11bHQqLworCX0KKy8qCWNFUlJPUigxLCgiQ0lGU01heEJ1ZlNpemUgJWQgMHgleCIsQ0lGU01heEJ1ZlNpemUsQ0lGU01heEJ1ZlNpemUpKTsgKi8KKwljaWZzX3JlcV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiY2lmc19yZXF1ZXN0IiwKKwkJCQkJICAgIENJRlNNYXhCdWZTaXplICsKKwkJCQkJICAgIE1BWF9DSUZTX0hEUl9TSVpFLCAwLAorCQkJCQkgICAgU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMLCBOVUxMKTsKKwlpZiAoY2lmc19yZXFfY2FjaGVwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYoY2lmc19taW5fcmN2IDwgMSkKKwkJY2lmc19taW5fcmN2ID0gMTsKKwllbHNlIGlmIChjaWZzX21pbl9yY3YgPiA2NCkgeworCQljaWZzX21pbl9yY3YgPSA2NDsKKwkJY0VSUk9SKDEsKCJjaWZzX21pbl9yY3Ygc2V0IHRvIG1heGltdW0gKDY0KSIpKTsKKwl9CisKKwljaWZzX3JlcV9wb29scCA9IG1lbXBvb2xfY3JlYXRlKGNpZnNfbWluX3JjdiwKKwkJCQkJbWVtcG9vbF9hbGxvY19zbGFiLAorCQkJCQltZW1wb29sX2ZyZWVfc2xhYiwKKwkJCQkJY2lmc19yZXFfY2FjaGVwKTsKKworCWlmKGNpZnNfcmVxX3Bvb2xwID09IE5VTEwpIHsKKwkJa21lbV9jYWNoZV9kZXN0cm95KGNpZnNfcmVxX2NhY2hlcCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvKiAyNTYgKE1BWF9DSUZTX0hEUl9TSVpFIGJ5dGVzIGlzIGVub3VnaCBmb3IgbW9zdCBTTUIgcmVzcG9uc2VzIGFuZAorCWFsbW9zdCBhbGwgaGFuZGxlIGJhc2VkIHJlcXVlc3RzIChidXQgbm90IHdyaXRlIHJlc3BvbnNlLCBub3IgaXMgaXQKKwlzdWZmaWNpZW50IGZvciBwYXRoIGJhc2VkIHJlcXVlc3RzKS4gIEEgc21hbGxlciBzaXplIHdvdWxkIGhhdmUKKwliZWVuIG1vcmUgZWZmaWNpZW50IChjb21wYWN0aW5nIG11bHRpcGxlIHNsYWIgaXRlbXMgb24gb25lIDRrIHBhZ2UpIAorCWZvciB0aGUgY2FzZSBpbiB3aGljaCBkZWJ1ZyB3YXMgb24sIGJ1dCB0aGlzIGxhcmdlciBzaXplIGFsbG93cworCW1vcmUgU01CcyB0byB1c2Ugc21hbGwgYnVmZmVyIGFsbG9jIGFuZCBpcyBzdGlsbCBtdWNoIG1vcmUKKwllZmZpY2llbnQgdG8gYWxsb2MgMSBwZXIgcGFnZSBvZmYgdGhlIHNsYWIgY29tcGFyZWQgdG8gMTdLICg1cGFnZSkgCisJYWxsb2Mgb2YgbGFyZ2UgY2lmcyBidWZmZXJzIGV2ZW4gd2hlbiBwYWdlIGRlYnVnZ2luZyBpcyBvbiAqLworCWNpZnNfc21fcmVxX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJjaWZzX3NtYWxsX3JxIiwKKwkJCU1BWF9DSUZTX0hEUl9TSVpFLCAwLCBTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwsIE5VTEwpOworCWlmIChjaWZzX3NtX3JlcV9jYWNoZXAgPT0gTlVMTCkgeworCQltZW1wb29sX2Rlc3Ryb3koY2lmc19yZXFfcG9vbHApOworCQlrbWVtX2NhY2hlX2Rlc3Ryb3koY2lmc19yZXFfY2FjaGVwKTsKKwkJcmV0dXJuIC1FTk9NRU07ICAgICAgICAgICAgICAKKwl9CisKKwlpZihjaWZzX21pbl9zbWFsbCA8IDIpCisJCWNpZnNfbWluX3NtYWxsID0gMjsKKwllbHNlIGlmIChjaWZzX21pbl9zbWFsbCA+IDI1NikgeworCQljaWZzX21pbl9zbWFsbCA9IDI1NjsKKwkJY0ZZSSgxLCgiY2lmc19taW5fc21hbGwgc2V0IHRvIG1heGltdW0gKDI1NikiKSk7CisJfQorCisJY2lmc19zbV9yZXFfcG9vbHAgPSBtZW1wb29sX2NyZWF0ZShjaWZzX21pbl9zbWFsbCwKKwkJCQltZW1wb29sX2FsbG9jX3NsYWIsCisJCQkJbWVtcG9vbF9mcmVlX3NsYWIsCisJCQkJY2lmc19zbV9yZXFfY2FjaGVwKTsKKworCWlmKGNpZnNfc21fcmVxX3Bvb2xwID09IE5VTEwpIHsKKwkJbWVtcG9vbF9kZXN0cm95KGNpZnNfcmVxX3Bvb2xwKTsKKwkJa21lbV9jYWNoZV9kZXN0cm95KGNpZnNfcmVxX2NhY2hlcCk7CisJCWttZW1fY2FjaGVfZGVzdHJveShjaWZzX3NtX3JlcV9jYWNoZXApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2NpZnNfZGVzdHJveV9yZXF1ZXN0X2J1ZnModm9pZCkKK3sKKwltZW1wb29sX2Rlc3Ryb3koY2lmc19yZXFfcG9vbHApOworCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3koY2lmc19yZXFfY2FjaGVwKSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgImNpZnNfZGVzdHJveV9yZXF1ZXN0X2NhY2hlOiBlcnJvciBub3QgYWxsIHN0cnVjdHVyZXMgd2VyZSBmcmVlZFxuIik7CisJbWVtcG9vbF9kZXN0cm95KGNpZnNfc21fcmVxX3Bvb2xwKTsKKwlpZiAoa21lbV9jYWNoZV9kZXN0cm95KGNpZnNfc21fcmVxX2NhY2hlcCkpCisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgImNpZnNfZGVzdHJveV9yZXF1ZXN0X2NhY2hlOiBjaWZzX3NtYWxsX3JxIGZyZWUgZXJyb3JcbiIpOworfQorCitzdGF0aWMgaW50CitjaWZzX2luaXRfbWlkcyh2b2lkKQoreworCWNpZnNfbWlkX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJjaWZzX21weF9pZHMiLAorCQkJCXNpemVvZiAoc3RydWN0IG1pZF9xX2VudHJ5KSwgMCwKKwkJCQlTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwsIE5VTEwpOworCWlmIChjaWZzX21pZF9jYWNoZXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljaWZzX21pZF9wb29scCA9IG1lbXBvb2xfY3JlYXRlKDMgLyogYSByZWFzb25hYmxlIG1pbiBzaW11bHRhbiBvcGVycyAqLywKKwkJCQkJbWVtcG9vbF9hbGxvY19zbGFiLAorCQkJCQltZW1wb29sX2ZyZWVfc2xhYiwKKwkJCQkJY2lmc19taWRfY2FjaGVwKTsKKwlpZihjaWZzX21pZF9wb29scCA9PSBOVUxMKSB7CisJCWttZW1fY2FjaGVfZGVzdHJveShjaWZzX21pZF9jYWNoZXApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwljaWZzX29wbG9ja19jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiY2lmc19vcGxvY2tfc3RydWN0cyIsCisJCQkJc2l6ZW9mIChzdHJ1Y3Qgb3Bsb2NrX3FfZW50cnkpLCAwLAorCQkJCVNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCwgTlVMTCk7CisJaWYgKGNpZnNfb3Bsb2NrX2NhY2hlcCA9PSBOVUxMKSB7CisJCWttZW1fY2FjaGVfZGVzdHJveShjaWZzX21pZF9jYWNoZXApOworCQltZW1wb29sX2Rlc3Ryb3koY2lmc19taWRfcG9vbHApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2NpZnNfZGVzdHJveV9taWRzKHZvaWQpCit7CisJbWVtcG9vbF9kZXN0cm95KGNpZnNfbWlkX3Bvb2xwKTsKKwlpZiAoa21lbV9jYWNoZV9kZXN0cm95KGNpZnNfbWlkX2NhY2hlcCkpCisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJjaWZzX2Rlc3Ryb3lfbWlkczogZXJyb3Igbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOworCisJaWYgKGttZW1fY2FjaGVfZGVzdHJveShjaWZzX29wbG9ja19jYWNoZXApKQorCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiZXJyb3Igbm90IGFsbCBvcGxvY2sgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKK30KKworc3RhdGljIGludCBjaWZzX29wbG9ja190aHJlYWQodm9pZCAqIGR1bW15YXJnKQoreworCXN0cnVjdCBvcGxvY2tfcV9lbnRyeSAqIG9wbG9ja19pdGVtOworCXN0cnVjdCBjaWZzVGNvbkluZm8gKnBUY29uOworCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCV9fdTE2ICBuZXRmaWQ7CisJaW50IHJjOworCisJZGFlbW9uaXplKCJjaWZzb3Bsb2NrZCIpOworCWFsbG93X3NpZ25hbChTSUdURVJNKTsKKworCW9wbG9ja1RocmVhZCA9IGN1cnJlbnQ7CisJZG8geworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkKKwkJc2NoZWR1bGVfdGltZW91dCgxKkhaKTsgIAorCQlzcGluX2xvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwkJaWYobGlzdF9lbXB0eSgmR2xvYmFsT3Bsb2NrX1EpKSB7CisJCQlzcGluX3VubG9jaygmR2xvYmFsTWlkX0xvY2spOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoMzkqSFopOworCQl9IGVsc2UgeworCQkJb3Bsb2NrX2l0ZW0gPSBsaXN0X2VudHJ5KEdsb2JhbE9wbG9ja19RLm5leHQsIAorCQkJCXN0cnVjdCBvcGxvY2tfcV9lbnRyeSwgcWhlYWQpOworCQkJaWYob3Bsb2NrX2l0ZW0pIHsKKwkJCQljRllJKDEsKCJmb3VuZCBvcGxvY2sgaXRlbSB0byB3cml0ZSBvdXQiKSk7IAorCQkJCXBUY29uID0gb3Bsb2NrX2l0ZW0tPnRjb247CisJCQkJaW5vZGUgPSBvcGxvY2tfaXRlbS0+cGlub2RlOworCQkJCW5ldGZpZCA9IG9wbG9ja19pdGVtLT5uZXRmaWQ7CisJCQkJc3Bpbl91bmxvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwkJCQlEZWxldGVPcGxvY2tRRW50cnkob3Bsb2NrX2l0ZW0pOworCQkJCS8qIGNhbiBub3QgZ3JhYiBpbm9kZSBzZW0gaGVyZSBzaW5jZSBpdCB3b3VsZAorCQkJCWRlYWRsb2NrIHdoZW4gb3Bsb2NrIHJlY2VpdmVkIG9uIGRlbGV0ZSAKKwkJCQlzaW5jZSB2ZnNfdW5saW5rIGhvbGRzIHRoZSBpX3NlbSBhY3Jvc3MKKwkJCQl0aGUgY2FsbCAqLworCQkJCS8qIGRvd24oJmlub2RlLT5pX3NlbSk7Ki8KKwkJCQlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgeworCQkJCQlyYyA9IGZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS0+aV9tYXBwaW5nKTsKKwkJCQkJaWYoQ0lGU19JKGlub2RlKS0+Y2xpZW50Q2FuQ2FjaGVSZWFkID09IDApIHsKKwkJCQkJCWZpbGVtYXBfZmRhdGF3YWl0KGlub2RlLT5pX21hcHBpbmcpOworCQkJCQkJaW52YWxpZGF0ZV9yZW1vdGVfaW5vZGUoaW5vZGUpOworCQkJCQl9CisJCQkJfSBlbHNlCisJCQkJCXJjID0gMDsKKwkJCQkvKiB1cCgmaW5vZGUtPmlfc2VtKTsqLworCQkJCWlmIChyYykKKwkJCQkJQ0lGU19JKGlub2RlKS0+d3JpdGVfYmVoaW5kX3JjID0gcmM7CisJCQkJY0ZZSSgxLCgiT3Bsb2NrIGZsdXNoIGlub2RlICVwIHJjICVkIixpbm9kZSxyYykpOworCisJCQkJLyogcmVsZWFzaW5nIGEgc3RhbGUgb3Bsb2NrIGFmdGVyIHJlY2VudCByZWNvbm5lY3Rpb24gCisJCQkJb2Ygc21iIHNlc3Npb24gdXNpbmcgYSBub3cgaW5jb3JyZWN0IGZpbGUgCisJCQkJaGFuZGxlIGlzIG5vdCBhIGRhdGEgaW50ZWdyaXR5IGlzc3VlIGJ1dCBkbyAgCisJCQkJbm90IGJvdGhlciBzZW5kaW5nIGFuIG9wbG9jayByZWxlYXNlIGlmIHNlc3Npb24gCisJCQkJdG8gc2VydmVyIHN0aWxsIGlzIGRpc2Nvbm5lY3RlZCBzaW5jZSBvcGxvY2sgCisJCQkJYWxyZWFkeSByZWxlYXNlZCBieSB0aGUgc2VydmVyIGluIHRoYXQgY2FzZSAqLworCQkJCWlmKHBUY29uLT50aWRTdGF0dXMgIT0gQ2lmc05lZWRSZWNvbm5lY3QpIHsKKwkJCQkgICAgcmMgPSBDSUZTU01CTG9jaygwLCBwVGNvbiwgbmV0ZmlkLAorCQkJCQkgICAgMCAvKiBsZW4gKi8gLCAwIC8qIG9mZnNldCAqLywgMCwgCisJCQkJCSAgICAwLCBMT0NLSU5HX0FORFhfT1BMT0NLX1JFTEVBU0UsCisJCQkJCSAgICAwIC8qIHdhaXQgZmxhZyAqLyk7CisJCQkJCWNGWUkoMSwoIk9wbG9jayByZWxlYXNlIHJjID0gJWQgIixyYykpOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCXNwaW5fdW5sb2NrKCZHbG9iYWxNaWRfTG9jayk7CisJCX0KKwl9IHdoaWxlKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSk7CisJY29tcGxldGVfYW5kX2V4aXQgKCZjaWZzX29wbG9ja19leGl0ZWQsIDApOworfQorCitzdGF0aWMgaW50IF9faW5pdAoraW5pdF9jaWZzKHZvaWQpCit7CisJaW50IHJjID0gMDsKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCWNpZnNfcHJvY19pbml0KCk7CisjZW5kaWYKKwlJTklUX0xJU1RfSEVBRCgmR2xvYmFsU2VydmVyTGlzdCk7CS8qIEJCIG5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KKwlJTklUX0xJU1RfSEVBRCgmR2xvYmFsU01CU2Vzc2lvbkxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZHbG9iYWxUcmVlQ29ubmVjdGlvbkxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZHbG9iYWxPcGxvY2tfUSk7CisvKgorICogIEluaXRpYWxpemUgR2xvYmFsIGNvdW50ZXJzCisgKi8KKwlhdG9taWNfc2V0KCZzZXNJbmZvQWxsb2NDb3VudCwgMCk7CisJYXRvbWljX3NldCgmdGNvbkluZm9BbGxvY0NvdW50LCAwKTsKKwlhdG9taWNfc2V0KCZ0Y3BTZXNBbGxvY0NvdW50LDApOworCWF0b21pY19zZXQoJnRjcFNlc1JlY29ubmVjdENvdW50LCAwKTsKKwlhdG9taWNfc2V0KCZ0Y29uSW5mb1JlY29ubmVjdENvdW50LCAwKTsKKworCWF0b21pY19zZXQoJmJ1ZkFsbG9jQ291bnQsIDApOworCWF0b21pY19zZXQoJm1pZENvdW50LCAwKTsKKwlHbG9iYWxDdXJyZW50WGlkID0gMDsKKwlHbG9iYWxUb3RhbEFjdGl2ZVhpZCA9IDA7CisJR2xvYmFsTWF4QWN0aXZlWGlkID0gMDsKKwlyd2xvY2tfaW5pdCgmR2xvYmFsU01CU2VzbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJkdsb2JhbE1pZF9Mb2NrKTsKKworCWlmKGNpZnNfbWF4X3BlbmRpbmcgPCAyKSB7CisJCWNpZnNfbWF4X3BlbmRpbmcgPSAyOworCQljRllJKDEsKCJjaWZzX21heF9wZW5kaW5nIHNldCB0byBtaW4gb2YgMiIpKTsKKwl9IGVsc2UgaWYoY2lmc19tYXhfcGVuZGluZyA+IDI1NikgeworCQljaWZzX21heF9wZW5kaW5nID0gMjU2OworCQljRllJKDEsKCJjaWZzX21heF9wZW5kaW5nIHNldCB0byBtYXggb2YgMjU2IikpOworCX0KKworCXJjID0gY2lmc19pbml0X2lub2RlY2FjaGUoKTsKKwlpZiAoIXJjKSB7CisJCXJjID0gY2lmc19pbml0X21pZHMoKTsKKwkJaWYgKCFyYykgeworCQkJcmMgPSBjaWZzX2luaXRfcmVxdWVzdF9idWZzKCk7CisJCQlpZiAoIXJjKSB7CisJCQkJcmMgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZjaWZzX2ZzX3R5cGUpOworCQkJCWlmICghcmMpIHsgICAgICAgICAgICAgICAgCisJCQkJCXJjID0gKGludClrZXJuZWxfdGhyZWFkKGNpZnNfb3Bsb2NrX3RocmVhZCwgTlVMTCwgCisJCQkJCQlDTE9ORV9GUyB8IENMT05FX0ZJTEVTIHwgQ0xPTkVfVk0pOworCQkJCQlpZihyYyA+IDApCisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJZWxzZSAKKwkJCQkJCWNFUlJPUigxLCgiZXJyb3IgJWQgY3JlYXRlIG9wbG9jayB0aHJlYWQiLHJjKSk7CisJCQkJfQorCQkJCWNpZnNfZGVzdHJveV9yZXF1ZXN0X2J1ZnMoKTsKKwkJCX0KKwkJCWNpZnNfZGVzdHJveV9taWRzKCk7CisJCX0KKwkJY2lmc19kZXN0cm95X2lub2RlY2FjaGUoKTsKKwl9CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwljaWZzX3Byb2NfY2xlYW4oKTsKKyNlbmRpZgorCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgX19leGl0CitleGl0X2NpZnModm9pZCkKK3sKKwljRllJKDAsICgiSW4gdW5yZWdpc3RlciBpZSBleGl0X2NpZnMiKSk7CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwljaWZzX3Byb2NfY2xlYW4oKTsKKyNlbmRpZgorCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmY2lmc19mc190eXBlKTsKKwljaWZzX2Rlc3Ryb3lfaW5vZGVjYWNoZSgpOworCWNpZnNfZGVzdHJveV9taWRzKCk7CisJY2lmc19kZXN0cm95X3JlcXVlc3RfYnVmcygpOworCWlmKG9wbG9ja1RocmVhZCkgeworCQlzZW5kX3NpZyhTSUdURVJNLCBvcGxvY2tUaHJlYWQsIDEpOworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjaWZzX29wbG9ja19leGl0ZWQpOworCX0KK30KKworTU9EVUxFX0FVVEhPUigiU3RldmUgRnJlbmNoIDxzZnJlbmNoQHVzLmlibS5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CQkvKiBjb21iaW5hdGlvbiBvZiBMR1BMICsgR1BMIHNvdXJjZSBiZWhhdmVzIGFzIEdQTCAqLworTU9EVUxFX0RFU0NSSVBUSU9OCisgICAgKCJWRlMgdG8gYWNjZXNzIHNlcnZlcnMgY29tcGx5aW5nIHdpdGggdGhlIFNOSUEgQ0lGUyBTcGVjaWZpY2F0aW9uIGUuZy4gU2FtYmEgYW5kIFdpbmRvd3MiKTsKK01PRFVMRV9WRVJTSU9OKENJRlNfVkVSU0lPTik7Cittb2R1bGVfaW5pdChpbml0X2NpZnMpCittb2R1bGVfZXhpdChleGl0X2NpZnMpCmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNmcy5oIGIvZnMvY2lmcy9jaWZzZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTFmMThhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9jaWZzZnMuaApAQCAtMCwwICsxLDk4IEBACisvKgorICogICBmcy9jaWZzL2NpZnNmcy5oCisgKgorICogICBDb3B5cmlnaHQgKGMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgIENvcnAuLCAyMDAyCisgKiAgIEF1dGhvcihzKTogU3RldmUgRnJlbmNoIChzZnJlbmNoQHVzLmlibS5jb20pCisgKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EgCisgKi8KKworI2lmbmRlZiBfQ0lGU0ZTX0gKKyNkZWZpbmUgX0NJRlNGU19ICisKKyNkZWZpbmUgUk9PVF9JIDIKKworI2lmbmRlZiBGQUxTRQorI2RlZmluZSBGQUxTRSAwCisjZW5kaWYKKworI2lmbmRlZiBUUlVFCisjZGVmaW5lIFRSVUUgMQorI2VuZGlmCisKK2V4dGVybiBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGNpZnNfYWRkcl9vcHM7CisKKy8qIEZ1bmN0aW9ucyByZWxhdGVkIHRvIHN1cGVyIGJsb2NrIG9wZXJhdGlvbnMgKi8KK2V4dGVybiBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBjaWZzX3N1cGVyX29wczsKK2V4dGVybiB2b2lkIGNpZnNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gdm9pZCBjaWZzX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CisvKiBleHRlcm4gdm9pZCBjaWZzX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqKTsgKi8vKiBCQiBub3QgbmVlZGVkIHlldCAqLworCisvKiBGdW5jdGlvbnMgcmVsYXRlZCB0byBpbm9kZXMgKi8KK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBjaWZzX2Rpcl9pbm9kZV9vcHM7CitleHRlcm4gaW50IGNpZnNfY3JlYXRlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCwgCisJCSAgICAgICBzdHJ1Y3QgbmFtZWlkYXRhICopOworZXh0ZXJuIHN0cnVjdCBkZW50cnkgKiBjaWZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLAorCQkJCSAgc3RydWN0IG5hbWVpZGF0YSAqKTsKK2V4dGVybiBpbnQgY2lmc191bmxpbmsoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKik7CitleHRlcm4gaW50IGNpZnNfaGFyZGxpbmsoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqKTsKK2V4dGVybiBpbnQgY2lmc19ta25vZChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLCBpbnQsIGRldl90KTsKK2V4dGVybiBpbnQgY2lmc19ta2RpcihzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLCBpbnQpOworZXh0ZXJuIGludCBjaWZzX3JtZGlyKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICopOworZXh0ZXJuIGludCBjaWZzX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgaW5vZGUgKiwKKwkJICAgICAgIHN0cnVjdCBkZW50cnkgKik7CitleHRlcm4gaW50IGNpZnNfcmV2YWxpZGF0ZShzdHJ1Y3QgZGVudHJ5ICopOworZXh0ZXJuIGludCBjaWZzX2dldGF0dHIoc3RydWN0IHZmc21vdW50ICosIHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGtzdGF0ICopOworZXh0ZXJuIGludCBjaWZzX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgaWF0dHIgKik7CisKK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBjaWZzX2ZpbGVfaW5vZGVfb3BzOworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGNpZnNfc3ltbGlua19pbm9kZV9vcHM7CisKKy8qIEZ1bmN0aW9ucyByZWxhdGVkIHRvIGZpbGVzIGFuZCBkaXJlY3RvcmllcyAqLworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY2lmc19maWxlX29wczsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNpZnNfZmlsZV9kaXJlY3Rfb3BzOyAvKiBpZiBkaXJlY3RpbyBtb3VudCAqLworZXh0ZXJuIGludCBjaWZzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOworZXh0ZXJuIGludCBjaWZzX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK2V4dGVybiBpbnQgY2lmc19jbG9zZWRpcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitleHRlcm4gc3NpemVfdCBjaWZzX3VzZXJfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnJlYWRfZGF0YSwKKwkJCSBzaXplX3QgcmVhZF9zaXplLCBsb2ZmX3QgKiBwb2Zmc2V0KTsKK2V4dGVybiBzc2l6ZV90IGNpZnNfdXNlcl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKndyaXRlX2RhdGEsCisJCQkgc2l6ZV90IHdyaXRlX3NpemUsIGxvZmZfdCAqIHBvZmZzZXQpOworZXh0ZXJuIGludCBjaWZzX2xvY2soc3RydWN0IGZpbGUgKiwgaW50LCBzdHJ1Y3QgZmlsZV9sb2NrICopOworZXh0ZXJuIGludCBjaWZzX2ZzeW5jKHN0cnVjdCBmaWxlICosIHN0cnVjdCBkZW50cnkgKiwgaW50KTsKK2V4dGVybiBpbnQgY2lmc19mbHVzaChzdHJ1Y3QgZmlsZSAqKTsKK2V4dGVybiBpbnQgY2lmc19maWxlX21tYXAoc3RydWN0IGZpbGUgKiAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqKTsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNpZnNfZGlyX29wczsKK2V4dGVybiBpbnQgY2lmc19kaXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitleHRlcm4gaW50IGNpZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZGlyZW50cnksIGZpbGxkaXJfdCBmaWxsZGlyKTsKK2V4dGVybiBpbnQgY2lmc19kaXJfbm90aWZ5KHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGxvbmcgYXJnKTsKKworLyogRnVuY3Rpb25zIHJlbGF0ZWQgdG8gZGlyIGVudHJpZXMgKi8KK2V4dGVybiBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgY2lmc19kZW50cnlfb3BzOworCisvKiBGdW5jdGlvbnMgcmVsYXRlZCB0byBzeW1saW5rcyAqLworZXh0ZXJuIGludCBjaWZzX2ZvbGxvd19saW5rKHN0cnVjdCBkZW50cnkgKmRpcmVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCk7CitleHRlcm4gdm9pZCBjaWZzX3B1dF9saW5rKHN0cnVjdCBkZW50cnkgKmRpcmVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCk7CitleHRlcm4gaW50IGNpZnNfcmVhZGxpbmsoc3RydWN0IGRlbnRyeSAqZGlyZW50cnksIGNoYXIgX191c2VyICpidWZmZXIsIAorCQkJIGludCBidWZsZW4pOworZXh0ZXJuIGludCBjaWZzX3N5bWxpbmsoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRlbnRyeSAqZGlyZW50cnksCisJCQljb25zdCBjaGFyICpzeW1uYW1lKTsKK2V4dGVybiBpbnQJY2lmc19yZW1vdmV4YXR0cihzdHJ1Y3QgZGVudHJ5ICosIGNvbnN0IGNoYXIgKik7CitleHRlcm4gaW50IAljaWZzX3NldHhhdHRyKHN0cnVjdCBkZW50cnkgKiwgY29uc3QgY2hhciAqLCBjb25zdCB2b2lkICosCisJCQkgc2l6ZV90LCBpbnQpOworZXh0ZXJuIHNzaXplX3QJY2lmc19nZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICosIGNvbnN0IGNoYXIgKiwgdm9pZCAqLCBzaXplX3QpOworZXh0ZXJuIHNzaXplX3QJY2lmc19saXN0eGF0dHIoc3RydWN0IGRlbnRyeSAqLCBjaGFyICosIHNpemVfdCk7CisjZGVmaW5lIENJRlNfVkVSU0lPTiAgICIxLjMxIgorI2VuZGlmCQkJCS8qIF9DSUZTRlNfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzZ2xvYi5oIGIvZnMvY2lmcy9jaWZzZ2xvYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YWZmMWE3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9jaWZzZ2xvYi5oCkBAIC0wLDAgKzEsNDM5IEBACisvKgorICogICBmcy9jaWZzL2NpZnNnbG9iLmgKKyAqCisgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyAgQ29ycC4sIDIwMDIsMjAwMworICogICBBdXRob3Iocyk6IFN0ZXZlIEZyZW5jaCAoc2ZyZW5jaEB1cy5pYm0uY29tKQorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgImNpZnNfZnNfc2IuaCIKKy8qCisgKiBUaGUgc2l6ZXMgb2YgdmFyaW91cyBpbnRlcm5hbCB0YWJsZXMgYW5kIHN0cmluZ3MKKyAqLworI2RlZmluZSBNQVhfVUlEX0lORk8gMTYKKyNkZWZpbmUgTUFYX1NFU19JTkZPIDIKKyNkZWZpbmUgTUFYX1RDT05fSU5GTyA0CisKKyNkZWZpbmUgTUFYX1RSRUVfU0laRSAyICsgTUFYX1NFUlZFUl9TSVpFICsgMSArIE1BWF9TSEFSRV9TSVpFICsgMQorI2RlZmluZSBNQVhfU0VSVkVSX1NJWkUgMTUKKyNkZWZpbmUgTUFYX1NIQVJFX1NJWkUgIDY0CS8qIHVzZWQgdG8gYmUgMjAgLSB0aGlzIHNob3VsZCBzdGlsbCBiZSBlbm91Z2ggKi8KKyNkZWZpbmUgTUFYX1VTRVJOQU1FX1NJWkUgMzIJLyogMzIgaXMgdG8gYWxsb3cgZm9yIDE1IGNoYXIgbmFtZXMgKyBudWxsCisJCQkJICAgdGVybWluYXRpb24gdGhlbiAqMiBmb3IgdW5pY29kZSB2ZXJzaW9ucyAqLworI2RlZmluZSBNQVhfUEFTU1dPUkRfU0laRSAxNgorCisjZGVmaW5lIENJRlNfTUlOX1JDVl9QT09MIDQKKworLyoKKyAqIE1BWF9SRVEgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJlcXVlc3RzIHRoYXQgV0Ugd2lsbCBzZW5kCisgKiBvbiBvbmUgc29ja2V0IGNvbmN1cmVudGx5LiBJdCBhbHNvIG1hdGNoZXMgdGhlIG1vc3QgY29tbW9uCisgKiB2YWx1ZSBvZiBtYXggbXVsdGlwbGV4IHJldHVybmVkIGJ5IHNlcnZlcnMuICBXZSBtYXkgCisgKiBldmVudHVhbGx5IHdhbnQgdG8gdXNlIHRoZSBuZWdvdGlhdGVkIHZhbHVlIChpbiBjYXNlCisgKiBmdXR1cmUgc2VydmVycyBjYW4gaGFuZGxlIG1vcmUpIHdoZW4gd2UgYXJlIG1vcmUgY29uZmlkZW50IHRoYXQKKyAqIHdlIHdpbGwgbm90IGhhdmUgcHJvYmxlbXMgb3ZlbG9hZGluZyB0aGUgc29ja2V0IHdpdGggcGVuZGluZworICogd3JpdGUgZGF0YS4KKyAqLworI2RlZmluZSBDSUZTX01BWF9SRVEgNTAgCisKKyNkZWZpbmUgU0VSVkVSX05BTUVfTEVOR1RIIDE1CisjZGVmaW5lIFNFUlZFUl9OQU1FX0xFTl9XSVRIX05VTEwgICAgIChTRVJWRVJfTkFNRV9MRU5HVEggKyAxKQorCisvKiB1c2VkIHRvIGRlZmluZSBzdHJpbmcgbGVuZ3RocyBmb3IgcmV2ZXJzaW5nIHVuaWNvZGUgc3RyaW5ncyAqLworLyogICAgICAgICAoMjU2KzEpKjIgPSA1MTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAobWF4IHBhdGggbGVuZ3RoICsgMSBmb3IgbnVsbCkgKiAyIGZvciB1bmljb2RlICAgICovCisjZGVmaW5lIE1BWF9OQU1FIDUxNAorCisjaW5jbHVkZSAiY2lmc3BkdS5oIgorCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFIDAKKyNlbmRpZgorCisjaWZuZGVmIFRSVUUKKyNkZWZpbmUgVFJVRSAxCisjZW5kaWYKKworI2lmbmRlZiBYQVRUUl9ET1NfQVRUUklCCisjZGVmaW5lIFhBVFRSX0RPU19BVFRSSUIgInVzZXIuRE9TQVRUUklCIgorI2VuZGlmCisKKy8qCisgKiBUaGlzIGluZm9ybWF0aW9uIGlzIGtlcHQgb24gZXZlcnkgU2VydmVyIHdlIGtub3cgYWJvdXQuCisgKgorICogU29tZSB0aGluZ3MgdG8gbm90ZToKKyAqCisgKi8KKyNkZWZpbmUgU0VSVkVSX05BTUVfTEVOX1dJVEhfTlVMTAkoU0VSVkVSX05BTUVfTEVOR1RIICsgMSkKKworLyoKKyAqIENJRlMgdmZzIGNsaWVudCBTdGF0dXMgaW5mb3JtYXRpb24gKGJhc2VkIG9uIHdoYXQgd2Uga25vdy4pCisgKi8KKworIC8qIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHRjcCBhbmQgc21iIHNlc3Npb24gKi8KK2VudW0gc3RhdHVzRW51bSB7CisJQ2lmc05ldyA9IDAsCisJQ2lmc0dvb2QsCisJQ2lmc0V4aXRpbmcsCisJQ2lmc05lZWRSZWNvbm5lY3QKK307CisKK2VudW0gc2VjdXJpdHlFbnVtIHsKKwlOVExNID0gMCwJCS8qIExlZ2FjeSBOVExNMDEyIGF1dGggd2l0aCBOVExNIGhhc2ggKi8KKwlOVExNdjIsCQkJLyogTGVnYWN5IE5UTE0gYXV0aCB3aXRoIE5UTE12MiBoYXNoICovCisJUmF3TlRMTVNTUCwJCS8qIE5UTE1TU1Agd2l0aG91dCBTUE5FR08gKi8KKwlOVExNU1NQLAkJLyogTlRMTVNTUCB2aWEgU1BORUdPICovCisJS2VyYmVyb3MJCS8qIEtlcmJlcm9zIHZpYSBTUE5FR08gKi8KK307CisKK2VudW0gcHJvdG9jb2xFbnVtIHsKKwlJUFY0ID0gMCwKKwlJUFY2LAorCVNDVFAKKwkvKiBOZXRiaW9zIGZyYW1lcyBwcm90b2NvbCBub3Qgc3VwcG9ydGVkIGF0IHRoaXMgdGltZSAqLworfTsKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRXhjZXB0IHRoZSBDSUZTIFBEVXMgdGhlbXNlbHZlcyBhbGwgdGhlCisgKiBnbG9iYWxseSBpbnRlcmVzdGluZyBzdHJ1Y3RzIHNob3VsZCBnbyBoZXJlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCitzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvIHsKKwljaGFyIHNlcnZlcl9OYW1lW1NFUlZFUl9OQU1FX0xFTl9XSVRIX05VTExdOwkvKiAxNSBjaGFycyArIFgnMjAnaW4gMTZ0aCAqLworCWNoYXIgdW5pY29kZV9zZXJ2ZXJfTmFtZVtTRVJWRVJfTkFNRV9MRU5fV0lUSF9OVUxMICogMl07CS8qIFVuaWNvZGUgdmVyc2lvbiBvZiBzZXJ2ZXJfTmFtZSAqLworCXN0cnVjdCBzb2NrZXQgKnNzb2NrZXQ7CisJdW5pb24geworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc29ja0FkZHI7CisJCXN0cnVjdCBzb2NrYWRkcl9pbjYgc29ja0FkZHI2OworCX0gYWRkcjsKKwl3YWl0X3F1ZXVlX2hlYWRfdCByZXNwb25zZV9xOyAKKwl3YWl0X3F1ZXVlX2hlYWRfdCByZXF1ZXN0X3E7IC8qIGlmIG1vcmUgdGhhbiBtYXhtcHggdG8gc3J2ciBtdXN0IGJsb2NrKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHBlbmRpbmdfbWlkX3E7CisJdm9pZCAqU2VydmVyX05sc0luZm87CS8qIEJCIC0gcGxhY2Vob2xkZXIgZm9yIGZ1dHVyZSBOTFMgaW5mbyAgKi8KKwl1bnNpZ25lZCBzaG9ydCBzZXJ2ZXJfY29kZXBhZ2U7CS8qIGNvZGVwYWdlIGZvciB0aGUgc2VydmVyICAgICovCisJdW5zaWduZWQgbG9uZyBpcF9hZGRyZXNzOwkvKiBJUCBhZGRyIGZvciB0aGUgc2VydmVyIGlmIGtub3duICAgICAqLworCWVudW0gcHJvdG9jb2xFbnVtIHByb3RvY29sVHlwZTsJCisJY2hhciB2ZXJzaW9uTWFqb3I7CisJY2hhciB2ZXJzaW9uTWlub3I7CisJdW5zaWduZWQgc3Zsb2NhbDoxOwkvKiBsb2NhbCBzZXJ2ZXIgb3IgcmVtb3RlICovCisJYXRvbWljX3Qgc29ja2V0VXNlQ291bnQ7IC8qIG51bWJlciBvZiBvcGVuIGNpZnMgc2Vzc2lvbnMgb24gc29ja2V0ICovCisJYXRvbWljX3QgaW5GbGlnaHQ7ICAvKiBudW1iZXIgb2YgcmVxdWVzdHMgb24gdGhlIHdpcmUgdG8gc2VydmVyICovCisJZW51bSBzdGF0dXNFbnVtIHRjcFN0YXR1czsgLyogd2hhdCB3ZSB0aGluayB0aGUgc3RhdHVzIGlzICovCisJc3RydWN0IHNlbWFwaG9yZSB0Y3BTZW07CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CisJY2hhciBzZXJ2ZXJfR1VJRFsxNl07CisJY2hhciBzZWNNb2RlOworCWVudW0gc2VjdXJpdHlFbnVtIHNlY1R5cGU7CisJdW5zaWduZWQgaW50IG1heFJlcTsJLyogQ2xpZW50cyBzaG91bGQgc3VibWl0IG5vIG1vcmUgKi8KKwkvKiB0aGFuIG1heFJlcSBkaXN0aW5jdCB1bmFuc3dlcmVkIFNNQnMgdG8gdGhlIHNlcnZlciB3aGVuIHVzaW5nICAqLworCS8qIG11bHRpcGxleGVkIHJlYWRzIG9yIHdyaXRlcyAqLworCXVuc2lnbmVkIGludCBtYXhCdWY7CS8qIG1heEJ1ZiBzcGVjaWZpZXMgdGhlIG1heGltdW0gKi8KKwkvKiBtZXNzYWdlIHNpemUgdGhlIHNlcnZlciBjYW4gc2VuZCBvciByZWNlaXZlIGZvciBub24tcmF3IFNNQnMgKi8KKwl1bnNpZ25lZCBpbnQgbWF4Unc7CS8qIG1heFJ3IHNwZWNpZmllcyB0aGUgbWF4aW11bSAqLworCS8qIG1lc3NhZ2Ugc2l6ZSB0aGUgc2VydmVyIGNhbiBzZW5kIG9yIHJlY2VpdmUgZm9yICovCisJLyogU01CX0NPTV9XUklURV9SQVcgb3IgU01CX0NPTV9SRUFEX1JBVy4gKi8KKwljaGFyIHNlc3NpZFs0XTsJCS8qIHVuaXF1ZSB0b2tlbiBpZCBmb3IgdGhpcyBzZXNzaW9uICovCisJLyogKHJldHVybmVkIG9uIE5lZ290aWF0ZSAqLworCWludCBjYXBhYmlsaXRpZXM7IC8qIGFsbG93IHNlbGVjdGl2ZSBkaXNhYmxpbmcgb2YgY2FwcyBieSBzbWIgc2VzcyAqLworCV9fdTE2IHRpbWVab25lOworCWNoYXIgY3J5cHRLZXlbQ0lGU19DUllQVE9fS0VZX1NJWkVdOworCWNoYXIgd29ya3N0YXRpb25fUkZDMTAwMV9uYW1lWzE2XTsgLyogMTZ0aCBieXRlIGlzIGFsd2F5cyB6ZXJvICovCit9OworCisvKgorICogVGhlIGZvbGxvd2luZyBpcyBvdXIgc2hvcnRjdXQgdG8gdXNlciBpbmZvcm1hdGlvbi4gIFdlIHN1cmZhY2UgdGhlIHVpZCwKKyAqIGFuZCBuYW1lLiBXZSBhbHdheXMgZ2V0IHRoZSBwYXNzd29yZCBvbiB0aGUgZmx5IGluIGNhc2UgaXQKKyAqIGhhcyBjaGFuZ2VkLiBXZSBhbHNvIGhhbmcgYSBsaXN0IG9mIHNlc3Npb25zIG93bmVkIGJ5IHRoaXMgdXNlciBvZmYgaGVyZS4gCisgKi8KK3N0cnVjdCBjaWZzVWlkSW5mbyB7CisJc3RydWN0IGxpc3RfaGVhZCB1c2VyTGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHNlc3Npb25MaXN0OyAvKiBTTUIgc2Vzc2lvbnMgZm9yIHRoaXMgdXNlciAqLworCXVpZF90IGxpbnV4X3VpZDsKKwljaGFyIHVzZXJbTUFYX1VTRVJOQU1FX1NJWkUgKyAxXTsJLyogYXNjaWkgbmFtZSBvZiB1c2VyICovCisJLyogQkIgbWF5IG5lZWQgcHRyIG9yIGNhbGxiYWNrIGZvciBQQU0gb3IgV2luQmluZCBpbmZvICovCit9OworCisvKgorICogU2Vzc2lvbiBzdHJ1Y3R1cmUuICBPbmUgb2YgdGhlc2UgZm9yIGVhY2ggdWlkIHNlc3Npb24gd2l0aCBhIHBhcnRpY3VsYXIgaG9zdAorICovCitzdHJ1Y3QgY2lmc1Nlc0luZm8geworCXN0cnVjdCBsaXN0X2hlYWQgY2lmc1Nlc3Npb25MaXN0OworCXN0cnVjdCBzZW1hcGhvcmUgc2VzU2VtOworCXN0cnVjdCBjaWZzVWlkSW5mbyAqdWlkSW5mbzsJLyogcG9pbnRlciB0byB1c2VyIGluZm8gKi8KKwlzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXI7CS8qIHBvaW50ZXIgdG8gc2VydmVyIGluZm8gKi8KKwlhdG9taWNfdCBpblVzZTsgLyogIyBvZiBtb3VudHMgKHRyZWUgY29ubmVjdGlvbnMpIG9uIHRoaXMgc2VzICovCisJZW51bSBzdGF0dXNFbnVtIHN0YXR1czsKKwlfX3UzMiBzZXF1ZW5jZV9udW1iZXI7ICAvKiBuZWVkZWQgZm9yIENJRlMgUERVIHNpZ25hdHVyZSAqLworCV9fdTE2IGlwY190aWQ7CQkvKiBzcGVjaWFsIHRpZCBmb3IgY29ubmVjdGlvbiB0byBJUEMgc2hhcmUgKi8KKwlfX3UxNiBmbGFnczsKKwljaGFyIG1hY19zaWduaW5nX2tleVtDSUZTX1NFU1NJT05fS0VZX1NJWkUgKyAxNl07CQorCWNoYXIgKnNlcnZlck9TOwkJLyogbmFtZSBvZiBvcGVyYXRpbmcgc3lzdGVtIHVuZGVybHlpbmcgdGhlIHNlcnZlciAqLworCWNoYXIgKnNlcnZlck5PUzsJLyogbmFtZSBvZiBuZXR3b3JrIG9wZXJhdGluZyBzeXN0ZW0gdGhhdCB0aGUgc2VydmVyIGlzIHJ1bm5pbmcgKi8KKwljaGFyICpzZXJ2ZXJEb21haW47CS8qIHNlY3VyaXR5IHJlYWxtIG9mIHNlcnZlciAqLworCWludCBTdWlkOwkJLyogcmVtb3RlIHNtYiB1aWQgICovCisJdWlkX3QgbGludXhfdWlkOyAgICAgICAgLyogbG9jYWwgTGludXggdWlkICovCisJaW50IGNhcGFiaWxpdGllczsKKwljaGFyIHNlcnZlck5hbWVbU0VSVkVSX05BTUVfTEVOX1dJVEhfTlVMTCAqIDJdOwkvKiBCQiBtYWtlIGJpZ2dlciBmb3IgdGNwIG5hbWVzIC0gd2lsbCBpcHY2IGFuZCBzY3RwIGFkZHJlc3NlcyBmaXQgaGVyZT8/ICovCisJY2hhciB1c2VyTmFtZVtNQVhfVVNFUk5BTUVfU0laRSArIDFdOworCWNoYXIgZG9tYWluTmFtZVtNQVhfVVNFUk5BTUVfU0laRSArIDFdOworCWNoYXIgKiBwYXNzd29yZDsKK307CisvKiBzZXNzaW9uIGZsYWdzICovCisjZGVmaW5lIENJRlNfU0VTX05UNCAxCisKKy8qCisgKiB0aGVyZSBpcyBvbmUgb2YgdGhlc2UgZm9yIGVhY2ggY29ubmVjdGlvbiB0byBhIHJlc291cmNlIG9uIGEgcGFydGljdWxhcgorICogc2Vzc2lvbiAKKyAqLworc3RydWN0IGNpZnNUY29uSW5mbyB7CisJc3RydWN0IGxpc3RfaGVhZCBjaWZzQ29ubmVjdGlvbkxpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBvcGVuRmlsZUxpc3Q7CisJc3RydWN0IHNlbWFwaG9yZSB0Y29uU2VtOworCXN0cnVjdCBjaWZzU2VzSW5mbyAqc2VzOwkvKiBwb2ludGVyIHRvIHNlc3Npb24gYXNzb2NpYXRlZCB3aXRoICovCisJY2hhciB0cmVlTmFtZVtNQVhfVFJFRV9TSVpFICsgMV07IC8qIFVOQyBuYW1lIG9mIHJlc291cmNlIChpbiBBU0NJSSBub3QgVVRGKSAqLworCWNoYXIgKm5hdGl2ZUZpbGVTeXN0ZW07CisJX191MTYgdGlkOwkJLyogVGhlIDIgYnl0ZSB0cmVlIGlkICovCisJX191MTYgRmxhZ3M7CQkvKiBvcHRpb25hbCBzdXBwb3J0IGJpdHMgKi8KKwllbnVtIHN0YXR1c0VudW0gdGlkU3RhdHVzOworCWF0b21pY190IHVzZUNvdW50OwkvKiBob3cgbWFueSBtb3VudHMgKGV4cGxpY2l0IG9yIGltcGxpY2l0KSB0byB0aGlzIHNoYXJlICovCisjaWZkZWYgQ09ORklHX0NJRlNfU1RBVFMKKwlhdG9taWNfdCBudW1fc21ic19zZW50OworCWF0b21pY190IG51bV93cml0ZXM7CisJYXRvbWljX3QgbnVtX3JlYWRzOworCWF0b21pY190IG51bV9vcGxvY2tfYnJrczsKKwlhdG9taWNfdCBudW1fb3BlbnM7CisJYXRvbWljX3QgbnVtX2RlbGV0ZXM7CisJYXRvbWljX3QgbnVtX21rZGlyczsKKwlhdG9taWNfdCBudW1fcm1kaXJzOworCWF0b21pY190IG51bV9yZW5hbWVzOworCWF0b21pY190IG51bV90MnJlbmFtZXM7CisJX191NjQgICAgYnl0ZXNfcmVhZDsKKwlfX3U2NCAgICBieXRlc193cml0dGVuOworCXNwaW5sb2NrX3Qgc3RhdF9sb2NrOworI2VuZGlmCisJRklMRV9TWVNURU1fREVWSUNFX0lORk8gZnNEZXZJbmZvOworCUZJTEVfU1lTVEVNX0FUVFJJQlVURV9JTkZPIGZzQXR0ckluZm87CS8qIG9rIGlmIGZpbGUgc3lzdGVtIG5hbWUgdHJ1bmNhdGVkICovCisJRklMRV9TWVNURU1fVU5JWF9JTkZPIGZzVW5peEluZm87CisJdW5zaWduZWQgcmV0cnk6MTsKKwkvKiBCQiBhZGQgZmllbGQgZm9yIGJhY2sgcG9pbnRlciB0byBzYiBzdHJ1Y3Q/ICovCit9OworCisvKgorICogVGhpcyBpbmZvIGhhbmdzIG9mZiB0aGUgY2lmc0ZpbGVJbmZvIHN0cnVjdHVyZS4gIFRoaXMgaXMgdXNlZCB0byB0cmFjaworICogYnl0ZSBzdHJlYW0gbG9ja3Mgb24gdGhlIGZpbGUKKyAqLworc3RydWN0IGNpZnNMb2NrSW5mbyB7CisJc3RydWN0IGNpZnNMb2NrSW5mbyAqbmV4dDsKKwlpbnQgc3RhcnQ7CisJaW50IGxlbmd0aDsKKwlpbnQgdHlwZTsKK307CisKKy8qCisgKiBPbmUgb2YgdGhlc2UgZm9yIGVhY2ggb3BlbiBpbnN0YW5jZSBvZiBhIGZpbGUKKyAqLworc3RydWN0IGNpZnNfc2VhcmNoX2luZm8geworCWxvZmZfdCBpbmRleF9vZl9sYXN0X2VudHJ5OworCV9fdTE2IGVudHJpZXNfaW5fYnVmZmVyOworCV9fdTE2IGluZm9fbGV2ZWw7CisJX191MzIgcmVzdW1lX2tleTsKKwljaGFyICogbnR3cmtfYnVmX3N0YXJ0OworCWNoYXIgKiBzcmNoX2VudHJpZXNfc3RhcnQ7CisJY2hhciAqIHByZXN1bWVfbmFtZTsKKwl1bnNpZ25lZCBpbnQgcmVzdW1lX25hbWVfbGVuOworCXVuc2lnbmVkIGVuZE9mU2VhcmNoOjE7CisJdW5zaWduZWQgZW1wdHlEaXI6MTsKKwl1bnNpZ25lZCB1bmljb2RlOjE7Cit9OworCitzdHJ1Y3QgY2lmc0ZpbGVJbmZvIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHRsaXN0OwkvKiBwb2ludGVyIHRvIG5leHQgZmlkIG93bmVkIGJ5IHRjb24gKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGZsaXN0OwkvKiBuZXh0IGZpZCAoZmlsZSBpbnN0YW5jZSkgZm9yIHRoaXMgaW5vZGUgKi8KKwl1bnNpZ25lZCBpbnQgdWlkOwkvKiBhbGxvd3MgZmluZGluZyB3aGljaCBGaWxlSW5mbyBzdHJ1Y3R1cmUgKi8KKwlfX3UzMiBwaWQ7CQkvKiBwcm9jZXNzIGlkIHdobyBvcGVuZWQgZmlsZSAqLworCV9fdTE2IG5ldGZpZDsJCS8qIGZpbGUgaWQgZnJvbSByZW1vdGUgKi8KKwkvKiBCQiBhZGQgbG9jayBzY29wZSBpbmZvIGhlcmUgaWYgbmVlZGVkICovIDsKKwkvKiBsb2NrIHNjb3BlIGlkICgwIGlmIG5vbmUpICovCisJc3RydWN0IGZpbGUgKiBwZmlsZTsgLyogbmVlZGVkIGZvciB3cml0ZXBhZ2UgKi8KKwlzdHJ1Y3QgaW5vZGUgKiBwSW5vZGU7IC8qIG5lZWRlZCBmb3Igb3Bsb2NrIGJyZWFrICovCisJdW5zaWduZWQgY2xvc2VQZW5kOjE7CS8qIGZpbGUgaXMgbWFya2VkIHRvIGNsb3NlICovCisJdW5zaWduZWQgaW52YWxpZEhhbmRsZToxOyAgLyogZmlsZSBjbG9zZWQgdmlhIHNlc3Npb24gYWJlbmQgKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlIGZoX3NlbTsgLyogcHJldmVudHMgcmVvcGVuIHJhY2UgYWZ0ZXIgZGVhZCBzZXMqLworCWNoYXIgKiBzZWFyY2hfcmVzdW1lX25hbWU7IC8qIEJCIHJlbW92ZW1lIEJCICovCisJdW5zaWduZWQgaW50IHJlc3VtZV9uYW1lX2xlbmd0aDsgLyogQkIgcmVtb3ZlbWUgLSBmaWVsZCByZW5hbWVkIGFuZCBtb3ZlZCBCQiAqLworCXN0cnVjdCBjaWZzX3NlYXJjaF9pbmZvIHNyY2hfaW5mOworfTsKKworLyoKKyAqIE9uZSBvZiB0aGVzZSBmb3IgZWFjaCBmaWxlIGlub2RlCisgKi8KKworc3RydWN0IGNpZnNJbm9kZUluZm8geworCXN0cnVjdCBsaXN0X2hlYWQgbG9ja0xpc3Q7CisJLyogQkIgYWRkIGluIGxpc3RzIGZvciBkaXJ0eSBwYWdlcyAtIGkuZS4gd3JpdGUgY2FjaGluZyBpbmZvIGZvciBvcGxvY2sgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIG9wZW5GaWxlTGlzdDsKKwlpbnQgd3JpdGVfYmVoaW5kX3JjOworCV9fdTMyIGNpZnNBdHRyczsgLyogZS5nLiBET1MgYXJjaGl2ZSBiaXQsIHNwYXJzZSwgY29tcHJlc3NlZCwgc3lzdGVtICovCisJYXRvbWljX3QgaW5Vc2U7CSAvKiBudW0gY29uY3VycmVudCB1c2VycyAobG9jYWwgb3BlbmVycyBjaWZzKSBvZiBmaWxlKi8KKwl1bnNpZ25lZCBsb25nIHRpbWU7CS8qIGppZmZpZXMgb2YgbGFzdCB1cGRhdGUvY2hlY2sgb2YgaW5vZGUgKi8KKwl1bnNpZ25lZCBjbGllbnRDYW5DYWNoZVJlYWQ6MTsgLyogcmVhZCBvcGxvY2sgKi8KKwl1bnNpZ25lZCBjbGllbnRDYW5DYWNoZUFsbDoxOyAgLyogcmVhZCBhbmQgd3JpdGViZWhpbmQgb3Bsb2NrICovCisJdW5zaWduZWQgb3Bsb2NrUGVuZGluZzoxOworCXN0cnVjdCBpbm9kZSB2ZnNfaW5vZGU7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjaWZzSW5vZGVJbmZvICoKK0NJRlNfSShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiBjb250YWluZXJfb2YoaW5vZGUsIHN0cnVjdCBjaWZzSW5vZGVJbmZvLCB2ZnNfaW5vZGUpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjaWZzX3NiX2luZm8gKgorQ0lGU19TQihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXJldHVybiBzYi0+c19mc19pbmZvOworfQorCisKKy8qIG9uZSBvZiB0aGVzZSBmb3IgZXZlcnkgcGVuZGluZyBDSUZTIHJlcXVlc3QgdG8gdGhlIHNlcnZlciAqLworc3RydWN0IG1pZF9xX2VudHJ5IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHFoZWFkOwkvKiBtaWRzIHdhaXRpbmcgb24gcmVwbHkgZnJvbSB0aGlzIHNlcnZlciAqLworCV9fdTE2IG1pZDsJCS8qIG11bHRpcGxleCBpZCAqLworCV9fdTE2IHBpZDsJCS8qIHByb2Nlc3MgaWQgKi8KKwlfX3UzMiBzZXF1ZW5jZV9udW1iZXI7ICAvKiBmb3IgQ0lGUyBzaWduaW5nICovCisJX191MTYgY29tbWFuZDsJCS8qIHNtYiBjb21tYW5kIGNvZGUgKi8KKwlzdHJ1Y3QgdGltZXZhbCB3aGVuX3NlbnQ7CS8qIHRpbWUgd2hlbiBzbWIgc2VudCAqLworCXN0cnVjdCBjaWZzU2VzSW5mbyAqc2VzOwkvKiBzbWIgd2FzIHNlbnQgdG8gdGhpcyBzZXJ2ZXIgKi8KKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsJLyogdGFzayB3YWl0aW5nIGZvciByZXNwb25zZSAqLworCXN0cnVjdCBzbWJfaGRyICpyZXNwX2J1ZjsJLyogcmVzcG9uc2UgYnVmZmVyICovCisJaW50IG1pZFN0YXRlOwkvKiB3aXNoIHRoaXMgd2VyZSBlbnVtIGJ1dCBjYW4gbm90IHBhc3MgdG8gd2FpdF9ldmVudCAqLworfTsKKworc3RydWN0IG9wbG9ja19xX2VudHJ5IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHFoZWFkOworCXN0cnVjdCBpbm9kZSAqIHBpbm9kZTsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICogdGNvbjsgCisJX191MTYgbmV0ZmlkOworfTsKKworI2RlZmluZSAgIE1JRF9GUkVFIDAKKyNkZWZpbmUgICBNSURfUkVRVUVTVF9BTExPQ0FURUQgMQorI2RlZmluZSAgIE1JRF9SRVFVRVNUX1NVQk1JVFRFRCAyCisjZGVmaW5lICAgTUlEX1JFU1BPTlNFX1JFQ0VJVkVEIDQKKyNkZWZpbmUgICBNSURfUkVUUllfTkVFREVEICAgICAgOCAvKiBzZXNzaW9uIGNsb3NlZCB3aGlsZSB0aGlzIHJlcXVlc3Qgb3V0ICovCisjZGVmaW5lICAgTUlEX05PX1JFU1BfTkVFREVEIDB4MTAKKyNkZWZpbmUgICBNSURfU01BTExfQlVGRkVSICAgMHgyMCAvKiAxMTIgYnl0ZSByZXNwb25zZSBidWZmZXIgaW5zdGVhZCBvZiA0SyAqLworCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBbGwgY29uc3RhbnRzIGdvIGhlcmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNkZWZpbmUgVUlEX0hBU0ggKDE2KQorCisvKgorICogTm90ZSB0aGF0IE9ORSBtb2R1bGUgc2hvdWxkIGRlZmluZSBfREVDTEFSRV9HTE9CQUxTX0hFUkUgdG8gY2F1c2UgdGhlCisgKiBmb2xsb3dpbmcgdG8gYmUgZGVjbGFyZWQuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBMb2NraW5nIG5vdGVzLiAgQWxsIHVwZGF0ZXMgdG8gZ2xvYmFsIHZhcmlhYmxlcyBhbmQgbGlzdHMgc2hvdWxkIGJlCisgKiAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBieSBzcGlubG9ja3Mgb3Igc2VtYXBob3Jlcy4KKyAqCisgKiAgU3BpbmxvY2tzCisgKiAgLS0tLS0tLS0tCisgKiAgR2xvYmFsTWlkX0xvY2sgcHJvdGVjdHM6CisgKglsaXN0IG9wZXJhdGlvbnMgb24gcGVuZGluZ19taWRfcSBhbmQgb3Bsb2NrUQorICogICAgICB1cGRhdGVzIHRvIFhJRCBjb3VudGVycywgbXVsdGlwbGV4IGlkICBhbmQgU01CIHNlcXVlbmNlIG51bWJlcnMKKyAqICBHbG9iYWxTTUJTZXNMb2NrIHByb3RlY3RzOgorICoJbGlzdCBvcGVyYXRpb25zIG9uIHRjcCBhbmQgU01CIHNlc3Npb24gbGlzdHMgYW5kIHRDb24gbGlzdHMKKyAqICBmX293bmVyLmxvY2sgcHJvdGVjdHMgY2VydGFpbiBwZXIgZmlsZSBzdHJ1Y3Qgb3BlcmF0aW9ucworICogIG1hcHBpbmctPnBhZ2VfbG9jayBwcm90ZWN0cyBjZXJ0YWluIHBlciBwYWdlIG9wZXJhdGlvbnMKKyAqCisgKiAgU2VtYXBob3JlcworICogIC0tLS0tLS0tLS0KKyAqICBzZXNTZW0gICAgIG9wZXJhdGlvbnMgb24gc21iIHNlc3Npb24KKyAqICB0Y29uU2VtICAgIG9wZXJhdGlvbnMgb24gdHJlZSBjb25uZWN0aW9uCisgKiAgZmhfc2VtICAgICAgZmlsZSBoYW5kbGUgcmVjb25uZWN0aW9uIG9wZXJhdGlvbnMgCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBERUNMQVJFX0dMT0JBTFNfSEVSRQorI2RlZmluZSBHTE9CQUxfRVhURVJOCisjZWxzZQorI2RlZmluZSBHTE9CQUxfRVhURVJOIGV4dGVybgorI2VuZGlmCisKKy8qCisgKiBUaGUgbGlzdCBvZiBzZXJ2ZXJzIHRoYXQgZGlkIG5vdCByZXNwb25kIHdpdGggTlQgTE0gMC4xMi4KKyAqIFRoaXMgbGlzdCBoZWxwcyBpbXByb3ZlIHBlcmZvcm1hbmNlIGFuZCBlbGltaW5hdGUgdGhlIG1lc3NhZ2VzIGluZGljYXRpbmcKKyAqIHRoYXQgd2UgaGFkIGEgY29tbXVuaWNhdGlvbnMgZXJyb3IgdGFsa2luZyB0byB0aGUgc2VydmVyIGluIHRoaXMgbGlzdC4gCisgKi8KK0dMT0JBTF9FWFRFUk4gc3RydWN0IHNlcnZlcnNfbm90X3N1cHBvcnRlZCAqTm90U3VwcExpc3Q7CS8qQHo0YSAqLworCisvKgorICogVGhlIGZvbGxvd2luZyBpcyBhIGhhc2ggdGFibGUgb2YgYWxsIHRoZSB1c2VycyB3ZSBrbm93IGFib3V0LgorICovCitHTE9CQUxfRVhURVJOIHN0cnVjdCBzbWJVaWRJbmZvICpHbG9iYWxVaWRMaXN0W1VJRF9IQVNIXTsKKworR0xPQkFMX0VYVEVSTiBzdHJ1Y3QgbGlzdF9oZWFkIEdsb2JhbFNlcnZlckxpc3Q7IC8qIEJCIG5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KK0dMT0JBTF9FWFRFUk4gc3RydWN0IGxpc3RfaGVhZCBHbG9iYWxTTUJTZXNzaW9uTGlzdDsKK0dMT0JBTF9FWFRFUk4gc3RydWN0IGxpc3RfaGVhZCBHbG9iYWxUcmVlQ29ubmVjdGlvbkxpc3Q7CitHTE9CQUxfRVhURVJOIHJ3bG9ja190IEdsb2JhbFNNQlNlc2xvY2s7ICAvKiBwcm90ZWN0cyBsaXN0IGluc2VydHMgb24gMyBhYm92ZSAqLworCitHTE9CQUxfRVhURVJOIHN0cnVjdCBsaXN0X2hlYWQgR2xvYmFsT3Bsb2NrX1E7CisKKy8qCisgKiBHbG9iYWwgdHJhbnNhY3Rpb24gaWQgKFhJRCkgaW5mb3JtYXRpb24KKyAqLworR0xPQkFMX0VYVEVSTiB1bnNpZ25lZCBpbnQgR2xvYmFsQ3VycmVudFhpZDsJLyogcHJvdGVjdGVkIGJ5IEdsb2JhbE1pZF9TZW0gKi8KK0dMT0JBTF9FWFRFUk4gdW5zaWduZWQgaW50IEdsb2JhbFRvdGFsQWN0aXZlWGlkOwkvKiBwcm90IGJ5IEdsb2JhbE1pZF9TZW0gKi8KK0dMT0JBTF9FWFRFUk4gdW5zaWduZWQgaW50IEdsb2JhbE1heEFjdGl2ZVhpZDsJLyogcHJvdCBieSBHbG9iYWxNaWRfU2VtICovCitHTE9CQUxfRVhURVJOIHNwaW5sb2NrX3QgR2xvYmFsTWlkX0xvY2s7ICAvKiBwcm90ZWN0cyBhYm92ZSBhbmQgbGlzdCBvcGVyYXRpb25zICovCisJCQkJCS8qIG9uIG1pZFEgZW50cmllcyAqLworR0xPQkFMX0VYVEVSTiBjaGFyIExvY2FsX1N5c3RlbV9OYW1lWzE1XTsKKworLyoKKyAqICBHbG9iYWwgY291bnRlcnMsIHVwZGF0ZWQgYXRvbWljYWxseQorICovCitHTE9CQUxfRVhURVJOIGF0b21pY190IHNlc0luZm9BbGxvY0NvdW50OworR0xPQkFMX0VYVEVSTiBhdG9taWNfdCB0Y29uSW5mb0FsbG9jQ291bnQ7CitHTE9CQUxfRVhURVJOIGF0b21pY190IHRjcFNlc0FsbG9jQ291bnQ7CitHTE9CQUxfRVhURVJOIGF0b21pY190IHRjcFNlc1JlY29ubmVjdENvdW50OworR0xPQkFMX0VYVEVSTiBhdG9taWNfdCB0Y29uSW5mb1JlY29ubmVjdENvdW50OworCisvKiBWYXJpb3VzIERlYnVnIGNvdW50ZXJzIHRvIHJlbW92ZSBzb21lZGF5IChCQikgKi8KK0dMT0JBTF9FWFRFUk4gYXRvbWljX3QgYnVmQWxsb2NDb3VudDsKK0dMT0JBTF9FWFRFUk4gYXRvbWljX3Qgc21CdWZBbGxvY0NvdW50OyAgICAgIAorR0xPQkFMX0VYVEVSTiBhdG9taWNfdCBtaWRDb3VudDsKKworLyogTWlzYyBnbG9iYWxzICovCitHTE9CQUxfRVhURVJOIHVuc2lnbmVkIGludCBtdWx0aXVzZXJfbW91bnQ7CS8qIGlmIGVuYWJsZWQgYWxsb3dzIG5ldyBzZXNzaW9ucworCQkJCXRvIGJlIGVzdGFibGlzaGVkIG9uIGV4aXN0aW5nIG1vdW50IGlmIHdlCisJCQkJaGF2ZSB0aGUgdWlkL3Bhc3N3b3JkIG9yIEtlcmJlcm9zIGNyZWRlbnRpYWwgCisJCQkJb3IgZXF1aXZhbGVudCBmb3IgY3VycmVudCB1c2VyICovCitHTE9CQUxfRVhURVJOIHVuc2lnbmVkIGludCBvcGxvY2tFbmFibGVkOworR0xPQkFMX0VYVEVSTiB1bnNpZ25lZCBpbnQgZXhwZXJpbUVuYWJsZWQ7CitHTE9CQUxfRVhURVJOIHVuc2lnbmVkIGludCBsb29rdXBDYWNoZUVuYWJsZWQ7CitHTE9CQUxfRVhURVJOIHVuc2lnbmVkIGludCBleHRlbmRlZF9zZWN1cml0eTsJLyogaWYgb24sIHNlc3Npb24gc2V0dXAgc2VudCAKKwkJCQl3aXRoIG1vcmUgc2VjdXJlIG50bG1zc3AyIGNoYWxsZW5nZS9yZXNwICovCitHTE9CQUxfRVhURVJOIHVuc2lnbmVkIGludCBudGxtdjJfc3VwcG9ydDsgIC8qIGJldHRlciBvcHRpb25hbCBwYXNzd29yZCBoYXNoICovCitHTE9CQUxfRVhURVJOIHVuc2lnbmVkIGludCBzaWduX0NJRlNfUERVczsgIC8qIGVuYWJsZSBzbWIgcGFja2V0IHNpZ25pbmcgKi8KK0dMT0JBTF9FWFRFUk4gdW5zaWduZWQgaW50IGxpbnV4RXh0RW5hYmxlZDsvKmVuYWJsZSBMaW51eC9Vbml4IENJRlMgZXh0ZW5zaW9ucyovCitHTE9CQUxfRVhURVJOIHVuc2lnbmVkIGludCBDSUZTTWF4QnVmU2l6ZTsgIC8qIG1heCBzaXplIG5vdCBpbmNsdWRpbmcgaGRyICovCitHTE9CQUxfRVhURVJOIHVuc2lnbmVkIGludCBjaWZzX21pbl9yY3Y7ICAgIC8qIG1pbiBzaXplIG9mIGJpZyBudHdyayBidWYgcG9vbCAqLworR0xPQkFMX0VYVEVSTiB1bnNpZ25lZCBpbnQgY2lmc19taW5fc21hbGw7ICAvKiBtaW4gc2l6ZSBvZiBzbWFsbCBidWYgcG9vbCAqLworR0xPQkFMX0VYVEVSTiB1bnNpZ25lZCBpbnQgY2lmc19tYXhfcGVuZGluZzsgLyogTUFYIHJlcXVlc3RzIGF0IG9uY2UgdG8gc2VydmVyKi8KKwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzcGR1LmggYi9mcy9jaWZzL2NpZnNwZHUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2Q0YTYxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9jaWZzcGR1LmgKQEAgLTAsMCArMSwxOTg3IEBACisvKgorICogICBmcy9jaWZzL2NpZnNwZHUuaAorICoKKyAqICAgQ29weXJpZ2h0IChjKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzICBDb3JwLiwgMjAwMgorICogICBBdXRob3Iocyk6IFN0ZXZlIEZyZW5jaCAoc2ZyZW5jaEB1cy5pYm0uY29tKQorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBIAorICovCisKKyNpZm5kZWYgX0NJRlNQRFVfSAorI2RlZmluZSBfQ0lGU1BEVV9ICisKKyNpbmNsdWRlIDxuZXQvc29jay5oPgorCisjZGVmaW5lIENJRlNfUFJPVCAgIDAKKyNkZWZpbmUgQkFEX1BST1QgICAgQ0lGU19QUk9UKzEKKworLyogU01CIGNvbW1hbmQgY29kZXMgKi8KKy8qIFNvbWUgY29tbWFuZHMgaGF2ZSBtaW5pbWFsICh3Y3Q9MCxiY2M9MCksIG9yIHVuaW50ZXJlc3RpbmcsIHJlc3BvbnNlcworIChpZSB3aGljaCBpbmNsdWRlIG5vIHVzZWZ1bCBkYXRhIG90aGVyIHRoYW4gdGhlIFNNQiBlcnJvciBjb2RlIGl0c2VsZikuCisgS25vd2luZyB0aGlzIGhlbHBzIGF2b2lkIHJlc3BvbnNlIGJ1ZmZlciBhbGxvY2F0aW9ucyBhbmQgY29weSBpbiBzb21lIGNhc2VzICovCisjZGVmaW5lIFNNQl9DT01fQ1JFQVRFX0RJUkVDVE9SWSAgICAgIDB4MDAgLyogdHJpdmlhbCByZXNwb25zZSAqLworI2RlZmluZSBTTUJfQ09NX0RFTEVURV9ESVJFQ1RPUlkgICAgICAweDAxIC8qIHRyaXZpYWwgcmVzcG9uc2UgKi8KKyNkZWZpbmUgU01CX0NPTV9DTE9TRSAgICAgICAgICAgICAgICAgMHgwNCAvKiB0cml2IHJlcS9yc3AsIHRpbWVzdGFtcCBpZ25vcmVkICovCisjZGVmaW5lIFNNQl9DT01fREVMRVRFICAgICAgICAgICAgICAgIDB4MDYgLyogdHJpdmlhbCByZXNwb25zZSAqLworI2RlZmluZSBTTUJfQ09NX1JFTkFNRSAgICAgICAgICAgICAgICAweDA3IC8qIHRyaXZpYWwgcmVzcG9uc2UgKi8KKyNkZWZpbmUgU01CX0NPTV9TRVRBVFRSICAgICAgICAgICAgICAgMHgwOSAvKiB0cml2aWFsIHJlc3BvbnNlICovCisjZGVmaW5lIFNNQl9DT01fTE9DS0lOR19BTkRYICAgICAgICAgIDB4MjQgLyogdHJpdmlhbCByZXNwb25zZSAqLworI2RlZmluZSBTTUJfQ09NX0NPUFkgICAgICAgICAgICAgICAgICAweDI5IC8qIHRyaXZpYWwgcnNwLCBmYWlsIGZpbGVuYW1lIGlnbnJkKi8KKyNkZWZpbmUgU01CX0NPTV9SRUFEX0FORFggICAgICAgICAgICAgMHgyRQorI2RlZmluZSBTTUJfQ09NX1dSSVRFX0FORFggICAgICAgICAgICAweDJGCisjZGVmaW5lIFNNQl9DT01fVFJBTlNBQ1RJT04yICAgICAgICAgIDB4MzIKKyNkZWZpbmUgU01CX0NPTV9UUkFOU0FDVElPTjJfU0VDT05EQVJZIDB4MzMKKyNkZWZpbmUgU01CX0NPTV9GSU5EX0NMT1NFMiAgICAgICAgICAgMHgzNCAvKiB0cml2aWFsIHJlc3BvbnNlICovCisjZGVmaW5lIFNNQl9DT01fVFJFRV9ESVNDT05ORUNUICAgICAgIDB4NzEgLyogdHJpdmlhbCByZXNwb25zZSAqLworI2RlZmluZSBTTUJfQ09NX05FR09USUFURSAgICAgICAgICAgICAweDcyCisjZGVmaW5lIFNNQl9DT01fU0VTU0lPTl9TRVRVUF9BTkRYICAgIDB4NzMKKyNkZWZpbmUgU01CX0NPTV9MT0dPRkZfQU5EWCAgICAgICAgICAgMHg3NCAvKiB0cml2aWFsIHJlc3BvbnNlICovCisjZGVmaW5lIFNNQl9DT01fVFJFRV9DT05ORUNUX0FORFggICAgIDB4NzUKKyNkZWZpbmUgU01CX0NPTV9OVF9UUkFOU0FDVCAgICAgICAgICAgMHhBMAorI2RlZmluZSBTTUJfQ09NX05UX1RSQU5TQUNUX1NFQ09OREFSWSAweEExCisjZGVmaW5lIFNNQl9DT01fTlRfQ1JFQVRFX0FORFggICAgICAgIDB4QTIKKyNkZWZpbmUgU01CX0NPTV9OVF9SRU5BTUUgICAgICAgICAgICAgMHhBNSAvKiB0cml2aWFsIHJlc3BvbnNlICovCisKKy8qIFRyYW5zYWN0MiBzdWJjb21tYW5kIGNvZGVzICovCisjZGVmaW5lIFRSQU5TMl9PUEVOICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgVFJBTlMyX0ZJTkRfRklSU1QgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBUUkFOUzJfRklORF9ORVhUICAgICAgICAgICAgICAweDAyCisjZGVmaW5lIFRSQU5TMl9RVUVSWV9GU19JTkZPUk1BVElPTiAgIDB4MDMKKyNkZWZpbmUgVFJBTlMyX1FVRVJZX1BBVEhfSU5GT1JNQVRJT04gMHgwNQorI2RlZmluZSBUUkFOUzJfU0VUX1BBVEhfSU5GT1JNQVRJT04gICAweDA2CisjZGVmaW5lIFRSQU5TMl9RVUVSWV9GSUxFX0lORk9STUFUSU9OIDB4MDcKKyNkZWZpbmUgVFJBTlMyX1NFVF9GSUxFX0lORk9STUFUSU9OICAgMHgwOAorI2RlZmluZSBUUkFOUzJfR0VUX0RGU19SRUZFUlJBTCAgICAgICAweDEwCisjZGVmaW5lIFRSQU5TMl9SRVBPUlRfREZTX0lOQ09TSVNURU5DWSAweDExCisKKy8qIE5UIFRyYW5zYWN0IHN1YmNvbW1hbmQgY29kZXMgKi8KKyNkZWZpbmUgTlRfVFJBTlNBQ1RfQ1JFQVRFICAgICAgICAgICAgMHgwMQorI2RlZmluZSBOVF9UUkFOU0FDVF9JT0NUTCAgICAgICAgICAgICAweDAyCisjZGVmaW5lIE5UX1RSQU5TQUNUX1NFVF9TRUNVUklUWV9ERVNDIDB4MDMKKyNkZWZpbmUgTlRfVFJBTlNBQ1RfTk9USUZZX0NIQU5HRSAgICAgMHgwNAorI2RlZmluZSBOVF9UUkFOU0FDVF9SRU5BTUUgICAgICAgICAgICAweDA1CisjZGVmaW5lIE5UX1RSQU5TQUNUX1FVRVJZX1NFQ1VSSVRZX0RFU0MgMHgwNgorI2RlZmluZSBOVF9UUkFOU0FDVF9HRVRfVVNFUl9RVU9UQSAgICAweDA3CisjZGVmaW5lIE5UX1RSQU5TQUNUX1NFVF9VU0VSX1FVT1RBICAgIDB4MDgKKworI2RlZmluZSBNQVhfQ0lGU19IRFJfU0laRSAyNTYJLyogY2hhaW5lZCBOVENyZWF0ZVhSZWFkWCB3aWxsIHByb2JhYmx5IGJlIGJpZ2dlc3QgKi8KKworLyogaW50ZXJuYWwgY2lmcyB2ZnMgc3RydWN0dXJlcyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBbGwgY29uc3RhbnRzIGdvIGhlcmUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qCisgKiBTdGFydGluZyB2YWx1ZSBmb3IgbWF4aW11bSBTTUIgc2l6ZSBuZWdvdGlhdGlvbgorICovCisjZGVmaW5lIENJRlNfTUFYX01TR1NJWkUgKDQqNDA5NikKKworLyoKKyAqIFNpemUgb2YgZW5jcnlwdGVkIHVzZXIgcGFzc3dvcmQgaW4gYnl0ZXMKKyAqLworI2RlZmluZSBDSUZTX0VOQ1BXRF9TSVpFICgxNikKKworLyoKKyAqIFNpemUgb2YgdGhlIGNyeXB0byBrZXkgcmV0dXJuZWQgb24gdGhlIG5lZ290aWF0ZSBTTUIgaW4gYnl0ZXMKKyAqLworI2RlZmluZSBDSUZTX0NSWVBUT19LRVlfU0laRSAoOCkKKworLyoKKyAqIFNpemUgb2YgdGhlIHNlc3Npb24ga2V5IChjcnlwdG8ga2V5IGVuY3J5cHRlZCB3aXRoIHRoZSBwYXNzd29yZAorICovCisjZGVmaW5lIENJRlNfU0VTU0lPTl9LRVlfU0laRSAoMjQpCisKKy8qCisgKiBNYXhpbXVtIHVzZXIgbmFtZSBsZW5ndGgKKyAqLworI2RlZmluZSBDSUZTX1VOTEVOICgyMCkKKworLyoKKyAqIEZsYWdzIG9uIFNNQiBvcGVuCisgKi8KKyNkZWZpbmUgU01CT1BFTl9XUklURV9USFJPVUdIIDB4NDAwMAorI2RlZmluZSBTTUJPUEVOX0RFTllfQUxMICAgICAgMHgwMDEwCisjZGVmaW5lIFNNQk9QRU5fREVOWV9XUklURSAgICAweDAwMjAKKyNkZWZpbmUgU01CT1BFTl9ERU5ZX1JFQUQgICAgIDB4MDAzMAorI2RlZmluZSBTTUJPUEVOX0RFTllfTk9ORSAgICAgMHgwMDQwCisjZGVmaW5lIFNNQk9QRU5fUkVBRCAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgU01CT1BFTl9XUklURSAgICAgICAgIDB4MDAwMQorI2RlZmluZSBTTUJPUEVOX1JFQURXUklURSAgICAgMHgwMDAyCisjZGVmaW5lIFNNQk9QRU5fRVhFQ1VURSAgICAgICAweDAwMDMKKworI2RlZmluZSBTTUJPUEVOX09DUkVBVEUgICAgICAgMHgwMDEwCisjZGVmaW5lIFNNQk9QRU5fT1RSVU5DICAgICAgICAweDAwMDIKKyNkZWZpbmUgU01CT1BFTl9PQVBQRU5EICAgICAgIDB4MDAwMQorCisvKgorICogU01CIGZsYWcgZGVmaW5pdGlvbnMgCisgKi8KKyNkZWZpbmUgU01CRkxHX0VYVERfTE9DSyAweDAxCS8qIHNlcnZlciBzdXBwb3J0cyBsb2NrLXJlYWQgd3JpdGUtdW5sb2NrIHByaW1pdGl2ZXMgKi8KKyNkZWZpbmUgU01CRkxHX1JDVl9QT1NURUQgMHgwMgkvKiBvYnNvbGV0ZSAqLworI2RlZmluZSBTTUJGTEdfUlNWRCAweDA0CisjZGVmaW5lIFNNQkZMR19DQVNFTEVTUyAweDA4CS8qIGFsbCBwYXRobmFtZXMgdHJlYXRlZCBhcyBjYXNlbGVzcyAob2ZmIGltcGxpZXMgY2FzZSBzZW5zaXRpdmUgZmlsZSBoYW5kbGluZyByZXF1ZXN0ZWQpICovCisjZGVmaW5lIFNNQkZMR19DQU5PTklDQUxfUEFUSF9GT1JNQVQgMHgxMAkvKiBvYnNvbGV0ZSAqLworI2RlZmluZSBTTUJGTEdfT0xEX09QTE9DSyAweDIwCS8qIG9ic29sZXRlICovCisjZGVmaW5lIFNNQkZMR19PTERfT1BMT0NLX05PVElGWSAweDQwCS8qIG9ic29sZXRlICovCisjZGVmaW5lIFNNQkZMR19SRVNQT05TRSAweDgwCS8qIHRoaXMgUERVIGlzIGEgcmVzcG9uc2UgZnJvbSBzZXJ2ZXIgKi8KKworLyoKKyAqIFNNQiBmbGFnMiBkZWZpbml0aW9ucyAKKyAqLworI2RlZmluZSBTTUJGTEcyX0tOT1dTX0xPTkdfTkFNRVMgY3B1X3RvX2xlMTYoMSkJLyogY2FuIHNlbmQgbG9uZyAobm9uLTguMykgcGF0aCBuYW1lcyBpbiByZXNwb25zZSAqLworI2RlZmluZSBTTUJGTEcyX0tOT1dTX0VBUyBjcHVfdG9fbGUxNigyKQorI2RlZmluZSBTTUJGTEcyX1NFQ1VSSVRZX1NJR05BVFVSRSBjcHVfdG9fbGUxNig0KQorI2RlZmluZSBTTUJGTEcyX0lTX0xPTkdfTkFNRSBjcHVfdG9fbGUxNigweDQwKQorI2RlZmluZSBTTUJGTEcyX0VYVF9TRUMgY3B1X3RvX2xlMTYoMHg4MDApCisjZGVmaW5lIFNNQkZMRzJfREZTIGNwdV90b19sZTE2KDB4MTAwMCkKKyNkZWZpbmUgU01CRkxHMl9QQUdJTkdfSU8gY3B1X3RvX2xlMTYoMHgyMDAwKQorI2RlZmluZSBTTUJGTEcyX0VSUl9TVEFUVVMgY3B1X3RvX2xlMTYoMHg0MDAwKQorI2RlZmluZSBTTUJGTEcyX1VOSUNPREUgY3B1X3RvX2xlMTYoMHg4MDAwKQorCisvKgorICogVGhlc2UgYXJlIHRoZSBmaWxlIGFjY2VzcyBwZXJtaXNzaW9uIGJpdHMgZGVmaW5lZCBpbiBDSUZTIGZvciB0aGUKKyAqIE5UQ3JlYXRlQW5kWCBhcyB3ZWxsIGFzIHRoZSBsZXZlbCAweDEwNworICogVFJBTlMyX1FVRVJZX1BBVEhfSU5GT1JNQVRJT04gQVBJLiAgVGhlIGxldmVsIDB4MTA3LCBTTUJfUVVFUllfRklMRV9BTExfSU5GTworICogcmVzcG9uZHMgd2l0aCB0aGUgQWNjZXNzRmxhZ3MuCisgKiBUaGUgQWNjZXNzRmxhZ3Mgc3BlY2lmaWVzIHRoZSBhY2Nlc3MgcGVybWlzc2lvbnMgYSBjYWxsZXIgaGFzIHRvIHRoZQorICogZmlsZSBhbmQgY2FuIGhhdmUgYW55IHN1aXRhYmxlIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICovCisKKyNkZWZpbmUgRklMRV9SRUFEX0RBVEEgICAgICAgIDB4MDAwMDAwMDEJLyogRGF0YSBjYW4gYmUgcmVhZCBmcm9tIHRoZSBmaWxlICAgKi8KKyNkZWZpbmUgRklMRV9XUklURV9EQVRBICAgICAgIDB4MDAwMDAwMDIJLyogRGF0YSBjYW4gYmUgd3JpdHRlbiB0byB0aGUgZmlsZSAgKi8KKyNkZWZpbmUgRklMRV9BUFBFTkRfREFUQSAgICAgIDB4MDAwMDAwMDQJLyogRGF0YSBjYW4gYmUgYXBwZW5kZWQgdG8gdGhlIGZpbGUgKi8KKyNkZWZpbmUgRklMRV9SRUFEX0VBICAgICAgICAgIDB4MDAwMDAwMDgJLyogRXh0ZW5kZWQgYXR0cmlidXRlcyBhc3NvY2lhdGVkICAgKi8KKwkJCQkJIC8qIHdpdGggdGhlIGZpbGUgY2FuIGJlIHJlYWQgICAgICAgICovCisjZGVmaW5lIEZJTEVfV1JJVEVfRUEgICAgICAgICAweDAwMDAwMDEwCS8qIEV4dGVuZGVkIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCAgICovCisJCQkJCSAvKiB3aXRoIHRoZSBmaWxlIGNhbiBiZSB3cml0dGVuICAgICAqLworI2RlZmluZSBGSUxFX0VYRUNVVEUgICAgICAgICAgMHgwMDAwMDAyMAkvKkRhdGEgY2FuIGJlIHJlYWQgaW50byBtZW1vcnkgZnJvbSAqLworCQkJCQkgLyogdGhlIGZpbGUgdXNpbmcgc3lzdGVtIHBhZ2luZyBJL08gKi8KKyNkZWZpbmUgRklMRV9ERUxFVEVfQ0hJTEQgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgRklMRV9SRUFEX0FUVFJJQlVURVMgIDB4MDAwMDAwODAJLyogQXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggdGhlICAgKi8KKwkJCQkJIC8qIGZpbGUgY2FuIGJlIHJlYWQgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZJTEVfV1JJVEVfQVRUUklCVVRFUyAweDAwMDAwMTAwCS8qIEF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSAgICovCisJCQkJCSAvKiBmaWxlIGNhbiBiZSB3cml0dGVuICAgICAgICAgICAgICAqLworI2RlZmluZSBERUxFVEUgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAkvKiBUaGUgZmlsZSBjYW4gYmUgZGVsZXRlZCAgICAgICAgICAqLworI2RlZmluZSBSRUFEX0NPTlRST0wgICAgICAgICAgMHgwMDAyMDAwMAkvKiBUaGUgYWNjZXNzIGNvbnRyb2wgbGlzdCBhbmQgICAgICAqLworCQkJCQkgLyogb3duZXJzaGlwIGFzc29jaWF0ZWQgd2l0aCB0aGUgICAgKi8KKwkJCQkJIC8qIGZpbGUgY2FuIGJlIHJlYWQgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFdSSVRFX0RBQyAgICAgICAgICAgICAweDAwMDQwMDAwCS8qIFRoZSBhY2Nlc3MgY29udHJvbCBsaXN0IGFuZCAgICAgICovCisJCQkJCSAvKiBvd25lcnNoaXAgYXNzb2NpYXRlZCB3aXRoIHRoZSAgICAqLworCQkJCQkgLyogZmlsZSBjYW4gYmUgd3JpdHRlbi4gICAgICAgICAgICAgKi8KKyNkZWZpbmUgV1JJVEVfT1dORVIgICAgICAgICAgIDB4MDAwODAwMDAJLyogT3duZXJzaGlwIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgKi8KKwkJCQkJIC8qIHdpdGggdGhlIGZpbGUgY2FuIGJlIHdyaXR0ZW4gICAgICovCisjZGVmaW5lIFNZTkNIUk9OSVpFICAgICAgICAgICAweDAwMTAwMDAwCS8qIFRoZSBmaWxlIGhhbmRsZSBjYW4gd2FpdGVkIG9uIHRvICovCisJCQkJCSAvKiBzeW5jaHJvbml6ZSB3aXRoIHRoZSBjb21wbGV0aW9uICAqLworCQkJCQkgLyogb2YgYW4gaW5wdXQvb3V0cHV0IHJlcXVlc3QgICAgICAgKi8KKyNkZWZpbmUgR0VORVJJQ19BTEwgICAgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgR0VORVJJQ19FWEVDVVRFICAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgR0VORVJJQ19XUklURSAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgR0VORVJJQ19SRUFEICAgICAgICAgIDB4ODAwMDAwMDAKKwkJCQkJIC8qIEluIHN1bW1hcnkgLSBSZWxldmFudCBmaWxlICAgICAgICovCisJCQkJCSAvKiBhY2Nlc3MgZmxhZ3MgZnJvbSBDSUZTIGFyZSAgICAgICAqLworCQkJCQkgLyogZmlsZV9yZWFkX2RhdGEsIGZpbGVfd3JpdGVfZGF0YSAgKi8KKwkJCQkJIC8qIGZpbGVfZXhlY3V0ZSwgZmlsZV9yZWFkX2F0dHJpYnV0ZXMgKi8KKwkJCQkJIC8qIHdyaXRlX2RhYywgYW5kIGRlbGV0ZS4gICAgICAgICAgICovCisKKy8qCisgKiBJbnZhbGlkIHJlYWRkaXIgaGFuZGxlCisgKi8KKyNkZWZpbmUgQ0lGU19OT19IQU5ETEUgICAgICAgIDB4RkZGRgorCisvKiBJUEMkIGluIEFTQ0lJICovCisjZGVmaW5lIENJRlNfSVBDX1JFU09VUkNFICJceDQ5XHg1MFx4NDNceDI0IgorCisvKiBJUEMkIGluIFVuaWNvZGUgKi8KKyNkZWZpbmUgQ0lGU19JUENfVU5JQ09ERV9SRVNPVVJDRSAiXHgwMFx4NDlceDAwXHg1MFx4MDBceDQzXHgwMFx4MjRceDAwXHgwMCIKKworLyogVW5pY29kZSBOdWxsIHRlcm1pbmF0ZSAyIGJ5dGVzIG9mIDAgKi8KKyNkZWZpbmUgVU5JQ09ERV9OVUxMICJceDAwXHgwMCIKKyNkZWZpbmUgQVNDSUlfTlVMTCAweDAwCisKKy8qCisgKiBTZXJ2ZXIgdHlwZSB2YWx1ZXMgKHJldHVybmVkIG9uIEVudW1TZXJ2ZXIgQVBJCisgKi8KKyNkZWZpbmUgQ0lGU19TVl9UWVBFX0RDICAgICAweDAwMDAwMDA4CisjZGVmaW5lIENJRlNfU1ZfVFlQRV9CQUNLREMgMHgwMDAwMDAxMAorCisvKgorICogQWxpYXMgdHlwZSBmbGFncyAoRnJvbSBFbnVtQWxpYXMgQVBJIGNhbGwKKyAqLworI2RlZmluZSBDSUZTX0FMSUFTX1RZUEVfRklMRSAweDAwMDEKKyNkZWZpbmUgQ0lGU19TSEFSRV9UWVBFX0ZJTEUgMHgwMDAwCisKKy8qCisgKiBGaWxlIEF0dHJpYnV0ZSBmbGFncworICovCisjZGVmaW5lIEFUVFJfUkVBRE9OTFkgIDB4MDAwMQorI2RlZmluZSBBVFRSX0hJRERFTiAgICAweDAwMDIKKyNkZWZpbmUgQVRUUl9TWVNURU0gICAgMHgwMDA0CisjZGVmaW5lIEFUVFJfVk9MVU1FICAgIDB4MDAwOAorI2RlZmluZSBBVFRSX0RJUkVDVE9SWSAweDAwMTAKKyNkZWZpbmUgQVRUUl9BUkNISVZFICAgMHgwMDIwCisjZGVmaW5lIEFUVFJfREVWSUNFICAgIDB4MDA0MAorI2RlZmluZSBBVFRSX05PUk1BTCAgICAweDAwODAKKyNkZWZpbmUgQVRUUl9URU1QT1JBUlkgMHgwMTAwCisjZGVmaW5lIEFUVFJfU1BBUlNFICAgIDB4MDIwMAorI2RlZmluZSBBVFRSX1JFUEFSU0UgICAweDA0MDAKKyNkZWZpbmUgQVRUUl9DT01QUkVTU0VEIDB4MDgwMAorI2RlZmluZSBBVFRSX09GRkxJTkUgICAgMHgxMDAwCS8qIGllIGZpbGUgbm90IGltbWVkaWF0ZWx5IGF2YWlsYWJsZSAtIG9mZmxpbmUgc3RvcmFnZSAqLworI2RlZmluZSBBVFRSX05PVF9DT05URU5UX0lOREVYRUQgMHgyMDAwCisjZGVmaW5lIEFUVFJfRU5DUllQVEVEICAweDQwMDAKKyNkZWZpbmUgQVRUUl9QT1NJWF9TRU1BTlRJQ1MgMHgwMTAwMDAwMAorI2RlZmluZSBBVFRSX0JBQ0tVUF9TRU1BTlRJQ1MgMHgwMjAwMDAwMAorI2RlZmluZSBBVFRSX0RFTEVURV9PTl9DTE9TRSAweDA0MDAwMDAwCisjZGVmaW5lIEFUVFJfU0VRVUVOVElBTF9TQ0FOIDB4MDgwMDAwMDAKKyNkZWZpbmUgQVRUUl9SQU5ET01fQUNDRVNTICAgMHgxMDAwMDAwMAorI2RlZmluZSBBVFRSX05PX0JVRkZFUklORyAgICAweDIwMDAwMDAwCisjZGVmaW5lIEFUVFJfV1JJVEVfVEhST1VHSCAgIDB4ODAwMDAwMDAKKworLyogU2hhcmVBY2Nlc3MgZmxhZ3MgKi8KKyNkZWZpbmUgRklMRV9OT19TSEFSRSAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBGSUxFX1NIQVJFX1JFQUQgICAweDAwMDAwMDAxCisjZGVmaW5lIEZJTEVfU0hBUkVfV1JJVEUgIDB4MDAwMDAwMDIKKyNkZWZpbmUgRklMRV9TSEFSRV9ERUxFVEUgMHgwMDAwMDAwNAorI2RlZmluZSBGSUxFX1NIQVJFX0FMTCAgICAweDAwMDAwMDA3CisKKy8qIENyZWF0ZURpc3Bvc2l0aW9uIGZsYWdzICovCisjZGVmaW5lIEZJTEVfU1VQRVJTRURFICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgRklMRV9PUEVOICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBGSUxFX0NSRUFURSAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEZJTEVfT1BFTl9JRiAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgRklMRV9PVkVSV1JJVEUgICAgMHgwMDAwMDAwNAorI2RlZmluZSBGSUxFX09WRVJXUklURV9JRiAweDAwMDAwMDA1CisKKy8qIENyZWF0ZU9wdGlvbnMgKi8KKyNkZWZpbmUgQ1JFQVRFX05PVF9GSUxFCQkweDAwMDAwMDAxCS8qIGlmIHNldCBtdXN0IG5vdCBiZSBmaWxlICovCisjZGVmaW5lIENSRUFURV9XUklURV9USFJPVUdICTB4MDAwMDAwMDIKKyNkZWZpbmUgQ1JFQVRFX05PVF9ESVIJCTB4MDAwMDAwNDAJLyogaWYgc2V0IG11c3Qgbm90IGJlIGRpcmVjdG9yeSAqLworI2RlZmluZSBDUkVBVEVfUkFORE9NX0FDQ0VTUwkweDAwMDAwODAwCisjZGVmaW5lIENSRUFURV9ERUxFVEVfT05fQ0xPU0UJMHgwMDAwMTAwMAorI2RlZmluZSBPUEVOX1JFUEFSU0VfUE9JTlQJMHgwMDIwMDAwMAorCisvKiBJbXBlcnNvbmF0aW9uTGV2ZWwgZmxhZ3MgKi8KKyNkZWZpbmUgU0VDVVJJVFlfQU5PTllNT1VTICAgICAgMAorI2RlZmluZSBTRUNVUklUWV9JREVOVElGSUNBVElPTiAxCisjZGVmaW5lIFNFQ1VSSVRZX0lNUEVSU09OQVRJT04gIDIKKyNkZWZpbmUgU0VDVVJJVFlfREVMRUdBVElPTiAgICAgMworCisvKiBTZWN1cml0eUZsYWdzICovCisjZGVmaW5lIFNFQ1VSSVRZX0NPTlRFWFRfVFJBQ0tJTkcgMHgwMQorI2RlZmluZSBTRUNVUklUWV9FRkZFQ1RJVkVfT05MWSAgIDB4MDIKKworLyoKKyAqIERlZmF1bHQgUElEIHZhbHVlLCB1c2VkIGluIGFsbCBTTUJzIHdoZXJlIHRoZSBQSUQgaXMgbm90IGltcG9ydGFudAorICovCisjZGVmaW5lIENJRlNfREZUX1BJRCAgMHgxMjM0CisKKy8qCisgKiBXZSB1c2UgdGhlIHNhbWUgcm91dGluZSBmb3IgQ29weSBhbmQgTW92ZSBTTUJzLiAgVGhpcyBmbGFnIGlzIHVzZWQgdG8KKyAqIGRpc3Rpbmd1aXNoCisgKi8KKyNkZWZpbmUgQ0lGU19DT1BZX09QIDEKKyNkZWZpbmUgQ0lGU19SRU5BTUVfT1AgMgorCisjZGVmaW5lIEdFVFUxNih2YXIpICAoKigoX191MTYgKil2YXIpKQkvKiBCQiBjaGVjayBmb3IgZW5kaWFuIGlzc3VlcyAqLworI2RlZmluZSBHRVRVMzIodmFyKSAgKCooKF9fdTMyICopdmFyKSkJLyogQkIgY2hlY2sgZm9yIGVuZGlhbiBpc3N1ZXMgKi8KKworI3ByYWdtYSBwYWNrKDEpCisKK3N0cnVjdCBzbWJfaGRyIHsKKwlfX3UzMiBzbWJfYnVmX2xlbmd0aDsJLyogYmlnIGVuZGlhbiBvbiB3aXJlICovLyogQkIgbGVuZ3RoIGlzIG9ubHkgdHdvIG9yIHRocmVlIGJ5dGVzIC0gd2l0aCBvbmUgb3IgdHdvIGJ5dGUgdHlwZSBwcmVjZWRpbmcgaXQgYnV0IHRoYXQgaXMgYWx3YXlzIHplcm8gLSB3ZSBjb3VsZCBtYXNrIHRoZSB0eXBlIGJ5dGUgb2ZmIGp1c3QgaW4gY2FzZSBCQiAqLworCV9fdTggUHJvdG9jb2xbNF07CisJX191OCBDb21tYW5kOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTggRXJyb3JDbGFzczsKKwkJCV9fdTggUmVzZXJ2ZWQ7CisJCQlfX2xlMTYgRXJyb3I7CisJCX0gRG9zRXJyb3I7CisJCV9fbGUzMiBDaWZzRXJyb3I7CisJfSBTdGF0dXM7CisJX191OCBGbGFnczsKKwlfX2xlMTYgRmxhZ3MyOwkJLyogbm90ZTogbGUgKi8KKwlfX2xlMTYgUGlkSGlnaDsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX2xlMzIgU2VxdWVuY2VOdW1iZXI7ICAvKiBsZSAqLworCQkJX191MzIgUmVzZXJ2ZWQ7IC8qIHplcm8gKi8KKwkJfSBTZXF1ZW5jZTsKKwkJX191OCBTZWN1cml0eVNpZ25hdHVyZVs4XTsJLyogbGUgKi8KKwl9IFNpZ25hdHVyZTsKKwlfX3U4IHBhZFsyXTsKKwlfX3UxNiBUaWQ7CisJX19sZTE2IFBpZDsKKwlfX3UxNiBVaWQ7CisJX191MTYgTWlkOworCV9fdTggV29yZENvdW50OworfTsKKy8qIGdpdmVuIGEgcG9pbnRlciB0byBhbiBzbWJfaGRyIHJldHJpZXZlIHRoZSB2YWx1ZSBvZiBieXRlIGNvdW50ICovCisjZGVmaW5lIEJDQyhzbWJfdmFyKSAoICooX191MTYgKikoKGNoYXIgKilzbWJfdmFyICsgc2l6ZW9mKHN0cnVjdCBzbWJfaGRyKSArICgyKiBzbWJfdmFyLT5Xb3JkQ291bnQpICkgKQorCisvKiBnaXZlbiBhIHBvaW50ZXIgdG8gYW4gc21iX2hkciByZXRyaWV2ZSB0aGUgcG9pbnRlciB0byB0aGUgYnl0ZSBhcmVhICovCisjZGVmaW5lIHBCeXRlQXJlYShzbWJfdmFyKSAoKHVuc2lnbmVkIGNoYXIgKilzbWJfdmFyICsgc2l6ZW9mKHN0cnVjdCBzbWJfaGRyKSArICgyKiBzbWJfdmFyLT5Xb3JkQ291bnQpICsgMiApCisKKy8qCisgKiBDb21wdXRlciBOYW1lIExlbmd0aAorICovCisjZGVmaW5lIENOTEVOIDE1CisKKy8qCisgKiBTaGFyZSBOYW1lIExlbmd0aAkJCQkJICBAUzhBCisgKiBOb3RlOiAgVGhpcyBsZW5ndGggaXMgbGltaXRlZCBieSB0aGUgU01CIHVzZWQgdG8gZ2V0ICAgQFM4QQorICogICAgICAgIHRoZSBTaGFyZSBpbmZvLiAgIE5ldFNoYXJlRW51bSBvbmx5IHJldHVybnMgMTMgIEBTOEEKKyAqICAgICAgICBjaGFycywgaW5jbHVkaW5nIHRoZSBudWxsIHRlcm1pbmF0aW9uLiAgICAgICAgICBAUzhBIAorICovCisjZGVmaW5lIFNOTEVOIDEyCQkvKkBTOEEgKi8KKworLyoKKyAqIENvbW1lbnQgTGVuZ3RoCisgKi8KKyNkZWZpbmUgTUFYQ09NTUVOVExFTiA0MAorCisvKgorICogVGhlIE9TLzIgbWF4aW11bSBwYXRoIG5hbWUKKyAqLworI2RlZmluZSBNQVhfUEFUSENPTkYgMjU2CisKKy8qCisgKiAgU01CIGZyYW1lIGRlZmluaXRpb25zICAoZm9sbG93aW5nIG11c3QgYmUgcGFja2VkIHN0cnVjdHMpCisgKiAgU2VlIHRoZSBTTklBIENJRlMgU3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy4KKyAqCisgKiAgVGhlIE5hbWluZyBjb252ZW50aW9uIGlzIHRoZSBsb3dlciBjYXNlIHZlcnNpb24gb2YgdGhlCisgKiAgc21iIGNvbW1hbmQgY29kZSBuYW1lIGZvciB0aGUgc3RydWN0IGFuZCB0aGlzIGlzIHR5cGVkZWYgdG8gdGhlCisgKiAgdXBwZXJjYXNlIHZlcnNpb24gb2YgdGhlIHNhbWUgbmFtZSB3aXRoIHRoZSBwcmVmaXggU01CXyByZW1vdmVkIAorICogIGZvciBicmV2aXR5LiAgQWx0aG91Z2ggdHlwZWRlZnMgYXJlIG5vdCBjb21tb25seSB1c2VkIGZvciAKKyAqICBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgaW4gdGhlIExpbnV4IGtlcm5lbCwgdGhlaXIgdXNlIGluIHRoZQorICogIENJRlMgc3RhbmRhcmRzIGRvY3VtZW50LCB3aGljaCB0aGlzIGNvZGUgaXMgYmFzZWQgb24sIG1heQorICogIG1ha2UgdGhpcyBvbmUgb2YgdGhlIGNhc2VzIHdoZXJlIHR5cGVkZWZzIGZvciBzdHJ1Y3R1cmVzIG1ha2UKKyAqICBzZW5zZSB0byBpbXByb3ZlIHJlYWRhYmlsaXR5IGZvciByZWFkZXJzIG9mIHRoZSBzdGFuZGFyZHMgZG9jLgorICogIFR5cGVkZWZzIGNhbiBhbHdheXMgYmUgcmVtb3ZlZCBsYXRlciBpZiB0aGV5IGFyZSB0b28gZGlzdHJhY3RpbmcKKyAqICBhbmQgdGhleSBhcmUgb25seSB1c2VkIGZvciB0aGUgQ0lGU3MgUERVcyB0aGVtc2VsdmVzLCBub3QKKyAqICBpbnRlcm5hbCBjaWZzIHZmcyBzdHJ1Y3R1cmVzCisgKiAgCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgbmVnb3RpYXRlX3JlcSB7CisJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAwICovCisJX19sZTE2IEJ5dGVDb3VudDsKKwl1bnNpZ25lZCBjaGFyIERpYWxlY3RzQXJyYXlbMV07Cit9IE5FR09USUFURV9SRVE7CisKK3R5cGVkZWYgc3RydWN0IG5lZ290aWF0ZV9yc3AgeworCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gMTcgKi8KKwlfX2xlMTYgRGlhbGVjdEluZGV4OworCV9fdTggU2VjdXJpdHlNb2RlOworCV9fbGUxNiBNYXhNcHhDb3VudDsKKwlfX2xlMTYgTWF4TnVtYmVyVmNzOworCV9fbGUzMiBNYXhCdWZmZXJTaXplOworCV9fbGUzMiBNYXhSYXdTaXplOworCV9fbGUzMiBTZXNzaW9uS2V5OworCV9fbGUzMiBDYXBhYmlsaXRpZXM7CS8qIHNlZSBiZWxvdyAqLworCV9fbGUzMiBTeXN0ZW1UaW1lTG93OworCV9fbGUzMiBTeXN0ZW1UaW1lSGlnaDsKKwlfX2xlMTYgU2VydmVyVGltZVpvbmU7CisJX191OCBFbmNyeXB0aW9uS2V5TGVuZ3RoOworCV9fdTE2IEJ5dGVDb3VudDsKKwl1bmlvbiB7CisJCXVuc2lnbmVkIGNoYXIgRW5jcnlwdGlvbktleVsxXTsJLyogaWYgY2FwIGV4dGVuZGVkIHNlY3VyaXR5IGlzIG9mZiAqLworCQkvKiBmb2xsb3dlZCBieSBEb21haW4gbmFtZSAtIGlmIGV4dGVuZGVkIHNlY3VyaXR5IGlzIG9mZiAqLworCQkvKiBmb2xsb3dlZCBieSAxNiBieXRlcyBvZiBzZXJ2ZXIgR1VJRCAqLworCQkvKiBmb2xsb3dlZCBieSBzZWN1cml0eSBibG9iIGlmIGNhcF9leHRlbmRlZF9zZWN1cml0eSBuZWdvdGlhdGVkICovCisJCXN0cnVjdCB7CisJCQl1bnNpZ25lZCBjaGFyIEdVSURbMTZdOworCQkJdW5zaWduZWQgY2hhciBTZWN1cml0eUJsb2JbMV07CisJCX0gZXh0ZW5kZWRfcmVzcG9uc2U7CisJfSB1OworfSBORUdPVElBVEVfUlNQOworCisvKiBTZWN1cml0eU1vZGUgYml0cyAqLworI2RlZmluZSBTRUNNT0RFX1VTRVIgICAgICAgICAgMHgwMQkvKiBvZmYgaW5kaWNhdGVzIHNoYXJlIGxldmVsIHNlY3VyaXR5ICovCisjZGVmaW5lIFNFQ01PREVfUFdfRU5DUllQVCAgICAweDAyCisjZGVmaW5lIFNFQ01PREVfU0lHTl9FTkFCTEVEICAweDA0CS8qIFNNQiBzZWN1cml0eSBzaWduYXR1cmVzIGVuYWJsZWQgKi8KKyNkZWZpbmUgU0VDTU9ERV9TSUdOX1JFUVVJUkVEIDB4MDgJLyogU01CIHNlY3VyaXR5IHNpZ25hdHVyZXMgcmVxdWlyZWQgKi8KKworLyogTmVnb3RpYXRlIHJlc3BvbnNlIENhcGFiaWxpdGllcyAqLworI2RlZmluZSBDQVBfUkFXX01PREUgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQ0FQX01QWF9NT0RFICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIENBUF9VTklDT0RFICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBDQVBfTEFSR0VfRklMRVMgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgQ0FQX05UX1NNQlMgICAgICAgICAgICAweDAwMDAwMDEwCS8qIGltcGxpZXMgQ0FQX05UX0ZJTkQgKi8KKyNkZWZpbmUgQ0FQX1JQQ19SRU1PVEVfQVBJUyAgICAweDAwMDAwMDIwCisjZGVmaW5lIENBUF9TVEFUVVMzMiAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBDQVBfTEVWRUxfSUlfT1BMT0NLUyAgIDB4MDAwMDAwODAKKyNkZWZpbmUgQ0FQX0xPQ0tfQU5EX1JFQUQgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIENBUF9OVF9GSU5EICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBDQVBfREZTICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgQ0FQX0lORk9MRVZFTF9QQVNTVEhSVSAweDAwMDAyMDAwCisjZGVmaW5lIENBUF9MQVJHRV9SRUFEX1ggICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBDQVBfTEFSR0VfV1JJVEVfWCAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgQ0FQX1VOSVggICAgICAgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIENBUF9SRVNFUlZFRCAgICAgICAgICAgMHgwMjAwMDAwMAorI2RlZmluZSBDQVBfQlVMS19UUkFOU0ZFUiAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgQ0FQX0NPTVBSRVNTRURfREFUQSAgICAweDQwMDAwMDAwCisjZGVmaW5lIENBUF9FWFRFTkRFRF9TRUNVUklUWSAgMHg4MDAwMDAwMAorCit0eXBlZGVmIHVuaW9uIHNtYl9jb21fc2Vzc2lvbl9zZXR1cF9hbmR4IHsKKwlzdHJ1Y3QgewkJLyogcmVxdWVzdCBmb3JtYXQgKi8KKwkJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAxMiAqLworCQlfX3U4IEFuZFhDb21tYW5kOworCQlfX3U4IEFuZFhSZXNlcnZlZDsKKwkJX19sZTE2IEFuZFhPZmZzZXQ7CisJCV9fbGUxNiBNYXhCdWZmZXJTaXplOworCQlfX2xlMTYgTWF4TXB4Q291bnQ7CisJCV9fbGUxNiBWY051bWJlcjsKKwkJX191MzIgU2Vzc2lvbktleTsKKwkJX19sZTE2IFNlY3VyaXR5QmxvYkxlbmd0aDsKKwkJX191MzIgUmVzZXJ2ZWQ7CisJCV9fbGUzMiBDYXBhYmlsaXRpZXM7CS8qIHNlZSBiZWxvdyAqLworCQlfX2xlMTYgQnl0ZUNvdW50OworCQl1bnNpZ25lZCBjaGFyIFNlY3VyaXR5QmxvYlsxXTsJLyogZm9sbG93ZWQgYnkgKi8KKwkJLyogU1RSSU5HIE5hdGl2ZU9TICovCisJCS8qIFNUUklORyBOYXRpdmVMYW5NYW4gKi8KKwl9IHJlcTsJCQkvKiBOVExNIHJlcXVlc3QgZm9ybWF0ICh3aXRoIGV4dGVuZGVkIHNlY3VyaXR5ICovCisKKwlzdHJ1Y3QgewkJLyogcmVxdWVzdCBmb3JtYXQgKi8KKwkJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAxMyAqLworCQlfX3U4IEFuZFhDb21tYW5kOworCQlfX3U4IEFuZFhSZXNlcnZlZDsKKwkJX19sZTE2IEFuZFhPZmZzZXQ7CisJCV9fbGUxNiBNYXhCdWZmZXJTaXplOworCQlfX2xlMTYgTWF4TXB4Q291bnQ7CisJCV9fbGUxNiBWY051bWJlcjsKKwkJX191MzIgU2Vzc2lvbktleTsKKwkJX19sZTE2IENhc2VJbnNlbnNpdGl2ZVBhc3N3b3JkTGVuZ3RoOwkvKiBBU0NJSSBwYXNzd29yZCBsZW5ndGggKi8KKwkJX19sZTE2IENhc2VTZW5zaXRpdmVQYXNzd29yZExlbmd0aDsJLyogVW5pY29kZSBwYXNzd29yZCBsZW5ndGggKi8KKwkJX191MzIgUmVzZXJ2ZWQ7CS8qIHNlZSBiZWxvdyAqLworCQlfX2xlMzIgQ2FwYWJpbGl0aWVzOworCQlfX2xlMTYgQnl0ZUNvdW50OworCQl1bnNpZ25lZCBjaGFyIENhc2VJbnNlbnNpdGl2ZVBhc3N3b3JkWzFdOwkvKiBmb2xsb3dlZCBieTogKi8KKwkJLyogdW5zaWduZWQgY2hhciAqIENhc2VTZW5zaXRpdmVQYXNzd29yZDsgKi8KKwkJLyogU1RSSU5HIEFjY291bnROYW1lICovCisJCS8qIFNUUklORyBQcmltYXJ5RG9tYWluICovCisJCS8qIFNUUklORyBOYXRpdmVPUyAqLworCQkvKiBTVFJJTkcgTmF0aXZlTGFuTWFuICovCisJfSByZXFfbm9fc2VjZXh0OwkvKiBOVExNIHJlcXVlc3QgZm9ybWF0ICh3aXRob3V0IGV4dGVuZGVkIHNlY3VyaXR5ICovCisKKwlzdHJ1Y3QgewkJLyogZGVmYXVsdCAoTlRMTSkgcmVzcG9uc2UgZm9ybWF0ICovCisJCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gNCAqLworCQlfX3U4IEFuZFhDb21tYW5kOworCQlfX3U4IEFuZFhSZXNlcnZlZDsKKwkJX19sZTE2IEFuZFhPZmZzZXQ7CisJCV9fbGUxNiBBY3Rpb247CS8qIHNlZSBiZWxvdyAqLworCQlfX2xlMTYgU2VjdXJpdHlCbG9iTGVuZ3RoOworCQlfX3UxNiBCeXRlQ291bnQ7CisJCXVuc2lnbmVkIGNoYXIgU2VjdXJpdHlCbG9iWzFdOwkvKiBmb2xsb3dlZCBieSAqLworLyogICAgICB1bnNpZ25lZCBjaGFyICAqIE5hdGl2ZU9TOyAgICAgICovCisvKgl1bnNpZ25lZCBjaGFyICAqIE5hdGl2ZUxhbk1hbjsgICovCisvKiAgICAgIHVuc2lnbmVkIGNoYXIgICogUHJpbWFyeURvbWFpbjsgKi8KKwl9IHJlc3A7CQkJLyogTlRMTSByZXNwb25zZSBmb3JtYXQgKHdpdGggb3Igd2l0aG91dCBleHRlbmRlZCBzZWN1cml0eSAqLworCisJc3RydWN0IHsJCS8qIHJlcXVlc3QgZm9ybWF0ICovCisJCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gMTAgKi8KKwkJX191OCBBbmRYQ29tbWFuZDsKKwkJX191OCBBbmRYUmVzZXJ2ZWQ7CisJCV9fbGUxNiBBbmRYT2Zmc2V0OworCQlfX2xlMTYgTWF4QnVmZmVyU2l6ZTsKKwkJX19sZTE2IE1heE1weENvdW50OworCQlfX2xlMTYgVmNOdW1iZXI7CisJCV9fdTMyIFNlc3Npb25LZXk7CisJCV9fbGUxNiBQYXNzc3dvcmRMZW5ndGg7CisJCV9fdTMyIFJlc2VydmVkOworCQlfX2xlMTYgQnl0ZUNvdW50OworCQl1bnNpZ25lZCBjaGFyIEFjY291bnRQYXNzd29yZFsxXTsJLyogZm9sbG93ZWQgYnkgKi8KKwkJLyogU1RSSU5HIEFjY291bnROYW1lICovCisJCS8qIFNUUklORyBQcmltYXJ5RG9tYWluICovCisJCS8qIFNUUklORyBOYXRpdmVPUyAqLworCQkvKiBTVFJJTkcgTmF0aXZlTGFuTWFuICovCisJfSBvbGRfcmVxOwkJLyogcHJlLU5UTE0gKExBTk1BTjIuMSkgcmVxdWVzdCBmb3JtYXQgKi8KKworCXN0cnVjdCB7CQkvKiBkZWZhdWx0IChOVExNKSByZXNwb25zZSBmb3JtYXQgKi8KKwkJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAzICovCisJCV9fdTggQW5kWENvbW1hbmQ7CisJCV9fdTggQW5kWFJlc2VydmVkOworCQlfX2xlMTYgQW5kWE9mZnNldDsKKwkJX19sZTE2IEFjdGlvbjsJLyogc2VlIGJlbG93ICovCisJCV9fdTE2IEJ5dGVDb3VudDsKKwkJdW5zaWduZWQgY2hhciBOYXRpdmVPU1sxXTsJLyogZm9sbG93ZWQgYnkgKi8KKy8qCXVuc2lnbmVkIGNoYXIgKiBOYXRpdmVMYW5NYW47ICovCisvKiAgICAgIHVuc2lnbmVkIGNoYXIgKiBQcmltYXJ5RG9tYWluOyAqLworCX0gb2xkX3Jlc3A7CQkvKiBwcmUtTlRMTSAoTEFOTUFOMi4xKSByZXNwb25zZSBmb3JtYXQgKi8KK30gU0VTU0lPTl9TRVRVUF9BTkRYOworCisjZGVmaW5lIENJRlNfTkVUV09SS19PUFNZUyAiQ0lGUyBWRlMgQ2xpZW50IGZvciBMaW51eCIKKworLyogQ2FwYWJpbGl0aWVzIGJpdHMgKGZvciBOVExNIFNlc3NTZXR1cCByZXF1ZXN0KSAqLworI2RlZmluZSBDQVBfVU5JQ09ERSAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQ0FQX0xBUkdFX0ZJTEVTICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIENBUF9OVF9TTUJTICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBDQVBfU1RBVFVTMzIgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgQ0FQX0xFVkVMX0lJX09QTE9DS1MgICAweDAwMDAwMDgwCisjZGVmaW5lIENBUF9OVF9GSU5EICAgICAgICAgICAgMHgwMDAwMDIwMAkvKiByZXNlcnZlZCBzaG91bGQgYmUgemVybyAocHJlc3VtYWJseSBiZWNhdXNlIE5UX1NNQnMgaW1wbGllcyB0aGUgc2FtZSB0aGluZykgKi8KKyNkZWZpbmUgQ0FQX0JVTEtfVFJBTlNGRVIgICAgICAweDIwMDAwMDAwCisjZGVmaW5lIENBUF9FWFRFTkRFRF9TRUNVUklUWSAgMHg4MDAwMDAwMAorCisvKiBBY3Rpb24gYml0cyAqLworI2RlZmluZSBHVUVTVF9MT0dJTiAxCisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fdGNvbnhfcmVxIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDQgKi8KKwlfX3U4IEFuZFhDb21tYW5kOworCV9fdTggQW5kWFJlc2VydmVkOworCV9fbGUxNiBBbmRYT2Zmc2V0OworCV9fbGUxNiBGbGFnczsJCS8qIHNlZSBiZWxvdyAqLworCV9fbGUxNiBQYXNzd29yZExlbmd0aDsKKwlfX2xlMTYgQnl0ZUNvdW50OworCXVuc2lnbmVkIGNoYXIgUGFzc3dvcmRbMV07CS8qIGZvbGxvd2VkIGJ5ICovCisvKiBTVFJJTkcgUGF0aCAgICAqLy8qIFxcc2VydmVyXHNoYXJlIG5hbWUgKi8KKwkvKiBTVFJJTkcgU2VydmljZSAqLworfSBUQ09OWF9SRVE7CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fdGNvbnhfcnNwIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDMgKi8vKiBub3RlIHRoYXQgV2luMjAwMCBoYXMgc2VudCB3Y3Q9NyBpbiBzb21lIGNhc2VzIG9uIHJlc3BvbnNlcy4gRm91ciB1bnNwZWNpZmllZCB3b3JkcyBmb2xsb3dlZCBPcHRpb25hbFN1cHBvcnQgKi8KKwlfX3U4IEFuZFhDb21tYW5kOworCV9fdTggQW5kWFJlc2VydmVkOworCV9fbGUxNiBBbmRYT2Zmc2V0OworCV9fbGUxNiBPcHRpb25hbFN1cHBvcnQ7CS8qIHNlZSBiZWxvdyAqLworCV9fdTE2IEJ5dGVDb3VudDsKKwl1bnNpZ25lZCBjaGFyIFNlcnZpY2VbMV07CS8qIGFsd2F5cyBBU0NJSSwgbm90IFVuaWNvZGUgKi8KKwkvKiBTVFJJTkcgTmF0aXZlRmlsZVN5c3RlbSAqLworfSBUQ09OWF9SU1A7CisKKy8qIHRyZWUgY29ubmVjdCBGbGFncyAqLworI2RlZmluZSBESVNDT05ORUNUX1RJRCAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgVENPTl9FWFRFTkRFRF9TRUNJTkZPICAgMHgwMDA4CisvKiBPcHRpb25hbFN1cHBvcnQgYml0cyAqLworI2RlZmluZSBTTUJfU1VQUE9SVF9TRUFSQ0hfQklUUyAweDAwMDEJLyogbXVzdCBoYXZlIGJpdHMgKGV4Y2x1c2l2ZSBzZWFyY2hlcyBzdXBwdC4gKi8KKyNkZWZpbmUgU01CX1NIQVJFX0lTX0lOX0RGUyAgICAgMHgwMDAyCisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fbG9nb2ZmX2FuZHhfcmVxIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDIgKi8KKwlfX3U4IEFuZFhDb21tYW5kOworCV9fdTggQW5kWFJlc2VydmVkOworCV9fdTE2IEFuZFhPZmZzZXQ7CisJX191MTYgQnl0ZUNvdW50OworfSBMT0dPRkZfQU5EWF9SRVE7CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fbG9nb2ZmX2FuZHhfcnNwIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDIgKi8KKwlfX3U4IEFuZFhDb21tYW5kOworCV9fdTggQW5kWFJlc2VydmVkOworCV9fdTE2IEFuZFhPZmZzZXQ7CisJX191MTYgQnl0ZUNvdW50OworfSBMT0dPRkZfQU5EWF9SU1A7CisKK3R5cGVkZWYgdW5pb24gc21iX2NvbV90cmVlX2Rpc2Nvbm5lY3QgewkvKiBhcyBhbiBhbHRldG5hdGl2ZSBjYW4gdXNlIGZsYWcgb24gdHJlZV9jb25uZWN0IFBEVSB0byBlZmZlY3QgZGlzY29ubmVjdCAqLy8qIHByb2JhYmx5IHRoZSBzaW1wbGVzdCBTTUIgUERVICovCisJc3RydWN0IHsKKwkJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAwICovCisJCV9fdTE2IEJ5dGVDb3VudDsJLyogYmNjID0gMCAqLworCX0gcmVxOworCXN0cnVjdCB7CisJCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gMCAqLworCQlfX3UxNiBCeXRlQ291bnQ7CS8qIGJjYyA9IDAgKi8KKwl9IHJlc3A7Cit9IFRSRUVfRElTQ09OTkVDVDsKKwordHlwZWRlZiBzdHJ1Y3Qgc21iX2NvbV9jbG9zZV9yZXEgeworCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gMyAqLworCV9fdTE2IEZpbGVJRDsKKwlfX3UzMiBMYXN0V3JpdGVUaW1lOwkvKiBzaG91bGQgYmUgemVybyAqLworCV9fdTE2IEJ5dGVDb3VudDsJLyogMCAqLworfSBDTE9TRV9SRVE7CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fY2xvc2VfcnNwIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDAgKi8KKwlfX3UxNiBCeXRlQ291bnQ7CS8qIGJjdCA9IDAgKi8KK30gQ0xPU0VfUlNQOworCit0eXBlZGVmIHN0cnVjdCBzbWJfY29tX2ZpbmRjbG9zZV9yZXEgeworCXN0cnVjdCBzbWJfaGRyIGhkcjsgLyogd2N0ID0gMSAqLworCV9fdTE2IEZpbGVJRDsKKwlfX3UxNiBCeXRlQ291bnQ7ICAgIC8qIDAgKi8KK30gRklORENMT1NFX1JFUTsKKworLyogT3BlbkZsYWdzICovCisjZGVmaW5lIFJFUV9PUExPQ0sgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFJFUV9CQVRDSE9QTE9DSyAgICAweDAwMDAwMDA0CisjZGVmaW5lIFJFUV9PUEVORElST05MWSAgICAweDAwMDAwMDA4CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fb3Blbl9yZXEgewkvKiBhbHNvIGhhbmRsZXMgY3JlYXRlICovCisJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAyNCAqLworCV9fdTggQW5kWENvbW1hbmQ7CisJX191OCBBbmRYUmVzZXJ2ZWQ7CisJX19sZTE2IEFuZFhPZmZzZXQ7CisJX191OCBSZXNlcnZlZDsJCS8qIE11c3QgQmUgWmVybyAqLworCV9fbGUxNiBOYW1lTGVuZ3RoOworCV9fbGUzMiBPcGVuRmxhZ3M7CisJX19sZTMyIFJvb3REaXJlY3RvcnlGaWQ7CisJX19sZTMyIERlc2lyZWRBY2Nlc3M7CisJX19sZTY0IEFsbG9jYXRpb25TaXplOworCV9fbGUzMiBGaWxlQXR0cmlidXRlczsKKwlfX2xlMzIgU2hhcmVBY2Nlc3M7CisJX19sZTMyIENyZWF0ZURpc3Bvc2l0aW9uOworCV9fbGUzMiBDcmVhdGVPcHRpb25zOworCV9fbGUzMiBJbXBlcnNvbmF0aW9uTGV2ZWw7CisJX191OCBTZWN1cml0eUZsYWdzOworCV9fbGUxNiBCeXRlQ291bnQ7CisJY2hhciBmaWxlTmFtZVsxXTsKK30gT1BFTl9SRVE7CisKKy8qIG9wZW4gcmVzcG9uc2U6IG9wbG9jayBsZXZlbHMgKi8KKyNkZWZpbmUgT1BMT0NLX05PTkUgIAkgMAorI2RlZmluZSBPUExPQ0tfRVhDTFVTSVZFIDEKKyNkZWZpbmUgT1BMT0NLX0JBVENICSAyCisjZGVmaW5lIE9QTE9DS19SRUFECSAzICAvKiBsZXZlbCAyIG9wbG9jayAqLworCisvKiBvcGVuIHJlc3BvbnNlIGZvciBDcmVhdGVBY3Rpb24gc2hpZnRlZCBsZWZ0ICovCisjZGVmaW5lIENJRlNfQ1JFQVRFX0FDVElPTiAweDIwMDAwIC8qIGZpbGUgY3JlYXRlZCAqLworCit0eXBlZGVmIHN0cnVjdCBzbWJfY29tX29wZW5fcnNwIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDM0IEJCICovCisJX191OCBBbmRYQ29tbWFuZDsKKwlfX3U4IEFuZFhSZXNlcnZlZDsKKwlfX2xlMTYgQW5kWE9mZnNldDsKKwlfX3U4IE9wbG9ja0xldmVsOworCV9fdTE2IEZpZDsKKwlfX2xlMzIgQ3JlYXRlQWN0aW9uOworCV9fbGU2NCBDcmVhdGlvblRpbWU7CisJX19sZTY0IExhc3RBY2Nlc3NUaW1lOworCV9fbGU2NCBMYXN0V3JpdGVUaW1lOworCV9fbGU2NCBDaGFuZ2VUaW1lOworCV9fbGUzMiBGaWxlQXR0cmlidXRlczsKKwlfX2xlNjQgQWxsb2NhdGlvblNpemU7CisJX19sZTY0IEVuZE9mRmlsZTsKKwlfX2xlMTYgRmlsZVR5cGU7CisJX19sZTE2IERldmljZVN0YXRlOworCV9fdTggRGlyZWN0b3J5RmxhZzsKKwlfX3UxNiBCeXRlQ291bnQ7CS8qIGJjdCA9IDAgKi8KK30gT1BFTl9SU1A7CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fd3JpdGVfcmVxIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDE0ICovCisJX191OCBBbmRYQ29tbWFuZDsKKwlfX3U4IEFuZFhSZXNlcnZlZDsKKwlfX2xlMTYgQW5kWE9mZnNldDsKKwlfX3UxNiBGaWQ7CisJX19sZTMyIE9mZnNldExvdzsKKwlfX3UzMiBSZXNlcnZlZDsKKwlfX2xlMTYgV3JpdGVNb2RlOworCV9fbGUxNiBSZW1haW5pbmc7CisJX19sZTE2IERhdGFMZW5ndGhIaWdoOworCV9fbGUxNiBEYXRhTGVuZ3RoTG93OworCV9fbGUxNiBEYXRhT2Zmc2V0OworCV9fbGUzMiBPZmZzZXRIaWdoOworCV9fbGUxNiBCeXRlQ291bnQ7CisJX191OCBQYWQ7CQkvKiBCQiBjaGVjayBmb3Igd2hldGhlciBwYWRkZWQgdG8gRFdPUkQgYm91bmRhcnkgYW5kIG9wdGltdW0gcGVyZm9ybWFuY2UgaGVyZSAqLworCWNoYXIgRGF0YVswXTsKK30gV1JJVEVfUkVROworCit0eXBlZGVmIHN0cnVjdCBzbWJfY29tX3dyaXRlX3JzcCB7CisJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSA2ICovCisJX191OCBBbmRYQ29tbWFuZDsKKwlfX3U4IEFuZFhSZXNlcnZlZDsKKwlfX2xlMTYgQW5kWE9mZnNldDsKKwlfX2xlMTYgQ291bnQ7CisJX19sZTE2IFJlbWFpbmluZzsKKwlfX2xlMTYgQ291bnRIaWdoOworCV9fdTE2ICBSZXNlcnZlZDsKKwlfX3UxNiBCeXRlQ291bnQ7Cit9IFdSSVRFX1JTUDsKKwordHlwZWRlZiBzdHJ1Y3Qgc21iX2NvbV9yZWFkX3JlcSB7CisJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAxMiAqLworCV9fdTggQW5kWENvbW1hbmQ7CisJX191OCBBbmRYUmVzZXJ2ZWQ7CisJX19sZTE2IEFuZFhPZmZzZXQ7CisJX191MTYgRmlkOworCV9fbGUzMiBPZmZzZXRMb3c7CisJX19sZTE2IE1heENvdW50OworCV9fbGUxNiBNaW5Db3VudDsJCS8qIG9ic29sZXRlICovCisJX19sZTMyIE1heENvdW50SGlnaDsKKwlfX2xlMTYgUmVtYWluaW5nOworCV9fbGUzMiBPZmZzZXRIaWdoOworCV9fbGUxNiBCeXRlQ291bnQ7Cit9IFJFQURfUkVROworCit0eXBlZGVmIHN0cnVjdCBzbWJfY29tX3JlYWRfcnNwIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDEyICovCisJX191OCBBbmRYQ29tbWFuZDsKKwlfX3U4IEFuZFhSZXNlcnZlZDsKKwlfX2xlMTYgQW5kWE9mZnNldDsKKwlfX2xlMTYgUmVtYWluaW5nOworCV9fbGUxNiBEYXRhQ29tcGFjdGlvbk1vZGU7CisJX19sZTE2IFJlc2VydmVkOworCV9fbGUxNiBEYXRhTGVuZ3RoOworCV9fbGUxNiBEYXRhT2Zmc2V0OworCV9fbGUxNiBEYXRhTGVuZ3RoSGlnaDsKKwlfX3U2NCBSZXNlcnZlZDI7CisJX191MTYgQnl0ZUNvdW50OworCV9fdTggUGFkOwkJLyogQkIgY2hlY2sgZm9yIHdoZXRoZXIgcGFkZGVkIHRvIERXT1JEIGJvdW5kYXJ5IGFuZCBvcHRpbXVtIHBlcmZvcm1hbmNlIGhlcmUgKi8KKwljaGFyIERhdGFbMV07Cit9IFJFQURfUlNQOworCit0eXBlZGVmIHN0cnVjdCBsb2NraW5nX2FuZHhfcmFuZ2UgeworCV9fbGUxNiBQaWQ7CisJX19sZTE2IFBhZDsKKwlfX2xlMzIgT2Zmc2V0SGlnaDsKKwlfX2xlMzIgT2Zmc2V0TG93OworCV9fbGUzMiBMZW5ndGhIaWdoOworCV9fbGUzMiBMZW5ndGhMb3c7Cit9IExPQ0tJTkdfQU5EWF9SQU5HRTsKKworI2RlZmluZSBMT0NLSU5HX0FORFhfU0hBUkVEX0xPQ0sgICAgIDB4MDEKKyNkZWZpbmUgTE9DS0lOR19BTkRYX09QTE9DS19SRUxFQVNFICAweDAyCisjZGVmaW5lIExPQ0tJTkdfQU5EWF9DSEFOR0VfTE9DS1RZUEUgMHgwNAorI2RlZmluZSBMT0NLSU5HX0FORFhfQ0FOQ0VMX0xPQ0sgICAgIDB4MDgKKyNkZWZpbmUgTE9DS0lOR19BTkRYX0xBUkdFX0ZJTEVTICAgICAweDEwCS8qIGFsd2F5cyBvbiBmb3IgdXMgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc21iX2NvbV9sb2NrX3JlcSB7CisJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSA4ICovCisJX191OCBBbmRYQ29tbWFuZDsKKwlfX3U4IEFuZFhSZXNlcnZlZDsKKwlfX2xlMTYgQW5kWE9mZnNldDsKKwlfX3UxNiBGaWQ7CisJX191OCBMb2NrVHlwZTsKKwlfX3U4IE9wbG9ja0xldmVsOworCV9fbGUzMiBUaW1lb3V0OworCV9fbGUxNiBOdW1iZXJPZlVubG9ja3M7CisJX19sZTE2IE51bWJlck9mTG9ja3M7CisJX19sZTE2IEJ5dGVDb3VudDsKKwlMT0NLSU5HX0FORFhfUkFOR0UgTG9ja3NbMV07Cit9IExPQ0tfUkVROworCit0eXBlZGVmIHN0cnVjdCBzbWJfY29tX2xvY2tfcnNwIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDIgKi8KKwlfX3U4IEFuZFhDb21tYW5kOworCV9fdTggQW5kWFJlc2VydmVkOworCV9fbGUxNiBBbmRYT2Zmc2V0OworCV9fdTE2IEJ5dGVDb3VudDsKK30gTE9DS19SU1A7CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fcmVuYW1lX3JlcSB7CisJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAxICovCisJX19sZTE2IFNlYXJjaEF0dHJpYnV0ZXM7CS8qIHRhcmdldCBmaWxlIGF0dHJpYnV0ZXMgKi8KKwlfX2xlMTYgQnl0ZUNvdW50OworCV9fdTggQnVmZmVyRm9ybWF0OwkvKiA0ID0gQVNDSUkgb3IgVW5pY29kZSAqLworCXVuc2lnbmVkIGNoYXIgT2xkRmlsZU5hbWVbMV07CisJLyogZm9sbG93ZWQgYnkgX191OCBCdWZmZXJGb3JtYXQyICovCisJLyogZm9sbG93ZWQgYnkgTmV3RmlsZU5hbWUgKi8KK30gUkVOQU1FX1JFUTsKKworCS8qIGNvcHkgcmVxdWVzdCBmbGFncyAqLworI2RlZmluZSBDT1BZX01VU1RfQkVfRklMRSAgICAgIDB4MDAwMQorI2RlZmluZSBDT1BZX01VU1RfQkVfRElSICAgICAgIDB4MDAwMgorI2RlZmluZSBDT1BZX1RBUkdFVF9NT0RFX0FTQ0lJIDB4MDAwNCAvKiBpZiBub3Qgc2V0LCBiaW5hcnkgKi8KKyNkZWZpbmUgQ09QWV9TT1VSQ0VfTU9ERV9BU0NJSSAweDAwMDggLyogaWYgbm90IHNldCwgYmluYXJ5ICovCisjZGVmaW5lIENPUFlfVkVSSUZZX1dSSVRFUyAgICAgMHgwMDEwCisjZGVmaW5lIENPUFlfVFJFRSAgICAgICAgICAgICAgMHgwMDIwIAorCit0eXBlZGVmIHN0cnVjdCBzbWJfY29tX2NvcHlfcmVxIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDMgKi8KKwlfX3UxNiBUaWQyOworCV9fbGUxNiBPcGVuRnVuY3Rpb247CisJX19sZTE2IEZsYWdzOworCV9fbGUxNiBCeXRlQ291bnQ7CisJX191OCBCdWZmZXJGb3JtYXQ7CS8qIDQgPSBBU0NJSSBvciBVbmljb2RlICovIAorCXVuc2lnbmVkIGNoYXIgT2xkRmlsZU5hbWVbMV07CisJLyogZm9sbG93ZWQgYnkgX191OCBCdWZmZXJGb3JtYXQyICovCisJLyogZm9sbG93ZWQgYnkgTmV3RmlsZU5hbWUgc3RyaW5nICovCit9IENPUFlfUkVROworCit0eXBlZGVmIHN0cnVjdCBzbWJfY29tX2NvcHlfcnNwIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7ICAgICAvKiB3Y3QgPSAxICovCisJX19sZTE2IENvcHlDb3VudDsgICAgLyogbnVtYmVyIG9mIGZpbGVzIGNvcGllZCAqLworCV9fdTE2IEJ5dGVDb3VudDsgICAgLyogbWF5IGJlIHplcm8gKi8KKwlfX3U4IEJ1ZmZlckZvcm1hdDsgIC8qIDB4MDQgLSBvbmx5IHByZXNlbnQgaWYgZXJyb3JlZCBmaWxlIGZvbGxvd3MgKi8KKwl1bnNpZ25lZCBjaGFyIEVycm9yRmlsZU5hbWVbMV07IC8qIG9ubHkgcHJlc2VudCBpZiBlcnJvciBpbiBjb3B5ICovCit9IENPUFlfUlNQOworCisjZGVmaW5lIENSRUFURV9IQVJEX0xJTksJCTB4MTAzCisjZGVmaW5lIE1PVkVGSUxFX0NPUFlfQUxMT1dFRAkJMHgwMDAyCisjZGVmaW5lIE1PVkVGSUxFX1JFUExBQ0VfRVhJU1RJTkcJMHgwMDAxCisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fbnRfcmVuYW1lX3JlcSB7CS8qIEE1IC0gYWxzbyB1c2VkIGZvciBjcmVhdGUgaGFyZGxpbmsgKi8KKwlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDQgKi8KKwlfX2xlMTYgU2VhcmNoQXR0cmlidXRlczsJLyogdGFyZ2V0IGZpbGUgYXR0cmlidXRlcyAqLworCV9fbGUxNiBGbGFnczsJCS8qIHNwZWMgc2F5cyBJbmZvcm1hdGlvbiBMZXZlbCAqLworCV9fbGUzMiBDbHVzdGVyQ291bnQ7CisJX19sZTE2IEJ5dGVDb3VudDsKKwlfX3U4IEJ1ZmZlckZvcm1hdDsJLyogNCA9IEFTQ0lJIG9yIFVuaWNvZGUgKi8KKwl1bnNpZ25lZCBjaGFyIE9sZEZpbGVOYW1lWzFdOworCS8qIGZvbGxvd2VkIGJ5IF9fdTggQnVmZmVyRm9ybWF0MiAqLworCS8qIGZvbGxvd2VkIGJ5IE5ld0ZpbGVOYW1lICovCit9IE5UX1JFTkFNRV9SRVE7CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fcmVuYW1lX3JzcCB7CisJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAwICovCisJX191MTYgQnl0ZUNvdW50OwkvKiBiY3QgPSAwICovCit9IFJFTkFNRV9SU1A7CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fZGVsZXRlX2ZpbGVfcmVxIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDEgKi8KKwlfX2xlMTYgU2VhcmNoQXR0cmlidXRlczsKKwlfX2xlMTYgQnl0ZUNvdW50OworCV9fdTggQnVmZmVyRm9ybWF0OwkvKiA0ID0gQVNDSUkgKi8KKwl1bnNpZ25lZCBjaGFyIGZpbGVOYW1lWzFdOworfSBERUxFVEVfRklMRV9SRVE7CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fZGVsZXRlX2ZpbGVfcnNwIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDAgKi8KKwlfX3UxNiBCeXRlQ291bnQ7CS8qIGJjdCA9IDAgKi8KK30gREVMRVRFX0ZJTEVfUlNQOworCit0eXBlZGVmIHN0cnVjdCBzbWJfY29tX2RlbGV0ZV9kaXJlY3RvcnlfcmVxIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDAgKi8KKwlfX2xlMTYgQnl0ZUNvdW50OworCV9fdTggQnVmZmVyRm9ybWF0OwkvKiA0ID0gQVNDSUkgKi8KKwl1bnNpZ25lZCBjaGFyIERpck5hbWVbMV07Cit9IERFTEVURV9ESVJFQ1RPUllfUkVROworCit0eXBlZGVmIHN0cnVjdCBzbWJfY29tX2RlbGV0ZV9kaXJlY3RvcnlfcnNwIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDAgKi8KKwlfX3UxNiBCeXRlQ291bnQ7CS8qIGJjdCA9IDAgKi8KK30gREVMRVRFX0RJUkVDVE9SWV9SU1A7CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fY3JlYXRlX2RpcmVjdG9yeV9yZXEgeworCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gMCAqLworCV9fbGUxNiBCeXRlQ291bnQ7CisJX191OCBCdWZmZXJGb3JtYXQ7CS8qIDQgPSBBU0NJSSAqLworCXVuc2lnbmVkIGNoYXIgRGlyTmFtZVsxXTsKK30gQ1JFQVRFX0RJUkVDVE9SWV9SRVE7CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fY3JlYXRlX2RpcmVjdG9yeV9yc3AgeworCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gMCAqLworCV9fdTE2IEJ5dGVDb3VudDsJLyogYmN0ID0gMCAqLworfSBDUkVBVEVfRElSRUNUT1JZX1JTUDsKKwordHlwZWRlZiBzdHJ1Y3Qgc21iX2NvbV9zZXRhdHRyX3JlcSB7CisJc3RydWN0IHNtYl9oZHIgaGRyOyAvKiB3Y3QgPSA4ICovCisJX19sZTE2IGF0dHI7CisJX19sZTE2IHRpbWVfbG93OworCV9fbGUxNiB0aW1lX2hpZ2g7CisJX19sZTE2IHJlc2VydmVkWzVdOyAvKiBtdXN0IGJlIHplcm8gKi8KKwlfX3UxNiAgQnl0ZUNvdW50OworCV9fdTggICBCdWZmZXJGb3JtYXQ7IC8qIDQgPSBBU0NJSSAqLworCXVuc2lnbmVkIGNoYXIgZmlsZU5hbWVbMV07Cit9IFNFVEFUVFJfUkVROworCit0eXBlZGVmIHN0cnVjdCBzbWJfY29tX3NldGF0dHJfcnNwIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7ICAgICAvKiB3Y3QgPSAwICovCisJX191MTYgQnl0ZUNvdW50OyAgICAgICAgLyogYmN0ID0gMCAqLworfSBTRVRBVFRSX1JTUDsKKworLyogZW1wdHkgd2N0IHJlc3BvbnNlIHRvIHNldGF0dHIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIE5UIFRyYW5zYWN0IHN0cnVjdHVyZSBkZWZpbnRpb25zIGZvbGxvdyAgICAgICAgICovCisvKiBDdXJyZW50bHkgb25seSBpb2N0bCBhbmQgbm90aWZ5IGFyZSBpbXBsZW1lbnRlZCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb25faW9jdGxfcmVxIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDIzICovCisJX191OCBNYXhTZXR1cENvdW50OworCV9fdTE2IFJlc2VydmVkOworCV9fbGUzMiBUb3RhbFBhcmFtZXRlckNvdW50OworCV9fbGUzMiBUb3RhbERhdGFDb3VudDsKKwlfX2xlMzIgTWF4UGFyYW1ldGVyQ291bnQ7CisJX19sZTMyIE1heERhdGFDb3VudDsKKwlfX2xlMzIgUGFyYW1ldGVyQ291bnQ7CisJX19sZTMyIFBhcmFtZXRlck9mZnNldDsKKwlfX2xlMzIgRGF0YUNvdW50OworCV9fbGUzMiBEYXRhT2Zmc2V0OworCV9fdTggU2V0dXBDb3VudDsgLyogZm91ciBzZXR1cCB3b3JkcyBmb2xsb3cgc3ViY29tbWFuZCAqLworCS8qIFNOSUEgc3BlYyBpbmNvcnJlY3RseSBpbmNsdWRlZCBzcHVyaW91cyBwYWQgaGVyZSAqLworCV9fbGUxNiBTdWJDb21tYW5kOy8qIDIgPSBJT0NUTC9GU0NUTCAqLworCV9fbGUzMiBGdW5jdGlvbkNvZGU7CisJX191MTYgRmlkOworCV9fdTggSXNGc2N0bDsgICAgLyogMSA9IEZpbGUgU3lzdGVtIENvbnRyb2wsIDAgPSBkZXZpY2UgY29udHJvbCAoSU9DVEwpKi8KKwlfX3U4IElzUm9vdEZsYWc7IC8qIDEgPSBhcHBseSBjb21tYW5kIHRvIHJvb3Qgb2Ygc2hhcmUgKG11c3QgYmUgREZTIHNoYXJlKSovCisJX19sZTE2IEJ5dGVDb3VudDsKKwlfX3U4IFBhZFszXTsKKwlfX3U4IERhdGFbMV07Cit9IFRSQU5TQUNUX0lPQ1RMX1JFUTsKKwordHlwZWRlZiBzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbl9pb2N0bF9yc3AgeworCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gMTkgKi8KKwlfX3U4IFJlc2VydmVkWzNdOworCV9fbGUzMiBUb3RhbFBhcmFtZXRlckNvdW50OworCV9fbGUzMiBUb3RhbERhdGFDb3VudDsKKwlfX2xlMzIgUGFyYW1ldGVyQ291bnQ7CisJX19sZTMyIFBhcmFtZXRlck9mZnNldDsKKwlfX2xlMzIgUGFyYW1ldGVyRGlzcGxhY2VtZW50OworCV9fbGUzMiBEYXRhQ291bnQ7CisJX19sZTMyIERhdGFPZmZzZXQ7CisJX19sZTMyIERhdGFEaXNwbGFjZW1lbnQ7CisJX191OCBTZXR1cENvdW50OwkvKiAxICovCisJX19sZTE2IFJldHVybmVkRGF0YUxlbjsKKwlfX3UxNiBCeXRlQ291bnQ7CisJX191OCBQYWRbM107Cit9IFRSQU5TQUNUX0lPQ1RMX1JTUDsKKwordHlwZWRlZiBzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbl9jaGFuZ2Vfbm90aWZ5X3JlcSB7CisJc3RydWN0IHNtYl9oZHIgaGRyOyAgICAgLyogd2N0ID0gMjMgKi8KKwlfX3U4IE1heFNldHVwQ291bnQ7CisJX191MTYgUmVzZXJ2ZWQ7CisJX19sZTMyIFRvdGFsUGFyYW1ldGVyQ291bnQ7CisJX19sZTMyIFRvdGFsRGF0YUNvdW50OworCV9fbGUzMiBNYXhQYXJhbWV0ZXJDb3VudDsKKwlfX2xlMzIgTWF4RGF0YUNvdW50OworCV9fbGUzMiBQYXJhbWV0ZXJDb3VudDsKKwlfX2xlMzIgUGFyYW1ldGVyT2Zmc2V0OworCV9fbGUzMiBEYXRhQ291bnQ7CisJX19sZTMyIERhdGFPZmZzZXQ7CisJX191OCBTZXR1cENvdW50OyAvKiBmb3VyIHNldHVwIHdvcmRzIGZvbGxvdyBzdWJjb21tYW5kICovCisJLyogU05JQSBzcGVjIGluY29ycmVjdGx5IGluY2x1ZGVkIHNwdXJpb3VzIHBhZCBoZXJlICovCisJX19sZTE2IFN1YkNvbW1hbmQ7LyogNCA9IENoYW5nZSBOb3RpZnkgKi8KKwlfX2xlMzIgQ29tcGxldGlvbkZpbHRlcjsgIC8qIG9wZXJhdGlvbiB0byBtb25pdG9yICovCisJX191MTYgRmlkOworCV9fdTggV2F0Y2hUcmVlOyAgLyogMSA9IE1vbml0b3Igc3ViZGlyZWN0b3JpZXMgKi8KKwlfX3U4IFJlc2VydmVkMjsKKwlfX2xlMTYgQnl0ZUNvdW50OworLyogX191OCBQYWRbM107Ki8KKy8qCV9fdTggRGF0YVsxXTsqLworfSBUUkFOU0FDVF9DSEFOR0VfTk9USUZZX1JFUTsKKwordHlwZWRlZiBzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbl9jaGFuZ2Vfbm90aWZ5X3JzcCB7CisJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAxOCAqLworCV9fdTggUmVzZXJ2ZWRbM107CisJX19sZTMyIFRvdGFsUGFyYW1ldGVyQ291bnQ7CisJX19sZTMyIFRvdGFsRGF0YUNvdW50OworCV9fbGUzMiBQYXJhbWV0ZXJDb3VudDsKKwlfX2xlMzIgUGFyYW1ldGVyT2Zmc2V0OworCV9fbGUzMiBQYXJhbWV0ZXJEaXNwbGFjZW1lbnQ7CisJX19sZTMyIERhdGFDb3VudDsKKwlfX2xlMzIgRGF0YU9mZnNldDsKKwlfX2xlMzIgRGF0YURpc3BsYWNlbWVudDsKKwlfX3U4IFNldHVwQ291bnQ7ICAgLyogMCAqLworCV9fdTE2IEJ5dGVDb3VudDsKKwkvKiBfX3U4IFBhZFszXTsgKi8KK30gVFJBTlNBQ1RfQ0hBTkdFX05PVElGWV9SU1A7CisvKiBDb21wbGV0aW9uIEZpbHRlciBmbGFncyBmb3IgTm90aWZ5ICovCisjZGVmaW5lIEZJTEVfTk9USUZZX0NIQU5HRV9GSUxFX05BTUUgICAgMHgwMDAwMDAwMQorI2RlZmluZSBGSUxFX05PVElGWV9DSEFOR0VfRElSX05BTUUgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgRklMRV9OT1RJRllfQ0hBTkdFX05BTUUgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIEZJTEVfTk9USUZZX0NIQU5HRV9BVFRSSUJVVEVTICAgMHgwMDAwMDAwNAorI2RlZmluZSBGSUxFX05PVElGWV9DSEFOR0VfU0laRSAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgRklMRV9OT1RJRllfQ0hBTkdFX0xBU1RfV1JJVEUgICAweDAwMDAwMDEwCisjZGVmaW5lIEZJTEVfTk9USUZZX0NIQU5HRV9MQVNUX0FDQ0VTUyAgMHgwMDAwMDAyMAorI2RlZmluZSBGSUxFX05PVElGWV9DSEFOR0VfQ1JFQVRJT04gICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgRklMRV9OT1RJRllfQ0hBTkdFX0VBICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEZJTEVfTk9USUZZX0NIQU5HRV9TRUNVUklUWSAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBGSUxFX05PVElGWV9DSEFOR0VfU1RSRUFNX05BTUUgIDB4MDAwMDAyMDAKKyNkZWZpbmUgRklMRV9OT1RJRllfQ0hBTkdFX1NUUkVBTV9TSVpFICAweDAwMDAwNDAwCisjZGVmaW5lIEZJTEVfTk9USUZZX0NIQU5HRV9TVFJFQU1fV1JJVEUgMHgwMDAwMDgwMAorCisjZGVmaW5lIEZJTEVfQUNUSU9OX0FEREVECQkweDAwMDAwMDAxCisjZGVmaW5lIEZJTEVfQUNUSU9OX1JFTU9WRUQJCTB4MDAwMDAwMDIKKyNkZWZpbmUgRklMRV9BQ1RJT05fTU9ESUZJRUQJCTB4MDAwMDAwMDMKKyNkZWZpbmUgRklMRV9BQ1RJT05fUkVOQU1FRF9PTERfTkFNRQkweDAwMDAwMDA0CisjZGVmaW5lIEZJTEVfQUNUSU9OX1JFTkFNRURfTkVXX05BTUUJMHgwMDAwMDAwNQorI2RlZmluZSBGSUxFX0FDVElPTl9BRERFRF9TVFJFQU0JMHgwMDAwMDAwNgorI2RlZmluZSBGSUxFX0FDVElPTl9SRU1PVkVEX1NUUkVBTQkweDAwMDAwMDA3CisjZGVmaW5lIEZJTEVfQUNUSU9OX01PRElGSUVEX1NUUkVBTQkweDAwMDAwMDA4CisKKy8qIHJlc3BvbnNlIGNvbnRhaW5zIGFycmF5IG9mIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlcyAqLworc3RydWN0IGZpbGVfbm90aWZ5X2luZm9ybWF0aW9uIHsKKwlfX2xlMzIgTmV4dEVudHJ5T2Zmc2V0OworCV9fbGUzMiBBY3Rpb247CisJX19sZTMyIEZpbGVOYW1lTGVuZ3RoOworCV9fdTggIEZpbGVOYW1lWzBdOworfTsgCisKK3N0cnVjdCByZXBhcnNlX2RhdGEgeworCV9fdTMyCVJlcGFyc2VUYWc7CisJX191MTYJUmVwYXJzZURhdGFMZW5ndGg7CisJX191MTYJUmVzZXJ2ZWQ7CisJX191MTYJQWx0TmFtZU9mZnNldDsKKwlfX3UxNglBbHROYW1lTGVuOworCV9fdTE2CVRhcmdldE5hbWVPZmZzZXQ7CisJX191MTYJVGFyZ2V0TmFtZUxlbjsKKwljaGFyCUxpbmtOYW1lc0J1ZlsxXTsKK307CisKK3N0cnVjdCBjaWZzX3F1b3RhX2RhdGEgeworCV9fdTMyCXJzcnZkMTsgIC8qIDAgKi8KKwlfX3UzMglzaWRfc2l6ZTsKKwlfX3U2NAlyc3J2ZDI7ICAvKiAwICovCisJX191NjQJc3BhY2VfdXNlZDsKKwlfX3U2NAlzb2Z0X2xpbWl0OworCV9fdTY0CWhhcmRfbGltaXQ7CisJY2hhcglzaWRbMV07ICAvKiB2YXJpYWJsZSBzaXplPyAqLworfTsKKworLyogcXVvdGEgc3ViIGNvbW1hbmRzICovCisjZGVmaW5lIFFVT1RBX0xJU1RfQ09OVElOVUUJICAgIDAKKyNkZWZpbmUgUVVPVEFfTElTVF9TVEFSVAkweDEwMAorI2RlZmluZSBRVU9UQV9GT1JfU0lECQkweDEwMQorCitzdHJ1Y3QgdHJhbnMyX3JlcSB7CisJLyogc3RydWN0IHNtYl9oZHIgaGRyIHByZWNlZGVzLiBTZXQgd2N0ID0gMTQrICovCisJX19sZTE2IFRvdGFsUGFyYW1ldGVyQ291bnQ7CisJX19sZTE2IFRvdGFsRGF0YUNvdW50OworCV9fbGUxNiBNYXhQYXJhbWV0ZXJDb3VudDsKKwlfX2xlMTYgTWF4RGF0YUNvdW50OworCV9fdTggTWF4U2V0dXBDb3VudDsKKwlfX3U4IFJlc2VydmVkOworCV9fbGUxNiBGbGFnczsKKwlfX2xlMzIgVGltZW91dDsKKwlfX3UxNiBSZXNlcnZlZDI7CisJX19sZTE2IFBhcmFtZXRlckNvdW50OworCV9fbGUxNiBQYXJhbWV0ZXJPZmZzZXQ7CisJX19sZTE2IERhdGFDb3VudDsKKwlfX2xlMTYgRGF0YU9mZnNldDsKKwlfX3U4IFNldHVwQ291bnQ7CisJX191OCBSZXNlcnZlZDM7CisJX19sZTE2IFN1YkNvbW1hbmQ7IC8qIDFzdCBzZXR1cCB3b3JkIC0gU2V0dXBDb3VudCB3b3JkcyBmb2xsb3cgKi8KKwlfX2xlMTYgQnl0ZUNvdW50OworfTsKKworc3RydWN0IHNtYl90Ml9yZXEgeworCXN0cnVjdCBzbWJfaGRyIGhkcjsKKwlzdHJ1Y3QgdHJhbnMyX3JlcSB0Ml9yZXE7Cit9OworCitzdHJ1Y3QgdHJhbnMyX3Jlc3AgeworCS8qIHN0cnVjdCBzbWJfaGRyIGhkciBwcmVjZWRlcy4gTm90ZSB3Y3QgPSAxMCArIHNldHVwIGNvdW50ICovCisJX19sZTE2IFRvdGFsUGFyYW1ldGVyQ291bnQ7CisJX19sZTE2IFRvdGFsRGF0YUNvdW50OworCV9fdTE2IFJlc2VydmVkOworCV9fbGUxNiBQYXJhbWV0ZXJDb3VudDsKKwlfX2xlMTYgUGFyYW1ldGVyT2Zmc2V0OworCV9fbGUxNiBQYXJhbWV0ZXJEaXNwbGFjZW1lbnQ7CisJX19sZTE2IERhdGFDb3VudDsKKwlfX2xlMTYgRGF0YU9mZnNldDsKKwlfX2xlMTYgRGF0YURpc3BsYWNlbWVudDsKKwlfX3U4IFNldHVwQ291bnQ7CisJX191OCBSZXNlcnZlZDE7CisJLyogU2V0dXBXb3Jkc1tTZXR1cENvdW50XTsKKwlfX3UxNiBCeXRlQ291bnQ7CisJX191MTYgUmVzZXJ2ZWQyOyovCQorCS8qIGRhdGEgYXJlYSBmb2xsb3dzICovCit9OworCitzdHJ1Y3Qgc21iX3QyX3JzcCB7CisJc3RydWN0IHNtYl9oZHIgaGRyOworCXN0cnVjdCB0cmFuczJfcmVzcCB0Ml9yc3A7Cit9OworCisvKiBQYXRoSW5mby9GaWxlSW5mbyBpbmZvbGV2ZWxzICovCisjZGVmaW5lIFNNQl9JTkZPX1NUQU5EQVJEICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU01CX1NFVF9GSUxFX0VBICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBTTUJfUVVFUllfRklMRV9FQV9TSVpFICAgICAgICAgICAgICAyCisjZGVmaW5lIFNNQl9JTkZPX1FVRVJZX0VBU19GUk9NX0xJU1QgICAgICAgIDMKKyNkZWZpbmUgU01CX0lORk9fUVVFUllfQUxMX0VBUyAgICAgICAgICAgICAgNAorI2RlZmluZSBTTUJfSU5GT19JU19OQU1FX1ZBTElEICAgICAgICAgICAgICA2CisjZGVmaW5lIFNNQl9RVUVSWV9GSUxFX0JBU0lDX0lORk8gICAgICAgMHgxMDEKKyNkZWZpbmUgU01CX1FVRVJZX0ZJTEVfU1RBTkRBUkRfSU5GTyAgICAweDEwMgorI2RlZmluZSBTTUJfUVVFUllfRklMRV9FQV9JTkZPICAgICAgICAgIDB4MTAzCisjZGVmaW5lIFNNQl9RVUVSWV9GSUxFX05BTUVfSU5GTyAgICAgICAgMHgxMDQKKyNkZWZpbmUgU01CX1FVRVJZX0ZJTEVfQUxMT0NBVElPTl9JTkZPICAweDEwNQorI2RlZmluZSBTTUJfUVVFUllfRklMRV9FTkRfT0ZfRklMRUlORk8gIDB4MTA2CisjZGVmaW5lIFNNQl9RVUVSWV9GSUxFX0FMTF9JTkZPICAgICAgICAgMHgxMDcKKyNkZWZpbmUgU01CX1FVRVJZX0FMVF9OQU1FX0lORk8gICAgICAgICAweDEwOAorI2RlZmluZSBTTUJfUVVFUllfRklMRV9TVFJFQU1fSU5GTyAgICAgIDB4MTA5CisjZGVmaW5lIFNNQl9RVUVSWV9GSUxFX0NPTVBSRVNTSU9OX0lORk8gMHgxMEIKKyNkZWZpbmUgU01CX1FVRVJZX0ZJTEVfVU5JWF9CQVNJQyAgICAgICAweDIwMAorI2RlZmluZSBTTUJfUVVFUllfRklMRV9VTklYX0xJTksgICAgICAgIDB4MjAxCisjZGVmaW5lIFNNQl9RVUVSWV9QT1NJWF9BQ0wgICAgICAgICAgICAgMHgyMDQKKyNkZWZpbmUgU01CX1FVRVJZX1hBVFRSICAgICAgICAgICAgICAgICAweDIwNQorI2RlZmluZSBTTUJfUVVFUllfQVRUUl9GTEFHUyAgICAgICAgICAgIDB4MjA2ICAvKiBhcHBlbmQsaW1tdXRhYmxlIGV0Yy4gKi8KKyNkZWZpbmUgU01CX1FVRVJZX0ZJTEVfSU5URVJOQUxfSU5GTyAgICAweDNlZQorI2RlZmluZSBTTUJfUVVFUllfRklMRV9BQ0NFU1NfSU5GTyAgICAgIDB4M2YwCisjZGVmaW5lIFNNQl9RVUVSWV9GSUxFX05BTUVfSU5GTzIgICAgICAgMHgzZjEgLyogMHgzMCBieXRlcyAqLworI2RlZmluZSBTTUJfUVVFUllfRklMRV9QT1NJVElPTl9JTkZPICAgIDB4M2Y2IAorI2RlZmluZSBTTUJfUVVFUllfRklMRV9NT0RFX0lORk8gICAgICAgIDB4M2Y4CisjZGVmaW5lIFNNQl9RVUVSWV9GSUxFX0FMR05fSU5GTyAgICAgICAgMHgzZjkgCisKKworI2RlZmluZSBTTUJfU0VUX0ZJTEVfQkFTSUNfSU5GTwkgICAgICAgIDB4MTAxCisjZGVmaW5lIFNNQl9TRVRfRklMRV9ESVNQT1NJVElPTl9JTkZPICAgMHgxMDIKKyNkZWZpbmUgU01CX1NFVF9GSUxFX0FMTE9DQVRJT05fSU5GTyAgICAweDEwMworI2RlZmluZSBTTUJfU0VUX0ZJTEVfRU5EX09GX0ZJTEVfSU5GTyAgIDB4MTA0CisjZGVmaW5lIFNNQl9TRVRfRklMRV9VTklYX0JBU0lDICAgICAgICAgMHgyMDAKKyNkZWZpbmUgU01CX1NFVF9GSUxFX1VOSVhfTElOSyAgICAgICAgICAweDIwMQorI2RlZmluZSBTTUJfU0VUX0ZJTEVfVU5JWF9ITElOSyAgICAgICAgIDB4MjAzCisjZGVmaW5lIFNNQl9TRVRfUE9TSVhfQUNMICAgICAgICAgICAgICAgMHgyMDQKKyNkZWZpbmUgU01CX1NFVF9YQVRUUiAgICAgICAgICAgICAgICAgICAweDIwNQorI2RlZmluZSBTTUJfU0VUX0FUVFJfRkxBR1MgICAgICAgICAgICAgIDB4MjA2ICAvKiBhcHBlbmQsIGltbXV0YWJsZSBldGMuICovCisjZGVmaW5lIFNNQl9TRVRfRklMRV9CQVNJQ19JTkZPMiAgICAgICAgMHgzZWMKKyNkZWZpbmUgU01CX1NFVF9GSUxFX1JFTkFNRV9JTkZPUk1BVElPTiAweDNmMiAvKiBCQiBjaGVjayBpZiBxcGF0aGluZm8gbGV2ZWwgdG9vICovCisjZGVmaW5lIFNNQl9GSUxFX0FMTF9JTkZPMiAgICAgICAgICAgICAgMHgzZmEKKyNkZWZpbmUgU01CX1NFVF9GSUxFX0FMTE9DQVRJT05fSU5GTzIgICAweDNmYgorI2RlZmluZSBTTUJfU0VUX0ZJTEVfRU5EX09GX0ZJTEVfSU5GTzIgIDB4M2ZjCisjZGVmaW5lIFNNQl9GSUxFX01PVkVfQ0xVU1RFUl9JTkZPICAgICAgMHg0MDcKKyNkZWZpbmUgU01CX0ZJTEVfUVVPVEFfSU5GTyAgICAgICAgICAgICAweDQwOAorI2RlZmluZSBTTUJfRklMRV9SRVBBUlNFUE9JTlRfSU5GTyAgICAgIDB4NDA5CisjZGVmaW5lIFNNQl9GSUxFX01BWElNVU1fSU5GTyAgICAgICAgICAgMHg0MGQKKworLyogRmluZCBGaWxlIGluZm9sZXZlbHMgKi8KKyNkZWZpbmUgU01CX0ZJTkRfRklMRV9ESVJFQ1RPUllfSU5GTyAgICAgIDB4MTAxCisjZGVmaW5lIFNNQl9GSU5EX0ZJTEVfRlVMTF9ESVJFQ1RPUllfSU5GTyAweDEwMgorI2RlZmluZSBTTUJfRklORF9GSUxFX05BTUVTX0lORk8gICAgICAgICAgMHgxMDMKKyNkZWZpbmUgU01CX0ZJTkRfRklMRV9CT1RIX0RJUkVDVE9SWV9JTkZPIDB4MTA0CisjZGVmaW5lIFNNQl9GSU5EX0ZJTEVfSURfRlVMTF9ESVJfSU5GTyAgICAweDEwNQorI2RlZmluZSBTTUJfRklORF9GSUxFX0lEX0JPVEhfRElSX0lORk8gICAgMHgxMDYKKyNkZWZpbmUgU01CX0ZJTkRfRklMRV9VTklYICAgICAgICAgICAgICAgIDB4MjAyCisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3FwaV9yZXEgeworCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gMTQrICovCisJX19sZTE2IFRvdGFsUGFyYW1ldGVyQ291bnQ7CisJX19sZTE2IFRvdGFsRGF0YUNvdW50OworCV9fbGUxNiBNYXhQYXJhbWV0ZXJDb3VudDsKKwlfX2xlMTYgTWF4RGF0YUNvdW50OworCV9fdTggTWF4U2V0dXBDb3VudDsKKwlfX3U4IFJlc2VydmVkOworCV9fbGUxNiBGbGFnczsKKwlfX2xlMzIgVGltZW91dDsKKwlfX3UxNiBSZXNlcnZlZDI7CisJX19sZTE2IFBhcmFtZXRlckNvdW50OworCV9fbGUxNiBQYXJhbWV0ZXJPZmZzZXQ7CisJX19sZTE2IERhdGFDb3VudDsKKwlfX2xlMTYgRGF0YU9mZnNldDsKKwlfX3U4IFNldHVwQ291bnQ7CisJX191OCBSZXNlcnZlZDM7CisJX19sZTE2IFN1YkNvbW1hbmQ7CS8qIG9uZSBzZXR1cCB3b3JkICovCisJX19sZTE2IEJ5dGVDb3VudDsKKwlfX3U4IFBhZDsKKwlfX2xlMTYgSW5mb3JtYXRpb25MZXZlbDsKKwlfX3UzMiBSZXNlcnZlZDQ7CisJY2hhciBGaWxlTmFtZVsxXTsKK30gVFJBTlNBQ1RJT04yX1FQSV9SRVE7CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3FwaV9yc3AgeworCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gMTAgKyBTZXR1cENvdW50ICovCisJc3RydWN0IHRyYW5zMl9yZXNwIHQyOworCV9fdTE2IEJ5dGVDb3VudDsKKwlfX3UxNiBSZXNlcnZlZDI7CS8qIHBhcmFtZXRlciB3b3JkIHJlc2VydmVkIC0gcHJlc2VudCBmb3IgaW5mb2xldmVscyA+IDEwMCAqLworfSBUUkFOU0FDVElPTjJfUVBJX1JTUDsKKwordHlwZWRlZiBzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfc3BpX3JlcSB7CisJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAxNSAqLworCV9fbGUxNiBUb3RhbFBhcmFtZXRlckNvdW50OworCV9fbGUxNiBUb3RhbERhdGFDb3VudDsKKwlfX2xlMTYgTWF4UGFyYW1ldGVyQ291bnQ7CisJX19sZTE2IE1heERhdGFDb3VudDsKKwlfX3U4IE1heFNldHVwQ291bnQ7CisJX191OCBSZXNlcnZlZDsKKwlfX2xlMTYgRmxhZ3M7CisJX19sZTMyIFRpbWVvdXQ7CisJX191MTYgUmVzZXJ2ZWQyOworCV9fbGUxNiBQYXJhbWV0ZXJDb3VudDsKKwlfX2xlMTYgUGFyYW1ldGVyT2Zmc2V0OworCV9fbGUxNiBEYXRhQ291bnQ7CisJX19sZTE2IERhdGFPZmZzZXQ7CisJX191OCBTZXR1cENvdW50OworCV9fdTggUmVzZXJ2ZWQzOworCV9fbGUxNiBTdWJDb21tYW5kOwkvKiBvbmUgc2V0dXAgd29yZCAqLworCV9fbGUxNiBCeXRlQ291bnQ7CisJX191OCBQYWQ7CisJX191MTYgUGFkMTsKKwlfX2xlMTYgSW5mb3JtYXRpb25MZXZlbDsKKwlfX3UzMiBSZXNlcnZlZDQ7CisJY2hhciBGaWxlTmFtZVsxXTsKK30gVFJBTlNBQ1RJT04yX1NQSV9SRVE7CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3NwaV9yc3AgeworCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gMTAgKyBTZXR1cENvdW50ICovCisJc3RydWN0IHRyYW5zMl9yZXNwIHQyOworCV9fdTE2IEJ5dGVDb3VudDsKKwlfX3UxNiBSZXNlcnZlZDI7CS8qIHBhcmFtZXRlciB3b3JkIHJlc2VydmVkIC0gcHJlc2VudCBmb3IgaW5mb2xldmVscyA+IDEwMCAqLworfSBUUkFOU0FDVElPTjJfU1BJX1JTUDsKKworc3RydWN0IHNldF9maWxlX3JlbmFtZSB7CisJX19sZTMyIG92ZXJ3cml0ZTsgICAvKiAxID0gb3ZlcndyaXRlIGRlc3QgKi8KKwlfX3UzMiByb290X2ZpZDsgICAvKiB6ZXJvICovCisJX19sZTMyIHRhcmdldF9uYW1lX2xlbjsKKwljaGFyICB0YXJnZXRfbmFtZVswXTsgIC8qIE11c3QgYmUgdW5pY29kZSAqLworfTsKKworc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3NmaV9yZXEgeworCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gMTUgKi8KKwlfX2xlMTYgVG90YWxQYXJhbWV0ZXJDb3VudDsKKwlfX2xlMTYgVG90YWxEYXRhQ291bnQ7CisJX19sZTE2IE1heFBhcmFtZXRlckNvdW50OworCV9fbGUxNiBNYXhEYXRhQ291bnQ7CisJX191OCBNYXhTZXR1cENvdW50OworCV9fdTggUmVzZXJ2ZWQ7CisJX19sZTE2IEZsYWdzOworCV9fbGUzMiBUaW1lb3V0OworCV9fdTE2IFJlc2VydmVkMjsKKwlfX2xlMTYgUGFyYW1ldGVyQ291bnQ7CisJX19sZTE2IFBhcmFtZXRlck9mZnNldDsKKwlfX2xlMTYgRGF0YUNvdW50OworCV9fbGUxNiBEYXRhT2Zmc2V0OworCV9fdTggU2V0dXBDb3VudDsKKwlfX3U4IFJlc2VydmVkMzsKKwlfX2xlMTYgU3ViQ29tbWFuZDsJLyogb25lIHNldHVwIHdvcmQgKi8KKwlfX2xlMTYgQnl0ZUNvdW50OworCV9fdTggUGFkOworCV9fdTE2IFBhZDE7CisJX191MTYgRmlkOworCV9fbGUxNiBJbmZvcm1hdGlvbkxldmVsOworCV9fdTE2IFJlc2VydmVkNDsJCit9OworCitzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfc2ZpX3JzcCB7CisJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAxMCArIFNldHVwQ291bnQgKi8KKwlzdHJ1Y3QgdHJhbnMyX3Jlc3AgdDI7CisJX191MTYgQnl0ZUNvdW50OworCV9fdTE2IFJlc2VydmVkMjsJLyogcGFyYW1ldGVyIHdvcmQgcmVzZXJ2ZWQgLSBwcmVzZW50IGZvciBpbmZvbGV2ZWxzID4gMTAwICovCit9OworCisKKy8qCisgKiBGbGFncyBvbiBUMiBGSU5ERklSU1QgYW5kIEZJTkRORVhUIAorICovCisjZGVmaW5lIENJRlNfU0VBUkNIX0NMT1NFX0FMV0FZUyAgMHgwMDAxCisjZGVmaW5lIENJRlNfU0VBUkNIX0NMT1NFX0FUX0VORCAgMHgwMDAyCisjZGVmaW5lIENJRlNfU0VBUkNIX1JFVFVSTl9SRVNVTUUgMHgwMDA0CisjZGVmaW5lIENJRlNfU0VBUkNIX0NPTlRJTlVFX0ZST01fTEFTVCAweDAwMDgKKyNkZWZpbmUgQ0lGU19TRUFSQ0hfQkFDS1VQX1NFQVJDSCAweDAwMTAKKworLyoKKyAqIFNpemUgb2YgdGhlIHJlc3VtZSBrZXkgb24gRklOREZJUlNUIGFuZCBGSU5ETkVYVCBjYWxscworICovCisjZGVmaW5lIENJRlNfU01CX1JFU1VNRV9LRVlfU0laRSA0CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX2ZmaXJzdF9yZXEgeworCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gMTUgKi8KKwlfX2xlMTYgVG90YWxQYXJhbWV0ZXJDb3VudDsKKwlfX2xlMTYgVG90YWxEYXRhQ291bnQ7CisJX19sZTE2IE1heFBhcmFtZXRlckNvdW50OworCV9fbGUxNiBNYXhEYXRhQ291bnQ7CisJX191OCBNYXhTZXR1cENvdW50OworCV9fdTggUmVzZXJ2ZWQ7CisJX19sZTE2IEZsYWdzOworCV9fbGUzMiBUaW1lb3V0OworCV9fdTE2IFJlc2VydmVkMjsKKwlfX2xlMTYgUGFyYW1ldGVyQ291bnQ7CisJX19sZTE2IFBhcmFtZXRlck9mZnNldDsKKwlfX2xlMTYgRGF0YUNvdW50OworCV9fbGUxNiBEYXRhT2Zmc2V0OworCV9fdTggU2V0dXBDb3VudDsJLyogb25lICovCisJX191OCBSZXNlcnZlZDM7CisJX19sZTE2IFN1YkNvbW1hbmQ7CS8qIFRSQU5TMl9GSU5EX0ZJUlNUICovCisJX19sZTE2IEJ5dGVDb3VudDsKKwlfX3U4IFBhZDsKKwlfX2xlMTYgU2VhcmNoQXR0cmlidXRlczsKKwlfX2xlMTYgU2VhcmNoQ291bnQ7CisJX19sZTE2IFNlYXJjaEZsYWdzOworCV9fbGUxNiBJbmZvcm1hdGlvbkxldmVsOworCV9fbGUzMiBTZWFyY2hTdG9yYWdlVHlwZTsKKwljaGFyIEZpbGVOYW1lWzFdOworfSBUUkFOU0FDVElPTjJfRkZJUlNUX1JFUTsKKwordHlwZWRlZiBzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfZmZpcnN0X3JzcCB7CisJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAxMCAqLworCXN0cnVjdCB0cmFuczJfcmVzcCB0MjsKKwlfX3UxNiBCeXRlQ291bnQ7Cit9IFRSQU5TQUNUSU9OMl9GRklSU1RfUlNQOworCit0eXBlZGVmIHN0cnVjdCBzbWJfY29tX3RyYW5zYWN0aW9uMl9mZmlyc3RfcnNwX3Bhcm1zIHsKKwlfX3UxNiBTZWFyY2hIYW5kbGU7CisJX19sZTE2IFNlYXJjaENvdW50OworCV9fbGUxNiBFbmRvZlNlYXJjaDsKKwlfX2xlMTYgRUFFcnJvck9mZnNldDsKKwlfX2xlMTYgTGFzdE5hbWVPZmZzZXQ7Cit9IFQyX0ZGSVJTVF9SU1BfUEFSTVM7CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX2ZuZXh0X3JlcSB7CisJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAxNSAqLworCV9fbGUxNiBUb3RhbFBhcmFtZXRlckNvdW50OworCV9fbGUxNiBUb3RhbERhdGFDb3VudDsKKwlfX2xlMTYgTWF4UGFyYW1ldGVyQ291bnQ7CisJX19sZTE2IE1heERhdGFDb3VudDsKKwlfX3U4IE1heFNldHVwQ291bnQ7CisJX191OCBSZXNlcnZlZDsKKwlfX2xlMTYgRmxhZ3M7CisJX19sZTMyIFRpbWVvdXQ7CisJX191MTYgUmVzZXJ2ZWQyOworCV9fbGUxNiBQYXJhbWV0ZXJDb3VudDsKKwlfX2xlMTYgUGFyYW1ldGVyT2Zmc2V0OworCV9fbGUxNiBEYXRhQ291bnQ7CisJX19sZTE2IERhdGFPZmZzZXQ7CisJX191OCBTZXR1cENvdW50OwkvKiBvbmUgKi8KKwlfX3U4IFJlc2VydmVkMzsKKwlfX2xlMTYgU3ViQ29tbWFuZDsJLyogVFJBTlMyX0ZJTkRfTkVYVCAqLworCV9fbGUxNiBCeXRlQ291bnQ7CisJX191OCBQYWQ7CisJX191MTYgU2VhcmNoSGFuZGxlOworCV9fbGUxNiBTZWFyY2hDb3VudDsKKwlfX2xlMTYgSW5mb3JtYXRpb25MZXZlbDsKKwlfX3UzMiBSZXN1bWVLZXk7CisJX19sZTE2IFNlYXJjaEZsYWdzOworCWNoYXIgUmVzdW1lRmlsZU5hbWVbMV07Cit9IFRSQU5TQUNUSU9OMl9GTkVYVF9SRVE7CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX2ZuZXh0X3JzcCB7CisJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAxMCAqLworCXN0cnVjdCB0cmFuczJfcmVzcCB0MjsKKwlfX3UxNiBCeXRlQ291bnQ7Cit9IFRSQU5TQUNUSU9OMl9GTkVYVF9SU1A7CisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX2ZuZXh0X3JzcF9wYXJtcyB7CisJX19sZTE2IFNlYXJjaENvdW50OworCV9fbGUxNiBFbmRvZlNlYXJjaDsKKwlfX2xlMTYgRUFFcnJvck9mZnNldDsKKwlfX2xlMTYgTGFzdE5hbWVPZmZzZXQ7Cit9IFQyX0ZORVhUX1JTUF9QQVJNUzsKKworLyogUUZTSW5mbyBMZXZlbHMgKi8KKyNkZWZpbmUgU01CX0lORk9fQUxMT0NBVElPTiAgICAgICAgIDEKKyNkZWZpbmUgU01CX0lORk9fVk9MVU1FICAgICAgICAgICAgIDIKKyNkZWZpbmUgU01CX1FVRVJZX0ZTX1ZPTFVNRV9JTkZPICAgIDB4MTAyCisjZGVmaW5lIFNNQl9RVUVSWV9GU19TSVpFX0lORk8gICAgICAweDEwMworI2RlZmluZSBTTUJfUVVFUllfRlNfREVWSUNFX0lORk8gICAgMHgxMDQKKyNkZWZpbmUgU01CX1FVRVJZX0ZTX0FUVFJJQlVURV9JTkZPIDB4MTA1CisjZGVmaW5lIFNNQl9RVUVSWV9DSUZTX1VOSVhfSU5GTyAgICAweDIwMAorI2RlZmluZSBTTUJfUVVFUllfUE9TSVhfRlNfSU5GTyAgICAgMHgyMDEKKyNkZWZpbmUgU01CX1FVRVJZX0xBQkVMX0lORk8gICAgICAgIDB4M2VhCisjZGVmaW5lIFNNQl9RVUVSWV9GU19RVU9UQV9JTkZPICAgICAweDNlZQorI2RlZmluZSBTTUJfUVVFUllfRlNfRlVMTF9TSVpFX0lORk8gMHgzZWYKKyNkZWZpbmUgU01CX1FVRVJZX09CSkVDVElEX0lORk8gICAgIDB4M2YwCisKK3R5cGVkZWYgc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3Fmc2lfcmVxIHsKKwlzdHJ1Y3Qgc21iX2hkciBoZHI7CS8qIHdjdCA9IDE0KyAqLworCV9fbGUxNiBUb3RhbFBhcmFtZXRlckNvdW50OworCV9fbGUxNiBUb3RhbERhdGFDb3VudDsKKwlfX2xlMTYgTWF4UGFyYW1ldGVyQ291bnQ7CisJX19sZTE2IE1heERhdGFDb3VudDsKKwlfX3U4IE1heFNldHVwQ291bnQ7CisJX191OCBSZXNlcnZlZDsKKwlfX2xlMTYgRmxhZ3M7CisJX19sZTMyIFRpbWVvdXQ7CisJX191MTYgUmVzZXJ2ZWQyOworCV9fbGUxNiBQYXJhbWV0ZXJDb3VudDsKKwlfX2xlMTYgUGFyYW1ldGVyT2Zmc2V0OworCV9fbGUxNiBEYXRhQ291bnQ7CisJX19sZTE2IERhdGFPZmZzZXQ7CisJX191OCBTZXR1cENvdW50OworCV9fdTggUmVzZXJ2ZWQzOworCV9fbGUxNiBTdWJDb21tYW5kOwkvKiBvbmUgc2V0dXAgd29yZCAqLworCV9fbGUxNiBCeXRlQ291bnQ7CisJX191OCBQYWQ7CisJX19sZTE2IEluZm9ybWF0aW9uTGV2ZWw7Cit9IFRSQU5TQUNUSU9OMl9RRlNJX1JFUTsKKwordHlwZWRlZiBzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbl9xZnNpX3JzcCB7CisJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAxMCArIFNldHVwQ291bnQgKi8KKwlzdHJ1Y3QgdHJhbnMyX3Jlc3AgdDI7CisJX191MTYgQnl0ZUNvdW50OworCV9fdTggUGFkOwkJLyogbWF5IGJlIHRocmVlIGJ5dGVzICovLyogZm9sbG93ZWQgYnkgZGF0YSBhcmVhICovCit9IFRSQU5TQUNUSU9OMl9RRlNJX1JTUDsKKwordHlwZWRlZiBzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfZ2V0X2Rmc19yZWZlcl9yZXEgeworCXN0cnVjdCBzbWJfaGRyIGhkcjsJLyogd2N0ID0gMTUgKi8KKwlfX2xlMTYgVG90YWxQYXJhbWV0ZXJDb3VudDsKKwlfX2xlMTYgVG90YWxEYXRhQ291bnQ7CisJX19sZTE2IE1heFBhcmFtZXRlckNvdW50OworCV9fbGUxNiBNYXhEYXRhQ291bnQ7CisJX191OCBNYXhTZXR1cENvdW50OworCV9fdTggUmVzZXJ2ZWQ7CisJX19sZTE2IEZsYWdzOworCV9fbGUzMiBUaW1lb3V0OworCV9fdTE2IFJlc2VydmVkMjsKKwlfX2xlMTYgUGFyYW1ldGVyQ291bnQ7CisJX19sZTE2IFBhcmFtZXRlck9mZnNldDsKKwlfX2xlMTYgRGF0YUNvdW50OworCV9fbGUxNiBEYXRhT2Zmc2V0OworCV9fdTggU2V0dXBDb3VudDsKKwlfX3U4IFJlc2VydmVkMzsKKwlfX2xlMTYgU3ViQ29tbWFuZDsJLyogb25lIHNldHVwIHdvcmQgKi8KKwlfX2xlMTYgQnl0ZUNvdW50OworCV9fdTggUGFkWzNdOwkJLyogV2luMksgaGFzIHNlbnQgMHgwRjAxIChtYXggcmVzcCBsZW5ndGggcGVyaGFwcz8pIGZvbGxvd2VkIGJ5IG9uZSBieXRlIHBhZCAtIGRvZXNuJ3Qgc2VlbSB0byBtYXR0ZXIgdGhvdWdoICovCisJX19sZTE2IE1heFJlZmVycmFsTGV2ZWw7CisJY2hhciBSZXF1ZXN0RmlsZU5hbWVbMV07Cit9IFRSQU5TQUNUSU9OMl9HRVRfREZTX1JFRkVSX1JFUTsKKwordHlwZWRlZiBzdHJ1Y3QgZGZzX3JlZmVycmFsX2xldmVsXzMgeworCV9fbGUxNiBWZXJzaW9uTnVtYmVyOworCV9fbGUxNiBSZWZlcnJhbFNpemU7CisJX19sZTE2IFNlcnZlclR5cGU7CS8qIDB4MDAwMSA9IENJRlMgc2VydmVyICovCisJX19sZTE2IFJlZmVycmFsRmxhZ3M7CS8qIG9yIHByb3hpbWl0eSAtIG5vdCBjbGVhciB3aGljaCBzaW5jZSBhbHdheXMgc2V0IHRvIHplcm8gLSBTTklBIHNwZWMgc2F5cyAweDAxIG1lYW5zIHN0cmlwIG9mZiBQYXRoQ29uc3VtZWQgY2hhcnMgYmVmb3JlIHN1Ym1pdHRpbmcgUmVxdWVzdEZpbGVOYW1lIHRvIHJlbW90ZSBub2RlICovCisJX19sZTE2IFRpbWVUb0xpdmU7CisJX19sZTE2IFByb3hpbWl0eTsKKwlfX2xlMTYgRGZzUGF0aE9mZnNldDsKKwlfX2xlMTYgRGZzQWx0ZXJuYXRlUGF0aE9mZnNldDsKKwlfX2xlMTYgTmV0d29ya0FkZHJlc3NPZmZzZXQ7Cit9IFJFRkVSUkFMMzsKKwordHlwZWRlZiBzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbl9nZXRfZGZzX3JlZmVyX3JzcCB7CisJc3RydWN0IHNtYl9oZHIgaGRyOwkvKiB3Y3QgPSAxMCAqLworCXN0cnVjdCB0cmFuczJfcmVzcCB0MjsKKwlfX3UxNiBCeXRlQ291bnQ7CisJX191OCBQYWQ7CisJX19sZTE2IFBhdGhDb25zdW1lZDsKKwlfX2xlMTYgTnVtYmVyT2ZSZWZlcnJhbHM7CisJX19sZTE2IERGU0ZsYWdzOworCV9fdTE2IFBhZDI7CisJUkVGRVJSQUwzIHJlZmVycmFsc1sxXTsJLyogYXJyYXkgb2YgbGV2ZWwgMyBkZnNfcmVmZXJyYWwgc3RydWN0dXJlcyAqLworCS8qIGZvbGxvd2VkIGJ5IHRoZSBzdHJpbmdzIHBvaW50ZWQgdG8gYnkgdGhlIHJlZmVycmFsIHN0cnVjdHVyZXMgKi8KK30gVFJBTlNBQ1RJT04yX0dFVF9ERlNfUkVGRVJfUlNQOworCisvKiBERlMgRmxhZ3MgKi8KKyNkZWZpbmUgREZTUkVGX1JFRkVSUkFMX1NFUlZFUiAgMHgwMDAxCisjZGVmaW5lIERGU1JFRl9TVE9SQUdFX1NFUlZFUiAgIDB4MDAwMgorCisvKiBJT0NUTCBpbmZvcm1hdGlvbiAqLworLyogTGlzdCBvZiBpb2N0bCBmdW5jdGlvbiBjb2RlcyB0aGF0IGxvb2sgdG8gYmUgb2YgaW50ZXJlc3QgdG8gcmVtb3RlIGNsaWVudHMgbGlrZSB0aGlzLiAqLworLyogTmVlZCB0byBkbyBzb21lIGV4cGVyaW1lbnRhdGlvbiB0byBtYWtlIHN1cmUgdGhleSBhbGwgd29yayByZW1vdGVseS4gICAgICAgICAgICAgICAgICAqLworLyogU29tZSBvZiB0aGUgZm9sbG93aW5nIHN1Y2ggYXMgdGhlIGVuY3J5cHRpb24vY29tcHJlc3Npb24gb25lcyB3b3VsZCBiZSAgICAgICAgICAgICAgICAqLworLyogaW52b2tlZCBmcm9tIHRvb2xzIHZpYSBhIHNwZWNpYWxpemVkIGhvb2sgaW50byB0aGUgVkZTIHJhdGhlciB0aGFuIHZpYSB0aGUgICAgICAgICAgICAqLworLyogc3RhbmRhcmQgdmZzIGVudHJ5IHBvaW50cyAqLworI2RlZmluZSBGU0NUTF9SRVFVRVNUX09QTE9DS19MRVZFTF8xIDB4MDAwOTAwMDAKKyNkZWZpbmUgRlNDVExfUkVRVUVTVF9PUExPQ0tfTEVWRUxfMiAweDAwMDkwMDA0CisjZGVmaW5lIEZTQ1RMX1JFUVVFU1RfQkFUQ0hfT1BMT0NLICAgMHgwMDA5MDAwOAorI2RlZmluZSBGU0NUTF9MT0NLX1ZPTFVNRSAgICAgICAgICAgIDB4MDAwOTAwMTgKKyNkZWZpbmUgRlNDVExfVU5MT0NLX1ZPTFVNRSAgICAgICAgICAweDAwMDkwMDFDCisjZGVmaW5lIEZTQ1RMX0dFVF9DT01QUkVTU0lPTiAgICAgICAgMHgwMDA5MDAzQworI2RlZmluZSBGU0NUTF9TRVRfQ09NUFJFU1NJT04gICAgICAgIDB4MDAwOUMwNDAKKyNkZWZpbmUgRlNDVExfUkVRVUVTVF9GSUxURVJfT1BMT0NLICAweDAwMDkwMDhDCisjZGVmaW5lIEZTQ1RMX0ZJTEVTWVNfR0VUX1NUQVRJU1RJQ1MgMHgwMDA5MDA5MAorI2RlZmluZSBGU0NUTF9TRVRfUkVQQVJTRV9QT0lOVCAgICAgIDB4MDAwOTAwQTQKKyNkZWZpbmUgRlNDVExfR0VUX1JFUEFSU0VfUE9JTlQgICAgICAweDAwMDkwMEE4CisjZGVmaW5lIEZTQ1RMX0RFTEVURV9SRVBBUlNFX1BPSU5UICAgMHgwMDA5MDBBQworI2RlZmluZSBGU0NUTF9TRVRfU1BBUlNFICAgICAgICAgICAgIDB4MDAwOTAwQzQKKyNkZWZpbmUgRlNDVExfU0VUX1pFUk9fREFUQSAgICAgICAgICAweDAwMDkwMEM4CisjZGVmaW5lIEZTQ1RMX1NFVF9FTkNSWVBUSU9OICAgICAgICAgMHgwMDA5MDBENworI2RlZmluZSBGU0NUTF9FTkNSWVBUSU9OX0ZTQ1RMX0lPICAgIDB4MDAwOTAwREIKKyNkZWZpbmUgRlNDVExfV1JJVEVfUkFXX0VOQ1JZUFRFRCAgICAweDAwMDkwMERGCisjZGVmaW5lIEZTQ1RMX1JFQURfUkFXX0VOQ1JZUFRFRCAgICAgMHgwMDA5MDBFMworI2RlZmluZSBGU0NUTF9TSVNfQ09QWUZJTEUgICAgICAgICAgIDB4MDAwOTAxMDAKKyNkZWZpbmUgRlNDVExfU0lTX0xJTktfRklMRVMgICAgICAgICAweDAwMDlDMTA0CisKKyNkZWZpbmUgSU9fUkVQQVJTRV9UQUdfTU9VTlRfUE9JTlQgICAweEEwMDAwMDAzCisjZGVmaW5lIElPX1JFUEFSU0VfVEFHX0hTTSAgICAgICAgICAgMHhDMDAwMDAwNAorI2RlZmluZSBJT19SRVBBUlNFX1RBR19TSVMgICAgICAgICAgIDB4ODAwMDAwMDcKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFsbCBzdHJ1Y3RzIGZvciBldmVyeXRoaW5nIGFib3ZlIHRoZSBTTUIgUERVcyB0aGVtc2VsdmVzCisgKiAoc3VjaCBhcyB0aGUgVDIgbGV2ZWwgc3BlY2lmaWMgZGF0YSkgZ28gaGVyZSAgICAgICAgICAgICAgICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qCisgKiBJbmZvcm1hdGlvbiBvbiBhIHNlcnZlcgorICovCisKK3N0cnVjdCBzZXJ2ZXJJbmZvIHsKKwljaGFyIG5hbWVbMTZdOworCXVuc2lnbmVkIGNoYXIgdmVyc2lvbk1ham9yOworCXVuc2lnbmVkIGNoYXIgdmVyc2lvbk1pbm9yOworCXVuc2lnbmVkIGxvbmcgdHlwZTsKKwl1bnNpZ25lZCBpbnQgY29tbWVudE9mZnNldDsKK307CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpcyB0aGUgZm9ybWF0IG9mIHRoZSBkYXRhIHJldHVybmVkIG9uIGEgTmV0U2hhcmVFbnVtCisgKiB3aXRoIGxldmVsICI5MCIgKHg1QSkKKyAqLworCitzdHJ1Y3Qgc2hhcmVJbmZvIHsKKwljaGFyIHNoYXJlTmFtZVsxM107CisJY2hhciBwYWQ7CisJdW5zaWduZWQgc2hvcnQgdHlwZTsKKwl1bnNpZ25lZCBpbnQgY29tbWVudE9mZnNldDsKK307CisKK3N0cnVjdCBhbGlhc0luZm8geworCWNoYXIgYWxpYXNOYW1lWzldOworCWNoYXIgcGFkOworCXVuc2lnbmVkIGludCBjb21tZW50T2Zmc2V0OworCXVuc2lnbmVkIGNoYXIgdHlwZVsyXTsKK307CisKK3N0cnVjdCBhbGlhc0luZm85MiB7CisJaW50IGFsaWFzTmFtZU9mZnNldDsKKwlpbnQgc2VydmVyTmFtZU9mZnNldDsKKwlpbnQgc2hhcmVOYW1lT2Zmc2V0OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCV9fbGU2NCBUb3RhbEFsbG9jYXRpb25Vbml0czsKKwlfX2xlNjQgRnJlZUFsbG9jYXRpb25Vbml0czsKKwlfX2xlMzIgU2VjdG9yc1BlckFsbG9jYXRpb25Vbml0OworCV9fbGUzMiBCeXRlc1BlclNlY3RvcjsKK30gRklMRV9TWVNURU1fSU5GTzsJCS8qIHNpemUgaW5mbywgbGV2ZWwgMHgxMDMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCV9fbGUxNiBNYWpvclZlcnNpb25OdW1iZXI7CisJX19sZTE2IE1pbm9yVmVyc2lvbk51bWJlcjsKKwlfX2xlNjQgQ2FwYWJpbGl0eTsKK30gRklMRV9TWVNURU1fVU5JWF9JTkZPOwkvKiBVbml4IGV4dGVuc2lvbnMgaW5mbywgbGV2ZWwgMHgyMDAgKi8KKy8qIExpbnV4L1VuaXggZXh0ZW5zaW9ucyBjYXBhYmlsaXR5IGZsYWdzICovCisjZGVmaW5lIENJRlNfVU5JWF9GQ05UTF9DQVAgICAgICAgICAgICAgMHgwMDAwMDAwMSAvKiBzdXBwb3J0IGZvciBmY250bCBsb2NrcyAqLworI2RlZmluZSBDSUZTX1VOSVhfUE9TSVhfQUNMX0NBUCAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgQ0lGU19VTklYX1hBVFRSX0NBUCAgICAgICAgICAgICAweDAwMDAwMDA0IC8qc3VwcG9ydCBmb3IgbmV3IG5hbWVzcGFjZSovCisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBGb3IgdW5kZWZpbmVkIHJlY29tbWVuZGVkIHRyYW5zZmVyIHNpemUgcmV0dXJuIC0xIGluIHRoYXQgZmllbGQgKi8KKwlfX2xlMzIgT3B0aW1hbFRyYW5zZmVyU2l6ZTsgIC8qIGJzaXplIG9uIHNvbWUgb3MsIGlvc2l6ZSBvbiBvdGhlciBvcyAqLworCV9fbGUzMiBCbG9ja1NpemU7IAorICAgIC8qIFRoZSBuZXh0IHRocmVlIGZpZWxkcyBhcmUgaW4gdGVybXMgb2YgdGhlIGJsb2NrIHNpemUuCisJKGFib3ZlKS4gSWYgYmxvY2sgc2l6ZSBpcyB1bmtub3duLCA0MDk2IHdvdWxkIGJlIGEKKwlyZWFzb25hYmxlIGJsb2NrIHNpemUgZm9yIGEgc2VydmVyIHRvIHJlcG9ydC4gCisJTm90ZSB0aGF0IHJldHVybmluZyB0aGUgYmxvY2tzL2Jsb2Nrc2F2YWlsIHJlbW92ZXMgbmVlZAorCXRvIG1ha2UgYSBzZWNvbmQgY2FsbCAodG8gUUZTSW5mbyBsZXZlbCAweDEwMyB0byBnZXQgdGhpcyBpbmZvLgorCVVzZXJCbG9ja0F2YWlsIGlzIHR5cGljYWxseSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gQmxvY2tzQXZhaWwsCisJaWYgbm8gZGlzdGluY3Rpb24gaXMgbWFkZSByZXR1cm4gdGhlIHNhbWUgdmFsdWUgaW4gZWFjaCAqLworCV9fbGU2NCBUb3RhbEJsb2NrczsKKwlfX2xlNjQgQmxvY2tzQXZhaWw7ICAgICAgIC8qIGJmcmVlICovCisJX19sZTY0IFVzZXJCbG9ja3NBdmFpbDsgICAvKiBiYXZhaWwgKi8KKyAgICAvKiBGb3IgdW5kZWZpbmVkIE5vZGUgZmllbGRzIG9yIEZTSUQgcmV0dXJuIC0xICovCisJX19sZTY0IFRvdGFsRmlsZU5vZGVzOworCV9fbGU2NCBGcmVlRmlsZU5vZGVzOworCV9fbGU2NCBGaWxlU3lzSWRlbnRpZmllcjsgICAvKiBmc2lkICovCisJLyogTkIgTmFtZWxlbiBjb21lcyBmcm9tIEZJTEVfU1lTVEVNX0FUVFJJQlVURV9JTkZPIGNhbGwgKi8KKwkvKiBOQiBmbGFncyBjYW4gY29tZSBmcm9tIEZJTEVfU1lTVEVNX0RFVklDRV9JTkZPIGNhbGwgICAqLworfSBGSUxFX1NZU1RFTV9QT1NJWF9JTkZPOworCisvKiBEZXZpY2VUeXBlIEZsYWdzICovCisjZGVmaW5lIEZJTEVfREVWSUNFX0NEX1JPTSAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBGSUxFX0RFVklDRV9DRF9ST01fRklMRV9TWVNURU0gIDB4MDAwMDAwMDMKKyNkZWZpbmUgRklMRV9ERVZJQ0VfREZTICAgICAgICAgICAgICAgICAweDAwMDAwMDA2CisjZGVmaW5lIEZJTEVfREVWSUNFX0RJU0sgICAgICAgICAgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSBGSUxFX0RFVklDRV9ESVNLX0ZJTEVfU1lTVEVNICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgRklMRV9ERVZJQ0VfRklMRV9TWVNURU0gICAgICAgICAweDAwMDAwMDA5CisjZGVmaW5lIEZJTEVfREVWSUNFX05BTUVEX1BJUEUgICAgICAgICAgMHgwMDAwMDAxMQorI2RlZmluZSBGSUxFX0RFVklDRV9ORVRXT1JLICAgICAgICAgICAgIDB4MDAwMDAwMTIKKyNkZWZpbmUgRklMRV9ERVZJQ0VfTkVUV09SS19GSUxFX1NZU1RFTSAweDAwMDAwMDE0CisjZGVmaW5lIEZJTEVfREVWSUNFX05VTEwgICAgICAgICAgICAgICAgMHgwMDAwMDAxNQorI2RlZmluZSBGSUxFX0RFVklDRV9QQVJBTExFTF9QT1JUICAgICAgIDB4MDAwMDAwMTYKKyNkZWZpbmUgRklMRV9ERVZJQ0VfUFJJTlRFUiAgICAgICAgICAgICAweDAwMDAwMDE4CisjZGVmaW5lIEZJTEVfREVWSUNFX1NFUklBTF9QT1JUICAgICAgICAgMHgwMDAwMDAxYgorI2RlZmluZSBGSUxFX0RFVklDRV9TVFJFQU1TICAgICAgICAgICAgIDB4MDAwMDAwMWUKKyNkZWZpbmUgRklMRV9ERVZJQ0VfVEFQRSAgICAgICAgICAgICAgICAweDAwMDAwMDFmCisjZGVmaW5lIEZJTEVfREVWSUNFX1RBUEVfRklMRV9TWVNURU0gICAgMHgwMDAwMDAyMAorI2RlZmluZSBGSUxFX0RFVklDRV9WSVJUVUFMX0RJU0sgICAgICAgIDB4MDAwMDAwMjQKKyNkZWZpbmUgRklMRV9ERVZJQ0VfTkVUV09SS19SRURJUkVDVE9SICAweDAwMDAwMDI4CisKK3R5cGVkZWYgc3RydWN0IHsKKwlfX2xlMzIgRGV2aWNlVHlwZTsKKwlfX2xlMzIgRGV2aWNlQ2hhcmFjdGVyaXN0aWNzOworfSBGSUxFX1NZU1RFTV9ERVZJQ0VfSU5GTzsJLyogZGV2aWNlIGluZm8sIGxldmVsIDB4MTA0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwlfX2xlMzIgQXR0cmlidXRlczsKKwlfX2xlMzIgTWF4UGF0aE5hbWVDb21wb25lbnRMZW5ndGg7CisJX19sZTMyIEZpbGVTeXN0ZW1OYW1lTGVuOworCWNoYXIgRmlsZVN5c3RlbU5hbWVbNTJdOyAvKiBkbyBub3QgcmVhbGx5IG5lZWQgdG8gc2F2ZSB0aGlzIC0gc28gcG90ZW50aWFsbHkgZ2V0IG9ubHkgc3Vic2V0IG9mIG5hbWUgKi8KK30gRklMRV9TWVNURU1fQVRUUklCVVRFX0lORk87CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBRdWVyeUZpbGVJbmZvL1F1ZXJ5UGF0aGluZm8gKGFsc28gZm9yIFNldFBhdGgvU2V0RmlsZSkgZGF0YSBidWZmZXIgZm9ybWF0cyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IHsgLyogZGF0YSBibG9jayBlbmNvZGluZyBvZiByZXNwb25zZSB0byBsZXZlbCAyNjMgUVBhdGhJbmZvICovCisJX19sZTY0IENyZWF0aW9uVGltZTsKKwlfX2xlNjQgTGFzdEFjY2Vzc1RpbWU7CisJX19sZTY0IExhc3RXcml0ZVRpbWU7CisJX19sZTY0IENoYW5nZVRpbWU7CisJX19sZTMyIEF0dHJpYnV0ZXM7CisJX191MzIgUGFkMTsKKwlfX2xlNjQgQWxsb2NhdGlvblNpemU7CisJX19sZTY0IEVuZE9mRmlsZTsJLyogc2l6ZSBpZSBvZmZzZXQgdG8gZmlyc3QgZnJlZSBieXRlIGluIGZpbGUgKi8KKwlfX2xlMzIgTnVtYmVyT2ZMaW5rczsJLyogaGFyZCBsaW5rcyAqLworCV9fdTggRGVsZXRlUGVuZGluZzsKKwlfX3U4IERpcmVjdG9yeTsKKwlfX3UxNiBQYWQyOworCV9fdTY0IEluZGV4TnVtYmVyOworCV9fbGUzMiBFQVNpemU7CisJX19sZTMyIEFjY2Vzc0ZsYWdzOworCV9fdTY0IEluZGV4TnVtYmVyMTsKKwlfX2xlNjQgQ3VycmVudEJ5dGVPZmZzZXQ7CisJX19sZTMyIE1vZGU7CisJX19sZTMyIEFsaWdubWVudFJlcXVpcmVtZW50OworCV9fbGUzMiBGaWxlTmFtZUxlbmd0aDsKKwljaGFyIEZpbGVOYW1lWzFdOworfSBGSUxFX0FMTF9JTkZPOwkJLyogbGV2ZWwgMHgxMDcgUVBhdGhJbmZvICovCisKKy8qIGRlZmluZXMgZm9yIGVudW1lcmF0aW5nIHBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgVW5peCB0eXBlIGZpZWxkIGJlbG93ICovCisjZGVmaW5lIFVOSVhfRklMRSAgICAgIDAKKyNkZWZpbmUgVU5JWF9ESVIgICAgICAgMQorI2RlZmluZSBVTklYX1NZTUxJTksgICAyCisjZGVmaW5lIFVOSVhfQ0hBUkRFViAgIDMKKyNkZWZpbmUgVU5JWF9CTE9DS0RFViAgNAorI2RlZmluZSBVTklYX0ZJRk8gICAgICA1CisjZGVmaW5lIFVOSVhfU09DS0VUICAgIDYKK3R5cGVkZWYgc3RydWN0IHsKKwlfX2xlNjQgRW5kT2ZGaWxlOworCV9fbGU2NCBOdW1PZkJ5dGVzOworCV9fbGU2NCBMYXN0U3RhdHVzQ2hhbmdlOyAvKlNOSUEgc3BlY3MgRENFIHRpbWUgZm9yIHRoZSAzIHRpbWUgZmllbGRzICovCisJX19sZTY0IExhc3RBY2Nlc3NUaW1lOworCV9fbGU2NCBMYXN0TW9kaWZpY2F0aW9uVGltZTsKKwlfX2xlNjQgVWlkOworCV9fbGU2NCBHaWQ7CisJX19sZTMyIFR5cGU7CisJX19sZTY0IERldk1ham9yOworCV9fbGU2NCBEZXZNaW5vcjsKKwlfX3U2NCBVbmlxdWVJZDsKKwlfX2xlNjQgUGVybWlzc2lvbnM7CisJX19sZTY0IE5saW5rczsKK30gRklMRV9VTklYX0JBU0lDX0lORk87CQkvKiBsZXZlbCAweDIwMCBRUGF0aEluZm8gKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCWNoYXIgTGlua0Rlc3RbMV07Cit9IEZJTEVfVU5JWF9MSU5LX0lORk87CQkvKiBsZXZlbCAweDIwMSBRUGF0aEluZm8gKi8KKworLyogVGhlIGZvbGxvd2luZyB0aHJlZSBzdHJ1Y3R1cmVzIGFyZSBuZWVkZWQgb25seSBmb3IKKwlzZXR0aW5nIHRpbWUgdG8gTlQ0IGFuZCBzb21lIG9sZGVyIHNlcnZlcnMgdmlhCisJdGhlIHByaW1pdGl2ZSBET1MgdGltZSBmb3JtYXQgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlfX3UxNiBEYXk6NTsKKwlfX3UxNiBNb250aDo0OworCV9fdTE2IFllYXI6NzsKK30gU01CX0RBVEU7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlfX3UxNiBUd29TZWNvbmRzOjU7CisJX191MTYgTWludXRlczo2OworCV9fdTE2IEhvdXJzOjU7Cit9IFNNQl9USU1FOworCit0eXBlZGVmIHN0cnVjdCB7CisJX19sZTE2IENyZWF0aW9uRGF0ZTsgLyogU01CIERhdGUgc2VlIGFib3ZlICovCisJX19sZTE2IENyZWF0aW9uVGltZTsgLyogU01CIFRpbWUgKi8KKwlfX2xlMTYgTGFzdEFjY2Vzc0RhdGU7CisJX19sZTE2IExhc3RBY2Nlc3NUaW1lOworCV9fbGUxNiBMYXN0V3JpdGVEYXRlOworCV9fbGUxNiBMYXN0V3JpdGVUaW1lOworCV9fbGUzMiBEYXRhU2l6ZTsgLyogRmlsZSBTaXplIChFT0YpICovCisJX19sZTMyIEFsbG9jYXRpb25TaXplOworCV9fbGUxNiBBdHRyaWJ1dGVzOyAvKiB2ZXJpZnkgbm90IHUzMiAqLworCV9fbGUzMiBFQVNpemU7Cit9IEZJTEVfSU5GT19TVEFOREFSRDsgIC8qIGxldmVsIDEgU2V0UGF0aC9GaWxlSW5mbyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJX19sZTY0IENyZWF0aW9uVGltZTsKKwlfX2xlNjQgTGFzdEFjY2Vzc1RpbWU7CisJX19sZTY0IExhc3RXcml0ZVRpbWU7CisJX19sZTY0IENoYW5nZVRpbWU7CisJX19sZTMyIEF0dHJpYnV0ZXM7CisJX191MzIgUGFkOworfSBGSUxFX0JBU0lDX0lORk87CQkvKiBzaXplIGluZm8sIGxldmVsIDB4MTAxICovCisKK3N0cnVjdCBmaWxlX2FsbG9jYXRpb25faW5mbyB7CisJX19sZTY0IEFsbG9jYXRpb25TaXplOyAvKiBOb3RlIG9sZCBTYW1iYSBzcnZyIHJvdW5kcyB0aGlzIHVwIHRvbyBtdWNoICovCit9OwkvKiBzaXplIHVzZWQgb24gZGlzaywgbGV2ZWwgMHgxMDMgZm9yIHNldCwgMHgxMDUgZm9yIHF1ZXJ5ICovCisKK3N0cnVjdCBmaWxlX2VuZF9vZl9maWxlX2luZm8geworCV9fbGU2NCBGaWxlU2l6ZTsJCS8qIG9mZnNldCB0byBlbmQgb2YgZmlsZSAqLworfTsJLyogc2l6ZSBpbmZvLCBsZXZlbCAweDEwNCBmb3Igc2V0LCAweDEwNiBmb3IgcXVlcnkgKi8KKworc3RydWN0IGZpbGVfYWx0X25hbWVfaW5mbyB7CisJX191OCAgIGFsdF9uYW1lWzFdOworfTsgICAgICAvKiBsZXZlbCAweDAxMDggKi8KKworc3RydWN0IGZpbGVfc3RyZWFtX2luZm8geworCV9fbGUzMiBudW1iZXJfb2Zfc3RyZWFtczsgIC8qIEJCIGNoZWNrIHNpemVzIGFuZCB2ZXJpZnkgbG9jYXRpb24gKi8KKwkvKiBmb2xsb3dlZCBieSBpbmZvIG9uIHN0cmVhbXMgdGhlbXNlbHZlcyAKKwkJdTY0IHNpemU7CisJCXU2NCBhbGxvY2F0aW9uX3NpemUgCisJCXN0cmVhbSBpbmZvICovCit9OyAgICAgIC8qIGxldmVsIDB4MTA5ICovCisKK3N0cnVjdCBmaWxlX2NvbXByZXNzaW9uX2luZm8geworCV9fbGU2NCBjb21wcmVzc2VkX3NpemU7CisJX19sZTE2IGZvcm1hdDsKKwlfX3U4ICAgdW5pdF9zaGlmdDsKKwlfX3U4ICAgY2hfc2hpZnQ7CisJX191OCAgIGNsX3NoaWZ0OworCV9fdTggICBwYWRbM107Cit9OyAgICAgIC8qIGxldmVsIDB4MTBiICovCisKKy8qIFBPU0lYIEFDTCBzZXQvcXVlcnkgcGF0aCBpbmZvIHN0cnVjdHVyZXMgKi8KKyNkZWZpbmUgQ0lGU19BQ0xfVkVSU0lPTiAxCitzdHJ1Y3QgY2lmc19wb3NpeF9hY2UgeyAvKiBhY2Nlc3MgY29udHJvbCBlbnRyeSAoQUNFKSAqLworCV9fdTggIGNpZnNfZV90YWc7CisJX191OCAgY2lmc19lX3Blcm07CisJX19sZTY0IGNpZnNfdWlkOyAvKiBvciBnaWQgKi8KK307IAorCitzdHJ1Y3QgY2lmc19wb3NpeF9hY2wgeyAvKiBhY2Nlc3MgY29ucm9sIGxpc3QgIChBQ0wpICovCisJX19sZTE2CXZlcnNpb247CisJX19sZTE2CWFjY2Vzc19lbnRyeV9jb3VudDsgIC8qIGFjY2VzcyBBQ0wgLSBjb3VudCBvZiBlbnRyaWVzICovCisJX19sZTE2CWRlZmF1bHRfZW50cnlfY291bnQ7IC8qIGRlZmF1bHQgQUNMIC0gY291bnQgb2YgZW50cmllcyAqLworCXN0cnVjdCBjaWZzX3Bvc2l4X2FjZSBhY2VfYXJyYXlbMF07CisJLyogZm9sbG93ZWQgYnkKKwlzdHJ1Y3QgY2lmc19wb3NpeF9hY2UgZGVmYXVsdF9hY2VfYXJyYWF5W10gKi8KK307ICAvKiBsZXZlbCAweDIwNCAqLworCisvKiB0eXBlcyBvZiBhY2Nlc3MgY29udHJvbCBlbnRyaWVzIGFscmVhZHkgZGVmaW5lZCBpbiBwb3NpeF9hY2wuaCAqLworLyogI2RlZmluZSBDSUZTX1BPU0lYX0FDTF9VU0VSX09CSgkgMHgwMQorI2RlZmluZSBDSUZTX1BPU0lYX0FDTF9VU0VSICAgICAgMHgwMgorI2RlZmluZSBDSUZTX1BPU0lYX0FDTF9HUk9VUF9PQkogMHgwNAorI2RlZmluZSBDSUZTX1BPU0lYX0FDTF9HUk9VUCAgICAgMHgwOAorI2RlZmluZSBDSUZTX1BPU0lYX0FDTF9NQVNLICAgICAgMHgxMAorI2RlZmluZSBDSUZTX1BPU0lYX0FDTF9PVEhFUiAgICAgMHgyMCAqLworCisvKiB0eXBlcyBvZiBwZXJtcyAqLworLyogI2RlZmluZSBDSUZTX1BPU0lYX0FDTF9FWEVDVVRFICAgMHgwMQorI2RlZmluZSBDSUZTX1BPU0lYX0FDTF9XUklURSAgICAgMHgwMgorI2RlZmluZSBDSUZTX1BPU0lYX0FDTF9SRUFECSAgICAgMHgwNCAqLworCisvKiBlbmQgb2YgUE9TSVggQUNMIGRlZmluaXRpb25zICovCisKK3N0cnVjdCBmaWxlX2ludGVybmFsX2luZm8geworCV9fdTY0ICBVbmlxdWVJZDsgLyogaW5vZGUgbnVtYmVyICovCit9OyAgICAgIC8qIGxldmVsIDB4M2VlICovCitzdHJ1Y3QgZmlsZV9tb2RlX2luZm8geworCV9fbGUzMglNb2RlOworfTsgICAgICAvKiBsZXZlbCAweDNmOCAqLworCitzdHJ1Y3QgZmlsZV9hdHRyaWJfdGFnIHsKKwlfX2xlMzIgQXR0cmlidXRlOworCV9fbGUzMiBSZXBhcnNlVGFnOworfTsgICAgICAvKiBsZXZlbCAweDQwYiAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBGaW5kRmlyc3QvRmluZE5leHQgdHJhbnNhY3QyIGRhdGEgYnVmZmVyIGZvcm1hdHMgICAgKi8gCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHsKKwlfX2xlMzIgTmV4dEVudHJ5T2Zmc2V0OworCV9fdTMyIFJlc3VtZUtleTsgLyogYXMgd2l0aCBGaWxlSW5kZXggLSBubyBuZWVkIHRvIGNvbnZlcnQgKi8KKwlfX2xlNjQgRW5kT2ZGaWxlOworCV9fbGU2NCBOdW1PZkJ5dGVzOworCV9fbGU2NCBMYXN0U3RhdHVzQ2hhbmdlOyAvKlNOSUEgc3BlY3MgRENFIHRpbWUgZm9yIHRoZSAzIHRpbWUgZmllbGRzICovCisJX19sZTY0IExhc3RBY2Nlc3NUaW1lOworCV9fbGU2NCBMYXN0TW9kaWZpY2F0aW9uVGltZTsKKwlfX2xlNjQgVWlkOworCV9fbGU2NCBHaWQ7CisJX19sZTMyIFR5cGU7CisJX19sZTY0IERldk1ham9yOworCV9fbGU2NCBEZXZNaW5vcjsKKwlfX3U2NCBVbmlxdWVJZDsKKwlfX2xlNjQgUGVybWlzc2lvbnM7CisJX19sZTY0IE5saW5rczsKKwljaGFyIEZpbGVOYW1lWzFdOworfSBGSUxFX1VOSVhfSU5GTzsgLyogbGV2ZWwgMHgyMDIgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCV9fbGUzMiBOZXh0RW50cnlPZmZzZXQ7CisJX191MzIgRmlsZUluZGV4OworCV9fbGU2NCBDcmVhdGlvblRpbWU7CisJX19sZTY0IExhc3RBY2Nlc3NUaW1lOworCV9fbGU2NCBMYXN0V3JpdGVUaW1lOworCV9fbGU2NCBDaGFuZ2VUaW1lOworCV9fbGU2NCBFbmRPZkZpbGU7CisJX19sZTY0IEFsbG9jYXRpb25TaXplOworCV9fbGUzMiBFeHRGaWxlQXR0cmlidXRlczsKKwlfX2xlMzIgRmlsZU5hbWVMZW5ndGg7CisJY2hhciBGaWxlTmFtZVsxXTsKK30gRklMRV9ESVJFQ1RPUllfSU5GTzsgICAvKiBsZXZlbCAweDEwMSBGRiByZXNwb25zZSBkYXRhIGFyZWEgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCV9fbGUzMiBOZXh0RW50cnlPZmZzZXQ7CisJX191MzIgRmlsZUluZGV4OworCV9fbGU2NCBDcmVhdGlvblRpbWU7CisJX19sZTY0IExhc3RBY2Nlc3NUaW1lOworCV9fbGU2NCBMYXN0V3JpdGVUaW1lOworCV9fbGU2NCBDaGFuZ2VUaW1lOworCV9fbGU2NCBFbmRPZkZpbGU7CisJX19sZTY0IEFsbG9jYXRpb25TaXplOworCV9fbGUzMiBFeHRGaWxlQXR0cmlidXRlczsKKwlfX2xlMzIgRmlsZU5hbWVMZW5ndGg7CisJX19sZTMyIEVhU2l6ZTsgLyogbGVuZ3RoIG9mIHRoZSB4YXR0cnMgKi8KKwljaGFyIEZpbGVOYW1lWzFdOworfSBGSUxFX0ZVTExfRElSRUNUT1JZX0lORk87ICAgLyogbGV2ZWwgMHgxMDIgRkYgcmVzcG9uc2UgZGF0YSBhcmVhICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwlfX2xlMzIgTmV4dEVudHJ5T2Zmc2V0OworCV9fdTMyIEZpbGVJbmRleDsKKwlfX2xlNjQgQ3JlYXRpb25UaW1lOworCV9fbGU2NCBMYXN0QWNjZXNzVGltZTsKKwlfX2xlNjQgTGFzdFdyaXRlVGltZTsKKwlfX2xlNjQgQ2hhbmdlVGltZTsKKwlfX2xlNjQgRW5kT2ZGaWxlOworCV9fbGU2NCBBbGxvY2F0aW9uU2l6ZTsKKwlfX2xlMzIgRXh0RmlsZUF0dHJpYnV0ZXM7CisJX19sZTMyIEZpbGVOYW1lTGVuZ3RoOworCV9fbGUzMiBFYVNpemU7IC8qIEVBIHNpemUgKi8KKwlfX2xlMzIgUmVzZXJ2ZWQ7CisJX191NjQgVW5pcXVlSWQ7IC8qIGlub2RlIG51bSAtIGxlIHNpbmNlIFNhbWJhIHB1dHMgaW5vIGluIGxvdyAzMiBiaXQqLworCWNoYXIgRmlsZU5hbWVbMV07Cit9IFNFQVJDSF9JRF9GVUxMX0RJUl9JTkZPOyAgIC8qIGxldmVsIDB4MTA1IEZGIHJlc3BvbnNlIGRhdGEgYXJlYSAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJX19sZTMyIE5leHRFbnRyeU9mZnNldDsKKwlfX3UzMiBGaWxlSW5kZXg7CisJX19sZTY0IENyZWF0aW9uVGltZTsKKwlfX2xlNjQgTGFzdEFjY2Vzc1RpbWU7CisJX19sZTY0IExhc3RXcml0ZVRpbWU7CisJX19sZTY0IENoYW5nZVRpbWU7CisJX19sZTY0IEVuZE9mRmlsZTsKKwlfX2xlNjQgQWxsb2NhdGlvblNpemU7CisJX19sZTMyIEV4dEZpbGVBdHRyaWJ1dGVzOworCV9fbGUzMiBGaWxlTmFtZUxlbmd0aDsgCisJX19sZTMyIEVhU2l6ZTsgLyogbGVuZ3RoIG9mIHRoZSB4YXR0cnMgKi8KKwlfX3U4ICAgU2hvcnROYW1lTGVuZ3RoOworCV9fdTggICBSZXNlcnZlZDsKKwlfX3U4ICAgU2hvcnROYW1lWzEyXTsKKwljaGFyIEZpbGVOYW1lWzFdOworfSBGSUxFX0JPVEhfRElSRUNUT1JZX0lORk87ICAgLyogbGV2ZWwgMHgxMDQgRkYgcmVzcG9uc2UgZGF0YSBhcmVhICovCisKKworc3RydWN0IGdlYSB7CisJdW5zaWduZWQgY2hhciBuYW1lX2xlbjsKKwljaGFyIG5hbWVbMV07Cit9OworCitzdHJ1Y3QgZ2VhbGlzdCB7CisJdW5zaWduZWQgbG9uZyBsaXN0X2xlbjsKKwlzdHJ1Y3QgZ2VhIGxpc3RbMV07Cit9OworCitzdHJ1Y3QgZmVhIHsKKwl1bnNpZ25lZCBjaGFyIEVBX2ZsYWdzOworCV9fdTggbmFtZV9sZW47CisJX19sZTE2IHZhbHVlX2xlbjsKKwljaGFyIG5hbWVbMV07CisJLyogb3B0aW9uYWxseSBmb2xsb3dlZCBieSB2YWx1ZSAqLworfTsKKy8qIGZsYWdzIGZvciBfRkVBLmZFQSAqLworI2RlZmluZSBGRUFfTkVFREVBICAgICAgICAgMHg4MAkvKiBuZWVkIEVBIGJpdCAqLworCitzdHJ1Y3QgZmVhbGlzdCB7CisJX19sZTMyIGxpc3RfbGVuOworCXN0cnVjdCBmZWEgbGlzdFsxXTsKK307CisKKy8qIHVzZWQgdG8gaG9sZCBhbiBhcmJpdHJhcnkgYmxvYiBvZiBkYXRhICovCitzdHJ1Y3QgZGF0YV9ibG9iIHsKKwlfX3U4ICpkYXRhOworCXNpemVfdCBsZW5ndGg7CisJdm9pZCAoKmZyZWUpIChzdHJ1Y3QgZGF0YV9ibG9iICogZGF0YV9ibG9iKTsKK307CisKKworI2lmZGVmIENPTkZJR19DSUZTX1BPU0lYCisvKiAKKwlGb3IgYmV0dGVyIFBPU0lYIHNlbWFudGljcyBmcm9tIExpbnV4IGNsaWVudCwgKGV2ZW4gYmV0dGVyCisJdGhhbiB0aGUgZXhpc3RpbmcgQ0lGUyBVbml4IEV4dGVuc2lvbnMpIHdlIG5lZWQgdXBkYXRlZCBQRFVzIGZvcjoKKwkKKwkxKSBQb3NpeENyZWF0ZVggLSB0byBzZXQgYW5kIHJldHVybiB0aGUgbW9kZSwgaW5vZGUjLCBkZXZpY2UgaW5mbyBhbmQKKwlwZXJoYXBzIGFkZCBhIENyZWF0ZURldmljZSAtIHRvIGNyZWF0ZSBQaXBlcyBhbmQgb3RoZXIgc3BlY2lhbCAuaW5vZGVzCisJQWxzbyBub3RlIFBPU0lYIG9wZW4gZmxhZ3MKKwkyKSBDbG9zZSAtIHRvIHJldHVybiB0aGUgbGFzdCB3cml0ZSB0aW1lIHRvIGRvIGNhY2hlIGFjcm9zcyBjbG9zZSBtb3JlIHNhZmVseQorCTMpIFBvc2l4UUZTSW5mbyAtIHRvIHJldHVybiBzdGF0ZnMgaW5mbworCTQpIEZpbmRGaXJzdCByZXR1cm4gdW5pcXVlIGlub2RlIG51bWJlciAtIHdoYXQgYWJvdXQgcmVzdW1lIGtleSwgdHdvIGZvcm1zIHNob3J0IChtYXRjaGVzIHJlYWRkaXIpIGFuZCBmdWxsIChlbm91Z2ggaW5mbyB0byBjYWNoZSBpbm9kZXMpCisJNSkgTWtkaXIgLSBzZXQgbW9kZQorCQorCUFuZCB1bmRlciBjb25zaWRlcmF0aW9uOiAKKwk2KSBGaW5kQ2xvc2UyIChyZXR1cm4gbmFub3NlY29uZCB0aW1lc3RhbXAgPz8pCisJNykgVXNlIG5hbm9zZWNvbmQgdGltZXN0YW1wcyB0aHJvdWdob3V0IGFsbCB0aW1lIGZpZWxkcyBpZiAKKwkgICBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSBmbGFnIGlzIHNldAorCTgpIHNlbmRmaWxlIC0gaGFuZGxlIGJhc2VkIGNvcHkKKwk5KSBEaXJlY3QgaS9vCisJMTApICJQT1NJWCBBQ0wiIHN1cHBvcnQKKwkxMSkgTWlzYyBmY250bHM/CisJCisJd2hhdCBhYm91dCBmaXhpbmcgNjQgYml0IGFsaWdubWVudAorCQorCVRoZXJlIGFyZSBhbHNvIHZhcmlvdXMgbGVnYWN5IFNNQi9DSUZTIHJlcXVlc3RzIHVzZWQgYXMgaXMKKwkKKwlGcm9tIGV4aXN0aW5nIExhbm1hbiBhbmQgTlRMTSBkaWFsZWN0czoKKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCU5FR09USUFURQorCVNFU1NJT05fU0VUVVBfQU5EWCAoQkIgd2hpY2g/KQorCVRSRUVfQ09OTkVDVF9BTkRYIChCQiB3aGljaCB3Y3Q/KQorCVRSRUVfRElTQ09OTkVDVCAoQkIgYWRkIHZvbHVtZSB0aW1lc3RhbXAgb24gcmVzcG9uc2UpCisJTE9HT0ZGX0FORFgKKwlERUxFVEUgKG5vdGUgZGVsZXRlIG9wZW4gZmlsZSBiZWhhdmlvcikKKwlERUxFVEVfRElSRUNUT1JZCisJUkVBRF9BTkRfWAorCVdSSVRFX0FORF9YCisJTE9DS0lOR19BTkRfWCAobm90ZSBwb3NpeCBsb2NrIHNlbWFudGljcykKKwlSRU5BTUUgKG5vdGUgcmVuYW1lIGFjcm9zcyBkaXJzIGFuZCBvcGVuIGZpbGUgcmVuYW1lIHBvc2l4IGJlaGF2aW9ycykKKwlOVF9SRU5BTUUgKGZvciBoYXJkbGlua3MpIElzIHRoaXMgZ29vZCBlbm91Z2ggZm9yIGFsbCBmZWF0dXJlcz8KKwlGSU5EX0NMT1NFMgorCVRSQU5TQUNUSU9OMiAoMTggY2FzZXMpCisJCVNNQl9TRVRfRklMRV9FTkRfT0ZfRklMRV9JTkZPMiBTTUJfU0VUX1BBVEhfRU5EX09GX0ZJTEVfSU5GTzIKKwkJKEJCIHZlcmlmeSB0aGF0IG5ldmVyIG5lZWQgdG8gc2V0IGFsbG9jYXRpb24gc2l6ZSkKKwkJU01CX1NFVF9GSUxFX0JBU0lDX0lORk8yIChzZXR0aW5nIHRpbWVzIC0gQkIgY2FuIGl0IGJlIGRvbmUgdmlhIFVuaXggZXh0PykKKwkKKwlDT1BZIChub3RlIHN1cHBvcnQgZm9yIGNvcHkgYWNyb3NzIGRpcmVjdG9yaWVzKSAtIEZVVFVSRSwgT1BUSU9OQUwKKwlzZXR0aW5nL2dldHRpbmcgT1MvMiBFQXMgLSBGVVRVUkUgKEJCIGNhbiB0aGlzIGhhbmRsZQorCXNldHRpbmcgTGludXggeGF0dHJzIHBlcmZlY3RseSkgICAgICAgICAtIE9QVElPTkFMCisJZG5vdGlmeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gRlVUVVJFLCBPUFRJT05BTAorCXF1b3RhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIEZVVFVSRSwgT1BUSU9OQUwKKwkJCQorCU5vdGUgdGhhdCB2YXJpb3VzIHJlcXVlc3RzIGltcGxlbWVudGVkIGZvciBOVCBpbnRlcm9wIHN1Y2ggYXMgCisJCU5UX1RSQU5TQUNUIChJT0NUTCkgUXVlcnlSZXBhcnNlSW5mbworCWFyZSB1bm5lZWRlZCB0byBzZXJ2ZXJzIGNvbXBsaWFudCB3aXRoIHRoZSBDSUZTIFBPU0lYIGV4dGVuc2lvbnMKKwkKKwlGcm9tIENJRlMgVW5peCBFeHRlbnNpb25zOgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlUMiBTRVRfUEFUSF9JTkZPIChTTUJfU0VUX0ZJTEVfVU5JWF9MSU5LKSBmb3Igc3ltbGlua3MKKwlUMiBTRVRfUEFUSF9JTkZPIChTTUJfU0VUX0ZJTEVfQkFTSUNfSU5GTzIpCisJVDIgUVVFUllfUEFUSF9JTkZPIChTTUJfUVVFUllfRklMRV9VTklYX0xJTkspCisJVDIgUVVFUllfUEFUSF9JTkZPIChTTUJfUVVFUllfRklMRV9VTklYX0JBU0lDKSAtIEJCIGNoZWNrIGZvciBtaXNzaW5nIGlub2RlIGZpZWxkcworCQkJCQlBY3R1YWxseSBuZWVkIFFVRVJZX0ZJTEVfVU5JWF9JTkZPIHNpbmNlIGhhcyBpbm9kZSBudW0KKwkJCQkJQkIgd2hhdCBhYm91dCBhKSBibGtzaXplL2Jsa2JpdHMvYmxvY2tzCisJCQkJCQkJCSAgYikgaV92ZXJzaW9uCisJCQkJCQkJCSAgYykgaV9yZGV2CisJCQkJCQkJCSAgZCkgbm90aWZ5IG1hc2s/CisJCQkJCQkJCSAgZSkgZ2VuZXJhdGlvbgorCQkJCQkJCQkgIGYpIHNpemVfc2VxY291bnQKKwlUMiBGSU5EX0ZJUlNUL0ZJTkRfTkVYVCBGSU5EX0ZJTEVfVU5JWAorCVRSQU5TMl9HRVRfREZTX1JFRkVSUkFMCQkJCSAgLSBPUFRJT05BTCBidXQgcmVjb21tZW5kZWQKKwlUMl9RRlNfSU5GTyBRdWVyeURldmljZS9BdHRyaWJ1dGVJbmZvIC0gT1BUSU9OQUwKKwkKKwkKKyAqLworCisvKiB4c3ltbGluayBpcyBhIHN5bWxpbmsgZm9ybWF0IHRoYXQgY2FuIGJlIHVzZWQKKyAgIHRvIHNhdmUgc3ltbGluayBpbmZvIGluIGEgcmVndWxhciBmaWxlIHdoZW4gCisgICBtb3VudGVkIHRvIG9wZXJhdGluZyBzeXN0ZW1zIHRoYXQgZG8gbm90CisgICBzdXBwb3J0IHRoZSBjaWZzIFVuaXggZXh0ZW5zaW9ucyBvciBFQXMgKGZvciB4YXR0cgorICAgYmFzZWQgc3ltbGlua3MpLiAgRm9yIHN1Y2ggYSBmaWxlIHRvIGJlIHJlY29nbml6ZWQKKyAgIGFzIGNvbnRhaW5pbmcgc3ltbGluayBkYXRhOiAKKworICAgMSkgZmlsZSBzaXplIG11c3QgYmUgMTA2NywgCisgICAyKSBzaWduYXR1cmUgbXVzdCBiZWdpbiBmaWxlIGRhdGEsCisgICAzKSBsZW5ndGggZmllbGQgbXVzdCBiZSBzZXQgdG8gQVNDSUkgcmVwcmVzZW50YXRpb24KKwlvZiBhIG51bWJlciB3aGljaCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTAyNCwgCisgICA0KSBtZDUgbXVzdCBtYXRjaCB0aGF0IG9mIHRoZSBwYXRoIGRhdGEgKi8KKworc3RydWN0IHhzeW1saW5rIHsKKwkvKiAxMDY3IGJ5dGVzICovCisJY2hhciBzaWduYXR1cmVbNF07IC8qIFhTeW0gKi8gLyogbm90IG51bGwgdGVybWluYXRlZCAqLworCWNoYXIgY3IwOyAgICAgICAgIC8qIFxuICovCisvKiBBU0NJSSByZXByZXNlbnRhdGlvbiBvZiBsZW5ndGggKDQgYnl0ZXMgZGVjaW1hbCkgdGVybWluYXRlZCBieSBcbiBub3QgbnVsbCAqLworCWNoYXIgbGVuZ3RoWzRdOworCWNoYXIgY3IxOyAgICAgICAgIC8qIFxuICovCisvKiBtZDUgb2YgdmFsaWQgc3Vic2V0IG9mIHBhdGggaWUgcGF0aFswXSB0aHJvdWdoIHBhdGhbbGVuZ3RoLTFdICovCisJX191OCBtZDVbMzJdOyAgICAKKwljaGFyIGNyMjsgICAgICAgIC8qIFxuICovCisvKiBpZiByb29tIGxlZnQsIHRoZW4gZW5kIHdpdGggXG4gdGhlbiAweDIwcyBieSBjb252ZW50aW9uIGJ1dCBub3QgcmVxdWlyZWQgKi8KKwljaGFyIHBhdGhbMTAyNF07ICAKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBCQiBkbyB3ZSBuZWVkIGFub3RoZXIgZmllbGQgZm9yIGZsYWdzPyBCQiAqLworCV9fdTMyIHhhdHRyX25hbWVfbGVuOworCV9fdTMyIHhhdHRyX3ZhbHVlX2xlbjsKKwljaGFyICB4YXR0cl9uYW1lWzBdOworCS8qIGZvbGxvd2VkIGJ5IHhhdHRyX3ZhbHVlW3hhdHRyX3ZhbHVlX2xlbl0sIG5vIHBhZCAqLworfSBGSUxFX1hBVFRSX0lORk87CS8qIGV4dGVuZGVkIGF0dHJpYnV0ZSwgaW5mbyBsZXZlbCAyMDUgKi8KKworCisjZW5kaWYgCisKKyNwcmFnbWEgcGFjaygpCQkJLyogcmVzdW1lIGRlZmF1bHQgc3RydWN0dXJlIHBhY2tpbmcgKi8KKworI2VuZGlmCQkJCS8qIF9DSUZTUERVX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc3Byb3RvLmggYi9mcy9jaWZzL2NpZnNwcm90by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4N2VlZjQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jaWZzL2NpZnNwcm90by5oCkBAIC0wLDAgKzEsMjY5IEBACisvKgorICogICBmcy9jaWZzL2NpZnNwcm90by5oCisgKgorICogICBDb3B5cmlnaHQgKGMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgIENvcnAuLCAyMDAyLDIwMDUKKyAqICAgQXV0aG9yKHMpOiBTdGV2ZSBGcmVuY2ggKHNmcmVuY2hAdXMuaWJtLmNvbSkKKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQSAKKyAqLworI2lmbmRlZiBfQ0lGU1BST1RPX0gKKyNkZWZpbmUgX0NJRlNQUk9UT19ICisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisKK3N0cnVjdCBzdGF0ZnM7CisKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFsbCBQcm90b3R5cGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCitleHRlcm4gc3RydWN0IHNtYl9oZHIgKmNpZnNfYnVmX2dldCh2b2lkKTsKK2V4dGVybiB2b2lkIGNpZnNfYnVmX3JlbGVhc2Uodm9pZCAqKTsKK2V4dGVybiBzdHJ1Y3Qgc21iX2hkciAqY2lmc19zbWFsbF9idWZfZ2V0KHZvaWQpOworZXh0ZXJuIHZvaWQgY2lmc19zbWFsbF9idWZfcmVsZWFzZSh2b2lkICopOworZXh0ZXJuIGludCBzbWJfc2VuZChzdHJ1Y3Qgc29ja2V0ICosIHN0cnVjdCBzbWJfaGRyICosCisJCQl1bnNpZ25lZCBpbnQgLyogbGVuZ3RoICovICwgc3RydWN0IHNvY2thZGRyICopOworZXh0ZXJuIHVuc2lnbmVkIGludCBfR2V0WGlkKHZvaWQpOworZXh0ZXJuIHZvaWQgX0ZyZWVYaWQodW5zaWduZWQgaW50KTsKKyNkZWZpbmUgR2V0WGlkKCkgKGludClfR2V0WGlkKCk7IGNGWUkoMSwoIkNJRlMgVkZTOiBpbiAlcyBhcyBYaWQ6ICVkIHdpdGggdWlkOiAlZCIsX19GVU5DVElPTl9fLCB4aWQsY3VycmVudC0+ZnN1aWQpKTsKKyNkZWZpbmUgRnJlZVhpZChjdXJyX3hpZCkge19GcmVlWGlkKGN1cnJfeGlkKTsgY0ZZSSgxLCgiQ0lGUyBWRlM6IGxlYXZpbmcgJXMgKHhpZCA9ICVkKSByYyA9ICVkIixfX0ZVTkNUSU9OX18sY3Vycl94aWQsKGludClyYykpO30KK2V4dGVybiBjaGFyICpidWlsZF9wYXRoX2Zyb21fZGVudHJ5KHN0cnVjdCBkZW50cnkgKik7CitleHRlcm4gY2hhciAqYnVpbGRfd2lsZGNhcmRfcGF0aF9mcm9tX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpkaXJlbnRyeSk7CitleHRlcm4gdm9pZCByZW5ld19wYXJlbnRhbF90aW1lc3RhbXBzKHN0cnVjdCBkZW50cnkgKmRpcmVudHJ5KTsKK2V4dGVybiBpbnQgU2VuZFJlY2VpdmUoY29uc3QgdW5zaWduZWQgaW50IC8qIHhpZCAqLyAsIHN0cnVjdCBjaWZzU2VzSW5mbyAqLAorCQkJc3RydWN0IHNtYl9oZHIgKiAvKiBpbnB1dCAqLyAsCisJCQlzdHJ1Y3Qgc21iX2hkciAqIC8qIG91dCAqLyAsCisJCQlpbnQgKiAvKiBieXRlcyByZXR1cm5lZCAqLyAsIGNvbnN0IGludCBsb25nX29wKTsKK2V4dGVybiBpbnQgY2hlY2tTTUJoZHIoc3RydWN0IHNtYl9oZHIgKnNtYiwgX191MTYgbWlkKTsKK2V4dGVybiBpbnQgY2hlY2tTTUIoc3RydWN0IHNtYl9oZHIgKnNtYiwgX191MTYgbWlkLCBpbnQgbGVuZ3RoKTsKK2V4dGVybiBpbnQgaXNfdmFsaWRfb3Bsb2NrX2JyZWFrKHN0cnVjdCBzbWJfaGRyICpzbWIpOworZXh0ZXJuIGludCBpc19zaXplX3NhZmVfdG9fY2hhbmdlKHN0cnVjdCBjaWZzSW5vZGVJbmZvICopOworZXh0ZXJuIHVuc2lnbmVkIGludCBzbWJDYWxjU2l6ZShzdHJ1Y3Qgc21iX2hkciAqcHRyKTsKK2V4dGVybiBpbnQgZGVjb2RlX25lZ1Rva2VuSW5pdCh1bnNpZ25lZCBjaGFyICpzZWN1cml0eV9ibG9iLCBpbnQgbGVuZ3RoLAorCQkJZW51bSBzZWN1cml0eUVudW0gKnNlY1R5cGUpOworZXh0ZXJuIGludCBjaWZzX2luZXRfcHRvbihpbnQsIGNoYXIgKiBzb3VyY2UsIHZvaWQgKmRzdCk7CitleHRlcm4gaW50IG1hcF9zbWJfdG9fbGludXhfZXJyb3Ioc3RydWN0IHNtYl9oZHIgKnNtYik7CitleHRlcm4gdm9pZCBoZWFkZXJfYXNzZW1ibGUoc3RydWN0IHNtYl9oZHIgKiwgY2hhciAvKiBjb21tYW5kICovICwKKwkJCWNvbnN0IHN0cnVjdCBjaWZzVGNvbkluZm8gKiwgaW50CisJCQkvKiBsZW5ndGggb2YgZml4ZWQgc2VjdGlvbiAod29yZCBjb3VudCkgaW4gdHdvIGJ5dGUgdW5pdHMgICovCisJCQkpOworZXh0ZXJuIHN0cnVjdCBvcGxvY2tfcV9lbnRyeSAqIEFsbG9jT3Bsb2NrUUVudHJ5KHN0cnVjdCBpbm9kZSAqLCB1MTYsIHN0cnVjdCBjaWZzVGNvbkluZm8gKik7CitleHRlcm4gdm9pZCBEZWxldGVPcGxvY2tRRW50cnkoc3RydWN0IG9wbG9ja19xX2VudHJ5ICopOworZXh0ZXJuIHN0cnVjdCB0aW1lc3BlYyBjaWZzX05UdGltZVRvVW5peCh1NjQgLyogdXRjIG5hbm9zZWNvbmRzIHNpbmNlIDE2MDEgKi8gKTsKK2V4dGVybiB1NjQgY2lmc19Vbml4VGltZVRvTlQoc3RydWN0IHRpbWVzcGVjKTsKK2V4dGVybiBpbnQgY2lmc19nZXRfaW5vZGVfaW5mbyhzdHJ1Y3QgaW5vZGUgKipwaW5vZGUsCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpzZWFyY2hfcGF0aCwgCisJCQlGSUxFX0FMTF9JTkZPICogcGZpbGVfaW5mbywKKwkJCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB4aWQpOworZXh0ZXJuIGludCBjaWZzX2dldF9pbm9kZV9pbmZvX3VuaXgoc3RydWN0IGlub2RlICoqcGlub2RlLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqc2VhcmNoX3BhdGgsCisJCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLGludCB4aWQpOworCitleHRlcm4gaW50IGNpZnNfbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBjaWZzX3NiX2luZm8gKiwgY2hhciAqLAorCQkJY29uc3QgY2hhciAqKTsKK2V4dGVybiBpbnQgY2lmc191bW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBjaWZzX3NiX2luZm8gKik7Cit2b2lkIGNpZnNfcHJvY19pbml0KHZvaWQpOwordm9pZCBjaWZzX3Byb2NfY2xlYW4odm9pZCk7CisKK2V4dGVybiBpbnQgY2lmc19zZXR1cF9zZXNzaW9uKHVuc2lnbmVkIGludCB4aWQsIHN0cnVjdCBjaWZzU2VzSW5mbyAqcFNlc0luZm8sIAorCQkJc3RydWN0IG5sc190YWJsZSAqIG5sc19pbmZvKTsKK2V4dGVybiBpbnQgQ0lGU1NNQk5lZ290aWF0ZSh1bnNpZ25lZCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Nlc0luZm8gKnNlcyk7CisKK2V4dGVybiBpbnQgQ0lGU1RDb24odW5zaWduZWQgaW50IHhpZCwgc3RydWN0IGNpZnNTZXNJbmZvICpzZXMsCisJCQljb25zdCBjaGFyICp0cmVlLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCQkJY29uc3Qgc3RydWN0IG5sc190YWJsZSAqKTsKKworZXh0ZXJuIGludCBDSUZTRmluZEZpcnN0KGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCisgICAgICAgICAgICBjb25zdCBjaGFyICpzZWFyY2hOYW1lLCBjb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UsCisgICAgICAgICAgICBfX3UxNiAqc2VhcmNoSGFuZGxlLCBzdHJ1Y3QgY2lmc19zZWFyY2hfaW5mbyAqIHBzcmNoX2luZik7CisKK2V4dGVybiBpbnQgQ0lGU0ZpbmROZXh0KGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCisgICAgICAgICAgICBfX3UxNiBzZWFyY2hIYW5kbGUsIHN0cnVjdCBjaWZzX3NlYXJjaF9pbmZvICogcHNyY2hfaW5mKTsKKworZXh0ZXJuIGludCBDSUZTRmluZENsb3NlKGNvbnN0IGludCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJCWNvbnN0IF9fdTE2IHNlYXJjaF9oYW5kbGUpOworCitleHRlcm4gaW50IENJRlNTTUJRUGF0aEluZm8oY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlYXJjaE5hbWUsCisJCQlGSUxFX0FMTF9JTkZPICogZmluZERhdGEsCisJCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpOworCitleHRlcm4gaW50IENJRlNTTUJVbml4UVBhdGhJbmZvKGNvbnN0IGludCB4aWQsCisJCQlzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqc2VhcmNoTmFtZSwKKwkJCUZJTEVfVU5JWF9CQVNJQ19JTkZPICogcEZpbmREYXRhLAorCQkJY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKTsKKworZXh0ZXJuIGludCBDSUZTR2V0REZTUmVmZXIoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNTZXNJbmZvICpzZXMsCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpzZWFyY2hOYW1lLAorCQkJdW5zaWduZWQgY2hhciAqKnRhcmdldFVOQ3MsCisJCQl1bnNpZ25lZCBpbnQgKm51bWJlcl9vZl9VTkNfaW5fYXJyYXksCisJCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpOworCitleHRlcm4gaW50IGNvbm5lY3RfdG9fZGZzX3BhdGgoaW50IHhpZCwgc3RydWN0IGNpZnNTZXNJbmZvICpwU2VzSW5mbywKKwkJCWNvbnN0IGNoYXIgKm9sZF9wYXRoLAorCQkJY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKTsKK2V4dGVybiBpbnQgZ2V0X2Rmc19wYXRoKGludCB4aWQsIHN0cnVjdCBjaWZzU2VzSW5mbyAqcFNlc0luZm8sCisJCQljb25zdCBjaGFyICpvbGRfcGF0aCwgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlLCAKKwkJCXVuc2lnbmVkIGludCAqcG51bV9yZWZlcnJhbHMsIHVuc2lnbmVkIGNoYXIgKiogcHJlZmVycmFscyk7CitleHRlcm4gaW50IENJRlNTTUJRRlNJbmZvKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCisJCQlzdHJ1Y3Qga3N0YXRmcyAqRlNEYXRhLAorCQkJY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKTsKK2V4dGVybiBpbnQgQ0lGU1NNQlFGU0F0dHJpYnV0ZUluZm8oY29uc3QgaW50IHhpZCwKKwkJCXN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCisJCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpOworZXh0ZXJuIGludCBDSUZTU01CUUZTRGV2aWNlSW5mbyhjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCQkJY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKTsKK2V4dGVybiBpbnQgQ0lGU1NNQlFGU1VuaXhJbmZvKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCisJCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpOworZXh0ZXJuIGludCBDSUZTU01CUUZTUG9zaXhJbmZvKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCisJCQlzdHJ1Y3Qga3N0YXRmcyAqRlNEYXRhLCBjb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpOworCitleHRlcm4gaW50IENJRlNTTUJTZXRUaW1lcyhjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCQkJY29uc3QgY2hhciAqZmlsZU5hbWUsIGNvbnN0IEZJTEVfQkFTSUNfSU5GTyAqIGRhdGEsCisJCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpOworZXh0ZXJuIGludCBDSUZTU01CU2V0RmlsZVRpbWVzKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCisJCQljb25zdCBGSUxFX0JBU0lDX0lORk8gKiBkYXRhLCBfX3UxNiBmaWQpOworI2lmIDAKK2V4dGVybiBpbnQgQ0lGU1NNQlNldEF0dHJMZWdhY3koaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJCWNoYXIgKmZpbGVOYW1lLCBfX3UxNiBkb3NfYXR0cmlidXRlcywKKwkJCWNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSk7CisjZW5kaWYgLyogcG9zc2libHkgdW5uZWVkZWQgZnVuY3Rpb24gKi8KK2V4dGVybiBpbnQgQ0lGU1NNQlNldEVPRihjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCQkJY29uc3QgY2hhciAqZmlsZU5hbWUsIF9fdTY0IHNpemUsaW50IHNldEFsbG9jYXRpb25TaXplRmxhZywKKwkJCWNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSk7CitleHRlcm4gaW50IENJRlNTTUJTZXRGaWxlU2l6ZShjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCQkJIF9fdTY0IHNpemUsIF9fdTE2IGZpbGVIYW5kbGUsX191MzIgb3BlbmVyX3BpZCwgaW50IEFsbG9jU2l6ZUZsYWcpOworZXh0ZXJuIGludCBDSUZTU01CVW5peFNldFBlcm1zKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnBUY29uLAorCQkJY2hhciAqZnVsbF9wYXRoLCBfX3U2NCBtb2RlLCBfX3U2NCB1aWQsCisJCQlfX3U2NCBnaWQsIGRldl90IGRldiwgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKTsKKworZXh0ZXJuIGludCBDSUZTU01CTWtEaXIoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJCWNvbnN0IGNoYXIgKm5ld05hbWUsCisJCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpOworZXh0ZXJuIGludCBDSUZTU01CUm1EaXIoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJCWNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSk7CisKK2V4dGVybiBpbnQgQ0lGU1NNQkRlbEZpbGUoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJCWNvbnN0IGNoYXIgKm5hbWUsCisJCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpOworZXh0ZXJuIGludCBDSUZTU01CUmVuYW1lKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCisJCQljb25zdCBjaGFyICpmcm9tTmFtZSwgY29uc3QgY2hhciAqdG9OYW1lLAorCQkJY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKTsKK2V4dGVybiBpbnQgQ0lGU1NNQlJlbmFtZU9wZW5GaWxlKGNvbnN0IGludCB4aWQsc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb24sCisJCQlpbnQgbmV0ZmlkLCBjaGFyICogdGFyZ2V0X25hbWUsIGNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSk7CitleHRlcm4gaW50IENJRlNDcmVhdGVIYXJkTGluayhjb25zdCBpbnQgeGlkLAorCQkJc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJCWNvbnN0IGNoYXIgKmZyb21OYW1lLCBjb25zdCBjaGFyICp0b05hbWUsCisJCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpOworZXh0ZXJuIGludCBDSUZTVW5peENyZWF0ZUhhcmRMaW5rKGNvbnN0IGludCB4aWQsCisJCQlzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCQkJY29uc3QgY2hhciAqZnJvbU5hbWUsIGNvbnN0IGNoYXIgKnRvTmFtZSwKKwkJCWNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSk7CitleHRlcm4gaW50IENJRlNVbml4Q3JlYXRlU3ltTGluayhjb25zdCBpbnQgeGlkLAorCQkJc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJCWNvbnN0IGNoYXIgKmZyb21OYW1lLCBjb25zdCBjaGFyICp0b05hbWUsCisJCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpOworZXh0ZXJuIGludCBDSUZTU01CVW5peFF1ZXJ5U3ltTGluayhjb25zdCBpbnQgeGlkLAorCQkJc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlYXJjaE5hbWUsCisJCQljaGFyICpzeW1pbmZvLCBjb25zdCBpbnQgYnVmbGVuLAorCQkJY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKTsKK2V4dGVybiBpbnQgQ0lGU1NNQlF1ZXJ5UmVwYXJzZUxpbmtJbmZvKGNvbnN0IGludCB4aWQsIAorCQkJc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlYXJjaE5hbWUsCisJCQljaGFyICpzeW1saW5raW5mbywgY29uc3QgaW50IGJ1ZmxlbiwgX191MTYgZmlkLAorCQkJY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKTsKKworZXh0ZXJuIGludCBDSUZTU01CT3Blbihjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCQkJY29uc3QgY2hhciAqZmlsZU5hbWUsIGNvbnN0IGludCBkaXNwb3NpdGlvbiwKKwkJCWNvbnN0IGludCBhY2Nlc3NfZmxhZ3MsIGNvbnN0IGludCBvbW9kZSwKKwkJCV9fdTE2ICogbmV0ZmlkLCBpbnQgKnBPcGxvY2ssIEZJTEVfQUxMX0lORk8gKiwKKwkJCWNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSk7CitleHRlcm4gaW50IENJRlNTTUJDbG9zZShjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCQkJY29uc3QgaW50IHNtYl9maWxlX2lkKTsKKworZXh0ZXJuIGludCBDSUZTU01CUmVhZChjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCQkJY29uc3QgaW50IG5ldGZpZCwgdW5zaWduZWQgaW50IGNvdW50LAorCQkJY29uc3QgX191NjQgbHNlZWssIHVuc2lnbmVkIGludCAqbmJ5dGVzLCBjaGFyICoqYnVmKTsKK2V4dGVybiBpbnQgQ0lGU1NNQldyaXRlKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCisJCQljb25zdCBpbnQgbmV0ZmlkLCBjb25zdCB1bnNpZ25lZCBpbnQgY291bnQsCisJCQljb25zdCBfX3U2NCBsc2VlaywgdW5zaWduZWQgaW50ICpuYnl0ZXMsCisJCQljb25zdCBjaGFyICpidWYsIGNvbnN0IGNoYXIgX191c2VyICp1YnVmLCAKKwkJCWNvbnN0IGludCBsb25nX29wKTsKKyNpZmRlZiBDT05GSUdfQ0lGU19FWFBFUklNRU5UQUwKK2V4dGVybiBpbnQgQ0lGU1NNQldyaXRlMihjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCQkJY29uc3QgaW50IG5ldGZpZCwgY29uc3QgdW5zaWduZWQgaW50IGNvdW50LAorCQkJY29uc3QgX191NjQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgKm5ieXRlcywgCisJCQljb25zdCBjaGFyIF9fdXNlciAqYnVmLGNvbnN0IGludCBsb25nX29wKTsKK2V4dGVybiBpbnQgQ0lGU0dldFNydklub2RlTnVtYmVyKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpzZWFyY2hOYW1lLCBfX3U2NCAqIGlub2RlX251bWJlciwKKwkJCWNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSk7CisjZW5kaWYgLyogQ09ORklHX0NJRlNfRVhQRVJJTUVOVEFMICovCisKK2V4dGVybiBpbnQgQ0lGU1NNQkxvY2soY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJCWNvbnN0IF9fdTE2IG5ldGZpZCwgY29uc3QgX191NjQgbGVuLAorCQkJY29uc3QgX191NjQgb2Zmc2V0LCBjb25zdCBfX3UzMiBudW1VbmxvY2ssCisJCQljb25zdCBfX3UzMiBudW1Mb2NrLCBjb25zdCBfX3U4IGxvY2tUeXBlLAorCQkJY29uc3QgaW50IHdhaXRGbGFnKTsKKworZXh0ZXJuIGludCBDSUZTU01CVERpcyhjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uKTsKK2V4dGVybiBpbnQgQ0lGU1NNQkxvZ29mZihjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Nlc0luZm8gKnNlcyk7CisKK2V4dGVybiBzdHJ1Y3QgY2lmc1Nlc0luZm8gKnNlc0luZm9BbGxvYyh2b2lkKTsKK2V4dGVybiB2b2lkIHNlc0luZm9GcmVlKHN0cnVjdCBjaWZzU2VzSW5mbyAqKTsKK2V4dGVybiBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uSW5mb0FsbG9jKHZvaWQpOworZXh0ZXJuIHZvaWQgdGNvbkluZm9GcmVlKHN0cnVjdCBjaWZzVGNvbkluZm8gKik7CisKK2V4dGVybiBpbnQgY2lmc19yZWNvbm5lY3Qoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyKTsKKworZXh0ZXJuIGludCBjaWZzX3NpZ25fc21iKHN0cnVjdCBzbWJfaGRyICosIHN0cnVjdCBjaWZzU2VzSW5mbyAqLF9fdTMyICopOworZXh0ZXJuIGludCBjaWZzX3ZlcmlmeV9zaWduYXR1cmUoc3RydWN0IHNtYl9oZHIgKiwgY29uc3QgY2hhciAqIG1hY19rZXksCisJX191MzIgZXhwZWN0ZWRfc2VxdWVuY2VfbnVtYmVyKTsKK2V4dGVybiBpbnQgY2lmc19jYWxjdWxhdGVfbWFjX2tleShjaGFyICoga2V5LGNvbnN0IGNoYXIgKiBybixjb25zdCBjaGFyICogcGFzcyk7CitleHRlcm4gaW50IENhbGNOVExNdjJfcGFydGlhbF9tYWNfa2V5KHN0cnVjdCBjaWZzU2VzSW5mbyAqLCBzdHJ1Y3QgbmxzX3RhYmxlICopOworZXh0ZXJuIHZvaWQgQ2FsY05UTE12Ml9yZXNwb25zZShjb25zdCBzdHJ1Y3QgY2lmc1Nlc0luZm8gKixjaGFyICogKTsKK2V4dGVybiBpbnQgQ0lGU1NNQkNvcHkoaW50IHhpZCwKKwkJCXN0cnVjdCBjaWZzVGNvbkluZm8gKnNvdXJjZV90Y29uLAorCQkJY29uc3QgY2hhciAqZnJvbU5hbWUsCisJCQljb25zdCBfX3UxNiB0YXJnZXRfdGlkLAorCQkJY29uc3QgY2hhciAqdG9OYW1lLCBjb25zdCBpbnQgZmxhZ3MsCisJCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpOworZXh0ZXJuIGludCBDSUZTU01CTm90aWZ5KGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sIAorCQkJY29uc3QgaW50IG5vdGlmeV9zdWJkaXJzLGNvbnN0IF9fdTE2IG5ldGZpZCxfX3UzMiBmaWx0ZXIsCisJCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpOworZXh0ZXJuIHNzaXplX3QgQ0lGU1NNQlFBbGxFQXMoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlYXJjaE5hbWUsIGNoYXIgKiBFQURhdGEsCisJCQlzaXplX3QgYnVmc2l6ZSwgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKTsKK2V4dGVybiBzc2l6ZV90IENJRlNTTUJRdWVyeUVBKGNvbnN0IGludCB4aWQsc3RydWN0IGNpZnNUY29uSW5mbyAqIHRjb24sCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKiBzZWFyY2hOYW1lLGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBlYV9uYW1lLAorCQl1bnNpZ25lZCBjaGFyICogZWFfdmFsdWUsIHNpemVfdCBidWZfc2l6ZSwgCisJCWNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSk7CitleHRlcm4gaW50IENJRlNTTUJTZXRFQShjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLCAKKwkJY29uc3QgY2hhciAqZmlsZU5hbWUsIGNvbnN0IGNoYXIgKiBlYV9uYW1lLCAKKwkJY29uc3Qgdm9pZCAqIGVhX3ZhbHVlLCBjb25zdCBfX3UxNiBlYV92YWx1ZV9sZW4sIAorCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpOworZXh0ZXJuIGludCBDSUZTU01CR2V0UG9zaXhBQ0woY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqc2VhcmNoTmFtZSwKKwkJY2hhciAqYWNsX2luZiwgY29uc3QgaW50IGJ1Zmxlbixjb25zdCBpbnQgYWNsX3R5cGUsCisJCWNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSk7CitleHRlcm4gaW50IENJRlNTTUJTZXRQb3NpeEFDTChjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCQljb25zdCB1bnNpZ25lZCBjaGFyICpmaWxlTmFtZSwKKwkJY29uc3QgY2hhciAqbG9jYWxfYWNsLCBjb25zdCBpbnQgYnVmbGVuLCBjb25zdCBpbnQgYWNsX3R5cGUsCisJCWNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSk7CitpbnQgY2lmc19pb2N0bCAoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZXAsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNvbW1hbmQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKyNlbmRpZgkJCS8qIF9DSUZTUFJPVE9fSCAqLwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzc21iLmMgYi9mcy9jaWZzL2NpZnNzbWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjZhNjE5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9jaWZzc21iLmMKQEAgLTAsMCArMSw0MTg2IEBACisvKgorICogICBmcy9jaWZzL2NpZnNzbWIuYworICoKKyAqICAgQ29weXJpZ2h0IChDKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzICBDb3JwLiwgMjAwMiwyMDA1CisgKiAgIEF1dGhvcihzKTogU3RldmUgRnJlbmNoIChzZnJlbmNoQHVzLmlibS5jb20pCisgKgorICogICBDb250YWlucyB0aGUgcm91dGluZXMgZm9yIGNvbnN0cnVjdGluZyB0aGUgU01CIFBEVXMgdGhlbXNlbHZlcworICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworIC8qIFNNQi9DSUZTIFBEVSBoYW5kbGluZyByb3V0aW5lcyBoZXJlIC0gZXhjZXB0IGZvciBsZWZ0b3ZlcnMgaW4gY29ubmVjdC5jICAgKi8KKyAvKiBUaGVzZSBhcmUgbW9zdGx5IHJvdXRpbmVzIHRoYXQgb3BlcmF0ZSBvbiBhIHBhdGhuYW1lLCBvciBvbiBhIHRyZWUgaWQgICAgICovCisgLyogKG1vdW50ZWQgdm9sdW1lKSwgYnV0IHRoZXJlIGFyZSBlaWdodCBoYW5kbGUgYmFzZWQgcm91dGluZXMgd2hpY2ggbXVzdCBiZSAqLworIC8qIHRyZWF0ZWQgc2xpZ2h0bHkgZGlmZmVyZW50IGZvciByZWNvbm5lY3Rpb24gcHVycG9zZXMgc2luY2Ugd2UgbmV2ZXIgd2FudCAgKi8KKyAvKiB0byByZXVzZSBhIHN0YWxlIGZpbGUgaGFuZGxlIGFuZCB0aGUgY2FsbGVyIGtub3dzIHRoZSBmaWxlIGhhbmRsZSAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2xfeGF0dHIuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgImNpZnNwZHUuaCIKKyNpbmNsdWRlICJjaWZzZ2xvYi5oIgorI2luY2x1ZGUgImNpZnNwcm90by5oIgorI2luY2x1ZGUgImNpZnNfdW5pY29kZS5oIgorI2luY2x1ZGUgImNpZnNfZGVidWcuaCIKKworI2lmZGVmIENPTkZJR19DSUZTX1BPU0lYCitzdGF0aWMgc3RydWN0IHsKKwlpbnQgaW5kZXg7CisJY2hhciAqbmFtZTsKK30gcHJvdG9jb2xzW10gPSB7CisJe0NJRlNfUFJPVCwgIlwyTlQgTE0gMC4xMiJ9LCAKKwl7Q0lGU19QUk9ULCAiXDJQT1NJWCAyIn0sCisJe0JBRF9QUk9ULCAiXDIifQorfTsKKyNlbHNlCitzdGF0aWMgc3RydWN0IHsKKwlpbnQgaW5kZXg7CisJY2hhciAqbmFtZTsKK30gcHJvdG9jb2xzW10gPSB7CisJe0NJRlNfUFJPVCwgIlwyTlQgTE0gMC4xMiJ9LCAKKwl7QkFEX1BST1QsICJcMiJ9Cit9OworI2VuZGlmCisKKworLyogTWFyayBhcyBpbnZhbGlkLCBhbGwgb3BlbiBmaWxlcyBvbiB0cmVlIGNvbm5lY3Rpb25zIHNpbmNlIHRoZXkKKyAgIHdlcmUgY2xvc2VkIHdoZW4gc2Vzc2lvbiB0byBzZXJ2ZXIgd2FzIGxvc3QgKi8KK3N0YXRpYyB2b2lkIG1hcmtfb3Blbl9maWxlc19pbnZhbGlkKHN0cnVjdCBjaWZzVGNvbkluZm8gKiBwVGNvbikKK3sKKwlzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpvcGVuX2ZpbGUgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKiB0bXA7CisJc3RydWN0IGxpc3RfaGVhZCAqIHRtcDE7CisKKy8qIGxpc3QgYWxsIGZpbGVzIG9wZW4gb24gdHJlZSBjb25uZWN0aW9uIGFuZCBtYXJrIHRoZW0gaW52YWxpZCAqLworCXdyaXRlX2xvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCWxpc3RfZm9yX2VhY2hfc2FmZSh0bXAsIHRtcDEsICZwVGNvbi0+b3BlbkZpbGVMaXN0KSB7CisJCW9wZW5fZmlsZSA9IGxpc3RfZW50cnkodG1wLHN0cnVjdCBjaWZzRmlsZUluZm8sIHRsaXN0KTsKKwkJaWYob3Blbl9maWxlKSB7CisJCQlvcGVuX2ZpbGUtPmludmFsaWRIYW5kbGUgPSBUUlVFOworCQl9CisJfQorCXdyaXRlX3VubG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisJLyogQkIgQWRkIGNhbGwgdG8gaW52YWxpZGF0ZV9pbm9kZXMoc2IpIGZvciBhbGwgc3VwZXJibG9ja3MgbW91bnRlZCB0byB0aGlzIHRjb24gKi8KK30KKworLyogSWYgdGhlIHJldHVybiBjb2RlIGlzIHplcm8sIHRoaXMgZnVuY3Rpb24gbXVzdCBmaWxsIGluIHJlcXVlc3RfYnVmIHBvaW50ZXIgKi8KK3N0YXRpYyBpbnQKK3NtYWxsX3NtYl9pbml0KGludCBzbWJfY29tbWFuZCwgaW50IHdjdCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkgdm9pZCAqKnJlcXVlc3RfYnVmIC8qIHJldHVybmVkICovKQoreworCWludCByYyA9IDA7CisKKwkvKiBTTUJzIE5lZ1Byb3QsIFNlc3NTZXR1cCwgdUxvZ29mZiBkbyBub3QgaGF2ZSB0Y29uIHlldCBzbworCSAgIGNoZWNrIGZvciB0Y3AgYW5kIHNtYiBzZXNzaW9uIHN0YXR1cyBkb25lIGRpZmZlcmVudGx5CisJICAgZm9yIHRob3NlIHRocmVlIC0gaW4gdGhlIGNhbGxpbmcgcm91dGluZSAqLworCWlmKHRjb24pIHsKKwkJaWYoKHRjb24tPnNlcykgJiYgKHRjb24tPnNlcy0+c2VydmVyKSl7CisJCQlzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2U7CisJCQkJLyogR2l2ZSBEZW11bHRpcGxleCB0aHJlYWQgdXAgdG8gMTAgc2Vjb25kcyB0byAKKwkJCQkJcmVjb25uZWN0LCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIGNpZnMgc29ja2V0CisJCQkJCXRpbWVvdXQgd2hpY2ggaXMgNyBzZWNvbmRzICovCisJCQl3aGlsZSh0Y29uLT5zZXMtPnNlcnZlci0+dGNwU3RhdHVzID09IENpZnNOZWVkUmVjb25uZWN0KSB7CisJCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQodGNvbi0+c2VzLT5zZXJ2ZXItPnJlc3BvbnNlX3EsCisJCQkJCSh0Y29uLT5zZXMtPnNlcnZlci0+dGNwU3RhdHVzID09IENpZnNHb29kKSwgMTAgKiBIWik7CisJCQkJaWYodGNvbi0+c2VzLT5zZXJ2ZXItPnRjcFN0YXR1cyA9PSBDaWZzTmVlZFJlY29ubmVjdCkgeworCQkJCQkvKiBvbiAic29mdCIgbW91bnRzIHdlIHdhaXQgb25jZSAqLworCQkJCQlpZigodGNvbi0+cmV0cnkgPT0gRkFMU0UpIHx8IAorCQkJCQkgICAodGNvbi0+c2VzLT5zdGF0dXMgPT0gQ2lmc0V4aXRpbmcpKSB7CisJCQkJCQljRllJKDEsKCJnYXZlIHVwIHdhaXRpbmcgb24gcmVjb25uZWN0IGluIHNtYl9pbml0IikpOworCQkJCQkJcmV0dXJuIC1FSE9TVERPV047CisJCQkJCX0gLyogZWxzZSAiaGFyZCIgbW91bnQgLSBrZWVwIHJldHJ5aW5nIHVudGlsIAorCQkJCQlwcm9jZXNzIGlzIGtpbGxlZCBvciBzZXJ2ZXIgY29tZXMgYmFjayB1cCAqLworCQkJCX0gZWxzZSAvKiBUQ1Agc2Vzc2lvbiBpcyByZWVzdGFibGlzaGVkIG5vdyAqLworCQkJCQlicmVhazsKKwkJCQkgCisJCQl9CisJCQkKKwkJCW5sc19jb2RlcGFnZSA9IGxvYWRfbmxzX2RlZmF1bHQoKTsKKwkJLyogbmVlZCB0byBwcmV2ZW50IG11bHRpcGxlIHRocmVhZHMgdHJ5aW5nIHRvCisJCXNpbXVsdGFuZW91c2x5IHJlY29ubmVjdCB0aGUgc2FtZSBTTUIgc2Vzc2lvbiAqLworCQkJZG93bigmdGNvbi0+c2VzLT5zZXNTZW0pOworCQkJaWYodGNvbi0+c2VzLT5zdGF0dXMgPT0gQ2lmc05lZWRSZWNvbm5lY3QpCisJCQkJcmMgPSBjaWZzX3NldHVwX3Nlc3Npb24oMCwgdGNvbi0+c2VzLCBubHNfY29kZXBhZ2UpOworCQkJaWYoIXJjICYmICh0Y29uLT50aWRTdGF0dXMgPT0gQ2lmc05lZWRSZWNvbm5lY3QpKSB7CisJCQkJbWFya19vcGVuX2ZpbGVzX2ludmFsaWQodGNvbik7CisJCQkJcmMgPSBDSUZTVENvbigwLCB0Y29uLT5zZXMsIHRjb24tPnRyZWVOYW1lLCB0Y29uLAorCQkJCQlubHNfY29kZXBhZ2UpOworCQkJCXVwKCZ0Y29uLT5zZXMtPnNlc1NlbSk7CisJCQkJaWYocmMgPT0gMCkKKwkJCQkJYXRvbWljX2luYygmdGNvbkluZm9SZWNvbm5lY3RDb3VudCk7CisKKwkJCQljRllJKDEsICgicmVjb25uZWN0IHRjb24gcmMgPSAlZCIsIHJjKSk7CisJCQkJLyogUmVtb3ZlZCBjYWxsIHRvIHJlb3BlbiBvcGVuIGZpbGVzIGhlcmUgLSAKKwkJCQkJaXQgaXMgc2FmZXIgKGFuZCBmYXN0ZXIpIHRvIHJlb3BlbiBmaWxlcworCQkJCQlvbmUgYXQgYSB0aW1lIGFzIG5lZWRlZCBpbiByZWFkIGFuZCB3cml0ZSAqLworCisJCQkJLyogQ2hlY2sgaWYgaGFuZGxlIGJhc2VkIG9wZXJhdGlvbiBzbyB3ZSAKKwkJCQkJa25vdyB3aGV0aGVyIHdlIGNhbiBjb250aW51ZSBvciBub3Qgd2l0aG91dAorCQkJCQlyZXR1cm5pbmcgdG8gY2FsbGVyIHRvIHJlc2V0IGZpbGUgaGFuZGxlICovCisJCQkJc3dpdGNoKHNtYl9jb21tYW5kKSB7CisJCQkJCWNhc2UgU01CX0NPTV9SRUFEX0FORFg6CisJCQkJCWNhc2UgU01CX0NPTV9XUklURV9BTkRYOgorCQkJCQljYXNlIFNNQl9DT01fQ0xPU0U6CisJCQkJCWNhc2UgU01CX0NPTV9GSU5EX0NMT1NFMjoKKwkJCQkJY2FzZSBTTUJfQ09NX0xPQ0tJTkdfQU5EWDogeworCQkJCQkJdW5sb2FkX25scyhubHNfY29kZXBhZ2UpOworCQkJCQkJcmV0dXJuIC1FQUdBSU47CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXVwKCZ0Y29uLT5zZXMtPnNlc1NlbSk7CisJCQl9CisJCQl1bmxvYWRfbmxzKG5sc19jb2RlcGFnZSk7CisKKwkJfSBlbHNlIHsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQorCWlmKHJjKQorCQlyZXR1cm4gcmM7CisKKwkqcmVxdWVzdF9idWYgPSBjaWZzX3NtYWxsX2J1Zl9nZXQoKTsKKwlpZiAoKnJlcXVlc3RfYnVmID09IE5VTEwpIHsKKwkJLyogQkIgc2hvdWxkIHdlIGFkZCBhIHJldHJ5IGluIGhlcmUgaWYgbm90IGEgd3JpdGVwYWdlPyAqLworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwloZWFkZXJfYXNzZW1ibGUoKHN0cnVjdCBzbWJfaGRyICopICpyZXF1ZXN0X2J1Ziwgc21iX2NvbW1hbmQsIHRjb24sd2N0KTsKKworI2lmZGVmIENPTkZJR19DSUZTX1NUQVRTCisgICAgICAgIGlmKHRjb24gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGF0b21pY19pbmMoJnRjb24tPm51bV9zbWJzX3NlbnQpOworICAgICAgICB9CisjZW5kaWYgLyogQ09ORklHX0NJRlNfU1RBVFMgKi8KKwlyZXR1cm4gcmM7Cit9ICAKKworLyogSWYgdGhlIHJldHVybiBjb2RlIGlzIHplcm8sIHRoaXMgZnVuY3Rpb24gbXVzdCBmaWxsIGluIHJlcXVlc3RfYnVmIHBvaW50ZXIgKi8KK3N0YXRpYyBpbnQKK3NtYl9pbml0KGludCBzbWJfY29tbWFuZCwgaW50IHdjdCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkgdm9pZCAqKnJlcXVlc3RfYnVmIC8qIHJldHVybmVkICovICwKKwkgdm9pZCAqKnJlc3BvbnNlX2J1ZiAvKiByZXR1cm5lZCAqLyApCit7CisJaW50IHJjID0gMDsKKworCS8qIFNNQnMgTmVnUHJvdCwgU2Vzc1NldHVwLCB1TG9nb2ZmIGRvIG5vdCBoYXZlIHRjb24geWV0IHNvCisJICAgY2hlY2sgZm9yIHRjcCBhbmQgc21iIHNlc3Npb24gc3RhdHVzIGRvbmUgZGlmZmVyZW50bHkKKwkgICBmb3IgdGhvc2UgdGhyZWUgLSBpbiB0aGUgY2FsbGluZyByb3V0aW5lICovCisJaWYodGNvbikgeworCQlpZigodGNvbi0+c2VzKSAmJiAodGNvbi0+c2VzLT5zZXJ2ZXIpKXsKKwkJCXN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZTsKKwkJCQkvKiBHaXZlIERlbXVsdGlwbGV4IHRocmVhZCB1cCB0byAxMCBzZWNvbmRzIHRvIAorCQkJCQlyZWNvbm5lY3QsIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gY2lmcyBzb2NrZXQKKwkJCQkJdGltZW91dCB3aGljaCBpcyA3IHNlY29uZHMgKi8KKwkJCXdoaWxlKHRjb24tPnNlcy0+c2VydmVyLT50Y3BTdGF0dXMgPT0gQ2lmc05lZWRSZWNvbm5lY3QpIHsKKwkJCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh0Y29uLT5zZXMtPnNlcnZlci0+cmVzcG9uc2VfcSwKKwkJCQkJKHRjb24tPnNlcy0+c2VydmVyLT50Y3BTdGF0dXMgPT0gQ2lmc0dvb2QpLCAxMCAqIEhaKTsKKwkJCQlpZih0Y29uLT5zZXMtPnNlcnZlci0+dGNwU3RhdHVzID09IENpZnNOZWVkUmVjb25uZWN0KSB7CisJCQkJCS8qIG9uICJzb2Z0IiBtb3VudHMgd2Ugd2FpdCBvbmNlICovCisJCQkJCWlmKCh0Y29uLT5yZXRyeSA9PSBGQUxTRSkgfHwgCisJCQkJCSAgICh0Y29uLT5zZXMtPnN0YXR1cyA9PSBDaWZzRXhpdGluZykpIHsKKwkJCQkJCWNGWUkoMSwoImdhdmUgdXAgd2FpdGluZyBvbiByZWNvbm5lY3QgaW4gc21iX2luaXQiKSk7CisJCQkJCQlyZXR1cm4gLUVIT1NURE9XTjsKKwkJCQkJfSAvKiBlbHNlICJoYXJkIiBtb3VudCAtIGtlZXAgcmV0cnlpbmcgdW50aWwgCisJCQkJCXByb2Nlc3MgaXMga2lsbGVkIG9yIHNlcnZlciBjb21lcyBiYWNrIHVwICovCisJCQkJfSBlbHNlIC8qIFRDUCBzZXNzaW9uIGlzIHJlZXN0YWJsaXNoZWQgbm93ICovCisJCQkJCWJyZWFrOworCQkJCSAKKwkJCX0KKwkJCQorCQkJbmxzX2NvZGVwYWdlID0gbG9hZF9ubHNfZGVmYXVsdCgpOworCQkvKiBuZWVkIHRvIHByZXZlbnQgbXVsdGlwbGUgdGhyZWFkcyB0cnlpbmcgdG8KKwkJc2ltdWx0YW5lb3VzbHkgcmVjb25uZWN0IHRoZSBzYW1lIFNNQiBzZXNzaW9uICovCisJCQlkb3duKCZ0Y29uLT5zZXMtPnNlc1NlbSk7CisJCQlpZih0Y29uLT5zZXMtPnN0YXR1cyA9PSBDaWZzTmVlZFJlY29ubmVjdCkKKwkJCQlyYyA9IGNpZnNfc2V0dXBfc2Vzc2lvbigwLCB0Y29uLT5zZXMsIG5sc19jb2RlcGFnZSk7CisJCQlpZighcmMgJiYgKHRjb24tPnRpZFN0YXR1cyA9PSBDaWZzTmVlZFJlY29ubmVjdCkpIHsKKwkJCQltYXJrX29wZW5fZmlsZXNfaW52YWxpZCh0Y29uKTsKKwkJCQlyYyA9IENJRlNUQ29uKDAsIHRjb24tPnNlcywgdGNvbi0+dHJlZU5hbWUsIHRjb24sCisJCQkJCW5sc19jb2RlcGFnZSk7CisJCQkJdXAoJnRjb24tPnNlcy0+c2VzU2VtKTsKKwkJCQlpZihyYyA9PSAwKQorCQkJCQlhdG9taWNfaW5jKCZ0Y29uSW5mb1JlY29ubmVjdENvdW50KTsKKworCQkJCWNGWUkoMSwgKCJyZWNvbm5lY3QgdGNvbiByYyA9ICVkIiwgcmMpKTsKKwkJCQkvKiBSZW1vdmVkIGNhbGwgdG8gcmVvcGVuIG9wZW4gZmlsZXMgaGVyZSAtIAorCQkJCQlpdCBpcyBzYWZlciAoYW5kIGZhc3RlcikgdG8gcmVvcGVuIGZpbGVzCisJCQkJCW9uZSBhdCBhIHRpbWUgYXMgbmVlZGVkIGluIHJlYWQgYW5kIHdyaXRlICovCisKKwkJCQkvKiBDaGVjayBpZiBoYW5kbGUgYmFzZWQgb3BlcmF0aW9uIHNvIHdlIAorCQkJCQlrbm93IHdoZXRoZXIgd2UgY2FuIGNvbnRpbnVlIG9yIG5vdCB3aXRob3V0CisJCQkJCXJldHVybmluZyB0byBjYWxsZXIgdG8gcmVzZXQgZmlsZSBoYW5kbGUgKi8KKwkJCQlzd2l0Y2goc21iX2NvbW1hbmQpIHsKKwkJCQkJY2FzZSBTTUJfQ09NX1JFQURfQU5EWDoKKwkJCQkJY2FzZSBTTUJfQ09NX1dSSVRFX0FORFg6CisJCQkJCWNhc2UgU01CX0NPTV9DTE9TRToKKwkJCQkJY2FzZSBTTUJfQ09NX0ZJTkRfQ0xPU0UyOgorCQkJCQljYXNlIFNNQl9DT01fTE9DS0lOR19BTkRYOiB7CisJCQkJCQl1bmxvYWRfbmxzKG5sc19jb2RlcGFnZSk7CisJCQkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJdXAoJnRjb24tPnNlcy0+c2VzU2VtKTsKKwkJCX0KKwkJCXVubG9hZF9ubHMobmxzX2NvZGVwYWdlKTsKKworCQl9IGVsc2UgeworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisJaWYocmMpCisJCXJldHVybiByYzsKKworCSpyZXF1ZXN0X2J1ZiA9IGNpZnNfYnVmX2dldCgpOworCWlmICgqcmVxdWVzdF9idWYgPT0gTlVMTCkgeworCQkvKiBCQiBzaG91bGQgd2UgYWRkIGEgcmV0cnkgaW4gaGVyZSBpZiBub3QgYSB3cml0ZXBhZ2U/ICovCisJCXJldHVybiAtRU5PTUVNOworCX0KKyAgICAvKiBBbHRob3VnaCB0aGUgb3JpZ2luYWwgdGhvdWdodCB3YXMgd2UgbmVlZGVkIHRoZSByZXNwb25zZSBidWYgZm9yICAqLworICAgIC8qIHBvdGVudGlhbCByZXRyaWVzIG9mIHNtYiBvcGVyYXRpb25zIGl0IHR1cm5zIG91dCB3ZSBjYW4gZGV0ZXJtaW5lICovCisgICAgLyogZnJvbSB0aGUgbWlkIGZsYWdzIHdoZW4gdGhlIHJlcXVlc3QgYnVmZmVyIGNhbiBiZSByZXNlbnQgd2l0aG91dCAgKi8KKyAgICAvKiBoYXZpbmcgdG8gdXNlIGEgc2Vjb25kIGRpc3RpbmN0IGJ1ZmZlciBmb3IgdGhlIHJlc3BvbnNlICovCisJKnJlc3BvbnNlX2J1ZiA9ICpyZXF1ZXN0X2J1ZjsgCisKKwloZWFkZXJfYXNzZW1ibGUoKHN0cnVjdCBzbWJfaGRyICopICpyZXF1ZXN0X2J1Ziwgc21iX2NvbW1hbmQsIHRjb24sCisJCQl3Y3QgLyp3Y3QgKi8gKTsKKworI2lmZGVmIENPTkZJR19DSUZTX1NUQVRTCisgICAgICAgIGlmKHRjb24gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGF0b21pY19pbmMoJnRjb24tPm51bV9zbWJzX3NlbnQpOworICAgICAgICB9CisjZW5kaWYgLyogQ09ORklHX0NJRlNfU1RBVFMgKi8KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgdmFsaWRhdGVfdDIoc3RydWN0IHNtYl90Ml9yc3AgKiBwU01CKSAKK3sKKwlpbnQgcmMgPSAtRUlOVkFMOworCWludCB0b3RhbF9zaXplOworCWNoYXIgKiBwQkNDOworCisJLyogY2hlY2sgZm9yIHBsYXVzaWJsZSB3Y3QsIGJjYyBhbmQgdDIgZGF0YSBhbmQgcGFybSBzaXplcyAqLworCS8qIGNoZWNrIGZvciBwYXJtIGFuZCBkYXRhIG9mZnNldCBnb2luZyBiZXlvbmQgZW5kIG9mIHNtYiAqLworCWlmKHBTTUItPmhkci5Xb3JkQ291bnQgPj0gMTApIHsKKwkJaWYoKGxlMTZfdG9fY3B1KHBTTUItPnQyX3JzcC5QYXJhbWV0ZXJPZmZzZXQpIDw9IDEwMjQpICYmCisJCSAgIChsZTE2X3RvX2NwdShwU01CLT50Ml9yc3AuRGF0YU9mZnNldCkgPD0gMTAyNCkpIHsKKwkJCS8qIGNoZWNrIHRoYXQgYmNjIGlzIGF0IGxlYXN0IGFzIGJpZyBhcyBwYXJtcyArIGRhdGEgKi8KKwkJCS8qIGNoZWNrIHRoYXQgYmNjIGlzIGxlc3MgdGhhbiBuZWdvdGlhdGVkIHNtYiBidWZmZXIgKi8KKwkJCXRvdGFsX3NpemUgPSBsZTE2X3RvX2NwdShwU01CLT50Ml9yc3AuUGFyYW1ldGVyQ291bnQpOworCQkJaWYodG90YWxfc2l6ZSA8IDUxMikgeworCQkJCXRvdGFsX3NpemUrPWxlMTZfdG9fY3B1KHBTTUItPnQyX3JzcC5EYXRhQ291bnQpOworCQkJCS8qIEJDQyBsZSBjb252ZXJ0ZWQgaW4gU2VuZFJlY2VpdmUgKi8KKwkJCQlwQkNDID0gKHBTTUItPmhkci5Xb3JkQ291bnQgKiAyKSArIHNpemVvZihzdHJ1Y3Qgc21iX2hkcikgKyAKKwkJCQkJKGNoYXIgKilwU01COworCQkJCWlmKCh0b3RhbF9zaXplIDw9ICgqKHUxNiAqKXBCQ0MpKSAmJiAKKwkJCQkgICAodG90YWxfc2l6ZSA8IAorCQkJCQlDSUZTTWF4QnVmU2l6ZStNQVhfQ0lGU19IRFJfU0laRSkpIHsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJCQorCQkJfQorCQl9CisJfQorCWNpZnNfZHVtcF9tZW0oIkludmFsaWQgdHJhbnNhY3QyIFNNQjogIiwoY2hhciAqKXBTTUIsCisJCXNpemVvZihzdHJ1Y3Qgc21iX3QyX3JzcCkgKyAxNik7CisJcmV0dXJuIHJjOworfQoraW50CitDSUZTU01CTmVnb3RpYXRlKHVuc2lnbmVkIGludCB4aWQsIHN0cnVjdCBjaWZzU2VzSW5mbyAqc2VzKQoreworCU5FR09USUFURV9SRVEgKnBTTUI7CisJTkVHT1RJQVRFX1JTUCAqcFNNQnI7CisJaW50IHJjID0gMDsKKwlpbnQgYnl0ZXNfcmV0dXJuZWQ7CisJc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqIHNlcnZlcjsKKwl1MTYgY291bnQ7CisKKwlpZihzZXMtPnNlcnZlcikKKwkJc2VydmVyID0gc2VzLT5zZXJ2ZXI7CisJZWxzZSB7CisJCXJjID0gLUVJTzsKKwkJcmV0dXJuIHJjOworCX0KKwlyYyA9IHNtYl9pbml0KFNNQl9DT01fTkVHT1RJQVRFLCAwLCBOVUxMIC8qIG5vIHRjb24geWV0ICovICwKKwkJICAgICAgKHZvaWQgKiopICZwU01CLCAodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXBTTUItPmhkci5GbGFnczIgfD0gU01CRkxHMl9VTklDT0RFOworCWlmIChleHRlbmRlZF9zZWN1cml0eSkKKwkJcFNNQi0+aGRyLkZsYWdzMiB8PSBTTUJGTEcyX0VYVF9TRUM7CisKKwljb3VudCA9IHN0cmxlbihwcm90b2NvbHNbMF0ubmFtZSkgKyAxOworCXN0cm5jcHkocFNNQi0+RGlhbGVjdHNBcnJheSwgcHJvdG9jb2xzWzBdLm5hbWUsIDMwKTsJCisgICAgLyogbnVsbCBndWFyYW50ZWVkIHRvIGJlIGF0IGVuZCBvZiBzb3VyY2UgYW5kIHRhcmdldCBidWZmZXJzIGFueXdheSAqLworCisJcFNNQi0+aGRyLnNtYl9idWZfbGVuZ3RoICs9IGNvdW50OworCXBTTUItPkJ5dGVDb3VudCA9IGNwdV90b19sZTE2KGNvdW50KTsKKworCXJjID0gU2VuZFJlY2VpdmUoeGlkLCBzZXMsIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CLAorCQkJIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CciwgJmJ5dGVzX3JldHVybmVkLCAwKTsKKwlpZiAocmMgPT0gMCkgeworCQlzZXJ2ZXItPnNlY01vZGUgPSBwU01Cci0+U2VjdXJpdHlNb2RlOwkKKwkJc2VydmVyLT5zZWNUeXBlID0gTlRMTTsgLyogQkIgb3ZlcnJpZGUgZGVmYXVsdCBmb3IgTlRMTXYyIG9yIGtyYiovCisJCS8qIG9uZSBieXRlIC0gbm8gbmVlZCB0byBjb252ZXJ0IHRoaXMgb3IgRW5jcnlwdGlvbktleUxlbiBmcm9tIGxlLCovCisJCXNlcnZlci0+bWF4UmVxID0gbGUxNl90b19jcHUocFNNQnItPk1heE1weENvdW50KTsKKwkJLyogcHJvYmFibHkgbm8gbmVlZCB0byBzdG9yZSBhbmQgY2hlY2sgbWF4dmNzICovCisJCXNlcnZlci0+bWF4QnVmID0KKwkJCW1pbihsZTMyX3RvX2NwdShwU01Cci0+TWF4QnVmZmVyU2l6ZSksCisJCQkoX191MzIpIENJRlNNYXhCdWZTaXplICsgTUFYX0NJRlNfSERSX1NJWkUpOworCQlzZXJ2ZXItPm1heFJ3ID0gbGUzMl90b19jcHUocFNNQnItPk1heFJhd1NpemUpOworCQljRllJKDAsICgiTWF4IGJ1ZiA9ICVkICIsIHNlcy0+c2VydmVyLT5tYXhCdWYpKTsKKwkJR0VUVTMyKHNlcy0+c2VydmVyLT5zZXNzaWQpID0gbGUzMl90b19jcHUocFNNQnItPlNlc3Npb25LZXkpOworCQlzZXJ2ZXItPmNhcGFiaWxpdGllcyA9IGxlMzJfdG9fY3B1KHBTTUJyLT5DYXBhYmlsaXRpZXMpOworCQlzZXJ2ZXItPnRpbWVab25lID0gbGUxNl90b19jcHUocFNNQnItPlNlcnZlclRpbWVab25lKTsJCisgICAgICAgIC8qIEJCIHdpdGggVVRDIGRvIHdlIGV2ZXIgbmVlZCB0byBiZSB1c2luZyBzcnZyIHRpbWV6b25lPyAqLworCQlpZiAocFNNQnItPkVuY3J5cHRpb25LZXlMZW5ndGggPT0gQ0lGU19DUllQVE9fS0VZX1NJWkUpIHsKKwkJCW1lbWNweShzZXJ2ZXItPmNyeXB0S2V5LCBwU01Cci0+dS5FbmNyeXB0aW9uS2V5LAorCQkJICAgICAgIENJRlNfQ1JZUFRPX0tFWV9TSVpFKTsKKwkJfSBlbHNlIGlmICgocFNNQnItPmhkci5GbGFnczIgJiBTTUJGTEcyX0VYVF9TRUMpCisJCQkgICAmJiAocFNNQnItPkVuY3J5cHRpb25LZXlMZW5ndGggPT0gMCkpIHsKKwkJCS8qIGRlY29kZSBzZWN1cml0eSBibG9iICovCisJCX0gZWxzZQorCQkJcmMgPSAtRUlPOworCisJCS8qIEJCIG1pZ2h0IGJlIGhlbHBmdWwgdG8gc2F2ZSBvZmYgdGhlIGRvbWFpbiBvZiBzZXJ2ZXIgaGVyZSAqLworCisJCWlmICgocFNNQnItPmhkci5GbGFnczIgJiBTTUJGTEcyX0VYVF9TRUMpICYmIAorCQkJKHNlcnZlci0+Y2FwYWJpbGl0aWVzICYgQ0FQX0VYVEVOREVEX1NFQ1VSSVRZKSkgeworCQkJY291bnQgPSBwU01Cci0+Qnl0ZUNvdW50OworCQkJaWYgKGNvdW50IDwgMTYpCisJCQkJcmMgPSAtRUlPOworCQkJZWxzZSBpZiAoY291bnQgPT0gMTYpIHsKKwkJCQlzZXJ2ZXItPnNlY1R5cGUgPSBSYXdOVExNU1NQOworCQkJCWlmIChzZXJ2ZXItPnNvY2tldFVzZUNvdW50LmNvdW50ZXIgPiAxKSB7CisJCQkJCWlmIChtZW1jbXAKKwkJCQkJCShzZXJ2ZXItPnNlcnZlcl9HVUlELAorCQkJCQkJcFNNQnItPnUuZXh0ZW5kZWRfcmVzcG9uc2UuCisJCQkJCQlHVUlELCAxNikgIT0gMCkgeworCQkJCQkJY0ZZSSgxLAorCQkJCQkJCSgiVUlEIG9mIHNlcnZlciBkb2VzIG5vdCBtYXRjaCBwcmV2aW91cyBjb25uZWN0aW9uIHRvIHNhbWUgaXAgYWRkcmVzcyIpKTsKKwkJCQkJCW1lbWNweShzZXJ2ZXItPgorCQkJCQkJCXNlcnZlcl9HVUlELAorCQkJCQkJCXBTTUJyLT51LgorCQkJCQkJCWV4dGVuZGVkX3Jlc3BvbnNlLgorCQkJCQkJCUdVSUQsIDE2KTsKKwkJCQkJfQorCQkJCX0gZWxzZQorCQkJCQltZW1jcHkoc2VydmVyLT5zZXJ2ZXJfR1VJRCwKKwkJCQkJICAgICAgIHBTTUJyLT51LmV4dGVuZGVkX3Jlc3BvbnNlLgorCQkJCQkgICAgICAgR1VJRCwgMTYpOworCQkJfSBlbHNlIHsKKwkJCQlyYyA9IGRlY29kZV9uZWdUb2tlbkluaXQocFNNQnItPnUuCisJCQkJCQkJIGV4dGVuZGVkX3Jlc3BvbnNlLgorCQkJCQkJCSBTZWN1cml0eUJsb2IsCisJCQkJCQkJIGNvdW50IC0gMTYsCisJCQkJCQkJICZzZXJ2ZXItPnNlY1R5cGUpOworCQkJCWlmKHJjID09IDEpIHsKKwkJCQkvKiBCQiBOZWVkIHRvIGZpbGwgc3RydWN0IGZvciBzZXNzZXR1cCBoZXJlICovCisJCQkJCXJjID0gLUVPUE5PVFNVUFA7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmMgPSAtRUlOVkFMOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlCisJCQlzZXJ2ZXItPmNhcGFiaWxpdGllcyAmPSB+Q0FQX0VYVEVOREVEX1NFQ1VSSVRZOworCQlpZihzaWduX0NJRlNfUERVcyA9PSBGQUxTRSkgeyAgICAgICAgCisJCQlpZihzZXJ2ZXItPnNlY01vZGUgJiBTRUNNT0RFX1NJR05fUkVRVUlSRUQpCisJCQkJY0VSUk9SKDEsCisJCQkJICgiU2VydmVyIHJlcXVpcmVzIC9wcm9jL2ZzL2NpZnMvUGFja2V0U2lnbmluZ0VuYWJsZWQiKSk7CisJCQlzZXJ2ZXItPnNlY01vZGUgJj0gfihTRUNNT0RFX1NJR05fRU5BQkxFRCB8IFNFQ01PREVfU0lHTl9SRVFVSVJFRCk7CisJCX0gZWxzZSBpZihzaWduX0NJRlNfUERVcyA9PSAxKSB7CisJCQlpZigoc2VydmVyLT5zZWNNb2RlICYgU0VDTU9ERV9TSUdOX1JFUVVJUkVEKSA9PSAwKQorCQkJCXNlcnZlci0+c2VjTW9kZSAmPSB+KFNFQ01PREVfU0lHTl9FTkFCTEVEIHwgU0VDTU9ERV9TSUdOX1JFUVVJUkVEKTsKKwkJfQorCQkJCQorCX0KKwlpZiAocFNNQikKKwkJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludAorQ0lGU1NNQlREaXMoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbikKK3sKKwlzdHJ1Y3Qgc21iX2hkciAqc21iX2J1ZmZlcjsKKwlzdHJ1Y3Qgc21iX2hkciAqc21iX2J1ZmZlcl9yZXNwb25zZTsgLyogQkIgcmVtb3ZlbWUgQkIgKi8KKwlpbnQgcmMgPSAwOworCWludCBsZW5ndGg7CisKKwljRllJKDEsICgiSW4gdHJlZSBkaXNjb25uZWN0IikpOworCS8qCisJICogIElmIGxhc3QgdXNlciBvZiB0aGUgY29ubmVjdGlvbiBhbmQKKwkgKiAgY29ubmVjdGlvbiBhbGl2ZSAtIGRpc2Nvbm5lY3QgaXQKKwkgKiAgSWYgdGhpcyBpcyB0aGUgbGFzdCBjb25uZWN0aW9uIG9uIHRoZSBzZXJ2ZXIgc2Vzc2lvbiBkaXNjb25uZWN0IGl0CisJICogIChhbmQgaW5zaWRlIHNlc3Npb24gZGlzY29ubmVjdCB3ZSBzaG91bGQgY2hlY2sgaWYgdGNwIHNvY2tldCBuZWVkcyAKKwkgKiAgdG8gYmUgZnJlZWQgYW5kIGtlcm5lbCB0aHJlYWQgd29rZW4gdXApLgorCSAqLworCWlmICh0Y29uKQorCQlkb3duKCZ0Y29uLT50Y29uU2VtKTsKKwllbHNlCisJCXJldHVybiAtRUlPOworCisJYXRvbWljX2RlYygmdGNvbi0+dXNlQ291bnQpOworCWlmIChhdG9taWNfcmVhZCgmdGNvbi0+dXNlQ291bnQpID4gMCkgeworCQl1cCgmdGNvbi0+dGNvblNlbSk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyogTm8gbmVlZCB0byByZXR1cm4gZXJyb3Igb24gdGhpcyBvcGVyYXRpb24gaWYgdGlkIGludmFsaWRhdGVkIGFuZCAKKwljbG9zZWQgb24gc2VydmVyIGFscmVhZHkgZS5nLiBkdWUgdG8gdGNwIHNlc3Npb24gY3Jhc2hpbmcgKi8KKwlpZih0Y29uLT50aWRTdGF0dXMgPT0gQ2lmc05lZWRSZWNvbm5lY3QpIHsKKwkJdXAoJnRjb24tPnRjb25TZW0pOworCQlyZXR1cm4gMDsgIAorCX0KKworCWlmKCh0Y29uLT5zZXMgPT0gTlVMTCkgfHwgKHRjb24tPnNlcy0+c2VydmVyID09IE5VTEwpKSB7ICAgIAorCQl1cCgmdGNvbi0+dGNvblNlbSk7CisJCXJldHVybiAtRUlPOworCX0KKwlyYyA9IHNtYWxsX3NtYl9pbml0KFNNQl9DT01fVFJFRV9ESVNDT05ORUNULCAwLCB0Y29uLCAodm9pZCAqKikmc21iX2J1ZmZlcik7CisJaWYgKHJjKSB7CisJCXVwKCZ0Y29uLT50Y29uU2VtKTsKKwkJcmV0dXJuIHJjOworCX0gZWxzZSB7CisJCXNtYl9idWZmZXJfcmVzcG9uc2UgPSBzbWJfYnVmZmVyOyAvKiBCQiByZW1vdmVtZSBCQiAqLworICAgIH0KKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCBzbWJfYnVmZmVyLCBzbWJfYnVmZmVyX3Jlc3BvbnNlLAorCQkJICZsZW5ndGgsIDApOworCWlmIChyYykKKwkJY0ZZSSgxLCAoIiBUcmVlIGRpc2Nvbm5lY3QgZmFpbGVkICVkIiwgcmMpKTsKKworCWlmIChzbWJfYnVmZmVyKQorCQljaWZzX3NtYWxsX2J1Zl9yZWxlYXNlKHNtYl9idWZmZXIpOworCXVwKCZ0Y29uLT50Y29uU2VtKTsKKworCS8qIE5vIG5lZWQgdG8gcmV0dXJuIGVycm9yIG9uIHRoaXMgb3BlcmF0aW9uIGlmIHRpZCBpbnZhbGlkYXRlZCBhbmQgCisJY2xvc2VkIG9uIHNlcnZlciBhbHJlYWR5IGUuZy4gZHVlIHRvIHRjcCBzZXNzaW9uIGNyYXNoaW5nICovCisJaWYgKHJjID09IC1FQUdBSU4pCisJCXJjID0gMDsKKworCXJldHVybiByYzsKK30KKworaW50CitDSUZTU01CTG9nb2ZmKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzU2VzSW5mbyAqc2VzKQoreworCXN0cnVjdCBzbWJfaGRyICpzbWJfYnVmZmVyX3Jlc3BvbnNlOworCUxPR09GRl9BTkRYX1JFUSAqcFNNQjsKKwlpbnQgcmMgPSAwOworCWludCBsZW5ndGg7CisKKwljRllJKDEsICgiSW4gU01CTG9nb2ZmIGZvciBzZXNzaW9uIGRpc2Nvbm5lY3QiKSk7CisJaWYgKHNlcykKKwkJZG93bigmc2VzLT5zZXNTZW0pOworCWVsc2UKKwkJcmV0dXJuIC1FSU87CisKKwlhdG9taWNfZGVjKCZzZXMtPmluVXNlKTsKKwlpZiAoYXRvbWljX3JlYWQoJnNlcy0+aW5Vc2UpID4gMCkgeworCQl1cCgmc2VzLT5zZXNTZW0pOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlyYyA9IHNtYWxsX3NtYl9pbml0KFNNQl9DT01fTE9HT0ZGX0FORFgsIDIsIE5VTEwsICh2b2lkICoqKSZwU01CKTsKKwlpZiAocmMpIHsKKwkJdXAoJnNlcy0+c2VzU2VtKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXNtYl9idWZmZXJfcmVzcG9uc2UgPSAoc3RydWN0IHNtYl9oZHIgKilwU01COyAvKiBCQiByZW1vdmVtZSBCQiAqLworCQorCWlmKHNlcy0+c2VydmVyKSB7CisJCWlmKHNlcy0+c2VydmVyLT5zZWNNb2RlICYgCisJCSAgIChTRUNNT0RFX1NJR05fUkVRVUlSRUQgfCBTRUNNT0RFX1NJR05fRU5BQkxFRCkpCisJCQlwU01CLT5oZHIuRmxhZ3MyIHw9IFNNQkZMRzJfU0VDVVJJVFlfU0lHTkFUVVJFOworCX0KKworCXBTTUItPmhkci5VaWQgPSBzZXMtPlN1aWQ7CisKKwlwU01CLT5BbmRYQ29tbWFuZCA9IDB4RkY7CisJcmMgPSBTZW5kUmVjZWl2ZSh4aWQsIHNlcywgKHN0cnVjdCBzbWJfaGRyICopIHBTTUIsCisJCQkgc21iX2J1ZmZlcl9yZXNwb25zZSwgJmxlbmd0aCwgMCk7CisJaWYgKHNlcy0+c2VydmVyKSB7CisJCWF0b21pY19kZWMoJnNlcy0+c2VydmVyLT5zb2NrZXRVc2VDb3VudCk7CisJCWlmIChhdG9taWNfcmVhZCgmc2VzLT5zZXJ2ZXItPnNvY2tldFVzZUNvdW50KSA9PSAwKSB7CisJCQlzcGluX2xvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwkJCXNlcy0+c2VydmVyLT50Y3BTdGF0dXMgPSBDaWZzRXhpdGluZzsKKwkJCXNwaW5fdW5sb2NrKCZHbG9iYWxNaWRfTG9jayk7CisJCQlyYyA9IC1FU0hVVERPV047CisJCX0KKwl9CisJaWYgKHBTTUIpCisJCWNpZnNfc21hbGxfYnVmX3JlbGVhc2UocFNNQik7CisJdXAoJnNlcy0+c2VzU2VtKTsKKworCS8qIGlmIHNlc3Npb24gZGVhZCB0aGVuIHdlIGRvIG5vdCBuZWVkIHRvIGRvIHVsb2dvZmYsCisJCXNpbmNlIHNlcnZlciBjbG9zZWQgc21iIHNlc3Npb24sIG5vIHNlbnNlIHJlcG9ydGluZyAKKwkJZXJyb3IgKi8KKwlpZiAocmMgPT0gLUVBR0FJTikKKwkJcmMgPSAwOworCXJldHVybiByYzsKK30KKworaW50CitDSUZTU01CRGVsRmlsZShjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCSAgICAgICBjb25zdCBjaGFyICpmaWxlTmFtZSwgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworCURFTEVURV9GSUxFX1JFUSAqcFNNQiA9IE5VTEw7CisJREVMRVRFX0ZJTEVfUlNQICpwU01CciA9IE5VTEw7CisJaW50IHJjID0gMDsKKwlpbnQgYnl0ZXNfcmV0dXJuZWQ7CisJaW50IG5hbWVfbGVuOworCitEZWxGaWxlUmV0cnk6CisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX0RFTEVURSwgMSwgdGNvbiwgKHZvaWQgKiopICZwU01CLAorCQkgICAgICAodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmIChwU01CLT5oZHIuRmxhZ3MyICYgU01CRkxHMl9VTklDT0RFKSB7CisJCW5hbWVfbGVuID0KKwkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgcFNNQi0+ZmlsZU5hbWUsIGZpbGVOYW1lLCBQQVRIX01BWAorCQkJCSAgLyogZmluZCBkZWZpbmUgZm9yIHRoaXMgbWF4cGF0aGNvbXBvbmVudCAqLworCQkJCSAgLCBubHNfY29kZXBhZ2UpOworCQluYW1lX2xlbisrOwkvKiB0cmFpbGluZyBudWxsICovCisJCW5hbWVfbGVuICo9IDI7CisJfSBlbHNlIHsJCS8qIEJCIGltcHJvdmUgdGhlIGNoZWNrIGZvciBidWZmZXIgb3ZlcnJ1bnMgQkIgKi8KKwkJbmFtZV9sZW4gPSBzdHJubGVuKGZpbGVOYW1lLCBQQVRIX01BWCk7CisJCW5hbWVfbGVuKys7CS8qIHRyYWlsaW5nIG51bGwgKi8KKwkJc3RybmNweShwU01CLT5maWxlTmFtZSwgZmlsZU5hbWUsIG5hbWVfbGVuKTsKKwl9CisJcFNNQi0+U2VhcmNoQXR0cmlidXRlcyA9CisJICAgIGNwdV90b19sZTE2KEFUVFJfUkVBRE9OTFkgfCBBVFRSX0hJRERFTiB8IEFUVFJfU1lTVEVNKTsKKwlwU01CLT5CdWZmZXJGb3JtYXQgPSAweDA0OworCXBTTUItPmhkci5zbWJfYnVmX2xlbmd0aCArPSBuYW1lX2xlbiArIDE7CisJcFNNQi0+Qnl0ZUNvdW50ID0gY3B1X3RvX2xlMTYobmFtZV9sZW4gKyAxKTsKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKwkJCSAoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMCk7CisJaWYgKHJjKSB7CisJCWNGWUkoMSwgKCJFcnJvciBpbiBSTUZpbGUgPSAlZCIsIHJjKSk7CisJfSAKKyNpZmRlZiBDT05GSUdfQ0lGU19TVEFUUworICAgICAgICBlbHNlIHsKKwkJYXRvbWljX2luYygmdGNvbi0+bnVtX2RlbGV0ZXMpOworICAgICAgICB9CisjZW5kaWYKKworCWNpZnNfYnVmX3JlbGVhc2UocFNNQik7CisJaWYgKHJjID09IC1FQUdBSU4pCisJCWdvdG8gRGVsRmlsZVJldHJ5OworCisJcmV0dXJuIHJjOworfQorCitpbnQKK0NJRlNTTUJSbURpcihjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCSAgICAgY29uc3QgY2hhciAqZGlyTmFtZSwgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworCURFTEVURV9ESVJFQ1RPUllfUkVRICpwU01CID0gTlVMTDsKKwlERUxFVEVfRElSRUNUT1JZX1JTUCAqcFNNQnIgPSBOVUxMOworCWludCByYyA9IDA7CisJaW50IGJ5dGVzX3JldHVybmVkOworCWludCBuYW1lX2xlbjsKKworCWNGWUkoMSwgKCJJbiBDSUZTU01CUm1EaXIiKSk7CitSbURpclJldHJ5OgorCXJjID0gc21iX2luaXQoU01CX0NPTV9ERUxFVEVfRElSRUNUT1JZLCAwLCB0Y29uLCAodm9pZCAqKikgJnBTTUIsCisJCSAgICAgICh2b2lkICoqKSAmcFNNQnIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJaWYgKHBTTUItPmhkci5GbGFnczIgJiBTTUJGTEcyX1VOSUNPREUpIHsKKwkJbmFtZV9sZW4gPSBjaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIHBTTUItPkRpck5hbWUsIGRpck5hbWUsIFBBVEhfTUFYCisJCQkJLyogZmluZCBkZWZpbmUgZm9yIHRoaXMgbWF4cGF0aGNvbXBvbmVudCAqLworCQkJCSwgbmxzX2NvZGVwYWdlKTsKKwkJbmFtZV9sZW4rKzsJLyogdHJhaWxpbmcgbnVsbCAqLworCQluYW1lX2xlbiAqPSAyOworCX0gZWxzZSB7CQkvKiBCQiBpbXByb3ZlIHRoZSBjaGVjayBmb3IgYnVmZmVyIG92ZXJydW5zIEJCICovCisJCW5hbWVfbGVuID0gc3RybmxlbihkaXJOYW1lLCBQQVRIX01BWCk7CisJCW5hbWVfbGVuKys7CS8qIHRyYWlsaW5nIG51bGwgKi8KKwkJc3RybmNweShwU01CLT5EaXJOYW1lLCBkaXJOYW1lLCBuYW1lX2xlbik7CisJfQorCisJcFNNQi0+QnVmZmVyRm9ybWF0ID0gMHgwNDsKKwlwU01CLT5oZHIuc21iX2J1Zl9sZW5ndGggKz0gbmFtZV9sZW4gKyAxOworCXBTTUItPkJ5dGVDb3VudCA9IGNwdV90b19sZTE2KG5hbWVfbGVuICsgMSk7CisJcmMgPSBTZW5kUmVjZWl2ZSh4aWQsIHRjb24tPnNlcywgKHN0cnVjdCBzbWJfaGRyICopIHBTTUIsCisJCQkgKHN0cnVjdCBzbWJfaGRyICopIHBTTUJyLCAmYnl0ZXNfcmV0dXJuZWQsIDApOworCWlmIChyYykgeworCQljRllJKDEsICgiRXJyb3IgaW4gUk1EaXIgPSAlZCIsIHJjKSk7CisJfQorI2lmZGVmIENPTkZJR19DSUZTX1NUQVRTCisgICAgICAgIGVsc2UgeworCQlhdG9taWNfaW5jKCZ0Y29uLT5udW1fcm1kaXJzKTsKKyAgICAgICAgfQorI2VuZGlmCisKKwljaWZzX2J1Zl9yZWxlYXNlKHBTTUIpOworCWlmIChyYyA9PSAtRUFHQUlOKQorCQlnb3RvIFJtRGlyUmV0cnk7CisJcmV0dXJuIHJjOworfQorCitpbnQKK0NJRlNTTUJNa0Rpcihjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCSAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworCWludCByYyA9IDA7CisJQ1JFQVRFX0RJUkVDVE9SWV9SRVEgKnBTTUIgPSBOVUxMOworCUNSRUFURV9ESVJFQ1RPUllfUlNQICpwU01CciA9IE5VTEw7CisJaW50IGJ5dGVzX3JldHVybmVkOworCWludCBuYW1lX2xlbjsKKworCWNGWUkoMSwgKCJJbiBDSUZTU01CTWtEaXIiKSk7CitNa0RpclJldHJ5OgorCXJjID0gc21iX2luaXQoU01CX0NPTV9DUkVBVEVfRElSRUNUT1JZLCAwLCB0Y29uLCAodm9pZCAqKikgJnBTTUIsCisJCSAgICAgICh2b2lkICoqKSAmcFNNQnIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJaWYgKHBTTUItPmhkci5GbGFnczIgJiBTTUJGTEcyX1VOSUNPREUpIHsKKwkJbmFtZV9sZW4gPSBjaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIHBTTUItPkRpck5hbWUsIG5hbWUsIFBBVEhfTUFYCisJCQkJCSAvKiBmaW5kIGRlZmluZSBmb3IgdGhpcyBtYXhwYXRoY29tcG9uZW50ICovCisJCQkJCSAsIG5sc19jb2RlcGFnZSk7CisJCW5hbWVfbGVuKys7CS8qIHRyYWlsaW5nIG51bGwgKi8KKwkJbmFtZV9sZW4gKj0gMjsKKwl9IGVsc2UgewkJLyogQkIgaW1wcm92ZSB0aGUgY2hlY2sgZm9yIGJ1ZmZlciBvdmVycnVucyBCQiAqLworCQluYW1lX2xlbiA9IHN0cm5sZW4obmFtZSwgUEFUSF9NQVgpOworCQluYW1lX2xlbisrOwkvKiB0cmFpbGluZyBudWxsICovCisJCXN0cm5jcHkocFNNQi0+RGlyTmFtZSwgbmFtZSwgbmFtZV9sZW4pOworCX0KKworCXBTTUItPkJ1ZmZlckZvcm1hdCA9IDB4MDQ7CisJcFNNQi0+aGRyLnNtYl9idWZfbGVuZ3RoICs9IG5hbWVfbGVuICsgMTsKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihuYW1lX2xlbiArIDEpOworCXJjID0gU2VuZFJlY2VpdmUoeGlkLCB0Y29uLT5zZXMsIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CLAorCQkJIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CciwgJmJ5dGVzX3JldHVybmVkLCAwKTsKKwlpZiAocmMpIHsKKwkJY0ZZSSgxLCAoIkVycm9yIGluIE1rZGlyID0gJWQiLCByYykpOworCX0KKyNpZmRlZiBDT05GSUdfQ0lGU19TVEFUUworICAgICAgICBlbHNlIHsKKwkJYXRvbWljX2luYygmdGNvbi0+bnVtX21rZGlycyk7CisgICAgICAgIH0KKyNlbmRpZgorCWNpZnNfYnVmX3JlbGVhc2UocFNNQik7CisJaWYgKHJjID09IC1FQUdBSU4pCisJCWdvdG8gTWtEaXJSZXRyeTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludAorQ0lGU1NNQk9wZW4oY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkgICAgY29uc3QgY2hhciAqZmlsZU5hbWUsIGNvbnN0IGludCBvcGVuRGlzcG9zaXRpb24sCisJICAgIGNvbnN0IGludCBhY2Nlc3NfZmxhZ3MsIGNvbnN0IGludCBjcmVhdGVfb3B0aW9ucywgX191MTYgKiBuZXRmaWQsCisJICAgIGludCAqcE9wbG9jaywgRklMRV9BTExfSU5GTyAqIHBmaWxlX2luZm8sIAorCSAgICBjb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpCit7CisJaW50IHJjID0gLUVBQ0NFUzsKKwlPUEVOX1JFUSAqcFNNQiA9IE5VTEw7CisJT1BFTl9SU1AgKnBTTUJyID0gTlVMTDsKKwlpbnQgYnl0ZXNfcmV0dXJuZWQ7CisJaW50IG5hbWVfbGVuOworCV9fdTE2IGNvdW50OworCitvcGVuUmV0cnk6CisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX05UX0NSRUFURV9BTkRYLCAyNCwgdGNvbiwgKHZvaWQgKiopICZwU01CLAorCQkgICAgICAodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXBTTUItPkFuZFhDb21tYW5kID0gMHhGRjsJLyogbm9uZSAqLworCisJaWYgKHBTTUItPmhkci5GbGFnczIgJiBTTUJGTEcyX1VOSUNPREUpIHsKKwkJY291bnQgPSAxOwkvKiBhY2NvdW50IGZvciBvbmUgYnl0ZSBwYWQgdG8gd29yZCBib3VuZGFyeSAqLworCQluYW1lX2xlbiA9CisJCSAgICBjaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIChwU01CLT5maWxlTmFtZSArIDEpLAorCQkJCSAgZmlsZU5hbWUsIFBBVEhfTUFYCisJCQkJICAvKiBmaW5kIGRlZmluZSBmb3IgdGhpcyBtYXhwYXRoY29tcG9uZW50ICovCisJCQkJICAsIG5sc19jb2RlcGFnZSk7CisJCW5hbWVfbGVuKys7CS8qIHRyYWlsaW5nIG51bGwgKi8KKwkJbmFtZV9sZW4gKj0gMjsKKwkJcFNNQi0+TmFtZUxlbmd0aCA9IGNwdV90b19sZTE2KG5hbWVfbGVuKTsKKwl9IGVsc2UgewkJLyogQkIgaW1wcm92ZSB0aGUgY2hlY2sgZm9yIGJ1ZmZlciBvdmVycnVucyBCQiAqLworCQljb3VudCA9IDA7CS8qIG5vIHBhZCAqLworCQluYW1lX2xlbiA9IHN0cm5sZW4oZmlsZU5hbWUsIFBBVEhfTUFYKTsKKwkJbmFtZV9sZW4rKzsJLyogdHJhaWxpbmcgbnVsbCAqLworCQlwU01CLT5OYW1lTGVuZ3RoID0gY3B1X3RvX2xlMTYobmFtZV9sZW4pOworCQlzdHJuY3B5KHBTTUItPmZpbGVOYW1lLCBmaWxlTmFtZSwgbmFtZV9sZW4pOworCX0KKwlpZiAoKnBPcGxvY2sgJiBSRVFfT1BMT0NLKQorCQlwU01CLT5PcGVuRmxhZ3MgPSBjcHVfdG9fbGUzMihSRVFfT1BMT0NLKTsKKwllbHNlIGlmICgqcE9wbG9jayAmIFJFUV9CQVRDSE9QTE9DSykgeworCQlwU01CLT5PcGVuRmxhZ3MgPSBjcHVfdG9fbGUzMihSRVFfQkFUQ0hPUExPQ0spOworCX0KKwlwU01CLT5EZXNpcmVkQWNjZXNzID0gY3B1X3RvX2xlMzIoYWNjZXNzX2ZsYWdzKTsKKwlwU01CLT5BbGxvY2F0aW9uU2l6ZSA9IDA7CisJcFNNQi0+RmlsZUF0dHJpYnV0ZXMgPSBjcHVfdG9fbGUzMihBVFRSX05PUk1BTCk7CisJLyogWFAgZG9lcyBub3QgaGFuZGxlIEFUVFJfUE9TSVhfU0VNQU5USUNTICovCisJLyogYnV0IGl0IGhlbHBzIHNwZWVkIHVwIGNhc2Ugc2Vuc2l0aXZlIGNoZWNrcyBmb3Igb3RoZXIKKwlzZXJ2ZXJzIHN1Y2ggYXMgU2FtYmEgKi8KKwlpZiAodGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkKKwkJcFNNQi0+RmlsZUF0dHJpYnV0ZXMgfD0gY3B1X3RvX2xlMzIoQVRUUl9QT1NJWF9TRU1BTlRJQ1MpOworCisJLyogaWYgKChvbW9kZSAmIFNfSVdVR08pID09IDApCisJCXBTTUItPkZpbGVBdHRyaWJ1dGVzIHw9IGNwdV90b19sZTMyKEFUVFJfUkVBRE9OTFkpOyovCisJLyogIEFib3ZlIGxpbmUgY2F1c2VzIHByb2JsZW1zIGR1ZSB0byB2ZnMgc3BsaXR0aW5nIGNyZWF0ZSBpbnRvIHR3bworCQlwaWVjZXMgLSBuZWVkIHRvIHNldCBtb2RlIGFmdGVyIGZpbGUgY3JlYXRlZCBub3Qgd2hpbGUgaXQgaXMKKwkJYmVpbmcgY3JlYXRlZCAqLworCXBTTUItPlNoYXJlQWNjZXNzID0gY3B1X3RvX2xlMzIoRklMRV9TSEFSRV9BTEwpOworCXBTTUItPkNyZWF0ZURpc3Bvc2l0aW9uID0gY3B1X3RvX2xlMzIob3BlbkRpc3Bvc2l0aW9uKTsKKwlwU01CLT5DcmVhdGVPcHRpb25zID0gY3B1X3RvX2xlMzIoY3JlYXRlX29wdGlvbnMpOworCXBTTUItPkltcGVyc29uYXRpb25MZXZlbCA9IGNwdV90b19sZTMyKFNFQ1VSSVRZX0lNUEVSU09OQVRJT04pOwkvKiBCQiA/PyovCisJcFNNQi0+U2VjdXJpdHlGbGFncyA9CisJICAgIFNFQ1VSSVRZX0NPTlRFWFRfVFJBQ0tJTkcgfCBTRUNVUklUWV9FRkZFQ1RJVkVfT05MWTsKKworCWNvdW50ICs9IG5hbWVfbGVuOworCXBTTUItPmhkci5zbWJfYnVmX2xlbmd0aCArPSBjb3VudDsKKworCXBTTUItPkJ5dGVDb3VudCA9IGNwdV90b19sZTE2KGNvdW50KTsKKwkvKiBsb25nX29wIHNldCB0byAxIHRvIGFsbG93IGZvciBvcGxvY2sgYnJlYWsgdGltZW91dHMgKi8KKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKwkJCSAoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMSk7CisJaWYgKHJjKSB7CisJCWNGWUkoMSwgKCJFcnJvciBpbiBPcGVuID0gJWQiLCByYykpOworCX0gZWxzZSB7CisJCSpwT3Bsb2NrID0gcFNNQnItPk9wbG9ja0xldmVsOwkvKiBvbmUgYnl0ZSBubyBuZWVkIHRvIGxlX3RvX2NwdSAqLworCQkqbmV0ZmlkID0gcFNNQnItPkZpZDsJLyogY2lmcyBmaWQgc3RheXMgaW4gbGUgKi8KKwkJLyogTGV0IGNhbGxlciBrbm93IGZpbGUgd2FzIGNyZWF0ZWQgc28gd2UgY2FuIHNldCB0aGUgbW9kZS4gKi8KKwkJLyogRG8gd2UgY2FyZSBhYm91dCB0aGUgQ3JlYXRlQWN0aW9uIGluIGFueSBvdGhlciBjYXNlcz8gKi8KKwkJaWYoY3B1X3RvX2xlMzIoRklMRV9DUkVBVEUpID09IHBTTUJyLT5DcmVhdGVBY3Rpb24pCisJCQkqcE9wbG9jayB8PSBDSUZTX0NSRUFURV9BQ1RJT047IAorCQlpZihwZmlsZV9pbmZvKSB7CisJCSAgICBtZW1jcHkoKGNoYXIgKilwZmlsZV9pbmZvLChjaGFyICopJnBTTUJyLT5DcmVhdGlvblRpbWUsCisJCQkzNiAvKiBDcmVhdGlvblRpbWUgdG8gQXR0cmlidXRlcyAqLyk7CisJCSAgICAvKiB0aGUgZmlsZV9pbmZvIGJ1ZiBpcyBlbmRpYW4gY29udmVydGVkIGJ5IGNhbGxlciAqLworCQkgICAgcGZpbGVfaW5mby0+QWxsb2NhdGlvblNpemUgPSBwU01Cci0+QWxsb2NhdGlvblNpemU7CisJCSAgICBwZmlsZV9pbmZvLT5FbmRPZkZpbGUgPSBwU01Cci0+RW5kT2ZGaWxlOworCQkgICAgcGZpbGVfaW5mby0+TnVtYmVyT2ZMaW5rcyA9IGNwdV90b19sZTMyKDEpOworCQl9CisKKyNpZmRlZiBDT05GSUdfQ0lGU19TVEFUUworCQlhdG9taWNfaW5jKCZ0Y29uLT5udW1fb3BlbnMpOworI2VuZGlmCisJfQorCWNpZnNfYnVmX3JlbGVhc2UocFNNQik7CisJaWYgKHJjID09IC1FQUdBSU4pCisJCWdvdG8gb3BlblJldHJ5OworCXJldHVybiByYzsKK30KKworLyogSWYgbm8gYnVmZmVyIHBhc3NlZCBpbiwgdGhlbiBjYWxsZXIgd2FudHMgdG8gZG8gdGhlIGNvcHkKKwlhcyBpbiB0aGUgY2FzZSBvZiByZWFkcGFnZXMgc28gdGhlIFNNQiBidWZmZXIgbXVzdCBiZQorCWZyZWVkIGJ5IHRoZSBjYWxsZXIgKi8KKworaW50CitDSUZTU01CUmVhZChjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCSAgICBjb25zdCBpbnQgbmV0ZmlkLCBjb25zdCB1bnNpZ25lZCBpbnQgY291bnQsCisJICAgIGNvbnN0IF9fdTY0IGxzZWVrLCB1bnNpZ25lZCBpbnQgKm5ieXRlcywgY2hhciAqKmJ1ZikKK3sKKwlpbnQgcmMgPSAtRUFDQ0VTOworCVJFQURfUkVRICpwU01CID0gTlVMTDsKKwlSRUFEX1JTUCAqcFNNQnIgPSBOVUxMOworCWNoYXIgKnBSZWFkRGF0YSA9IE5VTEw7CisJaW50IGJ5dGVzX3JldHVybmVkOworCisJY0ZZSSgxLCgiUmVhZGluZyAlZCBieXRlcyBvbiBmaWQgJWQiLGNvdW50LG5ldGZpZCkpOworCisJKm5ieXRlcyA9IDA7CisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX1JFQURfQU5EWCwgMTIsIHRjb24sICh2b2lkICoqKSAmcFNNQiwKKwkJICAgICAgKHZvaWQgKiopICZwU01Ccik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwkvKiB0Y29uIGFuZCBzZXMgcG9pbnRlciBhcmUgY2hlY2tlZCBpbiBzbWJfaW5pdCAqLworCWlmICh0Y29uLT5zZXMtPnNlcnZlciA9PSBOVUxMKQorCQlyZXR1cm4gLUVDT05OQUJPUlRFRDsKKworCXBTTUItPkFuZFhDb21tYW5kID0gMHhGRjsJLyogbm9uZSAqLworCXBTTUItPkZpZCA9IG5ldGZpZDsKKwlwU01CLT5PZmZzZXRMb3cgPSBjcHVfdG9fbGUzMihsc2VlayAmIDB4RkZGRkZGRkYpOworCXBTTUItPk9mZnNldEhpZ2ggPSBjcHVfdG9fbGUzMihsc2VlayA+PiAzMik7CisJcFNNQi0+UmVtYWluaW5nID0gMDsKKwlwU01CLT5NYXhDb3VudCA9IGNwdV90b19sZTE2KGNvdW50ICYgMHhGRkZGKTsKKwlwU01CLT5NYXhDb3VudEhpZ2ggPSBjcHVfdG9fbGUzMihjb3VudCA+PiAxNik7CisJcFNNQi0+Qnl0ZUNvdW50ID0gMDsgIC8qIG5vIG5lZWQgdG8gZG8gbGUgY29udmVyc2lvbiBzaW5jZSBpdCBpcyAwICovCisKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKwkJCSAoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMCk7CisJaWYgKHJjKSB7CisJCWNFUlJPUigxLCAoIlNlbmQgZXJyb3IgaW4gcmVhZCA9ICVkIiwgcmMpKTsKKwl9IGVsc2UgeworCQlpbnQgZGF0YV9sZW5ndGggPSBsZTE2X3RvX2NwdShwU01Cci0+RGF0YUxlbmd0aEhpZ2gpOworCQlkYXRhX2xlbmd0aCA9IGRhdGFfbGVuZ3RoIDw8IDE2OworCQlkYXRhX2xlbmd0aCArPSBsZTE2X3RvX2NwdShwU01Cci0+RGF0YUxlbmd0aCk7CisJCSpuYnl0ZXMgPSBkYXRhX2xlbmd0aDsKKworCQkvKmNoZWNrIHRoYXQgRGF0YUxlbmd0aCB3b3VsZCBub3QgZ28gYmV5b25kIGVuZCBvZiBTTUIgKi8KKwkJaWYgKChkYXRhX2xlbmd0aCA+IENJRlNNYXhCdWZTaXplKSAKKwkJCQl8fCAoZGF0YV9sZW5ndGggPiBjb3VudCkpIHsKKwkJCWNGWUkoMSwoImJhZCBsZW5ndGggJWQgZm9yIGNvdW50ICVkIixkYXRhX2xlbmd0aCxjb3VudCkpOworCQkJcmMgPSAtRUlPOworCQkJKm5ieXRlcyA9IDA7CisJCX0gZWxzZSB7CisJCQlwUmVhZERhdGEgPQorCQkJICAgIChjaGFyICopICgmcFNNQnItPmhkci5Qcm90b2NvbCkgKworCQkJICAgIGxlMTZfdG9fY3B1KHBTTUJyLT5EYXRhT2Zmc2V0KTsKKy8qCQkJaWYocmMgPSBjb3B5X3RvX3VzZXIoYnVmLCBwUmVhZERhdGEsIGRhdGFfbGVuZ3RoKSkgeworCQkJCWNFUlJPUigxLCgiRmF1bHRpbmcgb24gcmVhZCByYyA9ICVkIixyYykpOworCQkJCXJjID0gLUVGQVVMVDsKKwkJCX0qLyAvKiBjYW4gbm90IHVzZSBjb3B5X3RvX3VzZXIgd2hlbiB1c2luZyBwYWdlIGNhY2hlKi8KKwkJCWlmKCpidWYpCisJCQkgICAgbWVtY3B5KCpidWYscFJlYWREYXRhLGRhdGFfbGVuZ3RoKTsKKwkJfQorCX0KKwlpZigqYnVmKQorCQljaWZzX2J1Zl9yZWxlYXNlKHBTTUIpOworCWVsc2UKKwkJKmJ1ZiA9IChjaGFyICopcFNNQjsKKworCS8qIE5vdGU6IE9uIC1FQUdBSU4gZXJyb3Igb25seSBjYWxsZXIgY2FuIHJldHJ5IG9uIGhhbmRsZSBiYXNlZCBjYWxscyAKKwkJc2luY2UgZmlsZSBoYW5kbGUgcGFzc2VkIGluIG5vIGxvbmdlciB2YWxpZCAqLworCXJldHVybiByYzsKK30KKworaW50CitDSUZTU01CV3JpdGUoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkgICAgIGNvbnN0IGludCBuZXRmaWQsIGNvbnN0IHVuc2lnbmVkIGludCBjb3VudCwKKwkgICAgIGNvbnN0IF9fdTY0IG9mZnNldCwgdW5zaWduZWQgaW50ICpuYnl0ZXMsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkgICAgIGNvbnN0IGNoYXIgX191c2VyICogdWJ1ZiwgY29uc3QgaW50IGxvbmdfb3ApCit7CisJaW50IHJjID0gLUVBQ0NFUzsKKwlXUklURV9SRVEgKnBTTUIgPSBOVUxMOworCVdSSVRFX1JTUCAqcFNNQnIgPSBOVUxMOworCWludCBieXRlc19yZXR1cm5lZDsKKwlfX3UzMiBieXRlc19zZW50OworCV9fdTE2IGJ5dGVfY291bnQ7CisKKwkvKiBjRllJKDEsKCJ3cml0ZSBhdCAlbGxkICVkIGJ5dGVzIixvZmZzZXQsY291bnQpKTsqLworCXJjID0gc21iX2luaXQoU01CX0NPTV9XUklURV9BTkRYLCAxNCwgdGNvbiwgKHZvaWQgKiopICZwU01CLAorCQkgICAgICAodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKwkvKiB0Y29uIGFuZCBzZXMgcG9pbnRlciBhcmUgY2hlY2tlZCBpbiBzbWJfaW5pdCAqLworCWlmICh0Y29uLT5zZXMtPnNlcnZlciA9PSBOVUxMKQorCQlyZXR1cm4gLUVDT05OQUJPUlRFRDsKKworCXBTTUItPkFuZFhDb21tYW5kID0gMHhGRjsJLyogbm9uZSAqLworCXBTTUItPkZpZCA9IG5ldGZpZDsKKwlwU01CLT5PZmZzZXRMb3cgPSBjcHVfdG9fbGUzMihvZmZzZXQgJiAweEZGRkZGRkZGKTsKKwlwU01CLT5PZmZzZXRIaWdoID0gY3B1X3RvX2xlMzIob2Zmc2V0ID4+IDMyKTsKKwlwU01CLT5SZXNlcnZlZCA9IDB4RkZGRkZGRkY7CisJcFNNQi0+V3JpdGVNb2RlID0gMDsKKwlwU01CLT5SZW1haW5pbmcgPSAwOworCisJLyogQ2FuIGluY3JlYXNlIGJ1ZmZlciBzaXplIGlmIGJ1ZmZlciBpcyBiaWcgZW5vdWdoIGluIHNvbWUgY2FzZXMgLSBpZSB3ZSAKKwljYW4gc2VuZCBtb3JlIGlmIExBUkdFX1dSSVRFX1ggY2FwYWJpbGl0eSByZXR1cm5lZCBieSB0aGUgc2VydmVyIGFuZCBpZgorCW91ciBidWZmZXIgaXMgYmlnIGVub3VnaCBvciBpZiB3ZSBjb252ZXJ0IHRvIGlvdmVjcyBvbiBzb2NrZXQgd3JpdGVzCisJYW5kIGVsaW1pbmF0ZSB0aGUgY29weSB0byB0aGUgQ0lGUyBidWZmZXIgKi8KKwlpZih0Y29uLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9MQVJHRV9XUklURV9YKSB7CisJCWJ5dGVzX3NlbnQgPSBtaW5fdChjb25zdCB1bnNpZ25lZCBpbnQsIENJRlNNYXhCdWZTaXplLCBjb3VudCk7CisJfSBlbHNlIHsKKwkJYnl0ZXNfc2VudCA9ICh0Y29uLT5zZXMtPnNlcnZlci0+bWF4QnVmIC0gTUFYX0NJRlNfSERSX1NJWkUpCisJCQkgJiB+MHhGRjsKKwl9CisKKwlpZiAoYnl0ZXNfc2VudCA+IGNvdW50KQorCQlieXRlc19zZW50ID0gY291bnQ7CisJcFNNQi0+RGF0YU9mZnNldCA9CisJICAgIGNwdV90b19sZTE2KG9mZnNldG9mKHN0cnVjdCBzbWJfY29tX3dyaXRlX3JlcSxEYXRhKSAtIDQpOworCWlmKGJ1ZikKKwkgICAgbWVtY3B5KHBTTUItPkRhdGEsYnVmLGJ5dGVzX3NlbnQpOworCWVsc2UgaWYodWJ1ZikgeworCQlpZihjb3B5X2Zyb21fdXNlcihwU01CLT5EYXRhLHVidWYsYnl0ZXNfc2VudCkpIHsKKwkJCWNpZnNfYnVmX3JlbGVhc2UocFNNQik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0gZWxzZSB7CisJCS8qIE5vIGJ1ZmZlciAqLworCQljaWZzX2J1Zl9yZWxlYXNlKHBTTUIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlieXRlX2NvdW50ID0gYnl0ZXNfc2VudCArIDEgLyogcGFkICovIDsgLyogQkIgZml4IHRoaXMgZm9yIHNlbmRzID4gNjRLICovCisJcFNNQi0+RGF0YUxlbmd0aExvdyA9IGNwdV90b19sZTE2KGJ5dGVzX3NlbnQgJiAweEZGRkYpOworCXBTTUItPkRhdGFMZW5ndGhIaWdoID0gY3B1X3RvX2xlMTYoYnl0ZXNfc2VudCA+PiAxNik7CisJcFNNQi0+aGRyLnNtYl9idWZfbGVuZ3RoICs9IGJ5dGVzX3NlbnQrMTsKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihieXRlX2NvdW50KTsKKworCXJjID0gU2VuZFJlY2VpdmUoeGlkLCB0Y29uLT5zZXMsIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CLAorCQkJIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CciwgJmJ5dGVzX3JldHVybmVkLCBsb25nX29wKTsKKwlpZiAocmMpIHsKKwkJY0ZZSSgxLCAoIlNlbmQgZXJyb3IgaW4gd3JpdGUgPSAlZCIsIHJjKSk7CisJCSpuYnl0ZXMgPSAwOworCX0gZWxzZSB7CisJCSpuYnl0ZXMgPSBsZTE2X3RvX2NwdShwU01Cci0+Q291bnRIaWdoKTsKKwkJKm5ieXRlcyA9ICgqbmJ5dGVzKSA8PCAxNjsKKwkJKm5ieXRlcyArPSBsZTE2X3RvX2NwdShwU01Cci0+Q291bnQpOworCX0KKworCWNpZnNfYnVmX3JlbGVhc2UocFNNQik7CisKKwkvKiBOb3RlOiBPbiAtRUFHQUlOIGVycm9yIG9ubHkgY2FsbGVyIGNhbiByZXRyeSBvbiBoYW5kbGUgYmFzZWQgY2FsbHMgCisJCXNpbmNlIGZpbGUgaGFuZGxlIHBhc3NlZCBpbiBubyBsb25nZXIgdmFsaWQgKi8KKworCXJldHVybiByYzsKK30KKworI2lmZGVmIENPTkZJR19DSUZTX0VYUEVSSU1FTlRBTAoraW50IENJRlNTTUJXcml0ZTIoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkgICAgIGNvbnN0IGludCBuZXRmaWQsIGNvbnN0IHVuc2lnbmVkIGludCBjb3VudCwKKwkgICAgIGNvbnN0IF9fdTY0IG9mZnNldCwgdW5zaWduZWQgaW50ICpuYnl0ZXMsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJICAgICBjb25zdCBpbnQgbG9uZ19vcCkKK3sKKwlpbnQgcmMgPSAtRUFDQ0VTOworCVdSSVRFX1JFUSAqcFNNQiA9IE5VTEw7CisJV1JJVEVfUlNQICpwU01CciA9IE5VTEw7CisJLyppbnQgYnl0ZXNfcmV0dXJuZWQ7Ki8KKwl1bnNpZ25lZCBieXRlc19zZW50OworCV9fdTE2IGJ5dGVfY291bnQ7CisKKwlyYyA9IHNtYWxsX3NtYl9pbml0KFNNQl9DT01fV1JJVEVfQU5EWCwgMTQsIHRjb24sICh2b2lkICoqKSAmcFNNQik7CisgICAgCisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisJCisJcFNNQnIgPSAoV1JJVEVfUlNQICopcFNNQjsgLyogQkIgcmVtb3ZlbWUgQkIgKi8KKworCS8qIHRjb24gYW5kIHNlcyBwb2ludGVyIGFyZSBjaGVja2VkIGluIHNtYl9pbml0ICovCisJaWYgKHRjb24tPnNlcy0+c2VydmVyID09IE5VTEwpCisJCXJldHVybiAtRUNPTk5BQk9SVEVEOworCisJcFNNQi0+QW5kWENvbW1hbmQgPSAweEZGOyAvKiBub25lICovCisJcFNNQi0+RmlkID0gbmV0ZmlkOworCXBTTUItPk9mZnNldExvdyA9IGNwdV90b19sZTMyKG9mZnNldCAmIDB4RkZGRkZGRkYpOworCXBTTUItPk9mZnNldEhpZ2ggPSBjcHVfdG9fbGUzMihvZmZzZXQgPj4gMzIpOworCXBTTUItPlJlc2VydmVkID0gMHhGRkZGRkZGRjsKKwlwU01CLT5Xcml0ZU1vZGUgPSAwOworCXBTTUItPlJlbWFpbmluZyA9IDA7CisJYnl0ZXNfc2VudCA9ICh0Y29uLT5zZXMtPnNlcnZlci0+bWF4QnVmIC0gTUFYX0NJRlNfSERSX1NJWkUpICYgfjB4RkY7CisJaWYgKGJ5dGVzX3NlbnQgPiBjb3VudCkKKwkJYnl0ZXNfc2VudCA9IGNvdW50OworCXBTTUItPkRhdGFMZW5ndGhIaWdoID0gMDsKKwlwU01CLT5EYXRhT2Zmc2V0ID0KKwkgICAgY3B1X3RvX2xlMTYob2Zmc2V0b2Yoc3RydWN0IHNtYl9jb21fd3JpdGVfcmVxLERhdGEpIC0gNCk7CisKKwlieXRlX2NvdW50ID0gYnl0ZXNfc2VudCArIDEgLyogcGFkICovIDsKKwlwU01CLT5EYXRhTGVuZ3RoTG93ID0gY3B1X3RvX2xlMTYoYnl0ZXNfc2VudCk7CisJcFNNQi0+RGF0YUxlbmd0aEhpZ2ggPSAwOworCXBTTUItPmhkci5zbWJfYnVmX2xlbmd0aCArPSBieXRlX2NvdW50OworCXBTTUItPkJ5dGVDb3VudCA9IGNwdV90b19sZTE2KGJ5dGVfY291bnQpOworCisvKglyYyA9IFNlbmRSZWNlaXZlMih4aWQsIHRjb24tPnNlcywgKHN0cnVjdCBzbWJfaGRyICopIHBTTUIsCisJCQkgKHN0cnVjdCBzbWJfaGRyICopIHBTTUJyLCBidWYsIGJ1ZmxlbiwgJmJ5dGVzX3JldHVybmVkLCBsb25nX29wKTsgKi8gIC8qIEJCIGZpeG1lIEJCICovCisJaWYgKHJjKSB7CisJCWNGWUkoMSwgKCJTZW5kIGVycm9yIGluIHdyaXRlMiAobGFyZ2Ugd3JpdGUpID0gJWQiLCByYykpOworCQkqbmJ5dGVzID0gMDsKKwl9IGVsc2UKKwkJKm5ieXRlcyA9IGxlMTZfdG9fY3B1KHBTTUJyLT5Db3VudCk7CisKKwljaWZzX3NtYWxsX2J1Zl9yZWxlYXNlKHBTTUIpOworCisJLyogTm90ZTogT24gLUVBR0FJTiBlcnJvciBvbmx5IGNhbGxlciBjYW4gcmV0cnkgb24gaGFuZGxlIGJhc2VkIGNhbGxzIAorCQlzaW5jZSBmaWxlIGhhbmRsZSBwYXNzZWQgaW4gbm8gbG9uZ2VyIHZhbGlkICovCisKKwlyZXR1cm4gcmM7Cit9CisjZW5kaWYgLyogQ0lGU19FWFBFUklNRU5UQUwgKi8KKworaW50CitDSUZTU01CTG9jayhjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCSAgICBjb25zdCBfX3UxNiBzbWJfZmlsZV9pZCwgY29uc3QgX191NjQgbGVuLAorCSAgICBjb25zdCBfX3U2NCBvZmZzZXQsIGNvbnN0IF9fdTMyIG51bVVubG9jaywKKwkgICAgY29uc3QgX191MzIgbnVtTG9jaywgY29uc3QgX191OCBsb2NrVHlwZSwgY29uc3QgaW50IHdhaXRGbGFnKQoreworCWludCByYyA9IDA7CisJTE9DS19SRVEgKnBTTUIgPSBOVUxMOworCUxPQ0tfUlNQICpwU01CciA9IE5VTEw7CisJaW50IGJ5dGVzX3JldHVybmVkOworCWludCB0aW1lb3V0ID0gMDsKKwlfX3UxNiBjb3VudDsKKworCWNGWUkoMSwgKCJJbiBDSUZTU01CTG9jayAtIHRpbWVvdXQgJWQgbnVtTG9jayAlZCIsd2FpdEZsYWcsbnVtTG9jaykpOworCXJjID0gc21iX2luaXQoU01CX0NPTV9MT0NLSU5HX0FORFgsIDgsIHRjb24sICh2b2lkICoqKSAmcFNNQiwKKwkJICAgICAgKHZvaWQgKiopICZwU01Ccik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlpZihsb2NrVHlwZSA9PSBMT0NLSU5HX0FORFhfT1BMT0NLX1JFTEVBU0UpIHsKKwkJdGltZW91dCA9IC0xOyAvKiBubyByZXNwb25zZSBleHBlY3RlZCAqLworCQlwU01CLT5UaW1lb3V0ID0gMDsKKwl9IGVsc2UgaWYgKHdhaXRGbGFnID09IFRSVUUpIHsKKwkJdGltZW91dCA9IDM7ICAvKiBibG9ja2luZyBvcGVyYXRpb24sIG5vIHRpbWVvdXQgKi8KKwkJcFNNQi0+VGltZW91dCA9IGNwdV90b19sZTMyKC0xKTsvKiBibG9ja2luZyAtIGRvIG5vdCB0aW1lIG91dCAqLworCX0gZWxzZSB7CisJCXBTTUItPlRpbWVvdXQgPSAwOworCX0KKworCXBTTUItPk51bWJlck9mTG9ja3MgPSBjcHVfdG9fbGUxNihudW1Mb2NrKTsKKwlwU01CLT5OdW1iZXJPZlVubG9ja3MgPSBjcHVfdG9fbGUxNihudW1VbmxvY2spOworCXBTTUItPkxvY2tUeXBlID0gbG9ja1R5cGU7CisJcFNNQi0+QW5kWENvbW1hbmQgPSAweEZGOwkvKiBub25lICovCisJcFNNQi0+RmlkID0gc21iX2ZpbGVfaWQ7IC8qIG5ldGZpZCBzdGF5cyBsZSAqLworCisJaWYoKG51bUxvY2sgIT0gMCkgfHwgKG51bVVubG9jayAhPSAwKSkgeworCQlwU01CLT5Mb2Nrc1swXS5QaWQgPSBjcHVfdG9fbGUxNihjdXJyZW50LT50Z2lkKTsKKwkJLyogQkIgd2hlcmUgdG8gc3RvcmUgcGlkIGhpZ2g/ICovCisJCXBTTUItPkxvY2tzWzBdLkxlbmd0aExvdyA9IGNwdV90b19sZTMyKCh1MzIpbGVuKTsKKwkJcFNNQi0+TG9ja3NbMF0uTGVuZ3RoSGlnaCA9IGNwdV90b19sZTMyKCh1MzIpKGxlbj4+MzIpKTsKKwkJcFNNQi0+TG9ja3NbMF0uT2Zmc2V0TG93ID0gY3B1X3RvX2xlMzIoKHUzMilvZmZzZXQpOworCQlwU01CLT5Mb2Nrc1swXS5PZmZzZXRIaWdoID0gY3B1X3RvX2xlMzIoKHUzMikob2Zmc2V0Pj4zMikpOworCQljb3VudCA9IHNpemVvZihMT0NLSU5HX0FORFhfUkFOR0UpOworCX0gZWxzZSB7CisJCS8qIG9wbG9jayBicmVhayAqLworCQljb3VudCA9IDA7CisJfQorCXBTTUItPmhkci5zbWJfYnVmX2xlbmd0aCArPSBjb3VudDsKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihjb3VudCk7CisKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKwkJCSAoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgdGltZW91dCk7CisKKwlpZiAocmMpIHsKKwkJY0ZZSSgxLCAoIlNlbmQgZXJyb3IgaW4gTG9jayA9ICVkIiwgcmMpKTsKKwl9CisJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKworCS8qIE5vdGU6IE9uIC1FQUdBSU4gZXJyb3Igb25seSBjYWxsZXIgY2FuIHJldHJ5IG9uIGhhbmRsZSBiYXNlZCBjYWxscyAKKwlzaW5jZSBmaWxlIGhhbmRsZSBwYXNzZWQgaW4gbm8gbG9uZ2VyIHZhbGlkICovCisJcmV0dXJuIHJjOworfQorCitpbnQKK0NJRlNTTUJDbG9zZShjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLCBpbnQgc21iX2ZpbGVfaWQpCit7CisJaW50IHJjID0gMDsKKwlDTE9TRV9SRVEgKnBTTUIgPSBOVUxMOworCUNMT1NFX1JTUCAqcFNNQnIgPSBOVUxMOworCWludCBieXRlc19yZXR1cm5lZDsKKwljRllJKDEsICgiSW4gQ0lGU1NNQkNsb3NlIikpOworCisvKiBkbyBub3QgcmV0cnkgb24gZGVhZCBzZXNzaW9uIG9uIGNsb3NlICovCisJcmMgPSBzbWFsbF9zbWJfaW5pdChTTUJfQ09NX0NMT1NFLCAzLCB0Y29uLCAodm9pZCAqKikgJnBTTUIpOworCWlmKHJjID09IC1FQUdBSU4pCisJCXJldHVybiAwOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcFNNQnIgPSAoQ0xPU0VfUlNQICopcFNNQjsgLyogQkIgcmVtb3ZlbWUgQkIgKi8KKworCXBTTUItPkZpbGVJRCA9IChfX3UxNikgc21iX2ZpbGVfaWQ7CisJcFNNQi0+TGFzdFdyaXRlVGltZSA9IDA7CisJcFNNQi0+Qnl0ZUNvdW50ID0gMDsKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKwkJCSAoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMCk7CisJaWYgKHJjKSB7CisJCWlmKHJjIT0tRUlOVFIpIHsKKwkJCS8qIEVJTlRSIGlzIGV4cGVjdGVkIHdoZW4gdXNlciBjdGwtYyB0byBraWxsIGFwcCAqLworCQkJY0VSUk9SKDEsICgiU2VuZCBlcnJvciBpbiBDbG9zZSA9ICVkIiwgcmMpKTsKKwkJfQorCX0KKworCWNpZnNfc21hbGxfYnVmX3JlbGVhc2UocFNNQik7CisKKwkvKiBTaW5jZSBzZXNzaW9uIGlzIGRlYWQsIGZpbGUgd2lsbCBiZSBjbG9zZWQgb24gc2VydmVyIGFscmVhZHkgKi8KKwlpZihyYyA9PSAtRUFHQUlOKQorCQlyYyA9IDA7CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludAorQ0lGU1NNQlJlbmFtZShjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCSAgICAgIGNvbnN0IGNoYXIgKmZyb21OYW1lLCBjb25zdCBjaGFyICp0b05hbWUsCisJICAgICAgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworCWludCByYyA9IDA7CisJUkVOQU1FX1JFUSAqcFNNQiA9IE5VTEw7CisJUkVOQU1FX1JTUCAqcFNNQnIgPSBOVUxMOworCWludCBieXRlc19yZXR1cm5lZDsKKwlpbnQgbmFtZV9sZW4sIG5hbWVfbGVuMjsKKwlfX3UxNiBjb3VudDsKKworCWNGWUkoMSwgKCJJbiBDSUZTU01CUmVuYW1lIikpOworcmVuYW1lUmV0cnk6CisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX1JFTkFNRSwgMSwgdGNvbiwgKHZvaWQgKiopICZwU01CLAorCQkgICAgICAodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXBTTUItPkJ1ZmZlckZvcm1hdCA9IDB4MDQ7CisJcFNNQi0+U2VhcmNoQXR0cmlidXRlcyA9CisJICAgIGNwdV90b19sZTE2KEFUVFJfUkVBRE9OTFkgfCBBVFRSX0hJRERFTiB8IEFUVFJfU1lTVEVNIHwKKwkJCUFUVFJfRElSRUNUT1JZKTsKKworCWlmIChwU01CLT5oZHIuRmxhZ3MyICYgU01CRkxHMl9VTklDT0RFKSB7CisJCW5hbWVfbGVuID0KKwkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgcFNNQi0+T2xkRmlsZU5hbWUsIGZyb21OYW1lLCBQQVRIX01BWAorCQkJCSAgLyogZmluZCBkZWZpbmUgZm9yIHRoaXMgbWF4cGF0aGNvbXBvbmVudCAqLworCQkJCSAgLCBubHNfY29kZXBhZ2UpOworCQluYW1lX2xlbisrOwkvKiB0cmFpbGluZyBudWxsICovCisJCW5hbWVfbGVuICo9IDI7CisJCXBTTUItPk9sZEZpbGVOYW1lW25hbWVfbGVuXSA9IDB4MDQ7CS8qIHBhZCAqLworCS8qIHByb3RvY29sIHJlcXVpcmVzIEFTQ0lJIHNpZ25hdHVyZSBieXRlIG9uIFVuaWNvZGUgc3RyaW5nICovCisJCXBTTUItPk9sZEZpbGVOYW1lW25hbWVfbGVuICsgMV0gPSAweDAwOworCQluYW1lX2xlbjIgPQorCQkgICAgY2lmc19zdHJ0b1VDUygod2NoYXJfdCAqKSAmIHBTTUItPgorCQkJCSAgT2xkRmlsZU5hbWVbbmFtZV9sZW4gKyAyXSwgdG9OYW1lLCBQQVRIX01BWCwKKwkJCQkgIG5sc19jb2RlcGFnZSk7CisJCW5hbWVfbGVuMiArPSAxIC8qIHRyYWlsaW5nIG51bGwgKi8gICsgMSAvKiBTaWduYXR1cmUgd29yZCAqLyA7CisJCW5hbWVfbGVuMiAqPSAyOwkvKiBjb252ZXJ0IHRvIGJ5dGVzICovCisJfSBlbHNlIHsJCS8qIEJCIGltcHJvdmUgdGhlIGNoZWNrIGZvciBidWZmZXIgb3ZlcnJ1bnMgQkIgKi8KKwkJbmFtZV9sZW4gPSBzdHJubGVuKGZyb21OYW1lLCBQQVRIX01BWCk7CisJCW5hbWVfbGVuKys7CS8qIHRyYWlsaW5nIG51bGwgKi8KKwkJc3RybmNweShwU01CLT5PbGRGaWxlTmFtZSwgZnJvbU5hbWUsIG5hbWVfbGVuKTsKKwkJbmFtZV9sZW4yID0gc3Rybmxlbih0b05hbWUsIFBBVEhfTUFYKTsKKwkJbmFtZV9sZW4yKys7CS8qIHRyYWlsaW5nIG51bGwgKi8KKwkJcFNNQi0+T2xkRmlsZU5hbWVbbmFtZV9sZW5dID0gMHgwNDsgIC8qIDJuZCBidWZmZXIgZm9ybWF0ICovCisJCXN0cm5jcHkoJnBTTUItPk9sZEZpbGVOYW1lW25hbWVfbGVuICsgMV0sIHRvTmFtZSwgbmFtZV9sZW4yKTsKKwkJbmFtZV9sZW4yKys7CS8qIHRyYWlsaW5nIG51bGwgKi8KKwkJbmFtZV9sZW4yKys7CS8qIHNpZ25hdHVyZSBieXRlICovCisJfQorCisJY291bnQgPSAxIC8qIDFzdCBzaWduYXR1cmUgYnl0ZSAqLyAgKyBuYW1lX2xlbiArIG5hbWVfbGVuMjsKKwlwU01CLT5oZHIuc21iX2J1Zl9sZW5ndGggKz0gY291bnQ7CisJcFNNQi0+Qnl0ZUNvdW50ID0gY3B1X3RvX2xlMTYoY291bnQpOworCisJcmMgPSBTZW5kUmVjZWl2ZSh4aWQsIHRjb24tPnNlcywgKHN0cnVjdCBzbWJfaGRyICopIHBTTUIsCisJCQkgKHN0cnVjdCBzbWJfaGRyICopIHBTTUJyLCAmYnl0ZXNfcmV0dXJuZWQsIDApOworCWlmIChyYykgeworCQljRllJKDEsICgiU2VuZCBlcnJvciBpbiByZW5hbWUgPSAlZCIsIHJjKSk7CisJfSAKKworI2lmZGVmIENPTkZJR19DSUZTX1NUQVRTCisJICBlbHNlIHsKKwkJYXRvbWljX2luYygmdGNvbi0+bnVtX3JlbmFtZXMpOworCX0KKyNlbmRpZgorCisJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKworCWlmIChyYyA9PSAtRUFHQUlOKQorCQlnb3RvIHJlbmFtZVJldHJ5OworCisJcmV0dXJuIHJjOworfQorCitpbnQgQ0lGU1NNQlJlbmFtZU9wZW5GaWxlKGNvbnN0IGludCB4aWQsc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb24sIAorCQlpbnQgbmV0ZmlkLCBjaGFyICogdGFyZ2V0X25hbWUsIGNvbnN0IHN0cnVjdCBubHNfdGFibGUgKiBubHNfY29kZXBhZ2UpIAoreworCXN0cnVjdCBzbWJfY29tX3RyYW5zYWN0aW9uMl9zZmlfcmVxICpwU01CICA9IE5VTEw7CisJc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3NmaV9yc3AgKnBTTUJyID0gTlVMTDsKKwlzdHJ1Y3Qgc2V0X2ZpbGVfcmVuYW1lICogcmVuYW1lX2luZm87CisJY2hhciAqZGF0YV9vZmZzZXQ7CisJY2hhciBkdW1teV9zdHJpbmdbMzBdOworCWludCByYyA9IDA7CisJaW50IGJ5dGVzX3JldHVybmVkID0gMDsKKwlpbnQgbGVuX29mX3N0cjsKKwlfX3UxNiBwYXJhbXMsIHBhcmFtX29mZnNldCwgb2Zmc2V0LCBjb3VudCwgYnl0ZV9jb3VudDsKKworCWNGWUkoMSwgKCJSZW5hbWUgdG8gRmlsZSBieSBoYW5kbGUiKSk7CisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX1RSQU5TQUNUSU9OMiwgMTUsIHBUY29uLCAodm9pZCAqKikgJnBTTUIsCisJCQkodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXBhcmFtcyA9IDY7CisJcFNNQi0+TWF4U2V0dXBDb3VudCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQgPSAwOworCXBTTUItPkZsYWdzID0gMDsKKwlwU01CLT5UaW1lb3V0ID0gMDsKKwlwU01CLT5SZXNlcnZlZDIgPSAwOworCXBhcmFtX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBzbWJfY29tX3RyYW5zYWN0aW9uMl9zZmlfcmVxLCBGaWQpIC0gNDsKKwlvZmZzZXQgPSBwYXJhbV9vZmZzZXQgKyBwYXJhbXM7CisKKwlkYXRhX29mZnNldCA9IChjaGFyICopICgmcFNNQi0+aGRyLlByb3RvY29sKSArIG9mZnNldDsKKwlyZW5hbWVfaW5mbyA9IChzdHJ1Y3Qgc2V0X2ZpbGVfcmVuYW1lICopIGRhdGFfb2Zmc2V0OworCXBTTUItPk1heFBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYoMik7CisJcFNNQi0+TWF4RGF0YUNvdW50ID0gY3B1X3RvX2xlMTYoMTAwMCk7IC8qIEJCIGZpbmQgbWF4IFNNQiBQRFUgZnJvbSBzZXNzICovCisJcFNNQi0+U2V0dXBDb3VudCA9IDE7CisJcFNNQi0+UmVzZXJ2ZWQzID0gMDsKKwlwU01CLT5TdWJDb21tYW5kID0gY3B1X3RvX2xlMTYoVFJBTlMyX1NFVF9GSUxFX0lORk9STUFUSU9OKTsKKwlieXRlX2NvdW50ID0gMyAvKiBwYWQgKi8gICsgcGFyYW1zOworCXBTTUItPlBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYocGFyYW1zKTsKKwlwU01CLT5Ub3RhbFBhcmFtZXRlckNvdW50ID0gcFNNQi0+UGFyYW1ldGVyQ291bnQ7CisJcFNNQi0+UGFyYW1ldGVyT2Zmc2V0ID0gY3B1X3RvX2xlMTYocGFyYW1fb2Zmc2V0KTsKKwlwU01CLT5EYXRhT2Zmc2V0ID0gY3B1X3RvX2xlMTYob2Zmc2V0KTsKKwkvKiBjb25zdHJ1Y3QgcmFuZG9tIG5hbWUgIi5jaWZzX3RtcDxpbm9kZW51bT48bWlkPiIgKi8KKwlyZW5hbWVfaW5mby0+b3ZlcndyaXRlID0gY3B1X3RvX2xlMzIoMSk7CisJcmVuYW1lX2luZm8tPnJvb3RfZmlkICA9IDA7CisJLyogdW5pY29kZSBvbmx5IGNhbGwgKi8KKwlpZih0YXJnZXRfbmFtZSA9PSBOVUxMKSB7CisJCXNwcmludGYoZHVtbXlfc3RyaW5nLCJjaWZzJXgiLHBTTUItPmhkci5NaWQpOworCSAgICAgICAgbGVuX29mX3N0ciA9IGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgcmVuYW1lX2luZm8tPnRhcmdldF9uYW1lLCBkdW1teV9zdHJpbmcsIDI0LCBubHNfY29kZXBhZ2UpOworCX0gZWxzZSB7CisJCWxlbl9vZl9zdHIgPSBjaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIHJlbmFtZV9pbmZvLT50YXJnZXRfbmFtZSwgdGFyZ2V0X25hbWUsIFBBVEhfTUFYLCBubHNfY29kZXBhZ2UpOworCX0KKwlyZW5hbWVfaW5mby0+dGFyZ2V0X25hbWVfbGVuID0gY3B1X3RvX2xlMzIoMiAqIGxlbl9vZl9zdHIpOworCWNvdW50ID0gMTIgLyogc2l6ZW9mKHN0cnVjdCBzZXRfZmlsZV9yZW5hbWUpICovICsgKDIgKiBsZW5fb2Zfc3RyKSArIDI7CisJYnl0ZV9jb3VudCArPSBjb3VudDsKKwlwU01CLT5EYXRhQ291bnQgPSBjcHVfdG9fbGUxNihjb3VudCk7CisJcFNNQi0+VG90YWxEYXRhQ291bnQgPSBwU01CLT5EYXRhQ291bnQ7CisJcFNNQi0+RmlkID0gbmV0ZmlkOworCXBTTUItPkluZm9ybWF0aW9uTGV2ZWwgPQorCQljcHVfdG9fbGUxNihTTUJfU0VUX0ZJTEVfUkVOQU1FX0lORk9STUFUSU9OKTsKKwlwU01CLT5SZXNlcnZlZDQgPSAwOworCXBTTUItPmhkci5zbWJfYnVmX2xlbmd0aCArPSBieXRlX2NvdW50OworCXBTTUItPkJ5dGVDb3VudCA9IGNwdV90b19sZTE2KGJ5dGVfY291bnQpOworCXJjID0gU2VuZFJlY2VpdmUoeGlkLCBwVGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMCk7CisJaWYgKHJjKSB7CisJCWNGWUkoMSwoIlNlbmQgZXJyb3IgaW4gUmVuYW1lIChieSBmaWxlIGhhbmRsZSkgPSAlZCIsIHJjKSk7CisJfQorI2lmZGVmIENPTkZJR19DSUZTX1NUQVRTCisJICBlbHNlIHsKKwkJYXRvbWljX2luYygmcFRjb24tPm51bV90MnJlbmFtZXMpOworCX0KKyNlbmRpZgorCWNpZnNfYnVmX3JlbGVhc2UocFNNQik7CisKKwkvKiBOb3RlOiBPbiAtRUFHQUlOIGVycm9yIG9ubHkgY2FsbGVyIGNhbiByZXRyeSBvbiBoYW5kbGUgYmFzZWQgY2FsbHMKKwkJc2luY2UgZmlsZSBoYW5kbGUgcGFzc2VkIGluIG5vIGxvbmdlciB2YWxpZCAqLworCisJcmV0dXJuIHJjOworfQorCitpbnQKK0NJRlNTTUJDb3B5KGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sIGNvbnN0IGNoYXIgKiBmcm9tTmFtZSwgCisgICAgICAgICAgICBjb25zdCBfX3UxNiB0YXJnZXRfdGlkLCBjb25zdCBjaGFyICp0b05hbWUsIGNvbnN0IGludCBmbGFncywKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSkKK3sKKwlpbnQgcmMgPSAwOworCUNPUFlfUkVRICpwU01CID0gTlVMTDsKKwlDT1BZX1JTUCAqcFNNQnIgPSBOVUxMOworCWludCBieXRlc19yZXR1cm5lZDsKKwlpbnQgbmFtZV9sZW4sIG5hbWVfbGVuMjsKKwlfX3UxNiBjb3VudDsKKworCWNGWUkoMSwgKCJJbiBDSUZTU01CQ29weSIpKTsKK2NvcHlSZXRyeToKKwlyYyA9IHNtYl9pbml0KFNNQl9DT01fQ09QWSwgMSwgdGNvbiwgKHZvaWQgKiopICZwU01CLAorCQkJKHZvaWQgKiopICZwU01Ccik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlwU01CLT5CdWZmZXJGb3JtYXQgPSAweDA0OworCXBTTUItPlRpZDIgPSB0YXJnZXRfdGlkOworCisJcFNNQi0+RmxhZ3MgPSBjcHVfdG9fbGUxNihmbGFncyAmIENPUFlfVFJFRSk7CisKKwlpZiAocFNNQi0+aGRyLkZsYWdzMiAmIFNNQkZMRzJfVU5JQ09ERSkgeworCQluYW1lX2xlbiA9IGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgcFNNQi0+T2xkRmlsZU5hbWUsIAorCQkJCWZyb21OYW1lLCAKKwkJCQlQQVRIX01BWCAvKiBmaW5kIGRlZmluZSBmb3IgdGhpcyBtYXhwYXRoY29tcG9uZW50ICovLAorCQkJCW5sc19jb2RlcGFnZSk7CisJCW5hbWVfbGVuKys7ICAgICAvKiB0cmFpbGluZyBudWxsICovCisJCW5hbWVfbGVuICo9IDI7CisJCXBTTUItPk9sZEZpbGVOYW1lW25hbWVfbGVuXSA9IDB4MDQ7ICAgICAvKiBwYWQgKi8KKwkJLyogcHJvdG9jb2wgcmVxdWlyZXMgQVNDSUkgc2lnbmF0dXJlIGJ5dGUgb24gVW5pY29kZSBzdHJpbmcgKi8KKwkJcFNNQi0+T2xkRmlsZU5hbWVbbmFtZV9sZW4gKyAxXSA9IDB4MDA7CisJCW5hbWVfbGVuMiA9IGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgJiBwU01CLT4KKwkJCQlPbGRGaWxlTmFtZVtuYW1lX2xlbiArIDJdLCB0b05hbWUsIFBBVEhfTUFYLAorCQkJCW5sc19jb2RlcGFnZSk7CisJCW5hbWVfbGVuMiArPSAxIC8qIHRyYWlsaW5nIG51bGwgKi8gICsgMSAvKiBTaWduYXR1cmUgd29yZCAqLyA7CisJCW5hbWVfbGVuMiAqPSAyOyAvKiBjb252ZXJ0IHRvIGJ5dGVzICovCisJfSBlbHNlIHsgICAgICAgICAgICAgICAgLyogQkIgaW1wcm92ZSB0aGUgY2hlY2sgZm9yIGJ1ZmZlciBvdmVycnVucyBCQiAqLworCQluYW1lX2xlbiA9IHN0cm5sZW4oZnJvbU5hbWUsIFBBVEhfTUFYKTsKKwkJbmFtZV9sZW4rKzsgICAgIC8qIHRyYWlsaW5nIG51bGwgKi8KKwkJc3RybmNweShwU01CLT5PbGRGaWxlTmFtZSwgZnJvbU5hbWUsIG5hbWVfbGVuKTsKKwkJbmFtZV9sZW4yID0gc3Rybmxlbih0b05hbWUsIFBBVEhfTUFYKTsKKwkJbmFtZV9sZW4yKys7ICAgIC8qIHRyYWlsaW5nIG51bGwgKi8KKwkJcFNNQi0+T2xkRmlsZU5hbWVbbmFtZV9sZW5dID0gMHgwNDsgIC8qIDJuZCBidWZmZXIgZm9ybWF0ICovCisJCXN0cm5jcHkoJnBTTUItPk9sZEZpbGVOYW1lW25hbWVfbGVuICsgMV0sIHRvTmFtZSwgbmFtZV9sZW4yKTsKKwkJbmFtZV9sZW4yKys7ICAgIC8qIHRyYWlsaW5nIG51bGwgKi8KKwkJbmFtZV9sZW4yKys7ICAgIC8qIHNpZ25hdHVyZSBieXRlICovCisJfQorCisJY291bnQgPSAxIC8qIDFzdCBzaWduYXR1cmUgYnl0ZSAqLyAgKyBuYW1lX2xlbiArIG5hbWVfbGVuMjsKKwlwU01CLT5oZHIuc21iX2J1Zl9sZW5ndGggKz0gY291bnQ7CisJcFNNQi0+Qnl0ZUNvdW50ID0gY3B1X3RvX2xlMTYoY291bnQpOworCisJcmMgPSBTZW5kUmVjZWl2ZSh4aWQsIHRjb24tPnNlcywgKHN0cnVjdCBzbWJfaGRyICopIHBTTUIsCisJCShzdHJ1Y3Qgc21iX2hkciAqKSBwU01CciwgJmJ5dGVzX3JldHVybmVkLCAwKTsKKwlpZiAocmMpIHsKKwkJY0ZZSSgxLCAoIlNlbmQgZXJyb3IgaW4gY29weSA9ICVkIHdpdGggJWQgZmlsZXMgY29waWVkIiwKKwkJCXJjLCBsZTE2X3RvX2NwdShwU01Cci0+Q29weUNvdW50KSkpOworCX0KKwlpZiAocFNNQikKKwkJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKworCWlmIChyYyA9PSAtRUFHQUlOKQorCQlnb3RvIGNvcHlSZXRyeTsKKworCXJldHVybiByYzsKK30KKworaW50CitDSUZTVW5peENyZWF0ZVN5bUxpbmsoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJICAgICAgY29uc3QgY2hhciAqZnJvbU5hbWUsIGNvbnN0IGNoYXIgKnRvTmFtZSwKKwkJICAgICAgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworCVRSQU5TQUNUSU9OMl9TUElfUkVRICpwU01CID0gTlVMTDsKKwlUUkFOU0FDVElPTjJfU1BJX1JTUCAqcFNNQnIgPSBOVUxMOworCWNoYXIgKmRhdGFfb2Zmc2V0OworCWludCBuYW1lX2xlbjsKKwlpbnQgbmFtZV9sZW5fdGFyZ2V0OworCWludCByYyA9IDA7CisJaW50IGJ5dGVzX3JldHVybmVkID0gMDsKKwlfX3UxNiBwYXJhbXMsIHBhcmFtX29mZnNldCwgb2Zmc2V0LCBieXRlX2NvdW50OworCisJY0ZZSSgxLCAoIkluIFN5bWxpbmsgVW5peCBzdHlsZSIpKTsKK2NyZWF0ZVN5bUxpbmtSZXRyeToKKwlyYyA9IHNtYl9pbml0KFNNQl9DT01fVFJBTlNBQ1RJT04yLCAxNSwgdGNvbiwgKHZvaWQgKiopICZwU01CLAorCQkgICAgICAodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmIChwU01CLT5oZHIuRmxhZ3MyICYgU01CRkxHMl9VTklDT0RFKSB7CisJCW5hbWVfbGVuID0KKwkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgcFNNQi0+RmlsZU5hbWUsIGZyb21OYW1lLCBQQVRIX01BWAorCQkJCSAgLyogZmluZCBkZWZpbmUgZm9yIHRoaXMgbWF4cGF0aGNvbXBvbmVudCAqLworCQkJCSAgLCBubHNfY29kZXBhZ2UpOworCQluYW1lX2xlbisrOwkvKiB0cmFpbGluZyBudWxsICovCisJCW5hbWVfbGVuICo9IDI7CisKKwl9IGVsc2UgewkJLyogQkIgaW1wcm92ZSB0aGUgY2hlY2sgZm9yIGJ1ZmZlciBvdmVycnVucyBCQiAqLworCQluYW1lX2xlbiA9IHN0cm5sZW4oZnJvbU5hbWUsIFBBVEhfTUFYKTsKKwkJbmFtZV9sZW4rKzsJLyogdHJhaWxpbmcgbnVsbCAqLworCQlzdHJuY3B5KHBTTUItPkZpbGVOYW1lLCBmcm9tTmFtZSwgbmFtZV9sZW4pOworCX0KKwlwYXJhbXMgPSA2ICsgbmFtZV9sZW47CisJcFNNQi0+TWF4U2V0dXBDb3VudCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQgPSAwOworCXBTTUItPkZsYWdzID0gMDsKKwlwU01CLT5UaW1lb3V0ID0gMDsKKwlwU01CLT5SZXNlcnZlZDIgPSAwOworCXBhcmFtX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBzbWJfY29tX3RyYW5zYWN0aW9uMl9zcGlfcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uTGV2ZWwpIC0gNDsKKwlvZmZzZXQgPSBwYXJhbV9vZmZzZXQgKyBwYXJhbXM7CisKKwlkYXRhX29mZnNldCA9IChjaGFyICopICgmcFNNQi0+aGRyLlByb3RvY29sKSArIG9mZnNldDsKKwlpZiAocFNNQi0+aGRyLkZsYWdzMiAmIFNNQkZMRzJfVU5JQ09ERSkgeworCQluYW1lX2xlbl90YXJnZXQgPQorCQkgICAgY2lmc19zdHJ0b1VDUygod2NoYXJfdCAqKSBkYXRhX29mZnNldCwgdG9OYW1lLCBQQVRIX01BWAorCQkJCSAgLyogZmluZCBkZWZpbmUgZm9yIHRoaXMgbWF4cGF0aGNvbXBvbmVudCAqLworCQkJCSAgLCBubHNfY29kZXBhZ2UpOworCQluYW1lX2xlbl90YXJnZXQrKzsJLyogdHJhaWxpbmcgbnVsbCAqLworCQluYW1lX2xlbl90YXJnZXQgKj0gMjsKKwl9IGVsc2UgewkJLyogQkIgaW1wcm92ZSB0aGUgY2hlY2sgZm9yIGJ1ZmZlciBvdmVycnVucyBCQiAqLworCQluYW1lX2xlbl90YXJnZXQgPSBzdHJubGVuKHRvTmFtZSwgUEFUSF9NQVgpOworCQluYW1lX2xlbl90YXJnZXQrKzsJLyogdHJhaWxpbmcgbnVsbCAqLworCQlzdHJuY3B5KGRhdGFfb2Zmc2V0LCB0b05hbWUsIG5hbWVfbGVuX3RhcmdldCk7CisJfQorCisJcFNNQi0+TWF4UGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNigyKTsKKwkvKiBCQiBmaW5kIGV4YWN0IG1heCBvbiBkYXRhIGNvdW50IGJlbG93IGZyb20gc2VzcyAqLworCXBTTUItPk1heERhdGFDb3VudCA9IGNwdV90b19sZTE2KDEwMDApOworCXBTTUItPlNldHVwQ291bnQgPSAxOworCXBTTUItPlJlc2VydmVkMyA9IDA7CisJcFNNQi0+U3ViQ29tbWFuZCA9IGNwdV90b19sZTE2KFRSQU5TMl9TRVRfUEFUSF9JTkZPUk1BVElPTik7CisJYnl0ZV9jb3VudCA9IDMgLyogcGFkICovICArIHBhcmFtcyArIG5hbWVfbGVuX3RhcmdldDsKKwlwU01CLT5EYXRhQ291bnQgPSBjcHVfdG9fbGUxNihuYW1lX2xlbl90YXJnZXQpOworCXBTTUItPlBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYocGFyYW1zKTsKKwlwU01CLT5Ub3RhbERhdGFDb3VudCA9IHBTTUItPkRhdGFDb3VudDsKKwlwU01CLT5Ub3RhbFBhcmFtZXRlckNvdW50ID0gcFNNQi0+UGFyYW1ldGVyQ291bnQ7CisJcFNNQi0+UGFyYW1ldGVyT2Zmc2V0ID0gY3B1X3RvX2xlMTYocGFyYW1fb2Zmc2V0KTsKKwlwU01CLT5EYXRhT2Zmc2V0ID0gY3B1X3RvX2xlMTYob2Zmc2V0KTsKKwlwU01CLT5JbmZvcm1hdGlvbkxldmVsID0gY3B1X3RvX2xlMTYoU01CX1NFVF9GSUxFX1VOSVhfTElOSyk7CisJcFNNQi0+UmVzZXJ2ZWQ0ID0gMDsKKwlwU01CLT5oZHIuc21iX2J1Zl9sZW5ndGggKz0gYnl0ZV9jb3VudDsKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihieXRlX2NvdW50KTsKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKwkJCSAoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMCk7CisJaWYgKHJjKSB7CisJCWNGWUkoMSwKKwkJICAgICAoIlNlbmQgZXJyb3IgaW4gU2V0UGF0aEluZm8gKGNyZWF0ZSBzeW1saW5rKSA9ICVkIiwKKwkJICAgICAgcmMpKTsKKwl9CisKKwlpZiAocFNNQikKKwkJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKworCWlmIChyYyA9PSAtRUFHQUlOKQorCQlnb3RvIGNyZWF0ZVN5bUxpbmtSZXRyeTsKKworCXJldHVybiByYzsKK30KKworaW50CitDSUZTVW5peENyZWF0ZUhhcmRMaW5rKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCisJCSAgICAgICBjb25zdCBjaGFyICpmcm9tTmFtZSwgY29uc3QgY2hhciAqdG9OYW1lLAorCQkgICAgICAgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworCVRSQU5TQUNUSU9OMl9TUElfUkVRICpwU01CID0gTlVMTDsKKwlUUkFOU0FDVElPTjJfU1BJX1JTUCAqcFNNQnIgPSBOVUxMOworCWNoYXIgKmRhdGFfb2Zmc2V0OworCWludCBuYW1lX2xlbjsKKwlpbnQgbmFtZV9sZW5fdGFyZ2V0OworCWludCByYyA9IDA7CisJaW50IGJ5dGVzX3JldHVybmVkID0gMDsKKwlfX3UxNiBwYXJhbXMsIHBhcmFtX29mZnNldCwgb2Zmc2V0LCBieXRlX2NvdW50OworCisJY0ZZSSgxLCAoIkluIENyZWF0ZSBIYXJkIGxpbmsgVW5peCBzdHlsZSIpKTsKK2NyZWF0ZUhhcmRMaW5rUmV0cnk6CisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX1RSQU5TQUNUSU9OMiwgMTUsIHRjb24sICh2b2lkICoqKSAmcFNNQiwKKwkJICAgICAgKHZvaWQgKiopICZwU01Ccik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlpZiAocFNNQi0+aGRyLkZsYWdzMiAmIFNNQkZMRzJfVU5JQ09ERSkgeworCQluYW1lX2xlbiA9IGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgcFNNQi0+RmlsZU5hbWUsIHRvTmFtZSwgUEFUSF9NQVgKKwkJCQkJIC8qIGZpbmQgZGVmaW5lIGZvciB0aGlzIG1heHBhdGhjb21wb25lbnQgKi8KKwkJCQkJICwgbmxzX2NvZGVwYWdlKTsKKwkJbmFtZV9sZW4rKzsJLyogdHJhaWxpbmcgbnVsbCAqLworCQluYW1lX2xlbiAqPSAyOworCisJfSBlbHNlIHsJCS8qIEJCIGltcHJvdmUgdGhlIGNoZWNrIGZvciBidWZmZXIgb3ZlcnJ1bnMgQkIgKi8KKwkJbmFtZV9sZW4gPSBzdHJubGVuKHRvTmFtZSwgUEFUSF9NQVgpOworCQluYW1lX2xlbisrOwkvKiB0cmFpbGluZyBudWxsICovCisJCXN0cm5jcHkocFNNQi0+RmlsZU5hbWUsIHRvTmFtZSwgbmFtZV9sZW4pOworCX0KKwlwYXJhbXMgPSA2ICsgbmFtZV9sZW47CisJcFNNQi0+TWF4U2V0dXBDb3VudCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQgPSAwOworCXBTTUItPkZsYWdzID0gMDsKKwlwU01CLT5UaW1lb3V0ID0gMDsKKwlwU01CLT5SZXNlcnZlZDIgPSAwOworCXBhcmFtX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBzbWJfY29tX3RyYW5zYWN0aW9uMl9zcGlfcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uTGV2ZWwpIC0gNDsKKwlvZmZzZXQgPSBwYXJhbV9vZmZzZXQgKyBwYXJhbXM7CisKKwlkYXRhX29mZnNldCA9IChjaGFyICopICgmcFNNQi0+aGRyLlByb3RvY29sKSArIG9mZnNldDsKKwlpZiAocFNNQi0+aGRyLkZsYWdzMiAmIFNNQkZMRzJfVU5JQ09ERSkgeworCQluYW1lX2xlbl90YXJnZXQgPQorCQkgICAgY2lmc19zdHJ0b1VDUygod2NoYXJfdCAqKSBkYXRhX29mZnNldCwgZnJvbU5hbWUsIFBBVEhfTUFYCisJCQkJICAvKiBmaW5kIGRlZmluZSBmb3IgdGhpcyBtYXhwYXRoY29tcG9uZW50ICovCisJCQkJICAsIG5sc19jb2RlcGFnZSk7CisJCW5hbWVfbGVuX3RhcmdldCsrOwkvKiB0cmFpbGluZyBudWxsICovCisJCW5hbWVfbGVuX3RhcmdldCAqPSAyOworCX0gZWxzZSB7CQkvKiBCQiBpbXByb3ZlIHRoZSBjaGVjayBmb3IgYnVmZmVyIG92ZXJydW5zIEJCICovCisJCW5hbWVfbGVuX3RhcmdldCA9IHN0cm5sZW4oZnJvbU5hbWUsIFBBVEhfTUFYKTsKKwkJbmFtZV9sZW5fdGFyZ2V0Kys7CS8qIHRyYWlsaW5nIG51bGwgKi8KKwkJc3RybmNweShkYXRhX29mZnNldCwgZnJvbU5hbWUsIG5hbWVfbGVuX3RhcmdldCk7CisJfQorCisJcFNNQi0+TWF4UGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNigyKTsKKwkvKiBCQiBmaW5kIGV4YWN0IG1heCBvbiBkYXRhIGNvdW50IGJlbG93IGZyb20gc2VzcyovCisJcFNNQi0+TWF4RGF0YUNvdW50ID0gY3B1X3RvX2xlMTYoMTAwMCk7CisJcFNNQi0+U2V0dXBDb3VudCA9IDE7CisJcFNNQi0+UmVzZXJ2ZWQzID0gMDsKKwlwU01CLT5TdWJDb21tYW5kID0gY3B1X3RvX2xlMTYoVFJBTlMyX1NFVF9QQVRIX0lORk9STUFUSU9OKTsKKwlieXRlX2NvdW50ID0gMyAvKiBwYWQgKi8gICsgcGFyYW1zICsgbmFtZV9sZW5fdGFyZ2V0OworCXBTTUItPlBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYocGFyYW1zKTsKKwlwU01CLT5Ub3RhbFBhcmFtZXRlckNvdW50ID0gcFNNQi0+UGFyYW1ldGVyQ291bnQ7CisJcFNNQi0+RGF0YUNvdW50ID0gY3B1X3RvX2xlMTYobmFtZV9sZW5fdGFyZ2V0KTsKKwlwU01CLT5Ub3RhbERhdGFDb3VudCA9IHBTTUItPkRhdGFDb3VudDsKKwlwU01CLT5QYXJhbWV0ZXJPZmZzZXQgPSBjcHVfdG9fbGUxNihwYXJhbV9vZmZzZXQpOworCXBTTUItPkRhdGFPZmZzZXQgPSBjcHVfdG9fbGUxNihvZmZzZXQpOworCXBTTUItPkluZm9ybWF0aW9uTGV2ZWwgPSBjcHVfdG9fbGUxNihTTUJfU0VUX0ZJTEVfVU5JWF9ITElOSyk7CisJcFNNQi0+UmVzZXJ2ZWQ0ID0gMDsKKwlwU01CLT5oZHIuc21iX2J1Zl9sZW5ndGggKz0gYnl0ZV9jb3VudDsKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihieXRlX2NvdW50KTsKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKwkJCSAoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMCk7CisJaWYgKHJjKSB7CisJCWNGWUkoMSwgKCJTZW5kIGVycm9yIGluIFNldFBhdGhJbmZvIChoYXJkIGxpbmspID0gJWQiLCByYykpOworCX0KKworCWNpZnNfYnVmX3JlbGVhc2UocFNNQik7CisJaWYgKHJjID09IC1FQUdBSU4pCisJCWdvdG8gY3JlYXRlSGFyZExpbmtSZXRyeTsKKworCXJldHVybiByYzsKK30KKworaW50CitDSUZTQ3JlYXRlSGFyZExpbmsoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJICAgY29uc3QgY2hhciAqZnJvbU5hbWUsIGNvbnN0IGNoYXIgKnRvTmFtZSwKKwkJICAgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworCWludCByYyA9IDA7CisJTlRfUkVOQU1FX1JFUSAqcFNNQiA9IE5VTEw7CisJUkVOQU1FX1JTUCAqcFNNQnIgPSBOVUxMOworCWludCBieXRlc19yZXR1cm5lZDsKKwlpbnQgbmFtZV9sZW4sIG5hbWVfbGVuMjsKKwlfX3UxNiBjb3VudDsKKworCWNGWUkoMSwgKCJJbiBDSUZTQ3JlYXRlSGFyZExpbmsiKSk7Cit3aW5DcmVhdGVIYXJkTGlua1JldHJ5OgorCisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX05UX1JFTkFNRSwgNCwgdGNvbiwgKHZvaWQgKiopICZwU01CLAorCQkgICAgICAodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXBTTUItPlNlYXJjaEF0dHJpYnV0ZXMgPQorCSAgICBjcHVfdG9fbGUxNihBVFRSX1JFQURPTkxZIHwgQVRUUl9ISURERU4gfCBBVFRSX1NZU1RFTSB8CisJCQlBVFRSX0RJUkVDVE9SWSk7CisJcFNNQi0+RmxhZ3MgPSBjcHVfdG9fbGUxNihDUkVBVEVfSEFSRF9MSU5LKTsKKwlwU01CLT5DbHVzdGVyQ291bnQgPSAwOworCisJcFNNQi0+QnVmZmVyRm9ybWF0ID0gMHgwNDsKKworCWlmIChwU01CLT5oZHIuRmxhZ3MyICYgU01CRkxHMl9VTklDT0RFKSB7CisJCW5hbWVfbGVuID0KKwkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgcFNNQi0+T2xkRmlsZU5hbWUsIGZyb21OYW1lLCBQQVRIX01BWAorCQkJCSAgLyogZmluZCBkZWZpbmUgZm9yIHRoaXMgbWF4cGF0aGNvbXBvbmVudCAqLworCQkJCSAgLCBubHNfY29kZXBhZ2UpOworCQluYW1lX2xlbisrOwkvKiB0cmFpbGluZyBudWxsICovCisJCW5hbWVfbGVuICo9IDI7CisJCXBTTUItPk9sZEZpbGVOYW1lW25hbWVfbGVuXSA9IDA7CS8qIHBhZCAqLworCQlwU01CLT5PbGRGaWxlTmFtZVtuYW1lX2xlbiArIDFdID0gMHgwNDsgCisJCW5hbWVfbGVuMiA9CisJCSAgICBjaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopICYgcFNNQi0+CisJCQkJICBPbGRGaWxlTmFtZVtuYW1lX2xlbiArIDJdLCB0b05hbWUsIFBBVEhfTUFYLAorCQkJCSAgbmxzX2NvZGVwYWdlKTsKKwkJbmFtZV9sZW4yICs9IDEgLyogdHJhaWxpbmcgbnVsbCAqLyAgKyAxIC8qIFNpZ25hdHVyZSB3b3JkICovIDsKKwkJbmFtZV9sZW4yICo9IDI7CS8qIGNvbnZlcnQgdG8gYnl0ZXMgKi8KKwl9IGVsc2UgewkJLyogQkIgaW1wcm92ZSB0aGUgY2hlY2sgZm9yIGJ1ZmZlciBvdmVycnVucyBCQiAqLworCQluYW1lX2xlbiA9IHN0cm5sZW4oZnJvbU5hbWUsIFBBVEhfTUFYKTsKKwkJbmFtZV9sZW4rKzsJLyogdHJhaWxpbmcgbnVsbCAqLworCQlzdHJuY3B5KHBTTUItPk9sZEZpbGVOYW1lLCBmcm9tTmFtZSwgbmFtZV9sZW4pOworCQluYW1lX2xlbjIgPSBzdHJubGVuKHRvTmFtZSwgUEFUSF9NQVgpOworCQluYW1lX2xlbjIrKzsJLyogdHJhaWxpbmcgbnVsbCAqLworCQlwU01CLT5PbGRGaWxlTmFtZVtuYW1lX2xlbl0gPSAweDA0OwkvKiAybmQgYnVmZmVyIGZvcm1hdCAqLworCQlzdHJuY3B5KCZwU01CLT5PbGRGaWxlTmFtZVtuYW1lX2xlbiArIDFdLCB0b05hbWUsIG5hbWVfbGVuMik7CisJCW5hbWVfbGVuMisrOwkvKiB0cmFpbGluZyBudWxsICovCisJCW5hbWVfbGVuMisrOwkvKiBzaWduYXR1cmUgYnl0ZSAqLworCX0KKworCWNvdW50ID0gMSAvKiBzdHJpbmcgdHlwZSBieXRlICovICArIG5hbWVfbGVuICsgbmFtZV9sZW4yOworCXBTTUItPmhkci5zbWJfYnVmX2xlbmd0aCArPSBjb3VudDsKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihjb3VudCk7CisKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKwkJCSAoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMCk7CisJaWYgKHJjKSB7CisJCWNGWUkoMSwgKCJTZW5kIGVycm9yIGluIGhhcmQgbGluayAoTlQgcmVuYW1lKSA9ICVkIiwgcmMpKTsKKwl9CisJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKwlpZiAocmMgPT0gLUVBR0FJTikKKwkJZ290byB3aW5DcmVhdGVIYXJkTGlua1JldHJ5OworCisJcmV0dXJuIHJjOworfQorCitpbnQKK0NJRlNTTUJVbml4UXVlcnlTeW1MaW5rKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpzZWFyY2hOYW1lLAorCQkJY2hhciAqc3ltbGlua2luZm8sIGNvbnN0IGludCBidWZsZW4sCisJCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpCit7CisvKiBTTUJfUVVFUllfRklMRV9VTklYX0xJTksgKi8KKwlUUkFOU0FDVElPTjJfUVBJX1JFUSAqcFNNQiA9IE5VTEw7CisJVFJBTlNBQ1RJT04yX1FQSV9SU1AgKnBTTUJyID0gTlVMTDsKKwlpbnQgcmMgPSAwOworCWludCBieXRlc19yZXR1cm5lZDsKKwlpbnQgbmFtZV9sZW47CisJX191MTYgcGFyYW1zLCBieXRlX2NvdW50OworCisJY0ZZSSgxLCAoIkluIFFQYXRoU3ltTGlua0luZm8gKFVuaXgpIGZvciBwYXRoICVzIiwgc2VhcmNoTmFtZSkpOworCitxdWVyeVN5bUxpbmtSZXRyeToKKwlyYyA9IHNtYl9pbml0KFNNQl9DT01fVFJBTlNBQ1RJT04yLCAxNSwgdGNvbiwgKHZvaWQgKiopICZwU01CLAorCQkgICAgICAodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmIChwU01CLT5oZHIuRmxhZ3MyICYgU01CRkxHMl9VTklDT0RFKSB7CisJCW5hbWVfbGVuID0KKwkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgcFNNQi0+RmlsZU5hbWUsIHNlYXJjaE5hbWUsIFBBVEhfTUFYCisJCQkJICAvKiBmaW5kIGRlZmluZSBmb3IgdGhpcyBtYXhwYXRoY29tcG9uZW50ICovCisJCQkJICAsIG5sc19jb2RlcGFnZSk7CisJCW5hbWVfbGVuKys7CS8qIHRyYWlsaW5nIG51bGwgKi8KKwkJbmFtZV9sZW4gKj0gMjsKKwl9IGVsc2UgewkJLyogQkIgaW1wcm92ZSB0aGUgY2hlY2sgZm9yIGJ1ZmZlciBvdmVycnVucyBCQiAqLworCQluYW1lX2xlbiA9IHN0cm5sZW4oc2VhcmNoTmFtZSwgUEFUSF9NQVgpOworCQluYW1lX2xlbisrOwkvKiB0cmFpbGluZyBudWxsICovCisJCXN0cm5jcHkocFNNQi0+RmlsZU5hbWUsIHNlYXJjaE5hbWUsIG5hbWVfbGVuKTsKKwl9CisKKwlwYXJhbXMgPSAyIC8qIGxldmVsICovICArIDQgLyogcnNydmQgKi8gICsgbmFtZV9sZW4gLyogaW5jbCBudWxsICovIDsKKwlwU01CLT5Ub3RhbERhdGFDb3VudCA9IDA7CisJcFNNQi0+TWF4UGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNigyKTsKKwkvKiBCQiBmaW5kIGV4YWN0IG1heCBkYXRhIGNvdW50IGJlbG93IGZyb20gc2VzcyBzdHJ1Y3R1cmUgQkIgKi8KKwlwU01CLT5NYXhEYXRhQ291bnQgPSBjcHVfdG9fbGUxNig0MDAwKTsKKwlwU01CLT5NYXhTZXR1cENvdW50ID0gMDsKKwlwU01CLT5SZXNlcnZlZCA9IDA7CisJcFNNQi0+RmxhZ3MgPSAwOworCXBTTUItPlRpbWVvdXQgPSAwOworCXBTTUItPlJlc2VydmVkMiA9IDA7CisJcFNNQi0+UGFyYW1ldGVyT2Zmc2V0ID0gY3B1X3RvX2xlMTYob2Zmc2V0b2YoCisgICAgICAgIHN0cnVjdCBzbWJfY29tX3RyYW5zYWN0aW9uMl9xcGlfcmVxICxJbmZvcm1hdGlvbkxldmVsKSAtIDQpOworCXBTTUItPkRhdGFDb3VudCA9IDA7CisJcFNNQi0+RGF0YU9mZnNldCA9IDA7CisJcFNNQi0+U2V0dXBDb3VudCA9IDE7CisJcFNNQi0+UmVzZXJ2ZWQzID0gMDsKKwlwU01CLT5TdWJDb21tYW5kID0gY3B1X3RvX2xlMTYoVFJBTlMyX1FVRVJZX1BBVEhfSU5GT1JNQVRJT04pOworCWJ5dGVfY291bnQgPSBwYXJhbXMgKyAxIC8qIHBhZCAqLyA7CisJcFNNQi0+VG90YWxQYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KHBhcmFtcyk7CisJcFNNQi0+UGFyYW1ldGVyQ291bnQgPSBwU01CLT5Ub3RhbFBhcmFtZXRlckNvdW50OworCXBTTUItPkluZm9ybWF0aW9uTGV2ZWwgPSBjcHVfdG9fbGUxNihTTUJfUVVFUllfRklMRV9VTklYX0xJTkspOworCXBTTUItPlJlc2VydmVkNCA9IDA7CisJcFNNQi0+aGRyLnNtYl9idWZfbGVuZ3RoICs9IGJ5dGVfY291bnQ7CisJcFNNQi0+Qnl0ZUNvdW50ID0gY3B1X3RvX2xlMTYoYnl0ZV9jb3VudCk7CisKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKwkJCSAoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMCk7CisJaWYgKHJjKSB7CisJCWNGWUkoMSwgKCJTZW5kIGVycm9yIGluIFF1ZXJ5U3ltTGlua0luZm8gPSAlZCIsIHJjKSk7CisJfSBlbHNlIHsKKwkJLyogZGVjb2RlIHJlc3BvbnNlICovCisKKwkJcmMgPSB2YWxpZGF0ZV90Migoc3RydWN0IHNtYl90Ml9yc3AgKilwU01Ccik7CisJCWlmIChyYyB8fCAocFNNQnItPkJ5dGVDb3VudCA8IDIpKQorCQkvKiBCQiBhbHNvIGNoZWNrIGVub3VnaCB0b3RhbCBieXRlcyByZXR1cm5lZCAqLworCQkJcmMgPSAtRUlPOwkvKiBiYWQgc21iICovCisJCWVsc2UgeworCQkJX191MTYgZGF0YV9vZmZzZXQgPSBsZTE2X3RvX2NwdShwU01Cci0+dDIuRGF0YU9mZnNldCk7CisJCQlfX3UxNiBjb3VudCA9IGxlMTZfdG9fY3B1KHBTTUJyLT50Mi5EYXRhQ291bnQpOworCisJCQlpZiAocFNNQnItPmhkci5GbGFnczIgJiBTTUJGTEcyX1VOSUNPREUpIHsKKwkJCQluYW1lX2xlbiA9IFVuaVN0cm5sZW4oKHdjaGFyX3QgKikgKChjaGFyICopCisJCQkJCSZwU01Cci0+aGRyLlByb3RvY29sICtkYXRhX29mZnNldCksCisJCQkJCW1pbl90KGNvbnN0IGludCwgYnVmbGVuLGNvdW50KSAvIDIpOworCQkJCWNpZnNfc3RyZnJvbVVDU19sZShzeW1saW5raW5mbywKKwkJCQkJKHdjaGFyX3QgKikgKChjaGFyICopJnBTTUJyLT5oZHIuUHJvdG9jb2wgKworCQkJCQkJZGF0YV9vZmZzZXQpLAorCQkJCQluYW1lX2xlbiwgbmxzX2NvZGVwYWdlKTsKKwkJCX0gZWxzZSB7CisJCQkJc3RybmNweShzeW1saW5raW5mbywKKwkJCQkJKGNoYXIgKikgJnBTTUJyLT5oZHIuUHJvdG9jb2wgKyAKKwkJCQkJCWRhdGFfb2Zmc2V0LAorCQkJCQltaW5fdChjb25zdCBpbnQsIGJ1ZmxlbiwgY291bnQpKTsKKwkJCX0KKwkJCXN5bWxpbmtpbmZvW2J1Zmxlbl0gPSAwOworCS8qIGp1c3QgaW4gY2FzZSBzbyBjYWxsaW5nIGNvZGUgZG9lcyBub3QgZ28gb2ZmIHRoZSBlbmQgb2YgYnVmZmVyICovCisJCX0KKwl9CisJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKwlpZiAocmMgPT0gLUVBR0FJTikKKwkJZ290byBxdWVyeVN5bUxpbmtSZXRyeTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludAorQ0lGU1NNQlF1ZXJ5UmVwYXJzZUxpbmtJbmZvKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICpzZWFyY2hOYW1lLAorCQkJY2hhciAqc3ltbGlua2luZm8sIGNvbnN0IGludCBidWZsZW4sX191MTYgZmlkLAorCQkJY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworCWludCByYyA9IDA7CisJaW50IGJ5dGVzX3JldHVybmVkOworCWludCBuYW1lX2xlbjsKKwlzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbl9pb2N0bF9yZXEgKiBwU01COworCXN0cnVjdCBzbWJfY29tX3RyYW5zYWN0aW9uX2lvY3RsX3JzcCAqIHBTTUJyOworCisJY0ZZSSgxLCAoIkluIFdpbmRvd3MgcmVwYXJzZSBzdHlsZSBRdWVyeUxpbmsgZm9yIHBhdGggJXMiLCBzZWFyY2hOYW1lKSk7CisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX05UX1RSQU5TQUNULCAyMywgdGNvbiwgKHZvaWQgKiopICZwU01CLAorCQkgICAgICAodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXBTTUItPlRvdGFsUGFyYW1ldGVyQ291bnQgPSAwIDsKKwlwU01CLT5Ub3RhbERhdGFDb3VudCA9IDA7CisJcFNNQi0+TWF4UGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUzMigyKTsKKwkvKiBCQiBmaW5kIGV4YWN0IGRhdGEgY291bnQgbWF4IGZyb20gc2VzcyBzdHJ1Y3R1cmUgQkIgKi8KKwlwU01CLT5NYXhEYXRhQ291bnQgPSBjcHVfdG9fbGUzMig0MDAwKTsKKwlwU01CLT5NYXhTZXR1cENvdW50ID0gNDsKKwlwU01CLT5SZXNlcnZlZCA9IDA7CisJcFNNQi0+UGFyYW1ldGVyT2Zmc2V0ID0gMDsKKwlwU01CLT5EYXRhQ291bnQgPSAwOworCXBTTUItPkRhdGFPZmZzZXQgPSAwOworCXBTTUItPlNldHVwQ291bnQgPSA0OworCXBTTUItPlN1YkNvbW1hbmQgPSBjcHVfdG9fbGUxNihOVF9UUkFOU0FDVF9JT0NUTCk7CisJcFNNQi0+UGFyYW1ldGVyQ291bnQgPSBwU01CLT5Ub3RhbFBhcmFtZXRlckNvdW50OworCXBTTUItPkZ1bmN0aW9uQ29kZSA9IGNwdV90b19sZTMyKEZTQ1RMX0dFVF9SRVBBUlNFX1BPSU5UKTsKKwlwU01CLT5Jc0ZzY3RsID0gMTsgLyogRlNDVEwgKi8KKwlwU01CLT5Jc1Jvb3RGbGFnID0gMDsKKwlwU01CLT5GaWQgPSBmaWQ7IC8qIGZpbGUgaGFuZGxlIGFsd2F5cyBsZSAqLworCXBTTUItPkJ5dGVDb3VudCA9IDA7CisKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKwkJCSAoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMCk7CisJaWYgKHJjKSB7CisJCWNGWUkoMSwgKCJTZW5kIGVycm9yIGluIFF1ZXJ5UmVwYXJzZUxpbmtJbmZvID0gJWQiLCByYykpOworCX0gZWxzZSB7CQkvKiBkZWNvZGUgcmVzcG9uc2UgKi8KKwkJX191MzIgZGF0YV9vZmZzZXQgPSBsZTMyX3RvX2NwdShwU01Cci0+RGF0YU9mZnNldCk7CisJCV9fdTMyIGRhdGFfY291bnQgPSBsZTMyX3RvX2NwdShwU01Cci0+RGF0YUNvdW50KTsKKwkJaWYgKChwU01Cci0+Qnl0ZUNvdW50IDwgMikgfHwgKGRhdGFfb2Zmc2V0ID4gNTEyKSkKKwkJLyogQkIgYWxzbyBjaGVjayBlbm91Z2ggdG90YWwgYnl0ZXMgcmV0dXJuZWQgKi8KKwkJCXJjID0gLUVJTzsJLyogYmFkIHNtYiAqLworCQllbHNlIHsKKwkJCWlmKGRhdGFfY291bnQgJiYgKGRhdGFfY291bnQgPCAyMDQ4KSkgeworCQkJCWNoYXIgKiBlbmRfb2Zfc21iID0gcFNNQnItPkJ5dGVDb3VudCArIChjaGFyICopJnBTTUJyLT5CeXRlQ291bnQ7CisKKwkJCQlzdHJ1Y3QgcmVwYXJzZV9kYXRhICogcmVwYXJzZV9idWYgPSAoc3RydWN0IHJlcGFyc2VfZGF0YSAqKQorCQkJCQkoKGNoYXIgKikmcFNNQnItPmhkci5Qcm90b2NvbCArIGRhdGFfb2Zmc2V0KTsKKwkJCQlpZigoY2hhciopcmVwYXJzZV9idWYgPj0gZW5kX29mX3NtYikgeworCQkJCQlyYyA9IC1FSU87CisJCQkJCWdvdG8gcXJlcGFyc2Vfb3V0OworCQkJCX0KKwkJCQlpZigocmVwYXJzZV9idWYtPkxpbmtOYW1lc0J1ZiArIAorCQkJCQlyZXBhcnNlX2J1Zi0+VGFyZ2V0TmFtZU9mZnNldCArCisJCQkJCXJlcGFyc2VfYnVmLT5UYXJnZXROYW1lTGVuKSA+CisJCQkJCQllbmRfb2Zfc21iKSB7CisJCQkJCWNGWUkoMSwoInJlcGFyc2UgYnVmIGV4dGVuZGVkIGJleW9uZCBTTUIiKSk7CisJCQkJCXJjID0gLUVJTzsKKwkJCQkJZ290byBxcmVwYXJzZV9vdXQ7CisJCQkJfQorCQkJCQorCQkJCWlmIChwU01Cci0+aGRyLkZsYWdzMiAmIFNNQkZMRzJfVU5JQ09ERSkgeworCQkJCQluYW1lX2xlbiA9IFVuaVN0cm5sZW4oKHdjaGFyX3QgKikKKwkJCQkJCQkocmVwYXJzZV9idWYtPkxpbmtOYW1lc0J1ZiArIAorCQkJCQkJCXJlcGFyc2VfYnVmLT5UYXJnZXROYW1lT2Zmc2V0KSwKKwkJCQkJCQltaW4oYnVmbGVuLzIsIHJlcGFyc2VfYnVmLT5UYXJnZXROYW1lTGVuIC8gMikpOyAKKwkJCQkJY2lmc19zdHJmcm9tVUNTX2xlKHN5bWxpbmtpbmZvLAorCQkJCQkJKHdjaGFyX3QgKikgKHJlcGFyc2VfYnVmLT5MaW5rTmFtZXNCdWYgKyAKKwkJCQkJCXJlcGFyc2VfYnVmLT5UYXJnZXROYW1lT2Zmc2V0KSwKKwkJCQkJCW5hbWVfbGVuLCBubHNfY29kZXBhZ2UpOworCQkJCX0gZWxzZSB7IC8qIEFTQ0lJIG5hbWVzICovCisJCQkJCXN0cm5jcHkoc3ltbGlua2luZm8scmVwYXJzZV9idWYtPkxpbmtOYW1lc0J1ZiArIAorCQkJCQkJcmVwYXJzZV9idWYtPlRhcmdldE5hbWVPZmZzZXQsIAorCQkJCQkJbWluX3QoY29uc3QgaW50LCBidWZsZW4sIHJlcGFyc2VfYnVmLT5UYXJnZXROYW1lTGVuKSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlyYyA9IC1FSU87CisJCQkJY0ZZSSgxLCgiSW52YWxpZCByZXR1cm4gZGF0YSBjb3VudCBvbiBnZXQgcmVwYXJzZSBpbmZvIGlvY3RsIikpOworCQkJfQorCQkJc3ltbGlua2luZm9bYnVmbGVuXSA9IDA7IC8qIGp1c3QgaW4gY2FzZSBzbyB0aGUgY2FsbGVyCisJCQkJCWRvZXMgbm90IGdvIG9mZiB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKi8KKwkJCWNGWUkoMSwoInJlYWRsaW5rIHJlc3VsdCAtICVzICIsc3ltbGlua2luZm8pKTsKKwkJfQorCX0KK3FyZXBhcnNlX291dDoKKwlpZiAocFNNQikKKwkJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKworCS8qIE5vdGU6IE9uIC1FQUdBSU4gZXJyb3Igb25seSBjYWxsZXIgY2FuIHJldHJ5IG9uIGhhbmRsZSBiYXNlZCBjYWxscworCQlzaW5jZSBmaWxlIGhhbmRsZSBwYXNzZWQgaW4gbm8gbG9uZ2VyIHZhbGlkICovCisKKwlyZXR1cm4gcmM7Cit9CisKKyNpZmRlZiBDT05GSUdfQ0lGU19QT1NJWAorCisvKkNvbnZlcnQgYW4gQWNjZXNzIENvbnRyb2wgRW50cnkgZnJvbSB3aXJlIGZvcm1hdCB0byBsb2NhbCBQT1NJWCB4YXR0ciBmb3JtYXQqLworc3RhdGljIHZvaWQgY2lmc19jb252ZXJ0X2FjZShwb3NpeF9hY2xfeGF0dHJfZW50cnkgKiBhY2UsIHN0cnVjdCBjaWZzX3Bvc2l4X2FjZSAqIGNpZnNfYWNlKQoreworCS8qIHU4IGNpZnMgZmllbGRzIGRvIG5vdCBuZWVkIGxlIGNvbnZlcnNpb24gKi8KKwlhY2UtPmVfcGVybSA9IChfX3UxNiljaWZzX2FjZS0+Y2lmc19lX3Blcm07IAorCWFjZS0+ZV90YWcgID0gKF9fdTE2KWNpZnNfYWNlLT5jaWZzX2VfdGFnOworCWFjZS0+ZV9pZCAgID0gKF9fdTMyKWxlNjRfdG9fY3B1KGNpZnNfYWNlLT5jaWZzX3VpZCk7CisJLyogY0ZZSSgxLCgicGVybSAlZCB0YWcgJWQgaWQgJWQiLGFjZS0+ZV9wZXJtLGFjZS0+ZV90YWcsYWNlLT5lX2lkKSk7ICovCisKKwlyZXR1cm47Cit9CisKKy8qIENvbnZlcnQgQUNMIGZyb20gQ0lGUyBQT1NJWCB3aXJlIGZvcm1hdCB0byBsb2NhbCBMaW51eCBQT1NJWCBBQ0wgeGF0dHIgKi8KK3N0YXRpYyBpbnQgY2lmc19jb3B5X3Bvc2l4X2FjbChjaGFyICogdHJndCxjaGFyICogc3JjLCBjb25zdCBpbnQgYnVmbGVuLGNvbnN0IGludCBhY2xfdHlwZSxjb25zdCBpbnQgc2l6ZV9vZl9kYXRhX2FyZWEpCit7CisJaW50IHNpemUgPSAgMDsKKwlpbnQgaTsKKwlfX3UxNiBjb3VudDsKKwlzdHJ1Y3QgY2lmc19wb3NpeF9hY2UgKiBwQUNFOworCXN0cnVjdCBjaWZzX3Bvc2l4X2FjbCAqIGNpZnNfYWNsID0gKHN0cnVjdCBjaWZzX3Bvc2l4X2FjbCAqKXNyYzsKKwlwb3NpeF9hY2xfeGF0dHJfaGVhZGVyICogbG9jYWxfYWNsID0gKHBvc2l4X2FjbF94YXR0cl9oZWFkZXIgKil0cmd0OworCisJaWYgKGxlMTZfdG9fY3B1KGNpZnNfYWNsLT52ZXJzaW9uKSAhPSBDSUZTX0FDTF9WRVJTSU9OKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZihhY2xfdHlwZSAmIEFDTF9UWVBFX0FDQ0VTUykgeworCQljb3VudCA9IGxlMTZfdG9fY3B1KGNpZnNfYWNsLT5hY2Nlc3NfZW50cnlfY291bnQpOworCQlwQUNFID0gJmNpZnNfYWNsLT5hY2VfYXJyYXlbMF07CisJCXNpemUgPSBzaXplb2Yoc3RydWN0IGNpZnNfcG9zaXhfYWNsKTsKKwkJc2l6ZSArPSBzaXplb2Yoc3RydWN0IGNpZnNfcG9zaXhfYWNlKSAqIGNvdW50OworCQkvKiBjaGVjayBpZiB3ZSB3b3VsZCBnbyBiZXlvbmQgZW5kIG9mIFNNQiAqLworCQlpZihzaXplX29mX2RhdGFfYXJlYSA8IHNpemUpIHsKKwkJCWNGWUkoMSwoImJhZCBDSUZTIFBPU0lYIEFDTCBzaXplICVkIHZzLiAlZCIsc2l6ZV9vZl9kYXRhX2FyZWEsc2l6ZSkpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgaWYoYWNsX3R5cGUgJiBBQ0xfVFlQRV9ERUZBVUxUKSB7CisJCWNvdW50ID0gbGUxNl90b19jcHUoY2lmc19hY2wtPmFjY2Vzc19lbnRyeV9jb3VudCk7CisJCXNpemUgPSBzaXplb2Yoc3RydWN0IGNpZnNfcG9zaXhfYWNsKTsKKwkJc2l6ZSArPSBzaXplb2Yoc3RydWN0IGNpZnNfcG9zaXhfYWNlKSAqIGNvdW50OworLyogc2tpcCBwYXN0IGFjY2VzcyBBQ0VzIHRvIGdldCB0byBkZWZhdWx0IEFDRXMgKi8KKwkJcEFDRSA9ICZjaWZzX2FjbC0+YWNlX2FycmF5W2NvdW50XTsKKwkJY291bnQgPSBsZTE2X3RvX2NwdShjaWZzX2FjbC0+ZGVmYXVsdF9lbnRyeV9jb3VudCk7CisJCXNpemUgKz0gc2l6ZW9mKHN0cnVjdCBjaWZzX3Bvc2l4X2FjZSkgKiBjb3VudDsKKwkJLyogY2hlY2sgaWYgd2Ugd291bGQgZ28gYmV5b25kIGVuZCBvZiBTTUIgKi8KKwkJaWYoc2l6ZV9vZl9kYXRhX2FyZWEgPCBzaXplKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJLyogaWxsZWdhbCB0eXBlICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNpemUgPSBwb3NpeF9hY2xfeGF0dHJfc2l6ZShjb3VudCk7CisJaWYoKGJ1ZmxlbiA9PSAwKSB8fCAobG9jYWxfYWNsID09IE5VTEwpKSB7CisJCS8qIHVzZWQgdG8gcXVlcnkgQUNMIEVBIHNpemUgKi8JCQkJCisJfSBlbHNlIGlmKHNpemUgPiBidWZsZW4pIHsKKwkJcmV0dXJuIC1FUkFOR0U7CisJfSBlbHNlIC8qIGJ1ZmZlciBiaWcgZW5vdWdoICovIHsKKwkJbG9jYWxfYWNsLT5hX3ZlcnNpb24gPSBQT1NJWF9BQ0xfWEFUVFJfVkVSU0lPTjsKKwkJZm9yKGkgPSAwO2kgPCBjb3VudCA7aSsrKSB7CisJCQljaWZzX2NvbnZlcnRfYWNlKCZsb2NhbF9hY2wtPmFfZW50cmllc1tpXSxwQUNFKTsKKwkJCXBBQ0UgKys7CisJCX0KKwl9CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBfX3UxNiBjb252ZXJ0X2FjZV90b19jaWZzX2FjZShzdHJ1Y3QgY2lmc19wb3NpeF9hY2UgKiBjaWZzX2FjZSwKKwkJCWNvbnN0IHBvc2l4X2FjbF94YXR0cl9lbnRyeSAqIGxvY2FsX2FjZSkKK3sKKwlfX3UxNiByYyA9IDA7IC8qIDAgPSBBQ0wgY29udmVydGVkIG9rICovCisKKwljaWZzX2FjZS0+Y2lmc19lX3Blcm0gPSAoX191OCljcHVfdG9fbGUxNihsb2NhbF9hY2UtPmVfcGVybSk7CisJY2lmc19hY2UtPmNpZnNfZV90YWcgPSAgKF9fdTgpY3B1X3RvX2xlMTYobG9jYWxfYWNlLT5lX3RhZyk7CisJLyogQkIgaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGhhbmRsZSB0aGUgbGFyZ2UgdWlkPyAqLworCWlmKGxvY2FsX2FjZS0+ZV9pZCA9PSAtMSkgeworCS8qIFByb2JhYmx5IG5vIG5lZWQgdG8gbGUgY29udmVydCAtMSBvbiBhbnkgYXJjaCBidXQgY2FuIG5vdCBodXJ0ICovCisJCWNpZnNfYWNlLT5jaWZzX3VpZCA9IGNwdV90b19sZTY0KC0xKTsKKwl9IGVsc2UgCisJCWNpZnNfYWNlLT5jaWZzX3VpZCA9IChfX3U2NCljcHVfdG9fbGUzMihsb2NhbF9hY2UtPmVfaWQpOworICAgICAgICAvKmNGWUkoMSwoInBlcm0gJWQgdGFnICVkIGlkICVkIixhY2UtPmVfcGVybSxhY2UtPmVfdGFnLGFjZS0+ZV9pZCkpOyovCisJcmV0dXJuIHJjOworfQorCisvKiBDb252ZXJ0IEFDTCBmcm9tIGxvY2FsIExpbnV4IFBPU0lYIHhhdHRyIHRvIENJRlMgUE9TSVggQUNMIHdpcmUgZm9ybWF0ICovCitzdGF0aWMgX191MTYgQUNMX3RvX2NpZnNfcG9zaXgoY2hhciAqIHBhcm1fZGF0YSxjb25zdCBjaGFyICogcEFDTCxjb25zdCBpbnQgYnVmbGVuLAorCQljb25zdCBpbnQgYWNsX3R5cGUpCit7CisJX191MTYgcmMgPSAwOworICAgICAgICBzdHJ1Y3QgY2lmc19wb3NpeF9hY2wgKiBjaWZzX2FjbCA9IChzdHJ1Y3QgY2lmc19wb3NpeF9hY2wgKilwYXJtX2RhdGE7CisgICAgICAgIHBvc2l4X2FjbF94YXR0cl9oZWFkZXIgKiBsb2NhbF9hY2wgPSAocG9zaXhfYWNsX3hhdHRyX2hlYWRlciAqKXBBQ0w7CisJaW50IGNvdW50OworCWludCBpOworCisJaWYoKGJ1ZmxlbiA9PSAwKSB8fCAocEFDTCA9PSBOVUxMKSB8fCAoY2lmc19hY2wgPT0gTlVMTCkpCisJCXJldHVybiAwOworCisJY291bnQgPSBwb3NpeF9hY2xfeGF0dHJfY291bnQoKHNpemVfdClidWZsZW4pOworCWNGWUkoMSwoInNldHRpbmcgYWNsIHdpdGggJWQgZW50cmllcyBmcm9tIGJ1ZiBvZiBsZW5ndGggJWQgYW5kIHZlcnNpb24gb2YgJWQiLAorCQljb3VudCxidWZsZW4sbG9jYWxfYWNsLT5hX3ZlcnNpb24pKTsKKwlpZihsb2NhbF9hY2wtPmFfdmVyc2lvbiAhPSAyKSB7CisJCWNGWUkoMSwoInVua25vd24gUE9TSVggQUNMIHZlcnNpb24gJWQiLGxvY2FsX2FjbC0+YV92ZXJzaW9uKSk7CisJCXJldHVybiAwOworCX0KKwljaWZzX2FjbC0+dmVyc2lvbiA9IGNwdV90b19sZTE2KDEpOworCWlmKGFjbF90eXBlID09IEFDTF9UWVBFX0FDQ0VTUykgCisJCWNpZnNfYWNsLT5hY2Nlc3NfZW50cnlfY291bnQgPSBjb3VudDsKKwllbHNlIGlmKGFjbF90eXBlID09IEFDTF9UWVBFX0RFRkFVTFQpCisJCWNpZnNfYWNsLT5kZWZhdWx0X2VudHJ5X2NvdW50ID0gY291bnQ7CisJZWxzZSB7CisJCWNGWUkoMSwoInVua25vd24gQUNMIHR5cGUgJWQiLGFjbF90eXBlKSk7CisJCXJldHVybiAwOworCX0KKwlmb3IoaT0wO2k8Y291bnQ7aSsrKSB7CisJCXJjID0gY29udmVydF9hY2VfdG9fY2lmc19hY2UoJmNpZnNfYWNsLT5hY2VfYXJyYXlbaV0sCisJCQkJCSZsb2NhbF9hY2wtPmFfZW50cmllc1tpXSk7CisJCWlmKHJjICE9IDApIHsKKwkJCS8qIEFDRSBub3QgY29udmVydGVkICovCisJCQlicmVhazsKKwkJfQorCX0KKwlpZihyYyA9PSAwKSB7CisJCXJjID0gKF9fdTE2KShjb3VudCAqIHNpemVvZihzdHJ1Y3QgY2lmc19wb3NpeF9hY2UpKTsKKwkJcmMgKz0gc2l6ZW9mKHN0cnVjdCBjaWZzX3Bvc2l4X2FjbCk7CisJCS8qIEJCIGFkZCBjaGVjayB0byBtYWtlIHN1cmUgQUNMIGRvZXMgbm90IG92ZXJmbG93IFNNQiAqLworCX0KKwlyZXR1cm4gcmM7Cit9CisKK2ludAorQ0lGU1NNQkdldFBvc2l4QUNMKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzZWFyY2hOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYWNsX2luZiwgY29uc3QgaW50IGJ1ZmxlbiwgY29uc3QgaW50IGFjbF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworLyogU01CX1FVRVJZX1BPU0lYX0FDTCAqLworCVRSQU5TQUNUSU9OMl9RUElfUkVRICpwU01CID0gTlVMTDsKKwlUUkFOU0FDVElPTjJfUVBJX1JTUCAqcFNNQnIgPSBOVUxMOworCWludCByYyA9IDA7CisJaW50IGJ5dGVzX3JldHVybmVkOworCWludCBuYW1lX2xlbjsKKwlfX3UxNiBwYXJhbXMsIGJ5dGVfY291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwljRllJKDEsICgiSW4gR2V0UG9zaXhBQ0wgKFVuaXgpIGZvciBwYXRoICVzIiwgc2VhcmNoTmFtZSkpOworCitxdWVyeUFjbFJldHJ5OgorCXJjID0gc21iX2luaXQoU01CX0NPTV9UUkFOU0FDVElPTjIsIDE1LCB0Y29uLCAodm9pZCAqKikgJnBTTUIsCisJCSh2b2lkICoqKSAmcFNNQnIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJaWYgKHBTTUItPmhkci5GbGFnczIgJiBTTUJGTEcyX1VOSUNPREUpIHsKKwkJbmFtZV9sZW4gPQorCQkJY2lmc19zdHJ0b1VDUygod2NoYXJfdCAqKSBwU01CLT5GaWxlTmFtZSwgc2VhcmNoTmFtZSwgUEFUSF9NQVgKKwkJCQksIG5sc19jb2RlcGFnZSk7CisJCW5hbWVfbGVuKys7ICAgICAvKiB0cmFpbGluZyBudWxsICovCisJCW5hbWVfbGVuICo9IDI7CisJCXBTTUItPkZpbGVOYW1lW25hbWVfbGVuXSA9IDA7CisJCXBTTUItPkZpbGVOYW1lW25hbWVfbGVuKzFdID0gMDsKKwl9IGVsc2UgeyAgICAgICAgICAgICAgICAvKiBCQiBpbXByb3ZlIHRoZSBjaGVjayBmb3IgYnVmZmVyIG92ZXJydW5zIEJCICovCisJCW5hbWVfbGVuID0gc3RybmxlbihzZWFyY2hOYW1lLCBQQVRIX01BWCk7CisJCW5hbWVfbGVuKys7ICAgICAvKiB0cmFpbGluZyBudWxsICovCisJCXN0cm5jcHkocFNNQi0+RmlsZU5hbWUsIHNlYXJjaE5hbWUsIG5hbWVfbGVuKTsKKwl9CisKKwlwYXJhbXMgPSAyIC8qIGxldmVsICovICArIDQgLyogcnNydmQgKi8gICsgbmFtZV9sZW4gLyogaW5jbCBudWxsICovIDsKKwlwU01CLT5Ub3RhbERhdGFDb3VudCA9IDA7CisJcFNNQi0+TWF4UGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNigyKTsKKyAgICAgICAgLyogQkIgZmluZCBleGFjdCBtYXggZGF0YSBjb3VudCBiZWxvdyBmcm9tIHNlc3Mgc3RydWN0dXJlIEJCICovCisJcFNNQi0+TWF4RGF0YUNvdW50ID0gY3B1X3RvX2xlMTYoNDAwMCk7CisJcFNNQi0+TWF4U2V0dXBDb3VudCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQgPSAwOworCXBTTUItPkZsYWdzID0gMDsKKwlwU01CLT5UaW1lb3V0ID0gMDsKKwlwU01CLT5SZXNlcnZlZDIgPSAwOworCXBTTUItPlBhcmFtZXRlck9mZnNldCA9IGNwdV90b19sZTE2KAorCQlvZmZzZXRvZihzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfcXBpX3JlcSAsSW5mb3JtYXRpb25MZXZlbCkgLSA0KTsKKwlwU01CLT5EYXRhQ291bnQgPSAwOworCXBTTUItPkRhdGFPZmZzZXQgPSAwOworCXBTTUItPlNldHVwQ291bnQgPSAxOworCXBTTUItPlJlc2VydmVkMyA9IDA7CisJcFNNQi0+U3ViQ29tbWFuZCA9IGNwdV90b19sZTE2KFRSQU5TMl9RVUVSWV9QQVRIX0lORk9STUFUSU9OKTsKKwlieXRlX2NvdW50ID0gcGFyYW1zICsgMSAvKiBwYWQgKi8gOworCXBTTUItPlRvdGFsUGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNihwYXJhbXMpOworCXBTTUItPlBhcmFtZXRlckNvdW50ID0gcFNNQi0+VG90YWxQYXJhbWV0ZXJDb3VudDsKKwlwU01CLT5JbmZvcm1hdGlvbkxldmVsID0gY3B1X3RvX2xlMTYoU01CX1FVRVJZX1BPU0lYX0FDTCk7CisJcFNNQi0+UmVzZXJ2ZWQ0ID0gMDsKKwlwU01CLT5oZHIuc21iX2J1Zl9sZW5ndGggKz0gYnl0ZV9jb3VudDsKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihieXRlX2NvdW50KTsKKworCXJjID0gU2VuZFJlY2VpdmUoeGlkLCB0Y29uLT5zZXMsIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CLAorCQkoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMCk7CisJaWYgKHJjKSB7CisJCWNGWUkoMSwgKCJTZW5kIGVycm9yIGluIFF1ZXJ5IFBPU0lYIEFDTCA9ICVkIiwgcmMpKTsKKwl9IGVsc2UgeworCQkvKiBkZWNvZGUgcmVzcG9uc2UgKi8KKyAKKwkJcmMgPSB2YWxpZGF0ZV90Migoc3RydWN0IHNtYl90Ml9yc3AgKilwU01Ccik7CisJCWlmIChyYyB8fCAocFNNQnItPkJ5dGVDb3VudCA8IDIpKQorCQkvKiBCQiBhbHNvIGNoZWNrIGVub3VnaCB0b3RhbCBieXRlcyByZXR1cm5lZCAqLworCQkJcmMgPSAtRUlPOyAgICAgIC8qIGJhZCBzbWIgKi8KKwkJZWxzZSB7CisJCQlfX3UxNiBkYXRhX29mZnNldCA9IGxlMTZfdG9fY3B1KHBTTUJyLT50Mi5EYXRhT2Zmc2V0KTsKKwkJCV9fdTE2IGNvdW50ID0gbGUxNl90b19jcHUocFNNQnItPnQyLkRhdGFDb3VudCk7CisJCQlyYyA9IGNpZnNfY29weV9wb3NpeF9hY2woYWNsX2luZiwKKwkJCQkoY2hhciAqKSZwU01Cci0+aGRyLlByb3RvY29sK2RhdGFfb2Zmc2V0LAorCQkJCWJ1ZmxlbixhY2xfdHlwZSxjb3VudCk7CisJCX0KKwl9CisJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKwlpZiAocmMgPT0gLUVBR0FJTikKKwkJZ290byBxdWVyeUFjbFJldHJ5OworCXJldHVybiByYzsKK30KKworaW50CitDSUZTU01CU2V0UG9zaXhBQ0woY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbG9jYWxfYWNsLCBjb25zdCBpbnQgYnVmbGVuLCBjb25zdCBpbnQgYWNsX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpCit7CisJc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3NwaV9yZXEgKnBTTUIgPSBOVUxMOworCXN0cnVjdCBzbWJfY29tX3RyYW5zYWN0aW9uMl9zcGlfcnNwICpwU01CciA9IE5VTEw7CisJY2hhciAqcGFybV9kYXRhOworCWludCBuYW1lX2xlbjsKKwlpbnQgcmMgPSAwOworCWludCBieXRlc19yZXR1cm5lZCA9IDA7CisJX191MTYgcGFyYW1zLCBieXRlX2NvdW50LCBkYXRhX2NvdW50LCBwYXJhbV9vZmZzZXQsIG9mZnNldDsKKworCWNGWUkoMSwgKCJJbiBTZXRQb3NpeEFDTCAoVW5peCkgZm9yIHBhdGggJXMiLCBmaWxlTmFtZSkpOworc2V0QWNsUmV0cnk6CisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX1RSQU5TQUNUSU9OMiwgMTUsIHRjb24sICh2b2lkICoqKSAmcFNNQiwKKyAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKwlpZiAocFNNQi0+aGRyLkZsYWdzMiAmIFNNQkZMRzJfVU5JQ09ERSkgeworCQluYW1lX2xlbiA9CisJCQljaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIHBTTUItPkZpbGVOYW1lLCBmaWxlTmFtZSwgUEFUSF9NQVgKKwkJCQksIG5sc19jb2RlcGFnZSk7CisJCW5hbWVfbGVuKys7ICAgICAvKiB0cmFpbGluZyBudWxsICovCisJCW5hbWVfbGVuICo9IDI7CisJfSBlbHNlIHsgICAgICAgICAgICAgICAgLyogQkIgaW1wcm92ZSB0aGUgY2hlY2sgZm9yIGJ1ZmZlciBvdmVycnVucyBCQiAqLworCQluYW1lX2xlbiA9IHN0cm5sZW4oZmlsZU5hbWUsIFBBVEhfTUFYKTsKKwkJbmFtZV9sZW4rKzsgICAgIC8qIHRyYWlsaW5nIG51bGwgKi8KKwkJc3RybmNweShwU01CLT5GaWxlTmFtZSwgZmlsZU5hbWUsIG5hbWVfbGVuKTsKKwl9CisJcGFyYW1zID0gNiArIG5hbWVfbGVuOworCXBTTUItPk1heFBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYoMik7CisJcFNNQi0+TWF4RGF0YUNvdW50ID0gY3B1X3RvX2xlMTYoMTAwMCk7IC8qIEJCIGZpbmQgbWF4IFNNQiBzaXplIGZyb20gc2VzcyAqLworCXBTTUItPk1heFNldHVwQ291bnQgPSAwOworCXBTTUItPlJlc2VydmVkID0gMDsKKwlwU01CLT5GbGFncyA9IDA7CisJcFNNQi0+VGltZW91dCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQyID0gMDsKKwlwYXJhbV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfc3BpX3JlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZvcm1hdGlvbkxldmVsKSAtIDQ7CisJb2Zmc2V0ID0gcGFyYW1fb2Zmc2V0ICsgcGFyYW1zOworCXBhcm1fZGF0YSA9ICgoY2hhciAqKSAmcFNNQi0+aGRyLlByb3RvY29sKSArIG9mZnNldDsKKwlwU01CLT5QYXJhbWV0ZXJPZmZzZXQgPSBjcHVfdG9fbGUxNihwYXJhbV9vZmZzZXQpOworCisJLyogY29udmVydCB0byBvbiB0aGUgd2lyZSBmb3JtYXQgZm9yIFBPU0lYIEFDTCAqLworCWRhdGFfY291bnQgPSBBQ0xfdG9fY2lmc19wb3NpeChwYXJtX2RhdGEsbG9jYWxfYWNsLGJ1ZmxlbixhY2xfdHlwZSk7CisKKwlpZihkYXRhX2NvdW50ID09IDApIHsKKwkJcmMgPSAtRU9QTk9UU1VQUDsKKwkJZ290byBzZXRBQ0xlcnJvckV4aXQ7CisJfQorCXBTTUItPkRhdGFPZmZzZXQgPSBjcHVfdG9fbGUxNihvZmZzZXQpOworCXBTTUItPlNldHVwQ291bnQgPSAxOworCXBTTUItPlJlc2VydmVkMyA9IDA7CisJcFNNQi0+U3ViQ29tbWFuZCA9IGNwdV90b19sZTE2KFRSQU5TMl9TRVRfUEFUSF9JTkZPUk1BVElPTik7CisJcFNNQi0+SW5mb3JtYXRpb25MZXZlbCA9IGNwdV90b19sZTE2KFNNQl9TRVRfUE9TSVhfQUNMKTsKKwlieXRlX2NvdW50ID0gMyAvKiBwYWQgKi8gICsgcGFyYW1zICsgZGF0YV9jb3VudDsKKwlwU01CLT5EYXRhQ291bnQgPSBjcHVfdG9fbGUxNihkYXRhX2NvdW50KTsKKwlwU01CLT5Ub3RhbERhdGFDb3VudCA9IHBTTUItPkRhdGFDb3VudDsKKwlwU01CLT5QYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KHBhcmFtcyk7CisJcFNNQi0+VG90YWxQYXJhbWV0ZXJDb3VudCA9IHBTTUItPlBhcmFtZXRlckNvdW50OworCXBTTUItPlJlc2VydmVkNCA9IDA7CisJcFNNQi0+aGRyLnNtYl9idWZfbGVuZ3RoICs9IGJ5dGVfY291bnQ7CisJcFNNQi0+Qnl0ZUNvdW50ID0gY3B1X3RvX2xlMTYoYnl0ZV9jb3VudCk7CisJcmMgPSBTZW5kUmVjZWl2ZSh4aWQsIHRjb24tPnNlcywgKHN0cnVjdCBzbWJfaGRyICopIHBTTUIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzbWJfaGRyICopIHBTTUJyLCAmYnl0ZXNfcmV0dXJuZWQsIDApOworCWlmIChyYykgeworCQljRllJKDEsICgiU2V0IFBPU0lYIEFDTCByZXR1cm5lZCAlZCIsIHJjKSk7CisJfQorCitzZXRBQ0xlcnJvckV4aXQ6CisJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKwlpZiAocmMgPT0gLUVBR0FJTikKKwkJZ290byBzZXRBY2xSZXRyeTsKKwlyZXR1cm4gcmM7Cit9CisKKyNlbmRpZgorCitpbnQKK0NJRlNTTUJRUGF0aEluZm8oY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlYXJjaE5hbWUsCisJCSBGSUxFX0FMTF9JTkZPICogcEZpbmREYXRhLAorCQkgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworLyogbGV2ZWwgMjYzIFNNQl9RVUVSWV9GSUxFX0FMTF9JTkZPICovCisJVFJBTlNBQ1RJT04yX1FQSV9SRVEgKnBTTUIgPSBOVUxMOworCVRSQU5TQUNUSU9OMl9RUElfUlNQICpwU01CciA9IE5VTEw7CisJaW50IHJjID0gMDsKKwlpbnQgYnl0ZXNfcmV0dXJuZWQ7CisJaW50IG5hbWVfbGVuOworCV9fdTE2IHBhcmFtcywgYnl0ZV9jb3VudDsKKworLyogY0ZZSSgxLCAoIkluIFFQYXRoSW5mbyBwYXRoICVzIiwgc2VhcmNoTmFtZSkpOyAqLworUVBhdGhJbmZvUmV0cnk6CisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX1RSQU5TQUNUSU9OMiwgMTUsIHRjb24sICh2b2lkICoqKSAmcFNNQiwKKwkJICAgICAgKHZvaWQgKiopICZwU01Ccik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlpZiAocFNNQi0+aGRyLkZsYWdzMiAmIFNNQkZMRzJfVU5JQ09ERSkgeworCQluYW1lX2xlbiA9CisJCSAgICBjaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIHBTTUItPkZpbGVOYW1lLCBzZWFyY2hOYW1lLCBQQVRIX01BWAorCQkJCSAgLyogZmluZCBkZWZpbmUgZm9yIHRoaXMgbWF4cGF0aGNvbXBvbmVudCAqLworCQkJCSAgLCBubHNfY29kZXBhZ2UpOworCQluYW1lX2xlbisrOwkvKiB0cmFpbGluZyBudWxsICovCisJCW5hbWVfbGVuICo9IDI7CisJfSBlbHNlIHsJCS8qIEJCIGltcHJvdmUgdGhlIGNoZWNrIGZvciBidWZmZXIgb3ZlcnJ1bnMgQkIgKi8KKwkJbmFtZV9sZW4gPSBzdHJubGVuKHNlYXJjaE5hbWUsIFBBVEhfTUFYKTsKKwkJbmFtZV9sZW4rKzsJLyogdHJhaWxpbmcgbnVsbCAqLworCQlzdHJuY3B5KHBTTUItPkZpbGVOYW1lLCBzZWFyY2hOYW1lLCBuYW1lX2xlbik7CisJfQorCisJcGFyYW1zID0gMiAvKiBsZXZlbCAqLyArIDQgLyogcmVzZXJ2ZWQgKi8gKyBuYW1lX2xlbiAvKiBpbmNsdWRlcyBOVUwgKi8gOworCXBTTUItPlRvdGFsRGF0YUNvdW50ID0gMDsKKwlwU01CLT5NYXhQYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KDIpOworCXBTTUItPk1heERhdGFDb3VudCA9IGNwdV90b19sZTE2KDQwMDApOwkvKiBCQiBmaW5kIGV4YWN0IG1heCBTTUIgUERVIGZyb20gc2VzcyBzdHJ1Y3R1cmUgQkIgKi8KKwlwU01CLT5NYXhTZXR1cENvdW50ID0gMDsKKwlwU01CLT5SZXNlcnZlZCA9IDA7CisJcFNNQi0+RmxhZ3MgPSAwOworCXBTTUItPlRpbWVvdXQgPSAwOworCXBTTUItPlJlc2VydmVkMiA9IDA7CisJcFNNQi0+UGFyYW1ldGVyT2Zmc2V0ID0gY3B1X3RvX2xlMTYob2Zmc2V0b2YoCisgICAgICAgIHN0cnVjdCBzbWJfY29tX3RyYW5zYWN0aW9uMl9xcGlfcmVxICxJbmZvcm1hdGlvbkxldmVsKSAtIDQpOworCXBTTUItPkRhdGFDb3VudCA9IDA7CisJcFNNQi0+RGF0YU9mZnNldCA9IDA7CisJcFNNQi0+U2V0dXBDb3VudCA9IDE7CisJcFNNQi0+UmVzZXJ2ZWQzID0gMDsKKwlwU01CLT5TdWJDb21tYW5kID0gY3B1X3RvX2xlMTYoVFJBTlMyX1FVRVJZX1BBVEhfSU5GT1JNQVRJT04pOworCWJ5dGVfY291bnQgPSBwYXJhbXMgKyAxIC8qIHBhZCAqLyA7CisJcFNNQi0+VG90YWxQYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KHBhcmFtcyk7CisJcFNNQi0+UGFyYW1ldGVyQ291bnQgPSBwU01CLT5Ub3RhbFBhcmFtZXRlckNvdW50OworCXBTTUItPkluZm9ybWF0aW9uTGV2ZWwgPSBjcHVfdG9fbGUxNihTTUJfUVVFUllfRklMRV9BTExfSU5GTyk7CisJcFNNQi0+UmVzZXJ2ZWQ0ID0gMDsKKwlwU01CLT5oZHIuc21iX2J1Zl9sZW5ndGggKz0gYnl0ZV9jb3VudDsKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihieXRlX2NvdW50KTsKKworCXJjID0gU2VuZFJlY2VpdmUoeGlkLCB0Y29uLT5zZXMsIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CLAorCQkJIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CciwgJmJ5dGVzX3JldHVybmVkLCAwKTsKKwlpZiAocmMpIHsKKwkJY0ZZSSgxLCAoIlNlbmQgZXJyb3IgaW4gUVBhdGhJbmZvID0gJWQiLCByYykpOworCX0gZWxzZSB7CQkvKiBkZWNvZGUgcmVzcG9uc2UgKi8KKwkJcmMgPSB2YWxpZGF0ZV90Migoc3RydWN0IHNtYl90Ml9yc3AgKilwU01Ccik7CisKKwkJaWYgKHJjIHx8IChwU01Cci0+Qnl0ZUNvdW50IDwgNDApKSAKKwkJCXJjID0gLUVJTzsJLyogYmFkIHNtYiAqLworCQllbHNlIGlmIChwRmluZERhdGEpeworCQkJX191MTYgZGF0YV9vZmZzZXQgPSBsZTE2X3RvX2NwdShwU01Cci0+dDIuRGF0YU9mZnNldCk7CisJCQltZW1jcHkoKGNoYXIgKikgcEZpbmREYXRhLAorCQkJICAgICAgIChjaGFyICopICZwU01Cci0+aGRyLlByb3RvY29sICsKKwkJCSAgICAgICBkYXRhX29mZnNldCwgc2l6ZW9mIChGSUxFX0FMTF9JTkZPKSk7CisJCX0gZWxzZQorCQkgICAgcmMgPSAtRU5PTUVNOworCX0KKwljaWZzX2J1Zl9yZWxlYXNlKHBTTUIpOworCWlmIChyYyA9PSAtRUFHQUlOKQorCQlnb3RvIFFQYXRoSW5mb1JldHJ5OworCisJcmV0dXJuIHJjOworfQorCitpbnQKK0NJRlNTTUJVbml4UVBhdGhJbmZvKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sCisJCSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc2VhcmNoTmFtZSwKKwkJICAgICBGSUxFX1VOSVhfQkFTSUNfSU5GTyAqIHBGaW5kRGF0YSwKKwkJICAgICBjb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpCit7CisvKiBTTUJfUVVFUllfRklMRV9VTklYX0JBU0lDICovCisJVFJBTlNBQ1RJT04yX1FQSV9SRVEgKnBTTUIgPSBOVUxMOworCVRSQU5TQUNUSU9OMl9RUElfUlNQICpwU01CciA9IE5VTEw7CisJaW50IHJjID0gMDsKKwlpbnQgYnl0ZXNfcmV0dXJuZWQgPSAwOworCWludCBuYW1lX2xlbjsKKwlfX3UxNiBwYXJhbXMsIGJ5dGVfY291bnQ7CisKKwljRllJKDEsICgiSW4gUVBhdGhJbmZvIChVbml4KSB0aGUgcGF0aCAlcyIsIHNlYXJjaE5hbWUpKTsKK1VuaXhRUGF0aEluZm9SZXRyeToKKwlyYyA9IHNtYl9pbml0KFNNQl9DT01fVFJBTlNBQ1RJT04yLCAxNSwgdGNvbiwgKHZvaWQgKiopICZwU01CLAorCQkgICAgICAodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmIChwU01CLT5oZHIuRmxhZ3MyICYgU01CRkxHMl9VTklDT0RFKSB7CisJCW5hbWVfbGVuID0KKwkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgcFNNQi0+RmlsZU5hbWUsIHNlYXJjaE5hbWUsIFBBVEhfTUFYCisJCQkJICAvKiBmaW5kIGRlZmluZSBmb3IgdGhpcyBtYXhwYXRoY29tcG9uZW50ICovCisJCQkJICAsIG5sc19jb2RlcGFnZSk7CisJCW5hbWVfbGVuKys7CS8qIHRyYWlsaW5nIG51bGwgKi8KKwkJbmFtZV9sZW4gKj0gMjsKKwl9IGVsc2UgewkJLyogQkIgaW1wcm92ZSB0aGUgY2hlY2sgZm9yIGJ1ZmZlciBvdmVycnVucyBCQiAqLworCQluYW1lX2xlbiA9IHN0cm5sZW4oc2VhcmNoTmFtZSwgUEFUSF9NQVgpOworCQluYW1lX2xlbisrOwkvKiB0cmFpbGluZyBudWxsICovCisJCXN0cm5jcHkocFNNQi0+RmlsZU5hbWUsIHNlYXJjaE5hbWUsIG5hbWVfbGVuKTsKKwl9CisKKwlwYXJhbXMgPSAyIC8qIGxldmVsICovICsgNCAvKiByZXNlcnZlZCAqLyArIG5hbWVfbGVuIC8qIGluY2x1ZGVzIE5VTCAqLyA7CisJcFNNQi0+VG90YWxEYXRhQ291bnQgPSAwOworCXBTTUItPk1heFBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYoMik7CisJLyogQkIgZmluZCBleGFjdCBtYXggU01CIFBEVSBmcm9tIHNlc3Mgc3RydWN0dXJlIEJCICovCisJcFNNQi0+TWF4RGF0YUNvdW50ID0gY3B1X3RvX2xlMTYoNDAwMCk7IAorCXBTTUItPk1heFNldHVwQ291bnQgPSAwOworCXBTTUItPlJlc2VydmVkID0gMDsKKwlwU01CLT5GbGFncyA9IDA7CisJcFNNQi0+VGltZW91dCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQyID0gMDsKKwlwU01CLT5QYXJhbWV0ZXJPZmZzZXQgPSBjcHVfdG9fbGUxNihvZmZzZXRvZigKKyAgICAgICAgc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3FwaV9yZXEgLEluZm9ybWF0aW9uTGV2ZWwpIC0gNCk7CisJcFNNQi0+RGF0YUNvdW50ID0gMDsKKwlwU01CLT5EYXRhT2Zmc2V0ID0gMDsKKwlwU01CLT5TZXR1cENvdW50ID0gMTsKKwlwU01CLT5SZXNlcnZlZDMgPSAwOworCXBTTUItPlN1YkNvbW1hbmQgPSBjcHVfdG9fbGUxNihUUkFOUzJfUVVFUllfUEFUSF9JTkZPUk1BVElPTik7CisJYnl0ZV9jb3VudCA9IHBhcmFtcyArIDEgLyogcGFkICovIDsKKwlwU01CLT5Ub3RhbFBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYocGFyYW1zKTsKKwlwU01CLT5QYXJhbWV0ZXJDb3VudCA9IHBTTUItPlRvdGFsUGFyYW1ldGVyQ291bnQ7CisJcFNNQi0+SW5mb3JtYXRpb25MZXZlbCA9IGNwdV90b19sZTE2KFNNQl9RVUVSWV9GSUxFX1VOSVhfQkFTSUMpOworCXBTTUItPlJlc2VydmVkNCA9IDA7CisJcFNNQi0+aGRyLnNtYl9idWZfbGVuZ3RoICs9IGJ5dGVfY291bnQ7CisJcFNNQi0+Qnl0ZUNvdW50ID0gY3B1X3RvX2xlMTYoYnl0ZV9jb3VudCk7CisKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKwkJCSAoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMCk7CisJaWYgKHJjKSB7CisJCWNGWUkoMSwgKCJTZW5kIGVycm9yIGluIFFQYXRoSW5mbyA9ICVkIiwgcmMpKTsKKwl9IGVsc2UgewkJLyogZGVjb2RlIHJlc3BvbnNlICovCisJCXJjID0gdmFsaWRhdGVfdDIoKHN0cnVjdCBzbWJfdDJfcnNwICopcFNNQnIpOworCisJCWlmIChyYyB8fCAocFNNQnItPkJ5dGVDb3VudCA8IHNpemVvZihGSUxFX1VOSVhfQkFTSUNfSU5GTykpKSB7CisJCQlyYyA9IC1FSU87CS8qIGJhZCBzbWIgKi8KKwkJfSBlbHNlIHsKKwkJCV9fdTE2IGRhdGFfb2Zmc2V0ID0gbGUxNl90b19jcHUocFNNQnItPnQyLkRhdGFPZmZzZXQpOworCQkJbWVtY3B5KChjaGFyICopIHBGaW5kRGF0YSwKKwkJCSAgICAgICAoY2hhciAqKSAmcFNNQnItPmhkci5Qcm90b2NvbCArCisJCQkgICAgICAgZGF0YV9vZmZzZXQsCisJCQkgICAgICAgc2l6ZW9mIChGSUxFX1VOSVhfQkFTSUNfSU5GTykpOworCQl9CisJfQorCWNpZnNfYnVmX3JlbGVhc2UocFNNQik7CisJaWYgKHJjID09IC1FQUdBSU4pCisJCWdvdG8gVW5peFFQYXRoSW5mb1JldHJ5OworCisJcmV0dXJuIHJjOworfQorCisjaWYgMCAgLyogZnVuY3Rpb24gdW51c2VkIGF0IHByZXNlbnQgKi8KK2ludCBDSUZTRmluZFNpbmdsZShjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCSAgICAgICBjb25zdCBjaGFyICpzZWFyY2hOYW1lLCBGSUxFX0FMTF9JTkZPICogZmluZERhdGEsCisJICAgICAgIGNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSkKK3sKKy8qIGxldmVsIDI1NyBTTUJfICovCisJVFJBTlNBQ1RJT04yX0ZGSVJTVF9SRVEgKnBTTUIgPSBOVUxMOworCVRSQU5TQUNUSU9OMl9GRklSU1RfUlNQICpwU01CciA9IE5VTEw7CisJaW50IHJjID0gMDsKKwlpbnQgYnl0ZXNfcmV0dXJuZWQ7CisJaW50IG5hbWVfbGVuOworCV9fdTE2IHBhcmFtcywgYnl0ZV9jb3VudDsKKworCWNGWUkoMSwgKCJJbiBGaW5kVW5pcXVlIikpOworZmluZFVuaXF1ZVJldHJ5OgorCXJjID0gc21iX2luaXQoU01CX0NPTV9UUkFOU0FDVElPTjIsIDE1LCB0Y29uLCAodm9pZCAqKikgJnBTTUIsCisJCSAgICAgICh2b2lkICoqKSAmcFNNQnIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJaWYgKHBTTUItPmhkci5GbGFnczIgJiBTTUJGTEcyX1VOSUNPREUpIHsKKwkJbmFtZV9sZW4gPQorCQkgICAgY2lmc19zdHJ0b1VDUygod2NoYXJfdCAqKSBwU01CLT5GaWxlTmFtZSwgc2VhcmNoTmFtZSwgUEFUSF9NQVgKKwkJCQkgIC8qIGZpbmQgZGVmaW5lIGZvciB0aGlzIG1heHBhdGhjb21wb25lbnQgKi8KKwkJCQkgICwgbmxzX2NvZGVwYWdlKTsKKwkJbmFtZV9sZW4rKzsJLyogdHJhaWxpbmcgbnVsbCAqLworCQluYW1lX2xlbiAqPSAyOworCX0gZWxzZSB7CQkvKiBCQiBpbXByb3ZlIHRoZSBjaGVjayBmb3IgYnVmZmVyIG92ZXJydW5zIEJCICovCisJCW5hbWVfbGVuID0gc3RybmxlbihzZWFyY2hOYW1lLCBQQVRIX01BWCk7CisJCW5hbWVfbGVuKys7CS8qIHRyYWlsaW5nIG51bGwgKi8KKwkJc3RybmNweShwU01CLT5GaWxlTmFtZSwgc2VhcmNoTmFtZSwgbmFtZV9sZW4pOworCX0KKworCXBhcmFtcyA9IDEyICsgbmFtZV9sZW4gLyogaW5jbHVkZXMgbnVsbCAqLyA7CisJcFNNQi0+VG90YWxEYXRhQ291bnQgPSAwOwkvKiBubyBFQXMgKi8KKwlwU01CLT5NYXhQYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KDIpOworCXBTTUItPk1heERhdGFDb3VudCA9IGNwdV90b19sZTE2KDQwMDApOwkvKiBCQiBmaW5kIGV4YWN0IG1heCBTTUIgUERVIGZyb20gc2VzcyBzdHJ1Y3R1cmUgQkIgKi8KKwlwU01CLT5NYXhTZXR1cENvdW50ID0gMDsKKwlwU01CLT5SZXNlcnZlZCA9IDA7CisJcFNNQi0+RmxhZ3MgPSAwOworCXBTTUItPlRpbWVvdXQgPSAwOworCXBTTUItPlJlc2VydmVkMiA9IDA7CisJcFNNQi0+UGFyYW1ldGVyT2Zmc2V0ID0gY3B1X3RvX2xlMTYoCisgICAgICAgICBvZmZzZXRvZihzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfZmZpcnN0X3JlcSxJbmZvcm1hdGlvbkxldmVsKSAtIDQpOworCXBTTUItPkRhdGFDb3VudCA9IDA7CisJcFNNQi0+RGF0YU9mZnNldCA9IDA7CisJcFNNQi0+U2V0dXBDb3VudCA9IDE7CS8qIG9uZSBieXRlLCBubyBuZWVkIHRvIGxlIGNvbnZlcnQgKi8KKwlwU01CLT5SZXNlcnZlZDMgPSAwOworCXBTTUItPlN1YkNvbW1hbmQgPSBjcHVfdG9fbGUxNihUUkFOUzJfRklORF9GSVJTVCk7CisJYnl0ZV9jb3VudCA9IHBhcmFtcyArIDEgLyogcGFkICovIDsKKwlwU01CLT5Ub3RhbFBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYocGFyYW1zKTsKKwlwU01CLT5QYXJhbWV0ZXJDb3VudCA9IHBTTUItPlRvdGFsUGFyYW1ldGVyQ291bnQ7CisJcFNNQi0+U2VhcmNoQXR0cmlidXRlcyA9CisJICAgIGNwdV90b19sZTE2KEFUVFJfUkVBRE9OTFkgfCBBVFRSX0hJRERFTiB8IEFUVFJfU1lTVEVNIHwKKwkJCUFUVFJfRElSRUNUT1JZKTsKKwlwU01CLT5TZWFyY2hDb3VudCA9IGNwdV90b19sZTE2KDE2KTsJLyogQkIgaW5jcmVhc2UgKi8KKwlwU01CLT5TZWFyY2hGbGFncyA9IGNwdV90b19sZTE2KDEpOworCXBTTUItPkluZm9ybWF0aW9uTGV2ZWwgPSBjcHVfdG9fbGUxNihTTUJfRklORF9GSUxFX0RJUkVDVE9SWV9JTkZPKTsKKwlwU01CLT5TZWFyY2hTdG9yYWdlVHlwZSA9IDA7CS8qIEJCIHdoYXQgc2hvdWxkIHdlIHNldCB0aGlzIHRvPyBCQiAqLworCXBTTUItPmhkci5zbWJfYnVmX2xlbmd0aCArPSBieXRlX2NvdW50OworCXBTTUItPkJ5dGVDb3VudCA9IGNwdV90b19sZTE2KGJ5dGVfY291bnQpOworCisJcmMgPSBTZW5kUmVjZWl2ZSh4aWQsIHRjb24tPnNlcywgKHN0cnVjdCBzbWJfaGRyICopIHBTTUIsCisJCQkgKHN0cnVjdCBzbWJfaGRyICopIHBTTUJyLCAmYnl0ZXNfcmV0dXJuZWQsIDApOworCisJaWYgKHJjKSB7CisJCWNGWUkoMSwgKCJTZW5kIGVycm9yIGluIEZpbmRGaWxlRGlySW5mbyA9ICVkIiwgcmMpKTsKKwl9IGVsc2UgewkJLyogZGVjb2RlIHJlc3BvbnNlICovCisKKwkJLyogQkIgZmlsbCBpbiAqLworCX0KKworCWNpZnNfYnVmX3JlbGVhc2UocFNNQik7CisJaWYgKHJjID09IC1FQUdBSU4pCisJCWdvdG8gZmluZFVuaXF1ZVJldHJ5OworCisJcmV0dXJuIHJjOworfQorI2VuZGlmIC8qIGVuZCB1bnVzZWQgKHRlbXBvcmFyaWx5KSBmdW5jdGlvbiAqLworCisvKiB4aWQsIHRjb24sIHNlYXJjaE5hbWUgYW5kIGNvZGVwYWdlIGFyZSBpbnB1dCBwYXJtcywgcmVzdCBhcmUgcmV0dXJuZWQgKi8KK2ludAorQ0lGU0ZpbmRGaXJzdChjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCSAgICAgIGNvbnN0IGNoYXIgKnNlYXJjaE5hbWUsIAorCSAgICAgIGNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSwKKwkgICAgICBfX3UxNiAqCXBuZXRmaWQsCisJICAgICAgc3RydWN0IGNpZnNfc2VhcmNoX2luZm8gKiBwc3JjaF9pbmYpCit7CisvKiBsZXZlbCAyNTcgU01CXyAqLworCVRSQU5TQUNUSU9OMl9GRklSU1RfUkVRICpwU01CID0gTlVMTDsKKwlUUkFOU0FDVElPTjJfRkZJUlNUX1JTUCAqcFNNQnIgPSBOVUxMOworCVQyX0ZGSVJTVF9SU1BfUEFSTVMgKiBwYXJtczsKKwlpbnQgcmMgPSAwOworCWludCBieXRlc19yZXR1cm5lZCA9IDA7CisJaW50IG5hbWVfbGVuOworCV9fdTE2IHBhcmFtcywgYnl0ZV9jb3VudDsKKworCWNGWUkoMSwgKCJJbiBGaW5kRmlyc3QiKSk7CisKK2ZpbmRGaXJzdFJldHJ5OgorCXJjID0gc21iX2luaXQoU01CX0NPTV9UUkFOU0FDVElPTjIsIDE1LCB0Y29uLCAodm9pZCAqKikgJnBTTUIsCisJCSAgICAgICh2b2lkICoqKSAmcFNNQnIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJaWYgKHBTTUItPmhkci5GbGFnczIgJiBTTUJGTEcyX1VOSUNPREUpIHsKKwkJbmFtZV9sZW4gPQorCQkgICAgY2lmc19zdHJ0b1VDUygod2NoYXJfdCAqKSBwU01CLT5GaWxlTmFtZSxzZWFyY2hOYW1lLAorCQkJCSBQQVRIX01BWCwgbmxzX2NvZGVwYWdlKTsKKwkJbmFtZV9sZW4rKzsJLyogdHJhaWxpbmcgbnVsbCAqLworCQluYW1lX2xlbiAqPSAyOworCQlwU01CLT5GaWxlTmFtZVtuYW1lX2xlbl0gPSAwOyAvKiBudWxsIHRlcm1pbmF0ZSBqdXN0IGluIGNhc2UgKi8KKwkJcFNNQi0+RmlsZU5hbWVbbmFtZV9sZW4rMV0gPSAwOworCX0gZWxzZSB7CS8qIEJCIGFkZCBjaGVjayBmb3Igb3ZlcnJ1biBvZiBTTUIgYnVmIEJCICovCisJCW5hbWVfbGVuID0gc3RybmxlbihzZWFyY2hOYW1lLCBQQVRIX01BWCk7CisJCW5hbWVfbGVuKys7CS8qIHRyYWlsaW5nIG51bGwgKi8KKy8qIEJCIGZpeCBoZXJlIGFuZCBpbiB1bmljb2RlIGNsYXVzZSBhYm92ZSBpZQorCQlpZihuYW1lX2xlbiA+IGJ1ZmZlcnNpemUtaGVhZGVyKQorCQkJZnJlZSBidWZmZXIgZXhpdDsgQkIgKi8KKwkJc3RybmNweShwU01CLT5GaWxlTmFtZSwgc2VhcmNoTmFtZSwgbmFtZV9sZW4pOworCQlwU01CLT5GaWxlTmFtZVtuYW1lX2xlbl0gPSAwOyAvKiBqdXN0IGluIGNhc2UgKi8KKwl9CisKKwlwYXJhbXMgPSAxMiArIG5hbWVfbGVuIC8qIGluY2x1ZGVzIG51bGwgKi8gOworCXBTTUItPlRvdGFsRGF0YUNvdW50ID0gMDsJLyogbm8gRUFzICovCisJcFNNQi0+TWF4UGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNigxMCk7CisJcFNNQi0+TWF4RGF0YUNvdW50ID0gY3B1X3RvX2xlMTYoKHRjb24tPnNlcy0+c2VydmVyLT5tYXhCdWYgLQorCQkJCQkgIE1BWF9DSUZTX0hEUl9TSVpFKSAmIDB4RkZGRkZGMDApOworCXBTTUItPk1heFNldHVwQ291bnQgPSAwOworCXBTTUItPlJlc2VydmVkID0gMDsKKwlwU01CLT5GbGFncyA9IDA7CisJcFNNQi0+VGltZW91dCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQyID0gMDsKKwlieXRlX2NvdW50ID0gcGFyYW1zICsgMSAvKiBwYWQgKi8gOworCXBTTUItPlRvdGFsUGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNihwYXJhbXMpOworCXBTTUItPlBhcmFtZXRlckNvdW50ID0gcFNNQi0+VG90YWxQYXJhbWV0ZXJDb3VudDsKKwlwU01CLT5QYXJhbWV0ZXJPZmZzZXQgPSBjcHVfdG9fbGUxNigKKwkgIG9mZnNldG9mKHN0cnVjdCBzbWJfY29tX3RyYW5zYWN0aW9uMl9mZmlyc3RfcmVxLCBTZWFyY2hBdHRyaWJ1dGVzKSAtIDQpOworCXBTTUItPkRhdGFDb3VudCA9IDA7CisJcFNNQi0+RGF0YU9mZnNldCA9IDA7CisJcFNNQi0+U2V0dXBDb3VudCA9IDE7CS8qIG9uZSBieXRlLCBubyBuZWVkIHRvIG1ha2UgZW5kaWFuIG5ldXRyYWwgKi8KKwlwU01CLT5SZXNlcnZlZDMgPSAwOworCXBTTUItPlN1YkNvbW1hbmQgPSBjcHVfdG9fbGUxNihUUkFOUzJfRklORF9GSVJTVCk7CisJcFNNQi0+U2VhcmNoQXR0cmlidXRlcyA9CisJICAgIGNwdV90b19sZTE2KEFUVFJfUkVBRE9OTFkgfCBBVFRSX0hJRERFTiB8IEFUVFJfU1lTVEVNIHwKKwkJCUFUVFJfRElSRUNUT1JZKTsKKwlwU01CLT5TZWFyY2hDb3VudD0gY3B1X3RvX2xlMTYoQ0lGU01heEJ1ZlNpemUvc2l6ZW9mKEZJTEVfVU5JWF9JTkZPKSk7CisJcFNNQi0+U2VhcmNoRmxhZ3MgPSBjcHVfdG9fbGUxNihDSUZTX1NFQVJDSF9DTE9TRV9BVF9FTkQgfCAKKwkJQ0lGU19TRUFSQ0hfUkVUVVJOX1JFU1VNRSk7CisJcFNNQi0+SW5mb3JtYXRpb25MZXZlbCA9IGNwdV90b19sZTE2KHBzcmNoX2luZi0+aW5mb19sZXZlbCk7CisKKwkvKiBCQiB3aGF0IHNob3VsZCB3ZSBzZXQgU3RvcmFnZVR5cGUgdG8/IERvZXMgaXQgbWF0dGVyPyBCQiAqLworCXBTTUItPlNlYXJjaFN0b3JhZ2VUeXBlID0gMDsKKwlwU01CLT5oZHIuc21iX2J1Zl9sZW5ndGggKz0gYnl0ZV9jb3VudDsKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihieXRlX2NvdW50KTsKKworCXJjID0gU2VuZFJlY2VpdmUoeGlkLCB0Y29uLT5zZXMsIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CLAorCQkJIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CciwgJmJ5dGVzX3JldHVybmVkLCAwKTsKKworCWlmIChyYykgey8qIEJCIGFkZCBsb2dpYyB0byByZXRyeSByZWd1bGFyIHNlYXJjaCBpZiBVbml4IHNlYXJjaCByZWplY3RlZCB1bmV4cGVjdGVkbHkgYnkgc2VydmVyICovCisJCS8qIEJCIEFkZCBjb2RlIHRvIGhhbmRsZSB1bnN1cHBvcnRlZCBsZXZlbCByYyAqLworCQljRllJKDEsICgiRXJyb3IgaW4gRmluZEZpcnN0ID0gJWQiLCByYykpOworCisJCWlmIChwU01CKQorCQkJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKworCQkvKiBCQiBldmVudHVhbGx5IGNvdWxkIG9wdGltaXplIG91dCBmcmVlIGFuZCByZWFsbG9jIG9mIGJ1ZiAqLworCQkvKiAgICBmb3IgdGhpcyBjYXNlICovCisJCWlmIChyYyA9PSAtRUFHQUlOKQorCQkJZ290byBmaW5kRmlyc3RSZXRyeTsKKwl9IGVsc2UgeyAvKiBkZWNvZGUgcmVzcG9uc2UgKi8KKwkJLyogQkIgcmVtZW1iZXIgdG8gZnJlZSBidWZmZXIgaWYgZXJyb3IgQkIgKi8KKwkJcmMgPSB2YWxpZGF0ZV90Migoc3RydWN0IHNtYl90Ml9yc3AgKilwU01Ccik7CisJCWlmKHJjID09IDApIHsKKwkJCWlmIChwU01Cci0+aGRyLkZsYWdzMiAmIFNNQkZMRzJfVU5JQ09ERSkKKwkJCQlwc3JjaF9pbmYtPnVuaWNvZGUgPSBUUlVFOworCQkJZWxzZQorCQkJCXBzcmNoX2luZi0+dW5pY29kZSA9IEZBTFNFOworCisJCQlwc3JjaF9pbmYtPm50d3JrX2J1Zl9zdGFydCA9IChjaGFyICopcFNNQnI7CisJCQlwc3JjaF9pbmYtPnNyY2hfZW50cmllc19zdGFydCA9IAorCQkJCShjaGFyICopICZwU01Cci0+aGRyLlByb3RvY29sICsgCisJCQkJCWxlMTZfdG9fY3B1KHBTTUJyLT50Mi5EYXRhT2Zmc2V0KTsKKworCQkJcGFybXMgPSAoVDJfRkZJUlNUX1JTUF9QQVJNUyAqKSgoY2hhciAqKSAmcFNNQnItPmhkci5Qcm90b2NvbCArCisJCQkgICAgICAgbGUxNl90b19jcHUocFNNQnItPnQyLlBhcmFtZXRlck9mZnNldCkpOworCisJCQlpZihwYXJtcy0+RW5kb2ZTZWFyY2gpCisJCQkJcHNyY2hfaW5mLT5lbmRPZlNlYXJjaCA9IFRSVUU7CisJCQllbHNlCisJCQkJcHNyY2hfaW5mLT5lbmRPZlNlYXJjaCA9IEZBTFNFOworCisJCQlwc3JjaF9pbmYtPmVudHJpZXNfaW5fYnVmZmVyICA9IGxlMTZfdG9fY3B1KHBhcm1zLT5TZWFyY2hDb3VudCk7CisJCQlwc3JjaF9pbmYtPmluZGV4X29mX2xhc3RfZW50cnkgPSAKKwkJCQlwc3JjaF9pbmYtPmVudHJpZXNfaW5fYnVmZmVyOworLypjRllJKDEsKCJlbnRyaWVzIGluIGJ1ZiAlZCBpbmRleF9vZl9sYXN0ICVkIixwc3JjaF9pbmYtPmVudHJpZXNfaW5fYnVmZmVyLHBzcmNoX2luZi0+aW5kZXhfb2ZfbGFzdF9lbnRyeSkpOyAgKi8KKwkJCSpwbmV0ZmlkID0gcGFybXMtPlNlYXJjaEhhbmRsZTsKKwkJfSBlbHNlIHsKKwkJCWNpZnNfYnVmX3JlbGVhc2UocFNNQik7CisJCX0KKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBDSUZTRmluZE5leHQoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKyAgICAgICAgICAgIF9fdTE2IHNlYXJjaEhhbmRsZSwgc3RydWN0IGNpZnNfc2VhcmNoX2luZm8gKiBwc3JjaF9pbmYpCit7CisJVFJBTlNBQ1RJT04yX0ZORVhUX1JFUSAqcFNNQiA9IE5VTEw7CisJVFJBTlNBQ1RJT04yX0ZORVhUX1JTUCAqcFNNQnIgPSBOVUxMOworCVQyX0ZORVhUX1JTUF9QQVJNUyAqIHBhcm1zOworCWNoYXIgKnJlc3BvbnNlX2RhdGE7CisJaW50IHJjID0gMDsKKwlpbnQgYnl0ZXNfcmV0dXJuZWQsIG5hbWVfbGVuOworCV9fdTE2IHBhcmFtcywgYnl0ZV9jb3VudDsKKworCWNGWUkoMSwgKCJJbiBGaW5kTmV4dCIpKTsKKworCWlmKHBzcmNoX2luZi0+ZW5kT2ZTZWFyY2ggPT0gVFJVRSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlyYyA9IHNtYl9pbml0KFNNQl9DT01fVFJBTlNBQ1RJT04yLCAxNSwgdGNvbiwgKHZvaWQgKiopICZwU01CLAorCQkodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXBhcmFtcyA9IDE0OyAgICAvKiBpbmNsdWRlcyAyIGJ5dGVzIG9mIG51bGwgc3RyaW5nLCBjb252ZXJ0ZWQgdG8gTEUgYmVsb3cgKi8KKwlieXRlX2NvdW50ID0gMDsKKwlwU01CLT5Ub3RhbERhdGFDb3VudCA9IDA7ICAgICAgIC8qIG5vIEVBcyAqLworCXBTTUItPk1heFBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYoOCk7CisJcFNNQi0+TWF4RGF0YUNvdW50ID0KKyAgICAgICAgICAgIGNwdV90b19sZTE2KCh0Y29uLT5zZXMtPnNlcnZlci0+bWF4QnVmIC0gTUFYX0NJRlNfSERSX1NJWkUpICYgMHhGRkZGRkYwMCk7CisJcFNNQi0+TWF4U2V0dXBDb3VudCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQgPSAwOworCXBTTUItPkZsYWdzID0gMDsKKwlwU01CLT5UaW1lb3V0ID0gMDsKKwlwU01CLT5SZXNlcnZlZDIgPSAwOworCXBTTUItPlBhcmFtZXRlck9mZnNldCA9ICBjcHVfdG9fbGUxNigKKwkgICAgICBvZmZzZXRvZihzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfZm5leHRfcmVxLFNlYXJjaEhhbmRsZSkgLSA0KTsKKwlwU01CLT5EYXRhQ291bnQgPSAwOworCXBTTUItPkRhdGFPZmZzZXQgPSAwOworCXBTTUItPlNldHVwQ291bnQgPSAxOworCXBTTUItPlJlc2VydmVkMyA9IDA7CisJcFNNQi0+U3ViQ29tbWFuZCA9IGNwdV90b19sZTE2KFRSQU5TMl9GSU5EX05FWFQpOworCXBTTUItPlNlYXJjaEhhbmRsZSA9IHNlYXJjaEhhbmRsZTsgICAgICAvKiBhbHdheXMga2VwdCBhcyBsZSAqLworCXBTTUItPlNlYXJjaENvdW50ID0KKwkJY3B1X3RvX2xlMTYoQ0lGU01heEJ1ZlNpemUgLyBzaXplb2YgKEZJTEVfVU5JWF9JTkZPKSk7CisJLyogdGVzdCBmb3IgVW5peCBleHRlbnNpb25zICovCisvKglpZiAodGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkgeworCQlwU01CLT5JbmZvcm1hdGlvbkxldmVsID0gY3B1X3RvX2xlMTYoU01CX0ZJTkRfRklMRV9VTklYKTsKKwkJcHNyY2hfaW5mLT5pbmZvX2xldmVsID0gU01CX0ZJTkRfRklMRV9VTklYOworCX0gZWxzZSB7CisJCXBTTUItPkluZm9ybWF0aW9uTGV2ZWwgPQorCQkgICBjcHVfdG9fbGUxNihTTUJfRklORF9GSUxFX0RJUkVDVE9SWV9JTkZPKTsKKwkJcHNyY2hfaW5mLT5pbmZvX2xldmVsID0gU01CX0ZJTkRfRklMRV9ESVJFQ1RPUllfSU5GTzsKKwl9ICovCisJcFNNQi0+SW5mb3JtYXRpb25MZXZlbCA9IGNwdV90b19sZTE2KHBzcmNoX2luZi0+aW5mb19sZXZlbCk7CisJcFNNQi0+UmVzdW1lS2V5ID0gcHNyY2hfaW5mLT5yZXN1bWVfa2V5OworCXBTTUItPlNlYXJjaEZsYWdzID0KKwkgICAgICBjcHVfdG9fbGUxNihDSUZTX1NFQVJDSF9DTE9TRV9BVF9FTkQgfCBDSUZTX1NFQVJDSF9SRVRVUk5fUkVTVU1FKTsKKworCW5hbWVfbGVuID0gcHNyY2hfaW5mLT5yZXN1bWVfbmFtZV9sZW47CisJcGFyYW1zICs9IG5hbWVfbGVuOworCWlmKG5hbWVfbGVuIDwgUEFUSF9NQVgpIHsKKwkJbWVtY3B5KHBTTUItPlJlc3VtZUZpbGVOYW1lLCBwc3JjaF9pbmYtPnByZXN1bWVfbmFtZSwgbmFtZV9sZW4pOworCQlieXRlX2NvdW50ICs9IG5hbWVfbGVuOworCX0gZWxzZSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBGTmV4dDJfZXJyX2V4aXQ7CisJfQorCWJ5dGVfY291bnQgPSBwYXJhbXMgKyAxIC8qIHBhZCAqLyA7CisJcFNNQi0+VG90YWxQYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KHBhcmFtcyk7CisJcFNNQi0+UGFyYW1ldGVyQ291bnQgPSBwU01CLT5Ub3RhbFBhcmFtZXRlckNvdW50OworCXBTTUItPmhkci5zbWJfYnVmX2xlbmd0aCArPSBieXRlX2NvdW50OworCXBTTUItPkJ5dGVDb3VudCA9IGNwdV90b19sZTE2KGJ5dGVfY291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCXJjID0gU2VuZFJlY2VpdmUoeGlkLCB0Y29uLT5zZXMsIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CLAorCQkJKHN0cnVjdCBzbWJfaGRyICopIHBTTUJyLCAmYnl0ZXNfcmV0dXJuZWQsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCWlmIChyYykgeworCQlpZiAocmMgPT0gLUVCQURGKSB7CisJCQlwc3JjaF9pbmYtPmVuZE9mU2VhcmNoID0gVFJVRTsKKwkJCXJjID0gMDsgLyogc2VhcmNoIHByb2JhYmx5IHdhcyBjbG9zZWQgYXQgZW5kIG9mIHNlYXJjaCBhYm92ZSAqLworCQl9IGVsc2UKKwkJCWNGWUkoMSwgKCJGaW5kTmV4dCByZXR1cm5lZCA9ICVkIiwgcmMpKTsKKwl9IGVsc2UgeyAgICAgICAgICAgICAgICAvKiBkZWNvZGUgcmVzcG9uc2UgKi8KKwkJcmMgPSB2YWxpZGF0ZV90Migoc3RydWN0IHNtYl90Ml9yc3AgKilwU01Ccik7CisJCQorCQlpZihyYyA9PSAwKSB7CisJCQkvKiBCQiBmaXhtZSBhZGQgbG9jayBmb3IgZmlsZSAoc3JjaF9pbmZvKSBzdHJ1Y3QgaGVyZSAqLworCQkJaWYgKHBTTUJyLT5oZHIuRmxhZ3MyICYgU01CRkxHMl9VTklDT0RFKQorCQkJCXBzcmNoX2luZi0+dW5pY29kZSA9IFRSVUU7CisJCQllbHNlCisJCQkJcHNyY2hfaW5mLT51bmljb2RlID0gRkFMU0U7CisJCQlyZXNwb25zZV9kYXRhID0gKGNoYXIgKikgJnBTTUJyLT5oZHIuUHJvdG9jb2wgKworCQkJICAgICAgIGxlMTZfdG9fY3B1KHBTTUJyLT50Mi5QYXJhbWV0ZXJPZmZzZXQpOworCQkJcGFybXMgPSAoVDJfRk5FWFRfUlNQX1BBUk1TICopcmVzcG9uc2VfZGF0YTsKKwkJCXJlc3BvbnNlX2RhdGEgPSAoY2hhciAqKSZwU01Cci0+aGRyLlByb3RvY29sICsKKwkJCQlsZTE2X3RvX2NwdShwU01Cci0+dDIuRGF0YU9mZnNldCk7CisJCQljaWZzX2J1Zl9yZWxlYXNlKHBzcmNoX2luZi0+bnR3cmtfYnVmX3N0YXJ0KTsKKwkJCXBzcmNoX2luZi0+c3JjaF9lbnRyaWVzX3N0YXJ0ID0gcmVzcG9uc2VfZGF0YTsKKwkJCXBzcmNoX2luZi0+bnR3cmtfYnVmX3N0YXJ0ID0gKGNoYXIgKilwU01COworCQkJaWYocGFybXMtPkVuZG9mU2VhcmNoKQorCQkJCXBzcmNoX2luZi0+ZW5kT2ZTZWFyY2ggPSBUUlVFOworCQkJZWxzZQorCQkJCXBzcmNoX2luZi0+ZW5kT2ZTZWFyY2ggPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCXBzcmNoX2luZi0+ZW50cmllc19pbl9idWZmZXIgID0gbGUxNl90b19jcHUocGFybXMtPlNlYXJjaENvdW50KTsKKwkJCXBzcmNoX2luZi0+aW5kZXhfb2ZfbGFzdF9lbnRyeSArPQorCQkJCXBzcmNoX2luZi0+ZW50cmllc19pbl9idWZmZXI7CisvKiAgY0ZZSSgxLCgiZm54dDIgZW50cmllcyBpbiBidWYgJWQgaW5kZXhfb2ZfbGFzdCAlZCIscHNyY2hfaW5mLT5lbnRyaWVzX2luX2J1ZmZlcixwc3JjaF9pbmYtPmluZGV4X29mX2xhc3RfZW50cnkpKTsgKi8KKworCQkJLyogQkIgZml4bWUgYWRkIHVubG9jayBoZXJlICovCisJCX0KKworCX0KKworCS8qIEJCIE9uIGVycm9yLCBzaG91bGQgd2UgbGVhdmUgcHJldmlvdXMgc2VhcmNoIGJ1ZiAoYW5kIGNvdW50IGFuZAorCWxhc3QgZW50cnkgZmllbGRzKSBpbnRhY3Qgb3IgZnJlZSB0aGUgcHJldmlvdXMgb25lPyAqLworCisJLyogTm90ZTogT24gLUVBR0FJTiBlcnJvciBvbmx5IGNhbGxlciBjYW4gcmV0cnkgb24gaGFuZGxlIGJhc2VkIGNhbGxzCisJc2luY2UgZmlsZSBoYW5kbGUgcGFzc2VkIGluIG5vIGxvbmdlciB2YWxpZCAqLworRk5leHQyX2Vycl9leGl0OgorCWlmIChyYyAhPSAwKQorCQljaWZzX2J1Zl9yZWxlYXNlKHBTTUIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCXJldHVybiByYzsKK30KKworaW50CitDSUZTRmluZENsb3NlKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sIGNvbnN0IF9fdTE2IHNlYXJjaEhhbmRsZSkKK3sKKwlpbnQgcmMgPSAwOworCUZJTkRDTE9TRV9SRVEgKnBTTUIgPSBOVUxMOworCUNMT1NFX1JTUCAqcFNNQnIgPSBOVUxMOyAvKiBCQiByZW1vdmVtZSBCQiAqLworCWludCBieXRlc19yZXR1cm5lZDsKKworCWNGWUkoMSwgKCJJbiBDSUZTU01CRmluZENsb3NlIikpOworCXJjID0gc21hbGxfc21iX2luaXQoU01CX0NPTV9GSU5EX0NMT1NFMiwgMSwgdGNvbiwgKHZvaWQgKiopJnBTTUIpOworCisJLyogbm8gc2Vuc2UgcmV0dXJuaW5nIGVycm9yIGlmIHNlc3Npb24gcmVzdGFydGVkCisJCWFzIGZpbGUgaGFuZGxlIGhhcyBiZWVuIGNsb3NlZCAqLworCWlmKHJjID09IC1FQUdBSU4pCisJCXJldHVybiAwOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcFNNQnIgPSAoQ0xPU0VfUlNQICopcFNNQjsgIC8qIEJCIHJlbW92ZW1lIEJCICovCisJcFNNQi0+RmlsZUlEID0gc2VhcmNoSGFuZGxlOworCXBTTUItPkJ5dGVDb3VudCA9IDA7CisJcmMgPSBTZW5kUmVjZWl2ZSh4aWQsIHRjb24tPnNlcywgKHN0cnVjdCBzbWJfaGRyICopIHBTTUIsCisJCQkgKHN0cnVjdCBzbWJfaGRyICopIHBTTUJyLCAmYnl0ZXNfcmV0dXJuZWQsIDApOworCWlmIChyYykgeworCQljRVJST1IoMSwgKCJTZW5kIGVycm9yIGluIEZpbmRDbG9zZSA9ICVkIiwgcmMpKTsKKwl9CisJY2lmc19zbWFsbF9idWZfcmVsZWFzZShwU01CKTsKKworCS8qIFNpbmNlIHNlc3Npb24gaXMgZGVhZCwgc2VhcmNoIGhhbmRsZSBjbG9zZWQgb24gc2VydmVyIGFscmVhZHkgKi8KKwlpZiAocmMgPT0gLUVBR0FJTikKKwkJcmMgPSAwOworCisJcmV0dXJuIHJjOworfQorCisjaWZkZWYgQ09ORklHX0NJRlNfRVhQRVJJTUVOVEFMCitpbnQKK0NJRlNHZXRTcnZJbm9kZU51bWJlcihjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNlYXJjaE5hbWUsCisgICAgICAgICAgICAgICAgX191NjQgKiBpbm9kZV9udW1iZXIsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworCWludCByYyA9IDA7CisJVFJBTlNBQ1RJT04yX1FQSV9SRVEgKnBTTUIgPSBOVUxMOworCVRSQU5TQUNUSU9OMl9RUElfUlNQICpwU01CciA9IE5VTEw7CisJaW50IG5hbWVfbGVuLCBieXRlc19yZXR1cm5lZDsKKwlfX3UxNiBwYXJhbXMsIGJ5dGVfY291bnQ7CisKKwljRllJKDEsKCJJbiBHZXRTcnZJbm9kZU51bSBmb3IgJXMiLHNlYXJjaE5hbWUpKTsKKwlpZih0Y29uID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOyAKKworR2V0SW5vZGVOdW1iZXJSZXRyeToKKwlyYyA9IHNtYl9pbml0KFNNQl9DT01fVFJBTlNBQ1RJT04yLCAxNSwgdGNvbiwgKHZvaWQgKiopICZwU01CLAorICAgICAgICAgICAgICAgICAgICAgICh2b2lkICoqKSAmcFNNQnIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisKKwlpZiAocFNNQi0+aGRyLkZsYWdzMiAmIFNNQkZMRzJfVU5JQ09ERSkgeworCQluYW1lX2xlbiA9CisJCQljaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIHBTTUItPkZpbGVOYW1lLCBzZWFyY2hOYW1lLCAKKwkJCQlQQVRIX01BWCxubHNfY29kZXBhZ2UpOworCQluYW1lX2xlbisrOyAgICAgLyogdHJhaWxpbmcgbnVsbCAqLworCQluYW1lX2xlbiAqPSAyOworCX0gZWxzZSB7ICAgICAgICAgICAgICAgIC8qIEJCIGltcHJvdmUgdGhlIGNoZWNrIGZvciBidWZmZXIgb3ZlcnJ1bnMgQkIgKi8KKwkJbmFtZV9sZW4gPSBzdHJubGVuKHNlYXJjaE5hbWUsIFBBVEhfTUFYKTsKKwkJbmFtZV9sZW4rKzsgICAgIC8qIHRyYWlsaW5nIG51bGwgKi8KKwkJc3RybmNweShwU01CLT5GaWxlTmFtZSwgc2VhcmNoTmFtZSwgbmFtZV9sZW4pOworCX0KKworCXBhcmFtcyA9IDIgLyogbGV2ZWwgKi8gICsgNCAvKiByc3J2ZCAqLyAgKyBuYW1lX2xlbiAvKiBpbmNsIG51bGwgKi8gOworCXBTTUItPlRvdGFsRGF0YUNvdW50ID0gMDsKKwlwU01CLT5NYXhQYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KDIpOworCS8qIEJCIGZpbmQgZXhhY3QgbWF4IGRhdGEgY291bnQgYmVsb3cgZnJvbSBzZXNzIHN0cnVjdHVyZSBCQiAqLworCXBTTUItPk1heERhdGFDb3VudCA9IGNwdV90b19sZTE2KDQwMDApOworCXBTTUItPk1heFNldHVwQ291bnQgPSAwOworCXBTTUItPlJlc2VydmVkID0gMDsKKwlwU01CLT5GbGFncyA9IDA7CisJcFNNQi0+VGltZW91dCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQyID0gMDsKKwlwU01CLT5QYXJhbWV0ZXJPZmZzZXQgPSBjcHVfdG9fbGUxNihvZmZzZXRvZigKKwkJc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3FwaV9yZXEgLEluZm9ybWF0aW9uTGV2ZWwpIC0gNCk7CisJcFNNQi0+RGF0YUNvdW50ID0gMDsKKwlwU01CLT5EYXRhT2Zmc2V0ID0gMDsKKwlwU01CLT5TZXR1cENvdW50ID0gMTsKKwlwU01CLT5SZXNlcnZlZDMgPSAwOworCXBTTUItPlN1YkNvbW1hbmQgPSBjcHVfdG9fbGUxNihUUkFOUzJfUVVFUllfUEFUSF9JTkZPUk1BVElPTik7CisJYnl0ZV9jb3VudCA9IHBhcmFtcyArIDEgLyogcGFkICovIDsKKwlwU01CLT5Ub3RhbFBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYocGFyYW1zKTsKKwlwU01CLT5QYXJhbWV0ZXJDb3VudCA9IHBTTUItPlRvdGFsUGFyYW1ldGVyQ291bnQ7CisJcFNNQi0+SW5mb3JtYXRpb25MZXZlbCA9IGNwdV90b19sZTE2KFNNQl9RVUVSWV9GSUxFX0lOVEVSTkFMX0lORk8pOworCXBTTUItPlJlc2VydmVkNCA9IDA7CisJcFNNQi0+aGRyLnNtYl9idWZfbGVuZ3RoICs9IGJ5dGVfY291bnQ7CisJcFNNQi0+Qnl0ZUNvdW50ID0gY3B1X3RvX2xlMTYoYnl0ZV9jb3VudCk7CisKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKwkJKHN0cnVjdCBzbWJfaGRyICopIHBTTUJyLCAmYnl0ZXNfcmV0dXJuZWQsIDApOworCWlmIChyYykgeworCQljRllJKDEsICgiZXJyb3IgJWQgaW4gUXVlcnlJbnRlcm5hbEluZm8iLCByYykpOworCX0gZWxzZSB7CisJCS8qIGRlY29kZSByZXNwb25zZSAqLworCQlyYyA9IHZhbGlkYXRlX3QyKChzdHJ1Y3Qgc21iX3QyX3JzcCAqKXBTTUJyKTsKKwkJaWYgKHJjIHx8IChwU01Cci0+Qnl0ZUNvdW50IDwgMikpCisJCS8qIEJCIGFsc28gY2hlY2sgZW5vdWdoIHRvdGFsIGJ5dGVzIHJldHVybmVkICovCisJCQkvKiBJZiByYyBzaG91bGQgd2UgY2hlY2sgZm9yIEVPUE5PU1VQUCBhbmQKKwkJCWRpc2FibGUgdGhlIHNydmlubyBmbGFnPyBvciBpbiBjYWxsZXI/ICovCisJCQlyYyA9IC1FSU87ICAgICAgLyogYmFkIHNtYiAqLworICAgICAgICAgICAgICAgIGVsc2UgeworCQkJX191MTYgZGF0YV9vZmZzZXQgPSBsZTE2X3RvX2NwdShwU01Cci0+dDIuRGF0YU9mZnNldCk7CisJCQlfX3UxNiBjb3VudCA9IGxlMTZfdG9fY3B1KHBTTUJyLT50Mi5EYXRhQ291bnQpOworCQkJc3RydWN0IGZpbGVfaW50ZXJuYWxfaW5mbyAqIHBmaW5mbzsKKwkJCS8qIEJCIERvIHdlIG5lZWQgYSBjYXN0IG9yIGhhc2ggaGVyZSA/ICovCisJCQlpZihjb3VudCA8IDgpIHsKKwkJCQljRllJKDEsICgiSWxsZWdhbCBzaXplIHJldCBpbiBRcnlJbnRybmxJbmYiKSk7CisJCQkJcmMgPSAtRUlPOworCQkJCWdvdG8gR2V0SW5vZGVOdW1PdXQ7CisJCQl9CisJCQlwZmluZm8gPSAoc3RydWN0IGZpbGVfaW50ZXJuYWxfaW5mbyAqKQorCQkJCShkYXRhX29mZnNldCArIChjaGFyICopICZwU01Cci0+aGRyLlByb3RvY29sKTsKKwkJCSppbm9kZV9udW1iZXIgPSBwZmluZm8tPlVuaXF1ZUlkOworCQl9CisJfQorR2V0SW5vZGVOdW1PdXQ6CisJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKwlpZiAocmMgPT0gLUVBR0FJTikKKwkJZ290byBHZXRJbm9kZU51bWJlclJldHJ5OworCXJldHVybiByYzsKK30KKyNlbmRpZiAvKiBDSUZTX0VYUEVSSU1FTlRBTCAqLworCitpbnQKK0NJRlNHZXRERlNSZWZlcihjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Nlc0luZm8gKnNlcywKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqc2VhcmNoTmFtZSwKKwkJdW5zaWduZWQgY2hhciAqKnRhcmdldFVOQ3MsCisJCXVuc2lnbmVkIGludCAqbnVtYmVyX29mX1VOQ19pbl9hcnJheSwKKwkJY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworLyogVFJBTlMyX0dFVF9ERlNfUkVGRVJSQUwgKi8KKwlUUkFOU0FDVElPTjJfR0VUX0RGU19SRUZFUl9SRVEgKnBTTUIgPSBOVUxMOworCVRSQU5TQUNUSU9OMl9HRVRfREZTX1JFRkVSX1JTUCAqcFNNQnIgPSBOVUxMOworCXN0cnVjdCBkZnNfcmVmZXJyYWxfbGV2ZWxfMyAqIHJlZmVycmFscyA9IE5VTEw7CisJaW50IHJjID0gMDsKKwlpbnQgYnl0ZXNfcmV0dXJuZWQ7CisJaW50IG5hbWVfbGVuOworCXVuc2lnbmVkIGludCBpOworCWNoYXIgKiB0ZW1wOworCV9fdTE2IHBhcmFtcywgYnl0ZV9jb3VudDsKKwkqbnVtYmVyX29mX1VOQ19pbl9hcnJheSA9IDA7CisJKnRhcmdldFVOQ3MgPSBOVUxMOworCisJY0ZZSSgxLCAoIkluIEdldERGU1JlZmVyIHRoZSBwYXRoICVzIiwgc2VhcmNoTmFtZSkpOworCWlmIChzZXMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CitnZXRERlNSZXRyeToKKwlyYyA9IHNtYl9pbml0KFNNQl9DT01fVFJBTlNBQ1RJT04yLCAxNSwgTlVMTCwgKHZvaWQgKiopICZwU01CLAorCQkgICAgICAodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXBTTUItPmhkci5UaWQgPSBzZXMtPmlwY190aWQ7CisJcFNNQi0+aGRyLlVpZCA9IHNlcy0+U3VpZDsKKwlpZiAoc2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfU1RBVFVTMzIpIHsKKwkJcFNNQi0+aGRyLkZsYWdzMiB8PSBTTUJGTEcyX0VSUl9TVEFUVVM7CisJfQorCWlmIChzZXMtPmNhcGFiaWxpdGllcyAmIENBUF9ERlMpIHsKKwkJcFNNQi0+aGRyLkZsYWdzMiB8PSBTTUJGTEcyX0RGUzsKKwl9CisKKwlpZiAoc2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JQ09ERSkgeworCQlwU01CLT5oZHIuRmxhZ3MyIHw9IFNNQkZMRzJfVU5JQ09ERTsKKwkJbmFtZV9sZW4gPQorCQkgICAgY2lmc19zdHJ0b1VDUygod2NoYXJfdCAqKSBwU01CLT5SZXF1ZXN0RmlsZU5hbWUsCisJCQkJICBzZWFyY2hOYW1lLCBQQVRIX01BWAorCQkJCSAgLyogZmluZCBkZWZpbmUgZm9yIHRoaXMgbWF4cGF0aGNvbXBvbmVudCAqLworCQkJCSAgLCBubHNfY29kZXBhZ2UpOworCQluYW1lX2xlbisrOwkvKiB0cmFpbGluZyBudWxsICovCisJCW5hbWVfbGVuICo9IDI7CisJfSBlbHNlIHsJCS8qIEJCIGltcHJvdmUgdGhlIGNoZWNrIGZvciBidWZmZXIgb3ZlcnJ1bnMgQkIgKi8KKwkJbmFtZV9sZW4gPSBzdHJubGVuKHNlYXJjaE5hbWUsIFBBVEhfTUFYKTsKKwkJbmFtZV9sZW4rKzsJLyogdHJhaWxpbmcgbnVsbCAqLworCQlzdHJuY3B5KHBTTUItPlJlcXVlc3RGaWxlTmFtZSwgc2VhcmNoTmFtZSwgbmFtZV9sZW4pOworCX0KKworCXBhcmFtcyA9IDIgLyogbGV2ZWwgKi8gICsgbmFtZV9sZW4gLyppbmNsdWRlcyBudWxsICovIDsKKwlwU01CLT5Ub3RhbERhdGFDb3VudCA9IDA7CisJcFNNQi0+RGF0YUNvdW50ID0gMDsKKwlwU01CLT5EYXRhT2Zmc2V0ID0gMDsKKwlwU01CLT5NYXhQYXJhbWV0ZXJDb3VudCA9IDA7CisJcFNNQi0+TWF4RGF0YUNvdW50ID0gY3B1X3RvX2xlMTYoNDAwMCk7CS8qIEJCIGZpbmQgZXhhY3QgbWF4IFNNQiBQRFUgZnJvbSBzZXNzIHN0cnVjdHVyZSBCQiAqLworCXBTTUItPk1heFNldHVwQ291bnQgPSAwOworCXBTTUItPlJlc2VydmVkID0gMDsKKwlwU01CLT5GbGFncyA9IDA7CisJcFNNQi0+VGltZW91dCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQyID0gMDsKKwlwU01CLT5QYXJhbWV0ZXJPZmZzZXQgPSBjcHVfdG9fbGUxNihvZmZzZXRvZigKKyAgICAgICAgc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX2dldF9kZnNfcmVmZXJfcmVxLCBNYXhSZWZlcnJhbExldmVsKSAtIDQpOworCXBTTUItPlNldHVwQ291bnQgPSAxOworCXBTTUItPlJlc2VydmVkMyA9IDA7CisJcFNNQi0+U3ViQ29tbWFuZCA9IGNwdV90b19sZTE2KFRSQU5TMl9HRVRfREZTX1JFRkVSUkFMKTsKKwlieXRlX2NvdW50ID0gcGFyYW1zICsgMyAvKiBwYWQgKi8gOworCXBTTUItPlBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYocGFyYW1zKTsKKwlwU01CLT5Ub3RhbFBhcmFtZXRlckNvdW50ID0gcFNNQi0+UGFyYW1ldGVyQ291bnQ7CisJcFNNQi0+TWF4UmVmZXJyYWxMZXZlbCA9IGNwdV90b19sZTE2KDMpOworCXBTTUItPmhkci5zbWJfYnVmX2xlbmd0aCArPSBieXRlX2NvdW50OworCXBTTUItPkJ5dGVDb3VudCA9IGNwdV90b19sZTE2KGJ5dGVfY291bnQpOworCisJcmMgPSBTZW5kUmVjZWl2ZSh4aWQsIHNlcywgKHN0cnVjdCBzbWJfaGRyICopIHBTTUIsCisJCQkgKHN0cnVjdCBzbWJfaGRyICopIHBTTUJyLCAmYnl0ZXNfcmV0dXJuZWQsIDApOworCWlmIChyYykgeworCQljRllJKDEsICgiU2VuZCBlcnJvciBpbiBHZXRERlNSZWZlciA9ICVkIiwgcmMpKTsKKwl9IGVsc2UgewkJLyogZGVjb2RlIHJlc3BvbnNlICovCisvKiBCQiBBZGQgbG9naWMgdG8gcGFyc2UgcmVmZXJyYWxzIGhlcmUgKi8KKwkJcmMgPSB2YWxpZGF0ZV90Migoc3RydWN0IHNtYl90Ml9yc3AgKilwU01Ccik7CisKKwkJaWYgKHJjIHx8IChwU01Cci0+Qnl0ZUNvdW50IDwgMTcpKSAgICAgIC8qIEJCIGFsc28gY2hlY2sgZW5vdWdoIHRvdGFsIGJ5dGVzIHJldHVybmVkICovCisJCQlyYyA9IC1FSU87ICAgICAgLyogYmFkIHNtYiAqLworCQllbHNlIHsKKwkJCV9fdTE2IGRhdGFfb2Zmc2V0ID0gbGUxNl90b19jcHUocFNNQnItPnQyLkRhdGFPZmZzZXQpOyAKKwkJCV9fdTE2IGRhdGFfY291bnQgPSBsZTE2X3RvX2NwdShwU01Cci0+dDIuRGF0YUNvdW50KTsKKworCQkJY0ZZSSgxLAorCQkJICAgICAoIkRlY29kaW5nIEdldERGU1JlZmVyIHJlc3BvbnNlLiAgQkNDOiAlZCAgT2Zmc2V0ICVkIiwKKwkJCSAgICAgIHBTTUJyLT5CeXRlQ291bnQsIGRhdGFfb2Zmc2V0KSk7CisJCQlyZWZlcnJhbHMgPSAKKwkJCSAgICAoc3RydWN0IGRmc19yZWZlcnJhbF9sZXZlbF8zICopIAorCQkJCQkoOCAvKiBzaXplb2Ygc3RhcnQgb2YgZGF0YSBibG9jayAqLyArCisJCQkJCWRhdGFfb2Zmc2V0ICsKKwkJCQkJKGNoYXIgKikgJnBTTUJyLT5oZHIuUHJvdG9jb2wpOyAKKwkJCWNGWUkoMSwoIm51bV9yZWZlcnJhbHM6ICVkIGRmcyBmbGFnczogMHgleCAuLi4gXG5mb3IgcmVmZXJyYWwgb25lIHJlZmVyIHNpemU6IDB4JXggc3J2IHR5cGU6IDB4JXggcmVmZXIgZmxhZ3M6IDB4JXggdHRsOiAweCV4IiwKKwkJCQlsZTE2X3RvX2NwdShwU01Cci0+TnVtYmVyT2ZSZWZlcnJhbHMpLGxlMTZfdG9fY3B1KHBTTUJyLT5ERlNGbGFncyksIGxlMTZfdG9fY3B1KHJlZmVycmFscy0+UmVmZXJyYWxTaXplKSxsZTE2X3RvX2NwdShyZWZlcnJhbHMtPlNlcnZlclR5cGUpLGxlMTZfdG9fY3B1KHJlZmVycmFscy0+UmVmZXJyYWxGbGFncyksbGUxNl90b19jcHUocmVmZXJyYWxzLT5UaW1lVG9MaXZlKSkpOworCQkJLyogQkIgVGhpcyBmaWVsZCBpcyBhY3R1YWxseSB0d28gYnl0ZXMgaW4gZnJvbSBzdGFydCBvZgorCQkJICAgZGF0YSBibG9jayBzbyB3ZSBjb3VsZCBkbyBzYWZldHkgY2hlY2sgdGhhdCBEYXRhQmxvY2sKKwkJCSAgIGJlZ2lucyBhdCBhZGRyZXNzIG9mIHBTTUJyLT5OdW1iZXJPZlJlZmVycmFscyAqLworCQkJKm51bWJlcl9vZl9VTkNfaW5fYXJyYXkgPSBsZTE2X3RvX2NwdShwU01Cci0+TnVtYmVyT2ZSZWZlcnJhbHMpOworCisJCQkvKiBCQiBGaXggYmVsb3cgc28gY2FuIHJldHVybiBtb3JlIHRoYW4gb25lIHJlZmVycmFsICovCisJCQlpZigqbnVtYmVyX29mX1VOQ19pbl9hcnJheSA+IDEpCisJCQkJKm51bWJlcl9vZl9VTkNfaW5fYXJyYXkgPSAxOworCisJCQkvKiBnZXQgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5ncyBkZXNjcmliaW5nIHJlZnMgKi8KKwkJCW5hbWVfbGVuID0gMDsKKwkJCWZvcihpPTA7aTwqbnVtYmVyX29mX1VOQ19pbl9hcnJheTtpKyspIHsKKwkJCQkvKiBtYWtlIHN1cmUgdGhhdCBEZnNQYXRoT2Zmc2V0IG5vdCBwYXN0IGVuZCAqLworCQkJCV9fdTE2IG9mZnNldCA9IGxlMTZfdG9fY3B1KHJlZmVycmFscy0+RGZzUGF0aE9mZnNldCk7CisJCQkJaWYgKG9mZnNldCA+IGRhdGFfY291bnQpIHsKKwkJCQkJLyogaWYgaW52YWxpZCByZWZlcnJhbCwgc3RvcCBoZXJlIGFuZCBkbyAKKwkJCQkJbm90IHRyeSB0byBjb3B5IGFueSBtb3JlICovCisJCQkJCSpudW1iZXJfb2ZfVU5DX2luX2FycmF5ID0gaTsKKwkJCQkJYnJlYWs7CisJCQkJfSAKKwkJCQl0ZW1wID0gKChjaGFyICopcmVmZXJyYWxzKSArIG9mZnNldDsKKworCQkJCWlmIChwU01Cci0+aGRyLkZsYWdzMiAmIFNNQkZMRzJfVU5JQ09ERSkgeworCQkJCQluYW1lX2xlbiArPSBVbmlTdHJubGVuKCh3Y2hhcl90ICopdGVtcCxkYXRhX2NvdW50KTsKKwkJCQl9IGVsc2UgeworCQkJCQluYW1lX2xlbiArPSBzdHJubGVuKHRlbXAsZGF0YV9jb3VudCk7CisJCQkJfQorCQkJCXJlZmVycmFscysrOworCQkJCS8qIEJCIGFkZCBjaGVjayB0aGF0IHJlZmVycmFsIHBvaW50ZXIgZG9lcyBub3QgZmFsbCBvZmYgZW5kIFBEVSAqLworCQkJCQorCQkJfQorCQkJLyogQkIgYWRkIGNoZWNrIGZvciBuYW1lX2xlbiBiaWdnZXIgdGhhbiBiY2MgKi8KKwkJCSp0YXJnZXRVTkNzID0gCisJCQkJa21hbGxvYyhuYW1lX2xlbisxKyAoKm51bWJlcl9vZl9VTkNfaW5fYXJyYXkpLEdGUF9LRVJORUwpOworCQkJaWYoKnRhcmdldFVOQ3MgPT0gTlVMTCkgeworCQkJCXJjID0gLUVOT01FTTsKKwkJCQlnb3RvIEdldERGU1JlZkV4aXQ7CisJCQl9CisJCQkvKiBjb3B5IHRoZSByZWYgc3RyaW5ncyAqLworCQkJcmVmZXJyYWxzID0gIAorCQkJICAgIChzdHJ1Y3QgZGZzX3JlZmVycmFsX2xldmVsXzMgKikgCisJCQkJCSg4IC8qIHNpemVvZiBkYXRhIGhkciAqLyArCisJCQkJCWRhdGFfb2Zmc2V0ICsgCisJCQkJCShjaGFyICopICZwU01Cci0+aGRyLlByb3RvY29sKTsKKworCQkJZm9yKGk9MDtpPCpudW1iZXJfb2ZfVU5DX2luX2FycmF5O2krKykgeworCQkJCXRlbXAgPSAoKGNoYXIgKilyZWZlcnJhbHMpICsgbGUxNl90b19jcHUocmVmZXJyYWxzLT5EZnNQYXRoT2Zmc2V0KTsKKwkJCQlpZiAocFNNQnItPmhkci5GbGFnczIgJiBTTUJGTEcyX1VOSUNPREUpIHsKKwkJCQkJY2lmc19zdHJmcm9tVUNTX2xlKCp0YXJnZXRVTkNzLAorCQkJCQkJKHdjaGFyX3QgKikgdGVtcCwgbmFtZV9sZW4sIG5sc19jb2RlcGFnZSk7CisJCQkJfSBlbHNlIHsKKwkJCQkJc3RybmNweSgqdGFyZ2V0VU5Dcyx0ZW1wLG5hbWVfbGVuKTsKKwkJCQl9CisJCQkJLyogIEJCIHVwZGF0ZSB0YXJnZXRfdW5jcyBwb2ludGVycyAqLworCQkJCXJlZmVycmFscysrOworCQkJfQorCQkJdGVtcCA9ICp0YXJnZXRVTkNzOworCQkJdGVtcFtuYW1lX2xlbl0gPSAwOworCQl9CisKKwl9CitHZXRERlNSZWZFeGl0OgorCWlmIChwU01CKQorCQljaWZzX2J1Zl9yZWxlYXNlKHBTTUIpOworCisJaWYgKHJjID09IC1FQUdBSU4pCisJCWdvdG8gZ2V0REZTUmV0cnk7CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludAorQ0lGU1NNQlFGU0luZm8oY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkgICAgICAgc3RydWN0IGtzdGF0ZnMgKkZTRGF0YSwgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworLyogbGV2ZWwgMHgxMDMgU01CX1FVRVJZX0ZJTEVfU1lTVEVNX0lORk8gKi8KKwlUUkFOU0FDVElPTjJfUUZTSV9SRVEgKnBTTUIgPSBOVUxMOworCVRSQU5TQUNUSU9OMl9RRlNJX1JTUCAqcFNNQnIgPSBOVUxMOworCUZJTEVfU1lTVEVNX0lORk8gKnJlc3BvbnNlX2RhdGE7CisJaW50IHJjID0gMDsKKwlpbnQgYnl0ZXNfcmV0dXJuZWQgPSAwOworCV9fdTE2IHBhcmFtcywgYnl0ZV9jb3VudDsKKworCWNGWUkoMSwgKCJJbiBRRlNJbmZvIikpOworUUZTSW5mb1JldHJ5OgorCXJjID0gc21iX2luaXQoU01CX0NPTV9UUkFOU0FDVElPTjIsIDE1LCB0Y29uLCAodm9pZCAqKikgJnBTTUIsCisJCSAgICAgICh2b2lkICoqKSAmcFNNQnIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcGFyYW1zID0gMjsJLyogbGV2ZWwgKi8KKwlwU01CLT5Ub3RhbERhdGFDb3VudCA9IDA7CisJcFNNQi0+TWF4UGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNigyKTsKKwlwU01CLT5NYXhEYXRhQ291bnQgPSBjcHVfdG9fbGUxNigxMDAwKTsJLyogQkIgZmluZCBleGFjdCBtYXggU01CIFBEVSBmcm9tIHNlc3Mgc3RydWN0dXJlIEJCICovCisJcFNNQi0+TWF4U2V0dXBDb3VudCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQgPSAwOworCXBTTUItPkZsYWdzID0gMDsKKwlwU01CLT5UaW1lb3V0ID0gMDsKKwlwU01CLT5SZXNlcnZlZDIgPSAwOworCWJ5dGVfY291bnQgPSBwYXJhbXMgKyAxIC8qIHBhZCAqLyA7CisJcFNNQi0+VG90YWxQYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KHBhcmFtcyk7CisJcFNNQi0+UGFyYW1ldGVyQ291bnQgPSBwU01CLT5Ub3RhbFBhcmFtZXRlckNvdW50OworCXBTTUItPlBhcmFtZXRlck9mZnNldCA9IGNwdV90b19sZTE2KG9mZnNldG9mKAorICAgICAgICBzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfcWZzaV9yZXEsIEluZm9ybWF0aW9uTGV2ZWwpIC0gNCk7CisJcFNNQi0+RGF0YUNvdW50ID0gMDsKKwlwU01CLT5EYXRhT2Zmc2V0ID0gMDsKKwlwU01CLT5TZXR1cENvdW50ID0gMTsKKwlwU01CLT5SZXNlcnZlZDMgPSAwOworCXBTTUItPlN1YkNvbW1hbmQgPSBjcHVfdG9fbGUxNihUUkFOUzJfUVVFUllfRlNfSU5GT1JNQVRJT04pOworCXBTTUItPkluZm9ybWF0aW9uTGV2ZWwgPSBjcHVfdG9fbGUxNihTTUJfUVVFUllfRlNfU0laRV9JTkZPKTsKKwlwU01CLT5oZHIuc21iX2J1Zl9sZW5ndGggKz0gYnl0ZV9jb3VudDsKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihieXRlX2NvdW50KTsKKworCXJjID0gU2VuZFJlY2VpdmUoeGlkLCB0Y29uLT5zZXMsIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CLAorCQkJIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CciwgJmJ5dGVzX3JldHVybmVkLCAwKTsKKwlpZiAocmMpIHsKKwkJY0VSUk9SKDEsICgiU2VuZCBlcnJvciBpbiBRRlNJbmZvID0gJWQiLCByYykpOworCX0gZWxzZSB7CQkvKiBkZWNvZGUgcmVzcG9uc2UgKi8KKyAgICAgICAgICAgICAgICByYyA9IHZhbGlkYXRlX3QyKChzdHJ1Y3Qgc21iX3QyX3JzcCAqKXBTTUJyKTsKKworCQlpZiAocmMgfHwgKHBTTUJyLT5CeXRlQ291bnQgPCAyNCkpIC8qIEJCIGFsc08gQ0hFY2sgZW5vdWdoIHRvdGFsIGJ5dGVzIHJldHVybmVkICovCisJCQlyYyA9IC1FSU87CS8qIGJhZCBzbWIgKi8KKwkJZWxzZSB7CisJCQlfX3UxNiBkYXRhX29mZnNldCA9IGxlMTZfdG9fY3B1KHBTTUJyLT50Mi5EYXRhT2Zmc2V0KTsKKwkJCWNGWUkoMSwKKwkJCQkoIkRlY29kaW5nIHFmc2luZm8gcmVzcG9uc2UuICBCQ0M6ICVkICBPZmZzZXQgJWQiLAorCQkJCXBTTUJyLT5CeXRlQ291bnQsIGRhdGFfb2Zmc2V0KSk7CisKKwkJCXJlc3BvbnNlX2RhdGEgPQorCQkJICAgIChGSUxFX1NZU1RFTV9JTkZPCisJCQkgICAgICopICgoKGNoYXIgKikgJnBTTUJyLT5oZHIuUHJvdG9jb2wpICsKKwkJCQkgZGF0YV9vZmZzZXQpOworCQkJRlNEYXRhLT5mX2JzaXplID0KKwkJCSAgICBsZTMyX3RvX2NwdShyZXNwb25zZV9kYXRhLT5CeXRlc1BlclNlY3RvcikgKgorCQkJICAgIGxlMzJfdG9fY3B1KHJlc3BvbnNlX2RhdGEtPgorCQkJCQlTZWN0b3JzUGVyQWxsb2NhdGlvblVuaXQpOworCQkJRlNEYXRhLT5mX2Jsb2NrcyA9CisJCQkgICAgbGU2NF90b19jcHUocmVzcG9uc2VfZGF0YS0+VG90YWxBbGxvY2F0aW9uVW5pdHMpOworCQkJRlNEYXRhLT5mX2JmcmVlID0gRlNEYXRhLT5mX2JhdmFpbCA9CisJCQkgICAgbGU2NF90b19jcHUocmVzcG9uc2VfZGF0YS0+RnJlZUFsbG9jYXRpb25Vbml0cyk7CisJCQljRllJKDEsCisJCQkgICAgICgiQmxvY2tzOiAlbGxkICBGcmVlOiAlbGxkIEJsb2NrIHNpemUgJWxkIiwKKwkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpRlNEYXRhLT5mX2Jsb2NrcywKKwkJCSAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpRlNEYXRhLT5mX2JmcmVlLAorCQkJICAgICAgRlNEYXRhLT5mX2JzaXplKSk7CisJCX0KKwl9CisJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKworCWlmIChyYyA9PSAtRUFHQUlOKQorCQlnb3RvIFFGU0luZm9SZXRyeTsKKworCXJldHVybiByYzsKK30KKworaW50CitDSUZTU01CUUZTQXR0cmlidXRlSW5mbyhjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCQkJY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworLyogbGV2ZWwgMHgxMDUgIFNNQl9RVUVSWV9GSUxFX1NZU1RFTV9JTkZPICovCisJVFJBTlNBQ1RJT04yX1FGU0lfUkVRICpwU01CID0gTlVMTDsKKwlUUkFOU0FDVElPTjJfUUZTSV9SU1AgKnBTTUJyID0gTlVMTDsKKwlGSUxFX1NZU1RFTV9BVFRSSUJVVEVfSU5GTyAqcmVzcG9uc2VfZGF0YTsKKwlpbnQgcmMgPSAwOworCWludCBieXRlc19yZXR1cm5lZCA9IDA7CisJX191MTYgcGFyYW1zLCBieXRlX2NvdW50OworCisJY0ZZSSgxLCAoIkluIFFGU0F0dHJpYnV0ZUluZm8iKSk7CitRRlNBdHRyaWJ1dGVSZXRyeToKKwlyYyA9IHNtYl9pbml0KFNNQl9DT01fVFJBTlNBQ1RJT04yLCAxNSwgdGNvbiwgKHZvaWQgKiopICZwU01CLAorCQkgICAgICAodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXBhcmFtcyA9IDI7CS8qIGxldmVsICovCisJcFNNQi0+VG90YWxEYXRhQ291bnQgPSAwOworCXBTTUItPk1heFBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYoMik7CisJcFNNQi0+TWF4RGF0YUNvdW50ID0gY3B1X3RvX2xlMTYoMTAwMCk7CS8qIEJCIGZpbmQgZXhhY3QgbWF4IFNNQiBQRFUgZnJvbSBzZXNzIHN0cnVjdHVyZSBCQiAqLworCXBTTUItPk1heFNldHVwQ291bnQgPSAwOworCXBTTUItPlJlc2VydmVkID0gMDsKKwlwU01CLT5GbGFncyA9IDA7CisJcFNNQi0+VGltZW91dCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQyID0gMDsKKwlieXRlX2NvdW50ID0gcGFyYW1zICsgMSAvKiBwYWQgKi8gOworCXBTTUItPlRvdGFsUGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNihwYXJhbXMpOworCXBTTUItPlBhcmFtZXRlckNvdW50ID0gcFNNQi0+VG90YWxQYXJhbWV0ZXJDb3VudDsKKwlwU01CLT5QYXJhbWV0ZXJPZmZzZXQgPSBjcHVfdG9fbGUxNihvZmZzZXRvZigKKyAgICAgICAgc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3Fmc2lfcmVxLCBJbmZvcm1hdGlvbkxldmVsKSAtIDQpOworCXBTTUItPkRhdGFDb3VudCA9IDA7CisJcFNNQi0+RGF0YU9mZnNldCA9IDA7CisJcFNNQi0+U2V0dXBDb3VudCA9IDE7CisJcFNNQi0+UmVzZXJ2ZWQzID0gMDsKKwlwU01CLT5TdWJDb21tYW5kID0gY3B1X3RvX2xlMTYoVFJBTlMyX1FVRVJZX0ZTX0lORk9STUFUSU9OKTsKKwlwU01CLT5JbmZvcm1hdGlvbkxldmVsID0gY3B1X3RvX2xlMTYoU01CX1FVRVJZX0ZTX0FUVFJJQlVURV9JTkZPKTsKKwlwU01CLT5oZHIuc21iX2J1Zl9sZW5ndGggKz0gYnl0ZV9jb3VudDsKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihieXRlX2NvdW50KTsKKworCXJjID0gU2VuZFJlY2VpdmUoeGlkLCB0Y29uLT5zZXMsIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CLAorCQkJIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CciwgJmJ5dGVzX3JldHVybmVkLCAwKTsKKwlpZiAocmMpIHsKKwkJY0VSUk9SKDEsICgiU2VuZCBlcnJvciBpbiBRRlNBdHRyaWJ1dGVJbmZvID0gJWQiLCByYykpOworCX0gZWxzZSB7CQkvKiBkZWNvZGUgcmVzcG9uc2UgKi8KKwkJcmMgPSB2YWxpZGF0ZV90Migoc3RydWN0IHNtYl90Ml9yc3AgKilwU01Ccik7CisKKwkJaWYgKHJjIHx8IChwU01Cci0+Qnl0ZUNvdW50IDwgMTMpKSB7CS8qIEJCIGFsc28gY2hlY2sgZW5vdWdoIGJ5dGVzIHJldHVybmVkICovCisJCQlyYyA9IC1FSU87CS8qIGJhZCBzbWIgKi8KKwkJfSBlbHNlIHsKKwkJCV9fdTE2IGRhdGFfb2Zmc2V0ID0gbGUxNl90b19jcHUocFNNQnItPnQyLkRhdGFPZmZzZXQpOworCQkJcmVzcG9uc2VfZGF0YSA9CisJCQkgICAgKEZJTEVfU1lTVEVNX0FUVFJJQlVURV9JTkZPCisJCQkgICAgICopICgoKGNoYXIgKikgJnBTTUJyLT5oZHIuUHJvdG9jb2wpICsKKwkJCQkgZGF0YV9vZmZzZXQpOworCQkJbWVtY3B5KCZ0Y29uLT5mc0F0dHJJbmZvLCByZXNwb25zZV9kYXRhLAorCQkJICAgICAgIHNpemVvZiAoRklMRV9TWVNURU1fQVRUUklCVVRFX0lORk8pKTsKKwkJfQorCX0KKwljaWZzX2J1Zl9yZWxlYXNlKHBTTUIpOworCisJaWYgKHJjID09IC1FQUdBSU4pCisJCWdvdG8gUUZTQXR0cmlidXRlUmV0cnk7CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludAorQ0lGU1NNQlFGU0RldmljZUluZm8oY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJICAgICBjb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpCit7CisvKiBsZXZlbCAweDEwNCBTTUJfUVVFUllfRklMRV9TWVNURU1fSU5GTyAqLworCVRSQU5TQUNUSU9OMl9RRlNJX1JFUSAqcFNNQiA9IE5VTEw7CisJVFJBTlNBQ1RJT04yX1FGU0lfUlNQICpwU01CciA9IE5VTEw7CisJRklMRV9TWVNURU1fREVWSUNFX0lORk8gKnJlc3BvbnNlX2RhdGE7CisJaW50IHJjID0gMDsKKwlpbnQgYnl0ZXNfcmV0dXJuZWQgPSAwOworCV9fdTE2IHBhcmFtcywgYnl0ZV9jb3VudDsKKworCWNGWUkoMSwgKCJJbiBRRlNEZXZpY2VJbmZvIikpOworUUZTRGV2aWNlUmV0cnk6CisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX1RSQU5TQUNUSU9OMiwgMTUsIHRjb24sICh2b2lkICoqKSAmcFNNQiwKKwkJICAgICAgKHZvaWQgKiopICZwU01Ccik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlwYXJhbXMgPSAyOwkvKiBsZXZlbCAqLworCXBTTUItPlRvdGFsRGF0YUNvdW50ID0gMDsKKwlwU01CLT5NYXhQYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KDIpOworCXBTTUItPk1heERhdGFDb3VudCA9IGNwdV90b19sZTE2KDEwMDApOwkvKiBCQiBmaW5kIGV4YWN0IG1heCBTTUIgUERVIGZyb20gc2VzcyBzdHJ1Y3R1cmUgQkIgKi8KKwlwU01CLT5NYXhTZXR1cENvdW50ID0gMDsKKwlwU01CLT5SZXNlcnZlZCA9IDA7CisJcFNNQi0+RmxhZ3MgPSAwOworCXBTTUItPlRpbWVvdXQgPSAwOworCXBTTUItPlJlc2VydmVkMiA9IDA7CisJYnl0ZV9jb3VudCA9IHBhcmFtcyArIDEgLyogcGFkICovIDsKKwlwU01CLT5Ub3RhbFBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYocGFyYW1zKTsKKwlwU01CLT5QYXJhbWV0ZXJDb3VudCA9IHBTTUItPlRvdGFsUGFyYW1ldGVyQ291bnQ7CisJcFNNQi0+UGFyYW1ldGVyT2Zmc2V0ID0gY3B1X3RvX2xlMTYob2Zmc2V0b2YoCisgICAgICAgIHN0cnVjdCBzbWJfY29tX3RyYW5zYWN0aW9uMl9xZnNpX3JlcSwgSW5mb3JtYXRpb25MZXZlbCkgLSA0KTsKKworCXBTTUItPkRhdGFDb3VudCA9IDA7CisJcFNNQi0+RGF0YU9mZnNldCA9IDA7CisJcFNNQi0+U2V0dXBDb3VudCA9IDE7CisJcFNNQi0+UmVzZXJ2ZWQzID0gMDsKKwlwU01CLT5TdWJDb21tYW5kID0gY3B1X3RvX2xlMTYoVFJBTlMyX1FVRVJZX0ZTX0lORk9STUFUSU9OKTsKKwlwU01CLT5JbmZvcm1hdGlvbkxldmVsID0gY3B1X3RvX2xlMTYoU01CX1FVRVJZX0ZTX0RFVklDRV9JTkZPKTsKKwlwU01CLT5oZHIuc21iX2J1Zl9sZW5ndGggKz0gYnl0ZV9jb3VudDsKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihieXRlX2NvdW50KTsKKworCXJjID0gU2VuZFJlY2VpdmUoeGlkLCB0Y29uLT5zZXMsIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CLAorCQkJIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CciwgJmJ5dGVzX3JldHVybmVkLCAwKTsKKwlpZiAocmMpIHsKKwkJY0ZZSSgxLCAoIlNlbmQgZXJyb3IgaW4gUUZTRGV2aWNlSW5mbyA9ICVkIiwgcmMpKTsKKwl9IGVsc2UgewkJLyogZGVjb2RlIHJlc3BvbnNlICovCisJCXJjID0gdmFsaWRhdGVfdDIoKHN0cnVjdCBzbWJfdDJfcnNwICopcFNNQnIpOworCisJCWlmIChyYyB8fCAocFNNQnItPkJ5dGVDb3VudCA8IHNpemVvZiAoRklMRV9TWVNURU1fREVWSUNFX0lORk8pKSkKKwkJCXJjID0gLUVJTzsJLyogYmFkIHNtYiAqLworCQllbHNlIHsKKwkJCV9fdTE2IGRhdGFfb2Zmc2V0ID0gbGUxNl90b19jcHUocFNNQnItPnQyLkRhdGFPZmZzZXQpOworCQkJcmVzcG9uc2VfZGF0YSA9CisJCQkgICAgKEZJTEVfU1lTVEVNX0RFVklDRV9JTkZPCisJCQkgICAgICopICgoKGNoYXIgKikgJnBTTUJyLT5oZHIuUHJvdG9jb2wpICsKKwkJCQkgZGF0YV9vZmZzZXQpOworCQkJbWVtY3B5KCZ0Y29uLT5mc0RldkluZm8sIHJlc3BvbnNlX2RhdGEsCisJCQkgICAgICAgc2l6ZW9mIChGSUxFX1NZU1RFTV9ERVZJQ0VfSU5GTykpOworCQl9CisJfQorCWNpZnNfYnVmX3JlbGVhc2UocFNNQik7CisKKwlpZiAocmMgPT0gLUVBR0FJTikKKwkJZ290byBRRlNEZXZpY2VSZXRyeTsKKworCXJldHVybiByYzsKK30KKworaW50CitDSUZTU01CUUZTVW5peEluZm8oY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwKKwkJICAgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworLyogbGV2ZWwgMHgyMDAgIFNNQl9RVUVSWV9DSUZTX1VOSVhfSU5GTyAqLworCVRSQU5TQUNUSU9OMl9RRlNJX1JFUSAqcFNNQiA9IE5VTEw7CisJVFJBTlNBQ1RJT04yX1FGU0lfUlNQICpwU01CciA9IE5VTEw7CisJRklMRV9TWVNURU1fVU5JWF9JTkZPICpyZXNwb25zZV9kYXRhOworCWludCByYyA9IDA7CisJaW50IGJ5dGVzX3JldHVybmVkID0gMDsKKwlfX3UxNiBwYXJhbXMsIGJ5dGVfY291bnQ7CisKKwljRllJKDEsICgiSW4gUUZTVW5peEluZm8iKSk7CitRRlNVbml4UmV0cnk6CisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX1RSQU5TQUNUSU9OMiwgMTUsIHRjb24sICh2b2lkICoqKSAmcFNNQiwKKwkJICAgICAgKHZvaWQgKiopICZwU01Ccik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlwYXJhbXMgPSAyOwkvKiBsZXZlbCAqLworCXBTTUItPlRvdGFsRGF0YUNvdW50ID0gMDsKKwlwU01CLT5EYXRhQ291bnQgPSAwOworCXBTTUItPkRhdGFPZmZzZXQgPSAwOworCXBTTUItPk1heFBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYoMik7CisJcFNNQi0+TWF4RGF0YUNvdW50ID0gY3B1X3RvX2xlMTYoMTAwKTsJLyogQkIgZmluZCBleGFjdCBtYXggU01CIFBEVSBmcm9tIHNlc3Mgc3RydWN0dXJlIEJCICovCisJcFNNQi0+TWF4U2V0dXBDb3VudCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQgPSAwOworCXBTTUItPkZsYWdzID0gMDsKKwlwU01CLT5UaW1lb3V0ID0gMDsKKwlwU01CLT5SZXNlcnZlZDIgPSAwOworCWJ5dGVfY291bnQgPSBwYXJhbXMgKyAxIC8qIHBhZCAqLyA7CisJcFNNQi0+UGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNihwYXJhbXMpOworCXBTTUItPlRvdGFsUGFyYW1ldGVyQ291bnQgPSBwU01CLT5QYXJhbWV0ZXJDb3VudDsKKwlwU01CLT5QYXJhbWV0ZXJPZmZzZXQgPSBjcHVfdG9fbGUxNihvZmZzZXRvZihzdHJ1Y3QgCisgICAgICAgIHNtYl9jb21fdHJhbnNhY3Rpb24yX3Fmc2lfcmVxLCBJbmZvcm1hdGlvbkxldmVsKSAtIDQpOworCXBTTUItPlNldHVwQ291bnQgPSAxOworCXBTTUItPlJlc2VydmVkMyA9IDA7CisJcFNNQi0+U3ViQ29tbWFuZCA9IGNwdV90b19sZTE2KFRSQU5TMl9RVUVSWV9GU19JTkZPUk1BVElPTik7CisJcFNNQi0+SW5mb3JtYXRpb25MZXZlbCA9IGNwdV90b19sZTE2KFNNQl9RVUVSWV9DSUZTX1VOSVhfSU5GTyk7CisJcFNNQi0+aGRyLnNtYl9idWZfbGVuZ3RoICs9IGJ5dGVfY291bnQ7CisJcFNNQi0+Qnl0ZUNvdW50ID0gY3B1X3RvX2xlMTYoYnl0ZV9jb3VudCk7CisKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKwkJCSAoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMCk7CisJaWYgKHJjKSB7CisJCWNFUlJPUigxLCAoIlNlbmQgZXJyb3IgaW4gUUZTVW5peEluZm8gPSAlZCIsIHJjKSk7CisJfSBlbHNlIHsJCS8qIGRlY29kZSByZXNwb25zZSAqLworCQlyYyA9IHZhbGlkYXRlX3QyKChzdHJ1Y3Qgc21iX3QyX3JzcCAqKXBTTUJyKTsKKworCQlpZiAocmMgfHwgKHBTTUJyLT5CeXRlQ291bnQgPCAxMykpIHsKKwkJCXJjID0gLUVJTzsJLyogYmFkIHNtYiAqLworCQl9IGVsc2UgeworCQkJX191MTYgZGF0YV9vZmZzZXQgPSBsZTE2X3RvX2NwdShwU01Cci0+dDIuRGF0YU9mZnNldCk7CisJCQlyZXNwb25zZV9kYXRhID0KKwkJCSAgICAoRklMRV9TWVNURU1fVU5JWF9JTkZPCisJCQkgICAgICopICgoKGNoYXIgKikgJnBTTUJyLT5oZHIuUHJvdG9jb2wpICsKKwkJCQkgZGF0YV9vZmZzZXQpOworCQkJbWVtY3B5KCZ0Y29uLT5mc1VuaXhJbmZvLCByZXNwb25zZV9kYXRhLAorCQkJICAgICAgIHNpemVvZiAoRklMRV9TWVNURU1fVU5JWF9JTkZPKSk7CisJCX0KKwl9CisJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKworCWlmIChyYyA9PSAtRUFHQUlOKQorCQlnb3RvIFFGU1VuaXhSZXRyeTsKKworCisJcmV0dXJuIHJjOworfQorCisKK2ludAorQ0lGU1NNQlFGU1Bvc2l4SW5mbyhjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCQkgICBzdHJ1Y3Qga3N0YXRmcyAqRlNEYXRhLCBjb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpCit7CisvKiBsZXZlbCAweDIwMSAgU01CX1FVRVJZX0NJRlNfUE9TSVhfSU5GTyAqLworCVRSQU5TQUNUSU9OMl9RRlNJX1JFUSAqcFNNQiA9IE5VTEw7CisJVFJBTlNBQ1RJT04yX1FGU0lfUlNQICpwU01CciA9IE5VTEw7CisJRklMRV9TWVNURU1fUE9TSVhfSU5GTyAqcmVzcG9uc2VfZGF0YTsKKwlpbnQgcmMgPSAwOworCWludCBieXRlc19yZXR1cm5lZCA9IDA7CisJX191MTYgcGFyYW1zLCBieXRlX2NvdW50OworCisJY0ZZSSgxLCAoIkluIFFGU1Bvc2l4SW5mbyIpKTsKK1FGU1Bvc2l4UmV0cnk6CisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX1RSQU5TQUNUSU9OMiwgMTUsIHRjb24sICh2b2lkICoqKSAmcFNNQiwKKwkJICAgICAgKHZvaWQgKiopICZwU01Ccik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlwYXJhbXMgPSAyOwkvKiBsZXZlbCAqLworCXBTTUItPlRvdGFsRGF0YUNvdW50ID0gMDsKKwlwU01CLT5EYXRhQ291bnQgPSAwOworCXBTTUItPkRhdGFPZmZzZXQgPSAwOworCXBTTUItPk1heFBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYoMik7CisJcFNNQi0+TWF4RGF0YUNvdW50ID0gY3B1X3RvX2xlMTYoMTAwKTsJLyogQkIgZmluZCBleGFjdCBtYXggU01CIFBEVSBmcm9tIHNlc3Mgc3RydWN0dXJlIEJCICovCisJcFNNQi0+TWF4U2V0dXBDb3VudCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQgPSAwOworCXBTTUItPkZsYWdzID0gMDsKKwlwU01CLT5UaW1lb3V0ID0gMDsKKwlwU01CLT5SZXNlcnZlZDIgPSAwOworCWJ5dGVfY291bnQgPSBwYXJhbXMgKyAxIC8qIHBhZCAqLyA7CisJcFNNQi0+UGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNihwYXJhbXMpOworCXBTTUItPlRvdGFsUGFyYW1ldGVyQ291bnQgPSBwU01CLT5QYXJhbWV0ZXJDb3VudDsKKwlwU01CLT5QYXJhbWV0ZXJPZmZzZXQgPSBjcHVfdG9fbGUxNihvZmZzZXRvZihzdHJ1Y3QgCisgICAgICAgIHNtYl9jb21fdHJhbnNhY3Rpb24yX3Fmc2lfcmVxLCBJbmZvcm1hdGlvbkxldmVsKSAtIDQpOworCXBTTUItPlNldHVwQ291bnQgPSAxOworCXBTTUItPlJlc2VydmVkMyA9IDA7CisJcFNNQi0+U3ViQ29tbWFuZCA9IGNwdV90b19sZTE2KFRSQU5TMl9RVUVSWV9GU19JTkZPUk1BVElPTik7CisJcFNNQi0+SW5mb3JtYXRpb25MZXZlbCA9IGNwdV90b19sZTE2KFNNQl9RVUVSWV9QT1NJWF9GU19JTkZPKTsKKwlwU01CLT5oZHIuc21iX2J1Zl9sZW5ndGggKz0gYnl0ZV9jb3VudDsKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihieXRlX2NvdW50KTsKKworCXJjID0gU2VuZFJlY2VpdmUoeGlkLCB0Y29uLT5zZXMsIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CLAorCQkJIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CciwgJmJ5dGVzX3JldHVybmVkLCAwKTsKKwlpZiAocmMpIHsKKwkJY0ZZSSgxLCAoIlNlbmQgZXJyb3IgaW4gUUZTVW5peEluZm8gPSAlZCIsIHJjKSk7CisJfSBlbHNlIHsJCS8qIGRlY29kZSByZXNwb25zZSAqLworCQlyYyA9IHZhbGlkYXRlX3QyKChzdHJ1Y3Qgc21iX3QyX3JzcCAqKXBTTUJyKTsKKworCQlpZiAocmMgfHwgKHBTTUJyLT5CeXRlQ291bnQgPCAxMykpIHsKKwkJCXJjID0gLUVJTzsJLyogYmFkIHNtYiAqLworCQl9IGVsc2UgeworCQkJX191MTYgZGF0YV9vZmZzZXQgPSBsZTE2X3RvX2NwdShwU01Cci0+dDIuRGF0YU9mZnNldCk7CisJCQlyZXNwb25zZV9kYXRhID0KKwkJCSAgICAoRklMRV9TWVNURU1fUE9TSVhfSU5GTworCQkJICAgICAqKSAoKChjaGFyICopICZwU01Cci0+aGRyLlByb3RvY29sKSArCisJCQkJIGRhdGFfb2Zmc2V0KTsKKwkJCUZTRGF0YS0+Zl9ic2l6ZSA9CisJCQkJCWxlMzJfdG9fY3B1KHJlc3BvbnNlX2RhdGEtPkJsb2NrU2l6ZSk7CisJCQlGU0RhdGEtPmZfYmxvY2tzID0KKwkJCQkJbGU2NF90b19jcHUocmVzcG9uc2VfZGF0YS0+VG90YWxCbG9ja3MpOworCQkJRlNEYXRhLT5mX2JmcmVlID0KKwkJCSAgICBsZTY0X3RvX2NwdShyZXNwb25zZV9kYXRhLT5CbG9ja3NBdmFpbCk7CisJCQlpZihyZXNwb25zZV9kYXRhLT5Vc2VyQmxvY2tzQXZhaWwgPT0gLTEpIHsKKwkJCQlGU0RhdGEtPmZfYmF2YWlsID0gRlNEYXRhLT5mX2JmcmVlOworCQkJfSBlbHNlIHsKKwkJCQlGU0RhdGEtPmZfYmF2YWlsID0KKwkJCQkJbGU2NF90b19jcHUocmVzcG9uc2VfZGF0YS0+VXNlckJsb2Nrc0F2YWlsKTsKKwkJCX0KKwkJCWlmKHJlc3BvbnNlX2RhdGEtPlRvdGFsRmlsZU5vZGVzICE9IC0xKQorCQkJCUZTRGF0YS0+Zl9maWxlcyA9CisJCQkJCWxlNjRfdG9fY3B1KHJlc3BvbnNlX2RhdGEtPlRvdGFsRmlsZU5vZGVzKTsKKwkJCWlmKHJlc3BvbnNlX2RhdGEtPkZyZWVGaWxlTm9kZXMgIT0gLTEpCisJCQkJRlNEYXRhLT5mX2ZmcmVlID0KKwkJCQkJbGU2NF90b19jcHUocmVzcG9uc2VfZGF0YS0+RnJlZUZpbGVOb2Rlcyk7CisJCX0KKwl9CisJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKworCWlmIChyYyA9PSAtRUFHQUlOKQorCQlnb3RvIFFGU1Bvc2l4UmV0cnk7CisKKwlyZXR1cm4gcmM7Cit9CisKKworLyogV2UgY2FuIG5vdCB1c2Ugd3JpdGUgb2YgemVybyBieXRlcyB0cmljayB0byAKKyAgIHNldCBmaWxlIHNpemUgZHVlIHRvIG5lZWQgZm9yIGxhcmdlIGZpbGUgc3VwcG9ydC4gIEFsc28gbm90ZSB0aGF0IAorICAgdGhpcyBTZXRQYXRoSW5mbyBpcyBwcmVmZXJyZWQgdG8gU2V0RmlsZUluZm8gYmFzZWQgbWV0aG9kIGluIG5leHQgCisgICByb3V0aW5lIHdoaWNoIGlzIG9ubHkgbmVlZGVkIHRvIHdvcmsgYXJvdW5kIGEgc2hhcmluZyB2aW9sYXRpb24gYnVnCisgICBpbiBTYW1iYSB3aGljaCB0aGlzIHJvdXRpbmUgY2FuIHJ1biBpbnRvICovCisKK2ludAorQ0lGU1NNQlNldEVPRihjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLCBjb25zdCBjaGFyICpmaWxlTmFtZSwKKwkgICAgICBfX3U2NCBzaXplLCBpbnQgU2V0QWxsb2NhdGlvbiwgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworCXN0cnVjdCBzbWJfY29tX3RyYW5zYWN0aW9uMl9zcGlfcmVxICpwU01CID0gTlVMTDsKKwlzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfc3BpX3JzcCAqcFNNQnIgPSBOVUxMOworCXN0cnVjdCBmaWxlX2VuZF9vZl9maWxlX2luZm8gKnBhcm1fZGF0YTsKKwlpbnQgbmFtZV9sZW47CisJaW50IHJjID0gMDsKKwlpbnQgYnl0ZXNfcmV0dXJuZWQgPSAwOworCV9fdTE2IHBhcmFtcywgYnl0ZV9jb3VudCwgZGF0YV9jb3VudCwgcGFyYW1fb2Zmc2V0LCBvZmZzZXQ7CisKKwljRllJKDEsICgiSW4gU2V0RU9GIikpOworU2V0RU9GUmV0cnk6CisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX1RSQU5TQUNUSU9OMiwgMTUsIHRjb24sICh2b2lkICoqKSAmcFNNQiwKKwkJICAgICAgKHZvaWQgKiopICZwU01Ccik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlpZiAocFNNQi0+aGRyLkZsYWdzMiAmIFNNQkZMRzJfVU5JQ09ERSkgeworCQluYW1lX2xlbiA9CisJCSAgICBjaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIHBTTUItPkZpbGVOYW1lLCBmaWxlTmFtZSwgUEFUSF9NQVgKKwkJCQkgIC8qIGZpbmQgZGVmaW5lIGZvciB0aGlzIG1heHBhdGhjb21wb25lbnQgKi8KKwkJCQkgICwgbmxzX2NvZGVwYWdlKTsKKwkJbmFtZV9sZW4rKzsJLyogdHJhaWxpbmcgbnVsbCAqLworCQluYW1lX2xlbiAqPSAyOworCX0gZWxzZSB7CQkvKiBCQiBpbXByb3ZlIHRoZSBjaGVjayBmb3IgYnVmZmVyIG92ZXJydW5zIEJCICovCisJCW5hbWVfbGVuID0gc3RybmxlbihmaWxlTmFtZSwgUEFUSF9NQVgpOworCQluYW1lX2xlbisrOwkvKiB0cmFpbGluZyBudWxsICovCisJCXN0cm5jcHkocFNNQi0+RmlsZU5hbWUsIGZpbGVOYW1lLCBuYW1lX2xlbik7CisJfQorCXBhcmFtcyA9IDYgKyBuYW1lX2xlbjsKKwlkYXRhX2NvdW50ID0gc2l6ZW9mIChzdHJ1Y3QgZmlsZV9lbmRfb2ZfZmlsZV9pbmZvKTsKKwlwU01CLT5NYXhQYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KDIpOworCXBTTUItPk1heERhdGFDb3VudCA9IGNwdV90b19sZTE2KDEwMDApOwkvKiBCQiBmaW5kIG1heCBTTUIgc2l6ZSBmcm9tIHNlc3MgKi8KKwlwU01CLT5NYXhTZXR1cENvdW50ID0gMDsKKwlwU01CLT5SZXNlcnZlZCA9IDA7CisJcFNNQi0+RmxhZ3MgPSAwOworCXBTTUItPlRpbWVvdXQgPSAwOworCXBTTUItPlJlc2VydmVkMiA9IDA7CisJcGFyYW1fb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3NwaV9yZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25MZXZlbCkgLSA0OworCW9mZnNldCA9IHBhcmFtX29mZnNldCArIHBhcmFtczsKKwlpZihTZXRBbGxvY2F0aW9uKSB7CisgICAgICAgIAlpZiAodGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfSU5GT0xFVkVMX1BBU1NUSFJVKQorCSAgICAgICAgICAgIHBTTUItPkluZm9ybWF0aW9uTGV2ZWwgPQorICAgICAgICAgICAgICAgIAljcHVfdG9fbGUxNihTTUJfU0VUX0ZJTEVfQUxMT0NBVElPTl9JTkZPMik7CisgICAgICAgIAllbHNlCisJICAgICAgICAgICAgcFNNQi0+SW5mb3JtYXRpb25MZXZlbCA9CisgICAgICAgIAkgICAgICAgIGNwdV90b19sZTE2KFNNQl9TRVRfRklMRV9BTExPQ0FUSU9OX0lORk8pOworCX0gZWxzZSAvKiBTZXQgRmlsZSBTaXplICovICB7ICAgIAorCSAgICBpZiAodGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfSU5GT0xFVkVMX1BBU1NUSFJVKQorCQkgICAgcFNNQi0+SW5mb3JtYXRpb25MZXZlbCA9CisJCSAgICAgICAgY3B1X3RvX2xlMTYoU01CX1NFVF9GSUxFX0VORF9PRl9GSUxFX0lORk8yKTsKKwkgICAgZWxzZQorCQkgICAgcFNNQi0+SW5mb3JtYXRpb25MZXZlbCA9CisJCSAgICAgICAgY3B1X3RvX2xlMTYoU01CX1NFVF9GSUxFX0VORF9PRl9GSUxFX0lORk8pOworCX0KKworCXBhcm1fZGF0YSA9CisJICAgIChzdHJ1Y3QgZmlsZV9lbmRfb2ZfZmlsZV9pbmZvICopICgoKGNoYXIgKikgJnBTTUItPmhkci5Qcm90b2NvbCkgKworCQkJCSAgICAgICBvZmZzZXQpOworCXBTTUItPlBhcmFtZXRlck9mZnNldCA9IGNwdV90b19sZTE2KHBhcmFtX29mZnNldCk7CisJcFNNQi0+RGF0YU9mZnNldCA9IGNwdV90b19sZTE2KG9mZnNldCk7CisJcFNNQi0+U2V0dXBDb3VudCA9IDE7CisJcFNNQi0+UmVzZXJ2ZWQzID0gMDsKKwlwU01CLT5TdWJDb21tYW5kID0gY3B1X3RvX2xlMTYoVFJBTlMyX1NFVF9QQVRIX0lORk9STUFUSU9OKTsKKwlieXRlX2NvdW50ID0gMyAvKiBwYWQgKi8gICsgcGFyYW1zICsgZGF0YV9jb3VudDsKKwlwU01CLT5EYXRhQ291bnQgPSBjcHVfdG9fbGUxNihkYXRhX2NvdW50KTsKKwlwU01CLT5Ub3RhbERhdGFDb3VudCA9IHBTTUItPkRhdGFDb3VudDsKKwlwU01CLT5QYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KHBhcmFtcyk7CisJcFNNQi0+VG90YWxQYXJhbWV0ZXJDb3VudCA9IHBTTUItPlBhcmFtZXRlckNvdW50OworCXBTTUItPlJlc2VydmVkNCA9IDA7CisJcFNNQi0+aGRyLnNtYl9idWZfbGVuZ3RoICs9IGJ5dGVfY291bnQ7CisJcGFybV9kYXRhLT5GaWxlU2l6ZSA9IGNwdV90b19sZTY0KHNpemUpOworCXBTTUItPkJ5dGVDb3VudCA9IGNwdV90b19sZTE2KGJ5dGVfY291bnQpOworCXJjID0gU2VuZFJlY2VpdmUoeGlkLCB0Y29uLT5zZXMsIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CLAorCQkJIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CciwgJmJ5dGVzX3JldHVybmVkLCAwKTsKKwlpZiAocmMpIHsKKwkJY0ZZSSgxLCAoIlNldFBhdGhJbmZvIChmaWxlIHNpemUpIHJldHVybmVkICVkIiwgcmMpKTsKKwl9CisKKwljaWZzX2J1Zl9yZWxlYXNlKHBTTUIpOworCisJaWYgKHJjID09IC1FQUdBSU4pCisJCWdvdG8gU2V0RU9GUmV0cnk7CisKKwlyZXR1cm4gcmM7Cit9CisKK2ludAorQ0lGU1NNQlNldEZpbGVTaXplKGNvbnN0IGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sIF9fdTY0IHNpemUsIAorICAgICAgICAgICAgICAgICAgIF9fdTE2IGZpZCwgX191MzIgcGlkX29mX29wZW5lciwgaW50IFNldEFsbG9jYXRpb24pCit7CisJc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3NmaV9yZXEgKnBTTUIgID0gTlVMTDsKKwlzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfc2ZpX3JzcCAqcFNNQnIgPSBOVUxMOworCWNoYXIgKmRhdGFfb2Zmc2V0OworCXN0cnVjdCBmaWxlX2VuZF9vZl9maWxlX2luZm8gKnBhcm1fZGF0YTsKKwlpbnQgcmMgPSAwOworCWludCBieXRlc19yZXR1cm5lZCA9IDA7CisJX191MTYgcGFyYW1zLCBwYXJhbV9vZmZzZXQsIG9mZnNldCwgYnl0ZV9jb3VudCwgY291bnQ7CisKKwljRllJKDEsICgiU2V0RmlsZVNpemUgKHZpYSBTZXRGaWxlSW5mbykgJWxsZCIsCisJCQkobG9uZyBsb25nKXNpemUpKTsKKwlyYyA9IHNtYl9pbml0KFNNQl9DT01fVFJBTlNBQ1RJT04yLCAxNSwgdGNvbiwgKHZvaWQgKiopICZwU01CLAorCQkgICAgICAodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXBTTUItPmhkci5QaWQgPSBjcHVfdG9fbGUxNigoX191MTYpcGlkX29mX29wZW5lcik7CisJcFNNQi0+aGRyLlBpZEhpZ2ggPSBjcHVfdG9fbGUxNigoX191MTYpKHBpZF9vZl9vcGVuZXIgPj4gMTYpKTsKKyAgICAKKwlwYXJhbXMgPSA2OworCXBTTUItPk1heFNldHVwQ291bnQgPSAwOworCXBTTUItPlJlc2VydmVkID0gMDsKKwlwU01CLT5GbGFncyA9IDA7CisJcFNNQi0+VGltZW91dCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQyID0gMDsKKwlwYXJhbV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfc2ZpX3JlcSwgRmlkKSAtIDQ7CisJb2Zmc2V0ID0gcGFyYW1fb2Zmc2V0ICsgcGFyYW1zOworCisJZGF0YV9vZmZzZXQgPSAoY2hhciAqKSAoJnBTTUItPmhkci5Qcm90b2NvbCkgKyBvZmZzZXQ7CQorCisJY291bnQgPSBzaXplb2Yoc3RydWN0IGZpbGVfZW5kX29mX2ZpbGVfaW5mbyk7CisJcFNNQi0+TWF4UGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNigyKTsKKwlwU01CLT5NYXhEYXRhQ291bnQgPSBjcHVfdG9fbGUxNigxMDAwKTsJLyogQkIgZmluZCBtYXggU01CIFBEVSBmcm9tIHNlc3MgKi8KKwlwU01CLT5TZXR1cENvdW50ID0gMTsKKwlwU01CLT5SZXNlcnZlZDMgPSAwOworCXBTTUItPlN1YkNvbW1hbmQgPSBjcHVfdG9fbGUxNihUUkFOUzJfU0VUX0ZJTEVfSU5GT1JNQVRJT04pOworCWJ5dGVfY291bnQgPSAzIC8qIHBhZCAqLyAgKyBwYXJhbXMgKyBjb3VudDsKKwlwU01CLT5EYXRhQ291bnQgPSBjcHVfdG9fbGUxNihjb3VudCk7CisJcFNNQi0+UGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNihwYXJhbXMpOworCXBTTUItPlRvdGFsRGF0YUNvdW50ID0gcFNNQi0+RGF0YUNvdW50OworCXBTTUItPlRvdGFsUGFyYW1ldGVyQ291bnQgPSBwU01CLT5QYXJhbWV0ZXJDb3VudDsKKwlwU01CLT5QYXJhbWV0ZXJPZmZzZXQgPSBjcHVfdG9fbGUxNihwYXJhbV9vZmZzZXQpOworCXBhcm1fZGF0YSA9CisJCShzdHJ1Y3QgZmlsZV9lbmRfb2ZfZmlsZV9pbmZvICopICgoKGNoYXIgKikgJnBTTUItPmhkci5Qcm90b2NvbCkgKworCQkJb2Zmc2V0KTsKKwlwU01CLT5EYXRhT2Zmc2V0ID0gY3B1X3RvX2xlMTYob2Zmc2V0KTsKKwlwYXJtX2RhdGEtPkZpbGVTaXplID0gY3B1X3RvX2xlNjQoc2l6ZSk7CisJcFNNQi0+RmlkID0gZmlkOworCWlmKFNldEFsbG9jYXRpb24pIHsKKwkJaWYgKHRjb24tPnNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX0lORk9MRVZFTF9QQVNTVEhSVSkKKwkJCXBTTUItPkluZm9ybWF0aW9uTGV2ZWwgPQorCQkJCWNwdV90b19sZTE2KFNNQl9TRVRfRklMRV9BTExPQ0FUSU9OX0lORk8yKTsKKwkJZWxzZQorCQkJcFNNQi0+SW5mb3JtYXRpb25MZXZlbCA9CisJCQkJY3B1X3RvX2xlMTYoU01CX1NFVF9GSUxFX0FMTE9DQVRJT05fSU5GTyk7CisJfSBlbHNlIC8qIFNldCBGaWxlIFNpemUgKi8gIHsgICAgCisJICAgIGlmICh0Y29uLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9JTkZPTEVWRUxfUEFTU1RIUlUpCisJCSAgICBwU01CLT5JbmZvcm1hdGlvbkxldmVsID0KKwkJICAgICAgICBjcHVfdG9fbGUxNihTTUJfU0VUX0ZJTEVfRU5EX09GX0ZJTEVfSU5GTzIpOworCSAgICBlbHNlCisJCSAgICBwU01CLT5JbmZvcm1hdGlvbkxldmVsID0KKwkJICAgICAgICBjcHVfdG9fbGUxNihTTUJfU0VUX0ZJTEVfRU5EX09GX0ZJTEVfSU5GTyk7CisJfQorCXBTTUItPlJlc2VydmVkNCA9IDA7CisJcFNNQi0+aGRyLnNtYl9idWZfbGVuZ3RoICs9IGJ5dGVfY291bnQ7CisJcFNNQi0+Qnl0ZUNvdW50ID0gY3B1X3RvX2xlMTYoYnl0ZV9jb3VudCk7CisJcmMgPSBTZW5kUmVjZWl2ZSh4aWQsIHRjb24tPnNlcywgKHN0cnVjdCBzbWJfaGRyICopIHBTTUIsCisJCQkgKHN0cnVjdCBzbWJfaGRyICopIHBTTUJyLCAmYnl0ZXNfcmV0dXJuZWQsIDApOworCWlmIChyYykgeworCQljRllJKDEsCisJCSAgICAgKCJTZW5kIGVycm9yIGluIFNldEZpbGVJbmZvIChTZXRGaWxlU2l6ZSkgPSAlZCIsCisJCSAgICAgIHJjKSk7CisJfQorCisJaWYgKHBTTUIpCisJCWNpZnNfYnVmX3JlbGVhc2UocFNNQik7CisKKwkvKiBOb3RlOiBPbiAtRUFHQUlOIGVycm9yIG9ubHkgY2FsbGVyIGNhbiByZXRyeSBvbiBoYW5kbGUgYmFzZWQgY2FsbHMgCisJCXNpbmNlIGZpbGUgaGFuZGxlIHBhc3NlZCBpbiBubyBsb25nZXIgdmFsaWQgKi8KKworCXJldHVybiByYzsKK30KKworLyogU29tZSBsZWdhY3kgc2VydmVycyBzdWNoIGFzIE5UNCByZXF1aXJlIHRoYXQgdGhlIGZpbGUgdGltZXMgYmUgc2V0IG9uIAorICAgYW4gb3BlbiBoYW5kbGUsIHJhdGhlciB0aGFuIGJ5IHBhdGhuYW1lIC0gdGhpcyBpcyBhd2t3YXJkIGR1ZSB0bworICAgcG90ZW50aWFsIGFjY2VzcyBjb25mbGljdHMgb24gdGhlIG9wZW4sIGJ1dCBpdCBpcyB1bmF2b2lkYWJsZSBmb3IgdGhlc2UKKyAgIG9sZCBzZXJ2ZXJzIHNpbmNlIHRoZSBvbmx5IG90aGVyIGNob2ljZSBpcyB0byBnbyBmcm9tIDEwMCBuYW5vc2Vjb25kIERDRQorICAgdGltZSBhbmQgcmVzb3J0IHRvIHRoZSBvcmlnaW5hbCBzZXRwYXRoaW5mbyBsZXZlbCB3aGljaCB0YWtlcyB0aGUgYW5jaWVudAorICAgRE9TIHRpbWUgZm9ybWF0IHdpdGggMiBzZWNvbmQgZ3JhbnVsYXJpdHkgKi8KK2ludAorQ0lGU1NNQlNldEZpbGVUaW1lcyhjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLCBjb25zdCBGSUxFX0JBU0lDX0lORk8gKiBkYXRhLCAKKyAgICAgICAgICAgICAgICAgICBfX3UxNiBmaWQpCit7CisJc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3NmaV9yZXEgKnBTTUIgID0gTlVMTDsKKwlzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfc2ZpX3JzcCAqcFNNQnIgPSBOVUxMOworCWNoYXIgKmRhdGFfb2Zmc2V0OworCWludCByYyA9IDA7CisJaW50IGJ5dGVzX3JldHVybmVkID0gMDsKKwlfX3UxNiBwYXJhbXMsIHBhcmFtX29mZnNldCwgb2Zmc2V0LCBieXRlX2NvdW50LCBjb3VudDsKKworCWNGWUkoMSwgKCJTZXQgVGltZXMgKHZpYSBTZXRGaWxlSW5mbykiKSk7CisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX1RSQU5TQUNUSU9OMiwgMTUsIHRjb24sICh2b2lkICoqKSAmcFNNQiwKKwkJICAgICAgKHZvaWQgKiopICZwU01Ccik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwkvKiBBdCB0aGlzIHBvaW50IHRoZXJlIGlzIG5vIG5lZWQgdG8gb3ZlcnJpZGUgdGhlIGN1cnJlbnQgcGlkCisJd2l0aCB0aGUgcGlkIG9mIHRoZSBvcGVuZXIsIGJ1dCB0aGF0IGNvdWxkIGNoYW5nZSBpZiB3ZSBzb21lZGF5CisJdXNlIGFuIGV4aXN0aW5nIGhhbmRsZSAocmF0aGVyIHRoYW4gb3BlbmluZyBvbmUgb24gdGhlIGZseSkgKi8KKwkvKiBwU01CLT5oZHIuUGlkID0gY3B1X3RvX2xlMTYoKF9fdTE2KXBpZF9vZl9vcGVuZXIpOworCXBTTUItPmhkci5QaWRIaWdoID0gY3B1X3RvX2xlMTYoKF9fdTE2KShwaWRfb2Zfb3BlbmVyID4+IDE2KSk7Ki8KKyAgICAKKwlwYXJhbXMgPSA2OworCXBTTUItPk1heFNldHVwQ291bnQgPSAwOworCXBTTUItPlJlc2VydmVkID0gMDsKKwlwU01CLT5GbGFncyA9IDA7CisJcFNNQi0+VGltZW91dCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQyID0gMDsKKwlwYXJhbV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfc2ZpX3JlcSwgRmlkKSAtIDQ7CisJb2Zmc2V0ID0gcGFyYW1fb2Zmc2V0ICsgcGFyYW1zOworCisJZGF0YV9vZmZzZXQgPSAoY2hhciAqKSAoJnBTTUItPmhkci5Qcm90b2NvbCkgKyBvZmZzZXQ7IAorCisJY291bnQgPSBzaXplb2YgKEZJTEVfQkFTSUNfSU5GTyk7CisJcFNNQi0+TWF4UGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNigyKTsKKwlwU01CLT5NYXhEYXRhQ291bnQgPSBjcHVfdG9fbGUxNigxMDAwKTsJLyogQkIgZmluZCBtYXggU01CIFBEVSBmcm9tIHNlc3MgKi8KKwlwU01CLT5TZXR1cENvdW50ID0gMTsKKwlwU01CLT5SZXNlcnZlZDMgPSAwOworCXBTTUItPlN1YkNvbW1hbmQgPSBjcHVfdG9fbGUxNihUUkFOUzJfU0VUX0ZJTEVfSU5GT1JNQVRJT04pOworCWJ5dGVfY291bnQgPSAzIC8qIHBhZCAqLyAgKyBwYXJhbXMgKyBjb3VudDsKKwlwU01CLT5EYXRhQ291bnQgPSBjcHVfdG9fbGUxNihjb3VudCk7CisJcFNNQi0+UGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNihwYXJhbXMpOworCXBTTUItPlRvdGFsRGF0YUNvdW50ID0gcFNNQi0+RGF0YUNvdW50OworCXBTTUItPlRvdGFsUGFyYW1ldGVyQ291bnQgPSBwU01CLT5QYXJhbWV0ZXJDb3VudDsKKwlwU01CLT5QYXJhbWV0ZXJPZmZzZXQgPSBjcHVfdG9fbGUxNihwYXJhbV9vZmZzZXQpOworCXBTTUItPkRhdGFPZmZzZXQgPSBjcHVfdG9fbGUxNihvZmZzZXQpOworCXBTTUItPkZpZCA9IGZpZDsKKwlpZiAodGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfSU5GT0xFVkVMX1BBU1NUSFJVKQorCQlwU01CLT5JbmZvcm1hdGlvbkxldmVsID0gY3B1X3RvX2xlMTYoU01CX1NFVF9GSUxFX0JBU0lDX0lORk8yKTsKKwllbHNlCisJCXBTTUItPkluZm9ybWF0aW9uTGV2ZWwgPSBjcHVfdG9fbGUxNihTTUJfU0VUX0ZJTEVfQkFTSUNfSU5GTyk7CisJcFNNQi0+UmVzZXJ2ZWQ0ID0gMDsKKwlwU01CLT5oZHIuc21iX2J1Zl9sZW5ndGggKz0gYnl0ZV9jb3VudDsKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihieXRlX2NvdW50KTsKKwltZW1jcHkoZGF0YV9vZmZzZXQsZGF0YSxzaXplb2YoRklMRV9CQVNJQ19JTkZPKSk7CisJcmMgPSBTZW5kUmVjZWl2ZSh4aWQsIHRjb24tPnNlcywgKHN0cnVjdCBzbWJfaGRyICopIHBTTUIsCisJCQkgKHN0cnVjdCBzbWJfaGRyICopIHBTTUJyLCAmYnl0ZXNfcmV0dXJuZWQsIDApOworCWlmIChyYykgeworCQljRllJKDEsKCJTZW5kIGVycm9yIGluIFNldCBUaW1lIChTZXRGaWxlSW5mbykgPSAlZCIscmMpKTsKKwl9CisKKwljaWZzX2J1Zl9yZWxlYXNlKHBTTUIpOworCisJLyogTm90ZTogT24gLUVBR0FJTiBlcnJvciBvbmx5IGNhbGxlciBjYW4gcmV0cnkgb24gaGFuZGxlIGJhc2VkIGNhbGxzIAorCQlzaW5jZSBmaWxlIGhhbmRsZSBwYXNzZWQgaW4gbm8gbG9uZ2VyIHZhbGlkICovCisKKwlyZXR1cm4gcmM7Cit9CisKKworaW50CitDSUZTU01CU2V0VGltZXMoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwgY29uc3QgY2hhciAqZmlsZU5hbWUsCisJCWNvbnN0IEZJTEVfQkFTSUNfSU5GTyAqIGRhdGEsIAorCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpCit7CisJVFJBTlNBQ1RJT04yX1NQSV9SRVEgKnBTTUIgPSBOVUxMOworCVRSQU5TQUNUSU9OMl9TUElfUlNQICpwU01CciA9IE5VTEw7CisJaW50IG5hbWVfbGVuOworCWludCByYyA9IDA7CisJaW50IGJ5dGVzX3JldHVybmVkID0gMDsKKwljaGFyICpkYXRhX29mZnNldDsKKwlfX3UxNiBwYXJhbXMsIHBhcmFtX29mZnNldCwgb2Zmc2V0LCBieXRlX2NvdW50LCBjb3VudDsKKworCWNGWUkoMSwgKCJJbiBTZXRUaW1lcyIpKTsKKworU2V0VGltZXNSZXRyeToKKwlyYyA9IHNtYl9pbml0KFNNQl9DT01fVFJBTlNBQ1RJT04yLCAxNSwgdGNvbiwgKHZvaWQgKiopICZwU01CLAorCQkgICAgICAodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmIChwU01CLT5oZHIuRmxhZ3MyICYgU01CRkxHMl9VTklDT0RFKSB7CisJCW5hbWVfbGVuID0KKwkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgcFNNQi0+RmlsZU5hbWUsIGZpbGVOYW1lLCBQQVRIX01BWAorCQkJCSAgLyogZmluZCBkZWZpbmUgZm9yIHRoaXMgbWF4cGF0aGNvbXBvbmVudCAqLworCQkJCSAgLCBubHNfY29kZXBhZ2UpOworCQluYW1lX2xlbisrOwkvKiB0cmFpbGluZyBudWxsICovCisJCW5hbWVfbGVuICo9IDI7CisJfSBlbHNlIHsJCS8qIEJCIGltcHJvdmUgdGhlIGNoZWNrIGZvciBidWZmZXIgb3ZlcnJ1bnMgQkIgKi8KKwkJbmFtZV9sZW4gPSBzdHJubGVuKGZpbGVOYW1lLCBQQVRIX01BWCk7CisJCW5hbWVfbGVuKys7CS8qIHRyYWlsaW5nIG51bGwgKi8KKwkJc3RybmNweShwU01CLT5GaWxlTmFtZSwgZmlsZU5hbWUsIG5hbWVfbGVuKTsKKwl9CisKKwlwYXJhbXMgPSA2ICsgbmFtZV9sZW47CisJY291bnQgPSBzaXplb2YgKEZJTEVfQkFTSUNfSU5GTyk7CisJcFNNQi0+TWF4UGFyYW1ldGVyQ291bnQgPSBjcHVfdG9fbGUxNigyKTsKKwlwU01CLT5NYXhEYXRhQ291bnQgPSBjcHVfdG9fbGUxNigxMDAwKTsJLyogQkIgZmluZCBleGFjdCBtYXggU01CIFBEVSBmcm9tIHNlc3Mgc3RydWN0dXJlIEJCICovCisJcFNNQi0+TWF4U2V0dXBDb3VudCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQgPSAwOworCXBTTUItPkZsYWdzID0gMDsKKwlwU01CLT5UaW1lb3V0ID0gMDsKKwlwU01CLT5SZXNlcnZlZDIgPSAwOworCXBhcmFtX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBzbWJfY29tX3RyYW5zYWN0aW9uMl9zcGlfcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZm9ybWF0aW9uTGV2ZWwpIC0gNDsKKwlvZmZzZXQgPSBwYXJhbV9vZmZzZXQgKyBwYXJhbXM7CisJZGF0YV9vZmZzZXQgPSAoY2hhciAqKSAoJnBTTUItPmhkci5Qcm90b2NvbCkgKyBvZmZzZXQ7CisJcFNNQi0+UGFyYW1ldGVyT2Zmc2V0ID0gY3B1X3RvX2xlMTYocGFyYW1fb2Zmc2V0KTsKKwlwU01CLT5EYXRhT2Zmc2V0ID0gY3B1X3RvX2xlMTYob2Zmc2V0KTsKKwlwU01CLT5TZXR1cENvdW50ID0gMTsKKwlwU01CLT5SZXNlcnZlZDMgPSAwOworCXBTTUItPlN1YkNvbW1hbmQgPSBjcHVfdG9fbGUxNihUUkFOUzJfU0VUX1BBVEhfSU5GT1JNQVRJT04pOworCWJ5dGVfY291bnQgPSAzIC8qIHBhZCAqLyAgKyBwYXJhbXMgKyBjb3VudDsKKworCXBTTUItPkRhdGFDb3VudCA9IGNwdV90b19sZTE2KGNvdW50KTsKKwlwU01CLT5QYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KHBhcmFtcyk7CisJcFNNQi0+VG90YWxEYXRhQ291bnQgPSBwU01CLT5EYXRhQ291bnQ7CisJcFNNQi0+VG90YWxQYXJhbWV0ZXJDb3VudCA9IHBTTUItPlBhcmFtZXRlckNvdW50OworCWlmICh0Y29uLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9JTkZPTEVWRUxfUEFTU1RIUlUpCisJCXBTTUItPkluZm9ybWF0aW9uTGV2ZWwgPSBjcHVfdG9fbGUxNihTTUJfU0VUX0ZJTEVfQkFTSUNfSU5GTzIpOworCWVsc2UKKwkJcFNNQi0+SW5mb3JtYXRpb25MZXZlbCA9IGNwdV90b19sZTE2KFNNQl9TRVRfRklMRV9CQVNJQ19JTkZPKTsKKwlwU01CLT5SZXNlcnZlZDQgPSAwOworCXBTTUItPmhkci5zbWJfYnVmX2xlbmd0aCArPSBieXRlX2NvdW50OworCW1lbWNweShkYXRhX29mZnNldCwgZGF0YSwgc2l6ZW9mIChGSUxFX0JBU0lDX0lORk8pKTsKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihieXRlX2NvdW50KTsKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKwkJCSAoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMCk7CisJaWYgKHJjKSB7CisJCWNGWUkoMSwgKCJTZXRQYXRoSW5mbyAodGltZXMpIHJldHVybmVkICVkIiwgcmMpKTsKKwl9CisKKwljaWZzX2J1Zl9yZWxlYXNlKHBTTUIpOworCisJaWYgKHJjID09IC1FQUdBSU4pCisJCWdvdG8gU2V0VGltZXNSZXRyeTsKKworCXJldHVybiByYzsKK30KKworLyogQ2FuIG5vdCBiZSB1c2VkIHRvIHNldCB0aW1lIHN0YW1wcyB5ZXQgKGR1ZSB0byBvbGQgRE9TIHRpbWUgZm9ybWF0KSAqLworLyogQ2FuIGJlIHVzZWQgdG8gc2V0IGF0dHJpYnV0ZXMgKi8KKyNpZiAwICAvKiBQb3NzaWJseSBub3QgbmVlZGVkIC0gc2luY2UgaXQgdHVybnMgb3V0IHRoYXQgc3RyYW5nZWx5IE5UNCBoYXMgYSBidWcKKwkgIGhhbmRsaW5nIGl0IGFueXdheSBhbmQgTlQ0IHdhcyB3aGF0IHdlIHRob3VnaHQgaXQgd291bGQgYmUgbmVlZGVkIGZvcgorCSAgRG8gbm90IGRlbGV0ZSBpdCB1bnRpbCB3ZSBwcm92ZSB3aGV0aGVyIG5lZWRlZCBmb3IgV2luOXggdGhvdWdoICovCitpbnQKK0NJRlNTTUJTZXRBdHRyTGVnYWN5KGludCB4aWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb24sIGNoYXIgKmZpbGVOYW1lLAorCQlfX3UxNiBkb3NfYXR0cnMsIGNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSkKK3sKKwlTRVRBVFRSX1JFUSAqcFNNQiA9IE5VTEw7CisJU0VUQVRUUl9SU1AgKnBTTUJyID0gTlVMTDsKKwlpbnQgcmMgPSAwOworCWludCBieXRlc19yZXR1cm5lZDsKKwlpbnQgbmFtZV9sZW47CisKKwljRllJKDEsICgiSW4gU2V0QXR0ckxlZ2FjeSIpKTsKKworU2V0QXR0ckxnY3lSZXRyeToKKwlyYyA9IHNtYl9pbml0KFNNQl9DT01fU0VUQVRUUiwgOCwgdGNvbiwgKHZvaWQgKiopICZwU01CLAorCQkgICAgICAodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmIChwU01CLT5oZHIuRmxhZ3MyICYgU01CRkxHMl9VTklDT0RFKSB7CisJCW5hbWVfbGVuID0KKwkJCWNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgcFNNQi0+ZmlsZU5hbWUsIGZpbGVOYW1lLCAKKwkJCQlQQVRIX01BWCwgbmxzX2NvZGVwYWdlKTsKKwkJbmFtZV9sZW4rKzsgICAgIC8qIHRyYWlsaW5nIG51bGwgKi8KKwkJbmFtZV9sZW4gKj0gMjsKKwl9IGVsc2UgeyAgICAgICAgICAgICAgICAvKiBCQiBpbXByb3ZlIHRoZSBjaGVjayBmb3IgYnVmZmVyIG92ZXJydW5zIEJCICovCisJCW5hbWVfbGVuID0gc3RybmxlbihmaWxlTmFtZSwgUEFUSF9NQVgpOworCQluYW1lX2xlbisrOyAgICAgLyogdHJhaWxpbmcgbnVsbCAqLworCQlzdHJuY3B5KHBTTUItPmZpbGVOYW1lLCBmaWxlTmFtZSwgbmFtZV9sZW4pOworCX0KKwlwU01CLT5hdHRyID0gY3B1X3RvX2xlMTYoZG9zX2F0dHJzKTsKKwlwU01CLT5CdWZmZXJGb3JtYXQgPSAweDA0OworCXBTTUItPmhkci5zbWJfYnVmX2xlbmd0aCArPSBuYW1lX2xlbiArIDE7CisJcFNNQi0+Qnl0ZUNvdW50ID0gY3B1X3RvX2xlMTYobmFtZV9sZW4gKyAxKTsKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKwkJCSAoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMCk7CisJaWYgKHJjKSB7CisJCWNGWUkoMSwgKCJFcnJvciBpbiBMZWdhY3lTZXRBdHRyID0gJWQiLCByYykpOworCX0KKworCWNpZnNfYnVmX3JlbGVhc2UocFNNQik7CisKKwlpZiAocmMgPT0gLUVBR0FJTikKKwkJZ290byBTZXRBdHRyTGdjeVJldHJ5OworCisJcmV0dXJuIHJjOworfQorI2VuZGlmIC8qIHRlbXBvcmFyaWx5IHVubmVlZGVkIFNldEF0dHIgbGVnYWN5IGZ1bmN0aW9uICovCisKK2ludAorQ0lGU1NNQlVuaXhTZXRQZXJtcyhjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCQkgICAgY2hhciAqZmlsZU5hbWUsIF9fdTY0IG1vZGUsIF9fdTY0IHVpZCwgX191NjQgZ2lkLAorCQkgICAgZGV2X3QgZGV2aWNlLCBjb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpCit7CisJVFJBTlNBQ1RJT04yX1NQSV9SRVEgKnBTTUIgPSBOVUxMOworCVRSQU5TQUNUSU9OMl9TUElfUlNQICpwU01CciA9IE5VTEw7CisJaW50IG5hbWVfbGVuOworCWludCByYyA9IDA7CisJaW50IGJ5dGVzX3JldHVybmVkID0gMDsKKwlGSUxFX1VOSVhfQkFTSUNfSU5GTyAqZGF0YV9vZmZzZXQ7CisJX191MTYgcGFyYW1zLCBwYXJhbV9vZmZzZXQsIG9mZnNldCwgY291bnQsIGJ5dGVfY291bnQ7CisKKwljRllJKDEsICgiSW4gU2V0VUlEL0dJRC9Nb2RlIikpOworc2V0UGVybXNSZXRyeToKKwlyYyA9IHNtYl9pbml0KFNNQl9DT01fVFJBTlNBQ1RJT04yLCAxNSwgdGNvbiwgKHZvaWQgKiopICZwU01CLAorCQkgICAgICAodm9pZCAqKikgJnBTTUJyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmIChwU01CLT5oZHIuRmxhZ3MyICYgU01CRkxHMl9VTklDT0RFKSB7CisJCW5hbWVfbGVuID0KKwkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgcFNNQi0+RmlsZU5hbWUsIGZpbGVOYW1lLCBQQVRIX01BWAorCQkJCSAgLyogZmluZCBkZWZpbmUgZm9yIHRoaXMgbWF4cGF0aGNvbXBvbmVudCAqLworCQkJCSAgLCBubHNfY29kZXBhZ2UpOworCQluYW1lX2xlbisrOwkvKiB0cmFpbGluZyBudWxsICovCisJCW5hbWVfbGVuICo9IDI7CisJfSBlbHNlIHsJCS8qIEJCIGltcHJvdmUgdGhlIGNoZWNrIGZvciBidWZmZXIgb3ZlcnJ1bnMgQkIgKi8KKwkJbmFtZV9sZW4gPSBzdHJubGVuKGZpbGVOYW1lLCBQQVRIX01BWCk7CisJCW5hbWVfbGVuKys7CS8qIHRyYWlsaW5nIG51bGwgKi8KKwkJc3RybmNweShwU01CLT5GaWxlTmFtZSwgZmlsZU5hbWUsIG5hbWVfbGVuKTsKKwl9CisKKwlwYXJhbXMgPSA2ICsgbmFtZV9sZW47CisJY291bnQgPSBzaXplb2YgKEZJTEVfVU5JWF9CQVNJQ19JTkZPKTsKKwlwU01CLT5NYXhQYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KDIpOworCXBTTUItPk1heERhdGFDb3VudCA9IGNwdV90b19sZTE2KDEwMDApOwkvKiBCQiBmaW5kIGV4YWN0IG1heCBTTUIgUERVIGZyb20gc2VzcyBzdHJ1Y3R1cmUgQkIgKi8KKwlwU01CLT5NYXhTZXR1cENvdW50ID0gMDsKKwlwU01CLT5SZXNlcnZlZCA9IDA7CisJcFNNQi0+RmxhZ3MgPSAwOworCXBTTUItPlRpbWVvdXQgPSAwOworCXBTTUItPlJlc2VydmVkMiA9IDA7CisJcGFyYW1fb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3NwaV9yZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25MZXZlbCkgLSA0OworCW9mZnNldCA9IHBhcmFtX29mZnNldCArIHBhcmFtczsKKwlkYXRhX29mZnNldCA9CisJICAgIChGSUxFX1VOSVhfQkFTSUNfSU5GTyAqKSAoKGNoYXIgKikgJnBTTUItPmhkci5Qcm90b2NvbCArCisJCQkJICAgICAgb2Zmc2V0KTsKKwltZW1zZXQoZGF0YV9vZmZzZXQsIDAsIGNvdW50KTsKKwlwU01CLT5EYXRhT2Zmc2V0ID0gY3B1X3RvX2xlMTYob2Zmc2V0KTsKKwlwU01CLT5QYXJhbWV0ZXJPZmZzZXQgPSBjcHVfdG9fbGUxNihwYXJhbV9vZmZzZXQpOworCXBTTUItPlNldHVwQ291bnQgPSAxOworCXBTTUItPlJlc2VydmVkMyA9IDA7CisJcFNNQi0+U3ViQ29tbWFuZCA9IGNwdV90b19sZTE2KFRSQU5TMl9TRVRfUEFUSF9JTkZPUk1BVElPTik7CisJYnl0ZV9jb3VudCA9IDMgLyogcGFkICovICArIHBhcmFtcyArIGNvdW50OworCXBTTUItPlBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYocGFyYW1zKTsKKwlwU01CLT5EYXRhQ291bnQgPSBjcHVfdG9fbGUxNihjb3VudCk7CisJcFNNQi0+VG90YWxQYXJhbWV0ZXJDb3VudCA9IHBTTUItPlBhcmFtZXRlckNvdW50OworCXBTTUItPlRvdGFsRGF0YUNvdW50ID0gcFNNQi0+RGF0YUNvdW50OworCXBTTUItPkluZm9ybWF0aW9uTGV2ZWwgPSBjcHVfdG9fbGUxNihTTUJfU0VUX0ZJTEVfVU5JWF9CQVNJQyk7CisJcFNNQi0+UmVzZXJ2ZWQ0ID0gMDsKKwlwU01CLT5oZHIuc21iX2J1Zl9sZW5ndGggKz0gYnl0ZV9jb3VudDsKKwlkYXRhX29mZnNldC0+VWlkID0gY3B1X3RvX2xlNjQodWlkKTsKKwlkYXRhX29mZnNldC0+R2lkID0gY3B1X3RvX2xlNjQoZ2lkKTsKKwkvKiBiZXR0ZXIgdG8gbGVhdmUgZGV2aWNlIGFzIHplcm8gd2hlbiBpdCBpcyAgKi8KKwlkYXRhX29mZnNldC0+RGV2TWFqb3IgPSBjcHVfdG9fbGU2NChNQUpPUihkZXZpY2UpKTsKKwlkYXRhX29mZnNldC0+RGV2TWlub3IgPSBjcHVfdG9fbGU2NChNSU5PUihkZXZpY2UpKTsKKwlkYXRhX29mZnNldC0+UGVybWlzc2lvbnMgPSBjcHVfdG9fbGU2NChtb2RlKTsKKyAgICAKKwlpZihTX0lTUkVHKG1vZGUpKQorCQlkYXRhX29mZnNldC0+VHlwZSA9IGNwdV90b19sZTMyKFVOSVhfRklMRSk7CisJZWxzZSBpZihTX0lTRElSKG1vZGUpKQorCQlkYXRhX29mZnNldC0+VHlwZSA9IGNwdV90b19sZTMyKFVOSVhfRElSKTsKKwllbHNlIGlmKFNfSVNMTksobW9kZSkpCisJCWRhdGFfb2Zmc2V0LT5UeXBlID0gY3B1X3RvX2xlMzIoVU5JWF9TWU1MSU5LKTsKKwllbHNlIGlmKFNfSVNDSFIobW9kZSkpCisJCWRhdGFfb2Zmc2V0LT5UeXBlID0gY3B1X3RvX2xlMzIoVU5JWF9DSEFSREVWKTsKKwllbHNlIGlmKFNfSVNCTEsobW9kZSkpCisJCWRhdGFfb2Zmc2V0LT5UeXBlID0gY3B1X3RvX2xlMzIoVU5JWF9CTE9DS0RFVik7CisJZWxzZSBpZihTX0lTRklGTyhtb2RlKSkKKwkJZGF0YV9vZmZzZXQtPlR5cGUgPSBjcHVfdG9fbGUzMihVTklYX0ZJRk8pOworCWVsc2UgaWYoU19JU1NPQ0sobW9kZSkpCisJCWRhdGFfb2Zmc2V0LT5UeXBlID0gY3B1X3RvX2xlMzIoVU5JWF9TT0NLRVQpOworCisKKwlwU01CLT5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihieXRlX2NvdW50KTsKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKwkJCSAoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMCk7CisJaWYgKHJjKSB7CisJCWNGWUkoMSwgKCJTZXRQYXRoSW5mbyAocGVybXMpIHJldHVybmVkICVkIiwgcmMpKTsKKwl9CisKKwlpZiAocFNNQikKKwkJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKwlpZiAocmMgPT0gLUVBR0FJTikKKwkJZ290byBzZXRQZXJtc1JldHJ5OworCXJldHVybiByYzsKK30KKworaW50IENJRlNTTUJOb3RpZnkoY29uc3QgaW50IHhpZCwgc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiwgCisJCQljb25zdCBpbnQgbm90aWZ5X3N1YmRpcnMsIGNvbnN0IF9fdTE2IG5ldGZpZCwKKwkJCV9fdTMyIGZpbHRlciwgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworCWludCByYyA9IDA7CisJc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb25fY2hhbmdlX25vdGlmeV9yZXEgKiBwU01CID0gTlVMTDsKKwlzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbl9jaGFuZ2Vfbm90aWZ5X3JzcCAqIHBTTUJyID0gTlVMTDsKKwlpbnQgYnl0ZXNfcmV0dXJuZWQ7CisKKwljRllJKDEsICgiSW4gQ0lGU1NNQk5vdGlmeSBmb3IgZmlsZSBoYW5kbGUgJWQiLChpbnQpbmV0ZmlkKSk7CisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX05UX1RSQU5TQUNULCAyMywgdGNvbiwgKHZvaWQgKiopICZwU01CLAorICAgICAgICAgICAgICAgICAgICAgICh2b2lkICoqKSAmcFNNQnIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcFNNQi0+VG90YWxQYXJhbWV0ZXJDb3VudCA9IDAgOworCXBTTUItPlRvdGFsRGF0YUNvdW50ID0gMDsKKwlwU01CLT5NYXhQYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTMyKDIpOworCS8qIEJCIGZpbmQgZXhhY3QgZGF0YSBjb3VudCBtYXggZnJvbSBzZXNzIHN0cnVjdHVyZSBCQiAqLworCXBTTUItPk1heERhdGFDb3VudCA9IDA7IC8qIHNhbWUgaW4gbGl0dGxlIGVuZGlhbiBvciBiZSAqLworCXBTTUItPk1heFNldHVwQ291bnQgPSA0OworCXBTTUItPlJlc2VydmVkID0gMDsKKwlwU01CLT5QYXJhbWV0ZXJPZmZzZXQgPSAwOworCXBTTUItPkRhdGFDb3VudCA9IDA7CisJcFNNQi0+RGF0YU9mZnNldCA9IDA7CisJcFNNQi0+U2V0dXBDb3VudCA9IDQ7IC8qIHNpbmdsZSBieXRlIGRvZXMgbm90IG5lZWQgbGUgY29udmVyc2lvbiAqLworCXBTTUItPlN1YkNvbW1hbmQgPSBjcHVfdG9fbGUxNihOVF9UUkFOU0FDVF9OT1RJRllfQ0hBTkdFKTsKKwlwU01CLT5QYXJhbWV0ZXJDb3VudCA9IHBTTUItPlRvdGFsUGFyYW1ldGVyQ291bnQ7CisJaWYobm90aWZ5X3N1YmRpcnMpCisJCXBTTUItPldhdGNoVHJlZSA9IDE7IC8qIG9uZSBieXRlIC0gbm8gbGUgY29udmVyc2lvbiBuZWVkZWQgKi8KKwlwU01CLT5SZXNlcnZlZDIgPSAwOworCXBTTUItPkNvbXBsZXRpb25GaWx0ZXIgPSBjcHVfdG9fbGUzMihmaWx0ZXIpOworCXBTTUItPkZpZCA9IG5ldGZpZDsgLyogZmlsZSBoYW5kbGUgYWx3YXlzIGxlICovCisJcFNNQi0+Qnl0ZUNvdW50ID0gMDsKKworCXJjID0gU2VuZFJlY2VpdmUoeGlkLCB0Y29uLT5zZXMsIChzdHJ1Y3Qgc21iX2hkciAqKSBwU01CLAorCQkJKHN0cnVjdCBzbWJfaGRyICopIHBTTUJyLCAmYnl0ZXNfcmV0dXJuZWQsIC0xKTsKKwlpZiAocmMpIHsKKwkJY0ZZSSgxLCAoIkVycm9yIGluIE5vdGlmeSA9ICVkIiwgcmMpKTsKKwl9CisJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKwlyZXR1cm4gcmM7CQorfQorI2lmZGVmIENPTkZJR19DSUZTX1hBVFRSCitzc2l6ZV90CitDSUZTU01CUUFsbEVBcyhjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCQkgY29uc3QgdW5zaWduZWQgY2hhciAqc2VhcmNoTmFtZSwKKwkJIGNoYXIgKiBFQURhdGEsIHNpemVfdCBidWZfc2l6ZSwKKwkJIGNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSkKK3sKKwkJLyogQkIgYXNzdW1lcyBvbmUgc2V0dXAgd29yZCAqLworCVRSQU5TQUNUSU9OMl9RUElfUkVRICpwU01CID0gTlVMTDsKKwlUUkFOU0FDVElPTjJfUVBJX1JTUCAqcFNNQnIgPSBOVUxMOworCWludCByYyA9IDA7CisJaW50IGJ5dGVzX3JldHVybmVkOworCWludCBuYW1lX2xlbjsKKwlzdHJ1Y3QgZmVhICogdGVtcF9mZWE7CisJY2hhciAqIHRlbXBfcHRyOworCV9fdTE2IHBhcmFtcywgYnl0ZV9jb3VudDsKKworCWNGWUkoMSwgKCJJbiBRdWVyeSBBbGwgRUFzIHBhdGggJXMiLCBzZWFyY2hOYW1lKSk7CitRQWxsRUFzUmV0cnk6CisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX1RSQU5TQUNUSU9OMiwgMTUsIHRjb24sICh2b2lkICoqKSAmcFNNQiwKKwkJICAgICAgKHZvaWQgKiopICZwU01Ccik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlpZiAocFNNQi0+aGRyLkZsYWdzMiAmIFNNQkZMRzJfVU5JQ09ERSkgeworCQluYW1lX2xlbiA9CisJCSAgICBjaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIHBTTUItPkZpbGVOYW1lLCBzZWFyY2hOYW1lLCBQQVRIX01BWAorCQkJCSAgLyogZmluZCBkZWZpbmUgZm9yIHRoaXMgbWF4cGF0aGNvbXBvbmVudCAqLworCQkJCSAgLCBubHNfY29kZXBhZ2UpOworCQluYW1lX2xlbisrOwkvKiB0cmFpbGluZyBudWxsICovCisJCW5hbWVfbGVuICo9IDI7CisJfSBlbHNlIHsJLyogQkIgaW1wcm92ZSB0aGUgY2hlY2sgZm9yIGJ1ZmZlciBvdmVycnVucyBCQiAqLworCQluYW1lX2xlbiA9IHN0cm5sZW4oc2VhcmNoTmFtZSwgUEFUSF9NQVgpOworCQluYW1lX2xlbisrOwkvKiB0cmFpbGluZyBudWxsICovCisJCXN0cm5jcHkocFNNQi0+RmlsZU5hbWUsIHNlYXJjaE5hbWUsIG5hbWVfbGVuKTsKKwl9CisKKwlwYXJhbXMgPSAyIC8qIGxldmVsICovICsgNCAvKiByZXNlcnZlZCAqLyArIG5hbWVfbGVuIC8qIGluY2x1ZGVzIE5VTCAqLyA7CisJcFNNQi0+VG90YWxEYXRhQ291bnQgPSAwOworCXBTTUItPk1heFBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYoMik7CisJcFNNQi0+TWF4RGF0YUNvdW50ID0gY3B1X3RvX2xlMTYoNDAwMCk7CS8qIEJCIGZpbmQgZXhhY3QgbWF4IFNNQiBQRFUgZnJvbSBzZXNzIHN0cnVjdHVyZSBCQiAqLworCXBTTUItPk1heFNldHVwQ291bnQgPSAwOworCXBTTUItPlJlc2VydmVkID0gMDsKKwlwU01CLT5GbGFncyA9IDA7CisJcFNNQi0+VGltZW91dCA9IDA7CisJcFNNQi0+UmVzZXJ2ZWQyID0gMDsKKwlwU01CLT5QYXJhbWV0ZXJPZmZzZXQgPSBjcHVfdG9fbGUxNihvZmZzZXRvZigKKyAgICAgICAgc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3FwaV9yZXEgLEluZm9ybWF0aW9uTGV2ZWwpIC0gNCk7CisJcFNNQi0+RGF0YUNvdW50ID0gMDsKKwlwU01CLT5EYXRhT2Zmc2V0ID0gMDsKKwlwU01CLT5TZXR1cENvdW50ID0gMTsKKwlwU01CLT5SZXNlcnZlZDMgPSAwOworCXBTTUItPlN1YkNvbW1hbmQgPSBjcHVfdG9fbGUxNihUUkFOUzJfUVVFUllfUEFUSF9JTkZPUk1BVElPTik7CisJYnl0ZV9jb3VudCA9IHBhcmFtcyArIDEgLyogcGFkICovIDsKKwlwU01CLT5Ub3RhbFBhcmFtZXRlckNvdW50ID0gY3B1X3RvX2xlMTYocGFyYW1zKTsKKwlwU01CLT5QYXJhbWV0ZXJDb3VudCA9IHBTTUItPlRvdGFsUGFyYW1ldGVyQ291bnQ7CisJcFNNQi0+SW5mb3JtYXRpb25MZXZlbCA9IGNwdV90b19sZTE2KFNNQl9JTkZPX1FVRVJZX0FMTF9FQVMpOworCXBTTUItPlJlc2VydmVkNCA9IDA7CisJcFNNQi0+aGRyLnNtYl9idWZfbGVuZ3RoICs9IGJ5dGVfY291bnQ7CisJcFNNQi0+Qnl0ZUNvdW50ID0gY3B1X3RvX2xlMTYoYnl0ZV9jb3VudCk7CisKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgdGNvbi0+c2VzLCAoc3RydWN0IHNtYl9oZHIgKikgcFNNQiwKKwkJCSAoc3RydWN0IHNtYl9oZHIgKikgcFNNQnIsICZieXRlc19yZXR1cm5lZCwgMCk7CisJaWYgKHJjKSB7CisJCWNGWUkoMSwgKCJTZW5kIGVycm9yIGluIFF1ZXJ5QWxsRUFzID0gJWQiLCByYykpOworCX0gZWxzZSB7CQkvKiBkZWNvZGUgcmVzcG9uc2UgKi8KKwkJcmMgPSB2YWxpZGF0ZV90Migoc3RydWN0IHNtYl90Ml9yc3AgKilwU01Ccik7CisKKwkJLyogQkIgYWxzbyBjaGVjayBlbm91Z2ggdG90YWwgYnl0ZXMgcmV0dXJuZWQgKi8KKwkJLyogQkIgd2UgbmVlZCB0byBpbXByb3ZlIHRoZSB2YWxpZGl0eSBjaGVja2luZworCQlvZiB0aGVzZSB0cmFuczIgcmVzcG9uc2VzICovCisJCWlmIChyYyB8fCAocFNNQnItPkJ5dGVDb3VudCA8IDQpKSAKKwkJCXJjID0gLUVJTzsJLyogYmFkIHNtYiAqLworCSAgIC8qIGVsc2UgaWYgKHBGaW5kRGF0YSl7CisJCQltZW1jcHkoKGNoYXIgKikgcEZpbmREYXRhLAorCQkJICAgICAgIChjaGFyICopICZwU01Cci0+aGRyLlByb3RvY29sICsKKwkJCSAgICAgICBkYXRhX29mZnNldCwga2wpOworCQl9Ki8gZWxzZSB7CisJCQkvKiBjaGVjayB0aGF0IGxlbmd0aCBvZiBsaXN0IGlzIG5vdCBtb3JlIHRoYW4gYmNjICovCisJCQkvKiBjaGVjayB0aGF0IGVhY2ggZW50cnkgZG9lcyBub3QgZ28gYmV5b25kIGxlbmd0aAorCQkJICAgb2YgbGlzdCAqLworCQkJLyogY2hlY2sgdGhhdCBlYWNoIGVsZW1lbnQgb2YgZWFjaCBlbnRyeSBkb2VzIG5vdAorCQkJICAgZ28gYmV5b25kIGVuZCBvZiBsaXN0ICovCisJCQlfX3UxNiBkYXRhX29mZnNldCA9IGxlMTZfdG9fY3B1KHBTTUJyLT50Mi5EYXRhT2Zmc2V0KTsKKwkJCXN0cnVjdCBmZWFsaXN0ICogZWFfcmVzcG9uc2VfZGF0YTsKKwkJCXJjID0gMDsKKwkJCS8qIHZhbGlkYXRlX3RyYW5zMl9vZmZzZXRzKCkgKi8KKwkJCS8qIEJCIHRvIGNoZWNrIGlmKHN0YXJ0IG9mIHNtYiArIGRhdGFfb2Zmc2V0ID4gJmJjYysgYmNjKSovCisJCQllYV9yZXNwb25zZV9kYXRhID0gKHN0cnVjdCBmZWFsaXN0ICopCisJCQkJKCgoY2hhciAqKSAmcFNNQnItPmhkci5Qcm90b2NvbCkgKworCQkJCWRhdGFfb2Zmc2V0KTsKKwkJCW5hbWVfbGVuID0gbGUzMl90b19jcHUoZWFfcmVzcG9uc2VfZGF0YS0+bGlzdF9sZW4pOworCQkJY0ZZSSgxLCgiZWEgbGVuZ3RoICVkIiwgbmFtZV9sZW4pKTsKKwkJCWlmKG5hbWVfbGVuIDw9IDgpIHsKKwkJCS8qIHJldHVybmVkIEVBIHNpemUgemVyb2VkIGF0IHRvcCBvZiBmdW5jdGlvbiAqLworCQkJCWNGWUkoMSwoImVtcHR5IEVBIGxpc3QgcmV0dXJuZWQgZnJvbSBzZXJ2ZXIiKSk7CisJCQl9IGVsc2UgeworCQkJCS8qIGFjY291bnQgZm9yIGVhIGxpc3QgbGVuICovCisJCQkJbmFtZV9sZW4gLT0gNDsKKwkJCQl0ZW1wX2ZlYSA9IGVhX3Jlc3BvbnNlX2RhdGEtPmxpc3Q7CisJCQkJdGVtcF9wdHIgPSAoY2hhciAqKXRlbXBfZmVhOworCQkJCXdoaWxlKG5hbWVfbGVuID4gMCkgeworCQkJCQlfX3UxNiB2YWx1ZV9sZW47CisJCQkJCW5hbWVfbGVuIC09IDQ7CisJCQkJCXRlbXBfcHRyICs9IDQ7CisJCQkJCXJjICs9IHRlbXBfZmVhLT5uYW1lX2xlbjsKKwkJCQkvKiBhY2NvdW50IGZvciBwcmVmaXggdXNlci4gYW5kIHRyYWlsaW5nIG51bGwgKi8KKwkJCQkJcmMgPSByYyArIDUgKyAxOyAKKwkJCQkJaWYocmM8KGludClidWZfc2l6ZSkgeworCQkJCQkJbWVtY3B5KEVBRGF0YSwidXNlci4iLDUpOworCQkJCQkJRUFEYXRhKz01OworCQkJCQkJbWVtY3B5KEVBRGF0YSx0ZW1wX3B0cix0ZW1wX2ZlYS0+bmFtZV9sZW4pOworCQkJCQkJRUFEYXRhKz10ZW1wX2ZlYS0+bmFtZV9sZW47CisJCQkJCQkvKiBudWxsIHRlcm1pbmF0ZSBuYW1lICovCisJCQkJCQkqRUFEYXRhID0gMDsKKwkJCQkJCUVBRGF0YSA9IEVBRGF0YSArIDE7CisJCQkJCX0gZWxzZSBpZihidWZfc2l6ZSA9PSAwKSB7CisJCQkJCQkvKiBza2lwIGNvcHkgLSBjYWxjIHNpemUgb25seSAqLworCQkJCQl9IGVsc2UgeworCQkJCQkJLyogc3RvcCBiZWZvcmUgb3ZlcnJ1biBidWZmZXIgKi8KKwkJCQkJCXJjID0gLUVSQU5HRTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCW5hbWVfbGVuIC09IHRlbXBfZmVhLT5uYW1lX2xlbjsKKwkJCQkJdGVtcF9wdHIgKz0gdGVtcF9mZWEtPm5hbWVfbGVuOworCQkJCQkvKiBhY2NvdW50IGZvciB0cmFpbGluZyBudWxsICovCisJCQkJCW5hbWVfbGVuLS07CisJCQkJCXRlbXBfcHRyKys7CisJCQkJCXZhbHVlX2xlbiA9IGxlMTZfdG9fY3B1KHRlbXBfZmVhLT52YWx1ZV9sZW4pOworCQkJCQluYW1lX2xlbiAtPSB2YWx1ZV9sZW47CisJCQkJCXRlbXBfcHRyICs9IHZhbHVlX2xlbjsKKwkJCQkJLyogQkIgY2hlY2sgdGhhdCB0ZW1wX3B0ciBpcyBzdGlsbCB3aXRoaW4gc21iIEJCKi8KKwkJCQkvKiBubyB0cmFpbGluZyBudWxsIHRvIGFjY291bnQgZm9yIGluIHZhbHVlIGxlbiAqLworCQkJCQkvKiBnbyBvbiB0byBuZXh0IEVBICovCisJCQkJCXRlbXBfZmVhID0gKHN0cnVjdCBmZWEgKil0ZW1wX3B0cjsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYgKHBTTUIpCisJCWNpZnNfYnVmX3JlbGVhc2UocFNNQik7CisJaWYgKHJjID09IC1FQUdBSU4pCisJCWdvdG8gUUFsbEVBc1JldHJ5OworCisJcmV0dXJuIChzc2l6ZV90KXJjOworfQorCitzc2l6ZV90IENJRlNTTUJRdWVyeUVBKGNvbnN0IGludCB4aWQsc3RydWN0IGNpZnNUY29uSW5mbyAqIHRjb24sCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKiBzZWFyY2hOYW1lLGNvbnN0IHVuc2lnbmVkIGNoYXIgKiBlYV9uYW1lLAorCQl1bnNpZ25lZCBjaGFyICogZWFfdmFsdWUsIHNpemVfdCBidWZfc2l6ZSwgCisJCWNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSkKK3sKKwlUUkFOU0FDVElPTjJfUVBJX1JFUSAqcFNNQiA9IE5VTEw7CisJVFJBTlNBQ1RJT04yX1FQSV9SU1AgKnBTTUJyID0gTlVMTDsKKwlpbnQgcmMgPSAwOworCWludCBieXRlc19yZXR1cm5lZDsKKwlpbnQgbmFtZV9sZW47CisJc3RydWN0IGZlYSAqIHRlbXBfZmVhOworCWNoYXIgKiB0ZW1wX3B0cjsKKwlfX3UxNiBwYXJhbXMsIGJ5dGVfY291bnQ7CisKKwljRllJKDEsICgiSW4gUXVlcnkgRUEgcGF0aCAlcyIsIHNlYXJjaE5hbWUpKTsKK1FFQVJldHJ5OgorCXJjID0gc21iX2luaXQoU01CX0NPTV9UUkFOU0FDVElPTjIsIDE1LCB0Y29uLCAodm9pZCAqKikgJnBTTUIsCisJCSAgICAgICh2b2lkICoqKSAmcFNNQnIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJaWYgKHBTTUItPmhkci5GbGFnczIgJiBTTUJGTEcyX1VOSUNPREUpIHsKKwkJbmFtZV9sZW4gPQorCQkgICAgY2lmc19zdHJ0b1VDUygod2NoYXJfdCAqKSBwU01CLT5GaWxlTmFtZSwgc2VhcmNoTmFtZSwgUEFUSF9NQVgKKwkJCQkgIC8qIGZpbmQgZGVmaW5lIGZvciB0aGlzIG1heHBhdGhjb21wb25lbnQgKi8KKwkJCQkgICwgbmxzX2NvZGVwYWdlKTsKKwkJbmFtZV9sZW4rKzsJLyogdHJhaWxpbmcgbnVsbCAqLworCQluYW1lX2xlbiAqPSAyOworCX0gZWxzZSB7CS8qIEJCIGltcHJvdmUgdGhlIGNoZWNrIGZvciBidWZmZXIgb3ZlcnJ1bnMgQkIgKi8KKwkJbmFtZV9sZW4gPSBzdHJubGVuKHNlYXJjaE5hbWUsIFBBVEhfTUFYKTsKKwkJbmFtZV9sZW4rKzsJLyogdHJhaWxpbmcgbnVsbCAqLworCQlzdHJuY3B5KHBTTUItPkZpbGVOYW1lLCBzZWFyY2hOYW1lLCBuYW1lX2xlbik7CisJfQorCisJcGFyYW1zID0gMiAvKiBsZXZlbCAqLyArIDQgLyogcmVzZXJ2ZWQgKi8gKyBuYW1lX2xlbiAvKiBpbmNsdWRlcyBOVUwgKi8gOworCXBTTUItPlRvdGFsRGF0YUNvdW50ID0gMDsKKwlwU01CLT5NYXhQYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KDIpOworCXBTTUItPk1heERhdGFDb3VudCA9IGNwdV90b19sZTE2KDQwMDApOwkvKiBCQiBmaW5kIGV4YWN0IG1heCBTTUIgUERVIGZyb20gc2VzcyBzdHJ1Y3R1cmUgQkIgKi8KKwlwU01CLT5NYXhTZXR1cENvdW50ID0gMDsKKwlwU01CLT5SZXNlcnZlZCA9IDA7CisJcFNNQi0+RmxhZ3MgPSAwOworCXBTTUItPlRpbWVvdXQgPSAwOworCXBTTUItPlJlc2VydmVkMiA9IDA7CisJcFNNQi0+UGFyYW1ldGVyT2Zmc2V0ID0gY3B1X3RvX2xlMTYob2Zmc2V0b2YoCisgICAgICAgIHN0cnVjdCBzbWJfY29tX3RyYW5zYWN0aW9uMl9xcGlfcmVxICxJbmZvcm1hdGlvbkxldmVsKSAtIDQpOworCXBTTUItPkRhdGFDb3VudCA9IDA7CisJcFNNQi0+RGF0YU9mZnNldCA9IDA7CisJcFNNQi0+U2V0dXBDb3VudCA9IDE7CisJcFNNQi0+UmVzZXJ2ZWQzID0gMDsKKwlwU01CLT5TdWJDb21tYW5kID0gY3B1X3RvX2xlMTYoVFJBTlMyX1FVRVJZX1BBVEhfSU5GT1JNQVRJT04pOworCWJ5dGVfY291bnQgPSBwYXJhbXMgKyAxIC8qIHBhZCAqLyA7CisJcFNNQi0+VG90YWxQYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KHBhcmFtcyk7CisJcFNNQi0+UGFyYW1ldGVyQ291bnQgPSBwU01CLT5Ub3RhbFBhcmFtZXRlckNvdW50OworCXBTTUItPkluZm9ybWF0aW9uTGV2ZWwgPSBjcHVfdG9fbGUxNihTTUJfSU5GT19RVUVSWV9BTExfRUFTKTsKKwlwU01CLT5SZXNlcnZlZDQgPSAwOworCXBTTUItPmhkci5zbWJfYnVmX2xlbmd0aCArPSBieXRlX2NvdW50OworCXBTTUItPkJ5dGVDb3VudCA9IGNwdV90b19sZTE2KGJ5dGVfY291bnQpOworCisJcmMgPSBTZW5kUmVjZWl2ZSh4aWQsIHRjb24tPnNlcywgKHN0cnVjdCBzbWJfaGRyICopIHBTTUIsCisJCQkgKHN0cnVjdCBzbWJfaGRyICopIHBTTUJyLCAmYnl0ZXNfcmV0dXJuZWQsIDApOworCWlmIChyYykgeworCQljRllJKDEsICgiU2VuZCBlcnJvciBpbiBRdWVyeSBFQSA9ICVkIiwgcmMpKTsKKwl9IGVsc2UgewkJLyogZGVjb2RlIHJlc3BvbnNlICovCisJCXJjID0gdmFsaWRhdGVfdDIoKHN0cnVjdCBzbWJfdDJfcnNwICopcFNNQnIpOworCisJCS8qIEJCIGFsc28gY2hlY2sgZW5vdWdoIHRvdGFsIGJ5dGVzIHJldHVybmVkICovCisJCS8qIEJCIHdlIG5lZWQgdG8gaW1wcm92ZSB0aGUgdmFsaWRpdHkgY2hlY2tpbmcKKwkJb2YgdGhlc2UgdHJhbnMyIHJlc3BvbnNlcyAqLworCQlpZiAocmMgfHwgKHBTTUJyLT5CeXRlQ291bnQgPCA0KSkgCisJCQlyYyA9IC1FSU87CS8qIGJhZCBzbWIgKi8KKwkgICAvKiBlbHNlIGlmIChwRmluZERhdGEpeworCQkJbWVtY3B5KChjaGFyICopIHBGaW5kRGF0YSwKKwkJCSAgICAgICAoY2hhciAqKSAmcFNNQnItPmhkci5Qcm90b2NvbCArCisJCQkgICAgICAgZGF0YV9vZmZzZXQsIGtsKTsKKwkJfSovIGVsc2UgeworCQkJLyogY2hlY2sgdGhhdCBsZW5ndGggb2YgbGlzdCBpcyBub3QgbW9yZSB0aGFuIGJjYyAqLworCQkJLyogY2hlY2sgdGhhdCBlYWNoIGVudHJ5IGRvZXMgbm90IGdvIGJleW9uZCBsZW5ndGgKKwkJCSAgIG9mIGxpc3QgKi8KKwkJCS8qIGNoZWNrIHRoYXQgZWFjaCBlbGVtZW50IG9mIGVhY2ggZW50cnkgZG9lcyBub3QKKwkJCSAgIGdvIGJleW9uZCBlbmQgb2YgbGlzdCAqLworCQkJX191MTYgZGF0YV9vZmZzZXQgPSBsZTE2X3RvX2NwdShwU01Cci0+dDIuRGF0YU9mZnNldCk7CisJCQlzdHJ1Y3QgZmVhbGlzdCAqIGVhX3Jlc3BvbnNlX2RhdGE7CisJCQlyYyA9IC1FTk9EQVRBOworCQkJLyogdmFsaWRhdGVfdHJhbnMyX29mZnNldHMoKSAqLworCQkJLyogQkIgdG8gY2hlY2sgaWYoc3RhcnQgb2Ygc21iICsgZGF0YV9vZmZzZXQgPiAmYmNjKyBiY2MpKi8KKwkJCWVhX3Jlc3BvbnNlX2RhdGEgPSAoc3RydWN0IGZlYWxpc3QgKikKKwkJCQkoKChjaGFyICopICZwU01Cci0+aGRyLlByb3RvY29sKSArCisJCQkJZGF0YV9vZmZzZXQpOworCQkJbmFtZV9sZW4gPSBsZTMyX3RvX2NwdShlYV9yZXNwb25zZV9kYXRhLT5saXN0X2xlbik7CisJCQljRllJKDEsKCJlYSBsZW5ndGggJWQiLCBuYW1lX2xlbikpOworCQkJaWYobmFtZV9sZW4gPD0gOCkgeworCQkJLyogcmV0dXJuZWQgRUEgc2l6ZSB6ZXJvZWQgYXQgdG9wIG9mIGZ1bmN0aW9uICovCisJCQkJY0ZZSSgxLCgiZW1wdHkgRUEgbGlzdCByZXR1cm5lZCBmcm9tIHNlcnZlciIpKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogYWNjb3VudCBmb3IgZWEgbGlzdCBsZW4gKi8KKwkJCQluYW1lX2xlbiAtPSA0OworCQkJCXRlbXBfZmVhID0gZWFfcmVzcG9uc2VfZGF0YS0+bGlzdDsKKwkJCQl0ZW1wX3B0ciA9IChjaGFyICopdGVtcF9mZWE7CisJCQkJLyogbG9vcCB0aHJvdWdoIGNoZWNraW5nIGlmIHdlIGhhdmUgYSBtYXRjaGluZworCQkJCW5hbWUgYW5kIHRoZW4gcmV0dXJuIHRoZSBhc3NvY2lhdGVkIHZhbHVlICovCisJCQkJd2hpbGUobmFtZV9sZW4gPiAwKSB7CisJCQkJCV9fdTE2IHZhbHVlX2xlbjsKKwkJCQkJbmFtZV9sZW4gLT0gNDsKKwkJCQkJdGVtcF9wdHIgKz0gNDsKKwkJCQkJdmFsdWVfbGVuID0gbGUxNl90b19jcHUodGVtcF9mZWEtPnZhbHVlX2xlbik7CisJCQkJLyogQkIgdmFsaWRhdGUgdGhhdCB2YWx1ZV9sZW4gZmFsbHMgd2l0aGluIFNNQiwgCisJCQkJZXZlbiB0aG91Z2ggbWF4aW11bSBmb3IgbmFtZV9sZW4gaXMgMjU1ICovIAorCQkJCQlpZihtZW1jbXAodGVtcF9mZWEtPm5hbWUsZWFfbmFtZSwKKwkJCQkJCSAgdGVtcF9mZWEtPm5hbWVfbGVuKSA9PSAwKSB7CisJCQkJCQkvKiBmb3VuZCBhIG1hdGNoICovCisJCQkJCQlyYyA9IHZhbHVlX2xlbjsKKwkJCQkvKiBhY2NvdW50IGZvciBwcmVmaXggdXNlci4gYW5kIHRyYWlsaW5nIG51bGwgKi8KKwkJCQkJCWlmKHJjPD0oaW50KWJ1Zl9zaXplKSB7CisJCQkJCQkJbWVtY3B5KGVhX3ZhbHVlLAorCQkJCQkJCQl0ZW1wX2ZlYS0+bmFtZSt0ZW1wX2ZlYS0+bmFtZV9sZW4rMSwKKwkJCQkJCQkJcmMpOworCQkJCQkJCS8qIGVhIHZhbHVlcywgdW5saWtlIGVhIG5hbWVzLAorCQkJCQkJCWFyZSBub3QgbnVsbCB0ZXJtaW5hdGVkICovCisJCQkJCQl9IGVsc2UgaWYoYnVmX3NpemUgPT0gMCkgeworCQkJCQkJLyogc2tpcCBjb3B5IC0gY2FsYyBzaXplIG9ubHkgKi8KKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJLyogc3RvcCBiZWZvcmUgb3ZlcnJ1biBidWZmZXIgKi8KKwkJCQkJCQlyYyA9IC1FUkFOR0U7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQluYW1lX2xlbiAtPSB0ZW1wX2ZlYS0+bmFtZV9sZW47CisJCQkJCXRlbXBfcHRyICs9IHRlbXBfZmVhLT5uYW1lX2xlbjsKKwkJCQkJLyogYWNjb3VudCBmb3IgdHJhaWxpbmcgbnVsbCAqLworCQkJCQluYW1lX2xlbi0tOworCQkJCQl0ZW1wX3B0cisrOworCQkJCQluYW1lX2xlbiAtPSB2YWx1ZV9sZW47CisJCQkJCXRlbXBfcHRyICs9IHZhbHVlX2xlbjsKKwkJCQkvKiBubyB0cmFpbGluZyBudWxsIHRvIGFjY291bnQgZm9yIGluIHZhbHVlIGxlbiAqLworCQkJCQkvKiBnbyBvbiB0byBuZXh0IEVBICovCisJCQkJCXRlbXBfZmVhID0gKHN0cnVjdCBmZWEgKil0ZW1wX3B0cjsKKwkJCQl9CisJCQl9IAorCQl9CisJfQorCWlmIChwU01CKQorCQljaWZzX2J1Zl9yZWxlYXNlKHBTTUIpOworCWlmIChyYyA9PSAtRUFHQUlOKQorCQlnb3RvIFFFQVJldHJ5OworCisJcmV0dXJuIChzc2l6ZV90KXJjOworfQorCitpbnQKK0NJRlNTTUJTZXRFQShjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLCBjb25zdCBjaGFyICpmaWxlTmFtZSwKKwkJY29uc3QgY2hhciAqIGVhX25hbWUsIGNvbnN0IHZvaWQgKiBlYV92YWx1ZSwgCisJCWNvbnN0IF9fdTE2IGVhX3ZhbHVlX2xlbiwgY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworCXN0cnVjdCBzbWJfY29tX3RyYW5zYWN0aW9uMl9zcGlfcmVxICpwU01CID0gTlVMTDsKKwlzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbjJfc3BpX3JzcCAqcFNNQnIgPSBOVUxMOworCXN0cnVjdCBmZWFsaXN0ICpwYXJtX2RhdGE7CisJaW50IG5hbWVfbGVuOworCWludCByYyA9IDA7CisJaW50IGJ5dGVzX3JldHVybmVkID0gMDsKKwlfX3UxNiBwYXJhbXMsIHBhcmFtX29mZnNldCwgYnl0ZV9jb3VudCwgb2Zmc2V0LCBjb3VudDsKKworCWNGWUkoMSwgKCJJbiBTZXRFQSIpKTsKK1NldEVBUmV0cnk6CisJcmMgPSBzbWJfaW5pdChTTUJfQ09NX1RSQU5TQUNUSU9OMiwgMTUsIHRjb24sICh2b2lkICoqKSAmcFNNQiwKKwkJICAgICAgKHZvaWQgKiopICZwU01Ccik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlpZiAocFNNQi0+aGRyLkZsYWdzMiAmIFNNQkZMRzJfVU5JQ09ERSkgeworCQluYW1lX2xlbiA9CisJCSAgICBjaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIHBTTUItPkZpbGVOYW1lLCBmaWxlTmFtZSwgUEFUSF9NQVgKKwkJCQkgIC8qIGZpbmQgZGVmaW5lIGZvciB0aGlzIG1heHBhdGhjb21wb25lbnQgKi8KKwkJCQkgICwgbmxzX2NvZGVwYWdlKTsKKwkJbmFtZV9sZW4rKzsJLyogdHJhaWxpbmcgbnVsbCAqLworCQluYW1lX2xlbiAqPSAyOworCX0gZWxzZSB7CQkvKiBCQiBpbXByb3ZlIHRoZSBjaGVjayBmb3IgYnVmZmVyIG92ZXJydW5zIEJCICovCisJCW5hbWVfbGVuID0gc3RybmxlbihmaWxlTmFtZSwgUEFUSF9NQVgpOworCQluYW1lX2xlbisrOwkvKiB0cmFpbGluZyBudWxsICovCisJCXN0cm5jcHkocFNNQi0+RmlsZU5hbWUsIGZpbGVOYW1lLCBuYW1lX2xlbik7CisJfQorCisJcGFyYW1zID0gNiArIG5hbWVfbGVuOworCisJLyogZG9uZSBjYWxjdWxhdGluZyBwYXJtcyB1c2luZyBuYW1lX2xlbiBvZiBmaWxlIG5hbWUsCisJbm93IHVzZSBuYW1lX2xlbiB0byBjYWxjdWxhdGUgbGVuZ3RoIG9mIGVhIG5hbWUKKwl3ZSBhcmUgZ29pbmcgdG8gY3JlYXRlIGluIHRoZSBpbm9kZSB4YXR0cnMgKi8KKwlpZihlYV9uYW1lID09IE5VTEwpCisJCW5hbWVfbGVuID0gMDsKKwllbHNlCisJCW5hbWVfbGVuID0gc3RybmxlbihlYV9uYW1lLDI1NSk7CisKKwljb3VudCA9IHNpemVvZigqcGFybV9kYXRhKSArIGVhX3ZhbHVlX2xlbiArIG5hbWVfbGVuICsgMTsKKwlwU01CLT5NYXhQYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KDIpOworCXBTTUItPk1heERhdGFDb3VudCA9IGNwdV90b19sZTE2KDEwMDApOwkvKiBCQiBmaW5kIG1heCBTTUIgc2l6ZSBmcm9tIHNlc3MgKi8KKwlwU01CLT5NYXhTZXR1cENvdW50ID0gMDsKKwlwU01CLT5SZXNlcnZlZCA9IDA7CisJcFNNQi0+RmxhZ3MgPSAwOworCXBTTUItPlRpbWVvdXQgPSAwOworCXBTTUItPlJlc2VydmVkMiA9IDA7CisJcGFyYW1fb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHNtYl9jb21fdHJhbnNhY3Rpb24yX3NwaV9yZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb25MZXZlbCkgLSA0OworCW9mZnNldCA9IHBhcmFtX29mZnNldCArIHBhcmFtczsKKwlwU01CLT5JbmZvcm1hdGlvbkxldmVsID0KKwkJY3B1X3RvX2xlMTYoU01CX1NFVF9GSUxFX0VBKTsKKworCXBhcm1fZGF0YSA9CisJCShzdHJ1Y3QgZmVhbGlzdCAqKSAoKChjaGFyICopICZwU01CLT5oZHIuUHJvdG9jb2wpICsKKwkJCQkgICAgICAgb2Zmc2V0KTsKKwlwU01CLT5QYXJhbWV0ZXJPZmZzZXQgPSBjcHVfdG9fbGUxNihwYXJhbV9vZmZzZXQpOworCXBTTUItPkRhdGFPZmZzZXQgPSBjcHVfdG9fbGUxNihvZmZzZXQpOworCXBTTUItPlNldHVwQ291bnQgPSAxOworCXBTTUItPlJlc2VydmVkMyA9IDA7CisJcFNNQi0+U3ViQ29tbWFuZCA9IGNwdV90b19sZTE2KFRSQU5TMl9TRVRfUEFUSF9JTkZPUk1BVElPTik7CisJYnl0ZV9jb3VudCA9IDMgLyogcGFkICovICArIHBhcmFtcyArIGNvdW50OworCXBTTUItPkRhdGFDb3VudCA9IGNwdV90b19sZTE2KGNvdW50KTsKKwlwYXJtX2RhdGEtPmxpc3RfbGVuID0gY3B1X3RvX2xlMzIoY291bnQpOworCXBhcm1fZGF0YS0+bGlzdFswXS5FQV9mbGFncyA9IDA7CisJLyogd2UgY2hlY2tlZCBhYm92ZSB0aGF0IG5hbWUgbGVuIGlzIGxlc3MgdGhhbiAyNTUgKi8KKwlwYXJtX2RhdGEtPmxpc3RbMF0ubmFtZV9sZW4gPSAoX191OCluYW1lX2xlbjs7CisJLyogRUEgbmFtZXMgYXJlIGFsd2F5cyBBU0NJSSAqLworCWlmKGVhX25hbWUpCisJCXN0cm5jcHkocGFybV9kYXRhLT5saXN0WzBdLm5hbWUsZWFfbmFtZSxuYW1lX2xlbik7CisJcGFybV9kYXRhLT5saXN0WzBdLm5hbWVbbmFtZV9sZW5dID0gMDsKKwlwYXJtX2RhdGEtPmxpc3RbMF0udmFsdWVfbGVuID0gY3B1X3RvX2xlMTYoZWFfdmFsdWVfbGVuKTsKKwkvKiBjYWxsZXIgZW5zdXJlcyB0aGF0IGVhX3ZhbHVlX2xlbiBpcyBsZXNzIHRoYW4gNjRLIGJ1dAorCXdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgaXQgZml0cyB3aXRoaW4gdGhlIHNtYiAqLworCisJLypCQiBhZGQgbGVuZ3RoIGNoZWNrIHRoYXQgaXQgd291bGQgZml0IGluIG5lZ290aWF0ZWQgU01CIGJ1ZmZlciBzaXplIEJCICovCisJLyogaWYoZWFfdmFsdWVfbGVuID4gYnVmZmVyX3NpemUgLSA1MTIgKGVub3VnaCBmb3IgaGVhZGVyKSkgKi8KKwlpZihlYV92YWx1ZV9sZW4pCisJCW1lbWNweShwYXJtX2RhdGEtPmxpc3RbMF0ubmFtZStuYW1lX2xlbisxLGVhX3ZhbHVlLGVhX3ZhbHVlX2xlbik7CisKKwlwU01CLT5Ub3RhbERhdGFDb3VudCA9IHBTTUItPkRhdGFDb3VudDsKKwlwU01CLT5QYXJhbWV0ZXJDb3VudCA9IGNwdV90b19sZTE2KHBhcmFtcyk7CisJcFNNQi0+VG90YWxQYXJhbWV0ZXJDb3VudCA9IHBTTUItPlBhcmFtZXRlckNvdW50OworCXBTTUItPlJlc2VydmVkNCA9IDA7CisJcFNNQi0+aGRyLnNtYl9idWZfbGVuZ3RoICs9IGJ5dGVfY291bnQ7CisJcFNNQi0+Qnl0ZUNvdW50ID0gY3B1X3RvX2xlMTYoYnl0ZV9jb3VudCk7CisJcmMgPSBTZW5kUmVjZWl2ZSh4aWQsIHRjb24tPnNlcywgKHN0cnVjdCBzbWJfaGRyICopIHBTTUIsCisJCQkgKHN0cnVjdCBzbWJfaGRyICopIHBTTUJyLCAmYnl0ZXNfcmV0dXJuZWQsIDApOworCWlmIChyYykgeworCQljRllJKDEsICgiU2V0UGF0aEluZm8gKEVBKSByZXR1cm5lZCAlZCIsIHJjKSk7CisJfQorCisJY2lmc19idWZfcmVsZWFzZShwU01CKTsKKworCWlmIChyYyA9PSAtRUFHQUlOKQorCQlnb3RvIFNldEVBUmV0cnk7CisKKwlyZXR1cm4gcmM7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jb25uZWN0LmMgYi9mcy9jaWZzL2Nvbm5lY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDQ3MGI5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9jb25uZWN0LmMKQEAgLTAsMCArMSwzMDY0IEBACisvKgorICogICBmcy9jaWZzL2Nvbm5lY3QuYworICoKKyAqICAgQ29weXJpZ2h0IChDKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzICBDb3JwLiwgMjAwMiwyMDA0CisgKiAgIEF1dGhvcihzKTogU3RldmUgRnJlbmNoIChzZnJlbmNoQHVzLmlibS5jb20pCisgKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EgCisgKi8KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1wb29sLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSAiY2lmc3BkdS5oIgorI2luY2x1ZGUgImNpZnNnbG9iLmgiCisjaW5jbHVkZSAiY2lmc3Byb3RvLmgiCisjaW5jbHVkZSAiY2lmc191bmljb2RlLmgiCisjaW5jbHVkZSAiY2lmc19kZWJ1Zy5oIgorI2luY2x1ZGUgImNpZnNfZnNfc2IuaCIKKyNpbmNsdWRlICJudGxtc3NwLmgiCisjaW5jbHVkZSAibnRlcnIuaCIKKyNpbmNsdWRlICJyZmMxMDAycGR1LmgiCisKKyNkZWZpbmUgQ0lGU19QT1JUIDQ0NQorI2RlZmluZSBSRkMxMDAxX1BPUlQgMTM5CisKK2V4dGVybiB2b2lkIFNNQmVuY3J5cHQodW5zaWduZWQgY2hhciAqcGFzc3dkLCB1bnNpZ25lZCBjaGFyICpjOCwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgKnAyNCk7CitleHRlcm4gdm9pZCBTTUJOVGVuY3J5cHQodW5zaWduZWQgY2hhciAqcGFzc3dkLCB1bnNpZ25lZCBjaGFyICpjOCwKKwkJCSB1bnNpZ25lZCBjaGFyICpwMjQpOworCitleHRlcm4gbWVtcG9vbF90ICpjaWZzX3JlcV9wb29scDsKKworc3RydWN0IHNtYl92b2wgeworCWNoYXIgKnVzZXJuYW1lOworCWNoYXIgKnBhc3N3b3JkOworCWNoYXIgKmRvbWFpbm5hbWU7CisJY2hhciAqVU5DOworCWNoYXIgKlVOQ2lwOworCWNoYXIgKmluNl9hZGRyOyAgLyogaXB2NiBhZGRyZXNzIGFzIGh1bWFuIHJlYWRhYmxlIGZvcm0gb2YgaW42X2FkZHIgKi8KKwljaGFyICppb2NoYXJzZXQ7ICAvKiBsb2NhbCBjb2RlIHBhZ2UgZm9yIG1hcHBpbmcgdG8gYW5kIGZyb20gVW5pY29kZSAqLworCWNoYXIgc291cmNlX3JmYzEwMDFfbmFtZVsxNl07IC8qIG5ldGJpb3MgbmFtZSBvZiBjbGllbnQgKi8KKwl1aWRfdCBsaW51eF91aWQ7CisJZ2lkX3QgbGludXhfZ2lkOworCW1vZGVfdCBmaWxlX21vZGU7CisJbW9kZV90IGRpcl9tb2RlOworCXVuc2lnbmVkIHJ3OjE7CisJdW5zaWduZWQgcmV0cnk6MTsKKwl1bnNpZ25lZCBpbnRyOjE7CisJdW5zaWduZWQgc2V0dWlkczoxOworCXVuc2lnbmVkIG5vcGVybToxOworCXVuc2lnbmVkIG5vX3BzeF9hY2w6MTsgLyogc2V0IGlmIHBvc2l4IGFjbCBzdXBwb3J0IHNob3VsZCBiZSBkaXNhYmxlZCAqLworCXVuc2lnbmVkIG5vX3hhdHRyOjE7ICAgLyogc2V0IGlmIHhhdHRyIChFQSkgc3VwcG9ydCBzaG91bGQgYmUgZGlzYWJsZWQqLworCXVuc2lnbmVkIHNlcnZlcl9pbm86MTsgLyogdXNlIGlub2RlIG51bWJlcnMgZnJvbSBzZXJ2ZXIgaWUgVW5pcXVlSWQgKi8KKwl1bnNpZ25lZCBkaXJlY3RfaW86MTsKKwl1bnNpZ25lZCBpbnQgcnNpemU7CisJdW5zaWduZWQgaW50IHdzaXplOworCXVuc2lnbmVkIGludCBzb2Nrb3B0OworCXVuc2lnbmVkIHNob3J0IGludCBwb3J0OworfTsKKworc3RhdGljIGludCBpcHY0X2Nvbm5lY3Qoc3RydWN0IHNvY2thZGRyX2luICpwc2luX3NlcnZlciwgCisJCQlzdHJ1Y3Qgc29ja2V0ICoqY3NvY2tldCwKKwkJCWNoYXIgKiBuZXRiX25hbWUpOworc3RhdGljIGludCBpcHY2X2Nvbm5lY3Qoc3RydWN0IHNvY2thZGRyX2luNiAqcHNpbl9zZXJ2ZXIsIAorCQkJc3RydWN0IHNvY2tldCAqKmNzb2NrZXQpOworCisKKwkvKiAKKwkgKiBjaWZzIHRjcCBzZXNzaW9uIHJlY29ubmVjdGlvbgorCSAqIAorCSAqIG1hcmsgdGNwIHNlc3Npb24gYXMgcmVjb25uZWN0aW5nIHNvIHRlbXBvcmFyaWx5IGxvY2tlZAorCSAqIG1hcmsgYWxsIHNtYiBzZXNzaW9ucyBhcyByZWNvbm5lY3RpbmcgZm9yIHRjcCBzZXNzaW9uCisJICogcmVjb25uZWN0IHRjcCBzZXNzaW9uCisJICogd2FrZSB1cCB3YWl0ZXJzIG9uIHJlY29ubmVjdGlvbj8gLSAobm90IG5lZWRlZCBjdXJyZW50bHkpCisJICovCisKK2ludAorY2lmc19yZWNvbm5lY3Qoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyKQoreworCWludCByYyA9IDA7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCXN0cnVjdCBjaWZzU2VzSW5mbyAqc2VzOworCXN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb247CisJc3RydWN0IG1pZF9xX2VudHJ5ICogbWlkX2VudHJ5OworCQorCXNwaW5fbG9jaygmR2xvYmFsTWlkX0xvY2spOworCWlmKHNlcnZlci0+dGNwU3RhdHVzID09IENpZnNFeGl0aW5nKSB7CisJCS8qIHRoZSBkZW11eCB0aHJlYWQgd2lsbCBleGl0IG5vcm1hbGx5IAorCQluZXh0IHRpbWUgdGhyb3VnaCB0aGUgbG9vcCAqLworCQlzcGluX3VubG9jaygmR2xvYmFsTWlkX0xvY2spOworCQlyZXR1cm4gcmM7CisJfSBlbHNlCisJCXNlcnZlci0+dGNwU3RhdHVzID0gQ2lmc05lZWRSZWNvbm5lY3Q7CisJc3Bpbl91bmxvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwlzZXJ2ZXItPm1heEJ1ZiA9IDA7CisKKwljRllJKDEsICgiUmVjb25uZWN0aW5nIHRjcCBzZXNzaW9uICIpKTsKKworCS8qIGJlZm9yZSByZWNvbm5lY3RpbmcgdGhlIHRjcCBzZXNzaW9uLCBtYXJrIHRoZSBzbWIgc2Vzc2lvbiAodWlkKQorCQlhbmQgdGhlIHRpZCBiYWQgc28gdGhleSBhcmUgbm90IHVzZWQgdW50aWwgcmVjb25uZWN0ZWQgKi8KKwlyZWFkX2xvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCWxpc3RfZm9yX2VhY2godG1wLCAmR2xvYmFsU01CU2Vzc2lvbkxpc3QpIHsKKwkJc2VzID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBjaWZzU2VzSW5mbywgY2lmc1Nlc3Npb25MaXN0KTsKKwkJaWYgKHNlcy0+c2VydmVyKSB7CisJCQlpZiAoc2VzLT5zZXJ2ZXIgPT0gc2VydmVyKSB7CisJCQkJc2VzLT5zdGF0dXMgPSBDaWZzTmVlZFJlY29ubmVjdDsKKwkJCQlzZXMtPmlwY190aWQgPSAwOworCQkJfQorCQl9CisJCS8qIGVsc2UgdGNwIGFuZCBzbWIgc2Vzc2lvbnMgbmVlZCByZWNvbm5lY3Rpb24gKi8KKwl9CisJbGlzdF9mb3JfZWFjaCh0bXAsICZHbG9iYWxUcmVlQ29ubmVjdGlvbkxpc3QpIHsKKwkJdGNvbiA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvLCBjaWZzQ29ubmVjdGlvbkxpc3QpOworCQlpZigodGNvbikgJiYgKHRjb24tPnNlcykgJiYgKHRjb24tPnNlcy0+c2VydmVyID09IHNlcnZlcikpIHsKKwkJCXRjb24tPnRpZFN0YXR1cyA9IENpZnNOZWVkUmVjb25uZWN0OworCQl9CisJfQorCXJlYWRfdW5sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKwkvKiBkbyBub3Qgd2FudCB0byBiZSBzZW5kaW5nIGRhdGEgb24gYSBzb2NrZXQgd2UgYXJlIGZyZWVpbmcgKi8KKwlkb3duKCZzZXJ2ZXItPnRjcFNlbSk7IAorCWlmKHNlcnZlci0+c3NvY2tldCkgeworCQljRllJKDEsKCJTdGF0ZTogMHgleCBGbGFnczogMHglbHgiLCBzZXJ2ZXItPnNzb2NrZXQtPnN0YXRlLAorCQkJc2VydmVyLT5zc29ja2V0LT5mbGFncykpOworCQlzZXJ2ZXItPnNzb2NrZXQtPm9wcy0+c2h1dGRvd24oc2VydmVyLT5zc29ja2V0LFNFTkRfU0hVVERPV04pOworCQljRllJKDEsKCJQb3N0IHNodXRkb3duIHN0YXRlOiAweCV4IEZsYWdzOiAweCVseCIsIHNlcnZlci0+c3NvY2tldC0+c3RhdGUsCisJCQlzZXJ2ZXItPnNzb2NrZXQtPmZsYWdzKSk7CisJCXNvY2tfcmVsZWFzZShzZXJ2ZXItPnNzb2NrZXQpOworCQlzZXJ2ZXItPnNzb2NrZXQgPSBOVUxMOworCX0KKworCXNwaW5fbG9jaygmR2xvYmFsTWlkX0xvY2spOworCWxpc3RfZm9yX2VhY2godG1wLCAmc2VydmVyLT5wZW5kaW5nX21pZF9xKSB7CisJCW1pZF9lbnRyeSA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QKKwkJCQkJbWlkX3FfZW50cnksCisJCQkJCXFoZWFkKTsKKwkJaWYobWlkX2VudHJ5KSB7CisJCQlpZihtaWRfZW50cnktPm1pZFN0YXRlID09IE1JRF9SRVFVRVNUX1NVQk1JVFRFRCkgeworCQkJCS8qIE1hcmsgb3RoZXIgaW50cmFuc2l0IHJlcXVlc3RzIGFzIG5lZWRpbmcgcmV0cnkgc28gCisJCQkJICB3ZSBkbyBub3QgaW1tZWRpYXRlbHkgbWFyayB0aGUgc2Vzc2lvbiBiYWQgYWdhaW4gCisJCQkJICAoaWUgYWZ0ZXIgd2UgcmVjb25uZWN0IGJlbG93KSBhcyB0aGV5IHRpbWVvdXQgdG9vICovCisJCQkJbWlkX2VudHJ5LT5taWRTdGF0ZSA9IE1JRF9SRVRSWV9ORUVERUQ7CisJCQl9CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwl1cCgmc2VydmVyLT50Y3BTZW0pOyAKKworCXdoaWxlICgoc2VydmVyLT50Y3BTdGF0dXMgIT0gQ2lmc0V4aXRpbmcpICYmIChzZXJ2ZXItPnRjcFN0YXR1cyAhPSBDaWZzR29vZCkpCisJeworCQlpZihzZXJ2ZXItPnByb3RvY29sVHlwZSA9PSBJUFY2KSB7CisJCQlyYyA9IGlwdjZfY29ubmVjdCgmc2VydmVyLT5hZGRyLnNvY2tBZGRyNiwmc2VydmVyLT5zc29ja2V0KTsKKwkJfSBlbHNlIHsKKwkJCXJjID0gaXB2NF9jb25uZWN0KCZzZXJ2ZXItPmFkZHIuc29ja0FkZHIsIAorCQkJCQkmc2VydmVyLT5zc29ja2V0LAorCQkJCQlzZXJ2ZXItPndvcmtzdGF0aW9uX1JGQzEwMDFfbmFtZSk7CisJCX0KKwkJaWYocmMpIHsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV90aW1lb3V0KDMgKiBIWik7CisJCX0gZWxzZSB7CisJCQlhdG9taWNfaW5jKCZ0Y3BTZXNSZWNvbm5lY3RDb3VudCk7CisJCQlzcGluX2xvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwkJCWlmKHNlcnZlci0+dGNwU3RhdHVzICE9IENpZnNFeGl0aW5nKQorCQkJCXNlcnZlci0+dGNwU3RhdHVzID0gQ2lmc0dvb2Q7CisJCQlzcGluX3VubG9jaygmR2xvYmFsTWlkX0xvY2spOworCS8qCQlhdG9taWNfc2V0KCZzZXJ2ZXItPmluRmxpZ2h0LDApOyovCisJCQl3YWtlX3VwKCZzZXJ2ZXItPnJlc3BvbnNlX3EpOworCQl9CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIGludAorY2lmc19kZW11bHRpcGxleF90aHJlYWQoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyKQoreworCWludCBsZW5ndGg7CisJdW5zaWduZWQgaW50IHBkdV9sZW5ndGgsIHRvdGFsX3JlYWQ7CisJc3RydWN0IHNtYl9oZHIgKnNtYl9idWZmZXIgPSBOVUxMOworCXN0cnVjdCBtc2doZHIgc21iX21zZzsKKwlzdHJ1Y3Qga3ZlYyBpb3Y7CisJc3RydWN0IHNvY2tldCAqY3NvY2tldCA9IHNlcnZlci0+c3NvY2tldDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisJc3RydWN0IGNpZnNTZXNJbmZvICpzZXM7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrX3RvX3dha2UgPSBOVUxMOworCXN0cnVjdCBtaWRfcV9lbnRyeSAqbWlkX2VudHJ5OworCWNoYXIgKnRlbXA7CisKKwlkYWVtb25pemUoImNpZnNkIik7CisJYWxsb3dfc2lnbmFsKFNJR0tJTEwpOworCWN1cnJlbnQtPmZsYWdzIHw9IFBGX01FTUFMTE9DOworCXNlcnZlci0+dHNrID0gY3VycmVudDsJLyogc2F2ZSBwcm9jZXNzIGluZm8gdG8gd2FrZSBhdCBzaHV0ZG93biAqLworCWNGWUkoMSwgKCJEZW11bHRpcGxleCBQSUQ6ICVkIiwgY3VycmVudC0+cGlkKSk7CisJd3JpdGVfbG9jaygmR2xvYmFsU01CU2VzbG9jayk7IAorCWF0b21pY19pbmMoJnRjcFNlc0FsbG9jQ291bnQpOworCWxlbmd0aCA9IHRjcFNlc0FsbG9jQ291bnQuY291bnRlcjsKKwl3cml0ZV91bmxvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCWlmKGxlbmd0aCAgPiAxKSB7CisJCW1lbXBvb2xfcmVzaXplKGNpZnNfcmVxX3Bvb2xwLAorCQkJbGVuZ3RoICsgY2lmc19taW5fcmN2LAorCQkJR0ZQX0tFUk5FTCk7CisJfQorCisJd2hpbGUgKHNlcnZlci0+dGNwU3RhdHVzICE9IENpZnNFeGl0aW5nKSB7CisJCWlmIChzbWJfYnVmZmVyID09IE5VTEwpCisJCQlzbWJfYnVmZmVyID0gY2lmc19idWZfZ2V0KCk7CisJCWVsc2UKKwkJCW1lbXNldChzbWJfYnVmZmVyLCAwLCBzaXplb2YgKHN0cnVjdCBzbWJfaGRyKSk7CisKKwkJaWYgKHNtYl9idWZmZXIgPT0gTlVMTCkgeworCQkJY0VSUk9SKDEsKCJDYW4gbm90IGdldCBtZW1vcnkgZm9yIFNNQiByZXNwb25zZSIpKTsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV90aW1lb3V0KEhaICogMyk7IC8qIGdpdmUgc3lzdGVtIHRpbWUgdG8gZnJlZSBtZW1vcnkgKi8KKwkJCWNvbnRpbnVlOworCQl9CisJCWlvdi5pb3ZfYmFzZSA9IHNtYl9idWZmZXI7CisJCWlvdi5pb3ZfbGVuID0gNDsKKwkJc21iX21zZy5tc2dfY29udHJvbCA9IE5VTEw7CisJCXNtYl9tc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCQlsZW5ndGggPQorCQkgICAga2VybmVsX3JlY3Ztc2coY3NvY2tldCwgJnNtYl9tc2csCisJCQkJICZpb3YsIDEsIDQsIDAgLyogQkIgc2VlIHNvY2tldC5oIGZsYWdzICovKTsKKworCQlpZihzZXJ2ZXItPnRjcFN0YXR1cyA9PSBDaWZzRXhpdGluZykgeworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoc2VydmVyLT50Y3BTdGF0dXMgPT0gQ2lmc05lZWRSZWNvbm5lY3QpIHsKKwkJCWNGWUkoMSwoIlJlY29ubmVjdGluZyBhZnRlciBzZXJ2ZXIgc3RvcHBlZCByZXNwb25kaW5nIikpOworCQkJY2lmc19yZWNvbm5lY3Qoc2VydmVyKTsKKwkJCWNGWUkoMSwoImNhbGwgdG8gcmVjb25uZWN0IGRvbmUiKSk7CisJCQljc29ja2V0ID0gc2VydmVyLT5zc29ja2V0OworCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoKGxlbmd0aCA9PSAtRVJFU1RBUlRTWVMpIHx8IChsZW5ndGggPT0gLUVBR0FJTikpIHsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV90aW1lb3V0KDEpOyAvKiBtaW5pbXVtIHNsZWVwIHRvIHByZXZlbnQgbG9vcGluZworCQkJCWFsbG93aW5nIHNvY2tldCB0byBjbGVhciBhbmQgYXBwIHRocmVhZHMgdG8gc2V0CisJCQkJdGNwU3RhdHVzIENpZnNOZWVkUmVjb25uZWN0IGlmIHNlcnZlciBodW5nICovCisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChsZW5ndGggPD0gMCkgeworCQkJaWYoc2VydmVyLT50Y3BTdGF0dXMgPT0gQ2lmc05ldykgeworCQkJCWNGWUkoMSwoInRjcCBzZXNzaW9uIGFiZW5kZWQgcHJlbWF0dXJlbHkgKGFmdGVyIFNNQm5lZ3Byb3QpIikpOworCQkJCS8qIHNvbWUgc2VydmVycyBraWxsIHRjcCBzZXNzaW9uIHJhdGhlciB0aGFuIHJldHVybmluZworCQkJCQlzbWIgbmVncHJvdCBlcnJvciBpbiB3aGljaCBjYXNlIHJlY29ubmVjdGluZyBoZXJlIGlzCisJCQkJCW5vdCBnb2luZyB0byBoZWxwIC0gcmV0dXJuIGVycm9yIHRvIG1vdW50ICovCisJCQkJYnJlYWs7CisJCQl9CisJCQlpZihsZW5ndGggPT0gLUVJTlRSKSB7IAorCQkJCWNGWUkoMSwoImNpZnNkIHRocmVhZCBraWxsZWQiKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljRllJKDEsKCJSZWNvbm5lY3RpbmcgYWZ0ZXIgdW5leHBlY3RlZCBwZWVrIGVycm9yICVkIixsZW5ndGgpKTsKKwkJCWNpZnNfcmVjb25uZWN0KHNlcnZlcik7CisJCQljc29ja2V0ID0gc2VydmVyLT5zc29ja2V0OworCQkJd2FrZV91cCgmc2VydmVyLT5yZXNwb25zZV9xKTsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKGxlbmd0aCA+IDMpIHsKKwkJCXBkdV9sZW5ndGggPSBudG9obChzbWJfYnVmZmVyLT5zbWJfYnVmX2xlbmd0aCk7CisJCS8qIE9ubHkgcmVhZCBwZHVfbGVuZ3RoIGFmdGVyIGJlbG93IGNoZWNrcyBmb3IgdG9vIHNob3J0IChkdWUKKwkJICAgdG8gZS5nLiBpbnQgb3ZlcmZsb3cpIGFuZCB0b28gbG9uZyBpZSBiZXlvbmQgZW5kIG9mIGJ1ZiAqLworCQkJY0ZZSSgxLCgicmZjMTAwMiBsZW5ndGgoYmlnIGVuZGlhbikweCV4KSIsIHBkdV9sZW5ndGgrNCkpOworCisJCQl0ZW1wID0gKGNoYXIgKikgc21iX2J1ZmZlcjsKKwkJCWlmICh0ZW1wWzBdID09IChjaGFyKSBSRkMxMDAyX1NFU1NJT05fS0VFUF9BTElWRSkgeworCQkJCWNGWUkoMCwoIlJlY2VpdmVkIDQgYnl0ZSBrZWVwIGFsaXZlIHBhY2tldCIpKTsKKwkJCX0gZWxzZSBpZiAodGVtcFswXSA9PSAoY2hhcikgUkZDMTAwMl9QT1NJVElWRV9TRVNTSU9OX1JFU1BPTlNFKSB7CisJCQkJCWNGWUkoMSwoIkdvb2QgUkZDIDEwMDIgc2Vzc2lvbiByc3AiKSk7CisJCQl9IGVsc2UgaWYgKHRlbXBbMF0gPT0gKGNoYXIpUkZDMTAwMl9ORUdBVElWRV9TRVNTSU9OX1JFU1BPTlNFKSB7CisJCQkJLyogd2UgZ2V0IHRoaXMgZnJvbSBXaW5kb3dzIDk4IGluc3RlYWQgb2YgZXJyb3Igb24gU01CIG5lZ3Byb3QgcmVzcG9uc2UgKi8KKwkJCQljRllJKDEsKCJOZWdhdGl2ZSBSRkMgMTAwMiBTZXNzaW9uIFJlc3BvbnNlIEVycm9yIDB4JXgpIix0ZW1wWzRdKSk7CisJCQkJaWYoc2VydmVyLT50Y3BTdGF0dXMgPT0gQ2lmc05ldykgeworCQkJCQkvKiBpZiBuYWNrIG9uIG5lZ3Byb3QgKHJhdGhlciB0aGFuIAorCQkJCQlyZXQgb2Ygc21iIG5lZ3Byb3QgZXJyb3IpIHJlY29ubmVjdGluZworCQkJCQlub3QgZ29pbmcgdG8gaGVscCwgcmV0IGVycm9yIHRvIG1vdW50ICovCisJCQkJCWJyZWFrOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIGdpdmUgc2VydmVyIGEgc2Vjb25kIHRvCisJCQkJCWNsZWFuIHVwIGJlZm9yZSByZWNvbm5lY3QgYXR0ZW1wdCAqLworCQkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJCQlzY2hlZHVsZV90aW1lb3V0KEhaKTsKKwkJCQkJLyogYWx3YXlzIHRyeSA0NDUgZmlyc3Qgb24gcmVjb25uZWN0CisJCQkJCXNpbmNlIHdlIGdldCBOQUNLIG9uIHNvbWUgaWYgd2UgZXZlcgorCQkJCQljb25uZWN0ZWQgdG8gcG9ydCAxMzkgKHRoZSBOQUNLIGlzIAorCQkJCQlzaW5jZSB3ZSBkbyBub3QgYmVnaW4gd2l0aCBSRkMxMDAxCisJCQkJCXNlc3Npb24gaW5pdGlhbGl6ZSBmcmFtZSkgKi8KKwkJCQkJc2VydmVyLT5hZGRyLnNvY2tBZGRyLnNpbl9wb3J0ID0gaHRvbnMoQ0lGU19QT1JUKTsKKwkJCQkJY2lmc19yZWNvbm5lY3Qoc2VydmVyKTsKKwkJCQkJY3NvY2tldCA9IHNlcnZlci0+c3NvY2tldDsKKwkJCQkJd2FrZV91cCgmc2VydmVyLT5yZXNwb25zZV9xKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfSBlbHNlIGlmICh0ZW1wWzBdICE9IChjaGFyKSAwKSB7CisJCQkJY0VSUk9SKDEsKCJVbmtub3duIFJGQyAxMDAyIGZyYW1lIikpOworCQkJCWNpZnNfZHVtcF9tZW0oIiBSZWNlaXZlZCBEYXRhOiAiLCB0ZW1wLCBsZW5ndGgpOworCQkJCWNpZnNfcmVjb25uZWN0KHNlcnZlcik7CisJCQkJY3NvY2tldCA9IHNlcnZlci0+c3NvY2tldDsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSB7CisJCQkJaWYoKHBkdV9sZW5ndGggPiBDSUZTTWF4QnVmU2l6ZSArIE1BWF9DSUZTX0hEUl9TSVpFIC0gNCkKKwkJCQkgICAgfHwgKHBkdV9sZW5ndGggPCBzaXplb2YgKHN0cnVjdCBzbWJfaGRyKSAtIDEgLSA0KSkgeworCQkJCQljRVJST1IoMSwKKwkJCQkJICAgICgiSW52YWxpZCBzaXplIFNNQiBsZW5ndGggJWQgYW5kIHBkdV9sZW5ndGggJWQiLAorCQkJCQkJbGVuZ3RoLCBwZHVfbGVuZ3RoKzQpKTsKKwkJCQkJY2lmc19yZWNvbm5lY3Qoc2VydmVyKTsKKwkJCQkJY3NvY2tldCA9IHNlcnZlci0+c3NvY2tldDsKKwkJCQkJd2FrZV91cCgmc2VydmVyLT5yZXNwb25zZV9xKTsKKwkJCQkJY29udGludWU7CisJCQkJfSBlbHNlIHsgLyogbGVuZ3RoIG9rICovCisJCQkJCWxlbmd0aCA9IDA7CisJCQkJCWlvdi5pb3ZfYmFzZSA9IDQgKyAoY2hhciAqKXNtYl9idWZmZXI7CisJCQkJCWlvdi5pb3ZfbGVuID0gcGR1X2xlbmd0aDsKKwkJCQkJZm9yICh0b3RhbF9yZWFkID0gMDsgCisJCQkJCSAgICAgdG90YWxfcmVhZCA8IHBkdV9sZW5ndGg7CisJCQkJCSAgICAgdG90YWxfcmVhZCArPSBsZW5ndGgpIHsKKwkJCQkJCWxlbmd0aCA9IGtlcm5lbF9yZWN2bXNnKGNzb2NrZXQsICZzbWJfbXNnLCAKKwkJCQkJCQkmaW92LCAxLAorCQkJCQkJCXBkdV9sZW5ndGggLSB0b3RhbF9yZWFkLCAwKTsKKwkJCQkJCWlmIChsZW5ndGggPT0gMCkgeworCQkJCQkJCWNFUlJPUigxLAorCQkJCQkJCSAgICAgICAoIlplcm8gbGVuZ3RoIHJlY2VpdmUgd2hlbiBleHBlY3RpbmcgJWQgIiwKKwkJCQkJCQkJcGR1X2xlbmd0aCAtIHRvdGFsX3JlYWQpKTsKKwkJCQkJCQljaWZzX3JlY29ubmVjdChzZXJ2ZXIpOworCQkJCQkJCWNzb2NrZXQgPSBzZXJ2ZXItPnNzb2NrZXQ7CisJCQkJCQkJd2FrZV91cCgmc2VydmVyLT5yZXNwb25zZV9xKTsKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlsZW5ndGggKz0gNDsgLyogYWNjb3VudCBmb3IgcmZjMTAwMiBoZHIgKi8KKwkJCQl9CisKKwkJCQlkdW1wX3NtYihzbWJfYnVmZmVyLCBsZW5ndGgpOworCQkJCWlmIChjaGVja1NNQgorCQkJCSAgICAoc21iX2J1ZmZlciwgc21iX2J1ZmZlci0+TWlkLCB0b3RhbF9yZWFkKzQpKSB7CisJCQkJCWNFUlJPUigxLCAoIkJhZCBTTUIgUmVjZWl2ZWQgIikpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQl0YXNrX3RvX3dha2UgPSBOVUxMOworCQkJCXNwaW5fbG9jaygmR2xvYmFsTWlkX0xvY2spOworCQkJCWxpc3RfZm9yX2VhY2godG1wLCAmc2VydmVyLT5wZW5kaW5nX21pZF9xKSB7CisJCQkJCW1pZF9lbnRyeSA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QKKwkJCQkJCQkgICAgICAgbWlkX3FfZW50cnksCisJCQkJCQkJICAgICAgIHFoZWFkKTsKKworCQkJCQlpZiAoKG1pZF9lbnRyeS0+bWlkID09IHNtYl9idWZmZXItPk1pZCkgJiYgKG1pZF9lbnRyeS0+bWlkU3RhdGUgPT0gTUlEX1JFUVVFU1RfU1VCTUlUVEVEKSkgeworCQkJCQkJY0ZZSSgxLAorCQkJCQkJICAgICAoIiBNaWQgMHgleCBtYXRjaGVkIC0gd2FraW5nIHVwICIsbWlkX2VudHJ5LT5taWQpKTsKKwkJCQkJCXRhc2tfdG9fd2FrZSA9IG1pZF9lbnRyeS0+dHNrOworCQkJCQkJbWlkX2VudHJ5LT5yZXNwX2J1ZiA9CisJCQkJCQkgICAgc21iX2J1ZmZlcjsKKwkJCQkJCW1pZF9lbnRyeS0+bWlkU3RhdGUgPQorCQkJCQkJICAgIE1JRF9SRVNQT05TRV9SRUNFSVZFRDsKKwkJCQkJfQorCQkJCX0KKwkJCQlzcGluX3VubG9jaygmR2xvYmFsTWlkX0xvY2spOworCQkJCWlmICh0YXNrX3RvX3dha2UpIHsKKwkJCQkJc21iX2J1ZmZlciA9IE5VTEw7CS8qIHdpbGwgYmUgZnJlZWQgYnkgdXNlcnMgdGhyZWFkIGFmdGVyIGhlIGlzIGRvbmUgKi8KKwkJCQkJd2FrZV91cF9wcm9jZXNzKHRhc2tfdG9fd2FrZSk7CisJCQkJfSBlbHNlIGlmIChpc192YWxpZF9vcGxvY2tfYnJlYWsoc21iX2J1ZmZlcikgPT0gRkFMU0UpIHsgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCQljRVJST1IoMSwgKCJObyB0YXNrIHRvIHdha2UsIHVua25vd24gZnJhbWUgcmN2ZCEiKSk7CisJCQkJCWNpZnNfZHVtcF9tZW0oIlJlY2VpdmVkIERhdGEgaXM6ICIsdGVtcCxzaXplb2Yoc3RydWN0IHNtYl9oZHIpKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQljRllJKDEsCisJCQkgICAgKCJGcmFtZSBsZXNzIHRoYW4gZm91ciBieXRlcyByZWNlaXZlZCAgJWQgYnl0ZXMgbG9uZy4iLAorCQkJICAgICAgbGVuZ3RoKSk7CisJCQljaWZzX3JlY29ubmVjdChzZXJ2ZXIpOworCQkJY3NvY2tldCA9IHNlcnZlci0+c3NvY2tldDsKKwkJCXdha2VfdXAoJnNlcnZlci0+cmVzcG9uc2VfcSk7CisJCQljb250aW51ZTsKKwkJfQorCX0KKwlzcGluX2xvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwlzZXJ2ZXItPnRjcFN0YXR1cyA9IENpZnNFeGl0aW5nOworCXNlcnZlci0+dHNrID0gTlVMTDsKKwlhdG9taWNfc2V0KCZzZXJ2ZXItPmluRmxpZ2h0LCAwKTsKKwlzcGluX3VubG9jaygmR2xvYmFsTWlkX0xvY2spOworCS8qIEFsdGhvdWdoIHRoZXJlIHNob3VsZCBub3QgYmUgYW55IHJlcXVlc3RzIGJsb2NrZWQgb24gCisJdGhpcyBxdWV1ZSBpdCBjYW4gbm90IGh1cnQgdG8gYmUgcGFyYW5vaWQgYW5kIHRyeSB0byB3YWtlIHVwIHJlcXVlc3RzCisJdGhhdCBtYXkgaGF2ZW4gYmVlbiBibG9ja2VkIHdoZW4gbW9yZSB0aGFuIDUwIGF0IHRpbWUgd2VyZSBvbiB0aGUgd2lyZSAKKwl0byB0aGUgc2FtZSBzZXJ2ZXIgLSB0aGV5IG5vdyB3aWxsIHNlZSB0aGUgc2Vzc2lvbiBpcyBpbiBleGl0IHN0YXRlCisJYW5kIGdldCBvdXQgb2YgU2VuZFJlY2VpdmUuICAqLworCXdha2VfdXBfYWxsKCZzZXJ2ZXItPnJlcXVlc3RfcSk7CisJLyogZ2l2ZSB0aG9zZSByZXF1ZXN0cyB0aW1lIHRvIGV4aXQgKi8KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCXNjaGVkdWxlX3RpbWVvdXQoSFovOCk7CisKKwlpZihzZXJ2ZXItPnNzb2NrZXQpIHsKKwkJc29ja19yZWxlYXNlKGNzb2NrZXQpOworCQlzZXJ2ZXItPnNzb2NrZXQgPSBOVUxMOworCX0KKwlpZiAoc21iX2J1ZmZlcikgLyogYnVmZmVyIHVzdWFsbHkgZnJlZWQgaW4gZnJlZV9taWQgLSBuZWVkIHRvIGZyZWUgaXQgb24gZXJyb3Igb3IgZXhpdCAqLworCQljaWZzX2J1Zl9yZWxlYXNlKHNtYl9idWZmZXIpOworCisJcmVhZF9sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKwlpZiAobGlzdF9lbXB0eSgmc2VydmVyLT5wZW5kaW5nX21pZF9xKSkgeworCQkvKiBsb29wIHRocm91Z2ggc2VydmVyIHNlc3Npb24gc3RydWN0dXJlcyBhdHRhY2hlZCB0byB0aGlzIGFuZCBtYXJrIHRoZW0gZGVhZCAqLworCQlsaXN0X2Zvcl9lYWNoKHRtcCwgJkdsb2JhbFNNQlNlc3Npb25MaXN0KSB7CisJCQlzZXMgPQorCQkJICAgIGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgY2lmc1Nlc0luZm8sCisJCQkJICAgICAgIGNpZnNTZXNzaW9uTGlzdCk7CisJCQlpZiAoc2VzLT5zZXJ2ZXIgPT0gc2VydmVyKSB7CisJCQkJc2VzLT5zdGF0dXMgPSBDaWZzRXhpdGluZzsKKwkJCQlzZXMtPnNlcnZlciA9IE5VTEw7CisJCQl9CisJCX0KKwkJcmVhZF91bmxvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCX0gZWxzZSB7CisJCXNwaW5fbG9jaygmR2xvYmFsTWlkX0xvY2spOworCQlsaXN0X2Zvcl9lYWNoKHRtcCwgJnNlcnZlci0+cGVuZGluZ19taWRfcSkgeworCQltaWRfZW50cnkgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IG1pZF9xX2VudHJ5LCBxaGVhZCk7CisJCQlpZiAobWlkX2VudHJ5LT5taWRTdGF0ZSA9PSBNSURfUkVRVUVTVF9TVUJNSVRURUQpIHsKKwkJCQljRllJKDEsCisJCQkJCSAoIiBDbGVhcmluZyBNaWQgMHgleCAtIHdha2luZyB1cCAiLG1pZF9lbnRyeS0+bWlkKSk7CisJCQkJdGFza190b193YWtlID0gbWlkX2VudHJ5LT50c2s7CisJCQkJaWYodGFza190b193YWtlKSB7CisJCQkJCXdha2VfdXBfcHJvY2Vzcyh0YXNrX3RvX3dha2UpOworCQkJCX0KKwkJCX0KKwkJfQorCQlzcGluX3VubG9jaygmR2xvYmFsTWlkX0xvY2spOworCQlyZWFkX3VubG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCS8qIDEvOHRoIG9mIHNlYyBpcyBtb3JlIHRoYW4gZW5vdWdoIHRpbWUgZm9yIHRoZW0gdG8gZXhpdCAqLworCQlzY2hlZHVsZV90aW1lb3V0KEhaLzgpOyAKKwl9CisKKwlpZiAobGlzdF9lbXB0eSgmc2VydmVyLT5wZW5kaW5nX21pZF9xKSkgeworCQkvKiBtcHggdGhyZWFkcyBoYXZlIG5vdCBleGl0ZWQgeWV0IGdpdmUgdGhlbSAKKwkJYXQgbGVhc3QgdGhlIHNtYiBzZW5kIHRpbWVvdXQgdGltZSBmb3IgbG9uZyBvcHMgKi8KKwkJY0ZZSSgxLCAoIldhaXQgZm9yIGV4aXQgZnJvbSBkZW11bHRpcGxleCB0aHJlYWQiKSk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoNDYgKiBIWik7CQorCQkvKiBpZiB0aHJlYWRzIHN0aWxsIGhhdmUgbm90IGV4aXRlZCB0aGV5IGFyZSBwcm9iYWJseSBuZXZlcgorCQljb21pbmcgaG9tZSBub3QgbXVjaCBlbHNlIHdlIGNhbiBkbyBidXQgZnJlZSB0aGUgbWVtb3J5ICovCisJfQorCWtmcmVlKHNlcnZlcik7CisKKwl3cml0ZV9sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKwlhdG9taWNfZGVjKCZ0Y3BTZXNBbGxvY0NvdW50KTsKKwlsZW5ndGggPSB0Y3BTZXNBbGxvY0NvdW50LmNvdW50ZXI7CisJd3JpdGVfdW5sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKwlpZihsZW5ndGggID4gMCkgeworCQltZW1wb29sX3Jlc2l6ZShjaWZzX3JlcV9wb29scCwKKwkJCWxlbmd0aCArIGNpZnNfbWluX3JjdiwKKwkJCUdGUF9LRVJORUwpOworCX0KKworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJc2NoZWR1bGVfdGltZW91dChIWi80KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgKiAKK2NpZnNfa2NhbGxvYyhzaXplX3Qgc2l6ZSwgdW5zaWduZWQgaW50IF9fbm9jYXN0IHR5cGUpCit7CisJdm9pZCAqYWRkcjsKKwlhZGRyID0ga21hbGxvYyhzaXplLCB0eXBlKTsKKwlpZiAoYWRkcikKKwkJbWVtc2V0KGFkZHIsIDAsIHNpemUpOworCXJldHVybiBhZGRyOworfQorCitzdGF0aWMgaW50CitjaWZzX3BhcnNlX21vdW50X29wdGlvbnMoY2hhciAqb3B0aW9ucywgY29uc3QgY2hhciAqZGV2bmFtZSxzdHJ1Y3Qgc21iX3ZvbCAqdm9sKQoreworCWNoYXIgKnZhbHVlOworCWNoYXIgKmRhdGE7CisJdW5zaWduZWQgaW50ICB0ZW1wX2xlbiwgaSwgajsKKwljaGFyIHNlcGFyYXRvclsyXTsKKworCXNlcGFyYXRvclswXSA9ICcsJzsKKwlzZXBhcmF0b3JbMV0gPSAwOyAKKworCW1lbXNldCh2b2wtPnNvdXJjZV9yZmMxMDAxX25hbWUsMHgyMCwxNSk7CisJZm9yKGk9MDtpIDwgc3RybmxlbihzeXN0ZW1fdXRzbmFtZS5ub2RlbmFtZSwxNSk7aSsrKSB7CisJCS8qIGRvZXMgbm90IGhhdmUgdG8gYmUgYSBwZXJmZWN0IG1hcHBpbmcgc2luY2UgdGhlIGZpZWxkIGlzCisJCWluZm9ybWF0aW9uYWwsIG9ubHkgdXNlZCBmb3Igc2VydmVycyB0aGF0IGRvIG5vdCBzdXBwb3J0CisJCXBvcnQgNDQ1IGFuZCBpdCBjYW4gYmUgb3ZlcnJpZGRlbiBhdCBtb3VudCB0aW1lICovCisJCXZvbC0+c291cmNlX3JmYzEwMDFfbmFtZVtpXSA9IHRvdXBwZXIoc3lzdGVtX3V0c25hbWUubm9kZW5hbWVbaV0pOworCX0KKwl2b2wtPnNvdXJjZV9yZmMxMDAxX25hbWVbMTVdID0gMDsKKworCXZvbC0+bGludXhfdWlkID0gY3VycmVudC0+dWlkOwkvKiBjdXJyZW50LT5ldWlkIGluc3RlYWQ/ICovCisJdm9sLT5saW51eF9naWQgPSBjdXJyZW50LT5naWQ7CisJdm9sLT5kaXJfbW9kZSA9IFNfSVJXWFVHTzsKKwkvKiAyNzY3IHBlcm1zIGluZGljYXRlIG1hbmRhdG9yeSBsb2NraW5nIHN1cHBvcnQgKi8KKwl2b2wtPmZpbGVfbW9kZSA9IFNfSUFMTFVHTyAmIH4oU19JU1VJRCB8IFNfSVhHUlApOworCisJLyogdm9sLT5yZXRyeSBkZWZhdWx0IGlzIDAgKGkuZS4gInNvZnQiIGxpbWl0ZWQgcmV0cnkgbm90IGhhcmQgcmV0cnkpICovCisJdm9sLT5ydyA9IFRSVUU7CisKKwlpZiAoIW9wdGlvbnMpCisJCXJldHVybiAxOworCisJaWYoc3RybmNtcChvcHRpb25zLCJzZXA9Iiw0KSA9PSAwKSB7CisJCWlmKG9wdGlvbnNbNF0gIT0gMCkgeworCQkJc2VwYXJhdG9yWzBdID0gb3B0aW9uc1s0XTsKKwkJCW9wdGlvbnMgKz0gNTsKKwkJfSBlbHNlIHsKKwkJCWNGWUkoMSwoIk51bGwgc2VwYXJhdG9yIG5vdCBhbGxvd2VkIikpOworCQl9CisJfQorCQkKKwl3aGlsZSAoKGRhdGEgPSBzdHJzZXAoJm9wdGlvbnMsIHNlcGFyYXRvcikpICE9IE5VTEwpIHsKKwkJaWYgKCEqZGF0YSkKKwkJCWNvbnRpbnVlOworCQlpZiAoKHZhbHVlID0gc3RyY2hyKGRhdGEsICc9JykpICE9IE5VTEwpCisJCQkqdmFsdWUrKyA9ICdcMCc7CisKKwkJaWYgKHN0cm5pY21wKGRhdGEsICJ1c2VyX3hhdHRyIiwxMCkgPT0gMCkgey8qcGFyc2UgYmVmb3JlIHVzZXIqLworCQkJdm9sLT5ub194YXR0ciA9IDA7CisJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgIm5vdXNlcl94YXR0ciIsMTIpID09IDApIHsKKwkJCXZvbC0+bm9feGF0dHIgPSAxOworCQl9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJ1c2VyIiwgNCkgPT0gMCkgeworCQkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSAgICAgICAiQ0lGUzogaW52YWxpZCBvciBtaXNzaW5nIHVzZXJuYW1lXG4iKTsKKwkJCQlyZXR1cm4gMTsJLyogbmVlZHNfYXJnOyAqLworCQkJfQorCQkJaWYgKHN0cm5sZW4odmFsdWUsIDIwMCkgPCAyMDApIHsKKwkJCQl2b2wtPnVzZXJuYW1lID0gdmFsdWU7CisJCQl9IGVsc2UgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNJRlM6IHVzZXJuYW1lIHRvbyBsb25nXG4iKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAicGFzcyIsIDQpID09IDApIHsKKwkJCWlmICghdmFsdWUpIHsKKwkJCQl2b2wtPnBhc3N3b3JkID0gTlVMTDsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSBpZih2YWx1ZVswXSA9PSAwKSB7CisJCQkJLyogY2hlY2sgaWYgc3RyaW5nIGJlZ2lucyB3aXRoIGRvdWJsZSBjb21tYQorCQkJCSAgIHNpbmNlIHRoYXQgd291bGQgbWVhbiB0aGUgcGFzc3dvcmQgcmVhbGx5CisJCQkJICAgZG9lcyBzdGFydCB3aXRoIGEgY29tbWEsIGFuZCB3b3VsZCBub3QKKwkJCQkgICBpbmRpY2F0ZSBhbiBlbXB0eSBzdHJpbmcgKi8KKwkJCQlpZih2YWx1ZVsxXSAhPSBzZXBhcmF0b3JbMF0pIHsKKwkJCQkJdm9sLT5wYXNzd29yZCA9IE5VTEw7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKwkJCXRlbXBfbGVuID0gc3RybGVuKHZhbHVlKTsKKwkJCS8qIHJlbW92ZWQgcGFzc3dvcmQgbGVuZ3RoIGNoZWNrLCBOVExNIHBhc3N3b3JkcworCQkJCWNhbiBiZSBhcmJpdHJhcmlseSBsb25nICovCisKKwkJCS8qIGlmIGNvbW1hIGluIHBhc3N3b3JkLCB0aGUgc3RyaW5nIHdpbGwgYmUgCisJCQlwcmVtYXR1cmVseSBudWxsIHRlcm1pbmF0ZWQuICBDb21tYXMgaW4gcGFzc3dvcmQgYXJlCisJCQlzcGVjaWZpZWQgYWNyb3NzIHRoZSBjaWZzIG1vdW50IGludGVyZmFjZSBieSBhIGRvdWJsZQorCQkJY29tbWEgaWUgLCwgYW5kIGEgY29tbWEgdXNlZCBhcyBpbiBvdGhlciBjYXNlcyBpZSAnLCcKKwkJCWFzIGEgcGFyYW1ldGVyIGRlbGltaXRlci9zZXBhcmF0b3IgaXMgc2luZ2xlIGFuZCBkdWUKKwkJCXRvIHRoZSBzdHJzZXAgYWJvdmUgaXMgdGVtcG9yYXJpbHkgemVyb2VkLiAqLworCisJCQkvKiBOQjogcGFzc3dvcmQgbGVnYWxseSBjYW4gaGF2ZSBtdWx0aXBsZSBjb21tYXMgYW5kCisJCQl0aGUgb25seSBpbGxlZ2FsIGNoYXJhY3RlciBpbiBhIHBhc3N3b3JkIGlzIG51bGwgKi8KKworCQkJaWYgKCh2YWx1ZVt0ZW1wX2xlbl0gPT0gMCkgJiYgKHZhbHVlW3RlbXBfbGVuKzFdID09IHNlcGFyYXRvclswXSkpIHsKKwkJCQkvKiByZWluc2VydCBjb21tYSAqLworCQkJCXZhbHVlW3RlbXBfbGVuXSA9IHNlcGFyYXRvclswXTsKKwkJCQl0ZW1wX2xlbis9MjsgIC8qIG1vdmUgYWZ0ZXIgdGhlIHNlY29uZCBjb21tYSAqLworCQkJCXdoaWxlKHZhbHVlW3RlbXBfbGVuXSAhPSAwKSAgeworCQkJCQlpZiAodmFsdWVbdGVtcF9sZW5dID09IHNlcGFyYXRvclswXSkgeworCQkJCQkJaWYgKHZhbHVlW3RlbXBfbGVuKzFdID09IHNlcGFyYXRvclswXSkgeworCQkJCQkJCXRlbXBfbGVuKys7IC8qIHNraXAgc2Vjb25kIGNvbW1hICovCisJCQkJCQl9IGVsc2UgeyAKKwkJCQkJCS8qIHNpbmdsZSBjb21tYSBpbmRpY2F0aW5nIHN0YXJ0CisJCQkJCQkJIG9mIG5leHQgcGFybSAqLworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQl9CisJCQkJCXRlbXBfbGVuKys7CisJCQkJfQorCQkJCWlmKHZhbHVlW3RlbXBfbGVuXSA9PSAwKSB7CisJCQkJCW9wdGlvbnMgPSBOVUxMOworCQkJCX0gZWxzZSB7CisJCQkJCXZhbHVlW3RlbXBfbGVuXSA9IDA7CisJCQkJCS8qIHBvaW50IG9wdGlvbiB0byBzdGFydCBvZiBuZXh0IHBhcm0gKi8KKwkJCQkJb3B0aW9ucyA9IHZhbHVlICsgdGVtcF9sZW4gKyAxOworCQkJCX0KKwkJCQkvKiBnbyBmcm9tIHZhbHVlIHRvIHZhbHVlICsgdGVtcF9sZW4gY29uZGVuc2luZyAKKwkJCQlkb3VibGUgY29tbWFzIHRvIHNpbmdsZXMuIE5vdGUgdGhhdCB0aGlzIGVuZHMgdXAKKwkJCQlhbGxvY2F0aW5nIGEgZmV3IGJ5dGVzIHRvbyBtYW55LCB3aGljaCBpcyBvayAqLworCQkJCXZvbC0+cGFzc3dvcmQgPSBjaWZzX2tjYWxsb2ModGVtcF9sZW4sIEdGUF9LRVJORUwpOworCQkJCWZvcihpPTAsaj0wO2k8dGVtcF9sZW47aSsrLGorKykgeworCQkJCQl2b2wtPnBhc3N3b3JkW2pdID0gdmFsdWVbaV07CisJCQkJCWlmKHZhbHVlW2ldID09IHNlcGFyYXRvclswXSAmJiB2YWx1ZVtpKzFdID09IHNlcGFyYXRvclswXSkgeworCQkJCQkJLyogc2tpcCBzZWNvbmQgY29tbWEgKi8KKwkJCQkJCWkrKzsKKwkJCQkJfQorCQkJCX0KKwkJCQl2b2wtPnBhc3N3b3JkW2pdID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJdm9sLT5wYXNzd29yZCA9IGNpZnNfa2NhbGxvYyh0ZW1wX2xlbiArIDEsIEdGUF9LRVJORUwpOworCQkJCXN0cmNweSh2b2wtPnBhc3N3b3JkLCB2YWx1ZSk7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgImlwIiwgMikgPT0gMCkgeworCQkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKSB7CisJCQkJdm9sLT5VTkNpcCA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKHN0cm5sZW4odmFsdWUsIDM1KSA8IDM1KSB7CisJCQkJdm9sLT5VTkNpcCA9IHZhbHVlOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDSUZTOiBpcCBhZGRyZXNzIHRvbyBsb25nXG4iKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfSBlbHNlIGlmICgoc3RybmljbXAoZGF0YSwgInVuYyIsIDMpID09IDApCisJCQkgICB8fCAoc3RybmljbXAoZGF0YSwgInRhcmdldCIsIDYpID09IDApCisJCQkgICB8fCAoc3RybmljbXAoZGF0YSwgInBhdGgiLCA0KSA9PSAwKSkgeworCQkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSAgICAgICAiQ0lGUzogaW52YWxpZCBwYXRoIHRvIG5ldHdvcmsgcmVzb3VyY2VcbiIpOworCQkJCXJldHVybiAxOwkvKiBuZWVkc19hcmc7ICovCisJCQl9CisJCQlpZiAoKHRlbXBfbGVuID0gc3Rybmxlbih2YWx1ZSwgMzAwKSkgPCAzMDApIHsKKwkJCQl2b2wtPlVOQyA9IGttYWxsb2ModGVtcF9sZW4rMSxHRlBfS0VSTkVMKTsKKwkJCQlpZih2b2wtPlVOQyA9PSBOVUxMKQorCQkJCQlyZXR1cm4gMTsKKwkJCQlzdHJjcHkodm9sLT5VTkMsdmFsdWUpOworCQkJCWlmIChzdHJuY21wKHZvbC0+VU5DLCAiLy8iLCAyKSA9PSAwKSB7CisJCQkJCXZvbC0+VU5DWzBdID0gJ1xcJzsKKwkJCQkJdm9sLT5VTkNbMV0gPSAnXFwnOworCQkJCX0gZWxzZSBpZiAoc3RybmNtcCh2b2wtPlVOQywgIlxcXFwiLCAyKSAhPSAwKSB7CSAgICAgICAgICAgICAgICAgICAKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCQkgICAgICAgIkNJRlM6IFVOQyBQYXRoIGRvZXMgbm90IGJlZ2luIHdpdGggLy8gb3IgXFxcXCBcbiIpOworCQkJCQlyZXR1cm4gMTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNJRlM6IFVOQyBuYW1lIHRvbyBsb25nXG4iKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfSBlbHNlIGlmICgoc3RybmljbXAoZGF0YSwgImRvbWFpbiIsIDMpID09IDApCisJCQkgICB8fCAoc3RybmljbXAoZGF0YSwgIndvcmtncm91cCIsIDUpID09IDApKSB7CisJCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDSUZTOiBpbnZhbGlkIGRvbWFpbiBuYW1lXG4iKTsKKwkJCQlyZXR1cm4gMTsJLyogbmVlZHNfYXJnOyAqLworCQkJfQorCQkJLyogQkIgYXJlIHRoZXJlIGNhc2VzIGluIHdoaWNoIGEgY29tbWEgY2FuIGJlIHZhbGlkIGluCisJCQlhIGRvbWFpbiBuYW1lIGFuZCBuZWVkIHNwZWNpYWwgaGFuZGxpbmc/ICovCisJCQlpZiAoc3Rybmxlbih2YWx1ZSwgNjUpIDwgNjUpIHsKKwkJCQl2b2wtPmRvbWFpbm5hbWUgPSB2YWx1ZTsKKwkJCQljRllJKDEsICgiRG9tYWluIG5hbWUgc2V0IikpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDSUZTOiBkb21haW4gbmFtZSB0b28gbG9uZ1xuIik7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgImlvY2hhcnNldCIsIDkpID09IDApIHsKKwkJCWlmICghdmFsdWUgfHwgISp2YWx1ZSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNJRlM6IGludmFsaWQgaW9jaGFyc2V0IHNwZWNpZmllZFxuIik7CisJCQkJcmV0dXJuIDE7CS8qIG5lZWRzX2FyZzsgKi8KKwkJCX0KKwkJCWlmIChzdHJubGVuKHZhbHVlLCA2NSkgPCA2NSkgeworCQkJCWlmKHN0cm5pY21wKHZhbHVlLCJkZWZhdWx0Iiw3KSkKKwkJCQkJdm9sLT5pb2NoYXJzZXQgPSB2YWx1ZTsKKwkJCQkvKiBpZiBpb2NoYXJzZXQgbm90IHNldCBsb2FkX25sc19kZWZhdWx0IHVzZWQgYnkgY2FsbGVyICovCisJCQkJY0ZZSSgxLCAoImlvY2hhcnNldCBzZXQgdG8gJXMiLHZhbHVlKSk7CisJCQl9IGVsc2UgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNJRlM6IGlvY2hhcnNldCBuYW1lIHRvbyBsb25nLlxuIik7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgInVpZCIsIDMpID09IDApIHsKKwkJCWlmICh2YWx1ZSAmJiAqdmFsdWUpIHsKKwkJCQl2b2wtPmxpbnV4X3VpZCA9CisJCQkJCXNpbXBsZV9zdHJ0b3VsKHZhbHVlLCAmdmFsdWUsIDApOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJnaWQiLCAzKSA9PSAwKSB7CisJCQlpZiAodmFsdWUgJiYgKnZhbHVlKSB7CisJCQkJdm9sLT5saW51eF9naWQgPQorCQkJCQlzaW1wbGVfc3RydG91bCh2YWx1ZSwgJnZhbHVlLCAwKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAiZmlsZV9tb2RlIiwgNCkgPT0gMCkgeworCQkJaWYgKHZhbHVlICYmICp2YWx1ZSkgeworCQkJCXZvbC0+ZmlsZV9tb2RlID0KKwkJCQkJc2ltcGxlX3N0cnRvdWwodmFsdWUsICZ2YWx1ZSwgMCk7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgImRpcl9tb2RlIiwgNCkgPT0gMCkgeworCQkJaWYgKHZhbHVlICYmICp2YWx1ZSkgeworCQkJCXZvbC0+ZGlyX21vZGUgPQorCQkJCQlzaW1wbGVfc3RydG91bCh2YWx1ZSwgJnZhbHVlLCAwKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAiZGlybW9kZSIsIDQpID09IDApIHsKKwkJCWlmICh2YWx1ZSAmJiAqdmFsdWUpIHsKKwkJCQl2b2wtPmRpcl9tb2RlID0KKwkJCQkJc2ltcGxlX3N0cnRvdWwodmFsdWUsICZ2YWx1ZSwgMCk7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgInBvcnQiLCA0KSA9PSAwKSB7CisJCQlpZiAodmFsdWUgJiYgKnZhbHVlKSB7CisJCQkJdm9sLT5wb3J0ID0KKwkJCQkJc2ltcGxlX3N0cnRvdWwodmFsdWUsICZ2YWx1ZSwgMCk7CisJCQl9CisJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgInJzaXplIiwgNSkgPT0gMCkgeworCQkJaWYgKHZhbHVlICYmICp2YWx1ZSkgeworCQkJCXZvbC0+cnNpemUgPQorCQkJCQlzaW1wbGVfc3RydG91bCh2YWx1ZSwgJnZhbHVlLCAwKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAid3NpemUiLCA1KSA9PSAwKSB7CisJCQlpZiAodmFsdWUgJiYgKnZhbHVlKSB7CisJCQkJdm9sLT53c2l6ZSA9CisJCQkJCXNpbXBsZV9zdHJ0b3VsKHZhbHVlLCAmdmFsdWUsIDApOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJzb2Nrb3B0IiwgNSkgPT0gMCkgeworCQkJaWYgKHZhbHVlICYmICp2YWx1ZSkgeworCQkJCXZvbC0+c29ja29wdCA9CisJCQkJCXNpbXBsZV9zdHJ0b3VsKHZhbHVlLCAmdmFsdWUsIDApOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJuZXRiaW9zbmFtZSIsIDQpID09IDApIHsKKwkJCWlmICghdmFsdWUgfHwgISp2YWx1ZSB8fCAoKnZhbHVlID09ICcgJykpIHsKKwkJCQljRllJKDEsKCJpbnZhbGlkIChlbXB0eSkgbmV0Ymlvc25hbWUgc3BlY2lmaWVkIikpOworCQkJfSBlbHNlIHsKKwkJCQltZW1zZXQodm9sLT5zb3VyY2VfcmZjMTAwMV9uYW1lLDB4MjAsMTUpOworCQkJCWZvcihpPTA7aTwxNTtpKyspIHsKKwkJCQkvKiBCQiBhcmUgdGhlcmUgY2FzZXMgaW4gd2hpY2ggYSBjb21tYSBjYW4gYmUgCisJCQkJdmFsaWQgaW4gdGhpcyB3b3Jrc3RhdGlvbiBuZXRiaW9zIG5hbWUgKGFuZCBuZWVkCisJCQkJc3BlY2lhbCBoYW5kbGluZyk/ICovCisKKwkJCQkvKiBXZSBkbyBub3QgdXBwZXJjYXNlIG5ldGJpb3NuYW1lIGZvciB1c2VyICovCisJCQkJCWlmICh2YWx1ZVtpXT09MCkKKwkJCQkJCWJyZWFrOworCQkJCQllbHNlIAorCQkJCQkJdm9sLT5zb3VyY2VfcmZjMTAwMV9uYW1lW2ldID0gdmFsdWVbaV07CisJCQkJfQorCQkJCS8qIFRoZSBzdHJpbmcgaGFzIDE2dGggYnl0ZSB6ZXJvIHN0aWxsIGZyb20KKwkJCQlzZXQgYXQgdG9wIG9mIHRoZSBmdW5jdGlvbiAgKi8KKwkJCQlpZigoaT09MTUpICYmICh2YWx1ZVtpXSAhPSAwKSkKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ0lGUzogbmV0Ymlvc25hbWUgbG9uZ2VyIHRoYW4gMTUgYW5kIHdhcyB0cnVuY2F0ZWQuXG4iKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAiY3JlZGVudGlhbHMiLCA0KSA9PSAwKSB7CisJCQkvKiBpZ25vcmUgKi8KKwkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAidmVyc2lvbiIsIDMpID09IDApIHsKKwkJCS8qIGlnbm9yZSAqLworCQl9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJndWVzdCIsNSkgPT0gMCkgeworCQkJLyogaWdub3JlICovCisJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgInJ3IiwgMikgPT0gMCkgeworCQkJdm9sLT5ydyA9IFRSVUU7CisJCX0gZWxzZSBpZiAoKHN0cm5pY21wKGRhdGEsICJzdWlkIiwgNCkgPT0gMCkgfHwKKwkJCQkgICAoc3RybmljbXAoZGF0YSwgIm5vc3VpZCIsIDYpID09IDApIHx8CisJCQkJICAgKHN0cm5pY21wKGRhdGEsICJleGVjIiwgNCkgPT0gMCkgfHwKKwkJCQkgICAoc3RybmljbXAoZGF0YSwgIm5vZXhlYyIsIDYpID09IDApIHx8CisJCQkJICAgKHN0cm5pY21wKGRhdGEsICJub2RldiIsIDUpID09IDApIHx8CisJCQkJICAgKHN0cm5pY21wKGRhdGEsICJub2F1dG8iLCA2KSA9PSAwKSB8fAorCQkJCSAgIChzdHJuaWNtcChkYXRhLCAiZGV2IiwgMykgPT0gMCkpIHsKKwkJCS8qICBUaGUgbW91bnQgdG9vbCBvciBtb3VudC5jaWZzIGhlbHBlciAoaWYgcHJlc2VudCkKKwkJCQl1c2VzIHRoZXNlIG9wdHMgdG8gc2V0IGZsYWdzLCBhbmQgdGhlIGZsYWdzIGFyZSByZWFkCisJCQkJYnkgdGhlIGtlcm5lbCB2ZnMgbGF5ZXIgYmVmb3JlIHdlIGdldCBoZXJlIChpZQorCQkJCWJlZm9yZSByZWFkIHN1cGVyKSBzbyB0aGVyZSBpcyBubyBwb2ludCB0cnlpbmcgdG8KKwkJCQlwYXJzZSB0aGVzZSBvcHRpb25zIGFnYWluIGFuZCBzZXQgYW55dGhpbmcgYW5kIGl0CisJCQkJaXMgb2sgdG8ganVzdCBpZ25vcmUgdGhlbSAqLworCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgInJvIiwgMikgPT0gMCkgeworCQkJdm9sLT5ydyA9IEZBTFNFOworCQl9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJoYXJkIiwgNCkgPT0gMCkgeworCQkJdm9sLT5yZXRyeSA9IDE7CisJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgInNvZnQiLCA0KSA9PSAwKSB7CisJCQl2b2wtPnJldHJ5ID0gMDsKKwkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAicGVybSIsIDQpID09IDApIHsKKwkJCXZvbC0+bm9wZXJtID0gMDsKKwkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAibm9wZXJtIiwgNikgPT0gMCkgeworCQkJdm9sLT5ub3Blcm0gPSAxOworCQl9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJzZXR1aWRzIiwgNykgPT0gMCkgeworCQkJdm9sLT5zZXR1aWRzID0gMTsKKwkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAibm9zZXR1aWRzIiwgOSkgPT0gMCkgeworCQkJdm9sLT5zZXR1aWRzID0gMDsKKwkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAibm9oYXJkIiwgNikgPT0gMCkgeworCQkJdm9sLT5yZXRyeSA9IDA7CisJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgIm5vc29mdCIsIDYpID09IDApIHsKKwkJCXZvbC0+cmV0cnkgPSAxOworCQl9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJub2ludHIiLCA2KSA9PSAwKSB7CisJCQl2b2wtPmludHIgPSAwOworCQl9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJpbnRyIiwgNCkgPT0gMCkgeworCQkJdm9sLT5pbnRyID0gMTsKKwkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAic2VydmVyaW5vIiw3KSA9PSAwKSB7CisJCQl2b2wtPnNlcnZlcl9pbm8gPSAxOworCQl9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJub3NlcnZlcmlubyIsOSkgPT0gMCkgeworCQkJdm9sLT5zZXJ2ZXJfaW5vID0gMDsKKwkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAiYWNsIiwzKSA9PSAwKSB7CisJCQl2b2wtPm5vX3BzeF9hY2wgPSAwOworCQl9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJub2FjbCIsNSkgPT0gMCkgeworCQkJdm9sLT5ub19wc3hfYWNsID0gMTsKKwkJfSBlbHNlIGlmIChzdHJuaWNtcChkYXRhLCAiZGlyZWN0Iiw2KSA9PSAwKSB7CisJCQl2b2wtPmRpcmVjdF9pbyA9IDE7CisJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgImZvcmNlZGlyZWN0aW8iLDEzKSA9PSAwKSB7CisJCQl2b2wtPmRpcmVjdF9pbyA9IDE7CisJCX0gZWxzZSBpZiAoc3RybmljbXAoZGF0YSwgImluNl9hZGRyIiw4KSA9PSAwKSB7CisJCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpIHsKKwkJCQl2b2wtPmluNl9hZGRyID0gTlVMTDsKKwkJCX0gZWxzZSBpZiAoc3Rybmxlbih2YWx1ZSwgNDkpID09IDQ4KSB7CisJCQkJdm9sLT5pbjZfYWRkciA9IHZhbHVlOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJDSUZTOiBpcCB2NiBhZGRyZXNzIG5vdCA0OCBjaGFyYWN0ZXJzIGxvbmdcbiIpOworCQkJCXJldHVybiAxOworCQkJfQorCQl9IGVsc2UgaWYgKHN0cm5pY21wKGRhdGEsICJub2FjIiwgNCkgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ0lGUzogTW91bnQgb3B0aW9uIG5vYWMgbm90IHN1cHBvcnRlZC4gSW5zdGVhZCBzZXQgL3Byb2MvZnMvY2lmcy9Mb29rdXBDYWNoZUVuYWJsZWQgdG8gMFxuIik7CisJCX0gZWxzZQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ0lGUzogVW5rbm93biBtb3VudCBvcHRpb24gJXNcbiIsZGF0YSk7CisJfQorCWlmICh2b2wtPlVOQyA9PSBOVUxMKSB7CisJCWlmKGRldm5hbWUgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ0lGUzogTWlzc2luZyBVTkMgbmFtZSBmb3IgbW91bnQgdGFyZ2V0XG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJCWlmICgodGVtcF9sZW4gPSBzdHJubGVuKGRldm5hbWUsIDMwMCkpIDwgMzAwKSB7CisJCQl2b2wtPlVOQyA9IGttYWxsb2ModGVtcF9sZW4rMSxHRlBfS0VSTkVMKTsKKwkJCWlmKHZvbC0+VU5DID09IE5VTEwpCisJCQkJcmV0dXJuIDE7CisJCQlzdHJjcHkodm9sLT5VTkMsZGV2bmFtZSk7CisJCQlpZiAoc3RybmNtcCh2b2wtPlVOQywgIi8vIiwgMikgPT0gMCkgeworCQkJCXZvbC0+VU5DWzBdID0gJ1xcJzsKKwkJCQl2b2wtPlVOQ1sxXSA9ICdcXCc7CisJCQl9IGVsc2UgaWYgKHN0cm5jbXAodm9sLT5VTkMsICJcXFxcIiwgMikgIT0gMCkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNJRlM6IFVOQyBQYXRoIGRvZXMgbm90IGJlZ2luIHdpdGggLy8gb3IgXFxcXCBcbiIpOworCQkJCXJldHVybiAxOworCQkJfQorCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ0lGUzogVU5DIG5hbWUgdG9vIGxvbmdcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJaWYodm9sLT5VTkNpcCA9PSBOVUxMKQorCQl2b2wtPlVOQ2lwID0gJnZvbC0+VU5DWzJdOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2lmc1Nlc0luZm8gKgorY2lmc19maW5kX3RjcF9zZXNzaW9uKHN0cnVjdCBpbl9hZGRyICogdGFyZ2V0X2lwX2FkZHIsIAorCQlzdHJ1Y3QgaW42X2FkZHIgKnRhcmdldF9pcDZfYWRkciwKKwkJIGNoYXIgKnVzZXJOYW1lLCBzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICoqcHNydlRjcCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisJc3RydWN0IGNpZnNTZXNJbmZvICpzZXM7CisJKnBzcnZUY3AgPSBOVUxMOworCXJlYWRfbG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoKHRtcCwgJkdsb2JhbFNNQlNlc3Npb25MaXN0KSB7CisJCXNlcyA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgY2lmc1Nlc0luZm8sIGNpZnNTZXNzaW9uTGlzdCk7CisJCWlmIChzZXMtPnNlcnZlcikgeworCQkJaWYoKHRhcmdldF9pcF9hZGRyICYmIAorCQkJCShzZXMtPnNlcnZlci0+YWRkci5zb2NrQWRkci5zaW5fYWRkci5zX2FkZHIKKwkJCQkgID09IHRhcmdldF9pcF9hZGRyLT5zX2FkZHIpKSB8fCAodGFyZ2V0X2lwNl9hZGRyCisJCQkJJiYgbWVtY21wKCZzZXMtPnNlcnZlci0+YWRkci5zb2NrQWRkcjYuc2luNl9hZGRyLAorCQkJCQl0YXJnZXRfaXA2X2FkZHIsc2l6ZW9mKCp0YXJnZXRfaXA2X2FkZHIpKSkpeworCQkJCS8qIEJCIGxvY2sgc2VydmVyIGFuZCB0Y3Agc2Vzc2lvbiBhbmQgaW5jcmVtZW50IHVzZSBjb3VudCBoZXJlPz8gKi8KKwkJCQkqcHNydlRjcCA9IHNlcy0+c2VydmVyOwkvKiBmb3VuZCBhIG1hdGNoIG9uIHRoZSBUQ1Agc2Vzc2lvbiAqLworCQkJCS8qIEJCIGNoZWNrIGlmIHJlY29ubmVjdGlvbiBuZWVkZWQgKi8KKwkJCQlpZiAoc3RybmNtcAorCQkJCSAgICAoc2VzLT51c2VyTmFtZSwgdXNlck5hbWUsCisJCQkJICAgICBNQVhfVVNFUk5BTUVfU0laRSkgPT0gMCl7CisJCQkJCXJlYWRfdW5sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKwkJCQkJcmV0dXJuIHNlczsJLyogZm91bmQgZXhhY3QgbWF0Y2ggb24gYm90aCB0Y3AgYW5kIFNNQiBzZXNzaW9ucyAqLworCQkJCX0KKwkJCX0KKwkJfQorCQkvKiBlbHNlIHRjcCBhbmQgc21iIHNlc3Npb25zIG5lZWQgcmVjb25uZWN0aW9uICovCisJfQorCXJlYWRfdW5sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBjaWZzVGNvbkluZm8gKgorZmluZF91bmMoX19iZTMyIG5ld190YXJnZXRfaXBfYWRkciwgY2hhciAqdW5jTmFtZSwgY2hhciAqdXNlck5hbWUpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCXN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb247CisKKwlyZWFkX2xvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCWxpc3RfZm9yX2VhY2godG1wLCAmR2xvYmFsVHJlZUNvbm5lY3Rpb25MaXN0KSB7CisJCWNGWUkoMSwgKCJOZXh0IHRjb24gLSAiKSk7CisJCXRjb24gPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGNpZnNUY29uSW5mbywgY2lmc0Nvbm5lY3Rpb25MaXN0KTsKKwkJaWYgKHRjb24tPnNlcykgeworCQkJaWYgKHRjb24tPnNlcy0+c2VydmVyKSB7CisJCQkJY0ZZSSgxLAorCQkJCSAgICAgKCIgb2xkIGlwIGFkZHI6ICV4ID09IG5ldyBpcCAleCA/IiwKKwkJCQkgICAgICB0Y29uLT5zZXMtPnNlcnZlci0+YWRkci5zb2NrQWRkci5zaW5fYWRkci4KKwkJCQkgICAgICBzX2FkZHIsIG5ld190YXJnZXRfaXBfYWRkcikpOworCQkJCWlmICh0Y29uLT5zZXMtPnNlcnZlci0+YWRkci5zb2NrQWRkci5zaW5fYWRkci4KKwkJCQkgICAgc19hZGRyID09IG5ld190YXJnZXRfaXBfYWRkcikgeworCS8qIEJCIGxvY2sgdGNvbiBhbmQgc2VydmVyIGFuZCB0Y3Agc2Vzc2lvbiBhbmQgaW5jcmVtZW50IHVzZSBjb3VudCBoZXJlPyAqLworCQkJCQkvKiBmb3VuZCBhIG1hdGNoIG9uIHRoZSBUQ1Agc2Vzc2lvbiAqLworCQkJCQkvKiBCQiBjaGVjayBpZiByZWNvbm5lY3Rpb24gbmVlZGVkICovCisJCQkJCWNGWUkoMSwoIk1hdGNoZWQgaXAsIG9sZCBVTkM6ICVzID09IG5ldzogJXMgPyIsCisJCQkJCSAgICAgIHRjb24tPnRyZWVOYW1lLCB1bmNOYW1lKSk7CisJCQkJCWlmIChzdHJuY21wCisJCQkJCSAgICAodGNvbi0+dHJlZU5hbWUsIHVuY05hbWUsCisJCQkJCSAgICAgTUFYX1RSRUVfU0laRSkgPT0gMCkgeworCQkJCQkJY0ZZSSgxLAorCQkJCQkJICAgICAoIk1hdGNoZWQgVU5DLCBvbGQgdXNlcjogJXMgPT0gbmV3OiAlcyA/IiwKKwkJCQkJCSAgICAgIHRjb24tPnRyZWVOYW1lLCB1bmNOYW1lKSk7CisJCQkJCQlpZiAoc3RybmNtcAorCQkJCQkJICAgICh0Y29uLT5zZXMtPnVzZXJOYW1lLAorCQkJCQkJICAgICB1c2VyTmFtZSwKKwkJCQkJCSAgICAgTUFYX1VTRVJOQU1FX1NJWkUpID09IDApIHsKKwkJCQkJCQlyZWFkX3VubG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisJCQkJCQkJcmV0dXJuIHRjb247LyogYWxzbyBtYXRjaGVkIHVzZXIgKHNtYiBzZXNzaW9uKSovCisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisJcmVhZF91bmxvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCXJldHVybiBOVUxMOworfQorCitpbnQKK2Nvbm5lY3RfdG9fZGZzX3BhdGgoaW50IHhpZCwgc3RydWN0IGNpZnNTZXNJbmZvICpwU2VzSW5mbywKKwkJICAgIGNvbnN0IGNoYXIgKm9sZF9wYXRoLCBjb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpCit7CisJdW5zaWduZWQgY2hhciAqcmVmZXJyYWxzID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgbnVtX3JlZmVycmFsczsKKwlpbnQgcmMgPSAwOworCisJcmMgPSBnZXRfZGZzX3BhdGgoeGlkLCBwU2VzSW5mbyxvbGRfcGF0aCwgbmxzX2NvZGVwYWdlLCAKKwkJCSZudW1fcmVmZXJyYWxzLCAmcmVmZXJyYWxzKTsKKworCS8qIEJCIEFkZCBpbiBjb2RlIHRvOiBpZiB2YWxpZCByZWZybCwgaWYgbm90IGlwIGFkZHJlc3MgY29udGFjdAorCQl0aGUgaGVscGVyIHRoYXQgcmVzb2x2ZXMgdGNwIG5hbWVzLCBtb3VudCB0byBpdCwgdHJ5IHRvIAorCQl0Y29uIHRvIGl0IHVubW91bnQgaXQgaWYgZmFpbCAqLworCisJaWYocmVmZXJyYWxzKQorCQlrZnJlZShyZWZlcnJhbHMpOworCisJcmV0dXJuIHJjOworfQorCitpbnQKK2dldF9kZnNfcGF0aChpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Nlc0luZm8gKnBTZXNJbmZvLAorCQkJY29uc3QgY2hhciAqb2xkX3BhdGgsIGNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSwgCisJCQl1bnNpZ25lZCBpbnQgKnBudW1fcmVmZXJyYWxzLCB1bnNpZ25lZCBjaGFyICoqIHByZWZlcnJhbHMpCit7CisJY2hhciAqdGVtcF91bmM7CisJaW50IHJjID0gMDsKKworCSpwbnVtX3JlZmVycmFscyA9IDA7CisKKwlpZiAocFNlc0luZm8tPmlwY190aWQgPT0gMCkgeworCQl0ZW1wX3VuYyA9IGttYWxsb2MoMiAvKiBmb3Igc2xhc2hlcyAqLyArCisJCQlzdHJubGVuKHBTZXNJbmZvLT5zZXJ2ZXJOYW1lLFNFUlZFUl9OQU1FX0xFTl9XSVRIX05VTEwgKiAyKQorCQkJCSArIDEgKyA0IC8qIHNsYXNoIElQQyQgKi8gICsgMiwKKwkJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKHRlbXBfdW5jID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJdGVtcF91bmNbMF0gPSAnXFwnOworCQl0ZW1wX3VuY1sxXSA9ICdcXCc7CisJCXN0cmNweSh0ZW1wX3VuYyArIDIsIHBTZXNJbmZvLT5zZXJ2ZXJOYW1lKTsKKwkJc3RyY3B5KHRlbXBfdW5jICsgMiArIHN0cmxlbihwU2VzSW5mby0+c2VydmVyTmFtZSksICJcXElQQyQiKTsKKwkJcmMgPSBDSUZTVENvbih4aWQsIHBTZXNJbmZvLCB0ZW1wX3VuYywgTlVMTCwgbmxzX2NvZGVwYWdlKTsKKwkJY0ZZSSgxLAorCQkgICAgICgiQ0lGUyBUY29uIHJjID0gJWQgaXBjX3RpZCA9ICVkIiwgcmMscFNlc0luZm8tPmlwY190aWQpKTsKKwkJa2ZyZWUodGVtcF91bmMpOworCX0KKwlpZiAocmMgPT0gMCkKKwkJcmMgPSBDSUZTR2V0REZTUmVmZXIoeGlkLCBwU2VzSW5mbywgb2xkX3BhdGgsIHByZWZlcnJhbHMsCisJCQkJICAgICBwbnVtX3JlZmVycmFscywgbmxzX2NvZGVwYWdlKTsKKworCXJldHVybiByYzsKK30KKworLyogU2VlIFJGQzEwMDEgc2VjdGlvbiAxNCBvbiByZXByZXNlbnRhdGlvbiBvZiBOZXRiaW9zIG5hbWVzICovCitzdGF0aWMgdm9pZCByZmMxMDAybWFuZ2xlKGNoYXIgKiB0YXJnZXQsY2hhciAqIHNvdXJjZSwgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKwl1bnNpZ25lZCBpbnQgaSxqOworCisJZm9yKGk9MCxqPTA7aTwobGVuZ3RoKTtpKyspIHsKKwkJLyogbWFzayBhIG5pYmJsZSBhdCBhIHRpbWUgYW5kIGVuY29kZSAqLworCQl0YXJnZXRbal0gPSAnQScgKyAoMHgwRiAmIChzb3VyY2VbaV0gPj4gNCkpOworCQl0YXJnZXRbaisxXSA9ICdBJyArICgweDBGICYgc291cmNlW2ldKTsKKwkJais9MjsKKwl9CisKK30KKworCitzdGF0aWMgaW50CitpcHY0X2Nvbm5lY3Qoc3RydWN0IHNvY2thZGRyX2luICpwc2luX3NlcnZlciwgc3RydWN0IHNvY2tldCAqKmNzb2NrZXQsIAorCQkJIGNoYXIgKiBuZXRiaW9zX25hbWUpCit7CisJaW50IHJjID0gMDsKKwlpbnQgY29ubmVjdGVkID0gMDsKKwlfX2JlMTYgb3JpZ19wb3J0ID0gMDsKKworCWlmKCpjc29ja2V0ID09IE5VTEwpIHsKKwkJcmMgPSBzb2NrX2NyZWF0ZV9rZXJuKFBGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCwgY3NvY2tldCk7CisJCWlmIChyYyA8IDApIHsKKwkJCWNFUlJPUigxLCAoIkVycm9yICVkIGNyZWF0aW5nIHNvY2tldCIscmMpKTsKKwkJCSpjc29ja2V0ID0gTlVMTDsKKwkJCXJldHVybiByYzsKKwkJfSBlbHNlIHsKKwkJLyogQkIgb3RoZXIgc29ja2V0IG9wdGlvbnMgdG8gc2V0IEtFRVBBTElWRSwgTk9ERUxBWT8gKi8KKwkJCWNGWUkoMSwoIlNvY2tldCBjcmVhdGVkIikpOworCQkJKCpjc29ja2V0KS0+c2stPnNrX2FsbG9jYXRpb24gPSBHRlBfTk9GUzsgCisJCX0KKwl9CisKKwlwc2luX3NlcnZlci0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisJaWYocHNpbl9zZXJ2ZXItPnNpbl9wb3J0KSB7IC8qIHVzZXIgb3ZlcnJvZGUgZGVmYXVsdCBwb3J0ICovCisJCXJjID0gKCpjc29ja2V0KS0+b3BzLT5jb25uZWN0KCpjc29ja2V0LAorCQkJCShzdHJ1Y3Qgc29ja2FkZHIgKikgcHNpbl9zZXJ2ZXIsCisJCQkJc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfaW4pLDApOworCQlpZiAocmMgPj0gMCkKKwkJCWNvbm5lY3RlZCA9IDE7CisJfSAKKworCWlmKCFjb25uZWN0ZWQpIHsKKwkJLyogc2F2ZSBvcmlnaW5hbCBwb3J0IHNvIHdlIGNhbiByZXRyeSB1c2VyIHNwZWNpZmllZCBwb3J0ICAKKwkJCWxhdGVyIGlmIGZhbGwgYmFjayBwb3J0cyBmYWlsIHRoaXMgdGltZSAgKi8KKwkJb3JpZ19wb3J0ID0gcHNpbl9zZXJ2ZXItPnNpbl9wb3J0OworCisJCS8qIGRvIG5vdCByZXRyeSBvbiB0aGUgc2FtZSBwb3J0IHdlIGp1c3QgZmFpbGVkIG9uICovCisJCWlmKHBzaW5fc2VydmVyLT5zaW5fcG9ydCAhPSBodG9ucyhDSUZTX1BPUlQpKSB7CisJCQlwc2luX3NlcnZlci0+c2luX3BvcnQgPSBodG9ucyhDSUZTX1BPUlQpOworCisJCQlyYyA9ICgqY3NvY2tldCktPm9wcy0+Y29ubmVjdCgqY3NvY2tldCwKKwkJCQkJKHN0cnVjdCBzb2NrYWRkciAqKSBwc2luX3NlcnZlciwKKwkJCQkJc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfaW4pLDApOworCQkJaWYgKHJjID49IDApCisJCQkJY29ubmVjdGVkID0gMTsKKwkJfQorCX0KKwlpZiAoIWNvbm5lY3RlZCkgeworCQlwc2luX3NlcnZlci0+c2luX3BvcnQgPSBodG9ucyhSRkMxMDAxX1BPUlQpOworCQlyYyA9ICgqY3NvY2tldCktPm9wcy0+Y29ubmVjdCgqY3NvY2tldCwgKHN0cnVjdCBzb2NrYWRkciAqKQorCQkJCQkgICAgICBwc2luX3NlcnZlciwgc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfaW4pLDApOworCQlpZiAocmMgPj0gMCkgCisJCQljb25uZWN0ZWQgPSAxOworCX0KKworCS8qIGdpdmUgdXAgaGVyZSAtIHVubGVzcyB3ZSB3YW50IHRvIHJldHJ5IG9uIGRpZmZlcmVudAorCQlwcm90b2NvbCBmYW1pbGllcyBzb21lIGRheSAqLworCWlmICghY29ubmVjdGVkKSB7CisJCWlmKG9yaWdfcG9ydCkKKwkJCXBzaW5fc2VydmVyLT5zaW5fcG9ydCA9IG9yaWdfcG9ydDsKKwkJY0ZZSSgxLCgiRXJyb3IgJWQgY29ubmVjdGluZyB0byBzZXJ2ZXIgdmlhIGlwdjQiLHJjKSk7CisJCXNvY2tfcmVsZWFzZSgqY3NvY2tldCk7CisJCSpjc29ja2V0ID0gTlVMTDsKKwkJcmV0dXJuIHJjOworCX0KKwkvKiBFdmVudHVhbGx5IGNoZWNrIGZvciBvdGhlciBzb2NrZXQgb3B0aW9ucyB0byBjaGFuZ2UgZnJvbSAKKwkJdGhlIGRlZmF1bHQuIHNvY2tfc2V0c29ja29wdCBub3QgdXNlZCBiZWNhdXNlIGl0IGV4cGVjdHMgCisJCXVzZXIgc3BhY2UgYnVmZmVyICovCisJKCpjc29ja2V0KS0+c2stPnNrX3JjdnRpbWVvID0gNyAqIEhaOworCisJLyogc2VuZCBSRkMxMDAxIHNlc3Npbml0ICovCisKKwlpZihwc2luX3NlcnZlci0+c2luX3BvcnQgPT0gaHRvbnMoUkZDMTAwMV9QT1JUKSkgeworCQkvKiBzb21lIHNlcnZlcnMgcmVxdWlyZSBSRkMxMDAxIHNlc3Npbml0IGJlZm9yZSBzZW5kaW5nCisJCW5lZ3Byb3QgLSBCQiBjaGVjayByZWNvbm5lY3Rpb24gaW4gY2FzZSB3aGVyZSBzZWNvbmQgCisJCXNlc3Npbml0IGlzIHNlbnQgYnV0IG5vIHNlY29uZCBuZWdwcm90ICovCisJCXN0cnVjdCByZmMxMDAyX3Nlc3Npb25fcGFja2V0ICogc2VzX2luaXRfYnVmOworCQlzdHJ1Y3Qgc21iX2hkciAqIHNtYl9idWY7CisJCXNlc19pbml0X2J1ZiA9IGNpZnNfa2NhbGxvYyhzaXplb2Yoc3RydWN0IHJmYzEwMDJfc2Vzc2lvbl9wYWNrZXQpLCBHRlBfS0VSTkVMKTsKKwkJaWYoc2VzX2luaXRfYnVmKSB7CisJCQlzZXNfaW5pdF9idWYtPnRyYWlsZXIuc2Vzc2lvbl9yZXEuY2FsbGVkX2xlbiA9IDMyOworCQkJcmZjMTAwMm1hbmdsZShzZXNfaW5pdF9idWYtPnRyYWlsZXIuc2Vzc2lvbl9yZXEuY2FsbGVkX25hbWUsCisJCQkJREVGQVVMVF9DSUZTX0NBTExFRF9OQU1FLDE2KTsKKwkJCXNlc19pbml0X2J1Zi0+dHJhaWxlci5zZXNzaW9uX3JlcS5jYWxsaW5nX2xlbiA9IDMyOworCQkJLyogY2FsbGluZyBuYW1lIGVuZHMgaW4gbnVsbCAoYnl0ZSAxNikgZnJvbSBvbGQgc21iCisJCQljb252ZW50aW9uLiAqLworCQkJaWYobmV0Ymlvc19uYW1lICYmIChuZXRiaW9zX25hbWVbMF0gIT0wKSkgeworCQkJCXJmYzEwMDJtYW5nbGUoc2VzX2luaXRfYnVmLT50cmFpbGVyLnNlc3Npb25fcmVxLmNhbGxpbmdfbmFtZSwKKwkJCQkJbmV0Ymlvc19uYW1lLDE2KTsKKwkJCX0gZWxzZSB7CisJCQkJcmZjMTAwMm1hbmdsZShzZXNfaW5pdF9idWYtPnRyYWlsZXIuc2Vzc2lvbl9yZXEuY2FsbGluZ19uYW1lLAorCQkJCQkiTElOVVhfQ0lGU19DTE5UIiwxNik7CisJCQl9CisJCQlzZXNfaW5pdF9idWYtPnRyYWlsZXIuc2Vzc2lvbl9yZXEuc2NvcGUxID0gMDsKKwkJCXNlc19pbml0X2J1Zi0+dHJhaWxlci5zZXNzaW9uX3JlcS5zY29wZTIgPSAwOworCQkJc21iX2J1ZiA9IChzdHJ1Y3Qgc21iX2hkciAqKXNlc19pbml0X2J1ZjsKKwkJCS8qIHNpemVvZiBSRkMxMDAyX1NFU1NJT05fUkVRVUVTVCB3aXRoIG5vIHNjb3BlICovCisJCQlzbWJfYnVmLT5zbWJfYnVmX2xlbmd0aCA9IDB4ODEwMDAwNDQ7CisJCQlyYyA9IHNtYl9zZW5kKCpjc29ja2V0LCBzbWJfYnVmLCAweDQ0LAorCQkJCShzdHJ1Y3Qgc29ja2FkZHIgKilwc2luX3NlcnZlcik7CisJCQlrZnJlZShzZXNfaW5pdF9idWYpOworCQl9CisJCS8qIGVsc2UgdGhlIG5lZ3Byb3QgbWF5IHN0aWxsIHdvcmsgd2l0aG91dCB0aGlzIAorCQlldmVuIHRob3VnaCBtYWxsb2MgZmFpbGVkICovCisJCQorCX0KKwkJCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CitpcHY2X2Nvbm5lY3Qoc3RydWN0IHNvY2thZGRyX2luNiAqcHNpbl9zZXJ2ZXIsIHN0cnVjdCBzb2NrZXQgKipjc29ja2V0KQoreworCWludCByYyA9IDA7CisJaW50IGNvbm5lY3RlZCA9IDA7CisJX19iZTE2IG9yaWdfcG9ydCA9IDA7CisKKwlpZigqY3NvY2tldCA9PSBOVUxMKSB7CisJCXJjID0gc29ja19jcmVhdGVfa2VybihQRl9JTkVUNiwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQLCBjc29ja2V0KTsKKwkJaWYgKHJjIDwgMCkgeworCQkJY0VSUk9SKDEsICgiRXJyb3IgJWQgY3JlYXRpbmcgaXB2NiBzb2NrZXQiLHJjKSk7CisJCQkqY3NvY2tldCA9IE5VTEw7CisJCQlyZXR1cm4gcmM7CisJCX0gZWxzZSB7CisJCS8qIEJCIG90aGVyIHNvY2tldCBvcHRpb25zIHRvIHNldCBLRUVQQUxJVkUsIE5PREVMQVk/ICovCisJCQkgY0ZZSSgxLCgiaXB2NiBTb2NrZXQgY3JlYXRlZCIpKTsKKwkJCSgqY3NvY2tldCktPnNrLT5za19hbGxvY2F0aW9uID0gR0ZQX05PRlM7CisJCX0KKwl9CisKKwlwc2luX3NlcnZlci0+c2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKKworCWlmKHBzaW5fc2VydmVyLT5zaW42X3BvcnQpIHsgLyogdXNlciBvdmVycm9kZSBkZWZhdWx0IHBvcnQgKi8KKwkJcmMgPSAoKmNzb2NrZXQpLT5vcHMtPmNvbm5lY3QoKmNzb2NrZXQsCisJCQkJKHN0cnVjdCBzb2NrYWRkciAqKSBwc2luX3NlcnZlciwKKwkJCQlzaXplb2YgKHN0cnVjdCBzb2NrYWRkcl9pbjYpLDApOworCQlpZiAocmMgPj0gMCkKKwkJCWNvbm5lY3RlZCA9IDE7CisJfSAKKworCWlmKCFjb25uZWN0ZWQpIHsKKwkJLyogc2F2ZSBvcmlnaW5hbCBwb3J0IHNvIHdlIGNhbiByZXRyeSB1c2VyIHNwZWNpZmllZCBwb3J0ICAKKwkJCWxhdGVyIGlmIGZhbGwgYmFjayBwb3J0cyBmYWlsIHRoaXMgdGltZSAgKi8KKworCQlvcmlnX3BvcnQgPSBwc2luX3NlcnZlci0+c2luNl9wb3J0OworCQkvKiBkbyBub3QgcmV0cnkgb24gdGhlIHNhbWUgcG9ydCB3ZSBqdXN0IGZhaWxlZCBvbiAqLworCQlpZihwc2luX3NlcnZlci0+c2luNl9wb3J0ICE9IGh0b25zKENJRlNfUE9SVCkpIHsKKwkJCXBzaW5fc2VydmVyLT5zaW42X3BvcnQgPSBodG9ucyhDSUZTX1BPUlQpOworCisJCQlyYyA9ICgqY3NvY2tldCktPm9wcy0+Y29ubmVjdCgqY3NvY2tldCwKKwkJCQkJKHN0cnVjdCBzb2NrYWRkciAqKSBwc2luX3NlcnZlciwKKwkJCQkJc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfaW42KSwwKTsKKwkJCWlmIChyYyA+PSAwKQorCQkJCWNvbm5lY3RlZCA9IDE7CisJCX0KKwl9CisJaWYgKCFjb25uZWN0ZWQpIHsKKwkJcHNpbl9zZXJ2ZXItPnNpbjZfcG9ydCA9IGh0b25zKFJGQzEwMDFfUE9SVCk7CisJCXJjID0gKCpjc29ja2V0KS0+b3BzLT5jb25uZWN0KCpjc29ja2V0LCAoc3RydWN0IHNvY2thZGRyICopCisJCQkJCSBwc2luX3NlcnZlciwgc2l6ZW9mIChzdHJ1Y3Qgc29ja2FkZHJfaW42KSwwKTsKKwkJaWYgKHJjID49IDApIAorCQkJY29ubmVjdGVkID0gMTsKKwl9CisKKwkvKiBnaXZlIHVwIGhlcmUgLSB1bmxlc3Mgd2Ugd2FudCB0byByZXRyeSBvbiBkaWZmZXJlbnQKKwkJcHJvdG9jb2wgZmFtaWxpZXMgc29tZSBkYXkgKi8KKwlpZiAoIWNvbm5lY3RlZCkgeworCQlpZihvcmlnX3BvcnQpCisJCQlwc2luX3NlcnZlci0+c2luNl9wb3J0ID0gb3JpZ19wb3J0OworCQljRllJKDEsKCJFcnJvciAlZCBjb25uZWN0aW5nIHRvIHNlcnZlciB2aWEgaXB2NiIscmMpKTsKKwkJc29ja19yZWxlYXNlKCpjc29ja2V0KTsKKwkJKmNzb2NrZXQgPSBOVUxMOworCQlyZXR1cm4gcmM7CisJfQorCS8qIEV2ZW50dWFsbHkgY2hlY2sgZm9yIG90aGVyIHNvY2tldCBvcHRpb25zIHRvIGNoYW5nZSBmcm9tIAorCQl0aGUgZGVmYXVsdC4gc29ja19zZXRzb2Nrb3B0IG5vdCB1c2VkIGJlY2F1c2UgaXQgZXhwZWN0cyAKKwkJdXNlciBzcGFjZSBidWZmZXIgKi8KKwkoKmNzb2NrZXQpLT5zay0+c2tfcmN2dGltZW8gPSA3ICogSFo7CisJCQorCXJldHVybiByYzsKK30KKworaW50CitjaWZzX21vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IsCisJICAgY2hhciAqbW91bnRfZGF0YSwgY29uc3QgY2hhciAqZGV2bmFtZSkKK3sKKwlpbnQgcmMgPSAwOworCWludCB4aWQ7CisJaW50IGFkZHJlc3NfdHlwZSA9IEFGX0lORVQ7CisJc3RydWN0IHNvY2tldCAqY3NvY2tldCA9IE5VTEw7CisJc3RydWN0IHNvY2thZGRyX2luIHNpbl9zZXJ2ZXI7CisJc3RydWN0IHNvY2thZGRyX2luNiBzaW5fc2VydmVyNjsKKwlzdHJ1Y3Qgc21iX3ZvbCB2b2x1bWVfaW5mbzsKKwlzdHJ1Y3QgY2lmc1Nlc0luZm8gKnBTZXNJbmZvID0gTlVMTDsKKwlzdHJ1Y3QgY2lmc1Nlc0luZm8gKmV4aXN0aW5nQ2lmc1NlcyA9IE5VTEw7CisJc3RydWN0IGNpZnNUY29uSW5mbyAqdGNvbiA9IE5VTEw7CisJc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc3J2VGNwID0gTlVMTDsKKworCXhpZCA9IEdldFhpZCgpOworCisvKiBjRllJKDEsICgiRW50ZXJpbmcgY2lmc19tb3VudC4gWGlkOiAlZCB3aXRoOiAlcyIsIHhpZCwgbW91bnRfZGF0YSkpOyAqLworCQorCW1lbXNldCgmdm9sdW1lX2luZm8sMCxzaXplb2Yoc3RydWN0IHNtYl92b2wpKTsKKwlpZiAoY2lmc19wYXJzZV9tb3VudF9vcHRpb25zKG1vdW50X2RhdGEsIGRldm5hbWUsICZ2b2x1bWVfaW5mbykpIHsKKwkJaWYodm9sdW1lX2luZm8uVU5DKQorCQkJa2ZyZWUodm9sdW1lX2luZm8uVU5DKTsKKwkJaWYodm9sdW1lX2luZm8ucGFzc3dvcmQpCisJCQlrZnJlZSh2b2x1bWVfaW5mby5wYXNzd29yZCk7CisJCUZyZWVYaWQoeGlkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHZvbHVtZV9pbmZvLnVzZXJuYW1lKSB7CisJCS8qIEJCIGZpeG1lIHBhcnNlIGZvciBkb21haW4gbmFtZSBoZXJlICovCisJCWNGWUkoMSwgKCJVc2VybmFtZTogJXMgIiwgdm9sdW1lX2luZm8udXNlcm5hbWUpKTsKKworCX0gZWxzZSB7CisJCWNpZnNlcnJvcigiTm8gdXNlcm5hbWUgc3BlY2lmaWVkICIpOworICAgICAgICAvKiBJbiB1c2Vyc3BhY2UgbW91bnQgaGVscGVyIHdlIGNhbiBnZXQgdXNlciBuYW1lIGZyb20gYWx0ZXJuYXRlCisgICAgICAgICAgIGxvY2F0aW9ucyBzdWNoIGFzIGVudiB2YXJpYWJsZXMgYW5kIGZpbGVzIG9uIGRpc2sgKi8KKwkJaWYodm9sdW1lX2luZm8uVU5DKQorCQkJa2ZyZWUodm9sdW1lX2luZm8uVU5DKTsKKwkJaWYodm9sdW1lX2luZm8ucGFzc3dvcmQpCisJCQlrZnJlZSh2b2x1bWVfaW5mby5wYXNzd29yZCk7CisJCUZyZWVYaWQoeGlkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHZvbHVtZV9pbmZvLlVOQ2lwICYmIHZvbHVtZV9pbmZvLlVOQykgeworCQlyYyA9IGNpZnNfaW5ldF9wdG9uKEFGX0lORVQsIHZvbHVtZV9pbmZvLlVOQ2lwLCZzaW5fc2VydmVyLnNpbl9hZGRyLnNfYWRkcik7CisKKwkJaWYocmMgPD0gMCkgeworCQkJLyogbm90IGlwdjQgYWRkcmVzcywgdHJ5IGlwdjYgKi8KKwkJCXJjID0gY2lmc19pbmV0X3B0b24oQUZfSU5FVDYsdm9sdW1lX2luZm8uVU5DaXAsJnNpbl9zZXJ2ZXI2LnNpbjZfYWRkci5pbjZfdSk7IAorCQkJaWYocmMgPiAwKQorCQkJCWFkZHJlc3NfdHlwZSA9IEFGX0lORVQ2OworCQl9IGVsc2UgeworCQkJYWRkcmVzc190eXBlID0gQUZfSU5FVDsKKwkJfQorICAgICAgIAorCQlpZihyYyA8PSAwKSB7CisJCQkvKiB3ZSBmYWlsZWQgdHJhbnNsYXRpbmcgYWRkcmVzcyAqLworCQkJaWYodm9sdW1lX2luZm8uVU5DKQorCQkJCWtmcmVlKHZvbHVtZV9pbmZvLlVOQyk7CisJCQlpZih2b2x1bWVfaW5mby5wYXNzd29yZCkKKwkJCQlrZnJlZSh2b2x1bWVfaW5mby5wYXNzd29yZCk7CisJCQlGcmVlWGlkKHhpZCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWNGWUkoMSwgKCJVTkM6ICVzIGlwOiAlcyIsIHZvbHVtZV9pbmZvLlVOQywgdm9sdW1lX2luZm8uVU5DaXApKTsKKwkJLyogc3VjY2VzcyAqLworCQlyYyA9IDA7CisJfSBlbHNlIGlmICh2b2x1bWVfaW5mby5VTkNpcCl7CisJCS8qIEJCIHVzaW5nIGlwIGFkZHIgYXMgc2VydmVyIG5hbWUgY29ubmVjdCB0byB0aGUgREZTIHJvb3QgYmVsb3cgKi8KKwkJY0VSUk9SKDEsKCJDb25uZWN0aW5nIHRvIERGUyByb290IG5vdCBpbXBsZW1lbnRlZCB5ZXQiKSk7CisJCWlmKHZvbHVtZV9pbmZvLlVOQykKKwkJCWtmcmVlKHZvbHVtZV9pbmZvLlVOQyk7CisJCWlmKHZvbHVtZV9pbmZvLnBhc3N3b3JkKQorCQkJa2ZyZWUodm9sdW1lX2luZm8ucGFzc3dvcmQpOworCQlGcmVlWGlkKHhpZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSAvKiB3aGljaCBzZXJ2ZXJzIERGUyByb290IHdvdWxkIHdlIGNvbmVjdCB0byAqLyB7CisJCWNFUlJPUigxLAorCQkgICAgICAgKCJDSUZTIG1vdW50IGVycm9yOiBObyBVTkMgcGF0aCAoZS5nLiAtbyB1bmM9Ly8xOTIuMTY4LjEuMTAwL3B1YmxpYykgc3BlY2lmaWVkICAiKSk7CisJCWlmKHZvbHVtZV9pbmZvLlVOQykKKwkJCWtmcmVlKHZvbHVtZV9pbmZvLlVOQyk7CisJCWlmKHZvbHVtZV9pbmZvLnBhc3N3b3JkKQorCQkJa2ZyZWUodm9sdW1lX2luZm8ucGFzc3dvcmQpOworCQlGcmVlWGlkKHhpZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHRoaXMgaXMgbmVlZGVkIGZvciBBU0NJSSBjcCB0byBVbmljb2RlIGNvbnZlcnRzICovCisJaWYodm9sdW1lX2luZm8uaW9jaGFyc2V0ID09IE5VTEwpIHsKKwkJY2lmc19zYi0+bG9jYWxfbmxzID0gbG9hZF9ubHNfZGVmYXVsdCgpOworCS8qIGxvYWRfbmxzX2RlZmF1bHQgY2FuIG5vdCByZXR1cm4gbnVsbCAqLworCX0gZWxzZSB7CisJCWNpZnNfc2ItPmxvY2FsX25scyA9IGxvYWRfbmxzKHZvbHVtZV9pbmZvLmlvY2hhcnNldCk7CisJCWlmKGNpZnNfc2ItPmxvY2FsX25scyA9PSBOVUxMKSB7CisJCQljRVJST1IoMSwoIkNJRlMgbW91bnQgZXJyb3I6IGlvY2hhcnNldCAlcyBub3QgZm91bmQiLHZvbHVtZV9pbmZvLmlvY2hhcnNldCkpOworCQkJaWYodm9sdW1lX2luZm8uVU5DKQorCQkJCWtmcmVlKHZvbHVtZV9pbmZvLlVOQyk7CisJCQlpZih2b2x1bWVfaW5mby5wYXNzd29yZCkKKwkJCQlrZnJlZSh2b2x1bWVfaW5mby5wYXNzd29yZCk7CisJCQlGcmVlWGlkKHhpZCk7CisJCQlyZXR1cm4gLUVMSUJBQ0M7CisJCX0KKwl9CisKKwlpZihhZGRyZXNzX3R5cGUgPT0gQUZfSU5FVCkKKwkJZXhpc3RpbmdDaWZzU2VzID0gY2lmc19maW5kX3RjcF9zZXNzaW9uKCZzaW5fc2VydmVyLnNpbl9hZGRyLAorCQkJTlVMTCAvKiBubyBpcHY2IGFkZHIgKi8sCisJCQl2b2x1bWVfaW5mby51c2VybmFtZSwgJnNydlRjcCk7CisJZWxzZSBpZihhZGRyZXNzX3R5cGUgPT0gQUZfSU5FVDYpCisJCWV4aXN0aW5nQ2lmc1NlcyA9IGNpZnNfZmluZF90Y3Bfc2Vzc2lvbihOVUxMIC8qIG5vIGlwdjQgYWRkciAqLywKKwkJCSZzaW5fc2VydmVyNi5zaW42X2FkZHIsCisJCQl2b2x1bWVfaW5mby51c2VybmFtZSwgJnNydlRjcCk7CisJZWxzZSB7CisJCWlmKHZvbHVtZV9pbmZvLlVOQykKKwkJCWtmcmVlKHZvbHVtZV9pbmZvLlVOQyk7CisJCWlmKHZvbHVtZV9pbmZvLnBhc3N3b3JkKQorCQkJa2ZyZWUodm9sdW1lX2luZm8ucGFzc3dvcmQpOworCQlGcmVlWGlkKHhpZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCisJaWYgKHNydlRjcCkgeworCQljRllJKDEsICgiRXhpc3RpbmcgdGNwIHNlc3Npb24gd2l0aCBzZXJ2ZXIgZm91bmQgIikpOyAgICAgICAgICAgICAgICAKKwl9IGVsc2UgewkvKiBjcmVhdGUgc29ja2V0ICovCisJCWlmKHZvbHVtZV9pbmZvLnBvcnQpCisJCQlzaW5fc2VydmVyLnNpbl9wb3J0ID0gaHRvbnModm9sdW1lX2luZm8ucG9ydCk7CisJCWVsc2UKKwkJCXNpbl9zZXJ2ZXIuc2luX3BvcnQgPSAwOworCQlyYyA9IGlwdjRfY29ubmVjdCgmc2luX3NlcnZlciwmY3NvY2tldCx2b2x1bWVfaW5mby5zb3VyY2VfcmZjMTAwMV9uYW1lKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJY0VSUk9SKDEsCisJCQkgICAgICAgKCJFcnJvciBjb25uZWN0aW5nIHRvIElQdjQgc29ja2V0LiBBYm9ydGluZyBvcGVyYXRpb24iKSk7CisJCQlpZihjc29ja2V0ICE9IE5VTEwpCisJCQkJc29ja19yZWxlYXNlKGNzb2NrZXQpOworCQkJaWYodm9sdW1lX2luZm8uVU5DKQorCQkJCWtmcmVlKHZvbHVtZV9pbmZvLlVOQyk7CisJCQlpZih2b2x1bWVfaW5mby5wYXNzd29yZCkKKwkJCQlrZnJlZSh2b2x1bWVfaW5mby5wYXNzd29yZCk7CisJCQlGcmVlWGlkKHhpZCk7CisJCQlyZXR1cm4gcmM7CisJCX0KKworCQlzcnZUY3AgPSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyksIEdGUF9LRVJORUwpOworCQlpZiAoc3J2VGNwID09IE5VTEwpIHsKKwkJCXJjID0gLUVOT01FTTsKKwkJCXNvY2tfcmVsZWFzZShjc29ja2V0KTsKKwkJCWlmKHZvbHVtZV9pbmZvLlVOQykKKwkJCQlrZnJlZSh2b2x1bWVfaW5mby5VTkMpOworCQkJaWYodm9sdW1lX2luZm8ucGFzc3dvcmQpCisJCQkJa2ZyZWUodm9sdW1lX2luZm8ucGFzc3dvcmQpOworCQkJRnJlZVhpZCh4aWQpOworCQkJcmV0dXJuIHJjOworCQl9IGVsc2UgeworCQkJbWVtc2V0KHNydlRjcCwgMCwgc2l6ZW9mIChzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvKSk7CisJCQltZW1jcHkoJnNydlRjcC0+YWRkci5zb2NrQWRkciwgJnNpbl9zZXJ2ZXIsIHNpemVvZiAoc3RydWN0IHNvY2thZGRyX2luKSk7CisJCQlhdG9taWNfc2V0KCZzcnZUY3AtPmluRmxpZ2h0LDApOworCQkJLyogQkIgQWRkIGNvZGUgZm9yIGlwdjYgY2FzZSB0b28gKi8KKwkJCXNydlRjcC0+c3NvY2tldCA9IGNzb2NrZXQ7CisJCQlzcnZUY3AtPnByb3RvY29sVHlwZSA9IElQVjQ7CisJCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzcnZUY3AtPnJlc3BvbnNlX3EpOworCQkJaW5pdF93YWl0cXVldWVfaGVhZCgmc3J2VGNwLT5yZXF1ZXN0X3EpOworCQkJSU5JVF9MSVNUX0hFQUQoJnNydlRjcC0+cGVuZGluZ19taWRfcSk7CisJCQkvKiBhdCB0aGlzIHBvaW50IHdlIGFyZSB0aGUgb25seSBvbmVzIHdpdGggdGhlIHBvaW50ZXIKKwkJCXRvIHRoZSBzdHJ1Y3Qgc2luY2UgdGhlIGtlcm5lbCB0aHJlYWQgbm90IGNyZWF0ZWQgeWV0CisJCQlzbyBubyBuZWVkIHRvIHNwaW5sb2NrIHRoaXMgaW5pdCBvZiB0Y3BTdGF0dXMgKi8KKwkJCXNydlRjcC0+dGNwU3RhdHVzID0gQ2lmc05ldzsKKwkJCWluaXRfTVVURVgoJnNydlRjcC0+dGNwU2VtKTsKKwkJCXJjID0gKGludClrZXJuZWxfdGhyZWFkKCh2b2lkICopKHZvaWQgKiljaWZzX2RlbXVsdGlwbGV4X3RocmVhZCwgc3J2VGNwLAorCQkJCSAgICAgIENMT05FX0ZTIHwgQ0xPTkVfRklMRVMgfCBDTE9ORV9WTSk7CisJCQlpZihyYyA8IDApIHsKKwkJCQlyYyA9IC1FTk9NRU07CisJCQkJc29ja19yZWxlYXNlKGNzb2NrZXQpOworCQkJCWlmKHZvbHVtZV9pbmZvLlVOQykKKwkJCQkJa2ZyZWUodm9sdW1lX2luZm8uVU5DKTsKKwkJCQlpZih2b2x1bWVfaW5mby5wYXNzd29yZCkKKwkJCQkJa2ZyZWUodm9sdW1lX2luZm8ucGFzc3dvcmQpOworCQkJCUZyZWVYaWQoeGlkKTsKKwkJCQlyZXR1cm4gcmM7CisJCQl9IGVsc2UKKwkJCQlyYyA9IDA7CisJCQltZW1jcHkoc3J2VGNwLT53b3Jrc3RhdGlvbl9SRkMxMDAxX25hbWUsIHZvbHVtZV9pbmZvLnNvdXJjZV9yZmMxMDAxX25hbWUsMTYpOworCQl9CisJfQorCisJaWYgKGV4aXN0aW5nQ2lmc1NlcykgeworCQlwU2VzSW5mbyA9IGV4aXN0aW5nQ2lmc1NlczsKKwkJY0ZZSSgxLCAoIkV4aXN0aW5nIHNtYiBzZXNzIGZvdW5kICIpKTsKKwkJaWYodm9sdW1lX2luZm8ucGFzc3dvcmQpCisJCQlrZnJlZSh2b2x1bWVfaW5mby5wYXNzd29yZCk7CisJCS8qIHZvbHVtZV9pbmZvLlVOQyBmcmVlZCBhdCBlbmQgb2YgZnVuY3Rpb24gKi8KKwl9IGVsc2UgaWYgKCFyYykgeworCQljRllJKDEsICgiRXhpc3Rpbmcgc21iIHNlc3Mgbm90IGZvdW5kICIpKTsKKwkJcFNlc0luZm8gPSBzZXNJbmZvQWxsb2MoKTsKKwkJaWYgKHBTZXNJbmZvID09IE5VTEwpCisJCQlyYyA9IC1FTk9NRU07CisJCWVsc2UgeworCQkJcFNlc0luZm8tPnNlcnZlciA9IHNydlRjcDsKKwkJCXNwcmludGYocFNlc0luZm8tPnNlcnZlck5hbWUsICIldS4ldS4ldS4ldSIsCisJCQkJTklQUVVBRChzaW5fc2VydmVyLnNpbl9hZGRyLnNfYWRkcikpOworCQl9CisKKwkJaWYgKCFyYyl7CisJCQkvKiB2b2x1bWVfaW5mby5wYXNzd29yZCBmcmVlZCBhdCB1bm1vdW50ICovICAgCisJCQlpZiAodm9sdW1lX2luZm8ucGFzc3dvcmQpCisJCQkJcFNlc0luZm8tPnBhc3N3b3JkID0gdm9sdW1lX2luZm8ucGFzc3dvcmQ7CisJCQlpZiAodm9sdW1lX2luZm8udXNlcm5hbWUpCisJCQkJc3RybmNweShwU2VzSW5mby0+dXNlck5hbWUsCisJCQkJCXZvbHVtZV9pbmZvLnVzZXJuYW1lLE1BWF9VU0VSTkFNRV9TSVpFKTsKKwkJCWlmICh2b2x1bWVfaW5mby5kb21haW5uYW1lKQorCQkJCXN0cm5jcHkocFNlc0luZm8tPmRvbWFpbk5hbWUsCisJCQkJCXZvbHVtZV9pbmZvLmRvbWFpbm5hbWUsTUFYX1VTRVJOQU1FX1NJWkUpOworCQkJcFNlc0luZm8tPmxpbnV4X3VpZCA9IHZvbHVtZV9pbmZvLmxpbnV4X3VpZDsKKwkJCWRvd24oJnBTZXNJbmZvLT5zZXNTZW0pOworCQkJcmMgPSBjaWZzX3NldHVwX3Nlc3Npb24oeGlkLHBTZXNJbmZvLCBjaWZzX3NiLT5sb2NhbF9ubHMpOworCQkJdXAoJnBTZXNJbmZvLT5zZXNTZW0pOworCQkJaWYoIXJjKQorCQkJCWF0b21pY19pbmMoJnNydlRjcC0+c29ja2V0VXNlQ291bnQpOworCQl9IGVsc2UKKwkJCWlmKHZvbHVtZV9pbmZvLnBhc3N3b3JkKQorCQkJCWtmcmVlKHZvbHVtZV9pbmZvLnBhc3N3b3JkKTsKKwl9CisgICAgCisJLyogc2VhcmNoIGZvciBleGlzdGluZyB0Y29uIHRvIHRoaXMgc2VydmVyIHNoYXJlICovCisJaWYgKCFyYykgeworCQlpZigodm9sdW1lX2luZm8ucnNpemUpICYmICh2b2x1bWVfaW5mby5yc2l6ZSA8PSBDSUZTTWF4QnVmU2l6ZSkpCisJCQljaWZzX3NiLT5yc2l6ZSA9IHZvbHVtZV9pbmZvLnJzaXplOworCQllbHNlCisJCQljaWZzX3NiLT5yc2l6ZSA9IHNydlRjcC0+bWF4QnVmIC0gTUFYX0NJRlNfSERSX1NJWkU7IC8qIGRlZmF1bHQgKi8KKwkJaWYoKHZvbHVtZV9pbmZvLndzaXplKSAmJiAodm9sdW1lX2luZm8ud3NpemUgPD0gQ0lGU01heEJ1ZlNpemUpKQorCQkJY2lmc19zYi0+d3NpemUgPSB2b2x1bWVfaW5mby53c2l6ZTsKKwkJZWxzZQorCQkJY2lmc19zYi0+d3NpemUgPSBDSUZTTWF4QnVmU2l6ZTsgLyogZGVmYXVsdCAqLworCQlpZihjaWZzX3NiLT5yc2l6ZSA8IFBBR0VfQ0FDSEVfU0laRSkgeworCQkJY2lmc19zYi0+cnNpemUgPSBQQUdFX0NBQ0hFX1NJWkU7CisJCQljRVJST1IoMSwoIkF0dGVtcHQgdG8gc2V0IHJlYWRzaXplIGZvciBtb3VudCB0byBsZXNzIHRoYW4gb25lIHBhZ2UgKDQwOTYpIikpOworCQl9CisJCWNpZnNfc2ItPm1udF91aWQgPSB2b2x1bWVfaW5mby5saW51eF91aWQ7CisJCWNpZnNfc2ItPm1udF9naWQgPSB2b2x1bWVfaW5mby5saW51eF9naWQ7CisJCWNpZnNfc2ItPm1udF9maWxlX21vZGUgPSB2b2x1bWVfaW5mby5maWxlX21vZGU7CisJCWNpZnNfc2ItPm1udF9kaXJfbW9kZSA9IHZvbHVtZV9pbmZvLmRpcl9tb2RlOworCQljRllJKDEsKCJmaWxlIG1vZGU6IDB4JXggIGRpciBtb2RlOiAweCV4IixjaWZzX3NiLT5tbnRfZmlsZV9tb2RlLGNpZnNfc2ItPm1udF9kaXJfbW9kZSkpOworCisJCWlmKHZvbHVtZV9pbmZvLm5vcGVybSkKKwkJCWNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzIHw9IENJRlNfTU9VTlRfTk9fUEVSTTsKKwkJaWYodm9sdW1lX2luZm8uc2V0dWlkcykKKwkJCWNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzIHw9IENJRlNfTU9VTlRfU0VUX1VJRDsKKwkJaWYodm9sdW1lX2luZm8uc2VydmVyX2lubykKKwkJCWNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzIHw9IENJRlNfTU9VTlRfU0VSVkVSX0lOVU07CisJCWlmKHZvbHVtZV9pbmZvLm5vX3hhdHRyKQorCQkJY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgfD0gQ0lGU19NT1VOVF9OT19YQVRUUjsKKwkJaWYodm9sdW1lX2luZm8uZGlyZWN0X2lvKSB7CisJCQljRVJST1IoMSwoIm1vdW50aW5nIHNoYXJlIHVzaW5nIGRpcmVjdCBpL28iKSk7CisJCQljaWZzX3NiLT5tbnRfY2lmc19mbGFncyB8PSBDSUZTX01PVU5UX0RJUkVDVF9JTzsKKwkJfQorCisJCXRjb24gPQorCQkgICAgZmluZF91bmMoc2luX3NlcnZlci5zaW5fYWRkci5zX2FkZHIsIHZvbHVtZV9pbmZvLlVOQywKKwkJCSAgICAgdm9sdW1lX2luZm8udXNlcm5hbWUpOworCQlpZiAodGNvbikgeworCQkJY0ZZSSgxLCAoIkZvdW5kIG1hdGNoIG9uIFVOQyBwYXRoICIpKTsKKwkJCS8qIHdlIGNhbiBoYXZlIG9ubHkgb25lIHJldHJ5IHZhbHVlIGZvciBhIGNvbm5lY3Rpb24KKwkJCSAgIHRvIGEgc2hhcmUgc28gZm9yIHJlc291cmNlcyBtb3VudGVkIG1vcmUgdGhhbiBvbmNlCisJCQkgICB0byB0aGUgc2FtZSBzZXJ2ZXIgc2hhcmUgdGhlIGxhc3QgdmFsdWUgcGFzc2VkIGluIAorCQkJICAgZm9yIHRoZSByZXRyeSBmbGFnIGlzIHVzZWQgKi8KKwkJCXRjb24tPnJldHJ5ID0gdm9sdW1lX2luZm8ucmV0cnk7CisJCX0gZWxzZSB7CisJCQl0Y29uID0gdGNvbkluZm9BbGxvYygpOworCQkJaWYgKHRjb24gPT0gTlVMTCkKKwkJCQlyYyA9IC1FTk9NRU07CisJCQllbHNlIHsKKwkJCQkvKiBjaGVjayBmb3IgbnVsbCBzaGFyZSBuYW1lIGllIGNvbm5lY3QgdG8gZGZzIHJvb3QgKi8KKworCQkJCS8qIEJCIGNoZWNrIGlmIHRoaXMgd29ya3MgZm9yIGV4YWN0bHkgbGVuZ3RoIHRocmVlIHN0cmluZ3MgKi8KKwkJCQlpZiAoKHN0cmNocih2b2x1bWVfaW5mby5VTkMgKyAzLCAnXFwnKSA9PSBOVUxMKQorCQkJCSAgICAmJiAoc3RyY2hyKHZvbHVtZV9pbmZvLlVOQyArIDMsICcvJykgPT0KKwkJCQkJTlVMTCkpIHsKKwkJCQkJcmMgPSBjb25uZWN0X3RvX2Rmc19wYXRoKHhpZCwKKwkJCQkJCQkJIHBTZXNJbmZvLAorCQkJCQkJCQkgIiIsCisJCQkJCQkJCSBjaWZzX3NiLT4KKwkJCQkJCQkJIGxvY2FsX25scyk7CisJCQkJCWlmKHZvbHVtZV9pbmZvLlVOQykKKwkJCQkJCWtmcmVlKHZvbHVtZV9pbmZvLlVOQyk7CisJCQkJCUZyZWVYaWQoeGlkKTsKKwkJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQkJfSBlbHNlIHsKKwkJCQkJcmMgPSBDSUZTVENvbih4aWQsIHBTZXNJbmZvLCAKKwkJCQkJCXZvbHVtZV9pbmZvLlVOQywKKwkJCQkJCXRjb24sIGNpZnNfc2ItPmxvY2FsX25scyk7CisJCQkJCWNGWUkoMSwgKCJDSUZTIFRjb24gcmMgPSAlZCIsIHJjKSk7CisJCQkJfQorCQkJCWlmICghcmMpIHsKKwkJCQkJYXRvbWljX2luYygmcFNlc0luZm8tPmluVXNlKTsKKwkJCQkJdGNvbi0+cmV0cnkgPSB2b2x1bWVfaW5mby5yZXRyeTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYocFNlc0luZm8pIHsKKwkJaWYgKHBTZXNJbmZvLT5jYXBhYmlsaXRpZXMgJiBDQVBfTEFSR0VfRklMRVMpIHsKKwkJCXNiLT5zX21heGJ5dGVzID0gKHU2NCkgMSA8PCA2MzsKKwkJfSBlbHNlCisJCQlzYi0+c19tYXhieXRlcyA9ICh1NjQpIDEgPDwgMzE7CS8qIDIgR0IgKi8KKwl9CisKKwlzYi0+c190aW1lX2dyYW4gPSAxMDA7CisKKy8qIG9uIGVycm9yIGZyZWUgc2VzaW5mbyBhbmQgdGNvbiBzdHJ1Y3QgaWYgbmVlZGVkICovCisJaWYgKHJjKSB7CisJCS8qIGlmIHNlc3Npb24gc2V0dXAgZmFpbGVkLCB1c2UgY291bnQgaXMgemVybyBidXQKKwkJd2Ugc3RpbGwgbmVlZCB0byBmcmVlIGNpZnNkIHRocmVhZCAqLworCQlpZihhdG9taWNfcmVhZCgmc3J2VGNwLT5zb2NrZXRVc2VDb3VudCkgPT0gMCkgeworCQkJc3Bpbl9sb2NrKCZHbG9iYWxNaWRfTG9jayk7CisJCQlzcnZUY3AtPnRjcFN0YXR1cyA9IENpZnNFeGl0aW5nOworCQkJc3Bpbl91bmxvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwkJCWlmKHNydlRjcC0+dHNrKQorCQkJCXNlbmRfc2lnKFNJR0tJTEwsc3J2VGNwLT50c2ssMSk7CisJCX0KKwkJIC8qIElmIGZpbmRfdW5jIHN1Y2NlZWRlZCB0aGVuIHJjID09IDAgc28gd2UgY2FuIG5vdCBlbmQgKi8KKwkJaWYgKHRjb24pICAvKiB1cCBhY2NpZGVudGx5IGZyZWVpbmcgc29tZW9uZSBlbHNlcyB0Y29uIHN0cnVjdCAqLworCQkJdGNvbkluZm9GcmVlKHRjb24pOworCQlpZiAoZXhpc3RpbmdDaWZzU2VzID09IE5VTEwpIHsKKwkJCWlmIChwU2VzSW5mbykgeworCQkJCWlmICgocFNlc0luZm8tPnNlcnZlcikgJiYgCisJCQkJICAgIChwU2VzSW5mby0+c3RhdHVzID09IENpZnNHb29kKSkgeworCQkJCQlpbnQgdGVtcF9yYzsKKwkJCQkJdGVtcF9yYyA9IENJRlNTTUJMb2dvZmYoeGlkLCBwU2VzSW5mbyk7CisJCQkJCS8qIGlmIHRoZSBzb2NrZXRVc2VDb3VudCBpcyBub3cgemVybyAqLworCQkJCQlpZigodGVtcF9yYyA9PSAtRVNIVVRET1dOKSAmJgorCQkJCQkgICAocFNlc0luZm8tPnNlcnZlci0+dHNrKSkKKwkJCQkJCXNlbmRfc2lnKFNJR0tJTEwscFNlc0luZm8tPnNlcnZlci0+dHNrLDEpOworCQkJCX0gZWxzZQorCQkJCQljRllJKDEsICgiTm8gc2Vzc2lvbiBvciBiYWQgdGNvbiIpKTsKKwkJCQlzZXNJbmZvRnJlZShwU2VzSW5mbyk7CisJCQkJLyogcFNlc0luZm8gPSBOVUxMOyAqLworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJYXRvbWljX2luYygmdGNvbi0+dXNlQ291bnQpOworCQljaWZzX3NiLT50Y29uID0gdGNvbjsKKwkJdGNvbi0+c2VzID0gcFNlc0luZm87CisKKwkJLyogZG8gbm90IGNhcmUgaWYgZm9sbG93aW5nIHR3byBjYWxscyBzdWNjZWVkIC0gaW5mb3JtYXRpb25hbCBvbmx5ICovCisJCUNJRlNTTUJRRlNEZXZpY2VJbmZvKHhpZCwgdGNvbiwgY2lmc19zYi0+bG9jYWxfbmxzKTsKKwkJQ0lGU1NNQlFGU0F0dHJpYnV0ZUluZm8oeGlkLCB0Y29uLCBjaWZzX3NiLT5sb2NhbF9ubHMpOworCQlpZiAodGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkgeworCQkJaWYoIUNJRlNTTUJRRlNVbml4SW5mbyh4aWQsIHRjb24sIGNpZnNfc2ItPmxvY2FsX25scykpIHsKKwkJCQlpZighdm9sdW1lX2luZm8ubm9fcHN4X2FjbCkgeworCQkJCQlpZihDSUZTX1VOSVhfUE9TSVhfQUNMX0NBUCAmIAorCQkJCQkgICBsZTY0X3RvX2NwdSh0Y29uLT5mc1VuaXhJbmZvLkNhcGFiaWxpdHkpKQorCQkJCQkJY0ZZSSgxLCgic2VydmVyIG5lZ290aWF0ZWQgcG9zaXggYWNsIHN1cHBvcnQiKSk7CisJCQkJCQlzYi0+c19mbGFncyB8PSBNU19QT1NJWEFDTDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKiB2b2x1bWVfaW5mby5wYXNzd29yZCBpcyBmcmVlZCBhYm92ZSB3aGVuIGV4aXN0aW5nIHNlc3Npb24gZm91bmQKKwkoaW4gd2hpY2ggY2FzZSBpdCBpcyBub3QgbmVlZGVkIGFueW1vcmUpIGJ1dCB3aGVuIG5ldyBzZXNpb24gaXMgY3JlYXRlZAorCXRoZSBwYXNzd29yZCBwdHIgaXMgcHV0IGluIHRoZSBuZXcgc2Vzc2lvbiBzdHJ1Y3R1cmUgKGluIHdoaWNoIGNhc2UgdGhlCisJcGFzc3dvcmQgd2lsbCBiZSBmcmVlZCBhdCB1bm1vdW50IHRpbWUpICovCisJaWYodm9sdW1lX2luZm8uVU5DKQorCQlrZnJlZSh2b2x1bWVfaW5mby5VTkMpOworCUZyZWVYaWQoeGlkKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQKK0NJRlNTZXNzU2V0dXAodW5zaWduZWQgaW50IHhpZCwgc3RydWN0IGNpZnNTZXNJbmZvICpzZXMsCisJICAgICAgY2hhciBzZXNzaW9uX2tleVtDSUZTX1NFU1NJT05fS0VZX1NJWkVdLAorCSAgICAgIGNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSkKK3sKKwlzdHJ1Y3Qgc21iX2hkciAqc21iX2J1ZmZlcjsKKwlzdHJ1Y3Qgc21iX2hkciAqc21iX2J1ZmZlcl9yZXNwb25zZTsKKwlTRVNTSU9OX1NFVFVQX0FORFggKnBTTUI7CisJU0VTU0lPTl9TRVRVUF9BTkRYICpwU01CcjsKKwljaGFyICpiY2NfcHRyOworCWNoYXIgKnVzZXI7CisJY2hhciAqZG9tYWluOworCWludCByYyA9IDA7CisJaW50IHJlbWFpbmluZ193b3JkcyA9IDA7CisJaW50IGJ5dGVzX3JldHVybmVkID0gMDsKKwlpbnQgbGVuOworCV9fdTMyIGNhcGFiaWxpdGllczsKKwlfX3UxNiBjb3VudDsKKworCWNGWUkoMSwgKCJJbiBzZXNzc2V0dXAgIikpOworCWlmKHNlcyA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwl1c2VyID0gc2VzLT51c2VyTmFtZTsKKwlkb21haW4gPSBzZXMtPmRvbWFpbk5hbWU7CisJc21iX2J1ZmZlciA9IGNpZnNfYnVmX2dldCgpOworCWlmIChzbWJfYnVmZmVyID09IE5VTEwpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXNtYl9idWZmZXJfcmVzcG9uc2UgPSBzbWJfYnVmZmVyOworCXBTTUJyID0gcFNNQiA9IChTRVNTSU9OX1NFVFVQX0FORFggKikgc21iX2J1ZmZlcjsKKworCS8qIHNlbmQgU01Cc2Vzc2lvblNldHVwIGhlcmUgKi8KKwloZWFkZXJfYXNzZW1ibGUoc21iX2J1ZmZlciwgU01CX0NPTV9TRVNTSU9OX1NFVFVQX0FORFgsCisJCQlOVUxMIC8qIG5vIHRDb24gZXhpc3RzIHlldCAqLyAsIDEzIC8qIHdjdCAqLyApOworCisJcFNNQi0+cmVxX25vX3NlY2V4dC5BbmRYQ29tbWFuZCA9IDB4RkY7CisJcFNNQi0+cmVxX25vX3NlY2V4dC5NYXhCdWZmZXJTaXplID0gY3B1X3RvX2xlMTYoc2VzLT5zZXJ2ZXItPm1heEJ1Zik7CisJcFNNQi0+cmVxX25vX3NlY2V4dC5NYXhNcHhDb3VudCA9IGNwdV90b19sZTE2KHNlcy0+c2VydmVyLT5tYXhSZXEpOworCisJaWYoc2VzLT5zZXJ2ZXItPnNlY01vZGUgJiAoU0VDTU9ERV9TSUdOX1JFUVVJUkVEIHwgU0VDTU9ERV9TSUdOX0VOQUJMRUQpKQorCQlzbWJfYnVmZmVyLT5GbGFnczIgfD0gU01CRkxHMl9TRUNVUklUWV9TSUdOQVRVUkU7CisKKwljYXBhYmlsaXRpZXMgPSBDQVBfTEFSR0VfRklMRVMgfCBDQVBfTlRfU01CUyB8IENBUF9MRVZFTF9JSV9PUExPQ0tTIHwKKwkJQ0FQX0xBUkdFX1dSSVRFX1ggfCBDQVBfTEFSR0VfUkVBRF9YOworCWlmIChzZXMtPmNhcGFiaWxpdGllcyAmIENBUF9VTklDT0RFKSB7CisJCXNtYl9idWZmZXItPkZsYWdzMiB8PSBTTUJGTEcyX1VOSUNPREU7CisJCWNhcGFiaWxpdGllcyB8PSBDQVBfVU5JQ09ERTsKKwl9CisJaWYgKHNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX1NUQVRVUzMyKSB7CisJCXNtYl9idWZmZXItPkZsYWdzMiB8PSBTTUJGTEcyX0VSUl9TVEFUVVM7CisJCWNhcGFiaWxpdGllcyB8PSBDQVBfU1RBVFVTMzI7CisJfQorCWlmIChzZXMtPmNhcGFiaWxpdGllcyAmIENBUF9ERlMpIHsKKwkJc21iX2J1ZmZlci0+RmxhZ3MyIHw9IFNNQkZMRzJfREZTOworCQljYXBhYmlsaXRpZXMgfD0gQ0FQX0RGUzsKKwl9CisJcFNNQi0+cmVxX25vX3NlY2V4dC5DYXBhYmlsaXRpZXMgPSBjcHVfdG9fbGUzMihjYXBhYmlsaXRpZXMpOworCisJcFNNQi0+cmVxX25vX3NlY2V4dC5DYXNlSW5zZW5zaXRpdmVQYXNzd29yZExlbmd0aCA9IAorCQljcHVfdG9fbGUxNihDSUZTX1NFU1NJT05fS0VZX1NJWkUpOworCisJcFNNQi0+cmVxX25vX3NlY2V4dC5DYXNlU2Vuc2l0aXZlUGFzc3dvcmRMZW5ndGggPQorCSAgICBjcHVfdG9fbGUxNihDSUZTX1NFU1NJT05fS0VZX1NJWkUpOworCWJjY19wdHIgPSBwQnl0ZUFyZWEoc21iX2J1ZmZlcik7CisJbWVtY3B5KGJjY19wdHIsIChjaGFyICopIHNlc3Npb25fa2V5LCBDSUZTX1NFU1NJT05fS0VZX1NJWkUpOworCWJjY19wdHIgKz0gQ0lGU19TRVNTSU9OX0tFWV9TSVpFOworCW1lbWNweShiY2NfcHRyLCAoY2hhciAqKSBzZXNzaW9uX2tleSwgQ0lGU19TRVNTSU9OX0tFWV9TSVpFKTsKKwliY2NfcHRyICs9IENJRlNfU0VTU0lPTl9LRVlfU0laRTsKKworCWlmIChzZXMtPmNhcGFiaWxpdGllcyAmIENBUF9VTklDT0RFKSB7CisJCWlmICgobG9uZykgYmNjX3B0ciAlIDIpIHsgLyogbXVzdCBiZSB3b3JkIGFsaWduZWQgZm9yIFVuaWNvZGUgKi8KKwkJCSpiY2NfcHRyID0gMDsKKwkJCWJjY19wdHIrKzsKKwkJfQorCQlpZih1c2VyID09IE5VTEwpCisJCQlieXRlc19yZXR1cm5lZCA9IDA7IC8qIHNraWxsIG51bGwgdXNlciAqLworCSAgICAgICAgZWxzZQorCQkJYnl0ZXNfcmV0dXJuZWQgPQorCQkJICAgICAgICBjaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIGJjY19wdHIsIHVzZXIsIDEwMCwKKwkJCQkJbmxzX2NvZGVwYWdlKTsKKwkJLyogY29udmVydCBudW1iZXIgb2YgMTYgYml0IHdvcmRzIHRvIGJ5dGVzICovCisJCWJjY19wdHIgKz0gMiAqIGJ5dGVzX3JldHVybmVkOworCQliY2NfcHRyICs9IDI7CS8qIHRyYWlsaW5nIG51bGwgKi8KKwkJaWYgKGRvbWFpbiA9PSBOVUxMKQorCQkJYnl0ZXNfcmV0dXJuZWQgPQorCQkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgYmNjX3B0ciwKKwkJCQkJICAiQ0lGU19MSU5VWF9ET00iLCAzMiwgbmxzX2NvZGVwYWdlKTsKKwkJZWxzZQorCQkJYnl0ZXNfcmV0dXJuZWQgPQorCQkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgYmNjX3B0ciwgZG9tYWluLCA2NCwKKwkJCQkJICBubHNfY29kZXBhZ2UpOworCQliY2NfcHRyICs9IDIgKiBieXRlc19yZXR1cm5lZDsKKwkJYmNjX3B0ciArPSAyOworCQlieXRlc19yZXR1cm5lZCA9CisJCSAgICBjaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIGJjY19wdHIsICJMaW51eCB2ZXJzaW9uICIsCisJCQkJICAzMiwgbmxzX2NvZGVwYWdlKTsKKwkJYmNjX3B0ciArPSAyICogYnl0ZXNfcmV0dXJuZWQ7CisJCWJ5dGVzX3JldHVybmVkID0KKwkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgYmNjX3B0ciwgc3lzdGVtX3V0c25hbWUucmVsZWFzZSwKKwkJCQkgIDMyLCBubHNfY29kZXBhZ2UpOworCQliY2NfcHRyICs9IDIgKiBieXRlc19yZXR1cm5lZDsKKwkJYmNjX3B0ciArPSAyOworCQlieXRlc19yZXR1cm5lZCA9CisJCSAgICBjaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIGJjY19wdHIsIENJRlNfTkVUV09SS19PUFNZUywKKwkJCQkgIDY0LCBubHNfY29kZXBhZ2UpOworCQliY2NfcHRyICs9IDIgKiBieXRlc19yZXR1cm5lZDsKKwkJYmNjX3B0ciArPSAyOworCX0gZWxzZSB7CisJCWlmKHVzZXIgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAKKwkJICAgIHN0cm5jcHkoYmNjX3B0ciwgdXNlciwgMjAwKTsKKwkJICAgIGJjY19wdHIgKz0gc3Rybmxlbih1c2VyLCAyMDApOworCQl9CisJCSpiY2NfcHRyID0gMDsKKwkJYmNjX3B0cisrOworCQlpZiAoZG9tYWluID09IE5VTEwpIHsKKwkJCXN0cmNweShiY2NfcHRyLCAiQ0lGU19MSU5VWF9ET00iKTsKKwkJCWJjY19wdHIgKz0gc3RybGVuKCJDSUZTX0xJTlVYX0RPTSIpICsgMTsKKwkJfSBlbHNlIHsKKwkJCXN0cm5jcHkoYmNjX3B0ciwgZG9tYWluLCA2NCk7CisJCQliY2NfcHRyICs9IHN0cm5sZW4oZG9tYWluLCA2NCk7CisJCQkqYmNjX3B0ciA9IDA7CisJCQliY2NfcHRyKys7CisJCX0KKwkJc3RyY3B5KGJjY19wdHIsICJMaW51eCB2ZXJzaW9uICIpOworCQliY2NfcHRyICs9IHN0cmxlbigiTGludXggdmVyc2lvbiAiKTsKKwkJc3RyY3B5KGJjY19wdHIsIHN5c3RlbV91dHNuYW1lLnJlbGVhc2UpOworCQliY2NfcHRyICs9IHN0cmxlbihzeXN0ZW1fdXRzbmFtZS5yZWxlYXNlKSArIDE7CisJCXN0cmNweShiY2NfcHRyLCBDSUZTX05FVFdPUktfT1BTWVMpOworCQliY2NfcHRyICs9IHN0cmxlbihDSUZTX05FVFdPUktfT1BTWVMpICsgMTsKKwl9CisJY291bnQgPSAobG9uZykgYmNjX3B0ciAtIChsb25nKSBwQnl0ZUFyZWEoc21iX2J1ZmZlcik7CisJc21iX2J1ZmZlci0+c21iX2J1Zl9sZW5ndGggKz0gY291bnQ7CisJcFNNQi0+cmVxX25vX3NlY2V4dC5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihjb3VudCk7CisKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgc2VzLCBzbWJfYnVmZmVyLCBzbWJfYnVmZmVyX3Jlc3BvbnNlLAorCQkJICZieXRlc19yZXR1cm5lZCwgMSk7CisJaWYgKHJjKSB7CisvKiByYyA9IG1hcF9zbWJfdG9fbGludXhfZXJyb3Ioc21iX2J1ZmZlcl9yZXNwb25zZSk7IG5vdyBkb25lIGluIFNlbmRSZWNlaXZlICovCisJfSBlbHNlIGlmICgoc21iX2J1ZmZlcl9yZXNwb25zZS0+V29yZENvdW50ID09IDMpCisJCSAgIHx8IChzbWJfYnVmZmVyX3Jlc3BvbnNlLT5Xb3JkQ291bnQgPT0gNCkpIHsKKwkJX191MTYgYWN0aW9uID0gbGUxNl90b19jcHUocFNNQnItPnJlc3AuQWN0aW9uKTsKKwkJX191MTYgYmxvYl9sZW4gPSBsZTE2X3RvX2NwdShwU01Cci0+cmVzcC5TZWN1cml0eUJsb2JMZW5ndGgpOworCQlpZiAoYWN0aW9uICYgR1VFU1RfTE9HSU4pCisJCQljRllJKDEsICgiIEd1ZXN0IGxvZ2luIikpOwkvKiBkbyB3ZSB3YW50IHRvIG1hcmsgU2VzSW5mbyBzdHJ1Y3QgPyAqLworCQlzZXMtPlN1aWQgPSBzbWJfYnVmZmVyX3Jlc3BvbnNlLT5VaWQ7CS8qIFVJRCBsZWZ0IGluIHdpcmUgZm9ybWF0IChsZSkgKi8KKwkJY0ZZSSgxLCAoIlVJRCA9ICVkICIsIHNlcy0+U3VpZCkpOworICAgICAgICAgLyogcmVzcG9uc2UgY2FuIGhhdmUgZWl0aGVyIDMgb3IgNCB3b3JkIGNvdW50IC0gU2FtYmEgc2VuZHMgMyAqLworCQliY2NfcHRyID0gcEJ5dGVBcmVhKHNtYl9idWZmZXJfcmVzcG9uc2UpOwkKKwkJaWYgKChwU01Cci0+cmVzcC5oZHIuV29yZENvdW50ID09IDMpCisJCSAgICB8fCAoKHBTTUJyLT5yZXNwLmhkci5Xb3JkQ291bnQgPT0gNCkKKwkJCSYmIChibG9iX2xlbiA8IHBTTUJyLT5yZXNwLkJ5dGVDb3VudCkpKSB7CisJCQlpZiAocFNNQnItPnJlc3AuaGRyLldvcmRDb3VudCA9PSA0KQorCQkJCWJjY19wdHIgKz0gYmxvYl9sZW47CisKKwkJCWlmIChzbWJfYnVmZmVyLT5GbGFnczIgJiBTTUJGTEcyX1VOSUNPREUpIHsKKwkJCQlpZiAoKGxvbmcpIChiY2NfcHRyKSAlIDIpIHsKKwkJCQkJcmVtYWluaW5nX3dvcmRzID0KKwkJCQkJICAgIChCQ0Moc21iX2J1ZmZlcl9yZXNwb25zZSkgLSAxKSAvMjsKKwkJCQkJYmNjX3B0cisrOwkvKiBVbmljb2RlIHN0cmluZ3MgbXVzdCBiZSB3b3JkIGFsaWduZWQgKi8KKwkJCQl9IGVsc2UgeworCQkJCQlyZW1haW5pbmdfd29yZHMgPQorCQkJCQkJQkNDKHNtYl9idWZmZXJfcmVzcG9uc2UpIC8gMjsKKwkJCQl9CisJCQkJbGVuID0KKwkJCQkgICAgVW5pU3Rybmxlbigod2NoYXJfdCAqKSBiY2NfcHRyLAorCQkJCQkgICAgICAgcmVtYWluaW5nX3dvcmRzIC0gMSk7CisvKiBXZSBsb29rIGZvciBvYnZpb3VzIG1lc3NlZCB1cCBiY2Mgb3Igc3RyaW5ncyBpbiByZXNwb25zZSBzbyB3ZSBkbyBub3QgZ28gb2ZmCisgICB0aGUgZW5kIHNpbmNlIChhdCBsZWFzdCkgV0lOMksgYW5kIFdpbmRvd3MgWFAgaGF2ZSBhIG1ham9yIGJ1ZyBpbiBub3QgbnVsbAorICAgdGVybWluYXRpbmcgbGFzdCBVbmljb2RlIHN0cmluZyBpbiByZXNwb25zZSAgKi8KKwkJCQlzZXMtPnNlcnZlck9TID0gY2lmc19rY2FsbG9jKDIgKiAobGVuICsgMSksIEdGUF9LRVJORUwpOworCQkJCWNpZnNfc3RyZnJvbVVDU19sZShzZXMtPnNlcnZlck9TLAorCQkJCQkgICAod2NoYXJfdCAqKWJjY19wdHIsIGxlbixubHNfY29kZXBhZ2UpOworCQkJCWJjY19wdHIgKz0gMiAqIChsZW4gKyAxKTsKKwkJCQlyZW1haW5pbmdfd29yZHMgLT0gbGVuICsgMTsKKwkJCQlzZXMtPnNlcnZlck9TWzIgKiBsZW5dID0gMDsKKwkJCQlzZXMtPnNlcnZlck9TWzEgKyAoMiAqIGxlbildID0gMDsKKwkJCQlpZiAocmVtYWluaW5nX3dvcmRzID4gMCkgeworCQkJCQlsZW4gPSBVbmlTdHJubGVuKCh3Y2hhcl90ICopYmNjX3B0ciwKKwkJCQkJCQkgcmVtYWluaW5nX3dvcmRzLTEpOworCQkJCQlzZXMtPnNlcnZlck5PUyA9Y2lmc19rY2FsbG9jKDIgKiAobGVuICsgMSksR0ZQX0tFUk5FTCk7CisJCQkJCWNpZnNfc3RyZnJvbVVDU19sZShzZXMtPnNlcnZlck5PUywKKwkJCQkJCQkgICAod2NoYXJfdCAqKWJjY19wdHIsbGVuLG5sc19jb2RlcGFnZSk7CisJCQkJCWJjY19wdHIgKz0gMiAqIChsZW4gKyAxKTsKKwkJCQkJc2VzLT5zZXJ2ZXJOT1NbMiAqIGxlbl0gPSAwOworCQkJCQlzZXMtPnNlcnZlck5PU1sxICsgKDIgKiBsZW4pXSA9IDA7CisJCQkJCWlmKHN0cm5jbXAoc2VzLT5zZXJ2ZXJOT1MsCisJCQkJCQkiTlQgTEFOIE1hbmFnZXIgNCIsMTYpID09IDApIHsKKwkJCQkJCWNGWUkoMSwoIk5UNCBzZXJ2ZXIiKSk7CisJCQkJCQlzZXMtPmZsYWdzIHw9IENJRlNfU0VTX05UNDsKKwkJCQkJfQorCQkJCQlyZW1haW5pbmdfd29yZHMgLT0gbGVuICsgMTsKKwkJCQkJaWYgKHJlbWFpbmluZ193b3JkcyA+IDApIHsKKwkJCQkJCWxlbiA9IFVuaVN0cm5sZW4oKHdjaGFyX3QgKikgYmNjX3B0ciwgcmVtYWluaW5nX3dvcmRzKTsJCisgICAgICAgICAgLyogbGFzdCBzdHJpbmcgaXMgbm90IGFsd2F5cyBudWxsIHRlcm1pbmF0ZWQgKGZvciBlLmcuIGZvciBXaW5kb3dzIFhQICYgMjAwMCkgKi8KKwkJCQkJCXNlcy0+c2VydmVyRG9tYWluID0KKwkJCQkJCSAgICBjaWZzX2tjYWxsb2MoMioobGVuKzEpLEdGUF9LRVJORUwpOworCQkJCQkJY2lmc19zdHJmcm9tVUNTX2xlKHNlcy0+c2VydmVyRG9tYWluLAorCQkJCQkJICAgICAod2NoYXJfdCAqKWJjY19wdHIsbGVuLG5sc19jb2RlcGFnZSk7CisJCQkJCQliY2NfcHRyICs9IDIgKiAobGVuICsgMSk7CisJCQkJCQlzZXMtPnNlcnZlckRvbWFpblsyKmxlbl0gPSAwOworCQkJCQkJc2VzLT5zZXJ2ZXJEb21haW5bMSsoMipsZW4pXSA9IDA7CisJCQkJCX0gLyogZWxzZSBubyBtb3JlIHJvb20gc28gY3JlYXRlIGR1bW15IGRvbWFpbiBzdHJpbmcgKi8KKwkJCQkJZWxzZQorCQkJCQkJc2VzLT5zZXJ2ZXJEb21haW4gPQorCQkJCQkJICAgIGNpZnNfa2NhbGxvYygyLAorCQkJCQkJCSAgICBHRlBfS0VSTkVMKTsKKwkJCQl9IGVsc2UgewkvKiBubyByb29tIHNvIGNyZWF0ZSBkdW1teSBkb21haW4gYW5kIE5PUyBzdHJpbmcgKi8KKwkJCQkJc2VzLT5zZXJ2ZXJEb21haW4gPQorCQkJCQkgICAgY2lmc19rY2FsbG9jKDIsIEdGUF9LRVJORUwpOworCQkJCQlzZXMtPnNlcnZlck5PUyA9CisJCQkJCSAgICBjaWZzX2tjYWxsb2MoMiwgR0ZQX0tFUk5FTCk7CisJCQkJfQorCQkJfSBlbHNlIHsJLyogQVNDSUkgKi8KKwkJCQlsZW4gPSBzdHJubGVuKGJjY19wdHIsIDEwMjQpOworCQkJCWlmICgoKGxvbmcpIGJjY19wdHIgKyBsZW4pIC0gKGxvbmcpCisJCQkJICAgIHBCeXRlQXJlYShzbWJfYnVmZmVyX3Jlc3BvbnNlKQorCQkJCQkgICAgPD0gQkNDKHNtYl9idWZmZXJfcmVzcG9uc2UpKSB7CisJCQkJCXNlcy0+c2VydmVyT1MgPSBjaWZzX2tjYWxsb2MobGVuICsgMSxHRlBfS0VSTkVMKTsKKwkJCQkJc3RybmNweShzZXMtPnNlcnZlck9TLGJjY19wdHIsIGxlbik7CisKKwkJCQkJYmNjX3B0ciArPSBsZW47CisJCQkJCWJjY19wdHJbMF0gPSAwOwkvKiBudWxsIHRlcm1pbmF0ZSB0aGUgc3RyaW5nICovCisJCQkJCWJjY19wdHIrKzsKKworCQkJCQlsZW4gPSBzdHJubGVuKGJjY19wdHIsIDEwMjQpOworCQkJCQlzZXMtPnNlcnZlck5PUyA9IGNpZnNfa2NhbGxvYyhsZW4gKyAxLEdGUF9LRVJORUwpOworCQkJCQlzdHJuY3B5KHNlcy0+c2VydmVyTk9TLCBiY2NfcHRyLCBsZW4pOworCQkJCQliY2NfcHRyICs9IGxlbjsKKwkJCQkJYmNjX3B0clswXSA9IDA7CisJCQkJCWJjY19wdHIrKzsKKworCQkJCQlsZW4gPSBzdHJubGVuKGJjY19wdHIsIDEwMjQpOworCQkJCQlzZXMtPnNlcnZlckRvbWFpbiA9IGNpZnNfa2NhbGxvYyhsZW4gKyAxLEdGUF9LRVJORUwpOworCQkJCQlzdHJuY3B5KHNlcy0+c2VydmVyRG9tYWluLCBiY2NfcHRyLCBsZW4pOworCQkJCQliY2NfcHRyICs9IGxlbjsKKwkJCQkJYmNjX3B0clswXSA9IDA7CisJCQkJCWJjY19wdHIrKzsKKwkJCQl9IGVsc2UKKwkJCQkJY0ZZSSgxLAorCQkJCQkgICAgICgiVmFyaWFibGUgZmllbGQgb2YgbGVuZ3RoICVkIGV4dGVuZHMgYmV5b25kIGVuZCBvZiBzbWIgIiwKKwkJCQkJICAgICAgbGVuKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQljRVJST1IoMSwKKwkJCSAgICAgICAoIiBTZWN1cml0eSBCbG9iIExlbmd0aCBleHRlbmRzIGJleW9uZCBlbmQgb2YgU01CIikpOworCQl9CisJfSBlbHNlIHsKKwkJY0VSUk9SKDEsCisJCSAgICAgICAoIiBJbnZhbGlkIFdvcmQgY291bnQgJWQ6ICIsCisJCQlzbWJfYnVmZmVyX3Jlc3BvbnNlLT5Xb3JkQ291bnQpKTsKKwkJcmMgPSAtRUlPOworCX0KKwkKKwlpZiAoc21iX2J1ZmZlcikKKwkJY2lmc19idWZfcmVsZWFzZShzbWJfYnVmZmVyKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludAorQ0lGU1NwbmVnb1Nlc3NTZXR1cCh1bnNpZ25lZCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Nlc0luZm8gKnNlcywKKwkJY2hhciAqU2VjdXJpdHlCbG9iLGludCBTZWN1cml0eUJsb2JMZW5ndGgsCisJCWNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSkKK3sKKwlzdHJ1Y3Qgc21iX2hkciAqc21iX2J1ZmZlcjsKKwlzdHJ1Y3Qgc21iX2hkciAqc21iX2J1ZmZlcl9yZXNwb25zZTsKKwlTRVNTSU9OX1NFVFVQX0FORFggKnBTTUI7CisJU0VTU0lPTl9TRVRVUF9BTkRYICpwU01CcjsKKwljaGFyICpiY2NfcHRyOworCWNoYXIgKnVzZXI7CisJY2hhciAqZG9tYWluOworCWludCByYyA9IDA7CisJaW50IHJlbWFpbmluZ193b3JkcyA9IDA7CisJaW50IGJ5dGVzX3JldHVybmVkID0gMDsKKwlpbnQgbGVuOworCV9fdTMyIGNhcGFiaWxpdGllczsKKwlfX3UxNiBjb3VudDsKKworCWNGWUkoMSwgKCJJbiBzcG5lZ28gc2Vzc3NldHVwICIpKTsKKwlpZihzZXMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJdXNlciA9IHNlcy0+dXNlck5hbWU7CisJZG9tYWluID0gc2VzLT5kb21haW5OYW1lOworCisJc21iX2J1ZmZlciA9IGNpZnNfYnVmX2dldCgpOworCWlmIChzbWJfYnVmZmVyID09IE5VTEwpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXNtYl9idWZmZXJfcmVzcG9uc2UgPSBzbWJfYnVmZmVyOworCXBTTUJyID0gcFNNQiA9IChTRVNTSU9OX1NFVFVQX0FORFggKikgc21iX2J1ZmZlcjsKKworCS8qIHNlbmQgU01Cc2Vzc2lvblNldHVwIGhlcmUgKi8KKwloZWFkZXJfYXNzZW1ibGUoc21iX2J1ZmZlciwgU01CX0NPTV9TRVNTSU9OX1NFVFVQX0FORFgsCisJCQlOVUxMIC8qIG5vIHRDb24gZXhpc3RzIHlldCAqLyAsIDEyIC8qIHdjdCAqLyApOworCXBTTUItPnJlcS5oZHIuRmxhZ3MyIHw9IFNNQkZMRzJfRVhUX1NFQzsKKwlwU01CLT5yZXEuQW5kWENvbW1hbmQgPSAweEZGOworCXBTTUItPnJlcS5NYXhCdWZmZXJTaXplID0gY3B1X3RvX2xlMTYoc2VzLT5zZXJ2ZXItPm1heEJ1Zik7CisJcFNNQi0+cmVxLk1heE1weENvdW50ID0gY3B1X3RvX2xlMTYoc2VzLT5zZXJ2ZXItPm1heFJlcSk7CisKKwlpZihzZXMtPnNlcnZlci0+c2VjTW9kZSAmIChTRUNNT0RFX1NJR05fUkVRVUlSRUQgfCBTRUNNT0RFX1NJR05fRU5BQkxFRCkpCisJCXNtYl9idWZmZXItPkZsYWdzMiB8PSBTTUJGTEcyX1NFQ1VSSVRZX1NJR05BVFVSRTsKKworCWNhcGFiaWxpdGllcyA9IENBUF9MQVJHRV9GSUxFUyB8IENBUF9OVF9TTUJTIHwgQ0FQX0xFVkVMX0lJX09QTE9DS1MgfAorCSAgICBDQVBfRVhURU5ERURfU0VDVVJJVFk7CisJaWYgKHNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX1VOSUNPREUpIHsKKwkJc21iX2J1ZmZlci0+RmxhZ3MyIHw9IFNNQkZMRzJfVU5JQ09ERTsKKwkJY2FwYWJpbGl0aWVzIHw9IENBUF9VTklDT0RFOworCX0KKwlpZiAoc2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfU1RBVFVTMzIpIHsKKwkJc21iX2J1ZmZlci0+RmxhZ3MyIHw9IFNNQkZMRzJfRVJSX1NUQVRVUzsKKwkJY2FwYWJpbGl0aWVzIHw9IENBUF9TVEFUVVMzMjsKKwl9CisJaWYgKHNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX0RGUykgeworCQlzbWJfYnVmZmVyLT5GbGFnczIgfD0gU01CRkxHMl9ERlM7CisJCWNhcGFiaWxpdGllcyB8PSBDQVBfREZTOworCX0KKwlwU01CLT5yZXEuQ2FwYWJpbGl0aWVzID0gY3B1X3RvX2xlMzIoY2FwYWJpbGl0aWVzKTsKKworCXBTTUItPnJlcS5TZWN1cml0eUJsb2JMZW5ndGggPSBjcHVfdG9fbGUxNihTZWN1cml0eUJsb2JMZW5ndGgpOworCWJjY19wdHIgPSBwQnl0ZUFyZWEoc21iX2J1ZmZlcik7CisJbWVtY3B5KGJjY19wdHIsIFNlY3VyaXR5QmxvYiwgU2VjdXJpdHlCbG9iTGVuZ3RoKTsKKwliY2NfcHRyICs9IFNlY3VyaXR5QmxvYkxlbmd0aDsKKworCWlmIChzZXMtPmNhcGFiaWxpdGllcyAmIENBUF9VTklDT0RFKSB7CisJCWlmICgobG9uZykgYmNjX3B0ciAlIDIpIHsJLyogbXVzdCBiZSB3b3JkIGFsaWduZWQgZm9yIFVuaWNvZGUgc3RyaW5ncyAqLworCQkJKmJjY19wdHIgPSAwOworCQkJYmNjX3B0cisrOworCQl9CisJCWJ5dGVzX3JldHVybmVkID0KKwkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgYmNjX3B0ciwgdXNlciwgMTAwLCBubHNfY29kZXBhZ2UpOworCQliY2NfcHRyICs9IDIgKiBieXRlc19yZXR1cm5lZDsJLyogY29udmVydCBudW0gb2YgMTYgYml0IHdvcmRzIHRvIGJ5dGVzICovCisJCWJjY19wdHIgKz0gMjsJLyogdHJhaWxpbmcgbnVsbCAqLworCQlpZiAoZG9tYWluID09IE5VTEwpCisJCQlieXRlc19yZXR1cm5lZCA9CisJCQkgICAgY2lmc19zdHJ0b1VDUygod2NoYXJfdCAqKSBiY2NfcHRyLAorCQkJCQkgICJDSUZTX0xJTlVYX0RPTSIsIDMyLCBubHNfY29kZXBhZ2UpOworCQllbHNlCisJCQlieXRlc19yZXR1cm5lZCA9CisJCQkgICAgY2lmc19zdHJ0b1VDUygod2NoYXJfdCAqKSBiY2NfcHRyLCBkb21haW4sIDY0LAorCQkJCQkgIG5sc19jb2RlcGFnZSk7CisJCWJjY19wdHIgKz0gMiAqIGJ5dGVzX3JldHVybmVkOworCQliY2NfcHRyICs9IDI7CisJCWJ5dGVzX3JldHVybmVkID0KKwkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgYmNjX3B0ciwgIkxpbnV4IHZlcnNpb24gIiwKKwkJCQkgIDMyLCBubHNfY29kZXBhZ2UpOworCQliY2NfcHRyICs9IDIgKiBieXRlc19yZXR1cm5lZDsKKwkJYnl0ZXNfcmV0dXJuZWQgPQorCQkgICAgY2lmc19zdHJ0b1VDUygod2NoYXJfdCAqKSBiY2NfcHRyLCBzeXN0ZW1fdXRzbmFtZS5yZWxlYXNlLCAzMiwKKwkJCQkgIG5sc19jb2RlcGFnZSk7CisJCWJjY19wdHIgKz0gMiAqIGJ5dGVzX3JldHVybmVkOworCQliY2NfcHRyICs9IDI7CisJCWJ5dGVzX3JldHVybmVkID0KKwkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgYmNjX3B0ciwgQ0lGU19ORVRXT1JLX09QU1lTLAorCQkJCSAgNjQsIG5sc19jb2RlcGFnZSk7CisJCWJjY19wdHIgKz0gMiAqIGJ5dGVzX3JldHVybmVkOworCQliY2NfcHRyICs9IDI7CisJfSBlbHNlIHsKKwkJc3RybmNweShiY2NfcHRyLCB1c2VyLCAyMDApOworCQliY2NfcHRyICs9IHN0cm5sZW4odXNlciwgMjAwKTsKKwkJKmJjY19wdHIgPSAwOworCQliY2NfcHRyKys7CisJCWlmIChkb21haW4gPT0gTlVMTCkgeworCQkJc3RyY3B5KGJjY19wdHIsICJDSUZTX0xJTlVYX0RPTSIpOworCQkJYmNjX3B0ciArPSBzdHJsZW4oIkNJRlNfTElOVVhfRE9NIikgKyAxOworCQl9IGVsc2UgeworCQkJc3RybmNweShiY2NfcHRyLCBkb21haW4sIDY0KTsKKwkJCWJjY19wdHIgKz0gc3Rybmxlbihkb21haW4sIDY0KTsKKwkJCSpiY2NfcHRyID0gMDsKKwkJCWJjY19wdHIrKzsKKwkJfQorCQlzdHJjcHkoYmNjX3B0ciwgIkxpbnV4IHZlcnNpb24gIik7CisJCWJjY19wdHIgKz0gc3RybGVuKCJMaW51eCB2ZXJzaW9uICIpOworCQlzdHJjcHkoYmNjX3B0ciwgc3lzdGVtX3V0c25hbWUucmVsZWFzZSk7CisJCWJjY19wdHIgKz0gc3RybGVuKHN5c3RlbV91dHNuYW1lLnJlbGVhc2UpICsgMTsKKwkJc3RyY3B5KGJjY19wdHIsIENJRlNfTkVUV09SS19PUFNZUyk7CisJCWJjY19wdHIgKz0gc3RybGVuKENJRlNfTkVUV09SS19PUFNZUykgKyAxOworCX0KKwljb3VudCA9IChsb25nKSBiY2NfcHRyIC0gKGxvbmcpIHBCeXRlQXJlYShzbWJfYnVmZmVyKTsKKwlzbWJfYnVmZmVyLT5zbWJfYnVmX2xlbmd0aCArPSBjb3VudDsKKwlwU01CLT5yZXEuQnl0ZUNvdW50ID0gY3B1X3RvX2xlMTYoY291bnQpOworCisJcmMgPSBTZW5kUmVjZWl2ZSh4aWQsIHNlcywgc21iX2J1ZmZlciwgc21iX2J1ZmZlcl9yZXNwb25zZSwKKwkJCSAmYnl0ZXNfcmV0dXJuZWQsIDEpOworCWlmIChyYykgeworLyogICAgcmMgPSBtYXBfc21iX3RvX2xpbnV4X2Vycm9yKHNtYl9idWZmZXJfcmVzcG9uc2UpOyAgKi8vKiBkb25lIGluIFNlbmRSZWNlaXZlIG5vdyAqLworCX0gZWxzZSBpZiAoKHNtYl9idWZmZXJfcmVzcG9uc2UtPldvcmRDb3VudCA9PSAzKQorCQkgICB8fCAoc21iX2J1ZmZlcl9yZXNwb25zZS0+V29yZENvdW50ID09IDQpKSB7CisJCV9fdTE2IGFjdGlvbiA9IGxlMTZfdG9fY3B1KHBTTUJyLT5yZXNwLkFjdGlvbik7CisJCV9fdTE2IGJsb2JfbGVuID0KKwkJICAgIGxlMTZfdG9fY3B1KHBTTUJyLT5yZXNwLlNlY3VyaXR5QmxvYkxlbmd0aCk7CisJCWlmIChhY3Rpb24gJiBHVUVTVF9MT0dJTikKKwkJCWNGWUkoMSwgKCIgR3Vlc3QgbG9naW4iKSk7CS8qIEJCIGRvIHdlIHdhbnQgdG8gc2V0IGFueXRoaW5nIGluIFNlc0luZm8gc3RydWN0ID8gKi8KKwkJaWYgKHNlcykgeworCQkJc2VzLT5TdWlkID0gc21iX2J1ZmZlcl9yZXNwb25zZS0+VWlkOwkvKiBVSUQgbGVmdCBpbiB3aXJlIGZvcm1hdCAobGUpICovCisJCQljRllJKDEsICgiVUlEID0gJWQgIiwgc2VzLT5TdWlkKSk7CisJCQliY2NfcHRyID0gcEJ5dGVBcmVhKHNtYl9idWZmZXJfcmVzcG9uc2UpOwkvKiByZXNwb25zZSBjYW4gaGF2ZSBlaXRoZXIgMyBvciA0IHdvcmQgY291bnQgLSBTYW1iYSBzZW5kcyAzICovCisKKwkJCS8qIEJCIEZpeCBiZWxvdyB0byBtYWtlIGVuZGlhbiBuZXV0cmFsICEhICovCisKKwkJCWlmICgocFNNQnItPnJlc3AuaGRyLldvcmRDb3VudCA9PSAzKQorCQkJICAgIHx8ICgocFNNQnItPnJlc3AuaGRyLldvcmRDb3VudCA9PSA0KQorCQkJCSYmIChibG9iX2xlbiA8CisJCQkJICAgIHBTTUJyLT5yZXNwLkJ5dGVDb3VudCkpKSB7CisJCQkJaWYgKHBTTUJyLT5yZXNwLmhkci5Xb3JkQ291bnQgPT0gNCkgeworCQkJCQliY2NfcHRyICs9CisJCQkJCSAgICBibG9iX2xlbjsKKwkJCQkJY0ZZSSgxLAorCQkJCQkgICAgICgiU2VjdXJpdHkgQmxvYiBMZW5ndGggJWQgIiwKKwkJCQkJICAgICAgYmxvYl9sZW4pKTsKKwkJCQl9CisKKwkJCQlpZiAoc21iX2J1ZmZlci0+RmxhZ3MyICYgU01CRkxHMl9VTklDT0RFKSB7CisJCQkJCWlmICgobG9uZykgKGJjY19wdHIpICUgMikgeworCQkJCQkJcmVtYWluaW5nX3dvcmRzID0KKwkJCQkJCSAgICAoQkNDKHNtYl9idWZmZXJfcmVzcG9uc2UpCisJCQkJCQkgICAgIC0gMSkgLyAyOworCQkJCQkJYmNjX3B0cisrOwkvKiBVbmljb2RlIHN0cmluZ3MgbXVzdCBiZSB3b3JkIGFsaWduZWQgKi8KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJlbWFpbmluZ193b3JkcyA9CisJCQkJCQkgICAgQkNDCisJCQkJCQkgICAgKHNtYl9idWZmZXJfcmVzcG9uc2UpIC8gMjsKKwkJCQkJfQorCQkJCQlsZW4gPQorCQkJCQkgICAgVW5pU3Rybmxlbigod2NoYXJfdCAqKSBiY2NfcHRyLAorCQkJCQkJICAgICAgIHJlbWFpbmluZ193b3JkcyAtIDEpOworLyogV2UgbG9vayBmb3Igb2J2aW91cyBtZXNzZWQgdXAgYmNjIG9yIHN0cmluZ3MgaW4gcmVzcG9uc2Ugc28gd2UgZG8gbm90IGdvIG9mZgorICAgdGhlIGVuZCBzaW5jZSAoYXQgbGVhc3QpIFdJTjJLIGFuZCBXaW5kb3dzIFhQIGhhdmUgYSBtYWpvciBidWcgaW4gbm90IG51bGwKKyAgIHRlcm1pbmF0aW5nIGxhc3QgVW5pY29kZSBzdHJpbmcgaW4gcmVzcG9uc2UgICovCisJCQkJCXNlcy0+c2VydmVyT1MgPQorCQkJCQkgICAgY2lmc19rY2FsbG9jKDIgKiAobGVuICsgMSksIEdGUF9LRVJORUwpOworCQkJCQljaWZzX3N0cmZyb21VQ1NfbGUoc2VzLT5zZXJ2ZXJPUywKKwkJCQkJCQkgICAod2NoYXJfdCAqKQorCQkJCQkJCSAgIGJjY19wdHIsIGxlbiwKKwkJCQkJCQkgICBubHNfY29kZXBhZ2UpOworCQkJCQliY2NfcHRyICs9IDIgKiAobGVuICsgMSk7CisJCQkJCXJlbWFpbmluZ193b3JkcyAtPSBsZW4gKyAxOworCQkJCQlzZXMtPnNlcnZlck9TWzIgKiBsZW5dID0gMDsKKwkJCQkJc2VzLT5zZXJ2ZXJPU1sxICsgKDIgKiBsZW4pXSA9IDA7CisJCQkJCWlmIChyZW1haW5pbmdfd29yZHMgPiAwKSB7CisJCQkJCQlsZW4gPSBVbmlTdHJubGVuKCh3Y2hhcl90ICopYmNjX3B0ciwKKwkJCQkJCQkJIHJlbWFpbmluZ193b3JkcworCQkJCQkJCQkgLSAxKTsKKwkJCQkJCXNlcy0+c2VydmVyTk9TID0KKwkJCQkJCSAgICBjaWZzX2tjYWxsb2MoMiAqIChsZW4gKyAxKSwKKwkJCQkJCQkgICAgR0ZQX0tFUk5FTCk7CisJCQkJCQljaWZzX3N0cmZyb21VQ1NfbGUoc2VzLT5zZXJ2ZXJOT1MsCisJCQkJCQkJCSAgICh3Y2hhcl90ICopYmNjX3B0ciwKKwkJCQkJCQkJICAgbGVuLAorCQkJCQkJCQkgICBubHNfY29kZXBhZ2UpOworCQkJCQkJYmNjX3B0ciArPSAyICogKGxlbiArIDEpOworCQkJCQkJc2VzLT5zZXJ2ZXJOT1NbMiAqIGxlbl0gPSAwOworCQkJCQkJc2VzLT5zZXJ2ZXJOT1NbMSArICgyICogbGVuKV0gPSAwOworCQkJCQkJcmVtYWluaW5nX3dvcmRzIC09IGxlbiArIDE7CisJCQkJCQlpZiAocmVtYWluaW5nX3dvcmRzID4gMCkgeworCQkJCQkJCWxlbiA9IFVuaVN0cm5sZW4oKHdjaGFyX3QgKikgYmNjX3B0ciwgcmVtYWluaW5nX3dvcmRzKTsJCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGFzdCBzdHJpbmcgaXMgbm90IGFsd2F5cyBudWxsIHRlcm1pbmF0ZWQgKGZvciBlLmcuIGZvciBXaW5kb3dzIFhQICYgMjAwMCkgKi8KKwkJCQkJCQlzZXMtPnNlcnZlckRvbWFpbiA9IGNpZnNfa2NhbGxvYygyKihsZW4rMSksR0ZQX0tFUk5FTCk7CisJCQkJCQkJY2lmc19zdHJmcm9tVUNTX2xlKHNlcy0+c2VydmVyRG9tYWluLAorCQkJCQkJCSAgICAgKHdjaGFyX3QgKiliY2NfcHRyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwKKwkJCQkJCQkgICAgIG5sc19jb2RlcGFnZSk7CisJCQkJCQkJYmNjX3B0ciArPSAyKihsZW4rMSk7CisJCQkJCQkJc2VzLT5zZXJ2ZXJEb21haW5bMipsZW5dID0gMDsKKwkJCQkJCQlzZXMtPnNlcnZlckRvbWFpblsxKygyKmxlbildID0gMDsKKwkJCQkJCX0gLyogZWxzZSBubyBtb3JlIHJvb20gc28gY3JlYXRlIGR1bW15IGRvbWFpbiBzdHJpbmcgKi8KKwkJCQkJCWVsc2UKKwkJCQkJCQlzZXMtPnNlcnZlckRvbWFpbiA9CisJCQkJCQkJICAgIGNpZnNfa2NhbGxvYygyLEdGUF9LRVJORUwpOworCQkJCQl9IGVsc2UgewkvKiBubyByb29tIHNvIGNyZWF0ZSBkdW1teSBkb21haW4gYW5kIE5PUyBzdHJpbmcgKi8KKwkJCQkJCXNlcy0+c2VydmVyRG9tYWluID0gY2lmc19rY2FsbG9jKDIsIEdGUF9LRVJORUwpOworCQkJCQkJc2VzLT5zZXJ2ZXJOT1MgPSBjaWZzX2tjYWxsb2MoMiwgR0ZQX0tFUk5FTCk7CisJCQkJCX0KKwkJCQl9IGVsc2UgewkvKiBBU0NJSSAqLworCisJCQkJCWxlbiA9IHN0cm5sZW4oYmNjX3B0ciwgMTAyNCk7CisJCQkJCWlmICgoKGxvbmcpIGJjY19wdHIgKyBsZW4pIC0gKGxvbmcpCisJCQkJCSAgICBwQnl0ZUFyZWEoc21iX2J1ZmZlcl9yZXNwb25zZSkKKwkJCQkJICAgIDw9IEJDQyhzbWJfYnVmZmVyX3Jlc3BvbnNlKSkgeworCQkJCQkJc2VzLT5zZXJ2ZXJPUyA9IGNpZnNfa2NhbGxvYyhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwkJCQkJCXN0cm5jcHkoc2VzLT5zZXJ2ZXJPUywgYmNjX3B0ciwgbGVuKTsKKworCQkJCQkJYmNjX3B0ciArPSBsZW47CisJCQkJCQliY2NfcHRyWzBdID0gMDsJLyogbnVsbCB0ZXJtaW5hdGUgdGhlIHN0cmluZyAqLworCQkJCQkJYmNjX3B0cisrOworCisJCQkJCQlsZW4gPSBzdHJubGVuKGJjY19wdHIsIDEwMjQpOworCQkJCQkJc2VzLT5zZXJ2ZXJOT1MgPSBjaWZzX2tjYWxsb2MobGVuICsgMSxHRlBfS0VSTkVMKTsKKwkJCQkJCXN0cm5jcHkoc2VzLT5zZXJ2ZXJOT1MsIGJjY19wdHIsIGxlbik7CisJCQkJCQliY2NfcHRyICs9IGxlbjsKKwkJCQkJCWJjY19wdHJbMF0gPSAwOworCQkJCQkJYmNjX3B0cisrOworCisJCQkJCQlsZW4gPSBzdHJubGVuKGJjY19wdHIsIDEwMjQpOworCQkJCQkJc2VzLT5zZXJ2ZXJEb21haW4gPSBjaWZzX2tjYWxsb2MobGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJCQkJCQlzdHJuY3B5KHNlcy0+c2VydmVyRG9tYWluLCBiY2NfcHRyLCBsZW4pOworCQkJCQkJYmNjX3B0ciArPSBsZW47CisJCQkJCQliY2NfcHRyWzBdID0gMDsKKwkJCQkJCWJjY19wdHIrKzsKKwkJCQkJfSBlbHNlCisJCQkJCQljRllJKDEsCisJCQkJCQkgICAgICgiVmFyaWFibGUgZmllbGQgb2YgbGVuZ3RoICVkIGV4dGVuZHMgYmV5b25kIGVuZCBvZiBzbWIgIiwKKwkJCQkJCSAgICAgIGxlbikpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJY0VSUk9SKDEsCisJCQkJICAgICAgICgiIFNlY3VyaXR5IEJsb2IgTGVuZ3RoIGV4dGVuZHMgYmV5b25kIGVuZCBvZiBTTUIiKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQljRVJST1IoMSwgKCJObyBzZXNzaW9uIHN0cnVjdHVyZSBwYXNzZWQgaW4uIikpOworCQl9CisJfSBlbHNlIHsKKwkJY0VSUk9SKDEsCisJCSAgICAgICAoIiBJbnZhbGlkIFdvcmQgY291bnQgJWQ6ICIsCisJCQlzbWJfYnVmZmVyX3Jlc3BvbnNlLT5Xb3JkQ291bnQpKTsKKwkJcmMgPSAtRUlPOworCX0KKworCWlmIChzbWJfYnVmZmVyKQorCQljaWZzX2J1Zl9yZWxlYXNlKHNtYl9idWZmZXIpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50CitDSUZTTlRMTVNTUE5lZ290aWF0ZVNlc3NTZXR1cCh1bnNpZ25lZCBpbnQgeGlkLAorCQkJICAgICAgc3RydWN0IGNpZnNTZXNJbmZvICpzZXMsIGludCAqIHBOVExNdjJfZmxhZywKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZSkKK3sKKwlzdHJ1Y3Qgc21iX2hkciAqc21iX2J1ZmZlcjsKKwlzdHJ1Y3Qgc21iX2hkciAqc21iX2J1ZmZlcl9yZXNwb25zZTsKKwlTRVNTSU9OX1NFVFVQX0FORFggKnBTTUI7CisJU0VTU0lPTl9TRVRVUF9BTkRYICpwU01CcjsKKwljaGFyICpiY2NfcHRyOworCWNoYXIgKmRvbWFpbjsKKwlpbnQgcmMgPSAwOworCWludCByZW1haW5pbmdfd29yZHMgPSAwOworCWludCBieXRlc19yZXR1cm5lZCA9IDA7CisJaW50IGxlbjsKKwlpbnQgU2VjdXJpdHlCbG9iTGVuZ3RoID0gc2l6ZW9mIChORUdPVElBVEVfTUVTU0FHRSk7CisJUE5FR09USUFURV9NRVNTQUdFIFNlY3VyaXR5QmxvYjsKKwlQQ0hBTExFTkdFX01FU1NBR0UgU2VjdXJpdHlCbG9iMjsKKwlfX3UzMiBuZWdvdGlhdGVfZmxhZ3MsIGNhcGFiaWxpdGllczsKKwlfX3UxNiBjb3VudDsKKworCWNGWUkoMSwgKCJJbiBOVExNU1NQIHNlc3NzZXR1cCAobmVnb3RpYXRlKSAiKSk7CisJaWYoc2VzID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCWRvbWFpbiA9IHNlcy0+ZG9tYWluTmFtZTsKKwkqcE5UTE12Ml9mbGFnID0gRkFMU0U7CisJc21iX2J1ZmZlciA9IGNpZnNfYnVmX2dldCgpOworCWlmIChzbWJfYnVmZmVyID09IE5VTEwpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXNtYl9idWZmZXJfcmVzcG9uc2UgPSBzbWJfYnVmZmVyOworCXBTTUIgPSAoU0VTU0lPTl9TRVRVUF9BTkRYICopIHNtYl9idWZmZXI7CisJcFNNQnIgPSAoU0VTU0lPTl9TRVRVUF9BTkRYICopIHNtYl9idWZmZXJfcmVzcG9uc2U7CisKKwkvKiBzZW5kIFNNQnNlc3Npb25TZXR1cCBoZXJlICovCisJaGVhZGVyX2Fzc2VtYmxlKHNtYl9idWZmZXIsIFNNQl9DT01fU0VTU0lPTl9TRVRVUF9BTkRYLAorCQkJTlVMTCAvKiBubyB0Q29uIGV4aXN0cyB5ZXQgKi8gLCAxMiAvKiB3Y3QgKi8gKTsKKwlwU01CLT5yZXEuaGRyLkZsYWdzMiB8PSBTTUJGTEcyX0VYVF9TRUM7CisJcFNNQi0+cmVxLmhkci5GbGFncyB8PSAoU01CRkxHX0NBU0VMRVNTIHwgU01CRkxHX0NBTk9OSUNBTF9QQVRIX0ZPUk1BVCk7CisKKwlwU01CLT5yZXEuQW5kWENvbW1hbmQgPSAweEZGOworCXBTTUItPnJlcS5NYXhCdWZmZXJTaXplID0gY3B1X3RvX2xlMTYoc2VzLT5zZXJ2ZXItPm1heEJ1Zik7CisJcFNNQi0+cmVxLk1heE1weENvdW50ID0gY3B1X3RvX2xlMTYoc2VzLT5zZXJ2ZXItPm1heFJlcSk7CisKKwlpZihzZXMtPnNlcnZlci0+c2VjTW9kZSAmIChTRUNNT0RFX1NJR05fUkVRVUlSRUQgfCBTRUNNT0RFX1NJR05fRU5BQkxFRCkpCisJCXNtYl9idWZmZXItPkZsYWdzMiB8PSBTTUJGTEcyX1NFQ1VSSVRZX1NJR05BVFVSRTsKKworCWNhcGFiaWxpdGllcyA9IENBUF9MQVJHRV9GSUxFUyB8IENBUF9OVF9TTUJTIHwgQ0FQX0xFVkVMX0lJX09QTE9DS1MgfAorCSAgICBDQVBfRVhURU5ERURfU0VDVVJJVFk7CisJaWYgKHNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX1VOSUNPREUpIHsKKwkJc21iX2J1ZmZlci0+RmxhZ3MyIHw9IFNNQkZMRzJfVU5JQ09ERTsKKwkJY2FwYWJpbGl0aWVzIHw9IENBUF9VTklDT0RFOworCX0KKwlpZiAoc2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfU1RBVFVTMzIpIHsKKwkJc21iX2J1ZmZlci0+RmxhZ3MyIHw9IFNNQkZMRzJfRVJSX1NUQVRVUzsKKwkJY2FwYWJpbGl0aWVzIHw9IENBUF9TVEFUVVMzMjsKKwl9CisJaWYgKHNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX0RGUykgeworCQlzbWJfYnVmZmVyLT5GbGFnczIgfD0gU01CRkxHMl9ERlM7CisJCWNhcGFiaWxpdGllcyB8PSBDQVBfREZTOworCX0KKwlwU01CLT5yZXEuQ2FwYWJpbGl0aWVzID0gY3B1X3RvX2xlMzIoY2FwYWJpbGl0aWVzKTsKKworCWJjY19wdHIgPSAoY2hhciAqKSAmcFNNQi0+cmVxLlNlY3VyaXR5QmxvYjsKKwlTZWN1cml0eUJsb2IgPSAoUE5FR09USUFURV9NRVNTQUdFKSBiY2NfcHRyOworCXN0cm5jcHkoU2VjdXJpdHlCbG9iLT5TaWduYXR1cmUsIE5UTE1TU1BfU0lHTkFUVVJFLCA4KTsKKwlTZWN1cml0eUJsb2ItPk1lc3NhZ2VUeXBlID0gTnRMbU5lZ290aWF0ZTsKKwluZWdvdGlhdGVfZmxhZ3MgPQorCSAgICBOVExNU1NQX05FR09USUFURV9VTklDT0RFIHwgTlRMTVNTUF9ORUdPVElBVEVfT0VNIHwKKwkgICAgTlRMTVNTUF9SRVFVRVNUX1RBUkdFVCB8IE5UTE1TU1BfTkVHT1RJQVRFX05UTE0gfCAweDgwMDAwMDAwIHwKKwkgICAgLyogTlRMTVNTUF9ORUdPVElBVEVfQUxXQVlTX1NJR04gfCAqLyBOVExNU1NQX05FR09USUFURV8xMjg7CisJaWYoc2lnbl9DSUZTX1BEVXMpCisJCW5lZ290aWF0ZV9mbGFncyB8PSBOVExNU1NQX05FR09USUFURV9TSUdOOworCWlmKG50bG12Ml9zdXBwb3J0KQorCQluZWdvdGlhdGVfZmxhZ3MgfD0gTlRMTVNTUF9ORUdPVElBVEVfTlRMTVYyOworCS8qIHNldHVwIHBvaW50ZXJzIHRvIGRvbWFpbiBuYW1lIGFuZCB3b3Jrc3RhdGlvbiBuYW1lICovCisJYmNjX3B0ciArPSBTZWN1cml0eUJsb2JMZW5ndGg7CisKKwlTZWN1cml0eUJsb2ItPldvcmtzdGF0aW9uTmFtZS5CdWZmZXIgPSAwOworCVNlY3VyaXR5QmxvYi0+V29ya3N0YXRpb25OYW1lLkxlbmd0aCA9IDA7CisJU2VjdXJpdHlCbG9iLT5Xb3Jrc3RhdGlvbk5hbWUuTWF4aW11bUxlbmd0aCA9IDA7CisKKwlpZiAoZG9tYWluID09IE5VTEwpIHsKKwkJU2VjdXJpdHlCbG9iLT5Eb21haW5OYW1lLkJ1ZmZlciA9IDA7CisJCVNlY3VyaXR5QmxvYi0+RG9tYWluTmFtZS5MZW5ndGggPSAwOworCQlTZWN1cml0eUJsb2ItPkRvbWFpbk5hbWUuTWF4aW11bUxlbmd0aCA9IDA7CisJfSBlbHNlIHsKKwkJX191MTYgbGVuOworCQluZWdvdGlhdGVfZmxhZ3MgfD0gTlRMTVNTUF9ORUdPVElBVEVfRE9NQUlOX1NVUFBMSUVEOworCQlzdHJuY3B5KGJjY19wdHIsIGRvbWFpbiwgNjMpOworCQlsZW4gPSBzdHJubGVuKGRvbWFpbiwgNjQpOworCQlTZWN1cml0eUJsb2ItPkRvbWFpbk5hbWUuTWF4aW11bUxlbmd0aCA9CisJCSAgICBjcHVfdG9fbGUxNihsZW4pOworCQlTZWN1cml0eUJsb2ItPkRvbWFpbk5hbWUuQnVmZmVyID0KKwkJICAgIGNwdV90b19sZTMyKChsb25nKSAmU2VjdXJpdHlCbG9iLT4KKwkJCQlEb21haW5TdHJpbmcgLQorCQkJCShsb25nKSAmU2VjdXJpdHlCbG9iLT5TaWduYXR1cmUpOworCQliY2NfcHRyICs9IGxlbjsKKwkJU2VjdXJpdHlCbG9iTGVuZ3RoICs9IGxlbjsKKwkJU2VjdXJpdHlCbG9iLT5Eb21haW5OYW1lLkxlbmd0aCA9CisJCSAgICBjcHVfdG9fbGUxNihsZW4pOworCX0KKwlpZiAoc2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JQ09ERSkgeworCQlpZiAoKGxvbmcpIGJjY19wdHIgJSAyKSB7CisJCQkqYmNjX3B0ciA9IDA7CisJCQliY2NfcHRyKys7CisJCX0KKworCQlieXRlc19yZXR1cm5lZCA9CisJCSAgICBjaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIGJjY19wdHIsICJMaW51eCB2ZXJzaW9uICIsCisJCQkJICAzMiwgbmxzX2NvZGVwYWdlKTsKKwkJYmNjX3B0ciArPSAyICogYnl0ZXNfcmV0dXJuZWQ7CisJCWJ5dGVzX3JldHVybmVkID0KKwkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgYmNjX3B0ciwgc3lzdGVtX3V0c25hbWUucmVsZWFzZSwgMzIsCisJCQkJICBubHNfY29kZXBhZ2UpOworCQliY2NfcHRyICs9IDIgKiBieXRlc19yZXR1cm5lZDsKKwkJYmNjX3B0ciArPSAyOwkvKiBudWxsIHRlcm1pbmF0ZSBMaW51eCB2ZXJzaW9uICovCisJCWJ5dGVzX3JldHVybmVkID0KKwkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgYmNjX3B0ciwgQ0lGU19ORVRXT1JLX09QU1lTLAorCQkJCSAgNjQsIG5sc19jb2RlcGFnZSk7CisJCWJjY19wdHIgKz0gMiAqIGJ5dGVzX3JldHVybmVkOworCQkqKGJjY19wdHIgKyAxKSA9IDA7CisJCSooYmNjX3B0ciArIDIpID0gMDsKKwkJYmNjX3B0ciArPSAyOwkvKiBudWxsIHRlcm1pbmF0ZSBuZXR3b3JrIG9wc3lzIHN0cmluZyAqLworCQkqKGJjY19wdHIgKyAxKSA9IDA7CisJCSooYmNjX3B0ciArIDIpID0gMDsKKwkJYmNjX3B0ciArPSAyOwkvKiBudWxsIGRvbWFpbiAqLworCX0gZWxzZSB7CQkvKiBBU0NJSSAqLworCQlzdHJjcHkoYmNjX3B0ciwgIkxpbnV4IHZlcnNpb24gIik7CisJCWJjY19wdHIgKz0gc3RybGVuKCJMaW51eCB2ZXJzaW9uICIpOworCQlzdHJjcHkoYmNjX3B0ciwgc3lzdGVtX3V0c25hbWUucmVsZWFzZSk7CisJCWJjY19wdHIgKz0gc3RybGVuKHN5c3RlbV91dHNuYW1lLnJlbGVhc2UpICsgMTsKKwkJc3RyY3B5KGJjY19wdHIsIENJRlNfTkVUV09SS19PUFNZUyk7CisJCWJjY19wdHIgKz0gc3RybGVuKENJRlNfTkVUV09SS19PUFNZUykgKyAxOworCQliY2NfcHRyKys7CS8qIGVtcHR5IGRvbWFpbiBmaWVsZCAqLworCQkqYmNjX3B0ciA9IDA7CisJfQorCVNlY3VyaXR5QmxvYi0+TmVnb3RpYXRlRmxhZ3MgPSBjcHVfdG9fbGUzMihuZWdvdGlhdGVfZmxhZ3MpOworCXBTTUItPnJlcS5TZWN1cml0eUJsb2JMZW5ndGggPSBjcHVfdG9fbGUxNihTZWN1cml0eUJsb2JMZW5ndGgpOworCWNvdW50ID0gKGxvbmcpIGJjY19wdHIgLSAobG9uZykgcEJ5dGVBcmVhKHNtYl9idWZmZXIpOworCXNtYl9idWZmZXItPnNtYl9idWZfbGVuZ3RoICs9IGNvdW50OworCXBTTUItPnJlcS5CeXRlQ291bnQgPSBjcHVfdG9fbGUxNihjb3VudCk7CisKKwlyYyA9IFNlbmRSZWNlaXZlKHhpZCwgc2VzLCBzbWJfYnVmZmVyLCBzbWJfYnVmZmVyX3Jlc3BvbnNlLAorCQkJICZieXRlc19yZXR1cm5lZCwgMSk7CisKKwlpZiAoc21iX2J1ZmZlcl9yZXNwb25zZS0+U3RhdHVzLkNpZnNFcnJvciA9PQorCSAgICBjcHVfdG9fbGUzMihOVF9TVEFUVVNfTU9SRV9QUk9DRVNTSU5HX1JFUVVJUkVEKSkKKwkJcmMgPSAwOworCisJaWYgKHJjKSB7CisvKiAgICByYyA9IG1hcF9zbWJfdG9fbGludXhfZXJyb3Ioc21iX2J1ZmZlcl9yZXNwb25zZSk7ICAqLy8qIGRvbmUgaW4gU2VuZFJlY2VpdmUgbm93ICovCisJfSBlbHNlIGlmICgoc21iX2J1ZmZlcl9yZXNwb25zZS0+V29yZENvdW50ID09IDMpCisJCSAgIHx8IChzbWJfYnVmZmVyX3Jlc3BvbnNlLT5Xb3JkQ291bnQgPT0gNCkpIHsKKwkJX191MTYgYWN0aW9uID0gbGUxNl90b19jcHUocFNNQnItPnJlc3AuQWN0aW9uKTsKKwkJX191MTYgYmxvYl9sZW4gPSBsZTE2X3RvX2NwdShwU01Cci0+cmVzcC5TZWN1cml0eUJsb2JMZW5ndGgpOworCisJCWlmIChhY3Rpb24gJiBHVUVTVF9MT0dJTikKKwkJCWNGWUkoMSwgKCIgR3Vlc3QgbG9naW4iKSk7CQorICAgICAgICAvKiBEbyB3ZSB3YW50IHRvIHNldCBhbnl0aGluZyBpbiBTZXNJbmZvIHN0cnVjdCB3aGVuIGd1ZXN0IGxvZ2luPyAqLworCisJCWJjY19wdHIgPSBwQnl0ZUFyZWEoc21iX2J1ZmZlcl9yZXNwb25zZSk7CQorICAgICAgICAvKiByZXNwb25zZSBjYW4gaGF2ZSBlaXRoZXIgMyBvciA0IHdvcmQgY291bnQgLSBTYW1iYSBzZW5kcyAzICovCisKKwkJU2VjdXJpdHlCbG9iMiA9IChQQ0hBTExFTkdFX01FU1NBR0UpIGJjY19wdHI7CisJCWlmIChTZWN1cml0eUJsb2IyLT5NZXNzYWdlVHlwZSAhPSBOdExtQ2hhbGxlbmdlKSB7CisJCQljRllJKDEsCisJCQkgICAgICgiVW5leHBlY3RlZCBOVExNU1NQIG1lc3NhZ2UgdHlwZSByZWNlaXZlZCAlZCIsCisJCQkgICAgICBTZWN1cml0eUJsb2IyLT5NZXNzYWdlVHlwZSkpOworCQl9IGVsc2UgaWYgKHNlcykgeworCQkJc2VzLT5TdWlkID0gc21iX2J1ZmZlcl9yZXNwb25zZS0+VWlkOyAvKiBVSUQgbGVmdCBpbiBsZSBmb3JtYXQgKi8gCisJCQljRllJKDEsICgiVUlEID0gJWQgIiwgc2VzLT5TdWlkKSk7CisJCQlpZiAoKHBTTUJyLT5yZXNwLmhkci5Xb3JkQ291bnQgPT0gMykKKwkJCSAgICB8fCAoKHBTTUJyLT5yZXNwLmhkci5Xb3JkQ291bnQgPT0gNCkKKwkJCQkmJiAoYmxvYl9sZW4gPAorCQkJCSAgICBwU01Cci0+cmVzcC5CeXRlQ291bnQpKSkgeworCisJCQkJaWYgKHBTTUJyLT5yZXNwLmhkci5Xb3JkQ291bnQgPT0gNCkgeworCQkJCQliY2NfcHRyICs9IGJsb2JfbGVuOworCQkJCQljRllJKDEsCisJCQkJCSAgICAgKCJTZWN1cml0eSBCbG9iIExlbmd0aCAlZCAiLAorCQkJCQkgICAgICBibG9iX2xlbikpOworCQkJCX0KKworCQkJCWNGWUkoMSwgKCJOVExNU1NQIENoYWxsZW5nZSByY3ZkICIpKTsKKworCQkJCW1lbWNweShzZXMtPnNlcnZlci0+Y3J5cHRLZXksCisJCQkJICAgICAgIFNlY3VyaXR5QmxvYjItPkNoYWxsZW5nZSwKKwkJCQkgICAgICAgQ0lGU19DUllQVE9fS0VZX1NJWkUpOworCQkJCWlmKFNlY3VyaXR5QmxvYjItPk5lZ290aWF0ZUZsYWdzICYgY3B1X3RvX2xlMzIoTlRMTVNTUF9ORUdPVElBVEVfTlRMTVYyKSkKKwkJCQkJKnBOVExNdjJfZmxhZyA9IFRSVUU7CisKKwkJCQlpZigoU2VjdXJpdHlCbG9iMi0+TmVnb3RpYXRlRmxhZ3MgJiAKKwkJCQkJY3B1X3RvX2xlMzIoTlRMTVNTUF9ORUdPVElBVEVfQUxXQVlTX1NJR04pKSAKKwkJCQkJfHwgKHNpZ25fQ0lGU19QRFVzID4gMSkpCisJCQkJCQlzZXMtPnNlcnZlci0+c2VjTW9kZSB8PSAKKwkJCQkJCQlTRUNNT0RFX1NJR05fUkVRVUlSRUQ7CQorCQkJCWlmICgoU2VjdXJpdHlCbG9iMi0+TmVnb3RpYXRlRmxhZ3MgJiAKKwkJCQkJY3B1X3RvX2xlMzIoTlRMTVNTUF9ORUdPVElBVEVfU0lHTikpICYmIChzaWduX0NJRlNfUERVcykpCisJCQkJCQlzZXMtPnNlcnZlci0+c2VjTW9kZSB8PSAKKwkJCQkJCQlTRUNNT0RFX1NJR05fRU5BQkxFRDsKKworCQkJCWlmIChzbWJfYnVmZmVyLT5GbGFnczIgJiBTTUJGTEcyX1VOSUNPREUpIHsKKwkJCQkJaWYgKChsb25nKSAoYmNjX3B0cikgJSAyKSB7CisJCQkJCQlyZW1haW5pbmdfd29yZHMgPQorCQkJCQkJICAgIChCQ0Moc21iX2J1ZmZlcl9yZXNwb25zZSkKKwkJCQkJCSAgICAgLSAxKSAvIDI7CisJCQkJCQliY2NfcHRyKys7CS8qIFVuaWNvZGUgc3RyaW5ncyBtdXN0IGJlIHdvcmQgYWxpZ25lZCAqLworCQkJCQl9IGVsc2UgeworCQkJCQkJcmVtYWluaW5nX3dvcmRzID0KKwkJCQkJCSAgICBCQ0MKKwkJCQkJCSAgICAoc21iX2J1ZmZlcl9yZXNwb25zZSkgLyAyOworCQkJCQl9CisJCQkJCWxlbiA9CisJCQkJCSAgICBVbmlTdHJubGVuKCh3Y2hhcl90ICopIGJjY19wdHIsCisJCQkJCQkgICAgICAgcmVtYWluaW5nX3dvcmRzIC0gMSk7CisvKiBXZSBsb29rIGZvciBvYnZpb3VzIG1lc3NlZCB1cCBiY2Mgb3Igc3RyaW5ncyBpbiByZXNwb25zZSBzbyB3ZSBkbyBub3QgZ28gb2ZmCisgICB0aGUgZW5kIHNpbmNlIChhdCBsZWFzdCkgV0lOMksgYW5kIFdpbmRvd3MgWFAgaGF2ZSBhIG1ham9yIGJ1ZyBpbiBub3QgbnVsbAorICAgdGVybWluYXRpbmcgbGFzdCBVbmljb2RlIHN0cmluZyBpbiByZXNwb25zZSAgKi8KKwkJCQkJc2VzLT5zZXJ2ZXJPUyA9CisJCQkJCSAgICBjaWZzX2tjYWxsb2MoMiAqIChsZW4gKyAxKSwgR0ZQX0tFUk5FTCk7CisJCQkJCWNpZnNfc3RyZnJvbVVDU19sZShzZXMtPnNlcnZlck9TLAorCQkJCQkJCSAgICh3Y2hhcl90ICopCisJCQkJCQkJICAgYmNjX3B0ciwgbGVuLAorCQkJCQkJCSAgIG5sc19jb2RlcGFnZSk7CisJCQkJCWJjY19wdHIgKz0gMiAqIChsZW4gKyAxKTsKKwkJCQkJcmVtYWluaW5nX3dvcmRzIC09IGxlbiArIDE7CisJCQkJCXNlcy0+c2VydmVyT1NbMiAqIGxlbl0gPSAwOworCQkJCQlzZXMtPnNlcnZlck9TWzEgKyAoMiAqIGxlbildID0gMDsKKwkJCQkJaWYgKHJlbWFpbmluZ193b3JkcyA+IDApIHsKKwkJCQkJCWxlbiA9IFVuaVN0cm5sZW4oKHdjaGFyX3QgKikKKwkJCQkJCQkJIGJjY19wdHIsCisJCQkJCQkJCSByZW1haW5pbmdfd29yZHMKKwkJCQkJCQkJIC0gMSk7CisJCQkJCQlzZXMtPnNlcnZlck5PUyA9CisJCQkJCQkgICAgY2lmc19rY2FsbG9jKDIgKiAobGVuICsgMSksCisJCQkJCQkJICAgIEdGUF9LRVJORUwpOworCQkJCQkJY2lmc19zdHJmcm9tVUNTX2xlKHNlcy0+CisJCQkJCQkJCSAgIHNlcnZlck5PUywKKwkJCQkJCQkJICAgKHdjaGFyX3QgKikKKwkJCQkJCQkJICAgYmNjX3B0ciwKKwkJCQkJCQkJICAgbGVuLAorCQkJCQkJCQkgICBubHNfY29kZXBhZ2UpOworCQkJCQkJYmNjX3B0ciArPSAyICogKGxlbiArIDEpOworCQkJCQkJc2VzLT5zZXJ2ZXJOT1NbMiAqIGxlbl0gPSAwOworCQkJCQkJc2VzLT5zZXJ2ZXJOT1NbMSArCisJCQkJCQkJICAgICAgICgyICogbGVuKV0gPSAwOworCQkJCQkJcmVtYWluaW5nX3dvcmRzIC09IGxlbiArIDE7CisJCQkJCQlpZiAocmVtYWluaW5nX3dvcmRzID4gMCkgeworCQkJCQkJCWxlbiA9IFVuaVN0cm5sZW4oKHdjaGFyX3QgKikgYmNjX3B0ciwgcmVtYWluaW5nX3dvcmRzKTsJCisgICAgICAgICAgIC8qIGxhc3Qgc3RyaW5nIGlzIG5vdCBhbHdheXMgbnVsbCB0ZXJtaW5hdGVkIChmb3IgZS5nLiBmb3IgV2luZG93cyBYUCAmIDIwMDApICovCisJCQkJCQkJc2VzLT5zZXJ2ZXJEb21haW4gPQorCQkJCQkJCSAgICBjaWZzX2tjYWxsb2MoMiAqCisJCQkJCQkJCSAgICAobGVuICsKKwkJCQkJCQkJICAgICAxKSwKKwkJCQkJCQkJICAgIEdGUF9LRVJORUwpOworCQkJCQkJCWNpZnNfc3RyZnJvbVVDU19sZQorCQkJCQkJCSAgICAoc2VzLT4KKwkJCQkJCQkgICAgIHNlcnZlckRvbWFpbiwKKwkJCQkJCQkgICAgICh3Y2hhcl90ICopCisJCQkJCQkJICAgICBiY2NfcHRyLCBsZW4sCisJCQkJCQkJICAgICBubHNfY29kZXBhZ2UpOworCQkJCQkJCWJjY19wdHIgKz0KKwkJCQkJCQkgICAgMiAqIChsZW4gKyAxKTsKKwkJCQkJCQlzZXMtPgorCQkJCQkJCSAgICBzZXJ2ZXJEb21haW5bMgorCQkJCQkJCQkJICogbGVuXQorCQkJCQkJCSAgICA9IDA7CisJCQkJCQkJc2VzLT4KKwkJCQkJCQkgICAgc2VydmVyRG9tYWluWzEKKwkJCQkJCQkJCSArCisJCQkJCQkJCQkgKDIKKwkJCQkJCQkJCSAgKgorCQkJCQkJCQkJICBsZW4pXQorCQkJCQkJCSAgICA9IDA7CisJCQkJCQl9IC8qIGVsc2Ugbm8gbW9yZSByb29tIHNvIGNyZWF0ZSBkdW1teSBkb21haW4gc3RyaW5nICovCisJCQkJCQllbHNlCisJCQkJCQkJc2VzLT5zZXJ2ZXJEb21haW4gPQorCQkJCQkJCSAgICBjaWZzX2tjYWxsb2MoMiwKKwkJCQkJCQkJICAgIEdGUF9LRVJORUwpOworCQkJCQl9IGVsc2UgewkvKiBubyByb29tIHNvIGNyZWF0ZSBkdW1teSBkb21haW4gYW5kIE5PUyBzdHJpbmcgKi8KKwkJCQkJCXNlcy0+c2VydmVyRG9tYWluID0KKwkJCQkJCSAgICBjaWZzX2tjYWxsb2MoMiwgR0ZQX0tFUk5FTCk7CisJCQkJCQlzZXMtPnNlcnZlck5PUyA9CisJCQkJCQkgICAgY2lmc19rY2FsbG9jKDIsIEdGUF9LRVJORUwpOworCQkJCQl9CisJCQkJfSBlbHNlIHsJLyogQVNDSUkgKi8KKwkJCQkJbGVuID0gc3RybmxlbihiY2NfcHRyLCAxMDI0KTsKKwkJCQkJaWYgKCgobG9uZykgYmNjX3B0ciArIGxlbikgLSAobG9uZykKKwkJCQkJICAgIHBCeXRlQXJlYShzbWJfYnVmZmVyX3Jlc3BvbnNlKQorCQkJCQkgICAgPD0gQkNDKHNtYl9idWZmZXJfcmVzcG9uc2UpKSB7CisJCQkJCQlzZXMtPnNlcnZlck9TID0KKwkJCQkJCSAgICBjaWZzX2tjYWxsb2MobGVuICsgMSwKKwkJCQkJCQkgICAgR0ZQX0tFUk5FTCk7CisJCQkJCQlzdHJuY3B5KHNlcy0+c2VydmVyT1MsCisJCQkJCQkJYmNjX3B0ciwgbGVuKTsKKworCQkJCQkJYmNjX3B0ciArPSBsZW47CisJCQkJCQliY2NfcHRyWzBdID0gMDsJLyogbnVsbCB0ZXJtaW5hdGUgc3RyaW5nICovCisJCQkJCQliY2NfcHRyKys7CisKKwkJCQkJCWxlbiA9IHN0cm5sZW4oYmNjX3B0ciwgMTAyNCk7CisJCQkJCQlzZXMtPnNlcnZlck5PUyA9CisJCQkJCQkgICAgY2lmc19rY2FsbG9jKGxlbiArIDEsCisJCQkJCQkJICAgIEdGUF9LRVJORUwpOworCQkJCQkJc3RybmNweShzZXMtPnNlcnZlck5PUywgYmNjX3B0ciwgbGVuKTsKKwkJCQkJCWJjY19wdHIgKz0gbGVuOworCQkJCQkJYmNjX3B0clswXSA9IDA7CisJCQkJCQliY2NfcHRyKys7CisKKwkJCQkJCWxlbiA9IHN0cm5sZW4oYmNjX3B0ciwgMTAyNCk7CisJCQkJCQlzZXMtPnNlcnZlckRvbWFpbiA9CisJCQkJCQkgICAgY2lmc19rY2FsbG9jKGxlbiArIDEsCisJCQkJCQkJICAgIEdGUF9LRVJORUwpOworCQkJCQkJc3RybmNweShzZXMtPnNlcnZlckRvbWFpbiwgYmNjX3B0ciwgbGVuKTsJCisJCQkJCQliY2NfcHRyICs9IGxlbjsKKwkJCQkJCWJjY19wdHJbMF0gPSAwOworCQkJCQkJYmNjX3B0cisrOworCQkJCQl9IGVsc2UKKwkJCQkJCWNGWUkoMSwKKwkJCQkJCSAgICAgKCJWYXJpYWJsZSBmaWVsZCBvZiBsZW5ndGggJWQgZXh0ZW5kcyBiZXlvbmQgZW5kIG9mIHNtYiAiLAorCQkJCQkJICAgICAgbGVuKSk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQljRVJST1IoMSwKKwkJCQkgICAgICAgKCIgU2VjdXJpdHkgQmxvYiBMZW5ndGggZXh0ZW5kcyBiZXlvbmQgZW5kIG9mIFNNQiIpKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWNFUlJPUigxLCAoIk5vIHNlc3Npb24gc3RydWN0dXJlIHBhc3NlZCBpbi4iKSk7CisJCX0KKwl9IGVsc2UgeworCQljRVJST1IoMSwKKwkJICAgICAgICgiIEludmFsaWQgV29yZCBjb3VudCAlZDogIiwKKwkJCXNtYl9idWZmZXJfcmVzcG9uc2UtPldvcmRDb3VudCkpOworCQlyYyA9IC1FSU87CisJfQorCisJaWYgKHNtYl9idWZmZXIpCisJCWNpZnNfYnVmX3JlbGVhc2Uoc21iX2J1ZmZlcik7CisKKwlyZXR1cm4gcmM7Cit9CitzdGF0aWMgaW50CitDSUZTTlRMTVNTUEF1dGhTZXNzU2V0dXAodW5zaWduZWQgaW50IHhpZCwgc3RydWN0IGNpZnNTZXNJbmZvICpzZXMsCisJCWNoYXIgKm50bG1fc2Vzc2lvbl9rZXksIGludCBudGxtdjJfZmxhZywKKwkJY29uc3Qgc3RydWN0IG5sc190YWJsZSAqbmxzX2NvZGVwYWdlKQoreworCXN0cnVjdCBzbWJfaGRyICpzbWJfYnVmZmVyOworCXN0cnVjdCBzbWJfaGRyICpzbWJfYnVmZmVyX3Jlc3BvbnNlOworCVNFU1NJT05fU0VUVVBfQU5EWCAqcFNNQjsKKwlTRVNTSU9OX1NFVFVQX0FORFggKnBTTUJyOworCWNoYXIgKmJjY19wdHI7CisJY2hhciAqdXNlcjsKKwljaGFyICpkb21haW47CisJaW50IHJjID0gMDsKKwlpbnQgcmVtYWluaW5nX3dvcmRzID0gMDsKKwlpbnQgYnl0ZXNfcmV0dXJuZWQgPSAwOworCWludCBsZW47CisJaW50IFNlY3VyaXR5QmxvYkxlbmd0aCA9IHNpemVvZiAoQVVUSEVOVElDQVRFX01FU1NBR0UpOworCVBBVVRIRU5USUNBVEVfTUVTU0FHRSBTZWN1cml0eUJsb2I7CisJX191MzIgbmVnb3RpYXRlX2ZsYWdzLCBjYXBhYmlsaXRpZXM7CisJX191MTYgY291bnQ7CisKKwljRllJKDEsICgiSW4gTlRMTVNTUFNlc3NTZXR1cCAoQXV0aGVudGljYXRlKSIpKTsKKwlpZihzZXMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJdXNlciA9IHNlcy0+dXNlck5hbWU7CisJZG9tYWluID0gc2VzLT5kb21haW5OYW1lOworCXNtYl9idWZmZXIgPSBjaWZzX2J1Zl9nZXQoKTsKKwlpZiAoc21iX2J1ZmZlciA9PSBOVUxMKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlzbWJfYnVmZmVyX3Jlc3BvbnNlID0gc21iX2J1ZmZlcjsKKwlwU01CID0gKFNFU1NJT05fU0VUVVBfQU5EWCAqKSBzbWJfYnVmZmVyOworCXBTTUJyID0gKFNFU1NJT05fU0VUVVBfQU5EWCAqKSBzbWJfYnVmZmVyX3Jlc3BvbnNlOworCisJLyogc2VuZCBTTUJzZXNzaW9uU2V0dXAgaGVyZSAqLworCWhlYWRlcl9hc3NlbWJsZShzbWJfYnVmZmVyLCBTTUJfQ09NX1NFU1NJT05fU0VUVVBfQU5EWCwKKwkJCU5VTEwgLyogbm8gdENvbiBleGlzdHMgeWV0ICovICwgMTIgLyogd2N0ICovICk7CisJcFNNQi0+cmVxLmhkci5GbGFncyB8PSAoU01CRkxHX0NBU0VMRVNTIHwgU01CRkxHX0NBTk9OSUNBTF9QQVRIX0ZPUk1BVCk7CisJcFNNQi0+cmVxLmhkci5GbGFnczIgfD0gU01CRkxHMl9FWFRfU0VDOworCXBTTUItPnJlcS5BbmRYQ29tbWFuZCA9IDB4RkY7CisJcFNNQi0+cmVxLk1heEJ1ZmZlclNpemUgPSBjcHVfdG9fbGUxNihzZXMtPnNlcnZlci0+bWF4QnVmKTsKKwlwU01CLT5yZXEuTWF4TXB4Q291bnQgPSBjcHVfdG9fbGUxNihzZXMtPnNlcnZlci0+bWF4UmVxKTsKKworCXBTTUItPnJlcS5oZHIuVWlkID0gc2VzLT5TdWlkOworCisJaWYoc2VzLT5zZXJ2ZXItPnNlY01vZGUgJiAoU0VDTU9ERV9TSUdOX1JFUVVJUkVEIHwgU0VDTU9ERV9TSUdOX0VOQUJMRUQpKQorCQlzbWJfYnVmZmVyLT5GbGFnczIgfD0gU01CRkxHMl9TRUNVUklUWV9TSUdOQVRVUkU7CisKKwljYXBhYmlsaXRpZXMgPSBDQVBfTEFSR0VfRklMRVMgfCBDQVBfTlRfU01CUyB8IENBUF9MRVZFTF9JSV9PUExPQ0tTIHwKKwkgICAgQ0FQX0VYVEVOREVEX1NFQ1VSSVRZOworCWlmIChzZXMtPmNhcGFiaWxpdGllcyAmIENBUF9VTklDT0RFKSB7CisJCXNtYl9idWZmZXItPkZsYWdzMiB8PSBTTUJGTEcyX1VOSUNPREU7CisJCWNhcGFiaWxpdGllcyB8PSBDQVBfVU5JQ09ERTsKKwl9CisJaWYgKHNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX1NUQVRVUzMyKSB7CisJCXNtYl9idWZmZXItPkZsYWdzMiB8PSBTTUJGTEcyX0VSUl9TVEFUVVM7CisJCWNhcGFiaWxpdGllcyB8PSBDQVBfU1RBVFVTMzI7CisJfQorCWlmIChzZXMtPmNhcGFiaWxpdGllcyAmIENBUF9ERlMpIHsKKwkJc21iX2J1ZmZlci0+RmxhZ3MyIHw9IFNNQkZMRzJfREZTOworCQljYXBhYmlsaXRpZXMgfD0gQ0FQX0RGUzsKKwl9CisJcFNNQi0+cmVxLkNhcGFiaWxpdGllcyA9IGNwdV90b19sZTMyKGNhcGFiaWxpdGllcyk7CisKKwliY2NfcHRyID0gKGNoYXIgKikgJnBTTUItPnJlcS5TZWN1cml0eUJsb2I7CisJU2VjdXJpdHlCbG9iID0gKFBBVVRIRU5USUNBVEVfTUVTU0FHRSkgYmNjX3B0cjsKKwlzdHJuY3B5KFNlY3VyaXR5QmxvYi0+U2lnbmF0dXJlLCBOVExNU1NQX1NJR05BVFVSRSwgOCk7CisJU2VjdXJpdHlCbG9iLT5NZXNzYWdlVHlwZSA9IE50TG1BdXRoZW50aWNhdGU7CisJYmNjX3B0ciArPSBTZWN1cml0eUJsb2JMZW5ndGg7CisJbmVnb3RpYXRlX2ZsYWdzID0gCisJICAgIE5UTE1TU1BfTkVHT1RJQVRFX1VOSUNPREUgfCBOVExNU1NQX1JFUVVFU1RfVEFSR0VUIHwKKwkgICAgTlRMTVNTUF9ORUdPVElBVEVfTlRMTSB8IE5UTE1TU1BfTkVHT1RJQVRFX1RBUkdFVF9JTkZPIHwKKwkgICAgMHg4MDAwMDAwMCB8IE5UTE1TU1BfTkVHT1RJQVRFXzEyODsKKwlpZihzaWduX0NJRlNfUERVcykKKwkJbmVnb3RpYXRlX2ZsYWdzIHw9IC8qIE5UTE1TU1BfTkVHT1RJQVRFX0FMV0FZU19TSUdOIHwqLyBOVExNU1NQX05FR09USUFURV9TSUdOOworCWlmKG50bG12Ml9mbGFnKQorCQluZWdvdGlhdGVfZmxhZ3MgfD0gTlRMTVNTUF9ORUdPVElBVEVfTlRMTVYyOworCisvKiBzZXR1cCBwb2ludGVycyB0byBkb21haW4gbmFtZSBhbmQgd29ya3N0YXRpb24gbmFtZSAqLworCisJU2VjdXJpdHlCbG9iLT5Xb3Jrc3RhdGlvbk5hbWUuQnVmZmVyID0gMDsKKwlTZWN1cml0eUJsb2ItPldvcmtzdGF0aW9uTmFtZS5MZW5ndGggPSAwOworCVNlY3VyaXR5QmxvYi0+V29ya3N0YXRpb25OYW1lLk1heGltdW1MZW5ndGggPSAwOworCVNlY3VyaXR5QmxvYi0+U2Vzc2lvbktleS5MZW5ndGggPSAwOworCVNlY3VyaXR5QmxvYi0+U2Vzc2lvbktleS5NYXhpbXVtTGVuZ3RoID0gMDsKKwlTZWN1cml0eUJsb2ItPlNlc3Npb25LZXkuQnVmZmVyID0gMDsKKworCVNlY3VyaXR5QmxvYi0+TG1DaGFsbGVuZ2VSZXNwb25zZS5MZW5ndGggPSAwOworCVNlY3VyaXR5QmxvYi0+TG1DaGFsbGVuZ2VSZXNwb25zZS5NYXhpbXVtTGVuZ3RoID0gMDsKKwlTZWN1cml0eUJsb2ItPkxtQ2hhbGxlbmdlUmVzcG9uc2UuQnVmZmVyID0gMDsKKworCVNlY3VyaXR5QmxvYi0+TnRDaGFsbGVuZ2VSZXNwb25zZS5MZW5ndGggPQorCSAgICBjcHVfdG9fbGUxNihDSUZTX1NFU1NJT05fS0VZX1NJWkUpOworCVNlY3VyaXR5QmxvYi0+TnRDaGFsbGVuZ2VSZXNwb25zZS5NYXhpbXVtTGVuZ3RoID0KKwkgICAgY3B1X3RvX2xlMTYoQ0lGU19TRVNTSU9OX0tFWV9TSVpFKTsKKwltZW1jcHkoYmNjX3B0ciwgbnRsbV9zZXNzaW9uX2tleSwgQ0lGU19TRVNTSU9OX0tFWV9TSVpFKTsKKwlTZWN1cml0eUJsb2ItPk50Q2hhbGxlbmdlUmVzcG9uc2UuQnVmZmVyID0KKwkgICAgY3B1X3RvX2xlMzIoU2VjdXJpdHlCbG9iTGVuZ3RoKTsKKwlTZWN1cml0eUJsb2JMZW5ndGggKz0gQ0lGU19TRVNTSU9OX0tFWV9TSVpFOworCWJjY19wdHIgKz0gQ0lGU19TRVNTSU9OX0tFWV9TSVpFOworCisJaWYgKHNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX1VOSUNPREUpIHsKKwkJaWYgKGRvbWFpbiA9PSBOVUxMKSB7CisJCQlTZWN1cml0eUJsb2ItPkRvbWFpbk5hbWUuQnVmZmVyID0gMDsKKwkJCVNlY3VyaXR5QmxvYi0+RG9tYWluTmFtZS5MZW5ndGggPSAwOworCQkJU2VjdXJpdHlCbG9iLT5Eb21haW5OYW1lLk1heGltdW1MZW5ndGggPSAwOworCQl9IGVsc2UgeworCQkJX191MTYgbGVuID0KKwkJCSAgICBjaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIGJjY19wdHIsIGRvbWFpbiwgNjQsCisJCQkJCSAgbmxzX2NvZGVwYWdlKTsKKwkJCWxlbiAqPSAyOworCQkJU2VjdXJpdHlCbG9iLT5Eb21haW5OYW1lLk1heGltdW1MZW5ndGggPQorCQkJICAgIGNwdV90b19sZTE2KGxlbik7CisJCQlTZWN1cml0eUJsb2ItPkRvbWFpbk5hbWUuQnVmZmVyID0KKwkJCSAgICBjcHVfdG9fbGUzMihTZWN1cml0eUJsb2JMZW5ndGgpOworCQkJYmNjX3B0ciArPSBsZW47CisJCQlTZWN1cml0eUJsb2JMZW5ndGggKz0gbGVuOworCQkJU2VjdXJpdHlCbG9iLT5Eb21haW5OYW1lLkxlbmd0aCA9CisJCQkgICAgY3B1X3RvX2xlMTYobGVuKTsKKwkJfQorCQlpZiAodXNlciA9PSBOVUxMKSB7CisJCQlTZWN1cml0eUJsb2ItPlVzZXJOYW1lLkJ1ZmZlciA9IDA7CisJCQlTZWN1cml0eUJsb2ItPlVzZXJOYW1lLkxlbmd0aCA9IDA7CisJCQlTZWN1cml0eUJsb2ItPlVzZXJOYW1lLk1heGltdW1MZW5ndGggPSAwOworCQl9IGVsc2UgeworCQkJX191MTYgbGVuID0KKwkJCSAgICBjaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIGJjY19wdHIsIHVzZXIsIDY0LAorCQkJCQkgIG5sc19jb2RlcGFnZSk7CisJCQlsZW4gKj0gMjsKKwkJCVNlY3VyaXR5QmxvYi0+VXNlck5hbWUuTWF4aW11bUxlbmd0aCA9CisJCQkgICAgY3B1X3RvX2xlMTYobGVuKTsKKwkJCVNlY3VyaXR5QmxvYi0+VXNlck5hbWUuQnVmZmVyID0KKwkJCSAgICBjcHVfdG9fbGUzMihTZWN1cml0eUJsb2JMZW5ndGgpOworCQkJYmNjX3B0ciArPSBsZW47CisJCQlTZWN1cml0eUJsb2JMZW5ndGggKz0gbGVuOworCQkJU2VjdXJpdHlCbG9iLT5Vc2VyTmFtZS5MZW5ndGggPQorCQkJICAgIGNwdV90b19sZTE2KGxlbik7CisJCX0KKworCQkvKiBTZWN1cml0eUJsb2ItPldvcmtzdGF0aW9uTmFtZS5MZW5ndGggPSBjaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIGJjY19wdHIsICJBTUFDSElORSIsNjQsIG5sc19jb2RlcGFnZSk7CisJCSAgIFNlY3VyaXR5QmxvYi0+V29ya3N0YXRpb25OYW1lLkxlbmd0aCAqPSAyOworCQkgICBTZWN1cml0eUJsb2ItPldvcmtzdGF0aW9uTmFtZS5NYXhpbXVtTGVuZ3RoID0gY3B1X3RvX2xlMTYoU2VjdXJpdHlCbG9iLT5Xb3Jrc3RhdGlvbk5hbWUuTGVuZ3RoKTsKKwkJICAgU2VjdXJpdHlCbG9iLT5Xb3Jrc3RhdGlvbk5hbWUuQnVmZmVyID0gY3B1X3RvX2xlMzIoU2VjdXJpdHlCbG9iTGVuZ3RoKTsKKwkJICAgYmNjX3B0ciArPSBTZWN1cml0eUJsb2ItPldvcmtzdGF0aW9uTmFtZS5MZW5ndGg7CisJCSAgIFNlY3VyaXR5QmxvYkxlbmd0aCArPSBTZWN1cml0eUJsb2ItPldvcmtzdGF0aW9uTmFtZS5MZW5ndGg7CisJCSAgIFNlY3VyaXR5QmxvYi0+V29ya3N0YXRpb25OYW1lLkxlbmd0aCA9IGNwdV90b19sZTE2KFNlY3VyaXR5QmxvYi0+V29ya3N0YXRpb25OYW1lLkxlbmd0aCk7ICAqLworCisJCWlmICgobG9uZykgYmNjX3B0ciAlIDIpIHsKKwkJCSpiY2NfcHRyID0gMDsKKwkJCWJjY19wdHIrKzsKKwkJfQorCQlieXRlc19yZXR1cm5lZCA9CisJCSAgICBjaWZzX3N0cnRvVUNTKCh3Y2hhcl90ICopIGJjY19wdHIsICJMaW51eCB2ZXJzaW9uICIsCisJCQkJICAzMiwgbmxzX2NvZGVwYWdlKTsKKwkJYmNjX3B0ciArPSAyICogYnl0ZXNfcmV0dXJuZWQ7CisJCWJ5dGVzX3JldHVybmVkID0KKwkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgYmNjX3B0ciwgc3lzdGVtX3V0c25hbWUucmVsZWFzZSwgMzIsCisJCQkJICBubHNfY29kZXBhZ2UpOworCQliY2NfcHRyICs9IDIgKiBieXRlc19yZXR1cm5lZDsKKwkJYmNjX3B0ciArPSAyOwkvKiBudWxsIHRlcm0gdmVyc2lvbiBzdHJpbmcgKi8KKwkJYnl0ZXNfcmV0dXJuZWQgPQorCQkgICAgY2lmc19zdHJ0b1VDUygod2NoYXJfdCAqKSBiY2NfcHRyLCBDSUZTX05FVFdPUktfT1BTWVMsCisJCQkJICA2NCwgbmxzX2NvZGVwYWdlKTsKKwkJYmNjX3B0ciArPSAyICogYnl0ZXNfcmV0dXJuZWQ7CisJCSooYmNjX3B0ciArIDEpID0gMDsKKwkJKihiY2NfcHRyICsgMikgPSAwOworCQliY2NfcHRyICs9IDI7CS8qIG51bGwgdGVybWluYXRlIG5ldHdvcmsgb3BzeXMgc3RyaW5nICovCisJCSooYmNjX3B0ciArIDEpID0gMDsKKwkJKihiY2NfcHRyICsgMikgPSAwOworCQliY2NfcHRyICs9IDI7CS8qIG51bGwgZG9tYWluICovCisJfSBlbHNlIHsJCS8qIEFTQ0lJICovCisJCWlmIChkb21haW4gPT0gTlVMTCkgeworCQkJU2VjdXJpdHlCbG9iLT5Eb21haW5OYW1lLkJ1ZmZlciA9IDA7CisJCQlTZWN1cml0eUJsb2ItPkRvbWFpbk5hbWUuTGVuZ3RoID0gMDsKKwkJCVNlY3VyaXR5QmxvYi0+RG9tYWluTmFtZS5NYXhpbXVtTGVuZ3RoID0gMDsKKwkJfSBlbHNlIHsKKwkJCV9fdTE2IGxlbjsKKwkJCW5lZ290aWF0ZV9mbGFncyB8PSBOVExNU1NQX05FR09USUFURV9ET01BSU5fU1VQUExJRUQ7CisJCQlzdHJuY3B5KGJjY19wdHIsIGRvbWFpbiwgNjMpOworCQkJbGVuID0gc3Rybmxlbihkb21haW4sIDY0KTsKKwkJCVNlY3VyaXR5QmxvYi0+RG9tYWluTmFtZS5NYXhpbXVtTGVuZ3RoID0KKwkJCSAgICBjcHVfdG9fbGUxNihsZW4pOworCQkJU2VjdXJpdHlCbG9iLT5Eb21haW5OYW1lLkJ1ZmZlciA9CisJCQkgICAgY3B1X3RvX2xlMzIoU2VjdXJpdHlCbG9iTGVuZ3RoKTsKKwkJCWJjY19wdHIgKz0gbGVuOworCQkJU2VjdXJpdHlCbG9iTGVuZ3RoICs9IGxlbjsKKwkJCVNlY3VyaXR5QmxvYi0+RG9tYWluTmFtZS5MZW5ndGggPSBjcHVfdG9fbGUxNihsZW4pOworCQl9CisJCWlmICh1c2VyID09IE5VTEwpIHsKKwkJCVNlY3VyaXR5QmxvYi0+VXNlck5hbWUuQnVmZmVyID0gMDsKKwkJCVNlY3VyaXR5QmxvYi0+VXNlck5hbWUuTGVuZ3RoID0gMDsKKwkJCVNlY3VyaXR5QmxvYi0+VXNlck5hbWUuTWF4aW11bUxlbmd0aCA9IDA7CisJCX0gZWxzZSB7CisJCQlfX3UxNiBsZW47CisJCQlzdHJuY3B5KGJjY19wdHIsIHVzZXIsIDYzKTsKKwkJCWxlbiA9IHN0cm5sZW4odXNlciwgNjQpOworCQkJU2VjdXJpdHlCbG9iLT5Vc2VyTmFtZS5NYXhpbXVtTGVuZ3RoID0KKwkJCSAgICBjcHVfdG9fbGUxNihsZW4pOworCQkJU2VjdXJpdHlCbG9iLT5Vc2VyTmFtZS5CdWZmZXIgPQorCQkJICAgIGNwdV90b19sZTMyKFNlY3VyaXR5QmxvYkxlbmd0aCk7CisJCQliY2NfcHRyICs9IGxlbjsKKwkJCVNlY3VyaXR5QmxvYkxlbmd0aCArPSBsZW47CisJCQlTZWN1cml0eUJsb2ItPlVzZXJOYW1lLkxlbmd0aCA9IGNwdV90b19sZTE2KGxlbik7CisJCX0KKwkJLyogQkIgZmlsbCBpbiBvdXIgd29ya3N0YXRpb24gbmFtZSBpZiBrbm93biBCQiAqLworCisJCXN0cmNweShiY2NfcHRyLCAiTGludXggdmVyc2lvbiAiKTsKKwkJYmNjX3B0ciArPSBzdHJsZW4oIkxpbnV4IHZlcnNpb24gIik7CisJCXN0cmNweShiY2NfcHRyLCBzeXN0ZW1fdXRzbmFtZS5yZWxlYXNlKTsKKwkJYmNjX3B0ciArPSBzdHJsZW4oc3lzdGVtX3V0c25hbWUucmVsZWFzZSkgKyAxOworCQlzdHJjcHkoYmNjX3B0ciwgQ0lGU19ORVRXT1JLX09QU1lTKTsKKwkJYmNjX3B0ciArPSBzdHJsZW4oQ0lGU19ORVRXT1JLX09QU1lTKSArIDE7CisJCWJjY19wdHIrKzsJLyogbnVsbCBkb21haW4gKi8KKwkJKmJjY19wdHIgPSAwOworCX0KKwlTZWN1cml0eUJsb2ItPk5lZ290aWF0ZUZsYWdzID0gY3B1X3RvX2xlMzIobmVnb3RpYXRlX2ZsYWdzKTsKKwlwU01CLT5yZXEuU2VjdXJpdHlCbG9iTGVuZ3RoID0gY3B1X3RvX2xlMTYoU2VjdXJpdHlCbG9iTGVuZ3RoKTsKKwljb3VudCA9IChsb25nKSBiY2NfcHRyIC0gKGxvbmcpIHBCeXRlQXJlYShzbWJfYnVmZmVyKTsKKwlzbWJfYnVmZmVyLT5zbWJfYnVmX2xlbmd0aCArPSBjb3VudDsKKwlwU01CLT5yZXEuQnl0ZUNvdW50ID0gY3B1X3RvX2xlMTYoY291bnQpOworCisJcmMgPSBTZW5kUmVjZWl2ZSh4aWQsIHNlcywgc21iX2J1ZmZlciwgc21iX2J1ZmZlcl9yZXNwb25zZSwKKwkJCSAmYnl0ZXNfcmV0dXJuZWQsIDEpOworCWlmIChyYykgeworLyogICAgcmMgPSBtYXBfc21iX3RvX2xpbnV4X2Vycm9yKHNtYl9idWZmZXJfcmVzcG9uc2UpOyAgKi8vKiBkb25lIGluIFNlbmRSZWNlaXZlIG5vdyAqLworCX0gZWxzZSBpZiAoKHNtYl9idWZmZXJfcmVzcG9uc2UtPldvcmRDb3VudCA9PSAzKQorCQkgICB8fCAoc21iX2J1ZmZlcl9yZXNwb25zZS0+V29yZENvdW50ID09IDQpKSB7CisJCV9fdTE2IGFjdGlvbiA9IGxlMTZfdG9fY3B1KHBTTUJyLT5yZXNwLkFjdGlvbik7CisJCV9fdTE2IGJsb2JfbGVuID0KKwkJICAgIGxlMTZfdG9fY3B1KHBTTUJyLT5yZXNwLlNlY3VyaXR5QmxvYkxlbmd0aCk7CisJCWlmIChhY3Rpb24gJiBHVUVTVF9MT0dJTikKKwkJCWNGWUkoMSwgKCIgR3Vlc3QgbG9naW4iKSk7CS8qIEJCIGRvIHdlIHdhbnQgdG8gc2V0IGFueXRoaW5nIGluIFNlc0luZm8gc3RydWN0ID8gKi8KKy8qICAgICAgICBpZihTZWN1cml0eUJsb2IyLT5NZXNzYWdlVHlwZSAhPSBOdExtPz8peyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgY0ZZSSgiVW5leHBlY3RlZCBtZXNzYWdlIHR5cGUgb24gYXV0aCByZXNwb25zZSBpcyAlZCAiKSk7IAorICAgICAgICB9ICovCisJCWlmIChzZXMpIHsKKwkJCWNGWUkoMSwKKwkJCSAgICAgKCJEb2VzIFVJRCBvbiBjaGFsbGVuZ2UgJWQgbWF0Y2ggYXV0aCByZXNwb25zZSBVSUQgJWQgIiwKKwkJCSAgICAgIHNlcy0+U3VpZCwgc21iX2J1ZmZlcl9yZXNwb25zZS0+VWlkKSk7CisJCQlzZXMtPlN1aWQgPSBzbWJfYnVmZmVyX3Jlc3BvbnNlLT5VaWQ7IC8qIFVJRCBsZWZ0IGluIHdpcmUgZm9ybWF0ICovCisJCQliY2NfcHRyID0gcEJ5dGVBcmVhKHNtYl9idWZmZXJfcmVzcG9uc2UpOwkKKyAgICAgICAgICAgIC8qIHJlc3BvbnNlIGNhbiBoYXZlIGVpdGhlciAzIG9yIDQgd29yZCBjb3VudCAtIFNhbWJhIHNlbmRzIDMgKi8KKwkJCWlmICgocFNNQnItPnJlc3AuaGRyLldvcmRDb3VudCA9PSAzKQorCQkJICAgIHx8ICgocFNNQnItPnJlc3AuaGRyLldvcmRDb3VudCA9PSA0KQorCQkJCSYmIChibG9iX2xlbiA8CisJCQkJICAgIHBTTUJyLT5yZXNwLkJ5dGVDb3VudCkpKSB7CisJCQkJaWYgKHBTTUJyLT5yZXNwLmhkci5Xb3JkQ291bnQgPT0gNCkgeworCQkJCQliY2NfcHRyICs9CisJCQkJCSAgICBibG9iX2xlbjsKKwkJCQkJY0ZZSSgxLAorCQkJCQkgICAgICgiU2VjdXJpdHkgQmxvYiBMZW5ndGggJWQgIiwKKwkJCQkJICAgICAgYmxvYl9sZW4pKTsKKwkJCQl9CisKKwkJCQljRllJKDEsCisJCQkJICAgICAoIk5UTE1TU1AgcmVzcG9uc2UgdG8gQXV0aGVudGljYXRlICIpKTsKKworCQkJCWlmIChzbWJfYnVmZmVyLT5GbGFnczIgJiBTTUJGTEcyX1VOSUNPREUpIHsKKwkJCQkJaWYgKChsb25nKSAoYmNjX3B0cikgJSAyKSB7CisJCQkJCQlyZW1haW5pbmdfd29yZHMgPQorCQkJCQkJICAgIChCQ0Moc21iX2J1ZmZlcl9yZXNwb25zZSkKKwkJCQkJCSAgICAgLSAxKSAvIDI7CisJCQkJCQliY2NfcHRyKys7CS8qIFVuaWNvZGUgc3RyaW5ncyBtdXN0IGJlIHdvcmQgYWxpZ25lZCAqLworCQkJCQl9IGVsc2UgeworCQkJCQkJcmVtYWluaW5nX3dvcmRzID0gQkNDKHNtYl9idWZmZXJfcmVzcG9uc2UpIC8gMjsKKwkJCQkJfQorCQkJCQlsZW4gPQorCQkJCQkgICAgVW5pU3Rybmxlbigod2NoYXJfdCAqKSBiY2NfcHRyLHJlbWFpbmluZ193b3JkcyAtIDEpOworLyogV2UgbG9vayBmb3Igb2J2aW91cyBtZXNzZWQgdXAgYmNjIG9yIHN0cmluZ3MgaW4gcmVzcG9uc2Ugc28gd2UgZG8gbm90IGdvIG9mZgorICB0aGUgZW5kIHNpbmNlIChhdCBsZWFzdCkgV0lOMksgYW5kIFdpbmRvd3MgWFAgaGF2ZSBhIG1ham9yIGJ1ZyBpbiBub3QgbnVsbAorICB0ZXJtaW5hdGluZyBsYXN0IFVuaWNvZGUgc3RyaW5nIGluIHJlc3BvbnNlICAqLworCQkJCQlzZXMtPnNlcnZlck9TID0KKwkJCQkJICAgIGNpZnNfa2NhbGxvYygyICogKGxlbiArIDEpLCBHRlBfS0VSTkVMKTsKKwkJCQkJY2lmc19zdHJmcm9tVUNTX2xlKHNlcy0+c2VydmVyT1MsCisJCQkJCQkJICAgKHdjaGFyX3QgKikKKwkJCQkJCQkgICBiY2NfcHRyLCBsZW4sCisJCQkJCQkJICAgbmxzX2NvZGVwYWdlKTsKKwkJCQkJYmNjX3B0ciArPSAyICogKGxlbiArIDEpOworCQkJCQlyZW1haW5pbmdfd29yZHMgLT0gbGVuICsgMTsKKwkJCQkJc2VzLT5zZXJ2ZXJPU1syICogbGVuXSA9IDA7CisJCQkJCXNlcy0+c2VydmVyT1NbMSArICgyICogbGVuKV0gPSAwOworCQkJCQlpZiAocmVtYWluaW5nX3dvcmRzID4gMCkgeworCQkJCQkJbGVuID0gVW5pU3Rybmxlbigod2NoYXJfdCAqKQorCQkJCQkJCQkgYmNjX3B0ciwKKwkJCQkJCQkJIHJlbWFpbmluZ193b3JkcworCQkJCQkJCQkgLSAxKTsKKwkJCQkJCXNlcy0+c2VydmVyTk9TID0KKwkJCQkJCSAgICBjaWZzX2tjYWxsb2MoMiAqIChsZW4gKyAxKSwKKwkJCQkJCQkgICAgR0ZQX0tFUk5FTCk7CisJCQkJCQljaWZzX3N0cmZyb21VQ1NfbGUoc2VzLT4KKwkJCQkJCQkJICAgc2VydmVyTk9TLAorCQkJCQkJCQkgICAod2NoYXJfdCAqKQorCQkJCQkJCQkgICBiY2NfcHRyLAorCQkJCQkJCQkgICBsZW4sCisJCQkJCQkJCSAgIG5sc19jb2RlcGFnZSk7CisJCQkJCQliY2NfcHRyICs9IDIgKiAobGVuICsgMSk7CisJCQkJCQlzZXMtPnNlcnZlck5PU1syICogbGVuXSA9IDA7CisJCQkJCQlzZXMtPnNlcnZlck5PU1sxKygyKmxlbildID0gMDsKKwkJCQkJCXJlbWFpbmluZ193b3JkcyAtPSBsZW4gKyAxOworCQkJCQkJaWYgKHJlbWFpbmluZ193b3JkcyA+IDApIHsKKwkJCQkJCQlsZW4gPSBVbmlTdHJubGVuKCh3Y2hhcl90ICopIGJjY19wdHIsIHJlbWFpbmluZ193b3Jkcyk7CQorICAgICAvKiBsYXN0IHN0cmluZyBub3QgYWx3YXlzIG51bGwgdGVybWluYXRlZCAoZS5nLiBmb3IgV2luZG93cyBYUCAmIDIwMDApICovCisJCQkJCQkJc2VzLT5zZXJ2ZXJEb21haW4gPQorCQkJCQkJCSAgICBjaWZzX2tjYWxsb2MoMiAqCisJCQkJCQkJCSAgICAobGVuICsKKwkJCQkJCQkJICAgICAxKSwKKwkJCQkJCQkJICAgIEdGUF9LRVJORUwpOworCQkJCQkJCWNpZnNfc3RyZnJvbVVDU19sZQorCQkJCQkJCSAgICAoc2VzLT4KKwkJCQkJCQkgICAgIHNlcnZlckRvbWFpbiwKKwkJCQkJCQkgICAgICh3Y2hhcl90ICopCisJCQkJCQkJICAgICBiY2NfcHRyLCBsZW4sCisJCQkJCQkJICAgICBubHNfY29kZXBhZ2UpOworCQkJCQkJCWJjY19wdHIgKz0KKwkJCQkJCQkgICAgMiAqIChsZW4gKyAxKTsKKwkJCQkJCQlzZXMtPgorCQkJCQkJCSAgICBzZXJ2ZXJEb21haW5bMgorCQkJCQkJCQkJICogbGVuXQorCQkJCQkJCSAgICA9IDA7CisJCQkJCQkJc2VzLT4KKwkJCQkJCQkgICAgc2VydmVyRG9tYWluWzEKKwkJCQkJCQkJCSArCisJCQkJCQkJCQkgKDIKKwkJCQkJCQkJCSAgKgorCQkJCQkJCQkJICBsZW4pXQorCQkJCQkJCSAgICA9IDA7CisJCQkJCQl9IC8qIGVsc2Ugbm8gbW9yZSByb29tIHNvIGNyZWF0ZSBkdW1teSBkb21haW4gc3RyaW5nICovCisJCQkJCQllbHNlCisJCQkJCQkJc2VzLT5zZXJ2ZXJEb21haW4gPSBjaWZzX2tjYWxsb2MoMixHRlBfS0VSTkVMKTsKKwkJCQkJfSBlbHNlIHsgIC8qIG5vIHJvb20gc28gY3JlYXRlIGR1bW15IGRvbWFpbiBhbmQgTk9TIHN0cmluZyAqLworCQkJCQkJc2VzLT5zZXJ2ZXJEb21haW4gPSBjaWZzX2tjYWxsb2MoMiwgR0ZQX0tFUk5FTCk7CisJCQkJCQlzZXMtPnNlcnZlck5PUyA9IGNpZnNfa2NhbGxvYygyLCBHRlBfS0VSTkVMKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CS8qIEFTQ0lJICovCisJCQkJCWxlbiA9IHN0cm5sZW4oYmNjX3B0ciwgMTAyNCk7CisJCQkJCWlmICgoKGxvbmcpIGJjY19wdHIgKyBsZW4pIC0gCisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgcEJ5dGVBcmVhKHNtYl9idWZmZXJfcmVzcG9uc2UpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw9IEJDQyhzbWJfYnVmZmVyX3Jlc3BvbnNlKSkgeworCQkJCQkJc2VzLT5zZXJ2ZXJPUyA9IGNpZnNfa2NhbGxvYyhsZW4gKyAxLEdGUF9LRVJORUwpOworCQkJCQkJc3RybmNweShzZXMtPnNlcnZlck9TLGJjY19wdHIsIGxlbik7CisKKwkJCQkJCWJjY19wdHIgKz0gbGVuOworCQkJCQkJYmNjX3B0clswXSA9IDA7CS8qIG51bGwgdGVybWluYXRlIHRoZSBzdHJpbmcgKi8KKwkJCQkJCWJjY19wdHIrKzsKKworCQkJCQkJbGVuID0gc3RybmxlbihiY2NfcHRyLCAxMDI0KTsKKwkJCQkJCXNlcy0+c2VydmVyTk9TID0gY2lmc19rY2FsbG9jKGxlbisxLEdGUF9LRVJORUwpOworCQkJCQkJc3RybmNweShzZXMtPnNlcnZlck5PUywgYmNjX3B0ciwgbGVuKTsJCisJCQkJCQliY2NfcHRyICs9IGxlbjsKKwkJCQkJCWJjY19wdHJbMF0gPSAwOworCQkJCQkJYmNjX3B0cisrOworCisJCQkJCQlsZW4gPSBzdHJubGVuKGJjY19wdHIsIDEwMjQpOworCQkJCQkJc2VzLT5zZXJ2ZXJEb21haW4gPSBjaWZzX2tjYWxsb2MobGVuKzEsR0ZQX0tFUk5FTCk7CisJCQkJCQlzdHJuY3B5KHNlcy0+c2VydmVyRG9tYWluLCBiY2NfcHRyLCBsZW4pOworCQkJCQkJYmNjX3B0ciArPSBsZW47CisJCQkJCQliY2NfcHRyWzBdID0gMDsKKwkJCQkJCWJjY19wdHIrKzsKKwkJCQkJfSBlbHNlCisJCQkJCQljRllJKDEsCisJCQkJCQkgICAgICgiVmFyaWFibGUgZmllbGQgb2YgbGVuZ3RoICVkIGV4dGVuZHMgYmV5b25kIGVuZCBvZiBzbWIgIiwKKwkJCQkJCSAgICAgIGxlbikpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJY0VSUk9SKDEsCisJCQkJICAgICAgICgiIFNlY3VyaXR5IEJsb2IgTGVuZ3RoIGV4dGVuZHMgYmV5b25kIGVuZCBvZiBTTUIiKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQljRVJST1IoMSwgKCJObyBzZXNzaW9uIHN0cnVjdHVyZSBwYXNzZWQgaW4uIikpOworCQl9CisJfSBlbHNlIHsKKwkJY0VSUk9SKDEsCisJCSAgICAgICAoIiBJbnZhbGlkIFdvcmQgY291bnQgJWQ6ICIsCisJCQlzbWJfYnVmZmVyX3Jlc3BvbnNlLT5Xb3JkQ291bnQpKTsKKwkJcmMgPSAtRUlPOworCX0KKworCWlmIChzbWJfYnVmZmVyKQorCQljaWZzX2J1Zl9yZWxlYXNlKHNtYl9idWZmZXIpOworCisJcmV0dXJuIHJjOworfQorCitpbnQKK0NJRlNUQ29uKHVuc2lnbmVkIGludCB4aWQsIHN0cnVjdCBjaWZzU2VzSW5mbyAqc2VzLAorCSBjb25zdCBjaGFyICp0cmVlLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0Y29uLAorCSBjb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpCit7CisJc3RydWN0IHNtYl9oZHIgKnNtYl9idWZmZXI7CisJc3RydWN0IHNtYl9oZHIgKnNtYl9idWZmZXJfcmVzcG9uc2U7CisJVENPTlhfUkVRICpwU01COworCVRDT05YX1JTUCAqcFNNQnI7CisJdW5zaWduZWQgY2hhciAqYmNjX3B0cjsKKwlpbnQgcmMgPSAwOworCWludCBsZW5ndGg7CisJX191MTYgY291bnQ7CisKKwlpZiAoc2VzID09IE5VTEwpCisJCXJldHVybiAtRUlPOworCisJc21iX2J1ZmZlciA9IGNpZnNfYnVmX2dldCgpOworCWlmIChzbWJfYnVmZmVyID09IE5VTEwpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXNtYl9idWZmZXJfcmVzcG9uc2UgPSBzbWJfYnVmZmVyOworCisJaGVhZGVyX2Fzc2VtYmxlKHNtYl9idWZmZXIsIFNNQl9DT01fVFJFRV9DT05ORUNUX0FORFgsCisJCQlOVUxMIC8qbm8gdGlkICovICwgNCAvKndjdCAqLyApOworCXNtYl9idWZmZXItPlVpZCA9IHNlcy0+U3VpZDsKKwlwU01CID0gKFRDT05YX1JFUSAqKSBzbWJfYnVmZmVyOworCXBTTUJyID0gKFRDT05YX1JTUCAqKSBzbWJfYnVmZmVyX3Jlc3BvbnNlOworCisJcFNNQi0+QW5kWENvbW1hbmQgPSAweEZGOworCXBTTUItPkZsYWdzID0gY3B1X3RvX2xlMTYoVENPTl9FWFRFTkRFRF9TRUNJTkZPKTsKKwlwU01CLT5QYXNzd29yZExlbmd0aCA9IGNwdV90b19sZTE2KDEpOwkvKiBtaW5pbXVtICovCisJYmNjX3B0ciA9ICZwU01CLT5QYXNzd29yZFswXTsKKwliY2NfcHRyKys7CQkvKiBza2lwIHBhc3N3b3JkICovCisKKwlpZihzZXMtPnNlcnZlci0+c2VjTW9kZSAmIChTRUNNT0RFX1NJR05fUkVRVUlSRUQgfCBTRUNNT0RFX1NJR05fRU5BQkxFRCkpCisJCXNtYl9idWZmZXItPkZsYWdzMiB8PSBTTUJGTEcyX1NFQ1VSSVRZX1NJR05BVFVSRTsKKworCWlmIChzZXMtPmNhcGFiaWxpdGllcyAmIENBUF9TVEFUVVMzMikgeworCQlzbWJfYnVmZmVyLT5GbGFnczIgfD0gU01CRkxHMl9FUlJfU1RBVFVTOworCX0KKwlpZiAoc2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfREZTKSB7CisJCXNtYl9idWZmZXItPkZsYWdzMiB8PSBTTUJGTEcyX0RGUzsKKwl9CisJaWYgKHNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX1VOSUNPREUpIHsKKwkJc21iX2J1ZmZlci0+RmxhZ3MyIHw9IFNNQkZMRzJfVU5JQ09ERTsKKwkJbGVuZ3RoID0KKwkJICAgIGNpZnNfc3RydG9VQ1MoKHdjaGFyX3QgKikgYmNjX3B0ciwgdHJlZSwgMTAwLCBubHNfY29kZXBhZ2UpOworCQliY2NfcHRyICs9IDIgKiBsZW5ndGg7CS8qIGNvbnZlcnQgbnVtIG9mIDE2IGJpdCB3b3JkcyB0byBieXRlcyAqLworCQliY2NfcHRyICs9IDI7CS8qIHNraXAgdHJhaWxpbmcgbnVsbCAqLworCX0gZWxzZSB7CQkvKiBBU0NJSSAqLworCisJCXN0cmNweShiY2NfcHRyLCB0cmVlKTsKKwkJYmNjX3B0ciArPSBzdHJsZW4odHJlZSkgKyAxOworCX0KKwlzdHJjcHkoYmNjX3B0ciwgIj8/Pz8/Iik7CisJYmNjX3B0ciArPSBzdHJsZW4oIj8/Pz8/Iik7CisJYmNjX3B0ciArPSAxOworCWNvdW50ID0gYmNjX3B0ciAtICZwU01CLT5QYXNzd29yZFswXTsKKwlwU01CLT5oZHIuc21iX2J1Zl9sZW5ndGggKz0gY291bnQ7CisJcFNNQi0+Qnl0ZUNvdW50ID0gY3B1X3RvX2xlMTYoY291bnQpOworCisJcmMgPSBTZW5kUmVjZWl2ZSh4aWQsIHNlcywgc21iX2J1ZmZlciwgc21iX2J1ZmZlcl9yZXNwb25zZSwgJmxlbmd0aCwgMCk7CisKKwkvKiBpZiAocmMpIHJjID0gbWFwX3NtYl90b19saW51eF9lcnJvcihzbWJfYnVmZmVyX3Jlc3BvbnNlKTsgKi8KKwkvKiBhYm92ZSBub3cgZG9uZSBpbiBTZW5kUmVjZWl2ZSAqLworCWlmICgocmMgPT0gMCkgJiYgKHRjb24gIT0gTlVMTCkpIHsKKwkJdGNvbi0+dGlkU3RhdHVzID0gQ2lmc0dvb2Q7CisJCXRjb24tPnRpZCA9IHNtYl9idWZmZXJfcmVzcG9uc2UtPlRpZDsKKwkJYmNjX3B0ciA9IHBCeXRlQXJlYShzbWJfYnVmZmVyX3Jlc3BvbnNlKTsKKwkJbGVuZ3RoID0gc3RybmxlbihiY2NfcHRyLCBCQ0Moc21iX2J1ZmZlcl9yZXNwb25zZSkgLSAyKTsKKyAgICAgICAgLyogc2tpcCBzZXJ2aWNlIGZpZWxkIChOQjogdGhpcyBmaWVsZCBpcyBhbHdheXMgQVNDSUkpICovCisJCWJjY19wdHIgKz0gbGVuZ3RoICsgMTsJCisJCXN0cm5jcHkodGNvbi0+dHJlZU5hbWUsIHRyZWUsIE1BWF9UUkVFX1NJWkUpOworCQlpZiAoc21iX2J1ZmZlci0+RmxhZ3MyICYgU01CRkxHMl9VTklDT0RFKSB7CisJCQlsZW5ndGggPSBVbmlTdHJubGVuKCh3Y2hhcl90ICopIGJjY19wdHIsIDUxMik7CisJCQlpZiAoKGJjY19wdHIgKyAoMiAqIGxlbmd0aCkpIC0KKwkJCSAgICAgcEJ5dGVBcmVhKHNtYl9idWZmZXJfcmVzcG9uc2UpIDw9CisJCQkgICAgQkNDKHNtYl9idWZmZXJfcmVzcG9uc2UpKSB7CisJCQkJaWYodGNvbi0+bmF0aXZlRmlsZVN5c3RlbSkKKwkJCQkJa2ZyZWUodGNvbi0+bmF0aXZlRmlsZVN5c3RlbSk7CisJCQkJdGNvbi0+bmF0aXZlRmlsZVN5c3RlbSA9CisJCQkJICAgIGNpZnNfa2NhbGxvYyhsZW5ndGggKyAyLCBHRlBfS0VSTkVMKTsKKwkJCQljaWZzX3N0cmZyb21VQ1NfbGUodGNvbi0+bmF0aXZlRmlsZVN5c3RlbSwKKwkJCQkJCSAgICh3Y2hhcl90ICopIGJjY19wdHIsCisJCQkJCQkgICBsZW5ndGgsIG5sc19jb2RlcGFnZSk7CisJCQkJYmNjX3B0ciArPSAyICogbGVuZ3RoOworCQkJCWJjY19wdHJbMF0gPSAwOwkvKiBudWxsIHRlcm1pbmF0ZSB0aGUgc3RyaW5nICovCisJCQkJYmNjX3B0clsxXSA9IDA7CisJCQkJYmNjX3B0ciArPSAyOworCQkJfQorCQkJLyogZWxzZSBkbyBub3QgYm90aGVyIGNvcHlpbmcgdGhlc2UgaW5mb3JtYXRpb25hbCBmaWVsZHMgKi8KKwkJfSBlbHNlIHsKKwkJCWxlbmd0aCA9IHN0cm5sZW4oYmNjX3B0ciwgMTAyNCk7CisJCQlpZiAoKGJjY19wdHIgKyBsZW5ndGgpIC0KKwkJCSAgICBwQnl0ZUFyZWEoc21iX2J1ZmZlcl9yZXNwb25zZSkgPD0KKwkJCSAgICBCQ0Moc21iX2J1ZmZlcl9yZXNwb25zZSkpIHsKKwkJCQlpZih0Y29uLT5uYXRpdmVGaWxlU3lzdGVtKQorCQkJCQlrZnJlZSh0Y29uLT5uYXRpdmVGaWxlU3lzdGVtKTsKKwkJCQl0Y29uLT5uYXRpdmVGaWxlU3lzdGVtID0KKwkJCQkgICAgY2lmc19rY2FsbG9jKGxlbmd0aCArIDEsIEdGUF9LRVJORUwpOworCQkJCXN0cm5jcHkodGNvbi0+bmF0aXZlRmlsZVN5c3RlbSwgYmNjX3B0ciwKKwkJCQkJbGVuZ3RoKTsKKwkJCX0KKwkJCS8qIGVsc2UgZG8gbm90IGJvdGhlciBjb3B5aW5nIHRoZXNlIGluZm9ybWF0aW9uYWwgZmllbGRzICovCisJCX0KKwkJdGNvbi0+RmxhZ3MgPSBsZTE2X3RvX2NwdShwU01Cci0+T3B0aW9uYWxTdXBwb3J0KTsKKwkJY0ZZSSgxLCAoIlRjb24gZmxhZ3M6IDB4JXggIiwgdGNvbi0+RmxhZ3MpKTsKKwl9IGVsc2UgaWYgKChyYyA9PSAwKSAmJiB0Y29uID09IE5VTEwpIHsKKyAgICAgICAgLyogYWxsIHdlIG5lZWQgdG8gc2F2ZSBmb3IgSVBDJCBjb25uZWN0aW9uICovCisJCXNlcy0+aXBjX3RpZCA9IHNtYl9idWZmZXJfcmVzcG9uc2UtPlRpZDsKKwl9CisKKwlpZiAoc21iX2J1ZmZlcikKKwkJY2lmc19idWZfcmVsZWFzZShzbWJfYnVmZmVyKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludAorY2lmc191bW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYikKK3sKKwlpbnQgcmMgPSAwOworCWludCB4aWQ7CisJc3RydWN0IGNpZnNTZXNJbmZvICpzZXMgPSBOVUxMOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqY2lmc2RfdGFzazsKKworCXhpZCA9IEdldFhpZCgpOworCisJaWYgKGNpZnNfc2ItPnRjb24pIHsKKwkJc2VzID0gY2lmc19zYi0+dGNvbi0+c2VzOyAvKiBzYXZlIHB0ciB0byBzZXMgYmVmb3JlIGRlbGV0ZSB0Y29uISovCisJCXJjID0gQ0lGU1NNQlREaXMoeGlkLCBjaWZzX3NiLT50Y29uKTsKKwkJaWYgKHJjID09IC1FQlVTWSkgeworCQkJRnJlZVhpZCh4aWQpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJdGNvbkluZm9GcmVlKGNpZnNfc2ItPnRjb24pOworCQlpZiAoKHNlcykgJiYgKHNlcy0+c2VydmVyKSkgeworCQkJLyogc2F2ZSBvZmYgdGFzayBzbyB3ZSBkbyBub3QgcmVmZXIgdG8gc2VzIGxhdGVyICovCisJCQljaWZzZF90YXNrID0gc2VzLT5zZXJ2ZXItPnRzazsKKwkJCWNGWUkoMSwgKCJBYm91dCB0byBkbyBTTUJMb2dvZmYgIikpOworCQkJcmMgPSBDSUZTU01CTG9nb2ZmKHhpZCwgc2VzKTsKKwkJCWlmIChyYyA9PSAtRUJVU1kpIHsKKwkJCQlGcmVlWGlkKHhpZCk7CisJCQkJcmV0dXJuIDA7CisJCQl9IGVsc2UgaWYgKHJjID09IC1FU0hVVERPV04pIHsKKwkJCQljRllJKDEsKCJXYWtpbmcgdXAgc29ja2V0IGJ5IHNlbmRpbmcgaXQgc2lnbmFsIikpOworCQkJCWlmKGNpZnNkX3Rhc2spCisJCQkJCXNlbmRfc2lnKFNJR0tJTEwsY2lmc2RfdGFzaywxKTsKKwkJCQlyYyA9IDA7CisJCQl9IC8qIGVsc2UgLSB3ZSBoYXZlIGFuIHNtYiBzZXNzaW9uCisJCQkJbGVmdCBvbiB0aGlzIHNvY2tldCBkbyBub3Qga2lsbCBjaWZzZCAqLworCQl9IGVsc2UKKwkJCWNGWUkoMSwgKCJObyBzZXNzaW9uIG9yIGJhZCB0Y29uIikpOworCX0KKwkKKwljaWZzX3NiLT50Y29uID0gTlVMTDsKKwlpZiAoc2VzKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoSFogLyAyKTsKKwl9CisJaWYgKHNlcykKKwkJc2VzSW5mb0ZyZWUoc2VzKTsKKworCUZyZWVYaWQoeGlkKTsKKwlyZXR1cm4gcmM7CQkvKiBCQiBjaGVjayBpZiB3ZSBzaG91bGQgYWx3YXlzIHJldHVybiB6ZXJvIGhlcmUgKi8KK30gCisKK2ludCBjaWZzX3NldHVwX3Nlc3Npb24odW5zaWduZWQgaW50IHhpZCwgc3RydWN0IGNpZnNTZXNJbmZvICpwU2VzSW5mbywKKwkJCQkJICAgc3RydWN0IG5sc190YWJsZSAqIG5sc19pbmZvKQoreworCWludCByYyA9IDA7CisJY2hhciBudGxtX3Nlc3Npb25fa2V5W0NJRlNfU0VTU0lPTl9LRVlfU0laRV07CisJaW50IG50bG12Ml9mbGFnID0gRkFMU0U7CisKKwkvKiB3aGF0IGlmIHNlcnZlciBjaGFuZ2VzIGl0cyBidWZmZXIgc2l6ZSBhZnRlciBkcm9wcGluZyB0aGUgc2Vzc2lvbj8gKi8KKwlpZihwU2VzSW5mby0+c2VydmVyLT5tYXhCdWYgPT0gMCkgLyogbm8gbmVlZCB0byBzZW5kIG9uIHJlY29ubmVjdCAqLyB7CisJCXJjID0gQ0lGU1NNQk5lZ290aWF0ZSh4aWQsIHBTZXNJbmZvKTsKKwkJaWYocmMgPT0gLUVBR0FJTikgLyogcmV0cnkgb25seSBvbmNlIG9uIDFzdCB0aW1lIGNvbm5lY3Rpb24gKi8geworCQkJcmMgPSBDSUZTU01CTmVnb3RpYXRlKHhpZCwgcFNlc0luZm8pOworCQkJaWYocmMgPT0gLUVBR0FJTikgCisJCQkJcmMgPSAtRUhPU1RET1dOOworCQl9CisJCWlmKHJjID09IDApIHsKKwkJCXNwaW5fbG9jaygmR2xvYmFsTWlkX0xvY2spOworCQkJaWYocFNlc0luZm8tPnNlcnZlci0+dGNwU3RhdHVzICE9IENpZnNFeGl0aW5nKQorCQkJCXBTZXNJbmZvLT5zZXJ2ZXItPnRjcFN0YXR1cyA9IENpZnNHb29kOworCQkJZWxzZQorCQkJCXJjID0gLUVIT1NURE9XTjsKKwkJCXNwaW5fdW5sb2NrKCZHbG9iYWxNaWRfTG9jayk7CisKKwkJfQorCX0KKwlpZiAoIXJjKSB7CisJCXBTZXNJbmZvLT5jYXBhYmlsaXRpZXMgPSBwU2VzSW5mby0+c2VydmVyLT5jYXBhYmlsaXRpZXM7CisJCWlmKGxpbnV4RXh0RW5hYmxlZCA9PSAwKQorCQkJcFNlc0luZm8tPmNhcGFiaWxpdGllcyAmPSAofkNBUF9VTklYKTsKKwkJcFNlc0luZm8tPnNlcXVlbmNlX251bWJlciA9IDA7CisJCWNGWUkoMSwoIlNlY3VyaXR5IE1vZGU6IDB4JXggQ2FwYWJpbGl0aWVzOiAweCV4IFRpbWUgWm9uZTogJWQiLAorCQkJcFNlc0luZm8tPnNlcnZlci0+c2VjTW9kZSwKKwkJCXBTZXNJbmZvLT5zZXJ2ZXItPmNhcGFiaWxpdGllcywKKwkJCXBTZXNJbmZvLT5zZXJ2ZXItPnRpbWVab25lKSk7CisJCWlmIChleHRlbmRlZF9zZWN1cml0eQorCQkJCSYmIChwU2VzSW5mby0+Y2FwYWJpbGl0aWVzICYgQ0FQX0VYVEVOREVEX1NFQ1VSSVRZKQorCQkJCSYmIChwU2VzSW5mby0+c2VydmVyLT5zZWNUeXBlID09IE5UTE1TU1ApKSB7CisJCQljRllJKDEsICgiTmV3IHN0eWxlIHNlc3NzZXR1cCAiKSk7CisJCQlyYyA9IENJRlNTcG5lZ29TZXNzU2V0dXAoeGlkLCBwU2VzSW5mbywKKwkJCQlOVUxMIC8qIHNlY3VyaXR5IGJsb2IgKi8sIAorCQkJCTAgLyogYmxvYiBsZW5ndGggKi8sCisJCQkJbmxzX2luZm8pOworCQl9IGVsc2UgaWYgKGV4dGVuZGVkX3NlY3VyaXR5CisJCQkgICAmJiAocFNlc0luZm8tPmNhcGFiaWxpdGllcyAmIENBUF9FWFRFTkRFRF9TRUNVUklUWSkKKwkJCSAgICYmIChwU2VzSW5mby0+c2VydmVyLT5zZWNUeXBlID09IFJhd05UTE1TU1ApKSB7CisJCQljRllJKDEsICgiTlRMTVNTUCBzZXNzc2V0dXAgIikpOworCQkJcmMgPSBDSUZTTlRMTVNTUE5lZ290aWF0ZVNlc3NTZXR1cCh4aWQsCisJCQkJCQlwU2VzSW5mbywKKwkJCQkJCSZudGxtdjJfZmxhZywKKwkJCQkJCW5sc19pbmZvKTsKKwkJCWlmICghcmMpIHsKKwkJCQlpZihudGxtdjJfZmxhZykgeworCQkJCQljaGFyICogdjJfcmVzcG9uc2U7CisJCQkJCWNGWUkoMSwoIkNhbiB1c2UgbW9yZSBzZWN1cmUgTlRMTSB2ZXJzaW9uIDIgcGFzc3dvcmQgaGFzaCIpKTsKKwkJCQkJaWYoQ2FsY05UTE12Ml9wYXJ0aWFsX21hY19rZXkocFNlc0luZm8sIAorCQkJCQkJbmxzX2luZm8pKSB7CisJCQkJCQlyYyA9IC1FTk9NRU07CisJCQkJCQlnb3RvIHNzX2Vycl9leGl0OworCQkJCQl9IGVsc2UKKwkJCQkJCXYyX3Jlc3BvbnNlID0ga21hbGxvYygxNiArIDY0IC8qIGJsb2IgKi8sIEdGUF9LRVJORUwpOworCQkJCQlpZih2Ml9yZXNwb25zZSkgeworCQkJCQkJQ2FsY05UTE12Ml9yZXNwb25zZShwU2VzSW5mbyx2Ml9yZXNwb25zZSk7CisvKgkJCQkJCWNpZnNfY2FsY3VsYXRlX250bG12Ml9tYWNfa2V5KHBTZXNJbmZvLT5tYWNfc2lnbmluZ19rZXksIHJlc3BvbnNlLCBudGxtX3Nlc3Npb25fa2V5LCAqLworCQkJCQkJa2ZyZWUodjJfcmVzcG9uc2UpOworCQkJCQkvKiBCQiBQdXQgZHVtbXkgc2lnIGluIFNlc3NTZXR1cCBQRFU/ICovCisJCQkJCX0gZWxzZSB7CisJCQkJCQlyYyA9IC1FTk9NRU07CisJCQkJCQlnb3RvIHNzX2Vycl9leGl0OworCQkJCQl9CisKKwkJCQl9IGVsc2UgeworCQkJCQlTTUJOVGVuY3J5cHQocFNlc0luZm8tPnBhc3N3b3JkLAorCQkJCQkJcFNlc0luZm8tPnNlcnZlci0+Y3J5cHRLZXksCisJCQkJCQludGxtX3Nlc3Npb25fa2V5KTsKKworCQkJCQljaWZzX2NhbGN1bGF0ZV9tYWNfa2V5KHBTZXNJbmZvLT5tYWNfc2lnbmluZ19rZXksCisJCQkJCQludGxtX3Nlc3Npb25fa2V5LAorCQkJCQkJcFNlc0luZm8tPnBhc3N3b3JkKTsKKwkJCQl9CisJCQkvKiBmb3IgYmV0dGVyIHNlY3VyaXR5IHRoZSB3ZWFrZXIgbGFubWFuIGhhc2ggbm90IHNlbnQKKwkJCSAgIGluIEF1dGhTZXNzU2V0dXAgc28gd2Ugbm8gbG9uZ2VyIGNhbGN1bGF0ZSBpdCAqLworCisJCQkJcmMgPSBDSUZTTlRMTVNTUEF1dGhTZXNzU2V0dXAoeGlkLAorCQkJCQlwU2VzSW5mbywKKwkJCQkJbnRsbV9zZXNzaW9uX2tleSwKKwkJCQkJbnRsbXYyX2ZsYWcsCisJCQkJCW5sc19pbmZvKTsKKwkJCX0KKwkJfSBlbHNlIHsgLyogb2xkIHN0eWxlIE5UTE0gMC4xMiBzZXNzaW9uIHNldHVwICovCisJCQlTTUJOVGVuY3J5cHQocFNlc0luZm8tPnBhc3N3b3JkLAorCQkJCXBTZXNJbmZvLT5zZXJ2ZXItPmNyeXB0S2V5LAorCQkJCW50bG1fc2Vzc2lvbl9rZXkpOworCisJCQljaWZzX2NhbGN1bGF0ZV9tYWNfa2V5KHBTZXNJbmZvLT5tYWNfc2lnbmluZ19rZXksIAorCQkJCW50bG1fc2Vzc2lvbl9rZXksIHBTZXNJbmZvLT5wYXNzd29yZCk7CisJCQlyYyA9IENJRlNTZXNzU2V0dXAoeGlkLCBwU2VzSW5mbywKKwkJCQludGxtX3Nlc3Npb25fa2V5LCBubHNfaW5mbyk7CisJCX0KKwkJaWYgKHJjKSB7CisJCQljRVJST1IoMSwoIlNlbmQgZXJyb3IgaW4gU2Vzc1NldHVwID0gJWQiLHJjKSk7CisJCX0gZWxzZSB7CisJCQljRllJKDEsKCJDSUZTIFNlc3Npb24gRXN0YWJsaXNoZWQgc3VjY2Vzc2Z1bGx5IikpOworCQkJcFNlc0luZm8tPnN0YXR1cyA9IENpZnNHb29kOworCQl9CisJfQorc3NfZXJyX2V4aXQ6CisJcmV0dXJuIHJjOworfQorCmRpZmYgLS1naXQgYS9mcy9jaWZzL2Rpci5jIGIvZnMvY2lmcy9kaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTRlMTg2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9kaXIuYwpAQCAtMCwwICsxLDUyMyBAQAorLyoKKyAqICAgZnMvY2lmcy9kaXIuYworICoKKyAqICAgdmZzIG9wZXJhdGlvbnMgdGhhdCBkZWFsIHdpdGggZGVudHJpZXMKKyAqIAorICogICBDb3B5cmlnaHQgKEMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgIENvcnAuLCAyMDAyLDIwMDMKKyAqICAgQXV0aG9yKHMpOiBTdGV2ZSBGcmVuY2ggKHNmcmVuY2hAdXMuaWJtLmNvbSkKKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSAiY2lmc2ZzLmgiCisjaW5jbHVkZSAiY2lmc3BkdS5oIgorI2luY2x1ZGUgImNpZnNnbG9iLmgiCisjaW5jbHVkZSAiY2lmc3Byb3RvLmgiCisjaW5jbHVkZSAiY2lmc19kZWJ1Zy5oIgorI2luY2x1ZGUgImNpZnNfZnNfc2IuaCIKKwordm9pZAorcmVuZXdfcGFyZW50YWxfdGltZXN0YW1wcyhzdHJ1Y3QgZGVudHJ5ICpkaXJlbnRyeSkKK3sKKwkvKiBCQiBjaGVjayBpZiB0aGVyZSBpcyBhIHdheSB0byBnZXQgdGhlIGtlcm5lbCB0byBkbyB0aGlzIG9yIGlmIHdlIHJlYWxseSBuZWVkIHRoaXMgKi8KKwlkbyB7CisJCWRpcmVudHJ5LT5kX3RpbWUgPSBqaWZmaWVzOworCQlkaXJlbnRyeSA9IGRpcmVudHJ5LT5kX3BhcmVudDsKKwl9IHdoaWxlICghSVNfUk9PVChkaXJlbnRyeSkpOwkKK30KKworLyogTm90ZTogY2FsbGVyIG11c3QgZnJlZSByZXR1cm4gYnVmZmVyICovCitjaGFyICoKK2J1aWxkX3BhdGhfZnJvbV9kZW50cnkoc3RydWN0IGRlbnRyeSAqZGlyZW50cnkpCit7CisJc3RydWN0IGRlbnRyeSAqdGVtcDsKKwlpbnQgbmFtZWxlbiA9IDA7CisJY2hhciAqZnVsbF9wYXRoOworCisJaWYoZGlyZW50cnkgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7ICAvKiBub3QgbXVjaCB3ZSBjYW4gZG8gaWYgZGVudHJ5IGlzIGZyZWVkIGFuZAorCQl3ZSBuZWVkIHRvIHJlb3BlbiB0aGUgZmlsZSBhZnRlciBpdCB3YXMgY2xvc2VkIGltcGxpY2l0bHkKKwkJd2hlbiB0aGUgc2VydmVyIGNyYXNoZWQgKi8KKworY2lmc19icF9yZW5hbWVfcmV0cnk6CisJZm9yICh0ZW1wID0gZGlyZW50cnk7ICFJU19ST09UKHRlbXApOykgeworCQluYW1lbGVuICs9ICgxICsgdGVtcC0+ZF9uYW1lLmxlbik7CisJCXRlbXAgPSB0ZW1wLT5kX3BhcmVudDsKKwkJaWYodGVtcCA9PSBOVUxMKSB7CisJCQljRVJST1IoMSwoImNvcnJ1cHQgZGVudHJ5IikpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisKKwlmdWxsX3BhdGggPSBrbWFsbG9jKG5hbWVsZW4rMSwgR0ZQX0tFUk5FTCk7CisJaWYoZnVsbF9wYXRoID09IE5VTEwpCisJCXJldHVybiBmdWxsX3BhdGg7CisJZnVsbF9wYXRoW25hbWVsZW5dID0gMDsJLyogdHJhaWxpbmcgbnVsbCAqLworCisJZm9yICh0ZW1wID0gZGlyZW50cnk7ICFJU19ST09UKHRlbXApOykgeworCQluYW1lbGVuIC09IDEgKyB0ZW1wLT5kX25hbWUubGVuOworCQlpZiAobmFtZWxlbiA8IDApIHsKKwkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJZnVsbF9wYXRoW25hbWVsZW5dID0gJ1xcJzsKKwkJCXN0cm5jcHkoZnVsbF9wYXRoICsgbmFtZWxlbiArIDEsIHRlbXAtPmRfbmFtZS5uYW1lLAorCQkJCXRlbXAtPmRfbmFtZS5sZW4pOworCQkJY0ZZSSgwLCAoIiBuYW1lOiAlcyAiLCBmdWxsX3BhdGggKyBuYW1lbGVuKSk7CisJCX0KKwkJdGVtcCA9IHRlbXAtPmRfcGFyZW50OworCQlpZih0ZW1wID09IE5VTEwpIHsKKwkJCWNFUlJPUigxLCgiY29ycnVwdCBkZW50cnkiKSk7CisJCQlrZnJlZShmdWxsX3BhdGgpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisJaWYgKG5hbWVsZW4gIT0gMCkgeworCQljRVJST1IoMSwKKwkJICAgICAgICgiV2UgZGlkIG5vdCBlbmQgcGF0aCBsb29rdXAgd2hlcmUgd2UgZXhwZWN0ZWQgbmFtZWxlbiBpcyAlZCIsCisJCQluYW1lbGVuKSk7CisJCS8qIHByZXN1bWFibHkgdGhpcyBpcyBvbmx5IHBvc3NpYmxlIGlmIHdlIHdlcmUgcmFjaW5nIHdpdGggYSByZW5hbWUgCisJCW9mIG9uZSBvZiB0aGUgcGFyZW50IGRpcmVjdG9yaWVzICAod2UgY2FuIG5vdCBsb2NrIHRoZSBkZW50cmllcworCQlhYm92ZSB1cyB0byBwcmV2ZW50IHRoaXMsIGJ1dCByZXRyeWluZyBzaG91bGQgYmUgaGFybWxlc3MpICovCisJCWtmcmVlKGZ1bGxfcGF0aCk7CisJCW5hbWVsZW4gPSAwOworCQlnb3RvIGNpZnNfYnBfcmVuYW1lX3JldHJ5OworCX0KKworCXJldHVybiBmdWxsX3BhdGg7Cit9CisKKy8qIE5vdGU6IGNhbGxlciBtdXN0IGZyZWUgcmV0dXJuIGJ1ZmZlciAqLworY2hhciAqCitidWlsZF93aWxkY2FyZF9wYXRoX2Zyb21fZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRpcmVudHJ5KQoreworCXN0cnVjdCBkZW50cnkgKnRlbXA7CisJaW50IG5hbWVsZW4gPSAwOworCWNoYXIgKmZ1bGxfcGF0aDsKKworCWlmKGRpcmVudHJ5ID09IE5VTEwpCisJCXJldHVybiBOVUxMOyAgLyogbm90IG11Y2ggd2UgY2FuIGRvIGlmIGRlbnRyeSBpcyBmcmVlZCBhbmQKKwkJd2UgbmVlZCB0byByZW9wZW4gdGhlIGZpbGUgYWZ0ZXIgaXQgd2FzIGNsb3NlZCBpbXBsaWNpdGx5CisJCXdoZW4gdGhlIHNlcnZlciBjcmFzaGVkICovCisKK2NpZnNfYndwX3JlbmFtZV9yZXRyeToKKwlmb3IgKHRlbXAgPSBkaXJlbnRyeTsgIUlTX1JPT1QodGVtcCk7KSB7CisJCW5hbWVsZW4gKz0gKDEgKyB0ZW1wLT5kX25hbWUubGVuKTsKKwkJdGVtcCA9IHRlbXAtPmRfcGFyZW50OworCQlpZih0ZW1wID09IE5VTEwpIHsKKwkJCWNFUlJPUigxLCgiY29ycnVwdCBkZW50cnkiKSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCWZ1bGxfcGF0aCA9IGttYWxsb2MobmFtZWxlbiszLCBHRlBfS0VSTkVMKTsKKwlpZihmdWxsX3BhdGggPT0gTlVMTCkKKwkJcmV0dXJuIGZ1bGxfcGF0aDsKKworCWZ1bGxfcGF0aFtuYW1lbGVuXSA9ICdcXCc7CisJZnVsbF9wYXRoW25hbWVsZW4rMV0gPSAnKic7CisJZnVsbF9wYXRoW25hbWVsZW4rMl0gPSAwOyAgLyogdHJhaWxpbmcgbnVsbCAqLworCisJZm9yICh0ZW1wID0gZGlyZW50cnk7ICFJU19ST09UKHRlbXApOykgeworCQluYW1lbGVuIC09IDEgKyB0ZW1wLT5kX25hbWUubGVuOworCQlpZiAobmFtZWxlbiA8IDApIHsKKwkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJZnVsbF9wYXRoW25hbWVsZW5dID0gJ1xcJzsKKwkJCXN0cm5jcHkoZnVsbF9wYXRoICsgbmFtZWxlbiArIDEsIHRlbXAtPmRfbmFtZS5uYW1lLAorCQkJCXRlbXAtPmRfbmFtZS5sZW4pOworCQkJY0ZZSSgwLCAoIiBuYW1lOiAlcyAiLCBmdWxsX3BhdGggKyBuYW1lbGVuKSk7CisJCX0KKwkJdGVtcCA9IHRlbXAtPmRfcGFyZW50OworCQlpZih0ZW1wID09IE5VTEwpIHsKKwkJCWNFUlJPUigxLCgiY29ycnVwdCBkZW50cnkiKSk7CisJCQlrZnJlZShmdWxsX3BhdGgpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisJaWYgKG5hbWVsZW4gIT0gMCkgeworCQljRVJST1IoMSwKKwkJICAgICAgICgiV2UgZGlkIG5vdCBlbmQgcGF0aCBsb29rdXAgd2hlcmUgd2UgZXhwZWN0ZWQgbmFtZWxlbiBpcyAlZCIsCisJCQluYW1lbGVuKSk7CisJCS8qIHByZXN1bWFibHkgdGhpcyBpcyBvbmx5IHBvc3NpYmxlIGlmIHdlIHdlcmUgcmFjaW5nIHdpdGggYSByZW5hbWUgCisJCW9mIG9uZSBvZiB0aGUgcGFyZW50IGRpcmVjdG9yaWVzICAod2UgY2FuIG5vdCBsb2NrIHRoZSBkZW50cmllcworCQlhYm92ZSB1cyB0byBwcmV2ZW50IHRoaXMsIGJ1dCByZXRyeWluZyBzaG91bGQgYmUgaGFybWxlc3MpICovCisJCWtmcmVlKGZ1bGxfcGF0aCk7CisJCW5hbWVsZW4gPSAwOworCQlnb3RvIGNpZnNfYndwX3JlbmFtZV9yZXRyeTsKKwl9CisKKwlyZXR1cm4gZnVsbF9wYXRoOworfQorCisvKiBJbm9kZSBvcGVyYXRpb25zIGluIHNpbWlsYXIgb3JkZXIgdG8gaG93IHRoZXkgYXBwZWFyIGluIHRoZSBMaW51eCBmaWxlIGZzLmggKi8KKworaW50CitjaWZzX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICpkaXJlbnRyeSwgaW50IG1vZGUsCisJCXN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWludCByYyA9IC1FTk9FTlQ7CisJaW50IHhpZDsKKwlpbnQgb3Bsb2NrID0gMDsKKwlpbnQgZGVzaXJlZEFjY2VzcyA9IEdFTkVSSUNfUkVBRCB8IEdFTkVSSUNfV1JJVEU7CisJX191MTYgZmlsZUhhbmRsZTsKKwlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiOworCXN0cnVjdCBjaWZzVGNvbkluZm8gKnBUY29uOworCWNoYXIgKmZ1bGxfcGF0aCA9IE5VTEw7CisJRklMRV9BTExfSU5GTyAqIGJ1ZiA9IE5VTEw7CisJc3RydWN0IGlub2RlICpuZXdpbm9kZSA9IE5VTEw7CisJc3RydWN0IGNpZnNGaWxlSW5mbyAqIHBDaWZzRmlsZSA9IE5VTEw7CisJc3RydWN0IGNpZnNJbm9kZUluZm8gKiBwQ2lmc0lub2RlOworCWludCBkaXNwb3NpdGlvbiA9IEZJTEVfT1ZFUldSSVRFX0lGOworCWludCB3cml0ZV9vbmx5ID0gRkFMU0U7CisKKwl4aWQgPSBHZXRYaWQoKTsKKworCWNpZnNfc2IgPSBDSUZTX1NCKGlub2RlLT5pX3NiKTsKKwlwVGNvbiA9IGNpZnNfc2ItPnRjb247CisKKwlkb3duKCZkaXJlbnRyeS0+ZF9zYi0+c192ZnNfcmVuYW1lX3NlbSk7CisJZnVsbF9wYXRoID0gYnVpbGRfcGF0aF9mcm9tX2RlbnRyeShkaXJlbnRyeSk7CisJdXAoJmRpcmVudHJ5LT5kX3NiLT5zX3Zmc19yZW5hbWVfc2VtKTsKKwlpZihmdWxsX3BhdGggPT0gTlVMTCkgeworCQlGcmVlWGlkKHhpZCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmKG5kKSB7CisJCWlmICgobmQtPmludGVudC5vcGVuLmZsYWdzICYgT19BQ0NNT0RFKSA9PSBPX1JET05MWSkKKwkJCWRlc2lyZWRBY2Nlc3MgPSBHRU5FUklDX1JFQUQ7CisJCWVsc2UgaWYgKChuZC0+aW50ZW50Lm9wZW4uZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fV1JPTkxZKSB7CisJCQlkZXNpcmVkQWNjZXNzID0gR0VORVJJQ19XUklURTsKKwkJCXdyaXRlX29ubHkgPSBUUlVFOworCQl9IGVsc2UgaWYgKChuZC0+aW50ZW50Lm9wZW4uZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fUkRXUikgeworCQkJLyogR0VORVJJQ19BTEwgaXMgdG9vIG11Y2ggcGVybWlzc2lvbiB0byByZXF1ZXN0ICovCisJCQkvKiBjYW4gY2F1c2UgdW5uZWNlc3NhcnkgYWNjZXNzIGRlbmllZCBvbiBjcmVhdGUgKi8KKwkJCS8qIGRlc2lyZWRBY2Nlc3MgPSBHRU5FUklDX0FMTDsgKi8KKwkJCWRlc2lyZWRBY2Nlc3MgPSBHRU5FUklDX1JFQUQgfCBHRU5FUklDX1dSSVRFOworCQl9CisKKwkJaWYoKG5kLT5pbnRlbnQub3Blbi5mbGFncyAmIChPX0NSRUFUIHwgT19FWENMKSkgPT0gKE9fQ1JFQVQgfCBPX0VYQ0wpKQorCQkJZGlzcG9zaXRpb24gPSBGSUxFX0NSRUFURTsKKwkJZWxzZSBpZigobmQtPmludGVudC5vcGVuLmZsYWdzICYgKE9fQ1JFQVQgfCBPX1RSVU5DKSkgPT0gKE9fQ1JFQVQgfCBPX1RSVU5DKSkKKwkJCWRpc3Bvc2l0aW9uID0gRklMRV9PVkVSV1JJVEVfSUY7CisJCWVsc2UgaWYoKG5kLT5pbnRlbnQub3Blbi5mbGFncyAmIE9fQ1JFQVQpID09IE9fQ1JFQVQpCisJCQlkaXNwb3NpdGlvbiA9IEZJTEVfT1BFTl9JRjsKKwkJZWxzZSB7CisJCQljRllJKDEsKCJDcmVhdGUgZmxhZyBub3Qgc2V0IGluIGNyZWF0ZSBmdW5jdGlvbiIpKTsKKwkJfQorCX0KKworCS8qIEJCIGFkZCBwcm9jZXNzaW5nIHRvIHNldCBlcXVpdmFsZW50IG9mIG1vZGUgLSBlLmcuIHZpYSBDcmVhdGVYIHdpdGggQUNMcyAqLworCWlmIChvcGxvY2tFbmFibGVkKQorCQlvcGxvY2sgPSBSRVFfT1BMT0NLOworCisJYnVmID0ga21hbGxvYyhzaXplb2YoRklMRV9BTExfSU5GTyksR0ZQX0tFUk5FTCk7CisJaWYoYnVmID09IE5VTEwpIHsKKwkJa2ZyZWUoZnVsbF9wYXRoKTsKKwkJRnJlZVhpZCh4aWQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyYyA9IENJRlNTTUJPcGVuKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwgZGlzcG9zaXRpb24sCisJCQkgZGVzaXJlZEFjY2VzcywgQ1JFQVRFX05PVF9ESVIsCisJCQkgJmZpbGVIYW5kbGUsICZvcGxvY2ssIGJ1ZiwgY2lmc19zYi0+bG9jYWxfbmxzKTsKKwlpZiAocmMpIHsKKwkJY0ZZSSgxLCAoImNpZnNfY3JlYXRlIHJldHVybmVkIDB4JXggIiwgcmMpKTsKKwl9IGVsc2UgeworCQkvKiBJZiBPcGVuIHJlcG9ydGVkIHRoYXQgd2UgYWN0dWFsbHkgY3JlYXRlZCBhIGZpbGUKKwkJdGhlbiB3ZSBub3cgaGF2ZSB0byBzZXQgdGhlIG1vZGUgaWYgcG9zc2libGUgKi8KKwkJaWYgKChjaWZzX3NiLT50Y29uLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9VTklYKSAmJgorCQkJKG9wbG9jayAmIENJRlNfQ1JFQVRFX0FDVElPTikpCisJCQlpZihjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfU0VUX1VJRCkgeworCQkJCUNJRlNTTUJVbml4U2V0UGVybXMoeGlkLCBwVGNvbiwgZnVsbF9wYXRoLCBtb2RlLAorCQkJCQkoX191NjQpY3VycmVudC0+ZXVpZCwKKwkJCQkJKF9fdTY0KWN1cnJlbnQtPmVnaWQsCisJCQkJCTAgLyogZGV2ICovLAorCQkJCQljaWZzX3NiLT5sb2NhbF9ubHMpOworCQkJfSBlbHNlIHsKKwkJCQlDSUZTU01CVW5peFNldFBlcm1zKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwgbW9kZSwKKwkJCQkJKF9fdTY0KS0xLAorCQkJCQkoX191NjQpLTEsCisJCQkJCTAgLyogZGV2ICovLAorCQkJCQljaWZzX3NiLT5sb2NhbF9ubHMpOworCQkJfQorCQllbHNlIHsKKwkJCS8qIEJCIGltcGxlbWVudCB2aWEgV2luZG93cyBzZWN1cml0eSBkZXNjcmlwdG9ycyAqLworCQkJLyogZWcgQ0lGU1NNQldpblNldFBlcm1zKHhpZCxwVGNvbixmdWxsX3BhdGgsbW9kZSwtMSwtMSxsb2NhbF9ubHMpOyovCisJCQkvKiBjb3VsZCBzZXQgci9vIGRvcyBhdHRyaWJ1dGUgaWYgbW9kZSAmIDAyMjIgPT0gMCAqLworCQl9CisKKwkvKiBCQiBzZXJ2ZXIgbWlnaHQgbWFzayBtb2RlIHNvIHdlIGhhdmUgdG8gcXVlcnkgZm9yIFVuaXggY2FzZSovCisJCWlmIChwVGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkKKwkJCXJjID0gY2lmc19nZXRfaW5vZGVfaW5mb191bml4KCZuZXdpbm9kZSwgZnVsbF9wYXRoLAorCQkJCQkJIGlub2RlLT5pX3NiLHhpZCk7CisJCWVsc2UgeworCQkJcmMgPSBjaWZzX2dldF9pbm9kZV9pbmZvKCZuZXdpbm9kZSwgZnVsbF9wYXRoLAorCQkJCQkJIGJ1ZiwgaW5vZGUtPmlfc2IseGlkKTsKKwkJCWlmKG5ld2lub2RlKQorCQkJCW5ld2lub2RlLT5pX21vZGUgPSBtb2RlOworCQl9CisKKwkJaWYgKHJjICE9IDApIHsKKwkJCWNGWUkoMSwoIkNyZWF0ZSB3b3JrZWQgYnV0IGdldF9pbm9kZV9pbmZvIGZhaWxlZCB3aXRoIHJjID0gJWQiLAorCQkJICAgICAgcmMpKTsKKwkJfSBlbHNlIHsKKwkJCWRpcmVudHJ5LT5kX29wID0gJmNpZnNfZGVudHJ5X29wczsKKwkJCWRfaW5zdGFudGlhdGUoZGlyZW50cnksIG5ld2lub2RlKTsKKwkJfQorCQlpZigobmQtPmZsYWdzICYgTE9PS1VQX09QRU4pID09IEZBTFNFKSB7CisJCQkvKiBta25vZCBjYXNlIC0gZG8gbm90IGxlYXZlIGZpbGUgb3BlbiAqLworCQkJQ0lGU1NNQkNsb3NlKHhpZCwgcFRjb24sIGZpbGVIYW5kbGUpOworCQl9IGVsc2UgaWYobmV3aW5vZGUpIHsKKwkJCXBDaWZzRmlsZSA9IChzdHJ1Y3QgY2lmc0ZpbGVJbmZvICopCisJCQkgICBrbWFsbG9jKHNpemVvZiAoc3RydWN0IGNpZnNGaWxlSW5mbyksIEdGUF9LRVJORUwpOworCQkKKwkJCWlmIChwQ2lmc0ZpbGUpIHsKKwkJCQltZW1zZXQoKGNoYXIgKilwQ2lmc0ZpbGUsIDAsCisJCQkJICAgICAgIHNpemVvZiAoc3RydWN0IGNpZnNGaWxlSW5mbykpOworCQkJCXBDaWZzRmlsZS0+bmV0ZmlkID0gZmlsZUhhbmRsZTsKKwkJCQlwQ2lmc0ZpbGUtPnBpZCA9IGN1cnJlbnQtPnRnaWQ7CisJCQkJcENpZnNGaWxlLT5wSW5vZGUgPSBuZXdpbm9kZTsKKwkJCQlwQ2lmc0ZpbGUtPmludmFsaWRIYW5kbGUgPSBGQUxTRTsKKwkJCQlwQ2lmc0ZpbGUtPmNsb3NlUGVuZCAgICAgPSBGQUxTRTsKKwkJCQlpbml0X01VVEVYKCZwQ2lmc0ZpbGUtPmZoX3NlbSk7CisJCQkJLyogcHV0IHRoZSBmb2xsb3dpbmcgaW4gYXQgb3BlbiBub3cgKi8KKwkJCQkvKiBwQ2lmc0ZpbGUtPnBmaWxlID0gZmlsZTsgKi8gCisJCQkJd3JpdGVfbG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisJCQkJbGlzdF9hZGQoJnBDaWZzRmlsZS0+dGxpc3QsJnBUY29uLT5vcGVuRmlsZUxpc3QpOworCQkJCXBDaWZzSW5vZGUgPSBDSUZTX0kobmV3aW5vZGUpOworCQkJCWlmKHBDaWZzSW5vZGUpIHsKKwkJCQkvKiBpZiByZWFkYWJsZSBmaWxlIGluc3RhbmNlIHB1dCBmaXJzdCBpbiBsaXN0Ki8KKwkJCQkJaWYgKHdyaXRlX29ubHkgPT0gVFJVRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlsaXN0X2FkZF90YWlsKCZwQ2lmc0ZpbGUtPmZsaXN0LAorCQkJCQkJCSZwQ2lmc0lub2RlLT5vcGVuRmlsZUxpc3QpOworCQkJCQl9IGVsc2UgeworCQkJCQkJbGlzdF9hZGQoJnBDaWZzRmlsZS0+Zmxpc3QsCisJCQkJCQkJJnBDaWZzSW5vZGUtPm9wZW5GaWxlTGlzdCk7CisJCQkJCX0KKwkJCQkJaWYoKG9wbG9jayAmIDB4RikgPT0gT1BMT0NLX0VYQ0xVU0lWRSkgeworCQkJCQkJcENpZnNJbm9kZS0+Y2xpZW50Q2FuQ2FjaGVBbGwgPSBUUlVFOworCQkJCQkJcENpZnNJbm9kZS0+Y2xpZW50Q2FuQ2FjaGVSZWFkID0gVFJVRTsKKwkJCQkJCWNGWUkoMSwoIkV4Y2x1c2l2ZSBPcGxvY2sgZ3JhbnRlZCBvbiBpbm9kZSAlcCIsCisJCQkJCQkJbmV3aW5vZGUpKTsKKwkJCQkJfSBlbHNlIGlmKChvcGxvY2sgJiAweEYpID09IE9QTE9DS19SRUFEKQorCQkJCQkJcENpZnNJbm9kZS0+Y2xpZW50Q2FuQ2FjaGVSZWFkID0gVFJVRTsKKwkJCQl9CisJCQkJd3JpdGVfdW5sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKwkJCX0KKwkJfQorCX0gCisKKwlpZiAoYnVmKQorCSAgICBrZnJlZShidWYpOworCWlmIChmdWxsX3BhdGgpCisJICAgIGtmcmVlKGZ1bGxfcGF0aCk7CisJRnJlZVhpZCh4aWQpOworCisJcmV0dXJuIHJjOworfQorCitpbnQgY2lmc19ta25vZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICpkaXJlbnRyeSwgaW50IG1vZGUsIGRldl90IGRldmljZV9udW1iZXIpIAoreworCWludCByYyA9IC1FUEVSTTsKKwlpbnQgeGlkOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisJc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb247CisJY2hhciAqZnVsbF9wYXRoID0gTlVMTDsKKwlzdHJ1Y3QgaW5vZGUgKiBuZXdpbm9kZSA9IE5VTEw7CisKKwlpZiAoIW9sZF92YWxpZF9kZXYoZGV2aWNlX251bWJlcikpCisJCXJldHVybiAtRUlOVkFMOworCisJeGlkID0gR2V0WGlkKCk7CisKKwljaWZzX3NiID0gQ0lGU19TQihpbm9kZS0+aV9zYik7CisJcFRjb24gPSBjaWZzX3NiLT50Y29uOworCisJZG93bigmZGlyZW50cnktPmRfc2ItPnNfdmZzX3JlbmFtZV9zZW0pOworCWZ1bGxfcGF0aCA9IGJ1aWxkX3BhdGhfZnJvbV9kZW50cnkoZGlyZW50cnkpOworCXVwKCZkaXJlbnRyeS0+ZF9zYi0+c192ZnNfcmVuYW1lX3NlbSk7CisJaWYoZnVsbF9wYXRoID09IE5VTEwpCisJCXJjID0gLUVOT01FTTsKKwkKKwlpZiAoZnVsbF9wYXRoICYmIChwVGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkpIHsKKwkJaWYoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX1NFVF9VSUQpIHsKKwkJCXJjID0gQ0lGU1NNQlVuaXhTZXRQZXJtcyh4aWQsIHBUY29uLCBmdWxsX3BhdGgsCisJCQkJbW9kZSwoX191NjQpY3VycmVudC0+ZXVpZCwoX191NjQpY3VycmVudC0+ZWdpZCwKKwkJCQlkZXZpY2VfbnVtYmVyLCBjaWZzX3NiLT5sb2NhbF9ubHMpOworCQl9IGVsc2UgeworCQkJcmMgPSBDSUZTU01CVW5peFNldFBlcm1zKHhpZCwgcFRjb24sCisJCQkJZnVsbF9wYXRoLCBtb2RlLCAoX191NjQpLTEsIChfX3U2NCktMSwKKwkJCQlkZXZpY2VfbnVtYmVyLCBjaWZzX3NiLT5sb2NhbF9ubHMpOworCQl9CisKKwkJaWYoIXJjKSB7CisJCQlyYyA9IGNpZnNfZ2V0X2lub2RlX2luZm9fdW5peCgmbmV3aW5vZGUsIGZ1bGxfcGF0aCwKKwkJCQkJCWlub2RlLT5pX3NiLHhpZCk7CisJCQlkaXJlbnRyeS0+ZF9vcCA9ICZjaWZzX2RlbnRyeV9vcHM7CisJCQlpZihyYyA9PSAwKQorCQkJCWRfaW5zdGFudGlhdGUoZGlyZW50cnksIG5ld2lub2RlKTsKKwkJfQorCX0KKworCWlmIChmdWxsX3BhdGgpCisJCWtmcmVlKGZ1bGxfcGF0aCk7CisJRnJlZVhpZCh4aWQpOworCisJcmV0dXJuIHJjOworfQorCisKK3N0cnVjdCBkZW50cnkgKgorY2lmc19sb29rdXAoc3RydWN0IGlub2RlICpwYXJlbnRfZGlyX2lub2RlLCBzdHJ1Y3QgZGVudHJ5ICpkaXJlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaW50IHhpZDsKKwlpbnQgcmMgPSAwOyAvKiB0byBnZXQgYXJvdW5kIHNwdXJpb3VzIGdjYyB3YXJuaW5nLCBzZXQgdG8gemVybyBoZXJlICovCisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYjsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKwlzdHJ1Y3QgaW5vZGUgKm5ld0lub2RlID0gTlVMTDsKKwljaGFyICpmdWxsX3BhdGggPSBOVUxMOworCisJeGlkID0gR2V0WGlkKCk7CisKKwljRllJKDEsCisJICAgICAoIiBwYXJlbnQgaW5vZGUgPSAweCVwIG5hbWUgaXM6ICVzIGFuZCBkZW50cnkgPSAweCVwIiwKKwkgICAgICBwYXJlbnRfZGlyX2lub2RlLCBkaXJlbnRyeS0+ZF9uYW1lLm5hbWUsIGRpcmVudHJ5KSk7CisKKwkvKiBCQiBBZGQgY2hlY2sgb2YgaW5jb21pbmcgZGF0YSAtIGUuZy4gZnJhbWUgbm90IGxvbmdlciB0aGFuIG1heGltdW0gU01CIC0gbGV0IHNlcnZlciBjaGVjayB0aGUgbmFtZWxlbiBCQiAqLworCisJLyogY2hlY2sgd2hldGhlciBwYXRoIGV4aXN0cyAqLworCisJY2lmc19zYiA9IENJRlNfU0IocGFyZW50X2Rpcl9pbm9kZS0+aV9zYik7CisJcFRjb24gPSBjaWZzX3NiLT50Y29uOworCisJLyogY2FuIG5vdCBncmFiIHRoZSByZW5hbWUgc2VtIGhlcmUgc2luY2UgaXQgd291bGQKKwlkZWFkbG9jayBpbiB0aGUgY2FzZXMgKGJlZ2lubmluZyBvZiBzeXNfcmVuYW1lIGl0c2VsZikKKwlpbiB3aGljaCB3ZSBhbHJlYWR5IGhhdmUgdGhlIHNiIHJlbmFtZSBzZW0gKi8KKwlmdWxsX3BhdGggPSBidWlsZF9wYXRoX2Zyb21fZGVudHJ5KGRpcmVudHJ5KTsKKwlpZihmdWxsX3BhdGggPT0gTlVMTCkgeworCQlGcmVlWGlkKHhpZCk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKworCWlmIChkaXJlbnRyeS0+ZF9pbm9kZSAhPSBOVUxMKSB7CisJCWNGWUkoMSwgKCIgbm9uLU5VTEwgaW5vZGUgaW4gbG9va3VwIikpOworCX0gZWxzZSB7CisJCWNGWUkoMSwgKCIgTlVMTCBpbm9kZSBpbiBsb29rdXAiKSk7CisJfQorCWNGWUkoMSwKKwkgICAgICgiIEZ1bGwgcGF0aDogJXMgaW5vZGUgPSAweCVwIiwgZnVsbF9wYXRoLCBkaXJlbnRyeS0+ZF9pbm9kZSkpOworCisJaWYgKHBUY29uLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9VTklYKQorCQlyYyA9IGNpZnNfZ2V0X2lub2RlX2luZm9fdW5peCgmbmV3SW5vZGUsIGZ1bGxfcGF0aCwKKwkJCQkJICAgICAgcGFyZW50X2Rpcl9pbm9kZS0+aV9zYix4aWQpOworCWVsc2UKKwkJcmMgPSBjaWZzX2dldF9pbm9kZV9pbmZvKCZuZXdJbm9kZSwgZnVsbF9wYXRoLCBOVUxMLAorCQkJCQkgcGFyZW50X2Rpcl9pbm9kZS0+aV9zYix4aWQpOworCisJaWYgKChyYyA9PSAwKSAmJiAobmV3SW5vZGUgIT0gTlVMTCkpIHsKKwkJZGlyZW50cnktPmRfb3AgPSAmY2lmc19kZW50cnlfb3BzOworCQlkX2FkZChkaXJlbnRyeSwgbmV3SW5vZGUpOworCisJCS8qIHNpbmNlIHBhdGhzIGFyZSBub3QgbG9va2VkIHVwIGJ5IGNvbXBvbmVudCAtIHRoZSBwYXJlbnQgZGlyZWN0b3JpZXMgYXJlIHByZXN1bWVkIHRvIGJlIGdvb2QgaGVyZSAqLworCQlyZW5ld19wYXJlbnRhbF90aW1lc3RhbXBzKGRpcmVudHJ5KTsKKworCX0gZWxzZSBpZiAocmMgPT0gLUVOT0VOVCkgeworCQlyYyA9IDA7CisJCWRfYWRkKGRpcmVudHJ5LCBOVUxMKTsKKwl9IGVsc2UgeworCQljRVJST1IoMSwoIkVycm9yIDB4JXggb3Igb24gY2lmc19nZXRfaW5vZGVfaW5mbyBpbiBsb29rdXAiLHJjKSk7CisJCS8qIEJCIHNwZWNpYWwgY2FzZSBjaGVjayBmb3IgQWNjZXNzIERlbmllZCAtIHdhdGNoIHNlY3VyaXR5IAorCQlleHBvc3VyZSBvZiByZXR1cm5pbmcgZGlyIGluZm8gaW1wbGljaXRseSB2aWEgZGlmZmVyZW50IHJjIAorCQlpZiBmaWxlIGV4aXN0cyBvciBub3QgYnV0IG5vIGFjY2VzcyBCQiAqLworCX0KKworCWlmIChmdWxsX3BhdGgpCisJCWtmcmVlKGZ1bGxfcGF0aCk7CisJRnJlZVhpZCh4aWQpOworCXJldHVybiBFUlJfUFRSKHJjKTsKK30KKworaW50CitjaWZzX2Rpcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQorewkJCQkvKiBOQjogY3VycmVudGx5IHVudXNlZCBzaW5jZSBzZWFyY2hlcyBhcmUgb3BlbmVkIGluIHJlYWRkaXIgKi8KKwlpbnQgcmMgPSAwOworCWludCB4aWQ7CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYjsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKwljaGFyICpmdWxsX3BhdGggPSBOVUxMOworCisJeGlkID0gR2V0WGlkKCk7CisKKwljaWZzX3NiID0gQ0lGU19TQihpbm9kZS0+aV9zYik7CisJcFRjb24gPSBjaWZzX3NiLT50Y29uOworCisJaWYoZmlsZS0+Zl9kZW50cnkpIHsKKwkJZG93bigmZmlsZS0+Zl9kZW50cnktPmRfc2ItPnNfdmZzX3JlbmFtZV9zZW0pOworCQlmdWxsX3BhdGggPSBidWlsZF93aWxkY2FyZF9wYXRoX2Zyb21fZGVudHJ5KGZpbGUtPmZfZGVudHJ5KTsKKwkJdXAoJmZpbGUtPmZfZGVudHJ5LT5kX3NiLT5zX3Zmc19yZW5hbWVfc2VtKTsKKwl9IGVsc2UgeworCQlGcmVlWGlkKHhpZCk7CisJCXJldHVybiAtRUlPOworCX0KKworCWNGWUkoMSwgKCJpbm9kZSA9IDB4JXAgYW5kIGZ1bGwgcGF0aCBpcyAlcyIsIGlub2RlLCBmdWxsX3BhdGgpKTsKKworCWlmIChmdWxsX3BhdGgpCisJCWtmcmVlKGZ1bGxfcGF0aCk7CisJRnJlZVhpZCh4aWQpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludAorY2lmc19kX3JldmFsaWRhdGUoc3RydWN0IGRlbnRyeSAqZGlyZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWludCBpc1ZhbGlkID0gMTsKKworLyoJbG9ja19rZXJuZWwoKTsgKi8vKiBzdXJlbHkgd2UgZG8gbm90IHdhbnQgdG8gbG9jayB0aGUga2VybmVsIGZvciBhIHdob2xlIG5ldHdvcmsgcm91bmQgdHJpcCB3aGljaCBjb3VsZCB0YWtlIHNlY29uZHMgKi8KKworCWlmIChkaXJlbnRyeS0+ZF9pbm9kZSkgeworCQlpZiAoY2lmc19yZXZhbGlkYXRlKGRpcmVudHJ5KSkgeworCQkJLyogdW5sb2NrX2tlcm5lbCgpOyAqLworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UgeworCQljRllJKDEsCisJCSAgICAgKCJJbiBjaWZzX2RfcmV2YWxpZGF0ZSB3aXRoIG5vIGlub2RlIGJ1dCBuYW1lID0gJXMgYW5kIGRlbnRyeSAweCVwIiwKKwkJICAgICAgZGlyZW50cnktPmRfbmFtZS5uYW1lLCBkaXJlbnRyeSkpOworCX0KKworLyogICAgdW5sb2NrX2tlcm5lbCgpOyAqLworCisJcmV0dXJuIGlzVmFsaWQ7Cit9CisKKy8qIHN0YXRpYyBpbnQgY2lmc19kX2RlbGV0ZShzdHJ1Y3QgZGVudHJ5ICpkaXJlbnRyeSkKK3sKKwlpbnQgcmMgPSAwOworCisJY0ZZSSgxLCAoIkluIGNpZnMgZF9kZWxldGUsIG5hbWUgPSAlcyIsIGRpcmVudHJ5LT5kX25hbWUubmFtZSkpOworCisJcmV0dXJuIHJjOworfSAgICAgKi8KKworc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGNpZnNfZGVudHJ5X29wcyA9IHsKKwkuZF9yZXZhbGlkYXRlID0gY2lmc19kX3JldmFsaWRhdGUsCisvKiBkX2RlbGV0ZTogICAgICAgY2lmc19kX2RlbGV0ZSwgICAgICAgKi8vKiBub3QgbmVlZGVkIGV4Y2VwdCBmb3IgZGVidWdnaW5nICovCisJLyogbm8gbmVlZCBmb3IgZF9oYXNoLCBkX2NvbXBhcmUsIGRfcmVsZWFzZSwgZF9pcHV0IC4uLiB5ZXQuIEJCIGNvbmZpcm0gdGhpcyBCQiAqLworfTsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvZmNudGwuYyBiL2ZzL2NpZnMvZmNudGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDI0YzQwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9mY250bC5jCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogICBmcy9jaWZzL2ZjbnRsLmMKKyAqCisgKiAgIHZmcyBvcGVyYXRpb25zIHRoYXQgZGVhbCB3aXRoIHRoZSBmaWxlIGNvbnRyb2wgQVBJCisgKiAKKyAqICAgQ29weXJpZ2h0IChDKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzICBDb3JwLiwgMjAwMywyMDA0CisgKiAgIEF1dGhvcihzKTogU3RldmUgRnJlbmNoIChzZnJlbmNoQHVzLmlibS5jb20pCisgKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSAiY2lmc2dsb2IuaCIKKyNpbmNsdWRlICJjaWZzcHJvdG8uaCIKKyNpbmNsdWRlICJjaWZzX3VuaWNvZGUuaCIKKyNpbmNsdWRlICJjaWZzX2RlYnVnLmgiCisjaW5jbHVkZSAiY2lmc2ZzLmgiCisKK3N0YXRpYyBfX3UzMiBjb252ZXJ0X3RvX2NpZnNfbm90aWZ5X2ZsYWdzKHVuc2lnbmVkIGxvbmcgZmNudGxfbm90aWZ5X2ZsYWdzKQoreworCV9fdTMyIGNpZnNfbnRmeV9mbGFncyA9IDA7CisKKwkvKiBObyB3YXkgb24gTGludXggVkZTIHRvIGFzayB0byBtb25pdG9yIHhhdHRyCisJY2hhbmdlcyAoYW5kIG5vIHN0cmVhbSBzdXBwb3J0IGVpdGhlciAqLworCWlmKGZjbnRsX25vdGlmeV9mbGFncyAmIEROX0FDQ0VTUykgeworCQljaWZzX250ZnlfZmxhZ3MgfD0gRklMRV9OT1RJRllfQ0hBTkdFX0xBU1RfQUNDRVNTOworCX0KKwlpZihmY250bF9ub3RpZnlfZmxhZ3MgJiBETl9NT0RJRlkpIHsKKwkJLyogV2hhdCBkb2VzIHRoaXMgbWVhbiBvbiBkaXJlY3Rvcmllcz8gKi8KKwkJY2lmc19udGZ5X2ZsYWdzIHw9IEZJTEVfTk9USUZZX0NIQU5HRV9MQVNUX1dSSVRFIHwKKwkJCUZJTEVfTk9USUZZX0NIQU5HRV9TSVpFOworCX0KKwlpZihmY250bF9ub3RpZnlfZmxhZ3MgJiBETl9DUkVBVEUpIHsKKwkJY2lmc19udGZ5X2ZsYWdzIHw9IEZJTEVfTk9USUZZX0NIQU5HRV9DUkVBVElPTiB8IAorCQkJRklMRV9OT1RJRllfQ0hBTkdFX0xBU1RfV1JJVEU7CisJfQorCWlmKGZjbnRsX25vdGlmeV9mbGFncyAmIEROX0RFTEVURSkgeworCQljaWZzX250ZnlfZmxhZ3MgfD0gRklMRV9OT1RJRllfQ0hBTkdFX0xBU1RfV1JJVEU7CisJfQorCWlmKGZjbnRsX25vdGlmeV9mbGFncyAmIEROX1JFTkFNRSkgeworCQkvKiBCQiByZXZpZXcgdGhpcyAtIGNoZWNraW5nIHZhcmlvdXMgc2VydmVyIGJlaGF2aW9ycyAqLworCQljaWZzX250ZnlfZmxhZ3MgfD0gRklMRV9OT1RJRllfQ0hBTkdFX0RJUl9OQU1FIHwgCisJCQlGSUxFX05PVElGWV9DSEFOR0VfRklMRV9OQU1FOworCX0KKwlpZihmY250bF9ub3RpZnlfZmxhZ3MgJiBETl9BVFRSSUIpIHsKKwkJY2lmc19udGZ5X2ZsYWdzIHw9IEZJTEVfTk9USUZZX0NIQU5HRV9TRUNVUklUWSB8IAorCQkJRklMRV9OT1RJRllfQ0hBTkdFX0FUVFJJQlVURVM7CisJfQorLyoJaWYoZmNudGxfbm90aWZ5X2ZsYWdzICYgRE5fTVVMVElTSE9UKSB7CisJCWNpZnNfbnRmeV9mbGFncyB8PSA7CisJfSAqLyAvKiBCQiBmaXhtZSAtIG5vdCBzdXJlIGhvdyB0byBoYW5kbGUgdGhpcyB3aXRoIENJRlMgeWV0ICovCisKKworCXJldHVybiBjaWZzX250ZnlfZmxhZ3M7Cit9CisKK2ludCBjaWZzX2Rpcl9ub3RpZnkoc3RydWN0IGZpbGUgKiBmaWxlLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgeGlkOworCWludCByYyA9IC1FSU5WQUw7CisJaW50IG9wbG9jayA9IEZBTFNFOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisJc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb247CisJY2hhciAqZnVsbF9wYXRoID0gTlVMTDsKKwlfX3UzMiBmaWx0ZXIgPSBGSUxFX05PVElGWV9DSEFOR0VfTkFNRSB8IEZJTEVfTk9USUZZX0NIQU5HRV9BVFRSSUJVVEVTOworCV9fdTE2IG5ldGZpZDsKKworCXhpZCA9IEdldFhpZCgpOworCWNpZnNfc2IgPSBDSUZTX1NCKGZpbGUtPmZfZGVudHJ5LT5kX3NiKTsKKwlwVGNvbiA9IGNpZnNfc2ItPnRjb247CisKKwlkb3duKCZmaWxlLT5mX2RlbnRyeS0+ZF9zYi0+c192ZnNfcmVuYW1lX3NlbSk7CisJZnVsbF9wYXRoID0gYnVpbGRfcGF0aF9mcm9tX2RlbnRyeShmaWxlLT5mX2RlbnRyeSk7CisJdXAoJmZpbGUtPmZfZGVudHJ5LT5kX3NiLT5zX3Zmc19yZW5hbWVfc2VtKTsKKworCWlmKGZ1bGxfcGF0aCA9PSBOVUxMKSB7CisJCXJjID0gLUVOT01FTTsKKwl9IGVsc2UgeworCQljRVJST1IoMSwoImNpZnMgZGlyIG5vdGlmeSBvbiBmaWxlICVzIHdpdGggYXJnIDB4JWx4IixmdWxsX3BhdGgsYXJnKSk7IC8qIEJCIHJlbW92ZW1lIEJCICovCisJCXJjID0gQ0lGU1NNQk9wZW4oeGlkLCBwVGNvbiwgZnVsbF9wYXRoLCBGSUxFX09QRU4sIAorCQkJR0VORVJJQ19SRUFEIHwgU1lOQ0hST05JWkUsIDAgLyogY3JlYXRlIG9wdGlvbnMgKi8sCisJCQkmbmV0ZmlkLCAmb3Bsb2NrLE5VTEwsIGNpZnNfc2ItPmxvY2FsX25scyk7CisJCS8qIEJCIGZpeG1lIC0gYWRkIHRoaXMgaGFuZGxlIHRvIGEgbm90aWZ5IGhhbmRsZSBsaXN0ICovCisJCWlmKHJjKSB7CisJCQljRVJST1IoMSwoIkNvdWxkIG5vdCBvcGVuIGRpcmVjdG9yeSBmb3Igbm90aWZ5IikpOyAgLyogQkIgcmVtb3ZlIEJCICovCisJCX0gZWxzZSB7CisJCQlmaWx0ZXIgPSBjb252ZXJ0X3RvX2NpZnNfbm90aWZ5X2ZsYWdzKGFyZyk7CisJCQlpZihmaWx0ZXIgIT0gMCkgeworCQkJCXJjID0gQ0lGU1NNQk5vdGlmeSh4aWQsIHBUY29uLCAwIC8qIG5vIHN1YmRpcnMgKi8sIG5ldGZpZCwgCisJCQkJCWZpbHRlciwgY2lmc19zYi0+bG9jYWxfbmxzKTsKKwkJCX0gZWxzZSB7CisJCQkJcmMgPSAtRUlOVkFMOworCQkJfQorCQkJLyogQkIgYWRkIGNvZGUgdG8gY2xvc2UgZmlsZSBldmVudHVhbGx5IChhdCB1bm1vdW50CisJCQlpdCB3b3VsZCBjbG9zZSBhdXRvbWF0aWNhbGx5IGJ1dCBtYXkgYmUgYSB3YXkKKwkJCXRvIGRvIGl0IGVhc2lseSB3aGVuIGlub2RlIGZyZWVkIG9yIHdoZW4KKwkJCW5vdGlmeSBpbmZvIGlzIGNsZWFyZWQvY2hhbmdlZCAqLworICAgICAgICAgICAgY0VSUk9SKDEsKCJub3RpZnkgcmMgJWQiLHJjKSk7CisJCX0KKwl9CisJCisJRnJlZVhpZCh4aWQpOworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvZmlsZS5jIGIvZnMvY2lmcy9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNhYjdjZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2NpZnMvZmlsZS5jCkBAIC0wLDAgKzEsMTY3NSBAQAorLyoKKyAqICAgZnMvY2lmcy9maWxlLmMKKyAqCisgKiAgIHZmcyBvcGVyYXRpb25zIHRoYXQgZGVhbCB3aXRoIGZpbGVzCisgKiAKKyAqICAgQ29weXJpZ2h0IChDKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzICBDb3JwLiwgMjAwMiwyMDAzCisgKiAgIEF1dGhvcihzKTogU3RldmUgRnJlbmNoIChzZnJlbmNoQHVzLmlibS5jb20pCisgKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2V2ZWMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorI2luY2x1ZGUgImNpZnNmcy5oIgorI2luY2x1ZGUgImNpZnNwZHUuaCIKKyNpbmNsdWRlICJjaWZzZ2xvYi5oIgorI2luY2x1ZGUgImNpZnNwcm90by5oIgorI2luY2x1ZGUgImNpZnNfdW5pY29kZS5oIgorI2luY2x1ZGUgImNpZnNfZGVidWcuaCIKKyNpbmNsdWRlICJjaWZzX2ZzX3NiLmgiCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNpZnNGaWxlSW5mbyAqY2lmc19pbml0X3ByaXZhdGUoCisJc3RydWN0IGNpZnNGaWxlSW5mbyAqcHJpdmF0ZV9kYXRhLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCXN0cnVjdCBmaWxlICpmaWxlLCBfX3UxNiBuZXRmaWQpCit7CisJbWVtc2V0KHByaXZhdGVfZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBjaWZzRmlsZUluZm8pKTsKKwlwcml2YXRlX2RhdGEtPm5ldGZpZCA9IG5ldGZpZDsKKwlwcml2YXRlX2RhdGEtPnBpZCA9IGN1cnJlbnQtPnRnaWQ7CQorCWluaXRfTVVURVgoJnByaXZhdGVfZGF0YS0+Zmhfc2VtKTsKKwlwcml2YXRlX2RhdGEtPnBmaWxlID0gZmlsZTsgLyogbmVlZGVkIGZvciB3cml0ZXBhZ2UgKi8KKwlwcml2YXRlX2RhdGEtPnBJbm9kZSA9IGlub2RlOworCXByaXZhdGVfZGF0YS0+aW52YWxpZEhhbmRsZSA9IEZBTFNFOworCXByaXZhdGVfZGF0YS0+Y2xvc2VQZW5kID0gRkFMU0U7CisKKwlyZXR1cm4gcHJpdmF0ZV9kYXRhOworfQorCitzdGF0aWMgaW5saW5lIGludCBjaWZzX2NvbnZlcnRfZmxhZ3ModW5zaWduZWQgaW50IGZsYWdzKQoreworCWlmICgoZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fUkRPTkxZKQorCQlyZXR1cm4gR0VORVJJQ19SRUFEOworCWVsc2UgaWYgKChmbGFncyAmIE9fQUNDTU9ERSkgPT0gT19XUk9OTFkpCisJCXJldHVybiBHRU5FUklDX1dSSVRFOworCWVsc2UgaWYgKChmbGFncyAmIE9fQUNDTU9ERSkgPT0gT19SRFdSKSB7CisJCS8qIEdFTkVSSUNfQUxMIGlzIHRvbyBtdWNoIHBlcm1pc3Npb24gdG8gcmVxdWVzdAorCQkgICBjYW4gY2F1c2UgdW5uZWNlc3NhcnkgYWNjZXNzIGRlbmllZCBvbiBjcmVhdGUgKi8KKwkJLyogcmV0dXJuIEdFTkVSSUNfQUxMOyAqLworCQlyZXR1cm4gKEdFTkVSSUNfUkVBRCB8IEdFTkVSSUNfV1JJVEUpOworCX0KKworCXJldHVybiAweDIwMTk3OworfQorCitzdGF0aWMgaW5saW5lIGludCBjaWZzX2dldF9kaXNwb3NpdGlvbih1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJaWYgKChmbGFncyAmIChPX0NSRUFUIHwgT19FWENMKSkgPT0gKE9fQ1JFQVQgfCBPX0VYQ0wpKQorCQlyZXR1cm4gRklMRV9DUkVBVEU7CisJZWxzZSBpZiAoKGZsYWdzICYgKE9fQ1JFQVQgfCBPX1RSVU5DKSkgPT0gKE9fQ1JFQVQgfCBPX1RSVU5DKSkKKwkJcmV0dXJuIEZJTEVfT1ZFUldSSVRFX0lGOworCWVsc2UgaWYgKChmbGFncyAmIE9fQ1JFQVQpID09IE9fQ1JFQVQpCisJCXJldHVybiBGSUxFX09QRU5fSUY7CisJZWxzZQorCQlyZXR1cm4gRklMRV9PUEVOOworfQorCisvKiBhbGwgYXJndW1lbnRzIHRvIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjaGVja2VkIGZvciB2YWxpZGl0eSBpbiBjYWxsZXIgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNpZnNfb3Blbl9pbm9kZV9oZWxwZXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJc3RydWN0IGNpZnNJbm9kZUluZm8gKnBDaWZzSW5vZGUsIHN0cnVjdCBjaWZzRmlsZUluZm8gKnBDaWZzRmlsZSwKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbiwgaW50ICpvcGxvY2ssIEZJTEVfQUxMX0lORk8gKmJ1ZiwKKwljaGFyICpmdWxsX3BhdGgsIGludCB4aWQpCit7CisJc3RydWN0IHRpbWVzcGVjIHRlbXA7CisJaW50IHJjOworCisJLyogd2FudCBoYW5kbGVzIHdlIGNhbiB1c2UgdG8gcmVhZCB3aXRoIGZpcnN0CisJICAgaW4gdGhlIGxpc3Qgc28gd2UgZG8gbm90IGhhdmUgdG8gd2FsayB0aGUKKwkgICBsaXN0IHRvIHNlYXJjaCBmb3Igb25lIGluIHByZXBhcmVfd3JpdGUgKi8KKwlpZiAoKGZpbGUtPmZfZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fV1JPTkxZKSB7CisJCWxpc3RfYWRkX3RhaWwoJnBDaWZzRmlsZS0+Zmxpc3QsIAorCQkJICAgICAgJnBDaWZzSW5vZGUtPm9wZW5GaWxlTGlzdCk7CisJfSBlbHNlIHsKKwkJbGlzdF9hZGQoJnBDaWZzRmlsZS0+Zmxpc3QsCisJCQkgJnBDaWZzSW5vZGUtPm9wZW5GaWxlTGlzdCk7CisJfQorCXdyaXRlX3VubG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisJd3JpdGVfdW5sb2NrKCZmaWxlLT5mX293bmVyLmxvY2spOworCWlmIChwQ2lmc0lub2RlLT5jbGllbnRDYW5DYWNoZVJlYWQpIHsKKwkJLyogd2UgaGF2ZSB0aGUgaW5vZGUgb3BlbiBzb21ld2hlcmUgZWxzZQorCQkgICBubyBuZWVkIHRvIGRpc2NhcmQgY2FjaGUgZGF0YSAqLworCQlnb3RvIGNsaWVudF9jYW5fY2FjaGU7CisJfQorCisJLyogQkIgbmVlZCBzYW1lIGNoZWNrIGluIGNpZnNfY3JlYXRlIHRvbz8gKi8KKwkvKiBpZiBub3Qgb3Bsb2NrZWQsIGludmFsaWRhdGUgaW5vZGUgcGFnZXMgaWYgbXRpbWUgb3IgZmlsZQorCSAgIHNpemUgY2hhbmdlZCAqLworCXRlbXAgPSBjaWZzX05UdGltZVRvVW5peChsZTY0X3RvX2NwdShidWYtPkxhc3RXcml0ZVRpbWUpKTsKKwlpZiAodGltZXNwZWNfZXF1YWwoJmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX210aW1lLCAmdGVtcCkgJiYgCisJCQkgICAoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2l6ZSA9PSAKKwkJCSAgICAobG9mZl90KWxlNjRfdG9fY3B1KGJ1Zi0+RW5kT2ZGaWxlKSkpIHsKKwkJY0ZZSSgxLCAoImlub2RlIHVuY2hhbmdlZCBvbiBzZXJ2ZXIiKSk7CisJfSBlbHNlIHsKKwkJaWYgKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmcpIHsKKwkJLyogQkIgbm8gbmVlZCB0byBsb2NrIGlub2RlIHVudGlsIGFmdGVyIGludmFsaWRhdGUKKwkJICAgc2luY2UgbmFtZWkgY29kZSBzaG91bGQgYWxyZWFkeSBoYXZlIGl0IGxvY2tlZD8gKi8KKwkJCWZpbGVtYXBfZmRhdGF3cml0ZShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tYXBwaW5nKTsKKwkJCWZpbGVtYXBfZmRhdGF3YWl0KGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmcpOworCQl9CisJCWNGWUkoMSwgKCJpbnZhbGlkYXRpbmcgcmVtb3RlIGlub2RlIHNpbmNlIG9wZW4gZGV0ZWN0ZWQgaXQgIgorCQkJICJjaGFuZ2VkIikpOworCQlpbnZhbGlkYXRlX3JlbW90ZV9pbm9kZShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJfQorCitjbGllbnRfY2FuX2NhY2hlOgorCWlmIChwVGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkKKwkJcmMgPSBjaWZzX2dldF9pbm9kZV9pbmZvX3VuaXgoJmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLAorCQkJZnVsbF9wYXRoLCBpbm9kZS0+aV9zYiwgeGlkKTsKKwllbHNlCisJCXJjID0gY2lmc19nZXRfaW5vZGVfaW5mbygmZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsCisJCQlmdWxsX3BhdGgsIGJ1ZiwgaW5vZGUtPmlfc2IsIHhpZCk7CisKKwlpZiAoKCpvcGxvY2sgJiAweEYpID09IE9QTE9DS19FWENMVVNJVkUpIHsKKwkJcENpZnNJbm9kZS0+Y2xpZW50Q2FuQ2FjaGVBbGwgPSBUUlVFOworCQlwQ2lmc0lub2RlLT5jbGllbnRDYW5DYWNoZVJlYWQgPSBUUlVFOworCQljRllJKDEsICgiRXhjbHVzaXZlIE9wbG9jayBncmFudGVkIG9uIGlub2RlICVwIiwKKwkJCSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSkpOworCX0gZWxzZSBpZiAoKCpvcGxvY2sgJiAweEYpID09IE9QTE9DS19SRUFEKQorCQlwQ2lmc0lub2RlLT5jbGllbnRDYW5DYWNoZVJlYWQgPSBUUlVFOworCisJcmV0dXJuIHJjOworfQorCitpbnQgY2lmc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCByYyA9IC1FQUNDRVM7CisJaW50IHhpZCwgb3Bsb2NrOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisJc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb247CisJc3RydWN0IGNpZnNGaWxlSW5mbyAqcENpZnNGaWxlOworCXN0cnVjdCBjaWZzSW5vZGVJbmZvICpwQ2lmc0lub2RlOworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKKwljaGFyICpmdWxsX3BhdGggPSBOVUxMOworCWludCBkZXNpcmVkQWNjZXNzOworCWludCBkaXNwb3NpdGlvbjsKKwlfX3UxNiBuZXRmaWQ7CisJRklMRV9BTExfSU5GTyAqYnVmID0gTlVMTDsKKworCXhpZCA9IEdldFhpZCgpOworCisJY2lmc19zYiA9IENJRlNfU0IoaW5vZGUtPmlfc2IpOworCXBUY29uID0gY2lmc19zYi0+dGNvbjsKKworCWlmIChmaWxlLT5mX2ZsYWdzICYgT19DUkVBVCkgeworCQkvKiBzZWFyY2ggaW5vZGUgZm9yIHRoaXMgZmlsZSBhbmQgZmlsbCBpbiBmaWxlLT5wcml2YXRlX2RhdGEgKi8KKwkJcENpZnNJbm9kZSA9IENJRlNfSShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJCXJlYWRfbG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisJCWxpc3RfZm9yX2VhY2godG1wLCAmcENpZnNJbm9kZS0+b3BlbkZpbGVMaXN0KSB7CisJCQlwQ2lmc0ZpbGUgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGNpZnNGaWxlSW5mbywKKwkJCQkJICAgICAgIGZsaXN0KTsKKwkJCWlmICgocENpZnNGaWxlLT5wZmlsZSA9PSBOVUxMKSAmJgorCQkJICAgIChwQ2lmc0ZpbGUtPnBpZCA9PSBjdXJyZW50LT50Z2lkKSkgeworCQkJCS8qIG1vZGUgc2V0IGluIGNpZnNfY3JlYXRlICovCisKKwkJCQkvKiBuZWVkZWQgZm9yIHdyaXRlcGFnZSAqLworCQkJCXBDaWZzRmlsZS0+cGZpbGUgPSBmaWxlOworCQkJCQorCQkJCWZpbGUtPnByaXZhdGVfZGF0YSA9IHBDaWZzRmlsZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlyZWFkX3VubG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisJCWlmIChmaWxlLT5wcml2YXRlX2RhdGEgIT0gTlVMTCkgeworCQkJcmMgPSAwOworCQkJRnJlZVhpZCh4aWQpOworCQkJcmV0dXJuIHJjOworCQl9IGVsc2UgeworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX0VYQ0wpCisJCQkJY0VSUk9SKDEsICgiY291bGQgbm90IGZpbmQgZmlsZSBpbnN0YW5jZSBmb3IgIgorCQkJCQkgICAibmV3IGZpbGUgJXAgIiwgZmlsZSkpOworCQl9CisJfQorCisJZG93bigmaW5vZGUtPmlfc2ItPnNfdmZzX3JlbmFtZV9zZW0pOworCWZ1bGxfcGF0aCA9IGJ1aWxkX3BhdGhfZnJvbV9kZW50cnkoZmlsZS0+Zl9kZW50cnkpOworCXVwKCZpbm9kZS0+aV9zYi0+c192ZnNfcmVuYW1lX3NlbSk7CisJaWYgKGZ1bGxfcGF0aCA9PSBOVUxMKSB7CisJCUZyZWVYaWQoeGlkKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY0ZZSSgxLCAoIiBpbm9kZSA9IDB4JXAgZmlsZSBmbGFncyBhcmUgMHgleCBmb3IgJXMiLAorCQkgaW5vZGUsIGZpbGUtPmZfZmxhZ3MsIGZ1bGxfcGF0aCkpOworCWRlc2lyZWRBY2Nlc3MgPSBjaWZzX2NvbnZlcnRfZmxhZ3MoZmlsZS0+Zl9mbGFncyk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBvcGVuIGZsYWcgbWFwcGluZyB0YWJsZToKKyAqICAKKyAqCVBPU0lYIEZsYWcgICAgICAgICAgICBDSUZTIERpc3Bvc2l0aW9uCisgKgktLS0tLS0tLS0tICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLSAKKyAqCU9fQ1JFQVQgICAgICAgICAgICAgICBGSUxFX09QRU5fSUYKKyAqCU9fQ1JFQVQgfCBPX0VYQ0wgICAgICBGSUxFX0NSRUFURQorICoJT19DUkVBVCB8IE9fVFJVTkMgICAgIEZJTEVfT1ZFUldSSVRFX0lGCisgKglPX1RSVU5DICAgICAgICAgICAgICAgRklMRV9PVkVSV1JJVEUKKyAqCW5vbmUgb2YgdGhlIGFib3ZlICAgICBGSUxFX09QRU4KKyAqCisgKglOb3RlIHRoYXQgdGhlcmUgaXMgbm90IGEgZGlyZWN0IG1hdGNoIGJldHdlZW4gZGlzcG9zaXRpb24KKyAqCUZJTEVfU1VQRVJTRURFIChpZSBjcmVhdGUgd2hldGhlciBvciBub3QgZmlsZSBleGlzdHMgYWx0aG91Z2ggCisgKglPX0NSRUFUIHwgT19UUlVOQyBpcyBzaW1pbGFyIGJ1dCB0cnVuY2F0ZXMgdGhlIGV4aXN0aW5nCisgKglmaWxlIHJhdGhlciB0aGFuIGNyZWF0aW5nIGEgbmV3IGZpbGUgYXMgRklMRV9TVVBFUlNFREUgZG9lcworICoJKHdoaWNoIHVzZXMgdGhlIGF0dHJpYnV0ZXMgLyBtZXRhZGF0YSBwYXNzZWQgaW4gb24gb3BlbiBjYWxsKQorICo/CisgKj8gIE9fU1lOQyBpcyBhIHJlYXNvbmFibGUgbWF0Y2ggdG8gQ0lGUyB3cml0ZXRocm91Z2ggZmxhZyAgCisgKj8gIGFuZCB0aGUgcmVhZCB3cml0ZSBmbGFncyBtYXRjaCByZWFzb25hYmx5LiAgT19MQVJHRUZJTEUKKyAqPyAgaXMgaXJyZWxldmFudCBiZWNhdXNlIGxhcmdlZmlsZSBzdXBwb3J0IGlzIGFsd2F5cyB1c2VkCisgKj8gIGJ5IHRoaXMgY2xpZW50LiBGbGFncyBPX0FQUEVORCwgT19ESVJFQ1QsIE9fRElSRUNUT1JZLAorICoJIE9fRkFTWU5DLCBPX05PRk9MTE9XLCBPX05PTkJMT0NLIG5lZWQgZnVydGhlciBpbnZlc3RpZ2F0aW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJZGlzcG9zaXRpb24gPSBjaWZzX2dldF9kaXNwb3NpdGlvbihmaWxlLT5mX2ZsYWdzKTsKKworCWlmIChvcGxvY2tFbmFibGVkKQorCQlvcGxvY2sgPSBSRVFfT1BMT0NLOworCWVsc2UKKwkJb3Bsb2NrID0gRkFMU0U7CisKKwkvKiBCQiBwYXNzIE9fU1lOQyBmbGFnIHRocm91Z2ggb24gZmlsZSBhdHRyaWJ1dGVzIC4uIEJCICovCisKKwkvKiBBbHNvIHJlZnJlc2ggaW5vZGUgYnkgcGFzc2luZyBpbiBmaWxlX2luZm8gYnVmIHJldHVybmVkIGJ5IFNNQk9wZW4KKwkgICBhbmQgY2FsbGluZyBnZXRfaW5vZGVfaW5mbyB3aXRoIHJldHVybmVkIGJ1ZiAoYXQgbGVhc3QgaGVscHMKKwkgICBub24tVW5peCBzZXJ2ZXIgY2FzZSkgKi8KKworCS8qIEJCIHdlIGNhbiBub3QgZG8gdGhpcyBpZiB0aGlzIGlzIHRoZSBzZWNvbmQgb3BlbiBvZiBhIGZpbGUgCisJICAgYW5kIHRoZSBmaXJzdCBoYW5kbGUgaGFzIHdyaXRlYmVoaW5kIGRhdGEsIHdlIG1pZ2h0IGJlIAorCSAgIGFibGUgdG8gc2ltcGx5IGRvIGEgZmlsZW1hcF9mZGF0YXdyaXRlL2ZpbGVtYXBfZmRhdGF3YWl0IGZpcnN0ICovCisJYnVmID0ga21hbGxvYyhzaXplb2YoRklMRV9BTExfSU5GTyksIEdGUF9LRVJORUwpOworCWlmICghYnVmKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCXJjID0gQ0lGU1NNQk9wZW4oeGlkLCBwVGNvbiwgZnVsbF9wYXRoLCBkaXNwb3NpdGlvbiwgZGVzaXJlZEFjY2VzcywKKwkJCSBDUkVBVEVfTk9UX0RJUiwgJm5ldGZpZCwgJm9wbG9jaywgYnVmLAorCQkJIGNpZnNfc2ItPmxvY2FsX25scyk7CisJaWYgKHJjKSB7CisJCWNGWUkoMSwgKCJjaWZzX29wZW4gcmV0dXJuZWQgMHgleCAiLCByYykpOworCQlnb3RvIG91dDsKKwl9CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0KKwkJa21hbGxvYyhzaXplb2Yoc3RydWN0IGNpZnNGaWxlSW5mbyksIEdGUF9LRVJORUwpOworCWlmIChmaWxlLT5wcml2YXRlX2RhdGEgPT0gTlVMTCkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwlwQ2lmc0ZpbGUgPSBjaWZzX2luaXRfcHJpdmF0ZShmaWxlLT5wcml2YXRlX2RhdGEsIGlub2RlLCBmaWxlLCBuZXRmaWQpOworCXdyaXRlX2xvY2soJmZpbGUtPmZfb3duZXIubG9jayk7CisJd3JpdGVfbG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisJbGlzdF9hZGQoJnBDaWZzRmlsZS0+dGxpc3QsICZwVGNvbi0+b3BlbkZpbGVMaXN0KTsKKworCXBDaWZzSW5vZGUgPSBDSUZTX0koZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCWlmIChwQ2lmc0lub2RlKSB7CisJCXJjID0gY2lmc19vcGVuX2lub2RlX2hlbHBlcihpbm9kZSwgZmlsZSwgcENpZnNJbm9kZSwKKwkJCQkJICAgIHBDaWZzRmlsZSwgcFRjb24sCisJCQkJCSAgICAmb3Bsb2NrLCBidWYsIGZ1bGxfcGF0aCwgeGlkKTsKKwl9IGVsc2UgeworCQl3cml0ZV91bmxvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCQl3cml0ZV91bmxvY2soJmZpbGUtPmZfb3duZXIubG9jayk7CisJfQorCisJaWYgKG9wbG9jayAmIENJRlNfQ1JFQVRFX0FDVElPTikgeyAgICAgICAgICAgCisJCS8qIHRpbWUgdG8gc2V0IG1vZGUgd2hpY2ggd2UgY2FuIG5vdCBzZXQgZWFybGllciBkdWUgdG8KKwkJICAgcHJvYmxlbXMgY3JlYXRpbmcgbmV3IHJlYWQtb25seSBmaWxlcyAqLworCQlpZiAoY2lmc19zYi0+dGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkgeworCQkJQ0lGU1NNQlVuaXhTZXRQZXJtcyh4aWQsIHBUY29uLCBmdWxsX3BhdGgsCisJCQkJCSAgICBpbm9kZS0+aV9tb2RlLAorCQkJCQkgICAgKF9fdTY0KS0xLCAoX191NjQpLTEsIDAgLyogZGV2ICovLAorCQkJCQkgICAgY2lmc19zYi0+bG9jYWxfbmxzKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEJCIGltcGxlbWVudCB2aWEgV2luZG93cyBzZWN1cml0eSBkZXNjcmlwdG9ycyBlZworCQkJICAgQ0lGU1NNQldpblNldFBlcm1zKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwgbW9kZSwKKwkJCQkJICAgICAgLTEsIC0xLCBsb2NhbF9ubHMpOworCQkJICAgaW4gdGhlIG1lYW50aW1lIGNvdWxkIHNldCByL28gZG9zIGF0dHJpYnV0ZSB3aGVuCisJCQkgICBwZXJtcyBhcmUgZWc6IG1vZGUgJiAwMjIyID09IDAgKi8KKwkJfQorCX0KKworb3V0OgorCWtmcmVlKGJ1Zik7CisJa2ZyZWUoZnVsbF9wYXRoKTsKKwlGcmVlWGlkKHhpZCk7CisJcmV0dXJuIHJjOworfQorCisvKiBUcnkgdG8gcmVhcXVpcmUgYnl0ZSByYW5nZSBsb2NrcyB0aGF0IHdlcmUgcmVsZWFzZWQgd2hlbiBzZXNzaW9uICovCisvKiB0byBzZXJ2ZXIgd2FzIGxvc3QgKi8KK3N0YXRpYyBpbnQgY2lmc19yZWxvY2tfZmlsZShzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpjaWZzRmlsZSkKK3sKKwlpbnQgcmMgPSAwOworCisvKiBCQiBsaXN0IGFsbCBsb2NrcyBvcGVuIG9uIHRoaXMgZmlsZSBhbmQgcmVsb2NrICovCisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgY2lmc19yZW9wZW5fZmlsZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgCisJaW50IGNhbl9mbHVzaCkKK3sKKwlpbnQgcmMgPSAtRUFDQ0VTOworCWludCB4aWQsIG9wbG9jazsKKwlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiOworCXN0cnVjdCBjaWZzVGNvbkluZm8gKnBUY29uOworCXN0cnVjdCBjaWZzRmlsZUluZm8gKnBDaWZzRmlsZTsKKwlzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqcENpZnNJbm9kZTsKKwljaGFyICpmdWxsX3BhdGggPSBOVUxMOworCWludCBkZXNpcmVkQWNjZXNzOworCWludCBkaXNwb3NpdGlvbiA9IEZJTEVfT1BFTjsKKwlfX3UxNiBuZXRmaWQ7CisKKwlpZiAoaW5vZGUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FQkFERjsKKwlpZiAoZmlsZS0+cHJpdmF0ZV9kYXRhKSB7CisJCXBDaWZzRmlsZSA9IChzdHJ1Y3QgY2lmc0ZpbGVJbmZvICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCX0gZWxzZQorCQlyZXR1cm4gLUVCQURGOworCisJeGlkID0gR2V0WGlkKCk7CisJZG93bigmcENpZnNGaWxlLT5maF9zZW0pOworCWlmIChwQ2lmc0ZpbGUtPmludmFsaWRIYW5kbGUgPT0gRkFMU0UpIHsKKwkJdXAoJnBDaWZzRmlsZS0+Zmhfc2VtKTsKKwkJRnJlZVhpZCh4aWQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZmlsZS0+Zl9kZW50cnkgPT0gTlVMTCkgeworCQl1cCgmcENpZnNGaWxlLT5maF9zZW0pOworCQljRllJKDEsICgiZmFpbGVkIGZpbGUgcmVvcGVuLCBubyB2YWxpZCBuYW1lIGlmIGRlbnRyeSBmcmVlZCIpKTsKKwkJRnJlZVhpZCh4aWQpOworCQlyZXR1cm4gLUVCQURGOworCX0KKwljaWZzX3NiID0gQ0lGU19TQihpbm9kZS0+aV9zYik7CisJcFRjb24gPSBjaWZzX3NiLT50Y29uOworLyogY2FuIG5vdCBncmFiIHJlbmFtZSBzZW0gaGVyZSBiZWNhdXNlIHZhcmlvdXMgb3BzLCBpbmNsdWRpbmcKKyAgIHRob3NlIHRoYXQgYWxyZWFkeSBoYXZlIHRoZSByZW5hbWUgc2VtIGNhbiBlbmQgdXAgY2F1c2luZyB3cml0ZXBhZ2UKKyAgIHRvIGdldCBjYWxsZWQgYW5kIGlmIHRoZSBzZXJ2ZXIgd2FzIGRvd24gdGhhdCBtZWFucyB3ZSBlbmQgdXAgaGVyZSwKKyAgIGFuZCB3ZSBjYW4gbmV2ZXIgdGVsbCBpZiB0aGUgY2FsbGVyIGFscmVhZHkgaGFzIHRoZSByZW5hbWVfc2VtICovCisJZnVsbF9wYXRoID0gYnVpbGRfcGF0aF9mcm9tX2RlbnRyeShmaWxlLT5mX2RlbnRyeSk7CisJaWYgKGZ1bGxfcGF0aCA9PSBOVUxMKSB7CisJCXVwKCZwQ2lmc0ZpbGUtPmZoX3NlbSk7CisJCUZyZWVYaWQoeGlkKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY0ZZSSgxLCAoIiBpbm9kZSA9IDB4JXAgZmlsZSBmbGFncyBhcmUgMHgleCBmb3IgJXMiLAorCQkgaW5vZGUsIGZpbGUtPmZfZmxhZ3MsZnVsbF9wYXRoKSk7CisJZGVzaXJlZEFjY2VzcyA9IGNpZnNfY29udmVydF9mbGFncyhmaWxlLT5mX2ZsYWdzKTsKKworCWlmIChvcGxvY2tFbmFibGVkKQorCQlvcGxvY2sgPSBSRVFfT1BMT0NLOworCWVsc2UKKwkJb3Bsb2NrID0gRkFMU0U7CisKKwkvKiBDYW4gbm90IHJlZnJlc2ggaW5vZGUgYnkgcGFzc2luZyBpbiBmaWxlX2luZm8gYnVmIHRvIGJlIHJldHVybmVkCisJICAgYnkgU01CT3BlbiBhbmQgdGhlbiBjYWxsaW5nIGdldF9pbm9kZV9pbmZvIHdpdGggcmV0dXJuZWQgYnVmIAorCSAgIHNpbmNlIGZpbGUgbWlnaHQgaGF2ZSB3cml0ZSBiZWhpbmQgZGF0YSB0aGF0IG5lZWRzIHRvIGJlIGZsdXNoZWQgCisJICAgYW5kIHNlcnZlciB2ZXJzaW9uIG9mIGZpbGUgc2l6ZSBjYW4gYmUgc3RhbGUuIElmIHdlIGtuZXcgZm9yIHN1cmUKKwkgICB0aGF0IGlub2RlIHdhcyBub3QgZGlydHkgbG9jYWxseSB3ZSBjb3VsZCBkbyB0aGlzICovCisKKy8qCWJ1ZiA9IGttYWxsb2Moc2l6ZW9mKEZJTEVfQUxMX0lORk8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoYnVmID09IDApIHsKKwkJdXAoJnBDaWZzRmlsZS0+Zmhfc2VtKTsKKwkJa2ZyZWUoZnVsbF9wYXRoKTsKKwkJRnJlZVhpZCh4aWQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9ICovCisJcmMgPSBDSUZTU01CT3Blbih4aWQsIHBUY29uLCBmdWxsX3BhdGgsIGRpc3Bvc2l0aW9uLCBkZXNpcmVkQWNjZXNzLAorCQkJIENSRUFURV9OT1RfRElSLCAmbmV0ZmlkLCAmb3Bsb2NrLCBOVUxMLAorCQkJIGNpZnNfc2ItPmxvY2FsX25scyk7CisJaWYgKHJjKSB7CisJCXVwKCZwQ2lmc0ZpbGUtPmZoX3NlbSk7CisJCWNGWUkoMSwgKCJjaWZzX29wZW4gcmV0dXJuZWQgMHgleCAiLCByYykpOworCQljRllJKDEsICgib3Bsb2NrOiAlZCAiLCBvcGxvY2spKTsKKwl9IGVsc2UgeworCQlwQ2lmc0ZpbGUtPm5ldGZpZCA9IG5ldGZpZDsKKwkJcENpZnNGaWxlLT5pbnZhbGlkSGFuZGxlID0gRkFMU0U7CisJCXVwKCZwQ2lmc0ZpbGUtPmZoX3NlbSk7CisJCXBDaWZzSW5vZGUgPSBDSUZTX0koaW5vZGUpOworCQlpZiAocENpZnNJbm9kZSkgeworCQkJaWYgKGNhbl9mbHVzaCkgeworCQkJCWZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS0+aV9tYXBwaW5nKTsKKwkJCQlmaWxlbWFwX2ZkYXRhd2FpdChpbm9kZS0+aV9tYXBwaW5nKTsKKwkJCS8qIHRlbXBvcmFyaWx5IGRpc2FibGUgY2FjaGluZyB3aGlsZSB3ZQorCQkJICAgZ28gdG8gc2VydmVyIHRvIGdldCBpbm9kZSBpbmZvICovCisJCQkJcENpZnNJbm9kZS0+Y2xpZW50Q2FuQ2FjaGVBbGwgPSBGQUxTRTsKKwkJCQlwQ2lmc0lub2RlLT5jbGllbnRDYW5DYWNoZVJlYWQgPSBGQUxTRTsKKwkJCQlpZiAocFRjb24tPnNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX1VOSVgpCisJCQkJCXJjID0gY2lmc19nZXRfaW5vZGVfaW5mb191bml4KCZpbm9kZSwKKwkJCQkJCWZ1bGxfcGF0aCwgaW5vZGUtPmlfc2IsIHhpZCk7CisJCQkJZWxzZQorCQkJCQlyYyA9IGNpZnNfZ2V0X2lub2RlX2luZm8oJmlub2RlLAorCQkJCQkJZnVsbF9wYXRoLCBOVUxMLCBpbm9kZS0+aV9zYiwKKwkJCQkJCXhpZCk7CisJCQl9IC8qIGVsc2Ugd2UgYXJlIHdyaXRpbmcgb3V0IGRhdGEgdG8gc2VydmVyIGFscmVhZHkKKwkJCSAgICAgYW5kIGNvdWxkIGRlYWRsb2NrIGlmIHdlIHRyaWVkIHRvIGZsdXNoIGRhdGEsIGFuZAorCQkJICAgICBzaW5jZSB3ZSBkbyBub3Qga25vdyBpZiB3ZSBoYXZlIGRhdGEgdGhhdCB3b3VsZAorCQkJICAgICBpbnZhbGlkYXRlIHRoZSBjdXJyZW50IGVuZCBvZiBmaWxlIG9uIHRoZSBzZXJ2ZXIKKwkJCSAgICAgd2UgY2FuIG5vdCBnbyB0byB0aGUgc2VydmVyIHRvIGdldCB0aGUgbmV3IGlub2QKKwkJCSAgICAgaW5mbyAqLworCQkJaWYgKChvcGxvY2sgJiAweEYpID09IE9QTE9DS19FWENMVVNJVkUpIHsKKwkJCQlwQ2lmc0lub2RlLT5jbGllbnRDYW5DYWNoZUFsbCA9IFRSVUU7CisJCQkJcENpZnNJbm9kZS0+Y2xpZW50Q2FuQ2FjaGVSZWFkID0gVFJVRTsKKwkJCQljRllJKDEsICgiRXhjbHVzaXZlIE9wbG9jayBncmFudGVkIG9uIGlub2RlICVwIiwKKwkJCQkJIGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKSk7CisJCQl9IGVsc2UgaWYgKChvcGxvY2sgJiAweEYpID09IE9QTE9DS19SRUFEKSB7CisJCQkJcENpZnNJbm9kZS0+Y2xpZW50Q2FuQ2FjaGVSZWFkID0gVFJVRTsKKwkJCQlwQ2lmc0lub2RlLT5jbGllbnRDYW5DYWNoZUFsbCA9IEZBTFNFOworCQkJfSBlbHNlIHsKKwkJCQlwQ2lmc0lub2RlLT5jbGllbnRDYW5DYWNoZVJlYWQgPSBGQUxTRTsKKwkJCQlwQ2lmc0lub2RlLT5jbGllbnRDYW5DYWNoZUFsbCA9IEZBTFNFOworCQkJfQorCQkJY2lmc19yZWxvY2tfZmlsZShwQ2lmc0ZpbGUpOworCQl9CisJfQorCisJa2ZyZWUoZnVsbF9wYXRoKTsKKwlGcmVlWGlkKHhpZCk7CisJcmV0dXJuIHJjOworfQorCitpbnQgY2lmc19jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgcmMgPSAwOworCWludCB4aWQ7CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYjsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKwlzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpwU01CRmlsZSA9CisJCShzdHJ1Y3QgY2lmc0ZpbGVJbmZvICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJeGlkID0gR2V0WGlkKCk7CisKKwljaWZzX3NiID0gQ0lGU19TQihpbm9kZS0+aV9zYik7CisJcFRjb24gPSBjaWZzX3NiLT50Y29uOworCWlmIChwU01CRmlsZSkgeworCQlwU01CRmlsZS0+Y2xvc2VQZW5kID0gVFJVRTsKKwkJd3JpdGVfbG9jaygmZmlsZS0+Zl9vd25lci5sb2NrKTsKKwkJaWYgKHBUY29uKSB7CisJCQkvKiBubyBzZW5zZSByZWNvbm5lY3RpbmcgdG8gY2xvc2UgYSBmaWxlIHRoYXQgaXMKKwkJCSAgIGFscmVhZHkgY2xvc2VkICovCisJCQlpZiAocFRjb24tPnRpZFN0YXR1cyAhPSBDaWZzTmVlZFJlY29ubmVjdCkgeworCQkJCXdyaXRlX3VubG9jaygmZmlsZS0+Zl9vd25lci5sb2NrKTsKKwkJCQlyYyA9IENJRlNTTUJDbG9zZSh4aWQsIHBUY29uLAorCQkJCQkJICBwU01CRmlsZS0+bmV0ZmlkKTsKKwkJCQl3cml0ZV9sb2NrKCZmaWxlLT5mX293bmVyLmxvY2spOworCQkJfQorCQl9CisJCWxpc3RfZGVsKCZwU01CRmlsZS0+Zmxpc3QpOworCQlsaXN0X2RlbCgmcFNNQkZpbGUtPnRsaXN0KTsKKwkJd3JpdGVfdW5sb2NrKCZmaWxlLT5mX293bmVyLmxvY2spOworCQlrZnJlZShwU01CRmlsZS0+c2VhcmNoX3Jlc3VtZV9uYW1lKTsKKwkJa2ZyZWUoZmlsZS0+cHJpdmF0ZV9kYXRhKTsKKwkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwl9IGVsc2UKKwkJcmMgPSAtRUJBREY7CisKKwlpZiAobGlzdF9lbXB0eSgmKENJRlNfSShpbm9kZSktPm9wZW5GaWxlTGlzdCkpKSB7CisJCWNGWUkoMSwgKCJjbG9zaW5nIGxhc3Qgb3BlbiBpbnN0YW5jZSBmb3IgaW5vZGUgJXAiLCBpbm9kZSkpOworCQkvKiBpZiB0aGUgZmlsZSBpcyBub3Qgb3BlbiB3ZSBkbyBub3Qga25vdyBpZiB3ZSBjYW4gY2FjaGUgaW5mbworCQkgICBvbiB0aGlzIGlub2RlLCBtdWNoIGxlc3Mgd3JpdGUgYmVoaW5kIGFuZCByZWFkIGFoZWFkICovCisJCUNJRlNfSShpbm9kZSktPmNsaWVudENhbkNhY2hlUmVhZCA9IEZBTFNFOworCQlDSUZTX0koaW5vZGUpLT5jbGllbnRDYW5DYWNoZUFsbCAgPSBGQUxTRTsKKwl9CisJaWYgKChyYyA9PTApICYmIENJRlNfSShpbm9kZSktPndyaXRlX2JlaGluZF9yYykKKwkJcmMgPSBDSUZTX0koaW5vZGUpLT53cml0ZV9iZWhpbmRfcmM7CisJRnJlZVhpZCh4aWQpOworCXJldHVybiByYzsKK30KKworaW50IGNpZnNfY2xvc2VkaXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IHJjID0gMDsKKwlpbnQgeGlkOworCXN0cnVjdCBjaWZzRmlsZUluZm8gKnBDRmlsZVN0cnVjdCA9CisJICAgIChzdHJ1Y3QgY2lmc0ZpbGVJbmZvICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgKnB0bXA7CisKKwljRllJKDEsICgiQ2xvc2VkaXIgaW5vZGUgPSAweCVwIHdpdGggIiwgaW5vZGUpKTsKKworCXhpZCA9IEdldFhpZCgpOworCisJaWYgKHBDRmlsZVN0cnVjdCkgeworCQlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKwkJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYiA9IENJRlNfU0IoZmlsZS0+Zl9kZW50cnktPmRfc2IpOworCisJCXBUY29uID0gY2lmc19zYi0+dGNvbjsKKworCQljRllJKDEsICgiRnJlZWluZyBwcml2YXRlIGRhdGEgaW4gY2xvc2UgZGlyIikpOworCQlpZiAocENGaWxlU3RydWN0LT5zcmNoX2luZi5lbmRPZlNlYXJjaCA9PSBGQUxTRSkgeworCQkJcENGaWxlU3RydWN0LT5pbnZhbGlkSGFuZGxlID0gVFJVRTsKKwkJCXJjID0gQ0lGU0ZpbmRDbG9zZSh4aWQsIHBUY29uLCBwQ0ZpbGVTdHJ1Y3QtPm5ldGZpZCk7CisJCQljRllJKDEsICgiQ2xvc2luZyB1bmNvbXBsZXRlZCByZWFkZGlyIHdpdGggcmMgJWQiLAorCQkJCSByYykpOworCQkJLyogbm90IG11Y2ggd2UgY2FuIGRvIGlmIGl0IGZhaWxzIGFueXdheSwgaWdub3JlIHJjICovCisJCQlyYyA9IDA7CisJCX0KKwkJcHRtcCA9IHBDRmlsZVN0cnVjdC0+c3JjaF9pbmYubnR3cmtfYnVmX3N0YXJ0OworCQlpZiAocHRtcCkgeworICAgLyogQkIgcmVtb3ZlbWUgQkIgKi8JY0ZZSSgxLCAoImZyZWVpbmcgc21iIGJ1ZiBpbiBzcmNoIHN0cnVjdCBpbiBjbG9zZWRpciIpKTsKKwkJCXBDRmlsZVN0cnVjdC0+c3JjaF9pbmYubnR3cmtfYnVmX3N0YXJ0ID0gTlVMTDsKKwkJCWNpZnNfYnVmX3JlbGVhc2UocHRtcCk7CisJCX0KKwkJcHRtcCA9IHBDRmlsZVN0cnVjdC0+c2VhcmNoX3Jlc3VtZV9uYW1lOworCQlpZiAocHRtcCkgeworICAgLyogQkIgcmVtb3ZlbWUgQkIgKi8JY0ZZSSgxLCAoImZyZWVpbmcgcmVzdW1lIG5hbWUgaW4gY2xvc2VkaXIiKSk7CisJCQlwQ0ZpbGVTdHJ1Y3QtPnNlYXJjaF9yZXN1bWVfbmFtZSA9IE5VTEw7CisJCQlrZnJlZShwdG1wKTsKKwkJfQorCQlrZnJlZShmaWxlLT5wcml2YXRlX2RhdGEpOworCQlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCX0KKwkvKiBCQiBjYW4gd2UgbG9jayB0aGUgZmlsZXN0cnVjdCB3aGlsZSB0aGlzIGlzIGdvaW5nIG9uPyAqLworCUZyZWVYaWQoeGlkKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBjaWZzX2xvY2soc3RydWN0IGZpbGUgKmZpbGUsIGludCBjbWQsIHN0cnVjdCBmaWxlX2xvY2sgKnBmTG9jaykKK3sKKwlpbnQgcmMsIHhpZDsKKwlfX3UzMiBsb2NrVHlwZSA9IExPQ0tJTkdfQU5EWF9MQVJHRV9GSUxFUzsKKwlfX3UzMiBudW1Mb2NrID0gMDsKKwlfX3UzMiBudW1VbmxvY2sgPSAwOworCV9fdTY0IGxlbmd0aDsKKwlpbnQgd2FpdF9mbGFnID0gRkFMU0U7CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYjsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKworCWxlbmd0aCA9IDEgKyBwZkxvY2stPmZsX2VuZCAtIHBmTG9jay0+Zmxfc3RhcnQ7CisJcmMgPSAtRUFDQ0VTOworCXhpZCA9IEdldFhpZCgpOworCisJY0ZZSSgxLCAoIkxvY2sgcGFybTogMHgleCBmbG9ja2ZsYWdzOiAiCisJCSAiMHgleCBmbG9ja3R5cGU6IDB4JXggc3RhcnQ6ICVsbGQgZW5kOiAlbGxkIiwKKwkgICAgICAgIGNtZCwgcGZMb2NrLT5mbF9mbGFncywgcGZMb2NrLT5mbF90eXBlLCBwZkxvY2stPmZsX3N0YXJ0LAorCSAgICAgICAgcGZMb2NrLT5mbF9lbmQpKTsKKworCWlmIChwZkxvY2stPmZsX2ZsYWdzICYgRkxfUE9TSVgpCisJCWNGWUkoMSwgKCJQb3NpeCAiKSk7CisJaWYgKHBmTG9jay0+ZmxfZmxhZ3MgJiBGTF9GTE9DSykKKwkJY0ZZSSgxLCAoIkZsb2NrICIpKTsKKwlpZiAocGZMb2NrLT5mbF9mbGFncyAmIEZMX1NMRUVQKSB7CisJCWNGWUkoMSwgKCJCbG9ja2luZyBsb2NrICIpKTsKKwkJd2FpdF9mbGFnID0gVFJVRTsKKwl9CisJaWYgKHBmTG9jay0+ZmxfZmxhZ3MgJiBGTF9BQ0NFU1MpCisJCWNGWUkoMSwgKCJQcm9jZXNzIHN1c3BlbmRlZCBieSBtYW5kYXRvcnkgbG9ja2luZyAtICIKKwkJCSAibm90IGltcGxlbWVudGVkIHlldCAiKSk7CisJaWYgKHBmTG9jay0+ZmxfZmxhZ3MgJiBGTF9MRUFTRSkKKwkJY0ZZSSgxLCAoIkxlYXNlIG9uIGZpbGUgLSBub3QgaW1wbGVtZW50ZWQgeWV0IikpOworCWlmIChwZkxvY2stPmZsX2ZsYWdzICYgCisJICAgICh+KEZMX1BPU0lYIHwgRkxfRkxPQ0sgfCBGTF9TTEVFUCB8IEZMX0FDQ0VTUyB8IEZMX0xFQVNFKSkpCisJCWNGWUkoMSwgKCJVbmtub3duIGxvY2sgZmxhZ3MgMHgleCIsIHBmTG9jay0+ZmxfZmxhZ3MpKTsKKworCWlmIChwZkxvY2stPmZsX3R5cGUgPT0gRl9XUkxDSykgeworCQljRllJKDEsICgiRl9XUkxDSyAiKSk7CisJCW51bUxvY2sgPSAxOworCX0gZWxzZSBpZiAocGZMb2NrLT5mbF90eXBlID09IEZfVU5MQ0spIHsKKwkJY0ZZSSgxLCAoIkZfVU5MQ0sgIikpOworCQludW1VbmxvY2sgPSAxOworCX0gZWxzZSBpZiAocGZMb2NrLT5mbF90eXBlID09IEZfUkRMQ0spIHsKKwkJY0ZZSSgxLCAoIkZfUkRMQ0sgIikpOworCQlsb2NrVHlwZSB8PSBMT0NLSU5HX0FORFhfU0hBUkVEX0xPQ0s7CisJCW51bUxvY2sgPSAxOworCX0gZWxzZSBpZiAocGZMb2NrLT5mbF90eXBlID09IEZfRVhMQ0spIHsKKwkJY0ZZSSgxLCAoIkZfRVhMQ0sgIikpOworCQludW1Mb2NrID0gMTsKKwl9IGVsc2UgaWYgKHBmTG9jay0+ZmxfdHlwZSA9PSBGX1NITENLKSB7CisJCWNGWUkoMSwgKCJGX1NITENLICIpKTsKKwkJbG9ja1R5cGUgfD0gTE9DS0lOR19BTkRYX1NIQVJFRF9MT0NLOworCQludW1Mb2NrID0gMTsKKwl9IGVsc2UKKwkJY0ZZSSgxLCAoIlVua25vd24gdHlwZSBvZiBsb2NrICIpKTsKKworCWNpZnNfc2IgPSBDSUZTX1NCKGZpbGUtPmZfZGVudHJ5LT5kX3NiKTsKKwlwVGNvbiA9IGNpZnNfc2ItPnRjb247CisKKwlpZiAoZmlsZS0+cHJpdmF0ZV9kYXRhID09IE5VTEwpIHsKKwkJRnJlZVhpZCh4aWQpOworCQlyZXR1cm4gLUVCQURGOworCX0KKworCWlmIChJU19HRVRMSyhjbWQpKSB7CisJCXJjID0gQ0lGU1NNQkxvY2soeGlkLCBwVGNvbiwKKwkJCQkgKChzdHJ1Y3QgY2lmc0ZpbGVJbmZvICopZmlsZS0+CisJCQkJICBwcml2YXRlX2RhdGEpLT5uZXRmaWQsCisJCQkJIGxlbmd0aCwKKwkJCQkgcGZMb2NrLT5mbF9zdGFydCwgMCwgMSwgbG9ja1R5cGUsCisJCQkJIDAgLyogd2FpdCBmbGFnICovICk7CisJCWlmIChyYyA9PSAwKSB7CisJCQlyYyA9IENJRlNTTUJMb2NrKHhpZCwgcFRjb24sCisJCQkJCSAoKHN0cnVjdCBjaWZzRmlsZUluZm8gKikgZmlsZS0+CisJCQkJCSAgcHJpdmF0ZV9kYXRhKS0+bmV0ZmlkLAorCQkJCQkgbGVuZ3RoLAorCQkJCQkgcGZMb2NrLT5mbF9zdGFydCwgMSAvKiBudW1VbmxvY2sgKi8gLAorCQkJCQkgMCAvKiBudW1Mb2NrICovICwgbG9ja1R5cGUsCisJCQkJCSAwIC8qIHdhaXQgZmxhZyAqLyApOworCQkJcGZMb2NrLT5mbF90eXBlID0gRl9VTkxDSzsKKwkJCWlmIChyYyAhPSAwKQorCQkJCWNFUlJPUigxLCAoIkVycm9yIHVubG9ja2luZyBwcmV2aW91c2x5IGxvY2tlZCAiCisJCQkJCSAgICJyYW5nZSAlZCBkdXJpbmcgdGVzdCBvZiBsb2NrICIsCisJCQkJCSAgIHJjKSk7CisJCQlyYyA9IDA7CisKKwkJfSBlbHNlIHsKKwkJCS8qIGlmIHJjID09IEVSUl9TSEFSSU5HX1ZJT0xBVElPTiA/ICovCisJCQlyYyA9IDA7CS8qIGRvIG5vdCBjaGFuZ2UgbG9jayB0eXBlIHRvIHVubG9jaworCQkJCSAgIHNpbmNlIHJhbmdlIGluIHVzZSAqLworCQl9CisKKwkJRnJlZVhpZCh4aWQpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSBDSUZTU01CTG9jayh4aWQsIHBUY29uLAorCQkJICgoc3RydWN0IGNpZnNGaWxlSW5mbyAqKSBmaWxlLT5wcml2YXRlX2RhdGEpLT4KKwkJCSBuZXRmaWQsIGxlbmd0aCwKKwkJCSBwZkxvY2stPmZsX3N0YXJ0LCBudW1VbmxvY2ssIG51bUxvY2ssIGxvY2tUeXBlLAorCQkJIHdhaXRfZmxhZyk7CisJaWYgKHJjID09IDAgJiYgKHBmTG9jay0+ZmxfZmxhZ3MgJiBGTF9QT1NJWCkpCisJCXBvc2l4X2xvY2tfZmlsZV93YWl0KGZpbGUsIHBmTG9jayk7CisJRnJlZVhpZCh4aWQpOworCXJldHVybiByYzsKK30KKworc3NpemVfdCBjaWZzX3VzZXJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp3cml0ZV9kYXRhLAorCXNpemVfdCB3cml0ZV9zaXplLCBsb2ZmX3QgKnBvZmZzZXQpCit7CisJaW50IHJjID0gMDsKKwl1bnNpZ25lZCBpbnQgYnl0ZXNfd3JpdHRlbiA9IDA7CisJdW5zaWduZWQgaW50IHRvdGFsX3dyaXR0ZW47CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYjsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKwlpbnQgeGlkLCBsb25nX29wOworCXN0cnVjdCBjaWZzRmlsZUluZm8gKm9wZW5fZmlsZTsKKworCWlmIChmaWxlLT5mX2RlbnRyeSA9PSBOVUxMKQorCQlyZXR1cm4gLUVCQURGOworCisJY2lmc19zYiA9IENJRlNfU0IoZmlsZS0+Zl9kZW50cnktPmRfc2IpOworCWlmIChjaWZzX3NiID09IE5VTEwpCisJCXJldHVybiAtRUJBREY7CisKKwlwVGNvbiA9IGNpZnNfc2ItPnRjb247CisKKwkvKiBjRllJKDEsCisJICAgKCIgd3JpdGUgJWQgYnl0ZXMgdG8gb2Zmc2V0ICVsbGQgb2YgJXMiLCB3cml0ZV9zaXplLAorCSAgICpwb2Zmc2V0LCBmaWxlLT5mX2RlbnRyeS0+ZF9uYW1lLm5hbWUpKTsgKi8KKworCWlmIChmaWxlLT5wcml2YXRlX2RhdGEgPT0gTlVMTCkKKwkJcmV0dXJuIC1FQkFERjsKKwllbHNlCisJCW9wZW5fZmlsZSA9IChzdHJ1Y3QgY2lmc0ZpbGVJbmZvICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwkKKwl4aWQgPSBHZXRYaWQoKTsKKwlpZiAoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUgPT0gTlVMTCkgeworCQlGcmVlWGlkKHhpZCk7CisJCXJldHVybiAtRUJBREY7CisJfQorCisJaWYgKCpwb2Zmc2V0ID4gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2l6ZSkKKwkJbG9uZ19vcCA9IDI7IC8qIHdyaXRlcyBwYXN0IGVuZCBvZiBmaWxlIGNhbiB0YWtlIGEgbG9uZyB0aW1lICovCisJZWxzZQorCQlsb25nX29wID0gMTsKKworCWZvciAodG90YWxfd3JpdHRlbiA9IDA7IHdyaXRlX3NpemUgPiB0b3RhbF93cml0dGVuOworCSAgICAgdG90YWxfd3JpdHRlbiArPSBieXRlc193cml0dGVuKSB7CisJCXJjID0gLUVBR0FJTjsKKwkJd2hpbGUgKHJjID09IC1FQUdBSU4pIHsKKwkJCWlmIChmaWxlLT5wcml2YXRlX2RhdGEgPT0gTlVMTCkgeworCQkJCS8qIGZpbGUgaGFzIGJlZW4gY2xvc2VkIG9uIHVzICovCisJCQkJRnJlZVhpZCh4aWQpOworCQkJLyogaWYgd2UgaGF2ZSBnb3R0ZW4gaGVyZSB3ZSBoYXZlIHdyaXR0ZW4gc29tZSBkYXRhCisJCQkgICBhbmQgYmxvY2tlZCwgYW5kIHRoZSBmaWxlIGhhcyBiZWVuIGZyZWVkIG9uIHVzIHdoaWxlCisJCQkgICB3ZSBibG9ja2VkIHNvIHJldHVybiB3aGF0IHdlIG1hbmFnZWQgdG8gd3JpdGUgKi8KKwkJCQlyZXR1cm4gdG90YWxfd3JpdHRlbjsKKwkJCX0gCisJCQlpZiAob3Blbl9maWxlLT5jbG9zZVBlbmQpIHsKKwkJCQlGcmVlWGlkKHhpZCk7CisJCQkJaWYgKHRvdGFsX3dyaXR0ZW4pCisJCQkJCXJldHVybiB0b3RhbF93cml0dGVuOworCQkJCWVsc2UKKwkJCQkJcmV0dXJuIC1FQkFERjsKKwkJCX0KKwkJCWlmIChvcGVuX2ZpbGUtPmludmFsaWRIYW5kbGUpIHsKKwkJCQlpZiAoKGZpbGUtPmZfZGVudHJ5ID09IE5VTEwpIHx8CisJCQkJICAgIChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSA9PSBOVUxMKSkgeworCQkJCQlGcmVlWGlkKHhpZCk7CisJCQkJCXJldHVybiB0b3RhbF93cml0dGVuOworCQkJCX0KKwkJCQkvKiB3ZSBjb3VsZCBkZWFkbG9jayBpZiB3ZSBjYWxsZWQKKwkJCQkgICBmaWxlbWFwX2ZkYXRhd2FpdCBmcm9tIGhlcmUgc28gdGVsbAorCQkJCSAgIHJlb3Blbl9maWxlIG5vdCB0byBmbHVzaCBkYXRhIHRvIHNlcnZlcgorCQkJCSAgIG5vdyAqLworCQkJCXJjID0gY2lmc19yZW9wZW5fZmlsZShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwKKwkJCQkJZmlsZSwgRkFMU0UpOworCQkJCWlmIChyYyAhPSAwKQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJcmMgPSBDSUZTU01CV3JpdGUoeGlkLCBwVGNvbiwKKwkJCQlvcGVuX2ZpbGUtPm5ldGZpZCwKKwkJCQltaW5fdChjb25zdCBpbnQsIGNpZnNfc2ItPndzaXplLAorCQkJCSAgICAgIHdyaXRlX3NpemUgLSB0b3RhbF93cml0dGVuKSwKKwkJCQkqcG9mZnNldCwgJmJ5dGVzX3dyaXR0ZW4sCisJCQkJTlVMTCwgd3JpdGVfZGF0YSArIHRvdGFsX3dyaXR0ZW4sIGxvbmdfb3ApOworCQl9CisJCWlmIChyYyB8fCAoYnl0ZXNfd3JpdHRlbiA9PSAwKSkgeworCQkJaWYgKHRvdGFsX3dyaXR0ZW4pCisJCQkJYnJlYWs7CisJCQllbHNlIHsKKwkJCQlGcmVlWGlkKHhpZCk7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCQl9IGVsc2UKKwkJCSpwb2Zmc2V0ICs9IGJ5dGVzX3dyaXR0ZW47CisJCWxvbmdfb3AgPSBGQUxTRTsgLyogc3Vic2VxdWVudCB3cml0ZXMgZmFzdCAtCisJCQkJICAgIDE1IHNlY29uZHMgaXMgcGxlbnR5ICovCisJfQorCisjaWZkZWYgQ09ORklHX0NJRlNfU1RBVFMKKwlpZiAodG90YWxfd3JpdHRlbiA+IDApIHsKKwkJYXRvbWljX2luYygmcFRjb24tPm51bV93cml0ZXMpOworCQlzcGluX2xvY2soJnBUY29uLT5zdGF0X2xvY2spOworCQlwVGNvbi0+Ynl0ZXNfd3JpdHRlbiArPSB0b3RhbF93cml0dGVuOworCQlzcGluX3VubG9jaygmcFRjb24tPnN0YXRfbG9jayk7CisJfQorI2VuZGlmCQkKKworCS8qIHNpbmNlIHRoZSB3cml0ZSBtYXkgaGF2ZSBibG9ja2VkIGNoZWNrIHRoZXNlIHBvaW50ZXJzIGFnYWluICovCisJaWYgKGZpbGUtPmZfZGVudHJ5KSB7CisJCWlmIChmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSkgeworCQkJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCQkJaW5vZGUtPmlfY3RpbWUgPSBpbm9kZS0+aV9tdGltZSA9CisJCQkJY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKKwkJCWlmICh0b3RhbF93cml0dGVuID4gMCkgeworCQkJCWlmICgqcG9mZnNldCA+IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NpemUpCisJCQkJCWlfc2l6ZV93cml0ZShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwKKwkJCQkJKnBvZmZzZXQpOworCQkJfQorCQkJbWFya19pbm9kZV9kaXJ0eV9zeW5jKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwkJfQorCX0KKwlGcmVlWGlkKHhpZCk7CisJcmV0dXJuIHRvdGFsX3dyaXR0ZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNpZnNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKndyaXRlX2RhdGEsCisJc2l6ZV90IHdyaXRlX3NpemUsIGxvZmZfdCAqcG9mZnNldCkKK3sKKwlpbnQgcmMgPSAwOworCXVuc2lnbmVkIGludCBieXRlc193cml0dGVuID0gMDsKKwl1bnNpZ25lZCBpbnQgdG90YWxfd3JpdHRlbjsKKwlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiOworCXN0cnVjdCBjaWZzVGNvbkluZm8gKnBUY29uOworCWludCB4aWQsIGxvbmdfb3A7CisJc3RydWN0IGNpZnNGaWxlSW5mbyAqb3Blbl9maWxlOworCisJaWYgKGZpbGUtPmZfZGVudHJ5ID09IE5VTEwpCisJCXJldHVybiAtRUJBREY7CisKKwljaWZzX3NiID0gQ0lGU19TQihmaWxlLT5mX2RlbnRyeS0+ZF9zYik7CisJaWYgKGNpZnNfc2IgPT0gTlVMTCkKKwkJcmV0dXJuIC1FQkFERjsKKworCXBUY29uID0gY2lmc19zYi0+dGNvbjsKKworCS8qIGNGWUkoMSwKKwkgICAoIiB3cml0ZSAlZCBieXRlcyB0byBvZmZzZXQgJWxsZCBvZiAlcyIsIHdyaXRlX3NpemUsCisJICAgKnBvZmZzZXQsIGZpbGUtPmZfZGVudHJ5LT5kX25hbWUubmFtZSkpOyAqLworCisJaWYgKGZpbGUtPnByaXZhdGVfZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gLUVCQURGOworCWVsc2UKKwkJb3Blbl9maWxlID0gKHN0cnVjdCBjaWZzRmlsZUluZm8gKilmaWxlLT5wcml2YXRlX2RhdGE7CisJCisJeGlkID0gR2V0WGlkKCk7CisJaWYgKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlID09IE5VTEwpIHsKKwkJRnJlZVhpZCh4aWQpOworCQlyZXR1cm4gLUVCQURGOworCX0KKworCWlmICgqcG9mZnNldCA+IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NpemUpCisJCWxvbmdfb3AgPSAyOyAvKiB3cml0ZXMgcGFzdCBlbmQgb2YgZmlsZSBjYW4gdGFrZSBhIGxvbmcgdGltZSAqLworCWVsc2UKKwkJbG9uZ19vcCA9IDE7CisKKwlmb3IgKHRvdGFsX3dyaXR0ZW4gPSAwOyB3cml0ZV9zaXplID4gdG90YWxfd3JpdHRlbjsKKwkgICAgIHRvdGFsX3dyaXR0ZW4gKz0gYnl0ZXNfd3JpdHRlbikgeworCQlyYyA9IC1FQUdBSU47CisJCXdoaWxlIChyYyA9PSAtRUFHQUlOKSB7CisJCQlpZiAoZmlsZS0+cHJpdmF0ZV9kYXRhID09IE5VTEwpIHsKKwkJCQkvKiBmaWxlIGhhcyBiZWVuIGNsb3NlZCBvbiB1cyAqLworCQkJCUZyZWVYaWQoeGlkKTsKKwkJCS8qIGlmIHdlIGhhdmUgZ290dGVuIGhlcmUgd2UgaGF2ZSB3cml0dGVuIHNvbWUgZGF0YQorCQkJICAgYW5kIGJsb2NrZWQsIGFuZCB0aGUgZmlsZSBoYXMgYmVlbiBmcmVlZCBvbiB1cworCQkJICAgd2hpbGUgd2UgYmxvY2tlZCBzbyByZXR1cm4gd2hhdCB3ZSBtYW5hZ2VkIHRvIAorCQkJICAgd3JpdGUgKi8KKwkJCQlyZXR1cm4gdG90YWxfd3JpdHRlbjsKKwkJCX0gCisJCQlpZiAob3Blbl9maWxlLT5jbG9zZVBlbmQpIHsKKwkJCQlGcmVlWGlkKHhpZCk7CisJCQkJaWYgKHRvdGFsX3dyaXR0ZW4pCisJCQkJCXJldHVybiB0b3RhbF93cml0dGVuOworCQkJCWVsc2UKKwkJCQkJcmV0dXJuIC1FQkFERjsKKwkJCX0KKwkJCWlmIChvcGVuX2ZpbGUtPmludmFsaWRIYW5kbGUpIHsKKwkJCQlpZiAoKGZpbGUtPmZfZGVudHJ5ID09IE5VTEwpIHx8CisJCQkJICAgKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlID09IE5VTEwpKSB7CisJCQkJCUZyZWVYaWQoeGlkKTsKKwkJCQkJcmV0dXJuIHRvdGFsX3dyaXR0ZW47CisJCQkJfQorCQkJCS8qIHdlIGNvdWxkIGRlYWRsb2NrIGlmIHdlIGNhbGxlZAorCQkJCSAgIGZpbGVtYXBfZmRhdGF3YWl0IGZyb20gaGVyZSBzbyB0ZWxsCisJCQkJICAgcmVvcGVuX2ZpbGUgbm90IHRvIGZsdXNoIGRhdGEgdG8gCisJCQkJICAgc2VydmVyIG5vdyAqLworCQkJCXJjID0gY2lmc19yZW9wZW5fZmlsZShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwKKwkJCQkJZmlsZSwgRkFMU0UpOworCQkJCWlmIChyYyAhPSAwKQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJcmMgPSBDSUZTU01CV3JpdGUoeGlkLCBwVGNvbiwKKwkJCQkgb3Blbl9maWxlLT5uZXRmaWQsCisJCQkJIG1pbl90KGNvbnN0IGludCwgY2lmc19zYi0+d3NpemUsIAorCQkJCSAgICAgICB3cml0ZV9zaXplIC0gdG90YWxfd3JpdHRlbiksCisJCQkJICpwb2Zmc2V0LCAmYnl0ZXNfd3JpdHRlbiwKKwkJCQkgd3JpdGVfZGF0YSArIHRvdGFsX3dyaXR0ZW4sIE5VTEwsIGxvbmdfb3ApOworCQl9CisJCWlmIChyYyB8fCAoYnl0ZXNfd3JpdHRlbiA9PSAwKSkgeworCQkJaWYgKHRvdGFsX3dyaXR0ZW4pCisJCQkJYnJlYWs7CisJCQllbHNlIHsKKwkJCQlGcmVlWGlkKHhpZCk7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCQl9IGVsc2UKKwkJCSpwb2Zmc2V0ICs9IGJ5dGVzX3dyaXR0ZW47CisJCWxvbmdfb3AgPSBGQUxTRTsgLyogc3Vic2VxdWVudCB3cml0ZXMgZmFzdCAtIAorCQkJCSAgICAxNSBzZWNvbmRzIGlzIHBsZW50eSAqLworCX0KKworI2lmZGVmIENPTkZJR19DSUZTX1NUQVRTCisJaWYgKHRvdGFsX3dyaXR0ZW4gPiAwKSB7CisJCWF0b21pY19pbmMoJnBUY29uLT5udW1fd3JpdGVzKTsKKwkJc3Bpbl9sb2NrKCZwVGNvbi0+c3RhdF9sb2NrKTsKKwkJcFRjb24tPmJ5dGVzX3dyaXR0ZW4gKz0gdG90YWxfd3JpdHRlbjsKKwkJc3Bpbl91bmxvY2soJnBUY29uLT5zdGF0X2xvY2spOworCX0KKyNlbmRpZgkJCisKKwkvKiBzaW5jZSB0aGUgd3JpdGUgbWF5IGhhdmUgYmxvY2tlZCBjaGVjayB0aGVzZSBwb2ludGVycyBhZ2FpbiAqLworCWlmIChmaWxlLT5mX2RlbnRyeSkgeworCQlpZiAoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpIHsKKwkJCWZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX2N0aW1lID0gCisJCQlmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tdGltZSA9IENVUlJFTlRfVElNRTsKKwkJCWlmICh0b3RhbF93cml0dGVuID4gMCkgeworCQkJCWlmICgqcG9mZnNldCA+IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NpemUpCisJCQkJCWlfc2l6ZV93cml0ZShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSwgCisJCQkJCQkgICAgICpwb2Zmc2V0KTsKKwkJCX0KKwkJCW1hcmtfaW5vZGVfZGlydHlfc3luYyhmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJCX0KKwl9CisJRnJlZVhpZCh4aWQpOworCXJldHVybiB0b3RhbF93cml0dGVuOworfQorCitzdGF0aWMgaW50IGNpZnNfcGFydGlhbHBhZ2V3cml0ZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBwYWdlLT5tYXBwaW5nOworCWxvZmZfdCBvZmZzZXQgPSAobG9mZl90KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisJY2hhciAqd3JpdGVfZGF0YTsKKwlpbnQgcmMgPSAtRUZBVUxUOworCWludCBieXRlc193cml0dGVuID0gMDsKKwlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiOworCXN0cnVjdCBjaWZzVGNvbkluZm8gKnBUY29uOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGNpZnNJbm9kZUluZm8gKmNpZnNJbm9kZTsKKwlzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpvcGVuX2ZpbGUgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXAxOworCisJaWYgKCFtYXBwaW5nIHx8ICFtYXBwaW5nLT5ob3N0KQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwljaWZzX3NiID0gQ0lGU19TQihpbm9kZS0+aV9zYik7CisJcFRjb24gPSBjaWZzX3NiLT50Y29uOworCisJb2Zmc2V0ICs9IChsb2ZmX3QpZnJvbTsKKwl3cml0ZV9kYXRhID0ga21hcChwYWdlKTsKKwl3cml0ZV9kYXRhICs9IGZyb207CisKKwlpZiAoKHRvID4gUEFHRV9DQUNIRV9TSVpFKSB8fCAoZnJvbSA+IHRvKSkgeworCQlrdW5tYXAocGFnZSk7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIHJhY2luZyB3aXRoIHRydW5jYXRlPyAqLworCWlmIChvZmZzZXQgPiBtYXBwaW5nLT5ob3N0LT5pX3NpemUpIHsKKwkJa3VubWFwKHBhZ2UpOworCQlyZXR1cm4gMDsgLyogZG9uJ3QgY2FyZSAqLworCX0KKworCS8qIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGFyZSBub3QgZXh0ZW5kaW5nIHRoZSBmaWxlICovCisJaWYgKG1hcHBpbmctPmhvc3QtPmlfc2l6ZSAtIG9mZnNldCA8IChsb2ZmX3QpdG8pCisJCXRvID0gKHVuc2lnbmVkKShtYXBwaW5nLT5ob3N0LT5pX3NpemUgLSBvZmZzZXQpOyAKKworCWNpZnNJbm9kZSA9IENJRlNfSShtYXBwaW5nLT5ob3N0KTsKKwlyZWFkX2xvY2soJkdsb2JhbFNNQlNlc2xvY2spOyAKKwkvKiBCQiB3ZSBzaG91bGQgc3RhcnQgYXQgdGhlIGVuZCAqLworCWxpc3RfZm9yX2VhY2hfc2FmZSh0bXAsIHRtcDEsICZjaWZzSW5vZGUtPm9wZW5GaWxlTGlzdCkgeyAgICAgICAgICAgIAorCQlvcGVuX2ZpbGUgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGNpZnNGaWxlSW5mbywgZmxpc3QpOworCQlpZiAob3Blbl9maWxlLT5jbG9zZVBlbmQpCisJCQljb250aW51ZTsKKwkJLyogV2UgY2hlY2sgaWYgZmlsZSBpcyBvcGVuIGZvciB3cml0aW5nIGZpcnN0ICovCisJCWlmICgob3Blbl9maWxlLT5wZmlsZSkgJiYgCisJCSAgICgob3Blbl9maWxlLT5wZmlsZS0+Zl9mbGFncyAmIE9fUkRXUikgfHwgCisJCQkob3Blbl9maWxlLT5wZmlsZS0+Zl9mbGFncyAmIE9fV1JPTkxZKSkpIHsKKwkJCXJlYWRfdW5sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKwkJCWJ5dGVzX3dyaXR0ZW4gPSBjaWZzX3dyaXRlKG9wZW5fZmlsZS0+cGZpbGUsCisJCQkJCQl3cml0ZV9kYXRhLCB0by1mcm9tLAorCQkJCQkJJm9mZnNldCk7CisJCQlyZWFkX2xvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCQkvKiBEb2VzIG1tIG9yIHZmcyBhbHJlYWR5IHNldCB0aW1lcz8gKi8KKwkJCWlub2RlLT5pX2F0aW1lID0gCisJCQlpbm9kZS0+aV9tdGltZSA9IGN1cnJlbnRfZnNfdGltZShpbm9kZS0+aV9zYik7CisJCQlpZiAoKGJ5dGVzX3dyaXR0ZW4gPiAwKSAmJiAob2Zmc2V0KSkgeworCQkJCXJjID0gMDsKKwkJCX0gZWxzZSBpZiAoYnl0ZXNfd3JpdHRlbiA8IDApIHsKKwkJCQlpZiAocmMgPT0gLUVCQURGKSB7CisJCQkJLyogaGF2ZSBzZWVuIGEgY2FzZSBpbiB3aGljaCBrZXJuZWwgc2VlbWVkIHRvCisJCQkJICAgaGF2ZSBjbG9zZWQvZnJlZWQgYSBmaWxlIGV2ZW4gd2l0aCB3cml0ZXMKKwkJCQkgICBhY3RpdmUgc28gd2UgbWlnaHQgYXMgd2VsbCBzZWUgaWYgdGhlcmUgYXJlCisJCQkJICAgb3RoZXIgZmlsZSBzdHJ1Y3RzIHRvIHRyeSBmb3IgdGhlIHNhbWUKKwkJCQkgICBpbm9kZSBiZWZvcmUgZ2l2aW5nIHVwICovCisJCQkJCWNvbnRpbnVlOworCQkJCX0gZWxzZQorCQkJCQlyYyA9IGJ5dGVzX3dyaXR0ZW47CisJCQl9CisJCQlicmVhazsgIC8qIG5vdyB0aGF0IHdlIGZvdW5kIGEgdmFsaWQgZmlsZSBoYW5kbGUgYW5kCisJCQkJICAgdHJpZWQgdG8gd3JpdGUgdG8gaXQgd2UgYXJlIGRvbmUsIG5vIHNlbnNlCisJCQkJICAgY29udGludWluZyB0byBsb29wIGxvb2tpbmcgZm9yIGFub3RoZXIgKi8KKwkJfQorCQlpZiAodG1wLT5uZXh0ID09IE5VTEwpIHsKKwkJCWNGWUkoMSwgKCJGaWxlIGluc3RhbmNlICVwIHJlbW92ZWQiLCB0bXApKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJlYWRfdW5sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKwlpZiAob3Blbl9maWxlID09IE5VTEwpIHsKKwkJY0ZZSSgxLCAoIk5vIHdyaXRlYWJsZSBmaWxlaGFuZGxlcyBmb3IgaW5vZGUiKSk7CisJCXJjID0gLUVJTzsKKwl9CisKKwlrdW5tYXAocGFnZSk7CisJcmV0dXJuIHJjOworfQorCisjaWYgMAorc3RhdGljIGludCBjaWZzX3dyaXRlcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7CisJaW50IHJjID0gLUVGQVVMVDsKKwlpbnQgeGlkOworCisJeGlkID0gR2V0WGlkKCk7CisKKwkvKiBGaW5kIGNvbnRpZ3VvdXMgcGFnZXMgdGhlbiBpdGVyYXRlIHRocm91Z2ggcmVwZWF0aW5nCisJICAgY2FsbCAxNksgd3JpdGUgdGhlbiBTZXRwYWdldXB0b2RhdGUgb3IgaWYgTEFSR0VfV1JJVEVfWAorCSAgIHN1cHBvcnQgdGhlbiBzZW5kIGxhcmdlciB3cml0ZXMgdmlhIGtldmVjIHNvIGFzIHRvIGVsaW1pbmF0ZQorCSAgIGEgbWVtY3B5ICovCisJRnJlZVhpZCh4aWQpOworCXJldHVybiByYzsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGNpZnNfd3JpdGVwYWdlKHN0cnVjdCBwYWdlKiBwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlpbnQgcmMgPSAtRUZBVUxUOworCWludCB4aWQ7CisKKwl4aWQgPSBHZXRYaWQoKTsKKy8qIEJCIGFkZCBjaGVjayBmb3Igd2JjIGZsYWdzICovCisJcGFnZV9jYWNoZV9nZXQocGFnZSk7CisgICAgICAgIGlmICghUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCWNGWUkoMSwgKCJwcHcgLSBwYWdlIG5vdCB1cCB0byBkYXRlIikpOworCX0KKwkKKwlyYyA9IGNpZnNfcGFydGlhbHBhZ2V3cml0ZShwYWdlLCAwLCBQQUdFX0NBQ0hFX1NJWkUpOworCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsgLyogQkIgYWRkIGNoZWNrIGZvciBlcnJvciBhbmQgQ2xlYXJ1cHRvZGF0ZT8gKi8KKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CQorCUZyZWVYaWQoeGlkKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgY2lmc19jb21taXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLAorCXVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgdG8pCit7CisJaW50IHhpZDsKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCWxvZmZfdCBwb3NpdGlvbiA9ICgobG9mZl90KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpICsgdG87CisJY2hhciAqcGFnZV9kYXRhOworCisJeGlkID0gR2V0WGlkKCk7CisJY0ZZSSgxLCAoImNvbW1pdCB3cml0ZSBmb3IgcGFnZSAlcCB1cCB0byBwb3NpdGlvbiAlbGxkIGZvciAlZCIsIAorCQkgcGFnZSwgcG9zaXRpb24sIHRvKSk7CisJaWYgKHBvc2l0aW9uID4gaW5vZGUtPmlfc2l6ZSkgeworCQlpX3NpemVfd3JpdGUoaW5vZGUsIHBvc2l0aW9uKTsKKwkJLyogaWYgKGZpbGUtPnByaXZhdGVfZGF0YSA9PSBOVUxMKSB7CisJCQlyYyA9IC1FQkFERjsKKwkJfSBlbHNlIHsKKwkJCW9wZW5fZmlsZSA9IChzdHJ1Y3QgY2lmc0ZpbGVJbmZvICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCQkJY2lmc19zYiA9IENJRlNfU0IoaW5vZGUtPmlfc2IpOworCQkJcmMgPSAtRUFHQUlOOworCQkJd2hpbGUgKHJjID09IC1FQUdBSU4pIHsKKwkJCQlpZiAoKG9wZW5fZmlsZS0+aW52YWxpZEhhbmRsZSkgJiYgCisJCQkJICAgICghb3Blbl9maWxlLT5jbG9zZVBlbmQpKSB7CisJCQkJCXJjID0gY2lmc19yZW9wZW5fZmlsZSgKKwkJCQkJCWZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCBmaWxlKTsKKwkJCQkJaWYgKHJjICE9IDApCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKCFvcGVuX2ZpbGUtPmNsb3NlUGVuZCkgeworCQkJCQlyYyA9IENJRlNTTUJTZXRGaWxlU2l6ZSh4aWQsCisJCQkJCQljaWZzX3NiLT50Y29uLCBwb3NpdGlvbiwKKwkJCQkJCW9wZW5fZmlsZS0+bmV0ZmlkLAorCQkJCQkJb3Blbl9maWxlLT5waWQsIEZBTFNFKTsKKwkJCQl9IGVsc2UgeworCQkJCQlyYyA9IC1FQkFERjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJY0ZZSSgxLCAoIiBTZXRFT0YgKGNvbW1pdCB3cml0ZSkgcmMgPSAlZCIsIHJjKSk7CisJCX0gKi8KKwl9CisJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJcG9zaXRpb24gPSAgKChsb2ZmX3QpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgKyBvZmZzZXQ7CisJCS8qIGNhbiBub3QgcmVseSBvbiAob3IgbGV0KSB3cml0ZXBhZ2Ugd3JpdGUgdGhpcyBkYXRhICovCisJCWlmICh0byA8IG9mZnNldCkgeworCQkJY0ZZSSgxLCAoIklsbGVnYWwgb2Zmc2V0cywgY2FuIG5vdCBjb3B5IGZyb20gJWQgdG8gJWQiLAorCQkJCW9mZnNldCwgdG8pKTsKKwkJCUZyZWVYaWQoeGlkKTsKKwkJCXJldHVybiByYzsKKwkJfQorCQkvKiB0aGlzIGlzIHByb2JhYmx5IGJldHRlciB0aGFuIGRpcmVjdGx5IGNhbGxpbmcKKwkJICAgcGFydGlhbHBhZ2Vfd3JpdGUgc2luY2UgaW4gdGhpcyBmdW5jdGlvbiB0aGUgZmlsZSBoYW5kbGUgaXMKKwkJICAga25vd24gd2hpY2ggd2UgbWlnaHQgYXMgd2VsbAlsZXZlcmFnZSAqLworCQkvKiBCQiBjaGVjayBpZiBhbnl0aGluZyBlbHNlIG1pc3Npbmcgb3V0IG9mIHBwdworCQkgICBzdWNoIGFzIHVwZGF0aW5nIGxhc3Qgd3JpdGUgdGltZSAqLworCQlwYWdlX2RhdGEgPSBrbWFwKHBhZ2UpOworCQlyYyA9IGNpZnNfd3JpdGUoZmlsZSwgcGFnZV9kYXRhICsgb2Zmc2V0LCB0by1vZmZzZXQsCisJCQkJJnBvc2l0aW9uKTsKKwkJaWYgKHJjID4gMCkKKwkJCXJjID0gMDsKKwkJLyogZWxzZSBpZiAocmMgPCAwKSBzaG91bGQgd2Ugc2V0IHdyaXRlYmVoaW5kIHJjPyAqLworCQlrdW5tYXAocGFnZSk7CisJfSBlbHNlIHsJCisJCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworCX0KKworCUZyZWVYaWQoeGlkKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBjaWZzX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBkYXRhc3luYykKK3sKKwlpbnQgeGlkOworCWludCByYyA9IDA7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCisJeGlkID0gR2V0WGlkKCk7CisKKwljRllJKDEsICgiU3luYyBmaWxlIC0gbmFtZTogJXMgZGF0YXN5bmM6IDB4JXggIiwgCisJCWRlbnRyeS0+ZF9uYW1lLm5hbWUsIGRhdGFzeW5jKSk7CisJCisJcmMgPSBmaWxlbWFwX2ZkYXRhd3JpdGUoaW5vZGUtPmlfbWFwcGluZyk7CisJaWYgKHJjID09IDApCisJCUNJRlNfSShpbm9kZSktPndyaXRlX2JlaGluZF9yYyA9IDA7CisJRnJlZVhpZCh4aWQpOworCXJldHVybiByYzsKK30KKworLyogc3RhdGljIGludCBjaWZzX3N5bmNfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXVuc2lnbmVkIGxvbmcgaW5kZXggPSBwYWdlLT5pbmRleDsKKwl1bnNpZ25lZCBpbnQgcnBhZ2VzID0gMDsKKwlpbnQgcmMgPSAwOworCisJY0ZZSSgxLCAoInN5bmMgcGFnZSAlcCIscGFnZSkpOworCW1hcHBpbmcgPSBwYWdlLT5tYXBwaW5nOworCWlmICghbWFwcGluZykKKwkJcmV0dXJuIDA7CisJaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCWlmICghaW5vZGUpCisJCXJldHVybiAwOyAqLworCisvKglmaWxsIGluIHJwYWdlcyB0aGVuIAorCXJlc3VsdCA9IGNpZnNfcGFnZWluX2lub2RlKGlub2RlLCBpbmRleCwgcnBhZ2VzKTsgKi8gLyogQkIgZmluaXNoICovCisKKy8qCWNGWUkoMSwgKCJycGFnZXMgaXMgJWQgZm9yIHN5bmMgcGFnZSBvZiBJbmRleCAlbGQgIiwgcnBhZ2VzLCBpbmRleCkpOworCisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCXJldHVybiAwOworfSAqLworCisvKgorICogQXMgZmlsZSBjbG9zZXMsIGZsdXNoIGFsbCBjYWNoZWQgd3JpdGUgZGF0YSBmb3IgdGhpcyBpbm9kZSBjaGVja2luZworICogZm9yIHdyaXRlIGJlaGluZCBlcnJvcnMuCisgKi8KK2ludCBjaWZzX2ZsdXNoKHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJaW50IHJjID0gMDsKKworCS8qIFJhdGhlciB0aGFuIGRvIHRoZSBzdGVwcyBtYW51YWxseToKKwkgICBsb2NrIHRoZSBpbm9kZSBmb3Igd3JpdGluZworCSAgIGxvb3AgdGhyb3VnaCBwYWdlcyBsb29raW5nIGZvciB3cml0ZSBiZWhpbmQgZGF0YSAoZGlydHkgcGFnZXMpCisJICAgY29hbGVzY2UgaW50byBjb250aWd1b3VzIDE2SyAob3Igc21hbGxlcikgY2h1bmtzIHRvIHdyaXRlIHRvIHNlcnZlcgorCSAgIHNlbmQgdG8gc2VydmVyIChwcmVmZXIgaW4gcGFyYWxsZWwpCisJICAgZGVhbCB3aXRoIHdyaXRlYmVoaW5kIGVycm9ycworCSAgIHVubG9jayBpbm9kZSBmb3Igd3JpdGluZworCSAgIGZpbGVtYXBmZGF0YXdyaXRlIGFwcGVhcnMgZWFzaWVyIGZvciB0aGUgdGltZSBiZWluZyAqLworCisJcmMgPSBmaWxlbWFwX2ZkYXRhd3JpdGUoaW5vZGUtPmlfbWFwcGluZyk7CisJaWYgKCFyYykgLyogcmVzZXQgd2IgcmMgaWYgd2Ugd2VyZSBhYmxlIHRvIHdyaXRlIG91dCBkaXJ0eSBwYWdlcyAqLworCQlDSUZTX0koaW5vZGUpLT53cml0ZV9iZWhpbmRfcmMgPSAwOworCQkKKwljRllJKDEsICgiRmx1c2ggaW5vZGUgJXAgZmlsZSAlcCByYyAlZCIsaW5vZGUsZmlsZSxyYykpOworCisJcmV0dXJuIHJjOworfQorCitzc2l6ZV90IGNpZnNfdXNlcl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqcmVhZF9kYXRhLAorCXNpemVfdCByZWFkX3NpemUsIGxvZmZfdCAqcG9mZnNldCkKK3sKKwlpbnQgcmMgPSAtRUFDQ0VTOworCXVuc2lnbmVkIGludCBieXRlc19yZWFkID0gMDsKKwl1bnNpZ25lZCBpbnQgdG90YWxfcmVhZCA9IDA7CisJdW5zaWduZWQgaW50IGN1cnJlbnRfcmVhZF9zaXplOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisJc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb247CisJaW50IHhpZDsKKwlzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpvcGVuX2ZpbGU7CisJY2hhciAqc21iX3JlYWRfZGF0YTsKKwljaGFyIF9fdXNlciAqY3VycmVudF9vZmZzZXQ7CisJc3RydWN0IHNtYl9jb21fcmVhZF9yc3AgKnBTTUJyOworCisJeGlkID0gR2V0WGlkKCk7CisJY2lmc19zYiA9IENJRlNfU0IoZmlsZS0+Zl9kZW50cnktPmRfc2IpOworCXBUY29uID0gY2lmc19zYi0+dGNvbjsKKworCWlmIChmaWxlLT5wcml2YXRlX2RhdGEgPT0gTlVMTCkgeworCQlGcmVlWGlkKHhpZCk7CisJCXJldHVybiAtRUJBREY7CisJfQorCW9wZW5fZmlsZSA9IChzdHJ1Y3QgY2lmc0ZpbGVJbmZvICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19BQ0NNT0RFKSA9PSBPX1dST05MWSkgeworCQljRllJKDEsICgiYXR0ZW1wdGluZyByZWFkIG9uIHdyaXRlIG9ubHkgZmlsZSBpbnN0YW5jZSIpKTsKKwl9CisJZm9yICh0b3RhbF9yZWFkID0gMCwgY3VycmVudF9vZmZzZXQgPSByZWFkX2RhdGE7CisJICAgICByZWFkX3NpemUgPiB0b3RhbF9yZWFkOworCSAgICAgdG90YWxfcmVhZCArPSBieXRlc19yZWFkLCBjdXJyZW50X29mZnNldCArPSBieXRlc19yZWFkKSB7CisJCWN1cnJlbnRfcmVhZF9zaXplID0gbWluX3QoY29uc3QgaW50LCByZWFkX3NpemUgLSB0b3RhbF9yZWFkLCAKKwkJCQkJICBjaWZzX3NiLT5yc2l6ZSk7CisJCXJjID0gLUVBR0FJTjsKKwkJc21iX3JlYWRfZGF0YSA9IE5VTEw7CisJCXdoaWxlIChyYyA9PSAtRUFHQUlOKSB7CisJCQlpZiAoKG9wZW5fZmlsZS0+aW52YWxpZEhhbmRsZSkgJiYgCisJCQkgICAgKCFvcGVuX2ZpbGUtPmNsb3NlUGVuZCkpIHsKKwkJCQlyYyA9IGNpZnNfcmVvcGVuX2ZpbGUoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsCisJCQkJCWZpbGUsIFRSVUUpOworCQkJCWlmIChyYyAhPSAwKQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJcmMgPSBDSUZTU01CUmVhZCh4aWQsIHBUY29uLAorCQkJCSBvcGVuX2ZpbGUtPm5ldGZpZCwKKwkJCQkgY3VycmVudF9yZWFkX3NpemUsICpwb2Zmc2V0LAorCQkJCSAmYnl0ZXNfcmVhZCwgJnNtYl9yZWFkX2RhdGEpOworCisJCQlwU01CciA9IChzdHJ1Y3Qgc21iX2NvbV9yZWFkX3JzcCAqKXNtYl9yZWFkX2RhdGE7CisJCQlpZiAoY29weV90b191c2VyKGN1cnJlbnRfb2Zmc2V0LCAKKwkJCQkJIHNtYl9yZWFkX2RhdGEgKyA0IC8qIFJGQzEwMDEgaGRyICovCisJCQkJCSArIGxlMTZfdG9fY3B1KHBTTUJyLT5EYXRhT2Zmc2V0KSwgCisJCQkJCSBieXRlc19yZWFkKSkgeworCQkJCXJjID0gLUVGQVVMVDsKKwkJCQlGcmVlWGlkKHhpZCk7CisJCQkJcmV0dXJuIHJjOworICAgICAgICAgICAgfQorCQkJaWYgKHNtYl9yZWFkX2RhdGEpIHsKKwkJCQljaWZzX2J1Zl9yZWxlYXNlKHNtYl9yZWFkX2RhdGEpOworCQkJCXNtYl9yZWFkX2RhdGEgPSBOVUxMOworCQkJfQorCQl9CisJCWlmIChyYyB8fCAoYnl0ZXNfcmVhZCA9PSAwKSkgeworCQkJaWYgKHRvdGFsX3JlYWQpIHsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJRnJlZVhpZCh4aWQpOworCQkJCXJldHVybiByYzsKKwkJCX0KKwkJfSBlbHNlIHsKKyNpZmRlZiBDT05GSUdfQ0lGU19TVEFUUworCQkJYXRvbWljX2luYygmcFRjb24tPm51bV9yZWFkcyk7CisJCQlzcGluX2xvY2soJnBUY29uLT5zdGF0X2xvY2spOworCQkJcFRjb24tPmJ5dGVzX3JlYWQgKz0gdG90YWxfcmVhZDsKKwkJCXNwaW5fdW5sb2NrKCZwVGNvbi0+c3RhdF9sb2NrKTsKKyNlbmRpZgorCQkJKnBvZmZzZXQgKz0gYnl0ZXNfcmVhZDsKKwkJfQorCX0KKwlGcmVlWGlkKHhpZCk7CisJcmV0dXJuIHRvdGFsX3JlYWQ7Cit9CisKKworc3RhdGljIHNzaXplX3QgY2lmc19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpyZWFkX2RhdGEsIHNpemVfdCByZWFkX3NpemUsCisJbG9mZl90ICpwb2Zmc2V0KQoreworCWludCByYyA9IC1FQUNDRVM7CisJdW5zaWduZWQgaW50IGJ5dGVzX3JlYWQgPSAwOworCXVuc2lnbmVkIGludCB0b3RhbF9yZWFkOworCXVuc2lnbmVkIGludCBjdXJyZW50X3JlYWRfc2l6ZTsKKwlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiOworCXN0cnVjdCBjaWZzVGNvbkluZm8gKnBUY29uOworCWludCB4aWQ7CisJY2hhciAqY3VycmVudF9vZmZzZXQ7CisJc3RydWN0IGNpZnNGaWxlSW5mbyAqb3Blbl9maWxlOworCisJeGlkID0gR2V0WGlkKCk7CisJY2lmc19zYiA9IENJRlNfU0IoZmlsZS0+Zl9kZW50cnktPmRfc2IpOworCXBUY29uID0gY2lmc19zYi0+dGNvbjsKKworCWlmIChmaWxlLT5wcml2YXRlX2RhdGEgPT0gTlVMTCkgeworCQlGcmVlWGlkKHhpZCk7CisJCXJldHVybiAtRUJBREY7CisJfQorCW9wZW5fZmlsZSA9IChzdHJ1Y3QgY2lmc0ZpbGVJbmZvICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19BQ0NNT0RFKSA9PSBPX1dST05MWSkKKwkJY0ZZSSgxLCAoImF0dGVtcHRpbmcgcmVhZCBvbiB3cml0ZSBvbmx5IGZpbGUgaW5zdGFuY2UiKSk7CisKKwlmb3IgKHRvdGFsX3JlYWQgPSAwLCBjdXJyZW50X29mZnNldCA9IHJlYWRfZGF0YTsgCisJICAgICByZWFkX3NpemUgPiB0b3RhbF9yZWFkOworCSAgICAgdG90YWxfcmVhZCArPSBieXRlc19yZWFkLCBjdXJyZW50X29mZnNldCArPSBieXRlc19yZWFkKSB7CisJCWN1cnJlbnRfcmVhZF9zaXplID0gbWluX3QoY29uc3QgaW50LCByZWFkX3NpemUgLSB0b3RhbF9yZWFkLAorCQkJCQkgIGNpZnNfc2ItPnJzaXplKTsKKwkJcmMgPSAtRUFHQUlOOworCQl3aGlsZSAocmMgPT0gLUVBR0FJTikgeworCQkJaWYgKChvcGVuX2ZpbGUtPmludmFsaWRIYW5kbGUpICYmIAorCQkJICAgICghb3Blbl9maWxlLT5jbG9zZVBlbmQpKSB7CisJCQkJcmMgPSBjaWZzX3Jlb3Blbl9maWxlKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLAorCQkJCQlmaWxlLCBUUlVFKTsKKwkJCQlpZiAocmMgIT0gMCkKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCXJjID0gQ0lGU1NNQlJlYWQoeGlkLCBwVGNvbiwKKwkJCQkgb3Blbl9maWxlLT5uZXRmaWQsCisJCQkJIGN1cnJlbnRfcmVhZF9zaXplLCAqcG9mZnNldCwKKwkJCQkgJmJ5dGVzX3JlYWQsICZjdXJyZW50X29mZnNldCk7CisJCX0KKwkJaWYgKHJjIHx8IChieXRlc19yZWFkID09IDApKSB7CisJCQlpZiAodG90YWxfcmVhZCkgeworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlGcmVlWGlkKHhpZCk7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCQl9IGVsc2UgeworI2lmZGVmIENPTkZJR19DSUZTX1NUQVRTCisJCQlhdG9taWNfaW5jKCZwVGNvbi0+bnVtX3JlYWRzKTsKKwkJCXNwaW5fbG9jaygmcFRjb24tPnN0YXRfbG9jayk7CisJCQlwVGNvbi0+Ynl0ZXNfcmVhZCArPSB0b3RhbF9yZWFkOworCQkJc3Bpbl91bmxvY2soJnBUY29uLT5zdGF0X2xvY2spOworI2VuZGlmCisJCQkqcG9mZnNldCArPSBieXRlc19yZWFkOworCQl9CisJfQorCUZyZWVYaWQoeGlkKTsKKwlyZXR1cm4gdG90YWxfcmVhZDsKK30KKworaW50IGNpZnNfZmlsZV9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlpbnQgcmMsIHhpZDsKKworCXhpZCA9IEdldFhpZCgpOworCXJjID0gY2lmc19yZXZhbGlkYXRlKGRlbnRyeSk7CisJaWYgKHJjKSB7CisJCWNGWUkoMSwgKCJWYWxpZGF0aW9uIHByaW9yIHRvIG1tYXAgZmFpbGVkLCBlcnJvcj0lZCIsIHJjKSk7CisJCUZyZWVYaWQoeGlkKTsKKwkJcmV0dXJuIHJjOworCX0KKwlyYyA9IGdlbmVyaWNfZmlsZV9tbWFwKGZpbGUsIHZtYSk7CisJRnJlZVhpZCh4aWQpOworCXJldHVybiByYzsKK30KKworCitzdGF0aWMgdm9pZCBjaWZzX2NvcHlfY2FjaGVfcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIAorCXN0cnVjdCBsaXN0X2hlYWQgKnBhZ2VzLCBpbnQgYnl0ZXNfcmVhZCwgY2hhciAqZGF0YSwKKwlzdHJ1Y3QgcGFnZXZlYyAqcGxydV9wdmVjKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCWNoYXIgKnRhcmdldDsKKworCXdoaWxlIChieXRlc19yZWFkID4gMCkgeworCQlpZiAobGlzdF9lbXB0eShwYWdlcykpCisJCQlicmVhazsKKworCQlwYWdlID0gbGlzdF9lbnRyeShwYWdlcy0+cHJldiwgc3RydWN0IHBhZ2UsIGxydSk7CisJCWxpc3RfZGVsKCZwYWdlLT5scnUpOworCisJCWlmIChhZGRfdG9fcGFnZV9jYWNoZShwYWdlLCBtYXBwaW5nLCBwYWdlLT5pbmRleCwKKwkJCQkgICAgICBHRlBfS0VSTkVMKSkgeworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJY0ZZSSgxLCAoIkFkZCBwYWdlIGNhY2hlIGZhaWxlZCIpKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJdGFyZ2V0ID0ga21hcF9hdG9taWMocGFnZSxLTV9VU0VSMCk7CisKKwkJaWYgKFBBR0VfQ0FDSEVfU0laRSA+IGJ5dGVzX3JlYWQpIHsKKwkJCW1lbWNweSh0YXJnZXQsIGRhdGEsIGJ5dGVzX3JlYWQpOworCQkJLyogemVybyB0aGUgdGFpbCBlbmQgb2YgdGhpcyBwYXJ0aWFsIHBhZ2UgKi8KKwkJCW1lbXNldCh0YXJnZXQgKyBieXRlc19yZWFkLCAwLCAKKwkJCSAgICAgICBQQUdFX0NBQ0hFX1NJWkUgLSBieXRlc19yZWFkKTsKKwkJCWJ5dGVzX3JlYWQgPSAwOworCQl9IGVsc2UgeworCQkJbWVtY3B5KHRhcmdldCwgZGF0YSwgUEFHRV9DQUNIRV9TSVpFKTsKKwkJCWJ5dGVzX3JlYWQgLT0gUEFHRV9DQUNIRV9TSVpFOworCQl9CisJCWt1bm1hcF9hdG9taWModGFyZ2V0LCBLTV9VU0VSMCk7CisKKwkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCWlmICghcGFnZXZlY19hZGQocGxydV9wdmVjLCBwYWdlKSkKKwkJCV9fcGFnZXZlY19scnVfYWRkKHBscnVfcHZlYyk7CisJCWRhdGEgKz0gUEFHRV9DQUNIRV9TSVpFOworCX0KKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgY2lmc19yZWFkcGFnZXMoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCXN0cnVjdCBsaXN0X2hlYWQgKnBhZ2VfbGlzdCwgdW5zaWduZWQgbnVtX3BhZ2VzKQoreworCWludCByYyA9IC1FQUNDRVM7CisJaW50IHhpZDsKKwlsb2ZmX3Qgb2Zmc2V0OworCXN0cnVjdCBwYWdlICpwYWdlOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisJc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb247CisJaW50IGJ5dGVzX3JlYWQgPSAwOworCXVuc2lnbmVkIGludCByZWFkX3NpemUsaTsKKwljaGFyICpzbWJfcmVhZF9kYXRhID0gTlVMTDsKKwlzdHJ1Y3Qgc21iX2NvbV9yZWFkX3JzcCAqcFNNQnI7CisJc3RydWN0IHBhZ2V2ZWMgbHJ1X3B2ZWM7CisJc3RydWN0IGNpZnNGaWxlSW5mbyAqb3Blbl9maWxlOworCisJeGlkID0gR2V0WGlkKCk7CisJaWYgKGZpbGUtPnByaXZhdGVfZGF0YSA9PSBOVUxMKSB7CisJCUZyZWVYaWQoeGlkKTsKKwkJcmV0dXJuIC1FQkFERjsKKwl9CisJb3Blbl9maWxlID0gKHN0cnVjdCBjaWZzRmlsZUluZm8gKilmaWxlLT5wcml2YXRlX2RhdGE7CisJY2lmc19zYiA9IENJRlNfU0IoZmlsZS0+Zl9kZW50cnktPmRfc2IpOworCXBUY29uID0gY2lmc19zYi0+dGNvbjsKKworCXBhZ2V2ZWNfaW5pdCgmbHJ1X3B2ZWMsIDApOworCisJZm9yIChpID0gMDsgaSA8IG51bV9wYWdlczsgKSB7CisJCXVuc2lnbmVkIGNvbnRpZ19wYWdlczsKKwkJc3RydWN0IHBhZ2UgKnRtcF9wYWdlOworCQl1bnNpZ25lZCBsb25nIGV4cGVjdGVkX2luZGV4OworCisJCWlmIChsaXN0X2VtcHR5KHBhZ2VfbGlzdCkpCisJCQlicmVhazsKKworCQlwYWdlID0gbGlzdF9lbnRyeShwYWdlX2xpc3QtPnByZXYsIHN0cnVjdCBwYWdlLCBscnUpOworCQlvZmZzZXQgPSAobG9mZl90KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisKKwkJLyogY291bnQgYWRqYWNlbnQgcGFnZXMgdGhhdCB3ZSB3aWxsIHJlYWQgaW50byAqLworCQljb250aWdfcGFnZXMgPSAwOworCQlleHBlY3RlZF9pbmRleCA9IAorCQkJbGlzdF9lbnRyeShwYWdlX2xpc3QtPnByZXYsIHN0cnVjdCBwYWdlLCBscnUpLT5pbmRleDsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKHRtcF9wYWdlLHBhZ2VfbGlzdCxscnUpIHsKKwkJCWlmICh0bXBfcGFnZS0+aW5kZXggPT0gZXhwZWN0ZWRfaW5kZXgpIHsKKwkJCQljb250aWdfcGFnZXMrKzsKKwkJCQlleHBlY3RlZF9pbmRleCsrOworCQkJfSBlbHNlCisJCQkJYnJlYWs7IAorCQl9CisJCWlmIChjb250aWdfcGFnZXMgKyBpID4gIG51bV9wYWdlcykKKwkJCWNvbnRpZ19wYWdlcyA9IG51bV9wYWdlcyAtIGk7CisKKwkJLyogZm9yIHJlYWRzIG92ZXIgYSBjZXJ0YWluIHNpemUgY291bGQgaW5pdGlhdGUgYXN5bmMKKwkJICAgcmVhZCBhaGVhZCAqLworCisJCXJlYWRfc2l6ZSA9IGNvbnRpZ19wYWdlcyAqIFBBR0VfQ0FDSEVfU0laRTsKKwkJLyogUmVhZCBzaXplIG5lZWRzIHRvIGJlIGluIG11bHRpcGxlcyBvZiBvbmUgcGFnZSAqLworCQlyZWFkX3NpemUgPSBtaW5fdChjb25zdCB1bnNpZ25lZCBpbnQsIHJlYWRfc2l6ZSwKKwkJCQkgIGNpZnNfc2ItPnJzaXplICYgUEFHRV9DQUNIRV9NQVNLKTsKKworCQlyYyA9IC1FQUdBSU47CisJCXdoaWxlIChyYyA9PSAtRUFHQUlOKSB7CisJCQlpZiAoKG9wZW5fZmlsZS0+aW52YWxpZEhhbmRsZSkgJiYgCisJCQkgICAgKCFvcGVuX2ZpbGUtPmNsb3NlUGVuZCkpIHsKKwkJCQlyYyA9IGNpZnNfcmVvcGVuX2ZpbGUoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsCisJCQkJCWZpbGUsIFRSVUUpOworCQkJCWlmIChyYyAhPSAwKQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJcmMgPSBDSUZTU01CUmVhZCh4aWQsIHBUY29uLAorCQkJCW9wZW5fZmlsZS0+bmV0ZmlkLAorCQkJCXJlYWRfc2l6ZSwgb2Zmc2V0LAorCQkJCSZieXRlc19yZWFkLCAmc21iX3JlYWRfZGF0YSk7CisJCQkvKiBCQiBuZWVkIHRvIGNoZWNrIHJldHVybiBjb2RlIGhlcmUgKi8KKwkJCWlmIChyYz09IC1FQUdBSU4pIHsKKwkJCQlpZiAoc21iX3JlYWRfZGF0YSkgeworCQkJCQljaWZzX2J1Zl9yZWxlYXNlKHNtYl9yZWFkX2RhdGEpOworCQkJCQlzbWJfcmVhZF9kYXRhID0gTlVMTDsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKChyYyA8IDApIHx8IChzbWJfcmVhZF9kYXRhID09IE5VTEwpKSB7CisJCQljRllJKDEsICgiUmVhZCBlcnJvciBpbiByZWFkcGFnZXM6ICVkIiwgcmMpKTsKKwkJCS8qIGNsZWFuIHVwIHJlbWFpbmcgcGFnZXMgb2ZmIGxpc3QgKi8KKwkJCXdoaWxlICghbGlzdF9lbXB0eShwYWdlX2xpc3QpICYmIChpIDwgbnVtX3BhZ2VzKSkgeworCQkJCXBhZ2UgPSBsaXN0X2VudHJ5KHBhZ2VfbGlzdC0+cHJldiwgc3RydWN0IHBhZ2UsCisJCQkJCQkgIGxydSk7CisJCQkJbGlzdF9kZWwoJnBhZ2UtPmxydSk7CisJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJfQorCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoYnl0ZXNfcmVhZCA+IDApIHsKKwkJCXBTTUJyID0gKHN0cnVjdCBzbWJfY29tX3JlYWRfcnNwICopc21iX3JlYWRfZGF0YTsKKwkJCWNpZnNfY29weV9jYWNoZV9wYWdlcyhtYXBwaW5nLCBwYWdlX2xpc3QsIGJ5dGVzX3JlYWQsCisJCQkJc21iX3JlYWRfZGF0YSArIDQgLyogUkZDMTAwMSBoZHIgKi8gKworCQkJCWxlMTZfdG9fY3B1KHBTTUJyLT5EYXRhT2Zmc2V0KSwgJmxydV9wdmVjKTsKKworCQkJaSArPSAgYnl0ZXNfcmVhZCA+PiBQQUdFX0NBQ0hFX1NISUZUOworI2lmZGVmIENPTkZJR19DSUZTX1NUQVRTCisJCQlhdG9taWNfaW5jKCZwVGNvbi0+bnVtX3JlYWRzKTsKKwkJCXNwaW5fbG9jaygmcFRjb24tPnN0YXRfbG9jayk7CisJCQlwVGNvbi0+Ynl0ZXNfcmVhZCArPSBieXRlc19yZWFkOworCQkJc3Bpbl91bmxvY2soJnBUY29uLT5zdGF0X2xvY2spOworI2VuZGlmCisJCQlpZiAoKGludCkoYnl0ZXNfcmVhZCAmIFBBR0VfQ0FDSEVfTUFTSykgIT0gYnl0ZXNfcmVhZCkgeworCQkJCWkrKzsgLyogYWNjb3VudCBmb3IgcGFydGlhbCBwYWdlICovCisKKwkJCQkvKiBzZXJ2ZXIgY29weSBvZiBmaWxlIGNhbiBoYXZlIHNtYWxsZXIgc2l6ZSAKKwkJCQkgICB0aGFuIGNsaWVudCAqLworCQkJCS8qIEJCIGRvIHdlIG5lZWQgdG8gdmVyaWZ5IHRoaXMgY29tbW9uIGNhc2UgPyAKKwkJCQkgICB0aGlzIGNhc2UgaXMgb2sgLSBpZiB3ZSBhcmUgYXQgc2VydmVyIEVPRiAKKwkJCQkgICB3ZSB3aWxsIGhpdCBpdCBvbiBuZXh0IHJlYWQgKi8KKworCQkJLyogd2hpbGUgKCFsaXN0X2VtcHR5KHBhZ2VfbGlzdCkgJiYgKGkgPCBudW1fcGFnZXMpKSB7CisJCQkJCXBhZ2UgPSBsaXN0X2VudHJ5KHBhZ2VfbGlzdC0+cHJldiwgCisJCQkJCQkJICBzdHJ1Y3QgcGFnZSwgbGlzdCk7CisJCQkJCWxpc3RfZGVsKCZwYWdlLT5saXN0KTsKKwkJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJCX0KKwkJCQlicmVhazsgKi8KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWNGWUkoMSwgKCJObyBieXRlcyByZWFkICglZCkgYXQgb2Zmc2V0ICVsbGQgLiAiCisJCQkJICJDbGVhbmluZyByZW1haW5pbmcgcGFnZXMgZnJvbSByZWFkYWhlYWQgbGlzdCIsCisJCQkJIGJ5dGVzX3JlYWQsIG9mZnNldCkpOworCQkJLyogQkIgdHVybiBvZmYgY2FjaGluZyBhbmQgZG8gbmV3IGxvb2t1cCBvbiAKKwkJCSAgIGZpbGUgc2l6ZSBhdCBzZXJ2ZXI/ICovCisJCQl3aGlsZSAoIWxpc3RfZW1wdHkocGFnZV9saXN0KSAmJiAoaSA8IG51bV9wYWdlcykpIHsKKwkJCQlwYWdlID0gbGlzdF9lbnRyeShwYWdlX2xpc3QtPnByZXYsIHN0cnVjdCBwYWdlLAorCQkJCQkJICBscnUpOworCQkJCWxpc3RfZGVsKCZwYWdlLT5scnUpOworCisJCQkJLyogQkIgcmVtb3ZlbWUgLSByZXBsYWNlIHdpdGggemVybyBvZiBwYWdlPyAqLworCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWlmIChzbWJfcmVhZF9kYXRhKSB7CisJCQljaWZzX2J1Zl9yZWxlYXNlKHNtYl9yZWFkX2RhdGEpOworCQkJc21iX3JlYWRfZGF0YSA9IE5VTEw7CisJCX0KKwkJYnl0ZXNfcmVhZCA9IDA7CisJfQorCisJcGFnZXZlY19scnVfYWRkKCZscnVfcHZlYyk7CisKKy8qIG5lZWQgdG8gZnJlZSBzbWJfcmVhZF9kYXRhIGJ1ZiBiZWZvcmUgZXhpdCAqLworCWlmIChzbWJfcmVhZF9kYXRhKSB7CisJCWNpZnNfYnVmX3JlbGVhc2Uoc21iX3JlYWRfZGF0YSk7CisJCXNtYl9yZWFkX2RhdGEgPSBOVUxMOworCX0gCisKKwlGcmVlWGlkKHhpZCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGNpZnNfcmVhZHBhZ2Vfd29ya2VyKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwlsb2ZmX3QgKnBvZmZzZXQpCit7CisJY2hhciAqcmVhZF9kYXRhOworCWludCByYzsKKworCXBhZ2VfY2FjaGVfZ2V0KHBhZ2UpOworCXJlYWRfZGF0YSA9IGttYXAocGFnZSk7CisJLyogZm9yIHJlYWRzIG92ZXIgYSBjZXJ0YWluIHNpemUgY291bGQgaW5pdGlhdGUgYXN5bmMgcmVhZCBhaGVhZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJcmMgPSBjaWZzX3JlYWQoZmlsZSwgcmVhZF9kYXRhLCBQQUdFX0NBQ0hFX1NJWkUsIHBvZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJaWYgKHJjIDwgMCkKKwkJZ290byBpb19lcnJvcjsKKwllbHNlCisJCWNGWUkoMSwgKCJCeXRlcyByZWFkICVkICIscmMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCWZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX2F0aW1lID0KKwkJY3VycmVudF9mc190aW1lKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCWlmIChQQUdFX0NBQ0hFX1NJWkUgPiByYykKKwkJbWVtc2V0KHJlYWRfZGF0YSArIHJjLCAwLCBQQUdFX0NBQ0hFX1NJWkUgLSByYyk7CisKKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJcmMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitpb19lcnJvcjoKKyAgICAgICAga3VubWFwKHBhZ2UpOworCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgY2lmc19yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJbG9mZl90IG9mZnNldCA9IChsb2ZmX3QpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVDsKKwlpbnQgcmMgPSAtRUFDQ0VTOworCWludCB4aWQ7CisKKwl4aWQgPSBHZXRYaWQoKTsKKworCWlmIChmaWxlLT5wcml2YXRlX2RhdGEgPT0gTlVMTCkgeworCQlGcmVlWGlkKHhpZCk7CisJCXJldHVybiAtRUJBREY7CisJfQorCisJY0ZZSSgxLCAoInJlYWRwYWdlICVwIGF0IG9mZnNldCAlZCAweCV4XG4iLCAKKwkJIHBhZ2UsIChpbnQpb2Zmc2V0LCAoaW50KW9mZnNldCkpOworCisJcmMgPSBjaWZzX3JlYWRwYWdlX3dvcmtlcihmaWxlLCBwYWdlLCAmb2Zmc2V0KTsKKworCXVubG9ja19wYWdlKHBhZ2UpOworCisJRnJlZVhpZCh4aWQpOworCXJldHVybiByYzsKK30KKworLyogV2UgZG8gbm90IHdhbnQgdG8gdXBkYXRlIHRoZSBmaWxlIHNpemUgZnJvbSBzZXJ2ZXIgZm9yIGlub2RlcworICAgb3BlbiBmb3Igd3JpdGUgLSB0byBhdm9pZCByYWNlcyB3aXRoIHdyaXRlcGFnZSBleHRlbmRpbmcKKyAgIHRoZSBmaWxlIC0gaW4gdGhlIGZ1dHVyZSB3ZSBjb3VsZCBjb25zaWRlciBhbGxvd2luZworICAgcmVmcmVzaGluZyB0aGUgaW5vZGUgb25seSBvbiBpbmNyZWFzZXMgaW4gdGhlIGZpbGUgc2l6ZSAKKyAgIGJ1dCB0aGlzIGlzIHRyaWNreSB0byBkbyB3aXRob3V0IHJhY2luZyB3aXRoIHdyaXRlYmVoaW5kCisgICBwYWdlIGNhY2hpbmcgaW4gdGhlIGN1cnJlbnQgTGludXgga2VybmVsIGRlc2lnbiAqLworaW50IGlzX3NpemVfc2FmZV90b19jaGFuZ2Uoc3RydWN0IGNpZnNJbm9kZUluZm8gKmNpZnNJbm9kZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wMTsKKwlzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpvcGVuX2ZpbGUgPSBOVUxMOworCWludCByYyA9IFRSVUU7CisKKwlpZiAoY2lmc0lub2RlID09IE5VTEwpCisJCXJldHVybiByYzsKKworCXJlYWRfbG9jaygmR2xvYmFsU01CU2VzbG9jayk7IAorCWxpc3RfZm9yX2VhY2hfc2FmZSh0bXAsIHRtcDEsICZjaWZzSW5vZGUtPm9wZW5GaWxlTGlzdCkgeyAgICAgICAgICAgIAorCQlvcGVuX2ZpbGUgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGNpZnNGaWxlSW5mbywgZmxpc3QpOworCQlpZiAob3Blbl9maWxlID09IE5VTEwpCisJCQlicmVhazsKKwkJaWYgKG9wZW5fZmlsZS0+Y2xvc2VQZW5kKQorCQkJY29udGludWU7CisJLyogV2UgY2hlY2sgaWYgZmlsZSBpcyBvcGVuIGZvciB3cml0aW5nLCAgIAorCSAgIEJCIHdlIGNvdWxkIHN1cHBsZW1lbnQgdGhpcyB3aXRoIGEgY2hlY2sgdG8gc2VlIGlmIGZpbGUgc2l6ZQorCSAgIGNoYW5nZXMgaGF2ZSBiZWVuIGZsdXNoZWQgdG8gc2VydmVyIC0gaWUgaW5vZGUgbWV0YWRhdGEgZGlydHkgKi8KKwkJaWYgKChvcGVuX2ZpbGUtPnBmaWxlKSAmJiAKKwkJICAgICgob3Blbl9maWxlLT5wZmlsZS0+Zl9mbGFncyAmIE9fUkRXUikgfHwgCisJCSAgICAob3Blbl9maWxlLT5wZmlsZS0+Zl9mbGFncyAmIE9fV1JPTkxZKSkpIHsKKwkJCXJjID0gRkFMU0U7CisJCQlicmVhazsKKwkJfQorCQlpZiAodG1wLT5uZXh0ID09IE5VTEwpIHsKKwkJCWNGWUkoMSwgKCJGaWxlIGluc3RhbmNlICVwIHJlbW92ZWQiLCB0bXApKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJlYWRfdW5sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIGludCBjaWZzX3ByZXBhcmVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLAorCXVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCWludCByYyA9IDA7CisgICAgICAgIGxvZmZfdCBvZmZzZXQgPSAobG9mZl90KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisJY0ZZSSgxLCAoInByZXBhcmUgd3JpdGUgZm9yIHBhZ2UgJXAgZnJvbSAlZCB0byAlZCIscGFnZSxmcm9tLHRvKSk7CisJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkvKglpZiAodG8gLSBmcm9tICE9IFBBR0VfQ0FDSEVfU0laRSkgeworCQkJdm9pZCAqa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCQltZW1zZXQoa2FkZHIsIDAsIGZyb20pOworCQkJbWVtc2V0KGthZGRyICsgdG8sIDAsIFBBR0VfQ0FDSEVfU0laRSAtIHRvKTsKKwkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCQl9ICovCisJCS8qIElmIHdlIGFyZSB3cml0aW5nIGEgZnVsbCBwYWdlIGl0IHdpbGwgYmUgdXAgdG8gZGF0ZSwKKwkJICAgbm8gbmVlZCB0byByZWFkIGZyb20gdGhlIHNlcnZlciAqLworCQlpZiAoKHRvID09IFBBR0VfQ0FDSEVfU0laRSkgJiYgKGZyb20gPT0gMCkpCisJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisKKwkJLyogbWlnaHQgYXMgd2VsbCByZWFkIGEgcGFnZSwgaXQgaXMgZmFzdCBlbm91Z2ggKi8KKwkJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19BQ0NNT0RFKSAhPSBPX1dST05MWSkgeworCQkJcmMgPSBjaWZzX3JlYWRwYWdlX3dvcmtlcihmaWxlLCBwYWdlLCAmb2Zmc2V0KTsKKwkJfSBlbHNlIHsKKwkJLyogc2hvdWxkIHdlIHRyeSB1c2luZyBhbm90aGVyIGZpbGUgaGFuZGxlIGlmIHRoZXJlIGlzIG9uZSAtCisJCSAgIGhvdyB3b3VsZCB3ZSBsb2NrIGl0IHRvIHByZXZlbnQgY2xvc2Ugb2YgdGhhdCBoYW5kbGUKKwkJICAgcmFjaW5nIHdpdGggdGhpcyByZWFkPworCQkgICBJbiBhbnkgY2FzZSB0aGlzIHdpbGwgYmUgd3JpdHRlbiBvdXQgYnkgY29tbWl0X3dyaXRlICovCisJCX0KKwl9CisKKwkvKiBCQiBzaG91bGQgd2UgcGFzcyBhbnkgZXJyb3JzIGJhY2s/IAorCSAgIGUuZy4gaWYgd2UgZG8gbm90IGhhdmUgcmVhZCBhY2Nlc3MgdG8gdGhlIGZpbGUgKi8KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBjaWZzX2FkZHJfb3BzID0geworCS5yZWFkcGFnZSA9IGNpZnNfcmVhZHBhZ2UsCisJLnJlYWRwYWdlcyA9IGNpZnNfcmVhZHBhZ2VzLAorCS53cml0ZXBhZ2UgPSBjaWZzX3dyaXRlcGFnZSwKKwkucHJlcGFyZV93cml0ZSA9IGNpZnNfcHJlcGFyZV93cml0ZSwKKwkuY29tbWl0X3dyaXRlID0gY2lmc19jb21taXRfd3JpdGUsCisJLnNldF9wYWdlX2RpcnR5ID0gX19zZXRfcGFnZV9kaXJ0eV9ub2J1ZmZlcnMsCisJLyogLnN5bmNfcGFnZSA9IGNpZnNfc3luY19wYWdlLCAqLworCS8qIC5kaXJlY3RfSU8gPSAqLworfTsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvaW5vZGUuYyBiL2ZzL2NpZnMvaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzNiMGFhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9pbm9kZS5jCkBAIC0wLDAgKzEsMTA5NiBAQAorLyoKKyAqICAgZnMvY2lmcy9pbm9kZS5jCisgKgorICogICBDb3B5cmlnaHQgKEMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgIENvcnAuLCAyMDAyLDIwMDUKKyAqICAgQXV0aG9yKHMpOiBTdGV2ZSBGcmVuY2ggKHNmcmVuY2hAdXMuaWJtLmNvbSkKKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisjaW5jbHVkZSAiY2lmc2ZzLmgiCisjaW5jbHVkZSAiY2lmc3BkdS5oIgorI2luY2x1ZGUgImNpZnNnbG9iLmgiCisjaW5jbHVkZSAiY2lmc3Byb3RvLmgiCisjaW5jbHVkZSAiY2lmc19kZWJ1Zy5oIgorI2luY2x1ZGUgImNpZnNfZnNfc2IuaCIKKworaW50IGNpZnNfZ2V0X2lub2RlX2luZm9fdW5peChzdHJ1Y3QgaW5vZGUgKipwaW5vZGUsCisJY29uc3QgdW5zaWduZWQgY2hhciAqc2VhcmNoX3BhdGgsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB4aWQpCit7CisJaW50IHJjID0gMDsKKwlGSUxFX1VOSVhfQkFTSUNfSU5GTyBmaW5kRGF0YTsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IgPSBDSUZTX1NCKHNiKTsKKwljaGFyICp0bXBfcGF0aDsKKworCXBUY29uID0gY2lmc19zYi0+dGNvbjsKKwljRllJKDEsICgiIEdldHRpbmcgaW5mbyBvbiAlcyAiLCBzZWFyY2hfcGF0aCkpOworCS8qIGNvdWxkIGhhdmUgZG9uZSBhIGZpbmQgZmlyc3QgaW5zdGVhZCBidXQgdGhpcyByZXR1cm5zIG1vcmUgaW5mbyAqLworCXJjID0gQ0lGU1NNQlVuaXhRUGF0aEluZm8oeGlkLCBwVGNvbiwgc2VhcmNoX3BhdGgsICZmaW5kRGF0YSwKKwkJCQkgIGNpZnNfc2ItPmxvY2FsX25scyk7CisvKglkdW1wX21lbSgiXG5Vbml4UVBhdGhJbmZvIHJldHVybiBkYXRhIiwgJmZpbmREYXRhLAorCQkgc2l6ZW9mKGZpbmREYXRhKSk7ICovCisJaWYgKHJjKSB7CisJCWlmIChyYyA9PSAtRVJFTU9URSkgeworCQkJdG1wX3BhdGggPQorCQkJICAgIGttYWxsb2Moc3RybmxlbihwVGNvbi0+dHJlZU5hbWUsCisJCQkJCSAgICBNQVhfVFJFRV9TSVpFICsgMSkgKworCQkJCSAgICBzdHJubGVuKHNlYXJjaF9wYXRoLCBNQVhfUEFUSENPTkYpICsgMSwKKwkJCQkgICAgR0ZQX0tFUk5FTCk7CisJCQlpZiAodG1wX3BhdGggPT0gTlVMTCkgeworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorICAgICAgICAJCS8qIGhhdmUgdG8gc2tpcCBmaXJzdCBvZiB0aGUgZG91YmxlIGJhY2tzbGFzaCBvZgorCQkJICAgVU5DIG5hbWUgKi8KKwkJCXN0cm5jcHkodG1wX3BhdGgsIHBUY29uLT50cmVlTmFtZSwgTUFYX1RSRUVfU0laRSk7CisJCQlzdHJuY2F0KHRtcF9wYXRoLCBzZWFyY2hfcGF0aCwgTUFYX1BBVEhDT05GKTsKKwkJCXJjID0gY29ubmVjdF90b19kZnNfcGF0aCh4aWQsIHBUY29uLT5zZXMsCisJCQkJCQkgLyogdHJlZW5hbWUgKyAqLyB0bXBfcGF0aCwKKwkJCQkJCSBjaWZzX3NiLT5sb2NhbF9ubHMpOworCQkJa2ZyZWUodG1wX3BhdGgpOworCisJCQkvKiBCQiBmaXggdXAgaW5vZGUgZXRjLiAqLworCQl9IGVsc2UgaWYgKHJjKSB7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9IGVsc2UgeworCQlzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqY2lmc0luZm87CisJCV9fdTMyIHR5cGUgPSBsZTMyX3RvX2NwdShmaW5kRGF0YS5UeXBlKTsKKwkJX191NjQgbnVtX29mX2J5dGVzID0gbGU2NF90b19jcHUoZmluZERhdGEuTnVtT2ZCeXRlcyk7CisJCV9fdTY0IGVuZF9vZl9maWxlID0gbGU2NF90b19jcHUoZmluZERhdGEuRW5kT2ZGaWxlKTsKKworCQkvKiBnZXQgbmV3IGlub2RlICovCisJCWlmICgqcGlub2RlID09IE5VTEwpIHsKKwkJCSpwaW5vZGUgPSBuZXdfaW5vZGUoc2IpOworCQkJaWYoKnBpbm9kZSA9PSBOVUxMKSAKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCS8qIElzIGFuIGlfaW5vIG9mIHplcm8gbGVnYWw/ICovCisJCQkvKiBBcmUgdGhlcmUgc2FuaXR5IGNoZWNrcyB3ZSBjYW4gdXNlIHRvIGVuc3VyZSB0aGF0CisJCQkgICB0aGUgc2VydmVyIGlzIHJlYWxseSBmaWxsaW5nIGluIHRoYXQgZmllbGQ/ICovCisJCQlpZihjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfU0VSVkVSX0lOVU0pIHsKKwkJCQkoKnBpbm9kZSktPmlfaW5vID0KKwkJCQkJKHVuc2lnbmVkIGxvbmcpZmluZERhdGEuVW5pcXVlSWQ7CisJCQl9IC8qIG5vdGUgaW5vIGluY3JlbWVudGVkIHRvIHVuaXF1ZSBudW0gaW4gbmV3X2lub2RlICovCisJCQlpbnNlcnRfaW5vZGVfaGFzaCgqcGlub2RlKTsKKwkJfQorCisJCWlub2RlID0gKnBpbm9kZTsKKwkJY2lmc0luZm8gPSBDSUZTX0koaW5vZGUpOworCisJCWNGWUkoMSwgKCIgT2xkIHRpbWUgJWxkICIsIGNpZnNJbmZvLT50aW1lKSk7CisJCWNpZnNJbmZvLT50aW1lID0gamlmZmllczsKKwkJY0ZZSSgxLCAoIiBOZXcgdGltZSAlbGQgIiwgY2lmc0luZm8tPnRpbWUpKTsKKwkJLyogdGhpcyBpcyBvayB0byBzZXQgb24gZXZlcnkgaW5vZGUgcmV2YWxpZGF0ZSAqLworCQlhdG9taWNfc2V0KCZjaWZzSW5mby0+aW5Vc2UsMSk7CisKKwkJaW5vZGUtPmlfYXRpbWUgPQorCQkgICAgY2lmc19OVHRpbWVUb1VuaXgobGU2NF90b19jcHUoZmluZERhdGEuTGFzdEFjY2Vzc1RpbWUpKTsKKwkJaW5vZGUtPmlfbXRpbWUgPQorCQkgICAgY2lmc19OVHRpbWVUb1VuaXgobGU2NF90b19jcHUKKwkJCQkoZmluZERhdGEuTGFzdE1vZGlmaWNhdGlvblRpbWUpKTsKKwkJaW5vZGUtPmlfY3RpbWUgPQorCQkgICAgY2lmc19OVHRpbWVUb1VuaXgobGU2NF90b19jcHUoZmluZERhdGEuTGFzdFN0YXR1c0NoYW5nZSkpOworCQlpbm9kZS0+aV9tb2RlID0gbGU2NF90b19jcHUoZmluZERhdGEuUGVybWlzc2lvbnMpOworCQlpZiAodHlwZSA9PSBVTklYX0ZJTEUpIHsKKwkJCWlub2RlLT5pX21vZGUgfD0gU19JRlJFRzsKKwkJfSBlbHNlIGlmICh0eXBlID09IFVOSVhfU1lNTElOSykgeworCQkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGTE5LOworCQl9IGVsc2UgaWYgKHR5cGUgPT0gVU5JWF9ESVIpIHsKKwkJCWlub2RlLT5pX21vZGUgfD0gU19JRkRJUjsKKwkJfSBlbHNlIGlmICh0eXBlID09IFVOSVhfQ0hBUkRFVikgeworCQkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGQ0hSOworCQkJaW5vZGUtPmlfcmRldiA9IE1LREVWKGxlNjRfdG9fY3B1KGZpbmREYXRhLkRldk1ham9yKSwKKwkJCQlsZTY0X3RvX2NwdShmaW5kRGF0YS5EZXZNaW5vcikgJiBNSU5PUk1BU0spOworCQl9IGVsc2UgaWYgKHR5cGUgPT0gVU5JWF9CTE9DS0RFVikgeworCQkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGQkxLOworCQkJaW5vZGUtPmlfcmRldiA9IE1LREVWKGxlNjRfdG9fY3B1KGZpbmREYXRhLkRldk1ham9yKSwKKwkJCQlsZTY0X3RvX2NwdShmaW5kRGF0YS5EZXZNaW5vcikgJiBNSU5PUk1BU0spOworCQl9IGVsc2UgaWYgKHR5cGUgPT0gVU5JWF9GSUZPKSB7CisJCQlpbm9kZS0+aV9tb2RlIHw9IFNfSUZJRk87CisJCX0gZWxzZSBpZiAodHlwZSA9PSBVTklYX1NPQ0tFVCkgeworCQkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGU09DSzsKKwkJfQorCQlpbm9kZS0+aV91aWQgPSBsZTY0X3RvX2NwdShmaW5kRGF0YS5VaWQpOworCQlpbm9kZS0+aV9naWQgPSBsZTY0X3RvX2NwdShmaW5kRGF0YS5HaWQpOworCQlpbm9kZS0+aV9ubGluayA9IGxlNjRfdG9fY3B1KGZpbmREYXRhLk5saW5rcyk7CisKKwkJaWYoaXNfc2l6ZV9zYWZlX3RvX2NoYW5nZShjaWZzSW5mbykpIHsKKwkJLyogY2FuIG5vdCBzYWZlbHkgY2hhbmdlIHRoZSBmaWxlIHNpemUgaGVyZSBpZiB0aGUKKwkJICAgY2xpZW50IGlzIHdyaXRpbmcgdG8gaXQgZHVlIHRvIHBvdGVudGlhbCByYWNlcyAqLworCisJCQlpX3NpemVfd3JpdGUoaW5vZGUsIGVuZF9vZl9maWxlKTsKKworCQkvKiBibGtzaXplIG5lZWRzIHRvIGJlIG11bHRpcGxlIG9mIHR3by4gU28gc2FmZXIgdG8gZGVmYXVsdCB0bworCQlibGtzaXplIGFuZCBibGtiaXRzIHNldCBpbiBzdXBlcmJsb2NrIHNvIDIqKmJsa2JpdHMgYW5kIGJsa3NpemUKKwkJd2lsbCBtYXRjaCByYXRoZXIgdGhhbiBzZXR0aW5nIHRvOgorCQkocFRjb24tPnNlcy0+c2VydmVyLT5tYXhCdWYgLSBNQVhfQ0lGU19IRFJfU0laRSkgJiAweEZGRkZGRTAwOyovCisKKwkJLyogVGhpcyBzZWVtcyBpbmNyZWRpYmx5IHN0dXBpZCBidXQgaXQgdHVybnMgb3V0IHRoYXQgaV9ibG9ja3MKKwkJICAgaXMgbm90IHJlbGF0ZWQgdG8gKGlfc2l6ZSAvIGlfYmxrc2l6ZSksIGluc3RlYWQgNTEyIGJ5dGUgc2l6ZQorCQkgICBpcyByZXF1aXJlZCBmb3IgY2FsY3VsYXRpbmcgbnVtIGJsb2NrcyAqLworCisJCS8qIDUxMiBieXRlcyAoMioqOSkgaXMgdGhlIGZha2UgYmxvY2tzaXplIHRoYXQgbXVzdCBiZSB1c2VkICovCisJCS8qIGZvciB0aGlzIGNhbGN1bGF0aW9uICovCisJCQlpbm9kZS0+aV9ibG9ja3MgPSAoNTEyIC0gMSArIG51bV9vZl9ieXRlcykgPj4gOTsKKwkJfQorCisJCWlmIChudW1fb2ZfYnl0ZXMgPCBlbmRfb2ZfZmlsZSkKKwkJCWNGWUkoMSwgKCJhbGxvY2F0aW9uIHNpemUgbGVzcyB0aGFuIGVuZCBvZiBmaWxlICIpKTsKKwkJY0ZZSSgxLAorCQkgICAgICgiU2l6ZSAlbGQgYW5kIGJsb2NrcyAlbGQiLAorCQkgICAgICAodW5zaWduZWQgbG9uZykgaW5vZGUtPmlfc2l6ZSwgaW5vZGUtPmlfYmxvY2tzKSk7CisJCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisJCQljRllJKDEsICgiIEZpbGUgaW5vZGUgIikpOworCQkJaW5vZGUtPmlfb3AgPSAmY2lmc19maWxlX2lub2RlX29wczsKKwkJCWlmKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9ESVJFQ1RfSU8pCisJCQkJaW5vZGUtPmlfZm9wID0gJmNpZnNfZmlsZV9kaXJlY3Rfb3BzOworCQkJZWxzZQorCQkJCWlub2RlLT5pX2ZvcCA9ICZjaWZzX2ZpbGVfb3BzOworCQkJaW5vZGUtPmlfZGF0YS5hX29wcyA9ICZjaWZzX2FkZHJfb3BzOworCQl9IGVsc2UgaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJCWNGWUkoMSwgKCIgRGlyZWN0b3J5IGlub2RlIikpOworCQkJaW5vZGUtPmlfb3AgPSAmY2lmc19kaXJfaW5vZGVfb3BzOworCQkJaW5vZGUtPmlfZm9wID0gJmNpZnNfZGlyX29wczsKKwkJfSBlbHNlIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKSB7CisJCQljRllJKDEsICgiIFN5bWJvbGljIExpbmsgaW5vZGUgIikpOworCQkJaW5vZGUtPmlfb3AgPSAmY2lmc19zeW1saW5rX2lub2RlX29wczsKKwkJLyogdG1wX2lub2RlLT5pX2ZvcCA9ICovIC8qIGRvIG5vdCBuZWVkIHRvIHNldCB0byBhbnl0aGluZyAqLworCQl9IGVsc2UgeworCQkJY0ZZSSgxLCAoIiBJbml0IHNwZWNpYWwgaW5vZGUgIikpOworCQkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLAorCQkJCQkgICBpbm9kZS0+aV9yZGV2KTsKKwkJfQorCX0KKwlyZXR1cm4gcmM7Cit9CisKK2ludCBjaWZzX2dldF9pbm9kZV9pbmZvKHN0cnVjdCBpbm9kZSAqKnBpbm9kZSwKKwljb25zdCB1bnNpZ25lZCBjaGFyICpzZWFyY2hfcGF0aCwgRklMRV9BTExfSU5GTyAqcGZpbmREYXRhLAorCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB4aWQpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IgPSBDSUZTX1NCKHNiKTsKKwljaGFyICp0bXBfcGF0aDsKKwljaGFyICpidWYgPSBOVUxMOworCisJcFRjb24gPSBjaWZzX3NiLT50Y29uOworCWNGWUkoMSwoIkdldHRpbmcgaW5mbyBvbiAlcyAiLCBzZWFyY2hfcGF0aCkpOworCisJaWYoKHBmaW5kRGF0YSA9PSBOVUxMKSAmJiAoKnBpbm9kZSAhPSBOVUxMKSkgeworCQlpZihDSUZTX0koKnBpbm9kZSktPmNsaWVudENhbkNhY2hlUmVhZCkgeworCQkJY0ZZSSgxLCgiTm8gbmVlZCB0byByZXZhbGlkYXRlIGNhY2hlZCBpbm9kZSBzaXplcyIpKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKworCS8qIGlmIGZpbGUgaW5mbyBub3QgcGFzc2VkIGluIHRoZW4gZ2V0IGl0IGZyb20gc2VydmVyICovCisJaWYocGZpbmREYXRhID09IE5VTEwpIHsKKwkJYnVmID0ga21hbGxvYyhzaXplb2YoRklMRV9BTExfSU5GTyksIEdGUF9LRVJORUwpOworCQlpZihidWYgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlwZmluZERhdGEgPSAoRklMRV9BTExfSU5GTyAqKWJ1ZjsKKwkJLyogY291bGQgZG8gZmluZCBmaXJzdCBpbnN0ZWFkIGJ1dCB0aGlzIHJldHVybnMgbW9yZSBpbmZvICovCisJCXJjID0gQ0lGU1NNQlFQYXRoSW5mbyh4aWQsIHBUY29uLCBzZWFyY2hfcGF0aCwgcGZpbmREYXRhLAorCQkJICAgICAgY2lmc19zYi0+bG9jYWxfbmxzKTsKKwl9CisJLyogZHVtcF9tZW0oIlxuUVBhdGhJbmZvIHJldHVybiBkYXRhIiwmZmluZERhdGEsIHNpemVvZihmaW5kRGF0YSkpOyAqLworCWlmIChyYykgeworCQlpZiAocmMgPT0gLUVSRU1PVEUpIHsKKwkJCXRtcF9wYXRoID0KKwkJCSAgICBrbWFsbG9jKHN0cm5sZW4KKwkJCQkgICAgKHBUY29uLT50cmVlTmFtZSwKKwkJCQkgICAgIE1BWF9UUkVFX1NJWkUgKyAxKSArCisJCQkJICAgIHN0cm5sZW4oc2VhcmNoX3BhdGgsIE1BWF9QQVRIQ09ORikgKyAxLAorCQkJCSAgICBHRlBfS0VSTkVMKTsKKwkJCWlmICh0bXBfcGF0aCA9PSBOVUxMKSB7CisJCQkJa2ZyZWUoYnVmKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKworCQkJc3RybmNweSh0bXBfcGF0aCwgcFRjb24tPnRyZWVOYW1lLCBNQVhfVFJFRV9TSVpFKTsKKwkJCXN0cm5jYXQodG1wX3BhdGgsIHNlYXJjaF9wYXRoLCBNQVhfUEFUSENPTkYpOworCQkJcmMgPSBjb25uZWN0X3RvX2Rmc19wYXRoKHhpZCwgcFRjb24tPnNlcywKKwkJCQkJCSAvKiB0cmVlbmFtZSArICovIHRtcF9wYXRoLAorCQkJCQkJIGNpZnNfc2ItPmxvY2FsX25scyk7CisJCQlrZnJlZSh0bXBfcGF0aCk7CisJCQkvKiBCQiBmaXggdXAgaW5vZGUgZXRjLiAqLworCQl9IGVsc2UgaWYgKHJjKSB7CisJCQlrZnJlZShidWYpOworCQkJcmV0dXJuIHJjOworCQl9CisJfSBlbHNlIHsKKwkJc3RydWN0IGNpZnNJbm9kZUluZm8gKmNpZnNJbmZvOworCQlfX3UzMiBhdHRyID0gbGUzMl90b19jcHUocGZpbmREYXRhLT5BdHRyaWJ1dGVzKTsKKworCQkvKiBnZXQgbmV3IGlub2RlICovCisJCWlmICgqcGlub2RlID09IE5VTEwpIHsKKwkJCSpwaW5vZGUgPSBuZXdfaW5vZGUoc2IpOworCQkJaWYgKCpwaW5vZGUgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCS8qIElzIGFuIGlfaW5vIG9mIHplcm8gbGVnYWw/IENhbiB3ZSB1c2UgdGhhdCB0byBjaGVjaworCQkJICAgaWYgdGhlIHNlcnZlciBzdXBwb3J0cyByZXR1cm5pbmcgaW5vZGUgbnVtYmVycz8gIEFyZQorCQkJICAgdGhlcmUgb3RoZXIgc2FuaXR5IGNoZWNrcyB3ZSBjYW4gdXNlIHRvIGVuc3VyZSB0aGF0CisJCQkgICB0aGUgc2VydmVyIGlzIHJlYWxseSBmaWxsaW5nIGluIHRoYXQgZmllbGQ/ICovCisKKwkJCS8qIFdlIGNhbiBub3QgdXNlIHRoZSBJbmRleE51bWJlciBmaWVsZCBieSBkZWZhdWx0IGZyb20KKwkJCSAgIFdpbmRvd3Mgb3IgU2FtYmEgKGluIEFMTF9JTkZPIGJ1ZikgYnV0IHdlIGNhbiByZXF1ZXN0CisJCQkgICBpdCBleHBsaWNpdGx5LiAgSXQgbWF5IG5vdCBiZSB1bmlxdWUgcHJlc3VtYWJseSBpZgorCQkJICAgdGhlIHNlcnZlciBoYXMgbXVsdGlwbGUgZGV2aWNlcyBtb3VudGVkIHVuZGVyIG9uZQorCQkJICAgc2hhcmUgKi8KKworCQkJLyogVGhlcmUgbWF5IGJlIGhpZ2hlciBpbmZvIGxldmVscyB0aGF0IHdvcmsgYnV0IGFyZQorCQkJICAgdGhlcmUgV2luZG93cyBzZXJ2ZXIgb3IgbmV0d29yayBhcHBsaWFuY2VzIGZvciB3aGljaAorCQkJICAgSW5kZXhOdW1iZXIgZmllbGQgaXMgbm90IGd1YXJhbnRlZWQgdW5pcXVlPyAqLworCisjaWZkZWYgQ09ORklHX0NJRlNfRVhQRVJJTUVOVEFMCQkKKwkJCWlmKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9TRVJWRVJfSU5VTSl7CisJCQkJaW50IHJjMSA9IDA7CisJCQkJX191NjQgaW5vZGVfbnVtOworCisJCQkJcmMxID0gQ0lGU0dldFNydklub2RlTnVtYmVyKHhpZCwgcFRjb24sIAorCQkJCQlzZWFyY2hfcGF0aCwgJmlub2RlX251bSwgCisJCQkJCWNpZnNfc2ItPmxvY2FsX25scyk7CisJCQkJaWYocmMxKSB7CisJCQkJCWNGWUkoMSwoIkdldFNydklub2RlTnVtIHJjICVkIiwgcmMxKSk7CisJCQkJCS8qIEJCIEVPUE5PU1VQUCBkaXNhYmxlIFNFUlZFUl9JTlVNPyAqLworCQkJCX0gZWxzZSAvKiBkbyB3ZSBuZWVkIGNhc3Qgb3IgaGFzaCB0byBpbm8/ICovCisJCQkJCSgqcGlub2RlKS0+aV9pbm8gPSBpbm9kZV9udW07CisJCQl9IC8qIGVsc2UgaW5vIGluY3JlbWVudGVkIHRvIHVuaXF1ZSBudW0gaW4gbmV3X2lub2RlKi8KKyNlbmRpZiAvKiBDSUZTX0VYUEVSSU1FTlRBTCAqLworCQkJaW5zZXJ0X2lub2RlX2hhc2goKnBpbm9kZSk7CisJCX0KKwkJaW5vZGUgPSAqcGlub2RlOworCQljaWZzSW5mbyA9IENJRlNfSShpbm9kZSk7CisJCWNpZnNJbmZvLT5jaWZzQXR0cnMgPSBhdHRyOworCQljRllJKDEsICgiIE9sZCB0aW1lICVsZCAiLCBjaWZzSW5mby0+dGltZSkpOworCQljaWZzSW5mby0+dGltZSA9IGppZmZpZXM7CisJCWNGWUkoMSwgKCIgTmV3IHRpbWUgJWxkICIsIGNpZnNJbmZvLT50aW1lKSk7CisKKwkJLyogYmxrc2l6ZSBuZWVkcyB0byBiZSBtdWx0aXBsZSBvZiB0d28uIFNvIHNhZmVyIHRvIGRlZmF1bHQgdG8KKwkJYmxrc2l6ZSBhbmQgYmxrYml0cyBzZXQgaW4gc3VwZXJibG9jayBzbyAyKipibGtiaXRzIGFuZCBibGtzaXplCisJCXdpbGwgbWF0Y2ggcmF0aGVyIHRoYW4gc2V0dGluZyB0bzoKKwkJKHBUY29uLT5zZXMtPnNlcnZlci0+bWF4QnVmIC0gTUFYX0NJRlNfSERSX1NJWkUpICYgMHhGRkZGRkUwMDsqLworCisJCS8qIExpbnV4IGNhbiBub3Qgc3RvcmUgZmlsZSBjcmVhdGlvbiB0aW1lIHVuZm9ydHVuYXRlbHkgc28gd2UgaWdub3JlIGl0ICovCisJCWlub2RlLT5pX2F0aW1lID0KKwkJICAgIGNpZnNfTlR0aW1lVG9Vbml4KGxlNjRfdG9fY3B1KHBmaW5kRGF0YS0+TGFzdEFjY2Vzc1RpbWUpKTsKKwkJaW5vZGUtPmlfbXRpbWUgPQorCQkgICAgY2lmc19OVHRpbWVUb1VuaXgobGU2NF90b19jcHUocGZpbmREYXRhLT5MYXN0V3JpdGVUaW1lKSk7CisJCWlub2RlLT5pX2N0aW1lID0KKwkJICAgIGNpZnNfTlR0aW1lVG9Vbml4KGxlNjRfdG9fY3B1KHBmaW5kRGF0YS0+Q2hhbmdlVGltZSkpOworCQljRllJKDAsICgiIEF0dHJpYnV0ZXMgY2FtZSBpbiBhcyAweCV4ICIsIGF0dHIpKTsKKworCQkvKiBzZXQgZGVmYXVsdCBtb2RlLiB3aWxsIG92ZXJyaWRlIGZvciBkaXJzIGJlbG93ICovCisJCWlmIChhdG9taWNfcmVhZCgmY2lmc0luZm8tPmluVXNlKSA9PSAwKQorCQkJLyogbmV3IGlub2RlLCBjYW4gc2FmZWx5IHNldCB0aGVzZSBmaWVsZHMgKi8KKwkJCWlub2RlLT5pX21vZGUgPSBjaWZzX3NiLT5tbnRfZmlsZV9tb2RlOworCisvKgkJaWYgKGF0dHIgJiBBVFRSX1JFUEFSU0UpICAqLworCQkvKiBXZSBubyBsb25nZXIgaGFuZGxlIHRoZXNlIGFzIHN5bWxpbmtzIGJlY2F1c2Ugd2UgY291bGQgbm90CisJCSAgIGZvbGxvdyB0aGVtIGR1ZSB0byB0aGUgYWJzb2x1dGUgcGF0aCB3aXRoIGRyaXZlIGxldHRlciAqLworCQlpZiAoYXR0ciAmIEFUVFJfRElSRUNUT1JZKSB7CisJCS8qIG92ZXJyaWRlIGRlZmF1bHQgcGVybXMgc2luY2Ugd2UgZG8gbm90IGRvIGJ5dGUgcmFuZ2UgbG9ja2luZworCQkgICBvbiBkaXJzICovCisJCQlpbm9kZS0+aV9tb2RlID0gY2lmc19zYi0+bW50X2Rpcl9tb2RlOworCQkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGRElSOworCQl9IGVsc2UgeworCQkJaW5vZGUtPmlfbW9kZSB8PSBTX0lGUkVHOworCQkJLyogdHJlYXQgdGhlIGRvcyBhdHRyaWJ1dGUgb2YgcmVhZC1vbmx5IGFzIHJlYWQtb25seQorCQkJICAgbW9kZSBlLmcuIDU1NSAqLworCQkJaWYgKGNpZnNJbmZvLT5jaWZzQXR0cnMgJiBBVFRSX1JFQURPTkxZKQorCQkJCWlub2RlLT5pX21vZGUgJj0gfihTX0lXVUdPKTsKKwkJLyogQkIgYWRkIGNvZGUgaGVyZSAtCisJCSAgIHZhbGlkYXRlIGlmIGRldmljZSBvciB3ZWlyZCBzaGFyZSBvciBkZXZpY2UgdHlwZT8gKi8KKwkJfQorCQlpZiAoaXNfc2l6ZV9zYWZlX3RvX2NoYW5nZShjaWZzSW5mbykpIHsKKwkJCS8qIGNhbiBub3Qgc2FmZWx5IGNoYW5nZSB0aGUgZmlsZSBzaXplIGhlcmUgaWYgdGhlCisJCQkgICBjbGllbnQgaXMgd3JpdGluZyB0byBpdCBkdWUgdG8gcG90ZW50aWFsIHJhY2VzICovCisJCQlpX3NpemVfd3JpdGUoaW5vZGUsbGU2NF90b19jcHUocGZpbmREYXRhLT5FbmRPZkZpbGUpKTsKKworCQkJLyogNTEyIGJ5dGVzICgyKio5KSBpcyB0aGUgZmFrZSBibG9ja3NpemUgdGhhdCBtdXN0IGJlCisJCQkgICB1c2VkIGZvciB0aGlzIGNhbGN1bGF0aW9uICovCisJCQlpbm9kZS0+aV9ibG9ja3MgPSAoNTEyIC0gMSArIGxlNjRfdG9fY3B1KAorCQkJCQkgICBwZmluZERhdGEtPkFsbG9jYXRpb25TaXplKSkgPj4gOTsKKwkJfQorCisJCWlub2RlLT5pX25saW5rID0gbGUzMl90b19jcHUocGZpbmREYXRhLT5OdW1iZXJPZkxpbmtzKTsKKworCQkvKiBCQiBmaWxsIGluIHVpZCBhbmQgZ2lkIGhlcmU/IHdpdGggaGVscCBmcm9tIHdpbmJpbmQ/IAorCQkgICBvciByZXRyaWV2ZSBmcm9tIE5URlMgc3RyZWFtIGV4dGVuZGVkIGF0dHJpYnV0ZSAqLworCQlpZiAoYXRvbWljX3JlYWQoJmNpZnNJbmZvLT5pblVzZSkgPT0gMCkgeworCQkJaW5vZGUtPmlfdWlkID0gY2lmc19zYi0+bW50X3VpZDsKKwkJCWlub2RlLT5pX2dpZCA9IGNpZnNfc2ItPm1udF9naWQ7CisJCQkvKiBzZXQgc28gd2UgZG8gbm90IGtlZXAgcmVmcmVzaGluZyB0aGVzZSBmaWVsZHMgd2l0aAorCQkJICAgYmFkIGRhdGEgYWZ0ZXIgdXNlciBoYXMgY2hhbmdlZCB0aGVtIGluIG1lbW9yeSAqLworCQkJYXRvbWljX3NldCgmY2lmc0luZm8tPmluVXNlLDEpOworCQl9CisKKwkJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwkJCWNGWUkoMSwgKCIgRmlsZSBpbm9kZSAiKSk7CisJCQlpbm9kZS0+aV9vcCA9ICZjaWZzX2ZpbGVfaW5vZGVfb3BzOworCQkJaWYoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX0RJUkVDVF9JTykKKwkJCQlpbm9kZS0+aV9mb3AgPSAmY2lmc19maWxlX2RpcmVjdF9vcHM7CisJCQllbHNlCisJCQkJaW5vZGUtPmlfZm9wID0gJmNpZnNfZmlsZV9vcHM7CisJCQlpbm9kZS0+aV9kYXRhLmFfb3BzID0gJmNpZnNfYWRkcl9vcHM7CisJCX0gZWxzZSBpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgeworCQkJY0ZZSSgxLCAoIiBEaXJlY3RvcnkgaW5vZGUgIikpOworCQkJaW5vZGUtPmlfb3AgPSAmY2lmc19kaXJfaW5vZGVfb3BzOworCQkJaW5vZGUtPmlfZm9wID0gJmNpZnNfZGlyX29wczsKKwkJfSBlbHNlIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKSB7CisJCQljRllJKDEsICgiIFN5bWJvbGljIExpbmsgaW5vZGUgIikpOworCQkJaW5vZGUtPmlfb3AgPSAmY2lmc19zeW1saW5rX2lub2RlX29wczsKKwkJfSBlbHNlIHsKKwkJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwKKwkJCQkJICAgaW5vZGUtPmlfcmRldik7CisJCX0KKwl9CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIGdldHMgcm9vdCBpbm9kZSAqLwordm9pZCBjaWZzX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpbnQgeGlkOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisKKwljaWZzX3NiID0gQ0lGU19TQihpbm9kZS0+aV9zYik7CisJeGlkID0gR2V0WGlkKCk7CisJaWYgKGNpZnNfc2ItPnRjb24tPnNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX1VOSVgpCisJCWNpZnNfZ2V0X2lub2RlX2luZm9fdW5peCgmaW5vZGUsICIiLCBpbm9kZS0+aV9zYix4aWQpOworCWVsc2UKKwkJY2lmc19nZXRfaW5vZGVfaW5mbygmaW5vZGUsICIiLCBOVUxMLCBpbm9kZS0+aV9zYix4aWQpOworCS8qIGNhbiBub3QgY2FsbCBtYWNybyBGcmVlWGlkIGhlcmUgc2luY2UgaW4gYSB2b2lkIGZ1bmMgKi8KKwlfRnJlZVhpZCh4aWQpOworfQorCitpbnQgY2lmc191bmxpbmsoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRlbnRyeSAqZGlyZW50cnkpCit7CisJaW50IHJjID0gMDsKKwlpbnQgeGlkOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisJc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb247CisJY2hhciAqZnVsbF9wYXRoID0gTlVMTDsKKwlzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqY2lmc0lub2RlOworCUZJTEVfQkFTSUNfSU5GTyAqcGluZm9fYnVmOworCisJY0ZZSSgxLCAoIiBjaWZzX3VubGluaywgaW5vZGUgPSAweCVwIHdpdGggIiwgaW5vZGUpKTsKKworCXhpZCA9IEdldFhpZCgpOworCisJY2lmc19zYiA9IENJRlNfU0IoaW5vZGUtPmlfc2IpOworCXBUY29uID0gY2lmc19zYi0+dGNvbjsKKworCS8qIFVubGluayBjYW4gYmUgY2FsbGVkIGZyb20gcmVuYW1lIHNvIHdlIGNhbiBub3QgZ3JhYiB0aGUgc2VtIGhlcmUKKwkgICBzaW5jZSB3ZSBkZWFkbG9jayBvdGhlcndpc2UgKi8KKy8qCWRvd24oJmRpcmVudHJ5LT5kX3NiLT5zX3Zmc19yZW5hbWVfc2VtKTsqLworCWZ1bGxfcGF0aCA9IGJ1aWxkX3BhdGhfZnJvbV9kZW50cnkoZGlyZW50cnkpOworLyoJdXAoJmRpcmVudHJ5LT5kX3NiLT5zX3Zmc19yZW5hbWVfc2VtKTsqLworCWlmIChmdWxsX3BhdGggPT0gTlVMTCkgeworCQlGcmVlWGlkKHhpZCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyYyA9IENJRlNTTUJEZWxGaWxlKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwgY2lmc19zYi0+bG9jYWxfbmxzKTsKKworCWlmICghcmMpIHsKKwkJZGlyZW50cnktPmRfaW5vZGUtPmlfbmxpbmstLTsKKwl9IGVsc2UgaWYgKHJjID09IC1FTk9FTlQpIHsKKwkJZF9kcm9wKGRpcmVudHJ5KTsKKwl9IGVsc2UgaWYgKHJjID09IC1FVFhUQlNZKSB7CisJCWludCBvcGxvY2sgPSBGQUxTRTsKKwkJX191MTYgbmV0ZmlkOworCisJCXJjID0gQ0lGU1NNQk9wZW4oeGlkLCBwVGNvbiwgZnVsbF9wYXRoLCBGSUxFX09QRU4sIERFTEVURSwKKwkJCQkgQ1JFQVRFX05PVF9ESVIgfCBDUkVBVEVfREVMRVRFX09OX0NMT1NFLAorCQkJCSAmbmV0ZmlkLCAmb3Bsb2NrLCBOVUxMLCBjaWZzX3NiLT5sb2NhbF9ubHMpOworCQlpZiAocmM9PTApIHsKKwkJCUNJRlNTTUJSZW5hbWVPcGVuRmlsZSh4aWQsIHBUY29uLCBuZXRmaWQsIE5VTEwsCisJCQkJCSAgICAgIGNpZnNfc2ItPmxvY2FsX25scyk7CisJCQlDSUZTU01CQ2xvc2UoeGlkLCBwVGNvbiwgbmV0ZmlkKTsKKwkJCWRpcmVudHJ5LT5kX2lub2RlLT5pX25saW5rLS07CisJCX0KKwl9IGVsc2UgaWYgKHJjID09IC1FQUNDRVMpIHsKKwkJLyogdHJ5IG9ubHkgaWYgci9vIGF0dHJpYnV0ZSBzZXQgaW4gbG9jYWwgbG9va3VwIGRhdGE/ICovCisJCXBpbmZvX2J1ZiA9IGttYWxsb2Moc2l6ZW9mKEZJTEVfQkFTSUNfSU5GTyksIEdGUF9LRVJORUwpOworCQlpZiAocGluZm9fYnVmKSB7CisJCQltZW1zZXQocGluZm9fYnVmLCAwLCBzaXplb2YoRklMRV9CQVNJQ19JTkZPKSk7CisJCQkvKiBBVFRSUyBzZXQgdG8gbm9ybWFsIGNsZWFycyByL28gYml0ICovCisJCQlwaW5mb19idWYtPkF0dHJpYnV0ZXMgPSBjcHVfdG9fbGUzMihBVFRSX05PUk1BTCk7CisJCQlpZiAoIShwVGNvbi0+c2VzLT5mbGFncyAmIENJRlNfU0VTX05UNCkpCisJCQkJcmMgPSBDSUZTU01CU2V0VGltZXMoeGlkLCBwVGNvbiwgZnVsbF9wYXRoLAorCQkJCQkJICAgICBwaW5mb19idWYsCisJCQkJCQkgICAgIGNpZnNfc2ItPmxvY2FsX25scyk7CisJCQllbHNlCisJCQkJcmMgPSAtRU9QTk9UU1VQUDsKKworCQkJaWYgKHJjID09IC1FT1BOT1RTVVBQKSB7CisJCQkJaW50IG9wbG9jayA9IEZBTFNFOworCQkJCV9fdTE2IG5ldGZpZDsKKwkJCS8qCXJjID0gQ0lGU1NNQlNldEF0dHJMZWdhY3koeGlkLCBwVGNvbiwKKwkJCQkJCQkgIGZ1bGxfcGF0aCwKKwkJCQkJCQkgIChfX3UxNilBVFRSX05PUk1BTCwKKwkJCQkJCQkgIGNpZnNfc2ItPmxvY2FsX25scyk7IAorCQkJICAgRm9yIHNvbWUgc3RyYW5nZSByZWFzb24gaXQgc2VlbXMgdGhhdCBOVDQgZWF0cyB0aGUKKwkJCSAgIG9sZCBzZXRhdHRyIGNhbGwgd2l0aG91dCBhY3R1YWxseSBzZXR0aW5nIHRoZQorCQkJICAgYXR0cmlidXRlcyBzbyBvbiB0byB0aGUgdGhpcmQgYXR0ZW1wdGVkIHdvcmthcm91bmQKKwkJCSAgICovCisKKwkJCS8qIEJCIGNvdWxkIHNjYW4gdG8gc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBpdCBvcGVuCisJCQkgICBhbmQgcGFzcyBpbiBwaWQgb2Ygb3BlbmVyIHRvIGZ1bmN0aW9uICovCisJCQkJcmMgPSBDSUZTU01CT3Blbih4aWQsIHBUY29uLCBmdWxsX3BhdGgsCisJCQkJCQkgRklMRV9PUEVOLCBTWU5DSFJPTklaRSB8CisJCQkJCQkgRklMRV9XUklURV9BVFRSSUJVVEVTLCAwLAorCQkJCQkJICZuZXRmaWQsICZvcGxvY2ssIE5VTEwsCisJCQkJCQkgY2lmc19zYi0+bG9jYWxfbmxzKTsKKwkJCQlpZiAocmM9PTApIHsKKwkJCQkJcmMgPSBDSUZTU01CU2V0RmlsZVRpbWVzKHhpZCwgcFRjb24sCisJCQkJCQkJCSBwaW5mb19idWYsCisJCQkJCQkJCSBuZXRmaWQpOworCQkJCQlDSUZTU01CQ2xvc2UoeGlkLCBwVGNvbiwgbmV0ZmlkKTsKKwkJCQl9CisJCQl9CisJCQlrZnJlZShwaW5mb19idWYpOworCQl9CisJCWlmIChyYz09MCkgeworCQkJcmMgPSBDSUZTU01CRGVsRmlsZSh4aWQsIHBUY29uLCBmdWxsX3BhdGgsCisJCQkJCSAgICBjaWZzX3NiLT5sb2NhbF9ubHMpOworCQkJaWYgKCFyYykgeworCQkJCWRpcmVudHJ5LT5kX2lub2RlLT5pX25saW5rLS07CisJCQl9IGVsc2UgaWYgKHJjID09IC1FVFhUQlNZKSB7CisJCQkJaW50IG9wbG9jayA9IEZBTFNFOworCQkJCV9fdTE2IG5ldGZpZDsKKworCQkJCXJjID0gQ0lGU1NNQk9wZW4oeGlkLCBwVGNvbiwgZnVsbF9wYXRoLAorCQkJCQkJIEZJTEVfT1BFTiwgREVMRVRFLAorCQkJCQkJIENSRUFURV9OT1RfRElSIHwKKwkJCQkJCSBDUkVBVEVfREVMRVRFX09OX0NMT1NFLAorCQkJCQkJICZuZXRmaWQsICZvcGxvY2ssIE5VTEwsCisJCQkJCQkgY2lmc19zYi0+bG9jYWxfbmxzKTsKKwkJCQlpZiAocmM9PTApIHsKKwkJCQkJQ0lGU1NNQlJlbmFtZU9wZW5GaWxlKHhpZCwgcFRjb24sCisJCQkJCQluZXRmaWQsIE5VTEwsCisJCQkJCQljaWZzX3NiLT5sb2NhbF9ubHMpOworCQkJCQlDSUZTU01CQ2xvc2UoeGlkLCBwVGNvbiwgbmV0ZmlkKTsKKwkJICAgICAgICAgICAgICAgICAgICAgICAgZGlyZW50cnktPmRfaW5vZGUtPmlfbmxpbmstLTsKKwkJCQl9CisJCQkvKiBCQiBpZiByYyA9IC1FVFhUQlVTWSBnb3RvIHRoZSByZW5hbWUgbG9naWMgQkIgKi8KKwkJCX0KKwkJfQorCX0KKwljaWZzSW5vZGUgPSBDSUZTX0koZGlyZW50cnktPmRfaW5vZGUpOworCWNpZnNJbm9kZS0+dGltZSA9IDA7CS8qIHdpbGwgZm9yY2UgcmV2YWxpZGF0ZSB0byBnZXQgaW5mbyB3aGVuCisJCQkJICAgbmVlZGVkICovCisJZGlyZW50cnktPmRfaW5vZGUtPmlfY3RpbWUgPSBpbm9kZS0+aV9jdGltZSA9IGlub2RlLT5pX210aW1lID0KKwkJY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKKwljaWZzSW5vZGUgPSBDSUZTX0koaW5vZGUpOworCWNpZnNJbm9kZS0+dGltZSA9IDA7CS8qIGZvcmNlIHJldmFsaWRhdGUgb2YgZGlyIGFzIHdlbGwgKi8KKworCWtmcmVlKGZ1bGxfcGF0aCk7CisJRnJlZVhpZCh4aWQpOworCXJldHVybiByYzsKK30KKworaW50IGNpZnNfbWtkaXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRlbnRyeSAqZGlyZW50cnksIGludCBtb2RlKQoreworCWludCByYyA9IDA7CisJaW50IHhpZDsKKwlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiOworCXN0cnVjdCBjaWZzVGNvbkluZm8gKnBUY29uOworCWNoYXIgKmZ1bGxfcGF0aCA9IE5VTEw7CisJc3RydWN0IGlub2RlICpuZXdpbm9kZSA9IE5VTEw7CisKKwljRllJKDEsICgiSW4gY2lmc19ta2RpciwgbW9kZSA9IDB4JXggaW5vZGUgPSAweCVwICIsIG1vZGUsIGlub2RlKSk7CisKKwl4aWQgPSBHZXRYaWQoKTsKKworCWNpZnNfc2IgPSBDSUZTX1NCKGlub2RlLT5pX3NiKTsKKwlwVGNvbiA9IGNpZnNfc2ItPnRjb247CisKKwlkb3duKCZpbm9kZS0+aV9zYi0+c192ZnNfcmVuYW1lX3NlbSk7CisJZnVsbF9wYXRoID0gYnVpbGRfcGF0aF9mcm9tX2RlbnRyeShkaXJlbnRyeSk7CisJdXAoJmlub2RlLT5pX3NiLT5zX3Zmc19yZW5hbWVfc2VtKTsKKwlpZiAoZnVsbF9wYXRoID09IE5VTEwpIHsKKwkJRnJlZVhpZCh4aWQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLyogQkIgYWRkIHNldHRpbmcgdGhlIGVxdWl2YWxlbnQgb2YgbW9kZSB2aWEgQ3JlYXRlWCB3L0FDTHMgKi8KKwlyYyA9IENJRlNTTUJNa0Rpcih4aWQsIHBUY29uLCBmdWxsX3BhdGgsIGNpZnNfc2ItPmxvY2FsX25scyk7CisJaWYgKHJjKSB7CisJCWNGWUkoMSwgKCJjaWZzX21rZGlyIHJldHVybmVkIDB4JXggIiwgcmMpKTsKKwkJZF9kcm9wKGRpcmVudHJ5KTsKKwl9IGVsc2UgeworCQlpbm9kZS0+aV9ubGluaysrOworCQlpZiAocFRjb24tPnNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX1VOSVgpCisJCQlyYyA9IGNpZnNfZ2V0X2lub2RlX2luZm9fdW5peCgmbmV3aW5vZGUsIGZ1bGxfcGF0aCwKKwkJCQkJCSAgICAgIGlub2RlLT5pX3NiLHhpZCk7CisJCWVsc2UKKwkJCXJjID0gY2lmc19nZXRfaW5vZGVfaW5mbygmbmV3aW5vZGUsIGZ1bGxfcGF0aCwgTlVMTCwKKwkJCQkJCSBpbm9kZS0+aV9zYix4aWQpOworCisJCWRpcmVudHJ5LT5kX29wID0gJmNpZnNfZGVudHJ5X29wczsKKwkJZF9pbnN0YW50aWF0ZShkaXJlbnRyeSwgbmV3aW5vZGUpOworCQlpZiAoZGlyZW50cnktPmRfaW5vZGUpCisJCQlkaXJlbnRyeS0+ZF9pbm9kZS0+aV9ubGluayA9IDI7CisJCWlmIChjaWZzX3NiLT50Y29uLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9VTklYKQorCQkJaWYoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX1NFVF9VSUQpIHsKKwkJCQlDSUZTU01CVW5peFNldFBlcm1zKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwKKwkJCQkJCSAgICBtb2RlLAorCQkJCQkJICAgIChfX3U2NCljdXJyZW50LT5ldWlkLAorCQkJCQkJICAgIChfX3U2NCljdXJyZW50LT5lZ2lkLAorCQkJCQkJICAgIDAgLyogZGV2X3QgKi8sCisJCQkJCQkgICAgY2lmc19zYi0+bG9jYWxfbmxzKTsKKwkJCX0gZWxzZSB7CisJCQkJQ0lGU1NNQlVuaXhTZXRQZXJtcyh4aWQsIHBUY29uLCBmdWxsX3BhdGgsCisJCQkJCQkgICAgbW9kZSwgKF9fdTY0KS0xLAorCQkJCQkJICAgIChfX3U2NCktMSwgMCAvKiBkZXZfdCAqLywKKwkJCQkJCSAgICBjaWZzX3NiLT5sb2NhbF9ubHMpOworCQkJfQorCQllbHNlIHsKKwkJCS8qIEJCIHRvIGJlIGltcGxlbWVudGVkIHZpYSBXaW5kb3dzIHNlY3J0eSBkZXNjcmlwdG9ycworCQkJICAgZWcgQ0lGU1NNQldpblNldFBlcm1zKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwgbW9kZSwKKwkJCQkJCSAtMSwgLTEsIGxvY2FsX25scyk7ICovCisJCX0KKwl9CisJa2ZyZWUoZnVsbF9wYXRoKTsKKwlGcmVlWGlkKHhpZCk7CisJcmV0dXJuIHJjOworfQorCitpbnQgY2lmc19ybWRpcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICpkaXJlbnRyeSkKK3sKKwlpbnQgcmMgPSAwOworCWludCB4aWQ7CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYjsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKwljaGFyICpmdWxsX3BhdGggPSBOVUxMOworCXN0cnVjdCBjaWZzSW5vZGVJbmZvICpjaWZzSW5vZGU7CisKKwljRllJKDEsICgiIGNpZnNfcm1kaXIsIGlub2RlID0gMHglcCB3aXRoICIsIGlub2RlKSk7CisKKwl4aWQgPSBHZXRYaWQoKTsKKworCWNpZnNfc2IgPSBDSUZTX1NCKGlub2RlLT5pX3NiKTsKKwlwVGNvbiA9IGNpZnNfc2ItPnRjb247CisKKwlkb3duKCZpbm9kZS0+aV9zYi0+c192ZnNfcmVuYW1lX3NlbSk7CisJZnVsbF9wYXRoID0gYnVpbGRfcGF0aF9mcm9tX2RlbnRyeShkaXJlbnRyeSk7CisJdXAoJmlub2RlLT5pX3NiLT5zX3Zmc19yZW5hbWVfc2VtKTsKKwlpZiAoZnVsbF9wYXRoID09IE5VTEwpIHsKKwkJRnJlZVhpZCh4aWQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyYyA9IENJRlNTTUJSbURpcih4aWQsIHBUY29uLCBmdWxsX3BhdGgsIGNpZnNfc2ItPmxvY2FsX25scyk7CisKKwlpZiAoIXJjKSB7CisJCWlub2RlLT5pX25saW5rLS07CisJCWlfc2l6ZV93cml0ZShkaXJlbnRyeS0+ZF9pbm9kZSwwKTsKKwkJZGlyZW50cnktPmRfaW5vZGUtPmlfbmxpbmsgPSAwOworCX0KKworCWNpZnNJbm9kZSA9IENJRlNfSShkaXJlbnRyeS0+ZF9pbm9kZSk7CisJY2lmc0lub2RlLT50aW1lID0gMDsJLyogZm9yY2UgcmV2YWxpZGF0ZSB0byBnbyBnZXQgaW5mbyB3aGVuCisJCQkJICAgbmVlZGVkICovCisJZGlyZW50cnktPmRfaW5vZGUtPmlfY3RpbWUgPSBpbm9kZS0+aV9jdGltZSA9IGlub2RlLT5pX210aW1lID0KKwkJY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKKworCWtmcmVlKGZ1bGxfcGF0aCk7CisJRnJlZVhpZCh4aWQpOworCXJldHVybiByYzsKK30KKworaW50IGNpZnNfcmVuYW1lKHN0cnVjdCBpbm9kZSAqc291cmNlX2lub2RlLCBzdHJ1Y3QgZGVudHJ5ICpzb3VyY2VfZGlyZW50cnksCisJc3RydWN0IGlub2RlICp0YXJnZXRfaW5vZGUsIHN0cnVjdCBkZW50cnkgKnRhcmdldF9kaXJlbnRyeSkKK3sKKwljaGFyICpmcm9tTmFtZTsKKwljaGFyICp0b05hbWU7CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYl9zb3VyY2U7CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYl90YXJnZXQ7CisJc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb247CisJaW50IHhpZDsKKwlpbnQgcmMgPSAwOworCisJeGlkID0gR2V0WGlkKCk7CisKKwljaWZzX3NiX3RhcmdldCA9IENJRlNfU0IodGFyZ2V0X2lub2RlLT5pX3NiKTsKKwljaWZzX3NiX3NvdXJjZSA9IENJRlNfU0Ioc291cmNlX2lub2RlLT5pX3NiKTsKKwlwVGNvbiA9IGNpZnNfc2Jfc291cmNlLT50Y29uOworCisJaWYgKHBUY29uICE9IGNpZnNfc2JfdGFyZ2V0LT50Y29uKSB7CisJCUZyZWVYaWQoeGlkKTsKKwkJcmV0dXJuIC1FWERFVjsJLyogQkIgYWN0dWFsbHkgY291bGQgYmUgYWxsb3dlZCBpZiBzYW1lIHNlcnZlciwKKwkJCQkgICBidXQgZGlmZmVyZW50IHNoYXJlLgorCQkJCSAgIE1pZ2h0IGV2ZW50dWFsbHkgYWRkIHN1cHBvcnQgZm9yIHRoaXMgKi8KKwl9CisKKwkvKiB3ZSBhbHJlYWR5ICBoYXZlIHRoZSByZW5hbWUgc2VtIHNvIHdlIGRvIG5vdCBuZWVkIHRvIGdyYWIgaXQgYWdhaW4KKwkgICBoZXJlIHRvIHByb3RlY3QgdGhlIHBhdGggaW50ZWdyaXR5ICovCisJZnJvbU5hbWUgPSBidWlsZF9wYXRoX2Zyb21fZGVudHJ5KHNvdXJjZV9kaXJlbnRyeSk7CisJdG9OYW1lID0gYnVpbGRfcGF0aF9mcm9tX2RlbnRyeSh0YXJnZXRfZGlyZW50cnkpOworCWlmICgoZnJvbU5hbWUgPT0gTlVMTCkgfHwgKHRvTmFtZSA9PSBOVUxMKSkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gY2lmc19yZW5hbWVfZXhpdDsKKwl9CisKKwlyYyA9IENJRlNTTUJSZW5hbWUoeGlkLCBwVGNvbiwgZnJvbU5hbWUsIHRvTmFtZSwKKwkJCSAgIGNpZnNfc2Jfc291cmNlLT5sb2NhbF9ubHMpOworCWlmIChyYyA9PSAtRUVYSVNUKSB7CisJCS8qIGNoZWNrIGlmIHRoZXkgYXJlIHRoZSBzYW1lIGZpbGUgYmVjYXVzZSByZW5hbWUgb2YgaGFyZGxpbmtlZAorCQkgICBmaWxlcyBpcyBhIG5vb3AgKi8KKwkJRklMRV9VTklYX0JBU0lDX0lORk8gKmluZm9fYnVmX3NvdXJjZTsKKwkJRklMRV9VTklYX0JBU0lDX0lORk8gKmluZm9fYnVmX3RhcmdldDsKKworCQlpbmZvX2J1Zl9zb3VyY2UgPQorCQkJa21hbGxvYygyICogc2l6ZW9mKEZJTEVfVU5JWF9CQVNJQ19JTkZPKSwgR0ZQX0tFUk5FTCk7CisJCWlmIChpbmZvX2J1Zl9zb3VyY2UgIT0gTlVMTCkgeworCQkJaW5mb19idWZfdGFyZ2V0ID0gaW5mb19idWZfc291cmNlICsgMTsKKwkJCXJjID0gQ0lGU1NNQlVuaXhRUGF0aEluZm8oeGlkLCBwVGNvbiwgZnJvbU5hbWUsCisJCQkJaW5mb19idWZfc291cmNlLCBjaWZzX3NiX3NvdXJjZS0+bG9jYWxfbmxzKTsKKwkJCWlmIChyYyA9PSAwKSB7CisJCQkJcmMgPSBDSUZTU01CVW5peFFQYXRoSW5mbyh4aWQsIHBUY29uLCB0b05hbWUsCisJCQkJCQlpbmZvX2J1Zl90YXJnZXQsCisJCQkJCQljaWZzX3NiX3RhcmdldC0+bG9jYWxfbmxzKTsKKwkJCX0KKwkJCWlmICgocmMgPT0gMCkgJiYKKwkJCSAgICAoaW5mb19idWZfc291cmNlLT5VbmlxdWVJZCA9PQorCQkJICAgICBpbmZvX2J1Zl90YXJnZXQtPlVuaXF1ZUlkKSkgeworCQkJLyogZG8gbm90IHJlbmFtZSBzaW5jZSB0aGUgZmlsZXMgYXJlIGhhcmRsaW5rZWQgd2hpY2gKKwkJCSAgIGlzIGEgbm9vcCAqLworCQkJfSBlbHNlIHsKKwkJCS8qIHdlIGVpdGhlciBjYW4gbm90IHRlbGwgdGhlIGZpbGVzIGFyZSBoYXJkbGlua2VkCisJCQkgICAoYXMgd2l0aCBXaW5kb3dzIHNlcnZlcnMpIG9yIGZpbGVzIGFyZSBub3QKKwkJCSAgIGhhcmRsaW5rZWQgc28gZGVsZXRlIHRoZSB0YXJnZXQgbWFudWFsbHkgYmVmb3JlCisJCQkgICByZW5hbWluZyB0byBmb2xsb3cgUE9TSVggcmF0aGVyIHRoYW4gV2luZG93cworCQkJICAgc2VtYW50aWNzICovCisJCQkJY2lmc191bmxpbmsodGFyZ2V0X2lub2RlLCB0YXJnZXRfZGlyZW50cnkpOworCQkJCXJjID0gQ0lGU1NNQlJlbmFtZSh4aWQsIHBUY29uLCBmcm9tTmFtZSwKKwkJCQkJCSAgIHRvTmFtZSwKKwkJCQkJCSAgIGNpZnNfc2Jfc291cmNlLT5sb2NhbF9ubHMpOworCQkJfQorCQkJa2ZyZWUoaW5mb19idWZfc291cmNlKTsKKwkJfSAvKiBpZiB3ZSBjYW4gbm90IGdldCBtZW1vcnkganVzdCBsZWF2ZSByYyBhcyBFRVhJU1QgKi8KKwl9CisKKwlpZiAocmMpIHsKKwkJY0ZZSSgxLCAoInJlbmFtZSByYyAlZCIsIHJjKSk7CisJfQorCisJaWYgKChyYyA9PSAtRUlPKSB8fCAocmMgPT0gLUVFWElTVCkpIHsKKwkJaW50IG9wbG9jayA9IEZBTFNFOworCQlfX3UxNiBuZXRmaWQ7CisKKwkJLyogQkIgRklYTUUgSXMgR2VuZXJpYyBSZWFkIGNvcnJlY3QgZm9yIHJlbmFtZT8gKi8KKwkJLyogaWYgcmVuYW1pbmcgZGlyZWN0b3J5IC0gd2Ugc2hvdWxkIG5vdCBzYXkgQ1JFQVRFX05PVF9ESVIsCisJCSAgIG5lZWQgdG8gdGVzdCByZW5hbWluZyBvcGVuIGRpcmVjdG9yeSwgYWxzbyBHRU5FUklDX1JFQUQKKwkJICAgbWlnaHQgbm90IHJpZ2h0IGJlIHJpZ2h0IGFjY2VzcyB0byByZXF1ZXN0ICovCisJCXJjID0gQ0lGU1NNQk9wZW4oeGlkLCBwVGNvbiwgZnJvbU5hbWUsIEZJTEVfT1BFTiwgR0VORVJJQ19SRUFELAorCQkJCSBDUkVBVEVfTk9UX0RJUiwgJm5ldGZpZCwgJm9wbG9jaywgTlVMTCwKKwkJCQkgY2lmc19zYl9zb3VyY2UtPmxvY2FsX25scyk7CisJCWlmIChyYz09MCkgeworCQkJQ0lGU1NNQlJlbmFtZU9wZW5GaWxlKHhpZCwgcFRjb24sIG5ldGZpZCwgdG9OYW1lLAorCQkJCQkgICAgICBjaWZzX3NiX3NvdXJjZS0+bG9jYWxfbmxzKTsKKwkJCUNJRlNTTUJDbG9zZSh4aWQsIHBUY29uLCBuZXRmaWQpOworCQl9CisJfQorCitjaWZzX3JlbmFtZV9leGl0OgorCWtmcmVlKGZyb21OYW1lKTsKKwlrZnJlZSh0b05hbWUpOworCUZyZWVYaWQoeGlkKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBjaWZzX3JldmFsaWRhdGUoc3RydWN0IGRlbnRyeSAqZGlyZW50cnkpCit7CisJaW50IHhpZDsKKwlpbnQgcmMgPSAwOworCWNoYXIgKmZ1bGxfcGF0aDsKKwlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiOworCXN0cnVjdCBjaWZzSW5vZGVJbmZvICpjaWZzSW5vZGU7CisJbG9mZl90IGxvY2FsX3NpemU7CisJc3RydWN0IHRpbWVzcGVjIGxvY2FsX210aW1lOworCWludCBpbnZhbGlkYXRlX2lub2RlID0gRkFMU0U7CisKKwlpZiAoZGlyZW50cnktPmRfaW5vZGUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwljaWZzSW5vZGUgPSBDSUZTX0koZGlyZW50cnktPmRfaW5vZGUpOworCisJaWYgKGNpZnNJbm9kZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCS8qIG5vIHNlbnNlIHJldmFsaWRhdGluZyBpbm9kZSBpbmZvIG9uIGZpbGUgdGhhdCBubyBvbmUgY2FuIHdyaXRlICovCisJaWYgKENJRlNfSShkaXJlbnRyeS0+ZF9pbm9kZSktPmNsaWVudENhbkNhY2hlUmVhZCkKKwkJcmV0dXJuIHJjOworCisJeGlkID0gR2V0WGlkKCk7CisKKwljaWZzX3NiID0gQ0lGU19TQihkaXJlbnRyeS0+ZF9zYik7CisKKwkvKiBjYW4gbm90IHNhZmVseSBncmFiIHRoZSByZW5hbWUgc2VtIGhlcmUgaWYgcmVuYW1lIGNhbGxzIHJldmFsaWRhdGUKKwkgICBzaW5jZSB0aGF0IHdvdWxkIGRlYWRsb2NrICovCisJZnVsbF9wYXRoID0gYnVpbGRfcGF0aF9mcm9tX2RlbnRyeShkaXJlbnRyeSk7CisJaWYgKGZ1bGxfcGF0aCA9PSBOVUxMKSB7CisJCUZyZWVYaWQoeGlkKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWNGWUkoMSwgKCJSZXZhbGlkYXRlOiAlcyBpbm9kZSAweCVwIGNvdW50ICVkIGRlbnRyeTogMHglcCBkX3RpbWUgJWxkICIKKwkJICJqaWZmaWVzICVsZCIsIGZ1bGxfcGF0aCwgZGlyZW50cnktPmRfaW5vZGUsCisJCSBkaXJlbnRyeS0+ZF9pbm9kZS0+aV9jb3VudC5jb3VudGVyLCBkaXJlbnRyeSwKKwkJIGRpcmVudHJ5LT5kX3RpbWUsIGppZmZpZXMpKTsKKworCWlmIChjaWZzSW5vZGUtPnRpbWUgPT0gMCkgeworCQkvKiB3YXMgc2V0IHRvIHplcm8gcHJldmlvdXNseSB0byBmb3JjZSByZXZhbGlkYXRlICovCisJfSBlbHNlIGlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBjaWZzSW5vZGUtPnRpbWUgKyBIWikgJiYKKwkJICAgbG9va3VwQ2FjaGVFbmFibGVkKSB7CisJCWlmICgoU19JU1JFRyhkaXJlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSA9PSAwKSB8fAorCQkgICAgKGRpcmVudHJ5LT5kX2lub2RlLT5pX25saW5rID09IDEpKSB7CisJCQlrZnJlZShmdWxsX3BhdGgpOworCQkJRnJlZVhpZCh4aWQpOworCQkJcmV0dXJuIHJjOworCQl9IGVsc2UgeworCQkJY0ZZSSgxLCAoIkhhdmUgdG8gcmV2YWxpZGF0ZSBmaWxlIGR1ZSB0byBoYXJkbGlua3MiKSk7CisJCX0KKwl9CisKKwkvKiBzYXZlIG10aW1lIGFuZCBzaXplICovCisJbG9jYWxfbXRpbWUgPSBkaXJlbnRyeS0+ZF9pbm9kZS0+aV9tdGltZTsKKwlsb2NhbF9zaXplID0gZGlyZW50cnktPmRfaW5vZGUtPmlfc2l6ZTsKKworCWlmIChjaWZzX3NiLT50Y29uLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9VTklYKSB7CisJCXJjID0gY2lmc19nZXRfaW5vZGVfaW5mb191bml4KCZkaXJlbnRyeS0+ZF9pbm9kZSwgZnVsbF9wYXRoLAorCQkJCQkgICAgICBkaXJlbnRyeS0+ZF9zYix4aWQpOworCQlpZiAocmMpIHsKKwkJCWNGWUkoMSwgKCJlcnJvciBvbiBnZXR0aW5nIHJldmFsaWRhdGUgaW5mbyAlZCIsIHJjKSk7CisvKgkJCWlmIChyYyAhPSAtRU5PRU5UKQorCQkJCXJjID0gMDsgKi8JLyogQkIgc2hvdWxkIHdlIGNhY2hlIGluZm8gb24KKwkJCQkJCSAgIGNlcnRhaW4gZXJyb3JzPyAqLworCQl9CisJfSBlbHNlIHsKKwkJcmMgPSBjaWZzX2dldF9pbm9kZV9pbmZvKCZkaXJlbnRyeS0+ZF9pbm9kZSwgZnVsbF9wYXRoLCBOVUxMLAorCQkJCQkgZGlyZW50cnktPmRfc2IseGlkKTsKKwkJaWYgKHJjKSB7CisJCQljRllJKDEsICgiZXJyb3Igb24gZ2V0dGluZyByZXZhbGlkYXRlIGluZm8gJWQiLCByYykpOworLyoJCQlpZiAocmMgIT0gLUVOT0VOVCkKKwkJCQlyYyA9IDA7ICovCS8qIEJCIHNob3VsZCB3ZSBjYWNoZSBpbmZvIG9uCisJCQkJCQkgICBjZXJ0YWluIGVycm9ycz8gKi8KKwkJfQorCX0KKwkvKiBzaG91bGQgd2UgcmVtYXAgY2VydGFpbiBlcnJvcnMsIGFjY2VzcyBkZW5pZWQ/LCB0byB6ZXJvICovCisKKwkvKiBpZiBub3Qgb3Bsb2NrZWQsIHdlIGludmFsaWRhdGUgaW5vZGUgcGFnZXMgaWYgbXRpbWUgb3IgZmlsZSBzaXplCisJICAgaGFkIGNoYW5nZWQgb24gc2VydmVyICovCisKKwlpZiAodGltZXNwZWNfZXF1YWwoJmxvY2FsX210aW1lLCZkaXJlbnRyeS0+ZF9pbm9kZS0+aV9tdGltZSkgJiYgCisJICAgIChsb2NhbF9zaXplID09IGRpcmVudHJ5LT5kX2lub2RlLT5pX3NpemUpKSB7CisJCWNGWUkoMSwgKCJjaWZzX3JldmFsaWRhdGUgLSBpbm9kZSB1bmNoYW5nZWQiKSk7CisJfSBlbHNlIHsKKwkJLyogZmlsZSBtYXkgaGF2ZSBjaGFuZ2VkIG9uIHNlcnZlciAqLworCQlpZiAoY2lmc0lub2RlLT5jbGllbnRDYW5DYWNoZVJlYWQpIHsKKwkJCS8qIG5vIG5lZWQgdG8gaW52YWxpZGF0ZSBpbm9kZSBwYWdlcyBzaW5jZSB3ZSB3ZXJlIHRoZQorCQkJICAgb25seSBvbmVzIHdobyBjb3VsZCBoYXZlIG1vZGlmaWVkIHRoZSBmaWxlIGFuZCB0aGUKKwkJCSAgIHNlcnZlciBjb3B5IGlzIHN0YWxlciB0aGFuIG91cnMgKi8KKwkJfSBlbHNlIHsKKwkJCWludmFsaWRhdGVfaW5vZGUgPSBUUlVFOworCQl9CisJfQorCisJLyogY2FuIG5vdCBncmFiIHRoaXMgc2VtIHNpbmNlIGtlcm5lbCBmaWxlc3lzIGxvY2tpbmcgZG9jdW1lbnRhdGlvbgorCSAgIGluZGljYXRlcyBpX3NlbSBtYXkgYmUgdGFrZW4gYnkgdGhlIGtlcm5lbCBvbiBsb29rdXAgYW5kIHJlbmFtZQorCSAgIHdoaWNoIGNvdWxkIGRlYWRsb2NrIGlmIHdlIGdyYWIgdGhlIGlfc2VtIGhlcmUgYXMgd2VsbCAqLworLyoJZG93bigmZGlyZW50cnktPmRfaW5vZGUtPmlfc2VtKTsqLworCS8qIG5lZWQgdG8gd3JpdGUgb3V0IGRpcnR5IHBhZ2VzIGhlcmUgICovCisJaWYgKGRpcmVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmcpIHsKKwkJLyogZG8gd2UgbmVlZCB0byBsb2NrIGlub2RlIHVudGlsIGFmdGVyIGludmFsaWRhdGUgY29tcGxldGVzCisJCSAgIGJlbG93PyAqLworCQlmaWxlbWFwX2ZkYXRhd3JpdGUoZGlyZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZyk7CisJfQorCWlmIChpbnZhbGlkYXRlX2lub2RlKSB7CisJCWlmIChkaXJlbnRyeS0+ZF9pbm9kZS0+aV9tYXBwaW5nKQorCQkJZmlsZW1hcF9mZGF0YXdhaXQoZGlyZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZyk7CisJCS8qIG1heSBldmVudHVhbGx5IGhhdmUgdG8gZG8gdGhpcyBmb3Igb3BlbiBmaWxlcyB0b28gKi8KKwkJaWYgKGxpc3RfZW1wdHkoJihjaWZzSW5vZGUtPm9wZW5GaWxlTGlzdCkpKSB7CisJCQkvKiBIYXMgY2hhbmdlZCBvbiBzZXJ2ZXIgLSBmbHVzaCByZWFkIGFoZWFkIHBhZ2VzICovCisJCQljRllJKDEsICgiSW52YWxpZGF0aW5nIHJlYWQgYWhlYWQgZGF0YSBvbiAiCisJCQkJICJjbG9zZWQgZmlsZSIpKTsKKwkJCWludmFsaWRhdGVfcmVtb3RlX2lub2RlKGRpcmVudHJ5LT5kX2lub2RlKTsKKwkJfQorCX0KKy8qCXVwKCZkaXJlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOyAqLworCQorCWtmcmVlKGZ1bGxfcGF0aCk7CisJRnJlZVhpZCh4aWQpOworCXJldHVybiByYzsKK30KKworaW50IGNpZnNfZ2V0YXR0cihzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCXN0cnVjdCBrc3RhdCAqc3RhdCkKK3sKKwlpbnQgZXJyID0gY2lmc19yZXZhbGlkYXRlKGRlbnRyeSk7CisJaWYgKCFlcnIpCisJCWdlbmVyaWNfZmlsbGF0dHIoZGVudHJ5LT5kX2lub2RlLCBzdGF0KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGNpZnNfdHJ1bmNhdGVfcGFnZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgbG9mZl90IGZyb20pCit7CisJcGdvZmZfdCBpbmRleCA9IGZyb20gPj4gUEFHRV9DQUNIRV9TSElGVDsKKwl1bnNpZ25lZCBvZmZzZXQgPSBmcm9tICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpOworCXN0cnVjdCBwYWdlICpwYWdlOworCWNoYXIgKmthZGRyOworCWludCByYyA9IDA7CisKKwlwYWdlID0gZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsIGluZGV4KTsKKwlpZiAoIXBhZ2UpCisJCXJldHVybiAtRU5PTUVNOworCisJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJbWVtc2V0KGthZGRyICsgb2Zmc2V0LCAwLCBQQUdFX0NBQ0hFX1NJWkUgLSBvZmZzZXQpOworCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJcmV0dXJuIHJjOworfQorCitpbnQgY2lmc19zZXRhdHRyKHN0cnVjdCBkZW50cnkgKmRpcmVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmF0dHJzKQoreworCWludCB4aWQ7CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYjsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKwljaGFyICpmdWxsX3BhdGggPSBOVUxMOworCWludCByYyA9IC1FQUNDRVM7CisJaW50IGZvdW5kID0gRkFMU0U7CisJc3RydWN0IGNpZnNGaWxlSW5mbyAqb3Blbl9maWxlID0gTlVMTDsKKwlGSUxFX0JBU0lDX0lORk8gdGltZV9idWY7CisJaW50IHNldF90aW1lID0gRkFMU0U7CisJX191NjQgbW9kZSA9IDB4RkZGRkZGRkZGRkZGRkZGRlVMTDsKKwlfX3U2NCB1aWQgPSAweEZGRkZGRkZGRkZGRkZGRkZVTEw7CisJX191NjQgZ2lkID0gMHhGRkZGRkZGRkZGRkZGRkZGVUxMOworCXN0cnVjdCBjaWZzSW5vZGVJbmZvICpjaWZzSW5vZGU7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCisJeGlkID0gR2V0WGlkKCk7CisKKwljRllJKDEsICgiIEluIGNpZnNfc2V0YXR0ciwgbmFtZSA9ICVzIGF0dHJzLT5pYXZhbGlkIDB4JXggIiwKKwkJIGRpcmVudHJ5LT5kX25hbWUubmFtZSwgYXR0cnMtPmlhX3ZhbGlkKSk7CisJY2lmc19zYiA9IENJRlNfU0IoZGlyZW50cnktPmRfaW5vZGUtPmlfc2IpOworCXBUY29uID0gY2lmc19zYi0+dGNvbjsKKworCWRvd24oJmRpcmVudHJ5LT5kX3NiLT5zX3Zmc19yZW5hbWVfc2VtKTsKKwlmdWxsX3BhdGggPSBidWlsZF9wYXRoX2Zyb21fZGVudHJ5KGRpcmVudHJ5KTsKKwl1cCgmZGlyZW50cnktPmRfc2ItPnNfdmZzX3JlbmFtZV9zZW0pOworCWlmIChmdWxsX3BhdGggPT0gTlVMTCkgeworCQlGcmVlWGlkKHhpZCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwljaWZzSW5vZGUgPSBDSUZTX0koZGlyZW50cnktPmRfaW5vZGUpOworCisJLyogQkIgY2hlY2sgaWYgd2UgbmVlZCB0byByZWZyZXNoIGlub2RlIGZyb20gc2VydmVyIG5vdyA/IEJCICovCisKKwkvKiBuZWVkIHRvIGZsdXNoIGRhdGEgYmVmb3JlIGNoYW5naW5nIGZpbGUgc2l6ZSBvbiBzZXJ2ZXIgKi8KKwlmaWxlbWFwX2ZkYXRhd3JpdGUoZGlyZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZyk7CisJZmlsZW1hcF9mZGF0YXdhaXQoZGlyZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZyk7CisKKwlpZiAoYXR0cnMtPmlhX3ZhbGlkICYgQVRUUl9TSVpFKSB7CisJCXJlYWRfbG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisJCS8qIFRvIGF2b2lkIHNwdXJpb3VzIG9wbG9jayBicmVha3MgZnJvbSBzZXJ2ZXIsIGluIHRoZSBjYXNlIG9mCisJCSAgIGlub2RlcyB0aGF0IHdlIGFscmVhZHkgaGF2ZSBvcGVuLCBhdm9pZCBkb2luZyBwYXRoIGJhc2VkCisJCSAgIHNldHRpbmcgb2YgZmlsZSBzaXplIGlmIHdlIGNhbiBkbyBpdCBieSBoYW5kbGUuCisJCSAgIFRoaXMga2VlcHMgb3VyIGNhY2hpbmcgdG9rZW4gKG9wbG9jaykgYW5kIGF2b2lkcyB0aW1lb3V0cworCQkgICB3aGVuIHRoZSBsb2NhbCBvcGxvY2sgYnJlYWsgdGFrZXMgbG9uZ2VyIHRvIGZsdXNoCisJCSAgIHdyaXRlYmVoaW5kIGRhdGEgdGhhbiB0aGUgU01CIHRpbWVvdXQgZm9yIHRoZSBTZXRQYXRoSW5mbworCQkgICByZXF1ZXN0IHdvdWxkIGFsbG93ICovCisJCWxpc3RfZm9yX2VhY2godG1wLCAmY2lmc0lub2RlLT5vcGVuRmlsZUxpc3QpIHsKKwkJCW9wZW5fZmlsZSA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgY2lmc0ZpbGVJbmZvLAorCQkJCQkgICAgICAgZmxpc3QpOworCQkJLyogV2UgY2hlY2sgaWYgZmlsZSBpcyBvcGVuIGZvciB3cml0aW5nIGZpcnN0ICovCisJCQlpZiAoKG9wZW5fZmlsZS0+cGZpbGUpICYmCisJCQkgICAgKChvcGVuX2ZpbGUtPnBmaWxlLT5mX2ZsYWdzICYgT19SRFdSKSB8fAorCQkJICAgIChvcGVuX2ZpbGUtPnBmaWxlLT5mX2ZsYWdzICYgT19XUk9OTFkpKSkgeworCQkJCWlmIChvcGVuX2ZpbGUtPmludmFsaWRIYW5kbGUgPT0gRkFMU0UpIHsKKwkJCQkJLyogd2UgZm91bmQgYSB2YWxpZCwgd3JpdGVhYmxlIG5ldHdvcmsKKwkJCQkJICAgZmlsZSBoYW5kbGUgdG8gdXNlIHRvIHRyeSB0byBzZXQgdGhlCisJCQkJCSAgIGZpbGUgc2l6ZSAqLworCQkJCQlfX3UxNiBuZmlkID0gb3Blbl9maWxlLT5uZXRmaWQ7CisJCQkJCV9fdTMyIG5waWQgPSBvcGVuX2ZpbGUtPnBpZDsKKwkJCQkJcmVhZF91bmxvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCQkJCQlmb3VuZCA9IFRSVUU7CisJCQkJCXJjID0gQ0lGU1NNQlNldEZpbGVTaXplKHhpZCwgcFRjb24sCisJCQkJCQlhdHRycy0+aWFfc2l6ZSwgbmZpZCwgbnBpZCwKKwkJCQkJCUZBTFNFKTsKKwkJCQkJY0ZZSSgxLCAoIlNldEZpbGVTaXplIGJ5IGhhbmRsZSAiCisJCQkJCQkgIihzZXRhdHRycykgcmMgPSAlZCIsIHJjKSk7CisJCQkJCS8qIERvIG5vdCBuZWVkIHJlb3BlbiBhbmQgcmV0cnkgb24KKwkJCQkJICAgRUFHQUlOIHNpbmNlIHdlIHdpbGwgcmV0cnkgYnkKKwkJCQkJICAgcGF0aG5hbWUgYmVsb3cgKi8KKworCQkJCQkvKiBub3cgdGhhdCB3ZSBmb3VuZCBvbmUgdmFsaWQgZmlsZQorCQkJCQkgICBoYW5kbGUgbm8gc2Vuc2UgY29udGludWluZyB0byBsb29wCisJCQkJCSAgIHRyeWluZyBvdGhlcnMsIHNvIGJyZWFrIGhlcmUgKi8KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChmb3VuZCA9PSBGQUxTRSkKKwkJCXJlYWRfdW5sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKworCQlpZiAocmMgIT0gMCkgeworCQkJLyogU2V0IGZpbGUgc2l6ZSBieSBwYXRobmFtZSByYXRoZXIgdGhhbiBieSBoYW5kbGUKKwkJCSAgIGVpdGhlciBiZWNhdXNlIG5vIHZhbGlkLCB3cml0ZWFibGUgZmlsZSBoYW5kbGUgZm9yCisJCQkgICBpdCB3YXMgZm91bmQgb3IgYmVjYXVzZSB0aGVyZSB3YXMgYW4gZXJyb3Igc2V0dGluZworCQkJICAgaXQgYnkgaGFuZGxlICovCisJCQlyYyA9IENJRlNTTUJTZXRFT0YoeGlkLCBwVGNvbiwgZnVsbF9wYXRoLAorCQkJCQkgICBhdHRycy0+aWFfc2l6ZSwgRkFMU0UsCisJCQkJCSAgIGNpZnNfc2ItPmxvY2FsX25scyk7CisJCQljRllJKDEsICgiIFNldEVPRiBieSBwYXRoIChzZXRhdHRycykgcmMgPSAlZCIsIHJjKSk7CisJCX0KKworCQkvKiBTZXJ2ZXIgaXMgb2sgc2V0dGluZyBhbGxvY2F0aW9uIHNpemUgaW1wbGljaXRseSAtIG5vIG5lZWQKKwkJICAgdG8gY2FsbDoKKwkJQ0lGU1NNQlNldEVPRih4aWQsIHBUY29uLCBmdWxsX3BhdGgsIGF0dHJzLT5pYV9zaXplLCBUUlVFLAorCQkJIGNpZnNfc2ItPmxvY2FsX25scyk7CisJCSAgICovCisKKwkJaWYgKHJjID09IDApIHsKKwkJCXJjID0gdm10cnVuY2F0ZShkaXJlbnRyeS0+ZF9pbm9kZSwgYXR0cnMtPmlhX3NpemUpOworCQkJY2lmc190cnVuY2F0ZV9wYWdlKGRpcmVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmcsCisJCQkJCSAgIGRpcmVudHJ5LT5kX2lub2RlLT5pX3NpemUpOworCQl9CisJfQorCWlmIChhdHRycy0+aWFfdmFsaWQgJiBBVFRSX1VJRCkgeworCQljRllJKDEsICgiIENJRlMgLSBVSUQgY2hhbmdlZCB0byAlZCIsIGF0dHJzLT5pYV91aWQpKTsKKwkJdWlkID0gYXR0cnMtPmlhX3VpZDsKKwkJLyogZW50cnktPnVpZCA9IGNwdV90b19sZTE2KGF0dHItPmlhX3VpZCk7ICovCisJfQorCWlmIChhdHRycy0+aWFfdmFsaWQgJiBBVFRSX0dJRCkgeworCQljRllJKDEsICgiIENJRlMgLSBHSUQgY2hhbmdlZCB0byAlZCIsIGF0dHJzLT5pYV9naWQpKTsKKwkJZ2lkID0gYXR0cnMtPmlhX2dpZDsKKwkJLyogZW50cnktPmdpZCA9IGNwdV90b19sZTE2KGF0dHItPmlhX2dpZCk7ICovCisJfQorCisJdGltZV9idWYuQXR0cmlidXRlcyA9IDA7CisJaWYgKGF0dHJzLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkgeworCQljRllJKDEsICgiIENJRlMgLSBNb2RlIGNoYW5nZWQgdG8gMHgleCIsIGF0dHJzLT5pYV9tb2RlKSk7CisJCW1vZGUgPSBhdHRycy0+aWFfbW9kZTsKKwkJLyogZW50cnktPm1vZGUgPSBjcHVfdG9fbGUxNihhdHRyLT5pYV9tb2RlKTsgKi8KKwl9CisKKwlpZiAoKGNpZnNfc2ItPnRjb24tPnNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX1VOSVgpCisJICAgICYmIChhdHRycy0+aWFfdmFsaWQgJiAoQVRUUl9NT0RFIHwgQVRUUl9HSUQgfCBBVFRSX1VJRCkpKQorCQlyYyA9IENJRlNTTUJVbml4U2V0UGVybXMoeGlkLCBwVGNvbiwgZnVsbF9wYXRoLCBtb2RlLCB1aWQsIGdpZCwKKwkJCQkJIDAgLyogZGV2X3QgKi8sIGNpZnNfc2ItPmxvY2FsX25scyk7CisJZWxzZSBpZiAoYXR0cnMtPmlhX3ZhbGlkICYgQVRUUl9NT0RFKSB7CisJCWlmICgobW9kZSAmIFNfSVdVR08pID09IDApIC8qIG5vdCB3cml0ZWFibGUgKi8geworCQkJaWYgKChjaWZzSW5vZGUtPmNpZnNBdHRycyAmIEFUVFJfUkVBRE9OTFkpID09IDApCisJCQkJdGltZV9idWYuQXR0cmlidXRlcyA9CisJCQkJCWNwdV90b19sZTMyKGNpZnNJbm9kZS0+Y2lmc0F0dHJzIHwKKwkJCQkJCSAgICBBVFRSX1JFQURPTkxZKTsKKwkJfSBlbHNlIGlmICgobW9kZSAmIFNfSVdVR08pID09IFNfSVdVR08pIHsKKwkJCWlmIChjaWZzSW5vZGUtPmNpZnNBdHRycyAmIEFUVFJfUkVBRE9OTFkpCisJCQkJdGltZV9idWYuQXR0cmlidXRlcyA9CisJCQkJCWNwdV90b19sZTMyKGNpZnNJbm9kZS0+Y2lmc0F0dHJzICYKKwkJCQkJCSAgICAofkFUVFJfUkVBRE9OTFkpKTsKKwkJfQorCQkvKiBCQiB0byBiZSBpbXBsZW1lbnRlZCAtCisJCSAgIHZpYSBXaW5kb3dzIHNlY3VyaXR5IGRlc2NyaXB0b3JzIG9yIHN0cmVhbXMgKi8KKwkJLyogQ0lGU1NNQldpblNldFBlcm1zKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwgbW9kZSwgdWlkLCBnaWQsCisJCQkJICAgICAgY2lmc19zYi0+bG9jYWxfbmxzKTsgKi8KKwl9CisKKwlpZiAoYXR0cnMtPmlhX3ZhbGlkICYgQVRUUl9BVElNRSkgeworCQlzZXRfdGltZSA9IFRSVUU7CisJCXRpbWVfYnVmLkxhc3RBY2Nlc3NUaW1lID0KKwkJICAgIGNwdV90b19sZTY0KGNpZnNfVW5peFRpbWVUb05UKGF0dHJzLT5pYV9hdGltZSkpOworCX0gZWxzZQorCQl0aW1lX2J1Zi5MYXN0QWNjZXNzVGltZSA9IDA7CisKKwlpZiAoYXR0cnMtPmlhX3ZhbGlkICYgQVRUUl9NVElNRSkgeworCQlzZXRfdGltZSA9IFRSVUU7CisJCXRpbWVfYnVmLkxhc3RXcml0ZVRpbWUgPQorCQkgICAgY3B1X3RvX2xlNjQoY2lmc19Vbml4VGltZVRvTlQoYXR0cnMtPmlhX210aW1lKSk7CisJfSBlbHNlCisJCXRpbWVfYnVmLkxhc3RXcml0ZVRpbWUgPSAwOworCisJaWYgKGF0dHJzLT5pYV92YWxpZCAmIEFUVFJfQ1RJTUUpIHsKKwkJc2V0X3RpbWUgPSBUUlVFOworCQljRllJKDEsICgiIENJRlMgLSBDVElNRSBjaGFuZ2VkICIpKTsgLyogQkIgcHJvYmFibHkgbm8gbmVlZCAqLworCQl0aW1lX2J1Zi5DaGFuZ2VUaW1lID0KKwkJICAgIGNwdV90b19sZTY0KGNpZnNfVW5peFRpbWVUb05UKGF0dHJzLT5pYV9jdGltZSkpOworCX0gZWxzZQorCQl0aW1lX2J1Zi5DaGFuZ2VUaW1lID0gMDsKKworCWlmIChzZXRfdGltZSB8fCB0aW1lX2J1Zi5BdHRyaWJ1dGVzKSB7CisJCS8qIEJCIHdoYXQgaWYgc2V0dGluZyBvbmUgYXR0cmlidXRlIGZhaWxzIChzdWNoIGFzIHNpemUpIGJ1dAorCQkgICB0aW1lIHNldHRpbmcgd29ya3M/ICovCisJCXRpbWVfYnVmLkNyZWF0aW9uVGltZSA9IDA7CS8qIGRvIG5vdCBjaGFuZ2UgKi8KKwkJLyogSW4gdGhlIGZ1dHVyZSB3ZSBzaG91bGQgZXhwZXJpbWVudCAtIHRyeSBzZXR0aW5nIHRpbWVzdGFtcHMKKwkJICAgdmlhIEhhbmRsZSAoU2V0RmlsZUluZm8pIGluc3RlYWQgb2YgYnkgcGF0aCAqLworCQlpZiAoIShwVGNvbi0+c2VzLT5mbGFncyAmIENJRlNfU0VTX05UNCkpCisJCQlyYyA9IENJRlNTTUJTZXRUaW1lcyh4aWQsIHBUY29uLCBmdWxsX3BhdGgsICZ0aW1lX2J1ZiwKKwkJCQkJICAgICBjaWZzX3NiLT5sb2NhbF9ubHMpOworCQllbHNlCisJCQlyYyA9IC1FT1BOT1RTVVBQOworCisJCWlmIChyYyA9PSAtRU9QTk9UU1VQUCkgeworCQkJaW50IG9wbG9jayA9IEZBTFNFOworCQkJX191MTYgbmV0ZmlkOworCisJCQljRllJKDEsICgiY2FsbGluZyBTZXRGaWxlSW5mbyBzaW5jZSBTZXRQYXRoSW5mbyBmb3IgIgorCQkJCSAidGltZXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHNlcnZlciIpKTsKKwkJCS8qIEJCIHdlIGNvdWxkIHNjYW4gdG8gc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBpdCBvcGVuCisJCQkgICBhbmQgcGFzcyBpbiBwaWQgb2Ygb3BlbmVyIHRvIGZ1bmN0aW9uICovCisJCQlyYyA9IENJRlNTTUJPcGVuKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwgRklMRV9PUEVOLAorCQkJCQkgU1lOQ0hST05JWkUgfCBGSUxFX1dSSVRFX0FUVFJJQlVURVMsCisJCQkJCSBDUkVBVEVfTk9UX0RJUiwgJm5ldGZpZCwgJm9wbG9jaywKKwkJCQkJIE5VTEwsIGNpZnNfc2ItPmxvY2FsX25scyk7CisJCQlpZiAocmM9PTApIHsKKwkJCQlyYyA9IENJRlNTTUJTZXRGaWxlVGltZXMoeGlkLCBwVGNvbiwgJnRpbWVfYnVmLAorCQkJCQkJCSBuZXRmaWQpOworCQkJCUNJRlNTTUJDbG9zZSh4aWQsIHBUY29uLCBuZXRmaWQpOworCQkJfSBlbHNlIHsKKwkJCS8qIEJCIEZvciBldmVuIG9sZGVyIHNlcnZlcnMgd2UgY291bGQgY29udmVydCB0aW1lX2J1ZgorCQkJICAgaW50byBvbGQgRE9TIHN0eWxlIHdoaWNoIHVzZXMgdHdvIHNlY29uZAorCQkJICAgZ3JhbnVsYXJpdHkgKi8KKworCQkJLyogcmMgPSBDSUZTU01CU2V0VGltZXNMZWdhY3koeGlkLCBwVGNvbiwgZnVsbF9wYXRoLAorICAgICAgICAJICAgICAgICAJCSZ0aW1lX2J1ZiwgY2lmc19zYi0+bG9jYWxfbmxzKTsgKi8KKwkJCX0KKwkJfQorCX0KKworCS8qIGRvIG5vdCBuZWVkIGxvY2FsIGNoZWNrIHRvIGlub2RlX2NoZWNrX29rIHNpbmNlIHRoZSBzZXJ2ZXIgZG9lcworCSAgIHRoYXQgKi8KKwlpZiAoIXJjKQorCQlyYyA9IGlub2RlX3NldGF0dHIoZGlyZW50cnktPmRfaW5vZGUsIGF0dHJzKTsKKwlrZnJlZShmdWxsX3BhdGgpOworCUZyZWVYaWQoeGlkKTsKKwlyZXR1cm4gcmM7Cit9CisKK3ZvaWQgY2lmc19kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwljRllJKDEsICgiSW4gY2lmc19kZWxldGVfaW5vZGUsIGlub2RlID0gMHglcCAiLCBpbm9kZSkpOworCS8qIG1heSBoYXZlIHRvIGFkZCBiYWNrIGluIGlmIGFuZCB3aGVuIHNhZmUgZGlzdHJpYnV0ZWQgY2FjaGluZyBvZgorCSAgIGRpcmVjdG9yaWVzIGFkZGVkIGUuZy4gdmlhIEZpbmROb3RpZnkgKi8KK30KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvaW9jdGwuYyBiL2ZzL2NpZnMvaW9jdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGI4ZTIwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9pb2N0bC5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiAgIGZzL2NpZnMvaW9jdGwuYworICoKKyAqICAgdmZzIG9wZXJhdGlvbnMgdGhhdCBkZWFsIHdpdGggaW8gY29udHJvbAorICoKKyAqICAgQ29weXJpZ2h0IChDKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzICBDb3JwLiwgMjAwNQorICogICBBdXRob3Iocyk6IFN0ZXZlIEZyZW5jaCAoc2ZyZW5jaEB1cy5pYm0uY29tKQorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDJfZnMuaD4KKyNpbmNsdWRlICJjaWZzcGR1LmgiCisjaW5jbHVkZSAiY2lmc2dsb2IuaCIKKyNpbmNsdWRlICJjaWZzcHJvdG8uaCIKKyNpbmNsdWRlICJjaWZzX2RlYnVnLmgiCisKK2ludCBjaWZzX2lvY3RsIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlcCwgCisJCXVuc2lnbmVkIGludCBjb21tYW5kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcmMgPSAtRU5PVFRZOyAvKiBzdHJhbmdlIGVycm9yIC0gYnV0IHRoZSBwcmVjZWRlbnQgKi8KKyNpZmRlZiBDT05GSUdfQ0lGU19QT1NJWAorCWNGWUkoMSwoImlvY3RsIGZpbGUgJXAgIGNtZCAldSAgYXJnICVsdSIsZmlsZXAsY29tbWFuZCxhcmcpKTsKKwlzd2l0Y2goY29tbWFuZCkgeworCQljYXNlIEVYVDJfSU9DX0dFVEZMQUdTOgorCQkJY0ZZSSgxLCgiZ2V0IGZsYWdzIG5vdCBpbXBsZW1lbnRlZCB5ZXQiKSk7CisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCWNhc2UgRVhUMl9JT0NfU0VURkxBR1M6CisJCQljRllJKDEsKCJzZXQgZmxhZ3Mgbm90IGltcGxlbWVudGVkIHlldCIpKTsKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJZGVmYXVsdDoKKwkJCWNGWUkoMSwoInVuc3VwcG9ydGVkIGlvY3RsIikpOworCQkJcmV0dXJuIHJjOworCX0KKyNlbmRpZiAvKiBDT05GSUdfQ0lGU19QT1NJWCAqLworCXJldHVybiByYzsKK30gCmRpZmYgLS1naXQgYS9mcy9jaWZzL2xpbmsuYyBiL2ZzL2NpZnMvbGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NTU4MTAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jaWZzL2xpbmsuYwpAQCAtMCwwICsxLDMyOCBAQAorLyoKKyAqICAgZnMvY2lmcy9saW5rLmMKKyAqCisgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyAgQ29ycC4sIDIwMDIsMjAwMworICogICBBdXRob3Iocyk6IFN0ZXZlIEZyZW5jaCAoc2ZyZW5jaEB1cy5pYm0uY29tKQorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgImNpZnNmcy5oIgorI2luY2x1ZGUgImNpZnNwZHUuaCIKKyNpbmNsdWRlICJjaWZzZ2xvYi5oIgorI2luY2x1ZGUgImNpZnNwcm90by5oIgorI2luY2x1ZGUgImNpZnNfZGVidWcuaCIKKyNpbmNsdWRlICJjaWZzX2ZzX3NiLmgiCisKK2ludAorY2lmc19oYXJkbGluayhzdHJ1Y3QgZGVudHJ5ICpvbGRfZmlsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkgICAgICBzdHJ1Y3QgZGVudHJ5ICpkaXJlbnRyeSkKK3sKKwlpbnQgcmMgPSAtRUFDQ0VTOworCWludCB4aWQ7CisJY2hhciAqZnJvbU5hbWUgPSBOVUxMOworCWNoYXIgKnRvTmFtZSA9IE5VTEw7CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYl90YXJnZXQ7CisJc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb247CisJc3RydWN0IGNpZnNJbm9kZUluZm8gKmNpZnNJbm9kZTsKKworCXhpZCA9IEdldFhpZCgpOworCisJY2lmc19zYl90YXJnZXQgPSBDSUZTX1NCKGlub2RlLT5pX3NiKTsKKwlwVGNvbiA9IGNpZnNfc2JfdGFyZ2V0LT50Y29uOworCisvKiBObyBuZWVkIHRvIGNoZWNrIGZvciBjcm9zcyBkZXZpY2UgbGlua3Mgc2luY2Ugc2VydmVyIHdpbGwgZG8gdGhhdAorICAgQkIgbm90ZSBERlMgY2FzZSBpbiBmdXR1cmUgdGhvdWdoICh3aGVuIHdlIG1heSBoYXZlIHRvIGNoZWNrKSAqLworCisJZG93bigmaW5vZGUtPmlfc2ItPnNfdmZzX3JlbmFtZV9zZW0pOworCWZyb21OYW1lID0gYnVpbGRfcGF0aF9mcm9tX2RlbnRyeShvbGRfZmlsZSk7CisJdG9OYW1lID0gYnVpbGRfcGF0aF9mcm9tX2RlbnRyeShkaXJlbnRyeSk7CisJdXAoJmlub2RlLT5pX3NiLT5zX3Zmc19yZW5hbWVfc2VtKTsKKwlpZigoZnJvbU5hbWUgPT0gTlVMTCkgfHwgKHRvTmFtZSA9PSBOVUxMKSkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gY2lmc19obF9leGl0OworCX0KKworCWlmIChjaWZzX3NiX3RhcmdldC0+dGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkKKwkJcmMgPSBDSUZTVW5peENyZWF0ZUhhcmRMaW5rKHhpZCwgcFRjb24sIGZyb21OYW1lLCB0b05hbWUsCisJCQkJCSAgICBjaWZzX3NiX3RhcmdldC0+bG9jYWxfbmxzKTsKKwllbHNlIHsKKwkJcmMgPSBDSUZTQ3JlYXRlSGFyZExpbmsoeGlkLCBwVGNvbiwgZnJvbU5hbWUsIHRvTmFtZSwKKwkJCQkJY2lmc19zYl90YXJnZXQtPmxvY2FsX25scyk7CisJCWlmKHJjID09IC1FSU8pCisJCQlyYyA9IC1FT1BOT1RTVVBQOyAgCisJfQorCisvKiBpZiAoIXJjKSAgICAgKi8KKwl7CisJCS8qICAgcmVuZXdfcGFyZW50YWxfdGltZXN0YW1wcyhvbGRfZmlsZSk7CisJCSAgIGlub2RlLT5pX25saW5rKys7CisJCSAgIG1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQkgICBkX2luc3RhbnRpYXRlKGRpcmVudHJ5LCBpbm9kZSk7ICovCisJCS8qIEJCIGFkZCBjYWxsIHRvIGVpdGhlciBtYXJrIGlub2RlIGRpcnR5IG9yIHJlZnJlc2ggaXRzIGRhdGEgYW5kIHRpbWVzdGFtcCB0byBjdXJyZW50IHRpbWUgKi8KKwl9CisJZF9kcm9wKGRpcmVudHJ5KTsJLyogZm9yY2UgbmV3IGxvb2t1cCBmcm9tIHNlcnZlciAqLworCWNpZnNJbm9kZSA9IENJRlNfSShvbGRfZmlsZS0+ZF9pbm9kZSk7CisJY2lmc0lub2RlLT50aW1lID0gMDsJLyogd2lsbCBmb3JjZSByZXZhbGlkYXRlIHRvIGdvIGdldCBpbmZvIHdoZW4gbmVlZGVkICovCisKK2NpZnNfaGxfZXhpdDoKKwlpZiAoZnJvbU5hbWUpCisJCWtmcmVlKGZyb21OYW1lKTsKKwlpZiAodG9OYW1lKQorCQlrZnJlZSh0b05hbWUpOworCUZyZWVYaWQoeGlkKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludAorY2lmc19mb2xsb3dfbGluayhzdHJ1Y3QgZGVudHJ5ICpkaXJlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRpcmVudHJ5LT5kX2lub2RlOworCWludCByYyA9IC1FQUNDRVM7CisJaW50IHhpZDsKKwljaGFyICpmdWxsX3BhdGggPSBOVUxMOworCWNoYXIgKiB0YXJnZXRfcGF0aCA9IEVSUl9QVFIoLUVOT01FTSk7CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYjsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKworCXhpZCA9IEdldFhpZCgpOworCisJZG93bigmZGlyZW50cnktPmRfc2ItPnNfdmZzX3JlbmFtZV9zZW0pOworCWZ1bGxfcGF0aCA9IGJ1aWxkX3BhdGhfZnJvbV9kZW50cnkoZGlyZW50cnkpOworCXVwKCZkaXJlbnRyeS0+ZF9zYi0+c192ZnNfcmVuYW1lX3NlbSk7CisKKwlpZiAoIWZ1bGxfcGF0aCkKKwkJZ290byBvdXRfbm9fZnJlZTsKKworCWNGWUkoMSwgKCJGdWxsIHBhdGg6ICVzIGlub2RlID0gMHglcCIsIGZ1bGxfcGF0aCwgaW5vZGUpKTsKKwljaWZzX3NiID0gQ0lGU19TQihpbm9kZS0+aV9zYik7CisJcFRjb24gPSBjaWZzX3NiLT50Y29uOworCXRhcmdldF9wYXRoID0ga21hbGxvYyhQQVRIX01BWCwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0YXJnZXRfcGF0aCkgeworCQl0YXJnZXRfcGF0aCA9IEVSUl9QVFIoLUVOT01FTSk7CisJCWdvdG8gb3V0OworCX0KKworLyogQkIgYWRkIHJlYWQgcmVwYXJzZSBwb2ludCBzeW1saW5rIGNvZGUgYW5kIFVuaXggZXh0ZW5zaW9ucyBzeW1saW5rIGNvZGUgaGVyZSBCQiAqLworCWlmIChwVGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkKKwkJcmMgPSBDSUZTU01CVW5peFF1ZXJ5U3ltTGluayh4aWQsIHBUY29uLCBmdWxsX3BhdGgsCisJCQkJCSAgICAgdGFyZ2V0X3BhdGgsCisJCQkJCSAgICAgUEFUSF9NQVgtMSwKKwkJCQkJICAgICBjaWZzX3NiLT5sb2NhbF9ubHMpOworCWVsc2UgeworCQkvKiByYyA9IENJRlNTTUJRdWVyeVJlcGFyc2VMaW5rSW5mbyAqLworCQkvKiBCQiBBZGQgY29kZSB0byBRdWVyeSBSZXBhcnNlUG9pbnQgaW5mbyAqLworCQkvKiBCQiBBZGQgTUFDIHN0eWxlIHhzeW1saW5rIGNoZWNrIGhlcmUgaWYgZW5hYmxlZCAqLworCX0KKworCWlmIChyYyA9PSAwKSB7CisKKy8qIEJCIEFkZCBzcGVjaWFsIGNhc2UgY2hlY2sgZm9yIFNhbWJhIERGUyBzeW1saW5rcyAqLworCisJCXRhcmdldF9wYXRoW1BBVEhfTUFYLTFdID0gMDsKKwl9IGVsc2UgeworCQlrZnJlZSh0YXJnZXRfcGF0aCk7CisJCXRhcmdldF9wYXRoID0gRVJSX1BUUihyYyk7CisJfQorCitvdXQ6CisJa2ZyZWUoZnVsbF9wYXRoKTsKK291dF9ub19mcmVlOgorCUZyZWVYaWQoeGlkKTsKKwluZF9zZXRfbGluayhuZCwgdGFyZ2V0X3BhdGgpOworCXJldHVybiAwOworfQorCitpbnQKK2NpZnNfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICpkaXJlbnRyeSwgY29uc3QgY2hhciAqc3ltbmFtZSkKK3sKKwlpbnQgcmMgPSAtRU9QTk9UU1VQUDsKKwlpbnQgeGlkOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisJc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb247CisJY2hhciAqZnVsbF9wYXRoID0gTlVMTDsKKwlzdHJ1Y3QgaW5vZGUgKm5ld2lub2RlID0gTlVMTDsKKworCXhpZCA9IEdldFhpZCgpOworCisJY2lmc19zYiA9IENJRlNfU0IoaW5vZGUtPmlfc2IpOworCXBUY29uID0gY2lmc19zYi0+dGNvbjsKKworCWRvd24oJmlub2RlLT5pX3NiLT5zX3Zmc19yZW5hbWVfc2VtKTsKKwlmdWxsX3BhdGggPSBidWlsZF9wYXRoX2Zyb21fZGVudHJ5KGRpcmVudHJ5KTsKKwl1cCgmaW5vZGUtPmlfc2ItPnNfdmZzX3JlbmFtZV9zZW0pOworCisJaWYoZnVsbF9wYXRoID09IE5VTEwpIHsKKwkJRnJlZVhpZCh4aWQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwljRllJKDEsICgiRnVsbCBwYXRoOiAlcyAiLCBmdWxsX3BhdGgpKTsKKwljRllJKDEsICgic3ltbmFtZSBpcyAlcyIsIHN5bW5hbWUpKTsKKworCS8qIEJCIHdoYXQgaWYgREZTIGFuZCB0aGlzIHZvbHVtZSBpcyBvbiBkaWZmZXJlbnQgc2hhcmU/IEJCICovCisJaWYgKGNpZnNfc2ItPnRjb24tPnNlcy0+Y2FwYWJpbGl0aWVzICYgQ0FQX1VOSVgpCisJCXJjID0gQ0lGU1VuaXhDcmVhdGVTeW1MaW5rKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwgc3ltbmFtZSwKKwkJCQkJICAgY2lmc19zYi0+bG9jYWxfbmxzKTsKKwkvKiBlbHNlCisJICAgcmMgPSBDSUZTQ3JlYXRlUmVwYXJzZVN5bUxpbmsoeGlkLCBwVGNvbiwgZnJvbU5hbWUsIHRvTmFtZSxjaWZzX3NiX3RhcmdldC0+bG9jYWxfbmxzKTsgKi8KKworCWlmIChyYyA9PSAwKSB7CisJCWlmIChwVGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkKKwkJCXJjID0gY2lmc19nZXRfaW5vZGVfaW5mb191bml4KCZuZXdpbm9kZSwgZnVsbF9wYXRoLAorCQkJCQkJICAgICAgaW5vZGUtPmlfc2IseGlkKTsKKwkJZWxzZQorCQkJcmMgPSBjaWZzX2dldF9pbm9kZV9pbmZvKCZuZXdpbm9kZSwgZnVsbF9wYXRoLCBOVUxMLAorCQkJCQkJIGlub2RlLT5pX3NiLHhpZCk7CisKKwkJaWYgKHJjICE9IDApIHsKKwkJCWNGWUkoMSwKKwkJCSAgICAgKCJDcmVhdGUgc3ltbGluayB3b3JrZWQgYnV0IGdldF9pbm9kZV9pbmZvIGZhaWxlZCB3aXRoIHJjID0gJWQgIiwKKwkJCSAgICAgIHJjKSk7CisJCX0gZWxzZSB7CisJCQlkaXJlbnRyeS0+ZF9vcCA9ICZjaWZzX2RlbnRyeV9vcHM7CisJCQlkX2luc3RhbnRpYXRlKGRpcmVudHJ5LCBuZXdpbm9kZSk7CisJCX0KKwl9CisKKwlpZiAoZnVsbF9wYXRoKQorCQlrZnJlZShmdWxsX3BhdGgpOworCUZyZWVYaWQoeGlkKTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludAorY2lmc19yZWFkbGluayhzdHJ1Y3QgZGVudHJ5ICpkaXJlbnRyeSwgY2hhciBfX3VzZXIgKnBCdWZmZXIsIGludCBidWZsZW4pCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRpcmVudHJ5LT5kX2lub2RlOworCWludCByYyA9IC1FQUNDRVM7CisJaW50IHhpZDsKKwlpbnQgb3Bsb2NrID0gRkFMU0U7CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYjsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKwljaGFyICpmdWxsX3BhdGggPSBOVUxMOworCWNoYXIgKnRtcF9wYXRoID0gIE5VTEw7CisJY2hhciAqIHRtcGJ1ZmZlcjsKKwl1bnNpZ25lZCBjaGFyICogcmVmZXJyYWxzID0gTlVMTDsKKwlpbnQgbnVtX3JlZmVycmFscyA9IDA7CisJaW50IGxlbjsKKwlfX3UxNiBmaWQ7CisKKwl4aWQgPSBHZXRYaWQoKTsKKwljaWZzX3NiID0gQ0lGU19TQihpbm9kZS0+aV9zYik7CisJcFRjb24gPSBjaWZzX3NiLT50Y29uOworCisvKiBCQiB3b3VsZCBpdCBiZSBzYWZlIGFnYWluc3QgZGVhZGxvY2sgdG8gZ3JhYiB0aGlzIHNlbSAKKyAgICAgIGV2ZW4gdGhvdWdoIHJlbmFtZSBpdHNlbGYgZ3JhYnMgdGhlIHNlbSBhbmQgY2FsbHMgbG9va3VwPyAqLworLyogICAgICAgZG93bigmaW5vZGUtPmlfc2ItPnNfdmZzX3JlbmFtZV9zZW0pOyovCisJZnVsbF9wYXRoID0gYnVpbGRfcGF0aF9mcm9tX2RlbnRyeShkaXJlbnRyeSk7CisvKiAgICAgICB1cCgmaW5vZGUtPmlfc2ItPnNfdmZzX3JlbmFtZV9zZW0pOyovCisKKwlpZihmdWxsX3BhdGggPT0gTlVMTCkgeworCQlGcmVlWGlkKHhpZCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNGWUkoMSwKKwkgICAgICgiRnVsbCBwYXRoOiAlcyBpbm9kZSA9IDB4JXAgcEJ1ZmZlciA9IDB4JXAgYnVmbGVuID0gJWQiLAorCSAgICAgIGZ1bGxfcGF0aCwgaW5vZGUsIHBCdWZmZXIsIGJ1ZmxlbikpOworCWlmKGJ1ZmxlbiA+IFBBVEhfTUFYKQorCQlsZW4gPSBQQVRIX01BWDsKKwllbHNlCisJCWxlbiA9IGJ1ZmxlbjsKKwl0bXBidWZmZXIgPSBrbWFsbG9jKGxlbixHRlBfS0VSTkVMKTsgICAKKwlpZih0bXBidWZmZXIgPT0gTlVMTCkgeworCQlpZiAoZnVsbF9wYXRoKQorCQkJa2ZyZWUoZnVsbF9wYXRoKTsKKwkJRnJlZVhpZCh4aWQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKy8qIEJCIGFkZCByZWFkIHJlcGFyc2UgcG9pbnQgc3ltbGluayBjb2RlIGFuZCBVbml4IGV4dGVuc2lvbnMgc3ltbGluayBjb2RlIGhlcmUgQkIgKi8KKwlpZiAoY2lmc19zYi0+dGNvbi0+c2VzLT5jYXBhYmlsaXRpZXMgJiBDQVBfVU5JWCkKKwkJcmMgPSBDSUZTU01CVW5peFF1ZXJ5U3ltTGluayh4aWQsIHBUY29uLCBmdWxsX3BhdGgsCisJCQkJdG1wYnVmZmVyLAorCQkJCWxlbiAtIDEsCisJCQkJY2lmc19zYi0+bG9jYWxfbmxzKTsKKwllbHNlIHsKKwkJcmMgPSBDSUZTU01CT3Blbih4aWQsIHBUY29uLCBmdWxsX3BhdGgsIEZJTEVfT1BFTiwgR0VORVJJQ19SRUFELAorCQkJCU9QRU5fUkVQQVJTRV9QT0lOVCwmZmlkLCAmb3Bsb2NrLCBOVUxMLCBjaWZzX3NiLT5sb2NhbF9ubHMpOworCQlpZighcmMpIHsKKwkJCXJjID0gQ0lGU1NNQlF1ZXJ5UmVwYXJzZUxpbmtJbmZvKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwKKwkJCQl0bXBidWZmZXIsCisJCQkJbGVuIC0gMSwgCisJCQkJZmlkLAorCQkJCWNpZnNfc2ItPmxvY2FsX25scyk7CisJCQlpZihDSUZTU01CQ2xvc2UoeGlkLCBwVGNvbiwgZmlkKSkgeworCQkJCWNGWUkoMSwoIkVycm9yIGNsb3NpbmcganVuY3Rpb24gcG9pbnQgKG9wZW4gZm9yIGlvY3RsKSIpKTsKKwkJCX0KKwkJCWlmKHJjID09IC1FSU8pIHsKKwkJCQkvKiBRdWVyeSBpZiBERlMgSnVuY3Rpb24gKi8KKwkJCQl0bXBfcGF0aCA9CisJCQkJCWttYWxsb2MoTUFYX1RSRUVfU0laRSArIE1BWF9QQVRIQ09ORiArIDEsCisJCQkJCQlHRlBfS0VSTkVMKTsKKwkJCQlpZiAodG1wX3BhdGgpIHsKKwkJCQkJc3RybmNweSh0bXBfcGF0aCwgcFRjb24tPnRyZWVOYW1lLCBNQVhfVFJFRV9TSVpFKTsKKwkJCQkJc3RybmNhdCh0bXBfcGF0aCwgZnVsbF9wYXRoLCBNQVhfUEFUSENPTkYpOworCQkJCQlyYyA9IGdldF9kZnNfcGF0aCh4aWQsIHBUY29uLT5zZXMsIHRtcF9wYXRoLAorCQkJCQkJY2lmc19zYi0+bG9jYWxfbmxzLCAmbnVtX3JlZmVycmFscywgJnJlZmVycmFscyk7CisJCQkJCWNGWUkoMSwoIkdldCBERlMgZm9yICVzIHJjID0gJWQgIix0bXBfcGF0aCwgcmMpKTsKKwkJCQkJaWYoKG51bV9yZWZlcnJhbHMgPT0gMCkgJiYgKHJjID09IDApKQorCQkJCQkJcmMgPSAtRUFDQ0VTOworCQkJCQllbHNlIHsKKwkJCQkJCWNGWUkoMSwoIm51bSByZWZlcnJhbDogJWQiLG51bV9yZWZlcnJhbHMpKTsKKwkJCQkJCWlmKHJlZmVycmFscykgeworCQkJCQkJCWNGWUkoMSwoInJlZmVycmFsIHN0cmluZzogJXMgIixyZWZlcnJhbHMpKTsKKwkJCQkJCQlzdHJuY3B5KHRtcGJ1ZmZlciwgcmVmZXJyYWxzLCBsZW4tMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJCQkJfQorCQkJCQl9CisJCQkJCWlmKHJlZmVycmFscykKKwkJCQkJCWtmcmVlKHJlZmVycmFscyk7CisJCQkJCWtmcmVlKHRtcF9wYXRoKTsKK30KKwkJCQkvKiBCQiBhZGQgY29kZSBsaWtlIGVsc2UgZGVjb2RlIHJlZmVycmFscyB0aGVuIG1lbWNweSB0bworCQkJCSAgdG1wYnVmZmVyIGFuZCBmcmVlIHJlZmVycmFscyBzdHJpbmcgYXJyYXkgQkIgKi8KKwkJCX0KKwkJfQorCX0KKwkvKiBCQiBBbnl0aGluZyBlbHNlIHRvIGRvIHRvIGhhbmRsZSByZWN1cnNpdmUgbGlua3M/ICovCisJLyogQkIgU2hvdWxkIHdlIGJlIHVzaW5nIHBhZ2Ugb3BzIGhlcmU/ICovCisKKwkvKiBCQiBudWxsIHRlcm1pbmF0ZSByZXR1cm5lZCBzdHJpbmcgaW4gcEJ1ZmZlcj8gQkIgKi8KKwlpZiAocmMgPT0gMCkgeworCQlyYyA9IHZmc19yZWFkbGluayhkaXJlbnRyeSwgcEJ1ZmZlciwgbGVuLCB0bXBidWZmZXIpOworCQljRllJKDEsCisJCSAgICAgKCJ2ZnNfcmVhZGxpbmsgY2FsbGVkIGZyb20gY2lmc19yZWFkbGluayByZXR1cm5lZCAlZCIsCisJCSAgICAgIHJjKSk7CisJfQorCisJaWYgKHRtcGJ1ZmZlcikgeworCQlrZnJlZSh0bXBidWZmZXIpOworCX0KKwlpZiAoZnVsbF9wYXRoKSB7CisJCWtmcmVlKGZ1bGxfcGF0aCk7CisJfQorCUZyZWVYaWQoeGlkKTsKKwlyZXR1cm4gcmM7Cit9CisKK3ZvaWQgY2lmc19wdXRfbGluayhzdHJ1Y3QgZGVudHJ5ICpkaXJlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJY2hhciAqcCA9IG5kX2dldF9saW5rKG5kKTsKKwlpZiAoIUlTX0VSUihwKSkKKwkJa2ZyZWUocCk7Cit9CmRpZmYgLS1naXQgYS9mcy9jaWZzL21kNC5jIGIvZnMvY2lmcy9tZDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmQ2MmM5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9tZDQuYwpAQCAtMCwwICsxLDIwNSBAQAorLyogCisgICBVbml4IFNNQi9OZXRiaW9zIGltcGxlbWVudGF0aW9uLgorICAgVmVyc2lvbiAxLjkuCisgICBhIGltcGxlbWVudGF0aW9uIG9mIE1ENCBkZXNpZ25lZCBmb3IgdXNlIGluIHRoZSBTTUIgYXV0aGVudGljYXRpb24gcHJvdG9jb2wKKyAgIENvcHlyaWdodCAoQykgQW5kcmV3IFRyaWRnZWxsIDE5OTctMTk5OC4KKyAgIE1vZGlmaWVkIGJ5IFN0ZXZlIEZyZW5jaCAoc2ZyZW5jaEB1cy5pYm0uY29tKSAyMDAyLTIwMDMKKyAgIAorICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAgIAorICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAgIAorICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlICJjaWZzZW5jcnlwdC5oIgorCisvKiBOT1RFOiBUaGlzIGNvZGUgbWFrZXMgbm8gYXR0ZW1wdCB0byBiZSBmYXN0ISAqLworCitzdGF0aWMgX191MzIKK0YoX191MzIgWCwgX191MzIgWSwgX191MzIgWikKK3sKKwlyZXR1cm4gKFggJiBZKSB8ICgoflgpICYgWik7Cit9CisKK3N0YXRpYyBfX3UzMgorRyhfX3UzMiBYLCBfX3UzMiBZLCBfX3UzMiBaKQoreworCXJldHVybiAoWCAmIFkpIHwgKFggJiBaKSB8IChZICYgWik7Cit9CisKK3N0YXRpYyBfX3UzMgorSChfX3UzMiBYLCBfX3UzMiBZLCBfX3UzMiBaKQoreworCXJldHVybiBYIF4gWSBeIFo7Cit9CisKK3N0YXRpYyBfX3UzMgorbHNoaWZ0KF9fdTMyIHgsIGludCBzKQoreworCXggJj0gMHhGRkZGRkZGRjsKKwlyZXR1cm4gKCh4IDw8IHMpICYgMHhGRkZGRkZGRikgfCAoeCA+PiAoMzIgLSBzKSk7Cit9CisKKyNkZWZpbmUgUk9VTkQxKGEsYixjLGQsayxzKSAoKmEpID0gbHNoaWZ0KCgqYSkgKyBGKCpiLCpjLCpkKSArIFhba10sIHMpCisjZGVmaW5lIFJPVU5EMihhLGIsYyxkLGsscykgKCphKSA9IGxzaGlmdCgoKmEpICsgRygqYiwqYywqZCkgKyBYW2tdICsgKF9fdTMyKTB4NUE4Mjc5OTkscykKKyNkZWZpbmUgUk9VTkQzKGEsYixjLGQsayxzKSAoKmEpID0gbHNoaWZ0KCgqYSkgKyBIKCpiLCpjLCpkKSArIFhba10gKyAoX191MzIpMHg2RUQ5RUJBMSxzKQorCisvKiB0aGlzIGFwcGxpZXMgbWQ0IHRvIDY0IGJ5dGUgY2h1bmtzICovCitzdGF0aWMgdm9pZAorbWRmb3VyNjQoX191MzIgKiBNLCBfX3UzMiAqIEEsIF9fdTMyICpCLCBfX3UzMiAqIEMsIF9fdTMyICpEKQoreworCWludCBqOworCV9fdTMyIEFBLCBCQiwgQ0MsIEREOworCV9fdTMyIFhbMTZdOworCisKKwlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKwkJWFtqXSA9IE1bal07CisKKwlBQSA9ICpBOworCUJCID0gKkI7CisJQ0MgPSAqQzsKKwlERCA9ICpEOworCisJUk9VTkQxKEEsIEIsIEMsIEQsIDAsIDMpOworCVJPVU5EMShELCBBLCBCLCBDLCAxLCA3KTsKKwlST1VORDEoQywgRCwgQSwgQiwgMiwgMTEpOworCVJPVU5EMShCLCBDLCBELCBBLCAzLCAxOSk7CisJUk9VTkQxKEEsIEIsIEMsIEQsIDQsIDMpOworCVJPVU5EMShELCBBLCBCLCBDLCA1LCA3KTsKKwlST1VORDEoQywgRCwgQSwgQiwgNiwgMTEpOworCVJPVU5EMShCLCBDLCBELCBBLCA3LCAxOSk7CisJUk9VTkQxKEEsIEIsIEMsIEQsIDgsIDMpOworCVJPVU5EMShELCBBLCBCLCBDLCA5LCA3KTsKKwlST1VORDEoQywgRCwgQSwgQiwgMTAsIDExKTsKKwlST1VORDEoQiwgQywgRCwgQSwgMTEsIDE5KTsKKwlST1VORDEoQSwgQiwgQywgRCwgMTIsIDMpOworCVJPVU5EMShELCBBLCBCLCBDLCAxMywgNyk7CisJUk9VTkQxKEMsIEQsIEEsIEIsIDE0LCAxMSk7CisJUk9VTkQxKEIsIEMsIEQsIEEsIDE1LCAxOSk7CisKKwlST1VORDIoQSwgQiwgQywgRCwgMCwgMyk7CisJUk9VTkQyKEQsIEEsIEIsIEMsIDQsIDUpOworCVJPVU5EMihDLCBELCBBLCBCLCA4LCA5KTsKKwlST1VORDIoQiwgQywgRCwgQSwgMTIsIDEzKTsKKwlST1VORDIoQSwgQiwgQywgRCwgMSwgMyk7CisJUk9VTkQyKEQsIEEsIEIsIEMsIDUsIDUpOworCVJPVU5EMihDLCBELCBBLCBCLCA5LCA5KTsKKwlST1VORDIoQiwgQywgRCwgQSwgMTMsIDEzKTsKKwlST1VORDIoQSwgQiwgQywgRCwgMiwgMyk7CisJUk9VTkQyKEQsIEEsIEIsIEMsIDYsIDUpOworCVJPVU5EMihDLCBELCBBLCBCLCAxMCwgOSk7CisJUk9VTkQyKEIsIEMsIEQsIEEsIDE0LCAxMyk7CisJUk9VTkQyKEEsIEIsIEMsIEQsIDMsIDMpOworCVJPVU5EMihELCBBLCBCLCBDLCA3LCA1KTsKKwlST1VORDIoQywgRCwgQSwgQiwgMTEsIDkpOworCVJPVU5EMihCLCBDLCBELCBBLCAxNSwgMTMpOworCisJUk9VTkQzKEEsIEIsIEMsIEQsIDAsIDMpOworCVJPVU5EMyhELCBBLCBCLCBDLCA4LCA5KTsKKwlST1VORDMoQywgRCwgQSwgQiwgNCwgMTEpOworCVJPVU5EMyhCLCBDLCBELCBBLCAxMiwgMTUpOworCVJPVU5EMyhBLCBCLCBDLCBELCAyLCAzKTsKKwlST1VORDMoRCwgQSwgQiwgQywgMTAsIDkpOworCVJPVU5EMyhDLCBELCBBLCBCLCA2LCAxMSk7CisJUk9VTkQzKEIsIEMsIEQsIEEsIDE0LCAxNSk7CisJUk9VTkQzKEEsIEIsIEMsIEQsIDEsIDMpOworCVJPVU5EMyhELCBBLCBCLCBDLCA5LCA5KTsKKwlST1VORDMoQywgRCwgQSwgQiwgNSwgMTEpOworCVJPVU5EMyhCLCBDLCBELCBBLCAxMywgMTUpOworCVJPVU5EMyhBLCBCLCBDLCBELCAzLCAzKTsKKwlST1VORDMoRCwgQSwgQiwgQywgMTEsIDkpOworCVJPVU5EMyhDLCBELCBBLCBCLCA3LCAxMSk7CisJUk9VTkQzKEIsIEMsIEQsIEEsIDE1LCAxNSk7CisKKwkqQSArPSBBQTsKKwkqQiArPSBCQjsKKwkqQyArPSBDQzsKKwkqRCArPSBERDsKKworCSpBICY9IDB4RkZGRkZGRkY7CisJKkIgJj0gMHhGRkZGRkZGRjsKKwkqQyAmPSAweEZGRkZGRkZGOworCSpEICY9IDB4RkZGRkZGRkY7CisKKwlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKwkJWFtqXSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCitjb3B5NjQoX191MzIgKiBNLCB1bnNpZ25lZCBjaGFyICppbikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQlNW2ldID0gKGluW2kgKiA0ICsgM10gPDwgMjQpIHwgKGluW2kgKiA0ICsgMl0gPDwgMTYpIHwKKwkJICAgIChpbltpICogNCArIDFdIDw8IDgpIHwgKGluW2kgKiA0ICsgMF0gPDwgMCk7Cit9CisKK3N0YXRpYyB2b2lkCitjb3B5NCh1bnNpZ25lZCBjaGFyICpvdXQsIF9fdTMyIHgpCit7CisJb3V0WzBdID0geCAmIDB4RkY7CisJb3V0WzFdID0gKHggPj4gOCkgJiAweEZGOworCW91dFsyXSA9ICh4ID4+IDE2KSAmIDB4RkY7CisJb3V0WzNdID0gKHggPj4gMjQpICYgMHhGRjsKK30KKworLyogcHJvZHVjZSBhIG1kNCBtZXNzYWdlIGRpZ2VzdCBmcm9tIGRhdGEgb2YgbGVuZ3RoIG4gYnl0ZXMgKi8KK3ZvaWQKK21kZm91cih1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGNoYXIgKmluLCBpbnQgbikKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsxMjhdOworCV9fdTMyIE1bMTZdOworCV9fdTMyIGIgPSBuICogODsKKwlpbnQgaTsKKwlfX3UzMiBBID0gMHg2NzQ1MjMwMTsKKwlfX3UzMiBCID0gMHhlZmNkYWI4OTsKKwlfX3UzMiBDID0gMHg5OGJhZGNmZTsKKwlfX3UzMiBEID0gMHgxMDMyNTQ3NjsKKworCXdoaWxlIChuID4gNjQpIHsKKwkJY29weTY0KE0sIGluKTsKKwkJbWRmb3VyNjQoTSwmQSwmQiwgJkMsICZEKTsKKwkJaW4gKz0gNjQ7CisJCW4gLT0gNjQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorCQlidWZbaV0gPSAwOworCW1lbWNweShidWYsIGluLCBuKTsKKwlidWZbbl0gPSAweDgwOworCisJaWYgKG4gPD0gNTUpIHsKKwkJY29weTQoYnVmICsgNTYsIGIpOworCQljb3B5NjQoTSwgYnVmKTsKKwkJbWRmb3VyNjQoTSwgJkEsICZCLCAmQywgJkQpOworCX0gZWxzZSB7CisJCWNvcHk0KGJ1ZiArIDEyMCwgYik7CisJCWNvcHk2NChNLCBidWYpOworCQltZGZvdXI2NChNLCAmQSwgJkIsICZDLCAmRCk7CisJCWNvcHk2NChNLCBidWYgKyA2NCk7CisJCW1kZm91cjY0KE0sICZBLCAmQiwgJkMsICZEKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspCisJCWJ1ZltpXSA9IDA7CisJY29weTY0KE0sIGJ1Zik7CisKKwljb3B5NChvdXQsIEEpOworCWNvcHk0KG91dCArIDQsIEIpOworCWNvcHk0KG91dCArIDgsIEMpOworCWNvcHk0KG91dCArIDEyLCBEKTsKKworCUEgPSBCID0gQyA9IEQgPSAwOworfQpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9tZDUuYyBiL2ZzL2NpZnMvbWQ1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FhMjM0OQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2NpZnMvbWQ1LmMKQEAgLTAsMCArMSwzNjMgQEAKKy8qCisgKiBUaGlzIGNvZGUgaW1wbGVtZW50cyB0aGUgTUQ1IG1lc3NhZ2UtZGlnZXN0IGFsZ29yaXRobS4KKyAqIFRoZSBhbGdvcml0aG0gaXMgZHVlIHRvIFJvbiBSaXZlc3QuICBUaGlzIGNvZGUgd2FzCisgKiB3cml0dGVuIGJ5IENvbGluIFBsdW1iIGluIDE5OTMsIG5vIGNvcHlyaWdodCBpcyBjbGFpbWVkLgorICogVGhpcyBjb2RlIGlzIGluIHRoZSBwdWJsaWMgZG9tYWluOyBkbyB3aXRoIGl0IHdoYXQgeW91IHdpc2guCisgKgorICogRXF1aXZhbGVudCBjb2RlIGlzIGF2YWlsYWJsZSBmcm9tIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuCisgKiBUaGlzIGNvZGUgaGFzIGJlZW4gdGVzdGVkIGFnYWluc3QgdGhhdCwgYW5kIGlzIGVxdWl2YWxlbnQsCisgKiBleGNlcHQgdGhhdCB5b3UgZG9uJ3QgbmVlZCB0byBpbmNsdWRlIHR3byBwYWdlcyBvZiBsZWdhbGVzZQorICogd2l0aCBldmVyeSBjb3B5LgorICoKKyAqIFRvIGNvbXB1dGUgdGhlIG1lc3NhZ2UgZGlnZXN0IG9mIGEgY2h1bmsgb2YgYnl0ZXMsIGRlY2xhcmUgYW4KKyAqIE1ENUNvbnRleHQgc3RydWN0dXJlLCBwYXNzIGl0IHRvIE1ENUluaXQsIGNhbGwgTUQ1VXBkYXRlIGFzCisgKiBuZWVkZWQgb24gYnVmZmVycyBmdWxsIG9mIGJ5dGVzLCBhbmQgdGhlbiBjYWxsIE1ENUZpbmFsLCB3aGljaAorICogd2lsbCBmaWxsIGEgc3VwcGxpZWQgMTYtYnl0ZSBhcnJheSB3aXRoIHRoZSBkaWdlc3QuCisgKi8KKworLyogVGhpcyBjb2RlIHNsaWdodGx5IG1vZGlmaWVkIHRvIGZpdCBpbnRvIFNhbWJhIGJ5IAorICAgYWJhcnRsZXRAc2FtYmEub3JnIEp1biAyMDAxIAorICAgYW5kIHRvIGZpdCB0aGUgY2lmcyB2ZnMgYnkgCisgICBTdGV2ZSBGcmVuY2ggc2ZyZW5jaEB1cy5pYm0uY29tICovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlICJtZDUuaCIKKworc3RhdGljIHZvaWQgTUQ1VHJhbnNmb3JtKF9fdTMyIGJ1Zls0XSwgX191MzIgY29uc3QgaW5bMTZdKTsKKworLyoKKyAqIE5vdGU6IHRoaXMgY29kZSBpcyBoYXJtbGVzcyBvbiBsaXR0bGUtZW5kaWFuIG1hY2hpbmVzLgorICovCitzdGF0aWMgdm9pZAorYnl0ZVJldmVyc2UodW5zaWduZWQgY2hhciAqYnVmLCB1bnNpZ25lZCBsb25ncykKK3sKKwlfX3UzMiB0OworCWRvIHsKKwkJdCA9IChfX3UzMikgKCh1bnNpZ25lZCkgYnVmWzNdIDw8IDggfCBidWZbMl0pIDw8IDE2IHwKKwkJICAgICgodW5zaWduZWQpIGJ1ZlsxXSA8PCA4IHwgYnVmWzBdKTsKKwkJKihfX3UzMiAqKSBidWYgPSB0OworCQlidWYgKz0gNDsKKwl9IHdoaWxlICgtLWxvbmdzKTsKK30KKworLyoKKyAqIFN0YXJ0IE1ENSBhY2N1bXVsYXRpb24uICBTZXQgYml0IGNvdW50IHRvIDAgYW5kIGJ1ZmZlciB0byBteXN0ZXJpb3VzCisgKiBpbml0aWFsaXphdGlvbiBjb25zdGFudHMuCisgKi8KK3ZvaWQKK01ENUluaXQoc3RydWN0IE1ENUNvbnRleHQgKmN0eCkKK3sKKwljdHgtPmJ1ZlswXSA9IDB4Njc0NTIzMDE7CisJY3R4LT5idWZbMV0gPSAweGVmY2RhYjg5OworCWN0eC0+YnVmWzJdID0gMHg5OGJhZGNmZTsKKwljdHgtPmJ1ZlszXSA9IDB4MTAzMjU0NzY7CisKKwljdHgtPmJpdHNbMF0gPSAwOworCWN0eC0+Yml0c1sxXSA9IDA7Cit9CisKKy8qCisgKiBVcGRhdGUgY29udGV4dCB0byByZWZsZWN0IHRoZSBjb25jYXRlbmF0aW9uIG9mIGFub3RoZXIgYnVmZmVyIGZ1bGwKKyAqIG9mIGJ5dGVzLgorICovCit2b2lkCitNRDVVcGRhdGUoc3RydWN0IE1ENUNvbnRleHQgKmN0eCwgdW5zaWduZWQgY2hhciBjb25zdCAqYnVmLCB1bnNpZ25lZCBsZW4pCit7CisJcmVnaXN0ZXIgX191MzIgdDsKKworCS8qIFVwZGF0ZSBiaXRjb3VudCAqLworCisJdCA9IGN0eC0+Yml0c1swXTsKKwlpZiAoKGN0eC0+Yml0c1swXSA9IHQgKyAoKF9fdTMyKSBsZW4gPDwgMykpIDwgdCkKKwkJY3R4LT5iaXRzWzFdKys7CS8qIENhcnJ5IGZyb20gbG93IHRvIGhpZ2ggKi8KKwljdHgtPmJpdHNbMV0gKz0gbGVuID4+IDI5OworCisJdCA9ICh0ID4+IDMpICYgMHgzZjsJLyogQnl0ZXMgYWxyZWFkeSBpbiBzaHNJbmZvLT5kYXRhICovCisKKwkvKiBIYW5kbGUgYW55IGxlYWRpbmcgb2RkLXNpemVkIGNodW5rcyAqLworCisJaWYgKHQpIHsKKwkJdW5zaWduZWQgY2hhciAqcCA9ICh1bnNpZ25lZCBjaGFyICopIGN0eC0+aW4gKyB0OworCisJCXQgPSA2NCAtIHQ7CisJCWlmIChsZW4gPCB0KSB7CisJCQltZW1tb3ZlKHAsIGJ1ZiwgbGVuKTsKKwkJCXJldHVybjsKKwkJfQorCQltZW1tb3ZlKHAsIGJ1ZiwgdCk7CisJCWJ5dGVSZXZlcnNlKGN0eC0+aW4sIDE2KTsKKwkJTUQ1VHJhbnNmb3JtKGN0eC0+YnVmLCAoX191MzIgKikgY3R4LT5pbik7CisJCWJ1ZiArPSB0OworCQlsZW4gLT0gdDsKKwl9CisJLyogUHJvY2VzcyBkYXRhIGluIDY0LWJ5dGUgY2h1bmtzICovCisKKwl3aGlsZSAobGVuID49IDY0KSB7CisJCW1lbW1vdmUoY3R4LT5pbiwgYnVmLCA2NCk7CisJCWJ5dGVSZXZlcnNlKGN0eC0+aW4sIDE2KTsKKwkJTUQ1VHJhbnNmb3JtKGN0eC0+YnVmLCAoX191MzIgKikgY3R4LT5pbik7CisJCWJ1ZiArPSA2NDsKKwkJbGVuIC09IDY0OworCX0KKworCS8qIEhhbmRsZSBhbnkgcmVtYWluaW5nIGJ5dGVzIG9mIGRhdGEuICovCisKKwltZW1tb3ZlKGN0eC0+aW4sIGJ1ZiwgbGVuKTsKK30KKworLyoKKyAqIEZpbmFsIHdyYXB1cCAtIHBhZCB0byA2NC1ieXRlIGJvdW5kYXJ5IHdpdGggdGhlIGJpdCBwYXR0ZXJuIAorICogMSAwKiAoNjQtYml0IGNvdW50IG9mIGJpdHMgcHJvY2Vzc2VkLCBNU0ItZmlyc3QpCisgKi8KK3ZvaWQKK01ENUZpbmFsKHVuc2lnbmVkIGNoYXIgZGlnZXN0WzE2XSwgc3RydWN0IE1ENUNvbnRleHQgKmN0eCkKK3sKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJdW5zaWduZWQgY2hhciAqcDsKKworCS8qIENvbXB1dGUgbnVtYmVyIG9mIGJ5dGVzIG1vZCA2NCAqLworCWNvdW50ID0gKGN0eC0+Yml0c1swXSA+PiAzKSAmIDB4M0Y7CisKKwkvKiBTZXQgdGhlIGZpcnN0IGNoYXIgb2YgcGFkZGluZyB0byAweDgwLiAgVGhpcyBpcyBzYWZlIHNpbmNlIHRoZXJlIGlzCisJICAgYWx3YXlzIGF0IGxlYXN0IG9uZSBieXRlIGZyZWUgKi8KKwlwID0gY3R4LT5pbiArIGNvdW50OworCSpwKysgPSAweDgwOworCisJLyogQnl0ZXMgb2YgcGFkZGluZyBuZWVkZWQgdG8gbWFrZSA2NCBieXRlcyAqLworCWNvdW50ID0gNjQgLSAxIC0gY291bnQ7CisKKwkvKiBQYWQgb3V0IHRvIDU2IG1vZCA2NCAqLworCWlmIChjb3VudCA8IDgpIHsKKwkJLyogVHdvIGxvdHMgb2YgcGFkZGluZzogIFBhZCB0aGUgZmlyc3QgYmxvY2sgdG8gNjQgYnl0ZXMgKi8KKwkJbWVtc2V0KHAsIDAsIGNvdW50KTsKKwkJYnl0ZVJldmVyc2UoY3R4LT5pbiwgMTYpOworCQlNRDVUcmFuc2Zvcm0oY3R4LT5idWYsIChfX3UzMiAqKSBjdHgtPmluKTsKKworCQkvKiBOb3cgZmlsbCB0aGUgbmV4dCBibG9jayB3aXRoIDU2IGJ5dGVzICovCisJCW1lbXNldChjdHgtPmluLCAwLCA1Nik7CisJfSBlbHNlIHsKKwkJLyogUGFkIGJsb2NrIHRvIDU2IGJ5dGVzICovCisJCW1lbXNldChwLCAwLCBjb3VudCAtIDgpOworCX0KKwlieXRlUmV2ZXJzZShjdHgtPmluLCAxNCk7CisKKwkvKiBBcHBlbmQgbGVuZ3RoIGluIGJpdHMgYW5kIHRyYW5zZm9ybSAqLworCSgoX191MzIgKikgY3R4LT5pbilbMTRdID0gY3R4LT5iaXRzWzBdOworCSgoX191MzIgKikgY3R4LT5pbilbMTVdID0gY3R4LT5iaXRzWzFdOworCisJTUQ1VHJhbnNmb3JtKGN0eC0+YnVmLCAoX191MzIgKikgY3R4LT5pbik7CisJYnl0ZVJldmVyc2UoKHVuc2lnbmVkIGNoYXIgKikgY3R4LT5idWYsIDQpOworCW1lbW1vdmUoZGlnZXN0LCBjdHgtPmJ1ZiwgMTYpOworCW1lbXNldChjdHgsIDAsIHNpemVvZigqY3R4KSk7CS8qIEluIGNhc2UgaXQncyBzZW5zaXRpdmUgKi8KK30KKworLyogVGhlIGZvdXIgY29yZSBmdW5jdGlvbnMgLSBGMSBpcyBvcHRpbWl6ZWQgc29tZXdoYXQgKi8KKworLyogI2RlZmluZSBGMSh4LCB5LCB6KSAoeCAmIHkgfCB+eCAmIHopICovCisjZGVmaW5lIEYxKHgsIHksIHopICh6IF4gKHggJiAoeSBeIHopKSkKKyNkZWZpbmUgRjIoeCwgeSwgeikgRjEoeiwgeCwgeSkKKyNkZWZpbmUgRjMoeCwgeSwgeikgKHggXiB5IF4geikKKyNkZWZpbmUgRjQoeCwgeSwgeikgKHkgXiAoeCB8IH56KSkKKworLyogVGhpcyBpcyB0aGUgY2VudHJhbCBzdGVwIGluIHRoZSBNRDUgYWxnb3JpdGhtLiAqLworI2RlZmluZSBNRDVTVEVQKGYsIHcsIHgsIHksIHosIGRhdGEsIHMpIFwKKwkoIHcgKz0gZih4LCB5LCB6KSArIGRhdGEsICB3ID0gdzw8cyB8IHc+PigzMi1zKSwgIHcgKz0geCApCisKKy8qCisgKiBUaGUgY29yZSBvZiB0aGUgTUQ1IGFsZ29yaXRobSwgdGhpcyBhbHRlcnMgYW4gZXhpc3RpbmcgTUQ1IGhhc2ggdG8KKyAqIHJlZmxlY3QgdGhlIGFkZGl0aW9uIG9mIDE2IGxvbmd3b3JkcyBvZiBuZXcgZGF0YS4gIE1ENVVwZGF0ZSBibG9ja3MKKyAqIHRoZSBkYXRhIGFuZCBjb252ZXJ0cyBieXRlcyBpbnRvIGxvbmd3b3JkcyBmb3IgdGhpcyByb3V0aW5lLgorICovCitzdGF0aWMgdm9pZAorTUQ1VHJhbnNmb3JtKF9fdTMyIGJ1Zls0XSwgX191MzIgY29uc3QgaW5bMTZdKQoreworCXJlZ2lzdGVyIF9fdTMyIGEsIGIsIGMsIGQ7CisKKwlhID0gYnVmWzBdOworCWIgPSBidWZbMV07CisJYyA9IGJ1ZlsyXTsKKwlkID0gYnVmWzNdOworCisJTUQ1U1RFUChGMSwgYSwgYiwgYywgZCwgaW5bMF0gKyAweGQ3NmFhNDc4LCA3KTsKKwlNRDVTVEVQKEYxLCBkLCBhLCBiLCBjLCBpblsxXSArIDB4ZThjN2I3NTYsIDEyKTsKKwlNRDVTVEVQKEYxLCBjLCBkLCBhLCBiLCBpblsyXSArIDB4MjQyMDcwZGIsIDE3KTsKKwlNRDVTVEVQKEYxLCBiLCBjLCBkLCBhLCBpblszXSArIDB4YzFiZGNlZWUsIDIyKTsKKwlNRDVTVEVQKEYxLCBhLCBiLCBjLCBkLCBpbls0XSArIDB4ZjU3YzBmYWYsIDcpOworCU1ENVNURVAoRjEsIGQsIGEsIGIsIGMsIGluWzVdICsgMHg0Nzg3YzYyYSwgMTIpOworCU1ENVNURVAoRjEsIGMsIGQsIGEsIGIsIGluWzZdICsgMHhhODMwNDYxMywgMTcpOworCU1ENVNURVAoRjEsIGIsIGMsIGQsIGEsIGluWzddICsgMHhmZDQ2OTUwMSwgMjIpOworCU1ENVNURVAoRjEsIGEsIGIsIGMsIGQsIGluWzhdICsgMHg2OTgwOThkOCwgNyk7CisJTUQ1U1RFUChGMSwgZCwgYSwgYiwgYywgaW5bOV0gKyAweDhiNDRmN2FmLCAxMik7CisJTUQ1U1RFUChGMSwgYywgZCwgYSwgYiwgaW5bMTBdICsgMHhmZmZmNWJiMSwgMTcpOworCU1ENVNURVAoRjEsIGIsIGMsIGQsIGEsIGluWzExXSArIDB4ODk1Y2Q3YmUsIDIyKTsKKwlNRDVTVEVQKEYxLCBhLCBiLCBjLCBkLCBpblsxMl0gKyAweDZiOTAxMTIyLCA3KTsKKwlNRDVTVEVQKEYxLCBkLCBhLCBiLCBjLCBpblsxM10gKyAweGZkOTg3MTkzLCAxMik7CisJTUQ1U1RFUChGMSwgYywgZCwgYSwgYiwgaW5bMTRdICsgMHhhNjc5NDM4ZSwgMTcpOworCU1ENVNURVAoRjEsIGIsIGMsIGQsIGEsIGluWzE1XSArIDB4NDliNDA4MjEsIDIyKTsKKworCU1ENVNURVAoRjIsIGEsIGIsIGMsIGQsIGluWzFdICsgMHhmNjFlMjU2MiwgNSk7CisJTUQ1U1RFUChGMiwgZCwgYSwgYiwgYywgaW5bNl0gKyAweGMwNDBiMzQwLCA5KTsKKwlNRDVTVEVQKEYyLCBjLCBkLCBhLCBiLCBpblsxMV0gKyAweDI2NWU1YTUxLCAxNCk7CisJTUQ1U1RFUChGMiwgYiwgYywgZCwgYSwgaW5bMF0gKyAweGU5YjZjN2FhLCAyMCk7CisJTUQ1U1RFUChGMiwgYSwgYiwgYywgZCwgaW5bNV0gKyAweGQ2MmYxMDVkLCA1KTsKKwlNRDVTVEVQKEYyLCBkLCBhLCBiLCBjLCBpblsxMF0gKyAweDAyNDQxNDUzLCA5KTsKKwlNRDVTVEVQKEYyLCBjLCBkLCBhLCBiLCBpblsxNV0gKyAweGQ4YTFlNjgxLCAxNCk7CisJTUQ1U1RFUChGMiwgYiwgYywgZCwgYSwgaW5bNF0gKyAweGU3ZDNmYmM4LCAyMCk7CisJTUQ1U1RFUChGMiwgYSwgYiwgYywgZCwgaW5bOV0gKyAweDIxZTFjZGU2LCA1KTsKKwlNRDVTVEVQKEYyLCBkLCBhLCBiLCBjLCBpblsxNF0gKyAweGMzMzcwN2Q2LCA5KTsKKwlNRDVTVEVQKEYyLCBjLCBkLCBhLCBiLCBpblszXSArIDB4ZjRkNTBkODcsIDE0KTsKKwlNRDVTVEVQKEYyLCBiLCBjLCBkLCBhLCBpbls4XSArIDB4NDU1YTE0ZWQsIDIwKTsKKwlNRDVTVEVQKEYyLCBhLCBiLCBjLCBkLCBpblsxM10gKyAweGE5ZTNlOTA1LCA1KTsKKwlNRDVTVEVQKEYyLCBkLCBhLCBiLCBjLCBpblsyXSArIDB4ZmNlZmEzZjgsIDkpOworCU1ENVNURVAoRjIsIGMsIGQsIGEsIGIsIGluWzddICsgMHg2NzZmMDJkOSwgMTQpOworCU1ENVNURVAoRjIsIGIsIGMsIGQsIGEsIGluWzEyXSArIDB4OGQyYTRjOGEsIDIwKTsKKworCU1ENVNURVAoRjMsIGEsIGIsIGMsIGQsIGluWzVdICsgMHhmZmZhMzk0MiwgNCk7CisJTUQ1U1RFUChGMywgZCwgYSwgYiwgYywgaW5bOF0gKyAweDg3NzFmNjgxLCAxMSk7CisJTUQ1U1RFUChGMywgYywgZCwgYSwgYiwgaW5bMTFdICsgMHg2ZDlkNjEyMiwgMTYpOworCU1ENVNURVAoRjMsIGIsIGMsIGQsIGEsIGluWzE0XSArIDB4ZmRlNTM4MGMsIDIzKTsKKwlNRDVTVEVQKEYzLCBhLCBiLCBjLCBkLCBpblsxXSArIDB4YTRiZWVhNDQsIDQpOworCU1ENVNURVAoRjMsIGQsIGEsIGIsIGMsIGluWzRdICsgMHg0YmRlY2ZhOSwgMTEpOworCU1ENVNURVAoRjMsIGMsIGQsIGEsIGIsIGluWzddICsgMHhmNmJiNGI2MCwgMTYpOworCU1ENVNURVAoRjMsIGIsIGMsIGQsIGEsIGluWzEwXSArIDB4YmViZmJjNzAsIDIzKTsKKwlNRDVTVEVQKEYzLCBhLCBiLCBjLCBkLCBpblsxM10gKyAweDI4OWI3ZWM2LCA0KTsKKwlNRDVTVEVQKEYzLCBkLCBhLCBiLCBjLCBpblswXSArIDB4ZWFhMTI3ZmEsIDExKTsKKwlNRDVTVEVQKEYzLCBjLCBkLCBhLCBiLCBpblszXSArIDB4ZDRlZjMwODUsIDE2KTsKKwlNRDVTVEVQKEYzLCBiLCBjLCBkLCBhLCBpbls2XSArIDB4MDQ4ODFkMDUsIDIzKTsKKwlNRDVTVEVQKEYzLCBhLCBiLCBjLCBkLCBpbls5XSArIDB4ZDlkNGQwMzksIDQpOworCU1ENVNURVAoRjMsIGQsIGEsIGIsIGMsIGluWzEyXSArIDB4ZTZkYjk5ZTUsIDExKTsKKwlNRDVTVEVQKEYzLCBjLCBkLCBhLCBiLCBpblsxNV0gKyAweDFmYTI3Y2Y4LCAxNik7CisJTUQ1U1RFUChGMywgYiwgYywgZCwgYSwgaW5bMl0gKyAweGM0YWM1NjY1LCAyMyk7CisKKwlNRDVTVEVQKEY0LCBhLCBiLCBjLCBkLCBpblswXSArIDB4ZjQyOTIyNDQsIDYpOworCU1ENVNURVAoRjQsIGQsIGEsIGIsIGMsIGluWzddICsgMHg0MzJhZmY5NywgMTApOworCU1ENVNURVAoRjQsIGMsIGQsIGEsIGIsIGluWzE0XSArIDB4YWI5NDIzYTcsIDE1KTsKKwlNRDVTVEVQKEY0LCBiLCBjLCBkLCBhLCBpbls1XSArIDB4ZmM5M2EwMzksIDIxKTsKKwlNRDVTVEVQKEY0LCBhLCBiLCBjLCBkLCBpblsxMl0gKyAweDY1NWI1OWMzLCA2KTsKKwlNRDVTVEVQKEY0LCBkLCBhLCBiLCBjLCBpblszXSArIDB4OGYwY2NjOTIsIDEwKTsKKwlNRDVTVEVQKEY0LCBjLCBkLCBhLCBiLCBpblsxMF0gKyAweGZmZWZmNDdkLCAxNSk7CisJTUQ1U1RFUChGNCwgYiwgYywgZCwgYSwgaW5bMV0gKyAweDg1ODQ1ZGQxLCAyMSk7CisJTUQ1U1RFUChGNCwgYSwgYiwgYywgZCwgaW5bOF0gKyAweDZmYTg3ZTRmLCA2KTsKKwlNRDVTVEVQKEY0LCBkLCBhLCBiLCBjLCBpblsxNV0gKyAweGZlMmNlNmUwLCAxMCk7CisJTUQ1U1RFUChGNCwgYywgZCwgYSwgYiwgaW5bNl0gKyAweGEzMDE0MzE0LCAxNSk7CisJTUQ1U1RFUChGNCwgYiwgYywgZCwgYSwgaW5bMTNdICsgMHg0ZTA4MTFhMSwgMjEpOworCU1ENVNURVAoRjQsIGEsIGIsIGMsIGQsIGluWzRdICsgMHhmNzUzN2U4MiwgNik7CisJTUQ1U1RFUChGNCwgZCwgYSwgYiwgYywgaW5bMTFdICsgMHhiZDNhZjIzNSwgMTApOworCU1ENVNURVAoRjQsIGMsIGQsIGEsIGIsIGluWzJdICsgMHgyYWQ3ZDJiYiwgMTUpOworCU1ENVNURVAoRjQsIGIsIGMsIGQsIGEsIGluWzldICsgMHhlYjg2ZDM5MSwgMjEpOworCisJYnVmWzBdICs9IGE7CisJYnVmWzFdICs9IGI7CisJYnVmWzJdICs9IGM7CisJYnVmWzNdICs9IGQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIHRoZSByZmMgMjEwNCB2ZXJzaW9uIG9mIGhtYWNfbWQ1IGluaXRpYWxpc2F0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitobWFjX21kNV9pbml0X3JmYzIxMDQodW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5X2xlbiwKKwkJICAgICAgc3RydWN0IEhNQUNNRDVDb250ZXh0ICpjdHgpCit7CisJaW50IGk7CisKKwkvKiBpZiBrZXkgaXMgbG9uZ2VyIHRoYW4gNjQgYnl0ZXMgcmVzZXQgaXQgdG8ga2V5PU1ENShrZXkpICovCisJaWYgKGtleV9sZW4gPiA2NCkgeworCQl1bnNpZ25lZCBjaGFyIHRrWzE2XTsKKwkJc3RydWN0IE1ENUNvbnRleHQgdGN0eDsKKworCQlNRDVJbml0KCZ0Y3R4KTsKKwkJTUQ1VXBkYXRlKCZ0Y3R4LCBrZXksIGtleV9sZW4pOworCQlNRDVGaW5hbCh0aywgJnRjdHgpOworCisJCWtleSA9IHRrOworCQlrZXlfbGVuID0gMTY7CisJfQorCisJLyogc3RhcnQgb3V0IGJ5IHN0b3Jpbmcga2V5IGluIHBhZHMgKi8KKwltZW1zZXQoY3R4LT5rX2lwYWQsIDAsIHNpemVvZiAoY3R4LT5rX2lwYWQpKTsKKwltZW1zZXQoY3R4LT5rX29wYWQsIDAsIHNpemVvZiAoY3R4LT5rX29wYWQpKTsKKwltZW1jcHkoY3R4LT5rX2lwYWQsIGtleSwga2V5X2xlbik7CisJbWVtY3B5KGN0eC0+a19vcGFkLCBrZXksIGtleV9sZW4pOworCisJLyogWE9SIGtleSB3aXRoIGlwYWQgYW5kIG9wYWQgdmFsdWVzICovCisJZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKwkJY3R4LT5rX2lwYWRbaV0gXj0gMHgzNjsKKwkJY3R4LT5rX29wYWRbaV0gXj0gMHg1YzsKKwl9CisKKwlNRDVJbml0KCZjdHgtPmN0eCk7CisJTUQ1VXBkYXRlKCZjdHgtPmN0eCwgY3R4LT5rX2lwYWQsIDY0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgdGhlIG1pY3Jvc29mdCB2ZXJzaW9uIG9mIGhtYWNfbWQ1IGluaXRpYWxpc2F0aW9uLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitobWFjX21kNV9pbml0X2xpbUtfdG9fNjQoY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5X2xlbiwKKwkJCSBzdHJ1Y3QgSE1BQ01ENUNvbnRleHQgKmN0eCkKK3sKKwlpbnQgaTsKKworCS8qIGlmIGtleSBpcyBsb25nZXIgdGhhbiA2NCBieXRlcyB0cnVuY2F0ZSBpdCAqLworCWlmIChrZXlfbGVuID4gNjQpIHsKKwkJa2V5X2xlbiA9IDY0OworCX0KKworCS8qIHN0YXJ0IG91dCBieSBzdG9yaW5nIGtleSBpbiBwYWRzICovCisJbWVtc2V0KGN0eC0+a19pcGFkLCAwLCBzaXplb2YgKGN0eC0+a19pcGFkKSk7CisJbWVtc2V0KGN0eC0+a19vcGFkLCAwLCBzaXplb2YgKGN0eC0+a19vcGFkKSk7CisJbWVtY3B5KGN0eC0+a19pcGFkLCBrZXksIGtleV9sZW4pOworCW1lbWNweShjdHgtPmtfb3BhZCwga2V5LCBrZXlfbGVuKTsKKworCS8qIFhPUiBrZXkgd2l0aCBpcGFkIGFuZCBvcGFkIHZhbHVlcyAqLworCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisJCWN0eC0+a19pcGFkW2ldIF49IDB4MzY7CisJCWN0eC0+a19vcGFkW2ldIF49IDB4NWM7CisJfQorCisJTUQ1SW5pdCgmY3R4LT5jdHgpOworCU1ENVVwZGF0ZSgmY3R4LT5jdHgsIGN0eC0+a19pcGFkLCA2NCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIHVwZGF0ZSBobWFjX21kNSAiaW5uZXIiIGJ1ZmZlcgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitobWFjX21kNV91cGRhdGUoY29uc3QgdW5zaWduZWQgY2hhciAqdGV4dCwgaW50IHRleHRfbGVuLAorCQlzdHJ1Y3QgSE1BQ01ENUNvbnRleHQgKmN0eCkKK3sKKwlNRDVVcGRhdGUoJmN0eC0+Y3R4LCB0ZXh0LCB0ZXh0X2xlbik7CS8qIHRoZW4gdGV4dCBvZiBkYXRhZ3JhbSAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBmaW5pc2ggb2ZmIGhtYWNfbWQ1ICJpbm5lciIgYnVmZmVyIGFuZCBnZW5lcmF0ZSBvdXRlciBvbmUuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2htYWNfbWQ1X2ZpbmFsKHVuc2lnbmVkIGNoYXIgKmRpZ2VzdCwgc3RydWN0IEhNQUNNRDVDb250ZXh0ICpjdHgpCit7CisJc3RydWN0IE1ENUNvbnRleHQgY3R4X287CisKKwlNRDVGaW5hbChkaWdlc3QsICZjdHgtPmN0eCk7CisKKwlNRDVJbml0KCZjdHhfbyk7CisJTUQ1VXBkYXRlKCZjdHhfbywgY3R4LT5rX29wYWQsIDY0KTsKKwlNRDVVcGRhdGUoJmN0eF9vLCBkaWdlc3QsIDE2KTsKKwlNRDVGaW5hbChkaWdlc3QsICZjdHhfbyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIHNpbmdsZSBmdW5jdGlvbiB0byBjYWxjdWxhdGUgYW4gSE1BQyBNRDUgZGlnZXN0IGZyb20gZGF0YS4KKyB1c2UgdGhlIG1pY3Jvc29mdCBobWFjbWQ1IGluaXQgbWV0aG9kIGJlY2F1c2UgdGhlIGtleSBpcyAxNiBieXRlcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQKK2htYWNfbWQ1KHVuc2lnbmVkIGNoYXIga2V5WzE2XSwgdW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGRhdGFfbGVuLAorCSB1bnNpZ25lZCBjaGFyICpkaWdlc3QpCit7CisJc3RydWN0IEhNQUNNRDVDb250ZXh0IGN0eDsKKwlobWFjX21kNV9pbml0X2xpbUtfdG9fNjQoa2V5LCAxNiwgJmN0eCk7CisJaWYgKGRhdGFfbGVuICE9IDApIHsKKwkJaG1hY19tZDVfdXBkYXRlKGRhdGEsIGRhdGFfbGVuLCAmY3R4KTsKKwl9CisJaG1hY19tZDVfZmluYWwoZGlnZXN0LCAmY3R4KTsKK30KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvbWQ1LmggYi9mcy9jaWZzL21kNS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZTFjNTMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jaWZzL21kNS5oCkBAIC0wLDAgKzEsMzggQEAKKyNpZm5kZWYgTUQ1X0gKKyNkZWZpbmUgTUQ1X0gKKyNpZm5kZWYgSEVBREVSX01ENV9ICisvKiBUcnkgdG8gYXZvaWQgY2xhc2hlcyB3aXRoIE9wZW5TU0wgKi8KKyNkZWZpbmUgSEVBREVSX01ENV9ICisjZW5kaWYKKworc3RydWN0IE1ENUNvbnRleHQgeworCV9fdTMyIGJ1Zls0XTsKKwlfX3UzMiBiaXRzWzJdOworCXVuc2lnbmVkIGNoYXIgaW5bNjRdOworfTsKKyNlbmRpZgkJCQkvKiAhTUQ1X0ggKi8KKworI2lmbmRlZiBfSE1BQ19NRDVfSAorc3RydWN0IEhNQUNNRDVDb250ZXh0IHsKKwlzdHJ1Y3QgTUQ1Q29udGV4dCBjdHg7CisJdW5zaWduZWQgY2hhciBrX2lwYWRbNjVdOworCXVuc2lnbmVkIGNoYXIga19vcGFkWzY1XTsKK307CisjZW5kaWYJCQkJLyogX0hNQUNfTUQ1X0ggKi8KKwordm9pZCBNRDVJbml0KHN0cnVjdCBNRDVDb250ZXh0ICpjb250ZXh0KTsKK3ZvaWQgTUQ1VXBkYXRlKHN0cnVjdCBNRDVDb250ZXh0ICpjb250ZXh0LCB1bnNpZ25lZCBjaGFyIGNvbnN0ICpidWYsCisJCQl1bnNpZ25lZCBsZW4pOwordm9pZCBNRDVGaW5hbCh1bnNpZ25lZCBjaGFyIGRpZ2VzdFsxNl0sIHN0cnVjdCBNRDVDb250ZXh0ICpjb250ZXh0KTsKKworLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBjb21lIGZyb20gbGliL2htYWNtZDUuYyAgKi8KKwordm9pZCBobWFjX21kNV9pbml0X3JmYzIxMDQodW5zaWduZWQgY2hhciAqa2V5LCBpbnQga2V5X2xlbiwKKwkJCXN0cnVjdCBITUFDTUQ1Q29udGV4dCAqY3R4KTsKK3ZvaWQgaG1hY19tZDVfaW5pdF9saW1LX3RvXzY0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmtleSwgaW50IGtleV9sZW4sCisJCQlzdHJ1Y3QgSE1BQ01ENUNvbnRleHQgKmN0eCk7Cit2b2lkIGhtYWNfbWQ1X3VwZGF0ZShjb25zdCB1bnNpZ25lZCBjaGFyICp0ZXh0LCBpbnQgdGV4dF9sZW4sCisJCQlzdHJ1Y3QgSE1BQ01ENUNvbnRleHQgKmN0eCk7Cit2b2lkIGhtYWNfbWQ1X2ZpbmFsKHVuc2lnbmVkIGNoYXIgKmRpZ2VzdCwgc3RydWN0IEhNQUNNRDVDb250ZXh0ICpjdHgpOwordm9pZCBobWFjX21kNSh1bnNpZ25lZCBjaGFyIGtleVsxNl0sIHVuc2lnbmVkIGNoYXIgKmRhdGEsIGludCBkYXRhX2xlbiwKKwkJCXVuc2lnbmVkIGNoYXIgKmRpZ2VzdCk7CmRpZmYgLS1naXQgYS9mcy9jaWZzL21pc2MuYyBiL2ZzL2NpZnMvbWlzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMzhkMzAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jaWZzL21pc2MuYwpAQCAtMCwwICsxLDUxNiBAQAorLyoKKyAqICAgZnMvY2lmcy9taXNjLmMKKyAqCisgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyAgQ29ycC4sIDIwMDIsMjAwNAorICogICBBdXRob3Iocyk6IFN0ZXZlIEZyZW5jaCAoc2ZyZW5jaEB1cy5pYm0uY29tKQorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBIAorICovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1wb29sLmg+CisjaW5jbHVkZSAiY2lmc3BkdS5oIgorI2luY2x1ZGUgImNpZnNnbG9iLmgiCisjaW5jbHVkZSAiY2lmc3Byb3RvLmgiCisjaW5jbHVkZSAiY2lmc19kZWJ1Zy5oIgorI2luY2x1ZGUgInNtYmVyci5oIgorI2luY2x1ZGUgIm50ZXJyLmgiCisKK2V4dGVybiBtZW1wb29sX3QgKmNpZnNfc21fcmVxX3Bvb2xwOworZXh0ZXJuIG1lbXBvb2xfdCAqY2lmc19yZXFfcG9vbHA7CitleHRlcm4gc3RydWN0IHRhc2tfc3RydWN0ICogb3Bsb2NrVGhyZWFkOworCitzdGF0aWMgX191MTYgR2xvYmFsTWlkOwkJLyogbXVsdGlwbGV4IGlkIC0gcm90YXRpbmcgY291bnRlciAqLworCisvKiBUaGUgeGlkIHNlcnZlcyBhcyBhIHVzZWZ1bCBpZGVudGlmaWVyIGZvciBlYWNoIGluY29taW5nIHZmcyByZXF1ZXN0LCAKKyAgIGluIGEgc2ltaWxhciB3YXkgdG8gdGhlIG1pZCB3aGljaCBpcyB1c2VmdWwgdG8gdHJhY2sgZWFjaCBzZW50IHNtYiwgCisgICBhbmQgQ3VycmVudFhpZCBjYW4gYWxzbyBwcm92aWRlIGEgcnVubmluZyBjb3VudGVyIChhbHRob3VnaCBpdCAKKyAgIHdpbGwgZXZlbnR1YWxseSB3cmFwIHBhc3QgemVybykgb2YgdGhlIHRvdGFsIHZmcyBvcGVyYXRpb25zIGhhbmRsZWQgCisgICBzaW5jZSB0aGUgY2lmcyBmcyB3YXMgbW91bnRlZCAqLworCit1bnNpZ25lZCBpbnQKK19HZXRYaWQodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgeGlkOworCisJc3Bpbl9sb2NrKCZHbG9iYWxNaWRfTG9jayk7CisJR2xvYmFsVG90YWxBY3RpdmVYaWQrKzsKKwlpZiAoR2xvYmFsVG90YWxBY3RpdmVYaWQgPiBHbG9iYWxNYXhBY3RpdmVYaWQpCisJCUdsb2JhbE1heEFjdGl2ZVhpZCA9IEdsb2JhbFRvdGFsQWN0aXZlWGlkOwkvKiBrZWVwIGhpZ2ggd2F0ZXIgbWFyayBmb3IgbnVtYmVyIG9mIHNpbXVsdGFuZW91cyB2ZnMgb3BzIGluIG91ciBmaWxlc3lzdGVtICovCisJeGlkID0gR2xvYmFsQ3VycmVudFhpZCsrOworCXNwaW5fdW5sb2NrKCZHbG9iYWxNaWRfTG9jayk7CisJcmV0dXJuIHhpZDsKK30KKwordm9pZAorX0ZyZWVYaWQodW5zaWduZWQgaW50IHhpZCkKK3sKKwlzcGluX2xvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwkvKiBpZihHbG9iYWxUb3RhbEFjdGl2ZVhpZCA9PSAwKQorCQlCVUcoKTsgKi8KKwlHbG9iYWxUb3RhbEFjdGl2ZVhpZC0tOworCXNwaW5fdW5sb2NrKCZHbG9iYWxNaWRfTG9jayk7Cit9CisKK3N0cnVjdCBjaWZzU2VzSW5mbyAqCitzZXNJbmZvQWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3QgY2lmc1Nlc0luZm8gKnJldF9idWY7CisKKwlyZXRfYnVmID0KKwkgICAgKHN0cnVjdCBjaWZzU2VzSW5mbyAqKSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IGNpZnNTZXNJbmZvKSwKKwkJCQkJICAgR0ZQX0tFUk5FTCk7CisJaWYgKHJldF9idWYpIHsKKwkJbWVtc2V0KHJldF9idWYsIDAsIHNpemVvZiAoc3RydWN0IGNpZnNTZXNJbmZvKSk7CisJCXdyaXRlX2xvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCQlhdG9taWNfaW5jKCZzZXNJbmZvQWxsb2NDb3VudCk7CisJCXJldF9idWYtPnN0YXR1cyA9IENpZnNOZXc7CisJCWxpc3RfYWRkKCZyZXRfYnVmLT5jaWZzU2Vzc2lvbkxpc3QsICZHbG9iYWxTTUJTZXNzaW9uTGlzdCk7CisJCWluaXRfTVVURVgoJnJldF9idWYtPnNlc1NlbSk7CisJCXdyaXRlX3VubG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisJfQorCXJldHVybiByZXRfYnVmOworfQorCit2b2lkCitzZXNJbmZvRnJlZShzdHJ1Y3QgY2lmc1Nlc0luZm8gKmJ1Zl90b19mcmVlKQoreworCWlmIChidWZfdG9fZnJlZSA9PSBOVUxMKSB7CisJCWNGWUkoMSwgKCJOdWxsIGJ1ZmZlciBwYXNzZWQgdG8gc2VzSW5mb0ZyZWUiKSk7CisJCXJldHVybjsKKwl9CisKKwl3cml0ZV9sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKwlhdG9taWNfZGVjKCZzZXNJbmZvQWxsb2NDb3VudCk7CisJbGlzdF9kZWwoJmJ1Zl90b19mcmVlLT5jaWZzU2Vzc2lvbkxpc3QpOworCXdyaXRlX3VubG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisJaWYgKGJ1Zl90b19mcmVlLT5zZXJ2ZXJPUykKKwkJa2ZyZWUoYnVmX3RvX2ZyZWUtPnNlcnZlck9TKTsKKwlpZiAoYnVmX3RvX2ZyZWUtPnNlcnZlckRvbWFpbikKKwkJa2ZyZWUoYnVmX3RvX2ZyZWUtPnNlcnZlckRvbWFpbik7CisJaWYgKGJ1Zl90b19mcmVlLT5zZXJ2ZXJOT1MpCisJCWtmcmVlKGJ1Zl90b19mcmVlLT5zZXJ2ZXJOT1MpOworCWlmIChidWZfdG9fZnJlZS0+cGFzc3dvcmQpCisJCWtmcmVlKGJ1Zl90b19mcmVlLT5wYXNzd29yZCk7CisJa2ZyZWUoYnVmX3RvX2ZyZWUpOworfQorCitzdHJ1Y3QgY2lmc1Rjb25JbmZvICoKK3Rjb25JbmZvQWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpyZXRfYnVmOworCXJldF9idWYgPQorCSAgICAoc3RydWN0IGNpZnNUY29uSW5mbyAqKSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IGNpZnNUY29uSW5mbyksCisJCQkJCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAocmV0X2J1ZikgeworCQltZW1zZXQocmV0X2J1ZiwgMCwgc2l6ZW9mIChzdHJ1Y3QgY2lmc1Rjb25JbmZvKSk7CisJCXdyaXRlX2xvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCQlhdG9taWNfaW5jKCZ0Y29uSW5mb0FsbG9jQ291bnQpOworCQlsaXN0X2FkZCgmcmV0X2J1Zi0+Y2lmc0Nvbm5lY3Rpb25MaXN0LAorCQkJICZHbG9iYWxUcmVlQ29ubmVjdGlvbkxpc3QpOworCQlyZXRfYnVmLT50aWRTdGF0dXMgPSBDaWZzTmV3OworCQlJTklUX0xJU1RfSEVBRCgmcmV0X2J1Zi0+b3BlbkZpbGVMaXN0KTsKKwkJaW5pdF9NVVRFWCgmcmV0X2J1Zi0+dGNvblNlbSk7CisjaWZkZWYgQ09ORklHX0NJRlNfU1RBVFMKKwkJc3Bpbl9sb2NrX2luaXQoJnJldF9idWYtPnN0YXRfbG9jayk7CisjZW5kaWYKKwkJd3JpdGVfdW5sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKwl9CisJcmV0dXJuIHJldF9idWY7Cit9CisKK3ZvaWQKK3Rjb25JbmZvRnJlZShzdHJ1Y3QgY2lmc1Rjb25JbmZvICpidWZfdG9fZnJlZSkKK3sKKwlpZiAoYnVmX3RvX2ZyZWUgPT0gTlVMTCkgeworCQljRllJKDEsICgiTnVsbCBidWZmZXIgcGFzc2VkIHRvIHRjb25JbmZvRnJlZSIpKTsKKwkJcmV0dXJuOworCX0KKwl3cml0ZV9sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKwlhdG9taWNfZGVjKCZ0Y29uSW5mb0FsbG9jQ291bnQpOworCWxpc3RfZGVsKCZidWZfdG9fZnJlZS0+Y2lmc0Nvbm5lY3Rpb25MaXN0KTsKKwl3cml0ZV91bmxvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCWlmIChidWZfdG9fZnJlZS0+bmF0aXZlRmlsZVN5c3RlbSkKKwkJa2ZyZWUoYnVmX3RvX2ZyZWUtPm5hdGl2ZUZpbGVTeXN0ZW0pOworCWtmcmVlKGJ1Zl90b19mcmVlKTsKK30KKworc3RydWN0IHNtYl9oZHIgKgorY2lmc19idWZfZ2V0KHZvaWQpCit7CisJc3RydWN0IHNtYl9oZHIgKnJldF9idWYgPSBOVUxMOworCisvKiBXZSBjb3VsZCB1c2UgbmVnb3RpYXRlZCBzaXplIGluc3RlYWQgb2YgbWF4X21zZ3NpemUgLSAKKyAgIGJ1dCBpdCBtYXkgYmUgbW9yZSBlZmZpY2llbnQgdG8gYWx3YXlzIGFsbG9jIHNhbWUgc2l6ZSAKKyAgIGFsYmVpdCBzbGlnaHRseSBsYXJnZXIgdGhhbiBuZWNlc3NhcnkgYW5kIG1heGJ1ZmZlcnNpemUgCisgICBkZWZhdWx0cyB0byB0aGlzIGFuZCBjYW4gbm90IGJlIGJpZ2dlciAqLworCXJldF9idWYgPQorCSAgICAoc3RydWN0IHNtYl9oZHIgKikgbWVtcG9vbF9hbGxvYyhjaWZzX3JlcV9wb29scCwgU0xBQl9LRVJORUwgfCBTTEFCX05PRlMpOworCisJLyogY2xlYXIgdGhlIGZpcnN0IGZldyBoZWFkZXIgYnl0ZXMgKi8KKwkvKiBmb3IgbW9zdCBwYXRocywgbW9yZSBpcyBjbGVhcmVkIGluIGhlYWRlcl9hc3NlbWJsZSAqLworCWlmIChyZXRfYnVmKSB7CisJCW1lbXNldChyZXRfYnVmLCAwLCBzaXplb2Yoc3RydWN0IHNtYl9oZHIpICsgMyk7CisJCWF0b21pY19pbmMoJmJ1ZkFsbG9jQ291bnQpOworCX0KKworCXJldHVybiByZXRfYnVmOworfQorCit2b2lkCitjaWZzX2J1Zl9yZWxlYXNlKHZvaWQgKmJ1Zl90b19mcmVlKQoreworCisJaWYgKGJ1Zl90b19mcmVlID09IE5VTEwpIHsKKwkJLyogY0ZZSSgxLCAoIk51bGwgYnVmZmVyIHBhc3NlZCB0byBjaWZzX2J1Zl9yZWxlYXNlIikpOyovCisJCXJldHVybjsKKwl9CisJbWVtcG9vbF9mcmVlKGJ1Zl90b19mcmVlLGNpZnNfcmVxX3Bvb2xwKTsKKworCWF0b21pY19kZWMoJmJ1ZkFsbG9jQ291bnQpOworCXJldHVybjsKK30KKworc3RydWN0IHNtYl9oZHIgKgorY2lmc19zbWFsbF9idWZfZ2V0KHZvaWQpCit7CisJc3RydWN0IHNtYl9oZHIgKnJldF9idWYgPSBOVUxMOworCisvKiBXZSBjb3VsZCB1c2UgbmVnb3RpYXRlZCBzaXplIGluc3RlYWQgb2YgbWF4X21zZ3NpemUgLSAKKyAgIGJ1dCBpdCBtYXkgYmUgbW9yZSBlZmZpY2llbnQgdG8gYWx3YXlzIGFsbG9jIHNhbWUgc2l6ZSAKKyAgIGFsYmVpdCBzbGlnaHRseSBsYXJnZXIgdGhhbiBuZWNlc3NhcnkgYW5kIG1heGJ1ZmZlcnNpemUgCisgICBkZWZhdWx0cyB0byB0aGlzIGFuZCBjYW4gbm90IGJlIGJpZ2dlciAqLworCXJldF9idWYgPQorCSAgICAoc3RydWN0IHNtYl9oZHIgKikgbWVtcG9vbF9hbGxvYyhjaWZzX3NtX3JlcV9wb29scCwgU0xBQl9LRVJORUwgfCBTTEFCX05PRlMpOworCWlmIChyZXRfYnVmKSB7CisJLyogTm8gbmVlZCB0byBjbGVhciBtZW1vcnkgaGVyZSwgY2xlYXJlZCBpbiBoZWFkZXIgYXNzZW1ibGUgKi8KKwkvKgltZW1zZXQocmV0X2J1ZiwgMCwgc2l6ZW9mKHN0cnVjdCBzbWJfaGRyKSArIDI3KTsqLworCQlhdG9taWNfaW5jKCZzbUJ1ZkFsbG9jQ291bnQpOworCX0KKwlyZXR1cm4gcmV0X2J1ZjsKK30KKwordm9pZAorY2lmc19zbWFsbF9idWZfcmVsZWFzZSh2b2lkICpidWZfdG9fZnJlZSkKK3sKKworCWlmIChidWZfdG9fZnJlZSA9PSBOVUxMKSB7CisJCWNGWUkoMSwgKCJOdWxsIGJ1ZmZlciBwYXNzZWQgdG8gY2lmc19zbWFsbF9idWZfcmVsZWFzZSIpKTsKKwkJcmV0dXJuOworCX0KKwltZW1wb29sX2ZyZWUoYnVmX3RvX2ZyZWUsY2lmc19zbV9yZXFfcG9vbHApOworCisJYXRvbWljX2RlYygmc21CdWZBbGxvY0NvdW50KTsKKwlyZXR1cm47Cit9CisKK3ZvaWQKK2hlYWRlcl9hc3NlbWJsZShzdHJ1Y3Qgc21iX2hkciAqYnVmZmVyLCBjaGFyIHNtYl9jb21tYW5kIC8qIGNvbW1hbmQgKi8gLAorCQljb25zdCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICp0cmVlQ29uLCBpbnQgd29yZF9jb3VudAorCQkvKiBsZW5ndGggb2YgZml4ZWQgc2VjdGlvbiAod29yZCBjb3VudCkgaW4gdHdvIGJ5dGUgdW5pdHMgICovKQoreworCXN0cnVjdCBsaXN0X2hlYWQqIHRlbXBfaXRlbTsKKwlzdHJ1Y3QgY2lmc1Nlc0luZm8gKiBzZXM7CisJY2hhciAqdGVtcCA9IChjaGFyICopIGJ1ZmZlcjsKKworCW1lbXNldCh0ZW1wLDAsTUFYX0NJRlNfSERSX1NJWkUpOworCisJYnVmZmVyLT5zbWJfYnVmX2xlbmd0aCA9CisJICAgICgyICogd29yZF9jb3VudCkgKyBzaXplb2YgKHN0cnVjdCBzbWJfaGRyKSAtCisJICAgIDQgLyogIFJGQyAxMDAxIGxlbmd0aCBmaWVsZCBkb2VzIG5vdCBjb3VudCAqLyAgKworCSAgICAyIC8qIGZvciBiY2MgZmllbGQgaXRzZWxmICovIDsKKwkvKiBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgb25seSBuZXR3b3JrIGZpZWxkIHRoYXQgaGFzIHRvIGJlIGNvbnZlcnRlZCB0byBiaWcgZW5kaWFuIGFuZCBpdCBpcyBkb25lIGp1c3QgYmVmb3JlIHdlIHNlbmQgaXQgKi8KKworCWJ1ZmZlci0+UHJvdG9jb2xbMF0gPSAweEZGOworCWJ1ZmZlci0+UHJvdG9jb2xbMV0gPSAnUyc7CisJYnVmZmVyLT5Qcm90b2NvbFsyXSA9ICdNJzsKKwlidWZmZXItPlByb3RvY29sWzNdID0gJ0InOworCWJ1ZmZlci0+Q29tbWFuZCA9IHNtYl9jb21tYW5kOworCWJ1ZmZlci0+RmxhZ3MgPSAweDAwOwkvKiBjYXNlIHNlbnNpdGl2ZSAqLworCWJ1ZmZlci0+RmxhZ3MyID0gU01CRkxHMl9LTk9XU19MT05HX05BTUVTOworCWJ1ZmZlci0+UGlkID0gY3B1X3RvX2xlMTYoKF9fdTE2KWN1cnJlbnQtPnRnaWQpOworCWJ1ZmZlci0+UGlkSGlnaCA9IGNwdV90b19sZTE2KChfX3UxNikoY3VycmVudC0+dGdpZCA+PiAxNikpOworCXNwaW5fbG9jaygmR2xvYmFsTWlkX0xvY2spOworCUdsb2JhbE1pZCsrOworCWJ1ZmZlci0+TWlkID0gR2xvYmFsTWlkOworCXNwaW5fdW5sb2NrKCZHbG9iYWxNaWRfTG9jayk7CisJaWYgKHRyZWVDb24pIHsKKwkJYnVmZmVyLT5UaWQgPSB0cmVlQ29uLT50aWQ7CisJCWlmICh0cmVlQ29uLT5zZXMpIHsKKwkJCWlmICh0cmVlQ29uLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9VTklDT0RFKQorCQkJCWJ1ZmZlci0+RmxhZ3MyIHw9IFNNQkZMRzJfVU5JQ09ERTsKKwkJCWlmICh0cmVlQ29uLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9TVEFUVVMzMikgeworCQkJCWJ1ZmZlci0+RmxhZ3MyIHw9IFNNQkZMRzJfRVJSX1NUQVRVUzsKKwkJCX0KKworCQkJYnVmZmVyLT5VaWQgPSB0cmVlQ29uLT5zZXMtPlN1aWQ7CS8qIGFsd2F5cyBpbiBMRSBmb3JtYXQgKi8KKwkJCWlmKG11bHRpdXNlcl9tb3VudCAhPSAwKSB7CisJCS8qIEZvciB0aGUgbXVsdGl1c2VyIGNhc2UsIHRoZXJlIGFyZSBmZXcgb2J2aW91cyB0ZWNobmljYWxseSAgKi8KKwkJLyogcG9zc2libGUgbWVjaGFuaXNtcyB0byBtYXRjaCB0aGUgbG9jYWwgbGludXggdXNlciAodWlkKSAgICAqLworCQkvKiB0byBhIHZhbGlkIHJlbW90ZSBzbWIgdXNlciAoc21iX3VpZCk6CQkgICAgICAqLworCQkvKiAJMSkgUXVlcnkgV2luYmluZCAob3Igb3RoZXIgbG9jYWwgcGFtL25zcyBkYWVtb24gICAgICAgKi8KKwkJLyogCSAgZm9yIHVzZXJpZC9wYXNzd29yZC9sb2dvbl9kb21haW4gb3IgY3JlZGVudGlhbCAgICAgICovCisJCS8qICAgICAgMikgUXVlcnkgV2luYmluZCBmb3IgdWlkIHRvIHNpZCB0byB1c2VybmFtZSBtYXBwaW5nICAgKi8KKwkJLyogCSAgIGFuZCBzZWUgaWYgd2UgaGF2ZSBhIG1hdGNoaW5nIHBhc3N3b3JkIGZvciBleGlzdGluZyovCisJCS8qICAgICAgICAgc2Vzc2lvbiBmb3IgdGhhdCB1c2VyIHBlcmhhcyBnZXR0aW5nIHBhc3N3b3JkIGJ5ICAgKi8KKwkJLyogICAgICAgICBhZGRpbmcgYSBuZXcgcGFtX2NpZnMgbW9kdWxlIHRoYXQgc3RvcmVzIHBhc3N3b3JkcyAqLworCQkvKiAgICAgICAgIHNvIHRoYXQgdGhlIGNpZnMgdmZzIGNhbiBnZXQgYXQgdGhhdCBmb3IgYWxsIGxvZ2dlZCovCisJCS8qCSAgIG9uIHVzZXJzCQkJCQkgICAgICAqLworCQkvKgkzKSAoV2hpY2ggaXMgdGhlIG1lY2hhbmlzbSB3ZSBoYXZlIGNob3NlbikJICAgICAgKi8KKwkJLyoJICAgU2VhcmNoIHRocm91Z2ggc2Vzc2lvbnMgdG8gdGhlIHNhbWUgc2VydmVyIGZvciBhICAgKi8KKwkJLyoJICAgYSBtYXRjaCBvbiB0aGUgdWlkIHRoYXQgd2FzIHBhc3NlZCBpbiBvbiBtb3VudCAgICAgKi8KKwkJLyogICAgICAgICB3aXRoIHRoZSBjdXJyZW50IHByb2Nlc3NlcyB1aWQgKG9yIGV1aWQ/KSBhbmQgdXNlICAqLworCQkvKiAJICAgdGhhdCBzbWIgdWlkLiAgIElmIG5vIGV4aXN0aW5nIHNtYiBzZXNzaW9uIGZvciAgICAgKi8KKwkJLyogCSAgIHRoYXQgdWlkIGZvdW5kLCB1c2UgdGhlIGRlZmF1bHQgc21iIHNlc3Npb24gaWUgICAgICovCisJCS8qICAgICAgICAgdGhlIHNtYiBzZXNzaW9uIGZvciB0aGUgdm9sdW1lIG1vdW50ZWQgd2hpY2ggaXMgICAgKi8KKwkJLyogCSAgIHRoZSBzYW1lIGFzIHdvdWxkIGJlIHVzZWQgaWYgdGhlIG11bHRpdXNlciBtb3VudCAgICovCisJCS8qIAkgICBmbGFnIHdlcmUgZGlzYWJsZWQuICAqLworCisJCS8qICBCQiBBZGQgc3VwcG9ydCBmb3IgZXN0YWJsaXNoaW5nIG5ldyB0Q29uIGFuZCBTTUIgU2Vzc2lvbiAgKi8KKwkJLyogICAgICB3aXRoIHVzZXJpZC9wYXNzd29yZCBwYWlycyBmb3VuZCBvbiB0aGUgc21iIHNlc3Npb24gICAqLyAKKwkJLyoJZm9yIG90aGVyIHRhcmdldCB0Y3AvaXAgYWRkcmVzc2VzIAkJQkIgICAgKi8KKwkJCQlpZihjdXJyZW50LT51aWQgIT0gdHJlZUNvbi0+c2VzLT5saW51eF91aWQpIHsKKwkJCQkJY0ZZSSgxLCgiTXVsdGl1c2VyIG1vZGUgYW5kIFVJRCBkaWQgbm90IG1hdGNoIHRjb24gdWlkICIpKTsKKwkJCQkJcmVhZF9sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKwkJCQkJbGlzdF9mb3JfZWFjaCh0ZW1wX2l0ZW0sICZHbG9iYWxTTUJTZXNzaW9uTGlzdCkgeworCQkJCQkJc2VzID0gbGlzdF9lbnRyeSh0ZW1wX2l0ZW0sIHN0cnVjdCBjaWZzU2VzSW5mbywgY2lmc1Nlc3Npb25MaXN0KTsKKwkJCQkJCWlmKHNlcy0+bGludXhfdWlkID09IGN1cnJlbnQtPnVpZCkgeworCQkJCQkJCWlmKHNlcy0+c2VydmVyID09IHRyZWVDb24tPnNlcy0+c2VydmVyKSB7CisJCQkJCQkJCWNGWUkoMSwoImZvdW5kIG1hdGNoaW5nIHVpZCBzdWJzdGl0dXRlIHJpZ2h0IHNtYl91aWQiKSk7ICAKKwkJCQkJCQkJYnVmZmVyLT5VaWQgPSBzZXMtPlN1aWQ7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCS8qIEJCIGV2ZW50dWFsbHkgY2FsbCBjaWZzX3NldHVwX3Nlc3Npb24gaGVyZSAqLworCQkJCQkJCQljRllJKDEsKCJsb2NhbCBVSUQgZm91bmQgYnV0IHNtYiBzZXNzIHdpdGggdGhpcyBzZXJ2ZXIgZG9lcyBub3QgZXhpc3QiKSk7ICAKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJcmVhZF91bmxvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAodHJlZUNvbi0+RmxhZ3MgJiBTTUJfU0hBUkVfSVNfSU5fREZTKQorCQkJYnVmZmVyLT5GbGFnczIgfD0gU01CRkxHMl9ERlM7CisJCWlmKCh0cmVlQ29uLT5zZXMpICYmICh0cmVlQ29uLT5zZXMtPnNlcnZlcikpCisJCQlpZih0cmVlQ29uLT5zZXMtPnNlcnZlci0+c2VjTW9kZSAmIAorCQkJICAoU0VDTU9ERV9TSUdOX1JFUVVJUkVEIHwgU0VDTU9ERV9TSUdOX0VOQUJMRUQpKQorCQkJCWJ1ZmZlci0+RmxhZ3MyIHw9IFNNQkZMRzJfU0VDVVJJVFlfU0lHTkFUVVJFOworCX0KKworLyogIGVuZGlhbiBjb252ZXJzaW9uIG9mIGZsYWdzIGlzIG5vdyBkb25lIGp1c3QgYmVmb3JlIHNlbmRpbmcgKi8KKwlidWZmZXItPldvcmRDb3VudCA9IChjaGFyKSB3b3JkX2NvdW50OworCXJldHVybjsKK30KKworaW50CitjaGVja1NNQmhkcihzdHJ1Y3Qgc21iX2hkciAqc21iLCBfX3UxNiBtaWQpCit7CisJLyogTWFrZSBzdXJlIHRoYXQgdGhpcyByZWFsbHkgaXMgYW4gU01CLCB0aGF0IGl0IGlzIGEgcmVzcG9uc2UsIAorCSAgIGFuZCB0aGF0IHRoZSBtZXNzYWdlIGlkcyBtYXRjaCAqLworCWlmICgoKihfX2xlMzIgKikgc21iLT5Qcm90b2NvbCA9PSBjcHVfdG9fbGUzMigweDQyNGQ1M2ZmKSkgJiYgCisJCShtaWQgPT0gc21iLT5NaWQpKSB7ICAgIAorCQlpZihzbWItPkZsYWdzICYgU01CRkxHX1JFU1BPTlNFKQorCQkJcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAKKwkJZWxzZSB7ICAgICAgICAKKwkJLyogb25seSBvbmUgdmFsaWQgY2FzZSB3aGVyZSBzZXJ2ZXIgc2VuZHMgdXMgcmVxdWVzdCAqLworCQkJaWYoc21iLT5Db21tYW5kID09IFNNQl9DT01fTE9DS0lOR19BTkRYKQorCQkJCXJldHVybiAwOworCQkJZWxzZQorCQkJCWNFUlJPUigxLCAoIlJjdmQgUmVxdWVzdCBub3QgcmVzcG9uc2UgIikpOyAgICAgICAgIAorCQl9CisJfSBlbHNlIHsgLyogYmFkIHNpZ25hdHVyZSBvciBtaWQgKi8KKwkJaWYgKCooX19sZTMyICopIHNtYi0+UHJvdG9jb2wgIT0gY3B1X3RvX2xlMzIoMHg0MjRkNTNmZikpCisJCQljRVJST1IoMSwKKwkJCSAgICAgICAoIkJhZCBwcm90b2NvbCBzdHJpbmcgc2lnbmF0dXJlIGhlYWRlciAleCAiLAorCQkJCSoodW5zaWduZWQgaW50ICopIHNtYi0+UHJvdG9jb2wpKTsKKwkJaWYgKG1pZCAhPSBzbWItPk1pZCkKKwkJCWNFUlJPUigxLCAoIk1pZHMgZG8gbm90IG1hdGNoIikpOworCX0KKwljRVJST1IoMSwgKCJiYWQgc21iIGRldGVjdGVkLiBUaGUgTWlkPSVkIiwgc21iLT5NaWQpKTsKKwlyZXR1cm4gMTsKK30KKworaW50CitjaGVja1NNQihzdHJ1Y3Qgc21iX2hkciAqc21iLCBfX3UxNiBtaWQsIGludCBsZW5ndGgpCit7CisJX191MzIgbGVuID0gYmUzMl90b19jcHUoc21iLT5zbWJfYnVmX2xlbmd0aCk7CisJY0ZZSSgwLAorCSAgICAgKCJFbnRlcmluZyBjaGVja1NNQiB3aXRoIExlbmd0aDogJXgsIHNtYl9idWZfbGVuZ3RoOiAleCAiLAorCSAgICAgIGxlbmd0aCwgbGVuKSk7CisJaWYgKCgodW5zaWduZWQgaW50KWxlbmd0aCA8IDIgKyBzaXplb2YgKHN0cnVjdCBzbWJfaGRyKSkgfHwKKwkgICAgKGxlbiA+IENJRlNNYXhCdWZTaXplICsgTUFYX0NJRlNfSERSX1NJWkUgLSA0KSkgeworCQlpZiAoKHVuc2lnbmVkIGludClsZW5ndGggPCAyICsgc2l6ZW9mIChzdHJ1Y3Qgc21iX2hkcikpIHsKKwkJCWlmICgoKHVuc2lnbmVkIGludClsZW5ndGggPj0gCisJCQkJc2l6ZW9mIChzdHJ1Y3Qgc21iX2hkcikgLSAxKQorCQkJICAgICYmIChzbWItPlN0YXR1cy5DaWZzRXJyb3IgIT0gMCkpIHsKKwkJCQlzbWItPldvcmRDb3VudCA9IDA7CisJCQkJcmV0dXJuIDA7CS8qIHNvbWUgZXJyb3IgY2FzZXMgZG8gbm90IHJldHVybiB3Y3QgYW5kIGJjYyAqLworCQkJfSBlbHNlIHsKKwkJCQljRVJST1IoMSwgKCJMZW5ndGggbGVzcyB0aGFuIHNtYiBoZWFkZXIgc2l6ZSIpKTsKKwkJCX0KKworCQl9CisJCWlmIChsZW4gPiBDSUZTTWF4QnVmU2l6ZSArIE1BWF9DSUZTX0hEUl9TSVpFIC0gNCkKKwkJCWNFUlJPUigxLAorCQkJICAgICAgICgic21iX2J1Zl9sZW5ndGggZ3JlYXRlciB0aGFuIE1heEJ1ZlNpemUiKSk7CisJCWNFUlJPUigxLAorCQkgICAgICAgKCJiYWQgc21iIGRldGVjdGVkLiBJbGxlZ2FsIGxlbmd0aC4gVGhlIG1pZD0lZCIsCisJCQlzbWItPk1pZCkpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoY2hlY2tTTUJoZHIoc21iLCBtaWQpKQorCQlyZXR1cm4gMTsKKworCWlmICgoNCArIGxlbiAhPSBzbWJDYWxjU2l6ZShzbWIpKQorCSAgICB8fCAoNCArIGxlbiAhPSAodW5zaWduZWQgaW50KWxlbmd0aCkpIHsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJY0VSUk9SKDEsICgic21iQ2FsY1NpemUgJXggIiwgc21iQ2FsY1NpemUoc21iKSkpOworCQljRVJST1IoMSwKKwkJICAgICAgICgiYmFkIHNtYiBzaXplIGRldGVjdGVkLiBUaGUgTWlkPSVkIiwgc21iLT5NaWQpKTsKKwkJcmV0dXJuIDE7CisJfQorfQoraW50Citpc192YWxpZF9vcGxvY2tfYnJlYWsoc3RydWN0IHNtYl9oZHIgKmJ1ZikKK3sgICAgCisJc3RydWN0IHNtYl9jb21fbG9ja19yZXEgKiBwU01CID0gKHN0cnVjdCBzbWJfY29tX2xvY2tfcmVxICopYnVmOworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXAxOworCXN0cnVjdCBjaWZzVGNvbkluZm8gKnRjb247CisJc3RydWN0IGNpZnNGaWxlSW5mbyAqbmV0ZmlsZTsKKworCWNGWUkoMSwoIkNoZWNraW5nIGZvciBvcGxvY2sgYnJlYWsgb3IgZG5vdGlmeSByZXNwb25zZSIpKTsKKwlpZigocFNNQi0+aGRyLkNvbW1hbmQgPT0gU01CX0NPTV9OVF9UUkFOU0FDVCkgJiYKKwkgICAocFNNQi0+aGRyLkZsYWdzICYgU01CRkxHX1JFU1BPTlNFKSkgeworCQlzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbl9jaGFuZ2Vfbm90aWZ5X3JzcCAqIHBTTUJyID0KKwkJCShzdHJ1Y3Qgc21iX2NvbV90cmFuc2FjdGlvbl9jaGFuZ2Vfbm90aWZ5X3JzcCAqKWJ1ZjsKKwkJc3RydWN0IGZpbGVfbm90aWZ5X2luZm9ybWF0aW9uICogcG5vdGlmeTsKKwkJX191MzIgZGF0YV9vZmZzZXQgPSAwOworCQlpZihwU01Cci0+Qnl0ZUNvdW50ID4gc2l6ZW9mKHN0cnVjdCBmaWxlX25vdGlmeV9pbmZvcm1hdGlvbikpIHsKKwkJCWRhdGFfb2Zmc2V0ID0gbGUzMl90b19jcHUocFNNQnItPkRhdGFPZmZzZXQpOworCisJCQlwbm90aWZ5ID0gKHN0cnVjdCBmaWxlX25vdGlmeV9pbmZvcm1hdGlvbiAqKSgoY2hhciAqKSZwU01Cci0+aGRyLlByb3RvY29sCisJCQkJKyBkYXRhX29mZnNldCk7CisJCQljRllJKDEsKCJkbm90aWZ5IG9uICVzIHdpdGggYWN0aW9uOiAweCV4Iixwbm90aWZ5LT5GaWxlTmFtZSwKKwkJCQlwbm90aWZ5LT5BY3Rpb24pKTsgIC8qIEJCIHJlbW92ZW1lIEJCICovCisJICAgICAgICAgICAgIC8qICAgY2lmc19kdW1wX21lbSgiUmVjZWl2ZWQgbm90aWZ5IERhdGEgaXM6ICIsYnVmLHNpemVvZihzdHJ1Y3Qgc21iX2hkcikrNjApOyAqLworCQkJcmV0dXJuIFRSVUU7CisJCX0KKwkJaWYocFNNQnItPmhkci5TdGF0dXMuQ2lmc0Vycm9yKSB7CisJCQljRllJKDEsKCJub3RpZnkgZXJyIDB4JWQiLHBTTUJyLT5oZHIuU3RhdHVzLkNpZnNFcnJvcikpOworCQkJcmV0dXJuIFRSVUU7CisJCX0KKwkJcmV0dXJuIEZBTFNFOworCX0gIAorCWlmKHBTTUItPmhkci5Db21tYW5kICE9IFNNQl9DT01fTE9DS0lOR19BTkRYKQorCQlyZXR1cm4gRkFMU0U7CisJaWYocFNNQi0+aGRyLkZsYWdzICYgU01CRkxHX1JFU1BPTlNFKSB7CisJCS8qIG5vIHNlbnNlIGxvZ2dpbmcgZXJyb3Igb24gaW52YWxpZCBoYW5kbGUgb24gb3Bsb2NrCisJCSAgIGJyZWFrIC0gaGFybWxlc3MgcmFjZSBiZXR3ZWVuIGNsb3NlIHJlcXVlc3QgYW5kIG9wbG9jaworCQkgICBicmVhayByZXNwb25zZSBpcyBleHBlY3RlZCBmcm9tIHRpbWUgdG8gdGltZSB3cml0aW5nIG91dAorCQkgICBsYXJnZSBkaXJ0eSBmaWxlcyBjYWNoZWQgb24gdGhlIGNsaWVudCAqLworCQlpZiAoKE5UX1NUQVRVU19JTlZBTElEX0hBTkRMRSkgPT0gCisJCSAgIGxlMzJfdG9fY3B1KHBTTUItPmhkci5TdGF0dXMuQ2lmc0Vycm9yKSkgeyAKKwkJCWNGWUkoMSwoImludmFsaWQgaGFuZGxlIG9uIG9wbG9jayBicmVhayIpKTsKKwkJCXJldHVybiBUUlVFOworCQl9IGVsc2UgaWYgKEVSUmJhZGZpZCA9PSAKKwkJICAgbGUxNl90b19jcHUocFNNQi0+aGRyLlN0YXR1cy5Eb3NFcnJvci5FcnJvcikpIHsKKwkJCXJldHVybiBUUlVFOwkgIAorCQl9IGVsc2UgeworCQkJcmV0dXJuIEZBTFNFOyAvKiBvbiB2YWxpZCBvcGxvY2sgYnJrIHdlIGdldCAicmVxdWVzdCIgKi8KKwkJfQorCX0KKwlpZihwU01CLT5oZHIuV29yZENvdW50ICE9IDgpCisJCXJldHVybiBGQUxTRTsKKworCWNGWUkoMSwoIiBvcGxvY2sgdHlwZSAweCVkIGxldmVsIDB4JWQiLHBTTUItPkxvY2tUeXBlLHBTTUItPk9wbG9ja0xldmVsKSk7CisJaWYoIShwU01CLT5Mb2NrVHlwZSAmIExPQ0tJTkdfQU5EWF9PUExPQ0tfUkVMRUFTRSkpCisJCXJldHVybiBGQUxTRTsgICAgCisKKwkvKiBsb29rIHVwIHRjb24gYmFzZWQgb24gdGlkICYgdWlkICovCisJcmVhZF9sb2NrKCZHbG9iYWxTTUJTZXNsb2NrKTsKKwlsaXN0X2Zvcl9lYWNoKHRtcCwgJkdsb2JhbFRyZWVDb25uZWN0aW9uTGlzdCkgeworCQl0Y29uID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBjaWZzVGNvbkluZm8sIGNpZnNDb25uZWN0aW9uTGlzdCk7CisJCWlmICh0Y29uLT50aWQgPT0gYnVmLT5UaWQpIHsKKyNpZmRlZiBDT05GSUdfQ0lGU19TVEFUUworCQkJYXRvbWljX2luYygmdGNvbi0+bnVtX29wbG9ja19icmtzKTsKKyNlbmRpZgorCQkJbGlzdF9mb3JfZWFjaCh0bXAxLCZ0Y29uLT5vcGVuRmlsZUxpc3QpeworCQkJCW5ldGZpbGUgPSBsaXN0X2VudHJ5KHRtcDEsc3RydWN0IGNpZnNGaWxlSW5mbyx0bGlzdCk7CisJCQkJaWYocFNNQi0+RmlkID09IG5ldGZpbGUtPm5ldGZpZCkgeworCQkJCQlzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqcENpZnNJbm9kZTsKKwkJCQkJcmVhZF91bmxvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCQkJCQljRllJKDEsKCJNYXRjaGluZyBmaWxlIGlkLCBwcm9jZXNzaW5nIG9wbG9jayBicmVhayIpKTsKKwkJCQkJcENpZnNJbm9kZSA9IAorCQkJCQkJQ0lGU19JKG5ldGZpbGUtPnBJbm9kZSk7CisJCQkJCXBDaWZzSW5vZGUtPmNsaWVudENhbkNhY2hlQWxsID0gRkFMU0U7CisJCQkJCWlmKHBTTUItPk9wbG9ja0xldmVsID09IDApCisJCQkJCQlwQ2lmc0lub2RlLT5jbGllbnRDYW5DYWNoZVJlYWQgPSBGQUxTRTsKKwkJCQkJcENpZnNJbm9kZS0+b3Bsb2NrUGVuZGluZyA9IFRSVUU7CisJCQkJCUFsbG9jT3Bsb2NrUUVudHJ5KG5ldGZpbGUtPnBJbm9kZSwgbmV0ZmlsZS0+bmV0ZmlkLCB0Y29uKTsKKwkJCQkJY0ZZSSgxLCgiYWJvdXQgdG8gd2FrZSB1cCBvcGxvY2sgdGhkIikpOworCQkJCQl3YWtlX3VwX3Byb2Nlc3Mob3Bsb2NrVGhyZWFkKTsgICAgICAgICAgICAgICAKKwkJCQkJcmV0dXJuIFRSVUU7CisJCQkJfQorCQkJfQorCQkJcmVhZF91bmxvY2soJkdsb2JhbFNNQlNlc2xvY2spOworCQkJY0ZZSSgxLCgiTm8gbWF0Y2hpbmcgZmlsZSBmb3Igb3Bsb2NrIGJyZWFrIG9uIGNvbm5lY3Rpb24iKSk7CisJCQlyZXR1cm4gVFJVRTsKKwkJfQorCX0KKwlyZWFkX3VubG9jaygmR2xvYmFsU01CU2VzbG9jayk7CisJY0ZZSSgxLCgiQ2FuIG5vdCBwcm9jZXNzIG9wbG9jayBicmVhayBmb3Igbm9uLWV4aXN0ZW50IGNvbm5lY3Rpb24iKSk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQKK2R1bXBfc21iKHN0cnVjdCBzbWJfaGRyICpzbWJfYnVmLCBpbnQgc21iX2J1Zl9sZW5ndGgpCit7CisJaW50IGksIGo7CisJY2hhciBkZWJ1Z19saW5lWzE3XTsKKwl1bnNpZ25lZCBjaGFyICpidWZmZXI7CisKKwlpZiAodHJhY2VTTUIgPT0gMCkKKwkJcmV0dXJuOworCisJYnVmZmVyID0gKHVuc2lnbmVkIGNoYXIgKikgc21iX2J1ZjsKKwlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IHNtYl9idWZfbGVuZ3RoOyBpKyssIGorKykgeworCQlpZiAoaSAlIDggPT0gMCkgewkvKiB3ZSBoYXZlIHJlYWNoZWQgdGhlIGJlZ2lubmluZyBvZiBsaW5lICAqLworCQkJcHJpbnRrKEtFUk5fREVCVUcgInwgIik7CisJCQlqID0gMDsKKwkJfQorCQlwcmludGsoIiUwIzR4ICIsIGJ1ZmZlcltpXSk7CisJCWRlYnVnX2xpbmVbMiAqIGpdID0gJyAnOworCQlpZiAoaXNwcmludChidWZmZXJbaV0pKQorCQkJZGVidWdfbGluZVsxICsgKDIgKiBqKV0gPSBidWZmZXJbaV07CisJCWVsc2UKKwkJCWRlYnVnX2xpbmVbMSArICgyICogaildID0gJ18nOworCisJCWlmIChpICUgOCA9PSA3KSB7CS8qIHdlIGhhdmUgcmVhY2hlZCBlbmQgb2YgbGluZSwgdGltZSB0byBwcmludCBhc2NpaSAqLworCQkJZGVidWdfbGluZVsxNl0gPSAwOworCQkJcHJpbnRrKCIgfCAlc1xuIiwgZGVidWdfbGluZSk7CisJCX0KKwl9CisJZm9yICg7IGogPCA4OyBqKyspIHsKKwkJcHJpbnRrKCIgICAgICIpOworCQlkZWJ1Z19saW5lWzIgKiBqXSA9ICcgJzsKKwkJZGVidWdfbGluZVsxICsgKDIgKiBqKV0gPSAnICc7CisJfQorCXByaW50ayggIiB8ICVzXG4iLCBkZWJ1Z19saW5lKTsKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9mcy9jaWZzL25ldG1pc2MuYyBiL2ZzL2NpZnMvbmV0bWlzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMzRjODkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jaWZzL25ldG1pc2MuYwpAQCAtMCwwICsxLDkwNCBAQAorLyoKKyAqICAgZnMvY2lmcy9uZXRtaXNjLmMKKyAqCisgKiAgIENvcHlyaWdodCAoYykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyAgQ29ycC4sIDIwMDIKKyAqICAgQXV0aG9yKHMpOiBTdGV2ZSBGcmVuY2ggKHNmcmVuY2hAdXMuaWJtLmNvbSkKKyAqIAorICogICBFcnJvciBtYXBwaW5nIHJvdXRpbmVzIGZyb20gU2FtYmEgbGlic21iL2Vycm9ybWFwLmMKKyAqICAgQ29weXJpZ2h0IChDKSBBbmRyZXcgVHJpZGdlbGwgMjAwMQorICoKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgImNpZnNmcy5oIgorI2luY2x1ZGUgImNpZnNwZHUuaCIKKyNpbmNsdWRlICJjaWZzZ2xvYi5oIgorI2luY2x1ZGUgImNpZnNwcm90by5oIgorI2luY2x1ZGUgInNtYmVyci5oIgorI2luY2x1ZGUgImNpZnNfZGVidWcuaCIKKyNpbmNsdWRlICJudGVyci5oIgorCitzdHJ1Y3Qgc21iX3RvX3Bvc2l4X2Vycm9yIHsKKwlfX3UxNiBzbWJfZXJyOworCWludCBwb3NpeF9jb2RlOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbWJfdG9fcG9zaXhfZXJyb3IgbWFwcGluZ190YWJsZV9FUlJET1NbXSA9IHsKKwl7RVJSYmFkZnVuYywgLUVJTlZBTH0sCisJe0VSUmJhZGZpbGUsIC1FTk9FTlR9LAorCXtFUlJiYWRwYXRoLCAtRU5PVERJUn0sCisJe0VSUm5vZmlkcywgLUVNRklMRX0sCisJe0VSUm5vYWNjZXNzLCAtRUFDQ0VTfSwKKwl7RVJSYmFkZmlkLCAtRUJBREZ9LAorCXtFUlJiYWRtY2IsIC1FSU99LAorCXtFUlJub21lbSwgLUVOT01FTX0sCisJe0VSUmJhZG1lbSwgLUVGQVVMVH0sCisJe0VSUmJhZGVudiwgLUVGQVVMVH0sCisJe0VSUmJhZGZvcm1hdCwgLUVJTlZBTH0sCisJe0VSUmJhZGFjY2VzcywgLUVBQ0NFU30sCisJe0VSUmJhZGRhdGEsIC1FSU99LAorCXtFUlJiYWRkcml2ZSwgLUVOWElPfSwKKwl7RVJScmVtY2QsIC1FQUNDRVN9LAorCXtFUlJkaWZmZGV2aWNlLCAtRVhERVZ9LAorCXtFUlJub2ZpbGVzLCAtRU5PRU5UfSwKKwl7RVJSYmFkc2hhcmUsIC1FVFhUQlNZfSwKKwl7RVJSbG9jaywgLUVBQ0NFU30sCisJe0VSUnVuc3VwLCAtRUlOVkFMfSwKKwl7RVJSbm9zdWNoc2hhcmUsLUVOWElPfSwKKwl7RVJSZmlsZXhpc3RzLCAtRUVYSVNUfSwKKwl7RVJSaW52cGFybSwgLUVJTlZBTH0sCisJe0VSUmRpc2tmdWxsLCAtRU5PU1BDfSwKKwl7RVJSaW52bmFtZSwgLUVOT0VOVH0sCisJe0VSUmludmxldmVsLC1FT1BOT1RTVVBQfSwKKwl7RVJSZGlybm90ZW1wdHksIC1FTk9URU1QVFl9LAorCXtFUlJub3Rsb2NrZWQsIC1FTk9MQ0t9LAorCXtFUlJhbHJlYWR5ZXhpc3RzLCAtRUVYSVNUfSwKKwl7RVJSbW9yZWRhdGEsIC1FT1ZFUkZMT1d9LAorCXtFUlJlYXNub3RzdXBwb3J0ZWQsLUVPUE5PVFNVUFB9LAorCXtFcnJRdW90YSwgLUVEUVVPVH0sCisJe0Vyck5vdEFMaW5rLCAtRU5PTElOS30sCisJe0VSUm5ldGxvZ29uTm90U3RhcnRlZCwtRU5PUFJPVE9PUFR9LAorCXswLCAwfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbWJfdG9fcG9zaXhfZXJyb3IgbWFwcGluZ190YWJsZV9FUlJTUlZbXSA9IHsKKwl7RVJSZXJyb3IsIC1FSU99LAorCXtFUlJiYWRwdywgLUVQRVJNfSwKKwl7RVJSYmFkdHlwZSwgLUVSRU1PVEV9LAorCXtFUlJhY2Nlc3MsIC1FQUNDRVN9LAorCXtFUlJpbnZ0aWQsIC1FTlhJT30sCisJe0VSUmludm5ldG5hbWUsIC1FTk9ERVZ9LAorCXtFUlJpbnZkZXZpY2UsIC1FTlhJT30sCisJe0VSUnFmdWxsLCAtRU5PU1BDfSwKKwl7RVJScXRvb2JpZywgLUVOT1NQQ30sCisJe0VSUnFlb2YsIC1FSU99LAorCXtFUlJpbnZwZmlkLCAtRUJBREZ9LAorCXtFUlJzbWJjbWQsIC1FQkFEUlFDfSwKKwl7RVJSc3J2ZXJyb3IsIC1FSU99LAorCXtFUlJiYWRCSUQsIC1FSU99LAorCXtFUlJmaWxlc3BlY3MsIC1FSU5WQUx9LAorCXtFUlJiYWRMaW5rLCAtRUlPfSwKKwl7RVJSYmFkcGVybWl0cywgLUVJTlZBTH0sCisJe0VSUmJhZFBJRCwgLUVTUkNIfSwKKwl7RVJSc2V0YXR0cm1vZGUsIC1FSU5WQUx9LAorCXtFUlJwYXVzZWQsIC1FSE9TVERPV059LAorCXtFUlJtc2dvZmYsIC1FSE9TVERPV059LAorCXtFUlJub3Jvb20sIC1FTk9TUEN9LAorCXtFUlJybXVucywgLUVVU0VSU30sCisJe0VSUnRpbWVvdXQsIC1FVElNRX0sCisJe0VSUm5vcmVzb3VyY2UsIC1FTk9CVUZTfSwKKwl7RVJSdG9vbWFueXVpZHMsIC1FVVNFUlN9LAorCXtFUlJiYWR1aWQsIC1FQUNDRVN9LAorCXtFUlJ1c2VtcHgsIC1FSU99LAorCXtFUlJ1c2VzdGQsIC1FSU99LAorCXtFUlJfTk9USUZZX0VOVU1fRElSLCAtRU5PQlVGU30sCisJe0VSUmFjY291bnRleHBpcmVkLCAtRUFDQ0VTfSwKKwl7RVJSYmFkY2xpZW50LCAtRUFDQ0VTfSwKKwl7RVJSYmFkTG9nb25UaW1lLCAtRUFDQ0VTfSwKKwl7RVJScGFzc3dvcmRFeHBpcmVkLCAtRUFDQ0VTfSwKKwl7RVJSbm9zdXBwb3J0LCAtRUlOVkFMfSwKKwl7MCwgMH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc21iX3RvX3Bvc2l4X2Vycm9yIG1hcHBpbmdfdGFibGVfRVJSSFJEW10gPSB7CisJezAsIDB9Cit9OworCisvKiBDb252ZXJ0IHN0cmluZyBjb250YWluaW5nIGRvdHRlZCBpcCBhZGRyZXNzIHRvIGJpbmFyeSBmb3JtICovCisvKiByZXR1cm5zIDAgaWYgaW52YWxpZCBhZGRyZXNzICovCisKKy8qIEJCIGFkZCBhZGRyZXNzIGZhbWlseSwgY2hhbmdlIHJjIHRvIHN0YXR1cyBmbGFnIGFuZCByZXR1cm4gdW5pb24gb3IgZm9yIGlwdjYgKi8KKy8qICB3aWxsIG5lZWQgcGFyZW50IHRvIGNhbGwgc29tZXRoaW5nIGxpa2UgaW5ldF9wdG9uIHRvIGNvbnZlcnQgaXB2NiBhZGRyZXNzICBCQiAqLworaW50CitjaWZzX2luZXRfcHRvbihpbnQgYWRkcmVzc19mYW1pbHksIGNoYXIgKmNwLHZvaWQgKmRzdCkKK3sKKwlzdHJ1Y3QgaW5fYWRkciBhZGRyZXNzOworCWludCB2YWx1ZTsKKwlpbnQgZGlnaXQ7CisJaW50IGk7CisJY2hhciB0ZW1wOworCWNoYXIgYnl0ZXNbNF07CisJY2hhciAqZW5kID0gYnl0ZXM7CisJc3RhdGljIGNvbnN0IGludCBhZGRyX2NsYXNzX21heFs0XSA9CisJICAgIHsgMHhmZmZmZmZmZiwgMHhmZmZmZmYsIDB4ZmZmZiwgMHhmZiB9OworCisJaWYoYWRkcmVzc19mYW1pbHkgIT0gQUZfSU5FVCkKKwkJcmV0dXJuIC1FQUZOT1NVUFBPUlQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWJ5dGVzW2ldID0gMDsKKwl9CisKKwl0ZW1wID0gKmNwOworCisJd2hpbGUgKFRSVUUpIHsKKwkJaWYgKCFpc2RpZ2l0KHRlbXApKQorCQkJcmV0dXJuIDA7CisKKwkJdmFsdWUgPSAwOworCQlkaWdpdCA9IDA7CisJCWZvciAoOzspIHsKKwkJCWlmIChpc2FzY2lpKHRlbXApICYmIGlzZGlnaXQodGVtcCkpIHsKKwkJCQl2YWx1ZSA9ICh2YWx1ZSAqIDEwKSArIHRlbXAgLSAnMCc7CisJCQkJdGVtcCA9ICorK2NwOworCQkJCWRpZ2l0ID0gMTsKKwkJCX0gZWxzZQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKHRlbXAgPT0gJy4nKSB7CisJCQlpZiAoKGVuZCA+IGJ5dGVzICsgMikgfHwgKHZhbHVlID4gMjU1KSkKKwkJCQlyZXR1cm4gMDsKKwkJCSplbmQrKyA9IHZhbHVlOworCQkJdGVtcCA9ICorK2NwOworCQl9IGVsc2UgaWYgKHRlbXAgPT0gJzonKSB7CisJCQljRllJKDEsKCJJUHY2IGFkZHJlc3NlcyBub3Qgc3VwcG9ydGVkIGZvciBDSUZTIG1vdW50cyB5ZXQiKSk7CisJCQlyZXR1cm4gLTE7CisJCX0gZWxzZQorCQkJYnJlYWs7CisJfQorCisJLyogY2hlY2sgZm9yIGxhc3QgY2hhcmFjdGVycyAqLworCWlmICh0ZW1wICE9ICdcMCcgJiYgKCFpc2FzY2lpKHRlbXApIHx8ICFpc3NwYWNlKHRlbXApKSkKKwkJaWYgKHRlbXAgIT0gJ1xcJykgeworCQkJaWYgKHRlbXAgIT0gJy8nKQorCQkJCXJldHVybiAwOworCQkJZWxzZQorCQkJCSgqY3AgPSAnXFwnKTsJLyogc3dpdGNoIHRoZSBzbGFzaCB0aGUgZXhwZWN0ZWQgd2F5ICovCisJCX0KKwlpZiAodmFsdWUgPiBhZGRyX2NsYXNzX21heFtlbmQgLSBieXRlc10pCisJCXJldHVybiAwOworCisJYWRkcmVzcy5zX2FkZHIgPSAqKChfX2JlMzIgKikgYnl0ZXMpIHwgaHRvbmwodmFsdWUpOworCSooKF9fYmUzMiAqKWRzdCkgPSBhZGRyZXNzLnNfYWRkcjsKKwlyZXR1cm4gMTsgLyogc3VjY2VzcyAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK2NvbnZlcnQgYSBOVCBzdGF0dXMgY29kZSB0byBhIGRvcyBjbGFzcy9jb2RlCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBOVCBzdGF0dXMgLT4gZG9zIGVycm9yIG1hcCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJX191OCBkb3NfY2xhc3M7CisJX191MTYgZG9zX2NvZGU7CisJX191MzIgbnRzdGF0dXM7Cit9IG50c3RhdHVzX3RvX2Rvc19tYXBbXSA9IHsKKwl7CisJRVJSRE9TLCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfVU5TVUNDRVNTRlVMfSwgeworCUVSUkRPUywgRVJSYmFkZnVuYywgTlRfU1RBVFVTX05PVF9JTVBMRU1FTlRFRH0sIHsKKwlFUlJET1MsIDg3LCBOVF9TVEFUVVNfSU5WQUxJRF9JTkZPX0NMQVNTfSwgeworCUVSUkRPUywgMjQsIE5UX1NUQVRVU19JTkZPX0xFTkdUSF9NSVNNQVRDSH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19BQ0NFU1NfVklPTEFUSU9OfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0lOX1BBR0VfRVJST1J9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfUEFHRUZJTEVfUVVPVEF9LCB7CisJRVJSRE9TLCBFUlJiYWRmaWQsIE5UX1NUQVRVU19JTlZBTElEX0hBTkRMRX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19CQURfSU5JVElBTF9TVEFDS30sIHsKKwlFUlJET1MsIDE5MywgTlRfU1RBVFVTX0JBRF9JTklUSUFMX1BDfSwgeworCUVSUkRPUywgODcsIE5UX1NUQVRVU19JTlZBTElEX0NJRH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19USU1FUl9OT1RfQ0FOQ0VMRUR9LCB7CisJRVJSRE9TLCA4NywgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSfSwgeworCUVSUkRPUywgRVJSYmFkZmlsZSwgTlRfU1RBVFVTX05PX1NVQ0hfREVWSUNFfSwgeworCUVSUkRPUywgRVJSYmFkZmlsZSwgTlRfU1RBVFVTX05PX1NVQ0hfRklMRX0sIHsKKwlFUlJET1MsIEVSUmJhZGZ1bmMsIE5UX1NUQVRVU19JTlZBTElEX0RFVklDRV9SRVFVRVNUfSwgeworCUVSUkRPUywgMzgsIE5UX1NUQVRVU19FTkRfT0ZfRklMRX0sIHsKKwlFUlJET1MsIDM0LCBOVF9TVEFUVVNfV1JPTkdfVk9MVU1FfSwgeworCUVSUkRPUywgMjEsIE5UX1NUQVRVU19OT19NRURJQV9JTl9ERVZJQ0V9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfVU5SRUNPR05JWkVEX01FRElBfSwgeworCUVSUkRPUywgMjcsIE5UX1NUQVRVU19OT05FWElTVEVOVF9TRUNUT1J9LAorLyoJeyBUaGlzIE5UIGVycm9yIGNvZGUgd2FzICdzcWFzaGVkJworCSBmcm9tIE5UX1NUQVRVU19NT1JFX1BST0NFU1NJTkdfUkVRVUlSRUQgdG8gTlRfU1RBVFVTX09LIAorCSBkdXJpbmcgdGhlIHNlc3Npb24gc2V0dXAgfSAqLworCXsKKwlFUlJET1MsIEVSUm5vbWVtLCBOVF9TVEFUVVNfTk9fTUVNT1JZfSwgeworCUVSUkRPUywgNDg3LCBOVF9TVEFUVVNfQ09ORkxJQ1RJTkdfQUREUkVTU0VTfSwgeworCUVSUkRPUywgNDg3LCBOVF9TVEFUVVNfTk9UX01BUFBFRF9WSUVXfSwgeworCUVSUkRPUywgODcsIE5UX1NUQVRVU19VTkFCTEVfVE9fRlJFRV9WTX0sIHsKKwlFUlJET1MsIDg3LCBOVF9TVEFUVVNfVU5BQkxFX1RPX0RFTEVURV9TRUNUSU9OfSwgeworCUVSUkRPUywgMjE0MiwgTlRfU1RBVFVTX0lOVkFMSURfU1lTVEVNX1NFUlZJQ0V9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfSUxMRUdBTF9JTlNUUlVDVElPTn0sIHsKKwlFUlJET1MsIEVSUm5vYWNjZXNzLCBOVF9TVEFUVVNfSU5WQUxJRF9MT0NLX1NFUVVFTkNFfSwgeworCUVSUkRPUywgRVJSbm9hY2Nlc3MsIE5UX1NUQVRVU19JTlZBTElEX1ZJRVdfU0laRX0sIHsKKwlFUlJET1MsIDE5MywgTlRfU1RBVFVTX0lOVkFMSURfRklMRV9GT1JfU0VDVElPTn0sIHsKKwlFUlJET1MsIEVSUm5vYWNjZXNzLCBOVF9TVEFUVVNfQUxSRUFEWV9DT01NSVRURUR9LAorLyoJeyBUaGlzIE5UIGVycm9yIGNvZGUgd2FzICdzcWFzaGVkJworCSBmcm9tIE5UX1NUQVRVU19BQ0NFU1NfREVOSUVEIHRvIE5UX1NUQVRVU19UUlVTVEVEX1JFTEFUSU9OU0hJUF9GQUlMVVJFIAorCSBkdXJpbmcgdGhlIHNlc3Npb24gc2V0dXAgfSAgICovCisJeworCUVSUkRPUywgRVJSbm9hY2Nlc3MsIE5UX1NUQVRVU19BQ0NFU1NfREVOSUVEfSwgeworCUVSUkRPUywgMTExLCBOVF9TVEFUVVNfQlVGRkVSX1RPT19TTUFMTH0sIHsKKwlFUlJET1MsIEVSUmJhZGZpZCwgTlRfU1RBVFVTX09CSkVDVF9UWVBFX01JU01BVENIfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX05PTkNPTlRJTlVBQkxFX0VYQ0VQVElPTn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19JTlZBTElEX0RJU1BPU0lUSU9OfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1VOV0lORH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19CQURfU1RBQ0t9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfSU5WQUxJRF9VTldJTkRfVEFSR0VUfSwgeworCUVSUkRPUywgMTU4LCBOVF9TVEFUVVNfTk9UX0xPQ0tFRH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19QQVJJVFlfRVJST1J9LCB7CisJRVJSRE9TLCA0ODcsIE5UX1NUQVRVU19VTkFCTEVfVE9fREVDT01NSVRfVk19LCB7CisJRVJSRE9TLCA0ODcsIE5UX1NUQVRVU19OT1RfQ09NTUlUVEVEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0lOVkFMSURfUE9SVF9BVFRSSUJVVEVTfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1BPUlRfTUVTU0FHRV9UT09fTE9OR30sIHsKKwlFUlJET1MsIDg3LCBOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfTUlYfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0lOVkFMSURfUVVPVEFfTE9XRVJ9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfRElTS19DT1JSVVBUX0VSUk9SfSwgeworCUVSUkRPUywgRVJSYmFkZmlsZSwgTlRfU1RBVFVTX09CSkVDVF9OQU1FX0lOVkFMSUR9LCB7CS8qIG1hcHBpbmcgY2hhbmdlZCBzaW5jZSBzaGVsbCBkb2VzIGxvb2t1cCBvbiAqIGFuZCBleHBlY3RzIGZpbGUgbm90IGZvdW5kICovCisJRVJSRE9TLCBFUlJiYWRmaWxlLCBOVF9TVEFUVVNfT0JKRUNUX05BTUVfTk9UX0ZPVU5EfSwgeworCUVSUkRPUywgRVJSYWxyZWFkeWV4aXN0cywgTlRfU1RBVFVTX09CSkVDVF9OQU1FX0NPTExJU0lPTn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19IQU5ETEVfTk9UX1dBSVRBQkxFfSwgeworCUVSUkRPUywgRVJSYmFkZmlkLCBOVF9TVEFUVVNfUE9SVF9ESVNDT05ORUNURUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfREVWSUNFX0FMUkVBRFlfQVRUQUNIRUR9LCB7CisJRVJSRE9TLCAxNjEsIE5UX1NUQVRVU19PQkpFQ1RfUEFUSF9JTlZBTElEfSwgeworCUVSUkRPUywgRVJSYmFkcGF0aCwgTlRfU1RBVFVTX09CSkVDVF9QQVRIX05PVF9GT1VORH0sIHsKKwlFUlJET1MsIDE2MSwgTlRfU1RBVFVTX09CSkVDVF9QQVRIX1NZTlRBWF9CQUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfREFUQV9PVkVSUlVOfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0RBVEFfTEFURV9FUlJPUn0sIHsKKwlFUlJET1MsIDIzLCBOVF9TVEFUVVNfREFUQV9FUlJPUn0sIHsKKwlFUlJET1MsIDIzLCBOVF9TVEFUVVNfQ1JDX0VSUk9SfSwgeworCUVSUkRPUywgRVJSbm9tZW0sIE5UX1NUQVRVU19TRUNUSU9OX1RPT19CSUd9LCB7CisJRVJSRE9TLCBFUlJub2FjY2VzcywgTlRfU1RBVFVTX1BPUlRfQ09OTkVDVElPTl9SRUZVU0VEfSwgeworCUVSUkRPUywgRVJSYmFkZmlkLCBOVF9TVEFUVVNfSU5WQUxJRF9QT1JUX0hBTkRMRX0sIHsKKwlFUlJET1MsIEVSUmJhZHNoYXJlLCBOVF9TVEFUVVNfU0hBUklOR19WSU9MQVRJT059LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfUVVPVEFfRVhDRUVERUR9LCB7CisJRVJSRE9TLCA4NywgTlRfU1RBVFVTX0lOVkFMSURfUEFHRV9QUk9URUNUSU9OfSwgeworCUVSUkRPUywgMjg4LCBOVF9TVEFUVVNfTVVUQU5UX05PVF9PV05FRH0sIHsKKwlFUlJET1MsIDI5OCwgTlRfU1RBVFVTX1NFTUFQSE9SRV9MSU1JVF9FWENFRURFRH0sIHsKKwlFUlJET1MsIDg3LCBOVF9TVEFUVVNfUE9SVF9BTFJFQURZX1NFVH0sIHsKKwlFUlJET1MsIDg3LCBOVF9TVEFUVVNfU0VDVElPTl9OT1RfSU1BR0V9LCB7CisJRVJSRE9TLCAxNTYsIE5UX1NUQVRVU19TVVNQRU5EX0NPVU5UX0VYQ0VFREVEfSwgeworCUVSUkRPUywgRVJSbm9hY2Nlc3MsIE5UX1NUQVRVU19USFJFQURfSVNfVEVSTUlOQVRJTkd9LCB7CisJRVJSRE9TLCA4NywgTlRfU1RBVFVTX0JBRF9XT1JLSU5HX1NFVF9MSU1JVH0sIHsKKwlFUlJET1MsIDg3LCBOVF9TVEFUVVNfSU5DT01QQVRJQkxFX0ZJTEVfTUFQfSwgeworCUVSUkRPUywgODcsIE5UX1NUQVRVU19TRUNUSU9OX1BST1RFQ1RJT059LCB7CisJRVJSRE9TLCBFUlJlYXNub3RzdXBwb3J0ZWQsIE5UX1NUQVRVU19FQVNfTk9UX1NVUFBPUlRFRH0sIHsKKwlFUlJET1MsIDI1NSwgTlRfU1RBVFVTX0VBX1RPT19MQVJHRX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19OT05FWElTVEVOVF9FQV9FTlRSWX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19OT19FQVNfT05fRklMRX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19FQV9DT1JSVVBUX0VSUk9SfSwgeworCUVSUkRPUywgRVJSbG9jaywgTlRfU1RBVFVTX0ZJTEVfTE9DS19DT05GTElDVH0sIHsKKwlFUlJET1MsIEVSUmxvY2ssIE5UX1NUQVRVU19MT0NLX05PVF9HUkFOVEVEfSwgeworCUVSUkRPUywgRVJSYmFkZmlsZSwgTlRfU1RBVFVTX0RFTEVURV9QRU5ESU5HfSwgeworCUVSUkRPUywgRVJSdW5zdXAsIE5UX1NUQVRVU19DVExfRklMRV9OT1RfU1VQUE9SVEVEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1VOS05PV05fUkVWSVNJT059LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfUkVWSVNJT05fTUlTTUFUQ0h9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfSU5WQUxJRF9PV05FUn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19JTlZBTElEX1BSSU1BUllfR1JPVVB9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTk9fSU1QRVJTT05BVElPTl9UT0tFTn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19DQU5UX0RJU0FCTEVfTUFOREFUT1JZfSwgeworCUVSUkRPUywgMjIxNSwgTlRfU1RBVFVTX05PX0xPR09OX1NFUlZFUlN9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTk9fU1VDSF9MT0dPTl9TRVNTSU9OfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX05PX1NVQ0hfUFJJVklMRUdFfSwgeworCUVSUkRPUywgRVJSbm9hY2Nlc3MsIE5UX1NUQVRVU19QUklWSUxFR0VfTk9UX0hFTER9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfSU5WQUxJRF9BQ0NPVU5UX05BTUV9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfVVNFUl9FWElTVFN9LAorLyoJeyBUaGlzIE5UIGVycm9yIGNvZGUgd2FzICdzcWFzaGVkJworCSBmcm9tIE5UX1NUQVRVU19OT19TVUNIX1VTRVIgdG8gTlRfU1RBVFVTX0xPR09OX0ZBSUxVUkUgCisJIGR1cmluZyB0aGUgc2Vzc2lvbiBzZXR1cCB9ICovCisJeworCUVSUkRPUywgRVJSbm9hY2Nlc3MsIE5UX1NUQVRVU19OT19TVUNIX1VTRVJ9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfR1JPVVBfRVhJU1RTfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX05PX1NVQ0hfR1JPVVB9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTUVNQkVSX0lOX0dST1VQfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX01FTUJFUl9OT1RfSU5fR1JPVVB9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTEFTVF9BRE1JTn0sCisvKgl7IFRoaXMgTlQgZXJyb3IgY29kZSB3YXMgJ3NxYXNoZWQnCisJIGZyb20gTlRfU1RBVFVTX1dST05HX1BBU1NXT1JEIHRvIE5UX1NUQVRVU19MT0dPTl9GQUlMVVJFIAorCSBkdXJpbmcgdGhlIHNlc3Npb24gc2V0dXAgfSAqLworCXsKKwlFUlJTUlYsIEVSUmJhZHB3LCBOVF9TVEFUVVNfV1JPTkdfUEFTU1dPUkR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfSUxMX0ZPUk1FRF9QQVNTV09SRH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19QQVNTV09SRF9SRVNUUklDVElPTn0sIHsKKwlFUlJET1MsIEVSUm5vYWNjZXNzLCBOVF9TVEFUVVNfTE9HT05fRkFJTFVSRX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19BQ0NPVU5UX1JFU1RSSUNUSU9OfSwgeworCUVSUlNSViwgMjI0MSwgTlRfU1RBVFVTX0lOVkFMSURfTE9HT05fSE9VUlN9LCB7CisJRVJSU1JWLCAyMjQwLCBOVF9TVEFUVVNfSU5WQUxJRF9XT1JLU1RBVElPTn0sIHsKKwlFUlJTUlYsIDIyNDIsIE5UX1NUQVRVU19QQVNTV09SRF9FWFBJUkVEfSwgeworCUVSUlNSViwgMjIzOSwgTlRfU1RBVFVTX0FDQ09VTlRfRElTQUJMRUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTk9ORV9NQVBQRUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfVE9PX01BTllfTFVJRFNfUkVRVUVTVEVEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0xVSURTX0VYSEFVU1RFRH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19JTlZBTElEX1NVQl9BVVRIT1JJVFl9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfSU5WQUxJRF9BQ0x9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfSU5WQUxJRF9TSUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfSU5WQUxJRF9TRUNVUklUWV9ERVNDUn0sIHsKKwlFUlJET1MsIDEyNywgTlRfU1RBVFVTX1BST0NFRFVSRV9OT1RfRk9VTkR9LCB7CisJRVJSRE9TLCAxOTMsIE5UX1NUQVRVU19JTlZBTElEX0lNQUdFX0ZPUk1BVH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19OT19UT0tFTn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19CQURfSU5IRVJJVEFOQ0VfQUNMfSwgeworCUVSUkRPUywgMTU4LCBOVF9TVEFUVVNfUkFOR0VfTk9UX0xPQ0tFRH0sIHsKKwlFUlJET1MsIDExMiwgTlRfU1RBVFVTX0RJU0tfRlVMTH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19TRVJWRVJfRElTQUJMRUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfU0VSVkVSX05PVF9ESVNBQkxFRH0sIHsKKwlFUlJET1MsIDY4LCBOVF9TVEFUVVNfVE9PX01BTllfR1VJRFNfUkVRVUVTVEVEfSwgeworCUVSUkRPUywgMjU5LCBOVF9TVEFUVVNfR1VJRFNfRVhIQVVTVEVEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0lOVkFMSURfSURfQVVUSE9SSVRZfSwgeworCUVSUkRPUywgMjU5LCBOVF9TVEFUVVNfQUdFTlRTX0VYSEFVU1RFRH0sIHsKKwlFUlJET1MsIDE1NCwgTlRfU1RBVFVTX0lOVkFMSURfVk9MVU1FX0xBQkVMfSwgeworCUVSUkRPUywgMTQsIE5UX1NUQVRVU19TRUNUSU9OX05PVF9FWFRFTkRFRH0sIHsKKwlFUlJET1MsIDQ4NywgTlRfU1RBVFVTX05PVF9NQVBQRURfREFUQX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19SRVNPVVJDRV9EQVRBX05PVF9GT1VORH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19SRVNPVVJDRV9UWVBFX05PVF9GT1VORH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19SRVNPVVJDRV9OQU1FX05PVF9GT1VORH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19BUlJBWV9CT1VORFNfRVhDRUVERUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfRkxPQVRfREVOT1JNQUxfT1BFUkFORH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19GTE9BVF9ESVZJREVfQllfWkVST30sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19GTE9BVF9JTkVYQUNUX1JFU1VMVH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19GTE9BVF9JTlZBTElEX09QRVJBVElPTn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19GTE9BVF9PVkVSRkxPV30sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19GTE9BVF9TVEFDS19DSEVDS30sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19GTE9BVF9VTkRFUkZMT1d9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfSU5URUdFUl9ESVZJREVfQllfWkVST30sIHsKKwlFUlJET1MsIDUzNCwgTlRfU1RBVFVTX0lOVEVHRVJfT1ZFUkZMT1d9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfUFJJVklMRUdFRF9JTlNUUlVDVElPTn0sIHsKKwlFUlJET1MsIEVSUm5vbWVtLCBOVF9TVEFUVVNfVE9PX01BTllfUEFHSU5HX0ZJTEVTfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0ZJTEVfSU5WQUxJRH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19BTExPVFRFRF9TUEFDRV9FWENFRURFRH0sCisvKgl7IFRoaXMgTlQgZXJyb3IgY29kZSB3YXMgJ3NxYXNoZWQnCisJIGZyb20gTlRfU1RBVFVTX0lOU1VGRklDSUVOVF9SRVNPVVJDRVMgdG8gTlRfU1RBVFVTX0lOU1VGRl9TRVJWRVJfUkVTT1VSQ0VTIAorCSBkdXJpbmcgdGhlIHNlc3Npb24gc2V0dXAgfSAqLworCXsKKwlFUlJET1MsIEVSUm5vbWVtLCBOVF9TVEFUVVNfSU5TVUZGSUNJRU5UX1JFU09VUkNFU30sIHsKKwlFUlJET1MsIEVSUmJhZHBhdGgsIE5UX1NUQVRVU19ERlNfRVhJVF9QQVRIX0ZPVU5EfSwgeworCUVSUkRPUywgMjMsIE5UX1NUQVRVU19ERVZJQ0VfREFUQV9FUlJPUn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19ERVZJQ0VfTk9UX0NPTk5FQ1RFRH0sIHsKKwlFUlJET1MsIDIxLCBOVF9TVEFUVVNfREVWSUNFX1BPV0VSX0ZBSUxVUkV9LCB7CisJRVJSRE9TLCA0ODcsIE5UX1NUQVRVU19GUkVFX1ZNX05PVF9BVF9CQVNFfSwgeworCUVSUkRPUywgNDg3LCBOVF9TVEFUVVNfTUVNT1JZX05PVF9BTExPQ0FURUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfV09SS0lOR19TRVRfUVVPVEF9LCB7CisJRVJSRE9TLCAxOSwgTlRfU1RBVFVTX01FRElBX1dSSVRFX1BST1RFQ1RFRH0sIHsKKwlFUlJET1MsIDIxLCBOVF9TVEFUVVNfREVWSUNFX05PVF9SRUFEWX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19JTlZBTElEX0dST1VQX0FUVFJJQlVURVN9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfQkFEX0lNUEVSU09OQVRJT05fTEVWRUx9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfQ0FOVF9PUEVOX0FOT05ZTU9VU30sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19CQURfVkFMSURBVElPTl9DTEFTU30sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19CQURfVE9LRU5fVFlQRX0sIHsKKwlFUlJET1MsIDg3LCBOVF9TVEFUVVNfQkFEX01BU1RFUl9CT09UX1JFQ09SRH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19JTlNUUlVDVElPTl9NSVNBTElHTk1FTlR9LCB7CisJRVJSRE9TLCBFUlJwaXBlYnVzeSwgTlRfU1RBVFVTX0lOU1RBTkNFX05PVF9BVkFJTEFCTEV9LCB7CisJRVJSRE9TLCBFUlJwaXBlYnVzeSwgTlRfU1RBVFVTX1BJUEVfTk9UX0FWQUlMQUJMRX0sIHsKKwlFUlJET1MsIEVSUmJhZHBpcGUsIE5UX1NUQVRVU19JTlZBTElEX1BJUEVfU1RBVEV9LCB7CisJRVJSRE9TLCBFUlJwaXBlYnVzeSwgTlRfU1RBVFVTX1BJUEVfQlVTWX0sIHsKKwlFUlJET1MsIEVSUmJhZGZ1bmMsIE5UX1NUQVRVU19JTExFR0FMX0ZVTkNUSU9OfSwgeworCUVSUkRPUywgRVJSbm90Y29ubmVjdGVkLCBOVF9TVEFUVVNfUElQRV9ESVNDT05ORUNURUR9LCB7CisJRVJSRE9TLCBFUlJwaXBlY2xvc2luZywgTlRfU1RBVFVTX1BJUEVfQ0xPU0lOR30sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19QSVBFX0NPTk5FQ1RFRH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19QSVBFX0xJU1RFTklOR30sIHsKKwlFUlJET1MsIEVSUmJhZHBpcGUsIE5UX1NUQVRVU19JTlZBTElEX1JFQURfTU9ERX0sIHsKKwlFUlJET1MsIDEyMSwgTlRfU1RBVFVTX0lPX1RJTUVPVVR9LCB7CisJRVJSRE9TLCAzOCwgTlRfU1RBVFVTX0ZJTEVfRk9SQ0VEX0NMT1NFRH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19QUk9GSUxJTkdfTk9UX1NUQVJURUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfUFJPRklMSU5HX05PVF9TVE9QUEVEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0NPVUxEX05PVF9JTlRFUlBSRVR9LCB7CisJRVJSRE9TLCBFUlJub2FjY2VzcywgTlRfU1RBVFVTX0ZJTEVfSVNfQV9ESVJFQ1RPUll9LCB7CisJRVJSRE9TLCBFUlJ1bnN1cCwgTlRfU1RBVFVTX05PVF9TVVBQT1JURUR9LCB7CisJRVJSRE9TLCA1MSwgTlRfU1RBVFVTX1JFTU9URV9OT1RfTElTVEVOSU5HfSwgeworCUVSUkRPUywgNTIsIE5UX1NUQVRVU19EVVBMSUNBVEVfTkFNRX0sIHsKKwlFUlJET1MsIDUzLCBOVF9TVEFUVVNfQkFEX05FVFdPUktfUEFUSH0sIHsKKwlFUlJET1MsIDU0LCBOVF9TVEFUVVNfTkVUV09SS19CVVNZfSwgeworCUVSUkRPUywgNTUsIE5UX1NUQVRVU19ERVZJQ0VfRE9FU19OT1RfRVhJU1R9LCB7CisJRVJSRE9TLCA1NiwgTlRfU1RBVFVTX1RPT19NQU5ZX0NPTU1BTkRTfSwgeworCUVSUkRPUywgNTcsIE5UX1NUQVRVU19BREFQVEVSX0hBUkRXQVJFX0VSUk9SfSwgeworCUVSUkRPUywgNTgsIE5UX1NUQVRVU19JTlZBTElEX05FVFdPUktfUkVTUE9OU0V9LCB7CisJRVJSRE9TLCA1OSwgTlRfU1RBVFVTX1VORVhQRUNURURfTkVUV09SS19FUlJPUn0sIHsKKwlFUlJET1MsIDYwLCBOVF9TVEFUVVNfQkFEX1JFTU9URV9BREFQVEVSfSwgeworCUVSUkRPUywgNjEsIE5UX1NUQVRVU19QUklOVF9RVUVVRV9GVUxMfSwgeworCUVSUkRPUywgNjIsIE5UX1NUQVRVU19OT19TUE9PTF9TUEFDRX0sIHsKKwlFUlJET1MsIDYzLCBOVF9TVEFUVVNfUFJJTlRfQ0FOQ0VMTEVEfSwgeworCUVSUkRPUywgNjQsIE5UX1NUQVRVU19ORVRXT1JLX05BTUVfREVMRVRFRH0sIHsKKwlFUlJET1MsIDY1LCBOVF9TVEFUVVNfTkVUV09SS19BQ0NFU1NfREVOSUVEfSwgeworCUVSUkRPUywgNjYsIE5UX1NUQVRVU19CQURfREVWSUNFX1RZUEV9LCB7CisJRVJSRE9TLCBFUlJub3N1Y2hzaGFyZSwgTlRfU1RBVFVTX0JBRF9ORVRXT1JLX05BTUV9LCB7CisJRVJSRE9TLCA2OCwgTlRfU1RBVFVTX1RPT19NQU5ZX05BTUVTfSwgeworCUVSUkRPUywgNjksIE5UX1NUQVRVU19UT09fTUFOWV9TRVNTSU9OU30sIHsKKwlFUlJET1MsIDcwLCBOVF9TVEFUVVNfU0hBUklOR19QQVVTRUR9LCB7CisJRVJSRE9TLCA3MSwgTlRfU1RBVFVTX1JFUVVFU1RfTk9UX0FDQ0VQVEVEfSwgeworCUVSUkRPUywgNzIsIE5UX1NUQVRVU19SRURJUkVDVE9SX1BBVVNFRH0sIHsKKwlFUlJET1MsIDg4LCBOVF9TVEFUVVNfTkVUX1dSSVRFX0ZBVUxUfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1BST0ZJTElOR19BVF9MSU1JVH0sIHsKKwlFUlJET1MsIEVSUmRpZmZkZXZpY2UsIE5UX1NUQVRVU19OT1RfU0FNRV9ERVZJQ0V9LCB7CisJRVJSRE9TLCBFUlJub2FjY2VzcywgTlRfU1RBVFVTX0ZJTEVfUkVOQU1FRH0sIHsKKwlFUlJET1MsIDI0MCwgTlRfU1RBVFVTX1ZJUlRVQUxfQ0lSQ1VJVF9DTE9TRUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTk9fU0VDVVJJVFlfT05fT0JKRUNUfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0NBTlRfV0FJVH0sIHsKKwlFUlJET1MsIEVSUnBpcGVjbG9zaW5nLCBOVF9TVEFUVVNfUElQRV9FTVBUWX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19DQU5UX0FDQ0VTU19ET01BSU5fSU5GT30sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19DQU5UX1RFUk1JTkFURV9TRUxGfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0lOVkFMSURfU0VSVkVSX1NUQVRFfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0lOVkFMSURfRE9NQUlOX1NUQVRFfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0lOVkFMSURfRE9NQUlOX1JPTEV9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTk9fU1VDSF9ET01BSU59LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfRE9NQUlOX0VYSVNUU30sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19ET01BSU5fTElNSVRfRVhDRUVERUR9LCB7CisJRVJSRE9TLCAzMDAsIE5UX1NUQVRVU19PUExPQ0tfTk9UX0dSQU5URUR9LCB7CisJRVJSRE9TLCAzMDEsIE5UX1NUQVRVU19JTlZBTElEX09QTE9DS19QUk9UT0NPTH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19JTlRFUk5BTF9EQl9DT1JSVVBUSU9OfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0lOVEVSTkFMX0VSUk9SfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0dFTkVSSUNfTk9UX01BUFBFRH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19CQURfREVTQ1JJUFRPUl9GT1JNQVR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfSU5WQUxJRF9VU0VSX0JVRkZFUn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19VTkVYUEVDVEVEX0lPX0VSUk9SfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1VORVhQRUNURURfTU1fQ1JFQVRFX0VSUn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19VTkVYUEVDVEVEX01NX01BUF9FUlJPUn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19VTkVYUEVDVEVEX01NX0VYVEVORF9FUlJ9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTk9UX0xPR09OX1BST0NFU1N9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTE9HT05fU0VTU0lPTl9FWElTVFN9LCB7CisJRVJSRE9TLCA4NywgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzF9LCB7CisJRVJSRE9TLCA4NywgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzJ9LCB7CisJRVJSRE9TLCA4NywgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzN9LCB7CisJRVJSRE9TLCA4NywgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzR9LCB7CisJRVJSRE9TLCA4NywgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzV9LCB7CisJRVJSRE9TLCA4NywgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzZ9LCB7CisJRVJSRE9TLCA4NywgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzd9LCB7CisJRVJSRE9TLCA4NywgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzh9LCB7CisJRVJSRE9TLCA4NywgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzl9LCB7CisJRVJSRE9TLCA4NywgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzEwfSwgeworCUVSUkRPUywgODcsIE5UX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUl8xMX0sIHsKKwlFUlJET1MsIDg3LCBOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfMTJ9LCB7CisJRVJSRE9TLCBFUlJiYWRwYXRoLCBOVF9TVEFUVVNfUkVESVJFQ1RPUl9OT1RfU1RBUlRFRH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19SRURJUkVDVE9SX1NUQVJURUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfU1RBQ0tfT1ZFUkZMT1d9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTk9fU1VDSF9QQUNLQUdFfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0JBRF9GVU5DVElPTl9UQUJMRX0sIHsKKwlFUlJET1MsIDIwMywgMHhjMDAwMDEwMH0sIHsKKwlFUlJET1MsIDE0NSwgTlRfU1RBVFVTX0RJUkVDVE9SWV9OT1RfRU1QVFl9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfRklMRV9DT1JSVVBUX0VSUk9SfSwgeworCUVSUkRPUywgMjY3LCBOVF9TVEFUVVNfTk9UX0FfRElSRUNUT1JZfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0JBRF9MT0dPTl9TRVNTSU9OX1NUQVRFfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0xPR09OX1NFU1NJT05fQ09MTElTSU9OfSwgeworCUVSUkRPUywgMjA2LCBOVF9TVEFUVVNfTkFNRV9UT09fTE9OR30sIHsKKwlFUlJET1MsIDI0MDEsIE5UX1NUQVRVU19GSUxFU19PUEVOfSwgeworCUVSUkRPUywgMjQwNCwgTlRfU1RBVFVTX0NPTk5FQ1RJT05fSU5fVVNFfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX01FU1NBR0VfTk9UX0ZPVU5EfSwgeworCUVSUkRPUywgRVJSbm9hY2Nlc3MsIE5UX1NUQVRVU19QUk9DRVNTX0lTX1RFUk1JTkFUSU5HfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0lOVkFMSURfTE9HT05fVFlQRX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19OT19HVUlEX1RSQU5TTEFUSU9OfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0NBTk5PVF9JTVBFUlNPTkFURX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19JTUFHRV9BTFJFQURZX0xPQURFRH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19BQklPU19OT1RfUFJFU0VOVH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19BQklPU19MSURfTk9UX0VYSVNUfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0FCSU9TX0xJRF9BTFJFQURZX09XTkVEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0FCSU9TX05PVF9MSURfT1dORVJ9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfQUJJT1NfSU5WQUxJRF9DT01NQU5EfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0FCSU9TX0lOVkFMSURfTElEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0FCSU9TX1NFTEVDVE9SX05PVF9BVkFJTEFCTEV9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfQUJJT1NfSU5WQUxJRF9TRUxFQ1RPUn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19OT19MRFR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfSU5WQUxJRF9MRFRfU0laRX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19JTlZBTElEX0xEVF9PRkZTRVR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfSU5WQUxJRF9MRFRfREVTQ1JJUFRPUn0sIHsKKwlFUlJET1MsIDE5MywgTlRfU1RBVFVTX0lOVkFMSURfSU1BR0VfTkVfRk9STUFUfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1JYQUNUX0lOVkFMSURfU1RBVEV9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfUlhBQ1RfQ09NTUlUX0ZBSUxVUkV9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTUFQUEVEX0ZJTEVfU0laRV9aRVJPfSwgeworCUVSUkRPUywgRVJSbm9maWRzLCBOVF9TVEFUVVNfVE9PX01BTllfT1BFTkVEX0ZJTEVTfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0NBTkNFTExFRH0sIHsKKwlFUlJET1MsIEVSUm5vYWNjZXNzLCBOVF9TVEFUVVNfQ0FOTk9UX0RFTEVURX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19JTlZBTElEX0NPTVBVVEVSX05BTUV9LCB7CisJRVJSRE9TLCBFUlJub2FjY2VzcywgTlRfU1RBVFVTX0ZJTEVfREVMRVRFRH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19TUEVDSUFMX0FDQ09VTlR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfU1BFQ0lBTF9HUk9VUH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19TUEVDSUFMX1VTRVJ9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTUVNQkVSU19QUklNQVJZX0dST1VQfSwgeworCUVSUkRPUywgRVJSYmFkZmlkLCBOVF9TVEFUVVNfRklMRV9DTE9TRUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfVE9PX01BTllfVEhSRUFEU30sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19USFJFQURfTk9UX0lOX1BST0NFU1N9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfVE9LRU5fQUxSRUFEWV9JTl9VU0V9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfUEFHRUZJTEVfUVVPVEFfRVhDRUVERUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfQ09NTUlUTUVOVF9MSU1JVH0sIHsKKwlFUlJET1MsIDE5MywgTlRfU1RBVFVTX0lOVkFMSURfSU1BR0VfTEVfRk9STUFUfSwgeworCUVSUkRPUywgMTkzLCBOVF9TVEFUVVNfSU5WQUxJRF9JTUFHRV9OT1RfTVp9LCB7CisJRVJSRE9TLCAxOTMsIE5UX1NUQVRVU19JTlZBTElEX0lNQUdFX1BST1RFQ1R9LCB7CisJRVJSRE9TLCAxOTMsIE5UX1NUQVRVU19JTlZBTElEX0lNQUdFX1dJTl8xNn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19MT0dPTl9TRVJWRVJfQ09ORkxJQ1R9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfVElNRV9ESUZGRVJFTkNFX0FUX0RDfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1NZTkNIUk9OSVpBVElPTl9SRVFVSVJFRH0sIHsKKwlFUlJET1MsIDEyNiwgTlRfU1RBVFVTX0RMTF9OT1RfRk9VTkR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfT1BFTl9GQUlMRUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfSU9fUFJJVklMRUdFX0ZBSUxFRH0sIHsKKwlFUlJET1MsIDE4MiwgTlRfU1RBVFVTX09SRElOQUxfTk9UX0ZPVU5EfSwgeworCUVSUkRPUywgMTI3LCBOVF9TVEFUVVNfRU5UUllQT0lOVF9OT1RfRk9VTkR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfQ09OVFJPTF9DX0VYSVR9LCB7CisJRVJSRE9TLCA2NCwgTlRfU1RBVFVTX0xPQ0FMX0RJU0NPTk5FQ1R9LCB7CisJRVJSRE9TLCA2NCwgTlRfU1RBVFVTX1JFTU9URV9ESVNDT05ORUNUfSwgeworCUVSUkRPUywgNTEsIE5UX1NUQVRVU19SRU1PVEVfUkVTT1VSQ0VTfSwgeworCUVSUkRPUywgNTksIE5UX1NUQVRVU19MSU5LX0ZBSUxFRH0sIHsKKwlFUlJET1MsIDU5LCBOVF9TVEFUVVNfTElOS19USU1FT1VUfSwgeworCUVSUkRPUywgNTksIE5UX1NUQVRVU19JTlZBTElEX0NPTk5FQ1RJT059LCB7CisJRVJSRE9TLCA1OSwgTlRfU1RBVFVTX0lOVkFMSURfQUREUkVTU30sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19ETExfSU5JVF9GQUlMRUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTUlTU0lOR19TWVNURU1GSUxFfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1VOSEFORExFRF9FWENFUFRJT059LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfQVBQX0lOSVRfRkFJTFVSRX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19QQUdFRklMRV9DUkVBVEVfRkFJTEVEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX05PX1BBR0VGSUxFfSwgeworCUVSUkRPUywgMTI0LCBOVF9TVEFUVVNfSU5WQUxJRF9MRVZFTH0sIHsKKwlFUlJET1MsIDg2LCBOVF9TVEFUVVNfV1JPTkdfUEFTU1dPUkRfQ09SRX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19JTExFR0FMX0ZMT0FUX0NPTlRFWFR9LCB7CisJRVJSRE9TLCAxMDksIE5UX1NUQVRVU19QSVBFX0JST0tFTn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19SRUdJU1RSWV9DT1JSVVBUfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1JFR0lTVFJZX0lPX0ZBSUxFRH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19OT19FVkVOVF9QQUlSfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1VOUkVDT0dOSVpFRF9WT0xVTUV9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfU0VSSUFMX05PX0RFVklDRV9JTklURUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTk9fU1VDSF9BTElBU30sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19NRU1CRVJfTk9UX0lOX0FMSUFTfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX01FTUJFUl9JTl9BTElBU30sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19BTElBU19FWElTVFN9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTE9HT05fTk9UX0dSQU5URUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfVE9PX01BTllfU0VDUkVUU30sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19TRUNSRVRfVE9PX0xPTkd9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfSU5URVJOQUxfREJfRVJST1J9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfRlVMTFNDUkVFTl9NT0RFfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1RPT19NQU5ZX0NPTlRFWFRfSURTfSwgeworCUVSUkRPUywgRVJSbm9hY2Nlc3MsIE5UX1NUQVRVU19MT0dPTl9UWVBFX05PVF9HUkFOVEVEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX05PVF9SRUdJU1RSWV9GSUxFfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX05UX0NST1NTX0VOQ1JZUFRJT05fUkVRVUlSRUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfRE9NQUlOX0NUUkxSX0NPTkZJR19FUlJPUn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19GVF9NSVNTSU5HX01FTUJFUn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19JTExfRk9STUVEX1NFUlZJQ0VfRU5UUll9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfSUxMRUdBTF9DSEFSQUNURVJ9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfVU5NQVBQQUJMRV9DSEFSQUNURVJ9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfVU5ERUZJTkVEX0NIQVJBQ1RFUn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19GTE9QUFlfVk9MVU1FfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0ZMT1BQWV9JRF9NQVJLX05PVF9GT1VORH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19GTE9QUFlfV1JPTkdfQ1lMSU5ERVJ9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfRkxPUFBZX1VOS05PV05fRVJST1J9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfRkxPUFBZX0JBRF9SRUdJU1RFUlN9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfRElTS19SRUNBTElCUkFURV9GQUlMRUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfRElTS19PUEVSQVRJT05fRkFJTEVEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0RJU0tfUkVTRVRfRkFJTEVEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1NIQVJFRF9JUlFfQlVTWX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19GVF9PUlBIQU5JTkd9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCAweGMwMDAwMTZlfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgMHhjMDAwMDE2Zn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIDB4YzAwMDAxNzB9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCAweGMwMDAwMTcxfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1BBUlRJVElPTl9GQUlMVVJFfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0lOVkFMSURfQkxPQ0tfTEVOR1RIfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0RFVklDRV9OT1RfUEFSVElUSU9ORUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfVU5BQkxFX1RPX0xPQ0tfTUVESUF9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfVU5BQkxFX1RPX1VOTE9BRF9NRURJQX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19FT01fT1ZFUkZMT1d9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTk9fTUVESUF9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCAweGMwMDAwMTc5fSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX05PX1NVQ0hfTUVNQkVSfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0lOVkFMSURfTUVNQkVSfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0tFWV9ERUxFVEVEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX05PX0xPR19TUEFDRX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19UT09fTUFOWV9TSURTfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0xNX0NST1NTX0VOQ1JZUFRJT05fUkVRVUlSRUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfS0VZX0hBU19DSElMRFJFTn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19DSElMRF9NVVNUX0JFX1ZPTEFUSUxFfSwgeworCUVSUkRPUywgODcsIE5UX1NUQVRVU19ERVZJQ0VfQ09ORklHVVJBVElPTl9FUlJPUn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19EUklWRVJfSU5URVJOQUxfRVJST1J9LCB7CisJRVJSRE9TLCAyMiwgTlRfU1RBVFVTX0lOVkFMSURfREVWSUNFX1NUQVRFfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0lPX0RFVklDRV9FUlJPUn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19ERVZJQ0VfUFJPVE9DT0xfRVJST1J9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfQkFDS1VQX0NPTlRST0xMRVJ9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTE9HX0ZJTEVfRlVMTH0sIHsKKwlFUlJET1MsIDE5LCBOVF9TVEFUVVNfVE9PX0xBVEV9LCB7CisJRVJSRE9TLCBFUlJub2FjY2VzcywgTlRfU1RBVFVTX05PX1RSVVNUX0xTQV9TRUNSRVR9LAorLyoJeyBUaGlzIE5UIGVycm9yIGNvZGUgd2FzICdzcWFzaGVkJworCSBmcm9tIE5UX1NUQVRVU19OT19UUlVTVF9TQU1fQUNDT1VOVCB0byBOVF9TVEFUVVNfVFJVU1RFRF9SRUxBVElPTlNISVBfRkFJTFVSRSAKKwkgZHVyaW5nIHRoZSBzZXNzaW9uIHNldHVwIH0gKi8KKwl7CisJRVJSRE9TLCBFUlJub2FjY2VzcywgTlRfU1RBVFVTX05PX1RSVVNUX1NBTV9BQ0NPVU5UfSwgeworCUVSUkRPUywgRVJSbm9hY2Nlc3MsIE5UX1NUQVRVU19UUlVTVEVEX0RPTUFJTl9GQUlMVVJFfSwgeworCUVSUkRPUywgRVJSbm9hY2Nlc3MsIE5UX1NUQVRVU19UUlVTVEVEX1JFTEFUSU9OU0hJUF9GQUlMVVJFfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0VWRU5UTE9HX0ZJTEVfQ09SUlVQVH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19FVkVOVExPR19DQU5UX1NUQVJUfSwgeworCUVSUkRPUywgRVJSbm9hY2Nlc3MsIE5UX1NUQVRVU19UUlVTVF9GQUlMVVJFfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX01VVEFOVF9MSU1JVF9FWENFRURFRH0sIHsKKwlFUlJET1MsIEVSUm5ldGxvZ29uTm90U3RhcnRlZCwgTlRfU1RBVFVTX05FVExPR09OX05PVF9TVEFSVEVEfSwgeworCUVSUlNSViwgMjIzOSwgTlRfU1RBVFVTX0FDQ09VTlRfRVhQSVJFRH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19QT1NTSUJMRV9ERUFETE9DS30sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19ORVRXT1JLX0NSRURFTlRJQUxfQ09ORkxJQ1R9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfUkVNT1RFX1NFU1NJT05fTElNSVR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfRVZFTlRMT0dfRklMRV9DSEFOR0VEfSwgeworCUVSUkRPUywgRVJSbm9hY2Nlc3MsIE5UX1NUQVRVU19OT0xPR09OX0lOVEVSRE9NQUlOX1RSVVNUX0FDQ09VTlR9LCB7CisJRVJSRE9TLCBFUlJub2FjY2VzcywgTlRfU1RBVFVTX05PTE9HT05fV09SS1NUQVRJT05fVFJVU1RfQUNDT1VOVH0sIHsKKwlFUlJET1MsIEVSUm5vYWNjZXNzLCBOVF9TVEFUVVNfTk9MT0dPTl9TRVJWRVJfVFJVU1RfQUNDT1VOVH0sCisvKgl7IFRoaXMgTlQgZXJyb3IgY29kZSB3YXMgJ3NxYXNoZWQnCisJIGZyb20gTlRfU1RBVFVTX0RPTUFJTl9UUlVTVF9JTkNPTlNJU1RFTlQgdG8gTlRfU1RBVFVTX0xPR09OX0ZBSUxVUkUgCisJIGR1cmluZyB0aGUgc2Vzc2lvbiBzZXR1cCB9ICAqLworCXsKKwlFUlJET1MsIEVSUm5vYWNjZXNzLCBOVF9TVEFUVVNfRE9NQUlOX1RSVVNUX0lOQ09OU0lTVEVOVH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19GU19EUklWRVJfUkVRVUlSRUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTk9fVVNFUl9TRVNTSU9OX0tFWX0sIHsKKwlFUlJET1MsIDU5LCBOVF9TVEFUVVNfVVNFUl9TRVNTSU9OX0RFTEVURUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfUkVTT1VSQ0VfTEFOR19OT1RfRk9VTkR9LCB7CisJRVJSRE9TLCBFUlJub21lbSwgTlRfU1RBVFVTX0lOU1VGRl9TRVJWRVJfUkVTT1VSQ0VTfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0lOVkFMSURfQlVGRkVSX1NJWkV9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfSU5WQUxJRF9BRERSRVNTX0NPTVBPTkVOVH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19JTlZBTElEX0FERFJFU1NfV0lMRENBUkR9LCB7CisJRVJSRE9TLCA2OCwgTlRfU1RBVFVTX1RPT19NQU5ZX0FERFJFU1NFU30sIHsKKwlFUlJET1MsIDUyLCBOVF9TVEFUVVNfQUREUkVTU19BTFJFQURZX0VYSVNUU30sIHsKKwlFUlJET1MsIDY0LCBOVF9TVEFUVVNfQUREUkVTU19DTE9TRUR9LCB7CisJRVJSRE9TLCA2NCwgTlRfU1RBVFVTX0NPTk5FQ1RJT05fRElTQ09OTkVDVEVEfSwgeworCUVSUkRPUywgNjQsIE5UX1NUQVRVU19DT05ORUNUSU9OX1JFU0VUfSwgeworCUVSUkRPUywgNjgsIE5UX1NUQVRVU19UT09fTUFOWV9OT0RFU30sIHsKKwlFUlJET1MsIDU5LCBOVF9TVEFUVVNfVFJBTlNBQ1RJT05fQUJPUlRFRH0sIHsKKwlFUlJET1MsIDU5LCBOVF9TVEFUVVNfVFJBTlNBQ1RJT05fVElNRURfT1VUfSwgeworCUVSUkRPUywgNTksIE5UX1NUQVRVU19UUkFOU0FDVElPTl9OT19SRUxFQVNFfSwgeworCUVSUkRPUywgNTksIE5UX1NUQVRVU19UUkFOU0FDVElPTl9OT19NQVRDSH0sIHsKKwlFUlJET1MsIDU5LCBOVF9TVEFUVVNfVFJBTlNBQ1RJT05fUkVTUE9OREVEfSwgeworCUVSUkRPUywgNTksIE5UX1NUQVRVU19UUkFOU0FDVElPTl9JTlZBTElEX0lEfSwgeworCUVSUkRPUywgNTksIE5UX1NUQVRVU19UUkFOU0FDVElPTl9JTlZBTElEX1RZUEV9LCB7CisJRVJSRE9TLCBFUlJ1bnN1cCwgTlRfU1RBVFVTX05PVF9TRVJWRVJfU0VTU0lPTn0sIHsKKwlFUlJET1MsIEVSUnVuc3VwLCBOVF9TVEFUVVNfTk9UX0NMSUVOVF9TRVNTSU9OfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0NBTk5PVF9MT0FEX1JFR0lTVFJZX0ZJTEV9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfREVCVUdfQVRUQUNIX0ZBSUxFRH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19TWVNURU1fUFJPQ0VTU19URVJNSU5BVEVEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0RBVEFfTk9UX0FDQ0VQVEVEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX05PX0JST1dTRVJfU0VSVkVSU19GT1VORH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19WRE1fSEFSRF9FUlJPUn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19EUklWRVJfQ0FOQ0VMX1RJTUVPVVR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfUkVQTFlfTUVTU0FHRV9NSVNNQVRDSH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19NQVBQRURfQUxJR05NRU5UfSwgeworCUVSUkRPUywgMTkzLCBOVF9TVEFUVVNfSU1BR0VfQ0hFQ0tTVU1fTUlTTUFUQ0h9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTE9TVF9XUklURUJFSElORF9EQVRBfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0NMSUVOVF9TRVJWRVJfUEFSQU1FVEVSU19JTlZBTElEfSwgeworCUVSUlNSViwgMjI0MiwgTlRfU1RBVFVTX1BBU1NXT1JEX01VU1RfQ0hBTkdFfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX05PVF9GT1VORH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19OT1RfVElOWV9TVFJFQU19LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfUkVDT1ZFUllfRkFJTFVSRX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19TVEFDS19PVkVSRkxPV19SRUFEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0ZBSUxfQ0hFQ0t9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfRFVQTElDQVRFX09CSkVDVElEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX09CSkVDVElEX0VYSVNUU30sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19DT05WRVJUX1RPX0xBUkdFfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1JFVFJZfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0ZPVU5EX09VVF9PRl9TQ09QRX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19BTExPQ0FURV9CVUNLRVR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfUFJPUFNFVF9OT1RfRk9VTkR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTUFSU0hBTExfT1ZFUkZMT1d9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfSU5WQUxJRF9WQVJJQU5UfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0RPTUFJTl9DT05UUk9MTEVSX05PVF9GT1VORH0sIHsKKwlFUlJET1MsIEVSUm5vYWNjZXNzLCBOVF9TVEFUVVNfQUNDT1VOVF9MT0NLRURfT1VUfSwgeworCUVSUkRPUywgRVJSYmFkZmlkLCBOVF9TVEFUVVNfSEFORExFX05PVF9DTE9TQUJMRX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19DT05ORUNUSU9OX1JFRlVTRUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfR1JBQ0VGVUxfRElTQ09OTkVDVH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19BRERSRVNTX0FMUkVBRFlfQVNTT0NJQVRFRH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19BRERSRVNTX05PVF9BU1NPQ0lBVEVEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0NPTk5FQ1RJT05fSU5WQUxJRH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19DT05ORUNUSU9OX0FDVElWRX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19ORVRXT1JLX1VOUkVBQ0hBQkxFfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0hPU1RfVU5SRUFDSEFCTEV9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfUFJPVE9DT0xfVU5SRUFDSEFCTEV9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfUE9SVF9VTlJFQUNIQUJMRX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19SRVFVRVNUX0FCT1JURUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfQ09OTkVDVElPTl9BQk9SVEVEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0JBRF9DT01QUkVTU0lPTl9CVUZGRVJ9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfVVNFUl9NQVBQRURfRklMRX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19BVURJVF9GQUlMRUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfVElNRVJfUkVTT0xVVElPTl9OT1RfU0VUfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0NPTk5FQ1RJT05fQ09VTlRfTElNSVR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTE9HSU5fVElNRV9SRVNUUklDVElPTn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19MT0dJTl9XS1NUQV9SRVNUUklDVElPTn0sIHsKKwlFUlJET1MsIDE5MywgTlRfU1RBVFVTX0lNQUdFX01QX1VQX01JU01BVENIfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgMHhjMDAwMDI0YX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIDB4YzAwMDAyNGJ9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCAweGMwMDAwMjRjfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgMHhjMDAwMDI0ZH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIDB4YzAwMDAyNGV9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCAweGMwMDAwMjRmfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0lOU1VGRklDSUVOVF9MT0dPTl9JTkZPfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0JBRF9ETExfRU5UUllQT0lOVH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19CQURfU0VSVklDRV9FTlRSWVBPSU5UfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0xQQ19SRVBMWV9MT1NUfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0lQX0FERFJFU1NfQ09ORkxJQ1QxfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0lQX0FERFJFU1NfQ09ORkxJQ1QyfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1JFR0lTVFJZX1FVT1RBX0xJTUlUfSwgeworCUVSUlNSViwgMywgTlRfU1RBVFVTX1BBVEhfTk9UX0NPVkVSRUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfTk9fQ0FMTEJBQ0tfQUNUSVZFfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0xJQ0VOU0VfUVVPVEFfRVhDRUVERUR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfUFdEX1RPT19TSE9SVH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19QV0RfVE9PX1JFQ0VOVH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19QV0RfSElTVE9SWV9DT05GTElDVH0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIDB4YzAwMDAyNWR9LCB7CisJRVJSSFJELCBFUlJnZW5lcmFsLCBOVF9TVEFUVVNfUExVR1BMQVlfTk9fREVWSUNFfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1VOU1VQUE9SVEVEX0NPTVBSRVNTSU9OfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0lOVkFMSURfSFdfUFJPRklMRX0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIE5UX1NUQVRVU19JTlZBTElEX1BMVUdQTEFZX0RFVklDRV9QQVRIfSwgeworCUVSUkRPUywgMTgyLCBOVF9TVEFUVVNfRFJJVkVSX09SRElOQUxfTk9UX0ZPVU5EfSwgeworCUVSUkRPUywgMTI3LCBOVF9TVEFUVVNfRFJJVkVSX0VOVFJZUE9JTlRfTk9UX0ZPVU5EfSwgeworCUVSUkRPUywgMjg4LCBOVF9TVEFUVVNfUkVTT1VSQ0VfTk9UX09XTkVEfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1RPT19NQU5ZX0xJTktTfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX1FVT1RBX0xJU1RfSU5DT05TSVNURU5UfSwgeworCUVSUkhSRCwgRVJSZ2VuZXJhbCwgTlRfU1RBVFVTX0ZJTEVfSVNfT0ZGTElORX0sIHsKKwlFUlJET1MsIDIxLCAweGMwMDAwMjZlfSwgeworCUVSUkRPUywgMTYxLCAweGMwMDAwMjgxfSwgeworCUVSUkRPUywgRVJSbm9hY2Nlc3MsIDB4YzAwMDAyOGF9LCB7CisJRVJSRE9TLCBFUlJub2FjY2VzcywgMHhjMDAwMDI4Yn0sIHsKKwlFUlJIUkQsIEVSUmdlbmVyYWwsIDB4YzAwMDAyOGN9LCB7CisJRVJSRE9TLCBFUlJub2FjY2VzcywgMHhjMDAwMDI4ZH0sIHsKKwlFUlJET1MsIEVSUm5vYWNjZXNzLCAweGMwMDAwMjhlfSwgeworCUVSUkRPUywgRVJSbm9hY2Nlc3MsIDB4YzAwMDAyOGZ9LCB7CisJRVJSRE9TLCBFUlJub2FjY2VzcywgMHhjMDAwMDI5MH0sIHsKKwlFUlJET1MsIEVSUmJhZGZ1bmMsIDB4YzAwMDAyOWN9LCB7CisJRVJSRE9TLCBFUlJpbnZsZXZlbCwgMHgwMDdjMDAwMX0sIH07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIFByaW50IGFuIGVycm9yIG1lc3NhZ2UgZnJvbSB0aGUgc3RhdHVzIGNvZGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitjaWZzX3ByaW50X3N0YXR1cyhfX3UzMiBzdGF0dXNfY29kZSkKK3sKKwlpbnQgaWR4ID0gMDsKKworCXdoaWxlIChudF9lcnJzW2lkeF0ubnRfZXJyc3RyICE9IE5VTEwpIHsKKwkJaWYgKCgobnRfZXJyc1tpZHhdLm50X2VycmNvZGUpICYgMHhGRkZGRkYpID09CisJCSAgICAoc3RhdHVzX2NvZGUgJiAweEZGRkZGRikpIHsKKwkJCXByaW50ayhLRVJOX05PVElDRSAiU3RhdHVzIGNvZGUgcmV0dXJuZWQgMHglMDh4ICVzXG4iLAorCQkJCSAgIHN0YXR1c19jb2RlLG50X2VycnNbaWR4XS5udF9lcnJzdHIpOworCQl9CisJCWlkeCsrOworCX0KKwlyZXR1cm47Cit9CisKKworc3RhdGljIHZvaWQKK250c3RhdHVzX3RvX2RvcyhfX3UzMiBudHN0YXR1cywgX191OCAqIGVjbGFzcywgX191MTYgKiBlY29kZSkKK3sKKwlpbnQgaTsKKwlpZiAobnRzdGF0dXMgPT0gMCkgeworCQkqZWNsYXNzID0gMDsKKwkJKmVjb2RlID0gMDsKKwkJcmV0dXJuOworCX0KKwlmb3IgKGkgPSAwOyBudHN0YXR1c190b19kb3NfbWFwW2ldLm50c3RhdHVzOyBpKyspIHsKKwkJaWYgKG50c3RhdHVzID09IG50c3RhdHVzX3RvX2Rvc19tYXBbaV0ubnRzdGF0dXMpIHsKKwkJCSplY2xhc3MgPSBudHN0YXR1c190b19kb3NfbWFwW2ldLmRvc19jbGFzczsKKwkJCSplY29kZSA9IG50c3RhdHVzX3RvX2Rvc19tYXBbaV0uZG9zX2NvZGU7CisJCQlyZXR1cm47CisJCX0KKwl9CisJKmVjbGFzcyA9IEVSUkhSRDsKKwkqZWNvZGUgPSBFUlJnZW5lcmFsOworfQorCitpbnQKK21hcF9zbWJfdG9fbGludXhfZXJyb3Ioc3RydWN0IHNtYl9oZHIgKnNtYikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmMgPSAtRUlPOwkJLyogaWYgdHJhbnNwb3J0IGVycm9yIHNtYiBlcnJvciBtYXkgbm90IGJlIHNldCAqLworCV9fdTggc21iZXJyY2xhc3M7CisJX191MTYgc21iZXJyY29kZTsKKworCS8qIEJCIGlmIE5UIFN0YXR1cyBjb2RlcyAtIG1hcCBOVCBCQiAqLworCisJLyogb2xkIHN0eWxlIHNtYiBlcnJvciBjb2RlcyAqLworCWlmIChzbWItPlN0YXR1cy5DaWZzRXJyb3IgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc21iLT5GbGFnczIgJiBTTUJGTEcyX0VSUl9TVEFUVVMpIHsKKwkJLyogdHJhbnNsYXRlIHRoZSBuZXdlciBTVEFUVVMgY29kZXMgdG8gb2xkIHN0eWxlIGVycm9ycyBhbmQgdGhlbiB0byBQT1NJWCBlcnJvcnMgKi8KKwkJX191MzIgZXJyID0gbGUzMl90b19jcHUoc21iLT5TdGF0dXMuQ2lmc0Vycm9yKTsKKwkJaWYoY2lmc0ZZSSkKKwkJCWNpZnNfcHJpbnRfc3RhdHVzKGVycik7CisJCW50c3RhdHVzX3RvX2RvcyhlcnIsICZzbWJlcnJjbGFzcywgJnNtYmVycmNvZGUpOworCX0gZWxzZSB7CisJCXNtYmVycmNsYXNzID0gc21iLT5TdGF0dXMuRG9zRXJyb3IuRXJyb3JDbGFzczsKKwkJc21iZXJyY29kZSA9IGxlMTZfdG9fY3B1KHNtYi0+U3RhdHVzLkRvc0Vycm9yLkVycm9yKTsKKwl9CisKKwkvKiBvbGQgc3R5bGUgZXJyb3JzICovCisKKwkvKiBET1MgY2xhc3Mgc21iIGVycm9yIGNvZGVzIC0gbWFwIERPUyAqLworCWlmIChzbWJlcnJjbGFzcyA9PSBFUlJET1MpIHsJLyogb25lIGJ5dGUgZmllbGQgbm8gbmVlZCB0byBieXRlIHJldmVyc2UgKi8KKwkJZm9yIChpID0gMDsKKwkJICAgICBpIDwKKwkJICAgICBzaXplb2YgKG1hcHBpbmdfdGFibGVfRVJSRE9TKSAvCisJCSAgICAgc2l6ZW9mIChzdHJ1Y3Qgc21iX3RvX3Bvc2l4X2Vycm9yKTsgaSsrKSB7CisJCQlpZiAobWFwcGluZ190YWJsZV9FUlJET1NbaV0uc21iX2VyciA9PSAwKQorCQkJCWJyZWFrOworCQkJZWxzZSBpZiAobWFwcGluZ190YWJsZV9FUlJET1NbaV0uc21iX2VyciA9PSBzbWJlcnJjb2RlKSB7CisJCQkJcmMgPSBtYXBwaW5nX3RhYmxlX0VSUkRPU1tpXS5wb3NpeF9jb2RlOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogZWxzZSB0cnkgdGhlIG5leHQgZXJyb3IgbWFwcGluZyBvbmUgdG8gc2VlIGlmIGl0IHdpbGwgbWF0Y2ggKi8KKwkJfQorCX0gZWxzZSBpZiAoc21iZXJyY2xhc3MgPT0gRVJSU1JWKSB7CS8qIHNlcnZlciBjbGFzcyBvZiBlcnJvciBjb2RlcyAqLworCQlmb3IgKGkgPSAwOworCQkgICAgIGkgPAorCQkgICAgIHNpemVvZiAobWFwcGluZ190YWJsZV9FUlJTUlYpIC8KKwkJICAgICBzaXplb2YgKHN0cnVjdCBzbWJfdG9fcG9zaXhfZXJyb3IpOyBpKyspIHsKKwkJCWlmIChtYXBwaW5nX3RhYmxlX0VSUlNSVltpXS5zbWJfZXJyID09IDApCisJCQkJYnJlYWs7CisJCQllbHNlIGlmIChtYXBwaW5nX3RhYmxlX0VSUlNSVltpXS5zbWJfZXJyID09IHNtYmVycmNvZGUpIHsKKwkJCQlyYyA9IG1hcHBpbmdfdGFibGVfRVJSU1JWW2ldLnBvc2l4X2NvZGU7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBlbHNlIHRyeSB0aGUgbmV4dCBlcnJvciBtYXBwaW5nIG9uZSB0byBzZWUgaWYgaXQgd2lsbCBtYXRjaCAqLworCQl9CisJfQorCS8qIGVsc2UgRVJSSFJEIGNsYXNzIGVycm9ycyBvciBqdW5rICAtIHJldHVybiBFSU8gKi8KKworCWNGWUkoMSwgKCIgISFNYXBwaW5nIHNtYiBlcnJvciBjb2RlICVkIHRvIFBPU0lYIGVyciAlZCAhISIsIHNtYmVycmNvZGUscmMpKTsKKworCS8qIGdlbmVyaWMgY29ycmVjdGl2ZSBhY3Rpb24gZS5nLiByZWNvbm5lY3QgU01CIHNlc3Npb24gb24gRVJSYmFkdWlkIGNvdWxkIGJlIGFkZGVkICovCisKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIFNNQiBtZXNzYWdlIGJhc2VkIG9uIHRoZSBmaXhlZCBoZWFkZXIKKyAqIHBvcnRpb24sIHRoZSBudW1iZXIgb2Ygd29yZCBwYXJhbWV0ZXJzIGFuZCB0aGUgZGF0YSBwb3J0aW9uIG9mIHRoZSBtZXNzYWdlCisgKi8KK3Vuc2lnbmVkIGludAorc21iQ2FsY1NpemUoc3RydWN0IHNtYl9oZHIgKnB0cikKK3sKKwlyZXR1cm4gKHNpemVvZiAoc3RydWN0IHNtYl9oZHIpICsgKDIgKiBwdHItPldvcmRDb3VudCkgKworCQlCQ0MocHRyKSk7Cit9CisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIHRha2VuIGZyb20gZnMvbnRmcy91dGlsLmMgKi8KKworI2RlZmluZSBOVEZTX1RJTUVfT0ZGU0VUICgodTY0KSgzNjkqMzY1ICsgODkpICogMjQgKiAzNjAwICogMTAwMDAwMDApCisKKyAgICAvKgorICAgICAqIENvbnZlcnQgdGhlIE5UIFVUQyAoYmFzZWQgMTYwMS0wMS0wMSwgaW4gaHVuZHJlZCBuYW5vc2Vjb25kIHVuaXRzKQorICAgICAqIGludG8gVW5peCBVVEMgKGJhc2VkIDE5NzAtMDEtMDEsIGluIHNlY29uZHMpLgorICAgICAqLworc3RydWN0IHRpbWVzcGVjCitjaWZzX05UdGltZVRvVW5peCh1NjQgbnR1dGMpCit7CisJc3RydWN0IHRpbWVzcGVjIHRzOyAKKwkvKiBCQiB3aGF0IGFib3V0IHRoZSB0aW1lem9uZT8gQkIgKi8KKworCS8qIFN1YnRyYWN0IHRoZSBOVEZTIHRpbWUgb2Zmc2V0LCB0aGVuIGNvbnZlcnQgdG8gMXMgaW50ZXJ2YWxzLiAqLworCXU2NCB0OworCisJdCA9IG50dXRjIC0gTlRGU19USU1FX09GRlNFVDsKKwl0cy50dl9uc2VjID0gZG9fZGl2KHQsIDEwMDAwMDAwKSAqIDEwMDsKKwl0cy50dl9zZWMgPSB0OyAKKwlyZXR1cm4gdHM7Cit9CisKKy8qIENvbnZlcnQgdGhlIFVuaXggVVRDIGludG8gTlQgVVRDLiAqLwordTY0CitjaWZzX1VuaXhUaW1lVG9OVChzdHJ1Y3QgdGltZXNwZWMgdCkKK3sKKwkvKiBDb252ZXJ0IHRvIDEwMG5zIGludGVydmFscyBhbmQgdGhlbiBhZGQgdGhlIE5URlMgdGltZSBvZmZzZXQuICovCisJcmV0dXJuICh1NjQpIHQudHZfc2VjICogMTAwMDAwMDAgKyB0LnR2X25zZWMvMTAwICsgTlRGU19USU1FX09GRlNFVDsKK30KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvbnRlcnIuYyBiL2ZzL2NpZnMvbnRlcnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGE1MGNkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9udGVyci5jCkBAIC0wLDAgKzEsNjg3IEBACisvKiAKKyAqICBVbml4IFNNQi9OZXRiaW9zIGltcGxlbWVudGF0aW9uLgorICogIFZlcnNpb24gMS45LgorICogIFJQQyBQaXBlIGNsaWVudCAvIHNlcnZlciByb3V0aW5lcworICogIENvcHlyaWdodCAoQykgTHVrZSBLZW5uZXRoIENhc3NvbiBMZWlnaHRvbiAxOTk3LTIwMDEuCisgKiAgCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqICAKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICogIAorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKiBOVCBlcnJvciBjb2RlcyAtIHNlZSBudGVyci5oICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgIm50ZXJyLmgiCisKK2NvbnN0IHN0cnVjdCBudF9lcnJfY29kZV9zdHJ1Y3QgbnRfZXJyc1tdID0geworCXsiTlRfU1RBVFVTX09LIiwgTlRfU1RBVFVTX09LfSwKKwl7Ik5UX1NUQVRVU19VTlNVQ0NFU1NGVUwiLCBOVF9TVEFUVVNfVU5TVUNDRVNTRlVMfSwKKwl7Ik5UX1NUQVRVU19OT1RfSU1QTEVNRU5URUQiLCBOVF9TVEFUVVNfTk9UX0lNUExFTUVOVEVEfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX0lORk9fQ0xBU1MiLCBOVF9TVEFUVVNfSU5WQUxJRF9JTkZPX0NMQVNTfSwKKwl7Ik5UX1NUQVRVU19JTkZPX0xFTkdUSF9NSVNNQVRDSCIsIE5UX1NUQVRVU19JTkZPX0xFTkdUSF9NSVNNQVRDSH0sCisJeyJOVF9TVEFUVVNfQUNDRVNTX1ZJT0xBVElPTiIsIE5UX1NUQVRVU19BQ0NFU1NfVklPTEFUSU9OfSwKKwl7IlNUQVRVU19CVUZGRVJfT1ZFUkZMT1ciLCBTVEFUVVNfQlVGRkVSX09WRVJGTE9XfSwKKwl7Ik5UX1NUQVRVU19JTl9QQUdFX0VSUk9SIiwgTlRfU1RBVFVTX0lOX1BBR0VfRVJST1J9LAorCXsiTlRfU1RBVFVTX1BBR0VGSUxFX1FVT1RBIiwgTlRfU1RBVFVTX1BBR0VGSUxFX1FVT1RBfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX0hBTkRMRSIsIE5UX1NUQVRVU19JTlZBTElEX0hBTkRMRX0sCisJeyJOVF9TVEFUVVNfQkFEX0lOSVRJQUxfU1RBQ0siLCBOVF9TVEFUVVNfQkFEX0lOSVRJQUxfU1RBQ0t9LAorCXsiTlRfU1RBVFVTX0JBRF9JTklUSUFMX1BDIiwgTlRfU1RBVFVTX0JBRF9JTklUSUFMX1BDfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX0NJRCIsIE5UX1NUQVRVU19JTlZBTElEX0NJRH0sCisJeyJOVF9TVEFUVVNfVElNRVJfTk9UX0NBTkNFTEVEIiwgTlRfU1RBVFVTX1RJTUVSX05PVF9DQU5DRUxFRH0sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVIiLCBOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJ9LAorCXsiTlRfU1RBVFVTX05PX1NVQ0hfREVWSUNFIiwgTlRfU1RBVFVTX05PX1NVQ0hfREVWSUNFfSwKKwl7Ik5UX1NUQVRVU19OT19TVUNIX0ZJTEUiLCBOVF9TVEFUVVNfTk9fU1VDSF9GSUxFfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX0RFVklDRV9SRVFVRVNUIiwKKwkgTlRfU1RBVFVTX0lOVkFMSURfREVWSUNFX1JFUVVFU1R9LAorCXsiTlRfU1RBVFVTX0VORF9PRl9GSUxFIiwgTlRfU1RBVFVTX0VORF9PRl9GSUxFfSwKKwl7Ik5UX1NUQVRVU19XUk9OR19WT0xVTUUiLCBOVF9TVEFUVVNfV1JPTkdfVk9MVU1FfSwKKwl7Ik5UX1NUQVRVU19OT19NRURJQV9JTl9ERVZJQ0UiLCBOVF9TVEFUVVNfTk9fTUVESUFfSU5fREVWSUNFfSwKKwl7Ik5UX1NUQVRVU19VTlJFQ09HTklaRURfTUVESUEiLCBOVF9TVEFUVVNfVU5SRUNPR05JWkVEX01FRElBfSwKKwl7Ik5UX1NUQVRVU19OT05FWElTVEVOVF9TRUNUT1IiLCBOVF9TVEFUVVNfTk9ORVhJU1RFTlRfU0VDVE9SfSwKKwl7Ik5UX1NUQVRVU19NT1JFX1BST0NFU1NJTkdfUkVRVUlSRUQiLAorCSBOVF9TVEFUVVNfTU9SRV9QUk9DRVNTSU5HX1JFUVVJUkVEfSwKKwl7Ik5UX1NUQVRVU19OT19NRU1PUlkiLCBOVF9TVEFUVVNfTk9fTUVNT1JZfSwKKwl7Ik5UX1NUQVRVU19DT05GTElDVElOR19BRERSRVNTRVMiLAorCSBOVF9TVEFUVVNfQ09ORkxJQ1RJTkdfQUREUkVTU0VTfSwKKwl7Ik5UX1NUQVRVU19OT1RfTUFQUEVEX1ZJRVciLCBOVF9TVEFUVVNfTk9UX01BUFBFRF9WSUVXfSwKKwl7Ik5UX1NUQVRVU19VTkFCTEVfVE9fRlJFRV9WTSIsIE5UX1NUQVRVU19VTkFCTEVfVE9fRlJFRV9WTX0sCisJeyJOVF9TVEFUVVNfVU5BQkxFX1RPX0RFTEVURV9TRUNUSU9OIiwKKwkgTlRfU1RBVFVTX1VOQUJMRV9UT19ERUxFVEVfU0VDVElPTn0sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9TWVNURU1fU0VSVklDRSIsCisJIE5UX1NUQVRVU19JTlZBTElEX1NZU1RFTV9TRVJWSUNFfSwKKwl7Ik5UX1NUQVRVU19JTExFR0FMX0lOU1RSVUNUSU9OIiwgTlRfU1RBVFVTX0lMTEVHQUxfSU5TVFJVQ1RJT059LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfTE9DS19TRVFVRU5DRSIsCisJIE5UX1NUQVRVU19JTlZBTElEX0xPQ0tfU0VRVUVOQ0V9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfVklFV19TSVpFIiwgTlRfU1RBVFVTX0lOVkFMSURfVklFV19TSVpFfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX0ZJTEVfRk9SX1NFQ1RJT04iLAorCSBOVF9TVEFUVVNfSU5WQUxJRF9GSUxFX0ZPUl9TRUNUSU9OfSwKKwl7Ik5UX1NUQVRVU19BTFJFQURZX0NPTU1JVFRFRCIsIE5UX1NUQVRVU19BTFJFQURZX0NPTU1JVFRFRH0sCisJeyJOVF9TVEFUVVNfQUNDRVNTX0RFTklFRCIsIE5UX1NUQVRVU19BQ0NFU1NfREVOSUVEfSwKKwl7Ik5UX1NUQVRVU19CVUZGRVJfVE9PX1NNQUxMIiwgTlRfU1RBVFVTX0JVRkZFUl9UT09fU01BTEx9LAorCXsiTlRfU1RBVFVTX09CSkVDVF9UWVBFX01JU01BVENIIiwgTlRfU1RBVFVTX09CSkVDVF9UWVBFX01JU01BVENIfSwKKwl7Ik5UX1NUQVRVU19OT05DT05USU5VQUJMRV9FWENFUFRJT04iLAorCSBOVF9TVEFUVVNfTk9OQ09OVElOVUFCTEVfRVhDRVBUSU9OfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX0RJU1BPU0lUSU9OIiwgTlRfU1RBVFVTX0lOVkFMSURfRElTUE9TSVRJT059LAorCXsiTlRfU1RBVFVTX1VOV0lORCIsIE5UX1NUQVRVU19VTldJTkR9LAorCXsiTlRfU1RBVFVTX0JBRF9TVEFDSyIsIE5UX1NUQVRVU19CQURfU1RBQ0t9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfVU5XSU5EX1RBUkdFVCIsCisJIE5UX1NUQVRVU19JTlZBTElEX1VOV0lORF9UQVJHRVR9LAorCXsiTlRfU1RBVFVTX05PVF9MT0NLRUQiLCBOVF9TVEFUVVNfTk9UX0xPQ0tFRH0sCisJeyJOVF9TVEFUVVNfUEFSSVRZX0VSUk9SIiwgTlRfU1RBVFVTX1BBUklUWV9FUlJPUn0sCisJeyJOVF9TVEFUVVNfVU5BQkxFX1RPX0RFQ09NTUlUX1ZNIiwKKwkgTlRfU1RBVFVTX1VOQUJMRV9UT19ERUNPTU1JVF9WTX0sCisJeyJOVF9TVEFUVVNfTk9UX0NPTU1JVFRFRCIsIE5UX1NUQVRVU19OT1RfQ09NTUlUVEVEfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX1BPUlRfQVRUUklCVVRFUyIsCisJIE5UX1NUQVRVU19JTlZBTElEX1BPUlRfQVRUUklCVVRFU30sCisJeyJOVF9TVEFUVVNfUE9SVF9NRVNTQUdFX1RPT19MT05HIiwKKwkgTlRfU1RBVFVTX1BPUlRfTUVTU0FHRV9UT09fTE9OR30sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfTUlYIiwKKwkgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSX01JWH0sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9RVU9UQV9MT1dFUiIsIE5UX1NUQVRVU19JTlZBTElEX1FVT1RBX0xPV0VSfSwKKwl7Ik5UX1NUQVRVU19ESVNLX0NPUlJVUFRfRVJST1IiLCBOVF9TVEFUVVNfRElTS19DT1JSVVBUX0VSUk9SfSwKKwl7Ik5UX1NUQVRVU19PQkpFQ1RfTkFNRV9JTlZBTElEIiwgTlRfU1RBVFVTX09CSkVDVF9OQU1FX0lOVkFMSUR9LAorCXsiTlRfU1RBVFVTX09CSkVDVF9OQU1FX05PVF9GT1VORCIsCisJIE5UX1NUQVRVU19PQkpFQ1RfTkFNRV9OT1RfRk9VTkR9LAorCXsiTlRfU1RBVFVTX09CSkVDVF9OQU1FX0NPTExJU0lPTiIsCisJIE5UX1NUQVRVU19PQkpFQ1RfTkFNRV9DT0xMSVNJT059LAorCXsiTlRfU1RBVFVTX0hBTkRMRV9OT1RfV0FJVEFCTEUiLCBOVF9TVEFUVVNfSEFORExFX05PVF9XQUlUQUJMRX0sCisJeyJOVF9TVEFUVVNfUE9SVF9ESVNDT05ORUNURUQiLCBOVF9TVEFUVVNfUE9SVF9ESVNDT05ORUNURUR9LAorCXsiTlRfU1RBVFVTX0RFVklDRV9BTFJFQURZX0FUVEFDSEVEIiwKKwkgTlRfU1RBVFVTX0RFVklDRV9BTFJFQURZX0FUVEFDSEVEfSwKKwl7Ik5UX1NUQVRVU19PQkpFQ1RfUEFUSF9JTlZBTElEIiwgTlRfU1RBVFVTX09CSkVDVF9QQVRIX0lOVkFMSUR9LAorCXsiTlRfU1RBVFVTX09CSkVDVF9QQVRIX05PVF9GT1VORCIsCisJIE5UX1NUQVRVU19PQkpFQ1RfUEFUSF9OT1RfRk9VTkR9LAorCXsiTlRfU1RBVFVTX09CSkVDVF9QQVRIX1NZTlRBWF9CQUQiLAorCSBOVF9TVEFUVVNfT0JKRUNUX1BBVEhfU1lOVEFYX0JBRH0sCisJeyJOVF9TVEFUVVNfREFUQV9PVkVSUlVOIiwgTlRfU1RBVFVTX0RBVEFfT1ZFUlJVTn0sCisJeyJOVF9TVEFUVVNfREFUQV9MQVRFX0VSUk9SIiwgTlRfU1RBVFVTX0RBVEFfTEFURV9FUlJPUn0sCisJeyJOVF9TVEFUVVNfREFUQV9FUlJPUiIsIE5UX1NUQVRVU19EQVRBX0VSUk9SfSwKKwl7Ik5UX1NUQVRVU19DUkNfRVJST1IiLCBOVF9TVEFUVVNfQ1JDX0VSUk9SfSwKKwl7Ik5UX1NUQVRVU19TRUNUSU9OX1RPT19CSUciLCBOVF9TVEFUVVNfU0VDVElPTl9UT09fQklHfSwKKwl7Ik5UX1NUQVRVU19QT1JUX0NPTk5FQ1RJT05fUkVGVVNFRCIsCisJIE5UX1NUQVRVU19QT1JUX0NPTk5FQ1RJT05fUkVGVVNFRH0sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9QT1JUX0hBTkRMRSIsIE5UX1NUQVRVU19JTlZBTElEX1BPUlRfSEFORExFfSwKKwl7Ik5UX1NUQVRVU19TSEFSSU5HX1ZJT0xBVElPTiIsIE5UX1NUQVRVU19TSEFSSU5HX1ZJT0xBVElPTn0sCisJeyJOVF9TVEFUVVNfUVVPVEFfRVhDRUVERUQiLCBOVF9TVEFUVVNfUVVPVEFfRVhDRUVERUR9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfUEFHRV9QUk9URUNUSU9OIiwKKwkgTlRfU1RBVFVTX0lOVkFMSURfUEFHRV9QUk9URUNUSU9OfSwKKwl7Ik5UX1NUQVRVU19NVVRBTlRfTk9UX09XTkVEIiwgTlRfU1RBVFVTX01VVEFOVF9OT1RfT1dORUR9LAorCXsiTlRfU1RBVFVTX1NFTUFQSE9SRV9MSU1JVF9FWENFRURFRCIsCisJIE5UX1NUQVRVU19TRU1BUEhPUkVfTElNSVRfRVhDRUVERUR9LAorCXsiTlRfU1RBVFVTX1BPUlRfQUxSRUFEWV9TRVQiLCBOVF9TVEFUVVNfUE9SVF9BTFJFQURZX1NFVH0sCisJeyJOVF9TVEFUVVNfU0VDVElPTl9OT1RfSU1BR0UiLCBOVF9TVEFUVVNfU0VDVElPTl9OT1RfSU1BR0V9LAorCXsiTlRfU1RBVFVTX1NVU1BFTkRfQ09VTlRfRVhDRUVERUQiLAorCSBOVF9TVEFUVVNfU1VTUEVORF9DT1VOVF9FWENFRURFRH0sCisJeyJOVF9TVEFUVVNfVEhSRUFEX0lTX1RFUk1JTkFUSU5HIiwKKwkgTlRfU1RBVFVTX1RIUkVBRF9JU19URVJNSU5BVElOR30sCisJeyJOVF9TVEFUVVNfQkFEX1dPUktJTkdfU0VUX0xJTUlUIiwKKwkgTlRfU1RBVFVTX0JBRF9XT1JLSU5HX1NFVF9MSU1JVH0sCisJeyJOVF9TVEFUVVNfSU5DT01QQVRJQkxFX0ZJTEVfTUFQIiwKKwkgTlRfU1RBVFVTX0lOQ09NUEFUSUJMRV9GSUxFX01BUH0sCisJeyJOVF9TVEFUVVNfU0VDVElPTl9QUk9URUNUSU9OIiwgTlRfU1RBVFVTX1NFQ1RJT05fUFJPVEVDVElPTn0sCisJeyJOVF9TVEFUVVNfRUFTX05PVF9TVVBQT1JURUQiLCBOVF9TVEFUVVNfRUFTX05PVF9TVVBQT1JURUR9LAorCXsiTlRfU1RBVFVTX0VBX1RPT19MQVJHRSIsIE5UX1NUQVRVU19FQV9UT09fTEFSR0V9LAorCXsiTlRfU1RBVFVTX05PTkVYSVNURU5UX0VBX0VOVFJZIiwgTlRfU1RBVFVTX05PTkVYSVNURU5UX0VBX0VOVFJZfSwKKwl7Ik5UX1NUQVRVU19OT19FQVNfT05fRklMRSIsIE5UX1NUQVRVU19OT19FQVNfT05fRklMRX0sCisJeyJOVF9TVEFUVVNfRUFfQ09SUlVQVF9FUlJPUiIsIE5UX1NUQVRVU19FQV9DT1JSVVBUX0VSUk9SfSwKKwl7Ik5UX1NUQVRVU19GSUxFX0xPQ0tfQ09ORkxJQ1QiLCBOVF9TVEFUVVNfRklMRV9MT0NLX0NPTkZMSUNUfSwKKwl7Ik5UX1NUQVRVU19MT0NLX05PVF9HUkFOVEVEIiwgTlRfU1RBVFVTX0xPQ0tfTk9UX0dSQU5URUR9LAorCXsiTlRfU1RBVFVTX0RFTEVURV9QRU5ESU5HIiwgTlRfU1RBVFVTX0RFTEVURV9QRU5ESU5HfSwKKwl7Ik5UX1NUQVRVU19DVExfRklMRV9OT1RfU1VQUE9SVEVEIiwKKwkgTlRfU1RBVFVTX0NUTF9GSUxFX05PVF9TVVBQT1JURUR9LAorCXsiTlRfU1RBVFVTX1VOS05PV05fUkVWSVNJT04iLCBOVF9TVEFUVVNfVU5LTk9XTl9SRVZJU0lPTn0sCisJeyJOVF9TVEFUVVNfUkVWSVNJT05fTUlTTUFUQ0giLCBOVF9TVEFUVVNfUkVWSVNJT05fTUlTTUFUQ0h9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfT1dORVIiLCBOVF9TVEFUVVNfSU5WQUxJRF9PV05FUn0sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9QUklNQVJZX0dST1VQIiwKKwkgTlRfU1RBVFVTX0lOVkFMSURfUFJJTUFSWV9HUk9VUH0sCisJeyJOVF9TVEFUVVNfTk9fSU1QRVJTT05BVElPTl9UT0tFTiIsCisJIE5UX1NUQVRVU19OT19JTVBFUlNPTkFUSU9OX1RPS0VOfSwKKwl7Ik5UX1NUQVRVU19DQU5UX0RJU0FCTEVfTUFOREFUT1JZIiwKKwkgTlRfU1RBVFVTX0NBTlRfRElTQUJMRV9NQU5EQVRPUll9LAorCXsiTlRfU1RBVFVTX05PX0xPR09OX1NFUlZFUlMiLCBOVF9TVEFUVVNfTk9fTE9HT05fU0VSVkVSU30sCisJeyJOVF9TVEFUVVNfTk9fU1VDSF9MT0dPTl9TRVNTSU9OIiwKKwkgTlRfU1RBVFVTX05PX1NVQ0hfTE9HT05fU0VTU0lPTn0sCisJeyJOVF9TVEFUVVNfTk9fU1VDSF9QUklWSUxFR0UiLCBOVF9TVEFUVVNfTk9fU1VDSF9QUklWSUxFR0V9LAorCXsiTlRfU1RBVFVTX1BSSVZJTEVHRV9OT1RfSEVMRCIsIE5UX1NUQVRVU19QUklWSUxFR0VfTk9UX0hFTER9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfQUNDT1VOVF9OQU1FIiwgTlRfU1RBVFVTX0lOVkFMSURfQUNDT1VOVF9OQU1FfSwKKwl7Ik5UX1NUQVRVU19VU0VSX0VYSVNUUyIsIE5UX1NUQVRVU19VU0VSX0VYSVNUU30sCisJeyJOVF9TVEFUVVNfTk9fU1VDSF9VU0VSIiwgTlRfU1RBVFVTX05PX1NVQ0hfVVNFUn0sCisJeyJOVF9TVEFUVVNfR1JPVVBfRVhJU1RTIiwgTlRfU1RBVFVTX0dST1VQX0VYSVNUU30sCisJeyJOVF9TVEFUVVNfTk9fU1VDSF9HUk9VUCIsIE5UX1NUQVRVU19OT19TVUNIX0dST1VQfSwKKwl7Ik5UX1NUQVRVU19NRU1CRVJfSU5fR1JPVVAiLCBOVF9TVEFUVVNfTUVNQkVSX0lOX0dST1VQfSwKKwl7Ik5UX1NUQVRVU19NRU1CRVJfTk9UX0lOX0dST1VQIiwgTlRfU1RBVFVTX01FTUJFUl9OT1RfSU5fR1JPVVB9LAorCXsiTlRfU1RBVFVTX0xBU1RfQURNSU4iLCBOVF9TVEFUVVNfTEFTVF9BRE1JTn0sCisJeyJOVF9TVEFUVVNfV1JPTkdfUEFTU1dPUkQiLCBOVF9TVEFUVVNfV1JPTkdfUEFTU1dPUkR9LAorCXsiTlRfU1RBVFVTX0lMTF9GT1JNRURfUEFTU1dPUkQiLCBOVF9TVEFUVVNfSUxMX0ZPUk1FRF9QQVNTV09SRH0sCisJeyJOVF9TVEFUVVNfUEFTU1dPUkRfUkVTVFJJQ1RJT04iLCBOVF9TVEFUVVNfUEFTU1dPUkRfUkVTVFJJQ1RJT059LAorCXsiTlRfU1RBVFVTX0xPR09OX0ZBSUxVUkUiLCBOVF9TVEFUVVNfTE9HT05fRkFJTFVSRX0sCisJeyJOVF9TVEFUVVNfQUNDT1VOVF9SRVNUUklDVElPTiIsIE5UX1NUQVRVU19BQ0NPVU5UX1JFU1RSSUNUSU9OfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX0xPR09OX0hPVVJTIiwgTlRfU1RBVFVTX0lOVkFMSURfTE9HT05fSE9VUlN9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfV09SS1NUQVRJT04iLCBOVF9TVEFUVVNfSU5WQUxJRF9XT1JLU1RBVElPTn0sCisJeyJOVF9TVEFUVVNfUEFTU1dPUkRfRVhQSVJFRCIsIE5UX1NUQVRVU19QQVNTV09SRF9FWFBJUkVEfSwKKwl7Ik5UX1NUQVRVU19BQ0NPVU5UX0RJU0FCTEVEIiwgTlRfU1RBVFVTX0FDQ09VTlRfRElTQUJMRUR9LAorCXsiTlRfU1RBVFVTX05PTkVfTUFQUEVEIiwgTlRfU1RBVFVTX05PTkVfTUFQUEVEfSwKKwl7Ik5UX1NUQVRVU19UT09fTUFOWV9MVUlEU19SRVFVRVNURUQiLAorCSBOVF9TVEFUVVNfVE9PX01BTllfTFVJRFNfUkVRVUVTVEVEfSwKKwl7Ik5UX1NUQVRVU19MVUlEU19FWEhBVVNURUQiLCBOVF9TVEFUVVNfTFVJRFNfRVhIQVVTVEVEfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX1NVQl9BVVRIT1JJVFkiLAorCSBOVF9TVEFUVVNfSU5WQUxJRF9TVUJfQVVUSE9SSVRZfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX0FDTCIsIE5UX1NUQVRVU19JTlZBTElEX0FDTH0sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9TSUQiLCBOVF9TVEFUVVNfSU5WQUxJRF9TSUR9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfU0VDVVJJVFlfREVTQ1IiLAorCSBOVF9TVEFUVVNfSU5WQUxJRF9TRUNVUklUWV9ERVNDUn0sCisJeyJOVF9TVEFUVVNfUFJPQ0VEVVJFX05PVF9GT1VORCIsIE5UX1NUQVRVU19QUk9DRURVUkVfTk9UX0ZPVU5EfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX0lNQUdFX0ZPUk1BVCIsIE5UX1NUQVRVU19JTlZBTElEX0lNQUdFX0ZPUk1BVH0sCisJeyJOVF9TVEFUVVNfTk9fVE9LRU4iLCBOVF9TVEFUVVNfTk9fVE9LRU59LAorCXsiTlRfU1RBVFVTX0JBRF9JTkhFUklUQU5DRV9BQ0wiLCBOVF9TVEFUVVNfQkFEX0lOSEVSSVRBTkNFX0FDTH0sCisJeyJOVF9TVEFUVVNfUkFOR0VfTk9UX0xPQ0tFRCIsIE5UX1NUQVRVU19SQU5HRV9OT1RfTE9DS0VEfSwKKwl7Ik5UX1NUQVRVU19ESVNLX0ZVTEwiLCBOVF9TVEFUVVNfRElTS19GVUxMfSwKKwl7Ik5UX1NUQVRVU19TRVJWRVJfRElTQUJMRUQiLCBOVF9TVEFUVVNfU0VSVkVSX0RJU0FCTEVEfSwKKwl7Ik5UX1NUQVRVU19TRVJWRVJfTk9UX0RJU0FCTEVEIiwgTlRfU1RBVFVTX1NFUlZFUl9OT1RfRElTQUJMRUR9LAorCXsiTlRfU1RBVFVTX1RPT19NQU5ZX0dVSURTX1JFUVVFU1RFRCIsCisJIE5UX1NUQVRVU19UT09fTUFOWV9HVUlEU19SRVFVRVNURUR9LAorCXsiTlRfU1RBVFVTX0dVSURTX0VYSEFVU1RFRCIsIE5UX1NUQVRVU19HVUlEU19FWEhBVVNURUR9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfSURfQVVUSE9SSVRZIiwgTlRfU1RBVFVTX0lOVkFMSURfSURfQVVUSE9SSVRZfSwKKwl7Ik5UX1NUQVRVU19BR0VOVFNfRVhIQVVTVEVEIiwgTlRfU1RBVFVTX0FHRU5UU19FWEhBVVNURUR9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfVk9MVU1FX0xBQkVMIiwgTlRfU1RBVFVTX0lOVkFMSURfVk9MVU1FX0xBQkVMfSwKKwl7Ik5UX1NUQVRVU19TRUNUSU9OX05PVF9FWFRFTkRFRCIsIE5UX1NUQVRVU19TRUNUSU9OX05PVF9FWFRFTkRFRH0sCisJeyJOVF9TVEFUVVNfTk9UX01BUFBFRF9EQVRBIiwgTlRfU1RBVFVTX05PVF9NQVBQRURfREFUQX0sCisJeyJOVF9TVEFUVVNfUkVTT1VSQ0VfREFUQV9OT1RfRk9VTkQiLAorCSBOVF9TVEFUVVNfUkVTT1VSQ0VfREFUQV9OT1RfRk9VTkR9LAorCXsiTlRfU1RBVFVTX1JFU09VUkNFX1RZUEVfTk9UX0ZPVU5EIiwKKwkgTlRfU1RBVFVTX1JFU09VUkNFX1RZUEVfTk9UX0ZPVU5EfSwKKwl7Ik5UX1NUQVRVU19SRVNPVVJDRV9OQU1FX05PVF9GT1VORCIsCisJIE5UX1NUQVRVU19SRVNPVVJDRV9OQU1FX05PVF9GT1VORH0sCisJeyJOVF9TVEFUVVNfQVJSQVlfQk9VTkRTX0VYQ0VFREVEIiwKKwkgTlRfU1RBVFVTX0FSUkFZX0JPVU5EU19FWENFRURFRH0sCisJeyJOVF9TVEFUVVNfRkxPQVRfREVOT1JNQUxfT1BFUkFORCIsCisJIE5UX1NUQVRVU19GTE9BVF9ERU5PUk1BTF9PUEVSQU5EfSwKKwl7Ik5UX1NUQVRVU19GTE9BVF9ESVZJREVfQllfWkVSTyIsIE5UX1NUQVRVU19GTE9BVF9ESVZJREVfQllfWkVST30sCisJeyJOVF9TVEFUVVNfRkxPQVRfSU5FWEFDVF9SRVNVTFQiLCBOVF9TVEFUVVNfRkxPQVRfSU5FWEFDVF9SRVNVTFR9LAorCXsiTlRfU1RBVFVTX0ZMT0FUX0lOVkFMSURfT1BFUkFUSU9OIiwKKwkgTlRfU1RBVFVTX0ZMT0FUX0lOVkFMSURfT1BFUkFUSU9OfSwKKwl7Ik5UX1NUQVRVU19GTE9BVF9PVkVSRkxPVyIsIE5UX1NUQVRVU19GTE9BVF9PVkVSRkxPV30sCisJeyJOVF9TVEFUVVNfRkxPQVRfU1RBQ0tfQ0hFQ0siLCBOVF9TVEFUVVNfRkxPQVRfU1RBQ0tfQ0hFQ0t9LAorCXsiTlRfU1RBVFVTX0ZMT0FUX1VOREVSRkxPVyIsIE5UX1NUQVRVU19GTE9BVF9VTkRFUkZMT1d9LAorCXsiTlRfU1RBVFVTX0lOVEVHRVJfRElWSURFX0JZX1pFUk8iLAorCSBOVF9TVEFUVVNfSU5URUdFUl9ESVZJREVfQllfWkVST30sCisJeyJOVF9TVEFUVVNfSU5URUdFUl9PVkVSRkxPVyIsIE5UX1NUQVRVU19JTlRFR0VSX09WRVJGTE9XfSwKKwl7Ik5UX1NUQVRVU19QUklWSUxFR0VEX0lOU1RSVUNUSU9OIiwKKwkgTlRfU1RBVFVTX1BSSVZJTEVHRURfSU5TVFJVQ1RJT059LAorCXsiTlRfU1RBVFVTX1RPT19NQU5ZX1BBR0lOR19GSUxFUyIsCisJIE5UX1NUQVRVU19UT09fTUFOWV9QQUdJTkdfRklMRVN9LAorCXsiTlRfU1RBVFVTX0ZJTEVfSU5WQUxJRCIsIE5UX1NUQVRVU19GSUxFX0lOVkFMSUR9LAorCXsiTlRfU1RBVFVTX0FMTE9UVEVEX1NQQUNFX0VYQ0VFREVEIiwKKwkgTlRfU1RBVFVTX0FMTE9UVEVEX1NQQUNFX0VYQ0VFREVEfSwKKwl7Ik5UX1NUQVRVU19JTlNVRkZJQ0lFTlRfUkVTT1VSQ0VTIiwKKwkgTlRfU1RBVFVTX0lOU1VGRklDSUVOVF9SRVNPVVJDRVN9LAorCXsiTlRfU1RBVFVTX0RGU19FWElUX1BBVEhfRk9VTkQiLCBOVF9TVEFUVVNfREZTX0VYSVRfUEFUSF9GT1VORH0sCisJeyJOVF9TVEFUVVNfREVWSUNFX0RBVEFfRVJST1IiLCBOVF9TVEFUVVNfREVWSUNFX0RBVEFfRVJST1J9LAorCXsiTlRfU1RBVFVTX0RFVklDRV9OT1RfQ09OTkVDVEVEIiwgTlRfU1RBVFVTX0RFVklDRV9OT1RfQ09OTkVDVEVEfSwKKwl7Ik5UX1NUQVRVU19ERVZJQ0VfUE9XRVJfRkFJTFVSRSIsIE5UX1NUQVRVU19ERVZJQ0VfUE9XRVJfRkFJTFVSRX0sCisJeyJOVF9TVEFUVVNfRlJFRV9WTV9OT1RfQVRfQkFTRSIsIE5UX1NUQVRVU19GUkVFX1ZNX05PVF9BVF9CQVNFfSwKKwl7Ik5UX1NUQVRVU19NRU1PUllfTk9UX0FMTE9DQVRFRCIsIE5UX1NUQVRVU19NRU1PUllfTk9UX0FMTE9DQVRFRH0sCisJeyJOVF9TVEFUVVNfV09SS0lOR19TRVRfUVVPVEEiLCBOVF9TVEFUVVNfV09SS0lOR19TRVRfUVVPVEF9LAorCXsiTlRfU1RBVFVTX01FRElBX1dSSVRFX1BST1RFQ1RFRCIsCisJIE5UX1NUQVRVU19NRURJQV9XUklURV9QUk9URUNURUR9LAorCXsiTlRfU1RBVFVTX0RFVklDRV9OT1RfUkVBRFkiLCBOVF9TVEFUVVNfREVWSUNFX05PVF9SRUFEWX0sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9HUk9VUF9BVFRSSUJVVEVTIiwKKwkgTlRfU1RBVFVTX0lOVkFMSURfR1JPVVBfQVRUUklCVVRFU30sCisJeyJOVF9TVEFUVVNfQkFEX0lNUEVSU09OQVRJT05fTEVWRUwiLAorCSBOVF9TVEFUVVNfQkFEX0lNUEVSU09OQVRJT05fTEVWRUx9LAorCXsiTlRfU1RBVFVTX0NBTlRfT1BFTl9BTk9OWU1PVVMiLCBOVF9TVEFUVVNfQ0FOVF9PUEVOX0FOT05ZTU9VU30sCisJeyJOVF9TVEFUVVNfQkFEX1ZBTElEQVRJT05fQ0xBU1MiLCBOVF9TVEFUVVNfQkFEX1ZBTElEQVRJT05fQ0xBU1N9LAorCXsiTlRfU1RBVFVTX0JBRF9UT0tFTl9UWVBFIiwgTlRfU1RBVFVTX0JBRF9UT0tFTl9UWVBFfSwKKwl7Ik5UX1NUQVRVU19CQURfTUFTVEVSX0JPT1RfUkVDT1JEIiwKKwkgTlRfU1RBVFVTX0JBRF9NQVNURVJfQk9PVF9SRUNPUkR9LAorCXsiTlRfU1RBVFVTX0lOU1RSVUNUSU9OX01JU0FMSUdOTUVOVCIsCisJIE5UX1NUQVRVU19JTlNUUlVDVElPTl9NSVNBTElHTk1FTlR9LAorCXsiTlRfU1RBVFVTX0lOU1RBTkNFX05PVF9BVkFJTEFCTEUiLAorCSBOVF9TVEFUVVNfSU5TVEFOQ0VfTk9UX0FWQUlMQUJMRX0sCisJeyJOVF9TVEFUVVNfUElQRV9OT1RfQVZBSUxBQkxFIiwgTlRfU1RBVFVTX1BJUEVfTk9UX0FWQUlMQUJMRX0sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9QSVBFX1NUQVRFIiwgTlRfU1RBVFVTX0lOVkFMSURfUElQRV9TVEFURX0sCisJeyJOVF9TVEFUVVNfUElQRV9CVVNZIiwgTlRfU1RBVFVTX1BJUEVfQlVTWX0sCisJeyJOVF9TVEFUVVNfSUxMRUdBTF9GVU5DVElPTiIsIE5UX1NUQVRVU19JTExFR0FMX0ZVTkNUSU9OfSwKKwl7Ik5UX1NUQVRVU19QSVBFX0RJU0NPTk5FQ1RFRCIsIE5UX1NUQVRVU19QSVBFX0RJU0NPTk5FQ1RFRH0sCisJeyJOVF9TVEFUVVNfUElQRV9DTE9TSU5HIiwgTlRfU1RBVFVTX1BJUEVfQ0xPU0lOR30sCisJeyJOVF9TVEFUVVNfUElQRV9DT05ORUNURUQiLCBOVF9TVEFUVVNfUElQRV9DT05ORUNURUR9LAorCXsiTlRfU1RBVFVTX1BJUEVfTElTVEVOSU5HIiwgTlRfU1RBVFVTX1BJUEVfTElTVEVOSU5HfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX1JFQURfTU9ERSIsIE5UX1NUQVRVU19JTlZBTElEX1JFQURfTU9ERX0sCisJeyJOVF9TVEFUVVNfSU9fVElNRU9VVCIsIE5UX1NUQVRVU19JT19USU1FT1VUfSwKKwl7Ik5UX1NUQVRVU19GSUxFX0ZPUkNFRF9DTE9TRUQiLCBOVF9TVEFUVVNfRklMRV9GT1JDRURfQ0xPU0VEfSwKKwl7Ik5UX1NUQVRVU19QUk9GSUxJTkdfTk9UX1NUQVJURUQiLAorCSBOVF9TVEFUVVNfUFJPRklMSU5HX05PVF9TVEFSVEVEfSwKKwl7Ik5UX1NUQVRVU19QUk9GSUxJTkdfTk9UX1NUT1BQRUQiLAorCSBOVF9TVEFUVVNfUFJPRklMSU5HX05PVF9TVE9QUEVEfSwKKwl7Ik5UX1NUQVRVU19DT1VMRF9OT1RfSU5URVJQUkVUIiwgTlRfU1RBVFVTX0NPVUxEX05PVF9JTlRFUlBSRVR9LAorCXsiTlRfU1RBVFVTX0ZJTEVfSVNfQV9ESVJFQ1RPUlkiLCBOVF9TVEFUVVNfRklMRV9JU19BX0RJUkVDVE9SWX0sCisJeyJOVF9TVEFUVVNfTk9UX1NVUFBPUlRFRCIsIE5UX1NUQVRVU19OT1RfU1VQUE9SVEVEfSwKKwl7Ik5UX1NUQVRVU19SRU1PVEVfTk9UX0xJU1RFTklORyIsIE5UX1NUQVRVU19SRU1PVEVfTk9UX0xJU1RFTklOR30sCisJeyJOVF9TVEFUVVNfRFVQTElDQVRFX05BTUUiLCBOVF9TVEFUVVNfRFVQTElDQVRFX05BTUV9LAorCXsiTlRfU1RBVFVTX0JBRF9ORVRXT1JLX1BBVEgiLCBOVF9TVEFUVVNfQkFEX05FVFdPUktfUEFUSH0sCisJeyJOVF9TVEFUVVNfTkVUV09SS19CVVNZIiwgTlRfU1RBVFVTX05FVFdPUktfQlVTWX0sCisJeyJOVF9TVEFUVVNfREVWSUNFX0RPRVNfTk9UX0VYSVNUIiwKKwkgTlRfU1RBVFVTX0RFVklDRV9ET0VTX05PVF9FWElTVH0sCisJeyJOVF9TVEFUVVNfVE9PX01BTllfQ09NTUFORFMiLCBOVF9TVEFUVVNfVE9PX01BTllfQ09NTUFORFN9LAorCXsiTlRfU1RBVFVTX0FEQVBURVJfSEFSRFdBUkVfRVJST1IiLAorCSBOVF9TVEFUVVNfQURBUFRFUl9IQVJEV0FSRV9FUlJPUn0sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9ORVRXT1JLX1JFU1BPTlNFIiwKKwkgTlRfU1RBVFVTX0lOVkFMSURfTkVUV09SS19SRVNQT05TRX0sCisJeyJOVF9TVEFUVVNfVU5FWFBFQ1RFRF9ORVRXT1JLX0VSUk9SIiwKKwkgTlRfU1RBVFVTX1VORVhQRUNURURfTkVUV09SS19FUlJPUn0sCisJeyJOVF9TVEFUVVNfQkFEX1JFTU9URV9BREFQVEVSIiwgTlRfU1RBVFVTX0JBRF9SRU1PVEVfQURBUFRFUn0sCisJeyJOVF9TVEFUVVNfUFJJTlRfUVVFVUVfRlVMTCIsIE5UX1NUQVRVU19QUklOVF9RVUVVRV9GVUxMfSwKKwl7Ik5UX1NUQVRVU19OT19TUE9PTF9TUEFDRSIsIE5UX1NUQVRVU19OT19TUE9PTF9TUEFDRX0sCisJeyJOVF9TVEFUVVNfUFJJTlRfQ0FOQ0VMTEVEIiwgTlRfU1RBVFVTX1BSSU5UX0NBTkNFTExFRH0sCisJeyJOVF9TVEFUVVNfTkVUV09SS19OQU1FX0RFTEVURUQiLCBOVF9TVEFUVVNfTkVUV09SS19OQU1FX0RFTEVURUR9LAorCXsiTlRfU1RBVFVTX05FVFdPUktfQUNDRVNTX0RFTklFRCIsCisJIE5UX1NUQVRVU19ORVRXT1JLX0FDQ0VTU19ERU5JRUR9LAorCXsiTlRfU1RBVFVTX0JBRF9ERVZJQ0VfVFlQRSIsIE5UX1NUQVRVU19CQURfREVWSUNFX1RZUEV9LAorCXsiTlRfU1RBVFVTX0JBRF9ORVRXT1JLX05BTUUiLCBOVF9TVEFUVVNfQkFEX05FVFdPUktfTkFNRX0sCisJeyJOVF9TVEFUVVNfVE9PX01BTllfTkFNRVMiLCBOVF9TVEFUVVNfVE9PX01BTllfTkFNRVN9LAorCXsiTlRfU1RBVFVTX1RPT19NQU5ZX1NFU1NJT05TIiwgTlRfU1RBVFVTX1RPT19NQU5ZX1NFU1NJT05TfSwKKwl7Ik5UX1NUQVRVU19TSEFSSU5HX1BBVVNFRCIsIE5UX1NUQVRVU19TSEFSSU5HX1BBVVNFRH0sCisJeyJOVF9TVEFUVVNfUkVRVUVTVF9OT1RfQUNDRVBURUQiLCBOVF9TVEFUVVNfUkVRVUVTVF9OT1RfQUNDRVBURUR9LAorCXsiTlRfU1RBVFVTX1JFRElSRUNUT1JfUEFVU0VEIiwgTlRfU1RBVFVTX1JFRElSRUNUT1JfUEFVU0VEfSwKKwl7Ik5UX1NUQVRVU19ORVRfV1JJVEVfRkFVTFQiLCBOVF9TVEFUVVNfTkVUX1dSSVRFX0ZBVUxUfSwKKwl7Ik5UX1NUQVRVU19QUk9GSUxJTkdfQVRfTElNSVQiLCBOVF9TVEFUVVNfUFJPRklMSU5HX0FUX0xJTUlUfSwKKwl7Ik5UX1NUQVRVU19OT1RfU0FNRV9ERVZJQ0UiLCBOVF9TVEFUVVNfTk9UX1NBTUVfREVWSUNFfSwKKwl7Ik5UX1NUQVRVU19GSUxFX1JFTkFNRUQiLCBOVF9TVEFUVVNfRklMRV9SRU5BTUVEfSwKKwl7Ik5UX1NUQVRVU19WSVJUVUFMX0NJUkNVSVRfQ0xPU0VEIiwKKwkgTlRfU1RBVFVTX1ZJUlRVQUxfQ0lSQ1VJVF9DTE9TRUR9LAorCXsiTlRfU1RBVFVTX05PX1NFQ1VSSVRZX09OX09CSkVDVCIsCisJIE5UX1NUQVRVU19OT19TRUNVUklUWV9PTl9PQkpFQ1R9LAorCXsiTlRfU1RBVFVTX0NBTlRfV0FJVCIsIE5UX1NUQVRVU19DQU5UX1dBSVR9LAorCXsiTlRfU1RBVFVTX1BJUEVfRU1QVFkiLCBOVF9TVEFUVVNfUElQRV9FTVBUWX0sCisJeyJOVF9TVEFUVVNfQ0FOVF9BQ0NFU1NfRE9NQUlOX0lORk8iLAorCSBOVF9TVEFUVVNfQ0FOVF9BQ0NFU1NfRE9NQUlOX0lORk99LAorCXsiTlRfU1RBVFVTX0NBTlRfVEVSTUlOQVRFX1NFTEYiLCBOVF9TVEFUVVNfQ0FOVF9URVJNSU5BVEVfU0VMRn0sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9TRVJWRVJfU1RBVEUiLCBOVF9TVEFUVVNfSU5WQUxJRF9TRVJWRVJfU1RBVEV9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfRE9NQUlOX1NUQVRFIiwgTlRfU1RBVFVTX0lOVkFMSURfRE9NQUlOX1NUQVRFfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX0RPTUFJTl9ST0xFIiwgTlRfU1RBVFVTX0lOVkFMSURfRE9NQUlOX1JPTEV9LAorCXsiTlRfU1RBVFVTX05PX1NVQ0hfRE9NQUlOIiwgTlRfU1RBVFVTX05PX1NVQ0hfRE9NQUlOfSwKKwl7Ik5UX1NUQVRVU19ET01BSU5fRVhJU1RTIiwgTlRfU1RBVFVTX0RPTUFJTl9FWElTVFN9LAorCXsiTlRfU1RBVFVTX0RPTUFJTl9MSU1JVF9FWENFRURFRCIsCisJIE5UX1NUQVRVU19ET01BSU5fTElNSVRfRVhDRUVERUR9LAorCXsiTlRfU1RBVFVTX09QTE9DS19OT1RfR1JBTlRFRCIsIE5UX1NUQVRVU19PUExPQ0tfTk9UX0dSQU5URUR9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfT1BMT0NLX1BST1RPQ09MIiwKKwkgTlRfU1RBVFVTX0lOVkFMSURfT1BMT0NLX1BST1RPQ09MfSwKKwl7Ik5UX1NUQVRVU19JTlRFUk5BTF9EQl9DT1JSVVBUSU9OIiwKKwkgTlRfU1RBVFVTX0lOVEVSTkFMX0RCX0NPUlJVUFRJT059LAorCXsiTlRfU1RBVFVTX0lOVEVSTkFMX0VSUk9SIiwgTlRfU1RBVFVTX0lOVEVSTkFMX0VSUk9SfSwKKwl7Ik5UX1NUQVRVU19HRU5FUklDX05PVF9NQVBQRUQiLCBOVF9TVEFUVVNfR0VORVJJQ19OT1RfTUFQUEVEfSwKKwl7Ik5UX1NUQVRVU19CQURfREVTQ1JJUFRPUl9GT1JNQVQiLAorCSBOVF9TVEFUVVNfQkFEX0RFU0NSSVBUT1JfRk9STUFUfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX1VTRVJfQlVGRkVSIiwgTlRfU1RBVFVTX0lOVkFMSURfVVNFUl9CVUZGRVJ9LAorCXsiTlRfU1RBVFVTX1VORVhQRUNURURfSU9fRVJST1IiLCBOVF9TVEFUVVNfVU5FWFBFQ1RFRF9JT19FUlJPUn0sCisJeyJOVF9TVEFUVVNfVU5FWFBFQ1RFRF9NTV9DUkVBVEVfRVJSIiwKKwkgTlRfU1RBVFVTX1VORVhQRUNURURfTU1fQ1JFQVRFX0VSUn0sCisJeyJOVF9TVEFUVVNfVU5FWFBFQ1RFRF9NTV9NQVBfRVJST1IiLAorCSBOVF9TVEFUVVNfVU5FWFBFQ1RFRF9NTV9NQVBfRVJST1J9LAorCXsiTlRfU1RBVFVTX1VORVhQRUNURURfTU1fRVhURU5EX0VSUiIsCisJIE5UX1NUQVRVU19VTkVYUEVDVEVEX01NX0VYVEVORF9FUlJ9LAorCXsiTlRfU1RBVFVTX05PVF9MT0dPTl9QUk9DRVNTIiwgTlRfU1RBVFVTX05PVF9MT0dPTl9QUk9DRVNTfSwKKwl7Ik5UX1NUQVRVU19MT0dPTl9TRVNTSU9OX0VYSVNUUyIsIE5UX1NUQVRVU19MT0dPTl9TRVNTSU9OX0VYSVNUU30sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfMSIsIE5UX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUl8xfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUl8yIiwgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzJ9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzMiLCBOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfM30sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfNCIsIE5UX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUl80fSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUl81IiwgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzV9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzYiLCBOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfNn0sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfNyIsIE5UX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUl83fSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUl84IiwgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzh9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzkiLCBOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfOX0sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfMTAiLCBOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfMTB9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzExIiwgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzExfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUl8xMiIsIE5UX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUl8xMn0sCisJeyJOVF9TVEFUVVNfUkVESVJFQ1RPUl9OT1RfU1RBUlRFRCIsCisJIE5UX1NUQVRVU19SRURJUkVDVE9SX05PVF9TVEFSVEVEfSwKKwl7Ik5UX1NUQVRVU19SRURJUkVDVE9SX1NUQVJURUQiLCBOVF9TVEFUVVNfUkVESVJFQ1RPUl9TVEFSVEVEfSwKKwl7Ik5UX1NUQVRVU19TVEFDS19PVkVSRkxPVyIsIE5UX1NUQVRVU19TVEFDS19PVkVSRkxPV30sCisJeyJOVF9TVEFUVVNfTk9fU1VDSF9QQUNLQUdFIiwgTlRfU1RBVFVTX05PX1NVQ0hfUEFDS0FHRX0sCisJeyJOVF9TVEFUVVNfQkFEX0ZVTkNUSU9OX1RBQkxFIiwgTlRfU1RBVFVTX0JBRF9GVU5DVElPTl9UQUJMRX0sCisJeyJOVF9TVEFUVVNfRElSRUNUT1JZX05PVF9FTVBUWSIsIE5UX1NUQVRVU19ESVJFQ1RPUllfTk9UX0VNUFRZfSwKKwl7Ik5UX1NUQVRVU19GSUxFX0NPUlJVUFRfRVJST1IiLCBOVF9TVEFUVVNfRklMRV9DT1JSVVBUX0VSUk9SfSwKKwl7Ik5UX1NUQVRVU19OT1RfQV9ESVJFQ1RPUlkiLCBOVF9TVEFUVVNfTk9UX0FfRElSRUNUT1JZfSwKKwl7Ik5UX1NUQVRVU19CQURfTE9HT05fU0VTU0lPTl9TVEFURSIsCisJIE5UX1NUQVRVU19CQURfTE9HT05fU0VTU0lPTl9TVEFURX0sCisJeyJOVF9TVEFUVVNfTE9HT05fU0VTU0lPTl9DT0xMSVNJT04iLAorCSBOVF9TVEFUVVNfTE9HT05fU0VTU0lPTl9DT0xMSVNJT059LAorCXsiTlRfU1RBVFVTX05BTUVfVE9PX0xPTkciLCBOVF9TVEFUVVNfTkFNRV9UT09fTE9OR30sCisJeyJOVF9TVEFUVVNfRklMRVNfT1BFTiIsIE5UX1NUQVRVU19GSUxFU19PUEVOfSwKKwl7Ik5UX1NUQVRVU19DT05ORUNUSU9OX0lOX1VTRSIsIE5UX1NUQVRVU19DT05ORUNUSU9OX0lOX1VTRX0sCisJeyJOVF9TVEFUVVNfTUVTU0FHRV9OT1RfRk9VTkQiLCBOVF9TVEFUVVNfTUVTU0FHRV9OT1RfRk9VTkR9LAorCXsiTlRfU1RBVFVTX1BST0NFU1NfSVNfVEVSTUlOQVRJTkciLAorCSBOVF9TVEFUVVNfUFJPQ0VTU19JU19URVJNSU5BVElOR30sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9MT0dPTl9UWVBFIiwgTlRfU1RBVFVTX0lOVkFMSURfTE9HT05fVFlQRX0sCisJeyJOVF9TVEFUVVNfTk9fR1VJRF9UUkFOU0xBVElPTiIsIE5UX1NUQVRVU19OT19HVUlEX1RSQU5TTEFUSU9OfSwKKwl7Ik5UX1NUQVRVU19DQU5OT1RfSU1QRVJTT05BVEUiLCBOVF9TVEFUVVNfQ0FOTk9UX0lNUEVSU09OQVRFfSwKKwl7Ik5UX1NUQVRVU19JTUFHRV9BTFJFQURZX0xPQURFRCIsIE5UX1NUQVRVU19JTUFHRV9BTFJFQURZX0xPQURFRH0sCisJeyJOVF9TVEFUVVNfQUJJT1NfTk9UX1BSRVNFTlQiLCBOVF9TVEFUVVNfQUJJT1NfTk9UX1BSRVNFTlR9LAorCXsiTlRfU1RBVFVTX0FCSU9TX0xJRF9OT1RfRVhJU1QiLCBOVF9TVEFUVVNfQUJJT1NfTElEX05PVF9FWElTVH0sCisJeyJOVF9TVEFUVVNfQUJJT1NfTElEX0FMUkVBRFlfT1dORUQiLAorCSBOVF9TVEFUVVNfQUJJT1NfTElEX0FMUkVBRFlfT1dORUR9LAorCXsiTlRfU1RBVFVTX0FCSU9TX05PVF9MSURfT1dORVIiLCBOVF9TVEFUVVNfQUJJT1NfTk9UX0xJRF9PV05FUn0sCisJeyJOVF9TVEFUVVNfQUJJT1NfSU5WQUxJRF9DT01NQU5EIiwKKwkgTlRfU1RBVFVTX0FCSU9TX0lOVkFMSURfQ09NTUFORH0sCisJeyJOVF9TVEFUVVNfQUJJT1NfSU5WQUxJRF9MSUQiLCBOVF9TVEFUVVNfQUJJT1NfSU5WQUxJRF9MSUR9LAorCXsiTlRfU1RBVFVTX0FCSU9TX1NFTEVDVE9SX05PVF9BVkFJTEFCTEUiLAorCSBOVF9TVEFUVVNfQUJJT1NfU0VMRUNUT1JfTk9UX0FWQUlMQUJMRX0sCisJeyJOVF9TVEFUVVNfQUJJT1NfSU5WQUxJRF9TRUxFQ1RPUiIsCisJIE5UX1NUQVRVU19BQklPU19JTlZBTElEX1NFTEVDVE9SfSwKKwl7Ik5UX1NUQVRVU19OT19MRFQiLCBOVF9TVEFUVVNfTk9fTERUfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX0xEVF9TSVpFIiwgTlRfU1RBVFVTX0lOVkFMSURfTERUX1NJWkV9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfTERUX09GRlNFVCIsIE5UX1NUQVRVU19JTlZBTElEX0xEVF9PRkZTRVR9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfTERUX0RFU0NSSVBUT1IiLAorCSBOVF9TVEFUVVNfSU5WQUxJRF9MRFRfREVTQ1JJUFRPUn0sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9JTUFHRV9ORV9GT1JNQVQiLAorCSBOVF9TVEFUVVNfSU5WQUxJRF9JTUFHRV9ORV9GT1JNQVR9LAorCXsiTlRfU1RBVFVTX1JYQUNUX0lOVkFMSURfU1RBVEUiLCBOVF9TVEFUVVNfUlhBQ1RfSU5WQUxJRF9TVEFURX0sCisJeyJOVF9TVEFUVVNfUlhBQ1RfQ09NTUlUX0ZBSUxVUkUiLCBOVF9TVEFUVVNfUlhBQ1RfQ09NTUlUX0ZBSUxVUkV9LAorCXsiTlRfU1RBVFVTX01BUFBFRF9GSUxFX1NJWkVfWkVSTyIsCisJIE5UX1NUQVRVU19NQVBQRURfRklMRV9TSVpFX1pFUk99LAorCXsiTlRfU1RBVFVTX1RPT19NQU5ZX09QRU5FRF9GSUxFUyIsCisJIE5UX1NUQVRVU19UT09fTUFOWV9PUEVORURfRklMRVN9LAorCXsiTlRfU1RBVFVTX0NBTkNFTExFRCIsIE5UX1NUQVRVU19DQU5DRUxMRUR9LAorCXsiTlRfU1RBVFVTX0NBTk5PVF9ERUxFVEUiLCBOVF9TVEFUVVNfQ0FOTk9UX0RFTEVURX0sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9DT01QVVRFUl9OQU1FIiwKKwkgTlRfU1RBVFVTX0lOVkFMSURfQ09NUFVURVJfTkFNRX0sCisJeyJOVF9TVEFUVVNfRklMRV9ERUxFVEVEIiwgTlRfU1RBVFVTX0ZJTEVfREVMRVRFRH0sCisJeyJOVF9TVEFUVVNfU1BFQ0lBTF9BQ0NPVU5UIiwgTlRfU1RBVFVTX1NQRUNJQUxfQUNDT1VOVH0sCisJeyJOVF9TVEFUVVNfU1BFQ0lBTF9HUk9VUCIsIE5UX1NUQVRVU19TUEVDSUFMX0dST1VQfSwKKwl7Ik5UX1NUQVRVU19TUEVDSUFMX1VTRVIiLCBOVF9TVEFUVVNfU1BFQ0lBTF9VU0VSfSwKKwl7Ik5UX1NUQVRVU19NRU1CRVJTX1BSSU1BUllfR1JPVVAiLAorCSBOVF9TVEFUVVNfTUVNQkVSU19QUklNQVJZX0dST1VQfSwKKwl7Ik5UX1NUQVRVU19GSUxFX0NMT1NFRCIsIE5UX1NUQVRVU19GSUxFX0NMT1NFRH0sCisJeyJOVF9TVEFUVVNfVE9PX01BTllfVEhSRUFEUyIsIE5UX1NUQVRVU19UT09fTUFOWV9USFJFQURTfSwKKwl7Ik5UX1NUQVRVU19USFJFQURfTk9UX0lOX1BST0NFU1MiLAorCSBOVF9TVEFUVVNfVEhSRUFEX05PVF9JTl9QUk9DRVNTfSwKKwl7Ik5UX1NUQVRVU19UT0tFTl9BTFJFQURZX0lOX1VTRSIsIE5UX1NUQVRVU19UT0tFTl9BTFJFQURZX0lOX1VTRX0sCisJeyJOVF9TVEFUVVNfUEFHRUZJTEVfUVVPVEFfRVhDRUVERUQiLAorCSBOVF9TVEFUVVNfUEFHRUZJTEVfUVVPVEFfRVhDRUVERUR9LAorCXsiTlRfU1RBVFVTX0NPTU1JVE1FTlRfTElNSVQiLCBOVF9TVEFUVVNfQ09NTUlUTUVOVF9MSU1JVH0sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9JTUFHRV9MRV9GT1JNQVQiLAorCSBOVF9TVEFUVVNfSU5WQUxJRF9JTUFHRV9MRV9GT1JNQVR9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfSU1BR0VfTk9UX01aIiwgTlRfU1RBVFVTX0lOVkFMSURfSU1BR0VfTk9UX01afSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX0lNQUdFX1BST1RFQ1QiLAorCSBOVF9TVEFUVVNfSU5WQUxJRF9JTUFHRV9QUk9URUNUfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX0lNQUdFX1dJTl8xNiIsIE5UX1NUQVRVU19JTlZBTElEX0lNQUdFX1dJTl8xNn0sCisJeyJOVF9TVEFUVVNfTE9HT05fU0VSVkVSX0NPTkZMSUNUIiwKKwkgTlRfU1RBVFVTX0xPR09OX1NFUlZFUl9DT05GTElDVH0sCisJeyJOVF9TVEFUVVNfVElNRV9ESUZGRVJFTkNFX0FUX0RDIiwKKwkgTlRfU1RBVFVTX1RJTUVfRElGRkVSRU5DRV9BVF9EQ30sCisJeyJOVF9TVEFUVVNfU1lOQ0hST05JWkFUSU9OX1JFUVVJUkVEIiwKKwkgTlRfU1RBVFVTX1NZTkNIUk9OSVpBVElPTl9SRVFVSVJFRH0sCisJeyJOVF9TVEFUVVNfRExMX05PVF9GT1VORCIsIE5UX1NUQVRVU19ETExfTk9UX0ZPVU5EfSwKKwl7Ik5UX1NUQVRVU19PUEVOX0ZBSUxFRCIsIE5UX1NUQVRVU19PUEVOX0ZBSUxFRH0sCisJeyJOVF9TVEFUVVNfSU9fUFJJVklMRUdFX0ZBSUxFRCIsIE5UX1NUQVRVU19JT19QUklWSUxFR0VfRkFJTEVEfSwKKwl7Ik5UX1NUQVRVU19PUkRJTkFMX05PVF9GT1VORCIsIE5UX1NUQVRVU19PUkRJTkFMX05PVF9GT1VORH0sCisJeyJOVF9TVEFUVVNfRU5UUllQT0lOVF9OT1RfRk9VTkQiLCBOVF9TVEFUVVNfRU5UUllQT0lOVF9OT1RfRk9VTkR9LAorCXsiTlRfU1RBVFVTX0NPTlRST0xfQ19FWElUIiwgTlRfU1RBVFVTX0NPTlRST0xfQ19FWElUfSwKKwl7Ik5UX1NUQVRVU19MT0NBTF9ESVNDT05ORUNUIiwgTlRfU1RBVFVTX0xPQ0FMX0RJU0NPTk5FQ1R9LAorCXsiTlRfU1RBVFVTX1JFTU9URV9ESVNDT05ORUNUIiwgTlRfU1RBVFVTX1JFTU9URV9ESVNDT05ORUNUfSwKKwl7Ik5UX1NUQVRVU19SRU1PVEVfUkVTT1VSQ0VTIiwgTlRfU1RBVFVTX1JFTU9URV9SRVNPVVJDRVN9LAorCXsiTlRfU1RBVFVTX0xJTktfRkFJTEVEIiwgTlRfU1RBVFVTX0xJTktfRkFJTEVEfSwKKwl7Ik5UX1NUQVRVU19MSU5LX1RJTUVPVVQiLCBOVF9TVEFUVVNfTElOS19USU1FT1VUfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX0NPTk5FQ1RJT04iLCBOVF9TVEFUVVNfSU5WQUxJRF9DT05ORUNUSU9OfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX0FERFJFU1MiLCBOVF9TVEFUVVNfSU5WQUxJRF9BRERSRVNTfSwKKwl7Ik5UX1NUQVRVU19ETExfSU5JVF9GQUlMRUQiLCBOVF9TVEFUVVNfRExMX0lOSVRfRkFJTEVEfSwKKwl7Ik5UX1NUQVRVU19NSVNTSU5HX1NZU1RFTUZJTEUiLCBOVF9TVEFUVVNfTUlTU0lOR19TWVNURU1GSUxFfSwKKwl7Ik5UX1NUQVRVU19VTkhBTkRMRURfRVhDRVBUSU9OIiwgTlRfU1RBVFVTX1VOSEFORExFRF9FWENFUFRJT059LAorCXsiTlRfU1RBVFVTX0FQUF9JTklUX0ZBSUxVUkUiLCBOVF9TVEFUVVNfQVBQX0lOSVRfRkFJTFVSRX0sCisJeyJOVF9TVEFUVVNfUEFHRUZJTEVfQ1JFQVRFX0ZBSUxFRCIsCisJIE5UX1NUQVRVU19QQUdFRklMRV9DUkVBVEVfRkFJTEVEfSwKKwl7Ik5UX1NUQVRVU19OT19QQUdFRklMRSIsIE5UX1NUQVRVU19OT19QQUdFRklMRX0sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9MRVZFTCIsIE5UX1NUQVRVU19JTlZBTElEX0xFVkVMfSwKKwl7Ik5UX1NUQVRVU19XUk9OR19QQVNTV09SRF9DT1JFIiwgTlRfU1RBVFVTX1dST05HX1BBU1NXT1JEX0NPUkV9LAorCXsiTlRfU1RBVFVTX0lMTEVHQUxfRkxPQVRfQ09OVEVYVCIsCisJIE5UX1NUQVRVU19JTExFR0FMX0ZMT0FUX0NPTlRFWFR9LAorCXsiTlRfU1RBVFVTX1BJUEVfQlJPS0VOIiwgTlRfU1RBVFVTX1BJUEVfQlJPS0VOfSwKKwl7Ik5UX1NUQVRVU19SRUdJU1RSWV9DT1JSVVBUIiwgTlRfU1RBVFVTX1JFR0lTVFJZX0NPUlJVUFR9LAorCXsiTlRfU1RBVFVTX1JFR0lTVFJZX0lPX0ZBSUxFRCIsIE5UX1NUQVRVU19SRUdJU1RSWV9JT19GQUlMRUR9LAorCXsiTlRfU1RBVFVTX05PX0VWRU5UX1BBSVIiLCBOVF9TVEFUVVNfTk9fRVZFTlRfUEFJUn0sCisJeyJOVF9TVEFUVVNfVU5SRUNPR05JWkVEX1ZPTFVNRSIsIE5UX1NUQVRVU19VTlJFQ09HTklaRURfVk9MVU1FfSwKKwl7Ik5UX1NUQVRVU19TRVJJQUxfTk9fREVWSUNFX0lOSVRFRCIsCisJIE5UX1NUQVRVU19TRVJJQUxfTk9fREVWSUNFX0lOSVRFRH0sCisJeyJOVF9TVEFUVVNfTk9fU1VDSF9BTElBUyIsIE5UX1NUQVRVU19OT19TVUNIX0FMSUFTfSwKKwl7Ik5UX1NUQVRVU19NRU1CRVJfTk9UX0lOX0FMSUFTIiwgTlRfU1RBVFVTX01FTUJFUl9OT1RfSU5fQUxJQVN9LAorCXsiTlRfU1RBVFVTX01FTUJFUl9JTl9BTElBUyIsIE5UX1NUQVRVU19NRU1CRVJfSU5fQUxJQVN9LAorCXsiTlRfU1RBVFVTX0FMSUFTX0VYSVNUUyIsIE5UX1NUQVRVU19BTElBU19FWElTVFN9LAorCXsiTlRfU1RBVFVTX0xPR09OX05PVF9HUkFOVEVEIiwgTlRfU1RBVFVTX0xPR09OX05PVF9HUkFOVEVEfSwKKwl7Ik5UX1NUQVRVU19UT09fTUFOWV9TRUNSRVRTIiwgTlRfU1RBVFVTX1RPT19NQU5ZX1NFQ1JFVFN9LAorCXsiTlRfU1RBVFVTX1NFQ1JFVF9UT09fTE9ORyIsIE5UX1NUQVRVU19TRUNSRVRfVE9PX0xPTkd9LAorCXsiTlRfU1RBVFVTX0lOVEVSTkFMX0RCX0VSUk9SIiwgTlRfU1RBVFVTX0lOVEVSTkFMX0RCX0VSUk9SfSwKKwl7Ik5UX1NUQVRVU19GVUxMU0NSRUVOX01PREUiLCBOVF9TVEFUVVNfRlVMTFNDUkVFTl9NT0RFfSwKKwl7Ik5UX1NUQVRVU19UT09fTUFOWV9DT05URVhUX0lEUyIsIE5UX1NUQVRVU19UT09fTUFOWV9DT05URVhUX0lEU30sCisJeyJOVF9TVEFUVVNfTE9HT05fVFlQRV9OT1RfR1JBTlRFRCIsCisJIE5UX1NUQVRVU19MT0dPTl9UWVBFX05PVF9HUkFOVEVEfSwKKwl7Ik5UX1NUQVRVU19OT1RfUkVHSVNUUllfRklMRSIsIE5UX1NUQVRVU19OT1RfUkVHSVNUUllfRklMRX0sCisJeyJOVF9TVEFUVVNfTlRfQ1JPU1NfRU5DUllQVElPTl9SRVFVSVJFRCIsCisJIE5UX1NUQVRVU19OVF9DUk9TU19FTkNSWVBUSU9OX1JFUVVJUkVEfSwKKwl7Ik5UX1NUQVRVU19ET01BSU5fQ1RSTFJfQ09ORklHX0VSUk9SIiwKKwkgTlRfU1RBVFVTX0RPTUFJTl9DVFJMUl9DT05GSUdfRVJST1J9LAorCXsiTlRfU1RBVFVTX0ZUX01JU1NJTkdfTUVNQkVSIiwgTlRfU1RBVFVTX0ZUX01JU1NJTkdfTUVNQkVSfSwKKwl7Ik5UX1NUQVRVU19JTExfRk9STUVEX1NFUlZJQ0VfRU5UUlkiLAorCSBOVF9TVEFUVVNfSUxMX0ZPUk1FRF9TRVJWSUNFX0VOVFJZfSwKKwl7Ik5UX1NUQVRVU19JTExFR0FMX0NIQVJBQ1RFUiIsIE5UX1NUQVRVU19JTExFR0FMX0NIQVJBQ1RFUn0sCisJeyJOVF9TVEFUVVNfVU5NQVBQQUJMRV9DSEFSQUNURVIiLCBOVF9TVEFUVVNfVU5NQVBQQUJMRV9DSEFSQUNURVJ9LAorCXsiTlRfU1RBVFVTX1VOREVGSU5FRF9DSEFSQUNURVIiLCBOVF9TVEFUVVNfVU5ERUZJTkVEX0NIQVJBQ1RFUn0sCisJeyJOVF9TVEFUVVNfRkxPUFBZX1ZPTFVNRSIsIE5UX1NUQVRVU19GTE9QUFlfVk9MVU1FfSwKKwl7Ik5UX1NUQVRVU19GTE9QUFlfSURfTUFSS19OT1RfRk9VTkQiLAorCSBOVF9TVEFUVVNfRkxPUFBZX0lEX01BUktfTk9UX0ZPVU5EfSwKKwl7Ik5UX1NUQVRVU19GTE9QUFlfV1JPTkdfQ1lMSU5ERVIiLAorCSBOVF9TVEFUVVNfRkxPUFBZX1dST05HX0NZTElOREVSfSwKKwl7Ik5UX1NUQVRVU19GTE9QUFlfVU5LTk9XTl9FUlJPUiIsIE5UX1NUQVRVU19GTE9QUFlfVU5LTk9XTl9FUlJPUn0sCisJeyJOVF9TVEFUVVNfRkxPUFBZX0JBRF9SRUdJU1RFUlMiLCBOVF9TVEFUVVNfRkxPUFBZX0JBRF9SRUdJU1RFUlN9LAorCXsiTlRfU1RBVFVTX0RJU0tfUkVDQUxJQlJBVEVfRkFJTEVEIiwKKwkgTlRfU1RBVFVTX0RJU0tfUkVDQUxJQlJBVEVfRkFJTEVEfSwKKwl7Ik5UX1NUQVRVU19ESVNLX09QRVJBVElPTl9GQUlMRUQiLAorCSBOVF9TVEFUVVNfRElTS19PUEVSQVRJT05fRkFJTEVEfSwKKwl7Ik5UX1NUQVRVU19ESVNLX1JFU0VUX0ZBSUxFRCIsIE5UX1NUQVRVU19ESVNLX1JFU0VUX0ZBSUxFRH0sCisJeyJOVF9TVEFUVVNfU0hBUkVEX0lSUV9CVVNZIiwgTlRfU1RBVFVTX1NIQVJFRF9JUlFfQlVTWX0sCisJeyJOVF9TVEFUVVNfRlRfT1JQSEFOSU5HIiwgTlRfU1RBVFVTX0ZUX09SUEhBTklOR30sCisJeyJOVF9TVEFUVVNfUEFSVElUSU9OX0ZBSUxVUkUiLCBOVF9TVEFUVVNfUEFSVElUSU9OX0ZBSUxVUkV9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfQkxPQ0tfTEVOR1RIIiwgTlRfU1RBVFVTX0lOVkFMSURfQkxPQ0tfTEVOR1RIfSwKKwl7Ik5UX1NUQVRVU19ERVZJQ0VfTk9UX1BBUlRJVElPTkVEIiwKKwkgTlRfU1RBVFVTX0RFVklDRV9OT1RfUEFSVElUSU9ORUR9LAorCXsiTlRfU1RBVFVTX1VOQUJMRV9UT19MT0NLX01FRElBIiwgTlRfU1RBVFVTX1VOQUJMRV9UT19MT0NLX01FRElBfSwKKwl7Ik5UX1NUQVRVU19VTkFCTEVfVE9fVU5MT0FEX01FRElBIiwKKwkgTlRfU1RBVFVTX1VOQUJMRV9UT19VTkxPQURfTUVESUF9LAorCXsiTlRfU1RBVFVTX0VPTV9PVkVSRkxPVyIsIE5UX1NUQVRVU19FT01fT1ZFUkZMT1d9LAorCXsiTlRfU1RBVFVTX05PX01FRElBIiwgTlRfU1RBVFVTX05PX01FRElBfSwKKwl7Ik5UX1NUQVRVU19OT19TVUNIX01FTUJFUiIsIE5UX1NUQVRVU19OT19TVUNIX01FTUJFUn0sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9NRU1CRVIiLCBOVF9TVEFUVVNfSU5WQUxJRF9NRU1CRVJ9LAorCXsiTlRfU1RBVFVTX0tFWV9ERUxFVEVEIiwgTlRfU1RBVFVTX0tFWV9ERUxFVEVEfSwKKwl7Ik5UX1NUQVRVU19OT19MT0dfU1BBQ0UiLCBOVF9TVEFUVVNfTk9fTE9HX1NQQUNFfSwKKwl7Ik5UX1NUQVRVU19UT09fTUFOWV9TSURTIiwgTlRfU1RBVFVTX1RPT19NQU5ZX1NJRFN9LAorCXsiTlRfU1RBVFVTX0xNX0NST1NTX0VOQ1JZUFRJT05fUkVRVUlSRUQiLAorCSBOVF9TVEFUVVNfTE1fQ1JPU1NfRU5DUllQVElPTl9SRVFVSVJFRH0sCisJeyJOVF9TVEFUVVNfS0VZX0hBU19DSElMRFJFTiIsIE5UX1NUQVRVU19LRVlfSEFTX0NISUxEUkVOfSwKKwl7Ik5UX1NUQVRVU19DSElMRF9NVVNUX0JFX1ZPTEFUSUxFIiwKKwkgTlRfU1RBVFVTX0NISUxEX01VU1RfQkVfVk9MQVRJTEV9LAorCXsiTlRfU1RBVFVTX0RFVklDRV9DT05GSUdVUkFUSU9OX0VSUk9SIiwKKwkgTlRfU1RBVFVTX0RFVklDRV9DT05GSUdVUkFUSU9OX0VSUk9SfSwKKwl7Ik5UX1NUQVRVU19EUklWRVJfSU5URVJOQUxfRVJST1IiLAorCSBOVF9TVEFUVVNfRFJJVkVSX0lOVEVSTkFMX0VSUk9SfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX0RFVklDRV9TVEFURSIsIE5UX1NUQVRVU19JTlZBTElEX0RFVklDRV9TVEFURX0sCisJeyJOVF9TVEFUVVNfSU9fREVWSUNFX0VSUk9SIiwgTlRfU1RBVFVTX0lPX0RFVklDRV9FUlJPUn0sCisJeyJOVF9TVEFUVVNfREVWSUNFX1BST1RPQ09MX0VSUk9SIiwKKwkgTlRfU1RBVFVTX0RFVklDRV9QUk9UT0NPTF9FUlJPUn0sCisJeyJOVF9TVEFUVVNfQkFDS1VQX0NPTlRST0xMRVIiLCBOVF9TVEFUVVNfQkFDS1VQX0NPTlRST0xMRVJ9LAorCXsiTlRfU1RBVFVTX0xPR19GSUxFX0ZVTEwiLCBOVF9TVEFUVVNfTE9HX0ZJTEVfRlVMTH0sCisJeyJOVF9TVEFUVVNfVE9PX0xBVEUiLCBOVF9TVEFUVVNfVE9PX0xBVEV9LAorCXsiTlRfU1RBVFVTX05PX1RSVVNUX0xTQV9TRUNSRVQiLCBOVF9TVEFUVVNfTk9fVFJVU1RfTFNBX1NFQ1JFVH0sCisJeyJOVF9TVEFUVVNfTk9fVFJVU1RfU0FNX0FDQ09VTlQiLCBOVF9TVEFUVVNfTk9fVFJVU1RfU0FNX0FDQ09VTlR9LAorCXsiTlRfU1RBVFVTX1RSVVNURURfRE9NQUlOX0ZBSUxVUkUiLAorCSBOVF9TVEFUVVNfVFJVU1RFRF9ET01BSU5fRkFJTFVSRX0sCisJeyJOVF9TVEFUVVNfVFJVU1RFRF9SRUxBVElPTlNISVBfRkFJTFVSRSIsCisJIE5UX1NUQVRVU19UUlVTVEVEX1JFTEFUSU9OU0hJUF9GQUlMVVJFfSwKKwl7Ik5UX1NUQVRVU19FVkVOVExPR19GSUxFX0NPUlJVUFQiLAorCSBOVF9TVEFUVVNfRVZFTlRMT0dfRklMRV9DT1JSVVBUfSwKKwl7Ik5UX1NUQVRVU19FVkVOVExPR19DQU5UX1NUQVJUIiwgTlRfU1RBVFVTX0VWRU5UTE9HX0NBTlRfU1RBUlR9LAorCXsiTlRfU1RBVFVTX1RSVVNUX0ZBSUxVUkUiLCBOVF9TVEFUVVNfVFJVU1RfRkFJTFVSRX0sCisJeyJOVF9TVEFUVVNfTVVUQU5UX0xJTUlUX0VYQ0VFREVEIiwKKwkgTlRfU1RBVFVTX01VVEFOVF9MSU1JVF9FWENFRURFRH0sCisJeyJOVF9TVEFUVVNfTkVUTE9HT05fTk9UX1NUQVJURUQiLCBOVF9TVEFUVVNfTkVUTE9HT05fTk9UX1NUQVJURUR9LAorCXsiTlRfU1RBVFVTX0FDQ09VTlRfRVhQSVJFRCIsIE5UX1NUQVRVU19BQ0NPVU5UX0VYUElSRUR9LAorCXsiTlRfU1RBVFVTX1BPU1NJQkxFX0RFQURMT0NLIiwgTlRfU1RBVFVTX1BPU1NJQkxFX0RFQURMT0NLfSwKKwl7Ik5UX1NUQVRVU19ORVRXT1JLX0NSRURFTlRJQUxfQ09ORkxJQ1QiLAorCSBOVF9TVEFUVVNfTkVUV09SS19DUkVERU5USUFMX0NPTkZMSUNUfSwKKwl7Ik5UX1NUQVRVU19SRU1PVEVfU0VTU0lPTl9MSU1JVCIsIE5UX1NUQVRVU19SRU1PVEVfU0VTU0lPTl9MSU1JVH0sCisJeyJOVF9TVEFUVVNfRVZFTlRMT0dfRklMRV9DSEFOR0VEIiwKKwkgTlRfU1RBVFVTX0VWRU5UTE9HX0ZJTEVfQ0hBTkdFRH0sCisJeyJOVF9TVEFUVVNfTk9MT0dPTl9JTlRFUkRPTUFJTl9UUlVTVF9BQ0NPVU5UIiwKKwkgTlRfU1RBVFVTX05PTE9HT05fSU5URVJET01BSU5fVFJVU1RfQUNDT1VOVH0sCisJeyJOVF9TVEFUVVNfTk9MT0dPTl9XT1JLU1RBVElPTl9UUlVTVF9BQ0NPVU5UIiwKKwkgTlRfU1RBVFVTX05PTE9HT05fV09SS1NUQVRJT05fVFJVU1RfQUNDT1VOVH0sCisJeyJOVF9TVEFUVVNfTk9MT0dPTl9TRVJWRVJfVFJVU1RfQUNDT1VOVCIsCisJIE5UX1NUQVRVU19OT0xPR09OX1NFUlZFUl9UUlVTVF9BQ0NPVU5UfSwKKwl7Ik5UX1NUQVRVU19ET01BSU5fVFJVU1RfSU5DT05TSVNURU5UIiwKKwkgTlRfU1RBVFVTX0RPTUFJTl9UUlVTVF9JTkNPTlNJU1RFTlR9LAorCXsiTlRfU1RBVFVTX0ZTX0RSSVZFUl9SRVFVSVJFRCIsIE5UX1NUQVRVU19GU19EUklWRVJfUkVRVUlSRUR9LAorCXsiTlRfU1RBVFVTX05PX1VTRVJfU0VTU0lPTl9LRVkiLCBOVF9TVEFUVVNfTk9fVVNFUl9TRVNTSU9OX0tFWX0sCisJeyJOVF9TVEFUVVNfVVNFUl9TRVNTSU9OX0RFTEVURUQiLCBOVF9TVEFUVVNfVVNFUl9TRVNTSU9OX0RFTEVURUR9LAorCXsiTlRfU1RBVFVTX1JFU09VUkNFX0xBTkdfTk9UX0ZPVU5EIiwKKwkgTlRfU1RBVFVTX1JFU09VUkNFX0xBTkdfTk9UX0ZPVU5EfSwKKwl7Ik5UX1NUQVRVU19JTlNVRkZfU0VSVkVSX1JFU09VUkNFUyIsCisJIE5UX1NUQVRVU19JTlNVRkZfU0VSVkVSX1JFU09VUkNFU30sCisJeyJOVF9TVEFUVVNfSU5WQUxJRF9CVUZGRVJfU0laRSIsIE5UX1NUQVRVU19JTlZBTElEX0JVRkZFUl9TSVpFfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX0FERFJFU1NfQ09NUE9ORU5UIiwKKwkgTlRfU1RBVFVTX0lOVkFMSURfQUREUkVTU19DT01QT05FTlR9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfQUREUkVTU19XSUxEQ0FSRCIsCisJIE5UX1NUQVRVU19JTlZBTElEX0FERFJFU1NfV0lMRENBUkR9LAorCXsiTlRfU1RBVFVTX1RPT19NQU5ZX0FERFJFU1NFUyIsIE5UX1NUQVRVU19UT09fTUFOWV9BRERSRVNTRVN9LAorCXsiTlRfU1RBVFVTX0FERFJFU1NfQUxSRUFEWV9FWElTVFMiLAorCSBOVF9TVEFUVVNfQUREUkVTU19BTFJFQURZX0VYSVNUU30sCisJeyJOVF9TVEFUVVNfQUREUkVTU19DTE9TRUQiLCBOVF9TVEFUVVNfQUREUkVTU19DTE9TRUR9LAorCXsiTlRfU1RBVFVTX0NPTk5FQ1RJT05fRElTQ09OTkVDVEVEIiwKKwkgTlRfU1RBVFVTX0NPTk5FQ1RJT05fRElTQ09OTkVDVEVEfSwKKwl7Ik5UX1NUQVRVU19DT05ORUNUSU9OX1JFU0VUIiwgTlRfU1RBVFVTX0NPTk5FQ1RJT05fUkVTRVR9LAorCXsiTlRfU1RBVFVTX1RPT19NQU5ZX05PREVTIiwgTlRfU1RBVFVTX1RPT19NQU5ZX05PREVTfSwKKwl7Ik5UX1NUQVRVU19UUkFOU0FDVElPTl9BQk9SVEVEIiwgTlRfU1RBVFVTX1RSQU5TQUNUSU9OX0FCT1JURUR9LAorCXsiTlRfU1RBVFVTX1RSQU5TQUNUSU9OX1RJTUVEX09VVCIsCisJIE5UX1NUQVRVU19UUkFOU0FDVElPTl9USU1FRF9PVVR9LAorCXsiTlRfU1RBVFVTX1RSQU5TQUNUSU9OX05PX1JFTEVBU0UiLAorCSBOVF9TVEFUVVNfVFJBTlNBQ1RJT05fTk9fUkVMRUFTRX0sCisJeyJOVF9TVEFUVVNfVFJBTlNBQ1RJT05fTk9fTUFUQ0giLCBOVF9TVEFUVVNfVFJBTlNBQ1RJT05fTk9fTUFUQ0h9LAorCXsiTlRfU1RBVFVTX1RSQU5TQUNUSU9OX1JFU1BPTkRFRCIsCisJIE5UX1NUQVRVU19UUkFOU0FDVElPTl9SRVNQT05ERUR9LAorCXsiTlRfU1RBVFVTX1RSQU5TQUNUSU9OX0lOVkFMSURfSUQiLAorCSBOVF9TVEFUVVNfVFJBTlNBQ1RJT05fSU5WQUxJRF9JRH0sCisJeyJOVF9TVEFUVVNfVFJBTlNBQ1RJT05fSU5WQUxJRF9UWVBFIiwKKwkgTlRfU1RBVFVTX1RSQU5TQUNUSU9OX0lOVkFMSURfVFlQRX0sCisJeyJOVF9TVEFUVVNfTk9UX1NFUlZFUl9TRVNTSU9OIiwgTlRfU1RBVFVTX05PVF9TRVJWRVJfU0VTU0lPTn0sCisJeyJOVF9TVEFUVVNfTk9UX0NMSUVOVF9TRVNTSU9OIiwgTlRfU1RBVFVTX05PVF9DTElFTlRfU0VTU0lPTn0sCisJeyJOVF9TVEFUVVNfQ0FOTk9UX0xPQURfUkVHSVNUUllfRklMRSIsCisJIE5UX1NUQVRVU19DQU5OT1RfTE9BRF9SRUdJU1RSWV9GSUxFfSwKKwl7Ik5UX1NUQVRVU19ERUJVR19BVFRBQ0hfRkFJTEVEIiwgTlRfU1RBVFVTX0RFQlVHX0FUVEFDSF9GQUlMRUR9LAorCXsiTlRfU1RBVFVTX1NZU1RFTV9QUk9DRVNTX1RFUk1JTkFURUQiLAorCSBOVF9TVEFUVVNfU1lTVEVNX1BST0NFU1NfVEVSTUlOQVRFRH0sCisJeyJOVF9TVEFUVVNfREFUQV9OT1RfQUNDRVBURUQiLCBOVF9TVEFUVVNfREFUQV9OT1RfQUNDRVBURUR9LAorCXsiTlRfU1RBVFVTX05PX0JST1dTRVJfU0VSVkVSU19GT1VORCIsCisJIE5UX1NUQVRVU19OT19CUk9XU0VSX1NFUlZFUlNfRk9VTkR9LAorCXsiTlRfU1RBVFVTX1ZETV9IQVJEX0VSUk9SIiwgTlRfU1RBVFVTX1ZETV9IQVJEX0VSUk9SfSwKKwl7Ik5UX1NUQVRVU19EUklWRVJfQ0FOQ0VMX1RJTUVPVVQiLAorCSBOVF9TVEFUVVNfRFJJVkVSX0NBTkNFTF9USU1FT1VUfSwKKwl7Ik5UX1NUQVRVU19SRVBMWV9NRVNTQUdFX01JU01BVENIIiwKKwkgTlRfU1RBVFVTX1JFUExZX01FU1NBR0VfTUlTTUFUQ0h9LAorCXsiTlRfU1RBVFVTX01BUFBFRF9BTElHTk1FTlQiLCBOVF9TVEFUVVNfTUFQUEVEX0FMSUdOTUVOVH0sCisJeyJOVF9TVEFUVVNfSU1BR0VfQ0hFQ0tTVU1fTUlTTUFUQ0giLAorCSBOVF9TVEFUVVNfSU1BR0VfQ0hFQ0tTVU1fTUlTTUFUQ0h9LAorCXsiTlRfU1RBVFVTX0xPU1RfV1JJVEVCRUhJTkRfREFUQSIsCisJIE5UX1NUQVRVU19MT1NUX1dSSVRFQkVISU5EX0RBVEF9LAorCXsiTlRfU1RBVFVTX0NMSUVOVF9TRVJWRVJfUEFSQU1FVEVSU19JTlZBTElEIiwKKwkgTlRfU1RBVFVTX0NMSUVOVF9TRVJWRVJfUEFSQU1FVEVSU19JTlZBTElEfSwKKwl7Ik5UX1NUQVRVU19QQVNTV09SRF9NVVNUX0NIQU5HRSIsIE5UX1NUQVRVU19QQVNTV09SRF9NVVNUX0NIQU5HRX0sCisJeyJOVF9TVEFUVVNfTk9UX0ZPVU5EIiwgTlRfU1RBVFVTX05PVF9GT1VORH0sCisJeyJOVF9TVEFUVVNfTk9UX1RJTllfU1RSRUFNIiwgTlRfU1RBVFVTX05PVF9USU5ZX1NUUkVBTX0sCisJeyJOVF9TVEFUVVNfUkVDT1ZFUllfRkFJTFVSRSIsIE5UX1NUQVRVU19SRUNPVkVSWV9GQUlMVVJFfSwKKwl7Ik5UX1NUQVRVU19TVEFDS19PVkVSRkxPV19SRUFEIiwgTlRfU1RBVFVTX1NUQUNLX09WRVJGTE9XX1JFQUR9LAorCXsiTlRfU1RBVFVTX0ZBSUxfQ0hFQ0siLCBOVF9TVEFUVVNfRkFJTF9DSEVDS30sCisJeyJOVF9TVEFUVVNfRFVQTElDQVRFX09CSkVDVElEIiwgTlRfU1RBVFVTX0RVUExJQ0FURV9PQkpFQ1RJRH0sCisJeyJOVF9TVEFUVVNfT0JKRUNUSURfRVhJU1RTIiwgTlRfU1RBVFVTX09CSkVDVElEX0VYSVNUU30sCisJeyJOVF9TVEFUVVNfQ09OVkVSVF9UT19MQVJHRSIsIE5UX1NUQVRVU19DT05WRVJUX1RPX0xBUkdFfSwKKwl7Ik5UX1NUQVRVU19SRVRSWSIsIE5UX1NUQVRVU19SRVRSWX0sCisJeyJOVF9TVEFUVVNfRk9VTkRfT1VUX09GX1NDT1BFIiwgTlRfU1RBVFVTX0ZPVU5EX09VVF9PRl9TQ09QRX0sCisJeyJOVF9TVEFUVVNfQUxMT0NBVEVfQlVDS0VUIiwgTlRfU1RBVFVTX0FMTE9DQVRFX0JVQ0tFVH0sCisJeyJOVF9TVEFUVVNfUFJPUFNFVF9OT1RfRk9VTkQiLCBOVF9TVEFUVVNfUFJPUFNFVF9OT1RfRk9VTkR9LAorCXsiTlRfU1RBVFVTX01BUlNIQUxMX09WRVJGTE9XIiwgTlRfU1RBVFVTX01BUlNIQUxMX09WRVJGTE9XfSwKKwl7Ik5UX1NUQVRVU19JTlZBTElEX1ZBUklBTlQiLCBOVF9TVEFUVVNfSU5WQUxJRF9WQVJJQU5UfSwKKwl7Ik5UX1NUQVRVU19ET01BSU5fQ09OVFJPTExFUl9OT1RfRk9VTkQiLAorCSBOVF9TVEFUVVNfRE9NQUlOX0NPTlRST0xMRVJfTk9UX0ZPVU5EfSwKKwl7Ik5UX1NUQVRVU19BQ0NPVU5UX0xPQ0tFRF9PVVQiLCBOVF9TVEFUVVNfQUNDT1VOVF9MT0NLRURfT1VUfSwKKwl7Ik5UX1NUQVRVU19IQU5ETEVfTk9UX0NMT1NBQkxFIiwgTlRfU1RBVFVTX0hBTkRMRV9OT1RfQ0xPU0FCTEV9LAorCXsiTlRfU1RBVFVTX0NPTk5FQ1RJT05fUkVGVVNFRCIsIE5UX1NUQVRVU19DT05ORUNUSU9OX1JFRlVTRUR9LAorCXsiTlRfU1RBVFVTX0dSQUNFRlVMX0RJU0NPTk5FQ1QiLCBOVF9TVEFUVVNfR1JBQ0VGVUxfRElTQ09OTkVDVH0sCisJeyJOVF9TVEFUVVNfQUREUkVTU19BTFJFQURZX0FTU09DSUFURUQiLAorCSBOVF9TVEFUVVNfQUREUkVTU19BTFJFQURZX0FTU09DSUFURUR9LAorCXsiTlRfU1RBVFVTX0FERFJFU1NfTk9UX0FTU09DSUFURUQiLAorCSBOVF9TVEFUVVNfQUREUkVTU19OT1RfQVNTT0NJQVRFRH0sCisJeyJOVF9TVEFUVVNfQ09OTkVDVElPTl9JTlZBTElEIiwgTlRfU1RBVFVTX0NPTk5FQ1RJT05fSU5WQUxJRH0sCisJeyJOVF9TVEFUVVNfQ09OTkVDVElPTl9BQ1RJVkUiLCBOVF9TVEFUVVNfQ09OTkVDVElPTl9BQ1RJVkV9LAorCXsiTlRfU1RBVFVTX05FVFdPUktfVU5SRUFDSEFCTEUiLCBOVF9TVEFUVVNfTkVUV09SS19VTlJFQUNIQUJMRX0sCisJeyJOVF9TVEFUVVNfSE9TVF9VTlJFQUNIQUJMRSIsIE5UX1NUQVRVU19IT1NUX1VOUkVBQ0hBQkxFfSwKKwl7Ik5UX1NUQVRVU19QUk9UT0NPTF9VTlJFQUNIQUJMRSIsIE5UX1NUQVRVU19QUk9UT0NPTF9VTlJFQUNIQUJMRX0sCisJeyJOVF9TVEFUVVNfUE9SVF9VTlJFQUNIQUJMRSIsIE5UX1NUQVRVU19QT1JUX1VOUkVBQ0hBQkxFfSwKKwl7Ik5UX1NUQVRVU19SRVFVRVNUX0FCT1JURUQiLCBOVF9TVEFUVVNfUkVRVUVTVF9BQk9SVEVEfSwKKwl7Ik5UX1NUQVRVU19DT05ORUNUSU9OX0FCT1JURUQiLCBOVF9TVEFUVVNfQ09OTkVDVElPTl9BQk9SVEVEfSwKKwl7Ik5UX1NUQVRVU19CQURfQ09NUFJFU1NJT05fQlVGRkVSIiwKKwkgTlRfU1RBVFVTX0JBRF9DT01QUkVTU0lPTl9CVUZGRVJ9LAorCXsiTlRfU1RBVFVTX1VTRVJfTUFQUEVEX0ZJTEUiLCBOVF9TVEFUVVNfVVNFUl9NQVBQRURfRklMRX0sCisJeyJOVF9TVEFUVVNfQVVESVRfRkFJTEVEIiwgTlRfU1RBVFVTX0FVRElUX0ZBSUxFRH0sCisJeyJOVF9TVEFUVVNfVElNRVJfUkVTT0xVVElPTl9OT1RfU0VUIiwKKwkgTlRfU1RBVFVTX1RJTUVSX1JFU09MVVRJT05fTk9UX1NFVH0sCisJeyJOVF9TVEFUVVNfQ09OTkVDVElPTl9DT1VOVF9MSU1JVCIsCisJIE5UX1NUQVRVU19DT05ORUNUSU9OX0NPVU5UX0xJTUlUfSwKKwl7Ik5UX1NUQVRVU19MT0dJTl9USU1FX1JFU1RSSUNUSU9OIiwKKwkgTlRfU1RBVFVTX0xPR0lOX1RJTUVfUkVTVFJJQ1RJT059LAorCXsiTlRfU1RBVFVTX0xPR0lOX1dLU1RBX1JFU1RSSUNUSU9OIiwKKwkgTlRfU1RBVFVTX0xPR0lOX1dLU1RBX1JFU1RSSUNUSU9OfSwKKwl7Ik5UX1NUQVRVU19JTUFHRV9NUF9VUF9NSVNNQVRDSCIsIE5UX1NUQVRVU19JTUFHRV9NUF9VUF9NSVNNQVRDSH0sCisJeyJOVF9TVEFUVVNfSU5TVUZGSUNJRU5UX0xPR09OX0lORk8iLAorCSBOVF9TVEFUVVNfSU5TVUZGSUNJRU5UX0xPR09OX0lORk99LAorCXsiTlRfU1RBVFVTX0JBRF9ETExfRU5UUllQT0lOVCIsIE5UX1NUQVRVU19CQURfRExMX0VOVFJZUE9JTlR9LAorCXsiTlRfU1RBVFVTX0JBRF9TRVJWSUNFX0VOVFJZUE9JTlQiLAorCSBOVF9TVEFUVVNfQkFEX1NFUlZJQ0VfRU5UUllQT0lOVH0sCisJeyJOVF9TVEFUVVNfTFBDX1JFUExZX0xPU1QiLCBOVF9TVEFUVVNfTFBDX1JFUExZX0xPU1R9LAorCXsiTlRfU1RBVFVTX0lQX0FERFJFU1NfQ09ORkxJQ1QxIiwgTlRfU1RBVFVTX0lQX0FERFJFU1NfQ09ORkxJQ1QxfSwKKwl7Ik5UX1NUQVRVU19JUF9BRERSRVNTX0NPTkZMSUNUMiIsIE5UX1NUQVRVU19JUF9BRERSRVNTX0NPTkZMSUNUMn0sCisJeyJOVF9TVEFUVVNfUkVHSVNUUllfUVVPVEFfTElNSVQiLCBOVF9TVEFUVVNfUkVHSVNUUllfUVVPVEFfTElNSVR9LAorCXsiTlRfU1RBVFVTX1BBVEhfTk9UX0NPVkVSRUQiLCBOVF9TVEFUVVNfUEFUSF9OT1RfQ09WRVJFRH0sCisJeyJOVF9TVEFUVVNfTk9fQ0FMTEJBQ0tfQUNUSVZFIiwgTlRfU1RBVFVTX05PX0NBTExCQUNLX0FDVElWRX0sCisJeyJOVF9TVEFUVVNfTElDRU5TRV9RVU9UQV9FWENFRURFRCIsCisJIE5UX1NUQVRVU19MSUNFTlNFX1FVT1RBX0VYQ0VFREVEfSwKKwl7Ik5UX1NUQVRVU19QV0RfVE9PX1NIT1JUIiwgTlRfU1RBVFVTX1BXRF9UT09fU0hPUlR9LAorCXsiTlRfU1RBVFVTX1BXRF9UT09fUkVDRU5UIiwgTlRfU1RBVFVTX1BXRF9UT09fUkVDRU5UfSwKKwl7Ik5UX1NUQVRVU19QV0RfSElTVE9SWV9DT05GTElDVCIsIE5UX1NUQVRVU19QV0RfSElTVE9SWV9DT05GTElDVH0sCisJeyJOVF9TVEFUVVNfUExVR1BMQVlfTk9fREVWSUNFIiwgTlRfU1RBVFVTX1BMVUdQTEFZX05PX0RFVklDRX0sCisJeyJOVF9TVEFUVVNfVU5TVVBQT1JURURfQ09NUFJFU1NJT04iLAorCSBOVF9TVEFUVVNfVU5TVVBQT1JURURfQ09NUFJFU1NJT059LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfSFdfUFJPRklMRSIsIE5UX1NUQVRVU19JTlZBTElEX0hXX1BST0ZJTEV9LAorCXsiTlRfU1RBVFVTX0lOVkFMSURfUExVR1BMQVlfREVWSUNFX1BBVEgiLAorCSBOVF9TVEFUVVNfSU5WQUxJRF9QTFVHUExBWV9ERVZJQ0VfUEFUSH0sCisJeyJOVF9TVEFUVVNfRFJJVkVSX09SRElOQUxfTk9UX0ZPVU5EIiwKKwkgTlRfU1RBVFVTX0RSSVZFUl9PUkRJTkFMX05PVF9GT1VORH0sCisJeyJOVF9TVEFUVVNfRFJJVkVSX0VOVFJZUE9JTlRfTk9UX0ZPVU5EIiwKKwkgTlRfU1RBVFVTX0RSSVZFUl9FTlRSWVBPSU5UX05PVF9GT1VORH0sCisJeyJOVF9TVEFUVVNfUkVTT1VSQ0VfTk9UX09XTkVEIiwgTlRfU1RBVFVTX1JFU09VUkNFX05PVF9PV05FRH0sCisJeyJOVF9TVEFUVVNfVE9PX01BTllfTElOS1MiLCBOVF9TVEFUVVNfVE9PX01BTllfTElOS1N9LAorCXsiTlRfU1RBVFVTX1FVT1RBX0xJU1RfSU5DT05TSVNURU5UIiwKKwkgTlRfU1RBVFVTX1FVT1RBX0xJU1RfSU5DT05TSVNURU5UfSwKKwl7Ik5UX1NUQVRVU19GSUxFX0lTX09GRkxJTkUiLCBOVF9TVEFUVVNfRklMRV9JU19PRkZMSU5FfSwKKwl7Ik5UX1NUQVRVU19OT19NT1JFX0VOVFJJRVMiLCBOVF9TVEFUVVNfTk9fTU9SRV9FTlRSSUVTfSwKKwl7IlNUQVRVU19NT1JFX0VOVFJJRVMiLCBTVEFUVVNfTU9SRV9FTlRSSUVTfSwKKwl7IlNUQVRVU19TT01FX1VOTUFQUEVEIiwgU1RBVFVTX1NPTUVfVU5NQVBQRUR9LAorCXtOVUxMLCAwfQorfTsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvbnRlcnIuaCBiL2ZzL2NpZnMvbnRlcnIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmZiMDZjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9udGVyci5oCkBAIC0wLDAgKzEsNTU2IEBACisvKiAKKyAgIFVuaXggU01CL05ldGJpb3MgaW1wbGVtZW50YXRpb24uCisgICBWZXJzaW9uIDEuOS4KKyAgIE5UIGVycm9yIGNvZGUgY29uc3RhbnRzCisgICBDb3B5cmlnaHQgKEMpIEFuZHJldyBUcmlkZ2VsbCAgICAgICAgICAgICAgMTk5Mi0yMDAwCisgICBDb3B5cmlnaHQgKEMpIEpvaG4gSCBUZXJwc3RyYSAgICAgICAgICAgICAgMTk5Ni0yMDAwCisgICBDb3B5cmlnaHQgKEMpIEx1a2UgS2VubmV0aCBDYXNzb24gTGVpZ2h0b24gMTk5Ni0yMDAwCisgICBDb3B5cmlnaHQgKEMpIFBhdWwgQXNodG9uICAgICAgICAgICAgICAgICAgMTk5OC0yMDAwCisgICAKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgICAKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgICAKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqLworCisKKworI2lmbmRlZiBfTlRFUlJfSAorI2RlZmluZSBfTlRFUlJfSAorCitzdHJ1Y3QgbnRfZXJyX2NvZGVfc3RydWN0IHsKKwljaGFyICpudF9lcnJzdHI7CisJX191MzIgbnRfZXJyY29kZTsKK307CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgbnRfZXJyX2NvZGVfc3RydWN0IG50X2VycnNbXTsKKworLyogV2luMzIgU3RhdHVzIGNvZGVzLiAqLworCisjZGVmaW5lIFNUQVRVU19CVUZGRVJfT1ZFUkZMT1cgICAgICAgICAgICAweDgwMDAwMDA1CisjZGVmaW5lIFNUQVRVU19NT1JFX0VOVFJJRVMgICAgICAgICAgICAgICAweDAxMDUKKyNkZWZpbmUgRVJST1JfSU5WQUxJRF9QQVJBTUVURVIJCSAgMHgwMDU3CisjZGVmaW5lIEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIJICAweDAwN2EKKyNkZWZpbmUgU1RBVFVTXzE4MDQJICAgICAgICAgICAgICAgICAgMHgwNzBjCisjZGVmaW5lIFNUQVRVU19OT1RJRllfRU5VTV9ESVIgICAgICAgICAgICAweDAxMGMKKworLyogV2luMzIgRXJyb3IgY29kZXMgZXh0cmFjdGVkIHVzaW5nIGEgbG9vcCBpbiBzbWJjbGllbnQgdGhlbiBwcmludGluZyBhCisgICBuZXRtb24gc25pZmYgdG8gYSBmaWxlLiAqLworCisjZGVmaW5lIE5UX1NUQVRVU19PSyAweDAwMDAKKyNkZWZpbmUgU1RBVFVTX1NPTUVfVU5NQVBQRUQgICAgICAgMHgwMTA3CisjZGVmaW5lIFNUQVRVU19CVUZGRVJfT1ZFUkZMT1cgICAgIDB4ODAwMDAwMDUKKyNkZWZpbmUgTlRfU1RBVFVTX05PX01PUkVfRU5UUklFUyAgMHg4MDAwMDAxYQorI2RlZmluZSBOVF9TVEFUVVNfVU5TVUNDRVNTRlVMIDB4QzAwMDAwMDAgfCAweDAwMDEKKyNkZWZpbmUgTlRfU1RBVFVTX05PVF9JTVBMRU1FTlRFRCAweEMwMDAwMDAwIHwgMHgwMDAyCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX0lORk9fQ0xBU1MgMHhDMDAwMDAwMCB8IDB4MDAwMworI2RlZmluZSBOVF9TVEFUVVNfSU5GT19MRU5HVEhfTUlTTUFUQ0ggMHhDMDAwMDAwMCB8IDB4MDAwNAorI2RlZmluZSBOVF9TVEFUVVNfQUNDRVNTX1ZJT0xBVElPTiAweEMwMDAwMDAwIHwgMHgwMDA1CisjZGVmaW5lIE5UX1NUQVRVU19JTl9QQUdFX0VSUk9SIDB4QzAwMDAwMDAgfCAweDAwMDYKKyNkZWZpbmUgTlRfU1RBVFVTX1BBR0VGSUxFX1FVT1RBIDB4QzAwMDAwMDAgfCAweDAwMDcKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfSEFORExFIDB4QzAwMDAwMDAgfCAweDAwMDgKKyNkZWZpbmUgTlRfU1RBVFVTX0JBRF9JTklUSUFMX1NUQUNLIDB4QzAwMDAwMDAgfCAweDAwMDkKKyNkZWZpbmUgTlRfU1RBVFVTX0JBRF9JTklUSUFMX1BDIDB4QzAwMDAwMDAgfCAweDAwMGEKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfQ0lEIDB4QzAwMDAwMDAgfCAweDAwMGIKKyNkZWZpbmUgTlRfU1RBVFVTX1RJTUVSX05PVF9DQU5DRUxFRCAweEMwMDAwMDAwIHwgMHgwMDBjCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUiAweEMwMDAwMDAwIHwgMHgwMDBkCisjZGVmaW5lIE5UX1NUQVRVU19OT19TVUNIX0RFVklDRSAweEMwMDAwMDAwIHwgMHgwMDBlCisjZGVmaW5lIE5UX1NUQVRVU19OT19TVUNIX0ZJTEUgMHhDMDAwMDAwMCB8IDB4MDAwZgorI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9ERVZJQ0VfUkVRVUVTVCAweEMwMDAwMDAwIHwgMHgwMDEwCisjZGVmaW5lIE5UX1NUQVRVU19FTkRfT0ZfRklMRSAweEMwMDAwMDAwIHwgMHgwMDExCisjZGVmaW5lIE5UX1NUQVRVU19XUk9OR19WT0xVTUUgMHhDMDAwMDAwMCB8IDB4MDAxMgorI2RlZmluZSBOVF9TVEFUVVNfTk9fTUVESUFfSU5fREVWSUNFIDB4QzAwMDAwMDAgfCAweDAwMTMKKyNkZWZpbmUgTlRfU1RBVFVTX1VOUkVDT0dOSVpFRF9NRURJQSAweEMwMDAwMDAwIHwgMHgwMDE0CisjZGVmaW5lIE5UX1NUQVRVU19OT05FWElTVEVOVF9TRUNUT1IgMHhDMDAwMDAwMCB8IDB4MDAxNQorI2RlZmluZSBOVF9TVEFUVVNfTU9SRV9QUk9DRVNTSU5HX1JFUVVJUkVEIDB4QzAwMDAwMDAgfCAweDAwMTYKKyNkZWZpbmUgTlRfU1RBVFVTX05PX01FTU9SWSAweEMwMDAwMDAwIHwgMHgwMDE3CisjZGVmaW5lIE5UX1NUQVRVU19DT05GTElDVElOR19BRERSRVNTRVMgMHhDMDAwMDAwMCB8IDB4MDAxOAorI2RlZmluZSBOVF9TVEFUVVNfTk9UX01BUFBFRF9WSUVXIDB4QzAwMDAwMDAgfCAweDAwMTkKKyNkZWZpbmUgTlRfU1RBVFVTX1VOQUJMRV9UT19GUkVFX1ZNIDB4ODAwMDAwMDAgfCAweDAwMWEKKyNkZWZpbmUgTlRfU1RBVFVTX1VOQUJMRV9UT19ERUxFVEVfU0VDVElPTiAweEMwMDAwMDAwIHwgMHgwMDFiCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX1NZU1RFTV9TRVJWSUNFIDB4QzAwMDAwMDAgfCAweDAwMWMKKyNkZWZpbmUgTlRfU1RBVFVTX0lMTEVHQUxfSU5TVFJVQ1RJT04gMHhDMDAwMDAwMCB8IDB4MDAxZAorI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9MT0NLX1NFUVVFTkNFIDB4QzAwMDAwMDAgfCAweDAwMWUKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfVklFV19TSVpFIDB4QzAwMDAwMDAgfCAweDAwMWYKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfRklMRV9GT1JfU0VDVElPTiAweEMwMDAwMDAwIHwgMHgwMDIwCisjZGVmaW5lIE5UX1NUQVRVU19BTFJFQURZX0NPTU1JVFRFRCAweEMwMDAwMDAwIHwgMHgwMDIxCisjZGVmaW5lIE5UX1NUQVRVU19BQ0NFU1NfREVOSUVEIDB4QzAwMDAwMDAgfCAweDAwMjIKKyNkZWZpbmUgTlRfU1RBVFVTX0JVRkZFUl9UT09fU01BTEwgMHhDMDAwMDAwMCB8IDB4MDAyMworI2RlZmluZSBOVF9TVEFUVVNfT0JKRUNUX1RZUEVfTUlTTUFUQ0ggMHhDMDAwMDAwMCB8IDB4MDAyNAorI2RlZmluZSBOVF9TVEFUVVNfTk9OQ09OVElOVUFCTEVfRVhDRVBUSU9OIDB4QzAwMDAwMDAgfCAweDAwMjUKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfRElTUE9TSVRJT04gMHhDMDAwMDAwMCB8IDB4MDAyNgorI2RlZmluZSBOVF9TVEFUVVNfVU5XSU5EIDB4QzAwMDAwMDAgfCAweDAwMjcKKyNkZWZpbmUgTlRfU1RBVFVTX0JBRF9TVEFDSyAweEMwMDAwMDAwIHwgMHgwMDI4CisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX1VOV0lORF9UQVJHRVQgMHhDMDAwMDAwMCB8IDB4MDAyOQorI2RlZmluZSBOVF9TVEFUVVNfTk9UX0xPQ0tFRCAweEMwMDAwMDAwIHwgMHgwMDJhCisjZGVmaW5lIE5UX1NUQVRVU19QQVJJVFlfRVJST1IgMHhDMDAwMDAwMCB8IDB4MDAyYgorI2RlZmluZSBOVF9TVEFUVVNfVU5BQkxFX1RPX0RFQ09NTUlUX1ZNIDB4QzAwMDAwMDAgfCAweDAwMmMKKyNkZWZpbmUgTlRfU1RBVFVTX05PVF9DT01NSVRURUQgMHhDMDAwMDAwMCB8IDB4MDAyZAorI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9QT1JUX0FUVFJJQlVURVMgMHhDMDAwMDAwMCB8IDB4MDAyZQorI2RlZmluZSBOVF9TVEFUVVNfUE9SVF9NRVNTQUdFX1RPT19MT05HIDB4QzAwMDAwMDAgfCAweDAwMmYKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSX01JWCAweEMwMDAwMDAwIHwgMHgwMDMwCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX1FVT1RBX0xPV0VSIDB4QzAwMDAwMDAgfCAweDAwMzEKKyNkZWZpbmUgTlRfU1RBVFVTX0RJU0tfQ09SUlVQVF9FUlJPUiAweEMwMDAwMDAwIHwgMHgwMDMyCisjZGVmaW5lIE5UX1NUQVRVU19PQkpFQ1RfTkFNRV9JTlZBTElEIDB4QzAwMDAwMDAgfCAweDAwMzMKKyNkZWZpbmUgTlRfU1RBVFVTX09CSkVDVF9OQU1FX05PVF9GT1VORCAweEMwMDAwMDAwIHwgMHgwMDM0CisjZGVmaW5lIE5UX1NUQVRVU19PQkpFQ1RfTkFNRV9DT0xMSVNJT04gMHhDMDAwMDAwMCB8IDB4MDAzNQorI2RlZmluZSBOVF9TVEFUVVNfSEFORExFX05PVF9XQUlUQUJMRSAweEMwMDAwMDAwIHwgMHgwMDM2CisjZGVmaW5lIE5UX1NUQVRVU19QT1JUX0RJU0NPTk5FQ1RFRCAweEMwMDAwMDAwIHwgMHgwMDM3CisjZGVmaW5lIE5UX1NUQVRVU19ERVZJQ0VfQUxSRUFEWV9BVFRBQ0hFRCAweEMwMDAwMDAwIHwgMHgwMDM4CisjZGVmaW5lIE5UX1NUQVRVU19PQkpFQ1RfUEFUSF9JTlZBTElEIDB4QzAwMDAwMDAgfCAweDAwMzkKKyNkZWZpbmUgTlRfU1RBVFVTX09CSkVDVF9QQVRIX05PVF9GT1VORCAweEMwMDAwMDAwIHwgMHgwMDNhCisjZGVmaW5lIE5UX1NUQVRVU19PQkpFQ1RfUEFUSF9TWU5UQVhfQkFEIDB4QzAwMDAwMDAgfCAweDAwM2IKKyNkZWZpbmUgTlRfU1RBVFVTX0RBVEFfT1ZFUlJVTiAweEMwMDAwMDAwIHwgMHgwMDNjCisjZGVmaW5lIE5UX1NUQVRVU19EQVRBX0xBVEVfRVJST1IgMHhDMDAwMDAwMCB8IDB4MDAzZAorI2RlZmluZSBOVF9TVEFUVVNfREFUQV9FUlJPUiAweEMwMDAwMDAwIHwgMHgwMDNlCisjZGVmaW5lIE5UX1NUQVRVU19DUkNfRVJST1IgMHhDMDAwMDAwMCB8IDB4MDAzZgorI2RlZmluZSBOVF9TVEFUVVNfU0VDVElPTl9UT09fQklHIDB4QzAwMDAwMDAgfCAweDAwNDAKKyNkZWZpbmUgTlRfU1RBVFVTX1BPUlRfQ09OTkVDVElPTl9SRUZVU0VEIDB4QzAwMDAwMDAgfCAweDAwNDEKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfUE9SVF9IQU5ETEUgMHhDMDAwMDAwMCB8IDB4MDA0MgorI2RlZmluZSBOVF9TVEFUVVNfU0hBUklOR19WSU9MQVRJT04gMHhDMDAwMDAwMCB8IDB4MDA0MworI2RlZmluZSBOVF9TVEFUVVNfUVVPVEFfRVhDRUVERUQgMHhDMDAwMDAwMCB8IDB4MDA0NAorI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9QQUdFX1BST1RFQ1RJT04gMHhDMDAwMDAwMCB8IDB4MDA0NQorI2RlZmluZSBOVF9TVEFUVVNfTVVUQU5UX05PVF9PV05FRCAweEMwMDAwMDAwIHwgMHgwMDQ2CisjZGVmaW5lIE5UX1NUQVRVU19TRU1BUEhPUkVfTElNSVRfRVhDRUVERUQgMHhDMDAwMDAwMCB8IDB4MDA0NworI2RlZmluZSBOVF9TVEFUVVNfUE9SVF9BTFJFQURZX1NFVCAweEMwMDAwMDAwIHwgMHgwMDQ4CisjZGVmaW5lIE5UX1NUQVRVU19TRUNUSU9OX05PVF9JTUFHRSAweEMwMDAwMDAwIHwgMHgwMDQ5CisjZGVmaW5lIE5UX1NUQVRVU19TVVNQRU5EX0NPVU5UX0VYQ0VFREVEIDB4QzAwMDAwMDAgfCAweDAwNGEKKyNkZWZpbmUgTlRfU1RBVFVTX1RIUkVBRF9JU19URVJNSU5BVElORyAweEMwMDAwMDAwIHwgMHgwMDRiCisjZGVmaW5lIE5UX1NUQVRVU19CQURfV09SS0lOR19TRVRfTElNSVQgMHhDMDAwMDAwMCB8IDB4MDA0YworI2RlZmluZSBOVF9TVEFUVVNfSU5DT01QQVRJQkxFX0ZJTEVfTUFQIDB4QzAwMDAwMDAgfCAweDAwNGQKKyNkZWZpbmUgTlRfU1RBVFVTX1NFQ1RJT05fUFJPVEVDVElPTiAweEMwMDAwMDAwIHwgMHgwMDRlCisjZGVmaW5lIE5UX1NUQVRVU19FQVNfTk9UX1NVUFBPUlRFRCAweEMwMDAwMDAwIHwgMHgwMDRmCisjZGVmaW5lIE5UX1NUQVRVU19FQV9UT09fTEFSR0UgMHhDMDAwMDAwMCB8IDB4MDA1MAorI2RlZmluZSBOVF9TVEFUVVNfTk9ORVhJU1RFTlRfRUFfRU5UUlkgMHhDMDAwMDAwMCB8IDB4MDA1MQorI2RlZmluZSBOVF9TVEFUVVNfTk9fRUFTX09OX0ZJTEUgMHhDMDAwMDAwMCB8IDB4MDA1MgorI2RlZmluZSBOVF9TVEFUVVNfRUFfQ09SUlVQVF9FUlJPUiAweEMwMDAwMDAwIHwgMHgwMDUzCisjZGVmaW5lIE5UX1NUQVRVU19GSUxFX0xPQ0tfQ09ORkxJQ1QgMHhDMDAwMDAwMCB8IDB4MDA1NAorI2RlZmluZSBOVF9TVEFUVVNfTE9DS19OT1RfR1JBTlRFRCAweEMwMDAwMDAwIHwgMHgwMDU1CisjZGVmaW5lIE5UX1NUQVRVU19ERUxFVEVfUEVORElORyAweEMwMDAwMDAwIHwgMHgwMDU2CisjZGVmaW5lIE5UX1NUQVRVU19DVExfRklMRV9OT1RfU1VQUE9SVEVEIDB4QzAwMDAwMDAgfCAweDAwNTcKKyNkZWZpbmUgTlRfU1RBVFVTX1VOS05PV05fUkVWSVNJT04gMHhDMDAwMDAwMCB8IDB4MDA1OAorI2RlZmluZSBOVF9TVEFUVVNfUkVWSVNJT05fTUlTTUFUQ0ggMHhDMDAwMDAwMCB8IDB4MDA1OQorI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9PV05FUiAweEMwMDAwMDAwIHwgMHgwMDVhCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX1BSSU1BUllfR1JPVVAgMHhDMDAwMDAwMCB8IDB4MDA1YgorI2RlZmluZSBOVF9TVEFUVVNfTk9fSU1QRVJTT05BVElPTl9UT0tFTiAweEMwMDAwMDAwIHwgMHgwMDVjCisjZGVmaW5lIE5UX1NUQVRVU19DQU5UX0RJU0FCTEVfTUFOREFUT1JZIDB4QzAwMDAwMDAgfCAweDAwNWQKKyNkZWZpbmUgTlRfU1RBVFVTX05PX0xPR09OX1NFUlZFUlMgMHhDMDAwMDAwMCB8IDB4MDA1ZQorI2RlZmluZSBOVF9TVEFUVVNfTk9fU1VDSF9MT0dPTl9TRVNTSU9OIDB4QzAwMDAwMDAgfCAweDAwNWYKKyNkZWZpbmUgTlRfU1RBVFVTX05PX1NVQ0hfUFJJVklMRUdFIDB4QzAwMDAwMDAgfCAweDAwNjAKKyNkZWZpbmUgTlRfU1RBVFVTX1BSSVZJTEVHRV9OT1RfSEVMRCAweEMwMDAwMDAwIHwgMHgwMDYxCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX0FDQ09VTlRfTkFNRSAweEMwMDAwMDAwIHwgMHgwMDYyCisjZGVmaW5lIE5UX1NUQVRVU19VU0VSX0VYSVNUUyAweEMwMDAwMDAwIHwgMHgwMDYzCisjZGVmaW5lIE5UX1NUQVRVU19OT19TVUNIX1VTRVIgMHhDMDAwMDAwMCB8IDB4MDA2NAorI2RlZmluZSBOVF9TVEFUVVNfR1JPVVBfRVhJU1RTIDB4QzAwMDAwMDAgfCAweDAwNjUKKyNkZWZpbmUgTlRfU1RBVFVTX05PX1NVQ0hfR1JPVVAgMHhDMDAwMDAwMCB8IDB4MDA2NgorI2RlZmluZSBOVF9TVEFUVVNfTUVNQkVSX0lOX0dST1VQIDB4QzAwMDAwMDAgfCAweDAwNjcKKyNkZWZpbmUgTlRfU1RBVFVTX01FTUJFUl9OT1RfSU5fR1JPVVAgMHhDMDAwMDAwMCB8IDB4MDA2OAorI2RlZmluZSBOVF9TVEFUVVNfTEFTVF9BRE1JTiAweEMwMDAwMDAwIHwgMHgwMDY5CisjZGVmaW5lIE5UX1NUQVRVU19XUk9OR19QQVNTV09SRCAweEMwMDAwMDAwIHwgMHgwMDZhCisjZGVmaW5lIE5UX1NUQVRVU19JTExfRk9STUVEX1BBU1NXT1JEIDB4QzAwMDAwMDAgfCAweDAwNmIKKyNkZWZpbmUgTlRfU1RBVFVTX1BBU1NXT1JEX1JFU1RSSUNUSU9OIDB4QzAwMDAwMDAgfCAweDAwNmMKKyNkZWZpbmUgTlRfU1RBVFVTX0xPR09OX0ZBSUxVUkUgMHhDMDAwMDAwMCB8IDB4MDA2ZAorI2RlZmluZSBOVF9TVEFUVVNfQUNDT1VOVF9SRVNUUklDVElPTiAweEMwMDAwMDAwIHwgMHgwMDZlCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX0xPR09OX0hPVVJTIDB4QzAwMDAwMDAgfCAweDAwNmYKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfV09SS1NUQVRJT04gMHhDMDAwMDAwMCB8IDB4MDA3MAorI2RlZmluZSBOVF9TVEFUVVNfUEFTU1dPUkRfRVhQSVJFRCAweEMwMDAwMDAwIHwgMHgwMDcxCisjZGVmaW5lIE5UX1NUQVRVU19BQ0NPVU5UX0RJU0FCTEVEIDB4QzAwMDAwMDAgfCAweDAwNzIKKyNkZWZpbmUgTlRfU1RBVFVTX05PTkVfTUFQUEVEIDB4QzAwMDAwMDAgfCAweDAwNzMKKyNkZWZpbmUgTlRfU1RBVFVTX1RPT19NQU5ZX0xVSURTX1JFUVVFU1RFRCAweEMwMDAwMDAwIHwgMHgwMDc0CisjZGVmaW5lIE5UX1NUQVRVU19MVUlEU19FWEhBVVNURUQgMHhDMDAwMDAwMCB8IDB4MDA3NQorI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9TVUJfQVVUSE9SSVRZIDB4QzAwMDAwMDAgfCAweDAwNzYKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfQUNMIDB4QzAwMDAwMDAgfCAweDAwNzcKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfU0lEIDB4QzAwMDAwMDAgfCAweDAwNzgKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfU0VDVVJJVFlfREVTQ1IgMHhDMDAwMDAwMCB8IDB4MDA3OQorI2RlZmluZSBOVF9TVEFUVVNfUFJPQ0VEVVJFX05PVF9GT1VORCAweEMwMDAwMDAwIHwgMHgwMDdhCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX0lNQUdFX0ZPUk1BVCAweEMwMDAwMDAwIHwgMHgwMDdiCisjZGVmaW5lIE5UX1NUQVRVU19OT19UT0tFTiAweEMwMDAwMDAwIHwgMHgwMDdjCisjZGVmaW5lIE5UX1NUQVRVU19CQURfSU5IRVJJVEFOQ0VfQUNMIDB4QzAwMDAwMDAgfCAweDAwN2QKKyNkZWZpbmUgTlRfU1RBVFVTX1JBTkdFX05PVF9MT0NLRUQgMHhDMDAwMDAwMCB8IDB4MDA3ZQorI2RlZmluZSBOVF9TVEFUVVNfRElTS19GVUxMIDB4QzAwMDAwMDAgfCAweDAwN2YKKyNkZWZpbmUgTlRfU1RBVFVTX1NFUlZFUl9ESVNBQkxFRCAweEMwMDAwMDAwIHwgMHgwMDgwCisjZGVmaW5lIE5UX1NUQVRVU19TRVJWRVJfTk9UX0RJU0FCTEVEIDB4QzAwMDAwMDAgfCAweDAwODEKKyNkZWZpbmUgTlRfU1RBVFVTX1RPT19NQU5ZX0dVSURTX1JFUVVFU1RFRCAweEMwMDAwMDAwIHwgMHgwMDgyCisjZGVmaW5lIE5UX1NUQVRVU19HVUlEU19FWEhBVVNURUQgMHhDMDAwMDAwMCB8IDB4MDA4MworI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9JRF9BVVRIT1JJVFkgMHhDMDAwMDAwMCB8IDB4MDA4NAorI2RlZmluZSBOVF9TVEFUVVNfQUdFTlRTX0VYSEFVU1RFRCAweEMwMDAwMDAwIHwgMHgwMDg1CisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX1ZPTFVNRV9MQUJFTCAweEMwMDAwMDAwIHwgMHgwMDg2CisjZGVmaW5lIE5UX1NUQVRVU19TRUNUSU9OX05PVF9FWFRFTkRFRCAweEMwMDAwMDAwIHwgMHgwMDg3CisjZGVmaW5lIE5UX1NUQVRVU19OT1RfTUFQUEVEX0RBVEEgMHhDMDAwMDAwMCB8IDB4MDA4OAorI2RlZmluZSBOVF9TVEFUVVNfUkVTT1VSQ0VfREFUQV9OT1RfRk9VTkQgMHhDMDAwMDAwMCB8IDB4MDA4OQorI2RlZmluZSBOVF9TVEFUVVNfUkVTT1VSQ0VfVFlQRV9OT1RfRk9VTkQgMHhDMDAwMDAwMCB8IDB4MDA4YQorI2RlZmluZSBOVF9TVEFUVVNfUkVTT1VSQ0VfTkFNRV9OT1RfRk9VTkQgMHhDMDAwMDAwMCB8IDB4MDA4YgorI2RlZmluZSBOVF9TVEFUVVNfQVJSQVlfQk9VTkRTX0VYQ0VFREVEIDB4QzAwMDAwMDAgfCAweDAwOGMKKyNkZWZpbmUgTlRfU1RBVFVTX0ZMT0FUX0RFTk9STUFMX09QRVJBTkQgMHhDMDAwMDAwMCB8IDB4MDA4ZAorI2RlZmluZSBOVF9TVEFUVVNfRkxPQVRfRElWSURFX0JZX1pFUk8gMHhDMDAwMDAwMCB8IDB4MDA4ZQorI2RlZmluZSBOVF9TVEFUVVNfRkxPQVRfSU5FWEFDVF9SRVNVTFQgMHhDMDAwMDAwMCB8IDB4MDA4ZgorI2RlZmluZSBOVF9TVEFUVVNfRkxPQVRfSU5WQUxJRF9PUEVSQVRJT04gMHhDMDAwMDAwMCB8IDB4MDA5MAorI2RlZmluZSBOVF9TVEFUVVNfRkxPQVRfT1ZFUkZMT1cgMHhDMDAwMDAwMCB8IDB4MDA5MQorI2RlZmluZSBOVF9TVEFUVVNfRkxPQVRfU1RBQ0tfQ0hFQ0sgMHhDMDAwMDAwMCB8IDB4MDA5MgorI2RlZmluZSBOVF9TVEFUVVNfRkxPQVRfVU5ERVJGTE9XIDB4QzAwMDAwMDAgfCAweDAwOTMKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVEVHRVJfRElWSURFX0JZX1pFUk8gMHhDMDAwMDAwMCB8IDB4MDA5NAorI2RlZmluZSBOVF9TVEFUVVNfSU5URUdFUl9PVkVSRkxPVyAweEMwMDAwMDAwIHwgMHgwMDk1CisjZGVmaW5lIE5UX1NUQVRVU19QUklWSUxFR0VEX0lOU1RSVUNUSU9OIDB4QzAwMDAwMDAgfCAweDAwOTYKKyNkZWZpbmUgTlRfU1RBVFVTX1RPT19NQU5ZX1BBR0lOR19GSUxFUyAweEMwMDAwMDAwIHwgMHgwMDk3CisjZGVmaW5lIE5UX1NUQVRVU19GSUxFX0lOVkFMSUQgMHhDMDAwMDAwMCB8IDB4MDA5OAorI2RlZmluZSBOVF9TVEFUVVNfQUxMT1RURURfU1BBQ0VfRVhDRUVERUQgMHhDMDAwMDAwMCB8IDB4MDA5OQorI2RlZmluZSBOVF9TVEFUVVNfSU5TVUZGSUNJRU5UX1JFU09VUkNFUyAweEMwMDAwMDAwIHwgMHgwMDlhCisjZGVmaW5lIE5UX1NUQVRVU19ERlNfRVhJVF9QQVRIX0ZPVU5EIDB4QzAwMDAwMDAgfCAweDAwOWIKKyNkZWZpbmUgTlRfU1RBVFVTX0RFVklDRV9EQVRBX0VSUk9SIDB4QzAwMDAwMDAgfCAweDAwOWMKKyNkZWZpbmUgTlRfU1RBVFVTX0RFVklDRV9OT1RfQ09OTkVDVEVEIDB4QzAwMDAwMDAgfCAweDAwOWQKKyNkZWZpbmUgTlRfU1RBVFVTX0RFVklDRV9QT1dFUl9GQUlMVVJFIDB4QzAwMDAwMDAgfCAweDAwOWUKKyNkZWZpbmUgTlRfU1RBVFVTX0ZSRUVfVk1fTk9UX0FUX0JBU0UgMHhDMDAwMDAwMCB8IDB4MDA5ZgorI2RlZmluZSBOVF9TVEFUVVNfTUVNT1JZX05PVF9BTExPQ0FURUQgMHhDMDAwMDAwMCB8IDB4MDBhMAorI2RlZmluZSBOVF9TVEFUVVNfV09SS0lOR19TRVRfUVVPVEEgMHhDMDAwMDAwMCB8IDB4MDBhMQorI2RlZmluZSBOVF9TVEFUVVNfTUVESUFfV1JJVEVfUFJPVEVDVEVEIDB4QzAwMDAwMDAgfCAweDAwYTIKKyNkZWZpbmUgTlRfU1RBVFVTX0RFVklDRV9OT1RfUkVBRFkgMHhDMDAwMDAwMCB8IDB4MDBhMworI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9HUk9VUF9BVFRSSUJVVEVTIDB4QzAwMDAwMDAgfCAweDAwYTQKKyNkZWZpbmUgTlRfU1RBVFVTX0JBRF9JTVBFUlNPTkFUSU9OX0xFVkVMIDB4QzAwMDAwMDAgfCAweDAwYTUKKyNkZWZpbmUgTlRfU1RBVFVTX0NBTlRfT1BFTl9BTk9OWU1PVVMgMHhDMDAwMDAwMCB8IDB4MDBhNgorI2RlZmluZSBOVF9TVEFUVVNfQkFEX1ZBTElEQVRJT05fQ0xBU1MgMHhDMDAwMDAwMCB8IDB4MDBhNworI2RlZmluZSBOVF9TVEFUVVNfQkFEX1RPS0VOX1RZUEUgMHhDMDAwMDAwMCB8IDB4MDBhOAorI2RlZmluZSBOVF9TVEFUVVNfQkFEX01BU1RFUl9CT09UX1JFQ09SRCAweEMwMDAwMDAwIHwgMHgwMGE5CisjZGVmaW5lIE5UX1NUQVRVU19JTlNUUlVDVElPTl9NSVNBTElHTk1FTlQgMHhDMDAwMDAwMCB8IDB4MDBhYQorI2RlZmluZSBOVF9TVEFUVVNfSU5TVEFOQ0VfTk9UX0FWQUlMQUJMRSAweEMwMDAwMDAwIHwgMHgwMGFiCisjZGVmaW5lIE5UX1NUQVRVU19QSVBFX05PVF9BVkFJTEFCTEUgMHhDMDAwMDAwMCB8IDB4MDBhYworI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9QSVBFX1NUQVRFIDB4QzAwMDAwMDAgfCAweDAwYWQKKyNkZWZpbmUgTlRfU1RBVFVTX1BJUEVfQlVTWSAweEMwMDAwMDAwIHwgMHgwMGFlCisjZGVmaW5lIE5UX1NUQVRVU19JTExFR0FMX0ZVTkNUSU9OIDB4QzAwMDAwMDAgfCAweDAwYWYKKyNkZWZpbmUgTlRfU1RBVFVTX1BJUEVfRElTQ09OTkVDVEVEIDB4QzAwMDAwMDAgfCAweDAwYjAKKyNkZWZpbmUgTlRfU1RBVFVTX1BJUEVfQ0xPU0lORyAweEMwMDAwMDAwIHwgMHgwMGIxCisjZGVmaW5lIE5UX1NUQVRVU19QSVBFX0NPTk5FQ1RFRCAweEMwMDAwMDAwIHwgMHgwMGIyCisjZGVmaW5lIE5UX1NUQVRVU19QSVBFX0xJU1RFTklORyAweEMwMDAwMDAwIHwgMHgwMGIzCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX1JFQURfTU9ERSAweEMwMDAwMDAwIHwgMHgwMGI0CisjZGVmaW5lIE5UX1NUQVRVU19JT19USU1FT1VUIDB4QzAwMDAwMDAgfCAweDAwYjUKKyNkZWZpbmUgTlRfU1RBVFVTX0ZJTEVfRk9SQ0VEX0NMT1NFRCAweEMwMDAwMDAwIHwgMHgwMGI2CisjZGVmaW5lIE5UX1NUQVRVU19QUk9GSUxJTkdfTk9UX1NUQVJURUQgMHhDMDAwMDAwMCB8IDB4MDBiNworI2RlZmluZSBOVF9TVEFUVVNfUFJPRklMSU5HX05PVF9TVE9QUEVEIDB4QzAwMDAwMDAgfCAweDAwYjgKKyNkZWZpbmUgTlRfU1RBVFVTX0NPVUxEX05PVF9JTlRFUlBSRVQgMHhDMDAwMDAwMCB8IDB4MDBiOQorI2RlZmluZSBOVF9TVEFUVVNfRklMRV9JU19BX0RJUkVDVE9SWSAweEMwMDAwMDAwIHwgMHgwMGJhCisjZGVmaW5lIE5UX1NUQVRVU19OT1RfU1VQUE9SVEVEIDB4QzAwMDAwMDAgfCAweDAwYmIKKyNkZWZpbmUgTlRfU1RBVFVTX1JFTU9URV9OT1RfTElTVEVOSU5HIDB4QzAwMDAwMDAgfCAweDAwYmMKKyNkZWZpbmUgTlRfU1RBVFVTX0RVUExJQ0FURV9OQU1FIDB4QzAwMDAwMDAgfCAweDAwYmQKKyNkZWZpbmUgTlRfU1RBVFVTX0JBRF9ORVRXT1JLX1BBVEggMHhDMDAwMDAwMCB8IDB4MDBiZQorI2RlZmluZSBOVF9TVEFUVVNfTkVUV09SS19CVVNZIDB4QzAwMDAwMDAgfCAweDAwYmYKKyNkZWZpbmUgTlRfU1RBVFVTX0RFVklDRV9ET0VTX05PVF9FWElTVCAweEMwMDAwMDAwIHwgMHgwMGMwCisjZGVmaW5lIE5UX1NUQVRVU19UT09fTUFOWV9DT01NQU5EUyAweEMwMDAwMDAwIHwgMHgwMGMxCisjZGVmaW5lIE5UX1NUQVRVU19BREFQVEVSX0hBUkRXQVJFX0VSUk9SIDB4QzAwMDAwMDAgfCAweDAwYzIKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfTkVUV09SS19SRVNQT05TRSAweEMwMDAwMDAwIHwgMHgwMGMzCisjZGVmaW5lIE5UX1NUQVRVU19VTkVYUEVDVEVEX05FVFdPUktfRVJST1IgMHhDMDAwMDAwMCB8IDB4MDBjNAorI2RlZmluZSBOVF9TVEFUVVNfQkFEX1JFTU9URV9BREFQVEVSIDB4QzAwMDAwMDAgfCAweDAwYzUKKyNkZWZpbmUgTlRfU1RBVFVTX1BSSU5UX1FVRVVFX0ZVTEwgMHhDMDAwMDAwMCB8IDB4MDBjNgorI2RlZmluZSBOVF9TVEFUVVNfTk9fU1BPT0xfU1BBQ0UgMHhDMDAwMDAwMCB8IDB4MDBjNworI2RlZmluZSBOVF9TVEFUVVNfUFJJTlRfQ0FOQ0VMTEVEIDB4QzAwMDAwMDAgfCAweDAwYzgKKyNkZWZpbmUgTlRfU1RBVFVTX05FVFdPUktfTkFNRV9ERUxFVEVEIDB4QzAwMDAwMDAgfCAweDAwYzkKKyNkZWZpbmUgTlRfU1RBVFVTX05FVFdPUktfQUNDRVNTX0RFTklFRCAweEMwMDAwMDAwIHwgMHgwMGNhCisjZGVmaW5lIE5UX1NUQVRVU19CQURfREVWSUNFX1RZUEUgMHhDMDAwMDAwMCB8IDB4MDBjYgorI2RlZmluZSBOVF9TVEFUVVNfQkFEX05FVFdPUktfTkFNRSAweEMwMDAwMDAwIHwgMHgwMGNjCisjZGVmaW5lIE5UX1NUQVRVU19UT09fTUFOWV9OQU1FUyAweEMwMDAwMDAwIHwgMHgwMGNkCisjZGVmaW5lIE5UX1NUQVRVU19UT09fTUFOWV9TRVNTSU9OUyAweEMwMDAwMDAwIHwgMHgwMGNlCisjZGVmaW5lIE5UX1NUQVRVU19TSEFSSU5HX1BBVVNFRCAweEMwMDAwMDAwIHwgMHgwMGNmCisjZGVmaW5lIE5UX1NUQVRVU19SRVFVRVNUX05PVF9BQ0NFUFRFRCAweEMwMDAwMDAwIHwgMHgwMGQwCisjZGVmaW5lIE5UX1NUQVRVU19SRURJUkVDVE9SX1BBVVNFRCAweEMwMDAwMDAwIHwgMHgwMGQxCisjZGVmaW5lIE5UX1NUQVRVU19ORVRfV1JJVEVfRkFVTFQgMHhDMDAwMDAwMCB8IDB4MDBkMgorI2RlZmluZSBOVF9TVEFUVVNfUFJPRklMSU5HX0FUX0xJTUlUIDB4QzAwMDAwMDAgfCAweDAwZDMKKyNkZWZpbmUgTlRfU1RBVFVTX05PVF9TQU1FX0RFVklDRSAweEMwMDAwMDAwIHwgMHgwMGQ0CisjZGVmaW5lIE5UX1NUQVRVU19GSUxFX1JFTkFNRUQgMHhDMDAwMDAwMCB8IDB4MDBkNQorI2RlZmluZSBOVF9TVEFUVVNfVklSVFVBTF9DSVJDVUlUX0NMT1NFRCAweEMwMDAwMDAwIHwgMHgwMGQ2CisjZGVmaW5lIE5UX1NUQVRVU19OT19TRUNVUklUWV9PTl9PQkpFQ1QgMHhDMDAwMDAwMCB8IDB4MDBkNworI2RlZmluZSBOVF9TVEFUVVNfQ0FOVF9XQUlUIDB4QzAwMDAwMDAgfCAweDAwZDgKKyNkZWZpbmUgTlRfU1RBVFVTX1BJUEVfRU1QVFkgMHhDMDAwMDAwMCB8IDB4MDBkOQorI2RlZmluZSBOVF9TVEFUVVNfQ0FOVF9BQ0NFU1NfRE9NQUlOX0lORk8gMHhDMDAwMDAwMCB8IDB4MDBkYQorI2RlZmluZSBOVF9TVEFUVVNfQ0FOVF9URVJNSU5BVEVfU0VMRiAweEMwMDAwMDAwIHwgMHgwMGRiCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX1NFUlZFUl9TVEFURSAweEMwMDAwMDAwIHwgMHgwMGRjCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX0RPTUFJTl9TVEFURSAweEMwMDAwMDAwIHwgMHgwMGRkCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX0RPTUFJTl9ST0xFIDB4QzAwMDAwMDAgfCAweDAwZGUKKyNkZWZpbmUgTlRfU1RBVFVTX05PX1NVQ0hfRE9NQUlOIDB4QzAwMDAwMDAgfCAweDAwZGYKKyNkZWZpbmUgTlRfU1RBVFVTX0RPTUFJTl9FWElTVFMgMHhDMDAwMDAwMCB8IDB4MDBlMAorI2RlZmluZSBOVF9TVEFUVVNfRE9NQUlOX0xJTUlUX0VYQ0VFREVEIDB4QzAwMDAwMDAgfCAweDAwZTEKKyNkZWZpbmUgTlRfU1RBVFVTX09QTE9DS19OT1RfR1JBTlRFRCAweEMwMDAwMDAwIHwgMHgwMGUyCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX09QTE9DS19QUk9UT0NPTCAweEMwMDAwMDAwIHwgMHgwMGUzCisjZGVmaW5lIE5UX1NUQVRVU19JTlRFUk5BTF9EQl9DT1JSVVBUSU9OIDB4QzAwMDAwMDAgfCAweDAwZTQKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVEVSTkFMX0VSUk9SIDB4QzAwMDAwMDAgfCAweDAwZTUKKyNkZWZpbmUgTlRfU1RBVFVTX0dFTkVSSUNfTk9UX01BUFBFRCAweEMwMDAwMDAwIHwgMHgwMGU2CisjZGVmaW5lIE5UX1NUQVRVU19CQURfREVTQ1JJUFRPUl9GT1JNQVQgMHhDMDAwMDAwMCB8IDB4MDBlNworI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9VU0VSX0JVRkZFUiAweEMwMDAwMDAwIHwgMHgwMGU4CisjZGVmaW5lIE5UX1NUQVRVU19VTkVYUEVDVEVEX0lPX0VSUk9SIDB4QzAwMDAwMDAgfCAweDAwZTkKKyNkZWZpbmUgTlRfU1RBVFVTX1VORVhQRUNURURfTU1fQ1JFQVRFX0VSUiAweEMwMDAwMDAwIHwgMHgwMGVhCisjZGVmaW5lIE5UX1NUQVRVU19VTkVYUEVDVEVEX01NX01BUF9FUlJPUiAweEMwMDAwMDAwIHwgMHgwMGViCisjZGVmaW5lIE5UX1NUQVRVU19VTkVYUEVDVEVEX01NX0VYVEVORF9FUlIgMHhDMDAwMDAwMCB8IDB4MDBlYworI2RlZmluZSBOVF9TVEFUVVNfTk9UX0xPR09OX1BST0NFU1MgMHhDMDAwMDAwMCB8IDB4MDBlZAorI2RlZmluZSBOVF9TVEFUVVNfTE9HT05fU0VTU0lPTl9FWElTVFMgMHhDMDAwMDAwMCB8IDB4MDBlZQorI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfMSAweEMwMDAwMDAwIHwgMHgwMGVmCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUl8yIDB4QzAwMDAwMDAgfCAweDAwZjAKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzMgMHhDMDAwMDAwMCB8IDB4MDBmMQorI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfNCAweEMwMDAwMDAwIHwgMHgwMGYyCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUl81IDB4QzAwMDAwMDAgfCAweDAwZjMKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzYgMHhDMDAwMDAwMCB8IDB4MDBmNAorI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfNyAweEMwMDAwMDAwIHwgMHgwMGY1CisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX1BBUkFNRVRFUl84IDB4QzAwMDAwMDAgfCAweDAwZjYKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSXzkgMHhDMDAwMDAwMCB8IDB4MDBmNworI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfMTAgMHhDMDAwMDAwMCB8IDB4MDBmOAorI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfMTEgMHhDMDAwMDAwMCB8IDB4MDBmOQorI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVJfMTIgMHhDMDAwMDAwMCB8IDB4MDBmYQorI2RlZmluZSBOVF9TVEFUVVNfUkVESVJFQ1RPUl9OT1RfU1RBUlRFRCAweEMwMDAwMDAwIHwgMHgwMGZiCisjZGVmaW5lIE5UX1NUQVRVU19SRURJUkVDVE9SX1NUQVJURUQgMHhDMDAwMDAwMCB8IDB4MDBmYworI2RlZmluZSBOVF9TVEFUVVNfU1RBQ0tfT1ZFUkZMT1cgMHhDMDAwMDAwMCB8IDB4MDBmZAorI2RlZmluZSBOVF9TVEFUVVNfTk9fU1VDSF9QQUNLQUdFIDB4QzAwMDAwMDAgfCAweDAwZmUKKyNkZWZpbmUgTlRfU1RBVFVTX0JBRF9GVU5DVElPTl9UQUJMRSAweEMwMDAwMDAwIHwgMHgwMGZmCisjZGVmaW5lIE5UX1NUQVRVU19ESVJFQ1RPUllfTk9UX0VNUFRZIDB4QzAwMDAwMDAgfCAweDAxMDEKKyNkZWZpbmUgTlRfU1RBVFVTX0ZJTEVfQ09SUlVQVF9FUlJPUiAweEMwMDAwMDAwIHwgMHgwMTAyCisjZGVmaW5lIE5UX1NUQVRVU19OT1RfQV9ESVJFQ1RPUlkgMHhDMDAwMDAwMCB8IDB4MDEwMworI2RlZmluZSBOVF9TVEFUVVNfQkFEX0xPR09OX1NFU1NJT05fU1RBVEUgMHhDMDAwMDAwMCB8IDB4MDEwNAorI2RlZmluZSBOVF9TVEFUVVNfTE9HT05fU0VTU0lPTl9DT0xMSVNJT04gMHhDMDAwMDAwMCB8IDB4MDEwNQorI2RlZmluZSBOVF9TVEFUVVNfTkFNRV9UT09fTE9ORyAweEMwMDAwMDAwIHwgMHgwMTA2CisjZGVmaW5lIE5UX1NUQVRVU19GSUxFU19PUEVOIDB4QzAwMDAwMDAgfCAweDAxMDcKKyNkZWZpbmUgTlRfU1RBVFVTX0NPTk5FQ1RJT05fSU5fVVNFIDB4QzAwMDAwMDAgfCAweDAxMDgKKyNkZWZpbmUgTlRfU1RBVFVTX01FU1NBR0VfTk9UX0ZPVU5EIDB4QzAwMDAwMDAgfCAweDAxMDkKKyNkZWZpbmUgTlRfU1RBVFVTX1BST0NFU1NfSVNfVEVSTUlOQVRJTkcgMHhDMDAwMDAwMCB8IDB4MDEwYQorI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9MT0dPTl9UWVBFIDB4QzAwMDAwMDAgfCAweDAxMGIKKyNkZWZpbmUgTlRfU1RBVFVTX05PX0dVSURfVFJBTlNMQVRJT04gMHhDMDAwMDAwMCB8IDB4MDEwYworI2RlZmluZSBOVF9TVEFUVVNfQ0FOTk9UX0lNUEVSU09OQVRFIDB4QzAwMDAwMDAgfCAweDAxMGQKKyNkZWZpbmUgTlRfU1RBVFVTX0lNQUdFX0FMUkVBRFlfTE9BREVEIDB4QzAwMDAwMDAgfCAweDAxMGUKKyNkZWZpbmUgTlRfU1RBVFVTX0FCSU9TX05PVF9QUkVTRU5UIDB4QzAwMDAwMDAgfCAweDAxMGYKKyNkZWZpbmUgTlRfU1RBVFVTX0FCSU9TX0xJRF9OT1RfRVhJU1QgMHhDMDAwMDAwMCB8IDB4MDExMAorI2RlZmluZSBOVF9TVEFUVVNfQUJJT1NfTElEX0FMUkVBRFlfT1dORUQgMHhDMDAwMDAwMCB8IDB4MDExMQorI2RlZmluZSBOVF9TVEFUVVNfQUJJT1NfTk9UX0xJRF9PV05FUiAweEMwMDAwMDAwIHwgMHgwMTEyCisjZGVmaW5lIE5UX1NUQVRVU19BQklPU19JTlZBTElEX0NPTU1BTkQgMHhDMDAwMDAwMCB8IDB4MDExMworI2RlZmluZSBOVF9TVEFUVVNfQUJJT1NfSU5WQUxJRF9MSUQgMHhDMDAwMDAwMCB8IDB4MDExNAorI2RlZmluZSBOVF9TVEFUVVNfQUJJT1NfU0VMRUNUT1JfTk9UX0FWQUlMQUJMRSAweEMwMDAwMDAwIHwgMHgwMTE1CisjZGVmaW5lIE5UX1NUQVRVU19BQklPU19JTlZBTElEX1NFTEVDVE9SIDB4QzAwMDAwMDAgfCAweDAxMTYKKyNkZWZpbmUgTlRfU1RBVFVTX05PX0xEVCAweEMwMDAwMDAwIHwgMHgwMTE3CisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX0xEVF9TSVpFIDB4QzAwMDAwMDAgfCAweDAxMTgKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfTERUX09GRlNFVCAweEMwMDAwMDAwIHwgMHgwMTE5CisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX0xEVF9ERVNDUklQVE9SIDB4QzAwMDAwMDAgfCAweDAxMWEKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfSU1BR0VfTkVfRk9STUFUIDB4QzAwMDAwMDAgfCAweDAxMWIKKyNkZWZpbmUgTlRfU1RBVFVTX1JYQUNUX0lOVkFMSURfU1RBVEUgMHhDMDAwMDAwMCB8IDB4MDExYworI2RlZmluZSBOVF9TVEFUVVNfUlhBQ1RfQ09NTUlUX0ZBSUxVUkUgMHhDMDAwMDAwMCB8IDB4MDExZAorI2RlZmluZSBOVF9TVEFUVVNfTUFQUEVEX0ZJTEVfU0laRV9aRVJPIDB4QzAwMDAwMDAgfCAweDAxMWUKKyNkZWZpbmUgTlRfU1RBVFVTX1RPT19NQU5ZX09QRU5FRF9GSUxFUyAweEMwMDAwMDAwIHwgMHgwMTFmCisjZGVmaW5lIE5UX1NUQVRVU19DQU5DRUxMRUQgMHhDMDAwMDAwMCB8IDB4MDEyMAorI2RlZmluZSBOVF9TVEFUVVNfQ0FOTk9UX0RFTEVURSAweEMwMDAwMDAwIHwgMHgwMTIxCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX0NPTVBVVEVSX05BTUUgMHhDMDAwMDAwMCB8IDB4MDEyMgorI2RlZmluZSBOVF9TVEFUVVNfRklMRV9ERUxFVEVEIDB4QzAwMDAwMDAgfCAweDAxMjMKKyNkZWZpbmUgTlRfU1RBVFVTX1NQRUNJQUxfQUNDT1VOVCAweEMwMDAwMDAwIHwgMHgwMTI0CisjZGVmaW5lIE5UX1NUQVRVU19TUEVDSUFMX0dST1VQIDB4QzAwMDAwMDAgfCAweDAxMjUKKyNkZWZpbmUgTlRfU1RBVFVTX1NQRUNJQUxfVVNFUiAweEMwMDAwMDAwIHwgMHgwMTI2CisjZGVmaW5lIE5UX1NUQVRVU19NRU1CRVJTX1BSSU1BUllfR1JPVVAgMHhDMDAwMDAwMCB8IDB4MDEyNworI2RlZmluZSBOVF9TVEFUVVNfRklMRV9DTE9TRUQgMHhDMDAwMDAwMCB8IDB4MDEyOAorI2RlZmluZSBOVF9TVEFUVVNfVE9PX01BTllfVEhSRUFEUyAweEMwMDAwMDAwIHwgMHgwMTI5CisjZGVmaW5lIE5UX1NUQVRVU19USFJFQURfTk9UX0lOX1BST0NFU1MgMHhDMDAwMDAwMCB8IDB4MDEyYQorI2RlZmluZSBOVF9TVEFUVVNfVE9LRU5fQUxSRUFEWV9JTl9VU0UgMHhDMDAwMDAwMCB8IDB4MDEyYgorI2RlZmluZSBOVF9TVEFUVVNfUEFHRUZJTEVfUVVPVEFfRVhDRUVERUQgMHhDMDAwMDAwMCB8IDB4MDEyYworI2RlZmluZSBOVF9TVEFUVVNfQ09NTUlUTUVOVF9MSU1JVCAweEMwMDAwMDAwIHwgMHgwMTJkCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX0lNQUdFX0xFX0ZPUk1BVCAweEMwMDAwMDAwIHwgMHgwMTJlCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX0lNQUdFX05PVF9NWiAweEMwMDAwMDAwIHwgMHgwMTJmCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX0lNQUdFX1BST1RFQ1QgMHhDMDAwMDAwMCB8IDB4MDEzMAorI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9JTUFHRV9XSU5fMTYgMHhDMDAwMDAwMCB8IDB4MDEzMQorI2RlZmluZSBOVF9TVEFUVVNfTE9HT05fU0VSVkVSX0NPTkZMSUNUIDB4QzAwMDAwMDAgfCAweDAxMzIKKyNkZWZpbmUgTlRfU1RBVFVTX1RJTUVfRElGRkVSRU5DRV9BVF9EQyAweEMwMDAwMDAwIHwgMHgwMTMzCisjZGVmaW5lIE5UX1NUQVRVU19TWU5DSFJPTklaQVRJT05fUkVRVUlSRUQgMHhDMDAwMDAwMCB8IDB4MDEzNAorI2RlZmluZSBOVF9TVEFUVVNfRExMX05PVF9GT1VORCAweEMwMDAwMDAwIHwgMHgwMTM1CisjZGVmaW5lIE5UX1NUQVRVU19PUEVOX0ZBSUxFRCAweEMwMDAwMDAwIHwgMHgwMTM2CisjZGVmaW5lIE5UX1NUQVRVU19JT19QUklWSUxFR0VfRkFJTEVEIDB4QzAwMDAwMDAgfCAweDAxMzcKKyNkZWZpbmUgTlRfU1RBVFVTX09SRElOQUxfTk9UX0ZPVU5EIDB4QzAwMDAwMDAgfCAweDAxMzgKKyNkZWZpbmUgTlRfU1RBVFVTX0VOVFJZUE9JTlRfTk9UX0ZPVU5EIDB4QzAwMDAwMDAgfCAweDAxMzkKKyNkZWZpbmUgTlRfU1RBVFVTX0NPTlRST0xfQ19FWElUIDB4QzAwMDAwMDAgfCAweDAxM2EKKyNkZWZpbmUgTlRfU1RBVFVTX0xPQ0FMX0RJU0NPTk5FQ1QgMHhDMDAwMDAwMCB8IDB4MDEzYgorI2RlZmluZSBOVF9TVEFUVVNfUkVNT1RFX0RJU0NPTk5FQ1QgMHhDMDAwMDAwMCB8IDB4MDEzYworI2RlZmluZSBOVF9TVEFUVVNfUkVNT1RFX1JFU09VUkNFUyAweEMwMDAwMDAwIHwgMHgwMTNkCisjZGVmaW5lIE5UX1NUQVRVU19MSU5LX0ZBSUxFRCAweEMwMDAwMDAwIHwgMHgwMTNlCisjZGVmaW5lIE5UX1NUQVRVU19MSU5LX1RJTUVPVVQgMHhDMDAwMDAwMCB8IDB4MDEzZgorI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9DT05ORUNUSU9OIDB4QzAwMDAwMDAgfCAweDAxNDAKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfQUREUkVTUyAweEMwMDAwMDAwIHwgMHgwMTQxCisjZGVmaW5lIE5UX1NUQVRVU19ETExfSU5JVF9GQUlMRUQgMHhDMDAwMDAwMCB8IDB4MDE0MgorI2RlZmluZSBOVF9TVEFUVVNfTUlTU0lOR19TWVNURU1GSUxFIDB4QzAwMDAwMDAgfCAweDAxNDMKKyNkZWZpbmUgTlRfU1RBVFVTX1VOSEFORExFRF9FWENFUFRJT04gMHhDMDAwMDAwMCB8IDB4MDE0NAorI2RlZmluZSBOVF9TVEFUVVNfQVBQX0lOSVRfRkFJTFVSRSAweEMwMDAwMDAwIHwgMHgwMTQ1CisjZGVmaW5lIE5UX1NUQVRVU19QQUdFRklMRV9DUkVBVEVfRkFJTEVEIDB4QzAwMDAwMDAgfCAweDAxNDYKKyNkZWZpbmUgTlRfU1RBVFVTX05PX1BBR0VGSUxFIDB4QzAwMDAwMDAgfCAweDAxNDcKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfTEVWRUwgMHhDMDAwMDAwMCB8IDB4MDE0OAorI2RlZmluZSBOVF9TVEFUVVNfV1JPTkdfUEFTU1dPUkRfQ09SRSAweEMwMDAwMDAwIHwgMHgwMTQ5CisjZGVmaW5lIE5UX1NUQVRVU19JTExFR0FMX0ZMT0FUX0NPTlRFWFQgMHhDMDAwMDAwMCB8IDB4MDE0YQorI2RlZmluZSBOVF9TVEFUVVNfUElQRV9CUk9LRU4gMHhDMDAwMDAwMCB8IDB4MDE0YgorI2RlZmluZSBOVF9TVEFUVVNfUkVHSVNUUllfQ09SUlVQVCAweEMwMDAwMDAwIHwgMHgwMTRjCisjZGVmaW5lIE5UX1NUQVRVU19SRUdJU1RSWV9JT19GQUlMRUQgMHhDMDAwMDAwMCB8IDB4MDE0ZAorI2RlZmluZSBOVF9TVEFUVVNfTk9fRVZFTlRfUEFJUiAweEMwMDAwMDAwIHwgMHgwMTRlCisjZGVmaW5lIE5UX1NUQVRVU19VTlJFQ09HTklaRURfVk9MVU1FIDB4QzAwMDAwMDAgfCAweDAxNGYKKyNkZWZpbmUgTlRfU1RBVFVTX1NFUklBTF9OT19ERVZJQ0VfSU5JVEVEIDB4QzAwMDAwMDAgfCAweDAxNTAKKyNkZWZpbmUgTlRfU1RBVFVTX05PX1NVQ0hfQUxJQVMgMHhDMDAwMDAwMCB8IDB4MDE1MQorI2RlZmluZSBOVF9TVEFUVVNfTUVNQkVSX05PVF9JTl9BTElBUyAweEMwMDAwMDAwIHwgMHgwMTUyCisjZGVmaW5lIE5UX1NUQVRVU19NRU1CRVJfSU5fQUxJQVMgMHhDMDAwMDAwMCB8IDB4MDE1MworI2RlZmluZSBOVF9TVEFUVVNfQUxJQVNfRVhJU1RTIDB4QzAwMDAwMDAgfCAweDAxNTQKKyNkZWZpbmUgTlRfU1RBVFVTX0xPR09OX05PVF9HUkFOVEVEIDB4QzAwMDAwMDAgfCAweDAxNTUKKyNkZWZpbmUgTlRfU1RBVFVTX1RPT19NQU5ZX1NFQ1JFVFMgMHhDMDAwMDAwMCB8IDB4MDE1NgorI2RlZmluZSBOVF9TVEFUVVNfU0VDUkVUX1RPT19MT05HIDB4QzAwMDAwMDAgfCAweDAxNTcKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVEVSTkFMX0RCX0VSUk9SIDB4QzAwMDAwMDAgfCAweDAxNTgKKyNkZWZpbmUgTlRfU1RBVFVTX0ZVTExTQ1JFRU5fTU9ERSAweEMwMDAwMDAwIHwgMHgwMTU5CisjZGVmaW5lIE5UX1NUQVRVU19UT09fTUFOWV9DT05URVhUX0lEUyAweEMwMDAwMDAwIHwgMHgwMTVhCisjZGVmaW5lIE5UX1NUQVRVU19MT0dPTl9UWVBFX05PVF9HUkFOVEVEIDB4QzAwMDAwMDAgfCAweDAxNWIKKyNkZWZpbmUgTlRfU1RBVFVTX05PVF9SRUdJU1RSWV9GSUxFIDB4QzAwMDAwMDAgfCAweDAxNWMKKyNkZWZpbmUgTlRfU1RBVFVTX05UX0NST1NTX0VOQ1JZUFRJT05fUkVRVUlSRUQgMHhDMDAwMDAwMCB8IDB4MDE1ZAorI2RlZmluZSBOVF9TVEFUVVNfRE9NQUlOX0NUUkxSX0NPTkZJR19FUlJPUiAweEMwMDAwMDAwIHwgMHgwMTVlCisjZGVmaW5lIE5UX1NUQVRVU19GVF9NSVNTSU5HX01FTUJFUiAweEMwMDAwMDAwIHwgMHgwMTVmCisjZGVmaW5lIE5UX1NUQVRVU19JTExfRk9STUVEX1NFUlZJQ0VfRU5UUlkgMHhDMDAwMDAwMCB8IDB4MDE2MAorI2RlZmluZSBOVF9TVEFUVVNfSUxMRUdBTF9DSEFSQUNURVIgMHhDMDAwMDAwMCB8IDB4MDE2MQorI2RlZmluZSBOVF9TVEFUVVNfVU5NQVBQQUJMRV9DSEFSQUNURVIgMHhDMDAwMDAwMCB8IDB4MDE2MgorI2RlZmluZSBOVF9TVEFUVVNfVU5ERUZJTkVEX0NIQVJBQ1RFUiAweEMwMDAwMDAwIHwgMHgwMTYzCisjZGVmaW5lIE5UX1NUQVRVU19GTE9QUFlfVk9MVU1FIDB4QzAwMDAwMDAgfCAweDAxNjQKKyNkZWZpbmUgTlRfU1RBVFVTX0ZMT1BQWV9JRF9NQVJLX05PVF9GT1VORCAweEMwMDAwMDAwIHwgMHgwMTY1CisjZGVmaW5lIE5UX1NUQVRVU19GTE9QUFlfV1JPTkdfQ1lMSU5ERVIgMHhDMDAwMDAwMCB8IDB4MDE2NgorI2RlZmluZSBOVF9TVEFUVVNfRkxPUFBZX1VOS05PV05fRVJST1IgMHhDMDAwMDAwMCB8IDB4MDE2NworI2RlZmluZSBOVF9TVEFUVVNfRkxPUFBZX0JBRF9SRUdJU1RFUlMgMHhDMDAwMDAwMCB8IDB4MDE2OAorI2RlZmluZSBOVF9TVEFUVVNfRElTS19SRUNBTElCUkFURV9GQUlMRUQgMHhDMDAwMDAwMCB8IDB4MDE2OQorI2RlZmluZSBOVF9TVEFUVVNfRElTS19PUEVSQVRJT05fRkFJTEVEIDB4QzAwMDAwMDAgfCAweDAxNmEKKyNkZWZpbmUgTlRfU1RBVFVTX0RJU0tfUkVTRVRfRkFJTEVEIDB4QzAwMDAwMDAgfCAweDAxNmIKKyNkZWZpbmUgTlRfU1RBVFVTX1NIQVJFRF9JUlFfQlVTWSAweEMwMDAwMDAwIHwgMHgwMTZjCisjZGVmaW5lIE5UX1NUQVRVU19GVF9PUlBIQU5JTkcgMHhDMDAwMDAwMCB8IDB4MDE2ZAorI2RlZmluZSBOVF9TVEFUVVNfUEFSVElUSU9OX0ZBSUxVUkUgMHhDMDAwMDAwMCB8IDB4MDE3MgorI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9CTE9DS19MRU5HVEggMHhDMDAwMDAwMCB8IDB4MDE3MworI2RlZmluZSBOVF9TVEFUVVNfREVWSUNFX05PVF9QQVJUSVRJT05FRCAweEMwMDAwMDAwIHwgMHgwMTc0CisjZGVmaW5lIE5UX1NUQVRVU19VTkFCTEVfVE9fTE9DS19NRURJQSAweEMwMDAwMDAwIHwgMHgwMTc1CisjZGVmaW5lIE5UX1NUQVRVU19VTkFCTEVfVE9fVU5MT0FEX01FRElBIDB4QzAwMDAwMDAgfCAweDAxNzYKKyNkZWZpbmUgTlRfU1RBVFVTX0VPTV9PVkVSRkxPVyAweEMwMDAwMDAwIHwgMHgwMTc3CisjZGVmaW5lIE5UX1NUQVRVU19OT19NRURJQSAweEMwMDAwMDAwIHwgMHgwMTc4CisjZGVmaW5lIE5UX1NUQVRVU19OT19TVUNIX01FTUJFUiAweEMwMDAwMDAwIHwgMHgwMTdhCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX01FTUJFUiAweEMwMDAwMDAwIHwgMHgwMTdiCisjZGVmaW5lIE5UX1NUQVRVU19LRVlfREVMRVRFRCAweEMwMDAwMDAwIHwgMHgwMTdjCisjZGVmaW5lIE5UX1NUQVRVU19OT19MT0dfU1BBQ0UgMHhDMDAwMDAwMCB8IDB4MDE3ZAorI2RlZmluZSBOVF9TVEFUVVNfVE9PX01BTllfU0lEUyAweEMwMDAwMDAwIHwgMHgwMTdlCisjZGVmaW5lIE5UX1NUQVRVU19MTV9DUk9TU19FTkNSWVBUSU9OX1JFUVVJUkVEIDB4QzAwMDAwMDAgfCAweDAxN2YKKyNkZWZpbmUgTlRfU1RBVFVTX0tFWV9IQVNfQ0hJTERSRU4gMHhDMDAwMDAwMCB8IDB4MDE4MAorI2RlZmluZSBOVF9TVEFUVVNfQ0hJTERfTVVTVF9CRV9WT0xBVElMRSAweEMwMDAwMDAwIHwgMHgwMTgxCisjZGVmaW5lIE5UX1NUQVRVU19ERVZJQ0VfQ09ORklHVVJBVElPTl9FUlJPUiAweEMwMDAwMDAwIHwgMHgwMTgyCisjZGVmaW5lIE5UX1NUQVRVU19EUklWRVJfSU5URVJOQUxfRVJST1IgMHhDMDAwMDAwMCB8IDB4MDE4MworI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9ERVZJQ0VfU1RBVEUgMHhDMDAwMDAwMCB8IDB4MDE4NAorI2RlZmluZSBOVF9TVEFUVVNfSU9fREVWSUNFX0VSUk9SIDB4QzAwMDAwMDAgfCAweDAxODUKKyNkZWZpbmUgTlRfU1RBVFVTX0RFVklDRV9QUk9UT0NPTF9FUlJPUiAweEMwMDAwMDAwIHwgMHgwMTg2CisjZGVmaW5lIE5UX1NUQVRVU19CQUNLVVBfQ09OVFJPTExFUiAweEMwMDAwMDAwIHwgMHgwMTg3CisjZGVmaW5lIE5UX1NUQVRVU19MT0dfRklMRV9GVUxMIDB4QzAwMDAwMDAgfCAweDAxODgKKyNkZWZpbmUgTlRfU1RBVFVTX1RPT19MQVRFIDB4QzAwMDAwMDAgfCAweDAxODkKKyNkZWZpbmUgTlRfU1RBVFVTX05PX1RSVVNUX0xTQV9TRUNSRVQgMHhDMDAwMDAwMCB8IDB4MDE4YQorI2RlZmluZSBOVF9TVEFUVVNfTk9fVFJVU1RfU0FNX0FDQ09VTlQgMHhDMDAwMDAwMCB8IDB4MDE4YgorI2RlZmluZSBOVF9TVEFUVVNfVFJVU1RFRF9ET01BSU5fRkFJTFVSRSAweEMwMDAwMDAwIHwgMHgwMThjCisjZGVmaW5lIE5UX1NUQVRVU19UUlVTVEVEX1JFTEFUSU9OU0hJUF9GQUlMVVJFIDB4QzAwMDAwMDAgfCAweDAxOGQKKyNkZWZpbmUgTlRfU1RBVFVTX0VWRU5UTE9HX0ZJTEVfQ09SUlVQVCAweEMwMDAwMDAwIHwgMHgwMThlCisjZGVmaW5lIE5UX1NUQVRVU19FVkVOVExPR19DQU5UX1NUQVJUIDB4QzAwMDAwMDAgfCAweDAxOGYKKyNkZWZpbmUgTlRfU1RBVFVTX1RSVVNUX0ZBSUxVUkUgMHhDMDAwMDAwMCB8IDB4MDE5MAorI2RlZmluZSBOVF9TVEFUVVNfTVVUQU5UX0xJTUlUX0VYQ0VFREVEIDB4QzAwMDAwMDAgfCAweDAxOTEKKyNkZWZpbmUgTlRfU1RBVFVTX05FVExPR09OX05PVF9TVEFSVEVEIDB4QzAwMDAwMDAgfCAweDAxOTIKKyNkZWZpbmUgTlRfU1RBVFVTX0FDQ09VTlRfRVhQSVJFRCAweEMwMDAwMDAwIHwgMHgwMTkzCisjZGVmaW5lIE5UX1NUQVRVU19QT1NTSUJMRV9ERUFETE9DSyAweEMwMDAwMDAwIHwgMHgwMTk0CisjZGVmaW5lIE5UX1NUQVRVU19ORVRXT1JLX0NSRURFTlRJQUxfQ09ORkxJQ1QgMHhDMDAwMDAwMCB8IDB4MDE5NQorI2RlZmluZSBOVF9TVEFUVVNfUkVNT1RFX1NFU1NJT05fTElNSVQgMHhDMDAwMDAwMCB8IDB4MDE5NgorI2RlZmluZSBOVF9TVEFUVVNfRVZFTlRMT0dfRklMRV9DSEFOR0VEIDB4QzAwMDAwMDAgfCAweDAxOTcKKyNkZWZpbmUgTlRfU1RBVFVTX05PTE9HT05fSU5URVJET01BSU5fVFJVU1RfQUNDT1VOVCAweEMwMDAwMDAwIHwgMHgwMTk4CisjZGVmaW5lIE5UX1NUQVRVU19OT0xPR09OX1dPUktTVEFUSU9OX1RSVVNUX0FDQ09VTlQgMHhDMDAwMDAwMCB8IDB4MDE5OQorI2RlZmluZSBOVF9TVEFUVVNfTk9MT0dPTl9TRVJWRVJfVFJVU1RfQUNDT1VOVCAweEMwMDAwMDAwIHwgMHgwMTlhCisjZGVmaW5lIE5UX1NUQVRVU19ET01BSU5fVFJVU1RfSU5DT05TSVNURU5UIDB4QzAwMDAwMDAgfCAweDAxOWIKKyNkZWZpbmUgTlRfU1RBVFVTX0ZTX0RSSVZFUl9SRVFVSVJFRCAweEMwMDAwMDAwIHwgMHgwMTljCisjZGVmaW5lIE5UX1NUQVRVU19OT19VU0VSX1NFU1NJT05fS0VZIDB4QzAwMDAwMDAgfCAweDAyMDIKKyNkZWZpbmUgTlRfU1RBVFVTX1VTRVJfU0VTU0lPTl9ERUxFVEVEIDB4QzAwMDAwMDAgfCAweDAyMDMKKyNkZWZpbmUgTlRfU1RBVFVTX1JFU09VUkNFX0xBTkdfTk9UX0ZPVU5EIDB4QzAwMDAwMDAgfCAweDAyMDQKKyNkZWZpbmUgTlRfU1RBVFVTX0lOU1VGRl9TRVJWRVJfUkVTT1VSQ0VTIDB4QzAwMDAwMDAgfCAweDAyMDUKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfQlVGRkVSX1NJWkUgMHhDMDAwMDAwMCB8IDB4MDIwNgorI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9BRERSRVNTX0NPTVBPTkVOVCAweEMwMDAwMDAwIHwgMHgwMjA3CisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX0FERFJFU1NfV0lMRENBUkQgMHhDMDAwMDAwMCB8IDB4MDIwOAorI2RlZmluZSBOVF9TVEFUVVNfVE9PX01BTllfQUREUkVTU0VTIDB4QzAwMDAwMDAgfCAweDAyMDkKKyNkZWZpbmUgTlRfU1RBVFVTX0FERFJFU1NfQUxSRUFEWV9FWElTVFMgMHhDMDAwMDAwMCB8IDB4MDIwYQorI2RlZmluZSBOVF9TVEFUVVNfQUREUkVTU19DTE9TRUQgMHhDMDAwMDAwMCB8IDB4MDIwYgorI2RlZmluZSBOVF9TVEFUVVNfQ09OTkVDVElPTl9ESVNDT05ORUNURUQgMHhDMDAwMDAwMCB8IDB4MDIwYworI2RlZmluZSBOVF9TVEFUVVNfQ09OTkVDVElPTl9SRVNFVCAweEMwMDAwMDAwIHwgMHgwMjBkCisjZGVmaW5lIE5UX1NUQVRVU19UT09fTUFOWV9OT0RFUyAweEMwMDAwMDAwIHwgMHgwMjBlCisjZGVmaW5lIE5UX1NUQVRVU19UUkFOU0FDVElPTl9BQk9SVEVEIDB4QzAwMDAwMDAgfCAweDAyMGYKKyNkZWZpbmUgTlRfU1RBVFVTX1RSQU5TQUNUSU9OX1RJTUVEX09VVCAweEMwMDAwMDAwIHwgMHgwMjEwCisjZGVmaW5lIE5UX1NUQVRVU19UUkFOU0FDVElPTl9OT19SRUxFQVNFIDB4QzAwMDAwMDAgfCAweDAyMTEKKyNkZWZpbmUgTlRfU1RBVFVTX1RSQU5TQUNUSU9OX05PX01BVENIIDB4QzAwMDAwMDAgfCAweDAyMTIKKyNkZWZpbmUgTlRfU1RBVFVTX1RSQU5TQUNUSU9OX1JFU1BPTkRFRCAweEMwMDAwMDAwIHwgMHgwMjEzCisjZGVmaW5lIE5UX1NUQVRVU19UUkFOU0FDVElPTl9JTlZBTElEX0lEIDB4QzAwMDAwMDAgfCAweDAyMTQKKyNkZWZpbmUgTlRfU1RBVFVTX1RSQU5TQUNUSU9OX0lOVkFMSURfVFlQRSAweEMwMDAwMDAwIHwgMHgwMjE1CisjZGVmaW5lIE5UX1NUQVRVU19OT1RfU0VSVkVSX1NFU1NJT04gMHhDMDAwMDAwMCB8IDB4MDIxNgorI2RlZmluZSBOVF9TVEFUVVNfTk9UX0NMSUVOVF9TRVNTSU9OIDB4QzAwMDAwMDAgfCAweDAyMTcKKyNkZWZpbmUgTlRfU1RBVFVTX0NBTk5PVF9MT0FEX1JFR0lTVFJZX0ZJTEUgMHhDMDAwMDAwMCB8IDB4MDIxOAorI2RlZmluZSBOVF9TVEFUVVNfREVCVUdfQVRUQUNIX0ZBSUxFRCAweEMwMDAwMDAwIHwgMHgwMjE5CisjZGVmaW5lIE5UX1NUQVRVU19TWVNURU1fUFJPQ0VTU19URVJNSU5BVEVEIDB4QzAwMDAwMDAgfCAweDAyMWEKKyNkZWZpbmUgTlRfU1RBVFVTX0RBVEFfTk9UX0FDQ0VQVEVEIDB4QzAwMDAwMDAgfCAweDAyMWIKKyNkZWZpbmUgTlRfU1RBVFVTX05PX0JST1dTRVJfU0VSVkVSU19GT1VORCAweEMwMDAwMDAwIHwgMHgwMjFjCisjZGVmaW5lIE5UX1NUQVRVU19WRE1fSEFSRF9FUlJPUiAweEMwMDAwMDAwIHwgMHgwMjFkCisjZGVmaW5lIE5UX1NUQVRVU19EUklWRVJfQ0FOQ0VMX1RJTUVPVVQgMHhDMDAwMDAwMCB8IDB4MDIxZQorI2RlZmluZSBOVF9TVEFUVVNfUkVQTFlfTUVTU0FHRV9NSVNNQVRDSCAweEMwMDAwMDAwIHwgMHgwMjFmCisjZGVmaW5lIE5UX1NUQVRVU19NQVBQRURfQUxJR05NRU5UIDB4QzAwMDAwMDAgfCAweDAyMjAKKyNkZWZpbmUgTlRfU1RBVFVTX0lNQUdFX0NIRUNLU1VNX01JU01BVENIIDB4QzAwMDAwMDAgfCAweDAyMjEKKyNkZWZpbmUgTlRfU1RBVFVTX0xPU1RfV1JJVEVCRUhJTkRfREFUQSAweEMwMDAwMDAwIHwgMHgwMjIyCisjZGVmaW5lIE5UX1NUQVRVU19DTElFTlRfU0VSVkVSX1BBUkFNRVRFUlNfSU5WQUxJRCAweEMwMDAwMDAwIHwgMHgwMjIzCisjZGVmaW5lIE5UX1NUQVRVU19QQVNTV09SRF9NVVNUX0NIQU5HRSAweEMwMDAwMDAwIHwgMHgwMjI0CisjZGVmaW5lIE5UX1NUQVRVU19OT1RfRk9VTkQgMHhDMDAwMDAwMCB8IDB4MDIyNQorI2RlZmluZSBOVF9TVEFUVVNfTk9UX1RJTllfU1RSRUFNIDB4QzAwMDAwMDAgfCAweDAyMjYKKyNkZWZpbmUgTlRfU1RBVFVTX1JFQ09WRVJZX0ZBSUxVUkUgMHhDMDAwMDAwMCB8IDB4MDIyNworI2RlZmluZSBOVF9TVEFUVVNfU1RBQ0tfT1ZFUkZMT1dfUkVBRCAweEMwMDAwMDAwIHwgMHgwMjI4CisjZGVmaW5lIE5UX1NUQVRVU19GQUlMX0NIRUNLIDB4QzAwMDAwMDAgfCAweDAyMjkKKyNkZWZpbmUgTlRfU1RBVFVTX0RVUExJQ0FURV9PQkpFQ1RJRCAweEMwMDAwMDAwIHwgMHgwMjJhCisjZGVmaW5lIE5UX1NUQVRVU19PQkpFQ1RJRF9FWElTVFMgMHhDMDAwMDAwMCB8IDB4MDIyYgorI2RlZmluZSBOVF9TVEFUVVNfQ09OVkVSVF9UT19MQVJHRSAweEMwMDAwMDAwIHwgMHgwMjJjCisjZGVmaW5lIE5UX1NUQVRVU19SRVRSWSAweEMwMDAwMDAwIHwgMHgwMjJkCisjZGVmaW5lIE5UX1NUQVRVU19GT1VORF9PVVRfT0ZfU0NPUEUgMHhDMDAwMDAwMCB8IDB4MDIyZQorI2RlZmluZSBOVF9TVEFUVVNfQUxMT0NBVEVfQlVDS0VUIDB4QzAwMDAwMDAgfCAweDAyMmYKKyNkZWZpbmUgTlRfU1RBVFVTX1BST1BTRVRfTk9UX0ZPVU5EIDB4QzAwMDAwMDAgfCAweDAyMzAKKyNkZWZpbmUgTlRfU1RBVFVTX01BUlNIQUxMX09WRVJGTE9XIDB4QzAwMDAwMDAgfCAweDAyMzEKKyNkZWZpbmUgTlRfU1RBVFVTX0lOVkFMSURfVkFSSUFOVCAweEMwMDAwMDAwIHwgMHgwMjMyCisjZGVmaW5lIE5UX1NUQVRVU19ET01BSU5fQ09OVFJPTExFUl9OT1RfRk9VTkQgMHhDMDAwMDAwMCB8IDB4MDIzMworI2RlZmluZSBOVF9TVEFUVVNfQUNDT1VOVF9MT0NLRURfT1VUIDB4QzAwMDAwMDAgfCAweDAyMzQKKyNkZWZpbmUgTlRfU1RBVFVTX0hBTkRMRV9OT1RfQ0xPU0FCTEUgMHhDMDAwMDAwMCB8IDB4MDIzNQorI2RlZmluZSBOVF9TVEFUVVNfQ09OTkVDVElPTl9SRUZVU0VEIDB4QzAwMDAwMDAgfCAweDAyMzYKKyNkZWZpbmUgTlRfU1RBVFVTX0dSQUNFRlVMX0RJU0NPTk5FQ1QgMHhDMDAwMDAwMCB8IDB4MDIzNworI2RlZmluZSBOVF9TVEFUVVNfQUREUkVTU19BTFJFQURZX0FTU09DSUFURUQgMHhDMDAwMDAwMCB8IDB4MDIzOAorI2RlZmluZSBOVF9TVEFUVVNfQUREUkVTU19OT1RfQVNTT0NJQVRFRCAweEMwMDAwMDAwIHwgMHgwMjM5CisjZGVmaW5lIE5UX1NUQVRVU19DT05ORUNUSU9OX0lOVkFMSUQgMHhDMDAwMDAwMCB8IDB4MDIzYQorI2RlZmluZSBOVF9TVEFUVVNfQ09OTkVDVElPTl9BQ1RJVkUgMHhDMDAwMDAwMCB8IDB4MDIzYgorI2RlZmluZSBOVF9TVEFUVVNfTkVUV09SS19VTlJFQUNIQUJMRSAweEMwMDAwMDAwIHwgMHgwMjNjCisjZGVmaW5lIE5UX1NUQVRVU19IT1NUX1VOUkVBQ0hBQkxFIDB4QzAwMDAwMDAgfCAweDAyM2QKKyNkZWZpbmUgTlRfU1RBVFVTX1BST1RPQ09MX1VOUkVBQ0hBQkxFIDB4QzAwMDAwMDAgfCAweDAyM2UKKyNkZWZpbmUgTlRfU1RBVFVTX1BPUlRfVU5SRUFDSEFCTEUgMHhDMDAwMDAwMCB8IDB4MDIzZgorI2RlZmluZSBOVF9TVEFUVVNfUkVRVUVTVF9BQk9SVEVEIDB4QzAwMDAwMDAgfCAweDAyNDAKKyNkZWZpbmUgTlRfU1RBVFVTX0NPTk5FQ1RJT05fQUJPUlRFRCAweEMwMDAwMDAwIHwgMHgwMjQxCisjZGVmaW5lIE5UX1NUQVRVU19CQURfQ09NUFJFU1NJT05fQlVGRkVSIDB4QzAwMDAwMDAgfCAweDAyNDIKKyNkZWZpbmUgTlRfU1RBVFVTX1VTRVJfTUFQUEVEX0ZJTEUgMHhDMDAwMDAwMCB8IDB4MDI0MworI2RlZmluZSBOVF9TVEFUVVNfQVVESVRfRkFJTEVEIDB4QzAwMDAwMDAgfCAweDAyNDQKKyNkZWZpbmUgTlRfU1RBVFVTX1RJTUVSX1JFU09MVVRJT05fTk9UX1NFVCAweEMwMDAwMDAwIHwgMHgwMjQ1CisjZGVmaW5lIE5UX1NUQVRVU19DT05ORUNUSU9OX0NPVU5UX0xJTUlUIDB4QzAwMDAwMDAgfCAweDAyNDYKKyNkZWZpbmUgTlRfU1RBVFVTX0xPR0lOX1RJTUVfUkVTVFJJQ1RJT04gMHhDMDAwMDAwMCB8IDB4MDI0NworI2RlZmluZSBOVF9TVEFUVVNfTE9HSU5fV0tTVEFfUkVTVFJJQ1RJT04gMHhDMDAwMDAwMCB8IDB4MDI0OAorI2RlZmluZSBOVF9TVEFUVVNfSU1BR0VfTVBfVVBfTUlTTUFUQ0ggMHhDMDAwMDAwMCB8IDB4MDI0OQorI2RlZmluZSBOVF9TVEFUVVNfSU5TVUZGSUNJRU5UX0xPR09OX0lORk8gMHhDMDAwMDAwMCB8IDB4MDI1MAorI2RlZmluZSBOVF9TVEFUVVNfQkFEX0RMTF9FTlRSWVBPSU5UIDB4QzAwMDAwMDAgfCAweDAyNTEKKyNkZWZpbmUgTlRfU1RBVFVTX0JBRF9TRVJWSUNFX0VOVFJZUE9JTlQgMHhDMDAwMDAwMCB8IDB4MDI1MgorI2RlZmluZSBOVF9TVEFUVVNfTFBDX1JFUExZX0xPU1QgMHhDMDAwMDAwMCB8IDB4MDI1MworI2RlZmluZSBOVF9TVEFUVVNfSVBfQUREUkVTU19DT05GTElDVDEgMHhDMDAwMDAwMCB8IDB4MDI1NAorI2RlZmluZSBOVF9TVEFUVVNfSVBfQUREUkVTU19DT05GTElDVDIgMHhDMDAwMDAwMCB8IDB4MDI1NQorI2RlZmluZSBOVF9TVEFUVVNfUkVHSVNUUllfUVVPVEFfTElNSVQgMHhDMDAwMDAwMCB8IDB4MDI1NgorI2RlZmluZSBOVF9TVEFUVVNfUEFUSF9OT1RfQ09WRVJFRCAweEMwMDAwMDAwIHwgMHgwMjU3CisjZGVmaW5lIE5UX1NUQVRVU19OT19DQUxMQkFDS19BQ1RJVkUgMHhDMDAwMDAwMCB8IDB4MDI1OAorI2RlZmluZSBOVF9TVEFUVVNfTElDRU5TRV9RVU9UQV9FWENFRURFRCAweEMwMDAwMDAwIHwgMHgwMjU5CisjZGVmaW5lIE5UX1NUQVRVU19QV0RfVE9PX1NIT1JUIDB4QzAwMDAwMDAgfCAweDAyNWEKKyNkZWZpbmUgTlRfU1RBVFVTX1BXRF9UT09fUkVDRU5UIDB4QzAwMDAwMDAgfCAweDAyNWIKKyNkZWZpbmUgTlRfU1RBVFVTX1BXRF9ISVNUT1JZX0NPTkZMSUNUIDB4QzAwMDAwMDAgfCAweDAyNWMKKyNkZWZpbmUgTlRfU1RBVFVTX1BMVUdQTEFZX05PX0RFVklDRSAweEMwMDAwMDAwIHwgMHgwMjVlCisjZGVmaW5lIE5UX1NUQVRVU19VTlNVUFBPUlRFRF9DT01QUkVTU0lPTiAweEMwMDAwMDAwIHwgMHgwMjVmCisjZGVmaW5lIE5UX1NUQVRVU19JTlZBTElEX0hXX1BST0ZJTEUgMHhDMDAwMDAwMCB8IDB4MDI2MAorI2RlZmluZSBOVF9TVEFUVVNfSU5WQUxJRF9QTFVHUExBWV9ERVZJQ0VfUEFUSCAweEMwMDAwMDAwIHwgMHgwMjYxCisjZGVmaW5lIE5UX1NUQVRVU19EUklWRVJfT1JESU5BTF9OT1RfRk9VTkQgMHhDMDAwMDAwMCB8IDB4MDI2MgorI2RlZmluZSBOVF9TVEFUVVNfRFJJVkVSX0VOVFJZUE9JTlRfTk9UX0ZPVU5EIDB4QzAwMDAwMDAgfCAweDAyNjMKKyNkZWZpbmUgTlRfU1RBVFVTX1JFU09VUkNFX05PVF9PV05FRCAweEMwMDAwMDAwIHwgMHgwMjY0CisjZGVmaW5lIE5UX1NUQVRVU19UT09fTUFOWV9MSU5LUyAweEMwMDAwMDAwIHwgMHgwMjY1CisjZGVmaW5lIE5UX1NUQVRVU19RVU9UQV9MSVNUX0lOQ09OU0lTVEVOVCAweEMwMDAwMDAwIHwgMHgwMjY2CisjZGVmaW5lIE5UX1NUQVRVU19GSUxFX0lTX09GRkxJTkUgMHhDMDAwMDAwMCB8IDB4MDI2NworI2RlZmluZSBOVF9TVEFUVVNfTk9fU1VDSF9KT0IgMHhDMDAwMDAwMCB8IDB4RURFCS8qIHNjaGVkdWxlciAqLworCisjZW5kaWYJCQkJLyogX05URVJSX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvbnRsbXNzcC5oIGIvZnMvY2lmcy9udGxtc3NwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZhY2I0MQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2NpZnMvbnRsbXNzcC5oCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogICBmcy9jaWZzL250bG1zc3AuaAorICoKKyAqICAgQ29weXJpZ2h0IChjKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzICBDb3JwLiwgMjAwMgorICogICBBdXRob3Iocyk6IFN0ZXZlIEZyZW5jaCAoc2ZyZW5jaEB1cy5pYm0uY29tKQorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBIAorICovCisKKyNwcmFnbWEgcGFjaygxKQorCisjZGVmaW5lIE5UTE1TU1BfU0lHTkFUVVJFICJOVExNU1NQIgorLyogTWVzc2FnZSBUeXBlcyAqLworI2RlZmluZSBOdExtTmVnb3RpYXRlICAgICBjcHVfdG9fbGUzMigxKQorI2RlZmluZSBOdExtQ2hhbGxlbmdlICAgICBjcHVfdG9fbGUzMigyKQorI2RlZmluZSBOdExtQXV0aGVudGljYXRlICBjcHVfdG9fbGUzMigzKQorI2RlZmluZSBVbmtub3duTWVzc2FnZSAgICBjcHVfdG9fbGUzMig4KQorCisvKiBOZWdvdGlhdGUgRmxhZ3MgKi8KKyNkZWZpbmUgTlRMTVNTUF9ORUdPVElBVEVfVU5JQ09ERSAgICAgICAweDAxCS8vIFRleHQgc3RyaW5ncyBhcmUgaW4gdW5pY29kZQorI2RlZmluZSBOVExNU1NQX05FR09USUFURV9PRU0gICAgICAgICAgIDB4MDIJLy8gVGV4dCBzdHJpbmdzIGFyZSBpbiBPRU0KKyNkZWZpbmUgTlRMTVNTUF9SRVFVRVNUX1RBUkdFVCAgICAgICAgICAweDA0CS8vIFNlcnZlciByZXR1cm4gaXRzIGF1dGggcmVhbG0KKyNkZWZpbmUgTlRMTVNTUF9ORUdPVElBVEVfU0lHTiAgICAgICAgMHgwMDEwCS8vIFJlcXVlc3Qgc2lnbmF0dXJlIGNhcGFiaWxpdHkKKyNkZWZpbmUgTlRMTVNTUF9ORUdPVElBVEVfU0VBTCAgICAgICAgMHgwMDIwCS8vIFJlcXVlc3QgY29uZmlkZW50aWFsaXR5CisjZGVmaW5lIE5UTE1TU1BfTkVHT1RJQVRFX0RHUkFNICAgICAgIDB4MDA0MAorI2RlZmluZSBOVExNU1NQX05FR09USUFURV9MTV9LRVkgICAgICAweDAwODAgLy8gVXNlIExNIHNlc3Npb24ga2V5IGZvciBzaWduL3NlYWwKKyNkZWZpbmUgTlRMTVNTUF9ORUdPVElBVEVfTlRMTSAgICAgICAgMHgwMjAwCS8vIE5UTE0gYXV0aGVudGljYXRpb24KKyNkZWZpbmUgTlRMTVNTUF9ORUdPVElBVEVfRE9NQUlOX1NVUFBMSUVEIDB4MTAwMAorI2RlZmluZSBOVExNU1NQX05FR09USUFURV9XT1JLU1RBVElPTl9TVVBQTElFRCAweDIwMDAKKyNkZWZpbmUgTlRMTVNTUF9ORUdPVElBVEVfTE9DQUxfQ0FMTCAgMHg0MDAwCS8vIGNsaWVudC9zZXJ2ZXIgb24gc2FtZSBtYWNoaW5lCisjZGVmaW5lIE5UTE1TU1BfTkVHT1RJQVRFX0FMV0FZU19TSUdOIDB4ODAwMAkvLyBTaWduIGZvciBhbGwgc2VjdXJpdHkgbGV2ZWxzCisjZGVmaW5lIE5UTE1TU1BfVEFSR0VUX1RZUEVfRE9NQUlOICAgMHgxMDAwMAorI2RlZmluZSBOVExNU1NQX1RBUkdFVF9UWVBFX1NFUlZFUiAgIDB4MjAwMDAKKyNkZWZpbmUgTlRMTVNTUF9UQVJHRVRfVFlQRV9TSEFSRSAgICAweDQwMDAwCisjZGVmaW5lIE5UTE1TU1BfTkVHT1RJQVRFX05UTE1WMiAgICAgMHg4MDAwMAorI2RlZmluZSBOVExNU1NQX1JFUVVFU1RfSU5JVF9SRVNQICAgMHgxMDAwMDAKKyNkZWZpbmUgTlRMTVNTUF9SRVFVRVNUX0FDQ0VQVF9SRVNQIDB4MjAwMDAwCisjZGVmaW5lIE5UTE1TU1BfUkVRVUVTVF9OT1RfTlRfS0VZICAweDQwMDAwMAorI2RlZmluZSBOVExNU1NQX05FR09USUFURV9UQVJHRVRfSU5GTyAweDgwMDAwMAorI2RlZmluZSBOVExNU1NQX05FR09USUFURV8xMjggICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgTlRMTVNTUF9ORUdPVElBVEVfS0VZX1hDSCAweDQwMDAwMDAwCisjZGVmaW5lIE5UTE1TU1BfTkVHT1RJQVRFXzU2ICAgICAgMHg4MDAwMDAwMAorCisvKiBBbHRob3VnaCB0eXBlZGVmcyBhcmUgbm90IGNvbW1vbmx5IHVzZWQgZm9yIHN0cnVjdHVyZSBkZWZpbml0aW9ucyAqLworLyogaW4gdGhlIExpbnV4IGtlcm5lbCwgaW4gdGhpcyBwYXJ0aWN1bGFyIGNhc2UgdGhleSBhcmUgdXNlZnVsICAgICAgKi8KKy8qIHRvIG1vcmUgY2xvc2VseSBtYXRjaCB0aGUgc3RhbmRhcmRzIGRvY3VtZW50IGZvciBOVExNU1NQIGZyb20gICAgICovCisvKiBPcGVuR3JvdXAgYW5kIHRvIG1ha2UgdGhlIGNvZGUgbW9yZSBjbG9zZWx5IG1hdGNoIHRoZSBzdGFuZGFyZCBpbiAqLworLyogYXBwZWFyYW5jZSAqLworCit0eXBlZGVmIHN0cnVjdCBfU0VDVVJJVFlfQlVGRkVSIHsKKwlfX2xlMTYgTGVuZ3RoOworCV9fbGUxNiBNYXhpbXVtTGVuZ3RoOworCV9fbGUzMiBCdWZmZXI7CQkvKiBvZmZzZXQgdG8gYnVmZmVyICovCit9IFNFQ1VSSVRZX0JVRkZFUjsKKwordHlwZWRlZiBzdHJ1Y3QgX05FR09USUFURV9NRVNTQUdFIHsKKwlfX3U4IFNpZ25hdHVyZVtzaXplb2YgKE5UTE1TU1BfU0lHTkFUVVJFKV07CisJX19sZTMyIE1lc3NhZ2VUeXBlOyAgICAgLyogMSAqLworCV9fbGUzMiBOZWdvdGlhdGVGbGFnczsKKwlTRUNVUklUWV9CVUZGRVIgRG9tYWluTmFtZTsJLyogUkZDIDEwMDEgc3R5bGUgYW5kIEFTQ0lJICovCisJU0VDVVJJVFlfQlVGRkVSIFdvcmtzdGF0aW9uTmFtZTsJLyogUkZDIDEwMDEgYW5kIEFTQ0lJICovCisJY2hhciBEb21haW5TdHJpbmdbMF07CisJLyogZm9sbG93ZWQgYnkgV29ya3N0YXRpb25TdHJpbmcgKi8KK30gTkVHT1RJQVRFX01FU1NBR0UsICpQTkVHT1RJQVRFX01FU1NBR0U7CisKK3R5cGVkZWYgc3RydWN0IF9DSEFMTEVOR0VfTUVTU0FHRSB7CisJX191OCBTaWduYXR1cmVbc2l6ZW9mIChOVExNU1NQX1NJR05BVFVSRSldOworCV9fbGUzMiBNZXNzYWdlVHlwZTsgICAvKiAyICovCisJU0VDVVJJVFlfQlVGRkVSIFRhcmdldE5hbWU7CisJX19sZTMyIE5lZ290aWF0ZUZsYWdzOworCV9fdTggQ2hhbGxlbmdlW0NJRlNfQ1JZUFRPX0tFWV9TSVpFXTsKKwlfX3U4IFJlc2VydmVkWzhdOworCVNFQ1VSSVRZX0JVRkZFUiBUYXJnZXRJbmZvQXJyYXk7Cit9IENIQUxMRU5HRV9NRVNTQUdFLCAqUENIQUxMRU5HRV9NRVNTQUdFOworCit0eXBlZGVmIHN0cnVjdCBfQVVUSEVOVElDQVRFX01FU1NBR0UgeworCV9fdTggU2lnbmF0dXJlW3NpemVvZiAoTlRMTVNTUF9TSUdOQVRVUkUpXTsKKwlfX2xlMzIgTWVzc2FnZVR5cGU7ICAvKiAzICovCisJU0VDVVJJVFlfQlVGRkVSIExtQ2hhbGxlbmdlUmVzcG9uc2U7CisJU0VDVVJJVFlfQlVGRkVSIE50Q2hhbGxlbmdlUmVzcG9uc2U7CisJU0VDVVJJVFlfQlVGRkVSIERvbWFpbk5hbWU7CisJU0VDVVJJVFlfQlVGRkVSIFVzZXJOYW1lOworCVNFQ1VSSVRZX0JVRkZFUiBXb3Jrc3RhdGlvbk5hbWU7CisJU0VDVVJJVFlfQlVGRkVSIFNlc3Npb25LZXk7CisJX19sZTMyIE5lZ290aWF0ZUZsYWdzOworCWNoYXIgVXNlclN0cmluZ1swXTsKK30gQVVUSEVOVElDQVRFX01FU1NBR0UsICpQQVVUSEVOVElDQVRFX01FU1NBR0U7CisKKyNwcmFnbWEgcGFjaygpCQkJLyogcmVzdW1lIGRlZmF1bHQgc3RydWN0dXJlIHBhY2tpbmcgKi8KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvcmVhZGRpci5jIGIvZnMvY2lmcy9yZWFkZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhiZWEzOQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2NpZnMvcmVhZGRpci5jCkBAIC0wLDAgKzEsODY3IEBACisvKgorICogICBmcy9jaWZzL3JlYWRkaXIuYworICoKKyAqICAgRGlyZWN0b3J5IHNlYXJjaCBoYW5kbGluZworICogCisgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyAgQ29ycC4sIDIwMDQKKyAqICAgQXV0aG9yKHMpOiBTdGV2ZSBGcmVuY2ggKHNmcmVuY2hAdXMuaWJtLmNvbSkKKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogICBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgKiAgIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlICJjaWZzcGR1LmgiCisjaW5jbHVkZSAiY2lmc2dsb2IuaCIKKyNpbmNsdWRlICJjaWZzcHJvdG8uaCIKKyNpbmNsdWRlICJjaWZzX3VuaWNvZGUuaCIKKyNpbmNsdWRlICJjaWZzX2RlYnVnLmgiCisjaW5jbHVkZSAiY2lmc19mc19zYi5oIgorI2luY2x1ZGUgImNpZnNmcy5oIgorCisvKiBCQiBmaXhtZSAtIGFkZCBkZWJ1ZyB3cmFwcGVycyBhcm91bmQgdGhpcyBmdW5jdGlvbiB0byBkaXNhYmxlIGl0IGZpeG1lIEJCICovCisvKiBzdGF0aWMgdm9pZCBkdW1wX2NpZnNfZmlsZV9zdHJ1Y3Qoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmxhYmVsKQoreworCXN0cnVjdCBjaWZzRmlsZUluZm8gKiBjZjsKKworCWlmKGZpbGUpIHsKKwkJY2YgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJCWlmKGNmID09IE5VTEwpIHsKKwkJCWNGWUkoMSwoImVtcHR5IGNpZnMgcHJpdmF0ZSBmaWxlIGRhdGEiKSk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYoY2YtPmludmFsaWRIYW5kbGUpIHsKKwkJCWNGWUkoMSwoImludmFsaWQgaGFuZGxlIikpOworCQl9CisJCWlmKGNmLT5zcmNoX2luZi5lbmRPZlNlYXJjaCkgeworCQkJY0ZZSSgxLCgiZW5kIG9mIHNlYXJjaCIpKTsKKwkJfQorCQlpZihjZi0+c3JjaF9pbmYuZW1wdHlEaXIpIHsKKwkJCWNGWUkoMSwoImVtcHR5IGRpciIpKTsKKwkJfQorCQkKKwl9Cit9ICovCisKKy8qIFJldHVybnMgb25lIGlmIG5ldyBpbm9kZSBjcmVhdGVkICh3aGljaCB0aGVyZWZvcmUgbmVlZHMgdG8gYmUgaGFzaGVkKSAqLworLyogTWlnaHQgY2hlY2sgaW4gdGhlIGZ1dHVyZSBpZiBpbm9kZSBudW1iZXIgY2hhbmdlZCBzbyB3ZSBjYW4gcmVoYXNoIGlub2RlICovCitzdGF0aWMgaW50IGNvbnN0cnVjdF9kZW50cnkoc3RydWN0IHFzdHIgKnFzdHJpbmcsIHN0cnVjdCBmaWxlICpmaWxlLAorCXN0cnVjdCBpbm9kZSAqKnB0bXBfaW5vZGUsIHN0cnVjdCBkZW50cnkgKipwbmV3X2RlbnRyeSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICp0bXBfZGVudHJ5OworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisJc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb247CisJaW50IHJjID0gMDsKKworCWNGWUkoMSwgKCJGb3IgJXMgIiwgcXN0cmluZy0+bmFtZSkpOworCWNpZnNfc2IgPSBDSUZTX1NCKGZpbGUtPmZfZGVudHJ5LT5kX3NiKTsKKwlwVGNvbiA9IGNpZnNfc2ItPnRjb247CisKKwlxc3RyaW5nLT5oYXNoID0gZnVsbF9uYW1lX2hhc2gocXN0cmluZy0+bmFtZSwgcXN0cmluZy0+bGVuKTsKKwl0bXBfZGVudHJ5ID0gZF9sb29rdXAoZmlsZS0+Zl9kZW50cnksIHFzdHJpbmcpOworCWlmICh0bXBfZGVudHJ5KSB7CisJCWNGWUkoMCwgKCIgZXhpc3RpbmcgZGVudHJ5IHdpdGggaW5vZGUgMHglcCIsIHRtcF9kZW50cnktPmRfaW5vZGUpKTsKKwkJKnB0bXBfaW5vZGUgPSB0bXBfZGVudHJ5LT5kX2lub2RlOworLyogQkIgb3ZlcndyaXRlIG9sZCBuYW1lPyBpLmUuIHRtcF9kZW50cnktPmRfbmFtZSBhbmQgdG1wX2RlbnRyeS0+ZF9uYW1lLmxlbj8/Ki8KKwkJaWYoKnB0bXBfaW5vZGUgPT0gTlVMTCkgeworCQkJKnB0bXBfaW5vZGUgPSBuZXdfaW5vZGUoZmlsZS0+Zl9kZW50cnktPmRfc2IpOworCQkJaWYoKnB0bXBfaW5vZGUgPT0gTlVMTCkKKwkJCQlyZXR1cm4gcmM7CisJCQlyYyA9IDE7CisJCQlkX2luc3RhbnRpYXRlKHRtcF9kZW50cnksICpwdG1wX2lub2RlKTsKKwkJfQorCX0gZWxzZSB7CisJCXRtcF9kZW50cnkgPSBkX2FsbG9jKGZpbGUtPmZfZGVudHJ5LCBxc3RyaW5nKTsKKwkJaWYodG1wX2RlbnRyeSA9PSBOVUxMKSB7CisJCQljRVJST1IoMSwoIkZhaWxlZCBhbGxvY2F0aW5nIGRlbnRyeSIpKTsKKwkJCSpwdG1wX2lub2RlID0gTlVMTDsKKwkJCXJldHVybiByYzsKKwkJfQorCisJCSpwdG1wX2lub2RlID0gbmV3X2lub2RlKGZpbGUtPmZfZGVudHJ5LT5kX3NiKTsKKwkJdG1wX2RlbnRyeS0+ZF9vcCA9ICZjaWZzX2RlbnRyeV9vcHM7CisJCWlmKCpwdG1wX2lub2RlID09IE5VTEwpCisJCQlyZXR1cm4gcmM7CisJCXJjID0gMTsKKwkJZF9pbnN0YW50aWF0ZSh0bXBfZGVudHJ5LCAqcHRtcF9pbm9kZSk7CisJCWRfcmVoYXNoKHRtcF9kZW50cnkpOworCX0KKworCXRtcF9kZW50cnktPmRfdGltZSA9IGppZmZpZXM7CisJKnBuZXdfZGVudHJ5ID0gdG1wX2RlbnRyeTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfaW5faW5vZGUoc3RydWN0IGlub2RlICp0bXBfaW5vZGUsCisJRklMRV9ESVJFQ1RPUllfSU5GTyAqcGZpbmREYXRhLCBpbnQgKnBvYmplY3RfdHlwZSkKK3sKKwlzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqY2lmc0luZm8gPSBDSUZTX0kodG1wX2lub2RlKTsKKwlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiID0gQ0lGU19TQih0bXBfaW5vZGUtPmlfc2IpOworCV9fdTMyIGF0dHIgPSBsZTMyX3RvX2NwdShwZmluZERhdGEtPkV4dEZpbGVBdHRyaWJ1dGVzKTsKKwlfX3U2NCBhbGxvY2F0aW9uX3NpemUgPSBsZTY0X3RvX2NwdShwZmluZERhdGEtPkFsbG9jYXRpb25TaXplKTsKKwlfX3U2NCBlbmRfb2ZfZmlsZSA9IGxlNjRfdG9fY3B1KHBmaW5kRGF0YS0+RW5kT2ZGaWxlKTsKKworCWNpZnNJbmZvLT5jaWZzQXR0cnMgPSBhdHRyOworCWNpZnNJbmZvLT50aW1lID0gamlmZmllczsKKworCS8qIExpbnV4IGNhbiBub3Qgc3RvcmUgZmlsZSBjcmVhdGlvbiB0aW1lIHVuZm9ydHVuYXRlbHkgc28gaWdub3JlIGl0ICovCisJdG1wX2lub2RlLT5pX2F0aW1lID0KKwkgICAgY2lmc19OVHRpbWVUb1VuaXgobGU2NF90b19jcHUocGZpbmREYXRhLT5MYXN0QWNjZXNzVGltZSkpOworCXRtcF9pbm9kZS0+aV9tdGltZSA9CisJICAgIGNpZnNfTlR0aW1lVG9Vbml4KGxlNjRfdG9fY3B1KHBmaW5kRGF0YS0+TGFzdFdyaXRlVGltZSkpOworCXRtcF9pbm9kZS0+aV9jdGltZSA9CisJICAgIGNpZnNfTlR0aW1lVG9Vbml4KGxlNjRfdG9fY3B1KHBmaW5kRGF0YS0+Q2hhbmdlVGltZSkpOworCS8qIHRyZWF0IGRvcyBhdHRyaWJ1dGUgb2YgcmVhZC1vbmx5IGFzIHJlYWQtb25seSBtb2RlIGJpdCBlLmcuIDU1NT8gKi8KKwkvKiAyNzY3IHBlcm1zIC0gaW5kaWNhdGUgbWFuZGF0b3J5IGxvY2tpbmcgKi8KKwkJLyogQkIgZmlsbCBpbiB1aWQgYW5kIGdpZCBoZXJlPyB3aXRoIGhlbHAgZnJvbSB3aW5iaW5kPyAKKwkJICAgb3IgcmV0cmlldmUgZnJvbSBOVEZTIHN0cmVhbSBleHRlbmRlZCBhdHRyaWJ1dGUgKi8KKwlpZiAoYXRvbWljX3JlYWQoJmNpZnNJbmZvLT5pblVzZSkgPT0gMCkgeworCQl0bXBfaW5vZGUtPmlfdWlkID0gY2lmc19zYi0+bW50X3VpZDsKKwkJdG1wX2lub2RlLT5pX2dpZCA9IGNpZnNfc2ItPm1udF9naWQ7CisJCS8qIHNldCBkZWZhdWx0IG1vZGUuIHdpbGwgb3ZlcnJpZGUgZm9yIGRpcnMgYmVsb3cgKi8KKwkJdG1wX2lub2RlLT5pX21vZGUgPSBjaWZzX3NiLT5tbnRfZmlsZV9tb2RlOworCX0KKworCWNGWUkoMCwoIkNJRlMgRkZJUlNUOiBBdHRyaWJ1dGVzIGNhbWUgaW4gYXMgMHgleCIsYXR0cikpOworCWlmIChhdHRyICYgQVRUUl9ESVJFQ1RPUlkpIHsKKwkJKnBvYmplY3RfdHlwZSA9IERUX0RJUjsKKwkJLyogb3ZlcnJpZGUgZGVmYXVsdCBwZXJtcyBzaW5jZSB3ZSBkbyBub3QgbG9jayBkaXJzICovCisJCWlmKGF0b21pY19yZWFkKCZjaWZzSW5mby0+aW5Vc2UpID09IDApIHsKKwkJCXRtcF9pbm9kZS0+aV9tb2RlID0gY2lmc19zYi0+bW50X2Rpcl9tb2RlOworCQl9CisJCXRtcF9pbm9kZS0+aV9tb2RlIHw9IFNfSUZESVI7CisvKiB3ZSBubyBsb25nZXIgbWFyayB0aGVzZSBiZWNhdXNlIHdlIGNvdWxkIG5vdCBmb2xsb3cgdGhlbSAqLworLyogICAgICAgIH0gZWxzZSBpZiAoYXR0ciAmIEFUVFJfUkVQQVJTRSkgeworICAgICAgICAgICAgICAgICpwb2JqZWN0X3R5cGUgPSBEVF9MTks7CisgICAgICAgICAgICAgICAgdG1wX2lub2RlLT5pX21vZGUgfD0gU19JRkxOSzsgKi8KKwl9IGVsc2UgeworCQkqcG9iamVjdF90eXBlID0gRFRfUkVHOworCQl0bXBfaW5vZGUtPmlfbW9kZSB8PSBTX0lGUkVHOworCQlpZiAoYXR0ciAmIEFUVFJfUkVBRE9OTFkpCisJCQl0bXBfaW5vZGUtPmlfbW9kZSAmPSB+KFNfSVdVR08pOworCX0gLyogY291bGQgYWRkIGNvZGUgaGVyZSAtIHRvIHZhbGlkYXRlIGlmIGRldmljZSBvciB3ZWlyZCBzaGFyZSB0eXBlPyAqLworCisJLyogY2FuIG5vdCBmaWxsIGluIG5saW5rIGhlcmUgYXMgaW4gcXBhdGhpbmZvIHZlcnNpb24gYW5kIFVueCBzZWFyY2ggKi8KKwlpZiAoYXRvbWljX3JlYWQoJmNpZnNJbmZvLT5pblVzZSkgPT0gMCkgeworCQlhdG9taWNfc2V0KCZjaWZzSW5mby0+aW5Vc2UsIDEpOworCX0KKworCWlmIChpc19zaXplX3NhZmVfdG9fY2hhbmdlKGNpZnNJbmZvKSkgeworCQkvKiBjYW4gbm90IHNhZmVseSBjaGFuZ2UgdGhlIGZpbGUgc2l6ZSBoZXJlIGlmIHRoZSAKKwkJY2xpZW50IGlzIHdyaXRpbmcgdG8gaXQgZHVlIHRvIHBvdGVudGlhbCByYWNlcyAqLworCQlpX3NpemVfd3JpdGUodG1wX2lub2RlLCBlbmRfb2ZfZmlsZSk7CisKKwkvKiA1MTIgYnl0ZXMgKDIqKjkpIGlzIHRoZSBmYWtlIGJsb2Nrc2l6ZSB0aGF0IG11c3QgYmUgdXNlZCAqLworCS8qIGZvciB0aGlzIGNhbGN1bGF0aW9uLCBldmVuIHRob3VnaCB0aGUgcmVwb3J0ZWQgYmxvY2tzaXplIGlzIGxhcmdlciAqLworCQl0bXBfaW5vZGUtPmlfYmxvY2tzID0gKDUxMiAtIDEgKyBhbGxvY2F0aW9uX3NpemUpID4+IDk7CisJfQorCisJaWYgKGFsbG9jYXRpb25fc2l6ZSA8IGVuZF9vZl9maWxlKQorCQljRllJKDEsICgiTWF5IGJlIHNwYXJzZSBmaWxlLCBhbGxvY2F0aW9uIGxlc3MgdGhhbiBmaWxlIHNpemUiKSk7CisJY0ZZSSgxLAorCSAgICAgKCJGaWxlIFNpemUgJWxkIGFuZCBibG9ja3MgJWxkIGFuZCBibG9ja3NpemUgJWxkIiwKKwkgICAgICAodW5zaWduZWQgbG9uZyl0bXBfaW5vZGUtPmlfc2l6ZSwgdG1wX2lub2RlLT5pX2Jsb2NrcywKKwkgICAgICB0bXBfaW5vZGUtPmlfYmxrc2l6ZSkpOworCWlmIChTX0lTUkVHKHRtcF9pbm9kZS0+aV9tb2RlKSkgeworCQljRllJKDEsICgiIEZpbGUgaW5vZGUgIikpOworCQl0bXBfaW5vZGUtPmlfb3AgPSAmY2lmc19maWxlX2lub2RlX29wczsKKwkJaWYoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX0RJUkVDVF9JTykKKwkJCXRtcF9pbm9kZS0+aV9mb3AgPSAmY2lmc19maWxlX2RpcmVjdF9vcHM7CisJCWVsc2UKKwkJCXRtcF9pbm9kZS0+aV9mb3AgPSAmY2lmc19maWxlX29wczsKKwkJdG1wX2lub2RlLT5pX2RhdGEuYV9vcHMgPSAmY2lmc19hZGRyX29wczsKKwl9IGVsc2UgaWYgKFNfSVNESVIodG1wX2lub2RlLT5pX21vZGUpKSB7CisJCWNGWUkoMSwgKCIgRGlyZWN0b3J5IGlub2RlIikpOworCQl0bXBfaW5vZGUtPmlfb3AgPSAmY2lmc19kaXJfaW5vZGVfb3BzOworCQl0bXBfaW5vZGUtPmlfZm9wID0gJmNpZnNfZGlyX29wczsKKwl9IGVsc2UgaWYgKFNfSVNMTksodG1wX2lub2RlLT5pX21vZGUpKSB7CisJCWNGWUkoMSwgKCIgU3ltYm9saWMgTGluayBpbm9kZSAiKSk7CisJCXRtcF9pbm9kZS0+aV9vcCA9ICZjaWZzX3N5bWxpbmtfaW5vZGVfb3BzOworCX0gZWxzZSB7CisJCWNGWUkoMSwgKCIgSW5pdCBzcGVjaWFsIGlub2RlICIpKTsKKwkJaW5pdF9zcGVjaWFsX2lub2RlKHRtcF9pbm9kZSwgdG1wX2lub2RlLT5pX21vZGUsCisJCQkJICAgdG1wX2lub2RlLT5pX3JkZXYpOworCX0KK30KKworc3RhdGljIHZvaWQgdW5peF9maWxsX2luX2lub2RlKHN0cnVjdCBpbm9kZSAqdG1wX2lub2RlLAorCUZJTEVfVU5JWF9JTkZPICpwZmluZERhdGEsIGludCAqcG9iamVjdF90eXBlKQoreworCXN0cnVjdCBjaWZzSW5vZGVJbmZvICpjaWZzSW5mbyA9IENJRlNfSSh0bXBfaW5vZGUpOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2IgPSBDSUZTX1NCKHRtcF9pbm9kZS0+aV9zYik7CisKKwlfX3UzMiB0eXBlID0gbGUzMl90b19jcHUocGZpbmREYXRhLT5UeXBlKTsKKwlfX3U2NCBudW1fb2ZfYnl0ZXMgPSBsZTY0X3RvX2NwdShwZmluZERhdGEtPk51bU9mQnl0ZXMpOworCV9fdTY0IGVuZF9vZl9maWxlID0gbGU2NF90b19jcHUocGZpbmREYXRhLT5FbmRPZkZpbGUpOworCWNpZnNJbmZvLT50aW1lID0gamlmZmllczsKKwlhdG9taWNfaW5jKCZjaWZzSW5mby0+aW5Vc2UpOworCisJdG1wX2lub2RlLT5pX2F0aW1lID0KKwkgICAgY2lmc19OVHRpbWVUb1VuaXgobGU2NF90b19jcHUocGZpbmREYXRhLT5MYXN0QWNjZXNzVGltZSkpOworCXRtcF9pbm9kZS0+aV9tdGltZSA9CisJICAgIGNpZnNfTlR0aW1lVG9Vbml4KGxlNjRfdG9fY3B1KHBmaW5kRGF0YS0+TGFzdE1vZGlmaWNhdGlvblRpbWUpKTsKKwl0bXBfaW5vZGUtPmlfY3RpbWUgPQorCSAgICBjaWZzX05UdGltZVRvVW5peChsZTY0X3RvX2NwdShwZmluZERhdGEtPkxhc3RTdGF0dXNDaGFuZ2UpKTsKKworCXRtcF9pbm9kZS0+aV9tb2RlID0gbGU2NF90b19jcHUocGZpbmREYXRhLT5QZXJtaXNzaW9ucyk7CisJaWYgKHR5cGUgPT0gVU5JWF9GSUxFKSB7CisJCSpwb2JqZWN0X3R5cGUgPSBEVF9SRUc7CisJCXRtcF9pbm9kZS0+aV9tb2RlIHw9IFNfSUZSRUc7CisJfSBlbHNlIGlmICh0eXBlID09IFVOSVhfU1lNTElOSykgeworCQkqcG9iamVjdF90eXBlID0gRFRfTE5LOworCQl0bXBfaW5vZGUtPmlfbW9kZSB8PSBTX0lGTE5LOworCX0gZWxzZSBpZiAodHlwZSA9PSBVTklYX0RJUikgeworCQkqcG9iamVjdF90eXBlID0gRFRfRElSOworCQl0bXBfaW5vZGUtPmlfbW9kZSB8PSBTX0lGRElSOworCX0gZWxzZSBpZiAodHlwZSA9PSBVTklYX0NIQVJERVYpIHsKKwkJKnBvYmplY3RfdHlwZSA9IERUX0NIUjsKKwkJdG1wX2lub2RlLT5pX21vZGUgfD0gU19JRkNIUjsKKwkJdG1wX2lub2RlLT5pX3JkZXYgPSBNS0RFVihsZTY0X3RvX2NwdShwZmluZERhdGEtPkRldk1ham9yKSwKKwkJCQlsZTY0X3RvX2NwdShwZmluZERhdGEtPkRldk1pbm9yKSAmIE1JTk9STUFTSyk7CisJfSBlbHNlIGlmICh0eXBlID09IFVOSVhfQkxPQ0tERVYpIHsKKwkJKnBvYmplY3RfdHlwZSA9IERUX0JMSzsKKwkJdG1wX2lub2RlLT5pX21vZGUgfD0gU19JRkJMSzsKKwkJdG1wX2lub2RlLT5pX3JkZXYgPSBNS0RFVihsZTY0X3RvX2NwdShwZmluZERhdGEtPkRldk1ham9yKSwKKwkJCQlsZTY0X3RvX2NwdShwZmluZERhdGEtPkRldk1pbm9yKSAmIE1JTk9STUFTSyk7CisJfSBlbHNlIGlmICh0eXBlID09IFVOSVhfRklGTykgeworCQkqcG9iamVjdF90eXBlID0gRFRfRklGTzsKKwkJdG1wX2lub2RlLT5pX21vZGUgfD0gU19JRklGTzsKKwl9IGVsc2UgaWYgKHR5cGUgPT0gVU5JWF9TT0NLRVQpIHsKKwkJKnBvYmplY3RfdHlwZSA9IERUX1NPQ0s7CisJCXRtcF9pbm9kZS0+aV9tb2RlIHw9IFNfSUZTT0NLOworCX0KKworCXRtcF9pbm9kZS0+aV91aWQgPSBsZTY0X3RvX2NwdShwZmluZERhdGEtPlVpZCk7CisJdG1wX2lub2RlLT5pX2dpZCA9IGxlNjRfdG9fY3B1KHBmaW5kRGF0YS0+R2lkKTsKKwl0bXBfaW5vZGUtPmlfbmxpbmsgPSBsZTY0X3RvX2NwdShwZmluZERhdGEtPk5saW5rcyk7CisKKwlpZiAoaXNfc2l6ZV9zYWZlX3RvX2NoYW5nZShjaWZzSW5mbykpIHsKKwkJLyogY2FuIG5vdCBzYWZlbHkgY2hhbmdlIHRoZSBmaWxlIHNpemUgaGVyZSBpZiB0aGUgCisJCWNsaWVudCBpcyB3cml0aW5nIHRvIGl0IGR1ZSB0byBwb3RlbnRpYWwgcmFjZXMgKi8KKwkJaV9zaXplX3dyaXRlKHRtcF9pbm9kZSxlbmRfb2ZfZmlsZSk7CisKKwkvKiA1MTIgYnl0ZXMgKDIqKjkpIGlzIHRoZSBmYWtlIGJsb2Nrc2l6ZSB0aGF0IG11c3QgYmUgdXNlZCAqLworCS8qIGZvciB0aGlzIGNhbGN1bGF0aW9uLCBub3QgdGhlIHJlYWwgYmxvY2tzaXplICovCisJCXRtcF9pbm9kZS0+aV9ibG9ja3MgPSAoNTEyIC0gMSArIG51bV9vZl9ieXRlcykgPj4gOTsKKwl9CisKKwlpZiAoU19JU1JFRyh0bXBfaW5vZGUtPmlfbW9kZSkpIHsKKwkJY0ZZSSgxLCAoIkZpbGUgaW5vZGUiKSk7CisJCXRtcF9pbm9kZS0+aV9vcCA9ICZjaWZzX2ZpbGVfaW5vZGVfb3BzOworCQlpZihjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfRElSRUNUX0lPKQorCQkJdG1wX2lub2RlLT5pX2ZvcCA9ICZjaWZzX2ZpbGVfZGlyZWN0X29wczsKKwkJZWxzZQorCQkJdG1wX2lub2RlLT5pX2ZvcCA9ICZjaWZzX2ZpbGVfb3BzOworCQl0bXBfaW5vZGUtPmlfZGF0YS5hX29wcyA9ICZjaWZzX2FkZHJfb3BzOworCX0gZWxzZSBpZiAoU19JU0RJUih0bXBfaW5vZGUtPmlfbW9kZSkpIHsKKwkJY0ZZSSgxLCAoIkRpcmVjdG9yeSBpbm9kZSIpKTsKKwkJdG1wX2lub2RlLT5pX29wID0gJmNpZnNfZGlyX2lub2RlX29wczsKKwkJdG1wX2lub2RlLT5pX2ZvcCA9ICZjaWZzX2Rpcl9vcHM7CisJfSBlbHNlIGlmIChTX0lTTE5LKHRtcF9pbm9kZS0+aV9tb2RlKSkgeworCQljRllJKDEsICgiU3ltYm9saWMgTGluayBpbm9kZSIpKTsKKwkJdG1wX2lub2RlLT5pX29wID0gJmNpZnNfc3ltbGlua19pbm9kZV9vcHM7CisvKiB0bXBfaW5vZGUtPmlfZm9wID0gKi8vKiBkbyBub3QgbmVlZCB0byBzZXQgdG8gYW55dGhpbmcgKi8KKwl9IGVsc2UgeworCQljRllJKDEsICgiU3BlY2lhbCBpbm9kZSIpKTsgCisJCWluaXRfc3BlY2lhbF9pbm9kZSh0bXBfaW5vZGUsIHRtcF9pbm9kZS0+aV9tb2RlLAorCQkJCSAgIHRtcF9pbm9kZS0+aV9yZGV2KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaW5pdGlhdGVfY2lmc19zZWFyY2goY29uc3QgaW50IHhpZCwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IHJjID0gMDsKKwljaGFyICogZnVsbF9wYXRoOworCXN0cnVjdCBjaWZzRmlsZUluZm8gKiBjaWZzRmlsZTsKKwlzdHJ1Y3QgY2lmc19zYl9pbmZvICpjaWZzX3NiOworCXN0cnVjdCBjaWZzVGNvbkluZm8gKnBUY29uOworCisJaWYoZmlsZS0+cHJpdmF0ZV9kYXRhID09IE5VTEwpIHsKKwkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gCisJCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY2lmc0ZpbGVJbmZvKSxHRlBfS0VSTkVMKTsKKwl9CisKKwlpZihmaWxlLT5wcml2YXRlX2RhdGEgPT0gTlVMTCkgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9IGVsc2UgeworCQltZW1zZXQoZmlsZS0+cHJpdmF0ZV9kYXRhLDAsc2l6ZW9mKHN0cnVjdCBjaWZzRmlsZUluZm8pKTsKKwl9CisJY2lmc0ZpbGUgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJY2lmc0ZpbGUtPmludmFsaWRIYW5kbGUgPSBUUlVFOworCWNpZnNGaWxlLT5zcmNoX2luZi5lbmRPZlNlYXJjaCA9IEZBTFNFOworCisJaWYoZmlsZS0+Zl9kZW50cnkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwljaWZzX3NiID0gQ0lGU19TQihmaWxlLT5mX2RlbnRyeS0+ZF9zYik7CisJaWYoY2lmc19zYiA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBUY29uID0gY2lmc19zYi0+dGNvbjsKKwlpZihwVGNvbiA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRvd24oJmZpbGUtPmZfZGVudHJ5LT5kX3NiLT5zX3Zmc19yZW5hbWVfc2VtKTsKKwlmdWxsX3BhdGggPSBidWlsZF93aWxkY2FyZF9wYXRoX2Zyb21fZGVudHJ5KGZpbGUtPmZfZGVudHJ5KTsKKwl1cCgmZmlsZS0+Zl9kZW50cnktPmRfc2ItPnNfdmZzX3JlbmFtZV9zZW0pOworCisJaWYoZnVsbF9wYXRoID09IE5VTEwpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY0ZZSSgxLCAoIkZ1bGwgcGF0aDogJXMgc3RhcnQgYXQ6ICVsbGQgIiwgZnVsbF9wYXRoLCBmaWxlLT5mX3BvcykpOworCisJLyogdGVzdCBmb3IgVW5peCBleHRlbnNpb25zICovCisJaWYgKHBUY29uLT5zZXMtPmNhcGFiaWxpdGllcyAmIENBUF9VTklYKSB7CisJCWNpZnNGaWxlLT5zcmNoX2luZi5pbmZvX2xldmVsID0gU01CX0ZJTkRfRklMRV9VTklYOyAKKwl9IGVsc2UgaWYgKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9TRVJWRVJfSU5VTSkgeworCQljaWZzRmlsZS0+c3JjaF9pbmYuaW5mb19sZXZlbCA9IFNNQl9GSU5EX0ZJTEVfSURfRlVMTF9ESVJfSU5GTzsKKwl9IGVsc2UgLyogbm90IHNydmlub3MgLSBCQiBmaXhtZSBhZGQgY2hlY2sgZm9yIGJhY2tsZXZlbD8gKi8geworCQljaWZzRmlsZS0+c3JjaF9pbmYuaW5mb19sZXZlbCA9IFNNQl9GSU5EX0ZJTEVfRElSRUNUT1JZX0lORk87CisJfQorCisJcmMgPSBDSUZTRmluZEZpcnN0KHhpZCwgcFRjb24sZnVsbF9wYXRoLGNpZnNfc2ItPmxvY2FsX25scywgCisJCSZjaWZzRmlsZS0+bmV0ZmlkLCAmY2lmc0ZpbGUtPnNyY2hfaW5mKTsgCisJaWYocmMgPT0gMCkKKwkJY2lmc0ZpbGUtPmludmFsaWRIYW5kbGUgPSBGQUxTRTsKKwlrZnJlZShmdWxsX3BhdGgpOworCXJldHVybiByYzsKK30KKworLyogcmV0dXJuIGxlbmd0aCBvZiB1bmljb2RlIHN0cmluZyBpbiBieXRlcyAqLworc3RhdGljIGludCBjaWZzX3VuaWNvZGVfYnl0ZWxlbihjaGFyICpzdHIpCit7CisJaW50IGxlbjsKKwlfX2xlMTYgKiB1c3RyID0gKF9fbGUxNiAqKXN0cjsKKworCWZvcihsZW49MDtsZW4gPD0gUEFUSF9NQVg7bGVuKyspIHsKKwkJaWYodXN0cltsZW5dID09IDApCisJCQlyZXR1cm4gbGVuIDw8IDE7CisJfQorCWNGWUkoMSwoIlVuaWNvZGUgc3RyaW5nIGxvbmdlciB0aGFuIFBBVEhfTUFYIGZvdW5kIikpOworCXJldHVybiBsZW4gPDwgMTsKK30KKworc3RhdGljIGNoYXIgKm54dF9kaXJfZW50cnkoY2hhciAqb2xkX2VudHJ5LCBjaGFyICplbmRfb2Zfc21iKQoreworCWNoYXIgKiBuZXdfZW50cnk7CisJRklMRV9ESVJFQ1RPUllfSU5GTyAqIHBEaXJJbmZvID0gKEZJTEVfRElSRUNUT1JZX0lORk8gKilvbGRfZW50cnk7CisKKwluZXdfZW50cnkgPSBvbGRfZW50cnkgKyBsZTMyX3RvX2NwdShwRGlySW5mby0+TmV4dEVudHJ5T2Zmc2V0KTsKKwljRllJKDEsKCJuZXcgZW50cnkgJXAgb2xkIGVudHJ5ICVwIixuZXdfZW50cnksb2xkX2VudHJ5KSk7CisJLyogdmFsaWRhdGUgdGhhdCBuZXdfZW50cnkgaXMgbm90IHBhc3QgZW5kIG9mIFNNQiAqLworCWlmKG5ld19lbnRyeSA+PSBlbmRfb2Zfc21iKSB7CisJCWNGWUkoMSwoInNlYXJjaCBlbnRyeSAlcCBiZWdhbiBhZnRlciBlbmQgb2YgU01CICVwIG9sZCBlbnRyeSAlcCIsCisJCQluZXdfZW50cnksZW5kX29mX3NtYixvbGRfZW50cnkpKTsgCisJCXJldHVybiBOVUxMOworCX0gZWxzZQorCQlyZXR1cm4gbmV3X2VudHJ5OworCit9CisKKyNkZWZpbmUgVU5JQ09ERV9ET1QgY3B1X3RvX2xlMTYoMHgyZSkKKworLyogcmV0dXJuIDAgaWYgbm8gbWF0Y2ggYW5kIDEgZm9yIC4gKGN1cnJlbnQgZGlyZWN0b3J5KSBhbmQgMiBmb3IgLi4gKHBhcmVudCkgKi8KK3N0YXRpYyBpbnQgY2lmc19lbnRyeV9pc19kb3QoY2hhciAqY3VycmVudF9lbnRyeSwgc3RydWN0IGNpZnNGaWxlSW5mbyAqY2ZpbGUpCit7CisJaW50IHJjID0gMDsKKwljaGFyICogZmlsZW5hbWUgPSBOVUxMOworCWludCBsZW4gPSAwOyAKKworCWlmKGNmaWxlLT5zcmNoX2luZi5pbmZvX2xldmVsID09IDB4MjAyKSB7CisJCUZJTEVfVU5JWF9JTkZPICogcEZpbmREYXRhID0gKEZJTEVfVU5JWF9JTkZPICopY3VycmVudF9lbnRyeTsKKwkJZmlsZW5hbWUgPSAmcEZpbmREYXRhLT5GaWxlTmFtZVswXTsKKwkJaWYoY2ZpbGUtPnNyY2hfaW5mLnVuaWNvZGUpIHsKKwkJCWxlbiA9IGNpZnNfdW5pY29kZV9ieXRlbGVuKGZpbGVuYW1lKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEJCIHNob3VsZCB3ZSBtYWtlIHRoaXMgc3RybmxlbiBvZiBQQVRIX01BWD8gKi8KKwkJCWxlbiA9IHN0cm5sZW4oZmlsZW5hbWUsIDUpOworCQl9CisJfSBlbHNlIGlmKGNmaWxlLT5zcmNoX2luZi5pbmZvX2xldmVsID09IDB4MTAxKSB7CisJCUZJTEVfRElSRUNUT1JZX0lORk8gKiBwRmluZERhdGEgPSAKKwkJCShGSUxFX0RJUkVDVE9SWV9JTkZPICopY3VycmVudF9lbnRyeTsKKwkJZmlsZW5hbWUgPSAmcEZpbmREYXRhLT5GaWxlTmFtZVswXTsKKwkJbGVuID0gbGUzMl90b19jcHUocEZpbmREYXRhLT5GaWxlTmFtZUxlbmd0aCk7CisJfSBlbHNlIGlmKGNmaWxlLT5zcmNoX2luZi5pbmZvX2xldmVsID09IDB4MTAyKSB7CisJCUZJTEVfRlVMTF9ESVJFQ1RPUllfSU5GTyAqIHBGaW5kRGF0YSA9IAorCQkJKEZJTEVfRlVMTF9ESVJFQ1RPUllfSU5GTyAqKWN1cnJlbnRfZW50cnk7CisJCWZpbGVuYW1lID0gJnBGaW5kRGF0YS0+RmlsZU5hbWVbMF07CisJCWxlbiA9IGxlMzJfdG9fY3B1KHBGaW5kRGF0YS0+RmlsZU5hbWVMZW5ndGgpOworCX0gZWxzZSBpZihjZmlsZS0+c3JjaF9pbmYuaW5mb19sZXZlbCA9PSAweDEwNSkgeworCQlTRUFSQ0hfSURfRlVMTF9ESVJfSU5GTyAqIHBGaW5kRGF0YSA9IAorCQkJKFNFQVJDSF9JRF9GVUxMX0RJUl9JTkZPICopY3VycmVudF9lbnRyeTsKKwkJZmlsZW5hbWUgPSAmcEZpbmREYXRhLT5GaWxlTmFtZVswXTsKKwkJbGVuID0gbGUzMl90b19jcHUocEZpbmREYXRhLT5GaWxlTmFtZUxlbmd0aCk7CisJfSBlbHNlIGlmKGNmaWxlLT5zcmNoX2luZi5pbmZvX2xldmVsID09IDB4MTA0KSB7CisJCUZJTEVfQk9USF9ESVJFQ1RPUllfSU5GTyAqIHBGaW5kRGF0YSA9IAorCQkJKEZJTEVfQk9USF9ESVJFQ1RPUllfSU5GTyAqKWN1cnJlbnRfZW50cnk7CisJCWZpbGVuYW1lID0gJnBGaW5kRGF0YS0+RmlsZU5hbWVbMF07CisJCWxlbiA9IGxlMzJfdG9fY3B1KHBGaW5kRGF0YS0+RmlsZU5hbWVMZW5ndGgpOworCX0gZWxzZSB7CisJCWNGWUkoMSwoIlVua25vd24gZmluZGZpcnN0IGxldmVsICVkIixjZmlsZS0+c3JjaF9pbmYuaW5mb19sZXZlbCkpOworCX0KKworCWlmKGZpbGVuYW1lKSB7CisJCWlmKGNmaWxlLT5zcmNoX2luZi51bmljb2RlKSB7CisJCQlfX2xlMTYgKnVmaWxlbmFtZSA9IChfX2xlMTYgKilmaWxlbmFtZTsKKwkJCWlmKGxlbiA9PSAyKSB7CisJCQkJLyogY2hlY2sgZm9yIC4gKi8KKwkJCQlpZih1ZmlsZW5hbWVbMF0gPT0gVU5JQ09ERV9ET1QpCisJCQkJCXJjID0gMTsKKwkJCX0gZWxzZSBpZihsZW4gPT0gNCkgeworCQkJCS8qIGNoZWNrIGZvciAuLiAqLworCQkJCWlmKCh1ZmlsZW5hbWVbMF0gPT0gVU5JQ09ERV9ET1QpCisJCQkJICAgJiYodWZpbGVuYW1lWzFdID09IFVOSUNPREVfRE9UKSkKKwkJCQkJcmMgPSAyOworCQkJfQorCQl9IGVsc2UgLyogQVNDSUkgKi8geworCQkJaWYobGVuID09IDEpIHsKKwkJCQlpZihmaWxlbmFtZVswXSA9PSAnLicpIAorCQkJCQlyYyA9IDE7CisJCQl9IGVsc2UgaWYobGVuID09IDIpIHsKKwkJCQlpZigoZmlsZW5hbWVbMF0gPT0gJy4nKSAmJiAoZmlsZW5hbWVbMV0gPT0gJy4nKSkgCisJCQkJCXJjID0gMjsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiByYzsKK30KKworLyogZmluZCB0aGUgY29ycmVzcG9uZGluZyBlbnRyeSBpbiB0aGUgc2VhcmNoICovCisvKiBOb3RlIHRoYXQgdGhlIFNNQiBzZXJ2ZXIgcmV0dXJucyBzZWFyY2ggZW50cmllcyBmb3IgLiBhbmQgLi4gd2hpY2gKKyAgIGNvbXBsaWNhdGVzIGxvZ2ljIGhlcmUgaWYgd2UgY2hvb3NlIHRvIHBhcnNlIGZvciB0aGVtIGFuZCB3ZSBkbyBub3QKKyAgIGFzc3VtZSB0aGF0IHRoZXkgYXJlIGxvY2F0ZWQgaW4gdGhlIGZpbmRmaXJzdCByZXR1cm4gYnVmZmVyLiovCisvKiBXZSBzdGFydCBjb3VudGluZyBpbiB0aGUgYnVmZmVyIHdpdGggZW50cnkgMiBhbmQgaW5jcmVtZW50IGZvciBldmVyeQorICAgZW50cnkgKGRvIG5vdCBpbmNyZW1lbnQgZm9yIC4gb3IgLi4gZW50cnkpICovCitzdGF0aWMgaW50IGZpbmRfY2lmc19lbnRyeShjb25zdCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbiwKKwlzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqKnBwQ3VycmVudEVudHJ5LCBpbnQgKm51bV90b19yZXQpIAoreworCWludCByYyA9IDA7CisJaW50IHBvc19pbl9idWYgPSAwOworCWxvZmZfdCBmaXJzdF9lbnRyeV9pbl9idWZmZXI7CisJbG9mZl90IGluZGV4X3RvX2ZpbmQgPSBmaWxlLT5mX3BvczsKKwlzdHJ1Y3QgY2lmc0ZpbGVJbmZvICogY2lmc0ZpbGUgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJLyogY2hlY2sgaWYgaW5kZXggaW4gdGhlIGJ1ZmZlciAqLworCQorCWlmKChjaWZzRmlsZSA9PSBOVUxMKSB8fCAocHBDdXJyZW50RW50cnkgPT0gTlVMTCkgfHwgKG51bV90b19yZXQgPT0gTlVMTCkpCisJCXJldHVybiAtRU5PRU5UOworCQorCSpwcEN1cnJlbnRFbnRyeSA9IE5VTEw7CisJZmlyc3RfZW50cnlfaW5fYnVmZmVyID0gCisJCWNpZnNGaWxlLT5zcmNoX2luZi5pbmRleF9vZl9sYXN0X2VudHJ5IC0gCisJCQljaWZzRmlsZS0+c3JjaF9pbmYuZW50cmllc19pbl9idWZmZXI7CisvKglkdW1wX2NpZnNfZmlsZV9zdHJ1Y3QoZmlsZSwgIkluIGZjZSAiKTsqLworCWlmKGluZGV4X3RvX2ZpbmQgPCBmaXJzdF9lbnRyeV9pbl9idWZmZXIpIHsKKwkJLyogY2xvc2UgYW5kIHJlc3RhcnQgc2VhcmNoICovCisJCWNGWUkoMSwoInNlYXJjaCBiYWNraW5nIHVwIC0gY2xvc2UgYW5kIHJlc3RhcnQgc2VhcmNoIikpOworCQljaWZzRmlsZS0+aW52YWxpZEhhbmRsZSA9IFRSVUU7CisJCUNJRlNGaW5kQ2xvc2UoeGlkLCBwVGNvbiwgY2lmc0ZpbGUtPm5ldGZpZCk7CisJCWtmcmVlKGNpZnNGaWxlLT5zZWFyY2hfcmVzdW1lX25hbWUpOworCQljaWZzRmlsZS0+c2VhcmNoX3Jlc3VtZV9uYW1lID0gTlVMTDsKKwkJaWYoY2lmc0ZpbGUtPnNyY2hfaW5mLm50d3JrX2J1Zl9zdGFydCkgeworCQkJY0ZZSSgxLCgiZnJlZWluZyBTTUIgZmYgY2FjaGUgYnVmIG9uIHNlYXJjaCByZXdpbmQiKSk7CisJCQljaWZzX2J1Zl9yZWxlYXNlKGNpZnNGaWxlLT5zcmNoX2luZi5udHdya19idWZfc3RhcnQpOworCQl9CisJCXJjID0gaW5pdGlhdGVfY2lmc19zZWFyY2goeGlkLGZpbGUpOworCQlpZihyYykgeworCQkJY0ZZSSgxLCgiZXJyb3IgJWQgcmVpbml0aWF0aW5nIGEgc2VhcmNoIG9uIHJld2luZCIscmMpKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKworCXdoaWxlKChpbmRleF90b19maW5kID49IGNpZnNGaWxlLT5zcmNoX2luZi5pbmRleF9vZl9sYXN0X2VudHJ5KSAmJiAKKwkgICAgICAocmMgPT0gMCkgJiYgKGNpZnNGaWxlLT5zcmNoX2luZi5lbmRPZlNlYXJjaCA9PSBGQUxTRSkpeworCSAJY0ZZSSgxLCgiY2FsbGluZyBmaW5kbmV4dDIiKSk7CisJCXJjID0gQ0lGU0ZpbmROZXh0KHhpZCxwVGNvbixjaWZzRmlsZS0+bmV0ZmlkLCAmY2lmc0ZpbGUtPnNyY2hfaW5mKTsKKwkJaWYocmMpCisJCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisJaWYoaW5kZXhfdG9fZmluZCA8IGNpZnNGaWxlLT5zcmNoX2luZi5pbmRleF9vZl9sYXN0X2VudHJ5KSB7CisJCS8qIHdlIGZvdW5kIHRoZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgZW50cnkgKi8KKwkJLyogc2NhbiBhbmQgZmluZCBpdCAqLworCQlpbnQgaTsKKwkJY2hhciAqIGN1cnJlbnRfZW50cnk7CisJCWNoYXIgKiBlbmRfb2Zfc21iID0gY2lmc0ZpbGUtPnNyY2hfaW5mLm50d3JrX2J1Zl9zdGFydCArIAorCQkJc21iQ2FsY1NpemUoKHN0cnVjdCBzbWJfaGRyICopCisJCQkJY2lmc0ZpbGUtPnNyY2hfaW5mLm50d3JrX2J1Zl9zdGFydCk7CisvKglkdW1wX2NpZnNfZmlsZV9zdHJ1Y3QoZmlsZSwiZm91bmQgZW50cnkgaW4gZmNlICIpOyAqLworCQlmaXJzdF9lbnRyeV9pbl9idWZmZXIgPSBjaWZzRmlsZS0+c3JjaF9pbmYuaW5kZXhfb2ZfbGFzdF9lbnRyeQorCQkJCQktIGNpZnNGaWxlLT5zcmNoX2luZi5lbnRyaWVzX2luX2J1ZmZlcjsKKwkJcG9zX2luX2J1ZiA9IGluZGV4X3RvX2ZpbmQgLSBmaXJzdF9lbnRyeV9pbl9idWZmZXI7CisJCWNGWUkoMSwoImZvdW5kIGVudHJ5IC0gcG9zX2luX2J1ZiAlZCIscG9zX2luX2J1ZikpOyAKKwkJY3VycmVudF9lbnRyeSA9IGNpZnNGaWxlLT5zcmNoX2luZi5zcmNoX2VudHJpZXNfc3RhcnQ7CisJCWZvcihpPTA7KGk8KHBvc19pbl9idWYpKSAmJiAoY3VycmVudF9lbnRyeSAhPSBOVUxMKTtpKyspIHsKKwkJCS8qIGdvIGVudHJ5IHRvIG5leHQgZW50cnkgZmlndXJpbmcgb3V0IHdoaWNoIHdlIG5lZWQgdG8gc3RhcnQgd2l0aCAqLworCQkJLyogaWYoIC4gb3IgLi4pCisJCQkJc2tpcCAqLworCQkJcmMgPSBjaWZzX2VudHJ5X2lzX2RvdChjdXJyZW50X2VudHJ5LGNpZnNGaWxlKTsKKwkJCWlmKHJjID09IDEpIC8qIGlzIC4gb3IgLi4gc28gc2tpcCAqLyB7CisJCQkJY0ZZSSgxLCgiRW50cnkgaXMgLiIpKTsgLyogQkIgcmVtb3ZlbWUgQkIgKi8KKwkJCQkvKiBjb250aW51ZTsgKi8KKwkJCX0gZWxzZSBpZiAocmMgPT0gMiApIHsKKwkJCQljRllJKDEsKCJFbnRyeSBpcyAuLiIpKTsgLyogQkIgcmVtb3ZlbWUgQkIgKi8KKwkJCQkvKiBjb250aW51ZTsgKi8KKwkJCX0KKwkJCWN1cnJlbnRfZW50cnkgPSBueHRfZGlyX2VudHJ5KGN1cnJlbnRfZW50cnksZW5kX29mX3NtYik7CisJCX0KKwkJaWYoKGN1cnJlbnRfZW50cnkgPT0gTlVMTCkgJiYgKGkgPCBwb3NfaW5fYnVmKSkgeworCQkJLyogQkIgZml4bWUgLSBjaGVjayBpZiB3ZSBzaG91bGQgZmxhZyB0aGlzIGVycm9yICovCisJCQljRVJST1IoMSwoInJlYWNoZWQgZW5kIG9mIGJ1ZiBzZWFyY2hpbmcgZm9yIHBvcyBpbiBidWYiCisJCQkgICIgJWQgaW5kZXggdG8gZmluZCAlbGxkIHJjICVkIiwKKwkJCSAgcG9zX2luX2J1ZixpbmRleF90b19maW5kLHJjKSk7CisJCX0KKwkJcmMgPSAwOworCQkqcHBDdXJyZW50RW50cnkgPSBjdXJyZW50X2VudHJ5OworCX0gZWxzZSB7CisJCWNGWUkoMSwoImluZGV4IG5vdCBpbiBidWZmZXIgLSBjb3VsZCBub3QgZmluZG5leHQgaW50byBpdCIpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYocG9zX2luX2J1ZiA+PSBjaWZzRmlsZS0+c3JjaF9pbmYuZW50cmllc19pbl9idWZmZXIpIHsKKwkJY0ZZSSgxLCgiY2FuIG5vdCByZXR1cm4gZW50cmllcyB3aGVuIHBvc19pbl9idWYgYmV5b25kIGxhc3QgZW50cnkiKSk7CisJCSpudW1fdG9fcmV0ID0gMDsKKwl9IGVsc2UKKwkJKm51bV90b19yZXQgPSBjaWZzRmlsZS0+c3JjaF9pbmYuZW50cmllc19pbl9idWZmZXIgLSBwb3NfaW5fYnVmOworLyoJZHVtcF9jaWZzX2ZpbGVfc3RydWN0KGZpbGUsICJlbmQgZmNlICIpOyovCisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIGlub2RlIG51bSwgaW5vZGUgdHlwZSBhbmQgZmlsZW5hbWUgcmV0dXJuZWQgKi8KK3N0YXRpYyBpbnQgY2lmc19nZXRfbmFtZV9mcm9tX3NlYXJjaF9idWYoc3RydWN0IHFzdHIgKnBxc3QsCisJY2hhciAqY3VycmVudF9lbnRyeSwgX191MTYgbGV2ZWwsIHVuc2lnbmVkIGludCB1bmljb2RlLAorCXN0cnVjdCBjaWZzX3NiX2luZm8gKiBjaWZzX3NiLCBpbm9fdCAqcGludW0pCit7CisJaW50IHJjID0gMDsKKwl1bnNpZ25lZCBpbnQgbGVuID0gMDsKKwljaGFyICogZmlsZW5hbWU7CisJc3RydWN0IG5sc190YWJsZSAqIG5sdCA9IGNpZnNfc2ItPmxvY2FsX25sczsKKworCSpwaW51bSA9IDA7CisKKwlpZihsZXZlbCA9PSBTTUJfRklORF9GSUxFX1VOSVgpIHsKKwkJRklMRV9VTklYX0lORk8gKiBwRmluZERhdGEgPSAoRklMRV9VTklYX0lORk8gKiljdXJyZW50X2VudHJ5OworCisJCWZpbGVuYW1lID0gJnBGaW5kRGF0YS0+RmlsZU5hbWVbMF07CisJCWlmKHVuaWNvZGUpIHsKKwkJCWxlbiA9IGNpZnNfdW5pY29kZV9ieXRlbGVuKGZpbGVuYW1lKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEJCIHNob3VsZCB3ZSBtYWtlIHRoaXMgc3RybmxlbiBvZiBQQVRIX01BWD8gKi8KKwkJCWxlbiA9IHN0cm5sZW4oZmlsZW5hbWUsIFBBVEhfTUFYKTsKKwkJfQorCisJCS8qIEJCIGZpeG1lIC0gaGFzaCBsb3cgYW5kIGhpZ2ggMzIgYml0cyBpZiBub3QgNjQgYml0IGFyY2ggQkIgZml4bWUgKi8KKwkJaWYoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX1NFUlZFUl9JTlVNKQorCQkJKnBpbnVtID0gcEZpbmREYXRhLT5VbmlxdWVJZDsKKwl9IGVsc2UgaWYobGV2ZWwgPT0gU01CX0ZJTkRfRklMRV9ESVJFQ1RPUllfSU5GTykgeworCQlGSUxFX0RJUkVDVE9SWV9JTkZPICogcEZpbmREYXRhID0gCisJCQkoRklMRV9ESVJFQ1RPUllfSU5GTyAqKWN1cnJlbnRfZW50cnk7CisJCWZpbGVuYW1lID0gJnBGaW5kRGF0YS0+RmlsZU5hbWVbMF07CisJCWxlbiA9IGxlMzJfdG9fY3B1KHBGaW5kRGF0YS0+RmlsZU5hbWVMZW5ndGgpOworCX0gZWxzZSBpZihsZXZlbCA9PSBTTUJfRklORF9GSUxFX0ZVTExfRElSRUNUT1JZX0lORk8pIHsKKwkJRklMRV9GVUxMX0RJUkVDVE9SWV9JTkZPICogcEZpbmREYXRhID0gCisJCQkoRklMRV9GVUxMX0RJUkVDVE9SWV9JTkZPICopY3VycmVudF9lbnRyeTsKKwkJZmlsZW5hbWUgPSAmcEZpbmREYXRhLT5GaWxlTmFtZVswXTsKKwkJbGVuID0gbGUzMl90b19jcHUocEZpbmREYXRhLT5GaWxlTmFtZUxlbmd0aCk7CisJfSBlbHNlIGlmKGxldmVsID09IFNNQl9GSU5EX0ZJTEVfSURfRlVMTF9ESVJfSU5GTykgeworCQlTRUFSQ0hfSURfRlVMTF9ESVJfSU5GTyAqIHBGaW5kRGF0YSA9IAorCQkJKFNFQVJDSF9JRF9GVUxMX0RJUl9JTkZPICopY3VycmVudF9lbnRyeTsKKwkJZmlsZW5hbWUgPSAmcEZpbmREYXRhLT5GaWxlTmFtZVswXTsKKwkJbGVuID0gbGUzMl90b19jcHUocEZpbmREYXRhLT5GaWxlTmFtZUxlbmd0aCk7CisJCSpwaW51bSA9IHBGaW5kRGF0YS0+VW5pcXVlSWQ7CisJfSBlbHNlIGlmKGxldmVsID09IFNNQl9GSU5EX0ZJTEVfQk9USF9ESVJFQ1RPUllfSU5GTykgeworCQlGSUxFX0JPVEhfRElSRUNUT1JZX0lORk8gKiBwRmluZERhdGEgPSAKKwkJCShGSUxFX0JPVEhfRElSRUNUT1JZX0lORk8gKiljdXJyZW50X2VudHJ5OworCQlmaWxlbmFtZSA9ICZwRmluZERhdGEtPkZpbGVOYW1lWzBdOworCQlsZW4gPSBsZTMyX3RvX2NwdShwRmluZERhdGEtPkZpbGVOYW1lTGVuZ3RoKTsKKwl9IGVsc2UgeworCQljRllJKDEsKCJVbmtub3duIGZpbmRmaXJzdCBsZXZlbCAlZCIsbGV2ZWwpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmKHVuaWNvZGUpIHsKKwkJLyogQkIgZml4bWUgLSB0ZXN0IHdpdGggbG9uZyBuYW1lcyAqLworCQkvKiBOb3RlIGNvbnZlcnRlZCBmaWxlbmFtZSBjYW4gYmUgbG9uZ2VyIHRoYW4gaW4gdW5pY29kZSAqLworCQlwcXN0LT5sZW4gPSBjaWZzX3N0cmZyb21VQ1NfbGUoKGNoYXIgKilwcXN0LT5uYW1lLCh3Y2hhcl90ICopZmlsZW5hbWUsbGVuLzIsbmx0KTsKKwl9IGVsc2UgeworCQlwcXN0LT5uYW1lID0gZmlsZW5hbWU7CisJCXBxc3QtPmxlbiA9IGxlbjsKKwl9CisJcHFzdC0+aGFzaCA9IGZ1bGxfbmFtZV9oYXNoKHBxc3QtPm5hbWUscHFzdC0+bGVuKTsKKy8qCWNGWUkoMSwoImZpbGxkaXIgb24gJXMiLHBxc3QtPm5hbWUpKTsgICovCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGNpZnNfZmlsbGRpcihjaGFyICpwZmluZEVudHJ5LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwlmaWxsZGlyX3QgZmlsbGRpciwgdm9pZCAqZGlyZW50cnksIGNoYXIgKnNjcmF0Y2hfYnVmKQoreworCWludCByYyA9IDA7CisJc3RydWN0IHFzdHIgcXN0cmluZzsKKwlzdHJ1Y3QgY2lmc0ZpbGVJbmZvICogcENpZnNGOworCXVuc2lnbmVkIG9ial90eXBlOworCWlub190ICBpbnVtOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKiBjaWZzX3NiOworCXN0cnVjdCBpbm9kZSAqdG1wX2lub2RlOworCXN0cnVjdCBkZW50cnkgKnRtcF9kZW50cnk7CisKKwkvKiBnZXQgZmlsZW5hbWUgYW5kIGxlbiBpbnRvIHFzdHJpbmcgKi8KKwkvKiBnZXQgZGVudHJ5ICovCisJLyogZGVjaWRlIHdoZXRoZXIgdG8gY3JlYXRlIGFuZCBwb3B1bGF0ZSBpb25kZSAqLworCWlmKChkaXJlbnRyeSA9PSBOVUxMKSB8fCAoZmlsZSA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwQ2lmc0YgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJCisJaWYoKHNjcmF0Y2hfYnVmID09IE5VTEwpIHx8IChwZmluZEVudHJ5ID09IE5VTEwpIHx8IChwQ2lmc0YgPT0gTlVMTCkpCisJCXJldHVybiAtRU5PRU5UOworCisJaWYoZmlsZS0+Zl9kZW50cnkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwljaWZzX3NiID0gQ0lGU19TQihmaWxlLT5mX2RlbnRyeS0+ZF9zYik7CisKKwlxc3RyaW5nLm5hbWUgPSBzY3JhdGNoX2J1ZjsKKwlyYyA9IGNpZnNfZ2V0X25hbWVfZnJvbV9zZWFyY2hfYnVmKCZxc3RyaW5nLHBmaW5kRW50cnksCisJCQlwQ2lmc0YtPnNyY2hfaW5mLmluZm9fbGV2ZWwsCisJCQlwQ2lmc0YtPnNyY2hfaW5mLnVuaWNvZGUsY2lmc19zYiwKKwkJCSZpbnVtIC8qIHJldHVybmVkICovKTsKKworCWlmKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IGNvbnN0cnVjdF9kZW50cnkoJnFzdHJpbmcsZmlsZSwmdG1wX2lub2RlLCAmdG1wX2RlbnRyeSk7CisJaWYoKHRtcF9pbm9kZSA9PSBOVUxMKSB8fCAodG1wX2RlbnRyeSA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZihyYykgeworCQkvKiBpbm9kZSBjcmVhdGVkLCB3ZSBuZWVkIHRvIGhhc2ggaXQgd2l0aCByaWdodCBpbm9kZSBudW1iZXIgKi8KKwkJaWYoaW51bSAhPSAwKSB7CisJCQkvKiBCQiBmaXhtZSAtIGhhc2ggdGhlIDIgMzIgcXVhbnRpdGllcyBiaXRzIHRvZ2V0aGVyIGlmIG5lY2Vzc2FyeSBCQiAqLworCQkJdG1wX2lub2RlLT5pX2lubyA9IGludW07CisJCX0KKwkJaW5zZXJ0X2lub2RlX2hhc2godG1wX2lub2RlKTsKKwl9CisKKwlpZihwQ2lmc0YtPnNyY2hfaW5mLmluZm9fbGV2ZWwgPT0gU01CX0ZJTkRfRklMRV9VTklYKSB7CisJCXVuaXhfZmlsbF9pbl9pbm9kZSh0bXBfaW5vZGUsKEZJTEVfVU5JWF9JTkZPICopcGZpbmRFbnRyeSwmb2JqX3R5cGUpOworCX0gZWxzZSB7CisJCWZpbGxfaW5faW5vZGUodG1wX2lub2RlLChGSUxFX0RJUkVDVE9SWV9JTkZPICopcGZpbmRFbnRyeSwmb2JqX3R5cGUpOworCX0KKwkKKwlyYyA9IGZpbGxkaXIoZGlyZW50cnkscXN0cmluZy5uYW1lLHFzdHJpbmcubGVuLGZpbGUtPmZfcG9zLHRtcF9pbm9kZS0+aV9pbm8sb2JqX3R5cGUpOworCWlmKHJjKSB7CisJCWNGWUkoMSwoImZpbGxkaXIgcmMgPSAlZCIscmMpKTsKKwl9CisKKwlkcHV0KHRtcF9kZW50cnkpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBjaWZzX3NhdmVfcmVzdW1lX2tleShjb25zdCBjaGFyICpjdXJyZW50X2VudHJ5LAorCXN0cnVjdCBjaWZzRmlsZUluZm8gKmNpZnNGaWxlKQoreworCWludCByYyA9IDA7CisJdW5zaWduZWQgaW50IGxlbiA9IDA7CisJX191MTYgbGV2ZWw7CisJY2hhciAqIGZpbGVuYW1lOworCisJaWYoKGNpZnNGaWxlID09IE5VTEwpIHx8IChjdXJyZW50X2VudHJ5ID09IE5VTEwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxldmVsID0gY2lmc0ZpbGUtPnNyY2hfaW5mLmluZm9fbGV2ZWw7CisKKwlpZihsZXZlbCA9PSBTTUJfRklORF9GSUxFX1VOSVgpIHsKKwkJRklMRV9VTklYX0lORk8gKiBwRmluZERhdGEgPSAoRklMRV9VTklYX0lORk8gKiljdXJyZW50X2VudHJ5OworCisJCWZpbGVuYW1lID0gJnBGaW5kRGF0YS0+RmlsZU5hbWVbMF07CisJCWlmKGNpZnNGaWxlLT5zcmNoX2luZi51bmljb2RlKSB7CisJCQlsZW4gPSBjaWZzX3VuaWNvZGVfYnl0ZWxlbihmaWxlbmFtZSk7CisJCX0gZWxzZSB7CisJCQkvKiBCQiBzaG91bGQgd2UgbWFrZSB0aGlzIHN0cm5sZW4gb2YgUEFUSF9NQVg/ICovCisJCQlsZW4gPSBzdHJubGVuKGZpbGVuYW1lLCBQQVRIX01BWCk7CisJCX0KKwkJY2lmc0ZpbGUtPnNyY2hfaW5mLnJlc3VtZV9rZXkgPSBwRmluZERhdGEtPlJlc3VtZUtleTsKKwl9IGVsc2UgaWYobGV2ZWwgPT0gU01CX0ZJTkRfRklMRV9ESVJFQ1RPUllfSU5GTykgeworCQlGSUxFX0RJUkVDVE9SWV9JTkZPICogcEZpbmREYXRhID0gCisJCQkoRklMRV9ESVJFQ1RPUllfSU5GTyAqKWN1cnJlbnRfZW50cnk7CisJCWZpbGVuYW1lID0gJnBGaW5kRGF0YS0+RmlsZU5hbWVbMF07CisJCWxlbiA9IGxlMzJfdG9fY3B1KHBGaW5kRGF0YS0+RmlsZU5hbWVMZW5ndGgpOworCQljaWZzRmlsZS0+c3JjaF9pbmYucmVzdW1lX2tleSA9IHBGaW5kRGF0YS0+RmlsZUluZGV4OworCX0gZWxzZSBpZihsZXZlbCA9PSBTTUJfRklORF9GSUxFX0ZVTExfRElSRUNUT1JZX0lORk8pIHsKKwkJRklMRV9GVUxMX0RJUkVDVE9SWV9JTkZPICogcEZpbmREYXRhID0gCisJCQkoRklMRV9GVUxMX0RJUkVDVE9SWV9JTkZPICopY3VycmVudF9lbnRyeTsKKwkJZmlsZW5hbWUgPSAmcEZpbmREYXRhLT5GaWxlTmFtZVswXTsKKwkJbGVuID0gbGUzMl90b19jcHUocEZpbmREYXRhLT5GaWxlTmFtZUxlbmd0aCk7CisJCWNpZnNGaWxlLT5zcmNoX2luZi5yZXN1bWVfa2V5ID0gcEZpbmREYXRhLT5GaWxlSW5kZXg7CisJfSBlbHNlIGlmKGxldmVsID09IFNNQl9GSU5EX0ZJTEVfSURfRlVMTF9ESVJfSU5GTykgeworCQlTRUFSQ0hfSURfRlVMTF9ESVJfSU5GTyAqIHBGaW5kRGF0YSA9IAorCQkJKFNFQVJDSF9JRF9GVUxMX0RJUl9JTkZPICopY3VycmVudF9lbnRyeTsKKwkJZmlsZW5hbWUgPSAmcEZpbmREYXRhLT5GaWxlTmFtZVswXTsKKwkJbGVuID0gbGUzMl90b19jcHUocEZpbmREYXRhLT5GaWxlTmFtZUxlbmd0aCk7CisJCWNpZnNGaWxlLT5zcmNoX2luZi5yZXN1bWVfa2V5ID0gcEZpbmREYXRhLT5GaWxlSW5kZXg7CisJfSBlbHNlIGlmKGxldmVsID09IFNNQl9GSU5EX0ZJTEVfQk9USF9ESVJFQ1RPUllfSU5GTykgeworCQlGSUxFX0JPVEhfRElSRUNUT1JZX0lORk8gKiBwRmluZERhdGEgPSAKKwkJCShGSUxFX0JPVEhfRElSRUNUT1JZX0lORk8gKiljdXJyZW50X2VudHJ5OworCQlmaWxlbmFtZSA9ICZwRmluZERhdGEtPkZpbGVOYW1lWzBdOworCQlsZW4gPSBsZTMyX3RvX2NwdShwRmluZERhdGEtPkZpbGVOYW1lTGVuZ3RoKTsKKwkJY2lmc0ZpbGUtPnNyY2hfaW5mLnJlc3VtZV9rZXkgPSBwRmluZERhdGEtPkZpbGVJbmRleDsKKwl9IGVsc2UgeworCQljRllJKDEsKCJVbmtub3duIGZpbmRmaXJzdCBsZXZlbCAlZCIsbGV2ZWwpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWNpZnNGaWxlLT5zcmNoX2luZi5yZXN1bWVfbmFtZV9sZW4gPSBsZW47CisJY2lmc0ZpbGUtPnNyY2hfaW5mLnByZXN1bWVfbmFtZSA9IGZpbGVuYW1lOworCXJldHVybiByYzsKK30KKworaW50IGNpZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZGlyZW50cnksIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCWludCByYyA9IDA7CisJaW50IHhpZCxpOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisJc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb247CisJc3RydWN0IGNpZnNGaWxlSW5mbyAqY2lmc0ZpbGUgPSBOVUxMOworCWNoYXIgKiBjdXJyZW50X2VudHJ5OworCWludCBudW1fdG9fZmlsbCA9IDA7CisJY2hhciAqIHRtcF9idWYgPSBOVUxMOworCWNoYXIgKiBlbmRfb2Zfc21iOworCisJeGlkID0gR2V0WGlkKCk7CisKKwlpZihmaWxlLT5mX2RlbnRyeSA9PSBOVUxMKSB7CisJCUZyZWVYaWQoeGlkKTsKKwkJcmV0dXJuIC1FSU87CisJfQorLyoJZHVtcF9jaWZzX2ZpbGVfc3RydWN0KGZpbGUsICJCZWdpbiByZGlyICIpOyAqLworCisJY2lmc19zYiA9IENJRlNfU0IoZmlsZS0+Zl9kZW50cnktPmRfc2IpOworCXBUY29uID0gY2lmc19zYi0+dGNvbjsKKwlpZihwVGNvbiA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworLyoJY0ZZSSgxLCgicmVhZGRpcjIgcG9zOiAlbGxkIixmaWxlLT5mX3BvcykpOyAqLworCisJc3dpdGNoICgoaW50KSBmaWxlLT5mX3BvcykgeworCWNhc2UgMDoKKwkJLyppZiAoZmlsbGRpcihkaXJlbnRyeSwgIi4iLCAxLCBmaWxlLT5mX3BvcywKKwkJICAgICBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9pbm8sIERUX0RJUikgPCAwKSB7CisJCQljRVJST1IoMSwgKCJGaWxsZGlyIGZvciBjdXJyZW50IGRpciBmYWlsZWQgIikpOworCQkJcmMgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKwkJZmlsZS0+Zl9wb3MrKzsgKi8KKwljYXNlIDE6CisJCS8qIGlmIChmaWxsZGlyKGRpcmVudHJ5LCAiLi4iLCAyLCBmaWxlLT5mX3BvcywKKwkJICAgICBmaWxlLT5mX2RlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGUtPmlfaW5vLCBEVF9ESVIpIDwgMCkgeworCQkJY0VSUk9SKDEsICgiRmlsbGRpciBmb3IgcGFyZW50IGRpciBmYWlsZWQgIikpOworCQkJcmMgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKwkJZmlsZS0+Zl9wb3MrKzsgKi8KKwljYXNlIDI6CisJCS8qIDEpIElmIHNlYXJjaCBpcyBhY3RpdmUsIAorCQkJaXMgaW4gY3VycmVudCBzZWFyY2ggYnVmZmVyPyAKKwkJCWlmIGl0IGJlZm9yZSB0aGVuIHJlc3RhcnQgc2VhcmNoCisJCQlpZiBhZnRlciB0aGVuIGtlZXAgc2VhcmNoaW5nIHRpbGwgZmluZCBpdCAqLworCisJCWlmKGZpbGUtPnByaXZhdGVfZGF0YSA9PSBOVUxMKSB7CisJCQlyYyA9IGluaXRpYXRlX2NpZnNfc2VhcmNoKHhpZCxmaWxlKTsKKwkJCWNGWUkoMSwoImluaXRpYXRlIGNpZnMgc2VhcmNoIHJjICVkIixyYykpOworCQkJaWYocmMpIHsKKwkJCQlGcmVlWGlkKHhpZCk7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCQl9CisJZGVmYXVsdDoKKwkJaWYoZmlsZS0+cHJpdmF0ZV9kYXRhID09IE5VTEwpIHsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCUZyZWVYaWQoeGlkKTsKKwkJCXJldHVybiByYzsKKwkJfQorCQljaWZzRmlsZSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwkJaWYgKGNpZnNGaWxlLT5zcmNoX2luZi5lbmRPZlNlYXJjaCkgeworCQkJaWYoY2lmc0ZpbGUtPnNyY2hfaW5mLmVtcHR5RGlyKSB7CisJCQkJY0ZZSSgxLCAoIkVuZCBvZiBzZWFyY2gsIGVtcHR5IGRpciIpKTsKKwkJCQlyYyA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gLyogZWxzZSB7CisJCQljaWZzRmlsZS0+aW52YWxpZEhhbmRsZSA9IFRSVUU7CisJCQlDSUZTRmluZENsb3NlKHhpZCwgcFRjb24sIGNpZnNGaWxlLT5uZXRmaWQpOworCQl9IAorCQlrZnJlZShjaWZzRmlsZS0+c2VhcmNoX3Jlc3VtZV9uYW1lKTsKKwkJY2lmc0ZpbGUtPnNlYXJjaF9yZXN1bWVfbmFtZSA9IE5VTEw7ICovCisKKwkJLyogQkIgYWNjb3VudCBmb3IgLiBhbmQgLi4gaW4gZl9wb3MgYXMgc3BlY2lhbCBjYXNlICovCisJCS8qIGR1bXBfY2lmc19maWxlX3N0cnVjdChmaWxlLCAicmRpciBhZnRlciBkZWZhdWx0ICIpOyovCisKKwkJcmMgPSBmaW5kX2NpZnNfZW50cnkoeGlkLHBUY29uLCBmaWxlLAorCQkJCSZjdXJyZW50X2VudHJ5LCZudW1fdG9fZmlsbCk7CisJCWlmKHJjKSB7CisJCQljRllJKDEsKCJmY2UgZXJyb3IgJWQiLHJjKSk7IAorCQkJZ290byByZGRpcjJfZXhpdDsKKwkJfSBlbHNlIGlmIChjdXJyZW50X2VudHJ5ICE9IE5VTEwpIHsKKwkJCWNGWUkoMSwoImVudHJ5ICVsbGQgZm91bmQiLGZpbGUtPmZfcG9zKSk7CisJCX0gZWxzZSB7CisJCQljRllJKDEsKCJjb3VsZCBub3QgZmluZCBlbnRyeSIpKTsKKwkJCWdvdG8gcmRkaXIyX2V4aXQ7CisJCX0KKwkJY0ZZSSgxLCgibG9vcCB0aHJvdWdoICVkIHRpbWVzIGZpbGxpbmcgZGlyIGZvciBuZXQgYnVmICVwIiwKKwkJCW51bV90b19maWxsLGNpZnNGaWxlLT5zcmNoX2luZi5udHdya19idWZfc3RhcnQpKTsgCisJCWVuZF9vZl9zbWIgPSBjaWZzRmlsZS0+c3JjaF9pbmYubnR3cmtfYnVmX3N0YXJ0ICsKKwkJCXNtYkNhbGNTaXplKChzdHJ1Y3Qgc21iX2hkciAqKQorCQkJCSAgICBjaWZzRmlsZS0+c3JjaF9pbmYubnR3cmtfYnVmX3N0YXJ0KTsKKwkJdG1wX2J1ZiA9IGttYWxsb2MoTkFNRV9NQVgrMSxHRlBfS0VSTkVMKTsKKwkJZm9yKGk9MDsoaTxudW1fdG9fZmlsbCkgJiYgKHJjID09IDApO2krKykgeworCQkJaWYoY3VycmVudF9lbnRyeSA9PSBOVUxMKSB7CisJCQkJLyogZXZhbHVhdGUgd2hldGhlciB0aGlzIGNhc2UgaXMgYW4gZXJyb3IgKi8KKwkJCQljRVJST1IoMSwoInBhc3QgZW5kIG9mIFNNQiBudW0gdG8gZmlsbCAlZCBpICVkIiwKKwkJCQkJICBudW1fdG9fZmlsbCwgaSkpOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBCQiBGSVhNRSAtIG5lZWQgdG8gZW5hYmxlIHRoZSBiZWxvdyBjb2RlIEJCICovCisKKwkJLyogaWYoKCEoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX1NFUlZFUl9JTlVNKSkgfHwKKwkJCSAgIChjaWZzRmlsZS0+c3JjaF9pbmYuaW5mb19sZXZlbCAhPSAKKwkJCQkgICBzb21ldGhpbmcgdGhhdCBzdXBwb3J0cyBzZXJ2ZXIgaW5vZGVzKSkgeworCQkJCWNyZWF0ZSBkZW50cnkKKwkJCQljcmVhdGUgaW5vZGUKKwkJCQlmaWxsIGluIGlub2RlIG5ld19pbm9kZSAoZ2V0dGluZyBsb2NhbCBpX2lubykKKwkJCX0KKwkJCWFsc28gY3JlYXRlIGxvY2FsIGlub2RlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIChzbyB3ZSAKKwkJCWhhdmUgYSBjYWNoZSBvZiBpbm9kZSBtZXRhZGF0YSkgdW5sZXNzIHRoaXMgbmV3IG1vdW50IAorCQkJcGFybSBzYXlzIG90aGVyd2lzZSAqLworCisJCQlyYyA9IGNpZnNfZmlsbGRpcihjdXJyZW50X2VudHJ5LCBmaWxlLCAKKwkJCQkJZmlsbGRpciwgZGlyZW50cnksdG1wX2J1Zik7CisJCQlmaWxlLT5mX3BvcysrOworCQkJaWYoZmlsZS0+Zl9wb3MgPT0gY2lmc0ZpbGUtPnNyY2hfaW5mLmluZGV4X29mX2xhc3RfZW50cnkpIHsKKwkJCQljRllJKDEsKCJsYXN0IGVudHJ5IGluIGJ1ZiBhdCBwb3MgJWxsZCAlcyIsCisJCQkJCWZpbGUtPmZfcG9zLHRtcF9idWYpKTsgLyogQkIgcmVtb3ZlbWUgQkIgKi8KKwkJCQljaWZzX3NhdmVfcmVzdW1lX2tleShjdXJyZW50X2VudHJ5LGNpZnNGaWxlKTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSAKKwkJCQljdXJyZW50X2VudHJ5ID0gbnh0X2Rpcl9lbnRyeShjdXJyZW50X2VudHJ5LGVuZF9vZl9zbWIpOworCQl9CisJCWtmcmVlKHRtcF9idWYpOworCQlicmVhazsKKwl9IC8qIGVuZCBzd2l0Y2ggKi8KKworcmRkaXIyX2V4aXQ6CisJLyogZHVtcF9jaWZzX2ZpbGVfc3RydWN0KGZpbGUsICJlbmQgcmRpciAiKTsgICovCisJRnJlZVhpZCh4aWQpOworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvcmZjMTAwMnBkdS5oIGIvZnMvY2lmcy9yZmMxMDAycGR1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA2YzBlZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2NpZnMvcmZjMTAwMnBkdS5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiAgIGZzL2NpZnMvcmZjMTAwMnBkdS5oCisgKgorICogICBQcm90b2NvbCBEYXRhIFVuaXQgZGVmaW5pdGlvbnMgZm9yIFJGQyAxMDAxLzEwMDIgc3VwcG9ydAorICoKKyAqICAgQ29weXJpZ2h0IChjKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzICBDb3JwLiwgMjAwNAorICogICBBdXRob3Iocyk6IFN0ZXZlIEZyZW5jaCAoc2ZyZW5jaEB1cy5pYm0uY29tKQorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBIAorICovCisKKyNwcmFnbWEgcGFjaygxKQorCisvKiBOQjogdW5saWtlIHNtYi9jaWZzIHBhY2tldHMsIHRoZSBSRkMxMDAyIHN0cnVjdHVyZXMgYXJlIGJpZyBlbmRpYW4gKi8KKworCS8qIFJGQyAxMDAyIHNlc3Npb24gcGFja2V0IHR5cGVzICovCisjZGVmaW5lIFJGQzEwMDJfU0VTU0lPTl9NRVNBU0FHRSAweDAwCisjZGVmaW5lIFJGQzEwMDJfU0VTU0lPTl9SRVFVRVNUICAweDgxCisjZGVmaW5lIFJGQzEwMDJfUE9TSVRJVkVfU0VTU0lPTl9SRVNQT05TRSAweDgyCisjZGVmaW5lIFJGQzEwMDJfTkVHQVRJVkVfU0VTU0lPTl9SRVNQT05TRSAweDgzCisjZGVmaW5lIFJGQzEwMDJfUkVUQVJHRVRfU0VTU0lPTl9SRVNQT05TRSAweDgzCisjZGVmaW5lIFJGQzEwMDJfU0VTU0lPTl9LRUVQX0FMSVZFIDB4ODUKKworCS8qIFJGQyAxMDAyIGZsYWdzIChvbmx5IG9uZSBkZWZpbmVkICovCisjZGVmaW5lIFJGQzEwMDJfTEVOR1RIX0VYVEVORCAweDgwIC8qIGhpZ2ggb3JkZXIgYml0IG9mIGxlbmd0aCAoaWUgKzY0SykgKi8KKworc3RydWN0IHJmYzEwMDJfc2Vzc2lvbl9wYWNrZXQgeworCV9fdTgJdHlwZTsKKwlfX3U4CWZsYWdzOworCV9fdTE2CWxlbmd0aDsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX3U4IGNhbGxlZF9sZW47CisJCQlfX3U4IGNhbGxlZF9uYW1lWzMyXTsKKwkJCV9fdTggc2NvcGUxOyAvKiBudWxsICovCisJCQlfX3U4IGNhbGxpbmdfbGVuOworCQkJX191OCBjYWxsaW5nX25hbWVbMzJdOworCQkJX191OCBzY29wZTI7IC8qIG51bGwgKi8KKwkJfSBzZXNzaW9uX3JlcTsKKwkJc3RydWN0IHsKKwkJCV9fdTMyIHJldGFyZ2V0X2lwX2FkZHI7CisJCQlfX3UxNiBwb3J0OworCQl9IHJldGFyZ2V0X3Jlc3A7CisJCV9fdTggbmVnX3Nlc19yZXNwX2Vycm9yX2NvZGU7CisJCS8qIFBPU0lUSVZFX1NFU1NJT05fUkVTUE9OU0UgcGFja2V0IGRvZXMgbm90IGluY2x1ZGUgdHJhaWxlci4KKwkJU0VTU0lPTl9LRUVQX0FMSVZFIHBhY2tldCBhbHNvIGRvZXMgbm90IGluY2x1ZGUgYSB0cmFpbGVyLgorCQlUcmFpbGVyIGZvciB0aGUgU0VTU0lPTl9NRVNTQUdFIHBhY2tldCBpcyBTTUIvQ0lGUyBoZWFkZXIgKi8KKwl9IHRyYWlsZXI7Cit9OworCisvKiBOZWdhdGl2ZSBTZXNzaW9uIFJlc3BvbnNlIGVycm9yIGNvZGVzICovCisjZGVmaW5lIFJGQzEwMDJfTk9UX0xJU1RFTklOR19DQUxMRUQgIDB4ODAgLyogbm90IGxpc3RlbmluZyBvbiBjYWxsZWQgbmFtZSAqLworI2RlZmluZSBSRkMxMDAyX05PVF9MSVNURU5JTkdfQ0FMTElORyAweDgxIC8qIG5vdCBsaXN0ZW5pbmcgb24gY2FsbGluZyBuYW1lICovCisjZGVmaW5lIFJGQzEwMDJfTk9UX1BSRVNFTlQgICAgICAgICAgIDB4ODIgLyogY2FsbGVkIG5hbWUgbm90IHByZXNlbnQgKi8KKyNkZWZpbmUgUkZDMTAwMl9JTlNVRkZJQ0lFTlRfUkVTT1VSQ0UgMHg4MworI2RlZmluZSBSRkMxMDAyX1VOU1BFQ0lGSUVEX0VSUk9SICAgICAweDhGCisKKy8qIFJGQyAxMDAyIERhdGFncmFtIHNlcnZpY2UgcGFja2V0cyBhcmUgbm90IGRlZmluZWQgaGVyZSBhcyB0aGV5CithcmUgbm90IG5lZWRlZCBmb3IgdGhlIG5ldHdvcmsgZmlsZXN5c3RlbSBjbGllbnQgdW5sZXNzIHdlIHBsYW4gb24KK2ltcGxlbWVudGluZyBicm9hZGNhc3QgcmVzb2x1dGlvbiBvZiB0aGUgc2VydmVyIGlwIGFkZHJlc3MgKGZyb20KK3NlcnZlciBuZXRiaW9zIG5hbWUpLiBDdXJyZW50bHkgc2VydmVyIG5hbWVzIGFyZSByZXNvbHZlZCBvbmx5IHZpYSBETlMKKyh0Y3AgbmFtZSkgb3IgaXAgYWRkcmVzcyBvciBhbiAvZXRjL2hvc3RzIGVxdWl2YWxlbnQgbWFwcGluZyB0byBpcCBhZGRyZXNzLiovCisKKyNkZWZpbmUgREVGQVVMVF9DSUZTX0NBTExFRF9OQU1FICAiKlNNQlNFUlZFUiAgICAgICIKKworI3ByYWdtYSBwYWNrKCkJCS8qIHJlc3VtZSBkZWZhdWx0IHN0cnVjdHVyZSBwYWNraW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCmRpZmYgLS1naXQgYS9mcy9jaWZzL3NtYmRlcy5jIGIvZnMvY2lmcy9zbWJkZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmFhMDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9zbWJkZXMuYwpAQCAtMCwwICsxLDQxMiBAQAorLyogCisgICBVbml4IFNNQi9OZXRiaW9zIGltcGxlbWVudGF0aW9uLgorICAgVmVyc2lvbiAxLjkuCisKKyAgIGEgcGFydGlhbCBpbXBsZW1lbnRhdGlvbiBvZiBERVMgZGVzaWduZWQgZm9yIHVzZSBpbiB0aGUgCisgICBTTUIgYXV0aGVudGljYXRpb24gcHJvdG9jb2wKKworICAgQ29weXJpZ2h0IChDKSBBbmRyZXcgVHJpZGdlbGwgMTk5OAorICAgTW9kaWZpZWQgYnkgU3RldmUgRnJlbmNoIChzZnJlbmNoQHVzLmlibS5jb20pIDIwMDIsMjAwNAorICAgCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICAgCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworLyogTk9URVM6IAorCisgICBUaGlzIGNvZGUgbWFrZXMgbm8gYXR0ZW1wdCB0byBiZSBmYXN0ISBJbiBmYWN0LCBpdCBpcyBhIHZlcnkKKyAgIHNsb3cgaW1wbGVtZW50YXRpb24gCisKKyAgIFRoaXMgY29kZSBpcyBOT1QgYSBjb21wbGV0ZSBERVMgaW1wbGVtZW50YXRpb24uIEl0IGltcGxlbWVudHMgb25seQorICAgdGhlIG1pbmltdW0gbmVjZXNzYXJ5IGZvciBTTUIgYXV0aGVudGljYXRpb24sIGFzIHVzZWQgYnkgYWxsIFNNQgorICAgcHJvZHVjdHMgKGluY2x1ZGluZyBldmVyeSBjb3B5IG9mIE1pY3Jvc29mdCBXaW5kb3dzOTUgZXZlciBzb2xkKQorCisgICBJbiBwYXJ0aWN1bGFyLCBpdCBjYW4gb25seSBkbyBhIHVuY2hhaW5lZCBmb3J3YXJkIERFUyBwYXNzLiBUaGlzCisgICBtZWFucyBpdCBpcyBub3QgcG9zc2libGUgdG8gdXNlIHRoaXMgY29kZSBmb3IgZW5jcnlwdGlvbi9kZWNyeXB0aW9uCisgICBvZiBkYXRhLCBpbnN0ZWFkIGl0IGlzIG9ubHkgdXNlZnVsIGFzIGEgImhhc2giIGFsZ29yaXRobS4KKworICAgVGhlcmUgaXMgbm8gZW50cnkgcG9pbnQgaW50byB0aGlzIGNvZGUgdGhhdCBhbGxvd3Mgbm9ybWFsIERFUyBvcGVyYXRpb24uCisKKyAgIEkgYmVsaWV2ZSB0aGlzIG1lYW5zIHRoYXQgdGhpcyBjb2RlIGRvZXMgbm90IGNvbWUgdW5kZXIgSVRBUgorICAgcmVndWxhdGlvbnMgYnV0IHRoaXMgaXMgTk9UIGEgbGVnYWwgb3Bpbmlvbi4gSWYgeW91IGFyZSBjb25jZXJuZWQKKyAgIGFib3V0IHRoZSBhcHBsaWNhYmlsaXR5IG9mIElUQVIgcmVndWxhdGlvbnMgdG8gdGhpcyBjb2RlIHRoZW4geW91CisgICBzaG91bGQgY29uZmlybSBpdCBmb3IgeW91cnNlbGYgKGFuZCBtYXliZSBsZXQgbWUga25vdyBpZiB5b3UgY29tZQorICAgdXAgd2l0aCBhIGRpZmZlcmVudCBhbnN3ZXIgdG8gdGhlIG9uZSBhYm92ZSkKKyovCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgImNpZnNlbmNyeXB0LmgiCisjZGVmaW5lIHVjaGFyIHVuc2lnbmVkIGNoYXIKKworc3RhdGljIHVjaGFyIHBlcm0xWzU2XSA9IHsgNTcsIDQ5LCA0MSwgMzMsIDI1LCAxNywgOSwKKwkxLCA1OCwgNTAsIDQyLCAzNCwgMjYsIDE4LAorCTEwLCAyLCA1OSwgNTEsIDQzLCAzNSwgMjcsCisJMTksIDExLCAzLCA2MCwgNTIsIDQ0LCAzNiwKKwk2MywgNTUsIDQ3LCAzOSwgMzEsIDIzLCAxNSwKKwk3LCA2MiwgNTQsIDQ2LCAzOCwgMzAsIDIyLAorCTE0LCA2LCA2MSwgNTMsIDQ1LCAzNywgMjksCisJMjEsIDEzLCA1LCAyOCwgMjAsIDEyLCA0Cit9OworCitzdGF0aWMgdWNoYXIgcGVybTJbNDhdID0geyAxNCwgMTcsIDExLCAyNCwgMSwgNSwKKwkzLCAyOCwgMTUsIDYsIDIxLCAxMCwKKwkyMywgMTksIDEyLCA0LCAyNiwgOCwKKwkxNiwgNywgMjcsIDIwLCAxMywgMiwKKwk0MSwgNTIsIDMxLCAzNywgNDcsIDU1LAorCTMwLCA0MCwgNTEsIDQ1LCAzMywgNDgsCisJNDQsIDQ5LCAzOSwgNTYsIDM0LCA1MywKKwk0NiwgNDIsIDUwLCAzNiwgMjksIDMyCit9OworCitzdGF0aWMgdWNoYXIgcGVybTNbNjRdID0geyA1OCwgNTAsIDQyLCAzNCwgMjYsIDE4LCAxMCwgMiwKKwk2MCwgNTIsIDQ0LCAzNiwgMjgsIDIwLCAxMiwgNCwKKwk2MiwgNTQsIDQ2LCAzOCwgMzAsIDIyLCAxNCwgNiwKKwk2NCwgNTYsIDQ4LCA0MCwgMzIsIDI0LCAxNiwgOCwKKwk1NywgNDksIDQxLCAzMywgMjUsIDE3LCA5LCAxLAorCTU5LCA1MSwgNDMsIDM1LCAyNywgMTksIDExLCAzLAorCTYxLCA1MywgNDUsIDM3LCAyOSwgMjEsIDEzLCA1LAorCTYzLCA1NSwgNDcsIDM5LCAzMSwgMjMsIDE1LCA3Cit9OworCitzdGF0aWMgdWNoYXIgcGVybTRbNDhdID0geyAzMiwgMSwgMiwgMywgNCwgNSwKKwk0LCA1LCA2LCA3LCA4LCA5LAorCTgsIDksIDEwLCAxMSwgMTIsIDEzLAorCTEyLCAxMywgMTQsIDE1LCAxNiwgMTcsCisJMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwKKwkyMCwgMjEsIDIyLCAyMywgMjQsIDI1LAorCTI0LCAyNSwgMjYsIDI3LCAyOCwgMjksCisJMjgsIDI5LCAzMCwgMzEsIDMyLCAxCit9OworCitzdGF0aWMgdWNoYXIgcGVybTVbMzJdID0geyAxNiwgNywgMjAsIDIxLAorCTI5LCAxMiwgMjgsIDE3LAorCTEsIDE1LCAyMywgMjYsCisJNSwgMTgsIDMxLCAxMCwKKwkyLCA4LCAyNCwgMTQsCisJMzIsIDI3LCAzLCA5LAorCTE5LCAxMywgMzAsIDYsCisJMjIsIDExLCA0LCAyNQorfTsKKworc3RhdGljIHVjaGFyIHBlcm02WzY0XSA9IHsgNDAsIDgsIDQ4LCAxNiwgNTYsIDI0LCA2NCwgMzIsCisJMzksIDcsIDQ3LCAxNSwgNTUsIDIzLCA2MywgMzEsCisJMzgsIDYsIDQ2LCAxNCwgNTQsIDIyLCA2MiwgMzAsCisJMzcsIDUsIDQ1LCAxMywgNTMsIDIxLCA2MSwgMjksCisJMzYsIDQsIDQ0LCAxMiwgNTIsIDIwLCA2MCwgMjgsCisJMzUsIDMsIDQzLCAxMSwgNTEsIDE5LCA1OSwgMjcsCisJMzQsIDIsIDQyLCAxMCwgNTAsIDE4LCA1OCwgMjYsCisJMzMsIDEsIDQxLCA5LCA0OSwgMTcsIDU3LCAyNQorfTsKKworc3RhdGljIHVjaGFyIHNjWzE2XSA9IHsgMSwgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMSB9OworCitzdGF0aWMgdWNoYXIgc2JveFs4XVs0XVsxNl0gPSB7CisJe3sxNCwgNCwgMTMsIDEsIDIsIDE1LCAxMSwgOCwgMywgMTAsIDYsIDEyLCA1LCA5LCAwLCA3fSwKKwkgezAsIDE1LCA3LCA0LCAxNCwgMiwgMTMsIDEsIDEwLCA2LCAxMiwgMTEsIDksIDUsIDMsIDh9LAorCSB7NCwgMSwgMTQsIDgsIDEzLCA2LCAyLCAxMSwgMTUsIDEyLCA5LCA3LCAzLCAxMCwgNSwgMH0sCisJIHsxNSwgMTIsIDgsIDIsIDQsIDksIDEsIDcsIDUsIDExLCAzLCAxNCwgMTAsIDAsIDYsIDEzfX0sCisKKwl7ezE1LCAxLCA4LCAxNCwgNiwgMTEsIDMsIDQsIDksIDcsIDIsIDEzLCAxMiwgMCwgNSwgMTB9LAorCSB7MywgMTMsIDQsIDcsIDE1LCAyLCA4LCAxNCwgMTIsIDAsIDEsIDEwLCA2LCA5LCAxMSwgNX0sCisJIHswLCAxNCwgNywgMTEsIDEwLCA0LCAxMywgMSwgNSwgOCwgMTIsIDYsIDksIDMsIDIsIDE1fSwKKwkgezEzLCA4LCAxMCwgMSwgMywgMTUsIDQsIDIsIDExLCA2LCA3LCAxMiwgMCwgNSwgMTQsIDl9fSwKKworCXt7MTAsIDAsIDksIDE0LCA2LCAzLCAxNSwgNSwgMSwgMTMsIDEyLCA3LCAxMSwgNCwgMiwgOH0sCisJIHsxMywgNywgMCwgOSwgMywgNCwgNiwgMTAsIDIsIDgsIDUsIDE0LCAxMiwgMTEsIDE1LCAxfSwKKwkgezEzLCA2LCA0LCA5LCA4LCAxNSwgMywgMCwgMTEsIDEsIDIsIDEyLCA1LCAxMCwgMTQsIDd9LAorCSB7MSwgMTAsIDEzLCAwLCA2LCA5LCA4LCA3LCA0LCAxNSwgMTQsIDMsIDExLCA1LCAyLCAxMn19LAorCisJe3s3LCAxMywgMTQsIDMsIDAsIDYsIDksIDEwLCAxLCAyLCA4LCA1LCAxMSwgMTIsIDQsIDE1fSwKKwkgezEzLCA4LCAxMSwgNSwgNiwgMTUsIDAsIDMsIDQsIDcsIDIsIDEyLCAxLCAxMCwgMTQsIDl9LAorCSB7MTAsIDYsIDksIDAsIDEyLCAxMSwgNywgMTMsIDE1LCAxLCAzLCAxNCwgNSwgMiwgOCwgNH0sCisJIHszLCAxNSwgMCwgNiwgMTAsIDEsIDEzLCA4LCA5LCA0LCA1LCAxMSwgMTIsIDcsIDIsIDE0fX0sCisKKwl7ezIsIDEyLCA0LCAxLCA3LCAxMCwgMTEsIDYsIDgsIDUsIDMsIDE1LCAxMywgMCwgMTQsIDl9LAorCSB7MTQsIDExLCAyLCAxMiwgNCwgNywgMTMsIDEsIDUsIDAsIDE1LCAxMCwgMywgOSwgOCwgNn0sCisJIHs0LCAyLCAxLCAxMSwgMTAsIDEzLCA3LCA4LCAxNSwgOSwgMTIsIDUsIDYsIDMsIDAsIDE0fSwKKwkgezExLCA4LCAxMiwgNywgMSwgMTQsIDIsIDEzLCA2LCAxNSwgMCwgOSwgMTAsIDQsIDUsIDN9fSwKKworCXt7MTIsIDEsIDEwLCAxNSwgOSwgMiwgNiwgOCwgMCwgMTMsIDMsIDQsIDE0LCA3LCA1LCAxMX0sCisJIHsxMCwgMTUsIDQsIDIsIDcsIDEyLCA5LCA1LCA2LCAxLCAxMywgMTQsIDAsIDExLCAzLCA4fSwKKwkgezksIDE0LCAxNSwgNSwgMiwgOCwgMTIsIDMsIDcsIDAsIDQsIDEwLCAxLCAxMywgMTEsIDZ9LAorCSB7NCwgMywgMiwgMTIsIDksIDUsIDE1LCAxMCwgMTEsIDE0LCAxLCA3LCA2LCAwLCA4LCAxM319LAorCisJe3s0LCAxMSwgMiwgMTQsIDE1LCAwLCA4LCAxMywgMywgMTIsIDksIDcsIDUsIDEwLCA2LCAxfSwKKwkgezEzLCAwLCAxMSwgNywgNCwgOSwgMSwgMTAsIDE0LCAzLCA1LCAxMiwgMiwgMTUsIDgsIDZ9LAorCSB7MSwgNCwgMTEsIDEzLCAxMiwgMywgNywgMTQsIDEwLCAxNSwgNiwgOCwgMCwgNSwgOSwgMn0sCisJIHs2LCAxMSwgMTMsIDgsIDEsIDQsIDEwLCA3LCA5LCA1LCAwLCAxNSwgMTQsIDIsIDMsIDEyfX0sCisKKwl7ezEzLCAyLCA4LCA0LCA2LCAxNSwgMTEsIDEsIDEwLCA5LCAzLCAxNCwgNSwgMCwgMTIsIDd9LAorCSB7MSwgMTUsIDEzLCA4LCAxMCwgMywgNywgNCwgMTIsIDUsIDYsIDExLCAwLCAxNCwgOSwgMn0sCisJIHs3LCAxMSwgNCwgMSwgOSwgMTIsIDE0LCAyLCAwLCA2LCAxMCwgMTMsIDE1LCAzLCA1LCA4fSwKKwkgezIsIDEsIDE0LCA3LCA0LCAxMCwgOCwgMTMsIDE1LCAxMiwgOSwgMCwgMywgNSwgNiwgMTF9fQorfTsKKworc3RhdGljIHZvaWQKK3Blcm11dGUoY2hhciAqb3V0LCBjaGFyICppbiwgdWNoYXIgKiBwLCBpbnQgbikKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorCQlvdXRbaV0gPSBpbltwW2ldIC0gMV07Cit9CisKK3N0YXRpYyB2b2lkCitsc2hpZnQoY2hhciAqZCwgaW50IGNvdW50LCBpbnQgbikKK3sKKwljaGFyIG91dFs2NF07CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJb3V0W2ldID0gZFsoaSArIGNvdW50KSAlIG5dOworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCWRbaV0gPSBvdXRbaV07Cit9CisKK3N0YXRpYyB2b2lkCitjb25jYXQoY2hhciAqb3V0LCBjaGFyICppbjEsIGNoYXIgKmluMiwgaW50IGwxLCBpbnQgbDIpCit7CisJd2hpbGUgKGwxLS0pCisJCSpvdXQrKyA9ICppbjErKzsKKwl3aGlsZSAobDItLSkKKwkJKm91dCsrID0gKmluMisrOworfQorCitzdGF0aWMgdm9pZAoreG9yKGNoYXIgKm91dCwgY2hhciAqaW4xLCBjaGFyICppbjIsIGludCBuKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCW91dFtpXSA9IGluMVtpXSBeIGluMltpXTsKK30KKworc3RhdGljIHZvaWQKK2RvaGFzaChjaGFyICpvdXQsIGNoYXIgKmluLCBjaGFyICprZXksIGludCBmb3J3KQoreworCWludCBpLCBqLCBrOworCWNoYXIgKnBrMTsKKwljaGFyIGNbMjhdOworCWNoYXIgZFsyOF07CisJY2hhciAqY2Q7CisJY2hhciBraVsxNl1bNDhdOworCWNoYXIgKnBkMTsKKwljaGFyIGxbMzJdLCByWzMyXTsKKwljaGFyICpybDsKKworCS8qIEhhdmUgdG8gcmVkdWNlIHN0YWNrIHVzYWdlICovCisJcGsxID0ga21hbGxvYyg1Nis1Nis2NCs2NCxHRlBfS0VSTkVMKTsKKwlpZihwazEgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJY2QgPSBwazEgKyA1NjsKKwlwZDE9IGNkICArIDU2OworCXJsID0gcGQxICsgNjQ7CisKKwlwZXJtdXRlKHBrMSwga2V5LCBwZXJtMSwgNTYpOworCisJZm9yIChpID0gMDsgaSA8IDI4OyBpKyspCisJCWNbaV0gPSBwazFbaV07CisJZm9yIChpID0gMDsgaSA8IDI4OyBpKyspCisJCWRbaV0gPSBwazFbaSArIDI4XTsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCWxzaGlmdChjLCBzY1tpXSwgMjgpOworCQlsc2hpZnQoZCwgc2NbaV0sIDI4KTsKKworCQljb25jYXQoY2QsIGMsIGQsIDI4LCAyOCk7CisJCXBlcm11dGUoa2lbaV0sIGNkLCBwZXJtMiwgNDgpOworCX0KKworCXBlcm11dGUocGQxLCBpbiwgcGVybTMsIDY0KTsKKworCWZvciAoaiA9IDA7IGogPCAzMjsgaisrKSB7CisJCWxbal0gPSBwZDFbal07CisJCXJbal0gPSBwZDFbaiArIDMyXTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQljaGFyICplcjsgIC8qIGVyWzQ4XSAgKi8KKwkJY2hhciAqZXJrOyAvKiBlcmtbNDhdICovCisJCWNoYXIgYls4XVs2XTsKKwkJY2hhciAqY2I7ICAvKiBjYlszMl0gICovCisJCWNoYXIgKnBjYjsgLyogcGNiWzMyXSAqLworCQljaGFyICpyMjsgIC8qIHIyWzMyXSAgKi8KKworCQllciA9IGttYWxsb2MoNDgrNDgrMzIrMzIrMzIsIEdGUF9LRVJORUwpOworCQlpZihlciA9PSBOVUxMKSB7CisJCQlrZnJlZShwazEpOworCQkJcmV0dXJuOworCQl9CisJCWVyayA9IGVyKzQ4OworCQljYiAgPSBlcmsrNDg7CisJCXBjYiA9IGNiKzMyOworCQlyMiAgPSBwY2IrMzI7CisKKwkJcGVybXV0ZShlciwgciwgcGVybTQsIDQ4KTsKKworCQl4b3IoZXJrLCBlciwga2lbZm9ydyA/IGkgOiAxNSAtIGldLCA0OCk7CisKKwkJZm9yIChqID0gMDsgaiA8IDg7IGorKykKKwkJCWZvciAoayA9IDA7IGsgPCA2OyBrKyspCisJCQkJYltqXVtrXSA9IGVya1tqICogNiArIGtdOworCisJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKwkJCWludCBtLCBuOworCQkJbSA9IChiW2pdWzBdIDw8IDEpIHwgYltqXVs1XTsKKworCQkJbiA9IChiW2pdWzFdIDw8IDMpIHwgKGJbal1bMl0gPDwgMikgfCAoYltqXVszXSA8PAorCQkJCQkJCSAgICAgICAxKSB8IGJbal1bNF07CisKKwkJCWZvciAoayA9IDA7IGsgPCA0OyBrKyspCisJCQkJYltqXVtrXSA9CisJCQkJICAgIChzYm94W2pdW21dW25dICYgKDEgPDwgKDMgLSBrKSkpID8gMSA6IDA7CisJCX0KKworCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKQorCQkJZm9yIChrID0gMDsgayA8IDQ7IGsrKykKKwkJCQljYltqICogNCArIGtdID0gYltqXVtrXTsKKwkJcGVybXV0ZShwY2IsIGNiLCBwZXJtNSwgMzIpOworCisJCXhvcihyMiwgbCwgcGNiLCAzMik7CisKKwkJZm9yIChqID0gMDsgaiA8IDMyOyBqKyspCisJCQlsW2pdID0gcltqXTsKKworCQlmb3IgKGogPSAwOyBqIDwgMzI7IGorKykKKwkJCXJbal0gPSByMltqXTsKKworCQlrZnJlZShlcik7CisJfQorCisJY29uY2F0KHJsLCByLCBsLCAzMiwgMzIpOworCisJcGVybXV0ZShvdXQsIHJsLCBwZXJtNiwgNjQpOworCWtmcmVlKHBrMSk7Cit9CisKK3N0YXRpYyB2b2lkCitzdHJfdG9fa2V5KHVuc2lnbmVkIGNoYXIgKnN0ciwgdW5zaWduZWQgY2hhciAqa2V5KQoreworCWludCBpOworCisJa2V5WzBdID0gc3RyWzBdID4+IDE7CisJa2V5WzFdID0gKChzdHJbMF0gJiAweDAxKSA8PCA2KSB8IChzdHJbMV0gPj4gMik7CisJa2V5WzJdID0gKChzdHJbMV0gJiAweDAzKSA8PCA1KSB8IChzdHJbMl0gPj4gMyk7CisJa2V5WzNdID0gKChzdHJbMl0gJiAweDA3KSA8PCA0KSB8IChzdHJbM10gPj4gNCk7CisJa2V5WzRdID0gKChzdHJbM10gJiAweDBGKSA8PCAzKSB8IChzdHJbNF0gPj4gNSk7CisJa2V5WzVdID0gKChzdHJbNF0gJiAweDFGKSA8PCAyKSB8IChzdHJbNV0gPj4gNik7CisJa2V5WzZdID0gKChzdHJbNV0gJiAweDNGKSA8PCAxKSB8IChzdHJbNl0gPj4gNyk7CisJa2V5WzddID0gc3RyWzZdICYgMHg3RjsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWtleVtpXSA9IChrZXlbaV0gPDwgMSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorc21iaGFzaCh1bnNpZ25lZCBjaGFyICpvdXQsIHVuc2lnbmVkIGNoYXIgKmluLCB1bnNpZ25lZCBjaGFyICprZXksIGludCBmb3J3KQoreworCWludCBpOworCWNoYXIgKm91dGI7IC8qIG91dGJbNjRdICovCisJY2hhciAqaW5iOyAgLyogaW5iWzY0XSAgKi8KKwljaGFyICprZXliOyAvKiBrZXliWzY0XSAqLworCXVuc2lnbmVkIGNoYXIga2V5Mls4XTsKKworCW91dGIgPSBrbWFsbG9jKDY0ICogMyxHRlBfS0VSTkVMKTsKKwlpZihvdXRiID09IE5VTEwpCisJCXJldHVybjsKKworCWluYiAgPSBvdXRiICsgNjQ7CisJa2V5YiA9IGluYiArICA2NDsKKworCXN0cl90b19rZXkoa2V5LCBrZXkyKTsKKworCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisJCWluYltpXSA9IChpbltpIC8gOF0gJiAoMSA8PCAoNyAtIChpICUgOCkpKSkgPyAxIDogMDsKKwkJa2V5YltpXSA9IChrZXkyW2kgLyA4XSAmICgxIDw8ICg3IC0gKGkgJSA4KSkpKSA/IDEgOiAwOworCQlvdXRiW2ldID0gMDsKKwl9CisKKwlkb2hhc2gob3V0YiwgaW5iLCBrZXliLCBmb3J3KTsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJb3V0W2ldID0gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworCQlpZiAob3V0YltpXSkKKwkJCW91dFtpIC8gOF0gfD0gKDEgPDwgKDcgLSAoaSAlIDgpKSk7CisJfQorCWtmcmVlKG91dGIpOworfQorCit2b2lkCitFX1AxNih1bnNpZ25lZCBjaGFyICpwMTQsIHVuc2lnbmVkIGNoYXIgKnAxNikKK3sKKwl1bnNpZ25lZCBjaGFyIHNwOFs4XSA9CisJICAgIHsgMHg0YiwgMHg0NywgMHg1MywgMHgyMSwgMHg0MCwgMHgyMywgMHgyNCwgMHgyNSB9OworCXNtYmhhc2gocDE2LCBzcDgsIHAxNCwgMSk7CisJc21iaGFzaChwMTYgKyA4LCBzcDgsIHAxNCArIDcsIDEpOworfQorCit2b2lkCitFX1AyNCh1bnNpZ25lZCBjaGFyICpwMjEsIHVuc2lnbmVkIGNoYXIgKmM4LCB1bnNpZ25lZCBjaGFyICpwMjQpCit7CisJc21iaGFzaChwMjQsIGM4LCBwMjEsIDEpOworCXNtYmhhc2gocDI0ICsgOCwgYzgsIHAyMSArIDcsIDEpOworCXNtYmhhc2gocDI0ICsgMTYsIGM4LCBwMjEgKyAxNCwgMSk7Cit9CisKK3ZvaWQKK0RfUDE2KHVuc2lnbmVkIGNoYXIgKnAxNCwgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCkKK3sKKwlzbWJoYXNoKG91dCwgaW4sIHAxNCwgMCk7CisJc21iaGFzaChvdXQgKyA4LCBpbiArIDgsIHAxNCArIDcsIDApOworfQorCit2b2lkCitFX29sZF9wd19oYXNoKHVuc2lnbmVkIGNoYXIgKnAxNCwgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKm91dCkKK3sKKwlzbWJoYXNoKG91dCwgaW4sIHAxNCwgMSk7CisJc21iaGFzaChvdXQgKyA4LCBpbiArIDgsIHAxNCArIDcsIDEpOworfQorI2lmIDAKKy8qIHRoZXNlIHJvdXRpbmVzIGFyZSBjdXJyZW50bHkgdW5uZWVkZWQsIGJ1dCBtYXkgYmUKKwluZWVkZWQgbGF0ZXIgKi8KK3ZvaWQKK2NyZWRfaGFzaDEodW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqa2V5KQoreworCXVuc2lnbmVkIGNoYXIgYnVmWzhdOworCisJc21iaGFzaChidWYsIGluLCBrZXksIDEpOworCXNtYmhhc2gob3V0LCBidWYsIGtleSArIDksIDEpOworfQorCit2b2lkCitjcmVkX2hhc2gyKHVuc2lnbmVkIGNoYXIgKm91dCwgdW5zaWduZWQgY2hhciAqaW4sIHVuc2lnbmVkIGNoYXIgKmtleSkKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1Zls4XTsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBrZXkyWzhdOworCisJc21iaGFzaChidWYsIGluLCBrZXksIDEpOworCWtleTJbMF0gPSBrZXlbN107CisJc21iaGFzaChvdXQsIGJ1Ziwga2V5MiwgMSk7Cit9CisKK3ZvaWQKK2NyZWRfaGFzaDModW5zaWduZWQgY2hhciAqb3V0LCB1bnNpZ25lZCBjaGFyICppbiwgdW5zaWduZWQgY2hhciAqa2V5LCBpbnQgZm9ydykKK3sKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBrZXkyWzhdOworCisJc21iaGFzaChvdXQsIGluLCBrZXksIGZvcncpOworCWtleTJbMF0gPSBrZXlbN107CisJc21iaGFzaChvdXQgKyA4LCBpbiArIDgsIGtleTIsIGZvcncpOworfQorI2VuZGlmIC8qIHVubmVlZGVkIHJvdXRpbmVzICovCmRpZmYgLS1naXQgYS9mcy9jaWZzL3NtYmVuY3J5cHQuYyBiL2ZzL2NpZnMvc21iZW5jcnlwdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMDNiY2QKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jaWZzL3NtYmVuY3J5cHQuYwpAQCAtMCwwICsxLDI4NSBAQAorLyogCisgICBVbml4IFNNQi9OZXRiaW9zIGltcGxlbWVudGF0aW9uLgorICAgVmVyc2lvbiAxLjkuCisgICBTTUIgcGFyYW1ldGVycyBhbmQgc2V0dXAKKyAgIENvcHlyaWdodCAoQykgQW5kcmV3IFRyaWRnZWxsIDE5OTItMjAwMAorICAgQ29weXJpZ2h0IChDKSBMdWtlIEtlbm5ldGggQ2Fzc29uIExlaWdodG9uIDE5OTYtMjAwMAorICAgTW9kaWZpZWQgYnkgSmVyZW15IEFsbGlzb24gMTk5NS4KKyAgIENvcHlyaWdodCAoQykgQW5kcmV3IEJhcnRsZXR0IDxhYmFydGxldEBzYW1iYS5vcmc+IDIwMDItMjAwMworICAgTW9kaWZpZWQgYnkgU3RldmUgRnJlbmNoIChzZnJlbmNoQHVzLmlibS5jb20pIDIwMDItMjAwMworICAgCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICAgCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSAiY2lmc191bmljb2RlLmgiCisjaW5jbHVkZSAiY2lmc3BkdS5oIgorI2luY2x1ZGUgIm1kNS5oIgorI2luY2x1ZGUgImNpZnNfZGVidWcuaCIKKyNpbmNsdWRlICJjaWZzZW5jcnlwdC5oIgorCisjaWZuZGVmIEZBTFNFCisjZGVmaW5lIEZBTFNFIDAKKyNlbmRpZgorI2lmbmRlZiBUUlVFCisjZGVmaW5lIFRSVUUgMQorI2VuZGlmCisKKy8qIGZvbGxvd2luZyBjYW1lIGZyb20gdGhlIG90aGVyIGJ5dGVvcmRlci5oIHRvIGF2b2lkIGluY2x1ZGUgY29uZmxpY3RzICovCisjZGVmaW5lIENWQUwoYnVmLHBvcykgKCgodW5zaWduZWQgY2hhciAqKShidWYpKVtwb3NdKQorI2RlZmluZSBTU1ZBTFgoYnVmLHBvcyx2YWwpIChDVkFMKGJ1Zixwb3MpPSh2YWwpJjB4RkYsQ1ZBTChidWYscG9zKzEpPSh2YWwpPj44KQorI2RlZmluZSBTU1ZBTChidWYscG9zLHZhbCkgU1NWQUxYKChidWYpLChwb3MpLCgoX191MTYpKHZhbCkpKQorCisvKlRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgY29tZSBmcm9tICBsaWJzbWIvc21iZW5jcnlwdC5jICAqLworCit2b2lkIFNNQmVuY3J5cHQodW5zaWduZWQgY2hhciAqcGFzc3dkLCB1bnNpZ25lZCBjaGFyICpjOCwgdW5zaWduZWQgY2hhciAqcDI0KTsKK3ZvaWQgRV9tZDRoYXNoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBhc3N3ZCwgdW5zaWduZWQgY2hhciAqcDE2KTsKK3ZvaWQgbnRfbG1fb3dmX2dlbihjaGFyICpwd2QsIHVuc2lnbmVkIGNoYXIgbnRfcDE2WzE2XSwgdW5zaWduZWQgY2hhciBwMTZbMTZdKTsKK3N0YXRpYyB2b2lkIFNNQk9XRmVuY3J5cHQodW5zaWduZWQgY2hhciBwYXNzd2RbMTZdLCB1bnNpZ25lZCBjaGFyICpjOCwKKwkJICAgdW5zaWduZWQgY2hhciBwMjRbMjRdKTsKK3ZvaWQgTlRMTVNTUE9XRmVuY3J5cHQodW5zaWduZWQgY2hhciBwYXNzd2RbOF0sCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICpudGxtY2hhbHJlc3AsIHVuc2lnbmVkIGNoYXIgcDI0WzI0XSk7Cit2b2lkIFNNQk5UZW5jcnlwdCh1bnNpZ25lZCBjaGFyICpwYXNzd2QsIHVuc2lnbmVkIGNoYXIgKmM4LCB1bnNpZ25lZCBjaGFyICpwMjQpOworCisvKgorICAgVGhpcyBpbXBsZW1lbnRzIHRoZSBYL09wZW4gU01CIHBhc3N3b3JkIGVuY3J5cHRpb24KKyAgIEl0IHRha2VzIGEgcGFzc3dvcmQsIGEgOCBieXRlICJjcnlwdCBrZXkiIGFuZCBwdXRzIDI0IGJ5dGVzIG9mIAorICAgZW5jcnlwdGVkIHBhc3N3b3JkIGludG8gcDI0ICovCisvKiBOb3RlIHRoYXQgcGFzc3dvcmQgbXVzdCBiZSB1cHBlcmNhc2VkIGFuZCBudWxsIHRlcm1pbmF0ZWQgKi8KK3ZvaWQKK1NNQmVuY3J5cHQodW5zaWduZWQgY2hhciAqcGFzc3dkLCB1bnNpZ25lZCBjaGFyICpjOCwgdW5zaWduZWQgY2hhciAqcDI0KQoreworCXVuc2lnbmVkIGNoYXIgcDE0WzE1XSwgcDIxWzIxXTsKKworCW1lbXNldChwMjEsICdcMCcsIDIxKTsKKwltZW1zZXQocDE0LCAnXDAnLCAxNCk7CisJc3RybmNweSgoY2hhciAqKSBwMTQsIChjaGFyICopIHBhc3N3ZCwgMTQpOworCisvKglzdHJ1cHBlcigoY2hhciAqKXAxNCk7ICovLyogQkIgYXQgbGVhc3QgdXBwZXJjYXNlIHRoZSBlYXN5IHJhbmdlICovCisJRV9QMTYocDE0LCBwMjEpOworCisJU01CT1dGZW5jcnlwdChwMjEsIGM4LCBwMjQpOworCQorCW1lbXNldChwMTQsMCwxNSk7CisJbWVtc2V0KHAyMSwwLDIxKTsKK30KKworLyogUm91dGluZXMgZm9yIFdpbmRvd3MgTlQgTUQ0IEhhc2ggZnVuY3Rpb25zLiAqLworc3RhdGljIGludAorX215X3djc2xlbihfX3UxNiAqIHN0cikKK3sKKwlpbnQgbGVuID0gMDsKKwl3aGlsZSAoKnN0cisrICE9IDApCisJCWxlbisrOworCXJldHVybiBsZW47Cit9CisKKy8qCisgKiBDb252ZXJ0IGEgc3RyaW5nIGludG8gYW4gTlQgVU5JQ09ERSBzdHJpbmcuCisgKiBOb3RlIHRoYXQgcmVnYXJkbGVzcyBvZiBwcm9jZXNzb3IgdHlwZSAKKyAqIHRoaXMgbXVzdCBiZSBpbiBpbnRlbCAobGl0dGxlLWVuZGlhbikKKyAqIGZvcm1hdC4KKyAqLworCitzdGF0aWMgaW50CitfbXlfbWJzdG93Y3MoX191MTYgKiBkc3QsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IGxlbikKK3sJCQkJLyogbm90IGEgdmVyeSBnb29kIGNvbnZlcnNpb24gcm91dGluZSAtIGNoYW5nZS9maXggKi8KKwlpbnQgaTsKKwlfX3UxNiB2YWw7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJdmFsID0gKnNyYzsKKwkJU1NWQUwoZHN0LCAwLCB2YWwpOworCQlkc3QrKzsKKwkJc3JjKys7CisJCWlmICh2YWwgPT0gMCkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gaTsKK30KKworLyogCisgKiBDcmVhdGVzIHRoZSBNRDQgSGFzaCBvZiB0aGUgdXNlcnMgcGFzc3dvcmQgaW4gTlQgVU5JQ09ERS4KKyAqLworCit2b2lkCitFX21kNGhhc2goY29uc3QgdW5zaWduZWQgY2hhciAqcGFzc3dkLCB1bnNpZ25lZCBjaGFyICpwMTYpCit7CisJaW50IGxlbjsKKwlfX3UxNiB3cHdkWzEyOV07CisKKwkvKiBQYXNzd29yZCBjYW5ub3QgYmUgbG9uZ2VyIHRoYW4gMTI4IGNoYXJhY3RlcnMgKi8KKwlpZihwYXNzd2QpIHsKKwkJbGVuID0gc3RybGVuKChjaGFyICopIHBhc3N3ZCk7CisJCWlmIChsZW4gPiAxMjgpIHsKKwkJCWxlbiA9IDEyODsKKwkJfQorCQkvKiBQYXNzd29yZCBtdXN0IGJlIGNvbnZlcnRlZCB0byBOVCB1bmljb2RlICovCisJCV9teV9tYnN0b3djcyh3cHdkLCBwYXNzd2QsIGxlbik7CisJfSBlbHNlCisJCWxlbiA9IDA7CisKKwl3cHdkW2xlbl0gPSAwOwkvKiBFbnN1cmUgc3RyaW5nIGlzIG51bGwgdGVybWluYXRlZCAqLworCS8qIENhbGN1bGF0ZSBsZW5ndGggaW4gYnl0ZXMgKi8KKwlsZW4gPSBfbXlfd2NzbGVuKHdwd2QpICogc2l6ZW9mIChfX3UxNik7CisKKwltZGZvdXIocDE2LCAodW5zaWduZWQgY2hhciAqKSB3cHdkLCBsZW4pOworCW1lbXNldCh3cHdkLDAsMTI5ICogMik7Cit9CisKKy8qIERvZXMgYm90aCB0aGUgTlQgYW5kIExNIG93ZnMgb2YgYSB1c2VyJ3MgcGFzc3dvcmQgKi8KK3ZvaWQKK250X2xtX293Zl9nZW4oY2hhciAqcHdkLCB1bnNpZ25lZCBjaGFyIG50X3AxNlsxNl0sIHVuc2lnbmVkIGNoYXIgcDE2WzE2XSkKK3sKKwljaGFyIHBhc3N3ZFs1MTRdOworCisJbWVtc2V0KHBhc3N3ZCwgJ1wwJywgNTE0KTsKKwlpZiAoc3RybGVuKHB3ZCkgPCA1MTMpCisJCXN0cmNweShwYXNzd2QsIHB3ZCk7CisJZWxzZQorCQltZW1jcHkocGFzc3dkLCBwd2QsIDUxMik7CisJLyogQ2FsY3VsYXRlIHRoZSBNRDQgaGFzaCAoTlQgY29tcGF0aWJsZSkgb2YgdGhlIHBhc3N3b3JkICovCisJbWVtc2V0KG50X3AxNiwgJ1wwJywgMTYpOworCUVfbWQ0aGFzaChwYXNzd2QsIG50X3AxNik7CisKKwkvKiBNYW5nbGUgdGhlIHBhc3N3b3JkcyBpbnRvIExhbm1hbiBmb3JtYXQgKi8KKwlwYXNzd2RbMTRdID0gJ1wwJzsKKy8qCXN0cnVwcGVyKHBhc3N3ZCk7ICovCisKKwkvKiBDYWxjdWxhdGUgdGhlIFNNQiAobGFubWFuKSBoYXNoIGZ1bmN0aW9ucyBvZiB0aGUgcGFzc3dvcmQgKi8KKworCW1lbXNldChwMTYsICdcMCcsIDE2KTsKKwlFX1AxNigodW5zaWduZWQgY2hhciAqKSBwYXNzd2QsICh1bnNpZ25lZCBjaGFyICopIHAxNik7CisKKwkvKiBjbGVhciBvdXQgbG9jYWwgY29weSBvZiB1c2VyJ3MgcGFzc3dvcmQgKGp1c3QgYmVpbmcgcGFyYW5vaWQpLiAqLworCW1lbXNldChwYXNzd2QsICdcMCcsIHNpemVvZiAocGFzc3dkKSk7Cit9CisKKy8qIERvZXMgdGhlIE5UTE12MiBvd2ZzIG9mIGEgdXNlcidzIHBhc3N3b3JkICovCisjaWYgMCAgLyogZnVuY3Rpb24gbm90IG5lZWRlZCB5ZXQgLSBidXQgd2lsbCBiZSBzb29uICovCitzdGF0aWMgdm9pZAorbnR2Ml9vd2ZfZ2VuKGNvbnN0IHVuc2lnbmVkIGNoYXIgb3dmWzE2XSwgY29uc3QgY2hhciAqdXNlcl9uLAorCQljb25zdCBjaGFyICpkb21haW5fbiwgdW5zaWduZWQgY2hhciBrcl9idWZbMTZdLAorCQljb25zdCBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfY29kZXBhZ2UpCit7CisJd2NoYXJfdCAqIHVzZXJfdTsKKwl3Y2hhcl90ICogZG9tX3U7CisJaW50IHVzZXJfbCwgZG9tYWluX2w7CisJc3RydWN0IEhNQUNNRDVDb250ZXh0IGN0eDsKKworCS8qIG1pZ2h0IGFzIHdlbGwgZG8gb25lIGFsbG9jIHRvIGhvbGQgYm90aCAodXNlcl91IGFuZCBkb21fdSkgKi8KKwl1c2VyX3UgPSBrbWFsbG9jKDIwNDggKiBzaXplb2Yod2NoYXJfdCksR0ZQX0tFUk5FTCk7IAorCWlmKHVzZXJfdSA9PSBOVUxMKQorCQlyZXR1cm47CisJZG9tX3UgPSB1c2VyX3UgKyAxMDI0OworICAgIAorCS8qIHB1c2hfdWNzMihOVUxMLCB1c2VyX3UsIHVzZXJfbiwgKHVzZXJfbCsxKSoyLCBTVFJfVU5JQ09ERXxTVFJfTk9BTElHTnxTVFJfVEVSTUlOQVRFfFNUUl9VUFBFUik7CisJICAgcHVzaF91Y3MyKE5VTEwsIGRvbV91LCBkb21haW5fbiwgKGRvbWFpbl9sKzEpKjIsIFNUUl9VTklDT0RFfFNUUl9OT0FMSUdOfFNUUl9URVJNSU5BVEV8U1RSX1VQUEVSKTsgKi8KKworCS8qIEJCIHVzZXIgYW5kIGRvbWFpbiBtYXkgbmVlZCB0byBiZSB1cHBlcmNhc2VkICovCisJdXNlcl9sID0gY2lmc19zdHJ0b1VDUyh1c2VyX3UsIHVzZXJfbiwgNTExLCBubHNfY29kZXBhZ2UpOworCWRvbWFpbl9sID0gY2lmc19zdHJ0b1VDUyhkb21fdSwgZG9tYWluX24sIDUxMSwgbmxzX2NvZGVwYWdlKTsKKworCXVzZXJfbCsrOwkJLyogdHJhaWxpbmcgbnVsbCAqLworCWRvbWFpbl9sKys7CisKKwlobWFjX21kNV9pbml0X2xpbUtfdG9fNjQob3dmLCAxNiwgJmN0eCk7CisJaG1hY19tZDVfdXBkYXRlKChjb25zdCB1bnNpZ25lZCBjaGFyICopIHVzZXJfdSwgdXNlcl9sICogMiwgJmN0eCk7CisJaG1hY19tZDVfdXBkYXRlKChjb25zdCB1bnNpZ25lZCBjaGFyICopIGRvbV91LCBkb21haW5fbCAqIDIsICZjdHgpOworCWhtYWNfbWQ1X2ZpbmFsKGtyX2J1ZiwgJmN0eCk7CisKKwlrZnJlZSh1c2VyX3UpOworfQorI2VuZGlmIAorCisvKiBEb2VzIHRoZSBkZXMgZW5jcnlwdGlvbiBmcm9tIHRoZSBOVCBvciBMTSBNRDQgaGFzaC4gKi8KK3N0YXRpYyB2b2lkCitTTUJPV0ZlbmNyeXB0KHVuc2lnbmVkIGNoYXIgcGFzc3dkWzE2XSwgdW5zaWduZWQgY2hhciAqYzgsCisJICAgICAgdW5zaWduZWQgY2hhciBwMjRbMjRdKQoreworCXVuc2lnbmVkIGNoYXIgcDIxWzIxXTsKKworCW1lbXNldChwMjEsICdcMCcsIDIxKTsKKworCW1lbWNweShwMjEsIHBhc3N3ZCwgMTYpOworCUVfUDI0KHAyMSwgYzgsIHAyNCk7Cit9CisKKy8qIERvZXMgdGhlIGRlcyBlbmNyeXB0aW9uIGZyb20gdGhlIEZJUlNUIDggQllURVMgb2YgdGhlIE5UIG9yIExNIE1ENCBoYXNoLiAqLwordm9pZAorTlRMTVNTUE9XRmVuY3J5cHQodW5zaWduZWQgY2hhciBwYXNzd2RbOF0sCisJCSAgdW5zaWduZWQgY2hhciAqbnRsbWNoYWxyZXNwLCB1bnNpZ25lZCBjaGFyIHAyNFsyNF0pCit7CisJdW5zaWduZWQgY2hhciBwMjFbMjFdOworCisJbWVtc2V0KHAyMSwgJ1wwJywgMjEpOworCW1lbWNweShwMjEsIHBhc3N3ZCwgOCk7CisJbWVtc2V0KHAyMSArIDgsIDB4YmQsIDgpOworCisJRV9QMjQocDIxLCBudGxtY2hhbHJlc3AsIHAyNCk7Cit9CisKKy8qIERvZXMgdGhlIE5UIE1ENCBoYXNoIHRoZW4gZGVzIGVuY3J5cHRpb24uICovCisKK3ZvaWQKK1NNQk5UZW5jcnlwdCh1bnNpZ25lZCBjaGFyICpwYXNzd2QsIHVuc2lnbmVkIGNoYXIgKmM4LCB1bnNpZ25lZCBjaGFyICpwMjQpCit7CisJdW5zaWduZWQgY2hhciBwMjFbMjFdOworCisJbWVtc2V0KHAyMSwgJ1wwJywgMjEpOworCisJRV9tZDRoYXNoKHBhc3N3ZCwgcDIxKTsKKwlTTUJPV0ZlbmNyeXB0KHAyMSwgYzgsIHAyNCk7Cit9CisKKworLyogRG9lcyB0aGUgbWQ1IGVuY3J5cHRpb24gZnJvbSB0aGUgTlQgaGFzaCBmb3IgTlRMTXYyLiAqLworLyogVGhlc2Ugcm91dGluZXMgd2lsbCBiZSBuZWVkZWQgbGF0ZXIgKi8KKyNpZiAwCitzdGF0aWMgdm9pZAorU01CT1dGZW5jcnlwdF9udHYyKGNvbnN0IHVuc2lnbmVkIGNoYXIga3JbMTZdLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBkYXRhX2Jsb2IgKiBzcnZfY2hhbCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZGF0YV9ibG9iICogY2xpX2NoYWwsIHVuc2lnbmVkIGNoYXIgcmVzcF9idWZbMTZdKQoreworICAgICAgICBzdHJ1Y3QgSE1BQ01ENUNvbnRleHQgY3R4OworCisgICAgICAgIGhtYWNfbWQ1X2luaXRfbGltS190b182NChrciwgMTYsICZjdHgpOworICAgICAgICBobWFjX21kNV91cGRhdGUoc3J2X2NoYWwtPmRhdGEsIHNydl9jaGFsLT5sZW5ndGgsICZjdHgpOworICAgICAgICBobWFjX21kNV91cGRhdGUoY2xpX2NoYWwtPmRhdGEsIGNsaV9jaGFsLT5sZW5ndGgsICZjdHgpOworICAgICAgICBobWFjX21kNV9maW5hbChyZXNwX2J1ZiwgJmN0eCk7Cit9CisKK3N0YXRpYyB2b2lkCitTTUJzZXNza2V5Z2VuX250djIoY29uc3QgdW5zaWduZWQgY2hhciBrclsxNl0sCisJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm50X3Jlc3AsIF9fdTggc2Vzc19rZXlbMTZdKQoreworCXN0cnVjdCBITUFDTUQ1Q29udGV4dCBjdHg7CisKKwlobWFjX21kNV9pbml0X2xpbUtfdG9fNjQoa3IsIDE2LCAmY3R4KTsKKwlobWFjX21kNV91cGRhdGUobnRfcmVzcCwgMTYsICZjdHgpOworCWhtYWNfbWQ1X2ZpbmFsKCh1bnNpZ25lZCBjaGFyICopIHNlc3Nfa2V5LCAmY3R4KTsKK30KKworc3RhdGljIHZvaWQKK1NNQnNlc3NrZXlnZW5fbnR2MShjb25zdCB1bnNpZ25lZCBjaGFyIGtyWzE2XSwKKwkJICAgY29uc3QgdW5zaWduZWQgY2hhciAqbnRfcmVzcCwgX191OCBzZXNzX2tleVsxNl0pCit7CisJbWRmb3VyKCh1bnNpZ25lZCBjaGFyICopIHNlc3Nfa2V5LCAodW5zaWduZWQgY2hhciAqKSBrciwgMTYpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9jaWZzL3NtYmVyci5oIGIvZnMvY2lmcy9zbWJlcnIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjFmMTM4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy9zbWJlcnIuaApAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqICAgZnMvY2lmcy9zbWJlcnIuaAorICoKKyAqICAgQ29weXJpZ2h0IChjKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzICBDb3JwLiwgMjAwMiwyMDA0CisgKiAgIEF1dGhvcihzKTogU3RldmUgRnJlbmNoIChzZnJlbmNoQHVzLmlibS5jb20pCisgKgorICogICBTZWUgRXJyb3IgQ29kZXMgc2VjdGlvbiBvZiB0aGUgU05JQSBDSUZTIFNwZWNpZmljYXRpb24gCisgKiAgIGZvciBtb3JlIGluZm9ybWF0aW9uIAorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBIAorICovCisKKyNkZWZpbmUgU1VDQ0VTUyAwCQkvKiBUaGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bC4gKi8KKyNkZWZpbmUgRVJSRE9TIDB4MDEJCS8qIEVycm9yIGlzIGZyb20gdGhlIGNvcmUgRE9TIG9wZXJhdGluZyBzeXN0ZW0gc2V0ICovCisjZGVmaW5lIEVSUlNSViAweDAyCQkvKiBFcnJvciBpcyBnZW5lcmF0ZWQgYnkgdGhlIGZpbGUgc2VydmVyIGRhZW1vbiAqLworI2RlZmluZSBFUlJIUkQgMHgwMwkJLyogRXJyb3IgaXMgYSBoYXJkd2FyZSBlcnJvci4gKi8KKyNkZWZpbmUgRVJSQ01EIDB4RkYJCS8qICBDb21tYW5kIHdhcyBub3QgaW4gdGhlICJTTUIiIGZvcm1hdC4gKi8KKworLyogVGhlIGZvbGxvd2luZyBlcnJvciBjb2RlcyBtYXkgYmUgZ2VuZXJhdGVkIHdpdGggdGhlIFNVQ0NFU1MgZXJyb3IgY2xhc3MuKi8KKworI2RlZmluZSBTVUNDRVNTIDAJCS8qIFRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsLiAqLworCisvKiBUaGUgZm9sbG93aW5nIGVycm9yIGNvZGVzIG1heSBiZSBnZW5lcmF0ZWQgd2l0aCB0aGUgRVJSRE9TIGVycm9yIGNsYXNzLiovCisKKyNkZWZpbmUgRVJSYmFkZnVuYyAxCQkvKiBJbnZhbGlkIGZ1bmN0aW9uLiBUaGUgc2VydmVyIGRpZCBub3QgcmVjb2duaXplIG9yIGNvdWxkIG5vdCBwZXJmb3JtIGEgc3lzdGVtIGNhbGwgZ2VuZXJhdGVkIGJ5IHRoZSBzZXJ2ZXIsIGUuZy4sIHNldCB0aGUgRElSRUNUT1JZIGF0dHJpYnV0ZSBvbiBhIGRhdGEgZmlsZSwgaW52YWxpZCBzZWVrIG1vZGUuICovCisjZGVmaW5lIEVSUmJhZGZpbGUgMgkJLypGaWxlIG5vdCBmb3VuZC4gVGhlIGxhc3QgY29tcG9uZW50IG9mIGEgZmlsZSdzIHBhdGhuYW1lIGNvdWxkIG5vdCBiZSBmb3VuZC4gKi8KKyNkZWZpbmUgRVJSYmFkcGF0aCAzCQkvKiBEaXJlY3RvcnkgaW52YWxpZC4gQSBkaXJlY3RvcnkgY29tcG9uZW50IGluIGEgcGF0aG5hbWUgY291bGQgbm90IGJlIGZvdW5kLiAqLworI2RlZmluZSBFUlJub2ZpZHMgNAkJLyogVG9vIG1hbnkgb3BlbiBmaWxlcy4gVGhlIHNlcnZlciBoYXMgbm8gZmlsZSBoYW5kbGVzIGF2YWlsYWJsZS4gKi8KKyNkZWZpbmUgRVJSbm9hY2Nlc3MgNQkJLyogQWNjZXNzIGRlbmllZCwgdGhlIGNsaWVudCdzIGNvbnRleHQgZG9lcyBub3QgcGVybWl0IHRoZSByZXF1ZXN0ZWQgZnVuY3Rpb24uIFRoaXMgaW5jbHVkZXMgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiBpbnZhbGlkIHJlbmFtZSBjb21tYW5kLCB3cml0ZSB0byBGaWQgb3BlbiBmb3IgcmVhZCBvbmx5LCByZWFkIG9uIEZpZCBvcGVuIGZvciB3cml0ZSBvbmx5LCBhdHRlbXB0IHRvIGRlbGV0ZSBhIG5vbi1lbXB0eSBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgRVJSYmFkZmlkIDYJCS8qIEludmFsaWQgZmlsZSBoYW5kbGUuIFRoZSBmaWxlIGhhbmRsZSBzcGVjaWZpZWQgd2FzIG5vdCByZWNvZ25pemVkIGJ5IHRoZSBzZXJ2ZXIuICovCisjZGVmaW5lIEVSUmJhZG1jYiA3CQkvKiBNZW1vcnkgY29udHJvbCBibG9ja3MgZGVzdHJveWVkLiAqLworI2RlZmluZSBFUlJub21lbSA4CQkvKiBJbnN1ZmZpY2llbnQgc2VydmVyIG1lbW9yeSB0byBwZXJmb3JtIHRoZSByZXF1ZXN0ZWQgZnVuY3Rpb24uICovCisjZGVmaW5lIEVSUmJhZG1lbSA5CQkvKiBJbnZhbGlkIG1lbW9yeSBibG9jayBhZGRyZXNzLiAqLworI2RlZmluZSBFUlJiYWRlbnYgMTAJCS8qIEludmFsaWQgZW52aXJvbm1lbnQuICovCisjZGVmaW5lIEVSUmJhZGZvcm1hdCAxMQkJLyogSW52YWxpZCBmb3JtYXQuICovCisjZGVmaW5lIEVSUmJhZGFjY2VzcyAxMgkJLyogSW52YWxpZCBvcGVuIG1vZGUuICovCisjZGVmaW5lIEVSUmJhZGRhdGEgMTMJCS8qIEludmFsaWQgZGF0YSAoZ2VuZXJhdGVkIG9ubHkgYnkgSU9DVEwgY2FsbHMgd2l0aGluIHRoZSBzZXJ2ZXIpLiAqLworI2RlZmluZSBFUlJiYWRkcml2ZSAxNQkJLyogSW52YWxpZCBkcml2ZSBzcGVjaWZpZWQuICovCisjZGVmaW5lIEVSUnJlbWNkIDE2CQkvKiBBIERlbGV0ZSBEaXJlY3RvcnkgcmVxdWVzdCBhdHRlbXB0ZWQgdG8gcmVtb3ZlIHRoZSBzZXJ2ZXIncyBjdXJyZW50IGRpcmVjdG9yeS4gKi8KKyNkZWZpbmUgRVJSZGlmZmRldmljZSAxNwkvKiBOb3Qgc2FtZSBkZXZpY2UgKGUuZy4sIGEgY3Jvc3Mgdm9sdW1lIHJlbmFtZSB3YXMgYXR0ZW1wdGVkICovCisjZGVmaW5lIEVSUm5vZmlsZXMgMTgJCS8qIEEgRmlsZSBTZWFyY2ggY29tbWFuZCBjYW4gZmluZCBubyBtb3JlIGZpbGVzIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgY3JpdGVyaWEuICovCisjZGVmaW5lIEVSUmdlbmVyYWwgMzEKKyNkZWZpbmUgRVJSYmFkc2hhcmUgMzIJCS8qIFRoZSBzaGFyaW5nIG1vZGUgc3BlY2lmaWVkIGZvciBhbiBPcGVuIGNvbmZsaWN0cyB3aXRoIGV4aXN0aW5nIEZJRHMgb24gdGhlIGZpbGUuICovCisjZGVmaW5lIEVSUmxvY2sgMzMJCS8qIEEgTG9jayByZXF1ZXN0IGNvbmZsaWN0ZWQgd2l0aCBhbiBleGlzdGluZyBsb2NrIG9yIHNwZWNpZmllZCBhbiBpbnZhbGlkIG1vZGUsIG9yIGFuIFVubG9jayByZXF1ZXN0ZWQgYXR0ZW1wdGVkIHRvIHJlbW92ZSBhIGxvY2sgaGVsZCBieSBhbm90aGVyIHByb2Nlc3MuICovCisjZGVmaW5lIEVSUnVuc3VwICAgICA1MAorI2RlZmluZSBFUlJub3N1Y2hzaGFyZSA2NworI2RlZmluZSBFUlJmaWxleGlzdHMgODAJCS8qIFRoZSBmaWxlIG5hbWVkIGluIHRoZSByZXF1ZXN0IGFscmVhZHkgZXhpc3RzLiAqLworI2RlZmluZSBFUlJpbnZwYXJtICAgODcKKyNkZWZpbmUgRVJSZGlza2Z1bGwgIDExMgorI2RlZmluZSBFUlJpbnZuYW1lICAgMTIzCisjZGVmaW5lIEVSUmludmxldmVsICAxMjQKKyNkZWZpbmUgRVJSZGlybm90ZW1wdHkgMTQ1CisjZGVmaW5lIEVSUm5vdGxvY2tlZCAgIDE1OAorI2RlZmluZSBFUlJhbHJlYWR5ZXhpc3RzIDE4MworI2RlZmluZSBFUlJiYWRwaXBlIDIzMAorI2RlZmluZSBFUlJwaXBlYnVzeSAyMzEKKyNkZWZpbmUgRVJScGlwZWNsb3NpbmcgMjMyCisjZGVmaW5lIEVSUm5vdGNvbm5lY3RlZCAyMzMKKyNkZWZpbmUgRVJSbW9yZWRhdGEgICAgMjM0CisjZGVmaW5lIEVSUmVhc25vdHN1cHBvcnRlZCAyODIKKyNkZWZpbmUgRXJyUXVvdGEgMHgyMDAJCS8qIFRoZSBvcGVyYXRpb24gd291bGQgY2F1c2UgYSBxdW90YSBsaW1pdCB0byBiZSBleGNlZWRlZC4gKi8KKyNkZWZpbmUgRXJyTm90QUxpbmsgMHgyMDEJLyogQSBsaW5rIG9wZXJhdGlvbiB3YXMgcGVyZm9ybWVkIG9uIGEgcGF0aG5hbWUgdGhhdAorCQkJCSAgIHdhcyBub3QgYSBsaW5rLiAqLworCisvKiBGb2xsb3dpbmcgZXJyb3IgY29kZXMgbWF5IGJlIGdlbmVyYXRlZCB3aXRoIHRoZSBFUlJTUlYgZXJyb3IKK2NsYXNzLiovCisKKyNkZWZpbmUgRVJSZXJyb3IgMQkJLyogTm9uLXNwZWNpZmljIGVycm9yIGNvZGUuIEl0IGlzIHJldHVybmVkIHVuZGVyIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogcmVzb3VyY2Ugb3RoZXIgdGhhbiBkaXNrIHNwYWNlIGV4aGF1c3RlZCAoZS5nLiBUSURzKSwgZmlyc3QgU01CIGNvbW1hbmQgd2FzIG5vdCBuZWdvdGlhdGUsIG11bHRpcGxlIG5lZ290aWF0ZXMgYXR0ZW1wdGVkLCBhbmQgaW50ZXJuYWwgc2VydmVyIGVycm9yLiAqLworI2RlZmluZSBFUlJiYWRwdyAyCQkvKiBCYWQgcGFzc3dvcmQgLSBuYW1lL3Bhc3N3b3JkIHBhaXIgaW4gYSBUcmVlQ29ubmVjdCBvciBTZXNzaW9uIFNldHVwIGFyZSBpbnZhbGlkLiAqLworI2RlZmluZSBFUlJiYWR0eXBlIDMJCS8qIHVzZWQgZm9yIGluZGljYXRpbmcgREZTIHJlZmVycmFsIG5lZWRlZCAqLworI2RlZmluZSBFUlJhY2Nlc3MgNAkJLyogVGhlIGNsaWVudCBkb2VzIG5vdCBoYXZlIHRoZSBuZWNlc3NhcnkgYWNjZXNzIHJpZ2h0cyB3aXRoaW4gdGhlIHNwZWNpZmllZCBjb250ZXh0IGZvciByZXF1ZXN0ZWQgZnVuY3Rpb24uICovCisjZGVmaW5lIEVSUmludnRpZCA1CQkvKiBUaGUgVGlkIHNwZWNpZmllZCBpbiBhIGNvbW1hbmQgd2FzIGludmFsaWQuICovCisjZGVmaW5lIEVSUmludm5ldG5hbWUgNgkJLyogSW52YWxpZCBuZXR3b3JrIG5hbWUgaW4gdHJlZSBjb25uZWN0LiAqLworI2RlZmluZSBFUlJpbnZkZXZpY2UgNwkJLyogSW52YWxpZCBkZXZpY2UgLSBwcmludGVyIHJlcXVlc3QgbWFkZSB0byBub24tcHJpbnRlciBjb25uZWN0aW9uIG9yIG5vbi1wcmludGVyIHJlcXVlc3QgbWFkZSB0byBwcmludGVyIGNvbm5lY3Rpb24uICovCisjZGVmaW5lIEVSUnFmdWxsIDQ5CQkvKiBQcmludCBxdWV1ZSBmdWxsIChmaWxlcykgLS0gcmV0dXJuZWQgYnkgb3BlbiBwcmludCBmaWxlLiAqLworI2RlZmluZSBFUlJxdG9vYmlnIDUwCQkvKiBQcmludCBxdWV1ZSBmdWxsIC0tIG5vIHNwYWNlLiAqLworI2RlZmluZSBFUlJxZW9mICAgICAgICAgNTEJLyogRU9GIG9uIHByaW50IHF1ZXVlIGR1bXAgKi8KKyNkZWZpbmUgRVJSaW52cGZpZCAgICAgIDUyCS8qIEludmFsaWQgcHJpbnQgZmlsZSBGSUQuICovCisjZGVmaW5lIEVSUnNtYmNtZCAgICAgICA2NAkvKiBUaGUgc2VydmVyIGRpZCBub3QgcmVjb2duaXplIHRoZSBjb21tYW5kIHJlY2VpdmVkLiAqLworI2RlZmluZSBFUlJzcnZlcnJvciAgICAgNjUJLyogVGhlIHNlcnZlciBlbmNvdW50ZXJlZCBhbiBpbnRlcm5hbCBlcnJvciwgZS5nLiwgc3lzdGVtIGZpbGUgdW5hdmFpbGFibGUuICovCisjZGVmaW5lIEVSUmJhZEJJRCAgICAgICA2NgkvKiAob2Jzb2xldGUpICovCisjZGVmaW5lIEVSUmZpbGVzcGVjcyAgICA2NwkvKiBUaGUgRmlkIGFuZCBwYXRobmFtZSBwYXJhbWV0ZXJzIGNvbnRhaW5lZCBhbiBpbnZhbGlkIGNvbWJpbmF0aW9uIG9mIHZhbHVlcy4gKi8KKyNkZWZpbmUgRVJSYmFkTGluayAgICAgIDY4CS8qIChvYnNvbGV0ZSkgKi8KKyNkZWZpbmUgRVJSYmFkcGVybWl0cyAgIDY5CS8qIFRoZSBhY2Nlc3MgcGVybWlzc2lvbnMgc3BlY2lmaWVkIGZvciBhIGZpbGUgb3IgZGlyZWN0b3J5IGFyZSBub3QgYSB2YWxpZCBjb21iaW5hdGlvbi4gKi8KKyNkZWZpbmUgRVJSYmFkUElEICAgICAgIDcwCisjZGVmaW5lIEVSUnNldGF0dHJtb2RlICA3MQkvKiBhdHRyaWJ1dGUgKG1vZGUpIGlzIGludmFsaWQgKi8KKyNkZWZpbmUgRVJScGF1c2VkICAgICAgIDgxCS8qIFNlcnZlciBpcyBwYXVzZWQgKi8KKyNkZWZpbmUgRVJSbXNnb2ZmCTgyCS8qIHJlc2VydmVkIC0gbWVzc2FnaW5nIG9mZiAqLworI2RlZmluZSBFUlJub3Jvb20gICAgICAgODMJLyogcmVzZXJ2ZWQgLSBubyByb29tIGZvciBtZXNzYWdlICovCisjZGVmaW5lIEVSUnJtdW5zICAgICAgICA4NwkvKiByZXNlcnZlZCAtIHRvbyBtYW55IHJlbW90ZSBuYW1lcyAqLworI2RlZmluZSBFUlJ0aW1lb3V0ICAgICAgODgJLyogb3BlcmF0aW9uIHRpbWVkIG91dCAqLworI2RlZmluZSBFUlJub3Jlc291cmNlICAgODkJLyogTm8gcmVzb3VyY2VzIGF2YWlsYWJsZSBmb3IgcmVxdWVzdCAqLworI2RlZmluZSBFUlJ0b29tYW55dWlkcyAgOTAJLyogVG9vIG1hbnkgVUlEcyBhY3RpdmUgb24gdGhpcyBzZXNzaW9uICovCisjZGVmaW5lIEVSUmJhZHVpZCAgICAgICA5MQkvKiBUaGUgVUlEIGlzIG5vdCBrbm93biBhcyBhIHZhbGlkIHVzZXIgKi8KKyNkZWZpbmUgRVJSdXNlbXB4ICAgICAgMjUwCS8qIHRlbXBvcmFyaWx5IHVuYWJsZSB0byB1c2UgcmF3ICovCisjZGVmaW5lIEVSUnVzZXN0ZCAgICAgIDI1MQkvKiB0ZW1wb3JhcmlseSB1bmFibGUgdG8gdXNlIGVpdGhlciByYXcgb3IgbXB4ICovCisjZGVmaW5lIEVSUl9OT1RJRllfRU5VTV9ESVIgMTAyNAorI2RlZmluZSBFUlJhY2NvdW50ZXhwaXJlZCAyMjM5CisjZGVmaW5lIEVSUmJhZGNsaWVudCAgICAgIDIyNDAKKyNkZWZpbmUgRVJSYmFkTG9nb25UaW1lICAgMjI0MQorI2RlZmluZSBFUlJwYXNzd29yZEV4cGlyZWQgMjI0MgorI2RlZmluZSBFUlJuZXRsb2dvbk5vdFN0YXJ0ZWQgMjQ1NQorI2RlZmluZSBFUlJub3N1cHBvcnQgICAgICAgMHhGRkZGCmRpZmYgLS1naXQgYS9mcy9jaWZzL3RyYW5zcG9ydC5jIGIvZnMvY2lmcy90cmFuc3BvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjEzZTUyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvY2lmcy90cmFuc3BvcnQuYwpAQCAtMCwwICsxLDYxOSBAQAorLyoKKyAqICAgZnMvY2lmcy90cmFuc3BvcnQuYworICoKKyAqICAgQ29weXJpZ2h0IChDKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzICBDb3JwLiwgMjAwMiwyMDA0CisgKiAgIEF1dGhvcihzKTogU3RldmUgRnJlbmNoIChzZnJlbmNoQHVzLmlibS5jb20pCisgKgorICogICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqICAgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EgCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KKyNpbmNsdWRlICJjaWZzcGR1LmgiCisjaW5jbHVkZSAiY2lmc2dsb2IuaCIKKyNpbmNsdWRlICJjaWZzcHJvdG8uaCIKKyNpbmNsdWRlICJjaWZzX2RlYnVnLmgiCisgIAorZXh0ZXJuIG1lbXBvb2xfdCAqY2lmc19taWRfcG9vbHA7CitleHRlcm4ga21lbV9jYWNoZV90ICpjaWZzX29wbG9ja19jYWNoZXA7CisKK3N0YXRpYyBzdHJ1Y3QgbWlkX3FfZW50cnkgKgorQWxsb2NNaWRRRW50cnkoc3RydWN0IHNtYl9oZHIgKnNtYl9idWZmZXIsIHN0cnVjdCBjaWZzU2VzSW5mbyAqc2VzKQoreworCXN0cnVjdCBtaWRfcV9lbnRyeSAqdGVtcDsKKworCWlmIChzZXMgPT0gTlVMTCkgeworCQljRVJST1IoMSwgKCJOdWxsIHNlc3Npb24gcGFzc2VkIGluIHRvIEFsbG9jTWlkUUVudHJ5ICIpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmIChzZXMtPnNlcnZlciA9PSBOVUxMKSB7CisJCWNFUlJPUigxLCAoIk51bGwgVENQIHNlc3Npb24gaW4gQWxsb2NNaWRRRW50cnkiKSk7CisJCXJldHVybiBOVUxMOworCX0KKwkKKwl0ZW1wID0gKHN0cnVjdCBtaWRfcV9lbnRyeSAqKSBtZW1wb29sX2FsbG9jKGNpZnNfbWlkX3Bvb2xwLFNMQUJfS0VSTkVMIHwgU0xBQl9OT0ZTKTsKKwlpZiAodGVtcCA9PSBOVUxMKQorCQlyZXR1cm4gdGVtcDsKKwllbHNlIHsKKwkJbWVtc2V0KHRlbXAsIDAsIHNpemVvZiAoc3RydWN0IG1pZF9xX2VudHJ5KSk7CisJCXRlbXAtPm1pZCA9IHNtYl9idWZmZXItPk1pZDsJLyogYWx3YXlzIExFICovCisJCXRlbXAtPnBpZCA9IGN1cnJlbnQtPnBpZDsKKwkJdGVtcC0+Y29tbWFuZCA9IHNtYl9idWZmZXItPkNvbW1hbmQ7CisJCWNGWUkoMSwgKCJGb3Igc21iX2NvbW1hbmQgJWQiLCB0ZW1wLT5jb21tYW5kKSk7CisJCWRvX2dldHRpbWVvZmRheSgmdGVtcC0+d2hlbl9zZW50KTsKKwkJdGVtcC0+c2VzID0gc2VzOworCQl0ZW1wLT50c2sgPSBjdXJyZW50OworCX0KKworCXNwaW5fbG9jaygmR2xvYmFsTWlkX0xvY2spOworCWxpc3RfYWRkX3RhaWwoJnRlbXAtPnFoZWFkLCAmc2VzLT5zZXJ2ZXItPnBlbmRpbmdfbWlkX3EpOworCWF0b21pY19pbmMoJm1pZENvdW50KTsKKwl0ZW1wLT5taWRTdGF0ZSA9IE1JRF9SRVFVRVNUX0FMTE9DQVRFRDsKKwlzcGluX3VubG9jaygmR2xvYmFsTWlkX0xvY2spOworCXJldHVybiB0ZW1wOworfQorCitzdGF0aWMgdm9pZAorRGVsZXRlTWlkUUVudHJ5KHN0cnVjdCBtaWRfcV9lbnRyeSAqbWlkRW50cnkpCit7CisJc3Bpbl9sb2NrKCZHbG9iYWxNaWRfTG9jayk7CisJbWlkRW50cnktPm1pZFN0YXRlID0gTUlEX0ZSRUU7CisJbGlzdF9kZWwoJm1pZEVudHJ5LT5xaGVhZCk7CisJYXRvbWljX2RlYygmbWlkQ291bnQpOworCXNwaW5fdW5sb2NrKCZHbG9iYWxNaWRfTG9jayk7CisJY2lmc19idWZfcmVsZWFzZShtaWRFbnRyeS0+cmVzcF9idWYpOworCW1lbXBvb2xfZnJlZShtaWRFbnRyeSwgY2lmc19taWRfcG9vbHApOworfQorCitzdHJ1Y3Qgb3Bsb2NrX3FfZW50cnkgKgorQWxsb2NPcGxvY2tRRW50cnkoc3RydWN0IGlub2RlICogcGlub2RlLCBfX3UxNiBmaWQsIHN0cnVjdCBjaWZzVGNvbkluZm8gKiB0Y29uKQoreworCXN0cnVjdCBvcGxvY2tfcV9lbnRyeSAqdGVtcDsKKwlpZiAoKHBpbm9kZT09IE5VTEwpIHx8ICh0Y29uID09IE5VTEwpKSB7CisJCWNFUlJPUigxLCAoIk51bGwgcGFybXMgcGFzc2VkIHRvIEFsbG9jT3Bsb2NrUUVudHJ5IikpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJdGVtcCA9IChzdHJ1Y3Qgb3Bsb2NrX3FfZW50cnkgKikga21lbV9jYWNoZV9hbGxvYyhjaWZzX29wbG9ja19jYWNoZXAsCisJCQkJCQkgICAgICAgU0xBQl9LRVJORUwpOworCWlmICh0ZW1wID09IE5VTEwpCisJCXJldHVybiB0ZW1wOworCWVsc2UgeworCQl0ZW1wLT5waW5vZGUgPSBwaW5vZGU7CisJCXRlbXAtPnRjb24gPSB0Y29uOworCQl0ZW1wLT5uZXRmaWQgPSBmaWQ7CisJCXNwaW5fbG9jaygmR2xvYmFsTWlkX0xvY2spOworCQlsaXN0X2FkZF90YWlsKCZ0ZW1wLT5xaGVhZCwgJkdsb2JhbE9wbG9ja19RKTsKKwkJc3Bpbl91bmxvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwl9CisJcmV0dXJuIHRlbXA7CisKK30KKwordm9pZCBEZWxldGVPcGxvY2tRRW50cnkoc3RydWN0IG9wbG9ja19xX2VudHJ5ICogb3Bsb2NrRW50cnkpCit7CisJc3Bpbl9sb2NrKCZHbG9iYWxNaWRfTG9jayk7IAorICAgIC8qIHNob3VsZCB3ZSBjaGVjayBpZiBsaXN0IGVtcHR5IGZpcnN0PyAqLworCWxpc3RfZGVsKCZvcGxvY2tFbnRyeS0+cWhlYWQpOworCXNwaW5fdW5sb2NrKCZHbG9iYWxNaWRfTG9jayk7CisJa21lbV9jYWNoZV9mcmVlKGNpZnNfb3Bsb2NrX2NhY2hlcCwgb3Bsb2NrRW50cnkpOworfQorCitpbnQKK3NtYl9zZW5kKHN0cnVjdCBzb2NrZXQgKnNzb2NrZXQsIHN0cnVjdCBzbWJfaGRyICpzbWJfYnVmZmVyLAorCSB1bnNpZ25lZCBpbnQgc21iX2J1Zl9sZW5ndGgsIHN0cnVjdCBzb2NrYWRkciAqc2luKQoreworCWludCByYyA9IDA7CisJaW50IGkgPSAwOworCXN0cnVjdCBtc2doZHIgc21iX21zZzsKKwlzdHJ1Y3Qga3ZlYyBpb3Y7CisJdW5zaWduZWQgbGVuID0gc21iX2J1Zl9sZW5ndGggKyA0OworCisJaWYoc3NvY2tldCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT1RTT0NLOyAvKiBCQiBldmVudHVhbGx5IGFkZCByZWNvbm5lY3QgY29kZSBoZXJlICovCisJaW92Lmlvdl9iYXNlID0gc21iX2J1ZmZlcjsKKwlpb3YuaW92X2xlbiA9IGxlbjsKKworCXNtYl9tc2cubXNnX25hbWUgPSBzaW47CisJc21iX21zZy5tc2dfbmFtZWxlbiA9IHNpemVvZiAoc3RydWN0IHNvY2thZGRyKTsKKwlzbWJfbXNnLm1zZ19jb250cm9sID0gTlVMTDsKKwlzbWJfbXNnLm1zZ19jb250cm9sbGVuID0gMDsKKwlzbWJfbXNnLm1zZ19mbGFncyA9IE1TR19ET05UV0FJVCArIE1TR19OT1NJR05BTDsgLyogQkIgYWRkIG1vcmUgZmxhZ3M/Ki8KKworCS8qIHNtYiBoZWFkZXIgaXMgY29udmVydGVkIGluIGhlYWRlcl9hc3NlbWJsZS4gYmNjIGFuZCByZXN0IG9mIFNNQiB3b3JkCisJICAgYXJlYSwgYW5kIGJ5dGUgYXJlYSBpZiBuZWNlc3NhcnksIGlzIGNvbnZlcnRlZCB0byBsaXR0bGVlbmRpYW4gaW4gCisJICAgY2lmc3NtYi5jIGFuZCBSRkMxMDAxIGxlbiBpcyBjb252ZXJ0ZWQgdG8gYmlnZW5kaWFuIGluIHNtYl9zZW5kIAorCSAgIEZsYWdzMiBpcyBjb252ZXJ0ZWQgaW4gU2VuZFJlY2VpdmUgKi8KKworCXNtYl9idWZmZXItPnNtYl9idWZfbGVuZ3RoID0gY3B1X3RvX2JlMzIoc21iX2J1ZmZlci0+c21iX2J1Zl9sZW5ndGgpOworCWNGWUkoMSwgKCJTZW5kaW5nIHNtYiBvZiBsZW5ndGggJWQgIiwgc21iX2J1Zl9sZW5ndGgpKTsKKwlkdW1wX3NtYihzbWJfYnVmZmVyLCBsZW4pOworCisJd2hpbGUgKGxlbiA+IDApIHsKKwkJcmMgPSBrZXJuZWxfc2VuZG1zZyhzc29ja2V0LCAmc21iX21zZywgJmlvdiwgMSwgbGVuKTsKKwkJaWYgKChyYyA9PSAtRU5PU1BDKSB8fCAocmMgPT0gLUVBR0FJTikpIHsKKwkJCWkrKzsKKwkJCWlmKGkgPiA2MCkgeworCQkJCWNFUlJPUigxLAorCQkJCSAgICgic2VuZHMgb24gc29jayAlcCBzdHVjayBmb3IgMzAgc2Vjb25kcyIsCisJCQkJICAgIHNzb2NrZXQpKTsKKwkJCQlyYyA9IC1FQUdBSU47CisJCQkJYnJlYWs7CisJCQl9CisJCQltc2xlZXAoNTAwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChyYyA8IDApIAorCQkJYnJlYWs7CisJCWlvdi5pb3ZfYmFzZSArPSByYzsKKwkJaW92Lmlvdl9sZW4gLT0gcmM7CisJCWxlbiAtPSByYzsKKwl9CisKKwlpZiAocmMgPCAwKSB7CisJCWNFUlJPUigxLCgiRXJyb3IgJWQgc2VuZGluZyBkYXRhIG9uIHNvY2tldCB0byBzZXJ2ZXIuIiwgcmMpKTsKKwl9IGVsc2UgeworCQlyYyA9IDA7CisJfQorCisJcmV0dXJuIHJjOworfQorCisjaWZkZWYgQ0lGU19FWFBFUklNRU5UQUwKKy8qIEJCIGZpbmlzaCBvZmYgdGhpcyBmdW5jdGlvbiwgYWRkaW5nIHN1cHBvcnQgZm9yIHdyaXRpbmcgc2V0IG9mIHBhZ2VzIGFzIGlvdmVjICovCisvKiBhbmQgYWxzbyBhZGRpbmcgc3VwcG9ydCBmb3Igb3BlcmF0aW9ucyB0aGF0IG5lZWQgdG8gcGFyc2UgdGhlIHJlc3BvbnNlIHNtYiAgICAqLworCitpbnQKK3NtYl9zZW5kdihzdHJ1Y3Qgc29ja2V0ICpzc29ja2V0LCBzdHJ1Y3Qgc21iX2hkciAqc21iX2J1ZmZlciwKKwkgdW5zaWduZWQgaW50IHNtYl9idWZfbGVuZ3RoLCBzdHJ1Y3Qga3ZlYyAqIHdyaXRlX3ZlY3RvciAvKiBwYWdlIGxpc3QgKi8sIHN0cnVjdCBzb2NrYWRkciAqc2luKQoreworCWludCByYyA9IDA7CisJaW50IGkgPSAwOworCXN0cnVjdCBtc2doZHIgc21iX21zZzsKKwludW1iZXJfb2ZfcGFnZXMgKz0gMTsgLyogYWNjb3VudCBmb3IgU01CIGhlYWRlciAqLworCXN0cnVjdCBrdmVjICogcGlvdiAgPSBrbWFsbG9jKG51bWJlcl9vZl9wYWdlcyAqIHNpemVvZihzdHJ1Y3Qga3ZlYykpOworCWlmKGk9MDtpPG51bV9wYWdlcy0xO2krKworCXVuc2lnbmVkIGxlbiA9IHNtYl9idWZfbGVuZ3RoICsgNDsKKworCWlmKHNzb2NrZXQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9UU09DSzsgLyogQkIgZXZlbnR1YWxseSBhZGQgcmVjb25uZWN0IGNvZGUgaGVyZSAqLworCWlvdi5pb3ZfYmFzZSA9IHNtYl9idWZmZXI7CisJaW92Lmlvdl9sZW4gPSBsZW47CisKKwlzbWJfbXNnLm1zZ19uYW1lID0gc2luOworCXNtYl9tc2cubXNnX25hbWVsZW4gPSBzaXplb2YgKHN0cnVjdCBzb2NrYWRkcik7CisJc21iX21zZy5tc2dfY29udHJvbCA9IE5VTEw7CisJc21iX21zZy5tc2dfY29udHJvbGxlbiA9IDA7CisJc21iX21zZy5tc2dfZmxhZ3MgPSBNU0dfRE9OVFdBSVQgKyBNU0dfTk9TSUdOQUw7IC8qIEJCIGFkZCBtb3JlIGZsYWdzPyovCisKKwkvKiBzbWIgaGVhZGVyIGlzIGNvbnZlcnRlZCBpbiBoZWFkZXJfYXNzZW1ibGUuIGJjYyBhbmQgcmVzdCBvZiBTTUIgd29yZAorCSAgIGFyZWEsIGFuZCBieXRlIGFyZWEgaWYgbmVjZXNzYXJ5LCBpcyBjb252ZXJ0ZWQgdG8gbGl0dGxlZW5kaWFuIGluIAorCSAgIGNpZnNzbWIuYyBhbmQgUkZDMTAwMSBsZW4gaXMgY29udmVydGVkIHRvIGJpZ2VuZGlhbiBpbiBzbWJfc2VuZCAKKwkgICBGbGFnczIgaXMgY29udmVydGVkIGluIFNlbmRSZWNlaXZlICovCisKKwlzbWJfYnVmZmVyLT5zbWJfYnVmX2xlbmd0aCA9IGNwdV90b19iZTMyKHNtYl9idWZmZXItPnNtYl9idWZfbGVuZ3RoKTsKKwljRllJKDEsICgiU2VuZGluZyBzbWIgb2YgbGVuZ3RoICVkICIsIHNtYl9idWZfbGVuZ3RoKSk7CisJZHVtcF9zbWIoc21iX2J1ZmZlciwgbGVuKTsKKworCXdoaWxlIChsZW4gPiAwKSB7CisJCXJjID0ga2VybmVsX3NlbmRtc2coc3NvY2tldCwgJnNtYl9tc2csICZpb3YsIG51bWJlcl9vZl9wYWdlcywgbGVuPyk7CisJCWlmICgocmMgPT0gLUVOT1NQQykgfHwgKHJjID09IC1FQUdBSU4pKSB7CisJCQlpKys7CisJCQlpZihpID4gNjApIHsKKwkJCQljRVJST1IoMSwKKwkJCQkgICAoInNlbmRzIG9uIHNvY2sgJXAgc3R1Y2sgZm9yIDMwIHNlY29uZHMiLAorCQkJCSAgICBzc29ja2V0KSk7CisJCQkJcmMgPSAtRUFHQUlOOworCQkJCWJyZWFrOworCQkJfQorCQkJbXNsZWVwKDUwMCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAocmMgPCAwKSAKKwkJCWJyZWFrOworCQlpb3YuaW92X2Jhc2UgKz0gcmM7CisJCWlvdi5pb3ZfbGVuIC09IHJjOworCQlsZW4gLT0gcmM7CisJfQorCisJaWYgKHJjIDwgMCkgeworCQljRVJST1IoMSwoIkVycm9yICVkIHNlbmRpbmcgZGF0YSBvbiBzb2NrZXQgdG8gc2VydmVyLiIsIHJjKSk7CisJfSBlbHNlIHsKKwkJcmMgPSAwOworCX0KKworCXJldHVybiByYzsKK30KKworCitpbnQKK0NJRlNTZW5kUmN2KGNvbnN0IHVuc2lnbmVkIGludCB4aWQsIHN0cnVjdCBjaWZzU2VzSW5mbyAqc2VzLAorCSAgICBzdHJ1Y3Qgc21iX2hkciAqaW5fYnVmLCBzdHJ1Y3Qga3ZlYyAqIHdyaXRlX3ZlY3RvciAvKiBwYWdlIGxpc3QgKi8sIGludCAqcGJ5dGVzX3JldHVybmVkLCBjb25zdCBpbnQgbG9uZ19vcCkKK3sKKwlpbnQgcmMgPSAwOworCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IDE1ICogSFo7CisJc3RydWN0IG1pZF9xX2VudHJ5ICptaWRRID0gTlVMTDsKKworCWlmIChzZXMgPT0gTlVMTCkgeworCQljRVJST1IoMSwoIk51bGwgc21iIHNlc3Npb24iKSk7CisJCXJldHVybiAtRUlPOworCX0KKwlpZihzZXMtPnNlcnZlciA9PSBOVUxMKSB7CisJCWNFUlJPUigxLCgiTnVsbCB0Y3Agc2Vzc2lvbiIpKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmKHBieXRlc19yZXR1cm5lZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTzsKKwllbHNlCisJCSpwYnl0ZXNfcmV0dXJuZWQgPSAwOworCisgIAorCisJLyogRW5zdXJlIHRoYXQgd2UgZG8gbm90IHNlbmQgbW9yZSB0aGFuIDUwIG92ZXJsYXBwaW5nIHJlcXVlc3RzIAorCSAgIHRvIHRoZSBzYW1lIHNlcnZlci4gV2UgbWF5IG1ha2UgdGhpcyBjb25maWd1cmFibGUgbGF0ZXIgb3IKKwkgICB1c2Ugc2VzLT5tYXhSZXEgKi8KKwlpZihsb25nX29wID09IC0xKSB7CisJCS8qIG9wbG9jayBicmVha3MgbXVzdCBub3QgYmUgaGVsZCB1cCAqLworCQlhdG9taWNfaW5jKCZzZXMtPnNlcnZlci0+aW5GbGlnaHQpOworCX0gZWxzZSB7CisJCXNwaW5fbG9jaygmR2xvYmFsTWlkX0xvY2spOyAKKwkJd2hpbGUoMSkgeyAgICAgICAgCisJCQlpZihhdG9taWNfcmVhZCgmc2VzLT5zZXJ2ZXItPmluRmxpZ2h0KSA+PSBjaWZzX21heF9wZW5kaW5nKXsKKwkJCQlzcGluX3VubG9jaygmR2xvYmFsTWlkX0xvY2spOworCQkJCXdhaXRfZXZlbnQoc2VzLT5zZXJ2ZXItPnJlcXVlc3RfcSwKKwkJCQkJYXRvbWljX3JlYWQoJnNlcy0+c2VydmVyLT5pbkZsaWdodCkKKwkJCQkJIDwgY2lmc19tYXhfcGVuZGluZyk7CisJCQkJc3Bpbl9sb2NrKCZHbG9iYWxNaWRfTG9jayk7CisJCQl9IGVsc2UgeworCQkJCWlmKHNlcy0+c2VydmVyLT50Y3BTdGF0dXMgPT0gQ2lmc0V4aXRpbmcpIHsKKwkJCQkJc3Bpbl91bmxvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwkJCQkJcmV0dXJuIC1FTk9FTlQ7CisJCQkJfQorCisJCQkvKiBjYW4gbm90IGNvdW50IGxvY2tpbmcgY29tbWFuZHMgYWdhaW5zdCB0b3RhbCBzaW5jZQorCQkJICAgdGhleSBhcmUgYWxsb3dlZCB0byBibG9jayBvbiBzZXJ2ZXIgKi8KKwkJCQkJCisJCQkJaWYobG9uZ19vcCA8IDMpIHsKKwkJCQkvKiB1cGRhdGUgIyBvZiByZXF1ZXN0cyBvbiB0aGUgd2lyZSB0byBzZXJ2ZXIgKi8KKwkJCQkJYXRvbWljX2luYygmc2VzLT5zZXJ2ZXItPmluRmxpZ2h0KTsKKwkJCQl9CisJCQkJc3Bpbl91bmxvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwkvKiBtYWtlIHN1cmUgdGhhdCB3ZSBzaWduIGluIHRoZSBzYW1lIG9yZGVyIHRoYXQgd2Ugc2VuZCBvbiB0aGlzIHNvY2tldCAKKwkgICBhbmQgYXZvaWQgcmFjZXMgaW5zaWRlIHRjcCBzZW5kbXNnIGNvZGUgdGhhdCBjb3VsZCBjYXVzZSBjb3JydXB0aW9uCisJICAgb2Ygc21iIGRhdGEgKi8KKworCWRvd24oJnNlcy0+c2VydmVyLT50Y3BTZW0pOyAKKworCWlmIChzZXMtPnNlcnZlci0+dGNwU3RhdHVzID09IENpZnNFeGl0aW5nKSB7CisJCXJjID0gLUVOT0VOVDsKKwkJZ290byBjaWZzX291dF9sYWJlbDsKKwl9IGVsc2UgaWYgKHNlcy0+c2VydmVyLT50Y3BTdGF0dXMgPT0gQ2lmc05lZWRSZWNvbm5lY3QpIHsKKwkJY0ZZSSgxLCgidGNwIHNlc3Npb24gZGVhZCAtIHJldHVybiB0byBjYWxsZXIgdG8gcmV0cnkiKSk7CisJCXJjID0gLUVBR0FJTjsKKwkJZ290byBjaWZzX291dF9sYWJlbDsKKwl9IGVsc2UgaWYgKHNlcy0+c3RhdHVzICE9IENpZnNHb29kKSB7CisJCS8qIGNoZWNrIGlmIFNNQiBzZXNzaW9uIGlzIGJhZCBiZWNhdXNlIHdlIGFyZSBzZXR0aW5nIGl0IHVwICovCisJCWlmKChpbl9idWYtPkNvbW1hbmQgIT0gU01CX0NPTV9TRVNTSU9OX1NFVFVQX0FORFgpICYmIAorCQkJKGluX2J1Zi0+Q29tbWFuZCAhPSBTTUJfQ09NX05FR09USUFURSkpIHsKKwkJCXJjID0gLUVBR0FJTjsKKwkJCWdvdG8gY2lmc19vdXRfbGFiZWw7CisJCX0gLyogZWxzZSBvayAtIHdlIGFyZSBzZXR0aW5nIHVwIHNlc3Npb24gKi8KKwl9CisJbWlkUSA9IEFsbG9jTWlkUUVudHJ5KGluX2J1Ziwgc2VzKTsKKwlpZiAobWlkUSA9PSBOVUxMKSB7CisJCXVwKCZzZXMtPnNlcnZlci0+dGNwU2VtKTsKKwkJLyogSWYgbm90IGxvY2sgcmVxLCB1cGRhdGUgIyBvZiByZXF1ZXN0cyBvbiB3aXJlIHRvIHNlcnZlciAqLworCQlpZihsb25nX29wIDwgMykgeworCQkJYXRvbWljX2RlYygmc2VzLT5zZXJ2ZXItPmluRmxpZ2h0KTsgCisJCQl3YWtlX3VwKCZzZXMtPnNlcnZlci0+cmVxdWVzdF9xKTsKKwkJfQorCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoaW5fYnVmLT5zbWJfYnVmX2xlbmd0aCA+IENJRlNNYXhCdWZTaXplICsgTUFYX0NJRlNfSERSX1NJWkUgLSA0KSB7CisJCXVwKCZzZXMtPnNlcnZlci0+dGNwU2VtKTsKKwkJY0VSUk9SKDEsCisJCSAgICAgICAoIklsbGVnYWwgbGVuZ3RoLCBncmVhdGVyIHRoYW4gbWF4aW11bSBmcmFtZSwgJWQgIiwKKwkJCWluX2J1Zi0+c21iX2J1Zl9sZW5ndGgpKTsKKwkJRGVsZXRlTWlkUUVudHJ5KG1pZFEpOworCQkvKiBJZiBub3QgbG9jayByZXEsIHVwZGF0ZSAjIG9mIHJlcXVlc3RzIG9uIHdpcmUgdG8gc2VydmVyICovCisJCWlmKGxvbmdfb3AgPCAzKSB7CisJCQlhdG9taWNfZGVjKCZzZXMtPnNlcnZlci0+aW5GbGlnaHQpOyAKKwkJCXdha2VfdXAoJnNlcy0+c2VydmVyLT5yZXF1ZXN0X3EpOworCQl9CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIEJCIGNhbiB3ZSBzaWduIGVmZmljaWVudGx5IGluIHRoaXMgcGF0aD8gKi8KKwlyYyA9IGNpZnNfc2lnbl9zbWIoaW5fYnVmLCBzZXMsICZtaWRRLT5zZXF1ZW5jZV9udW1iZXIpOworCisJbWlkUS0+bWlkU3RhdGUgPSBNSURfUkVRVUVTVF9TVUJNSVRURUQ7CisvKglyYyA9IHNtYl9zZW5kdihzZXMtPnNlcnZlci0+c3NvY2tldCwgaW5fYnVmLCBpbl9idWYtPnNtYl9idWZfbGVuZ3RoLCBwaW92ZWMsCisJCSAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKikgJihzZXMtPnNlcnZlci0+YWRkci5zb2NrQWRkcikpOyovCisJaWYocmMgPCAwKSB7CisJCURlbGV0ZU1pZFFFbnRyeShtaWRRKTsKKwkJdXAoJnNlcy0+c2VydmVyLT50Y3BTZW0pOworCQkvKiBJZiBub3QgbG9jayByZXEsIHVwZGF0ZSAjIG9mIHJlcXVlc3RzIG9uIHdpcmUgdG8gc2VydmVyICovCisJCWlmKGxvbmdfb3AgPCAzKSB7CisJCQlhdG9taWNfZGVjKCZzZXMtPnNlcnZlci0+aW5GbGlnaHQpOyAKKwkJCXdha2VfdXAoJnNlcy0+c2VydmVyLT5yZXF1ZXN0X3EpOworCQl9CisJCXJldHVybiByYzsKKwl9IGVsc2UKKwkJdXAoJnNlcy0+c2VydmVyLT50Y3BTZW0pOworY2lmc19vdXRfbGFiZWw6CisJaWYobWlkUSkKKwkgICAgICAgIERlbGV0ZU1pZFFFbnRyeShtaWRRKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCWlmKGxvbmdfb3AgPCAzKSB7CisJCWF0b21pY19kZWMoJnNlcy0+c2VydmVyLT5pbkZsaWdodCk7CisJCXdha2VfdXAoJnNlcy0+c2VydmVyLT5yZXF1ZXN0X3EpOworCX0KKworCXJldHVybiByYzsKK30KKworCisjZW5kaWYgLyogQ0lGU19FWFBFUklNRU5UQUwgKi8KKworaW50CitTZW5kUmVjZWl2ZShjb25zdCB1bnNpZ25lZCBpbnQgeGlkLCBzdHJ1Y3QgY2lmc1Nlc0luZm8gKnNlcywKKwkgICAgc3RydWN0IHNtYl9oZHIgKmluX2J1Ziwgc3RydWN0IHNtYl9oZHIgKm91dF9idWYsCisJICAgIGludCAqcGJ5dGVzX3JldHVybmVkLCBjb25zdCBpbnQgbG9uZ19vcCkKK3sKKwlpbnQgcmMgPSAwOworCXVuc2lnbmVkIGludCByZWNlaXZlX2xlbjsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJc3RydWN0IG1pZF9xX2VudHJ5ICptaWRROworCisJaWYgKHNlcyA9PSBOVUxMKSB7CisJCWNFUlJPUigxLCgiTnVsbCBzbWIgc2Vzc2lvbiIpKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmKHNlcy0+c2VydmVyID09IE5VTEwpIHsKKwkJY0VSUk9SKDEsKCJOdWxsIHRjcCBzZXNzaW9uIikpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBFbnN1cmUgdGhhdCB3ZSBkbyBub3Qgc2VuZCBtb3JlIHRoYW4gNTAgb3ZlcmxhcHBpbmcgcmVxdWVzdHMgCisJICAgdG8gdGhlIHNhbWUgc2VydmVyLiBXZSBtYXkgbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZSBsYXRlciBvcgorCSAgIHVzZSBzZXMtPm1heFJlcSAqLworCWlmKGxvbmdfb3AgPT0gLTEpIHsKKwkJLyogb3Bsb2NrIGJyZWFrcyBtdXN0IG5vdCBiZSBoZWxkIHVwICovCisJCWF0b21pY19pbmMoJnNlcy0+c2VydmVyLT5pbkZsaWdodCk7CisJfSBlbHNlIHsKKwkJc3Bpbl9sb2NrKCZHbG9iYWxNaWRfTG9jayk7IAorCQl3aGlsZSgxKSB7ICAgICAgICAKKwkJCWlmKGF0b21pY19yZWFkKCZzZXMtPnNlcnZlci0+aW5GbGlnaHQpID49IGNpZnNfbWF4X3BlbmRpbmcpeworCQkJCXNwaW5fdW5sb2NrKCZHbG9iYWxNaWRfTG9jayk7CisJCQkJd2FpdF9ldmVudChzZXMtPnNlcnZlci0+cmVxdWVzdF9xLAorCQkJCQlhdG9taWNfcmVhZCgmc2VzLT5zZXJ2ZXItPmluRmxpZ2h0KQorCQkJCQkgPCBjaWZzX21heF9wZW5kaW5nKTsKKwkJCQlzcGluX2xvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYoc2VzLT5zZXJ2ZXItPnRjcFN0YXR1cyA9PSBDaWZzRXhpdGluZykgeworCQkJCQlzcGluX3VubG9jaygmR2xvYmFsTWlkX0xvY2spOworCQkJCQlyZXR1cm4gLUVOT0VOVDsKKwkJCQl9CisKKwkJCS8qIGNhbiBub3QgY291bnQgbG9ja2luZyBjb21tYW5kcyBhZ2FpbnN0IHRvdGFsIHNpbmNlCisJCQkgICB0aGV5IGFyZSBhbGxvd2VkIHRvIGJsb2NrIG9uIHNlcnZlciAqLworCQkJCQkKKwkJCQlpZihsb25nX29wIDwgMykgeworCQkJCS8qIHVwZGF0ZSAjIG9mIHJlcXVlc3RzIG9uIHRoZSB3aXJlIHRvIHNlcnZlciAqLworCQkJCQlhdG9taWNfaW5jKCZzZXMtPnNlcnZlci0+aW5GbGlnaHQpOworCQkJCX0KKwkJCQlzcGluX3VubG9jaygmR2xvYmFsTWlkX0xvY2spOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCS8qIG1ha2Ugc3VyZSB0aGF0IHdlIHNpZ24gaW4gdGhlIHNhbWUgb3JkZXIgdGhhdCB3ZSBzZW5kIG9uIHRoaXMgc29ja2V0IAorCSAgIGFuZCBhdm9pZCByYWNlcyBpbnNpZGUgdGNwIHNlbmRtc2cgY29kZSB0aGF0IGNvdWxkIGNhdXNlIGNvcnJ1cHRpb24KKwkgICBvZiBzbWIgZGF0YSAqLworCisJZG93bigmc2VzLT5zZXJ2ZXItPnRjcFNlbSk7IAorCisJaWYgKHNlcy0+c2VydmVyLT50Y3BTdGF0dXMgPT0gQ2lmc0V4aXRpbmcpIHsKKwkJcmMgPSAtRU5PRU5UOworCQlnb3RvIG91dF91bmxvY2s7CisJfSBlbHNlIGlmIChzZXMtPnNlcnZlci0+dGNwU3RhdHVzID09IENpZnNOZWVkUmVjb25uZWN0KSB7CisJCWNGWUkoMSwoInRjcCBzZXNzaW9uIGRlYWQgLSByZXR1cm4gdG8gY2FsbGVyIHRvIHJldHJ5IikpOworCQlyYyA9IC1FQUdBSU47CisJCWdvdG8gb3V0X3VubG9jazsKKwl9IGVsc2UgaWYgKHNlcy0+c3RhdHVzICE9IENpZnNHb29kKSB7CisJCS8qIGNoZWNrIGlmIFNNQiBzZXNzaW9uIGlzIGJhZCBiZWNhdXNlIHdlIGFyZSBzZXR0aW5nIGl0IHVwICovCisJCWlmKChpbl9idWYtPkNvbW1hbmQgIT0gU01CX0NPTV9TRVNTSU9OX1NFVFVQX0FORFgpICYmIAorCQkJKGluX2J1Zi0+Q29tbWFuZCAhPSBTTUJfQ09NX05FR09USUFURSkpIHsKKwkJCXJjID0gLUVBR0FJTjsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfSAvKiBlbHNlIG9rIC0gd2UgYXJlIHNldHRpbmcgdXAgc2Vzc2lvbiAqLworCX0KKwltaWRRID0gQWxsb2NNaWRRRW50cnkoaW5fYnVmLCBzZXMpOworCWlmIChtaWRRID09IE5VTEwpIHsKKwkJdXAoJnNlcy0+c2VydmVyLT50Y3BTZW0pOworCQkvKiBJZiBub3QgbG9jayByZXEsIHVwZGF0ZSAjIG9mIHJlcXVlc3RzIG9uIHdpcmUgdG8gc2VydmVyICovCisJCWlmKGxvbmdfb3AgPCAzKSB7CisJCQlhdG9taWNfZGVjKCZzZXMtPnNlcnZlci0+aW5GbGlnaHQpOyAKKwkJCXdha2VfdXAoJnNlcy0+c2VydmVyLT5yZXF1ZXN0X3EpOworCQl9CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChpbl9idWYtPnNtYl9idWZfbGVuZ3RoID4gQ0lGU01heEJ1ZlNpemUgKyBNQVhfQ0lGU19IRFJfU0laRSAtIDQpIHsKKwkJdXAoJnNlcy0+c2VydmVyLT50Y3BTZW0pOworCQljRVJST1IoMSwKKwkJICAgICAgICgiSWxsZWdhbCBsZW5ndGgsIGdyZWF0ZXIgdGhhbiBtYXhpbXVtIGZyYW1lLCAlZCAiLAorCQkJaW5fYnVmLT5zbWJfYnVmX2xlbmd0aCkpOworCQlEZWxldGVNaWRRRW50cnkobWlkUSk7CisJCS8qIElmIG5vdCBsb2NrIHJlcSwgdXBkYXRlICMgb2YgcmVxdWVzdHMgb24gd2lyZSB0byBzZXJ2ZXIgKi8KKwkJaWYobG9uZ19vcCA8IDMpIHsKKwkJCWF0b21pY19kZWMoJnNlcy0+c2VydmVyLT5pbkZsaWdodCk7IAorCQkJd2FrZV91cCgmc2VzLT5zZXJ2ZXItPnJlcXVlc3RfcSk7CisJCX0KKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmMgPSBjaWZzX3NpZ25fc21iKGluX2J1Ziwgc2VzLCAmbWlkUS0+c2VxdWVuY2VfbnVtYmVyKTsKKworCW1pZFEtPm1pZFN0YXRlID0gTUlEX1JFUVVFU1RfU1VCTUlUVEVEOworCXJjID0gc21iX3NlbmQoc2VzLT5zZXJ2ZXItPnNzb2NrZXQsIGluX2J1ZiwgaW5fYnVmLT5zbWJfYnVmX2xlbmd0aCwKKwkJICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSAmKHNlcy0+c2VydmVyLT5hZGRyLnNvY2tBZGRyKSk7CisJaWYocmMgPCAwKSB7CisJCURlbGV0ZU1pZFFFbnRyeShtaWRRKTsKKwkJdXAoJnNlcy0+c2VydmVyLT50Y3BTZW0pOworCQkvKiBJZiBub3QgbG9jayByZXEsIHVwZGF0ZSAjIG9mIHJlcXVlc3RzIG9uIHdpcmUgdG8gc2VydmVyICovCisJCWlmKGxvbmdfb3AgPCAzKSB7CisJCQlhdG9taWNfZGVjKCZzZXMtPnNlcnZlci0+aW5GbGlnaHQpOyAKKwkJCXdha2VfdXAoJnNlcy0+c2VydmVyLT5yZXF1ZXN0X3EpOworCQl9CisJCXJldHVybiByYzsKKwl9IGVsc2UKKwkJdXAoJnNlcy0+c2VydmVyLT50Y3BTZW0pOworCWlmIChsb25nX29wID09IC0xKQorCQlnb3RvIGNpZnNfbm9fcmVzcG9uc2VfZXhpdDsKKwllbHNlIGlmIChsb25nX29wID09IDIpIC8qIHdyaXRlcyBwYXN0IGVuZCBvZiBmaWxlIGNhbiB0YWtlIGxvb29vb25nIHRpbWUgKi8KKwkJdGltZW91dCA9IDMwMCAqIEhaOworCWVsc2UgaWYgKGxvbmdfb3AgPT0gMSkKKwkJdGltZW91dCA9IDQ1ICogSFo7IC8qIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gCisJCQlzZXJ2ZXJzIG9wbG9jayBicmVhayB0aW1lb3V0IChhYm91dCA0MyBzZWNvbmRzKSAqLworCWVsc2UgaWYgKGxvbmdfb3AgPiAyKSB7CisJCXRpbWVvdXQgPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKKwl9IGVsc2UKKwkJdGltZW91dCA9IDE1ICogSFo7CisJLyogd2FpdCBmb3IgMTUgc2Vjb25kcyBvciB1bnRpbCB3b2tlbiB1cCBkdWUgdG8gcmVzcG9uc2UgYXJyaXZpbmcgb3IgCisJICAgZHVlIHRvIGxhc3QgY29ubmVjdGlvbiB0byB0aGlzIHNlcnZlciBiZWluZyB1bm1vdW50ZWQgKi8KKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJLyogaWYgc2lnbmFsIHBlbmRpbmcgZG8gbm90IGhvbGQgdXAgdXNlciBmb3IgZnVsbCBzbWIgdGltZW91dAorCQlidXQgd2Ugc3RpbGwgZ2l2ZSByZXNwb25zZSBhIGNoYW5nZSB0byBjb21wbGV0ZSAqLworCQl0aW1lb3V0ID0gMiAqIEhaOworCX0gICAKKworCS8qIE5vIHVzZXIgaW50ZXJydXB0cyBpbiB3YWl0IC0gd3JlYWtzIGhhdm9jIHdpdGggcGVyZm9ybWFuY2UgKi8KKwlpZih0aW1lb3V0ICE9IE1BWF9TQ0hFRFVMRV9USU1FT1VUKSB7CisJCXRpbWVvdXQgKz0gamlmZmllczsKKwkJd2FpdF9ldmVudChzZXMtPnNlcnZlci0+cmVzcG9uc2VfcSwKKwkJCSghKG1pZFEtPm1pZFN0YXRlICYgTUlEX1JFUVVFU1RfU1VCTUlUVEVEKSkgfHwgCisJCQl0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpIHx8IAorCQkJKChzZXMtPnNlcnZlci0+dGNwU3RhdHVzICE9IENpZnNHb29kKSAmJgorCQkJIChzZXMtPnNlcnZlci0+dGNwU3RhdHVzICE9IENpZnNOZXcpKSk7CisJfSBlbHNlIHsKKwkJd2FpdF9ldmVudChzZXMtPnNlcnZlci0+cmVzcG9uc2VfcSwKKwkJCSghKG1pZFEtPm1pZFN0YXRlICYgTUlEX1JFUVVFU1RfU1VCTUlUVEVEKSkgfHwgCisJCQkoKHNlcy0+c2VydmVyLT50Y3BTdGF0dXMgIT0gQ2lmc0dvb2QpICYmCisJCQkgKHNlcy0+c2VydmVyLT50Y3BTdGF0dXMgIT0gQ2lmc05ldykpKTsKKwl9CisKKwlzcGluX2xvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwlpZiAobWlkUS0+cmVzcF9idWYpIHsKKwkJc3Bpbl91bmxvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwkJcmVjZWl2ZV9sZW4gPSBiZTMyX3RvX2NwdSgqKF9fYmUzMiAqKW1pZFEtPnJlc3BfYnVmKTsKKwl9IGVsc2UgeworCQljRVJST1IoMSwoIk5vIHJlc3BvbnNlIGJ1ZmZlciIpKTsKKwkJaWYobWlkUS0+bWlkU3RhdGUgPT0gTUlEX1JFUVVFU1RfU1VCTUlUVEVEKSB7CisJCQlpZihzZXMtPnNlcnZlci0+dGNwU3RhdHVzID09IENpZnNFeGl0aW5nKQorCQkJCXJjID0gLUVIT1NURE9XTjsKKwkJCWVsc2UgeworCQkJCXNlcy0+c2VydmVyLT50Y3BTdGF0dXMgPSBDaWZzTmVlZFJlY29ubmVjdDsKKwkJCQltaWRRLT5taWRTdGF0ZSA9IE1JRF9SRVRSWV9ORUVERUQ7CisJCQl9CisJCX0KKworCQlpZiAocmMgIT0gLUVIT1NURE9XTikgeworCQkJaWYobWlkUS0+bWlkU3RhdGUgPT0gTUlEX1JFVFJZX05FRURFRCkgeworCQkJCXJjID0gLUVBR0FJTjsKKwkJCQljRllJKDEsKCJtYXJraW5nIHJlcXVlc3QgZm9yIHJldHJ5IikpOworCQkJfSBlbHNlIHsKKwkJCQlyYyA9IC1FSU87CisJCQl9CisJCX0KKwkJc3Bpbl91bmxvY2soJkdsb2JhbE1pZF9Mb2NrKTsKKwkJRGVsZXRlTWlkUUVudHJ5KG1pZFEpOworCQkvKiBJZiBub3QgbG9jayByZXEsIHVwZGF0ZSAjIG9mIHJlcXVlc3RzIG9uIHdpcmUgdG8gc2VydmVyICovCisJCWlmKGxvbmdfb3AgPCAzKSB7CisJCQlhdG9taWNfZGVjKCZzZXMtPnNlcnZlci0+aW5GbGlnaHQpOyAKKwkJCXdha2VfdXAoJnNlcy0+c2VydmVyLT5yZXF1ZXN0X3EpOworCQl9CisJCXJldHVybiByYzsKKwl9CisgIAorCWlmIChyZWNlaXZlX2xlbiA+IENJRlNNYXhCdWZTaXplICsgTUFYX0NJRlNfSERSX1NJWkUpIHsKKwkJY0VSUk9SKDEsCisJCSAgICAgICAoIkZyYW1lIHRvbyBsYXJnZSByZWNlaXZlZC4gIExlbmd0aDogJWQgIFhpZDogJWQiLAorCQkJcmVjZWl2ZV9sZW4sIHhpZCkpOworCQlyYyA9IC1FSU87CisJfSBlbHNlIHsJCS8qIHJjdmQgZnJhbWUgaXMgb2sgKi8KKworCQlpZiAobWlkUS0+cmVzcF9idWYgJiYgb3V0X2J1ZgorCQkgICAgJiYgKG1pZFEtPm1pZFN0YXRlID09IE1JRF9SRVNQT05TRV9SRUNFSVZFRCkpIHsKKwkJCW91dF9idWYtPnNtYl9idWZfbGVuZ3RoID0gcmVjZWl2ZV9sZW47CisJCQltZW1jcHkoKGNoYXIgKilvdXRfYnVmICsgNCwKKwkJCSAgICAgICAoY2hhciAqKW1pZFEtPnJlc3BfYnVmICsgNCwKKwkJCSAgICAgICByZWNlaXZlX2xlbik7CisKKwkJCWR1bXBfc21iKG91dF9idWYsIDkyKTsKKwkJCS8qIGNvbnZlcnQgdGhlIGxlbmd0aCBpbnRvIGEgbW9yZSB1c2FibGUgZm9ybSAqLworCQkJaWYoKHJlY2VpdmVfbGVuID4gMjQpICYmCisJCQkgICAoc2VzLT5zZXJ2ZXItPnNlY01vZGUgJiAoU0VDTU9ERV9TSUdOX1JFUVVJUkVEIHwgU0VDTU9ERV9TSUdOX0VOQUJMRUQpKSkgeworCQkJCXJjID0gY2lmc192ZXJpZnlfc2lnbmF0dXJlKG91dF9idWYsIHNlcy0+bWFjX3NpZ25pbmdfa2V5LG1pZFEtPnNlcXVlbmNlX251bWJlcik7IC8qIEJCIGZpeCBCQiAqLworCQkJCWlmKHJjKQorCQkJCQljRllJKDEsKCJVbmV4cGVjdGVkIHNpZ25hdHVyZSByZWNlaXZlZCBmcm9tIHNlcnZlciIpKTsKKwkJCX0KKworCQkJKnBieXRlc19yZXR1cm5lZCA9IG91dF9idWYtPnNtYl9idWZfbGVuZ3RoOworCisJCQkvKiBCQiBzcGVjaWFsIGNhc2UgcmVjb25uZWN0IHRpZCBhbmQgcmVjb25uZWN0IHVpZCBoZXJlPyAqLworCQkJcmMgPSBtYXBfc21iX3RvX2xpbnV4X2Vycm9yKG91dF9idWYpOworCisJCQkvKiBjb252ZXJ0IEJ5dGVDb3VudCBpZiBuZWNlc3NhcnkgKi8KKwkJCWlmIChyZWNlaXZlX2xlbiA+PQorCQkJICAgIHNpemVvZiAoc3RydWN0IHNtYl9oZHIpIC0KKwkJCSAgICA0IC8qIGRvIG5vdCBjb3VudCBSRkMxMDAxIGhlYWRlciAqLyAgKworCQkJICAgICgyICogb3V0X2J1Zi0+V29yZENvdW50KSArIDIgLyogYmNjICovICkKKwkJCQlCQ0Mob3V0X2J1ZikgPSBsZTE2X3RvX2NwdShCQ0Mob3V0X2J1ZikpOworCQl9IGVsc2UgeworCQkJcmMgPSAtRUlPOworCQkJY0ZZSSgxLCgiQmFkIE1JRCBzdGF0ZT8gIikpOworCQl9CisJfQorY2lmc19ub19yZXNwb25zZV9leGl0OgorCURlbGV0ZU1pZFFFbnRyeShtaWRRKTsKKworCWlmKGxvbmdfb3AgPCAzKSB7CisJCWF0b21pY19kZWMoJnNlcy0+c2VydmVyLT5pbkZsaWdodCk7IAorCQl3YWtlX3VwKCZzZXMtPnNlcnZlci0+cmVxdWVzdF9xKTsKKwl9CisKKwlyZXR1cm4gcmM7CisKK291dF91bmxvY2s6CisJdXAoJnNlcy0+c2VydmVyLT50Y3BTZW0pOworCS8qIElmIG5vdCBsb2NrIHJlcSwgdXBkYXRlICMgb2YgcmVxdWVzdHMgb24gd2lyZSB0byBzZXJ2ZXIgKi8KKwlpZihsb25nX29wIDwgMykgeworCQlhdG9taWNfZGVjKCZzZXMtPnNlcnZlci0+aW5GbGlnaHQpOyAKKwkJd2FrZV91cCgmc2VzLT5zZXJ2ZXItPnJlcXVlc3RfcSk7CisJfQorCisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvZnMvY2lmcy94YXR0ci5jIGIvZnMvY2lmcy94YXR0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0OWFmYTEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jaWZzL3hhdHRyLmMKQEAgLTAsMCArMSwzMzQgQEAKKy8qCisgKiAgIGZzL2NpZnMveGF0dHIuYworICoKKyAqICAgQ29weXJpZ2h0IChjKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzICBDb3JwLiwgMjAwMworICogICBBdXRob3Iocyk6IFN0ZXZlIEZyZW5jaCAoc2ZyZW5jaEB1cy5pYm0uY29tKQorICoKKyAqICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiAgIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcG9zaXhfYWNsX3hhdHRyLmg+CisjaW5jbHVkZSAiY2lmc2ZzLmgiCisjaW5jbHVkZSAiY2lmc3BkdS5oIgorI2luY2x1ZGUgImNpZnNnbG9iLmgiCisjaW5jbHVkZSAiY2lmc3Byb3RvLmgiCisjaW5jbHVkZSAiY2lmc19kZWJ1Zy5oIgorCisjZGVmaW5lIE1BWF9FQV9WQUxVRV9TSVpFIDY1NTM1CisjZGVmaW5lIENJRlNfWEFUVFJfRE9TX0FUVFJJQiAidXNlci5Eb3NBdHRyaWIiCisjZGVmaW5lIENJRlNfWEFUVFJfVVNFUl9QUkVGSVggInVzZXIuIgorI2RlZmluZSBDSUZTX1hBVFRSX1NZU1RFTV9QUkVGSVggInN5c3RlbS4iCisjZGVmaW5lIENJRlNfWEFUVFJfT1MyX1BSRUZJWCAib3MyLiIKKyNkZWZpbmUgQ0lGU19YQVRUUl9TRUNVUklUWV9QUkVGSVggIi5zZWN1cml0eSIKKyNkZWZpbmUgQ0lGU19YQVRUUl9UUlVTVEVEX1BSRUZJWCAidHJ1c3RlZC4iCisjZGVmaW5lIFhBVFRSX1RSVVNURURfUFJFRklYX0xFTiAgOAorI2RlZmluZSBYQVRUUl9TRUNVUklUWV9QUkVGSVhfTEVOIDkKKy8qIEJCIG5lZWQgdG8gYWRkIHNlcnZlciAoU2FtYmEgZS5nKSBzdXBwb3J0IGZvciBzZWN1cml0eSBhbmQgdHJ1c3RlZCBwcmVmaXggKi8KKyAgCisKKworaW50IGNpZnNfcmVtb3ZleGF0dHIoc3RydWN0IGRlbnRyeSAqIGRpcmVudHJ5LCBjb25zdCBjaGFyICogZWFfbmFtZSkKK3sKKwlpbnQgcmMgPSAtRU9QTk9UU1VQUDsKKyNpZmRlZiBDT05GSUdfQ0lGU19YQVRUUgorCWludCB4aWQ7CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYjsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKKwljaGFyICogZnVsbF9wYXRoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCWlmKGRpcmVudHJ5ID09IE5VTEwpCisJCXJldHVybiAtRUlPOworCWlmKGRpcmVudHJ5LT5kX2lub2RlID09IE5VTEwpCisJCXJldHVybiAtRUlPOworCXNiID0gZGlyZW50cnktPmRfaW5vZGUtPmlfc2I7CisJaWYoc2IgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU87CisJeGlkID0gR2V0WGlkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJY2lmc19zYiA9IENJRlNfU0Ioc2IpOworCXBUY29uID0gY2lmc19zYi0+dGNvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwlkb3duKCZzYi0+c192ZnNfcmVuYW1lX3NlbSk7CisJZnVsbF9wYXRoID0gYnVpbGRfcGF0aF9mcm9tX2RlbnRyeShkaXJlbnRyeSk7CisJdXAoJnNiLT5zX3Zmc19yZW5hbWVfc2VtKTsKKwlpZihmdWxsX3BhdGggPT0gTlVMTCkgeworCQlGcmVlWGlkKHhpZCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlpZihlYV9uYW1lID09IE5VTEwpIHsKKwkJY0ZZSSgxLCgiTnVsbCB4YXR0ciBuYW1lcyBub3Qgc3VwcG9ydGVkIikpOworCX0gZWxzZSBpZihzdHJuY21wKGVhX25hbWUsQ0lGU19YQVRUUl9VU0VSX1BSRUZJWCw1KQorCQkmJiAoc3RybmNtcChlYV9uYW1lLENJRlNfWEFUVFJfT1MyX1BSRUZJWCw0KSkpIHsKKwkJY0ZZSSgxLCgiaWxsZWdhbCB4YXR0ciBuYW1lc3BhY2UgJXMgKG9ubHkgdXNlciBuYW1lc3BhY2Ugc3VwcG9ydGVkKSIsZWFfbmFtZSkpOworCQkvKiBCQiB3aGF0IGlmIG5vIG5hbWVzcGFjZSBwcmVmaXg/ICovCisJCS8qIFNob3VsZCB3ZSBqdXN0IHBhc3MgdGhlbSB0byBzZXJ2ZXIsIGV4Y2VwdCBmb3IKKwkJc3lzdGVtIGFuZCBwZXJoYXBzIHNlY3VyaXR5IHByZWZpeGVzPyAqLworCX0gZWxzZSB7CisJCWlmKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9OT19YQVRUUikKKwkJCWdvdG8gcmVtb3ZlX2VhX2V4aXQ7CisKKwkJZWFfbmFtZSs9NTsgLyogc2tpcCBwYXN0IHVzZXIuIHByZWZpeCAqLworCQlyYyA9IENJRlNTTUJTZXRFQSh4aWQscFRjb24sZnVsbF9wYXRoLGVhX25hbWUsTlVMTCwKKwkJCShfX3UxNikwLCBjaWZzX3NiLT5sb2NhbF9ubHMpOworCX0KK3JlbW92ZV9lYV9leGl0OgorCWlmIChmdWxsX3BhdGgpCisJCWtmcmVlKGZ1bGxfcGF0aCk7CisJRnJlZVhpZCh4aWQpOworI2VuZGlmCisJcmV0dXJuIHJjOworfQorCitpbnQgY2lmc19zZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICogZGlyZW50cnksIGNvbnN0IGNoYXIgKiBlYV9uYW1lLAorICAgICAgICBjb25zdCB2b2lkICogZWFfdmFsdWUsIHNpemVfdCB2YWx1ZV9zaXplLCBpbnQgZmxhZ3MpCit7CisJaW50IHJjID0gLUVPUE5PVFNVUFA7CisjaWZkZWYgQ09ORklHX0NJRlNfWEFUVFIKKwlpbnQgeGlkOworCXN0cnVjdCBjaWZzX3NiX2luZm8gKmNpZnNfc2I7CisJc3RydWN0IGNpZnNUY29uSW5mbyAqcFRjb247CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJY2hhciAqIGZ1bGxfcGF0aDsKKworCWlmKGRpcmVudHJ5ID09IE5VTEwpCisJCXJldHVybiAtRUlPOworCWlmKGRpcmVudHJ5LT5kX2lub2RlID09IE5VTEwpCisJCXJldHVybiAtRUlPOworCXNiID0gZGlyZW50cnktPmRfaW5vZGUtPmlfc2I7CisJaWYoc2IgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU87CisJeGlkID0gR2V0WGlkKCk7CisKKwljaWZzX3NiID0gQ0lGU19TQihzYik7CisJcFRjb24gPSBjaWZzX3NiLT50Y29uOworCisJZG93bigmc2ItPnNfdmZzX3JlbmFtZV9zZW0pOworCWZ1bGxfcGF0aCA9IGJ1aWxkX3BhdGhfZnJvbV9kZW50cnkoZGlyZW50cnkpOworCXVwKCZzYi0+c192ZnNfcmVuYW1lX3NlbSk7CisJaWYoZnVsbF9wYXRoID09IE5VTEwpIHsKKwkJRnJlZVhpZCh4aWQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLyogcmV0dXJuIGRvcyBhdHRyaWJ1dGVzIGFzIHBzZXVkbyB4YXR0ciAqLworCS8qIHJldHVybiBhbHQgbmFtZSBpZiBhdmFpbGFibGUgYXMgcHNldWRvIGF0dHIgKi8KKworCS8qIGlmIHByb2MvZnMvY2lmcy9zdHJlYW1zdG94YXR0ciBpcyBzZXQgdGhlbgorCQlzZWFyY2ggc2VydmVyIGZvciBFQXMgb3Igc3RyZWFtcyB0byAKKwkJcmV0dXJucyBhcyB4YXR0cnMgKi8KKwlpZih2YWx1ZV9zaXplID4gTUFYX0VBX1ZBTFVFX1NJWkUpIHsKKwkJY0ZZSSgxLCgic2l6ZSBvZiBFQSB2YWx1ZSB0b28gbGFyZ2UiKSk7CisJCWlmKGZ1bGxfcGF0aCkKKwkJCWtmcmVlKGZ1bGxfcGF0aCk7CisJCUZyZWVYaWQoeGlkKTsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCWlmKGVhX25hbWUgPT0gTlVMTCkgeworCQljRllJKDEsKCJOdWxsIHhhdHRyIG5hbWVzIG5vdCBzdXBwb3J0ZWQiKSk7CisJfSBlbHNlIGlmKHN0cm5jbXAoZWFfbmFtZSxDSUZTX1hBVFRSX1VTRVJfUFJFRklYLDUpID09IDApIHsKKwkJaWYoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX05PX1hBVFRSKQorCQkJZ290byBzZXRfZWFfZXhpdDsKKwkJaWYoc3RybmNtcChlYV9uYW1lLENJRlNfWEFUVFJfRE9TX0FUVFJJQiwxNCkgPT0gMCkgeworCQkJY0ZZSSgxLCgiYXR0ZW1wdCB0byBzZXQgY2lmcyBpbm9kZSBtZXRhZGF0YSIpKTsKKwkJfQorCQllYV9uYW1lICs9IDU7IC8qIHNraXAgcGFzdCB1c2VyLiBwcmVmaXggKi8KKwkJcmMgPSBDSUZTU01CU2V0RUEoeGlkLHBUY29uLGZ1bGxfcGF0aCxlYV9uYW1lLGVhX3ZhbHVlLAorCQkJKF9fdTE2KXZhbHVlX3NpemUsIGNpZnNfc2ItPmxvY2FsX25scyk7CisJfSBlbHNlIGlmKHN0cm5jbXAoZWFfbmFtZSwgQ0lGU19YQVRUUl9PUzJfUFJFRklYLDQpID09IDApIHsKKwkJaWYoY2lmc19zYi0+bW50X2NpZnNfZmxhZ3MgJiBDSUZTX01PVU5UX05PX1hBVFRSKQorCQkJZ290byBzZXRfZWFfZXhpdDsKKworCQllYV9uYW1lICs9IDQ7IC8qIHNraXAgcGFzdCBvczIuIHByZWZpeCAqLworCQlyYyA9IENJRlNTTUJTZXRFQSh4aWQscFRjb24sZnVsbF9wYXRoLGVhX25hbWUsZWFfdmFsdWUsCisJCQkoX191MTYpdmFsdWVfc2l6ZSwgY2lmc19zYi0+bG9jYWxfbmxzKTsKKwl9IGVsc2UgeworCQlpbnQgdGVtcDsgCisJCXRlbXAgPSBzdHJuY21wKGVhX25hbWUsUE9TSVhfQUNMX1hBVFRSX0FDQ0VTUywKKwkJCXN0cmxlbihQT1NJWF9BQ0xfWEFUVFJfQUNDRVNTKSk7CisJCWlmICh0ZW1wID09IDApIHsKKyNpZmRlZiBDT05GSUdfQ0lGU19QT1NJWAorCQkJcmMgPSBDSUZTU01CU2V0UG9zaXhBQ0woeGlkLCBwVGNvbixmdWxsX3BhdGgsZWFfdmFsdWUsCisJCQkJKGNvbnN0IGludCl2YWx1ZV9zaXplLCBBQ0xfVFlQRV9BQ0NFU1MsCisJCQkJY2lmc19zYi0+bG9jYWxfbmxzKTsKKwkJCWNGWUkoMSwoInNldCBQT1NJWCBBQ0wgcmMgJWQiLHJjKSk7CisjZWxzZQorCQkJY0ZZSSgxLCgic2V0IFBPU0lYIEFDTCBub3Qgc3VwcG9ydGVkIikpOworI2VuZGlmCisJCX0gZWxzZSBpZihzdHJuY21wKGVhX25hbWUsUE9TSVhfQUNMX1hBVFRSX0RFRkFVTFQsc3RybGVuKFBPU0lYX0FDTF9YQVRUUl9ERUZBVUxUKSkgPT0gMCkgeworI2lmZGVmIENPTkZJR19DSUZTX1BPU0lYCisJCQlyYyA9IENJRlNTTUJTZXRQb3NpeEFDTCh4aWQsIHBUY29uLGZ1bGxfcGF0aCxlYV92YWx1ZSwKKwkJCQkoY29uc3QgaW50KXZhbHVlX3NpemUsIEFDTF9UWVBFX0RFRkFVTFQsCisJCQkJY2lmc19zYi0+bG9jYWxfbmxzKTsKKwkJCWNGWUkoMSwoInNldCBQT1NJWCBkZWZhdWx0IEFDTCByYyAlZCIscmMpKTsKKyNlbHNlCisJCQljRllJKDEsKCJzZXQgZGVmYXVsdCBQT1NJWCBBQ0wgbm90IHN1cHBvcnRlZCIpKTsKKyNlbmRpZgorCQl9IGVsc2UgeworCQkJY0ZZSSgxLCgiaWxsZWdhbCB4YXR0ciByZXF1ZXN0ICVzIChvbmx5IHVzZXIgbmFtZXNwYWNlIHN1cHBvcnRlZCkiLGVhX25hbWUpKTsKKwkJICAvKiBCQiB3aGF0IGlmIG5vIG5hbWVzcGFjZSBwcmVmaXg/ICovCisJCSAgLyogU2hvdWxkIHdlIGp1c3QgcGFzcyB0aGVtIHRvIHNlcnZlciwgZXhjZXB0IGZvciAKKwkJICBzeXN0ZW0gYW5kIHBlcmhhcHMgc2VjdXJpdHkgcHJlZml4ZXM/ICovCisJCX0KKwl9CisKK3NldF9lYV9leGl0OgorCWlmIChmdWxsX3BhdGgpCisJCWtmcmVlKGZ1bGxfcGF0aCk7CisJRnJlZVhpZCh4aWQpOworI2VuZGlmCisJcmV0dXJuIHJjOworfQorCitzc2l6ZV90IGNpZnNfZ2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqIGRpcmVudHJ5LCBjb25zdCBjaGFyICogZWFfbmFtZSwKKyAgICAgICAgIHZvaWQgKiBlYV92YWx1ZSwgc2l6ZV90IGJ1Zl9zaXplKQoreworCXNzaXplX3QgcmMgPSAtRU9QTk9UU1VQUDsKKyNpZmRlZiBDT05GSUdfQ0lGU19YQVRUUgorCWludCB4aWQ7CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYjsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKKwljaGFyICogZnVsbF9wYXRoOworCisJaWYoZGlyZW50cnkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU87CisJaWYoZGlyZW50cnktPmRfaW5vZGUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU87CisJc2IgPSBkaXJlbnRyeS0+ZF9pbm9kZS0+aV9zYjsKKwlpZihzYiA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTzsKKworCXhpZCA9IEdldFhpZCgpOworCisJY2lmc19zYiA9IENJRlNfU0Ioc2IpOworCXBUY29uID0gY2lmc19zYi0+dGNvbjsKKworCWRvd24oJnNiLT5zX3Zmc19yZW5hbWVfc2VtKTsKKwlmdWxsX3BhdGggPSBidWlsZF9wYXRoX2Zyb21fZGVudHJ5KGRpcmVudHJ5KTsKKwl1cCgmc2ItPnNfdmZzX3JlbmFtZV9zZW0pOworCWlmKGZ1bGxfcGF0aCA9PSBOVUxMKSB7CisJCUZyZWVYaWQoeGlkKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8qIHJldHVybiBkb3MgYXR0cmlidXRlcyBhcyBwc2V1ZG8geGF0dHIgKi8KKwkvKiByZXR1cm4gYWx0IG5hbWUgaWYgYXZhaWxhYmxlIGFzIHBzZXVkbyBhdHRyICovCisJaWYoZWFfbmFtZSA9PSBOVUxMKSB7CisJCWNGWUkoMSwoIk51bGwgeGF0dHIgbmFtZXMgbm90IHN1cHBvcnRlZCIpKTsKKwl9IGVsc2UgaWYoc3RybmNtcChlYV9uYW1lLENJRlNfWEFUVFJfVVNFUl9QUkVGSVgsNSkgPT0gMCkgeworCQlpZihjaWZzX3NiLT5tbnRfY2lmc19mbGFncyAmIENJRlNfTU9VTlRfTk9fWEFUVFIpCisJCQlnb3RvIGdldF9lYV9leGl0OworCisJCWlmKHN0cm5jbXAoZWFfbmFtZSxDSUZTX1hBVFRSX0RPU19BVFRSSUIsMTQpID09IDApIHsKKwkJCWNGWUkoMSwoImF0dGVtcHQgdG8gcXVlcnkgY2lmcyBpbm9kZSBtZXRhZGF0YSIpKTsKKwkJCS8qIHJldmFsaWRhdGUvZ2V0YXR0ciB0aGVuIHBvcHVsYXRlIGZyb20gaW5vZGUgKi8KKwkJfSAvKiBCQiBhZGQgZWxzZSB3aGVuIGFib3ZlIGlzIGltcGxlbWVudGVkICovCisJCWVhX25hbWUgKz0gNTsgLyogc2tpcCBwYXN0IHVzZXIuIHByZWZpeCAqLworCQlyYyA9IENJRlNTTUJRdWVyeUVBKHhpZCxwVGNvbixmdWxsX3BhdGgsZWFfbmFtZSxlYV92YWx1ZSwKKwkJCWJ1Zl9zaXplLCBjaWZzX3NiLT5sb2NhbF9ubHMpOworCX0gZWxzZSBpZihzdHJuY21wKGVhX25hbWUsIENJRlNfWEFUVFJfT1MyX1BSRUZJWCw0KSA9PSAwKSB7CisJCWlmKGNpZnNfc2ItPm1udF9jaWZzX2ZsYWdzICYgQ0lGU19NT1VOVF9OT19YQVRUUikKKwkJCWdvdG8gZ2V0X2VhX2V4aXQ7CisKKwkJZWFfbmFtZSArPSA0OyAvKiBza2lwIHBhc3Qgb3MyLiBwcmVmaXggKi8KKwkJcmMgPSBDSUZTU01CUXVlcnlFQSh4aWQscFRjb24sZnVsbF9wYXRoLGVhX25hbWUsZWFfdmFsdWUsCisJCQlidWZfc2l6ZSwgY2lmc19zYi0+bG9jYWxfbmxzKTsKKwl9IGVsc2UgaWYoc3RybmNtcChlYV9uYW1lLFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1Msc3RybGVuKFBPU0lYX0FDTF9YQVRUUl9BQ0NFU1MpKSA9PSAwKSB7CisjaWZkZWYgQ09ORklHX0NJRlNfUE9TSVgKKwkJcmMgPSBDSUZTU01CR2V0UG9zaXhBQ0woeGlkLCBwVGNvbiwgZnVsbF9wYXRoLAorCQkJCWVhX3ZhbHVlLCBidWZfc2l6ZSwgQUNMX1RZUEVfQUNDRVNTLCAKKwkJCQljaWZzX3NiLT5sb2NhbF9ubHMpOworI2Vsc2UgCisJCWNGWUkoMSwoInF1ZXJ5IFBPU0lYIEFDTCBub3Qgc3VwcG9ydGVkIHlldCIpKTsKKyNlbmRpZiAvKiBDT05GSUdfQ0lGU19QT1NJWCAqLworCX0gZWxzZSBpZihzdHJuY21wKGVhX25hbWUsUE9TSVhfQUNMX1hBVFRSX0RFRkFVTFQsc3RybGVuKFBPU0lYX0FDTF9YQVRUUl9ERUZBVUxUKSkgPT0gMCkgeworI2lmZGVmIENPTkZJR19DSUZTX1BPU0lYCisJCXJjID0gQ0lGU1NNQkdldFBvc2l4QUNMKHhpZCwgcFRjb24sIGZ1bGxfcGF0aCwKKwkJCQllYV92YWx1ZSwgYnVmX3NpemUsIEFDTF9UWVBFX0RFRkFVTFQsIAorCQkJCWNpZnNfc2ItPmxvY2FsX25scyk7CisjZWxzZSAKKwkJY0ZZSSgxLCgicXVlcnkgUE9TSVggZGVmYXVsdCBBQ0wgbm90IHN1cHBvcnRlZCB5ZXQiKSk7CisjZW5kaWYKKwl9IGVsc2UgaWYoc3RybmNtcChlYV9uYW1lLAorCQkgIENJRlNfWEFUVFJfVFJVU1RFRF9QUkVGSVgsWEFUVFJfVFJVU1RFRF9QUkVGSVhfTEVOKSA9PSAwKSB7CisJCWNGWUkoMSwoIlRydXN0ZWQgeGF0dHIgbmFtZXNwYWNlIG5vdCBzdXBwb3J0ZWQgeWV0IikpOworCX0gZWxzZSBpZihzdHJuY21wKGVhX25hbWUsCisJCSAgQ0lGU19YQVRUUl9TRUNVUklUWV9QUkVGSVgsWEFUVFJfU0VDVVJJVFlfUFJFRklYX0xFTikgPT0gMCkgeworCQljRllJKDEsKCJTZWN1cml0eSB4YXR0ciBuYW1lc3BhY2Ugbm90IHN1cHBvcnRlZCB5ZXQiKSk7CisJfSBlbHNlIHsKKwkJY0ZZSSgxLCgiaWxsZWdhbCB4YXR0ciBuYW1lIHJlcXVlc3QgJXMgKG9ubHkgdXNlciBuYW1lc3BhY2Ugc3VwcG9ydGVkKSIsZWFfbmFtZSkpOworCX0KKworCS8qIFdlIGNvdWxkIGFkZCBhbiBhZGRpdGlvbmFsIGNoZWNrIGZvciBzdHJlYW1zIGllIAorCSAgICBpZiBwcm9jL2ZzL2NpZnMvc3RyZWFtc3RveGF0dHIgaXMgc2V0IHRoZW4KKwkJc2VhcmNoIHNlcnZlciBmb3IgRUFzIG9yIHN0cmVhbXMgdG8gCisJCXJldHVybnMgYXMgeGF0dHJzICovCisKKwlpZihyYyA9PSAtRUlOVkFMKQorCQlyYyA9IC1FT1BOT1RTVVBQOyAKKworZ2V0X2VhX2V4aXQ6CisJaWYgKGZ1bGxfcGF0aCkKKwkJa2ZyZWUoZnVsbF9wYXRoKTsKKwlGcmVlWGlkKHhpZCk7CisjZW5kaWYKKwlyZXR1cm4gcmM7Cit9CisKK3NzaXplX3QgY2lmc19saXN0eGF0dHIoc3RydWN0IGRlbnRyeSAqIGRpcmVudHJ5LCBjaGFyICogZGF0YSwgc2l6ZV90IGJ1Zl9zaXplKQoreworCXNzaXplX3QgcmMgPSAtRU9QTk9UU1VQUDsKKyNpZmRlZiBDT05GSUdfQ0lGU19YQVRUUgorCWludCB4aWQ7CisJc3RydWN0IGNpZnNfc2JfaW5mbyAqY2lmc19zYjsKKwlzdHJ1Y3QgY2lmc1Rjb25JbmZvICpwVGNvbjsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKKwljaGFyICogZnVsbF9wYXRoOworCisJaWYoZGlyZW50cnkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU87CisJaWYoZGlyZW50cnktPmRfaW5vZGUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU87CisJc2IgPSBkaXJlbnRyeS0+ZF9pbm9kZS0+aV9zYjsKKwlpZihzYiA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTzsKKwl4aWQgPSBHZXRYaWQoKTsKKworCWNpZnNfc2IgPSBDSUZTX1NCKHNiKTsKKwlwVGNvbiA9IGNpZnNfc2ItPnRjb247CisKKwlkb3duKCZzYi0+c192ZnNfcmVuYW1lX3NlbSk7CisJZnVsbF9wYXRoID0gYnVpbGRfcGF0aF9mcm9tX2RlbnRyeShkaXJlbnRyeSk7CisJdXAoJnNiLT5zX3Zmc19yZW5hbWVfc2VtKTsKKwlpZihmdWxsX3BhdGggPT0gTlVMTCkgeworCQlGcmVlWGlkKHhpZCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvKiByZXR1cm4gZG9zIGF0dHJpYnV0ZXMgYXMgcHNldWRvIHhhdHRyICovCisJLyogcmV0dXJuIGFsdCBuYW1lIGlmIGF2YWlsYWJsZSBhcyBwc2V1ZG8gYXR0ciAqLworCisJLyogaWYgcHJvYy9mcy9jaWZzL3N0cmVhbXN0b3hhdHRyIGlzIHNldCB0aGVuCisJCXNlYXJjaCBzZXJ2ZXIgZm9yIEVBcyBvciBzdHJlYW1zIHRvIAorCQlyZXR1cm5zIGFzIHhhdHRycyAqLworCXJjID0gQ0lGU1NNQlFBbGxFQXMoeGlkLHBUY29uLGZ1bGxfcGF0aCxkYXRhLGJ1Zl9zaXplLAorCQkJCWNpZnNfc2ItPmxvY2FsX25scyk7CisKKwlpZiAoZnVsbF9wYXRoKQorCQlrZnJlZShmdWxsX3BhdGgpOworCUZyZWVYaWQoeGlkKTsKKyNlbmRpZgorCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2ZzL2NvZGEvTWFrZWZpbGUgYi9mcy9jb2RhL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMjJlNjEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jb2RhL01ha2VmaWxlCkBAIC0wLDAgKzEsMTIgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBDb2RhIGZpbGVzeXN0ZW0gcm91dGluZXMuCisjCisKK29iai0kKENPTkZJR19DT0RBX0ZTKSArPSBjb2RhLm8KKworY29kYS1vYmpzIDo9IHBzZGV2Lm8gY2FjaGUubyBjbm9kZS5vIGlub2RlLm8gZGlyLm8gZmlsZS5vIHVwY2FsbC5vIFwKKwkgICAgIGNvZGFfbGludXgubyBzeW1saW5rLm8gcGlvY3RsLm8gc3lzY3RsLm8gCisKKyMgSWYgeW91IHdhbnQgZGVidWdnaW5nIG91dHB1dCwgcGxlYXNlIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUuCisKKyMgRVhUUkFfQ0ZMQUdTICs9IC1EREVCVUcgLURERUJVR19TTUJfTUFMTE9DPTEKZGlmZiAtLWdpdCBhL2ZzL2NvZGEvY2FjaGUuYyBiL2ZzL2NvZGEvY2FjaGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDA3MmZkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvY29kYS9jYWNoZS5jCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogQ2FjaGUgb3BlcmF0aW9ucyBmb3IgQ29kYS4KKyAqIEZvciBMaW51eCAyLjE6IChDKSAxOTk3IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CisgKiBGb3IgTGludXggMi4zOiAoQykgMjAwMCBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQorICoKKyAqIENhcm5lZ2llIE1lbGxvbiBlbmNvdXJhZ2VzIHVzZXJzIG9mIHRoaXMgY29kZSB0byBjb250cmlidXRlIGltcHJvdmVtZW50cworICogdG8gdGhlIENvZGEgcHJvamVjdCBodHRwOi8vd3d3LmNvZGEuY3MuY211LmVkdS8gPGNvZGFAY3MuY211LmVkdT4uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9jb2RhLmg+CisjaW5jbHVkZSA8bGludXgvY29kYV9saW51eC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvZGFfcHNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9jb2RhX2ZzX2kuaD4KKyNpbmNsdWRlIDxsaW51eC9jb2RhX2NhY2hlLmg+CisKK3N0YXRpYyBhdG9taWNfdCBwZXJtaXNzaW9uX2Vwb2NoID0gQVRPTUlDX0lOSVQoMCk7CisKKy8qIHJlcGxhY2Ugb3IgZXh0ZW5kIGFuIGFjbCBjYWNoZSBoaXQgKi8KK3ZvaWQgY29kYV9jYWNoZV9lbnRlcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaykKK3sKKwlzdHJ1Y3QgY29kYV9pbm9kZV9pbmZvICpjaWkgPSBJVE9DKGlub2RlKTsKKworCWNpaS0+Y19jYWNoZWRfZXBvY2ggPSBhdG9taWNfcmVhZCgmcGVybWlzc2lvbl9lcG9jaCk7CisJaWYgKGNpaS0+Y191aWQgIT0gY3VycmVudC0+ZnN1aWQpIHsKKyAgICAgICAgICAgICAgICBjaWktPmNfdWlkID0gY3VycmVudC0+ZnN1aWQ7CisgICAgICAgICAgICAgICAgY2lpLT5jX2NhY2hlZF9wZXJtID0gbWFzazsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgY2lpLT5jX2NhY2hlZF9wZXJtIHw9IG1hc2s7Cit9CisKKy8qIHJlbW92ZSBjYWNoZWQgYWNsIGZyb20gYW4gaW5vZGUgKi8KK3ZvaWQgY29kYV9jYWNoZV9jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBjb2RhX2lub2RlX2luZm8gKmNpaSA9IElUT0MoaW5vZGUpOworICAgICAgICBjaWktPmNfY2FjaGVkX3Blcm0gPSAwOworfQorCisvKiByZW1vdmUgYWxsIGFjbCBjYWNoZXMgKi8KK3ZvaWQgY29kYV9jYWNoZV9jbGVhcl9hbGwoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKyAgICAgICAgc3RydWN0IGNvZGFfc2JfaW5mbyAqc2JpOworCisgICAgICAgIHNiaSA9IGNvZGFfc2JwKHNiKTsKKyAgICAgICAgaWYgKCFzYmkpIEJVRygpOworCisJYXRvbWljX2luYygmcGVybWlzc2lvbl9lcG9jaCk7Cit9CisKKworLyogY2hlY2sgaWYgdGhlIG1hc2sgaGFzIGJlZW4gbWF0Y2hlZCBhZ2FpbnN0IHRoZSBhY2wgYWxyZWFkeSAqLworaW50IGNvZGFfY2FjaGVfY2hlY2soc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2spCit7CisJc3RydWN0IGNvZGFfaW5vZGVfaW5mbyAqY2lpID0gSVRPQyhpbm9kZSk7CisgICAgICAgIGludCBoaXQ7CisJCisgICAgICAgIGhpdCA9IChtYXNrICYgY2lpLT5jX2NhY2hlZF9wZXJtKSA9PSBtYXNrICYmCisJCWNpaS0+Y191aWQgPT0gY3VycmVudC0+ZnN1aWQgJiYKKwkJY2lpLT5jX2NhY2hlZF9lcG9jaCA9PSBhdG9taWNfcmVhZCgmcGVybWlzc2lvbl9lcG9jaCk7CisKKyAgICAgICAgcmV0dXJuIGhpdDsKK30KKworCisvKiBQdXJnaW5nIGRlbnRyaWVzIGFuZCBjaGlsZHJlbiAqLworLyogVGhlIGZvbGxvd2luZyByb3V0aW5lcyBkcm9wIGRlbnRyaWVzIHdoaWNoIGFyZSBub3QKKyAgIGluIHVzZSBhbmQgZmxhZyBkZW50cmllcyB3aGljaCBhcmUgaW4gdXNlIHRvIGJlIAorICAgemFwcGVkIGxhdGVyLgorCisgICBUaGUgZmxhZ3MgYXJlIGRldGVjdGVkIGJ5OgorICAgLSBjb2RhX2RlbnRyeV9yZXZhbGlkYXRlIChmb3IgbG9va3VwcykgaWYgdGhlIGZsYWcgaXMgQ19QVVJHRQorICAgLSBjb2RhX2RlbnRyeV9kZWxldGU6IHRvIHJlbW92ZSBkZW50cnkgZnJvbSB0aGUgY2FjaGUgd2hlbiBkX2NvdW50CisgICAgIGZhbGxzIHRvIHplcm8KKyAgIC0gYW4gaW5vZGUgbWV0aG9kIGNvZGFfcmV2YWxpZGF0ZSAoZm9yIGF0dHJpYnV0ZXMpIGlmIHRoZSAKKyAgICAgZmxhZyBpcyBDX1ZBVFRSCisqLworCisvKiB0aGlzIHdvbid0IGRvIGFueSBoYXJtOiBqdXN0IGZsYWcgYWxsIGNoaWxkcmVuICovCitzdGF0aWMgdm9pZCBjb2RhX2ZsYWdfY2hpbGRyZW4oc3RydWN0IGRlbnRyeSAqcGFyZW50LCBpbnQgZmxhZykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpjaGlsZDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZTsKKworCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCWxpc3RfZm9yX2VhY2goY2hpbGQsICZwYXJlbnQtPmRfc3ViZGlycykKKwl7CisJCWRlID0gbGlzdF9lbnRyeShjaGlsZCwgc3RydWN0IGRlbnRyeSwgZF9jaGlsZCk7CisJCS8qIGRvbid0IGtub3cgd2hhdCB0byBkbyB3aXRoIG5lZ2F0aXZlIGRlbnRyaWVzICovCisJCWlmICggISBkZS0+ZF9pbm9kZSApIAorCQkJY29udGludWU7CisJCWNvZGFfZmxhZ19pbm9kZShkZS0+ZF9pbm9kZSwgZmxhZyk7CisJfQorCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJcmV0dXJuOyAKK30KKwordm9pZCBjb2RhX2ZsYWdfaW5vZGVfY2hpbGRyZW4oc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZsYWcpCit7CisJc3RydWN0IGRlbnRyeSAqYWxpYXNfZGU7CisKKwlpZiAoICFpbm9kZSB8fCAhU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgCisJCXJldHVybjsgCisKKwlhbGlhc19kZSA9IGRfZmluZF9hbGlhcyhpbm9kZSk7CisJaWYgKCFhbGlhc19kZSkKKwkJcmV0dXJuOworCWNvZGFfZmxhZ19jaGlsZHJlbihhbGlhc19kZSwgZmxhZyk7CisJc2hyaW5rX2RjYWNoZV9wYXJlbnQoYWxpYXNfZGUpOworCWRwdXQoYWxpYXNfZGUpOworfQorCmRpZmYgLS1naXQgYS9mcy9jb2RhL2Nub2RlLmMgYi9mcy9jb2RhL2Nub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNhZWVmNQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2NvZGEvY25vZGUuYwpAQCAtMCwwICsxLDE3MiBAQAorLyogY25vZGUgcmVsYXRlZCByb3V0aW5lcyBmb3IgdGhlIGNvZGEga2VybmVsIGNvZGUKKyAgIChDKSAxOTk2IFBldGVyIEJyYWFtCisgICAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisKKyNpbmNsdWRlIDxsaW51eC9jb2RhLmg+CisjaW5jbHVkZSA8bGludXgvY29kYV9saW51eC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvZGFfZnNfaS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvZGFfcHNkZXYuaD4KKworc3RhdGljIGlubGluZSBpbnQgY29kYV9maWRlcShzdHJ1Y3QgQ29kYUZpZCAqZmlkMSwgc3RydWN0IENvZGFGaWQgKmZpZDIpCit7CisJcmV0dXJuIG1lbWNtcChmaWQxLCBmaWQyLCBzaXplb2YoKmZpZDEpKSA9PSAwOworfQorCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgY29kYV9zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnJlYWRsaW5rCT0gZ2VuZXJpY19yZWFkbGluaywKKwkuZm9sbG93X2xpbmsJPSBwYWdlX2ZvbGxvd19saW5rX2xpZ2h0LAorCS5wdXRfbGluawk9IHBhZ2VfcHV0X2xpbmssCisJLnNldGF0dHIJPSBjb2RhX3NldGF0dHIsCit9OworCisvKiBjbm9kZS5jICovCitzdGF0aWMgdm9pZCBjb2RhX2ZpbGxfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGNvZGFfdmF0dHIgKmF0dHIpCit7CisgICAgICAgIGNvZGFfdmF0dHJfdG9faWF0dHIoaW5vZGUsIGF0dHIpOworCisgICAgICAgIGlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisgICAgICAgICAgICAgICAgaW5vZGUtPmlfb3AgPSAmY29kYV9maWxlX2lub2RlX29wZXJhdGlvbnM7CisgICAgICAgICAgICAgICAgaW5vZGUtPmlfZm9wID0gJmNvZGFfZmlsZV9vcGVyYXRpb25zOworICAgICAgICB9IGVsc2UgaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKyAgICAgICAgICAgICAgICBpbm9kZS0+aV9vcCA9ICZjb2RhX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworICAgICAgICAgICAgICAgIGlub2RlLT5pX2ZvcCA9ICZjb2RhX2Rpcl9vcGVyYXRpb25zOworICAgICAgICB9IGVsc2UgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaW5vZGUtPmlfb3AgPSAmY29kYV9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2RhdGEuYV9vcHMgPSAmY29kYV9zeW1saW5rX2FvcHM7CisJCWlub2RlLT5pX21hcHBpbmcgPSAmaW5vZGUtPmlfZGF0YTsKKwl9IGVsc2UKKyAgICAgICAgICAgICAgICBpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsIGh1Z2VfZGVjb2RlX2RldihhdHRyLT52YV9yZGV2KSk7Cit9CisKK3N0YXRpYyBpbnQgY29kYV90ZXN0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IENvZGFGaWQgKmZpZCA9IChzdHJ1Y3QgQ29kYUZpZCAqKWRhdGE7CisJcmV0dXJuIGNvZGFfZmlkZXEoJihJVE9DKGlub2RlKS0+Y19maWQpLCBmaWQpOworfQorCitzdGF0aWMgaW50IGNvZGFfc2V0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IENvZGFGaWQgKmZpZCA9IChzdHJ1Y3QgQ29kYUZpZCAqKWRhdGE7CisJSVRPQyhpbm9kZSktPmNfZmlkID0gKmZpZDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb2RhX2ZhaWxfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gLTE7Cit9CisKK3N0cnVjdCBpbm9kZSAqIGNvZGFfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgc3RydWN0IENvZGFGaWQgKiBmaWQsCisJCQkgc3RydWN0IGNvZGFfdmF0dHIgKiBhdHRyKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGNvZGFfaW5vZGVfaW5mbyAqY2lpOworCXVuc2lnbmVkIGxvbmcgaGFzaCA9IGNvZGFfZjJpKGZpZCk7CisKKwlpbm9kZSA9IGlnZXQ1X2xvY2tlZChzYiwgaGFzaCwgY29kYV90ZXN0X2lub2RlLCBjb2RhX3NldF9pbm9kZSwgZmlkKTsKKworCWlmICghaW5vZGUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaWYgKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpIHsKKwkJY2lpID0gSVRPQyhpbm9kZSk7CisJCS8qIHdlIHN0aWxsIG5lZWQgdG8gc2V0IGlfaW5vIGZvciB0aGluZ3MgbGlrZSBzdGF0KDIpICovCisJCWlub2RlLT5pX2lubyA9IGhhc2g7CisJCWNpaS0+Y19tYXBjb3VudCA9IDA7CisJCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOworCX0KKworCS8qIGFsd2F5cyByZXBsYWNlIHRoZSBhdHRyaWJ1dGVzLCB0eXBlIG1pZ2h0IGhhdmUgY2hhbmdlZCAqLworCWNvZGFfZmlsbF9pbm9kZShpbm9kZSwgYXR0cik7CisJcmV0dXJuIGlub2RlOworfQorCisvKiB0aGlzIGlzIGVmZmVjdGl2ZWx5IGNvZGFfaWdldDoKKyAgIC0gZ2V0IGF0dHJpYnV0ZXMgKG1pZ2h0IGJlIGNhY2hlZCkKKyAgIC0gZ2V0IHRoZSBpbm9kZSBmb3IgdGhlIGZpZCB1c2luZyB2ZnMgaWdldAorICAgLSBsaW5rIHRoZSB0d28gdXAgaWYgdGhpcyBpcyBuZWVkZWQKKyAgIC0gZmlsbCBpbiB0aGUgYXR0cmlidXRlcworKi8KK2ludCBjb2RhX2Nub2RlX21ha2Uoc3RydWN0IGlub2RlICoqaW5vZGUsIHN0cnVjdCBDb2RhRmlkICpmaWQsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisgICAgICAgIHN0cnVjdCBjb2RhX3ZhdHRyIGF0dHI7CisgICAgICAgIGludCBlcnJvcjsKKyAgICAgICAgCisJLyogV2UgZ2V0IGlub2RlIG51bWJlcnMgZnJvbSBWZW51cyAtLSBzZWUgdmVudXMgc291cmNlICovCisJZXJyb3IgPSB2ZW51c19nZXRhdHRyKHNiLCBmaWQsICZhdHRyKTsKKwlpZiAoIGVycm9yICkgeworCSAgICAqaW5vZGUgPSBOVUxMOworCSAgICByZXR1cm4gZXJyb3I7CisJfSAKKworCSppbm9kZSA9IGNvZGFfaWdldChzYiwgZmlkLCAmYXR0cik7CisJaWYgKCBJU19FUlIoKmlub2RlKSApIHsKKwkJcHJpbnRrKCJjb2RhX2Nub2RlX21ha2U6IGNvZGFfaWdldCBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBQVFJfRVJSKCppbm9kZSk7CisgICAgICAgIH0KKwlyZXR1cm4gMDsKK30KKworCit2b2lkIGNvZGFfcmVwbGFjZV9maWQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IENvZGFGaWQgKm9sZGZpZCwgCisJCSAgICAgIHN0cnVjdCBDb2RhRmlkICpuZXdmaWQpCit7CisJc3RydWN0IGNvZGFfaW5vZGVfaW5mbyAqY2lpOworCXVuc2lnbmVkIGxvbmcgaGFzaCA9IGNvZGFfZjJpKG5ld2ZpZCk7CisJCisJY2lpID0gSVRPQyhpbm9kZSk7CisKKwlpZiAoIWNvZGFfZmlkZXEoJmNpaS0+Y19maWQsIG9sZGZpZCkpCisJCUJVRygpOworCisJLyogcmVwbGFjZSBmaWQgYW5kIHJlaGFzaCBpbm9kZSAqLworCS8qIFhYWCB3ZSBwcm9iYWJseSBuZWVkIHRvIGhvbGQgc29tZSBsb2NrIGhlcmUhICovCisJcmVtb3ZlX2lub2RlX2hhc2goaW5vZGUpOworCWNpaS0+Y19maWQgPSAqbmV3ZmlkOworCWlub2RlLT5pX2lubyA9IGhhc2g7CisJX19pbnNlcnRfaW5vZGVfaGFzaChpbm9kZSwgaGFzaCk7Cit9CisKKy8qIGNvbnZlcnQgYSBmaWQgdG8gYW4gaW5vZGUuICovCitzdHJ1Y3QgaW5vZGUgKmNvZGFfZmlkX3RvX2lub2RlKHN0cnVjdCBDb2RhRmlkICpmaWQsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpIAoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJdW5zaWduZWQgbG9uZyBoYXNoID0gY29kYV9mMmkoZmlkKTsKKworCWlmICggIXNiICkgeworCQlwcmludGsoImNvZGFfZmlkX3RvX2lub2RlOiBubyBzYiFcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpbm9kZSA9IGlnZXQ1X2xvY2tlZChzYiwgaGFzaCwgY29kYV90ZXN0X2lub2RlLCBjb2RhX2ZhaWxfaW5vZGUsIGZpZCk7CisJaWYgKCAhaW5vZGUgKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIHdlIHNob3VsZCBuZXZlciBzZWUgbmV3bHkgY3JlYXRlZCBpbm9kZXMgYmVjYXVzZSB3ZSBpbnRlbnRpb25hbGx5CisJICogZmFpbCBpbiB0aGUgaW5pdGlhbGl6YXRpb24gY2FsbGJhY2sgKi8KKwlCVUdfT04oaW5vZGUtPmlfc3RhdGUgJiBJX05FVyk7CisKKwlyZXR1cm4gaW5vZGU7Cit9CisKKy8qIHRoZSBDT05UUk9MIGlub2RlIGlzIG1hZGUgd2l0aG91dCBhc2tpbmcgYXR0cmlidXRlcyBmcm9tIFZlbnVzICovCitpbnQgY29kYV9jbm9kZV9tYWtlY3RsKHN0cnVjdCBpbm9kZSAqKmlub2RlLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCWludCBlcnJvciA9IC1FTk9NRU07CisKKwkqaW5vZGUgPSBuZXdfaW5vZGUoc2IpOworCWlmICgqaW5vZGUpIHsKKwkJKCppbm9kZSktPmlfaW5vID0gQ1RMX0lOTzsKKwkJKCppbm9kZSktPmlfb3AgPSAmY29kYV9pb2N0bF9pbm9kZV9vcGVyYXRpb25zOworCQkoKmlub2RlKS0+aV9mb3AgPSAmY29kYV9pb2N0bF9vcGVyYXRpb25zOworCQkoKmlub2RlKS0+aV9tb2RlID0gMDQ0NDsKKwkJZXJyb3IgPSAwOworCX0KKworCXJldHVybiBlcnJvcjsKK30KKwpkaWZmIC0tZ2l0IGEvZnMvY29kYS9jb2RhX2xpbnV4LmMgYi9mcy9jb2RhL2NvZGFfbGludXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTk3MDgwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvY29kYS9jb2RhX2xpbnV4LmMKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBJbm9kZSBvcGVyYXRpb25zIGZvciBDb2RhIGZpbGVzeXN0ZW0KKyAqIE9yaWdpbmFsIHZlcnNpb246IChDKSAxOTk2IFAuIEJyYWFtIGFuZCBNLiBDYWxsYWhhbgorICogUmV3cml0dGVuIGZvciBMaW51eCAyLjEuIChDKSAxOTk3IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CisgKiAKKyAqIENhcm5lZ2llIE1lbGxvbiBlbmNvdXJhZ2VzIHVzZXJzIHRvIGNvbnRyaWJ1dGUgaW1wcm92ZW1lbnRzIHRvCisgKiB0aGUgQ29kYSBwcm9qZWN0LiBDb250YWN0IFBldGVyIEJyYWFtIChjb2RhQGNzLmNtdS5lZHUpLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKKyNpbmNsdWRlIDxsaW51eC9jb2RhLmg+CisjaW5jbHVkZSA8bGludXgvY29kYV9saW51eC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvZGFfcHNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9jb2RhX2ZzX2kuaD4KKworLyogaW5pdGlhbGl6ZSB0aGUgZGVidWdnaW5nIHZhcmlhYmxlcyAqLworaW50IGNvZGFfZmFrZV9zdGF0ZnM7CisKKy8qIHByaW50IGEgZmlkICovCitjaGFyICogY29kYV9mMnMoc3RydWN0IENvZGFGaWQgKmYpCit7CisJc3RhdGljIGNoYXIgc1s2MF07CisjaWZkZWYgQ09ORklHX0NPREFfRlNfT0xEX0FQSQorIAlzcHJpbnRmKHMsICIoJTA4eC4lMDh4LiUwOHgpIiwgZi0+b3BhcXVlWzBdLCBmLT5vcGFxdWVbMV0sIGYtPm9wYXF1ZVsyXSk7CisjZWxzZQorIAlzcHJpbnRmKHMsICIoJTA4eC4lMDh4LiUwOHguJTA4eCkiLCBmLT5vcGFxdWVbMF0sIGYtPm9wYXF1ZVsxXSwgZi0+b3BhcXVlWzJdLCBmLT5vcGFxdWVbM10pOworI2VuZGlmCisJcmV0dXJuIHM7Cit9CisKKy8qIHJlY29nbml6ZSBzcGVjaWFsIC5DT05UUk9MIG5hbWUgKi8KK2ludCBjb2RhX2lzY29udHJvbChjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbGVuZ3RoKQoreworCXJldHVybiAoKENPREFfQ09OVFJPTExFTiA9PSBsZW5ndGgpICYmIAorICAgICAgICAgICAgICAgIChzdHJuY21wKG5hbWUsIENPREFfQ09OVFJPTCwgQ09EQV9DT05UUk9MTEVOKSA9PSAwKSk7Cit9CisKKy8qIHJlY29nbml6ZSAvY29kYSBpbm9kZSAqLworaW50IGNvZGFfaXNyb290KHN0cnVjdCBpbm9kZSAqaSkKK3sKKyAgICByZXR1cm4gKCBpLT5pX3NiLT5zX3Jvb3QtPmRfaW5vZGUgPT0gaSApOworfQorCit1bnNpZ25lZCBzaG9ydCBjb2RhX2ZsYWdzX3RvX2NmbGFncyh1bnNpZ25lZCBzaG9ydCBmbGFncykKK3sKKwl1bnNpZ25lZCBzaG9ydCBjb2RhX2ZsYWdzID0gMDsKKwkKKwlpZiAoKGZsYWdzICYgT19BQ0NNT0RFKSA9PSBPX1JET05MWSkKKwkJY29kYV9mbGFncyB8PSBDX09fUkVBRDsKKworCWlmICgoZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fUkRXUikKKwkJY29kYV9mbGFncyB8PSBDX09fUkVBRCB8IENfT19XUklURTsKKworCWlmICgoZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fV1JPTkxZKQorCQljb2RhX2ZsYWdzIHw9IENfT19XUklURTsKKworCWlmIChmbGFncyAmIE9fVFJVTkMpCisJCWNvZGFfZmxhZ3MgfD0gQ19PX1RSVU5DOworCisJaWYgKGZsYWdzICYgT19DUkVBVCkKKwkJY29kYV9mbGFncyB8PSBDX09fQ1JFQVQ7CisKKwlpZiAoZmxhZ3MgJiBPX0VYQ0wpCisJCWNvZGFfZmxhZ3MgfD0gQ19PX0VYQ0w7CisKKwlyZXR1cm4gY29kYV9mbGFnczsKK30KKworCisvKiB1dGlsaXR5IGZ1bmN0aW9ucyBiZWxvdyAqLwordm9pZCBjb2RhX3ZhdHRyX3RvX2lhdHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBjb2RhX3ZhdHRyICphdHRyKQoreworICAgICAgICBpbnQgaW5vZGVfdHlwZTsKKyAgICAgICAgLyogaW5vZGUncyBpX2ZsYWdzLCBpX2lubyBhcmUgc2V0IGJ5IGlnZXQgCisgICAgICAgICAgIFhYWDogaXMgdGhpcyBhbGwgd2UgbmVlZCA/PworICAgICAgICAgICAqLworICAgICAgICBzd2l0Y2ggKGF0dHItPnZhX3R5cGUpIHsKKyAgICAgICAgY2FzZSBDX1ZOT046CisgICAgICAgICAgICAgICAgaW5vZGVfdHlwZSAgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENfVlJFRzoKKyAgICAgICAgICAgICAgICBpbm9kZV90eXBlID0gU19JRlJFRzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDX1ZESVI6CisgICAgICAgICAgICAgICAgaW5vZGVfdHlwZSA9IFNfSUZESVI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ19WTE5LOgorICAgICAgICAgICAgICAgIGlub2RlX3R5cGUgPSBTX0lGTE5LOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlub2RlX3R5cGUgPSAwOworICAgICAgICB9CisJaW5vZGUtPmlfbW9kZSB8PSBpbm9kZV90eXBlOworCisJaWYgKGF0dHItPnZhX21vZGUgIT0gKHVfc2hvcnQpIC0xKQorCSAgICAgICAgaW5vZGUtPmlfbW9kZSA9IGF0dHItPnZhX21vZGUgfCBpbm9kZV90eXBlOworICAgICAgICBpZiAoYXR0ci0+dmFfdWlkICE9IC0xKSAKKwkgICAgICAgIGlub2RlLT5pX3VpZCA9ICh1aWRfdCkgYXR0ci0+dmFfdWlkOworICAgICAgICBpZiAoYXR0ci0+dmFfZ2lkICE9IC0xKQorCSAgICAgICAgaW5vZGUtPmlfZ2lkID0gKGdpZF90KSBhdHRyLT52YV9naWQ7CisJaWYgKGF0dHItPnZhX25saW5rICE9IC0xKQorCSAgICAgICAgaW5vZGUtPmlfbmxpbmsgPSBhdHRyLT52YV9ubGluazsKKwlpZiAoYXR0ci0+dmFfc2l6ZSAhPSAtMSkKKwkgICAgICAgIGlub2RlLT5pX3NpemUgPSBhdHRyLT52YV9zaXplOworCWlmIChhdHRyLT52YV9ibG9ja3NpemUgIT0gLTEpCisJCWlub2RlLT5pX2Jsa3NpemUgPSBhdHRyLT52YV9ibG9ja3NpemU7CisJaWYgKGF0dHItPnZhX3NpemUgIT0gLTEpCisJCWlub2RlLT5pX2Jsb2NrcyA9IChhdHRyLT52YV9zaXplICsgNTExKSA+PiA5OworCWlmIChhdHRyLT52YV9hdGltZS50dl9zZWMgIT0gLTEpIAorCSAgICAgICAgaW5vZGUtPmlfYXRpbWUgPSBhdHRyLT52YV9hdGltZTsKKwlpZiAoYXR0ci0+dmFfbXRpbWUudHZfc2VjICE9IC0xKQorCSAgICAgICAgaW5vZGUtPmlfbXRpbWUgPSBhdHRyLT52YV9tdGltZTsKKyAgICAgICAgaWYgKGF0dHItPnZhX2N0aW1lLnR2X3NlYyAhPSAtMSkKKwkgICAgICAgIGlub2RlLT5pX2N0aW1lID0gYXR0ci0+dmFfY3RpbWU7Cit9CisKKworLyogCisgKiBCU0Qgc2V0cyBhdHRyaWJ1dGVzIHRoYXQgbmVlZCBub3QgYmUgbW9kaWZpZWQgdG8gLTEuIAorICogTGludXggdXNlcyB0aGUgdmFsaWQgZmllbGQgdG8gaW5kaWNhdGUgd2hhdCBzaG91bGQgYmUKKyAqIGxvb2tlZCBhdC4gIFRoZSBCU0QgdHlwZSBmaWVsZCBuZWVkcyB0byBiZSBkZWR1Y2VkIGZyb20gbGludXggCisgKiBtb2RlLgorICogU28gd2UgaGF2ZSB0byBkbyBzb21lIHRyYW5zbGF0aW9ucyBoZXJlLgorICovCisKK3ZvaWQgY29kYV9pYXR0cl90b192YXR0cihzdHJ1Y3QgaWF0dHIgKmlhdHRyLCBzdHJ1Y3QgY29kYV92YXR0ciAqdmF0dHIpCit7CisgICAgICAgIHVuc2lnbmVkIGludCB2YWxpZDsKKworICAgICAgICAvKiBjbGVhbiBvdXQgKi8gICAgICAgIAorICAgICAgICB2YXR0ci0+dmFfbW9kZSA9ICh1bW9kZV90KSAtMTsKKyAgICAgICAgdmF0dHItPnZhX3VpZCA9ICh2dWlkX3QpIC0xOyAKKyAgICAgICAgdmF0dHItPnZhX2dpZCA9ICh2Z2lkX3QpIC0xOworICAgICAgICB2YXR0ci0+dmFfc2l6ZSA9IChvZmZfdCkgLTE7CisJdmF0dHItPnZhX2F0aW1lLnR2X3NlYyA9ICh0aW1lX3QpIC0xOworCXZhdHRyLT52YV9hdGltZS50dl9uc2VjID0gICh0aW1lX3QpIC0xOworICAgICAgICB2YXR0ci0+dmFfbXRpbWUudHZfc2VjID0gKHRpbWVfdCkgLTE7CisgICAgICAgIHZhdHRyLT52YV9tdGltZS50dl9uc2VjID0gKHRpbWVfdCkgLTE7CisJdmF0dHItPnZhX2N0aW1lLnR2X3NlYyA9ICh0aW1lX3QpIC0xOworCXZhdHRyLT52YV9jdGltZS50dl9uc2VjID0gKHRpbWVfdCkgLTE7CisgICAgICAgIHZhdHRyLT52YV90eXBlID0gQ19WTk9OOworCXZhdHRyLT52YV9maWxlaWQgPSAtMTsKKwl2YXR0ci0+dmFfZ2VuID0gLTE7CisJdmF0dHItPnZhX2J5dGVzID0gLTE7CisJdmF0dHItPnZhX25saW5rID0gLTE7CisJdmF0dHItPnZhX2Jsb2Nrc2l6ZSA9IC0xOworCXZhdHRyLT52YV9yZGV2ID0gLTE7CisgICAgICAgIHZhdHRyLT52YV9mbGFncyA9IDA7CisKKyAgICAgICAgLyogZGV0ZXJtaW5lIHRoZSB0eXBlICovCisjaWYgMAorICAgICAgICBtb2RlID0gaWF0dHItPmlhX21vZGU7CisgICAgICAgICAgICAgICAgaWYgKCBTX0lTRElSKG1vZGUpICkgeworICAgICAgICAgICAgICAgIHZhdHRyLT52YV90eXBlID0gQ19WRElSOyAKKyAgICAgICAgfSBlbHNlIGlmICggU19JU1JFRyhtb2RlKSApIHsKKyAgICAgICAgICAgICAgICB2YXR0ci0+dmFfdHlwZSA9IENfVlJFRzsKKyAgICAgICAgfSBlbHNlIGlmICggU19JU0xOSyhtb2RlKSApIHsKKyAgICAgICAgICAgICAgICB2YXR0ci0+dmFfdHlwZSA9IENfVkxOSzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBkb24ndCBkbyBvdGhlcnMgKi8KKyAgICAgICAgICAgICAgICB2YXR0ci0+dmFfdHlwZSA9IENfVk5PTjsKKyAgICAgICAgfQorI2VuZGlmIAorCisgICAgICAgIC8qIHNldCB0aG9zZSB2YXR0cnMgdGhhdCBuZWVkIGNoYW5nZSAqLworICAgICAgICB2YWxpZCA9IGlhdHRyLT5pYV92YWxpZDsKKyAgICAgICAgaWYgKCB2YWxpZCAmIEFUVFJfTU9ERSApIHsKKyAgICAgICAgICAgICAgICB2YXR0ci0+dmFfbW9kZSA9IGlhdHRyLT5pYV9tb2RlOworCX0KKyAgICAgICAgaWYgKCB2YWxpZCAmIEFUVFJfVUlEICkgeworICAgICAgICAgICAgICAgIHZhdHRyLT52YV91aWQgPSAodnVpZF90KSBpYXR0ci0+aWFfdWlkOworCX0KKyAgICAgICAgaWYgKCB2YWxpZCAmIEFUVFJfR0lEICkgeworICAgICAgICAgICAgICAgIHZhdHRyLT52YV9naWQgPSAodmdpZF90KSBpYXR0ci0+aWFfZ2lkOworCX0KKyAgICAgICAgaWYgKCB2YWxpZCAmIEFUVFJfU0laRSApIHsKKyAgICAgICAgICAgICAgICB2YXR0ci0+dmFfc2l6ZSA9IGlhdHRyLT5pYV9zaXplOworCX0KKyAgICAgICAgaWYgKCB2YWxpZCAmIEFUVFJfQVRJTUUgKSB7CisgICAgICAgICAgICAgICAgdmF0dHItPnZhX2F0aW1lID0gaWF0dHItPmlhX2F0aW1lOworCX0KKyAgICAgICAgaWYgKCB2YWxpZCAmIEFUVFJfTVRJTUUgKSB7CisgICAgICAgICAgICAgICAgdmF0dHItPnZhX210aW1lID0gaWF0dHItPmlhX210aW1lOworCX0KKyAgICAgICAgaWYgKCB2YWxpZCAmIEFUVFJfQ1RJTUUgKSB7CisgICAgICAgICAgICAgICAgdmF0dHItPnZhX2N0aW1lID0gaWF0dHItPmlhX2N0aW1lOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvZnMvY29kYS9kaXIuYyBiL2ZzL2NvZGEvZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM5MTc2NgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2NvZGEvZGlyLmMKQEAgLTAsMCArMSw3MDQgQEAKKworLyoKKyAqIERpcmVjdG9yeSBvcGVyYXRpb25zIGZvciBDb2RhIGZpbGVzeXN0ZW0KKyAqIE9yaWdpbmFsIHZlcnNpb246IChDKSAxOTk2IFAuIEJyYWFtIGFuZCBNLiBDYWxsYWhhbgorICogUmV3cml0dGVuIGZvciBMaW51eCAyLjEuIChDKSAxOTk3IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CisgKiAKKyAqIENhcm5lZ2llIE1lbGxvbiBlbmNvdXJhZ2VzIHVzZXJzIHRvIGNvbnRyaWJ1dGUgaW1wcm92ZW1lbnRzIHRvCisgKiB0aGUgQ29kYSBwcm9qZWN0LiBDb250YWN0IFBldGVyIEJyYWFtIChjb2RhQGNzLmNtdS5lZHUpLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGxpbnV4L2NvZGEuaD4KKyNpbmNsdWRlIDxsaW51eC9jb2RhX2xpbnV4Lmg+CisjaW5jbHVkZSA8bGludXgvY29kYV9wc2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvZGFfZnNfaS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvZGFfY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb2RhX3Byb2MuaD4KKworLyogZGlyIGlub2RlLW9wcyAqLworc3RhdGljIGludCBjb2RhX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqbmV3LCBpbnQgbW9kZSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpOworc3RhdGljIHN0cnVjdCBkZW50cnkgKmNvZGFfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICp0YXJnZXQsIHN0cnVjdCBuYW1laWRhdGEgKm5kKTsKK3N0YXRpYyBpbnQgY29kYV9saW5rKHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksIHN0cnVjdCBpbm9kZSAqZGlyX2lub2RlLCAKKwkJICAgICBzdHJ1Y3QgZGVudHJ5ICplbnRyeSk7CitzdGF0aWMgaW50IGNvZGFfdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyX2lub2RlLCBzdHJ1Y3QgZGVudHJ5ICplbnRyeSk7CitzdGF0aWMgaW50IGNvZGFfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKmRpcl9pbm9kZSwgc3RydWN0IGRlbnRyeSAqZW50cnksCisJCQljb25zdCBjaGFyICpzeW1uYW1lKTsKK3N0YXRpYyBpbnQgY29kYV9ta2RpcihzdHJ1Y3QgaW5vZGUgKmRpcl9pbm9kZSwgc3RydWN0IGRlbnRyeSAqZW50cnksIGludCBtb2RlKTsKK3N0YXRpYyBpbnQgY29kYV9ybWRpcihzdHJ1Y3QgaW5vZGUgKmRpcl9pbm9kZSwgc3RydWN0IGRlbnRyeSAqZW50cnkpOworc3RhdGljIGludCBjb2RhX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZF9pbm9kZSwgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwgCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbm9kZSAqbmV3X2lub2RlLCBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KTsKKworLyogZGlyIGZpbGUtb3BzICovCitzdGF0aWMgaW50IGNvZGFfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcik7CisKKy8qIGRlbnRyeSBvcHMgKi8KK3N0YXRpYyBpbnQgY29kYV9kZW50cnlfcmV2YWxpZGF0ZShzdHJ1Y3QgZGVudHJ5ICpkZSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpOworc3RhdGljIGludCBjb2RhX2RlbnRyeV9kZWxldGUoc3RydWN0IGRlbnRyeSAqKTsKKworLyogc3VwcG9ydCByb3V0aW5lcyAqLworc3RhdGljIGludCBjb2RhX3ZlbnVzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsIGZpbGxkaXJfdCBmaWxsZGlyLAorCQkJICAgICAgdm9pZCAqZGlyZW50LCBzdHJ1Y3QgZGVudHJ5ICpkaXIpOworaW50IGNvZGFfZnN5bmMoc3RydWN0IGZpbGUgKiwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgZGF0YXN5bmMpOworCisvKiBzYW1lIGFzIGZzL2JhZF9pbm9kZS5jICovCitzdGF0aWMgaW50IGNvZGFfcmV0dXJuX0VJTyh2b2lkKQoreworCXJldHVybiAtRUlPOworfQorI2RlZmluZSBDT0RBX0VJT19FUlJPUiAoKHZvaWQgKikgKGNvZGFfcmV0dXJuX0VJTykpCisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgY29kYV9kZW50cnlfb3BlcmF0aW9ucyA9Cit7CisJLmRfcmV2YWxpZGF0ZQk9IGNvZGFfZGVudHJ5X3JldmFsaWRhdGUsCisJLmRfZGVsZXRlCT0gY29kYV9kZW50cnlfZGVsZXRlLAorfTsKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgY29kYV9kaXJfaW5vZGVfb3BlcmF0aW9ucyA9Cit7CisJLmNyZWF0ZQkJPSBjb2RhX2NyZWF0ZSwKKwkubG9va3VwCQk9IGNvZGFfbG9va3VwLAorCS5saW5rCQk9IGNvZGFfbGluaywKKwkudW5saW5rCQk9IGNvZGFfdW5saW5rLAorCS5zeW1saW5rCT0gY29kYV9zeW1saW5rLAorCS5ta2RpcgkJPSBjb2RhX21rZGlyLAorCS5ybWRpcgkJPSBjb2RhX3JtZGlyLAorCS5ta25vZAkJPSBDT0RBX0VJT19FUlJPUiwKKwkucmVuYW1lCQk9IGNvZGFfcmVuYW1lLAorCS5wZXJtaXNzaW9uCT0gY29kYV9wZXJtaXNzaW9uLAorCS5nZXRhdHRyCT0gY29kYV9nZXRhdHRyLAorCS5zZXRhdHRyCT0gY29kYV9zZXRhdHRyLAorfTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjb2RhX2Rpcl9vcGVyYXRpb25zID0geworCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKKwkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAorCS5yZWFkZGlyCT0gY29kYV9yZWFkZGlyLAorCS5vcGVuCQk9IGNvZGFfb3BlbiwKKwkuZmx1c2gJCT0gY29kYV9mbHVzaCwKKwkucmVsZWFzZQk9IGNvZGFfcmVsZWFzZSwKKwkuZnN5bmMJCT0gY29kYV9mc3luYywKK307CisKKworLyogaW5vZGUgb3BlcmF0aW9ucyBmb3IgZGlyZWN0b3JpZXMgKi8KKy8qIGFjY2VzcyByb3V0aW5lczogbG9va3VwLCByZWFkbGluaywgcGVybWlzc2lvbiAqLworc3RhdGljIHN0cnVjdCBkZW50cnkgKmNvZGFfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICplbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGlub2RlICpyZXNfaW5vZGUgPSBOVUxMOworCXN0cnVjdCBDb2RhRmlkIHJlc2ZpZCA9IHsgeyAwLCB9IH07CisJaW50IGRyb3BtZSA9IDA7IC8qIHRvIGluZGljYXRlIGVudHJ5IHNob3VsZCBub3QgYmUgY2FjaGVkICovCisJaW50IHR5cGUgPSAwOworCWludCBlcnJvciA9IDA7CisJY29uc3QgY2hhciAqbmFtZSA9IGVudHJ5LT5kX25hbWUubmFtZTsKKwlzaXplX3QgbGVuZ3RoID0gZW50cnktPmRfbmFtZS5sZW47CisJCisJaWYgKCBsZW5ndGggPiBDT0RBX01BWE5BTUxFTiApIHsKKwkgICAgICAgIHByaW50aygibmFtZSB0b28gbG9uZzogbG9va3VwLCAlcyAoJSpzKVxuIiwgCisJCSAgICAgICBjb2RhX2kycyhkaXIpLCAoaW50KWxlbmd0aCwgbmFtZSk7CisJCXJldHVybiBFUlJfUFRSKC1FTkFNRVRPT0xPTkcpOworCX0KKworCWxvY2tfa2VybmVsKCk7CisgICAgICAgIC8qIGNvbnRyb2wgb2JqZWN0LCBjcmVhdGUgaW5vZGUgb24gdGhlIGZseSAqLworICAgICAgICBpZiAoY29kYV9pc3Jvb3QoZGlyKSAmJiBjb2RhX2lzY29udHJvbChuYW1lLCBsZW5ndGgpKSB7CisJICAgICAgICBlcnJvciA9IGNvZGFfY25vZGVfbWFrZWN0bCgmcmVzX2lub2RlLCBkaXItPmlfc2IpOworCQlkcm9wbWUgPSAxOworICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorCisJZXJyb3IgPSB2ZW51c19sb29rdXAoZGlyLT5pX3NiLCBjb2RhX2kyZihkaXIpLCAKKwkJCSAgICAgKGNvbnN0IGNoYXIgKiluYW1lLCBsZW5ndGgsICZ0eXBlLCAmcmVzZmlkKTsKKworCXJlc19pbm9kZSA9IE5VTEw7CisJaWYgKCFlcnJvcikgeworCQlpZiAodHlwZSAmIENPREFfTk9DQUNIRSkgeworCQkJdHlwZSAmPSAofkNPREFfTk9DQUNIRSk7CisJCQlkcm9wbWUgPSAxOworCQl9CisKKwkgICAgCWVycm9yID0gY29kYV9jbm9kZV9tYWtlKCZyZXNfaW5vZGUsICZyZXNmaWQsIGRpci0+aV9zYik7CisJCWlmIChlcnJvcikgeworCQkJdW5sb2NrX2tlcm5lbCgpOworCQkJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOworCQl9CisJfSBlbHNlIGlmIChlcnJvciAhPSAtRU5PRU5UKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOworCX0KKworZXhpdDoKKwllbnRyeS0+ZF90aW1lID0gMDsKKwllbnRyeS0+ZF9vcCA9ICZjb2RhX2RlbnRyeV9vcGVyYXRpb25zOworCWRfYWRkKGVudHJ5LCByZXNfaW5vZGUpOworCWlmICggZHJvcG1lICkgeworCQlkX2Ryb3AoZW50cnkpOworCQljb2RhX2ZsYWdfaW5vZGUocmVzX2lub2RlLCBDX1ZBVFRSKTsKKwl9CisJdW5sb2NrX2tlcm5lbCgpOworICAgICAgICByZXR1cm4gTlVMTDsKK30KKworCitpbnQgY29kYV9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKyAgICAgICAgaW50IGVycm9yID0gMDsKKyAKKwlpZiAoIW1hc2spCisJCXJldHVybiAwOyAKKworCWxvY2tfa2VybmVsKCk7CisKKwljb2RhX3Zmc19zdGF0LnBlcm1pc3Npb24rKzsKKworCWlmIChjb2RhX2NhY2hlX2NoZWNrKGlub2RlLCBtYXNrKSkKKwkJZ290byBvdXQ7IAorCisgICAgICAgIGVycm9yID0gdmVudXNfYWNjZXNzKGlub2RlLT5pX3NiLCBjb2RhX2kyZihpbm9kZSksIG1hc2spOworICAgIAorCWlmICghZXJyb3IpCisJCWNvZGFfY2FjaGVfZW50ZXIoaW5vZGUsIG1hc2spOworCisgb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKworICAgICAgICByZXR1cm4gZXJyb3I7IAorfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb2RhX2Rpcl9jaGFuZ2VkKHN0cnVjdCBpbm9kZSAqZGlyLCBpbnQgbGluaykKK3sKKyNpZmRlZiBSRVFVRVJZX1ZFTlVTX0ZPUl9NVElNRQorCS8qIGludmFsaWRhdGUgdGhlIGRpcmVjdG9yeSBjbm9kZSdzIGF0dHJpYnV0ZXMgc28gd2UgcmVmZXRjaCB0aGUKKwkgKiBhdHRyaWJ1dGVzIGZyb20gdmVudXMgbmV4dCB0aW1lIHRoZSBpbm9kZSBpcyByZWZlcmVuY2VkICovCisJY29kYV9mbGFnX2lub2RlKGRpciwgQ19WQVRUUik7CisjZWxzZQorCS8qIG9wdGltaXN0aWNhbGx5IHdlIGNhbiBhbHNvIGFjdCBhcyBpZiBvdXIgbm9zZSBibGVlZHMuIFRoZQorICAgICAgICAgKiBncmFudWxhcml0eSBvZiB0aGUgbXRpbWUgaXMgY29hcnNlIGFueXdheXMgc28gd2UgbWlnaHQgYWN0dWFsbHkgYmUKKyAgICAgICAgICogcmlnaHQgbW9zdCBvZiB0aGUgdGltZS4gTm90ZTogd2Ugb25seSBkbyB0aGlzIGZvciBkaXJlY3Rvcmllcy4gKi8KKwlkaXItPmlfbXRpbWUgPSBkaXItPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworI2VuZGlmCisJaWYgKGxpbmspCisJCWRpci0+aV9ubGluayArPSBsaW5rOworfQorCisvKiBjcmVhdGlvbiByb3V0aW5lczogY3JlYXRlLCBta25vZCwgbWtkaXIsIGxpbmssIHN5bWxpbmsgKi8KK3N0YXRpYyBpbnQgY29kYV9jcmVhdGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlLCBpbnQgbW9kZSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisgICAgICAgIGludCBlcnJvcj0wOworCWNvbnN0IGNoYXIgKm5hbWU9ZGUtPmRfbmFtZS5uYW1lOworCWludCBsZW5ndGg9ZGUtPmRfbmFtZS5sZW47CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgQ29kYUZpZCBuZXdmaWQ7CisJc3RydWN0IGNvZGFfdmF0dHIgYXR0cnM7CisKKwlsb2NrX2tlcm5lbCgpOworCWNvZGFfdmZzX3N0YXQuY3JlYXRlKys7CisKKwlpZiAoY29kYV9pc3Jvb3QoZGlyKSAmJiBjb2RhX2lzY29udHJvbChuYW1lLCBsZW5ndGgpKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwllcnJvciA9IHZlbnVzX2NyZWF0ZShkaXItPmlfc2IsIGNvZGFfaTJmKGRpciksIG5hbWUsIGxlbmd0aCwgCisJCQkJMCwgbW9kZSwgJm5ld2ZpZCwgJmF0dHJzKTsKKworICAgICAgICBpZiAoIGVycm9yICkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCWRfZHJvcChkZSk7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwlpbm9kZSA9IGNvZGFfaWdldChkaXItPmlfc2IsICZuZXdmaWQsICZhdHRycyk7CisJaWYgKCBJU19FUlIoaW5vZGUpICkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCWRfZHJvcChkZSk7CisJCXJldHVybiBQVFJfRVJSKGlub2RlKTsKKwl9CisKKwkvKiBpbnZhbGlkYXRlIHRoZSBkaXJlY3RvcnkgY25vZGUncyBhdHRyaWJ1dGVzICovCisJY29kYV9kaXJfY2hhbmdlZChkaXIsIDApOworCXVubG9ja19rZXJuZWwoKTsKKwlkX2luc3RhbnRpYXRlKGRlLCBpbm9kZSk7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvZGFfbWtkaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBjb2RhX3ZhdHRyIGF0dHJzOworCWNvbnN0IGNoYXIgKm5hbWUgPSBkZS0+ZF9uYW1lLm5hbWU7CisJaW50IGxlbiA9IGRlLT5kX25hbWUubGVuOworCWludCBlcnJvcjsKKwlzdHJ1Y3QgQ29kYUZpZCBuZXdmaWQ7CisKKwlsb2NrX2tlcm5lbCgpOworCWNvZGFfdmZzX3N0YXQubWtkaXIrKzsKKworCWlmIChjb2RhX2lzcm9vdChkaXIpICYmIGNvZGFfaXNjb250cm9sKG5hbWUsIGxlbikpIHsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCWF0dHJzLnZhX21vZGUgPSBtb2RlOworCWVycm9yID0gdmVudXNfbWtkaXIoZGlyLT5pX3NiLCBjb2RhX2kyZihkaXIpLCAKKwkJCSAgICAgICBuYW1lLCBsZW4sICZuZXdmaWQsICZhdHRycyk7CisgICAgICAgIAorICAgICAgICBpZiAoIGVycm9yICkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCWRfZHJvcChkZSk7CisJCXJldHVybiBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICAgCisJaW5vZGUgPSBjb2RhX2lnZXQoZGlyLT5pX3NiLCAmbmV3ZmlkLCAmYXR0cnMpOworCWlmICggSVNfRVJSKGlub2RlKSApIHsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlkX2Ryb3AoZGUpOworCQlyZXR1cm4gUFRSX0VSUihpbm9kZSk7CisJfQorCQorCS8qIGludmFsaWRhdGUgdGhlIGRpcmVjdG9yeSBjbm9kZSdzIGF0dHJpYnV0ZXMgKi8KKwljb2RhX2Rpcl9jaGFuZ2VkKGRpciwgMSk7CisJdW5sb2NrX2tlcm5lbCgpOworCWRfaW5zdGFudGlhdGUoZGUsIGlub2RlKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qIHRyeSB0byBtYWtlIGRlIGFuIGVudHJ5IGluIGRpcl9pbm9kZGUgbGlua2VkIHRvIHNvdXJjZV9kZSAqLyAKK3N0YXRpYyBpbnQgY29kYV9saW5rKHN0cnVjdCBkZW50cnkgKnNvdXJjZV9kZSwgc3RydWN0IGlub2RlICpkaXJfaW5vZGUsIAorCSAgc3RydWN0IGRlbnRyeSAqZGUpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHNvdXJjZV9kZS0+ZF9pbm9kZTsKKyAgICAgICAgY29uc3QgY2hhciAqIG5hbWUgPSBkZS0+ZF9uYW1lLm5hbWU7CisJaW50IGxlbiA9IGRlLT5kX25hbWUubGVuOworCWludCBlcnJvcjsKKworCWxvY2tfa2VybmVsKCk7CisJY29kYV92ZnNfc3RhdC5saW5rKys7CisKKwlpZiAoY29kYV9pc3Jvb3QoZGlyX2lub2RlKSAmJiBjb2RhX2lzY29udHJvbChuYW1lLCBsZW4pKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwllcnJvciA9IHZlbnVzX2xpbmsoZGlyX2lub2RlLT5pX3NiLCBjb2RhX2kyZihpbm9kZSksCisJCQkgICBjb2RhX2kyZihkaXJfaW5vZGUpLCAoY29uc3QgY2hhciAqKW5hbWUsIGxlbik7CisKKwlpZiAoZXJyb3IpIHsgCisJCWRfZHJvcChkZSk7CisJCWdvdG8gb3V0OworCX0KKworCWNvZGFfZGlyX2NoYW5nZWQoZGlyX2lub2RlLCAwKTsKKwlhdG9taWNfaW5jKCZpbm9kZS0+aV9jb3VudCk7CisJZF9pbnN0YW50aWF0ZShkZSwgaW5vZGUpOworCWlub2RlLT5pX25saW5rKys7CisgICAgICAgIAorb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4oZXJyb3IpOworfQorCisKK3N0YXRpYyBpbnQgY29kYV9zeW1saW5rKHN0cnVjdCBpbm9kZSAqZGlyX2lub2RlLCBzdHJ1Y3QgZGVudHJ5ICpkZSwKKwkJCWNvbnN0IGNoYXIgKnN5bW5hbWUpCit7CisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBkZS0+ZF9uYW1lLm5hbWU7CisJaW50IGxlbiA9IGRlLT5kX25hbWUubGVuOworCWludCBzeW1sZW47CisgICAgICAgIGludCBlcnJvcj0wOworICAgICAgICAKKwlsb2NrX2tlcm5lbCgpOworCWNvZGFfdmZzX3N0YXQuc3ltbGluaysrOworCisJaWYgKGNvZGFfaXNyb290KGRpcl9pbm9kZSkgJiYgY29kYV9pc2NvbnRyb2wobmFtZSwgbGVuKSkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJc3ltbGVuID0gc3RybGVuKHN5bW5hbWUpOworCWlmICggc3ltbGVuID4gQ09EQV9NQVhQQVRITEVOICkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRU5BTUVUT09MT05HOworCX0KKworCS8qCisJICogVGhpcyBlbnRyeSBpcyBub3cgbmVnYXRpdmUuIFNpbmNlIHdlIGRvIG5vdCBjcmVhdGUKKwkgKiBhbiBpbm9kZSBmb3IgdGhlIGVudHJ5IHdlIGhhdmUgdG8gZHJvcCBpdC4gCisJICovCisJZF9kcm9wKGRlKTsKKwllcnJvciA9IHZlbnVzX3N5bWxpbmsoZGlyX2lub2RlLT5pX3NiLCBjb2RhX2kyZihkaXJfaW5vZGUpLCBuYW1lLCBsZW4sIAorCQkJICAgICAgc3ltbmFtZSwgc3ltbGVuKTsKKworCS8qIG10aW1lIGlzIG5vIGdvb2QgYW55bW9yZSAqLworCWlmICggIWVycm9yICkKKwkJY29kYV9kaXJfY2hhbmdlZChkaXJfaW5vZGUsIDApOworCisJdW5sb2NrX2tlcm5lbCgpOworICAgICAgICByZXR1cm4gZXJyb3I7Cit9CisKKy8qIGRlc3RydWN0aW9uIHJvdXRpbmVzOiB1bmxpbmssIHJtZGlyICovCitpbnQgY29kYV91bmxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlKQoreworICAgICAgICBpbnQgZXJyb3I7CisJY29uc3QgY2hhciAqbmFtZSA9IGRlLT5kX25hbWUubmFtZTsKKwlpbnQgbGVuID0gZGUtPmRfbmFtZS5sZW47CisKKwlsb2NrX2tlcm5lbCgpOworCWNvZGFfdmZzX3N0YXQudW5saW5rKys7CisKKyAgICAgICAgZXJyb3IgPSB2ZW51c19yZW1vdmUoZGlyLT5pX3NiLCBjb2RhX2kyZihkaXIpLCBuYW1lLCBsZW4pOworICAgICAgICBpZiAoIGVycm9yICkgeworCQl1bmxvY2tfa2VybmVsKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgICB9CisKKwljb2RhX2Rpcl9jaGFuZ2VkKGRpciwgMCk7CisJZGUtPmRfaW5vZGUtPmlfbmxpbmstLTsKKwl1bmxvY2tfa2VybmVsKCk7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK2ludCBjb2RhX3JtZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZSkKK3sKKwljb25zdCBjaGFyICpuYW1lID0gZGUtPmRfbmFtZS5uYW1lOworCWludCBsZW4gPSBkZS0+ZF9uYW1lLmxlbjsKKyAgICAgICAgaW50IGVycm9yOworCisJbG9ja19rZXJuZWwoKTsKKwljb2RhX3Zmc19zdGF0LnJtZGlyKys7CisKKwlpZiAoIWRfdW5oYXNoZWQoZGUpKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJZXJyb3IgPSB2ZW51c19ybWRpcihkaXItPmlfc2IsIGNvZGFfaTJmKGRpciksIG5hbWUsIGxlbik7CisKKyAgICAgICAgaWYgKCBlcnJvciApIHsKKwkJdW5sb2NrX2tlcm5lbCgpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICAgfQorCisJY29kYV9kaXJfY2hhbmdlZChkaXIsIC0xKTsKKwlkZS0+ZF9pbm9kZS0+aV9ubGluay0tOworCWRfZGVsZXRlKGRlKTsKKwl1bmxvY2tfa2VybmVsKCk7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qIHJlbmFtZSAqLworc3RhdGljIGludCBjb2RhX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksIAorCQkgICAgICAgc3RydWN0IGlub2RlICpuZXdfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQoreworICAgICAgICBjb25zdCBjaGFyICpvbGRfbmFtZSA9IG9sZF9kZW50cnktPmRfbmFtZS5uYW1lOworICAgICAgICBjb25zdCBjaGFyICpuZXdfbmFtZSA9IG5ld19kZW50cnktPmRfbmFtZS5uYW1lOworCWludCBvbGRfbGVuZ3RoID0gb2xkX2RlbnRyeS0+ZF9uYW1lLmxlbjsKKwlpbnQgbmV3X2xlbmd0aCA9IG5ld19kZW50cnktPmRfbmFtZS5sZW47CisgICAgICAgIGludCBsaW5rX2FkanVzdCA9IDA7CisgICAgICAgIGludCBlcnJvcjsKKworCWxvY2tfa2VybmVsKCk7CisJY29kYV92ZnNfc3RhdC5yZW5hbWUrKzsKKworICAgICAgICBlcnJvciA9IHZlbnVzX3JlbmFtZShvbGRfZGlyLT5pX3NiLCBjb2RhX2kyZihvbGRfZGlyKSwgCisJCQkgICAgIGNvZGFfaTJmKG5ld19kaXIpLCBvbGRfbGVuZ3RoLCBuZXdfbGVuZ3RoLCAKKwkJCSAgICAgKGNvbnN0IGNoYXIgKikgb2xkX25hbWUsIChjb25zdCBjaGFyICopbmV3X25hbWUpOworCisgICAgICAgIGlmICggIWVycm9yICkgeworCQlpZiAoIG5ld19kZW50cnktPmRfaW5vZGUgKSB7CisJCQlpZiAoIFNfSVNESVIobmV3X2RlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSApCisgICAgICAgICAgICAgICAgICAgICAgICAJbGlua19hZGp1c3QgPSAxOworCisgICAgICAgICAgICAgICAgICAgICAgICBjb2RhX2Rpcl9jaGFuZ2VkKG9sZF9kaXIsIC1saW5rX2FkanVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2RhX2Rpcl9jaGFuZ2VkKG5ld19kaXIsICBsaW5rX2FkanVzdCk7CisJCQljb2RhX2ZsYWdfaW5vZGUobmV3X2RlbnRyeS0+ZF9pbm9kZSwgQ19WQVRUUik7CisJCX0gZWxzZSB7CisJCQljb2RhX2ZsYWdfaW5vZGUob2xkX2RpciwgQ19WQVRUUik7CisJCQljb2RhX2ZsYWdfaW5vZGUobmV3X2RpciwgQ19WQVRUUik7CisgICAgICAgICAgICAgICAgfQorCX0KKwl1bmxvY2tfa2VybmVsKCk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworLyogZmlsZSBvcGVyYXRpb25zIGZvciBkaXJlY3RvcmllcyAqLworaW50IGNvZGFfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqY29kYV9maWxlLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCXN0cnVjdCBkZW50cnkgKmNvZGFfZGVudHJ5ID0gY29kYV9maWxlLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgY29kYV9maWxlX2luZm8gKmNmaTsKKwlzdHJ1Y3QgZmlsZSAqaG9zdF9maWxlOworCXN0cnVjdCBpbm9kZSAqaG9zdF9pbm9kZTsKKwlpbnQgcmV0OworCisJY2ZpID0gQ09EQV9GVE9DKGNvZGFfZmlsZSk7CisJQlVHX09OKCFjZmkgfHwgY2ZpLT5jZmlfbWFnaWMgIT0gQ09EQV9NQUdJQyk7CisJaG9zdF9maWxlID0gY2ZpLT5jZmlfY29udGFpbmVyOworCisJY29kYV92ZnNfc3RhdC5yZWFkZGlyKys7CisKKwlob3N0X2lub2RlID0gaG9zdF9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlkb3duKCZob3N0X2lub2RlLT5pX3NlbSk7CisJaG9zdF9maWxlLT5mX3BvcyA9IGNvZGFfZmlsZS0+Zl9wb3M7CisKKwlpZiAoIWhvc3RfZmlsZS0+Zl9vcC0+cmVhZGRpcikgeworCQkvKiBWZW51czogd2UgbXVzdCByZWFkIFZlbnVzIGRpcmVudHMgZnJvbSB0aGUgZmlsZSAqLworCQlyZXQgPSBjb2RhX3ZlbnVzX3JlYWRkaXIoaG9zdF9maWxlLCBmaWxsZGlyLCBkaXJlbnQsIGNvZGFfZGVudHJ5KTsKKwl9IGVsc2UgeworCQkvKiBwb3RlbWtpbiBjYXNlOiB3ZSB3ZXJlIGhhbmRlZCBhIGRpcmVjdG9yeSBpbm9kZS4gKi8KKwkJLyogWXVrLCB3ZSBjYW4ndCBjYWxsIHZmc19yZWFkZGlyIGJlY2F1c2Ugd2UgYXJlIGFscmVhZHkKKwkJICogaG9sZGluZyB0aGUgaW5vZGUgc2VtYXBob3JlLiAqLworCQlyZXQgPSAtRU5PVERJUjsKKwkJaWYgKCFob3N0X2ZpbGUtPmZfb3AgfHwgIWhvc3RfZmlsZS0+Zl9vcC0+cmVhZGRpcikKKwkJCWdvdG8gb3V0OworCisJCXJldCA9IC1FTk9FTlQ7CisJCWlmICghSVNfREVBRERJUihob3N0X2lub2RlKSkgeworCQkJcmV0ID0gaG9zdF9maWxlLT5mX29wLT5yZWFkZGlyKGhvc3RfZmlsZSwgZmlsbGRpciwgZGlyZW50KTsKKwkJCWZpbGVfYWNjZXNzZWQoaG9zdF9maWxlKTsKKwkJfQorCX0KK291dDoKKwljb2RhX2ZpbGUtPmZfcG9zID0gaG9zdF9maWxlLT5mX3BvczsKKwl1cCgmaG9zdF9pbm9kZS0+aV9zZW0pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgQ0RUMkRUKHVuc2lnbmVkIGNoYXIgY2R0KQoreworCXVuc2lnbmVkIGludCBkdDsKKworCXN3aXRjaChjZHQpIHsKKwljYXNlIENEVF9VTktOT1dOOiBkdCA9IERUX1VOS05PV047IGJyZWFrOworCWNhc2UgQ0RUX0ZJRk86CSAgZHQgPSBEVF9GSUZPOyAgICBicmVhazsKKwljYXNlIENEVF9DSFI6CSAgZHQgPSBEVF9DSFI7ICAgICBicmVhazsKKwljYXNlIENEVF9ESVI6CSAgZHQgPSBEVF9ESVI7ICAgICBicmVhazsKKwljYXNlIENEVF9CTEs6CSAgZHQgPSBEVF9CTEs7ICAgICBicmVhazsKKwljYXNlIENEVF9SRUc6CSAgZHQgPSBEVF9SRUc7ICAgICBicmVhazsKKwljYXNlIENEVF9MTks6CSAgZHQgPSBEVF9MTks7ICAgICBicmVhazsKKwljYXNlIENEVF9TT0NLOgkgIGR0ID0gRFRfU09DSzsgICAgYnJlYWs7CisJY2FzZSBDRFRfV0hUOgkgIGR0ID0gRFRfV0hUOyAgICAgYnJlYWs7CisJZGVmYXVsdDoJICBkdCA9IERUX1VOS05PV047IGJyZWFrOworCX0KKwlyZXR1cm4gZHQ7Cit9CisKKy8qIHN1cHBvcnQgcm91dGluZXMgKi8KK3N0YXRpYyBpbnQgY29kYV92ZW51c19yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxwLCBmaWxsZGlyX3QgZmlsbGRpciwKKwkJCSAgICAgIHZvaWQgKmRpcmVudCwgc3RydWN0IGRlbnRyeSAqZGlyKQoreworCWludCByZXN1bHQgPSAwOyAvKiAjIG9mIGVudHJpZXMgcmV0dXJuZWQgKi8KKwlzdHJ1Y3QgdmVudXNfZGlyZW50ICp2ZGlyOworCXVuc2lnbmVkIGxvbmcgdmRpcl9zaXplID0KKwkgICAgKHVuc2lnbmVkIGxvbmcpKCYoKHN0cnVjdCB2ZW51c19kaXJlbnQgKikwKS0+ZF9uYW1lKTsKKwl1bnNpZ25lZCBpbnQgdHlwZTsKKwlzdHJ1Y3QgcXN0ciBuYW1lOworCWlub190IGlubzsKKwlpbnQgcmV0LCBpOworCisJdmRpciA9IChzdHJ1Y3QgdmVudXNfZGlyZW50ICopa21hbGxvYyhzaXplb2YoKnZkaXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZkaXIpIHJldHVybiAtRU5PTUVNOworCisJaSA9IGZpbHAtPmZfcG9zOworCXN3aXRjaChpKSB7CisJY2FzZSAwOgorCQlyZXQgPSBmaWxsZGlyKGRpcmVudCwgIi4iLCAxLCAwLCBkaXItPmRfaW5vZGUtPmlfaW5vLCBEVF9ESVIpOworCQlpZiAocmV0IDwgMCkgYnJlYWs7CisJCXJlc3VsdCsrOworCQlmaWxwLT5mX3BvcysrOworCQkvKiBmYWxsdGhyb3VnaCAqLworCWNhc2UgMToKKwkJcmV0ID0gZmlsbGRpcihkaXJlbnQsICIuLiIsIDIsIDEsIGRpci0+ZF9wYXJlbnQtPmRfaW5vZGUtPmlfaW5vLCBEVF9ESVIpOworCQlpZiAocmV0IDwgMCkgYnJlYWs7CisJCXJlc3VsdCsrOworCQlmaWxwLT5mX3BvcysrOworCQkvKiBmYWxsdGhyb3VnaCAqLworCWRlZmF1bHQ6CisJd2hpbGUgKDEpIHsKKwkJLyogcmVhZCBlbnRyaWVzIGZyb20gdGhlIGRpcmVjdG9yeSBmaWxlICovCisJCXJldCA9IGtlcm5lbF9yZWFkKGZpbHAsIGZpbHAtPmZfcG9zIC0gMiwgKGNoYXIgKil2ZGlyLAorCQkJCSAgc2l6ZW9mKCp2ZGlyKSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGsoImNvZGFfdmVudXNfcmVhZGRpcjogcmVhZCBkaXIgZmFpbGVkICVkXG4iLCByZXQpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHJldCA9PSAwKSBicmVhazsgLyogZW5kIG9mIGRpcmVjdG9yeSBmaWxlIHJlYWNoZWQgKi8KKworCQkvKiBjYXRjaCB0cnVuY2F0ZWQgcmVhZHMgKi8KKwkJaWYgKHJldCA8IHZkaXJfc2l6ZSB8fCByZXQgPCB2ZGlyX3NpemUgKyB2ZGlyLT5kX25hbWxlbikgeworCQkJcHJpbnRrKCJjb2RhX3ZlbnVzX3JlYWRkaXI6IHNob3J0IHJlYWQ6ICVsZFxuIiwKKwkJCSAgICAgICBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9pbm8pOworCQkJcmV0ID0gLUVCQURGOworCQkJYnJlYWs7CisJCX0KKwkJLyogdmFsaWRhdGUgd2hldGhlciB0aGUgZGlyZWN0b3J5IGZpbGUgYWN0dWFsbHkgbWFrZXMgc2Vuc2UgKi8KKwkJaWYgKHZkaXItPmRfcmVjbGVuIDwgdmRpcl9zaXplICsgdmRpci0+ZF9uYW1sZW4pIHsKKwkJCXByaW50aygiY29kYV92ZW51c19yZWFkZGlyOiBJbnZhbGlkIGRpcjogJWxkXG4iLAorCQkJICAgICAgIGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLT5pX2lubyk7CisJCQlyZXQgPSAtRUJBREY7CisJCQlicmVhazsKKwkJfQorCisJCW5hbWUubGVuID0gdmRpci0+ZF9uYW1sZW47CisJCW5hbWUubmFtZSA9IHZkaXItPmRfbmFtZTsKKworCQkvKiBNYWtlIHN1cmUgd2Ugc2tpcCAnLicgYW5kICcuLicsIHdlIGFscmVhZHkgZ290IHRob3NlICovCisJCWlmIChuYW1lLm5hbWVbMF0gPT0gJy4nICYmIChuYW1lLmxlbiA9PSAxIHx8CisJCSAgICAodmRpci0+ZF9uYW1lWzFdID09ICcuJyAmJiBuYW1lLmxlbiA9PSAyKSkpCisJCQl2ZGlyLT5kX2ZpbGVubyA9IG5hbWUubGVuID0gMDsKKworCQkvKiBza2lwIG51bGwgZW50cmllcyAqLworCQlpZiAodmRpci0+ZF9maWxlbm8gJiYgbmFtZS5sZW4pIHsKKwkJCS8qIHRyeSB0byBsb29rIHVwIHRoaXMgZW50cnkgaW4gdGhlIGRjYWNoZSwgdGhhdCB3YXkKKwkJCSAqIHVzZXJzcGFjZSBkb2Vzbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgYnJlYWtpbmcKKwkJCSAqIGdldGN3ZCBieSBoYXZpbmcgbWlzbWF0Y2hlZCBpbm9kZSBudW1iZXJzIGZvcgorCQkJICogaW50ZXJuYWwgdm9sdW1lIG1vdW50cG9pbnRzLiAqLworCQkJaW5vID0gZmluZF9pbm9kZV9udW1iZXIoZGlyLCAmbmFtZSk7CisJCQlpZiAoIWlubykgaW5vID0gdmRpci0+ZF9maWxlbm87CisKKwkJCXR5cGUgPSBDRFQyRFQodmRpci0+ZF90eXBlKTsKKwkJCXJldCA9IGZpbGxkaXIoZGlyZW50LCBuYW1lLm5hbWUsIG5hbWUubGVuLCBmaWxwLT5mX3BvcywKKwkJCQkgICAgICBpbm8sIHR5cGUpOyAKKwkJCS8qIGZhaWx1cmUgbWVhbnMgbm8gc3BhY2UgZm9yIGZpbGxpbmcgaW4gdGhpcyByb3VuZCAqLworCQkJaWYgKHJldCA8IDApIGJyZWFrOworCQkJcmVzdWx0Kys7CisJCX0KKwkJLyogd2UnbGwgYWx3YXlzIGhhdmUgcHJvZ3Jlc3MgYmVjYXVzZSBkX3JlY2xlbiBpcyB1bnNpZ25lZCBhbmQKKwkJICogd2UndmUgYWxyZWFkeSBlc3RhYmxpc2hlZCBpdCBpcyBub24temVyby4gKi8KKwkJZmlscC0+Zl9wb3MgKz0gdmRpci0+ZF9yZWNsZW47CisJfQorCX0gCisJa2ZyZWUodmRpcik7CisJcmV0dXJuIHJlc3VsdCA/IHJlc3VsdCA6IHJldDsKK30KKworLyogY2FsbGVkIHdoZW4gYSBjYWNoZSBsb29rdXAgc3VjY2VlZHMgKi8KK3N0YXRpYyBpbnQgY29kYV9kZW50cnlfcmV2YWxpZGF0ZShzdHJ1Y3QgZGVudHJ5ICpkZSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlLT5kX2lub2RlOworCXN0cnVjdCBjb2RhX2lub2RlX2luZm8gKmNpaTsKKworCWlmICghaW5vZGUpCisJCXJldHVybiAxOworCWxvY2tfa2VybmVsKCk7CisJaWYgKGNvZGFfaXNyb290KGlub2RlKSkKKwkJZ290byBvdXQ7CisJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpCisJCWdvdG8gYmFkOworCisJY2lpID0gSVRPQyhkZS0+ZF9pbm9kZSk7CisJaWYgKCEoY2lpLT5jX2ZsYWdzICYgKENfUFVSR0UgfCBDX0ZMVVNIKSkpCisJCWdvdG8gb3V0OworCisJc2hyaW5rX2RjYWNoZV9wYXJlbnQoZGUpOworCisJLyogcHJvcGFnYXRlIGZvciBhIGZsdXNoICovCisJaWYgKGNpaS0+Y19mbGFncyAmIENfRkxVU0gpIAorCQljb2RhX2ZsYWdfaW5vZGVfY2hpbGRyZW4oaW5vZGUsIENfRkxVU0gpOworCisJaWYgKGF0b21pY19yZWFkKCZkZS0+ZF9jb3VudCkgPiAxKQorCQkvKiBwcmV0ZW5kIGl0J3MgdmFsaWQsIGJ1dCBkb24ndCBjaGFuZ2UgdGhlIGZsYWdzICovCisJCWdvdG8gb3V0OworCisJLyogY2xlYXIgdGhlIGZsYWdzLiAqLworCWNpaS0+Y19mbGFncyAmPSB+KENfVkFUVFIgfCBDX1BVUkdFIHwgQ19GTFVTSCk7CisKK2JhZDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAxOworfQorCisvKgorICogVGhpcyBpcyB0aGUgY2FsbGJhY2sgZnJvbSBkcHV0KCkgd2hlbiBkX2NvdW50IGlzIGdvaW5nIHRvIDAuCisgKiBXZSB1c2UgdGhpcyB0byB1bmhhc2ggZGVudHJpZXMgd2l0aCBiYWQgaW5vZGVzLgorICovCitzdGF0aWMgaW50IGNvZGFfZGVudHJ5X2RlbGV0ZShzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5KQoreworCWludCBmbGFnczsKKworCWlmICghZGVudHJ5LT5kX2lub2RlKSAKKwkJcmV0dXJuIDA7CisKKwlmbGFncyA9IChJVE9DKGRlbnRyeS0+ZF9pbm9kZSktPmNfZmxhZ3MpICYgQ19QVVJHRTsKKwlpZiAoaXNfYmFkX2lub2RlKGRlbnRyeS0+ZF9pbm9kZSkgfHwgZmxhZ3MpIHsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisKKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gd2Ugd2FudCB0byBjaGVjayBpZiB0aGUgaW5vZGUgaGFzCisgKiBjaGFuZ2VkIG9uIHRoZSBzZXJ2ZXIuICBDb2RhIG1ha2VzIHRoaXMgZWFzeSBzaW5jZSB0aGUKKyAqIGNhY2hlIG1hbmFnZXIgVmVudXMgaXNzdWVzIGEgZG93bmNhbGwgdG8gdGhlIGtlcm5lbCB3aGVuIHRoaXMgCisgKiBoYXBwZW5zIAorICovCitpbnQgY29kYV9yZXZhbGlkYXRlX2lub2RlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgY29kYV92YXR0ciBhdHRyOworCWludCBlcnJvciA9IDA7CisJaW50IG9sZF9tb2RlOworCWlub190IG9sZF9pbm87CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgY29kYV9pbm9kZV9pbmZvICpjaWkgPSBJVE9DKGlub2RlKTsKKworCWxvY2tfa2VybmVsKCk7CisJaWYgKCAhY2lpLT5jX2ZsYWdzICkKKwkJZ290byBvazsKKworCWlmIChjaWktPmNfZmxhZ3MgJiAoQ19WQVRUUiB8IENfUFVSR0UgfCBDX0ZMVVNIKSkgeworCQllcnJvciA9IHZlbnVzX2dldGF0dHIoaW5vZGUtPmlfc2IsICYoY2lpLT5jX2ZpZCksICZhdHRyKTsKKwkJaWYgKCBlcnJvciApCisJCQlnb3RvIHJldHVybl9iYWQ7CisKKwkJLyogdGhpcyBpbm9kZSBtYXkgYmUgbG9zdCBpZjoKKwkJICAgLSBpdCdzIGlubyBjaGFuZ2VkIAorCQkgICAtIHR5cGUgY2hhbmdlcyBtdXN0IGJlIHBlcm1pdHRlZCBmb3IgcmVwYWlyIGFuZAorCQkgICBtaXNzaW5nIG1vdW50IHBvaW50cy4KKwkJKi8KKwkJb2xkX21vZGUgPSBpbm9kZS0+aV9tb2RlOworCQlvbGRfaW5vID0gaW5vZGUtPmlfaW5vOworCQljb2RhX3ZhdHRyX3RvX2lhdHRyKGlub2RlLCAmYXR0cik7CisKKwkJaWYgKChvbGRfbW9kZSAmIFNfSUZNVCkgIT0gKGlub2RlLT5pX21vZGUgJiBTX0lGTVQpKSB7CisJCQlwcmludGsoIkNvZGE6IGlub2RlICVsZCwgZmlkICVzIGNoYW5nZWQgdHlwZSFcbiIsCisJCQkgICAgICAgaW5vZGUtPmlfaW5vLCBjb2RhX2YycygmKGNpaS0+Y19maWQpKSk7CisJCX0KKworCQkvKiB0aGUgZm9sbG93aW5nIGNhbiBoYXBwZW4gd2hlbiBhIGxvY2FsIGZpZCBpcyByZXBsYWNlZCAKKwkJICAgd2l0aCBhIGdsb2JhbCBvbmUsIGhlcmUgd2UgbG9zZSBhbmQgZGVjbGFyZSB0aGUgaW5vZGUgYmFkICovCisJCWlmIChpbm9kZS0+aV9pbm8gIT0gb2xkX2lubykKKwkJCWdvdG8gcmV0dXJuX2JhZDsKKwkJCisJCWNvZGFfZmxhZ19pbm9kZV9jaGlsZHJlbihpbm9kZSwgQ19GTFVTSCk7CisJCWNpaS0+Y19mbGFncyAmPSB+KENfVkFUVFIgfCBDX1BVUkdFIHwgQ19GTFVTSCk7CisJfQorCitvazoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7CisKK3JldHVybl9iYWQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAtRUlPOworfQpkaWZmIC0tZ2l0IGEvZnMvY29kYS9maWxlLmMgYi9mcy9jb2RhL2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmJjMDIyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvY29kYS9maWxlLmMKQEAgLTAsMCArMSwzMDAgQEAKKy8qCisgKiBGaWxlIG9wZXJhdGlvbnMgZm9yIENvZGEuCisgKiBPcmlnaW5hbCB2ZXJzaW9uOiAoQykgMTk5NiBQZXRlciBCcmFhbSAKKyAqIFJld3JpdHRlbiBmb3IgTGludXggMi4xOiAoQykgMTk5NyBDYXJuZWdpZSBNZWxsb24gVW5pdmVyc2l0eQorICoKKyAqIENhcm5lZ2llIE1lbGxvbiBlbmNvdXJhZ2VzIHVzZXJzIG9mIHRoaXMgY29kZSB0byBjb250cmlidXRlIGltcHJvdmVtZW50cworICogdG8gdGhlIENvZGEgcHJvamVjdC4gQ29udGFjdCBQZXRlciBCcmFhbSA8Y29kYUBjcy5jbXUuZWR1Pi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bGludXgvY29kYS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvZGFfbGludXguaD4KKyNpbmNsdWRlIDxsaW51eC9jb2RhX2ZzX2kuaD4KKyNpbmNsdWRlIDxsaW51eC9jb2RhX3BzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvY29kYV9wcm9jLmg+CisKKy8qIGlmIENPREFfU1RPUkUgZmFpbHMgd2l0aCBFT1BOT1RTVVBQLCB2ZW51cyBjbGVhcmx5IGRvZXNuJ3Qgc3VwcG9ydAorICogQ09EQV9TVE9SRS9DT0RBX1JFTEVBU0UgYW5kIHdlIGZhbGwgYmFjayBvbiB1c2luZyB0aGUgQ09EQV9DTE9TRSB1cGNhbGwgKi8KK3N0YXRpYyBpbnQgdXNlX2NvZGFfY2xvc2U7CisKK3N0YXRpYyBzc2l6ZV90Citjb2RhX2ZpbGVfcmVhZChzdHJ1Y3QgZmlsZSAqY29kYV9maWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgY29kYV9maWxlX2luZm8gKmNmaTsKKwlzdHJ1Y3QgZmlsZSAqaG9zdF9maWxlOworCisJY2ZpID0gQ09EQV9GVE9DKGNvZGFfZmlsZSk7CisJQlVHX09OKCFjZmkgfHwgY2ZpLT5jZmlfbWFnaWMgIT0gQ09EQV9NQUdJQyk7CisJaG9zdF9maWxlID0gY2ZpLT5jZmlfY29udGFpbmVyOworCisJaWYgKCFob3N0X2ZpbGUtPmZfb3AgfHwgIWhvc3RfZmlsZS0+Zl9vcC0+cmVhZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gaG9zdF9maWxlLT5mX29wLT5yZWFkKGhvc3RfZmlsZSwgYnVmLCBjb3VudCwgcHBvcyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90Citjb2RhX2ZpbGVfc2VuZGZpbGUoc3RydWN0IGZpbGUgKmNvZGFfZmlsZSwgbG9mZl90ICpwcG9zLCBzaXplX3QgY291bnQsCisJCSAgIHJlYWRfYWN0b3JfdCBhY3Rvciwgdm9pZCAqdGFyZ2V0KQoreworCXN0cnVjdCBjb2RhX2ZpbGVfaW5mbyAqY2ZpOworCXN0cnVjdCBmaWxlICpob3N0X2ZpbGU7CisKKwljZmkgPSBDT0RBX0ZUT0MoY29kYV9maWxlKTsKKwlCVUdfT04oIWNmaSB8fCBjZmktPmNmaV9tYWdpYyAhPSBDT0RBX01BR0lDKTsKKwlob3N0X2ZpbGUgPSBjZmktPmNmaV9jb250YWluZXI7CisKKwlpZiAoIWhvc3RfZmlsZS0+Zl9vcCB8fCAhaG9zdF9maWxlLT5mX29wLT5zZW5kZmlsZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gaG9zdF9maWxlLT5mX29wLT5zZW5kZmlsZShob3N0X2ZpbGUsIHBwb3MsIGNvdW50LCBhY3RvciwgdGFyZ2V0KTsKK30KKworc3RhdGljIHNzaXplX3QKK2NvZGFfZmlsZV93cml0ZShzdHJ1Y3QgZmlsZSAqY29kYV9maWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmhvc3RfaW5vZGUsICpjb2RhX2lub2RlID0gY29kYV9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgY29kYV9maWxlX2luZm8gKmNmaTsKKwlzdHJ1Y3QgZmlsZSAqaG9zdF9maWxlOworCXNzaXplX3QgcmV0OworCisJY2ZpID0gQ09EQV9GVE9DKGNvZGFfZmlsZSk7CisJQlVHX09OKCFjZmkgfHwgY2ZpLT5jZmlfbWFnaWMgIT0gQ09EQV9NQUdJQyk7CisJaG9zdF9maWxlID0gY2ZpLT5jZmlfY29udGFpbmVyOworCisJaWYgKCFob3N0X2ZpbGUtPmZfb3AgfHwgIWhvc3RfZmlsZS0+Zl9vcC0+d3JpdGUpCisJCXJldHVybiAtRUlOVkFMOworCisJaG9zdF9pbm9kZSA9IGhvc3RfZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJZG93bigmY29kYV9pbm9kZS0+aV9zZW0pOworCisJcmV0ID0gaG9zdF9maWxlLT5mX29wLT53cml0ZShob3N0X2ZpbGUsIGJ1ZiwgY291bnQsIHBwb3MpOworCisJY29kYV9pbm9kZS0+aV9zaXplID0gaG9zdF9pbm9kZS0+aV9zaXplOworCWNvZGFfaW5vZGUtPmlfYmxvY2tzID0gKGNvZGFfaW5vZGUtPmlfc2l6ZSArIDUxMSkgPj4gOTsKKwljb2RhX2lub2RlLT5pX210aW1lID0gY29kYV9pbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJdXAoJmNvZGFfaW5vZGUtPmlfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2NvZGFfZmlsZV9tbWFwKHN0cnVjdCBmaWxlICpjb2RhX2ZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBjb2RhX2ZpbGVfaW5mbyAqY2ZpOworCXN0cnVjdCBjb2RhX2lub2RlX2luZm8gKmNpaTsKKwlzdHJ1Y3QgZmlsZSAqaG9zdF9maWxlOworCXN0cnVjdCBpbm9kZSAqY29kYV9pbm9kZSwgKmhvc3RfaW5vZGU7CisKKwljZmkgPSBDT0RBX0ZUT0MoY29kYV9maWxlKTsKKwlCVUdfT04oIWNmaSB8fCBjZmktPmNmaV9tYWdpYyAhPSBDT0RBX01BR0lDKTsKKwlob3N0X2ZpbGUgPSBjZmktPmNmaV9jb250YWluZXI7CisKKwlpZiAoIWhvc3RfZmlsZS0+Zl9vcCB8fCAhaG9zdF9maWxlLT5mX29wLT5tbWFwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWNvZGFfaW5vZGUgPSBjb2RhX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCWhvc3RfaW5vZGUgPSBob3N0X2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCWNvZGFfZmlsZS0+Zl9tYXBwaW5nID0gaG9zdF9maWxlLT5mX21hcHBpbmc7CisJaWYgKGNvZGFfaW5vZGUtPmlfbWFwcGluZyA9PSAmY29kYV9pbm9kZS0+aV9kYXRhKQorCQljb2RhX2lub2RlLT5pX21hcHBpbmcgPSBob3N0X2lub2RlLT5pX21hcHBpbmc7CisKKwkvKiBvbmx5IGFsbG93IGFkZGl0aW9uYWwgbW1hcHMgYXMgbG9uZyBhcyB1c2Vyc3BhY2UgaXNuJ3QgY2hhbmdpbmcKKwkgKiB0aGUgY29udGFpbmVyIGZpbGUgb24gdXMhICovCisJZWxzZSBpZiAoY29kYV9pbm9kZS0+aV9tYXBwaW5nICE9IGhvc3RfaW5vZGUtPmlfbWFwcGluZykKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIGtlZXAgdHJhY2sgb2YgaG93IG9mdGVuIHRoZSBjb2RhX2lub2RlL2hvc3RfZmlsZSBoYXMgYmVlbiBtbWFwcGVkICovCisJY2lpID0gSVRPQyhjb2RhX2lub2RlKTsKKwljaWktPmNfbWFwY291bnQrKzsKKwljZmktPmNmaV9tYXBjb3VudCsrOworCisJcmV0dXJuIGhvc3RfZmlsZS0+Zl9vcC0+bW1hcChob3N0X2ZpbGUsIHZtYSk7Cit9CisKK2ludCBjb2RhX29wZW4oc3RydWN0IGlub2RlICpjb2RhX2lub2RlLCBzdHJ1Y3QgZmlsZSAqY29kYV9maWxlKQoreworCXN0cnVjdCBmaWxlICpob3N0X2ZpbGUgPSBOVUxMOworCWludCBlcnJvcjsKKwl1bnNpZ25lZCBzaG9ydCBmbGFncyA9IGNvZGFfZmlsZS0+Zl9mbGFncyAmICh+T19FWENMKTsKKwl1bnNpZ25lZCBzaG9ydCBjb2RhX2ZsYWdzID0gY29kYV9mbGFnc190b19jZmxhZ3MoZmxhZ3MpOworCXN0cnVjdCBjb2RhX2ZpbGVfaW5mbyAqY2ZpOworCisJY29kYV92ZnNfc3RhdC5vcGVuKys7CisKKwljZmkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY29kYV9maWxlX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNmaSkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWxvY2tfa2VybmVsKCk7CisKKwllcnJvciA9IHZlbnVzX29wZW4oY29kYV9pbm9kZS0+aV9zYiwgY29kYV9pMmYoY29kYV9pbm9kZSksIGNvZGFfZmxhZ3MsCisJCQkgICAmaG9zdF9maWxlKTsgCisJaWYgKGVycm9yIHx8ICFob3N0X2ZpbGUpIHsKKwkJa2ZyZWUoY2ZpKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJaG9zdF9maWxlLT5mX2ZsYWdzIHw9IGNvZGFfZmlsZS0+Zl9mbGFncyAmIChPX0FQUEVORCB8IE9fU1lOQyk7CisKKwljZmktPmNmaV9tYWdpYyA9IENPREFfTUFHSUM7CisJY2ZpLT5jZmlfbWFwY291bnQgPSAwOworCWNmaS0+Y2ZpX2NvbnRhaW5lciA9IGhvc3RfZmlsZTsKKworCUJVR19PTihjb2RhX2ZpbGUtPnByaXZhdGVfZGF0YSAhPSBOVUxMKTsKKwljb2RhX2ZpbGUtPnByaXZhdGVfZGF0YSA9IGNmaTsKKworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGNvZGFfZmx1c2goc3RydWN0IGZpbGUgKmNvZGFfZmlsZSkKK3sKKwl1bnNpZ25lZCBzaG9ydCBmbGFncyA9IGNvZGFfZmlsZS0+Zl9mbGFncyAmIH5PX0VYQ0w7CisJdW5zaWduZWQgc2hvcnQgY29kYV9mbGFncyA9IGNvZGFfZmxhZ3NfdG9fY2ZsYWdzKGZsYWdzKTsKKwlzdHJ1Y3QgY29kYV9maWxlX2luZm8gKmNmaTsKKwlzdHJ1Y3QgaW5vZGUgKmNvZGFfaW5vZGU7CisJaW50IGVyciA9IDAsIGZjbnQ7CisKKwlsb2NrX2tlcm5lbCgpOworCisJY29kYV92ZnNfc3RhdC5mbHVzaCsrOworCisJLyogbGFzdCBjbG9zZSBzZW1hbnRpY3MgKi8KKwlmY250ID0gZmlsZV9jb3VudChjb2RhX2ZpbGUpOworCWlmIChmY250ID4gMSkKKwkJZ290byBvdXQ7CisKKwkvKiBObyBuZWVkIHRvIG1ha2UgYW4gdXBjYWxsIHdoZW4gd2UgaGF2ZSBub3QgbWFkZSBhbnkgbW9kaWZpY2F0aW9ucworCSAqIHRvIHRoZSBmaWxlICovCisJaWYgKChjb2RhX2ZpbGUtPmZfZmxhZ3MgJiBPX0FDQ01PREUpID09IE9fUkRPTkxZKQorCQlnb3RvIG91dDsKKworCWlmICh1c2VfY29kYV9jbG9zZSkKKwkJZ290byBvdXQ7CisKKwljZmkgPSBDT0RBX0ZUT0MoY29kYV9maWxlKTsKKwlCVUdfT04oIWNmaSB8fCBjZmktPmNmaV9tYWdpYyAhPSBDT0RBX01BR0lDKTsKKworCWNvZGFfaW5vZGUgPSBjb2RhX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCisJZXJyID0gdmVudXNfc3RvcmUoY29kYV9pbm9kZS0+aV9zYiwgY29kYV9pMmYoY29kYV9pbm9kZSksIGNvZGFfZmxhZ3MsCisJCQkgIGNvZGFfZmlsZS0+Zl91aWQpOworCisJaWYgKGVyciA9PSAtRU9QTk9UU1VQUCkgeworCQl1c2VfY29kYV9jbG9zZSA9IDE7CisJCWVyciA9IDA7CisJfQorCitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnI7Cit9CisKK2ludCBjb2RhX3JlbGVhc2Uoc3RydWN0IGlub2RlICpjb2RhX2lub2RlLCBzdHJ1Y3QgZmlsZSAqY29kYV9maWxlKQoreworCXVuc2lnbmVkIHNob3J0IGZsYWdzID0gKGNvZGFfZmlsZS0+Zl9mbGFncykgJiAofk9fRVhDTCk7CisJdW5zaWduZWQgc2hvcnQgY29kYV9mbGFncyA9IGNvZGFfZmxhZ3NfdG9fY2ZsYWdzKGZsYWdzKTsKKwlzdHJ1Y3QgY29kYV9maWxlX2luZm8gKmNmaTsKKwlzdHJ1Y3QgY29kYV9pbm9kZV9pbmZvICpjaWk7CisJc3RydWN0IGlub2RlICpob3N0X2lub2RlOworCWludCBlcnIgPSAwOworCisJbG9ja19rZXJuZWwoKTsKKwljb2RhX3Zmc19zdGF0LnJlbGVhc2UrKzsKKyAKKwlpZiAoIXVzZV9jb2RhX2Nsb3NlKSB7CisJCWVyciA9IHZlbnVzX3JlbGVhc2UoY29kYV9pbm9kZS0+aV9zYiwgY29kYV9pMmYoY29kYV9pbm9kZSksCisJCQkJICAgIGNvZGFfZmxhZ3MpOworCQlpZiAoZXJyID09IC1FT1BOT1RTVVBQKSB7CisJCQl1c2VfY29kYV9jbG9zZSA9IDE7CisJCQllcnIgPSAwOworCQl9CisJfQorCisJY2ZpID0gQ09EQV9GVE9DKGNvZGFfZmlsZSk7CisJQlVHX09OKCFjZmkgfHwgY2ZpLT5jZmlfbWFnaWMgIT0gQ09EQV9NQUdJQyk7CisKKwlpZiAodXNlX2NvZGFfY2xvc2UpCisJCWVyciA9IHZlbnVzX2Nsb3NlKGNvZGFfaW5vZGUtPmlfc2IsIGNvZGFfaTJmKGNvZGFfaW5vZGUpLAorCQkJCSAgY29kYV9mbGFncywgY29kYV9maWxlLT5mX3VpZCk7CisKKwlob3N0X2lub2RlID0gY2ZpLT5jZmlfY29udGFpbmVyLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwljaWkgPSBJVE9DKGNvZGFfaW5vZGUpOworCisJLyogZGlkIHdlIG1tYXAgdGhpcyBmaWxlPyAqLworCWlmIChjb2RhX2lub2RlLT5pX21hcHBpbmcgPT0gJmhvc3RfaW5vZGUtPmlfZGF0YSkgeworCQljaWktPmNfbWFwY291bnQgLT0gY2ZpLT5jZmlfbWFwY291bnQ7CisJCWlmICghY2lpLT5jX21hcGNvdW50KQorCQkJY29kYV9pbm9kZS0+aV9tYXBwaW5nID0gJmNvZGFfaW5vZGUtPmlfZGF0YTsKKwl9CisKKwlmcHV0KGNmaS0+Y2ZpX2NvbnRhaW5lcik7CisJa2ZyZWUoY29kYV9maWxlLT5wcml2YXRlX2RhdGEpOworCWNvZGFfZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgY29kYV9mc3luYyhzdHJ1Y3QgZmlsZSAqY29kYV9maWxlLCBzdHJ1Y3QgZGVudHJ5ICpjb2RhX2RlbnRyeSwgaW50IGRhdGFzeW5jKQoreworCXN0cnVjdCBmaWxlICpob3N0X2ZpbGU7CisJc3RydWN0IGRlbnRyeSAqaG9zdF9kZW50cnk7CisJc3RydWN0IGlub2RlICpob3N0X2lub2RlLCAqY29kYV9pbm9kZSA9IGNvZGFfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBjb2RhX2ZpbGVfaW5mbyAqY2ZpOworCWludCBlcnIgPSAwOworCisJaWYgKCEoU19JU1JFRyhjb2RhX2lub2RlLT5pX21vZGUpIHx8IFNfSVNESVIoY29kYV9pbm9kZS0+aV9tb2RlKSB8fAorCSAgICAgIFNfSVNMTksoY29kYV9pbm9kZS0+aV9tb2RlKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJY2ZpID0gQ09EQV9GVE9DKGNvZGFfZmlsZSk7CisJQlVHX09OKCFjZmkgfHwgY2ZpLT5jZmlfbWFnaWMgIT0gQ09EQV9NQUdJQyk7CisJaG9zdF9maWxlID0gY2ZpLT5jZmlfY29udGFpbmVyOworCisJY29kYV92ZnNfc3RhdC5mc3luYysrOworCisJaWYgKGhvc3RfZmlsZS0+Zl9vcCAmJiBob3N0X2ZpbGUtPmZfb3AtPmZzeW5jKSB7CisJCWhvc3RfZGVudHJ5ID0gaG9zdF9maWxlLT5mX2RlbnRyeTsKKwkJaG9zdF9pbm9kZSA9IGhvc3RfZGVudHJ5LT5kX2lub2RlOworCQlkb3duKCZob3N0X2lub2RlLT5pX3NlbSk7CisJCWVyciA9IGhvc3RfZmlsZS0+Zl9vcC0+ZnN5bmMoaG9zdF9maWxlLCBob3N0X2RlbnRyeSwgZGF0YXN5bmMpOworCQl1cCgmaG9zdF9pbm9kZS0+aV9zZW0pOworCX0KKworCWlmICggIWVyciAmJiAhZGF0YXN5bmMgKSB7CisJCWxvY2tfa2VybmVsKCk7CisJCWVyciA9IHZlbnVzX2ZzeW5jKGNvZGFfaW5vZGUtPmlfc2IsIGNvZGFfaTJmKGNvZGFfaW5vZGUpKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgY29kYV9maWxlX29wZXJhdGlvbnMgPSB7CisJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAorCS5yZWFkCQk9IGNvZGFfZmlsZV9yZWFkLAorCS53cml0ZQkJPSBjb2RhX2ZpbGVfd3JpdGUsCisJLm1tYXAJCT0gY29kYV9maWxlX21tYXAsCisJLm9wZW4JCT0gY29kYV9vcGVuLAorCS5mbHVzaAkJPSBjb2RhX2ZsdXNoLAorCS5yZWxlYXNlCT0gY29kYV9yZWxlYXNlLAorCS5mc3luYwkJPSBjb2RhX2ZzeW5jLAorCS5zZW5kZmlsZQk9IGNvZGFfZmlsZV9zZW5kZmlsZSwKK307CisKZGlmZiAtLWdpdCBhL2ZzL2NvZGEvaW5vZGUuYyBiL2ZzL2NvZGEvaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGE3M2ZiCi0tLSAvZGV2L251bGwKKysrIGIvZnMvY29kYS9pbm9kZS5jCkBAIC0wLDAgKzEsMzIxIEBACisvKgorICogU3VwZXIgYmxvY2svZmlsZXN5c3RlbSB3aWRlIG9wZXJhdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYgUGV0ZXIgSi4gQnJhYW0gPGJyYWFtQG1hdGhzLm94LmFjLnVrPiBhbmQgCisgKiBNaWNoYWVsIENhbGxhaGFuIDxjYWxsYWhhbkBtYXRocy5veC5hYy51az4gCisgKiAKKyAqIFJld3JpdHRlbiBmb3IgTGludXggMi4xLiAgUGV0ZXIgQnJhYW0gPGJyYWFtQGNzLmNtdS5lZHU+CisgKiBDb3B5cmlnaHQgKEMpIENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorCisjaW5jbHVkZSA8bGludXgvY29kYS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvZGFfbGludXguaD4KKyNpbmNsdWRlIDxsaW51eC9jb2RhX3BzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvY29kYV9mc19pLmg+CisjaW5jbHVkZSA8bGludXgvY29kYV9jYWNoZS5oPgorCisvKiBWRlMgc3VwZXJfYmxvY2sgb3BzICovCitzdGF0aWMgdm9pZCBjb2RhX2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKK3N0YXRpYyB2b2lkIGNvZGFfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK3N0YXRpYyBpbnQgY29kYV9zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1Zik7CisKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKiBjb2RhX2lub2RlX2NhY2hlcDsKKworc3RhdGljIHN0cnVjdCBpbm9kZSAqY29kYV9hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBjb2RhX2lub2RlX2luZm8gKmVpOworCWVpID0gKHN0cnVjdCBjb2RhX2lub2RlX2luZm8gKilrbWVtX2NhY2hlX2FsbG9jKGNvZGFfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJaWYgKCFlaSkKKwkJcmV0dXJuIE5VTEw7CisJbWVtc2V0KCZlaS0+Y19maWQsIDAsIHNpemVvZihzdHJ1Y3QgQ29kYUZpZCkpOworCWVpLT5jX2ZsYWdzID0gMDsKKwllaS0+Y191aWQgPSAwOworCWVpLT5jX2NhY2hlZF9wZXJtID0gMDsKKwlyZXR1cm4gJmVpLT52ZnNfaW5vZGU7Cit9CisKK3N0YXRpYyB2b2lkIGNvZGFfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWttZW1fY2FjaGVfZnJlZShjb2RhX2lub2RlX2NhY2hlcCwgSVRPQyhpbm9kZSkpOworfQorCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBjb2RhX2lub2RlX2luZm8gKmVpID0gKHN0cnVjdCBjb2RhX2lub2RlX2luZm8gKikgZm9vOworCisJaWYgKChmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CisJICAgIFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikKKwkJaW5vZGVfaW5pdF9vbmNlKCZlaS0+dmZzX2lub2RlKTsKK30KKyAKK2ludCBjb2RhX2luaXRfaW5vZGVjYWNoZSh2b2lkKQoreworCWNvZGFfaW5vZGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoImNvZGFfaW5vZGVfY2FjaGUiLAorCQkJCXNpemVvZihzdHJ1Y3QgY29kYV9pbm9kZV9pbmZvKSwKKwkJCQkwLCBTTEFCX1JFQ0xBSU1fQUNDT1VOVCwKKwkJCQlpbml0X29uY2UsIE5VTEwpOworCWlmIChjb2RhX2lub2RlX2NhY2hlcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBjb2RhX2Rlc3Ryb3lfaW5vZGVjYWNoZSh2b2lkKQoreworCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3koY29kYV9pbm9kZV9jYWNoZXApKQorCQlwcmludGsoS0VSTl9JTkZPICJjb2RhX2lub2RlX2NhY2hlOiBub3QgYWxsIHN0cnVjdHVyZXMgd2VyZSBmcmVlZFxuIik7Cit9CisKK3N0YXRpYyBpbnQgY29kYV9yZW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpCit7CisJKmZsYWdzIHw9IE1TX05PRElSQVRJTUU7CisJcmV0dXJuIDA7Cit9CisKKy8qIGV4cG9ydGVkIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBjb2RhX3N1cGVyX29wZXJhdGlvbnMgPQoreworCS5hbGxvY19pbm9kZQk9IGNvZGFfYWxsb2NfaW5vZGUsCisJLmRlc3Ryb3lfaW5vZGUJPSBjb2RhX2Rlc3Ryb3lfaW5vZGUsCisJLmNsZWFyX2lub2RlCT0gY29kYV9jbGVhcl9pbm9kZSwKKwkucHV0X3N1cGVyCT0gY29kYV9wdXRfc3VwZXIsCisJLnN0YXRmcwkJPSBjb2RhX3N0YXRmcywKKwkucmVtb3VudF9mcwk9IGNvZGFfcmVtb3VudCwKK307CisKK3N0YXRpYyBpbnQgZ2V0X2RldmljZV9pbmRleChzdHJ1Y3QgY29kYV9tb3VudF9kYXRhICpkYXRhKQoreworCXN0cnVjdCBmaWxlICpmaWxlOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IGlkeDsKKworCWlmKGRhdGEgPT0gTlVMTCkgeworCQlwcmludGsoImNvZGFfcmVhZF9zdXBlcjogQmFkIG1vdW50IGRhdGFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYoZGF0YS0+dmVyc2lvbiAhPSBDT0RBX01PVU5UX1ZFUlNJT04pIHsKKwkJcHJpbnRrKCJjb2RhX3JlYWRfc3VwZXI6IEJhZCBtb3VudCB2ZXJzaW9uXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWZpbGUgPSBmZ2V0KGRhdGEtPmZkKTsKKwlpbm9kZSA9IE5VTEw7CisJaWYoZmlsZSkKKwkJaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwkKKwlpZighaW5vZGUgfHwgIVNfSVNDSFIoaW5vZGUtPmlfbW9kZSkgfHwKKwkgICBpbWFqb3IoaW5vZGUpICE9IENPREFfUFNERVZfTUFKT1IpIHsKKwkJaWYoZmlsZSkKKwkJCWZwdXQoZmlsZSk7CisKKwkJcHJpbnRrKCJjb2RhX3JlYWRfc3VwZXI6IEJhZCBmaWxlXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlkeCA9IGltaW5vcihpbm9kZSk7CisJZnB1dChmaWxlKTsKKworCWlmKGlkeCA8IDAgfHwgaWR4ID49IE1BWF9DT0RBREVWUykgeworCQlwcmludGsoImNvZGFfcmVhZF9zdXBlcjogQmFkIG1pbm9yIG51bWJlclxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gaWR4OworfQorCitzdGF0aWMgaW50IGNvZGFfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQoreworICAgICAgICBzdHJ1Y3QgaW5vZGUgKnJvb3QgPSBOVUxMOyAKKwlzdHJ1Y3QgY29kYV9zYl9pbmZvICpzYmkgPSBOVUxMOworCXN0cnVjdCB2ZW51c19jb21tICp2YyA9IE5VTEw7CisJc3RydWN0IENvZGFGaWQgZmlkOworICAgICAgICBpbnQgZXJyb3I7CisJaW50IGlkeDsKKworCWlkeCA9IGdldF9kZXZpY2VfaW5kZXgoKHN0cnVjdCBjb2RhX21vdW50X2RhdGEgKikgZGF0YSk7CisKKwkvKiBJZ25vcmUgZXJyb3JzIGluIGRhdGEsIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCisJaWYoaWR4ID09IC0xKQorCQlpZHggPSAwOworCQorCXByaW50ayhLRVJOX0lORk8gImNvZGFfcmVhZF9zdXBlcjogZGV2aWNlIGluZGV4OiAlaVxuIiwgaWR4KTsKKworCXZjID0gJmNvZGFfY29tbXNbaWR4XTsKKwlpZiAoIXZjLT52Y19pbnVzZSkgeworCQlwcmludGsoImNvZGFfcmVhZF9zdXBlcjogTm8gcHNldWRvIGRldmljZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworICAgICAgICBpZiAoIHZjLT52Y19zYiApIHsKKwkJcHJpbnRrKCJjb2RhX3JlYWRfc3VwZXI6IERldmljZSBhbHJlYWR5IG1vdW50ZWRcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXNiaSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjb2RhX3NiX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZighc2JpKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXZjLT52Y19zYiA9IHNiOworCisJc2JpLT5zYmlfdmNvbW0gPSB2YzsKKworICAgICAgICBzYi0+c19mc19pbmZvID0gc2JpOworCXNiLT5zX2ZsYWdzIHw9IE1TX05PRElSQVRJTUU7IC8qIHByb2JhYmx5IGV2ZW4gbm9hdGltZSAqLworICAgICAgICBzYi0+c19ibG9ja3NpemUgPSAxMDI0OwkvKiBYWFhYWCAgd2hhdCBkbyB3ZSBwdXQgaGVyZT8/ICovCisgICAgICAgIHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzID0gMTA7CisgICAgICAgIHNiLT5zX21hZ2ljID0gQ09EQV9TVVBFUl9NQUdJQzsKKyAgICAgICAgc2ItPnNfb3AgPSAmY29kYV9zdXBlcl9vcGVyYXRpb25zOworCisJLyogZ2V0IHJvb3QgZmlkIGZyb20gVmVudXM6IHRoaXMgbmVlZHMgdGhlIHJvb3QgaW5vZGUgKi8KKwllcnJvciA9IHZlbnVzX3Jvb3RmaWQoc2IsICZmaWQpOworCWlmICggZXJyb3IgKSB7CisJICAgICAgICBwcmludGsoImNvZGFfcmVhZF9zdXBlcjogY29kYV9nZXRfcm9vdGZpZCBmYWlsZWQgd2l0aCAlZFxuIiwKKwkJICAgICAgIGVycm9yKTsKKwkJZ290byBlcnJvcjsKKwl9CisJcHJpbnRrKCJjb2RhX3JlYWRfc3VwZXI6IHJvb3RmaWQgaXMgJXNcbiIsIGNvZGFfZjJzKCZmaWQpKTsKKwkKKwkvKiBtYWtlIHJvb3QgaW5vZGUgKi8KKyAgICAgICAgZXJyb3IgPSBjb2RhX2Nub2RlX21ha2UoJnJvb3QsICZmaWQsIHNiKTsKKyAgICAgICAgaWYgKCBlcnJvciB8fCAhcm9vdCApIHsKKwkgICAgcHJpbnRrKCJGYWlsdXJlIG9mIGNvZGFfY25vZGVfbWFrZSBmb3Igcm9vdDogZXJyb3IgJWRcbiIsIGVycm9yKTsKKwkgICAgZ290byBlcnJvcjsKKwl9IAorCisJcHJpbnRrKCJjb2RhX3JlYWRfc3VwZXI6IHJvb3Rpbm9kZSBpcyAlbGQgZGV2ICVzXG4iLCAKKwkgICAgICAgcm9vdC0+aV9pbm8sIHJvb3QtPmlfc2ItPnNfaWQpOworCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdCk7CisJaWYgKCFzYi0+c19yb290KQorCQlnb3RvIGVycm9yOworICAgICAgICByZXR1cm4gMDsKKworIGVycm9yOgorCWlmIChzYmkpIHsKKwkJa2ZyZWUoc2JpKTsKKwkJaWYodmMpCisJCQl2Yy0+dmNfc2IgPSBOVUxMOwkJCisJfQorCWlmIChyb290KQorICAgICAgICAgICAgICAgIGlwdXQocm9vdCk7CisKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyB2b2lkIGNvZGFfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisgICAgICAgIHN0cnVjdCBjb2RhX3NiX2luZm8gKnNiaTsKKworCXNiaSA9IGNvZGFfc2JwKHNiKTsKKwlzYmktPnNiaV92Y29tbS0+dmNfc2IgPSBOVUxMOworCisJcHJpbnRrKCJDb2RhOiBCeWUgYnllLlxuIik7CisJa2ZyZWUoc2JpKTsKK30KKworc3RhdGljIHZvaWQgY29kYV9jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWNvZGFfY2FjaGVfY2xlYXJfaW5vZGUoaW5vZGUpOworfQorCitpbnQgY29kYV9nZXRhdHRyKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdCAqc3RhdCkKK3sKKwlpbnQgZXJyID0gY29kYV9yZXZhbGlkYXRlX2lub2RlKGRlbnRyeSk7CisJaWYgKCFlcnIpCisJCWdlbmVyaWNfZmlsbGF0dHIoZGVudHJ5LT5kX2lub2RlLCBzdGF0KTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgY29kYV9zZXRhdHRyKHN0cnVjdCBkZW50cnkgKmRlLCBzdHJ1Y3QgaWF0dHIgKmlhdHRyKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgY29kYV92YXR0ciB2YXR0cjsKKwlpbnQgZXJyb3I7CisKKwlsb2NrX2tlcm5lbCgpOworCQorCW1lbXNldCgmdmF0dHIsIDAsIHNpemVvZih2YXR0cikpOyAKKworCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwljb2RhX2lhdHRyX3RvX3ZhdHRyKGlhdHRyLCAmdmF0dHIpOworCXZhdHRyLnZhX3R5cGUgPSBDX1ZOT047IC8qIGNhbm5vdCBzZXQgdHlwZSAqLworCisJLyogVmVudXMgaXMgcmVzcG9uc2libGUgZm9yIHRydW5jYXRpbmcgdGhlIGNvbnRhaW5lci1maWxlISEhICovCisJZXJyb3IgPSB2ZW51c19zZXRhdHRyKGlub2RlLT5pX3NiLCBjb2RhX2kyZihpbm9kZSksICZ2YXR0cik7CisKKwlpZiAoICFlcnJvciApIHsKKwkgICAgICAgIGNvZGFfdmF0dHJfdG9faWF0dHIoaW5vZGUsICZ2YXR0cik7IAorCQljb2RhX2NhY2hlX2NsZWFyX2lub2RlKGlub2RlKTsKKwl9CisKKwl1bmxvY2tfa2VybmVsKCk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGNvZGFfZmlsZV9pbm9kZV9vcGVyYXRpb25zID0geworCS5wZXJtaXNzaW9uCT0gY29kYV9wZXJtaXNzaW9uLAorCS5nZXRhdHRyCT0gY29kYV9nZXRhdHRyLAorCS5zZXRhdHRyCT0gY29kYV9zZXRhdHRyLAorfTsKKworc3RhdGljIGludCBjb2RhX3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQoreworCWludCBlcnJvcjsKKwkKKwlsb2NrX2tlcm5lbCgpOworCisJZXJyb3IgPSB2ZW51c19zdGF0ZnMoc2IsIGJ1Zik7CisKKwl1bmxvY2tfa2VybmVsKCk7CisKKwlpZiAoZXJyb3IpIHsKKwkJLyogZmFrZSBzb21ldGhpbmcgbGlrZSBBRlMgZG9lcyAqLworCQlidWYtPmZfYmxvY2tzID0gOTAwMDAwMDsKKwkJYnVmLT5mX2JmcmVlICA9IDkwMDAwMDA7CisJCWJ1Zi0+Zl9iYXZhaWwgPSA5MDAwMDAwOworCQlidWYtPmZfZmlsZXMgID0gOTAwMDAwMDsKKwkJYnVmLT5mX2ZmcmVlICA9IDkwMDAwMDA7CisJfQorCisJLyogYW5kIGZpbGwgaW4gdGhlIHJlc3QgKi8KKwlidWYtPmZfdHlwZSA9IENPREFfU1VQRVJfTUFHSUM7CisJYnVmLT5mX2JzaXplID0gMTAyNDsKKwlidWYtPmZfbmFtZWxlbiA9IENPREFfTUFYTkFNTEVOOworCisJcmV0dXJuIDA7IAorfQorCisvKiBpbml0X2NvZGE6IHVzZWQgYnkgZmlsZXN5c3RlbXMuYyB0byByZWdpc3RlciBjb2RhICovCisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmNvZGFfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9ub2Rldihmc190eXBlLCBmbGFncywgZGF0YSwgY29kYV9maWxsX3N1cGVyKTsKK30KKworc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgY29kYV9mc190eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiY29kYSIsCisJLmdldF9zYgkJPSBjb2RhX2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfYW5vbl9zdXBlciwKKwkuZnNfZmxhZ3MJPSBGU19CSU5BUllfTU9VTlREQVRBLAorfTsKKwpkaWZmIC0tZ2l0IGEvZnMvY29kYS9waW9jdGwuYyBiL2ZzL2NvZGEvcGlvY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI3NzE0OQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2NvZGEvcGlvY3RsLmMKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIFBpb2N0bCBvcGVyYXRpb25zIGZvciBDb2RhLgorICogT3JpZ2luYWwgdmVyc2lvbjogKEMpIDE5OTYgUGV0ZXIgQnJhYW0gCisgKiBSZXdyaXR0ZW4gZm9yIExpbnV4IDIuMTogKEMpIDE5OTcgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKKyAqCisgKiBDYXJuZWdpZSBNZWxsb24gZW5jb3VyYWdlcyB1c2VycyBvZiB0aGlzIGNvZGUgdG8gY29udHJpYnV0ZSBpbXByb3ZlbWVudHMKKyAqIHRvIHRoZSBDb2RhIHByb2plY3QuIENvbnRhY3QgUGV0ZXIgQnJhYW0gPGNvZGFAY3MuY211LmVkdT4uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bGludXgvY29kYS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvZGFfbGludXguaD4KKyNpbmNsdWRlIDxsaW51eC9jb2RhX2ZzX2kuaD4KKyNpbmNsdWRlIDxsaW51eC9jb2RhX3BzZGV2Lmg+CisKKy8qIHBpb2N0bCBvcHMgKi8KK3N0YXRpYyBpbnQgY29kYV9pb2N0bF9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLAorCQkJCSBzdHJ1Y3QgbmFtZWlkYXRhICpuZCk7CitzdGF0aWMgaW50IGNvZGFfcGlvY3RsKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHAsIAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIHVzZXJfZGF0YSk7CisKKy8qIGV4cG9ydGVkIGZyb20gdGhpcyBmaWxlICovCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBjb2RhX2lvY3RsX2lub2RlX29wZXJhdGlvbnMgPQoreworCS5wZXJtaXNzaW9uCT0gY29kYV9pb2N0bF9wZXJtaXNzaW9uLAorCS5zZXRhdHRyCT0gY29kYV9zZXRhdHRyLAorfTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjb2RhX2lvY3RsX29wZXJhdGlvbnMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5pb2N0bAkJPSBjb2RhX3Bpb2N0bCwKK307CisKKy8qIHRoZSBjb2RhIHBpb2N0bCBpbm9kZSBvcHMgKi8KK3N0YXRpYyBpbnQgY29kYV9pb2N0bF9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLAorCQkJCSBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29kYV9waW9jdGwoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCwgCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgdXNlcl9kYXRhKQoreworCXN0cnVjdCBuYW1laWRhdGEgbmQ7CisgICAgICAgIGludCBlcnJvcjsKKwlzdHJ1Y3QgUGlvY3RsRGF0YSBkYXRhOworICAgICAgICBzdHJ1Y3QgaW5vZGUgKnRhcmdldF9pbm9kZSA9IE5VTEw7CisgICAgICAgIHN0cnVjdCBjb2RhX2lub2RlX2luZm8gKmNucDsKKworICAgICAgICAvKiBnZXQgdGhlIFBpb2N0bCBkYXRhIGFyZ3VtZW50cyBmcm9tIHVzZXIgc3BhY2UgKi8KKyAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKCZkYXRhLCAodm9pZCBfX3VzZXIgKil1c2VyX2RhdGEsIHNpemVvZihkYXRhKSkpIHsKKwkgICAgcmV0dXJuIC1FSU5WQUw7CisJfQorICAgICAgIAorICAgICAgICAvKiAKKyAgICAgICAgICogTG9vayB1cCB0aGUgcGF0aG5hbWUuIE5vdGUgdGhhdCB0aGUgcGF0aG5hbWUgaXMgaW4gCisgICAgICAgICAqIHVzZXIgbWVtb3J5LCBhbmQgbmFtZWkgdGFrZXMgY2FyZSBvZiB0aGlzCisgICAgICAgICAqLworICAgICAgICBpZiAoIGRhdGEuZm9sbG93ICkgeworICAgICAgICAgICAgICAgIGVycm9yID0gdXNlcl9wYXRoX3dhbGsoZGF0YS5wYXRoLCAmbmQpOworCX0gZWxzZSB7CisJICAgICAgICBlcnJvciA9IHVzZXJfcGF0aF93YWxrX2xpbmsoZGF0YS5wYXRoLCAmbmQpOworCX0KKwkJCisJaWYgKCBlcnJvciApIHsKKwkJcmV0dXJuIGVycm9yOworICAgICAgICB9IGVsc2UgeworCSAgICAgICAgdGFyZ2V0X2lub2RlID0gbmQuZGVudHJ5LT5kX2lub2RlOworCX0KKwkKKwkvKiByZXR1cm4gaWYgaXQgaXMgbm90IGEgQ29kYSBpbm9kZSAqLworCWlmICggdGFyZ2V0X2lub2RlLT5pX3NiICE9IGlub2RlLT5pX3NiICkgeworCQlwYXRoX3JlbGVhc2UoJm5kKTsKKwkgICAgICAgIHJldHVybiAgLUVJTlZBTDsKKwl9CisKKwkvKiBub3cgcHJvY2VlZCB0byBtYWtlIHRoZSB1cGNhbGwgKi8KKyAgICAgICAgY25wID0gSVRPQyh0YXJnZXRfaW5vZGUpOworCisJZXJyb3IgPSB2ZW51c19waW9jdGwoaW5vZGUtPmlfc2IsICYoY25wLT5jX2ZpZCksIGNtZCwgJmRhdGEpOworCisJcGF0aF9yZWxlYXNlKCZuZCk7CisgICAgICAgIHJldHVybiBlcnJvcjsKK30KKwpkaWZmIC0tZ2l0IGEvZnMvY29kYS9wc2Rldi5jIGIvZnMvY29kYS9wc2Rldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMDAxYTkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jb2RhL3BzZGV2LmMKQEAgLTAsMCArMSw0NjIgQEAKKy8qCisgKiAgICAgIAlBbiBpbXBsZW1lbnRhdGlvbiBvZiBhIGxvYWRhYmxlIGtlcm5lbCBtb2RlIGRyaXZlciBwcm92aWRpbmcKKyAqCQltdWx0aXBsZSBrZXJuZWwvdXNlciBzcGFjZSBiaWRpcmVjdGlvbmFsIGNvbW11bmljYXRpb25zIGxpbmtzLgorICoKKyAqIAkJQXV0aG9yOiAJQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICAgICAgICAgICAgIEFkYXB0ZWQgdG8gYmVjb21lIHRoZSBMaW51eCAyLjAgQ29kYSBwc2V1ZG8gZGV2aWNlCisgKiAgICAgICAgICAgICAgUGV0ZXIgIEJyYWFtICA8YnJhYW1AbWF0aHMub3guYWMudWs+IAorICogICAgICAgICAgICAgIE1pY2hhZWwgQ2FsbGFoYW4gPG1qY0BlbW15LnNtaXRoLmVkdT4gICAgICAgICAgIAorICoKKyAqICAgICAgICAgICAgICBDaGFuZ2VzIGZvciBMaW51eCAyLjEKKyAqICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDE5OTcgQ2FybmVnaWUtTWVsbG9uIFVuaXZlcnNpdHkKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZmc19mc19rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3BvbGwuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bGludXgvY29kYS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvZGFfbGludXguaD4KKyNpbmNsdWRlIDxsaW51eC9jb2RhX2ZzX2kuaD4KKyNpbmNsdWRlIDxsaW51eC9jb2RhX3BzZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvY29kYV9wcm9jLmg+CisKKyNkZWZpbmUgdXBjX2ZyZWUocikga2ZyZWUocikKKworLyogCisgKiBDb2RhIHN0dWZmCisgKi8KK2V4dGVybiBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBjb2RhX2ZzX3R5cGU7CisKKy8qIHN0YXRpc3RpY3MgKi8KK2ludCAgICAgICAgICAgY29kYV9oYXJkOyAgICAgICAgIC8qIGFsbG93cyBzaWduYWxzIGR1cmluZyB1cGNhbGxzICovCit1bnNpZ25lZCBsb25nIGNvZGFfdGltZW91dCA9IDMwOyAvKiAuLiBzZWNzLCB0aGVuIHNpZ25hbHMgd2lsbCBkZXF1ZXVlICovCisKKworc3RydWN0IHZlbnVzX2NvbW0gY29kYV9jb21tc1tNQVhfQ09EQURFVlNdOworc3RhdGljIHN0cnVjdCBjbGFzc19zaW1wbGUgKmNvZGFfcHNkZXZfY2xhc3M7CisKKy8qCisgKiBEZXZpY2Ugb3BlcmF0aW9ucworICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY29kYV9wc2Rldl9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICogd2FpdCkKK3sKKyAgICAgICAgc3RydWN0IHZlbnVzX2NvbW0gKnZjcCA9IChzdHJ1Y3QgdmVudXNfY29tbSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IG1hc2sgPSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKworCXBvbGxfd2FpdChmaWxlLCAmdmNwLT52Y193YWl0cSwgd2FpdCk7CisJaWYgKCFsaXN0X2VtcHR5KCZ2Y3AtPnZjX3BlbmRpbmcpKQorICAgICAgICAgICAgICAgIG1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgaW50IGNvZGFfcHNkZXZfaW9jdGwoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCwgCisJCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdW5zaWduZWQgaW50IGRhdGE7CisKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBDSU9DX0tFUk5FTF9WRVJTSU9OOgorCQlkYXRhID0gQ09EQV9LRVJORUxfVkVSU0lPTjsKKwkJcmV0dXJuIHB1dF91c2VyKGRhdGEsIChpbnQgX191c2VyICopIGFyZyk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9UVFk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglSZWNlaXZlIGEgbWVzc2FnZSB3cml0dGVuIGJ5IFZlbnVzIHRvIHRoZSBwc2RldgorICovCisgCitzdGF0aWMgc3NpemVfdCBjb2RhX3BzZGV2X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCAKKwkJCQlzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKm9mZikKK3sKKyAgICAgICAgc3RydWN0IHZlbnVzX2NvbW0gKnZjcCA9IChzdHJ1Y3QgdmVudXNfY29tbSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisgICAgICAgIHN0cnVjdCB1cGNfcmVxICpyZXEgPSBOVUxMOworICAgICAgICBzdHJ1Y3QgdXBjX3JlcSAqdG1wOworCXN0cnVjdCBsaXN0X2hlYWQgKmxoOworCXN0cnVjdCBjb2RhX2luX2hkciBoZHI7CisJc3NpemVfdCByZXR2YWwgPSAwLCBjb3VudCA9IDA7CisJaW50IGVycm9yOworCisgICAgICAgIC8qIFBlZWsgYXQgdGhlIG9wY29kZSwgdW5pcXVlZmllciAqLworCWlmIChjb3B5X2Zyb21fdXNlcigmaGRyLCBidWYsIDIgKiBzaXplb2YodV9sb25nKSkpCisJICAgICAgICByZXR1cm4gLUVGQVVMVDsKKworICAgICAgICBpZiAoRE9XTkNBTEwoaGRyLm9wY29kZSkpIHsKKwkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IE5VTEw7CisgICAgICAgICAgICAgICAgdW5pb24gb3V0cHV0QXJncyAqZGNidWY7CisJCWludCBzaXplID0gc2l6ZW9mKCpkY2J1Zik7CisKKwkJc2IgPSB2Y3AtPnZjX3NiOworCQlpZiAoICFzYiApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gbmJ5dGVzOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisJCX0KKworCQlpZiAgKCBuYnl0ZXMgPCBzaXplb2Yoc3RydWN0IGNvZGFfb3V0X2hkcikgKSB7CisJCSAgICAgICAgcHJpbnRrKCJjb2RhX2Rvd25jYWxsIG9wYyAlZCB1bmlxICVkLCBub3QgZW5vdWdoIVxuIiwKKwkJCSAgICAgICBoZHIub3Bjb2RlLCBoZHIudW5pcXVlKTsKKwkJCWNvdW50ID0gbmJ5dGVzOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKCBuYnl0ZXMgPiBzaXplICkgeworCQkgICAgICAgIHByaW50aygiQ29kYTogZG93bmNhbGwgb3BjICVkLCB1bmlxICVkLCB0b28gbXVjaCEiLAorCQkJICAgICAgIGhkci5vcGNvZGUsIGhkci51bmlxdWUpOworCQkgICAgICAgIG5ieXRlcyA9IHNpemU7CisJCX0KKwkJQ09EQV9BTExPQyhkY2J1ZiwgdW5pb24gb3V0cHV0QXJncyAqLCBuYnl0ZXMpOworCQlpZiAoY29weV9mcm9tX3VzZXIoZGNidWYsIGJ1ZiwgbmJ5dGVzKSkgeworCQkJQ09EQV9GUkVFKGRjYnVmLCBuYnl0ZXMpOworCQkJcmV0dmFsID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogd2hhdCBkb3duY2FsbCBlcnJvcnMgZG9lcyBWZW51cyBoYW5kbGUgPyAqLworCQlsb2NrX2tlcm5lbCgpOworCQllcnJvciA9IGNvZGFfZG93bmNhbGwoaGRyLm9wY29kZSwgZGNidWYsIHNiKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCisJCUNPREFfRlJFRShkY2J1ZiwgbmJ5dGVzKTsKKwkJaWYgKGVycm9yKSB7CisJCSAgICAgICAgcHJpbnRrKCJwc2Rldl93cml0ZTogY29kYV9kb3duY2FsbCBlcnJvcjogJWRcbiIsIGVycm9yKTsKKwkJCXJldHZhbCA9IGVycm9yOworCQkJZ290byBvdXQ7CisJCX0KKwkJY291bnQgPSBuYnl0ZXM7CisJCWdvdG8gb3V0OworCX0KKyAgICAgICAgCisJLyogTG9vayBmb3IgdGhlIG1lc3NhZ2Ugb24gdGhlIHByb2Nlc3NpbmcgcXVldWUuICovCisJbG9ja19rZXJuZWwoKTsKKwlsaXN0X2Zvcl9lYWNoKGxoLCAmdmNwLT52Y19wcm9jZXNzaW5nKSB7CisJCXRtcCA9IGxpc3RfZW50cnkobGgsIHN0cnVjdCB1cGNfcmVxICwgdWNfY2hhaW4pOworCQlpZiAodG1wLT51Y191bmlxdWUgPT0gaGRyLnVuaXF1ZSkgeworCQkJcmVxID0gdG1wOworCQkJbGlzdF9kZWwoJnJlcS0+dWNfY2hhaW4pOworCQkJYnJlYWs7CisJCX0KKwl9CisJdW5sb2NrX2tlcm5lbCgpOworCisJaWYgKCFyZXEpIHsKKwkJcHJpbnRrKCJwc2Rldl93cml0ZTogbXNnICglZCwgJWQpIG5vdCBmb3VuZFxuIiwgCisJCQloZHIub3Bjb2RlLCBoZHIudW5pcXVlKTsKKwkJcmV0dmFsID0gLUVTUkNIOworCQlnb3RvIG91dDsKKwl9CisKKyAgICAgICAgLyogbW92ZSBkYXRhIGludG8gcmVzcG9uc2UgYnVmZmVyLiAqLworCWlmIChyZXEtPnVjX291dFNpemUgPCBuYnl0ZXMpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoInBzZGV2X3dyaXRlOiB0b28gbXVjaCBjbnQ6ICVkLCBjbnQ6ICVsZCwgb3BjOiAlZCwgdW5pcTogJWQuXG4iLAorCQkgICAgICAgcmVxLT51Y19vdXRTaXplLCAobG9uZyluYnl0ZXMsIGhkci5vcGNvZGUsIGhkci51bmlxdWUpOworCQluYnl0ZXMgPSByZXEtPnVjX291dFNpemU7IC8qIGRvbid0IGhhdmUgbW9yZSBzcGFjZSEgKi8KKwl9CisgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcihyZXEtPnVjX2RhdGEsIGJ1ZiwgbmJ5dGVzKSkgeworCQlyZXEtPnVjX2ZsYWdzIHw9IFJFUV9BQk9SVDsKKwkJd2FrZV91cCgmcmVxLT51Y19zbGVlcCk7CisJCXJldHZhbCA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0OworCX0KKworCS8qIGFkanVzdCBvdXRzaXplLiBpcyB0aGlzIHVzZWZ1bCA/PyAqLworICAgICAgICByZXEtPnVjX291dFNpemUgPSBuYnl0ZXM7CQorICAgICAgICByZXEtPnVjX2ZsYWdzIHw9IFJFUV9XUklURTsKKwljb3VudCA9IG5ieXRlczsKKworCS8qIENvbnZlcnQgZmlsZWRlc2NyaXB0b3IgaW50byBhIGZpbGUgaGFuZGxlICovCisJaWYgKHJlcS0+dWNfb3Bjb2RlID09IENPREFfT1BFTl9CWV9GRCkgeworCQlzdHJ1Y3QgY29kYV9vcGVuX2J5X2ZkX291dCAqb3V0cCA9CisJCQkoc3RydWN0IGNvZGFfb3Blbl9ieV9mZF9vdXQgKilyZXEtPnVjX2RhdGE7CisJCW91dHAtPmZoID0gZmdldChvdXRwLT5mZCk7CisJfQorCisgICAgICAgIHdha2VfdXAoJnJlcS0+dWNfc2xlZXApOworb3V0OgorICAgICAgICByZXR1cm4oY291bnQgPyBjb3VudCA6IHJldHZhbCk7ICAKK30KKworLyoKKyAqCVJlYWQgYSBtZXNzYWdlIGZyb20gdGhlIGtlcm5lbCB0byBWZW51cworICovCisKK3N0YXRpYyBzc2l6ZV90IGNvZGFfcHNkZXZfcmVhZChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNoYXIgX191c2VyICogYnVmLCAKKwkJCSAgICAgICBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKm9mZikKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKyAgICAgICAgc3RydWN0IHZlbnVzX2NvbW0gKnZjcCA9IChzdHJ1Y3QgdmVudXNfY29tbSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisgICAgICAgIHN0cnVjdCB1cGNfcmVxICpyZXE7CisJc3NpemVfdCByZXR2YWwgPSAwLCBjb3VudCA9IDA7CisKKwlpZiAobmJ5dGVzID09IDApCisJCXJldHVybiAwOworCisJbG9ja19rZXJuZWwoKTsKKworCWFkZF93YWl0X3F1ZXVlKCZ2Y3AtPnZjX3dhaXRxLCAmd2FpdCk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCXdoaWxlIChsaXN0X2VtcHR5KCZ2Y3AtPnZjX3BlbmRpbmcpKSB7CisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJcmV0dmFsID0gLUVBR0FJTjsKKwkJCWJyZWFrOworCQl9CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKwkJc2NoZWR1bGUoKTsKKwl9CisKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZ2Y3AtPnZjX3dhaXRxLCAmd2FpdCk7CisKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dDsKKworCXJlcSA9IGxpc3RfZW50cnkodmNwLT52Y19wZW5kaW5nLm5leHQsIHN0cnVjdCB1cGNfcmVxLHVjX2NoYWluKTsKKwlsaXN0X2RlbCgmcmVxLT51Y19jaGFpbik7CisKKwkvKiBNb3ZlIHRoZSBpbnB1dCBhcmdzIGludG8gdXNlcnNwYWNlICovCisJY291bnQgPSByZXEtPnVjX2luU2l6ZTsKKwlpZiAobmJ5dGVzIDwgcmVxLT51Y19pblNpemUpIHsKKyAgICAgICAgICAgICAgICBwcmludGsgKCJwc2Rldl9yZWFkOiBWZW51cyByZWFkICVsZCBieXRlcyBvZiAlZCBpbiBtZXNzYWdlXG4iLAorCQkJKGxvbmcpbmJ5dGVzLCByZXEtPnVjX2luU2l6ZSk7CisJCWNvdW50ID0gbmJ5dGVzOworICAgICAgICB9CisKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgcmVxLT51Y19kYXRhLCBjb3VudCkpCisJICAgICAgICByZXR2YWwgPSAtRUZBVUxUOworICAgICAgICAKKwkvKiBJZiByZXF1ZXN0IHdhcyBub3QgYSBzaWduYWwsIGVucXVldWUgYW5kIGRvbid0IGZyZWUgKi8KKwlpZiAoIShyZXEtPnVjX2ZsYWdzICYgUkVRX0FTWU5DKSkgeworCQlyZXEtPnVjX2ZsYWdzIHw9IFJFUV9SRUFEOworCQlsaXN0X2FkZCgmKHJlcS0+dWNfY2hhaW4pLCB2Y3AtPnZjX3Byb2Nlc3NpbmcucHJldik7CisJCWdvdG8gb3V0OworCX0KKworCUNPREFfRlJFRShyZXEtPnVjX2RhdGEsIHNpemVvZihzdHJ1Y3QgY29kYV9pbl9oZHIpKTsKKwl1cGNfZnJlZShyZXEpOworb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gKGNvdW50ID8gY291bnQgOiByZXR2YWwpOworfQorCitzdGF0aWMgaW50IGNvZGFfcHNkZXZfb3BlbihzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlKQoreworICAgICAgICBzdHJ1Y3QgdmVudXNfY29tbSAqdmNwOworCWludCBpZHg7CisKKwlsb2NrX2tlcm5lbCgpOworCWlkeCA9IGltaW5vcihpbm9kZSk7CisJaWYoaWR4ID49IE1BWF9DT0RBREVWUykgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXZjcCA9ICZjb2RhX2NvbW1zW2lkeF07CisJaWYodmNwLT52Y19pbnVzZSkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCQorCWlmICghdmNwLT52Y19pbnVzZSsrKSB7CisJCUlOSVRfTElTVF9IRUFEKCZ2Y3AtPnZjX3BlbmRpbmcpOworCQlJTklUX0xJU1RfSEVBRCgmdmNwLT52Y19wcm9jZXNzaW5nKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmdmNwLT52Y193YWl0cSk7CisJCXZjcC0+dmNfc2IgPSBOVUxMOworCQl2Y3AtPnZjX3NlcSA9IDA7CisJfQorCQorCWZpbGUtPnByaXZhdGVfZGF0YSA9IHZjcDsKKworCXVubG9ja19rZXJuZWwoKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBjb2RhX3BzZGV2X3JlbGVhc2Uoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZSkKK3sKKyAgICAgICAgc3RydWN0IHZlbnVzX2NvbW0gKnZjcCA9IChzdHJ1Y3QgdmVudXNfY29tbSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisgICAgICAgIHN0cnVjdCB1cGNfcmVxICpyZXEsICp0bXA7CisKKwlsb2NrX2tlcm5lbCgpOworCWlmICggIXZjcC0+dmNfaW51c2UgKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcHJpbnRrKCJwc2Rldl9yZWxlYXNlOiBOb3Qgb3Blbi5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKC0tdmNwLT52Y19pbnVzZSkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAwOworCX0KKyAgICAgICAgCisgICAgICAgIC8qIFdha2V1cCBjbGllbnRzIHNvIHRoZXkgY2FuIHJldHVybi4gKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVxLCB0bXAsICZ2Y3AtPnZjX3BlbmRpbmcsIHVjX2NoYWluKSB7CisJCS8qIEFzeW5jIHJlcXVlc3RzIG5lZWQgdG8gYmUgZnJlZWQgaGVyZSAqLworCQlpZiAocmVxLT51Y19mbGFncyAmIFJFUV9BU1lOQykgeworCQkJQ09EQV9GUkVFKHJlcS0+dWNfZGF0YSwgc2l6ZW9mKHN0cnVjdCBjb2RhX2luX2hkcikpOworCQkJdXBjX2ZyZWUocmVxKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXJlcS0+dWNfZmxhZ3MgfD0gUkVRX0FCT1JUOworCQl3YWtlX3VwKCZyZXEtPnVjX3NsZWVwKTsKKyAgICAgICAgfQorICAgICAgICAKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcSwgJnZjcC0+dmNfcHJvY2Vzc2luZywgdWNfY2hhaW4pIHsKKwkJcmVxLT51Y19mbGFncyB8PSBSRVFfQUJPUlQ7CisJICAgICAgICB3YWtlX3VwKCZyZXEtPnVjX3NsZWVwKTsKKyAgICAgICAgfQorCisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNvZGFfcHNkZXZfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnJlYWQJCT0gY29kYV9wc2Rldl9yZWFkLAorCS53cml0ZQkJPSBjb2RhX3BzZGV2X3dyaXRlLAorCS5wb2xsCQk9IGNvZGFfcHNkZXZfcG9sbCwKKwkuaW9jdGwJCT0gY29kYV9wc2Rldl9pb2N0bCwKKwkub3BlbgkJPSBjb2RhX3BzZGV2X29wZW4sCisJLnJlbGVhc2UJPSBjb2RhX3BzZGV2X3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IGluaXRfY29kYV9wc2Rldih2b2lkKQoreworCWludCBpLCBlcnIgPSAwOworCWlmIChyZWdpc3Rlcl9jaHJkZXYoQ09EQV9QU0RFVl9NQUpPUiwgImNvZGEiLCAmY29kYV9wc2Rldl9mb3BzKSkgeworICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImNvZGFfcHNkZXY6IHVuYWJsZSB0byBnZXQgbWFqb3IgJWRcbiIsIAorCQkgICAgIENPREFfUFNERVZfTUFKT1IpOworICAgICAgICAgICAgICByZXR1cm4gLUVJTzsKKwl9CisJY29kYV9wc2Rldl9jbGFzcyA9IGNsYXNzX3NpbXBsZV9jcmVhdGUoVEhJU19NT0RVTEUsICJjb2RhIik7CisJaWYgKElTX0VSUihjb2RhX3BzZGV2X2NsYXNzKSkgeworCQllcnIgPSBQVFJfRVJSKGNvZGFfcHNkZXZfY2xhc3MpOworCQlnb3RvIG91dF9jaHJkZXY7CisJfQkJCisJZGV2ZnNfbWtfZGlyICgiY29kYSIpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfQ09EQURFVlM7IGkrKykgeworCQljbGFzc19zaW1wbGVfZGV2aWNlX2FkZChjb2RhX3BzZGV2X2NsYXNzLCBNS0RFVihDT0RBX1BTREVWX01BSk9SLGkpLCAKKwkJCQlOVUxMLCAiY2ZzJWQiLCBpKTsKKwkJZXJyID0gZGV2ZnNfbWtfY2RldihNS0RFVihDT0RBX1BTREVWX01BSk9SLCBpKSwKKwkJCQlTX0lGQ0hSfFNfSVJVU1J8U19JV1VTUiwgImNvZGEvJWQiLCBpKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X2NsYXNzOworCX0KKwljb2RhX3N5c2N0bF9pbml0KCk7CisJZ290byBvdXQ7CisKK291dF9jbGFzczoKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NPREFERVZTOyBpKyspIAorCQljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihDT0RBX1BTREVWX01BSk9SLCBpKSk7CisJY2xhc3Nfc2ltcGxlX2Rlc3Ryb3koY29kYV9wc2Rldl9jbGFzcyk7CitvdXRfY2hyZGV2OgorCXVucmVnaXN0ZXJfY2hyZGV2KENPREFfUFNERVZfTUFKT1IsICJjb2RhIik7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworCitNT0RVTEVfQVVUSE9SKCJQZXRlciBKLiBCcmFhbSA8YnJhYW1AY3MuY211LmVkdT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworZXh0ZXJuIGludCBjb2RhX2luaXRfaW5vZGVjYWNoZSh2b2lkKTsKK2V4dGVybiB2b2lkIGNvZGFfZGVzdHJveV9pbm9kZWNhY2hlKHZvaWQpOworc3RhdGljIGludCBfX2luaXQgaW5pdF9jb2RhKHZvaWQpCit7CisJaW50IHN0YXR1czsKKwlpbnQgaTsKKwlwcmludGsoS0VSTl9JTkZPICJDb2RhIEtlcm5lbC9WZW51cyBjb21tdW5pY2F0aW9ucywgIgorI2lmZGVmIENPTkZJR19DT0RBX0ZTX09MRF9BUEkKKwkgICAgICAgInY1LjMuMjAiCisjZWxzZQorCSAgICAgICAidjYuMC4wIgorI2VuZGlmCisJICAgICAgICIsIGNvZGFAY3MuY211LmVkdVxuIik7CisKKwlzdGF0dXMgPSBjb2RhX2luaXRfaW5vZGVjYWNoZSgpOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0MjsKKwlzdGF0dXMgPSBpbml0X2NvZGFfcHNkZXYoKTsKKwlpZiAoIHN0YXR1cyApIHsKKwkJcHJpbnRrKCJQcm9ibGVtICglZCkgaW4gaW5pdF9jb2RhX3BzZGV2XG4iLCBzdGF0dXMpOworCQlnb3RvIG91dDE7CisJfQorCQorCXN0YXR1cyA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmNvZGFfZnNfdHlwZSk7CisJaWYgKHN0YXR1cykgeworCQlwcmludGsoImNvZGE6IGZhaWxlZCB0byByZWdpc3RlciBmaWxlc3lzdGVtIVxuIik7CisJCWdvdG8gb3V0OworCX0KKwlyZXR1cm4gMDsKK291dDoKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0NPREFERVZTOyBpKyspIHsKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9yZW1vdmUoTUtERVYoQ09EQV9QU0RFVl9NQUpPUiwgaSkpOworCQlkZXZmc19yZW1vdmUoImNvZGEvJWQiLCBpKTsKKwl9CisJY2xhc3Nfc2ltcGxlX2Rlc3Ryb3koY29kYV9wc2Rldl9jbGFzcyk7CisJZGV2ZnNfcmVtb3ZlKCJjb2RhIik7CisJdW5yZWdpc3Rlcl9jaHJkZXYoQ09EQV9QU0RFVl9NQUpPUiwgImNvZGEiKTsKKwljb2RhX3N5c2N0bF9jbGVhbigpOworb3V0MToKKwljb2RhX2Rlc3Ryb3lfaW5vZGVjYWNoZSgpOworb3V0MjoKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9jb2RhKHZvaWQpCit7CisgICAgICAgIGludCBlcnIsIGk7CisKKwllcnIgPSB1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmNvZGFfZnNfdHlwZSk7CisgICAgICAgIGlmICggZXJyICE9IDAgKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKCJjb2RhOiBmYWlsZWQgdG8gdW5yZWdpc3RlciBmaWxlc3lzdGVtXG4iKTsKKyAgICAgICAgfQorCWZvciAoaSA9IDA7IGkgPCBNQVhfQ09EQURFVlM7IGkrKykgeworCQljbGFzc19zaW1wbGVfZGV2aWNlX3JlbW92ZShNS0RFVihDT0RBX1BTREVWX01BSk9SLCBpKSk7CisJCWRldmZzX3JlbW92ZSgiY29kYS8lZCIsIGkpOworCX0KKwljbGFzc19zaW1wbGVfZGVzdHJveShjb2RhX3BzZGV2X2NsYXNzKTsKKwlkZXZmc19yZW1vdmUoImNvZGEiKTsKKwl1bnJlZ2lzdGVyX2NocmRldihDT0RBX1BTREVWX01BSk9SLCAiY29kYSIpOworCWNvZGFfc3lzY3RsX2NsZWFuKCk7CisJY29kYV9kZXN0cm95X2lub2RlY2FjaGUoKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9jb2RhKTsKK21vZHVsZV9leGl0KGV4aXRfY29kYSk7CisKZGlmZiAtLWdpdCBhL2ZzL2NvZGEvc3ltbGluay5jIGIvZnMvY29kYS9zeW1saW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM1ZTViYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2NvZGEvc3ltbGluay5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBTeW1saW5rIGlub2RlIG9wZXJhdGlvbnMgZm9yIENvZGEgZmlsZXN5c3RlbQorICogT3JpZ2luYWwgdmVyc2lvbjogKEMpIDE5OTYgUC4gQnJhYW0gYW5kIE0uIENhbGxhaGFuCisgKiBSZXdyaXR0ZW4gZm9yIExpbnV4IDIuMS4gKEMpIDE5OTcgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKKyAqIAorICogQ2FybmVnaWUgTWVsbG9uIGVuY291cmFnZXMgdXNlcnMgdG8gY29udHJpYnV0ZSBpbXByb3ZlbWVudHMgdG8KKyAqIHRoZSBDb2RhIHByb2plY3QuIENvbnRhY3QgUGV0ZXIgQnJhYW0gKGNvZGFAY3MuY211LmVkdSkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisKKyNpbmNsdWRlIDxsaW51eC9jb2RhLmg+CisjaW5jbHVkZSA8bGludXgvY29kYV9saW51eC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvZGFfcHNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9jb2RhX2ZzX2kuaD4KKyNpbmNsdWRlIDxsaW51eC9jb2RhX3Byb2MuaD4KKworc3RhdGljIGludCBjb2RhX3N5bWxpbmtfZmlsbGVyKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlpbnQgZXJyb3I7CisJc3RydWN0IGNvZGFfaW5vZGVfaW5mbyAqY2lpOworCXVuc2lnbmVkIGludCBsZW4gPSBQQUdFX1NJWkU7CisJY2hhciAqcCA9IGttYXAocGFnZSk7CisKKwlsb2NrX2tlcm5lbCgpOworCWNpaSA9IElUT0MoaW5vZGUpOworCWNvZGFfdmZzX3N0YXQuZm9sbG93X2xpbmsrKzsKKworCWVycm9yID0gdmVudXNfcmVhZGxpbmsoaW5vZGUtPmlfc2IsICZjaWktPmNfZmlkLCBwLCAmbGVuKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWw7CisJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCWt1bm1hcChwYWdlKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXR1cm4gMDsKKworZmFpbDoKKwlTZXRQYWdlRXJyb3IocGFnZSk7CisJa3VubWFwKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCXJldHVybiBlcnJvcjsKK30KKworc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBjb2RhX3N5bWxpbmtfYW9wcyA9IHsKKwkucmVhZHBhZ2UJPSBjb2RhX3N5bWxpbmtfZmlsbGVyLAorfTsKZGlmZiAtLWdpdCBhL2ZzL2NvZGEvc3lzY3RsLmMgYi9mcy9jb2RhL3N5c2N0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYjEwNzUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jb2RhL3N5c2N0bC5jCkBAIC0wLDAgKzEsMjU0IEBACisvKgorICogU3lzY3RsIG9wZXJhdGlvbnMgZm9yIENvZGEgZmlsZXN5c3RlbQorICogT3JpZ2luYWwgdmVyc2lvbjogKEMpIDE5OTYgUC4gQnJhYW0gYW5kIE0uIENhbGxhaGFuCisgKiBSZXdyaXR0ZW4gZm9yIExpbnV4IDIuMS4gKEMpIDE5OTcgQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkKKyAqIAorICogQ2FybmVnaWUgTWVsbG9uIGVuY291cmFnZXMgdXNlcnMgdG8gY29udHJpYnV0ZSBpbXByb3ZlbWVudHMgdG8KKyAqIHRoZSBDb2RhIHByb2plY3QuIENvbnRhY3QgUGV0ZXIgQnJhYW0gKGNvZGFAY3MuY211LmVkdSkuCisgKiAKKyAqIENPREEgb3BlcmF0aW9uIHN0YXRpc3RpY3MKKyAqIChjKSBNYXJjaCwgMTk5OCBaaGFueW9uZyBXYW4gPHpoYW55b25nLndhbkB5YWxlLmVkdT4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9jb2RhLmg+CisjaW5jbHVkZSA8bGludXgvY29kYV9saW51eC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvZGFfZnNfaS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvZGFfcHNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9jb2RhX2NhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvY29kYV9wcm9jLmg+CisKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqZnNfdGFibGVfaGVhZGVyOworCisjZGVmaW5lIEZTX0NPREEgICAgICAgICAxICAgICAgIC8qIENvZGEgZmlsZSBzeXN0ZW0gKi8KKworI2RlZmluZSBDT0RBX1RJTUVPVVQgICAgMyAgICAgICAvKiB0aW1lb3V0IG9uIHVwY2FsbHMgdG8gYmVjb21lIGludHJibGUgKi8KKyNkZWZpbmUgQ09EQV9IQVJEICAgICAgIDUgICAgICAgLyogbW91bnQgdHlwZSAiaGFyZCIgb3IgInNvZnQiICovCisjZGVmaW5lIENPREFfVkZTIAkgNiAgICAgICAvKiB2ZnMgc3RhdGlzdGljcyAqLworI2RlZmluZSBDT0RBX0NBQ0hFX0lOViAJIDkgICAgICAgLyogY2FjaGUgaW52YWxpZGF0aW9uIHN0YXRpc3RpY3MgKi8KKyNkZWZpbmUgQ09EQV9GQUtFX1NUQVRGUyAxMAkgLyogZG9uJ3QgcXVlcnkgdmVudXMgZm9yIGFjdHVhbCBjYWNoZSB1c2FnZSAqLworCitzdHJ1Y3QgY29kYV92ZnNfc3RhdHMJCWNvZGFfdmZzX3N0YXQ7CitzdGF0aWMgc3RydWN0IGNvZGFfY2FjaGVfaW52X3N0YXRzCWNvZGFfY2FjaGVfaW52X3N0YXQ7CisKK3N0YXRpYyB2b2lkIHJlc2V0X2NvZGFfdmZzX3N0YXRzKCB2b2lkICkKK3sKKwltZW1zZXQoICZjb2RhX3Zmc19zdGF0LCAwLCBzaXplb2YoIGNvZGFfdmZzX3N0YXQgKSApOworfQorCitzdGF0aWMgdm9pZCByZXNldF9jb2RhX2NhY2hlX2ludl9zdGF0cyggdm9pZCApCit7CisJbWVtc2V0KCAmY29kYV9jYWNoZV9pbnZfc3RhdCwgMCwgc2l6ZW9mKCBjb2RhX2NhY2hlX2ludl9zdGF0ICkgKTsKK30KKworc3RhdGljIGludCBkb19yZXNldF9jb2RhX3Zmc19zdGF0cyggY3RsX3RhYmxlICogdGFibGUsIGludCB3cml0ZSwKKwkJCQkgICAgc3RydWN0IGZpbGUgKiBmaWxwLCB2b2lkIF9fdXNlciAqIGJ1ZmZlciwKKwkJCQkgICAgc2l6ZV90ICogbGVucCwgbG9mZl90ICogcHBvcyApCit7CisJaWYgKCB3cml0ZSApIHsKKwkJcmVzZXRfY29kYV92ZnNfc3RhdHMoKTsKKworCQkqcHBvcyArPSAqbGVucDsKKwl9IGVsc2UgeworCQkqbGVucCA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG9fcmVzZXRfY29kYV9jYWNoZV9pbnZfc3RhdHMoIGN0bF90YWJsZSAqIHRhYmxlLCBpbnQgd3JpdGUsCisJCQkJCSAgc3RydWN0IGZpbGUgKiBmaWxwLAorCQkJCQkgIHZvaWQgX191c2VyICogYnVmZmVyLAorCQkJCQkgIHNpemVfdCAqIGxlbnAsIGxvZmZfdCAqIHBwb3MgKQoreworCWlmICggd3JpdGUgKSB7CisJCXJlc2V0X2NvZGFfY2FjaGVfaW52X3N0YXRzKCk7CisKKwkJKnBwb3MgKz0gKmxlbnA7CisJfSBlbHNlIHsKKwkJKmxlbnAgPSAwOworCX0KKyAgCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29kYV92ZnNfc3RhdHNfZ2V0X2luZm8oIGNoYXIgKiBidWZmZXIsIGNoYXIgKiogc3RhcnQsCisJCQkJICAgIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCkKK3sKKwlpbnQgbGVuPTA7CisJb2ZmX3QgYmVnaW47CisJc3RydWN0IGNvZGFfdmZzX3N0YXRzICogcHMgPSAmIGNvZGFfdmZzX3N0YXQ7CisgIAorICAvKiB0aGlzIHdvcmtzIGFzIGxvbmcgYXMgd2UgYXJlIGJlbG93IDEwMjQgY2hhcmFjdGVycyEgKi8KKwlsZW4gKz0gc3ByaW50ZiggYnVmZmVyLAorCQkJIkNvZGEgVkZTIHN0YXRpc3RpY3NcbiIKKwkJCSI9PT09PT09PT09PT09PT09PT09XG5cbiIKKwkJCSJGaWxlIE9wZXJhdGlvbnM6XG4iCisJCQkiXHRvcGVuXHRcdCU5ZFxuIgorCQkJIlx0Zmx1c2hcdFx0JTlkXG4iCisJCQkiXHRyZWxlYXNlXHRcdCU5ZFxuIgorCQkJIlx0ZnN5bmNcdFx0JTlkXG5cbiIKKwkJCSJEaXIgT3BlcmF0aW9uczpcbiIKKwkJCSJcdHJlYWRkaXJcdFx0JTlkXG5cbiIKKwkJCSJJbm9kZSBPcGVyYXRpb25zXG4iCisJCQkiXHRjcmVhdGVcdFx0JTlkXG4iCisJCQkiXHRsb29rdXBcdFx0JTlkXG4iCisJCQkiXHRsaW5rXHRcdCU5ZFxuIgorCQkJIlx0dW5saW5rXHRcdCU5ZFxuIgorCQkJIlx0c3ltbGlua1x0XHQlOWRcbiIKKwkJCSJcdG1rZGlyXHRcdCU5ZFxuIgorCQkJIlx0cm1kaXJcdFx0JTlkXG4iCisJCQkiXHRyZW5hbWVcdFx0JTlkXG4iCisJCQkiXHRwZXJtaXNzaW9uXHQlOWRcbiIsCisKKwkJCS8qIGZpbGUgb3BlcmF0aW9ucyAqLworCQkJcHMtPm9wZW4sCisJCQlwcy0+Zmx1c2gsCisJCQlwcy0+cmVsZWFzZSwKKwkJCXBzLT5mc3luYywKKworCQkJLyogZGlyIG9wZXJhdGlvbnMgKi8KKwkJCXBzLT5yZWFkZGlyLAorCQkgIAorCQkJLyogaW5vZGUgb3BlcmF0aW9ucyAqLworCQkJcHMtPmNyZWF0ZSwKKwkJCXBzLT5sb29rdXAsCisJCQlwcy0+bGluaywKKwkJCXBzLT51bmxpbmssCisJCQlwcy0+c3ltbGluaywKKwkJCXBzLT5ta2RpciwKKwkJCXBzLT5ybWRpciwKKwkJCXBzLT5yZW5hbWUsCisJCQlwcy0+cGVybWlzc2lvbik7IAorCisJYmVnaW4gPSBvZmZzZXQ7CisJKnN0YXJ0ID0gYnVmZmVyICsgYmVnaW47CisJbGVuIC09IGJlZ2luOworCisJaWYgKCBsZW4gPiBsZW5ndGggKQorCQlsZW4gPSBsZW5ndGg7CisJaWYgKCBsZW4gPCAwICkKKwkJbGVuID0gMDsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgY29kYV9jYWNoZV9pbnZfc3RhdHNfZ2V0X2luZm8oIGNoYXIgKiBidWZmZXIsIGNoYXIgKiogc3RhcnQsCisJCQkJCSAgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoKQoreworCWludCBsZW49MDsKKwlvZmZfdCBiZWdpbjsKKwlzdHJ1Y3QgY29kYV9jYWNoZV9pbnZfc3RhdHMgKiBwcyA9ICYgY29kYV9jYWNoZV9pbnZfc3RhdDsKKyAgCisJLyogdGhpcyB3b3JrcyBhcyBsb25nIGFzIHdlIGFyZSBiZWxvdyAxMDI0IGNoYXJhY3RlcnMhICovCisJbGVuICs9IHNwcmludGYoIGJ1ZmZlciwKKwkJCSJDb2RhIGNhY2hlIGludmFsaWRhdGlvbiBzdGF0aXN0aWNzXG4iCisJCQkiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4iCisJCQkiZmx1c2hcdFx0JTlkXG4iCisJCQkicHVyZ2UgdXNlclx0JTlkXG4iCisJCQkiemFwX2Rpclx0XHQlOWRcbiIKKwkJCSJ6YXBfZmlsZVx0JTlkXG4iCisJCQkiemFwX3Zub2RlXHQlOWRcbiIKKwkJCSJwdXJnZV9maWRcdCU5ZFxuIgorCQkJInJlcGxhY2VcdFx0JTlkXG4iLAorCQkJcHMtPmZsdXNoLAorCQkJcHMtPnB1cmdlX3VzZXIsCisJCQlwcy0+emFwX2RpciwKKwkJCXBzLT56YXBfZmlsZSwKKwkJCXBzLT56YXBfdm5vZGUsCisJCQlwcy0+cHVyZ2VfZmlkLAorCQkJcHMtPnJlcGxhY2UgKTsKKyAgCisJYmVnaW4gPSBvZmZzZXQ7CisJKnN0YXJ0ID0gYnVmZmVyICsgYmVnaW47CisJbGVuIC09IGJlZ2luOworCisJaWYgKCBsZW4gPiBsZW5ndGggKQorCQlsZW4gPSBsZW5ndGg7CisJaWYgKCBsZW4gPCAwICkKKwkJbGVuID0gMDsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBjdGxfdGFibGUgY29kYV90YWJsZVtdID0geworIAl7Q09EQV9USU1FT1VULCAidGltZW91dCIsICZjb2RhX3RpbWVvdXQsIHNpemVvZihpbnQpLCAwNjQ0LCBOVUxMLCAmcHJvY19kb2ludHZlY30sCisgCXtDT0RBX0hBUkQsICJoYXJkIiwgJmNvZGFfaGFyZCwgc2l6ZW9mKGludCksIDA2NDQsIE5VTEwsICZwcm9jX2RvaW50dmVjfSwKKyAJe0NPREFfVkZTLCAidmZzX3N0YXRzIiwgTlVMTCwgMCwgMDY0NCwgTlVMTCwgJmRvX3Jlc2V0X2NvZGFfdmZzX3N0YXRzfSwKKyAJe0NPREFfQ0FDSEVfSU5WLCAiY2FjaGVfaW52X3N0YXRzIiwgTlVMTCwgMCwgMDY0NCwgTlVMTCwgJmRvX3Jlc2V0X2NvZGFfY2FjaGVfaW52X3N0YXRzfSwKKyAJe0NPREFfRkFLRV9TVEFURlMsICJmYWtlX3N0YXRmcyIsICZjb2RhX2Zha2Vfc3RhdGZzLCBzaXplb2YoaW50KSwgMDYwMCwgTlVMTCwgJnByb2NfZG9pbnR2ZWN9LAorCXsgMCB9Cit9OworCitzdGF0aWMgY3RsX3RhYmxlIGZzX3RhYmxlW10gPSB7CisgICAgICAge0ZTX0NPREEsICJjb2RhIiwgICAgTlVMTCwgMCwgMDU1NSwgY29kYV90YWJsZX0sCisgICAgICAgezB9Cit9OworCisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCisvKgorIHRhcmdldCBkaXJlY3Rvcnkgc3RydWN0dXJlOgorICAgL3Byb2MvZnMgIChzZWUgbGludXgvZnMvcHJvYy9yb290LmMpCisgICAvcHJvYy9mcy9jb2RhCisgICAvcHJvYy9mcy9jb2RhL3t2ZnNfc3RhdHMsCisKKyovCisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkqIHByb2NfZnNfY29kYTsKKworI2VuZGlmCisKKyNkZWZpbmUgY29kYV9wcm9jX2NyZWF0ZShuYW1lLGdldF9pbmZvKSBcCisJY3JlYXRlX3Byb2NfaW5mb19lbnRyeShuYW1lLCAwLCBwcm9jX2ZzX2NvZGEsIGdldF9pbmZvKQorCit2b2lkIGNvZGFfc3lzY3RsX2luaXQodm9pZCkKK3sKKwlyZXNldF9jb2RhX3Zmc19zdGF0cygpOworCXJlc2V0X2NvZGFfY2FjaGVfaW52X3N0YXRzKCk7CisKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCXByb2NfZnNfY29kYSA9IHByb2NfbWtkaXIoImNvZGEiLCBwcm9jX3Jvb3RfZnMpOworCWlmIChwcm9jX2ZzX2NvZGEpIHsKKwkJcHJvY19mc19jb2RhLT5vd25lciA9IFRISVNfTU9EVUxFOworCQljb2RhX3Byb2NfY3JlYXRlKCJ2ZnNfc3RhdHMiLCBjb2RhX3Zmc19zdGF0c19nZXRfaW5mbyk7CisJCWNvZGFfcHJvY19jcmVhdGUoImNhY2hlX2ludl9zdGF0cyIsIGNvZGFfY2FjaGVfaW52X3N0YXRzX2dldF9pbmZvKTsKKwl9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TWVNDVEwKKwlpZiAoICFmc190YWJsZV9oZWFkZXIgKQorCQlmc190YWJsZV9oZWFkZXIgPSByZWdpc3Rlcl9zeXNjdGxfdGFibGUoZnNfdGFibGUsIDApOworI2VuZGlmIAorfQorCit2b2lkIGNvZGFfc3lzY3RsX2NsZWFuKHZvaWQpIAoreworCisjaWZkZWYgQ09ORklHX1NZU0NUTAorCWlmICggZnNfdGFibGVfaGVhZGVyICkgeworCQl1bnJlZ2lzdGVyX3N5c2N0bF90YWJsZShmc190YWJsZV9oZWFkZXIpOworCQlmc190YWJsZV9oZWFkZXIgPSBOVUxMOworCX0KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKyAgICAgICAgcmVtb3ZlX3Byb2NfZW50cnkoImNhY2hlX2ludl9zdGF0cyIsIHByb2NfZnNfY29kYSk7CisgICAgICAgIHJlbW92ZV9wcm9jX2VudHJ5KCJ2ZnNfc3RhdHMiLCBwcm9jX2ZzX2NvZGEpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJjb2RhIiwgcHJvY19yb290X2ZzKTsKKyNlbmRpZiAKK30KZGlmZiAtLWdpdCBhL2ZzL2NvZGEvdXBjYWxsLmMgYi9mcy9jb2RhL3VwY2FsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYWU5OTYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jb2RhL3VwY2FsbC5jCkBAIC0wLDAgKzEsOTE0IEBACisvKgorICogTW9zdGx5IHBsYXRmb3JtIGluZGVwZW5kZW50IHVwY2FsbCBvcGVyYXRpb25zIHRvIFZlbnVzOgorICogIC0tIHVwY2FsbHMKKyAqICAtLSB1cGNhbGwgcm91dGluZXMKKyAqCisgKiBMaW51eCAyLjAgdmVyc2lvbgorICogQ29weXJpZ2h0IChDKSAxOTk2IFBldGVyIEouIEJyYWFtIDxicmFhbUBtYXRocy5veC5hYy51az4sIAorICogTWljaGFlbCBDYWxsYWhhbiA8Y2FsbGFoYW5AbWF0aHMub3guYWMudWs+IAorICogCisgKiBSZWRvbmUgZm9yIExpbnV4IDIuMQorICogQ29weXJpZ2h0IChDKSAxOTk3IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CisgKgorICogQ2FybmVnaWUgTWVsbG9uIFVuaXZlcnNpdHkgZW5jb3VyYWdlcyB1c2VycyBvZiB0aGlzIGNvZGUgdG8gY29udHJpYnV0ZQorICogaW1wcm92ZW1lbnRzIHRvIHRoZSBDb2RhIHByb2plY3QuIENvbnRhY3QgUGV0ZXIgQnJhYW0gPGNvZGFAY3MuY211LmVkdT4uCisgKi8KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9jb2RhLmg+CisjaW5jbHVkZSA8bGludXgvY29kYV9saW51eC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvZGFfcHNkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9jb2RhX2ZzX2kuaD4KKyNpbmNsdWRlIDxsaW51eC9jb2RhX2NhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvY29kYV9wcm9jLmg+IAorCisjZGVmaW5lIHVwY19hbGxvYygpIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1cGNfcmVxKSwgR0ZQX0tFUk5FTCkKKyNkZWZpbmUgdXBjX2ZyZWUocikga2ZyZWUocikKKworc3RhdGljIGludCBjb2RhX3VwY2FsbChzdHJ1Y3QgY29kYV9zYl9pbmZvICptbnRpbmZvLCBpbnQgaW5TaXplLCBpbnQgKm91dFNpemUsIAorCQkgICAgICAgdW5pb24gaW5wdXRBcmdzICpidWZmZXIpOworCitzdGF0aWMgdm9pZCAqYWxsb2NfdXBjYWxsKGludCBvcGNvZGUsIGludCBzaXplKQoreworCXVuaW9uIGlucHV0QXJncyAqaW5wOworCisJQ09EQV9BTExPQyhpbnAsIHVuaW9uIGlucHV0QXJncyAqLCBzaXplKTsKKyAgICAgICAgaWYgKCFpbnApCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisgICAgICAgIGlucC0+aWgub3Bjb2RlID0gb3Bjb2RlOworCWlucC0+aWgucGlkID0gY3VycmVudC0+cGlkOworCWlucC0+aWgucGdpZCA9IHByb2Nlc3NfZ3JvdXAoY3VycmVudCk7CisjaWZkZWYgQ09ORklHX0NPREFfRlNfT0xEX0FQSQorCW1lbXNldCgmaW5wLT5paC5jcmVkLCAwLCBzaXplb2Yoc3RydWN0IGNvZGFfY3JlZCkpOworCWlucC0+aWguY3JlZC5jcl9mc3VpZCA9IGN1cnJlbnQtPmZzdWlkOworI2Vsc2UKKwlpbnAtPmloLnVpZCA9IGN1cnJlbnQtPmZzdWlkOworI2VuZGlmCisJcmV0dXJuICh2b2lkKilpbnA7Cit9CisKKyNkZWZpbmUgVVBBUkcob3ApXAorZG8ge1wKKwlpbnAgPSAodW5pb24gaW5wdXRBcmdzICopYWxsb2NfdXBjYWxsKG9wLCBpbnNpemUpOyBcCisgICAgICAgIGlmIChJU19FUlIoaW5wKSkgeyByZXR1cm4gUFRSX0VSUihpbnApOyB9XAorICAgICAgICBvdXRwID0gKHVuaW9uIG91dHB1dEFyZ3MgKikoaW5wKTsgXAorICAgICAgICBvdXRzaXplID0gaW5zaXplOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIElOU0laRSh0YWcpIHNpemVvZihzdHJ1Y3QgY29kYV8gIyMgdGFnICMjIF9pbikKKyNkZWZpbmUgT1VUU0laRSh0YWcpIHNpemVvZihzdHJ1Y3QgY29kYV8gIyMgdGFnICMjIF9vdXQpCisjZGVmaW5lIFNJWkUodGFnKSAgbWF4X3QodW5zaWduZWQgaW50LCBJTlNJWkUodGFnKSwgT1VUU0laRSh0YWcpKQorCisKKy8qIHRoZSB1cGNhbGxzICovCitpbnQgdmVudXNfcm9vdGZpZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgQ29kYUZpZCAqZmlkcCkKK3sKKyAgICAgICAgdW5pb24gaW5wdXRBcmdzICppbnA7CisgICAgICAgIHVuaW9uIG91dHB1dEFyZ3MgKm91dHA7CisgICAgICAgIGludCBpbnNpemUsIG91dHNpemUsIGVycm9yOworCisgICAgICAgIGluc2l6ZSA9IFNJWkUocm9vdCk7CisgICAgICAgIFVQQVJHKENPREFfUk9PVCk7CisKKwllcnJvciA9IGNvZGFfdXBjYWxsKGNvZGFfc2JwKHNiKSwgaW5zaXplLCAmb3V0c2l6ZSwgaW5wKTsKKwkKKwlpZiAoZXJyb3IpIHsKKwkgICAgICAgIHByaW50aygiY29kYV9nZXRfcm9vdGZpZDogZXJyb3IgJWRcbiIsIGVycm9yKTsKKwl9IGVsc2UgeworCQkqZmlkcCA9IG91dHAtPmNvZGFfcm9vdC5WRmlkOworCX0KKworCUNPREFfRlJFRShpbnAsIGluc2l6ZSk7CisJcmV0dXJuIGVycm9yOworfQorCitpbnQgdmVudXNfZ2V0YXR0cihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgQ29kYUZpZCAqZmlkLCAKKwkJICAgICBzdHJ1Y3QgY29kYV92YXR0ciAqYXR0cikgCit7CisgICAgICAgIHVuaW9uIGlucHV0QXJncyAqaW5wOworICAgICAgICB1bmlvbiBvdXRwdXRBcmdzICpvdXRwOworICAgICAgICBpbnQgaW5zaXplLCBvdXRzaXplLCBlcnJvcjsKKworICAgICAgICBpbnNpemUgPSBTSVpFKGdldGF0dHIpOyAKKwlVUEFSRyhDT0RBX0dFVEFUVFIpOworICAgICAgICBpbnAtPmNvZGFfZ2V0YXR0ci5WRmlkID0gKmZpZDsKKworICAgICAgICBlcnJvciA9IGNvZGFfdXBjYWxsKGNvZGFfc2JwKHNiKSwgaW5zaXplLCAmb3V0c2l6ZSwgaW5wKTsKKwkKKwkqYXR0ciA9IG91dHAtPmNvZGFfZ2V0YXR0ci5hdHRyOworCisJQ09EQV9GUkVFKGlucCwgaW5zaXplKTsKKyAgICAgICAgcmV0dXJuIGVycm9yOworfQorCitpbnQgdmVudXNfc2V0YXR0cihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgQ29kYUZpZCAqZmlkLCAKKwkJICBzdHJ1Y3QgY29kYV92YXR0ciAqdmF0dHIpCit7CisgICAgICAgIHVuaW9uIGlucHV0QXJncyAqaW5wOworICAgICAgICB1bmlvbiBvdXRwdXRBcmdzICpvdXRwOworICAgICAgICBpbnQgaW5zaXplLCBvdXRzaXplLCBlcnJvcjsKKwkKKwlpbnNpemUgPSBTSVpFKHNldGF0dHIpOworCVVQQVJHKENPREFfU0VUQVRUUik7CisKKyAgICAgICAgaW5wLT5jb2RhX3NldGF0dHIuVkZpZCA9ICpmaWQ7CisJaW5wLT5jb2RhX3NldGF0dHIuYXR0ciA9ICp2YXR0cjsKKworICAgICAgICBlcnJvciA9IGNvZGFfdXBjYWxsKGNvZGFfc2JwKHNiKSwgaW5zaXplLCAmb3V0c2l6ZSwgaW5wKTsKKworICAgICAgICBDT0RBX0ZSRUUoaW5wLCBpbnNpemUpOworICAgICAgICByZXR1cm4gZXJyb3I7Cit9CisKK2ludCB2ZW51c19sb29rdXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IENvZGFGaWQgKmZpZCwgCisJCSAgICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuZ3RoLCBpbnQgKiB0eXBlLCAKKwkJICAgIHN0cnVjdCBDb2RhRmlkICpyZXNmaWQpCit7CisgICAgICAgIHVuaW9uIGlucHV0QXJncyAqaW5wOworICAgICAgICB1bmlvbiBvdXRwdXRBcmdzICpvdXRwOworICAgICAgICBpbnQgaW5zaXplLCBvdXRzaXplLCBlcnJvcjsKKwlpbnQgb2Zmc2V0OworCisJb2Zmc2V0ID0gSU5TSVpFKGxvb2t1cCk7CisgICAgICAgIGluc2l6ZSA9IG1heF90KHVuc2lnbmVkIGludCwgb2Zmc2V0ICsgbGVuZ3RoICsxLCBPVVRTSVpFKGxvb2t1cCkpOworCVVQQVJHKENPREFfTE9PS1VQKTsKKworICAgICAgICBpbnAtPmNvZGFfbG9va3VwLlZGaWQgPSAqZmlkOworCWlucC0+Y29kYV9sb29rdXAubmFtZSA9IG9mZnNldDsKKwlpbnAtPmNvZGFfbG9va3VwLmZsYWdzID0gQ0xVX0NBU0VfU0VOU0lUSVZFOworICAgICAgICAvKiBzZW5kIFZlbnVzIGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZyAqLworICAgICAgICBtZW1jcHkoKGNoYXIgKikoaW5wKSArIG9mZnNldCwgbmFtZSwgbGVuZ3RoKTsKKyAgICAgICAgKigoY2hhciAqKWlucCArIG9mZnNldCArIGxlbmd0aCkgPSAnXDAnOworCisgICAgICAgIGVycm9yID0gY29kYV91cGNhbGwoY29kYV9zYnAoc2IpLCBpbnNpemUsICZvdXRzaXplLCBpbnApOworCisJKnJlc2ZpZCA9IG91dHAtPmNvZGFfbG9va3VwLlZGaWQ7CisJKnR5cGUgPSBvdXRwLT5jb2RhX2xvb2t1cC52dHlwZTsKKworCUNPREFfRlJFRShpbnAsIGluc2l6ZSk7CisJcmV0dXJuIGVycm9yOworfQorCitpbnQgdmVudXNfc3RvcmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IENvZGFGaWQgKmZpZCwgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgIHZ1aWRfdCB1aWQpCit7CisgICAgICAgIHVuaW9uIGlucHV0QXJncyAqaW5wOworICAgICAgICB1bmlvbiBvdXRwdXRBcmdzICpvdXRwOworICAgICAgICBpbnQgaW5zaXplLCBvdXRzaXplLCBlcnJvcjsKKyNpZmRlZiBDT05GSUdfQ09EQV9GU19PTERfQVBJCisJc3RydWN0IGNvZGFfY3JlZCBjcmVkID0geyAwLCB9OworCWNyZWQuY3JfZnN1aWQgPSB1aWQ7CisjZW5kaWYKKwkKKwlpbnNpemUgPSBTSVpFKHN0b3JlKTsKKwlVUEFSRyhDT0RBX1NUT1JFKTsKKwkKKyNpZmRlZiBDT05GSUdfQ09EQV9GU19PTERfQVBJCisJbWVtY3B5KCYoaW5wLT5paC5jcmVkKSwgJmNyZWQsIHNpemVvZihjcmVkKSk7CisjZWxzZQorCWlucC0+aWgudWlkID0gdWlkOworI2VuZGlmCisJCisgICAgICAgIGlucC0+Y29kYV9zdG9yZS5WRmlkID0gKmZpZDsKKyAgICAgICAgaW5wLT5jb2RhX3N0b3JlLmZsYWdzID0gZmxhZ3M7CisKKyAgICAgICAgZXJyb3IgPSBjb2RhX3VwY2FsbChjb2RhX3NicChzYiksIGluc2l6ZSwgJm91dHNpemUsIGlucCk7CisKKwlDT0RBX0ZSRUUoaW5wLCBpbnNpemUpOworICAgICAgICByZXR1cm4gZXJyb3I7Cit9CisKK2ludCB2ZW51c19yZWxlYXNlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBDb2RhRmlkICpmaWQsIGludCBmbGFncykKK3sKKyAgICAgICAgdW5pb24gaW5wdXRBcmdzICppbnA7CisgICAgICAgIHVuaW9uIG91dHB1dEFyZ3MgKm91dHA7CisgICAgICAgIGludCBpbnNpemUsIG91dHNpemUsIGVycm9yOworCQorCWluc2l6ZSA9IFNJWkUocmVsZWFzZSk7CisJVVBBUkcoQ09EQV9SRUxFQVNFKTsKKwkKKwlpbnAtPmNvZGFfcmVsZWFzZS5WRmlkID0gKmZpZDsKKwlpbnAtPmNvZGFfcmVsZWFzZS5mbGFncyA9IGZsYWdzOworCisJZXJyb3IgPSBjb2RhX3VwY2FsbChjb2RhX3NicChzYiksIGluc2l6ZSwgJm91dHNpemUsIGlucCk7CisKKwlDT0RBX0ZSRUUoaW5wLCBpbnNpemUpOworCXJldHVybiBlcnJvcjsKK30KKworaW50IHZlbnVzX2Nsb3NlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBDb2RhRmlkICpmaWQsIGludCBmbGFncywKKyAgICAgICAgICAgICAgICB2dWlkX3QgdWlkKQoreworCXVuaW9uIGlucHV0QXJncyAqaW5wOworCXVuaW9uIG91dHB1dEFyZ3MgKm91dHA7CisJaW50IGluc2l6ZSwgb3V0c2l6ZSwgZXJyb3I7CisjaWZkZWYgQ09ORklHX0NPREFfRlNfT0xEX0FQSQorCXN0cnVjdCBjb2RhX2NyZWQgY3JlZCA9IHsgMCwgfTsKKwljcmVkLmNyX2ZzdWlkID0gdWlkOworI2VuZGlmCisJCisJaW5zaXplID0gU0laRShyZWxlYXNlKTsKKwlVUEFSRyhDT0RBX0NMT1NFKTsKKwkKKyNpZmRlZiBDT05GSUdfQ09EQV9GU19PTERfQVBJCisJbWVtY3B5KCYoaW5wLT5paC5jcmVkKSwgJmNyZWQsIHNpemVvZihjcmVkKSk7CisjZWxzZQorCWlucC0+aWgudWlkID0gdWlkOworI2VuZGlmCisJCisgICAgICAgIGlucC0+Y29kYV9jbG9zZS5WRmlkID0gKmZpZDsKKyAgICAgICAgaW5wLT5jb2RhX2Nsb3NlLmZsYWdzID0gZmxhZ3M7CisKKyAgICAgICAgZXJyb3IgPSBjb2RhX3VwY2FsbChjb2RhX3NicChzYiksIGluc2l6ZSwgJm91dHNpemUsIGlucCk7CisKKwlDT0RBX0ZSRUUoaW5wLCBpbnNpemUpOworICAgICAgICByZXR1cm4gZXJyb3I7Cit9CisKK2ludCB2ZW51c19vcGVuKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBDb2RhRmlkICpmaWQsCisJCSAgaW50IGZsYWdzLCBzdHJ1Y3QgZmlsZSAqKmZoKQoreworICAgICAgICB1bmlvbiBpbnB1dEFyZ3MgKmlucDsKKyAgICAgICAgdW5pb24gb3V0cHV0QXJncyAqb3V0cDsKKyAgICAgICAgaW50IGluc2l6ZSwgb3V0c2l6ZSwgZXJyb3I7CisgICAgICAgCisJaW5zaXplID0gU0laRShvcGVuX2J5X2ZkKTsKKwlVUEFSRyhDT0RBX09QRU5fQllfRkQpOworCisgICAgICAgIGlucC0+Y29kYV9vcGVuLlZGaWQgPSAqZmlkOworICAgICAgICBpbnAtPmNvZGFfb3Blbi5mbGFncyA9IGZsYWdzOworCisgICAgICAgIGVycm9yID0gY29kYV91cGNhbGwoY29kYV9zYnAoc2IpLCBpbnNpemUsICZvdXRzaXplLCBpbnApOworCisJKmZoID0gb3V0cC0+Y29kYV9vcGVuX2J5X2ZkLmZoOworCisJQ09EQV9GUkVFKGlucCwgaW5zaXplKTsKKwlyZXR1cm4gZXJyb3I7Cit9CQorCitpbnQgdmVudXNfbWtkaXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IENvZGFGaWQgKmRpcmZpZCwgCisJCSAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW5ndGgsIAorCQkgICBzdHJ1Y3QgQ29kYUZpZCAqbmV3ZmlkLCBzdHJ1Y3QgY29kYV92YXR0ciAqYXR0cnMpCit7CisgICAgICAgIHVuaW9uIGlucHV0QXJncyAqaW5wOworICAgICAgICB1bmlvbiBvdXRwdXRBcmdzICpvdXRwOworICAgICAgICBpbnQgaW5zaXplLCBvdXRzaXplLCBlcnJvcjsKKyAgICAgICAgaW50IG9mZnNldDsKKworCW9mZnNldCA9IElOU0laRShta2Rpcik7CisJaW5zaXplID0gbWF4X3QodW5zaWduZWQgaW50LCBvZmZzZXQgKyBsZW5ndGggKyAxLCBPVVRTSVpFKG1rZGlyKSk7CisJVVBBUkcoQ09EQV9NS0RJUik7CisKKyAgICAgICAgaW5wLT5jb2RhX21rZGlyLlZGaWQgPSAqZGlyZmlkOworICAgICAgICBpbnAtPmNvZGFfbWtkaXIuYXR0ciA9ICphdHRyczsKKwlpbnAtPmNvZGFfbWtkaXIubmFtZSA9IG9mZnNldDsKKyAgICAgICAgLyogVmVudXMgbXVzdCBnZXQgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZyAqLworICAgICAgICBtZW1jcHkoKGNoYXIgKikoaW5wKSArIG9mZnNldCwgbmFtZSwgbGVuZ3RoKTsKKyAgICAgICAgKigoY2hhciAqKWlucCArIG9mZnNldCArIGxlbmd0aCkgPSAnXDAnOworICAgICAgICAKKyAgICAgICAgZXJyb3IgPSBjb2RhX3VwY2FsbChjb2RhX3NicChzYiksIGluc2l6ZSwgJm91dHNpemUsIGlucCk7CisKKwkqYXR0cnMgPSBvdXRwLT5jb2RhX21rZGlyLmF0dHI7CisJKm5ld2ZpZCA9IG91dHAtPmNvZGFfbWtkaXIuVkZpZDsKKworCUNPREFfRlJFRShpbnAsIGluc2l6ZSk7CisJcmV0dXJuIGVycm9yOyAgICAgICAgCit9CisKKworaW50IHZlbnVzX3JlbmFtZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgQ29kYUZpZCAqb2xkX2ZpZCwgCisJCSBzdHJ1Y3QgQ29kYUZpZCAqbmV3X2ZpZCwgc2l6ZV90IG9sZF9sZW5ndGgsIAorCQkgc2l6ZV90IG5ld19sZW5ndGgsIGNvbnN0IGNoYXIgKm9sZF9uYW1lLCAKKwkJIGNvbnN0IGNoYXIgKm5ld19uYW1lKQoreworCXVuaW9uIGlucHV0QXJncyAqaW5wOworICAgICAgICB1bmlvbiBvdXRwdXRBcmdzICpvdXRwOworICAgICAgICBpbnQgaW5zaXplLCBvdXRzaXplLCBlcnJvcjsgCisJaW50IG9mZnNldCwgczsKKwkKKwlvZmZzZXQgPSBJTlNJWkUocmVuYW1lKTsKKwlpbnNpemUgPSBtYXhfdCh1bnNpZ25lZCBpbnQsIG9mZnNldCArIG5ld19sZW5ndGggKyBvbGRfbGVuZ3RoICsgOCwKKwkJICAgICBPVVRTSVpFKHJlbmFtZSkpOyAKKyAJVVBBUkcoQ09EQV9SRU5BTUUpOworCisgICAgICAgIGlucC0+Y29kYV9yZW5hbWUuc291cmNlRmlkID0gKm9sZF9maWQ7CisgICAgICAgIGlucC0+Y29kYV9yZW5hbWUuZGVzdEZpZCA9ICAqbmV3X2ZpZDsKKyAgICAgICAgaW5wLT5jb2RhX3JlbmFtZS5zcmNuYW1lID0gb2Zmc2V0OworCisgICAgICAgIC8qIFZlbnVzIG11c3QgcmVjZWl2ZSBhbiBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nICovCisgICAgICAgIHMgPSAoIG9sZF9sZW5ndGggJiB+MHgzKSArNDsgLyogcm91bmQgdXAgdG8gd29yZCBib3VuZGFyeSAqLworICAgICAgICBtZW1jcHkoKGNoYXIgKikoaW5wKSArIG9mZnNldCwgb2xkX25hbWUsIG9sZF9sZW5ndGgpOworICAgICAgICAqKChjaGFyICopaW5wICsgb2Zmc2V0ICsgb2xkX2xlbmd0aCkgPSAnXDAnOworCisgICAgICAgIC8qIGFub3RoZXIgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZyBmb3IgVmVudXMgKi8KKyAgICAgICAgb2Zmc2V0ICs9IHM7CisgICAgICAgIGlucC0+Y29kYV9yZW5hbWUuZGVzdG5hbWUgPSBvZmZzZXQ7CisgICAgICAgIHMgPSAoIG5ld19sZW5ndGggJiB+MHgzKSArNDsgLyogcm91bmQgdXAgdG8gd29yZCBib3VuZGFyeSAqLworICAgICAgICBtZW1jcHkoKGNoYXIgKikoaW5wKSArIG9mZnNldCwgbmV3X25hbWUsIG5ld19sZW5ndGgpOworICAgICAgICAqKChjaGFyICopaW5wICsgb2Zmc2V0ICsgbmV3X2xlbmd0aCkgPSAnXDAnOworCisgICAgICAgIGVycm9yID0gY29kYV91cGNhbGwoY29kYV9zYnAoc2IpLCBpbnNpemUsICZvdXRzaXplLCBpbnApOworCisJQ09EQV9GUkVFKGlucCwgaW5zaXplKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2ludCB2ZW51c19jcmVhdGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IENvZGFGaWQgKmRpcmZpZCwgCisJCSBjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuZ3RoLCBpbnQgZXhjbCwgaW50IG1vZGUsCisJCSBzdHJ1Y3QgQ29kYUZpZCAqbmV3ZmlkLCBzdHJ1Y3QgY29kYV92YXR0ciAqYXR0cnMpIAoreworICAgICAgICB1bmlvbiBpbnB1dEFyZ3MgKmlucDsKKyAgICAgICAgdW5pb24gb3V0cHV0QXJncyAqb3V0cDsKKyAgICAgICAgaW50IGluc2l6ZSwgb3V0c2l6ZSwgZXJyb3I7CisgICAgICAgIGludCBvZmZzZXQ7CisKKyAgICAgICAgb2Zmc2V0ID0gSU5TSVpFKGNyZWF0ZSk7CisJaW5zaXplID0gbWF4X3QodW5zaWduZWQgaW50LCBvZmZzZXQgKyBsZW5ndGggKyAxLCBPVVRTSVpFKGNyZWF0ZSkpOworCVVQQVJHKENPREFfQ1JFQVRFKTsKKworICAgICAgICBpbnAtPmNvZGFfY3JlYXRlLlZGaWQgPSAqZGlyZmlkOworICAgICAgICBpbnAtPmNvZGFfY3JlYXRlLmF0dHIudmFfbW9kZSA9IG1vZGU7CisJaW5wLT5jb2RhX2NyZWF0ZS5leGNsID0gZXhjbDsKKyAgICAgICAgaW5wLT5jb2RhX2NyZWF0ZS5tb2RlID0gbW9kZTsKKyAgICAgICAgaW5wLT5jb2RhX2NyZWF0ZS5uYW1lID0gb2Zmc2V0OworCisgICAgICAgIC8qIFZlbnVzIG11c3QgZ2V0IG51bGwgdGVybWluYXRlZCBzdHJpbmcgKi8KKyAgICAgICAgbWVtY3B5KChjaGFyICopKGlucCkgKyBvZmZzZXQsIG5hbWUsIGxlbmd0aCk7CisgICAgICAgICooKGNoYXIgKilpbnAgKyBvZmZzZXQgKyBsZW5ndGgpID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgZXJyb3IgPSBjb2RhX3VwY2FsbChjb2RhX3NicChzYiksIGluc2l6ZSwgJm91dHNpemUsIGlucCk7CisKKwkqYXR0cnMgPSBvdXRwLT5jb2RhX2NyZWF0ZS5hdHRyOworCSpuZXdmaWQgPSBvdXRwLT5jb2RhX2NyZWF0ZS5WRmlkOworCisJQ09EQV9GUkVFKGlucCwgaW5zaXplKTsKKwlyZXR1cm4gZXJyb3I7ICAgICAgICAKK30KKworaW50IHZlbnVzX3JtZGlyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBDb2RhRmlkICpkaXJmaWQsIAorCQkgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbmd0aCkKK3sKKyAgICAgICAgdW5pb24gaW5wdXRBcmdzICppbnA7CisgICAgICAgIHVuaW9uIG91dHB1dEFyZ3MgKm91dHA7CisgICAgICAgIGludCBpbnNpemUsIG91dHNpemUsIGVycm9yOworICAgICAgICBpbnQgb2Zmc2V0OworCisgICAgICAgIG9mZnNldCA9IElOU0laRShybWRpcik7CisJaW5zaXplID0gbWF4X3QodW5zaWduZWQgaW50LCBvZmZzZXQgKyBsZW5ndGggKyAxLCBPVVRTSVpFKHJtZGlyKSk7CisJVVBBUkcoQ09EQV9STURJUik7CisKKyAgICAgICAgaW5wLT5jb2RhX3JtZGlyLlZGaWQgPSAqZGlyZmlkOworICAgICAgICBpbnAtPmNvZGFfcm1kaXIubmFtZSA9IG9mZnNldDsKKyAgICAgICAgbWVtY3B5KChjaGFyICopKGlucCkgKyBvZmZzZXQsIG5hbWUsIGxlbmd0aCk7CisJKigoY2hhciAqKWlucCArIG9mZnNldCArIGxlbmd0aCkgPSAnXDAnOworICAgICAgICAKKyAgICAgICAgZXJyb3IgPSBjb2RhX3VwY2FsbChjb2RhX3NicChzYiksIGluc2l6ZSwgJm91dHNpemUsIGlucCk7CisKKwlDT0RBX0ZSRUUoaW5wLCBpbnNpemUpOworCXJldHVybiBlcnJvcjsKK30KKworaW50IHZlbnVzX3JlbW92ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgQ29kYUZpZCAqZGlyZmlkLCAKKwkJICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW5ndGgpCit7CisgICAgICAgIHVuaW9uIGlucHV0QXJncyAqaW5wOworICAgICAgICB1bmlvbiBvdXRwdXRBcmdzICpvdXRwOworICAgICAgICBpbnQgZXJyb3I9MCwgaW5zaXplLCBvdXRzaXplLCBvZmZzZXQ7CisKKyAgICAgICAgb2Zmc2V0ID0gSU5TSVpFKHJlbW92ZSk7CisJaW5zaXplID0gbWF4X3QodW5zaWduZWQgaW50LCBvZmZzZXQgKyBsZW5ndGggKyAxLCBPVVRTSVpFKHJlbW92ZSkpOworCVVQQVJHKENPREFfUkVNT1ZFKTsKKworICAgICAgICBpbnAtPmNvZGFfcmVtb3ZlLlZGaWQgPSAqZGlyZmlkOworICAgICAgICBpbnAtPmNvZGFfcmVtb3ZlLm5hbWUgPSBvZmZzZXQ7CisgICAgICAgIG1lbWNweSgoY2hhciAqKShpbnApICsgb2Zmc2V0LCBuYW1lLCBsZW5ndGgpOworCSooKGNoYXIgKilpbnAgKyBvZmZzZXQgKyBsZW5ndGgpID0gJ1wwJzsKKyAgICAgICAgCisgICAgICAgIGVycm9yID0gY29kYV91cGNhbGwoY29kYV9zYnAoc2IpLCBpbnNpemUsICZvdXRzaXplLCBpbnApOworCisJQ09EQV9GUkVFKGlucCwgaW5zaXplKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2ludCB2ZW51c19yZWFkbGluayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgQ29kYUZpZCAqZmlkLCAKKwkJICAgICAgY2hhciAqYnVmZmVyLCBpbnQgKmxlbmd0aCkKK3sgCisgICAgICAgIHVuaW9uIGlucHV0QXJncyAqaW5wOworICAgICAgICB1bmlvbiBvdXRwdXRBcmdzICpvdXRwOworICAgICAgICBpbnQgaW5zaXplLCBvdXRzaXplLCBlcnJvcjsKKyAgICAgICAgaW50IHJldGxlbjsKKyAgICAgICAgY2hhciAqcmVzdWx0OworICAgICAgICAKKwlpbnNpemUgPSBtYXhfdCh1bnNpZ25lZCBpbnQsCisJCSAgICAgSU5TSVpFKHJlYWRsaW5rKSwgT1VUU0laRShyZWFkbGluaykrICpsZW5ndGggKyAxKTsKKwlVUEFSRyhDT0RBX1JFQURMSU5LKTsKKworICAgICAgICBpbnAtPmNvZGFfcmVhZGxpbmsuVkZpZCA9ICpmaWQ7CisgICAgCisgICAgICAgIGVycm9yID0gIGNvZGFfdXBjYWxsKGNvZGFfc2JwKHNiKSwgaW5zaXplLCAmb3V0c2l6ZSwgaW5wKTsKKwkKKwlpZiAoISBlcnJvcikgeworICAgICAgICAgICAgICAgIHJldGxlbiA9IG91dHAtPmNvZGFfcmVhZGxpbmsuY291bnQ7CisJCWlmICggcmV0bGVuID4gKmxlbmd0aCApCisJCSAgICAgICAgcmV0bGVuID0gKmxlbmd0aDsKKwkJKmxlbmd0aCA9IHJldGxlbjsKKwkJcmVzdWx0ID0gIChjaGFyICopb3V0cCArIChsb25nKW91dHAtPmNvZGFfcmVhZGxpbmsuZGF0YTsKKwkJbWVtY3B5KGJ1ZmZlciwgcmVzdWx0LCByZXRsZW4pOworCQkqKGJ1ZmZlciArIHJldGxlbikgPSAnXDAnOworCX0KKyAgICAgICAgCisgICAgICAgIENPREFfRlJFRShpbnAsIGluc2l6ZSk7CisgICAgICAgIHJldHVybiBlcnJvcjsKK30KKworCisKK2ludCB2ZW51c19saW5rKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBDb2RhRmlkICpmaWQsIAorCQkgIHN0cnVjdCBDb2RhRmlkICpkaXJmaWQsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4gKQoreworICAgICAgICB1bmlvbiBpbnB1dEFyZ3MgKmlucDsKKyAgICAgICAgdW5pb24gb3V0cHV0QXJncyAqb3V0cDsKKyAgICAgICAgaW50IGluc2l6ZSwgb3V0c2l6ZSwgZXJyb3I7CisgICAgICAgIGludCBvZmZzZXQ7CisKKwlvZmZzZXQgPSBJTlNJWkUobGluayk7CisJaW5zaXplID0gbWF4X3QodW5zaWduZWQgaW50LCBvZmZzZXQgICsgbGVuICsgMSwgT1VUU0laRShsaW5rKSk7CisgICAgICAgIFVQQVJHKENPREFfTElOSyk7CisKKyAgICAgICAgaW5wLT5jb2RhX2xpbmsuc291cmNlRmlkID0gKmZpZDsKKyAgICAgICAgaW5wLT5jb2RhX2xpbmsuZGVzdEZpZCA9ICpkaXJmaWQ7CisgICAgICAgIGlucC0+Y29kYV9saW5rLnRuYW1lID0gb2Zmc2V0OworCisgICAgICAgIC8qIG1ha2Ugc3VyZSBzdHJpbmdzIGFyZSBudWxsIHRlcm1pbmF0ZWQgKi8KKyAgICAgICAgbWVtY3B5KChjaGFyICopKGlucCkgKyBvZmZzZXQsIG5hbWUsIGxlbik7CisgICAgICAgICooKGNoYXIgKilpbnAgKyBvZmZzZXQgKyBsZW4pID0gJ1wwJzsKKyAgICAgICAgCisgICAgICAgIGVycm9yID0gY29kYV91cGNhbGwoY29kYV9zYnAoc2IpLCBpbnNpemUsICZvdXRzaXplLCBpbnApOworCisJQ09EQV9GUkVFKGlucCwgaW5zaXplKTsKKyAgICAgICAgcmV0dXJuIGVycm9yOworfQorCitpbnQgdmVudXNfc3ltbGluayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgQ29kYUZpZCAqZmlkLAorCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4sCisJCSAgICAgY29uc3QgY2hhciAqc3ltbmFtZSwgaW50IHN5bWxlbikKK3sKKyAgICAgICAgdW5pb24gaW5wdXRBcmdzICppbnA7CisgICAgICAgIHVuaW9uIG91dHB1dEFyZ3MgKm91dHA7CisgICAgICAgIGludCBpbnNpemUsIG91dHNpemUsIGVycm9yOworICAgICAgICBpbnQgb2Zmc2V0LCBzOworCisgICAgICAgIG9mZnNldCA9IElOU0laRShzeW1saW5rKTsKKwlpbnNpemUgPSBtYXhfdCh1bnNpZ25lZCBpbnQsIG9mZnNldCArIGxlbiArIHN5bWxlbiArIDgsIE9VVFNJWkUoc3ltbGluaykpOworCVVQQVJHKENPREFfU1lNTElOSyk7CisgICAgICAgIAorICAgICAgICAvKiAgICAgICAgaW5wLT5jb2RhX3N5bWxpbmsuYXR0ciA9ICp0dmE7IFhYWFhYWCAqLyAKKyAgICAgICAgaW5wLT5jb2RhX3N5bWxpbmsuVkZpZCA9ICpmaWQ7CisKKwkvKiBSb3VuZCB1cCB0byB3b3JkIGJvdW5kYXJ5IGFuZCBudWxsIHRlcm1pbmF0ZSAqLworICAgICAgICBpbnAtPmNvZGFfc3ltbGluay5zcmNuYW1lID0gb2Zmc2V0OworICAgICAgICBzID0gKCBzeW1sZW4gICYgfjB4MyApICsgNDsgCisgICAgICAgIG1lbWNweSgoY2hhciAqKShpbnApICsgb2Zmc2V0LCBzeW1uYW1lLCBzeW1sZW4pOworICAgICAgICAqKChjaGFyICopaW5wICsgb2Zmc2V0ICsgc3ltbGVuKSA9ICdcMCc7CisgICAgICAgIAorCS8qIFJvdW5kIHVwIHRvIHdvcmQgYm91bmRhcnkgYW5kIG51bGwgdGVybWluYXRlICovCisgICAgICAgIG9mZnNldCArPSBzOworICAgICAgICBpbnAtPmNvZGFfc3ltbGluay50bmFtZSA9IG9mZnNldDsKKyAgICAgICAgcyA9IChsZW4gJiB+MHgzKSArIDQ7CisgICAgICAgIG1lbWNweSgoY2hhciAqKShpbnApICsgb2Zmc2V0LCBuYW1lLCBsZW4pOworICAgICAgICAqKChjaGFyICopaW5wICsgb2Zmc2V0ICsgbGVuKSA9ICdcMCc7CisKKwllcnJvciA9IGNvZGFfdXBjYWxsKGNvZGFfc2JwKHNiKSwgaW5zaXplLCAmb3V0c2l6ZSwgaW5wKTsKKworCUNPREFfRlJFRShpbnAsIGluc2l6ZSk7CisgICAgICAgIHJldHVybiBlcnJvcjsKK30KKworaW50IHZlbnVzX2ZzeW5jKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBDb2RhRmlkICpmaWQpCit7CisgICAgICAgIHVuaW9uIGlucHV0QXJncyAqaW5wOworICAgICAgICB1bmlvbiBvdXRwdXRBcmdzICpvdXRwOyAKKwlpbnQgaW5zaXplLCBvdXRzaXplLCBlcnJvcjsKKwkKKwlpbnNpemU9U0laRShmc3luYyk7CisJVVBBUkcoQ09EQV9GU1lOQyk7CisKKyAgICAgICAgaW5wLT5jb2RhX2ZzeW5jLlZGaWQgPSAqZmlkOworICAgICAgICBlcnJvciA9IGNvZGFfdXBjYWxsKGNvZGFfc2JwKHNiKSwgc2l6ZW9mKHVuaW9uIGlucHV0QXJncyksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRzaXplLCBpbnApOworCisJQ09EQV9GUkVFKGlucCwgaW5zaXplKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2ludCB2ZW51c19hY2Nlc3Moc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IENvZGFGaWQgKmZpZCwgaW50IG1hc2spCit7CisgICAgICAgIHVuaW9uIGlucHV0QXJncyAqaW5wOworICAgICAgICB1bmlvbiBvdXRwdXRBcmdzICpvdXRwOyAKKwlpbnQgaW5zaXplLCBvdXRzaXplLCBlcnJvcjsKKworCWluc2l6ZSA9IFNJWkUoYWNjZXNzKTsKKwlVUEFSRyhDT0RBX0FDQ0VTUyk7CisKKyAgICAgICAgaW5wLT5jb2RhX2FjY2Vzcy5WRmlkID0gKmZpZDsKKyAgICAgICAgaW5wLT5jb2RhX2FjY2Vzcy5mbGFncyA9IG1hc2s7CisKKwllcnJvciA9IGNvZGFfdXBjYWxsKGNvZGFfc2JwKHNiKSwgaW5zaXplLCAmb3V0c2l6ZSwgaW5wKTsKKworCUNPREFfRlJFRShpbnAsIGluc2l6ZSk7CisJcmV0dXJuIGVycm9yOworfQorCisKK2ludCB2ZW51c19waW9jdGwoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IENvZGFGaWQgKmZpZCwKKwkJIHVuc2lnbmVkIGludCBjbWQsIHN0cnVjdCBQaW9jdGxEYXRhICpkYXRhKQoreworICAgICAgICB1bmlvbiBpbnB1dEFyZ3MgKmlucDsKKyAgICAgICAgdW5pb24gb3V0cHV0QXJncyAqb3V0cDsgIAorCWludCBpbnNpemUsIG91dHNpemUsIGVycm9yOworCWludCBpb2NzaXplOworCisJaW5zaXplID0gVkNfTUFYTVNHU0laRTsKKwlVUEFSRyhDT0RBX0lPQ1RMKTsKKworICAgICAgICAvKiBidWlsZCBwYWNrZXQgZm9yIFZlbnVzICovCisgICAgICAgIGlmIChkYXRhLT52aS5pbl9zaXplID4gVkNfTUFYREFUQVNJWkUpIHsKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGF0YS0+dmkub3V0X3NpemUgPiBWQ19NQVhEQVRBU0laRSkgeworCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisKKyAgICAgICAgaW5wLT5jb2RhX2lvY3RsLlZGaWQgPSAqZmlkOworICAgIAorICAgICAgICAvKiB0aGUgY21kIGZpZWxkIHdhcyBtdXRhdGVkIGJ5IGluY3JlYXNpbmcgaXRzIHNpemUgZmllbGQgdG8KKyAgICAgICAgICogcmVmbGVjdCB0aGUgcGF0aCBhbmQgZm9sbG93IGFyZ3MuIFdlIG5lZWQgdG8gc3VidHJhY3QgdGhhdAorICAgICAgICAgKiBvdXQgYmVmb3JlIHNlbmRpbmcgdGhlIGNvbW1hbmQgdG8gVmVudXMuICAqLworICAgICAgICBpbnAtPmNvZGFfaW9jdGwuY21kID0gKGNtZCAmIH4oUElPQ1BBUk1fTUFTSyA8PCAxNikpOwkKKyAgICAgICAgaW9jc2l6ZSA9ICgoY21kID4+IDE2KSAmIFBJT0NQQVJNX01BU0spIC0gc2l6ZW9mKGNoYXIgKikgLSBzaXplb2YoaW50KTsKKyAgICAgICAgaW5wLT5jb2RhX2lvY3RsLmNtZCB8PSAoaW9jc2l6ZSAmIFBJT0NQQVJNX01BU0spIDw8CTE2OwkKKyAgICAKKyAgICAgICAgLyogaW4tPmNvZGFfaW9jdGwucndmbGFnID0gZmxhZzsgKi8KKyAgICAgICAgaW5wLT5jb2RhX2lvY3RsLmxlbiA9IGRhdGEtPnZpLmluX3NpemU7CisgICAgICAgIGlucC0+Y29kYV9pb2N0bC5kYXRhID0gKGNoYXIgKikoSU5TSVpFKGlvY3RsKSk7CisgICAgIAorICAgICAgICAvKiBnZXQgdGhlIGRhdGEgb3V0IG9mIHVzZXIgc3BhY2UgKi8KKyAgICAgICAgaWYgKCBjb3B5X2Zyb21fdXNlcigoY2hhciopaW5wICsgKGxvbmcpaW5wLT5jb2RhX2lvY3RsLmRhdGEsCisJCQkgICAgZGF0YS0+dmkuaW4sIGRhdGEtPnZpLmluX3NpemUpICkgeworCQllcnJvciA9IC1FSU5WQUw7CisJICAgICAgICBnb3RvIGV4aXQ7CisJfQorCisgICAgICAgIGVycm9yID0gY29kYV91cGNhbGwoY29kYV9zYnAoc2IpLCBTSVpFKGlvY3RsKSArIGRhdGEtPnZpLmluX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHNpemUsIGlucCk7CisgICAgICAgIAorICAgICAgICBpZiAoZXJyb3IpIHsKKwkgICAgICAgIHByaW50aygiY29kYV9waW9jdGw6IFZlbnVzIHJldHVybnM6ICVkIGZvciAlc1xuIiwgCisJCSAgICAgICBlcnJvciwgY29kYV9mMnMoZmlkKSk7CisJCWdvdG8gZXhpdDsgCisJfQorCisJaWYgKG91dHNpemUgPCAobG9uZylvdXRwLT5jb2RhX2lvY3RsLmRhdGEgKyBvdXRwLT5jb2RhX2lvY3RsLmxlbikgeworCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKwl9CisgICAgICAgIAorCS8qIENvcHkgb3V0IHRoZSBPVVQgYnVmZmVyLiAqLworICAgICAgICBpZiAob3V0cC0+Y29kYV9pb2N0bC5sZW4gPiBkYXRhLT52aS5vdXRfc2l6ZSkgeworCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gZXhpdDsKKyAgICAgICAgfQorCisJLyogQ29weSBvdXQgdGhlIE9VVCBidWZmZXIuICovCisJaWYgKGNvcHlfdG9fdXNlcihkYXRhLT52aS5vdXQsCisJCQkgKGNoYXIgKilvdXRwICsgKGxvbmcpb3V0cC0+Y29kYV9pb2N0bC5kYXRhLAorCQkJIG91dHAtPmNvZGFfaW9jdGwubGVuKSkgeworCQllcnJvciA9IC1FRkFVTFQ7CisJCWdvdG8gZXhpdDsKKwl9CisKKyBleGl0OgorCUNPREFfRlJFRShpbnAsIGluc2l6ZSk7CisJcmV0dXJuIGVycm9yOworfQorCitpbnQgdmVudXNfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICpzZnMpIAoreyAKKyAgICAgICAgdW5pb24gaW5wdXRBcmdzICppbnA7CisgICAgICAgIHVuaW9uIG91dHB1dEFyZ3MgKm91dHA7CisgICAgICAgIGludCBpbnNpemUsIG91dHNpemUsIGVycm9yOworICAgICAgICAKKwlpbnNpemUgPSBtYXhfdCh1bnNpZ25lZCBpbnQsIElOU0laRShzdGF0ZnMpLCBPVVRTSVpFKHN0YXRmcykpOworCVVQQVJHKENPREFfU1RBVEZTKTsKKworICAgICAgICBlcnJvciA9IGNvZGFfdXBjYWxsKGNvZGFfc2JwKHNiKSwgaW5zaXplLCAmb3V0c2l6ZSwgaW5wKTsKKwkKKyAgICAgICAgaWYgKCFlcnJvcikgeworCQlzZnMtPmZfYmxvY2tzID0gb3V0cC0+Y29kYV9zdGF0ZnMuc3RhdC5mX2Jsb2NrczsKKwkJc2ZzLT5mX2JmcmVlICA9IG91dHAtPmNvZGFfc3RhdGZzLnN0YXQuZl9iZnJlZTsKKwkJc2ZzLT5mX2JhdmFpbCA9IG91dHAtPmNvZGFfc3RhdGZzLnN0YXQuZl9iYXZhaWw7CisJCXNmcy0+Zl9maWxlcyAgPSBvdXRwLT5jb2RhX3N0YXRmcy5zdGF0LmZfZmlsZXM7CisJCXNmcy0+Zl9mZnJlZSAgPSBvdXRwLT5jb2RhX3N0YXRmcy5zdGF0LmZfZmZyZWU7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCJjb2RhX3N0YXRmczogVmVudXMgcmV0dXJuczogJWRcbiIsIGVycm9yKTsKKwl9CisKKyAgICAgICAgQ09EQV9GUkVFKGlucCwgaW5zaXplKTsKKyAgICAgICAgcmV0dXJuIGVycm9yOworfQorCisvKgorICogY29kYV91cGNhbGwgYW5kIGNvZGFfZG93bmNhbGwgcm91dGluZXMuCisgKiAKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgY29kYV93YWl0Zm9yX3VwY2FsbChzdHJ1Y3QgdXBjX3JlcSAqdm1wLAorCQkJCSAgICAgICBzdHJ1Y3QgdmVudXNfY29tbSAqdmNvbW1wKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJdm1wLT51Y19wb3N0dGltZSA9IGppZmZpZXM7CisKKwlhZGRfd2FpdF9xdWV1ZSgmdm1wLT51Y19zbGVlcCwgJndhaXQpOworCWZvciAoOzspIHsKKwkJaWYgKCAhY29kYV9oYXJkICYmIHZtcC0+dWNfb3Bjb2RlICE9IENPREFfQ0xPU0UgKSAKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWVsc2UKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKworICAgICAgICAgICAgICAgIC8qIHZlbnVzIGRpZWQgKi8KKyAgICAgICAgICAgICAgICBpZiAoICF2Y29tbXAtPnZjX2ludXNlICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisJCS8qIGdvdCBhIHJlcGx5ICovCisJCWlmICggdm1wLT51Y19mbGFncyAmICggUkVRX1dSSVRFIHwgUkVRX0FCT1JUICkgKQorCQkJYnJlYWs7CisKKwkJaWYgKCAhY29kYV9oYXJkICYmIHZtcC0+dWNfb3Bjb2RlICE9IENPREFfQ0xPU0UgJiYgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgKSB7CisJCQkvKiBpZiB0aGlzIHByb2Nlc3MgcmVhbGx5IHdhbnRzIHRvIGRpZSwgbGV0IGl0IGdvICovCisJCQlpZiAoIHNpZ2lzbWVtYmVyKCYoY3VycmVudC0+cGVuZGluZy5zaWduYWwpLCBTSUdLSUxMKSB8fAorCQkJICAgICBzaWdpc21lbWJlcigmKGN1cnJlbnQtPnBlbmRpbmcuc2lnbmFsKSwgU0lHSU5UKSApCisJCQkJYnJlYWs7CisJCQkvKiBzaWduYWwgaXMgcHJlc2VudDogYWZ0ZXIgdGltZW91dCBhbHdheXMgcmV0dXJuIAorCQkJICAgcmVhbGx5IHNtYXJ0IGlkZWEsIHByb2JhYmx5IHVzZWxlc3MgLi4uICovCisJCQlpZiAoIGppZmZpZXMgLSB2bXAtPnVjX3Bvc3R0aW1lID4gY29kYV90aW1lb3V0ICogSFogKQorCQkJCWJyZWFrOyAKKwkJfQorCQlzY2hlZHVsZSgpOworCX0KKwlyZW1vdmVfd2FpdF9xdWV1ZSgmdm1wLT51Y19zbGVlcCwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisKKwlyZXR1cm47Cit9CisKKworLyogCisgKiBjb2RhX3VwY2FsbCB3aWxsIHJldHVybiBhbiBlcnJvciBpbiB0aGUgY2FzZSBvZiAKKyAqIGZhaWxlZCBjb21tdW5pY2F0aW9uIHdpdGggVmVudXMgX29yXyB3aWxsIHBlZWsgYXQgVmVudXMKKyAqIHJlcGx5IGFuZCByZXR1cm4gVmVudXMnIGVycm9yLgorICoKKyAqIEFzIHZlbnVzIGhhcyAyIHR5cGVzIG9mIGVycm9ycywgbm9ybWFsIGVycm9ycyAocG9zaXRpdmUpIGFuZCBpbnRlcm5hbAorICogZXJyb3JzIChuZWdhdGl2ZSksIG5vcm1hbCBlcnJvcnMgYXJlIG5lZ2F0ZWQsIHdoaWxlIGludGVybmFsIGVycm9ycworICogYXJlIGFsbCBtYXBwZWQgdG8gLUVJTlRSLCB3aGlsZSBzaG93aW5nIGEgbmljZSB3YXJuaW5nIG1lc3NhZ2UuIChqaCkKKyAqIAorICovCitzdGF0aWMgaW50IGNvZGFfdXBjYWxsKHN0cnVjdCBjb2RhX3NiX2luZm8gKnNiaSwgCisJCWludCBpblNpemUsIGludCAqb3V0U2l6ZSwgCisJCXVuaW9uIGlucHV0QXJncyAqYnVmZmVyKSAKK3sKKwlzdHJ1Y3QgdmVudXNfY29tbSAqdmNvbW1wOworCXVuaW9uIG91dHB1dEFyZ3MgKm91dDsKKwlzdHJ1Y3QgdXBjX3JlcSAqcmVxOworCWludCBlcnJvciA9IDA7CisKKwl2Y29tbXAgPSBzYmktPnNiaV92Y29tbTsKKwlpZiAoICF2Y29tbXAtPnZjX2ludXNlICkgeworCQlwcmludGsoIk5vIHBzZXVkbyBkZXZpY2UgaW4gdXBjYWxsIGNvbW1zIGF0ICVwXG4iLCB2Y29tbXApOworICAgICAgICAgICAgICAgIHJldHVybiAtRU5YSU87CisJfQorCisJLyogRm9ybWF0IHRoZSByZXF1ZXN0IG1lc3NhZ2UuICovCisJcmVxID0gdXBjX2FsbG9jKCk7CisJaWYgKCFyZXEpIHsKKwkJcHJpbnRrKCJGYWlsZWQgdG8gYWxsb2NhdGUgdXBjX3JlcSBzdHJ1Y3R1cmVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmVxLT51Y19kYXRhID0gKHZvaWQgKilidWZmZXI7CisJcmVxLT51Y19mbGFncyA9IDA7CisJcmVxLT51Y19pblNpemUgPSBpblNpemU7CisJcmVxLT51Y19vdXRTaXplID0gKm91dFNpemUgPyAqb3V0U2l6ZSA6IGluU2l6ZTsKKwlyZXEtPnVjX29wY29kZSA9ICgodW5pb24gaW5wdXRBcmdzICopYnVmZmVyKS0+aWgub3Bjb2RlOworCXJlcS0+dWNfdW5pcXVlID0gKyt2Y29tbXAtPnZjX3NlcTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZyZXEtPnVjX3NsZWVwKTsKKwkKKwkvKiBGaWxsIGluIHRoZSBjb21tb24gaW5wdXQgYXJncy4gKi8KKwkoKHVuaW9uIGlucHV0QXJncyAqKWJ1ZmZlciktPmloLnVuaXF1ZSA9IHJlcS0+dWNfdW5pcXVlOworCisJLyogQXBwZW5kIG1zZyB0byBwZW5kaW5nIHF1ZXVlIGFuZCBwb2tlIFZlbnVzLiAqLworCWxpc3RfYWRkKCYocmVxLT51Y19jaGFpbiksIHZjb21tcC0+dmNfcGVuZGluZy5wcmV2KTsKKyAgICAgICAgCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ2Y29tbXAtPnZjX3dhaXRxKTsKKwkvKiBXZSBjYW4gYmUgaW50ZXJydXB0ZWQgd2hpbGUgd2Ugd2FpdCBmb3IgVmVudXMgdG8gcHJvY2VzcworCSAqIG91ciByZXF1ZXN0LiAgSWYgdGhlIGludGVycnVwdCBvY2N1cnMgYmVmb3JlIFZlbnVzIGhhcyByZWFkCisJICogdGhlIHJlcXVlc3QsIHdlIGRlcXVldWUgYW5kIHJldHVybi4gSWYgaXQgb2NjdXJzIGFmdGVyIHRoZQorCSAqIHJlYWQgYnV0IGJlZm9yZSB0aGUgcmVwbHksIHdlIGRlcXVldWUsIHNlbmQgYSBzaWduYWwKKwkgKiBtZXNzYWdlLCBhbmQgcmV0dXJuLiBJZiBpdCBvY2N1cnMgYWZ0ZXIgdGhlIHJlcGx5IHdlIGlnbm9yZQorCSAqIGl0LiBJbiBubyBjYXNlIGRvIHdlIHdhbnQgdG8gcmVzdGFydCB0aGUgc3lzY2FsbC4gIElmIGl0CisJICogd2FzIGludGVycnVwdGVkIGJ5IGEgdmVudXMgc2h1dGRvd24gKHBzZGV2X2Nsb3NlKSwgcmV0dXJuCisJICogRU5PREVWLiAgKi8KKworCS8qIEdvIHRvIHNsZWVwLiAgV2FrZSB1cCBvbiBzaWduYWxzIG9ubHkgYWZ0ZXIgdGhlIHRpbWVvdXQuICovCisJY29kYV93YWl0Zm9yX3VwY2FsbChyZXEsIHZjb21tcCk7CisKKwlpZiAodmNvbW1wLT52Y19pbnVzZSkgeyAgICAgIC8qIGkuZS4gVmVudXMgaXMgc3RpbGwgYWxpdmUgKi8KKwkgICAgLyogT3Agd2VudCB0aHJvdWdoLCBpbnRlcnJ1cHQgb3Igbm90Li4uICovCisJICAgIGlmIChyZXEtPnVjX2ZsYWdzICYgUkVRX1dSSVRFKSB7CisJCW91dCA9ICh1bmlvbiBvdXRwdXRBcmdzICopcmVxLT51Y19kYXRhOworCQkvKiBoZXJlIHdlIG1hcCBwb3NpdGl2ZSBWZW51cyBlcnJvcnMgdG8ga2VybmVsIGVycm9ycyAqLworCQllcnJvciA9IC1vdXQtPm9oLnJlc3VsdDsKKwkJKm91dFNpemUgPSByZXEtPnVjX291dFNpemU7CisJCWdvdG8gZXhpdDsKKwkgICAgfQorCSAgICBpZiAoICEocmVxLT51Y19mbGFncyAmIFJFUV9SRUFEKSAmJiBzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeyAKKwkJLyogSW50ZXJydXB0ZWQgYmVmb3JlIHZlbnVzIHJlYWQgaXQuICovCisJCWxpc3RfZGVsKCYocmVxLT51Y19jaGFpbikpOworCQkvKiBwZXJoYXBzIHRoZSBiZXN0IHdheSB0byBjb252aW5jZSB0aGUgYXBwIHRvCisJCSAgIGdpdmUgdXA/ICovCisJCWVycm9yID0gLUVJTlRSOworCQlnb3RvIGV4aXQ7CisJICAgIH0gCisJICAgIGlmICggKHJlcS0+dWNfZmxhZ3MgJiBSRVFfUkVBRCkgJiYgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgKSB7CisJCSAgICAvKiBpbnRlcnJ1cHRlZCBhZnRlciBWZW51cyBkaWQgaXRzIHJlYWQsIHNlbmQgc2lnbmFsICovCisJCSAgICB1bmlvbiBpbnB1dEFyZ3MgKnNpZ19pbnB1dEFyZ3M7CisJCSAgICBzdHJ1Y3QgdXBjX3JlcSAqc2lnX3JlcTsKKwkJICAgIAorCQkgICAgbGlzdF9kZWwoJihyZXEtPnVjX2NoYWluKSk7CisJCSAgICBlcnJvciA9IC1FTk9NRU07CisJCSAgICBzaWdfcmVxID0gdXBjX2FsbG9jKCk7CisJCSAgICBpZiAoIXNpZ19yZXEpIGdvdG8gZXhpdDsKKworCQkgICAgQ09EQV9BTExPQygoc2lnX3JlcS0+dWNfZGF0YSksIGNoYXIgKiwgc2l6ZW9mKHN0cnVjdCBjb2RhX2luX2hkcikpOworCQkgICAgaWYgKCFzaWdfcmVxLT51Y19kYXRhKSB7CisJCQl1cGNfZnJlZShzaWdfcmVxKTsKKwkJCWdvdG8gZXhpdDsKKwkJICAgIH0KKwkJICAgIAorCQkgICAgZXJyb3IgPSAtRUlOVFI7CisJCSAgICBzaWdfaW5wdXRBcmdzID0gKHVuaW9uIGlucHV0QXJncyAqKXNpZ19yZXEtPnVjX2RhdGE7CisJCSAgICBzaWdfaW5wdXRBcmdzLT5paC5vcGNvZGUgPSBDT0RBX1NJR05BTDsKKwkJICAgIHNpZ19pbnB1dEFyZ3MtPmloLnVuaXF1ZSA9IHJlcS0+dWNfdW5pcXVlOworCQkgICAgCisJCSAgICBzaWdfcmVxLT51Y19mbGFncyA9IFJFUV9BU1lOQzsKKwkJICAgIHNpZ19yZXEtPnVjX29wY29kZSA9IHNpZ19pbnB1dEFyZ3MtPmloLm9wY29kZTsKKwkJICAgIHNpZ19yZXEtPnVjX3VuaXF1ZSA9IHNpZ19pbnB1dEFyZ3MtPmloLnVuaXF1ZTsKKwkJICAgIHNpZ19yZXEtPnVjX2luU2l6ZSA9IHNpemVvZihzdHJ1Y3QgY29kYV9pbl9oZHIpOworCQkgICAgc2lnX3JlcS0+dWNfb3V0U2l6ZSA9IHNpemVvZihzdHJ1Y3QgY29kYV9pbl9oZHIpOworCQkgICAgCisJCSAgICAvKiBpbnNlcnQgYXQgaGVhZCBvZiBxdWV1ZSEgKi8KKwkJICAgIGxpc3RfYWRkKCYoc2lnX3JlcS0+dWNfY2hhaW4pLCAmdmNvbW1wLT52Y19wZW5kaW5nKTsKKwkJICAgIHdha2VfdXBfaW50ZXJydXB0aWJsZSgmdmNvbW1wLT52Y193YWl0cSk7CisJICAgIH0gZWxzZSB7CisJCSAgICBwcmludGsoIkNvZGE6IFN0cmFuZ2UgaW50ZXJydXB0aW9uLi5cbiIpOworCQkgICAgZXJyb3IgPSAtRUlOVFI7CisJICAgIH0KKwl9IGVsc2UgewkvKiBJZiB2ZW51cyBkaWVkIGkuZS4gIVZDX09QRU4odmNvbW1wKSAqLworCSAgICAgICAgcHJpbnRrKCJjb2RhX3VwY2FsbDogVmVudXMgZGVhZCBvbiAob3AsdW4pICglZC4lZCkgZmxhZ3MgJWRcbiIsCisJCSAgICAgICByZXEtPnVjX29wY29kZSwgcmVxLT51Y191bmlxdWUsIHJlcS0+dWNfZmxhZ3MpOworCQllcnJvciA9IC1FTk9ERVY7CisJfQorCisgZXhpdDoKKwl1cGNfZnJlZShyZXEpOworCXJldHVybiBlcnJvcjsKK30KKworLyogIAorICAgIFRoZSBzdGF0ZW1lbnRzIGJlbG93IGFyZSBwYXJ0IG9mIHRoZSBDb2RhIG9wcG9ydHVuaXN0aWMKKyAgICBwcm9ncmFtbWluZyAtLSB0YWtlbiBmcm9tIHRoZSBNYWNoL0JTRCBrZXJuZWwgY29kZSBmb3IgQ29kYS4gCisgICAgWW91IGRvbid0IGdldCBjb3JyZWN0IHNlbWFudGljcyBieSBzdGF0aW5nIHdoYXQgbmVlZHMgdG8gYmUKKyAgICBkb25lIHdpdGhvdXQgZ3VhcmFudGVlaW5nIHRoZSBpbnZhcmlhbnRzIG5lZWRlZCBmb3IgaXQgdG8gaGFwcGVuLgorICAgIFdoZW4gd2lsbCBiZSBoYXZlIHRpbWUgdG8gZmluZCBvdXQgd2hhdCBleGFjdGx5IGlzIGdvaW5nIG9uPyAgKHBqYikKKyovCisKKworLyogCisgKiBUaGVyZSBhcmUgNyBjYXNlcyB3aGVyZSBjYWNoZSBpbnZhbGlkYXRpb25zIG9jY3VyLiAgVGhlIHNlbWFudGljcworICogIG9mIGVhY2ggaXMgbGlzdGVkIGhlcmU6CisgKgorICogQ09EQV9GTFVTSCAgICAgLS0gZmx1c2ggYWxsIGVudHJpZXMgZnJvbSB0aGUgbmFtZSBjYWNoZSBhbmQgdGhlIGNub2RlIGNhY2hlLgorICogQ09EQV9QVVJHRVVTRVIgLS0gZmx1c2ggYWxsIGVudHJpZXMgZnJvbSB0aGUgbmFtZSBjYWNoZSBmb3IgYSBzcGVjaWZpYyB1c2VyCisgKiAgICAgICAgICAgICAgICAgIFRoaXMgY2FsbCBpcyBhIHJlc3VsdCBvZiB0b2tlbiBleHBpcmF0aW9uLgorICoKKyAqIFRoZSBuZXh0IGFyaXNlIGFzIHRoZSByZXN1bHQgb2YgY2FsbGJhY2tzIG9uIGEgZmlsZSBvciBkaXJlY3RvcnkuCisgKiBDT0RBX1pBUEZJTEUgICAtLSBmbHVzaCB0aGUgY2FjaGVkIGF0dHJpYnV0ZXMgZm9yIGEgZmlsZS4KKworICogQ09EQV9aQVBESVIgICAgLS0gZmx1c2ggdGhlIGF0dHJpYnV0ZXMgZm9yIHRoZSBkaXIgYW5kCisgKiAgICAgICAgICAgICAgICAgIGZvcmNlIGEgbmV3IGxvb2t1cCBmb3IgYWxsIHRoZSBjaGlsZHJlbgorICAgICAgICAgICAgICAgICAgICBvZiB0aGlzIGRpci4KKworICoKKyAqIFRoZSBuZXh0IGlzIGEgcmVzdWx0IG9mIFZlbnVzIGRldGVjdGluZyBhbiBpbmNvbnNpc3RlbnQgZmlsZS4KKyAqIENPREFfUFVSR0VGSUQgIC0tIGZsdXNoIHRoZSBhdHRyaWJ1dGUgZm9yIHRoZSBmaWxlCisgKiAgICAgICAgICAgICAgICAgIHB1cmdlIGl0IGFuZCBpdHMgY2hpbGRyZW4gZnJvbSB0aGUgZGNhY2hlCisgKgorICogVGhlIGxhc3QgIGFsbG93cyBWZW51cyB0byByZXBsYWNlIGxvY2FsIGZpZHMgd2l0aCBnbG9iYWwgb25lcworICogZHVyaW5nIHJlaW50ZWdyYXRpb24uCisgKgorICogQ09EQV9SRVBMQUNFIC0tIHJlcGxhY2Ugb25lIENvZGFGaWQgd2l0aCBhbm90aGVyIHRocm91Z2hvdXQgdGhlIG5hbWUgY2FjaGUgKi8KKworaW50IGNvZGFfZG93bmNhbGwoaW50IG9wY29kZSwgdW5pb24gb3V0cHV0QXJncyAqIG91dCwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwkvKiBIYW5kbGUgaW52YWxpZGF0aW9uIHJlcXVlc3RzLiAqLworICAgICAgICAgIGlmICggIXNiIHx8ICFzYi0+c19yb290IHx8ICFzYi0+c19yb290LT5kX2lub2RlKQorCQkgIHJldHVybiAwOyAKKworCSAgc3dpdGNoIChvcGNvZGUpIHsKKworCSAgY2FzZSBDT0RBX0ZMVVNIIDogeworCQkgICBjb2RhX2NhY2hlX2NsZWFyX2FsbChzYik7CisJCSAgIHNocmlua19kY2FjaGVfc2Ioc2IpOworCQkgICBjb2RhX2ZsYWdfaW5vZGUoc2ItPnNfcm9vdC0+ZF9pbm9kZSwgQ19GTFVTSCk7CisJCSAgIHJldHVybigwKTsKKwkgIH0KKworCSAgY2FzZSBDT0RBX1BVUkdFVVNFUiA6IHsKKwkJICAgY29kYV9jYWNoZV9jbGVhcl9hbGwoc2IpOworCQkgICByZXR1cm4oMCk7CisJICB9CisKKwkgIGNhc2UgQ09EQV9aQVBESVIgOiB7CisJICAgICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGU7CisJCSAgc3RydWN0IENvZGFGaWQgKmZpZCA9ICZvdXQtPmNvZGFfemFwZGlyLkNvZGFGaWQ7CisKKwkJICBpbm9kZSA9IGNvZGFfZmlkX3RvX2lub2RlKGZpZCwgc2IpOworCQkgIGlmIChpbm9kZSkgeworCQkJICBjb2RhX2ZsYWdfaW5vZGVfY2hpbGRyZW4oaW5vZGUsIENfUFVSR0UpOworCSAgICAgICAgICAgICAgICAgIGNvZGFfZmxhZ19pbm9kZShpbm9kZSwgQ19WQVRUUik7CisJCQkgIGlwdXQoaW5vZGUpOworCQkgIH0KKwkJICAKKwkJICByZXR1cm4oMCk7CisJICB9CisKKwkgIGNhc2UgQ09EQV9aQVBGSUxFIDogeworCSAgICAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlOworCQkgIHN0cnVjdCBDb2RhRmlkICpmaWQgPSAmb3V0LT5jb2RhX3phcGZpbGUuQ29kYUZpZDsKKwkJICBpbm9kZSA9IGNvZGFfZmlkX3RvX2lub2RlKGZpZCwgc2IpOworCQkgIGlmICggaW5vZGUgKSB7CisJICAgICAgICAgICAgICAgICAgY29kYV9mbGFnX2lub2RlKGlub2RlLCBDX1ZBVFRSKTsKKwkJCSAgaXB1dChpbm9kZSk7CisJCSAgfQorCQkgIHJldHVybiAwOworCSAgfQorCisJICBjYXNlIENPREFfUFVSR0VGSUQgOiB7CisJICAgICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGU7CisJCSAgc3RydWN0IENvZGFGaWQgKmZpZCA9ICZvdXQtPmNvZGFfcHVyZ2VmaWQuQ29kYUZpZDsKKwkJICBpbm9kZSA9IGNvZGFfZmlkX3RvX2lub2RlKGZpZCwgc2IpOworCQkgIGlmICggaW5vZGUgKSB7IAorCQkJY29kYV9mbGFnX2lub2RlX2NoaWxkcmVuKGlub2RlLCBDX1BVUkdFKTsKKworCQkJLyogY2F0Y2ggdGhlIGRlbnRyaWVzIGxhdGVyIGlmIHNvbWUgYXJlIHN0aWxsIGJ1c3kgKi8KKwkJCWNvZGFfZmxhZ19pbm9kZShpbm9kZSwgQ19QVVJHRSk7CisJCQlkX3BydW5lX2FsaWFzZXMoaW5vZGUpOworCisJCQlpcHV0KGlub2RlKTsKKwkJICB9CisJCSAgcmV0dXJuIDA7CisJICB9CisKKwkgIGNhc2UgQ09EQV9SRVBMQUNFIDogeworCSAgICAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlOworCQkgIHN0cnVjdCBDb2RhRmlkICpvbGRmaWQgPSAmb3V0LT5jb2RhX3JlcGxhY2UuT2xkRmlkOworCQkgIHN0cnVjdCBDb2RhRmlkICpuZXdmaWQgPSAmb3V0LT5jb2RhX3JlcGxhY2UuTmV3RmlkOworCQkgIGlub2RlID0gY29kYV9maWRfdG9faW5vZGUob2xkZmlkLCBzYik7CisJCSAgaWYgKCBpbm9kZSApIHsgCisJCQkgIGNvZGFfcmVwbGFjZV9maWQoaW5vZGUsIG9sZGZpZCwgbmV3ZmlkKTsKKwkJCSAgaXB1dChpbm9kZSk7CisJCSAgfQorCQkgIHJldHVybiAwOworCSAgfQorCSAgfQorCSAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2ZzL2NvbXBhdC5jIGIvZnMvY29tcGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkxMmJkZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2NvbXBhdC5jCkBAIC0wLDAgKzEsMTk1MCBAQAorLyoKKyAqICBsaW51eC9mcy9jb21wYXQuYworICoKKyAqICBLZXJuZWwgY29tcGF0aWJpbGlsdHkgcm91dGluZXMgZm9yIGUuZy4gMzIgYml0IHN5c2NhbGwgc3VwcG9ydAorICogIG9uIDY0IGJpdCBrZXJuZWxzLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDIgICAgICAgU3RlcGhlbiBSb3Rod2VsbCwgSUJNIENvcnBvcmF0aW9uCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMDAgIEpha3ViIEplbGluZWsgIChqYWt1YkByZWRoYXQuY29tKQorICogIENvcHlyaWdodCAoQykgMTk5OCAgICAgICBFZGRpZSBDLiBEb3N0ICAoZWNkQHNreW5ldC5iZSkKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwMiAgQW5kaSBLbGVlbiwgU3VTRSBMYWJzIAorICogIENvcHlyaWdodCAoQykgMjAwMyAgICAgICBQYXZlbCBNYWNoZWsgKHBhdmVsQHN1c2UuY3opCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bDMyLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgkvKiBmb3IgU0lPQ0RFVlBSSVZBVEUgKi8KKyNpbmNsdWRlIDxsaW51eC9zbWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbWJfbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uY3BfbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kaXJlbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kbm90aWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvaGlnaHVpZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL25mc2QuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJzb25hbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisKKyNpbmNsdWRlIDxuZXQvc29jay5oPgkJLyogc2lvY2RldnByaXZhdGVfaW9jdGwgKi8KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CisjaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgorCisvKgorICogTm90IGFsbCBhcmNoaXRlY3R1cmVzIGhhdmUgc3lzX3V0aW1lLCBzbyBpbXBsZW1lbnQgdGhpcyBpbiB0ZXJtcworICogb2Ygc3lzX3V0aW1lcy4KKyAqLworYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfdXRpbWUoY2hhciBfX3VzZXIgKmZpbGVuYW1lLCBzdHJ1Y3QgY29tcGF0X3V0aW1idWYgX191c2VyICp0KQoreworCXN0cnVjdCB0aW1ldmFsIHR2WzJdOworCisJaWYgKHQpIHsKKwkJaWYgKGdldF91c2VyKHR2WzBdLnR2X3NlYywgJnQtPmFjdGltZSkgfHwKKwkJICAgIGdldF91c2VyKHR2WzFdLnR2X3NlYywgJnQtPm1vZHRpbWUpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXR2WzBdLnR2X3VzZWMgPSAwOworCQl0dlsxXS50dl91c2VjID0gMDsKKwl9CisJcmV0dXJuIGRvX3V0aW1lcyhmaWxlbmFtZSwgdCA/IHR2IDogTlVMTCk7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3V0aW1lcyhjaGFyIF9fdXNlciAqZmlsZW5hbWUsIHN0cnVjdCBjb21wYXRfdGltZXZhbCBfX3VzZXIgKnQpCit7CisJc3RydWN0IHRpbWV2YWwgdHZbMl07CisKKwlpZiAodCkgeyAKKwkJaWYgKGdldF91c2VyKHR2WzBdLnR2X3NlYywgJnRbMF0udHZfc2VjKSB8fAorCQkgICAgZ2V0X3VzZXIodHZbMF0udHZfdXNlYywgJnRbMF0udHZfdXNlYykgfHwKKwkJICAgIGdldF91c2VyKHR2WzFdLnR2X3NlYywgJnRbMV0udHZfc2VjKSB8fAorCQkgICAgZ2V0X3VzZXIodHZbMV0udHZfdXNlYywgJnRbMV0udHZfdXNlYykpCisJCQlyZXR1cm4gLUVGQVVMVDsgCisJfSAKKwlyZXR1cm4gZG9fdXRpbWVzKGZpbGVuYW1lLCB0ID8gdHYgOiBOVUxMKTsKK30KKworYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfbmV3c3RhdChjaGFyIF9fdXNlciAqIGZpbGVuYW1lLAorCQlzdHJ1Y3QgY29tcGF0X3N0YXQgX191c2VyICpzdGF0YnVmKQoreworCXN0cnVjdCBrc3RhdCBzdGF0OworCWludCBlcnJvciA9IHZmc19zdGF0KGZpbGVuYW1lLCAmc3RhdCk7CisKKwlpZiAoIWVycm9yKQorCQllcnJvciA9IGNwX2NvbXBhdF9zdGF0KCZzdGF0LCBzdGF0YnVmKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX25ld2xzdGF0KGNoYXIgX191c2VyICogZmlsZW5hbWUsCisJCXN0cnVjdCBjb21wYXRfc3RhdCBfX3VzZXIgKnN0YXRidWYpCit7CisJc3RydWN0IGtzdGF0IHN0YXQ7CisJaW50IGVycm9yID0gdmZzX2xzdGF0KGZpbGVuYW1lLCAmc3RhdCk7CisKKwlpZiAoIWVycm9yKQorCQllcnJvciA9IGNwX2NvbXBhdF9zdGF0KCZzdGF0LCBzdGF0YnVmKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX25ld2ZzdGF0KHVuc2lnbmVkIGludCBmZCwKKwkJc3RydWN0IGNvbXBhdF9zdGF0IF9fdXNlciAqIHN0YXRidWYpCit7CisJc3RydWN0IGtzdGF0IHN0YXQ7CisJaW50IGVycm9yID0gdmZzX2ZzdGF0KGZkLCAmc3RhdCk7CisKKwlpZiAoIWVycm9yKQorCQllcnJvciA9IGNwX2NvbXBhdF9zdGF0KCZzdGF0LCBzdGF0YnVmKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgcHV0X2NvbXBhdF9zdGF0ZnMoc3RydWN0IGNvbXBhdF9zdGF0ZnMgX191c2VyICp1YnVmLCBzdHJ1Y3Qga3N0YXRmcyAqa2J1ZikKK3sKKwkKKwlpZiAoc2l6ZW9mIHVidWYtPmZfYmxvY2tzID09IDQpIHsKKwkJaWYgKChrYnVmLT5mX2Jsb2NrcyB8IGtidWYtPmZfYmZyZWUgfCBrYnVmLT5mX2JhdmFpbCkgJgorCQkgICAgMHhmZmZmZmZmZjAwMDAwMDAwVUxMKQorCQkJcmV0dXJuIC1FT1ZFUkZMT1c7CisJCS8qIGZfZmlsZXMgYW5kIGZfZmZyZWUgbWF5IGJlIC0xOyBpdCdzIG9rYXkKKwkJICogdG8gc3R1ZmYgdGhhdCBpbnRvIDMyIGJpdHMgKi8KKwkJaWYgKGtidWYtPmZfZmlsZXMgIT0gMHhmZmZmZmZmZmZmZmZmZmZmVUxMCisJCSAmJiAoa2J1Zi0+Zl9maWxlcyAmIDB4ZmZmZmZmZmYwMDAwMDAwMFVMTCkpCisJCQlyZXR1cm4gLUVPVkVSRkxPVzsKKwkJaWYgKGtidWYtPmZfZmZyZWUgIT0gMHhmZmZmZmZmZmZmZmZmZmZmVUxMCisJCSAmJiAoa2J1Zi0+Zl9mZnJlZSAmIDB4ZmZmZmZmZmYwMDAwMDAwMFVMTCkpCisJCQlyZXR1cm4gLUVPVkVSRkxPVzsKKwl9CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB1YnVmLCBzaXplb2YoKnVidWYpKSB8fAorCSAgICBfX3B1dF91c2VyKGtidWYtPmZfdHlwZSwgJnVidWYtPmZfdHlwZSkgfHwKKwkgICAgX19wdXRfdXNlcihrYnVmLT5mX2JzaXplLCAmdWJ1Zi0+Zl9ic2l6ZSkgfHwKKwkgICAgX19wdXRfdXNlcihrYnVmLT5mX2Jsb2NrcywgJnVidWYtPmZfYmxvY2tzKSB8fAorCSAgICBfX3B1dF91c2VyKGtidWYtPmZfYmZyZWUsICZ1YnVmLT5mX2JmcmVlKSB8fAorCSAgICBfX3B1dF91c2VyKGtidWYtPmZfYmF2YWlsLCAmdWJ1Zi0+Zl9iYXZhaWwpIHx8CisJICAgIF9fcHV0X3VzZXIoa2J1Zi0+Zl9maWxlcywgJnVidWYtPmZfZmlsZXMpIHx8CisJICAgIF9fcHV0X3VzZXIoa2J1Zi0+Zl9mZnJlZSwgJnVidWYtPmZfZmZyZWUpIHx8CisJICAgIF9fcHV0X3VzZXIoa2J1Zi0+Zl9uYW1lbGVuLCAmdWJ1Zi0+Zl9uYW1lbGVuKSB8fAorCSAgICBfX3B1dF91c2VyKGtidWYtPmZfZnNpZC52YWxbMF0sICZ1YnVmLT5mX2ZzaWQudmFsWzBdKSB8fAorCSAgICBfX3B1dF91c2VyKGtidWYtPmZfZnNpZC52YWxbMV0sICZ1YnVmLT5mX2ZzaWQudmFsWzFdKSB8fAorCSAgICBfX3B1dF91c2VyKGtidWYtPmZfZnJzaXplLCAmdWJ1Zi0+Zl9mcnNpemUpIHx8CisJICAgIF9fcHV0X3VzZXIoMCwgJnVidWYtPmZfc3BhcmVbMF0pIHx8IAorCSAgICBfX3B1dF91c2VyKDAsICZ1YnVmLT5mX3NwYXJlWzFdKSB8fCAKKwkgICAgX19wdXRfdXNlcigwLCAmdWJ1Zi0+Zl9zcGFyZVsyXSkgfHwgCisJICAgIF9fcHV0X3VzZXIoMCwgJnVidWYtPmZfc3BhcmVbM10pIHx8IAorCSAgICBfX3B1dF91c2VyKDAsICZ1YnVmLT5mX3NwYXJlWzRdKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHN0YXRmcyBjYWxscyBhcmUgY29waWVzIG9mIGNvZGUgZnJvbSBmcy9vcGVuLmMgYW5kCisgKiBzaG91bGQgYmUgY2hlY2tlZCBhZ2FpbnN0IHRob3NlIGZyb20gdGltZSB0byB0aW1lCisgKi8KK2FzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3N0YXRmcyhjb25zdCBjaGFyIF9fdXNlciAqcGF0aCwgc3RydWN0IGNvbXBhdF9zdGF0ZnMgX191c2VyICpidWYpCit7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IHVzZXJfcGF0aF93YWxrKHBhdGgsICZuZCk7CisJaWYgKCFlcnJvcikgeworCQlzdHJ1Y3Qga3N0YXRmcyB0bXA7CisJCWVycm9yID0gdmZzX3N0YXRmcyhuZC5kZW50cnktPmRfaW5vZGUtPmlfc2IsICZ0bXApOworCQlpZiAoIWVycm9yICYmIHB1dF9jb21wYXRfc3RhdGZzKGJ1ZiwgJnRtcCkpCisJCQllcnJvciA9IC1FRkFVTFQ7CisJCXBhdGhfcmVsZWFzZSgmbmQpOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2ZzdGF0ZnModW5zaWduZWQgaW50IGZkLCBzdHJ1Y3QgY29tcGF0X3N0YXRmcyBfX3VzZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZmlsZSAqIGZpbGU7CisJc3RydWN0IGtzdGF0ZnMgdG1wOworCWludCBlcnJvcjsKKworCWVycm9yID0gLUVCQURGOworCWZpbGUgPSBmZ2V0KGZkKTsKKwlpZiAoIWZpbGUpCisJCWdvdG8gb3V0OworCWVycm9yID0gdmZzX3N0YXRmcyhmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9zYiwgJnRtcCk7CisJaWYgKCFlcnJvciAmJiBwdXRfY29tcGF0X3N0YXRmcyhidWYsICZ0bXApKQorCQllcnJvciA9IC1FRkFVTFQ7CisJZnB1dChmaWxlKTsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgcHV0X2NvbXBhdF9zdGF0ZnM2NChzdHJ1Y3QgY29tcGF0X3N0YXRmczY0IF9fdXNlciAqdWJ1Ziwgc3RydWN0IGtzdGF0ZnMgKmtidWYpCit7CisJaWYgKHNpemVvZiB1YnVmLT5mX2Jsb2NrcyA9PSA0KSB7CisJCWlmICgoa2J1Zi0+Zl9ibG9ja3MgfCBrYnVmLT5mX2JmcmVlIHwga2J1Zi0+Zl9iYXZhaWwpICYKKwkJICAgIDB4ZmZmZmZmZmYwMDAwMDAwMFVMTCkKKwkJCXJldHVybiAtRU9WRVJGTE9XOworCQkvKiBmX2ZpbGVzIGFuZCBmX2ZmcmVlIG1heSBiZSAtMTsgaXQncyBva2F5CisJCSAqIHRvIHN0dWZmIHRoYXQgaW50byAzMiBiaXRzICovCisJCWlmIChrYnVmLT5mX2ZpbGVzICE9IDB4ZmZmZmZmZmZmZmZmZmZmZlVMTAorCQkgJiYgKGtidWYtPmZfZmlsZXMgJiAweGZmZmZmZmZmMDAwMDAwMDBVTEwpKQorCQkJcmV0dXJuIC1FT1ZFUkZMT1c7CisJCWlmIChrYnVmLT5mX2ZmcmVlICE9IDB4ZmZmZmZmZmZmZmZmZmZmZlVMTAorCQkgJiYgKGtidWYtPmZfZmZyZWUgJiAweGZmZmZmZmZmMDAwMDAwMDBVTEwpKQorCQkJcmV0dXJuIC1FT1ZFUkZMT1c7CisJfQorCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdWJ1Ziwgc2l6ZW9mKCp1YnVmKSkgfHwKKwkgICAgX19wdXRfdXNlcihrYnVmLT5mX3R5cGUsICZ1YnVmLT5mX3R5cGUpIHx8CisJICAgIF9fcHV0X3VzZXIoa2J1Zi0+Zl9ic2l6ZSwgJnVidWYtPmZfYnNpemUpIHx8CisJICAgIF9fcHV0X3VzZXIoa2J1Zi0+Zl9ibG9ja3MsICZ1YnVmLT5mX2Jsb2NrcykgfHwKKwkgICAgX19wdXRfdXNlcihrYnVmLT5mX2JmcmVlLCAmdWJ1Zi0+Zl9iZnJlZSkgfHwKKwkgICAgX19wdXRfdXNlcihrYnVmLT5mX2JhdmFpbCwgJnVidWYtPmZfYmF2YWlsKSB8fAorCSAgICBfX3B1dF91c2VyKGtidWYtPmZfZmlsZXMsICZ1YnVmLT5mX2ZpbGVzKSB8fAorCSAgICBfX3B1dF91c2VyKGtidWYtPmZfZmZyZWUsICZ1YnVmLT5mX2ZmcmVlKSB8fAorCSAgICBfX3B1dF91c2VyKGtidWYtPmZfbmFtZWxlbiwgJnVidWYtPmZfbmFtZWxlbikgfHwKKwkgICAgX19wdXRfdXNlcihrYnVmLT5mX2ZzaWQudmFsWzBdLCAmdWJ1Zi0+Zl9mc2lkLnZhbFswXSkgfHwKKwkgICAgX19wdXRfdXNlcihrYnVmLT5mX2ZzaWQudmFsWzFdLCAmdWJ1Zi0+Zl9mc2lkLnZhbFsxXSkgfHwKKwkgICAgX19wdXRfdXNlcihrYnVmLT5mX2Zyc2l6ZSwgJnVidWYtPmZfZnJzaXplKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX3N0YXRmczY0KGNvbnN0IGNoYXIgX191c2VyICpwYXRoLCBjb21wYXRfc2l6ZV90IHN6LCBzdHJ1Y3QgY29tcGF0X3N0YXRmczY0IF9fdXNlciAqYnVmKQoreworCXN0cnVjdCBuYW1laWRhdGEgbmQ7CisJaW50IGVycm9yOworCisJaWYgKHN6ICE9IHNpemVvZigqYnVmKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnJvciA9IHVzZXJfcGF0aF93YWxrKHBhdGgsICZuZCk7CisJaWYgKCFlcnJvcikgeworCQlzdHJ1Y3Qga3N0YXRmcyB0bXA7CisJCWVycm9yID0gdmZzX3N0YXRmcyhuZC5kZW50cnktPmRfaW5vZGUtPmlfc2IsICZ0bXApOworCQlpZiAoIWVycm9yICYmIHB1dF9jb21wYXRfc3RhdGZzNjQoYnVmLCAmdG1wKSkKKwkJCWVycm9yID0gLUVGQVVMVDsKKwkJcGF0aF9yZWxlYXNlKCZuZCk7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfZnN0YXRmczY0KHVuc2lnbmVkIGludCBmZCwgY29tcGF0X3NpemVfdCBzeiwgc3RydWN0IGNvbXBhdF9zdGF0ZnM2NCBfX3VzZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZmlsZSAqIGZpbGU7CisJc3RydWN0IGtzdGF0ZnMgdG1wOworCWludCBlcnJvcjsKKworCWlmIChzeiAhPSBzaXplb2YoKmJ1ZikpCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyb3IgPSAtRUJBREY7CisJZmlsZSA9IGZnZXQoZmQpOworCWlmICghZmlsZSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSB2ZnNfc3RhdGZzKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NiLCAmdG1wKTsKKwlpZiAoIWVycm9yICYmIHB1dF9jb21wYXRfc3RhdGZzNjQoYnVmLCAmdG1wKSkKKwkJZXJyb3IgPSAtRUZBVUxUOworCWZwdXQoZmlsZSk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCisvKiBpb2N0bDMyIHN0dWZmLCB1c2VkIGJ5IHNwYXJjNjQsIHBhcmlzYywgczM5MHgsIHBwYzY0LCB4ODZfNjQsIE1JUFMgKi8KKworI2RlZmluZSBJT0NUTF9IQVNIU0laRSAyNTYKK3N0YXRpYyBzdHJ1Y3QgaW9jdGxfdHJhbnMgKmlvY3RsMzJfaGFzaF90YWJsZVtJT0NUTF9IQVNIU0laRV07CitzdGF0aWMgREVDTEFSRV9SV1NFTShpb2N0bDMyX3NlbSk7CisKK2V4dGVybiBzdHJ1Y3QgaW9jdGxfdHJhbnMgaW9jdGxfc3RhcnRbXTsKK2V4dGVybiBpbnQgaW9jdGxfdGFibGVfc2l6ZTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGlvY3RsMzJfaGFzaCh1bnNpZ25lZCBsb25nIGNtZCkKK3sKKwlyZXR1cm4gKCgoY21kID4+IDYpIF4gKGNtZCA+PiA0KSBeIGNtZCkpICUgSU9DVExfSEFTSFNJWkU7Cit9CisKK3N0YXRpYyB2b2lkIGlvY3RsMzJfaW5zZXJ0X3RyYW5zbGF0aW9uKHN0cnVjdCBpb2N0bF90cmFucyAqdHJhbnMpCit7CisJdW5zaWduZWQgbG9uZyBoYXNoOworCXN0cnVjdCBpb2N0bF90cmFucyAqdDsKKworCWhhc2ggPSBpb2N0bDMyX2hhc2ggKHRyYW5zLT5jbWQpOworCWlmICghaW9jdGwzMl9oYXNoX3RhYmxlW2hhc2hdKQorCQlpb2N0bDMyX2hhc2hfdGFibGVbaGFzaF0gPSB0cmFuczsKKwllbHNlIHsKKwkJdCA9IGlvY3RsMzJfaGFzaF90YWJsZVtoYXNoXTsKKwkJd2hpbGUgKHQtPm5leHQpCisJCQl0ID0gdC0+bmV4dDsKKwkJdHJhbnMtPm5leHQgPSBOVUxMOworCQl0LT5uZXh0ID0gdHJhbnM7CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3N5czMyX2lvY3RsKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW9jdGxfdGFibGVfc2l6ZTsgaSsrKSB7CisJCWlmIChpb2N0bF9zdGFydFtpXS5uZXh0ICE9IDApIHsgCisJCQlwcmludGsoImlvY3RsIHRyYW5zbGF0aW9uICVkIGJhZFxuIixpKTsgCisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpb2N0bDMyX2luc2VydF90cmFuc2xhdGlvbigmaW9jdGxfc3RhcnRbaV0pOworCX0KKwlyZXR1cm4gMDsKK30KKworX19pbml0Y2FsbChpbml0X3N5czMyX2lvY3RsKTsKKworaW50IHJlZ2lzdGVyX2lvY3RsMzJfY29udmVyc2lvbih1bnNpZ25lZCBpbnQgY21kLAorCQkJCWlvY3RsX3RyYW5zX2hhbmRsZXJfdCBoYW5kbGVyKQoreworCXN0cnVjdCBpb2N0bF90cmFucyAqdDsKKwlzdHJ1Y3QgaW9jdGxfdHJhbnMgKm5ld190OworCXVuc2lnbmVkIGxvbmcgaGFzaCA9IGlvY3RsMzJfaGFzaChjbWQpOworCisJbmV3X3QgPSBrbWFsbG9jKHNpemVvZigqbmV3X3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5ld190KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRvd25fd3JpdGUoJmlvY3RsMzJfc2VtKTsKKwlmb3IgKHQgPSBpb2N0bDMyX2hhc2hfdGFibGVbaGFzaF07IHQ7IHQgPSB0LT5uZXh0KSB7CisJCWlmICh0LT5jbWQgPT0gY21kKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlRyeWluZyB0byByZWdpc3RlciBkdXBsaWNhdGVkIGlvY3RsMzIgIgorCQkJCQkiaGFuZGxlciAleFxuIiwgY21kKTsKKwkJCXVwX3dyaXRlKCZpb2N0bDMyX3NlbSk7CisJCQlrZnJlZShuZXdfdCk7CisJCQlyZXR1cm4gLUVJTlZBTDsgCisJCX0KKwl9CisJbmV3X3QtPm5leHQgPSBOVUxMOworCW5ld190LT5jbWQgPSBjbWQ7CisJbmV3X3QtPmhhbmRsZXIgPSBoYW5kbGVyOworCWlvY3RsMzJfaW5zZXJ0X3RyYW5zbGF0aW9uKG5ld190KTsKKworCXVwX3dyaXRlKCZpb2N0bDMyX3NlbSk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX2lvY3RsMzJfY29udmVyc2lvbik7CisKK3N0YXRpYyBpbmxpbmUgaW50IGJ1aWx0aW5faW9jdGwoc3RydWN0IGlvY3RsX3RyYW5zICp0KQoreyAKKwlyZXR1cm4gdCA+PSBpb2N0bF9zdGFydCAmJiB0IDwgKGlvY3RsX3N0YXJ0ICsgaW9jdGxfdGFibGVfc2l6ZSk7Cit9IAorCisvKiBQcm9ibGVtOiAKKyAgIFRoaXMgZnVuY3Rpb24gY2Fubm90IHVucmVnaXN0ZXIgZHVwbGljYXRlIGlvY3RscywgYmVjYXVzZSB0aGV5IGFyZSBub3QKKyAgIHVuaXF1ZS4KKyAgIFdoZW4gdGhleSBoYXBwZW4gd2UgbmVlZCB0byBleHRlbmQgdGhlIHByb3RvdHlwZSB0byBwYXNzIHRoZSBoYW5kbGVyIHRvby4gKi8KKworaW50IHVucmVnaXN0ZXJfaW9jdGwzMl9jb252ZXJzaW9uKHVuc2lnbmVkIGludCBjbWQpCit7CisJdW5zaWduZWQgbG9uZyBoYXNoID0gaW9jdGwzMl9oYXNoKGNtZCk7CisJc3RydWN0IGlvY3RsX3RyYW5zICp0LCAqdDE7CisKKwlkb3duX3dyaXRlKCZpb2N0bDMyX3NlbSk7CisKKwl0ID0gaW9jdGwzMl9oYXNoX3RhYmxlW2hhc2hdOworCWlmICghdCkgeyAKKwkJdXBfd3JpdGUoJmlvY3RsMzJfc2VtKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSAKKworCWlmICh0LT5jbWQgPT0gY21kKSB7IAorCQlpZiAoYnVpbHRpbl9pb2N0bCh0KSkgeworCQkJcHJpbnRrKCIlcCB0cmllZCB0byB1bnJlZ2lzdGVyIGJ1aWx0aW4gaW9jdGwgJXhcbiIsCisJCQkgICAgICAgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApLCBjbWQpOworCQl9IGVsc2UgeyAKKwkJCWlvY3RsMzJfaGFzaF90YWJsZVtoYXNoXSA9IHQtPm5leHQ7CisJCQl1cF93cml0ZSgmaW9jdGwzMl9zZW0pOworCQkJa2ZyZWUodCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gCisJd2hpbGUgKHQtPm5leHQpIHsKKwkJdDEgPSB0LT5uZXh0OworCQlpZiAodDEtPmNtZCA9PSBjbWQpIHsgCisJCQlpZiAoYnVpbHRpbl9pb2N0bCh0MSkpIHsKKwkJCQlwcmludGsoIiVwIHRyaWVkIHRvIHVucmVnaXN0ZXIgYnVpbHRpbiAiCisJCQkJCSJpb2N0bCAleFxuIiwKKwkJCQkJX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApLCBjbWQpOworCQkJCWdvdG8gb3V0OworCQkJfSBlbHNlIHsgCisJCQkJdC0+bmV4dCA9IHQxLT5uZXh0OworCQkJCXVwX3dyaXRlKCZpb2N0bDMyX3NlbSk7CisJCQkJa2ZyZWUodDEpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJCXQgPSB0MTsKKwl9CisJcHJpbnRrKEtFUk5fRVJSICJUcnlpbmcgdG8gZnJlZSB1bmtub3duIDMyYml0IGlvY3RsIGhhbmRsZXIgJXhcbiIsCisJCQkJY21kKTsKK291dDoKKwl1cF93cml0ZSgmaW9jdGwzMl9zZW0pOworCXJldHVybiAtRUlOVkFMOworfQorRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX2lvY3RsMzJfY29udmVyc2lvbik7IAorCitzdGF0aWMgdm9pZCBjb21wYXRfaW9jdGxfZXJyb3Ioc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBmZCwKKwkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJY2hhciBidWZbMTBdOworCWNoYXIgKmZuID0gIj8iOworCWNoYXIgKnBhdGg7CisKKwkvKiBmaW5kIHRoZSBuYW1lIG9mIHRoZSBkZXZpY2UuICovCisJcGF0aCA9IChjaGFyICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCWlmIChwYXRoKSB7CisJCWZuID0gZF9wYXRoKGZpbHAtPmZfZGVudHJ5LCBmaWxwLT5mX3Zmc21udCwgcGF0aCwgUEFHRV9TSVpFKTsKKwkJaWYgKElTX0VSUihmbikpCisJCQlmbiA9ICI/IjsKKwl9CisKKwlzcHJpbnRmKGJ1ZiwiJyVjJyIsIChjbWQ+PjI0KSAmIDB4M2YpOworCWlmICghaXNwcmludChidWZbMV0pKQorCQlzcHJpbnRmKGJ1ZiwgIiUwMngiLCBidWZbMV0pOworCXByaW50aygiaW9jdGwzMiglczolZCk6IFVua25vd24gY21kIGZkKCVkKSAiCisJCQkiY21kKCUwOHgpeyVzfSBhcmcoJTA4eCkgb24gJXNcbiIsCisJCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsCisJCQkoaW50KWZkLCAodW5zaWduZWQgaW50KWNtZCwgYnVmLAorCQkJKHVuc2lnbmVkIGludClhcmcsIGZuKTsKKworCWlmIChwYXRoKQorCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGF0aCk7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2lvY3RsKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlscDsKKwlpbnQgZXJyb3IgPSAtRUJBREY7CisJc3RydWN0IGlvY3RsX3RyYW5zICp0OworCWludCBmcHV0X25lZWRlZDsKKworCWZpbHAgPSBmZ2V0X2xpZ2h0KGZkLCAmZnB1dF9uZWVkZWQpOworCWlmICghZmlscCkKKwkJZ290byBvdXQ7CisKKwkvKiBSRUQtUEVOIGhvdyBzaG91bGQgTFNNIG1vZHVsZSBrbm93IGl0J3MgaGFuZGxpbmcgMzJiaXQ/ICovCisJZXJyb3IgPSBzZWN1cml0eV9maWxlX2lvY3RsKGZpbHAsIGNtZCwgYXJnKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0X2ZwdXQ7CisKKwkvKgorCSAqIFRvIGFsbG93IHRoZSBjb21wYXRfaW9jdGwgaGFuZGxlcnMgdG8gYmUgc2VsZiBjb250YWluZWQKKwkgKiB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBjb21tb24gaW9jdGxzIGhlcmUgZmlyc3QuCisJICogSnVzdCBoYW5kbGUgdGhlbSB3aXRoIHRoZSBzdGFuZGFyZCBoYW5kbGVycyBiZWxvdy4KKwkgKi8KKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgRklPQ0xFWDoKKwljYXNlIEZJT05DTEVYOgorCWNhc2UgRklPTkJJTzoKKwljYXNlIEZJT0FTWU5DOgorCWNhc2UgRklPUVNJWkU6CisJCWJyZWFrOworCisJY2FzZSBGSUJNQVA6CisJY2FzZSBGSUdFVEJTWjoKKwljYXNlIEZJT05SRUFEOgorCQlpZiAoU19JU1JFRyhmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSkKKwkJCWJyZWFrOworCQkvKkZBTEwgVEhST1VHSCovCisKKwlkZWZhdWx0OgorCQlpZiAoZmlscC0+Zl9vcCAmJiBmaWxwLT5mX29wLT5jb21wYXRfaW9jdGwpIHsKKwkJCWVycm9yID0gZmlscC0+Zl9vcC0+Y29tcGF0X2lvY3RsKGZpbHAsIGNtZCwgYXJnKTsKKwkJCWlmIChlcnJvciAhPSAtRU5PSU9DVExDTUQpCisJCQkJZ290byBvdXRfZnB1dDsKKwkJfQorCisJCWlmICghZmlscC0+Zl9vcCB8fAorCQkgICAgKCFmaWxwLT5mX29wLT5pb2N0bCAmJiAhZmlscC0+Zl9vcC0+dW5sb2NrZWRfaW9jdGwpKQorCQkJZ290byBkb19pb2N0bDsKKwkJYnJlYWs7CisJfQorCisJLyogV2hlbiByZWdpc3Rlcl9pb2N0bDMyX2NvbnZlcnNpb24gaXMgZmluYWxseSBnb25lIHJlbW92ZQorCSAgIHRoaXMgbG9jayEgLUFLICovCisJZG93bl9yZWFkKCZpb2N0bDMyX3NlbSk7CisJZm9yICh0ID0gaW9jdGwzMl9oYXNoX3RhYmxlW2lvY3RsMzJfaGFzaChjbWQpXTsgdDsgdCA9IHQtPm5leHQpIHsKKwkJaWYgKHQtPmNtZCA9PSBjbWQpCisJCQlnb3RvIGZvdW5kX2hhbmRsZXI7CisJfQorCXVwX3JlYWQoJmlvY3RsMzJfc2VtKTsKKworCWlmIChTX0lTU09DSyhmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSAmJgorCSAgICBjbWQgPj0gU0lPQ0RFVlBSSVZBVEUgJiYgY21kIDw9IChTSU9DREVWUFJJVkFURSArIDE1KSkgeworCQllcnJvciA9IHNpb2NkZXZwcml2YXRlX2lvY3RsKGZkLCBjbWQsIGFyZyk7CisJfSBlbHNlIHsKKwkJc3RhdGljIGludCBjb3VudDsKKworCQlpZiAoKytjb3VudCA8PSA1MCkKKwkJCWNvbXBhdF9pb2N0bF9lcnJvcihmaWxwLCBmZCwgY21kLCBhcmcpOworCQllcnJvciA9IC1FSU5WQUw7CisJfQorCisJZ290byBvdXRfZnB1dDsKKworIGZvdW5kX2hhbmRsZXI6CisJaWYgKHQtPmhhbmRsZXIpIHsKKwkJbG9ja19rZXJuZWwoKTsKKwkJZXJyb3IgPSB0LT5oYW5kbGVyKGZkLCBjbWQsIGFyZywgZmlscCk7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJdXBfcmVhZCgmaW9jdGwzMl9zZW0pOworCQlnb3RvIG91dF9mcHV0OworCX0KKworCXVwX3JlYWQoJmlvY3RsMzJfc2VtKTsKKyBkb19pb2N0bDoKKwllcnJvciA9IHZmc19pb2N0bChmaWxwLCBmZCwgY21kLCBhcmcpOworIG91dF9mcHV0OgorCWZwdXRfbGlnaHQoZmlscCwgZnB1dF9uZWVkZWQpOworIG91dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2NvbXBhdF9mbG9jayhzdHJ1Y3QgZmxvY2sgKmtmbCwgc3RydWN0IGNvbXBhdF9mbG9jayBfX3VzZXIgKnVmbCkKK3sKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgdWZsLCBzaXplb2YoKnVmbCkpIHx8CisJICAgIF9fZ2V0X3VzZXIoa2ZsLT5sX3R5cGUsICZ1ZmwtPmxfdHlwZSkgfHwKKwkgICAgX19nZXRfdXNlcihrZmwtPmxfd2hlbmNlLCAmdWZsLT5sX3doZW5jZSkgfHwKKwkgICAgX19nZXRfdXNlcihrZmwtPmxfc3RhcnQsICZ1ZmwtPmxfc3RhcnQpIHx8CisJICAgIF9fZ2V0X3VzZXIoa2ZsLT5sX2xlbiwgJnVmbC0+bF9sZW4pIHx8CisJICAgIF9fZ2V0X3VzZXIoa2ZsLT5sX3BpZCwgJnVmbC0+bF9waWQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwdXRfY29tcGF0X2Zsb2NrKHN0cnVjdCBmbG9jayAqa2ZsLCBzdHJ1Y3QgY29tcGF0X2Zsb2NrIF9fdXNlciAqdWZsKQoreworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdWZsLCBzaXplb2YoKnVmbCkpIHx8CisJICAgIF9fcHV0X3VzZXIoa2ZsLT5sX3R5cGUsICZ1ZmwtPmxfdHlwZSkgfHwKKwkgICAgX19wdXRfdXNlcihrZmwtPmxfd2hlbmNlLCAmdWZsLT5sX3doZW5jZSkgfHwKKwkgICAgX19wdXRfdXNlcihrZmwtPmxfc3RhcnQsICZ1ZmwtPmxfc3RhcnQpIHx8CisJICAgIF9fcHV0X3VzZXIoa2ZsLT5sX2xlbiwgJnVmbC0+bF9sZW4pIHx8CisJICAgIF9fcHV0X3VzZXIoa2ZsLT5sX3BpZCwgJnVmbC0+bF9waWQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworI2lmbmRlZiBIQVZFX0FSQ0hfR0VUX0NPTVBBVF9GTE9DSzY0CitzdGF0aWMgaW50IGdldF9jb21wYXRfZmxvY2s2NChzdHJ1Y3QgZmxvY2sgKmtmbCwgc3RydWN0IGNvbXBhdF9mbG9jazY0IF9fdXNlciAqdWZsKQoreworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB1ZmwsIHNpemVvZigqdWZsKSkgfHwKKwkgICAgX19nZXRfdXNlcihrZmwtPmxfdHlwZSwgJnVmbC0+bF90eXBlKSB8fAorCSAgICBfX2dldF91c2VyKGtmbC0+bF93aGVuY2UsICZ1ZmwtPmxfd2hlbmNlKSB8fAorCSAgICBfX2dldF91c2VyKGtmbC0+bF9zdGFydCwgJnVmbC0+bF9zdGFydCkgfHwKKwkgICAgX19nZXRfdXNlcihrZmwtPmxfbGVuLCAmdWZsLT5sX2xlbikgfHwKKwkgICAgX19nZXRfdXNlcihrZmwtPmxfcGlkLCAmdWZsLT5sX3BpZCkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9BUkNIX1BVVF9DT01QQVRfRkxPQ0s2NAorc3RhdGljIGludCBwdXRfY29tcGF0X2Zsb2NrNjQoc3RydWN0IGZsb2NrICprZmwsIHN0cnVjdCBjb21wYXRfZmxvY2s2NCBfX3VzZXIgKnVmbCkKK3sKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHVmbCwgc2l6ZW9mKCp1ZmwpKSB8fAorCSAgICBfX3B1dF91c2VyKGtmbC0+bF90eXBlLCAmdWZsLT5sX3R5cGUpIHx8CisJICAgIF9fcHV0X3VzZXIoa2ZsLT5sX3doZW5jZSwgJnVmbC0+bF93aGVuY2UpIHx8CisJICAgIF9fcHV0X3VzZXIoa2ZsLT5sX3N0YXJ0LCAmdWZsLT5sX3N0YXJ0KSB8fAorCSAgICBfX3B1dF91c2VyKGtmbC0+bF9sZW4sICZ1ZmwtPmxfbGVuKSB8fAorCSAgICBfX3B1dF91c2VyKGtmbC0+bF9waWQsICZ1ZmwtPmxfcGlkKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfZmNudGw2NCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsCisJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCW1tX3NlZ21lbnRfdCBvbGRfZnM7CisJc3RydWN0IGZsb2NrIGY7CisJbG9uZyByZXQ7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgRl9HRVRMSzoKKwljYXNlIEZfU0VUTEs6CisJY2FzZSBGX1NFVExLVzoKKwkJcmV0ID0gZ2V0X2NvbXBhdF9mbG9jaygmZiwgY29tcGF0X3B0cihhcmcpKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJYnJlYWs7CisJCW9sZF9mcyA9IGdldF9mcygpOworCQlzZXRfZnMoS0VSTkVMX0RTKTsKKwkJcmV0ID0gc3lzX2ZjbnRsKGZkLCBjbWQsICh1bnNpZ25lZCBsb25nKSZmKTsKKwkJc2V0X2ZzKG9sZF9mcyk7CisJCWlmIChjbWQgPT0gRl9HRVRMSyAmJiByZXQgPT0gMCkgeworCQkJaWYgKChmLmxfc3RhcnQgPj0gQ09NUEFUX09GRl9UX01BWCkgfHwKKwkJCSAgICAoKGYubF9zdGFydCArIGYubF9sZW4pID4gQ09NUEFUX09GRl9UX01BWCkpCisJCQkJcmV0ID0gLUVPVkVSRkxPVzsKKwkJCWlmIChyZXQgPT0gMCkKKwkJCQlyZXQgPSBwdXRfY29tcGF0X2Zsb2NrKCZmLCBjb21wYXRfcHRyKGFyZykpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBGX0dFVExLNjQ6CisJY2FzZSBGX1NFVExLNjQ6CisJY2FzZSBGX1NFVExLVzY0OgorCQlyZXQgPSBnZXRfY29tcGF0X2Zsb2NrNjQoJmYsIGNvbXBhdF9wdHIoYXJnKSk7CisJCWlmIChyZXQgIT0gMCkKKwkJCWJyZWFrOworCQlvbGRfZnMgPSBnZXRfZnMoKTsKKwkJc2V0X2ZzKEtFUk5FTF9EUyk7CisJCXJldCA9IHN5c19mY250bChmZCwgKGNtZCA9PSBGX0dFVExLNjQpID8gRl9HRVRMSyA6CisJCQkJKChjbWQgPT0gRl9TRVRMSzY0KSA/IEZfU0VUTEsgOiBGX1NFVExLVyksCisJCQkJKHVuc2lnbmVkIGxvbmcpJmYpOworCQlzZXRfZnMob2xkX2ZzKTsKKwkJaWYgKGNtZCA9PSBGX0dFVExLNjQgJiYgcmV0ID09IDApIHsKKwkJCWlmICgoZi5sX3N0YXJ0ID49IENPTVBBVF9MT0ZGX1RfTUFYKSB8fAorCQkJICAgICgoZi5sX3N0YXJ0ICsgZi5sX2xlbikgPiBDT01QQVRfTE9GRl9UX01BWCkpCisJCQkJcmV0ID0gLUVPVkVSRkxPVzsKKwkJCWlmIChyZXQgPT0gMCkKKwkJCQlyZXQgPSBwdXRfY29tcGF0X2Zsb2NrNjQoJmYsIGNvbXBhdF9wdHIoYXJnKSk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXQgPSBzeXNfZmNudGwoZmQsIGNtZCwgYXJnKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBjb21wYXRfc3lzX2ZjbnRsKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwKKwkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaWYgKChjbWQgPT0gRl9HRVRMSzY0KSB8fCAoY21kID09IEZfU0VUTEs2NCkgfHwgKGNtZCA9PSBGX1NFVExLVzY0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIGNvbXBhdF9zeXNfZmNudGw2NChmZCwgY21kLCBhcmcpOworfQorCithc21saW5rYWdlIGxvbmcKK2NvbXBhdF9zeXNfaW9fc2V0dXAodW5zaWduZWQgbnJfcmVxcywgdTMyIF9fdXNlciAqY3R4MzJwKQoreworCWxvbmcgcmV0OworCWFpb19jb250ZXh0X3QgY3R4NjQ7CisKKwltbV9zZWdtZW50X3Qgb2xkZnMgPSBnZXRfZnMoKTsKKwlpZiAodW5saWtlbHkoZ2V0X3VzZXIoY3R4NjQsIGN0eDMycCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXNldF9mcyhLRVJORUxfRFMpOworCS8qIFRoZSBfX3VzZXIgcG9pbnRlciBjYXN0IGlzIHZhbGlkIGJlY2F1c2Ugb2YgdGhlIHNldF9mcygpICovCisJcmV0ID0gc3lzX2lvX3NldHVwKG5yX3JlcXMsIChhaW9fY29udGV4dF90IF9fdXNlciAqKSAmY3R4NjQpOworCXNldF9mcyhvbGRmcyk7CisJLyogdHJ1bmNhdGluZyBpcyBvayBiZWNhdXNlIGl0J3MgYSB1c2VyIGFkZHJlc3MgKi8KKwlpZiAoIXJldCkKKwkJcmV0ID0gcHV0X3VzZXIoKHUzMikgY3R4NjQsIGN0eDMycCk7CisJcmV0dXJuIHJldDsKK30KKworYXNtbGlua2FnZSBsb25nCitjb21wYXRfc3lzX2lvX2dldGV2ZW50cyhhaW9fY29udGV4dF90IGN0eF9pZCwKKwkJCQkgdW5zaWduZWQgbG9uZyBtaW5fbnIsCisJCQkJIHVuc2lnbmVkIGxvbmcgbnIsCisJCQkJIHN0cnVjdCBpb19ldmVudCBfX3VzZXIgKmV2ZW50cywKKwkJCQkgc3RydWN0IGNvbXBhdF90aW1lc3BlYyBfX3VzZXIgKnRpbWVvdXQpCit7CisJbG9uZyByZXQ7CisJc3RydWN0IHRpbWVzcGVjIHQ7CisJc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqdXQgPSBOVUxMOworCisJcmV0ID0gLUVGQVVMVDsKKwlpZiAodW5saWtlbHkoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGV2ZW50cywgCisJCQkJbnIgKiBzaXplb2Yoc3RydWN0IGlvX2V2ZW50KSkpKQorCQlnb3RvIG91dDsKKwlpZiAodGltZW91dCkgeworCQlpZiAoZ2V0X2NvbXBhdF90aW1lc3BlYygmdCwgdGltZW91dCkpCisJCQlnb3RvIG91dDsKKworCQl1dCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqdXQpKTsKKwkJaWYgKGNvcHlfdG9fdXNlcih1dCwgJnQsIHNpemVvZih0KSkgKQorCQkJZ290byBvdXQ7CisJfSAKKwlyZXQgPSBzeXNfaW9fZ2V0ZXZlbnRzKGN0eF9pZCwgbWluX25yLCBuciwgZXZlbnRzLCB1dCk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBsb25nCitjb3B5X2lvY2IobG9uZyBuciwgdTMyIF9fdXNlciAqcHRyMzIsIHN0cnVjdCBpb2NiIF9fdXNlciAqIF9fdXNlciAqcHRyNjQpCit7CisJY29tcGF0X3VwdHJfdCB1cHRyOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5yOyArK2kpIHsKKwkJaWYgKGdldF91c2VyKHVwdHIsIHB0cjMyICsgaSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHB1dF91c2VyKGNvbXBhdF9wdHIodXB0ciksIHB0cjY0ICsgaSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTUFYX0FJT19TVUJNSVRTIAkoUEFHRV9TSVpFL3NpemVvZihzdHJ1Y3QgaW9jYiAqKSkKKworYXNtbGlua2FnZSBsb25nCitjb21wYXRfc3lzX2lvX3N1Ym1pdChhaW9fY29udGV4dF90IGN0eF9pZCwgaW50IG5yLCB1MzIgX191c2VyICppb2NiKQoreworCXN0cnVjdCBpb2NiIF9fdXNlciAqIF9fdXNlciAqaW9jYjY0OyAKKwlsb25nIHJldDsKKworCWlmICh1bmxpa2VseShuciA8IDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChuciA+IE1BWF9BSU9fU1VCTUlUUykKKwkJbnIgPSBNQVhfQUlPX1NVQk1JVFM7CisJCisJaW9jYjY0ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2UobnIgKiBzaXplb2YoKmlvY2I2NCkpOworCXJldCA9IGNvcHlfaW9jYihuciwgaW9jYiwgaW9jYjY0KTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gc3lzX2lvX3N1Ym1pdChjdHhfaWQsIG5yLCBpb2NiNjQpOworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBjb21wYXRfbmNwX21vdW50X2RhdGEgeworCWNvbXBhdF9pbnRfdCB2ZXJzaW9uOworCWNvbXBhdF91aW50X3QgbmNwX2ZkOworCWNvbXBhdF91aWRfdCBtb3VudGVkX3VpZDsKKwljb21wYXRfcGlkX3Qgd2RvZ19waWQ7CisJdW5zaWduZWQgY2hhciBtb3VudGVkX3ZvbFtOQ1BfVk9MTkFNRV9MRU4gKyAxXTsKKwljb21wYXRfdWludF90IHRpbWVfb3V0OworCWNvbXBhdF91aW50X3QgcmV0cnlfY291bnQ7CisJY29tcGF0X3VpbnRfdCBmbGFnczsKKwljb21wYXRfdWlkX3QgdWlkOworCWNvbXBhdF9naWRfdCBnaWQ7CisJY29tcGF0X21vZGVfdCBmaWxlX21vZGU7CisJY29tcGF0X21vZGVfdCBkaXJfbW9kZTsKK307CisKK3N0cnVjdCBjb21wYXRfbmNwX21vdW50X2RhdGFfdjQgeworCWNvbXBhdF9pbnRfdCB2ZXJzaW9uOworCWNvbXBhdF91bG9uZ190IGZsYWdzOworCWNvbXBhdF91bG9uZ190IG1vdW50ZWRfdWlkOworCWNvbXBhdF9sb25nX3Qgd2RvZ19waWQ7CisJY29tcGF0X3VpbnRfdCBuY3BfZmQ7CisJY29tcGF0X3VpbnRfdCB0aW1lX291dDsKKwljb21wYXRfdWludF90IHJldHJ5X2NvdW50OworCWNvbXBhdF91bG9uZ190IHVpZDsKKwljb21wYXRfdWxvbmdfdCBnaWQ7CisJY29tcGF0X3Vsb25nX3QgZmlsZV9tb2RlOworCWNvbXBhdF91bG9uZ190IGRpcl9tb2RlOworfTsKKworc3RhdGljIHZvaWQgKmRvX25jcF9zdXBlcl9kYXRhX2NvbnYodm9pZCAqcmF3X2RhdGEpCit7CisJaW50IHZlcnNpb24gPSAqKHVuc2lnbmVkIGludCAqKXJhd19kYXRhOworCisJaWYgKHZlcnNpb24gPT0gMykgeworCQlzdHJ1Y3QgY29tcGF0X25jcF9tb3VudF9kYXRhICpjX24gPSByYXdfZGF0YTsKKwkJc3RydWN0IG5jcF9tb3VudF9kYXRhICpuID0gcmF3X2RhdGE7CisKKwkJbi0+ZGlyX21vZGUgPSBjX24tPmRpcl9tb2RlOworCQluLT5maWxlX21vZGUgPSBjX24tPmZpbGVfbW9kZTsKKwkJbi0+Z2lkID0gY19uLT5naWQ7CisJCW4tPnVpZCA9IGNfbi0+dWlkOworCQltZW1tb3ZlIChuLT5tb3VudGVkX3ZvbCwgY19uLT5tb3VudGVkX3ZvbCwgKHNpemVvZiAoY19uLT5tb3VudGVkX3ZvbCkgKyAzICogc2l6ZW9mICh1bnNpZ25lZCBpbnQpKSk7CisJCW4tPndkb2dfcGlkID0gY19uLT53ZG9nX3BpZDsKKwkJbi0+bW91bnRlZF91aWQgPSBjX24tPm1vdW50ZWRfdWlkOworCX0gZWxzZSBpZiAodmVyc2lvbiA9PSA0KSB7CisJCXN0cnVjdCBjb21wYXRfbmNwX21vdW50X2RhdGFfdjQgKmNfbiA9IHJhd19kYXRhOworCQlzdHJ1Y3QgbmNwX21vdW50X2RhdGFfdjQgKm4gPSByYXdfZGF0YTsKKworCQluLT5kaXJfbW9kZSA9IGNfbi0+ZGlyX21vZGU7CisJCW4tPmZpbGVfbW9kZSA9IGNfbi0+ZmlsZV9tb2RlOworCQluLT5naWQgPSBjX24tPmdpZDsKKwkJbi0+dWlkID0gY19uLT51aWQ7CisJCW4tPnJldHJ5X2NvdW50ID0gY19uLT5yZXRyeV9jb3VudDsKKwkJbi0+dGltZV9vdXQgPSBjX24tPnRpbWVfb3V0OworCQluLT5uY3BfZmQgPSBjX24tPm5jcF9mZDsKKwkJbi0+d2RvZ19waWQgPSBjX24tPndkb2dfcGlkOworCQluLT5tb3VudGVkX3VpZCA9IGNfbi0+bW91bnRlZF91aWQ7CisJCW4tPmZsYWdzID0gY19uLT5mbGFnczsKKwl9IGVsc2UgaWYgKHZlcnNpb24gIT0gNSkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gcmF3X2RhdGE7Cit9CisKK3N0cnVjdCBjb21wYXRfc21iX21vdW50X2RhdGEgeworCWNvbXBhdF9pbnRfdCB2ZXJzaW9uOworCWNvbXBhdF91aWRfdCBtb3VudGVkX3VpZDsKKwljb21wYXRfdWlkX3QgdWlkOworCWNvbXBhdF9naWRfdCBnaWQ7CisJY29tcGF0X21vZGVfdCBmaWxlX21vZGU7CisJY29tcGF0X21vZGVfdCBkaXJfbW9kZTsKK307CisKK3N0YXRpYyB2b2lkICpkb19zbWJfc3VwZXJfZGF0YV9jb252KHZvaWQgKnJhd19kYXRhKQoreworCXN0cnVjdCBzbWJfbW91bnRfZGF0YSAqcyA9IHJhd19kYXRhOworCXN0cnVjdCBjb21wYXRfc21iX21vdW50X2RhdGEgKmNfcyA9IHJhd19kYXRhOworCisJaWYgKGNfcy0+dmVyc2lvbiAhPSBTTUJfTU9VTlRfT0xEVkVSU0lPTikKKwkJZ290byBvdXQ7CisJcy0+ZGlyX21vZGUgPSBjX3MtPmRpcl9tb2RlOworCXMtPmZpbGVfbW9kZSA9IGNfcy0+ZmlsZV9tb2RlOworCXMtPmdpZCA9IGNfcy0+Z2lkOworCXMtPnVpZCA9IGNfcy0+dWlkOworCXMtPm1vdW50ZWRfdWlkID0gY19zLT5tb3VudGVkX3VpZDsKKyBvdXQ6CisJcmV0dXJuIHJhd19kYXRhOworfQorCitleHRlcm4gaW50IGNvcHlfbW91bnRfb3B0aW9ucyAoY29uc3Qgdm9pZCBfX3VzZXIgKiwgdW5zaWduZWQgbG9uZyAqKTsKKworI2RlZmluZSBTTUJGU19OQU1FICAgICAgInNtYmZzIgorI2RlZmluZSBOQ1BGU19OQU1FICAgICAgIm5jcGZzIgorCithc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19tb3VudChjaGFyIF9fdXNlciAqIGRldl9uYW1lLCBjaGFyIF9fdXNlciAqIGRpcl9uYW1lLAorCQkJCSBjaGFyIF9fdXNlciAqIHR5cGUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJCQkJIHZvaWQgX191c2VyICogZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIHR5cGVfcGFnZTsKKwl1bnNpZ25lZCBsb25nIGRhdGFfcGFnZTsKKwl1bnNpZ25lZCBsb25nIGRldl9wYWdlOworCWNoYXIgKmRpcl9wYWdlOworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBjb3B5X21vdW50X29wdGlvbnMgKHR5cGUsICZ0eXBlX3BhZ2UpOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIG91dDsKKworCWRpcl9wYWdlID0gZ2V0bmFtZShkaXJfbmFtZSk7CisJcmV0dmFsID0gUFRSX0VSUihkaXJfcGFnZSk7CisJaWYgKElTX0VSUihkaXJfcGFnZSkpCisJCWdvdG8gb3V0MTsKKworCXJldHZhbCA9IGNvcHlfbW91bnRfb3B0aW9ucyAoZGV2X25hbWUsICZkZXZfcGFnZSk7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gb3V0MjsKKworCXJldHZhbCA9IGNvcHlfbW91bnRfb3B0aW9ucyAoZGF0YSwgJmRhdGFfcGFnZSk7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gb3V0MzsKKworCXJldHZhbCA9IC1FSU5WQUw7CisKKwlpZiAodHlwZV9wYWdlKSB7CisJCWlmICghc3RyY21wKChjaGFyICopdHlwZV9wYWdlLCBTTUJGU19OQU1FKSkgeworCQkJZG9fc21iX3N1cGVyX2RhdGFfY29udigodm9pZCAqKWRhdGFfcGFnZSk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCgoY2hhciAqKXR5cGVfcGFnZSwgTkNQRlNfTkFNRSkpIHsKKwkJCWRvX25jcF9zdXBlcl9kYXRhX2NvbnYoKHZvaWQgKilkYXRhX3BhZ2UpOworCQl9CisJfQorCisJbG9ja19rZXJuZWwoKTsKKwlyZXR2YWwgPSBkb19tb3VudCgoY2hhciopZGV2X3BhZ2UsIGRpcl9wYWdlLCAoY2hhciopdHlwZV9wYWdlLAorCQkJZmxhZ3MsICh2b2lkKilkYXRhX3BhZ2UpOworCXVubG9ja19rZXJuZWwoKTsKKworCWZyZWVfcGFnZShkYXRhX3BhZ2UpOworIG91dDM6CisJZnJlZV9wYWdlKGRldl9wYWdlKTsKKyBvdXQyOgorCXB1dG5hbWUoZGlyX3BhZ2UpOworIG91dDE6CisJZnJlZV9wYWdlKHR5cGVfcGFnZSk7Cisgb3V0OgorCXJldHVybiByZXR2YWw7Cit9CisKKyNkZWZpbmUgTkFNRV9PRkZTRVQoZGUpICgoaW50KSAoKGRlKS0+ZF9uYW1lIC0gKGNoYXIgX191c2VyICopIChkZSkpKQorI2RlZmluZSBDT01QQVRfUk9VTkRfVVAoeCkgKCgoeCkrc2l6ZW9mKGNvbXBhdF9sb25nX3QpLTEpICYgXAorCQkJCX4oc2l6ZW9mKGNvbXBhdF9sb25nX3QpLTEpKQorCitzdHJ1Y3QgY29tcGF0X29sZF9saW51eF9kaXJlbnQgeworCWNvbXBhdF91bG9uZ190CWRfaW5vOworCWNvbXBhdF91bG9uZ190CWRfb2Zmc2V0OworCXVuc2lnbmVkIHNob3J0CWRfbmFtbGVuOworCWNoYXIJCWRfbmFtZVsxXTsKK307CisKK3N0cnVjdCBjb21wYXRfcmVhZGRpcl9jYWxsYmFjayB7CisJc3RydWN0IGNvbXBhdF9vbGRfbGludXhfZGlyZW50IF9fdXNlciAqZGlyZW50OworCWludCByZXN1bHQ7Cit9OworCitzdGF0aWMgaW50IGNvbXBhdF9maWxsb25lZGlyKHZvaWQgKl9fYnVmLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtbGVuLAorCQkJbG9mZl90IG9mZnNldCwgaW5vX3QgaW5vLCB1bnNpZ25lZCBpbnQgZF90eXBlKQoreworCXN0cnVjdCBjb21wYXRfcmVhZGRpcl9jYWxsYmFjayAqYnVmID0gX19idWY7CisJc3RydWN0IGNvbXBhdF9vbGRfbGludXhfZGlyZW50IF9fdXNlciAqZGlyZW50OworCisJaWYgKGJ1Zi0+cmVzdWx0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlidWYtPnJlc3VsdCsrOworCWRpcmVudCA9IGJ1Zi0+ZGlyZW50OworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZGlyZW50LAorCQkJKHVuc2lnbmVkIGxvbmcpKGRpcmVudC0+ZF9uYW1lICsgbmFtbGVuICsgMSkgLQorCQkJCSh1bnNpZ25lZCBsb25nKWRpcmVudCkpCisJCWdvdG8gZWZhdWx0OworCWlmICgJX19wdXRfdXNlcihpbm8sICZkaXJlbnQtPmRfaW5vKSB8fAorCQlfX3B1dF91c2VyKG9mZnNldCwgJmRpcmVudC0+ZF9vZmZzZXQpIHx8CisJCV9fcHV0X3VzZXIobmFtbGVuLCAmZGlyZW50LT5kX25hbWxlbikgfHwKKwkJX19jb3B5X3RvX3VzZXIoZGlyZW50LT5kX25hbWUsIG5hbWUsIG5hbWxlbikgfHwKKwkJX19wdXRfdXNlcigwLCBkaXJlbnQtPmRfbmFtZSArIG5hbWxlbikpCisJCWdvdG8gZWZhdWx0OworCXJldHVybiAwOworZWZhdWx0OgorCWJ1Zi0+cmVzdWx0ID0gLUVGQVVMVDsKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfb2xkX3JlYWRkaXIodW5zaWduZWQgaW50IGZkLAorCXN0cnVjdCBjb21wYXRfb2xkX2xpbnV4X2RpcmVudCBfX3VzZXIgKmRpcmVudCwgdW5zaWduZWQgaW50IGNvdW50KQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlzdHJ1Y3QgY29tcGF0X3JlYWRkaXJfY2FsbGJhY2sgYnVmOworCisJZXJyb3IgPSAtRUJBREY7CisJZmlsZSA9IGZnZXQoZmQpOworCWlmICghZmlsZSkKKwkJZ290byBvdXQ7CisKKwlidWYucmVzdWx0ID0gMDsKKwlidWYuZGlyZW50ID0gZGlyZW50OworCisJZXJyb3IgPSB2ZnNfcmVhZGRpcihmaWxlLCBjb21wYXRfZmlsbG9uZWRpciwgJmJ1Zik7CisJaWYgKGVycm9yID49IDApCisJCWVycm9yID0gYnVmLnJlc3VsdDsKKworCWZwdXQoZmlsZSk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitzdHJ1Y3QgY29tcGF0X2xpbnV4X2RpcmVudCB7CisJY29tcGF0X3Vsb25nX3QJZF9pbm87CisJY29tcGF0X3Vsb25nX3QJZF9vZmY7CisJdW5zaWduZWQgc2hvcnQJZF9yZWNsZW47CisJY2hhcgkJZF9uYW1lWzFdOworfTsKKworc3RydWN0IGNvbXBhdF9nZXRkZW50c19jYWxsYmFjayB7CisJc3RydWN0IGNvbXBhdF9saW51eF9kaXJlbnQgX191c2VyICpjdXJyZW50X2RpcjsKKwlzdHJ1Y3QgY29tcGF0X2xpbnV4X2RpcmVudCBfX3VzZXIgKnByZXZpb3VzOworCWludCBjb3VudDsKKwlpbnQgZXJyb3I7Cit9OworCitzdGF0aWMgaW50IGNvbXBhdF9maWxsZGlyKHZvaWQgKl9fYnVmLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtbGVuLAorCQlsb2ZmX3Qgb2Zmc2V0LCBpbm9fdCBpbm8sIHVuc2lnbmVkIGludCBkX3R5cGUpCit7CisJc3RydWN0IGNvbXBhdF9saW51eF9kaXJlbnQgX191c2VyICogZGlyZW50OworCXN0cnVjdCBjb21wYXRfZ2V0ZGVudHNfY2FsbGJhY2sgKmJ1ZiA9IF9fYnVmOworCWludCByZWNsZW4gPSBDT01QQVRfUk9VTkRfVVAoTkFNRV9PRkZTRVQoZGlyZW50KSArIG5hbWxlbiArIDIpOworCisJYnVmLT5lcnJvciA9IC1FSU5WQUw7CS8qIG9ubHkgdXNlZCBpZiB3ZSBmYWlsLi4gKi8KKwlpZiAocmVjbGVuID4gYnVmLT5jb3VudCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGlyZW50ID0gYnVmLT5wcmV2aW91czsKKwlpZiAoZGlyZW50KSB7CisJCWlmIChfX3B1dF91c2VyKG9mZnNldCwgJmRpcmVudC0+ZF9vZmYpKQorCQkJZ290byBlZmF1bHQ7CisJfQorCWRpcmVudCA9IGJ1Zi0+Y3VycmVudF9kaXI7CisJaWYgKF9fcHV0X3VzZXIoaW5vLCAmZGlyZW50LT5kX2lubykpCisJCWdvdG8gZWZhdWx0OworCWlmIChfX3B1dF91c2VyKHJlY2xlbiwgJmRpcmVudC0+ZF9yZWNsZW4pKQorCQlnb3RvIGVmYXVsdDsKKwlpZiAoY29weV90b191c2VyKGRpcmVudC0+ZF9uYW1lLCBuYW1lLCBuYW1sZW4pKQorCQlnb3RvIGVmYXVsdDsKKwlpZiAoX19wdXRfdXNlcigwLCBkaXJlbnQtPmRfbmFtZSArIG5hbWxlbikpCisJCWdvdG8gZWZhdWx0OworCWlmIChfX3B1dF91c2VyKGRfdHlwZSwgKGNoYXIgIF9fdXNlciAqKSBkaXJlbnQgKyByZWNsZW4gLSAxKSkKKwkJZ290byBlZmF1bHQ7CisJYnVmLT5wcmV2aW91cyA9IGRpcmVudDsKKwlkaXJlbnQgPSAodm9pZCBfX3VzZXIgKilkaXJlbnQgKyByZWNsZW47CisJYnVmLT5jdXJyZW50X2RpciA9IGRpcmVudDsKKwlidWYtPmNvdW50IC09IHJlY2xlbjsKKwlyZXR1cm4gMDsKK2VmYXVsdDoKKwlidWYtPmVycm9yID0gLUVGQVVMVDsKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfZ2V0ZGVudHModW5zaWduZWQgaW50IGZkLAorCQlzdHJ1Y3QgY29tcGF0X2xpbnV4X2RpcmVudCBfX3VzZXIgKmRpcmVudCwgdW5zaWduZWQgaW50IGNvdW50KQoreworCXN0cnVjdCBmaWxlICogZmlsZTsKKwlzdHJ1Y3QgY29tcGF0X2xpbnV4X2RpcmVudCBfX3VzZXIgKiBsYXN0ZGlyZW50OworCXN0cnVjdCBjb21wYXRfZ2V0ZGVudHNfY2FsbGJhY2sgYnVmOworCWludCBlcnJvcjsKKworCWVycm9yID0gLUVGQVVMVDsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGRpcmVudCwgY291bnQpKQorCQlnb3RvIG91dDsKKworCWVycm9yID0gLUVCQURGOworCWZpbGUgPSBmZ2V0KGZkKTsKKwlpZiAoIWZpbGUpCisJCWdvdG8gb3V0OworCisJYnVmLmN1cnJlbnRfZGlyID0gZGlyZW50OworCWJ1Zi5wcmV2aW91cyA9IE5VTEw7CisJYnVmLmNvdW50ID0gY291bnQ7CisJYnVmLmVycm9yID0gMDsKKworCWVycm9yID0gdmZzX3JlYWRkaXIoZmlsZSwgY29tcGF0X2ZpbGxkaXIsICZidWYpOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0X3B1dGY7CisJZXJyb3IgPSBidWYuZXJyb3I7CisJbGFzdGRpcmVudCA9IGJ1Zi5wcmV2aW91czsKKwlpZiAobGFzdGRpcmVudCkgeworCQlpZiAocHV0X3VzZXIoZmlsZS0+Zl9wb3MsICZsYXN0ZGlyZW50LT5kX29mZikpCisJCQllcnJvciA9IC1FRkFVTFQ7CisJCWVsc2UKKwkJCWVycm9yID0gY291bnQgLSBidWYuY291bnQ7CisJfQorCitvdXRfcHV0ZjoKKwlmcHV0KGZpbGUpOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworI2lmbmRlZiBfX0FSQ0hfT01JVF9DT01QQVRfU1lTX0dFVERFTlRTNjQKKyNkZWZpbmUgQ09NUEFUX1JPVU5EX1VQNjQoeCkgKCgoeCkrc2l6ZW9mKHU2NCktMSkgJiB+KHNpemVvZih1NjQpLTEpKQorCitzdHJ1Y3QgY29tcGF0X2dldGRlbnRzX2NhbGxiYWNrNjQgeworCXN0cnVjdCBsaW51eF9kaXJlbnQ2NCBfX3VzZXIgKmN1cnJlbnRfZGlyOworCXN0cnVjdCBsaW51eF9kaXJlbnQ2NCBfX3VzZXIgKnByZXZpb3VzOworCWludCBjb3VudDsKKwlpbnQgZXJyb3I7Cit9OworCitzdGF0aWMgaW50IGNvbXBhdF9maWxsZGlyNjQodm9pZCAqIF9fYnVmLCBjb25zdCBjaGFyICogbmFtZSwgaW50IG5hbWxlbiwgbG9mZl90IG9mZnNldCwKKwkJICAgICBpbm9fdCBpbm8sIHVuc2lnbmVkIGludCBkX3R5cGUpCit7CisJc3RydWN0IGxpbnV4X2RpcmVudDY0IF9fdXNlciAqZGlyZW50OworCXN0cnVjdCBjb21wYXRfZ2V0ZGVudHNfY2FsbGJhY2s2NCAqYnVmID0gX19idWY7CisJaW50IGpqID0gTkFNRV9PRkZTRVQoZGlyZW50KTsKKwlpbnQgcmVjbGVuID0gQ09NUEFUX1JPVU5EX1VQNjQoamogKyBuYW1sZW4gKyAxKTsKKwl1NjQgb2ZmOworCisJYnVmLT5lcnJvciA9IC1FSU5WQUw7CS8qIG9ubHkgdXNlZCBpZiB3ZSBmYWlsLi4gKi8KKwlpZiAocmVjbGVuID4gYnVmLT5jb3VudCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGlyZW50ID0gYnVmLT5wcmV2aW91czsKKworCWlmIChkaXJlbnQpIHsKKwkJaWYgKF9fcHV0X3VzZXJfdW5hbGlnbmVkKG9mZnNldCwgJmRpcmVudC0+ZF9vZmYpKQorCQkJZ290byBlZmF1bHQ7CisJfQorCWRpcmVudCA9IGJ1Zi0+Y3VycmVudF9kaXI7CisJaWYgKF9fcHV0X3VzZXJfdW5hbGlnbmVkKGlubywgJmRpcmVudC0+ZF9pbm8pKQorCQlnb3RvIGVmYXVsdDsKKwlvZmYgPSAwOworCWlmIChfX3B1dF91c2VyX3VuYWxpZ25lZChvZmYsICZkaXJlbnQtPmRfb2ZmKSkKKwkJZ290byBlZmF1bHQ7CisJaWYgKF9fcHV0X3VzZXIocmVjbGVuLCAmZGlyZW50LT5kX3JlY2xlbikpCisJCWdvdG8gZWZhdWx0OworCWlmIChfX3B1dF91c2VyKGRfdHlwZSwgJmRpcmVudC0+ZF90eXBlKSkKKwkJZ290byBlZmF1bHQ7CisJaWYgKGNvcHlfdG9fdXNlcihkaXJlbnQtPmRfbmFtZSwgbmFtZSwgbmFtbGVuKSkKKwkJZ290byBlZmF1bHQ7CisJaWYgKF9fcHV0X3VzZXIoMCwgZGlyZW50LT5kX25hbWUgKyBuYW1sZW4pKQorCQlnb3RvIGVmYXVsdDsKKwlidWYtPnByZXZpb3VzID0gZGlyZW50OworCWRpcmVudCA9ICh2b2lkIF9fdXNlciAqKWRpcmVudCArIHJlY2xlbjsKKwlidWYtPmN1cnJlbnRfZGlyID0gZGlyZW50OworCWJ1Zi0+Y291bnQgLT0gcmVjbGVuOworCXJldHVybiAwOworZWZhdWx0OgorCWJ1Zi0+ZXJyb3IgPSAtRUZBVUxUOworCXJldHVybiAtRUZBVUxUOworfQorCithc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19nZXRkZW50czY0KHVuc2lnbmVkIGludCBmZCwKKwkJc3RydWN0IGxpbnV4X2RpcmVudDY0IF9fdXNlciAqIGRpcmVudCwgdW5zaWduZWQgaW50IGNvdW50KQoreworCXN0cnVjdCBmaWxlICogZmlsZTsKKwlzdHJ1Y3QgbGludXhfZGlyZW50NjQgX191c2VyICogbGFzdGRpcmVudDsKKwlzdHJ1Y3QgY29tcGF0X2dldGRlbnRzX2NhbGxiYWNrNjQgYnVmOworCWludCBlcnJvcjsKKworCWVycm9yID0gLUVGQVVMVDsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGRpcmVudCwgY291bnQpKQorCQlnb3RvIG91dDsKKworCWVycm9yID0gLUVCQURGOworCWZpbGUgPSBmZ2V0KGZkKTsKKwlpZiAoIWZpbGUpCisJCWdvdG8gb3V0OworCisJYnVmLmN1cnJlbnRfZGlyID0gZGlyZW50OworCWJ1Zi5wcmV2aW91cyA9IE5VTEw7CisJYnVmLmNvdW50ID0gY291bnQ7CisJYnVmLmVycm9yID0gMDsKKworCWVycm9yID0gdmZzX3JlYWRkaXIoZmlsZSwgY29tcGF0X2ZpbGxkaXI2NCwgJmJ1Zik7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXRfcHV0ZjsKKwllcnJvciA9IGJ1Zi5lcnJvcjsKKwlsYXN0ZGlyZW50ID0gYnVmLnByZXZpb3VzOworCWlmIChsYXN0ZGlyZW50KSB7CisJCXR5cGVvZihsYXN0ZGlyZW50LT5kX29mZikgZF9vZmYgPSBmaWxlLT5mX3BvczsKKwkJX19wdXRfdXNlcl91bmFsaWduZWQoZF9vZmYsICZsYXN0ZGlyZW50LT5kX29mZik7CisJCWVycm9yID0gY291bnQgLSBidWYuY291bnQ7CisJfQorCitvdXRfcHV0ZjoKKwlmcHV0KGZpbGUpOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKyNlbmRpZiAvKiAhIF9fQVJDSF9PTUlUX0NPTVBBVF9TWVNfR0VUREVOVFM2NCAqLworCitzdGF0aWMgc3NpemVfdCBjb21wYXRfZG9fcmVhZHZfd3JpdGV2KGludCB0eXBlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgY29tcGF0X2lvdmVjIF9fdXNlciAqdXZlY3RvciwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGxvZmZfdCAqcG9zKQoreworCXR5cGVkZWYgc3NpemVfdCAoKmlvX2ZuX3QpKHN0cnVjdCBmaWxlICosIGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICopOworCXR5cGVkZWYgc3NpemVfdCAoKmlvdl9mbl90KShzdHJ1Y3QgZmlsZSAqLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKiwgdW5zaWduZWQgbG9uZywgbG9mZl90ICopOworCisJY29tcGF0X3NzaXplX3QgdG90X2xlbjsKKwlzdHJ1Y3QgaW92ZWMgaW92c3RhY2tbVUlPX0ZBU1RJT1ZdOworCXN0cnVjdCBpb3ZlYyAqaW92PWlvdnN0YWNrLCAqdmVjdG9yOworCXNzaXplX3QgcmV0OworCWludCBzZWc7CisJaW9fZm5fdCBmbjsKKwlpb3ZfZm5fdCBmbnY7CisKKwkvKgorCSAqIFN1UyBzYXlzICJUaGUgcmVhZHYoKSBmdW5jdGlvbiAqbWF5KiBmYWlsIGlmIHRoZSBpb3ZjbnQgYXJndW1lbnQKKwkgKiB3YXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDAsIG9yIGdyZWF0ZXIgdGhhbiB7SU9WX01BWH0uICBMaW51eCBoYXMKKwkgKiB0cmFkaXRpb25hbGx5IHJldHVybmVkIHplcm8gZm9yIHplcm8gc2VnbWVudHMsIHNvLi4uCisJICovCisJcmV0ID0gMDsKKwlpZiAobnJfc2VncyA9PSAwKQorCQlnb3RvIG91dDsKKworCS8qCisJICogRmlyc3QgZ2V0IHRoZSAic3RydWN0IGlvdmVjIiBmcm9tIHVzZXIgbWVtb3J5IGFuZAorCSAqIHZlcmlmeSBhbGwgdGhlIHBvaW50ZXJzCisJICovCisJcmV0ID0gLUVJTlZBTDsKKwlpZiAoKG5yX3NlZ3MgPiBVSU9fTUFYSU9WKSB8fCAobnJfc2VncyA8PSAwKSkKKwkJZ290byBvdXQ7CisJaWYgKCFmaWxlLT5mX29wKQorCQlnb3RvIG91dDsKKwlpZiAobnJfc2VncyA+IFVJT19GQVNUSU9WKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWlvdiA9IGttYWxsb2MobnJfc2VncypzaXplb2Yoc3RydWN0IGlvdmVjKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghaW92KQorCQkJZ290byBvdXQ7CisJfQorCXJldCA9IC1FRkFVTFQ7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHV2ZWN0b3IsIG5yX3NlZ3Mqc2l6ZW9mKCp1dmVjdG9yKSkpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBTaW5nbGUgdW5peCBzcGVjaWZpY2F0aW9uOgorCSAqIFdlIHNob3VsZCAtRUlOVkFMIGlmIGFuIGVsZW1lbnQgbGVuZ3RoIGlzIG5vdCA+PSAwIGFuZCBmaXR0aW5nIGFuCisJICogc3NpemVfdC4gIFRoZSB0b3RhbCBsZW5ndGggaXMgZml0dGluZyBhbiBzc2l6ZV90CisJICoKKwkgKiBCZSBjYXJlZnVsIGhlcmUgYmVjYXVzZSBpb3ZfbGVuIGlzIGEgc2l6ZV90IG5vdCBhbiBzc2l6ZV90CisJICovCisJdG90X2xlbiA9IDA7CisJdmVjdG9yID0gaW92OworCXJldCA9IC1FSU5WQUw7CisJZm9yIChzZWcgPSAwIDsgc2VnIDwgbnJfc2Vnczsgc2VnKyspIHsKKwkJY29tcGF0X3NzaXplX3QgdG1wID0gdG90X2xlbjsKKwkJY29tcGF0X3NzaXplX3QgbGVuOworCQljb21wYXRfdXB0cl90IGJ1ZjsKKworCQlpZiAoX19nZXRfdXNlcihsZW4sICZ1dmVjdG9yLT5pb3ZfbGVuKSB8fAorCQkgICAgX19nZXRfdXNlcihidWYsICZ1dmVjdG9yLT5pb3ZfYmFzZSkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAobGVuIDwgMCkJLyogc2l6ZV90IG5vdCBmaXR0aW5nIGFuIGNvbXBhdF9zc2l6ZV90IC4uICovCisJCQlnb3RvIG91dDsKKwkJdG90X2xlbiArPSBsZW47CisJCWlmICh0b3RfbGVuIDwgdG1wKSAvKiBtYXRocyBvdmVyZmxvdyBvbiB0aGUgY29tcGF0X3NzaXplX3QgKi8KKwkJCWdvdG8gb3V0OworCQl2ZWN0b3ItPmlvdl9iYXNlID0gY29tcGF0X3B0cihidWYpOworCQl2ZWN0b3ItPmlvdl9sZW4gPSAoY29tcGF0X3NpemVfdCkgbGVuOworCQl1dmVjdG9yKys7CisJCXZlY3RvcisrOworCX0KKwlpZiAodG90X2xlbiA9PSAwKSB7CisJCXJldCA9IDA7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IHJ3X3ZlcmlmeV9hcmVhKHR5cGUsIGZpbGUsIHBvcywgdG90X2xlbik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlmbnYgPSBOVUxMOworCWlmICh0eXBlID09IFJFQUQpIHsKKwkJZm4gPSBmaWxlLT5mX29wLT5yZWFkOworCQlmbnYgPSBmaWxlLT5mX29wLT5yZWFkdjsKKwl9IGVsc2UgeworCQlmbiA9IChpb19mbl90KWZpbGUtPmZfb3AtPndyaXRlOworCQlmbnYgPSBmaWxlLT5mX29wLT53cml0ZXY7CisJfQorCWlmIChmbnYpIHsKKwkJcmV0ID0gZm52KGZpbGUsIGlvdiwgbnJfc2VncywgcG9zKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogRG8gaXQgYnkgaGFuZCwgd2l0aCBmaWxlLW9wcyAqLworCXJldCA9IDA7CisJdmVjdG9yID0gaW92OworCXdoaWxlIChucl9zZWdzID4gMCkgeworCQl2b2lkIF9fdXNlciAqIGJhc2U7CisJCXNpemVfdCBsZW47CisJCXNzaXplX3QgbnI7CisKKwkJYmFzZSA9IHZlY3Rvci0+aW92X2Jhc2U7CisJCWxlbiA9IHZlY3Rvci0+aW92X2xlbjsKKwkJdmVjdG9yKys7CisJCW5yX3NlZ3MtLTsKKworCQluciA9IGZuKGZpbGUsIGJhc2UsIGxlbiwgcG9zKTsKKworCQlpZiAobnIgPCAwKSB7CisJCQlpZiAoIXJldCkgcmV0ID0gbnI7CisJCQlicmVhazsKKwkJfQorCQlyZXQgKz0gbnI7CisJCWlmIChuciAhPSBsZW4pCisJCQlicmVhazsKKwl9CitvdXQ6CisJaWYgKGlvdiAhPSBpb3ZzdGFjaykKKwkJa2ZyZWUoaW92KTsKKwlpZiAoKHJldCArICh0eXBlID09IFJFQUQpKSA+IDApCisJCWRub3RpZnlfcGFyZW50KGZpbGUtPmZfZGVudHJ5LAorCQkJCSh0eXBlID09IFJFQUQpID8gRE5fQUNDRVNTIDogRE5fTU9ESUZZKTsKKwlyZXR1cm4gcmV0OworfQorCithc21saW5rYWdlIHNzaXplX3QKK2NvbXBhdF9zeXNfcmVhZHYodW5zaWduZWQgbG9uZyBmZCwgY29uc3Qgc3RydWN0IGNvbXBhdF9pb3ZlYyBfX3VzZXIgKnZlYywgdW5zaWduZWQgbG9uZyB2bGVuKQoreworCXN0cnVjdCBmaWxlICpmaWxlOworCXNzaXplX3QgcmV0ID0gLUVCQURGOworCisJZmlsZSA9IGZnZXQoZmQpOworCWlmICghZmlsZSkKKwkJcmV0dXJuIC1FQkFERjsKKworCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQlnb3RvIG91dDsKKworCXJldCA9IC1FSU5WQUw7CisJaWYgKCFmaWxlLT5mX29wIHx8ICghZmlsZS0+Zl9vcC0+cmVhZHYgJiYgIWZpbGUtPmZfb3AtPnJlYWQpKQorCQlnb3RvIG91dDsKKworCXJldCA9IGNvbXBhdF9kb19yZWFkdl93cml0ZXYoUkVBRCwgZmlsZSwgdmVjLCB2bGVuLCAmZmlsZS0+Zl9wb3MpOworCitvdXQ6CisJZnB1dChmaWxlKTsKKwlyZXR1cm4gcmV0OworfQorCithc21saW5rYWdlIHNzaXplX3QKK2NvbXBhdF9zeXNfd3JpdGV2KHVuc2lnbmVkIGxvbmcgZmQsIGNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICp2ZWMsIHVuc2lnbmVkIGxvbmcgdmxlbikKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlzc2l6ZV90IHJldCA9IC1FQkFERjsKKworCWZpbGUgPSBmZ2V0KGZkKTsKKwlpZiAoIWZpbGUpCisJCXJldHVybiAtRUJBREY7CisJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQlnb3RvIG91dDsKKworCXJldCA9IC1FSU5WQUw7CisJaWYgKCFmaWxlLT5mX29wIHx8ICghZmlsZS0+Zl9vcC0+d3JpdGV2ICYmICFmaWxlLT5mX29wLT53cml0ZSkpCisJCWdvdG8gb3V0OworCisJcmV0ID0gY29tcGF0X2RvX3JlYWR2X3dyaXRldihXUklURSwgZmlsZSwgdmVjLCB2bGVuLCAmZmlsZS0+Zl9wb3MpOworCitvdXQ6CisJZnB1dChmaWxlKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogY29tcGF0X2NvdW50KCkgY291bnRzIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzL2VudmVsb3Blcy4gSXQgaXMgYmFzaWNhbGx5CisgKiBhIGNvcHkgb2YgY291bnQoKSBmcm9tIGZzL2V4ZWMuYywgZXhjZXB0IHRoYXQgaXQgd29ya3Mgd2l0aCAzMiBiaXQgYXJndgorICogYW5kIGVudnAgcG9pbnRlcnMuCisgKi8KK3N0YXRpYyBpbnQgY29tcGF0X2NvdW50KGNvbXBhdF91cHRyX3QgX191c2VyICphcmd2LCBpbnQgbWF4KQoreworCWludCBpID0gMDsKKworCWlmIChhcmd2ICE9IE5VTEwpIHsKKwkJZm9yICg7OykgeworCQkJY29tcGF0X3VwdHJfdCBwOworCisJCQlpZiAoZ2V0X3VzZXIocCwgYXJndikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoIXApCisJCQkJYnJlYWs7CisJCQlhcmd2Kys7CisJCQlpZigrK2kgPiBtYXgpCisJCQkJcmV0dXJuIC1FMkJJRzsKKwkJfQorCX0KKwlyZXR1cm4gaTsKK30KKworLyoKKyAqIGNvbXBhdF9jb3B5X3N0cmluZ3MoKSBpcyBiYXNpY2FsbHkgYSBjb3B5IG9mIGNvcHlfc3RyaW5ncygpIGZyb20gZnMvZXhlYy5jCisgKiBleGNlcHQgdGhhdCBpdCB3b3JrcyB3aXRoIDMyIGJpdCBhcmd2IGFuZCBlbnZwIHBvaW50ZXJzLgorICovCitzdGF0aWMgaW50IGNvbXBhdF9jb3B5X3N0cmluZ3MoaW50IGFyZ2MsIGNvbXBhdF91cHRyX3QgX191c2VyICphcmd2LAorCQkJCXN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pCit7CisJc3RydWN0IHBhZ2UgKmttYXBwZWRfcGFnZSA9IE5VTEw7CisJY2hhciAqa2FkZHIgPSBOVUxMOworCWludCByZXQ7CisKKwl3aGlsZSAoYXJnYy0tID4gMCkgeworCQljb21wYXRfdXB0cl90IHN0cjsKKwkJaW50IGxlbjsKKwkJdW5zaWduZWQgbG9uZyBwb3M7CisKKwkJaWYgKGdldF91c2VyKHN0ciwgYXJndithcmdjKSB8fAorCQkJIShsZW4gPSBzdHJubGVuX3VzZXIoY29tcGF0X3B0cihzdHIpLCBicHJtLT5wKSkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChicHJtLT5wIDwgbGVuKSAgeworCQkJcmV0ID0gLUUyQklHOworCQkJZ290byBvdXQ7CisJCX0KKworCQlicHJtLT5wIC09IGxlbjsKKwkJLyogWFhYOiBhZGQgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIG92ZXJmbG93IGNoZWNrIGhlcmUuICovCisJCXBvcyA9IGJwcm0tPnA7CisKKwkJd2hpbGUgKGxlbiA+IDApIHsKKwkJCWludCBpLCBuZXcsIGVycjsKKwkJCWludCBvZmZzZXQsIGJ5dGVzX3RvX2NvcHk7CisJCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCQkJb2Zmc2V0ID0gcG9zICUgUEFHRV9TSVpFOworCQkJaSA9IHBvcy9QQUdFX1NJWkU7CisJCQlwYWdlID0gYnBybS0+cGFnZVtpXTsKKwkJCW5ldyA9IDA7CisJCQlpZiAoIXBhZ2UpIHsKKwkJCQlwYWdlID0gYWxsb2NfcGFnZShHRlBfSElHSFVTRVIpOworCQkJCWJwcm0tPnBhZ2VbaV0gPSBwYWdlOworCQkJCWlmICghcGFnZSkgeworCQkJCQlyZXQgPSAtRU5PTUVNOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJbmV3ID0gMTsKKwkJCX0KKworCQkJaWYgKHBhZ2UgIT0ga21hcHBlZF9wYWdlKSB7CisJCQkJaWYgKGttYXBwZWRfcGFnZSkKKwkJCQkJa3VubWFwKGttYXBwZWRfcGFnZSk7CisJCQkJa21hcHBlZF9wYWdlID0gcGFnZTsKKwkJCQlrYWRkciA9IGttYXAoa21hcHBlZF9wYWdlKTsKKwkJCX0KKwkJCWlmIChuZXcgJiYgb2Zmc2V0KQorCQkJCW1lbXNldChrYWRkciwgMCwgb2Zmc2V0KTsKKwkJCWJ5dGVzX3RvX2NvcHkgPSBQQUdFX1NJWkUgLSBvZmZzZXQ7CisJCQlpZiAoYnl0ZXNfdG9fY29weSA+IGxlbikgeworCQkJCWJ5dGVzX3RvX2NvcHkgPSBsZW47CisJCQkJaWYgKG5ldykKKwkJCQkJbWVtc2V0KGthZGRyK29mZnNldCtsZW4sIDAsCisJCQkJCQlQQUdFX1NJWkUtb2Zmc2V0LWxlbik7CisJCQl9CisJCQllcnIgPSBjb3B5X2Zyb21fdXNlcihrYWRkcitvZmZzZXQsIGNvbXBhdF9wdHIoc3RyKSwKKwkJCQkJCWJ5dGVzX3RvX2NvcHkpOworCQkJaWYgKGVycikgeworCQkJCXJldCA9IC1FRkFVTFQ7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCXBvcyArPSBieXRlc190b19jb3B5OworCQkJc3RyICs9IGJ5dGVzX3RvX2NvcHk7CisJCQlsZW4gLT0gYnl0ZXNfdG9fY29weTsKKwkJfQorCX0KKwlyZXQgPSAwOworb3V0OgorCWlmIChrbWFwcGVkX3BhZ2UpCisJCWt1bm1hcChrbWFwcGVkX3BhZ2UpOworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBDT05GSUdfTU1VCisKKyNkZWZpbmUgZnJlZV9hcmdfcGFnZXMoYnBybSkgZG8geyB9IHdoaWxlICgwKQorCisjZWxzZQorCitzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9hcmdfcGFnZXMoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQVJHX1BBR0VTOyBpKyspIHsKKwkJaWYgKGJwcm0tPnBhZ2VbaV0pCisJCQlfX2ZyZWVfcGFnZShicHJtLT5wYWdlW2ldKTsKKwkJYnBybS0+cGFnZVtpXSA9IE5VTEw7CisJfQorfQorCisjZW5kaWYgLyogQ09ORklHX01NVSAqLworCisvKgorICogY29tcGF0X2RvX2V4ZWN2ZSgpIGlzIG1vc3RseSBhIGNvcHkgb2YgZG9fZXhlY3ZlKCksIHdpdGggdGhlIGV4Y2VwdGlvbgorICogdGhhdCBpdCBwcm9jZXNzZXMgMzIgYml0IGFyZ3YgYW5kIGVudnAgcG9pbnRlcnMuCisgKi8KK2ludCBjb21wYXRfZG9fZXhlY3ZlKGNoYXIgKiBmaWxlbmFtZSwKKwljb21wYXRfdXB0cl90IF9fdXNlciAqYXJndiwKKwljb21wYXRfdXB0cl90IF9fdXNlciAqZW52cCwKKwlzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpCit7CisJc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybTsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlpbnQgcmV0dmFsOworCWludCBpOworCisJcmV0dmFsID0gLUVOT01FTTsKKwlicHJtID0ga21hbGxvYyhzaXplb2YoKmJwcm0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJwcm0pCisJCWdvdG8gb3V0X3JldDsKKwltZW1zZXQoYnBybSwgMCwgc2l6ZW9mKCpicHJtKSk7CisKKwlmaWxlID0gb3Blbl9leGVjKGZpbGVuYW1lKTsKKwlyZXR2YWwgPSBQVFJfRVJSKGZpbGUpOworCWlmIChJU19FUlIoZmlsZSkpCisJCWdvdG8gb3V0X2tmcmVlOworCisJc2NoZWRfZXhlYygpOworCisJYnBybS0+cCA9IFBBR0VfU0laRSpNQVhfQVJHX1BBR0VTLXNpemVvZih2b2lkICopOworCWJwcm0tPmZpbGUgPSBmaWxlOworCWJwcm0tPmZpbGVuYW1lID0gZmlsZW5hbWU7CisJYnBybS0+aW50ZXJwID0gZmlsZW5hbWU7CisJYnBybS0+bW0gPSBtbV9hbGxvYygpOworCXJldHZhbCA9IC1FTk9NRU07CisJaWYgKCFicHJtLT5tbSkKKwkJZ290byBvdXRfZmlsZTsKKworCXJldHZhbCA9IGluaXRfbmV3X2NvbnRleHQoY3VycmVudCwgYnBybS0+bW0pOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIG91dF9tbTsKKworCWJwcm0tPmFyZ2MgPSBjb21wYXRfY291bnQoYXJndiwgYnBybS0+cCAvIHNpemVvZihjb21wYXRfdXB0cl90KSk7CisJaWYgKChyZXR2YWwgPSBicHJtLT5hcmdjKSA8IDApCisJCWdvdG8gb3V0X21tOworCisJYnBybS0+ZW52YyA9IGNvbXBhdF9jb3VudChlbnZwLCBicHJtLT5wIC8gc2l6ZW9mKGNvbXBhdF91cHRyX3QpKTsKKwlpZiAoKHJldHZhbCA9IGJwcm0tPmVudmMpIDwgMCkKKwkJZ290byBvdXRfbW07CisKKwlyZXR2YWwgPSBzZWN1cml0eV9icHJtX2FsbG9jKGJwcm0pOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0OworCisJcmV0dmFsID0gcHJlcGFyZV9iaW5wcm0oYnBybSk7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gb3V0OworCisJcmV0dmFsID0gY29weV9zdHJpbmdzX2tlcm5lbCgxLCAmYnBybS0+ZmlsZW5hbWUsIGJwcm0pOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIG91dDsKKworCWJwcm0tPmV4ZWMgPSBicHJtLT5wOworCXJldHZhbCA9IGNvbXBhdF9jb3B5X3N0cmluZ3MoYnBybS0+ZW52YywgZW52cCwgYnBybSk7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gb3V0OworCisJcmV0dmFsID0gY29tcGF0X2NvcHlfc3RyaW5ncyhicHJtLT5hcmdjLCBhcmd2LCBicHJtKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZ290byBvdXQ7CisKKwlyZXR2YWwgPSBzZWFyY2hfYmluYXJ5X2hhbmRsZXIoYnBybSwgcmVncyk7CisJaWYgKHJldHZhbCA+PSAwKSB7CisJCWZyZWVfYXJnX3BhZ2VzKGJwcm0pOworCisJCS8qIGV4ZWN2ZSBzdWNjZXNzICovCisJCXNlY3VyaXR5X2Jwcm1fZnJlZShicHJtKTsKKwkJa2ZyZWUoYnBybSk7CisJCXJldHVybiByZXR2YWw7CisJfQorCitvdXQ6CisJLyogU29tZXRoaW5nIHdlbnQgd3JvbmcsIHJldHVybiB0aGUgaW5vZGUgYW5kIGZyZWUgdGhlIGFyZ3VtZW50IHBhZ2VzKi8KKwlmb3IgKGkgPSAwIDsgaSA8IE1BWF9BUkdfUEFHRVMgOyBpKyspIHsKKwkJc3RydWN0IHBhZ2UgKiBwYWdlID0gYnBybS0+cGFnZVtpXTsKKwkJaWYgKHBhZ2UpCisJCQlfX2ZyZWVfcGFnZShwYWdlKTsKKwl9CisKKwlpZiAoYnBybS0+c2VjdXJpdHkpCisJCXNlY3VyaXR5X2Jwcm1fZnJlZShicHJtKTsKKworb3V0X21tOgorCWlmIChicHJtLT5tbSkKKwkJbW1kcm9wKGJwcm0tPm1tKTsKKworb3V0X2ZpbGU6CisJaWYgKGJwcm0tPmZpbGUpIHsKKwkJYWxsb3dfd3JpdGVfYWNjZXNzKGJwcm0tPmZpbGUpOworCQlmcHV0KGJwcm0tPmZpbGUpOworCX0KKworb3V0X2tmcmVlOgorCWtmcmVlKGJwcm0pOworCitvdXRfcmV0OgorCXJldHVybiByZXR2YWw7Cit9CisKKyNkZWZpbmUgX19DT01QQVRfTkZEQklUUyAgICAgICAoOCAqIHNpemVvZihjb21wYXRfdWxvbmdfdCkpCisKKyNkZWZpbmUgUk9VTkRfVVAoeCx5KSAoKCh4KSsoeSktMSkvKHkpKQorCisvKgorICogT29vLCBuYXN0eS4gIFdlIG5lZWQgaGVyZSB0byBmcm9iIDMyLWJpdCB1bnNpZ25lZCBsb25ncyB0bworICogNjQtYml0IHVuc2lnbmVkIGxvbmdzLgorICovCitzdGF0aWMgaW5saW5lCitpbnQgY29tcGF0X2dldF9mZF9zZXQodW5zaWduZWQgbG9uZyBuciwgY29tcGF0X3Vsb25nX3QgX191c2VyICp1ZmRzZXQsCisJCQl1bnNpZ25lZCBsb25nICpmZHNldCkKK3sKKwluciA9IFJPVU5EX1VQKG5yLCBfX0NPTVBBVF9ORkRCSVRTKTsKKwlpZiAodWZkc2V0KSB7CisJCXVuc2lnbmVkIGxvbmcgb2RkOworCisJCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdWZkc2V0LCBucipzaXplb2YoY29tcGF0X3Vsb25nX3QpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCW9kZCA9IG5yICYgMVVMOworCQluciAmPSB+MVVMOworCQl3aGlsZSAobnIpIHsKKwkJCXVuc2lnbmVkIGxvbmcgaCwgbDsKKwkJCV9fZ2V0X3VzZXIobCwgdWZkc2V0KTsKKwkJCV9fZ2V0X3VzZXIoaCwgdWZkc2V0KzEpOworCQkJdWZkc2V0ICs9IDI7CisJCQkqZmRzZXQrKyA9IGggPDwgMzIgfCBsOworCQkJbnIgLT0gMjsKKwkJfQorCQlpZiAob2RkKQorCQkJX19nZXRfdXNlcigqZmRzZXQsIHVmZHNldCk7CisJfSBlbHNlIHsKKwkJLyogVHJpY2t5LCBtdXN0IGNsZWFyIGZ1bGwgdW5zaWduZWQgbG9uZyBpbiB0aGUKKwkJICoga2VybmVsIGZkc2V0IGF0IHRoZSBlbmQsIHRoaXMgbWFrZXMgc3VyZSB0aGF0CisJCSAqIGFjdHVhbGx5IGhhcHBlbnMuCisJCSAqLworCQltZW1zZXQoZmRzZXQsIDAsICgobnIgKyAxKSAmIH4xKSpzaXplb2YoY29tcGF0X3Vsb25nX3QpKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgY29tcGF0X3NldF9mZF9zZXQodW5zaWduZWQgbG9uZyBuciwgY29tcGF0X3Vsb25nX3QgX191c2VyICp1ZmRzZXQsCisJCQl1bnNpZ25lZCBsb25nICpmZHNldCkKK3sKKwl1bnNpZ25lZCBsb25nIG9kZDsKKwluciA9IFJPVU5EX1VQKG5yLCBfX0NPTVBBVF9ORkRCSVRTKTsKKworCWlmICghdWZkc2V0KQorCQlyZXR1cm47CisKKwlvZGQgPSBuciAmIDFVTDsKKwluciAmPSB+MVVMOworCXdoaWxlIChucikgeworCQl1bnNpZ25lZCBsb25nIGgsIGw7CisJCWwgPSAqZmRzZXQrKzsKKwkJaCA9IGwgPj4gMzI7CisJCV9fcHV0X3VzZXIobCwgdWZkc2V0KTsKKwkJX19wdXRfdXNlcihoLCB1ZmRzZXQrMSk7CisJCXVmZHNldCArPSAyOworCQluciAtPSAyOworCX0KKwlpZiAob2RkKQorCQlfX3B1dF91c2VyKCpmZHNldCwgdWZkc2V0KTsKK30KKworCisvKgorICogVGhpcyBpcyBhIHZpcnR1YWwgY29weSBvZiBzeXNfc2VsZWN0IGZyb20gZnMvc2VsZWN0LmMgYW5kIHByb2JhYmx5CisgKiBzaG91bGQgYmUgY29tcGFyZWQgdG8gaXQgZnJvbSB0aW1lIHRvIHRpbWUKKyAqLworc3RhdGljIHZvaWQgKnNlbGVjdF9iaXRzX2FsbG9jKGludCBzaXplKQoreworCXJldHVybiBrbWFsbG9jKDYgKiBzaXplLCBHRlBfS0VSTkVMKTsKK30KKworc3RhdGljIHZvaWQgc2VsZWN0X2JpdHNfZnJlZSh2b2lkICpiaXRzLCBpbnQgc2l6ZSkKK3sKKwlrZnJlZShiaXRzKTsKK30KKworLyoKKyAqIFdlIGNhbiBhY3R1YWxseSByZXR1cm4gRVJFU1RBUlRTWVMgaW5zdGVhZCBvZiBFSU5UUiwgYnV0IEknZAorICogbGlrZSB0byBiZSBjZXJ0YWluIHRoaXMgbGVhZHMgdG8gbm8gcHJvYmxlbXMuIFNvIEkgcmV0dXJuCisgKiBFSU5UUiBqdXN0IGZvciBzYWZldHkuCisgKgorICogVXBkYXRlOiBFUkVTVEFSVFNZUyBicmVha3MgYXQgbGVhc3QgdGhlIHh2aWV3IGNsb2NrIGJpbmFyeSwgc28KKyAqIEknbSB0cnlpbmcgRVJFU1RBUlROT0hBTkQgd2hpY2ggcmVzdGFydCBvbmx5IHdoZW4geW91IHdhbnQgdG8uCisgKi8KKyNkZWZpbmUgTUFYX1NFTEVDVF9TRUNPTkRTIFwKKwkoKHVuc2lnbmVkIGxvbmcpIChNQVhfU0NIRURVTEVfVElNRU9VVCAvIEhaKS0xKQorCithc21saW5rYWdlIGxvbmcKK2NvbXBhdF9zeXNfc2VsZWN0KGludCBuLCBjb21wYXRfdWxvbmdfdCBfX3VzZXIgKmlucCwgY29tcGF0X3Vsb25nX3QgX191c2VyICpvdXRwLAorCQljb21wYXRfdWxvbmdfdCBfX3VzZXIgKmV4cCwgc3RydWN0IGNvbXBhdF90aW1ldmFsIF9fdXNlciAqdHZwKQoreworCWZkX3NldF9iaXRzIGZkczsKKwljaGFyICpiaXRzOworCWxvbmcgdGltZW91dDsKKwlpbnQgc2l6ZSwgbWF4X2Zkc2V0LCByZXQgPSAtRUlOVkFMOworCisJdGltZW91dCA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOworCWlmICh0dnApIHsKKwkJdGltZV90IHNlYywgdXNlYzsKKworCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgdHZwLCBzaXplb2YoKnR2cCkpCisJCSAgICB8fCBfX2dldF91c2VyKHNlYywgJnR2cC0+dHZfc2VjKQorCQkgICAgfHwgX19nZXRfdXNlcih1c2VjLCAmdHZwLT50dl91c2VjKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0X25vZmRzOworCQl9CisKKwkJaWYgKHNlYyA8IDAgfHwgdXNlYyA8IDApCisJCQlnb3RvIG91dF9ub2ZkczsKKworCQlpZiAoKHVuc2lnbmVkIGxvbmcpIHNlYyA8IE1BWF9TRUxFQ1RfU0VDT05EUykgeworCQkJdGltZW91dCA9IFJPVU5EX1VQKHVzZWMsIDEwMDAwMDAvSFopOworCQkJdGltZW91dCArPSBzZWMgKiAodW5zaWduZWQgbG9uZykgSFo7CisJCX0KKwl9CisKKwlpZiAobiA8IDApCisJCWdvdG8gb3V0X25vZmRzOworCisJLyogbWF4X2Zkc2V0IGNhbiBpbmNyZWFzZSwgc28gZ3JhYiBpdCBvbmNlIHRvIGF2b2lkIHJhY2UgKi8KKwltYXhfZmRzZXQgPSBjdXJyZW50LT5maWxlcy0+bWF4X2Zkc2V0OworCWlmIChuID4gbWF4X2Zkc2V0KQorCQluID0gbWF4X2Zkc2V0OworCisJLyoKKwkgKiBXZSBuZWVkIDYgYml0bWFwcyAoaW4vb3V0L2V4IGZvciBib3RoIGluY29taW5nIGFuZCBvdXRnb2luZyksCisJICogc2luY2Ugd2UgdXNlZCBmZHNldCB3ZSBuZWVkIHRvIGFsbG9jYXRlIG1lbW9yeSBpbiB1bml0cyBvZgorCSAqIGxvbmctd29yZHMuCisJICovCisJcmV0ID0gLUVOT01FTTsKKwlzaXplID0gRkRTX0JZVEVTKG4pOworCWJpdHMgPSBzZWxlY3RfYml0c19hbGxvYyhzaXplKTsKKwlpZiAoIWJpdHMpCisJCWdvdG8gb3V0X25vZmRzOworCWZkcy5pbiAgICAgID0gKHVuc2lnbmVkIGxvbmcgKikgIGJpdHM7CisJZmRzLm91dCAgICAgPSAodW5zaWduZWQgbG9uZyAqKSAoYml0cyArICAgc2l6ZSk7CisJZmRzLmV4ICAgICAgPSAodW5zaWduZWQgbG9uZyAqKSAoYml0cyArIDIqc2l6ZSk7CisJZmRzLnJlc19pbiAgPSAodW5zaWduZWQgbG9uZyAqKSAoYml0cyArIDMqc2l6ZSk7CisJZmRzLnJlc19vdXQgPSAodW5zaWduZWQgbG9uZyAqKSAoYml0cyArIDQqc2l6ZSk7CisJZmRzLnJlc19leCAgPSAodW5zaWduZWQgbG9uZyAqKSAoYml0cyArIDUqc2l6ZSk7CisKKwlpZiAoKHJldCA9IGNvbXBhdF9nZXRfZmRfc2V0KG4sIGlucCwgZmRzLmluKSkgfHwKKwkgICAgKHJldCA9IGNvbXBhdF9nZXRfZmRfc2V0KG4sIG91dHAsIGZkcy5vdXQpKSB8fAorCSAgICAocmV0ID0gY29tcGF0X2dldF9mZF9zZXQobiwgZXhwLCBmZHMuZXgpKSkKKwkJZ290byBvdXQ7CisJemVyb19mZF9zZXQobiwgZmRzLnJlc19pbik7CisJemVyb19mZF9zZXQobiwgZmRzLnJlc19vdXQpOworCXplcm9fZmRfc2V0KG4sIGZkcy5yZXNfZXgpOworCisJcmV0ID0gZG9fc2VsZWN0KG4sICZmZHMsICZ0aW1lb3V0KTsKKworCWlmICh0dnAgJiYgIShjdXJyZW50LT5wZXJzb25hbGl0eSAmIFNUSUNLWV9USU1FT1VUUykpIHsKKwkJdGltZV90IHNlYyA9IDAsIHVzZWMgPSAwOworCQlpZiAodGltZW91dCkgeworCQkJc2VjID0gdGltZW91dCAvIEhaOworCQkJdXNlYyA9IHRpbWVvdXQgJSBIWjsKKwkJCXVzZWMgKj0gKDEwMDAwMDAvSFopOworCQl9CisJCWlmIChwdXRfdXNlcihzZWMsICZ0dnAtPnR2X3NlYykgfHwKKwkJICAgIHB1dF91c2VyKHVzZWMsICZ0dnAtPnR2X3VzZWMpKQorCQkJcmV0ID0gLUVGQVVMVDsKKwl9CisKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJaWYgKCFyZXQpIHsKKwkJcmV0ID0gLUVSRVNUQVJUTk9IQU5EOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlnb3RvIG91dDsKKwkJcmV0ID0gMDsKKwl9CisKKwljb21wYXRfc2V0X2ZkX3NldChuLCBpbnAsIGZkcy5yZXNfaW4pOworCWNvbXBhdF9zZXRfZmRfc2V0KG4sIG91dHAsIGZkcy5yZXNfb3V0KTsKKwljb21wYXRfc2V0X2ZkX3NldChuLCBleHAsIGZkcy5yZXNfZXgpOworCitvdXQ6CisJc2VsZWN0X2JpdHNfZnJlZShiaXRzLCBzaXplKTsKK291dF9ub2ZkczoKKwlyZXR1cm4gcmV0OworfQorCisjaWYgZGVmaW5lZChDT05GSUdfTkZTRCkgfHwgZGVmaW5lZChDT05GSUdfTkZTRF9NT0RVTEUpCisvKiBTdHVmZiBmb3IgTkZTIHNlcnZlciBzeXNjYWxscy4uLiAqLworc3RydWN0IGNvbXBhdF9uZnNjdGxfc3ZjIHsKKwl1MTYJCQlzdmMzMl9wb3J0OworCXMzMgkJCXN2YzMyX250aHJlYWRzOworfTsKKworc3RydWN0IGNvbXBhdF9uZnNjdGxfY2xpZW50IHsKKwlzOAkJCWNsMzJfaWRlbnRbTkZTQ0xOVF9JRE1BWCsxXTsKKwlzMzIJCQljbDMyX25hZGRyOworCXN0cnVjdCBpbl9hZGRyCQljbDMyX2FkZHJsaXN0W05GU0NMTlRfQUREUk1BWF07CisJczMyCQkJY2wzMl9maGtleXR5cGU7CisJczMyCQkJY2wzMl9maGtleWxlbjsKKwl1OAkJCWNsMzJfZmhrZXlbTkZTQ0xOVF9LRVlNQVhdOworfTsKKworc3RydWN0IGNvbXBhdF9uZnNjdGxfZXhwb3J0IHsKKwljaGFyCQlleDMyX2NsaWVudFtORlNDTE5UX0lETUFYKzFdOworCWNoYXIJCWV4MzJfcGF0aFtORlNfTUFYUEFUSExFTisxXTsKKwljb21wYXRfZGV2X3QJZXgzMl9kZXY7CisJY29tcGF0X2lub190CWV4MzJfaW5vOworCWNvbXBhdF9pbnRfdAlleDMyX2ZsYWdzOworCWNvbXBhdF91aWRfdAlleDMyX2Fub25fdWlkOworCWNvbXBhdF9naWRfdAlleDMyX2Fub25fZ2lkOworfTsKKworc3RydWN0IGNvbXBhdF9uZnNjdGxfZmRwYXJtIHsKKwlzdHJ1Y3Qgc29ja2FkZHIJCWdkMzJfYWRkcjsKKwlzOAkJCWdkMzJfcGF0aFtORlNfTUFYUEFUSExFTisxXTsKKwljb21wYXRfaW50X3QJCWdkMzJfdmVyc2lvbjsKK307CisKK3N0cnVjdCBjb21wYXRfbmZzY3RsX2ZzcGFybSB7CisJc3RydWN0IHNvY2thZGRyCQlnZDMyX2FkZHI7CisJczgJCQlnZDMyX3BhdGhbTkZTX01BWFBBVEhMRU4rMV07CisJY29tcGF0X2ludF90CQlnZDMyX21heGxlbjsKK307CisKK3N0cnVjdCBjb21wYXRfbmZzY3RsX2FyZyB7CisJY29tcGF0X2ludF90CQljYTMyX3ZlcnNpb247CS8qIHNhZmVndWFyZCAqLworCXVuaW9uIHsKKwkJc3RydWN0IGNvbXBhdF9uZnNjdGxfc3ZjCXUzMl9zdmM7CisJCXN0cnVjdCBjb21wYXRfbmZzY3RsX2NsaWVudAl1MzJfY2xpZW50OworCQlzdHJ1Y3QgY29tcGF0X25mc2N0bF9leHBvcnQJdTMyX2V4cG9ydDsKKwkJc3RydWN0IGNvbXBhdF9uZnNjdGxfZmRwYXJtCXUzMl9nZXRmZDsKKwkJc3RydWN0IGNvbXBhdF9uZnNjdGxfZnNwYXJtCXUzMl9nZXRmczsKKwl9IHU7CisjZGVmaW5lIGNhMzJfc3ZjCXUudTMyX3N2YworI2RlZmluZSBjYTMyX2NsaWVudAl1LnUzMl9jbGllbnQKKyNkZWZpbmUgY2EzMl9leHBvcnQJdS51MzJfZXhwb3J0CisjZGVmaW5lIGNhMzJfZ2V0ZmQJdS51MzJfZ2V0ZmQKKyNkZWZpbmUgY2EzMl9nZXRmcwl1LnUzMl9nZXRmcworfTsKKwordW5pb24gY29tcGF0X25mc2N0bF9yZXMgeworCV9fdTgJCQljcjMyX2dldGZoW05GU19GSFNJWkVdOworCXN0cnVjdCBrbmZzZF9maAkJY3IzMl9nZXRmczsKK307CisKK3N0YXRpYyBpbnQgY29tcGF0X25mc19zdmNfdHJhbnMoc3RydWN0IG5mc2N0bF9hcmcgKmthcmcsIHN0cnVjdCBjb21wYXRfbmZzY3RsX2FyZyBfX3VzZXIgKmFyZykKK3sKKwlpbnQgZXJyOworCisJZXJyID0gYWNjZXNzX29rKFZFUklGWV9SRUFELCAmYXJnLT5jYTMyX3N2Yywgc2l6ZW9mKGFyZy0+Y2EzMl9zdmMpKTsKKwllcnIgfD0gZ2V0X3VzZXIoa2FyZy0+Y2FfdmVyc2lvbiwgJmFyZy0+Y2EzMl92ZXJzaW9uKTsKKwllcnIgfD0gX19nZXRfdXNlcihrYXJnLT5jYV9zdmMuc3ZjX3BvcnQsICZhcmctPmNhMzJfc3ZjLnN2YzMyX3BvcnQpOworCWVyciB8PSBfX2dldF91c2VyKGthcmctPmNhX3N2Yy5zdmNfbnRocmVhZHMsICZhcmctPmNhMzJfc3ZjLnN2YzMyX250aHJlYWRzKTsKKwlyZXR1cm4gKGVycikgPyAtRUZBVUxUIDogMDsKK30KKworc3RhdGljIGludCBjb21wYXRfbmZzX2NsbnRfdHJhbnMoc3RydWN0IG5mc2N0bF9hcmcgKmthcmcsIHN0cnVjdCBjb21wYXRfbmZzY3RsX2FyZyBfX3VzZXIgKmFyZykKK3sKKwlpbnQgZXJyOworCisJZXJyID0gYWNjZXNzX29rKFZFUklGWV9SRUFELCAmYXJnLT5jYTMyX2NsaWVudCwgc2l6ZW9mKGFyZy0+Y2EzMl9jbGllbnQpKTsKKwllcnIgfD0gZ2V0X3VzZXIoa2FyZy0+Y2FfdmVyc2lvbiwgJmFyZy0+Y2EzMl92ZXJzaW9uKTsKKwllcnIgfD0gX19jb3B5X2Zyb21fdXNlcigma2FyZy0+Y2FfY2xpZW50LmNsX2lkZW50WzBdLAorCQkJICAmYXJnLT5jYTMyX2NsaWVudC5jbDMyX2lkZW50WzBdLAorCQkJICBORlNDTE5UX0lETUFYKTsKKwllcnIgfD0gX19nZXRfdXNlcihrYXJnLT5jYV9jbGllbnQuY2xfbmFkZHIsICZhcmctPmNhMzJfY2xpZW50LmNsMzJfbmFkZHIpOworCWVyciB8PSBfX2NvcHlfZnJvbV91c2VyKCZrYXJnLT5jYV9jbGllbnQuY2xfYWRkcmxpc3RbMF0sCisJCQkgICZhcmctPmNhMzJfY2xpZW50LmNsMzJfYWRkcmxpc3RbMF0sCisJCQkgIChzaXplb2Yoc3RydWN0IGluX2FkZHIpICogTkZTQ0xOVF9BRERSTUFYKSk7CisJZXJyIHw9IF9fZ2V0X3VzZXIoa2FyZy0+Y2FfY2xpZW50LmNsX2Zoa2V5dHlwZSwKKwkJICAgICAgJmFyZy0+Y2EzMl9jbGllbnQuY2wzMl9maGtleXR5cGUpOworCWVyciB8PSBfX2dldF91c2VyKGthcmctPmNhX2NsaWVudC5jbF9maGtleWxlbiwKKwkJICAgICAgJmFyZy0+Y2EzMl9jbGllbnQuY2wzMl9maGtleWxlbik7CisJZXJyIHw9IF9fY29weV9mcm9tX3VzZXIoJmthcmctPmNhX2NsaWVudC5jbF9maGtleVswXSwKKwkJCSAgJmFyZy0+Y2EzMl9jbGllbnQuY2wzMl9maGtleVswXSwKKwkJCSAgTkZTQ0xOVF9LRVlNQVgpOworCisJcmV0dXJuIChlcnIpID8gLUVGQVVMVCA6IDA7Cit9CisKK3N0YXRpYyBpbnQgY29tcGF0X25mc19leHBfdHJhbnMoc3RydWN0IG5mc2N0bF9hcmcgKmthcmcsIHN0cnVjdCBjb21wYXRfbmZzY3RsX2FyZyBfX3VzZXIgKmFyZykKK3sKKwlpbnQgZXJyOworCisJZXJyID0gYWNjZXNzX29rKFZFUklGWV9SRUFELCAmYXJnLT5jYTMyX2V4cG9ydCwgc2l6ZW9mKGFyZy0+Y2EzMl9leHBvcnQpKTsKKwllcnIgfD0gZ2V0X3VzZXIoa2FyZy0+Y2FfdmVyc2lvbiwgJmFyZy0+Y2EzMl92ZXJzaW9uKTsKKwllcnIgfD0gX19jb3B5X2Zyb21fdXNlcigma2FyZy0+Y2FfZXhwb3J0LmV4X2NsaWVudFswXSwKKwkJCSAgJmFyZy0+Y2EzMl9leHBvcnQuZXgzMl9jbGllbnRbMF0sCisJCQkgIE5GU0NMTlRfSURNQVgpOworCWVyciB8PSBfX2NvcHlfZnJvbV91c2VyKCZrYXJnLT5jYV9leHBvcnQuZXhfcGF0aFswXSwKKwkJCSAgJmFyZy0+Y2EzMl9leHBvcnQuZXgzMl9wYXRoWzBdLAorCQkJICBORlNfTUFYUEFUSExFTik7CisJZXJyIHw9IF9fZ2V0X3VzZXIoa2FyZy0+Y2FfZXhwb3J0LmV4X2RldiwKKwkJICAgICAgJmFyZy0+Y2EzMl9leHBvcnQuZXgzMl9kZXYpOworCWVyciB8PSBfX2dldF91c2VyKGthcmctPmNhX2V4cG9ydC5leF9pbm8sCisJCSAgICAgICZhcmctPmNhMzJfZXhwb3J0LmV4MzJfaW5vKTsKKwllcnIgfD0gX19nZXRfdXNlcihrYXJnLT5jYV9leHBvcnQuZXhfZmxhZ3MsCisJCSAgICAgICZhcmctPmNhMzJfZXhwb3J0LmV4MzJfZmxhZ3MpOworCWVyciB8PSBfX2dldF91c2VyKGthcmctPmNhX2V4cG9ydC5leF9hbm9uX3VpZCwKKwkJICAgICAgJmFyZy0+Y2EzMl9leHBvcnQuZXgzMl9hbm9uX3VpZCk7CisJZXJyIHw9IF9fZ2V0X3VzZXIoa2FyZy0+Y2FfZXhwb3J0LmV4X2Fub25fZ2lkLAorCQkgICAgICAmYXJnLT5jYTMyX2V4cG9ydC5leDMyX2Fub25fZ2lkKTsKKwlTRVRfVUlEKGthcmctPmNhX2V4cG9ydC5leF9hbm9uX3VpZCwga2FyZy0+Y2FfZXhwb3J0LmV4X2Fub25fdWlkKTsKKwlTRVRfR0lEKGthcmctPmNhX2V4cG9ydC5leF9hbm9uX2dpZCwga2FyZy0+Y2FfZXhwb3J0LmV4X2Fub25fZ2lkKTsKKworCXJldHVybiAoZXJyKSA/IC1FRkFVTFQgOiAwOworfQorCitzdGF0aWMgaW50IGNvbXBhdF9uZnNfZ2V0ZmRfdHJhbnMoc3RydWN0IG5mc2N0bF9hcmcgKmthcmcsIHN0cnVjdCBjb21wYXRfbmZzY3RsX2FyZyBfX3VzZXIgKmFyZykKK3sKKwlpbnQgZXJyOworCisJZXJyID0gYWNjZXNzX29rKFZFUklGWV9SRUFELCAmYXJnLT5jYTMyX2dldGZkLCBzaXplb2YoYXJnLT5jYTMyX2dldGZkKSk7CisJZXJyIHw9IGdldF91c2VyKGthcmctPmNhX3ZlcnNpb24sICZhcmctPmNhMzJfdmVyc2lvbik7CisJZXJyIHw9IF9fY29weV9mcm9tX3VzZXIoJmthcmctPmNhX2dldGZkLmdkX2FkZHIsCisJCQkgICZhcmctPmNhMzJfZ2V0ZmQuZ2QzMl9hZGRyLAorCQkJICAoc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikpKTsKKwllcnIgfD0gX19jb3B5X2Zyb21fdXNlcigma2FyZy0+Y2FfZ2V0ZmQuZ2RfcGF0aCwKKwkJCSAgJmFyZy0+Y2EzMl9nZXRmZC5nZDMyX3BhdGgsCisJCQkgIChORlNfTUFYUEFUSExFTisxKSk7CisJZXJyIHw9IF9fZ2V0X3VzZXIoa2FyZy0+Y2FfZ2V0ZmQuZ2RfdmVyc2lvbiwKKwkJICAgICAgJmFyZy0+Y2EzMl9nZXRmZC5nZDMyX3ZlcnNpb24pOworCisJcmV0dXJuIChlcnIpID8gLUVGQVVMVCA6IDA7Cit9CisKK3N0YXRpYyBpbnQgY29tcGF0X25mc19nZXRmc190cmFucyhzdHJ1Y3QgbmZzY3RsX2FyZyAqa2FyZywgc3RydWN0IGNvbXBhdF9uZnNjdGxfYXJnIF9fdXNlciAqYXJnKQoreworCWludCBlcnI7CisKKwllcnIgPSBhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsICZhcmctPmNhMzJfZ2V0ZnMsIHNpemVvZihhcmctPmNhMzJfZ2V0ZnMpKTsKKwllcnIgfD0gZ2V0X3VzZXIoa2FyZy0+Y2FfdmVyc2lvbiwgJmFyZy0+Y2EzMl92ZXJzaW9uKTsKKwllcnIgfD0gX19jb3B5X2Zyb21fdXNlcigma2FyZy0+Y2FfZ2V0ZnMuZ2RfYWRkciwKKwkJCSAgJmFyZy0+Y2EzMl9nZXRmcy5nZDMyX2FkZHIsCisJCQkgIChzaXplb2Yoc3RydWN0IHNvY2thZGRyKSkpOworCWVyciB8PSBfX2NvcHlfZnJvbV91c2VyKCZrYXJnLT5jYV9nZXRmcy5nZF9wYXRoLAorCQkJICAmYXJnLT5jYTMyX2dldGZzLmdkMzJfcGF0aCwKKwkJCSAgKE5GU19NQVhQQVRITEVOKzEpKTsKKwllcnIgfD0gX19nZXRfdXNlcihrYXJnLT5jYV9nZXRmcy5nZF9tYXhsZW4sCisJCSAgICAgICZhcmctPmNhMzJfZ2V0ZnMuZ2QzMl9tYXhsZW4pOworCisJcmV0dXJuIChlcnIpID8gLUVGQVVMVCA6IDA7Cit9CisKKy8qIFRoaXMgcmVhbGx5IGRvZXNuJ3QgbmVlZCB0cmFuc2xhdGlvbnMsIHdlIGFyZSBvbmx5IHBhc3NpbmcKKyAqIGJhY2sgYSB1bmlvbiB3aGljaCBjb250YWlucyBvcGFxdWUgbmZzIGZpbGUgaGFuZGxlIGRhdGEuCisgKi8KK3N0YXRpYyBpbnQgY29tcGF0X25mc19nZXRmaF9yZXNfdHJhbnModW5pb24gbmZzY3RsX3JlcyAqa3JlcywgdW5pb24gY29tcGF0X25mc2N0bF9yZXMgX191c2VyICpyZXMpCit7CisJaW50IGVycjsKKworCWVyciA9IGNvcHlfdG9fdXNlcihyZXMsIGtyZXMsIHNpemVvZigqcmVzKSk7CisKKwlyZXR1cm4gKGVycikgPyAtRUZBVUxUIDogMDsKK30KKworYXNtbGlua2FnZSBsb25nIGNvbXBhdF9zeXNfbmZzc2VydmN0bChpbnQgY21kLCBzdHJ1Y3QgY29tcGF0X25mc2N0bF9hcmcgX191c2VyICphcmcsCisJCQkJCXVuaW9uIGNvbXBhdF9uZnNjdGxfcmVzIF9fdXNlciAqcmVzKQoreworCXN0cnVjdCBuZnNjdGxfYXJnICprYXJnOworCXVuaW9uIG5mc2N0bF9yZXMgKmtyZXM7CisJbW1fc2VnbWVudF90IG9sZGZzOworCWludCBlcnI7CisKKwlrYXJnID0ga21hbGxvYyhzaXplb2YoKmthcmcpLCBHRlBfVVNFUik7CisJa3JlcyA9IGttYWxsb2Moc2l6ZW9mKCprcmVzKSwgR0ZQX1VTRVIpOworCWlmKCFrYXJnIHx8ICFrcmVzKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBORlNDVExfU1ZDOgorCQllcnIgPSBjb21wYXRfbmZzX3N2Y190cmFucyhrYXJnLCBhcmcpOworCQlicmVhazsKKworCWNhc2UgTkZTQ1RMX0FERENMSUVOVDoKKwkJZXJyID0gY29tcGF0X25mc19jbG50X3RyYW5zKGthcmcsIGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBORlNDVExfREVMQ0xJRU5UOgorCQllcnIgPSBjb21wYXRfbmZzX2NsbnRfdHJhbnMoa2FyZywgYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIE5GU0NUTF9FWFBPUlQ6CisJY2FzZSBORlNDVExfVU5FWFBPUlQ6CisJCWVyciA9IGNvbXBhdF9uZnNfZXhwX3RyYW5zKGthcmcsIGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBORlNDVExfR0VURkQ6CisJCWVyciA9IGNvbXBhdF9uZnNfZ2V0ZmRfdHJhbnMoa2FyZywgYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIE5GU0NUTF9HRVRGUzoKKwkJZXJyID0gY29tcGF0X25mc19nZXRmc190cmFucyhrYXJnLCBhcmcpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlvbGRmcyA9IGdldF9mcygpOworCXNldF9mcyhLRVJORUxfRFMpOworCS8qIFRoZSBfX3VzZXIgcG9pbnRlciBjYXN0cyBhcmUgdmFsaWQgYmVjYXVzZSBvZiB0aGUgc2V0X2ZzKCkgKi8KKwllcnIgPSBzeXNfbmZzc2VydmN0bChjbWQsICh2b2lkIF9fdXNlciAqKSBrYXJnLCAodm9pZCBfX3VzZXIgKikga3Jlcyk7CisJc2V0X2ZzKG9sZGZzKTsKKworCWlmIChlcnIpCisJCWdvdG8gZG9uZTsKKworCWlmKChjbWQgPT0gTkZTQ1RMX0dFVEZEKSB8fAorCSAgIChjbWQgPT0gTkZTQ1RMX0dFVEZTKSkKKwkJZXJyID0gY29tcGF0X25mc19nZXRmaF9yZXNfdHJhbnMoa3JlcywgcmVzKTsKKworZG9uZToKKwlrZnJlZShrYXJnKTsKKwlrZnJlZShrcmVzKTsKKwlyZXR1cm4gZXJyOworfQorI2Vsc2UgLyogIU5GU0QgKi8KK2xvbmcgYXNtbGlua2FnZSBjb21wYXRfc3lzX25mc3NlcnZjdGwoaW50IGNtZCwgdm9pZCAqbm90dXNlZCwgdm9pZCAqbm90dXNlZDIpCit7CisJcmV0dXJuIHN5c19uaV9zeXNjYWxsKCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2NvbXBhdF9pb2N0bC5jIGIvZnMvY29tcGF0X2lvY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU1ZTYxMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2NvbXBhdF9pb2N0bC5jCkBAIC0wLDAgKzEsMzA4MiBAQAorLyoKKyAqIGlvY3RsMzIuYzogQ29udmVyc2lvbiBiZXR3ZWVuIDMyYml0IGFuZCA2NGJpdCBuYXRpdmUgaW9jdGxzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ny0yMDAwICBKYWt1YiBKZWxpbmVrICAoamFrdWJAcmVkaGF0LmNvbSkKKyAqIENvcHlyaWdodCAoQykgMTk5OCAgRWRkaWUgQy4gRG9zdCAgKGVjZEBza3luZXQuYmUpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwMiAgQW5kaSBLbGVlbiwgU3VTRSBMYWJzIAorICogQ29weXJpZ2h0IChDKSAyMDAzICAgICAgIFBhdmVsIE1hY2hlayAocGF2ZWxAc3VzZS5jeikKKyAqCisgKiBUaGVzZSByb3V0aW5lcyBtYWludGFpbiBhcmd1bWVudCBzaXplIGNvbnZlcnNpb24gYmV0d2VlbiAzMmJpdCBhbmQgNjRiaXQKKyAqIGlvY3Rscy4KKyAqLworCisjaWZkZWYgSU5DTFVERVMKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9icmlkZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9yYWlkL21kLmg+CisjaW5jbHVkZSA8bGludXgva2QuaD4KKyNpbmNsdWRlIDxsaW51eC9kaXJlbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9yb3V0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luNi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwdjZfcm91dGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvdnQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BwcF9kZWZzLmg+CisjaW5jbHVkZSA8bGludXgvaWZfcHBwLmg+CisjaW5jbHVkZSA8bGludXgvaWZfcHBwb3guaD4KKyNpbmNsdWRlIDxsaW51eC9tdGlvLmg+CisjaW5jbHVkZSA8bGludXgvY2Ryb20uaD4KKyNpbmNsdWRlIDxsaW51eC9sb29wLmg+CisjaW5jbHVkZSA8bGludXgvYXV0b19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2F1dG9fZnM0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC92dF9rZXJuLmg+CisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHQyX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbWJfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtwZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZXZhdG9yLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CisjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl90dW4uaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L25jcF9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy1kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2F0YWxrLmg+CisKKyNpbmNsdWRlIDxuZXQvc29jay5oPiAgICAgICAgICAvKiBzaW9jZGV2cHJpdmF0ZV9pb2N0bCAqLworI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2kuaD4KKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL3JmY29tbS5oPgorCisjaW5jbHVkZSA8bGludXgvY2FwaS5oPgorCisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisvKiBVZ2x5IGhhY2suICovCisjdW5kZWYgX19LRVJORUxfXworI2luY2x1ZGUgPHNjc2kvc2NzaV9pb2N0bC5oPgorI2RlZmluZSBfX0tFUk5FTF9fCisjaW5jbHVkZSA8c2NzaS9zZy5oPgorCisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYm9uZGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CisjaW5jbHVkZSA8bGludXgvZG0taW9jdGwuaD4KKworI2luY2x1ZGUgPGFzbS9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KKyNpbmNsdWRlIDxsaW51eC9scC5oPgorI2luY2x1ZGUgPGxpbnV4L3BwZGV2Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9hdG0uaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG1jbGlwLmg+CisjaW5jbHVkZSA8bGludXgvYXRtZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvYXRtaW9jLmg+CisjaW5jbHVkZSA8bGludXgvYXRtbGVjLmg+CisjaW5jbHVkZSA8bGludXgvYXRtbXBjLmg+CisjaW5jbHVkZSA8bGludXgvYXRtc3ZjLmg+CisjaW5jbHVkZSA8bGludXgvYXRtX3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvYXRtX3N1bmkuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisKKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC91c2JkZXZpY2VfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uYmQuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9maWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tc2Rvc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BrdGNkdmQuaD4KKworI2luY2x1ZGUgPGxpbnV4L2hpZGRldi5oPgorCisjdW5kZWYgSU5DTFVERVMKKyNlbmRpZgorCisjaWZkZWYgQ09ERQorCisvKiBBaWVlLiBTb21lb25lIGRvZXMgbm90IGZpbmQgYSBkaWZmZXJlbmNlIGJldHdlZW4gaW50IGFuZCBsb25nICovCisjZGVmaW5lIEVYVDJfSU9DMzJfR0VURkxBR1MgICAgICAgICAgICAgICBfSU9SKCdmJywgMSwgaW50KQorI2RlZmluZSBFWFQyX0lPQzMyX1NFVEZMQUdTICAgICAgICAgICAgICAgX0lPVygnZicsIDIsIGludCkKKyNkZWZpbmUgRVhUMl9JT0MzMl9HRVRWRVJTSU9OICAgICAgICAgICAgIF9JT1IoJ3YnLCAxLCBpbnQpCisjZGVmaW5lIEVYVDJfSU9DMzJfU0VUVkVSU0lPTiAgICAgICAgICAgICBfSU9XKCd2JywgMiwgaW50KQorCitzdGF0aWMgaW50IHdfbG9uZyh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGxvbmcgdmFsOworCQorCXNldF9mcyAoS0VSTkVMX0RTKTsKKwllcnIgPSBzeXNfaW9jdGwoZmQsIGNtZCwgKHVuc2lnbmVkIGxvbmcpJnZhbCk7CisJc2V0X2ZzIChvbGRfZnMpOworCWlmICghZXJyICYmIHB1dF91c2VyKHZhbCwgKHUzMiBfX3VzZXIgKiljb21wYXRfcHRyKGFyZykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gZXJyOworfQorIAorc3RhdGljIGludCByd19sb25nKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJbW1fc2VnbWVudF90IG9sZF9mcyA9IGdldF9mcygpOworCXUzMiBfX3VzZXIgKmFyZ3B0ciA9IGNvbXBhdF9wdHIoYXJnKTsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGxvbmcgdmFsOworCQorCWlmKGdldF91c2VyKHZhbCwgYXJncHRyKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJc2V0X2ZzIChLRVJORUxfRFMpOworCWVyciA9IHN5c19pb2N0bChmZCwgY21kLCAodW5zaWduZWQgbG9uZykmdmFsKTsKKwlzZXRfZnMgKG9sZF9mcyk7CisJaWYgKCFlcnIgJiYgcHV0X3VzZXIodmFsLCBhcmdwdHIpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGRvX2V4dDJfaW9jdGwodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwkvKiBUaGVzZSBhcmUganVzdCBtaXNuYW1lZCwgdGhleSBhY3R1YWxseSBnZXQvcHV0IGZyb20vdG8gdXNlciBhbiBpbnQgKi8KKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgRVhUMl9JT0MzMl9HRVRGTEFHUzogY21kID0gRVhUMl9JT0NfR0VURkxBR1M7IGJyZWFrOworCWNhc2UgRVhUMl9JT0MzMl9TRVRGTEFHUzogY21kID0gRVhUMl9JT0NfU0VURkxBR1M7IGJyZWFrOworCWNhc2UgRVhUMl9JT0MzMl9HRVRWRVJTSU9OOiBjbWQgPSBFWFQyX0lPQ19HRVRWRVJTSU9OOyBicmVhazsKKwljYXNlIEVYVDJfSU9DMzJfU0VUVkVSU0lPTjogY21kID0gRVhUMl9JT0NfU0VUVkVSU0lPTjsgYnJlYWs7CisJfQorCXJldHVybiBzeXNfaW9jdGwoZmQsIGNtZCwgKHVuc2lnbmVkIGxvbmcpY29tcGF0X3B0cihhcmcpKTsKK30KKworc3RydWN0IHZpZGVvX3R1bmVyMzIgeworCWNvbXBhdF9pbnRfdCB0dW5lcjsKKwljaGFyIG5hbWVbMzJdOworCWNvbXBhdF91bG9uZ190IHJhbmdlbG93LCByYW5nZWhpZ2g7CisJdTMyIGZsYWdzOwkvKiBJdCBpcyByZWFsbHkgdTMyIGluIHZpZGVvZGV2LmggKi8KKwl1MTYgbW9kZSwgc2lnbmFsOworfTsKKworc3RhdGljIGludCBnZXRfdmlkZW9fdHVuZXIzMihzdHJ1Y3QgdmlkZW9fdHVuZXIgKmtwLCBzdHJ1Y3QgdmlkZW9fdHVuZXIzMiBfX3VzZXIgKnVwKQoreworCWludCBpOworCisJaWYoZ2V0X3VzZXIoa3AtPnR1bmVyLCAmdXAtPnR1bmVyKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJZm9yKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJX19nZXRfdXNlcihrcC0+bmFtZVtpXSwgJnVwLT5uYW1lW2ldKTsKKwlfX2dldF91c2VyKGtwLT5yYW5nZWxvdywgJnVwLT5yYW5nZWxvdyk7CisJX19nZXRfdXNlcihrcC0+cmFuZ2VoaWdoLCAmdXAtPnJhbmdlaGlnaCk7CisJX19nZXRfdXNlcihrcC0+ZmxhZ3MsICZ1cC0+ZmxhZ3MpOworCV9fZ2V0X3VzZXIoa3AtPm1vZGUsICZ1cC0+bW9kZSk7CisJX19nZXRfdXNlcihrcC0+c2lnbmFsLCAmdXAtPnNpZ25hbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHV0X3ZpZGVvX3R1bmVyMzIoc3RydWN0IHZpZGVvX3R1bmVyICprcCwgc3RydWN0IHZpZGVvX3R1bmVyMzIgX191c2VyICp1cCkKK3sKKwlpbnQgaTsKKworCWlmKHB1dF91c2VyKGtwLT50dW5lciwgJnVwLT50dW5lcikpCisJCXJldHVybiAtRUZBVUxUOworCWZvcihpID0gMDsgaSA8IDMyOyBpKyspCisJCV9fcHV0X3VzZXIoa3AtPm5hbWVbaV0sICZ1cC0+bmFtZVtpXSk7CisJX19wdXRfdXNlcihrcC0+cmFuZ2Vsb3csICZ1cC0+cmFuZ2Vsb3cpOworCV9fcHV0X3VzZXIoa3AtPnJhbmdlaGlnaCwgJnVwLT5yYW5nZWhpZ2gpOworCV9fcHV0X3VzZXIoa3AtPmZsYWdzLCAmdXAtPmZsYWdzKTsKKwlfX3B1dF91c2VyKGtwLT5tb2RlLCAmdXAtPm1vZGUpOworCV9fcHV0X3VzZXIoa3AtPnNpZ25hbCwgJnVwLT5zaWduYWwpOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgdmlkZW9fYnVmZmVyMzIgeworCWNvbXBhdF9jYWRkcl90IGJhc2U7CisJY29tcGF0X2ludF90IGhlaWdodCwgd2lkdGgsIGRlcHRoLCBieXRlc3BlcmxpbmU7Cit9OworCitzdGF0aWMgaW50IGdldF92aWRlb19idWZmZXIzMihzdHJ1Y3QgdmlkZW9fYnVmZmVyICprcCwgc3RydWN0IHZpZGVvX2J1ZmZlcjMyIF9fdXNlciAqdXApCit7CisJdTMyIHRtcDsKKworCWlmIChnZXRfdXNlcih0bXAsICZ1cC0+YmFzZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogVGhpcyBpcyBhY3R1YWxseSBhIHBoeXNpY2FsIGFkZHJlc3Mgc3RvcmVkCisJICogYXMgYSB2b2lkIHBvaW50ZXIuCisJICovCisJa3AtPmJhc2UgPSAodm9pZCAqKSh1bnNpZ25lZCBsb25nKSB0bXA7CisKKwlfX2dldF91c2VyKGtwLT5oZWlnaHQsICZ1cC0+aGVpZ2h0KTsKKwlfX2dldF91c2VyKGtwLT53aWR0aCwgJnVwLT53aWR0aCk7CisJX19nZXRfdXNlcihrcC0+ZGVwdGgsICZ1cC0+ZGVwdGgpOworCV9fZ2V0X3VzZXIoa3AtPmJ5dGVzcGVybGluZSwgJnVwLT5ieXRlc3BlcmxpbmUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB1dF92aWRlb19idWZmZXIzMihzdHJ1Y3QgdmlkZW9fYnVmZmVyICprcCwgc3RydWN0IHZpZGVvX2J1ZmZlcjMyIF9fdXNlciAqdXApCit7CisJdTMyIHRtcCA9ICh1MzIpKCh1bnNpZ25lZCBsb25nKWtwLT5iYXNlKTsKKworCWlmKHB1dF91c2VyKHRtcCwgJnVwLT5iYXNlKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJX19wdXRfdXNlcihrcC0+aGVpZ2h0LCAmdXAtPmhlaWdodCk7CisJX19wdXRfdXNlcihrcC0+d2lkdGgsICZ1cC0+d2lkdGgpOworCV9fcHV0X3VzZXIoa3AtPmRlcHRoLCAmdXAtPmRlcHRoKTsKKwlfX3B1dF91c2VyKGtwLT5ieXRlc3BlcmxpbmUsICZ1cC0+Ynl0ZXNwZXJsaW5lKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHZpZGVvX2NsaXAzMiB7CisJczMyIHgsIHksIHdpZHRoLCBoZWlnaHQ7CS8qIEl0cyByZWFsbHkgczMyIGluIHZpZGVvZGV2LmggKi8KKwljb21wYXRfY2FkZHJfdCBuZXh0OworfTsKKworc3RydWN0IHZpZGVvX3dpbmRvdzMyIHsKKwl1MzIgeCwgeSwgd2lkdGgsIGhlaWdodCwgY2hyb21ha2V5LCBmbGFnczsKKwljb21wYXRfY2FkZHJfdCBjbGlwczsKKwljb21wYXRfaW50X3QgY2xpcGNvdW50OworfTsKKworLyogWW91IGdldCBiYWNrIGV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSBjbGlwcy4uLiAqLworc3RhdGljIGludCBwdXRfdmlkZW9fd2luZG93MzIoc3RydWN0IHZpZGVvX3dpbmRvdyAqa3AsIHN0cnVjdCB2aWRlb193aW5kb3czMiBfX3VzZXIgKnVwKQoreworCWlmKHB1dF91c2VyKGtwLT54LCAmdXAtPngpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlfX3B1dF91c2VyKGtwLT55LCAmdXAtPnkpOworCV9fcHV0X3VzZXIoa3AtPndpZHRoLCAmdXAtPndpZHRoKTsKKwlfX3B1dF91c2VyKGtwLT5oZWlnaHQsICZ1cC0+aGVpZ2h0KTsKKwlfX3B1dF91c2VyKGtwLT5jaHJvbWFrZXksICZ1cC0+Y2hyb21ha2V5KTsKKwlfX3B1dF91c2VyKGtwLT5mbGFncywgJnVwLT5mbGFncyk7CisJX19wdXRfdXNlcihrcC0+Y2xpcGNvdW50LCAmdXAtPmNsaXBjb3VudCk7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgVklESU9DR1RVTkVSMzIJCV9JT1dSKCd2Jyw0LCBzdHJ1Y3QgdmlkZW9fdHVuZXIzMikKKyNkZWZpbmUgVklESU9DU1RVTkVSMzIJCV9JT1coJ3YnLDUsIHN0cnVjdCB2aWRlb190dW5lcjMyKQorI2RlZmluZSBWSURJT0NHV0lOMzIJCV9JT1IoJ3YnLDksIHN0cnVjdCB2aWRlb193aW5kb3czMikKKyNkZWZpbmUgVklESU9DU1dJTjMyCQlfSU9XKCd2JywxMCwgc3RydWN0IHZpZGVvX3dpbmRvdzMyKQorI2RlZmluZSBWSURJT0NHRkJVRjMyCQlfSU9SKCd2JywxMSwgc3RydWN0IHZpZGVvX2J1ZmZlcjMyKQorI2RlZmluZSBWSURJT0NTRkJVRjMyCQlfSU9XKCd2JywxMiwgc3RydWN0IHZpZGVvX2J1ZmZlcjMyKQorI2RlZmluZSBWSURJT0NHRlJFUTMyCQlfSU9SKCd2JywxNCwgdTMyKQorI2RlZmluZSBWSURJT0NTRlJFUTMyCQlfSU9XKCd2JywxNSwgdTMyKQorCitlbnVtIHsKKwlNYXhDbGlwcyA9ICh+MFUtc2l6ZW9mKHN0cnVjdCB2aWRlb193aW5kb3cpKS9zaXplb2Yoc3RydWN0IHZpZGVvX2NsaXApCit9OworCitzdGF0aWMgaW50IGRvX3NldF93aW5kb3codW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgdmlkZW9fd2luZG93MzIgX191c2VyICp1cCA9IGNvbXBhdF9wdHIoYXJnKTsKKwlzdHJ1Y3QgdmlkZW9fd2luZG93IF9fdXNlciAqdnc7CisJc3RydWN0IHZpZGVvX2NsaXAgX191c2VyICpwOworCWludCBuY2xpcHM7CisJdTMyIG47CisKKwlpZiAoZ2V0X3VzZXIobmNsaXBzLCAmdXAtPmNsaXBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogUGVjdWxpYXIgaW50ZXJmYWNlLi4uICovCisJaWYgKG5jbGlwcyA8IDApCisJCW5jbGlwcyA9IFZJREVPX0NMSVBNQVBfU0laRTsKKworCWlmIChuY2xpcHMgPiBNYXhDbGlwcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl2dyA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZihzdHJ1Y3QgdmlkZW9fd2luZG93KSArCisJCQkJICAgIG5jbGlwcyAqIHNpemVvZihzdHJ1Y3QgdmlkZW9fY2xpcCkpOworCisJcCA9IG5jbGlwcyA/IChzdHJ1Y3QgdmlkZW9fY2xpcCBfX3VzZXIgKikodncgKyAxKSA6IE5VTEw7CisKKwlpZiAoZ2V0X3VzZXIobiwgJnVwLT54KSB8fCBwdXRfdXNlcihuLCAmdnctPngpIHx8CisJICAgIGdldF91c2VyKG4sICZ1cC0+eSkgfHwgcHV0X3VzZXIobiwgJnZ3LT55KSB8fAorCSAgICBnZXRfdXNlcihuLCAmdXAtPndpZHRoKSB8fCBwdXRfdXNlcihuLCAmdnctPndpZHRoKSB8fAorCSAgICBnZXRfdXNlcihuLCAmdXAtPmhlaWdodCkgfHwgcHV0X3VzZXIobiwgJnZ3LT5oZWlnaHQpIHx8CisJICAgIGdldF91c2VyKG4sICZ1cC0+Y2hyb21ha2V5KSB8fCBwdXRfdXNlcihuLCAmdnctPmNocm9tYWtleSkgfHwKKwkgICAgZ2V0X3VzZXIobiwgJnVwLT5mbGFncykgfHwgcHV0X3VzZXIobiwgJnZ3LT5mbGFncykgfHwKKwkgICAgZ2V0X3VzZXIobiwgJnVwLT5jbGlwY291bnQpIHx8IHB1dF91c2VyKG4sICZ2dy0+Y2xpcGNvdW50KSB8fAorCSAgICBnZXRfdXNlcihuLCAmdXAtPmNsaXBzKSB8fCBwdXRfdXNlcihwLCAmdnctPmNsaXBzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAobmNsaXBzKSB7CisJCXN0cnVjdCB2aWRlb19jbGlwMzIgX191c2VyICp1ID0gY29tcGF0X3B0cihuKTsKKwkJaW50IGk7CisJCWlmICghdSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlmb3IgKGkgPSAwOyBpIDwgbmNsaXBzOyBpKyssIHUrKywgcCsrKSB7CisJCQlzMzIgdjsKKwkJCWlmIChnZXRfdXNlcih2LCAmdS0+eCkgfHwKKwkJCSAgICBwdXRfdXNlcih2LCAmcC0+eCkgfHwKKwkJCSAgICBnZXRfdXNlcih2LCAmdS0+eSkgfHwKKwkJCSAgICBwdXRfdXNlcih2LCAmcC0+eSkgfHwKKwkJCSAgICBnZXRfdXNlcih2LCAmdS0+d2lkdGgpIHx8CisJCQkgICAgcHV0X3VzZXIodiwgJnAtPndpZHRoKSB8fAorCQkJICAgIGdldF91c2VyKHYsICZ1LT5oZWlnaHQpIHx8CisJCQkgICAgcHV0X3VzZXIodiwgJnAtPmhlaWdodCkgfHwKKwkJCSAgICBwdXRfdXNlcihOVUxMLCAmcC0+bmV4dCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9CisKKwlyZXR1cm4gc3lzX2lvY3RsKGZkLCBWSURJT0NTV0lOLCAodW5zaWduZWQgbG9uZylwKTsKK30KKworc3RhdGljIGludCBkb192aWRlb19pb2N0bCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXVuaW9uIHsKKwkJc3RydWN0IHZpZGVvX3R1bmVyIHZ0OworCQlzdHJ1Y3QgdmlkZW9fYnVmZmVyIHZiOworCQlzdHJ1Y3QgdmlkZW9fd2luZG93IHZ3OworCQl1bnNpZ25lZCBsb25nIHZ4OworCX0ga2FyZzsKKwltbV9zZWdtZW50X3Qgb2xkX2ZzID0gZ2V0X2ZzKCk7CisJdm9pZCBfX3VzZXIgKnVwID0gY29tcGF0X3B0cihhcmcpOworCWludCBlcnIgPSAwOworCisJLyogRmlyc3QsIGNvbnZlcnQgdGhlIGNvbW1hbmQuICovCisJc3dpdGNoKGNtZCkgeworCWNhc2UgVklESU9DR1RVTkVSMzI6IGNtZCA9IFZJRElPQ0dUVU5FUjsgYnJlYWs7CisJY2FzZSBWSURJT0NTVFVORVIzMjogY21kID0gVklESU9DU1RVTkVSOyBicmVhazsKKwljYXNlIFZJRElPQ0dXSU4zMjogY21kID0gVklESU9DR1dJTjsgYnJlYWs7CisJY2FzZSBWSURJT0NHRkJVRjMyOiBjbWQgPSBWSURJT0NHRkJVRjsgYnJlYWs7CisJY2FzZSBWSURJT0NTRkJVRjMyOiBjbWQgPSBWSURJT0NTRkJVRjsgYnJlYWs7CisJY2FzZSBWSURJT0NHRlJFUTMyOiBjbWQgPSBWSURJT0NHRlJFUTsgYnJlYWs7CisJY2FzZSBWSURJT0NTRlJFUTMyOiBjbWQgPSBWSURJT0NTRlJFUTsgYnJlYWs7CisJfTsKKworCXN3aXRjaChjbWQpIHsKKwljYXNlIFZJRElPQ1NUVU5FUjoKKwljYXNlIFZJRElPQ0dUVU5FUjoKKwkJZXJyID0gZ2V0X3ZpZGVvX3R1bmVyMzIoJmthcmcudnQsIHVwKTsKKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ1NGQlVGOgorCQllcnIgPSBnZXRfdmlkZW9fYnVmZmVyMzIoJmthcmcudmIsIHVwKTsKKwkJYnJlYWs7CisKKwljYXNlIFZJRElPQ1NGUkVROgorCQllcnIgPSBnZXRfdXNlcihrYXJnLnZ4LCAodTMyIF9fdXNlciAqKXVwKTsKKwkJYnJlYWs7CisJfTsKKwlpZihlcnIpCisJCWdvdG8gb3V0OworCisJc2V0X2ZzKEtFUk5FTF9EUyk7CisJZXJyID0gc3lzX2lvY3RsKGZkLCBjbWQsICh1bnNpZ25lZCBsb25nKSZrYXJnKTsKKwlzZXRfZnMob2xkX2ZzKTsKKworCWlmKGVyciA9PSAwKSB7CisJCXN3aXRjaChjbWQpIHsKKwkJY2FzZSBWSURJT0NHVFVORVI6CisJCQllcnIgPSBwdXRfdmlkZW9fdHVuZXIzMigma2FyZy52dCwgdXApOworCQkJYnJlYWs7CisKKwkJY2FzZSBWSURJT0NHV0lOOgorCQkJZXJyID0gcHV0X3ZpZGVvX3dpbmRvdzMyKCZrYXJnLnZ3LCB1cCk7CisJCQlicmVhazsKKworCQljYXNlIFZJRElPQ0dGQlVGOgorCQkJZXJyID0gcHV0X3ZpZGVvX2J1ZmZlcjMyKCZrYXJnLnZiLCB1cCk7CisJCQlicmVhazsKKworCQljYXNlIFZJRElPQ0dGUkVROgorCQkJZXJyID0gcHV0X3VzZXIoKCh1MzIpa2FyZy52eCksICh1MzIgX191c2VyICopdXApOworCQkJYnJlYWs7CisJCX07CisJfQorb3V0OgorCXJldHVybiBlcnI7Cit9CisKKyNpZmRlZiBDT05GSUdfTkVUCitzdGF0aWMgaW50IGRvX3Npb2Nnc3RhbXAodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgX191c2VyICp1cCA9IGNvbXBhdF9wdHIoYXJnKTsKKwlzdHJ1Y3QgdGltZXZhbCBrdHY7CisJbW1fc2VnbWVudF90IG9sZF9mcyA9IGdldF9mcygpOworCWludCBlcnI7CisKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKwllcnIgPSBzeXNfaW9jdGwoZmQsIGNtZCwgKHVuc2lnbmVkIGxvbmcpJmt0dik7CisJc2V0X2ZzKG9sZF9mcyk7CisJaWYoIWVycikgeworCQllcnIgPSBwdXRfdXNlcihrdHYudHZfc2VjLCAmdXAtPnR2X3NlYyk7CisJCWVyciB8PSBfX3B1dF91c2VyKGt0di50dl91c2VjLCAmdXAtPnR2X3VzZWMpOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdHJ1Y3QgaWZtYXAzMiB7CisJY29tcGF0X3Vsb25nX3QgbWVtX3N0YXJ0OworCWNvbXBhdF91bG9uZ190IG1lbV9lbmQ7CisJdW5zaWduZWQgc2hvcnQgYmFzZV9hZGRyOworCXVuc2lnbmVkIGNoYXIgaXJxOworCXVuc2lnbmVkIGNoYXIgZG1hOworCXVuc2lnbmVkIGNoYXIgcG9ydDsKK307CisKK3N0cnVjdCBpZnJlcTMyIHsKKyNkZWZpbmUgSUZIV0FERFJMRU4gICAgIDYKKyNkZWZpbmUgSUZOQU1TSVogICAgICAgIDE2CisgICAgICAgIHVuaW9uIHsKKyAgICAgICAgICAgICAgICBjaGFyICAgIGlmcm5fbmFtZVtJRk5BTVNJWl07ICAgICAgICAgICAgLyogaWYgbmFtZSwgZS5nLiAiZW4wIiAqLworICAgICAgICB9IGlmcl9pZnJuOworICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICAgICAgc3RydWN0ICBzb2NrYWRkciBpZnJ1X2FkZHI7CisgICAgICAgICAgICAgICAgc3RydWN0ICBzb2NrYWRkciBpZnJ1X2RzdGFkZHI7CisgICAgICAgICAgICAgICAgc3RydWN0ICBzb2NrYWRkciBpZnJ1X2Jyb2FkYWRkcjsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgIHNvY2thZGRyIGlmcnVfbmV0bWFzazsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgIHNvY2thZGRyIGlmcnVfaHdhZGRyOworICAgICAgICAgICAgICAgIHNob3J0ICAgaWZydV9mbGFnczsKKyAgICAgICAgICAgICAgICBjb21wYXRfaW50X3QgICAgIGlmcnVfaXZhbHVlOworICAgICAgICAgICAgICAgIGNvbXBhdF9pbnRfdCAgICAgaWZydV9tdHU7CisgICAgICAgICAgICAgICAgc3RydWN0ICBpZm1hcDMyIGlmcnVfbWFwOworICAgICAgICAgICAgICAgIGNoYXIgICAgaWZydV9zbGF2ZVtJRk5BTVNJWl07ICAgLyogSnVzdCBmaXRzIHRoZSBzaXplICovCisJCWNoYXIJaWZydV9uZXduYW1lW0lGTkFNU0laXTsKKyAgICAgICAgICAgICAgICBjb21wYXRfY2FkZHJfdCBpZnJ1X2RhdGE7CisJICAgIC8qIFhYWFg/IGlmcnVfc2V0dGluZ3Mgc2hvdWxkIGJlIGhlcmUgKi8KKyAgICAgICAgfSBpZnJfaWZydTsKK307CisKK3N0cnVjdCBpZmNvbmYzMiB7CisgICAgICAgIGNvbXBhdF9pbnRfdAlpZmNfbGVuOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgb2YgYnVmZmVyICAgICAgICovCisgICAgICAgIGNvbXBhdF9jYWRkcl90ICBpZmNidWY7Cit9OworCitzdGF0aWMgaW50IGRldl9pZm5hbWUzMih1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGlmcmVxMzIgaWZyMzI7CisJaW50IGVycjsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmaWZyMzIsIGNvbXBhdF9wdHIoYXJnKSwgc2l6ZW9mKGlmcjMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJZGV2ID0gZGV2X2dldF9ieV9pbmRleChpZnIzMi5pZnJfaWZpbmRleCk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJc3RybGNweShpZnIzMi5pZnJfbmFtZSwgZGV2LT5uYW1lLCBzaXplb2YoaWZyMzIuaWZyX25hbWUpKTsKKwlkZXZfcHV0KGRldik7CisJCisJZXJyID0gY29weV90b191c2VyKGNvbXBhdF9wdHIoYXJnKSwgJmlmcjMyLCBzaXplb2YoaWZyMzIpKTsKKwlyZXR1cm4gKGVyciA/IC1FRkFVTFQgOiAwKTsKK30KKworc3RhdGljIGludCBkZXZfaWZjb25mKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGlmY29uZjMyIGlmYzMyOworCXN0cnVjdCBpZmNvbmYgaWZjOworCXN0cnVjdCBpZmNvbmYgX191c2VyICp1aWZjOworCXN0cnVjdCBpZnJlcTMyIF9fdXNlciAqaWZyMzI7CisJc3RydWN0IGlmcmVxIF9fdXNlciAqaWZyOworCXVuc2lnbmVkIGludCBpLCBqOworCWludCBlcnI7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmlmYzMyLCBjb21wYXRfcHRyKGFyZyksIHNpemVvZihzdHJ1Y3QgaWZjb25mMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoaWZjMzIuaWZjYnVmID09IDApIHsKKwkJaWZjMzIuaWZjX2xlbiA9IDA7CisJCWlmYy5pZmNfbGVuID0gMDsKKwkJaWZjLmlmY19yZXEgPSBOVUxMOworCQl1aWZjID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKHN0cnVjdCBpZmNvbmYpKTsKKwl9IGVsc2UgeworCQlzaXplX3QgbGVuID0oKGlmYzMyLmlmY19sZW4gLyBzaXplb2YgKHN0cnVjdCBpZnJlcTMyKSkgKyAxKSAqCisJCQlzaXplb2YgKHN0cnVjdCBpZnJlcSk7CisJCXVpZmMgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2Yoc3RydWN0IGlmY29uZikgKyBsZW4pOworCQlpZmMuaWZjX2xlbiA9IGxlbjsKKwkJaWZyID0gaWZjLmlmY19yZXEgPSAodm9pZCBfX3VzZXIgKikodWlmYyArIDEpOworCQlpZnIzMiA9IGNvbXBhdF9wdHIoaWZjMzIuaWZjYnVmKTsKKwkJZm9yIChpID0gMDsgaSA8IGlmYzMyLmlmY19sZW47IGkgKz0gc2l6ZW9mIChzdHJ1Y3QgaWZyZXEzMikpIHsKKwkJCWlmIChjb3B5X2luX3VzZXIoaWZyLCBpZnIzMiwgc2l6ZW9mKHN0cnVjdCBpZnJlcTMyKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZnIrKzsKKwkJCWlmcjMyKys7IAorCQl9CisJfQorCWlmIChjb3B5X3RvX3VzZXIodWlmYywgJmlmYywgc2l6ZW9mKHN0cnVjdCBpZmNvbmYpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwllcnIgPSBzeXNfaW9jdGwgKGZkLCBTSU9DR0lGQ09ORiwgKHVuc2lnbmVkIGxvbmcpdWlmYyk7CQorCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmlmYywgdWlmYywgc2l6ZW9mKHN0cnVjdCBpZmNvbmYpKSkgCisJCXJldHVybiAtRUZBVUxUOworCisJaWZyID0gaWZjLmlmY19yZXE7CisJaWZyMzIgPSBjb21wYXRfcHRyKGlmYzMyLmlmY2J1Zik7CisJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBpZmMzMi5pZmNfbGVuICYmIGogPCBpZmMuaWZjX2xlbjsKKwkgICAgIGkgKz0gc2l6ZW9mIChzdHJ1Y3QgaWZyZXEzMiksIGogKz0gc2l6ZW9mIChzdHJ1Y3QgaWZyZXEpKSB7CisJCWlmIChjb3B5X2luX3VzZXIoaWZyMzIsIGlmciwgc2l6ZW9mIChzdHJ1Y3QgaWZyZXEzMikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmcjMyKys7CisJCWlmcisrOworCX0KKworCWlmIChpZmMzMi5pZmNidWYgPT0gMCkgeworCQkvKiBUcmFuc2xhdGUgZnJvbSA2NC1iaXQgc3RydWN0dXJlIG11bHRpcGxlIHRvCisJCSAqIGEgMzItYml0IG9uZS4KKwkJICovCisJCWkgPSBpZmMuaWZjX2xlbjsKKwkJaSA9ICgoaSAvIHNpemVvZihzdHJ1Y3QgaWZyZXEpKSAqIHNpemVvZihzdHJ1Y3QgaWZyZXEzMikpOworCQlpZmMzMi5pZmNfbGVuID0gaTsKKwl9IGVsc2UgeworCQlpZiAoaSA8PSBpZmMzMi5pZmNfbGVuKQorCQkJaWZjMzIuaWZjX2xlbiA9IGk7CisJCWVsc2UKKwkJCWlmYzMyLmlmY19sZW4gPSBpIC0gc2l6ZW9mIChzdHJ1Y3QgaWZyZXEzMik7CisJfQorCWlmIChjb3B5X3RvX3VzZXIoY29tcGF0X3B0cihhcmcpLCAmaWZjMzIsIHNpemVvZihzdHJ1Y3QgaWZjb25mMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBldGh0b29sX2lvY3RsKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGlmcmVxIF9fdXNlciAqaWZyOworCXN0cnVjdCBpZnJlcTMyIF9fdXNlciAqaWZyMzI7CisJdTMyIGRhdGE7CisJdm9pZCBfX3VzZXIgKmRhdGFwOworCQorCWlmciA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqaWZyKSk7CisJaWZyMzIgPSBjb21wYXRfcHRyKGFyZyk7CisKKwlpZiAoY29weV9pbl91c2VyKCZpZnItPmlmcl9uYW1lLCAmaWZyMzItPmlmcl9uYW1lLCBJRk5BTVNJWikpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGdldF91c2VyKGRhdGEsICZpZnIzMi0+aWZyX2lmcnUuaWZydV9kYXRhKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkYXRhcCA9IGNvbXBhdF9wdHIoZGF0YSk7CisJaWYgKHB1dF91c2VyKGRhdGFwLCAmaWZyLT5pZnJfaWZydS5pZnJ1X2RhdGEpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBzeXNfaW9jdGwoZmQsIGNtZCwgKHVuc2lnbmVkIGxvbmcpIGlmcik7Cit9CisKK3N0YXRpYyBpbnQgYm9uZF9pb2N0bCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBpZnJlcSBraWZyOworCXN0cnVjdCBpZnJlcSBfX3VzZXIgKnVpZnI7CisJc3RydWN0IGlmcmVxMzIgX191c2VyICppZnIzMiA9IGNvbXBhdF9wdHIoYXJnKTsKKwltbV9zZWdtZW50X3Qgb2xkX2ZzOworCWludCBlcnI7CisJdTMyIGRhdGE7CisJdm9pZCBfX3VzZXIgKmRhdGFwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NCT05ERU5TTEFWRToKKwljYXNlIFNJT0NCT05EUkVMRUFTRToKKwljYXNlIFNJT0NCT05EU0VUSFdBRERSOgorCWNhc2UgU0lPQ0JPTkRDSEFOR0VBQ1RJVkU6CisJCWlmIChjb3B5X2Zyb21fdXNlcigma2lmciwgaWZyMzIsIHNpemVvZihzdHJ1Y3QgaWZyZXEzMikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJb2xkX2ZzID0gZ2V0X2ZzKCk7CisJCXNldF9mcyAoS0VSTkVMX0RTKTsKKwkJZXJyID0gc3lzX2lvY3RsIChmZCwgY21kLCAodW5zaWduZWQgbG9uZykma2lmcik7CisJCXNldF9mcyAob2xkX2ZzKTsKKworCQlyZXR1cm4gZXJyOworCWNhc2UgU0lPQ0JPTkRTTEFWRUlORk9RVUVSWToKKwljYXNlIFNJT0NCT05ESU5GT1FVRVJZOgorCQl1aWZyID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCp1aWZyKSk7CisJCWlmIChjb3B5X2luX3VzZXIoJnVpZnItPmlmcl9uYW1lLCAmaWZyMzItPmlmcl9uYW1lLCBJRk5BTVNJWikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoZ2V0X3VzZXIoZGF0YSwgJmlmcjMyLT5pZnJfaWZydS5pZnJ1X2RhdGEpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJZGF0YXAgPSBjb21wYXRfcHRyKGRhdGEpOworCQlpZiAocHV0X3VzZXIoZGF0YXAsICZ1aWZyLT5pZnJfaWZydS5pZnJ1X2RhdGEpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0dXJuIHN5c19pb2N0bCAoZmQsIGNtZCwgKHVuc2lnbmVkIGxvbmcpdWlmcik7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfTsKK30KKworaW50IHNpb2NkZXZwcml2YXRlX2lvY3RsKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGlmcmVxIF9fdXNlciAqdV9pZnJlcTY0OworCXN0cnVjdCBpZnJlcTMyIF9fdXNlciAqdV9pZnJlcTMyID0gY29tcGF0X3B0cihhcmcpOworCWNoYXIgdG1wX2J1ZltJRk5BTVNJWl07CisJdm9pZCBfX3VzZXIgKmRhdGE2NDsKKwl1MzIgZGF0YTMyOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ0bXBfYnVmWzBdLCAmKHVfaWZyZXEzMi0+aWZyX2lmcm4uaWZybl9uYW1lWzBdKSwKKwkJCSAgIElGTkFNU0laKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKF9fZ2V0X3VzZXIoZGF0YTMyLCAmdV9pZnJlcTMyLT5pZnJfaWZydS5pZnJ1X2RhdGEpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlkYXRhNjQgPSBjb21wYXRfcHRyKGRhdGEzMik7CisKKwl1X2lmcmVxNjQgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnVfaWZyZXE2NCkpOworCisJLyogRG9uJ3QgY2hlY2sgdGhlc2UgdXNlciBhY2Nlc3NlcywganVzdCBsZXQgdGhhdCBnZXQgdHJhcHBlZAorCSAqIGluIHRoZSBpb2N0bCBoYW5kbGVyIGluc3RlYWQuCisJICovCisJaWYgKGNvcHlfdG9fdXNlcigmdV9pZnJlcTY0LT5pZnJfaWZybi5pZnJuX25hbWVbMF0sICZ0bXBfYnVmWzBdLAorCQkJIElGTkFNU0laKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKF9fcHV0X3VzZXIoZGF0YTY0LCAmdV9pZnJlcTY0LT5pZnJfaWZydS5pZnJ1X2RhdGEpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBzeXNfaW9jdGwoZmQsIGNtZCwgKHVuc2lnbmVkIGxvbmcpIHVfaWZyZXE2NCk7Cit9CisKK3N0YXRpYyBpbnQgZGV2X2lmc2lvYyh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBpZnJlcSBpZnI7CisJc3RydWN0IGlmcmVxMzIgX191c2VyICp1aWZyMzI7CisJc3RydWN0IGlmbWFwMzIgX191c2VyICp1aWZtYXAzMjsKKwltbV9zZWdtZW50X3Qgb2xkX2ZzOworCWludCBlcnI7CisJCisJdWlmcjMyID0gY29tcGF0X3B0cihhcmcpOworCXVpZm1hcDMyID0gJnVpZnIzMi0+aWZyX2lmcnUuaWZydV9tYXA7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNJT0NTSUZNQVA6CisJCWVyciA9IGNvcHlfZnJvbV91c2VyKCZpZnIsIHVpZnIzMiwgc2l6ZW9mKGlmci5pZnJfbmFtZSkpOworCQllcnIgfD0gX19nZXRfdXNlcihpZnIuaWZyX21hcC5tZW1fc3RhcnQsICZ1aWZtYXAzMi0+bWVtX3N0YXJ0KTsKKwkJZXJyIHw9IF9fZ2V0X3VzZXIoaWZyLmlmcl9tYXAubWVtX2VuZCwgJnVpZm1hcDMyLT5tZW1fZW5kKTsKKwkJZXJyIHw9IF9fZ2V0X3VzZXIoaWZyLmlmcl9tYXAuYmFzZV9hZGRyLCAmdWlmbWFwMzItPmJhc2VfYWRkcik7CisJCWVyciB8PSBfX2dldF91c2VyKGlmci5pZnJfbWFwLmlycSwgJnVpZm1hcDMyLT5pcnEpOworCQllcnIgfD0gX19nZXRfdXNlcihpZnIuaWZyX21hcC5kbWEsICZ1aWZtYXAzMi0+ZG1hKTsKKwkJZXJyIHw9IF9fZ2V0X3VzZXIoaWZyLmlmcl9tYXAucG9ydCwgJnVpZm1hcDMyLT5wb3J0KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAoY29weV9mcm9tX3VzZXIoJmlmciwgdWlmcjMyLCBzaXplb2YoKnVpZnIzMikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCX0KKwlvbGRfZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMgKEtFUk5FTF9EUyk7CisJZXJyID0gc3lzX2lvY3RsIChmZCwgY21kLCAodW5zaWduZWQgbG9uZykmaWZyKTsKKwlzZXRfZnMgKG9sZF9mcyk7CisJaWYgKCFlcnIpIHsKKwkJc3dpdGNoIChjbWQpIHsKKwkJLyogVFVOU0VUSUZGIGlzIGRlZmluZWQgYXMgX0lPVywgaXQgc2hvdWxkIGJlIF9JT1JXCisJCSAqIGFzIHRoZSBkYXRhIGlzIGNvcGllZCBiYWNrIHRvIHVzZXIgc3BhY2UsIGJ1dCB0aGF0CisJCSAqIGNhbm5vdCBiZSBmaXhlZCB3aXRob3V0IGJyZWFraW5nIGFsbCBleGlzdGluZyBhcHBzLgorCQkgKi8KKwkJY2FzZSBUVU5TRVRJRkY6CisJCWNhc2UgU0lPQ0dJRkZMQUdTOgorCQljYXNlIFNJT0NHSUZNRVRSSUM6CisJCWNhc2UgU0lPQ0dJRk1UVToKKwkJY2FzZSBTSU9DR0lGTUVNOgorCQljYXNlIFNJT0NHSUZIV0FERFI6CisJCWNhc2UgU0lPQ0dJRklOREVYOgorCQljYXNlIFNJT0NHSUZBRERSOgorCQljYXNlIFNJT0NHSUZCUkRBRERSOgorCQljYXNlIFNJT0NHSUZEU1RBRERSOgorCQljYXNlIFNJT0NHSUZORVRNQVNLOgorCQljYXNlIFNJT0NHSUZUWFFMRU46CisJCQlpZiAoY29weV90b191c2VyKHVpZnIzMiwgJmlmciwgc2l6ZW9mKCp1aWZyMzIpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJyZWFrOworCQljYXNlIFNJT0NHSUZNQVA6CisJCQllcnIgPSBjb3B5X3RvX3VzZXIodWlmcjMyLCAmaWZyLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7CisJCQllcnIgfD0gX19wdXRfdXNlcihpZnIuaWZyX21hcC5tZW1fc3RhcnQsICZ1aWZtYXAzMi0+bWVtX3N0YXJ0KTsKKwkJCWVyciB8PSBfX3B1dF91c2VyKGlmci5pZnJfbWFwLm1lbV9lbmQsICZ1aWZtYXAzMi0+bWVtX2VuZCk7CisJCQllcnIgfD0gX19wdXRfdXNlcihpZnIuaWZyX21hcC5iYXNlX2FkZHIsICZ1aWZtYXAzMi0+YmFzZV9hZGRyKTsKKwkJCWVyciB8PSBfX3B1dF91c2VyKGlmci5pZnJfbWFwLmlycSwgJnVpZm1hcDMyLT5pcnEpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoaWZyLmlmcl9tYXAuZG1hLCAmdWlmbWFwMzItPmRtYSk7CisJCQllcnIgfD0gX19wdXRfdXNlcihpZnIuaWZyX21hcC5wb3J0LCAmdWlmbWFwMzItPnBvcnQpOworCQkJaWYgKGVycikKKwkJCQllcnIgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RydWN0IHJ0ZW50cnkzMiB7CisgICAgICAgIHUzMiAgIAkJcnRfcGFkMTsKKyAgICAgICAgc3RydWN0IHNvY2thZGRyIHJ0X2RzdDsgICAgICAgICAvKiB0YXJnZXQgYWRkcmVzcyAgICAgICAgICAgICAgICovCisgICAgICAgIHN0cnVjdCBzb2NrYWRkciBydF9nYXRld2F5OyAgICAgLyogZ2F0ZXdheSBhZGRyIChSVEZfR0FURVdBWSkgICAqLworICAgICAgICBzdHJ1Y3Qgc29ja2FkZHIgcnRfZ2VubWFzazsgICAgIC8qIHRhcmdldCBuZXR3b3JrIG1hc2sgKElQKSAgICAgKi8KKyAgICAgICAgdW5zaWduZWQgc2hvcnQgIHJ0X2ZsYWdzOworICAgICAgICBzaG9ydCAgICAgICAgICAgcnRfcGFkMjsKKyAgICAgICAgdTMyICAgCQlydF9wYWQzOworICAgICAgICB1bnNpZ25lZCBjaGFyICAgcnRfdG9zOworICAgICAgICB1bnNpZ25lZCBjaGFyICAgcnRfY2xhc3M7CisgICAgICAgIHNob3J0ICAgICAgICAgICBydF9wYWQ0OworICAgICAgICBzaG9ydCAgICAgICAgICAgcnRfbWV0cmljOyAgICAgIC8qICsxIGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eSEgKi8KKyAgICAgICAgLyogY2hhciAqICovIHUzMiBydF9kZXY7ICAgICAgICAvKiBmb3JjaW5nIHRoZSBkZXZpY2UgYXQgYWRkICAgICovCisgICAgICAgIHUzMiAgIAkJcnRfbXR1OyAgICAgICAgIC8qIHBlciByb3V0ZSBNVFUvV2luZG93ICAgICAgICAgKi8KKyAgICAgICAgdTMyICAgCQlydF93aW5kb3c7ICAgICAgLyogV2luZG93IGNsYW1waW5nICAgICAgICAgICAgICAqLworICAgICAgICB1bnNpZ25lZCBzaG9ydCAgcnRfaXJ0dDsgICAgICAgIC8qIEluaXRpYWwgUlRUICAgICAgICAgICAgICAgICAgKi8KKworfTsKKworc3RydWN0IGluNl9ydG1zZzMyIHsKKwlzdHJ1Y3QgaW42X2FkZHIJCXJ0bXNnX2RzdDsKKwlzdHJ1Y3QgaW42X2FkZHIJCXJ0bXNnX3NyYzsKKwlzdHJ1Y3QgaW42X2FkZHIJCXJ0bXNnX2dhdGV3YXk7CisJdTMyCQkJcnRtc2dfdHlwZTsKKwl1MTYJCQlydG1zZ19kc3RfbGVuOworCXUxNgkJCXJ0bXNnX3NyY19sZW47CisJdTMyCQkJcnRtc2dfbWV0cmljOworCXUzMgkJCXJ0bXNnX2luZm87CisJdTMyCQkJcnRtc2dfZmxhZ3M7CisJczMyCQkJcnRtc2dfaWZpbmRleDsKK307CisKK3N0YXRpYyBpbnQgcm91dGluZ19pb2N0bCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByZXQ7CisJdm9pZCAqciA9IE5VTEw7CisJc3RydWN0IGluNl9ydG1zZyByNjsKKwlzdHJ1Y3QgcnRlbnRyeSByNDsKKwljaGFyIGRldm5hbWVbMTZdOworCXUzMiBydGRldjsKKwltbV9zZWdtZW50X3Qgb2xkX2ZzID0gZ2V0X2ZzKCk7CisJCisJc3RydWN0IHNvY2tldCAqbXlzb2NrID0gc29ja2ZkX2xvb2t1cChmZCwgJnJldCk7CisKKwlpZiAobXlzb2NrICYmIG15c29jay0+c2sgJiYgbXlzb2NrLT5zay0+c2tfZmFtaWx5ID09IEFGX0lORVQ2KSB7IC8qIGlwdjYgKi8KKwkJc3RydWN0IGluNl9ydG1zZzMyIF9fdXNlciAqdXI2ID0gY29tcGF0X3B0cihhcmcpOworCQlyZXQgPSBjb3B5X2Zyb21fdXNlciAoJnI2LnJ0bXNnX2RzdCwgJih1cjYtPnJ0bXNnX2RzdCksCisJCQkzICogc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCQlyZXQgfD0gX19nZXRfdXNlciAocjYucnRtc2dfdHlwZSwgJih1cjYtPnJ0bXNnX3R5cGUpKTsKKwkJcmV0IHw9IF9fZ2V0X3VzZXIgKHI2LnJ0bXNnX2RzdF9sZW4sICYodXI2LT5ydG1zZ19kc3RfbGVuKSk7CisJCXJldCB8PSBfX2dldF91c2VyIChyNi5ydG1zZ19zcmNfbGVuLCAmKHVyNi0+cnRtc2dfc3JjX2xlbikpOworCQlyZXQgfD0gX19nZXRfdXNlciAocjYucnRtc2dfbWV0cmljLCAmKHVyNi0+cnRtc2dfbWV0cmljKSk7CisJCXJldCB8PSBfX2dldF91c2VyIChyNi5ydG1zZ19pbmZvLCAmKHVyNi0+cnRtc2dfaW5mbykpOworCQlyZXQgfD0gX19nZXRfdXNlciAocjYucnRtc2dfZmxhZ3MsICYodXI2LT5ydG1zZ19mbGFncykpOworCQlyZXQgfD0gX19nZXRfdXNlciAocjYucnRtc2dfaWZpbmRleCwgJih1cjYtPnJ0bXNnX2lmaW5kZXgpKTsKKwkJCisJCXIgPSAodm9pZCAqKSAmcjY7CisJfSBlbHNlIHsgLyogaXB2NCAqLworCQlzdHJ1Y3QgcnRlbnRyeTMyIF9fdXNlciAqdXI0ID0gY29tcGF0X3B0cihhcmcpOworCQlyZXQgPSBjb3B5X2Zyb21fdXNlciAoJnI0LnJ0X2RzdCwgJih1cjQtPnJ0X2RzdCksCisJCQkJCTMgKiBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSk7CisJCXJldCB8PSBfX2dldF91c2VyIChyNC5ydF9mbGFncywgJih1cjQtPnJ0X2ZsYWdzKSk7CisJCXJldCB8PSBfX2dldF91c2VyIChyNC5ydF9tZXRyaWMsICYodXI0LT5ydF9tZXRyaWMpKTsKKwkJcmV0IHw9IF9fZ2V0X3VzZXIgKHI0LnJ0X210dSwgJih1cjQtPnJ0X210dSkpOworCQlyZXQgfD0gX19nZXRfdXNlciAocjQucnRfd2luZG93LCAmKHVyNC0+cnRfd2luZG93KSk7CisJCXJldCB8PSBfX2dldF91c2VyIChyNC5ydF9pcnR0LCAmKHVyNC0+cnRfaXJ0dCkpOworCQlyZXQgfD0gX19nZXRfdXNlciAocnRkZXYsICYodXI0LT5ydF9kZXYpKTsKKwkJaWYgKHJ0ZGV2KSB7CisJCQlyZXQgfD0gY29weV9mcm9tX3VzZXIgKGRldm5hbWUsIGNvbXBhdF9wdHIocnRkZXYpLCAxNSk7CisJCQlyNC5ydF9kZXYgPSBkZXZuYW1lOyBkZXZuYW1lWzE1XSA9IDA7CisJCX0gZWxzZQorCQkJcjQucnRfZGV2ID0gTlVMTDsKKworCQlyID0gKHZvaWQgKikgJnI0OworCX0KKworCWlmIChyZXQpCisJCXJldHVybiAtRUZBVUxUOworCisJc2V0X2ZzIChLRVJORUxfRFMpOworCXJldCA9IHN5c19pb2N0bCAoZmQsIGNtZCwgKHVuc2lnbmVkIGxvbmcpIHIpOworCXNldF9mcyAob2xkX2ZzKTsKKworCWlmIChteXNvY2spCisJCXNvY2tmZF9wdXQobXlzb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworc3RydWN0IGhkX2dlb21ldHJ5MzIgeworCXVuc2lnbmVkIGNoYXIgaGVhZHM7CisJdW5zaWduZWQgY2hhciBzZWN0b3JzOworCXVuc2lnbmVkIHNob3J0IGN5bGluZGVyczsKKwl1MzIgc3RhcnQ7Cit9OworICAgICAgICAgICAgICAgICAgICAgICAgCitzdGF0aWMgaW50IGhkaW9fZ2V0Z2VvKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJbW1fc2VnbWVudF90IG9sZF9mcyA9IGdldF9mcygpOworCXN0cnVjdCBoZF9nZW9tZXRyeSBnZW87CisJc3RydWN0IGhkX2dlb21ldHJ5MzIgX191c2VyICp1Z2VvOworCWludCBlcnI7CisJCisJc2V0X2ZzIChLRVJORUxfRFMpOworCWVyciA9IHN5c19pb2N0bChmZCwgSERJT19HRVRHRU8sICh1bnNpZ25lZCBsb25nKSZnZW8pOworCXNldF9mcyAob2xkX2ZzKTsKKwl1Z2VvID0gY29tcGF0X3B0cihhcmcpOworCWlmICghZXJyKSB7CisJCWVyciA9IGNvcHlfdG9fdXNlciAodWdlbywgJmdlbywgNCk7CisJCWVyciB8PSBfX3B1dF91c2VyIChnZW8uc3RhcnQsICZ1Z2VvLT5zdGFydCk7CisJfQorCXJldHVybiBlcnIgPyAtRUZBVUxUIDogMDsKK30KKworc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvMzIgeworCWNoYXIJCQlpZFsxNl07CisgICAgICAgIGNvbXBhdF9jYWRkcl90CXNtZW1fc3RhcnQ7CisJdTMyCQkJc21lbV9sZW47CisJdTMyCQkJdHlwZTsKKwl1MzIJCQl0eXBlX2F1eDsKKwl1MzIJCQl2aXN1YWw7CisJdTE2CQkJeHBhbnN0ZXA7CisJdTE2CQkJeXBhbnN0ZXA7CisJdTE2CQkJeXdyYXBzdGVwOworCXUzMgkJCWxpbmVfbGVuZ3RoOworICAgICAgICBjb21wYXRfY2FkZHJfdAltbWlvX3N0YXJ0OworCXUzMgkJCW1taW9fbGVuOworCXUzMgkJCWFjY2VsOworCXUxNgkJCXJlc2VydmVkWzNdOworfTsKKworc3RydWN0IGZiX2NtYXAzMiB7CisJdTMyCQkJc3RhcnQ7CisJdTMyCQkJbGVuOworCWNvbXBhdF9jYWRkcl90CXJlZDsKKwljb21wYXRfY2FkZHJfdAlncmVlbjsKKwljb21wYXRfY2FkZHJfdAlibHVlOworCWNvbXBhdF9jYWRkcl90CXRyYW5zcDsKK307CisKK3N0YXRpYyBpbnQgZmJfZ2V0cHV0X2NtYXAodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZmJfY21hcF91c2VyIF9fdXNlciAqY21hcDsKKwlzdHJ1Y3QgZmJfY21hcDMyIF9fdXNlciAqY21hcDMyOworCV9fdTMyIGRhdGE7CisJaW50IGVycjsKKworCWNtYXAgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKmNtYXApKTsKKwljbWFwMzIgPSBjb21wYXRfcHRyKGFyZyk7CisKKwlpZiAoY29weV9pbl91c2VyKCZjbWFwLT5zdGFydCwgJmNtYXAzMi0+c3RhcnQsIDIgKiBzaXplb2YoX191MzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoZ2V0X3VzZXIoZGF0YSwgJmNtYXAzMi0+cmVkKSB8fAorCSAgICBwdXRfdXNlcihjb21wYXRfcHRyKGRhdGEpLCAmY21hcC0+cmVkKSB8fAorCSAgICBnZXRfdXNlcihkYXRhLCAmY21hcDMyLT5ncmVlbikgfHwKKwkgICAgcHV0X3VzZXIoY29tcGF0X3B0cihkYXRhKSwgJmNtYXAtPmdyZWVuKSB8fAorCSAgICBnZXRfdXNlcihkYXRhLCAmY21hcDMyLT5ibHVlKSB8fAorCSAgICBwdXRfdXNlcihjb21wYXRfcHRyKGRhdGEpLCAmY21hcC0+Ymx1ZSkgfHwKKwkgICAgZ2V0X3VzZXIoZGF0YSwgJmNtYXAzMi0+dHJhbnNwKSB8fAorCSAgICBwdXRfdXNlcihjb21wYXRfcHRyKGRhdGEpLCAmY21hcC0+dHJhbnNwKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwllcnIgPSBzeXNfaW9jdGwoZmQsIGNtZCwgKHVuc2lnbmVkIGxvbmcpIGNtYXApOworCisJaWYgKCFlcnIpIHsKKwkJaWYgKGNvcHlfaW5fdXNlcigmY21hcDMyLT5zdGFydCwKKwkJCQkgJmNtYXAtPnN0YXJ0LAorCQkJCSAyICogc2l6ZW9mKF9fdTMyKSkpCisJCQllcnIgPSAtRUZBVUxUOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGRvX2ZzY3JlZW5pbmZvX3RvX3VzZXIoc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvICpmaXgsCisJCQkJICBzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8zMiBfX3VzZXIgKmZpeDMyKQoreworCV9fdTMyIGRhdGE7CisJaW50IGVycjsKKworCWVyciA9IGNvcHlfdG9fdXNlcigmZml4MzItPmlkLCAmZml4LT5pZCwgc2l6ZW9mKGZpeDMyLT5pZCkpOworCisJZGF0YSA9IChfX3UzMikgKHVuc2lnbmVkIGxvbmcpIGZpeC0+c21lbV9zdGFydDsKKwllcnIgfD0gcHV0X3VzZXIoZGF0YSwgJmZpeDMyLT5zbWVtX3N0YXJ0KTsKKworCWVyciB8PSBwdXRfdXNlcihmaXgtPnNtZW1fbGVuLCAmZml4MzItPnNtZW1fbGVuKTsKKwllcnIgfD0gcHV0X3VzZXIoZml4LT50eXBlLCAmZml4MzItPnR5cGUpOworCWVyciB8PSBwdXRfdXNlcihmaXgtPnR5cGVfYXV4LCAmZml4MzItPnR5cGVfYXV4KTsKKwllcnIgfD0gcHV0X3VzZXIoZml4LT52aXN1YWwsICZmaXgzMi0+dmlzdWFsKTsKKwllcnIgfD0gcHV0X3VzZXIoZml4LT54cGFuc3RlcCwgJmZpeDMyLT54cGFuc3RlcCk7CisJZXJyIHw9IHB1dF91c2VyKGZpeC0+eXBhbnN0ZXAsICZmaXgzMi0+eXBhbnN0ZXApOworCWVyciB8PSBwdXRfdXNlcihmaXgtPnl3cmFwc3RlcCwgJmZpeDMyLT55d3JhcHN0ZXApOworCWVyciB8PSBwdXRfdXNlcihmaXgtPmxpbmVfbGVuZ3RoLCAmZml4MzItPmxpbmVfbGVuZ3RoKTsKKworCWRhdGEgPSAoX191MzIpICh1bnNpZ25lZCBsb25nKSBmaXgtPm1taW9fc3RhcnQ7CisJZXJyIHw9IHB1dF91c2VyKGRhdGEsICZmaXgzMi0+bW1pb19zdGFydCk7CisKKwllcnIgfD0gcHV0X3VzZXIoZml4LT5tbWlvX2xlbiwgJmZpeDMyLT5tbWlvX2xlbik7CisJZXJyIHw9IHB1dF91c2VyKGZpeC0+YWNjZWwsICZmaXgzMi0+YWNjZWwpOworCWVyciB8PSBjb3B5X3RvX3VzZXIoZml4MzItPnJlc2VydmVkLCBmaXgtPnJlc2VydmVkLAorCQkJICAgIHNpemVvZihmaXgtPnJlc2VydmVkKSk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGZiX2dldF9mc2NyZWVuaW5mbyh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCW1tX3NlZ21lbnRfdCBvbGRfZnM7CisJc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIGZpeDsKKwlzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8zMiBfX3VzZXIgKmZpeDMyOworCWludCBlcnI7CisKKwlmaXgzMiA9IGNvbXBhdF9wdHIoYXJnKTsKKworCW9sZF9mcyA9IGdldF9mcygpOworCXNldF9mcyhLRVJORUxfRFMpOworCWVyciA9IHN5c19pb2N0bChmZCwgY21kLCAodW5zaWduZWQgbG9uZykgJmZpeCk7CisJc2V0X2ZzKG9sZF9mcyk7CisKKwlpZiAoIWVycikKKwkJZXJyID0gZG9fZnNjcmVlbmluZm9fdG9fdXNlcigmZml4LCBmaXgzMik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGZiX2lvY3RsX3RyYW5zKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IGVycjsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBGQklPR0VUX0ZTQ1JFRU5JTkZPOgorCQllcnIgPSBmYl9nZXRfZnNjcmVlbmluZm8oZmQsY21kLCBhcmcpOworCQlicmVhazsKKworICAJY2FzZSBGQklPR0VUQ01BUDoKKwljYXNlIEZCSU9QVVRDTUFQOgorCQllcnIgPSBmYl9nZXRwdXRfY21hcChmZCwgY21kLCBhcmcpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRvIHsKKwkJCXN0YXRpYyBpbnQgY291bnQ7CisJCQlpZiAoKytjb3VudCA8PSAyMCkKKwkJCQlwcmludGsoIiVzOiBVbmtub3duIGZiIGlvY3RsIGNtZCBmZCglZCkgIgorCQkJCSAgICAgICAiY21kKCUwOHgpIGFyZyglMDhseClcbiIsCisJCQkJICAgICAgIF9fRlVOQ1RJT05fXywgZmQsIGNtZCwgYXJnKTsKKwkJfSB3aGlsZSgwKTsKKwkJZXJyID0gLUVOT1NZUzsKKwkJYnJlYWs7CisJfTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaGRpb19pb2N0bF90cmFucyh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKKwl1bnNpZ25lZCBsb25nIGt2YWw7CisJdW5zaWduZWQgaW50IF9fdXNlciAqdXZwOworCWludCBlcnJvcjsKKworCXNldF9mcyhLRVJORUxfRFMpOworCWVycm9yID0gc3lzX2lvY3RsKGZkLCBjbWQsIChsb25nKSZrdmFsKTsKKwlzZXRfZnMob2xkX2ZzKTsKKworCWlmKGVycm9yID09IDApIHsKKwkJdXZwID0gY29tcGF0X3B0cihhcmcpOworCQlpZihwdXRfdXNlcihrdmFsLCB1dnApKQorCQkJZXJyb3IgPSAtRUZBVUxUOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKKwordHlwZWRlZiBzdHJ1Y3Qgc2dfaW9faGRyMzIgeworCWNvbXBhdF9pbnRfdCBpbnRlcmZhY2VfaWQ7CS8qIFtpXSAnUycgZm9yIFNDU0kgZ2VuZXJpYyAocmVxdWlyZWQpICovCisJY29tcGF0X2ludF90IGR4ZmVyX2RpcmVjdGlvbjsJLyogW2ldIGRhdGEgdHJhbnNmZXIgZGlyZWN0aW9uICAqLworCXVuc2lnbmVkIGNoYXIgY21kX2xlbjsJCS8qIFtpXSBTQ1NJIGNvbW1hbmQgbGVuZ3RoICggPD0gMTYgYnl0ZXMpICovCisJdW5zaWduZWQgY2hhciBteF9zYl9sZW47CQkvKiBbaV0gbWF4IGxlbmd0aCB0byB3cml0ZSB0byBzYnAgKi8KKwl1bnNpZ25lZCBzaG9ydCBpb3ZlY19jb3VudDsJLyogW2ldIDAgaW1wbGllcyBubyBzY2F0dGVyIGdhdGhlciAqLworCWNvbXBhdF91aW50X3QgZHhmZXJfbGVuOwkJLyogW2ldIGJ5dGUgY291bnQgb2YgZGF0YSB0cmFuc2ZlciAqLworCWNvbXBhdF91aW50X3QgZHhmZXJwOwkJLyogW2ldLCBbKmlvXSBwb2ludHMgdG8gZGF0YSB0cmFuc2ZlciBtZW1vcnkKKwkJCQkJICAgICAgb3Igc2NhdHRlciBnYXRoZXIgbGlzdCAqLworCWNvbXBhdF91cHRyX3QgY21kcDsJCS8qIFtpXSwgWyppXSBwb2ludHMgdG8gY29tbWFuZCB0byBwZXJmb3JtICovCisJY29tcGF0X3VwdHJfdCBzYnA7CQkvKiBbaV0sIFsqb10gcG9pbnRzIHRvIHNlbnNlX2J1ZmZlciBtZW1vcnkgKi8KKwljb21wYXRfdWludF90IHRpbWVvdXQ7CQkvKiBbaV0gTUFYX1VJTlQtPm5vIHRpbWVvdXQgKHVuaXQ6IG1pbGxpc2VjKSAqLworCWNvbXBhdF91aW50X3QgZmxhZ3M7CQkvKiBbaV0gMCAtPiBkZWZhdWx0LCBzZWUgU0dfRkxBRy4uLiAqLworCWNvbXBhdF9pbnRfdCBwYWNrX2lkOwkJLyogW2ktPm9dIHVudXNlZCBpbnRlcm5hbGx5IChub3JtYWxseSkgKi8KKwljb21wYXRfdXB0cl90IHVzcl9wdHI7CQkvKiBbaS0+b10gdW51c2VkIGludGVybmFsbHkgKi8KKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsJCS8qIFtvXSBzY3NpIHN0YXR1cyAqLworCXVuc2lnbmVkIGNoYXIgbWFza2VkX3N0YXR1czsJLyogW29dIHNoaWZ0ZWQsIG1hc2tlZCBzY3NpIHN0YXR1cyAqLworCXVuc2lnbmVkIGNoYXIgbXNnX3N0YXR1czsJCS8qIFtvXSBtZXNzYWdpbmcgbGV2ZWwgZGF0YSAob3B0aW9uYWwpICovCisJdW5zaWduZWQgY2hhciBzYl9sZW5fd3I7CQkvKiBbb10gYnl0ZSBjb3VudCBhY3R1YWxseSB3cml0dGVuIHRvIHNicCAqLworCXVuc2lnbmVkIHNob3J0IGhvc3Rfc3RhdHVzOwkvKiBbb10gZXJyb3JzIGZyb20gaG9zdCBhZGFwdGVyICovCisJdW5zaWduZWQgc2hvcnQgZHJpdmVyX3N0YXR1czsJLyogW29dIGVycm9ycyBmcm9tIHNvZnR3YXJlIGRyaXZlciAqLworCWNvbXBhdF9pbnRfdCByZXNpZDsJCS8qIFtvXSBkeGZlcl9sZW4gLSBhY3R1YWxfdHJhbnNmZXJyZWQgKi8KKwljb21wYXRfdWludF90IGR1cmF0aW9uOwkJLyogW29dIHRpbWUgdGFrZW4gYnkgY21kICh1bml0OiBtaWxsaXNlYykgKi8KKwljb21wYXRfdWludF90IGluZm87CQkvKiBbb10gYXV4aWxpYXJ5IGluZm9ybWF0aW9uICovCit9IHNnX2lvX2hkcjMyX3Q7ICAvKiA2NCBieXRlcyBsb25nIChvbiBzcGFyYzMyKSAqLworCit0eXBlZGVmIHN0cnVjdCBzZ19pb3ZlYzMyIHsKKwljb21wYXRfdWludF90IGlvdl9iYXNlOworCWNvbXBhdF91aW50X3QgaW92X2xlbjsKK30gc2dfaW92ZWMzMl90OworCitzdGF0aWMgaW50IHNnX2J1aWxkX2lvdmVjKHNnX2lvX2hkcl90IF9fdXNlciAqc2dpbywgdm9pZCBfX3VzZXIgKmR4ZmVycCwgdTE2IGlvdmVjX2NvdW50KQoreworCXNnX2lvdmVjX3QgX191c2VyICppb3YgPSAoc2dfaW92ZWNfdCBfX3VzZXIgKikgKHNnaW8gKyAxKTsKKwlzZ19pb3ZlYzMyX3QgX191c2VyICppb3YzMiA9IGR4ZmVycDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBpb3ZlY19jb3VudDsgaSsrKSB7CisJCXUzMiBiYXNlLCBsZW47CisKKwkJaWYgKGdldF91c2VyKGJhc2UsICZpb3YzMltpXS5pb3ZfYmFzZSkgfHwKKwkJICAgIGdldF91c2VyKGxlbiwgJmlvdjMyW2ldLmlvdl9sZW4pIHx8CisJCSAgICBwdXRfdXNlcihjb21wYXRfcHRyKGJhc2UpLCAmaW92W2ldLmlvdl9iYXNlKSB8fAorCQkgICAgcHV0X3VzZXIobGVuLCAmaW92W2ldLmlvdl9sZW4pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJaWYgKHB1dF91c2VyKGlvdiwgJnNnaW8tPmR4ZmVycCkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNnX2lvY3RsX3RyYW5zKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc2dfaW9faGRyX3QgX191c2VyICpzZ2lvOworCXNnX2lvX2hkcjMyX3QgX191c2VyICpzZ2lvMzI7CisJdTE2IGlvdmVjX2NvdW50OworCXUzMiBkYXRhOworCXZvaWQgX191c2VyICpkeGZlcnA7CisJaW50IGVycjsKKworCXNnaW8zMiA9IGNvbXBhdF9wdHIoYXJnKTsKKwlpZiAoZ2V0X3VzZXIoaW92ZWNfY291bnQsICZzZ2lvMzItPmlvdmVjX2NvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwl7CisJCXZvaWQgX191c2VyICp0b3AgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZSgwKTsKKwkJdm9pZCBfX3VzZXIgKm5ldyA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZihzZ19pb19oZHJfdCkgKworCQkJCSAgICAgICAoaW92ZWNfY291bnQgKiBzaXplb2Yoc2dfaW92ZWNfdCkpKTsKKwkJaWYgKG5ldyA+IHRvcCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXNnaW8gPSBuZXc7CisJfQorCisJLyogT2ssIG5vdyBjb25zdHJ1Y3QuICAqLworCWlmIChjb3B5X2luX3VzZXIoJnNnaW8tPmludGVyZmFjZV9pZCwgJnNnaW8zMi0+aW50ZXJmYWNlX2lkLAorCQkJICgyICogc2l6ZW9mKGludCkpICsKKwkJCSAoMiAqIHNpemVvZih1bnNpZ25lZCBjaGFyKSkgKworCQkJICgxICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSkgKworCQkJICgxICogc2l6ZW9mKHVuc2lnbmVkIGludCkpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoZ2V0X3VzZXIoZGF0YSwgJnNnaW8zMi0+ZHhmZXJwKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJZHhmZXJwID0gY29tcGF0X3B0cihkYXRhKTsKKwlpZiAoaW92ZWNfY291bnQpIHsKKwkJaWYgKHNnX2J1aWxkX2lvdmVjKHNnaW8sIGR4ZmVycCwgaW92ZWNfY291bnQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfSBlbHNlIHsKKwkJaWYgKHB1dF91c2VyKGR4ZmVycCwgJnNnaW8tPmR4ZmVycCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwl7CisJCXVuc2lnbmVkIGNoYXIgX191c2VyICpjbWRwOworCQl1bnNpZ25lZCBjaGFyIF9fdXNlciAqc2JwOworCisJCWlmIChnZXRfdXNlcihkYXRhLCAmc2dpbzMyLT5jbWRwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQljbWRwID0gY29tcGF0X3B0cihkYXRhKTsKKworCQlpZiAoZ2V0X3VzZXIoZGF0YSwgJnNnaW8zMi0+c2JwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlzYnAgPSBjb21wYXRfcHRyKGRhdGEpOworCisJCWlmIChwdXRfdXNlcihjbWRwLCAmc2dpby0+Y21kcCkgfHwKKwkJICAgIHB1dF91c2VyKHNicCwgJnNnaW8tPnNicCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoY29weV9pbl91c2VyKCZzZ2lvLT50aW1lb3V0LCAmc2dpbzMyLT50aW1lb3V0LAorCQkJIDMgKiBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGdldF91c2VyKGRhdGEsICZzZ2lvMzItPnVzcl9wdHIpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAocHV0X3VzZXIoY29tcGF0X3B0cihkYXRhKSwgJnNnaW8tPnVzcl9wdHIpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChjb3B5X2luX3VzZXIoJnNnaW8tPnN0YXR1cywgJnNnaW8zMi0+c3RhdHVzLAorCQkJICg0ICogc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKSArCisJCQkgKDIgKiBzaXplb2YodW5zaWduZWQgKHNob3J0KSkpICsKKwkJCSAoMyAqIHNpemVvZihpbnQpKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJZXJyID0gc3lzX2lvY3RsKGZkLCBjbWQsICh1bnNpZ25lZCBsb25nKSBzZ2lvKTsKKworCWlmIChlcnIgPj0gMCkgeworCQl2b2lkIF9fdXNlciAqZGF0YXA7CisKKwkJaWYgKGNvcHlfaW5fdXNlcigmc2dpbzMyLT5wYWNrX2lkLCAmc2dpby0+cGFja19pZCwKKwkJCQkgc2l6ZW9mKGludCkpIHx8CisJCSAgICBnZXRfdXNlcihkYXRhcCwgJnNnaW8tPnVzcl9wdHIpIHx8CisJCSAgICBwdXRfdXNlcigodTMyKSh1bnNpZ25lZCBsb25nKWRhdGFwLAorCQkJICAgICAmc2dpbzMyLT51c3JfcHRyKSB8fAorCQkgICAgY29weV9pbl91c2VyKCZzZ2lvMzItPnN0YXR1cywgJnNnaW8tPnN0YXR1cywKKwkJCQkgKDQgKiBzaXplb2YodW5zaWduZWQgY2hhcikpICsKKwkJCQkgKDIgKiBzaXplb2YodW5zaWduZWQgc2hvcnQpKSArCisJCQkJICgzICogc2l6ZW9mKGludCkpKSkKKwkJCWVyciA9IC1FRkFVTFQ7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RydWN0IHNvY2tfZnByb2czMiB7CisJdW5zaWduZWQgc2hvcnQJbGVuOworCWNvbXBhdF9jYWRkcl90CWZpbHRlcjsKK307CisKKyNkZWZpbmUgUFBQSU9DU1BBU1MzMglfSU9XKCd0JywgNzEsIHN0cnVjdCBzb2NrX2Zwcm9nMzIpCisjZGVmaW5lIFBQUElPQ1NBQ1RJVkUzMglfSU9XKCd0JywgNzAsIHN0cnVjdCBzb2NrX2Zwcm9nMzIpCisKK3N0YXRpYyBpbnQgcHBwX3NvY2tfZnByb2dfaW9jdGxfdHJhbnModW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc29ja19mcHJvZzMyIF9fdXNlciAqdV9mcHJvZzMyID0gY29tcGF0X3B0cihhcmcpOworCXN0cnVjdCBzb2NrX2Zwcm9nIF9fdXNlciAqdV9mcHJvZzY0ID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKHN0cnVjdCBzb2NrX2Zwcm9nKSk7CisJdm9pZCBfX3VzZXIgKmZwdHI2NDsKKwl1MzIgZnB0cjMyOworCXUxNiBmbGVuOworCisJaWYgKGdldF91c2VyKGZsZW4sICZ1X2Zwcm9nMzItPmxlbikgfHwKKwkgICAgZ2V0X3VzZXIoZnB0cjMyLCAmdV9mcHJvZzMyLT5maWx0ZXIpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWZwdHI2NCA9IGNvbXBhdF9wdHIoZnB0cjMyKTsKKworCWlmIChwdXRfdXNlcihmbGVuLCAmdV9mcHJvZzY0LT5sZW4pIHx8CisJICAgIHB1dF91c2VyKGZwdHI2NCwgJnVfZnByb2c2NC0+ZmlsdGVyKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoY21kID09IFBQUElPQ1NQQVNTMzIpCisJCWNtZCA9IFBQUElPQ1NQQVNTOworCWVsc2UKKwkJY21kID0gUFBQSU9DU0FDVElWRTsKKworCXJldHVybiBzeXNfaW9jdGwoZmQsIGNtZCwgKHVuc2lnbmVkIGxvbmcpIHVfZnByb2c2NCk7Cit9CisKK3N0cnVjdCBwcHBfb3B0aW9uX2RhdGEzMiB7CisJY29tcGF0X2NhZGRyX3QJcHRyOworCXUzMgkJCWxlbmd0aDsKKwljb21wYXRfaW50X3QJCXRyYW5zbWl0OworfTsKKyNkZWZpbmUgUFBQSU9DU0NPTVBSRVNTMzIJX0lPVygndCcsIDc3LCBzdHJ1Y3QgcHBwX29wdGlvbl9kYXRhMzIpCisKK3N0cnVjdCBwcHBfaWRsZTMyIHsKKwljb21wYXRfdGltZV90IHhtaXRfaWRsZTsKKwljb21wYXRfdGltZV90IHJlY3ZfaWRsZTsKK307CisjZGVmaW5lIFBQUElPQ0dJRExFMzIJCV9JT1IoJ3QnLCA2Mywgc3RydWN0IHBwcF9pZGxlMzIpCisKK3N0YXRpYyBpbnQgcHBwX2dpZGxlKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHBwcF9pZGxlIF9fdXNlciAqaWRsZTsKKwlzdHJ1Y3QgcHBwX2lkbGUzMiBfX3VzZXIgKmlkbGUzMjsKKwlfX2tlcm5lbF90aW1lX3QgeG1pdCwgcmVjdjsKKwlpbnQgZXJyOworCisJaWRsZSA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqaWRsZSkpOworCWlkbGUzMiA9IGNvbXBhdF9wdHIoYXJnKTsKKworCWVyciA9IHN5c19pb2N0bChmZCwgUFBQSU9DR0lETEUsICh1bnNpZ25lZCBsb25nKSBpZGxlKTsKKworCWlmICghZXJyKSB7CisJCWlmIChnZXRfdXNlcih4bWl0LCAmaWRsZS0+eG1pdF9pZGxlKSB8fAorCQkgICAgZ2V0X3VzZXIocmVjdiwgJmlkbGUtPnJlY3ZfaWRsZSkgfHwKKwkJICAgIHB1dF91c2VyKHhtaXQsICZpZGxlMzItPnhtaXRfaWRsZSkgfHwKKwkJICAgIHB1dF91c2VyKHJlY3YsICZpZGxlMzItPnJlY3ZfaWRsZSkpCisJCQllcnIgPSAtRUZBVUxUOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHBwcF9zY29tcHJlc3ModW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcHBwX29wdGlvbl9kYXRhIF9fdXNlciAqb2RhdGE7CisJc3RydWN0IHBwcF9vcHRpb25fZGF0YTMyIF9fdXNlciAqb2RhdGEzMjsKKwlfX3UzMiBkYXRhOworCXZvaWQgX191c2VyICpkYXRhcDsKKworCW9kYXRhID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpvZGF0YSkpOworCW9kYXRhMzIgPSBjb21wYXRfcHRyKGFyZyk7CisKKwlpZiAoZ2V0X3VzZXIoZGF0YSwgJm9kYXRhMzItPnB0cikpCisJCXJldHVybiAtRUZBVUxUOworCisJZGF0YXAgPSBjb21wYXRfcHRyKGRhdGEpOworCWlmIChwdXRfdXNlcihkYXRhcCwgJm9kYXRhLT5wdHIpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChjb3B5X2luX3VzZXIoJm9kYXRhLT5sZW5ndGgsICZvZGF0YTMyLT5sZW5ndGgsCisJCQkgc2l6ZW9mKF9fdTMyKSArIHNpemVvZihpbnQpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gc3lzX2lvY3RsKGZkLCBQUFBJT0NTQ09NUFJFU1MsICh1bnNpZ25lZCBsb25nKSBvZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgcHBwX2lvY3RsX3RyYW5zKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IGVycjsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBQUFBJT0NHSURMRTMyOgorCQllcnIgPSBwcHBfZ2lkbGUoZmQsIGNtZCwgYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIFBQUElPQ1NDT01QUkVTUzMyOgorCQllcnIgPSBwcHBfc2NvbXByZXNzKGZkLCBjbWQsIGFyZyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZG8geworCQkJc3RhdGljIGludCBjb3VudDsKKwkJCWlmICgrK2NvdW50IDw9IDIwKQorCQkJCXByaW50aygicHBwX2lvY3RsOiBVbmtub3duIGNtZCBmZCglZCkgIgorCQkJCSAgICAgICAiY21kKCUwOHgpIGFyZyglMDh4KVxuIiwKKwkJCQkgICAgICAgKGludClmZCwgKHVuc2lnbmVkIGludCljbWQsICh1bnNpZ25lZCBpbnQpYXJnKTsKKwkJfSB3aGlsZSgwKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfTsKKworCXJldHVybiBlcnI7Cit9CisKKworc3RydWN0IG10Z2V0MzIgeworCWNvbXBhdF9sb25nX3QJbXRfdHlwZTsKKwljb21wYXRfbG9uZ190CW10X3Jlc2lkOworCWNvbXBhdF9sb25nX3QJbXRfZHNyZWc7CisJY29tcGF0X2xvbmdfdAltdF9nc3RhdDsKKwljb21wYXRfbG9uZ190CW10X2VycmVnOworCWNvbXBhdF9kYWRkcl90CW10X2ZpbGVubzsKKwljb21wYXRfZGFkZHJfdAltdF9ibGtubzsKK307CisjZGVmaW5lIE1USU9DR0VUMzIJX0lPUignbScsIDIsIHN0cnVjdCBtdGdldDMyKQorCitzdHJ1Y3QgbXRwb3MzMiB7CisJY29tcGF0X2xvbmdfdAltdF9ibGtubzsKK307CisjZGVmaW5lIE1USU9DUE9TMzIJX0lPUignbScsIDMsIHN0cnVjdCBtdHBvczMyKQorCitzdGF0aWMgaW50IG10X2lvY3RsX3RyYW5zKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJbW1fc2VnbWVudF90IG9sZF9mcyA9IGdldF9mcygpOworCXN0cnVjdCBtdGdldCBnZXQ7CisJc3RydWN0IG10Z2V0MzIgX191c2VyICp1bWdldDMyOworCXN0cnVjdCBtdHBvcyBwb3M7CisJc3RydWN0IG10cG9zMzIgX191c2VyICp1cG9zMzI7CisJdW5zaWduZWQgbG9uZyBrY21kOworCXZvaWQgKmthcmc7CisJaW50IGVyciA9IDA7CisKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBNVElPQ1BPUzMyOgorCQlrY21kID0gTVRJT0NQT1M7CisJCWthcmcgPSAmcG9zOworCQlicmVhazsKKwljYXNlIE1USU9DR0VUMzI6CisJCWtjbWQgPSBNVElPQ0dFVDsKKwkJa2FyZyA9ICZnZXQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRvIHsKKwkJCXN0YXRpYyBpbnQgY291bnQ7CisJCQlpZiAoKytjb3VudCA8PSAyMCkKKwkJCQlwcmludGsoIm10X2lvY3RsOiBVbmtub3duIGNtZCBmZCglZCkgIgorCQkJCSAgICAgICAiY21kKCUwOHgpIGFyZyglMDh4KVxuIiwKKwkJCQkgICAgICAgKGludClmZCwgKHVuc2lnbmVkIGludCljbWQsICh1bnNpZ25lZCBpbnQpYXJnKTsKKwkJfSB3aGlsZSgwKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXNldF9mcyAoS0VSTkVMX0RTKTsKKwllcnIgPSBzeXNfaW9jdGwgKGZkLCBrY21kLCAodW5zaWduZWQgbG9uZylrYXJnKTsKKwlzZXRfZnMgKG9sZF9mcyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgTVRJT0NQT1MzMjoKKwkJdXBvczMyID0gY29tcGF0X3B0cihhcmcpOworCQllcnIgPSBfX3B1dF91c2VyKHBvcy5tdF9ibGtubywgJnVwb3MzMi0+bXRfYmxrbm8pOworCQlicmVhazsKKwljYXNlIE1USU9DR0VUMzI6CisJCXVtZ2V0MzIgPSBjb21wYXRfcHRyKGFyZyk7CisJCWVyciA9IF9fcHV0X3VzZXIoZ2V0Lm10X3R5cGUsICZ1bWdldDMyLT5tdF90eXBlKTsKKwkJZXJyIHw9IF9fcHV0X3VzZXIoZ2V0Lm10X3Jlc2lkLCAmdW1nZXQzMi0+bXRfcmVzaWQpOworCQllcnIgfD0gX19wdXRfdXNlcihnZXQubXRfZHNyZWcsICZ1bWdldDMyLT5tdF9kc3JlZyk7CisJCWVyciB8PSBfX3B1dF91c2VyKGdldC5tdF9nc3RhdCwgJnVtZ2V0MzItPm10X2dzdGF0KTsKKwkJZXJyIHw9IF9fcHV0X3VzZXIoZ2V0Lm10X2VycmVnLCAmdW1nZXQzMi0+bXRfZXJyZWcpOworCQllcnIgfD0gX19wdXRfdXNlcihnZXQubXRfZmlsZW5vLCAmdW1nZXQzMi0+bXRfZmlsZW5vKTsKKwkJZXJyIHw9IF9fcHV0X3VzZXIoZ2V0Lm10X2Jsa25vLCAmdW1nZXQzMi0+bXRfYmxrbm8pOworCQlicmVhazsKKwl9CisJcmV0dXJuIGVyciA/IC1FRkFVTFQ6IDA7Cit9CisKK3N0cnVjdCBjZHJvbV9yZWFkX2F1ZGlvMzIgeworCXVuaW9uIGNkcm9tX2FkZHIJYWRkcjsKKwl1OAkJCWFkZHJfZm9ybWF0OworCWNvbXBhdF9pbnRfdAkJbmZyYW1lczsKKwljb21wYXRfY2FkZHJfdAkJYnVmOworfTsKKworc3RydWN0IGNkcm9tX2dlbmVyaWNfY29tbWFuZDMyIHsKKwl1bnNpZ25lZCBjaGFyCWNtZFtDRFJPTV9QQUNLRVRfU0laRV07CisJY29tcGF0X2NhZGRyX3QJYnVmZmVyOworCWNvbXBhdF91aW50X3QJYnVmbGVuOworCWNvbXBhdF9pbnRfdAlzdGF0OworCWNvbXBhdF9jYWRkcl90CXNlbnNlOworCXVuc2lnbmVkIGNoYXIJZGF0YV9kaXJlY3Rpb247CisJY29tcGF0X2ludF90CXF1aWV0OworCWNvbXBhdF9pbnRfdAl0aW1lb3V0OworCWNvbXBhdF9jYWRkcl90CXJlc2VydmVkWzFdOworfTsKKyAgCitzdGF0aWMgaW50IGNkcm9tX2RvX3JlYWRfYXVkaW8odW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgY2Ryb21fcmVhZF9hdWRpbyBfX3VzZXIgKmNkcmVhZF9hdWRpbzsKKwlzdHJ1Y3QgY2Ryb21fcmVhZF9hdWRpbzMyIF9fdXNlciAqY2RyZWFkX2F1ZGlvMzI7CisJX191MzIgZGF0YTsKKwl2b2lkIF9fdXNlciAqZGF0YXA7CisKKwljZHJlYWRfYXVkaW8gPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKmNkcmVhZF9hdWRpbykpOworCWNkcmVhZF9hdWRpbzMyID0gY29tcGF0X3B0cihhcmcpOworCisJaWYgKGNvcHlfaW5fdXNlcigmY2RyZWFkX2F1ZGlvLT5hZGRyLAorCQkJICZjZHJlYWRfYXVkaW8zMi0+YWRkciwKKwkJCSAoc2l6ZW9mKCpjZHJlYWRfYXVkaW8zMikgLQorCQkJICBzaXplb2YoY29tcGF0X2NhZGRyX3QpKSkpCisJIAlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChnZXRfdXNlcihkYXRhLCAmY2RyZWFkX2F1ZGlvMzItPmJ1ZikpCisJCXJldHVybiAtRUZBVUxUOworCWRhdGFwID0gY29tcGF0X3B0cihkYXRhKTsKKwlpZiAocHV0X3VzZXIoZGF0YXAsICZjZHJlYWRfYXVkaW8tPmJ1ZikpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIHN5c19pb2N0bChmZCwgY21kLCAodW5zaWduZWQgbG9uZykgY2RyZWFkX2F1ZGlvKTsKK30KKworc3RhdGljIGludCBjZHJvbV9kb19nZW5lcmljX2NvbW1hbmQodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgY2Ryb21fZ2VuZXJpY19jb21tYW5kIF9fdXNlciAqY2djOworCXN0cnVjdCBjZHJvbV9nZW5lcmljX2NvbW1hbmQzMiBfX3VzZXIgKmNnYzMyOworCXUzMiBkYXRhOworCXVuc2lnbmVkIGNoYXIgZGlyOworCWludCBpdG1wOworCisJY2djID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpjZ2MpKTsKKwljZ2MzMiA9IGNvbXBhdF9wdHIoYXJnKTsKKworCWlmIChjb3B5X2luX3VzZXIoJmNnYy0+Y21kLCAmY2djMzItPmNtZCwgc2l6ZW9mKGNnYy0+Y21kKSkgfHwKKwkgICAgZ2V0X3VzZXIoZGF0YSwgJmNnYzMyLT5idWZmZXIpIHx8CisJICAgIHB1dF91c2VyKGNvbXBhdF9wdHIoZGF0YSksICZjZ2MtPmJ1ZmZlcikgfHwKKwkgICAgY29weV9pbl91c2VyKCZjZ2MtPmJ1ZmxlbiwgJmNnYzMyLT5idWZsZW4sCisJCQkgKHNpemVvZih1bnNpZ25lZCBpbnQpICsgc2l6ZW9mKGludCkpKSB8fAorCSAgICBnZXRfdXNlcihkYXRhLCAmY2djMzItPnNlbnNlKSB8fAorCSAgICBwdXRfdXNlcihjb21wYXRfcHRyKGRhdGEpLCAmY2djLT5zZW5zZSkgfHwKKwkgICAgZ2V0X3VzZXIoZGlyLCAmY2djMzItPmRhdGFfZGlyZWN0aW9uKSB8fAorCSAgICBwdXRfdXNlcihkaXIsICZjZ2MtPmRhdGFfZGlyZWN0aW9uKSB8fAorCSAgICBnZXRfdXNlcihpdG1wLCAmY2djMzItPnF1aWV0KSB8fAorCSAgICBwdXRfdXNlcihpdG1wLCAmY2djLT5xdWlldCkgfHwKKwkgICAgZ2V0X3VzZXIoaXRtcCwgJmNnYzMyLT50aW1lb3V0KSB8fAorCSAgICBwdXRfdXNlcihpdG1wLCAmY2djLT50aW1lb3V0KSB8fAorCSAgICBnZXRfdXNlcihkYXRhLCAmY2djMzItPnJlc2VydmVkWzBdKSB8fAorCSAgICBwdXRfdXNlcihjb21wYXRfcHRyKGRhdGEpLCAmY2djLT5yZXNlcnZlZFswXSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIHN5c19pb2N0bChmZCwgY21kLCAodW5zaWduZWQgbG9uZykgY2djKTsKK30KKworc3RhdGljIGludCBjZHJvbV9pb2N0bF90cmFucyh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBlcnI7CisKKwlzd2l0Y2goY21kKSB7CisJY2FzZSBDRFJPTVJFQURBVURJTzoKKwkJZXJyID0gY2Ryb21fZG9fcmVhZF9hdWRpbyhmZCwgY21kLCBhcmcpOworCQlicmVhazsKKworCWNhc2UgQ0RST01fU0VORF9QQUNLRVQ6CisJCWVyciA9IGNkcm9tX2RvX2dlbmVyaWNfY29tbWFuZChmZCwgY21kLCBhcmcpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRvIHsKKwkJCXN0YXRpYyBpbnQgY291bnQ7CisJCQlpZiAoKytjb3VudCA8PSAyMCkKKwkJCQlwcmludGsoImNkcm9tX2lvY3RsOiBVbmtub3duIGNtZCBmZCglZCkgIgorCQkJCSAgICAgICAiY21kKCUwOHgpIGFyZyglMDh4KVxuIiwKKwkJCQkgICAgICAgKGludClmZCwgKHVuc2lnbmVkIGludCljbWQsICh1bnNpZ25lZCBpbnQpYXJnKTsKKwkJfSB3aGlsZSgwKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0cnVjdCBsb29wX2luZm8zMiB7CisJY29tcGF0X2ludF90CWxvX251bWJlcjsgICAgICAvKiBpb2N0bCByL28gKi8KKwljb21wYXRfZGV2X3QJbG9fZGV2aWNlOyAgICAgIC8qIGlvY3RsIHIvbyAqLworCWNvbXBhdF91bG9uZ190CWxvX2lub2RlOyAgICAgICAvKiBpb2N0bCByL28gKi8KKwljb21wYXRfZGV2X3QJbG9fcmRldmljZTsgICAgIC8qIGlvY3RsIHIvbyAqLworCWNvbXBhdF9pbnRfdAlsb19vZmZzZXQ7CisJY29tcGF0X2ludF90CWxvX2VuY3J5cHRfdHlwZTsKKwljb21wYXRfaW50X3QJbG9fZW5jcnlwdF9rZXlfc2l6ZTsgICAgLyogaW9jdGwgdy9vICovCisJY29tcGF0X2ludF90CWxvX2ZsYWdzOyAgICAgICAvKiBpb2N0bCByL28gKi8KKwljaGFyCQlsb19uYW1lW0xPX05BTUVfU0laRV07CisJdW5zaWduZWQgY2hhcglsb19lbmNyeXB0X2tleVtMT19LRVlfU0laRV07IC8qIGlvY3RsIHcvbyAqLworCWNvbXBhdF91bG9uZ190CWxvX2luaXRbMl07CisJY2hhcgkJcmVzZXJ2ZWRbNF07Cit9OworCitzdGF0aWMgaW50IGxvb3Bfc3RhdHVzKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJbW1fc2VnbWVudF90IG9sZF9mcyA9IGdldF9mcygpOworCXN0cnVjdCBsb29wX2luZm8gbDsKKwlzdHJ1Y3QgbG9vcF9pbmZvMzIgX191c2VyICp1bDsKKwlpbnQgZXJyID0gLUVJTlZBTDsKKworCXVsID0gY29tcGF0X3B0cihhcmcpOworCXN3aXRjaChjbWQpIHsKKwljYXNlIExPT1BfU0VUX1NUQVRVUzoKKwkJZXJyID0gZ2V0X3VzZXIobC5sb19udW1iZXIsICZ1bC0+bG9fbnVtYmVyKTsKKwkJZXJyIHw9IF9fZ2V0X3VzZXIobC5sb19kZXZpY2UsICZ1bC0+bG9fZGV2aWNlKTsKKwkJZXJyIHw9IF9fZ2V0X3VzZXIobC5sb19pbm9kZSwgJnVsLT5sb19pbm9kZSk7CisJCWVyciB8PSBfX2dldF91c2VyKGwubG9fcmRldmljZSwgJnVsLT5sb19yZGV2aWNlKTsKKwkJZXJyIHw9IF9fY29weV9mcm9tX3VzZXIoJmwubG9fb2Zmc2V0LCAmdWwtPmxvX29mZnNldCwKKwkJICAgICAgICA4ICsgKHVuc2lnbmVkIGxvbmcpbC5sb19pbml0IC0gKHVuc2lnbmVkIGxvbmcpJmwubG9fb2Zmc2V0KTsKKwkJaWYgKGVycikgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJfSBlbHNlIHsKKwkJCXNldF9mcyAoS0VSTkVMX0RTKTsKKwkJCWVyciA9IHN5c19pb2N0bCAoZmQsIGNtZCwgKHVuc2lnbmVkIGxvbmcpJmwpOworCQkJc2V0X2ZzIChvbGRfZnMpOworCQl9CisJCWJyZWFrOworCWNhc2UgTE9PUF9HRVRfU1RBVFVTOgorCQlzZXRfZnMgKEtFUk5FTF9EUyk7CisJCWVyciA9IHN5c19pb2N0bCAoZmQsIGNtZCwgKHVuc2lnbmVkIGxvbmcpJmwpOworCQlzZXRfZnMgKG9sZF9mcyk7CisJCWlmICghZXJyKSB7CisJCQllcnIgPSBwdXRfdXNlcihsLmxvX251bWJlciwgJnVsLT5sb19udW1iZXIpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIobC5sb19kZXZpY2UsICZ1bC0+bG9fZGV2aWNlKTsKKwkJCWVyciB8PSBfX3B1dF91c2VyKGwubG9faW5vZGUsICZ1bC0+bG9faW5vZGUpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIobC5sb19yZGV2aWNlLCAmdWwtPmxvX3JkZXZpY2UpOworCQkJZXJyIHw9IF9fY29weV90b191c2VyKCZ1bC0+bG9fb2Zmc2V0LCAmbC5sb19vZmZzZXQsCisJCQkJKHVuc2lnbmVkIGxvbmcpbC5sb19pbml0IC0gKHVuc2lnbmVkIGxvbmcpJmwubG9fb2Zmc2V0KTsKKwkJCWlmIChlcnIpCisJCQkJZXJyID0gLUVGQVVMVDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OiB7CisJCXN0YXRpYyBpbnQgY291bnQ7CisJCWlmICgrK2NvdW50IDw9IDIwKQorCQkJcHJpbnRrKCIlczogVW5rbm93biBsb29wIGlvY3RsIGNtZCwgZmQoJWQpICIKKwkJCSAgICAgICAiY21kKCUwOHgpIGFyZyglMDhseClcbiIsCisJCQkgICAgICAgX19GVU5DVElPTl9fLCBmZCwgY21kLCBhcmcpOworCX0KKwl9CisJcmV0dXJuIGVycjsKK30KKworZXh0ZXJuIGludCB0dHlfaW9jdGwoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworCisjaWZkZWYgQ09ORklHX1ZUCisKK3N0YXRpYyBpbnQgdnRfY2hlY2soc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJCisJaWYgKGZpbGUtPmZfb3AtPmlvY3RsICE9IHR0eV9pb2N0bCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJICAgICAgICAgICAgICAgIAorCXR0eSA9IChzdHJ1Y3QgdHR5X3N0cnVjdCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAodHR5X3BhcmFub2lhX2NoZWNrKHR0eSwgaW5vZGUsICJ0dHlfaW9jdGwiKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJaWYgKHR0eS0+ZHJpdmVyLT5pb2N0bCAhPSB2dF9pb2N0bCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJCisJLyoKKwkgKiBUbyBoYXZlIHBlcm1pc3Npb25zIHRvIGRvIG1vc3Qgb2YgdGhlIHZ0IGlvY3Rscywgd2UgZWl0aGVyIGhhdmUKKwkgKiB0byBiZSB0aGUgb3duZXIgb2YgdGhlIHR0eSwgb3Igc3VwZXItdXNlci4KKwkgKi8KKwlpZiAoY3VycmVudC0+c2lnbmFsLT50dHkgPT0gdHR5IHx8IGNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAxOworCXJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK30KKworc3RydWN0IGNvbnNvbGVmb250ZGVzYzMyIHsKKwl1bnNpZ25lZCBzaG9ydCBjaGFyY291bnQ7ICAgICAgIC8qIGNoYXJhY3RlcnMgaW4gZm9udCAoMjU2IG9yIDUxMikgKi8KKwl1bnNpZ25lZCBzaG9ydCBjaGFyaGVpZ2h0OyAgICAgIC8qIHNjYW4gbGluZXMgcGVyIGNoYXJhY3RlciAoMS0zMikgKi8KKwljb21wYXRfY2FkZHJfdCBjaGFyZGF0YTsJLyogZm9udCBkYXRhIGluIGV4cGFuZGVkIGZvcm0gKi8KK307CisKK3N0YXRpYyBpbnQgZG9fZm9udHhfaW9jdGwodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGNvbnNvbGVmb250ZGVzYzMyIF9fdXNlciAqdXNlcl9jZmQgPSBjb21wYXRfcHRyKGFyZyk7CisJc3RydWN0IGNvbnNvbGVfZm9udF9vcCBvcDsKKwljb21wYXRfY2FkZHJfdCBkYXRhOworCWludCBpLCBwZXJtOworCisJcGVybSA9IHZ0X2NoZWNrKGZpbGUpOworCWlmIChwZXJtIDwgMCkgcmV0dXJuIHBlcm07CisJCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFBJT19GT05UWDoKKwkJaWYgKCFwZXJtKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJb3Aub3AgPSBLRF9GT05UX09QX1NFVDsKKwkJb3AuZmxhZ3MgPSAwOworCQlvcC53aWR0aCA9IDg7CisJCWlmIChnZXRfdXNlcihvcC5oZWlnaHQsICZ1c2VyX2NmZC0+Y2hhcmhlaWdodCkgfHwKKwkJICAgIGdldF91c2VyKG9wLmNoYXJjb3VudCwgJnVzZXJfY2ZkLT5jaGFyY291bnQpIHx8CisJCSAgICBnZXRfdXNlcihkYXRhLCAmdXNlcl9jZmQtPmNoYXJkYXRhKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlvcC5kYXRhID0gY29tcGF0X3B0cihkYXRhKTsKKwkJcmV0dXJuIGNvbl9mb250X29wKHZjX2NvbnNbZmdfY29uc29sZV0uZCwgJm9wKTsKKwljYXNlIEdJT19GT05UWDoKKwkJb3Aub3AgPSBLRF9GT05UX09QX0dFVDsKKwkJb3AuZmxhZ3MgPSAwOworCQlvcC53aWR0aCA9IDg7CisJCWlmIChnZXRfdXNlcihvcC5oZWlnaHQsICZ1c2VyX2NmZC0+Y2hhcmhlaWdodCkgfHwKKwkJICAgIGdldF91c2VyKG9wLmNoYXJjb3VudCwgJnVzZXJfY2ZkLT5jaGFyY291bnQpIHx8CisJCSAgICBnZXRfdXNlcihkYXRhLCAmdXNlcl9jZmQtPmNoYXJkYXRhKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoIWRhdGEpCisJCQlyZXR1cm4gMDsKKwkJb3AuZGF0YSA9IGNvbXBhdF9wdHIoZGF0YSk7CisJCWkgPSBjb25fZm9udF9vcCh2Y19jb25zW2ZnX2NvbnNvbGVdLmQsICZvcCk7CisJCWlmIChpKQorCQkJcmV0dXJuIGk7CisJCWlmIChwdXRfdXNlcihvcC5oZWlnaHQsICZ1c2VyX2NmZC0+Y2hhcmhlaWdodCkgfHwKKwkJICAgIHB1dF91c2VyKG9wLmNoYXJjb3VudCwgJnVzZXJfY2ZkLT5jaGFyY291bnQpIHx8CisJCSAgICBwdXRfdXNlcigoY29tcGF0X2NhZGRyX3QpKHVuc2lnbmVkIGxvbmcpb3AuZGF0YSwKKwkJCQkmdXNlcl9jZmQtPmNoYXJkYXRhKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0cnVjdCBjb25zb2xlX2ZvbnRfb3AzMiB7CisJY29tcGF0X3VpbnRfdCBvcDsgICAgICAgIC8qIG9wZXJhdGlvbiBjb2RlIEtEX0ZPTlRfT1BfKiAqLworCWNvbXBhdF91aW50X3QgZmxhZ3M7ICAgICAvKiBLRF9GT05UX0ZMQUdfKiAqLworCWNvbXBhdF91aW50X3Qgd2lkdGgsIGhlaWdodDsgICAgIC8qIGZvbnQgc2l6ZSAqLworCWNvbXBhdF91aW50X3QgY2hhcmNvdW50OworCWNvbXBhdF9jYWRkcl90IGRhdGE7ICAgIC8qIGZvbnQgZGF0YSB3aXRoIGhlaWdodCBmaXhlZCB0byAzMiAqLworfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK3N0YXRpYyBpbnQgZG9fa2Rmb250b3BfaW9jdGwodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGNvbnNvbGVfZm9udF9vcCBvcDsKKwlzdHJ1Y3QgY29uc29sZV9mb250X29wMzIgX191c2VyICpmb250b3AgPSBjb21wYXRfcHRyKGFyZyk7CisJaW50IHBlcm0gPSB2dF9jaGVjayhmaWxlKSwgaTsKKwlzdHJ1Y3QgdmNfZGF0YSAqdmM7CisJCisJaWYgKHBlcm0gPCAwKSByZXR1cm4gcGVybTsKKwkKKwlpZiAoY29weV9mcm9tX3VzZXIoJm9wLCBmb250b3AsIHNpemVvZihzdHJ1Y3QgY29uc29sZV9mb250X29wMzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKCFwZXJtICYmIG9wLm9wICE9IEtEX0ZPTlRfT1BfR0VUKQorCQlyZXR1cm4gLUVQRVJNOworCW9wLmRhdGEgPSBjb21wYXRfcHRyKCgoc3RydWN0IGNvbnNvbGVfZm9udF9vcDMyICopJm9wKS0+ZGF0YSk7CisJb3AuZmxhZ3MgfD0gS0RfRk9OVF9GTEFHX09MRDsKKwl2YyA9ICgoc3RydWN0IHR0eV9zdHJ1Y3QgKilmaWxlLT5wcml2YXRlX2RhdGEpLT5kcml2ZXJfZGF0YTsKKwlpID0gY29uX2ZvbnRfb3AodmMsICZvcCk7CisJaWYgKGkpCisJCXJldHVybiBpOworCSgoc3RydWN0IGNvbnNvbGVfZm9udF9vcDMyICopJm9wKS0+ZGF0YSA9ICh1bnNpZ25lZCBsb25nKW9wLmRhdGE7CisJaWYgKGNvcHlfdG9fdXNlcihmb250b3AsICZvcCwgc2l6ZW9mKHN0cnVjdCBjb25zb2xlX2ZvbnRfb3AzMikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHVuaW1hcGRlc2MzMiB7CisJdW5zaWduZWQgc2hvcnQgZW50cnlfY3Q7CisJY29tcGF0X2NhZGRyX3QgZW50cmllczsKK307CisKK3N0YXRpYyBpbnQgZG9fdW5pbWFwX2lvY3RsKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB1bmltYXBkZXNjMzIgdG1wOworCXN0cnVjdCB1bmltYXBkZXNjMzIgX191c2VyICp1c2VyX3VkID0gY29tcGF0X3B0cihhcmcpOworCWludCBwZXJtID0gdnRfY2hlY2soZmlsZSk7CisJCisJaWYgKHBlcm0gPCAwKSByZXR1cm4gcGVybTsKKwlpZiAoY29weV9mcm9tX3VzZXIoJnRtcCwgdXNlcl91ZCwgc2l6ZW9mIHRtcCkpCisJCXJldHVybiAtRUZBVUxUOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBQSU9fVU5JTUFQOgorCQlpZiAoIXBlcm0pIHJldHVybiAtRVBFUk07CisJCXJldHVybiBjb25fc2V0X3VuaW1hcCh2Y19jb25zW2ZnX2NvbnNvbGVdLmQsIHRtcC5lbnRyeV9jdCwgY29tcGF0X3B0cih0bXAuZW50cmllcykpOworCWNhc2UgR0lPX1VOSU1BUDoKKwkJcmV0dXJuIGNvbl9nZXRfdW5pbWFwKHZjX2NvbnNbZmdfY29uc29sZV0uZCwgdG1wLmVudHJ5X2N0LCAmKHVzZXJfdWQtPmVudHJ5X2N0KSwgY29tcGF0X3B0cih0bXAuZW50cmllcykpOworCX0KKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8qIENPTkZJR19WVCAqLworCitzdGF0aWMgaW50IGRvX3NtYl9nZXRtb3VudHVpZCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKKwlfX2tlcm5lbF91aWRfdCBrdWlkOworCWludCBlcnI7CisKKwljbWQgPSBTTUJfSU9DX0dFVE1PVU5UVUlEOworCisJc2V0X2ZzKEtFUk5FTF9EUyk7CisJZXJyID0gc3lzX2lvY3RsKGZkLCBjbWQsICh1bnNpZ25lZCBsb25nKSZrdWlkKTsKKwlzZXRfZnMob2xkX2ZzKTsKKworCWlmIChlcnIgPj0gMCkKKwkJZXJyID0gcHV0X3VzZXIoa3VpZCwgKGNvbXBhdF91aWRfdCBfX3VzZXIgKiljb21wYXRfcHRyKGFyZykpOworCisJcmV0dXJuIGVycjsKK30KKworc3RydWN0IGF0bWlmX3Npb2MzMiB7CisgICAgICAgIGNvbXBhdF9pbnRfdAludW1iZXI7CisgICAgICAgIGNvbXBhdF9pbnRfdAlsZW5ndGg7CisgICAgICAgIGNvbXBhdF9jYWRkcl90CWFyZzsKK307CisKK3N0cnVjdCBhdG1faW9idWYzMiB7CisJY29tcGF0X2ludF90CWxlbmd0aDsKKwljb21wYXRfY2FkZHJfdAlidWZmZXI7Cit9OworCisjZGVmaW5lIEFUTV9HRVRMSU5LUkFURTMyIF9JT1coJ2EnLCBBVE1JT0NfSVRGKzEsIHN0cnVjdCBhdG1pZl9zaW9jMzIpCisjZGVmaW5lIEFUTV9HRVROQU1FUzMyICAgIF9JT1coJ2EnLCBBVE1JT0NfSVRGKzMsIHN0cnVjdCBhdG1faW9idWYzMikKKyNkZWZpbmUgQVRNX0dFVFRZUEUzMiAgICAgX0lPVygnYScsIEFUTUlPQ19JVEYrNCwgc3RydWN0IGF0bWlmX3Npb2MzMikKKyNkZWZpbmUgQVRNX0dFVEVTSTMyCSAgX0lPVygnYScsIEFUTUlPQ19JVEYrNSwgc3RydWN0IGF0bWlmX3Npb2MzMikKKyNkZWZpbmUgQVRNX0dFVEFERFIzMgkgIF9JT1coJ2EnLCBBVE1JT0NfSVRGKzYsIHN0cnVjdCBhdG1pZl9zaW9jMzIpCisjZGVmaW5lIEFUTV9SU1RBRERSMzIJICBfSU9XKCdhJywgQVRNSU9DX0lURis3LCBzdHJ1Y3QgYXRtaWZfc2lvYzMyKQorI2RlZmluZSBBVE1fQUREQUREUjMyCSAgX0lPVygnYScsIEFUTUlPQ19JVEYrOCwgc3RydWN0IGF0bWlmX3Npb2MzMikKKyNkZWZpbmUgQVRNX0RFTEFERFIzMgkgIF9JT1coJ2EnLCBBVE1JT0NfSVRGKzksIHN0cnVjdCBhdG1pZl9zaW9jMzIpCisjZGVmaW5lIEFUTV9HRVRDSVJBTkdFMzIgIF9JT1coJ2EnLCBBVE1JT0NfSVRGKzEwLCBzdHJ1Y3QgYXRtaWZfc2lvYzMyKQorI2RlZmluZSBBVE1fU0VUQ0lSQU5HRTMyICBfSU9XKCdhJywgQVRNSU9DX0lURisxMSwgc3RydWN0IGF0bWlmX3Npb2MzMikKKyNkZWZpbmUgQVRNX1NFVEVTSTMyICAgICAgX0lPVygnYScsIEFUTUlPQ19JVEYrMTIsIHN0cnVjdCBhdG1pZl9zaW9jMzIpCisjZGVmaW5lIEFUTV9TRVRFU0lGMzIgICAgIF9JT1coJ2EnLCBBVE1JT0NfSVRGKzEzLCBzdHJ1Y3QgYXRtaWZfc2lvYzMyKQorI2RlZmluZSBBVE1fR0VUU1RBVDMyICAgICBfSU9XKCdhJywgQVRNSU9DX1NBUkNPTSswLCBzdHJ1Y3QgYXRtaWZfc2lvYzMyKQorI2RlZmluZSBBVE1fR0VUU1RBVFozMiAgICBfSU9XKCdhJywgQVRNSU9DX1NBUkNPTSsxLCBzdHJ1Y3QgYXRtaWZfc2lvYzMyKQorI2RlZmluZSBBVE1fR0VUTE9PUDMyCSAgX0lPVygnYScsIEFUTUlPQ19TQVJDT00rMiwgc3RydWN0IGF0bWlmX3Npb2MzMikKKyNkZWZpbmUgQVRNX1NFVExPT1AzMgkgIF9JT1coJ2EnLCBBVE1JT0NfU0FSQ09NKzMsIHN0cnVjdCBhdG1pZl9zaW9jMzIpCisjZGVmaW5lIEFUTV9RVUVSWUxPT1AzMgkgIF9JT1coJ2EnLCBBVE1JT0NfU0FSQ09NKzQsIHN0cnVjdCBhdG1pZl9zaW9jMzIpCisKK3N0YXRpYyBzdHJ1Y3QgeworICAgICAgICB1bnNpZ25lZCBpbnQgY21kMzI7CisgICAgICAgIHVuc2lnbmVkIGludCBjbWQ7Cit9IGF0bV9pb2N0bF9tYXBbXSA9IHsKKyAgICAgICAgeyBBVE1fR0VUTElOS1JBVEUzMiwgQVRNX0dFVExJTktSQVRFIH0sCisJeyBBVE1fR0VUTkFNRVMzMiwgICAgQVRNX0dFVE5BTUVTIH0sCisgICAgICAgIHsgQVRNX0dFVFRZUEUzMiwgICAgIEFUTV9HRVRUWVBFIH0sCisgICAgICAgIHsgQVRNX0dFVEVTSTMyLCAgICAgIEFUTV9HRVRFU0kgfSwKKyAgICAgICAgeyBBVE1fR0VUQUREUjMyLCAgICAgQVRNX0dFVEFERFIgfSwKKyAgICAgICAgeyBBVE1fUlNUQUREUjMyLCAgICAgQVRNX1JTVEFERFIgfSwKKyAgICAgICAgeyBBVE1fQUREQUREUjMyLCAgICAgQVRNX0FEREFERFIgfSwKKyAgICAgICAgeyBBVE1fREVMQUREUjMyLCAgICAgQVRNX0RFTEFERFIgfSwKKyAgICAgICAgeyBBVE1fR0VUQ0lSQU5HRTMyLCAgQVRNX0dFVENJUkFOR0UgfSwKKwl7IEFUTV9TRVRDSVJBTkdFMzIsICBBVE1fU0VUQ0lSQU5HRSB9LAorCXsgQVRNX1NFVEVTSTMyLCAgICAgIEFUTV9TRVRFU0kgfSwKKwl7IEFUTV9TRVRFU0lGMzIsICAgICBBVE1fU0VURVNJRiB9LAorCXsgQVRNX0dFVFNUQVQzMiwgICAgIEFUTV9HRVRTVEFUIH0sCisJeyBBVE1fR0VUU1RBVFozMiwgICAgQVRNX0dFVFNUQVRaIH0sCisJeyBBVE1fR0VUTE9PUDMyLCAgICAgQVRNX0dFVExPT1AgfSwKKwl7IEFUTV9TRVRMT09QMzIsICAgICBBVE1fU0VUTE9PUCB9LAorCXsgQVRNX1FVRVJZTE9PUDMyLCAgIEFUTV9RVUVSWUxPT1AgfQorfTsKKworI2RlZmluZSBOUl9BVE1fSU9DVEwgKHNpemVvZihhdG1faW9jdGxfbWFwKS9zaXplb2YoYXRtX2lvY3RsX21hcFswXSkpCisKKworc3RhdGljIGludCBkb19hdG1faW9idWYodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgYXRtX2lvYnVmICAgX191c2VyICppb2J1ZjsKKwlzdHJ1Y3QgYXRtX2lvYnVmMzIgX191c2VyICppb2J1ZjMyOworCXUzMiBkYXRhOworCXZvaWQgX191c2VyICpkYXRhcDsKKwlpbnQgbGVuLCBlcnI7CisKKwlpb2J1ZiA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqaW9idWYpKTsKKwlpb2J1ZjMyID0gY29tcGF0X3B0cihhcmcpOworCisJaWYgKGdldF91c2VyKGxlbiwgJmlvYnVmMzItPmxlbmd0aCkgfHwKKwkgICAgZ2V0X3VzZXIoZGF0YSwgJmlvYnVmMzItPmJ1ZmZlcikpCisJCXJldHVybiAtRUZBVUxUOworCWRhdGFwID0gY29tcGF0X3B0cihkYXRhKTsKKwlpZiAocHV0X3VzZXIobGVuLCAmaW9idWYtPmxlbmd0aCkgfHwKKwkgICAgcHV0X3VzZXIoZGF0YXAsICZpb2J1Zi0+YnVmZmVyKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwllcnIgPSBzeXNfaW9jdGwoZmQsIGNtZCwgKHVuc2lnbmVkIGxvbmcpaW9idWYpOworCisJaWYgKCFlcnIpIHsKKwkJaWYgKGNvcHlfaW5fdXNlcigmaW9idWYzMi0+bGVuZ3RoLCAmaW9idWYtPmxlbmd0aCwKKwkJCQkgc2l6ZW9mKGludCkpKQorCQkJZXJyID0gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGRvX2F0bWlmX3Npb2ModW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKyAgICAgICAgc3RydWN0IGF0bWlmX3Npb2MgICBfX3VzZXIgKnNpb2M7CisJc3RydWN0IGF0bWlmX3Npb2MzMiBfX3VzZXIgKnNpb2MzMjsKKwl1MzIgZGF0YTsKKwl2b2lkIF9fdXNlciAqZGF0YXA7CisJaW50IGVycjsKKyAgICAgICAgCisJc2lvYyA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqc2lvYykpOworCXNpb2MzMiA9IGNvbXBhdF9wdHIoYXJnKTsKKworCWlmIChjb3B5X2luX3VzZXIoJnNpb2MtPm51bWJlciwgJnNpb2MzMi0+bnVtYmVyLCAyICogc2l6ZW9mKGludCkpIHx8CisJICAgIGdldF91c2VyKGRhdGEsICZzaW9jMzItPmFyZykpCisJCXJldHVybiAtRUZBVUxUOworCWRhdGFwID0gY29tcGF0X3B0cihkYXRhKTsKKwlpZiAocHV0X3VzZXIoZGF0YXAsICZzaW9jLT5hcmcpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWVyciA9IHN5c19pb2N0bChmZCwgY21kLCAodW5zaWduZWQgbG9uZykgc2lvYyk7CisKKwlpZiAoIWVycikgeworCQlpZiAoY29weV9pbl91c2VyKCZzaW9jMzItPmxlbmd0aCwgJnNpb2MtPmxlbmd0aCwKKwkJCQkgc2l6ZW9mKGludCkpKQorCQkJZXJyID0gLUVGQVVMVDsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBkb19hdG1faW9jdGwodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kMzIsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworICAgICAgICBpbnQgaTsKKyAgICAgICAgdW5zaWduZWQgaW50IGNtZCA9IDA7CisgICAgICAgIAorCXN3aXRjaCAoY21kMzIpIHsKKwljYXNlIFNPTkVUX0dFVFNUQVQ6CisJY2FzZSBTT05FVF9HRVRTVEFUWjoKKwljYXNlIFNPTkVUX0dFVERJQUc6CisJY2FzZSBTT05FVF9TRVRESUFHOgorCWNhc2UgU09ORVRfQ0xSRElBRzoKKwljYXNlIFNPTkVUX1NFVEZSQU1JTkc6CisJY2FzZSBTT05FVF9HRVRGUkFNSU5HOgorCWNhc2UgU09ORVRfR0VURlJTRU5TRToKKwkJcmV0dXJuIGRvX2F0bWlmX3Npb2MoZmQsIGNtZDMyLCBhcmcpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBOUl9BVE1fSU9DVEw7IGkrKykgeworCQlpZiAoY21kMzIgPT0gYXRtX2lvY3RsX21hcFtpXS5jbWQzMikgeworCQkJY21kID0gYXRtX2lvY3RsX21hcFtpXS5jbWQ7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoaSA9PSBOUl9BVE1fSU9DVEwpCisJICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgCisgICAgICAgIHN3aXRjaCAoY21kKSB7CisJY2FzZSBBVE1fR0VUTkFNRVM6CisJCXJldHVybiBkb19hdG1faW9idWYoZmQsIGNtZCwgYXJnKTsKKwkgICAgCisJY2FzZSBBVE1fR0VUTElOS1JBVEU6CisgICAgICAgIGNhc2UgQVRNX0dFVFRZUEU6CisgICAgICAgIGNhc2UgQVRNX0dFVEVTSToKKyAgICAgICAgY2FzZSBBVE1fR0VUQUREUjoKKyAgICAgICAgY2FzZSBBVE1fUlNUQUREUjoKKyAgICAgICAgY2FzZSBBVE1fQUREQUREUjoKKyAgICAgICAgY2FzZSBBVE1fREVMQUREUjoKKyAgICAgICAgY2FzZSBBVE1fR0VUQ0lSQU5HRToKKwljYXNlIEFUTV9TRVRDSVJBTkdFOgorCWNhc2UgQVRNX1NFVEVTSToKKwljYXNlIEFUTV9TRVRFU0lGOgorCWNhc2UgQVRNX0dFVFNUQVQ6CisJY2FzZSBBVE1fR0VUU1RBVFo6CisJY2FzZSBBVE1fR0VUTE9PUDoKKwljYXNlIEFUTV9TRVRMT09QOgorCWNhc2UgQVRNX1FVRVJZTE9PUDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZG9fYXRtaWZfc2lvYyhmZCwgY21kLCBhcmcpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBfX2F0dHJpYnV0ZV91c2VkX18gaW50IAorcmV0X2VpbnZhbCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGJyb2tlbl9ibGtnZXRzaXplKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJLyogVGhlIG1rc3dhcCBiaW5hcnkgaGFyZCBjb2RlcyBpdCB0byBJbnRlbCB2YWx1ZSA6LSgoKCAqLworCXJldHVybiB3X2xvbmcoZmQsIEJMS0dFVFNJWkUsIGFyZyk7Cit9CisKK3N0cnVjdCBibGtwZ19pb2N0bF9hcmczMiB7CisJY29tcGF0X2ludF90IG9wOworCWNvbXBhdF9pbnRfdCBmbGFnczsKKwljb21wYXRfaW50X3QgZGF0YWxlbjsKKwljb21wYXRfY2FkZHJfdCBkYXRhOworfTsKKworc3RhdGljIGludCBibGtwZ19pb2N0bF90cmFucyh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBibGtwZ19pb2N0bF9hcmczMiBfX3VzZXIgKnVhMzIgPSBjb21wYXRfcHRyKGFyZyk7CisJc3RydWN0IGJsa3BnX2lvY3RsX2FyZyBfX3VzZXIgKmEgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKmEpKTsKKwljb21wYXRfY2FkZHJfdCB1ZGF0YTsKKwljb21wYXRfaW50X3QgbjsKKwlpbnQgZXJyOworCQorCWVyciA9IGdldF91c2VyKG4sICZ1YTMyLT5vcCk7CisJZXJyIHw9IHB1dF91c2VyKG4sICZhLT5vcCk7CisJZXJyIHw9IGdldF91c2VyKG4sICZ1YTMyLT5mbGFncyk7CisJZXJyIHw9IHB1dF91c2VyKG4sICZhLT5mbGFncyk7CisJZXJyIHw9IGdldF91c2VyKG4sICZ1YTMyLT5kYXRhbGVuKTsKKwllcnIgfD0gcHV0X3VzZXIobiwgJmEtPmRhdGFsZW4pOworCWVyciB8PSBnZXRfdXNlcih1ZGF0YSwgJnVhMzItPmRhdGEpOworCWVyciB8PSBwdXRfdXNlcihjb21wYXRfcHRyKHVkYXRhKSwgJmEtPmRhdGEpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gc3lzX2lvY3RsKGZkLCBjbWQsICh1bnNpZ25lZCBsb25nKWEpOworfQorCitzdGF0aWMgaW50IGlvY19zZXR0aW1lb3V0KHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIHJ3X2xvbmcoZmQsIEFVVE9GU19JT0NfU0VUVElNRU9VVCwgYXJnKTsKK30KKworLyogRml4IHNpemVvZihzaXplb2YoKSkgYnJlYWthZ2UgKi8KKyNkZWZpbmUgQkxLQlNaR0VUXzMyICAgX0lPUigweDEyLDExMixpbnQpCisjZGVmaW5lIEJMS0JTWlNFVF8zMiAgIF9JT1coMHgxMiwxMTMsaW50KQorI2RlZmluZSBCTEtHRVRTSVpFNjRfMzIgICAgICAgIF9JT1IoMHgxMiwxMTQsaW50KQorCitzdGF0aWMgaW50IGRvX2Jsa2JzemdldCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworICAgICAgIHJldHVybiBzeXNfaW9jdGwoZmQsIEJMS0JTWkdFVCwgKHVuc2lnbmVkIGxvbmcpY29tcGF0X3B0cihhcmcpKTsKK30KKworc3RhdGljIGludCBkb19ibGtic3pzZXQodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKyAgICAgICByZXR1cm4gc3lzX2lvY3RsKGZkLCBCTEtCU1pTRVQsICh1bnNpZ25lZCBsb25nKWNvbXBhdF9wdHIoYXJnKSk7Cit9CisKK3N0YXRpYyBpbnQgZG9fYmxrZ2V0c2l6ZTY0KHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisgICAgICAgcmV0dXJuIHN5c19pb2N0bChmZCwgQkxLR0VUU0laRTY0LCAodW5zaWduZWQgbG9uZyljb21wYXRfcHRyKGFyZykpOworfQorCisvKiBCbHVldG9vdGggaW9jdGxzICovCisjZGVmaW5lIEhDSVVBUlRTRVRQUk9UTwlfSU9XKCdVJywgMjAwLCBpbnQpCisjZGVmaW5lIEhDSVVBUlRHRVRQUk9UTwlfSU9SKCdVJywgMjAxLCBpbnQpCisKKyNkZWZpbmUgQk5FUENPTk5BREQJX0lPVygnQicsIDIwMCwgaW50KQorI2RlZmluZSBCTkVQQ09OTkRFTAlfSU9XKCdCJywgMjAxLCBpbnQpCisjZGVmaW5lIEJORVBHRVRDT05OTElTVAlfSU9SKCdCJywgMjEwLCBpbnQpCisjZGVmaW5lIEJORVBHRVRDT05OSU5GTwlfSU9SKCdCJywgMjExLCBpbnQpCisKKyNkZWZpbmUgQ01UUENPTk5BREQJX0lPVygnQycsIDIwMCwgaW50KQorI2RlZmluZSBDTVRQQ09OTkRFTAlfSU9XKCdDJywgMjAxLCBpbnQpCisjZGVmaW5lIENNVFBHRVRDT05OTElTVAlfSU9SKCdDJywgMjEwLCBpbnQpCisjZGVmaW5lIENNVFBHRVRDT05OSU5GTwlfSU9SKCdDJywgMjExLCBpbnQpCisKKyNkZWZpbmUgSElEUENPTk5BREQJX0lPVygnSCcsIDIwMCwgaW50KQorI2RlZmluZSBISURQQ09OTkRFTAlfSU9XKCdIJywgMjAxLCBpbnQpCisjZGVmaW5lIEhJRFBHRVRDT05OTElTVAlfSU9SKCdIJywgMjEwLCBpbnQpCisjZGVmaW5lIEhJRFBHRVRDT05OSU5GTwlfSU9SKCdIJywgMjExLCBpbnQpCisKK3N0cnVjdCBmbG9wcHlfc3RydWN0MzIgeworCWNvbXBhdF91aW50X3QJc2l6ZTsKKwljb21wYXRfdWludF90CXNlY3Q7CisJY29tcGF0X3VpbnRfdAloZWFkOworCWNvbXBhdF91aW50X3QJdHJhY2s7CisJY29tcGF0X3VpbnRfdAlzdHJldGNoOworCXVuc2lnbmVkIGNoYXIJZ2FwOworCXVuc2lnbmVkIGNoYXIJcmF0ZTsKKwl1bnNpZ25lZCBjaGFyCXNwZWMxOworCXVuc2lnbmVkIGNoYXIJZm10X2dhcDsKKwljb25zdCBjb21wYXRfY2FkZHJfdCBuYW1lOworfTsKKworc3RydWN0IGZsb3BweV9kcml2ZV9wYXJhbXMzMiB7CisJY2hhcgkJY21vczsKKwljb21wYXRfdWxvbmdfdAltYXhfZHRyOworCWNvbXBhdF91bG9uZ190CWhsdDsKKwljb21wYXRfdWxvbmdfdAlodXQ7CisJY29tcGF0X3Vsb25nX3QJc3J0OworCWNvbXBhdF91bG9uZ190CXNwaW51cDsKKwljb21wYXRfdWxvbmdfdAlzcGluZG93bjsKKwl1bnNpZ25lZCBjaGFyCXNwaW5kb3duX29mZnNldDsKKwl1bnNpZ25lZCBjaGFyCXNlbGVjdF9kZWxheTsKKwl1bnNpZ25lZCBjaGFyCXJwczsKKwl1bnNpZ25lZCBjaGFyCXRyYWNrczsKKwljb21wYXRfdWxvbmdfdAl0aW1lb3V0OworCXVuc2lnbmVkIGNoYXIJaW50ZXJsZWF2ZV9zZWN0OworCXN0cnVjdCBmbG9wcHlfbWF4X2Vycm9ycyBtYXhfZXJyb3JzOworCWNoYXIJCWZsYWdzOworCWNoYXIJCXJlYWRfdHJhY2s7CisJc2hvcnQJCWF1dG9kZXRlY3RbOF07CisJY29tcGF0X2ludF90CWNoZWNrZnJlcTsKKwljb21wYXRfaW50X3QJbmF0aXZlX2Zvcm1hdDsKK307CisKK3N0cnVjdCBmbG9wcHlfZHJpdmVfc3RydWN0MzIgeworCXNpZ25lZCBjaGFyCWZsYWdzOworCWNvbXBhdF91bG9uZ190CXNwaW51cF9kYXRlOworCWNvbXBhdF91bG9uZ190CXNlbGVjdF9kYXRlOworCWNvbXBhdF91bG9uZ190CWZpcnN0X3JlYWRfZGF0ZTsKKwlzaG9ydAkJcHJvYmVkX2Zvcm1hdDsKKwlzaG9ydAkJdHJhY2s7CisJc2hvcnQJCW1heGJsb2NrOworCXNob3J0CQltYXh0cmFjazsKKwljb21wYXRfaW50X3QJZ2VuZXJhdGlvbjsKKwljb21wYXRfaW50X3QJa2VlcF9kYXRhOworCWNvbXBhdF9pbnRfdAlmZF9yZWY7CisJY29tcGF0X2ludF90CWZkX2RldmljZTsKKwljb21wYXRfaW50X3QJbGFzdF9jaGVja2VkOworCWNvbXBhdF9jYWRkcl90IGRtYWJ1ZjsKKwljb21wYXRfaW50X3QJYnVmYmxvY2tzOworfTsKKworc3RydWN0IGZsb3BweV9mZGNfc3RhdGUzMiB7CisJY29tcGF0X2ludF90CXNwZWMxOworCWNvbXBhdF9pbnRfdAlzcGVjMjsKKwljb21wYXRfaW50X3QJZHRyOworCXVuc2lnbmVkIGNoYXIJdmVyc2lvbjsKKwl1bnNpZ25lZCBjaGFyCWRvcjsKKwljb21wYXRfdWxvbmdfdAlhZGRyZXNzOworCXVuc2lnbmVkIGludAlyYXdjbWQ6MjsKKwl1bnNpZ25lZCBpbnQJcmVzZXQ6MTsKKwl1bnNpZ25lZCBpbnQJbmVlZF9jb25maWd1cmU6MTsKKwl1bnNpZ25lZCBpbnQJcGVycF9tb2RlOjI7CisJdW5zaWduZWQgaW50CWhhc19maWZvOjE7CisJdW5zaWduZWQgaW50CWRyaXZlcl92ZXJzaW9uOworCXVuc2lnbmVkIGNoYXIJdHJhY2tbNF07Cit9OworCitzdHJ1Y3QgZmxvcHB5X3dyaXRlX2Vycm9yczMyIHsKKwl1bnNpZ25lZCBpbnQJd3JpdGVfZXJyb3JzOworCWNvbXBhdF91bG9uZ190CWZpcnN0X2Vycm9yX3NlY3RvcjsKKwljb21wYXRfaW50X3QJZmlyc3RfZXJyb3JfZ2VuZXJhdGlvbjsKKwljb21wYXRfdWxvbmdfdAlsYXN0X2Vycm9yX3NlY3RvcjsKKwljb21wYXRfaW50X3QJbGFzdF9lcnJvcl9nZW5lcmF0aW9uOworCWNvbXBhdF91aW50X3QJYmFkbmVzczsKK307CisKKyNkZWZpbmUgRkRTRVRQUk0zMiBfSU9XKDIsIDB4NDIsIHN0cnVjdCBmbG9wcHlfc3RydWN0MzIpCisjZGVmaW5lIEZEREVGUFJNMzIgX0lPVygyLCAweDQzLCBzdHJ1Y3QgZmxvcHB5X3N0cnVjdDMyKQorI2RlZmluZSBGREdFVFBSTTMyIF9JT1IoMiwgMHgwNCwgc3RydWN0IGZsb3BweV9zdHJ1Y3QzMikKKyNkZWZpbmUgRkRTRVREUlZQUk0zMiBfSU9XKDIsIDB4OTAsIHN0cnVjdCBmbG9wcHlfZHJpdmVfcGFyYW1zMzIpCisjZGVmaW5lIEZER0VURFJWUFJNMzIgX0lPUigyLCAweDExLCBzdHJ1Y3QgZmxvcHB5X2RyaXZlX3BhcmFtczMyKQorI2RlZmluZSBGREdFVERSVlNUQVQzMiBfSU9SKDIsIDB4MTIsIHN0cnVjdCBmbG9wcHlfZHJpdmVfc3RydWN0MzIpCisjZGVmaW5lIEZEUE9MTERSVlNUQVQzMiBfSU9SKDIsIDB4MTMsIHN0cnVjdCBmbG9wcHlfZHJpdmVfc3RydWN0MzIpCisjZGVmaW5lIEZER0VURkRDU1RBVDMyIF9JT1IoMiwgMHgxNSwgc3RydWN0IGZsb3BweV9mZGNfc3RhdGUzMikKKyNkZWZpbmUgRkRXRVJST1JHRVQzMiAgX0lPUigyLCAweDE3LCBzdHJ1Y3QgZmxvcHB5X3dyaXRlX2Vycm9yczMyKQorCitzdGF0aWMgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQJY21kMzI7CisJdW5zaWduZWQgaW50CWNtZDsKK30gZmRfaW9jdGxfdHJhbnNfdGFibGVbXSA9IHsKKwl7IEZEU0VUUFJNMzIsIEZEU0VUUFJNIH0sCisJeyBGRERFRlBSTTMyLCBGRERFRlBSTSB9LAorCXsgRkRHRVRQUk0zMiwgRkRHRVRQUk0gfSwKKwl7IEZEU0VURFJWUFJNMzIsIEZEU0VURFJWUFJNIH0sCisJeyBGREdFVERSVlBSTTMyLCBGREdFVERSVlBSTSB9LAorCXsgRkRHRVREUlZTVEFUMzIsIEZER0VURFJWU1RBVCB9LAorCXsgRkRQT0xMRFJWU1RBVDMyLCBGRFBPTExEUlZTVEFUIH0sCisJeyBGREdFVEZEQ1NUQVQzMiwgRkRHRVRGRENTVEFUIH0sCisJeyBGRFdFUlJPUkdFVDMyLCBGRFdFUlJPUkdFVCB9Cit9OworCisjZGVmaW5lIE5SX0ZEX0lPQ1RMX1RSQU5TIChzaXplb2YoZmRfaW9jdGxfdHJhbnNfdGFibGUpL3NpemVvZihmZF9pb2N0bF90cmFuc190YWJsZVswXSkpCisKK3N0YXRpYyBpbnQgZmRfaW9jdGxfdHJhbnModW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwltbV9zZWdtZW50X3Qgb2xkX2ZzID0gZ2V0X2ZzKCk7CisJdm9pZCAqa2FyZyA9IE5VTEw7CisJdW5zaWduZWQgaW50IGtjbWQgPSAwOworCWludCBpLCBlcnI7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfRkRfSU9DVExfVFJBTlM7IGkrKykKKwkJaWYgKGNtZCA9PSBmZF9pb2N0bF90cmFuc190YWJsZVtpXS5jbWQzMikgeworCQkJa2NtZCA9IGZkX2lvY3RsX3RyYW5zX3RhYmxlW2ldLmNtZDsKKwkJCWJyZWFrOworCQl9CisJaWYgKCFrY21kKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgRkRTRVRQUk0zMjoKKwkJY2FzZSBGRERFRlBSTTMyOgorCQljYXNlIEZER0VUUFJNMzI6CisJCXsKKwkJCWNvbXBhdF91cHRyX3QgbmFtZTsKKwkJCXN0cnVjdCBmbG9wcHlfc3RydWN0MzIgX191c2VyICp1ZjsKKwkJCXN0cnVjdCBmbG9wcHlfc3RydWN0ICpmOworCisJCQl1ZiA9IGNvbXBhdF9wdHIoYXJnKTsKKwkJCWYgPSBrYXJnID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZsb3BweV9zdHJ1Y3QpLCBHRlBfS0VSTkVMKTsKKwkJCWlmICgha2FyZykKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCWlmIChjbWQgPT0gRkRHRVRQUk0zMikKKwkJCQlicmVhazsKKwkJCWVyciA9IF9fZ2V0X3VzZXIoZi0+c2l6ZSwgJnVmLT5zaXplKTsKKwkJCWVyciB8PSBfX2dldF91c2VyKGYtPnNlY3QsICZ1Zi0+c2VjdCk7CisJCQllcnIgfD0gX19nZXRfdXNlcihmLT5oZWFkLCAmdWYtPmhlYWQpOworCQkJZXJyIHw9IF9fZ2V0X3VzZXIoZi0+dHJhY2ssICZ1Zi0+dHJhY2spOworCQkJZXJyIHw9IF9fZ2V0X3VzZXIoZi0+c3RyZXRjaCwgJnVmLT5zdHJldGNoKTsKKwkJCWVyciB8PSBfX2dldF91c2VyKGYtPmdhcCwgJnVmLT5nYXApOworCQkJZXJyIHw9IF9fZ2V0X3VzZXIoZi0+cmF0ZSwgJnVmLT5yYXRlKTsKKwkJCWVyciB8PSBfX2dldF91c2VyKGYtPnNwZWMxLCAmdWYtPnNwZWMxKTsKKwkJCWVyciB8PSBfX2dldF91c2VyKGYtPmZtdF9nYXAsICZ1Zi0+Zm10X2dhcCk7CisJCQllcnIgfD0gX19nZXRfdXNlcihuYW1lLCAmdWYtPm5hbWUpOworCQkJZi0+bmFtZSA9IGNvbXBhdF9wdHIobmFtZSk7CisJCQlpZiAoZXJyKSB7CisJCQkJZXJyID0gLUVGQVVMVDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgRkRTRVREUlZQUk0zMjoKKwkJY2FzZSBGREdFVERSVlBSTTMyOgorCQl7CisJCQlzdHJ1Y3QgZmxvcHB5X2RyaXZlX3BhcmFtczMyIF9fdXNlciAqdWY7CisJCQlzdHJ1Y3QgZmxvcHB5X2RyaXZlX3BhcmFtcyAqZjsKKworCQkJdWYgPSBjb21wYXRfcHRyKGFyZyk7CisJCQlmID0ga2FyZyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmbG9wcHlfZHJpdmVfcGFyYW1zKSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWthcmcpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQlpZiAoY21kID09IEZER0VURFJWUFJNMzIpCisJCQkJYnJlYWs7CisJCQllcnIgPSBfX2dldF91c2VyKGYtPmNtb3MsICZ1Zi0+Y21vcyk7CisJCQllcnIgfD0gX19nZXRfdXNlcihmLT5tYXhfZHRyLCAmdWYtPm1heF9kdHIpOworCQkJZXJyIHw9IF9fZ2V0X3VzZXIoZi0+aGx0LCAmdWYtPmhsdCk7CisJCQllcnIgfD0gX19nZXRfdXNlcihmLT5odXQsICZ1Zi0+aHV0KTsKKwkJCWVyciB8PSBfX2dldF91c2VyKGYtPnNydCwgJnVmLT5zcnQpOworCQkJZXJyIHw9IF9fZ2V0X3VzZXIoZi0+c3BpbnVwLCAmdWYtPnNwaW51cCk7CisJCQllcnIgfD0gX19nZXRfdXNlcihmLT5zcGluZG93biwgJnVmLT5zcGluZG93bik7CisJCQllcnIgfD0gX19nZXRfdXNlcihmLT5zcGluZG93bl9vZmZzZXQsICZ1Zi0+c3BpbmRvd25fb2Zmc2V0KTsKKwkJCWVyciB8PSBfX2dldF91c2VyKGYtPnNlbGVjdF9kZWxheSwgJnVmLT5zZWxlY3RfZGVsYXkpOworCQkJZXJyIHw9IF9fZ2V0X3VzZXIoZi0+cnBzLCAmdWYtPnJwcyk7CisJCQllcnIgfD0gX19nZXRfdXNlcihmLT50cmFja3MsICZ1Zi0+dHJhY2tzKTsKKwkJCWVyciB8PSBfX2dldF91c2VyKGYtPnRpbWVvdXQsICZ1Zi0+dGltZW91dCk7CisJCQllcnIgfD0gX19nZXRfdXNlcihmLT5pbnRlcmxlYXZlX3NlY3QsICZ1Zi0+aW50ZXJsZWF2ZV9zZWN0KTsKKwkJCWVyciB8PSBfX2NvcHlfZnJvbV91c2VyKCZmLT5tYXhfZXJyb3JzLCAmdWYtPm1heF9lcnJvcnMsIHNpemVvZihmLT5tYXhfZXJyb3JzKSk7CisJCQllcnIgfD0gX19nZXRfdXNlcihmLT5mbGFncywgJnVmLT5mbGFncyk7CisJCQllcnIgfD0gX19nZXRfdXNlcihmLT5yZWFkX3RyYWNrLCAmdWYtPnJlYWRfdHJhY2spOworCQkJZXJyIHw9IF9fY29weV9mcm9tX3VzZXIoZi0+YXV0b2RldGVjdCwgdWYtPmF1dG9kZXRlY3QsIHNpemVvZihmLT5hdXRvZGV0ZWN0KSk7CisJCQllcnIgfD0gX19nZXRfdXNlcihmLT5jaGVja2ZyZXEsICZ1Zi0+Y2hlY2tmcmVxKTsKKwkJCWVyciB8PSBfX2dldF91c2VyKGYtPm5hdGl2ZV9mb3JtYXQsICZ1Zi0+bmF0aXZlX2Zvcm1hdCk7CisJCQlpZiAoZXJyKSB7CisJCQkJZXJyID0gLUVGQVVMVDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgRkRHRVREUlZTVEFUMzI6CisJCWNhc2UgRkRQT0xMRFJWU1RBVDMyOgorCQkJa2FyZyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmbG9wcHlfZHJpdmVfc3RydWN0KSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWthcmcpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQlicmVhazsKKwkJY2FzZSBGREdFVEZEQ1NUQVQzMjoKKwkJCWthcmcgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZmxvcHB5X2ZkY19zdGF0ZSksIEdGUF9LRVJORUwpOworCQkJaWYgKCFrYXJnKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJYnJlYWs7CisJCWNhc2UgRkRXRVJST1JHRVQzMjoKKwkJCWthcmcgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZmxvcHB5X3dyaXRlX2Vycm9ycyksIEdGUF9LRVJORUwpOworCQkJaWYgKCFrYXJnKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc2V0X2ZzIChLRVJORUxfRFMpOworCWVyciA9IHN5c19pb2N0bCAoZmQsIGtjbWQsICh1bnNpZ25lZCBsb25nKWthcmcpOworCXNldF9mcyAob2xkX2ZzKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIEZER0VUUFJNMzI6CisJCXsKKwkJCXN0cnVjdCBmbG9wcHlfc3RydWN0ICpmID0ga2FyZzsKKwkJCXN0cnVjdCBmbG9wcHlfc3RydWN0MzIgX191c2VyICp1ZiA9IGNvbXBhdF9wdHIoYXJnKTsKKworCQkJZXJyID0gX19wdXRfdXNlcihmLT5zaXplLCAmdWYtPnNpemUpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZi0+c2VjdCwgJnVmLT5zZWN0KTsKKwkJCWVyciB8PSBfX3B1dF91c2VyKGYtPmhlYWQsICZ1Zi0+aGVhZCk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT50cmFjaywgJnVmLT50cmFjayk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT5zdHJldGNoLCAmdWYtPnN0cmV0Y2gpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZi0+Z2FwLCAmdWYtPmdhcCk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT5yYXRlLCAmdWYtPnJhdGUpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZi0+c3BlYzEsICZ1Zi0+c3BlYzEpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZi0+Zm10X2dhcCwgJnVmLT5mbXRfZ2FwKTsKKwkJCWVyciB8PSBfX3B1dF91c2VyKCh1NjQpZi0+bmFtZSwgKGNvbXBhdF9jYWRkcl90IF9fdXNlciAqKSZ1Zi0+bmFtZSk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIEZER0VURFJWUFJNMzI6CisJCXsKKwkJCXN0cnVjdCBmbG9wcHlfZHJpdmVfcGFyYW1zMzIgX191c2VyICp1ZjsKKwkJCXN0cnVjdCBmbG9wcHlfZHJpdmVfcGFyYW1zICpmID0ga2FyZzsKKworCQkJdWYgPSBjb21wYXRfcHRyKGFyZyk7CisJCQllcnIgPSBfX3B1dF91c2VyKGYtPmNtb3MsICZ1Zi0+Y21vcyk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT5tYXhfZHRyLCAmdWYtPm1heF9kdHIpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZi0+aGx0LCAmdWYtPmhsdCk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT5odXQsICZ1Zi0+aHV0KTsKKwkJCWVyciB8PSBfX3B1dF91c2VyKGYtPnNydCwgJnVmLT5zcnQpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZi0+c3BpbnVwLCAmdWYtPnNwaW51cCk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT5zcGluZG93biwgJnVmLT5zcGluZG93bik7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT5zcGluZG93bl9vZmZzZXQsICZ1Zi0+c3BpbmRvd25fb2Zmc2V0KTsKKwkJCWVyciB8PSBfX3B1dF91c2VyKGYtPnNlbGVjdF9kZWxheSwgJnVmLT5zZWxlY3RfZGVsYXkpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZi0+cnBzLCAmdWYtPnJwcyk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT50cmFja3MsICZ1Zi0+dHJhY2tzKTsKKwkJCWVyciB8PSBfX3B1dF91c2VyKGYtPnRpbWVvdXQsICZ1Zi0+dGltZW91dCk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT5pbnRlcmxlYXZlX3NlY3QsICZ1Zi0+aW50ZXJsZWF2ZV9zZWN0KTsKKwkJCWVyciB8PSBfX2NvcHlfdG9fdXNlcigmdWYtPm1heF9lcnJvcnMsICZmLT5tYXhfZXJyb3JzLCBzaXplb2YoZi0+bWF4X2Vycm9ycykpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZi0+ZmxhZ3MsICZ1Zi0+ZmxhZ3MpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZi0+cmVhZF90cmFjaywgJnVmLT5yZWFkX3RyYWNrKTsKKwkJCWVyciB8PSBfX2NvcHlfdG9fdXNlcih1Zi0+YXV0b2RldGVjdCwgZi0+YXV0b2RldGVjdCwgc2l6ZW9mKGYtPmF1dG9kZXRlY3QpKTsKKwkJCWVyciB8PSBfX3B1dF91c2VyKGYtPmNoZWNrZnJlcSwgJnVmLT5jaGVja2ZyZXEpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZi0+bmF0aXZlX2Zvcm1hdCwgJnVmLT5uYXRpdmVfZm9ybWF0KTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgRkRHRVREUlZTVEFUMzI6CisJCWNhc2UgRkRQT0xMRFJWU1RBVDMyOgorCQl7CisJCQlzdHJ1Y3QgZmxvcHB5X2RyaXZlX3N0cnVjdDMyIF9fdXNlciAqdWY7CisJCQlzdHJ1Y3QgZmxvcHB5X2RyaXZlX3N0cnVjdCAqZiA9IGthcmc7CisKKwkJCXVmID0gY29tcGF0X3B0cihhcmcpOworCQkJZXJyID0gX19wdXRfdXNlcihmLT5mbGFncywgJnVmLT5mbGFncyk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT5zcGludXBfZGF0ZSwgJnVmLT5zcGludXBfZGF0ZSk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT5zZWxlY3RfZGF0ZSwgJnVmLT5zZWxlY3RfZGF0ZSk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT5maXJzdF9yZWFkX2RhdGUsICZ1Zi0+Zmlyc3RfcmVhZF9kYXRlKTsKKwkJCWVyciB8PSBfX3B1dF91c2VyKGYtPnByb2JlZF9mb3JtYXQsICZ1Zi0+cHJvYmVkX2Zvcm1hdCk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT50cmFjaywgJnVmLT50cmFjayk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT5tYXhibG9jaywgJnVmLT5tYXhibG9jayk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT5tYXh0cmFjaywgJnVmLT5tYXh0cmFjayk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT5nZW5lcmF0aW9uLCAmdWYtPmdlbmVyYXRpb24pOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZi0+a2VlcF9kYXRhLCAmdWYtPmtlZXBfZGF0YSk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT5mZF9yZWYsICZ1Zi0+ZmRfcmVmKTsKKwkJCWVyciB8PSBfX3B1dF91c2VyKGYtPmZkX2RldmljZSwgJnVmLT5mZF9kZXZpY2UpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZi0+bGFzdF9jaGVja2VkLCAmdWYtPmxhc3RfY2hlY2tlZCk7CisJCQllcnIgfD0gX19wdXRfdXNlcigodTY0KWYtPmRtYWJ1ZiwgJnVmLT5kbWFidWYpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoKHU2NClmLT5idWZibG9ja3MsICZ1Zi0+YnVmYmxvY2tzKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgRkRHRVRGRENTVEFUMzI6CisJCXsKKwkJCXN0cnVjdCBmbG9wcHlfZmRjX3N0YXRlMzIgX191c2VyICp1ZjsKKwkJCXN0cnVjdCBmbG9wcHlfZmRjX3N0YXRlICpmID0ga2FyZzsKKworCQkJdWYgPSBjb21wYXRfcHRyKGFyZyk7CisJCQllcnIgPSBfX3B1dF91c2VyKGYtPnNwZWMxLCAmdWYtPnNwZWMxKTsKKwkJCWVyciB8PSBfX3B1dF91c2VyKGYtPnNwZWMyLCAmdWYtPnNwZWMyKTsKKwkJCWVyciB8PSBfX3B1dF91c2VyKGYtPmR0ciwgJnVmLT5kdHIpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZi0+dmVyc2lvbiwgJnVmLT52ZXJzaW9uKTsKKwkJCWVyciB8PSBfX3B1dF91c2VyKGYtPmRvciwgJnVmLT5kb3IpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZi0+YWRkcmVzcywgJnVmLT5hZGRyZXNzKTsKKwkJCWVyciB8PSBfX2NvcHlfdG9fdXNlcigoY2hhciBfX3VzZXIgKikmdWYtPmFkZHJlc3MgKyBzaXplb2YodWYtPmFkZHJlc3MpLAorCQkJCQkgICAoY2hhciAqKSZmLT5hZGRyZXNzICsgc2l6ZW9mKGYtPmFkZHJlc3MpLCBzaXplb2YoaW50KSk7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT5kcml2ZXJfdmVyc2lvbiwgJnVmLT5kcml2ZXJfdmVyc2lvbik7CisJCQllcnIgfD0gX19jb3B5X3RvX3VzZXIodWYtPnRyYWNrLCBmLT50cmFjaywgc2l6ZW9mKGYtPnRyYWNrKSk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIEZEV0VSUk9SR0VUMzI6CisJCXsKKwkJCXN0cnVjdCBmbG9wcHlfd3JpdGVfZXJyb3JzMzIgX191c2VyICp1ZjsKKwkJCXN0cnVjdCBmbG9wcHlfd3JpdGVfZXJyb3JzICpmID0ga2FyZzsKKworCQkJdWYgPSBjb21wYXRfcHRyKGFyZyk7CisJCQllcnIgPSBfX3B1dF91c2VyKGYtPndyaXRlX2Vycm9ycywgJnVmLT53cml0ZV9lcnJvcnMpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZi0+Zmlyc3RfZXJyb3Jfc2VjdG9yLCAmdWYtPmZpcnN0X2Vycm9yX3NlY3Rvcik7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT5maXJzdF9lcnJvcl9nZW5lcmF0aW9uLCAmdWYtPmZpcnN0X2Vycm9yX2dlbmVyYXRpb24pOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZi0+bGFzdF9lcnJvcl9zZWN0b3IsICZ1Zi0+bGFzdF9lcnJvcl9zZWN0b3IpOworCQkJZXJyIHw9IF9fcHV0X3VzZXIoZi0+bGFzdF9lcnJvcl9nZW5lcmF0aW9uLCAmdWYtPmxhc3RfZXJyb3JfZ2VuZXJhdGlvbik7CisJCQllcnIgfD0gX19wdXRfdXNlcihmLT5iYWRuZXNzLCAmdWYtPmJhZG5lc3MpOworCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKwlpZiAoZXJyKQorCQllcnIgPSAtRUZBVUxUOworCitvdXQ6CWlmIChrYXJnKSBrZnJlZShrYXJnKTsKKwlyZXR1cm4gZXJyOworfQorCitzdHJ1Y3QgbXRkX29vYl9idWYzMiB7CisJdV9pbnQzMl90IHN0YXJ0OworCXVfaW50MzJfdCBsZW5ndGg7CisJY29tcGF0X2NhZGRyX3QgcHRyOwkvKiB1bnNpZ25lZCBjaGFyKiAqLworfTsKKworI2RlZmluZSBNRU1XUklURU9PQjMyIAlfSU9XUignTScsMyxzdHJ1Y3QgbXRkX29vYl9idWYzMikKKyNkZWZpbmUgTUVNUkVBRE9PQjMyIAlfSU9XUignTScsNCxzdHJ1Y3QgbXRkX29vYl9idWYzMikKKworc3RhdGljIGludCBtdGRfcndfb29iKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IG10ZF9vb2JfYnVmIF9fdXNlciAqYnVmID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpidWYpKTsKKwlzdHJ1Y3QgbXRkX29vYl9idWYzMiBfX3VzZXIgKmJ1ZjMyID0gY29tcGF0X3B0cihhcmcpOworCXUzMiBkYXRhOworCWNoYXIgX191c2VyICpkYXRhcDsKKwl1bnNpZ25lZCBpbnQgcmVhbF9jbWQ7CisJaW50IGVycjsKKworCXJlYWxfY21kID0gKGNtZCA9PSBNRU1SRUFET09CMzIpID8KKwkJTUVNUkVBRE9PQiA6IE1FTVdSSVRFT09COworCisJaWYgKGNvcHlfaW5fdXNlcigmYnVmLT5zdGFydCwgJmJ1ZjMyLT5zdGFydCwKKwkJCSAyICogc2l6ZW9mKHUzMikpIHx8CisJICAgIGdldF91c2VyKGRhdGEsICZidWYzMi0+cHRyKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJZGF0YXAgPSBjb21wYXRfcHRyKGRhdGEpOworCWlmIChwdXRfdXNlcihkYXRhcCwgJmJ1Zi0+cHRyKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwllcnIgPSBzeXNfaW9jdGwoZmQsIHJlYWxfY21kLCAodW5zaWduZWQgbG9uZykgYnVmKTsKKworCWlmICghZXJyKSB7CisJCWlmIChjb3B5X2luX3VzZXIoJmJ1ZjMyLT5zdGFydCwgJmJ1Zi0+c3RhcnQsCisJCQkJIDIgKiBzaXplb2YodTMyKSkpCisJCQllcnIgPSAtRUZBVUxUOworCX0KKworCXJldHVybiBlcnI7Cit9CQorCisjZGVmaW5lCVZGQVRfSU9DVExfUkVBRERJUl9CT1RIMzIJX0lPUigncicsIDEsIHN0cnVjdCBjb21wYXRfZGlyZW50WzJdKQorI2RlZmluZQlWRkFUX0lPQ1RMX1JFQURESVJfU0hPUlQzMglfSU9SKCdyJywgMiwgc3RydWN0IGNvbXBhdF9kaXJlbnRbMl0pCisKK3N0YXRpYyBsb25nCitwdXRfZGlyZW50MzIgKHN0cnVjdCBkaXJlbnQgKmQsIHN0cnVjdCBjb21wYXRfZGlyZW50IF9fdXNlciAqZDMyKQoreworICAgICAgICBpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGQzMiwgc2l6ZW9mKHN0cnVjdCBjb21wYXRfZGlyZW50KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisKKyAgICAgICAgX19wdXRfdXNlcihkLT5kX2lubywgJmQzMi0+ZF9pbm8pOworICAgICAgICBfX3B1dF91c2VyKGQtPmRfb2ZmLCAmZDMyLT5kX29mZik7CisgICAgICAgIF9fcHV0X3VzZXIoZC0+ZF9yZWNsZW4sICZkMzItPmRfcmVjbGVuKTsKKyAgICAgICAgaWYgKF9fY29weV90b191c2VyKGQzMi0+ZF9uYW1lLCBkLT5kX25hbWUsIGQtPmRfcmVjbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmZhdF9pb2N0bDMyKHVuc2lnbmVkIGZkLCB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBjb21wYXRfZGlyZW50IF9fdXNlciAqcCA9IGNvbXBhdF9wdHIoYXJnKTsKKwlpbnQgcmV0OworCW1tX3NlZ21lbnRfdCBvbGRmcyA9IGdldF9mcygpOworCXN0cnVjdCBkaXJlbnQgZFsyXTsKKworCXN3aXRjaChjbWQpCisJeworICAgICAgICAJY2FzZSBWRkFUX0lPQ1RMX1JFQURESVJfQk9USDMyOgorICAgICAgICAgICAgICAgIAljbWQgPSBWRkFUX0lPQ1RMX1JFQURESVJfQk9USDsKKyAgICAgICAgICAgICAgICAJYnJlYWs7CisgICAgICAgIAljYXNlIFZGQVRfSU9DVExfUkVBRERJUl9TSE9SVDMyOgorICAgICAgICAgICAgICAgIAljbWQgPSBWRkFUX0lPQ1RMX1JFQURESVJfU0hPUlQ7CisgICAgICAgICAgICAgICAgCWJyZWFrOworCX0KKworCXNldF9mcyhLRVJORUxfRFMpOworCXJldCA9IHN5c19pb2N0bChmZCxjbWQsKHVuc2lnbmVkIGxvbmcpJmQpOworCXNldF9mcyhvbGRmcyk7CisJaWYgKHJldCA+PSAwKSB7CisJCXJldCB8PSBwdXRfZGlyZW50MzIoJmRbMF0sIHApOworCQlyZXQgfD0gcHV0X2RpcmVudDMyKCZkWzFdLCBwICsgMSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgUkVJU0VSRlNfSU9DX1VOUEFDSzMyICAgICAgICAgICAgICAgX0lPVygweENELDEsaW50KQorCitzdGF0aWMgaW50IHJlaXNlcmZzX2lvY3RsMzIodW5zaWduZWQgZmQsIHVuc2lnbmVkIGNtZCwgdW5zaWduZWQgbG9uZyBwdHIpCit7CisgICAgICAgIGlmIChjbWQgPT0gUkVJU0VSRlNfSU9DX1VOUEFDSzMyKQorICAgICAgICAgICAgICAgIGNtZCA9IFJFSVNFUkZTX0lPQ19VTlBBQ0s7CisKKyAgICAgICAgcmV0dXJuIHN5c19pb2N0bChmZCxjbWQscHRyKTsKK30KKworc3RydWN0IHJhdzMyX2NvbmZpZ19yZXF1ZXN0Cit7CisgICAgICAgIGNvbXBhdF9pbnRfdCAgICByYXdfbWlub3I7CisgICAgICAgIF9fdTY0ICAgYmxvY2tfbWFqb3I7CisgICAgICAgIF9fdTY0ICAgYmxvY2tfbWlub3I7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdGF0aWMgaW50IGdldF9yYXczMl9yZXF1ZXN0KHN0cnVjdCByYXdfY29uZmlnX3JlcXVlc3QgKnJlcSwgc3RydWN0IHJhdzMyX2NvbmZpZ19yZXF1ZXN0IF9fdXNlciAqdXNlcl9yZXEpCit7CisgICAgICAgIGludCByZXQ7CisKKyAgICAgICAgaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIHVzZXJfcmVxLCBzaXplb2Yoc3RydWN0IHJhdzMyX2NvbmZpZ19yZXF1ZXN0KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisKKyAgICAgICAgcmV0ID0gX19nZXRfdXNlcihyZXEtPnJhd19taW5vciwgJnVzZXJfcmVxLT5yYXdfbWlub3IpOworICAgICAgICByZXQgfD0gX19nZXRfdXNlcihyZXEtPmJsb2NrX21ham9yLCAmdXNlcl9yZXEtPmJsb2NrX21ham9yKTsKKyAgICAgICAgcmV0IHw9IF9fZ2V0X3VzZXIocmVxLT5ibG9ja19taW5vciwgJnVzZXJfcmVxLT5ibG9ja19taW5vcik7CisKKyAgICAgICAgcmV0dXJuIHJldCA/IC1FRkFVTFQgOiAwOworfQorCitzdGF0aWMgaW50IHNldF9yYXczMl9yZXF1ZXN0KHN0cnVjdCByYXdfY29uZmlnX3JlcXVlc3QgKnJlcSwgc3RydWN0IHJhdzMyX2NvbmZpZ19yZXF1ZXN0IF9fdXNlciAqdXNlcl9yZXEpCit7CisJaW50IHJldDsKKworICAgICAgICBpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIHVzZXJfcmVxLCBzaXplb2Yoc3RydWN0IHJhdzMyX2NvbmZpZ19yZXF1ZXN0KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisKKyAgICAgICAgcmV0ID0gX19wdXRfdXNlcihyZXEtPnJhd19taW5vciwgJnVzZXJfcmVxLT5yYXdfbWlub3IpOworICAgICAgICByZXQgfD0gX19wdXRfdXNlcihyZXEtPmJsb2NrX21ham9yLCAmdXNlcl9yZXEtPmJsb2NrX21ham9yKTsKKyAgICAgICAgcmV0IHw9IF9fcHV0X3VzZXIocmVxLT5ibG9ja19taW5vciwgJnVzZXJfcmVxLT5ibG9ja19taW5vcik7CisKKyAgICAgICAgcmV0dXJuIHJldCA/IC1FRkFVTFQgOiAwOworfQorCitzdGF0aWMgaW50IHJhd19pb2N0bCh1bnNpZ25lZCBmZCwgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKyAgICAgICAgaW50IHJldDsKKworICAgICAgICBzd2l0Y2ggKGNtZCkgeworICAgICAgICBjYXNlIFJBV19TRVRCSU5EOgorICAgICAgICBjYXNlIFJBV19HRVRCSU5EOiB7CisgICAgICAgICAgICAgICAgc3RydWN0IHJhd19jb25maWdfcmVxdWVzdCByZXE7CisgICAgICAgICAgICAgICAgc3RydWN0IHJhdzMyX2NvbmZpZ19yZXF1ZXN0IF9fdXNlciAqdXNlcl9yZXEgPSBjb21wYXRfcHRyKGFyZyk7CisgICAgICAgICAgICAgICAgbW1fc2VnbWVudF90IG9sZGZzID0gZ2V0X2ZzKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGdldF9yYXczMl9yZXF1ZXN0KCZyZXEsIHVzZXJfcmVxKSkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgICAgICAgc2V0X2ZzKEtFUk5FTF9EUyk7CisgICAgICAgICAgICAgICAgcmV0ID0gc3lzX2lvY3RsKGZkLGNtZCwodW5zaWduZWQgbG9uZykmcmVxKTsKKyAgICAgICAgICAgICAgICBzZXRfZnMob2xkZnMpOworCisgICAgICAgICAgICAgICAgaWYgKCghcmV0KSAmJiAoY21kID09IFJBV19HRVRCSU5EKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gc2V0X3JhdzMyX3JlcXVlc3QoJnJlcSwgdXNlcl9yZXEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldCA9IHN5c19pb2N0bChmZCwgY21kLCBhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBzZXJpYWxfc3RydWN0MzIgeworICAgICAgICBjb21wYXRfaW50X3QgICAgdHlwZTsKKyAgICAgICAgY29tcGF0X2ludF90ICAgIGxpbmU7CisgICAgICAgIGNvbXBhdF91aW50X3QgICBwb3J0OworICAgICAgICBjb21wYXRfaW50X3QgICAgaXJxOworICAgICAgICBjb21wYXRfaW50X3QgICAgZmxhZ3M7CisgICAgICAgIGNvbXBhdF9pbnRfdCAgICB4bWl0X2ZpZm9fc2l6ZTsKKyAgICAgICAgY29tcGF0X2ludF90ICAgIGN1c3RvbV9kaXZpc29yOworICAgICAgICBjb21wYXRfaW50X3QgICAgYmF1ZF9iYXNlOworICAgICAgICB1bnNpZ25lZCBzaG9ydCAgY2xvc2VfZGVsYXk7CisgICAgICAgIGNoYXIgICAgaW9fdHlwZTsKKyAgICAgICAgY2hhciAgICByZXNlcnZlZF9jaGFyWzFdOworICAgICAgICBjb21wYXRfaW50X3QgICAgaHViNjsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgIGNsb3Npbmdfd2FpdDsgLyogdGltZSB0byB3YWl0IGJlZm9yZSBjbG9zaW5nICovCisgICAgICAgIHVuc2lnbmVkIHNob3J0ICBjbG9zaW5nX3dhaXQyOyAvKiBubyBsb25nZXIgdXNlZC4uLiAqLworICAgICAgICBjb21wYXRfdWludF90ICAgaW9tZW1fYmFzZTsKKyAgICAgICAgdW5zaWduZWQgc2hvcnQgIGlvbWVtX3JlZ19zaGlmdDsKKyAgICAgICAgdW5zaWduZWQgaW50ICAgIHBvcnRfaGlnaDsKKyAgICAgLyogY29tcGF0X3Vsb25nX3QgIGlvbWFwX2Jhc2UgRklYTUUgKi8KKyAgICAgICAgY29tcGF0X2ludF90ICAgIHJlc2VydmVkWzFdOworfTsKKworc3RhdGljIGludCBzZXJpYWxfc3RydWN0X2lvY3RsKHVuc2lnbmVkIGZkLCB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworICAgICAgICB0eXBlZGVmIHN0cnVjdCBzZXJpYWxfc3RydWN0IFNTOworICAgICAgICB0eXBlZGVmIHN0cnVjdCBzZXJpYWxfc3RydWN0MzIgU1MzMjsKKyAgICAgICAgc3RydWN0IHNlcmlhbF9zdHJ1Y3QzMiBfX3VzZXIgKnNzMzIgPSBjb21wYXRfcHRyKGFyZyk7CisgICAgICAgIGludCBlcnI7CisgICAgICAgIHN0cnVjdCBzZXJpYWxfc3RydWN0IHNzOworICAgICAgICBtbV9zZWdtZW50X3Qgb2xkc2VnID0gZ2V0X2ZzKCk7CisgICAgICAgIF9fdTMyIHVkYXRhOworCisgICAgICAgIGlmIChjbWQgPT0gVElPQ1NTRVJJQUwpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgc3MzMiwgc2l6ZW9mKFNTMzIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgICAgICAgICAgICAgIGlmIChfX2NvcHlfZnJvbV91c2VyKCZzcywgc3MzMiwgb2Zmc2V0b2YoU1MzMiwgaW9tZW1fYmFzZSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgICAgICAgICAgX19nZXRfdXNlcih1ZGF0YSwgJnNzMzItPmlvbWVtX2Jhc2UpOworICAgICAgICAgICAgICAgIHNzLmlvbWVtX2Jhc2UgPSBjb21wYXRfcHRyKHVkYXRhKTsKKyAgICAgICAgICAgICAgICBfX2dldF91c2VyKHNzLmlvbWVtX3JlZ19zaGlmdCwgJnNzMzItPmlvbWVtX3JlZ19zaGlmdCk7CisgICAgICAgICAgICAgICAgX19nZXRfdXNlcihzcy5wb3J0X2hpZ2gsICZzczMyLT5wb3J0X2hpZ2gpOworICAgICAgICAgICAgICAgIHNzLmlvbWFwX2Jhc2UgPSAwVUw7CisgICAgICAgIH0KKyAgICAgICAgc2V0X2ZzKEtFUk5FTF9EUyk7CisgICAgICAgICAgICAgICAgZXJyID0gc3lzX2lvY3RsKGZkLGNtZCwodW5zaWduZWQgbG9uZykoJnNzKSk7CisgICAgICAgIHNldF9mcyhvbGRzZWcpOworICAgICAgICBpZiAoY21kID09IFRJT0NHU0VSSUFMICYmIGVyciA+PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBzczMyLCBzaXplb2YoU1MzMikpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgICAgICAgICAgaWYgKF9fY29weV90b191c2VyKHNzMzIsJnNzLG9mZnNldG9mKFNTMzIsaW9tZW1fYmFzZSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgICAgICAgICAgX19wdXRfdXNlcigodW5zaWduZWQgbG9uZylzcy5pb21lbV9iYXNlICA+PiAzMiA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhmZmZmZmZmZiA6ICh1bnNpZ25lZCkodW5zaWduZWQgbG9uZylzcy5pb21lbV9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzczMyLT5pb21lbV9iYXNlKTsKKyAgICAgICAgICAgICAgICBfX3B1dF91c2VyKHNzLmlvbWVtX3JlZ19zaGlmdCwgJnNzMzItPmlvbWVtX3JlZ19zaGlmdCk7CisgICAgICAgICAgICAgICAgX19wdXRfdXNlcihzcy5wb3J0X2hpZ2gsICZzczMyLT5wb3J0X2hpZ2gpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVycjsKK30KKworc3RydWN0IHVzYmRldmZzX2N0cmx0cmFuc2ZlcjMyIHsKKyAgICAgICAgdTggYlJlcXVlc3RUeXBlOworICAgICAgICB1OCBiUmVxdWVzdDsKKyAgICAgICAgdTE2IHdWYWx1ZTsKKyAgICAgICAgdTE2IHdJbmRleDsKKyAgICAgICAgdTE2IHdMZW5ndGg7CisgICAgICAgIHUzMiB0aW1lb3V0OyAgLyogaW4gbWlsbGlzZWNvbmRzICovCisgICAgICAgIGNvbXBhdF9jYWRkcl90IGRhdGE7Cit9OworCisjZGVmaW5lIFVTQkRFVkZTX0NPTlRST0wzMiAgICAgICAgICAgX0lPV1IoJ1UnLCAwLCBzdHJ1Y3QgdXNiZGV2ZnNfY3RybHRyYW5zZmVyMzIpCisKK3N0YXRpYyBpbnQgZG9fdXNiZGV2ZnNfY29udHJvbCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworICAgICAgICBzdHJ1Y3QgdXNiZGV2ZnNfY3RybHRyYW5zZmVyMzIgX191c2VyICpwMzIgPSBjb21wYXRfcHRyKGFyZyk7CisgICAgICAgIHN0cnVjdCB1c2JkZXZmc19jdHJsdHJhbnNmZXIgX191c2VyICpwOworICAgICAgICBfX3UzMiB1ZGF0YTsKKyAgICAgICAgcCA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqcCkpOworICAgICAgICBpZiAoY29weV9pbl91c2VyKHAsIHAzMiwgKHNpemVvZigqcDMyKSAtIHNpemVvZihjb21wYXRfY2FkZHJfdCkpKSB8fAorICAgICAgICAgICAgZ2V0X3VzZXIodWRhdGEsICZwMzItPmRhdGEpIHx8CisJICAgIHB1dF91c2VyKGNvbXBhdF9wdHIodWRhdGEpLCAmcC0+ZGF0YSkpCisJCXJldHVybiAtRUZBVUxUOworICAgICAgICByZXR1cm4gc3lzX2lvY3RsKGZkLCBVU0JERVZGU19DT05UUk9MLCAodW5zaWduZWQgbG9uZylwKTsKK30KKworCitzdHJ1Y3QgdXNiZGV2ZnNfYnVsa3RyYW5zZmVyMzIgeworICAgICAgICBjb21wYXRfdWludF90IGVwOworICAgICAgICBjb21wYXRfdWludF90IGxlbjsKKyAgICAgICAgY29tcGF0X3VpbnRfdCB0aW1lb3V0OyAvKiBpbiBtaWxsaXNlY29uZHMgKi8KKyAgICAgICAgY29tcGF0X2NhZGRyX3QgZGF0YTsKK307CisKKyNkZWZpbmUgVVNCREVWRlNfQlVMSzMyICAgICAgICAgICAgICBfSU9XUignVScsIDIsIHN0cnVjdCB1c2JkZXZmc19idWxrdHJhbnNmZXIzMikKKworc3RhdGljIGludCBkb191c2JkZXZmc19idWxrKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisgICAgICAgIHN0cnVjdCB1c2JkZXZmc19idWxrdHJhbnNmZXIzMiBfX3VzZXIgKnAzMiA9IGNvbXBhdF9wdHIoYXJnKTsKKyAgICAgICAgc3RydWN0IHVzYmRldmZzX2J1bGt0cmFuc2ZlciBfX3VzZXIgKnA7CisgICAgICAgIGNvbXBhdF91aW50X3QgbjsKKyAgICAgICAgY29tcGF0X2NhZGRyX3QgYWRkcjsKKworICAgICAgICBwID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpwKSk7CisKKyAgICAgICAgaWYgKGdldF91c2VyKG4sICZwMzItPmVwKSB8fCBwdXRfdXNlcihuLCAmcC0+ZXApIHx8CisgICAgICAgICAgICBnZXRfdXNlcihuLCAmcDMyLT5sZW4pIHx8IHB1dF91c2VyKG4sICZwLT5sZW4pIHx8CisgICAgICAgICAgICBnZXRfdXNlcihuLCAmcDMyLT50aW1lb3V0KSB8fCBwdXRfdXNlcihuLCAmcC0+dGltZW91dCkgfHwKKyAgICAgICAgICAgIGdldF91c2VyKGFkZHIsICZwMzItPmRhdGEpIHx8IHB1dF91c2VyKGNvbXBhdF9wdHIoYWRkciksICZwLT5kYXRhKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKworICAgICAgICByZXR1cm4gc3lzX2lvY3RsKGZkLCBVU0JERVZGU19CVUxLLCAodW5zaWduZWQgbG9uZylwKTsKK30KKworCisvKgorICogIFVTQkRFVkZTX1NVQk1JVFVSQiwgVVNCREVWRlNfUkVBUFVSQiBhbmQgVVNCREVWRlNfUkVBUFVSQk5ERUxBWQorICogIGFyZSBoYW5kbGVkIGluIHVzYmRldmZzIGNvcmUuCQkJLUNocmlzdG9waGVyIExpCisgKi8KKworc3RydWN0IHVzYmRldmZzX2Rpc2Nvbm5lY3RzaWduYWwzMiB7CisgICAgICAgIGNvbXBhdF9pbnRfdCBzaWducjsKKyAgICAgICAgY29tcGF0X2NhZGRyX3QgY29udGV4dDsKK307CisKKyNkZWZpbmUgVVNCREVWRlNfRElTQ1NJR05BTDMyICAgICAgX0lPUignVScsIDE0LCBzdHJ1Y3QgdXNiZGV2ZnNfZGlzY29ubmVjdHNpZ25hbDMyKQorCitzdGF0aWMgaW50IGRvX3VzYmRldmZzX2Rpc2NzaWduYWwodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKyAgICAgICAgc3RydWN0IHVzYmRldmZzX2Rpc2Nvbm5lY3RzaWduYWwga2RpczsKKyAgICAgICAgc3RydWN0IHVzYmRldmZzX2Rpc2Nvbm5lY3RzaWduYWwzMiBfX3VzZXIgKnVkaXM7CisgICAgICAgIG1tX3NlZ21lbnRfdCBvbGRfZnM7CisgICAgICAgIHUzMiB1Y3R4OworICAgICAgICBpbnQgZXJyOworCisgICAgICAgIHVkaXMgPSBjb21wYXRfcHRyKGFyZyk7CisKKyAgICAgICAgaWYgKGdldF91c2VyKGtkaXMuc2lnbnIsICZ1ZGlzLT5zaWducikgfHwKKyAgICAgICAgICAgIF9fZ2V0X3VzZXIodWN0eCwgJnVkaXMtPmNvbnRleHQpKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworCisgICAgICAgIGtkaXMuY29udGV4dCA9IGNvbXBhdF9wdHIodWN0eCk7CisKKyAgICAgICAgb2xkX2ZzID0gZ2V0X2ZzKCk7CisgICAgICAgIHNldF9mcyhLRVJORUxfRFMpOworICAgICAgICBlcnIgPSBzeXNfaW9jdGwoZmQsIFVTQkRFVkZTX0RJU0NTSUdOQUwsICh1bnNpZ25lZCBsb25nKSAma2Rpcyk7CisgICAgICAgIHNldF9mcyhvbGRfZnMpOworCisgICAgICAgIHJldHVybiBlcnI7Cit9CisKKy8qCisgKiBJMkMgbGF5ZXIgaW9jdGxzCisgKi8KKworc3RydWN0IGkyY19tc2czMiB7CisJdTE2IGFkZHI7CisJdTE2IGZsYWdzOworCXUxNiBsZW47CisJY29tcGF0X2NhZGRyX3QgYnVmOworfTsKKworc3RydWN0IGkyY19yZHdyX2lvY3RsX2RhdGEzMiB7CisJY29tcGF0X2NhZGRyX3QgbXNnczsgLyogc3RydWN0IGkyY19tc2cgX191c2VyICptc2dzICovCisJdTMyIG5tc2dzOworfTsKKworc3RydWN0IGkyY19zbWJ1c19pb2N0bF9kYXRhMzIgeworCXU4IHJlYWRfd3JpdGU7CisJdTggY29tbWFuZDsKKwl1MzIgc2l6ZTsKKwljb21wYXRfY2FkZHJfdCBkYXRhOyAvKiB1bmlvbiBpMmNfc21idXNfZGF0YSAqZGF0YSAqLworfTsKKworc3RydWN0IGkyY19yZHdyX2FsaWduZWQgeworCXN0cnVjdCBpMmNfcmR3cl9pb2N0bF9kYXRhIGNtZDsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzWzBdOworfTsKKworc3RhdGljIGludCBkb19pMmNfcmR3cl9pb2N0bCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBpMmNfcmR3cl9pb2N0bF9kYXRhMzIJX191c2VyICp1ZGF0YSA9IGNvbXBhdF9wdHIoYXJnKTsKKwlzdHJ1Y3QgaTJjX3Jkd3JfYWxpZ25lZAkJX191c2VyICp0ZGF0YTsKKwlzdHJ1Y3QgaTJjX21zZwkJCV9fdXNlciAqdG1zZ3M7CisJc3RydWN0IGkyY19tc2czMgkJX191c2VyICp1bXNnczsKKwljb21wYXRfY2FkZHJfdAkJCWRhdGFwOworCWludAkJCQlubXNncywgaTsKKworCWlmIChnZXRfdXNlcihubXNncywgJnVkYXRhLT5ubXNncykpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChubXNncyA+IEkyQ19SRFJXX0lPQ1RMX01BWF9NU0dTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChnZXRfdXNlcihkYXRhcCwgJnVkYXRhLT5tc2dzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJdW1zZ3MgPSBjb21wYXRfcHRyKGRhdGFwKTsKKworCXRkYXRhID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCp0ZGF0YSkgKworCQkJCSAgICAgIG5tc2dzICogc2l6ZW9mKHN0cnVjdCBpMmNfbXNnKSk7CisJdG1zZ3MgPSAmdGRhdGEtPm1zZ3NbMF07CisKKwlpZiAocHV0X3VzZXIobm1zZ3MsICZ0ZGF0YS0+Y21kLm5tc2dzKSB8fAorCSAgICBwdXRfdXNlcih0bXNncywgJnRkYXRhLT5jbWQubXNncykpCisJCXJldHVybiAtRUZBVUxUOworCisJZm9yIChpID0gMDsgaSA8IG5tc2dzOyBpKyspIHsKKwkJaWYgKGNvcHlfaW5fdXNlcigmdG1zZ3NbaV0uYWRkciwgJnVtc2dzW2ldLmFkZHIsIDMqc2l6ZW9mKHUxNikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChnZXRfdXNlcihkYXRhcCwgJnVtc2dzW2ldLmJ1ZikgfHwKKwkJICAgIHB1dF91c2VyKGNvbXBhdF9wdHIoZGF0YXApLCAmdG1zZ3NbaV0uYnVmKSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0KKwlyZXR1cm4gc3lzX2lvY3RsKGZkLCBjbWQsICh1bnNpZ25lZCBsb25nKXRkYXRhKTsKK30KKworc3RhdGljIGludCBkb19pMmNfc21idXNfaW9jdGwodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaTJjX3NtYnVzX2lvY3RsX2RhdGEJX191c2VyICp0ZGF0YTsKKwlzdHJ1Y3QgaTJjX3NtYnVzX2lvY3RsX2RhdGEzMglfX3VzZXIgKnVkYXRhOworCWNvbXBhdF9jYWRkcl90CQkJZGF0YXA7CisKKwl0ZGF0YSA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqdGRhdGEpKTsKKwlpZiAodGRhdGEgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB0ZGF0YSwgc2l6ZW9mKCp0ZGF0YSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXVkYXRhID0gY29tcGF0X3B0cihhcmcpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB1ZGF0YSwgc2l6ZW9mKCp1ZGF0YSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChfX2NvcHlfaW5fdXNlcigmdGRhdGEtPnJlYWRfd3JpdGUsICZ1ZGF0YS0+cmVhZF93cml0ZSwgMiAqIHNpemVvZih1OCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoX19jb3B5X2luX3VzZXIoJnRkYXRhLT5zaXplLCAmdWRhdGEtPnNpemUsIDIgKiBzaXplb2YodTMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChfX2dldF91c2VyKGRhdGFwLCAmdWRhdGEtPmRhdGEpIHx8CisJICAgIF9fcHV0X3VzZXIoY29tcGF0X3B0cihkYXRhcCksICZ0ZGF0YS0+ZGF0YSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIHN5c19pb2N0bChmZCwgY21kLCAodW5zaWduZWQgbG9uZyl0ZGF0YSk7Cit9CisKK3N0cnVjdCBjb21wYXRfaXdfcG9pbnQgeworCWNvbXBhdF9jYWRkcl90IHBvaW50ZXI7CisJX191MTYgbGVuZ3RoOworCV9fdTE2IGZsYWdzOworfTsKKworc3RhdGljIGludCBkb193aXJlbGVzc19pb2N0bCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBpd3JlcSBfX3VzZXIgKml3cjsKKwlzdHJ1Y3QgaXdyZXEgX191c2VyICppd3JfdTsKKwlzdHJ1Y3QgaXdfcG9pbnQgX191c2VyICppd3A7CisJc3RydWN0IGNvbXBhdF9pd19wb2ludCBfX3VzZXIgKml3cF91OworCWNvbXBhdF9jYWRkcl90IHBvaW50ZXI7CisJX191MTYgbGVuZ3RoLCBmbGFnczsKKworCWl3cl91ID0gY29tcGF0X3B0cihhcmcpOworCWl3cF91ID0gKHN0cnVjdCBjb21wYXRfaXdfcG9pbnQgX191c2VyICopICZpd3JfdS0+dS5kYXRhOworCWl3ciA9IGNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHNpemVvZigqaXdyKSk7CisJaWYgKGl3ciA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWl3cCA9ICZpd3ItPnUuZGF0YTsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgaXdyLCBzaXplb2YoKml3cikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChfX2NvcHlfaW5fdXNlcigmaXdyLT5pZnJfaWZybi5pZnJuX25hbWVbMF0sCisJCQkgICAmaXdyX3UtPmlmcl9pZnJuLmlmcm5fbmFtZVswXSwKKwkJCSAgIHNpemVvZihpd3ItPmlmcl9pZnJuLmlmcm5fbmFtZSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChfX2dldF91c2VyKHBvaW50ZXIsICZpd3BfdS0+cG9pbnRlcikgfHwKKwkgICAgX19nZXRfdXNlcihsZW5ndGgsICZpd3BfdS0+bGVuZ3RoKSB8fAorCSAgICBfX2dldF91c2VyKGZsYWdzLCAmaXdwX3UtPmZsYWdzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoX19wdXRfdXNlcihjb21wYXRfcHRyKHBvaW50ZXIpLCAmaXdwLT5wb2ludGVyKSB8fAorCSAgICBfX3B1dF91c2VyKGxlbmd0aCwgJml3cC0+bGVuZ3RoKSB8fAorCSAgICBfX3B1dF91c2VyKGZsYWdzLCAmaXdwLT5mbGFncykpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIHN5c19pb2N0bChmZCwgY21kLCAodW5zaWduZWQgbG9uZykgaXdyKTsKK30KKworLyogU2luY2Ugb2xkIHN0eWxlIGJyaWRnZSBpb2N0bCdzIGVuZHVwIHVzaW5nIFNJT0NERVZQUklWQVRFCisgKiBmb3Igc29tZSBvcGVyYXRpb25zOyB0aGlzIGZvcmNlcyB1c2Ugb2YgdGhlIG5ld2VyIGJyaWRnZS11dGlscyB0aGF0CisgKiB1c2UgY29tcGF0aWFibGUgaW9jdGxzCisgKi8KK3N0YXRpYyBpbnQgb2xkX2JyaWRnZV9pb2N0bCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXUzMiB0bXA7CisKKwlpZiAoZ2V0X3VzZXIodG1wLCAodTMyIF9fdXNlciAqKSBhcmcpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAodG1wID09IEJSQ1RMX0dFVF9WRVJTSU9OKQorCQlyZXR1cm4gQlJDVExfVkVSU0lPTiArIDE7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19OQ1BfRlMpIHx8IGRlZmluZWQoQ09ORklHX05DUF9GU19NT0RVTEUpCitzdHJ1Y3QgbmNwX2lvY3RsX3JlcXVlc3RfMzIgeworCXUzMiBmdW5jdGlvbjsKKwl1MzIgc2l6ZTsKKwljb21wYXRfY2FkZHJfdCBkYXRhOworfTsKKworc3RydWN0IG5jcF9mc19pbmZvX3YyXzMyIHsKKwlzMzIgdmVyc2lvbjsKKwl1MzIgbW91bnRlZF91aWQ7CisJdTMyIGNvbm5lY3Rpb247CisJdTMyIGJ1ZmZlcl9zaXplOworCisJdTMyIHZvbHVtZV9udW1iZXI7CisJdTMyIGRpcmVjdG9yeV9pZDsKKworCXUzMiBkdW1teTE7CisJdTMyIGR1bW15MjsKKwl1MzIgZHVtbXkzOworfTsKKworc3RydWN0IG5jcF9vYmplY3RuYW1lX2lvY3RsXzMyCit7CisJczMyCQlhdXRoX3R5cGU7CisJdTMyCQlvYmplY3RfbmFtZV9sZW47CisJY29tcGF0X2NhZGRyX3QJb2JqZWN0X25hbWU7CS8qIGFuIHVzZXJzcGFjZSBkYXRhLCBpbiBtb3N0IGNhc2VzIHVzZXIgbmFtZSAqLworfTsKKworc3RydWN0IG5jcF9wcml2YXRlZGF0YV9pb2N0bF8zMgoreworCXUzMgkJbGVuOworCWNvbXBhdF9jYWRkcl90CWRhdGE7CQkvKiB+MTAwMCBmb3IgTkRTICovCit9OworCisjZGVmaW5lCU5DUF9JT0NfTkNQUkVRVUVTVF8zMgkJX0lPUignbicsIDEsIHN0cnVjdCBuY3BfaW9jdGxfcmVxdWVzdF8zMikKKyNkZWZpbmUgTkNQX0lPQ19HRVRNT1VOVFVJRDJfMzIJCV9JT1coJ24nLCAyLCB1MzIpCisjZGVmaW5lIE5DUF9JT0NfR0VUX0ZTX0lORk9fVjJfMzIJX0lPV1IoJ24nLCA0LCBzdHJ1Y3QgbmNwX2ZzX2luZm9fdjJfMzIpCisjZGVmaW5lIE5DUF9JT0NfR0VUT0JKRUNUTkFNRV8zMglfSU9XUignbicsIDksIHN0cnVjdCBuY3Bfb2JqZWN0bmFtZV9pb2N0bF8zMikKKyNkZWZpbmUgTkNQX0lPQ19TRVRPQkpFQ1ROQU1FXzMyCV9JT1IoJ24nLCA5LCBzdHJ1Y3QgbmNwX29iamVjdG5hbWVfaW9jdGxfMzIpCisjZGVmaW5lIE5DUF9JT0NfR0VUUFJJVkFURURBVEFfMzIJX0lPV1IoJ24nLCAxMCwgc3RydWN0IG5jcF9wcml2YXRlZGF0YV9pb2N0bF8zMikKKyNkZWZpbmUgTkNQX0lPQ19TRVRQUklWQVRFREFUQV8zMglfSU9SKCduJywgMTAsIHN0cnVjdCBuY3BfcHJpdmF0ZWRhdGFfaW9jdGxfMzIpCisKK3N0YXRpYyBpbnQgZG9fbmNwX25jcHJlcXVlc3QodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgbmNwX2lvY3RsX3JlcXVlc3RfMzIgbjMyOworCXN0cnVjdCBuY3BfaW9jdGxfcmVxdWVzdCBfX3VzZXIgKnAgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnApKTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmbjMyLCBjb21wYXRfcHRyKGFyZyksIHNpemVvZihuMzIpKSB8fAorCSAgICBwdXRfdXNlcihuMzIuZnVuY3Rpb24sICZwLT5mdW5jdGlvbikgfHwKKwkgICAgcHV0X3VzZXIobjMyLnNpemUsICZwLT5zaXplKSB8fAorCSAgICBwdXRfdXNlcihjb21wYXRfcHRyKG4zMi5kYXRhKSwgJnAtPmRhdGEpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBzeXNfaW9jdGwoZmQsIE5DUF9JT0NfTkNQUkVRVUVTVCwgKHVuc2lnbmVkIGxvbmcpcCk7Cit9CisKK3N0YXRpYyBpbnQgZG9fbmNwX2dldG1vdW50dWlkMih1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKKwlfX2tlcm5lbF91aWRfdCBrdWlkOworCWludCBlcnI7CisKKwljbWQgPSBOQ1BfSU9DX0dFVE1PVU5UVUlEMjsKKworCXNldF9mcyhLRVJORUxfRFMpOworCWVyciA9IHN5c19pb2N0bChmZCwgY21kLCAodW5zaWduZWQgbG9uZykma3VpZCk7CisJc2V0X2ZzKG9sZF9mcyk7CisKKwlpZiAoIWVycikKKwkJZXJyID0gcHV0X3VzZXIoa3VpZCwKKwkJCSAgICAgICAodW5zaWduZWQgaW50IF9fdXNlciAqKSBjb21wYXRfcHRyKGFyZykpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBkb19uY3BfZ2V0ZnNpbmZvMih1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKKwlzdHJ1Y3QgbmNwX2ZzX2luZm9fdjJfMzIgbjMyOworCXN0cnVjdCBuY3BfZnNfaW5mb192MiBuOworCWludCBlcnI7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJm4zMiwgY29tcGF0X3B0cihhcmcpLCBzaXplb2YobjMyKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChuMzIudmVyc2lvbiAhPSBOQ1BfR0VUX0ZTX0lORk9fVkVSU0lPTl9WMikKKwkJcmV0dXJuIC1FSU5WQUw7CisJbi52ZXJzaW9uID0gTkNQX0dFVF9GU19JTkZPX1ZFUlNJT05fVjI7CisKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKwllcnIgPSBzeXNfaW9jdGwoZmQsIE5DUF9JT0NfR0VUX0ZTX0lORk9fVjIsICh1bnNpZ25lZCBsb25nKSZuKTsKKwlzZXRfZnMob2xkX2ZzKTsKKworCWlmICghZXJyKSB7CisJCW4zMi52ZXJzaW9uID0gbi52ZXJzaW9uOworCQluMzIubW91bnRlZF91aWQgPSBuLm1vdW50ZWRfdWlkOworCQluMzIuY29ubmVjdGlvbiA9IG4uY29ubmVjdGlvbjsKKwkJbjMyLmJ1ZmZlcl9zaXplID0gbi5idWZmZXJfc2l6ZTsKKwkJbjMyLnZvbHVtZV9udW1iZXIgPSBuLnZvbHVtZV9udW1iZXI7CisJCW4zMi5kaXJlY3RvcnlfaWQgPSBuLmRpcmVjdG9yeV9pZDsKKwkJbjMyLmR1bW15MSA9IG4uZHVtbXkxOworCQluMzIuZHVtbXkyID0gbi5kdW1teTI7CisJCW4zMi5kdW1teTMgPSBuLmR1bW15MzsKKwkJZXJyID0gY29weV90b191c2VyKGNvbXBhdF9wdHIoYXJnKSwgJm4zMiwgc2l6ZW9mKG4zMikpID8gLUVGQVVMVCA6IDA7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZG9fbmNwX2dldG9iamVjdG5hbWUodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgbmNwX29iamVjdG5hbWVfaW9jdGxfMzIgbjMyLCBfX3VzZXIgKnAzMiA9IGNvbXBhdF9wdHIoYXJnKTsKKwlzdHJ1Y3QgbmNwX29iamVjdG5hbWVfaW9jdGwgX191c2VyICpwID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpwKSk7CisJczMyIGF1dGhfdHlwZTsKKwl1MzIgbmFtZV9sZW47CisJaW50IGVycjsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmbjMyLCBwMzIsIHNpemVvZihuMzIpKSB8fAorCSAgICBwdXRfdXNlcihuMzIub2JqZWN0X25hbWVfbGVuLCAmcC0+b2JqZWN0X25hbWVfbGVuKSB8fAorCSAgICBwdXRfdXNlcihjb21wYXRfcHRyKG4zMi5vYmplY3RfbmFtZSksICZwLT5vYmplY3RfbmFtZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJZXJyID0gc3lzX2lvY3RsKGZkLCBOQ1BfSU9DX0dFVE9CSkVDVE5BTUUsICh1bnNpZ25lZCBsb25nKXApOworICAgICAgICBpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKGdldF91c2VyKGF1dGhfdHlwZSwgJnAtPmF1dGhfdHlwZSkgfHwKKwkgICAgcHV0X3VzZXIoYXV0aF90eXBlLCAmcDMyLT5hdXRoX3R5cGUpIHx8CisJICAgIGdldF91c2VyKG5hbWVfbGVuLCAmcC0+b2JqZWN0X25hbWVfbGVuKSB8fAorCSAgICBwdXRfdXNlcihuYW1lX2xlbiwgJnAzMi0+b2JqZWN0X25hbWVfbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb19uY3Bfc2V0b2JqZWN0bmFtZSh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBuY3Bfb2JqZWN0bmFtZV9pb2N0bF8zMiBuMzIsIF9fdXNlciAqcDMyID0gY29tcGF0X3B0cihhcmcpOworCXN0cnVjdCBuY3Bfb2JqZWN0bmFtZV9pb2N0bCBfX3VzZXIgKnAgPSBjb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnApKTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmbjMyLCBwMzIsIHNpemVvZihuMzIpKSB8fAorCSAgICBwdXRfdXNlcihuMzIuYXV0aF90eXBlLCAmcC0+YXV0aF90eXBlKSB8fAorCSAgICBwdXRfdXNlcihuMzIub2JqZWN0X25hbWVfbGVuLCAmcC0+b2JqZWN0X25hbWVfbGVuKSB8fAorCSAgICBwdXRfdXNlcihjb21wYXRfcHRyKG4zMi5vYmplY3RfbmFtZSksICZwLT5vYmplY3RfbmFtZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIHN5c19pb2N0bChmZCwgTkNQX0lPQ19TRVRPQkpFQ1ROQU1FLCAodW5zaWduZWQgbG9uZylwKTsKK30KKworc3RhdGljIGludCBkb19uY3BfZ2V0cHJpdmF0ZWRhdGEodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgbmNwX3ByaXZhdGVkYXRhX2lvY3RsXzMyIG4zMiwgX191c2VyICpwMzIgPSBjb21wYXRfcHRyKGFyZyk7CisJc3RydWN0IG5jcF9wcml2YXRlZGF0YV9pb2N0bCBfX3VzZXIgKnAgPQorCQljb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnApKTsKKwl1MzIgbGVuOworCWludCBlcnI7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJm4zMiwgcDMyLCBzaXplb2YobjMyKSkgfHwKKwkgICAgcHV0X3VzZXIobjMyLmxlbiwgJnAtPmxlbikgfHwKKwkgICAgcHV0X3VzZXIoY29tcGF0X3B0cihuMzIuZGF0YSksICZwLT5kYXRhKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwllcnIgPSBzeXNfaW9jdGwoZmQsIE5DUF9JT0NfR0VUUFJJVkFURURBVEEsICh1bnNpZ25lZCBsb25nKXApOworICAgICAgICBpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKGdldF91c2VyKGxlbiwgJnAtPmxlbikgfHwKKwkgICAgcHV0X3VzZXIobGVuLCAmcDMyLT5sZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRvX25jcF9zZXRwcml2YXRlZGF0YSh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBuY3BfcHJpdmF0ZWRhdGFfaW9jdGxfMzIgbjMyOworCXN0cnVjdCBuY3BfcHJpdmF0ZWRhdGFfaW9jdGxfMzIgX191c2VyICpwMzIgPSBjb21wYXRfcHRyKGFyZyk7CisJc3RydWN0IG5jcF9wcml2YXRlZGF0YV9pb2N0bCBfX3VzZXIgKnAgPQorCQljb21wYXRfYWxsb2NfdXNlcl9zcGFjZShzaXplb2YoKnApKTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmbjMyLCBwMzIsIHNpemVvZihuMzIpKSB8fAorCSAgICBwdXRfdXNlcihuMzIubGVuLCAmcC0+bGVuKSB8fAorCSAgICBwdXRfdXNlcihjb21wYXRfcHRyKG4zMi5kYXRhKSwgJnAtPmRhdGEpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBzeXNfaW9jdGwoZmQsIE5DUF9JT0NfU0VUUFJJVkFURURBVEEsICh1bnNpZ25lZCBsb25nKXApOworfQorI2VuZGlmCisKKyN1bmRlZiBDT0RFCisjZW5kaWYKKworI2lmZGVmIERFQ0xBUkVTCitIQU5ETEVfSU9DVEwoTUVNUkVBRE9PQjMyLCBtdGRfcndfb29iKQorSEFORExFX0lPQ1RMKE1FTVdSSVRFT09CMzIsIG10ZF9yd19vb2IpCisjaWZkZWYgQ09ORklHX05FVAorSEFORExFX0lPQ1RMKFNJT0NHSUZOQU1FLCBkZXZfaWZuYW1lMzIpCitIQU5ETEVfSU9DVEwoU0lPQ0dJRkNPTkYsIGRldl9pZmNvbmYpCitIQU5ETEVfSU9DVEwoU0lPQ0dJRkZMQUdTLCBkZXZfaWZzaW9jKQorSEFORExFX0lPQ1RMKFNJT0NTSUZGTEFHUywgZGV2X2lmc2lvYykKK0hBTkRMRV9JT0NUTChTSU9DR0lGTUVUUklDLCBkZXZfaWZzaW9jKQorSEFORExFX0lPQ1RMKFNJT0NTSUZNRVRSSUMsIGRldl9pZnNpb2MpCitIQU5ETEVfSU9DVEwoU0lPQ0dJRk1UVSwgZGV2X2lmc2lvYykKK0hBTkRMRV9JT0NUTChTSU9DU0lGTVRVLCBkZXZfaWZzaW9jKQorSEFORExFX0lPQ1RMKFNJT0NHSUZNRU0sIGRldl9pZnNpb2MpCitIQU5ETEVfSU9DVEwoU0lPQ1NJRk1FTSwgZGV2X2lmc2lvYykKK0hBTkRMRV9JT0NUTChTSU9DR0lGSFdBRERSLCBkZXZfaWZzaW9jKQorSEFORExFX0lPQ1RMKFNJT0NTSUZIV0FERFIsIGRldl9pZnNpb2MpCitIQU5ETEVfSU9DVEwoU0lPQ0FERE1VTFRJLCBkZXZfaWZzaW9jKQorSEFORExFX0lPQ1RMKFNJT0NERUxNVUxUSSwgZGV2X2lmc2lvYykKK0hBTkRMRV9JT0NUTChTSU9DR0lGSU5ERVgsIGRldl9pZnNpb2MpCitIQU5ETEVfSU9DVEwoU0lPQ0dJRk1BUCwgZGV2X2lmc2lvYykKK0hBTkRMRV9JT0NUTChTSU9DU0lGTUFQLCBkZXZfaWZzaW9jKQorSEFORExFX0lPQ1RMKFNJT0NHSUZBRERSLCBkZXZfaWZzaW9jKQorSEFORExFX0lPQ1RMKFNJT0NTSUZBRERSLCBkZXZfaWZzaW9jKQorCisvKiBpb2N0bHMgdXNlZCBieSBhcHBsZXRhbGsgZGRwLmMgKi8KK0hBTkRMRV9JT0NUTChTSU9DQVRBTEtESUZBRERSLCBkZXZfaWZzaW9jKQorSEFORExFX0lPQ1RMKFNJT0NESUZBRERSLCBkZXZfaWZzaW9jKQorSEFORExFX0lPQ1RMKFNJT0NTQVJQLCBkZXZfaWZzaW9jKQorSEFORExFX0lPQ1RMKFNJT0NEQVJQLCBkZXZfaWZzaW9jKQorCitIQU5ETEVfSU9DVEwoU0lPQ0dJRkJSREFERFIsIGRldl9pZnNpb2MpCitIQU5ETEVfSU9DVEwoU0lPQ1NJRkJSREFERFIsIGRldl9pZnNpb2MpCitIQU5ETEVfSU9DVEwoU0lPQ0dJRkRTVEFERFIsIGRldl9pZnNpb2MpCitIQU5ETEVfSU9DVEwoU0lPQ1NJRkRTVEFERFIsIGRldl9pZnNpb2MpCitIQU5ETEVfSU9DVEwoU0lPQ0dJRk5FVE1BU0ssIGRldl9pZnNpb2MpCitIQU5ETEVfSU9DVEwoU0lPQ1NJRk5FVE1BU0ssIGRldl9pZnNpb2MpCitIQU5ETEVfSU9DVEwoU0lPQ1NJRlBGTEFHUywgZGV2X2lmc2lvYykKK0hBTkRMRV9JT0NUTChTSU9DR0lGUEZMQUdTLCBkZXZfaWZzaW9jKQorSEFORExFX0lPQ1RMKFNJT0NHSUZUWFFMRU4sIGRldl9pZnNpb2MpCitIQU5ETEVfSU9DVEwoU0lPQ1NJRlRYUUxFTiwgZGV2X2lmc2lvYykKK0hBTkRMRV9JT0NUTChUVU5TRVRJRkYsIGRldl9pZnNpb2MpCitIQU5ETEVfSU9DVEwoU0lPQ0VUSFRPT0wsIGV0aHRvb2xfaW9jdGwpCitIQU5ETEVfSU9DVEwoU0lPQ0JPTkRFTlNMQVZFLCBib25kX2lvY3RsKQorSEFORExFX0lPQ1RMKFNJT0NCT05EUkVMRUFTRSwgYm9uZF9pb2N0bCkKK0hBTkRMRV9JT0NUTChTSU9DQk9ORFNFVEhXQUREUiwgYm9uZF9pb2N0bCkKK0hBTkRMRV9JT0NUTChTSU9DQk9ORFNMQVZFSU5GT1FVRVJZLCBib25kX2lvY3RsKQorSEFORExFX0lPQ1RMKFNJT0NCT05ESU5GT1FVRVJZLCBib25kX2lvY3RsKQorSEFORExFX0lPQ1RMKFNJT0NCT05EQ0hBTkdFQUNUSVZFLCBib25kX2lvY3RsKQorSEFORExFX0lPQ1RMKFNJT0NBRERSVCwgcm91dGluZ19pb2N0bCkKK0hBTkRMRV9JT0NUTChTSU9DREVMUlQsIHJvdXRpbmdfaW9jdGwpCitIQU5ETEVfSU9DVEwoU0lPQ0JSQURESUYsIGRldl9pZnNpb2MpCitIQU5ETEVfSU9DVEwoU0lPQ0JSREVMSUYsIGRldl9pZnNpb2MpCisvKiBOb3RlIFNJT0NSVE1TRyBpcyBubyBsb25nZXIsIHNvIHRoaXMgaXMgc2FmZSBhbmQgKiB0aGUgdXNlciB3b3VsZCBoYXZlIHNlZW4ganVzdCBhbiAtRUlOVkFMIGFueXdheXMuICovCitIQU5ETEVfSU9DVEwoU0lPQ1JUTVNHLCByZXRfZWludmFsKQorSEFORExFX0lPQ1RMKFNJT0NHU1RBTVAsIGRvX3Npb2Nnc3RhbXApCisjZW5kaWYKK0hBTkRMRV9JT0NUTChIRElPX0dFVEdFTywgaGRpb19nZXRnZW8pCitIQU5ETEVfSU9DVEwoQkxLUkFHRVQsIHdfbG9uZykKK0hBTkRMRV9JT0NUTChCTEtHRVRTSVpFLCB3X2xvbmcpCitIQU5ETEVfSU9DVEwoMHgxMjYwLCBicm9rZW5fYmxrZ2V0c2l6ZSkKK0hBTkRMRV9JT0NUTChCTEtGUkFHRVQsIHdfbG9uZykKK0hBTkRMRV9JT0NUTChCTEtTRUNUR0VULCB3X2xvbmcpCitIQU5ETEVfSU9DVEwoRkJJT0dFVF9GU0NSRUVOSU5GTywgZmJfaW9jdGxfdHJhbnMpCitIQU5ETEVfSU9DVEwoQkxLUEcsIGJsa3BnX2lvY3RsX3RyYW5zKQorSEFORExFX0lPQ1RMKEZCSU9HRVRDTUFQLCBmYl9pb2N0bF90cmFucykKK0hBTkRMRV9JT0NUTChGQklPUFVUQ01BUCwgZmJfaW9jdGxfdHJhbnMpCitIQU5ETEVfSU9DVEwoSERJT19HRVRfS0VFUFNFVFRJTkdTLCBoZGlvX2lvY3RsX3RyYW5zKQorSEFORExFX0lPQ1RMKEhESU9fR0VUX1VOTUFTS0lOVFIsIGhkaW9faW9jdGxfdHJhbnMpCitIQU5ETEVfSU9DVEwoSERJT19HRVRfRE1BLCBoZGlvX2lvY3RsX3RyYW5zKQorSEFORExFX0lPQ1RMKEhESU9fR0VUXzMyQklULCBoZGlvX2lvY3RsX3RyYW5zKQorSEFORExFX0lPQ1RMKEhESU9fR0VUX01VTFRDT1VOVCwgaGRpb19pb2N0bF90cmFucykKK0hBTkRMRV9JT0NUTChIRElPX0dFVF9OT1dFUlIsIGhkaW9faW9jdGxfdHJhbnMpCitIQU5ETEVfSU9DVEwoSERJT19HRVRfTklDRSwgaGRpb19pb2N0bF90cmFucykKK0hBTkRMRV9JT0NUTChGRFNFVFBSTTMyLCBmZF9pb2N0bF90cmFucykKK0hBTkRMRV9JT0NUTChGRERFRlBSTTMyLCBmZF9pb2N0bF90cmFucykKK0hBTkRMRV9JT0NUTChGREdFVFBSTTMyLCBmZF9pb2N0bF90cmFucykKK0hBTkRMRV9JT0NUTChGRFNFVERSVlBSTTMyLCBmZF9pb2N0bF90cmFucykKK0hBTkRMRV9JT0NUTChGREdFVERSVlBSTTMyLCBmZF9pb2N0bF90cmFucykKK0hBTkRMRV9JT0NUTChGREdFVERSVlNUQVQzMiwgZmRfaW9jdGxfdHJhbnMpCitIQU5ETEVfSU9DVEwoRkRQT0xMRFJWU1RBVDMyLCBmZF9pb2N0bF90cmFucykKK0hBTkRMRV9JT0NUTChGREdFVEZEQ1NUQVQzMiwgZmRfaW9jdGxfdHJhbnMpCitIQU5ETEVfSU9DVEwoRkRXRVJST1JHRVQzMiwgZmRfaW9jdGxfdHJhbnMpCitIQU5ETEVfSU9DVEwoU0dfSU8sc2dfaW9jdGxfdHJhbnMpCitIQU5ETEVfSU9DVEwoUFBQSU9DR0lETEUzMiwgcHBwX2lvY3RsX3RyYW5zKQorSEFORExFX0lPQ1RMKFBQUElPQ1NDT01QUkVTUzMyLCBwcHBfaW9jdGxfdHJhbnMpCitIQU5ETEVfSU9DVEwoUFBQSU9DU1BBU1MzMiwgcHBwX3NvY2tfZnByb2dfaW9jdGxfdHJhbnMpCitIQU5ETEVfSU9DVEwoUFBQSU9DU0FDVElWRTMyLCBwcHBfc29ja19mcHJvZ19pb2N0bF90cmFucykKK0hBTkRMRV9JT0NUTChNVElPQ0dFVDMyLCBtdF9pb2N0bF90cmFucykKK0hBTkRMRV9JT0NUTChNVElPQ1BPUzMyLCBtdF9pb2N0bF90cmFucykKK0hBTkRMRV9JT0NUTChDRFJPTVJFQURBVURJTywgY2Ryb21faW9jdGxfdHJhbnMpCitIQU5ETEVfSU9DVEwoQ0RST01fU0VORF9QQUNLRVQsIGNkcm9tX2lvY3RsX3RyYW5zKQorSEFORExFX0lPQ1RMKExPT1BfU0VUX1NUQVRVUywgbG9vcF9zdGF0dXMpCitIQU5ETEVfSU9DVEwoTE9PUF9HRVRfU1RBVFVTLCBsb29wX3N0YXR1cykKKyNkZWZpbmUgQVVUT0ZTX0lPQ19TRVRUSU1FT1VUMzIgX0lPV1IoMHg5MywweDY0LHVuc2lnbmVkIGludCkKK0hBTkRMRV9JT0NUTChBVVRPRlNfSU9DX1NFVFRJTUVPVVQzMiwgaW9jX3NldHRpbWVvdXQpCisjaWZkZWYgQ09ORklHX1ZUCitIQU5ETEVfSU9DVEwoUElPX0ZPTlRYLCBkb19mb250eF9pb2N0bCkKK0hBTkRMRV9JT0NUTChHSU9fRk9OVFgsIGRvX2ZvbnR4X2lvY3RsKQorSEFORExFX0lPQ1RMKFBJT19VTklNQVAsIGRvX3VuaW1hcF9pb2N0bCkKK0hBTkRMRV9JT0NUTChHSU9fVU5JTUFQLCBkb191bmltYXBfaW9jdGwpCitIQU5ETEVfSU9DVEwoS0RGT05UT1AsIGRvX2tkZm9udG9wX2lvY3RsKQorI2VuZGlmCitIQU5ETEVfSU9DVEwoRVhUMl9JT0MzMl9HRVRGTEFHUywgZG9fZXh0Ml9pb2N0bCkKK0hBTkRMRV9JT0NUTChFWFQyX0lPQzMyX1NFVEZMQUdTLCBkb19leHQyX2lvY3RsKQorSEFORExFX0lPQ1RMKEVYVDJfSU9DMzJfR0VUVkVSU0lPTiwgZG9fZXh0Ml9pb2N0bCkKK0hBTkRMRV9JT0NUTChFWFQyX0lPQzMyX1NFVFZFUlNJT04sIGRvX2V4dDJfaW9jdGwpCitIQU5ETEVfSU9DVEwoVklESU9DR1RVTkVSMzIsIGRvX3ZpZGVvX2lvY3RsKQorSEFORExFX0lPQ1RMKFZJRElPQ1NUVU5FUjMyLCBkb192aWRlb19pb2N0bCkKK0hBTkRMRV9JT0NUTChWSURJT0NHV0lOMzIsIGRvX3ZpZGVvX2lvY3RsKQorSEFORExFX0lPQ1RMKFZJRElPQ1NXSU4zMiwgZG9fc2V0X3dpbmRvdykKK0hBTkRMRV9JT0NUTChWSURJT0NHRkJVRjMyLCBkb192aWRlb19pb2N0bCkKK0hBTkRMRV9JT0NUTChWSURJT0NTRkJVRjMyLCBkb192aWRlb19pb2N0bCkKK0hBTkRMRV9JT0NUTChWSURJT0NHRlJFUTMyLCBkb192aWRlb19pb2N0bCkKK0hBTkRMRV9JT0NUTChWSURJT0NTRlJFUTMyLCBkb192aWRlb19pb2N0bCkKKy8qIE9uZSBTTUIgaW9jdGwgbmVlZHMgdHJhbnNsYXRpb25zLiAqLworI2RlZmluZSBTTUJfSU9DX0dFVE1PVU5UVUlEXzMyIF9JT1IoJ3UnLCAxLCBjb21wYXRfdWlkX3QpCitIQU5ETEVfSU9DVEwoU01CX0lPQ19HRVRNT1VOVFVJRF8zMiwgZG9fc21iX2dldG1vdW50dWlkKQorSEFORExFX0lPQ1RMKEFUTV9HRVRMSU5LUkFURTMyLCBkb19hdG1faW9jdGwpCitIQU5ETEVfSU9DVEwoQVRNX0dFVE5BTUVTMzIsIGRvX2F0bV9pb2N0bCkKK0hBTkRMRV9JT0NUTChBVE1fR0VUVFlQRTMyLCBkb19hdG1faW9jdGwpCitIQU5ETEVfSU9DVEwoQVRNX0dFVEVTSTMyLCBkb19hdG1faW9jdGwpCitIQU5ETEVfSU9DVEwoQVRNX0dFVEFERFIzMiwgZG9fYXRtX2lvY3RsKQorSEFORExFX0lPQ1RMKEFUTV9SU1RBRERSMzIsIGRvX2F0bV9pb2N0bCkKK0hBTkRMRV9JT0NUTChBVE1fQUREQUREUjMyLCBkb19hdG1faW9jdGwpCitIQU5ETEVfSU9DVEwoQVRNX0RFTEFERFIzMiwgZG9fYXRtX2lvY3RsKQorSEFORExFX0lPQ1RMKEFUTV9HRVRDSVJBTkdFMzIsIGRvX2F0bV9pb2N0bCkKK0hBTkRMRV9JT0NUTChBVE1fU0VUQ0lSQU5HRTMyLCBkb19hdG1faW9jdGwpCitIQU5ETEVfSU9DVEwoQVRNX1NFVEVTSTMyLCBkb19hdG1faW9jdGwpCitIQU5ETEVfSU9DVEwoQVRNX1NFVEVTSUYzMiwgZG9fYXRtX2lvY3RsKQorSEFORExFX0lPQ1RMKEFUTV9HRVRTVEFUMzIsIGRvX2F0bV9pb2N0bCkKK0hBTkRMRV9JT0NUTChBVE1fR0VUU1RBVFozMiwgZG9fYXRtX2lvY3RsKQorSEFORExFX0lPQ1RMKEFUTV9HRVRMT09QMzIsIGRvX2F0bV9pb2N0bCkKK0hBTkRMRV9JT0NUTChBVE1fU0VUTE9PUDMyLCBkb19hdG1faW9jdGwpCitIQU5ETEVfSU9DVEwoQVRNX1FVRVJZTE9PUDMyLCBkb19hdG1faW9jdGwpCitIQU5ETEVfSU9DVEwoU09ORVRfR0VUU1RBVCwgZG9fYXRtX2lvY3RsKQorSEFORExFX0lPQ1RMKFNPTkVUX0dFVFNUQVRaLCBkb19hdG1faW9jdGwpCitIQU5ETEVfSU9DVEwoU09ORVRfR0VURElBRywgZG9fYXRtX2lvY3RsKQorSEFORExFX0lPQ1RMKFNPTkVUX1NFVERJQUcsIGRvX2F0bV9pb2N0bCkKK0hBTkRMRV9JT0NUTChTT05FVF9DTFJESUFHLCBkb19hdG1faW9jdGwpCitIQU5ETEVfSU9DVEwoU09ORVRfU0VURlJBTUlORywgZG9fYXRtX2lvY3RsKQorSEFORExFX0lPQ1RMKFNPTkVUX0dFVEZSQU1JTkcsIGRvX2F0bV9pb2N0bCkKK0hBTkRMRV9JT0NUTChTT05FVF9HRVRGUlNFTlNFLCBkb19hdG1faW9jdGwpCisvKiBibG9jayBzdHVmZiAqLworSEFORExFX0lPQ1RMKEJMS0JTWkdFVF8zMiwgZG9fYmxrYnN6Z2V0KQorSEFORExFX0lPQ1RMKEJMS0JTWlNFVF8zMiwgZG9fYmxrYnN6c2V0KQorSEFORExFX0lPQ1RMKEJMS0dFVFNJWkU2NF8zMiwgZG9fYmxrZ2V0c2l6ZTY0KQorLyogdmZhdCAqLworSEFORExFX0lPQ1RMKFZGQVRfSU9DVExfUkVBRERJUl9CT1RIMzIsIHZmYXRfaW9jdGwzMikKK0hBTkRMRV9JT0NUTChWRkFUX0lPQ1RMX1JFQURESVJfU0hPUlQzMiwgdmZhdF9pb2N0bDMyKQorSEFORExFX0lPQ1RMKFJFSVNFUkZTX0lPQ19VTlBBQ0szMiwgcmVpc2VyZnNfaW9jdGwzMikKKy8qIFJhdyBkZXZpY2VzICovCitIQU5ETEVfSU9DVEwoUkFXX1NFVEJJTkQsIHJhd19pb2N0bCkKK0hBTkRMRV9JT0NUTChSQVdfR0VUQklORCwgcmF3X2lvY3RsKQorLyogU2VyaWFsICovCitIQU5ETEVfSU9DVEwoVElPQ0dTRVJJQUwsIHNlcmlhbF9zdHJ1Y3RfaW9jdGwpCitIQU5ETEVfSU9DVEwoVElPQ1NTRVJJQUwsIHNlcmlhbF9zdHJ1Y3RfaW9jdGwpCisvKiBVc2JkZXZmcyAqLworSEFORExFX0lPQ1RMKFVTQkRFVkZTX0NPTlRST0wzMiwgZG9fdXNiZGV2ZnNfY29udHJvbCkKK0hBTkRMRV9JT0NUTChVU0JERVZGU19CVUxLMzIsIGRvX3VzYmRldmZzX2J1bGspCitIQU5ETEVfSU9DVEwoVVNCREVWRlNfRElTQ1NJR05BTDMyLCBkb191c2JkZXZmc19kaXNjc2lnbmFsKQorLyogaTJjICovCitIQU5ETEVfSU9DVEwoSTJDX0ZVTkNTLCB3X2xvbmcpCitIQU5ETEVfSU9DVEwoSTJDX1JEV1IsIGRvX2kyY19yZHdyX2lvY3RsKQorSEFORExFX0lPQ1RMKEkyQ19TTUJVUywgZG9faTJjX3NtYnVzX2lvY3RsKQorLyogd2lyZWxlc3MgKi8KK0hBTkRMRV9JT0NUTChTSU9DR0lXUkFOR0UsIGRvX3dpcmVsZXNzX2lvY3RsKQorSEFORExFX0lPQ1RMKFNJT0NTSVdTUFksIGRvX3dpcmVsZXNzX2lvY3RsKQorSEFORExFX0lPQ1RMKFNJT0NHSVdTUFksIGRvX3dpcmVsZXNzX2lvY3RsKQorSEFORExFX0lPQ1RMKFNJT0NTSVdUSFJTUFksIGRvX3dpcmVsZXNzX2lvY3RsKQorSEFORExFX0lPQ1RMKFNJT0NHSVdUSFJTUFksIGRvX3dpcmVsZXNzX2lvY3RsKQorSEFORExFX0lPQ1RMKFNJT0NHSVdBUExJU1QsIGRvX3dpcmVsZXNzX2lvY3RsKQorSEFORExFX0lPQ1RMKFNJT0NHSVdTQ0FOLCBkb193aXJlbGVzc19pb2N0bCkKK0hBTkRMRV9JT0NUTChTSU9DU0lXRVNTSUQsIGRvX3dpcmVsZXNzX2lvY3RsKQorSEFORExFX0lPQ1RMKFNJT0NHSVdFU1NJRCwgZG9fd2lyZWxlc3NfaW9jdGwpCitIQU5ETEVfSU9DVEwoU0lPQ1NJV05JQ0tOLCBkb193aXJlbGVzc19pb2N0bCkKK0hBTkRMRV9JT0NUTChTSU9DR0lXTklDS04sIGRvX3dpcmVsZXNzX2lvY3RsKQorSEFORExFX0lPQ1RMKFNJT0NTSVdFTkNPREUsIGRvX3dpcmVsZXNzX2lvY3RsKQorSEFORExFX0lPQ1RMKFNJT0NHSVdFTkNPREUsIGRvX3dpcmVsZXNzX2lvY3RsKQorSEFORExFX0lPQ1RMKFNJT0NTSUZCUiwgb2xkX2JyaWRnZV9pb2N0bCkKK0hBTkRMRV9JT0NUTChTSU9DR0lGQlIsIG9sZF9icmlkZ2VfaW9jdGwpCisKKyNpZiBkZWZpbmVkKENPTkZJR19OQ1BfRlMpIHx8IGRlZmluZWQoQ09ORklHX05DUF9GU19NT0RVTEUpCitIQU5ETEVfSU9DVEwoTkNQX0lPQ19OQ1BSRVFVRVNUXzMyLCBkb19uY3BfbmNwcmVxdWVzdCkKK0hBTkRMRV9JT0NUTChOQ1BfSU9DX0dFVE1PVU5UVUlEMl8zMiwgZG9fbmNwX2dldG1vdW50dWlkMikKK0hBTkRMRV9JT0NUTChOQ1BfSU9DX0dFVF9GU19JTkZPX1YyXzMyLCBkb19uY3BfZ2V0ZnNpbmZvMikKK0hBTkRMRV9JT0NUTChOQ1BfSU9DX0dFVE9CSkVDVE5BTUVfMzIsIGRvX25jcF9nZXRvYmplY3RuYW1lKQorSEFORExFX0lPQ1RMKE5DUF9JT0NfU0VUT0JKRUNUTkFNRV8zMiwgZG9fbmNwX3NldG9iamVjdG5hbWUpCitIQU5ETEVfSU9DVEwoTkNQX0lPQ19HRVRQUklWQVRFREFUQV8zMiwgZG9fbmNwX2dldHByaXZhdGVkYXRhKQorSEFORExFX0lPQ1RMKE5DUF9JT0NfU0VUUFJJVkFURURBVEFfMzIsIGRvX25jcF9zZXRwcml2YXRlZGF0YSkKKyNlbmRpZgorCisjdW5kZWYgREVDTEFSRVMKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvY3JhbWZzL01ha2VmaWxlIGIvZnMvY3JhbWZzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZWJiNDYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9jcmFtZnMvTWFrZWZpbGUKQEAgLTAsMCArMSw3IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgbGludXggY3JhbWZzIHJvdXRpbmVzLgorIworCitvYmotJChDT05GSUdfQ1JBTUZTKSArPSBjcmFtZnMubworCitjcmFtZnMtb2JqcyA6PSBpbm9kZS5vIHVuY29tcHJlc3MubwpkaWZmIC0tZ2l0IGEvZnMvY3JhbWZzL1JFQURNRSBiL2ZzL2NyYW1mcy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ1ZDFjMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2NyYW1mcy9SRUFETUUKQEAgLTAsMCArMSwxNjggQEAKK05vdGVzIG9uIEZpbGVzeXN0ZW0gTGF5b3V0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGVzZSBub3RlcyBkZXNjcmliZSB3aGF0IG1rY3JhbWZzIGdlbmVyYXRlcy4gIEtlcm5lbCByZXF1aXJlbWVudHMgYXJlCithIGJpdCBsb29zZXIsIGUuZy4gaXQgZG9lc24ndCBjYXJlIGlmIHRoZSA8ZmlsZV9kYXRhPiBpdGVtcyBhcmUKK3N3YXBwZWQgYXJvdW5kICh0aG91Z2ggaXQgZG9lcyBjYXJlIHRoYXQgZGlyZWN0b3J5IGVudHJpZXMgKGlub2RlcykgaW4KK2EgZ2l2ZW4gZGlyZWN0b3J5IGFyZSBjb250aWd1b3VzLCBhcyB0aGlzIGlzIHVzZWQgYnkgcmVhZGRpcikuCisKK0FsbCBkYXRhIGlzIGN1cnJlbnRseSBpbiBob3N0LWVuZGlhbiBmb3JtYXQ7IG5laXRoZXIgbWtjcmFtZnMgbm9yIHRoZQora2VybmVsIGV2ZXIgZG8gc3dhYmJpbmcuICAoU2VlIHNlY3Rpb24gYEJsb2NrIFNpemUnIGJlbG93LikKKworPGZpbGVzeXN0ZW0+OgorCTxzdXBlcmJsb2NrPgorCTxkaXJlY3Rvcnlfc3RydWN0dXJlPgorCTxkYXRhPgorCis8c3VwZXJibG9jaz46IHN0cnVjdCBjcmFtZnNfc3VwZXIgKHNlZSBjcmFtZnNfZnMuaCkuCisKKzxkaXJlY3Rvcnlfc3RydWN0dXJlPjoKKwlGb3IgZWFjaCBmaWxlOgorCQlzdHJ1Y3QgY3JhbWZzX2lub2RlIChzZWUgY3JhbWZzX2ZzLmgpLgorCQlGaWxlbmFtZS4gIE5vdCBnZW5lcmFsbHkgbnVsbC10ZXJtaW5hdGVkLCBidXQgaXQgaXMKKwkJIG51bGwtcGFkZGVkIHRvIGEgbXVsdGlwbGUgb2YgNCBieXRlcy4KKworVGhlIG9yZGVyIG9mIGlub2RlIHRyYXZlcnNhbCBpcyBkZXNjcmliZWQgYXMgIndpZHRoLWZpcnN0IiAobm90IHRvIGJlCitjb25mdXNlZCB3aXRoIGJyZWFkdGgtZmlyc3QpOyBpLmUuIGxpa2UgZGVwdGgtZmlyc3QgYnV0IGxpc3RpbmcgYWxsIG9mCithIGRpcmVjdG9yeSdzIGVudHJpZXMgYmVmb3JlIHJlY3Vyc2luZyBkb3duIGl0cyBzdWJkaXJlY3RvcmllczogdGhlCitzYW1lIG9yZGVyIGFzIGBscyAtQVVSJyAoYnV0IHdpdGhvdXQgdGhlIC9eXC4uKjokLyBkaXJlY3RvcnkgaGVhZGVyCitsaW5lcyk7IHB1dCBhbm90aGVyIHdheSwgdGhlIHNhbWUgb3JkZXIgYXMgYGZpbmQgLXR5cGUgZCAtZXhlYworbHMgLUFVMSB7fSBcOycuCisKK0JlZ2lubmluZyBpbiAyLjQuNywgZGlyZWN0b3J5IGVudHJpZXMgYXJlIHNvcnRlZC4gIFRoaXMgb3B0aW1pemF0aW9uCithbGxvd3MgY3JhbWZzX2xvb2t1cCB0byByZXR1cm4gbW9yZSBxdWlja2x5IHdoZW4gYSBmaWxlbmFtZSBkb2VzIG5vdAorZXhpc3QsIHNwZWVkcyB1cCB1c2VyLXNwYWNlIGRpcmVjdG9yeSBzb3J0cywgZXRjLgorCis8ZGF0YT46CisJT25lIDxmaWxlX2RhdGE+IGZvciBlYWNoIGZpbGUgdGhhdCdzIGVpdGhlciBhIHN5bWxpbmsgb3IgYQorCSByZWd1bGFyIGZpbGUgb2Ygbm9uLXplcm8gc3Rfc2l6ZS4KKworPGZpbGVfZGF0YT46CisJbmJsb2NrcyAqIDxibG9ja19wb2ludGVyPgorCSAod2hlcmUgbmJsb2NrcyA9IChzdF9zaXplIC0gMSkgLyBibGtzaXplICsgMSkKKwluYmxvY2tzICogPGJsb2NrPgorCXBhZGRpbmcgdG8gbXVsdGlwbGUgb2YgNCBieXRlcworCitUaGUgaSd0aCA8YmxvY2tfcG9pbnRlcj4gZm9yIGEgZmlsZSBzdG9yZXMgdGhlIGJ5dGUgb2Zmc2V0IG9mIHRoZQorKmVuZCogb2YgdGhlIGkndGggPGJsb2NrPiAoaS5lLiBvbmUgcGFzdCB0aGUgbGFzdCBieXRlLCB3aGljaCBpcyB0aGUKK3NhbWUgYXMgdGhlIHN0YXJ0IG9mIHRoZSAoaSsxKSd0aCA8YmxvY2s+IGlmIHRoZXJlIGlzIG9uZSkuICBUaGUgZmlyc3QKKzxibG9jaz4gaW1tZWRpYXRlbHkgZm9sbG93cyB0aGUgbGFzdCA8YmxvY2tfcG9pbnRlcj4gZm9yIHRoZSBmaWxlLgorPGJsb2NrX3BvaW50ZXI+cyBhcmUgZWFjaCAzMiBiaXRzIGxvbmcuCisKK1RoZSBvcmRlciBvZiA8ZmlsZV9kYXRhPidzIGlzIGEgZGVwdGgtZmlyc3QgZGVzY2VudCBvZiB0aGUgZGlyZWN0b3J5Cit0cmVlLCBpLmUuIHRoZSBzYW1lIG9yZGVyIGFzIGBmaW5kIC1zaXplICswIFwoIC10eXBlIGYgLW8gLXR5cGUgbCBcKQorLXByaW50Jy4KKworCis8YmxvY2s+OiBUaGUgaSd0aCA8YmxvY2s+IGlzIHRoZSBvdXRwdXQgb2YgemxpYidzIGNvbXByZXNzIGZ1bmN0aW9uCithcHBsaWVkIHRvIHRoZSBpJ3RoIGJsa3NpemUtc2l6ZWQgY2h1bmsgb2YgdGhlIGlucHV0IGRhdGEuCisoRm9yIHRoZSBsYXN0IDxibG9jaz4gb2YgdGhlIGZpbGUsIHRoZSBpbnB1dCBtYXkgb2YgY291cnNlIGJlIHNtYWxsZXIuKQorRWFjaCA8YmxvY2s+IG1heSBiZSBhIGRpZmZlcmVudCBzaXplLiAgKFNlZSA8YmxvY2tfcG9pbnRlcj4gYWJvdmUuKQorPGJsb2NrPnMgYXJlIG1lcmVseSBieXRlLWFsaWduZWQsIG5vdCBnZW5lcmFsbHkgdTMyLWFsaWduZWQuCisKKworSG9sZXMKKy0tLS0tCisKK1RoaXMga2VybmVsIHN1cHBvcnRzIGNyYW1mcyBob2xlcyAoaS5lLiBbZWZmaWNpZW50IHJlcHJlc2VudGF0aW9uIG9mXQorYmxvY2tzIGluIHVuY29tcHJlc3NlZCBkYXRhIGNvbnNpc3RpbmcgZW50aXJlbHkgb2YgTlVMIGJ5dGVzKSwgYnV0IGJ5CitkZWZhdWx0IG1rY3JhbWZzIGRvZXNuJ3QgdGVzdCBmb3IgJiBjcmVhdGUgaG9sZXMsIHNpbmNlIGNyYW1mcyBpbgora2VybmVscyB1cCB0byBhdCBsZWFzdCAyLjMuMzkgZGlkbid0IHN1cHBvcnQgaG9sZXMuICBSdW4gbWtjcmFtZnMKK3dpdGggLXogaWYgeW91IHdhbnQgaXQgdG8gY3JlYXRlIGZpbGVzIHRoYXQgY2FuIGhhdmUgaG9sZXMgaW4gdGhlbS4KKworCitUb29scworLS0tLS0KKworVGhlIGNyYW1mcyB1c2VyLXNwYWNlIHRvb2xzLCBpbmNsdWRpbmcgbWtjcmFtZnMgYW5kIGNyYW1mc2NrLCBhcmUKK2xvY2F0ZWQgYXQgPGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvY3JhbWZzLz4uCisKKworRnV0dXJlIERldmVsb3BtZW50Cis9PT09PT09PT09PT09PT09PT0KKworQmxvY2sgU2l6ZQorLS0tLS0tLS0tLQorCisoQmxvY2sgc2l6ZSBpbiBjcmFtZnMgcmVmZXJzIHRvIHRoZSBzaXplIG9mIGlucHV0IGRhdGEgdGhhdCBpcworY29tcHJlc3NlZCBhdCBhIHRpbWUuICBJdCdzIGludGVuZGVkIHRvIGJlIHNvbWV3aGVyZSBhcm91bmQKK1BBR0VfQ0FDSEVfU0laRSBmb3IgY3JhbWZzX3JlYWRwYWdlJ3MgY29udmVuaWVuY2UuKQorCitUaGUgc3VwZXJibG9jayBvdWdodCB0byBpbmRpY2F0ZSB0aGUgYmxvY2sgc2l6ZSB0aGF0IHRoZSBmcyB3YXMKK3dyaXR0ZW4gZm9yLCBzaW5jZSBjb21tZW50cyBpbiA8bGludXgvcGFnZW1hcC5oPiBpbmRpY2F0ZSB0aGF0CitQQUdFX0NBQ0hFX1NJWkUgbWF5IGdyb3cgaW4gZnV0dXJlIChpZiBJIGludGVycHJldCB0aGUgY29tbWVudAorY29ycmVjdGx5KS4KKworQ3VycmVudGx5LCBta2NyYW1mcyAjZGVmaW5lJ3MgUEFHRV9DQUNIRV9TSVpFIGFzIDQwOTYgYW5kIHVzZXMgdGhhdAorZm9yIGJsa3NpemUsIHdoZXJlYXMgTGludXgtMi4zLjM5IHVzZXMgaXRzIFBBR0VfQ0FDSEVfU0laRSwgd2hpY2ggaW4KK3R1cm4gaXMgZGVmaW5lZCBhcyBQQUdFX1NJWkUgKHdoaWNoIGNhbiBiZSBhcyBsYXJnZSBhcyAzMktCIG9uIGFybSkuCitUaGlzIGRpc2NyZXBhbmN5IGlzIGEgYnVnLCB0aG91Z2ggaXQncyBub3QgY2xlYXIgd2hpY2ggc2hvdWxkIGJlCitjaGFuZ2VkLgorCitPbmUgb3B0aW9uIGlzIHRvIGNoYW5nZSBta2NyYW1mcyB0byB0YWtlIGl0cyBQQUdFX0NBQ0hFX1NJWkUgZnJvbQorPGFzbS9wYWdlLmg+LiAgUGVyc29uYWxseSBJIGRvbid0IGxpa2UgdGhpcyBvcHRpb24sIGJ1dCBpdCBkb2VzCityZXF1aXJlIHRoZSBsZWFzdCBhbW91bnQgb2YgY2hhbmdlOiBqdXN0IGNoYW5nZSBgI2RlZmluZQorUEFHRV9DQUNIRV9TSVpFICg0MDk2KScgdG8gYCNpbmNsdWRlIDxhc20vcGFnZS5oPicuICBUaGUgZGlzYWR2YW50YWdlCitpcyB0aGF0IHRoZSBnZW5lcmF0ZWQgY3JhbWZzIGNhbm5vdCBhbHdheXMgYmUgc2hhcmVkIGJldHdlZW4gZGlmZmVyZW50CitrZXJuZWxzLCBub3QgZXZlbiBuZWNlc3NhcmlseSBrZXJuZWxzIG9mIHRoZSBzYW1lIGFyY2hpdGVjdHVyZSBpZgorUEFHRV9DQUNIRV9TSVpFIGlzIHN1YmplY3QgdG8gY2hhbmdlIGJldHdlZW4ga2VybmVsIHZlcnNpb25zCisoY3VycmVudGx5IHBvc3NpYmxlIHdpdGggYXJtIGFuZCBpYTY0KS4KKworVGhlIHJlbWFpbmluZyBvcHRpb25zIHRyeSB0byBtYWtlIGNyYW1mcyBtb3JlIHNoYXJhYmxlLgorCitPbmUgcGFydCBvZiB0aGF0IGlzIGFkZHJlc3NpbmcgZW5kaWFubmVzcy4gIFRoZSB0d28gb3B0aW9ucyBoZXJlIGFyZQorYGFsd2F5cyB1c2UgbGl0dGxlLWVuZGlhbicgKGxpa2UgZXh0MmZzKSBvciBgd3JpdGVyIGNob29zZXMKK2VuZGlhbm5lc3M7IGtlcm5lbCBhZGFwdHMgYXQgcnVudGltZScuICBMaXR0bGUtZW5kaWFuIHdpbnMgYmVjYXVzZSBvZgorY29kZSBzaW1wbGljaXR5IGFuZCBsaXR0bGUgQ1BVIG92ZXJoZWFkIGV2ZW4gb24gYmlnLWVuZGlhbiBtYWNoaW5lcy4KKworVGhlIGNvc3Qgb2Ygc3dhYmJpbmcgaXMgY2hhbmdpbmcgdGhlIGNvZGUgdG8gdXNlIHRoZSBsZTMyX3RvX2NwdQorZXRjLiBtYWNyb3MgYXMgdXNlZCBieSBleHQyZnMuICBXZSBkb24ndCBuZWVkIHRvIHN3YWIgdGhlIGNvbXByZXNzZWQKK2RhdGEsIG9ubHkgdGhlIHN1cGVyYmxvY2ssIGlub2RlcyBhbmQgYmxvY2sgcG9pbnRlcnMuCisKKworVGhlIG90aGVyIHBhcnQgb2YgbWFraW5nIGNyYW1mcyBtb3JlIHNoYXJhYmxlIGlzIGNob29zaW5nIGEgYmxvY2sKK3NpemUuICBUaGUgb3B0aW9ucyBhcmU6CisKKyAgMS4gQWx3YXlzIDQwOTYgYnl0ZXMuCisKKyAgMi4gV3JpdGVyIGNob29zZXMgYmxvY2tzaXplOyBrZXJuZWwgYWRhcHRzIGJ1dCByZWplY3RzIGJsb2Nrc2l6ZSA+CisgICAgIFBBR0VfQ0FDSEVfU0laRS4KKworICAzLiBXcml0ZXIgY2hvb3NlcyBibG9ja3NpemU7IGtlcm5lbCBhZGFwdHMgZXZlbiB0byBibG9ja3NpemUgPgorICAgICBQQUdFX0NBQ0hFX1NJWkUuCisKK0l0J3MgZWFzeSBlbm91Z2ggdG8gY2hhbmdlIHRoZSBrZXJuZWwgdG8gdXNlIGEgc21hbGxlciB2YWx1ZSB0aGFuCitQQUdFX0NBQ0hFX1NJWkU6IGp1c3QgbWFrZSBjcmFtZnNfcmVhZHBhZ2UgcmVhZCBtdWx0aXBsZSBibG9ja3MuCisKK1RoZSBjb3N0IG9mIG9wdGlvbiAxIGlzIHRoYXQga2VybmVscyB3aXRoIGEgbGFyZ2VyIFBBR0VfQ0FDSEVfU0laRQordmFsdWUgZG9uJ3QgZ2V0IGFzIGdvb2QgY29tcHJlc3Npb24gYXMgdGhleSBjYW4uCisKK1RoZSBjb3N0IG9mIG9wdGlvbiAyIHJlbGF0aXZlIHRvIG9wdGlvbiAxIGlzIHRoYXQgdGhlIGNvZGUgdXNlcwordmFyaWFibGVzIGluc3RlYWQgb2YgI2RlZmluZSdkIGNvbnN0YW50cy4gIFRoZSBnYWluIGlzIHRoYXQgcGVvcGxlCit3aXRoIGtlcm5lbHMgaGF2aW5nIGxhcmdlciBQQUdFX0NBQ0hFX1NJWkUgY2FuIG1ha2UgdXNlIG9mIHRoYXQgaWYKK3RoZXkgZG9uJ3QgbWluZCB0aGVpciBjcmFtZnMgYmVpbmcgaW5hY2Nlc3NpYmxlIHRvIGtlcm5lbHMgd2l0aAorc21hbGxlciBQQUdFX0NBQ0hFX1NJWkUgdmFsdWVzLgorCitPcHRpb24gMyBpcyBlYXN5IHRvIGltcGxlbWVudCBpZiB3ZSBkb24ndCBtaW5kIGJlaW5nIENQVS1pbmVmZmljaWVudDoKK2UuZy4gZ2V0IHJlYWRwYWdlIHRvIGRlY29tcHJlc3MgdG8gYSBidWZmZXIgb2Ygc2l6ZSBNQVhfQkxLU0laRSAod2hpY2gKK211c3QgYmUgbm8gbGFyZ2VyIHRoYW4gMzJLQikgYW5kIGRpc2NhcmQgd2hhdCBpdCBkb2Vzbid0IG5lZWQuCitHZXR0aW5nIHJlYWRwYWdlIHRvIHJlYWQgaW50byBhbGwgdGhlIGNvdmVyZWQgcGFnZXMgaXMgaGFyZGVyLgorCitUaGUgbWFpbiBhZHZhbnRhZ2Ugb2Ygb3B0aW9uIDMgb3ZlciAxLCAyLCBpcyBiZXR0ZXIgY29tcHJlc3Npb24uICBUaGUKK2Nvc3QgaXMgZ3JlYXRlciBjb21wbGV4aXR5LiAgUHJvYmFibHkgbm90IHdvcnRoIGl0LCBidXQgSSBob3BlIHNvbWVvbmUKK3dpbGwgZGlzYWdyZWUuICAoSWYgaXQgaXMgaW1wbGVtZW50ZWQsIHRoZW4gSSdsbCByZS11c2UgdGhhdCBjb2RlIGluCitlMmNvbXByLikKKworCitBbm90aGVyIGNvc3Qgb2YgMiBhbmQgMyBvdmVyIDEgaXMgbWFraW5nIG1rY3JhbWZzIHVzZSBhIGRpZmZlcmVudAorYmxvY2sgc2l6ZSwgYnV0IHRoYXQganVzdCBtZWFucyBhZGRpbmcgYW5kIHBhcnNpbmcgYSAtYiBvcHRpb24uCisKKworSW5vZGUgU2l6ZQorLS0tLS0tLS0tLQorCitHaXZlbiB0aGF0IGNyYW1mcyB3aWxsIHByb2JhYmx5IGJlIHVzZWQgZm9yIENEcyBldGMuIGFzIHdlbGwgYXMganVzdAorc2lsaWNvbiBST01zLCBpdCBtaWdodCBtYWtlIHNlbnNlIHRvIGV4cGFuZCB0aGUgaW5vZGUgYSBsaXR0bGUgZnJvbQoraXRzIGN1cnJlbnQgMTIgYnl0ZXMuICBJbm9kZXMgb3RoZXIgdGhhbiB0aGUgcm9vdCBpbm9kZSBhcmUgZm9sbG93ZWQKK2J5IGZpbGVuYW1lLCBzbyB0aGUgZXhwYW5zaW9uIGRvZXNuJ3QgZXZlbiBoYXZlIHRvIGJlIGEgbXVsdGlwbGUgb2YgNAorYnl0ZXMuCmRpZmYgLS1naXQgYS9mcy9jcmFtZnMvaW5vZGUuYyBiL2ZzL2NyYW1mcy9pbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMjg1ZWZhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvY3JhbWZzL2lub2RlLmMKQEAgLTAsMCArMSw1MjUgQEAKKy8qCisgKiBDb21wcmVzc2VkIHJvbSBmaWxlc3lzdGVtIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTGludXMgVG9ydmFsZHMuCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCisgKi8KKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgVkZTIGludGVyZmFjZXMgdG8gdGhlIGNvbXByZXNzZWQgcm9tIGZpbGVzeXN0ZW0uCisgKiBUaGUgYWN0dWFsIGNvbXByZXNzaW9uIGlzIGJhc2VkIG9uIHpsaWIsIHNlZSB0aGUgb3RoZXIgZmlsZXMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmFtZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvY3JhbWZzX2ZzX3NiLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgY3JhbWZzX29wczsKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBjcmFtZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjcmFtZnNfZGlyZWN0b3J5X29wZXJhdGlvbnM7CitzdGF0aWMgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBjcmFtZnNfYW9wczsKKworc3RhdGljIERFQ0xBUkVfTVVURVgocmVhZF9tdXRleCk7CisKKworLyogVGhlc2UgdHdvIG1hY3JvcyBtYXkgY2hhbmdlIGluIGZ1dHVyZSwgdG8gcHJvdmlkZSBiZXR0ZXIgc3RfaW5vCisgICBzZW1hbnRpY3MuICovCisjZGVmaW5lIENSQU1JTk8oeCkJKCh4KS0+b2Zmc2V0Pyh4KS0+b2Zmc2V0PDwyOjEpCisjZGVmaW5lIE9GRlNFVCh4KQkoKHgpLT5pX2lubykKKworc3RhdGljIHN0cnVjdCBpbm9kZSAqZ2V0X2NyYW1mc19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgY3JhbWZzX2lub2RlICogY3JhbWZzX2lub2RlKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gbmV3X2lub2RlKHNiKTsKKwlzdGF0aWMgc3RydWN0IHRpbWVzcGVjIHplcm90aW1lOworCisJaWYgKGlub2RlKSB7CisJCWlub2RlLT5pX21vZGUgPSBjcmFtZnNfaW5vZGUtPm1vZGU7CisJCWlub2RlLT5pX3VpZCA9IGNyYW1mc19pbm9kZS0+dWlkOworCQlpbm9kZS0+aV9zaXplID0gY3JhbWZzX2lub2RlLT5zaXplOworCQlpbm9kZS0+aV9ibG9ja3MgPSAoY3JhbWZzX2lub2RlLT5zaXplIC0gMSkgLyA1MTIgKyAxOworCQlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9DQUNIRV9TSVpFOworCQlpbm9kZS0+aV9naWQgPSBjcmFtZnNfaW5vZGUtPmdpZDsKKwkJLyogU3RydWN0IGNvcHkgaW50ZW50aW9uYWwgKi8KKwkJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gemVyb3RpbWU7CisJCWlub2RlLT5pX2lubyA9IENSQU1JTk8oY3JhbWZzX2lub2RlKTsKKwkJLyogaW5vZGUtPmlfbmxpbmsgaXMgbGVmdCAxIC0gYXJndWFibHkgd3JvbmcgZm9yIGRpcmVjdG9yaWVzLAorCQkgICBidXQgaXQncyB0aGUgYmVzdCB3ZSBjYW4gZG8gd2l0aG91dCByZWFkaW5nIHRoZSBkaXJlY3RvcnkKKwkgICAgICAgICAgIGNvbnRlbnRzLiAgMSB5aWVsZHMgdGhlIHJpZ2h0IHJlc3VsdCBpbiBHTlUgZmluZCwgZXZlbgorCQkgICB3aXRob3V0IC1ub2xlYWYgb3B0aW9uLiAqLworCQlpbnNlcnRfaW5vZGVfaGFzaChpbm9kZSk7CisJCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisJCQlpbm9kZS0+aV9mb3AgPSAmZ2VuZXJpY19yb19mb3BzOworCQkJaW5vZGUtPmlfZGF0YS5hX29wcyA9ICZjcmFtZnNfYW9wczsKKwkJfSBlbHNlIGlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCQlpbm9kZS0+aV9vcCA9ICZjcmFtZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJCQlpbm9kZS0+aV9mb3AgPSAmY3JhbWZzX2RpcmVjdG9yeV9vcGVyYXRpb25zOworCQl9IGVsc2UgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpIHsKKwkJCWlub2RlLT5pX29wID0gJnBhZ2Vfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCQkJaW5vZGUtPmlfZGF0YS5hX29wcyA9ICZjcmFtZnNfYW9wczsKKwkJfSBlbHNlIHsKKwkJCWlub2RlLT5pX3NpemUgPSAwOworCQkJaW5vZGUtPmlfYmxvY2tzID0gMDsKKwkJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwKKwkJCQlvbGRfZGVjb2RlX2RldihjcmFtZnNfaW5vZGUtPnNpemUpKTsKKwkJfQorCX0KKwlyZXR1cm4gaW5vZGU7Cit9CisKKy8qCisgKiBXZSBoYXZlIG91ciBvd24gYmxvY2sgY2FjaGU6IGRvbid0IGZpbGwgdXAgdGhlIGJ1ZmZlciBjYWNoZQorICogd2l0aCB0aGUgcm9tLWltYWdlLCBiZWNhdXNlIHRoZSB3YXkgdGhlIGZpbGVzeXN0ZW0gaXMgc2V0CisgKiB1cCB0aGUgYWNjZXNzZXMgc2hvdWxkIGJlIGZhaXJseSByZWd1bGFyIGFuZCBjYWNoZWQgaW4gdGhlCisgKiBwYWdlIGNhY2hlIGFuZCBkZW50cnkgdHJlZSBhbnl3YXkuLgorICoKKyAqIFRoaXMgYWxzbyBhY3RzIGFzIGEgd2F5IHRvIGd1YXJhbnRlZSBjb250aWd1b3VzIGFyZWFzIG9mIHVwIHRvCisgKiBCTEtTX1BFUl9CVUYqUEFHRV9DQUNIRV9TSVpFLCBzbyB0aGF0IHRoZSBjYWxsZXIgZG9lc24ndCBuZWVkIHRvCisgKiB3b3JyeSBhYm91dCBlbmQtb2YtYnVmZmVyIGlzc3VlcyBldmVuIHdoZW4gZGVjb21wcmVzc2luZyBhIGZ1bGwKKyAqIHBhZ2UgY2FjaGUuCisgKi8KKyNkZWZpbmUgUkVBRF9CVUZGRVJTICgyKQorLyogTkVYVF9CVUZGRVIoKTogTG9vcCBvdmVyIFswLi4oUkVBRF9CVUZGRVJTLTEpXS4gKi8KKyNkZWZpbmUgTkVYVF9CVUZGRVIoX2l4KSAoKF9peCkgXiAxKQorCisvKgorICogQkxLU19QRVJfQlVGX1NISUZUIHNob3VsZCBiZSBhdCBsZWFzdCAyIHRvIGFsbG93IGZvciAiY29tcHJlc3NlZCIKKyAqIGRhdGEgdGhhdCB0YWtlcyB1cCBtb3JlIHNwYWNlIHRoYW4gdGhlIG9yaWdpbmFsIGFuZCB3aXRoIHVubHVja3kKKyAqIGFsaWdubWVudC4KKyAqLworI2RlZmluZSBCTEtTX1BFUl9CVUZfU0hJRlQJKDIpCisjZGVmaW5lIEJMS1NfUEVSX0JVRgkJKDEgPDwgQkxLU19QRVJfQlVGX1NISUZUKQorI2RlZmluZSBCVUZGRVJfU0laRQkJKEJMS1NfUEVSX0JVRipQQUdFX0NBQ0hFX1NJWkUpCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJlYWRfYnVmZmVyc1tSRUFEX0JVRkZFUlNdW0JVRkZFUl9TSVpFXTsKK3N0YXRpYyB1bnNpZ25lZCBidWZmZXJfYmxvY2tucltSRUFEX0JVRkZFUlNdOworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqIGJ1ZmZlcl9kZXZbUkVBRF9CVUZGRVJTXTsKK3N0YXRpYyBpbnQgbmV4dF9idWZmZXI7CisKKy8qCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIGF0IGxlYXN0IExFTiBieXRlcyBvZgorICogZmlsZXN5c3RlbSBzdGFydGluZyBhdCBieXRlIG9mZnNldCBPRkZTRVQgaW50byB0aGUgZmlsZXN5c3RlbS4KKyAqLworc3RhdGljIHZvaWQgKmNyYW1mc19yZWFkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBsZW4pCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBzYi0+c19iZGV2LT5iZF9pbm9kZS0+aV9tYXBwaW5nOworCXN0cnVjdCBwYWdlICpwYWdlc1tCTEtTX1BFUl9CVUZdOworCXVuc2lnbmVkIGksIGJsb2NrbnIsIGJ1ZmZlciwgdW5yZWFkOworCXVuc2lnbmVkIGxvbmcgZGV2c2l6ZTsKKwljaGFyICpkYXRhOworCisJaWYgKCFsZW4pCisJCXJldHVybiBOVUxMOworCWJsb2NrbnIgPSBvZmZzZXQgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlvZmZzZXQgJj0gUEFHRV9DQUNIRV9TSVpFIC0gMTsKKworCS8qIENoZWNrIGlmIGFuIGV4aXN0aW5nIGJ1ZmZlciBhbHJlYWR5IGhhcyB0aGUgZGF0YS4uICovCisJZm9yIChpID0gMDsgaSA8IFJFQURfQlVGRkVSUzsgaSsrKSB7CisJCXVuc2lnbmVkIGludCBibGtfb2Zmc2V0OworCisJCWlmIChidWZmZXJfZGV2W2ldICE9IHNiKQorCQkJY29udGludWU7CisJCWlmIChibG9ja25yIDwgYnVmZmVyX2Jsb2NrbnJbaV0pCisJCQljb250aW51ZTsKKwkJYmxrX29mZnNldCA9IChibG9ja25yIC0gYnVmZmVyX2Jsb2NrbnJbaV0pIDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisJCWJsa19vZmZzZXQgKz0gb2Zmc2V0OworCQlpZiAoYmxrX29mZnNldCArIGxlbiA+IEJVRkZFUl9TSVpFKQorCQkJY29udGludWU7CisJCXJldHVybiByZWFkX2J1ZmZlcnNbaV0gKyBibGtfb2Zmc2V0OworCX0KKworCWRldnNpemUgPSBtYXBwaW5nLT5ob3N0LT5pX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKKworCS8qIE9rLCByZWFkIGluIEJMS1NfUEVSX0JVRiBwYWdlcyBjb21wbGV0ZWx5IGZpcnN0LiAqLworCXVucmVhZCA9IDA7CisJZm9yIChpID0gMDsgaSA8IEJMS1NfUEVSX0JVRjsgaSsrKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKKworCQlpZiAoYmxvY2tuciArIGkgPCBkZXZzaXplKSB7CisJCQlwYWdlID0gcmVhZF9jYWNoZV9wYWdlKG1hcHBpbmcsIGJsb2NrbnIgKyBpLAorCQkJCShmaWxsZXJfdCAqKW1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZSwKKwkJCQlOVUxMKTsKKwkJCS8qIHN5bmNocm9ub3VzIGVycm9yPyAqLworCQkJaWYgKElTX0VSUihwYWdlKSkKKwkJCQlwYWdlID0gTlVMTDsKKwkJfQorCQlwYWdlc1tpXSA9IHBhZ2U7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEJMS1NfUEVSX0JVRjsgaSsrKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gcGFnZXNbaV07CisJCWlmIChwYWdlKSB7CisJCQl3YWl0X29uX3BhZ2VfbG9ja2VkKHBhZ2UpOworCQkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJCQkvKiBhc3luY2hyb25vdXMgZXJyb3IgKi8KKwkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCQkJcGFnZXNbaV0gPSBOVUxMOworCQkJfQorCQl9CisJfQorCisJYnVmZmVyID0gbmV4dF9idWZmZXI7CisJbmV4dF9idWZmZXIgPSBORVhUX0JVRkZFUihidWZmZXIpOworCWJ1ZmZlcl9ibG9ja25yW2J1ZmZlcl0gPSBibG9ja25yOworCWJ1ZmZlcl9kZXZbYnVmZmVyXSA9IHNiOworCisJZGF0YSA9IHJlYWRfYnVmZmVyc1tidWZmZXJdOworCWZvciAoaSA9IDA7IGkgPCBCTEtTX1BFUl9CVUY7IGkrKykgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHBhZ2VzW2ldOworCQlpZiAocGFnZSkgeworCQkJbWVtY3B5KGRhdGEsIGttYXAocGFnZSksIFBBR0VfQ0FDSEVfU0laRSk7CisJCQlrdW5tYXAocGFnZSk7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCX0gZWxzZQorCQkJbWVtc2V0KGRhdGEsIDAsIFBBR0VfQ0FDSEVfU0laRSk7CisJCWRhdGEgKz0gUEFHRV9DQUNIRV9TSVpFOworCX0KKwlyZXR1cm4gcmVhZF9idWZmZXJzW2J1ZmZlcl0gKyBvZmZzZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGNyYW1mc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlrZnJlZShzYi0+c19mc19pbmZvKTsKKwlzYi0+c19mc19pbmZvID0gTlVMTDsKK30KKworc3RhdGljIGludCBjcmFtZnNfcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpkYXRhKQoreworCSpmbGFncyB8PSBNU19SRE9OTFk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3JhbWZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgY3JhbWZzX3N1cGVyIHN1cGVyOworCXVuc2lnbmVkIGxvbmcgcm9vdF9vZmZzZXQ7CisJc3RydWN0IGNyYW1mc19zYl9pbmZvICpzYmk7CisJc3RydWN0IGlub2RlICpyb290OworCisJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCisJc2JpID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNyYW1mc19zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYmkpCisJCXJldHVybiAtRU5PTUVNOworCXNiLT5zX2ZzX2luZm8gPSBzYmk7CisJbWVtc2V0KHNiaSwgMCwgc2l6ZW9mKHN0cnVjdCBjcmFtZnNfc2JfaW5mbykpOworCisJLyogSW52YWxpZGF0ZSB0aGUgcmVhZCBidWZmZXJzIG9uIG1vdW50OiB0aGluayBkaXNrIGNoYW5nZS4uICovCisJZG93bigmcmVhZF9tdXRleCk7CisJZm9yIChpID0gMDsgaSA8IFJFQURfQlVGRkVSUzsgaSsrKQorCQlidWZmZXJfYmxvY2tucltpXSA9IC0xOworCisJLyogUmVhZCB0aGUgZmlyc3QgYmxvY2sgYW5kIGdldCB0aGUgc3VwZXJibG9jayBmcm9tIGl0ICovCisJbWVtY3B5KCZzdXBlciwgY3JhbWZzX3JlYWQoc2IsIDAsIHNpemVvZihzdXBlcikpLCBzaXplb2Yoc3VwZXIpKTsKKwl1cCgmcmVhZF9tdXRleCk7CisKKwkvKiBEbyBzYW5pdHkgY2hlY2tzIG9uIHRoZSBzdXBlcmJsb2NrICovCisJaWYgKHN1cGVyLm1hZ2ljICE9IENSQU1GU19NQUdJQykgeworCQkvKiBjaGVjayBhdCA1MTIgYnl0ZSBvZmZzZXQgKi8KKwkJZG93bigmcmVhZF9tdXRleCk7CisJCW1lbWNweSgmc3VwZXIsIGNyYW1mc19yZWFkKHNiLCA1MTIsIHNpemVvZihzdXBlcikpLCBzaXplb2Yoc3VwZXIpKTsKKwkJdXAoJnJlYWRfbXV0ZXgpOworCQlpZiAoc3VwZXIubWFnaWMgIT0gQ1JBTUZTX01BR0lDKSB7CisJCQlpZiAoIXNpbGVudCkKKwkJCQlwcmludGsoS0VSTl9FUlIgImNyYW1mczogd3JvbmcgbWFnaWNcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwkvKiBnZXQgZmVhdHVyZSBmbGFncyBmaXJzdCAqLworCWlmIChzdXBlci5mbGFncyAmIH5DUkFNRlNfU1VQUE9SVEVEX0ZMQUdTKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY3JhbWZzOiB1bnN1cHBvcnRlZCBmaWxlc3lzdGVtIGZlYXR1cmVzXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogQ2hlY2sgdGhhdCB0aGUgcm9vdCBpbm9kZSBpcyBpbiBhIHNhbmUgc3RhdGUgKi8KKwlpZiAoIVNfSVNESVIoc3VwZXIucm9vdC5tb2RlKSkgeworCQlwcmludGsoS0VSTl9FUlIgImNyYW1mczogcm9vdCBpcyBub3QgYSBkaXJlY3RvcnlcbiIpOworCQlnb3RvIG91dDsKKwl9CisJcm9vdF9vZmZzZXQgPSBzdXBlci5yb290Lm9mZnNldCA8PCAyOworCWlmIChzdXBlci5mbGFncyAmIENSQU1GU19GTEFHX0ZTSURfVkVSU0lPTl8yKSB7CisJCXNiaS0+c2l6ZT1zdXBlci5zaXplOworCQlzYmktPmJsb2Nrcz1zdXBlci5mc2lkLmJsb2NrczsKKwkJc2JpLT5maWxlcz1zdXBlci5mc2lkLmZpbGVzOworCX0gZWxzZSB7CisJCXNiaS0+c2l6ZT0xPDwyODsKKwkJc2JpLT5ibG9ja3M9MDsKKwkJc2JpLT5maWxlcz0wOworCX0KKwlzYmktPm1hZ2ljPXN1cGVyLm1hZ2ljOworCXNiaS0+ZmxhZ3M9c3VwZXIuZmxhZ3M7CisJaWYgKHJvb3Rfb2Zmc2V0ID09IDApCisJCXByaW50ayhLRVJOX0lORk8gImNyYW1mczogZW1wdHkgZmlsZXN5c3RlbSIpOworCWVsc2UgaWYgKCEoc3VwZXIuZmxhZ3MgJiBDUkFNRlNfRkxBR19TSElGVEVEX1JPT1RfT0ZGU0VUKSAmJgorCQkgKChyb290X29mZnNldCAhPSBzaXplb2Yoc3RydWN0IGNyYW1mc19zdXBlcikpICYmCisJCSAgKHJvb3Rfb2Zmc2V0ICE9IDUxMiArIHNpemVvZihzdHJ1Y3QgY3JhbWZzX3N1cGVyKSkpKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJjcmFtZnM6IGJhZCByb290IG9mZnNldCAlbHVcbiIsIHJvb3Rfb2Zmc2V0KTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogU2V0IGl0IGFsbCB1cC4uICovCisJc2ItPnNfb3AgPSAmY3JhbWZzX29wczsKKwlyb290ID0gZ2V0X2NyYW1mc19pbm9kZShzYiwgJnN1cGVyLnJvb3QpOworCWlmICghcm9vdCkKKwkJZ290byBvdXQ7CisJc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290KTsKKwlpZiAoIXNiLT5zX3Jvb3QpIHsKKwkJaXB1dChyb290KTsKKwkJZ290byBvdXQ7CisJfQorCXJldHVybiAwOworb3V0OgorCWtmcmVlKHNiaSk7CisJc2ItPnNfZnNfaW5mbyA9IE5VTEw7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgY3JhbWZzX3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQoreworCWJ1Zi0+Zl90eXBlID0gQ1JBTUZTX01BR0lDOworCWJ1Zi0+Zl9ic2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKKwlidWYtPmZfYmxvY2tzID0gQ1JBTUZTX1NCKHNiKS0+YmxvY2tzOworCWJ1Zi0+Zl9iZnJlZSA9IDA7CisJYnVmLT5mX2JhdmFpbCA9IDA7CisJYnVmLT5mX2ZpbGVzID0gQ1JBTUZTX1NCKHNiKS0+ZmlsZXM7CisJYnVmLT5mX2ZmcmVlID0gMDsKKwlidWYtPmZfbmFtZWxlbiA9IENSQU1GU19NQVhQQVRITEVOOworCXJldHVybiAwOworfQorCisvKgorICogUmVhZCBhIGNyYW1mcyBkaXJlY3RvcnkgZW50cnkuCisgKi8KK3N0YXRpYyBpbnQgY3JhbWZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwljaGFyICpidWY7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwlpbnQgY29waWVkOworCisJLyogT2Zmc2V0IHdpdGhpbiB0aGUgdGhpbmcuICovCisJb2Zmc2V0ID0gZmlscC0+Zl9wb3M7CisJaWYgKG9mZnNldCA+PSBpbm9kZS0+aV9zaXplKQorCQlyZXR1cm4gMDsKKwkvKiBEaXJlY3RvcnkgZW50cmllcyBhcmUgYWx3YXlzIDQtYnl0ZSBhbGlnbmVkICovCisJaWYgKG9mZnNldCAmIDMpCisJCXJldHVybiAtRUlOVkFMOworCisJYnVmID0ga21hbGxvYygyNTYsIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNvcGllZCA9IDA7CisJd2hpbGUgKG9mZnNldCA8IGlub2RlLT5pX3NpemUpIHsKKwkJc3RydWN0IGNyYW1mc19pbm9kZSAqZGU7CisJCXVuc2lnbmVkIGxvbmcgbmV4dG9mZnNldDsKKwkJY2hhciAqbmFtZTsKKwkJaW5vX3QgaW5vOworCQltb2RlX3QgbW9kZTsKKwkJaW50IG5hbWVsZW4sIGVycm9yOworCisJCWRvd24oJnJlYWRfbXV0ZXgpOworCQlkZSA9IGNyYW1mc19yZWFkKHNiLCBPRkZTRVQoaW5vZGUpICsgb2Zmc2V0LCBzaXplb2YoKmRlKSsyNTYpOworCQluYW1lID0gKGNoYXIgKikoZGUrMSk7CisKKwkJLyoKKwkJICogTmFtZWxlbmd0aHMgb24gZGlzayBhcmUgc2hpZnRlZCBieSB0d28KKwkJICogYW5kIHRoZSBuYW1lIHBhZGRlZCBvdXQgdG8gNC1ieXRlIGJvdW5kYXJpZXMKKwkJICogd2l0aCB6ZXJvZXMuCisJCSAqLworCQluYW1lbGVuID0gZGUtPm5hbWVsZW4gPDwgMjsKKwkJbWVtY3B5KGJ1ZiwgbmFtZSwgbmFtZWxlbik7CisJCWlubyA9IENSQU1JTk8oZGUpOworCQltb2RlID0gZGUtPm1vZGU7CisJCXVwKCZyZWFkX211dGV4KTsKKwkJbmV4dG9mZnNldCA9IG9mZnNldCArIHNpemVvZigqZGUpICsgbmFtZWxlbjsKKwkJZm9yICg7OykgeworCQkJaWYgKCFuYW1lbGVuKSB7CisJCQkJa2ZyZWUoYnVmKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJCWlmIChidWZbbmFtZWxlbi0xXSkKKwkJCQlicmVhazsKKwkJCW5hbWVsZW4tLTsKKwkJfQorCQllcnJvciA9IGZpbGxkaXIoZGlyZW50LCBidWYsIG5hbWVsZW4sIG9mZnNldCwgaW5vLCBtb2RlID4+IDEyKTsKKwkJaWYgKGVycm9yKQorCQkJYnJlYWs7CisKKwkJb2Zmc2V0ID0gbmV4dG9mZnNldDsKKwkJZmlscC0+Zl9wb3MgPSBvZmZzZXQ7CisJCWNvcGllZCsrOworCX0KKwlrZnJlZShidWYpOworCXJldHVybiAwOworfQorCisvKgorICogTG9va3VwIGFuZCBmaWxsIGluIHRoZSBpbm9kZSBkYXRhLi4KKyAqLworc3RhdGljIHN0cnVjdCBkZW50cnkgKiBjcmFtZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXVuc2lnbmVkIGludCBvZmZzZXQgPSAwOworCWludCBzb3J0ZWQ7CisKKwlkb3duKCZyZWFkX211dGV4KTsKKwlzb3J0ZWQgPSBDUkFNRlNfU0IoZGlyLT5pX3NiKS0+ZmxhZ3MgJiBDUkFNRlNfRkxBR19TT1JURURfRElSUzsKKwl3aGlsZSAob2Zmc2V0IDwgZGlyLT5pX3NpemUpIHsKKwkJc3RydWN0IGNyYW1mc19pbm9kZSAqZGU7CisJCWNoYXIgKm5hbWU7CisJCWludCBuYW1lbGVuLCByZXR2YWw7CisKKwkJZGUgPSBjcmFtZnNfcmVhZChkaXItPmlfc2IsIE9GRlNFVChkaXIpICsgb2Zmc2V0LCBzaXplb2YoKmRlKSsyNTYpOworCQluYW1lID0gKGNoYXIgKikoZGUrMSk7CisKKwkJLyogVHJ5IHRvIHRha2UgYWR2YW50YWdlIG9mIHNvcnRlZCBkaXJlY3RvcmllcyAqLworCQlpZiAoc29ydGVkICYmIChkZW50cnktPmRfbmFtZS5uYW1lWzBdIDwgbmFtZVswXSkpCisJCQlicmVhazsKKworCQluYW1lbGVuID0gZGUtPm5hbWVsZW4gPDwgMjsKKwkJb2Zmc2V0ICs9IHNpemVvZigqZGUpICsgbmFtZWxlbjsKKworCQkvKiBRdWljayBjaGVjayB0aGF0IHRoZSBuYW1lIGlzIHJvdWdobHkgdGhlIHJpZ2h0IGxlbmd0aCAqLworCQlpZiAoKChkZW50cnktPmRfbmFtZS5sZW4gKyAzKSAmIH4zKSAhPSBuYW1lbGVuKQorCQkJY29udGludWU7CisKKwkJZm9yICg7OykgeworCQkJaWYgKCFuYW1lbGVuKSB7CisJCQkJdXAoJnJlYWRfbXV0ZXgpOworCQkJCXJldHVybiBFUlJfUFRSKC1FSU8pOworCQkJfQorCQkJaWYgKG5hbWVbbmFtZWxlbi0xXSkKKwkJCQlicmVhazsKKwkJCW5hbWVsZW4tLTsKKwkJfQorCQlpZiAobmFtZWxlbiAhPSBkZW50cnktPmRfbmFtZS5sZW4pCisJCQljb250aW51ZTsKKwkJcmV0dmFsID0gbWVtY21wKGRlbnRyeS0+ZF9uYW1lLm5hbWUsIG5hbWUsIG5hbWVsZW4pOworCQlpZiAocmV0dmFsID4gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXJldHZhbCkgeworCQkJc3RydWN0IGNyYW1mc19pbm9kZSBlbnRyeSA9ICpkZTsKKwkJCXVwKCZyZWFkX211dGV4KTsKKwkJCWRfYWRkKGRlbnRyeSwgZ2V0X2NyYW1mc19pbm9kZShkaXItPmlfc2IsICZlbnRyeSkpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJLyogZWxzZSAocmV0dmFsIDwgMCkgKi8KKwkJaWYgKHNvcnRlZCkKKwkJCWJyZWFrOworCX0KKwl1cCgmcmVhZF9tdXRleCk7CisJZF9hZGQoZGVudHJ5LCBOVUxMKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBjcmFtZnNfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICogcGFnZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwl1MzIgbWF4YmxvY2ssIGJ5dGVzX2ZpbGxlZDsKKwl2b2lkICpwZ2RhdGE7CisKKwltYXhibG9jayA9IChpbm9kZS0+aV9zaXplICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlieXRlc19maWxsZWQgPSAwOworCWlmIChwYWdlLT5pbmRleCA8IG1heGJsb2NrKSB7CisJCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwkJdTMyIGJsa3B0cl9vZmZzZXQgPSBPRkZTRVQoaW5vZGUpICsgcGFnZS0+aW5kZXgqNDsKKwkJdTMyIHN0YXJ0X29mZnNldCwgY29tcHJfbGVuOworCisJCXN0YXJ0X29mZnNldCA9IE9GRlNFVChpbm9kZSkgKyBtYXhibG9jayo0OworCQlkb3duKCZyZWFkX211dGV4KTsKKwkJaWYgKHBhZ2UtPmluZGV4KQorCQkJc3RhcnRfb2Zmc2V0ID0gKih1MzIgKikgY3JhbWZzX3JlYWQoc2IsIGJsa3B0cl9vZmZzZXQtNCwgNCk7CisJCWNvbXByX2xlbiA9ICgqKHUzMiAqKSBjcmFtZnNfcmVhZChzYiwgYmxrcHRyX29mZnNldCwgNCkgLSBzdGFydF9vZmZzZXQpOworCQl1cCgmcmVhZF9tdXRleCk7CisJCXBnZGF0YSA9IGttYXAocGFnZSk7CisJCWlmIChjb21wcl9sZW4gPT0gMCkKKwkJCTsgLyogaG9sZSAqLworCQllbHNlIHsKKwkJCWRvd24oJnJlYWRfbXV0ZXgpOworCQkJYnl0ZXNfZmlsbGVkID0gY3JhbWZzX3VuY29tcHJlc3NfYmxvY2socGdkYXRhLAorCQkJCSBQQUdFX0NBQ0hFX1NJWkUsCisJCQkJIGNyYW1mc19yZWFkKHNiLCBzdGFydF9vZmZzZXQsIGNvbXByX2xlbiksCisJCQkJIGNvbXByX2xlbik7CisJCQl1cCgmcmVhZF9tdXRleCk7CisJCX0KKwl9IGVsc2UKKwkJcGdkYXRhID0ga21hcChwYWdlKTsKKwltZW1zZXQocGdkYXRhICsgYnl0ZXNfZmlsbGVkLCAwLCBQQUdFX0NBQ0hFX1NJWkUgLSBieXRlc19maWxsZWQpOworCWt1bm1hcChwYWdlKTsKKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGNyYW1mc19hb3BzID0geworCS5yZWFkcGFnZSA9IGNyYW1mc19yZWFkcGFnZQorfTsKKworLyoKKyAqIE91ciBvcGVyYXRpb25zOgorICovCisKKy8qCisgKiBBIGRpcmVjdG9yeSBjYW4gb25seSByZWFkZGlyCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNyYW1mc19kaXJlY3Rvcnlfb3BlcmF0aW9ucyA9IHsKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlYWQJCT0gZ2VuZXJpY19yZWFkX2RpciwKKwkucmVhZGRpcgk9IGNyYW1mc19yZWFkZGlyLAorfTsKKworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGNyYW1mc19kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkubG9va3VwCQk9IGNyYW1mc19sb29rdXAsCit9OworCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgY3JhbWZzX29wcyA9IHsKKwkucHV0X3N1cGVyCT0gY3JhbWZzX3B1dF9zdXBlciwKKwkucmVtb3VudF9mcwk9IGNyYW1mc19yZW1vdW50LAorCS5zdGF0ZnMJCT0gY3JhbWZzX3N0YXRmcywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmNyYW1mc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBjcmFtZnNfZmlsbF9zdXBlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBjcmFtZnNfZnNfdHlwZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImNyYW1mcyIsCisJLmdldF9zYgkJPSBjcmFtZnNfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9ibG9ja19zdXBlciwKKwkuZnNfZmxhZ3MJPSBGU19SRVFVSVJFU19ERVYsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2NyYW1mc19mcyh2b2lkKQoreworCWNyYW1mc191bmNvbXByZXNzX2luaXQoKTsKKwlyZXR1cm4gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmY3JhbWZzX2ZzX3R5cGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9jcmFtZnNfZnModm9pZCkKK3sKKwljcmFtZnNfdW5jb21wcmVzc19leGl0KCk7CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZjcmFtZnNfZnNfdHlwZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfY3JhbWZzX2ZzKQorbW9kdWxlX2V4aXQoZXhpdF9jcmFtZnNfZnMpCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9mcy9jcmFtZnMvdW5jb21wcmVzcy5jIGIvZnMvY3JhbWZzL3VuY29tcHJlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDM0MzY1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvY3JhbWZzL3VuY29tcHJlc3MuYwpAQCAtMCwwICsxLDc3IEBACisvKgorICogdW5jb21wcmVzcy5jCisgKgorICogKEMpIENvcHlyaWdodCAxOTk5IExpbnVzIFRvcnZhbGRzCisgKgorICogY3JhbWZzIGludGVyZmFjZXMgdG8gdGhlIHVuY29tcHJlc3Npb24gbGlicmFyeS4gVGhlcmUncyByZWFsbHkganVzdAorICogdGhyZWUgZW50cnlwb2ludHM6CisgKgorICogIC0gY3JhbWZzX3VuY29tcHJlc3NfaW5pdCgpIC0gY2FsbGVkIHRvIGluaXRpYWxpemUgdGhlIHRoaW5nLgorICogIC0gY3JhbWZzX3VuY29tcHJlc3NfZXhpdCgpIC0gdGVsbCBtZSB3aGVuIHlvdSdyZSBkb25lCisgKiAgLSBjcmFtZnNfdW5jb21wcmVzc19ibG9jaygpIC0gdW5jb21wcmVzcyBhIGJsb2NrLgorICoKKyAqIE5PVEUgTk9URSBOT1RFISBUaGUgdW5jb21wcmVzc2lvbiBpcyBlbnRpcmVseSBzaW5nbGUtdGhyZWFkZWQuIFdlCisgKiBvbmx5IGhhdmUgb25lIHN0cmVhbSwgYW5kIHdlJ2xsIGluaXRpYWxpemUgaXQgb25seSBvbmNlIGV2ZW4gaWYgaXQKKyAqIHRoZW4gaXMgdXNlZCBieSBtdWx0aXBsZSBmaWxlc3lzdGVtcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvemxpYi5oPgorCitzdGF0aWMgel9zdHJlYW0gc3RyZWFtOworc3RhdGljIGludCBpbml0aWFsaXplZDsKKworLyogUmV0dXJucyBsZW5ndGggb2YgZGVjb21wcmVzc2VkIGRhdGEuICovCitpbnQgY3JhbWZzX3VuY29tcHJlc3NfYmxvY2sodm9pZCAqZHN0LCBpbnQgZHN0bGVuLCB2b2lkICpzcmMsIGludCBzcmNsZW4pCit7CisJaW50IGVycjsKKworCXN0cmVhbS5uZXh0X2luID0gc3JjOworCXN0cmVhbS5hdmFpbF9pbiA9IHNyY2xlbjsKKworCXN0cmVhbS5uZXh0X291dCA9IGRzdDsKKwlzdHJlYW0uYXZhaWxfb3V0ID0gZHN0bGVuOworCisJZXJyID0gemxpYl9pbmZsYXRlUmVzZXQoJnN0cmVhbSk7CisJaWYgKGVyciAhPSBaX09LKSB7CisJCXByaW50aygiemxpYl9pbmZsYXRlUmVzZXQgZXJyb3IgJWRcbiIsIGVycik7CisJCXpsaWJfaW5mbGF0ZUVuZCgmc3RyZWFtKTsKKwkJemxpYl9pbmZsYXRlSW5pdCgmc3RyZWFtKTsKKwl9CisKKwllcnIgPSB6bGliX2luZmxhdGUoJnN0cmVhbSwgWl9GSU5JU0gpOworCWlmIChlcnIgIT0gWl9TVFJFQU1fRU5EKQorCQlnb3RvIGVycjsKKwlyZXR1cm4gc3RyZWFtLnRvdGFsX291dDsKKworZXJyOgorCXByaW50aygiRXJyb3IgJWQgd2hpbGUgZGVjb21wcmVzc2luZyFcbiIsIGVycik7CisJcHJpbnRrKCIlcCglZCktPiVwKCVkKVxuIiwgc3JjLCBzcmNsZW4sIGRzdCwgZHN0bGVuKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGNyYW1mc191bmNvbXByZXNzX2luaXQodm9pZCkKK3sKKwlpZiAoIWluaXRpYWxpemVkKyspIHsKKwkJc3RyZWFtLndvcmtzcGFjZSA9IHZtYWxsb2MoemxpYl9pbmZsYXRlX3dvcmtzcGFjZXNpemUoKSk7CisJCWlmICggIXN0cmVhbS53b3Jrc3BhY2UgKSB7CisJCQlpbml0aWFsaXplZCA9IDA7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlzdHJlYW0ubmV4dF9pbiA9IE5VTEw7CisJCXN0cmVhbS5hdmFpbF9pbiA9IDA7CisJCXpsaWJfaW5mbGF0ZUluaXQoJnN0cmVhbSk7CisJfQorCXJldHVybiAwOworfQorCitpbnQgY3JhbWZzX3VuY29tcHJlc3NfZXhpdCh2b2lkKQoreworCWlmICghLS1pbml0aWFsaXplZCkgeworCQl6bGliX2luZmxhdGVFbmQoJnN0cmVhbSk7CisJCXZmcmVlKHN0cmVhbS53b3Jrc3BhY2UpOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL2RjYWNoZS5jIGIvZnMvZGNhY2hlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk2YTRlMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2RjYWNoZS5jCkBAIC0wLDAgKzEsMTc2NCBAQAorLyoKKyAqIGZzL2RjYWNoZS5jCisgKgorICogQ29tcGxldGUgcmVpbXBsZW1lbnRhdGlvbgorICogKEMpIDE5OTcgVGhvbWFzIFNjaG9lYmVsLVRoZXVlciwKKyAqIHdpdGggaGVhdnkgY2hhbmdlcyBieSBMaW51cyBUb3J2YWxkcworICovCisKKy8qCisgKiBOb3RlcyBvbiB0aGUgYWxsb2NhdGlvbiBzdHJhdGVneToKKyAqCisgKiBUaGUgZGNhY2hlIGlzIGEgbWFzdGVyIG9mIHRoZSBpY2FjaGUgLSB3aGVuZXZlciBhIGRjYWNoZSBlbnRyeQorICogZXhpc3RzLCB0aGUgaW5vZGUgd2lsbCBhbHdheXMgZXhpc3QuICJpcHV0KCkiIGlzIGRvbmUgZWl0aGVyIHdoZW4KKyAqIHRoZSBkY2FjaGUgZW50cnkgaXMgZGVsZXRlZCBvciBnYXJiYWdlIGNvbGxlY3RlZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFsb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3dhcC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKworLyogI2RlZmluZSBEQ0FDSEVfREVCVUcgMSAqLworCitpbnQgc3lzY3RsX3Zmc19jYWNoZV9wcmVzc3VyZSA9IDEwMDsKK0VYUE9SVF9TWU1CT0xfR1BMKHN5c2N0bF92ZnNfY2FjaGVfcHJlc3N1cmUpOworCisgX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXAgREVGSU5FX1NQSU5MT0NLKGRjYWNoZV9sb2NrKTsKK3NlcWxvY2tfdCByZW5hbWVfbG9jayBfX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcCA9IFNFUUxPQ0tfVU5MT0NLRUQ7CisKK0VYUE9SVF9TWU1CT0woZGNhY2hlX2xvY2spOworCitzdGF0aWMga21lbV9jYWNoZV90ICpkZW50cnlfY2FjaGU7IAorCisjZGVmaW5lIEROQU1FX0lOTElORV9MRU4gKHNpemVvZihzdHJ1Y3QgZGVudHJ5KS1vZmZzZXRvZihzdHJ1Y3QgZGVudHJ5LGRfaW5hbWUpKQorCisvKgorICogVGhpcyBpcyB0aGUgc2luZ2xlIG1vc3QgY3JpdGljYWwgZGF0YSBzdHJ1Y3R1cmUgd2hlbiBpdCBjb21lcworICogdG8gdGhlIGRjYWNoZTogdGhlIGhhc2h0YWJsZSBmb3IgbG9va3Vwcy4gU29tZWJvZHkgc2hvdWxkIHRyeQorICogdG8gbWFrZSB0aGlzIGdvb2QgLSBJJ3ZlIGp1c3QgbWFkZSBpdCB3b3JrLgorICoKKyAqIFRoaXMgaGFzaC1mdW5jdGlvbiB0cmllcyB0byBhdm9pZCBsb3NpbmcgdG9vIG1hbnkgYml0cyBvZiBoYXNoCisgKiBpbmZvcm1hdGlvbiwgeWV0IGF2b2lkIHVzaW5nIGEgcHJpbWUgaGFzaC1zaXplIG9yIHNpbWlsYXIuCisgKi8KKyNkZWZpbmUgRF9IQVNIQklUUyAgICAgZF9oYXNoX3NoaWZ0CisjZGVmaW5lIERfSEFTSE1BU0sgICAgIGRfaGFzaF9tYXNrCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZF9oYXNoX21hc2s7CitzdGF0aWMgdW5zaWduZWQgaW50IGRfaGFzaF9zaGlmdDsKK3N0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZCAqZGVudHJ5X2hhc2h0YWJsZTsKK3N0YXRpYyBMSVNUX0hFQUQoZGVudHJ5X3VudXNlZCk7CisKKy8qIFN0YXRpc3RpY3MgZ2F0aGVyaW5nLiAqLworc3RydWN0IGRlbnRyeV9zdGF0X3QgZGVudHJ5X3N0YXQgPSB7CisJLmFnZV9saW1pdCA9IDQ1LAorfTsKKworc3RhdGljIHZvaWQgZF9jYWxsYmFjayhzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IGRlbnRyeSAqIGRlbnRyeSA9IGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgZGVudHJ5LCBkX3JjdSk7CisKKwlpZiAoZG5hbWVfZXh0ZXJuYWwoZGVudHJ5KSkKKwkJa2ZyZWUoZGVudHJ5LT5kX25hbWUubmFtZSk7CisJa21lbV9jYWNoZV9mcmVlKGRlbnRyeV9jYWNoZSwgZGVudHJ5KTsgCit9CisKKy8qCisgKiBubyBkY2FjaGVfbG9jaywgcGxlYXNlLiAgVGhlIGNhbGxlciBtdXN0IGRlY3JlbWVudCBkZW50cnlfc3RhdC5ucl9kZW50cnkKKyAqIGluc2lkZSBkY2FjaGVfbG9jay4KKyAqLworc3RhdGljIHZvaWQgZF9mcmVlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpZiAoZGVudHJ5LT5kX29wICYmIGRlbnRyeS0+ZF9vcC0+ZF9yZWxlYXNlKQorCQlkZW50cnktPmRfb3AtPmRfcmVsZWFzZShkZW50cnkpOworIAljYWxsX3JjdSgmZGVudHJ5LT5kX3JjdSwgZF9jYWxsYmFjayk7Cit9CisKKy8qCisgKiBSZWxlYXNlIHRoZSBkZW50cnkncyBpbm9kZSwgdXNpbmcgdGhlIGZpbGVzeXN0ZW0KKyAqIGRfaXB1dCgpIG9wZXJhdGlvbiBpZiBkZWZpbmVkLgorICogQ2FsbGVkIHdpdGggZGNhY2hlX2xvY2sgYW5kIHBlciBkZW50cnkgbG9jayBoZWxkLCBkcm9wcyBib3RoLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZGVudHJ5X2lwdXQoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWlmIChpbm9kZSkgeworCQlkZW50cnktPmRfaW5vZGUgPSBOVUxMOworCQlsaXN0X2RlbF9pbml0KCZkZW50cnktPmRfYWxpYXMpOworCQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCQlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCQlpZiAoZGVudHJ5LT5kX29wICYmIGRlbnRyeS0+ZF9vcC0+ZF9pcHV0KQorCQkJZGVudHJ5LT5kX29wLT5kX2lwdXQoZGVudHJ5LCBpbm9kZSk7CisJCWVsc2UKKwkJCWlwdXQoaW5vZGUpOworCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CisJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJfQorfQorCisvKiAKKyAqIFRoaXMgaXMgZHB1dAorICoKKyAqIFRoaXMgaXMgY29tcGxpY2F0ZWQgYnkgdGhlIGZhY3QgdGhhdCB3ZSBkbyBub3Qgd2FudCB0byBwdXQKKyAqIGRlbnRyaWVzIHRoYXQgYXJlIG5vIGxvbmdlciBvbiBhbnkgaGFzaCBjaGFpbiBvbiB0aGUgdW51c2VkCisgKiBsaXN0OiB3ZSdkIG11Y2ggcmF0aGVyIGp1c3QgZ2V0IHJpZCBvZiB0aGVtIGltbWVkaWF0ZWx5LgorICoKKyAqIEhvd2V2ZXIsIHRoYXQgaW1wbGllcyB0aGF0IHdlIGhhdmUgdG8gdHJhdmVyc2UgdGhlIGRlbnRyeQorICogdHJlZSB1cHdhcmRzIHRvIHRoZSBwYXJlbnRzIHdoaWNoIG1pZ2h0IF9hbHNvXyBub3cgYmUKKyAqIHNjaGVkdWxlZCBmb3IgZGVsZXRpb24gKGl0IG1heSBoYXZlIGJlZW4gb25seSB3YWl0aW5nIGZvcgorICogaXRzIGxhc3QgY2hpbGQgdG8gZ28gYXdheSkuCisgKgorICogVGhpcyB0YWlsIHJlY3Vyc2lvbiBpcyBkb25lIGJ5IGhhbmQgYXMgd2UgZG9uJ3Qgd2FudCB0byBkZXBlbmQKKyAqIG9uIHRoZSBjb21waWxlciB0byBhbHdheXMgZ2V0IHRoaXMgcmlnaHQgKGdjYyBnZW5lcmFsbHkgZG9lc24ndCkuCisgKiBSZWFsIHJlY3Vyc2lvbiB3b3VsZCBlYXQgdXAgb3VyIHN0YWNrIHNwYWNlLgorICovCisKKy8qCisgKiBkcHV0IC0gcmVsZWFzZSBhIGRlbnRyeQorICogQGRlbnRyeTogZGVudHJ5IHRvIHJlbGVhc2UgCisgKgorICogUmVsZWFzZSBhIGRlbnRyeS4gVGhpcyB3aWxsIGRyb3AgdGhlIHVzYWdlIGNvdW50IGFuZCBpZiBhcHByb3ByaWF0ZQorICogY2FsbCB0aGUgZGVudHJ5IHVubGluayBtZXRob2QgYXMgd2VsbCBhcyByZW1vdmluZyBpdCBmcm9tIHRoZSBxdWV1ZXMgYW5kCisgKiByZWxlYXNpbmcgaXRzIHJlc291cmNlcy4gSWYgdGhlIHBhcmVudCBkZW50cmllcyB3ZXJlIHNjaGVkdWxlZCBmb3IgcmVsZWFzZQorICogdGhleSB0b28gbWF5IG5vdyBnZXQgZGVsZXRlZC4KKyAqCisgKiBubyBkY2FjaGUgbG9jaywgcGxlYXNlLgorICovCisKK3ZvaWQgZHB1dChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJaWYgKCFkZW50cnkpCisJCXJldHVybjsKKworcmVwZWF0OgorCWlmIChhdG9taWNfcmVhZCgmZGVudHJ5LT5kX2NvdW50KSA9PSAxKQorCQltaWdodF9zbGVlcCgpOworCWlmICghYXRvbWljX2RlY19hbmRfbG9jaygmZGVudHJ5LT5kX2NvdW50LCAmZGNhY2hlX2xvY2spKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwlpZiAoYXRvbWljX3JlYWQoJmRlbnRyeS0+ZF9jb3VudCkpIHsKKwkJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogQVY6IC0+ZF9kZWxldGUoKSBpcyBfTk9UXyBhbGxvd2VkIHRvIGJsb2NrIG5vdy4KKwkgKi8KKwlpZiAoZGVudHJ5LT5kX29wICYmIGRlbnRyeS0+ZF9vcC0+ZF9kZWxldGUpIHsKKwkJaWYgKGRlbnRyeS0+ZF9vcC0+ZF9kZWxldGUoZGVudHJ5KSkKKwkJCWdvdG8gdW5oYXNoX2l0OworCX0KKwkvKiBVbnJlYWNoYWJsZT8gR2V0IHJpZCBvZiBpdCAqLworIAlpZiAoZF91bmhhc2hlZChkZW50cnkpKQorCQlnb3RvIGtpbGxfaXQ7CisgIAlpZiAobGlzdF9lbXB0eSgmZGVudHJ5LT5kX2xydSkpIHsKKyAgCQlkZW50cnktPmRfZmxhZ3MgfD0gRENBQ0hFX1JFRkVSRU5DRUQ7CisgIAkJbGlzdF9hZGQoJmRlbnRyeS0+ZF9scnUsICZkZW50cnlfdW51c2VkKTsKKyAgCQlkZW50cnlfc3RhdC5ucl91bnVzZWQrKzsKKyAgCX0KKyAJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCXJldHVybjsKKwordW5oYXNoX2l0OgorCV9fZF9kcm9wKGRlbnRyeSk7CisKK2tpbGxfaXQ6IHsKKwkJc3RydWN0IGRlbnRyeSAqcGFyZW50OworCisJCS8qIElmIGRlbnRyeSB3YXMgb24gZF9scnUgbGlzdAorCQkgKiBkZWxldGUgaXQgZnJvbSB0aGVyZQorCQkgKi8KKyAgCQlpZiAoIWxpc3RfZW1wdHkoJmRlbnRyeS0+ZF9scnUpKSB7CisgIAkJCWxpc3RfZGVsKCZkZW50cnktPmRfbHJ1KTsKKyAgCQkJZGVudHJ5X3N0YXQubnJfdW51c2VkLS07CisgIAkJfQorICAJCWxpc3RfZGVsKCZkZW50cnktPmRfY2hpbGQpOworCQlkZW50cnlfc3RhdC5ucl9kZW50cnktLTsJLyogRm9yIGRfZnJlZSwgYmVsb3cgKi8KKwkJLypkcm9wcyB0aGUgbG9ja3MsIGF0IHRoYXQgcG9pbnQgbm9ib2R5IGNhbiByZWFjaCB0aGlzIGRlbnRyeSAqLworCQlkZW50cnlfaXB1dChkZW50cnkpOworCQlwYXJlbnQgPSBkZW50cnktPmRfcGFyZW50OworCQlkX2ZyZWUoZGVudHJ5KTsKKwkJaWYgKGRlbnRyeSA9PSBwYXJlbnQpCisJCQlyZXR1cm47CisJCWRlbnRyeSA9IHBhcmVudDsKKwkJZ290byByZXBlYXQ7CisJfQorfQorCisvKioKKyAqIGRfaW52YWxpZGF0ZSAtIGludmFsaWRhdGUgYSBkZW50cnkKKyAqIEBkZW50cnk6IGRlbnRyeSB0byBpbnZhbGlkYXRlCisgKgorICogVHJ5IHRvIGludmFsaWRhdGUgdGhlIGRlbnRyeSBpZiBpdCB0dXJucyBvdXQgdG8gYmUKKyAqIHBvc3NpYmxlLiBJZiB0aGVyZSBhcmUgb3RoZXIgZGVudHJpZXMgdGhhdCBjYW4gYmUKKyAqIHJlYWNoZWQgdGhyb3VnaCB0aGlzIG9uZSB3ZSBjYW4ndCBkZWxldGUgaXQgYW5kIHdlCisgKiByZXR1cm4gLUVCVVNZLiBPbiBzdWNjZXNzIHdlIHJldHVybiAwLgorICoKKyAqIG5vIGRjYWNoZSBsb2NrLgorICovCisgCitpbnQgZF9pbnZhbGlkYXRlKHN0cnVjdCBkZW50cnkgKiBkZW50cnkpCit7CisJLyoKKwkgKiBJZiBpdCdzIGFscmVhZHkgYmVlbiBkcm9wcGVkLCByZXR1cm4gT0suCisJICovCisJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJaWYgKGRfdW5oYXNoZWQoZGVudHJ5KSkgeworCQlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBDaGVjayB3aGV0aGVyIHRvIGRvIGEgcGFydGlhbCBzaHJpbmtfZGNhY2hlCisJICogdG8gZ2V0IHJpZCBvZiB1bnVzZWQgY2hpbGQgZW50cmllcy4KKwkgKi8KKwlpZiAoIWxpc3RfZW1wdHkoJmRlbnRyeS0+ZF9zdWJkaXJzKSkgeworCQlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCQlzaHJpbmtfZGNhY2hlX3BhcmVudChkZW50cnkpOworCQlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwl9CisKKwkvKgorCSAqIFNvbWVib2R5IGVsc2Ugc3RpbGwgdXNpbmcgaXQ/CisJICoKKwkgKiBJZiBpdCdzIGEgZGlyZWN0b3J5LCB3ZSBjYW4ndCBkcm9wIGl0CisJICogZm9yIGZlYXIgb2Ygc29tZWJvZHkgcmUtcG9wdWxhdGluZyBpdAorCSAqIHdpdGggY2hpbGRyZW4gKGV2ZW4gdGhvdWdoIGRyb3BwaW5nIGl0CisJICogd291bGQgbWFrZSBpdCB1bnJlYWNoYWJsZSBmcm9tIHRoZSByb290LAorCSAqIHdlIG1pZ2h0IHN0aWxsIHBvcHVsYXRlIGl0IGlmIGl0IHdhcyBhCisJICogd29ya2luZyBkaXJlY3Rvcnkgb3Igc2ltaWxhcikuCisJICovCisJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7CisJaWYgKGF0b21pY19yZWFkKCZkZW50cnktPmRfY291bnQpID4gMSkgeworCQlpZiAoZGVudHJ5LT5kX2lub2RlICYmIFNfSVNESVIoZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKSB7CisJCQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCQkJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisKKwlfX2RfZHJvcChkZW50cnkpOworCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CisJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyBzaG91bGQgYmUgY2FsbGVkIF9vbmx5XyB3aXRoIGRjYWNoZV9sb2NrIGhlbGQgKi8KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZGVudHJ5ICogX19kZ2V0X2xvY2tlZChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJYXRvbWljX2luYygmZGVudHJ5LT5kX2NvdW50KTsKKwlpZiAoIWxpc3RfZW1wdHkoJmRlbnRyeS0+ZF9scnUpKSB7CisJCWRlbnRyeV9zdGF0Lm5yX3VudXNlZC0tOworCQlsaXN0X2RlbF9pbml0KCZkZW50cnktPmRfbHJ1KTsKKwl9CisJcmV0dXJuIGRlbnRyeTsKK30KKworc3RydWN0IGRlbnRyeSAqIGRnZXRfbG9ja2VkKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlyZXR1cm4gX19kZ2V0X2xvY2tlZChkZW50cnkpOworfQorCisvKioKKyAqIGRfZmluZF9hbGlhcyAtIGdyYWIgYSBoYXNoZWQgYWxpYXMgb2YgaW5vZGUKKyAqIEBpbm9kZTogaW5vZGUgaW4gcXVlc3Rpb24KKyAqIEB3YW50X2Rpc2NvbjogIGZsYWcsIHVzZWQgYnkgZF9zcGxpY2VfYWxpYXMsIHRvIHJlcXVlc3QKKyAqICAgICAgICAgIHRoYXQgb25seSBhIERJU0NPTk5FQ1RFRCBhbGlhcyBiZSByZXR1cm5lZC4KKyAqCisgKiBJZiBpbm9kZSBoYXMgYSBoYXNoZWQgYWxpYXMsIG9yIGlzIGEgZGlyZWN0b3J5IGFuZCBoYXMgYW55IGFsaWFzLAorICogYWNxdWlyZSB0aGUgcmVmZXJlbmNlIHRvIGFsaWFzIGFuZCByZXR1cm4gaXQuIE90aGVyd2lzZSByZXR1cm4gTlVMTC4KKyAqIE5vdGljZSB0aGF0IGlmIGlub2RlIGlzIGEgZGlyZWN0b3J5IHRoZXJlIGNhbiBiZSBvbmx5IG9uZSBhbGlhcyBhbmQKKyAqIGl0IGNhbiBiZSB1bmhhc2hlZCBvbmx5IGlmIGl0IGhhcyBubyBjaGlsZHJlbiwgb3IgaWYgaXQgaXMgdGhlIHJvb3QKKyAqIG9mIGEgZmlsZXN5c3RlbS4KKyAqCisgKiBJZiB0aGUgaW5vZGUgaGFzIGEgRENBQ0hFX0RJU0NPTk5FQ1RFRCBhbGlhcywgdGhlbiBwcmVmZXIKKyAqIGFueSBvdGhlciBoYXNoZWQgYWxpYXMgb3ZlciB0aGF0IG9uZSB1bmxlc3MgQHdhbnRfZGlzY29uIGlzIHNldCwKKyAqIGluIHdoaWNoIGNhc2Ugb25seSByZXR1cm4gYSBEQ0FDSEVfRElTQ09OTkVDVEVEIGFsaWFzLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICogX19kX2ZpbmRfYWxpYXMoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHdhbnRfZGlzY29uKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsICpuZXh0LCAqdG1wOworCXN0cnVjdCBkZW50cnkgKmFsaWFzLCAqZGlzY29uX2FsaWFzPU5VTEw7CisKKwloZWFkID0gJmlub2RlLT5pX2RlbnRyeTsKKwluZXh0ID0gaW5vZGUtPmlfZGVudHJ5Lm5leHQ7CisJd2hpbGUgKG5leHQgIT0gaGVhZCkgeworCQl0bXAgPSBuZXh0OworCQluZXh0ID0gdG1wLT5uZXh0OworCQlwcmVmZXRjaChuZXh0KTsKKwkJYWxpYXMgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGRlbnRyeSwgZF9hbGlhcyk7CisgCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSB8fCAhZF91bmhhc2hlZChhbGlhcykpIHsKKwkJCWlmIChhbGlhcy0+ZF9mbGFncyAmIERDQUNIRV9ESVNDT05ORUNURUQpCisJCQkJZGlzY29uX2FsaWFzID0gYWxpYXM7CisJCQllbHNlIGlmICghd2FudF9kaXNjb24pIHsKKwkJCQlfX2RnZXRfbG9ja2VkKGFsaWFzKTsKKwkJCQlyZXR1cm4gYWxpYXM7CisJCQl9CisJCX0KKwl9CisJaWYgKGRpc2Nvbl9hbGlhcykKKwkJX19kZ2V0X2xvY2tlZChkaXNjb25fYWxpYXMpOworCXJldHVybiBkaXNjb25fYWxpYXM7Cit9CisKK3N0cnVjdCBkZW50cnkgKiBkX2ZpbmRfYWxpYXMoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZTsKKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwlkZSA9IF9fZF9maW5kX2FsaWFzKGlub2RlLCAwKTsKKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCXJldHVybiBkZTsKK30KKworLyoKKyAqCVRyeSB0byBraWxsIGRlbnRyaWVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGlub2RlLgorICogV0FSTklORzogeW91IG11c3Qgb3duIGEgcmVmZXJlbmNlIHRvIGlub2RlLgorICovCit2b2lkIGRfcHJ1bmVfYWxpYXNlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcCwgKmhlYWQgPSAmaW5vZGUtPmlfZGVudHJ5OworcmVzdGFydDoKKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwl0bXAgPSBoZWFkOworCXdoaWxlICgodG1wID0gdG1wLT5uZXh0KSAhPSBoZWFkKSB7CisJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgZGVudHJ5LCBkX2FsaWFzKTsKKwkJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7CisJCWlmICghYXRvbWljX3JlYWQoJmRlbnRyeS0+ZF9jb3VudCkpIHsKKwkJCV9fZGdldF9sb2NrZWQoZGVudHJ5KTsKKwkJCV9fZF9kcm9wKGRlbnRyeSk7CisJCQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCQkJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwkJCWRwdXQoZGVudHJ5KTsKKwkJCWdvdG8gcmVzdGFydDsKKwkJfQorCQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCX0KKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworfQorCisvKgorICogVGhyb3cgYXdheSBhIGRlbnRyeSAtIGZyZWUgdGhlIGlub2RlLCBkcHV0IHRoZSBwYXJlbnQuCisgKiBUaGlzIHJlcXVpcmVzIHRoYXQgdGhlIExSVSBsaXN0IGhhcyBhbHJlYWR5IGJlZW4KKyAqIHJlbW92ZWQuCisgKiBDYWxsZWQgd2l0aCBkY2FjaGVfbG9jaywgZHJvcHMgaXQgYW5kIHRoZW4gcmVnYWlucy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIHBydW5lX29uZV9kZW50cnkoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICogcGFyZW50OworCisJX19kX2Ryb3AoZGVudHJ5KTsKKwlsaXN0X2RlbCgmZGVudHJ5LT5kX2NoaWxkKTsKKwlkZW50cnlfc3RhdC5ucl9kZW50cnktLTsJLyogRm9yIGRfZnJlZSwgYmVsb3cgKi8KKwlkZW50cnlfaXB1dChkZW50cnkpOworCXBhcmVudCA9IGRlbnRyeS0+ZF9wYXJlbnQ7CisJZF9mcmVlKGRlbnRyeSk7CisJaWYgKHBhcmVudCAhPSBkZW50cnkpCisJCWRwdXQocGFyZW50KTsKKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKK30KKworLyoqCisgKiBwcnVuZV9kY2FjaGUgLSBzaHJpbmsgdGhlIGRjYWNoZQorICogQGNvdW50OiBudW1iZXIgb2YgZW50cmllcyB0byB0cnkgYW5kIGZyZWUKKyAqCisgKiBTaHJpbmsgdGhlIGRjYWNoZS4gVGhpcyBpcyBkb25lIHdoZW4gd2UgbmVlZAorICogbW9yZSBtZW1vcnksIG9yIHNpbXBseSB3aGVuIHdlIG5lZWQgdG8gdW5tb3VudAorICogc29tZXRoaW5nIChhdCB3aGljaCBwb2ludCB3ZSBuZWVkIHRvIHVudXNlCisgKiBhbGwgZGVudHJpZXMpLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbWF5IGZhaWwgdG8gZnJlZSBhbnkgcmVzb3VyY2VzIGlmCisgKiBhbGwgdGhlIGRlbnRyaWVzIGFyZSBpbiB1c2UuCisgKi8KKyAKK3N0YXRpYyB2b2lkIHBydW5lX2RjYWNoZShpbnQgY291bnQpCit7CisJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJZm9yICg7IGNvdW50IDsgY291bnQtLSkgeworCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKKworCQljb25kX3Jlc2NoZWRfbG9jaygmZGNhY2hlX2xvY2spOworCisJCXRtcCA9IGRlbnRyeV91bnVzZWQucHJldjsKKwkJaWYgKHRtcCA9PSAmZGVudHJ5X3VudXNlZCkKKwkJCWJyZWFrOworCQlsaXN0X2RlbF9pbml0KHRtcCk7CisJCXByZWZldGNoKGRlbnRyeV91bnVzZWQucHJldik7CisgCQlkZW50cnlfc3RhdC5ucl91bnVzZWQtLTsKKwkJZGVudHJ5ID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBkZW50cnksIGRfbHJ1KTsKKworIAkJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7CisJCS8qCisJCSAqIFdlIGZvdW5kIGFuIGludXNlIGRlbnRyeSB3aGljaCB3YXMgbm90IHJlbW92ZWQgZnJvbQorCQkgKiBkZW50cnlfdW51c2VkIGJlY2F1c2Ugb2YgbGF6aW5lc3MgZHVyaW5nIGxvb2t1cC4gIERvIG5vdCBmcmVlCisJCSAqIGl0IC0ganVzdCBrZWVwIGl0IG9mZiB0aGUgZGVudHJ5X3VudXNlZCBsaXN0LgorCQkgKi8KKyAJCWlmIChhdG9taWNfcmVhZCgmZGVudHJ5LT5kX2NvdW50KSkgeworIAkJCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBJZiB0aGUgZGVudHJ5IHdhcyByZWNlbnRseSByZWZlcmVuY2VkLCBkb24ndCBmcmVlIGl0LiAqLworCQlpZiAoZGVudHJ5LT5kX2ZsYWdzICYgRENBQ0hFX1JFRkVSRU5DRUQpIHsKKwkJCWRlbnRyeS0+ZF9mbGFncyAmPSB+RENBQ0hFX1JFRkVSRU5DRUQ7CisgCQkJbGlzdF9hZGQoJmRlbnRyeS0+ZF9scnUsICZkZW50cnlfdW51c2VkKTsKKyAJCQlkZW50cnlfc3RhdC5ucl91bnVzZWQrKzsKKyAJCQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCQkJY29udGludWU7CisJCX0KKwkJcHJ1bmVfb25lX2RlbnRyeShkZW50cnkpOworCX0KKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworfQorCisvKgorICogU2hyaW5rIHRoZSBkY2FjaGUgZm9yIHRoZSBzcGVjaWZpZWQgc3VwZXIgYmxvY2suCisgKiBUaGlzIGFsbG93cyB1cyB0byB1bm1vdW50IGEgZGV2aWNlIHdpdGhvdXQgZGlzdHVyYmluZworICogdGhlIGRjYWNoZSBmb3IgdGhlIG90aGVyIGRldmljZXMuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBtYWtlcyBqdXN0IHR3byB0cmF2ZXJzYWxzIG9mIHRoZQorICogdW51c2VkIGxpc3QuICBPbiB0aGUgZmlyc3QgcGFzcyB3ZSBtb3ZlIHRoZSBzZWxlY3RlZAorICogZGVudHJpZXMgdG8gdGhlIG1vc3QgcmVjZW50IGVuZCwgYW5kIG9uIHRoZSBzZWNvbmQKKyAqIHBhc3Mgd2UgZnJlZSB0aGVtLiAgVGhlIHNlY29uZCBwYXNzIG11c3QgcmVzdGFydCBhZnRlcgorICogZWFjaCBkcHV0KCksIGJ1dCBzaW5jZSB0aGUgdGFyZ2V0IGRlbnRyaWVzIGFyZSBhbGwgYXQKKyAqIHRoZSBlbmQsIGl0J3MgcmVhbGx5IGp1c3QgYSBzaW5nbGUgdHJhdmVyc2FsLgorICovCisKKy8qKgorICogc2hyaW5rX2RjYWNoZV9zYiAtIHNocmluayBkY2FjaGUgZm9yIGEgc3VwZXJibG9jaworICogQHNiOiBzdXBlcmJsb2NrCisgKgorICogU2hyaW5rIHRoZSBkY2FjaGUgZm9yIHRoZSBzcGVjaWZpZWQgc3VwZXIgYmxvY2suIFRoaXMKKyAqIGlzIHVzZWQgdG8gZnJlZSB0aGUgZGNhY2hlIGJlZm9yZSB1bm1vdW50aW5nIGEgZmlsZQorICogc3lzdGVtCisgKi8KKwordm9pZCBzaHJpbmtfZGNhY2hlX3NiKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcCwgKm5leHQ7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCisJLyoKKwkgKiBQYXNzIG9uZSAuLi4gbW92ZSB0aGUgZGVudHJpZXMgZm9yIHRoZSBzcGVjaWZpZWQKKwkgKiBzdXBlcmJsb2NrIHRvIHRoZSBtb3N0IHJlY2VudCBlbmQgb2YgdGhlIHVudXNlZCBsaXN0LgorCSAqLworCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCW5leHQgPSBkZW50cnlfdW51c2VkLm5leHQ7CisJd2hpbGUgKG5leHQgIT0gJmRlbnRyeV91bnVzZWQpIHsKKwkJdG1wID0gbmV4dDsKKwkJbmV4dCA9IHRtcC0+bmV4dDsKKwkJZGVudHJ5ID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBkZW50cnksIGRfbHJ1KTsKKwkJaWYgKGRlbnRyeS0+ZF9zYiAhPSBzYikKKwkJCWNvbnRpbnVlOworCQlsaXN0X2RlbCh0bXApOworCQlsaXN0X2FkZCh0bXAsICZkZW50cnlfdW51c2VkKTsKKwl9CisKKwkvKgorCSAqIFBhc3MgdHdvIC4uLiBmcmVlIHRoZSBkZW50cmllcyBmb3IgdGhpcyBzdXBlcmJsb2NrLgorCSAqLworcmVwZWF0OgorCW5leHQgPSBkZW50cnlfdW51c2VkLm5leHQ7CisJd2hpbGUgKG5leHQgIT0gJmRlbnRyeV91bnVzZWQpIHsKKwkJdG1wID0gbmV4dDsKKwkJbmV4dCA9IHRtcC0+bmV4dDsKKwkJZGVudHJ5ID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBkZW50cnksIGRfbHJ1KTsKKwkJaWYgKGRlbnRyeS0+ZF9zYiAhPSBzYikKKwkJCWNvbnRpbnVlOworCQlkZW50cnlfc3RhdC5ucl91bnVzZWQtLTsKKwkJbGlzdF9kZWxfaW5pdCh0bXApOworCQlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwkJaWYgKGF0b21pY19yZWFkKCZkZW50cnktPmRfY291bnQpKSB7CisJCQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCQkJY29udGludWU7CisJCX0KKwkJcHJ1bmVfb25lX2RlbnRyeShkZW50cnkpOworCQlnb3RvIHJlcGVhdDsKKwl9CisJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKK30KKworLyoKKyAqIFNlYXJjaCBmb3IgYXQgbGVhc3QgMSBtb3VudCBwb2ludCBpbiB0aGUgZGVudHJ5J3Mgc3ViZGlycy4KKyAqIFdlIGRlc2NlbmQgdG8gdGhlIG5leHQgbGV2ZWwgd2hlbmV2ZXIgdGhlIGRfc3ViZGlycworICogbGlzdCBpcyBub24tZW1wdHkgYW5kIGNvbnRpbnVlIHNlYXJjaGluZy4KKyAqLworIAorLyoqCisgKiBoYXZlX3N1Ym1vdW50cyAtIGNoZWNrIGZvciBtb3VudHMgb3ZlciBhIGRlbnRyeQorICogQHBhcmVudDogZGVudHJ5IHRvIGNoZWNrLgorICoKKyAqIFJldHVybiB0cnVlIGlmIHRoZSBwYXJlbnQgb3IgaXRzIHN1YmRpcmVjdG9yaWVzIGNvbnRhaW4KKyAqIGEgbW91bnQgcG9pbnQKKyAqLworIAoraW50IGhhdmVfc3VibW91bnRzKHN0cnVjdCBkZW50cnkgKnBhcmVudCkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICp0aGlzX3BhcmVudCA9IHBhcmVudDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0OworCisJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJaWYgKGRfbW91bnRwb2ludChwYXJlbnQpKQorCQlnb3RvIHBvc2l0aXZlOworcmVwZWF0OgorCW5leHQgPSB0aGlzX3BhcmVudC0+ZF9zdWJkaXJzLm5leHQ7CityZXN1bWU6CisJd2hpbGUgKG5leHQgIT0gJnRoaXNfcGFyZW50LT5kX3N1YmRpcnMpIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqdG1wID0gbmV4dDsKKwkJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBkZW50cnksIGRfY2hpbGQpOworCQluZXh0ID0gdG1wLT5uZXh0OworCQkvKiBIYXZlIHdlIGZvdW5kIGEgbW91bnQgcG9pbnQgPyAqLworCQlpZiAoZF9tb3VudHBvaW50KGRlbnRyeSkpCisJCQlnb3RvIHBvc2l0aXZlOworCQlpZiAoIWxpc3RfZW1wdHkoJmRlbnRyeS0+ZF9zdWJkaXJzKSkgeworCQkJdGhpc19wYXJlbnQgPSBkZW50cnk7CisJCQlnb3RvIHJlcGVhdDsKKwkJfQorCX0KKwkvKgorCSAqIEFsbCBkb25lIGF0IHRoaXMgbGV2ZWwgLi4uIGFzY2VuZCBhbmQgcmVzdW1lIHRoZSBzZWFyY2guCisJICovCisJaWYgKHRoaXNfcGFyZW50ICE9IHBhcmVudCkgeworCQluZXh0ID0gdGhpc19wYXJlbnQtPmRfY2hpbGQubmV4dDsgCisJCXRoaXNfcGFyZW50ID0gdGhpc19wYXJlbnQtPmRfcGFyZW50OworCQlnb3RvIHJlc3VtZTsKKwl9CisJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwlyZXR1cm4gMDsgLyogTm8gbW91bnQgcG9pbnRzIGZvdW5kIGluIHRyZWUgKi8KK3Bvc2l0aXZlOgorCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBTZWFyY2ggdGhlIGRlbnRyeSBjaGlsZCBsaXN0IGZvciB0aGUgc3BlY2lmaWVkIHBhcmVudCwKKyAqIGFuZCBtb3ZlIGFueSB1bnVzZWQgZGVudHJpZXMgdG8gdGhlIGVuZCBvZiB0aGUgdW51c2VkCisgKiBsaXN0IGZvciBwcnVuZV9kY2FjaGUoKS4gV2UgZGVzY2VuZCB0byB0aGUgbmV4dCBsZXZlbAorICogd2hlbmV2ZXIgdGhlIGRfc3ViZGlycyBsaXN0IGlzIG5vbi1lbXB0eSBhbmQgY29udGludWUKKyAqIHNlYXJjaGluZy4KKyAqCisgKiBJdCByZXR1cm5zIHplcm8gaWZmIHRoZXJlIGFyZSBubyB1bnVzZWQgY2hpbGRyZW4sCisgKiBvdGhlcndpc2UgIGl0IHJldHVybnMgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBtb3ZlZCB0bworICogdGhlIGVuZCBvZiB0aGUgdW51c2VkIGxpc3QuIFRoaXMgbWF5IG5vdCBiZSB0aGUgdG90YWwKKyAqIG51bWJlciBvZiB1bnVzZWQgY2hpbGRyZW4sIGJlY2F1c2Ugc2VsZWN0X3BhcmVudCBjYW4KKyAqIGRyb3AgdGhlIGxvY2sgYW5kIHJldHVybiBlYXJseSBkdWUgdG8gbGF0ZW5jeQorICogY29uc3RyYWludHMuCisgKi8KK3N0YXRpYyBpbnQgc2VsZWN0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICogcGFyZW50KQoreworCXN0cnVjdCBkZW50cnkgKnRoaXNfcGFyZW50ID0gcGFyZW50OworCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQ7CisJaW50IGZvdW5kID0gMDsKKworCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworcmVwZWF0OgorCW5leHQgPSB0aGlzX3BhcmVudC0+ZF9zdWJkaXJzLm5leHQ7CityZXN1bWU6CisJd2hpbGUgKG5leHQgIT0gJnRoaXNfcGFyZW50LT5kX3N1YmRpcnMpIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqdG1wID0gbmV4dDsKKwkJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBkZW50cnksIGRfY2hpbGQpOworCQluZXh0ID0gdG1wLT5uZXh0OworCisJCWlmICghbGlzdF9lbXB0eSgmZGVudHJ5LT5kX2xydSkpIHsKKwkJCWRlbnRyeV9zdGF0Lm5yX3VudXNlZC0tOworCQkJbGlzdF9kZWxfaW5pdCgmZGVudHJ5LT5kX2xydSk7CisJCX0KKwkJLyogCisJCSAqIG1vdmUgb25seSB6ZXJvIHJlZiBjb3VudCBkZW50cmllcyB0byB0aGUgZW5kIAorCQkgKiBvZiB0aGUgdW51c2VkIGxpc3QgZm9yIHBydW5lX2RjYWNoZQorCQkgKi8KKwkJaWYgKCFhdG9taWNfcmVhZCgmZGVudHJ5LT5kX2NvdW50KSkgeworCQkJbGlzdF9hZGQoJmRlbnRyeS0+ZF9scnUsIGRlbnRyeV91bnVzZWQucHJldik7CisJCQlkZW50cnlfc3RhdC5ucl91bnVzZWQrKzsKKwkJCWZvdW5kKys7CisJCX0KKworCQkvKgorCQkgKiBXZSBjYW4gcmV0dXJuIHRvIHRoZSBjYWxsZXIgaWYgd2UgaGF2ZSBmb3VuZCBzb21lICh0aGlzCisJCSAqIGVuc3VyZXMgZm9yd2FyZCBwcm9ncmVzcykuIFdlJ2xsIGJlIGNvbWluZyBiYWNrIHRvIGZpbmQKKwkJICogdGhlIHJlc3QuCisJCSAqLworCQlpZiAoZm91bmQgJiYgbmVlZF9yZXNjaGVkKCkpCisJCQlnb3RvIG91dDsKKworCQkvKgorCQkgKiBEZXNjZW5kIGEgbGV2ZWwgaWYgdGhlIGRfc3ViZGlycyBsaXN0IGlzIG5vbi1lbXB0eS4KKwkJICovCisJCWlmICghbGlzdF9lbXB0eSgmZGVudHJ5LT5kX3N1YmRpcnMpKSB7CisJCQl0aGlzX3BhcmVudCA9IGRlbnRyeTsKKyNpZmRlZiBEQ0FDSEVfREVCVUcKK3ByaW50ayhLRVJOX0RFQlVHICJzZWxlY3RfcGFyZW50OiBkZXNjZW5kaW5nIHRvICVzLyVzLCBmb3VuZD0lZFxuIiwKK2RlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lLCBmb3VuZCk7CisjZW5kaWYKKwkJCWdvdG8gcmVwZWF0OworCQl9CisJfQorCS8qCisJICogQWxsIGRvbmUgYXQgdGhpcyBsZXZlbCAuLi4gYXNjZW5kIGFuZCByZXN1bWUgdGhlIHNlYXJjaC4KKwkgKi8KKwlpZiAodGhpc19wYXJlbnQgIT0gcGFyZW50KSB7CisJCW5leHQgPSB0aGlzX3BhcmVudC0+ZF9jaGlsZC5uZXh0OyAKKwkJdGhpc19wYXJlbnQgPSB0aGlzX3BhcmVudC0+ZF9wYXJlbnQ7CisjaWZkZWYgRENBQ0hFX0RFQlVHCitwcmludGsoS0VSTl9ERUJVRyAic2VsZWN0X3BhcmVudDogYXNjZW5kaW5nIHRvICVzLyVzLCBmb3VuZD0lZFxuIiwKK3RoaXNfcGFyZW50LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIHRoaXNfcGFyZW50LT5kX25hbWUubmFtZSwgZm91bmQpOworI2VuZGlmCisJCWdvdG8gcmVzdW1lOworCX0KK291dDoKKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCXJldHVybiBmb3VuZDsKK30KKworLyoqCisgKiBzaHJpbmtfZGNhY2hlX3BhcmVudCAtIHBydW5lIGRjYWNoZQorICogQHBhcmVudDogcGFyZW50IG9mIGVudHJpZXMgdG8gcHJ1bmUKKyAqCisgKiBQcnVuZSB0aGUgZGNhY2hlIHRvIHJlbW92ZSB1bnVzZWQgY2hpbGRyZW4gb2YgdGhlIHBhcmVudCBkZW50cnkuCisgKi8KKyAKK3ZvaWQgc2hyaW5rX2RjYWNoZV9wYXJlbnQoc3RydWN0IGRlbnRyeSAqIHBhcmVudCkKK3sKKwlpbnQgZm91bmQ7CisKKwl3aGlsZSAoKGZvdW5kID0gc2VsZWN0X3BhcmVudChwYXJlbnQpKSAhPSAwKQorCQlwcnVuZV9kY2FjaGUoZm91bmQpOworfQorCisvKioKKyAqIHNocmlua19kY2FjaGVfYW5vbiAtIGZ1cnRoZXIgcHJ1bmUgdGhlIGNhY2hlCisgKiBAaGVhZDogaGVhZCBvZiBkX2hhc2ggbGlzdCBvZiBkZW50cmllcyB0byBwcnVuZQorICoKKyAqIFBydW5lIHRoZSBkZW50cmllcyB0aGF0IGFyZSBhbm9ueW1vdXMKKyAqCisgKiBwYXJzaW5nIGRfaGFzaCBsaXN0IGRvZXMgbm90IGhsaXN0X2Zvcl9lYWNoX3JjdSgpIGFzIGl0CisgKiBkb25lIHVuZGVyIGRjYWNoZV9sb2NrLgorICoKKyAqLwordm9pZCBzaHJpbmtfZGNhY2hlX2Fub24oc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IGhsaXN0X25vZGUgKmxwOworCWludCBmb3VuZDsKKwlkbyB7CisJCWZvdW5kID0gMDsKKwkJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJCWhsaXN0X2Zvcl9lYWNoKGxwLCBoZWFkKSB7CisJCQlzdHJ1Y3QgZGVudHJ5ICp0aGlzID0gaGxpc3RfZW50cnkobHAsIHN0cnVjdCBkZW50cnksIGRfaGFzaCk7CisJCQlpZiAoIWxpc3RfZW1wdHkoJnRoaXMtPmRfbHJ1KSkgeworCQkJCWRlbnRyeV9zdGF0Lm5yX3VudXNlZC0tOworCQkJCWxpc3RfZGVsX2luaXQoJnRoaXMtPmRfbHJ1KTsKKwkJCX0KKworCQkJLyogCisJCQkgKiBtb3ZlIG9ubHkgemVybyByZWYgY291bnQgZGVudHJpZXMgdG8gdGhlIGVuZCAKKwkJCSAqIG9mIHRoZSB1bnVzZWQgbGlzdCBmb3IgcHJ1bmVfZGNhY2hlCisJCQkgKi8KKwkJCWlmICghYXRvbWljX3JlYWQoJnRoaXMtPmRfY291bnQpKSB7CisJCQkJbGlzdF9hZGRfdGFpbCgmdGhpcy0+ZF9scnUsICZkZW50cnlfdW51c2VkKTsKKwkJCQlkZW50cnlfc3RhdC5ucl91bnVzZWQrKzsKKwkJCQlmb3VuZCsrOworCQkJfQorCQl9CisJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJCXBydW5lX2RjYWNoZShmb3VuZCk7CisJfSB3aGlsZShmb3VuZCk7Cit9CisKKy8qCisgKiBTY2FuIGBucicgZGVudHJpZXMgYW5kIHJldHVybiB0aGUgbnVtYmVyIHdoaWNoIHJlbWFpbi4KKyAqCisgKiBXZSBuZWVkIHRvIGF2b2lkIHJlZW50ZXJpbmcgdGhlIGZpbGVzeXN0ZW0gaWYgdGhlIGNhbGxlciBpcyBwZXJmb3JtaW5nIGEKKyAqIEdGUF9OT0ZTIGFsbG9jYXRpb24gYXR0ZW1wdC4gIE9uZSBleGFtcGxlIGRlYWRsb2NrIGlzOgorICoKKyAqIGV4dDJfbmV3X2Jsb2NrLT5nZXRibGstPkdGUC0+c2hyaW5rX2RjYWNoZV9tZW1vcnktPnBydW5lX2RjYWNoZS0+CisgKiBwcnVuZV9vbmVfZGVudHJ5LT5kcHV0LT5kZW50cnlfaXB1dC0+aXB1dC0+aW5vZGUtPmlfc2ItPnNfb3AtPnB1dF9pbm9kZS0+CisgKiBleHQyX2Rpc2NhcmRfcHJlYWxsb2MtPmV4dDJfZnJlZV9ibG9ja3MtPmxvY2tfc3VwZXItPkRFQURMT0NLLgorICoKKyAqIEluIHRoaXMgY2FzZSB3ZSByZXR1cm4gLTEgdG8gdGVsbCB0aGUgY2FsbGVyIHRoYXQgd2UgYmFsZWQuCisgKi8KK3N0YXRpYyBpbnQgc2hyaW5rX2RjYWNoZV9tZW1vcnkoaW50IG5yLCB1bnNpZ25lZCBpbnQgZ2ZwX21hc2spCit7CisJaWYgKG5yKSB7CisJCWlmICghKGdmcF9tYXNrICYgX19HRlBfRlMpKQorCQkJcmV0dXJuIC0xOworCQlwcnVuZV9kY2FjaGUobnIpOworCX0KKwlyZXR1cm4gKGRlbnRyeV9zdGF0Lm5yX3VudXNlZCAvIDEwMCkgKiBzeXNjdGxfdmZzX2NhY2hlX3ByZXNzdXJlOworfQorCisvKioKKyAqIGRfYWxsb2MJLQlhbGxvY2F0ZSBhIGRjYWNoZSBlbnRyeQorICogQHBhcmVudDogcGFyZW50IG9mIGVudHJ5IHRvIGFsbG9jYXRlCisgKiBAbmFtZTogcXN0ciBvZiB0aGUgbmFtZQorICoKKyAqIEFsbG9jYXRlcyBhIGRlbnRyeS4gSXQgcmV0dXJucyAlTlVMTCBpZiB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgbWVtb3J5CisgKiBhdmFpbGFibGUuIE9uIGEgc3VjY2VzcyB0aGUgZGVudHJ5IGlzIHJldHVybmVkLiBUaGUgbmFtZSBwYXNzZWQgaW4gaXMKKyAqIGNvcGllZCBhbmQgdGhlIGNvcHkgcGFzc2VkIGluIG1heSBiZSByZXVzZWQgYWZ0ZXIgdGhpcyBjYWxsLgorICovCisgCitzdHJ1Y3QgZGVudHJ5ICpkX2FsbG9jKHN0cnVjdCBkZW50cnkgKiBwYXJlbnQsIGNvbnN0IHN0cnVjdCBxc3RyICpuYW1lKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwljaGFyICpkbmFtZTsKKworCWRlbnRyeSA9IGttZW1fY2FjaGVfYWxsb2MoZGVudHJ5X2NhY2hlLCBHRlBfS0VSTkVMKTsgCisJaWYgKCFkZW50cnkpCisJCXJldHVybiBOVUxMOworCisJaWYgKG5hbWUtPmxlbiA+IEROQU1FX0lOTElORV9MRU4tMSkgeworCQlkbmFtZSA9IGttYWxsb2MobmFtZS0+bGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJCWlmICghZG5hbWUpIHsKKwkJCWttZW1fY2FjaGVfZnJlZShkZW50cnlfY2FjaGUsIGRlbnRyeSk7IAorCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9IGVsc2UgIHsKKwkJZG5hbWUgPSBkZW50cnktPmRfaW5hbWU7CisJfQkKKwlkZW50cnktPmRfbmFtZS5uYW1lID0gZG5hbWU7CisKKwlkZW50cnktPmRfbmFtZS5sZW4gPSBuYW1lLT5sZW47CisJZGVudHJ5LT5kX25hbWUuaGFzaCA9IG5hbWUtPmhhc2g7CisJbWVtY3B5KGRuYW1lLCBuYW1lLT5uYW1lLCBuYW1lLT5sZW4pOworCWRuYW1lW25hbWUtPmxlbl0gPSAwOworCisJYXRvbWljX3NldCgmZGVudHJ5LT5kX2NvdW50LCAxKTsKKwlkZW50cnktPmRfZmxhZ3MgPSBEQ0FDSEVfVU5IQVNIRUQ7CisJc3Bpbl9sb2NrX2luaXQoJmRlbnRyeS0+ZF9sb2NrKTsKKwlkZW50cnktPmRfaW5vZGUgPSBOVUxMOworCWRlbnRyeS0+ZF9wYXJlbnQgPSBOVUxMOworCWRlbnRyeS0+ZF9zYiA9IE5VTEw7CisJZGVudHJ5LT5kX29wID0gTlVMTDsKKwlkZW50cnktPmRfZnNkYXRhID0gTlVMTDsKKwlkZW50cnktPmRfbW91bnRlZCA9IDA7CisJZGVudHJ5LT5kX2Nvb2tpZSA9IE5VTEw7CisJSU5JVF9ITElTVF9OT0RFKCZkZW50cnktPmRfaGFzaCk7CisJSU5JVF9MSVNUX0hFQUQoJmRlbnRyeS0+ZF9scnUpOworCUlOSVRfTElTVF9IRUFEKCZkZW50cnktPmRfc3ViZGlycyk7CisJSU5JVF9MSVNUX0hFQUQoJmRlbnRyeS0+ZF9hbGlhcyk7CisKKwlpZiAocGFyZW50KSB7CisJCWRlbnRyeS0+ZF9wYXJlbnQgPSBkZ2V0KHBhcmVudCk7CisJCWRlbnRyeS0+ZF9zYiA9IHBhcmVudC0+ZF9zYjsKKwl9IGVsc2UgeworCQlJTklUX0xJU1RfSEVBRCgmZGVudHJ5LT5kX2NoaWxkKTsKKwl9CisKKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwlpZiAocGFyZW50KQorCQlsaXN0X2FkZCgmZGVudHJ5LT5kX2NoaWxkLCAmcGFyZW50LT5kX3N1YmRpcnMpOworCWRlbnRyeV9zdGF0Lm5yX2RlbnRyeSsrOworCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisKKwlyZXR1cm4gZGVudHJ5OworfQorCitzdHJ1Y3QgZGVudHJ5ICpkX2FsbG9jX25hbWUoc3RydWN0IGRlbnRyeSAqcGFyZW50LCBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBxc3RyIHE7CisKKwlxLm5hbWUgPSBuYW1lOworCXEubGVuID0gc3RybGVuKG5hbWUpOworCXEuaGFzaCA9IGZ1bGxfbmFtZV9oYXNoKHEubmFtZSwgcS5sZW4pOworCXJldHVybiBkX2FsbG9jKHBhcmVudCwgJnEpOworfQorCisvKioKKyAqIGRfaW5zdGFudGlhdGUgLSBmaWxsIGluIGlub2RlIGluZm9ybWF0aW9uIGZvciBhIGRlbnRyeQorICogQGVudHJ5OiBkZW50cnkgdG8gY29tcGxldGUKKyAqIEBpbm9kZTogaW5vZGUgdG8gYXR0YWNoIHRvIHRoaXMgZGVudHJ5CisgKgorICogRmlsbCBpbiBpbm9kZSBpbmZvcm1hdGlvbiBpbiB0aGUgZW50cnkuCisgKgorICogVGhpcyB0dXJucyBuZWdhdGl2ZSBkZW50cmllcyBpbnRvIHByb2R1Y3RpdmUgZnVsbCBtZW1iZXJzCisgKiBvZiBzb2NpZXR5LgorICoKKyAqIE5PVEUhIFRoaXMgYXNzdW1lcyB0aGF0IHRoZSBpbm9kZSBjb3VudCBoYXMgYmVlbiBpbmNyZW1lbnRlZAorICogKG9yIG90aGVyd2lzZSBzZXQpIGJ5IHRoZSBjYWxsZXIgdG8gaW5kaWNhdGUgdGhhdCBpdCBpcyBub3cKKyAqIGluIHVzZSBieSB0aGUgZGNhY2hlLgorICovCisgCit2b2lkIGRfaW5zdGFudGlhdGUoc3RydWN0IGRlbnRyeSAqZW50cnksIHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCWlmICghbGlzdF9lbXB0eSgmZW50cnktPmRfYWxpYXMpKSBCVUcoKTsKKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwlpZiAoaW5vZGUpCisJCWxpc3RfYWRkKCZlbnRyeS0+ZF9hbGlhcywgJmlub2RlLT5pX2RlbnRyeSk7CisJZW50cnktPmRfaW5vZGUgPSBpbm9kZTsKKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCXNlY3VyaXR5X2RfaW5zdGFudGlhdGUoZW50cnksIGlub2RlKTsKK30KKworLyoqCisgKiBkX2luc3RhbnRpYXRlX3VuaXF1ZSAtIGluc3RhbnRpYXRlIGEgbm9uLWFsaWFzZWQgZGVudHJ5CisgKiBAZW50cnk6IGRlbnRyeSB0byBpbnN0YW50aWF0ZQorICogQGlub2RlOiBpbm9kZSB0byBhdHRhY2ggdG8gdGhpcyBkZW50cnkKKyAqCisgKiBGaWxsIGluIGlub2RlIGluZm9ybWF0aW9uIGluIHRoZSBlbnRyeS4gT24gc3VjY2VzcywgaXQgcmV0dXJucyBOVUxMLgorICogSWYgYW4gdW5oYXNoZWQgYWxpYXMgb2YgImVudHJ5IiBhbHJlYWR5IGV4aXN0cywgdGhlbiB3ZSByZXR1cm4gdGhlCisgKiBhbGlhc2VkIGRlbnRyeSBpbnN0ZWFkLgorICoKKyAqIE5vdGUgdGhhdCBpbiBvcmRlciB0byBhdm9pZCBjb25mbGljdHMgd2l0aCByZW5hbWUoKSBldGMsIHRoZSBjYWxsZXIKKyAqIGhhZCBiZXR0ZXIgYmUgaG9sZGluZyB0aGUgcGFyZW50IGRpcmVjdG9yeSBzZW1hcGhvcmUuCisgKi8KK3N0cnVjdCBkZW50cnkgKmRfaW5zdGFudGlhdGVfdW5pcXVlKHN0cnVjdCBkZW50cnkgKmVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBkZW50cnkgKmFsaWFzOworCWludCBsZW4gPSBlbnRyeS0+ZF9uYW1lLmxlbjsKKwljb25zdCBjaGFyICpuYW1lID0gZW50cnktPmRfbmFtZS5uYW1lOworCXVuc2lnbmVkIGludCBoYXNoID0gZW50cnktPmRfbmFtZS5oYXNoOworCisJQlVHX09OKCFsaXN0X2VtcHR5KCZlbnRyeS0+ZF9hbGlhcykpOworCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCWlmICghaW5vZGUpCisJCWdvdG8gZG9fbmVnYXRpdmU7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShhbGlhcywgJmlub2RlLT5pX2RlbnRyeSwgZF9hbGlhcykgeworCQlzdHJ1Y3QgcXN0ciAqcXN0ciA9ICZhbGlhcy0+ZF9uYW1lOworCisJCWlmIChxc3RyLT5oYXNoICE9IGhhc2gpCisJCQljb250aW51ZTsKKwkJaWYgKGFsaWFzLT5kX3BhcmVudCAhPSBlbnRyeS0+ZF9wYXJlbnQpCisJCQljb250aW51ZTsKKwkJaWYgKHFzdHItPmxlbiAhPSBsZW4pCisJCQljb250aW51ZTsKKwkJaWYgKG1lbWNtcChxc3RyLT5uYW1lLCBuYW1lLCBsZW4pKQorCQkJY29udGludWU7CisJCWRnZXRfbG9ja2VkKGFsaWFzKTsKKwkJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwkJQlVHX09OKCFkX3VuaGFzaGVkKGFsaWFzKSk7CisJCXJldHVybiBhbGlhczsKKwl9CisJbGlzdF9hZGQoJmVudHJ5LT5kX2FsaWFzLCAmaW5vZGUtPmlfZGVudHJ5KTsKK2RvX25lZ2F0aXZlOgorCWVudHJ5LT5kX2lub2RlID0gaW5vZGU7CisJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwlzZWN1cml0eV9kX2luc3RhbnRpYXRlKGVudHJ5LCBpbm9kZSk7CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKGRfaW5zdGFudGlhdGVfdW5pcXVlKTsKKworLyoqCisgKiBkX2FsbG9jX3Jvb3QgLSBhbGxvY2F0ZSByb290IGRlbnRyeQorICogQHJvb3RfaW5vZGU6IGlub2RlIHRvIGFsbG9jYXRlIHRoZSByb290IGZvcgorICoKKyAqIEFsbG9jYXRlIGEgcm9vdCAoIi8iKSBkZW50cnkgZm9yIHRoZSBpbm9kZSBnaXZlbi4gVGhlIGlub2RlIGlzCisgKiBpbnN0YW50aWF0ZWQgYW5kIHJldHVybmVkLiAlTlVMTCBpcyByZXR1cm5lZCBpZiB0aGVyZSBpcyBpbnN1ZmZpY2llbnQKKyAqIG1lbW9yeSBvciB0aGUgaW5vZGUgcGFzc2VkIGlzICVOVUxMLgorICovCisgCitzdHJ1Y3QgZGVudHJ5ICogZF9hbGxvY19yb290KHN0cnVjdCBpbm9kZSAqIHJvb3RfaW5vZGUpCit7CisJc3RydWN0IGRlbnRyeSAqcmVzID0gTlVMTDsKKworCWlmIChyb290X2lub2RlKSB7CisJCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcXN0ciBuYW1lID0geyAubmFtZSA9ICIvIiwgLmxlbiA9IDEgfTsKKworCQlyZXMgPSBkX2FsbG9jKE5VTEwsICZuYW1lKTsKKwkJaWYgKHJlcykgeworCQkJcmVzLT5kX3NiID0gcm9vdF9pbm9kZS0+aV9zYjsKKwkJCXJlcy0+ZF9wYXJlbnQgPSByZXM7CisJCQlkX2luc3RhbnRpYXRlKHJlcywgcm9vdF9pbm9kZSk7CisJCX0KKwl9CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaGxpc3RfaGVhZCAqZF9oYXNoKHN0cnVjdCBkZW50cnkgKnBhcmVudCwKKwkJCQkJdW5zaWduZWQgbG9uZyBoYXNoKQoreworCWhhc2ggKz0gKCh1bnNpZ25lZCBsb25nKSBwYXJlbnQgXiBHT0xERU5fUkFUSU9fUFJJTUUpIC8gTDFfQ0FDSEVfQllURVM7CisJaGFzaCA9IGhhc2ggXiAoKGhhc2ggXiBHT0xERU5fUkFUSU9fUFJJTUUpID4+IERfSEFTSEJJVFMpOworCXJldHVybiBkZW50cnlfaGFzaHRhYmxlICsgKGhhc2ggJiBEX0hBU0hNQVNLKTsKK30KKworLyoqCisgKiBkX2FsbG9jX2Fub24gLSBhbGxvY2F0ZSBhbiBhbm9ueW1vdXMgZGVudHJ5CisgKiBAaW5vZGU6IGlub2RlIHRvIGFsbG9jYXRlIHRoZSBkZW50cnkgZm9yCisgKgorICogVGhpcyBpcyBzaW1pbGFyIHRvIGRfYWxsb2Nfcm9vdC4gIEl0IGlzIHVzZWQgYnkgZmlsZXN5c3RlbXMgd2hlbgorICogY3JlYXRpbmcgYSBkZW50cnkgZm9yIGEgZ2l2ZW4gaW5vZGUsIG9mdGVuIGluIHRoZSBwcm9jZXNzIG9mIAorICogbWFwcGluZyBhIGZpbGVoYW5kbGUgdG8gYSBkZW50cnkuICBUaGUgcmV0dXJuZWQgZGVudHJ5IG1heSBiZQorICogYW5vbnltb3VzLCBvciBtYXkgaGF2ZSBhIGZ1bGwgbmFtZSAoaWYgdGhlIGlub2RlIHdhcyBhbHJlYWR5CisgKiBpbiB0aGUgY2FjaGUpLiAgVGhlIGZpbGUgc3lzdGVtIG1heSBuZWVkIHRvIG1ha2UgZnVydGhlcgorICogZWZmb3J0cyB0byBjb25uZWN0IHRoaXMgZGVudHJ5IGludG8gdGhlIGRjYWNoZSBwcm9wZXJseS4KKyAqCisgKiBXaGVuIGNhbGxlZCBvbiBhIGRpcmVjdG9yeSBpbm9kZSwgd2UgbXVzdCBlbnN1cmUgdGhhdAorICogdGhlIGlub2RlIG9ubHkgZXZlciBoYXMgb25lIGRlbnRyeS4gIElmIGEgZGVudHJ5IGlzCisgKiBmb3VuZCwgdGhhdCBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIGFsbG9jYXRpbmcgYSBuZXcgb25lLgorICoKKyAqIE9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBpbm9kZSBoYXMgYmVlbiB0cmFuc2ZlcnJlZAorICogdG8gdGhlIGRlbnRyeS4gIElmICVOVUxMIGlzIHJldHVybmVkIChpbmRpY2F0aW5nIGttYWxsb2MgZmFpbHVyZSksCisgKiB0aGUgcmVmZXJlbmNlIG9uIHRoZSBpbm9kZSBoYXMgbm90IGJlZW4gcmVsZWFzZWQuCisgKi8KKworc3RydWN0IGRlbnRyeSAqIGRfYWxsb2NfYW5vbihzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcXN0ciBhbm9uc3RyaW5nID0geyAubmFtZSA9ICIiIH07CisJc3RydWN0IGRlbnRyeSAqdG1wOworCXN0cnVjdCBkZW50cnkgKnJlczsKKworCWlmICgocmVzID0gZF9maW5kX2FsaWFzKGlub2RlKSkpIHsKKwkJaXB1dChpbm9kZSk7CisJCXJldHVybiByZXM7CisJfQorCisJdG1wID0gZF9hbGxvYyhOVUxMLCAmYW5vbnN0cmluZyk7CisJaWYgKCF0bXApCisJCXJldHVybiBOVUxMOworCisJdG1wLT5kX3BhcmVudCA9IHRtcDsgLyogbWFrZSBzdXJlIGRwdXQgZG9lc24ndCBjcm9hayAqLworCQorCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCXJlcyA9IF9fZF9maW5kX2FsaWFzKGlub2RlLCAwKTsKKwlpZiAoIXJlcykgeworCQkvKiBhdHRhY2ggYSBkaXNjb25uZWN0ZWQgZGVudHJ5ICovCisJCXJlcyA9IHRtcDsKKwkJdG1wID0gTlVMTDsKKwkJc3Bpbl9sb2NrKCZyZXMtPmRfbG9jayk7CisJCXJlcy0+ZF9zYiA9IGlub2RlLT5pX3NiOworCQlyZXMtPmRfcGFyZW50ID0gcmVzOworCQlyZXMtPmRfaW5vZGUgPSBpbm9kZTsKKwkJcmVzLT5kX2ZsYWdzIHw9IERDQUNIRV9ESVNDT05ORUNURUQ7CisJCXJlcy0+ZF9mbGFncyAmPSB+RENBQ0hFX1VOSEFTSEVEOworCQlsaXN0X2FkZCgmcmVzLT5kX2FsaWFzLCAmaW5vZGUtPmlfZGVudHJ5KTsKKwkJaGxpc3RfYWRkX2hlYWQoJnJlcy0+ZF9oYXNoLCAmaW5vZGUtPmlfc2ItPnNfYW5vbik7CisJCXNwaW5fdW5sb2NrKCZyZXMtPmRfbG9jayk7CisKKwkJaW5vZGUgPSBOVUxMOyAvKiBkb24ndCBkcm9wIHJlZmVyZW5jZSAqLworCX0KKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCisJaWYgKGlub2RlKQorCQlpcHV0KGlub2RlKTsKKwlpZiAodG1wKQorCQlkcHV0KHRtcCk7CisJcmV0dXJuIHJlczsKK30KKworCisvKioKKyAqIGRfc3BsaWNlX2FsaWFzIC0gc3BsaWNlIGEgZGlzY29ubmVjdGVkIGRlbnRyeSBpbnRvIHRoZSB0cmVlIGlmIG9uZSBleGlzdHMKKyAqIEBpbm9kZTogIHRoZSBpbm9kZSB3aGljaCBtYXkgaGF2ZSBhIGRpc2Nvbm5lY3RlZCBkZW50cnkKKyAqIEBkZW50cnk6IGEgbmVnYXRpdmUgZGVudHJ5IHdoaWNoIHdlIHdhbnQgdG8gcG9pbnQgdG8gdGhlIGlub2RlLgorICoKKyAqIElmIGlub2RlIGlzIGEgZGlyZWN0b3J5IGFuZCBoYXMgYSAnZGlzY29ubmVjdGVkJyBkZW50cnkgKGkuZS4gSVNfUk9PVCBhbmQKKyAqIERDQUNIRV9ESVNDT05ORUNURUQpLCB0aGVuIGRfbW92ZSB0aGF0IGluIHBsYWNlIG9mIHRoZSBnaXZlbiBkZW50cnkKKyAqIGFuZCByZXR1cm4gaXQsIGVsc2Ugc2ltcGx5IGRfYWRkIHRoZSBpbm9kZSB0byB0aGUgZGVudHJ5IGFuZCByZXR1cm4gTlVMTC4KKyAqCisgKiBUaGlzIGlzIG5lZWRlZCBpbiB0aGUgbG9va3VwIHJvdXRpbmUgb2YgYW55IGZpbGVzeXN0ZW0gdGhhdCBpcyBleHBvcnRhYmxlCisgKiAodmlhIGtuZnNkKSBzbyB0aGF0IHdlIGNhbiBidWlsZCBkY2FjaGUgcGF0aHMgdG8gZGlyZWN0b3JpZXMgZWZmZWN0aXZlbHkuCisgKgorICogSWYgYSBkZW50cnkgd2FzIGZvdW5kIGFuZCBtb3ZlZCwgdGhlbiBpdCBpcyByZXR1cm5lZC4gIE90aGVyd2lzZSBOVUxMCisgKiBpcyByZXR1cm5lZC4gIFRoaXMgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgcmV0dXJuIHZhbHVlIG9mIC0+bG9va3VwLgorICoKKyAqLworc3RydWN0IGRlbnRyeSAqZF9zcGxpY2VfYWxpYXMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBkZW50cnkgKm5ldyA9IE5VTEw7CisKKwlpZiAoaW5vZGUpIHsKKwkJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJCW5ldyA9IF9fZF9maW5kX2FsaWFzKGlub2RlLCAxKTsKKwkJaWYgKG5ldykgeworCQkJQlVHX09OKCEobmV3LT5kX2ZsYWdzICYgRENBQ0hFX0RJU0NPTk5FQ1RFRCkpOworCQkJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwkJCXNlY3VyaXR5X2RfaW5zdGFudGlhdGUobmV3LCBpbm9kZSk7CisJCQlkX3JlaGFzaChkZW50cnkpOworCQkJZF9tb3ZlKG5ldywgZGVudHJ5KTsKKwkJCWlwdXQoaW5vZGUpOworCQl9IGVsc2UgeworCQkJLyogZF9pbnN0YW50aWF0ZSB0YWtlcyBkY2FjaGVfbG9jaywgc28gd2UgZG8gaXQgYnkgaGFuZCAqLworCQkJbGlzdF9hZGQoJmRlbnRyeS0+ZF9hbGlhcywgJmlub2RlLT5pX2RlbnRyeSk7CisJCQlkZW50cnktPmRfaW5vZGUgPSBpbm9kZTsKKwkJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJCQlzZWN1cml0eV9kX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCQkJZF9yZWhhc2goZGVudHJ5KTsKKwkJfQorCX0gZWxzZQorCQlkX2FkZChkZW50cnksIGlub2RlKTsKKwlyZXR1cm4gbmV3OworfQorCisKKy8qKgorICogZF9sb29rdXAgLSBzZWFyY2ggZm9yIGEgZGVudHJ5CisgKiBAcGFyZW50OiBwYXJlbnQgZGVudHJ5CisgKiBAbmFtZTogcXN0ciBvZiBuYW1lIHdlIHdpc2ggdG8gZmluZAorICoKKyAqIFNlYXJjaGVzIHRoZSBjaGlsZHJlbiBvZiB0aGUgcGFyZW50IGRlbnRyeSBmb3IgdGhlIG5hbWUgaW4gcXVlc3Rpb24uIElmCisgKiB0aGUgZGVudHJ5IGlzIGZvdW5kIGl0cyByZWZlcmVuY2UgY291bnQgaXMgaW5jcmVtZW50ZWQgYW5kIHRoZSBkZW50cnkKKyAqIGlzIHJldHVybmVkLiBUaGUgY2FsbGVyIG11c3QgdXNlIGRfcHV0IHRvIGZyZWUgdGhlIGVudHJ5IHdoZW4gaXQgaGFzCisgKiBmaW5pc2hlZCB1c2luZyBpdC4gJU5VTEwgaXMgcmV0dXJuZWQgb24gZmFpbHVyZS4KKyAqCisgKiBfX2RfbG9va3VwIGlzIGRjYWNoZV9sb2NrIGZyZWUuIFRoZSBoYXNoIGxpc3QgaXMgcHJvdGVjdGVkIHVzaW5nIFJDVS4KKyAqIE1lbW9yeSBiYXJyaWVycyBhcmUgdXNlZCB3aGlsZSB1cGRhdGluZyBhbmQgZG9pbmcgbG9ja2xlc3MgdHJhdmVyc2FsLiAKKyAqIFRvIGF2b2lkIHJhY2VzIHdpdGggZF9tb3ZlIHdoaWxlIHJlbmFtZSBpcyBoYXBwZW5pbmcsIGRfbG9jayBpcyB1c2VkLgorICoKKyAqIE92ZXJmbG93cyBpbiBtZW1jbXAoKSwgd2hpbGUgZF9tb3ZlLCBhcmUgYXZvaWRlZCBieSBrZWVwaW5nIHRoZSBsZW5ndGgKKyAqIGFuZCBuYW1lIHBvaW50ZXIgaW4gb25lIHN0cnVjdHVyZSBwb2ludGVkIGJ5IGRfcXN0ci4KKyAqCisgKiByY3VfcmVhZF9sb2NrKCkgYW5kIHJjdV9yZWFkX3VubG9jaygpIGFyZSB1c2VkIHRvIGRpc2FibGUgcHJlZW1wdGlvbiB3aGlsZQorICogbG9va3VwIGlzIGdvaW5nIG9uLgorICoKKyAqIGRlbnRyeV91bnVzZWQgbGlzdCBpcyBub3QgdXBkYXRlZCBldmVuIGlmIGxvb2t1cCBmaW5kcyB0aGUgcmVxdWlyZWQgZGVudHJ5CisgKiBpbiB0aGVyZS4gSXQgaXMgdXBkYXRlZCBpbiBwbGFjZXMgc3VjaCBhcyBwcnVuZV9kY2FjaGUsIHNocmlua19kY2FjaGVfc2IsCisgKiBzZWxlY3RfcGFyZW50IGFuZCBfX2RnZXRfbG9ja2VkLiBUaGlzIGxhemluZXNzIHNhdmVzIGxvb2t1cCBmcm9tIGRjYWNoZV9sb2NrCisgKiBhY3F1aXNpdGlvbi4KKyAqCisgKiBkX2xvb2t1cCgpIGlzIHByb3RlY3RlZCBhZ2FpbnN0IHRoZSBjb25jdXJyZW50IHJlbmFtZXMgaW4gc29tZSB1bnJlbGF0ZWQKKyAqIGRpcmVjdG9yeSB1c2luZyB0aGUgc2VxbG9ja3RfdCByZW5hbWVfbG9jay4KKyAqLworCitzdHJ1Y3QgZGVudHJ5ICogZF9sb29rdXAoc3RydWN0IGRlbnRyeSAqIHBhcmVudCwgc3RydWN0IHFzdHIgKiBuYW1lKQoreworCXN0cnVjdCBkZW50cnkgKiBkZW50cnkgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgc2VxOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBzZXEgPSByZWFkX3NlcWJlZ2luKCZyZW5hbWVfbG9jayk7CisgICAgICAgICAgICAgICAgZGVudHJ5ID0gX19kX2xvb2t1cChwYXJlbnQsIG5hbWUpOworICAgICAgICAgICAgICAgIGlmIChkZW50cnkpCisJCQlicmVhazsKKwl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZyZW5hbWVfbG9jaywgc2VxKSk7CisJcmV0dXJuIGRlbnRyeTsKK30KKworc3RydWN0IGRlbnRyeSAqIF9fZF9sb29rdXAoc3RydWN0IGRlbnRyeSAqIHBhcmVudCwgc3RydWN0IHFzdHIgKiBuYW1lKQoreworCXVuc2lnbmVkIGludCBsZW4gPSBuYW1lLT5sZW47CisJdW5zaWduZWQgaW50IGhhc2ggPSBuYW1lLT5oYXNoOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnN0ciA9IG5hbWUtPm5hbWU7CisJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQgPSBkX2hhc2gocGFyZW50LGhhc2gpOworCXN0cnVjdCBkZW50cnkgKmZvdW5kID0gTlVMTDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKworCXJjdV9yZWFkX2xvY2soKTsKKwkKKwlobGlzdF9mb3JfZWFjaF9yY3Uobm9kZSwgaGVhZCkgeworCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7IAorCQlzdHJ1Y3QgcXN0ciAqcXN0cjsKKworCQlkZW50cnkgPSBobGlzdF9lbnRyeShub2RlLCBzdHJ1Y3QgZGVudHJ5LCBkX2hhc2gpOworCisJCWlmIChkZW50cnktPmRfbmFtZS5oYXNoICE9IGhhc2gpCisJCQljb250aW51ZTsKKwkJaWYgKGRlbnRyeS0+ZF9wYXJlbnQgIT0gcGFyZW50KQorCQkJY29udGludWU7CisKKwkJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7CisKKwkJLyoKKwkJICogUmVjaGVjayB0aGUgZGVudHJ5IGFmdGVyIHRha2luZyB0aGUgbG9jayAtIGRfbW92ZSBtYXkgaGF2ZQorCQkgKiBjaGFuZ2VkIHRoaW5ncy4gIERvbid0IGJvdGhlciBjaGVja2luZyB0aGUgaGFzaCBiZWNhdXNlIHdlJ3JlCisJCSAqIGFib3V0IHRvIGNvbXBhcmUgdGhlIHdob2xlIG5hbWUgYW55d2F5LgorCQkgKi8KKwkJaWYgKGRlbnRyeS0+ZF9wYXJlbnQgIT0gcGFyZW50KQorCQkJZ290byBuZXh0OworCisJCS8qCisJCSAqIEl0IGlzIHNhZmUgdG8gY29tcGFyZSBuYW1lcyBzaW5jZSBkX21vdmUoKSBjYW5ub3QKKwkJICogY2hhbmdlIHRoZSBxc3RyIChwcm90ZWN0ZWQgYnkgZF9sb2NrKS4KKwkJICovCisJCXFzdHIgPSAmZGVudHJ5LT5kX25hbWU7CisJCWlmIChwYXJlbnQtPmRfb3AgJiYgcGFyZW50LT5kX29wLT5kX2NvbXBhcmUpIHsKKwkJCWlmIChwYXJlbnQtPmRfb3AtPmRfY29tcGFyZShwYXJlbnQsIHFzdHIsIG5hbWUpKQorCQkJCWdvdG8gbmV4dDsKKwkJfSBlbHNlIHsKKwkJCWlmIChxc3RyLT5sZW4gIT0gbGVuKQorCQkJCWdvdG8gbmV4dDsKKwkJCWlmIChtZW1jbXAocXN0ci0+bmFtZSwgc3RyLCBsZW4pKQorCQkJCWdvdG8gbmV4dDsKKwkJfQorCisJCWlmICghZF91bmhhc2hlZChkZW50cnkpKSB7CisJCQlhdG9taWNfaW5jKCZkZW50cnktPmRfY291bnQpOworCQkJZm91bmQgPSBkZW50cnk7CisJCX0KKwkJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwkJYnJlYWs7CituZXh0OgorCQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworIAl9CisgCXJjdV9yZWFkX3VubG9jaygpOworCisgCXJldHVybiBmb3VuZDsKK30KKworLyoqCisgKiBkX3ZhbGlkYXRlIC0gdmVyaWZ5IGRlbnRyeSBwcm92aWRlZCBmcm9tIGluc2VjdXJlIHNvdXJjZQorICogQGRlbnRyeTogVGhlIGRlbnRyeSBhbGxlZ2VkIHRvIGJlIHZhbGlkIGNoaWxkIG9mIEBkcGFyZW50CisgKiBAZHBhcmVudDogVGhlIHBhcmVudCBkZW50cnkgKGtub3duIHRvIGJlIHZhbGlkKQorICogQGhhc2g6IEhhc2ggb2YgdGhlIGRlbnRyeQorICogQGxlbjogTGVuZ3RoIG9mIHRoZSBuYW1lCisgKgorICogQW4gaW5zZWN1cmUgc291cmNlIGhhcyBzZW50IHVzIGEgZGVudHJ5LCBoZXJlIHdlIHZlcmlmeSBpdCBhbmQgZGdldCgpIGl0LgorICogVGhpcyBpcyB1c2VkIGJ5IG5jcGZzIGluIGl0cyByZWFkZGlyIGltcGxlbWVudGF0aW9uLgorICogWmVybyBpcyByZXR1cm5lZCBpbiB0aGUgZGVudHJ5IGlzIGludmFsaWQuCisgKi8KKyAKK2ludCBkX3ZhbGlkYXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGRlbnRyeSAqZHBhcmVudCkKK3sKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqYmFzZTsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbGhwOworCisJLyogQ2hlY2sgd2hldGhlciB0aGUgcHRyIG1pZ2h0IGJlIHZhbGlkIGF0IGFsbC4uICovCisJaWYgKCFrbWVtX3B0cl92YWxpZGF0ZShkZW50cnlfY2FjaGUsIGRlbnRyeSkpCisJCWdvdG8gb3V0OworCisJaWYgKGRlbnRyeS0+ZF9wYXJlbnQgIT0gZHBhcmVudCkKKwkJZ290byBvdXQ7CisKKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwliYXNlID0gZF9oYXNoKGRwYXJlbnQsIGRlbnRyeS0+ZF9uYW1lLmhhc2gpOworCWhsaXN0X2Zvcl9lYWNoKGxocCxiYXNlKSB7IAorCQkvKiBobGlzdF9mb3JfZWFjaF9yY3UoKSBub3QgcmVxdWlyZWQgZm9yIGRfaGFzaCBsaXN0CisJCSAqIGFzIGl0IGlzIHBhcnNlZCB1bmRlciBkY2FjaGVfbG9jaworCQkgKi8KKwkJaWYgKGRlbnRyeSA9PSBobGlzdF9lbnRyeShsaHAsIHN0cnVjdCBkZW50cnksIGRfaGFzaCkpIHsKKwkJCV9fZGdldF9sb2NrZWQoZGVudHJ5KTsKKwkJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworb3V0OgorCXJldHVybiAwOworfQorCisvKgorICogV2hlbiBhIGZpbGUgaXMgZGVsZXRlZCwgd2UgaGF2ZSB0d28gb3B0aW9uczoKKyAqIC0gdHVybiB0aGlzIGRlbnRyeSBpbnRvIGEgbmVnYXRpdmUgZGVudHJ5CisgKiAtIHVuaGFzaCB0aGlzIGRlbnRyeSBhbmQgZnJlZSBpdC4KKyAqCisgKiBVc3VhbGx5LCB3ZSB3YW50IHRvIGp1c3QgdHVybiB0aGlzIGludG8KKyAqIGEgbmVnYXRpdmUgZGVudHJ5LCBidXQgaWYgYW55Ym9keSBlbHNlIGlzCisgKiBjdXJyZW50bHkgdXNpbmcgdGhlIGRlbnRyeSBvciB0aGUgaW5vZGUKKyAqIHdlIGNhbid0IGRvIHRoYXQgYW5kIHdlIGZhbGwgYmFjayBvbiByZW1vdmluZworICogaXQgZnJvbSB0aGUgaGFzaCBxdWV1ZXMgYW5kIHdhaXRpbmcgZm9yCisgKiBpdCB0byBiZSBkZWxldGVkIGxhdGVyIHdoZW4gaXQgaGFzIG5vIHVzZXJzCisgKi8KKyAKKy8qKgorICogZF9kZWxldGUgLSBkZWxldGUgYSBkZW50cnkKKyAqIEBkZW50cnk6IFRoZSBkZW50cnkgdG8gZGVsZXRlCisgKgorICogVHVybiB0aGUgZGVudHJ5IGludG8gYSBuZWdhdGl2ZSBkZW50cnkgaWYgcG9zc2libGUsIG90aGVyd2lzZQorICogcmVtb3ZlIGl0IGZyb20gdGhlIGhhc2ggcXVldWVzIHNvIGl0IGNhbiBiZSBkZWxldGVkIGxhdGVyCisgKi8KKyAKK3ZvaWQgZF9kZWxldGUoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSkKK3sKKwkvKgorCSAqIEFyZSB3ZSB0aGUgb25seSB1c2VyPworCSAqLworCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCXNwaW5fbG9jaygmZGVudHJ5LT5kX2xvY2spOworCWlmIChhdG9taWNfcmVhZCgmZGVudHJ5LT5kX2NvdW50KSA9PSAxKSB7CisJCWRlbnRyeV9pcHV0KGRlbnRyeSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIWRfdW5oYXNoZWQoZGVudHJ5KSkKKwkJX19kX2Ryb3AoZGVudHJ5KTsKKworCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CisJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgX19kX3JlaGFzaChzdHJ1Y3QgZGVudHJ5ICogZW50cnksIHN0cnVjdCBobGlzdF9oZWFkICpsaXN0KQoreworCisgCWVudHJ5LT5kX2ZsYWdzICY9IH5EQ0FDSEVfVU5IQVNIRUQ7CisgCWhsaXN0X2FkZF9oZWFkX3JjdSgmZW50cnktPmRfaGFzaCwgbGlzdCk7Cit9CisKKy8qKgorICogZF9yZWhhc2gJLSBhZGQgYW4gZW50cnkgYmFjayB0byB0aGUgaGFzaAorICogQGVudHJ5OiBkZW50cnkgdG8gYWRkIHRvIHRoZSBoYXNoCisgKgorICogQWRkcyBhIGRlbnRyeSB0byB0aGUgaGFzaCBhY2NvcmRpbmcgdG8gaXRzIG5hbWUuCisgKi8KKyAKK3ZvaWQgZF9yZWhhc2goc3RydWN0IGRlbnRyeSAqIGVudHJ5KQoreworCXN0cnVjdCBobGlzdF9oZWFkICpsaXN0ID0gZF9oYXNoKGVudHJ5LT5kX3BhcmVudCwgZW50cnktPmRfbmFtZS5oYXNoKTsKKworCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCXNwaW5fbG9jaygmZW50cnktPmRfbG9jayk7CisJX19kX3JlaGFzaChlbnRyeSwgbGlzdCk7CisJc3Bpbl91bmxvY2soJmVudHJ5LT5kX2xvY2spOworCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7Cit9CisKKyNkZWZpbmUgZG9fc3dpdGNoKHgseSkgZG8geyBcCisJX190eXBlb2ZfXyAoeCkgX190bXAgPSB4OyBcCisJeCA9IHk7IHkgPSBfX3RtcDsgfSB3aGlsZSAoMCkKKworLyoKKyAqIFdoZW4gc3dpdGNoaW5nIG5hbWVzLCB0aGUgYWN0dWFsIHN0cmluZyBkb2Vzbid0IHN0cmljdGx5IGhhdmUgdG8KKyAqIGJlIHByZXNlcnZlZCBpbiB0aGUgdGFyZ2V0IC0gYmVjYXVzZSB3ZSdyZSBkcm9wcGluZyB0aGUgdGFyZ2V0CisgKiBhbnl3YXkuIEFzIHN1Y2gsIHdlIGNhbiBqdXN0IGRvIGEgc2ltcGxlIG1lbWNweSgpIHRvIGNvcHkgb3ZlcgorICogdGhlIG5ldyBuYW1lIGJlZm9yZSB3ZSBzd2l0Y2guCisgKgorICogTm90ZSB0aGF0IHdlIGhhdmUgdG8gYmUgYSBsb3QgbW9yZSBjYXJlZnVsIGFib3V0IGdldHRpbmcgdGhlIGhhc2gKKyAqIHN3aXRjaGVkIC0gd2UgaGF2ZSB0byBzd2l0Y2ggdGhlIGhhc2ggdmFsdWUgcHJvcGVybHkgZXZlbiBpZiBpdAorICogdGhlbiBubyBsb25nZXIgbWF0Y2hlcyB0aGUgYWN0dWFsIChjb3JydXB0ZWQpIHN0cmluZyBvZiB0aGUgdGFyZ2V0LgorICogVGhlIGhhc2ggdmFsdWUgaGFzIHRvIG1hdGNoIHRoZSBoYXNoIHF1ZXVlIHRoYXQgdGhlIGRlbnRyeSBpcyBvbi4uCisgKi8KK3N0YXRpYyB2b2lkIHN3aXRjaF9uYW1lcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBkZW50cnkgKnRhcmdldCkKK3sKKwlpZiAoZG5hbWVfZXh0ZXJuYWwodGFyZ2V0KSkgeworCQlpZiAoZG5hbWVfZXh0ZXJuYWwoZGVudHJ5KSkgeworCQkJLyoKKwkJCSAqIEJvdGggZXh0ZXJuYWw6IHN3YXAgdGhlIHBvaW50ZXJzCisJCQkgKi8KKwkJCWRvX3N3aXRjaCh0YXJnZXQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBkZW50cnk6aW50ZXJuYWwsIHRhcmdldDpleHRlcm5hbC4gIFN0ZWFsIHRhcmdldCdzCisJCQkgKiBzdG9yYWdlIGFuZCBtYWtlIHRhcmdldCBpbnRlcm5hbC4KKwkJCSAqLworCQkJZGVudHJ5LT5kX25hbWUubmFtZSA9IHRhcmdldC0+ZF9uYW1lLm5hbWU7CisJCQl0YXJnZXQtPmRfbmFtZS5uYW1lID0gdGFyZ2V0LT5kX2luYW1lOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGRuYW1lX2V4dGVybmFsKGRlbnRyeSkpIHsKKwkJCS8qCisJCQkgKiBkZW50cnk6ZXh0ZXJuYWwsIHRhcmdldDppbnRlcm5hbC4gIEdpdmUgZGVudHJ5J3MKKwkJCSAqIHN0b3JhZ2UgdG8gdGFyZ2V0IGFuZCBtYWtlIGRlbnRyeSBpbnRlcm5hbAorCQkJICovCisJCQltZW1jcHkoZGVudHJ5LT5kX2luYW1lLCB0YXJnZXQtPmRfbmFtZS5uYW1lLAorCQkJCQl0YXJnZXQtPmRfbmFtZS5sZW4gKyAxKTsKKwkJCXRhcmdldC0+ZF9uYW1lLm5hbWUgPSBkZW50cnktPmRfbmFtZS5uYW1lOworCQkJZGVudHJ5LT5kX25hbWUubmFtZSA9IGRlbnRyeS0+ZF9pbmFtZTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBCb3RoIGFyZSBpbnRlcm5hbC4gIEp1c3QgY29weSB0YXJnZXQgdG8gZGVudHJ5CisJCQkgKi8KKwkJCW1lbWNweShkZW50cnktPmRfaW5hbWUsIHRhcmdldC0+ZF9uYW1lLm5hbWUsCisJCQkJCXRhcmdldC0+ZF9uYW1lLmxlbiArIDEpOworCQl9CisJfQorfQorCisvKgorICogV2UgY2FubmliYWxpemUgInRhcmdldCIgd2hlbiBtb3ZpbmcgZGVudHJ5IG9uIHRvcCBvZiBpdCwKKyAqIGJlY2F1c2UgaXQncyBnb2luZyB0byBiZSB0aHJvd24gYXdheSBhbnl3YXkuIFdlIGNvdWxkIGJlIG1vcmUKKyAqIHBvbGl0ZSBhYm91dCBpdCwgdGhvdWdoLgorICoKKyAqIFRoaXMgZm9yY2VmdWwgcmVtb3ZhbCB3aWxsIHJlc3VsdCBpbiB1Z2x5IC9wcm9jIG91dHB1dCBpZgorICogc29tZWJvZHkgaG9sZHMgYSBmaWxlIG9wZW4gdGhhdCBnb3QgZGVsZXRlZCBkdWUgdG8gYSByZW5hbWUuCisgKiBXZSBjb3VsZCBiZSBuaWNlciBhYm91dCB0aGUgZGVsZXRlZCBmaWxlLCBhbmQgbGV0IGl0IHNob3cKKyAqIHVwIHVuZGVyIHRoZSBuYW1lIGl0IGdvdCBkZWxldGVkIHJhdGhlciB0aGFuIHRoZSBuYW1lIHRoYXQKKyAqIGRlbGV0ZWQgaXQuCisgKi8KKyAKKy8qKgorICogZF9tb3ZlIC0gbW92ZSBhIGRlbnRyeQorICogQGRlbnRyeTogZW50cnkgdG8gbW92ZQorICogQHRhcmdldDogbmV3IGRlbnRyeQorICoKKyAqIFVwZGF0ZSB0aGUgZGNhY2hlIHRvIHJlZmxlY3QgdGhlIG1vdmUgb2YgYSBmaWxlIG5hbWUuIE5lZ2F0aXZlCisgKiBkY2FjaGUgZW50cmllcyBzaG91bGQgbm90IGJlIG1vdmVkIGluIHRoaXMgd2F5LgorICovCisKK3ZvaWQgZF9tb3ZlKHN0cnVjdCBkZW50cnkgKiBkZW50cnksIHN0cnVjdCBkZW50cnkgKiB0YXJnZXQpCit7CisJc3RydWN0IGhsaXN0X2hlYWQgKmxpc3Q7CisKKwlpZiAoIWRlbnRyeS0+ZF9pbm9kZSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVkZTOiBtb3ZpbmcgbmVnYXRpdmUgZGNhY2hlIGVudHJ5XG4iKTsKKworCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCXdyaXRlX3NlcWxvY2soJnJlbmFtZV9sb2NrKTsKKwkvKgorCSAqIFhYWFg6IGRvIHdlIHJlYWxseSBuZWVkIHRvIHRha2UgdGFyZ2V0LT5kX2xvY2s/CisJICovCisJaWYgKHRhcmdldCA8IGRlbnRyeSkgeworCQlzcGluX2xvY2soJnRhcmdldC0+ZF9sb2NrKTsKKwkJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7CisJfSBlbHNlIHsKKwkJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7CisJCXNwaW5fbG9jaygmdGFyZ2V0LT5kX2xvY2spOworCX0KKworCS8qIE1vdmUgdGhlIGRlbnRyeSB0byB0aGUgdGFyZ2V0IGhhc2ggcXVldWUsIGlmIG9uIGRpZmZlcmVudCBidWNrZXQgKi8KKwlpZiAoZGVudHJ5LT5kX2ZsYWdzICYgRENBQ0hFX1VOSEFTSEVEKQorCQlnb3RvIGFscmVhZHlfdW5oYXNoZWQ7CisKKwlobGlzdF9kZWxfcmN1KCZkZW50cnktPmRfaGFzaCk7CisKK2FscmVhZHlfdW5oYXNoZWQ6CisJbGlzdCA9IGRfaGFzaCh0YXJnZXQtPmRfcGFyZW50LCB0YXJnZXQtPmRfbmFtZS5oYXNoKTsKKwlfX2RfcmVoYXNoKGRlbnRyeSwgbGlzdCk7CisKKwkvKiBVbmhhc2ggdGhlIHRhcmdldDogZHB1dCgpIHdpbGwgdGhlbiBnZXQgcmlkIG9mIGl0ICovCisJX19kX2Ryb3AodGFyZ2V0KTsKKworCWxpc3RfZGVsKCZkZW50cnktPmRfY2hpbGQpOworCWxpc3RfZGVsKCZ0YXJnZXQtPmRfY2hpbGQpOworCisJLyogU3dpdGNoIHRoZSBuYW1lcy4uICovCisJc3dpdGNoX25hbWVzKGRlbnRyeSwgdGFyZ2V0KTsKKwlkb19zd2l0Y2goZGVudHJ5LT5kX25hbWUubGVuLCB0YXJnZXQtPmRfbmFtZS5sZW4pOworCWRvX3N3aXRjaChkZW50cnktPmRfbmFtZS5oYXNoLCB0YXJnZXQtPmRfbmFtZS5oYXNoKTsKKworCS8qIC4uLiBhbmQgc3dpdGNoIHRoZSBwYXJlbnRzICovCisJaWYgKElTX1JPT1QoZGVudHJ5KSkgeworCQlkZW50cnktPmRfcGFyZW50ID0gdGFyZ2V0LT5kX3BhcmVudDsKKwkJdGFyZ2V0LT5kX3BhcmVudCA9IHRhcmdldDsKKwkJSU5JVF9MSVNUX0hFQUQoJnRhcmdldC0+ZF9jaGlsZCk7CisJfSBlbHNlIHsKKwkJZG9fc3dpdGNoKGRlbnRyeS0+ZF9wYXJlbnQsIHRhcmdldC0+ZF9wYXJlbnQpOworCisJCS8qIEFuZCBhZGQgdGhlbSBiYWNrIHRvIHRoZSAobmV3KSBwYXJlbnQgbGlzdHMgKi8KKwkJbGlzdF9hZGQoJnRhcmdldC0+ZF9jaGlsZCwgJnRhcmdldC0+ZF9wYXJlbnQtPmRfc3ViZGlycyk7CisJfQorCisJbGlzdF9hZGQoJmRlbnRyeS0+ZF9jaGlsZCwgJmRlbnRyeS0+ZF9wYXJlbnQtPmRfc3ViZGlycyk7CisJc3Bpbl91bmxvY2soJnRhcmdldC0+ZF9sb2NrKTsKKwlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCXdyaXRlX3NlcXVubG9jaygmcmVuYW1lX2xvY2spOworCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7Cit9CisKKy8qKgorICogZF9wYXRoIC0gcmV0dXJuIHRoZSBwYXRoIG9mIGEgZGVudHJ5CisgKiBAZGVudHJ5OiBkZW50cnkgdG8gcmVwb3J0CisgKiBAdmZzbW50OiB2ZnNtbnQgdG8gd2hpY2ggdGhlIGRlbnRyeSBiZWxvbmdzCisgKiBAcm9vdDogcm9vdCBkZW50cnkKKyAqIEByb290bW50OiB2ZnNtbnQgdG8gd2hpY2ggdGhlIHJvb3QgZGVudHJ5IGJlbG9uZ3MKKyAqIEBidWZmZXI6IGJ1ZmZlciB0byByZXR1cm4gdmFsdWUgaW4KKyAqIEBidWZsZW46IGJ1ZmZlciBsZW5ndGgKKyAqCisgKiBDb252ZXJ0IGEgZGVudHJ5IGludG8gYW4gQVNDSUkgcGF0aCBuYW1lLiBJZiB0aGUgZW50cnkgaGFzIGJlZW4gZGVsZXRlZAorICogdGhlIHN0cmluZyAiIChkZWxldGVkKSIgaXMgYXBwZW5kZWQuIE5vdGUgdGhhdCB0aGlzIGlzIGFtYmlndW91cy4KKyAqCisgKiBSZXR1cm5zIHRoZSBidWZmZXIgb3IgYW4gZXJyb3IgY29kZSBpZiB0aGUgcGF0aCB3YXMgdG9vIGxvbmcuCisgKgorICogImJ1ZmxlbiIgc2hvdWxkIGJlIHBvc2l0aXZlLiBDYWxsZXIgaG9sZHMgdGhlIGRjYWNoZV9sb2NrLgorICovCitzdGF0aWMgY2hhciAqIF9fZF9wYXRoKCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCB2ZnNtb3VudCAqdmZzbW50LAorCQkJc3RydWN0IGRlbnRyeSAqcm9vdCwgc3RydWN0IHZmc21vdW50ICpyb290bW50LAorCQkJY2hhciAqYnVmZmVyLCBpbnQgYnVmbGVuKQoreworCWNoYXIgKiBlbmQgPSBidWZmZXIrYnVmbGVuOworCWNoYXIgKiByZXR2YWw7CisJaW50IG5hbWVsZW47CisKKwkqLS1lbmQgPSAnXDAnOworCWJ1Zmxlbi0tOworCWlmICghSVNfUk9PVChkZW50cnkpICYmIGRfdW5oYXNoZWQoZGVudHJ5KSkgeworCQlidWZsZW4gLT0gMTA7CisJCWVuZCAtPSAxMDsKKwkJaWYgKGJ1ZmxlbiA8IDApCisJCQlnb3RvIEVsb25nOworCQltZW1jcHkoZW5kLCAiIChkZWxldGVkKSIsIDEwKTsKKwl9CisKKwlpZiAoYnVmbGVuIDwgMSkKKwkJZ290byBFbG9uZzsKKwkvKiBHZXQgJy8nIHJpZ2h0ICovCisJcmV0dmFsID0gZW5kLTE7CisJKnJldHZhbCA9ICcvJzsKKworCWZvciAoOzspIHsKKwkJc3RydWN0IGRlbnRyeSAqIHBhcmVudDsKKworCQlpZiAoZGVudHJ5ID09IHJvb3QgJiYgdmZzbW50ID09IHJvb3RtbnQpCisJCQlicmVhazsKKwkJaWYgKGRlbnRyeSA9PSB2ZnNtbnQtPm1udF9yb290IHx8IElTX1JPT1QoZGVudHJ5KSkgeworCQkJLyogR2xvYmFsIHJvb3Q/ICovCisJCQlzcGluX2xvY2soJnZmc21vdW50X2xvY2spOworCQkJaWYgKHZmc21udC0+bW50X3BhcmVudCA9PSB2ZnNtbnQpIHsKKwkJCQlzcGluX3VubG9jaygmdmZzbW91bnRfbG9jayk7CisJCQkJZ290byBnbG9iYWxfcm9vdDsKKwkJCX0KKwkJCWRlbnRyeSA9IHZmc21udC0+bW50X21vdW50cG9pbnQ7CisJCQl2ZnNtbnQgPSB2ZnNtbnQtPm1udF9wYXJlbnQ7CisJCQlzcGluX3VubG9jaygmdmZzbW91bnRfbG9jayk7CisJCQljb250aW51ZTsKKwkJfQorCQlwYXJlbnQgPSBkZW50cnktPmRfcGFyZW50OworCQlwcmVmZXRjaChwYXJlbnQpOworCQluYW1lbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCQlidWZsZW4gLT0gbmFtZWxlbiArIDE7CisJCWlmIChidWZsZW4gPCAwKQorCQkJZ290byBFbG9uZzsKKwkJZW5kIC09IG5hbWVsZW47CisJCW1lbWNweShlbmQsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIG5hbWVsZW4pOworCQkqLS1lbmQgPSAnLyc7CisJCXJldHZhbCA9IGVuZDsKKwkJZGVudHJ5ID0gcGFyZW50OworCX0KKworCXJldHVybiByZXR2YWw7CisKK2dsb2JhbF9yb290OgorCW5hbWVsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisJYnVmbGVuIC09IG5hbWVsZW47CisJaWYgKGJ1ZmxlbiA8IDApCisJCWdvdG8gRWxvbmc7CisJcmV0dmFsIC09IG5hbWVsZW4tMTsJLyogaGl0IHRoZSBzbGFzaCAqLworCW1lbWNweShyZXR2YWwsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIG5hbWVsZW4pOworCXJldHVybiByZXR2YWw7CitFbG9uZzoKKwlyZXR1cm4gRVJSX1BUUigtRU5BTUVUT09MT05HKTsKK30KKworLyogd3JpdGUgZnVsbCBwYXRobmFtZSBpbnRvIGJ1ZmZlciBhbmQgcmV0dXJuIHN0YXJ0IG9mIHBhdGhuYW1lICovCitjaGFyICogZF9wYXRoKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHZmc21vdW50ICp2ZnNtbnQsCisJCQkJY2hhciAqYnVmLCBpbnQgYnVmbGVuKQoreworCWNoYXIgKnJlczsKKwlzdHJ1Y3QgdmZzbW91bnQgKnJvb3RtbnQ7CisJc3RydWN0IGRlbnRyeSAqcm9vdDsKKworCXJlYWRfbG9jaygmY3VycmVudC0+ZnMtPmxvY2spOworCXJvb3RtbnQgPSBtbnRnZXQoY3VycmVudC0+ZnMtPnJvb3RtbnQpOworCXJvb3QgPSBkZ2V0KGN1cnJlbnQtPmZzLT5yb290KTsKKwlyZWFkX3VubG9jaygmY3VycmVudC0+ZnMtPmxvY2spOworCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCXJlcyA9IF9fZF9wYXRoKGRlbnRyeSwgdmZzbW50LCByb290LCByb290bW50LCBidWYsIGJ1Zmxlbik7CisJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwlkcHV0KHJvb3QpOworCW1udHB1dChyb290bW50KTsKKwlyZXR1cm4gcmVzOworfQorCisvKgorICogTk9URSEgVGhlIHVzZXItbGV2ZWwgbGlicmFyeSB2ZXJzaW9uIHJldHVybnMgYQorICogY2hhcmFjdGVyIHBvaW50ZXIuIFRoZSBrZXJuZWwgc3lzdGVtIGNhbGwganVzdAorICogcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgZmlsbGVkICh3aGljaAorICogaW5jbHVkZXMgdGhlIGVuZGluZyAnXDAnIGNoYXJhY3RlciksIG9yIGEgbmVnYXRpdmUKKyAqIGVycm9yIHZhbHVlLiBTbyBsaWJjIHdvdWxkIGRvIHNvbWV0aGluZyBsaWtlCisgKgorICoJY2hhciAqZ2V0Y3dkKGNoYXIgKiBidWYsIHNpemVfdCBzaXplKQorICoJeworICoJCWludCByZXR2YWw7CisgKgorICoJCXJldHZhbCA9IHN5c19nZXRjd2QoYnVmLCBzaXplKTsKKyAqCQlpZiAocmV0dmFsID49IDApCisgKgkJCXJldHVybiBidWY7CisgKgkJZXJybm8gPSAtcmV0dmFsOworICoJCXJldHVybiBOVUxMOworICoJfQorICovCithc21saW5rYWdlIGxvbmcgc3lzX2dldGN3ZChjaGFyIF9fdXNlciAqYnVmLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaW50IGVycm9yOworCXN0cnVjdCB2ZnNtb3VudCAqcHdkbW50LCAqcm9vdG1udDsKKwlzdHJ1Y3QgZGVudHJ5ICpwd2QsICpyb290OworCWNoYXIgKnBhZ2UgPSAoY2hhciAqKSBfX2dldF9mcmVlX3BhZ2UoR0ZQX1VTRVIpOworCisJaWYgKCFwYWdlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlYWRfbG9jaygmY3VycmVudC0+ZnMtPmxvY2spOworCXB3ZG1udCA9IG1udGdldChjdXJyZW50LT5mcy0+cHdkbW50KTsKKwlwd2QgPSBkZ2V0KGN1cnJlbnQtPmZzLT5wd2QpOworCXJvb3RtbnQgPSBtbnRnZXQoY3VycmVudC0+ZnMtPnJvb3RtbnQpOworCXJvb3QgPSBkZ2V0KGN1cnJlbnQtPmZzLT5yb290KTsKKwlyZWFkX3VubG9jaygmY3VycmVudC0+ZnMtPmxvY2spOworCisJZXJyb3IgPSAtRU5PRU5UOworCS8qIEhhcyB0aGUgY3VycmVudCBkaXJlY3RvcnkgaGFzIGJlZW4gdW5saW5rZWQ/ICovCisJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJaWYgKHB3ZC0+ZF9wYXJlbnQgPT0gcHdkIHx8ICFkX3VuaGFzaGVkKHB3ZCkpIHsKKwkJdW5zaWduZWQgbG9uZyBsZW47CisJCWNoYXIgKiBjd2Q7CisKKwkJY3dkID0gX19kX3BhdGgocHdkLCBwd2RtbnQsIHJvb3QsIHJvb3RtbnQsIHBhZ2UsIFBBR0VfU0laRSk7CisJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisKKwkJZXJyb3IgPSBQVFJfRVJSKGN3ZCk7CisJCWlmIChJU19FUlIoY3dkKSkKKwkJCWdvdG8gb3V0OworCisJCWVycm9yID0gLUVSQU5HRTsKKwkJbGVuID0gUEFHRV9TSVpFICsgcGFnZSAtIGN3ZDsKKwkJaWYgKGxlbiA8PSBzaXplKSB7CisJCQllcnJvciA9IGxlbjsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBjd2QsIGxlbikpCisJCQkJZXJyb3IgPSAtRUZBVUxUOworCQl9CisJfSBlbHNlCisJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisKK291dDoKKwlkcHV0KHB3ZCk7CisJbW50cHV0KHB3ZG1udCk7CisJZHB1dChyb290KTsKKwltbnRwdXQocm9vdG1udCk7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBwYWdlKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBUZXN0IHdoZXRoZXIgbmV3X2RlbnRyeSBpcyBhIHN1YmRpcmVjdG9yeSBvZiBvbGRfZGVudHJ5LgorICoKKyAqIFRyaXZpYWxseSBpbXBsZW1lbnRlZCB1c2luZyB0aGUgZGNhY2hlIHN0cnVjdHVyZQorICovCisKKy8qKgorICogaXNfc3ViZGlyIC0gaXMgbmV3IGRlbnRyeSBhIHN1YmRpcmVjdG9yeSBvZiBvbGRfZGVudHJ5CisgKiBAbmV3X2RlbnRyeTogbmV3IGRlbnRyeQorICogQG9sZF9kZW50cnk6IG9sZCBkZW50cnkKKyAqCisgKiBSZXR1cm5zIDEgaWYgbmV3X2RlbnRyeSBpcyBhIHN1YmRpcmVjdG9yeSBvZiB0aGUgcGFyZW50IChhdCBhbnkgZGVwdGgpLgorICogUmV0dXJucyAwIG90aGVyd2lzZS4KKyAqIENhbGxlciBtdXN0IGVuc3VyZSB0aGF0ICJuZXdfZGVudHJ5IiBpcyBwaW5uZWQgYmVmb3JlIGNhbGxpbmcgaXNfc3ViZGlyKCkKKyAqLworICAKK2ludCBpc19zdWJkaXIoc3RydWN0IGRlbnRyeSAqIG5ld19kZW50cnksIHN0cnVjdCBkZW50cnkgKiBvbGRfZGVudHJ5KQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGRlbnRyeSAqIHNhdmVkID0gbmV3X2RlbnRyeTsKKwl1bnNpZ25lZCBsb25nIHNlcTsKKworCS8qIG5lZWQgcmN1X3JlYWRsb2NrIHRvIHByb3RlY3QgYWdhaW5zdCB0aGUgZF9wYXJlbnQgdHJhc2hpbmcgZHVlIHRvCisJICogZF9tb3ZlCisJICovCisJcmN1X3JlYWRfbG9jaygpOworICAgICAgICBkbyB7CisJCS8qIGZvciByZXN0YXJ0aW5nIGlubmVyIGxvb3AgaW4gY2FzZSBvZiBzZXEgcmV0cnkgKi8KKwkJbmV3X2RlbnRyeSA9IHNhdmVkOworCQlyZXN1bHQgPSAwOworCQlzZXEgPSByZWFkX3NlcWJlZ2luKCZyZW5hbWVfbG9jayk7CisJCWZvciAoOzspIHsKKwkJCWlmIChuZXdfZGVudHJ5ICE9IG9sZF9kZW50cnkpIHsKKwkJCQlzdHJ1Y3QgZGVudHJ5ICogcGFyZW50ID0gbmV3X2RlbnRyeS0+ZF9wYXJlbnQ7CisJCQkJaWYgKHBhcmVudCA9PSBuZXdfZGVudHJ5KQorCQkJCQlicmVhazsKKwkJCQluZXdfZGVudHJ5ID0gcGFyZW50OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcmVzdWx0ID0gMTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAocmVhZF9zZXFyZXRyeSgmcmVuYW1lX2xvY2ssIHNlcSkpOworCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBkX2dlbm9jaWRlKHN0cnVjdCBkZW50cnkgKnJvb3QpCit7CisJc3RydWN0IGRlbnRyeSAqdGhpc19wYXJlbnQgPSByb290OworCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQ7CisKKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKK3JlcGVhdDoKKwluZXh0ID0gdGhpc19wYXJlbnQtPmRfc3ViZGlycy5uZXh0OworcmVzdW1lOgorCXdoaWxlIChuZXh0ICE9ICZ0aGlzX3BhcmVudC0+ZF9zdWJkaXJzKSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgKnRtcCA9IG5leHQ7CisJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgZGVudHJ5LCBkX2NoaWxkKTsKKwkJbmV4dCA9IHRtcC0+bmV4dDsKKwkJaWYgKGRfdW5oYXNoZWQoZGVudHJ5KXx8IWRlbnRyeS0+ZF9pbm9kZSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIWxpc3RfZW1wdHkoJmRlbnRyeS0+ZF9zdWJkaXJzKSkgeworCQkJdGhpc19wYXJlbnQgPSBkZW50cnk7CisJCQlnb3RvIHJlcGVhdDsKKwkJfQorCQlhdG9taWNfZGVjKCZkZW50cnktPmRfY291bnQpOworCX0KKwlpZiAodGhpc19wYXJlbnQgIT0gcm9vdCkgeworCQluZXh0ID0gdGhpc19wYXJlbnQtPmRfY2hpbGQubmV4dDsgCisJCWF0b21pY19kZWMoJnRoaXNfcGFyZW50LT5kX2NvdW50KTsKKwkJdGhpc19wYXJlbnQgPSB0aGlzX3BhcmVudC0+ZF9wYXJlbnQ7CisJCWdvdG8gcmVzdW1lOworCX0KKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworfQorCisvKioKKyAqIGZpbmRfaW5vZGVfbnVtYmVyIC0gY2hlY2sgZm9yIGRlbnRyeSB3aXRoIG5hbWUKKyAqIEBkaXI6IGRpcmVjdG9yeSB0byBjaGVjaworICogQG5hbWU6IE5hbWUgdG8gZmluZC4KKyAqCisgKiBDaGVjayB3aGV0aGVyIGEgZGVudHJ5IGFscmVhZHkgZXhpc3RzIGZvciB0aGUgZ2l2ZW4gbmFtZSwKKyAqIGFuZCByZXR1cm4gdGhlIGlub2RlIG51bWJlciBpZiBpdCBoYXMgYW4gaW5vZGUuIE90aGVyd2lzZQorICogMCBpcyByZXR1cm5lZC4KKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgdXNlZCB0byBwb3N0LXByb2Nlc3MgZGlyZWN0b3J5IGxpc3RpbmdzIGZvcgorICogZmlsZXN5c3RlbXMgdXNpbmcgc3ludGhldGljIGlub2RlIG51bWJlcnMsIGFuZCBpcyBuZWNlc3NhcnkKKyAqIHRvIGtlZXAgZ2V0Y3dkKCkgd29ya2luZy4KKyAqLworIAoraW5vX3QgZmluZF9pbm9kZV9udW1iZXIoc3RydWN0IGRlbnRyeSAqZGlyLCBzdHJ1Y3QgcXN0ciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5OworCWlub190IGlubyA9IDA7CisKKwkvKgorCSAqIENoZWNrIGZvciBhIGZzLXNwZWNpZmljIGhhc2ggZnVuY3Rpb24uIE5vdGUgdGhhdCB3ZSBtdXN0CisJICogY2FsY3VsYXRlIHRoZSBzdGFuZGFyZCBoYXNoIGZpcnN0LCBhcyB0aGUgZF9vcC0+ZF9oYXNoKCkKKwkgKiByb3V0aW5lIG1heSBjaG9vc2UgdG8gbGVhdmUgdGhlIGhhc2ggdmFsdWUgdW5jaGFuZ2VkLgorCSAqLworCW5hbWUtPmhhc2ggPSBmdWxsX25hbWVfaGFzaChuYW1lLT5uYW1lLCBuYW1lLT5sZW4pOworCWlmIChkaXItPmRfb3AgJiYgZGlyLT5kX29wLT5kX2hhc2gpCisJeworCQlpZiAoZGlyLT5kX29wLT5kX2hhc2goZGlyLCBuYW1lKSAhPSAwKQorCQkJZ290byBvdXQ7CisJfQorCisJZGVudHJ5ID0gZF9sb29rdXAoZGlyLCBuYW1lKTsKKwlpZiAoZGVudHJ5KQorCXsKKwkJaWYgKGRlbnRyeS0+ZF9pbm9kZSkKKwkJCWlubyA9IGRlbnRyeS0+ZF9pbm9kZS0+aV9pbm87CisJCWRwdXQoZGVudHJ5KTsKKwl9CitvdXQ6CisJcmV0dXJuIGlubzsKK30KKworc3RhdGljIF9faW5pdGRhdGEgdW5zaWduZWQgbG9uZyBkaGFzaF9lbnRyaWVzOworc3RhdGljIGludCBfX2luaXQgc2V0X2RoYXNoX2VudHJpZXMoY2hhciAqc3RyKQoreworCWlmICghc3RyKQorCQlyZXR1cm4gMDsKKwlkaGFzaF9lbnRyaWVzID0gc2ltcGxlX3N0cnRvdWwoc3RyLCAmc3RyLCAwKTsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoImRoYXNoX2VudHJpZXM9Iiwgc2V0X2RoYXNoX2VudHJpZXMpOworCitzdGF0aWMgdm9pZCBfX2luaXQgZGNhY2hlX2luaXRfZWFybHkodm9pZCkKK3sKKwlpbnQgbG9vcDsKKworCS8qIElmIGhhc2hlcyBhcmUgZGlzdHJpYnV0ZWQgYWNyb3NzIE5VTUEgbm9kZXMsIGRlZmVyCisJICogaGFzaCBhbGxvY2F0aW9uIHVudGlsIHZtYWxsb2Mgc3BhY2UgaXMgYXZhaWxhYmxlLgorCSAqLworCWlmIChoYXNoZGlzdCkKKwkJcmV0dXJuOworCisJZGVudHJ5X2hhc2h0YWJsZSA9CisJCWFsbG9jX2xhcmdlX3N5c3RlbV9oYXNoKCJEZW50cnkgY2FjaGUiLAorCQkJCQlzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQpLAorCQkJCQlkaGFzaF9lbnRyaWVzLAorCQkJCQkxMywKKwkJCQkJSEFTSF9FQVJMWSwKKwkJCQkJJmRfaGFzaF9zaGlmdCwKKwkJCQkJJmRfaGFzaF9tYXNrLAorCQkJCQkwKTsKKworCWZvciAobG9vcCA9IDA7IGxvb3AgPCAoMSA8PCBkX2hhc2hfc2hpZnQpOyBsb29wKyspCisJCUlOSVRfSExJU1RfSEVBRCgmZGVudHJ5X2hhc2h0YWJsZVtsb29wXSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBkY2FjaGVfaW5pdCh1bnNpZ25lZCBsb25nIG1lbXBhZ2VzKQoreworCWludCBsb29wOworCisJLyogCisJICogQSBjb25zdHJ1Y3RvciBjb3VsZCBiZSBhZGRlZCBmb3Igc3RhYmxlIHN0YXRlIGxpa2UgdGhlIGxpc3RzLAorCSAqIGJ1dCBpdCBpcyBwcm9iYWJseSBub3Qgd29ydGggaXQgYmVjYXVzZSBvZiB0aGUgY2FjaGUgbmF0dXJlCisJICogb2YgdGhlIGRjYWNoZS4gCisJICovCisJZGVudHJ5X2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImRlbnRyeV9jYWNoZSIsCisJCQkJCSBzaXplb2Yoc3RydWN0IGRlbnRyeSksCisJCQkJCSAwLAorCQkJCQkgU0xBQl9SRUNMQUlNX0FDQ09VTlR8U0xBQl9QQU5JQywKKwkJCQkJIE5VTEwsIE5VTEwpOworCQorCXNldF9zaHJpbmtlcihERUZBVUxUX1NFRUtTLCBzaHJpbmtfZGNhY2hlX21lbW9yeSk7CisKKwkvKiBIYXNoIG1heSBoYXZlIGJlZW4gc2V0IHVwIGluIGRjYWNoZV9pbml0X2Vhcmx5ICovCisJaWYgKCFoYXNoZGlzdCkKKwkJcmV0dXJuOworCisJZGVudHJ5X2hhc2h0YWJsZSA9CisJCWFsbG9jX2xhcmdlX3N5c3RlbV9oYXNoKCJEZW50cnkgY2FjaGUiLAorCQkJCQlzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQpLAorCQkJCQlkaGFzaF9lbnRyaWVzLAorCQkJCQkxMywKKwkJCQkJMCwKKwkJCQkJJmRfaGFzaF9zaGlmdCwKKwkJCQkJJmRfaGFzaF9tYXNrLAorCQkJCQkwKTsKKworCWZvciAobG9vcCA9IDA7IGxvb3AgPCAoMSA8PCBkX2hhc2hfc2hpZnQpOyBsb29wKyspCisJCUlOSVRfSExJU1RfSEVBRCgmZGVudHJ5X2hhc2h0YWJsZVtsb29wXSk7Cit9CisKKy8qIFNMQUIgY2FjaGUgZm9yIF9fZ2V0bmFtZSgpIGNvbnN1bWVycyAqLwora21lbV9jYWNoZV90ICpuYW1lc19jYWNoZXA7CisKKy8qIFNMQUIgY2FjaGUgZm9yIGZpbGUgc3RydWN0dXJlcyAqLwora21lbV9jYWNoZV90ICpmaWxwX2NhY2hlcDsKKworRVhQT1JUX1NZTUJPTChkX2dlbm9jaWRlKTsKKworZXh0ZXJuIHZvaWQgYmRldl9jYWNoZV9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgY2hyZGV2X2luaXQodm9pZCk7CisKK3ZvaWQgX19pbml0IHZmc19jYWNoZXNfaW5pdF9lYXJseSh2b2lkKQoreworCWRjYWNoZV9pbml0X2Vhcmx5KCk7CisJaW5vZGVfaW5pdF9lYXJseSgpOworfQorCit2b2lkIF9faW5pdCB2ZnNfY2FjaGVzX2luaXQodW5zaWduZWQgbG9uZyBtZW1wYWdlcykKK3sKKwl1bnNpZ25lZCBsb25nIHJlc2VydmU7CisKKwkvKiBCYXNlIGhhc2ggc2l6ZXMgb24gYXZhaWxhYmxlIG1lbW9yeSwgd2l0aCBhIHJlc2VydmUgZXF1YWwgdG8KKyAgICAgICAgICAgMTUwJSBvZiBjdXJyZW50IGtlcm5lbCBzaXplICovCisKKwlyZXNlcnZlID0gbWluKChtZW1wYWdlcyAtIG5yX2ZyZWVfcGFnZXMoKSkgKiAzLzIsIG1lbXBhZ2VzIC0gMSk7CisJbWVtcGFnZXMgLT0gcmVzZXJ2ZTsKKworCW5hbWVzX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJuYW1lc19jYWNoZSIsIFBBVEhfTUFYLCAwLAorCQkJU0xBQl9IV0NBQ0hFX0FMSUdOfFNMQUJfUEFOSUMsIE5VTEwsIE5VTEwpOworCisJZmlscF9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiZmlscCIsIHNpemVvZihzdHJ1Y3QgZmlsZSksIDAsCisJCQlTTEFCX0hXQ0FDSEVfQUxJR058U0xBQl9QQU5JQywgZmlscF9jdG9yLCBmaWxwX2R0b3IpOworCisJZGNhY2hlX2luaXQobWVtcGFnZXMpOworCWlub2RlX2luaXQobWVtcGFnZXMpOworCWZpbGVzX2luaXQobWVtcGFnZXMpOworCW1udF9pbml0KG1lbXBhZ2VzKTsKKwliZGV2X2NhY2hlX2luaXQoKTsKKwljaHJkZXZfaW5pdCgpOworfQorCitFWFBPUlRfU1lNQk9MKGRfYWxsb2MpOworRVhQT1JUX1NZTUJPTChkX2FsbG9jX2Fub24pOworRVhQT1JUX1NZTUJPTChkX2FsbG9jX3Jvb3QpOworRVhQT1JUX1NZTUJPTChkX2RlbGV0ZSk7CitFWFBPUlRfU1lNQk9MKGRfZmluZF9hbGlhcyk7CitFWFBPUlRfU1lNQk9MKGRfaW5zdGFudGlhdGUpOworRVhQT1JUX1NZTUJPTChkX2ludmFsaWRhdGUpOworRVhQT1JUX1NZTUJPTChkX2xvb2t1cCk7CitFWFBPUlRfU1lNQk9MKGRfbW92ZSk7CitFWFBPUlRfU1lNQk9MKGRfcGF0aCk7CitFWFBPUlRfU1lNQk9MKGRfcHJ1bmVfYWxpYXNlcyk7CitFWFBPUlRfU1lNQk9MKGRfcmVoYXNoKTsKK0VYUE9SVF9TWU1CT0woZF9zcGxpY2VfYWxpYXMpOworRVhQT1JUX1NZTUJPTChkX3ZhbGlkYXRlKTsKK0VYUE9SVF9TWU1CT0woZGdldF9sb2NrZWQpOworRVhQT1JUX1NZTUJPTChkcHV0KTsKK0VYUE9SVF9TWU1CT0woZmluZF9pbm9kZV9udW1iZXIpOworRVhQT1JUX1NZTUJPTChoYXZlX3N1Ym1vdW50cyk7CitFWFBPUlRfU1lNQk9MKG5hbWVzX2NhY2hlcCk7CitFWFBPUlRfU1lNQk9MKHNocmlua19kY2FjaGVfcGFyZW50KTsKK0VYUE9SVF9TWU1CT0woc2hyaW5rX2RjYWNoZV9zYik7CmRpZmYgLS1naXQgYS9mcy9kY29va2llcy5jIGIvZnMvZGNvb2tpZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODFhYWM5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZGNvb2tpZXMuYwpAQCAtMCwwICsxLDMzMCBAQAorLyoKKyAqIGRjb29raWVzLmMKKyAqCisgKiBDb3B5cmlnaHQgMjAwMiBKb2huIExldm9uIDxsZXZvbkBtb3ZlbWVudGFyaWFuLm9yZz4KKyAqCisgKiBQZXJzaXN0ZW50IGNvb2tpZS1wYXRoIG1hcHBpbmdzLiBUaGVzZSBhcmUgdXNlZCBieQorICogcHJvZmlsZXJzIHRvIGNvbnZlcnQgYSBwZXItdGFzayBFSVAgdmFsdWUgaW50byBzb21ldGhpbmcKKyAqIG5vbi10cmFuc2l0b3J5IHRoYXQgY2FuIGJlIHByb2Nlc3NlZCBhdCBhIGxhdGVyIGRhdGUuCisgKiBUaGlzIGlzIGRvbmUgYnkgbG9ja2luZyB0aGUgZGVudHJ5L3Zmc21udCBwYWlyIGluIHRoZQorICoga2VybmVsIHVudGlsIHJlbGVhc2VkIGJ5IHRoZSB0YXNrcyBuZWVkaW5nIHRoZSBwZXJzaXN0ZW50CisgKiBvYmplY3RzLiBUaGUgdGFnIGlzIHNpbXBseSBhbiB1bnNpZ25lZCBsb25nIHRoYXQgcmVmZXJzCisgKiB0byB0aGUgcGFpciBhbmQgY2FuIGJlIGxvb2tlZCB1cCBmcm9tIHVzZXJzcGFjZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2Rjb29raWVzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworLyogVGhlIGRjb29raWVzIGFyZSBhbGxvY2F0ZWQgZnJvbSBhIGttZW1fY2FjaGUgYW5kCisgKiBoYXNoZWQgb250byBhIHNtYWxsIG51bWJlciBvZiBsaXN0cy4gTm9uZSBvZiB0aGUKKyAqIGNvZGUgaGVyZSBpcyBwYXJ0aWN1bGFybHkgcGVyZm9ybWFuY2UgY3JpdGljYWwKKyAqLworc3RydWN0IGRjb29raWVfc3RydWN0IHsKKwlzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5OworCXN0cnVjdCB2ZnNtb3VudCAqIHZmc21udDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGhhc2hfbGlzdDsKK307CisKK3N0YXRpYyBMSVNUX0hFQUQoZGNvb2tpZV91c2Vycyk7CitzdGF0aWMgREVDTEFSRV9NVVRFWChkY29va2llX3NlbSk7CitzdGF0aWMga21lbV9jYWNoZV90ICogZGNvb2tpZV9jYWNoZTsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkICogZGNvb2tpZV9oYXNodGFibGU7CitzdGF0aWMgc2l6ZV90IGhhc2hfc2l6ZTsKKworc3RhdGljIGlubGluZSBpbnQgaXNfbGl2ZSh2b2lkKQoreworCXJldHVybiAhKGxpc3RfZW1wdHkoJmRjb29raWVfdXNlcnMpKTsKK30KKworCisvKiBUaGUgZGVudHJ5IGlzIGxvY2tlZCwgaXRzIGFkZHJlc3Mgd2lsbCBkbyBmb3IgdGhlIGNvb2tpZSAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGRjb29raWVfdmFsdWUoc3RydWN0IGRjb29raWVfc3RydWN0ICogZGNzKQoreworCXJldHVybiAodW5zaWduZWQgbG9uZylkY3MtPmRlbnRyeTsKK30KKworCitzdGF0aWMgc2l6ZV90IGRjb29raWVfaGFzaCh1bnNpZ25lZCBsb25nIGRjb29raWUpCit7CisJcmV0dXJuIChkY29va2llID4+IEwxX0NBQ0hFX1NISUZUKSAmIChoYXNoX3NpemUgLSAxKTsKK30KKworCitzdGF0aWMgc3RydWN0IGRjb29raWVfc3RydWN0ICogZmluZF9kY29va2llKHVuc2lnbmVkIGxvbmcgZGNvb2tpZSkKK3sKKwlzdHJ1Y3QgZGNvb2tpZV9zdHJ1Y3QgKmZvdW5kID0gTlVMTDsKKwlzdHJ1Y3QgZGNvb2tpZV9zdHJ1Y3QgKiBkY3M7CisJc3RydWN0IGxpc3RfaGVhZCAqIHBvczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICogbGlzdDsKKworCWxpc3QgPSBkY29va2llX2hhc2h0YWJsZSArIGRjb29raWVfaGFzaChkY29va2llKTsKKworCWxpc3RfZm9yX2VhY2gocG9zLCBsaXN0KSB7CisJCWRjcyA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgZGNvb2tpZV9zdHJ1Y3QsIGhhc2hfbGlzdCk7CisJCWlmIChkY29va2llX3ZhbHVlKGRjcykgPT0gZGNvb2tpZSkgeworCQkJZm91bmQgPSBkY3M7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBmb3VuZDsKK30KKworCitzdGF0aWMgdm9pZCBoYXNoX2Rjb29raWUoc3RydWN0IGRjb29raWVfc3RydWN0ICogZGNzKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKiBsaXN0ID0gZGNvb2tpZV9oYXNodGFibGUgKyBkY29va2llX2hhc2goZGNvb2tpZV92YWx1ZShkY3MpKTsKKwlsaXN0X2FkZCgmZGNzLT5oYXNoX2xpc3QsIGxpc3QpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZGNvb2tpZV9zdHJ1Y3QgKiBhbGxvY19kY29va2llKHN0cnVjdCBkZW50cnkgKiBkZW50cnksCisJc3RydWN0IHZmc21vdW50ICogdmZzbW50KQoreworCXN0cnVjdCBkY29va2llX3N0cnVjdCAqIGRjcyA9IGttZW1fY2FjaGVfYWxsb2MoZGNvb2tpZV9jYWNoZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkY3MpCisJCXJldHVybiBOVUxMOworCisJYXRvbWljX2luYygmZGVudHJ5LT5kX2NvdW50KTsKKwlhdG9taWNfaW5jKCZ2ZnNtbnQtPm1udF9jb3VudCk7CisJZGVudHJ5LT5kX2Nvb2tpZSA9IGRjczsKKworCWRjcy0+ZGVudHJ5ID0gZGVudHJ5OworCWRjcy0+dmZzbW50ID0gdmZzbW50OworCWhhc2hfZGNvb2tpZShkY3MpOworCisJcmV0dXJuIGRjczsKK30KKworCisvKiBUaGlzIGlzIHRoZSBtYWluIGtlcm5lbC1zaWRlIHJvdXRpbmUgdGhhdCByZXRyaWV2ZXMgdGhlIGNvb2tpZQorICogdmFsdWUgZm9yIGEgZGVudHJ5L3Zmc21udCBwYWlyLgorICovCitpbnQgZ2V0X2Rjb29raWUoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgc3RydWN0IHZmc21vdW50ICogdmZzbW50LAorCXVuc2lnbmVkIGxvbmcgKiBjb29raWUpCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IGRjb29raWVfc3RydWN0ICogZGNzOworCisJZG93bigmZGNvb2tpZV9zZW0pOworCisJaWYgKCFpc19saXZlKCkpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJZGNzID0gZGVudHJ5LT5kX2Nvb2tpZTsKKworCWlmICghZGNzKQorCQlkY3MgPSBhbGxvY19kY29va2llKGRlbnRyeSwgdmZzbW50KTsKKworCWlmICghZGNzKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCSpjb29raWUgPSBkY29va2llX3ZhbHVlKGRjcyk7CisKK291dDoKKwl1cCgmZGNvb2tpZV9zZW0pOworCXJldHVybiBlcnI7Cit9CisKKworLyogQW5kIGhlcmUgaXMgd2hlcmUgdGhlIHVzZXJzcGFjZSBwcm9jZXNzIGNhbiBsb29rIHVwIHRoZSBjb29raWUgdmFsdWUKKyAqIHRvIHJldHJpZXZlIHRoZSBwYXRoLgorICovCithc21saW5rYWdlIGxvbmcgc3lzX2xvb2t1cF9kY29va2llKHU2NCBjb29raWU2NCwgY2hhciBfX3VzZXIgKiBidWYsIHNpemVfdCBsZW4pCit7CisJdW5zaWduZWQgbG9uZyBjb29raWUgPSAodW5zaWduZWQgbG9uZyljb29raWU2NDsKKwlpbnQgZXJyID0gLUVJTlZBTDsKKwljaGFyICoga2J1ZjsKKwljaGFyICogcGF0aDsKKwlzaXplX3QgcGF0aGxlbjsKKwlzdHJ1Y3QgZGNvb2tpZV9zdHJ1Y3QgKiBkY3M7CisKKwkvKiB3ZSBjb3VsZCBsZWFrIHBhdGggaW5mb3JtYXRpb24gdG8gdXNlcnMKKwkgKiB3aXRob3V0IGRpciByZWFkIHBlcm1pc3Npb24gd2l0aG91dCB0aGlzCisJICovCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJZG93bigmZGNvb2tpZV9zZW0pOworCisJaWYgKCFpc19saXZlKCkpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCEoZGNzID0gZmluZF9kY29va2llKGNvb2tpZSkpKQorCQlnb3RvIG91dDsKKworCWVyciA9IC1FTk9NRU07CisJa2J1ZiA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWtidWYpCisJCWdvdG8gb3V0OworCisJLyogRklYTUU6IChkZWxldGVkKSA/ICovCisJcGF0aCA9IGRfcGF0aChkY3MtPmRlbnRyeSwgZGNzLT52ZnNtbnQsIGtidWYsIFBBR0VfU0laRSk7CisKKwlpZiAoSVNfRVJSKHBhdGgpKSB7CisJCWVyciA9IFBUUl9FUlIocGF0aCk7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJZXJyID0gLUVSQU5HRTsKKyAKKwlwYXRobGVuID0ga2J1ZiArIFBBR0VfU0laRSAtIHBhdGg7CisJaWYgKHBhdGhsZW4gPD0gbGVuKSB7CisJCWVyciA9IHBhdGhsZW47CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBwYXRoLCBwYXRobGVuKSkKKwkJCWVyciA9IC1FRkFVTFQ7CisJfQorCitvdXRfZnJlZToKKwlrZnJlZShrYnVmKTsKK291dDoKKwl1cCgmZGNvb2tpZV9zZW0pOworCXJldHVybiBlcnI7Cit9CisKKworc3RhdGljIGludCBkY29va2llX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICogZDsKKwl1bnNpZ25lZCBpbnQgaSwgaGFzaF9iaXRzOworCWludCBlcnIgPSAtRU5PTUVNOworCisJZGNvb2tpZV9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJkY29va2llX2NhY2hlIiwKKwkJc2l6ZW9mKHN0cnVjdCBkY29va2llX3N0cnVjdCksCisJCTAsIDAsIE5VTEwsIE5VTEwpOworCisJaWYgKCFkY29va2llX2NhY2hlKQorCQlnb3RvIG91dDsKKworCWRjb29raWVfaGFzaHRhYmxlID0ga21hbGxvYyhQQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghZGNvb2tpZV9oYXNodGFibGUpCisJCWdvdG8gb3V0X2ttZW07CisKKwllcnIgPSAwOworCisJLyoKKwkgKiBGaW5kIHRoZSBwb3dlci1vZi10d28gbGlzdC1oZWFkcyB0aGF0IGNhbiBmaXQgaW50byB0aGUgYWxsb2NhdGlvbi4uCisJICogV2UgZG9uJ3QgZ3VhcmFudGVlIHRoYXQgInNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKSIgaXMgbmVjZXNzYXJpbHkKKwkgKiBhIHBvd2VyLW9mLXR3by4KKwkgKi8KKwloYXNoX3NpemUgPSBQQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCk7CisJaGFzaF9iaXRzID0gMDsKKwlkbyB7CisJCWhhc2hfYml0cysrOworCX0gd2hpbGUgKChoYXNoX3NpemUgPj4gaGFzaF9iaXRzKSAhPSAwKTsKKwloYXNoX2JpdHMtLTsKKworCS8qCisJICogUmUtY2FsY3VsYXRlIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGVudHJpZXMgYW5kIHRoZSBtYXNrCisJICogZnJvbSB0aGUgbnVtYmVyIG9mIGJpdHMgd2UgY2FuIGZpdC4KKwkgKi8KKwloYXNoX3NpemUgPSAxVUwgPDwgaGFzaF9iaXRzOworCisJLyogQW5kIGluaXRpYWxpemUgdGhlIG5ld2x5IGFsbG9jYXRlZCBhcnJheSAqLworCWQgPSBkY29va2llX2hhc2h0YWJsZTsKKwlpID0gaGFzaF9zaXplOworCWRvIHsKKwkJSU5JVF9MSVNUX0hFQUQoZCk7CisJCWQrKzsKKwkJaS0tOworCX0gd2hpbGUgKGkpOworCitvdXQ6CisJcmV0dXJuIGVycjsKK291dF9rbWVtOgorCWttZW1fY2FjaGVfZGVzdHJveShkY29va2llX2NhY2hlKTsKKwlnb3RvIG91dDsKK30KKworCitzdGF0aWMgdm9pZCBmcmVlX2Rjb29raWUoc3RydWN0IGRjb29raWVfc3RydWN0ICogZGNzKQoreworCWRjcy0+ZGVudHJ5LT5kX2Nvb2tpZSA9IE5VTEw7CisJZHB1dChkY3MtPmRlbnRyeSk7CisJbW50cHV0KGRjcy0+dmZzbW50KTsKKwlrbWVtX2NhY2hlX2ZyZWUoZGNvb2tpZV9jYWNoZSwgZGNzKTsKK30KKworCitzdGF0aWMgdm9pZCBkY29va2llX2V4aXQodm9pZCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICogbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICogcG9zOworCXN0cnVjdCBsaXN0X2hlYWQgKiBwb3MyOworCXN0cnVjdCBkY29va2llX3N0cnVjdCAqIGRjczsKKwlzaXplX3QgaTsKKworCWZvciAoaSA9IDA7IGkgPCBoYXNoX3NpemU7ICsraSkgeworCQlsaXN0ID0gZGNvb2tpZV9oYXNodGFibGUgKyBpOworCQlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBwb3MyLCBsaXN0KSB7CisJCQlkY3MgPSBsaXN0X2VudHJ5KHBvcywgc3RydWN0IGRjb29raWVfc3RydWN0LCBoYXNoX2xpc3QpOworCQkJbGlzdF9kZWwoJmRjcy0+aGFzaF9saXN0KTsKKwkJCWZyZWVfZGNvb2tpZShkY3MpOworCQl9CisJfQorCisJa2ZyZWUoZGNvb2tpZV9oYXNodGFibGUpOworCWttZW1fY2FjaGVfZGVzdHJveShkY29va2llX2NhY2hlKTsKK30KKworCitzdHJ1Y3QgZGNvb2tpZV91c2VyIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5leHQ7Cit9OworIAorc3RydWN0IGRjb29raWVfdXNlciAqIGRjb29raWVfcmVnaXN0ZXIodm9pZCkKK3sKKwlzdHJ1Y3QgZGNvb2tpZV91c2VyICogdXNlcjsKKworCWRvd24oJmRjb29raWVfc2VtKTsKKworCXVzZXIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGNvb2tpZV91c2VyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF1c2VyKQorCQlnb3RvIG91dDsKKworCWlmICghaXNfbGl2ZSgpICYmIGRjb29raWVfaW5pdCgpKQorCQlnb3RvIG91dF9mcmVlOworCisJbGlzdF9hZGQoJnVzZXItPm5leHQsICZkY29va2llX3VzZXJzKTsKKworb3V0OgorCXVwKCZkY29va2llX3NlbSk7CisJcmV0dXJuIHVzZXI7CitvdXRfZnJlZToKKwlrZnJlZSh1c2VyKTsKKwl1c2VyID0gTlVMTDsKKwlnb3RvIG91dDsKK30KKworCit2b2lkIGRjb29raWVfdW5yZWdpc3RlcihzdHJ1Y3QgZGNvb2tpZV91c2VyICogdXNlcikKK3sKKwlkb3duKCZkY29va2llX3NlbSk7CisKKwlsaXN0X2RlbCgmdXNlci0+bmV4dCk7CisJa2ZyZWUodXNlcik7CisKKwlpZiAoIWlzX2xpdmUoKSkKKwkJZGNvb2tpZV9leGl0KCk7CisKKwl1cCgmZGNvb2tpZV9zZW0pOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChkY29va2llX3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGRjb29raWVfdW5yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MX0dQTChnZXRfZGNvb2tpZSk7CmRpZmYgLS1naXQgYS9mcy9kZWJ1Z2ZzL01ha2VmaWxlIGIvZnMvZGVidWdmcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDBjNDU2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZGVidWdmcy9NYWtlZmlsZQpAQCAtMCwwICsxLDQgQEAKK2RlYnVnZnMtb2Jqcwk6PSBpbm9kZS5vIGZpbGUubworCitvYmotJChDT05GSUdfREVCVUdfRlMpCSs9IGRlYnVnZnMubworCmRpZmYgLS1naXQgYS9mcy9kZWJ1Z2ZzL2ZpbGUuYyBiL2ZzL2RlYnVnZnMvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ODU1NmYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9kZWJ1Z2ZzL2ZpbGUuYwpAQCAtMCwwICsxLDI2MiBAQAorLyoKKyAqICBmaWxlLmMgLSBwYXJ0IG9mIGRlYnVnZnMsIGEgdGlueSBsaXR0bGUgZGVidWcgZmlsZSBzeXN0ZW0KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA0IElCTSBJbmMuCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICoJMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgZGVidWdmcyBpcyBmb3IgcGVvcGxlIHRvIHVzZSBpbnN0ZWFkIG9mIC9wcm9jIG9yIC9zeXMuCisgKiAgU2VlIERvY3VtZW50YXRpb24vRG9jQm9vay9rZXJuZWwtYXBpIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisKK3N0YXRpYyBzc2l6ZV90IGRlZmF1bHRfcmVhZF9maWxlKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgZGVmYXVsdF93cml0ZV9maWxlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBkZWZhdWx0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKGlub2RlLT51LmdlbmVyaWNfaXApCisJCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT51LmdlbmVyaWNfaXA7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWJ1Z2ZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkucmVhZCA9CQlkZWZhdWx0X3JlYWRfZmlsZSwKKwkud3JpdGUgPQlkZWZhdWx0X3dyaXRlX2ZpbGUsCisJLm9wZW4gPQkJZGVmYXVsdF9vcGVuLAorfTsKKworI2RlZmluZSBzaW1wbGVfdHlwZSh0eXBlLCBmb3JtYXQsIHRlbXB0eXBlLCBzdHJ0b2xmbikJCQkJXAorc3RhdGljIHNzaXplX3QgcmVhZF9maWxlXyMjdHlwZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAlcCisJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCQkJXAorewkJCQkJCQkJCQlcCisJY2hhciBidWZbMzJdOwkJCQkJCQkJXAorCXR5cGUgKnZhbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsJCQkJCQlcCisJCQkJCQkJCQkJXAorCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZvcm1hdCAiXG4iLCAqdmFsKTsJCQkJXAorCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1Ziwgc3RybGVuKGJ1ZikpO1wKK30JCQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3Qgd3JpdGVfZmlsZV8jI3R5cGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZixcCisJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQkJCVwKK3sJCQkJCQkJCQkJXAorCWNoYXIgKmVuZHA7CQkJCQkJCQlcCisJY2hhciBidWZbMzJdOwkJCQkJCQkJXAorCWludCBidWZfc2l6ZTsJCQkJCQkJCVwKKwl0eXBlICp2YWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CQkJCQkJXAorCXRlbXB0eXBlIHRtcDsJCQkJCQkJCVwKKwkJCQkJCQkJCQlcCisJbWVtc2V0KGJ1ZiwgMHgwMCwgc2l6ZW9mKGJ1ZikpOwkJCQkJCVwKKwlidWZfc2l6ZSA9IG1pbihjb3VudCwgKHNpemVvZihidWYpLTEpKTsJCQkJCVwKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQkJCQlcCisJCXJldHVybiAtRUZBVUxUOwkJCQkJCQlcCisJCQkJCQkJCQkJXAorCXRtcCA9IHN0cnRvbGZuKGJ1ZiwgJmVuZHAsIDApOwkJCQkJCVwKKwlpZiAoKGVuZHAgPT0gYnVmKSB8fCAoKHR5cGUpdG1wICE9IHRtcCkpCQkJCVwKKwkJcmV0dXJuIC1FSU5WQUw7CQkJCQkJCVwKKwkqdmFsID0gdG1wOwkJCQkJCQkJXAorCXJldHVybiBjb3VudDsJCQkJCQkJCVwKK30JCQkJCQkJCQkJXAorc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9wc18jI3R5cGUgPSB7CQkJCQlcCisJLnJlYWQgPQkJcmVhZF9maWxlXyMjdHlwZSwJCQkJCVwKKwkud3JpdGUgPQl3cml0ZV9maWxlXyMjdHlwZSwJCQkJCVwKKwkub3BlbiA9CQlkZWZhdWx0X29wZW4sCQkJCQkJXAorfTsKK3NpbXBsZV90eXBlKHU4LCAiJWMiLCB1bnNpZ25lZCBsb25nLCBzaW1wbGVfc3RydG91bCk7CitzaW1wbGVfdHlwZSh1MTYsICIlaGkiLCB1bnNpZ25lZCBsb25nLCBzaW1wbGVfc3RydG91bCk7CitzaW1wbGVfdHlwZSh1MzIsICIlaSIsIHVuc2lnbmVkIGxvbmcsIHNpbXBsZV9zdHJ0b3VsKTsKKworLyoqCisgKiBkZWJ1Z2ZzX2NyZWF0ZV91OCAtIGNyZWF0ZSBhIGZpbGUgaW4gdGhlIGRlYnVnZnMgZmlsZXN5c3RlbSB0aGF0IGlzIHVzZWQgdG8gcmVhZCBhbmQgd3JpdGUgYSB1bnNpZ25lZCA4IGJpdCB2YWx1ZS4KKyAqCisgKiBAbmFtZTogYSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gY3JlYXRlLgorICogQG1vZGU6IHRoZSBwZXJtaXNzaW9uIHRoYXQgdGhlIGZpbGUgc2hvdWxkIGhhdmUKKyAqIEBwYXJlbnQ6IGEgcG9pbnRlciB0byB0aGUgcGFyZW50IGRlbnRyeSBmb3IgdGhpcyBmaWxlLiAgVGhpcyBzaG91bGQgYmUgYQorICogICAgICAgICAgZGlyZWN0b3J5IGRlbnRyeSBpZiBzZXQuICBJZiB0aGlzIHBhcmFtYXRlciBpcyBOVUxMLCB0aGVuIHRoZQorICogICAgICAgICAgZmlsZSB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHJvb3Qgb2YgdGhlIGRlYnVnZnMgZmlsZXN5c3RlbS4KKyAqIEB2YWx1ZTogYSBwb2ludGVyIHRvIHRoZSB2YXJpYWJsZSB0aGF0IHRoZSBmaWxlIHNob3VsZCByZWFkIHRvIGFuZCB3cml0ZQorICogICAgICAgICBmcm9tLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIGZpbGUgaW4gZGVidWdmcyB3aXRoIHRoZSBnaXZlbiBuYW1lIHRoYXQKKyAqIGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgQHZhbHVlLiAgSWYgdGhlIEBtb2RlIHZhcmlhYmxlIGlzIHNvCisgKiBzZXQsIGl0IGNhbiBiZSByZWFkIGZyb20sIGFuZCB3cml0dGVuIHRvLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYSBwb2ludGVyIHRvIGEgZGVudHJ5IGlmIGl0IHN1Y2NlZWRzLiAgVGhpcworICogcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byB0aGUgZGVidWdmc19yZW1vdmUoKSBmdW5jdGlvbiB3aGVuIHRoZSBmaWxlIGlzCisgKiB0byBiZSByZW1vdmVkIChubyBhdXRvbWF0aWMgY2xlYW51cCBoYXBwZW5zIGlmIHlvdXIgbW9kdWxlIGlzIHVubG9hZGVkLAorICogeW91IGFyZSByZXNwb25zaWJsZSBoZXJlLikgIElmIGFuIGVycm9yIG9jY3VycywgTlVMTCB3aWxsIGJlIHJldHVybmVkLgorICoKKyAqIElmIGRlYnVnZnMgaXMgbm90IGVuYWJsZWQgaW4gdGhlIGtlcm5lbCwgdGhlIHZhbHVlIC1FTk9ERVYgd2lsbCBiZQorICogcmV0dXJuZWQuICBJdCBpcyBub3Qgd2lzZSB0byBjaGVjayBmb3IgdGhpcyB2YWx1ZSwgYnV0IHJhdGhlciwgY2hlY2sgZm9yCisgKiBOVUxMIG9yICFOVUxMIGluc3RlYWQgYXMgdG8gZWxpbWluYXRlIHRoZSBuZWVkIGZvciAjaWZkZWYgaW4gdGhlIGNhbGxpbmcKKyAqIGNvZGUuCisgKi8KK3N0cnVjdCBkZW50cnkgKmRlYnVnZnNfY3JlYXRlX3U4KGNvbnN0IGNoYXIgKm5hbWUsIG1vZGVfdCBtb2RlLAorCQkJCSBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIHU4ICp2YWx1ZSkKK3sKKwlyZXR1cm4gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCBtb2RlLCBwYXJlbnQsIHZhbHVlLCAmZm9wc191OCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkZWJ1Z2ZzX2NyZWF0ZV91OCk7CisKKy8qKgorICogZGVidWdmc19jcmVhdGVfdTE2IC0gY3JlYXRlIGEgZmlsZSBpbiB0aGUgZGVidWdmcyBmaWxlc3lzdGVtIHRoYXQgaXMgdXNlZCB0byByZWFkIGFuZCB3cml0ZSBhIHVuc2lnbmVkIDggYml0IHZhbHVlLgorICoKKyAqIEBuYW1lOiBhIHBvaW50ZXIgdG8gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBjcmVhdGUuCisgKiBAbW9kZTogdGhlIHBlcm1pc3Npb24gdGhhdCB0aGUgZmlsZSBzaG91bGQgaGF2ZQorICogQHBhcmVudDogYSBwb2ludGVyIHRvIHRoZSBwYXJlbnQgZGVudHJ5IGZvciB0aGlzIGZpbGUuICBUaGlzIHNob3VsZCBiZSBhCisgKiAgICAgICAgICBkaXJlY3RvcnkgZGVudHJ5IGlmIHNldC4gIElmIHRoaXMgcGFyYW1hdGVyIGlzIE5VTEwsIHRoZW4gdGhlCisgKiAgICAgICAgICBmaWxlIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgcm9vdCBvZiB0aGUgZGVidWdmcyBmaWxlc3lzdGVtLgorICogQHZhbHVlOiBhIHBvaW50ZXIgdG8gdGhlIHZhcmlhYmxlIHRoYXQgdGhlIGZpbGUgc2hvdWxkIHJlYWQgdG8gYW5kIHdyaXRlCisgKiAgICAgICAgIGZyb20uCisgKgorICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgZmlsZSBpbiBkZWJ1Z2ZzIHdpdGggdGhlIGdpdmVuIG5hbWUgdGhhdAorICogY29udGFpbnMgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSBAdmFsdWUuICBJZiB0aGUgQG1vZGUgdmFyaWFibGUgaXMgc28KKyAqIHNldCwgaXQgY2FuIGJlIHJlYWQgZnJvbSwgYW5kIHdyaXR0ZW4gdG8uCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBhIHBvaW50ZXIgdG8gYSBkZW50cnkgaWYgaXQgc3VjY2VlZHMuICBUaGlzCisgKiBwb2ludGVyIG11c3QgYmUgcGFzc2VkIHRvIHRoZSBkZWJ1Z2ZzX3JlbW92ZSgpIGZ1bmN0aW9uIHdoZW4gdGhlIGZpbGUgaXMKKyAqIHRvIGJlIHJlbW92ZWQgKG5vIGF1dG9tYXRpYyBjbGVhbnVwIGhhcHBlbnMgaWYgeW91ciBtb2R1bGUgaXMgdW5sb2FkZWQsCisgKiB5b3UgYXJlIHJlc3BvbnNpYmxlIGhlcmUuKSAgSWYgYW4gZXJyb3Igb2NjdXJzLCBOVUxMIHdpbGwgYmUgcmV0dXJuZWQuCisgKgorICogSWYgZGVidWdmcyBpcyBub3QgZW5hYmxlZCBpbiB0aGUga2VybmVsLCB0aGUgdmFsdWUgLUVOT0RFViB3aWxsIGJlCisgKiByZXR1cm5lZC4gIEl0IGlzIG5vdCB3aXNlIHRvIGNoZWNrIGZvciB0aGlzIHZhbHVlLCBidXQgcmF0aGVyLCBjaGVjayBmb3IKKyAqIE5VTEwgb3IgIU5VTEwgaW5zdGVhZCBhcyB0byBlbGltaW5hdGUgdGhlIG5lZWQgZm9yICNpZmRlZiBpbiB0aGUgY2FsbGluZworICogY29kZS4KKyAqLworc3RydWN0IGRlbnRyeSAqZGVidWdmc19jcmVhdGVfdTE2KGNvbnN0IGNoYXIgKm5hbWUsIG1vZGVfdCBtb2RlLAorCQkJCSAgc3RydWN0IGRlbnRyeSAqcGFyZW50LCB1MTYgKnZhbHVlKQoreworCXJldHVybiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIG1vZGUsIHBhcmVudCwgdmFsdWUsICZmb3BzX3UxNik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkZWJ1Z2ZzX2NyZWF0ZV91MTYpOworCisvKioKKyAqIGRlYnVnZnNfY3JlYXRlX3UzMiAtIGNyZWF0ZSBhIGZpbGUgaW4gdGhlIGRlYnVnZnMgZmlsZXN5c3RlbSB0aGF0IGlzIHVzZWQgdG8gcmVhZCBhbmQgd3JpdGUgYSB1bnNpZ25lZCA4IGJpdCB2YWx1ZS4KKyAqCisgKiBAbmFtZTogYSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gY3JlYXRlLgorICogQG1vZGU6IHRoZSBwZXJtaXNzaW9uIHRoYXQgdGhlIGZpbGUgc2hvdWxkIGhhdmUKKyAqIEBwYXJlbnQ6IGEgcG9pbnRlciB0byB0aGUgcGFyZW50IGRlbnRyeSBmb3IgdGhpcyBmaWxlLiAgVGhpcyBzaG91bGQgYmUgYQorICogICAgICAgICAgZGlyZWN0b3J5IGRlbnRyeSBpZiBzZXQuICBJZiB0aGlzIHBhcmFtYXRlciBpcyBOVUxMLCB0aGVuIHRoZQorICogICAgICAgICAgZmlsZSB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHJvb3Qgb2YgdGhlIGRlYnVnZnMgZmlsZXN5c3RlbS4KKyAqIEB2YWx1ZTogYSBwb2ludGVyIHRvIHRoZSB2YXJpYWJsZSB0aGF0IHRoZSBmaWxlIHNob3VsZCByZWFkIHRvIGFuZCB3cml0ZQorICogICAgICAgICBmcm9tLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIGZpbGUgaW4gZGVidWdmcyB3aXRoIHRoZSBnaXZlbiBuYW1lIHRoYXQKKyAqIGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgQHZhbHVlLiAgSWYgdGhlIEBtb2RlIHZhcmlhYmxlIGlzIHNvCisgKiBzZXQsIGl0IGNhbiBiZSByZWFkIGZyb20sIGFuZCB3cml0dGVuIHRvLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYSBwb2ludGVyIHRvIGEgZGVudHJ5IGlmIGl0IHN1Y2NlZWRzLiAgVGhpcworICogcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byB0aGUgZGVidWdmc19yZW1vdmUoKSBmdW5jdGlvbiB3aGVuIHRoZSBmaWxlIGlzCisgKiB0byBiZSByZW1vdmVkIChubyBhdXRvbWF0aWMgY2xlYW51cCBoYXBwZW5zIGlmIHlvdXIgbW9kdWxlIGlzIHVubG9hZGVkLAorICogeW91IGFyZSByZXNwb25zaWJsZSBoZXJlLikgIElmIGFuIGVycm9yIG9jY3VycywgTlVMTCB3aWxsIGJlIHJldHVybmVkLgorICoKKyAqIElmIGRlYnVnZnMgaXMgbm90IGVuYWJsZWQgaW4gdGhlIGtlcm5lbCwgdGhlIHZhbHVlIC1FTk9ERVYgd2lsbCBiZQorICogcmV0dXJuZWQuICBJdCBpcyBub3Qgd2lzZSB0byBjaGVjayBmb3IgdGhpcyB2YWx1ZSwgYnV0IHJhdGhlciwgY2hlY2sgZm9yCisgKiBOVUxMIG9yICFOVUxMIGluc3RlYWQgYXMgdG8gZWxpbWluYXRlIHRoZSBuZWVkIGZvciAjaWZkZWYgaW4gdGhlIGNhbGxpbmcKKyAqIGNvZGUuCisgKi8KK3N0cnVjdCBkZW50cnkgKmRlYnVnZnNfY3JlYXRlX3UzMihjb25zdCBjaGFyICpuYW1lLCBtb2RlX3QgbW9kZSwKKwkJCQkgc3RydWN0IGRlbnRyeSAqcGFyZW50LCB1MzIgKnZhbHVlKQoreworCXJldHVybiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIG1vZGUsIHBhcmVudCwgdmFsdWUsICZmb3BzX3UzMik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkZWJ1Z2ZzX2NyZWF0ZV91MzIpOworCitzdGF0aWMgc3NpemVfdCByZWFkX2ZpbGVfYm9vbChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciBidWZbM107CisJdTMyICp2YWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJCisJaWYgKCp2YWwpCisJCWJ1ZlswXSA9ICdZJzsKKwllbHNlCisJCWJ1ZlswXSA9ICdOJzsKKwlidWZbMV0gPSAnXG4nOworCWJ1ZlsyXSA9IDB4MDA7CisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCAyKTsKK30KKworc3RhdGljIHNzaXplX3Qgd3JpdGVfZmlsZV9ib29sKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciBidWZbMzJdOworCWludCBidWZfc2l6ZTsKKwl1MzIgKnZhbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWJ1Zl9zaXplID0gbWluKGNvdW50LCAoc2l6ZW9mKGJ1ZiktMSkpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBidWZfc2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCisJc3dpdGNoIChidWZbMF0pIHsKKwljYXNlICd5JzoKKwljYXNlICdZJzoKKwljYXNlICcxJzoKKwkJKnZhbCA9IDE7CisJCWJyZWFrOworCWNhc2UgJ24nOgorCWNhc2UgJ04nOgorCWNhc2UgJzAnOgorCQkqdmFsID0gMDsKKwkJYnJlYWs7CisJfQorCQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9wc19ib29sID0geworCS5yZWFkID0JCXJlYWRfZmlsZV9ib29sLAorCS53cml0ZSA9CXdyaXRlX2ZpbGVfYm9vbCwKKwkub3BlbiA9CQlkZWZhdWx0X29wZW4sCit9OworCisvKioKKyAqIGRlYnVnZnNfY3JlYXRlX2Jvb2wgLSBjcmVhdGUgYSBmaWxlIGluIHRoZSBkZWJ1Z2ZzIGZpbGVzeXN0ZW0gdGhhdCBpcyB1c2VkIHRvIHJlYWQgYW5kIHdyaXRlIGEgYm9vbGVhbiB2YWx1ZS4KKyAqCisgKiBAbmFtZTogYSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gY3JlYXRlLgorICogQG1vZGU6IHRoZSBwZXJtaXNzaW9uIHRoYXQgdGhlIGZpbGUgc2hvdWxkIGhhdmUKKyAqIEBwYXJlbnQ6IGEgcG9pbnRlciB0byB0aGUgcGFyZW50IGRlbnRyeSBmb3IgdGhpcyBmaWxlLiAgVGhpcyBzaG91bGQgYmUgYQorICogICAgICAgICAgZGlyZWN0b3J5IGRlbnRyeSBpZiBzZXQuICBJZiB0aGlzIHBhcmFtYXRlciBpcyBOVUxMLCB0aGVuIHRoZQorICogICAgICAgICAgZmlsZSB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHJvb3Qgb2YgdGhlIGRlYnVnZnMgZmlsZXN5c3RlbS4KKyAqIEB2YWx1ZTogYSBwb2ludGVyIHRvIHRoZSB2YXJpYWJsZSB0aGF0IHRoZSBmaWxlIHNob3VsZCByZWFkIHRvIGFuZCB3cml0ZQorICogICAgICAgICBmcm9tLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIGZpbGUgaW4gZGVidWdmcyB3aXRoIHRoZSBnaXZlbiBuYW1lIHRoYXQKKyAqIGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgQHZhbHVlLiAgSWYgdGhlIEBtb2RlIHZhcmlhYmxlIGlzIHNvCisgKiBzZXQsIGl0IGNhbiBiZSByZWFkIGZyb20sIGFuZCB3cml0dGVuIHRvLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYSBwb2ludGVyIHRvIGEgZGVudHJ5IGlmIGl0IHN1Y2NlZWRzLiAgVGhpcworICogcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byB0aGUgZGVidWdmc19yZW1vdmUoKSBmdW5jdGlvbiB3aGVuIHRoZSBmaWxlIGlzCisgKiB0byBiZSByZW1vdmVkIChubyBhdXRvbWF0aWMgY2xlYW51cCBoYXBwZW5zIGlmIHlvdXIgbW9kdWxlIGlzIHVubG9hZGVkLAorICogeW91IGFyZSByZXNwb25zaWJsZSBoZXJlLikgIElmIGFuIGVycm9yIG9jY3VycywgTlVMTCB3aWxsIGJlIHJldHVybmVkLgorICoKKyAqIElmIGRlYnVnZnMgaXMgbm90IGVuYWJsZWQgaW4gdGhlIGtlcm5lbCwgdGhlIHZhbHVlIC1FTk9ERVYgd2lsbCBiZQorICogcmV0dXJuZWQuICBJdCBpcyBub3Qgd2lzZSB0byBjaGVjayBmb3IgdGhpcyB2YWx1ZSwgYnV0IHJhdGhlciwgY2hlY2sgZm9yCisgKiBOVUxMIG9yICFOVUxMIGluc3RlYWQgYXMgdG8gZWxpbWluYXRlIHRoZSBuZWVkIGZvciAjaWZkZWYgaW4gdGhlIGNhbGxpbmcKKyAqIGNvZGUuCisgKi8KK3N0cnVjdCBkZW50cnkgKmRlYnVnZnNfY3JlYXRlX2Jvb2woY29uc3QgY2hhciAqbmFtZSwgbW9kZV90IG1vZGUsCisJCQkJICAgc3RydWN0IGRlbnRyeSAqcGFyZW50LCB1MzIgKnZhbHVlKQoreworCXJldHVybiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIG1vZGUsIHBhcmVudCwgdmFsdWUsICZmb3BzX2Jvb2wpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZGVidWdmc19jcmVhdGVfYm9vbCk7CisKZGlmZiAtLWdpdCBhL2ZzL2RlYnVnZnMvaW5vZGUuYyBiL2ZzL2RlYnVnZnMvaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTI5Nzg2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZGVidWdmcy9pbm9kZS5jCkBAIC0wLDAgKzEsMzI4IEBACisvKgorICogIGZpbGUuYyAtIHBhcnQgb2YgZGVidWdmcywgYSB0aW55IGxpdHRsZSBkZWJ1ZyBmaWxlIHN5c3RlbQorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQgSUJNIEluYy4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKgkyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBkZWJ1Z2ZzIGlzIGZvciBwZW9wbGUgdG8gdXNlIGluc3RlYWQgb2YgL3Byb2Mgb3IgL3N5cy4KKyAqICBTZWUgRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2tlcm5lbC1hcGkgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworLyogdW5jb21tZW50IHRvIGdldCBkZWJ1ZyBtZXNzYWdlcyBmcm9tIHRoZSBkZWJ1ZyBmaWxlc3lzdGVtLCBhaCB0aGUgaXJvbnkuICovCisvKiAjZGVmaW5lIERFQlVHICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKworI2RlZmluZSBERUJVR0ZTX01BR0lDCTB4NjQ2MjY3MjAKKworLyogZGVjbGFyZWQgb3ZlciBpbiBmaWxlLmMgKi8KK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRlYnVnZnNfZmlsZV9vcGVyYXRpb25zOworCitzdGF0aWMgc3RydWN0IHZmc21vdW50ICpkZWJ1Z2ZzX21vdW50Oworc3RhdGljIGludCBkZWJ1Z2ZzX21vdW50X2NvdW50OworCitzdGF0aWMgc3RydWN0IGlub2RlICpkZWJ1Z2ZzX2dldF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgbW9kZSwgZGV2X3QgZGV2KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBuZXdfaW5vZGUoc2IpOworCisJaWYgKGlub2RlKSB7CisJCWlub2RlLT5pX21vZGUgPSBtb2RlOworCQlpbm9kZS0+aV91aWQgPSAwOworCQlpbm9kZS0+aV9naWQgPSAwOworCQlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9DQUNIRV9TSVpFOworCQlpbm9kZS0+aV9ibG9ja3MgPSAwOworCQlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisJCXN3aXRjaCAobW9kZSAmIFNfSUZNVCkgeworCQlkZWZhdWx0OgorCQkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBtb2RlLCBkZXYpOworCQkJYnJlYWs7CisJCWNhc2UgU19JRlJFRzoKKwkJCWlub2RlLT5pX2ZvcCA9ICZkZWJ1Z2ZzX2ZpbGVfb3BlcmF0aW9uczsKKwkJCWJyZWFrOworCQljYXNlIFNfSUZESVI6CisJCQlpbm9kZS0+aV9vcCA9ICZzaW1wbGVfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJCQlpbm9kZS0+aV9mb3AgPSAmc2ltcGxlX2Rpcl9vcGVyYXRpb25zOworCisJCQkvKiBkaXJlY3RvcnkgaW5vZGVzIHN0YXJ0IG9mZiB3aXRoIGlfbmxpbmsgPT0gMiAoZm9yICIuIiBlbnRyeSkgKi8KKwkJCWlub2RlLT5pX25saW5rKys7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gaW5vZGU7IAorfQorCisvKiBTTVAtc2FmZSAqLworc3RhdGljIGludCBkZWJ1Z2ZzX21rbm9kKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkgaW50IG1vZGUsIGRldl90IGRldikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVidWdmc19nZXRfaW5vZGUoZGlyLT5pX3NiLCBtb2RlLCBkZXYpOworCWludCBlcnJvciA9IC1FUEVSTTsKKworCWlmIChkZW50cnktPmRfaW5vZGUpCisJCXJldHVybiAtRUVYSVNUOworCisJaWYgKGlub2RlKSB7CisJCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJCWRnZXQoZGVudHJ5KTsKKwkJZXJyb3IgPSAwOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgZGVidWdmc19ta2RpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSkKK3sKKwlpbnQgcmVzOworCisJbW9kZSA9IChtb2RlICYgKFNfSVJXWFVHTyB8IFNfSVNWVFgpKSB8IFNfSUZESVI7CisJcmVzID0gZGVidWdmc19ta25vZChkaXIsIGRlbnRyeSwgbW9kZSwgMCk7CisJaWYgKCFyZXMpCisJCWRpci0+aV9ubGluaysrOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgZGVidWdmc19jcmVhdGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpCit7CisJbW9kZSA9IChtb2RlICYgU19JQUxMVUdPKSB8IFNfSUZSRUc7CisJcmV0dXJuIGRlYnVnZnNfbWtub2QoZGlyLCBkZW50cnksIG1vZGUsIDApOworfQorCitzdGF0aWMgaW5saW5lIGludCBkZWJ1Z2ZzX3Bvc2l0aXZlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlyZXR1cm4gZGVudHJ5LT5kX2lub2RlICYmICFkX3VuaGFzaGVkKGRlbnRyeSk7Cit9CisKK3N0YXRpYyBpbnQgZGVidWdfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQoreworCXN0YXRpYyBzdHJ1Y3QgdHJlZV9kZXNjciBkZWJ1Z19maWxlc1tdID0ge3siIn19OworCisJcmV0dXJuIHNpbXBsZV9maWxsX3N1cGVyKHNiLCBERUJVR0ZTX01BR0lDLCBkZWJ1Z19maWxlcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICogZ2V0X2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIGNvbnN0IGNoYXIgKm5hbWUpCit7ICAgICAgICAgICAgICAgCisJc3RydWN0IHFzdHIgcXN0cjsKKworCXFzdHIubmFtZSA9IG5hbWU7CisJcXN0ci5sZW4gPSBzdHJsZW4obmFtZSk7CisJcXN0ci5oYXNoID0gZnVsbF9uYW1lX2hhc2gobmFtZSxxc3RyLmxlbik7CisJcmV0dXJuIGxvb2t1cF9oYXNoKCZxc3RyLHBhcmVudCk7Cit9ICAgICAgICAgICAgICAgCisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmRlYnVnX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwkJCQkgICAgICAgIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsCisJCQkJCXZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9zaW5nbGUoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIGRlYnVnX2ZpbGxfc3VwZXIpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgZGVidWdfZnNfdHlwZSA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkubmFtZSA9CQkiZGVidWdmcyIsCisJLmdldF9zYiA9CWRlYnVnX2dldF9zYiwKKwkua2lsbF9zYiA9CWtpbGxfbGl0dGVyX3N1cGVyLAorfTsKKworc3RhdGljIGludCBkZWJ1Z2ZzX2NyZWF0ZV9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUsIG1vZGVfdCBtb2RlLAorCQkJCSAgc3RydWN0IGRlbnRyeSAqcGFyZW50LAorCQkJCSAgc3RydWN0IGRlbnRyeSAqKmRlbnRyeSkKK3sKKwlpbnQgZXJyb3IgPSAwOworCisJLyogSWYgdGhlIHBhcmVudCBpcyBub3Qgc3BlY2lmaWVkLCB3ZSBjcmVhdGUgaXQgaW4gdGhlIHJvb3QuCisJICogV2UgbmVlZCB0aGUgcm9vdCBkZW50cnkgdG8gZG8gdGhpcywgd2hpY2ggaXMgaW4gdGhlIHN1cGVyIAorCSAqIGJsb2NrLiBBIHBvaW50ZXIgdG8gdGhhdCBpcyBpbiB0aGUgc3RydWN0IHZmc21vdW50IHRoYXQgd2UKKwkgKiBoYXZlIGFyb3VuZC4KKwkgKi8KKwlpZiAoIXBhcmVudCApIHsKKwkJaWYgKGRlYnVnZnNfbW91bnQgJiYgZGVidWdmc19tb3VudC0+bW50X3NiKSB7CisJCQlwYXJlbnQgPSBkZWJ1Z2ZzX21vdW50LT5tbnRfc2ItPnNfcm9vdDsKKwkJfQorCX0KKwlpZiAoIXBhcmVudCkgeworCQlwcl9kZWJ1ZygiZGVidWdmczogQWghIGNhbiBub3QgZmluZCBhIHBhcmVudCFcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwkqZGVudHJ5ID0gTlVMTDsKKwlkb3duKCZwYXJlbnQtPmRfaW5vZGUtPmlfc2VtKTsKKwkqZGVudHJ5ID0gZ2V0X2RlbnRyeSAocGFyZW50LCBuYW1lKTsKKwlpZiAoIUlTX0VSUihkZW50cnkpKSB7CisJCWlmICgobW9kZSAmIFNfSUZNVCkgPT0gU19JRkRJUikKKwkJCWVycm9yID0gZGVidWdmc19ta2RpcihwYXJlbnQtPmRfaW5vZGUsICpkZW50cnksIG1vZGUpOworCQllbHNlIAorCQkJZXJyb3IgPSBkZWJ1Z2ZzX2NyZWF0ZShwYXJlbnQtPmRfaW5vZGUsICpkZW50cnksIG1vZGUpOworCX0gZWxzZQorCQllcnJvciA9IFBUUl9FUlIoZGVudHJ5KTsKKwl1cCgmcGFyZW50LT5kX2lub2RlLT5pX3NlbSk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICogZGVidWdmc19jcmVhdGVfZmlsZSAtIGNyZWF0ZSBhIGZpbGUgaW4gdGhlIGRlYnVnZnMgZmlsZXN5c3RlbQorICoKKyAqIEBuYW1lOiBhIHBvaW50ZXIgdG8gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBjcmVhdGUuCisgKiBAbW9kZTogdGhlIHBlcm1pc3Npb24gdGhhdCB0aGUgZmlsZSBzaG91bGQgaGF2ZQorICogQHBhcmVudDogYSBwb2ludGVyIHRvIHRoZSBwYXJlbnQgZGVudHJ5IGZvciB0aGlzIGZpbGUuICBUaGlzIHNob3VsZCBiZSBhCisgKiAgICAgICAgICBkaXJlY3RvcnkgZGVudHJ5IGlmIHNldC4gIElmIHRoaXMgcGFyYW1hdGVyIGlzIE5VTEwsIHRoZW4gdGhlCisgKiAgICAgICAgICBmaWxlIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgcm9vdCBvZiB0aGUgZGVidWdmcyBmaWxlc3lzdGVtLgorICogQGRhdGE6IGEgcG9pbnRlciB0byBzb21ldGhpbmcgdGhhdCB0aGUgY2FsbGVyIHdpbGwgd2FudCB0byBnZXQgdG8gbGF0ZXIKKyAqICAgICAgICBvbi4gIFRoZSBpbm9kZS51LmdlbmVyaWNfaXAgcG9pbnRlciB3aWxsIHBvaW50IHRvIHRoaXMgdmFsdWUgb24KKyAqICAgICAgICB0aGUgb3BlbigpIGNhbGwuCisgKiBAZm9wczogYSBwb2ludGVyIHRvIGEgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0aGF0IHNob3VsZCBiZSB1c2VkIGZvcgorICogICAgICAgIHRoaXMgZmlsZS4KKyAqCisgKiBUaGlzIGlzIHRoZSBiYXNpYyAiY3JlYXRlIGEgZmlsZSIgZnVuY3Rpb24gZm9yIGRlYnVnZnMuICBJdCBhbGxvd3MgZm9yIGEKKyAqIHdpZGUgcmFuZ2Ugb2YgZmxleGliaWxpdHkgaW4gY3JlYXRlaW5nIGEgZmlsZSwgb3IgYSBkaXJlY3RvcnkgKGlmIHlvdQorICogd2FudCB0byBjcmVhdGUgYSBkaXJlY3RvcnksIHRoZSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoKSBmdW5jdGlvbiBpcworICogcmVjb21tZW5kZWQgdG8gYmUgdXNlZCBpbnN0ZWFkLikKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgcG9pbnRlciB0byBhIGRlbnRyeSBpZiBpdCBzdWNjZWVkcy4gIFRoaXMKKyAqIHBvaW50ZXIgbXVzdCBiZSBwYXNzZWQgdG8gdGhlIGRlYnVnZnNfcmVtb3ZlKCkgZnVuY3Rpb24gd2hlbiB0aGUgZmlsZSBpcworICogdG8gYmUgcmVtb3ZlZCAobm8gYXV0b21hdGljIGNsZWFudXAgaGFwcGVucyBpZiB5b3VyIG1vZHVsZSBpcyB1bmxvYWRlZCwKKyAqIHlvdSBhcmUgcmVzcG9uc2libGUgaGVyZS4pICBJZiBhbiBlcnJvciBvY2N1cnMsIE5VTEwgd2lsbCBiZSByZXR1cm5lZC4KKyAqCisgKiBJZiBkZWJ1Z2ZzIGlzIG5vdCBlbmFibGVkIGluIHRoZSBrZXJuZWwsIHRoZSB2YWx1ZSAtRU5PREVWIHdpbGwgYmUKKyAqIHJldHVybmVkLiAgSXQgaXMgbm90IHdpc2UgdG8gY2hlY2sgZm9yIHRoaXMgdmFsdWUsIGJ1dCByYXRoZXIsIGNoZWNrIGZvcgorICogTlVMTCBvciAhTlVMTCBpbnN0ZWFkIGFzIHRvIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3IgI2lmZGVmIGluIHRoZSBjYWxsaW5nCisgKiBjb2RlLgorICovCitzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2NyZWF0ZV9maWxlKGNvbnN0IGNoYXIgKm5hbWUsIG1vZGVfdCBtb2RlLAorCQkJCSAgIHN0cnVjdCBkZW50cnkgKnBhcmVudCwgdm9pZCAqZGF0YSwKKwkJCQkgICBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IE5VTEw7CisJaW50IGVycm9yOworCisJcHJfZGVidWcoImRlYnVnZnM6IGNyZWF0aW5nIGZpbGUgJyVzJ1xuIixuYW1lKTsKKworCWVycm9yID0gc2ltcGxlX3Bpbl9mcygiZGVidWdmcyIsICZkZWJ1Z2ZzX21vdW50LCAmZGVidWdmc19tb3VudF9jb3VudCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGV4aXQ7CisKKwllcnJvciA9IGRlYnVnZnNfY3JlYXRlX2J5X25hbWUobmFtZSwgbW9kZSwgcGFyZW50LCAmZGVudHJ5KTsKKwlpZiAoZXJyb3IpIHsKKwkJZGVudHJ5ID0gTlVMTDsKKwkJZ290byBleGl0OworCX0KKworCWlmIChkZW50cnktPmRfaW5vZGUpIHsKKwkJaWYgKGRhdGEpCisJCQlkZW50cnktPmRfaW5vZGUtPnUuZ2VuZXJpY19pcCA9IGRhdGE7CisJCWlmIChmb3BzKQorCQkJZGVudHJ5LT5kX2lub2RlLT5pX2ZvcCA9IGZvcHM7CisJfQorZXhpdDoKKwlyZXR1cm4gZGVudHJ5OworfQorRVhQT1JUX1NZTUJPTF9HUEwoZGVidWdmc19jcmVhdGVfZmlsZSk7CisKKy8qKgorICogZGVidWdmc19jcmVhdGVfZGlyIC0gY3JlYXRlIGEgZGlyZWN0b3J5IGluIHRoZSBkZWJ1Z2ZzIGZpbGVzeXN0ZW0KKyAqCisgKiBAbmFtZTogYSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSB0bworICogICAgICAgIGNyZWF0ZS4KKyAqIEBwYXJlbnQ6IGEgcG9pbnRlciB0byB0aGUgcGFyZW50IGRlbnRyeSBmb3IgdGhpcyBmaWxlLiAgVGhpcyBzaG91bGQgYmUgYQorICogICAgICAgICAgZGlyZWN0b3J5IGRlbnRyeSBpZiBzZXQuICBJZiB0aGlzIHBhcmFtYXRlciBpcyBOVUxMLCB0aGVuIHRoZQorICogICAgICAgICAgZGlyZWN0b3J5IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgcm9vdCBvZiB0aGUgZGVidWdmcyBmaWxlc3lzdGVtLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIGRpcmVjdG9yeSBpbiBkZWJ1Z2ZzIHdpdGggdGhlIGdpdmVuIG5hbWUuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBhIHBvaW50ZXIgdG8gYSBkZW50cnkgaWYgaXQgc3VjY2VlZHMuICBUaGlzCisgKiBwb2ludGVyIG11c3QgYmUgcGFzc2VkIHRvIHRoZSBkZWJ1Z2ZzX3JlbW92ZSgpIGZ1bmN0aW9uIHdoZW4gdGhlIGZpbGUgaXMKKyAqIHRvIGJlIHJlbW92ZWQgKG5vIGF1dG9tYXRpYyBjbGVhbnVwIGhhcHBlbnMgaWYgeW91ciBtb2R1bGUgaXMgdW5sb2FkZWQsCisgKiB5b3UgYXJlIHJlc3BvbnNpYmxlIGhlcmUuKSAgSWYgYW4gZXJyb3Igb2NjdXJzLCBOVUxMIHdpbGwgYmUgcmV0dXJuZWQuCisgKgorICogSWYgZGVidWdmcyBpcyBub3QgZW5hYmxlZCBpbiB0aGUga2VybmVsLCB0aGUgdmFsdWUgLUVOT0RFViB3aWxsIGJlCisgKiByZXR1cm5lZC4gIEl0IGlzIG5vdCB3aXNlIHRvIGNoZWNrIGZvciB0aGlzIHZhbHVlLCBidXQgcmF0aGVyLCBjaGVjayBmb3IKKyAqIE5VTEwgb3IgIU5VTEwgaW5zdGVhZCBhcyB0byBlbGltaW5hdGUgdGhlIG5lZWQgZm9yICNpZmRlZiBpbiB0aGUgY2FsbGluZworICogY29kZS4KKyAqLworc3RydWN0IGRlbnRyeSAqZGVidWdmc19jcmVhdGVfZGlyKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBkZW50cnkgKnBhcmVudCkKK3sKKwlyZXR1cm4gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCAKKwkJCQkgICBTX0lGRElSIHwgU19JUldYVSB8IFNfSVJVR08gfCBTX0lYVUdPLAorCQkJCSAgIHBhcmVudCwgTlVMTCwgTlVMTCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkZWJ1Z2ZzX2NyZWF0ZV9kaXIpOworCisvKioKKyAqIGRlYnVnZnNfcmVtb3ZlIC0gcmVtb3ZlcyBhIGZpbGUgb3IgZGlyZWN0b3J5IGZyb20gdGhlIGRlYnVnZnMgZmlsZXN5c3RlbQorICoKKyAqIEBkZW50cnk6IGEgcG9pbnRlciB0byBhIHRoZSBkZW50cnkgb2YgdGhlIGZpbGUgb3IgZGlyZWN0b3J5IHRvIGJlCisgKiAgICAgICAgICByZW1vdmVkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBhIGZpbGUgb3IgZGlyZWN0b3J5IGluIGRlYnVnZnMgdGhhdCB3YXMgcHJldmlvdXNseQorICogY3JlYXRlZCB3aXRoIGEgY2FsbCB0byBhbm90aGVyIGRlYnVnZnMgZnVuY3Rpb24gKGxpa2UKKyAqIGRlYnVmc19jcmVhdGVfZmlsZSgpIG9yIHZhcmlhbnRzIHRoZXJlb2YuKQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgcmVxdWlyZWQgdG8gYmUgY2FsbGVkIGluIG9yZGVyIGZvciB0aGUgZmlsZSB0byBiZQorICogcmVtb3ZlZCwgbm8gYXV0b21hdGljIGNsZWFudXAgb2YgZmlsZXMgd2lsbCBoYXBwZW4gd2hlbiBhIG1vZHVsZSBpcworICogcmVtb3ZlZCwgeW91IGFyZSByZXNwb25zaWJsZSBoZXJlLgorICovCit2b2lkIGRlYnVnZnNfcmVtb3ZlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQ7CisJCisJaWYgKCFkZW50cnkpCisJCXJldHVybjsKKworCXBhcmVudCA9IGRlbnRyeS0+ZF9wYXJlbnQ7CisJaWYgKCFwYXJlbnQgfHwgIXBhcmVudC0+ZF9pbm9kZSkKKwkJcmV0dXJuOworCisJZG93bigmcGFyZW50LT5kX2lub2RlLT5pX3NlbSk7CisJaWYgKGRlYnVnZnNfcG9zaXRpdmUoZGVudHJ5KSkgeworCQlpZiAoZGVudHJ5LT5kX2lub2RlKSB7CisJCQlpZiAoU19JU0RJUihkZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpCisJCQkJc2ltcGxlX3JtZGlyKHBhcmVudC0+ZF9pbm9kZSwgZGVudHJ5KTsKKwkJCWVsc2UKKwkJCQlzaW1wbGVfdW5saW5rKHBhcmVudC0+ZF9pbm9kZSwgZGVudHJ5KTsKKwkJZHB1dChkZW50cnkpOworCQl9CisJfQorCXVwKCZwYXJlbnQtPmRfaW5vZGUtPmlfc2VtKTsKKwlzaW1wbGVfcmVsZWFzZV9mcygmZGVidWdmc19tb3VudCwgJmRlYnVnZnNfbW91bnRfY291bnQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZGVidWdmc19yZW1vdmUpOworCitzdGF0aWMgZGVjbF9zdWJzeXMoZGVidWcsIE5VTEwsIE5VTEwpOworCitzdGF0aWMgaW50IF9faW5pdCBkZWJ1Z2ZzX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJa3NldF9zZXRfa3NldF9zKCZkZWJ1Z19zdWJzeXMsIGtlcm5lbF9zdWJzeXMpOworCXJldHZhbCA9IHN1YnN5c3RlbV9yZWdpc3RlcigmZGVidWdfc3Vic3lzKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dmFsID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmZGVidWdfZnNfdHlwZSk7CisJaWYgKHJldHZhbCkKKwkJc3Vic3lzdGVtX3VucmVnaXN0ZXIoJmRlYnVnX3N1YnN5cyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRlYnVnZnNfZXhpdCh2b2lkKQoreworCXNpbXBsZV9yZWxlYXNlX2ZzKCZkZWJ1Z2ZzX21vdW50LCAmZGVidWdmc19tb3VudF9jb3VudCk7CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZkZWJ1Z19mc190eXBlKTsKKwlzdWJzeXN0ZW1fdW5yZWdpc3RlcigmZGVidWdfc3Vic3lzKTsKK30KKworY29yZV9pbml0Y2FsbChkZWJ1Z2ZzX2luaXQpOworbW9kdWxlX2V4aXQoZGVidWdmc19leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwpkaWZmIC0tZ2l0IGEvZnMvZGV2ZnMvTWFrZWZpbGUgYi9mcy9kZXZmcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGQ4ZDEyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZGV2ZnMvTWFrZWZpbGUKQEAgLTAsMCArMSw4IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgbGludXggZGV2ZnMtZmlsZXN5c3RlbSByb3V0aW5lcy4KKyMKKworb2JqLSQoQ09ORklHX0RFVkZTX0ZTKSArPSBkZXZmcy5vCisKK2RldmZzLW9ianMgOj0gYmFzZS5vIHV0aWwubworCmRpZmYgLS1naXQgYS9mcy9kZXZmcy9iYXNlLmMgYi9mcy9kZXZmcy9iYXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVjZmUxZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2RldmZzL2Jhc2UuYwpAQCAtMCwwICsxLDI4MzggQEAKKy8qICBkZXZmcyAoRGV2aWNlIEZpbGVTeXN0ZW0pIGRyaXZlci4KKworICAgIENvcHlyaWdodCAoQykgMTk5OC0yMDAyICBSaWNoYXJkIEdvb2NoCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICAgIFJpY2hhcmQgR29vY2ggbWF5IGJlIHJlYWNoZWQgYnkgZW1haWwgYXQgIHJnb29jaEBhdG5mLmNzaXJvLmF1CisgICAgVGhlIHBvc3RhbCBhZGRyZXNzIGlzOgorICAgICAgUmljaGFyZCBHb29jaCwgYy9vIEFUTkYsIFAuIE8uIEJveCA3NiwgRXBwaW5nLCBOLlMuVy4sIDIxMjEsIEF1c3RyYWxpYS4KKworICAgIENoYW5nZUxvZworCisgICAgMTk5ODAxMTAgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIE9yaWdpbmFsIHZlcnNpb24uCisgIHYwLjEKKyAgICAxOTk4MDExMSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgQ3JlYXRlZCBwZXItZnMgaW5vZGUgdGFibGUgcmF0aGVyIHRoYW4gdXNpbmcgaW5vZGUtPnUuZ2VuZXJpY19pcAorICB2MC4yCisgICAgMTk5ODAxMTEgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIENyZWF0ZWQgLmVwb2NoIGlub2RlIHdoaWNoIGhhcyBhIGN0aW1lIG9mIDAuCisJICAgICAgIEZpeGVkIGxvc3Mgb2YgbmFtZWQgcGlwZXMgd2hlbiBkZW50cmllcyBsb3N0LgorCSAgICAgICBGaXhlZCBsb3NzIG9mIGlub2RlIGRhdGEgd2hlbiBkZXZmc19yZWdpc3RlcigpIGZvbGxvd3MgbWtub2QoKS4KKyAgdjAuMworICAgIDE5OTgwMTExICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisgICAgICAgICAgICAgICBGaXggZm9yIHdoZW4gY29tcGlsaW5nIHdpdGggQ09ORklHX0tFUk5FTEQuCisgICAgMTk5ODAxMTIgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIEZpeCBmb3IgcmVhZGRpcigpIHdoaWNoIHNvbWV0aW1lcyBkaWRuJ3Qgc2hvdyBlbnRyaWVzLgorCSAgICAgICBBZGRlZCA8PHRvbGVyYW50Pj4gb3B0aW9uIHRvIDxkZXZmc19yZWdpc3Rlcj4uCisgIHYwLjQKKyAgICAxOTk4MDExMyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgQ3JlYXRlZCA8ZGV2ZnNfZmlsbF9maWxlPiBmdW5jdGlvbi4KKyAgdjAuNQorICAgIDE5OTgwMTE1ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisgICAgICAgICAgICAgICBBZGRlZCBzdWJkaXJlY3Rvcnkgc3VwcG9ydC4gTWFqb3IgcmVzdHJ1Y3R1cmluZy4KKyAgICAxOTk4MDExNiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgRml4ZWQgPGZpbmRfYnlfZGV2PiB0byBub3Qgc2VhcmNoIG1ham9yPTAsbWlub3I9MC4KKwkgICAgICAgQWRkZWQgc3ltbGluayBzdXBwb3J0LgorICB2MC42CisgICAgMTk5ODAxMjAgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIENyZWF0ZWQgPGRldmZzX21rX2Rpcj4gZnVuY3Rpb24gYW5kIHN1cHBvcnQgZGlyZWN0b3J5IHVucmVnaXN0ZXIKKyAgICAxOTk4MDEyMCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgQXV0by1vd25lcnNoaXAgdXNlcyByZWFsIHVpZC9naWQgcmF0aGVyIHRoYW4gZWZmZWN0aXZlIHVpZC9naWQuCisgIHYwLjcKKyAgICAxOTk4MDEyMSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgU3VwcG9ydGVkIGNyZWF0aW9uIG9mIHNvY2tldHMuCisgIHYwLjgKKyAgICAxOTk4MDEyMiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgQWRkZWQgREVWRlNfRkxfSElERV9VTlJFRyBmbGFnLgorCSAgICAgICBJbnRlcmZhY2UgY2hhbmdlIHRvIDxkZXZmc19ta19zeW1saW5rPi4KKyAgICAgICAgICAgICAgIENyZWF0ZWQgPGRldmZzX3N5bWxpbms+IHRvIHN1cHBvcnQgc3ltbGluaygyKS4KKyAgdjAuOQorICAgIDE5OTgwMTIzICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisgICAgICAgICAgICAgICBBZGRlZCBjaGVjayB0byA8ZGV2ZnNfZmlsbF9maWxlPiB0byBjaGVjayBpbm9kZSBpcyBpbiBkZXZmcy4KKwkgICAgICAgQWRkZWQgb3B0aW9uYWwgdHJhdmVyc2FsIG9mIHN5bWxpbmtzLgorICB2MC4xMAorICAgIDE5OTgwMTI0ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisgICAgICAgICAgICAgICBDcmVhdGVkIDxkZXZmc19nZXRfZmxhZ3M+IGFuZCA8ZGV2ZnNfc2V0X2ZsYWdzPi4KKyAgdjAuMTEKKyAgICAxOTk4MDEyNSAgIEMuIFNjb3R0IEFuYW5pYW4gPGNhbmFuaWFuQGFsdW1uaS5wcmluY2V0b24uZWR1PgorICAgICAgICAgICAgICAgQ3JlYXRlZCA8ZGV2ZnNfZmluZF9oYW5kbGU+LgorICAgIDE5OTgwMTI1ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisgICAgICAgICAgICAgICBBbGxvdyByZW1vdmFsIG9mIHN5bWxpbmtzLgorICB2MC4xMgorICAgIDE5OTgwMTI1ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisgICAgICAgICAgICAgICBDcmVhdGVkIDxkZXZmc19zZXRfc3ltbGlua19kZXN0aW5hdGlvbj4uCisgICAgMTk5ODAxMjYgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIE1vdmVkIERFVkZTX1NVUEVSX01BR0lDIGludG8gaGVhZGVyIGZpbGUuCisJICAgICAgIEFkZGVkIERFVkZTX0ZMX0hJREUgZmxhZy4KKwkgICAgICAgQ3JlYXRlZCA8ZGV2ZnNfZ2V0X21hal9taW4+LgorCSAgICAgICBDcmVhdGVkIDxkZXZmc19nZXRfaGFuZGxlX2Zyb21faW5vZGU+LgorCSAgICAgICBGaXhlZCBtaW5vciBidWcgaW4gPGZpbmRfYnlfZGV2Pi4KKyAgICAxOTk4MDEyNyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBDaGFuZ2VkIGludGVyZmFjZSB0byA8ZmluZF9ieV9kZXY+LCA8ZmluZF9lbnRyeT4sCisJICAgICAgIDxkZXZmc191bnJlZ2lzdGVyPiwgPGRldmZzX2ZpbGxfZmlsZT4gYW5kIDxkZXZmc19maW5kX2hhbmRsZT4uCisJICAgICAgIEZpeGVkIGlub2RlIHRpbWVzIHdoZW4gc3ltbGluayBjcmVhdGVkIHdpdGggc3ltbGluaygyKS4KKyAgdjAuMTMKKyAgICAxOTk4MDEyOSAgIEMuIFNjb3R0IEFuYW5pYW4gPGNhbmFuaWFuQGFsdW1uaS5wcmluY2V0b24uZWR1PgorICAgICAgICAgICAgICAgRXhwb3J0ZWQgPGRldmZzX3NldF9zeW1saW5rX2Rlc3RpbmF0aW9uPiwgPGRldmZzX2dldF9tYWpfbWluPgorCSAgICAgICBhbmQgPGRldmZzX2dldF9oYW5kbGVfZnJvbV9pbm9kZT4uCisgICAgMTk5ODAxMjkgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQ3JlYXRlZCA8ZGV2ZnNfdW5saW5rPiB0byBzdXBwb3J0IHVubGluaygyKS4KKyAgdjAuMTQKKyAgICAxOTk4MDEyOSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBGaXhlZCBrZXJuZWxkIHN1cHBvcnQgZm9yIGVudHJpZXMgaW4gZGV2ZnMgc3ViZGlyZWN0b3JpZXMuCisgICAgMTk5ODAxMzAgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQnVnZml4ZXMgaW4gPGNhbGxfa2VybmVsZD4uCisgIHYwLjE1CisgICAgMTk5ODAyMDcgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQ2FsbCBrZXJuZWxkIHdoZW4gbG9va2luZyB1cCB1bnJlZ2lzdGVyZWQgZW50cmllcy4KKyAgdjAuMTYKKyAgICAxOTk4MDMyNiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBNb2RpZmllZCBpbnRlcmZhY2UgdG8gPGRldmZzX2ZpbmRfaGFuZGxlPiBmb3Igc3ltbGluayB0cmF2ZXJzYWwuCisgIHYwLjE3CisgICAgMTk5ODAzMzEgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgRml4ZWQgcGVyc2lzdGVuY2UgYnVnIHdpdGggZGV2aWNlIG51bWJlcnMgZm9yIG1hbnVhbGx5IGNyZWF0ZWQKKwkgICAgICAgZGV2aWNlIGZpbGVzLgorCSAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggcmVjcmVhdGluZyBzeW1saW5rcyB3aXRoIGRpZmZlcmVudCBjb250ZW50LgorICB2MC4xOAorICAgIDE5OTgwNDAxICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIENoYW5nZWQgdG8gQ09ORklHX0tNT0QuCisJICAgICAgIEhpZGUgZW50cmllcyB3aGljaCBhcmUgbWFudWFsbHkgdW5saW5rZWQuCisJICAgICAgIEFsd2F5cyBpbnZhbGlkYXRlIGRldmZzIGRlbnRyeSBjYWNoZSB3aGVuIHJlZ2lzdGVyaW5nIGVudHJpZXMuCisJICAgICAgIENyZWF0ZWQgPGRldmZzX3JtZGlyPiB0byBzdXBwb3J0IHJtZGlyKDIpLgorCSAgICAgICBFbnN1cmUgZGlyZWN0b3JpZXMgY3JlYXRlZCBieSA8ZGV2ZnNfbWtfZGlyPiBhcmUgdmlzaWJsZS4KKyAgdjAuMTkKKyAgICAxOTk4MDQwMiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBJbnZhbGlkYXRlIGRldmZzIGRlbnRyeSBjYWNoZSB3aGVuIG1ha2luZyBkaXJlY3Rvcmllcy4KKwkgICAgICAgSW52YWxpZGF0ZSBkZXZmcyBkZW50cnkgY2FjaGUgd2hlbiByZW1vdmluZyBlbnRyaWVzLgorCSAgICAgICBGaXhlZCBwZXJzaXN0ZW5jZSBidWcgd2l0aCBmaWZvcy4KKyAgdjAuMjAKKyAgICAxOTk4MDQyMSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBQcmludCBwcm9jZXNzIGNvbW1hbmQgd2hlbiBkZWJ1Z2dpbmcga2VybmVsZC9rbW9kLgorCSAgICAgICBBZGRlZCBkZWJ1Z2dpbmcgZm9yIHJlZ2lzdGVyL3VucmVnaXN0ZXIvY2hhbmdlIG9wZXJhdGlvbnMuCisgICAgMTk5ODA0MjIgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQWRkZWQgImRldmZzPSIgYm9vdCBvcHRpb25zLgorICB2MC4yMQorICAgIDE5OTgwNDI2ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIE5vIGxvbmdlciBsb2NrL3VubG9jayBzdXBlcmJsb2NrIGluIDxkZXZmc19wdXRfc3VwZXI+LgorCSAgICAgICBEcm9wIG5lZ2F0aXZlIGRlbnRyaWVzIHdoZW4gdGhleSBhcmUgcmVsZWFzZWQuCisJICAgICAgIE1hbmFnZSBkY2FjaGUgbW9yZSBlZmZpY2llbnRseS4KKyAgdjAuMjIKKyAgICAxOTk4MDQyNyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBBZGRlZCBERVZGU19GTF9BVVRPX0RFVk5VTSBmbGFnLgorICB2MC4yMworICAgIDE5OTgwNDMwICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIE5vIGxvbmdlciBzZXQgdW5uZWNlc3NhcnkgbWV0aG9kcy4KKyAgdjAuMjQKKyAgICAxOTk4MDUwNCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBBZGRlZCBQSUQgZGlzcGxheSB0byA8Y2FsbF9rZXJuZWxkPiBkZWJ1Z2dpbmcgbWVzc2FnZS4KKwkgICAgICAgQWRkZWQgImFmdGVyIiBkZWJ1Z2dpbmcgbWVzc2FnZSB0byA8Y2FsbF9rZXJuZWxkPi4KKyAgICAxOTk4MDUxOSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBBZGRlZCAiZGlyZWFkIiBhbmQgImRpd3JpdGUiIGJvb3Qgb3B0aW9ucy4KKyAgICAxOTk4MDUyMCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBGaXhlZCBwZXJzaXN0ZW5jZSBwcm9ibGVtIHdpdGggcGVybWlzc2lvbnMuCisgIHYwLjI1CisgICAgMTk5ODA2MDIgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgU3VwcG9ydCBsZWdhY3kgZGV2aWNlIG5vZGVzLgorCSAgICAgICBGaXhlZCBidWcgd2hlcmUgcmVjcmVhdGVkIGlub2RlcyB3ZXJlIGhpZGRlbi4KKyAgdjAuMjYKKyAgICAxOTk4MDYwMiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBJbXByb3ZlZCBkZWJ1Z2dpbmcgaW4gPGdldF92ZnNfaW5vZGU+LgorICAgIDE5OTgwNjA3ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIE5vIGxvbmdlciBmcmVlIG9sZCBkZW50cmllcyBpbiA8ZGV2ZnNfbWtfZGlyPi4KKwkgICAgICAgRnJlZSBhbGwgZGVudHJpZXMgZm9yIGEgZ2l2ZW4gZW50cnkgd2hlbiBkZWxldGluZyBpbm9kZXMuCisgIHYwLjI3CisgICAgMTk5ODA2MjcgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgTGltaXQgYXV0by1kZXZpY2UgbnVtYmVyaW5nIHRvIG1ham9ycyAxMjggdG8gMjM5LgorICB2MC4yOAorICAgIDE5OTgwNjI5ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEZpeGVkIGlub2RlIHRpbWVzIHBlcnNpc3RlbmNlIHByb2JsZW0uCisgIHYwLjI5CisgICAgMTk5ODA3MDQgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgRml4ZWQgc3BlbGxpbmcgaW4gPGRldmZzX3JlYWRsaW5rPiBkZWJ1Zy4KKwkgICAgICAgRml4ZWQgYnVnIGluIDxkZXZmc19zZXR1cD4gcGFyc2luZyAiZGlsb29rdXAiLgorICB2MC4zMAorICAgIDE5OTgwNzA1ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEZpeGVkIGRldmZzIGlub2RlIGxlYWsgd2hlbiBtYW51YWxseSByZWNyZWF0aW5nIGlub2Rlcy4KKwkgICAgICAgRml4ZWQgcGVybWlzc2lvbiBwZXJzaXN0ZW5jZSBwcm9ibGVtIHdoZW4gcmVjcmVhdGluZyBpbm9kZXMuCisgIHYwLjMxCisgICAgMTk5ODA3MjcgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgUmVtb3ZlZCBoYXJtbGVzcyAidW51c2VkIHZhcmlhYmxlIiBjb21waWxlciB3YXJuaW5nLgorCSAgICAgICBGaXhlZCBtb2RlcyBmb3IgbWFudWFsbHkgcmVjcmVhdGVkIGRldmljZSBub2Rlcy4KKyAgdjAuMzIKKyAgICAxOTk4MDcyOCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBBZGRlZCBOVUxMIGRldmZzIGlub2RlIHdhcm5pbmcgaW4gPGRldmZzX3JlYWRfaW5vZGU+LgorCSAgICAgICBGb3JjZSBhbGwgaW5vZGUgbmxpbmsgdmFsdWVzIHRvIDEuCisgIHYwLjMzCisgICAgMTk5ODA3MzAgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQWRkZWQgImRpbWtub2QiIGJvb3Qgb3B0aW9uLgorCSAgICAgICBTZXQgaW5vZGUgbmxpbmsgdG8gMCB3aGVuIGZyZWVpbmcgZGVudHJpZXMuCisJICAgICAgIEZpeGVkIG1vZGVzIGZvciBtYW51YWxseSByZWNyZWF0ZWQgc3ltbGlua3MuCisgIHYwLjM0CisgICAgMTk5ODA4MDIgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgRml4ZWQgYnVncyBpbiByZWNyZWF0ZWQgZGlyZWN0b3JpZXMgYW5kIHN5bWxpbmtzLgorICB2MC4zNQorICAgIDE5OTgwODA2ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEZpeGVkIGJ1Z3MgaW4gcmVjcmVhdGVkIGRldmljZSBub2Rlcy4KKyAgICAxOTk4MDgwNyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBGaXhlZCBidWcgaW4gY3VycmVudGx5IHVudXNlZCA8ZGV2ZnNfZ2V0X2hhbmRsZV9mcm9tX2lub2RlPi4KKwkgICAgICAgRGVmaW5lZCBuZXcgPGRldmZzX2hhbmRsZV90PiB0eXBlLgorCSAgICAgICBJbXByb3ZlZCBkZWJ1Z2dpbmcgd2hlbiBnZXR0aW5nIGVudHJpZXMuCisJICAgICAgIEZpeGVkIGJ1ZyB3aGVyZSBkaXJlY3RvcmllcyBjb3VsZCBiZSBlbXB0aWVkLgorICB2MC4zNgorICAgIDE5OTgwODA5ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFJlcGxhY2VkIGR1bW15IC5lcG9jaCBpbm9kZSB3aXRoIC5kZXZmc2QgY2hhcmFjdGVyIGRldmljZS4KKyAgICAxOTk4MDgxMCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBJbXBsZW1lbnRlZCBkZXZmc2QgcHJvdG9jb2wgcmV2aXNpb24gMC4KKyAgdjAuMzcKKyAgICAxOTk4MDgxOSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBBZGRlZCBzb290aGluZyBtZXNzYWdlIHRvIHdhcm5pbmcgaW4gPGRldmZzX2RfaXB1dD4uCisgIHYwLjM4CisgICAgMTk5ODA4MjkgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgVXNlIEdDQyBleHRlbnNpb25zIGZvciBzdHJ1Y3R1cmUgaW5pdGlhbGlzYXRpb25zLgorCSAgICAgICBJbXBsZW1lbnRlZCBhc3luYyBvcGVuIG5vdGlmaWNhdGlvbi4KKwkgICAgICAgSW5jcmVtZW50ZWQgZGV2ZnNkIHByb3RvY29sIHJldmlzaW9uIHRvIDEuCisgIHYwLjM5CisgICAgMTk5ODA5MDggICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgTW92ZWQgYXN5bmMgb3BlbiBub3RpZmljYXRpb24gdG8gZW5kIG9mIDxkZXZmc19vcGVuPi4KKyAgdjAuNDAKKyAgICAxOTk4MDkxMCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBQcmVwZW5kZWQgIi9kZXYvIiB0byBtb2R1bGUgbG9hZCByZXF1ZXN0LgorCSAgICAgICBSZW5hbWVkIDxjYWxsX2tlcm5lbGQ+IHRvIDxjYWxsX2ttb2Q+LgorICB2MC40MQorICAgIDE5OTgwOTEwICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEZpeGVkIHR5cG8gIkFZU05DIiAtPiAiQVNZTkMiLgorICB2MC40MgorICAgIDE5OTgwOTEwICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEFkZGVkIG9wZW4gZmxhZyBmb3IgZmlsZXMuCisgIHYwLjQzCisgICAgMTk5ODA5MjcgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgU2V0IGlfYmxvY2tzPTAgYW5kIGlfYmxrc2l6ZT0xMDI0IGluIDxkZXZmc19yZWFkX2lub2RlPi4KKyAgdjAuNDQKKyAgICAxOTk4MTAwNSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBBZGRlZCB0ZXN0IGZvciBlbXB0eSA8PG5hbWU+PiBpbiA8ZGV2ZnNfZmluZF9oYW5kbGU+LgorCSAgICAgICBSZW5hbWVkIDxnZW5lcmF0ZV9wYXRoPiB0byA8ZGV2ZnNfZ2VuZXJhdGVfcGF0aD4gYW5kIHB1Ymxpc2hlZC4KKyAgdjAuNDUKKyAgICAxOTk4MTAwNiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBDcmVhdGVkIDxkZXZmc19nZXRfZm9wcz4uCisgIHYwLjQ2CisgICAgMTk5ODEwMDcgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgTGltaXQgYXV0by1kZXZpY2UgbnVtYmVyaW5nIHRvIG1ham9ycyAxNDQgdG8gMjM5LgorICB2MC40NworICAgIDE5OTgxMDEwICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFVwZGF0ZWQgPGRldmZzX2ZvbGxvd19saW5rPiBmb3IgVkZTIGNoYW5nZSBpbiAyLjEuMTI1LgorICB2MC40OAorICAgIDE5OTgxMDIyICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIENyZWF0ZWQgREVWRlNfIEZMX0NPTVBBVCBmbGFnLgorICB2MC40OQorICAgIDE5OTgxMDIzICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIENyZWF0ZWQgIm5vY29tcGF0IiBib290IG9wdGlvbi4KKyAgdjAuNTAKKyAgICAxOTk4MTAyNSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBSZXBsYWNlZCAibW91bnQiIGJvb3Qgb3B0aW9uIHdpdGggIm5vbW91bnQiLgorICB2MC41MQorICAgIDE5OTgxMTEwICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIENyZWF0ZWQgIm9ubHkiIGJvb3Qgb3B0aW9uLgorICB2MC41MgorICAgIDE5OTgxMTEyICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEFkZGVkIERFVkZTX0ZMX1JFTU9WQUJMRSBmbGFnLgorICB2MC41MworICAgIDE5OTgxMTE0ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIE9ubHkgY2FsbCA8c2Nhbl9kaXJfZm9yX3JlbW92YWJsZT4gb24gZmlyc3QgY2FsbCB0bworCSAgICAgICA8ZGV2ZnNfcmVhZGRpcj4uCisgIHYwLjU0CisgICAgMTk5ODEyMDUgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgVXBkYXRlZCA8ZGV2ZnNfcm1kaXI+IGZvciBWRlMgY2hhbmdlIGluIDIuMS4xMzEuCisgIHYwLjU1CisgICAgMTk5ODEyMTggICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQ3JlYXRlZCA8ZGV2ZnNfbWtfY29tcGF0Pi4KKyAgICAxOTk4MTIyMCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBDaGVjayBmb3IgcGFydGl0aW9ucyBvbiByZW1vdmFibGUgbWVkaWEgaW4gPGRldmZzX2xvb2t1cD4uCisgIHYwLjU2CisgICAgMTk5OTAxMTggICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgcmVnaXN0ZXJpbmcgcmVndWxhciBmaWxlcy4KKwkgICAgICAgQ3JlYXRlZCA8ZGV2ZnNfc2V0X2ZpbGVfc2l6ZT4uCisJICAgICAgIFVwZGF0ZSBkZXZmcyBpbm9kZXMgZnJvbSBlbnRyaWVzIGlmIG5vdCBjaGFuZ2VkIHRocm91Z2ggRlMuCisgIHYwLjU3CisgICAgMTk5OTAxMjQgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgRml4ZWQgPGRldmZzX2ZpbGxfZmlsZT4gdG8gb25seSBpbml0aWFsaXNlIHRlbXBvcmFyeSBpbm9kZXMuCisJICAgICAgIFRyYXAgZm9yIE5VTEwgZm9wcyBpbiA8ZGV2ZnNfcmVnaXN0ZXI+LgorCSAgICAgICBSZXR1cm4gLUVOT0RFViBpbiA8ZGV2ZnNfZmlsbF9maWxlPiBmb3Igbm9uLWRyaXZlciBpbm9kZXMuCisgIHYwLjU4CisgICAgMTk5OTAxMjYgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgU3dpdGNoZWQgZnJvbSBQQVRIX01BWCB0byBERVZGU19QQVRITEVOLgorICB2MC41OQorICAgIDE5OTkwMTI3ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIENyZWF0ZWQgIm5vdHR5Y29tcGF0IiBib290IG9wdGlvbi4KKyAgdjAuNjAKKyAgICAxOTk5MDMxOCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBGaXhlZCA8ZGV2ZnNkX3JlYWQ+IHRvIG5vdCBvdmVycnVuIGV2ZW50IGJ1ZmZlci4KKyAgdjAuNjEKKyAgICAxOTk5MDMyOSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBDcmVhdGVkIDxkZXZmc19hdXRvX3VucmVnaXN0ZXI+LgorICB2MC42MgorICAgIDE5OTkwMzMwICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIERvbid0IHJldHVybiB1bnJlZ2lzdHJlZCBlbnRyaWVzIGluIDxkZXZmc19maW5kX2hhbmRsZT4uCisJICAgICAgIFBhbmljIGluIDxkZXZmc191bnJlZ2lzdGVyPiBpZiBlbnRyeSB1bnJlZ2lzdGVyZWQuCisgICAgMTk5OTA0MDEgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgRG9uJ3QgcGFuaWMgaW4gPGRldmZzX2F1dG9fdW5yZWdpc3Rlcj4gZm9yIGR1cGxpY2F0ZXMuCisgIHYwLjYzCisgICAgMTk5OTA0MDIgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgRG9uJ3QgdW5yZWdpc3RlciBhbHJlYWR5IHVucmVnaXN0ZXJlZCBlbnRyaWVzIGluIDx1bnJlZ2lzdGVyPi4KKyAgdjAuNjQKKyAgICAxOTk5MDUxMCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBEaXNhYmxlIHdhcm5pbmcgbWVzc2FnZXMgd2hlbiB1bmFibGUgdG8gcmVhZCBwYXJ0aXRpb24gdGFibGUgZm9yCisJICAgICAgIHJlbW92YWJsZSBtZWRpYS4KKyAgdjAuNjUKKyAgICAxOTk5MDUxMiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBVcGRhdGVkIDxkZXZmc19sb29rdXA+IGZvciBWRlMgY2hhbmdlIGluIDIuMy4xLXByZTEuCisJICAgICAgIENyZWF0ZWQgIm9vcHMtb24tcGFuaWMiIGJvb3Qgb3B0aW9uLgorCSAgICAgICBJbXByb3ZlZCBkZWJ1Z2dpbmcgaW4gPGRldmZzX3JlZ2lzdGVyPiBhbmQgPGRldmZzX3VucmVnaXN0ZXI+LgorICB2MC42NgorICAgIDE5OTkwNTE5ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEFkZGVkIGRvY3VtZW50YXRpb24gZm9yIHNvbWUgZnVuY3Rpb25zLgorICAgIDE5OTkwNTI1ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFJlbW92ZWQgIm9vcHMtb24tcGFuaWMiIGJvb3Qgb3B0aW9uOiBub3cgYWx3YXlzIE9vcHMuCisgIHYwLjY3CisgICAgMTk5OTA1MzEgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgSW1wcm92ZWQgZGVidWdnaW5nIGluIDxkZXZmc19yZWdpc3Rlcj4uCisgIHYwLjY4CisgICAgMTk5OTA2MDQgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQWRkZWQgImRpdW5saW5rIiBhbmQgIm5va21vZCIgYm9vdCBvcHRpb25zLgorCSAgICAgICBSZW1vdmVkIHN1cGVyZmx1b3VzIHdhcm5pbmcgbWVzc2FnZSBpbiA8ZGV2ZnNfZF9pcHV0Pi4KKyAgdjAuNjkKKyAgICAxOTk5MDYxMSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBUb29rIGFjY291bnQgb2YgY2hhbmdlIHRvIDxkX2FsbG9jX3Jvb3Q+LgorICB2MC43MAorICAgIDE5OTkwNjE0ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIENyZWF0ZWQgc2VwYXJhdGUgZXZlbnQgcXVldWUgZm9yIGVhY2ggbW91bnRlZCBkZXZmcy4KKwkgICAgICAgUmVtb3ZlZCA8ZGV2ZnNfaW52YWxpZGF0ZV9kY2FjaGU+LgorCSAgICAgICBDcmVhdGVkIG5ldyBpb2N0bCgpcy4KKwkgICAgICAgSW5jcmVtZW50ZWQgZGV2ZnNkIHByb3RvY29sIHJldmlzaW9uIHRvIDMuCisJICAgICAgIEZpeGVkIGJ1ZyB3aGVuIHJlLWNyZWF0aW5nIGRpcmVjdG9yaWVzOiBjb250ZW50cyB3ZXJlIGxvc3QuCisJICAgICAgIEJsb2NrIGFjY2VzcyB0byBpbm9kZXMgdW50aWwgZGV2ZnNkIHVwZGF0ZXMgcGVybWlzc2lvbnMuCisgICAgMTk5OTA2MTUgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgU3VwcG9ydCAyLjIueCBrZXJuZWxzLgorICB2MC43MQorICAgIDE5OTkwNjIzICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFN3aXRjaGVkIHRvIHNlbmRpbmcgcHJvY2VzcyB1aWQvZ2lkIHRvIGRldmZzZC4KKwkgICAgICAgUmVuYW1lZCA8Y2FsbF9rbW9kPiB0byA8dHJ5X21vZGxvYWQ+LgorCSAgICAgICBBZGRlZCBERVZGU0RfTk9USUZZX0xPT0tVUCBldmVudC4KKyAgICAxOTk5MDYyNCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBBZGRlZCBERVZGU0RfTk9USUZZX0NIQU5HRSBldmVudC4KKwkgICAgICAgSW5jcmVtZW50ZWQgZGV2ZnNkIHByb3RvY29sIHJldmlzaW9uIHRvIDQuCisgIHYwLjcyCisgICAgMTk5OTA3MTMgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgUmV0dXJuIEVJU0RJUiByYXRoZXIgdGhhbiBFSU5WQUwgZm9yIHJlYWQoMikgb24gZGlyZWN0b3JpZXMuCisgIHYwLjczCisgICAgMTk5OTA4MDkgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQ2hhbmdlZCA8ZGV2ZnNfc2V0dXA+IHRvIG5ldyBfX2luaXQgc2NoZW1lLgorICB2MC43NAorICAgIDE5OTkwOTAxICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIENoYW5nZWQgcmVtYWluaW5nIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyB0byBuZXcgX19pbml0IHNjaGVtZS4KKyAgdjAuNzUKKyAgICAxOTk5MTAxMyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBDcmVhdGVkIDxkZXZmc19nZXRfaW5mbz4sIDxkZXZmc19zZXRfaW5mbz4sCisJICAgICAgIDxkZXZmc19nZXRfZmlyc3RfY2hpbGQ+IGFuZCA8ZGV2ZnNfZ2V0X25leHRfc2libGluZz4uCisJICAgICAgIEFkZGVkIDw8ZGlyPj4gcGFyYW1ldGVyIHRvIDxkZXZmc19yZWdpc3Rlcj4sIDxkZXZmc19ta19jb21wYXQ+LAorCSAgICAgICA8ZGV2ZnNfbWtfZGlyPiBhbmQgPGRldmZzX2ZpbmRfaGFuZGxlPi4KKwkgICAgICAgV29yayBzcG9uc29yZWQgYnkgU0dJLgorICB2MC43NgorICAgIDE5OTkxMDE3ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEFsbG93IG11bHRpcGxlIHVucmVnaXN0cmF0aW9ucy4KKwkgICAgICAgV29yayBzcG9uc29yZWQgYnkgU0dJLgorICB2MC43NworICAgIDE5OTkxMDI2ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEFkZGVkIG1ham9yIGFuZCBtaW5vciBudW1iZXIgdG8gZGV2ZnNkIHByb3RvY29sLgorCSAgICAgICBJbmNyZW1lbnRlZCBkZXZmc2QgcHJvdG9jb2wgcmV2aXNpb24gdG8gNS4KKwkgICAgICAgV29yayBzcG9uc29yZWQgYnkgU0dJLgorICB2MC43OAorICAgIDE5OTkxMDMwICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFN1cHBvcnQgaW5mbyBwb2ludGVyIGZvciBhbGwgZGV2ZnMgZW50cnkgdHlwZXMuCisJICAgICAgIEFkZGVkIDw8aW5mbz4+IHBhcmFtZXRlciB0byA8ZGV2ZnNfbWtfZGlyPiBhbmQKKwkgICAgICAgPGRldmZzX21rX3N5bWxpbms+LgorCSAgICAgICBXb3JrIHNwb25zb3JlZCBieSBTR0kuCisgIHYwLjc5CisgICAgMTk5OTEwMzEgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgU3VwcG9ydCAiLi4vIiB3aGVuIHNlYXJjaGluZyBkZXZmcyBuYW1lc3BhY2UuCisJICAgICAgIFdvcmsgc3BvbnNvcmVkIGJ5IFNHSS4KKyAgdjAuODAKKyAgICAxOTk5MTEwMSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBDcmVhdGVkIDxkZXZmc19nZXRfdW5yZWdpc3Rlcl9zbGF2ZT4uCisJICAgICAgIFdvcmsgc3BvbnNvcmVkIGJ5IFNHSS4KKyAgdjAuODEKKyAgICAxOTk5MTEwMyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBFeHBvcnRlZCA8ZGV2ZnNfZ2V0X3BhcmVudD4uCisJICAgICAgIFdvcmsgc3BvbnNvcmVkIGJ5IFNHSS4KKyAgdjAuODIKKyAgICAxOTk5MTEwNCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgUmVtb3ZlZCB1bnVzZWQgPGRldmZzX3NldF9zeW1saW5rX2Rlc3RpbmF0aW9uPi4KKyAgICAxOTk5MTEwNSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgRG8gbm90IGhpZGUgZW50cmllcyBmcm9tIGRldmZzZCBvciBjaGlsZHJlbi4KKwkgICAgICAgUmVtb3ZlZCBERVZGU18gRkxfVFRZX0NPTVBBVCBmbGFnLgorCSAgICAgICBSZW1vdmVkICJub3R0eWNvbXBhdCIgYm9vdCBvcHRpb24uCisJICAgICAgIFJlbW92ZWQgPGRldmZzX21rX2NvbXBhdD4uCisJICAgICAgIFdvcmsgc3BvbnNvcmVkIGJ5IFNHSS4KKyAgdjAuODMKKyAgICAxOTk5MTEwNyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBBZGRlZCBERVZGU19GTF9XQUlUIGZsYWcuCisJICAgICAgIFdvcmsgc3BvbnNvcmVkIGJ5IFNHSS4KKyAgdjAuODQKKyAgICAxOTk5MTEwNyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBTdXBwb3J0IG5ldyAiZGlzYyIgbmFtaW5nIHNjaGVtZSBpbiA8Z2V0X3JlbW92YWJsZV9wYXJ0aXRpb24+LgorCSAgICAgICBBbGxvdyBOVUxMIGZvcHMgaW4gPGRldmZzX3JlZ2lzdGVyPi4KKwkgICAgICAgV29yayBzcG9uc29yZWQgYnkgU0dJLgorICB2MC44NQorICAgIDE5OTkxMTEwICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEZhbGwgYmFjayB0byBtYWpvciB0YWJsZSBpZiBOVUxMIGZvcHMgZ2l2ZW4gdG8gPGRldmZzX3JlZ2lzdGVyPi4KKwkgICAgICAgV29yayBzcG9uc29yZWQgYnkgU0dJLgorICB2MC44NgorICAgIDE5OTkxMjA0ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFN1cHBvcnQgZmlmb3Mgd2hlbiB1bnJlZ2lzdGVyaW5nLgorCSAgICAgICBXb3JrIHNwb25zb3JlZCBieSBTR0kuCisgIHYwLjg3CisgICAgMTk5OTEyMDkgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgUmVtb3ZlZCBvYnNvbGV0ZSBERVZGU18gRkxfQ09NUEFUIGFuZCBERVZGU18gRkxfVE9MRVJBTlQgZmxhZ3MuCisJICAgICAgIFdvcmsgc3BvbnNvcmVkIGJ5IFNHSS4KKyAgdjAuODgKKyAgICAxOTk5MTIxNCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBSZW1vdmVkIGttb2Qgc3VwcG9ydC4KKwkgICAgICAgV29yayBzcG9uc29yZWQgYnkgU0dJLgorICB2MC44OQorICAgIDE5OTkxMjE2ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEltcHJvdmVkIGRlYnVnZ2luZyBpbiA8Z2V0X3Zmc19pbm9kZT4uCisJICAgICAgIEVuc3VyZSBkZW50cmllcyBjcmVhdGVkIGJ5IGRldmZzZCB3aWxsIGJlIGNsZWFuZWQgdXAuCisJICAgICAgIFdvcmsgc3BvbnNvcmVkIGJ5IFNHSS4KKyAgdjAuOTAKKyAgICAxOTk5MTIyMyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBDcmVhdGVkIDxkZXZmc19nZXRfbmFtZT4uCisJICAgICAgIFdvcmsgc3BvbnNvcmVkIGJ5IFNHSS4KKyAgdjAuOTEKKyAgICAyMDAwMDIwMyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBQb3J0ZWQgdG8ga2VybmVsIDIuMy40Mi4KKwkgICAgICAgUmVtb3ZlZCA8ZGV2ZnNfZmlsbF9maWxlPi4KKwkgICAgICAgV29yayBzcG9uc29yZWQgYnkgU0dJLgorICB2MC45MgorICAgIDIwMDAwMzA2ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEFkZGVkIERFVkZTXyBGTF9OT19QRVJTSVNURU5DRSBmbGFnLgorCSAgICAgICBSZW1vdmVkIHVubmVjZXNzYXJ5IGNhbGwgdG8gPHVwZGF0ZV9kZXZmc19pbm9kZV9mcm9tX2VudHJ5PiBpbgorCSAgICAgICA8ZGV2ZnNfcmVhZGRpcj4uCisJICAgICAgIFdvcmsgc3BvbnNvcmVkIGJ5IFNHSS4KKyAgdjAuOTMKKyAgICAyMDAwMDQxMyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBTZXQgaW5vZGUtPmlfc2l6ZSB0byBjb3JyZWN0IHNpemUgZm9yIHN5bWxpbmtzLgorICAgIDIwMDAwNDE0ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIE9ubHkgZ2l2ZSBsb29rdXAoKSBtZXRob2QgdG8gZGlyZWN0b3JpZXMgdG8gY29tcGx5IHdpdGggbmV3IFZGUworCSAgICAgICBhc3N1bXB0aW9ucy4KKwkgICAgICAgV29yayBzcG9uc29yZWQgYnkgU0dJLgorICAgIDIwMDAwNDE1ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFJlbW92ZSB1bm5lY2Vzc2FyeSB0ZXN0cyBpbiBzeW1saW5rIG1ldGhvZHMuCisJICAgICAgIERvbid0IGtpbGwgZXhpc3RpbmcgYmxvY2sgb3BzIGluIDxkZXZmc19yZWFkX2lub2RlPi4KKwkgICAgICAgV29yayBzcG9uc29yZWQgYnkgU0dJLgorICB2MC45NAorICAgIDIwMDAwNDI0ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIERvbid0IGNyZWF0ZSBtaXNzaW5nIGRpcmVjdG9yaWVzIGluIDxkZXZmc19maW5kX2hhbmRsZT4uCisJICAgICAgIFdvcmsgc3BvbnNvcmVkIGJ5IFNHSS4KKyAgdjAuOTUKKyAgICAyMDAwMDQzMCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBBZGRlZCBDT05GSUdfREVWRlNfTU9VTlQuCisJICAgICAgIFdvcmsgc3BvbnNvcmVkIGJ5IFNHSS4KKyAgdjAuOTYKKyAgICAyMDAwMDYwOCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBEaXNhYmxlZCBtdWx0aS1tb3VudCBjYXBhYmlsaXR5ICh1c2UgVkZTIGJpbmRpbmdzIGluc3RlYWQpLgorCSAgICAgICBXb3JrIHNwb25zb3JlZCBieSBTR0kuCisgIHYwLjk3CisgICAgMjAwMDA2MTAgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgU3dpdGNoZWQgdG8gRlNfU0lOR0xFIHRvIGRpc2FibGUgbXVsdGktbW91bnRzLgorICAgIDIwMDAwNjEyICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFJlbW92ZWQgbW9kdWxlIHN1cHBvcnQuCisJICAgICAgIFJlbW92ZWQgbXVsdGktbW91bnQgY29kZS4KKwkgICAgICAgUmVtb3ZlZCBjb21wYXRpYmlsaXR5IG1hY3JvczogVkZTIGhhcyBjaGFuZ2VkIHRvbyBtdWNoLgorCSAgICAgICBXb3JrIHNwb25zb3JlZCBieSBTR0kuCisgIHYwLjk4CisgICAgMjAwMDA2MTQgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgTWVyZ2VkIGRldmZzIGlub2RlIGludG8gZGV2ZnMgZW50cnkuCisJICAgICAgIFdvcmsgc3BvbnNvcmVkIGJ5IFNHSS4KKyAgdjAuOTkKKyAgICAyMDAwMDYxOSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBSZW1vdmVkIGRlYWQgY29kZSBpbiA8ZGV2ZnNfcmVnaXN0ZXI+IHdoaWNoIHVzZWQgdG8gY2FsbAorCSAgICAgICA8ZnJlZV9kZW50cmllcz4uCisJICAgICAgIFdvcmsgc3BvbnNvcmVkIGJ5IFNHSS4KKyAgdjAuMTAwCisgICAgMjAwMDA2MjEgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQ2hhbmdlZCBpbnRlcmZhY2UgdG8gPGRldmZzX3JlZ2lzdGVyPi4KKwkgICAgICAgV29yayBzcG9uc29yZWQgYnkgU0dJLgorICB2MC4xMDEKKyAgICAyMDAwMDYyMiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBTaW1wbGlmaWVkIGludGVyZmFjZSB0byA8ZGV2ZnNfbWtfc3ltbGluaz4gYW5kIDxkZXZmc19ta19kaXI+LgorCSAgICAgICBTaW1wbGlmaWVkIGludGVyZmFjZSB0byA8ZGV2ZnNfZmluZF9oYW5kbGU+LgorCSAgICAgICBXb3JrIHNwb25zb3JlZCBieSBTR0kuCisgIHYwLjEwMgorICAgIDIwMDEwNTE5ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEVuc3VyZSA8ZGV2ZnNfZ2VuZXJhdGVfcGF0aD4gdGVybWluYXRlcyBzdHJpbmcgZm9yIHJvb3QgZW50cnkuCisJICAgICAgIEV4cG9ydGVkIDxkZXZmc19nZXRfbmFtZT4gdG8gbW9kdWxlcy4KKyAgICAyMDAxMDUyMCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBNYWtlIDxkZXZmc19ta19zeW1saW5rPiBzZW5kIGV2ZW50cyB0byBkZXZmc2QuCisJICAgICAgIENsZWFuZWQgdXAgb3B0aW9uIHByb2Nlc3NpbmcgaW4gPGRldmZzX3NldHVwPi4KKyAgICAyMDAxMDUyMSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBGaXhlZCBidWdzIGluIGhhbmRsaW5nIHN5bWxpbmtzOiBjb3VsZCBsZWFrIG9yIGNhdXNlIE9vcHMuCisgICAgMjAwMTA1MjIgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQ2xlYW5lZCB1cCBkaXJlY3RvcnkgaGFuZGxpbmcgYnkgc2VwYXJhdGluZyBmb3BzLgorICB2MC4xMDMKKyAgICAyMDAxMDYwMSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBGaXhlZCBoYW5kbGluZyBvZiBpbnZlcnRlZCBvcHRpb25zIGluIDxkZXZmc19zZXR1cD4uCisgIHYwLjEwNAorICAgIDIwMDEwNjA0ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEFkanVzdGVkIDx0cnlfbW9kbG9hZD4gdG8gYWNjb3VudCBmb3IgPGRldmZzX2dlbmVyYXRlX3BhdGg+IGZpeC4KKyAgdjAuMTA1CisgICAgMjAwMTA2MTcgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQW5zd2VyZWQgcXVlc3Rpb24gcG9zZWQgYnkgQWwgVmlybyBhbmQgcmVtb3ZlZCBoaXMgY29tbWVudHMuCisJICAgICAgIE1vdmVkIHNldHRpbmcgb2YgcmVnaXN0ZXJlZCBmbGFnIGFmdGVyIG90aGVyIGZpZWxkcyBhcmUgY2hhbmdlZC4KKwkgICAgICAgRml4ZWQgcmFjZSBiZXR3ZWVuIDxkZXZmc2RfY2xvc2U+IGFuZCA8ZGV2ZnNkX25vdGlmeV9vbmU+LgorCSAgICAgICBHbG9iYWwgVkZTIGNoYW5nZXMgYWRkZWQgYm9ndXMgQktMIHRvIDxkZXZmc2RfY2xvc2U+OiByZW1vdmVkLgorCSAgICAgICBXaWRlbmVkIGxvY2tpbmcgaW4gPGRldmZzX3JlYWRsaW5rPiBhbmQgPGRldmZzX2ZvbGxvd19saW5rPi4KKwkgICAgICAgUmVwbGFjZWQgPGRldmZzZF9yZWFkPiBzdGFjayB1c2FnZSB3aXRoIDxkZXZmc2RfaW9jdGw+IGttYWxsb2MuCisJICAgICAgIFNpbXBsaWZpZWQgbG9ja2luZyBpbiA8ZGV2ZnNkX2lvY3RsPiBhbmQgZml4ZWQgbWVtb3J5IGxlYWsuCisgIHYwLjEwNgorICAgIDIwMDEwNzA5ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFJlbW92ZWQgYnJva2VuIGRldm51bSBhbGxvY2F0aW9uIGFuZCB1c2UgPGRldmZzX2FsbG9jX2Rldm51bT4uCisJICAgICAgIEZpeGVkIG9sZCBkZXZudW0gbGVhayBieSBjYWxsaW5nIG5ldyA8ZGV2ZnNfZGVhbGxvY19kZXZudW0+LgorICB2MC4xMDcKKyAgICAyMDAxMDcxMiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBGaXhlZCBidWcgaW4gPGRldmZzX3NldHVwPiB3aGljaCBjb3VsZCBoYW5nIGJvb3QgcHJvY2Vzcy4KKyAgdjAuMTA4CisgICAgMjAwMTA3MzAgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQWRkZWQgREVWRlNEX05PVElGWV9ERUxFVEUgZXZlbnQuCisgICAgMjAwMTA4MDEgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgUmVtb3ZlZCAjaW5jbHVkZSA8YXNtL3NlZ21lbnQuaD4uCisgIHYwLjEwOQorICAgIDIwMDEwODA3ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEZpeGVkIGlub2RlIHRhYmxlIHJhY2VzIGJ5IHJlbW92aW5nIGl0IGFuZCB1c2luZworCSAgICAgICBpbm9kZS0+dS5nZW5lcmljX2lwIGluc3RlYWQuCisJICAgICAgIE1vdmVkIDxkZXZmc19yZWFkX2lub2RlPiBpbnRvIDxnZXRfdmZzX2lub2RlPi4KKwkgICAgICAgTW92ZWQgPGRldmZzX3dyaXRlX2lub2RlPiBpbnRvIDxkZXZmc19ub3RpZnlfY2hhbmdlPi4KKyAgdjAuMTEwCisgICAgMjAwMTA4MDggICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgRml4ZWQgcmFjZSBpbiA8ZGV2ZnNfZG9fc3ltbGluaz4gZm9yIHVuaS1wcm9jZXNzb3IuCisgIHYwLjExMQorICAgIDIwMDEwODE4ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFJlbW92ZWQgcmVtbmFudCBvZiBtdWx0aS1tb3VudCBzdXBwb3J0IGluIDxkZXZmc19ta25vZD4uCisgICAgICAgICAgICAgICBSZW1vdmVkIHVudXNlZCBERVZGU19GTF9TSE9XX1VOUkVHIGZsYWcuCisgIHYwLjExMgorICAgIDIwMDEwODIwICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFJlbW92ZWQgbmxpbmsgZmllbGQgZnJvbSBzdHJ1Y3QgZGV2ZnNfaW5vZGUuCisgIHYwLjExMworICAgIDIwMDEwODIzICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFJlcGxhY2VkIEJLTCB3aXRoIGdsb2JhbCByd3NlbSB0byBwcm90ZWN0IHN5bWxpbmsgZGF0YSAocXVpY2sKKwkgICAgICAgYW5kIGRpcnR5IGhhY2spLgorICB2MC4xMTQKKyAgICAyMDAxMDgyNyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBSZXBsYWNlZCBnbG9iYWwgcndzZW0gZm9yIHN5bWxpbmsgd2l0aCBwZXItbGluayByZWZjb3VudC4KKyAgdjAuMTE1CisgICAgMjAwMTA5MTkgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgU2V0IGlub2RlLT5pX21hcHBpbmctPmFfb3BzIGZvciBibG9jayBub2RlcyBpbiA8Z2V0X3Zmc19pbm9kZT4uCisgIHYwLjExNgorICAgIDIwMDExMDA4ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEZpeGVkIG92ZXJydW4gaW4gPGRldmZzX2xpbms+IGJ5IHJlbW92aW5nIGZ1bmN0aW9uIChub3QgbmVlZGVkKS4KKyAgICAyMDAxMTAwOSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBGaXhlZCBidWZmZXIgdW5kZXJydW4gaW4gPHRyeV9tb2Rsb2FkPi4KKyAgICAyMDAxMTAyOSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBGaXhlZCByYWNlIGluIDxkZXZmc2RfaW9jdGw+IHdoZW4gc2V0dGluZyBldmVudCBtYXNrLgorICAgIDIwMDExMTE0ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEZpcnN0IHJlbGVhc2Ugb2YgbmV3IGxvY2tpbmcgY29kZS4KKyAgdjEuMAorICAgIDIwMDExMTE3ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIERpc2NhcmQgdGVtcG9yYXJ5IGJ1ZmZlciwgbm93IHVzZSAiJXMiIGZvciBkZW50cnkgbmFtZXMuCisgICAgMjAwMTExMTggICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgRG9uJ3QgZ2VuZXJhdGUgcGF0aCBpbiA8dHJ5X21vZGxvYWQ+OiB1c2UgZmFrZSBlbnRyeSBpbnN0ZWFkLgorCSAgICAgICBVc2UgImV4aXN0aW5nIiBkaXJlY3RvcnkgaW4gPF9kZXZmc19tYWtlX3BhcmVudF9mb3JfbGVhZj4uCisgICAgMjAwMTExMjIgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgVXNlIHNsYWIgY2FjaGUgcmF0aGVyIHRoYW4gZml4ZWQgYnVmZmVyIGZvciBkZXZmc2QgZXZlbnRzLgorICB2MS4xCisgICAgMjAwMTExMjUgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgU2VuZCBERVZGU0RfTk9USUZZX1JFR0lTVEVSRUQgZXZlbnRzIGluIDxkZXZmc19ta19kaXI+LgorICAgIDIwMDExMTI3ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEZpeGVkIGxvY2tpbmcgYnVnIGluIDxkZXZmc19kX3JldmFsaWRhdGVfd2FpdD4gZHVlIHRvIHR5cG8uCisJICAgICAgIERvIG5vdCBzZW5kIENSRUFURSwgQ0hBTkdFLCBBU1lOQ19PUEVOIG9yIERFTEVURSBldmVudHMgZnJvbQorCSAgICAgICBkZXZmc2Qgb3IgY2hpbGRyZW4uCisgIHYxLjIKKyAgICAyMDAxMTIwMiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBGaXhlZCBidWcgaW4gPGRldmZzZF9yZWFkPjogd2FzIGRlcmVmZXJlbmNpbmcgZnJlZWQgcG9pbnRlci4KKyAgdjEuMworICAgIDIwMDExMjAzICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEZpeGVkIGJ1ZyBpbiA8ZGV2ZnNkX2Nsb3NlPjogd2FzIGRlcmVmZXJlbmNpbmcgZnJlZWQgcG9pbnRlci4KKwkgICAgICAgQWRkZWQgcHJvY2VzcyBncm91cCBjaGVjayBmb3IgZGV2ZnNkIHByaXZpbGVnZXMuCisgIHYxLjQKKyAgICAyMDAxMTIwNCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBVc2UgU0xBQl9BVE9NSUMgaW4gPGRldmZzZF9ub3RpZnlfZGU+IGZyb20gPGRldmZzX2RfZGVsZXRlPi4KKyAgdjEuNQorICAgIDIwMDExMjExICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFJldHVybiBvbGQgZW50cnkgaW4gPGRldmZzX21rX2Rpcj4gZm9yIDIuNC54IGtlcm5lbHMuCisgICAgMjAwMTEyMTIgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgSW5jcmVtZW50IHJlZmNvdW50IG9uIG1vZHVsZSBpbiA8Y2hlY2tfZGlzY19jaGFuZ2VkPi4KKyAgICAyMDAxMTIxNSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBDcmVhdGVkIDxkZXZmc19nZXRfaGFuZGxlPiBhbmQgZXhwb3J0ZWQgPGRldmZzX3B1dD4uCisJICAgICAgIEluY3JlbWVudCByZWZjb3VudCBvbiBtb2R1bGUgaW4gPGRldmZzX2dldF9vcHM+LgorCSAgICAgICBDcmVhdGVkIDxkZXZmc19wdXRfb3BzPi4KKyAgdjEuNgorICAgIDIwMDExMjE2ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEFkZGVkIHBvaXNvbmluZyB0byA8ZGV2ZnNfcHV0Pi4KKwkgICAgICAgSW1wcm92ZWQgZGVidWdnaW5nIG1lc3NhZ2VzLgorICB2MS43CisgICAgMjAwMTEyMjEgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQ29ycmVjdGVkIChtYWRlIHVzZWZ1bCkgZGVidWdnaW5nIG1lc3NhZ2UgaW4gPHVucmVnaXN0ZXI+LgorCSAgICAgICBNb3ZlZCA8a21lbV9jYWNoZV9jcmVhdGU+IGluIDxtb3VudF9kZXZmc19mcz4gdG8gPGluaXRfZGV2ZnNfZnM+CisgICAgMjAwMTEyMjQgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQWRkZWQgbWFnaWMgbnVtYmVyIHRvIGd1YXJkIGFnYWluc3Qgc2NyaWJibGluZyBkcml2ZXJzLgorICAgIDIwMDExMjI2ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIE9ubHkgcmV0dXJuIG9sZCBlbnRyeSBpbiA8ZGV2ZnNfbWtfZGlyPiBpZiBhIGRpcmVjdG9yeS4KKwkgICAgICAgRGVmaW5lZCBtYWNyb3MgZm9yIGVycm9yIGFuZCBkZWJ1ZyBtZXNzYWdlcy4KKyAgdjEuOAorICAgIDIwMDIwMTEzICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEZpeGVkIChyYXJlLCBvbGQpIHJhY2UgaW4gPGRldmZzX2xvb2t1cD4uCisgIHYxLjkKKyAgICAyMDAyMDEyMCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBGaXhlZCBkZWFkbG9jayBidWcgaW4gPGRldmZzX2RfcmV2YWxpZGF0ZV93YWl0Pi4KKwkgICAgICAgVGFnIFZGUyBkZWxldGFibGUgaW4gPGRldmZzX21rX3N5bWxpbms+IGlmIGhhbmRsZSBpZ25vcmVkLgorICB2MS4xMAorICAgIDIwMDIwMTI5ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEFkZGVkIEtFUk5fKiB0byByZW1haW5pbmcgbWVzc2FnZXMuCisJICAgICAgIENsZWFuZWQgdXAgZGVjbGFyYXRpb24gb2YgPHN0YXRfcmVhZD4uCisgIHYxLjExCisgICAgMjAwMjAyMTkgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQ2hhbmdlZCA8ZGV2ZnNfcm1kaXI+IHRvIGFsbG93IGxhdGVyIGFkZGl0aW9ucyBpZiBub3QgeWV0IGVtcHR5LgorICB2MS4xMgorICAgIDIwMDIwNDA2ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFJlbW92ZWQgc2lsZW50bHkgaW50cm9kdWNlZCBjYWxscyB0byBsb2NrX2tlcm5lbCgpIGFuZAorCSAgICAgICB1bmxvY2tfa2VybmVsKCkgZHVlIHRvIHJlY2VudCBWRlMgbG9ja2luZyBjaGFuZ2VzLiBCS0wgaXNuJ3QKKwkgICAgICAgcmVxdWlyZWQgaW4gZGV2ZnMuCisgIHYxLjEzCisgICAgMjAwMjA0MjggICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgUmVtb3ZlZCAyLjQueCBjb21wYXRpYmlsaXR5IGNvZGUuCisgIHYxLjE0CisgICAgMjAwMjA1MTAgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQWRkZWQgQktMIHRvIDxkZXZmc19vcGVuPiBiZWNhdXNlIGRyaXZlcnMgc3RpbGwgbmVlZCBpdC4KKyAgdjEuMTUKKyAgICAyMDAyMDUxMiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBQcm90ZWN0ZWQgPHNjYW5fZGlyX2Zvcl9yZW1vdmFibGU+IGFuZCA8Z2V0X3JlbW92YWJsZV9wYXJ0aXRpb24+CisJICAgICAgIGZyb20gY2hhbmdpbmcgZGlyZWN0b3J5IGNvbnRlbnRzLgorICB2MS4xNgorICAgIDIwMDIwNTE0ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIE1pbm9yIGNsZWFudXAgb2YgPHNjYW5fZGlyX2Zvcl9yZW1vdmFibGU+LgorICB2MS4xNworICAgIDIwMDIwNzIxICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIFN3aXRjaGVkIHRvIElTTyBDIHN0cnVjdHVyZSBmaWVsZCBpbml0aWFsaXNlcnMuCisJICAgICAgIFN3aXRjaCB0byBzZXRfY3VycmVudF9zdGF0ZSgpIGFuZCBtb3ZlIGJlZm9yZSBhZGRfd2FpdF9xdWV1ZSgpLgorICAgIDIwMDIwNzIyICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisJICAgICAgIEZpeGVkIGRldmZzIGVudHJ5IGxlYWsgaW4gPGRldmZzX3JlYWRkaXI+IHdoZW4gKnJlYWRkaXIgZmFpbHMuCisgIHYxLjE4CisgICAgMjAwMjA3MjUgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgQ3JlYXRlZCA8ZGV2ZnNfZmluZF9hbmRfdW5yZWdpc3Rlcj4uCisgIHYxLjE5CisgICAgMjAwMjA3MjggICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgUmVtb3ZlZCBkZXByZWNhdGVkIDxkZXZmc19maW5kX2hhbmRsZT4uCisgIHYxLjIwCisgICAgMjAwMjA4MjAgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKwkgICAgICAgRml4ZWQgbW9kdWxlIHVubG9hZCByYWNlIGluIDxkZXZmc19vcGVuPi4KKyAgdjEuMjEKKyAgICAyMDAyMTAxMyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorCSAgICAgICBSZW1vdmVkIERFVkZTXyBGTF9BVVRPX09XTkVSLgorCSAgICAgICBTd2l0Y2hlZCBsaW5nZXJpbmcgc3RydWN0dXJlIGZpZWxkIGluaXRpYWxpc2VyIHRvIElTTyBDLgorCSAgICAgICBBZGRlZCBsb2NraW5nIHdoZW4gdXBkYXRpbmcgRkNCIGZsYWdzLgorICB2MS4yMgorKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZmc19mc19rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorCisjZGVmaW5lIERFVkZTX1ZFUlNJT04gICAgICAgICAgICAiMjAwNC0wMS0zMSIKKworI2RlZmluZSBERVZGU19OQU1FICJkZXZmcyIKKworI2RlZmluZSBGSVJTVF9JTk9ERSAxCisKKyNkZWZpbmUgU1RSSU5HX0xFTkdUSCAyNTYKKyNkZWZpbmUgRkFLRV9CTE9DS19TSVpFIDEwMjQKKyNkZWZpbmUgUE9JU09OX1BUUiAoICoodm9pZCAqKikgcG9pc29uX2FycmF5ICkKKyNkZWZpbmUgTUFHSUNfVkFMVUUgMHgzMjdkYjgyMworCisjaWZuZGVmIFRSVUUKKyMgIGRlZmluZSBUUlVFIDEKKyMgIGRlZmluZSBGQUxTRSAwCisjZW5kaWYKKworI2RlZmluZSBNT0RFX0RJUiAoU19JRkRJUiB8IFNfSVdVU1IgfCBTX0lSVUdPIHwgU19JWFVHTykKKworI2RlZmluZSBERUJVR19OT05FICAgICAgICAgMHgwMDAwMDAwCisjZGVmaW5lIERFQlVHX01PRFVMRV9MT0FEICAweDAwMDAwMDEKKyNkZWZpbmUgREVCVUdfUkVHSVNURVIgICAgIDB4MDAwMDAwMgorI2RlZmluZSBERUJVR19VTlJFR0lTVEVSICAgMHgwMDAwMDA0CisjZGVmaW5lIERFQlVHX0ZSRUUgICAgICAgICAweDAwMDAwMDgKKyNkZWZpbmUgREVCVUdfU0VUX0ZMQUdTICAgIDB4MDAwMDAxMAorI2RlZmluZSBERUJVR19TX1JFQUQgICAgICAgMHgwMDAwMTAwCS8qICBCcmVhayAgKi8KKyNkZWZpbmUgREVCVUdfSV9MT09LVVAgICAgIDB4MDAwMTAwMAkvKiAgQnJlYWsgICovCisjZGVmaW5lIERFQlVHX0lfQ1JFQVRFICAgICAweDAwMDIwMDAKKyNkZWZpbmUgREVCVUdfSV9HRVQgICAgICAgIDB4MDAwNDAwMAorI2RlZmluZSBERUJVR19JX0NIQU5HRSAgICAgMHgwMDA4MDAwCisjZGVmaW5lIERFQlVHX0lfVU5MSU5LICAgICAweDAwMTAwMDAKKyNkZWZpbmUgREVCVUdfSV9STElOSyAgICAgIDB4MDAyMDAwMAorI2RlZmluZSBERUJVR19JX0ZMSU5LICAgICAgMHgwMDQwMDAwCisjZGVmaW5lIERFQlVHX0lfTUtOT0QgICAgICAweDAwODAwMDAKKyNkZWZpbmUgREVCVUdfRl9SRUFERElSICAgIDB4MDEwMDAwMAkvKiAgQnJlYWsgICovCisjZGVmaW5lIERFQlVHX0RfREVMRVRFICAgICAweDEwMDAwMDAJLyogIEJyZWFrICAqLworI2RlZmluZSBERUJVR19EX1JFTEVBU0UgICAgMHgyMDAwMDAwCisjZGVmaW5lIERFQlVHX0RfSVBVVCAgICAgICAweDQwMDAwMDAKKyNkZWZpbmUgREVCVUdfQUxMICAgICAgICAgIDB4ZmZmZmZmZgorI2RlZmluZSBERUJVR19ESVNBQkxFRCAgICAgREVCVUdfTk9ORQorCisjZGVmaW5lIE9QVElPTl9OT05FICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgT1BUSU9OX01PVU5UICAgICAgICAgICAgMHgwMQorCisjZGVmaW5lIFBSSU5USyhmb3JtYXQsIGFyZ3MuLi4pIFwKKyAgIHtwcmludGsgKEtFUk5fRVJSICIlcyIgZm9ybWF0LCBfX0ZVTkNUSU9OX18gLCAjIyBhcmdzKTt9CisKKyNkZWZpbmUgT09QUyhmb3JtYXQsIGFyZ3MuLi4pIFwKKyAgIHtwcmludGsgKEtFUk5fQ1JJVCAiJXMiIGZvcm1hdCwgX19GVU5DVElPTl9fICwgIyMgYXJncyk7IFwKKyAgICBwcmludGsgKCJGb3JjaW5nIE9vcHNcbiIpOyBcCisgICAgQlVHKCk7fQorCisjaWZkZWYgQ09ORklHX0RFVkZTX0RFQlVHCisjICBkZWZpbmUgVkVSSUZZX0VOVFJZKGRlKSBcCisgICB7aWYgKChkZSkgJiYgKGRlKS0+bWFnaWNfbnVtYmVyICE9IE1BR0lDX1ZBTFVFKSBcCisgICAgICAgIE9PUFMgKCIoJXApOiBiYWQgbWFnaWMgdmFsdWU6ICV4XG4iLCAoZGUpLCAoZGUpLT5tYWdpY19udW1iZXIpO30KKyMgIGRlZmluZSBXUklURV9FTlRSWV9NQUdJQyhkZSxtYWdpYykgKGRlKS0+bWFnaWNfbnVtYmVyID0gKG1hZ2ljKQorIyAgZGVmaW5lIERQUklOVEsoZmxhZywgZm9ybWF0LCBhcmdzLi4uKSBcCisgICB7aWYgKGRldmZzX2RlYnVnICYgZmxhZykgXAorCXByaW50ayAoS0VSTl9JTkZPICIlcyIgZm9ybWF0LCBfX0ZVTkNUSU9OX18gLCAjIyBhcmdzKTt9CisjZWxzZQorIyAgZGVmaW5lIFZFUklGWV9FTlRSWShkZSkKKyMgIGRlZmluZSBXUklURV9FTlRSWV9NQUdJQyhkZSxtYWdpYykKKyMgIGRlZmluZSBEUFJJTlRLKGZsYWcsIGZvcm1hdCwgYXJncy4uLikKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBkZXZmc19lbnRyeSAqZGV2ZnNfaGFuZGxlX3Q7CisKK3N0cnVjdCBkaXJlY3RvcnlfdHlwZSB7CisJcndsb2NrX3QgbG9jazsJCS8qICBMb2NrIGZvciBzZWFyY2hpbmcoUikvdXBkYXRpbmcoVykgICAqLworCXN0cnVjdCBkZXZmc19lbnRyeSAqZmlyc3Q7CisJc3RydWN0IGRldmZzX2VudHJ5ICpsYXN0OworCXVuc2lnbmVkIGNoYXIgbm9fbW9yZV9hZGRpdGlvbnM6MTsKK307CisKK3N0cnVjdCBzeW1saW5rX3R5cGUgeworCXVuc2lnbmVkIGludCBsZW5ndGg7CS8qICBOb3QgaW5jbHVkaW5nIHRoZSBOVUxMLXRlcm1pbWF0b3IgICAgICAgKi8KKwljaGFyICpsaW5rbmFtZTsJCS8qICBUaGlzIGlzIE5VTEwtdGVybWluYXRlZCAgICAgICAgICAgICAgICAgKi8KK307CisKK3N0cnVjdCBkZXZmc19pbm9kZSB7CQkvKiAgVGhpcyBzdHJ1Y3R1cmUgaXMgZm9yICJwZXJzaXN0ZW50IiBpbm9kZSBzdG9yYWdlICAqLworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwlzdHJ1Y3QgdGltZXNwZWMgYXRpbWU7CisJc3RydWN0IHRpbWVzcGVjIG10aW1lOworCXN0cnVjdCB0aW1lc3BlYyBjdGltZTsKKwl1bnNpZ25lZCBpbnQgaW5vOwkvKiAgSW5vZGUgbnVtYmVyIGFzIHNlZW4gaW4gdGhlIFZGUyAgICAgICAgICovCisJdWlkX3QgdWlkOworCWdpZF90IGdpZDsKK307CisKK3N0cnVjdCBkZXZmc19lbnRyeSB7CisjaWZkZWYgQ09ORklHX0RFVkZTX0RFQlVHCisJdW5zaWduZWQgaW50IG1hZ2ljX251bWJlcjsKKyNlbmRpZgorCXZvaWQgKmluZm87CisJYXRvbWljX3QgcmVmY291bnQ7CS8qICBXaGVuIHRoaXMgZHJvcHMgdG8gemVybywgaXQncyB1bnVzZWQgICAgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCBkaXJlY3RvcnlfdHlwZSBkaXI7CisJCWRldl90IGRldjsKKwkJc3RydWN0IHN5bWxpbmtfdHlwZSBzeW1saW5rOworCQljb25zdCBjaGFyICpuYW1lOwkvKiAgT25seSB1c2VkIGZvciAobW9kZSA9PSAwKSAgICAgICAgICAgICAgICovCisJfSB1OworCXN0cnVjdCBkZXZmc19lbnRyeSAqcHJldjsJLyogIFByZXZpb3VzIGVudHJ5IGluIHRoZSBwYXJlbnQgZGlyZWN0b3J5ICAqLworCXN0cnVjdCBkZXZmc19lbnRyeSAqbmV4dDsJLyogIE5leHQgZW50cnkgaW4gdGhlIHBhcmVudCBkaXJlY3RvcnkgICAgICAqLworCXN0cnVjdCBkZXZmc19lbnRyeSAqcGFyZW50OwkvKiAgVGhlIHBhcmVudCBkaXJlY3RvcnkgICAgICAgICAgICAgICAgICAgICovCisJc3RydWN0IGRldmZzX2lub2RlIGlub2RlOworCXVtb2RlX3QgbW9kZTsKKwl1bnNpZ25lZCBzaG9ydCBuYW1lbGVuOwkvKiAgSSB0aGluayA2NGsrIGZpbGVuYW1lcyBhcmUgYSB3YXkgb2ZmLi4uICovCisJdW5zaWduZWQgY2hhciB2ZnM6MTsJLyogIFdoZXRoZXIgdGhlIFZGUyBtYXkgZGVsZXRlIHRoZSBlbnRyeSAgICovCisJY2hhciBuYW1lWzFdOwkJLyogIFRoaXMgaXMganVzdCBhIGR1bW15OiB0aGUgYWxsb2NhdGVkIGFycmF5CisJCQkJICAgaXMgYmlnZ2VyLiBUaGlzIGlzIE5VTEwtdGVybWluYXRlZCAgICAgICovCit9OworCisvKiAgVGhlIHJvb3Qgb2YgdGhlIGRldmljZSB0cmVlICAqLworc3RhdGljIHN0cnVjdCBkZXZmc19lbnRyeSAqcm9vdF9lbnRyeTsKKworc3RydWN0IGRldmZzZF9idWZfZW50cnkgeworCXN0cnVjdCBkZXZmc19lbnRyeSAqZGU7CS8qICBUaGUgbmFtZSBpcyBnZW5lcmF0ZWQgd2l0aCB0aGlzICAgICAgICAgKi8KKwl1bnNpZ25lZCBzaG9ydCB0eXBlOwkvKiAgVGhlIHR5cGUgb2YgZXZlbnQgICAgICAgICAgICAgICAgICAgICAgICovCisJdW1vZGVfdCBtb2RlOworCXVpZF90IHVpZDsKKwlnaWRfdCBnaWQ7CisJc3RydWN0IGRldmZzZF9idWZfZW50cnkgKm5leHQ7Cit9OworCitzdHJ1Y3QgZnNfaW5mbyB7CQkvKiAgVGhpcyBzdHJ1Y3R1cmUgaXMgZm9yIHRoZSBtb3VudGVkIGRldmZzICAqLworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJc3BpbmxvY2tfdCBkZXZmc2RfYnVmZmVyX2xvY2s7CS8qICBMb2NrIHdoZW4gaW5zZXJ0aW5nL2RlbGV0aW5nIGV2ZW50cyAgKi8KKwlzdHJ1Y3QgZGV2ZnNkX2J1Zl9lbnRyeSAqZGV2ZnNkX2ZpcnN0X2V2ZW50OworCXN0cnVjdCBkZXZmc2RfYnVmX2VudHJ5ICpkZXZmc2RfbGFzdF9ldmVudDsKKwl2b2xhdGlsZSBpbnQgZGV2ZnNkX3NsZWVwaW5nOworCXZvbGF0aWxlIHN0cnVjdCB0YXNrX3N0cnVjdCAqZGV2ZnNkX3Rhc2s7CisJdm9sYXRpbGUgcGlkX3QgZGV2ZnNkX3BncnA7CisJdm9sYXRpbGUgc3RydWN0IGZpbGUgKmRldmZzZF9maWxlOworCXN0cnVjdCBkZXZmc2Rfbm90aWZ5X3N0cnVjdCAqZGV2ZnNkX2luZm87CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBkZXZmc2RfZXZlbnRfbWFzazsKKwlhdG9taWNfdCBkZXZmc2Rfb3ZlcnJ1bl9jb3VudDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBkZXZmc2Rfd2FpdF9xdWV1ZTsJLyogIFdha2UgZGV2ZnNkIG9uIGlucHV0ICAgICAgICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgcmV2YWxpZGF0ZV93YWl0X3F1ZXVlOwkvKiAgV2FrZSB3aGVuIGRldmZzZCBzbGVlcHMgICAgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgZnNfaW5mbyBmc19pbmZvID0gey5kZXZmc2RfYnVmZmVyX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQgfTsKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKmRldmZzZF9idWZfY2FjaGU7CisjaWZkZWYgQ09ORklHX0RFVkZTX0RFQlVHCitzdGF0aWMgdW5zaWduZWQgaW50IGRldmZzX2RlYnVnX2luaXQgX19pbml0ZGF0YSA9IERFQlVHX05PTkU7CitzdGF0aWMgdW5zaWduZWQgaW50IGRldmZzX2RlYnVnID0gREVCVUdfTk9ORTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soc3RhdF9sb2NrKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3RhdF9udW1fZW50cmllczsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3RhdF9udW1fYnl0ZXM7CisjZW5kaWYKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBvaXNvbl9hcnJheVs4XSA9CisgICAgeyAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhLCAweDVhIH07CisKKyNpZmRlZiBDT05GSUdfREVWRlNfTU9VTlQKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYm9vdF9vcHRpb25zID0gT1BUSU9OX01PVU5UOworI2Vsc2UKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYm9vdF9vcHRpb25zID0gT1BUSU9OX05PTkU7CisjZW5kaWYKKworLyogIEZvcndhcmQgZnVuY3Rpb24gZGVjbGFyYXRpb25zICAqLworc3RhdGljIGRldmZzX2hhbmRsZV90IF9kZXZmc193YWxrX3BhdGgoc3RydWN0IGRldmZzX2VudHJ5ICpkaXIsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLAorCQkJCSAgICAgICBpbnQgdHJhdmVyc2Vfc3ltbGluayk7CitzdGF0aWMgc3NpemVfdCBkZXZmc2RfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwKKwkJCSAgIGxvZmZfdCAqIHBwb3MpOworc3RhdGljIGludCBkZXZmc2RfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgaW50IGRldmZzZF9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CisjaWZkZWYgQ09ORklHX0RFVkZTX0RFQlVHCitzdGF0aWMgc3NpemVfdCBzdGF0X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBsZW4sCisJCQkgbG9mZl90ICogcHBvcyk7CitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzdGF0X2ZvcHMgPSB7CisJLm9wZW4gPSBub25zZWVrYWJsZV9vcGVuLAorCS5yZWFkID0gc3RhdF9yZWFkLAorfTsKKyNlbmRpZgorCisvKiAgRGV2ZnMgZGFlbW9uIGZpbGUgb3BlcmF0aW9ucyAgKi8KK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRldmZzZF9mb3BzID0geworCS5vcGVuID0gbm9uc2Vla2FibGVfb3BlbiwKKwkucmVhZCA9IGRldmZzZF9yZWFkLAorCS5pb2N0bCA9IGRldmZzZF9pb2N0bCwKKwkucmVsZWFzZSA9IGRldmZzZF9jbG9zZSwKK307CisKKy8qICBTdXBwb3J0IGZ1bmN0aW9ucyBmb2xsb3cgICovCisKKy8qKgorICoJZGV2ZnNfZ2V0IC0gR2V0IGEgcmVmZXJlbmNlIHRvIGEgZGV2ZnMgZW50cnkuCisgKglAZGU6ICBUaGUgZGV2ZnMgZW50cnkuCisgKi8KKworc3RhdGljIHN0cnVjdCBkZXZmc19lbnRyeSAqZGV2ZnNfZ2V0KHN0cnVjdCBkZXZmc19lbnRyeSAqZGUpCit7CisJVkVSSUZZX0VOVFJZKGRlKTsKKwlpZiAoZGUpCisJCWF0b21pY19pbmMoJmRlLT5yZWZjb3VudCk7CisJcmV0dXJuIGRlOworfQkJCQkvKiAgRW5kIEZ1bmN0aW9uIGRldmZzX2dldCAgKi8KKworLyoqCisgKglkZXZmc19wdXQgLSBQdXQgKHJlbGVhc2UpIGEgcmVmZXJlbmNlIHRvIGEgZGV2ZnMgZW50cnkuCisgKglAZGU6ICBUaGUgaGFuZGxlIHRvIHRoZSBkZXZmcyBlbnRyeS4KKyAqLworCitzdGF0aWMgdm9pZCBkZXZmc19wdXQoZGV2ZnNfaGFuZGxlX3QgZGUpCit7CisJaWYgKCFkZSkKKwkJcmV0dXJuOworCVZFUklGWV9FTlRSWShkZSk7CisJaWYgKGRlLT5pbmZvID09IFBPSVNPTl9QVFIpCisJCU9PUFMoIiglcCk6IHBvaXNvbmVkIHBvaW50ZXJcbiIsIGRlKTsKKwlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJmRlLT5yZWZjb3VudCkpCisJCXJldHVybjsKKwlpZiAoZGUgPT0gcm9vdF9lbnRyeSkKKwkJT09QUygiKCVwKTogcm9vdCBlbnRyeSBiZWluZyBmcmVlZFxuIiwgZGUpOworCURQUklOVEsoREVCVUdfRlJFRSwgIiglcyk6IGRlOiAlcCwgcGFyZW50OiAlcCBcIiVzXCJcbiIsCisJCWRlLT5uYW1lLCBkZSwgZGUtPnBhcmVudCwKKwkJZGUtPnBhcmVudCA/IGRlLT5wYXJlbnQtPm5hbWUgOiAibm8gcGFyZW50Iik7CisJaWYgKFNfSVNMTksoZGUtPm1vZGUpKQorCQlrZnJlZShkZS0+dS5zeW1saW5rLmxpbmtuYW1lKTsKKwlXUklURV9FTlRSWV9NQUdJQyhkZSwgMCk7CisjaWZkZWYgQ09ORklHX0RFVkZTX0RFQlVHCisJc3Bpbl9sb2NrKCZzdGF0X2xvY2spOworCS0tc3RhdF9udW1fZW50cmllczsKKwlzdGF0X251bV9ieXRlcyAtPSBzaXplb2YgKmRlICsgZGUtPm5hbWVsZW47CisJaWYgKFNfSVNMTksoZGUtPm1vZGUpKQorCQlzdGF0X251bV9ieXRlcyAtPSBkZS0+dS5zeW1saW5rLmxlbmd0aCArIDE7CisJc3Bpbl91bmxvY2soJnN0YXRfbG9jayk7CisjZW5kaWYKKwlkZS0+aW5mbyA9IFBPSVNPTl9QVFI7CisJa2ZyZWUoZGUpOworfQkJCQkvKiAgRW5kIEZ1bmN0aW9uIGRldmZzX3B1dCAgKi8KKworLyoqCisgKglfZGV2ZnNfc2VhcmNoX2RpciAtIFNlYXJjaCBmb3IgYSBkZXZmcyBlbnRyeSBpbiBhIGRpcmVjdG9yeS4KKyAqCUBkaXI6ICBUaGUgZGlyZWN0b3J5IHRvIHNlYXJjaC4KKyAqCUBuYW1lOiAgVGhlIG5hbWUgb2YgdGhlIGVudHJ5IHRvIHNlYXJjaCBmb3IuCisgKglAbmFtZWxlbjogIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBAbmFtZS4KKyAqCisgKiAgU2VhcmNoIGZvciBhIGRldmZzIGVudHJ5IGluIGEgZGlyZWN0b3J5IGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZW50cnkKKyAqICAgb24gc3VjY2VzcywgZWxzZSAlTlVMTC4gVGhlIGRpcmVjdG9yeSBtdXN0IGJlIGxvY2tlZCBhbHJlYWR5LgorICogICBBbiBpbXBsaWNpdCBkZXZmc19nZXQoKSBpcyBwZXJmb3JtZWQgb24gdGhlIHJldHVybmVkIGVudHJ5LgorICovCisKK3N0YXRpYyBzdHJ1Y3QgZGV2ZnNfZW50cnkgKl9kZXZmc19zZWFyY2hfZGlyKHN0cnVjdCBkZXZmc19lbnRyeSAqZGlyLAorCQkJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IG5hbWVsZW4pCit7CisJc3RydWN0IGRldmZzX2VudHJ5ICpjdXJyOworCisJaWYgKCFTX0lTRElSKGRpci0+bW9kZSkpIHsKKwkJUFJJTlRLKCIoJXMpOiBub3QgYSBkaXJlY3RvcnlcbiIsIGRpci0+bmFtZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlmb3IgKGN1cnIgPSBkaXItPnUuZGlyLmZpcnN0OyBjdXJyICE9IE5VTEw7IGN1cnIgPSBjdXJyLT5uZXh0KSB7CisJCWlmIChjdXJyLT5uYW1lbGVuICE9IG5hbWVsZW4pCisJCQljb250aW51ZTsKKwkJaWYgKG1lbWNtcChjdXJyLT5uYW1lLCBuYW1lLCBuYW1lbGVuKSA9PSAwKQorCQkJYnJlYWs7CisJCS8qICBOb3QgZm91bmQ6IHRyeSB0aGUgbmV4dCBvbmUgICovCisJfQorCXJldHVybiBkZXZmc19nZXQoY3Vycik7Cit9CQkJCS8qICBFbmQgRnVuY3Rpb24gX2RldmZzX3NlYXJjaF9kaXIgICovCisKKy8qKgorICoJX2RldmZzX2FsbG9jX2VudHJ5IC0gQWxsb2NhdGUgYSBkZXZmcyBlbnRyeS4KKyAqCUBuYW1lOiAgICAgdGhlIG5hbWUgb2YgdGhlIGVudHJ5CisgKglAbmFtZWxlbjogIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBAbmFtZQorICogICAgICBAbW9kZTogICAgIHRoZSBtb2RlIGZvciB0aGUgZW50cnkKKyAqCisgKiAgQWxsb2NhdGUgYSBkZXZmcyBlbnRyeSBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGVudHJ5IG9uIHN1Y2Nlc3MsIGVsc2UKKyAqICAgJU5VTEwuCisgKi8KKworc3RhdGljIHN0cnVjdCBkZXZmc19lbnRyeSAqX2RldmZzX2FsbG9jX2VudHJ5KGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSAgICAgIHVuc2lnbmVkIGludCBuYW1lbGVuLAorCQkJCQkgICAgICB1bW9kZV90IG1vZGUpCit7CisJc3RydWN0IGRldmZzX2VudHJ5ICpuZXc7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgaW5vZGVfY291bnRlciA9IEZJUlNUX0lOT0RFOworCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soY291bnRlcl9sb2NrKTsKKworCWlmIChuYW1lICYmIChuYW1lbGVuIDwgMSkpCisJCW5hbWVsZW4gPSBzdHJsZW4obmFtZSk7CisJaWYgKChuZXcgPSBrbWFsbG9jKHNpemVvZiAqbmV3ICsgbmFtZWxlbiwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCW1lbXNldChuZXcsIDAsIHNpemVvZiAqbmV3ICsgbmFtZWxlbik7CS8qICBXaWxsIHNldCAnXDAnIG9uIG5hbWUgICovCisJbmV3LT5tb2RlID0gbW9kZTsKKwlpZiAoU19JU0RJUihtb2RlKSkKKwkJcndsb2NrX2luaXQoJm5ldy0+dS5kaXIubG9jayk7CisJYXRvbWljX3NldCgmbmV3LT5yZWZjb3VudCwgMSk7CisJc3Bpbl9sb2NrKCZjb3VudGVyX2xvY2spOworCW5ldy0+aW5vZGUuaW5vID0gaW5vZGVfY291bnRlcisrOworCXNwaW5fdW5sb2NrKCZjb3VudGVyX2xvY2spOworCWlmIChuYW1lKQorCQltZW1jcHkobmV3LT5uYW1lLCBuYW1lLCBuYW1lbGVuKTsKKwluZXctPm5hbWVsZW4gPSBuYW1lbGVuOworCVdSSVRFX0VOVFJZX01BR0lDKG5ldywgTUFHSUNfVkFMVUUpOworI2lmZGVmIENPTkZJR19ERVZGU19ERUJVRworCXNwaW5fbG9jaygmc3RhdF9sb2NrKTsKKwkrK3N0YXRfbnVtX2VudHJpZXM7CisJc3RhdF9udW1fYnl0ZXMgKz0gc2l6ZW9mICpuZXcgKyBuYW1lbGVuOworCXNwaW5fdW5sb2NrKCZzdGF0X2xvY2spOworI2VuZGlmCisJcmV0dXJuIG5ldzsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBfZGV2ZnNfYWxsb2NfZW50cnkgICovCisKKy8qKgorICoJX2RldmZzX2FwcGVuZF9lbnRyeSAtIEFwcGVuZCBhIGRldmZzIGVudHJ5IHRvIGEgZGlyZWN0b3J5J3MgY2hpbGQgbGlzdC4KKyAqCUBkaXI6ICBUaGUgZGlyZWN0b3J5IHRvIGFkZCB0by4KKyAqCUBkZTogIFRoZSBkZXZmcyBlbnRyeSB0byBhcHBlbmQuCisgKglAb2xkX2RlOiBJZiBhbiBleGlzdGluZyBlbnRyeSBleGlzdHMsIGl0IHdpbGwgYmUgd3JpdHRlbiBoZXJlLiBUaGlzIG1heQorICoJCSBiZSAlTlVMTC4gQW4gaW1wbGljaXQgZGV2ZnNfZ2V0KCkgaXMgcGVyZm9ybWVkIG9uIHRoaXMgZW50cnkuCisgKgorICogIEFwcGVuZCBhIGRldmZzIGVudHJ5IHRvIGEgZGlyZWN0b3J5J3MgbGlzdCBvZiBjaGlsZHJlbiwgY2hlY2tpbmcgZmlyc3QgdG8KKyAqICAgc2VlIGlmIGFuIGVudHJ5IG9mIHRoZSBzYW1lIG5hbWUgZXhpc3RzLiBUaGUgZGlyZWN0b3J5IHdpbGwgYmUgbG9ja2VkLgorICogICBUaGUgdmFsdWUgMCBpcyByZXR1cm5lZCBvbiBzdWNjZXNzLCBlbHNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqICAgT24gZmFpbHVyZSwgYW4gaW1wbGljaXQgZGV2ZnNfcHV0KCkgaXMgcGVyZm9ybWVkIG9uICVkZS4KKyAqLworCitzdGF0aWMgaW50IF9kZXZmc19hcHBlbmRfZW50cnkoZGV2ZnNfaGFuZGxlX3QgZGlyLCBkZXZmc19oYW5kbGVfdCBkZSwKKwkJCSAgICAgICBkZXZmc19oYW5kbGVfdCAqIG9sZF9kZSkKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKG9sZF9kZSkKKwkJKm9sZF9kZSA9IE5VTEw7CisJaWYgKCFTX0lTRElSKGRpci0+bW9kZSkpIHsKKwkJUFJJTlRLKCIoJXMpOiBkaXI6IFwiJXNcIiBpcyBub3QgYSBkaXJlY3RvcnlcbiIsIGRlLT5uYW1lLAorCQkgICAgICAgZGlyLT5uYW1lKTsKKwkJZGV2ZnNfcHV0KGRlKTsKKwkJcmV0dXJuIC1FTk9URElSOworCX0KKwl3cml0ZV9sb2NrKCZkaXItPnUuZGlyLmxvY2spOworCWlmIChkaXItPnUuZGlyLm5vX21vcmVfYWRkaXRpb25zKQorCQlyZXR2YWwgPSAtRU5PRU5UOworCWVsc2UgeworCQlzdHJ1Y3QgZGV2ZnNfZW50cnkgKm9sZDsKKworCQlvbGQgPSBfZGV2ZnNfc2VhcmNoX2RpcihkaXIsIGRlLT5uYW1lLCBkZS0+bmFtZWxlbik7CisJCWlmIChvbGRfZGUpCisJCQkqb2xkX2RlID0gb2xkOworCQllbHNlCisJCQlkZXZmc19wdXQob2xkKTsKKwkJaWYgKG9sZCA9PSBOVUxMKSB7CisJCQlkZS0+cGFyZW50ID0gZGlyOworCQkJZGUtPnByZXYgPSBkaXItPnUuZGlyLmxhc3Q7CisJCQkvKiAgQXBwZW5kIHRvIHRoZSBkaXJlY3RvcnkncyBsaXN0IG9mIGNoaWxkcmVuICAqLworCQkJaWYgKGRpci0+dS5kaXIuZmlyc3QgPT0gTlVMTCkKKwkJCQlkaXItPnUuZGlyLmZpcnN0ID0gZGU7CisJCQllbHNlCisJCQkJZGlyLT51LmRpci5sYXN0LT5uZXh0ID0gZGU7CisJCQlkaXItPnUuZGlyLmxhc3QgPSBkZTsKKwkJCXJldHZhbCA9IDA7CisJCX0gZWxzZQorCQkJcmV0dmFsID0gLUVFWElTVDsKKwl9CisJd3JpdGVfdW5sb2NrKCZkaXItPnUuZGlyLmxvY2spOworCWlmIChyZXR2YWwpCisJCWRldmZzX3B1dChkZSk7CisJcmV0dXJuIHJldHZhbDsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBfZGV2ZnNfYXBwZW5kX2VudHJ5ICAqLworCisvKioKKyAqCV9kZXZmc19nZXRfcm9vdF9lbnRyeSAtIEdldCB0aGUgcm9vdCBkZXZmcyBlbnRyeS4KKyAqCisgKglSZXR1cm5zIHRoZSByb290IGRldmZzIGVudHJ5IG9uIHN1Y2Nlc3MsIGVsc2UgJU5VTEwuCisgKgorICoJVE9ETyBpdCBtdXN0IGJlIGNhbGxlZCBhc3luY2hyb25vdXNseSBkdWUgdG8gdGhlIGZhY3QKKyAqCXRoYXQgZGV2ZnMgaXMgaW5pdGlhbGl6ZWQgcmVsYXRpdmVseSBsYXRlLiBQcm9wZXIgd2F5CisgKglpcyB0byByZW1vdmUgbW9kdWxlX2luaXQgZnJvbSBpbml0X2RldmZzX2ZzIGFuZCBtYW51YWxseQorICoJY2FsbCBpdCBlYXJseSBlbm91Z2ggZHVyaW5nIHN5c3RlbSBpbml0CisgKi8KKworc3RhdGljIHN0cnVjdCBkZXZmc19lbnRyeSAqX2RldmZzX2dldF9yb290X2VudHJ5KHZvaWQpCit7CisJc3RydWN0IGRldmZzX2VudHJ5ICpuZXc7CisJc3RhdGljIERFRklORV9TUElOTE9DSyhyb290X2xvY2spOworCisJaWYgKHJvb3RfZW50cnkpCisJCXJldHVybiByb290X2VudHJ5OworCisJbmV3ID0gX2RldmZzX2FsbG9jX2VudHJ5KE5VTEwsIDAsIE1PREVfRElSKTsKKwlpZiAobmV3ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJc3Bpbl9sb2NrKCZyb290X2xvY2spOworCWlmIChyb290X2VudHJ5KSB7CisJCXNwaW5fdW5sb2NrKCZyb290X2xvY2spOworCQlkZXZmc19wdXQobmV3KTsKKwkJcmV0dXJuIHJvb3RfZW50cnk7CisJfQorCXJvb3RfZW50cnkgPSBuZXc7CisJc3Bpbl91bmxvY2soJnJvb3RfbG9jayk7CisKKwlyZXR1cm4gcm9vdF9lbnRyeTsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBfZGV2ZnNfZ2V0X3Jvb3RfZW50cnkgICovCisKKy8qKgorICoJX2RldmZzX2Rlc2NlbmQgLSBEZXNjZW5kIGRvd24gYSB0cmVlIHVzaW5nIHRoZSBuZXh0IGNvbXBvbmVudCBuYW1lLgorICoJQGRpcjogIFRoZSBkaXJlY3RvcnkgdG8gc2VhcmNoLgorICoJQG5hbWU6ICBUaGUgY29tcG9uZW50IG5hbWUgdG8gc2VhcmNoIGZvci4KKyAqCUBuYW1lbGVuOiAgVGhlIGxlbmd0aCBvZiAlbmFtZS4KKyAqCUBuZXh0X3BvczogIFRoZSBwb3NpdGlvbiBvZiB0aGUgbmV4dCAnLycgb3IgJ1wwJyBpcyB3cml0dGVuIGhlcmUuCisgKgorICogIERlc2NlbmQgaW50byBhIGRpcmVjdG9yeSwgc2VhcmNoaW5nIGZvciBhIGNvbXBvbmVudC4gVGhpcyBmdW5jdGlvbiBmb3JtcworICogICB0aGUgY29yZSBvZiBhIHRyZWUtd2Fsa2luZyBhbGdvcml0aG0uIFRoZSBkaXJlY3Rvcnkgd2lsbCBiZSBsb2NrZWQuCisgKiAgIFRoZSBkZXZmcyBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb21wb25lbnQgaXMgcmV0dXJuZWQuIElmIHRoZXJlIGlzCisgKiAgIG5vIG1hdGNoaW5nIGVudHJ5LCAlTlVMTCBpcyByZXR1cm5lZC4KKyAqICAgQW4gaW1wbGljaXQgZGV2ZnNfZ2V0KCkgaXMgcGVyZm9ybWVkIG9uIHRoZSByZXR1cm5lZCBlbnRyeS4KKyAqLworCitzdGF0aWMgc3RydWN0IGRldmZzX2VudHJ5ICpfZGV2ZnNfZGVzY2VuZChzdHJ1Y3QgZGV2ZnNfZW50cnkgKmRpciwKKwkJCQkJICBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwKKwkJCQkJICBpbnQgKm5leHRfcG9zKQoreworCWNvbnN0IGNoYXIgKnN0b3AsICpwdHI7CisJc3RydWN0IGRldmZzX2VudHJ5ICplbnRyeTsKKworCWlmICgobmFtZWxlbiA+PSAzKSAmJiAoc3RybmNtcChuYW1lLCAiLi4vIiwgMykgPT0gMCkpIHsJLyogIFNwZWNpYWwtY2FzZSBnb2luZyB0byBwYXJlbnQgZGlyZWN0b3J5ICAqLworCQkqbmV4dF9wb3MgPSAzOworCQlyZXR1cm4gZGV2ZnNfZ2V0KGRpci0+cGFyZW50KTsKKwl9CisJc3RvcCA9IG5hbWUgKyBuYW1lbGVuOworCS8qICBTZWFyY2ggZm9yIGEgcG9zc2libGUgJy8nICAqLworCWZvciAocHRyID0gbmFtZTsgKHB0ciA8IHN0b3ApICYmICgqcHRyICE9ICcvJyk7ICsrcHRyKSA7CisJKm5leHRfcG9zID0gcHRyIC0gbmFtZTsKKwlyZWFkX2xvY2soJmRpci0+dS5kaXIubG9jayk7CisJZW50cnkgPSBfZGV2ZnNfc2VhcmNoX2RpcihkaXIsIG5hbWUsICpuZXh0X3Bvcyk7CisJcmVhZF91bmxvY2soJmRpci0+dS5kaXIubG9jayk7CisJcmV0dXJuIGVudHJ5OworfQkJCQkvKiAgRW5kIEZ1bmN0aW9uIF9kZXZmc19kZXNjZW5kICAqLworCitzdGF0aWMgZGV2ZnNfaGFuZGxlX3QgX2RldmZzX21ha2VfcGFyZW50X2Zvcl9sZWFmKHN0cnVjdCBkZXZmc19lbnRyeSAqZGlyLAorCQkJCQkJICBjb25zdCBjaGFyICpuYW1lLAorCQkJCQkJICBpbnQgbmFtZWxlbiwgaW50ICpsZWFmX3BvcykKK3sKKwlpbnQgbmV4dF9wb3MgPSAwOworCisJaWYgKGRpciA9PSBOVUxMKQorCQlkaXIgPSBfZGV2ZnNfZ2V0X3Jvb3RfZW50cnkoKTsKKwlpZiAoZGlyID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCWRldmZzX2dldChkaXIpOworCS8qICBTZWFyY2ggZm9yIHBvc3NpYmxlIHRyYWlsaW5nIGNvbXBvbmVudCBhbmQgaWdub3JlIGl0ICAqLworCWZvciAoLS1uYW1lbGVuOyAobmFtZWxlbiA+IDApICYmIChuYW1lW25hbWVsZW5dICE9ICcvJyk7IC0tbmFtZWxlbikgOworCSpsZWFmX3BvcyA9IChuYW1lW25hbWVsZW5dID09ICcvJykgPyAobmFtZWxlbiArIDEpIDogMDsKKwlmb3IgKDsgbmFtZWxlbiA+IDA7IG5hbWUgKz0gbmV4dF9wb3MsIG5hbWVsZW4gLT0gbmV4dF9wb3MpIHsKKwkJc3RydWN0IGRldmZzX2VudHJ5ICpkZSwgKm9sZCA9IE5VTEw7CisKKwkJaWYgKChkZSA9CisJCSAgICAgX2RldmZzX2Rlc2NlbmQoZGlyLCBuYW1lLCBuYW1lbGVuLCAmbmV4dF9wb3MpKSA9PSBOVUxMKSB7CisJCQlkZSA9IF9kZXZmc19hbGxvY19lbnRyeShuYW1lLCBuZXh0X3BvcywgTU9ERV9ESVIpOworCQkJZGV2ZnNfZ2V0KGRlKTsKKwkJCWlmICghZGUgfHwgX2RldmZzX2FwcGVuZF9lbnRyeShkaXIsIGRlLCAmb2xkKSkgeworCQkJCWRldmZzX3B1dChkZSk7CisJCQkJaWYgKCFvbGQgfHwgIVNfSVNESVIob2xkLT5tb2RlKSkgeworCQkJCQlkZXZmc19wdXQob2xkKTsKKwkJCQkJZGV2ZnNfcHV0KGRpcik7CisJCQkJCXJldHVybiBOVUxMOworCQkJCX0KKwkJCQlkZSA9IG9sZDsJLyogIFVzZSB0aGUgZXhpc3RpbmcgZGlyZWN0b3J5ICAqLworCQkJfQorCQl9CisJCWlmIChkZSA9PSBkaXItPnBhcmVudCkgeworCQkJZGV2ZnNfcHV0KGRpcik7CisJCQlkZXZmc19wdXQoZGUpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJZGV2ZnNfcHV0KGRpcik7CisJCWRpciA9IGRlOworCQlpZiAobmFtZVtuZXh0X3Bvc10gPT0gJy8nKQorCQkJKytuZXh0X3BvczsKKwl9CisJcmV0dXJuIGRpcjsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBfZGV2ZnNfbWFrZV9wYXJlbnRfZm9yX2xlYWYgICovCisKK3N0YXRpYyBkZXZmc19oYW5kbGVfdCBfZGV2ZnNfcHJlcGFyZV9sZWFmKGRldmZzX2hhbmRsZV90ICogZGlyLAorCQkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsIHVtb2RlX3QgbW9kZSkKK3sKKwlpbnQgbmFtZWxlbiwgbGVhZl9wb3M7CisJc3RydWN0IGRldmZzX2VudHJ5ICpkZTsKKworCW5hbWVsZW4gPSBzdHJsZW4obmFtZSk7CisJaWYgKCgqZGlyID0gX2RldmZzX21ha2VfcGFyZW50X2Zvcl9sZWFmKCpkaXIsIG5hbWUsIG5hbWVsZW4sCisJCQkJCQkmbGVhZl9wb3MpKSA9PSBOVUxMKSB7CisJCVBSSU5USygiKCVzKTogY291bGQgbm90IGNyZWF0ZSBwYXJlbnQgcGF0aFxuIiwgbmFtZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoKGRlID0gX2RldmZzX2FsbG9jX2VudHJ5KG5hbWUgKyBsZWFmX3BvcywgbmFtZWxlbiAtIGxlYWZfcG9zLCBtb2RlKSkKKwkgICAgPT0gTlVMTCkgeworCQlQUklOVEsoIiglcyk6IGNvdWxkIG5vdCBhbGxvY2F0ZSBlbnRyeVxuIiwgbmFtZSk7CisJCWRldmZzX3B1dCgqZGlyKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBkZTsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBfZGV2ZnNfcHJlcGFyZV9sZWFmICAqLworCitzdGF0aWMgZGV2ZnNfaGFuZGxlX3QgX2RldmZzX3dhbGtfcGF0aChzdHJ1Y3QgZGV2ZnNfZW50cnkgKmRpciwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sCisJCQkJICAgICAgIGludCB0cmF2ZXJzZV9zeW1saW5rKQoreworCWludCBuZXh0X3BvcyA9IDA7CisKKwlpZiAoZGlyID09IE5VTEwpCisJCWRpciA9IF9kZXZmc19nZXRfcm9vdF9lbnRyeSgpOworCWlmIChkaXIgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJZGV2ZnNfZ2V0KGRpcik7CisJZm9yICg7IG5hbWVsZW4gPiAwOyBuYW1lICs9IG5leHRfcG9zLCBuYW1lbGVuIC09IG5leHRfcG9zKSB7CisJCXN0cnVjdCBkZXZmc19lbnRyeSAqZGUsICpsaW5rOworCisJCWlmICghU19JU0RJUihkaXItPm1vZGUpKSB7CisJCQlkZXZmc19wdXQoZGlyKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJaWYgKChkZSA9CisJCSAgICAgX2RldmZzX2Rlc2NlbmQoZGlyLCBuYW1lLCBuYW1lbGVuLCAmbmV4dF9wb3MpKSA9PSBOVUxMKSB7CisJCQlkZXZmc19wdXQoZGlyKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWlmIChTX0lTTE5LKGRlLT5tb2RlKSAmJiB0cmF2ZXJzZV9zeW1saW5rKSB7CS8qICBOZWVkIHRvIGZvbGxvdyB0aGUgbGluazogdGhpcyBpcyBhIHN0YWNrIGNob21wZXIgICovCisJCQkvKiBGSVhNRSB3aGF0IGlmIGl0IHB1dHMgb3V0c2lkZSBvZiBtb3VudGVkIHRyZWU/ICovCisJCQlsaW5rID0gX2RldmZzX3dhbGtfcGF0aChkaXIsIGRlLT51LnN5bWxpbmsubGlua25hbWUsCisJCQkJCQlkZS0+dS5zeW1saW5rLmxlbmd0aCwgVFJVRSk7CisJCQlkZXZmc19wdXQoZGUpOworCQkJaWYgKCFsaW5rKSB7CisJCQkJZGV2ZnNfcHV0KGRpcik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQlkZSA9IGxpbms7CisJCX0KKwkJZGV2ZnNfcHV0KGRpcik7CisJCWRpciA9IGRlOworCQlpZiAobmFtZVtuZXh0X3Bvc10gPT0gJy8nKQorCQkJKytuZXh0X3BvczsKKwl9CisJcmV0dXJuIGRpcjsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBfZGV2ZnNfd2Fsa19wYXRoICAqLworCisvKioKKyAqCV9kZXZmc19maW5kX2VudHJ5IC0gRmluZCBhIGRldmZzIGVudHJ5LgorICoJQGRpcjogVGhlIGhhbmRsZSB0byB0aGUgcGFyZW50IGRldmZzIGRpcmVjdG9yeSBlbnRyeS4gSWYgdGhpcyBpcyAlTlVMTCB0aGUKKyAqCQluYW1lIGlzIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBkZXZmcy4KKyAqCUBuYW1lOiBUaGUgbmFtZSBvZiB0aGUgZW50cnkuIFRoaXMgbWF5IGJlICVOVUxMLgorICoJQHRyYXZlcnNlX3N5bWxpbms6IElmICVUUlVFIHRoZW4gc3ltYm9saWMgbGlua3MgYXJlIHRyYXZlcnNlZC4KKyAqCisgKglSZXR1cm5zIHRoZSBkZXZmc19lbnRyeSBwb2ludGVyIG9uIHN1Y2Nlc3MsIGVsc2UgJU5VTEwuIEFuIGltcGxpY2l0CisgKglkZXZmc19nZXQoKSBpcyBwZXJmb3JtZWQuCisgKi8KKworc3RhdGljIHN0cnVjdCBkZXZmc19lbnRyeSAqX2RldmZzX2ZpbmRfZW50cnkoZGV2ZnNfaGFuZGxlX3QgZGlyLAorCQkJCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSAgICAgaW50IHRyYXZlcnNlX3N5bWxpbmspCit7CisJdW5zaWduZWQgaW50IG5hbWVsZW4gPSBzdHJsZW4obmFtZSk7CisKKwlpZiAobmFtZVswXSA9PSAnLycpIHsKKwkJLyogIFNraXAgbGVhZGluZyBwYXRobmFtZSBjb21wb25lbnQgICovCisJCWlmIChuYW1lbGVuIDwgMikgeworCQkJUFJJTlRLKCIoJXMpOiB0b28gc2hvcnRcbiIsIG5hbWUpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJZm9yICgrK25hbWUsIC0tbmFtZWxlbjsgKCpuYW1lICE9ICcvJykgJiYgKG5hbWVsZW4gPiAwKTsKKwkJICAgICArK25hbWUsIC0tbmFtZWxlbikgOworCQlpZiAobmFtZWxlbiA8IDIpIHsKKwkJCVBSSU5USygiKCVzKTogdG9vIHNob3J0XG4iLCBuYW1lKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCSsrbmFtZTsKKwkJLS1uYW1lbGVuOworCX0KKwlyZXR1cm4gX2RldmZzX3dhbGtfcGF0aChkaXIsIG5hbWUsIG5hbWVsZW4sIHRyYXZlcnNlX3N5bWxpbmspOworfQkJCQkvKiAgRW5kIEZ1bmN0aW9uIF9kZXZmc19maW5kX2VudHJ5ICAqLworCitzdGF0aWMgc3RydWN0IGRldmZzX2VudHJ5ICpnZXRfZGV2ZnNfZW50cnlfZnJvbV92ZnNfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpZiAoaW5vZGUgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJVkVSSUZZX0VOVFJZKChzdHJ1Y3QgZGV2ZnNfZW50cnkgKilpbm9kZS0+dS5nZW5lcmljX2lwKTsKKwlyZXR1cm4gaW5vZGUtPnUuZ2VuZXJpY19pcDsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBnZXRfZGV2ZnNfZW50cnlfZnJvbV92ZnNfaW5vZGUgICovCisKKy8qKgorICoJZnJlZV9kZW50cnkgLSBGcmVlIHRoZSBkZW50cnkgZm9yIGEgZGV2aWNlIGVudHJ5IGFuZCBpbnZhbGlkYXRlIGlub2RlLgorICoJQGRlOiBUaGUgZW50cnkuCisgKgorICoJVGhpcyBtdXN0IG9ubHkgYmUgY2FsbGVkIGFmdGVyIHRoZSBlbnRyeSBoYXMgYmVlbiB1bmhvb2tlZCBmcm9tIGl0cworICoJIHBhcmVudCBkaXJlY3RvcnkuCisgKi8KKworc3RhdGljIHZvaWQgZnJlZV9kZW50cnkoc3RydWN0IGRldmZzX2VudHJ5ICpkZSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBkZS0+aW5vZGUuZGVudHJ5OworCisJaWYgKCFkZW50cnkpCisJCXJldHVybjsKKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwlkZ2V0X2xvY2tlZChkZW50cnkpOworCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJLyogIEZvcmNlZnVsbHkgcmVtb3ZlIHRoZSBpbm9kZSAgKi8KKwlpZiAoZGVudHJ5LT5kX2lub2RlICE9IE5VTEwpCisJCWRlbnRyeS0+ZF9pbm9kZS0+aV9ubGluayA9IDA7CisJZF9kcm9wKGRlbnRyeSk7CisJZHB1dChkZW50cnkpOworfQkJCQkvKiAgRW5kIEZ1bmN0aW9uIGZyZWVfZGVudHJ5ICAqLworCisvKioKKyAqCWlzX2RldmZzZF9vcl9jaGlsZCAtIFRlc3QgaWYgdGhlIGN1cnJlbnQgcHJvY2VzcyBpcyBkZXZmc2Qgb3Igb25lIG9mIGl0cyBjaGlsZHJlbi4KKyAqCUBmc19pbmZvOiBUaGUgZmlsZXN5c3RlbSBpbmZvcm1hdGlvbi4KKyAqCisgKglSZXR1cm5zICVUUlVFIGlmIGRldmZzZCBvciBjaGlsZCwgZWxzZSAlRkFMU0UuCisgKi8KKworc3RhdGljIGludCBpc19kZXZmc2Rfb3JfY2hpbGQoc3RydWN0IGZzX2luZm8gKmZzX2luZm8pCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwID0gY3VycmVudDsKKworCWlmIChwID09IGZzX2luZm8tPmRldmZzZF90YXNrKQorCQlyZXR1cm4gKFRSVUUpOworCWlmIChwcm9jZXNzX2dyb3VwKHApID09IGZzX2luZm8tPmRldmZzZF9wZ3JwKQorCQlyZXR1cm4gKFRSVUUpOworCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CisJZm9yICg7IHAgIT0gJmluaXRfdGFzazsgcCA9IHAtPnJlYWxfcGFyZW50KSB7CisJCWlmIChwID09IGZzX2luZm8tPmRldmZzZF90YXNrKSB7CisJCQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisJCQlyZXR1cm4gKFRSVUUpOworCQl9CisJfQorCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlyZXR1cm4gKEZBTFNFKTsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBpc19kZXZmc2Rfb3JfY2hpbGQgICovCisKKy8qKgorICoJZGV2ZnNkX3F1ZXVlX2VtcHR5IC0gVGVzdCBpZiBkZXZmc2QgaGFzIHdvcmsgcGVuZGluZyBpbiBpdHMgZXZlbnQgcXVldWUuCisgKglAZnNfaW5mbzogVGhlIGZpbGVzeXN0ZW0gaW5mb3JtYXRpb24uCisgKgorICoJUmV0dXJucyAlVFJVRSBpZiB0aGUgcXVldWUgaXMgZW1wdHksIGVsc2UgJUZBTFNFLgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGRldmZzZF9xdWV1ZV9lbXB0eShzdHJ1Y3QgZnNfaW5mbyAqZnNfaW5mbykKK3sKKwlyZXR1cm4gKGZzX2luZm8tPmRldmZzZF9sYXN0X2V2ZW50KSA/IEZBTFNFIDogVFJVRTsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBkZXZmc2RfcXVldWVfZW1wdHkgICovCisKKy8qKgorICoJd2FpdF9mb3JfZGV2ZnNkX2ZpbmlzaGVkIC0gV2FpdCBmb3IgZGV2ZnNkIHRvIGZpbmlzaCBwcm9jZXNzaW5nIGl0cyBldmVudCBxdWV1ZS4KKyAqCUBmc19pbmZvOiBUaGUgZmlsZXN5c3RlbSBpbmZvcm1hdGlvbi4KKyAqCisgKglSZXR1cm5zICVUUlVFIGlmIG5vIG1vcmUgd2FpdGluZyB3aWxsIGJlIHJlcXVpcmVkLCBlbHNlICVGQUxTRS4KKyAqLworCitzdGF0aWMgaW50IHdhaXRfZm9yX2RldmZzZF9maW5pc2hlZChzdHJ1Y3QgZnNfaW5mbyAqZnNfaW5mbykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKworCWlmIChmc19pbmZvLT5kZXZmc2RfdGFzayA9PSBOVUxMKQorCQlyZXR1cm4gKFRSVUUpOworCWlmIChkZXZmc2RfcXVldWVfZW1wdHkoZnNfaW5mbykgJiYgZnNfaW5mby0+ZGV2ZnNkX3NsZWVwaW5nKQorCQlyZXR1cm4gVFJVRTsKKwlpZiAoaXNfZGV2ZnNkX29yX2NoaWxkKGZzX2luZm8pKQorCQlyZXR1cm4gKEZBTFNFKTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJYWRkX3dhaXRfcXVldWUoJmZzX2luZm8tPnJldmFsaWRhdGVfd2FpdF9xdWV1ZSwgJndhaXQpOworCWlmICghZGV2ZnNkX3F1ZXVlX2VtcHR5KGZzX2luZm8pIHx8ICFmc19pbmZvLT5kZXZmc2Rfc2xlZXBpbmcpCisJCWlmIChmc19pbmZvLT5kZXZmc2RfdGFzaykKKwkJCXNjaGVkdWxlKCk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJmZzX2luZm8tPnJldmFsaWRhdGVfd2FpdF9xdWV1ZSwgJndhaXQpOworCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZXR1cm4gKFRSVUUpOworfQkJCQkvKiAgRW5kIEZ1bmN0aW9uIHdhaXRfZm9yX2RldmZzZF9maW5pc2hlZCAgKi8KKworLyoqCisgKglkZXZmc2Rfbm90aWZ5X2RlIC0gTm90aWZ5IHRoZSBkZXZmc2QgZGFlbW9uIG9mIGEgY2hhbmdlLgorICoJQGRlOiBUaGUgZGV2ZnMgZW50cnkgdGhhdCBoYXMgY2hhbmdlZC4gVGhpcyBhbmQgYWxsIHBhcmVudCBlbnRyaWVzIHdpbGwKKyAqICAgICAgICAgICAgaGF2ZSB0aGVpciByZWZlcmVuY2UgY291bnRzIGluY3JlbWVudGVkIGlmIHRoZSBldmVudCB3YXMgcXVldWVkLgorICoJQHR5cGU6IFRoZSB0eXBlIG9mIGNoYW5nZS4KKyAqCUBtb2RlOiBUaGUgbW9kZSBvZiB0aGUgZW50cnkuCisgKglAdWlkOiBUaGUgdXNlciBJRC4KKyAqCUBnaWQ6IFRoZSBncm91cCBJRC4KKyAqCUBmc19pbmZvOiBUaGUgZmlsZXN5c3RlbSBpbmZvLgorICoKKyAqCVJldHVybnMgJVRSVUUgaWYgYW4gZXZlbnQgd2FzIHF1ZXVlZCBhbmQgZGV2ZnNkIHdva2VuIHVwLCBlbHNlICVGQUxTRS4KKyAqLworCitzdGF0aWMgaW50IGRldmZzZF9ub3RpZnlfZGUoc3RydWN0IGRldmZzX2VudHJ5ICpkZSwKKwkJCSAgICB1bnNpZ25lZCBzaG9ydCB0eXBlLCB1bW9kZV90IG1vZGUsCisJCQkgICAgdWlkX3QgdWlkLCBnaWRfdCBnaWQsIHN0cnVjdCBmc19pbmZvICpmc19pbmZvKQoreworCXN0cnVjdCBkZXZmc2RfYnVmX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgZGV2ZnNfZW50cnkgKmN1cnI7CisKKwlpZiAoIShmc19pbmZvLT5kZXZmc2RfZXZlbnRfbWFzayAmICgxIDw8IHR5cGUpKSkKKwkJcmV0dXJuIChGQUxTRSk7CisJaWYgKChlbnRyeSA9IGttZW1fY2FjaGVfYWxsb2MoZGV2ZnNkX2J1Zl9jYWNoZSwgU0xBQl9LRVJORUwpKSA9PSBOVUxMKSB7CisJCWF0b21pY19pbmMoJmZzX2luZm8tPmRldmZzZF9vdmVycnVuX2NvdW50KTsKKwkJcmV0dXJuIChGQUxTRSk7CisJfQorCWZvciAoY3VyciA9IGRlOyBjdXJyICE9IE5VTEw7IGN1cnIgPSBjdXJyLT5wYXJlbnQpCisJCWRldmZzX2dldChjdXJyKTsKKwllbnRyeS0+ZGUgPSBkZTsKKwllbnRyeS0+dHlwZSA9IHR5cGU7CisJZW50cnktPm1vZGUgPSBtb2RlOworCWVudHJ5LT51aWQgPSB1aWQ7CisJZW50cnktPmdpZCA9IGdpZDsKKwllbnRyeS0+bmV4dCA9IE5VTEw7CisJc3Bpbl9sb2NrKCZmc19pbmZvLT5kZXZmc2RfYnVmZmVyX2xvY2spOworCWlmICghZnNfaW5mby0+ZGV2ZnNkX2ZpcnN0X2V2ZW50KQorCQlmc19pbmZvLT5kZXZmc2RfZmlyc3RfZXZlbnQgPSBlbnRyeTsKKwlpZiAoZnNfaW5mby0+ZGV2ZnNkX2xhc3RfZXZlbnQpCisJCWZzX2luZm8tPmRldmZzZF9sYXN0X2V2ZW50LT5uZXh0ID0gZW50cnk7CisJZnNfaW5mby0+ZGV2ZnNkX2xhc3RfZXZlbnQgPSBlbnRyeTsKKwlzcGluX3VubG9jaygmZnNfaW5mby0+ZGV2ZnNkX2J1ZmZlcl9sb2NrKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmZzX2luZm8tPmRldmZzZF93YWl0X3F1ZXVlKTsKKwlyZXR1cm4gKFRSVUUpOworfQkJCQkvKiAgRW5kIEZ1bmN0aW9uIGRldmZzZF9ub3RpZnlfZGUgICovCisKKy8qKgorICoJZGV2ZnNkX25vdGlmeSAtIE5vdGlmeSB0aGUgZGV2ZnNkIGRhZW1vbiBvZiBhIGNoYW5nZS4KKyAqCUBkZTogVGhlIGRldmZzIGVudHJ5IHRoYXQgaGFzIGNoYW5nZWQuCisgKglAdHlwZTogVGhlIHR5cGUgb2YgY2hhbmdlIGV2ZW50LgorICoJQHdhaXQ6IElmIFRSVUUsIHRoZSBmdW5jdGlvbiB3YWl0cyBmb3IgdGhlIGRhZW1vbiB0byBmaW5pc2ggcHJvY2Vzc2luZworICoJCXRoZSBldmVudC4KKyAqLworCitzdGF0aWMgdm9pZCBkZXZmc2Rfbm90aWZ5KHN0cnVjdCBkZXZmc19lbnRyeSAqZGUsIHVuc2lnbmVkIHNob3J0IHR5cGUpCit7CisJZGV2ZnNkX25vdGlmeV9kZShkZSwgdHlwZSwgZGUtPm1vZGUsIGN1cnJlbnQtPmV1aWQsCisJCQkgY3VycmVudC0+ZWdpZCwgJmZzX2luZm8pOworfQorCitzdGF0aWMgaW50IGRldmZzX21rX2RldihkZXZfdCBkZXYsIHVtb2RlX3QgbW9kZSwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpCit7CisJc3RydWN0IGRldmZzX2VudHJ5ICpkaXIgPSBOVUxMLCAqZGU7CisJY2hhciBidWZbNjRdOworCWludCBlcnJvciwgbjsKKworCW4gPSB2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm10LCBhcmdzKTsKKwlpZiAobiA+PSBzaXplb2YoYnVmKSB8fCAhYnVmWzBdKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBpbnZhbGlkIGZvcm1hdCBzdHJpbmcgJXNcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18sIGZtdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRlID0gX2RldmZzX3ByZXBhcmVfbGVhZigmZGlyLCBidWYsIG1vZGUpOworCWlmICghZGUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNvdWxkIG5vdCBwcmVwYXJlIGxlYWYgZm9yICVzXG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fLCBidWYpOworCQlyZXR1cm4gLUVOT01FTTsJLyogY291bGQgYmUgbW9yZSBhY2N1cmF0ZS4uLiAqLworCX0KKworCWRlLT51LmRldiA9IGRldjsKKworCWVycm9yID0gX2RldmZzX2FwcGVuZF9lbnRyeShkaXIsIGRlLCBOVUxMKTsKKwlpZiAoZXJyb3IpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNvdWxkIG5vdCBhcHBlbmQgdG8gcGFyZW50IGZvciAlc1xuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXywgYnVmKTsKKwkJZ290byBvdXQ7CisJfQorCisJZGV2ZnNkX25vdGlmeShkZSwgREVWRlNEX05PVElGWV9SRUdJU1RFUkVEKTsKKyAgICAgIG91dDoKKwlkZXZmc19wdXQoZGlyKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2ludCBkZXZmc19ta19iZGV2KGRldl90IGRldiwgdW1vZGVfdCBtb2RlLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisKKwlpZiAoIVNfSVNCTEsobW9kZSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGludmFsaWRlIG1vZGUgKCV1KSBmb3IgJXNcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18sIG1vZGUsIGZtdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJcmV0dXJuIGRldmZzX21rX2RldihkZXYsIG1vZGUsIGZtdCwgYXJncyk7Cit9CisKK0VYUE9SVF9TWU1CT0woZGV2ZnNfbWtfYmRldik7CisKK2ludCBkZXZmc19ta19jZGV2KGRldl90IGRldiwgdW1vZGVfdCBtb2RlLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisKKwlpZiAoIVNfSVNDSFIobW9kZSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGludmFsaWRlIG1vZGUgKCV1KSBmb3IgJXNcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18sIG1vZGUsIGZtdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJcmV0dXJuIGRldmZzX21rX2RldihkZXYsIG1vZGUsIGZtdCwgYXJncyk7Cit9CisKK0VYUE9SVF9TWU1CT0woZGV2ZnNfbWtfY2Rldik7CisKKy8qKgorICoJX2RldmZzX3VuaG9vayAtIFVuaG9vayBhIGRldmljZSBlbnRyeSBmcm9tIGl0cyBwYXJlbnRzIGxpc3QKKyAqCUBkZTogVGhlIGVudHJ5IHRvIHVuaG9vay4KKyAqCisgKglSZXR1cm5zICVUUlVFIGlmIHRoZSBlbnRyeSB3YXMgdW5ob29rZWQsIGVsc2UgJUZBTFNFIGlmIGl0IHdhcworICoJCXByZXZpb3VzbHkgdW5ob29rZWQuCisgKglUaGUgY2FsbGVyIG11c3QgaGF2ZSBhIHdyaXRlIGxvY2sgb24gdGhlIHBhcmVudCBkaXJlY3RvcnkuCisgKi8KKworc3RhdGljIGludCBfZGV2ZnNfdW5ob29rKHN0cnVjdCBkZXZmc19lbnRyeSAqZGUpCit7CisJc3RydWN0IGRldmZzX2VudHJ5ICpwYXJlbnQ7CisKKwlpZiAoIWRlIHx8IChkZS0+cHJldiA9PSBkZSkpCisJCXJldHVybiBGQUxTRTsKKwlwYXJlbnQgPSBkZS0+cGFyZW50OworCWlmIChkZS0+cHJldiA9PSBOVUxMKQorCQlwYXJlbnQtPnUuZGlyLmZpcnN0ID0gZGUtPm5leHQ7CisJZWxzZQorCQlkZS0+cHJldi0+bmV4dCA9IGRlLT5uZXh0OworCWlmIChkZS0+bmV4dCA9PSBOVUxMKQorCQlwYXJlbnQtPnUuZGlyLmxhc3QgPSBkZS0+cHJldjsKKwllbHNlCisJCWRlLT5uZXh0LT5wcmV2ID0gZGUtPnByZXY7CisJZGUtPnByZXYgPSBkZTsJCS8qICBJbmRpY2F0ZSB3ZSdyZSB1bmhvb2tlZCAgICAgICAgICAgICAgICAgICAgICAqLworCWRlLT5uZXh0ID0gTlVMTDsJLyogIEZvcmNlIGVhcmx5IHRlcm1pbmF0aW9uIGZvciA8ZGV2ZnNfcmVhZGRpcj4gICovCisJcmV0dXJuIFRSVUU7Cit9CQkJCS8qICBFbmQgRnVuY3Rpb24gX2RldmZzX3VuaG9vayAgKi8KKworLyoqCisgKglfZGV2ZnNfdW5yZWdpc3RlciAtIFVucmVnaXN0ZXIgYSBkZXZpY2UgZW50cnkgZnJvbSBpdHMgcGFyZW50LgorICoJQGRpcjogVGhlIHBhcmVudCBkaXJlY3RvcnkuCisgKglAZGU6IFRoZSBlbnRyeSB0byB1bnJlZ2lzdGVyLgorICoKKyAqCVRoZSBjYWxsZXIgbXVzdCBoYXZlIGEgd3JpdGUgbG9jayBvbiB0aGUgcGFyZW50IGRpcmVjdG9yeSwgd2hpY2ggaXMKKyAqCXVubG9ja2VkIGJ5IHRoaXMgZnVuY3Rpb24uCisgKi8KKworc3RhdGljIHZvaWQgX2RldmZzX3VucmVnaXN0ZXIoc3RydWN0IGRldmZzX2VudHJ5ICpkaXIsIHN0cnVjdCBkZXZmc19lbnRyeSAqZGUpCit7CisJaW50IHVuaG9va2VkID0gX2RldmZzX3VuaG9vayhkZSk7CisKKwl3cml0ZV91bmxvY2soJmRpci0+dS5kaXIubG9jayk7CisJaWYgKCF1bmhvb2tlZCkKKwkJcmV0dXJuOworCWRldmZzX2dldChkaXIpOworCWRldmZzZF9ub3RpZnkoZGUsIERFVkZTRF9OT1RJRllfVU5SRUdJU1RFUkVEKTsKKwlmcmVlX2RlbnRyeShkZSk7CisJZGV2ZnNfcHV0KGRpcik7CisJaWYgKCFTX0lTRElSKGRlLT5tb2RlKSkKKwkJcmV0dXJuOworCXdoaWxlIChUUlVFKSB7CQkvKiAgUmVjdXJzaXZlbHkgdW5yZWdpc3RlcjogdGhpcyBpcyBhIHN0YWNrIGNob21wZXIgICovCisJCXN0cnVjdCBkZXZmc19lbnRyeSAqY2hpbGQ7CisKKwkJd3JpdGVfbG9jaygmZGUtPnUuZGlyLmxvY2spOworCQlkZS0+dS5kaXIubm9fbW9yZV9hZGRpdGlvbnMgPSBUUlVFOworCQljaGlsZCA9IGRlLT51LmRpci5maXJzdDsKKwkJVkVSSUZZX0VOVFJZKGNoaWxkKTsKKwkJX2RldmZzX3VucmVnaXN0ZXIoZGUsIGNoaWxkKTsKKwkJaWYgKCFjaGlsZCkKKwkJCWJyZWFrOworCQlEUFJJTlRLKERFQlVHX1VOUkVHSVNURVIsICIoJXMpOiBjaGlsZDogJXAgIHJlZmNvdW50OiAlZFxuIiwKKwkJCWNoaWxkLT5uYW1lLCBjaGlsZCwgYXRvbWljX3JlYWQoJmNoaWxkLT5yZWZjb3VudCkpOworCQlkZXZmc19wdXQoY2hpbGQpOworCX0KK30JCQkJLyogIEVuZCBGdW5jdGlvbiBfZGV2ZnNfdW5yZWdpc3RlciAgKi8KKworc3RhdGljIGludCBkZXZmc19kb19zeW1saW5rKGRldmZzX2hhbmRsZV90IGRpciwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgICBjb25zdCBjaGFyICpsaW5rLCBkZXZmc19oYW5kbGVfdCAqIGhhbmRsZSkKK3sKKwlpbnQgZXJyOworCXVuc2lnbmVkIGludCBsaW5rbGVuZ3RoOworCWNoYXIgKm5ld2xpbms7CisJc3RydWN0IGRldmZzX2VudHJ5ICpkZTsKKworCWlmIChoYW5kbGUgIT0gTlVMTCkKKwkJKmhhbmRsZSA9IE5VTEw7CisJaWYgKG5hbWUgPT0gTlVMTCkgeworCQlQUklOVEsoIigpOiBOVUxMIG5hbWUgcG9pbnRlclxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAobGluayA9PSBOVUxMKSB7CisJCVBSSU5USygiKCVzKTogTlVMTCBsaW5rIHBvaW50ZXJcbiIsIG5hbWUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbGlua2xlbmd0aCA9IHN0cmxlbihsaW5rKTsKKwlpZiAoKG5ld2xpbmsgPSBrbWFsbG9jKGxpbmtsZW5ndGggKyAxLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtY3B5KG5ld2xpbmssIGxpbmssIGxpbmtsZW5ndGgpOworCW5ld2xpbmtbbGlua2xlbmd0aF0gPSAnXDAnOworCWlmICgoZGUgPSBfZGV2ZnNfcHJlcGFyZV9sZWFmKCZkaXIsIG5hbWUsIFNfSUZMTksgfCBTX0lSVUdPIHwgU19JWFVHTykpCisJICAgID09IE5VTEwpIHsKKwkJUFJJTlRLKCIoJXMpOiBjb3VsZCBub3QgcHJlcGFyZSBsZWFmXG4iLCBuYW1lKTsKKwkJa2ZyZWUobmV3bGluayk7CisJCXJldHVybiAtRU5PVERJUjsKKwl9CisJZGUtPmluZm8gPSBOVUxMOworCWRlLT51LnN5bWxpbmsubGlua25hbWUgPSBuZXdsaW5rOworCWRlLT51LnN5bWxpbmsubGVuZ3RoID0gbGlua2xlbmd0aDsKKwlpZiAoKGVyciA9IF9kZXZmc19hcHBlbmRfZW50cnkoZGlyLCBkZSwgTlVMTCkpICE9IDApIHsKKwkJUFJJTlRLKCIoJXMpOiBjb3VsZCBub3QgYXBwZW5kIHRvIHBhcmVudCwgZXJyOiAlZFxuIiwgbmFtZSwKKwkJICAgICAgIGVycik7CisJCWRldmZzX3B1dChkaXIpOworCQlyZXR1cm4gZXJyOworCX0KKwlkZXZmc19wdXQoZGlyKTsKKyNpZmRlZiBDT05GSUdfREVWRlNfREVCVUcKKwlzcGluX2xvY2soJnN0YXRfbG9jayk7CisJc3RhdF9udW1fYnl0ZXMgKz0gbGlua2xlbmd0aCArIDE7CisJc3Bpbl91bmxvY2soJnN0YXRfbG9jayk7CisjZW5kaWYKKwlpZiAoaGFuZGxlICE9IE5VTEwpCisJCSpoYW5kbGUgPSBkZTsKKwlyZXR1cm4gMDsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBkZXZmc19kb19zeW1saW5rICAqLworCisvKioKKyAqCWRldmZzX21rX3N5bWxpbmsgQ3JlYXRlIGEgc3ltYm9saWMgbGluayBpbiB0aGUgZGV2ZnMgbmFtZXNwYWNlLgorICoJQGZyb206IFRoZSBuYW1lIG9mIHRoZSBlbnRyeS4KKyAqCUB0bzogTmFtZSBvZiB0aGUgZGVzdGluYXRpb24KKyAqCisgKglSZXR1cm5zIDAgb24gc3VjY2VzcywgZWxzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaXMgcmV0dXJuZWQuCisgKi8KKworaW50IGRldmZzX21rX3N5bWxpbmsoY29uc3QgY2hhciAqZnJvbSwgY29uc3QgY2hhciAqdG8pCit7CisJZGV2ZnNfaGFuZGxlX3QgZGU7CisJaW50IGVycjsKKworCWVyciA9IGRldmZzX2RvX3N5bWxpbmsoTlVMTCwgZnJvbSwgdG8sICZkZSk7CisJaWYgKCFlcnIpIHsKKwkJZGUtPnZmcyA9IFRSVUU7CisJCWRldmZzZF9ub3RpZnkoZGUsIERFVkZTRF9OT1RJRllfUkVHSVNURVJFRCk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKglkZXZmc19ta19kaXIgLSBDcmVhdGUgYSBkaXJlY3RvcnkgaW4gdGhlIGRldmZzIG5hbWVzcGFjZS4KKyAqCQluZXcgbmFtZSBpcyByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgZGV2ZnMuCisgKglAZm10OiBUaGUgbmFtZSBvZiB0aGUgZW50cnkuCisgKgorICoJVXNlIG9mIHRoaXMgZnVuY3Rpb24gaXMgb3B0aW9uYWwuIFRoZSBkZXZmc19yZWdpc3RlcigpIGZ1bmN0aW9uCisgKgl3aWxsIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGludGVybWVkaWF0ZSBkaXJlY3RvcmllcyBhcyBuZWVkZWQuIFRoaXMgZnVuY3Rpb24KKyAqCWlzIHByb3ZpZGVkIGZvciBlZmZpY2llbmN5IHJlYXNvbnMsIGFzIGl0IHByb3ZpZGVzIGEgaGFuZGxlIHRvIGEgZGlyZWN0b3J5LgorICoJT24gZmFpbHVyZSAlTlVMTCBpcyByZXR1cm5lZC4KKyAqLworCitpbnQgZGV2ZnNfbWtfZGlyKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXN0cnVjdCBkZXZmc19lbnRyeSAqZGlyID0gTlVMTCwgKmRlID0gTlVMTCwgKm9sZDsKKwljaGFyIGJ1Zls2NF07CisJdmFfbGlzdCBhcmdzOworCWludCBlcnJvciwgbjsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJbiA9IHZzbnByaW50ZihidWYsIDY0LCBmbXQsIGFyZ3MpOworCWlmIChuID49IDY0IHx8ICFidWZbMF0pIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGludmFsaWQgYXJndW1lbnQuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGUgPSBfZGV2ZnNfcHJlcGFyZV9sZWFmKCZkaXIsIGJ1ZiwgTU9ERV9ESVIpOworCWlmICghZGUpIHsKKwkJUFJJTlRLKCIoJXMpOiBjb3VsZCBub3QgcHJlcGFyZSBsZWFmXG4iLCBidWYpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwllcnJvciA9IF9kZXZmc19hcHBlbmRfZW50cnkoZGlyLCBkZSwgJm9sZCk7CisJaWYgKGVycm9yID09IC1FRVhJU1QgJiYgU19JU0RJUihvbGQtPm1vZGUpKSB7CisJCS8qCisJCSAqIGRldmZzX21rX2RpcigpIG9mIGFuIGFscmVhZHktZXhpc3RpbmcgZGlyZWN0b3J5IHdpbGwKKwkJICogcmV0dXJuIHN1Y2Nlc3MuCisJCSAqLworCQllcnJvciA9IDA7CisJCWdvdG8gb3V0X3B1dDsKKwl9IGVsc2UgaWYgKGVycm9yKSB7CisJCVBSSU5USygiKCVzKTogY291bGQgbm90IGFwcGVuZCB0byBkaXI6ICVwIFwiJXNcIlxuIiwKKwkJICAgICAgIGJ1ZiwgZGlyLCBkaXItPm5hbWUpOworCQlkZXZmc19wdXQob2xkKTsKKwkJZ290byBvdXRfcHV0OworCX0KKworCWRldmZzZF9ub3RpZnkoZGUsIERFVkZTRF9OT1RJRllfUkVHSVNURVJFRCk7CisKKyAgICAgIG91dF9wdXQ6CisJZGV2ZnNfcHV0KGRpcik7CisJcmV0dXJuIGVycm9yOworfQorCit2b2lkIGRldmZzX3JlbW92ZShjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwljaGFyIGJ1Zls2NF07CisJdmFfbGlzdCBhcmdzOworCWludCBuOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKwluID0gdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZtdCwgYXJncyk7CisJaWYgKG4gPCBzaXplb2YoYnVmKSAmJiBidWZbMF0pIHsKKwkJZGV2ZnNfaGFuZGxlX3QgZGUgPSBfZGV2ZnNfZmluZF9lbnRyeShOVUxMLCBidWYsIDApOworCisJCWlmICghZGUpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6ICVzIG5vdCBmb3VuZCwgY2Fubm90IHJlbW92ZVxuIiwKKwkJCSAgICAgICBfX0ZVTkNUSU9OX18sIGJ1Zik7CisJCQlkdW1wX3N0YWNrKCk7CisJCQlyZXR1cm47CisJCX0KKworCQl3cml0ZV9sb2NrKCZkZS0+cGFyZW50LT51LmRpci5sb2NrKTsKKwkJX2RldmZzX3VucmVnaXN0ZXIoZGUtPnBhcmVudCwgZGUpOworCQlkZXZmc19wdXQoZGUpOworCQlkZXZmc19wdXQoZGUpOworCX0KK30KKworLyoqCisgKglkZXZmc19nZW5lcmF0ZV9wYXRoIC0gR2VuZXJhdGUgYSBwYXRobmFtZSBmb3IgYW4gZW50cnksIHJlbGF0aXZlIHRvIHRoZSBkZXZmcyByb290LgorICoJQGRlOiBUaGUgZGV2ZnMgZW50cnkuCisgKglAcGF0aDogVGhlIGJ1ZmZlciB0byB3cml0ZSB0aGUgcGF0aG5hbWUgdG8uIFRoZSBwYXRobmFtZSBhbmQgJ1wwJworICoJCXRlcm1pbmF0b3Igd2lsbCBiZSB3cml0dGVuIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KKyAqCUBidWZsZW46IFRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlci4KKyAqCisgKglSZXR1cm5zIHRoZSBvZmZzZXQgaW4gdGhlIGJ1ZmZlciB3aGVyZSB0aGUgcGF0aG5hbWUgc3RhcnRzIG9uIHN1Y2Nlc3MsCisgKgllbHNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqLworCitzdGF0aWMgaW50IGRldmZzX2dlbmVyYXRlX3BhdGgoZGV2ZnNfaGFuZGxlX3QgZGUsIGNoYXIgKnBhdGgsIGludCBidWZsZW4pCit7CisJaW50IHBvczsKKyNkZWZpbmUgTkFNRU9GKGRlKSAoIChkZSktPm1vZGUgPyAoZGUpLT5uYW1lIDogKGRlKS0+dS5uYW1lICkKKworCWlmIChkZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlWRVJJRllfRU5UUlkoZGUpOworCWlmIChkZS0+bmFtZWxlbiA+PSBidWZsZW4pCisJCXJldHVybiAtRU5BTUVUT09MT05HOwkvKiAgTXVzdCBiZSBmaXJzdCAgICAgICAqLworCXBhdGhbYnVmbGVuIC0gMV0gPSAnXDAnOworCWlmIChkZS0+cGFyZW50ID09IE5VTEwpCisJCXJldHVybiBidWZsZW4gLSAxOwkvKiAgRG9uJ3QgcHJlcGVuZCByb290ICAqLworCXBvcyA9IGJ1ZmxlbiAtIGRlLT5uYW1lbGVuIC0gMTsKKwltZW1jcHkocGF0aCArIHBvcywgTkFNRU9GKGRlKSwgZGUtPm5hbWVsZW4pOworCWZvciAoZGUgPSBkZS0+cGFyZW50OyBkZS0+cGFyZW50ICE9IE5VTEw7IGRlID0gZGUtPnBhcmVudCkgeworCQlpZiAocG9zIC0gZGUtPm5hbWVsZW4gLSAxIDwgMCkKKwkJCXJldHVybiAtRU5BTUVUT09MT05HOworCQlwYXRoWy0tcG9zXSA9ICcvJzsKKwkJcG9zIC09IGRlLT5uYW1lbGVuOworCQltZW1jcHkocGF0aCArIHBvcywgTkFNRU9GKGRlKSwgZGUtPm5hbWVsZW4pOworCX0KKwlyZXR1cm4gcG9zOworfQkJCQkvKiAgRW5kIEZ1bmN0aW9uIGRldmZzX2dlbmVyYXRlX3BhdGggICovCisKKy8qKgorICoJZGV2ZnNfc2V0dXAgLSBQcm9jZXNzIGtlcm5lbCBib290IG9wdGlvbnMuCisgKglAc3RyOiBUaGUgYm9vdCBvcHRpb25zIGFmdGVyIHRoZSAiZGV2ZnM9Ii4KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBkZXZmc19zZXR1cChjaGFyICpzdHIpCit7CisJc3RhdGljIHN0cnVjdCB7CisJCWNoYXIgKm5hbWU7CisJCXVuc2lnbmVkIGludCBtYXNrOworCQl1bnNpZ25lZCBpbnQgKm9wdDsKKwl9IGRldmZzX29wdGlvbnNfdGFiW10gX19pbml0ZGF0YSA9IHsKKyNpZmRlZiBDT05GSUdfREVWRlNfREVCVUcKKwkJeworCQkiZGFsbCIsIERFQlVHX0FMTCwgJmRldmZzX2RlYnVnX2luaXR9LCB7CisJCSJkbW9kIiwgREVCVUdfTU9EVUxFX0xPQUQsICZkZXZmc19kZWJ1Z19pbml0fSwgeworCQkiZHJlZyIsIERFQlVHX1JFR0lTVEVSLCAmZGV2ZnNfZGVidWdfaW5pdH0sIHsKKwkJImR1bnJlZyIsIERFQlVHX1VOUkVHSVNURVIsICZkZXZmc19kZWJ1Z19pbml0fSwgeworCQkiZGZyZWUiLCBERUJVR19GUkVFLCAmZGV2ZnNfZGVidWdfaW5pdH0sIHsKKwkJImRpZ2V0IiwgREVCVUdfSV9HRVQsICZkZXZmc19kZWJ1Z19pbml0fSwgeworCQkiZGNoYW5nZSIsIERFQlVHX1NFVF9GTEFHUywgJmRldmZzX2RlYnVnX2luaXR9LCB7CisJCSJkc3JlYWQiLCBERUJVR19TX1JFQUQsICZkZXZmc19kZWJ1Z19pbml0fSwgeworCQkiZGljaGFuZ2UiLCBERUJVR19JX0NIQU5HRSwgJmRldmZzX2RlYnVnX2luaXR9LCB7CisJCSJkaW1rbm9kIiwgREVCVUdfSV9NS05PRCwgJmRldmZzX2RlYnVnX2luaXR9LCB7CisJCSJkaWxvb2t1cCIsIERFQlVHX0lfTE9PS1VQLCAmZGV2ZnNfZGVidWdfaW5pdH0sIHsKKwkJImRpdW5saW5rIiwgREVCVUdfSV9VTkxJTkssICZkZXZmc19kZWJ1Z19pbml0fSwKKyNlbmRpZgkJCQkvKiAgQ09ORklHX0RFVkZTX0RFQlVHICAqLworCQl7CisJCSJtb3VudCIsIE9QVElPTl9NT1VOVCwgJmJvb3Rfb3B0aW9uc30sIHsKKwkJTlVMTCwgMCwgTlVMTH0KKwl9OworCisJd2hpbGUgKCgqc3RyICE9ICdcMCcpICYmICFpc3NwYWNlKCpzdHIpKSB7CisJCWludCBpLCBmb3VuZCA9IDAsIGludmVydCA9IDA7CisKKwkJaWYgKHN0cm5jbXAoc3RyLCAibm8iLCAyKSA9PSAwKSB7CisJCQlpbnZlcnQgPSAxOworCQkJc3RyICs9IDI7CisJCX0KKwkJZm9yIChpID0gMDsgZGV2ZnNfb3B0aW9uc190YWJbaV0ubmFtZSAhPSBOVUxMOyBpKyspIHsKKwkJCWludCBsZW4gPSBzdHJsZW4oZGV2ZnNfb3B0aW9uc190YWJbaV0ubmFtZSk7CisKKwkJCWlmIChzdHJuY21wKHN0ciwgZGV2ZnNfb3B0aW9uc190YWJbaV0ubmFtZSwgbGVuKSA9PSAwKSB7CisJCQkJaWYgKGludmVydCkKKwkJCQkJKmRldmZzX29wdGlvbnNfdGFiW2ldLm9wdCAmPQorCQkJCQkgICAgfmRldmZzX29wdGlvbnNfdGFiW2ldLm1hc2s7CisJCQkJZWxzZQorCQkJCQkqZGV2ZnNfb3B0aW9uc190YWJbaV0ub3B0IHw9CisJCQkJCSAgICBkZXZmc19vcHRpb25zX3RhYltpXS5tYXNrOworCQkJCXN0ciArPSBsZW47CisJCQkJZm91bmQgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICghZm91bmQpCisJCQlyZXR1cm4gMDsJLyogIE5vIG1hdGNoICAgICAgICAgKi8KKwkJaWYgKCpzdHIgIT0gJywnKQorCQkJcmV0dXJuIDA7CS8qICBObyBtb3JlIG9wdGlvbnMgICovCisJCSsrc3RyOworCX0KKwlyZXR1cm4gMTsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBkZXZmc19zZXR1cCAgKi8KKworX19zZXR1cCgiZGV2ZnM9IiwgZGV2ZnNfc2V0dXApOworCitFWFBPUlRfU1lNQk9MKGRldmZzX21rX2Rpcik7CitFWFBPUlRfU1lNQk9MKGRldmZzX3JlbW92ZSk7CisKKy8qKgorICoJdHJ5X21vZGxvYWQgLSBOb3RpZnkgZGV2ZnNkIG9mIGFuIGlub2RlIGxvb2t1cCBieSBhIG5vbi1kZXZmc2QgcHJvY2Vzcy4KKyAqCUBwYXJlbnQ6IFRoZSBwYXJlbnQgZGV2ZnMgZW50cnkuCisgKglAZnNfaW5mbzogVGhlIGZpbGVzeXN0ZW0gaW5mby4KKyAqCUBuYW1lOiBUaGUgZGV2aWNlIG5hbWUuCisgKglAbmFtZWxlbjogVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIEBuYW1lLgorICoJQGJ1ZjogQSB3b3JraW5nIGFyZWEgdGhhdCB3aWxsIGJlIHVzZWQuIFRoaXMgbXVzdCBub3QgZ28gb3V0IG9mIHNjb3BlCisgKiAgICAgICAgICAgIHVudGlsIGRldmZzZCBpcyBpZGxlIGFnYWluLgorICoKKyAqCVJldHVybnMgMCBvbiBzdWNjZXNzIChldmVudCB3YXMgcXVldWVkKSwgZWxzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKi8KKworc3RhdGljIGludCB0cnlfbW9kbG9hZChzdHJ1Y3QgZGV2ZnNfZW50cnkgKnBhcmVudCwgc3RydWN0IGZzX2luZm8gKmZzX2luZm8sCisJCSAgICAgICBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBuYW1lbGVuLAorCQkgICAgICAgc3RydWN0IGRldmZzX2VudHJ5ICpidWYpCit7CisJaWYgKCEoZnNfaW5mby0+ZGV2ZnNkX2V2ZW50X21hc2sgJiAoMSA8PCBERVZGU0RfTk9USUZZX0xPT0tVUCkpKQorCQlyZXR1cm4gLUVOT0VOVDsKKwlpZiAoaXNfZGV2ZnNkX29yX2NoaWxkKGZzX2luZm8pKQorCQlyZXR1cm4gLUVOT0VOVDsKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YgKmJ1Zik7CisJYXRvbWljX3NldCgmYnVmLT5yZWZjb3VudCwgMSk7CisJYnVmLT5wYXJlbnQgPSBwYXJlbnQ7CisJYnVmLT5uYW1lbGVuID0gbmFtZWxlbjsKKwlidWYtPnUubmFtZSA9IG5hbWU7CisJV1JJVEVfRU5UUllfTUFHSUMoYnVmLCBNQUdJQ19WQUxVRSk7CisJaWYgKCFkZXZmc2Rfbm90aWZ5X2RlKGJ1ZiwgREVWRlNEX05PVElGWV9MT09LVVAsIDAsCisJCQkgICAgICBjdXJyZW50LT5ldWlkLCBjdXJyZW50LT5lZ2lkLCBmc19pbmZvKSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJLyogIFBvc3NpYmxlIHN1Y2Nlc3M6IGV2ZW50IGhhcyBiZWVuIHF1ZXVlZCAgKi8KKwlyZXR1cm4gMDsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiB0cnlfbW9kbG9hZCAgKi8KKworLyogIFN1cGVyYmxvY2sgb3BlcmF0aW9ucyBmb2xsb3cgICovCisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBkZXZmc19pb3BzOworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGRldmZzX2Rpcl9pb3BzOworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGV2ZnNfZm9wczsKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRldmZzX2Rpcl9mb3BzOworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGRldmZzX3N5bWxpbmtfaW9wczsKKworc3RhdGljIGludCBkZXZmc19ub3RpZnlfY2hhbmdlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICppYXR0cikKK3sKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBkZXZmc19lbnRyeSAqZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZnNfaW5mbyAqZnNfaW5mbyA9IGlub2RlLT5pX3NiLT5zX2ZzX2luZm87CisKKwlkZSA9IGdldF9kZXZmc19lbnRyeV9mcm9tX3Zmc19pbm9kZShpbm9kZSk7CisJaWYgKGRlID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCXJldHZhbCA9IGlub2RlX2NoYW5nZV9vayhpbm9kZSwgaWF0dHIpOworCWlmIChyZXR2YWwgIT0gMCkKKwkJcmV0dXJuIHJldHZhbDsKKwlyZXR2YWwgPSBpbm9kZV9zZXRhdHRyKGlub2RlLCBpYXR0cik7CisJaWYgKHJldHZhbCAhPSAwKQorCQlyZXR1cm4gcmV0dmFsOworCURQUklOVEsoREVCVUdfSV9DSEFOR0UsICIoJWQpOiBWRlMgaW5vZGU6ICVwICBkZXZmc19lbnRyeTogJXBcbiIsCisJCShpbnQpaW5vZGUtPmlfaW5vLCBpbm9kZSwgZGUpOworCURQUklOVEsoREVCVUdfSV9DSEFOR0UsICIoKTogICBtb2RlOiAwJW8gIHVpZDogJWQgIGdpZDogJWRcbiIsCisJCShpbnQpaW5vZGUtPmlfbW9kZSwgKGludClpbm9kZS0+aV91aWQsIChpbnQpaW5vZGUtPmlfZ2lkKTsKKwkvKiAgSW5vZGUgaXMgbm90IG9uIGhhc2ggY2hhaW5zLCB0aHVzIG11c3Qgc2F2ZSBwZXJtaXNzaW9ucyBoZXJlIHJhdGhlcgorCSAgIHRoYW4gaW4gYSB3cml0ZV9pbm9kZSgpIG1ldGhvZCAgKi8KKwlkZS0+bW9kZSA9IGlub2RlLT5pX21vZGU7CisJZGUtPmlub2RlLnVpZCA9IGlub2RlLT5pX3VpZDsKKwlkZS0+aW5vZGUuZ2lkID0gaW5vZGUtPmlfZ2lkOworCWRlLT5pbm9kZS5hdGltZSA9IGlub2RlLT5pX2F0aW1lOworCWRlLT5pbm9kZS5tdGltZSA9IGlub2RlLT5pX210aW1lOworCWRlLT5pbm9kZS5jdGltZSA9IGlub2RlLT5pX2N0aW1lOworCWlmICgoaWF0dHItPmlhX3ZhbGlkICYgKEFUVFJfTU9ERSB8IEFUVFJfVUlEIHwgQVRUUl9HSUQpKSAmJgorCSAgICAhaXNfZGV2ZnNkX29yX2NoaWxkKGZzX2luZm8pKQorCQlkZXZmc2Rfbm90aWZ5X2RlKGRlLCBERVZGU0RfTk9USUZZX0NIQU5HRSwgaW5vZGUtPmlfbW9kZSwKKwkJCQkgaW5vZGUtPmlfdWlkLCBpbm9kZS0+aV9naWQsIGZzX2luZm8pOworCXJldHVybiAwOworfQkJCQkvKiAgRW5kIEZ1bmN0aW9uIGRldmZzX25vdGlmeV9jaGFuZ2UgICovCisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBkZXZmc19zb3BzID0geworCS5kcm9wX2lub2RlID0gZ2VuZXJpY19kZWxldGVfaW5vZGUsCisJLnN0YXRmcyA9IHNpbXBsZV9zdGF0ZnMsCit9OworCisvKioKKyAqCV9kZXZmc19nZXRfdmZzX2lub2RlIC0gR2V0IGEgVkZTIGlub2RlLgorICoJQHNiOiBUaGUgc3VwZXIgYmxvY2suCisgKglAZGU6IFRoZSBkZXZmcyBpbm9kZS4KKyAqCUBkZW50cnk6IFRoZSBkZW50cnkgdG8gcmVnaXN0ZXIgd2l0aCB0aGUgZGV2ZnMgaW5vZGUuCisgKgorICoJUmV0dXJucyB0aGUgaW5vZGUgb24gc3VjY2VzcywgZWxzZSAlTlVMTC4gQW4gaW1wbGljaXQgZGV2ZnNfZ2V0KCkgaXMKKyAqICAgICAgIHBlcmZvcm1lZCBpZiB0aGUgaW5vZGUgaXMgY3JlYXRlZC4KKyAqLworCitzdGF0aWMgc3RydWN0IGlub2RlICpfZGV2ZnNfZ2V0X3Zmc19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCQkgIHN0cnVjdCBkZXZmc19lbnRyeSAqZGUsCisJCQkJCSAgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwlpZiAoZGUtPnByZXYgPT0gZGUpCisJCXJldHVybiBOVUxMOwkvKiAgUXVpY2sgY2hlY2sgdG8gc2VlIGlmIHVuaG9va2VkICAqLworCWlmICgoaW5vZGUgPSBuZXdfaW5vZGUoc2IpKSA9PSBOVUxMKSB7CisJCVBSSU5USygiKCVzKTogbmV3X2lub2RlKCkgZmFpbGVkLCBkZTogJXBcbiIsIGRlLT5uYW1lLCBkZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoZGUtPnBhcmVudCkgeworCQlyZWFkX2xvY2soJmRlLT5wYXJlbnQtPnUuZGlyLmxvY2spOworCQlpZiAoZGUtPnByZXYgIT0gZGUpCisJCQlkZS0+aW5vZGUuZGVudHJ5ID0gZGVudHJ5OwkvKiAgICAgIE5vdCB1bmhvb2tlZCAgKi8KKwkJcmVhZF91bmxvY2soJmRlLT5wYXJlbnQtPnUuZGlyLmxvY2spOworCX0gZWxzZQorCQlkZS0+aW5vZGUuZGVudHJ5ID0gZGVudHJ5OwkvKiAgUm9vdDogbm8gbG9ja2luZyBuZWVkZWQgICovCisJaWYgKGRlLT5pbm9kZS5kZW50cnkgIT0gZGVudHJ5KSB7CS8qICBNdXN0IGhhdmUgYmVlbiB1bmhvb2tlZCAgKi8KKwkJaXB1dChpbm9kZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvKiBGSVhNRSB3aGVyZSBpcyBkZXZmc19wdXQ/ICovCisJaW5vZGUtPnUuZ2VuZXJpY19pcCA9IGRldmZzX2dldChkZSk7CisJaW5vZGUtPmlfaW5vID0gZGUtPmlub2RlLmlubzsKKwlEUFJJTlRLKERFQlVHX0lfR0VULCAiKCVkKTogVkZTIGlub2RlOiAlcCAgZGV2ZnNfZW50cnk6ICVwXG4iLAorCQkoaW50KWlub2RlLT5pX2lubywgaW5vZGUsIGRlKTsKKwlpbm9kZS0+aV9ibG9ja3MgPSAwOworCWlub2RlLT5pX2Jsa3NpemUgPSBGQUtFX0JMT0NLX1NJWkU7CisJaW5vZGUtPmlfb3AgPSAmZGV2ZnNfaW9wczsKKwlpbm9kZS0+aV9tb2RlID0gZGUtPm1vZGU7CisJaWYgKFNfSVNESVIoZGUtPm1vZGUpKSB7CisJCWlub2RlLT5pX29wID0gJmRldmZzX2Rpcl9pb3BzOworCQlpbm9kZS0+aV9mb3AgPSAmZGV2ZnNfZGlyX2ZvcHM7CisJfSBlbHNlIGlmIChTX0lTTE5LKGRlLT5tb2RlKSkgeworCQlpbm9kZS0+aV9vcCA9ICZkZXZmc19zeW1saW5rX2lvcHM7CisJCWlub2RlLT5pX3NpemUgPSBkZS0+dS5zeW1saW5rLmxlbmd0aDsKKwl9IGVsc2UgaWYgKFNfSVNDSFIoZGUtPm1vZGUpIHx8IFNfSVNCTEsoZGUtPm1vZGUpKSB7CisJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgZGUtPm1vZGUsIGRlLT51LmRldik7CisJfSBlbHNlIGlmIChTX0lTRklGTyhkZS0+bW9kZSkgfHwgU19JU1NPQ0soZGUtPm1vZGUpKSB7CisJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgZGUtPm1vZGUsIDApOworCX0gZWxzZSB7CisJCVBSSU5USygiKCVzKTogdW5rbm93biBtb2RlICVvIGRlOiAlcFxuIiwKKwkJICAgICAgIGRlLT5uYW1lLCBkZS0+bW9kZSwgZGUpOworCQlpcHV0KGlub2RlKTsKKwkJZGV2ZnNfcHV0KGRlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaW5vZGUtPmlfdWlkID0gZGUtPmlub2RlLnVpZDsKKwlpbm9kZS0+aV9naWQgPSBkZS0+aW5vZGUuZ2lkOworCWlub2RlLT5pX2F0aW1lID0gZGUtPmlub2RlLmF0aW1lOworCWlub2RlLT5pX210aW1lID0gZGUtPmlub2RlLm10aW1lOworCWlub2RlLT5pX2N0aW1lID0gZGUtPmlub2RlLmN0aW1lOworCURQUklOVEsoREVCVUdfSV9HRVQsICIoKTogICBtb2RlOiAwJW8gIHVpZDogJWQgIGdpZDogJWRcbiIsCisJCShpbnQpaW5vZGUtPmlfbW9kZSwgKGludClpbm9kZS0+aV91aWQsIChpbnQpaW5vZGUtPmlfZ2lkKTsKKwlyZXR1cm4gaW5vZGU7Cit9CQkJCS8qICBFbmQgRnVuY3Rpb24gX2RldmZzX2dldF92ZnNfaW5vZGUgICovCisKKy8qICBGaWxlIG9wZXJhdGlvbnMgZm9yIGRldmljZSBlbnRyaWVzIGZvbGxvdyAgKi8KKworc3RhdGljIGludCBkZXZmc19yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCWludCBlcnIsIGNvdW50OworCWludCBzdG9yZWQgPSAwOworCXN0cnVjdCBmc19pbmZvICpmc19pbmZvOworCXN0cnVjdCBkZXZmc19lbnRyeSAqcGFyZW50LCAqZGUsICpuZXh0ID0gTlVMTDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisKKwlmc19pbmZvID0gaW5vZGUtPmlfc2ItPnNfZnNfaW5mbzsKKwlwYXJlbnQgPSBnZXRfZGV2ZnNfZW50cnlfZnJvbV92ZnNfaW5vZGUoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCWlmICgobG9uZylmaWxlLT5mX3BvcyA8IDApCisJCXJldHVybiAtRUlOVkFMOworCURQUklOVEsoREVCVUdfRl9SRUFERElSLCAiKCVzKTogZnNfaW5mbzogJXAgIHBvczogJWxkXG4iLAorCQlwYXJlbnQtPm5hbWUsIGZzX2luZm8sIChsb25nKWZpbGUtPmZfcG9zKTsKKwlzd2l0Y2ggKChsb25nKWZpbGUtPmZfcG9zKSB7CisJY2FzZSAwOgorCQllcnIgPSAoKmZpbGxkaXIpIChkaXJlbnQsICIuLiIsIDIsIGZpbGUtPmZfcG9zLAorCQkJCSAgcGFyZW50X2lubyhmaWxlLT5mX2RlbnRyeSksIERUX0RJUik7CisJCWlmIChlcnIgPT0gLUVJTlZBTCkKKwkJCWJyZWFrOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWZpbGUtPmZfcG9zKys7CisJCSsrc3RvcmVkOworCQkvKiAgRmFsbCB0aHJvdWdoICAqLworCWNhc2UgMToKKwkJZXJyID0KKwkJICAgICgqZmlsbGRpcikgKGRpcmVudCwgIi4iLCAxLCBmaWxlLT5mX3BvcywgaW5vZGUtPmlfaW5vLAorCQkJCURUX0RJUik7CisJCWlmIChlcnIgPT0gLUVJTlZBTCkKKwkJCWJyZWFrOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWZpbGUtPmZfcG9zKys7CisJCSsrc3RvcmVkOworCQkvKiAgRmFsbCB0aHJvdWdoICAqLworCWRlZmF1bHQ6CisJCS8qICBTa2lwIGVudHJpZXMgICovCisJCWNvdW50ID0gZmlsZS0+Zl9wb3MgLSAyOworCQlyZWFkX2xvY2soJnBhcmVudC0+dS5kaXIubG9jayk7CisJCWZvciAoZGUgPSBwYXJlbnQtPnUuZGlyLmZpcnN0OyBkZSAmJiAoY291bnQgPiAwKTsgZGUgPSBkZS0+bmV4dCkKKwkJCS0tY291bnQ7CisJCWRldmZzX2dldChkZSk7CisJCXJlYWRfdW5sb2NrKCZwYXJlbnQtPnUuZGlyLmxvY2spOworCQkvKiAgTm93IGFkZCBhbGwgcmVtYWluaW5nIGVudHJpZXMgICovCisJCXdoaWxlIChkZSkgeworCQkJZXJyID0gKCpmaWxsZGlyKSAoZGlyZW50LCBkZS0+bmFtZSwgZGUtPm5hbWVsZW4sCisJCQkJCSAgZmlsZS0+Zl9wb3MsIGRlLT5pbm9kZS5pbm8sCisJCQkJCSAgZGUtPm1vZGUgPj4gMTIpOworCQkJaWYgKGVyciA8IDApCisJCQkJZGV2ZnNfcHV0KGRlKTsKKwkJCWVsc2UgeworCQkJCWZpbGUtPmZfcG9zKys7CisJCQkJKytzdG9yZWQ7CisJCQl9CisJCQlpZiAoZXJyID09IC1FSU5WQUwpCisJCQkJYnJlYWs7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQkJcmVhZF9sb2NrKCZwYXJlbnQtPnUuZGlyLmxvY2spOworCQkJbmV4dCA9IGRldmZzX2dldChkZS0+bmV4dCk7CisJCQlyZWFkX3VubG9jaygmcGFyZW50LT51LmRpci5sb2NrKTsKKwkJCWRldmZzX3B1dChkZSk7CisJCQlkZSA9IG5leHQ7CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiBzdG9yZWQ7Cit9CQkJCS8qICBFbmQgRnVuY3Rpb24gZGV2ZnNfcmVhZGRpciAgKi8KKworLyogT3BlbiBkZXZmcyBzcGVjaWZpYyBzcGVjaWFsIGZpbGVzICovCitzdGF0aWMgaW50IGRldmZzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IGVycjsKKwlpbnQgbWlub3IgPSBNSU5PUihpbm9kZS0+aV9yZGV2KTsKKwlzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpvbGRfZm9wcywgKm5ld19mb3BzOworCisJc3dpdGNoIChtaW5vcikgeworCWNhc2UgMDoJCS8qIC9kZXYvLmRldmZzZCAqLworCQluZXdfZm9wcyA9IGZvcHNfZ2V0KCZkZXZmc2RfZm9wcyk7CisJCWJyZWFrOworI2lmZGVmIENPTkZJR19ERVZGU19ERUJVRworCWNhc2UgMToJCS8qIC9kZXYvLnN0YXQgKi8KKwkJbmV3X2ZvcHMgPSBmb3BzX2dldCgmc3RhdF9mb3BzKTsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAobmV3X2ZvcHMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJb2xkX2ZvcHMgPSBmaWxlLT5mX29wOworCWZpbGUtPmZfb3AgPSBuZXdfZm9wczsKKwllcnIgPSBuZXdfZm9wcy0+b3BlbiA/IG5ld19mb3BzLT5vcGVuKGlub2RlLCBmaWxlKSA6IDA7CisJaWYgKGVycikgeworCQlmaWxlLT5mX29wID0gb2xkX2ZvcHM7CisJCWZvcHNfcHV0KG5ld19mb3BzKTsKKwl9IGVsc2UKKwkJZm9wc19wdXQob2xkX2ZvcHMpOworCXJldHVybiBlcnI7Cit9CQkJCS8qICBFbmQgRnVuY3Rpb24gZGV2ZnNfb3BlbiAgKi8KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGV2ZnNfZm9wcyA9IHsKKwkub3BlbiA9IGRldmZzX29wZW4sCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZXZmc19kaXJfZm9wcyA9IHsKKwkucmVhZCA9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIgPSBkZXZmc19yZWFkZGlyLAorfTsKKworLyogIERlbnRyeSBvcGVyYXRpb25zIGZvciBkZXZpY2UgZW50cmllcyBmb2xsb3cgICovCisKKy8qKgorICoJZGV2ZnNfZF9yZWxlYXNlIC0gQ2FsbGJhY2sgZm9yIHdoZW4gYSBkZW50cnkgaXMgZnJlZWQuCisgKglAZGVudHJ5OiBUaGUgZGVudHJ5LgorICovCisKK3N0YXRpYyB2b2lkIGRldmZzX2RfcmVsZWFzZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJRFBSSU5USyhERUJVR19EX1JFTEVBU0UsICIoJXApOiBpbm9kZTogJXBcbiIsIGRlbnRyeSwgZGVudHJ5LT5kX2lub2RlKTsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBkZXZmc19kX3JlbGVhc2UgICovCisKKy8qKgorICoJZGV2ZnNfZF9pcHV0IC0gQ2FsbGJhY2sgZm9yIHdoZW4gYSBkZW50cnkgbG9zZXMgaXRzIGlub2RlLgorICoJQGRlbnRyeTogVGhlIGRlbnRyeS4KKyAqCUBpbm9kZToJVGhlIGlub2RlLgorICovCisKK3N0YXRpYyB2b2lkIGRldmZzX2RfaXB1dChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGRldmZzX2VudHJ5ICpkZTsKKworCWRlID0gZ2V0X2RldmZzX2VudHJ5X2Zyb21fdmZzX2lub2RlKGlub2RlKTsKKwlEUFJJTlRLKERFQlVHX0RfSVBVVCwKKwkJIiglcyk6IGRlbnRyeTogJXAgaW5vZGU6ICVwIGRlOiAlcCBkZS0+ZGVudHJ5OiAlcFxuIiwgZGUtPm5hbWUsCisJCWRlbnRyeSwgaW5vZGUsIGRlLCBkZS0+aW5vZGUuZGVudHJ5KTsKKwlpZiAoZGUtPmlub2RlLmRlbnRyeSAmJiAoZGUtPmlub2RlLmRlbnRyeSAhPSBkZW50cnkpKQorCQlPT1BTKCIoJXMpOiBkZTogJXAgZGVudHJ5OiAlcCBkZS0+ZGVudHJ5OiAlcFxuIiwKKwkJICAgICBkZS0+bmFtZSwgZGUsIGRlbnRyeSwgZGUtPmlub2RlLmRlbnRyeSk7CisJZGUtPmlub2RlLmRlbnRyeSA9IE5VTEw7CisJaXB1dChpbm9kZSk7CisJZGV2ZnNfcHV0KGRlKTsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBkZXZmc19kX2lwdXQgICovCisKK3N0YXRpYyBpbnQgZGV2ZnNfZF9kZWxldGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKKworc3RhdGljIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBkZXZmc19kb3BzID0geworCS5kX2RlbGV0ZSA9IGRldmZzX2RfZGVsZXRlLAorCS5kX3JlbGVhc2UgPSBkZXZmc19kX3JlbGVhc2UsCisJLmRfaXB1dCA9IGRldmZzX2RfaXB1dCwKK307CisKK3N0YXRpYyBpbnQgZGV2ZnNfZF9yZXZhbGlkYXRlX3dhaXQoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICopOworCitzdGF0aWMgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGRldmZzX3dhaXRfZG9wcyA9IHsKKwkuZF9kZWxldGUgPSBkZXZmc19kX2RlbGV0ZSwKKwkuZF9yZWxlYXNlID0gZGV2ZnNfZF9yZWxlYXNlLAorCS5kX2lwdXQgPSBkZXZmc19kX2lwdXQsCisJLmRfcmV2YWxpZGF0ZSA9IGRldmZzX2RfcmV2YWxpZGF0ZV93YWl0LAorfTsKKworLyoqCisgKglkZXZmc19kX2RlbGV0ZSAtIENhbGxiYWNrIGZvciB3aGVuIGFsbCBmaWxlcyBmb3IgYSBkZW50cnkgYXJlIGNsb3NlZC4KKyAqCUBkZW50cnk6IFRoZSBkZW50cnkuCisgKi8KKworc3RhdGljIGludCBkZXZmc19kX2RlbGV0ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKworCWlmIChkZW50cnktPmRfb3AgPT0gJmRldmZzX3dhaXRfZG9wcykKKwkJZGVudHJ5LT5kX29wID0gJmRldmZzX2RvcHM7CisJLyogIFVuaGFzaCBkZW50cnkgaWYgbmVnYXRpdmUgKGhhcyBubyBpbm9kZSkgICovCisJaWYgKGlub2RlID09IE5VTEwpIHsKKwkJRFBSSU5USyhERUJVR19EX0RFTEVURSwgIiglcCk6IGRyb3BwaW5nIG5lZ2F0aXZlIGRlbnRyeVxuIiwKKwkJCWRlbnRyeSk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBkZXZmc19kX2RlbGV0ZSAgKi8KKworc3RydWN0IGRldmZzX2xvb2t1cF9zdHJ1Y3QgeworCWRldmZzX2hhbmRsZV90IGRlOworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfcXVldWU7Cit9OworCisvKiBYWFg6IHRoaXMgZG9lc24ndCBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2UgZ290IGEgbmVnYXRpdmUgZGVudHJ5CisgICAgICAgIGJ1dCBhIGRldmZzIGVudHJ5IGhhcyBiZWVuIHJlZ2lzdGVyZWQgaW4gdGhlIG1lYW53aGlsZSAqLworc3RhdGljIGludCBkZXZmc19kX3JldmFsaWRhdGVfd2FpdChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZSAqZGlyID0gZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZnNfaW5mbyAqZnNfaW5mbyA9IGRpci0+aV9zYi0+c19mc19pbmZvOworCWRldmZzX2hhbmRsZV90IHBhcmVudCA9IGdldF9kZXZmc19lbnRyeV9mcm9tX3Zmc19pbm9kZShkaXIpOworCXN0cnVjdCBkZXZmc19sb29rdXBfc3RydWN0ICpsb29rdXBfaW5mbyA9IGRlbnRyeS0+ZF9mc2RhdGE7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJaW50IG5lZWRfbG9jazsKKworCS8qCisJICogRklYTUUgSEFDSworCSAqCisJICogbWFrZSBzdXJlIHRoYXQKKwkgKiAgIGRfaW5zdGFudGlhdGUgYWx3YXlzIHJ1bnMgdW5kZXIgbG9jaworCSAqICAgd2UgcmVsZWFzZSBpX3NlbSBsb2NrIGJlZm9yZSBnb2luZyB0byBzbGVlcAorCSAqCisJICogdW5mb3J0dW5hdGVseSBzb21ldGltZXMgZF9yZXZhbGlkYXRlIGlzIGNhbGxlZCB3aXRoCisJICogYW5kIHNvbWV0aW1lcyB3aXRob3V0IGlfc2VtIGxvY2sgaGVsZC4gVGhlIGZvbGxvd2luZyBjaGVja3MKKwkgKiBhdHRlbXB0IHRvIGRlZHVjZSB3aGVuIHdlIG5lZWQgdG8gYWRkIChhbmQgZHJvcCByZXNwLikgbG9jaworCSAqIGhlcmUuIFRoaXMgcmVsaWVzIG9uIGN1cnJlbnQgKDIuNi4yKSBjYWxsaW5nIGNvdmVudGlvbnM6CisJICoKKwkgKiAgIGxvb2t1cF9oYXNoIGlzIGFsd2F5cyBydW4gdW5kZXIgaV9zZW0gYW5kIGlzIHBhc3NpbmcgTlVMTAorCSAqICAgYXMgbmQKKwkgKgorCSAqICAgb3BlbiguLi4sT19DUkVBVEUsLi4uKSBjYWxscyBfbG9va3VwX2hhc2ggdW5kZXIgaV9zZW0KKwkgKiAgIGFuZCBzZXRzIGZsYWdzIHRvIExPT0tVUF9PUEVOfExPT0tVUF9DUkVBVEUKKwkgKgorCSAqICAgYWxsIG90aGVyIGludm9jYXRpb25zIG9mIC0+ZF9yZXZhbGlkYXRlIHNlZW0gdG8gaGFwcGVuCisJICogICBvdXRzaWRlIG9mIGlfc2VtCisJICovCisJbmVlZF9sb2NrID0gbmQgJiYKKwkgICAgKCEobmQtPmZsYWdzICYgTE9PS1VQX0NSRUFURSkgfHwgKG5kLT5mbGFncyAmIExPT0tVUF9QQVJFTlQpKTsKKworCWlmIChuZWVkX2xvY2spCisJCWRvd24oJmRpci0+aV9zZW0pOworCisJaWYgKGlzX2RldmZzZF9vcl9jaGlsZChmc19pbmZvKSkgeworCQlkZXZmc19oYW5kbGVfdCBkZSA9IGxvb2t1cF9pbmZvLT5kZTsKKwkJc3RydWN0IGlub2RlICppbm9kZTsKKworCQlEUFJJTlRLKERFQlVHX0lfTE9PS1VQLAorCQkJIiglcyk6IGRlbnRyeTogJXAgaW5vZGU6ICVwIGRlOiAlcCBieTogXCIlc1wiXG4iLAorCQkJZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LCBkZW50cnktPmRfaW5vZGUsIGRlLAorCQkJY3VycmVudC0+Y29tbSk7CisJCWlmIChkZW50cnktPmRfaW5vZGUpCisJCQlnb3RvIG91dDsKKwkJaWYgKGRlID09IE5VTEwpIHsKKwkJCXJlYWRfbG9jaygmcGFyZW50LT51LmRpci5sb2NrKTsKKwkJCWRlID0gX2RldmZzX3NlYXJjaF9kaXIocGFyZW50LCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkJCQkgICAgICAgZGVudHJ5LT5kX25hbWUubGVuKTsKKwkJCXJlYWRfdW5sb2NrKCZwYXJlbnQtPnUuZGlyLmxvY2spOworCQkJaWYgKGRlID09IE5VTEwpCisJCQkJZ290byBvdXQ7CisJCQlsb29rdXBfaW5mby0+ZGUgPSBkZTsKKwkJfQorCQkvKiAgQ3JlYXRlIGFuIGlub2RlLCBub3cgdGhhdCB0aGUgZHJpdmVyIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSAgKi8KKwkJaW5vZGUgPSBfZGV2ZnNfZ2V0X3Zmc19pbm9kZShkaXItPmlfc2IsIGRlLCBkZW50cnkpOworCQlpZiAoIWlub2RlKQorCQkJZ290byBvdXQ7CisJCURQUklOVEsoREVCVUdfSV9MT09LVVAsCisJCQkiKCVzKTogbmV3IFZGUyBpbm9kZSgldSk6ICVwIGRlOiAlcCBieTogXCIlc1wiXG4iLAorCQkJZGUtPm5hbWUsIGRlLT5pbm9kZS5pbm8sIGlub2RlLCBkZSwgY3VycmVudC0+Y29tbSk7CisJCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAobG9va3VwX2luZm8gPT0gTlVMTCkKKwkJZ290byBvdXQ7CS8qICBFYXJseSB0ZXJtaW5hdGlvbiAgKi8KKwlyZWFkX2xvY2soJnBhcmVudC0+dS5kaXIubG9jayk7CisJaWYgKGRlbnRyeS0+ZF9mc2RhdGEpIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlhZGRfd2FpdF9xdWV1ZSgmbG9va3VwX2luZm8tPndhaXRfcXVldWUsICZ3YWl0KTsKKwkJcmVhZF91bmxvY2soJnBhcmVudC0+dS5kaXIubG9jayk7CisJCS8qIGF0IHRoaXMgcG9pbnQgaXQgaXMgYWx3YXlzIChob3BlZnVsbHkpIGxvY2tlZCAqLworCQl1cCgmZGlyLT5pX3NlbSk7CisJCXNjaGVkdWxlKCk7CisJCWRvd24oJmRpci0+aV9zZW0pOworCQkvKgorCQkgKiBUaGlzIGRvZXMgbm90IG5lZWQgbm9yIHNob3VsZCByZW1vdmUgd2FpdCBmcm9tIHdhaXRfcXVldWUuCisJCSAqIFdhaXQgcXVldWUgaGVhZCBpcyBuZXZlciByZXVzZWQgLSBub3RoaW5nIGlzIGV2ZXIgYWRkZWQgdG8gaXQKKwkJICogYWZ0ZXIgYWxsIHdhaXRlcnMgaGF2ZSBiZWVuIHdha2VkIHVwIGFuZCBoZWFkIGl0c2VsZiBkaXNhcHBlYXJzCisJCSAqIHZlcnkgc29vbiBhZnRlciBpdC4gTW9yZW92ZXIgaXQgaXMgbG9jYWwgdmFyaWFibGUgb24gc3RhY2sgdGhhdAorCQkgKiBpcyBsaWtlbHkgdG8gaGF2ZSBhbHJlYWR5IGRpc2FwcGVhcmVkIHNvIGFueSByZWZlcmVuY2UgdG8gaXQKKwkJICogYXQgdGhpcyBwb2ludCBpcyBidWdneS4KKwkJICovCisKKwl9IGVsc2UKKwkJcmVhZF91bmxvY2soJnBhcmVudC0+dS5kaXIubG9jayk7CisKKyAgICAgIG91dDoKKwlpZiAobmVlZF9sb2NrKQorCQl1cCgmZGlyLT5pX3NlbSk7CisJcmV0dXJuIDE7Cit9CQkJCS8qICBFbmQgRnVuY3Rpb24gZGV2ZnNfZF9yZXZhbGlkYXRlX3dhaXQgICovCisKKy8qICBJbm9kZSBvcGVyYXRpb25zIGZvciBkZXZpY2UgZW50cmllcyBmb2xsb3cgICovCisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZXZmc19sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCQkgICBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgZGV2ZnNfZW50cnkgdG1wOwkvKiAgTXVzdCBzdGF5IGluIHNjb3BlIHVudGlsIGRldmZzZCBpZGxlIGFnYWluICAqLworCXN0cnVjdCBkZXZmc19sb29rdXBfc3RydWN0IGxvb2t1cF9pbmZvOworCXN0cnVjdCBmc19pbmZvICpmc19pbmZvID0gZGlyLT5pX3NiLT5zX2ZzX2luZm87CisJc3RydWN0IGRldmZzX2VudHJ5ICpwYXJlbnQsICpkZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBkZW50cnkgKnJldHZhbCA9IE5VTEw7CisKKwkvKiAgU2V0IHVwIHRoZSBkZW50cnkgb3BlcmF0aW9ucyBiZWZvcmUgYW55dGhpbmcgZWxzZSwgdG8gZW5zdXJlIGNsZWFuaW5nCisJICAgdXAgb24gYW55IGVycm9yICAqLworCWRlbnRyeS0+ZF9vcCA9ICZkZXZmc19kb3BzOworCS8qICBGaXJzdCB0cnkgdG8gZ2V0IHRoZSBkZXZmcyBlbnRyeSBmb3IgdGhpcyBkaXJlY3RvcnkgICovCisJcGFyZW50ID0gZ2V0X2RldmZzX2VudHJ5X2Zyb21fdmZzX2lub2RlKGRpcik7CisJRFBSSU5USyhERUJVR19JX0xPT0tVUCwgIiglcyk6IGRlbnRyeTogJXAgcGFyZW50OiAlcCBieTogXCIlc1wiXG4iLAorCQlkZW50cnktPmRfbmFtZS5uYW1lLCBkZW50cnksIHBhcmVudCwgY3VycmVudC0+Y29tbSk7CisJaWYgKHBhcmVudCA9PSBOVUxMKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKKwlyZWFkX2xvY2soJnBhcmVudC0+dS5kaXIubG9jayk7CisJZGUgPSBfZGV2ZnNfc2VhcmNoX2RpcihwYXJlbnQsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLmxlbik7CisJcmVhZF91bmxvY2soJnBhcmVudC0+dS5kaXIubG9jayk7CisJbG9va3VwX2luZm8uZGUgPSBkZTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZsb29rdXBfaW5mby53YWl0X3F1ZXVlKTsKKwlkZW50cnktPmRfZnNkYXRhID0gJmxvb2t1cF9pbmZvOworCWlmIChkZSA9PSBOVUxMKSB7CS8qICBUcnkgd2l0aCBkZXZmc2QuIEZvciBhbnkga2luZCBvZiBmYWlsdXJlLCBsZWF2ZSBhIG5lZ2F0aXZlIGRlbnRyeQorCQkJCSAgIHNvIHNvbWVvbmUgZWxzZSBjYW4gZGVhbCB3aXRoIGl0IChpbiB0aGUgY2FzZSB3aGVyZSB0aGUgc3lzYWRtaW4KKwkJCQkgICBkb2VzIGEgbWtub2QoKSkuIEl0J3MgaW1wb3J0YW50IHRvIGRvIHRoaXMgYmVmb3JlIGhhc2hpbmcgdGhlCisJCQkJICAgZGVudHJ5LCBzbyB0aGF0IHRoZSBkZXZmc2QgcXVldWUgaXMgZmlsbGVkIGJlZm9yZSByZXZhbGlkYXRlcworCQkJCSAgIGNhbiBzdGFydCAgKi8KKwkJaWYgKHRyeV9tb2Rsb2FkKHBhcmVudCwgZnNfaW5mbywgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLCAmdG1wKSA8IDApIHsJLyogIExvb2t1cCBldmVudCB3YXMgbm90IHF1ZXVlZCB0byBkZXZmc2QgICovCisJCQlkX2FkZChkZW50cnksIE5VTEwpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisJZGVudHJ5LT5kX29wID0gJmRldmZzX3dhaXRfZG9wczsKKwlkX2FkZChkZW50cnksIE5VTEwpOwkvKiAgT3BlbiB0aGUgZmxvb2RnYXRlcyAgKi8KKwkvKiAgVW5sb2NrIGRpcmVjdG9yeSBzZW1hcGhvcmUsIHdoaWNoIHdpbGwgcmVsZWFzZSBhbnkgd2FpdGVycy4gVGhleQorCSAgIHdpbGwgZ2V0IHRoZSBoYXNoZWQgZGVudHJ5LCBhbmQgbWF5IGJlIGZvcmNlZCB0byB3YWl0IGZvcgorCSAgIHJldmFsaWRhdGlvbiAgKi8KKwl1cCgmZGlyLT5pX3NlbSk7CisJd2FpdF9mb3JfZGV2ZnNkX2ZpbmlzaGVkKGZzX2luZm8pOwkvKiAgSWYgSSdtIG5vdCBkZXZmc2QsIG11c3Qgd2FpdCAgKi8KKwlkb3duKCZkaXItPmlfc2VtKTsJLyogIEdyYWIgaXQgYWdhaW4gYmVjYXVzZSB0aGVtJ3MgdGhlIHJ1bGVzICAqLworCWRlID0gbG9va3VwX2luZm8uZGU7CisJLyogIElmIHNvbWVvbmUgZWxzZSBoYXMgYmVlbiBzbyBraW5kIGFzIHRvIG1ha2UgdGhlIGlub2RlLCB3ZSBnbyBob21lCisJICAgZWFybHkgICovCisJaWYgKGRlbnRyeS0+ZF9pbm9kZSkKKwkJZ290byBvdXQ7CisJaWYgKGRlID09IE5VTEwpIHsKKwkJcmVhZF9sb2NrKCZwYXJlbnQtPnUuZGlyLmxvY2spOworCQlkZSA9IF9kZXZmc19zZWFyY2hfZGlyKHBhcmVudCwgZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCQkgICAgICAgZGVudHJ5LT5kX25hbWUubGVuKTsKKwkJcmVhZF91bmxvY2soJnBhcmVudC0+dS5kaXIubG9jayk7CisJCWlmIChkZSA9PSBOVUxMKQorCQkJZ290byBvdXQ7CisJCS8qICBPSywgdGhlcmUncyBhbiBlbnRyeSBub3csIGJ1dCBubyBWRlMgaW5vZGUgeWV0ICAqLworCX0KKwkvKiAgQ3JlYXRlIGFuIGlub2RlLCBub3cgdGhhdCB0aGUgZHJpdmVyIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSAgKi8KKwlpbm9kZSA9IF9kZXZmc19nZXRfdmZzX2lub2RlKGRpci0+aV9zYiwgZGUsIGRlbnRyeSk7CisJaWYgKCFpbm9kZSkgeworCQlyZXR2YWwgPSBFUlJfUFRSKC1FTk9NRU0pOworCQlnb3RvIG91dDsKKwl9CisJRFBSSU5USyhERUJVR19JX0xPT0tVUCwKKwkJIiglcyk6IG5ldyBWRlMgaW5vZGUoJXUpOiAlcCBkZTogJXAgYnk6IFwiJXNcIlxuIiwgZGUtPm5hbWUsCisJCWRlLT5pbm9kZS5pbm8sIGlub2RlLCBkZSwgY3VycmVudC0+Y29tbSk7CisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKyAgICAgIG91dDoKKwl3cml0ZV9sb2NrKCZwYXJlbnQtPnUuZGlyLmxvY2spOworCWRlbnRyeS0+ZF9vcCA9ICZkZXZmc19kb3BzOworCWRlbnRyeS0+ZF9mc2RhdGEgPSBOVUxMOworCXdha2VfdXAoJmxvb2t1cF9pbmZvLndhaXRfcXVldWUpOworCXdyaXRlX3VubG9jaygmcGFyZW50LT51LmRpci5sb2NrKTsKKwlkZXZmc19wdXQoZGUpOworCXJldHVybiByZXR2YWw7Cit9CQkJCS8qICBFbmQgRnVuY3Rpb24gZGV2ZnNfbG9va3VwICAqLworCitzdGF0aWMgaW50IGRldmZzX3VubGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWludCB1bmhvb2tlZDsKKwlzdHJ1Y3QgZGV2ZnNfZW50cnkgKmRlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGZzX2luZm8gKmZzX2luZm8gPSBkaXItPmlfc2ItPnNfZnNfaW5mbzsKKworCWRlID0gZ2V0X2RldmZzX2VudHJ5X2Zyb21fdmZzX2lub2RlKGlub2RlKTsKKwlEUFJJTlRLKERFQlVHX0lfVU5MSU5LLCAiKCVzKTogZGU6ICVwXG4iLCBkZW50cnktPmRfbmFtZS5uYW1lLCBkZSk7CisJaWYgKGRlID09IE5VTEwpCisJCXJldHVybiAtRU5PRU5UOworCWlmICghZGUtPnZmcykKKwkJcmV0dXJuIC1FUEVSTTsKKwl3cml0ZV9sb2NrKCZkZS0+cGFyZW50LT51LmRpci5sb2NrKTsKKwl1bmhvb2tlZCA9IF9kZXZmc191bmhvb2soZGUpOworCXdyaXRlX3VubG9jaygmZGUtPnBhcmVudC0+dS5kaXIubG9jayk7CisJaWYgKCF1bmhvb2tlZCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJaWYgKCFpc19kZXZmc2Rfb3JfY2hpbGQoZnNfaW5mbykpCisJCWRldmZzZF9ub3RpZnlfZGUoZGUsIERFVkZTRF9OT1RJRllfREVMRVRFLCBpbm9kZS0+aV9tb2RlLAorCQkJCSBpbm9kZS0+aV91aWQsIGlub2RlLT5pX2dpZCwgZnNfaW5mbyk7CisJZnJlZV9kZW50cnkoZGUpOworCWRldmZzX3B1dChkZSk7CisJcmV0dXJuIDA7Cit9CQkJCS8qICBFbmQgRnVuY3Rpb24gZGV2ZnNfdW5saW5rICAqLworCitzdGF0aWMgaW50IGRldmZzX3N5bWxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCSBjb25zdCBjaGFyICpzeW1uYW1lKQoreworCWludCBlcnI7CisJc3RydWN0IGZzX2luZm8gKmZzX2luZm8gPSBkaXItPmlfc2ItPnNfZnNfaW5mbzsKKwlzdHJ1Y3QgZGV2ZnNfZW50cnkgKnBhcmVudCwgKmRlOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwkvKiAgRmlyc3QgdHJ5IHRvIGdldCB0aGUgZGV2ZnMgZW50cnkgZm9yIHRoaXMgZGlyZWN0b3J5ICAqLworCXBhcmVudCA9IGdldF9kZXZmc19lbnRyeV9mcm9tX3Zmc19pbm9kZShkaXIpOworCWlmIChwYXJlbnQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJZXJyID0gZGV2ZnNfZG9fc3ltbGluayhwYXJlbnQsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIHN5bW5hbWUsICZkZSk7CisJRFBSSU5USyhERUJVR19ESVNBQkxFRCwgIiglcyk6IGVycmNvZGUgZnJvbSA8ZGV2ZnNfZG9fc3ltbGluaz46ICVkXG4iLAorCQlkZW50cnktPmRfbmFtZS5uYW1lLCBlcnIpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWRlLT52ZnMgPSBUUlVFOworCWRlLT5pbm9kZS51aWQgPSBjdXJyZW50LT5ldWlkOworCWRlLT5pbm9kZS5naWQgPSBjdXJyZW50LT5lZ2lkOworCWRlLT5pbm9kZS5hdGltZSA9IENVUlJFTlRfVElNRTsKKwlkZS0+aW5vZGUubXRpbWUgPSBDVVJSRU5UX1RJTUU7CisJZGUtPmlub2RlLmN0aW1lID0gQ1VSUkVOVF9USU1FOworCWlmICgoaW5vZGUgPSBfZGV2ZnNfZ2V0X3Zmc19pbm9kZShkaXItPmlfc2IsIGRlLCBkZW50cnkpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlEUFJJTlRLKERFQlVHX0RJU0FCTEVELCAiKCVzKTogbmV3IFZGUyBpbm9kZSgldSk6ICVwICBkZW50cnk6ICVwXG4iLAorCQlkZW50cnktPmRfbmFtZS5uYW1lLCBkZS0+aW5vZGUuaW5vLCBpbm9kZSwgZGVudHJ5KTsKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCWlmICghaXNfZGV2ZnNkX29yX2NoaWxkKGZzX2luZm8pKQorCQlkZXZmc2Rfbm90aWZ5X2RlKGRlLCBERVZGU0RfTk9USUZZX0NSRUFURSwgaW5vZGUtPmlfbW9kZSwKKwkJCQkgaW5vZGUtPmlfdWlkLCBpbm9kZS0+aV9naWQsIGZzX2luZm8pOworCXJldHVybiAwOworfQkJCQkvKiAgRW5kIEZ1bmN0aW9uIGRldmZzX3N5bWxpbmsgICovCisKK3N0YXRpYyBpbnQgZGV2ZnNfbWtkaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgZnNfaW5mbyAqZnNfaW5mbyA9IGRpci0+aV9zYi0+c19mc19pbmZvOworCXN0cnVjdCBkZXZmc19lbnRyeSAqcGFyZW50LCAqZGU7CisJc3RydWN0IGlub2RlICppbm9kZTsKKworCW1vZGUgPSAobW9kZSAmIH5TX0lGTVQpIHwgU19JRkRJUjsJLyogIFZGUyBkb2Vzbid0IHBhc3MgU19JRk1UIHBhcnQgICovCisJcGFyZW50ID0gZ2V0X2RldmZzX2VudHJ5X2Zyb21fdmZzX2lub2RlKGRpcik7CisJaWYgKHBhcmVudCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0VOVDsKKwlkZSA9IF9kZXZmc19hbGxvY19lbnRyeShkZW50cnktPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5sZW4sIG1vZGUpOworCWlmICghZGUpCisJCXJldHVybiAtRU5PTUVNOworCWRlLT52ZnMgPSBUUlVFOworCWlmICgoZXJyID0gX2RldmZzX2FwcGVuZF9lbnRyeShwYXJlbnQsIGRlLCBOVUxMKSkgIT0gMCkKKwkJcmV0dXJuIGVycjsKKwlkZS0+aW5vZGUudWlkID0gY3VycmVudC0+ZXVpZDsKKwlkZS0+aW5vZGUuZ2lkID0gY3VycmVudC0+ZWdpZDsKKwlkZS0+aW5vZGUuYXRpbWUgPSBDVVJSRU5UX1RJTUU7CisJZGUtPmlub2RlLm10aW1lID0gQ1VSUkVOVF9USU1FOworCWRlLT5pbm9kZS5jdGltZSA9IENVUlJFTlRfVElNRTsKKwlpZiAoKGlub2RlID0gX2RldmZzX2dldF92ZnNfaW5vZGUoZGlyLT5pX3NiLCBkZSwgZGVudHJ5KSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJRFBSSU5USyhERUJVR19ESVNBQkxFRCwgIiglcyk6IG5ldyBWRlMgaW5vZGUoJXUpOiAlcCAgZGVudHJ5OiAlcFxuIiwKKwkJZGVudHJ5LT5kX25hbWUubmFtZSwgZGUtPmlub2RlLmlubywgaW5vZGUsIGRlbnRyeSk7CisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwlpZiAoIWlzX2RldmZzZF9vcl9jaGlsZChmc19pbmZvKSkKKwkJZGV2ZnNkX25vdGlmeV9kZShkZSwgREVWRlNEX05PVElGWV9DUkVBVEUsIGlub2RlLT5pX21vZGUsCisJCQkJIGlub2RlLT5pX3VpZCwgaW5vZGUtPmlfZ2lkLCBmc19pbmZvKTsKKwlyZXR1cm4gMDsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBkZXZmc19ta2RpciAgKi8KKworc3RhdGljIGludCBkZXZmc19ybWRpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCBkZXZmc19lbnRyeSAqZGU7CisJc3RydWN0IGZzX2luZm8gKmZzX2luZm8gPSBkaXItPmlfc2ItPnNfZnNfaW5mbzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCisJaWYgKGRpci0+aV9zYi0+c19mc19pbmZvICE9IGlub2RlLT5pX3NiLT5zX2ZzX2luZm8pCisJCXJldHVybiAtRUlOVkFMOworCWRlID0gZ2V0X2RldmZzX2VudHJ5X2Zyb21fdmZzX2lub2RlKGlub2RlKTsKKwlpZiAoZGUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJaWYgKCFTX0lTRElSKGRlLT5tb2RlKSkKKwkJcmV0dXJuIC1FTk9URElSOworCWlmICghZGUtPnZmcykKKwkJcmV0dXJuIC1FUEVSTTsKKwkvKiAgRmlyc3QgZW5zdXJlIHRoZSBkaXJlY3RvcnkgaXMgZW1wdHkgYW5kIHdpbGwgc3RheSB0aGF0IHdheSAgKi8KKwl3cml0ZV9sb2NrKCZkZS0+dS5kaXIubG9jayk7CisJaWYgKGRlLT51LmRpci5maXJzdCkKKwkJZXJyID0gLUVOT1RFTVBUWTsKKwllbHNlCisJCWRlLT51LmRpci5ub19tb3JlX2FkZGl0aW9ucyA9IFRSVUU7CisJd3JpdGVfdW5sb2NrKCZkZS0+dS5kaXIubG9jayk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwkvKiAgTm93IHVuaG9vayB0aGUgZGlyZWN0b3J5IGZyb20gaXRzIHBhcmVudCAgKi8KKwl3cml0ZV9sb2NrKCZkZS0+cGFyZW50LT51LmRpci5sb2NrKTsKKwlpZiAoIV9kZXZmc191bmhvb2soZGUpKQorCQllcnIgPSAtRU5PRU5UOworCXdyaXRlX3VubG9jaygmZGUtPnBhcmVudC0+dS5kaXIubG9jayk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlpZiAoIWlzX2RldmZzZF9vcl9jaGlsZChmc19pbmZvKSkKKwkJZGV2ZnNkX25vdGlmeV9kZShkZSwgREVWRlNEX05PVElGWV9ERUxFVEUsIGlub2RlLT5pX21vZGUsCisJCQkJIGlub2RlLT5pX3VpZCwgaW5vZGUtPmlfZ2lkLCBmc19pbmZvKTsKKwlmcmVlX2RlbnRyeShkZSk7CisJZGV2ZnNfcHV0KGRlKTsKKwlyZXR1cm4gMDsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBkZXZmc19ybWRpciAgKi8KKworc3RhdGljIGludCBkZXZmc19ta25vZChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKKwkJICAgICAgIGRldl90IHJkZXYpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgZnNfaW5mbyAqZnNfaW5mbyA9IGRpci0+aV9zYi0+c19mc19pbmZvOworCXN0cnVjdCBkZXZmc19lbnRyeSAqcGFyZW50LCAqZGU7CisJc3RydWN0IGlub2RlICppbm9kZTsKKworCURQUklOVEsoREVCVUdfSV9NS05PRCwgIiglcyk6IG1vZGU6IDAlbyAgZGV2OiAldToldVxuIiwKKwkJZGVudHJ5LT5kX25hbWUubmFtZSwgbW9kZSwgTUFKT1IocmRldiksIE1JTk9SKHJkZXYpKTsKKwlwYXJlbnQgPSBnZXRfZGV2ZnNfZW50cnlfZnJvbV92ZnNfaW5vZGUoZGlyKTsKKwlpZiAocGFyZW50ID09IE5VTEwpCisJCXJldHVybiAtRU5PRU5UOworCWRlID0gX2RldmZzX2FsbG9jX2VudHJ5KGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLmxlbiwgbW9kZSk7CisJaWYgKCFkZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJZGUtPnZmcyA9IFRSVUU7CisJaWYgKFNfSVNDSFIobW9kZSkgfHwgU19JU0JMSyhtb2RlKSkKKwkJZGUtPnUuZGV2ID0gcmRldjsKKwlpZiAoKGVyciA9IF9kZXZmc19hcHBlbmRfZW50cnkocGFyZW50LCBkZSwgTlVMTCkpICE9IDApCisJCXJldHVybiBlcnI7CisJZGUtPmlub2RlLnVpZCA9IGN1cnJlbnQtPmV1aWQ7CisJZGUtPmlub2RlLmdpZCA9IGN1cnJlbnQtPmVnaWQ7CisJZGUtPmlub2RlLmF0aW1lID0gQ1VSUkVOVF9USU1FOworCWRlLT5pbm9kZS5tdGltZSA9IENVUlJFTlRfVElNRTsKKwlkZS0+aW5vZGUuY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisJaWYgKChpbm9kZSA9IF9kZXZmc19nZXRfdmZzX2lub2RlKGRpci0+aV9zYiwgZGUsIGRlbnRyeSkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCURQUklOVEsoREVCVUdfSV9NS05PRCwgIjogICBuZXcgVkZTIGlub2RlKCV1KTogJXAgIGRlbnRyeTogJXBcbiIsCisJCWRlLT5pbm9kZS5pbm8sIGlub2RlLCBkZW50cnkpOworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJaWYgKCFpc19kZXZmc2Rfb3JfY2hpbGQoZnNfaW5mbykpCisJCWRldmZzZF9ub3RpZnlfZGUoZGUsIERFVkZTRF9OT1RJRllfQ1JFQVRFLCBpbm9kZS0+aV9tb2RlLAorCQkJCSBpbm9kZS0+aV91aWQsIGlub2RlLT5pX2dpZCwgZnNfaW5mbyk7CisJcmV0dXJuIDA7Cit9CQkJCS8qICBFbmQgRnVuY3Rpb24gZGV2ZnNfbWtub2QgICovCisKK3N0YXRpYyBpbnQgZGV2ZnNfZm9sbG93X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgZGV2ZnNfZW50cnkgKnAgPSBnZXRfZGV2ZnNfZW50cnlfZnJvbV92ZnNfaW5vZGUoZGVudHJ5LT5kX2lub2RlKTsKKwluZF9zZXRfbGluayhuZCwgcCA/IHAtPnUuc3ltbGluay5saW5rbmFtZSA6IEVSUl9QVFIoLUVOT0RFVikpOworCXJldHVybiAwOworfQkJCQkvKiAgRW5kIEZ1bmN0aW9uIGRldmZzX2ZvbGxvd19saW5rICAqLworCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZGV2ZnNfaW9wcyA9IHsKKwkuc2V0YXR0ciA9IGRldmZzX25vdGlmeV9jaGFuZ2UsCit9OworCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZGV2ZnNfZGlyX2lvcHMgPSB7CisJLmxvb2t1cCA9IGRldmZzX2xvb2t1cCwKKwkudW5saW5rID0gZGV2ZnNfdW5saW5rLAorCS5zeW1saW5rID0gZGV2ZnNfc3ltbGluaywKKwkubWtkaXIgPSBkZXZmc19ta2RpciwKKwkucm1kaXIgPSBkZXZmc19ybWRpciwKKwkubWtub2QgPSBkZXZmc19ta25vZCwKKwkuc2V0YXR0ciA9IGRldmZzX25vdGlmeV9jaGFuZ2UsCit9OworCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZGV2ZnNfc3ltbGlua19pb3BzID0geworCS5yZWFkbGluayA9IGdlbmVyaWNfcmVhZGxpbmssCisJLmZvbGxvd19saW5rID0gZGV2ZnNfZm9sbG93X2xpbmssCisJLnNldGF0dHIgPSBkZXZmc19ub3RpZnlfY2hhbmdlLAorfTsKKworc3RhdGljIGludCBkZXZmc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCit7CisJc3RydWN0IGlub2RlICpyb290X2lub2RlID0gTlVMTDsKKworCWlmIChfZGV2ZnNfZ2V0X3Jvb3RfZW50cnkoKSA9PSBOVUxMKQorCQlnb3RvIG91dF9ub19yb290OworCWF0b21pY19zZXQoJmZzX2luZm8uZGV2ZnNkX292ZXJydW5fY291bnQsIDApOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmZzX2luZm8uZGV2ZnNkX3dhaXRfcXVldWUpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmZzX2luZm8ucmV2YWxpZGF0ZV93YWl0X3F1ZXVlKTsKKwlmc19pbmZvLnNiID0gc2I7CisJc2ItPnNfZnNfaW5mbyA9ICZmc19pbmZvOworCXNiLT5zX2Jsb2Nrc2l6ZSA9IDEwMjQ7CisJc2ItPnNfYmxvY2tzaXplX2JpdHMgPSAxMDsKKwlzYi0+c19tYWdpYyA9IERFVkZTX1NVUEVSX01BR0lDOworCXNiLT5zX29wID0gJmRldmZzX3NvcHM7CisJc2ItPnNfdGltZV9ncmFuID0gMTsKKwlpZiAoKHJvb3RfaW5vZGUgPSBfZGV2ZnNfZ2V0X3Zmc19pbm9kZShzYiwgcm9vdF9lbnRyeSwgTlVMTCkpID09IE5VTEwpCisJCWdvdG8gb3V0X25vX3Jvb3Q7CisJc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290X2lub2RlKTsKKwlpZiAoIXNiLT5zX3Jvb3QpCisJCWdvdG8gb3V0X25vX3Jvb3Q7CisJRFBSSU5USyhERUJVR19TX1JFQUQsICIoKTogbWFkZSBkZXZmcyBwdHI6ICVwXG4iLCBzYi0+c19mc19pbmZvKTsKKwlyZXR1cm4gMDsKKworICAgICAgb3V0X25vX3Jvb3Q6CisJUFJJTlRLKCIoKTogZ2V0IHJvb3QgaW5vZGUgZmFpbGVkXG4iKTsKKwlpZiAocm9vdF9pbm9kZSkKKwkJaXB1dChyb290X2lub2RlKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBkZXZmc19maWxsX3N1cGVyICAqLworCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpkZXZmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCQkJCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsCisJCQkJCXZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9zaW5nbGUoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIGRldmZzX2ZpbGxfc3VwZXIpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgZGV2ZnNfZnNfdHlwZSA9IHsKKwkubmFtZSA9IERFVkZTX05BTUUsCisJLmdldF9zYiA9IGRldmZzX2dldF9zYiwKKwkua2lsbF9zYiA9IGtpbGxfYW5vbl9zdXBlciwKK307CisKKy8qICBGaWxlIG9wZXJhdGlvbnMgZm9yIGRldmZzZCBmb2xsb3cgICovCisKK3N0YXRpYyBzc2l6ZV90IGRldmZzZF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLAorCQkJICAgbG9mZl90ICogcHBvcykKK3sKKwlpbnQgZG9uZSA9IEZBTFNFOworCWludCBpdmFsOworCWxvZmZfdCBwb3MsIGRldm5hbWVfb2Zmc2V0LCB0bGVuLCBycG9zOworCWRldmZzX2hhbmRsZV90IGRlOworCXN0cnVjdCBkZXZmc2RfYnVmX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgZnNfaW5mbyAqZnNfaW5mbyA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NiLT5zX2ZzX2luZm87CisJc3RydWN0IGRldmZzZF9ub3RpZnlfc3RydWN0ICppbmZvID0gZnNfaW5mby0+ZGV2ZnNkX2luZm87CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwkvKiAgVmVyaWZ5IHRoZSB0YXNrIGhhcyBncmFiYmVkIHRoZSBxdWV1ZSAgKi8KKwlpZiAoZnNfaW5mby0+ZGV2ZnNkX3Rhc2sgIT0gY3VycmVudCkKKwkJcmV0dXJuIC1FUEVSTTsKKwlpbmZvLT5tYWpvciA9IDA7CisJaW5mby0+bWlub3IgPSAwOworCS8qICBCbG9jayBmb3IgYSBuZXcgZW50cnkgICovCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlhZGRfd2FpdF9xdWV1ZSgmZnNfaW5mby0+ZGV2ZnNkX3dhaXRfcXVldWUsICZ3YWl0KTsKKwl3aGlsZSAoZGV2ZnNkX3F1ZXVlX2VtcHR5KGZzX2luZm8pKSB7CisJCWZzX2luZm8tPmRldmZzZF9zbGVlcGluZyA9IFRSVUU7CisJCXdha2VfdXAoJmZzX2luZm8tPnJldmFsaWRhdGVfd2FpdF9xdWV1ZSk7CisJCXNjaGVkdWxlKCk7CisJCWZzX2luZm8tPmRldmZzZF9zbGVlcGluZyA9IEZBTFNFOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXJlbW92ZV93YWl0X3F1ZXVlKCZmc19pbmZvLT5kZXZmc2Rfd2FpdF9xdWV1ZSwgJndhaXQpOworCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQkJcmV0dXJuIC1FSU5UUjsKKwkJfQorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCX0KKwlyZW1vdmVfd2FpdF9xdWV1ZSgmZnNfaW5mby0+ZGV2ZnNkX3dhaXRfcXVldWUsICZ3YWl0KTsKKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJLyogIE5vdyBwbGF5IHdpdGggdGhlIGRhdGEgICovCisJaXZhbCA9IGF0b21pY19yZWFkKCZmc19pbmZvLT5kZXZmc2Rfb3ZlcnJ1bl9jb3VudCk7CisJaW5mby0+b3ZlcnJ1bl9jb3VudCA9IGl2YWw7CisJZW50cnkgPSBmc19pbmZvLT5kZXZmc2RfZmlyc3RfZXZlbnQ7CisJaW5mby0+dHlwZSA9IGVudHJ5LT50eXBlOworCWluZm8tPm1vZGUgPSBlbnRyeS0+bW9kZTsKKwlpbmZvLT51aWQgPSBlbnRyeS0+dWlkOworCWluZm8tPmdpZCA9IGVudHJ5LT5naWQ7CisJZGUgPSBlbnRyeS0+ZGU7CisJaWYgKFNfSVNDSFIoZGUtPm1vZGUpIHx8IFNfSVNCTEsoZGUtPm1vZGUpKSB7CisJCWluZm8tPm1ham9yID0gTUFKT1IoZGUtPnUuZGV2KTsKKwkJaW5mby0+bWlub3IgPSBNSU5PUihkZS0+dS5kZXYpOworCX0KKwlwb3MgPSBkZXZmc19nZW5lcmF0ZV9wYXRoKGRlLCBpbmZvLT5kZXZuYW1lLCBERVZGU19QQVRITEVOKTsKKwlpZiAocG9zIDwgMCkKKwkJcmV0dXJuIHBvczsKKwlpbmZvLT5uYW1lbGVuID0gREVWRlNfUEFUSExFTiAtIHBvcyAtIDE7CisJaWYgKGluZm8tPm1vZGUgPT0gMCkKKwkJaW5mby0+bW9kZSA9IGRlLT5tb2RlOworCWRldm5hbWVfb2Zmc2V0ID0gaW5mby0+ZGV2bmFtZSAtIChjaGFyICopaW5mbzsKKwlycG9zID0gKnBwb3M7CisJaWYgKHJwb3MgPCBkZXZuYW1lX29mZnNldCkgeworCQkvKiAgQ29weSBwYXJ0cyBvZiB0aGUgaGVhZGVyICAqLworCQl0bGVuID0gZGV2bmFtZV9vZmZzZXQgLSBycG9zOworCQlpZiAodGxlbiA+IGxlbikKKwkJCXRsZW4gPSBsZW47CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAoY2hhciAqKWluZm8gKyBycG9zLCB0bGVuKSkgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcnBvcyArPSB0bGVuOworCQlidWYgKz0gdGxlbjsKKwkJbGVuIC09IHRsZW47CisJfQorCWlmICgocnBvcyA+PSBkZXZuYW1lX29mZnNldCkgJiYgKGxlbiA+IDApKSB7CisJCS8qICBDb3B5IHRoZSBuYW1lICAqLworCQl0bGVuID0gaW5mby0+bmFtZWxlbiArIDE7CisJCWlmICh0bGVuID4gbGVuKQorCQkJdGxlbiA9IGxlbjsKKwkJZWxzZQorCQkJZG9uZSA9IFRSVUU7CisJCWlmIChjb3B5X3RvX3VzZXIKKwkJICAgIChidWYsIGluZm8tPmRldm5hbWUgKyBwb3MgKyBycG9zIC0gZGV2bmFtZV9vZmZzZXQsIHRsZW4pKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlycG9zICs9IHRsZW47CisJfQorCXRsZW4gPSBycG9zIC0gKnBwb3M7CisJaWYgKGRvbmUpIHsKKwkJZGV2ZnNfaGFuZGxlX3QgcGFyZW50OworCisJCXNwaW5fbG9jaygmZnNfaW5mby0+ZGV2ZnNkX2J1ZmZlcl9sb2NrKTsKKwkJZnNfaW5mby0+ZGV2ZnNkX2ZpcnN0X2V2ZW50ID0gZW50cnktPm5leHQ7CisJCWlmIChlbnRyeS0+bmV4dCA9PSBOVUxMKQorCQkJZnNfaW5mby0+ZGV2ZnNkX2xhc3RfZXZlbnQgPSBOVUxMOworCQlzcGluX3VubG9jaygmZnNfaW5mby0+ZGV2ZnNkX2J1ZmZlcl9sb2NrKTsKKwkJZm9yICg7IGRlICE9IE5VTEw7IGRlID0gcGFyZW50KSB7CisJCQlwYXJlbnQgPSBkZS0+cGFyZW50OworCQkJZGV2ZnNfcHV0KGRlKTsKKwkJfQorCQlrbWVtX2NhY2hlX2ZyZWUoZGV2ZnNkX2J1Zl9jYWNoZSwgZW50cnkpOworCQlpZiAoaXZhbCA+IDApCisJCQlhdG9taWNfc3ViKGl2YWwsICZmc19pbmZvLT5kZXZmc2Rfb3ZlcnJ1bl9jb3VudCk7CisJCSpwcG9zID0gMDsKKwl9IGVsc2UKKwkJKnBwb3MgPSBycG9zOworCXJldHVybiB0bGVuOworfQkJCQkvKiAgRW5kIEZ1bmN0aW9uIGRldmZzZF9yZWFkICAqLworCitzdGF0aWMgaW50IGRldmZzZF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBpdmFsOworCXN0cnVjdCBmc19pbmZvICpmc19pbmZvID0gaW5vZGUtPmlfc2ItPnNfZnNfaW5mbzsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBERVZGU0RJT0NfR0VUX1BST1RPX1JFVjoKKwkJaXZhbCA9IERFVkZTRF9QUk9UT0NPTF9SRVZJU0lPTl9LRVJORUw7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmaXZhbCwgc2l6ZW9mIGl2YWwpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgREVWRlNESU9DX1NFVF9FVkVOVF9NQVNLOgorCQkvKiAgRW5zdXJlIG9ubHkgb25lIHJlYWRlciBoYXMgYWNjZXNzIHRvIHRoZSBxdWV1ZS4gVGhpcyBzY2hlbWUgd2lsbAorCQkgICB3b3JrIGV2ZW4gaWYgdGhlIGdsb2JhbCBrZXJuZWwgbG9jayB3ZXJlIHRvIGJlIHJlbW92ZWQsIGJlY2F1c2UgaXQKKwkJICAgZG9lc24ndCBtYXR0ZXIgd2hvIGdldHMgaW4gZmlyc3QsIGFzIGxvbmcgYXMgb25seSBvbmUgZ2V0cyBpdCAgKi8KKwkJaWYgKGZzX2luZm8tPmRldmZzZF90YXNrID09IE5VTEwpIHsKKwkJCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG9jayk7CisKKwkJCWlmICghc3Bpbl90cnlsb2NrKCZsb2NrKSkKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJaWYgKGZzX2luZm8tPmRldmZzZF90YXNrICE9IE5VTEwpIHsJLyogIFdlIGxvc3QgdGhlIHJhY2UuLi4gICovCisJCQkJc3Bpbl91bmxvY2soJmxvY2spOworCQkJCXJldHVybiAtRUJVU1k7CisJCQl9CisJCQlmc19pbmZvLT5kZXZmc2RfdGFzayA9IGN1cnJlbnQ7CisJCQlzcGluX3VubG9jaygmbG9jayk7CisJCQlmc19pbmZvLT5kZXZmc2RfcGdycCA9CisJCQkgICAgKHByb2Nlc3NfZ3JvdXAoY3VycmVudCkgPT0KKwkJCSAgICAgY3VycmVudC0+cGlkKSA/IHByb2Nlc3NfZ3JvdXAoY3VycmVudCkgOiAwOworCQkJZnNfaW5mby0+ZGV2ZnNkX2ZpbGUgPSBmaWxlOworCQkJZnNfaW5mby0+ZGV2ZnNkX2luZm8gPQorCQkJICAgIGttYWxsb2Moc2l6ZW9mICpmc19pbmZvLT5kZXZmc2RfaW5mbywgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWZzX2luZm8tPmRldmZzZF9pbmZvKSB7CisJCQkJZGV2ZnNkX2Nsb3NlKGlub2RlLCBmaWxlKTsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJfSBlbHNlIGlmIChmc19pbmZvLT5kZXZmc2RfdGFzayAhPSBjdXJyZW50KQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJZnNfaW5mby0+ZGV2ZnNkX2V2ZW50X21hc2sgPSBhcmc7CS8qICBMZXQgdGhlIG1hc3NlcyBjb21lIGZvcnRoICAqLworCQlicmVhazsKKwljYXNlIERFVkZTRElPQ19SRUxFQVNFX0VWRU5UX1FVRVVFOgorCQlpZiAoZnNfaW5mby0+ZGV2ZnNkX2ZpbGUgIT0gZmlsZSkKKwkJCXJldHVybiAtRVBFUk07CisJCXJldHVybiBkZXZmc2RfY2xvc2UoaW5vZGUsIGZpbGUpOworCQkvKmJyZWFrOyAqLworI2lmZGVmIENPTkZJR19ERVZGU19ERUJVRworCWNhc2UgREVWRlNESU9DX1NFVF9ERUJVR19NQVNLOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJml2YWwsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mIGl2YWwpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWRldmZzX2RlYnVnID0gaXZhbDsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKwlyZXR1cm4gMDsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBkZXZmc2RfaW9jdGwgICovCisKK3N0YXRpYyBpbnQgZGV2ZnNkX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBkZXZmc2RfYnVmX2VudHJ5ICplbnRyeSwgKm5leHQ7CisJc3RydWN0IGZzX2luZm8gKmZzX2luZm8gPSBpbm9kZS0+aV9zYi0+c19mc19pbmZvOworCisJaWYgKGZzX2luZm8tPmRldmZzZF9maWxlICE9IGZpbGUpCisJCXJldHVybiAwOworCWZzX2luZm8tPmRldmZzZF9ldmVudF9tYXNrID0gMDsKKwlmc19pbmZvLT5kZXZmc2RfZmlsZSA9IE5VTEw7CisJc3Bpbl9sb2NrKCZmc19pbmZvLT5kZXZmc2RfYnVmZmVyX2xvY2spOworCWVudHJ5ID0gZnNfaW5mby0+ZGV2ZnNkX2ZpcnN0X2V2ZW50OworCWZzX2luZm8tPmRldmZzZF9maXJzdF9ldmVudCA9IE5VTEw7CisJZnNfaW5mby0+ZGV2ZnNkX2xhc3RfZXZlbnQgPSBOVUxMOworCWlmIChmc19pbmZvLT5kZXZmc2RfaW5mbykgeworCQlrZnJlZShmc19pbmZvLT5kZXZmc2RfaW5mbyk7CisJCWZzX2luZm8tPmRldmZzZF9pbmZvID0gTlVMTDsKKwl9CisJc3Bpbl91bmxvY2soJmZzX2luZm8tPmRldmZzZF9idWZmZXJfbG9jayk7CisJZnNfaW5mby0+ZGV2ZnNkX3BncnAgPSAwOworCWZzX2luZm8tPmRldmZzZF90YXNrID0gTlVMTDsKKwl3YWtlX3VwKCZmc19pbmZvLT5yZXZhbGlkYXRlX3dhaXRfcXVldWUpOworCWZvciAoOyBlbnRyeTsgZW50cnkgPSBuZXh0KSB7CisJCW5leHQgPSBlbnRyeS0+bmV4dDsKKwkJa21lbV9jYWNoZV9mcmVlKGRldmZzZF9idWZfY2FjaGUsIGVudHJ5KTsKKwl9CisJcmV0dXJuIDA7Cit9CQkJCS8qICBFbmQgRnVuY3Rpb24gZGV2ZnNkX2Nsb3NlICAqLworCisjaWZkZWYgQ09ORklHX0RFVkZTX0RFQlVHCitzdGF0aWMgc3NpemVfdCBzdGF0X3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBsZW4sCisJCQkgbG9mZl90ICogcHBvcykKK3sKKwlzc2l6ZV90IG51bTsKKwljaGFyIHR4dFs4MF07CisKKwludW0gPSBzcHJpbnRmKHR4dCwgIk51bWJlciBvZiBlbnRyaWVzOiAldSAgbnVtYmVyIG9mIGJ5dGVzOiAldVxuIiwKKwkJICAgICAgc3RhdF9udW1fZW50cmllcywgc3RhdF9udW1fYnl0ZXMpICsgMTsKKwlpZiAoKnBwb3MgPj0gbnVtKQorCQlyZXR1cm4gMDsKKwlpZiAoKnBwb3MgKyBsZW4gPiBudW0pCisJCWxlbiA9IG51bSAtICpwcG9zOworCWlmIChjb3B5X3RvX3VzZXIoYnVmLCB0eHQgKyAqcHBvcywgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJKnBwb3MgKz0gbGVuOworCXJldHVybiBsZW47Cit9CQkJCS8qICBFbmQgRnVuY3Rpb24gc3RhdF9yZWFkICAqLworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfZGV2ZnNfZnModm9pZCkKK3sKKwlpbnQgZXJyOworCWludCBtYWpvcjsKKwlzdHJ1Y3QgZGV2ZnNfZW50cnkgKmRldmZzZDsKKyNpZmRlZiBDT05GSUdfREVWRlNfREVCVUcKKwlzdHJ1Y3QgZGV2ZnNfZW50cnkgKnN0YXQ7CisjZW5kaWYKKworCWlmIChfZGV2ZnNfZ2V0X3Jvb3RfZW50cnkoKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByaW50ayhLRVJOX0lORk8gIiVzOiAlcyBSaWNoYXJkIEdvb2NoIChyZ29vY2hAYXRuZi5jc2lyby5hdSlcbiIsCisJICAgICAgIERFVkZTX05BTUUsIERFVkZTX1ZFUlNJT04pOworCWRldmZzZF9idWZfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiZGV2ZnNkX2V2ZW50IiwKKwkJCQkJICAgICBzaXplb2Yoc3RydWN0IGRldmZzZF9idWZfZW50cnkpLAorCQkJCQkgICAgIDAsIDAsIE5VTEwsIE5VTEwpOworCWlmICghZGV2ZnNkX2J1Zl9jYWNoZSkKKwkJT09QUygiKCk6IHVuYWJsZSB0byBhbGxvY2F0ZSBldmVudCBzbGFiXG4iKTsKKyNpZmRlZiBDT05GSUdfREVWRlNfREVCVUcKKwlkZXZmc19kZWJ1ZyA9IGRldmZzX2RlYnVnX2luaXQ7CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGRldmZzX2RlYnVnOiAweCUweFxuIiwgREVWRlNfTkFNRSwgZGV2ZnNfZGVidWcpOworI2VuZGlmCisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGJvb3Rfb3B0aW9uczogMHglMHhcbiIsIERFVkZTX05BTUUsIGJvb3Rfb3B0aW9ucyk7CisKKwkvKiByZWdpc3RlciBzcGVjaWFsIGRldmljZSBmb3IgZGV2ZnNkIGNvbW11bmljYXRpb24gKi8KKwltYWpvciA9IHJlZ2lzdGVyX2NocmRldigwLCAiZGV2ZnMiLCAmZGV2ZnNfZm9wcyk7CisJaWYgKG1ham9yIDwgMCkKKwkJcmV0dXJuIG1ham9yOworCisJLyogIEFuZCBjcmVhdGUgdGhlIGVudHJ5IGZvciAiLmRldmZzZCIgICovCisJZGV2ZnNkID0gX2RldmZzX2FsbG9jX2VudHJ5KCIuZGV2ZnNkIiwgMCwgU19JRkNIUiB8IFNfSVJVU1IgfCBTX0lXVVNSKTsKKwlpZiAoZGV2ZnNkID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWRldmZzZC0+dS5kZXYgPSBNS0RFVihtYWpvciwgMCk7CisJX2RldmZzX2FwcGVuZF9lbnRyeShyb290X2VudHJ5LCBkZXZmc2QsIE5VTEwpOworCisjaWZkZWYgQ09ORklHX0RFVkZTX0RFQlVHCisJc3RhdCA9IF9kZXZmc19hbGxvY19lbnRyeSgiLnN0YXQiLCAwLCBTX0lGQ0hSIHwgU19JUlVHTyk7CisJaWYgKHN0YXQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJc3RhdC0+dS5kZXYgPSBNS0RFVihtYWpvciwgMSk7CisJX2RldmZzX2FwcGVuZF9lbnRyeShyb290X2VudHJ5LCBzdGF0LCBOVUxMKTsKKyNlbmRpZgorCisJZXJyID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmZGV2ZnNfZnNfdHlwZSk7CisJcmV0dXJuIGVycjsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBpbml0X2RldmZzX2ZzICAqLworCit2b2lkIF9faW5pdCBtb3VudF9kZXZmc19mcyh2b2lkKQoreworCWludCBlcnI7CisKKwlpZiAoIShib290X29wdGlvbnMgJiBPUFRJT05fTU9VTlQpKQorCQlyZXR1cm47CisJZXJyID0gZG9fbW91bnQoIm5vbmUiLCAiL2RldiIsICJkZXZmcyIsIDAsIE5VTEwpOworCWlmIChlcnIgPT0gMCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiTW91bnRlZCBkZXZmcyBvbiAvZGV2XG4iKTsKKwllbHNlCisJCVBSSU5USygiKCk6IHVuYWJsZSB0byBtb3VudCBkZXZmcywgZXJyOiAlZFxuIiwgZXJyKTsKK30JCQkJLyogIEVuZCBGdW5jdGlvbiBtb3VudF9kZXZmc19mcyAgKi8KKworbW9kdWxlX2luaXQoaW5pdF9kZXZmc19mcykKZGlmZiAtLWdpdCBhL2ZzL2RldmZzL3V0aWwuYyBiL2ZzL2RldmZzL3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjA2ZDM4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZGV2ZnMvdXRpbC5jCkBAIC0wLDAgKzEsOTcgQEAKKy8qICBkZXZmcyAoRGV2aWNlIEZpbGVTeXN0ZW0pIHV0aWxpdGllcy4KKworICAgIENvcHlyaWdodCAoQykgMTk5OS0yMDAyICBSaWNoYXJkIEdvb2NoCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICAgIFJpY2hhcmQgR29vY2ggbWF5IGJlIHJlYWNoZWQgYnkgZW1haWwgYXQgIHJnb29jaEBhdG5mLmNzaXJvLmF1CisgICAgVGhlIHBvc3RhbCBhZGRyZXNzIGlzOgorICAgICAgUmljaGFyZCBHb29jaCwgYy9vIEFUTkYsIFAuIE8uIEJveCA3NiwgRXBwaW5nLCBOLlMuVy4sIDIxMjEsIEF1c3RyYWxpYS4KKworICAgIENoYW5nZUxvZworCisgICAgMTk5OTEwMzEgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIENyZWF0ZWQuCisgICAgMTk5OTExMDMgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIENyZWF0ZWQgPF9kZXZmc19jb252ZXJ0X25hbWU+IGFuZCBzdXBwb3J0ZWQgU0NTSSBhbmQgSURFIENELVJPTXMKKyAgICAyMDAwMDIwMyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgQ2hhbmdlZCBvcGVyYXRpb25zIHBvaW50ZXIgdHlwZSB0byB2b2lkICouCisgICAgMjAwMDA2MjEgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIENoYW5nZWQgaW50ZXJmYWNlIHRvIDxkZXZmc19yZWdpc3Rlcl9zZXJpZXM+LgorICAgIDIwMDAwNjIyICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisgICAgICAgICAgICAgICBUb29rIGFjY291bnQgb2YgaW50ZXJmYWNlIGNoYW5nZSB0byA8ZGV2ZnNfbWtfc3ltbGluaz4uCisgICAgICAgICAgICAgICBUb29rIGFjY291bnQgb2YgaW50ZXJmYWNlIGNoYW5nZSB0byA8ZGV2ZnNfbWtfZGlyPi4KKyAgICAyMDAxMDUxOSAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgRG9jdW1lbnRhdGlvbiBjbGVhbnVwLgorICAgIDIwMDEwNzA5ICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisgICAgICAgICAgICAgICBDcmVhdGVkIDxkZXZmc18qYWxsb2NfbWFqb3I+IGFuZCA8ZGV2ZnNfKmFsbG9jX2Rldm51bT4uCisgICAgMjAwMTA3MTAgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIENyZWF0ZWQgPGRldmZzXyphbGxvY191bmlxdWVfbnVtYmVyPi4KKyAgICAyMDAxMDczMCAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgRG9jdW1lbnRhdGlvbiB0eXBvIGZpeC4KKyAgICAyMDAxMDgwNiAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgTWFkZSA8YmxvY2tfc2VtYXBob3JlPiBhbmQgPGNoYXJfc2VtYXBob3JlPiBwcml2YXRlLgorICAgIDIwMDEwODEzICAgUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CisgICAgICAgICAgICAgICBGaXhlZCBidWcgaW4gPGRldmZzX2FsbG9jX3VuaXF1ZV9udW1iZXI+OiBsaW1pdGVkIHRvIDEyOCBudW1iZXJzCisgICAgMjAwMTA4MTggICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIFVwZGF0ZWQgbWFqb3IgbWFza3MgdXAgdG8gTGludXMnICJubyBuZXcgbWFqb3JzIiBwcm9jbGFtYXRpb24uCisJICAgICAgIEJsb2NrOiB3ZXJlIDEyNiBub3cgMTIyIGZyZWUsIGNoYXI6IHdlcmUgMjYgbm93IDE5IGZyZWUuCisgICAgMjAwMjAzMjQgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIEZpeGVkIGJ1ZyBpbiA8ZGV2ZnNfYWxsb2NfdW5pcXVlX251bWJlcj46IHdhcyBjbGVhcmluZyBiZXlvbmQKKwkgICAgICAgYml0ZmllbGQuCisgICAgMjAwMjAzMjYgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIEZpeGVkIGJpdGZpZWxkIGRhdGEgdHlwZSBmb3IgPGRldmZzXyphbGxvY19kZXZudW0+LgorICAgICAgICAgICAgICAgTWFkZSBtYWpvciBiaXRmaWVsZCB0eXBlIGFuZCBpbml0aWFsaXNlciA2NCBiaXQgc2FmZS4KKyAgICAyMDAyMDQxMyAgIFJpY2hhcmQgR29vY2ggPHJnb29jaEBhdG5mLmNzaXJvLmF1PgorICAgICAgICAgICAgICAgRml4ZWQgc2hpZnQgd2FybmluZyBvbiA2NCBiaXQgbWFjaGluZXMuCisgICAgMjAwMjA0MjggICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIENvcGllZCBhbmQgdXNlZCBtYWNybyBmb3IgZXJyb3IgbWVzc2FnZXMgZnJvbSBmcy9kZXZmcy9iYXNlLmMgCisgICAgMjAwMjEwMTMgICBSaWNoYXJkIEdvb2NoIDxyZ29vY2hAYXRuZi5jc2lyby5hdT4KKyAgICAgICAgICAgICAgIERvY3VtZW50YXRpb24gZml4LgorICAgIDIwMDMwMTAxICAgQWRhbSBKLiBSaWNodGVyIDxhZGFtQHlnZ2RyYXNpbC5jb20+CisgICAgICAgICAgICAgICBFbGltaW5hdGUgREVWRlNfU1BFQ0lBTF97Q0hSLEJMS30uICBVc2UgbW9kZV90IGluc3RlYWQuCisgICAgMjAwMzAxMDYgICBDaHJpc3RvcGggSGVsbHdpZyA8aGNoQGluZnJhZGVhZC5vcmc+CisgICAgICAgICAgICAgICBSZXdyaXRlIGRldmZzX3ssZGV9YWxsb2NfZGV2bnVtIHRvIGxvb2sgbGlrZSBDIGNvZGUuCisqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZmc19mc19rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKK2ludCBkZXZmc19yZWdpc3Rlcl90YXBlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY2hhciB0bmFtZVszMl0sIGRlc3RbNjRdOworCXN0YXRpYyB1bnNpZ25lZCBpbnQgdGFwZV9jb3VudGVyOworCXVuc2lnbmVkIGludCBuID0gdGFwZV9jb3VudGVyKys7CisKKwlzcHJpbnRmKGRlc3QsICIuLi8lcyIsIG5hbWUpOworCXNwcmludGYodG5hbWUsICJ0YXBlcy90YXBlJXUiLCBuKTsKKwlkZXZmc19ta19zeW1saW5rKHRuYW1lLCBkZXN0KTsKKworCXJldHVybiBuOworfQorCitFWFBPUlRfU1lNQk9MKGRldmZzX3JlZ2lzdGVyX3RhcGUpOworCit2b2lkIGRldmZzX3VucmVnaXN0ZXJfdGFwZShpbnQgbnVtKQoreworCWlmIChudW0gPj0gMCkKKwkJZGV2ZnNfcmVtb3ZlKCJ0YXBlcy90YXBlJXUiLCBudW0pOworfQorCitFWFBPUlRfU1lNQk9MKGRldmZzX3VucmVnaXN0ZXJfdGFwZSk7CmRpZmYgLS1naXQgYS9mcy9kZXZwdHMvTWFrZWZpbGUgYi9mcy9kZXZwdHMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgwMGRmMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2RldnB0cy9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCAvZGV2L3B0cyB2aXJ0dWFsIGZpbGVzeXN0ZW0uCisjCisKK29iai0kKENPTkZJR19VTklYOThfUFRZUykJCSs9IGRldnB0cy5vCisKK2RldnB0cy0kKENPTkZJR19VTklYOThfUFRZUykJCTo9IGlub2RlLm8KK2RldnB0cy0kKENPTkZJR19ERVZQVFNfRlNfU0VDVVJJVFkpCSs9IHhhdHRyX3NlY3VyaXR5Lm8KZGlmZiAtLWdpdCBhL2ZzL2RldnB0cy9pbm9kZS5jIGIvZnMvZGV2cHRzL2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU3MWM4ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2RldnB0cy9pbm9kZS5jCkBAIC0wLDAgKzEsMjQyIEBACisvKiAtKi0gbGludXgtYyAtKi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiBsaW51eC9mcy9kZXZwdHMvaW5vZGUuYworICoKKyAqICBDb3B5cmlnaHQgMTk5OC0yMDA0IEguIFBldGVyIEFudmluIC0tIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBvciBhdCB5b3VyCisgKiBvcHRpb24sIGFueSBsYXRlciB2ZXJzaW9uLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZwdHNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC94YXR0ci5oPgorCisjZGVmaW5lIERFVlBUU19TVVBFUl9NQUdJQyAweDFjZDEKKworZXh0ZXJuIHN0cnVjdCB4YXR0cl9oYW5kbGVyIGRldnB0c194YXR0cl9zZWN1cml0eV9oYW5kbGVyOworCitzdGF0aWMgc3RydWN0IHhhdHRyX2hhbmRsZXIgKmRldnB0c194YXR0cl9oYW5kbGVyc1tdID0geworI2lmZGVmIENPTkZJR19ERVZQVFNfRlNfU0VDVVJJVFkKKwkmZGV2cHRzX3hhdHRyX3NlY3VyaXR5X2hhbmRsZXIsCisjZW5kaWYKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZGV2cHRzX2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKyNpZmRlZiBDT05GSUdfREVWUFRTX0ZTX1hBVFRSCisJLnNldHhhdHRyCT0gZ2VuZXJpY19zZXR4YXR0ciwKKwkuZ2V0eGF0dHIJPSBnZW5lcmljX2dldHhhdHRyLAorCS5saXN0eGF0dHIJPSBnZW5lcmljX2xpc3R4YXR0ciwKKwkucmVtb3ZleGF0dHIJPSBnZW5lcmljX3JlbW92ZXhhdHRyLAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHZmc21vdW50ICpkZXZwdHNfbW50Oworc3RhdGljIHN0cnVjdCBkZW50cnkgKmRldnB0c19yb290OworCitzdGF0aWMgc3RydWN0IHsKKwlpbnQgc2V0dWlkOworCWludCBzZXRnaWQ7CisJdWlkX3QgICB1aWQ7CisJZ2lkX3QgICBnaWQ7CisJdW1vZGVfdCBtb2RlOworfSBjb25maWcgPSB7Lm1vZGUgPSAwNjAwfTsKKworc3RhdGljIGludCBkZXZwdHNfcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpkYXRhKQoreworCWludCBzZXR1aWQgPSAwOworCWludCBzZXRnaWQgPSAwOworCXVpZF90IHVpZCA9IDA7CisJZ2lkX3QgZ2lkID0gMDsKKwl1bW9kZV90IG1vZGUgPSAwNjAwOworCWNoYXIgKnRoaXNfY2hhcjsKKworCXRoaXNfY2hhciA9IE5VTEw7CisJd2hpbGUgKCh0aGlzX2NoYXIgPSBzdHJzZXAoJmRhdGEsICIsIikpICE9IE5VTEwpIHsKKwkJaW50IG47CisJCWNoYXIgZHVtbXk7CisJCWlmICghKnRoaXNfY2hhcikKKwkJCWNvbnRpbnVlOworCQlpZiAoc3NjYW5mKHRoaXNfY2hhciwgInVpZD0laSVjIiwgJm4sICZkdW1teSkgPT0gMSkgeworCQkJc2V0dWlkID0gMTsKKwkJCXVpZCA9IG47CisJCX0gZWxzZSBpZiAoc3NjYW5mKHRoaXNfY2hhciwgImdpZD0laSVjIiwgJm4sICZkdW1teSkgPT0gMSkgeworCQkJc2V0Z2lkID0gMTsKKwkJCWdpZCA9IG47CisJCX0gZWxzZSBpZiAoc3NjYW5mKHRoaXNfY2hhciwgIm1vZGU9JW8lYyIsICZuLCAmZHVtbXkpID09IDEpCisJCQltb2RlID0gbiAmIH5TX0lGTVQ7CisJCWVsc2UgeworCQkJcHJpbnRrKCJkZXZwdHM6IGNhbGxlZCB3aXRoIGJvZ3VzIG9wdGlvbnNcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJY29uZmlnLnNldHVpZCAgPSBzZXR1aWQ7CisJY29uZmlnLnNldGdpZCAgPSBzZXRnaWQ7CisJY29uZmlnLnVpZCAgICAgPSB1aWQ7CisJY29uZmlnLmdpZCAgICAgPSBnaWQ7CisJY29uZmlnLm1vZGUgICAgPSBtb2RlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBkZXZwdHNfc29wcyA9IHsKKwkuc3RhdGZzCQk9IHNpbXBsZV9zdGF0ZnMsCisJLnJlbW91bnRfZnMJPSBkZXZwdHNfcmVtb3VudCwKK307CisKK3N0YXRpYyBpbnQKK2RldnB0c19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKworCXMtPnNfYmxvY2tzaXplID0gMTAyNDsKKwlzLT5zX2Jsb2Nrc2l6ZV9iaXRzID0gMTA7CisJcy0+c19tYWdpYyA9IERFVlBUU19TVVBFUl9NQUdJQzsKKwlzLT5zX29wID0gJmRldnB0c19zb3BzOworCXMtPnNfeGF0dHIgPSBkZXZwdHNfeGF0dHJfaGFuZGxlcnM7CisJcy0+c190aW1lX2dyYW4gPSAxOworCisJaW5vZGUgPSBuZXdfaW5vZGUocyk7CisJaWYgKCFpbm9kZSkKKwkJZ290byBmYWlsOworCWlub2RlLT5pX2lubyA9IDE7CisJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCWlub2RlLT5pX2Jsb2NrcyA9IDA7CisJaW5vZGUtPmlfYmxrc2l6ZSA9IDEwMjQ7CisJaW5vZGUtPmlfdWlkID0gaW5vZGUtPmlfZ2lkID0gMDsKKwlpbm9kZS0+aV9tb2RlID0gU19JRkRJUiB8IFNfSVJVR08gfCBTX0lYVUdPIHwgU19JV1VTUjsKKwlpbm9kZS0+aV9vcCA9ICZzaW1wbGVfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfZm9wID0gJnNpbXBsZV9kaXJfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9ubGluayA9IDI7CisKKwlkZXZwdHNfcm9vdCA9IHMtPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChpbm9kZSk7CisJaWYgKHMtPnNfcm9vdCkKKwkJcmV0dXJuIDA7CisJCisJcHJpbnRrKCJkZXZwdHM6IGdldCByb290IGRlbnRyeSBmYWlsZWRcbiIpOworCWlwdXQoaW5vZGUpOworZmFpbDoKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqZGV2cHRzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoreworCXJldHVybiBnZXRfc2Jfc2luZ2xlKGZzX3R5cGUsIGZsYWdzLCBkYXRhLCBkZXZwdHNfZmlsbF9zdXBlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBkZXZwdHNfZnNfdHlwZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImRldnB0cyIsCisJLmdldF9zYgkJPSBkZXZwdHNfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9hbm9uX3N1cGVyLAorfTsKKworLyoKKyAqIFRoZSBub3JtYWwgbmFtaW5nIGNvbnZlbnRpb24gaXMgc2ltcGx5IC9kZXYvcHRzLzxudW1iZXI+OyB0aGlzIGNvbmZvcm1zCisgKiB0byB0aGUgU3lzdGVtIFYgbmFtaW5nIGNvbnZlbnRpb24KKyAqLworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqZ2V0X25vZGUoaW50IG51bSkKK3sKKwljaGFyIHNbMTJdOworCXN0cnVjdCBkZW50cnkgKnJvb3QgPSBkZXZwdHNfcm9vdDsKKwlkb3duKCZyb290LT5kX2lub2RlLT5pX3NlbSk7CisJcmV0dXJuIGxvb2t1cF9vbmVfbGVuKHMsIHJvb3QsIHNwcmludGYocywgIiVkIiwgbnVtKSk7Cit9CisKK2ludCBkZXZwdHNfcHR5X25ldyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQoreworCWludCBudW1iZXIgPSB0dHktPmluZGV4OworCXN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIgPSB0dHktPmRyaXZlcjsKKwlkZXZfdCBkZXZpY2UgPSBNS0RFVihkcml2ZXItPm1ham9yLCBkcml2ZXItPm1pbm9yX3N0YXJ0K251bWJlcik7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBuZXdfaW5vZGUoZGV2cHRzX21udC0+bW50X3NiKTsKKworCS8qIFdlJ3JlIHN1cHBvc2VkIHRvIGJlIGdpdmVuIHRoZSBzbGF2ZSBlbmQgb2YgYSBwdHkgKi8KKwlCVUdfT04oZHJpdmVyLT50eXBlICE9IFRUWV9EUklWRVJfVFlQRV9QVFkpOworCUJVR19PTihkcml2ZXItPnN1YnR5cGUgIT0gUFRZX1RZUEVfU0xBVkUpOworCisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpbm9kZS0+aV9pbm8gPSBudW1iZXIrMjsKKwlpbm9kZS0+aV9ibGtzaXplID0gMTAyNDsKKwlpbm9kZS0+aV91aWQgPSBjb25maWcuc2V0dWlkID8gY29uZmlnLnVpZCA6IGN1cnJlbnQtPmZzdWlkOworCWlub2RlLT5pX2dpZCA9IGNvbmZpZy5zZXRnaWQgPyBjb25maWcuZ2lkIDogY3VycmVudC0+ZnNnaWQ7CisJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgU19JRkNIUnxjb25maWcubW9kZSwgZGV2aWNlKTsKKwlpbm9kZS0+aV9vcCA9ICZkZXZwdHNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCWlub2RlLT51LmdlbmVyaWNfaXAgPSB0dHk7CisKKwlkZW50cnkgPSBnZXRfbm9kZShudW1iZXIpOworCWlmICghSVNfRVJSKGRlbnRyeSkgJiYgIWRlbnRyeS0+ZF9pbm9kZSkKKwkJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKworCXVwKCZkZXZwdHNfcm9vdC0+ZF9pbm9kZS0+aV9zZW0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCB0dHlfc3RydWN0ICpkZXZwdHNfZ2V0X3R0eShpbnQgbnVtYmVyKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGdldF9ub2RlKG51bWJlcik7CisJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eTsKKworCXR0eSA9IE5VTEw7CisJaWYgKCFJU19FUlIoZGVudHJ5KSkgeworCQlpZiAoZGVudHJ5LT5kX2lub2RlKQorCQkJdHR5ID0gZGVudHJ5LT5kX2lub2RlLT51LmdlbmVyaWNfaXA7CisJCWRwdXQoZGVudHJ5KTsKKwl9CisKKwl1cCgmZGV2cHRzX3Jvb3QtPmRfaW5vZGUtPmlfc2VtKTsKKworCXJldHVybiB0dHk7Cit9CisKK3ZvaWQgZGV2cHRzX3B0eV9raWxsKGludCBudW1iZXIpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZ2V0X25vZGUobnVtYmVyKTsKKworCWlmICghSVNfRVJSKGRlbnRyeSkpIHsKKwkJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwkJaWYgKGlub2RlKSB7CisJCQlpbm9kZS0+aV9ubGluay0tOworCQkJZF9kZWxldGUoZGVudHJ5KTsKKwkJCWRwdXQoZGVudHJ5KTsKKwkJfQorCQlkcHV0KGRlbnRyeSk7CisJfQorCXVwKCZkZXZwdHNfcm9vdC0+ZF9pbm9kZS0+aV9zZW0pOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2RldnB0c19mcyh2b2lkKQoreworCWludCBlcnIgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZkZXZwdHNfZnNfdHlwZSk7CisJaWYgKCFlcnIpIHsKKwkJZGV2cHRzX21udCA9IGtlcm5fbW91bnQoJmRldnB0c19mc190eXBlKTsKKwkJaWYgKElTX0VSUihkZXZwdHNfbW50KSkKKwkJCWVyciA9IFBUUl9FUlIoZGV2cHRzX21udCk7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2RldnB0c19mcyh2b2lkKQoreworCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmZGV2cHRzX2ZzX3R5cGUpOworCW1udHB1dChkZXZwdHNfbW50KTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9kZXZwdHNfZnMpCittb2R1bGVfZXhpdChleGl0X2RldnB0c19mcykKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL2RldnB0cy94YXR0cl9zZWN1cml0eS5jIGIvZnMvZGV2cHRzL3hhdHRyX3NlY3VyaXR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY0Y2I1YwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2RldnB0cy94YXR0cl9zZWN1cml0eS5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBTZWN1cml0eSB4YXR0ciBzdXBwb3J0IGZvciBkZXZwdHMuCisgKgorICogQXV0aG9yOiBTdGVwaGVuIFNtYWxsZXkgPHNkc0BlcG9jaC5uY3NjLm1pbD4KKyAqIENvcHlyaWdodCAoYykgMjAwNCBSZWQgSGF0LCBJbmMuLCBKYW1lcyBNb3JyaXMgPGptb3JyaXNAcmVkaGF0LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3hhdHRyLmg+CisKK3N0YXRpYyBzaXplX3QKK2RldnB0c194YXR0cl9zZWN1cml0eV9saXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNoYXIgKmxpc3QsIHNpemVfdCBsaXN0X2xlbiwKKwkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lX2xlbikKK3sKKwlyZXR1cm4gc2VjdXJpdHlfaW5vZGVfbGlzdHNlY3VyaXR5KGlub2RlLCBsaXN0LCBsaXN0X2xlbik7Cit9CisKK3N0YXRpYyBpbnQKK2RldnB0c194YXR0cl9zZWN1cml0eV9nZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKwlpZiAoc3RyY21wKG5hbWUsICIiKSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gc2VjdXJpdHlfaW5vZGVfZ2V0c2VjdXJpdHkoaW5vZGUsIG5hbWUsIGJ1ZmZlciwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQKK2RldnB0c194YXR0cl9zZWN1cml0eV9zZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisJaWYgKHN0cmNtcChuYW1lLCAiIikgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHNlY3VyaXR5X2lub2RlX3NldHNlY3VyaXR5KGlub2RlLCBuYW1lLCB2YWx1ZSwgc2l6ZSwgZmxhZ3MpOworfQorCitzdHJ1Y3QgeGF0dHJfaGFuZGxlciBkZXZwdHNfeGF0dHJfc2VjdXJpdHlfaGFuZGxlciA9IHsKKwkucHJlZml4CT0gWEFUVFJfU0VDVVJJVFlfUFJFRklYLAorCS5saXN0CT0gZGV2cHRzX3hhdHRyX3NlY3VyaXR5X2xpc3QsCisJLmdldAk9IGRldnB0c194YXR0cl9zZWN1cml0eV9nZXQsCisJLnNldAk9IGRldnB0c194YXR0cl9zZWN1cml0eV9zZXQsCit9OwpkaWZmIC0tZ2l0IGEvZnMvZGlyZWN0LWlvLmMgYi9mcy9kaXJlY3QtaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTY3NGEwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZGlyZWN0LWlvLmMKQEAgLTAsMCArMSwxMjU4IEBACisvKgorICogZnMvZGlyZWN0LWlvLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsIExpbnVzIFRvcnZhbGRzLgorICoKKyAqIE9fRElSRUNUCisgKgorICogMDRKdWwyMDAyCWFrcG1AemlwLmNvbS5hdQorICoJCUluaXRpYWwgdmVyc2lvbgorICogMTFTZXAyMDAyCWphbmV0aW5jQHVzLmlibS5jb20KKyAqIAkJYWRkZWQgcmVhZHYvd3JpdGV2IHN1cHBvcnQuCisgKiAyOU9jdDIwMDIJYWtwbUB6aXAuY29tLmF1CisgKgkJcmV3cm90ZSBiaW9fYWRkX3BhZ2UoKSBzdXBwb3J0LgorICogMzBPY3QyMDAyCXBiYWRhcmlAdXMuaWJtLmNvbQorICoJCWFkZGVkIHN1cHBvcnQgZm9yIG5vbi1hbGlnbmVkIElPLgorICogMDZOb3YyMDAyCXBiYWRhcmlAdXMuaWJtLmNvbQorICoJCWFkZGVkIGFzeW5jaHJvbm91cyBJTyBzdXBwb3J0LgorICogMjFKdWwyMDAzCW5hdGhhbnNAc2dpLmNvbQorICoJCWFkZGVkIElPIGNvbXBsZXRpb24gbm90aWZpZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorCisvKgorICogSG93IG1hbnkgdXNlciBwYWdlcyB0byBtYXAgaW4gb25lIGNhbGwgdG8gZ2V0X3VzZXJfcGFnZXMoKS4gIFRoaXMgZGV0ZXJtaW5lcworICogdGhlIHNpemUgb2YgYSBzdHJ1Y3R1cmUgb24gdGhlIHN0YWNrLgorICovCisjZGVmaW5lIERJT19QQUdFUwk2NAorCisvKgorICogVGhpcyBjb2RlIGdlbmVyYWxseSB3b3JrcyBpbiB1bml0cyBvZiAiZGlvX2Jsb2NrcyIuICBBIGRpb19ibG9jayBpcworICogc29tZXdoZXJlIGJldHdlZW4gdGhlIGhhcmQgc2VjdG9yIHNpemUgYW5kIHRoZSBmaWxlc3lzdGVtIGJsb2NrIHNpemUuICBpdAorICogaXMgZGV0ZXJtaW5lZCBvbiBhIHBlci1pbnZvY2F0aW9uIGJhc2lzLiAgIFdoZW4gdGFsa2luZyB0byB0aGUgZmlsZXN5c3RlbQorICogd2UgbmVlZCB0byBjb252ZXJ0IGRpb19ibG9ja3MgdG8gZnNfYmxvY2tzIGJ5IHNjYWxpbmcgdGhlIGRpb19ibG9jayBxdWFudGl0eQorICogZG93biBieSBkaW8tPmJsa2ZhY3Rvci4gIFNpbWlsYXJseSwgZnMtYmxvY2tzaXplIHF1YW50aXRpZXMgYXJlIGNvbnZlcnRlZAorICogdG8gYmlvX2Jsb2NrIHF1YW50aXRpZXMgYnkgc2hpZnRpbmcgbGVmdCBieSBibGtmYWN0b3IuCisgKgorICogSWYgYmxrZmFjdG9yIGlzIHplcm8gdGhlbiB0aGUgdXNlcidzIHJlcXVlc3Qgd2FzIGFsaWduZWQgdG8gdGhlIGZpbGVzeXN0ZW0ncworICogYmxvY2tzaXplLgorICoKKyAqIGxvY2tfdHlwZSBpcyBESU9fTE9DS0lORyBmb3IgcmVndWxhciBmaWxlcyBvbiBkaXJlY3QtSU8tbmFpdmUgZmlsZXN5c3RlbXMuCisgKiBUaGlzIGRldGVybWluZXMgd2hldGhlciB3ZSBuZWVkIHRvIGRvIHRoZSBmYW5jeSBsb2NraW5nIHdoaWNoIHByZXZlbnRzCisgKiBkaXJlY3QtSU8gZnJvbSBiZWluZyBhYmxlIHRvIHJlYWQgdW5pbml0aWFsaXNlZCBkaXNrIGJsb2Nrcy4gIElmIGl0cyB6ZXJvCisgKiAoYmxvY2tkZXYpIHRoaXMgbG9ja2luZyBpcyBub3QgZG9uZSwgYW5kIGlmIGl0IGlzIERJT19PV05fTE9DS0lORyBpX3NlbSBpcworICogbm90IGhlbGQgZm9yIHRoZSBlbnRpcmUgZGlyZWN0IHdyaXRlICh0YWtlbiBicmllZmx5LCBpbml0aWFsbHksIGR1cmluZyBhCisgKiBkaXJlY3QgcmVhZCB0aG91Z2gsIGJ1dCBpdHMgbmV2ZXIgaGVsZCBmb3IgdGhlIGR1cmF0aW9uIG9mIGEgZGlyZWN0LUlPKS4KKyAqLworCitzdHJ1Y3QgZGlvIHsKKwkvKiBCSU8gc3VibWlzc2lvbiBzdGF0ZSAqLworCXN0cnVjdCBiaW8gKmJpbzsJCS8qIGJpbyB1bmRlciBhc3NlbWJseSAqLworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IHJ3OworCWludCBsb2NrX3R5cGU7CQkJLyogZG9lc24ndCBjaGFuZ2UgKi8KKwl1bnNpZ25lZCBibGtiaXRzOwkJLyogZG9lc24ndCBjaGFuZ2UgKi8KKwl1bnNpZ25lZCBibGtmYWN0b3I7CQkvKiBXaGVuIHdlJ3JlIHVzaW5nIGFuIGFsaWdubWVudCB3aGljaAorCQkJCQkgICBpcyBmaW5lciB0aGFuIHRoZSBmaWxlc3lzdGVtJ3Mgc29mdAorCQkJCQkgICBibG9ja3NpemUsIHRoaXMgc3BlY2lmaWVzIGhvdyBtdWNoCisJCQkJCSAgIGZpbmVyLiAgYmxrZmFjdG9yPTIgbWVhbnMgMS80LWJsb2NrCisJCQkJCSAgIGFsaWdubWVudC4gIERvZXMgbm90IGNoYW5nZSAqLworCXVuc2lnbmVkIHN0YXJ0X3plcm9fZG9uZTsJLyogZmxhZzogc3ViLWJsb2Nrc2l6ZSB6ZXJvaW5nIGhhcworCQkJCQkgICBiZWVuIHBlcmZvcm1lZCBhdCB0aGUgc3RhcnQgb2YgYQorCQkJCQkgICB3cml0ZSAqLworCWludCBwYWdlc19pbl9pbzsJCS8qIGFwcHJveGltYXRlIHRvdGFsIElPIHBhZ2VzICovCisJc2l6ZV90CXNpemU7CQkJLyogdG90YWwgcmVxdWVzdCBzaXplIChkb2Vzbid0IGNoYW5nZSkqLworCXNlY3Rvcl90IGJsb2NrX2luX2ZpbGU7CQkvKiBDdXJyZW50IG9mZnNldCBpbnRvIHRoZSB1bmRlcmx5aW5nCisJCQkJCSAgIGZpbGUgaW4gZGlvX2Jsb2NrIHVuaXRzLiAqLworCXVuc2lnbmVkIGJsb2Nrc19hdmFpbGFibGU7CS8qIEF0IGJsb2NrX2luX2ZpbGUuICBjaGFuZ2VzICovCisJc2VjdG9yX3QgZmluYWxfYmxvY2tfaW5fcmVxdWVzdDsvKiBkb2Vzbid0IGNoYW5nZSAqLworCXVuc2lnbmVkIGZpcnN0X2Jsb2NrX2luX3BhZ2U7CS8qIGRvZXNuJ3QgY2hhbmdlLCBVc2VkIG9ubHkgb25jZSAqLworCWludCBib3VuZGFyeTsJCQkvKiBwcmV2IGJsb2NrIGlzIGF0IGEgYm91bmRhcnkgKi8KKwlpbnQgcmVhcF9jb3VudGVyOwkJLyogcmF0ZSBsaW1pdCByZWFwaW5nICovCisJZ2V0X2Jsb2Nrc190ICpnZXRfYmxvY2tzOwkvKiBibG9jayBtYXBwaW5nIGZ1bmN0aW9uICovCisJZGlvX2lvZG9uZV90ICplbmRfaW87CQkvKiBJTyBjb21wbGV0aW9uIGZ1bmN0aW9uICovCisJc2VjdG9yX3QgZmluYWxfYmxvY2tfaW5fYmlvOwkvKiBjdXJyZW50IGZpbmFsIGJsb2NrIGluIGJpbyArIDEgKi8KKwlzZWN0b3JfdCBuZXh0X2Jsb2NrX2Zvcl9pbzsJLyogbmV4dCBibG9jayB0byBiZSBwdXQgdW5kZXIgSU8sCisJCQkJCSAgIGluIGRpb19ibG9ja3MgdW5pdHMgKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgbWFwX2JoOwkvKiBsYXN0IGdldF9ibG9ja3MoKSByZXN1bHQgKi8KKworCS8qCisJICogRGVmZXJyZWQgYWRkaXRpb24gb2YgYSBwYWdlIHRvIHRoZSBkaW8uICBUaGVzZSB2YXJpYWJsZXMgYXJlCisJICogcHJpdmF0ZSB0byBkaW9fc2VuZF9jdXJfcGFnZSgpLCBzdWJtaXRfcGFnZV9zZWN0aW9uKCkgYW5kCisJICogZGlvX2Jpb19hZGRfcGFnZSgpLgorCSAqLworCXN0cnVjdCBwYWdlICpjdXJfcGFnZTsJCS8qIFRoZSBwYWdlICovCisJdW5zaWduZWQgY3VyX3BhZ2Vfb2Zmc2V0OwkvKiBPZmZzZXQgaW50byBpdCwgaW4gYnl0ZXMgKi8KKwl1bnNpZ25lZCBjdXJfcGFnZV9sZW47CQkvKiBOciBvZiBieXRlcyBhdCBjdXJfcGFnZV9vZmZzZXQgKi8KKwlzZWN0b3JfdCBjdXJfcGFnZV9ibG9jazsJLyogV2hlcmUgaXQgc3RhcnRzICovCisKKwkvKgorCSAqIFBhZ2UgZmV0Y2hpbmcgc3RhdGUuIFRoZXNlIHZhcmlhYmxlcyBiZWxvbmcgdG8gZGlvX3JlZmlsbF9wYWdlcygpLgorCSAqLworCWludCBjdXJyX3BhZ2U7CQkJLyogY2hhbmdlcyAqLworCWludCB0b3RhbF9wYWdlczsJCS8qIGRvZXNuJ3QgY2hhbmdlICovCisJdW5zaWduZWQgbG9uZyBjdXJyX3VzZXJfYWRkcmVzczsvKiBjaGFuZ2VzICovCisKKwkvKgorCSAqIFBhZ2UgcXVldWUuICBUaGVzZSB2YXJpYWJsZXMgYmVsb25nIHRvIGRpb19yZWZpbGxfcGFnZXMoKSBhbmQKKwkgKiBkaW9fZ2V0X3BhZ2UoKS4KKwkgKi8KKwlzdHJ1Y3QgcGFnZSAqcGFnZXNbRElPX1BBR0VTXTsJLyogcGFnZSBidWZmZXIgKi8KKwl1bnNpZ25lZCBoZWFkOwkJCS8qIG5leHQgcGFnZSB0byBwcm9jZXNzICovCisJdW5zaWduZWQgdGFpbDsJCQkvKiBsYXN0IHZhbGlkIHBhZ2UgKyAxICovCisJaW50IHBhZ2VfZXJyb3JzOwkJLyogZXJybm8gZnJvbSBnZXRfdXNlcl9wYWdlcygpICovCisKKwkvKiBCSU8gY29tcGxldGlvbiBzdGF0ZSAqLworCXNwaW5sb2NrX3QgYmlvX2xvY2s7CQkvKiBwcm90ZWN0cyBCSU8gZmllbGRzIGJlbG93ICovCisJaW50IGJpb19jb3VudDsJCQkvKiBuciBiaW9zIHRvIGJlIGNvbXBsZXRlZCAqLworCWludCBiaW9zX2luX2ZsaWdodDsJCS8qIG5yIGJpb3MgaW4gZmxpZ2h0ICovCisJc3RydWN0IGJpbyAqYmlvX2xpc3Q7CQkvKiBzaW5nbHkgbGlua2VkIHZpYSBiaV9wcml2YXRlICovCisJc3RydWN0IHRhc2tfc3RydWN0ICp3YWl0ZXI7CS8qIHdhaXRpbmcgdGFzayAoTlVMTCBpZiBub25lKSAqLworCisJLyogQUlPIHJlbGF0ZWQgc3R1ZmYgKi8KKwlzdHJ1Y3Qga2lvY2IgKmlvY2I7CQkvKiBraW9jYiAqLworCWludCBpc19hc3luYzsJCQkvKiBpcyBJTyBhc3luYyA/ICovCisJc3NpemVfdCByZXN1bHQ7ICAgICAgICAgICAgICAgICAvKiBJTyByZXN1bHQgKi8KK307CisKKy8qCisgKiBIb3cgbWFueSBwYWdlcyBhcmUgaW4gdGhlIHF1ZXVlPworICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGRpb19wYWdlc19wcmVzZW50KHN0cnVjdCBkaW8gKmRpbykKK3sKKwlyZXR1cm4gZGlvLT50YWlsIC0gZGlvLT5oZWFkOworfQorCisvKgorICogR28gZ3JhYiBhbmQgcGluIHNvbWUgdXNlcnNwYWNlIHBhZ2VzLiAgIFR5cGljYWxseSB3ZSdsbCBnZXQgNjQgYXQgYSB0aW1lLgorICovCitzdGF0aWMgaW50IGRpb19yZWZpbGxfcGFnZXMoc3RydWN0IGRpbyAqZGlvKQoreworCWludCByZXQ7CisJaW50IG5yX3BhZ2VzOworCisJbnJfcGFnZXMgPSBtaW4oZGlvLT50b3RhbF9wYWdlcyAtIGRpby0+Y3Vycl9wYWdlLCBESU9fUEFHRVMpOworCWRvd25fcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwlyZXQgPSBnZXRfdXNlcl9wYWdlcygKKwkJY3VycmVudCwJCQkvKiBUYXNrIGZvciBmYXVsdCBhY291bnRpbmcgKi8KKwkJY3VycmVudC0+bW0sCQkJLyogd2hvc2UgcGFnZXM/ICovCisJCWRpby0+Y3Vycl91c2VyX2FkZHJlc3MsCQkvKiBXaGVyZSBmcm9tPyAqLworCQlucl9wYWdlcywJCQkvKiBIb3cgbWFueSBwYWdlcz8gKi8KKwkJZGlvLT5ydyA9PSBSRUFELAkJLyogV3JpdGUgdG8gbWVtb3J5PyAqLworCQkwLAkJCQkvKiBmb3JjZSAoPykgKi8KKwkJJmRpby0+cGFnZXNbMF0sCisJCU5VTEwpOwkJCQkvKiB2bWFzICovCisJdXBfcmVhZCgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKworCWlmIChyZXQgPCAwICYmIGRpby0+YmxvY2tzX2F2YWlsYWJsZSAmJiAoZGlvLT5ydyA9PSBXUklURSkpIHsKKwkJLyoKKwkJICogQSBtZW1vcnkgZmF1bHQsIGJ1dCB0aGUgZmlsZXN5c3RlbSBoYXMgc29tZSBvdXRzdGFuZGluZworCQkgKiBtYXBwZWQgYmxvY2tzLiAgV2UgbmVlZCB0byB1c2UgdGhvc2UgYmxvY2tzIHVwIHRvIGF2b2lkCisJCSAqIGxlYWtpbmcgc3RhbGUgZGF0YSBpbiB0aGUgZmlsZS4KKwkJICovCisJCWlmIChkaW8tPnBhZ2VfZXJyb3JzID09IDApCisJCQlkaW8tPnBhZ2VfZXJyb3JzID0gcmV0OworCQlkaW8tPnBhZ2VzWzBdID0gWkVST19QQUdFKGRpby0+Y3Vycl91c2VyX2FkZHJlc3MpOworCQlkaW8tPmhlYWQgPSAwOworCQlkaW8tPnRhaWwgPSAxOworCQlyZXQgPSAwOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAocmV0ID49IDApIHsKKwkJZGlvLT5jdXJyX3VzZXJfYWRkcmVzcyArPSByZXQgKiBQQUdFX1NJWkU7CisJCWRpby0+Y3Vycl9wYWdlICs9IHJldDsKKwkJZGlvLT5oZWFkID0gMDsKKwkJZGlvLT50YWlsID0gcmV0OworCQlyZXQgPSAwOworCX0KK291dDoKKwlyZXR1cm4gcmV0OwkKK30KKworLyoKKyAqIEdldCBhbm90aGVyIHVzZXJzcGFjZSBwYWdlLiAgUmV0dXJucyBhbiBFUlJfUFRSIG9uIGVycm9yLiAgUGFnZXMgYXJlCisgKiBidWZmZXJlZCBpbnNpZGUgdGhlIGRpbyBzbyB0aGF0IHdlIGNhbiBjYWxsIGdldF91c2VyX3BhZ2VzKCkgYWdhaW5zdCBhCisgKiBkZWNlbnQgbnVtYmVyIG9mIHBhZ2VzLCBsZXNzIGZyZXF1ZW50bHkuICBUbyBwcm92aWRlIG5pY2VyIHVzZSBvZiB0aGUKKyAqIEwxIGNhY2hlLgorICovCitzdGF0aWMgc3RydWN0IHBhZ2UgKmRpb19nZXRfcGFnZShzdHJ1Y3QgZGlvICpkaW8pCit7CisJaWYgKGRpb19wYWdlc19wcmVzZW50KGRpbykgPT0gMCkgeworCQlpbnQgcmV0OworCisJCXJldCA9IGRpb19yZWZpbGxfcGFnZXMoZGlvKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiBFUlJfUFRSKHJldCk7CisJCUJVR19PTihkaW9fcGFnZXNfcHJlc2VudChkaW8pID09IDApOworCX0KKwlyZXR1cm4gZGlvLT5wYWdlc1tkaW8tPmhlYWQrK107Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbiBhbGwgRElPIEJJTyBJL08gaGFzIGJlZW4gY29tcGxldGVkIC0gbGV0IHRoZSBmaWxlc3lzdGVtCisgKiBrbm93LCBpZiBpdCByZWdpc3RlcmVkIGFuIGludGVyZXN0IGVhcmxpZXIgdmlhIGdldF9ibG9ja3MuICBQYXNzIHRoZQorICogcHJpdmF0ZSBmaWVsZCBvZiB0aGUgbWFwIGJ1ZmZlcl9oZWFkIHNvIHRoYXQgZmlsZXN5c3RlbXMgY2FuIHVzZSBpdAorICogdG8gaG9sZCBhZGRpdGlvbmFsIHN0YXRlIGJldHdlZW4gZ2V0X2Jsb2NrcyBjYWxscyBhbmQgZGlvX2NvbXBsZXRlLgorICovCitzdGF0aWMgdm9pZCBkaW9fY29tcGxldGUoc3RydWN0IGRpbyAqZGlvLCBsb2ZmX3Qgb2Zmc2V0LCBzc2l6ZV90IGJ5dGVzKQoreworCWlmIChkaW8tPmVuZF9pbyAmJiBkaW8tPnJlc3VsdCkKKwkJZGlvLT5lbmRfaW8oZGlvLT5pbm9kZSwgb2Zmc2V0LCBieXRlcywgZGlvLT5tYXBfYmguYl9wcml2YXRlKTsKKwlpZiAoZGlvLT5sb2NrX3R5cGUgPT0gRElPX0xPQ0tJTkcpCisJCXVwX3JlYWQoJmRpby0+aW5vZGUtPmlfYWxsb2Nfc2VtKTsKK30KKworLyoKKyAqIENhbGxlZCB3aGVuIGEgQklPIGhhcyBiZWVuIHByb2Nlc3NlZC4gIElmIHRoZSBjb3VudCBnb2VzIHRvIHplcm8gdGhlbiBJTyBpcworICogY29tcGxldGUgYW5kIHdlIGNhbiBzaWduYWwgdGhpcyB0byB0aGUgQUlPIGxheWVyLgorICovCitzdGF0aWMgdm9pZCBmaW5pc2hlZF9vbmVfYmlvKHN0cnVjdCBkaW8gKmRpbykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRpby0+YmlvX2xvY2ssIGZsYWdzKTsKKwlpZiAoZGlvLT5iaW9fY291bnQgPT0gMSkgeworCQlpZiAoZGlvLT5pc19hc3luYykgeworCQkJLyoKKwkJCSAqIExhc3QgcmVmZXJlbmNlIHRvIHRoZSBkaW8gaXMgZ29pbmcgYXdheS4KKwkJCSAqIERyb3Agc3BpbmxvY2sgYW5kIGNvbXBsZXRlIHRoZSBESU8uCisJCQkgKi8KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpby0+YmlvX2xvY2ssIGZsYWdzKTsKKwkJCWRpb19jb21wbGV0ZShkaW8sIGRpby0+YmxvY2tfaW5fZmlsZSA8PCBkaW8tPmJsa2JpdHMsCisJCQkJCWRpby0+cmVzdWx0KTsKKwkJCS8qIENvbXBsZXRlIEFJTyBsYXRlciBpZiBmYWxsaW5nIGJhY2sgdG8gYnVmZmVyZWQgaS9vICovCisJCQlpZiAoZGlvLT5yZXN1bHQgPT0gZGlvLT5zaXplIHx8CisJCQkJKChkaW8tPnJ3ID09IFJFQUQpICYmIGRpby0+cmVzdWx0KSkgeworCQkJCWFpb19jb21wbGV0ZShkaW8tPmlvY2IsIGRpby0+cmVzdWx0LCAwKTsKKwkJCQlrZnJlZShkaW8pOworCQkJCXJldHVybjsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBGYWxsaW5nIGJhY2sgdG8gYnVmZmVyZWQKKwkJCQkgKi8KKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGlvLT5iaW9fbG9jaywgZmxhZ3MpOworCQkJCWRpby0+YmlvX2NvdW50LS07CisJCQkJaWYgKGRpby0+d2FpdGVyKQorCQkJCQl3YWtlX3VwX3Byb2Nlc3MoZGlvLT53YWl0ZXIpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpby0+YmlvX2xvY2ssIGZsYWdzKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9CisJZGlvLT5iaW9fY291bnQtLTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkaW8tPmJpb19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgZGlvX2Jpb19jb21wbGV0ZShzdHJ1Y3QgZGlvICpkaW8sIHN0cnVjdCBiaW8gKmJpbyk7CisvKgorICogQXN5bmNocm9ub3VzIElPIGNhbGxiYWNrLiAKKyAqLworc3RhdGljIGludCBkaW9fYmlvX2VuZF9haW8oc3RydWN0IGJpbyAqYmlvLCB1bnNpZ25lZCBpbnQgYnl0ZXNfZG9uZSwgaW50IGVycm9yKQoreworCXN0cnVjdCBkaW8gKmRpbyA9IGJpby0+YmlfcHJpdmF0ZTsKKworCWlmIChiaW8tPmJpX3NpemUpCisJCXJldHVybiAxOworCisJLyogY2xlYW51cCB0aGUgYmlvICovCisJZGlvX2Jpb19jb21wbGV0ZShkaW8sIGJpbyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGUgQklPIGNvbXBsZXRpb24gaGFuZGxlciBzaW1wbHkgcXVldWVzIHRoZSBCSU8gdXAgZm9yIHRoZSBwcm9jZXNzLWNvbnRleHQKKyAqIGhhbmRsZXIuCisgKgorICogRHVyaW5nIEkvTyBiaV9wcml2YXRlIHBvaW50cyBhdCB0aGUgZGlvLiAgQWZ0ZXIgSS9PLCBiaV9wcml2YXRlIGlzIHVzZWQgdG8KKyAqIGltcGxlbWVudCBhIHNpbmdseS1saW5rZWQgbGlzdCBvZiBjb21wbGV0ZWQgQklPcywgYXQgZGlvLT5iaW9fbGlzdC4KKyAqLworc3RhdGljIGludCBkaW9fYmlvX2VuZF9pbyhzdHJ1Y3QgYmlvICpiaW8sIHVuc2lnbmVkIGludCBieXRlc19kb25lLCBpbnQgZXJyb3IpCit7CisJc3RydWN0IGRpbyAqZGlvID0gYmlvLT5iaV9wcml2YXRlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoYmlvLT5iaV9zaXplKQorCQlyZXR1cm4gMTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkaW8tPmJpb19sb2NrLCBmbGFncyk7CisJYmlvLT5iaV9wcml2YXRlID0gZGlvLT5iaW9fbGlzdDsKKwlkaW8tPmJpb19saXN0ID0gYmlvOworCWRpby0+Ymlvc19pbl9mbGlnaHQtLTsKKwlpZiAoZGlvLT53YWl0ZXIgJiYgZGlvLT5iaW9zX2luX2ZsaWdodCA9PSAwKQorCQl3YWtlX3VwX3Byb2Nlc3MoZGlvLT53YWl0ZXIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpby0+YmlvX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZGlvX2Jpb19hbGxvYyhzdHJ1Y3QgZGlvICpkaW8sIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJCXNlY3Rvcl90IGZpcnN0X3NlY3RvciwgaW50IG5yX3ZlY3MpCit7CisJc3RydWN0IGJpbyAqYmlvOworCisJYmlvID0gYmlvX2FsbG9jKEdGUF9LRVJORUwsIG5yX3ZlY3MpOworCWlmIChiaW8gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwliaW8tPmJpX2JkZXYgPSBiZGV2OworCWJpby0+Ymlfc2VjdG9yID0gZmlyc3Rfc2VjdG9yOworCWlmIChkaW8tPmlzX2FzeW5jKQorCQliaW8tPmJpX2VuZF9pbyA9IGRpb19iaW9fZW5kX2FpbzsKKwllbHNlCisJCWJpby0+YmlfZW5kX2lvID0gZGlvX2Jpb19lbmRfaW87CisKKwlkaW8tPmJpbyA9IGJpbzsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEluIHRoZSBBSU8gcmVhZCBjYXNlIHdlIHNwZWN1bGF0aXZlbHkgZGlydHkgdGhlIHBhZ2VzIGJlZm9yZSBzdGFydGluZyBJTy4KKyAqIER1cmluZyBJTyBjb21wbGV0aW9uLCBhbnkgb2YgdGhlc2UgcGFnZXMgd2hpY2ggaGFwcGVuIHRvIGhhdmUgYmVlbiB3cml0dGVuCisgKiBiYWNrIHdpbGwgYmUgcmVkaXJ0aWVkIGJ5IGJpb19jaGVja19wYWdlc19kaXJ0eSgpLgorICovCitzdGF0aWMgdm9pZCBkaW9fYmlvX3N1Ym1pdChzdHJ1Y3QgZGlvICpkaW8pCit7CisJc3RydWN0IGJpbyAqYmlvID0gZGlvLT5iaW87CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWJpby0+YmlfcHJpdmF0ZSA9IGRpbzsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGlvLT5iaW9fbG9jaywgZmxhZ3MpOworCWRpby0+YmlvX2NvdW50Kys7CisJZGlvLT5iaW9zX2luX2ZsaWdodCsrOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpby0+YmlvX2xvY2ssIGZsYWdzKTsKKwlpZiAoZGlvLT5pc19hc3luYyAmJiBkaW8tPnJ3ID09IFJFQUQpCisJCWJpb19zZXRfcGFnZXNfZGlydHkoYmlvKTsKKwlzdWJtaXRfYmlvKGRpby0+cncsIGJpbyk7CisKKwlkaW8tPmJpbyA9IE5VTEw7CisJZGlvLT5ib3VuZGFyeSA9IDA7Cit9CisKKy8qCisgKiBSZWxlYXNlIGFueSByZXNvdXJjZXMgaW4gY2FzZSBvZiBhIGZhaWx1cmUKKyAqLworc3RhdGljIHZvaWQgZGlvX2NsZWFudXAoc3RydWN0IGRpbyAqZGlvKQoreworCXdoaWxlIChkaW9fcGFnZXNfcHJlc2VudChkaW8pKQorCQlwYWdlX2NhY2hlX3JlbGVhc2UoZGlvX2dldF9wYWdlKGRpbykpOworfQorCisvKgorICogV2FpdCBmb3IgdGhlIG5leHQgQklPIHRvIGNvbXBsZXRlLiAgUmVtb3ZlIGl0IGFuZCByZXR1cm4gaXQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYmlvICpkaW9fYXdhaXRfb25lKHN0cnVjdCBkaW8gKmRpbykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBiaW8gKmJpbzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkaW8tPmJpb19sb2NrLCBmbGFncyk7CisJd2hpbGUgKGRpby0+YmlvX2xpc3QgPT0gTlVMTCkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCWlmIChkaW8tPmJpb19saXN0ID09IE5VTEwpIHsKKwkJCWRpby0+d2FpdGVyID0gY3VycmVudDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpby0+YmlvX2xvY2ssIGZsYWdzKTsKKwkJCWJsa19ydW5fYWRkcmVzc19zcGFjZShkaW8tPmlub2RlLT5pX21hcHBpbmcpOworCQkJaW9fc2NoZWR1bGUoKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZkaW8tPmJpb19sb2NrLCBmbGFncyk7CisJCQlkaW8tPndhaXRlciA9IE5VTEw7CisJCX0KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwl9CisJYmlvID0gZGlvLT5iaW9fbGlzdDsKKwlkaW8tPmJpb19saXN0ID0gYmlvLT5iaV9wcml2YXRlOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpby0+YmlvX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gYmlvOworfQorCisvKgorICogUHJvY2VzcyBvbmUgY29tcGxldGVkIEJJTy4gIE5vIGxvY2tzIGFyZSBoZWxkLgorICovCitzdGF0aWMgaW50IGRpb19iaW9fY29tcGxldGUoc3RydWN0IGRpbyAqZGlvLCBzdHJ1Y3QgYmlvICpiaW8pCit7CisJY29uc3QgaW50IHVwdG9kYXRlID0gdGVzdF9iaXQoQklPX1VQVE9EQVRFLCAmYmlvLT5iaV9mbGFncyk7CisJc3RydWN0IGJpb192ZWMgKmJ2ZWMgPSBiaW8tPmJpX2lvX3ZlYzsKKwlpbnQgcGFnZV9ubzsKKworCWlmICghdXB0b2RhdGUpCisJCWRpby0+cmVzdWx0ID0gLUVJTzsKKworCWlmIChkaW8tPmlzX2FzeW5jICYmIGRpby0+cncgPT0gUkVBRCkgeworCQliaW9fY2hlY2tfcGFnZXNfZGlydHkoYmlvKTsJLyogdHJhbnNmZXJzIG93bmVyc2hpcCAqLworCX0gZWxzZSB7CisJCWZvciAocGFnZV9ubyA9IDA7IHBhZ2Vfbm8gPCBiaW8tPmJpX3ZjbnQ7IHBhZ2Vfbm8rKykgeworCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBidmVjW3BhZ2Vfbm9dLmJ2X3BhZ2U7CisKKwkJCWlmIChkaW8tPnJ3ID09IFJFQUQgJiYgIVBhZ2VDb21wb3VuZChwYWdlKSkKKwkJCQlzZXRfcGFnZV9kaXJ0eV9sb2NrKHBhZ2UpOworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQl9CisJCWJpb19wdXQoYmlvKTsKKwl9CisJZmluaXNoZWRfb25lX2JpbyhkaW8pOworCXJldHVybiB1cHRvZGF0ZSA/IDAgOiAtRUlPOworfQorCisvKgorICogV2FpdCBvbiBhbmQgcHJvY2VzcyBhbGwgaW4tZmxpZ2h0IEJJT3MuCisgKi8KK3N0YXRpYyBpbnQgZGlvX2F3YWl0X2NvbXBsZXRpb24oc3RydWN0IGRpbyAqZGlvKQoreworCWludCByZXQgPSAwOworCisJaWYgKGRpby0+YmlvKQorCQlkaW9fYmlvX3N1Ym1pdChkaW8pOworCisJLyoKKwkgKiBUaGUgYmlvX2xvY2sgaXMgbm90IGhlbGQgZm9yIHRoZSByZWFkIG9mIGJpb19jb3VudC4KKwkgKiBUaGlzIGlzIG9rIHNpbmNlIGl0IGlzIHRoZSBkaW9fYmlvX2NvbXBsZXRlKCkgdGhhdCBjaGFuZ2VzCisJICogYmlvX2NvdW50LgorCSAqLworCXdoaWxlIChkaW8tPmJpb19jb3VudCkgeworCQlzdHJ1Y3QgYmlvICpiaW8gPSBkaW9fYXdhaXRfb25lKGRpbyk7CisJCWludCByZXQyOworCisJCXJldDIgPSBkaW9fYmlvX2NvbXBsZXRlKGRpbywgYmlvKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJcmV0ID0gcmV0MjsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEEgcmVhbGx5IGxhcmdlIE9fRElSRUNUIHJlYWQgb3Igd3JpdGUgY2FuIGdlbmVyYXRlIGEgbG90IG9mIEJJT3MuICBTbworICogdG8ga2VlcCB0aGUgbWVtb3J5IGNvbnN1bXB0aW9uIHNhbmUgd2UgcGVyaW9kaWNhbGx5IHJlYXAgYW55IGNvbXBsZXRlZCBCSU9zCisgKiBkdXJpbmcgdGhlIEJJTyBnZW5lcmF0aW9uIHBoYXNlLgorICoKKyAqIFRoaXMgYWxzbyBoZWxwcyB0byBsaW1pdCB0aGUgcGVhayBhbW91bnQgb2YgcGlubmVkIHVzZXJzcGFjZSBtZW1vcnkuCisgKi8KK3N0YXRpYyBpbnQgZGlvX2Jpb19yZWFwKHN0cnVjdCBkaW8gKmRpbykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChkaW8tPnJlYXBfY291bnRlcisrID49IDY0KSB7CisJCXdoaWxlIChkaW8tPmJpb19saXN0KSB7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJc3RydWN0IGJpbyAqYmlvOworCQkJaW50IHJldDI7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZkaW8tPmJpb19sb2NrLCBmbGFncyk7CisJCQliaW8gPSBkaW8tPmJpb19saXN0OworCQkJZGlvLT5iaW9fbGlzdCA9IGJpby0+YmlfcHJpdmF0ZTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpby0+YmlvX2xvY2ssIGZsYWdzKTsKKwkJCXJldDIgPSBkaW9fYmlvX2NvbXBsZXRlKGRpbywgYmlvKTsKKwkJCWlmIChyZXQgPT0gMCkKKwkJCQlyZXQgPSByZXQyOworCQl9CisJCWRpby0+cmVhcF9jb3VudGVyID0gMDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIENhbGwgaW50byB0aGUgZnMgdG8gbWFwIHNvbWUgbW9yZSBkaXNrIGJsb2Nrcy4gIFdlIHJlY29yZCB0aGUgY3VycmVudCBudW1iZXIKKyAqIG9mIGF2YWlsYWJsZSBibG9ja3MgYXQgZGlvLT5ibG9ja3NfYXZhaWxhYmxlLiAgVGhlc2UgYXJlIGluIHVuaXRzIG9mIHRoZQorICogZnMgYmxvY2tzaXplLCAoMSA8PCBpbm9kZS0+aV9ibGtiaXRzKS4KKyAqCisgKiBUaGUgZnMgaXMgYWxsb3dlZCB0byBtYXAgbG90cyBvZiBibG9ja3MgYXQgb25jZS4gIElmIGl0IHdhbnRzIHRvIGRvIHRoYXQsCisgKiBpdCB1c2VzIHRoZSBwYXNzZWQgaW5vZGUtcmVsYXRpdmUgYmxvY2sgbnVtYmVyIGFzIHRoZSBmaWxlIG9mZnNldCwgYXMgdXN1YWwuCisgKgorICogZ2V0X2Jsb2NrcygpIGlzIHBhc3NlZCB0aGUgbnVtYmVyIG9mIGlfYmxrYml0cy1zaXplZCBibG9ja3Mgd2hpY2ggZGlyZWN0X2lvCisgKiBoYXMgcmVtYWluaW5nIHRvIGRvLiAgVGhlIGZzIHNob3VsZCBub3QgbWFwIG1vcmUgdGhhbiB0aGlzIG51bWJlciBvZiBibG9ja3MuCisgKgorICogSWYgdGhlIGZzIGhhcyBtYXBwZWQgYSBsb3Qgb2YgYmxvY2tzLCBpdCBzaG91bGQgcG9wdWxhdGUgYmgtPmJfc2l6ZSB0bworICogaW5kaWNhdGUgaG93IG11Y2ggY29udGlndW91cyBkaXNrIHNwYWNlIGhhcyBiZWVuIG1hZGUgYXZhaWxhYmxlIGF0CisgKiBiaC0+Yl9ibG9ja25yLgorICoKKyAqIElmICphbnkqIG9mIHRoZSBtYXBwZWQgYmxvY2tzIGFyZSBuZXcsIHRoZW4gdGhlIGZzIG11c3Qgc2V0IGJ1ZmZlcl9uZXcoKS4KKyAqIFRoaXMgaXNuJ3QgdmVyeSBlZmZpY2llbnQuLi4KKyAqCisgKiBJbiB0aGUgY2FzZSBvZiBmaWxlc3lzdGVtIGhvbGVzOiB0aGUgZnMgbWF5IHJldHVybiBhbiBhcmJpdHJhcmlseS1sYXJnZQorICogaG9sZSBieSByZXR1cm5pbmcgYW4gYXBwcm9wcmlhdGUgdmFsdWUgaW4gYl9zaXplIGFuZCBieSBjbGVhcmluZworICogYnVmZmVyX21hcHBlZCgpLiAgSG93ZXZlciB0aGUgZGlyZWN0LWlvIGNvZGUgd2lsbCBvbmx5IHByb2Nlc3MgaG9sZXMgb25lCisgKiBibG9jayBhdCBhIHRpbWUgLSBpdCB3aWxsIHJlcGVhdGVkbHkgY2FsbCBnZXRfYmxvY2tzKCkgYXMgaXQgd2Fsa3MgdGhlIGhvbGUuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X21vcmVfYmxvY2tzKHN0cnVjdCBkaW8gKmRpbykKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBidWZmZXJfaGVhZCAqbWFwX2JoID0gJmRpby0+bWFwX2JoOworCXNlY3Rvcl90IGZzX3N0YXJ0YmxrOwkvKiBJbnRvIGZpbGUsIGluIGZpbGVzeXN0ZW0tc2l6ZWQgYmxvY2tzICovCisJdW5zaWduZWQgbG9uZyBmc19jb3VudDsJLyogTnVtYmVyIG9mIGZpbGVzeXN0ZW0tc2l6ZWQgYmxvY2tzICovCisJdW5zaWduZWQgbG9uZyBkaW9fY291bnQ7LyogTnVtYmVyIG9mIGRpb19ibG9jay1zaXplZCBibG9ja3MgKi8KKwl1bnNpZ25lZCBsb25nIGJsa21hc2s7CisJaW50IGNyZWF0ZTsKKworCS8qCisJICogSWYgdGhlcmUgd2FzIGEgbWVtb3J5IGVycm9yIGFuZCB3ZSd2ZSBvdmVyd3JpdHRlbiBhbGwgdGhlCisJICogbWFwcGVkIGJsb2NrcyB0aGVuIHdlIGNhbiBub3cgcmV0dXJuIHRoYXQgbWVtb3J5IGVycm9yCisJICovCisJcmV0ID0gZGlvLT5wYWdlX2Vycm9yczsKKwlpZiAocmV0ID09IDApIHsKKwkJbWFwX2JoLT5iX3N0YXRlID0gMDsKKwkJbWFwX2JoLT5iX3NpemUgPSAwOworCQlCVUdfT04oZGlvLT5ibG9ja19pbl9maWxlID49IGRpby0+ZmluYWxfYmxvY2tfaW5fcmVxdWVzdCk7CisJCWZzX3N0YXJ0YmxrID0gZGlvLT5ibG9ja19pbl9maWxlID4+IGRpby0+YmxrZmFjdG9yOworCQlkaW9fY291bnQgPSBkaW8tPmZpbmFsX2Jsb2NrX2luX3JlcXVlc3QgLSBkaW8tPmJsb2NrX2luX2ZpbGU7CisJCWZzX2NvdW50ID0gZGlvX2NvdW50ID4+IGRpby0+YmxrZmFjdG9yOworCQlibGttYXNrID0gKDEgPDwgZGlvLT5ibGtmYWN0b3IpIC0gMTsKKwkJaWYgKGRpb19jb3VudCAmIGJsa21hc2spCQorCQkJZnNfY291bnQrKzsKKworCQljcmVhdGUgPSBkaW8tPnJ3ID09IFdSSVRFOworCQlpZiAoZGlvLT5sb2NrX3R5cGUgPT0gRElPX0xPQ0tJTkcpIHsKKwkJCWlmIChkaW8tPmJsb2NrX2luX2ZpbGUgPCAoaV9zaXplX3JlYWQoZGlvLT5pbm9kZSkgPj4KKwkJCQkJCQlkaW8tPmJsa2JpdHMpKQorCQkJCWNyZWF0ZSA9IDA7CisJCX0gZWxzZSBpZiAoZGlvLT5sb2NrX3R5cGUgPT0gRElPX05PX0xPQ0tJTkcpIHsKKwkJCWNyZWF0ZSA9IDA7CisJCX0KKwkJLyoKKwkJICogRm9yIHdyaXRlcyBpbnNpZGUgaV9zaXplIHdlIGZvcmJpZCBibG9jayBjcmVhdGlvbnM6IG9ubHkKKwkJICogb3ZlcndyaXRlcyBhcmUgcGVybWl0dGVkLiAgV2UgZmFsbCBiYWNrIHRvIGJ1ZmZlcmVkIHdyaXRlcworCQkgKiBhdCBhIGhpZ2hlciBsZXZlbCBmb3IgaW5zaWRlLWlfc2l6ZSBibG9jay1pbnN0YW50aWF0aW5nCisJCSAqIHdyaXRlcy4KKwkJICovCisJCXJldCA9ICgqZGlvLT5nZXRfYmxvY2tzKShkaW8tPmlub2RlLCBmc19zdGFydGJsaywgZnNfY291bnQsCisJCQkJCQltYXBfYmgsIGNyZWF0ZSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBUaGVyZSBpcyBubyBiaW8uICBNYWtlIG9uZSBub3cuCisgKi8KK3N0YXRpYyBpbnQgZGlvX25ld19iaW8oc3RydWN0IGRpbyAqZGlvLCBzZWN0b3JfdCBzdGFydF9zZWN0b3IpCit7CisJc2VjdG9yX3Qgc2VjdG9yOworCWludCByZXQsIG5yX3BhZ2VzOworCisJcmV0ID0gZGlvX2Jpb19yZWFwKGRpbyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisJc2VjdG9yID0gc3RhcnRfc2VjdG9yIDw8IChkaW8tPmJsa2JpdHMgLSA5KTsKKwlucl9wYWdlcyA9IG1pbihkaW8tPnBhZ2VzX2luX2lvLCBiaW9fZ2V0X25yX3ZlY3MoZGlvLT5tYXBfYmguYl9iZGV2KSk7CisJQlVHX09OKG5yX3BhZ2VzIDw9IDApOworCXJldCA9IGRpb19iaW9fYWxsb2MoZGlvLCBkaW8tPm1hcF9iaC5iX2JkZXYsIHNlY3RvciwgbnJfcGFnZXMpOworCWRpby0+Ym91bmRhcnkgPSAwOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBBdHRlbXB0IHRvIHB1dCB0aGUgY3VycmVudCBjaHVuayBvZiAnY3VyX3BhZ2UnIGludG8gdGhlIGN1cnJlbnQgQklPLiAgSWYKKyAqIHRoYXQgd2FzIHN1Y2Nlc3NmdWwgdGhlbiB1cGRhdGUgZmluYWxfYmxvY2tfaW5fYmlvIGFuZCB0YWtlIGEgcmVmIGFnYWluc3QKKyAqIHRoZSBqdXN0LWFkZGVkIHBhZ2UuCisgKgorICogUmV0dXJuIHplcm8gb24gc3VjY2Vzcy4gIE5vbi16ZXJvIG1lYW5zIHRoZSBjYWxsZXIgbmVlZHMgdG8gc3RhcnQgYSBuZXcgQklPLgorICovCitzdGF0aWMgaW50IGRpb19iaW9fYWRkX3BhZ2Uoc3RydWN0IGRpbyAqZGlvKQoreworCWludCByZXQ7CisKKwlyZXQgPSBiaW9fYWRkX3BhZ2UoZGlvLT5iaW8sIGRpby0+Y3VyX3BhZ2UsCisJCQlkaW8tPmN1cl9wYWdlX2xlbiwgZGlvLT5jdXJfcGFnZV9vZmZzZXQpOworCWlmIChyZXQgPT0gZGlvLT5jdXJfcGFnZV9sZW4pIHsKKwkJLyoKKwkJICogRGVjcmVtZW50IGNvdW50IG9ubHksIGlmIHdlIGFyZSBkb25lIHdpdGggdGhpcyBwYWdlCisJCSAqLworCQlpZiAoKGRpby0+Y3VyX3BhZ2VfbGVuICsgZGlvLT5jdXJfcGFnZV9vZmZzZXQpID09IFBBR0VfU0laRSkKKwkJCWRpby0+cGFnZXNfaW5faW8tLTsKKwkJcGFnZV9jYWNoZV9nZXQoZGlvLT5jdXJfcGFnZSk7CisJCWRpby0+ZmluYWxfYmxvY2tfaW5fYmlvID0gZGlvLT5jdXJfcGFnZV9ibG9jayArCisJCQkoZGlvLT5jdXJfcGFnZV9sZW4gPj4gZGlvLT5ibGtiaXRzKTsKKwkJcmV0ID0gMDsKKwl9IGVsc2UgeworCQlyZXQgPSAxOworCX0KKwlyZXR1cm4gcmV0OworfQorCQkKKy8qCisgKiBQdXQgY3VyX3BhZ2UgdW5kZXIgSU8uICBUaGUgc2VjdGlvbiBvZiBjdXJfcGFnZSB3aGljaCBpcyBkZXNjcmliZWQgYnkKKyAqIGN1cl9wYWdlX29mZnNldCxjdXJfcGFnZV9sZW4gaXMgcHV0IGludG8gYSBCSU8uICBUaGUgc2VjdGlvbiBvZiBjdXJfcGFnZQorICogc3RhcnRzIG9uLWRpc2sgYXQgY3VyX3BhZ2VfYmxvY2suCisgKgorICogV2UgdGFrZSBhIHJlZiBhZ2FpbnN0IHRoZSBwYWdlIGhlcmUgKG9uIGJlaGFsZiBvZiBpdHMgcHJlc2VuY2UgaW4gdGhlIGJpbykuCisgKgorICogVGhlIGNhbGxlciBvZiB0aGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciByZW1vdmluZyBjdXJfcGFnZSBmcm9tIHRoZQorICogZGlvLCBhbmQgZm9yIGRyb3BwaW5nIHRoZSByZWZjb3VudCB3aGljaCBjYW1lIGZyb20gdGhhdCBwcmVzZW5jZS4KKyAqLworc3RhdGljIGludCBkaW9fc2VuZF9jdXJfcGFnZShzdHJ1Y3QgZGlvICpkaW8pCit7CisJaW50IHJldCA9IDA7CisKKwlpZiAoZGlvLT5iaW8pIHsKKwkJLyoKKwkJICogU2VlIHdoZXRoZXIgdGhpcyBuZXcgcmVxdWVzdCBpcyBjb250aWd1b3VzIHdpdGggdGhlIG9sZAorCQkgKi8KKwkJaWYgKGRpby0+ZmluYWxfYmxvY2tfaW5fYmlvICE9IGRpby0+Y3VyX3BhZ2VfYmxvY2spCisJCQlkaW9fYmlvX3N1Ym1pdChkaW8pOworCQkvKgorCQkgKiBTdWJtaXQgbm93IGlmIHRoZSB1bmRlcmx5aW5nIGZzIGlzIGFib3V0IHRvIHBlcmZvcm0gYQorCQkgKiBtZXRhZGF0YSByZWFkCisJCSAqLworCQlpZiAoZGlvLT5ib3VuZGFyeSkKKwkJCWRpb19iaW9fc3VibWl0KGRpbyk7CisJfQorCisJaWYgKGRpby0+YmlvID09IE5VTEwpIHsKKwkJcmV0ID0gZGlvX25ld19iaW8oZGlvLCBkaW8tPmN1cl9wYWdlX2Jsb2NrKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0KKworCWlmIChkaW9fYmlvX2FkZF9wYWdlKGRpbykgIT0gMCkgeworCQlkaW9fYmlvX3N1Ym1pdChkaW8pOworCQlyZXQgPSBkaW9fbmV3X2JpbyhkaW8sIGRpby0+Y3VyX3BhZ2VfYmxvY2spOworCQlpZiAocmV0ID09IDApIHsKKwkJCXJldCA9IGRpb19iaW9fYWRkX3BhZ2UoZGlvKTsKKwkJCUJVR19PTihyZXQgIT0gMCk7CisJCX0KKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEFuIGF1dG9ub21vdXMgZnVuY3Rpb24gdG8gcHV0IGEgY2h1bmsgb2YgYSBwYWdlIHVuZGVyIGRlZmVycmVkIElPLgorICoKKyAqIFRoZSBjYWxsZXIgZG9lc24ndCBhY3R1YWxseSBrbm93IChvciBjYXJlKSB3aGV0aGVyIHRoaXMgcGllY2Ugb2YgcGFnZSBpcyBpbgorICogYSBCSU8sIG9yIGlzIHVuZGVyIElPIG9yIHdoYXRldmVyLiAgV2UganVzdCB0YWtlIGNhcmUgb2YgYWxsIHBvc3NpYmxlIAorICogc2l0dWF0aW9ucyBoZXJlLiAgVGhlIHNlcGFyYXRpb24gYmV0d2VlbiB0aGUgbG9naWMgb2YgZG9fZGlyZWN0X0lPKCkgYW5kCisgKiB0aGF0IG9mIHN1Ym1pdF9wYWdlX3NlY3Rpb24oKSBpcyBpbXBvcnRhbnQgZm9yIGNsYXJpdHkuICBQbGVhc2UgZG9uJ3QgYnJlYWsuCisgKgorICogVGhlIGNodW5rIG9mIHBhZ2Ugc3RhcnRzIG9uLWRpc2sgYXQgYmxvY2tuci4KKyAqCisgKiBXZSBwZXJmb3JtIGRlZmVycmVkIElPLCBieSByZWNvcmRpbmcgdGhlIGxhc3Qtc3VibWl0dGVkIHBhZ2UgaW5zaWRlIG91cgorICogcHJpdmF0ZSBwYXJ0IG9mIHRoZSBkaW8gc3RydWN0dXJlLiAgSWYgcG9zc2libGUsIHdlIGp1c3QgZXhwYW5kIHRoZSBJTworICogYWNyb3NzIHRoYXQgcGFnZSBoZXJlLgorICoKKyAqIElmIHRoYXQgZG9lc24ndCB3b3JrIG91dCB0aGVuIHdlIHB1dCB0aGUgb2xkIHBhZ2UgaW50byB0aGUgYmlvIGFuZCBhZGQgdGhpcworICogcGFnZSB0byB0aGUgZGlvIGluc3RlYWQuCisgKi8KK3N0YXRpYyBpbnQKK3N1Ym1pdF9wYWdlX3NlY3Rpb24oc3RydWN0IGRpbyAqZGlvLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBsZW4sIHNlY3Rvcl90IGJsb2NrbnIpCit7CisJaW50IHJldCA9IDA7CisKKwkvKgorCSAqIENhbiB3ZSBqdXN0IGdyb3cgdGhlIGN1cnJlbnQgcGFnZSdzIHByZXNlbmNlIGluIHRoZSBkaW8/CisJICovCisJaWYgKAkoZGlvLT5jdXJfcGFnZSA9PSBwYWdlKSAmJgorCQkoZGlvLT5jdXJfcGFnZV9vZmZzZXQgKyBkaW8tPmN1cl9wYWdlX2xlbiA9PSBvZmZzZXQpICYmCisJCShkaW8tPmN1cl9wYWdlX2Jsb2NrICsKKwkJCShkaW8tPmN1cl9wYWdlX2xlbiA+PiBkaW8tPmJsa2JpdHMpID09IGJsb2NrbnIpKSB7CisJCWRpby0+Y3VyX3BhZ2VfbGVuICs9IGxlbjsKKworCQkvKgorCQkgKiBJZiBkaW8tPmJvdW5kYXJ5IHRoZW4gd2Ugd2FudCB0byBzY2hlZHVsZSB0aGUgSU8gbm93IHRvCisJCSAqIGF2b2lkIG1ldGFkYXRhIHNlZWtzLgorCQkgKi8KKwkJaWYgKGRpby0+Ym91bmRhcnkpIHsKKwkJCXJldCA9IGRpb19zZW5kX2N1cl9wYWdlKGRpbyk7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UoZGlvLT5jdXJfcGFnZSk7CisJCQlkaW8tPmN1cl9wYWdlID0gTlVMTDsKKwkJfQorCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIElmIHRoZXJlJ3MgYSBkZWZlcnJlZCBwYWdlIGFscmVhZHkgdGhlcmUgdGhlbiBzZW5kIGl0LgorCSAqLworCWlmIChkaW8tPmN1cl9wYWdlKSB7CisJCXJldCA9IGRpb19zZW5kX2N1cl9wYWdlKGRpbyk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShkaW8tPmN1cl9wYWdlKTsKKwkJZGlvLT5jdXJfcGFnZSA9IE5VTEw7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwl9CisKKwlwYWdlX2NhY2hlX2dldChwYWdlKTsJCS8qIEl0IGlzIGluIGRpbyAqLworCWRpby0+Y3VyX3BhZ2UgPSBwYWdlOworCWRpby0+Y3VyX3BhZ2Vfb2Zmc2V0ID0gb2Zmc2V0OworCWRpby0+Y3VyX3BhZ2VfbGVuID0gbGVuOworCWRpby0+Y3VyX3BhZ2VfYmxvY2sgPSBibG9ja25yOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBDbGVhbiBhbnkgZGlydHkgYnVmZmVycyBpbiB0aGUgYmxvY2tkZXYgbWFwcGluZyB3aGljaCBhbGlhcyBuZXdseS1jcmVhdGVkCisgKiBmaWxlIGJsb2Nrcy4gIE9ubHkgY2FsbGVkIGZvciBTX0lTUkVHIGZpbGVzIC0gYmxvY2tkZXZzIGRvIG5vdCBzZXQKKyAqIGJ1ZmZlcl9uZXcKKyAqLworc3RhdGljIHZvaWQgY2xlYW5fYmxvY2tkZXZfYWxpYXNlcyhzdHJ1Y3QgZGlvICpkaW8pCit7CisJdW5zaWduZWQgaTsKKwl1bnNpZ25lZCBuYmxvY2tzOworCisJbmJsb2NrcyA9IGRpby0+bWFwX2JoLmJfc2l6ZSA+PiBkaW8tPmlub2RlLT5pX2Jsa2JpdHM7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmJsb2NrczsgaSsrKSB7CisJCXVubWFwX3VuZGVybHlpbmdfbWV0YWRhdGEoZGlvLT5tYXBfYmguYl9iZGV2LAorCQkJCQlkaW8tPm1hcF9iaC5iX2Jsb2NrbnIgKyBpKTsKKwl9Cit9CisKKy8qCisgKiBJZiB3ZSBhcmUgbm90IHdyaXRpbmcgdGhlIGVudGlyZSBibG9jayBhbmQgZ2V0X2Jsb2NrKCkgYWxsb2NhdGVkCisgKiB0aGUgYmxvY2sgZm9yIHVzLCB3ZSBuZWVkIHRvIGZpbGwtaW4gdGhlIHVudXNlZCBwb3J0aW9uIG9mIHRoZQorICogYmxvY2sgd2l0aCB6ZXJvcy4gVGhpcyBoYXBwZW5zIG9ubHkgaWYgdXNlci1idWZmZXIsIGZpbGVvZmZzZXQgb3IKKyAqIGlvIGxlbmd0aCBpcyBub3QgZmlsZXN5c3RlbSBibG9jay1zaXplIG11bHRpcGxlLgorICoKKyAqIGBlbmQnIGlzIHplcm8gaWYgd2UncmUgZG9pbmcgdGhlIHN0YXJ0IG9mIHRoZSBJTywgMSBhdCB0aGUgZW5kIG9mIHRoZQorICogSU8uCisgKi8KK3N0YXRpYyB2b2lkIGRpb196ZXJvX2Jsb2NrKHN0cnVjdCBkaW8gKmRpbywgaW50IGVuZCkKK3sKKwl1bnNpZ25lZCBkaW9fYmxvY2tzX3Blcl9mc19ibG9jazsKKwl1bnNpZ25lZCB0aGlzX2NodW5rX2Jsb2NrczsJLyogSW4gZGlvX2Jsb2NrcyAqLworCXVuc2lnbmVkIHRoaXNfY2h1bmtfYnl0ZXM7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlkaW8tPnN0YXJ0X3plcm9fZG9uZSA9IDE7CisJaWYgKCFkaW8tPmJsa2ZhY3RvciB8fCAhYnVmZmVyX25ldygmZGlvLT5tYXBfYmgpKQorCQlyZXR1cm47CisKKwlkaW9fYmxvY2tzX3Blcl9mc19ibG9jayA9IDEgPDwgZGlvLT5ibGtmYWN0b3I7CisJdGhpc19jaHVua19ibG9ja3MgPSBkaW8tPmJsb2NrX2luX2ZpbGUgJiAoZGlvX2Jsb2Nrc19wZXJfZnNfYmxvY2sgLSAxKTsKKworCWlmICghdGhpc19jaHVua19ibG9ja3MpCisJCXJldHVybjsKKworCS8qCisJICogV2UgbmVlZCB0byB6ZXJvIG91dCBwYXJ0IG9mIGFuIGZzIGJsb2NrLiAgSXQgaXMgZWl0aGVyIGF0IHRoZQorCSAqIGJlZ2lubmluZyBvciB0aGUgZW5kIG9mIHRoZSBmcyBibG9jay4KKwkgKi8KKwlpZiAoZW5kKSAKKwkJdGhpc19jaHVua19ibG9ja3MgPSBkaW9fYmxvY2tzX3Blcl9mc19ibG9jayAtIHRoaXNfY2h1bmtfYmxvY2tzOworCisJdGhpc19jaHVua19ieXRlcyA9IHRoaXNfY2h1bmtfYmxvY2tzIDw8IGRpby0+YmxrYml0czsKKworCXBhZ2UgPSBaRVJPX1BBR0UoZGlvLT5jdXJyX3VzZXJfYWRkcmVzcyk7CisJaWYgKHN1Ym1pdF9wYWdlX3NlY3Rpb24oZGlvLCBwYWdlLCAwLCB0aGlzX2NodW5rX2J5dGVzLCAKKwkJCQlkaW8tPm5leHRfYmxvY2tfZm9yX2lvKSkKKwkJcmV0dXJuOworCisJZGlvLT5uZXh0X2Jsb2NrX2Zvcl9pbyArPSB0aGlzX2NodW5rX2Jsb2NrczsKK30KKworLyoKKyAqIFdhbGsgdGhlIHVzZXIgcGFnZXMsIGFuZCB0aGUgZmlsZSwgbWFwcGluZyBibG9ja3MgdG8gZGlzayBhbmQgZ2VuZXJhdGluZworICogYSBzZXF1ZW5jZSBvZiAocGFnZSxvZmZzZXQsbGVuLGJsb2NrKSBtYXBwaW5ncy4gIFRoZXNlIG1hcHBpbmdzIGFyZSBpbmplY3RlZAorICogaW50byBzdWJtaXRfcGFnZV9zZWN0aW9uKCksIHdoaWNoIHRha2VzIGNhcmUgb2YgdGhlIG5leHQgc3RhZ2Ugb2Ygc3VibWlzc2lvbgorICoKKyAqIERpcmVjdCBJTyBhZ2FpbnN0IGEgYmxvY2tkZXYgaXMgZGlmZmVyZW50IGZyb20gYSBmaWxlLiAgQmVjYXVzZSB3ZSBjYW4KKyAqIGhhcHBpbHkgcGVyZm9ybSBwYWdlLXNpemVkIGJ1dCA1MTItYnl0ZSBhbGlnbmVkIElPcy4gIEl0IGlzIGltcG9ydGFudCB0aGF0CisgKiBibG9ja2RldiBJTyBiZSBhYmxlIHRvIGhhdmUgZmluZSBhbGlnbm1lbnQgYW5kIGxhcmdlIHNpemVzLgorICoKKyAqIFNvIHdoYXQgd2UgZG8gaXMgdG8gcGVybWl0IHRoZSAtPmdldF9ibG9ja3MgZnVuY3Rpb24gdG8gcG9wdWxhdGUgYmguYl9zaXplCisgKiB3aXRoIHRoZSBzaXplIG9mIElPIHdoaWNoIGlzIHBlcm1pdHRlZCBhdCB0aGlzIG9mZnNldCBhbmQgdGhpcyBpX2Jsa2JpdHMuCisgKgorICogRm9yIGJlc3QgcmVzdWx0cywgdGhlIGJsb2NrZGV2IHNob3VsZCBiZSBzZXQgdXAgd2l0aCA1MTItYnl0ZSBpX2Jsa2JpdHMgYW5kCisgKiBpdCBzaG91bGQgc2V0IGJfc2l6ZSB0byBQQUdFX1NJWkUgb3IgbW9yZSBpbnNpZGUgZ2V0X2Jsb2NrcygpLiAgVGhpcyBnaXZlcworICogZmluZSBhbGlnbm1lbnQgYnV0IHN0aWxsIGFsbG93cyB0aGlzIGZ1bmN0aW9uIHRvIHdvcmsgaW4gUEFHRV9TSVpFIHVuaXRzLgorICovCitzdGF0aWMgaW50IGRvX2RpcmVjdF9JTyhzdHJ1Y3QgZGlvICpkaW8pCit7CisJY29uc3QgdW5zaWduZWQgYmxrYml0cyA9IGRpby0+YmxrYml0czsKKwljb25zdCB1bnNpZ25lZCBibG9ja3NfcGVyX3BhZ2UgPSBQQUdFX1NJWkUgPj4gYmxrYml0czsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bnNpZ25lZCBibG9ja19pbl9wYWdlOworCXN0cnVjdCBidWZmZXJfaGVhZCAqbWFwX2JoID0gJmRpby0+bWFwX2JoOworCWludCByZXQgPSAwOworCisJLyogVGhlIEkvTyBjYW4gc3RhcnQgYXQgYW55IGJsb2NrIG9mZnNldCB3aXRoaW4gdGhlIGZpcnN0IHBhZ2UgKi8KKwlibG9ja19pbl9wYWdlID0gZGlvLT5maXJzdF9ibG9ja19pbl9wYWdlOworCisJd2hpbGUgKGRpby0+YmxvY2tfaW5fZmlsZSA8IGRpby0+ZmluYWxfYmxvY2tfaW5fcmVxdWVzdCkgeworCQlwYWdlID0gZGlvX2dldF9wYWdlKGRpbyk7CisJCWlmIChJU19FUlIocGFnZSkpIHsKKwkJCXJldCA9IFBUUl9FUlIocGFnZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXdoaWxlIChibG9ja19pbl9wYWdlIDwgYmxvY2tzX3Blcl9wYWdlKSB7CisJCQl1bnNpZ25lZCBvZmZzZXRfaW5fcGFnZSA9IGJsb2NrX2luX3BhZ2UgPDwgYmxrYml0czsKKwkJCXVuc2lnbmVkIHRoaXNfY2h1bmtfYnl0ZXM7CS8qICMgb2YgYnl0ZXMgbWFwcGVkICovCisJCQl1bnNpZ25lZCB0aGlzX2NodW5rX2Jsb2NrczsJLyogIyBvZiBibG9ja3MgKi8KKwkJCXVuc2lnbmVkIHU7CisKKwkJCWlmIChkaW8tPmJsb2Nrc19hdmFpbGFibGUgPT0gMCkgeworCQkJCS8qCisJCQkJICogTmVlZCB0byBnbyBhbmQgbWFwIHNvbWUgbW9yZSBkaXNrCisJCQkJICovCisJCQkJdW5zaWduZWQgbG9uZyBibGttYXNrOworCQkJCXVuc2lnbmVkIGxvbmcgZGlvX3JlbWFpbmRlcjsKKworCQkJCXJldCA9IGdldF9tb3JlX2Jsb2NrcyhkaW8pOworCQkJCWlmIChyZXQpIHsKKwkJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJaWYgKCFidWZmZXJfbWFwcGVkKG1hcF9iaCkpCisJCQkJCWdvdG8gZG9faG9sZXM7CisKKwkJCQlkaW8tPmJsb2Nrc19hdmFpbGFibGUgPQorCQkJCQkJbWFwX2JoLT5iX3NpemUgPj4gZGlvLT5ibGtiaXRzOworCQkJCWRpby0+bmV4dF9ibG9ja19mb3JfaW8gPQorCQkJCQltYXBfYmgtPmJfYmxvY2tuciA8PCBkaW8tPmJsa2ZhY3RvcjsKKwkJCQlpZiAoYnVmZmVyX25ldyhtYXBfYmgpKQorCQkJCQljbGVhbl9ibG9ja2Rldl9hbGlhc2VzKGRpbyk7CisKKwkJCQlpZiAoIWRpby0+YmxrZmFjdG9yKQorCQkJCQlnb3RvIGRvX2hvbGVzOworCisJCQkJYmxrbWFzayA9ICgxIDw8IGRpby0+YmxrZmFjdG9yKSAtIDE7CisJCQkJZGlvX3JlbWFpbmRlciA9IChkaW8tPmJsb2NrX2luX2ZpbGUgJiBibGttYXNrKTsKKworCQkJCS8qCisJCQkJICogSWYgd2UgYXJlIGF0IHRoZSBzdGFydCBvZiBJTyBhbmQgdGhhdCBJTworCQkJCSAqIHN0YXJ0cyBwYXJ0d2F5IGludG8gYSBmcy1ibG9jaywKKwkJCQkgKiBkaW9fcmVtYWluZGVyIHdpbGwgYmUgbm9uLXplcm8uICBJZiB0aGUgSU8KKwkJCQkgKiBpcyBhIHJlYWQgdGhlbiB3ZSBjYW4gc2ltcGx5IGFkdmFuY2UgdGhlIElPCisJCQkJICogY3Vyc29yIHRvIHRoZSBmaXJzdCBibG9jayB3aGljaCBpcyB0byBiZQorCQkJCSAqIHJlYWQuICBCdXQgaWYgdGhlIElPIGlzIGEgd3JpdGUgYW5kIHRoZQorCQkJCSAqIGJsb2NrIHdhcyBuZXdseSBhbGxvY2F0ZWQgd2UgY2Fubm90IGRvIHRoYXQ7CisJCQkJICogdGhlIHN0YXJ0IG9mIHRoZSBmcyBibG9jayBtdXN0IGJlIHplcm9lZCBvdXQKKwkJCQkgKiBvbi1kaXNrCisJCQkJICovCisJCQkJaWYgKCFidWZmZXJfbmV3KG1hcF9iaCkpCisJCQkJCWRpby0+bmV4dF9ibG9ja19mb3JfaW8gKz0gZGlvX3JlbWFpbmRlcjsKKwkJCQlkaW8tPmJsb2Nrc19hdmFpbGFibGUgLT0gZGlvX3JlbWFpbmRlcjsKKwkJCX0KK2RvX2hvbGVzOgorCQkJLyogSGFuZGxlIGhvbGVzICovCisJCQlpZiAoIWJ1ZmZlcl9tYXBwZWQobWFwX2JoKSkgeworCQkJCWNoYXIgKmthZGRyOworCisJCQkJLyogQUtQTTogZWFyZ2gsIC1FTk9UQkxLIGlzIGEgaGFjayAqLworCQkJCWlmIChkaW8tPnJ3ID09IFdSSVRFKSB7CisJCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJCQkJcmV0dXJuIC1FTk9UQkxLOworCQkJCX0KKworCQkJCWlmIChkaW8tPmJsb2NrX2luX2ZpbGUgPj0KKwkJCQkJaV9zaXplX3JlYWQoZGlvLT5pbm9kZSk+PmJsa2JpdHMpIHsKKwkJCQkJLyogV2UgaGl0IGVvZiAqLworCQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkJCQltZW1zZXQoa2FkZHIgKyAoYmxvY2tfaW5fcGFnZSA8PCBibGtiaXRzKSwKKwkJCQkJCTAsIDEgPDwgYmxrYml0cyk7CisJCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCQkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCQkJCWRpby0+YmxvY2tfaW5fZmlsZSsrOworCQkJCWJsb2NrX2luX3BhZ2UrKzsKKwkJCQlnb3RvIG5leHRfYmxvY2s7CisJCQl9CisKKwkJCS8qCisJCQkgKiBJZiB3ZSdyZSBwZXJmb3JtaW5nIElPIHdoaWNoIGhhcyBhbiBhbGlnbm1lbnQgd2hpY2gKKwkJCSAqIGlzIGZpbmVyIHRoYW4gdGhlIHVuZGVybHlpbmcgZnMsIGdvIGNoZWNrIHRvIHNlZSBpZgorCQkJICogd2UgbXVzdCB6ZXJvIG91dCB0aGUgc3RhcnQgb2YgdGhpcyBibG9jay4KKwkJCSAqLworCQkJaWYgKHVubGlrZWx5KGRpby0+YmxrZmFjdG9yICYmICFkaW8tPnN0YXJ0X3plcm9fZG9uZSkpCisJCQkJZGlvX3plcm9fYmxvY2soZGlvLCAwKTsKKworCQkJLyoKKwkJCSAqIFdvcmsgb3V0LCBpbiB0aGlzX2NodW5rX2Jsb2NrcywgaG93IG11Y2ggZGlzayB3ZQorCQkJICogY2FuIGFkZCB0byB0aGlzIHBhZ2UKKwkJCSAqLworCQkJdGhpc19jaHVua19ibG9ja3MgPSBkaW8tPmJsb2Nrc19hdmFpbGFibGU7CisJCQl1ID0gKFBBR0VfU0laRSAtIG9mZnNldF9pbl9wYWdlKSA+PiBibGtiaXRzOworCQkJaWYgKHRoaXNfY2h1bmtfYmxvY2tzID4gdSkKKwkJCQl0aGlzX2NodW5rX2Jsb2NrcyA9IHU7CisJCQl1ID0gZGlvLT5maW5hbF9ibG9ja19pbl9yZXF1ZXN0IC0gZGlvLT5ibG9ja19pbl9maWxlOworCQkJaWYgKHRoaXNfY2h1bmtfYmxvY2tzID4gdSkKKwkJCQl0aGlzX2NodW5rX2Jsb2NrcyA9IHU7CisJCQl0aGlzX2NodW5rX2J5dGVzID0gdGhpc19jaHVua19ibG9ja3MgPDwgYmxrYml0czsKKwkJCUJVR19PTih0aGlzX2NodW5rX2J5dGVzID09IDApOworCisJCQlkaW8tPmJvdW5kYXJ5ID0gYnVmZmVyX2JvdW5kYXJ5KG1hcF9iaCk7CisJCQlyZXQgPSBzdWJtaXRfcGFnZV9zZWN0aW9uKGRpbywgcGFnZSwgb2Zmc2V0X2luX3BhZ2UsCisJCQkJdGhpc19jaHVua19ieXRlcywgZGlvLT5uZXh0X2Jsb2NrX2Zvcl9pbyk7CisJCQlpZiAocmV0KSB7CisJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJZGlvLT5uZXh0X2Jsb2NrX2Zvcl9pbyArPSB0aGlzX2NodW5rX2Jsb2NrczsKKworCQkJZGlvLT5ibG9ja19pbl9maWxlICs9IHRoaXNfY2h1bmtfYmxvY2tzOworCQkJYmxvY2tfaW5fcGFnZSArPSB0aGlzX2NodW5rX2Jsb2NrczsKKwkJCWRpby0+YmxvY2tzX2F2YWlsYWJsZSAtPSB0aGlzX2NodW5rX2Jsb2NrczsKK25leHRfYmxvY2s6CisJCQlpZiAoZGlvLT5ibG9ja19pbl9maWxlID4gZGlvLT5maW5hbF9ibG9ja19pbl9yZXF1ZXN0KQorCQkJCUJVRygpOworCQkJaWYgKGRpby0+YmxvY2tfaW5fZmlsZSA9PSBkaW8tPmZpbmFsX2Jsb2NrX2luX3JlcXVlc3QpCisJCQkJYnJlYWs7CisJCX0KKworCQkvKiBEcm9wIHRoZSByZWYgd2hpY2ggd2FzIHRha2VuIGluIGdldF91c2VyX3BhZ2VzKCkgKi8KKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQlibG9ja19pbl9wYWdlID0gMDsKKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFJlbGVhc2VzIGJvdGggaV9zZW0gYW5kIGlfYWxsb2Nfc2VtCisgKi8KK3N0YXRpYyBzc2l6ZV90CitkaXJlY3RfaW9fd29ya2VyKGludCBydywgc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCAKKwljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgbG9mZl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBucl9zZWdzLCAKKwl1bnNpZ25lZCBibGtiaXRzLCBnZXRfYmxvY2tzX3QgZ2V0X2Jsb2NrcywgZGlvX2lvZG9uZV90IGVuZF9pbywKKwlzdHJ1Y3QgZGlvICpkaW8pCit7CisJdW5zaWduZWQgbG9uZyB1c2VyX2FkZHI7IAorCWludCBzZWc7CisJc3NpemVfdCByZXQgPSAwOworCXNzaXplX3QgcmV0MjsKKwlzaXplX3QgYnl0ZXM7CisKKwlkaW8tPmJpbyA9IE5VTEw7CisJZGlvLT5pbm9kZSA9IGlub2RlOworCWRpby0+cncgPSBydzsKKwlkaW8tPmJsa2JpdHMgPSBibGtiaXRzOworCWRpby0+YmxrZmFjdG9yID0gaW5vZGUtPmlfYmxrYml0cyAtIGJsa2JpdHM7CisJZGlvLT5zdGFydF96ZXJvX2RvbmUgPSAwOworCWRpby0+c2l6ZSA9IDA7CisJZGlvLT5ibG9ja19pbl9maWxlID0gb2Zmc2V0ID4+IGJsa2JpdHM7CisJZGlvLT5ibG9ja3NfYXZhaWxhYmxlID0gMDsKKwlkaW8tPmN1cl9wYWdlID0gTlVMTDsKKworCWRpby0+Ym91bmRhcnkgPSAwOworCWRpby0+cmVhcF9jb3VudGVyID0gMDsKKwlkaW8tPmdldF9ibG9ja3MgPSBnZXRfYmxvY2tzOworCWRpby0+ZW5kX2lvID0gZW5kX2lvOworCWRpby0+bWFwX2JoLmJfcHJpdmF0ZSA9IE5VTEw7CisJZGlvLT5maW5hbF9ibG9ja19pbl9iaW8gPSAtMTsKKwlkaW8tPm5leHRfYmxvY2tfZm9yX2lvID0gLTE7CisKKwlkaW8tPnBhZ2VfZXJyb3JzID0gMDsKKwlkaW8tPnJlc3VsdCA9IDA7CisJZGlvLT5pb2NiID0gaW9jYjsKKworCS8qCisJICogQklPIGNvbXBsZXRpb24gc3RhdGUuCisJICoKKwkgKiAtPmJpb19jb3VudCBzdGFydHMgb3V0IGF0IG9uZSwgYW5kIHdlIGRlY3JlbWVudCBpdCB0byB6ZXJvIGFmdGVyIGFsbAorCSAqIEJJT3MgYXJlIHN1Ym1pdHRlZC4gIFRoaXMgdG8gYXZvaWQgdGhlIHNpdHVhdGlvbiB3aGVyZSBhIHJlYWxseSBmYXN0CisJICogKG9yIHN5bmNocm9ub3VzKSBkZXZpY2UgY291bGQgdGFrZSB0aGUgY291bnQgdG8gemVybyB3aGlsZSB3ZSdyZQorCSAqIHN0aWxsIHN1Ym1pdHRpbmcgQklPcy4KKwkgKi8KKwlkaW8tPmJpb19jb3VudCA9IDE7CisJZGlvLT5iaW9zX2luX2ZsaWdodCA9IDA7CisJc3Bpbl9sb2NrX2luaXQoJmRpby0+YmlvX2xvY2spOworCWRpby0+YmlvX2xpc3QgPSBOVUxMOworCWRpby0+d2FpdGVyID0gTlVMTDsKKworCS8qCisJICogSW4gY2FzZSBvZiBub24tYWxpZ25lZCBidWZmZXJzLCB3ZSBtYXkgbmVlZCAyIG1vcmUKKwkgKiBwYWdlcyBzaW5jZSB3ZSBuZWVkIHRvIHplcm8gb3V0IGZpcnN0IGFuZCBsYXN0IGJsb2NrLgorCSAqLworCWlmICh1bmxpa2VseShkaW8tPmJsa2ZhY3RvcikpCisJCWRpby0+cGFnZXNfaW5faW8gPSAyOworCWVsc2UKKwkJZGlvLT5wYWdlc19pbl9pbyA9IDA7CisKKwlmb3IgKHNlZyA9IDA7IHNlZyA8IG5yX3NlZ3M7IHNlZysrKSB7CisJCXVzZXJfYWRkciA9ICh1bnNpZ25lZCBsb25nKWlvdltzZWddLmlvdl9iYXNlOworCQlkaW8tPnBhZ2VzX2luX2lvICs9CisJCQkoKHVzZXJfYWRkcitpb3Zbc2VnXS5pb3ZfbGVuICtQQUdFX1NJWkUtMSkvUEFHRV9TSVpFCisJCQkJLSB1c2VyX2FkZHIvUEFHRV9TSVpFKTsKKwl9CisKKwlmb3IgKHNlZyA9IDA7IHNlZyA8IG5yX3NlZ3M7IHNlZysrKSB7CisJCXVzZXJfYWRkciA9ICh1bnNpZ25lZCBsb25nKWlvdltzZWddLmlvdl9iYXNlOworCQlkaW8tPnNpemUgKz0gYnl0ZXMgPSBpb3Zbc2VnXS5pb3ZfbGVuOworCisJCS8qIEluZGV4IGludG8gdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIGZpcnN0IGJsb2NrICovCisJCWRpby0+Zmlyc3RfYmxvY2tfaW5fcGFnZSA9ICh1c2VyX2FkZHIgJiB+UEFHRV9NQVNLKSA+PiBibGtiaXRzOworCQlkaW8tPmZpbmFsX2Jsb2NrX2luX3JlcXVlc3QgPSBkaW8tPmJsb2NrX2luX2ZpbGUgKworCQkJCQkJKGJ5dGVzID4+IGJsa2JpdHMpOworCQkvKiBQYWdlIGZldGNoaW5nIHN0YXRlICovCisJCWRpby0+aGVhZCA9IDA7CisJCWRpby0+dGFpbCA9IDA7CisJCWRpby0+Y3Vycl9wYWdlID0gMDsKKworCQlkaW8tPnRvdGFsX3BhZ2VzID0gMDsKKwkJaWYgKHVzZXJfYWRkciAmIChQQUdFX1NJWkUtMSkpIHsKKwkJCWRpby0+dG90YWxfcGFnZXMrKzsKKwkJCWJ5dGVzIC09IFBBR0VfU0laRSAtICh1c2VyX2FkZHIgJiAoUEFHRV9TSVpFIC0gMSkpOworCQl9CisJCWRpby0+dG90YWxfcGFnZXMgKz0gKGJ5dGVzICsgUEFHRV9TSVpFIC0gMSkgLyBQQUdFX1NJWkU7CisJCWRpby0+Y3Vycl91c2VyX2FkZHJlc3MgPSB1c2VyX2FkZHI7CisJCisJCXJldCA9IGRvX2RpcmVjdF9JTyhkaW8pOworCisJCWRpby0+cmVzdWx0ICs9IGlvdltzZWddLmlvdl9sZW4gLQorCQkJKChkaW8tPmZpbmFsX2Jsb2NrX2luX3JlcXVlc3QgLSBkaW8tPmJsb2NrX2luX2ZpbGUpIDw8CisJCQkJCWJsa2JpdHMpOworCisJCWlmIChyZXQpIHsKKwkJCWRpb19jbGVhbnVwKGRpbyk7CisJCQlicmVhazsKKwkJfQorCX0gLyogZW5kIGlvdmVjIGxvb3AgKi8KKworCWlmIChyZXQgPT0gLUVOT1RCTEsgJiYgcncgPT0gV1JJVEUpIHsKKwkJLyoKKwkJICogVGhlIHJlbWFpbmluZyBwYXJ0IG9mIHRoZSByZXF1ZXN0IHdpbGwgYmUKKwkJICogYmUgaGFuZGxlZCBieSBidWZmZXJlZCBJL08gd2hlbiB3ZSByZXR1cm4KKwkJICovCisJCXJldCA9IDA7CisJfQorCS8qCisJICogVGhlcmUgbWF5IGJlIHNvbWUgdW53cml0dGVuIGRpc2sgYXQgdGhlIGVuZCBvZiBhIHBhcnQtd3JpdHRlbgorCSAqIGZzLWJsb2NrLXNpemVkIGJsb2NrLiAgR28gemVybyB0aGF0IG5vdy4KKwkgKi8KKwlkaW9femVyb19ibG9jayhkaW8sIDEpOworCisJaWYgKGRpby0+Y3VyX3BhZ2UpIHsKKwkJcmV0MiA9IGRpb19zZW5kX2N1cl9wYWdlKGRpbyk7CisJCWlmIChyZXQgPT0gMCkKKwkJCXJldCA9IHJldDI7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShkaW8tPmN1cl9wYWdlKTsKKwkJZGlvLT5jdXJfcGFnZSA9IE5VTEw7CisJfQorCWlmIChkaW8tPmJpbykKKwkJZGlvX2Jpb19zdWJtaXQoZGlvKTsKKworCS8qCisJICogSXQgaXMgcG9zc2libGUgdGhhdCwgd2UgcmV0dXJuIHNob3J0IElPIGR1ZSB0byBlbmQgb2YgZmlsZS4KKwkgKiBJbiB0aGF0IGNhc2UsIHdlIG5lZWQgdG8gcmVsZWFzZSBhbGwgdGhlIHBhZ2VzIHdlIGdvdCBob2xkIG9uLgorCSAqLworCWRpb19jbGVhbnVwKGRpbyk7CisKKwkvKgorCSAqIEFsbCBibG9jayBsb29rdXBzIGhhdmUgYmVlbiBwZXJmb3JtZWQuIEZvciBSRUFEIHJlcXVlc3RzCisJICogd2UgY2FuIGxldCBpX3NlbSBnbyBub3cgdGhhdCBpdHMgYWNoaWV2ZWQgaXRzIHB1cnBvc2UKKwkgKiBvZiBwcm90ZWN0aW5nIHVzIGZyb20gbG9va2luZyB1cCB1bmluaXRpYWxpemVkIGJsb2Nrcy4KKwkgKi8KKwlpZiAoKHJ3ID09IFJFQUQpICYmIChkaW8tPmxvY2tfdHlwZSA9PSBESU9fTE9DS0lORykpCisJCXVwKCZkaW8tPmlub2RlLT5pX3NlbSk7CisKKwkvKgorCSAqIE9LLCBhbGwgQklPcyBhcmUgc3VibWl0dGVkLCBzbyB3ZSBjYW4gZGVjcmVtZW50IGJpb19jb3VudCB0byB0cnVseQorCSAqIHJlZmxlY3QgdGhlIG51bWJlciBvZiB0by1iZS1wcm9jZXNzZWQgQklPcy4KKwkgKi8KKwlpZiAoZGlvLT5pc19hc3luYykgeworCQlpbnQgc2hvdWxkX3dhaXQgPSAwOworCisJCWlmIChkaW8tPnJlc3VsdCA8IGRpby0+c2l6ZSAmJiBydyA9PSBXUklURSkgeworCQkJZGlvLT53YWl0ZXIgPSBjdXJyZW50OworCQkJc2hvdWxkX3dhaXQgPSAxOworCQl9CisJCWlmIChyZXQgPT0gMCkKKwkJCXJldCA9IGRpby0+cmVzdWx0OworCQlmaW5pc2hlZF9vbmVfYmlvKGRpbyk7CQkvKiBUaGlzIGNhbiBmcmVlIHRoZSBkaW8gKi8KKwkJYmxrX3J1bl9hZGRyZXNzX3NwYWNlKGlub2RlLT5pX21hcHBpbmcpOworCQlpZiAoc2hvdWxkX3dhaXQpIHsKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQkvKgorCQkJICogV2FpdCBmb3IgYWxyZWFkeSBpc3N1ZWQgSS9PIHRvIGRyYWluIG91dCBhbmQKKwkJCSAqIHJlbGVhc2UgaXRzIHJlZmVyZW5jZXMgdG8gdXNlci1zcGFjZSBwYWdlcworCQkJICogYmVmb3JlIHJldHVybmluZyB0byBmYWxsYmFjayBvbiBidWZmZXJlZCBJL08KKwkJCSAqLworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGlvLT5iaW9fbG9jaywgZmxhZ3MpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJd2hpbGUgKGRpby0+YmlvX2NvdW50KSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGlvLT5iaW9fbG9jaywgZmxhZ3MpOworCQkJCWlvX3NjaGVkdWxlKCk7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRpby0+YmlvX2xvY2ssIGZsYWdzKTsKKwkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkaW8tPmJpb19sb2NrLCBmbGFncyk7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQkJa2ZyZWUoZGlvKTsKKwkJfQorCX0gZWxzZSB7CisJCXNzaXplX3QgdHJhbnNmZXJyZWQgPSAwOworCisJCWZpbmlzaGVkX29uZV9iaW8oZGlvKTsKKwkJcmV0MiA9IGRpb19hd2FpdF9jb21wbGV0aW9uKGRpbyk7CisJCWlmIChyZXQgPT0gMCkKKwkJCXJldCA9IHJldDI7CisJCWlmIChyZXQgPT0gMCkKKwkJCXJldCA9IGRpby0+cGFnZV9lcnJvcnM7CisJCWlmIChkaW8tPnJlc3VsdCkgeworCQkJbG9mZl90IGlfc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKworCQkJdHJhbnNmZXJyZWQgPSBkaW8tPnJlc3VsdDsKKwkJCS8qCisJCQkgKiBBZGp1c3QgdGhlIHJldHVybiB2YWx1ZSBpZiB0aGUgcmVhZCBjcm9zc2VkIGEKKwkJCSAqIG5vbi1ibG9jay1hbGlnbmVkIEVPRi4KKwkJCSAqLworCQkJaWYgKHJ3ID09IFJFQUQgJiYgKG9mZnNldCArIHRyYW5zZmVycmVkID4gaV9zaXplKSkKKwkJCQl0cmFuc2ZlcnJlZCA9IGlfc2l6ZSAtIG9mZnNldDsKKwkJfQorCQlkaW9fY29tcGxldGUoZGlvLCBvZmZzZXQsIHRyYW5zZmVycmVkKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJcmV0ID0gdHJhbnNmZXJyZWQ7CisKKwkJLyogV2UgY291bGQgaGF2ZSBhbHNvIGNvbWUgaGVyZSBvbiBhbiBBSU8gZmlsZSBleHRlbmQgKi8KKwkJaWYgKCFpc19zeW5jX2tpb2NiKGlvY2IpICYmIHJ3ID09IFdSSVRFICYmCisJCSAgICByZXQgPj0gMCAmJiBkaW8tPnJlc3VsdCA9PSBkaW8tPnNpemUpCisJCQkvKgorCQkJICogRm9yIEFJTyB3cml0ZXMgd2hlcmUgd2UgaGF2ZSBjb21wbGV0ZWQgdGhlCisJCQkgKiBpL28sIHdlIGhhdmUgdG8gbWFyayB0aGUgdGhlIGFpbyBjb21wbGV0ZS4KKwkJCSAqLworCQkJYWlvX2NvbXBsZXRlKGlvY2IsIHJldCwgMCk7CisJCWtmcmVlKGRpbyk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBUaGlzIGlzIGEgbGlicmFyeSBmdW5jdGlvbiBmb3IgdXNlIGJ5IGZpbGVzeXN0ZW0gZHJpdmVycy4KKyAqIFRoZSBsb2NraW5nIHJ1bGVzIGFyZSBnb3Zlcm5lZCBieSB0aGUgZGlvX2xvY2tfdHlwZSBwYXJhbWV0ZXIuCisgKgorICogRElPX05PX0xPQ0tJTkcgKG5vIGxvY2tpbmcsIGZvciByYXcgYmxvY2sgZGV2aWNlIGFjY2VzcykKKyAqIEZvciB3cml0ZXMsIGlfc2VtIGlzIG5vdCBoZWxkIG9uIGVudHJ5OyBpdCBpcyBuZXZlciB0YWtlbi4KKyAqCisgKiBESU9fTE9DS0lORyAoc2ltcGxlIGxvY2tpbmcgZm9yIHJlZ3VsYXIgZmlsZXMpCisgKiBGb3Igd3JpdGVzIHdlIGFyZSBjYWxsZWQgdW5kZXIgaV9zZW0gYW5kIHJldHVybiB3aXRoIGlfc2VtIGhlbGQsIGV2ZW4gdGhvdWdoCisgKiBpdCBpcyBpbnRlcm5hbGx5IGRyb3BwZWQuCisgKiBGb3IgcmVhZHMsIGlfc2VtIGlzIG5vdCBoZWxkIG9uIGVudHJ5LCBidXQgaXQgaXMgdGFrZW4gYW5kIGRyb3BwZWQgYmVmb3JlCisgKiByZXR1cm5pbmcuCisgKgorICogRElPX09XTl9MT0NLSU5HIChmaWxlc3lzdGVtIHByb3ZpZGVzIHN5bmNocm9uaXNhdGlvbiBhbmQgaGFuZGxpbmcgb2YKKyAqCXVuaW5pdGlhbGlzZWQgZGF0YSwgYWxsb3dpbmcgcGFyYWxsZWwgZGlyZWN0IHJlYWRlcnMgYW5kIHdyaXRlcnMpCisgKiBGb3Igd3JpdGVzIHdlIGFyZSBjYWxsZWQgd2l0aG91dCBpX3NlbSwgcmV0dXJuIHdpdGhvdXQgaXQsIG5ldmVyIHRvdWNoIGl0LgorICogRm9yIHJlYWRzLCBpX3NlbSBpcyBoZWxkIG9uIGVudHJ5IGFuZCB3aWxsIGJlIHJlbGVhc2VkIGJlZm9yZSByZXR1cm5pbmcuCisgKgorICogQWRkaXRpb25hbCBpX2FsbG9jX3NlbSBsb2NraW5nIHJlcXVpcmVtZW50cyBkZXNjcmliZWQgaW5saW5lIGJlbG93LgorICovCitzc2l6ZV90CitfX2Jsb2NrZGV2X2RpcmVjdF9JTyhpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlub2RlICppbm9kZSwKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgbG9mZl90IG9mZnNldCwgCisJdW5zaWduZWQgbG9uZyBucl9zZWdzLCBnZXRfYmxvY2tzX3QgZ2V0X2Jsb2NrcywgZGlvX2lvZG9uZV90IGVuZF9pbywKKwlpbnQgZGlvX2xvY2tfdHlwZSkKK3sKKwlpbnQgc2VnOworCXNpemVfdCBzaXplOworCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwl1bnNpZ25lZCBibGtiaXRzID0gaW5vZGUtPmlfYmxrYml0czsKKwl1bnNpZ25lZCBiZGV2X2Jsa2JpdHMgPSAwOworCXVuc2lnbmVkIGJsb2Nrc2l6ZV9tYXNrID0gKDEgPDwgYmxrYml0cykgLSAxOworCXNzaXplX3QgcmV0dmFsID0gLUVJTlZBTDsKKwlsb2ZmX3QgZW5kID0gb2Zmc2V0OworCXN0cnVjdCBkaW8gKmRpbzsKKwlpbnQgcmVhZGVyX3dpdGhfaXNlbSA9IChydyA9PSBSRUFEICYmIGRpb19sb2NrX3R5cGUgPT0gRElPX09XTl9MT0NLSU5HKTsKKworCWlmIChydyAmIFdSSVRFKQorCQljdXJyZW50LT5mbGFncyB8PSBQRl9TWU5DV1JJVEU7CisKKwlpZiAoYmRldikKKwkJYmRldl9ibGtiaXRzID0gYmxrc2l6ZV9iaXRzKGJkZXZfaGFyZHNlY3Rfc2l6ZShiZGV2KSk7CisKKwlpZiAob2Zmc2V0ICYgYmxvY2tzaXplX21hc2spIHsKKwkJaWYgKGJkZXYpCisJCQkgYmxrYml0cyA9IGJkZXZfYmxrYml0czsKKwkJYmxvY2tzaXplX21hc2sgPSAoMSA8PCBibGtiaXRzKSAtIDE7CisJCWlmIChvZmZzZXQgJiBibG9ja3NpemVfbWFzaykKKwkJCWdvdG8gb3V0OworCX0KKworCS8qIENoZWNrIHRoZSBtZW1vcnkgYWxpZ25tZW50LiAgQmxvY2tzIGNhbm5vdCBzdHJhZGRsZSBwYWdlcyAqLworCWZvciAoc2VnID0gMDsgc2VnIDwgbnJfc2Vnczsgc2VnKyspIHsKKwkJYWRkciA9ICh1bnNpZ25lZCBsb25nKWlvdltzZWddLmlvdl9iYXNlOworCQlzaXplID0gaW92W3NlZ10uaW92X2xlbjsKKwkJZW5kICs9IHNpemU7CisJCWlmICgoYWRkciAmIGJsb2Nrc2l6ZV9tYXNrKSB8fCAoc2l6ZSAmIGJsb2Nrc2l6ZV9tYXNrKSkgIHsKKwkJCWlmIChiZGV2KQorCQkJCSBibGtiaXRzID0gYmRldl9ibGtiaXRzOworCQkJYmxvY2tzaXplX21hc2sgPSAoMSA8PCBibGtiaXRzKSAtIDE7CisJCQlpZiAoKGFkZHIgJiBibG9ja3NpemVfbWFzaykgfHwgKHNpemUgJiBibG9ja3NpemVfbWFzaykpICAKKwkJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWRpbyA9IGttYWxsb2Moc2l6ZW9mKCpkaW8pLCBHRlBfS0VSTkVMKTsKKwlyZXR2YWwgPSAtRU5PTUVNOworCWlmICghZGlvKQorCQlnb3RvIG91dDsKKworCS8qCisJICogRm9yIGJsb2NrIGRldmljZSBhY2Nlc3MgRElPX05PX0xPQ0tJTkcgaXMgdXNlZCwKKwkgKgluZWl0aGVyIHJlYWRlcnMgbm9yIHdyaXRlcnMgZG8gYW55IGxvY2tpbmcgYXQgYWxsCisJICogRm9yIHJlZ3VsYXIgZmlsZXMgdXNpbmcgRElPX0xPQ0tJTkcsCisJICoJcmVhZGVycyBuZWVkIHRvIGdyYWIgaV9zZW0gYW5kIGlfYWxsb2Nfc2VtCisJICoJd3JpdGVycyBuZWVkIHRvIGdyYWIgaV9hbGxvY19zZW0gb25seSAoaV9zZW0gaXMgYWxyZWFkeSBoZWxkKQorCSAqIEZvciByZWd1bGFyIGZpbGVzIHVzaW5nIERJT19PV05fTE9DS0lORywKKwkgKgluZWl0aGVyIHJlYWRlcnMgbm9yIHdyaXRlcnMgdGFrZSBhbnkgbG9ja3MgaGVyZQorCSAqCShpX3NlbSBpcyBhbHJlYWR5IGhlbGQgYW5kIHJlbGVhc2UgZm9yIHdyaXRlcnMgaGVyZSkKKwkgKi8KKwlkaW8tPmxvY2tfdHlwZSA9IGRpb19sb2NrX3R5cGU7CisJaWYgKGRpb19sb2NrX3R5cGUgIT0gRElPX05PX0xPQ0tJTkcpIHsKKwkJLyogd2F0Y2ggb3V0IGZvciBhIDAgbGVuIGlvIGZyb20gYSB0cmlja3N5IGZzICovCisJCWlmIChydyA9PSBSRUFEICYmIGVuZCA+IG9mZnNldCkgeworCQkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CisKKwkJCW1hcHBpbmcgPSBpb2NiLT5raV9maWxwLT5mX21hcHBpbmc7CisJCQlpZiAoZGlvX2xvY2tfdHlwZSAhPSBESU9fT1dOX0xPQ0tJTkcpIHsKKwkJCQlkb3duKCZpbm9kZS0+aV9zZW0pOworCQkJCXJlYWRlcl93aXRoX2lzZW0gPSAxOworCQkJfQorCisJCQlyZXR2YWwgPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0X3JhbmdlKG1hcHBpbmcsIG9mZnNldCwKKwkJCQkJCQkgICAgICBlbmQgLSAxKTsKKwkJCWlmIChyZXR2YWwpIHsKKwkJCQlrZnJlZShkaW8pOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlpZiAoZGlvX2xvY2tfdHlwZSA9PSBESU9fT1dOX0xPQ0tJTkcpIHsKKwkJCQl1cCgmaW5vZGUtPmlfc2VtKTsKKwkJCQlyZWFkZXJfd2l0aF9pc2VtID0gMDsKKwkJCX0KKwkJfQorCisJCWlmIChkaW9fbG9ja190eXBlID09IERJT19MT0NLSU5HKQorCQkJZG93bl9yZWFkKCZpbm9kZS0+aV9hbGxvY19zZW0pOworCX0KKworCS8qCisJICogRm9yIGZpbGUgZXh0ZW5kaW5nIHdyaXRlcyB1cGRhdGluZyBpX3NpemUgYmVmb3JlIGRhdGEKKwkgKiB3cml0ZW91dHMgY29tcGxldGUgY2FuIGV4cG9zZSB1bmluaXRpYWxpemVkIGJsb2Nrcy4gU28KKwkgKiBldmVuIGZvciBBSU8sIHdlIG5lZWQgdG8gd2FpdCBmb3IgaS9vIHRvIGNvbXBsZXRlIGJlZm9yZQorCSAqIHJldHVybmluZyBpbiB0aGlzIGNhc2UuCisJICovCisJZGlvLT5pc19hc3luYyA9ICFpc19zeW5jX2tpb2NiKGlvY2IpICYmICEoKHJ3ID09IFdSSVRFKSAmJgorCQkoZW5kID4gaV9zaXplX3JlYWQoaW5vZGUpKSk7CisKKwlyZXR2YWwgPSBkaXJlY3RfaW9fd29ya2VyKHJ3LCBpb2NiLCBpbm9kZSwgaW92LCBvZmZzZXQsCisJCQkJbnJfc2VncywgYmxrYml0cywgZ2V0X2Jsb2NrcywgZW5kX2lvLCBkaW8pOworCisJaWYgKHJ3ID09IFJFQUQgJiYgZGlvX2xvY2tfdHlwZSA9PSBESU9fTE9DS0lORykKKwkJcmVhZGVyX3dpdGhfaXNlbSA9IDA7CisKK291dDoKKwlpZiAocmVhZGVyX3dpdGhfaXNlbSkKKwkJdXAoJmlub2RlLT5pX3NlbSk7CisJaWYgKHJ3ICYgV1JJVEUpCisJCWN1cnJlbnQtPmZsYWdzICY9IH5QRl9TWU5DV1JJVEU7CisJcmV0dXJuIHJldHZhbDsKK30KK0VYUE9SVF9TWU1CT0woX19ibG9ja2Rldl9kaXJlY3RfSU8pOwpkaWZmIC0tZ2l0IGEvZnMvZG5vdGlmeS5jIGIvZnMvZG5vdGlmeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYjU0MGQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9kbm90aWZ5LmMKQEAgLTAsMCArMSwxODMgQEAKKy8qCisgKiBEaXJlY3Rvcnkgbm90aWZpY2F0aW9ucyBmb3IgTGludXguCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwLDIwMDEsMjAwMiBTdGVwaGVuIFJvdGh3ZWxsCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Rub3RpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKK2ludCBkaXJfbm90aWZ5X2VuYWJsZSA9IDE7CisKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKmRuX2NhY2hlOworCitzdGF0aWMgdm9pZCByZWRvX2lub2RlX21hc2soc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwl1bnNpZ25lZCBsb25nIG5ld19tYXNrOworCXN0cnVjdCBkbm90aWZ5X3N0cnVjdCAqZG47CisKKwluZXdfbWFzayA9IDA7CisJZm9yIChkbiA9IGlub2RlLT5pX2Rub3RpZnk7IGRuICE9IE5VTEw7IGRuID0gZG4tPmRuX25leHQpCisJCW5ld19tYXNrIHw9IGRuLT5kbl9tYXNrICYgfkROX01VTFRJU0hPVDsKKwlpbm9kZS0+aV9kbm90aWZ5X21hc2sgPSBuZXdfbWFzazsKK30KKwordm9pZCBkbm90aWZ5X2ZsdXNoKHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IGlkKQoreworCXN0cnVjdCBkbm90aWZ5X3N0cnVjdCAqZG47CisJc3RydWN0IGRub3RpZnlfc3RydWN0ICoqcHJldjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybjsKKwlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCXByZXYgPSAmaW5vZGUtPmlfZG5vdGlmeTsKKwl3aGlsZSAoKGRuID0gKnByZXYpICE9IE5VTEwpIHsKKwkJaWYgKChkbi0+ZG5fb3duZXIgPT0gaWQpICYmIChkbi0+ZG5fZmlscCA9PSBmaWxwKSkgeworCQkJKnByZXYgPSBkbi0+ZG5fbmV4dDsKKwkJCXJlZG9faW5vZGVfbWFzayhpbm9kZSk7CisJCQlrbWVtX2NhY2hlX2ZyZWUoZG5fY2FjaGUsIGRuKTsKKwkJCWJyZWFrOworCQl9CisJCXByZXYgPSAmZG4tPmRuX25leHQ7CisJfQorCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKK30KKworaW50IGZjbnRsX2Rpcm5vdGlmeShpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZG5vdGlmeV9zdHJ1Y3QgKmRuOworCXN0cnVjdCBkbm90aWZ5X3N0cnVjdCAqb2RuOworCXN0cnVjdCBkbm90aWZ5X3N0cnVjdCAqKnByZXY7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlmbF9vd25lcl90IGlkID0gY3VycmVudC0+ZmlsZXM7CisJaW50IGVycm9yID0gMDsKKworCWlmICgoYXJnICYgfkROX01VTFRJU0hPVCkgPT0gMCkgeworCQlkbm90aWZ5X2ZsdXNoKGZpbHAsIGlkKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghZGlyX25vdGlmeV9lbmFibGUpCisJCXJldHVybiAtRUlOVkFMOworCWlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQlyZXR1cm4gLUVOT1RESVI7CisJZG4gPSBrbWVtX2NhY2hlX2FsbG9jKGRuX2NhY2hlLCBTTEFCX0tFUk5FTCk7CisJaWYgKGRuID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJcHJldiA9ICZpbm9kZS0+aV9kbm90aWZ5OworCXdoaWxlICgob2RuID0gKnByZXYpICE9IE5VTEwpIHsKKwkJaWYgKChvZG4tPmRuX293bmVyID09IGlkKSAmJiAob2RuLT5kbl9maWxwID09IGZpbHApKSB7CisJCQlvZG4tPmRuX2ZkID0gZmQ7CisJCQlvZG4tPmRuX21hc2sgfD0gYXJnOworCQkJaW5vZGUtPmlfZG5vdGlmeV9tYXNrIHw9IGFyZyAmIH5ETl9NVUxUSVNIT1Q7CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisJCXByZXYgPSAmb2RuLT5kbl9uZXh0OworCX0KKworCWVycm9yID0gZl9zZXRvd24oZmlscCwgY3VycmVudC0+cGlkLCAwKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlkbi0+ZG5fbWFzayA9IGFyZzsKKwlkbi0+ZG5fZmQgPSBmZDsKKwlkbi0+ZG5fZmlscCA9IGZpbHA7CisJZG4tPmRuX293bmVyID0gaWQ7CisJaW5vZGUtPmlfZG5vdGlmeV9tYXNrIHw9IGFyZyAmIH5ETl9NVUxUSVNIT1Q7CisJZG4tPmRuX25leHQgPSBpbm9kZS0+aV9kbm90aWZ5OworCWlub2RlLT5pX2Rub3RpZnkgPSBkbjsKKwlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisKKwlpZiAoZmlscC0+Zl9vcCAmJiBmaWxwLT5mX29wLT5kaXJfbm90aWZ5KQorCQlyZXR1cm4gZmlscC0+Zl9vcC0+ZGlyX25vdGlmeShmaWxwLCBhcmcpOworCXJldHVybiAwOworCitvdXRfZnJlZToKKwlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJa21lbV9jYWNoZV9mcmVlKGRuX2NhY2hlLCBkbik7CisJcmV0dXJuIGVycm9yOworfQorCit2b2lkIF9faW5vZGVfZGlyX25vdGlmeShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIGV2ZW50KQoreworCXN0cnVjdCBkbm90aWZ5X3N0cnVjdCAqCWRuOworCXN0cnVjdCBkbm90aWZ5X3N0cnVjdCAqKnByZXY7CisJc3RydWN0IGZvd25fc3RydWN0ICoJZm93bjsKKwlpbnQJCQljaGFuZ2VkID0gMDsKKworCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJcHJldiA9ICZpbm9kZS0+aV9kbm90aWZ5OworCXdoaWxlICgoZG4gPSAqcHJldikgIT0gTlVMTCkgeworCQlpZiAoKGRuLT5kbl9tYXNrICYgZXZlbnQpID09IDApIHsKKwkJCXByZXYgPSAmZG4tPmRuX25leHQ7CisJCQljb250aW51ZTsKKwkJfQorCQlmb3duID0gJmRuLT5kbl9maWxwLT5mX293bmVyOworCQlzZW5kX3NpZ2lvKGZvd24sIGRuLT5kbl9mZCwgUE9MTF9NU0cpOworCQlpZiAoZG4tPmRuX21hc2sgJiBETl9NVUxUSVNIT1QpCisJCQlwcmV2ID0gJmRuLT5kbl9uZXh0OworCQllbHNlIHsKKwkJCSpwcmV2ID0gZG4tPmRuX25leHQ7CisJCQljaGFuZ2VkID0gMTsKKwkJCWttZW1fY2FjaGVfZnJlZShkbl9jYWNoZSwgZG4pOworCQl9CisJfQorCWlmIChjaGFuZ2VkKQorCQlyZWRvX2lub2RlX21hc2soaW5vZGUpOworCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKK30KKworRVhQT1JUX1NZTUJPTChfX2lub2RlX2Rpcl9ub3RpZnkpOworCisvKgorICogVGhpcyBpcyBob3BlbGVzc2x5IHdyb25nLCBidXQgdW5maXhhYmxlIHdpdGhvdXQgQVBJIGNoYW5nZXMuICBBdAorICogbGVhc3QgaXQgZG9lc24ndCBvb3BzIHRoZSBrZXJuZWwuLi4KKyAqCisgKiBUbyBzYWZlbHkgYWNjZXNzIC0+ZF9wYXJlbnQgd2UgbmVlZCB0byBrZWVwIGRfbW92ZSBhd2F5IGZyb20gaXQuICBVc2UgdGhlCisgKiBkZW50cnkncyBkX2xvY2sgZm9yIHRoaXMuCisgKi8KK3ZvaWQgZG5vdGlmeV9wYXJlbnQoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCB1bnNpZ25lZCBsb25nIGV2ZW50KQoreworCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKKworCWlmICghZGlyX25vdGlmeV9lbmFibGUpCisJCXJldHVybjsKKworCXNwaW5fbG9jaygmZGVudHJ5LT5kX2xvY2spOworCXBhcmVudCA9IGRlbnRyeS0+ZF9wYXJlbnQ7CisJaWYgKHBhcmVudC0+ZF9pbm9kZS0+aV9kbm90aWZ5X21hc2sgJiBldmVudCkgeworCQlkZ2V0KHBhcmVudCk7CisJCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CisJCV9faW5vZGVfZGlyX25vdGlmeShwYXJlbnQtPmRfaW5vZGUsIGV2ZW50KTsKKwkJZHB1dChwYXJlbnQpOworCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoZG5vdGlmeV9wYXJlbnQpOworCitzdGF0aWMgaW50IF9faW5pdCBkbm90aWZ5X2luaXQodm9pZCkKK3sKKwlkbl9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJkbm90aWZ5X2NhY2hlIiwKKwkJc2l6ZW9mKHN0cnVjdCBkbm90aWZ5X3N0cnVjdCksIDAsIFNMQUJfUEFOSUMsIE5VTEwsIE5VTEwpOworCXJldHVybiAwOworfQorCittb2R1bGVfaW5pdChkbm90aWZ5X2luaXQpCmRpZmYgLS1naXQgYS9mcy9kcXVvdC5jIGIvZnMvZHF1b3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTA0OGUwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZHF1b3QuYwpAQCAtMCwwICsxLDE4NTAgQEAKKy8qCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGlza3F1b3RhIHN5c3RlbSBmb3IgdGhlIExJTlVYIG9wZXJhdGluZyBzeXN0ZW0uIFFVT1RBCisgKiBpcyBpbXBsZW1lbnRlZCB1c2luZyB0aGUgQlNEIHN5c3RlbSBjYWxsIGludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YKKyAqIGNvbW11bmljYXRpb24gd2l0aCB0aGUgdXNlciBsZXZlbC4gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBnZW5lcmljIHJvdXRpbmVzCisgKiBjYWxsZWQgYnkgdGhlIGRpZmZlcmVudCBmaWxlc3lzdGVtcyBvbiBhbGxvY2F0aW9uIG9mIGFuIGlub2RlIG9yIGJsb2NrLgorICogVGhlc2Ugcm91dGluZXMgdGFrZSBjYXJlIG9mIHRoZSBhZG1pbmlzdHJhdGlvbiBuZWVkZWQgdG8gaGF2ZSBhIGNvbnNpc3RlbnQKKyAqIGRpc2txdW90YSB0cmFja2luZyBzeXN0ZW0uIFRoZSBpZGVhcyBvZiBib3RoIHVzZXIgYW5kIGdyb3VwIHF1b3RhcyBhcmUgYmFzZWQKKyAqIG9uIHRoZSBNZWxib3VybmUgcXVvdGEgc3lzdGVtIGFzIHVzZWQgb24gQlNEIGRlcml2ZWQgc3lzdGVtcy4gVGhlIGludGVybmFsCisgKiBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBvbmUgb2YgdGhlIHNldmVyYWwgdmFyaWFudHMgb2YgdGhlIExJTlVYCisgKiBpbm9kZS1zdWJzeXN0ZW0gd2l0aCBhZGRlZCBjb21wbGV4aXR5IG9mIHRoZSBkaXNrcXVvdGEgc3lzdGVtLgorICogCisgKiBWZXJzaW9uOiAkSWQ6IGRxdW90LmMsdiA2LjMgMTk5Ni8xMS8xNyAxODozNTozNCBtdncgRXhwIG12dyAkCisgKiAKKyAqIEF1dGhvcjoJTWFyY28gdmFuIFdpZXJpbmdlbiA8bXZ3QHBsYW5ldHMuZWxtLm5ldD4KKyAqCisgKiBGaXhlczogICBEbWl0cnkgR29yb2RjaGFuaW4gPHBnbWRzZ0BpYmkuY29tPiwgMTEgRmViIDk2CisgKgorICoJCVJldmlzZWQgbGlzdCBtYW5hZ2VtZW50IHRvIGF2b2lkIHJhY2VzCisgKgkJLS0gQmlsbCBIYXdlcywgPHdoYXdlc0BzdGFyLm5ldD4sIDkvOTgKKyAqCisgKgkJRml4ZWQgcmFjZXMgaW4gZHF1b3RfdHJhbnNmZXIoKSwgZHFnZXQoKSBhbmQgZHF1b3RfYWxsb2NfLi4uKCkuCisgKgkJQXMgdGhlIGNvbnNlcXVlbmNlIHRoZSBsb2NraW5nIHdhcyBtb3ZlZCBmcm9tIGRxdW90X2RlY3JfLi4uKCksCisgKgkJZHF1b3RfaW5jcl8uLi4oKSB0byBjYWxsaW5nIGZ1bmN0aW9ucy4KKyAqCQlpbnZhbGlkYXRlX2RxdW90cygpIG5vdyB3cml0ZXMgbW9kaWZpZWQgZHF1b3RzLgorICoJCVNlcmlhbGl6ZWQgcXVvdGFfb2ZmKCkgYW5kIHF1b3RhX29uKCkgZm9yIG1vdW50IHBvaW50LgorICoJCUZpeGVkIGEgZmV3IGJ1Z3MgaW4gZ3Jvd19kcXVvdHMoKS4KKyAqCQlGaXhlZCBkZWFkbG9jayBpbiB3cml0ZV9kcXVvdCgpIC0gd2Ugbm8gbG9uZ2VyIGFjY291bnQgcXVvdGFzIG9uCisgKgkJcXVvdGEgZmlsZXMKKyAqCQlyZW1vdmVfZHF1b3RfcmVmKCkgbW92ZWQgdG8gaW5vZGUuYyAtIGl0IG5vdyB0cmF2ZXJzZXMgdGhyb3VnaCBpbm9kZXMKKyAqCQlhZGRfZHF1b3RfcmVmKCkgcmVzdGFydHMgYWZ0ZXIgYmxvY2tpbmcKKyAqCQlBZGRlZCBjaGVjayBmb3IgYm9ndXMgdWlkIGFuZCBmaXhlZCBjaGVjayBmb3IgZ3JvdXAgaW4gcXVvdGFjdGwuCisgKgkJSmFuIEthcmEsIDxqYWNrQHN1c2UuY3o+LCBzcG9uc29yZWQgYnkgU3VTRSBDUiwgMTAtMTEvOTkKKyAqCisgKgkJVXNlZCBzdHJ1Y3QgbGlzdF9oZWFkIGluc3RlYWQgb2Ygb3duIGxpc3Qgc3RydWN0CisgKgkJSW52YWxpZGF0aW9uIG9mIHJlZmVyZW5jZWQgZHF1b3RzIGlzIG5vIGxvbmdlciBwb3NzaWJsZQorICoJCUltcHJvdmVkIGZyZWVfZHF1b3RzIGxpc3QgbWFuYWdlbWVudAorICoJCVF1b3RhIGFuZCBpX2Jsb2NrcyBhcmUgbm93IHVwZGF0ZWQgaW4gb25lIHBsYWNlIHRvIGF2b2lkIHJhY2VzCisgKgkJV2FybmluZ3MgYXJlIG5vdyBkZWxheWVkIHNvIHdlIHdvbid0IGJsb2NrIGluIGNyaXRpY2FsIHNlY3Rpb24KKyAqCQlXcml0ZSB1cGRhdGVkIG5vdCB0byByZXF1aXJlIGRxdW90IGxvY2sKKyAqCQlKYW4gS2FyYSwgPGphY2tAc3VzZS5jej4sIDkvMjAwMAorICoKKyAqCQlBZGRlZCBkeW5hbWljIHF1b3RhIHN0cnVjdHVyZSBhbGxvY2F0aW9uCisgKgkJSmFuIEthcmEgPGphY2tAc3VzZS5jej4gMTIvMjAwMAorICoKKyAqCQlSZXdyaXR0ZW4gcXVvdGEgaW50ZXJmYWNlLiBJbXBsZW1lbnRlZCBuZXcgcXVvdGEgZm9ybWF0IGFuZAorICoJCWZvcm1hdHMgcmVnaXN0ZXJpbmcuCisgKgkJSmFuIEthcmEsIDxqYWNrQHN1c2UuY3o+LCAyMDAxLDIwMDIKKyAqCisgKgkJTmV3IFNNUCBsb2NraW5nLgorICoJCUphbiBLYXJhLCA8amFja0BzdXNlLmN6PiwgMTAvMjAwMgorICoKKyAqCQlBZGRlZCBqb3VybmFsbGVkIHF1b3RhIHN1cHBvcnQsIGZpeCBsb2NrIGludmVyc2lvbiBwcm9ibGVtcworICoJCUphbiBLYXJhLCA8amFja0BzdXNlLmN6PiwgMjAwMywyMDA0CisgKgorICogKEMpIENvcHlyaWdodCAxOTk0IC0gMTk5NyBNYXJjbyB2YW4gV2llcmluZ2VuIAorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNkZWZpbmUgX19EUVVPVF9QQVJBTk9JQQorCisvKgorICogVGhlcmUgYXJlIHR3byBxdW90YSBTTVAgbG9ja3MuIGRxX2xpc3RfbG9jayBwcm90ZWN0cyBhbGwgbGlzdHMgd2l0aCBxdW90YXMKKyAqIGFuZCBxdW90YSBmb3JtYXRzIGFuZCBhbHNvIGRxc3RhdHMgc3RydWN0dXJlIGNvbnRhaW5pbmcgc3RhdGlzdGljcyBhYm91dCB0aGUKKyAqIGxpc3RzLiBkcV9kYXRhX2xvY2sgcHJvdGVjdHMgZGF0YSBmcm9tIGRxX2RxYiBhbmQgYWxzbyBtZW1fZHFpbmZvIHN0cnVjdHVyZXMKKyAqIGFuZCBhbHNvIGd1YXJkcyBjb25zaXN0ZW5jeSBvZiBkcXVvdC0+ZHFfZHFiIHdpdGggaW5vZGUtPmlfYmxvY2tzLCBpX2J5dGVzLgorICogaV9ibG9ja3MgYW5kIGlfYnl0ZXMgdXBkYXRlcyBpdHNlbGYgYXJlIGd1YXJkZWQgYnkgaV9sb2NrIGFjcXVpcmVkIGRpcmVjdGx5CisgKiBpbiBpbm9kZV9hZGRfYnl0ZXMoKSBhbmQgaW5vZGVfc3ViX2J5dGVzKCkuCisgKgorICogVGhlIHNwaW5sb2NrIG9yZGVyaW5nIGlzIGhlbmNlOiBkcV9kYXRhX2xvY2sgPiBkcV9saXN0X2xvY2sgPiBpX2xvY2sKKyAqCisgKiBOb3RlIHRoYXQgc29tZSB0aGluZ3MgKGVnLiBzYiBwb2ludGVyLCB0eXBlLCBpZCkgZG9lc24ndCBjaGFuZ2UgZHVyaW5nCisgKiB0aGUgbGlmZSBvZiB0aGUgZHF1b3Qgc3RydWN0dXJlIGFuZCBzbyBuZWVkbid0IHRvIGJlIHByb3RlY3RlZCBieSBhIGxvY2sKKyAqCisgKiBBbnkgb3BlcmF0aW9uIHdvcmtpbmcgb24gZHF1b3RzIHZpYSBpbm9kZSBwb2ludGVycyBtdXN0IGhvbGQgZHFwdHJfc2VtLiAgSWYKKyAqIG9wZXJhdGlvbiBpcyBqdXN0IHJlYWRpbmcgcG9pbnRlcnMgZnJvbSBpbm9kZSAob3Igbm90IHVzaW5nIHRoZW0gYXQgYWxsKSB0aGUKKyAqIHJlYWQgbG9jayBpcyBlbm91Z2guIElmIHBvaW50ZXJzIGFyZSBhbHRlcmVkIGZ1bmN0aW9uIG11c3QgaG9sZCB3cml0ZSBsb2NrCisgKiAodGhlc2UgbG9ja2luZyBydWxlcyBhbHNvIGFwcGx5IGZvciBTX05PUVVPVEEgZmxhZyBpbiB0aGUgaW5vZGUgLSBub3RlIHRoYXQKKyAqIGZvciBhbHRlcmluZyB0aGUgZmxhZyBpX3NlbSBpcyBhbHNvIG5lZWRlZCkuICBJZiBvcGVyYXRpb24gaXMgaG9sZGluZworICogcmVmZXJlbmNlIHRvIGRxdW90IGluIG90aGVyIHdheSAoZS5nLiBxdW90YWN0bCBvcHMpIGl0IG11c3QgYmUgZ3VhcmRlZCBieQorICogZHFvbm9mZl9zZW0uCisgKiBUaGlzIGxvY2tpbmcgYXNzdXJlcyB0aGF0OgorICogICBhKSB1cGRhdGUvYWNjZXNzIHRvIGRxdW90IHBvaW50ZXJzIGluIGlub2RlIGlzIHNlcmlhbGl6ZWQKKyAqICAgYikgZXZlcnlvbmUgaXMgZ3VhcmRlZCBhZ2FpbnN0IGludmFsaWRhdGVfZHF1b3RzKCkKKyAqCisgKiBFYWNoIGRxdW90IGhhcyBpdHMgZHFfbG9jayBzZW1hcGhvcmUuIExvY2tlZCBkcXVvdHMgbWlnaHQgbm90IGJlIHJlZmVyZW5jZWQKKyAqIGZyb20gaW5vZGVzIChkcXVvdF9hbGxvY19zcGFjZSgpIGFuZCBzdWNoIGRvbid0IGNoZWNrIHRoZSBkcV9sb2NrKS4KKyAqIEN1cnJlbnRseSBkcXVvdCBpcyBsb2NrZWQgb25seSB3aGVuIGl0IGlzIGJlaW5nIHJlYWQgdG8gbWVtb3J5IChvciBzcGFjZSBmb3IKKyAqIGl0IGlzIGJlaW5nIGFsbG9jYXRlZCkgb24gdGhlIGZpcnN0IGRxZ2V0KCkgYW5kIHdoZW4gaXQgaXMgYmVpbmcgcmVsZWFzZWQgb24KKyAqIHRoZSBsYXN0IGRxcHV0KCkuIFRoZSBhbGxvY2F0aW9uIGFuZCByZWxlYXNlIG9wYXJhdGlvbnMgYXJlIHNlcmlhbGl6ZWQgYnkKKyAqIHRoZSBkcV9sb2NrIGFuZCBieSBjaGVja2luZyB0aGUgdXNlIGNvdW50IGluIGRxdW90X3JlbGVhc2UoKS4gIFdyaXRlCisgKiBvcGVyYXRpb25zIG9uIGRxdW90cyBkb24ndCBob2xkIGRxX2xvY2sgYXMgdGhleSBjb3B5IGRhdGEgdW5kZXIgZHFfZGF0YV9sb2NrCisgKiBzcGlubG9jayB0byBpbnRlcm5hbCBidWZmZXJzIGJlZm9yZSB3cml0aW5nLgorICoKKyAqIExvY2sgb3JkZXJpbmcgKGluY2x1ZGluZyByZWxhdGVkIFZGUyBsb2NrcykgaXMgdGhlIGZvbGxvd2luZzoKKyAqICAgaV9zZW0gPiBkcW9ub2ZmX3NlbSA+IGlwcnVuZV9zZW0gPiBqb3VybmFsX2xvY2sgPiBkcXB0cl9zZW0gPgorICogICA+IGRxdW90LT5kcV9sb2NrID4gZHFpb19zZW0KKyAqIGlfc2VtIG9uIHF1b3RhIGZpbGVzIGlzIHNwZWNpYWwgKGl0J3MgYmVsb3cgZHFpb19zZW0pCisgKi8KKworc3RhdGljIERFRklORV9TUElOTE9DSyhkcV9saXN0X2xvY2spOworREVGSU5FX1NQSU5MT0NLKGRxX2RhdGFfbG9jayk7CisKK3N0YXRpYyBjaGFyICpxdW90YXR5cGVzW10gPSBJTklUUUZOQU1FUzsKK3N0YXRpYyBzdHJ1Y3QgcXVvdGFfZm9ybWF0X3R5cGUgKnF1b3RhX2Zvcm1hdHM7CS8qIExpc3Qgb2YgcmVnaXN0ZXJlZCBmb3JtYXRzICovCitzdGF0aWMgc3RydWN0IHF1b3RhX21vZHVsZV9uYW1lIG1vZHVsZV9uYW1lc1tdID0gSU5JVF9RVU9UQV9NT0RVTEVfTkFNRVM7CisKKy8qIFNMQUIgY2FjaGUgZm9yIGRxdW90IHN0cnVjdHVyZXMgKi8KK3N0YXRpYyBrbWVtX2NhY2hlX3QgKmRxdW90X2NhY2hlcDsKKworaW50IHJlZ2lzdGVyX3F1b3RhX2Zvcm1hdChzdHJ1Y3QgcXVvdGFfZm9ybWF0X3R5cGUgKmZtdCkKK3sKKwlzcGluX2xvY2soJmRxX2xpc3RfbG9jayk7CisJZm10LT5xZl9uZXh0ID0gcXVvdGFfZm9ybWF0czsKKwlxdW90YV9mb3JtYXRzID0gZm10OworCXNwaW5fdW5sb2NrKCZkcV9saXN0X2xvY2spOworCXJldHVybiAwOworfQorCit2b2lkIHVucmVnaXN0ZXJfcXVvdGFfZm9ybWF0KHN0cnVjdCBxdW90YV9mb3JtYXRfdHlwZSAqZm10KQoreworCXN0cnVjdCBxdW90YV9mb3JtYXRfdHlwZSAqKmFjdHFmOworCisJc3Bpbl9sb2NrKCZkcV9saXN0X2xvY2spOworCWZvciAoYWN0cWYgPSAmcXVvdGFfZm9ybWF0czsgKmFjdHFmICYmICphY3RxZiAhPSBmbXQ7IGFjdHFmID0gJigqYWN0cWYpLT5xZl9uZXh0KTsKKwlpZiAoKmFjdHFmKQorCQkqYWN0cWYgPSAoKmFjdHFmKS0+cWZfbmV4dDsKKwlzcGluX3VubG9jaygmZHFfbGlzdF9sb2NrKTsKK30KKworc3RhdGljIHN0cnVjdCBxdW90YV9mb3JtYXRfdHlwZSAqZmluZF9xdW90YV9mb3JtYXQoaW50IGlkKQoreworCXN0cnVjdCBxdW90YV9mb3JtYXRfdHlwZSAqYWN0cWY7CisKKwlzcGluX2xvY2soJmRxX2xpc3RfbG9jayk7CisJZm9yIChhY3RxZiA9IHF1b3RhX2Zvcm1hdHM7IGFjdHFmICYmIGFjdHFmLT5xZl9mbXRfaWQgIT0gaWQ7IGFjdHFmID0gYWN0cWYtPnFmX25leHQpOworCWlmICghYWN0cWYgfHwgIXRyeV9tb2R1bGVfZ2V0KGFjdHFmLT5xZl9vd25lcikpIHsKKwkJaW50IHFtOworCisJCXNwaW5fdW5sb2NrKCZkcV9saXN0X2xvY2spOworCQkKKwkJZm9yIChxbSA9IDA7IG1vZHVsZV9uYW1lc1txbV0ucW1fZm10X2lkICYmIG1vZHVsZV9uYW1lc1txbV0ucW1fZm10X2lkICE9IGlkOyBxbSsrKTsKKwkJaWYgKCFtb2R1bGVfbmFtZXNbcW1dLnFtX2ZtdF9pZCB8fCByZXF1ZXN0X21vZHVsZShtb2R1bGVfbmFtZXNbcW1dLnFtX21vZF9uYW1lKSkKKwkJCXJldHVybiBOVUxMOworCisJCXNwaW5fbG9jaygmZHFfbGlzdF9sb2NrKTsKKwkJZm9yIChhY3RxZiA9IHF1b3RhX2Zvcm1hdHM7IGFjdHFmICYmIGFjdHFmLT5xZl9mbXRfaWQgIT0gaWQ7IGFjdHFmID0gYWN0cWYtPnFmX25leHQpOworCQlpZiAoYWN0cWYgJiYgIXRyeV9tb2R1bGVfZ2V0KGFjdHFmLT5xZl9vd25lcikpCisJCQlhY3RxZiA9IE5VTEw7CisJfQorCXNwaW5fdW5sb2NrKCZkcV9saXN0X2xvY2spOworCXJldHVybiBhY3RxZjsKK30KKworc3RhdGljIHZvaWQgcHV0X3F1b3RhX2Zvcm1hdChzdHJ1Y3QgcXVvdGFfZm9ybWF0X3R5cGUgKmZtdCkKK3sKKwltb2R1bGVfcHV0KGZtdC0+cWZfb3duZXIpOworfQorCisvKgorICogRHF1b3QgTGlzdCBNYW5hZ2VtZW50OgorICogVGhlIHF1b3RhIGNvZGUgdXNlcyB0aHJlZSBsaXN0cyBmb3IgZHF1b3QgbWFuYWdlbWVudDogdGhlIGludXNlX2xpc3QsCisgKiBmcmVlX2RxdW90cywgYW5kIGRxdW90X2hhc2hbXSBhcnJheS4gQSBzaW5nbGUgZHF1b3Qgc3RydWN0dXJlIG1heSBiZQorICogb24gYWxsIHRocmVlIGxpc3RzLCBkZXBlbmRpbmcgb24gaXRzIGN1cnJlbnQgc3RhdGUuCisgKgorICogQWxsIGRxdW90cyBhcmUgcGxhY2VkIHRvIHRoZSBlbmQgb2YgaW51c2VfbGlzdCB3aGVuIGZpcnN0IGNyZWF0ZWQsIGFuZCB0aGlzCisgKiBsaXN0IGlzIHVzZWQgZm9yIGludmFsaWRhdGUgb3BlcmF0aW9uLCB3aGljaCBtdXN0IGxvb2sgYXQgZXZlcnkgZHF1b3QuCisgKgorICogVW51c2VkIGRxdW90cyAoZHFfY291bnQgPT0gMCkgYXJlIGFkZGVkIHRvIHRoZSBmcmVlX2RxdW90cyBsaXN0IHdoZW4gZnJlZWQsCisgKiBhbmQgdGhpcyBsaXN0IGlzIHNlYXJjaGVkIHdoZW5ldmVyIHdlIG5lZWQgYW4gYXZhaWxhYmxlIGRxdW90LiAgRHF1b3RzIGFyZQorICogcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IGFzIHNvb24gYXMgdGhleSBhcmUgdXNlZCBhZ2FpbiwgYW5kCisgKiBkcXN0YXRzLmZyZWVfZHF1b3RzIGdpdmVzIHRoZSBudW1iZXIgb2YgZHF1b3RzIG9uIHRoZSBsaXN0LiBXaGVuCisgKiBkcXVvdCBpcyBpbnZhbGlkYXRlZCBpdCdzIGNvbXBsZXRlbHkgcmVsZWFzZWQgZnJvbSBtZW1vcnkuCisgKgorICogRHF1b3RzIHdpdGggYSBzcGVjaWZpYyBpZGVudGl0eSAoZGV2aWNlLCB0eXBlIGFuZCBpZCkgYXJlIHBsYWNlZCBvbgorICogb25lIG9mIHRoZSBkcXVvdF9oYXNoW10gaGFzaCBjaGFpbnMuIFRoZSBwcm92aWRlcyBhbiBlZmZpY2llbnQgc2VhcmNoCisgKiBtZWNoYW5pc20gdG8gbG9jYXRlIGEgc3BlY2lmaWMgZHF1b3QuCisgKi8KKworc3RhdGljIExJU1RfSEVBRChpbnVzZV9saXN0KTsKK3N0YXRpYyBMSVNUX0hFQUQoZnJlZV9kcXVvdHMpOworc3RhdGljIHVuc2lnbmVkIGludCBkcV9oYXNoX2JpdHMsIGRxX2hhc2hfbWFzazsKK3N0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZCAqZHF1b3RfaGFzaDsKKworc3RydWN0IGRxc3RhdHMgZHFzdGF0czsKKworc3RhdGljIHZvaWQgZHFwdXQoc3RydWN0IGRxdW90ICpkcXVvdCk7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50CitoYXNoZm4oY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgaW50IGlkLCBpbnQgdHlwZSkKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCXRtcCA9ICgoKHVuc2lnbmVkIGxvbmcpc2I+PkwxX0NBQ0hFX1NISUZUKSBeIGlkKSAqIChNQVhRVU9UQVMgLSB0eXBlKTsKKwlyZXR1cm4gKHRtcCArICh0bXAgPj4gZHFfaGFzaF9iaXRzKSkgJiBkcV9oYXNoX21hc2s7Cit9CisKKy8qCisgKiBGb2xsb3dpbmcgbGlzdCBmdW5jdGlvbnMgZXhwZWN0IGRxX2xpc3RfbG9jayB0byBiZSBoZWxkCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpbnNlcnRfZHF1b3RfaGFzaChzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkID0gZHF1b3RfaGFzaCArIGhhc2hmbihkcXVvdC0+ZHFfc2IsIGRxdW90LT5kcV9pZCwgZHF1b3QtPmRxX3R5cGUpOworCWhsaXN0X2FkZF9oZWFkKCZkcXVvdC0+ZHFfaGFzaCwgaGVhZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZW1vdmVfZHF1b3RfaGFzaChzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCWhsaXN0X2RlbF9pbml0KCZkcXVvdC0+ZHFfaGFzaCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRxdW90ICpmaW5kX2RxdW90KHVuc2lnbmVkIGludCBoYXNoZW50LCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBpbnQgaWQsIGludCB0eXBlKQoreworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCXN0cnVjdCBkcXVvdCAqZHF1b3Q7CisKKwlobGlzdF9mb3JfZWFjaCAobm9kZSwgZHF1b3RfaGFzaCtoYXNoZW50KSB7CisJCWRxdW90ID0gaGxpc3RfZW50cnkobm9kZSwgc3RydWN0IGRxdW90LCBkcV9oYXNoKTsKKwkJaWYgKGRxdW90LT5kcV9zYiA9PSBzYiAmJiBkcXVvdC0+ZHFfaWQgPT0gaWQgJiYgZHF1b3QtPmRxX3R5cGUgPT0gdHlwZSkKKwkJCXJldHVybiBkcXVvdDsKKwl9CisJcmV0dXJuIE5PRFFVT1Q7Cit9CisKKy8qIEFkZCBhIGRxdW90IHRvIHRoZSB0YWlsIG9mIHRoZSBmcmVlIGxpc3QgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfZHF1b3RfbGFzdChzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCWxpc3RfYWRkKCZkcXVvdC0+ZHFfZnJlZSwgZnJlZV9kcXVvdHMucHJldik7CisJZHFzdGF0cy5mcmVlX2RxdW90cysrOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVtb3ZlX2ZyZWVfZHF1b3Qoc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlpZiAobGlzdF9lbXB0eSgmZHF1b3QtPmRxX2ZyZWUpKQorCQlyZXR1cm47CisJbGlzdF9kZWxfaW5pdCgmZHF1b3QtPmRxX2ZyZWUpOworCWRxc3RhdHMuZnJlZV9kcXVvdHMtLTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHB1dF9pbnVzZShzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCS8qIFdlIGFkZCB0byB0aGUgYmFjayBvZiBpbnVzZSBsaXN0IHNvIHdlIGRvbid0IGhhdmUgdG8gcmVzdGFydAorCSAqIHdoZW4gdHJhdmVyc2luZyB0aGlzIGxpc3QgYW5kIHdlIGJsb2NrICovCisJbGlzdF9hZGQoJmRxdW90LT5kcV9pbnVzZSwgaW51c2VfbGlzdC5wcmV2KTsKKwlkcXN0YXRzLmFsbG9jYXRlZF9kcXVvdHMrKzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlbW92ZV9pbnVzZShzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCWRxc3RhdHMuYWxsb2NhdGVkX2RxdW90cy0tOworCWxpc3RfZGVsKCZkcXVvdC0+ZHFfaW51c2UpOworfQorLyoKKyAqIEVuZCBvZiBsaXN0IGZ1bmN0aW9ucyBuZWVkaW5nIGRxX2xpc3RfbG9jaworICovCisKK3N0YXRpYyB2b2lkIHdhaXRfb25fZHF1b3Qoc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlkb3duKCZkcXVvdC0+ZHFfbG9jayk7CisJdXAoJmRxdW90LT5kcV9sb2NrKTsKK30KKworI2RlZmluZSBtYXJrX2RxdW90X2RpcnR5KGRxdW90KSAoKGRxdW90KS0+ZHFfc2ItPmRxX29wLT5tYXJrX2RpcnR5KGRxdW90KSkKKworaW50IGRxdW90X21hcmtfZHF1b3RfZGlydHkoc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlzcGluX2xvY2soJmRxX2xpc3RfbG9jayk7CisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KERRX01PRF9CLCAmZHF1b3QtPmRxX2ZsYWdzKSkKKwkJbGlzdF9hZGQoJmRxdW90LT5kcV9kaXJ0eSwgJnNiX2Rxb3B0KGRxdW90LT5kcV9zYiktPgorCQkJCWluZm9bZHF1b3QtPmRxX3R5cGVdLmRxaV9kaXJ0eV9saXN0KTsKKwlzcGluX3VubG9jaygmZHFfbGlzdF9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyBmdW5jdGlvbiBuZWVkcyBkcV9saXN0X2xvY2sgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNsZWFyX2RxdW90X2RpcnR5KHN0cnVjdCBkcXVvdCAqZHF1b3QpCit7CisJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoRFFfTU9EX0IsICZkcXVvdC0+ZHFfZmxhZ3MpKQorCQlyZXR1cm4gMDsKKwlsaXN0X2RlbF9pbml0KCZkcXVvdC0+ZHFfZGlydHkpOworCXJldHVybiAxOworfQorCit2b2lkIG1hcmtfaW5mb19kaXJ0eShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKK3sKKwlzZXRfYml0KERRRl9JTkZPX0RJUlRZX0IsICZzYl9kcW9wdChzYiktPmluZm9bdHlwZV0uZHFpX2ZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0wobWFya19pbmZvX2RpcnR5KTsKKworLyoKKyAqCVJlYWQgZHF1b3QgZnJvbSBkaXNrIGFuZCBhbGxvYyBzcGFjZSBmb3IgaXQKKyAqLworCitpbnQgZHF1b3RfYWNxdWlyZShzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCWludCByZXQgPSAwLCByZXQyID0gMDsKKwlzdHJ1Y3QgcXVvdGFfaW5mbyAqZHFvcHQgPSBzYl9kcW9wdChkcXVvdC0+ZHFfc2IpOworCisJZG93bigmZHF1b3QtPmRxX2xvY2spOworCWRvd24oJmRxb3B0LT5kcWlvX3NlbSk7CisJaWYgKCF0ZXN0X2JpdChEUV9SRUFEX0IsICZkcXVvdC0+ZHFfZmxhZ3MpKQorCQlyZXQgPSBkcW9wdC0+b3BzW2RxdW90LT5kcV90eXBlXS0+cmVhZF9kcWJsayhkcXVvdCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0X2lvbG9jazsKKwlzZXRfYml0KERRX1JFQURfQiwgJmRxdW90LT5kcV9mbGFncyk7CisJLyogSW5zdGFudGlhdGUgZHF1b3QgaWYgbmVlZGVkICovCisJaWYgKCF0ZXN0X2JpdChEUV9BQ1RJVkVfQiwgJmRxdW90LT5kcV9mbGFncykgJiYgIWRxdW90LT5kcV9vZmYpIHsKKwkJcmV0ID0gZHFvcHQtPm9wc1tkcXVvdC0+ZHFfdHlwZV0tPmNvbW1pdF9kcWJsayhkcXVvdCk7CisJCS8qIFdyaXRlIHRoZSBpbmZvIGlmIG5lZWRlZCAqLworCQlpZiAoaW5mb19kaXJ0eSgmZHFvcHQtPmluZm9bZHF1b3QtPmRxX3R5cGVdKSkKKwkJCXJldDIgPSBkcW9wdC0+b3BzW2RxdW90LT5kcV90eXBlXS0+d3JpdGVfZmlsZV9pbmZvKGRxdW90LT5kcV9zYiwgZHF1b3QtPmRxX3R5cGUpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0X2lvbG9jazsKKwkJaWYgKHJldDIgPCAwKSB7CisJCQlyZXQgPSByZXQyOworCQkJZ290byBvdXRfaW9sb2NrOworCQl9CisJfQorCXNldF9iaXQoRFFfQUNUSVZFX0IsICZkcXVvdC0+ZHFfZmxhZ3MpOworb3V0X2lvbG9jazoKKwl1cCgmZHFvcHQtPmRxaW9fc2VtKTsKKwl1cCgmZHF1b3QtPmRxX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKglXcml0ZSBkcXVvdCB0byBkaXNrCisgKi8KK2ludCBkcXVvdF9jb21taXQoc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlpbnQgcmV0ID0gMCwgcmV0MiA9IDA7CisJc3RydWN0IHF1b3RhX2luZm8gKmRxb3B0ID0gc2JfZHFvcHQoZHF1b3QtPmRxX3NiKTsKKworCWRvd24oJmRxb3B0LT5kcWlvX3NlbSk7CisJc3Bpbl9sb2NrKCZkcV9saXN0X2xvY2spOworCWlmICghY2xlYXJfZHF1b3RfZGlydHkoZHF1b3QpKSB7CisJCXNwaW5fdW5sb2NrKCZkcV9saXN0X2xvY2spOworCQlnb3RvIG91dF9zZW07CisJfQorCXNwaW5fdW5sb2NrKCZkcV9saXN0X2xvY2spOworCS8qIEluYWN0aXZlIGRxdW90IGNhbiBiZSBvbmx5IGlmIHRoZXJlIHdhcyBlcnJvciBkdXJpbmcgcmVhZC9pbml0CisJICogPT4gd2UgaGF2ZSBiZXR0ZXIgbm90IHdyaXRpbmcgaXQgKi8KKwlpZiAodGVzdF9iaXQoRFFfQUNUSVZFX0IsICZkcXVvdC0+ZHFfZmxhZ3MpKSB7CisJCXJldCA9IGRxb3B0LT5vcHNbZHF1b3QtPmRxX3R5cGVdLT5jb21taXRfZHFibGsoZHF1b3QpOworCQlpZiAoaW5mb19kaXJ0eSgmZHFvcHQtPmluZm9bZHF1b3QtPmRxX3R5cGVdKSkKKwkJCXJldDIgPSBkcW9wdC0+b3BzW2RxdW90LT5kcV90eXBlXS0+d3JpdGVfZmlsZV9pbmZvKGRxdW90LT5kcV9zYiwgZHF1b3QtPmRxX3R5cGUpOworCQlpZiAocmV0ID49IDApCisJCQlyZXQgPSByZXQyOworCX0KK291dF9zZW06CisJdXAoJmRxb3B0LT5kcWlvX3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqCVJlbGVhc2UgZHF1b3QKKyAqLworaW50IGRxdW90X3JlbGVhc2Uoc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlpbnQgcmV0ID0gMCwgcmV0MiA9IDA7CisJc3RydWN0IHF1b3RhX2luZm8gKmRxb3B0ID0gc2JfZHFvcHQoZHF1b3QtPmRxX3NiKTsKKworCWRvd24oJmRxdW90LT5kcV9sb2NrKTsKKwkvKiBDaGVjayB3aGV0aGVyIHdlIGFyZSBub3QgcmFjaW5nIHdpdGggc29tZSBvdGhlciBkcWdldCgpICovCisJaWYgKGF0b21pY19yZWFkKCZkcXVvdC0+ZHFfY291bnQpID4gMSkKKwkJZ290byBvdXRfZHFsb2NrOworCWRvd24oJmRxb3B0LT5kcWlvX3NlbSk7CisJaWYgKGRxb3B0LT5vcHNbZHF1b3QtPmRxX3R5cGVdLT5yZWxlYXNlX2RxYmxrKSB7CisJCXJldCA9IGRxb3B0LT5vcHNbZHF1b3QtPmRxX3R5cGVdLT5yZWxlYXNlX2RxYmxrKGRxdW90KTsKKwkJLyogV3JpdGUgdGhlIGluZm8gKi8KKwkJaWYgKGluZm9fZGlydHkoJmRxb3B0LT5pbmZvW2RxdW90LT5kcV90eXBlXSkpCisJCQlyZXQyID0gZHFvcHQtPm9wc1tkcXVvdC0+ZHFfdHlwZV0tPndyaXRlX2ZpbGVfaW5mbyhkcXVvdC0+ZHFfc2IsIGRxdW90LT5kcV90eXBlKTsKKwkJaWYgKHJldCA+PSAwKQorCQkJcmV0ID0gcmV0MjsKKwl9CisJY2xlYXJfYml0KERRX0FDVElWRV9CLCAmZHF1b3QtPmRxX2ZsYWdzKTsKKwl1cCgmZHFvcHQtPmRxaW9fc2VtKTsKK291dF9kcWxvY2s6CisJdXAoJmRxdW90LT5kcV9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBJbnZhbGlkYXRlIGFsbCBkcXVvdHMgb24gdGhlIGxpc3QuIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlcgorICogcXVvdGEgaXMgZGlzYWJsZWQgYW5kIHBvaW50ZXJzIGZyb20gaW5vZGVzIHJlbW92ZWQgc28gdGhlcmUgY2Fubm90IGJlIG5ldworICogcXVvdGEgdXNlcnMuIEFsc28gYmVjYXVzZSB3ZSBob2xkIGRxb25vZmZfc2VtIHRoZXJlIGNhbiBiZSBubyBxdW90YSB1c2VycworICogZm9yIHRoaXMgc2IrdHlwZSBhdCBhbGwuICovCitzdGF0aWMgdm9pZCBpbnZhbGlkYXRlX2RxdW90cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgZHF1b3QgKmRxdW90OworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7CisKKwlzcGluX2xvY2soJmRxX2xpc3RfbG9jayk7CisJZm9yIChoZWFkID0gaW51c2VfbGlzdC5uZXh0OyBoZWFkICE9ICZpbnVzZV9saXN0OykgeworCQlkcXVvdCA9IGxpc3RfZW50cnkoaGVhZCwgc3RydWN0IGRxdW90LCBkcV9pbnVzZSk7CisJCWhlYWQgPSBoZWFkLT5uZXh0OworCQlpZiAoZHF1b3QtPmRxX3NiICE9IHNiKQorCQkJY29udGludWU7CisJCWlmIChkcXVvdC0+ZHFfdHlwZSAhPSB0eXBlKQorCQkJY29udGludWU7CisjaWZkZWYgX19EUVVPVF9QQVJBTk9JQQorCQlpZiAoYXRvbWljX3JlYWQoJmRxdW90LT5kcV9jb3VudCkpCisJCQlCVUcoKTsKKyNlbmRpZgorCQkvKiBRdW90YSBub3cgaGFzIG5vIHVzZXJzIGFuZCBpdCBoYXMgYmVlbiB3cml0dGVuIG9uIGxhc3QgZHFwdXQoKSAqLworCQlyZW1vdmVfZHF1b3RfaGFzaChkcXVvdCk7CisJCXJlbW92ZV9mcmVlX2RxdW90KGRxdW90KTsKKwkJcmVtb3ZlX2ludXNlKGRxdW90KTsKKwkJa21lbV9jYWNoZV9mcmVlKGRxdW90X2NhY2hlcCwgZHF1b3QpOworCX0KKwlzcGluX3VubG9jaygmZHFfbGlzdF9sb2NrKTsKK30KKworaW50IHZmc19xdW90YV9zeW5jKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmRpcnR5OworCXN0cnVjdCBkcXVvdCAqZHF1b3Q7CisJc3RydWN0IHF1b3RhX2luZm8gKmRxb3B0ID0gc2JfZHFvcHQoc2IpOworCWludCBjbnQ7CisKKwlkb3duKCZkcW9wdC0+ZHFvbm9mZl9zZW0pOworCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykgeworCQlpZiAodHlwZSAhPSAtMSAmJiBjbnQgIT0gdHlwZSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXNiX2hhc19xdW90YV9lbmFibGVkKHNiLCBjbnQpKQorCQkJY29udGludWU7CisJCXNwaW5fbG9jaygmZHFfbGlzdF9sb2NrKTsKKwkJZGlydHkgPSAmZHFvcHQtPmluZm9bY250XS5kcWlfZGlydHlfbGlzdDsKKwkJd2hpbGUgKCFsaXN0X2VtcHR5KGRpcnR5KSkgeworCQkJZHF1b3QgPSBsaXN0X2VudHJ5KGRpcnR5LT5uZXh0LCBzdHJ1Y3QgZHF1b3QsIGRxX2RpcnR5KTsKKwkJCS8qIERpcnR5IGFuZCBpbmFjdGl2ZSBjYW4gYmUgb25seSBiYWQgZHF1b3QuLi4gKi8KKwkJCWlmICghdGVzdF9iaXQoRFFfQUNUSVZFX0IsICZkcXVvdC0+ZHFfZmxhZ3MpKSB7CisJCQkJY2xlYXJfZHF1b3RfZGlydHkoZHF1b3QpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogTm93IHdlIGhhdmUgYWN0aXZlIGRxdW90IGZyb20gd2hpY2ggc29tZW9uZSBpcworIAkJCSAqIGhvbGRpbmcgcmVmZXJlbmNlIHNvIHdlIGNhbiBzYWZlbHkganVzdCBpbmNyZWFzZQorCQkJICogdXNlIGNvdW50ICovCisJCQlhdG9taWNfaW5jKCZkcXVvdC0+ZHFfY291bnQpOworCQkJZHFzdGF0cy5sb29rdXBzKys7CisJCQlzcGluX3VubG9jaygmZHFfbGlzdF9sb2NrKTsKKwkJCXNiLT5kcV9vcC0+d3JpdGVfZHF1b3QoZHF1b3QpOworCQkJZHFwdXQoZHF1b3QpOworCQkJc3Bpbl9sb2NrKCZkcV9saXN0X2xvY2spOworCQl9CisJCXNwaW5fdW5sb2NrKCZkcV9saXN0X2xvY2spOworCX0KKworCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykKKwkJaWYgKChjbnQgPT0gdHlwZSB8fCB0eXBlID09IC0xKSAmJiBzYl9oYXNfcXVvdGFfZW5hYmxlZChzYiwgY250KQorCQkJJiYgaW5mb19kaXJ0eSgmZHFvcHQtPmluZm9bY250XSkpCisJCQlzYi0+ZHFfb3AtPndyaXRlX2luZm8oc2IsIGNudCk7CisJc3Bpbl9sb2NrKCZkcV9saXN0X2xvY2spOworCWRxc3RhdHMuc3luY3MrKzsKKwlzcGluX3VubG9jaygmZHFfbGlzdF9sb2NrKTsKKwl1cCgmZHFvcHQtPmRxb25vZmZfc2VtKTsKKworCXJldHVybiAwOworfQorCisvKiBGcmVlIHVudXNlZCBkcXVvdHMgZnJvbSBjYWNoZSAqLworc3RhdGljIHZvaWQgcHJ1bmVfZHFjYWNoZShpbnQgY291bnQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKKwlzdHJ1Y3QgZHF1b3QgKmRxdW90OworCisJaGVhZCA9IGZyZWVfZHF1b3RzLnByZXY7CisJd2hpbGUgKGhlYWQgIT0gJmZyZWVfZHF1b3RzICYmIGNvdW50KSB7CisJCWRxdW90ID0gbGlzdF9lbnRyeShoZWFkLCBzdHJ1Y3QgZHF1b3QsIGRxX2ZyZWUpOworCQlyZW1vdmVfZHF1b3RfaGFzaChkcXVvdCk7CisJCXJlbW92ZV9mcmVlX2RxdW90KGRxdW90KTsKKwkJcmVtb3ZlX2ludXNlKGRxdW90KTsKKwkJa21lbV9jYWNoZV9mcmVlKGRxdW90X2NhY2hlcCwgZHF1b3QpOworCQljb3VudC0tOworCQloZWFkID0gZnJlZV9kcXVvdHMucHJldjsKKwl9Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCBmcm9tIGtzd2FwZCB3aGVuIHdlIHRoaW5rIHdlIG5lZWQgc29tZQorICogbW9yZSBtZW1vcnkKKyAqLworCitzdGF0aWMgaW50IHNocmlua19kcWNhY2hlX21lbW9yeShpbnQgbnIsIHVuc2lnbmVkIGludCBnZnBfbWFzaykKK3sKKwlpZiAobnIpIHsKKwkJc3Bpbl9sb2NrKCZkcV9saXN0X2xvY2spOworCQlwcnVuZV9kcWNhY2hlKG5yKTsKKwkJc3Bpbl91bmxvY2soJmRxX2xpc3RfbG9jayk7CisJfQorCXJldHVybiAoZHFzdGF0cy5mcmVlX2RxdW90cyAvIDEwMCkgKiBzeXNjdGxfdmZzX2NhY2hlX3ByZXNzdXJlOworfQorCisvKgorICogUHV0IHJlZmVyZW5jZSB0byBkcXVvdAorICogTk9URTogSWYgeW91IGNoYW5nZSB0aGlzIGZ1bmN0aW9uIHBsZWFzZSBjaGVjayB3aGV0aGVyIGRxcHV0X2Jsb2NrcygpIHdvcmtzIHJpZ2h0Li4uCisgKiBNVVNUIGJlIGNhbGxlZCB3aXRoIGVpdGhlciBkcXB0cl9zZW0gb3IgZHFvbm9mZl9zZW0gaGVsZAorICovCitzdGF0aWMgdm9pZCBkcXB1dChzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCWlmICghZHF1b3QpCisJCXJldHVybjsKKyNpZmRlZiBfX0RRVU9UX1BBUkFOT0lBCisJaWYgKCFhdG9taWNfcmVhZCgmZHF1b3QtPmRxX2NvdW50KSkgeworCQlwcmludGsoIlZGUzogZHFwdXQ6IHRyeWluZyB0byBmcmVlIGZyZWUgZHF1b3RcbiIpOworCQlwcmludGsoIlZGUzogZGV2aWNlICVzLCBkcXVvdCBvZiAlcyAlZFxuIiwKKwkJCWRxdW90LT5kcV9zYi0+c19pZCwKKwkJCXF1b3RhdHlwZXNbZHF1b3QtPmRxX3R5cGVdLAorCQkJZHF1b3QtPmRxX2lkKTsKKwkJQlVHKCk7CisJfQorI2VuZGlmCisJCisJc3Bpbl9sb2NrKCZkcV9saXN0X2xvY2spOworCWRxc3RhdHMuZHJvcHMrKzsKKwlzcGluX3VubG9jaygmZHFfbGlzdF9sb2NrKTsKK3dlX3NsZXB0OgorCXNwaW5fbG9jaygmZHFfbGlzdF9sb2NrKTsKKwlpZiAoYXRvbWljX3JlYWQoJmRxdW90LT5kcV9jb3VudCkgPiAxKSB7CisJCS8qIFdlIGhhdmUgbW9yZSB0aGFuIG9uZSB1c2VyLi4uIG5vdGhpbmcgdG8gZG8gKi8KKwkJYXRvbWljX2RlYygmZHF1b3QtPmRxX2NvdW50KTsKKwkJc3Bpbl91bmxvY2soJmRxX2xpc3RfbG9jayk7CisJCXJldHVybjsKKwl9CisJLyogTmVlZCB0byByZWxlYXNlIGRxdW90PyAqLworCWlmICh0ZXN0X2JpdChEUV9BQ1RJVkVfQiwgJmRxdW90LT5kcV9mbGFncykgJiYgZHF1b3RfZGlydHkoZHF1b3QpKSB7CisJCXNwaW5fdW5sb2NrKCZkcV9saXN0X2xvY2spOworCQkvKiBDb21taXQgZHF1b3QgYmVmb3JlIHJlbGVhc2luZyAqLworCQlkcXVvdC0+ZHFfc2ItPmRxX29wLT53cml0ZV9kcXVvdChkcXVvdCk7CisJCWdvdG8gd2Vfc2xlcHQ7CisJfQorCS8qIENsZWFyIGZsYWcgaW4gY2FzZSBkcXVvdCB3YXMgaW5hY3RpdmUgKHNvbWV0aGluZyBiYWQgaGFwcGVuZWQpICovCisJY2xlYXJfZHF1b3RfZGlydHkoZHF1b3QpOworCWlmICh0ZXN0X2JpdChEUV9BQ1RJVkVfQiwgJmRxdW90LT5kcV9mbGFncykpIHsKKwkJc3Bpbl91bmxvY2soJmRxX2xpc3RfbG9jayk7CisJCWRxdW90LT5kcV9zYi0+ZHFfb3AtPnJlbGVhc2VfZHF1b3QoZHF1b3QpOworCQlnb3RvIHdlX3NsZXB0OworCX0KKwlhdG9taWNfZGVjKCZkcXVvdC0+ZHFfY291bnQpOworI2lmZGVmIF9fRFFVT1RfUEFSQU5PSUEKKwkvKiBzYW5pdHkgY2hlY2sgKi8KKwlpZiAoIWxpc3RfZW1wdHkoJmRxdW90LT5kcV9mcmVlKSkKKwkJQlVHKCk7CisjZW5kaWYKKwlwdXRfZHF1b3RfbGFzdChkcXVvdCk7CisJc3Bpbl91bmxvY2soJmRxX2xpc3RfbG9jayk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHF1b3QgKmdldF9lbXB0eV9kcXVvdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgZHF1b3QgKmRxdW90OworCisJZHF1b3QgPSBrbWVtX2NhY2hlX2FsbG9jKGRxdW90X2NhY2hlcCwgU0xBQl9OT0ZTKTsKKwlpZighZHF1b3QpCisJCXJldHVybiBOT0RRVU9UOworCisJbWVtc2V0KChjYWRkcl90KWRxdW90LCAwLCBzaXplb2Yoc3RydWN0IGRxdW90KSk7CisJc2VtYV9pbml0KCZkcXVvdC0+ZHFfbG9jaywgMSk7CisJSU5JVF9MSVNUX0hFQUQoJmRxdW90LT5kcV9mcmVlKTsKKwlJTklUX0xJU1RfSEVBRCgmZHF1b3QtPmRxX2ludXNlKTsKKwlJTklUX0hMSVNUX05PREUoJmRxdW90LT5kcV9oYXNoKTsKKwlJTklUX0xJU1RfSEVBRCgmZHF1b3QtPmRxX2RpcnR5KTsKKwlkcXVvdC0+ZHFfc2IgPSBzYjsKKwlkcXVvdC0+ZHFfdHlwZSA9IHR5cGU7CisJYXRvbWljX3NldCgmZHF1b3QtPmRxX2NvdW50LCAxKTsKKworCXJldHVybiBkcXVvdDsKK30KKworLyoKKyAqIEdldCByZWZlcmVuY2UgdG8gZHF1b3QKKyAqIE1VU1QgYmUgY2FsbGVkIHdpdGggZWl0aGVyIGRxcHRyX3NlbSBvciBkcW9ub2ZmX3NlbSBoZWxkCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZHF1b3QgKmRxZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGludCBpZCwgaW50IHR5cGUpCit7CisJdW5zaWduZWQgaW50IGhhc2hlbnQgPSBoYXNoZm4oc2IsIGlkLCB0eXBlKTsKKwlzdHJ1Y3QgZHF1b3QgKmRxdW90LCAqZW1wdHkgPSBOT0RRVU9UOworCisgICAgICAgIGlmICghc2JfaGFzX3F1b3RhX2VuYWJsZWQoc2IsIHR5cGUpKQorCQlyZXR1cm4gTk9EUVVPVDsKK3dlX3NsZXB0OgorCXNwaW5fbG9jaygmZHFfbGlzdF9sb2NrKTsKKwlpZiAoKGRxdW90ID0gZmluZF9kcXVvdChoYXNoZW50LCBzYiwgaWQsIHR5cGUpKSA9PSBOT0RRVU9UKSB7CisJCWlmIChlbXB0eSA9PSBOT0RRVU9UKSB7CisJCQlzcGluX3VubG9jaygmZHFfbGlzdF9sb2NrKTsKKwkJCWlmICgoZW1wdHkgPSBnZXRfZW1wdHlfZHF1b3Qoc2IsIHR5cGUpKSA9PSBOT0RRVU9UKQorCQkJCXNjaGVkdWxlKCk7CS8qIFRyeSB0byB3YWl0IGZvciBhIG1vbWVudC4uLiAqLworCQkJZ290byB3ZV9zbGVwdDsKKwkJfQorCQlkcXVvdCA9IGVtcHR5OworCQlkcXVvdC0+ZHFfaWQgPSBpZDsKKwkJLyogYWxsIGRxdW90cyBnbyBvbiB0aGUgaW51c2VfbGlzdCAqLworCQlwdXRfaW51c2UoZHF1b3QpOworCQkvKiBoYXNoIGl0IGZpcnN0IHNvIGl0IGNhbiBiZSBmb3VuZCAqLworCQlpbnNlcnRfZHF1b3RfaGFzaChkcXVvdCk7CisJCWRxc3RhdHMubG9va3VwcysrOworCQlzcGluX3VubG9jaygmZHFfbGlzdF9sb2NrKTsKKwl9IGVsc2UgeworCQlpZiAoIWF0b21pY19yZWFkKCZkcXVvdC0+ZHFfY291bnQpKQorCQkJcmVtb3ZlX2ZyZWVfZHF1b3QoZHF1b3QpOworCQlhdG9taWNfaW5jKCZkcXVvdC0+ZHFfY291bnQpOworCQlkcXN0YXRzLmNhY2hlX2hpdHMrKzsKKwkJZHFzdGF0cy5sb29rdXBzKys7CisJCXNwaW5fdW5sb2NrKCZkcV9saXN0X2xvY2spOworCQlpZiAoZW1wdHkpCisJCQlrbWVtX2NhY2hlX2ZyZWUoZHF1b3RfY2FjaGVwLCBlbXB0eSk7CisJfQorCS8qIFdhaXQgZm9yIGRxX2xvY2sgLSBhZnRlciB0aGlzIHdlIGtub3cgdGhhdCBlaXRoZXIgZHF1b3RfcmVsZWFzZSgpIGlzIGFscmVhZHkKKwkgKiBmaW5pc2hlZCBvciBpdCB3aWxsIGJlIGNhbmNlbGVkIGR1ZSB0byBkcV9jb3VudCA+IDEgdGVzdCAqLworCXdhaXRfb25fZHF1b3QoZHF1b3QpOworCS8qIFJlYWQgdGhlIGRxdW90IGFuZCBpbnN0YW50aWF0ZSBpdCAoZXZlcnl0aGluZyBkb25lIG9ubHkgaWYgbmVlZGVkKSAqLworCWlmICghdGVzdF9iaXQoRFFfQUNUSVZFX0IsICZkcXVvdC0+ZHFfZmxhZ3MpICYmIHNiLT5kcV9vcC0+YWNxdWlyZV9kcXVvdChkcXVvdCkgPCAwKSB7CisJCWRxcHV0KGRxdW90KTsKKwkJcmV0dXJuIE5PRFFVT1Q7CisJfQorI2lmZGVmIF9fRFFVT1RfUEFSQU5PSUEKKwlpZiAoIWRxdW90LT5kcV9zYikJLyogSGFzIHNvbWVib2R5IGludmFsaWRhdGVkIGVudHJ5IHVuZGVyIHVzPyAqLworCQlCVUcoKTsKKyNlbmRpZgorCisJcmV0dXJuIGRxdW90OworfQorCitzdGF0aWMgaW50IGRxaW5pdF9uZWVkZWQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpCit7CisJaW50IGNudDsKKworCWlmIChJU19OT1FVT1RBKGlub2RlKSkKKwkJcmV0dXJuIDA7CisJaWYgKHR5cGUgIT0gLTEpCisJCXJldHVybiBpbm9kZS0+aV9kcXVvdFt0eXBlXSA9PSBOT0RRVU9UOworCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykKKwkJaWYgKGlub2RlLT5pX2RxdW90W2NudF0gPT0gTk9EUVVPVCkKKwkJCXJldHVybiAxOworCXJldHVybiAwOworfQorCisvKiBUaGlzIHJvdXRpbmUgaXMgZ3VhcmRlZCBieSBkcW9ub2ZmX3NlbSBzZW1hcGhvcmUgKi8KK3N0YXRpYyB2b2lkIGFkZF9kcXVvdF9yZWYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKworcmVzdGFydDoKKwlmaWxlX2xpc3RfbG9jaygpOworCWxpc3RfZm9yX2VhY2gocCwgJnNiLT5zX2ZpbGVzKSB7CisJCXN0cnVjdCBmaWxlICpmaWxwID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgZmlsZSwgZl9saXN0KTsKKwkJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCQlpZiAoZmlscC0+Zl9tb2RlICYgRk1PREVfV1JJVEUgJiYgZHFpbml0X25lZWRlZChpbm9kZSwgdHlwZSkpIHsKKwkJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGRnZXQoZmlscC0+Zl9kZW50cnkpOworCQkJZmlsZV9saXN0X3VubG9jaygpOworCQkJc2ItPmRxX29wLT5pbml0aWFsaXplKGlub2RlLCB0eXBlKTsKKwkJCWRwdXQoZGVudHJ5KTsKKwkJCS8qIEFzIHdlIG1heSBoYXZlIGJsb2NrZWQgd2UgaGFkIGJldHRlciByZXN0YXJ0Li4uICovCisJCQlnb3RvIHJlc3RhcnQ7CisJCX0KKwl9CisJZmlsZV9saXN0X3VubG9jaygpOworfQorCisvKiBSZXR1cm4gMCBpZiBkcXB1dCgpIHdvbid0IGJsb2NrIChub3RlIHRoYXQgMSBkb2Vzbid0IG5lY2Vzc2FyaWx5IG1lYW4gYmxvY2tpbmcpICovCitzdGF0aWMgaW5saW5lIGludCBkcXB1dF9ibG9ja3Moc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlpZiAoYXRvbWljX3JlYWQoJmRxdW90LT5kcV9jb3VudCkgPD0gMSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qIFJlbW92ZSByZWZlcmVuY2VzIHRvIGRxdW90cyBmcm9tIGlub2RlIC0gYWRkIGRxdW90IHRvIGxpc3QgZm9yIGZyZWVpbmcgaWYgbmVlZGVkICovCisvKiBXZSBjYW4ndCByYWNlIHdpdGggYW55Ym9keSBiZWNhdXNlIHdlIGhvbGQgZHFwdHJfc2VtIGZvciB3cml0aW5nLi4uICovCitpbnQgcmVtb3ZlX2lub2RlX2RxdW90X3JlZihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSwgc3RydWN0IGxpc3RfaGVhZCAqdG9mcmVlX2hlYWQpCit7CisJc3RydWN0IGRxdW90ICpkcXVvdCA9IGlub2RlLT5pX2RxdW90W3R5cGVdOworCisJaW5vZGUtPmlfZHF1b3RbdHlwZV0gPSBOT0RRVU9UOworCWlmIChkcXVvdCAhPSBOT0RRVU9UKSB7CisJCWlmIChkcXB1dF9ibG9ja3MoZHF1b3QpKSB7CisjaWZkZWYgX19EUVVPVF9QQVJBTk9JQQorCQkJaWYgKGF0b21pY19yZWFkKCZkcXVvdC0+ZHFfY291bnQpICE9IDEpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVkZTOiBBZGRpbmcgZHF1b3Qgd2l0aCBkcV9jb3VudCAlZCB0byBkaXNwb3NlIGxpc3QuXG4iLCBhdG9taWNfcmVhZCgmZHF1b3QtPmRxX2NvdW50KSk7CisjZW5kaWYKKwkJCXNwaW5fbG9jaygmZHFfbGlzdF9sb2NrKTsKKwkJCWxpc3RfYWRkKCZkcXVvdC0+ZHFfZnJlZSwgdG9mcmVlX2hlYWQpOwkvKiBBcyBkcXVvdCBtdXN0IGhhdmUgY3VycmVudGx5IHVzZXJzIGl0IGNhbid0IGJlIG9uIHRoZSBmcmVlIGxpc3QuLi4gKi8KKwkJCXNwaW5fdW5sb2NrKCZkcV9saXN0X2xvY2spOworCQkJcmV0dXJuIDE7CisJCX0KKwkJZWxzZQorCQkJZHFwdXQoZHF1b3QpOyAgIC8qIFdlIGhhdmUgZ3VhcmFudGVlZCB3ZSB3b24ndCBibG9jayAqLworCX0KKwlyZXR1cm4gMDsKK30KKworLyogRnJlZSBsaXN0IG9mIGRxdW90cyAtIGNhbGxlZCBmcm9tIGlub2RlLmMgKi8KKy8qIGRxdW90cyBhcmUgcmVtb3ZlZCBmcm9tIGlub2Rlcywgbm8gbmV3IHJlZmVyZW5jZXMgY2FuIGJlIGdvdCBzbyB3ZSBhcmUgdGhlIG9ubHkgb25lcyBob2xkaW5nIHJlZmVyZW5jZSAqLworc3RhdGljIHZvaWQgcHV0X2RxdW90X2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqdG9mcmVlX2hlYWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqYWN0X2hlYWQ7CisJc3RydWN0IGRxdW90ICpkcXVvdDsKKworCWFjdF9oZWFkID0gdG9mcmVlX2hlYWQtPm5leHQ7CisJLyogU28gbm93IHdlIGhhdmUgZHF1b3RzIG9uIHRoZSBsaXN0Li4uIEp1c3QgZnJlZSB0aGVtICovCisJd2hpbGUgKGFjdF9oZWFkICE9IHRvZnJlZV9oZWFkKSB7CisJCWRxdW90ID0gbGlzdF9lbnRyeShhY3RfaGVhZCwgc3RydWN0IGRxdW90LCBkcV9mcmVlKTsKKwkJYWN0X2hlYWQgPSBhY3RfaGVhZC0+bmV4dDsKKwkJbGlzdF9kZWxfaW5pdCgmZHF1b3QtPmRxX2ZyZWUpOwkvKiBSZW1vdmUgZHF1b3QgZnJvbSB0aGUgbGlzdCBzbyB3ZSB3b24ndCBoYXZlIHByb2JsZW1zLi4uICovCisJCWRxcHV0KGRxdW90KTsKKwl9Cit9CisKKy8qIEdhdGhlciBhbGwgcmVmZXJlbmNlcyBmcm9tIGlub2RlcyBhbmQgZHJvcCB0aGVtICovCitzdGF0aWMgdm9pZCBkcm9wX2RxdW90X3JlZihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKK3sKKwlMSVNUX0hFQUQodG9mcmVlX2hlYWQpOworCisJLyogV2UgbmVlZCB0byBiZSBndWFyZGVkIGFnYWluc3QgcHJ1bmVfaWNhY2hlIHRvIHJlYWNoIGFsbCB0aGUKKwkgKiBpbm9kZXMgLSBvdGhlcndpc2Ugc29tZSBjYW4gYmUgb24gdGhlIGxvY2FsIGxpc3Qgb2YgcHJ1bmVfaWNhY2hlICovCisJZG93bigmaXBydW5lX3NlbSk7CisJZG93bl93cml0ZSgmc2JfZHFvcHQoc2IpLT5kcXB0cl9zZW0pOworCXJlbW92ZV9kcXVvdF9yZWYoc2IsIHR5cGUsICZ0b2ZyZWVfaGVhZCk7CisJdXBfd3JpdGUoJnNiX2Rxb3B0KHNiKS0+ZHFwdHJfc2VtKTsKKwl1cCgmaXBydW5lX3NlbSk7CisJcHV0X2RxdW90X2xpc3QoJnRvZnJlZV9oZWFkKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRxdW90X2luY3JfaW5vZGVzKHN0cnVjdCBkcXVvdCAqZHF1b3QsIHVuc2lnbmVkIGxvbmcgbnVtYmVyKQoreworCWRxdW90LT5kcV9kcWIuZHFiX2N1cmlub2RlcyArPSBudW1iZXI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcXVvdF9pbmNyX3NwYWNlKHN0cnVjdCBkcXVvdCAqZHF1b3QsIHFzaXplX3QgbnVtYmVyKQoreworCWRxdW90LT5kcV9kcWIuZHFiX2N1cnNwYWNlICs9IG51bWJlcjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRxdW90X2RlY3JfaW5vZGVzKHN0cnVjdCBkcXVvdCAqZHF1b3QsIHVuc2lnbmVkIGxvbmcgbnVtYmVyKQoreworCWlmIChkcXVvdC0+ZHFfZHFiLmRxYl9jdXJpbm9kZXMgPiBudW1iZXIpCisJCWRxdW90LT5kcV9kcWIuZHFiX2N1cmlub2RlcyAtPSBudW1iZXI7CisJZWxzZQorCQlkcXVvdC0+ZHFfZHFiLmRxYl9jdXJpbm9kZXMgPSAwOworCWlmIChkcXVvdC0+ZHFfZHFiLmRxYl9jdXJpbm9kZXMgPD0gZHF1b3QtPmRxX2RxYi5kcWJfaXNvZnRsaW1pdCkKKwkJZHF1b3QtPmRxX2RxYi5kcWJfaXRpbWUgPSAodGltZV90KSAwOworCWNsZWFyX2JpdChEUV9JTk9ERVNfQiwgJmRxdW90LT5kcV9mbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcXVvdF9kZWNyX3NwYWNlKHN0cnVjdCBkcXVvdCAqZHF1b3QsIHFzaXplX3QgbnVtYmVyKQoreworCWlmIChkcXVvdC0+ZHFfZHFiLmRxYl9jdXJzcGFjZSA+IG51bWJlcikKKwkJZHF1b3QtPmRxX2RxYi5kcWJfY3Vyc3BhY2UgLT0gbnVtYmVyOworCWVsc2UKKwkJZHF1b3QtPmRxX2RxYi5kcWJfY3Vyc3BhY2UgPSAwOworCWlmICh0b3FiKGRxdW90LT5kcV9kcWIuZHFiX2N1cnNwYWNlKSA8PSBkcXVvdC0+ZHFfZHFiLmRxYl9ic29mdGxpbWl0KQorCQlkcXVvdC0+ZHFfZHFiLmRxYl9idGltZSA9ICh0aW1lX3QpIDA7CisJY2xlYXJfYml0KERRX0JMS1NfQiwgJmRxdW90LT5kcV9mbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgZmxhZ19wcmludF93YXJuaW5ncyA9IDE7CisKK3N0YXRpYyBpbmxpbmUgaW50IG5lZWRfcHJpbnRfd2FybmluZyhzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCWlmICghZmxhZ19wcmludF93YXJuaW5ncykKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKGRxdW90LT5kcV90eXBlKSB7CisJCWNhc2UgVVNSUVVPVEE6CisJCQlyZXR1cm4gY3VycmVudC0+ZnN1aWQgPT0gZHF1b3QtPmRxX2lkOworCQljYXNlIEdSUFFVT1RBOgorCQkJcmV0dXJuIGluX2dyb3VwX3AoZHF1b3QtPmRxX2lkKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFZhbHVlcyBvZiB3YXJuaW5ncyAqLworI2RlZmluZSBOT1dBUk4gMAorI2RlZmluZSBJSEFSRFdBUk4gMQorI2RlZmluZSBJU09GVExPTkdXQVJOIDIKKyNkZWZpbmUgSVNPRlRXQVJOIDMKKyNkZWZpbmUgQkhBUkRXQVJOIDQKKyNkZWZpbmUgQlNPRlRMT05HV0FSTiA1CisjZGVmaW5lIEJTT0ZUV0FSTiA2CisKKy8qIFByaW50IHdhcm5pbmcgdG8gdXNlciB3aGljaCBleGNlZWRlZCBxdW90YSAqLworc3RhdGljIHZvaWQgcHJpbnRfd2FybmluZyhzdHJ1Y3QgZHF1b3QgKmRxdW90LCBjb25zdCBjaGFyIHdhcm50eXBlKQoreworCWNoYXIgKm1zZyA9IE5VTEw7CisJaW50IGZsYWcgPSAod2FybnR5cGUgPT0gQkhBUkRXQVJOIHx8IHdhcm50eXBlID09IEJTT0ZUTE9OR1dBUk4pID8gRFFfQkxLU19CIDoKKwkgICgod2FybnR5cGUgPT0gSUhBUkRXQVJOIHx8IHdhcm50eXBlID09IElTT0ZUTE9OR1dBUk4pID8gRFFfSU5PREVTX0IgOiAwKTsKKworCWlmICghbmVlZF9wcmludF93YXJuaW5nKGRxdW90KSB8fCAoZmxhZyAmJiB0ZXN0X2FuZF9zZXRfYml0KGZsYWcsICZkcXVvdC0+ZHFfZmxhZ3MpKSkKKwkJcmV0dXJuOworCisJdHR5X3dyaXRlX21lc3NhZ2UoY3VycmVudC0+c2lnbmFsLT50dHksIGRxdW90LT5kcV9zYi0+c19pZCk7CisJaWYgKHdhcm50eXBlID09IElTT0ZUV0FSTiB8fCB3YXJudHlwZSA9PSBCU09GVFdBUk4pCisJCXR0eV93cml0ZV9tZXNzYWdlKGN1cnJlbnQtPnNpZ25hbC0+dHR5LCAiOiB3YXJuaW5nLCAiKTsKKwllbHNlCisJCXR0eV93cml0ZV9tZXNzYWdlKGN1cnJlbnQtPnNpZ25hbC0+dHR5LCAiOiB3cml0ZSBmYWlsZWQsICIpOworCXR0eV93cml0ZV9tZXNzYWdlKGN1cnJlbnQtPnNpZ25hbC0+dHR5LCBxdW90YXR5cGVzW2RxdW90LT5kcV90eXBlXSk7CisJc3dpdGNoICh3YXJudHlwZSkgeworCQljYXNlIElIQVJEV0FSTjoKKwkJCW1zZyA9ICIgZmlsZSBsaW1pdCByZWFjaGVkLlxyXG4iOworCQkJYnJlYWs7CisJCWNhc2UgSVNPRlRMT05HV0FSTjoKKwkJCW1zZyA9ICIgZmlsZSBxdW90YSBleGNlZWRlZCB0b28gbG9uZy5cclxuIjsKKwkJCWJyZWFrOworCQljYXNlIElTT0ZUV0FSTjoKKwkJCW1zZyA9ICIgZmlsZSBxdW90YSBleGNlZWRlZC5cclxuIjsKKwkJCWJyZWFrOworCQljYXNlIEJIQVJEV0FSTjoKKwkJCW1zZyA9ICIgYmxvY2sgbGltaXQgcmVhY2hlZC5cclxuIjsKKwkJCWJyZWFrOworCQljYXNlIEJTT0ZUTE9OR1dBUk46CisJCQltc2cgPSAiIGJsb2NrIHF1b3RhIGV4Y2VlZGVkIHRvbyBsb25nLlxyXG4iOworCQkJYnJlYWs7CisJCWNhc2UgQlNPRlRXQVJOOgorCQkJbXNnID0gIiBibG9jayBxdW90YSBleGNlZWRlZC5cclxuIjsKKwkJCWJyZWFrOworCX0KKwl0dHlfd3JpdGVfbWVzc2FnZShjdXJyZW50LT5zaWduYWwtPnR0eSwgbXNnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX3dhcm5pbmdzKHN0cnVjdCBkcXVvdCAqKmRxdW90cywgY2hhciAqd2FybnR5cGUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYUVVPVEFTOyBpKyspCisJCWlmIChkcXVvdHNbaV0gIT0gTk9EUVVPVCAmJiB3YXJudHlwZVtpXSAhPSBOT1dBUk4pCisJCQlwcmludF93YXJuaW5nKGRxdW90c1tpXSwgd2FybnR5cGVbaV0pOworfQorCitzdGF0aWMgaW5saW5lIGNoYXIgaWdub3JlX2hhcmRsaW1pdChzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCXN0cnVjdCBtZW1fZHFpbmZvICppbmZvID0gJnNiX2Rxb3B0KGRxdW90LT5kcV9zYiktPmluZm9bZHF1b3QtPmRxX3R5cGVdOworCisJcmV0dXJuIGNhcGFibGUoQ0FQX1NZU19SRVNPVVJDRSkgJiYKKwkgICAgKGluZm8tPmRxaV9mb3JtYXQtPnFmX2ZtdF9pZCAhPSBRRk1UX1ZGU19PTEQgfHwgIShpbmZvLT5kcWlfZmxhZ3MgJiBWMV9EUUZfUlNRVUFTSCkpOworfQorCisvKiBuZWVkcyBkcV9kYXRhX2xvY2sgKi8KK3N0YXRpYyBpbnQgY2hlY2tfaWRxKHN0cnVjdCBkcXVvdCAqZHF1b3QsIHVsb25nIGlub2RlcywgY2hhciAqd2FybnR5cGUpCit7CisJKndhcm50eXBlID0gTk9XQVJOOworCWlmIChpbm9kZXMgPD0gMCB8fCB0ZXN0X2JpdChEUV9GQUtFX0IsICZkcXVvdC0+ZHFfZmxhZ3MpKQorCQlyZXR1cm4gUVVPVEFfT0s7CisKKwlpZiAoZHF1b3QtPmRxX2RxYi5kcWJfaWhhcmRsaW1pdCAmJgorCSAgIChkcXVvdC0+ZHFfZHFiLmRxYl9jdXJpbm9kZXMgKyBpbm9kZXMpID4gZHF1b3QtPmRxX2RxYi5kcWJfaWhhcmRsaW1pdCAmJgorICAgICAgICAgICAgIWlnbm9yZV9oYXJkbGltaXQoZHF1b3QpKSB7CisJCSp3YXJudHlwZSA9IElIQVJEV0FSTjsKKwkJcmV0dXJuIE5PX1FVT1RBOworCX0KKworCWlmIChkcXVvdC0+ZHFfZHFiLmRxYl9pc29mdGxpbWl0ICYmCisJICAgKGRxdW90LT5kcV9kcWIuZHFiX2N1cmlub2RlcyArIGlub2RlcykgPiBkcXVvdC0+ZHFfZHFiLmRxYl9pc29mdGxpbWl0ICYmCisJICAgIGRxdW90LT5kcV9kcWIuZHFiX2l0aW1lICYmIGdldF9zZWNvbmRzKCkgPj0gZHF1b3QtPmRxX2RxYi5kcWJfaXRpbWUgJiYKKyAgICAgICAgICAgICFpZ25vcmVfaGFyZGxpbWl0KGRxdW90KSkgeworCQkqd2FybnR5cGUgPSBJU09GVExPTkdXQVJOOworCQlyZXR1cm4gTk9fUVVPVEE7CisJfQorCisJaWYgKGRxdW90LT5kcV9kcWIuZHFiX2lzb2Z0bGltaXQgJiYKKwkgICAoZHF1b3QtPmRxX2RxYi5kcWJfY3VyaW5vZGVzICsgaW5vZGVzKSA+IGRxdW90LT5kcV9kcWIuZHFiX2lzb2Z0bGltaXQgJiYKKwkgICAgZHF1b3QtPmRxX2RxYi5kcWJfaXRpbWUgPT0gMCkgeworCQkqd2FybnR5cGUgPSBJU09GVFdBUk47CisJCWRxdW90LT5kcV9kcWIuZHFiX2l0aW1lID0gZ2V0X3NlY29uZHMoKSArIHNiX2Rxb3B0KGRxdW90LT5kcV9zYiktPmluZm9bZHF1b3QtPmRxX3R5cGVdLmRxaV9pZ3JhY2U7CisJfQorCisJcmV0dXJuIFFVT1RBX09LOworfQorCisvKiBuZWVkcyBkcV9kYXRhX2xvY2sgKi8KK3N0YXRpYyBpbnQgY2hlY2tfYmRxKHN0cnVjdCBkcXVvdCAqZHF1b3QsIHFzaXplX3Qgc3BhY2UsIGludCBwcmVhbGxvYywgY2hhciAqd2FybnR5cGUpCit7CisJKndhcm50eXBlID0gMDsKKwlpZiAoc3BhY2UgPD0gMCB8fCB0ZXN0X2JpdChEUV9GQUtFX0IsICZkcXVvdC0+ZHFfZmxhZ3MpKQorCQlyZXR1cm4gUVVPVEFfT0s7CisKKwlpZiAoZHF1b3QtPmRxX2RxYi5kcWJfYmhhcmRsaW1pdCAmJgorCSAgIHRvcWIoZHF1b3QtPmRxX2RxYi5kcWJfY3Vyc3BhY2UgKyBzcGFjZSkgPiBkcXVvdC0+ZHFfZHFiLmRxYl9iaGFyZGxpbWl0ICYmCisgICAgICAgICAgICAhaWdub3JlX2hhcmRsaW1pdChkcXVvdCkpIHsKKwkJaWYgKCFwcmVhbGxvYykKKwkJCSp3YXJudHlwZSA9IEJIQVJEV0FSTjsKKwkJcmV0dXJuIE5PX1FVT1RBOworCX0KKworCWlmIChkcXVvdC0+ZHFfZHFiLmRxYl9ic29mdGxpbWl0ICYmCisJICAgdG9xYihkcXVvdC0+ZHFfZHFiLmRxYl9jdXJzcGFjZSArIHNwYWNlKSA+IGRxdW90LT5kcV9kcWIuZHFiX2Jzb2Z0bGltaXQgJiYKKwkgICAgZHF1b3QtPmRxX2RxYi5kcWJfYnRpbWUgJiYgZ2V0X3NlY29uZHMoKSA+PSBkcXVvdC0+ZHFfZHFiLmRxYl9idGltZSAmJgorICAgICAgICAgICAgIWlnbm9yZV9oYXJkbGltaXQoZHF1b3QpKSB7CisJCWlmICghcHJlYWxsb2MpCisJCQkqd2FybnR5cGUgPSBCU09GVExPTkdXQVJOOworCQlyZXR1cm4gTk9fUVVPVEE7CisJfQorCisJaWYgKGRxdW90LT5kcV9kcWIuZHFiX2Jzb2Z0bGltaXQgJiYKKwkgICB0b3FiKGRxdW90LT5kcV9kcWIuZHFiX2N1cnNwYWNlICsgc3BhY2UpID4gZHF1b3QtPmRxX2RxYi5kcWJfYnNvZnRsaW1pdCAmJgorCSAgICBkcXVvdC0+ZHFfZHFiLmRxYl9idGltZSA9PSAwKSB7CisJCWlmICghcHJlYWxsb2MpIHsKKwkJCSp3YXJudHlwZSA9IEJTT0ZUV0FSTjsKKwkJCWRxdW90LT5kcV9kcWIuZHFiX2J0aW1lID0gZ2V0X3NlY29uZHMoKSArIHNiX2Rxb3B0KGRxdW90LT5kcV9zYiktPmluZm9bZHF1b3QtPmRxX3R5cGVdLmRxaV9iZ3JhY2U7CisJCX0KKwkJZWxzZQorCQkJLyoKKwkJCSAqIFdlIGRvbid0IGFsbG93IHByZWFsbG9jYXRpb24gdG8gZXhjZWVkIHNvZnRsaW1pdCBzbyBleGNlZWRpbmcgd2lsbAorCQkJICogYmUgYWx3YXlzIHByaW50ZWQKKwkJCSAqLworCQkJcmV0dXJuIE5PX1FVT1RBOworCX0KKworCXJldHVybiBRVU9UQV9PSzsKK30KKworLyoKKyAqCUluaXRpYWxpemUgcXVvdGEgcG9pbnRlcnMgaW4gaW5vZGUKKyAqCVRyYW5zYWN0aW9uIG11c3QgYmUgc3RhcnRlZCBhdCBlbnRyeQorICovCitpbnQgZHF1b3RfaW5pdGlhbGl6ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSkKK3sKKwl1bnNpZ25lZCBpbnQgaWQgPSAwOworCWludCBjbnQsIHJldCA9IDA7CisKKwkvKiBGaXJzdCB0ZXN0IGJlZm9yZSBhY3F1aXJpbmcgc2VtYXBob3JlIC0gc29sdmVzIGRlYWRsb2NrcyB3aGVuIHdlCisgICAgICAgICAqIHJlLWVudGVyIHRoZSBxdW90YSBjb2RlIGFuZCBhcmUgYWxyZWFkeSBob2xkaW5nIHRoZSBzZW1hcGhvcmUgKi8KKwlpZiAoSVNfTk9RVU9UQShpbm9kZSkpCisJCXJldHVybiAwOworCWRvd25fd3JpdGUoJnNiX2Rxb3B0KGlub2RlLT5pX3NiKS0+ZHFwdHJfc2VtKTsKKwkvKiBIYXZpbmcgZHFwdHJfc2VtIHdlIGtub3cgTk9RVU9UQSBmbGFncyBjYW4ndCBiZSBhbHRlcmVkLi4uICovCisJaWYgKElTX05PUVVPVEEoaW5vZGUpKQorCQlnb3RvIG91dF9lcnI7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhRVU9UQVM7IGNudCsrKSB7CisJCWlmICh0eXBlICE9IC0xICYmIGNudCAhPSB0eXBlKQorCQkJY29udGludWU7CisJCWlmIChpbm9kZS0+aV9kcXVvdFtjbnRdID09IE5PRFFVT1QpIHsKKwkJCXN3aXRjaCAoY250KSB7CisJCQkJY2FzZSBVU1JRVU9UQToKKwkJCQkJaWQgPSBpbm9kZS0+aV91aWQ7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgR1JQUVVPVEE6CisJCQkJCWlkID0gaW5vZGUtPmlfZ2lkOworCQkJCQlicmVhazsKKwkJCX0KKwkJCWlub2RlLT5pX2RxdW90W2NudF0gPSBkcWdldChpbm9kZS0+aV9zYiwgaWQsIGNudCk7CisJCX0KKwl9CitvdXRfZXJyOgorCXVwX3dyaXRlKCZzYl9kcW9wdChpbm9kZS0+aV9zYiktPmRxcHRyX3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIAlSZWxlYXNlIGFsbCBxdW90YXMgcmVmZXJlbmNlZCBieSBpbm9kZQorICoJVHJhbnNhY3Rpb24gbXVzdCBiZSBzdGFydGVkIGF0IGFuIGVudHJ5CisgKi8KK2ludCBkcXVvdF9kcm9wKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW50IGNudDsKKworCWRvd25fd3JpdGUoJnNiX2Rxb3B0KGlub2RlLT5pX3NiKS0+ZHFwdHJfc2VtKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IE1BWFFVT1RBUzsgY250KyspIHsKKwkJaWYgKGlub2RlLT5pX2RxdW90W2NudF0gIT0gTk9EUVVPVCkgeworCQkJZHFwdXQoaW5vZGUtPmlfZHF1b3RbY250XSk7CisJCQlpbm9kZS0+aV9kcXVvdFtjbnRdID0gTk9EUVVPVDsKKwkJfQorCX0KKwl1cF93cml0ZSgmc2JfZHFvcHQoaW5vZGUtPmlfc2IpLT5kcXB0cl9zZW0pOworCXJldHVybiAwOworfQorCisvKgorICogRm9sbG93aW5nIGZvdXIgZnVuY3Rpb25zIHVwZGF0ZSBpX2Jsb2NrcytpX2J5dGVzIGZpZWxkcyBhbmQKKyAqIHF1b3RhIGluZm9ybWF0aW9uICh0b2dldGhlciB3aXRoIGFwcHJvcHJpYXRlIGNoZWNrcykKKyAqIE5PVEU6IFdlIGFic29sdXRlbHkgcmVseSBvbiB0aGUgZmFjdCB0aGF0IGNhbGxlciBkaXJ0aWVzCisgKiB0aGUgaW5vZGUgKHVzdWFsbHkgbWFjcm9zIGluIHF1b3Rhb3BzLmggY2FyZSBhYm91dCB0aGlzKSBhbmQKKyAqIGhvbGRzIGEgaGFuZGxlIGZvciB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBzbyB0aGF0IGRxdW90IHdyaXRlIGFuZAorICogaW5vZGUgd3JpdGUgZ28gaW50byB0aGUgc2FtZSB0cmFuc2FjdGlvbi4KKyAqLworCisvKgorICogVGhpcyBvcGVyYXRpb24gY2FuIGJsb2NrLCBidXQgb25seSBhZnRlciBldmVyeXRoaW5nIGlzIHVwZGF0ZWQKKyAqLworaW50IGRxdW90X2FsbG9jX3NwYWNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHFzaXplX3QgbnVtYmVyLCBpbnQgd2FybikKK3sKKwlpbnQgY250LCByZXQgPSBOT19RVU9UQTsKKwljaGFyIHdhcm50eXBlW01BWFFVT1RBU107CisKKwkvKiBGaXJzdCB0ZXN0IGJlZm9yZSBhY3F1aXJpbmcgc2VtYXBob3JlIC0gc29sdmVzIGRlYWRsb2NrcyB3aGVuIHdlCisgICAgICAgICAqIHJlLWVudGVyIHRoZSBxdW90YSBjb2RlIGFuZCBhcmUgYWxyZWFkeSBob2xkaW5nIHRoZSBzZW1hcGhvcmUgKi8KKwlpZiAoSVNfTk9RVU9UQShpbm9kZSkpIHsKK291dF9hZGQ6CisJCWlub2RlX2FkZF9ieXRlcyhpbm9kZSwgbnVtYmVyKTsKKwkJcmV0dXJuIFFVT1RBX09LOworCX0KKwlmb3IgKGNudCA9IDA7IGNudCA8IE1BWFFVT1RBUzsgY250KyspCisJCXdhcm50eXBlW2NudF0gPSBOT1dBUk47CisKKwlkb3duX3JlYWQoJnNiX2Rxb3B0KGlub2RlLT5pX3NiKS0+ZHFwdHJfc2VtKTsKKwlpZiAoSVNfTk9RVU9UQShpbm9kZSkpIHsJLyogTm93IHdlIGNhbiBkbyByZWxpYWJsZSB0ZXN0Li4uICovCisJCXVwX3JlYWQoJnNiX2Rxb3B0KGlub2RlLT5pX3NiKS0+ZHFwdHJfc2VtKTsKKwkJZ290byBvdXRfYWRkOworCX0KKwlzcGluX2xvY2soJmRxX2RhdGFfbG9jayk7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhRVU9UQVM7IGNudCsrKSB7CisJCWlmIChpbm9kZS0+aV9kcXVvdFtjbnRdID09IE5PRFFVT1QpCisJCQljb250aW51ZTsKKwkJaWYgKGNoZWNrX2JkcShpbm9kZS0+aV9kcXVvdFtjbnRdLCBudW1iZXIsIHdhcm4sIHdhcm50eXBlK2NudCkgPT0gTk9fUVVPVEEpCisJCQlnb3RvIHdhcm5fcHV0X2FsbDsKKwl9CisJZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhRVU9UQVM7IGNudCsrKSB7CisJCWlmIChpbm9kZS0+aV9kcXVvdFtjbnRdID09IE5PRFFVT1QpCisJCQljb250aW51ZTsKKwkJZHF1b3RfaW5jcl9zcGFjZShpbm9kZS0+aV9kcXVvdFtjbnRdLCBudW1iZXIpOworCX0KKwlpbm9kZV9hZGRfYnl0ZXMoaW5vZGUsIG51bWJlcik7CisJcmV0ID0gUVVPVEFfT0s7Cit3YXJuX3B1dF9hbGw6CisJc3Bpbl91bmxvY2soJmRxX2RhdGFfbG9jayk7CisJaWYgKHJldCA9PSBRVU9UQV9PSykKKwkJLyogRGlydGlmeSBhbGwgdGhlIGRxdW90cyAtIHRoaXMgY2FuIGJsb2NrIHdoZW4gam91cm5hbGxpbmcgKi8KKwkJZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhRVU9UQVM7IGNudCsrKQorCQkJaWYgKGlub2RlLT5pX2RxdW90W2NudF0pCisJCQkJbWFya19kcXVvdF9kaXJ0eShpbm9kZS0+aV9kcXVvdFtjbnRdKTsKKwlmbHVzaF93YXJuaW5ncyhpbm9kZS0+aV9kcXVvdCwgd2FybnR5cGUpOworCXVwX3JlYWQoJnNiX2Rxb3B0KGlub2RlLT5pX3NiKS0+ZHFwdHJfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogVGhpcyBvcGVyYXRpb24gY2FuIGJsb2NrLCBidXQgb25seSBhZnRlciBldmVyeXRoaW5nIGlzIHVwZGF0ZWQKKyAqLworaW50IGRxdW90X2FsbG9jX2lub2RlKGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGxvbmcgbnVtYmVyKQoreworCWludCBjbnQsIHJldCA9IE5PX1FVT1RBOworCWNoYXIgd2FybnR5cGVbTUFYUVVPVEFTXTsKKworCS8qIEZpcnN0IHRlc3QgYmVmb3JlIGFjcXVpcmluZyBzZW1hcGhvcmUgLSBzb2x2ZXMgZGVhZGxvY2tzIHdoZW4gd2UKKyAgICAgICAgICogcmUtZW50ZXIgdGhlIHF1b3RhIGNvZGUgYW5kIGFyZSBhbHJlYWR5IGhvbGRpbmcgdGhlIHNlbWFwaG9yZSAqLworCWlmIChJU19OT1FVT1RBKGlub2RlKSkKKwkJcmV0dXJuIFFVT1RBX09LOworCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykKKwkJd2FybnR5cGVbY250XSA9IE5PV0FSTjsKKwlkb3duX3JlYWQoJnNiX2Rxb3B0KGlub2RlLT5pX3NiKS0+ZHFwdHJfc2VtKTsKKwlpZiAoSVNfTk9RVU9UQShpbm9kZSkpIHsKKwkJdXBfcmVhZCgmc2JfZHFvcHQoaW5vZGUtPmlfc2IpLT5kcXB0cl9zZW0pOworCQlyZXR1cm4gUVVPVEFfT0s7CisJfQorCXNwaW5fbG9jaygmZHFfZGF0YV9sb2NrKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IE1BWFFVT1RBUzsgY250KyspIHsKKwkJaWYgKGlub2RlLT5pX2RxdW90W2NudF0gPT0gTk9EUVVPVCkKKwkJCWNvbnRpbnVlOworCQlpZiAoY2hlY2tfaWRxKGlub2RlLT5pX2RxdW90W2NudF0sIG51bWJlciwgd2FybnR5cGUrY250KSA9PSBOT19RVU9UQSkKKwkJCWdvdG8gd2Fybl9wdXRfYWxsOworCX0KKworCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykgeworCQlpZiAoaW5vZGUtPmlfZHF1b3RbY250XSA9PSBOT0RRVU9UKQorCQkJY29udGludWU7CisJCWRxdW90X2luY3JfaW5vZGVzKGlub2RlLT5pX2RxdW90W2NudF0sIG51bWJlcik7CisJfQorCXJldCA9IFFVT1RBX09LOword2Fybl9wdXRfYWxsOgorCXNwaW5fdW5sb2NrKCZkcV9kYXRhX2xvY2spOworCWlmIChyZXQgPT0gUVVPVEFfT0spCisJCS8qIERpcnRpZnkgYWxsIHRoZSBkcXVvdHMgLSB0aGlzIGNhbiBibG9jayB3aGVuIGpvdXJuYWxsaW5nICovCisJCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykKKwkJCWlmIChpbm9kZS0+aV9kcXVvdFtjbnRdKQorCQkJCW1hcmtfZHF1b3RfZGlydHkoaW5vZGUtPmlfZHF1b3RbY250XSk7CisJZmx1c2hfd2FybmluZ3MoKHN0cnVjdCBkcXVvdCAqKilpbm9kZS0+aV9kcXVvdCwgd2FybnR5cGUpOworCXVwX3JlYWQoJnNiX2Rxb3B0KGlub2RlLT5pX3NiKS0+ZHFwdHJfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogVGhpcyBvcGVyYXRpb24gY2FuIGJsb2NrLCBidXQgb25seSBhZnRlciBldmVyeXRoaW5nIGlzIHVwZGF0ZWQKKyAqLworaW50IGRxdW90X2ZyZWVfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSwgcXNpemVfdCBudW1iZXIpCit7CisJdW5zaWduZWQgaW50IGNudDsKKworCS8qIEZpcnN0IHRlc3QgYmVmb3JlIGFjcXVpcmluZyBzZW1hcGhvcmUgLSBzb2x2ZXMgZGVhZGxvY2tzIHdoZW4gd2UKKyAgICAgICAgICogcmUtZW50ZXIgdGhlIHF1b3RhIGNvZGUgYW5kIGFyZSBhbHJlYWR5IGhvbGRpbmcgdGhlIHNlbWFwaG9yZSAqLworCWlmIChJU19OT1FVT1RBKGlub2RlKSkgeworb3V0X3N1YjoKKwkJaW5vZGVfc3ViX2J5dGVzKGlub2RlLCBudW1iZXIpOworCQlyZXR1cm4gUVVPVEFfT0s7CisJfQorCWRvd25fcmVhZCgmc2JfZHFvcHQoaW5vZGUtPmlfc2IpLT5kcXB0cl9zZW0pOworCS8qIE5vdyByZWNoZWNrIHJlbGlhYmx5IHdoZW4gaG9sZGluZyBkcXB0cl9zZW0gKi8KKwlpZiAoSVNfTk9RVU9UQShpbm9kZSkpIHsKKwkJdXBfcmVhZCgmc2JfZHFvcHQoaW5vZGUtPmlfc2IpLT5kcXB0cl9zZW0pOworCQlnb3RvIG91dF9zdWI7CisJfQorCXNwaW5fbG9jaygmZHFfZGF0YV9sb2NrKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IE1BWFFVT1RBUzsgY250KyspIHsKKwkJaWYgKGlub2RlLT5pX2RxdW90W2NudF0gPT0gTk9EUVVPVCkKKwkJCWNvbnRpbnVlOworCQlkcXVvdF9kZWNyX3NwYWNlKGlub2RlLT5pX2RxdW90W2NudF0sIG51bWJlcik7CisJfQorCWlub2RlX3N1Yl9ieXRlcyhpbm9kZSwgbnVtYmVyKTsKKwlzcGluX3VubG9jaygmZHFfZGF0YV9sb2NrKTsKKwkvKiBEaXJ0aWZ5IGFsbCB0aGUgZHF1b3RzIC0gdGhpcyBjYW4gYmxvY2sgd2hlbiBqb3VybmFsbGluZyAqLworCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykKKwkJaWYgKGlub2RlLT5pX2RxdW90W2NudF0pCisJCQltYXJrX2RxdW90X2RpcnR5KGlub2RlLT5pX2RxdW90W2NudF0pOworCXVwX3JlYWQoJnNiX2Rxb3B0KGlub2RlLT5pX3NiKS0+ZHFwdHJfc2VtKTsKKwlyZXR1cm4gUVVPVEFfT0s7Cit9CisKKy8qCisgKiBUaGlzIG9wZXJhdGlvbiBjYW4gYmxvY2ssIGJ1dCBvbmx5IGFmdGVyIGV2ZXJ5dGhpbmcgaXMgdXBkYXRlZAorICovCitpbnQgZHF1b3RfZnJlZV9pbm9kZShjb25zdCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIG51bWJlcikKK3sKKwl1bnNpZ25lZCBpbnQgY250OworCisJLyogRmlyc3QgdGVzdCBiZWZvcmUgYWNxdWlyaW5nIHNlbWFwaG9yZSAtIHNvbHZlcyBkZWFkbG9ja3Mgd2hlbiB3ZQorICAgICAgICAgKiByZS1lbnRlciB0aGUgcXVvdGEgY29kZSBhbmQgYXJlIGFscmVhZHkgaG9sZGluZyB0aGUgc2VtYXBob3JlICovCisJaWYgKElTX05PUVVPVEEoaW5vZGUpKQorCQlyZXR1cm4gUVVPVEFfT0s7CisJZG93bl9yZWFkKCZzYl9kcW9wdChpbm9kZS0+aV9zYiktPmRxcHRyX3NlbSk7CisJLyogTm93IHJlY2hlY2sgcmVsaWFibHkgd2hlbiBob2xkaW5nIGRxcHRyX3NlbSAqLworCWlmIChJU19OT1FVT1RBKGlub2RlKSkgeworCQl1cF9yZWFkKCZzYl9kcW9wdChpbm9kZS0+aV9zYiktPmRxcHRyX3NlbSk7CisJCXJldHVybiBRVU9UQV9PSzsKKwl9CisJc3Bpbl9sb2NrKCZkcV9kYXRhX2xvY2spOworCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykgeworCQlpZiAoaW5vZGUtPmlfZHF1b3RbY250XSA9PSBOT0RRVU9UKQorCQkJY29udGludWU7CisJCWRxdW90X2RlY3JfaW5vZGVzKGlub2RlLT5pX2RxdW90W2NudF0sIG51bWJlcik7CisJfQorCXNwaW5fdW5sb2NrKCZkcV9kYXRhX2xvY2spOworCS8qIERpcnRpZnkgYWxsIHRoZSBkcXVvdHMgLSB0aGlzIGNhbiBibG9jayB3aGVuIGpvdXJuYWxsaW5nICovCisJZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhRVU9UQVM7IGNudCsrKQorCQlpZiAoaW5vZGUtPmlfZHF1b3RbY250XSkKKwkJCW1hcmtfZHF1b3RfZGlydHkoaW5vZGUtPmlfZHF1b3RbY250XSk7CisJdXBfcmVhZCgmc2JfZHFvcHQoaW5vZGUtPmlfc2IpLT5kcXB0cl9zZW0pOworCXJldHVybiBRVU9UQV9PSzsKK30KKworLyoKKyAqIFRyYW5zZmVyIHRoZSBudW1iZXIgb2YgaW5vZGUgYW5kIGJsb2NrcyBmcm9tIG9uZSBkaXNrcXVvdGEgdG8gYW4gb3RoZXIuCisgKgorICogVGhpcyBvcGVyYXRpb24gY2FuIGJsb2NrLCBidXQgb25seSBhZnRlciBldmVyeXRoaW5nIGlzIHVwZGF0ZWQKKyAqIEEgdHJhbnNhY3Rpb24gbXVzdCBiZSBzdGFydGVkIHdoZW4gZW50ZXJpbmcgdGhpcyBmdW5jdGlvbi4KKyAqLworaW50IGRxdW90X3RyYW5zZmVyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpYXR0ciAqaWF0dHIpCit7CisJcXNpemVfdCBzcGFjZTsKKwlzdHJ1Y3QgZHF1b3QgKnRyYW5zZmVyX2Zyb21bTUFYUVVPVEFTXTsKKwlzdHJ1Y3QgZHF1b3QgKnRyYW5zZmVyX3RvW01BWFFVT1RBU107CisJaW50IGNudCwgcmV0ID0gTk9fUVVPVEEsIGNodWlkID0gKGlhdHRyLT5pYV92YWxpZCAmIEFUVFJfVUlEKSAmJiBpbm9kZS0+aV91aWQgIT0gaWF0dHItPmlhX3VpZCwKKwkgICAgY2hnaWQgPSAoaWF0dHItPmlhX3ZhbGlkICYgQVRUUl9HSUQpICYmIGlub2RlLT5pX2dpZCAhPSBpYXR0ci0+aWFfZ2lkOworCWNoYXIgd2FybnR5cGVbTUFYUVVPVEFTXTsKKworCS8qIEZpcnN0IHRlc3QgYmVmb3JlIGFjcXVpcmluZyBzZW1hcGhvcmUgLSBzb2x2ZXMgZGVhZGxvY2tzIHdoZW4gd2UKKyAgICAgICAgICogcmUtZW50ZXIgdGhlIHF1b3RhIGNvZGUgYW5kIGFyZSBhbHJlYWR5IGhvbGRpbmcgdGhlIHNlbWFwaG9yZSAqLworCWlmIChJU19OT1FVT1RBKGlub2RlKSkKKwkJcmV0dXJuIFFVT1RBX09LOworCS8qIENsZWFyIHRoZSBhcnJheXMgKi8KKwlmb3IgKGNudCA9IDA7IGNudCA8IE1BWFFVT1RBUzsgY250KyspIHsKKwkJdHJhbnNmZXJfdG9bY250XSA9IHRyYW5zZmVyX2Zyb21bY250XSA9IE5PRFFVT1Q7CisJCXdhcm50eXBlW2NudF0gPSBOT1dBUk47CisJfQorCWRvd25fd3JpdGUoJnNiX2Rxb3B0KGlub2RlLT5pX3NiKS0+ZHFwdHJfc2VtKTsKKwkvKiBOb3cgcmVjaGVjayByZWxpYWJseSB3aGVuIGhvbGRpbmcgZHFwdHJfc2VtICovCisJaWYgKElTX05PUVVPVEEoaW5vZGUpKSB7CS8qIEZpbGUgd2l0aG91dCBxdW90YSBhY2NvdW50aW5nPyAqLworCQl1cF93cml0ZSgmc2JfZHFvcHQoaW5vZGUtPmlfc2IpLT5kcXB0cl9zZW0pOworCQlyZXR1cm4gUVVPVEFfT0s7CisJfQorCS8qIEZpcnN0IGJ1aWxkIHRoZSB0cmFuc2Zlcl90byBsaXN0IC0gaGVyZSB3ZSBjYW4gYmxvY2sgb24KKwkgKiByZWFkaW5nL2luc3RhbnRpYXRpbmcgb2YgZHF1b3RzLiAgV2Uga25vdyB0aGF0IHRoZSB0cmFuc2FjdGlvbiBmb3IKKwkgKiB1cyB3YXMgYWxyZWFkeSBzdGFydGVkIHNvIHdlIGRvbid0IHZpb2xhdGUgbG9jayByYW5raW5nIGhlcmUgKi8KKwlmb3IgKGNudCA9IDA7IGNudCA8IE1BWFFVT1RBUzsgY250KyspIHsKKwkJc3dpdGNoIChjbnQpIHsKKwkJCWNhc2UgVVNSUVVPVEE6CisJCQkJaWYgKCFjaHVpZCkKKwkJCQkJY29udGludWU7CisJCQkJdHJhbnNmZXJfdG9bY250XSA9IGRxZ2V0KGlub2RlLT5pX3NiLCBpYXR0ci0+aWFfdWlkLCBjbnQpOworCQkJCWJyZWFrOworCQkJY2FzZSBHUlBRVU9UQToKKwkJCQlpZiAoIWNoZ2lkKQorCQkJCQljb250aW51ZTsKKwkJCQl0cmFuc2Zlcl90b1tjbnRdID0gZHFnZXQoaW5vZGUtPmlfc2IsIGlhdHRyLT5pYV9naWQsIGNudCk7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl9sb2NrKCZkcV9kYXRhX2xvY2spOworCXNwYWNlID0gaW5vZGVfZ2V0X2J5dGVzKGlub2RlKTsKKwkvKiBCdWlsZCB0aGUgdHJhbnNmZXJfZnJvbSBsaXN0IGFuZCBjaGVjayB0aGUgbGltaXRzICovCisJZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhRVU9UQVM7IGNudCsrKSB7CisJCWlmICh0cmFuc2Zlcl90b1tjbnRdID09IE5PRFFVT1QpCisJCQljb250aW51ZTsKKwkJdHJhbnNmZXJfZnJvbVtjbnRdID0gaW5vZGUtPmlfZHF1b3RbY250XTsKKwkJaWYgKGNoZWNrX2lkcSh0cmFuc2Zlcl90b1tjbnRdLCAxLCB3YXJudHlwZStjbnQpID09IE5PX1FVT1RBIHx8CisJCSAgICBjaGVja19iZHEodHJhbnNmZXJfdG9bY250XSwgc3BhY2UsIDAsIHdhcm50eXBlK2NudCkgPT0gTk9fUVVPVEEpCisJCQlnb3RvIHdhcm5fcHV0X2FsbDsKKwl9CisKKwkvKgorCSAqIEZpbmFsbHkgcGVyZm9ybSB0aGUgbmVlZGVkIHRyYW5zZmVyIGZyb20gdHJhbnNmZXJfZnJvbSB0byB0cmFuc2Zlcl90bworCSAqLworCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykgeworCQkvKgorCQkgKiBTa2lwIGNoYW5nZXMgZm9yIHNhbWUgdWlkIG9yIGdpZCBvciBmb3IgdHVybmVkIG9mZiBxdW90YS10eXBlLgorCQkgKi8KKwkJaWYgKHRyYW5zZmVyX3RvW2NudF0gPT0gTk9EUVVPVCkKKwkJCWNvbnRpbnVlOworCisJCS8qIER1ZSB0byBJTyBlcnJvciB3ZSBtaWdodCBub3QgaGF2ZSB0cmFuc2Zlcl9mcm9tW10gc3RydWN0dXJlICovCisJCWlmICh0cmFuc2Zlcl9mcm9tW2NudF0pIHsKKwkJCWRxdW90X2RlY3JfaW5vZGVzKHRyYW5zZmVyX2Zyb21bY250XSwgMSk7CisJCQlkcXVvdF9kZWNyX3NwYWNlKHRyYW5zZmVyX2Zyb21bY250XSwgc3BhY2UpOworCQl9CisKKwkJZHF1b3RfaW5jcl9pbm9kZXModHJhbnNmZXJfdG9bY250XSwgMSk7CisJCWRxdW90X2luY3Jfc3BhY2UodHJhbnNmZXJfdG9bY250XSwgc3BhY2UpOworCisJCWlub2RlLT5pX2RxdW90W2NudF0gPSB0cmFuc2Zlcl90b1tjbnRdOworCX0KKwlyZXQgPSBRVU9UQV9PSzsKK3dhcm5fcHV0X2FsbDoKKwlzcGluX3VubG9jaygmZHFfZGF0YV9sb2NrKTsKKwkvKiBEaXJ0aWZ5IGFsbCB0aGUgZHF1b3RzIC0gdGhpcyBjYW4gYmxvY2sgd2hlbiBqb3VybmFsbGluZyAqLworCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykgeworCQlpZiAodHJhbnNmZXJfZnJvbVtjbnRdKQorCQkJbWFya19kcXVvdF9kaXJ0eSh0cmFuc2Zlcl9mcm9tW2NudF0pOworCQlpZiAodHJhbnNmZXJfdG9bY250XSkKKwkJCW1hcmtfZHF1b3RfZGlydHkodHJhbnNmZXJfdG9bY250XSk7CisJfQorCWZsdXNoX3dhcm5pbmdzKHRyYW5zZmVyX3RvLCB3YXJudHlwZSk7CisJCisJZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhRVU9UQVM7IGNudCsrKSB7CisJCWlmIChyZXQgPT0gUVVPVEFfT0sgJiYgdHJhbnNmZXJfZnJvbVtjbnRdICE9IE5PRFFVT1QpCisJCQlkcXB1dCh0cmFuc2Zlcl9mcm9tW2NudF0pOworCQlpZiAocmV0ID09IE5PX1FVT1RBICYmIHRyYW5zZmVyX3RvW2NudF0gIT0gTk9EUVVPVCkKKwkJCWRxcHV0KHRyYW5zZmVyX3RvW2NudF0pOworCX0KKwl1cF93cml0ZSgmc2JfZHFvcHQoaW5vZGUtPmlfc2IpLT5kcXB0cl9zZW0pOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBXcml0ZSBpbmZvIG9mIHF1b3RhIGZpbGUgdG8gZGlzaworICovCitpbnQgZHF1b3RfY29tbWl0X2luZm8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcXVvdGFfaW5mbyAqZHFvcHQgPSBzYl9kcW9wdChzYik7CisKKwlkb3duKCZkcW9wdC0+ZHFpb19zZW0pOworCXJldCA9IGRxb3B0LT5vcHNbdHlwZV0tPndyaXRlX2ZpbGVfaW5mbyhzYiwgdHlwZSk7CisJdXAoJmRxb3B0LT5kcWlvX3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIERlZmluaXRpb25zIG9mIGRpc2txdW90YSBvcGVyYXRpb25zLgorICovCitzdHJ1Y3QgZHF1b3Rfb3BlcmF0aW9ucyBkcXVvdF9vcGVyYXRpb25zID0geworCS5pbml0aWFsaXplCT0gZHF1b3RfaW5pdGlhbGl6ZSwKKwkuZHJvcAkJPSBkcXVvdF9kcm9wLAorCS5hbGxvY19zcGFjZQk9IGRxdW90X2FsbG9jX3NwYWNlLAorCS5hbGxvY19pbm9kZQk9IGRxdW90X2FsbG9jX2lub2RlLAorCS5mcmVlX3NwYWNlCT0gZHF1b3RfZnJlZV9zcGFjZSwKKwkuZnJlZV9pbm9kZQk9IGRxdW90X2ZyZWVfaW5vZGUsCisJLnRyYW5zZmVyCT0gZHF1b3RfdHJhbnNmZXIsCisJLndyaXRlX2RxdW90CT0gZHF1b3RfY29tbWl0LAorCS5hY3F1aXJlX2RxdW90CT0gZHF1b3RfYWNxdWlyZSwKKwkucmVsZWFzZV9kcXVvdAk9IGRxdW90X3JlbGVhc2UsCisJLm1hcmtfZGlydHkJPSBkcXVvdF9tYXJrX2RxdW90X2RpcnR5LAorCS53cml0ZV9pbmZvCT0gZHF1b3RfY29tbWl0X2luZm8KK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZW5hYmxlX2ZsYWdzKHN0cnVjdCBxdW90YV9pbmZvICpkcW9wdCwgaW50IHR5cGUpCit7CisJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgVVNSUVVPVEE6CisJCQlkcW9wdC0+ZmxhZ3MgfD0gRFFVT1RfVVNSX0VOQUJMRUQ7CisJCQlicmVhazsKKwkJY2FzZSBHUlBRVU9UQToKKwkJCWRxb3B0LT5mbGFncyB8PSBEUVVPVF9HUlBfRU5BQkxFRDsKKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlc2V0X2VuYWJsZV9mbGFncyhzdHJ1Y3QgcXVvdGFfaW5mbyAqZHFvcHQsIGludCB0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCQljYXNlIFVTUlFVT1RBOgorCQkJZHFvcHQtPmZsYWdzICY9IH5EUVVPVF9VU1JfRU5BQkxFRDsKKwkJCWJyZWFrOworCQljYXNlIEdSUFFVT1RBOgorCQkJZHFvcHQtPmZsYWdzICY9IH5EUVVPVF9HUlBfRU5BQkxFRDsKKwkJCWJyZWFrOworCX0KK30KKworLyoKKyAqIFR1cm4gcXVvdGEgb2ZmIG9uIGEgZGV2aWNlLiB0eXBlID09IC0xID09PiBxdW90YW9mZiBmb3IgYWxsIHR5cGVzICh1bW91bnQpCisgKi8KK2ludCB2ZnNfcXVvdGFfb2ZmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQoreworCWludCBjbnQ7CisJc3RydWN0IHF1b3RhX2luZm8gKmRxb3B0ID0gc2JfZHFvcHQoc2IpOworCXN0cnVjdCBpbm9kZSAqdG9wdXRpbm9kZVtNQVhRVU9UQVNdOworCXN0cnVjdCB2ZnNtb3VudCAqdG9wdXRtbnRbTUFYUVVPVEFTXTsKKworCS8qIFdlIG5lZWQgdG8gc2VyaWFsaXplIHF1b3RhX29mZigpIGZvciBkZXZpY2UgKi8KKwlkb3duKCZkcW9wdC0+ZHFvbm9mZl9zZW0pOworCWZvciAoY250ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykgeworCQl0b3B1dGlub2RlW2NudF0gPSBOVUxMOworCQl0b3B1dG1udFtjbnRdID0gTlVMTDsKKwkJaWYgKHR5cGUgIT0gLTEgJiYgY250ICE9IHR5cGUpCisJCQljb250aW51ZTsKKwkJaWYgKCFzYl9oYXNfcXVvdGFfZW5hYmxlZChzYiwgY250KSkKKwkJCWNvbnRpbnVlOworCQlyZXNldF9lbmFibGVfZmxhZ3MoZHFvcHQsIGNudCk7CisKKwkJLyogTm90ZTogdGhlc2UgYXJlIGJsb2NraW5nIG9wZXJhdGlvbnMgKi8KKwkJZHJvcF9kcXVvdF9yZWYoc2IsIGNudCk7CisJCWludmFsaWRhdGVfZHF1b3RzKHNiLCBjbnQpOworCQkvKgorCQkgKiBOb3cgYWxsIGRxdW90cyBzaG91bGQgYmUgaW52YWxpZGF0ZWQsIGFsbCB3cml0ZXMgZG9uZSBzbyB3ZSBzaG91bGQgYmUgb25seQorCQkgKiB1c2VycyBvZiB0aGUgaW5mby4gTm8gbG9ja3MgbmVlZGVkLgorCQkgKi8KKwkJaWYgKGluZm9fZGlydHkoJmRxb3B0LT5pbmZvW2NudF0pKQorCQkJc2ItPmRxX29wLT53cml0ZV9pbmZvKHNiLCBjbnQpOworCQlpZiAoZHFvcHQtPm9wc1tjbnRdLT5mcmVlX2ZpbGVfaW5mbykKKwkJCWRxb3B0LT5vcHNbY250XS0+ZnJlZV9maWxlX2luZm8oc2IsIGNudCk7CisJCXB1dF9xdW90YV9mb3JtYXQoZHFvcHQtPmluZm9bY250XS5kcWlfZm9ybWF0KTsKKworCQl0b3B1dGlub2RlW2NudF0gPSBkcW9wdC0+ZmlsZXNbY250XTsKKwkJdG9wdXRtbnRbY250XSA9IGRxb3B0LT5tbnRbY250XTsKKwkJZHFvcHQtPmZpbGVzW2NudF0gPSBOVUxMOworCQlkcW9wdC0+bW50W2NudF0gPSBOVUxMOworCQlkcW9wdC0+aW5mb1tjbnRdLmRxaV9mbGFncyA9IDA7CisJCWRxb3B0LT5pbmZvW2NudF0uZHFpX2lncmFjZSA9IDA7CisJCWRxb3B0LT5pbmZvW2NudF0uZHFpX2JncmFjZSA9IDA7CisJCWRxb3B0LT5vcHNbY250XSA9IE5VTEw7CisJfQorCXVwKCZkcW9wdC0+ZHFvbm9mZl9zZW0pOworCS8qIFN5bmMgdGhlIHN1cGVyYmxvY2sgc28gdGhhdCBidWZmZXJzIHdpdGggcXVvdGEgZGF0YSBhcmUgd3JpdHRlbiB0bworCSAqIGRpc2sgKGFuZCBzbyB1c2Vyc3BhY2Ugc2VlcyBjb3JyZWN0IGRhdGEgYWZ0ZXJ3YXJkcykuCisJICogVGhlIHJlZmVyZW5jZSB0byB2ZnNtbnQgd2UgYXJlIHN0aWxsIGhvbGRpbmcgcHJvdGVjdHMgdXMgZnJvbQorCSAqIHVtb3VudCAod2UgZG9uJ3QgaGF2ZSBpdCBvbmx5IHdoZW4gcXVvdGFzIGFyZSB0dXJuZWQgb24vb2ZmIGZvcgorCSAqIGpvdXJuYWwgcmVwbGF5IGJ1dCBpbiB0aGF0IGNhc2Ugd2UgYXJlIGd1YXJkZWQgYnkgdGhlIGZzIGFueXdheSkuICovCisJaWYgKHNiLT5zX29wLT5zeW5jX2ZzKQorCQlzYi0+c19vcC0+c3luY19mcyhzYiwgMSk7CisJc3luY19ibG9ja2RldihzYi0+c19iZGV2KTsKKwkvKiBOb3cgdGhlIHF1b3RhIGZpbGVzIGFyZSBqdXN0IG9yZGluYXJ5IGZpbGVzIGFuZCB3ZSBjYW4gc2V0IHRoZQorCSAqIGlub2RlIGZsYWdzIGJhY2suIE1vcmVvdmVyIHdlIGRpc2NhcmQgdGhlIHBhZ2VjYWNoZSBzbyB0aGF0CisJICogdXNlcnNwYWNlIHNlZXMgdGhlIHdyaXRlcyB3ZSBkaWQgYnlwYXNzaW5nIHRoZSBwYWdlY2FjaGUuIFdlCisJICogbXVzdCBhbHNvIGRpc2NhcmQgdGhlIGJsb2NrZGV2IGJ1ZmZlcnMgc28gdGhhdCB3ZSBzZWUgdGhlCisJICogY2hhbmdlcyBkb25lIGJ5IHVzZXJzcGFjZSBvbiB0aGUgbmV4dCBxdW90YW9uKCkgKi8KKwlmb3IgKGNudCA9IDA7IGNudCA8IE1BWFFVT1RBUzsgY250KyspCisJCWlmICh0b3B1dGlub2RlW2NudF0pIHsKKwkJCWRvd24oJmRxb3B0LT5kcW9ub2ZmX3NlbSk7CisJCQkvKiBJZiBxdW90YSB3YXMgcmVlbmFibGVkIGluIHRoZSBtZWFudGltZSwgd2UgaGF2ZQorCQkJICogbm90aGluZyB0byBkbyAqLworCQkJaWYgKCFzYl9oYXNfcXVvdGFfZW5hYmxlZChzYiwgY250KSkgeworCQkJCWRvd24oJnRvcHV0aW5vZGVbY250XS0+aV9zZW0pOworCQkJCXRvcHV0aW5vZGVbY250XS0+aV9mbGFncyAmPSB+KFNfSU1NVVRBQkxFIHwKKwkJCQkgIFNfTk9BVElNRSB8IFNfTk9RVU9UQSk7CisJCQkJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoJnRvcHV0aW5vZGVbY250XS0+aV9kYXRhLCAwKTsKKwkJCQl1cCgmdG9wdXRpbm9kZVtjbnRdLT5pX3NlbSk7CisJCQkJbWFya19pbm9kZV9kaXJ0eSh0b3B1dGlub2RlW2NudF0pOworCQkJCWlwdXQodG9wdXRpbm9kZVtjbnRdKTsKKwkJCX0KKwkJCXVwKCZkcW9wdC0+ZHFvbm9mZl9zZW0pOworCQkJLyogV2UgZG9uJ3QgaG9sZCB0aGUgcmVmZXJlbmNlIHdoZW4gd2UgdHVybmVkIG9uIHF1b3RhcworCQkJICoganVzdCBmb3IgdGhlIGpvdXJuYWwgcmVwbGF5Li4uICovCisJCQlpZiAodG9wdXRtbnRbY250XSkKKwkJCQltbnRwdXQodG9wdXRtbnRbY250XSk7CisJCX0KKwlpZiAoc2ItPnNfYmRldikKKwkJaW52YWxpZGF0ZV9iZGV2KHNiLT5zX2JkZXYsIDApOworCXJldHVybiAwOworfQorCisvKgorICoJVHVybiBxdW90YXMgb24gb24gYSBkZXZpY2UKKyAqLworCisvKiBIZWxwZXIgZnVuY3Rpb24gd2hlbiB3ZSBhbHJlYWR5IGhhdmUgdGhlIGlub2RlICovCitzdGF0aWMgaW50IHZmc19xdW90YV9vbl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSwgaW50IGZvcm1hdF9pZCkKK3sKKwlzdHJ1Y3QgcXVvdGFfZm9ybWF0X3R5cGUgKmZtdCA9IGZpbmRfcXVvdGFfZm9ybWF0KGZvcm1hdF9pZCk7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBxdW90YV9pbmZvICpkcW9wdCA9IHNiX2Rxb3B0KHNiKTsKKwlpbnQgZXJyb3I7CisJaW50IG9sZGZsYWdzID0gLTE7CisKKwlpZiAoIWZtdCkKKwkJcmV0dXJuIC1FU1JDSDsKKwlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwkJZXJyb3IgPSAtRUFDQ0VTOworCQlnb3RvIG91dF9mbXQ7CisJfQorCWlmIChJU19SRE9OTFkoaW5vZGUpKSB7CisJCWVycm9yID0gLUVST0ZTOworCQlnb3RvIG91dF9mbXQ7CisJfQorCWlmICghc2ItPnNfb3AtPnF1b3RhX3dyaXRlIHx8ICFzYi0+c19vcC0+cXVvdGFfcmVhZCkgeworCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2ZtdDsKKwl9CisKKwkvKiBBcyB3ZSBieXBhc3MgdGhlIHBhZ2VjYWNoZSB3ZSBtdXN0IG5vdyBmbHVzaCB0aGUgaW5vZGUgc28gdGhhdAorCSAqIHdlIHNlZSBhbGwgdGhlIGNoYW5nZXMgZnJvbSB1c2Vyc3BhY2UuLi4gKi8KKwl3cml0ZV9pbm9kZV9ub3coaW5vZGUsIDEpOworCS8qIEFuZCBub3cgZmx1c2ggdGhlIGJsb2NrIGNhY2hlIHNvIHRoYXQga2VybmVsIHNlZXMgdGhlIGNoYW5nZXMgKi8KKwlpbnZhbGlkYXRlX2JkZXYoc2ItPnNfYmRldiwgMCk7CisJZG93bigmaW5vZGUtPmlfc2VtKTsKKwlkb3duKCZkcW9wdC0+ZHFvbm9mZl9zZW0pOworCWlmIChzYl9oYXNfcXVvdGFfZW5hYmxlZChzYiwgdHlwZSkpIHsKKwkJZXJyb3IgPSAtRUJVU1k7CisJCWdvdG8gb3V0X2xvY2s7CisJfQorCS8qIFdlIGRvbid0IHdhbnQgcXVvdGEgYW5kIGF0aW1lIG9uIHF1b3RhIGZpbGVzIChkZWFkbG9ja3MgcG9zc2libGUpCisJICogQWxzbyBub2JvZHkgc2hvdWxkIHdyaXRlIHRvIHRoZSBmaWxlIC0gd2UgdXNlIHNwZWNpYWwgSU8gb3BlcmF0aW9ucworCSAqIHdoaWNoIGlnbm9yZSB0aGUgaW1tdXRhYmxlIGJpdC4gKi8KKwlkb3duX3dyaXRlKCZkcW9wdC0+ZHFwdHJfc2VtKTsKKwlvbGRmbGFncyA9IGlub2RlLT5pX2ZsYWdzICYgKFNfTk9BVElNRSB8IFNfSU1NVVRBQkxFIHwgU19OT1FVT1RBKTsKKwlpbm9kZS0+aV9mbGFncyB8PSBTX05PUVVPVEEgfCBTX05PQVRJTUUgfCBTX0lNTVVUQUJMRTsKKwl1cF93cml0ZSgmZHFvcHQtPmRxcHRyX3NlbSk7CisKKwllcnJvciA9IC1FSU87CisJZHFvcHQtPmZpbGVzW3R5cGVdID0gaWdyYWIoaW5vZGUpOworCWlmICghZHFvcHQtPmZpbGVzW3R5cGVdKQorCQlnb3RvIG91dF9sb2NrOworCWVycm9yID0gLUVJTlZBTDsKKwlpZiAoIWZtdC0+cWZfb3BzLT5jaGVja19xdW90YV9maWxlKHNiLCB0eXBlKSkKKwkJZ290byBvdXRfZmlsZV9pbml0OworCisJZHFvcHQtPm9wc1t0eXBlXSA9IGZtdC0+cWZfb3BzOworCWRxb3B0LT5pbmZvW3R5cGVdLmRxaV9mb3JtYXQgPSBmbXQ7CisJSU5JVF9MSVNUX0hFQUQoJmRxb3B0LT5pbmZvW3R5cGVdLmRxaV9kaXJ0eV9saXN0KTsKKwlkb3duKCZkcW9wdC0+ZHFpb19zZW0pOworCWlmICgoZXJyb3IgPSBkcW9wdC0+b3BzW3R5cGVdLT5yZWFkX2ZpbGVfaW5mbyhzYiwgdHlwZSkpIDwgMCkgeworCQl1cCgmZHFvcHQtPmRxaW9fc2VtKTsKKwkJZ290byBvdXRfZmlsZV9pbml0OworCX0KKwl1cCgmZHFvcHQtPmRxaW9fc2VtKTsKKwl1cCgmaW5vZGUtPmlfc2VtKTsKKwlzZXRfZW5hYmxlX2ZsYWdzKGRxb3B0LCB0eXBlKTsKKworCWFkZF9kcXVvdF9yZWYoc2IsIHR5cGUpOworCXVwKCZkcW9wdC0+ZHFvbm9mZl9zZW0pOworCisJcmV0dXJuIDA7CisKK291dF9maWxlX2luaXQ6CisJZHFvcHQtPmZpbGVzW3R5cGVdID0gTlVMTDsKKwlpcHV0KGlub2RlKTsKK291dF9sb2NrOgorCXVwKCZkcW9wdC0+ZHFvbm9mZl9zZW0pOworCWlmIChvbGRmbGFncyAhPSAtMSkgeworCQlkb3duX3dyaXRlKCZkcW9wdC0+ZHFwdHJfc2VtKTsKKwkJLyogU2V0IHRoZSBmbGFncyBiYWNrIChpbiB0aGUgY2FzZSBvZiBhY2NpZGVudGFsIHF1b3Rhb24oKQorCQkgKiBvbiBhIHdyb25nIGZpbGUgd2UgZG9uJ3Qgd2FudCB0byBtZXNzIHVwIHRoZSBmbGFncykgKi8KKwkJaW5vZGUtPmlfZmxhZ3MgJj0gfihTX05PQVRJTUUgfCBTX05PUVVPVEEgfCBTX0lNTVVUQUJMRSk7CisJCWlub2RlLT5pX2ZsYWdzIHw9IG9sZGZsYWdzOworCQl1cF93cml0ZSgmZHFvcHQtPmRxcHRyX3NlbSk7CisJfQorCXVwKCZpbm9kZS0+aV9zZW0pOworb3V0X2ZtdDoKKwlwdXRfcXVvdGFfZm9ybWF0KGZtdCk7CisKKwlyZXR1cm4gZXJyb3I7IAorfQorCisvKiBBY3R1YWwgZnVuY3Rpb24gY2FsbGVkIGZyb20gcXVvdGFjdGwoKSAqLworaW50IHZmc19xdW90YV9vbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwgaW50IGZvcm1hdF9pZCwgY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCWludCBlcnJvcjsKKworCWVycm9yID0gcGF0aF9sb29rdXAocGF0aCwgTE9PS1VQX0ZPTExPVywgJm5kKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CisJZXJyb3IgPSBzZWN1cml0eV9xdW90YV9vbihuZC5kZW50cnkpOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfcGF0aDsKKwkvKiBRdW90YSBmaWxlIG5vdCBvbiB0aGUgc2FtZSBmaWxlc3lzdGVtPyAqLworCWlmIChuZC5tbnQtPm1udF9zYiAhPSBzYikKKwkJZXJyb3IgPSAtRVhERVY7CisJZWxzZSB7CisJCWVycm9yID0gdmZzX3F1b3RhX29uX2lub2RlKG5kLmRlbnRyeS0+ZF9pbm9kZSwgdHlwZSwgZm9ybWF0X2lkKTsKKwkJaWYgKCFlcnJvcikKKwkJCXNiX2Rxb3B0KHNiKS0+bW50W3R5cGVdID0gbW50Z2V0KG5kLm1udCk7CisJfQorb3V0X3BhdGg6CisJcGF0aF9yZWxlYXNlKCZuZCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHdoZW4gZmlsZXN5c3RlbSBuZWVkcyB0byBpbml0aWFsaXplIHF1b3RhcworICogZHVyaW5nIG1vdW50IHRpbWUuCisgKi8KK2ludCB2ZnNfcXVvdGFfb25fbW91bnQoaW50IHR5cGUsIGludCBmb3JtYXRfaWQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IHNlY3VyaXR5X3F1b3RhX29uKGRlbnRyeSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJcmV0dXJuIHZmc19xdW90YV9vbl9pbm9kZShkZW50cnktPmRfaW5vZGUsIHR5cGUsIGZvcm1hdF9pZCk7Cit9CisKKy8qIEdlbmVyaWMgcm91dGluZSBmb3IgZ2V0dGluZyBjb21tb24gcGFydCBvZiBxdW90YSBzdHJ1Y3R1cmUgKi8KK3N0YXRpYyB2b2lkIGRvX2dldF9kcWJsayhzdHJ1Y3QgZHF1b3QgKmRxdW90LCBzdHJ1Y3QgaWZfZHFibGsgKmRpKQoreworCXN0cnVjdCBtZW1fZHFibGsgKmRtID0gJmRxdW90LT5kcV9kcWI7CisKKwlzcGluX2xvY2soJmRxX2RhdGFfbG9jayk7CisJZGktPmRxYl9iaGFyZGxpbWl0ID0gZG0tPmRxYl9iaGFyZGxpbWl0OworCWRpLT5kcWJfYnNvZnRsaW1pdCA9IGRtLT5kcWJfYnNvZnRsaW1pdDsKKwlkaS0+ZHFiX2N1cnNwYWNlID0gZG0tPmRxYl9jdXJzcGFjZTsKKwlkaS0+ZHFiX2loYXJkbGltaXQgPSBkbS0+ZHFiX2loYXJkbGltaXQ7CisJZGktPmRxYl9pc29mdGxpbWl0ID0gZG0tPmRxYl9pc29mdGxpbWl0OworCWRpLT5kcWJfY3VyaW5vZGVzID0gZG0tPmRxYl9jdXJpbm9kZXM7CisJZGktPmRxYl9idGltZSA9IGRtLT5kcWJfYnRpbWU7CisJZGktPmRxYl9pdGltZSA9IGRtLT5kcWJfaXRpbWU7CisJZGktPmRxYl92YWxpZCA9IFFJRl9BTEw7CisJc3Bpbl91bmxvY2soJmRxX2RhdGFfbG9jayk7Cit9CisKK2ludCB2ZnNfZ2V0X2RxYmxrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCBxaWRfdCBpZCwgc3RydWN0IGlmX2RxYmxrICpkaSkKK3sKKwlzdHJ1Y3QgZHF1b3QgKmRxdW90OworCisJZG93bigmc2JfZHFvcHQoc2IpLT5kcW9ub2ZmX3NlbSk7CisJaWYgKCEoZHF1b3QgPSBkcWdldChzYiwgaWQsIHR5cGUpKSkgeworCQl1cCgmc2JfZHFvcHQoc2IpLT5kcW9ub2ZmX3NlbSk7CisJCXJldHVybiAtRVNSQ0g7CisJfQorCWRvX2dldF9kcWJsayhkcXVvdCwgZGkpOworCWRxcHV0KGRxdW90KTsKKwl1cCgmc2JfZHFvcHQoc2IpLT5kcW9ub2ZmX3NlbSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIEdlbmVyaWMgcm91dGluZSBmb3Igc2V0dGluZyBjb21tb24gcGFydCBvZiBxdW90YSBzdHJ1Y3R1cmUgKi8KK3N0YXRpYyB2b2lkIGRvX3NldF9kcWJsayhzdHJ1Y3QgZHF1b3QgKmRxdW90LCBzdHJ1Y3QgaWZfZHFibGsgKmRpKQoreworCXN0cnVjdCBtZW1fZHFibGsgKmRtID0gJmRxdW90LT5kcV9kcWI7CisJaW50IGNoZWNrX2JsaW0gPSAwLCBjaGVja19pbGltID0gMDsKKworCXNwaW5fbG9jaygmZHFfZGF0YV9sb2NrKTsKKwlpZiAoZGktPmRxYl92YWxpZCAmIFFJRl9TUEFDRSkgeworCQlkbS0+ZHFiX2N1cnNwYWNlID0gZGktPmRxYl9jdXJzcGFjZTsKKwkJY2hlY2tfYmxpbSA9IDE7CisJfQorCWlmIChkaS0+ZHFiX3ZhbGlkICYgUUlGX0JMSU1JVFMpIHsKKwkJZG0tPmRxYl9ic29mdGxpbWl0ID0gZGktPmRxYl9ic29mdGxpbWl0OworCQlkbS0+ZHFiX2JoYXJkbGltaXQgPSBkaS0+ZHFiX2JoYXJkbGltaXQ7CisJCWNoZWNrX2JsaW0gPSAxOworCX0KKwlpZiAoZGktPmRxYl92YWxpZCAmIFFJRl9JTk9ERVMpIHsKKwkJZG0tPmRxYl9jdXJpbm9kZXMgPSBkaS0+ZHFiX2N1cmlub2RlczsKKwkJY2hlY2tfaWxpbSA9IDE7CisJfQorCWlmIChkaS0+ZHFiX3ZhbGlkICYgUUlGX0lMSU1JVFMpIHsKKwkJZG0tPmRxYl9pc29mdGxpbWl0ID0gZGktPmRxYl9pc29mdGxpbWl0OworCQlkbS0+ZHFiX2loYXJkbGltaXQgPSBkaS0+ZHFiX2loYXJkbGltaXQ7CisJCWNoZWNrX2lsaW0gPSAxOworCX0KKwlpZiAoZGktPmRxYl92YWxpZCAmIFFJRl9CVElNRSkKKwkJZG0tPmRxYl9idGltZSA9IGRpLT5kcWJfYnRpbWU7CisJaWYgKGRpLT5kcWJfdmFsaWQgJiBRSUZfSVRJTUUpCisJCWRtLT5kcWJfaXRpbWUgPSBkaS0+ZHFiX2l0aW1lOworCisJaWYgKGNoZWNrX2JsaW0pIHsKKwkJaWYgKCFkbS0+ZHFiX2Jzb2Z0bGltaXQgfHwgdG9xYihkbS0+ZHFiX2N1cnNwYWNlKSA8IGRtLT5kcWJfYnNvZnRsaW1pdCkgeworCQkJZG0tPmRxYl9idGltZSA9IDA7CisJCQljbGVhcl9iaXQoRFFfQkxLU19CLCAmZHF1b3QtPmRxX2ZsYWdzKTsKKwkJfQorCQllbHNlIGlmICghKGRpLT5kcWJfdmFsaWQgJiBRSUZfQlRJTUUpKQkvKiBTZXQgZ3JhY2Ugb25seSBpZiB1c2VyIGhhc24ndCBwcm92aWRlZCBoaXMgb3duLi4uICovCisJCQlkbS0+ZHFiX2J0aW1lID0gZ2V0X3NlY29uZHMoKSArIHNiX2Rxb3B0KGRxdW90LT5kcV9zYiktPmluZm9bZHF1b3QtPmRxX3R5cGVdLmRxaV9iZ3JhY2U7CisJfQorCWlmIChjaGVja19pbGltKSB7CisJCWlmICghZG0tPmRxYl9pc29mdGxpbWl0IHx8IGRtLT5kcWJfY3VyaW5vZGVzIDwgZG0tPmRxYl9pc29mdGxpbWl0KSB7CisJCQlkbS0+ZHFiX2l0aW1lID0gMDsKKwkJCWNsZWFyX2JpdChEUV9JTk9ERVNfQiwgJmRxdW90LT5kcV9mbGFncyk7CisJCX0KKwkJZWxzZSBpZiAoIShkaS0+ZHFiX3ZhbGlkICYgUUlGX0lUSU1FKSkJLyogU2V0IGdyYWNlIG9ubHkgaWYgdXNlciBoYXNuJ3QgcHJvdmlkZWQgaGlzIG93bi4uLiAqLworCQkJZG0tPmRxYl9pdGltZSA9IGdldF9zZWNvbmRzKCkgKyBzYl9kcW9wdChkcXVvdC0+ZHFfc2IpLT5pbmZvW2RxdW90LT5kcV90eXBlXS5kcWlfaWdyYWNlOworCX0KKwlpZiAoZG0tPmRxYl9iaGFyZGxpbWl0IHx8IGRtLT5kcWJfYnNvZnRsaW1pdCB8fCBkbS0+ZHFiX2loYXJkbGltaXQgfHwgZG0tPmRxYl9pc29mdGxpbWl0KQorCQljbGVhcl9iaXQoRFFfRkFLRV9CLCAmZHF1b3QtPmRxX2ZsYWdzKTsKKwllbHNlCisJCXNldF9iaXQoRFFfRkFLRV9CLCAmZHF1b3QtPmRxX2ZsYWdzKTsKKwlzcGluX3VubG9jaygmZHFfZGF0YV9sb2NrKTsKKwltYXJrX2RxdW90X2RpcnR5KGRxdW90KTsKK30KKworaW50IHZmc19zZXRfZHFibGsoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIHFpZF90IGlkLCBzdHJ1Y3QgaWZfZHFibGsgKmRpKQoreworCXN0cnVjdCBkcXVvdCAqZHF1b3Q7CisKKwlkb3duKCZzYl9kcW9wdChzYiktPmRxb25vZmZfc2VtKTsKKwlpZiAoIShkcXVvdCA9IGRxZ2V0KHNiLCBpZCwgdHlwZSkpKSB7CisJCXVwKCZzYl9kcW9wdChzYiktPmRxb25vZmZfc2VtKTsKKwkJcmV0dXJuIC1FU1JDSDsKKwl9CisJZG9fc2V0X2RxYmxrKGRxdW90LCBkaSk7CisJZHFwdXQoZHF1b3QpOworCXVwKCZzYl9kcW9wdChzYiktPmRxb25vZmZfc2VtKTsKKwlyZXR1cm4gMDsKK30KKworLyogR2VuZXJpYyByb3V0aW5lIGZvciBnZXR0aW5nIGNvbW1vbiBwYXJ0IG9mIHF1b3RhIGZpbGUgaW5mb3JtYXRpb24gKi8KK2ludCB2ZnNfZ2V0X2RxaW5mbyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwgc3RydWN0IGlmX2RxaW5mbyAqaWkpCit7CisJc3RydWN0IG1lbV9kcWluZm8gKm1pOworICAKKwlkb3duKCZzYl9kcW9wdChzYiktPmRxb25vZmZfc2VtKTsKKwlpZiAoIXNiX2hhc19xdW90YV9lbmFibGVkKHNiLCB0eXBlKSkgeworCQl1cCgmc2JfZHFvcHQoc2IpLT5kcW9ub2ZmX3NlbSk7CisJCXJldHVybiAtRVNSQ0g7CisJfQorCW1pID0gc2JfZHFvcHQoc2IpLT5pbmZvICsgdHlwZTsKKwlzcGluX2xvY2soJmRxX2RhdGFfbG9jayk7CisJaWktPmRxaV9iZ3JhY2UgPSBtaS0+ZHFpX2JncmFjZTsKKwlpaS0+ZHFpX2lncmFjZSA9IG1pLT5kcWlfaWdyYWNlOworCWlpLT5kcWlfZmxhZ3MgPSBtaS0+ZHFpX2ZsYWdzICYgRFFGX01BU0s7CisJaWktPmRxaV92YWxpZCA9IElJRl9BTEw7CisJc3Bpbl91bmxvY2soJmRxX2RhdGFfbG9jayk7CisJdXAoJnNiX2Rxb3B0KHNiKS0+ZHFvbm9mZl9zZW0pOworCXJldHVybiAwOworfQorCisvKiBHZW5lcmljIHJvdXRpbmUgZm9yIHNldHRpbmcgY29tbW9uIHBhcnQgb2YgcXVvdGEgZmlsZSBpbmZvcm1hdGlvbiAqLworaW50IHZmc19zZXRfZHFpbmZvKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCBzdHJ1Y3QgaWZfZHFpbmZvICppaSkKK3sKKwlzdHJ1Y3QgbWVtX2RxaW5mbyAqbWk7CisKKwlkb3duKCZzYl9kcW9wdChzYiktPmRxb25vZmZfc2VtKTsKKwlpZiAoIXNiX2hhc19xdW90YV9lbmFibGVkKHNiLCB0eXBlKSkgeworCQl1cCgmc2JfZHFvcHQoc2IpLT5kcW9ub2ZmX3NlbSk7CisJCXJldHVybiAtRVNSQ0g7CisJfQorCW1pID0gc2JfZHFvcHQoc2IpLT5pbmZvICsgdHlwZTsKKwlzcGluX2xvY2soJmRxX2RhdGFfbG9jayk7CisJaWYgKGlpLT5kcWlfdmFsaWQgJiBJSUZfQkdSQUNFKQorCQltaS0+ZHFpX2JncmFjZSA9IGlpLT5kcWlfYmdyYWNlOworCWlmIChpaS0+ZHFpX3ZhbGlkICYgSUlGX0lHUkFDRSkKKwkJbWktPmRxaV9pZ3JhY2UgPSBpaS0+ZHFpX2lncmFjZTsKKwlpZiAoaWktPmRxaV92YWxpZCAmIElJRl9GTEFHUykKKwkJbWktPmRxaV9mbGFncyA9IChtaS0+ZHFpX2ZsYWdzICYgfkRRRl9NQVNLKSB8IChpaS0+ZHFpX2ZsYWdzICYgRFFGX01BU0spOworCXNwaW5fdW5sb2NrKCZkcV9kYXRhX2xvY2spOworCW1hcmtfaW5mb19kaXJ0eShzYiwgdHlwZSk7CisJLyogRm9yY2Ugd3JpdGUgdG8gZGlzayAqLworCXNiLT5kcV9vcC0+d3JpdGVfaW5mbyhzYiwgdHlwZSk7CisJdXAoJnNiX2Rxb3B0KHNiKS0+ZHFvbm9mZl9zZW0pOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgcXVvdGFjdGxfb3BzIHZmc19xdW90YWN0bF9vcHMgPSB7CisJLnF1b3RhX29uCT0gdmZzX3F1b3RhX29uLAorCS5xdW90YV9vZmYJPSB2ZnNfcXVvdGFfb2ZmLAorCS5xdW90YV9zeW5jCT0gdmZzX3F1b3RhX3N5bmMsCisJLmdldF9pbmZvCT0gdmZzX2dldF9kcWluZm8sCisJLnNldF9pbmZvCT0gdmZzX3NldF9kcWluZm8sCisJLmdldF9kcWJsawk9IHZmc19nZXRfZHFibGssCisJLnNldF9kcWJsawk9IHZmc19zZXRfZHFibGsKK307CisKK3N0YXRpYyBjdGxfdGFibGUgZnNfZHFzdGF0c190YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gRlNfRFFfTE9PS1VQUywKKwkJLnByb2NuYW1lCT0gImxvb2t1cHMiLAorCQkuZGF0YQkJPSAmZHFzdGF0cy5sb29rdXBzLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNDQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IEZTX0RRX0RST1BTLAorCQkucHJvY25hbWUJPSAiZHJvcHMiLAorCQkuZGF0YQkJPSAmZHFzdGF0cy5kcm9wcywKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDQ0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBGU19EUV9SRUFEUywKKwkJLnByb2NuYW1lCT0gInJlYWRzIiwKKwkJLmRhdGEJCT0gJmRxc3RhdHMucmVhZHMsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA0NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gRlNfRFFfV1JJVEVTLAorCQkucHJvY25hbWUJPSAid3JpdGVzIiwKKwkJLmRhdGEJCT0gJmRxc3RhdHMud3JpdGVzLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNDQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IEZTX0RRX0NBQ0hFX0hJVFMsCisJCS5wcm9jbmFtZQk9ICJjYWNoZV9oaXRzIiwKKwkJLmRhdGEJCT0gJmRxc3RhdHMuY2FjaGVfaGl0cywKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDQ0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBGU19EUV9BTExPQ0FURUQsCisJCS5wcm9jbmFtZQk9ICJhbGxvY2F0ZWRfZHF1b3RzIiwKKwkJLmRhdGEJCT0gJmRxc3RhdHMuYWxsb2NhdGVkX2RxdW90cywKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDQ0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBGU19EUV9GUkVFLAorCQkucHJvY25hbWUJPSAiZnJlZV9kcXVvdHMiLAorCQkuZGF0YQkJPSAmZHFzdGF0cy5mcmVlX2RxdW90cywKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDQ0NCwKKwkJLnByb2NfaGFuZGxlcgk9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkuY3RsX25hbWUJPSBGU19EUV9TWU5DUywKKwkJLnByb2NuYW1lCT0gInN5bmNzIiwKKwkJLmRhdGEJCT0gJmRxc3RhdHMuc3luY3MsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA0NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gRlNfRFFfV0FSTklOR1MsCisJCS5wcm9jbmFtZQk9ICJ3YXJuaW5ncyIsCisJCS5kYXRhCQk9ICZmbGFnX3ByaW50X3dhcm5pbmdzLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfSwKK307CisKK3N0YXRpYyBjdGxfdGFibGUgZnNfdGFibGVbXSA9IHsKKwl7CisJCS5jdGxfbmFtZQk9IEZTX0RRU1RBVFMsCisJCS5wcm9jbmFtZQk9ICJxdW90YSIsCisJCS5tb2RlCQk9IDA1NTUsCisJCS5jaGlsZAkJPSBmc19kcXN0YXRzX3RhYmxlLAorCX0sCisJeyAuY3RsX25hbWUgPSAwIH0sCit9OworCitzdGF0aWMgY3RsX3RhYmxlIHN5c190YWJsZVtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gQ1RMX0ZTLAorCQkucHJvY25hbWUJPSAiZnMiLAorCQkubW9kZQkJPSAwNTU1LAorCQkuY2hpbGQJCT0gZnNfdGFibGUsCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGRxdW90X2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIG5yX2hhc2gsIG9yZGVyOworCisJcHJpbnRrKEtFUk5fTk9USUNFICJWRlM6IERpc2sgcXVvdGFzICVzXG4iLCBfX0RRVU9UX1ZFUlNJT05fXyk7CisKKwlyZWdpc3Rlcl9zeXNjdGxfdGFibGUoc3lzX3RhYmxlLCAwKTsKKworCWRxdW90X2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJkcXVvdCIsIAorCQkJc2l6ZW9mKHN0cnVjdCBkcXVvdCksIHNpemVvZih1bnNpZ25lZCBsb25nKSAqIDQsCisJCQlTTEFCX0hXQ0FDSEVfQUxJR058U0xBQl9SRUNMQUlNX0FDQ09VTlR8U0xBQl9QQU5JQywKKwkJCU5VTEwsIE5VTEwpOworCisJb3JkZXIgPSAwOworCWRxdW90X2hhc2ggPSAoc3RydWN0IGhsaXN0X2hlYWQgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9BVE9NSUMsIG9yZGVyKTsKKwlpZiAoIWRxdW90X2hhc2gpCisJCXBhbmljKCJDYW5ub3QgY3JlYXRlIGRxdW90IGhhc2ggdGFibGUiKTsKKworCS8qIEZpbmQgcG93ZXItb2YtdHdvIGhsaXN0X2hlYWRzIHdoaWNoIGNhbiBmaXQgaW50byBhbGxvY2F0aW9uICovCisJbnJfaGFzaCA9ICgxVUwgPDwgb3JkZXIpICogUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBobGlzdF9oZWFkKTsKKwlkcV9oYXNoX2JpdHMgPSAwOworCWRvIHsKKwkJZHFfaGFzaF9iaXRzKys7CisJfSB3aGlsZSAobnJfaGFzaCA+PiBkcV9oYXNoX2JpdHMpOworCWRxX2hhc2hfYml0cy0tOworCisJbnJfaGFzaCA9IDFVTCA8PCBkcV9oYXNoX2JpdHM7CisJZHFfaGFzaF9tYXNrID0gbnJfaGFzaCAtIDE7CisJZm9yIChpID0gMDsgaSA8IG5yX2hhc2g7IGkrKykKKwkJSU5JVF9ITElTVF9IRUFEKGRxdW90X2hhc2ggKyBpKTsKKworCXByaW50aygiRHF1b3QtY2FjaGUgaGFzaCB0YWJsZSBlbnRyaWVzOiAlbGQgKG9yZGVyICVsZCwgJWxkIGJ5dGVzKVxuIiwKKwkJCW5yX2hhc2gsIG9yZGVyLCAoUEFHRV9TSVpFIDw8IG9yZGVyKSk7CisKKwlzZXRfc2hyaW5rZXIoREVGQVVMVF9TRUVLUywgc2hyaW5rX2RxY2FjaGVfbWVtb3J5KTsKKworCXJldHVybiAwOworfQorbW9kdWxlX2luaXQoZHF1b3RfaW5pdCk7CisKK0VYUE9SVF9TWU1CT0wocmVnaXN0ZXJfcXVvdGFfZm9ybWF0KTsKK0VYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl9xdW90YV9mb3JtYXQpOworRVhQT1JUX1NZTUJPTChkcXN0YXRzKTsKK0VYUE9SVF9TWU1CT0woZHFfZGF0YV9sb2NrKTsKK0VYUE9SVF9TWU1CT0wodmZzX3F1b3RhX29uKTsKK0VYUE9SVF9TWU1CT0wodmZzX3F1b3RhX29uX21vdW50KTsKK0VYUE9SVF9TWU1CT0wodmZzX3F1b3RhX29mZik7CitFWFBPUlRfU1lNQk9MKHZmc19xdW90YV9zeW5jKTsKK0VYUE9SVF9TWU1CT0wodmZzX2dldF9kcWluZm8pOworRVhQT1JUX1NZTUJPTCh2ZnNfc2V0X2RxaW5mbyk7CitFWFBPUlRfU1lNQk9MKHZmc19nZXRfZHFibGspOworRVhQT1JUX1NZTUJPTCh2ZnNfc2V0X2RxYmxrKTsKK0VYUE9SVF9TWU1CT0woZHF1b3RfY29tbWl0KTsKK0VYUE9SVF9TWU1CT0woZHF1b3RfY29tbWl0X2luZm8pOworRVhQT1JUX1NZTUJPTChkcXVvdF9hY3F1aXJlKTsKK0VYUE9SVF9TWU1CT0woZHF1b3RfcmVsZWFzZSk7CitFWFBPUlRfU1lNQk9MKGRxdW90X21hcmtfZHF1b3RfZGlydHkpOworRVhQT1JUX1NZTUJPTChkcXVvdF9pbml0aWFsaXplKTsKK0VYUE9SVF9TWU1CT0woZHF1b3RfZHJvcCk7CitFWFBPUlRfU1lNQk9MKGRxdW90X2FsbG9jX3NwYWNlKTsKK0VYUE9SVF9TWU1CT0woZHF1b3RfYWxsb2NfaW5vZGUpOworRVhQT1JUX1NZTUJPTChkcXVvdF9mcmVlX3NwYWNlKTsKK0VYUE9SVF9TWU1CT0woZHF1b3RfZnJlZV9pbm9kZSk7CitFWFBPUlRfU1lNQk9MKGRxdW90X3RyYW5zZmVyKTsKZGlmZiAtLWdpdCBhL2ZzL2Vmcy9NYWtlZmlsZSBiL2ZzL2Vmcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjM1NDNkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZWZzL01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGVmcy1maWxlc3lzdGVtIHJvdXRpbmVzLgorIworCitvYmotJChDT05GSUdfRUZTX0ZTKSArPSBlZnMubworCitlZnMtb2JqcyA6PSBzdXBlci5vIGlub2RlLm8gbmFtZWkubyBkaXIubyBmaWxlLm8gc3ltbGluay5vCmRpZmYgLS1naXQgYS9mcy9lZnMvZGlyLmMgYi9mcy9lZnMvZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc3YzYxNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Vmcy9kaXIuYwpAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIGRpci5jCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5IEFsIFNtaXRoCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZWZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKworc3RhdGljIGludCBlZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqLCB2b2lkICosIGZpbGxkaXJfdCk7CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgZWZzX2Rpcl9vcGVyYXRpb25zID0geworCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIJPSBlZnNfcmVhZGRpciwKK307CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGVmc19kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkubG9va3VwCQk9IGVmc19sb29rdXAsCit9OworCitzdGF0aWMgaW50IGVmc19yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKSB7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwlzdHJ1Y3QgZWZzX2RpcgkJKmRpcmJsb2NrOworCXN0cnVjdCBlZnNfZGVudHJ5CSpkaXJzbG90OworCWVmc19pbm9fdAkJaW5vZGVudW07CisJZWZzX2Jsb2NrX3QJCWJsb2NrOworCWludAkJCXNsb3QsIG5hbWVsZW47CisJY2hhcgkJCSpuYW1lcHRyOworCisJaWYgKGlub2RlLT5pX3NpemUgJiAoRUZTX0RJUkJTSVpFLTEpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJFRlM6IFdBUk5JTkc6IHJlYWRkaXIoKTogZGlyZWN0b3J5IHNpemUgbm90IGEgbXVsdGlwbGUgb2YgRUZTX0RJUkJTSVpFXG4iKTsKKworCWxvY2tfa2VybmVsKCk7CisKKwkvKiB3b3JrIG91dCB3aGVyZSB0aGlzIGVudHJ5IGNhbiBiZSBmb3VuZCAqLworCWJsb2NrID0gZmlscC0+Zl9wb3MgPj4gRUZTX0RJUkJTSVpFX0JJVFM7CisKKwkvKiBlYWNoIGJsb2NrIGNvbnRhaW5zIGF0IG1vc3QgMjU2IHNsb3RzICovCisJc2xvdCAgPSBmaWxwLT5mX3BvcyAmIDB4ZmY7CisKKwkvKiBsb29rIGF0IGFsbCBibG9ja3MgKi8KKwl3aGlsZSAoYmxvY2sgPCBpbm9kZS0+aV9ibG9ja3MpIHsKKwkJLyogcmVhZCB0aGUgZGlyIGJsb2NrICovCisJCWJoID0gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIGVmc19ibWFwKGlub2RlLCBibG9jaykpOworCisJCWlmICghYmgpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiRUZTOiByZWFkZGlyKCk6IGZhaWxlZCB0byByZWFkIGRpciBibG9jayAlZFxuIiwgYmxvY2spOworCQkJYnJlYWs7CisJCX0KKworCQlkaXJibG9jayA9IChzdHJ1Y3QgZWZzX2RpciAqKSBiaC0+Yl9kYXRhOyAKKworCQlpZiAoYmUxNl90b19jcHUoZGlyYmxvY2stPm1hZ2ljKSAhPSBFRlNfRElSQkxLX01BR0lDKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkVGUzogcmVhZGRpcigpOiBpbnZhbGlkIGRpcmVjdG9yeSBibG9ja1xuIik7CisJCQlicmVsc2UoYmgpOworCQkJYnJlYWs7CisJCX0KKworCQl3aGlsZSAoc2xvdCA8IGRpcmJsb2NrLT5zbG90cykgeworCQkJaWYgKGRpcmJsb2NrLT5zcGFjZVtzbG90XSA9PSAwKSB7CisJCQkJc2xvdCsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlkaXJzbG90ICA9IChzdHJ1Y3QgZWZzX2RlbnRyeSAqKSAoKChjaGFyICopIGJoLT5iX2RhdGEpICsgRUZTX1NMT1RBVChkaXJibG9jaywgc2xvdCkpOworCisJCQlpbm9kZW51bSA9IGJlMzJfdG9fY3B1KGRpcnNsb3QtPmlub2RlKTsKKwkJCW5hbWVsZW4gID0gZGlyc2xvdC0+bmFtZWxlbjsKKwkJCW5hbWVwdHIgID0gZGlyc2xvdC0+bmFtZTsKKworI2lmZGVmIERFQlVHCisJCQlwcmludGsoS0VSTl9ERUJVRyAiRUZTOiByZWFkZGlyKCk6IGJsb2NrICVkIHNsb3QgJWQvJWQ6IGlub2RlICV1LCBuYW1lIFwiJXNcIiwgbmFtZWxlbiAldVxuIiwgYmxvY2ssIHNsb3QsIGRpcmJsb2NrLT5zbG90cy0xLCBpbm9kZW51bSwgbmFtZXB0ciwgbmFtZWxlbik7CisjZW5kaWYKKwkJCWlmIChuYW1lbGVuID4gMCkgeworCQkJCS8qIGZvdW5kIHRoZSBuZXh0IGVudHJ5ICovCisJCQkJZmlscC0+Zl9wb3MgPSAoYmxvY2sgPDwgRUZTX0RJUkJTSVpFX0JJVFMpIHwgc2xvdDsKKworCQkJCS8qIGNvcHkgZmlsZW5hbWUgYW5kIGRhdGEgaW4gZGlyc2xvdCAqLworCQkJCWZpbGxkaXIoZGlyZW50LCBuYW1lcHRyLCBuYW1lbGVuLCBmaWxwLT5mX3BvcywgaW5vZGVudW0sIERUX1VOS05PV04pOworCisJCQkJLyogc2FuaXR5IGNoZWNrICovCisJCQkJaWYgKG5hbWVwdHIgLSAoY2hhciAqKSBkaXJibG9jayArIG5hbWVsZW4gPiBFRlNfRElSQlNJWkUpIHsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRUZTOiBkaXJlY3RvcnkgZW50cnkgJWQgZXhjZWVkcyBkaXJlY3RvcnkgYmxvY2tcbiIsIHNsb3QpOworCQkJCQlzbG90Kys7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCS8qIHN0b3JlIHBvc2l0aW9uIG9mIG5leHQgc2xvdCAqLworCQkJCWlmICgrK3Nsb3QgPT0gZGlyYmxvY2stPnNsb3RzKSB7CisJCQkJCXNsb3QgPSAwOworCQkJCQlibG9jaysrOworCQkJCX0KKwkJCQlicmVsc2UoYmgpOworCQkJCWZpbHAtPmZfcG9zID0gKGJsb2NrIDw8IEVGU19ESVJCU0laRV9CSVRTKSB8IHNsb3Q7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlzbG90Kys7CisJCX0KKwkJYnJlbHNlKGJoKTsKKworCQlzbG90ID0gMDsKKwkJYmxvY2srKzsKKwl9CisKKwlmaWxwLT5mX3BvcyA9IChibG9jayA8PCBFRlNfRElSQlNJWkVfQklUUykgfCBzbG90Oworb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZnMvZWZzL2ZpbGUuYyBiL2ZzL2Vmcy9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRiMjAxMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2Vmcy9maWxlLmMKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIGZpbGUuYworICoKKyAqIENvcHlyaWdodCAoYykgMTk5OSBBbCBTbWl0aAorICoKKyAqIFBvcnRpb25zIGRlcml2ZWQgZnJvbSB3b3JrIChjKSAxOTk1LDE5OTYgQ2hyaXN0aWFuIFZvZ2VsZ3NhbmcuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZWZzX2ZzLmg+CisKK2ludCBlZnNfZ2V0X2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGlibG9jaywKKwkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkKK3sKKwlpbnQgZXJyb3IgPSAtRVJPRlM7CisJbG9uZyBwaHlzOworCisJaWYgKGNyZWF0ZSkKKwkJcmV0dXJuIGVycm9yOworCWlmIChpYmxvY2sgPj0gaW5vZGUtPmlfYmxvY2tzKSB7CisjaWZkZWYgREVCVUcKKwkJLyoKKwkJICogaSBoYXZlIG5vIGlkZWEgd2h5IHRoaXMgaGFwcGVucyBhcyBvZnRlbiBhcyBpdCBkb2VzCisJCSAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HICJFRlM6IGJtYXAoKTogYmxvY2sgJWQgPj0gJWxkIChmaWxlc2l6ZSAlbGQpXG4iLAorCQkJYmxvY2ssCisJCQlpbm9kZS0+aV9ibG9ja3MsCisJCQlpbm9kZS0+aV9zaXplKTsKKyNlbmRpZgorCQlyZXR1cm4gMDsKKwl9CisJcGh5cyA9IGVmc19tYXBfYmxvY2soaW5vZGUsIGlibG9jayk7CisJaWYgKHBoeXMpCisJCW1hcF9iaChiaF9yZXN1bHQsIGlub2RlLT5pX3NiLCBwaHlzKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGVmc19ibWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGVmc19ibG9ja190IGJsb2NrKSB7CisKKwlpZiAoYmxvY2sgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVGUzogYm1hcCgpOiBibG9jayA8IDBcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBhcmUgd2UgYWJvdXQgdG8gcmVhZCBwYXN0IHRoZSBlbmQgb2YgYSBmaWxlID8gKi8KKwlpZiAoIShibG9jayA8IGlub2RlLT5pX2Jsb2NrcykpIHsKKyNpZmRlZiBERUJVRworCQkvKgorCQkgKiBpIGhhdmUgbm8gaWRlYSB3aHkgdGhpcyBoYXBwZW5zIGFzIG9mdGVuIGFzIGl0IGRvZXMKKwkJICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVGUzogYm1hcCgpOiBibG9jayAlZCA+PSAlbGQgKGZpbGVzaXplICVsZClcbiIsCisJCQlibG9jaywKKwkJCWlub2RlLT5pX2Jsb2NrcywKKwkJCWlub2RlLT5pX3NpemUpOworI2VuZGlmCisJCXJldHVybiAwOworCX0KKworCXJldHVybiBlZnNfbWFwX2Jsb2NrKGlub2RlLCBibG9jayk7Cit9CmRpZmYgLS1naXQgYS9mcy9lZnMvaW5vZGUuYyBiL2ZzL2Vmcy9pbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MDYwN2YKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9lZnMvaW5vZGUuYwpAQCAtMCwwICsxLDMwNSBAQAorLyoKKyAqIGlub2RlLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgQWwgU21pdGgKKyAqCisgKiBQb3J0aW9ucyBkZXJpdmVkIGZyb20gd29yayAoYykgMTk5NSwxOTk2IENocmlzdGlhbiBWb2dlbGdzYW5nLAorICogICAgICAgICAgICAgIGFuZCBmcm9tIHdvcmsgKGMpIDE5OTggTWlrZSBTaGF2ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vmc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vmc19mc19zYi5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKworc3RhdGljIGludCBlZnNfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiBibG9ja19yZWFkX2Z1bGxfcGFnZShwYWdlLGVmc19nZXRfYmxvY2spOworfQorc3RhdGljIHNlY3Rvcl90IF9lZnNfYm1hcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc2VjdG9yX3QgYmxvY2spCit7CisJcmV0dXJuIGdlbmVyaWNfYmxvY2tfYm1hcChtYXBwaW5nLGJsb2NrLGVmc19nZXRfYmxvY2spOworfQorc3RhdGljIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgZWZzX2FvcHMgPSB7CisJLnJlYWRwYWdlID0gZWZzX3JlYWRwYWdlLAorCS5zeW5jX3BhZ2UgPSBibG9ja19zeW5jX3BhZ2UsCisJLmJtYXAgPSBfZWZzX2JtYXAKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBleHRlbnRfY29weShlZnNfZXh0ZW50ICpzcmMsIGVmc19leHRlbnQgKmRzdCkgeworCS8qCisJICogdGhpcyBpcyBzbGlnaHRseSBldmlsLiBpdCBkb2Vzbid0IGp1c3QgY29weQorCSAqIGVmc19leHRlbnQgZnJvbSBzcmMgdG8gZHN0LCBpdCBhbHNvIG1hbmdsZXMKKwkgKiB0aGUgYml0cyBzbyB0aGF0IGRzdCBlbmRzIHVwIGluIGNwdSBieXRlLW9yZGVyLgorCSAqLworCisJZHN0LT5jb29rZWQuZXhfbWFnaWMgID0gICh1bnNpZ25lZCBpbnQpIHNyYy0+cmF3WzBdOworCWRzdC0+Y29va2VkLmV4X2JuICAgICA9ICgodW5zaWduZWQgaW50KSBzcmMtPnJhd1sxXSA8PCAxNikgfAorCQkJCSgodW5zaWduZWQgaW50KSBzcmMtPnJhd1syXSA8PCAgOCkgfAorCQkJCSgodW5zaWduZWQgaW50KSBzcmMtPnJhd1szXSA8PCAgMCk7CisJZHN0LT5jb29rZWQuZXhfbGVuZ3RoID0gICh1bnNpZ25lZCBpbnQpIHNyYy0+cmF3WzRdOworCWRzdC0+Y29va2VkLmV4X29mZnNldCA9ICgodW5zaWduZWQgaW50KSBzcmMtPnJhd1s1XSA8PCAxNikgfAorCQkJCSgodW5zaWduZWQgaW50KSBzcmMtPnJhd1s2XSA8PCAgOCkgfAorCQkJCSgodW5zaWduZWQgaW50KSBzcmMtPnJhd1s3XSA8PCAgMCk7CisJcmV0dXJuOworfQorCit2b2lkIGVmc19yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW50IGksIGlub2RlX2luZGV4OworCWRldl90IGRldmljZTsKKwl1MzIgcmRldjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBlZnNfc2JfaW5mbyAgICAqc2IgPSBTVVBFUl9JTkZPKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3QgZWZzX2lub2RlX2luZm8gKmluID0gSU5PREVfSU5GTyhpbm9kZSk7CisJZWZzX2Jsb2NrX3QgYmxvY2ssIG9mZnNldDsKKwlzdHJ1Y3QgZWZzX2Rpbm9kZSAqZWZzX2lub2RlOworICAKKwkvKgorCSoqIEVGUyBsYXlvdXQ6CisJKioKKwkqKiB8ICAgY3lsaW5kZXIgZ3JvdXAgICAgfCAgIGN5bGluZGVyIGdyb3VwICAgIHwgICBjeWxpbmRlciBncm91cCAuLmV0YworCSoqIHxpbm9kZXN8ZGF0YSAgICAgICAgICB8aW5vZGVzfGRhdGEgICAgICAgICAgfGlub2Rlc3xkYXRhICAgICAgIC4uZXRjCisJKioKKwkqKiB3b3JrIG91dCB0aGUgaW5vZGUgYmxvY2sgaW5kZXgsIChjb25zaWRlcmluZyBpbml0aWFsbHkgdGhhdCB0aGUKKwkqKiBpbm9kZXMgYXJlIHN0b3JlZCBhcyBjb25zZWN1dGl2ZSBibG9ja3MpLiB0aGVuIHdvcmsgb3V0IHRoZSBibG9jaworCSoqIG51bWJlciBvZiB0aGF0IGlub2RlIGdpdmVuIHRoZSBhYm92ZSBsYXlvdXQsIGFuZCBmaW5hbGx5IHRoZQorCSoqIG9mZnNldCBvZiB0aGUgaW5vZGUgd2l0aGluIHRoYXQgYmxvY2suCisJKi8KKworCWlub2RlX2luZGV4ID0gaW5vZGUtPmlfaW5vIC8KKwkJKEVGU19CTE9DS1NJWkUgLyBzaXplb2Yoc3RydWN0IGVmc19kaW5vZGUpKTsKKworCWJsb2NrID0gc2ItPmZzX3N0YXJ0ICsgc2ItPmZpcnN0X2Jsb2NrICsgCisJCShzYi0+Z3JvdXBfc2l6ZSAqIChpbm9kZV9pbmRleCAvIHNiLT5pbm9kZV9ibG9ja3MpKSArCisJCShpbm9kZV9pbmRleCAlIHNiLT5pbm9kZV9ibG9ja3MpOworCisJb2Zmc2V0ID0gKGlub2RlLT5pX2lubyAlCisJCQkoRUZTX0JMT0NLU0laRSAvIHNpemVvZihzdHJ1Y3QgZWZzX2Rpbm9kZSkpKSAqCisJCXNpemVvZihzdHJ1Y3QgZWZzX2Rpbm9kZSk7CisKKwliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCBibG9jayk7CisJaWYgKCFiaCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJFRlM6IGJyZWFkKCkgZmFpbGVkIGF0IGJsb2NrICVkXG4iLCBibG9jayk7CisJCWdvdG8gcmVhZF9pbm9kZV9lcnJvcjsKKwl9CisKKwllZnNfaW5vZGUgPSAoc3RydWN0IGVmc19kaW5vZGUgKikgKGJoLT5iX2RhdGEgKyBvZmZzZXQpOworICAgIAorCWlub2RlLT5pX21vZGUgID0gYmUxNl90b19jcHUoZWZzX2lub2RlLT5kaV9tb2RlKTsKKwlpbm9kZS0+aV9ubGluayA9IGJlMTZfdG9fY3B1KGVmc19pbm9kZS0+ZGlfbmxpbmspOworCWlub2RlLT5pX3VpZCAgID0gKHVpZF90KWJlMTZfdG9fY3B1KGVmc19pbm9kZS0+ZGlfdWlkKTsKKwlpbm9kZS0+aV9naWQgICA9IChnaWRfdCliZTE2X3RvX2NwdShlZnNfaW5vZGUtPmRpX2dpZCk7CisJaW5vZGUtPmlfc2l6ZSAgPSBiZTMyX3RvX2NwdShlZnNfaW5vZGUtPmRpX3NpemUpOworCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IGJlMzJfdG9fY3B1KGVmc19pbm9kZS0+ZGlfYXRpbWUpOworCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IGJlMzJfdG9fY3B1KGVmc19pbm9kZS0+ZGlfbXRpbWUpOworCWlub2RlLT5pX2N0aW1lLnR2X3NlYyA9IGJlMzJfdG9fY3B1KGVmc19pbm9kZS0+ZGlfY3RpbWUpOworCWlub2RlLT5pX2F0aW1lLnR2X25zZWMgPSBpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gaW5vZGUtPmlfY3RpbWUudHZfbnNlYyA9IDA7CisKKwkvKiB0aGlzIGlzIHRoZSBudW1iZXIgb2YgYmxvY2tzIGluIHRoZSBmaWxlICovCisJaWYgKGlub2RlLT5pX3NpemUgPT0gMCkgeworCQlpbm9kZS0+aV9ibG9ja3MgPSAwOworCX0gZWxzZSB7CisJCWlub2RlLT5pX2Jsb2NrcyA9ICgoaW5vZGUtPmlfc2l6ZSAtIDEpID4+IEVGU19CTE9DS1NJWkVfQklUUykgKyAxOworCX0KKworCXJkZXYgPSBiZTE2X3RvX2NwdShlZnNfaW5vZGUtPmRpX3UuZGlfZGV2Lm9kZXYpOworCWlmIChyZGV2ID09IDB4ZmZmZikgeworCQlyZGV2ID0gYmUzMl90b19jcHUoZWZzX2lub2RlLT5kaV91LmRpX2Rldi5uZGV2KTsKKwkJaWYgKHN5c3ZfbWFqb3IocmRldikgPiAweGZmZikKKwkJCWRldmljZSA9IDA7CisJCWVsc2UKKwkJCWRldmljZSA9IE1LREVWKHN5c3ZfbWFqb3IocmRldiksIHN5c3ZfbWlub3IocmRldikpOworCX0gZWxzZQorCQlkZXZpY2UgPSBvbGRfZGVjb2RlX2RldihyZGV2KTsKKworCS8qIGdldCB0aGUgbnVtYmVyIG9mIGV4dGVudHMgZm9yIHRoaXMgb2JqZWN0ICovCisJaW4tPm51bWV4dGVudHMgPSBiZTE2X3RvX2NwdShlZnNfaW5vZGUtPmRpX251bWV4dGVudHMpOworCWluLT5sYXN0ZXh0ZW50ID0gMDsKKworCS8qIGNvcHkgdGhlIGV4dGVudHMgY29udGFpbmVkIHdpdGhpbiB0aGUgaW5vZGUgdG8gbWVtb3J5ICovCisJZm9yKGkgPSAwOyBpIDwgRUZTX0RJUkVDVEVYVEVOVFM7IGkrKykgeworCQlleHRlbnRfY29weSgmKGVmc19pbm9kZS0+ZGlfdS5kaV9leHRlbnRzW2ldKSwgJihpbi0+ZXh0ZW50c1tpXSkpOworCQlpZiAoaSA8IGluLT5udW1leHRlbnRzICYmIGluLT5leHRlbnRzW2ldLmNvb2tlZC5leF9tYWdpYyAhPSAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJFRlM6IGV4dGVudCAlZCBoYXMgYmFkIG1hZ2ljIG51bWJlciBpbiBpbm9kZSAlbHVcbiIsIGksIGlub2RlLT5pX2lubyk7CisJCQlicmVsc2UoYmgpOworCQkJZ290byByZWFkX2lub2RlX2Vycm9yOworCQl9CisJfQorCisJYnJlbHNlKGJoKTsKKyAgIAorI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgIkVGUzogcmVhZF9pbm9kZSgpOiBpbm9kZSAlbHUsIGV4dGVudHMgJWQsIG1vZGUgJW9cbiIsCisJCWlub2RlLT5pX2lubywgaW4tPm51bWV4dGVudHMsIGlub2RlLT5pX21vZGUpOworI2VuZGlmCisKKwlzd2l0Y2ggKGlub2RlLT5pX21vZGUgJiBTX0lGTVQpIHsKKwkJY2FzZSBTX0lGRElSOiAKKwkJCWlub2RlLT5pX29wID0gJmVmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsgCisJCQlpbm9kZS0+aV9mb3AgPSAmZWZzX2Rpcl9vcGVyYXRpb25zOyAKKwkJCWJyZWFrOworCQljYXNlIFNfSUZSRUc6CisJCQlpbm9kZS0+aV9mb3AgPSAmZ2VuZXJpY19yb19mb3BzOworCQkJaW5vZGUtPmlfZGF0YS5hX29wcyA9ICZlZnNfYW9wczsKKwkJCWJyZWFrOworCQljYXNlIFNfSUZMTks6CisJCQlpbm9kZS0+aV9vcCA9ICZwYWdlX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWlub2RlLT5pX2RhdGEuYV9vcHMgPSAmZWZzX3N5bWxpbmtfYW9wczsKKwkJCWJyZWFrOworCQljYXNlIFNfSUZDSFI6CisJCWNhc2UgU19JRkJMSzoKKwkJY2FzZSBTX0lGSUZPOgorCQkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLCBkZXZpY2UpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJFRlM6IHVuc3VwcG9ydGVkIGlub2RlIG1vZGUgJW9cbiIsIGlub2RlLT5pX21vZGUpOworCQkJZ290byByZWFkX2lub2RlX2Vycm9yOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuOworICAgICAgICAKK3JlYWRfaW5vZGVfZXJyb3I6CisJcHJpbnRrKEtFUk5fV0FSTklORyAiRUZTOiBmYWlsZWQgdG8gcmVhZCBpbm9kZSAlbHVcbiIsIGlub2RlLT5pX2lubyk7CisJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgaW5saW5lIGVmc19ibG9ja190CitlZnNfZXh0ZW50X2NoZWNrKGVmc19leHRlbnQgKnB0ciwgZWZzX2Jsb2NrX3QgYmxvY2ssIHN0cnVjdCBlZnNfc2JfaW5mbyAqc2IpIHsKKwllZnNfYmxvY2tfdCBzdGFydDsKKwllZnNfYmxvY2tfdCBsZW5ndGg7CisJZWZzX2Jsb2NrX3Qgb2Zmc2V0OworCisJLyoKKwkgKiBnaXZlbiBhbiBleHRlbnQgYW5kIGEgbG9naWNhbCBibG9jayB3aXRoaW4gYSBmaWxlLAorCSAqIGNhbiB0aGlzIGJsb2NrIGJlIGZvdW5kIHdpdGhpbiB0aGlzIGV4dGVudCA/CisJICovCisJc3RhcnQgID0gcHRyLT5jb29rZWQuZXhfYm47CisJbGVuZ3RoID0gcHRyLT5jb29rZWQuZXhfbGVuZ3RoOworCW9mZnNldCA9IHB0ci0+Y29va2VkLmV4X29mZnNldDsKKworCWlmICgoYmxvY2sgPj0gb2Zmc2V0KSAmJiAoYmxvY2sgPCBvZmZzZXQrbGVuZ3RoKSkgeworCQlyZXR1cm4oc2ItPmZzX3N0YXJ0ICsgc3RhcnQgKyBibG9jayAtIG9mZnNldCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIDA7CisJfQorfQorCitlZnNfYmxvY2tfdCBlZnNfbWFwX2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGVmc19ibG9ja190IGJsb2NrKSB7CisJc3RydWN0IGVmc19zYl9pbmZvICAgICpzYiA9IFNVUEVSX0lORk8oaW5vZGUtPmlfc2IpOworCXN0cnVjdCBlZnNfaW5vZGVfaW5mbyAqaW4gPSBJTk9ERV9JTkZPKGlub2RlKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgICAgKmJoID0gTlVMTDsKKworCWludCBjdXIsIGxhc3QsIGZpcnN0ID0gMTsKKwlpbnQgaWJhc2UsIGlvZmZzZXQsIGRpcmV4dCwgZGlyZXh0cywgaW5kZXh0LCBpbmRleHRzOworCWVmc19ibG9ja190IGlibG9jaywgcmVzdWx0ID0gMCwgbGFzdGJsb2NrID0gMDsKKwllZnNfZXh0ZW50IGV4dCwgKmV4dHM7CisKKwlsYXN0ID0gaW4tPmxhc3RleHRlbnQ7CisKKwlpZiAoaW4tPm51bWV4dGVudHMgPD0gRUZTX0RJUkVDVEVYVEVOVFMpIHsKKwkJLyogZmlyc3QgY2hlY2sgdGhlIGxhc3QgZXh0ZW50IHdlIHJldHVybmVkICovCisJCWlmICgocmVzdWx0ID0gZWZzX2V4dGVudF9jaGVjaygmaW4tPmV4dGVudHNbbGFzdF0sIGJsb2NrLCBzYikpKQorCQkJcmV0dXJuIHJlc3VsdDsKKyAgICAKKwkJLyogaWYgd2Ugb25seSBoYXZlIG9uZSBleHRlbnQgdGhlbiBub3RoaW5nIGNhbiBiZSBmb3VuZCAqLworCQlpZiAoaW4tPm51bWV4dGVudHMgPT0gMSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJFRlM6IG1hcF9ibG9jaygpIGZhaWxlZCB0byBtYXAgKDEgZXh0ZW50KVxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWRpcmV4dHMgPSBpbi0+bnVtZXh0ZW50czsKKworCQkvKgorCQkgKiBjaGVjayB0aGUgc3RvcmVkIGV4dGVudHMgaW4gdGhlIGlub2RlCisJCSAqIHN0YXJ0IHdpdGggbmV4dCBleHRlbnQgYW5kIGNoZWNrIGZvcndhcmRzCisJCSAqLworCQlmb3IoZGlyZXh0ID0gMTsgZGlyZXh0IDwgZGlyZXh0czsgZGlyZXh0KyspIHsKKwkJCWN1ciA9IChsYXN0ICsgZGlyZXh0KSAlIGluLT5udW1leHRlbnRzOworCQkJaWYgKChyZXN1bHQgPSBlZnNfZXh0ZW50X2NoZWNrKCZpbi0+ZXh0ZW50c1tjdXJdLCBibG9jaywgc2IpKSkgeworCQkJCWluLT5sYXN0ZXh0ZW50ID0gY3VyOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKworCQlwcmludGsoS0VSTl9FUlIgIkVGUzogbWFwX2Jsb2NrKCkgZmFpbGVkIHRvIG1hcCBibG9jayAldSAoZGlyKVxuIiwgYmxvY2spOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZmRlZiBERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJFRlM6IG1hcF9ibG9jaygpOiBpbmRpcmVjdCBzZWFyY2ggZm9yIGxvZ2ljYWwgYmxvY2sgJXVcbiIsIGJsb2NrKTsKKyNlbmRpZgorCWRpcmV4dHMgPSBpbi0+ZXh0ZW50c1swXS5jb29rZWQuZXhfb2Zmc2V0OworCWluZGV4dHMgPSBpbi0+bnVtZXh0ZW50czsKKworCWZvcihpbmRleHQgPSAwOyBpbmRleHQgPCBpbmRleHRzOyBpbmRleHQrKykgeworCQljdXIgPSAobGFzdCArIGluZGV4dCkgJSBpbmRleHRzOworCisJCS8qCisJCSAqIHdvcmsgb3V0IHdoaWNoIGRpcmVjdCBleHRlbnQgY29udGFpbnMgYGN1cicuCisJCSAqCisJCSAqIGFsc28gY29tcHV0ZSBpYmFzZTogaS5lLiB0aGUgbnVtYmVyIG9mIHRoZSBmaXJzdAorCQkgKiBpbmRpcmVjdCBleHRlbnQgY29udGFpbmVkIHdpdGhpbiBkaXJlY3QgZXh0ZW50IGBjdXInLgorCQkgKgorCQkgKi8KKwkJaWJhc2UgPSAwOworCQlmb3IoZGlyZXh0ID0gMDsgY3VyIDwgaWJhc2UgJiYgZGlyZXh0IDwgZGlyZXh0czsgZGlyZXh0KyspIHsKKwkJCWliYXNlICs9IGluLT5leHRlbnRzW2RpcmV4dF0uY29va2VkLmV4X2xlbmd0aCAqCisJCQkJKEVGU19CTE9DS1NJWkUgLyBzaXplb2YoZWZzX2V4dGVudCkpOworCQl9CisKKwkJaWYgKGRpcmV4dCA9PSBkaXJleHRzKSB7CisJCQkvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCQlwcmludGsoS0VSTl9FUlIgIkVGUzogY291bGRuJ3QgZmluZCBkaXJlY3QgZXh0ZW50IGZvciBpbmRpcmVjdCBleHRlbnQgJWQgKGJsb2NrICV1KVxuIiwgY3VyLCBibG9jayk7CisJCQlpZiAoYmgpIGJyZWxzZShiaCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkKKwkJLyogd29yayBvdXQgYmxvY2sgbnVtYmVyIGFuZCBvZmZzZXQgb2YgdGhpcyBpbmRpcmVjdCBleHRlbnQgKi8KKwkJaWJsb2NrID0gc2ItPmZzX3N0YXJ0ICsgaW4tPmV4dGVudHNbZGlyZXh0XS5jb29rZWQuZXhfYm4gKworCQkJKGN1ciAtIGliYXNlKSAvCisJCQkoRUZTX0JMT0NLU0laRSAvIHNpemVvZihlZnNfZXh0ZW50KSk7CisJCWlvZmZzZXQgPSAoY3VyIC0gaWJhc2UpICUKKwkJCShFRlNfQkxPQ0tTSVpFIC8gc2l6ZW9mKGVmc19leHRlbnQpKTsKKworCQlpZiAoZmlyc3QgfHwgbGFzdGJsb2NrICE9IGlibG9jaykgeworCQkJaWYgKGJoKSBicmVsc2UoYmgpOworCisJCQliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCBpYmxvY2spOworCQkJaWYgKCFiaCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiRUZTOiBicmVhZCgpIGZhaWxlZCBhdCBibG9jayAlZFxuIiwgaWJsb2NrKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKyNpZmRlZiBERUJVRworCQkJcHJpbnRrKEtFUk5fREVCVUcgIkVGUzogbWFwX2Jsb2NrKCk6IHJlYWQgaW5kaXJlY3QgZXh0ZW50IGJsb2NrICVkXG4iLCBpYmxvY2spOworI2VuZGlmCisJCQlmaXJzdCA9IDA7CisJCQlsYXN0YmxvY2sgPSBpYmxvY2s7CisJCX0KKworCQlleHRzID0gKGVmc19leHRlbnQgKikgYmgtPmJfZGF0YTsKKworCQlleHRlbnRfY29weSgmKGV4dHNbaW9mZnNldF0pLCAmZXh0KTsKKworCQlpZiAoZXh0LmNvb2tlZC5leF9tYWdpYyAhPSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkVGUzogZXh0ZW50ICVkIGhhcyBiYWQgbWFnaWMgbnVtYmVyIGluIGJsb2NrICVkXG4iLCBjdXIsIGlibG9jayk7CisJCQlpZiAoYmgpIGJyZWxzZShiaCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICgocmVzdWx0ID0gZWZzX2V4dGVudF9jaGVjaygmZXh0LCBibG9jaywgc2IpKSkgeworCQkJaWYgKGJoKSBicmVsc2UoYmgpOworCQkJaW4tPmxhc3RleHRlbnQgPSBjdXI7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJfQorCWlmIChiaCkgYnJlbHNlKGJoKTsKKwlwcmludGsoS0VSTl9FUlIgIkVGUzogbWFwX2Jsb2NrKCkgZmFpbGVkIHRvIG1hcCBibG9jayAldSAoaW5kaXIpXG4iLCBibG9jayk7CisJcmV0dXJuIDA7Cit9ICAKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvZWZzL25hbWVpLmMgYi9mcy9lZnMvbmFtZWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDRhMjA3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZWZzL25hbWVpLmMKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBuYW1laS5jCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5IEFsIFNtaXRoCisgKgorICogUG9ydGlvbnMgZGVyaXZlZCBmcm9tIHdvcmsgKGMpIDE5OTUsMTk5NiBDaHJpc3RpYW4gVm9nZWxnc2FuZy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCitzdGF0aWMgZWZzX2lub190IGVmc19maW5kX2VudHJ5KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4pIHsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCisJaW50CQkJc2xvdCwgbmFtZWxlbjsKKwljaGFyCQkJKm5hbWVwdHI7CisJc3RydWN0IGVmc19kaXIJCSpkaXJibG9jazsKKwlzdHJ1Y3QgZWZzX2RlbnRyeQkqZGlyc2xvdDsKKwllZnNfaW5vX3QJCWlub2RlbnVtOworCWVmc19ibG9ja190CQlibG9jazsKKyAKKwlpZiAoaW5vZGUtPmlfc2l6ZSAmIChFRlNfRElSQlNJWkUtMSkpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVGUzogV0FSTklORzogZmluZF9lbnRyeSgpOiBkaXJlY3Rvcnkgc2l6ZSBub3QgYSBtdWx0aXBsZSBvZiBFRlNfRElSQlNJWkVcbiIpOworCisJZm9yKGJsb2NrID0gMDsgYmxvY2sgPCBpbm9kZS0+aV9ibG9ja3M7IGJsb2NrKyspIHsKKworCQliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCBlZnNfYm1hcChpbm9kZSwgYmxvY2spKTsKKwkJaWYgKCFiaCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJFRlM6IGZpbmRfZW50cnkoKTogZmFpbGVkIHRvIHJlYWQgZGlyIGJsb2NrICVkXG4iLCBibG9jayk7CisJCQlyZXR1cm4gMDsKKwkJfQorICAgIAorCQlkaXJibG9jayA9IChzdHJ1Y3QgZWZzX2RpciAqKSBiaC0+Yl9kYXRhOworCisJCWlmIChiZTE2X3RvX2NwdShkaXJibG9jay0+bWFnaWMpICE9IEVGU19ESVJCTEtfTUFHSUMpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiRUZTOiBmaW5kX2VudHJ5KCk6IGludmFsaWQgZGlyZWN0b3J5IGJsb2NrXG4iKTsKKwkJCWJyZWxzZShiaCk7CisJCQlyZXR1cm4oMCk7CisJCX0KKworCQlmb3Ioc2xvdCA9IDA7IHNsb3QgPCBkaXJibG9jay0+c2xvdHM7IHNsb3QrKykgeworCQkJZGlyc2xvdCAgPSAoc3RydWN0IGVmc19kZW50cnkgKikgKCgoY2hhciAqKSBiaC0+Yl9kYXRhKSArIEVGU19TTE9UQVQoZGlyYmxvY2ssIHNsb3QpKTsKKworCQkJbmFtZWxlbiAgPSBkaXJzbG90LT5uYW1lbGVuOworCQkJbmFtZXB0ciAgPSBkaXJzbG90LT5uYW1lOworCisJCQlpZiAoKG5hbWVsZW4gPT0gbGVuKSAmJiAoIW1lbWNtcChuYW1lLCBuYW1lcHRyLCBsZW4pKSkgeworCQkJCWlub2RlbnVtID0gYmUzMl90b19jcHUoZGlyc2xvdC0+aW5vZGUpOworCQkJCWJyZWxzZShiaCk7CisJCQkJcmV0dXJuKGlub2RlbnVtKTsKKwkJCX0KKwkJfQorCQlicmVsc2UoYmgpOworCX0KKwlyZXR1cm4oMCk7Cit9CisKK3N0cnVjdCBkZW50cnkgKmVmc19sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpIHsKKwllZnNfaW5vX3QgaW5vZGVudW07CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBOVUxMOworCisJbG9ja19rZXJuZWwoKTsKKwlpbm9kZW51bSA9IGVmc19maW5kX2VudHJ5KGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuKTsKKwlpZiAoaW5vZGVudW0pIHsKKwkJaWYgKCEoaW5vZGUgPSBpZ2V0KGRpci0+aV9zYiwgaW5vZGVudW0pKSkgeworCQkJdW5sb2NrX2tlcm5lbCgpOworCQkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CisJCX0KKwl9CisJdW5sb2NrX2tlcm5lbCgpOworCisJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBkZW50cnkgKmVmc19nZXRfcGFyZW50KHN0cnVjdCBkZW50cnkgKmNoaWxkKQoreworCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWVmc19pbm9fdCBpbm87CisJaW50IGVycm9yOworCisJbG9ja19rZXJuZWwoKTsKKworCWVycm9yID0gLUVOT0VOVDsKKwlpbm8gPSBlZnNfZmluZF9lbnRyeShjaGlsZC0+ZF9pbm9kZSwgIi4uIiwgMik7CisJaWYgKCFpbm8pCisJCWdvdG8gZmFpbDsKKworCWVycm9yID0gLUVBQ0NFUzsKKwlpbm9kZSA9IGlnZXQoY2hpbGQtPmRfaW5vZGUtPmlfc2IsIGlubyk7CisJaWYgKCFpbm9kZSkKKwkJZ290byBmYWlsOworCisJZXJyb3IgPSAtRU5PTUVNOworCXBhcmVudCA9IGRfYWxsb2NfYW5vbihpbm9kZSk7CisJaWYgKCFwYXJlbnQpCisJCWdvdG8gZmFpbF9pcHV0OworCisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBwYXJlbnQ7CisKKyBmYWlsX2lwdXQ6CisJaXB1dChpbm9kZSk7CisgZmFpbDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOworfQpkaWZmIC0tZ2l0IGEvZnMvZWZzL3N1cGVyLmMgYi9mcy9lZnMvc3VwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGQ1ZWE5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZWZzL3N1cGVyLmMKQEAgLTAsMCArMSwzNDMgQEAKKy8qCisgKiBzdXBlci5jCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5IEFsIFNtaXRoCisgKgorICogUG9ydGlvbnMgZGVyaXZlZCBmcm9tIHdvcmsgKGMpIDE5OTUsMTk5NiBDaHJpc3RpYW4gVm9nZWxnc2FuZy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vmc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vmc192aC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vmc19mc19zYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgorCitzdGF0aWMgaW50IGVmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKTsKK3N0YXRpYyBpbnQgZWZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB2b2lkICpkLCBpbnQgc2lsZW50KTsKKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqZWZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoreworCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIGVmc19maWxsX3N1cGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGVmc19mc190eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiZWZzIiwKKwkuZ2V0X3NiCQk9IGVmc19nZXRfc2IsCisJLmtpbGxfc2IJPSBraWxsX2Jsb2NrX3N1cGVyLAorCS5mc19mbGFncwk9IEZTX1JFUVVJUkVTX0RFViwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHRfdHlwZXMgc2dpX3B0X3R5cGVzW10gPSB7CisJezB4MDAsCQkiU0dJIHZoIn0sCisJezB4MDEsCQkiU0dJIHRya3JlcGwifSwKKwl7MHgwMiwJCSJTR0kgc2VjcmVwbCJ9LAorCXsweDAzLAkJIlNHSSByYXcifSwKKwl7MHgwNCwJCSJTR0kgYnNkIn0sCisJe1NHSV9TWVNWLAkiU0dJIHN5c3YifSwKKwl7MHgwNiwJCSJTR0kgdm9sIn0sCisJe1NHSV9FRlMsCSJTR0kgZWZzIn0sCisJezB4MDgsCQkiU0dJIGx2In0sCisJezB4MDksCQkiU0dJIHJsdiJ9LAorCXsweDBBLAkJIlNHSSB4ZnMifSwKKwl7MHgwQiwJCSJTR0kgeGZzbG9nIn0sCisJezB4MEMsCQkiU0dJIHhsdiJ9LAorCXsweDgyLAkJIkxpbnV4IHN3YXAifSwKKwl7MHg4MywJCSJMaW51eCBuYXRpdmUifSwKKwl7MCwJCU5VTEx9Cit9OworCisKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKiBlZnNfaW5vZGVfY2FjaGVwOworCitzdGF0aWMgc3RydWN0IGlub2RlICplZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgZWZzX2lub2RlX2luZm8gKmVpOworCWVpID0gKHN0cnVjdCBlZnNfaW5vZGVfaW5mbyAqKWttZW1fY2FjaGVfYWxsb2MoZWZzX2lub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCWlmICghZWkpCisJCXJldHVybiBOVUxMOworCXJldHVybiAmZWktPnZmc19pbm9kZTsKK30KKworc3RhdGljIHZvaWQgZWZzX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlrbWVtX2NhY2hlX2ZyZWUoZWZzX2lub2RlX2NhY2hlcCwgSU5PREVfSU5GTyhpbm9kZSkpOworfQorCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBlZnNfaW5vZGVfaW5mbyAqZWkgPSAoc3RydWN0IGVmc19pbm9kZV9pbmZvICopIGZvbzsKKworCWlmICgoZmxhZ3MgJiAoU0xBQl9DVE9SX1ZFUklGWXxTTEFCX0NUT1JfQ09OU1RSVUNUT1IpKSA9PQorCSAgICBTTEFCX0NUT1JfQ09OU1RSVUNUT1IpCisJCWlub2RlX2luaXRfb25jZSgmZWktPnZmc19pbm9kZSk7Cit9CisgCitzdGF0aWMgaW50IGluaXRfaW5vZGVjYWNoZSh2b2lkKQoreworCWVmc19pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiZWZzX2lub2RlX2NhY2hlIiwKKwkJCQlzaXplb2Yoc3RydWN0IGVmc19pbm9kZV9pbmZvKSwKKwkJCQkwLCBTTEFCX1JFQ0xBSU1fQUNDT1VOVCwKKwkJCQlpbml0X29uY2UsIE5VTEwpOworCWlmIChlZnNfaW5vZGVfY2FjaGVwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X2lub2RlY2FjaGUodm9pZCkKK3sKKwlpZiAoa21lbV9jYWNoZV9kZXN0cm95KGVmc19pbm9kZV9jYWNoZXApKQorCQlwcmludGsoS0VSTl9JTkZPICJlZnNfaW5vZGVfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKK30KKworc3RhdGljIHZvaWQgZWZzX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCit7CisJa2ZyZWUocy0+c19mc19pbmZvKTsKKwlzLT5zX2ZzX2luZm8gPSBOVUxMOworfQorCitzdGF0aWMgaW50IGVmc19yZW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpCit7CisJKmZsYWdzIHw9IE1TX1JET05MWTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGVmc19zdXBlcmJsb2NrX29wZXJhdGlvbnMgPSB7CisJLmFsbG9jX2lub2RlCT0gZWZzX2FsbG9jX2lub2RlLAorCS5kZXN0cm95X2lub2RlCT0gZWZzX2Rlc3Ryb3lfaW5vZGUsCisJLnJlYWRfaW5vZGUJPSBlZnNfcmVhZF9pbm9kZSwKKwkucHV0X3N1cGVyCT0gZWZzX3B1dF9zdXBlciwKKwkuc3RhdGZzCQk9IGVmc19zdGF0ZnMsCisJLnJlbW91bnRfZnMJPSBlZnNfcmVtb3VudCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgZWZzX2V4cG9ydF9vcHMgPSB7CisJLmdldF9wYXJlbnQJPSBlZnNfZ2V0X3BhcmVudCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfZWZzX2ZzKHZvaWQpIHsKKwlpbnQgZXJyOworCXByaW50aygiRUZTOiAiRUZTX1ZFUlNJT04iIC0gaHR0cDovL2Flc2NoaS5jaC5ldS5vcmcvZWZzL1xuIik7CisJZXJyID0gaW5pdF9pbm9kZWNhY2hlKCk7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworCWVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmVmc19mc190eXBlKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwlyZXR1cm4gMDsKK291dDoKKwlkZXN0cm95X2lub2RlY2FjaGUoKTsKK291dDE6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfZWZzX2ZzKHZvaWQpIHsKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmVmc19mc190eXBlKTsKKwlkZXN0cm95X2lub2RlY2FjaGUoKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9lZnNfZnMpCittb2R1bGVfZXhpdChleGl0X2Vmc19mcykKKworc3RhdGljIGVmc19ibG9ja190IGVmc192YWxpZGF0ZV92aChzdHJ1Y3Qgdm9sdW1lX2hlYWRlciAqdmgpIHsKKwlpbnQJCWk7CisJX19iZTMyCQljcywgKnVpOworCWludAkJY3N1bTsKKwllZnNfYmxvY2tfdAlzYmxvY2sgPSAwOyAvKiBzaHV0cyB1cCBnY2MgKi8KKwlzdHJ1Y3QgcHRfdHlwZXMJKnB0X2VudHJ5OworCWludAkJcHRfdHlwZSwgc2xpY2UgPSAtMTsKKworCWlmIChiZTMyX3RvX2NwdSh2aC0+dmhfbWFnaWMpICE9IFZITUFHSUMpIHsKKwkJLyoKKwkJICogYXNzdW1lIHRoYXQgd2UncmUgZGVhbGluZyB3aXRoIGEgcGFydGl0aW9uIGFuZCBhbGxvdworCQkgKiByZWFkX3N1cGVyKCkgdG8gdHJ5IGFuZCBkZXRlY3QgYSB2YWxpZCBzdXBlcmJsb2NrCisJCSAqIG9uIHRoZSBuZXh0IGJsb2NrLgorCQkgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJdWkgPSAoKF9fYmUzMiAqKSAodmggKyAxKSkgLSAxOworCWZvcihjc3VtID0gMDsgdWkgPj0gKChfX2JlMzIgKikgdmgpOykgeworCQljcyA9ICp1aS0tOworCQljc3VtICs9IGJlMzJfdG9fY3B1KGNzKTsKKwl9CisJaWYgKGNzdW0pIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRUZTOiBTR0kgZGlza2xhYmVsOiBjaGVja3N1bSBiYWQsIGxhYmVsIGNvcnJ1cHRlZFxuIik7CisJCXJldHVybiAwOworCX0KKworI2lmZGVmIERFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgIkVGUzogYmY6IFwiJTE2c1wiXG4iLCB2aC0+dmhfYm9vdGZpbGUpOworCisJZm9yKGkgPSAwOyBpIDwgTlZESVI7IGkrKykgeworCQlpbnQJajsKKwkJY2hhcgluYW1lW1ZETkFNRVNJWkUrMV07CisKKwkJZm9yKGogPSAwOyBqIDwgVkROQU1FU0laRTsgaisrKSB7CisJCQluYW1lW2pdID0gdmgtPnZoX3ZkW2ldLnZkX25hbWVbal07CisJCX0KKwkJbmFtZVtqXSA9IChjaGFyKSAwOworCisJCWlmIChuYW1lWzBdKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiRUZTOiB2aDogJThzIGJsb2NrOiAweCUwOHggc2l6ZTogMHglMDh4XG4iLAorCQkJCW5hbWUsCisJCQkJKGludCkgYmUzMl90b19jcHUodmgtPnZoX3ZkW2ldLnZkX2xibiksCisJCQkJKGludCkgYmUzMl90b19jcHUodmgtPnZoX3ZkW2ldLnZkX25ieXRlcykpOworCQl9CisJfQorI2VuZGlmCisKKwlmb3IoaSA9IDA7IGkgPCBOUEFSVEFCOyBpKyspIHsKKwkJcHRfdHlwZSA9IChpbnQpIGJlMzJfdG9fY3B1KHZoLT52aF9wdFtpXS5wdF90eXBlKTsKKwkJZm9yKHB0X2VudHJ5ID0gc2dpX3B0X3R5cGVzOyBwdF9lbnRyeS0+cHRfbmFtZTsgcHRfZW50cnkrKykgeworCQkJaWYgKHB0X3R5cGUgPT0gcHRfZW50cnktPnB0X3R5cGUpIGJyZWFrOworCQl9CisjaWZkZWYgREVCVUcKKwkJaWYgKGJlMzJfdG9fY3B1KHZoLT52aF9wdFtpXS5wdF9uYmxrcykpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJFRlM6IHB0ICUyZDogc3RhcnQ6ICUwOGQgc2l6ZTogJTA4ZCB0eXBlOiAweCUwMnggKCVzKVxuIiwKKwkJCQlpLAorCQkJCShpbnQpIGJlMzJfdG9fY3B1KHZoLT52aF9wdFtpXS5wdF9maXJzdGxibiksCisJCQkJKGludCkgYmUzMl90b19jcHUodmgtPnZoX3B0W2ldLnB0X25ibGtzKSwKKwkJCQlwdF90eXBlLAorCQkJCShwdF9lbnRyeS0+cHRfbmFtZSkgPyBwdF9lbnRyeS0+cHRfbmFtZSA6ICJ1bmtub3duIik7CisJCX0KKyNlbmRpZgorCQlpZiAoSVNfRUZTKHB0X3R5cGUpKSB7CisJCQlzYmxvY2sgPSBiZTMyX3RvX2NwdSh2aC0+dmhfcHRbaV0ucHRfZmlyc3RsYm4pOworCQkJc2xpY2UgPSBpOworCQl9CisJfQorCisJaWYgKHNsaWNlID09IC0xKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiRUZTOiBwYXJ0aXRpb24gdGFibGUgY29udGFpbmVkIG5vIEVGUyBwYXJ0aXRpb25zXG4iKTsKKyNpZmRlZiBERUJVRworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0lORk8gIkVGUzogdXNpbmcgc2xpY2UgJWQgKHR5cGUgJXMsIG9mZnNldCAweCV4KVxuIiwKKwkJCXNsaWNlLAorCQkJKHB0X2VudHJ5LT5wdF9uYW1lKSA/IHB0X2VudHJ5LT5wdF9uYW1lIDogInVua25vd24iLAorCQkJc2Jsb2NrKTsKKyNlbmRpZgorCX0KKwlyZXR1cm4oc2Jsb2NrKTsKK30KKworc3RhdGljIGludCBlZnNfdmFsaWRhdGVfc3VwZXIoc3RydWN0IGVmc19zYl9pbmZvICpzYiwgc3RydWN0IGVmc19zdXBlciAqc3VwZXIpIHsKKworCWlmICghSVNfRUZTX01BR0lDKGJlMzJfdG9fY3B1KHN1cGVyLT5mc19tYWdpYykpKSByZXR1cm4gLTE7CisKKwlzYi0+ZnNfbWFnaWMgICAgID0gYmUzMl90b19jcHUoc3VwZXItPmZzX21hZ2ljKTsKKwlzYi0+dG90YWxfYmxvY2tzID0gYmUzMl90b19jcHUoc3VwZXItPmZzX3NpemUpOworCXNiLT5maXJzdF9ibG9jayAgPSBiZTMyX3RvX2NwdShzdXBlci0+ZnNfZmlyc3RjZyk7CisJc2ItPmdyb3VwX3NpemUgICA9IGJlMzJfdG9fY3B1KHN1cGVyLT5mc19jZ2ZzaXplKTsKKwlzYi0+ZGF0YV9mcmVlICAgID0gYmUzMl90b19jcHUoc3VwZXItPmZzX3RmcmVlKTsKKwlzYi0+aW5vZGVfZnJlZSAgID0gYmUzMl90b19jcHUoc3VwZXItPmZzX3Rpbm9kZSk7CisJc2ItPmlub2RlX2Jsb2NrcyA9IGJlMTZfdG9fY3B1KHN1cGVyLT5mc19jZ2lzaXplKTsKKwlzYi0+dG90YWxfZ3JvdXBzID0gYmUxNl90b19jcHUoc3VwZXItPmZzX25jZyk7CisgICAgCisJcmV0dXJuIDA7ICAgIAorfQorCitzdGF0aWMgaW50IGVmc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdm9pZCAqZCwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgZWZzX3NiX2luZm8gKnNiOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGlub2RlICpyb290OworCisgCXNiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGVmc19zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYikKKwkJcmV0dXJuIC1FTk9NRU07CisJcy0+c19mc19pbmZvID0gc2I7CisJbWVtc2V0KHNiLCAwLCBzaXplb2Yoc3RydWN0IGVmc19zYl9pbmZvKSk7CisgCisJcy0+c19tYWdpYwkJPSBFRlNfU1VQRVJfTUFHSUM7CisJaWYgKCFzYl9zZXRfYmxvY2tzaXplKHMsIEVGU19CTE9DS1NJWkUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRUZTOiBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCAlZCBieXRlIGJsb2Nrc1xuIiwKKwkJCUVGU19CTE9DS1NJWkUpOworCQlnb3RvIG91dF9ub19mc191bDsKKwl9CisgIAorCS8qIHJlYWQgdGhlIHZoICh2b2x1bWUgaGVhZGVyKSBibG9jayAqLworCWJoID0gc2JfYnJlYWQocywgMCk7CisKKwlpZiAoIWJoKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRUZTOiBjYW5ub3QgcmVhZCB2b2x1bWUgaGVhZGVyXG4iKTsKKwkJZ290byBvdXRfbm9fZnNfdWw7CisJfQorCisJLyoKKwkgKiBpZiB0aGlzIHJldHVybnMgemVybyB0aGVuIHdlIGRpZG4ndCBmaW5kIGFueSBwYXJ0aXRpb24gdGFibGUuCisJICogdGhpcyBpc24ndCAoeWV0KSBhbiBlcnJvciAtIGp1c3QgYXNzdW1lIGZvciB0aGUgbW9tZW50IHRoYXQKKwkgKiB0aGUgZGV2aWNlIGlzIHZhbGlkIGFuZCBnbyBvbiB0byBzZWFyY2ggZm9yIGEgc3VwZXJibG9jay4KKwkgKi8KKwlzYi0+ZnNfc3RhcnQgPSBlZnNfdmFsaWRhdGVfdmgoKHN0cnVjdCB2b2x1bWVfaGVhZGVyICopIGJoLT5iX2RhdGEpOworCWJyZWxzZShiaCk7CisKKwlpZiAoc2ItPmZzX3N0YXJ0ID09IC0xKSB7CisJCWdvdG8gb3V0X25vX2ZzX3VsOworCX0KKworCWJoID0gc2JfYnJlYWQocywgc2ItPmZzX3N0YXJ0ICsgRUZTX1NVUEVSKTsKKwlpZiAoIWJoKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRUZTOiBjYW5ub3QgcmVhZCBzdXBlcmJsb2NrXG4iKTsKKwkJZ290byBvdXRfbm9fZnNfdWw7CisJfQorCQkKKwlpZiAoZWZzX3ZhbGlkYXRlX3N1cGVyKHNiLCAoc3RydWN0IGVmc19zdXBlciAqKSBiaC0+Yl9kYXRhKSkgeworI2lmZGVmIERFQlVHCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVGUzogaW52YWxpZCBzdXBlcmJsb2NrIGF0IGJsb2NrICV1XG4iLCBzYi0+ZnNfc3RhcnQgKyBFRlNfU1VQRVIpOworI2VuZGlmCisJCWJyZWxzZShiaCk7CisJCWdvdG8gb3V0X25vX2ZzX3VsOworCX0KKwlicmVsc2UoYmgpOworCisJaWYgKCEocy0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKyNpZmRlZiBERUJVRworCQlwcmludGsoS0VSTl9JTkZPICJFRlM6IGZvcmNpbmcgcmVhZC1vbmx5IG1vZGVcbiIpOworI2VuZGlmCisJCXMtPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCX0KKwlzLT5zX29wICAgPSAmZWZzX3N1cGVyYmxvY2tfb3BlcmF0aW9uczsKKwlzLT5zX2V4cG9ydF9vcCA9ICZlZnNfZXhwb3J0X29wczsKKwlyb290ID0gaWdldChzLCBFRlNfUk9PVElOT0RFKTsKKwlzLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdCk7CisgCisJaWYgKCEocy0+c19yb290KSkgeworCQlwcmludGsoS0VSTl9FUlIgIkVGUzogZ2V0IHJvb3QgaW5vZGUgZmFpbGVkXG4iKTsKKwkJaXB1dChyb290KTsKKwkJZ290byBvdXRfbm9fZnM7CisJfQorCisJcmV0dXJuIDA7CisKK291dF9ub19mc191bDoKK291dF9ub19mczoKKwlzLT5zX2ZzX2luZm8gPSBOVUxMOworCWtmcmVlKHNiKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBlZnNfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc3RydWN0IGtzdGF0ZnMgKmJ1ZikgeworCXN0cnVjdCBlZnNfc2JfaW5mbyAqc2IgPSBTVVBFUl9JTkZPKHMpOworCisJYnVmLT5mX3R5cGUgICAgPSBFRlNfU1VQRVJfTUFHSUM7CS8qIGVmcyBtYWdpYyBudW1iZXIgKi8KKwlidWYtPmZfYnNpemUgICA9IEVGU19CTE9DS1NJWkU7CQkvKiBibG9ja3NpemUgKi8KKwlidWYtPmZfYmxvY2tzICA9IHNiLT50b3RhbF9ncm91cHMgKgkvKiB0b3RhbCBkYXRhIGJsb2NrcyAqLworCQkJKHNiLT5ncm91cF9zaXplIC0gc2ItPmlub2RlX2Jsb2Nrcyk7CisJYnVmLT5mX2JmcmVlICAgPSBzYi0+ZGF0YV9mcmVlOwkJLyogZnJlZSBkYXRhIGJsb2NrcyAqLworCWJ1Zi0+Zl9iYXZhaWwgID0gc2ItPmRhdGFfZnJlZTsJCS8qIGZyZWUgYmxvY2tzIGZvciBub24tcm9vdCAqLworCWJ1Zi0+Zl9maWxlcyAgID0gc2ItPnRvdGFsX2dyb3VwcyAqCS8qIHRvdGFsIGlub2RlcyAqLworCQkJc2ItPmlub2RlX2Jsb2NrcyAqCisJCQkoRUZTX0JMT0NLU0laRSAvIHNpemVvZihzdHJ1Y3QgZWZzX2Rpbm9kZSkpOworCWJ1Zi0+Zl9mZnJlZSAgID0gc2ItPmlub2RlX2ZyZWU7CS8qIGZyZWUgaW5vZGVzICovCisJYnVmLT5mX2ZzaWQudmFsWzBdID0gKHNiLT5mc19tYWdpYyA+PiAxNikgJiAweGZmZmY7IC8qIGZzIElEICovCisJYnVmLT5mX2ZzaWQudmFsWzFdID0gIHNiLT5mc19tYWdpYyAgICAgICAgJiAweGZmZmY7IC8qIGZzIElEICovCisJYnVmLT5mX25hbWVsZW4gPSBFRlNfTUFYTkFNRUxFTjsJLyogbWF4IGZpbGVuYW1lIGxlbmd0aCAqLworCisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2ZzL2Vmcy9zeW1saW5rLmMgYi9mcy9lZnMvc3ltbGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkOWEzNTAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9lZnMvc3ltbGluay5jCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBzeW1saW5rLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgQWwgU21pdGgKKyAqCisgKiBQb3J0aW9ucyBkZXJpdmVkIGZyb20gd29yayAoYykgMTk5NSwxOTk2IENocmlzdGlhbiBWb2dlbGdzYW5nLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCitzdGF0aWMgaW50IGVmc19zeW1saW5rX3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwljaGFyICpsaW5rID0ga21hcChwYWdlKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJZWZzX2Jsb2NrX3Qgc2l6ZSA9IGlub2RlLT5pX3NpemU7CisJaW50IGVycjsKKyAgCisJZXJyID0gLUVOQU1FVE9PTE9ORzsKKwlpZiAoc2l6ZSA+IDIgKiBFRlNfQkxPQ0tTSVpFKQorCQlnb3RvIGZhaWw7CisgIAorCWxvY2tfa2VybmVsKCk7CisJLyogcmVhZCBmaXJzdCA1MTIgYnl0ZXMgb2YgbGluayB0YXJnZXQgKi8KKwllcnIgPSAtRUlPOworCWJoID0gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIGVmc19ibWFwKGlub2RlLCAwKSk7CisJaWYgKCFiaCkKKwkJZ290byBmYWlsOworCW1lbWNweShsaW5rLCBiaC0+Yl9kYXRhLCAoc2l6ZSA+IEVGU19CTE9DS1NJWkUpID8gRUZTX0JMT0NLU0laRSA6IHNpemUpOworCWJyZWxzZShiaCk7CisJaWYgKHNpemUgPiBFRlNfQkxPQ0tTSVpFKSB7CisJCWJoID0gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIGVmc19ibWFwKGlub2RlLCAxKSk7CisJCWlmICghYmgpCisJCQlnb3RvIGZhaWw7CisJCW1lbWNweShsaW5rICsgRUZTX0JMT0NLU0laRSwgYmgtPmJfZGF0YSwgc2l6ZSAtIEVGU19CTE9DS1NJWkUpOworCQlicmVsc2UoYmgpOworCX0KKwlsaW5rW3NpemVdID0gJ1wwJzsKKwl1bmxvY2tfa2VybmVsKCk7CisJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCWt1bm1hcChwYWdlKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXR1cm4gMDsKK2ZhaWw6CisJdW5sb2NrX2tlcm5lbCgpOworCVNldFBhZ2VFcnJvcihwYWdlKTsKKwlrdW5tYXAocGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIGVycjsKK30KKworc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBlZnNfc3ltbGlua19hb3BzID0geworCS5yZWFkcGFnZQk9IGVmc19zeW1saW5rX3JlYWRwYWdlCit9OwpkaWZmIC0tZ2l0IGEvZnMvZXZlbnRwb2xsLmMgYi9mcy9ldmVudHBvbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWI5NjZjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXZlbnRwb2xsLmMKQEAgLTAsMCArMSwxNjM5IEBACisvKgorICogIGZzL2V2ZW50cG9sbC5jICggRWZmaWNlbnQgZXZlbnQgcG9sbGluZyBpbXBsZW1lbnRhdGlvbiApCisgKiAgQ29weXJpZ2h0IChDKSAyMDAxLC4uLiwyMDAzCSBEYXZpZGUgTGliZW56aQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBEYXZpZGUgTGliZW56aSA8ZGF2aWRlbEB4bWFpbHNlcnZlci5vcmc+CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXNoLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V2ZW50cG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL21tYW4uaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorCisKKy8qCisgKiBMT0NLSU5HOgorICogVGhlcmUgYXJlIHRocmVlIGxldmVsIG9mIGxvY2tpbmcgcmVxdWlyZWQgYnkgZXBvbGwgOgorICoKKyAqIDEpIGVwc2VtIChzZW1hcGhvcmUpCisgKiAyKSBlcC0+c2VtIChyd19zZW1hcGhvcmUpCisgKiAzKSBlcC0+bG9jayAocndfbG9jaykKKyAqCisgKiBUaGUgYWNxdWlyZSBvcmRlciBpcyB0aGUgb25lIGxpc3RlZCBhYm92ZSwgZnJvbSAxIHRvIDMuCisgKiBXZSBuZWVkIGEgc3BpbmxvY2sgKGVwLT5sb2NrKSBiZWNhdXNlIHdlIG1hbmlwdWxhdGUgb2JqZWN0cworICogZnJvbSBpbnNpZGUgdGhlIHBvbGwgY2FsbGJhY2ssIHRoYXQgbWlnaHQgYmUgdHJpZ2dlcmVkIGZyb20KKyAqIGEgd2FrZV91cCgpIHRoYXQgaW4gdHVybiBtaWdodCBiZSBjYWxsZWQgZnJvbSBJUlEgY29udGV4dC4KKyAqIFNvIHdlIGNhbid0IHNsZWVwIGluc2lkZSB0aGUgcG9sbCBjYWxsYmFjayBhbmQgaGVuY2Ugd2UgbmVlZAorICogYSBzcGlubG9jay4gRHVyaW5nIHRoZSBldmVudCB0cmFuc2ZlciBsb29wIChmcm9tIGtlcm5lbCB0bworICogdXNlciBzcGFjZSkgd2UgY291bGQgZW5kIHVwIHNsZWVwaW5nIGR1ZSBhIGNvcHlfdG9fdXNlcigpLCBzbworICogd2UgbmVlZCBhIGxvY2sgdGhhdCB3aWxsIGFsbG93IHVzIHRvIHNsZWVwLiBUaGlzIGxvY2sgaXMgYQorICogcmVhZC13cml0ZSBzZW1hcGhvcmUgKGVwLT5zZW0pLiBJdCBpcyBhY3F1aXJlZCBvbiByZWFkIGR1cmluZworICogdGhlIGV2ZW50IHRyYW5zZmVyIGxvb3AgYW5kIGluIHdyaXRlIGR1cmluZyBlcG9sbF9jdGwoRVBPTExfQ1RMX0RFTCkKKyAqIGFuZCBkdXJpbmcgZXZlbnRwb2xsX3JlbGVhc2VfZmlsZSgpLiBUaGVuIHdlIGFsc28gbmVlZCBhIGdsb2JhbAorICogc2VtYXBob3JlIHRvIHNlcmlhbGl6ZSBldmVudHBvbGxfcmVsZWFzZV9maWxlKCkgYW5kIGVwX2ZyZWUoKS4KKyAqIFRoaXMgc2VtYXBob3JlIGlzIGFjcXVpcmVkIGJ5IGVwX2ZyZWUoKSBkdXJpbmcgdGhlIGVwb2xsIGZpbGUKKyAqIGNsZWFudXAgcGF0aCBhbmQgaXQgaXMgYWxzbyBhY3F1aXJlZCBieSBldmVudHBvbGxfcmVsZWFzZV9maWxlKCkKKyAqIGlmIGEgZmlsZSBoYXMgYmVlbiBwdXNoZWQgaW5zaWRlIGFuIGVwb2xsIHNldCBhbmQgaXQgaXMgdGhlbgorICogY2xvc2UoKWQgd2l0aG91dCBhIHByZXZpb3VzIGNhbGwgdG9lcG9sbF9jdGwoRVBPTExfQ1RMX0RFTCkuCisgKiBJdCBpcyBwb3NzaWJsZSB0byBkcm9wIHRoZSAiZXAtPnNlbSIgYW5kIHRvIHVzZSB0aGUgZ2xvYmFsCisgKiBzZW1hcGhvcmUgImVwc2VtIiAodG9nZXRoZXIgd2l0aCAiZXAtPmxvY2siKSB0byBoYXZlIGl0IHdvcmtpbmcsCisgKiBidXQgaGF2aW5nICJlcC0+c2VtIiB3aWxsIG1ha2UgdGhlIGludGVyZmFjZSBtb3JlIHNjYWxhYmxlLgorICogRXZlbnRzIHRoYXQgcmVxdWlyZSBob2xkaW5nICJlcHNlbSIgYXJlIHZlcnkgcmFyZSwgd2hpbGUgZm9yCisgKiBub3JtYWwgb3BlcmF0aW9ucyB0aGUgZXBvbGwgcHJpdmF0ZSAiZXAtPnNlbSIgd2lsbCBndWFyYW50ZWUKKyAqIGEgZ3JlYXRlciBzY2FsYWJpbGl0eS4KKyAqLworCisKKyNkZWZpbmUgRVZFTlRQT0xMRlNfTUFHSUMgMHgwMzExMTk2NSAvKiBNeSBiaXJ0aGRheSBzaG91bGQgd29yayBmb3IgdGhpcyA6KSAqLworCisjZGVmaW5lIERFQlVHX0VQT0xMIDAKKworI2lmIERFQlVHX0VQT0xMID4gMAorI2RlZmluZSBEUFJJTlRLKHgpIHByaW50ayB4CisjZGVmaW5lIEROUFJJTlRLKG4sIHgpIGRvIHsgaWYgKChuKSA8PSBERUJVR19FUE9MTCkgcHJpbnRrIHg7IH0gd2hpbGUgKDApCisjZWxzZSAvKiAjaWYgREVCVUdfRVBPTEwgPiAwICovCisjZGVmaW5lIERQUklOVEsoeCkgKHZvaWQpIDAKKyNkZWZpbmUgRE5QUklOVEsobiwgeCkgKHZvaWQpIDAKKyNlbmRpZiAvKiAjaWYgREVCVUdfRVBPTEwgPiAwICovCisKKyNkZWZpbmUgREVCVUdfRVBJIDAKKworI2lmIERFQlVHX0VQSSAhPSAwCisjZGVmaW5lIEVQSV9TTEFCX0RFQlVHIChTTEFCX0RFQlVHX0ZSRUUgfCBTTEFCX1JFRF9aT05FIC8qIHwgU0xBQl9QT0lTT04gKi8pCisjZWxzZSAvKiAjaWYgREVCVUdfRVBJICE9IDAgKi8KKyNkZWZpbmUgRVBJX1NMQUJfREVCVUcgMAorI2VuZGlmIC8qICNpZiBERUJVR19FUEkgIT0gMCAqLworCisvKiBFcG9sbCBwcml2YXRlIGJpdHMgaW5zaWRlIHRoZSBldmVudCBtYXNrICovCisjZGVmaW5lIEVQX1BSSVZBVEVfQklUUyAoRVBPTExPTkVTSE9UIHwgRVBPTExFVCkKKworLyogTWF4aW11bSBudW1iZXIgb2YgcG9sbCB3YWtlIHVwIG5lc3RzIHdlIGFyZSBhbGxvd2luZyAqLworI2RlZmluZSBFUF9NQVhfUE9MTFdBS0VfTkVTVFMgNAorCisvKiBNYWNybyB0byBhbGxvY2F0ZSBhICJzdHJ1Y3QgZXBpdGVtIiBmcm9tIHRoZSBzbGFiIGNhY2hlICovCisjZGVmaW5lIEVQSV9NRU1fQUxMT0MoKQkoc3RydWN0IGVwaXRlbSAqKSBrbWVtX2NhY2hlX2FsbG9jKGVwaV9jYWNoZSwgU0xBQl9LRVJORUwpCisKKy8qIE1hY3JvIHRvIGZyZWUgYSAic3RydWN0IGVwaXRlbSIgdG8gdGhlIHNsYWIgY2FjaGUgKi8KKyNkZWZpbmUgRVBJX01FTV9GUkVFKHApIGttZW1fY2FjaGVfZnJlZShlcGlfY2FjaGUsIHApCisKKy8qIE1hY3JvIHRvIGFsbG9jYXRlIGEgInN0cnVjdCBlcHBvbGxfZW50cnkiIGZyb20gdGhlIHNsYWIgY2FjaGUgKi8KKyNkZWZpbmUgUFdRX01FTV9BTExPQygpCShzdHJ1Y3QgZXBwb2xsX2VudHJ5ICopIGttZW1fY2FjaGVfYWxsb2MocHdxX2NhY2hlLCBTTEFCX0tFUk5FTCkKKworLyogTWFjcm8gdG8gZnJlZSBhICJzdHJ1Y3QgZXBwb2xsX2VudHJ5IiB0byB0aGUgc2xhYiBjYWNoZSAqLworI2RlZmluZSBQV1FfTUVNX0ZSRUUocCkga21lbV9jYWNoZV9mcmVlKHB3cV9jYWNoZSwgcCkKKworLyogRmFzdCB0ZXN0IHRvIHNlZSBpZiB0aGUgZmlsZSBpcyBhbiBldmVucG9sbCBmaWxlICovCisjZGVmaW5lIElTX0ZJTEVfRVBPTEwoZikgKChmKS0+Zl9vcCA9PSAmZXZlbnRwb2xsX2ZvcHMpCisKKy8qIFNldHVwIHRoZSBzdHJ1Y3R1cmUgdGhhdCBpcyB1c2VkIGFzIGtleSBmb3IgdGhlIHJiLXRyZWUgKi8KKyNkZWZpbmUgRVBfU0VUX0ZGRChwLCBmLCBkKSBkbyB7IChwKS0+ZmlsZSA9IChmKTsgKHApLT5mZCA9IChkKTsgfSB3aGlsZSAoMCkKKworLyogQ29tcGFyZSByYi10cmVlIGtleXMgKi8KKyNkZWZpbmUgRVBfQ01QX0ZGRChwMSwgcDIpICgocDEpLT5maWxlID4gKHAyKS0+ZmlsZSA/ICsxOiBcCisJCQkgICAgKChwMSktPmZpbGUgPCAocDIpLT5maWxlID8gLTE6IChwMSktPmZkIC0gKHAyKS0+ZmQpKQorCisvKiBTcGVjaWFsIGluaXRpYWxpemF0aW9uIGZvciB0aGUgcmItdHJlZSBub2RlIHRvIGRldGVjdCBsaW5rYWdlICovCisjZGVmaW5lIEVQX1JCX0lOSVROT0RFKG4pIChuKS0+cmJfcGFyZW50ID0gKG4pCisKKy8qIFJlbW92ZXMgYSBub2RlIGZyb20gdGhlIHJiLXRyZWUgYW5kIG1hcmtzIGl0IGZvciBhIGZhc3QgaXMtbGlua2VkIGNoZWNrICovCisjZGVmaW5lIEVQX1JCX0VSQVNFKG4sIHIpIGRvIHsgcmJfZXJhc2Uobiwgcik7IChuKS0+cmJfcGFyZW50ID0gKG4pOyB9IHdoaWxlICgwKQorCisvKiBGYXN0IGNoZWNrIHRvIHZlcmlmeSB0aGF0IHRoZSBpdGVtIGlzIGxpbmtlZCB0byB0aGUgbWFpbiByYi10cmVlICovCisjZGVmaW5lIEVQX1JCX0xJTktFRChuKSAoKG4pLT5yYl9wYXJlbnQgIT0gKG4pKQorCisvKgorICogUmVtb3ZlIHRoZSBpdGVtIGZyb20gdGhlIGxpc3QgYW5kIHBlcmZvcm0gaXRzIGluaXRpYWxpemF0aW9uLgorICogVGhpcyBpcyB1c2VmdWwgZm9yIHVzIGJlY2F1c2Ugd2UgY2FuIHRlc3QgaWYgdGhlIGl0ZW0gaXMgbGlua2VkCisgKiB1c2luZyAiRVBfSVNfTElOS0VEKHApIi4KKyAqLworI2RlZmluZSBFUF9MSVNUX0RFTChwKSBkbyB7IGxpc3RfZGVsKHApOyBJTklUX0xJU1RfSEVBRChwKTsgfSB3aGlsZSAoMCkKKworLyogVGVsbHMgdXMgaWYgdGhlIGl0ZW0gaXMgY3VycmVudGx5IGxpbmtlZCAqLworI2RlZmluZSBFUF9JU19MSU5LRUQocCkgKCFsaXN0X2VtcHR5KHApKQorCisvKiBHZXQgdGhlICJzdHJ1Y3QgZXBpdGVtIiBmcm9tIGEgd2FpdCBxdWV1ZSBwb2ludGVyICovCisjZGVmaW5lIEVQX0lURU1fRlJPTV9XQUlUKHApICgoc3RydWN0IGVwaXRlbSAqKSBjb250YWluZXJfb2YocCwgc3RydWN0IGVwcG9sbF9lbnRyeSwgd2FpdCktPmJhc2UpCisKKy8qIEdldCB0aGUgInN0cnVjdCBlcGl0ZW0iIGZyb20gYW4gZXBvbGwgcXVldWUgd3JhcHBlciAqLworI2RlZmluZSBFUF9JVEVNX0ZST01fRVBRVUVVRShwKSAoY29udGFpbmVyX29mKHAsIHN0cnVjdCBlcF9wcXVldWUsIHB0KS0+ZXBpKQorCisvKiBUZWxscyBpZiB0aGUgZXBvbGxfY3RsKDIpIG9wZXJhdGlvbiBuZWVkcyBhbiBldmVudCBjb3B5IGZyb20gdXNlcnNwYWNlICovCisjZGVmaW5lIEVQX09QX0hBU0hfRVZFTlQob3ApICgob3ApICE9IEVQT0xMX0NUTF9ERUwpCisKKworc3RydWN0IGVwb2xsX2ZpbGVmZCB7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJaW50IGZkOworfTsKKworLyoKKyAqIE5vZGUgdGhhdCBpcyBsaW5rZWQgaW50byB0aGUgIndha2VfdGFza19saXN0IiBtZW1iZXIgb2YgdGhlICJzdHJ1Y3QgcG9sbF9zYWZld2FrZSIuCisgKiBJdCBpcyB1c2VkIHRvIGtlZXAgdHJhY2sgb24gYWxsIHRhc2tzIHRoYXQgYXJlIGN1cnJlbnRseSBpbnNpZGUgdGhlIHdha2VfdXAoKSBjb2RlCisgKiB0byAxKSBzaG9ydC1jaXJjdWl0IHRoZSBvbmUgY29taW5nIGZyb20gdGhlIHNhbWUgdGFzayBhbmQgc2FtZSB3YWl0IHF1ZXVlIGhlYWQKKyAqICggbG9vcCApIDIpIGFsbG93IGEgbWF4aW11bSBudW1iZXIgb2YgZXBvbGwgZGVzY3JpcHRvcnMgaW5jbHVzaW9uIG5lc3RpbmcKKyAqIDMpIGxldCBnbyB0aGUgb25lcyBjb21pbmcgZnJvbSBvdGhlciB0YXNrcy4KKyAqLworc3RydWN0IHdha2VfdGFza19ub2RlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxsaW5rOworCXRhc2tfdCAqdGFzazsKKwl3YWl0X3F1ZXVlX2hlYWRfdCAqd3E7Cit9OworCisvKgorICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCB0aGUgc2FmZSBwb2xsIHdha2UgdXAgYXZvaWRpbmcgdG8gcmVlbnRlcgorICogdGhlIHBvbGwgY2FsbGJhY2sgZnJvbSBpbnNpZGUgd2FrZV91cCgpLgorICovCitzdHJ1Y3QgcG9sbF9zYWZld2FrZSB7CisJc3RydWN0IGxpc3RfaGVhZCB3YWtlX3Rhc2tfbGlzdDsKKwlzcGlubG9ja190IGxvY2s7Cit9OworCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgc3RvcmVkIGluc2lkZSB0aGUgInByaXZhdGVfZGF0YSIgbWVtYmVyIG9mIHRoZSBmaWxlCisgKiBzdHJ1Y3R1cmUgYW5kIHJhcHJlc2VudCB0aGUgbWFpbiBkYXRhIHNydWN0dXJlIGZvciB0aGUgZXZlbnRwb2xsCisgKiBpbnRlcmZhY2UuCisgKi8KK3N0cnVjdCBldmVudHBvbGwgeworCS8qIFByb3RlY3QgdGhlIHRoaXMgc3RydWN0dXJlIGFjY2VzcyAqLworCXJ3bG9ja190IGxvY2s7CisKKwkvKgorCSAqIFRoaXMgc2VtYXBob3JlIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgZmlsZXMgYXJlIG5vdCByZW1vdmVkCisJICogd2hpbGUgZXBvbGwgaXMgdXNpbmcgdGhlbS4gVGhpcyBpcyByZWFkLWhlbGQgZHVyaW5nIHRoZSBldmVudAorCSAqIGNvbGxlY3Rpb24gbG9vcCBhbmQgaXQgaXMgd3JpdGUtaGVsZCBkdXJpbmcgdGhlIGZpbGUgY2xlYW51cAorCSAqIHBhdGgsIHRoZSBlcG9sbCBmaWxlIGV4aXQgY29kZSBhbmQgdGhlIGN0bCBvcGVyYXRpb25zLgorCSAqLworCXN0cnVjdCByd19zZW1hcGhvcmUgc2VtOworCisJLyogV2FpdCBxdWV1ZSB1c2VkIGJ5IHN5c19lcG9sbF93YWl0KCkgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB3cTsKKworCS8qIFdhaXQgcXVldWUgdXNlZCBieSBmaWxlLT5wb2xsKCkgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBwb2xsX3dhaXQ7CisKKwkvKiBMaXN0IG9mIHJlYWR5IGZpbGUgZGVzY3JpcHRvcnMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHJkbGxpc3Q7CisKKwkvKiBSQi1UcmVlIHJvb3QgdXNlZCB0byBzdG9yZSBtb25pdG9yZWQgZmQgc3RydWN0cyAqLworCXN0cnVjdCByYl9yb290IHJicjsKK307CisKKy8qIFdhaXQgc3RydWN0dXJlIHVzZWQgYnkgdGhlIHBvbGwgaG9va3MgKi8KK3N0cnVjdCBlcHBvbGxfZW50cnkgeworCS8qIExpc3QgaGVhZGVyIHVzZWQgdG8gbGluayB0aGlzIHN0cnVjdHVyZSB0byB0aGUgInN0cnVjdCBlcGl0ZW0iICovCisJc3RydWN0IGxpc3RfaGVhZCBsbGluazsKKworCS8qIFRoZSAiYmFzZSIgcG9pbnRlciBpcyBzZXQgdG8gdGhlIGNvbnRhaW5lciAic3RydWN0IGVwaXRlbSIgKi8KKwl2b2lkICpiYXNlOworCisJLyoKKwkgKiBXYWl0IHF1ZXVlIGl0ZW0gdGhhdCB3aWxsIGJlIGxpbmtlZCB0byB0aGUgdGFyZ2V0IGZpbGUgd2FpdAorCSAqIHF1ZXVlIGhlYWQuCisJICovCisJd2FpdF9xdWV1ZV90IHdhaXQ7CisKKwkvKiBUaGUgd2FpdCBxdWV1ZSBoZWFkIHRoYXQgbGlua2VkIHRoZSAid2FpdCIgd2FpdCBxdWV1ZSBpdGVtICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgKndoZWFkOworfTsKKworLyoKKyAqIEVhY2ggZmlsZSBkZXNjcmlwdG9yIGFkZGVkIHRvIHRoZSBldmVudHBvbGwgaW50ZXJmYWNlIHdpbGwKKyAqIGhhdmUgYW4gZW50cnkgb2YgdGhpcyB0eXBlIGxpbmtlZCB0byB0aGUgaGFzaC4KKyAqLworc3RydWN0IGVwaXRlbSB7CisJLyogUkItVHJlZSBub2RlIHVzZWQgdG8gbGluayB0aGlzIHN0cnVjdHVyZSB0byB0aGUgZXZlbnRwb2xsIHJiLXRyZWUgKi8KKwlzdHJ1Y3QgcmJfbm9kZSByYm47CisKKwkvKiBMaXN0IGhlYWRlciB1c2VkIHRvIGxpbmsgdGhpcyBzdHJ1Y3R1cmUgdG8gdGhlIGV2ZW50cG9sbCByZWFkeSBsaXN0ICovCisJc3RydWN0IGxpc3RfaGVhZCByZGxsaW5rOworCisJLyogVGhlIGZpbGUgZGVzY3JpcHRvciBpbmZvcm1hdGlvbiB0aGlzIGl0ZW0gcmVmZXJzIHRvICovCisJc3RydWN0IGVwb2xsX2ZpbGVmZCBmZmQ7CisKKwkvKiBOdW1iZXIgb2YgYWN0aXZlIHdhaXQgcXVldWUgYXR0YWNoZWQgdG8gcG9sbCBvcGVyYXRpb25zICovCisJaW50IG53YWl0OworCisJLyogTGlzdCBjb250YWluaW5nIHBvbGwgd2FpdCBxdWV1ZXMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHB3cWxpc3Q7CisKKwkvKiBUaGUgImNvbnRhaW5lciIgb2YgdGhpcyBpdGVtICovCisJc3RydWN0IGV2ZW50cG9sbCAqZXA7CisKKwkvKiBUaGUgc3RydWN0dXJlIHRoYXQgZGVzY3JpYmUgdGhlIGludGVyZXN0ZWQgZXZlbnRzIGFuZCB0aGUgc291cmNlIGZkICovCisJc3RydWN0IGVwb2xsX2V2ZW50IGV2ZW50OworCisJLyoKKwkgKiBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIHVzYWdlIGNvdW50IG9mIHRoZSBzdHJ1Y3R1cmUuIFRoaXMgYXZvaWRzCisJICogdGhhdCB0aGUgc3RydWN0dXJlIHdpbGwgZGVzYXBwZWFyIGZyb20gdW5kZXJuZWF0aCBvdXIgcHJvY2Vzc2luZy4KKwkgKi8KKwlhdG9taWNfdCB1c2VjbnQ7CisKKwkvKiBMaXN0IGhlYWRlciB1c2VkIHRvIGxpbmsgdGhpcyBpdGVtIHRvIHRoZSAic3RydWN0IGZpbGUiIGl0ZW1zIGxpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGZsbGluazsKKworCS8qIExpc3QgaGVhZGVyIHVzZWQgdG8gbGluayB0aGUgaXRlbSB0byB0aGUgdHJhbnNmZXIgbGlzdCAqLworCXN0cnVjdCBsaXN0X2hlYWQgdHhsaW5rOworCisJLyoKKwkgKiBUaGlzIGlzIHVzZWQgZHVyaW5nIHRoZSBjb2xsZWN0aW9uL3RyYW5zZmVyIG9mIGV2ZW50cyB0byB1c2Vyc3BhY2UKKwkgKiB0byBwaW4gaXRlbXMgZW1wdHkgZXZlbnRzIHNldC4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgcmV2ZW50czsKK307CisKKy8qIFdyYXBwZXIgc3RydWN0IHVzZWQgYnkgcG9sbCBxdWV1ZWluZyAqLworc3RydWN0IGVwX3BxdWV1ZSB7CisJcG9sbF90YWJsZSBwdDsKKwlzdHJ1Y3QgZXBpdGVtICplcGk7Cit9OworCisKKworc3RhdGljIHZvaWQgZXBfcG9sbF9zYWZld2FrZV9pbml0KHN0cnVjdCBwb2xsX3NhZmV3YWtlICpwc3cpOworc3RhdGljIHZvaWQgZXBfcG9sbF9zYWZld2FrZShzdHJ1Y3QgcG9sbF9zYWZld2FrZSAqcHN3LCB3YWl0X3F1ZXVlX2hlYWRfdCAqd3EpOworc3RhdGljIGludCBlcF9nZXRmZChpbnQgKmVmZCwgc3RydWN0IGlub2RlICoqZWlub2RlLCBzdHJ1Y3QgZmlsZSAqKmVmaWxlKTsKK3N0YXRpYyBpbnQgZXBfZmlsZV9pbml0KHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyB2b2lkIGVwX2ZyZWUoc3RydWN0IGV2ZW50cG9sbCAqZXApOworc3RhdGljIHN0cnVjdCBlcGl0ZW0gKmVwX2ZpbmQoc3RydWN0IGV2ZW50cG9sbCAqZXAsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgZmQpOworc3RhdGljIHZvaWQgZXBfdXNlX2VwaXRlbShzdHJ1Y3QgZXBpdGVtICplcGkpOworc3RhdGljIHZvaWQgZXBfcmVsZWFzZV9lcGl0ZW0oc3RydWN0IGVwaXRlbSAqZXBpKTsKK3N0YXRpYyB2b2lkIGVwX3B0YWJsZV9xdWV1ZV9wcm9jKHN0cnVjdCBmaWxlICpmaWxlLCB3YWl0X3F1ZXVlX2hlYWRfdCAqd2hlYWQsCisJCQkJIHBvbGxfdGFibGUgKnB0KTsKK3N0YXRpYyB2b2lkIGVwX3JidHJlZV9pbnNlcnQoc3RydWN0IGV2ZW50cG9sbCAqZXAsIHN0cnVjdCBlcGl0ZW0gKmVwaSk7CitzdGF0aWMgaW50IGVwX2luc2VydChzdHJ1Y3QgZXZlbnRwb2xsICplcCwgc3RydWN0IGVwb2xsX2V2ZW50ICpldmVudCwKKwkJICAgICBzdHJ1Y3QgZmlsZSAqdGZpbGUsIGludCBmZCk7CitzdGF0aWMgaW50IGVwX21vZGlmeShzdHJ1Y3QgZXZlbnRwb2xsICplcCwgc3RydWN0IGVwaXRlbSAqZXBpLAorCQkgICAgIHN0cnVjdCBlcG9sbF9ldmVudCAqZXZlbnQpOworc3RhdGljIHZvaWQgZXBfdW5yZWdpc3Rlcl9wb2xsd2FpdChzdHJ1Y3QgZXZlbnRwb2xsICplcCwgc3RydWN0IGVwaXRlbSAqZXBpKTsKK3N0YXRpYyBpbnQgZXBfdW5saW5rKHN0cnVjdCBldmVudHBvbGwgKmVwLCBzdHJ1Y3QgZXBpdGVtICplcGkpOworc3RhdGljIGludCBlcF9yZW1vdmUoc3RydWN0IGV2ZW50cG9sbCAqZXAsIHN0cnVjdCBlcGl0ZW0gKmVwaSk7CitzdGF0aWMgaW50IGVwX3BvbGxfY2FsbGJhY2sod2FpdF9xdWV1ZV90ICp3YWl0LCB1bnNpZ25lZCBtb2RlLCBpbnQgc3luYywgdm9pZCAqa2V5KTsKK3N0YXRpYyBpbnQgZXBfZXZlbnRwb2xsX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZXBfZXZlbnRwb2xsX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpOworc3RhdGljIGludCBlcF9jb2xsZWN0X3JlYWR5X2l0ZW1zKHN0cnVjdCBldmVudHBvbGwgKmVwLAorCQkJCSAgc3RydWN0IGxpc3RfaGVhZCAqdHhsaXN0LCBpbnQgbWF4ZXZlbnRzKTsKK3N0YXRpYyBpbnQgZXBfc2VuZF9ldmVudHMoc3RydWN0IGV2ZW50cG9sbCAqZXAsIHN0cnVjdCBsaXN0X2hlYWQgKnR4bGlzdCwKKwkJCSAgc3RydWN0IGVwb2xsX2V2ZW50IF9fdXNlciAqZXZlbnRzKTsKK3N0YXRpYyB2b2lkIGVwX3JlaW5qZWN0X2l0ZW1zKHN0cnVjdCBldmVudHBvbGwgKmVwLCBzdHJ1Y3QgbGlzdF9oZWFkICp0eGxpc3QpOworc3RhdGljIGludCBlcF9ldmVudHNfdHJhbnNmZXIoc3RydWN0IGV2ZW50cG9sbCAqZXAsCisJCQkgICAgICBzdHJ1Y3QgZXBvbGxfZXZlbnQgX191c2VyICpldmVudHMsCisJCQkgICAgICBpbnQgbWF4ZXZlbnRzKTsKK3N0YXRpYyBpbnQgZXBfcG9sbChzdHJ1Y3QgZXZlbnRwb2xsICplcCwgc3RydWN0IGVwb2xsX2V2ZW50IF9fdXNlciAqZXZlbnRzLAorCQkgICBpbnQgbWF4ZXZlbnRzLCBsb25nIHRpbWVvdXQpOworc3RhdGljIGludCBldmVudHBvbGxmc19kZWxldGVfZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7CitzdGF0aWMgc3RydWN0IGlub2RlICplcF9ldmVudHBvbGxfaW5vZGUodm9pZCk7CitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpldmVudHBvbGxmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCQkJCSAgICAgIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsCisJCQkJCSAgICAgIHZvaWQgKmRhdGEpOworCisvKgorICogVGhpcyBzZW1hcGhvcmUgaXMgdXNlZCB0byBzZXJpYWxpemUgZXBfZnJlZSgpIGFuZCBldmVudHBvbGxfcmVsZWFzZV9maWxlKCkuCisgKi8KK3N0cnVjdCBzZW1hcGhvcmUgZXBzZW07CisKKy8qIFNhZmUgd2FrZSB1cCBpbXBsZW1lbnRhdGlvbiAqLworc3RhdGljIHN0cnVjdCBwb2xsX3NhZmV3YWtlIHBzdzsKKworLyogU2xhYiBjYWNoZSB1c2VkIHRvIGFsbG9jYXRlICJzdHJ1Y3QgZXBpdGVtIiAqLworc3RhdGljIGttZW1fY2FjaGVfdCAqZXBpX2NhY2hlOworCisvKiBTbGFiIGNhY2hlIHVzZWQgdG8gYWxsb2NhdGUgInN0cnVjdCBlcHBvbGxfZW50cnkiICovCitzdGF0aWMga21lbV9jYWNoZV90ICpwd3FfY2FjaGU7CisKKy8qIFZpcnR1YWwgZnMgdXNlZCB0byBhbGxvY2F0ZSBpbm9kZXMgZm9yIGV2ZW50cG9sbCBmaWxlcyAqLworc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqZXZlbnRwb2xsX21udDsKKworLyogRmlsZSBjYWxsYmFja3MgdGhhdCBpbXBsZW1lbnQgdGhlIGV2ZW50cG9sbCBmaWxlIGJlaGF2aW91ciAqLworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXZlbnRwb2xsX2ZvcHMgPSB7CisJLnJlbGVhc2UJPSBlcF9ldmVudHBvbGxfY2xvc2UsCisJLnBvbGwJCT0gZXBfZXZlbnRwb2xsX3BvbGwKK307CisKKy8qCisgKiBUaGlzIGlzIHVzZWQgdG8gcmVnaXN0ZXIgdGhlIHZpcnR1YWwgZmlsZSBzeXN0ZW0gZnJvbSB3aGVyZQorICogZXZlbnRwb2xsIGlub2RlcyBhcmUgYWxsb2NhdGVkLgorICovCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgZXZlbnRwb2xsX2ZzX3R5cGUgPSB7CisJLm5hbWUJCT0gImV2ZW50cG9sbGZzIiwKKwkuZ2V0X3NiCQk9IGV2ZW50cG9sbGZzX2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfYW5vbl9zdXBlciwKK307CisKKy8qIFZlcnkgYmFzaWMgZGlyZWN0b3J5IGVudHJ5IG9wZXJhdGlvbnMgZm9yIHRoZSBldmVudHBvbGwgdmlydHVhbCBmaWxlIHN5c3RlbSAqLworc3RhdGljIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBldmVudHBvbGxmc19kZW50cnlfb3BlcmF0aW9ucyA9IHsKKwkuZF9kZWxldGUJPSBldmVudHBvbGxmc19kZWxldGVfZGVudHJ5LAorfTsKKworCisKKy8qIEluaXRpYWxpemUgdGhlIHBvbGwgc2FmZSB3YWtlIHVwIHN0cnVjdHVyZSAqLworc3RhdGljIHZvaWQgZXBfcG9sbF9zYWZld2FrZV9pbml0KHN0cnVjdCBwb2xsX3NhZmV3YWtlICpwc3cpCit7CisKKwlJTklUX0xJU1RfSEVBRCgmcHN3LT53YWtlX3Rhc2tfbGlzdCk7CisJc3Bpbl9sb2NrX2luaXQoJnBzdy0+bG9jayk7Cit9CisKKworLyoKKyAqIFBlcmZvcm0gYSBzYWZlIHdha2UgdXAgb2YgdGhlIHBvbGwgd2FpdCBsaXN0LiBUaGUgcHJvYmxlbSBpcyB0aGF0CisgKiB3aXRoIHRoZSBuZXcgY2FsbGJhY2snZCB3YWtlIHVwIHN5c3RlbSwgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUKKyAqIHBvbGwgY2FsbGJhY2sgaXMgcmVlbnRlcmVkIGZyb20gaW5zaWRlIHRoZSBjYWxsIHRvIHdha2VfdXAoKSBkb25lCisgKiBvbiB0aGUgcG9sbCB3YWl0IHF1ZXVlIGhlYWQuIFRoZSBydWxlIGlzIHRoYXQgd2UgY2Fubm90IHJlZW50ZXIgdGhlCisgKiB3YWtlIHVwIGNvZGUgZnJvbSB0aGUgc2FtZSB0YXNrIG1vcmUgdGhhbiBFUF9NQVhfUE9MTFdBS0VfTkVTVFMgdGltZXMsCisgKiBhbmQgd2UgY2Fubm90IHJlZW50ZXIgdGhlIHNhbWUgd2FpdCBxdWV1ZSBoZWFkIGF0IGFsbC4gVGhpcyB3aWxsCisgKiBlbmFibGUgdG8gaGF2ZSBhIGhpZXJhcmNoeSBvZiBlcG9sbCBmaWxlIGRlc2NyaXB0b3Igb2Ygbm8gbW9yZSB0aGFuCisgKiBFUF9NQVhfUE9MTFdBS0VfTkVTVFMgZGVlcC4gV2UgbmVlZCB0aGUgaXJxIHZlcnNpb24gb2YgdGhlIHNwaW4gbG9jaworICogYmVjYXVzZSB0aGlzIG9uZSBnZXRzIGNhbGxlZCBieSB0aGUgcG9sbCBjYWxsYmFjaywgdGhhdCBpbiB0dXJuIGlzIGNhbGxlZAorICogZnJvbSBpbnNpZGUgYSB3YWtlX3VwKCksIHRoYXQgbWlnaHQgYmUgY2FsbGVkIGZyb20gaXJxIGNvbnRleHQuCisgKi8KK3N0YXRpYyB2b2lkIGVwX3BvbGxfc2FmZXdha2Uoc3RydWN0IHBvbGxfc2FmZXdha2UgKnBzdywgd2FpdF9xdWV1ZV9oZWFkX3QgKndxKQoreworCWludCB3YWtlX25lc3RzID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXRhc2tfdCAqdGhpc190YXNrID0gY3VycmVudDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsc3RoZWFkID0gJnBzdy0+d2FrZV90YXNrX2xpc3QsICpsbms7CisJc3RydWN0IHdha2VfdGFza19ub2RlICp0bmN1cjsKKwlzdHJ1Y3Qgd2FrZV90YXNrX25vZGUgdG5vZGU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHN3LT5sb2NrLCBmbGFncyk7CisKKwkvKiBUcnkgdG8gc2VlIGlmIHRoZSBjdXJyZW50IHRhc2sgaXMgYWxyZWFkeSBpbnNpZGUgdGhpcyB3YWtldXAgY2FsbCAqLworCWxpc3RfZm9yX2VhY2gobG5rLCBsc3RoZWFkKSB7CisJCXRuY3VyID0gbGlzdF9lbnRyeShsbmssIHN0cnVjdCB3YWtlX3Rhc2tfbm9kZSwgbGxpbmspOworCisJCWlmICh0bmN1ci0+d3EgPT0gd3EgfHwKKwkJICAgICh0bmN1ci0+dGFzayA9PSB0aGlzX3Rhc2sgJiYgKyt3YWtlX25lc3RzID4gRVBfTUFYX1BPTExXQUtFX05FU1RTKSkgeworCQkJLyoKKwkJCSAqIE9wcyAuLi4gbG9vcCBkZXRlY3RlZCBvciBtYXhpbXVtIG5lc3QgbGV2ZWwgcmVhY2hlZC4KKwkJCSAqIFdlIGFib3J0IHRoaXMgd2FrZSBieSBicmVha2luZyB0aGUgY3ljbGUgaXRzZWxmLgorCQkJICovCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwc3ctPmxvY2ssIGZsYWdzKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCS8qIEFkZCB0aGUgY3VycmVudCB0YXNrIHRvIHRoZSBsaXN0ICovCisJdG5vZGUudGFzayA9IHRoaXNfdGFzazsKKwl0bm9kZS53cSA9IHdxOworCWxpc3RfYWRkKCZ0bm9kZS5sbGluaywgbHN0aGVhZCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwc3ctPmxvY2ssIGZsYWdzKTsKKworCS8qIERvIHJlYWxseSB3YWtlIHVwIG5vdyAqLworCXdha2VfdXAod3EpOworCisJLyogUmVtb3ZlIHRoZSBjdXJyZW50IHRhc2sgZnJvbSB0aGUgbGlzdCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZwc3ctPmxvY2ssIGZsYWdzKTsKKwlsaXN0X2RlbCgmdG5vZGUubGxpbmspOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBzdy0+bG9jaywgZmxhZ3MpOworfQorCisKKy8qIFVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZXBvbGwgYml0cyBpbnNpZGUgdGhlICJzdHJ1Y3QgZmlsZSIgKi8KK3ZvaWQgZXZlbnRwb2xsX2luaXRfZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKworCUlOSVRfTElTVF9IRUFEKCZmaWxlLT5mX2VwX2xpbmtzKTsKKwlzcGluX2xvY2tfaW5pdCgmZmlsZS0+Zl9lcF9sb2NrKTsKK30KKworCisvKgorICogVGhpcyBpcyBjYWxsZWQgZnJvbSBldmVudHBvbGxfcmVsZWFzZSgpIHRvIHVubGluayBmaWxlcyBmcm9tIHRoZSBldmVudHBvbGwKKyAqIGludGVyZmFjZS4gV2UgbmVlZCB0byBoYXZlIHRoaXMgZmFjaWxpdHkgdG8gY2xlYW51cCBjb3JyZWN0bHkgZmlsZXMgdGhhdCBhcmUKKyAqIGNsb3NlZCB3aXRob3V0IGJlaW5nIHJlbW92ZWQgZnJvbSB0aGUgZXZlbnRwb2xsIGludGVyZmFjZS4KKyAqLwordm9pZCBldmVudHBvbGxfcmVsZWFzZV9maWxlKHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmxzdGhlYWQgPSAmZmlsZS0+Zl9lcF9saW5rczsKKwlzdHJ1Y3QgZXZlbnRwb2xsICplcDsKKwlzdHJ1Y3QgZXBpdGVtICplcGk7CisKKwkvKgorCSAqIFdlIGRvbid0IHdhbnQgdG8gZ2V0ICJmaWxlLT5mX2VwX2xvY2siIGJlY2F1c2UgaXQgaXMgbm90CisJICogbmVjZXNzYXJ5LiBJdCBpcyBub3QgbmVjZXNzYXJ5IGJlY2F1c2Ugd2UncmUgaW4gdGhlICJzdHJ1Y3QgZmlsZSIKKwkgKiBjbGVhbnVwIHBhdGgsIGFuZCB0aGlzIG1lYW5zIHRoYXQgbm9vbmUgaXMgdXNpbmcgdGhpcyBmaWxlIGFueW1vcmUuCisJICogVGhlIG9ubHkgaGl0IG1pZ2h0IGNvbWUgZnJvbSBlcF9mcmVlKCkgYnV0IGJ5IGhvbGRpbmcgdGhlIHNlbWFwaG9yZQorCSAqIHdpbGwgY29ycmVjdGx5IHNlcmlhbGl6ZSB0aGUgb3BlcmF0aW9uLiBXZSBkbyBuZWVkIHRvIGFjcXVpcmUKKwkgKiAiZXAtPnNlbSIgYWZ0ZXIgImVwc2VtIiBiZWNhdXNlIGVwX3JlbW92ZSgpIHJlcXVpcmVzIGl0IHdoZW4gY2FsbGVkCisJICogZnJvbSBhbnl3aGVyZSBidXQgZXBfZnJlZSgpLgorCSAqLworCWRvd24oJmVwc2VtKTsKKworCXdoaWxlICghbGlzdF9lbXB0eShsc3RoZWFkKSkgeworCQllcGkgPSBsaXN0X2VudHJ5KGxzdGhlYWQtPm5leHQsIHN0cnVjdCBlcGl0ZW0sIGZsbGluayk7CisKKwkJZXAgPSBlcGktPmVwOworCQlFUF9MSVNUX0RFTCgmZXBpLT5mbGxpbmspOworCQlkb3duX3dyaXRlKCZlcC0+c2VtKTsKKwkJZXBfcmVtb3ZlKGVwLCBlcGkpOworCQl1cF93cml0ZSgmZXAtPnNlbSk7CisJfQorCisJdXAoJmVwc2VtKTsKK30KKworCisvKgorICogSXQgb3BlbnMgYW4gZXZlbnRwb2xsIGZpbGUgZGVzY3JpcHRvciBieSBzdWdnZXN0aW5nIGEgc3RvcmFnZSBvZiAic2l6ZSIKKyAqIGZpbGUgZGVzY3JpcHRvcnMuIFRoZSBzaXplIHBhcmFtZXRlciBpcyBqdXN0IGFuIGhpbnQgYWJvdXQgaG93IHRvIHNpemUKKyAqIGRhdGEgc3RydWN0dXJlcy4gSXQgd29uJ3QgcHJldmVudCB0aGUgdXNlciB0byBzdG9yZSBtb3JlIHRoYW4gInNpemUiCisgKiBmaWxlIGRlc2NyaXB0b3JzIGluc2lkZSB0aGUgZXBvbGwgaW50ZXJmYWNlLiBJdCBpcyB0aGUga2VybmVsIHBhcnQgb2YKKyAqIHRoZSB1c2Vyc3BhY2UgZXBvbGxfY3JlYXRlKDIpLgorICovCithc21saW5rYWdlIGxvbmcgc3lzX2Vwb2xsX2NyZWF0ZShpbnQgc2l6ZSkKK3sKKwlpbnQgZXJyb3IsIGZkOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGZpbGUgKmZpbGU7CisKKwlETlBSSU5USygzLCAoS0VSTl9JTkZPICJbJXBdIGV2ZW50cG9sbDogc3lzX2Vwb2xsX2NyZWF0ZSglZClcbiIsCisJCSAgICAgY3VycmVudCwgc2l6ZSkpOworCisJLyogU2FuaXR5IGNoZWNrIG9uIHRoZSBzaXplIHBhcmFtZXRlciAqLworCWVycm9yID0gLUVJTlZBTDsKKwlpZiAoc2l6ZSA8PSAwKQorCQlnb3RvIGVleGl0XzE7CisKKwkvKgorCSAqIENyZWF0ZXMgYWxsIHRoZSBpdGVtcyBuZWVkZWQgdG8gc2V0dXAgYW4gZXZlbnRwb2xsIGZpbGUuIFRoYXQgaXMsCisJICogYSBmaWxlIHN0cnVjdHVyZSwgYW5kIGlub2RlIGFuZCBhIGZyZWUgZmlsZSBkZXNjcmlwdG9yLgorCSAqLworCWVycm9yID0gZXBfZ2V0ZmQoJmZkLCAmaW5vZGUsICZmaWxlKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZWV4aXRfMTsKKworCS8qIFNldHVwIHRoZSBmaWxlIGludGVybmFsIGRhdGEgc3RydWN0dXJlICggInN0cnVjdCBldmVudHBvbGwiICkgKi8KKwllcnJvciA9IGVwX2ZpbGVfaW5pdChmaWxlKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZWV4aXRfMjsKKworCisJRE5QUklOVEsoMywgKEtFUk5fSU5GTyAiWyVwXSBldmVudHBvbGw6IHN5c19lcG9sbF9jcmVhdGUoJWQpID0gJWRcbiIsCisJCSAgICAgY3VycmVudCwgc2l6ZSwgZmQpKTsKKworCXJldHVybiBmZDsKKworZWV4aXRfMjoKKwlzeXNfY2xvc2UoZmQpOworZWV4aXRfMToKKwlETlBSSU5USygzLCAoS0VSTl9JTkZPICJbJXBdIGV2ZW50cG9sbDogc3lzX2Vwb2xsX2NyZWF0ZSglZCkgPSAlZFxuIiwKKwkJICAgICBjdXJyZW50LCBzaXplLCBlcnJvcikpOworCXJldHVybiBlcnJvcjsKK30KKworCisvKgorICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZSBjb250cm9sbGVyIGludGVyZmFjZSBmb3IKKyAqIHRoZSBldmVudHBvbGwgZmlsZSB0aGF0IGVuYWJsZXMgdGhlIGluc2VydGlvbi9yZW1vdmFsL2NoYW5nZSBvZgorICogZmlsZSBkZXNjcmlwdG9ycyBpbnNpZGUgdGhlIGludGVyZXN0IHNldC4gIEl0IHJlcHJlc2VudHMKKyAqIHRoZSBrZXJuZWwgcGFydCBvZiB0aGUgdXNlciBzcGFjZSBlcG9sbF9jdGwoMikuCisgKi8KK2FzbWxpbmthZ2UgbG9uZworc3lzX2Vwb2xsX2N0bChpbnQgZXBmZCwgaW50IG9wLCBpbnQgZmQsIHN0cnVjdCBlcG9sbF9ldmVudCBfX3VzZXIgKmV2ZW50KQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgZmlsZSAqZmlsZSwgKnRmaWxlOworCXN0cnVjdCBldmVudHBvbGwgKmVwOworCXN0cnVjdCBlcGl0ZW0gKmVwaTsKKwlzdHJ1Y3QgZXBvbGxfZXZlbnQgZXBkczsKKworCUROUFJJTlRLKDMsIChLRVJOX0lORk8gIlslcF0gZXZlbnRwb2xsOiBzeXNfZXBvbGxfY3RsKCVkLCAlZCwgJWQsICVwKVxuIiwKKwkJICAgICBjdXJyZW50LCBlcGZkLCBvcCwgZmQsIGV2ZW50KSk7CisKKwllcnJvciA9IC1FRkFVTFQ7CisJaWYgKEVQX09QX0hBU0hfRVZFTlQob3ApICYmCisJICAgIGNvcHlfZnJvbV91c2VyKCZlcGRzLCBldmVudCwgc2l6ZW9mKHN0cnVjdCBlcG9sbF9ldmVudCkpKQorCQlnb3RvIGVleGl0XzE7CisKKwkvKiBHZXQgdGhlICJzdHJ1Y3QgZmlsZSAqIiBmb3IgdGhlIGV2ZW50cG9sbCBmaWxlICovCisJZXJyb3IgPSAtRUJBREY7CisJZmlsZSA9IGZnZXQoZXBmZCk7CisJaWYgKCFmaWxlKQorCQlnb3RvIGVleGl0XzE7CisKKwkvKiBHZXQgdGhlICJzdHJ1Y3QgZmlsZSAqIiBmb3IgdGhlIHRhcmdldCBmaWxlICovCisJdGZpbGUgPSBmZ2V0KGZkKTsKKwlpZiAoIXRmaWxlKQorCQlnb3RvIGVleGl0XzI7CisKKwkvKiBUaGUgdGFyZ2V0IGZpbGUgZGVzY3JpcHRvciBtdXN0IHN1cHBvcnQgcG9sbCAqLworCWVycm9yID0gLUVQRVJNOworCWlmICghdGZpbGUtPmZfb3AgfHwgIXRmaWxlLT5mX29wLT5wb2xsKQorCQlnb3RvIGVleGl0XzM7CisKKwkvKgorCSAqIFdlIGhhdmUgdG8gY2hlY2sgdGhhdCB0aGUgZmlsZSBzdHJ1Y3R1cmUgdW5kZXJuZWF0aCB0aGUgZmlsZSBkZXNjcmlwdG9yCisJICogdGhlIHVzZXIgcGFzc2VkIHRvIHVzIF9pc18gYW4gZXZlbnRwb2xsIGZpbGUuIEFuZCBhbHNvIHdlIGRvIG5vdCBwZXJtaXQKKwkgKiBhZGRpbmcgYW4gZXBvbGwgZmlsZSBkZXNjcmlwdG9yIGluc2lkZSBpdHNlbGYuCisJICovCisJZXJyb3IgPSAtRUlOVkFMOworCWlmIChmaWxlID09IHRmaWxlIHx8ICFJU19GSUxFX0VQT0xMKGZpbGUpKQorCQlnb3RvIGVleGl0XzM7CisKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQgaXQgaXMgc2FmZSB0byBhc3N1bWUgdGhhdCB0aGUgInByaXZhdGVfZGF0YSIgY29udGFpbnMKKwkgKiBvdXIgb3duIGRhdGEgc3RydWN0dXJlLgorCSAqLworCWVwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJZG93bl93cml0ZSgmZXAtPnNlbSk7CisKKwkvKiBUcnkgdG8gbG9va3VwIHRoZSBmaWxlIGluc2lkZSBvdXIgaGFzaCB0YWJsZSAqLworCWVwaSA9IGVwX2ZpbmQoZXAsIHRmaWxlLCBmZCk7CisKKwllcnJvciA9IC1FSU5WQUw7CisJc3dpdGNoIChvcCkgeworCWNhc2UgRVBPTExfQ1RMX0FERDoKKwkJaWYgKCFlcGkpIHsKKwkJCWVwZHMuZXZlbnRzIHw9IFBPTExFUlIgfCBQT0xMSFVQOworCisJCQllcnJvciA9IGVwX2luc2VydChlcCwgJmVwZHMsIHRmaWxlLCBmZCk7CisJCX0gZWxzZQorCQkJZXJyb3IgPSAtRUVYSVNUOworCQlicmVhazsKKwljYXNlIEVQT0xMX0NUTF9ERUw6CisJCWlmIChlcGkpCisJCQllcnJvciA9IGVwX3JlbW92ZShlcCwgZXBpKTsKKwkJZWxzZQorCQkJZXJyb3IgPSAtRU5PRU5UOworCQlicmVhazsKKwljYXNlIEVQT0xMX0NUTF9NT0Q6CisJCWlmIChlcGkpIHsKKwkJCWVwZHMuZXZlbnRzIHw9IFBPTExFUlIgfCBQT0xMSFVQOworCQkJZXJyb3IgPSBlcF9tb2RpZnkoZXAsIGVwaSwgJmVwZHMpOworCQl9IGVsc2UKKwkJCWVycm9yID0gLUVOT0VOVDsKKwkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBUaGUgZnVuY3Rpb24gZXBfZmluZCgpIGluY3JlbWVudHMgdGhlIHVzYWdlIGNvdW50IG9mIHRoZSBzdHJ1Y3R1cmUKKwkgKiBzbywgaWYgdGhpcyBpcyBub3QgTlVMTCwgd2UgbmVlZCB0byByZWxlYXNlIGl0LgorCSAqLworCWlmIChlcGkpCisJCWVwX3JlbGVhc2VfZXBpdGVtKGVwaSk7CisKKwl1cF93cml0ZSgmZXAtPnNlbSk7CisKK2VleGl0XzM6CisJZnB1dCh0ZmlsZSk7CitlZXhpdF8yOgorCWZwdXQoZmlsZSk7CitlZXhpdF8xOgorCUROUFJJTlRLKDMsIChLRVJOX0lORk8gIlslcF0gZXZlbnRwb2xsOiBzeXNfZXBvbGxfY3RsKCVkLCAlZCwgJWQsICVwKSA9ICVkXG4iLAorCQkgICAgIGN1cnJlbnQsIGVwZmQsIG9wLCBmZCwgZXZlbnQsIGVycm9yKSk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKyNkZWZpbmUgTUFYX0VWRU5UUyAoSU5UX01BWCAvIHNpemVvZihzdHJ1Y3QgZXBvbGxfZXZlbnQpKQorCisvKgorICogSW1wbGVtZW50IHRoZSBldmVudCB3YWl0IGludGVyZmFjZSBmb3IgdGhlIGV2ZW50cG9sbCBmaWxlLiBJdCBpcyB0aGUga2VybmVsCisgKiBwYXJ0IG9mIHRoZSB1c2VyIHNwYWNlIGVwb2xsX3dhaXQoMikuCisgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfZXBvbGxfd2FpdChpbnQgZXBmZCwgc3RydWN0IGVwb2xsX2V2ZW50IF9fdXNlciAqZXZlbnRzLAorCQkJICAgICAgIGludCBtYXhldmVudHMsIGludCB0aW1lb3V0KQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlzdHJ1Y3QgZXZlbnRwb2xsICplcDsKKworCUROUFJJTlRLKDMsIChLRVJOX0lORk8gIlslcF0gZXZlbnRwb2xsOiBzeXNfZXBvbGxfd2FpdCglZCwgJXAsICVkLCAlZClcbiIsCisJCSAgICAgY3VycmVudCwgZXBmZCwgZXZlbnRzLCBtYXhldmVudHMsIHRpbWVvdXQpKTsKKworCS8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBldmVudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvICovCisJaWYgKG1heGV2ZW50cyA8PSAwIHx8IG1heGV2ZW50cyA+IE1BWF9FVkVOVFMpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogVmVyaWZ5IHRoYXQgdGhlIGFyZWEgcGFzc2VkIGJ5IHRoZSB1c2VyIGlzIHdyaXRlYWJsZSAqLworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZXZlbnRzLCBtYXhldmVudHMgKiBzaXplb2Yoc3RydWN0IGVwb2xsX2V2ZW50KSkpIHsKKwkJZXJyb3IgPSAtRUZBVUxUOworCQlnb3RvIGVleGl0XzE7CisJfQorCisJLyogR2V0IHRoZSAic3RydWN0IGZpbGUgKiIgZm9yIHRoZSBldmVudHBvbGwgZmlsZSAqLworCWVycm9yID0gLUVCQURGOworCWZpbGUgPSBmZ2V0KGVwZmQpOworCWlmICghZmlsZSkKKwkJZ290byBlZXhpdF8xOworCisJLyoKKwkgKiBXZSBoYXZlIHRvIGNoZWNrIHRoYXQgdGhlIGZpbGUgc3RydWN0dXJlIHVuZGVybmVhdGggdGhlIGZkCisJICogdGhlIHVzZXIgcGFzc2VkIHRvIHVzIF9pc18gYW4gZXZlbnRwb2xsIGZpbGUuCisJICovCisJZXJyb3IgPSAtRUlOVkFMOworCWlmICghSVNfRklMRV9FUE9MTChmaWxlKSkKKwkJZ290byBlZXhpdF8yOworCisJLyoKKwkgKiBBdCB0aGlzIHBvaW50IGl0IGlzIHNhZmUgdG8gYXNzdW1lIHRoYXQgdGhlICJwcml2YXRlX2RhdGEiIGNvbnRhaW5zCisJICogb3VyIG93biBkYXRhIHN0cnVjdHVyZS4KKwkgKi8KKwllcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCS8qIFRpbWUgdG8gZmlzaCBmb3IgZXZlbnRzIC4uLiAqLworCWVycm9yID0gZXBfcG9sbChlcCwgZXZlbnRzLCBtYXhldmVudHMsIHRpbWVvdXQpOworCitlZXhpdF8yOgorCWZwdXQoZmlsZSk7CitlZXhpdF8xOgorCUROUFJJTlRLKDMsIChLRVJOX0lORk8gIlslcF0gZXZlbnRwb2xsOiBzeXNfZXBvbGxfd2FpdCglZCwgJXAsICVkLCAlZCkgPSAlZFxuIiwKKwkJICAgICBjdXJyZW50LCBlcGZkLCBldmVudHMsIG1heGV2ZW50cywgdGltZW91dCwgZXJyb3IpKTsKKworCXJldHVybiBlcnJvcjsKK30KKworCisvKgorICogQ3JlYXRlcyB0aGUgZmlsZSBkZXNjcmlwdG9yIHRvIGJlIHVzZWQgYnkgdGhlIGVwb2xsIGludGVyZmFjZS4KKyAqLworc3RhdGljIGludCBlcF9nZXRmZChpbnQgKmVmZCwgc3RydWN0IGlub2RlICoqZWlub2RlLCBzdHJ1Y3QgZmlsZSAqKmVmaWxlKQoreworCXN0cnVjdCBxc3RyIHRoaXM7CisJY2hhciBuYW1lWzMyXTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlpbnQgZXJyb3IsIGZkOworCisJLyogR2V0IGFuIHJlYWR5IHRvIHVzZSBmaWxlICovCisJZXJyb3IgPSAtRU5GSUxFOworCWZpbGUgPSBnZXRfZW1wdHlfZmlscCgpOworCWlmICghZmlsZSkKKwkJZ290byBlZXhpdF8xOworCisJLyogQWxsb2NhdGVzIGFuIGlub2RlIGZyb20gdGhlIGV2ZW50cG9sbCBmaWxlIHN5c3RlbSAqLworCWlub2RlID0gZXBfZXZlbnRwb2xsX2lub2RlKCk7CisJZXJyb3IgPSBQVFJfRVJSKGlub2RlKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkKKwkJZ290byBlZXhpdF8yOworCisJLyogQWxsb2NhdGVzIGEgZnJlZSBkZXNjcmlwdG9yIHRvIHBsdWcgdGhlIGZpbGUgb250byAqLworCWVycm9yID0gZ2V0X3VudXNlZF9mZCgpOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gZWV4aXRfMzsKKwlmZCA9IGVycm9yOworCisJLyoKKwkgKiBMaW5rIHRoZSBpbm9kZSB0byBhIGRpcmVjdG9yeSBlbnRyeSBieSBjcmVhdGluZyBhIHVuaXF1ZSBuYW1lCisJICogdXNpbmcgdGhlIGlub2RlIG51bWJlci4KKwkgKi8KKwllcnJvciA9IC1FTk9NRU07CisJc3ByaW50ZihuYW1lLCAiWyVsdV0iLCBpbm9kZS0+aV9pbm8pOworCXRoaXMubmFtZSA9IG5hbWU7CisJdGhpcy5sZW4gPSBzdHJsZW4obmFtZSk7CisJdGhpcy5oYXNoID0gaW5vZGUtPmlfaW5vOworCWRlbnRyeSA9IGRfYWxsb2MoZXZlbnRwb2xsX21udC0+bW50X3NiLT5zX3Jvb3QsICZ0aGlzKTsKKwlpZiAoIWRlbnRyeSkKKwkJZ290byBlZXhpdF80OworCWRlbnRyeS0+ZF9vcCA9ICZldmVudHBvbGxmc19kZW50cnlfb3BlcmF0aW9uczsKKwlkX2FkZChkZW50cnksIGlub2RlKTsKKwlmaWxlLT5mX3Zmc21udCA9IG1udGdldChldmVudHBvbGxfbW50KTsKKwlmaWxlLT5mX2RlbnRyeSA9IGRlbnRyeTsKKwlmaWxlLT5mX21hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCisJZmlsZS0+Zl9wb3MgPSAwOworCWZpbGUtPmZfZmxhZ3MgPSBPX1JET05MWTsKKwlmaWxlLT5mX29wID0gJmV2ZW50cG9sbF9mb3BzOworCWZpbGUtPmZfbW9kZSA9IEZNT0RFX1JFQUQ7CisJZmlsZS0+Zl92ZXJzaW9uID0gMDsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCisJLyogSW5zdGFsbCB0aGUgbmV3IHNldHVwIGZpbGUgaW50byB0aGUgYWxsb2NhdGVkIGZkLiAqLworCWZkX2luc3RhbGwoZmQsIGZpbGUpOworCisJKmVmZCA9IGZkOworCSplaW5vZGUgPSBpbm9kZTsKKwkqZWZpbGUgPSBmaWxlOworCXJldHVybiAwOworCitlZXhpdF80OgorCXB1dF91bnVzZWRfZmQoZmQpOworZWV4aXRfMzoKKwlpcHV0KGlub2RlKTsKK2VleGl0XzI6CisJcHV0X2ZpbHAoZmlsZSk7CitlZXhpdF8xOgorCXJldHVybiBlcnJvcjsKK30KKworCitzdGF0aWMgaW50IGVwX2ZpbGVfaW5pdChzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZXZlbnRwb2xsICplcDsKKworCWlmICghKGVwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGV2ZW50cG9sbCksIEdGUF9LRVJORUwpKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1zZXQoZXAsIDAsIHNpemVvZigqZXApKTsKKwlyd2xvY2tfaW5pdCgmZXAtPmxvY2spOworCWluaXRfcndzZW0oJmVwLT5zZW0pOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmVwLT53cSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZXAtPnBvbGxfd2FpdCk7CisJSU5JVF9MSVNUX0hFQUQoJmVwLT5yZGxsaXN0KTsKKwllcC0+cmJyID0gUkJfUk9PVDsKKworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGVwOworCisJRE5QUklOVEsoMywgKEtFUk5fSU5GTyAiWyVwXSBldmVudHBvbGw6IGVwX2ZpbGVfaW5pdCgpIGVwPSVwXG4iLAorCQkgICAgIGN1cnJlbnQsIGVwKSk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgZXBfZnJlZShzdHJ1Y3QgZXZlbnRwb2xsICplcCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqcmJwOworCXN0cnVjdCBlcGl0ZW0gKmVwaTsKKworCS8qIFdlIG5lZWQgdG8gcmVsZWFzZSBhbGwgdGFza3Mgd2FpdGluZyBmb3IgdGhlc2UgZmlsZSAqLworCWlmICh3YWl0cXVldWVfYWN0aXZlKCZlcC0+cG9sbF93YWl0KSkKKwkJZXBfcG9sbF9zYWZld2FrZSgmcHN3LCAmZXAtPnBvbGxfd2FpdCk7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gbG9jayB0aGlzIGJlY2F1c2Ugd2UgY291bGQgYmUgaGl0IGJ5CisJICogZXZlbnRwb2xsX3JlbGVhc2VfZmlsZSgpIHdoaWxlIHdlJ3JlIGZyZWVpbmcgdGhlICJzdHJ1Y3QgZXZlbnRwb2xsIi4KKwkgKiBXZSBkbyBub3QgbmVlZCB0byBob2xkICJlcC0+c2VtIiBoZXJlIGJlY2F1c2UgdGhlIGVwb2xsIGZpbGUKKwkgKiBpcyBvbiB0aGUgd2F5IHRvIGJlIHJlbW92ZWQgYW5kIG5vIG9uZSBoYXMgcmVmZXJlbmNlcyB0byBpdAorCSAqIGFueW1vcmUuIFRoZSBvbmx5IGhpdCBtaWdodCBjb21lIGZyb20gZXZlbnRwb2xsX3JlbGVhc2VfZmlsZSgpIGJ1dAorCSAqIGhvbGRpbmcgImVwc2VtIiBpcyBzdWZmaWNlbnQgaGVyZS4KKwkgKi8KKwlkb3duKCZlcHNlbSk7CisKKwkvKgorCSAqIFdhbGtzIHRocm91Z2ggdGhlIHdob2xlIHRyZWUgYnkgdW5yZWdpc3RlcmluZyBwb2xsIGNhbGxiYWNrcy4KKwkgKi8KKwlmb3IgKHJicCA9IHJiX2ZpcnN0KCZlcC0+cmJyKTsgcmJwOyByYnAgPSByYl9uZXh0KHJicCkpIHsKKwkJZXBpID0gcmJfZW50cnkocmJwLCBzdHJ1Y3QgZXBpdGVtLCByYm4pOworCisJCWVwX3VucmVnaXN0ZXJfcG9sbHdhaXQoZXAsIGVwaSk7CisJfQorCisJLyoKKwkgKiBXYWxrcyB0aHJvdWdoIHRoZSB3aG9sZSBoYXNoIGJ5IGZyZWVpbmcgZWFjaCAic3RydWN0IGVwaXRlbSIuIEF0IHRoaXMKKwkgKiBwb2ludCB3ZSBhcmUgc3VyZSBubyBwb2xsIGNhbGxiYWNrcyB3aWxsIGJlIGxpbmdlcmluZyBhcm91bmQsIGFuZCBhbHNvIGJ5CisJICogd3JpdGUtaG9sZGluZyAic2VtIiB3ZSBjYW4gYmUgc3VyZSB0aGF0IG5vIGZpbGUgY2xlYW51cCBjb2RlIHdpbGwgaGl0CisJICogdXMgZHVyaW5nIHRoaXMgb3BlcmF0aW9uLiBTbyB3ZSBjYW4gYXZvaWQgdGhlIGxvY2sgb24gImVwLT5sb2NrIi4KKwkgKi8KKwl3aGlsZSAoKHJicCA9IHJiX2ZpcnN0KCZlcC0+cmJyKSkgIT0gMCkgeworCQllcGkgPSByYl9lbnRyeShyYnAsIHN0cnVjdCBlcGl0ZW0sIHJibik7CisJCWVwX3JlbW92ZShlcCwgZXBpKTsKKwl9CisKKwl1cCgmZXBzZW0pOworfQorCisKKy8qCisgKiBTZWFyY2ggdGhlIGZpbGUgaW5zaWRlIHRoZSBldmVudHBvbGwgaGFzaC4gSXQgYWRkIHVzYWdlIGNvdW50IHRvCisgKiB0aGUgcmV0dXJuZWQgaXRlbSwgc28gdGhlIGNhbGxlciBtdXN0IGNhbGwgZXBfcmVsZWFzZV9lcGl0ZW0oKQorICogYWZ0ZXIgZmluaXNoZWQgdXNpbmcgdGhlICJzdHJ1Y3QgZXBpdGVtIi4KKyAqLworc3RhdGljIHN0cnVjdCBlcGl0ZW0gKmVwX2ZpbmQoc3RydWN0IGV2ZW50cG9sbCAqZXAsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgZmQpCit7CisJaW50IGtjbXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcmJfbm9kZSAqcmJwOworCXN0cnVjdCBlcGl0ZW0gKmVwaSwgKmVwaXIgPSBOVUxMOworCXN0cnVjdCBlcG9sbF9maWxlZmQgZmZkOworCisJRVBfU0VUX0ZGRCgmZmZkLCBmaWxlLCBmZCk7CisJcmVhZF9sb2NrX2lycXNhdmUoJmVwLT5sb2NrLCBmbGFncyk7CisJZm9yIChyYnAgPSBlcC0+cmJyLnJiX25vZGU7IHJicDsgKSB7CisJCWVwaSA9IHJiX2VudHJ5KHJicCwgc3RydWN0IGVwaXRlbSwgcmJuKTsKKwkJa2NtcCA9IEVQX0NNUF9GRkQoJmZmZCwgJmVwaS0+ZmZkKTsKKwkJaWYgKGtjbXAgPiAwKQorCQkJcmJwID0gcmJwLT5yYl9yaWdodDsKKwkJZWxzZSBpZiAoa2NtcCA8IDApCisJCQlyYnAgPSByYnAtPnJiX2xlZnQ7CisJCWVsc2UgeworCQkJZXBfdXNlX2VwaXRlbShlcGkpOworCQkJZXBpciA9IGVwaTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJmVwLT5sb2NrLCBmbGFncyk7CisKKwlETlBSSU5USygzLCAoS0VSTl9JTkZPICJbJXBdIGV2ZW50cG9sbDogZXBfZmluZCglcCkgLT4gJXBcbiIsCisJCSAgICAgY3VycmVudCwgZmlsZSwgZXBpcikpOworCisJcmV0dXJuIGVwaXI7Cit9CisKKworLyoKKyAqIEluY3JlbWVudCB0aGUgdXNhZ2UgY291bnQgb2YgdGhlICJzdHJ1Y3QgZXBpdGVtIiBtYWtpbmcgaXQgc3VyZQorICogdGhhdCB0aGUgdXNlciB3aWxsIGhhdmUgYSB2YWxpZCBwb2ludGVyIHRvIHJlZmVyZW5jZS4KKyAqLworc3RhdGljIHZvaWQgZXBfdXNlX2VwaXRlbShzdHJ1Y3QgZXBpdGVtICplcGkpCit7CisKKwlhdG9taWNfaW5jKCZlcGktPnVzZWNudCk7Cit9CisKKworLyoKKyAqIERlY3JlbWVudCAoIHJlbGVhc2UgKSB0aGUgdXNhZ2UgY291bnQgYnkgc2lnbmFsaW5nIHRoYXQgdGhlIHVzZXIKKyAqIGhhcyBmaW5pc2hlZCB1c2luZyB0aGUgc3RydWN0dXJlLiBJdCBtaWdodCBsZWFkIHRvIGZyZWVpbmcgdGhlCisgKiBzdHJ1Y3R1cmUgaXRzZWxmIGlmIHRoZSBjb3VudCBnb2VzIHRvIHplcm8uCisgKi8KK3N0YXRpYyB2b2lkIGVwX3JlbGVhc2VfZXBpdGVtKHN0cnVjdCBlcGl0ZW0gKmVwaSkKK3sKKworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZlcGktPnVzZWNudCkpCisJCUVQSV9NRU1fRlJFRShlcGkpOworfQorCisKKy8qCisgKiBUaGlzIGlzIHRoZSBjYWxsYmFjayB0aGF0IGlzIHVzZWQgdG8gYWRkIG91ciB3YWl0IHF1ZXVlIHRvIHRoZQorICogdGFyZ2V0IGZpbGUgd2FrZXVwIGxpc3RzLgorICovCitzdGF0aWMgdm9pZCBlcF9wdGFibGVfcXVldWVfcHJvYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgd2FpdF9xdWV1ZV9oZWFkX3QgKndoZWFkLAorCQkJCSBwb2xsX3RhYmxlICpwdCkKK3sKKwlzdHJ1Y3QgZXBpdGVtICplcGkgPSBFUF9JVEVNX0ZST01fRVBRVUVVRShwdCk7CisJc3RydWN0IGVwcG9sbF9lbnRyeSAqcHdxOworCisJaWYgKGVwaS0+bndhaXQgPj0gMCAmJiAocHdxID0gUFdRX01FTV9BTExPQygpKSkgeworCQlpbml0X3dhaXRxdWV1ZV9mdW5jX2VudHJ5KCZwd3EtPndhaXQsIGVwX3BvbGxfY2FsbGJhY2spOworCQlwd3EtPndoZWFkID0gd2hlYWQ7CisJCXB3cS0+YmFzZSA9IGVwaTsKKwkJYWRkX3dhaXRfcXVldWUod2hlYWQsICZwd3EtPndhaXQpOworCQlsaXN0X2FkZF90YWlsKCZwd3EtPmxsaW5rLCAmZXBpLT5wd3FsaXN0KTsKKwkJZXBpLT5ud2FpdCsrOworCX0gZWxzZSB7CisJCS8qIFdlIGhhdmUgdG8gc2lnbmFsIHRoYXQgYW4gZXJyb3Igb2NjdXJyZWQgKi8KKwkJZXBpLT5ud2FpdCA9IC0xOworCX0KK30KKworCitzdGF0aWMgdm9pZCBlcF9yYnRyZWVfaW5zZXJ0KHN0cnVjdCBldmVudHBvbGwgKmVwLCBzdHJ1Y3QgZXBpdGVtICplcGkpCit7CisJaW50IGtjbXA7CisJc3RydWN0IHJiX25vZGUgKipwID0gJmVwLT5yYnIucmJfbm9kZSwgKnBhcmVudCA9IE5VTEw7CisJc3RydWN0IGVwaXRlbSAqZXBpYzsKKworCXdoaWxlICgqcCkgeworCQlwYXJlbnQgPSAqcDsKKwkJZXBpYyA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGVwaXRlbSwgcmJuKTsKKwkJa2NtcCA9IEVQX0NNUF9GRkQoJmVwaS0+ZmZkLCAmZXBpYy0+ZmZkKTsKKwkJaWYgKGtjbXAgPiAwKQorCQkJcCA9ICZwYXJlbnQtPnJiX3JpZ2h0OworCQllbHNlCisJCQlwID0gJnBhcmVudC0+cmJfbGVmdDsKKwl9CisJcmJfbGlua19ub2RlKCZlcGktPnJibiwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJmVwaS0+cmJuLCAmZXAtPnJicik7Cit9CisKKworc3RhdGljIGludCBlcF9pbnNlcnQoc3RydWN0IGV2ZW50cG9sbCAqZXAsIHN0cnVjdCBlcG9sbF9ldmVudCAqZXZlbnQsCisJCSAgICAgc3RydWN0IGZpbGUgKnRmaWxlLCBpbnQgZmQpCit7CisJaW50IGVycm9yLCByZXZlbnRzLCBwd2FrZSA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZXBpdGVtICplcGk7CisJc3RydWN0IGVwX3BxdWV1ZSBlcHE7CisKKwllcnJvciA9IC1FTk9NRU07CisJaWYgKCEoZXBpID0gRVBJX01FTV9BTExPQygpKSkKKwkJZ290byBlZXhpdF8xOworCisJLyogSXRlbSBpbml0aWFsaXphdGlvbiBmb2xsb3cgaGVyZSAuLi4gKi8KKwlFUF9SQl9JTklUTk9ERSgmZXBpLT5yYm4pOworCUlOSVRfTElTVF9IRUFEKCZlcGktPnJkbGxpbmspOworCUlOSVRfTElTVF9IRUFEKCZlcGktPmZsbGluayk7CisJSU5JVF9MSVNUX0hFQUQoJmVwaS0+dHhsaW5rKTsKKwlJTklUX0xJU1RfSEVBRCgmZXBpLT5wd3FsaXN0KTsKKwllcGktPmVwID0gZXA7CisJRVBfU0VUX0ZGRCgmZXBpLT5mZmQsIHRmaWxlLCBmZCk7CisJZXBpLT5ldmVudCA9ICpldmVudDsKKwlhdG9taWNfc2V0KCZlcGktPnVzZWNudCwgMSk7CisJZXBpLT5ud2FpdCA9IDA7CisKKwkvKiBJbml0aWFsaXplIHRoZSBwb2xsIHRhYmxlIHVzaW5nIHRoZSBxdWV1ZSBjYWxsYmFjayAqLworCWVwcS5lcGkgPSBlcGk7CisJaW5pdF9wb2xsX2Z1bmNwdHIoJmVwcS5wdCwgZXBfcHRhYmxlX3F1ZXVlX3Byb2MpOworCisJLyoKKwkgKiBBdHRhY2ggdGhlIGl0ZW0gdG8gdGhlIHBvbGwgaG9va3MgYW5kIGdldCBjdXJyZW50IGV2ZW50IGJpdHMuCisJICogV2UgY2FuIHNhZmVseSB1c2UgdGhlIGZpbGUqIGhlcmUgYmVjYXVzZSBpdHMgdXNhZ2UgY291bnQgaGFzCisJICogYmVlbiBpbmNyZWFzZWQgYnkgdGhlIGNhbGxlciBvZiB0aGlzIGZ1bmN0aW9uLgorCSAqLworCXJldmVudHMgPSB0ZmlsZS0+Zl9vcC0+cG9sbCh0ZmlsZSwgJmVwcS5wdCk7CisKKwkvKgorCSAqIFdlIGhhdmUgdG8gY2hlY2sgaWYgc29tZXRoaW5nIHdlbnQgd3JvbmcgZHVyaW5nIHRoZSBwb2xsIHdhaXQgcXVldWUKKwkgKiBpbnN0YWxsIHByb2Nlc3MuIE5hbWVseSBhbiBhbGxvY2F0aW9uIGZvciBhIHdhaXQgcXVldWUgZmFpbGVkIGR1ZQorCSAqIGhpZ2ggbWVtb3J5IHByZXNzdXJlLgorCSAqLworCWlmIChlcGktPm53YWl0IDwgMCkKKwkJZ290byBlZXhpdF8yOworCisJLyogQWRkIHRoZSBjdXJyZW50IGl0ZW0gdG8gdGhlIGxpc3Qgb2YgYWN0aXZlIGVwb2xsIGhvb2sgZm9yIHRoaXMgZmlsZSAqLworCXNwaW5fbG9jaygmdGZpbGUtPmZfZXBfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmZXBpLT5mbGxpbmssICZ0ZmlsZS0+Zl9lcF9saW5rcyk7CisJc3Bpbl91bmxvY2soJnRmaWxlLT5mX2VwX2xvY2spOworCisJLyogV2UgaGF2ZSB0byBkcm9wIHRoZSBuZXcgaXRlbSBpbnNpZGUgb3VyIGl0ZW0gbGlzdCB0byBrZWVwIHRyYWNrIG9mIGl0ICovCisJd3JpdGVfbG9ja19pcnFzYXZlKCZlcC0+bG9jaywgZmxhZ3MpOworCisJLyogQWRkIHRoZSBjdXJyZW50IGl0ZW0gdG8gdGhlIHJiLXRyZWUgKi8KKwllcF9yYnRyZWVfaW5zZXJ0KGVwLCBlcGkpOworCisJLyogSWYgdGhlIGZpbGUgaXMgYWxyZWFkeSAicmVhZHkiIHdlIGRyb3AgaXQgaW5zaWRlIHRoZSByZWFkeSBsaXN0ICovCisJaWYgKChyZXZlbnRzICYgZXZlbnQtPmV2ZW50cykgJiYgIUVQX0lTX0xJTktFRCgmZXBpLT5yZGxsaW5rKSkgeworCQlsaXN0X2FkZF90YWlsKCZlcGktPnJkbGxpbmssICZlcC0+cmRsbGlzdCk7CisKKwkJLyogTm90aWZ5IHdhaXRpbmcgdGFza3MgdGhhdCBldmVudHMgYXJlIGF2YWlsYWJsZSAqLworCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmZXAtPndxKSkKKwkJCXdha2VfdXAoJmVwLT53cSk7CisJCWlmICh3YWl0cXVldWVfYWN0aXZlKCZlcC0+cG9sbF93YWl0KSkKKwkJCXB3YWtlKys7CisJfQorCisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmVwLT5sb2NrLCBmbGFncyk7CisKKwkvKiBXZSBoYXZlIHRvIGNhbGwgdGhpcyBvdXRzaWRlIHRoZSBsb2NrICovCisJaWYgKHB3YWtlKQorCQllcF9wb2xsX3NhZmV3YWtlKCZwc3csICZlcC0+cG9sbF93YWl0KTsKKworCUROUFJJTlRLKDMsIChLRVJOX0lORk8gIlslcF0gZXZlbnRwb2xsOiBlcF9pbnNlcnQoJXAsICVwLCAlZClcbiIsCisJCSAgICAgY3VycmVudCwgZXAsIHRmaWxlLCBmZCkpOworCisJcmV0dXJuIDA7CisKK2VleGl0XzI6CisJZXBfdW5yZWdpc3Rlcl9wb2xsd2FpdChlcCwgZXBpKTsKKworCS8qCisJICogV2UgbmVlZCB0byBkbyB0aGlzIGJlY2F1c2UgYW4gZXZlbnQgY291bGQgaGF2ZSBiZWVuIGFycml2ZWQgb24gc29tZQorCSAqIGFsbG9jYXRlZCB3YWl0IHF1ZXVlLgorCSAqLworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmZXAtPmxvY2ssIGZsYWdzKTsKKwlpZiAoRVBfSVNfTElOS0VEKCZlcGktPnJkbGxpbmspKQorCQlFUF9MSVNUX0RFTCgmZXBpLT5yZGxsaW5rKTsKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmZXAtPmxvY2ssIGZsYWdzKTsKKworCUVQSV9NRU1fRlJFRShlcGkpOworZWV4aXRfMToKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworLyoKKyAqIE1vZGlmeSB0aGUgaW50ZXJlc3QgZXZlbnQgbWFzayBieSBkcm9wcGluZyBhbiBldmVudCBpZiB0aGUgbmV3IG1hc2sKKyAqIGhhcyBhIG1hdGNoIGluIHRoZSBjdXJyZW50IGZpbGUgc3RhdHVzLgorICovCitzdGF0aWMgaW50IGVwX21vZGlmeShzdHJ1Y3QgZXZlbnRwb2xsICplcCwgc3RydWN0IGVwaXRlbSAqZXBpLCBzdHJ1Y3QgZXBvbGxfZXZlbnQgKmV2ZW50KQoreworCWludCBwd2FrZSA9IDA7CisJdW5zaWduZWQgaW50IHJldmVudHM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qCisJICogU2V0IHRoZSBuZXcgZXZlbnQgaW50ZXJlc3QgbWFzayBiZWZvcmUgY2FsbGluZyBmX29wLT5wb2xsKCksIG90aGVyd2lzZQorCSAqIGEgcG90ZW50aWFsIHJhY2UgbWlnaHQgb2NjdXIuIEluIGZhY3QgaWYgd2UgZG8gdGhpcyBvcGVyYXRpb24gaW5zaWRlCisJICogdGhlIGxvY2ssIGFuIGV2ZW50IG1pZ2h0IGhhcHBlbiBiZXR3ZWVuIHRoZSBmX29wLT5wb2xsKCkgY2FsbCBhbmQgdGhlCisJICogbmV3IGV2ZW50IHNldCByZWdpc3RlcmluZy4KKwkgKi8KKwllcGktPmV2ZW50LmV2ZW50cyA9IGV2ZW50LT5ldmVudHM7CisKKwkvKgorCSAqIEdldCBjdXJyZW50IGV2ZW50IGJpdHMuIFdlIGNhbiBzYWZlbHkgdXNlIHRoZSBmaWxlKiBoZXJlIGJlY2F1c2UKKwkgKiBpdHMgdXNhZ2UgY291bnQgaGFzIGJlZW4gaW5jcmVhc2VkIGJ5IHRoZSBjYWxsZXIgb2YgdGhpcyBmdW5jdGlvbi4KKwkgKi8KKwlyZXZlbnRzID0gZXBpLT5mZmQuZmlsZS0+Zl9vcC0+cG9sbChlcGktPmZmZC5maWxlLCBOVUxMKTsKKworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmZXAtPmxvY2ssIGZsYWdzKTsKKworCS8qIENvcHkgdGhlIGRhdGEgbWVtYmVyIGZyb20gaW5zaWRlIHRoZSBsb2NrICovCisJZXBpLT5ldmVudC5kYXRhID0gZXZlbnQtPmRhdGE7CisKKwkvKgorCSAqIElmIHRoZSBpdGVtIGlzIG5vdCBsaW5rZWQgdG8gdGhlIGhhc2ggaXQgbWVhbnMgdGhhdCBpdCdzIG9uIGl0cworCSAqIHdheSB0b3dhcmQgdGhlIHJlbW92YWwuIERvIG5vdGhpbmcgaW4gdGhpcyBjYXNlLgorCSAqLworCWlmIChFUF9SQl9MSU5LRUQoJmVwaS0+cmJuKSkgeworCQkvKgorCQkgKiBJZiB0aGUgaXRlbSBpcyAiaG90IiBhbmQgaXQgaXMgbm90IHJlZ2lzdGVyZWQgaW5zaWRlIHRoZSByZWFkeQorCQkgKiBsaXN0LCBwdXNoIGl0IGluc2lkZS4gSWYgdGhlIGl0ZW0gaXMgbm90ICJob3QiIGFuZCBpdCBpcyBjdXJyZW50bHkKKwkJICogcmVnaXN0ZXJlZCBpbnNpZGUgdGhlIHJlYWR5IGxpc3QsIHVubGluayBpdC4KKwkJICovCisJCWlmIChyZXZlbnRzICYgZXZlbnQtPmV2ZW50cykgeworCQkJaWYgKCFFUF9JU19MSU5LRUQoJmVwaS0+cmRsbGluaykpIHsKKwkJCQlsaXN0X2FkZF90YWlsKCZlcGktPnJkbGxpbmssICZlcC0+cmRsbGlzdCk7CisKKwkJCQkvKiBOb3RpZnkgd2FpdGluZyB0YXNrcyB0aGF0IGV2ZW50cyBhcmUgYXZhaWxhYmxlICovCisJCQkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmVwLT53cSkpCisJCQkJCXdha2VfdXAoJmVwLT53cSk7CisJCQkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmVwLT5wb2xsX3dhaXQpKQorCQkJCQlwd2FrZSsrOworCQkJfQorCQl9CisJfQorCisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmVwLT5sb2NrLCBmbGFncyk7CisKKwkvKiBXZSBoYXZlIHRvIGNhbGwgdGhpcyBvdXRzaWRlIHRoZSBsb2NrICovCisJaWYgKHB3YWtlKQorCQllcF9wb2xsX3NhZmV3YWtlKCZwc3csICZlcC0+cG9sbF93YWl0KTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHVucmVnaXN0ZXIgcG9sbCBjYWxsYmFja3MgZnJvbSB0aGUgYXNzb2NpYXRlZCBmaWxlIGRlc2NyaXB0b3IuCisgKiBTaW5jZSB0aGlzIG11c3QgYmUgY2FsbGVkIHdpdGhvdXQgaG9sZGluZyAiZXAtPmxvY2siIHRoZSBhdG9taWMgZXhjaGFuZ2UgdHJpY2sKKyAqIHdpbGwgcHJvdGVjdCB1cyBmcm9tIG11bHRpcGxlIHVucmVnaXN0ZXIuCisgKi8KK3N0YXRpYyB2b2lkIGVwX3VucmVnaXN0ZXJfcG9sbHdhaXQoc3RydWN0IGV2ZW50cG9sbCAqZXAsIHN0cnVjdCBlcGl0ZW0gKmVwaSkKK3sKKwlpbnQgbndhaXQ7CisJc3RydWN0IGxpc3RfaGVhZCAqbHN0aGVhZCA9ICZlcGktPnB3cWxpc3Q7CisJc3RydWN0IGVwcG9sbF9lbnRyeSAqcHdxOworCisJLyogVGhpcyBpcyBjYWxsZWQgd2l0aG91dCBsb2Nrcywgc28gd2UgbmVlZCB0aGUgYXRvbWljIGV4Y2hhbmdlICovCisJbndhaXQgPSB4Y2hnKCZlcGktPm53YWl0LCAwKTsKKworCWlmIChud2FpdCkgeworCQl3aGlsZSAoIWxpc3RfZW1wdHkobHN0aGVhZCkpIHsKKwkJCXB3cSA9IGxpc3RfZW50cnkobHN0aGVhZC0+bmV4dCwgc3RydWN0IGVwcG9sbF9lbnRyeSwgbGxpbmspOworCisJCQlFUF9MSVNUX0RFTCgmcHdxLT5sbGluayk7CisJCQlyZW1vdmVfd2FpdF9xdWV1ZShwd3EtPndoZWFkLCAmcHdxLT53YWl0KTsKKwkJCVBXUV9NRU1fRlJFRShwd3EpOworCQl9CisJfQorfQorCisKKy8qCisgKiBVbmxpbmsgdGhlICJzdHJ1Y3QgZXBpdGVtIiBmcm9tIGFsbCBwbGFjZXMgaXQgbWlnaHQgaGF2ZSBiZWVuIGhvb2tlZCB1cC4KKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCB3cml0ZSBJUlEgbG9jayBvbiAiZXAtPmxvY2siLgorICovCitzdGF0aWMgaW50IGVwX3VubGluayhzdHJ1Y3QgZXZlbnRwb2xsICplcCwgc3RydWN0IGVwaXRlbSAqZXBpKQoreworCWludCBlcnJvcjsKKworCS8qCisJICogSXQgY2FuIGhhcHBlbiB0aGF0IHRoaXMgb25lIGlzIGNhbGxlZCBmb3IgYW4gaXRlbSBhbHJlYWR5IHVubGlua2VkLgorCSAqIFRoZSBjaGVjayBwcm90ZWN0IHVzIGZyb20gZG9pbmcgYSBkb3VibGUgdW5saW5rICggY3Jhc2ggKS4KKwkgKi8KKwllcnJvciA9IC1FTk9FTlQ7CisJaWYgKCFFUF9SQl9MSU5LRUQoJmVwaS0+cmJuKSkKKwkJZ290byBlZXhpdF8xOworCisJLyoKKwkgKiBDbGVhciB0aGUgZXZlbnQgbWFzayBmb3IgdGhlIHVubGlua2VkIGl0ZW0uIFRoaXMgd2lsbCBhdm9pZCBpdGVtCisJICogbm90aWZpY2F0aW9ucyB0byBiZSBzZW50IGFmdGVyIHRoZSB1bmxpbmsgb3BlcmF0aW9uIGZyb20gaW5zaWRlCisJICogdGhlIGtlcm5lbC0+dXNlcnNwYWNlIGV2ZW50IHRyYW5zZmVyIGxvb3AuCisJICovCisJZXBpLT5ldmVudC5ldmVudHMgPSAwOworCisJLyoKKwkgKiBBdCB0aGlzIHBvaW50IGlzIHNhZmUgdG8gZG8gdGhlIGpvYiwgdW5saW5rIHRoZSBpdGVtIGZyb20gb3VyIHJiLXRyZWUuCisJICogVGhpcyBvcGVyYXRpb24gdG9naGV0ZXIgd2l0aCB0aGUgYWJvdmUgY2hlY2sgY2xvc2VzIHRoZSBkb29yIHRvCisJICogZG91YmxlIHVubGlua3MuCisJICovCisJRVBfUkJfRVJBU0UoJmVwaS0+cmJuLCAmZXAtPnJicik7CisKKwkvKgorCSAqIElmIHRoZSBpdGVtIHdlIGFyZSBnb2luZyB0byByZW1vdmUgaXMgaW5zaWRlIHRoZSByZWFkeSBmaWxlIGRlc2NyaXB0b3JzCisJICogd2Ugd2FudCB0byByZW1vdmUgaXQgZnJvbSB0aGlzIGxpc3QgdG8gYXZvaWQgc3RhbGUgZXZlbnRzLgorCSAqLworCWlmIChFUF9JU19MSU5LRUQoJmVwaS0+cmRsbGluaykpCisJCUVQX0xJU1RfREVMKCZlcGktPnJkbGxpbmspOworCisJZXJyb3IgPSAwOworZWV4aXRfMToKKworCUROUFJJTlRLKDMsIChLRVJOX0lORk8gIlslcF0gZXZlbnRwb2xsOiBlcF91bmxpbmsoJXAsICVwKSA9ICVkXG4iLAorCQkgICAgIGN1cnJlbnQsIGVwLCBlcGktPmZpbGUsIGVycm9yKSk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworLyoKKyAqIFJlbW92ZXMgYSAic3RydWN0IGVwaXRlbSIgZnJvbSB0aGUgZXZlbnRwb2xsIGhhc2ggYW5kIGRlYWxsb2NhdGVzCisgKiBhbGwgdGhlIGFzc29jaWF0ZWQgcmVzb3VyY2VzLgorICovCitzdGF0aWMgaW50IGVwX3JlbW92ZShzdHJ1Y3QgZXZlbnRwb2xsICplcCwgc3RydWN0IGVwaXRlbSAqZXBpKQoreworCWludCBlcnJvcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBmaWxlICpmaWxlID0gZXBpLT5mZmQuZmlsZTsKKworCS8qCisJICogUmVtb3ZlcyBwb2xsIHdhaXQgcXVldWUgaG9va3MuIFdlIF9oYXZlXyB0byBkbyB0aGlzIHdpdGhvdXQgaG9sZGluZworCSAqIHRoZSAiZXAtPmxvY2siIG90aGVyd2lzZSBhIGRlYWRsb2NrIG1pZ2h0IG9jY3VyLiBUaGlzIGJlY2F1c2Ugb2YgdGhlCisJICogc2VxdWVuY2Ugb2YgdGhlIGxvY2sgYWNxdWlzaXRpb24uIEhlcmUgd2UgZG8gImVwLT5sb2NrIiB0aGVuIHRoZSB3YWl0CisJICogcXVldWUgaGVhZCBsb2NrIHdoZW4gdW5yZWdpc3RlcmluZyB0aGUgd2FpdCBxdWV1ZS4gVGhlIHdha2V1cCBjYWxsYmFjaworCSAqIHdpbGwgcnVuIGJ5IGhvbGRpbmcgdGhlIHdhaXQgcXVldWUgaGVhZCBsb2NrIGFuZCB3aWxsIGNhbGwgb3VyIGNhbGxiYWNrCisJICogdGhhdCB3aWxsIHRyeSB0byBnZXQgImVwLT5sb2NrIi4KKwkgKi8KKwllcF91bnJlZ2lzdGVyX3BvbGx3YWl0KGVwLCBlcGkpOworCisJLyogUmVtb3ZlIHRoZSBjdXJyZW50IGl0ZW0gZnJvbSB0aGUgbGlzdCBvZiBlcG9sbCBob29rcyAqLworCXNwaW5fbG9jaygmZmlsZS0+Zl9lcF9sb2NrKTsKKwlpZiAoRVBfSVNfTElOS0VEKCZlcGktPmZsbGluaykpCisJCUVQX0xJU1RfREVMKCZlcGktPmZsbGluayk7CisJc3Bpbl91bmxvY2soJmZpbGUtPmZfZXBfbG9jayk7CisKKwkvKiBXZSBuZWVkIHRvIGFjcXVpcmUgdGhlIHdyaXRlIElSUSBsb2NrIGJlZm9yZSBjYWxsaW5nIGVwX3VubGluaygpICovCisJd3JpdGVfbG9ja19pcnFzYXZlKCZlcC0+bG9jaywgZmxhZ3MpOworCisJLyogUmVhbGx5IHVubGluayB0aGUgaXRlbSBmcm9tIHRoZSBoYXNoICovCisJZXJyb3IgPSBlcF91bmxpbmsoZXAsIGVwaSk7CisKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmZXAtPmxvY2ssIGZsYWdzKTsKKworCWlmIChlcnJvcikKKwkJZ290byBlZXhpdF8xOworCisJLyogQXQgdGhpcyBwb2ludCBpdCBpcyBzYWZlIHRvIGZyZWUgdGhlIGV2ZW50cG9sbCBpdGVtICovCisJZXBfcmVsZWFzZV9lcGl0ZW0oZXBpKTsKKworCWVycm9yID0gMDsKK2VleGl0XzE6CisJRE5QUklOVEsoMywgKEtFUk5fSU5GTyAiWyVwXSBldmVudHBvbGw6IGVwX3JlbW92ZSglcCwgJXApID0gJWRcbiIsCisJCSAgICAgY3VycmVudCwgZXAsIGZpbGUsIGVycm9yKSk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworLyoKKyAqIFRoaXMgaXMgdGhlIGNhbGxiYWNrIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSB3YWl0IHF1ZXVlIHdha2V1cAorICogbWFjaGFuaXNtLiBJdCBpcyBjYWxsZWQgYnkgdGhlIHN0b3JlZCBmaWxlIGRlc2NyaXB0b3JzIHdoZW4gdGhleQorICogaGF2ZSBldmVudHMgdG8gcmVwb3J0LgorICovCitzdGF0aWMgaW50IGVwX3BvbGxfY2FsbGJhY2sod2FpdF9xdWV1ZV90ICp3YWl0LCB1bnNpZ25lZCBtb2RlLCBpbnQgc3luYywgdm9pZCAqa2V5KQoreworCWludCBwd2FrZSA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZXBpdGVtICplcGkgPSBFUF9JVEVNX0ZST01fV0FJVCh3YWl0KTsKKwlzdHJ1Y3QgZXZlbnRwb2xsICplcCA9IGVwaS0+ZXA7CisKKwlETlBSSU5USygzLCAoS0VSTl9JTkZPICJbJXBdIGV2ZW50cG9sbDogcG9sbF9jYWxsYmFjayglcCkgZXBpPSVwIGVwPSVwXG4iLAorCQkgICAgIGN1cnJlbnQsIGVwaS0+ZmlsZSwgZXBpLCBlcCkpOworCisJd3JpdGVfbG9ja19pcnFzYXZlKCZlcC0+bG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBJZiB0aGUgZXZlbnQgbWFzayBkb2VzIG5vdCBjb250YWluIGFueSBwb2xsKDIpIGV2ZW50LCB3ZSBjb25zaWRlciB0aGUKKwkgKiBkZXNjcmlwdG9yIHRvIGJlIGRpc2FibGVkLiBUaGlzIGNvbmRpdGlvbiBpcyBsaWtlbHkgdGhlIGVmZmVjdCBvZiB0aGUKKwkgKiBFUE9MTE9ORVNIT1QgYml0IHRoYXQgZGlzYWJsZXMgdGhlIGRlc2NyaXB0b3Igd2hlbiBhbiBldmVudCBpcyByZWNlaXZlZCwKKwkgKiB1bnRpbCB0aGUgbmV4dCBFUE9MTF9DVExfTU9EIHdpbGwgYmUgaXNzdWVkLgorCSAqLworCWlmICghKGVwaS0+ZXZlbnQuZXZlbnRzICYgfkVQX1BSSVZBVEVfQklUUykpCisJCWdvdG8gaXNfZGlzYWJsZWQ7CisKKwkvKiBJZiB0aGlzIGZpbGUgaXMgYWxyZWFkeSBpbiB0aGUgcmVhZHkgbGlzdCB3ZSBleGl0IHNvb24gKi8KKwlpZiAoRVBfSVNfTElOS0VEKCZlcGktPnJkbGxpbmspKQorCQlnb3RvIGlzX2xpbmtlZDsKKworCWxpc3RfYWRkX3RhaWwoJmVwaS0+cmRsbGluaywgJmVwLT5yZGxsaXN0KTsKKworaXNfbGlua2VkOgorCS8qCisJICogV2FrZSB1cCAoIGlmIGFjdGl2ZSApIGJvdGggdGhlIGV2ZW50cG9sbCB3YWl0IGxpc3QgYW5kIHRoZSAtPnBvbGwoKQorCSAqIHdhaXQgbGlzdC4KKwkgKi8KKwlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmZXAtPndxKSkKKwkJd2FrZV91cCgmZXAtPndxKTsKKwlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmZXAtPnBvbGxfd2FpdCkpCisJCXB3YWtlKys7CisKK2lzX2Rpc2FibGVkOgorCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZlcC0+bG9jaywgZmxhZ3MpOworCisJLyogV2UgaGF2ZSB0byBjYWxsIHRoaXMgb3V0c2lkZSB0aGUgbG9jayAqLworCWlmIChwd2FrZSkKKwkJZXBfcG9sbF9zYWZld2FrZSgmcHN3LCAmZXAtPnBvbGxfd2FpdCk7CisKKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IGVwX2V2ZW50cG9sbF9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZXZlbnRwb2xsICplcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWlmIChlcCkgeworCQllcF9mcmVlKGVwKTsKKwkJa2ZyZWUoZXApOworCX0KKworCUROUFJJTlRLKDMsIChLRVJOX0lORk8gIlslcF0gZXZlbnRwb2xsOiBjbG9zZSgpIGVwPSVwXG4iLCBjdXJyZW50LCBlcCkpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZXBfZXZlbnRwb2xsX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJdW5zaWduZWQgaW50IHBvbGxmbGFncyA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZXZlbnRwb2xsICplcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCS8qIEluc2VydCBpbnNpZGUgb3VyIHBvbGwgd2FpdCBxdWV1ZSAqLworCXBvbGxfd2FpdChmaWxlLCAmZXAtPnBvbGxfd2FpdCwgd2FpdCk7CisKKwkvKiBDaGVjayBvdXIgY29uZGl0aW9uICovCisJcmVhZF9sb2NrX2lycXNhdmUoJmVwLT5sb2NrLCBmbGFncyk7CisJaWYgKCFsaXN0X2VtcHR5KCZlcC0+cmRsbGlzdCkpCisJCXBvbGxmbGFncyA9IFBPTExJTiB8IFBPTExSRE5PUk07CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmZXAtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBwb2xsZmxhZ3M7Cit9CisKKworLyoKKyAqIFNpbmNlIHdlIGhhdmUgdG8gcmVsZWFzZSB0aGUgbG9jayBkdXJpbmcgdGhlIF9fY29weV90b191c2VyKCkgb3BlcmF0aW9uIGFuZAorICogZHVyaW5nIHRoZSBmX29wLT5wb2xsKCkgY2FsbCwgd2UgdHJ5IHRvIGNvbGxlY3QgdGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zCisgKiBieSByZWR1Y2luZyB0aGUgaXJxbG9jay9pcnF1bmxvY2sgc3dpdGNoaW5nIHJhdGUuCisgKi8KK3N0YXRpYyBpbnQgZXBfY29sbGVjdF9yZWFkeV9pdGVtcyhzdHJ1Y3QgZXZlbnRwb2xsICplcCwgc3RydWN0IGxpc3RfaGVhZCAqdHhsaXN0LCBpbnQgbWF4ZXZlbnRzKQoreworCWludCBuZXBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAqbHN0aGVhZCA9ICZlcC0+cmRsbGlzdCwgKmxuazsKKwlzdHJ1Y3QgZXBpdGVtICplcGk7CisKKwl3cml0ZV9sb2NrX2lycXNhdmUoJmVwLT5sb2NrLCBmbGFncyk7CisKKwlmb3IgKG5lcGkgPSAwLCBsbmsgPSBsc3RoZWFkLT5uZXh0OyBsbmsgIT0gbHN0aGVhZCAmJiBuZXBpIDwgbWF4ZXZlbnRzOykgeworCQllcGkgPSBsaXN0X2VudHJ5KGxuaywgc3RydWN0IGVwaXRlbSwgcmRsbGluayk7CisKKwkJbG5rID0gbG5rLT5uZXh0OworCisJCS8qIElmIHRoaXMgZmlsZSBpcyBhbHJlYWR5IGluIHRoZSByZWFkeSBsaXN0IHdlIGV4aXQgc29vbiAqLworCQlpZiAoIUVQX0lTX0xJTktFRCgmZXBpLT50eGxpbmspKSB7CisJCQkvKgorCQkJICogVGhpcyBpcyBpbml0aWFsaXplZCBpbiB0aGlzIHdheSBzbyB0aGF0IHRoZSBkZWZhdWx0CisJCQkgKiBiZWhhdmlvdXIgb2YgdGhlIHJlaW5qZWN0aW5nIGNvZGUgd2lsbCBiZSB0byBwdXNoIGJhY2sKKwkJCSAqIHRoZSBpdGVtIGluc2lkZSB0aGUgcmVhZHkgbGlzdC4KKwkJCSAqLworCQkJZXBpLT5yZXZlbnRzID0gZXBpLT5ldmVudC5ldmVudHM7CisKKwkJCS8qIExpbmsgdGhlIHJlYWR5IGl0ZW0gaW50byB0aGUgdHJhbnNmZXIgbGlzdCAqLworCQkJbGlzdF9hZGQoJmVwaS0+dHhsaW5rLCB0eGxpc3QpOworCQkJbmVwaSsrOworCisJCQkvKgorCQkJICogVW5saW5rIHRoZSBpdGVtIGZyb20gdGhlIHJlYWR5IGxpc3QuCisJCQkgKi8KKwkJCUVQX0xJU1RfREVMKCZlcGktPnJkbGxpbmspOworCQl9CisJfQorCisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmVwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gbmVwaTsKK30KKworCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aG91dCBob2xkaW5nIHRoZSAiZXAtPmxvY2siIHNpbmNlIHRoZSBjYWxsIHRvCisgKiBfX2NvcHlfdG9fdXNlcigpIG1pZ2h0IHNsZWVwLCBhbmQgYWxzbyBmX29wLT5wb2xsKCkgbWlnaHQgcmVlbmFibGUgdGhlIElSUQorICogYmVjYXVzZSBvZiB0aGUgd2F5IHBvbGwoKSBpcyB0cmFkaXRpb25hbGx5IGltcGxlbWVudGVkIGluIExpbnV4LgorICovCitzdGF0aWMgaW50IGVwX3NlbmRfZXZlbnRzKHN0cnVjdCBldmVudHBvbGwgKmVwLCBzdHJ1Y3QgbGlzdF9oZWFkICp0eGxpc3QsCisJCQkgIHN0cnVjdCBlcG9sbF9ldmVudCBfX3VzZXIgKmV2ZW50cykKK3sKKwlpbnQgZXZlbnRjbnQgPSAwOworCXVuc2lnbmVkIGludCByZXZlbnRzOworCXN0cnVjdCBsaXN0X2hlYWQgKmxuazsKKwlzdHJ1Y3QgZXBpdGVtICplcGk7CisKKwkvKgorCSAqIFdlIGNhbiBsb29wIHdpdGhvdXQgbG9jayBiZWNhdXNlIHRoaXMgaXMgYSB0YXNrIHByaXZhdGUgbGlzdC4KKwkgKiBUaGUgdGVzdCBkb25lIGR1cmluZyB0aGUgY29sbGVjdGlvbiBsb29wIHdpbGwgZ3VhcmFudGVlIHVzIHRoYXQKKwkgKiBhbm90aGVyIHRhc2sgd2lsbCBub3QgdHJ5IHRvIGNvbGxlY3QgdGhpcyBmaWxlLiBBbHNvLCBpdGVtcworCSAqIGNhbm5vdCB2YW5pc2ggZHVyaW5nIHRoZSBsb29wIGJlY2F1c2Ugd2UgYXJlIGhvbGRpbmcgInNlbSIuCisJICovCisJbGlzdF9mb3JfZWFjaChsbmssIHR4bGlzdCkgeworCQllcGkgPSBsaXN0X2VudHJ5KGxuaywgc3RydWN0IGVwaXRlbSwgdHhsaW5rKTsKKworCQkvKgorCQkgKiBHZXQgdGhlIHJlYWR5IGZpbGUgZXZlbnQgc2V0LiBXZSBjYW4gc2FmZWx5IHVzZSB0aGUgZmlsZQorCQkgKiBiZWNhdXNlIHdlIGFyZSBob2xkaW5nIHRoZSAic2VtIiBpbiByZWFkIGFuZCB0aGlzIHdpbGwKKwkJICogZ3VhcmFudGVlIHRoYXQgYm90aCB0aGUgZmlsZSBhbmQgdGhlIGl0ZW0gd2lsbCBub3QgdmFuaXNoLgorCQkgKi8KKwkJcmV2ZW50cyA9IGVwaS0+ZmZkLmZpbGUtPmZfb3AtPnBvbGwoZXBpLT5mZmQuZmlsZSwgTlVMTCk7CisKKwkJLyoKKwkJICogU2V0IHRoZSByZXR1cm4gZXZlbnQgc2V0IGZvciB0aGUgY3VycmVudCBmaWxlIGRlc2NyaXB0b3IuCisJCSAqIE5vdGUgdGhhdCBvbmx5IHRoZSB0YXNrIHRhc2sgd2FzIHN1Y2Nlc3NmdWxseSBhYmxlIHRvIGxpbmsKKwkJICogdGhlIGl0ZW0gdG8gaXRzICJ0eGxpc3QiIHdpbGwgd3JpdGUgdGhpcyBmaWVsZC4KKwkJICovCisJCWVwaS0+cmV2ZW50cyA9IHJldmVudHMgJiBlcGktPmV2ZW50LmV2ZW50czsKKworCQlpZiAoZXBpLT5yZXZlbnRzKSB7CisJCQlpZiAoX19wdXRfdXNlcihlcGktPnJldmVudHMsCisJCQkJICAgICAgICZldmVudHNbZXZlbnRjbnRdLmV2ZW50cykgfHwKKwkJCSAgICBfX3B1dF91c2VyKGVwaS0+ZXZlbnQuZGF0YSwKKwkJCQkgICAgICAgJmV2ZW50c1tldmVudGNudF0uZGF0YSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoZXBpLT5ldmVudC5ldmVudHMgJiBFUE9MTE9ORVNIT1QpCisJCQkJZXBpLT5ldmVudC5ldmVudHMgJj0gRVBfUFJJVkFURV9CSVRTOworCQkJZXZlbnRjbnQrKzsKKwkJfQorCX0KKwlyZXR1cm4gZXZlbnRjbnQ7Cit9CisKKworLyoKKyAqIFdhbGsgdGhyb3VnaCB0aGUgdHJhbnNmZXIgbGlzdCB3ZSBjb2xsZWN0ZWQgd2l0aCBlcF9jb2xsZWN0X3JlYWR5X2l0ZW1zKCkKKyAqIGFuZCwgaWYgMSkgdGhlIGl0ZW0gaXMgc3RpbGwgImFsaXZlIiAyKSBpdHMgZXZlbnQgc2V0IGlzIG5vdCBlbXB0eSAzKSBpdCdzCisgKiBub3QgYWxyZWFkeSBsaW5rZWQsIGxpbmtzIGl0IHRvIHRoZSByZWFkeSBsaXN0LiBTYW1lIGFzIGFib3ZlLCB3ZSBhcmUgaG9sZGluZworICogInNlbSIgc28gaXRlbXMgY2Fubm90IHZhbmlzaCB1bmRlcm5lYXRoIG91ciBub3NlLgorICovCitzdGF0aWMgdm9pZCBlcF9yZWluamVjdF9pdGVtcyhzdHJ1Y3QgZXZlbnRwb2xsICplcCwgc3RydWN0IGxpc3RfaGVhZCAqdHhsaXN0KQoreworCWludCByaWNudCA9IDAsIHB3YWtlID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBlcGl0ZW0gKmVwaTsKKworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmZXAtPmxvY2ssIGZsYWdzKTsKKworCXdoaWxlICghbGlzdF9lbXB0eSh0eGxpc3QpKSB7CisJCWVwaSA9IGxpc3RfZW50cnkodHhsaXN0LT5uZXh0LCBzdHJ1Y3QgZXBpdGVtLCB0eGxpbmspOworCisJCS8qIFVubGluayB0aGUgY3VycmVudCBpdGVtIGZyb20gdGhlIHRyYW5zZmVyIGxpc3QgKi8KKwkJRVBfTElTVF9ERUwoJmVwaS0+dHhsaW5rKTsKKworCQkvKgorCQkgKiBJZiB0aGUgaXRlbSBpcyBubyBtb3JlIGxpbmtlZCB0byB0aGUgaW50ZXJlc3Qgc2V0LCB3ZSBkb24ndAorCQkgKiBoYXZlIHRvIHB1c2ggaXQgaW5zaWRlIHRoZSByZWFkeSBsaXN0IGJlY2F1c2UgdGhlIGZvbGxvd2luZworCQkgKiBlcF9yZWxlYXNlX2VwaXRlbSgpIGlzIGdvaW5nIHRvIGRyb3AgaXQuIEFsc28sIGlmIHRoZSBjdXJyZW50CisJCSAqIGl0ZW0gaXMgc2V0IHRvIGhhdmUgYW4gRWRnZSBUcmlnZ2VyZWQgYmVoYXZpb3VyLCB3ZSBkb24ndCBoYXZlCisJCSAqIHRvIHB1c2ggaXQgYmFjayBlaXRoZXIuCisJCSAqLworCQlpZiAoRVBfUkJfTElOS0VEKCZlcGktPnJibikgJiYgIShlcGktPmV2ZW50LmV2ZW50cyAmIEVQT0xMRVQpICYmCisJCSAgICAoZXBpLT5yZXZlbnRzICYgZXBpLT5ldmVudC5ldmVudHMpICYmICFFUF9JU19MSU5LRUQoJmVwaS0+cmRsbGluaykpIHsKKwkJCWxpc3RfYWRkX3RhaWwoJmVwaS0+cmRsbGluaywgJmVwLT5yZGxsaXN0KTsKKwkJCXJpY250Kys7CisJCX0KKwl9CisKKwlpZiAocmljbnQpIHsKKwkJLyoKKwkJICogV2FrZSB1cCAoIGlmIGFjdGl2ZSApIGJvdGggdGhlIGV2ZW50cG9sbCB3YWl0IGxpc3QgYW5kIHRoZSAtPnBvbGwoKQorCQkgKiB3YWl0IGxpc3QuCisJCSAqLworCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmZXAtPndxKSkKKwkJCXdha2VfdXAoJmVwLT53cSk7CisJCWlmICh3YWl0cXVldWVfYWN0aXZlKCZlcC0+cG9sbF93YWl0KSkKKwkJCXB3YWtlKys7CisJfQorCisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmVwLT5sb2NrLCBmbGFncyk7CisKKwkvKiBXZSBoYXZlIHRvIGNhbGwgdGhpcyBvdXRzaWRlIHRoZSBsb2NrICovCisJaWYgKHB3YWtlKQorCQllcF9wb2xsX3NhZmV3YWtlKCZwc3csICZlcC0+cG9sbF93YWl0KTsKK30KKworCisvKgorICogUGVyZm9ybSB0aGUgdHJhbnNmZXIgb2YgZXZlbnRzIHRvIHVzZXIgc3BhY2UuCisgKi8KK3N0YXRpYyBpbnQgZXBfZXZlbnRzX3RyYW5zZmVyKHN0cnVjdCBldmVudHBvbGwgKmVwLAorCQkJICAgICAgc3RydWN0IGVwb2xsX2V2ZW50IF9fdXNlciAqZXZlbnRzLCBpbnQgbWF4ZXZlbnRzKQoreworCWludCBldmVudGNudCA9IDA7CisJc3RydWN0IGxpc3RfaGVhZCB0eGxpc3Q7CisKKwlJTklUX0xJU1RfSEVBRCgmdHhsaXN0KTsKKworCS8qCisJICogV2UgbmVlZCB0byBsb2NrIHRoaXMgYmVjYXVzZSB3ZSBjb3VsZCBiZSBoaXQgYnkKKwkgKiBldmVudHBvbGxfcmVsZWFzZV9maWxlKCkgYW5kIGVwb2xsX2N0bChFUE9MTF9DVExfREVMKS4KKwkgKi8KKwlkb3duX3JlYWQoJmVwLT5zZW0pOworCisJLyogQ29sbGVjdC9leHRyYWN0IHJlYWR5IGl0ZW1zICovCisJaWYgKGVwX2NvbGxlY3RfcmVhZHlfaXRlbXMoZXAsICZ0eGxpc3QsIG1heGV2ZW50cykgPiAwKSB7CisJCS8qIEJ1aWxkIHJlc3VsdCBzZXQgaW4gdXNlcnNwYWNlICovCisJCWV2ZW50Y250ID0gZXBfc2VuZF9ldmVudHMoZXAsICZ0eGxpc3QsIGV2ZW50cyk7CisKKwkJLyogUmVpbmplY3QgcmVhZHkgaXRlbXMgaW50byB0aGUgcmVhZHkgbGlzdCAqLworCQllcF9yZWluamVjdF9pdGVtcyhlcCwgJnR4bGlzdCk7CisJfQorCisJdXBfcmVhZCgmZXAtPnNlbSk7CisKKwlyZXR1cm4gZXZlbnRjbnQ7Cit9CisKKworc3RhdGljIGludCBlcF9wb2xsKHN0cnVjdCBldmVudHBvbGwgKmVwLCBzdHJ1Y3QgZXBvbGxfZXZlbnQgX191c2VyICpldmVudHMsCisJCSAgIGludCBtYXhldmVudHMsIGxvbmcgdGltZW91dCkKK3sKKwlpbnQgcmVzLCBlYXZhaWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlsb25nIGp0aW1lb3V0OworCXdhaXRfcXVldWVfdCB3YWl0OworCisJLyoKKwkgKiBDYWxjdWxhdGUgdGhlIHRpbWVvdXQgYnkgY2hlY2tpbmcgZm9yIHRoZSAiaW5maW5pdGUiIHZhbHVlICggLTEgKQorCSAqIGFuZCB0aGUgb3ZlcmZsb3cgY29uZGl0aW9uLiBUaGUgcGFzc2VkIHRpbWVvdXQgaXMgaW4gbWlsbGlzZWNvbmRzLAorCSAqIHRoYXQgd2h5ICh0ICogSFopIC8gMTAwMC4KKwkgKi8KKwlqdGltZW91dCA9IHRpbWVvdXQgPT0gLTEgfHwgdGltZW91dCA+IChNQVhfU0NIRURVTEVfVElNRU9VVCAtIDEwMDApIC8gSFogPworCQlNQVhfU0NIRURVTEVfVElNRU9VVDogKHRpbWVvdXQgKiBIWiArIDk5OSkgLyAxMDAwOworCityZXRyeToKKwl3cml0ZV9sb2NrX2lycXNhdmUoJmVwLT5sb2NrLCBmbGFncyk7CisKKwlyZXMgPSAwOworCWlmIChsaXN0X2VtcHR5KCZlcC0+cmRsbGlzdCkpIHsKKwkJLyoKKwkJICogV2UgZG9uJ3QgaGF2ZSBhbnkgYXZhaWxhYmxlIGV2ZW50IHRvIHJldHVybiB0byB0aGUgY2FsbGVyLgorCQkgKiBXZSBuZWVkIHRvIHNsZWVwIGhlcmUsIGFuZCB3ZSB3aWxsIGJlIHdha2UgdXAgYnkKKwkJICogZXBfcG9sbF9jYWxsYmFjaygpIHdoZW4gZXZlbnRzIHdpbGwgYmVjb21lIGF2YWlsYWJsZS4KKwkJICovCisJCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKKwkJYWRkX3dhaXRfcXVldWUoJmVwLT53cSwgJndhaXQpOworCisJCWZvciAoOzspIHsKKwkJCS8qCisJCQkgKiBXZSBkb24ndCB3YW50IHRvIHNsZWVwIGlmIHRoZSBlcF9wb2xsX2NhbGxiYWNrKCkgc2VuZHMgdXMKKwkJCSAqIGEgd2FrZXVwIGluIGJldHdlZW4uIFRoYXQncyB3aHkgd2Ugc2V0IHRoZSB0YXNrIHN0YXRlCisJCQkgKiB0byBUQVNLX0lOVEVSUlVQVElCTEUgYmVmb3JlIGRvaW5nIHRoZSBjaGVja3MuCisJCQkgKi8KKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlpZiAoIWxpc3RfZW1wdHkoJmVwLT5yZGxsaXN0KSB8fCAhanRpbWVvdXQpCisJCQkJYnJlYWs7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlyZXMgPSAtRUlOVFI7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZlcC0+bG9jaywgZmxhZ3MpOworCQkJanRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KGp0aW1lb3V0KTsKKwkJCXdyaXRlX2xvY2tfaXJxc2F2ZSgmZXAtPmxvY2ssIGZsYWdzKTsKKwkJfQorCQlyZW1vdmVfd2FpdF9xdWV1ZSgmZXAtPndxLCAmd2FpdCk7CisKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwl9CisKKwkvKiBJcyBpdCB3b3J0aCB0byB0cnkgdG8gZGlnIGZvciBldmVudHMgPyAqLworCWVhdmFpbCA9ICFsaXN0X2VtcHR5KCZlcC0+cmRsbGlzdCk7CisKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmZXAtPmxvY2ssIGZsYWdzKTsKKworCS8qCisJICogVHJ5IHRvIHRyYW5zZmVyIGV2ZW50cyB0byB1c2VyIHNwYWNlLiBJbiBjYXNlIHdlIGdldCAwIGV2ZW50cyBhbmQKKwkgKiB0aGVyZSdzIHN0aWxsIHRpbWVvdXQgbGVmdCBvdmVyLCB3ZSBnbyB0cnlpbmcgYWdhaW4gaW4gc2VhcmNoIG9mCisJICogbW9yZSBsdWNrLgorCSAqLworCWlmICghcmVzICYmIGVhdmFpbCAmJgorCSAgICAhKHJlcyA9IGVwX2V2ZW50c190cmFuc2ZlcihlcCwgZXZlbnRzLCBtYXhldmVudHMpKSAmJiBqdGltZW91dCkKKwkJZ290byByZXRyeTsKKworCXJldHVybiByZXM7Cit9CisKKworc3RhdGljIGludCBldmVudHBvbGxmc19kZWxldGVfZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKworCXJldHVybiAxOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmVwX2V2ZW50cG9sbF9pbm9kZSh2b2lkKQoreworCWludCBlcnJvciA9IC1FTk9NRU07CisJc3RydWN0IGlub2RlICppbm9kZSA9IG5ld19pbm9kZShldmVudHBvbGxfbW50LT5tbnRfc2IpOworCisJaWYgKCFpbm9kZSkKKwkJZ290byBlZXhpdF8xOworCisJaW5vZGUtPmlfZm9wID0gJmV2ZW50cG9sbF9mb3BzOworCisJLyoKKwkgKiBNYXJrIHRoZSBpbm9kZSBkaXJ0eSBmcm9tIHRoZSB2ZXJ5IGJlZ2lubmluZywKKwkgKiB0aGF0IHdheSBpdCB3aWxsIG5ldmVyIGJlIG1vdmVkIHRvIHRoZSBkaXJ0eQorCSAqIGxpc3QgYmVjYXVzZSBtYXJrX2lub2RlX2RpcnR5KCkgd2lsbCB0aGluaworCSAqIHRoYXQgaXQgYWxyZWFkeSBfaXNfIG9uIHRoZSBkaXJ0eSBsaXN0LgorCSAqLworCWlub2RlLT5pX3N0YXRlID0gSV9ESVJUWTsKKwlpbm9kZS0+aV9tb2RlID0gU19JUlVTUiB8IFNfSVdVU1I7CisJaW5vZGUtPmlfdWlkID0gY3VycmVudC0+ZnN1aWQ7CisJaW5vZGUtPmlfZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCWlub2RlLT5pX2Jsa3NpemUgPSBQQUdFX1NJWkU7CisJcmV0dXJuIGlub2RlOworCitlZXhpdF8xOgorCXJldHVybiBFUlJfUFRSKGVycm9yKTsKK30KKworCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICoKK2V2ZW50cG9sbGZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwgaW50IGZsYWdzLAorCQkgICBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZ2V0X3NiX3BzZXVkbyhmc190eXBlLCAiZXZlbnRwb2xsOiIsIE5VTEwsIEVWRU5UUE9MTEZTX01BR0lDKTsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCBldmVudHBvbGxfaW5pdCh2b2lkKQoreworCWludCBlcnJvcjsKKworCWluaXRfTVVURVgoJmVwc2VtKTsKKworCS8qIEluaXRpYWxpemUgdGhlIHN0cnVjdHVyZSB1c2VkIHRvIHBlcmZvcm0gc2FmZSBwb2xsIHdhaXQgaGVhZCB3YWtlIHVwcyAqLworCWVwX3BvbGxfc2FmZXdha2VfaW5pdCgmcHN3KTsKKworCS8qIEFsbG9jYXRlcyBzbGFiIGNhY2hlIHVzZWQgdG8gYWxsb2NhdGUgInN0cnVjdCBlcGl0ZW0iIGl0ZW1zICovCisJZXBpX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImV2ZW50cG9sbF9lcGkiLCBzaXplb2Yoc3RydWN0IGVwaXRlbSksCisJCQkwLCBTTEFCX0hXQ0FDSEVfQUxJR058RVBJX1NMQUJfREVCVUd8U0xBQl9QQU5JQywKKwkJCU5VTEwsIE5VTEwpOworCisJLyogQWxsb2NhdGVzIHNsYWIgY2FjaGUgdXNlZCB0byBhbGxvY2F0ZSAic3RydWN0IGVwcG9sbF9lbnRyeSIgKi8KKwlwd3FfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiZXZlbnRwb2xsX3B3cSIsCisJCQlzaXplb2Yoc3RydWN0IGVwcG9sbF9lbnRyeSksIDAsCisJCQlFUElfU0xBQl9ERUJVR3xTTEFCX1BBTklDLCBOVUxMLCBOVUxMKTsKKworCS8qCisJICogUmVnaXN0ZXIgdGhlIHZpcnR1YWwgZmlsZSBzeXN0ZW0gdGhhdCB3aWxsIGJlIHRoZSBzb3VyY2Ugb2YgaW5vZGVzCisJICogZm9yIHRoZSBldmVudHBvbGwgZmlsZXMKKwkgKi8KKwllcnJvciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmV2ZW50cG9sbF9mc190eXBlKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXBhbmljOworCisJLyogTW91bnQgdGhlIGFib3ZlIGNvbW1lbnRlZCB2aXJ0dWFsIGZpbGUgc3lzdGVtICovCisJZXZlbnRwb2xsX21udCA9IGtlcm5fbW91bnQoJmV2ZW50cG9sbF9mc190eXBlKTsKKwllcnJvciA9IFBUUl9FUlIoZXZlbnRwb2xsX21udCk7CisJaWYgKElTX0VSUihldmVudHBvbGxfbW50KSkKKwkJZ290byBlcGFuaWM7CisKKwlETlBSSU5USygzLCAoS0VSTl9JTkZPICJbJXBdIGV2ZW50cG9sbDogc3VjY2Vzc2Z1bGx5IGluaXRpYWxpemVkLlxuIiwKKwkJCWN1cnJlbnQpKTsKKwlyZXR1cm4gMDsKKworZXBhbmljOgorCXBhbmljKCJldmVudHBvbGxfaW5pdCgpIGZhaWxlZFxuIik7Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IGV2ZW50cG9sbF9leGl0KHZvaWQpCit7CisJLyogVW5kbyBhbGwgb3BlcmF0aW9ucyBkb25lIGluc2lkZSBldmVudHBvbGxfaW5pdCgpICovCisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZldmVudHBvbGxfZnNfdHlwZSk7CisJbW50cHV0KGV2ZW50cG9sbF9tbnQpOworCWttZW1fY2FjaGVfZGVzdHJveShwd3FfY2FjaGUpOworCWttZW1fY2FjaGVfZGVzdHJveShlcGlfY2FjaGUpOworfQorCittb2R1bGVfaW5pdChldmVudHBvbGxfaW5pdCk7Cittb2R1bGVfZXhpdChldmVudHBvbGxfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL2V4ZWMuYyBiL2ZzL2V4ZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODM5NDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZXhlYy5jCkBAIC0wLDAgKzEsMTQ5OCBAQAorLyoKKyAqICBsaW51eC9mcy9leGVjLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICovCisKKy8qCisgKiAjIS1jaGVja2luZyBpbXBsZW1lbnRlZCBieSB0eXRzby4KKyAqLworLyoKKyAqIERlbWFuZC1sb2FkaW5nIGltcGxlbWVudGVkIDAxLjEyLjkxIC0gbm8gbmVlZCB0byByZWFkIGFueXRoaW5nIGJ1dAorICogdGhlIGhlYWRlciBpbnRvIG1lbW9yeS4gVGhlIGlub2RlIG9mIHRoZSBleGVjdXRhYmxlIGlzIHB1dCBpbnRvCisgKiAiY3VycmVudC0+ZXhlY3V0YWJsZSIsIGFuZCBwYWdlIGZhdWx0cyBkbyB0aGUgYWN0dWFsIGxvYWRpbmcuIENsZWFuLgorICoKKyAqIE9uY2UgbW9yZSBJIGNhbiBwcm91ZGx5IHNheSB0aGF0IGxpbnV4IHN0b29kIHVwIHRvIGJlaW5nIGNoYW5nZWQ6IGl0CisgKiB3YXMgbGVzcyB0aGFuIDIgaG91cnMgd29yayB0byBnZXQgZGVtYW5kLWxvYWRpbmcgY29tcGxldGVseSBpbXBsZW1lbnRlZC4KKyAqCisgKiBEZW1hbmQgbG9hZGluZyBjaGFuZ2VkIEp1bHkgMTk5MyBieSBFcmljIFlvdW5nZGFsZS4gICBVc2UgbW1hcCBpbnN0ZWFkLAorICogY3VycmVudC0+ZXhlY3V0YWJsZSBpcyBvbmx5IHVzZWQgYnkgdGhlIHByb2Nmcy4gIFRoaXMgYWxsb3dzIGEgZGlzcGF0Y2gKKyAqIHRhYmxlIHRvIGNoZWNrIGZvciBzZXZlcmFsIGRpZmZlcmVudCB0eXBlcyAgb2YgYmluYXJ5IGZvcm1hdHMuICBXZSBrZWVwCisgKiB0cnlpbmcgdW50aWwgd2UgcmVjb2duaXplIHRoZSBmaWxlIG9yIHdlIHJ1biBvdXQgb2Ygc3VwcG9ydGVkIGJpbmFyeQorICogZm9ybWF0cy4gCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW1hbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Eub3V0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2tleS5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcnNvbmFsaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvYmluZm10cy5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KKyNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvcm1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjY3QuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CisKKyNpZmRlZiBDT05GSUdfS01PRAorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNlbmRpZgorCitpbnQgY29yZV91c2VzX3BpZDsKK2NoYXIgY29yZV9wYXR0ZXJuWzY1XSA9ICJjb3JlIjsKKy8qIFRoZSBtYXhpbWFsIGxlbmd0aCBvZiBjb3JlX3BhdHRlcm4gaXMgYWxzbyBzcGVjaWZpZWQgaW4gc3lzY3RsLmMgKi8KKworc3RhdGljIHN0cnVjdCBsaW51eF9iaW5mbXQgKmZvcm1hdHM7CitzdGF0aWMgREVGSU5FX1JXTE9DSyhiaW5mbXRfbG9jayk7CisKK2ludCByZWdpc3Rlcl9iaW5mbXQoc3RydWN0IGxpbnV4X2JpbmZtdCAqIGZtdCkKK3sKKwlzdHJ1Y3QgbGludXhfYmluZm10ICoqIHRtcCA9ICZmb3JtYXRzOworCisJaWYgKCFmbXQpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChmbXQtPm5leHQpCisJCXJldHVybiAtRUJVU1k7CisJd3JpdGVfbG9jaygmYmluZm10X2xvY2spOworCXdoaWxlICgqdG1wKSB7CisJCWlmIChmbXQgPT0gKnRtcCkgeworCQkJd3JpdGVfdW5sb2NrKCZiaW5mbXRfbG9jayk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCXRtcCA9ICYoKnRtcCktPm5leHQ7CisJfQorCWZtdC0+bmV4dCA9IGZvcm1hdHM7CisJZm9ybWF0cyA9IGZtdDsKKwl3cml0ZV91bmxvY2soJmJpbmZtdF9sb2NrKTsKKwlyZXR1cm4gMDsJCit9CisKK0VYUE9SVF9TWU1CT0wocmVnaXN0ZXJfYmluZm10KTsKKworaW50IHVucmVnaXN0ZXJfYmluZm10KHN0cnVjdCBsaW51eF9iaW5mbXQgKiBmbXQpCit7CisJc3RydWN0IGxpbnV4X2JpbmZtdCAqKiB0bXAgPSAmZm9ybWF0czsKKworCXdyaXRlX2xvY2soJmJpbmZtdF9sb2NrKTsKKwl3aGlsZSAoKnRtcCkgeworCQlpZiAoZm10ID09ICp0bXApIHsKKwkJCSp0bXAgPSBmbXQtPm5leHQ7CisJCQl3cml0ZV91bmxvY2soJmJpbmZtdF9sb2NrKTsKKwkJCXJldHVybiAwOworCQl9CisJCXRtcCA9ICYoKnRtcCktPm5leHQ7CisJfQorCXdyaXRlX3VubG9jaygmYmluZm10X2xvY2spOworCXJldHVybiAtRUlOVkFMOworfQorCitFWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfYmluZm10KTsKKworc3RhdGljIGlubGluZSB2b2lkIHB1dF9iaW5mbXQoc3RydWN0IGxpbnV4X2JpbmZtdCAqIGZtdCkKK3sKKwltb2R1bGVfcHV0KGZtdC0+bW9kdWxlKTsKK30KKworLyoKKyAqIE5vdGUgdGhhdCBhIHNoYXJlZCBsaWJyYXJ5IG11c3QgYmUgYm90aCByZWFkYWJsZSBhbmQgZXhlY3V0YWJsZSBkdWUgdG8KKyAqIHNlY3VyaXR5IHJlYXNvbnMuCisgKgorICogQWxzbyBub3RlIHRoYXQgd2UgdGFrZSB0aGUgYWRkcmVzcyB0byBsb2FkIGZyb20gZnJvbSB0aGUgZmlsZSBpdHNlbGYuCisgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfdXNlbGliKGNvbnN0IGNoYXIgX191c2VyICogbGlicmFyeSkKK3sKKwlzdHJ1Y3QgZmlsZSAqIGZpbGU7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlpbnQgZXJyb3I7CisKKwluZC5pbnRlbnQub3Blbi5mbGFncyA9IEZNT0RFX1JFQUQ7CisJZXJyb3IgPSBfX3VzZXJfd2FsayhsaWJyYXJ5LCBMT09LVVBfRk9MTE9XfExPT0tVUF9PUEVOLCAmbmQpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKCFTX0lTUkVHKG5kLmRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSkKKwkJZ290byBleGl0OworCisJZXJyb3IgPSBwZXJtaXNzaW9uKG5kLmRlbnRyeS0+ZF9pbm9kZSwgTUFZX1JFQUQgfCBNQVlfRVhFQywgJm5kKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXhpdDsKKworCWZpbGUgPSBkZW50cnlfb3BlbihuZC5kZW50cnksIG5kLm1udCwgT19SRE9OTFkpOworCWVycm9yID0gUFRSX0VSUihmaWxlKTsKKwlpZiAoSVNfRVJSKGZpbGUpKQorCQlnb3RvIG91dDsKKworCWVycm9yID0gLUVOT0VYRUM7CisJaWYoZmlsZS0+Zl9vcCkgeworCQlzdHJ1Y3QgbGludXhfYmluZm10ICogZm10OworCisJCXJlYWRfbG9jaygmYmluZm10X2xvY2spOworCQlmb3IgKGZtdCA9IGZvcm1hdHMgOyBmbXQgOyBmbXQgPSBmbXQtPm5leHQpIHsKKwkJCWlmICghZm10LT5sb2FkX3NobGliKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCF0cnlfbW9kdWxlX2dldChmbXQtPm1vZHVsZSkpCisJCQkJY29udGludWU7CisJCQlyZWFkX3VubG9jaygmYmluZm10X2xvY2spOworCQkJZXJyb3IgPSBmbXQtPmxvYWRfc2hsaWIoZmlsZSk7CisJCQlyZWFkX2xvY2soJmJpbmZtdF9sb2NrKTsKKwkJCXB1dF9iaW5mbXQoZm10KTsKKwkJCWlmIChlcnJvciAhPSAtRU5PRVhFQykKKwkJCQlicmVhazsKKwkJfQorCQlyZWFkX3VubG9jaygmYmluZm10X2xvY2spOworCX0KKwlmcHV0KGZpbGUpOworb3V0OgorICAJcmV0dXJuIGVycm9yOworZXhpdDoKKwlwYXRoX3JlbGVhc2UoJm5kKTsKKwlnb3RvIG91dDsKK30KKworLyoKKyAqIGNvdW50KCkgY291bnRzIHRoZSBudW1iZXIgb2Ygc3RyaW5ncyBpbiBhcnJheSBBUkdWLgorICovCitzdGF0aWMgaW50IGNvdW50KGNoYXIgX191c2VyICogX191c2VyICogYXJndiwgaW50IG1heCkKK3sKKwlpbnQgaSA9IDA7CisKKwlpZiAoYXJndiAhPSBOVUxMKSB7CisJCWZvciAoOzspIHsKKwkJCWNoYXIgX191c2VyICogcDsKKworCQkJaWYgKGdldF91c2VyKHAsIGFyZ3YpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKCFwKQorCQkJCWJyZWFrOworCQkJYXJndisrOworCQkJaWYoKytpID4gbWF4KQorCQkJCXJldHVybiAtRTJCSUc7CisJCQljb25kX3Jlc2NoZWQoKTsKKwkJfQorCX0KKwlyZXR1cm4gaTsKK30KKworLyoKKyAqICdjb3B5X3N0cmluZ3MoKScgY29waWVzIGFyZ3VtZW50L2Vudmlyb25tZW50IHN0cmluZ3MgZnJvbSB1c2VyCisgKiBtZW1vcnkgdG8gZnJlZSBwYWdlcyBpbiBrZXJuZWwgbWVtLiBUaGVzZSBhcmUgaW4gYSBmb3JtYXQgcmVhZHkKKyAqIHRvIGJlIHB1dCBkaXJlY3RseSBpbnRvIHRoZSB0b3Agb2YgbmV3IHVzZXIgbWVtb3J5LgorICovCitpbnQgY29weV9zdHJpbmdzKGludCBhcmdjLGNoYXIgX191c2VyICogX191c2VyICogYXJndiwgc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSkKK3sKKwlzdHJ1Y3QgcGFnZSAqa21hcHBlZF9wYWdlID0gTlVMTDsKKwljaGFyICprYWRkciA9IE5VTEw7CisJaW50IHJldDsKKworCXdoaWxlIChhcmdjLS0gPiAwKSB7CisJCWNoYXIgX191c2VyICpzdHI7CisJCWludCBsZW47CisJCXVuc2lnbmVkIGxvbmcgcG9zOworCisJCWlmIChnZXRfdXNlcihzdHIsIGFyZ3YrYXJnYykgfHwKKwkJCQkhKGxlbiA9IHN0cm5sZW5fdXNlcihzdHIsIGJwcm0tPnApKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKGJwcm0tPnAgPCBsZW4pICB7CisJCQlyZXQgPSAtRTJCSUc7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWJwcm0tPnAgLT0gbGVuOworCQkvKiBYWFg6IGFkZCBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgb3ZlcmZsb3cgY2hlY2sgaGVyZS4gKi8KKwkJcG9zID0gYnBybS0+cDsKKworCQl3aGlsZSAobGVuID4gMCkgeworCQkJaW50IGksIG5ldywgZXJyOworCQkJaW50IG9mZnNldCwgYnl0ZXNfdG9fY29weTsKKwkJCXN0cnVjdCBwYWdlICpwYWdlOworCisJCQlvZmZzZXQgPSBwb3MgJSBQQUdFX1NJWkU7CisJCQlpID0gcG9zL1BBR0VfU0laRTsKKwkJCXBhZ2UgPSBicHJtLT5wYWdlW2ldOworCQkJbmV3ID0gMDsKKwkJCWlmICghcGFnZSkgeworCQkJCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9ISUdIVVNFUik7CisJCQkJYnBybS0+cGFnZVtpXSA9IHBhZ2U7CisJCQkJaWYgKCFwYWdlKSB7CisJCQkJCXJldCA9IC1FTk9NRU07CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQluZXcgPSAxOworCQkJfQorCisJCQlpZiAocGFnZSAhPSBrbWFwcGVkX3BhZ2UpIHsKKwkJCQlpZiAoa21hcHBlZF9wYWdlKQorCQkJCQlrdW5tYXAoa21hcHBlZF9wYWdlKTsKKwkJCQlrbWFwcGVkX3BhZ2UgPSBwYWdlOworCQkJCWthZGRyID0ga21hcChrbWFwcGVkX3BhZ2UpOworCQkJfQorCQkJaWYgKG5ldyAmJiBvZmZzZXQpCisJCQkJbWVtc2V0KGthZGRyLCAwLCBvZmZzZXQpOworCQkJYnl0ZXNfdG9fY29weSA9IFBBR0VfU0laRSAtIG9mZnNldDsKKwkJCWlmIChieXRlc190b19jb3B5ID4gbGVuKSB7CisJCQkJYnl0ZXNfdG9fY29weSA9IGxlbjsKKwkJCQlpZiAobmV3KQorCQkJCQltZW1zZXQoa2FkZHIrb2Zmc2V0K2xlbiwgMCwKKwkJCQkJCVBBR0VfU0laRS1vZmZzZXQtbGVuKTsKKwkJCX0KKwkJCWVyciA9IGNvcHlfZnJvbV91c2VyKGthZGRyK29mZnNldCwgc3RyLCBieXRlc190b19jb3B5KTsKKwkJCWlmIChlcnIpIHsKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlwb3MgKz0gYnl0ZXNfdG9fY29weTsKKwkJCXN0ciArPSBieXRlc190b19jb3B5OworCQkJbGVuIC09IGJ5dGVzX3RvX2NvcHk7CisJCX0KKwl9CisJcmV0ID0gMDsKK291dDoKKwlpZiAoa21hcHBlZF9wYWdlKQorCQlrdW5tYXAoa21hcHBlZF9wYWdlKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogTGlrZSBjb3B5X3N0cmluZ3MsIGJ1dCBnZXQgYXJndiBhbmQgaXRzIHZhbHVlcyBmcm9tIGtlcm5lbCBtZW1vcnkuCisgKi8KK2ludCBjb3B5X3N0cmluZ3Nfa2VybmVsKGludCBhcmdjLGNoYXIgKiogYXJndiwgc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSkKK3sKKwlpbnQgcjsKKwltbV9zZWdtZW50X3Qgb2xkZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKwlyID0gY29weV9zdHJpbmdzKGFyZ2MsIChjaGFyIF9fdXNlciAqIF9fdXNlciAqKWFyZ3YsIGJwcm0pOworCXNldF9mcyhvbGRmcyk7CisJcmV0dXJuIHI7Cit9CisKK0VYUE9SVF9TWU1CT0woY29weV9zdHJpbmdzX2tlcm5lbCk7CisKKyNpZmRlZiBDT05GSUdfTU1VCisvKgorICogVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gbWFwIGluIGEgcGFnZSBpbnRvIGFuIGFkZHJlc3Mgc3BhY2U6IG5lZWRlZCBieQorICogZXhlY3ZlKCkgZm9yIHRoZSBpbml0aWFsIHN0YWNrIGFuZCBlbnZpcm9ubWVudCBwYWdlcy4KKyAqCisgKiB2bWEtPnZtX21tLT5tbWFwX3NlbSBpcyBoZWxkIGZvciB3cml0aW5nLgorICovCit2b2lkIGluc3RhbGxfYXJnX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQlzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLT52bV9tbTsKKwlwZ2RfdCAqIHBnZDsKKwlwdWRfdCAqIHB1ZDsKKwlwbWRfdCAqIHBtZDsKKwlwdGVfdCAqIHB0ZTsKKworCWlmICh1bmxpa2VseShhbm9uX3ZtYV9wcmVwYXJlKHZtYSkpKQorCQlnb3RvIG91dF9zaWc7CisKKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwlwZ2QgPSBwZ2Rfb2Zmc2V0KG1tLCBhZGRyZXNzKTsKKworCXNwaW5fbG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CisJcHVkID0gcHVkX2FsbG9jKG1tLCBwZ2QsIGFkZHJlc3MpOworCWlmICghcHVkKQorCQlnb3RvIG91dDsKKwlwbWQgPSBwbWRfYWxsb2MobW0sIHB1ZCwgYWRkcmVzcyk7CisJaWYgKCFwbWQpCisJCWdvdG8gb3V0OworCXB0ZSA9IHB0ZV9hbGxvY19tYXAobW0sIHBtZCwgYWRkcmVzcyk7CisJaWYgKCFwdGUpCisJCWdvdG8gb3V0OworCWlmICghcHRlX25vbmUoKnB0ZSkpIHsKKwkJcHRlX3VubWFwKHB0ZSk7CisJCWdvdG8gb3V0OworCX0KKwlpbmNfbW1fY291bnRlcihtbSwgcnNzKTsKKwlscnVfY2FjaGVfYWRkX2FjdGl2ZShwYWdlKTsKKwlzZXRfcHRlX2F0KG1tLCBhZGRyZXNzLCBwdGUsIHB0ZV9ta2RpcnR5KHB0ZV9ta3dyaXRlKG1rX3B0ZSgKKwkJCQkJcGFnZSwgdm1hLT52bV9wYWdlX3Byb3QpKSkpOworCXBhZ2VfYWRkX2Fub25fcm1hcChwYWdlLCB2bWEsIGFkZHJlc3MpOworCXB0ZV91bm1hcChwdGUpOworCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKKworCS8qIG5vIG5lZWQgZm9yIGZsdXNoX3RsYiAqLworCXJldHVybjsKK291dDoKKwlzcGluX3VubG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7CitvdXRfc2lnOgorCV9fZnJlZV9wYWdlKHBhZ2UpOworCWZvcmNlX3NpZyhTSUdLSUxMLCBjdXJyZW50KTsKK30KKworI2RlZmluZSBFWFRSQV9TVEFDS19WTV9QQUdFUwkyMAkvKiByYW5kb20gKi8KKworaW50IHNldHVwX2FyZ19wYWdlcyhzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtLAorCQkgICAgdW5zaWduZWQgbG9uZyBzdGFja190b3AsCisJCSAgICBpbnQgZXhlY3V0YWJsZV9zdGFjaykKK3sKKwl1bnNpZ25lZCBsb25nIHN0YWNrX2Jhc2U7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICptcG50OworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CisJaW50IGksIHJldDsKKwlsb25nIGFyZ19zaXplOworCisjaWZkZWYgQ09ORklHX1NUQUNLX0dST1dTVVAKKwkvKiBNb3ZlIHRoZSBhcmd1bWVudCBhbmQgZW52aXJvbm1lbnQgc3RyaW5ncyB0byB0aGUgYm90dG9tIG9mIHRoZQorCSAqIHN0YWNrIHNwYWNlLgorCSAqLworCWludCBvZmZzZXQsIGo7CisJY2hhciAqdG8sICpmcm9tOworCisJLyogU3RhcnQgYnkgc2hpZnRpbmcgYWxsIHRoZSBwYWdlcyBkb3duICovCisJaSA9IDA7CisJZm9yIChqID0gMDsgaiA8IE1BWF9BUkdfUEFHRVM7IGorKykgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGJwcm0tPnBhZ2Vbal07CisJCWlmICghcGFnZSkKKwkJCWNvbnRpbnVlOworCQlicHJtLT5wYWdlW2krK10gPSBwYWdlOworCX0KKworCS8qIE5vdyBtb3ZlIHRoZW0gd2l0aGluIHRoZWlyIHBhZ2VzICovCisJb2Zmc2V0ID0gYnBybS0+cCAlIFBBR0VfU0laRTsKKwl0byA9IGttYXAoYnBybS0+cGFnZVswXSk7CisJZm9yIChqID0gMTsgaiA8IGk7IGorKykgeworCQltZW1tb3ZlKHRvLCB0byArIG9mZnNldCwgUEFHRV9TSVpFIC0gb2Zmc2V0KTsKKwkJZnJvbSA9IGttYXAoYnBybS0+cGFnZVtqXSk7CisJCW1lbWNweSh0byArIFBBR0VfU0laRSAtIG9mZnNldCwgZnJvbSwgb2Zmc2V0KTsKKwkJa3VubWFwKGJwcm0tPnBhZ2VbaiAtIDFdKTsKKwkJdG8gPSBmcm9tOworCX0KKwltZW1tb3ZlKHRvLCB0byArIG9mZnNldCwgUEFHRV9TSVpFIC0gb2Zmc2V0KTsKKwlrdW5tYXAoYnBybS0+cGFnZVtqIC0gMV0pOworCisJLyogTGltaXQgc3RhY2sgc2l6ZSB0byAxR0IgKi8KKwlzdGFja19iYXNlID0gY3VycmVudC0+c2lnbmFsLT5ybGltW1JMSU1JVF9TVEFDS10ucmxpbV9tYXg7CisJaWYgKHN0YWNrX2Jhc2UgPiAoMSA8PCAzMCkpCisJCXN0YWNrX2Jhc2UgPSAxIDw8IDMwOworCXN0YWNrX2Jhc2UgPSBQQUdFX0FMSUdOKHN0YWNrX3RvcCAtIHN0YWNrX2Jhc2UpOworCisJLyogQWRqdXN0IGJwcm0tPnAgdG8gcG9pbnQgdG8gdGhlIGVuZCBvZiB0aGUgc3RyaW5ncy4gKi8KKwlicHJtLT5wID0gc3RhY2tfYmFzZSArIFBBR0VfU0laRSAqIGkgLSBvZmZzZXQ7CisKKwltbS0+YXJnX3N0YXJ0ID0gc3RhY2tfYmFzZTsKKwlhcmdfc2l6ZSA9IGkgPDwgUEFHRV9TSElGVDsKKworCS8qIHplcm8gcGFnZXMgdGhhdCB3ZXJlIGNvcGllZCBhYm92ZSAqLworCXdoaWxlIChpIDwgTUFYX0FSR19QQUdFUykKKwkJYnBybS0+cGFnZVtpKytdID0gTlVMTDsKKyNlbHNlCisJc3RhY2tfYmFzZSA9IGFyY2hfYWxpZ25fc3RhY2soc3RhY2tfdG9wIC0gTUFYX0FSR19QQUdFUypQQUdFX1NJWkUpOworCXN0YWNrX2Jhc2UgPSBQQUdFX0FMSUdOKHN0YWNrX2Jhc2UpOworCWJwcm0tPnAgKz0gc3RhY2tfYmFzZTsKKwltbS0+YXJnX3N0YXJ0ID0gYnBybS0+cDsKKwlhcmdfc2l6ZSA9IHN0YWNrX3RvcCAtIChQQUdFX01BU0sgJiAodW5zaWduZWQgbG9uZykgbW0tPmFyZ19zdGFydCk7CisjZW5kaWYKKworCWFyZ19zaXplICs9IEVYVFJBX1NUQUNLX1ZNX1BBR0VTICogUEFHRV9TSVpFOworCisJaWYgKGJwcm0tPmxvYWRlcikKKwkJYnBybS0+bG9hZGVyICs9IHN0YWNrX2Jhc2U7CisJYnBybS0+ZXhlYyArPSBzdGFja19iYXNlOworCisJbXBudCA9IGttZW1fY2FjaGVfYWxsb2Modm1fYXJlYV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwlpZiAoIW1wbnQpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKHNlY3VyaXR5X3ZtX2Vub3VnaF9tZW1vcnkoYXJnX3NpemUgPj4gUEFHRV9TSElGVCkpIHsKKwkJa21lbV9jYWNoZV9mcmVlKHZtX2FyZWFfY2FjaGVwLCBtcG50KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbWVtc2V0KG1wbnQsIDAsIHNpemVvZigqbXBudCkpOworCisJZG93bl93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKwl7CisJCW1wbnQtPnZtX21tID0gbW07CisjaWZkZWYgQ09ORklHX1NUQUNLX0dST1dTVVAKKwkJbXBudC0+dm1fc3RhcnQgPSBzdGFja19iYXNlOworCQltcG50LT52bV9lbmQgPSBzdGFja19iYXNlICsgYXJnX3NpemU7CisjZWxzZQorCQltcG50LT52bV9lbmQgPSBzdGFja190b3A7CisJCW1wbnQtPnZtX3N0YXJ0ID0gbXBudC0+dm1fZW5kIC0gYXJnX3NpemU7CisjZW5kaWYKKwkJLyogQWRqdXN0IHN0YWNrIGV4ZWN1dGUgcGVybWlzc2lvbnM7IGV4cGxpY2l0bHkgZW5hYmxlCisJCSAqIGZvciBFWFNUQUNLX0VOQUJMRV9YLCBkaXNhYmxlIGZvciBFWFNUQUNLX0RJU0FCTEVfWAorCQkgKiBhbmQgbGVhdmUgYWxvbmUgKGFyY2ggZGVmYXVsdCkgb3RoZXJ3aXNlLiAqLworCQlpZiAodW5saWtlbHkoZXhlY3V0YWJsZV9zdGFjayA9PSBFWFNUQUNLX0VOQUJMRV9YKSkKKwkJCW1wbnQtPnZtX2ZsYWdzID0gVk1fU1RBQ0tfRkxBR1MgfCAgVk1fRVhFQzsKKwkJZWxzZSBpZiAoZXhlY3V0YWJsZV9zdGFjayA9PSBFWFNUQUNLX0RJU0FCTEVfWCkKKwkJCW1wbnQtPnZtX2ZsYWdzID0gVk1fU1RBQ0tfRkxBR1MgJiB+Vk1fRVhFQzsKKwkJZWxzZQorCQkJbXBudC0+dm1fZmxhZ3MgPSBWTV9TVEFDS19GTEFHUzsKKwkJbXBudC0+dm1fZmxhZ3MgfD0gbW0tPmRlZl9mbGFnczsKKwkJbXBudC0+dm1fcGFnZV9wcm90ID0gcHJvdGVjdGlvbl9tYXBbbXBudC0+dm1fZmxhZ3MgJiAweDddOworCQlpZiAoKHJldCA9IGluc2VydF92bV9zdHJ1Y3QobW0sIG1wbnQpKSkgeworCQkJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisJCQlrbWVtX2NhY2hlX2ZyZWUodm1fYXJlYV9jYWNoZXAsIG1wbnQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQltbS0+c3RhY2tfdm0gPSBtbS0+dG90YWxfdm0gPSB2bWFfcGFnZXMobXBudCk7CisJfQorCisJZm9yIChpID0gMCA7IGkgPCBNQVhfQVJHX1BBR0VTIDsgaSsrKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gYnBybS0+cGFnZVtpXTsKKwkJaWYgKHBhZ2UpIHsKKwkJCWJwcm0tPnBhZ2VbaV0gPSBOVUxMOworCQkJaW5zdGFsbF9hcmdfcGFnZShtcG50LCBwYWdlLCBzdGFja19iYXNlKTsKKwkJfQorCQlzdGFja19iYXNlICs9IFBBR0VfU0laRTsKKwl9CisJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisJCisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woc2V0dXBfYXJnX3BhZ2VzKTsKKworI2RlZmluZSBmcmVlX2FyZ19wYWdlcyhicHJtKSBkbyB7IH0gd2hpbGUgKDApCisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX2FyZ19wYWdlcyhzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1BWF9BUkdfUEFHRVM7IGkrKykgeworCQlpZiAoYnBybS0+cGFnZVtpXSkKKwkJCV9fZnJlZV9wYWdlKGJwcm0tPnBhZ2VbaV0pOworCQlicHJtLT5wYWdlW2ldID0gTlVMTDsKKwl9Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfTU1VICovCisKK3N0cnVjdCBmaWxlICpvcGVuX2V4ZWMoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCWludCBlcnI7CisJc3RydWN0IGZpbGUgKmZpbGU7CisKKwluZC5pbnRlbnQub3Blbi5mbGFncyA9IEZNT0RFX1JFQUQ7CisJZXJyID0gcGF0aF9sb29rdXAobmFtZSwgTE9PS1VQX0ZPTExPV3xMT09LVVBfT1BFTiwgJm5kKTsKKwlmaWxlID0gRVJSX1BUUihlcnIpOworCisJaWYgKCFlcnIpIHsKKwkJc3RydWN0IGlub2RlICppbm9kZSA9IG5kLmRlbnRyeS0+ZF9pbm9kZTsKKwkJZmlsZSA9IEVSUl9QVFIoLUVBQ0NFUyk7CisJCWlmICghKG5kLm1udC0+bW50X2ZsYWdzICYgTU5UX05PRVhFQykgJiYKKwkJICAgIFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwkJCWludCBlcnIgPSBwZXJtaXNzaW9uKGlub2RlLCBNQVlfRVhFQywgJm5kKTsKKwkJCWlmICghZXJyICYmICEoaW5vZGUtPmlfbW9kZSAmIDAxMTEpKQorCQkJCWVyciA9IC1FQUNDRVM7CisJCQlmaWxlID0gRVJSX1BUUihlcnIpOworCQkJaWYgKCFlcnIpIHsKKwkJCQlmaWxlID0gZGVudHJ5X29wZW4obmQuZGVudHJ5LCBuZC5tbnQsIE9fUkRPTkxZKTsKKwkJCQlpZiAoIUlTX0VSUihmaWxlKSkgeworCQkJCQllcnIgPSBkZW55X3dyaXRlX2FjY2VzcyhmaWxlKTsKKwkJCQkJaWYgKGVycikgeworCQkJCQkJZnB1dChmaWxlKTsKKwkJCQkJCWZpbGUgPSBFUlJfUFRSKGVycik7CisJCQkJCX0KKwkJCQl9CitvdXQ6CisJCQkJcmV0dXJuIGZpbGU7CisJCQl9CisJCX0KKwkJcGF0aF9yZWxlYXNlKCZuZCk7CisJfQorCWdvdG8gb3V0OworfQorCitFWFBPUlRfU1lNQk9MKG9wZW5fZXhlYyk7CisKK2ludCBrZXJuZWxfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJY2hhciAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwltbV9zZWdtZW50X3Qgb2xkX2ZzOworCWxvZmZfdCBwb3MgPSBvZmZzZXQ7CisJaW50IHJlc3VsdDsKKworCW9sZF9mcyA9IGdldF9mcygpOworCXNldF9mcyhnZXRfZHMoKSk7CisJLyogVGhlIGNhc3QgdG8gYSB1c2VyIHBvaW50ZXIgaXMgdmFsaWQgZHVlIHRvIHRoZSBzZXRfZnMoKSAqLworCXJlc3VsdCA9IHZmc19yZWFkKGZpbGUsICh2b2lkIF9fdXNlciAqKWFkZHIsIGNvdW50LCAmcG9zKTsKKwlzZXRfZnMob2xkX2ZzKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitFWFBPUlRfU1lNQk9MKGtlcm5lbF9yZWFkKTsKKworc3RhdGljIGludCBleGVjX21tYXAoc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2s7CisJc3RydWN0IG1tX3N0cnVjdCAqIG9sZF9tbSwgKmFjdGl2ZV9tbTsKKworCS8qIE5vdGlmeSBwYXJlbnQgdGhhdCB3ZSdyZSBubyBsb25nZXIgaW50ZXJlc3RlZCBpbiB0aGUgb2xkIFZNICovCisJdHNrID0gY3VycmVudDsKKwlvbGRfbW0gPSBjdXJyZW50LT5tbTsKKwltbV9yZWxlYXNlKHRzaywgb2xkX21tKTsKKworCWlmIChvbGRfbW0pIHsKKwkJLyoKKwkJICogTWFrZSBzdXJlIHRoYXQgaWYgdGhlcmUgaXMgYSBjb3JlIGR1bXAgaW4gcHJvZ3Jlc3MKKwkJICogZm9yIHRoZSBvbGQgbW0sIHdlIGdldCBvdXQgYW5kIGRpZSBpbnN0ZWFkIG9mIGdvaW5nCisJCSAqIHRocm91Z2ggd2l0aCB0aGUgZXhlYy4gIFdlIG11c3QgaG9sZCBtbWFwX3NlbSBhcm91bmQKKwkJICogY2hlY2tpbmcgY29yZV93YWl0ZXJzIGFuZCBjaGFuZ2luZyB0c2stPm1tLiAgVGhlCisJCSAqIGNvcmUtaW5kdWNpbmcgdGhyZWFkIHdpbGwgaW5jcmVtZW50IGNvcmVfd2FpdGVycyBmb3IKKwkJICogZWFjaCB0aHJlYWQgd2hvc2UgLT5tbSA9PSBvbGRfbW0uCisJCSAqLworCQlkb3duX3JlYWQoJm9sZF9tbS0+bW1hcF9zZW0pOworCQlpZiAodW5saWtlbHkob2xkX21tLT5jb3JlX3dhaXRlcnMpKSB7CisJCQl1cF9yZWFkKCZvbGRfbW0tPm1tYXBfc2VtKTsKKwkJCXJldHVybiAtRUlOVFI7CisJCX0KKwl9CisJdGFza19sb2NrKHRzayk7CisJYWN0aXZlX21tID0gdHNrLT5hY3RpdmVfbW07CisJdHNrLT5tbSA9IG1tOworCXRzay0+YWN0aXZlX21tID0gbW07CisJYWN0aXZhdGVfbW0oYWN0aXZlX21tLCBtbSk7CisJdGFza191bmxvY2sodHNrKTsKKwlhcmNoX3BpY2tfbW1hcF9sYXlvdXQobW0pOworCWlmIChvbGRfbW0pIHsKKwkJdXBfcmVhZCgmb2xkX21tLT5tbWFwX3NlbSk7CisJCWlmIChhY3RpdmVfbW0gIT0gb2xkX21tKSBCVUcoKTsKKwkJbW1wdXQob2xkX21tKTsKKwkJcmV0dXJuIDA7CisJfQorCW1tZHJvcChhY3RpdmVfbW0pOworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBtYWtlcyBzdXJlIHRoZSBjdXJyZW50IHByb2Nlc3MgaGFzIGl0cyBvd24gc2lnbmFsIHRhYmxlLAorICogc28gdGhhdCBmbHVzaF9zaWduYWxfaGFuZGxlcnMgY2FuIGxhdGVyIHJlc2V0IHRoZSBoYW5kbGVycyB3aXRob3V0CisgKiBkaXN0dXJiaW5nIG90aGVyIHByb2Nlc3Nlcy4gIChPdGhlciBwcm9jZXNzZXMgbWlnaHQgc2hhcmUgdGhlIHNpZ25hbAorICogdGFibGUgdmlhIHRoZSBDTE9ORV9TSUdIQU5EIG9wdGlvbiB0byBjbG9uZSgpLikKKyAqLworc3RhdGljIGlubGluZSBpbnQgZGVfdGhyZWFkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworCXN0cnVjdCBzaWduYWxfc3RydWN0ICpzaWcgPSB0c2stPnNpZ25hbDsKKwlzdHJ1Y3Qgc2lnaGFuZF9zdHJ1Y3QgKm5ld3NpZ2hhbmQsICpvbGRzaWdoYW5kID0gdHNrLT5zaWdoYW5kOworCXNwaW5sb2NrX3QgKmxvY2sgPSAmb2xkc2lnaGFuZC0+c2lnbG9jazsKKwlpbnQgY291bnQ7CisKKwkvKgorCSAqIElmIHdlIGRvbid0IHNoYXJlIHNpZ2hhbmRsZXJzLCB0aGVuIHdlIGFyZW4ndCBzaGFyaW5nIGFueXRoaW5nCisJICogYW5kIHdlIGNhbiBqdXN0IHJlLXVzZSBpdCBhbGwuCisJICovCisJaWYgKGF0b21pY19yZWFkKCZvbGRzaWdoYW5kLT5jb3VudCkgPD0gMSkgeworCQlCVUdfT04oYXRvbWljX3JlYWQoJnNpZy0+Y291bnQpICE9IDEpOworCQlleGl0X2l0aW1lcnMoc2lnKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbmV3c2lnaGFuZCA9IGttZW1fY2FjaGVfYWxsb2Moc2lnaGFuZF9jYWNoZXAsIEdGUF9LRVJORUwpOworCWlmICghbmV3c2lnaGFuZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAodGhyZWFkX2dyb3VwX2VtcHR5KGN1cnJlbnQpKQorCQlnb3RvIG5vX3RocmVhZF9ncm91cDsKKworCS8qCisJICogS2lsbCBhbGwgb3RoZXIgdGhyZWFkcyBpbiB0aGUgdGhyZWFkIGdyb3VwLgorCSAqIFdlIG11c3QgaG9sZCB0YXNrbGlzdF9sb2NrIHRvIGNhbGwgemFwX290aGVyX3RocmVhZHMuCisJICovCisJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlzcGluX2xvY2tfaXJxKGxvY2spOworCWlmIChzaWctPmZsYWdzICYgU0lHTkFMX0dST1VQX0VYSVQpIHsKKwkJLyoKKwkJICogQW5vdGhlciBncm91cCBhY3Rpb24gaW4gcHJvZ3Jlc3MsIGp1c3QKKwkJICogcmV0dXJuIHNvIHRoYXQgdGhlIHNpZ25hbCBpcyBwcm9jZXNzZWQuCisJCSAqLworCQlzcGluX3VubG9ja19pcnEobG9jayk7CisJCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwkJa21lbV9jYWNoZV9mcmVlKHNpZ2hhbmRfY2FjaGVwLCBuZXdzaWdoYW5kKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCXphcF9vdGhlcl90aHJlYWRzKGN1cnJlbnQpOworCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKworCS8qCisJICogQWNjb3VudCBmb3IgdGhlIHRocmVhZCBncm91cCBsZWFkZXIgaGFuZ2luZyBhcm91bmQ6CisJICovCisJY291bnQgPSAyOworCWlmICh0aHJlYWRfZ3JvdXBfbGVhZGVyKGN1cnJlbnQpKQorCQljb3VudCA9IDE7CisJd2hpbGUgKGF0b21pY19yZWFkKCZzaWctPmNvdW50KSA+IGNvdW50KSB7CisJCXNpZy0+Z3JvdXBfZXhpdF90YXNrID0gY3VycmVudDsKKwkJc2lnLT5ub3RpZnlfY291bnQgPSBjb3VudDsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fdW5sb2NrX2lycShsb2NrKTsKKwkJc2NoZWR1bGUoKTsKKwkJc3Bpbl9sb2NrX2lycShsb2NrKTsKKwl9CisJc2lnLT5ncm91cF9leGl0X3Rhc2sgPSBOVUxMOworCXNpZy0+bm90aWZ5X2NvdW50ID0gMDsKKwlzcGluX3VubG9ja19pcnEobG9jayk7CisKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQgYWxsIG90aGVyIHRocmVhZHMgaGF2ZSBleGl0ZWQsIGFsbCB3ZSBoYXZlIHRvCisJICogZG8gaXMgdG8gd2FpdCBmb3IgdGhlIHRocmVhZCBncm91cCBsZWFkZXIgdG8gYmVjb21lIGluYWN0aXZlLAorCSAqIGFuZCB0byBhc3N1bWUgaXRzIFBJRDoKKwkgKi8KKwlpZiAoIXRocmVhZF9ncm91cF9sZWFkZXIoY3VycmVudCkpIHsKKwkJc3RydWN0IHRhc2tfc3RydWN0ICpsZWFkZXIgPSBjdXJyZW50LT5ncm91cF9sZWFkZXIsICpwYXJlbnQ7CisJCXN0cnVjdCBkZW50cnkgKnByb2NfZGVudHJ5MSwgKnByb2NfZGVudHJ5MjsKKwkJdW5zaWduZWQgbG9uZyBleGl0X3N0YXRlLCBwdHJhY2U7CisKKwkJLyoKKwkJICogV2FpdCBmb3IgdGhlIHRocmVhZCBncm91cCBsZWFkZXIgdG8gYmUgYSB6b21iaWUuCisJCSAqIEl0IHNob3VsZCBhbHJlYWR5IGJlIHpvbWJpZSBhdCB0aGlzIHBvaW50LCBtb3N0CisJCSAqIG9mIHRoZSB0aW1lLgorCQkgKi8KKwkJd2hpbGUgKGxlYWRlci0+ZXhpdF9zdGF0ZSAhPSBFWElUX1pPTUJJRSkKKwkJCXlpZWxkKCk7CisKKwkJc3Bpbl9sb2NrKCZsZWFkZXItPnByb2NfbG9jayk7CisJCXNwaW5fbG9jaygmY3VycmVudC0+cHJvY19sb2NrKTsKKwkJcHJvY19kZW50cnkxID0gcHJvY19waWRfdW5oYXNoKGN1cnJlbnQpOworCQlwcm9jX2RlbnRyeTIgPSBwcm9jX3BpZF91bmhhc2gobGVhZGVyKTsKKwkJd3JpdGVfbG9ja19pcnEoJnRhc2tsaXN0X2xvY2spOworCisJCWlmIChsZWFkZXItPnRnaWQgIT0gY3VycmVudC0+dGdpZCkKKwkJCUJVRygpOworCQlpZiAoY3VycmVudC0+cGlkID09IGN1cnJlbnQtPnRnaWQpCisJCQlCVUcoKTsKKwkJLyoKKwkJICogQW4gZXhlYygpIHN0YXJ0cyBhIG5ldyB0aHJlYWQgZ3JvdXAgd2l0aCB0aGUKKwkJICogVEdJRCBvZiB0aGUgcHJldmlvdXMgdGhyZWFkIGdyb3VwLiBSZWhhc2ggdGhlCisJCSAqIHR3byB0aHJlYWRzIHdpdGggYSBzd2l0Y2hlZCBQSUQsIGFuZCByZWxlYXNlCisJCSAqIHRoZSBmb3JtZXIgdGhyZWFkIGdyb3VwIGxlYWRlcjoKKwkJICovCisJCXB0cmFjZSA9IGxlYWRlci0+cHRyYWNlOworCQlwYXJlbnQgPSBsZWFkZXItPnBhcmVudDsKKwkJaWYgKHVubGlrZWx5KHB0cmFjZSkgJiYgdW5saWtlbHkocGFyZW50ID09IGN1cnJlbnQpKSB7CisJCQkvKgorCQkJICogSm9rZXIgd2FzIHB0cmFjaW5nIGhpcyBvd24gZ3JvdXAgbGVhZGVyLAorCQkJICogYW5kIG5vdyBoZSB3YW50cyB0byBiZSBoaXMgb3duIHBhcmVudCEKKwkJCSAqIFdlIGNhbid0IGhhdmUgdGhhdC4KKwkJCSAqLworCQkJcHRyYWNlID0gMDsKKwkJfQorCisJCXB0cmFjZV91bmxpbmsoY3VycmVudCk7CisJCXB0cmFjZV91bmxpbmsobGVhZGVyKTsKKwkJcmVtb3ZlX3BhcmVudChjdXJyZW50KTsKKwkJcmVtb3ZlX3BhcmVudChsZWFkZXIpOworCisJCXN3aXRjaF9leGVjX3BpZHMobGVhZGVyLCBjdXJyZW50KTsKKworCQljdXJyZW50LT5wYXJlbnQgPSBjdXJyZW50LT5yZWFsX3BhcmVudCA9IGxlYWRlci0+cmVhbF9wYXJlbnQ7CisJCWxlYWRlci0+cGFyZW50ID0gbGVhZGVyLT5yZWFsX3BhcmVudCA9IGNoaWxkX3JlYXBlcjsKKwkJY3VycmVudC0+Z3JvdXBfbGVhZGVyID0gY3VycmVudDsKKwkJbGVhZGVyLT5ncm91cF9sZWFkZXIgPSBsZWFkZXI7CisKKwkJYWRkX3BhcmVudChjdXJyZW50LCBjdXJyZW50LT5wYXJlbnQpOworCQlhZGRfcGFyZW50KGxlYWRlciwgbGVhZGVyLT5wYXJlbnQpOworCQlpZiAocHRyYWNlKSB7CisJCQljdXJyZW50LT5wdHJhY2UgPSBwdHJhY2U7CisJCQlfX3B0cmFjZV9saW5rKGN1cnJlbnQsIHBhcmVudCk7CisJCX0KKworCQlsaXN0X2RlbCgmY3VycmVudC0+dGFza3MpOworCQlsaXN0X2FkZF90YWlsKCZjdXJyZW50LT50YXNrcywgJmluaXRfdGFzay50YXNrcyk7CisJCWN1cnJlbnQtPmV4aXRfc2lnbmFsID0gU0lHQ0hMRDsKKwkJZXhpdF9zdGF0ZSA9IGxlYWRlci0+ZXhpdF9zdGF0ZTsKKworCQl3cml0ZV91bmxvY2tfaXJxKCZ0YXNrbGlzdF9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmxlYWRlci0+cHJvY19sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmN1cnJlbnQtPnByb2NfbG9jayk7CisJCXByb2NfcGlkX2ZsdXNoKHByb2NfZGVudHJ5MSk7CisJCXByb2NfcGlkX2ZsdXNoKHByb2NfZGVudHJ5Mik7CisKKwkJaWYgKGV4aXRfc3RhdGUgIT0gRVhJVF9aT01CSUUpCisJCQlCVUcoKTsKKwkJcmVsZWFzZV90YXNrKGxlYWRlcik7CisgICAgICAgIH0KKworCS8qCisJICogTm93IHRoZXJlIGFyZSByZWFsbHkgbm8gb3RoZXIgdGhyZWFkcyBhdCBhbGwsCisJICogc28gaXQncyBzYWZlIHRvIHN0b3AgdGVsbGluZyB0aGVtIHRvIGtpbGwgdGhlbXNlbHZlcy4KKwkgKi8KKwlzaWctPmZsYWdzID0gMDsKKworbm9fdGhyZWFkX2dyb3VwOgorCUJVR19PTihhdG9taWNfcmVhZCgmc2lnLT5jb3VudCkgIT0gMSk7CisJZXhpdF9pdGltZXJzKHNpZyk7CisKKwlpZiAoYXRvbWljX3JlYWQoJm9sZHNpZ2hhbmQtPmNvdW50KSA9PSAxKSB7CisJCS8qCisJCSAqIE5vdyB0aGF0IHdlIG51a2VkIHRoZSByZXN0IG9mIHRoZSB0aHJlYWQgZ3JvdXAsCisJCSAqIGl0IHR1cm5zIG91dCB3ZSBhcmUgbm90IHNoYXJpbmcgc2lnaGFuZCBhbnkgbW9yZSBlaXRoZXIuCisJCSAqIFNvIHdlIGNhbiBqdXN0IGtlZXAgaXQuCisJCSAqLworCQlrbWVtX2NhY2hlX2ZyZWUoc2lnaGFuZF9jYWNoZXAsIG5ld3NpZ2hhbmQpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIE1vdmUgb3VyIHN0YXRlIG92ZXIgdG8gbmV3c2lnaGFuZCBhbmQgc3dpdGNoIGl0IGluLgorCQkgKi8KKwkJc3Bpbl9sb2NrX2luaXQoJm5ld3NpZ2hhbmQtPnNpZ2xvY2spOworCQlhdG9taWNfc2V0KCZuZXdzaWdoYW5kLT5jb3VudCwgMSk7CisJCW1lbWNweShuZXdzaWdoYW5kLT5hY3Rpb24sIG9sZHNpZ2hhbmQtPmFjdGlvbiwKKwkJICAgICAgIHNpemVvZihuZXdzaWdoYW5kLT5hY3Rpb24pKTsKKworCQl3cml0ZV9sb2NrX2lycSgmdGFza2xpc3RfbG9jayk7CisJCXNwaW5fbG9jaygmb2xkc2lnaGFuZC0+c2lnbG9jayk7CisJCXNwaW5fbG9jaygmbmV3c2lnaGFuZC0+c2lnbG9jayk7CisKKwkJY3VycmVudC0+c2lnaGFuZCA9IG5ld3NpZ2hhbmQ7CisJCXJlY2FsY19zaWdwZW5kaW5nKCk7CisKKwkJc3Bpbl91bmxvY2soJm5ld3NpZ2hhbmQtPnNpZ2xvY2spOworCQlzcGluX3VubG9jaygmb2xkc2lnaGFuZC0+c2lnbG9jayk7CisJCXdyaXRlX3VubG9ja19pcnEoJnRhc2tsaXN0X2xvY2spOworCisJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZvbGRzaWdoYW5kLT5jb3VudCkpCisJCQlrbWVtX2NhY2hlX2ZyZWUoc2lnaGFuZF9jYWNoZXAsIG9sZHNpZ2hhbmQpOworCX0KKworCWlmICghdGhyZWFkX2dyb3VwX2VtcHR5KGN1cnJlbnQpKQorCQlCVUcoKTsKKwlpZiAoIXRocmVhZF9ncm91cF9sZWFkZXIoY3VycmVudCkpCisJCUJVRygpOworCXJldHVybiAwOworfQorCQorLyoKKyAqIFRoZXNlIGZ1bmN0aW9ucyBmbHVzaGVzIG91dCBhbGwgdHJhY2VzIG9mIHRoZSBjdXJyZW50bHkgcnVubmluZyBleGVjdXRhYmxlCisgKiBzbyB0aGF0IGEgbmV3IG9uZSBjYW4gYmUgc3RhcnRlZAorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF9vbGRfZmlsZXMoc3RydWN0IGZpbGVzX3N0cnVjdCAqIGZpbGVzKQoreworCWxvbmcgaiA9IC0xOworCisJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlmb3IgKDs7KSB7CisJCXVuc2lnbmVkIGxvbmcgc2V0LCBpOworCisJCWorKzsKKwkJaSA9IGogKiBfX05GREJJVFM7CisJCWlmIChpID49IGZpbGVzLT5tYXhfZmRzIHx8IGkgPj0gZmlsZXMtPm1heF9mZHNldCkKKwkJCWJyZWFrOworCQlzZXQgPSBmaWxlcy0+Y2xvc2Vfb25fZXhlYy0+ZmRzX2JpdHNbal07CisJCWlmICghc2V0KQorCQkJY29udGludWU7CisJCWZpbGVzLT5jbG9zZV9vbl9leGVjLT5mZHNfYml0c1tqXSA9IDA7CisJCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwkJZm9yICggOyBzZXQgOyBpKyssc2V0ID4+PSAxKSB7CisJCQlpZiAoc2V0ICYgMSkgeworCQkJCXN5c19jbG9zZShpKTsKKwkJCX0KKwkJfQorCQlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOworCisJfQorCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKK30KKwordm9pZCBnZXRfdGFza19jb21tKGNoYXIgKmJ1Ziwgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJLyogYnVmIG11c3QgYmUgYXQgbGVhc3Qgc2l6ZW9mKHRzay0+Y29tbSkgaW4gc2l6ZSAqLworCXRhc2tfbG9jayh0c2spOworCXN0cm5jcHkoYnVmLCB0c2stPmNvbW0sIHNpemVvZih0c2stPmNvbW0pKTsKKwl0YXNrX3VubG9jayh0c2spOworfQorCit2b2lkIHNldF90YXNrX2NvbW0oc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGNoYXIgKmJ1ZikKK3sKKwl0YXNrX2xvY2sodHNrKTsKKwlzdHJsY3B5KHRzay0+Y29tbSwgYnVmLCBzaXplb2YodHNrLT5jb21tKSk7CisJdGFza191bmxvY2sodHNrKTsKK30KKworaW50IGZsdXNoX29sZF9leGVjKHN0cnVjdCBsaW51eF9iaW5wcm0gKiBicHJtKQoreworCWNoYXIgKiBuYW1lOworCWludCBpLCBjaCwgcmV0dmFsOworCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzOworCWNoYXIgdGNvbW1bc2l6ZW9mKGN1cnJlbnQtPmNvbW0pXTsKKworCS8qCisJICogTWFrZSBzdXJlIHdlIGhhdmUgYSBwcml2YXRlIHNpZ25hbCB0YWJsZSBhbmQgdGhhdAorCSAqIHdlIGFyZSB1bmFzc29jaWF0ZWQgZnJvbSB0aGUgcHJldmlvdXMgdGhyZWFkIGdyb3VwLgorCSAqLworCXJldHZhbCA9IGRlX3RocmVhZChjdXJyZW50KTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dDsKKworCS8qCisJICogTWFrZSBzdXJlIHdlIGhhdmUgcHJpdmF0ZSBmaWxlIGhhbmRsZXMuIEFzayB0aGUKKwkgKiBmb3JrIGhlbHBlciB0byBkbyB0aGUgd29yayBmb3IgdXMgYW5kIHRoZSBleGl0CisJICogaGVscGVyIHRvIGRvIHRoZSBjbGVhbnVwIG9mIHRoZSBvbGQgb25lLgorCSAqLworCWZpbGVzID0gY3VycmVudC0+ZmlsZXM7CQkvKiByZWZjb3VudGVkIHNvIHNhZmUgdG8gaG9sZCAqLworCXJldHZhbCA9IHVuc2hhcmVfZmlsZXMoKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dDsKKwkvKgorCSAqIFJlbGVhc2UgYWxsIG9mIHRoZSBvbGQgbW1hcCBzdHVmZgorCSAqLworCXJldHZhbCA9IGV4ZWNfbW1hcChicHJtLT5tbSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBtbWFwX2ZhaWxlZDsKKworCWJwcm0tPm1tID0gTlVMTDsJCS8qIFdlJ3JlIHVzaW5nIGl0IG5vdyAqLworCisJLyogVGhpcyBpcyB0aGUgcG9pbnQgb2Ygbm8gcmV0dXJuICovCisJc3RlYWxfbG9ja3MoZmlsZXMpOworCXB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpOworCisJY3VycmVudC0+c2FzX3NzX3NwID0gY3VycmVudC0+c2FzX3NzX3NpemUgPSAwOworCisJaWYgKGN1cnJlbnQtPmV1aWQgPT0gY3VycmVudC0+dWlkICYmIGN1cnJlbnQtPmVnaWQgPT0gY3VycmVudC0+Z2lkKQorCQljdXJyZW50LT5tbS0+ZHVtcGFibGUgPSAxOworCW5hbWUgPSBicHJtLT5maWxlbmFtZTsKKwlmb3IgKGk9MDsgKGNoID0gKihuYW1lKyspKSAhPSAnXDAnOykgeworCQlpZiAoY2ggPT0gJy8nKQorCQkJaSA9IDA7CisJCWVsc2UKKwkJCWlmIChpIDwgKHNpemVvZih0Y29tbSkgLSAxKSkKKwkJCQl0Y29tbVtpKytdID0gY2g7CisJfQorCXRjb21tW2ldID0gJ1wwJzsKKwlzZXRfdGFza19jb21tKGN1cnJlbnQsIHRjb21tKTsKKworCWN1cnJlbnQtPmZsYWdzICY9IH5QRl9SQU5ET01JWkU7CisJZmx1c2hfdGhyZWFkKCk7CisKKwlpZiAoYnBybS0+ZV91aWQgIT0gY3VycmVudC0+ZXVpZCB8fCBicHJtLT5lX2dpZCAhPSBjdXJyZW50LT5lZ2lkIHx8IAorCSAgICBwZXJtaXNzaW9uKGJwcm0tPmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLE1BWV9SRUFELCBOVUxMKSB8fAorCSAgICAoYnBybS0+aW50ZXJwX2ZsYWdzICYgQklOUFJNX0ZMQUdTX0VORk9SQ0VfTk9ORFVNUCkpIHsKKwkJc3VpZF9rZXlzKGN1cnJlbnQpOworCQljdXJyZW50LT5tbS0+ZHVtcGFibGUgPSAwOworCX0KKworCS8qIEFuIGV4ZWMgY2hhbmdlcyBvdXIgZG9tYWluLiBXZSBhcmUgbm8gbG9uZ2VyIHBhcnQgb2YgdGhlIHRocmVhZAorCSAgIGdyb3VwICovCisKKwljdXJyZW50LT5zZWxmX2V4ZWNfaWQrKzsKKwkJCQorCWZsdXNoX3NpZ25hbF9oYW5kbGVycyhjdXJyZW50LCAwKTsKKwlmbHVzaF9vbGRfZmlsZXMoY3VycmVudC0+ZmlsZXMpOworCisJcmV0dXJuIDA7CisKK21tYXBfZmFpbGVkOgorCXB1dF9maWxlc19zdHJ1Y3QoY3VycmVudC0+ZmlsZXMpOworCWN1cnJlbnQtPmZpbGVzID0gZmlsZXM7CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworRVhQT1JUX1NZTUJPTChmbHVzaF9vbGRfZXhlYyk7CisKKy8qIAorICogRmlsbCB0aGUgYmlucHJtIHN0cnVjdHVyZSBmcm9tIHRoZSBpbm9kZS4gCisgKiBDaGVjayBwZXJtaXNzaW9ucywgdGhlbiByZWFkIHRoZSBmaXJzdCAxMjggKEJJTlBSTV9CVUZfU0laRSkgYnl0ZXMKKyAqLworaW50IHByZXBhcmVfYmlucHJtKHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pCit7CisJaW50IG1vZGU7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBicHJtLT5maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgcmV0dmFsOworCisJbW9kZSA9IGlub2RlLT5pX21vZGU7CisJLyoKKwkgKiBDaGVjayBleGVjdXRlIHBlcm1zIGFnYWluIC0gaWYgdGhlIGNhbGxlciBoYXMgQ0FQX0RBQ19PVkVSUklERSwKKwkgKiBnZW5lcmljX3Blcm1pc3Npb24gbGV0cyBhIG5vbi1leGVjdXRhYmxlIHRocm91Z2gKKwkgKi8KKwlpZiAoIShtb2RlICYgMDExMSkpCS8qIHdpdGggYXQgbGVhc3QgX29uZV8gZXhlY3V0ZSBiaXQgc2V0ICovCisJCXJldHVybiAtRUFDQ0VTOworCWlmIChicHJtLT5maWxlLT5mX29wID09IE5VTEwpCisJCXJldHVybiAtRUFDQ0VTOworCisJYnBybS0+ZV91aWQgPSBjdXJyZW50LT5ldWlkOworCWJwcm0tPmVfZ2lkID0gY3VycmVudC0+ZWdpZDsKKworCWlmKCEoYnBybS0+ZmlsZS0+Zl92ZnNtbnQtPm1udF9mbGFncyAmIE1OVF9OT1NVSUQpKSB7CisJCS8qIFNldC11aWQ/ICovCisJCWlmIChtb2RlICYgU19JU1VJRCkgeworCQkJY3VycmVudC0+cGVyc29uYWxpdHkgJj0gflBFUl9DTEVBUl9PTl9TRVRJRDsKKwkJCWJwcm0tPmVfdWlkID0gaW5vZGUtPmlfdWlkOworCQl9CisKKwkJLyogU2V0LWdpZD8gKi8KKwkJLyoKKwkJICogSWYgc2V0Z2lkIGlzIHNldCBidXQgbm8gZ3JvdXAgZXhlY3V0ZSBiaXQgdGhlbiB0aGlzCisJCSAqIGlzIGEgY2FuZGlkYXRlIGZvciBtYW5kYXRvcnkgbG9ja2luZywgbm90IGEgc2V0Z2lkCisJCSAqIGV4ZWN1dGFibGUuCisJCSAqLworCQlpZiAoKG1vZGUgJiAoU19JU0dJRCB8IFNfSVhHUlApKSA9PSAoU19JU0dJRCB8IFNfSVhHUlApKSB7CisJCQljdXJyZW50LT5wZXJzb25hbGl0eSAmPSB+UEVSX0NMRUFSX09OX1NFVElEOworCQkJYnBybS0+ZV9naWQgPSBpbm9kZS0+aV9naWQ7CisJCX0KKwl9CisKKwkvKiBmaWxsIGluIGJpbnBybSBzZWN1cml0eSBibG9iICovCisJcmV0dmFsID0gc2VjdXJpdHlfYnBybV9zZXQoYnBybSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCW1lbXNldChicHJtLT5idWYsMCxCSU5QUk1fQlVGX1NJWkUpOworCXJldHVybiBrZXJuZWxfcmVhZChicHJtLT5maWxlLDAsYnBybS0+YnVmLEJJTlBSTV9CVUZfU0laRSk7Cit9CisKK0VYUE9SVF9TWU1CT0wocHJlcGFyZV9iaW5wcm0pOworCitzdGF0aWMgaW5saW5lIGludCB1bnNhZmVfZXhlYyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJaW50IHVuc2FmZSA9IDA7CisJaWYgKHAtPnB0cmFjZSAmIFBUX1BUUkFDRUQpIHsKKwkJaWYgKHAtPnB0cmFjZSAmIFBUX1BUUkFDRV9DQVApCisJCQl1bnNhZmUgfD0gTFNNX1VOU0FGRV9QVFJBQ0VfQ0FQOworCQllbHNlCisJCQl1bnNhZmUgfD0gTFNNX1VOU0FGRV9QVFJBQ0U7CisJfQorCWlmIChhdG9taWNfcmVhZCgmcC0+ZnMtPmNvdW50KSA+IDEgfHwKKwkgICAgYXRvbWljX3JlYWQoJnAtPmZpbGVzLT5jb3VudCkgPiAxIHx8CisJICAgIGF0b21pY19yZWFkKCZwLT5zaWdoYW5kLT5jb3VudCkgPiAxKQorCQl1bnNhZmUgfD0gTFNNX1VOU0FGRV9TSEFSRTsKKworCXJldHVybiB1bnNhZmU7Cit9CisKK3ZvaWQgY29tcHV0ZV9jcmVkcyhzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtKQoreworCWludCB1bnNhZmU7CisKKwlpZiAoYnBybS0+ZV91aWQgIT0gY3VycmVudC0+dWlkKQorCQlzdWlkX2tleXMoY3VycmVudCk7CisJZXhlY19rZXlzKGN1cnJlbnQpOworCisJdGFza19sb2NrKGN1cnJlbnQpOworCXVuc2FmZSA9IHVuc2FmZV9leGVjKGN1cnJlbnQpOworCXNlY3VyaXR5X2Jwcm1fYXBwbHlfY3JlZHMoYnBybSwgdW5zYWZlKTsKKwl0YXNrX3VubG9jayhjdXJyZW50KTsKKwlzZWN1cml0eV9icHJtX3Bvc3RfYXBwbHlfY3JlZHMoYnBybSk7Cit9CisKK0VYUE9SVF9TWU1CT0woY29tcHV0ZV9jcmVkcyk7CisKK3ZvaWQgcmVtb3ZlX2FyZ196ZXJvKHN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm0pCit7CisJaWYgKGJwcm0tPmFyZ2MpIHsKKwkJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJCWNoYXIgKiBrYWRkcjsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwkJb2Zmc2V0ID0gYnBybS0+cCAlIFBBR0VfU0laRTsKKwkJZ290byBpbnNpZGU7CisKKwkJd2hpbGUgKGJwcm0tPnArKywgKihrYWRkcitvZmZzZXQrKykpIHsKKwkJCWlmIChvZmZzZXQgIT0gUEFHRV9TSVpFKQorCQkJCWNvbnRpbnVlOworCQkJb2Zmc2V0ID0gMDsKKwkJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKK2luc2lkZToKKwkJCXBhZ2UgPSBicHJtLT5wYWdlW2Jwcm0tPnAvUEFHRV9TSVpFXTsKKwkJCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQl9CisJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJYnBybS0+YXJnYy0tOworCX0KK30KKworRVhQT1JUX1NZTUJPTChyZW1vdmVfYXJnX3plcm8pOworCisvKgorICogY3ljbGUgdGhlIGxpc3Qgb2YgYmluYXJ5IGZvcm1hdHMgaGFuZGxlciwgdW50aWwgb25lIHJlY29nbml6ZXMgdGhlIGltYWdlCisgKi8KK2ludCBzZWFyY2hfYmluYXJ5X2hhbmRsZXIoc3RydWN0IGxpbnV4X2JpbnBybSAqYnBybSxzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgdHJ5LHJldHZhbDsKKwlzdHJ1Y3QgbGludXhfYmluZm10ICpmbXQ7CisjaWZkZWYgX19hbHBoYV9fCisJLyogaGFuZGxlIC9zYmluL2xvYWRlci4uICovCisJeworCSAgICBzdHJ1Y3QgZXhlYyAqIGVoID0gKHN0cnVjdCBleGVjICopIGJwcm0tPmJ1ZjsKKworCSAgICBpZiAoIWJwcm0tPmxvYWRlciAmJiBlaC0+ZmguZl9tYWdpYyA9PSAweDE4MyAmJgorCQkoZWgtPmZoLmZfZmxhZ3MgJiAweDMwMDApID09IDB4MzAwMCkKKwkgICAgeworCQlzdHJ1Y3QgZmlsZSAqIGZpbGU7CisJCXVuc2lnbmVkIGxvbmcgbG9hZGVyOworCisJCWFsbG93X3dyaXRlX2FjY2VzcyhicHJtLT5maWxlKTsKKwkJZnB1dChicHJtLT5maWxlKTsKKwkJYnBybS0+ZmlsZSA9IE5VTEw7CisKKwkgICAgICAgIGxvYWRlciA9IFBBR0VfU0laRSpNQVhfQVJHX1BBR0VTLXNpemVvZih2b2lkICopOworCisJCWZpbGUgPSBvcGVuX2V4ZWMoIi9zYmluL2xvYWRlciIpOworCQlyZXR2YWwgPSBQVFJfRVJSKGZpbGUpOworCQlpZiAoSVNfRVJSKGZpbGUpKQorCQkJcmV0dXJuIHJldHZhbDsKKworCQkvKiBSZW1lbWJlciBpZiB0aGUgYXBwbGljYXRpb24gaXMgVEFTTy4gICovCisJCWJwcm0tPnNoX2JhbmcgPSBlaC0+YWguZW50cnkgPCAweDEwMDAwMDAwMFVMOworCisJCWJwcm0tPmZpbGUgPSBmaWxlOworCQlicHJtLT5sb2FkZXIgPSBsb2FkZXI7CisJCXJldHZhbCA9IHByZXBhcmVfYmlucHJtKGJwcm0pOworCQlpZiAocmV0dmFsPDApCisJCQlyZXR1cm4gcmV0dmFsOworCQkvKiBzaG91bGQgY2FsbCBzZWFyY2hfYmluYXJ5X2hhbmRsZXIgcmVjdXJzaXZlbHkgaGVyZSwKKwkJICAgYnV0IGl0IGRvZXMgbm90IG1hdHRlciAqLworCSAgICB9CisJfQorI2VuZGlmCisJcmV0dmFsID0gc2VjdXJpdHlfYnBybV9jaGVjayhicHJtKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJLyoga2VybmVsIG1vZHVsZSBsb2FkZXIgZml4dXAgKi8KKwkvKiBzbyB3ZSBkb24ndCB0cnkgdG8gbG9hZCBydW4gbW9kcHJvYmUgaW4ga2VybmVsIHNwYWNlLiAqLworCXNldF9mcyhVU0VSX0RTKTsKKwlyZXR2YWwgPSAtRU5PRU5UOworCWZvciAodHJ5PTA7IHRyeTwyOyB0cnkrKykgeworCQlyZWFkX2xvY2soJmJpbmZtdF9sb2NrKTsKKwkJZm9yIChmbXQgPSBmb3JtYXRzIDsgZm10IDsgZm10ID0gZm10LT5uZXh0KSB7CisJCQlpbnQgKCpmbikoc3RydWN0IGxpbnV4X2JpbnBybSAqLCBzdHJ1Y3QgcHRfcmVncyAqKSA9IGZtdC0+bG9hZF9iaW5hcnk7CisJCQlpZiAoIWZuKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCF0cnlfbW9kdWxlX2dldChmbXQtPm1vZHVsZSkpCisJCQkJY29udGludWU7CisJCQlyZWFkX3VubG9jaygmYmluZm10X2xvY2spOworCQkJcmV0dmFsID0gZm4oYnBybSwgcmVncyk7CisJCQlpZiAocmV0dmFsID49IDApIHsKKwkJCQlwdXRfYmluZm10KGZtdCk7CisJCQkJYWxsb3dfd3JpdGVfYWNjZXNzKGJwcm0tPmZpbGUpOworCQkJCWlmIChicHJtLT5maWxlKQorCQkJCQlmcHV0KGJwcm0tPmZpbGUpOworCQkJCWJwcm0tPmZpbGUgPSBOVUxMOworCQkJCWN1cnJlbnQtPmRpZF9leGVjID0gMTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCQkJfQorCQkJcmVhZF9sb2NrKCZiaW5mbXRfbG9jayk7CisJCQlwdXRfYmluZm10KGZtdCk7CisJCQlpZiAocmV0dmFsICE9IC1FTk9FWEVDIHx8IGJwcm0tPm1tID09IE5VTEwpCisJCQkJYnJlYWs7CisJCQlpZiAoIWJwcm0tPmZpbGUpIHsKKwkJCQlyZWFkX3VubG9jaygmYmluZm10X2xvY2spOworCQkJCXJldHVybiByZXR2YWw7CisJCQl9CisJCX0KKwkJcmVhZF91bmxvY2soJmJpbmZtdF9sb2NrKTsKKwkJaWYgKHJldHZhbCAhPSAtRU5PRVhFQyB8fCBicHJtLT5tbSA9PSBOVUxMKSB7CisJCQlicmVhazsKKyNpZmRlZiBDT05GSUdfS01PRAorCQl9ZWxzZXsKKyNkZWZpbmUgcHJpbnRhYmxlKGMpICgoKGMpPT0nXHQnKSB8fCAoKGMpPT0nXG4nKSB8fCAoMHgyMDw9KGMpICYmIChjKTw9MHg3ZSkpCisJCQlpZiAocHJpbnRhYmxlKGJwcm0tPmJ1ZlswXSkgJiYKKwkJCSAgICBwcmludGFibGUoYnBybS0+YnVmWzFdKSAmJgorCQkJICAgIHByaW50YWJsZShicHJtLT5idWZbMl0pICYmCisJCQkgICAgcHJpbnRhYmxlKGJwcm0tPmJ1ZlszXSkpCisJCQkJYnJlYWs7IC8qIC1FTk9FWEVDICovCisJCQlyZXF1ZXN0X21vZHVsZSgiYmluZm10LSUwNHgiLCAqKHVuc2lnbmVkIHNob3J0ICopKCZicHJtLT5idWZbMl0pKTsKKyNlbmRpZgorCQl9CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK0VYUE9SVF9TWU1CT0woc2VhcmNoX2JpbmFyeV9oYW5kbGVyKTsKKworLyoKKyAqIHN5c19leGVjdmUoKSBleGVjdXRlcyBhIG5ldyBwcm9ncmFtLgorICovCitpbnQgZG9fZXhlY3ZlKGNoYXIgKiBmaWxlbmFtZSwKKwljaGFyIF9fdXNlciAqX191c2VyICphcmd2LAorCWNoYXIgX191c2VyICpfX3VzZXIgKmVudnAsCisJc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCXN0cnVjdCBsaW51eF9iaW5wcm0gKmJwcm07CisJc3RydWN0IGZpbGUgKmZpbGU7CisJaW50IHJldHZhbDsKKwlpbnQgaTsKKworCXJldHZhbCA9IC1FTk9NRU07CisJYnBybSA9IGttYWxsb2Moc2l6ZW9mKCpicHJtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFicHJtKQorCQlnb3RvIG91dF9yZXQ7CisJbWVtc2V0KGJwcm0sIDAsIHNpemVvZigqYnBybSkpOworCisJZmlsZSA9IG9wZW5fZXhlYyhmaWxlbmFtZSk7CisJcmV0dmFsID0gUFRSX0VSUihmaWxlKTsKKwlpZiAoSVNfRVJSKGZpbGUpKQorCQlnb3RvIG91dF9rZnJlZTsKKworCXNjaGVkX2V4ZWMoKTsKKworCWJwcm0tPnAgPSBQQUdFX1NJWkUqTUFYX0FSR19QQUdFUy1zaXplb2Yodm9pZCAqKTsKKworCWJwcm0tPmZpbGUgPSBmaWxlOworCWJwcm0tPmZpbGVuYW1lID0gZmlsZW5hbWU7CisJYnBybS0+aW50ZXJwID0gZmlsZW5hbWU7CisJYnBybS0+bW0gPSBtbV9hbGxvYygpOworCXJldHZhbCA9IC1FTk9NRU07CisJaWYgKCFicHJtLT5tbSkKKwkJZ290byBvdXRfZmlsZTsKKworCXJldHZhbCA9IGluaXRfbmV3X2NvbnRleHQoY3VycmVudCwgYnBybS0+bW0pOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIG91dF9tbTsKKworCWJwcm0tPmFyZ2MgPSBjb3VudChhcmd2LCBicHJtLT5wIC8gc2l6ZW9mKHZvaWQgKikpOworCWlmICgocmV0dmFsID0gYnBybS0+YXJnYykgPCAwKQorCQlnb3RvIG91dF9tbTsKKworCWJwcm0tPmVudmMgPSBjb3VudChlbnZwLCBicHJtLT5wIC8gc2l6ZW9mKHZvaWQgKikpOworCWlmICgocmV0dmFsID0gYnBybS0+ZW52YykgPCAwKQorCQlnb3RvIG91dF9tbTsKKworCXJldHZhbCA9IHNlY3VyaXR5X2Jwcm1fYWxsb2MoYnBybSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXQ7CisKKwlyZXR2YWwgPSBwcmVwYXJlX2JpbnBybShicHJtKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZ290byBvdXQ7CisKKwlyZXR2YWwgPSBjb3B5X3N0cmluZ3Nfa2VybmVsKDEsICZicHJtLT5maWxlbmFtZSwgYnBybSk7CisJaWYgKHJldHZhbCA8IDApCisJCWdvdG8gb3V0OworCisJYnBybS0+ZXhlYyA9IGJwcm0tPnA7CisJcmV0dmFsID0gY29weV9zdHJpbmdzKGJwcm0tPmVudmMsIGVudnAsIGJwcm0pOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIG91dDsKKworCXJldHZhbCA9IGNvcHlfc3RyaW5ncyhicHJtLT5hcmdjLCBhcmd2LCBicHJtKTsKKwlpZiAocmV0dmFsIDwgMCkKKwkJZ290byBvdXQ7CisKKwlyZXR2YWwgPSBzZWFyY2hfYmluYXJ5X2hhbmRsZXIoYnBybSxyZWdzKTsKKwlpZiAocmV0dmFsID49IDApIHsKKwkJZnJlZV9hcmdfcGFnZXMoYnBybSk7CisKKwkJLyogZXhlY3ZlIHN1Y2Nlc3MgKi8KKwkJc2VjdXJpdHlfYnBybV9mcmVlKGJwcm0pOworCQlhY2N0X3VwZGF0ZV9pbnRlZ3JhbHMoY3VycmVudCk7CisJCXVwZGF0ZV9tZW1faGl3YXRlcihjdXJyZW50KTsKKwkJa2ZyZWUoYnBybSk7CisJCXJldHVybiByZXR2YWw7CisJfQorCitvdXQ6CisJLyogU29tZXRoaW5nIHdlbnQgd3JvbmcsIHJldHVybiB0aGUgaW5vZGUgYW5kIGZyZWUgdGhlIGFyZ3VtZW50IHBhZ2VzKi8KKwlmb3IgKGkgPSAwIDsgaSA8IE1BWF9BUkdfUEFHRVMgOyBpKyspIHsKKwkJc3RydWN0IHBhZ2UgKiBwYWdlID0gYnBybS0+cGFnZVtpXTsKKwkJaWYgKHBhZ2UpCisJCQlfX2ZyZWVfcGFnZShwYWdlKTsKKwl9CisKKwlpZiAoYnBybS0+c2VjdXJpdHkpCisJCXNlY3VyaXR5X2Jwcm1fZnJlZShicHJtKTsKKworb3V0X21tOgorCWlmIChicHJtLT5tbSkKKwkJbW1kcm9wKGJwcm0tPm1tKTsKKworb3V0X2ZpbGU6CisJaWYgKGJwcm0tPmZpbGUpIHsKKwkJYWxsb3dfd3JpdGVfYWNjZXNzKGJwcm0tPmZpbGUpOworCQlmcHV0KGJwcm0tPmZpbGUpOworCX0KKworb3V0X2tmcmVlOgorCWtmcmVlKGJwcm0pOworCitvdXRfcmV0OgorCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBzZXRfYmluZm10KHN0cnVjdCBsaW51eF9iaW5mbXQgKm5ldykKK3sKKwlzdHJ1Y3QgbGludXhfYmluZm10ICpvbGQgPSBjdXJyZW50LT5iaW5mbXQ7CisKKwlpZiAobmV3KSB7CisJCWlmICghdHJ5X21vZHVsZV9nZXQobmV3LT5tb2R1bGUpKQorCQkJcmV0dXJuIC0xOworCX0KKwljdXJyZW50LT5iaW5mbXQgPSBuZXc7CisJaWYgKG9sZCkKKwkJbW9kdWxlX3B1dChvbGQtPm1vZHVsZSk7CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woc2V0X2JpbmZtdCk7CisKKyNkZWZpbmUgQ09SRU5BTUVfTUFYX1NJWkUgNjQKKworLyogZm9ybWF0X2NvcmVuYW1lIHdpbGwgaW5zcGVjdCB0aGUgcGF0dGVybiBwYXJhbWV0ZXIsIGFuZCBvdXRwdXQgYQorICogbmFtZSBpbnRvIGNvcmVuYW1lLCB3aGljaCBtdXN0IGhhdmUgc3BhY2UgZm9yIGF0IGxlYXN0CisgKiBDT1JFTkFNRV9NQVhfU0laRSBieXRlcyBwbHVzIG9uZSBieXRlIGZvciB0aGUgemVybyB0ZXJtaW5hdG9yLgorICovCitzdGF0aWMgdm9pZCBmb3JtYXRfY29yZW5hbWUoY2hhciAqY29yZW5hbWUsIGNvbnN0IGNoYXIgKnBhdHRlcm4sIGxvbmcgc2lnbnIpCit7CisJY29uc3QgY2hhciAqcGF0X3B0ciA9IHBhdHRlcm47CisJY2hhciAqb3V0X3B0ciA9IGNvcmVuYW1lOworCWNoYXIgKmNvbnN0IG91dF9lbmQgPSBjb3JlbmFtZSArIENPUkVOQU1FX01BWF9TSVpFOworCWludCByYzsKKwlpbnQgcGlkX2luX3BhdHRlcm4gPSAwOworCisJLyogUmVwZWF0IGFzIGxvbmcgYXMgd2UgaGF2ZSBtb3JlIHBhdHRlcm4gdG8gcHJvY2VzcyBhbmQgbW9yZSBvdXRwdXQKKwkgICBzcGFjZSAqLworCXdoaWxlICgqcGF0X3B0cikgeworCQlpZiAoKnBhdF9wdHIgIT0gJyUnKSB7CisJCQlpZiAob3V0X3B0ciA9PSBvdXRfZW5kKQorCQkJCWdvdG8gb3V0OworCQkJKm91dF9wdHIrKyA9ICpwYXRfcHRyKys7CisJCX0gZWxzZSB7CisJCQlzd2l0Y2ggKCorK3BhdF9wdHIpIHsKKwkJCWNhc2UgMDoKKwkJCQlnb3RvIG91dDsKKwkJCS8qIERvdWJsZSBwZXJjZW50LCBvdXRwdXQgb25lIHBlcmNlbnQgKi8KKwkJCWNhc2UgJyUnOgorCQkJCWlmIChvdXRfcHRyID09IG91dF9lbmQpCisJCQkJCWdvdG8gb3V0OworCQkJCSpvdXRfcHRyKysgPSAnJSc7CisJCQkJYnJlYWs7CisJCQkvKiBwaWQgKi8KKwkJCWNhc2UgJ3AnOgorCQkJCXBpZF9pbl9wYXR0ZXJuID0gMTsKKwkJCQlyYyA9IHNucHJpbnRmKG91dF9wdHIsIG91dF9lbmQgLSBvdXRfcHRyLAorCQkJCQkgICAgICAiJWQiLCBjdXJyZW50LT50Z2lkKTsKKwkJCQlpZiAocmMgPiBvdXRfZW5kIC0gb3V0X3B0cikKKwkJCQkJZ290byBvdXQ7CisJCQkJb3V0X3B0ciArPSByYzsKKwkJCQlicmVhazsKKwkJCS8qIHVpZCAqLworCQkJY2FzZSAndSc6CisJCQkJcmMgPSBzbnByaW50ZihvdXRfcHRyLCBvdXRfZW5kIC0gb3V0X3B0ciwKKwkJCQkJICAgICAgIiVkIiwgY3VycmVudC0+dWlkKTsKKwkJCQlpZiAocmMgPiBvdXRfZW5kIC0gb3V0X3B0cikKKwkJCQkJZ290byBvdXQ7CisJCQkJb3V0X3B0ciArPSByYzsKKwkJCQlicmVhazsKKwkJCS8qIGdpZCAqLworCQkJY2FzZSAnZyc6CisJCQkJcmMgPSBzbnByaW50ZihvdXRfcHRyLCBvdXRfZW5kIC0gb3V0X3B0ciwKKwkJCQkJICAgICAgIiVkIiwgY3VycmVudC0+Z2lkKTsKKwkJCQlpZiAocmMgPiBvdXRfZW5kIC0gb3V0X3B0cikKKwkJCQkJZ290byBvdXQ7CisJCQkJb3V0X3B0ciArPSByYzsKKwkJCQlicmVhazsKKwkJCS8qIHNpZ25hbCB0aGF0IGNhdXNlZCB0aGUgY29yZWR1bXAgKi8KKwkJCWNhc2UgJ3MnOgorCQkJCXJjID0gc25wcmludGYob3V0X3B0ciwgb3V0X2VuZCAtIG91dF9wdHIsCisJCQkJCSAgICAgICIlbGQiLCBzaWducik7CisJCQkJaWYgKHJjID4gb3V0X2VuZCAtIG91dF9wdHIpCisJCQkJCWdvdG8gb3V0OworCQkJCW91dF9wdHIgKz0gcmM7CisJCQkJYnJlYWs7CisJCQkvKiBVTklYIHRpbWUgb2YgY29yZWR1bXAgKi8KKwkJCWNhc2UgJ3QnOiB7CisJCQkJc3RydWN0IHRpbWV2YWwgdHY7CisJCQkJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CisJCQkJcmMgPSBzbnByaW50ZihvdXRfcHRyLCBvdXRfZW5kIC0gb3V0X3B0ciwKKwkJCQkJICAgICAgIiVsdSIsIHR2LnR2X3NlYyk7CisJCQkJaWYgKHJjID4gb3V0X2VuZCAtIG91dF9wdHIpCisJCQkJCWdvdG8gb3V0OworCQkJCW91dF9wdHIgKz0gcmM7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBob3N0bmFtZSAqLworCQkJY2FzZSAnaCc6CisJCQkJZG93bl9yZWFkKCZ1dHNfc2VtKTsKKwkJCQlyYyA9IHNucHJpbnRmKG91dF9wdHIsIG91dF9lbmQgLSBvdXRfcHRyLAorCQkJCQkgICAgICAiJXMiLCBzeXN0ZW1fdXRzbmFtZS5ub2RlbmFtZSk7CisJCQkJdXBfcmVhZCgmdXRzX3NlbSk7CisJCQkJaWYgKHJjID4gb3V0X2VuZCAtIG91dF9wdHIpCisJCQkJCWdvdG8gb3V0OworCQkJCW91dF9wdHIgKz0gcmM7CisJCQkJYnJlYWs7CisJCQkvKiBleGVjdXRhYmxlICovCisJCQljYXNlICdlJzoKKwkJCQlyYyA9IHNucHJpbnRmKG91dF9wdHIsIG91dF9lbmQgLSBvdXRfcHRyLAorCQkJCQkgICAgICAiJXMiLCBjdXJyZW50LT5jb21tKTsKKwkJCQlpZiAocmMgPiBvdXRfZW5kIC0gb3V0X3B0cikKKwkJCQkJZ290byBvdXQ7CisJCQkJb3V0X3B0ciArPSByYzsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCQkrK3BhdF9wdHI7CisJCX0KKwl9CisJLyogQmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGNvcmVfdXNlc19waWQ6CisJICoKKwkgKiBJZiBjb3JlX3BhdHRlcm4gZG9lcyBub3QgaW5jbHVkZSBhICVwIChhcyBpcyB0aGUgZGVmYXVsdCkKKwkgKiBhbmQgY29yZV91c2VzX3BpZCBpcyBzZXQsIHRoZW4gLiVwaWQgd2lsbCBiZSBhcHBlbmRlZCB0bworCSAqIHRoZSBmaWxlbmFtZSAqLworCWlmICghcGlkX2luX3BhdHRlcm4KKyAgICAgICAgICAgICYmIChjb3JlX3VzZXNfcGlkIHx8IGF0b21pY19yZWFkKCZjdXJyZW50LT5tbS0+bW1fdXNlcnMpICE9IDEpKSB7CisJCXJjID0gc25wcmludGYob3V0X3B0ciwgb3V0X2VuZCAtIG91dF9wdHIsCisJCQkgICAgICAiLiVkIiwgY3VycmVudC0+dGdpZCk7CisJCWlmIChyYyA+IG91dF9lbmQgLSBvdXRfcHRyKQorCQkJZ290byBvdXQ7CisJCW91dF9wdHIgKz0gcmM7CisJfQorICAgICAgb3V0OgorCSpvdXRfcHRyID0gMDsKK30KKworc3RhdGljIHZvaWQgemFwX3RocmVhZHMgKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqZywgKnA7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OworCXN0cnVjdCBjb21wbGV0aW9uICp2Zm9ya19kb25lID0gdHNrLT52Zm9ya19kb25lOworCWludCB0cmFjZWQgPSAwOworCisJLyoKKwkgKiBNYWtlIHN1cmUgbm9ib2R5IGlzIHdhaXRpbmcgZm9yIHVzIHRvIHJlbGVhc2UgdGhlIFZNLAorCSAqIG90aGVyd2lzZSB3ZSBjYW4gZGVhZGxvY2sgd2hlbiB3ZSB3YWl0IG9uIGVhY2ggb3RoZXIKKwkgKi8KKwlpZiAodmZvcmtfZG9uZSkgeworCQl0c2stPnZmb3JrX2RvbmUgPSBOVUxMOworCQljb21wbGV0ZSh2Zm9ya19kb25lKTsKKwl9CisKKwlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCWRvX2VhY2hfdGhyZWFkKGcscCkKKwkJaWYgKG1tID09IHAtPm1tICYmIHAgIT0gdHNrKSB7CisJCQlmb3JjZV9zaWdfc3BlY2lmaWMoU0lHS0lMTCwgcCk7CisJCQltbS0+Y29yZV93YWl0ZXJzKys7CisJCQlpZiAodW5saWtlbHkocC0+cHRyYWNlKSAmJgorCQkJICAgIHVubGlrZWx5KHAtPnBhcmVudC0+bW0gPT0gbW0pKQorCQkJCXRyYWNlZCA9IDE7CisJCX0KKwl3aGlsZV9lYWNoX3RocmVhZChnLHApOworCisJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCisJaWYgKHVubGlrZWx5KHRyYWNlZCkpIHsKKwkJLyoKKwkJICogV2UgYXJlIHphcHBpbmcgYSB0aHJlYWQgYW5kIHRoZSB0aHJlYWQgaXQgcHRyYWNlcy4KKwkJICogSWYgdGhlIHRyYWNlZSB3ZW50IGludG8gYSBwdHJhY2Ugc3RvcCBmb3IgZXhpdCB0cmFjaW5nLAorCQkgKiB3ZSBjb3VsZCBkZWFkbG9jayBzaW5jZSB0aGUgdHJhY2VyIGlzIHdhaXRpbmcgZm9yIHRoaXMKKwkJICogY29yZWR1bXAgdG8gZmluaXNoLiAgRGV0YWNoIHRoZW0gc28gdGhleSBjYW4gYm90aCBkaWUuCisJCSAqLworCQl3cml0ZV9sb2NrX2lycSgmdGFza2xpc3RfbG9jayk7CisJCWRvX2VhY2hfdGhyZWFkKGcscCkgeworCQkJaWYgKG1tID09IHAtPm1tICYmIHAgIT0gdHNrICYmCisJCQkgICAgcC0+cHRyYWNlICYmIHAtPnBhcmVudC0+bW0gPT0gbW0pIHsKKwkJCQlfX3B0cmFjZV91bmxpbmsocCk7CisJCQl9CisJCX0gd2hpbGVfZWFjaF90aHJlYWQoZyxwKTsKKwkJd3JpdGVfdW5sb2NrX2lycSgmdGFza2xpc3RfbG9jayk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjb3JlZHVtcF93YWl0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCURFQ0xBUkVfQ09NUExFVElPTihzdGFydHVwX2RvbmUpOworCisJbW0tPmNvcmVfd2FpdGVycysrOyAvKiBsZXQgb3RoZXIgdGhyZWFkcyBibG9jayAqLworCW1tLT5jb3JlX3N0YXJ0dXBfZG9uZSA9ICZzdGFydHVwX2RvbmU7CisKKwkvKiBnaXZlIG90aGVyIHRocmVhZHMgYSBjaGFuY2UgdG8gcnVuOiAqLworCXlpZWxkKCk7CisKKwl6YXBfdGhyZWFkcyhtbSk7CisJaWYgKC0tbW0tPmNvcmVfd2FpdGVycykgeworCQl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmc3RhcnR1cF9kb25lKTsKKwl9IGVsc2UKKwkJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisJQlVHX09OKG1tLT5jb3JlX3dhaXRlcnMpOworfQorCitpbnQgZG9fY29yZWR1bXAobG9uZyBzaWduciwgaW50IGV4aXRfY29kZSwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKQoreworCWNoYXIgY29yZW5hbWVbQ09SRU5BTUVfTUFYX1NJWkUgKyAxXTsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1cnJlbnQtPm1tOworCXN0cnVjdCBsaW51eF9iaW5mbXQgKiBiaW5mbXQ7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJc3RydWN0IGZpbGUgKiBmaWxlOworCWludCByZXR2YWwgPSAwOworCisJYmluZm10ID0gY3VycmVudC0+YmluZm10OworCWlmICghYmluZm10IHx8ICFiaW5mbXQtPmNvcmVfZHVtcCkKKwkJZ290byBmYWlsOworCWRvd25fd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisJaWYgKCFtbS0+ZHVtcGFibGUpIHsKKwkJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisJCWdvdG8gZmFpbDsKKwl9CisJbW0tPmR1bXBhYmxlID0gMDsKKwlpbml0X2NvbXBsZXRpb24oJm1tLT5jb3JlX2RvbmUpOworCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCWN1cnJlbnQtPnNpZ25hbC0+ZmxhZ3MgPSBTSUdOQUxfR1JPVVBfRVhJVDsKKwljdXJyZW50LT5zaWduYWwtPmdyb3VwX2V4aXRfY29kZSA9IGV4aXRfY29kZTsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCWNvcmVkdW1wX3dhaXQobW0pOworCisJLyoKKwkgKiBDbGVhciBhbnkgZmFsc2UgaW5kaWNhdGlvbiBvZiBwZW5kaW5nIHNpZ25hbHMgdGhhdCBtaWdodAorCSAqIGJlIHNlZW4gYnkgdGhlIGZpbGVzeXN0ZW0gY29kZSBjYWxsZWQgdG8gd3JpdGUgdGhlIGNvcmUgZmlsZS4KKwkgKi8KKwljdXJyZW50LT5zaWduYWwtPmdyb3VwX3N0b3BfY291bnQgPSAwOworCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9TSUdQRU5ESU5HKTsKKworCWlmIChjdXJyZW50LT5zaWduYWwtPnJsaW1bUkxJTUlUX0NPUkVdLnJsaW1fY3VyIDwgYmluZm10LT5taW5fY29yZWR1bXApCisJCWdvdG8gZmFpbF91bmxvY2s7CisKKwkvKgorCSAqIGxvY2tfa2VybmVsKCkgYmVjYXVzZSBmb3JtYXRfY29yZW5hbWUoKSBpcyBjb250cm9sbGVkIGJ5IHN5c2N0bCwgd2hpY2gKKwkgKiB1c2VzIGxvY2tfa2VybmVsKCkKKwkgKi8KKyAJbG9ja19rZXJuZWwoKTsKKwlmb3JtYXRfY29yZW5hbWUoY29yZW5hbWUsIGNvcmVfcGF0dGVybiwgc2lnbnIpOworCXVubG9ja19rZXJuZWwoKTsKKwlmaWxlID0gZmlscF9vcGVuKGNvcmVuYW1lLCBPX0NSRUFUIHwgMiB8IE9fTk9GT0xMT1cgfCBPX0xBUkdFRklMRSwgMDYwMCk7CisJaWYgKElTX0VSUihmaWxlKSkKKwkJZ290byBmYWlsX3VubG9jazsKKwlpbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCWlmIChpbm9kZS0+aV9ubGluayA+IDEpCisJCWdvdG8gY2xvc2VfZmFpbDsJLyogbXVsdGlwbGUgbGlua3MgLSBkb24ndCBkdW1wICovCisJaWYgKGRfdW5oYXNoZWQoZmlsZS0+Zl9kZW50cnkpKQorCQlnb3RvIGNsb3NlX2ZhaWw7CisKKwlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCisJCWdvdG8gY2xvc2VfZmFpbDsKKwlpZiAoIWZpbGUtPmZfb3ApCisJCWdvdG8gY2xvc2VfZmFpbDsKKwlpZiAoIWZpbGUtPmZfb3AtPndyaXRlKQorCQlnb3RvIGNsb3NlX2ZhaWw7CisJaWYgKGRvX3RydW5jYXRlKGZpbGUtPmZfZGVudHJ5LCAwKSAhPSAwKQorCQlnb3RvIGNsb3NlX2ZhaWw7CisKKwlyZXR2YWwgPSBiaW5mbXQtPmNvcmVfZHVtcChzaWduciwgcmVncywgZmlsZSk7CisKKwlpZiAocmV0dmFsKQorCQljdXJyZW50LT5zaWduYWwtPmdyb3VwX2V4aXRfY29kZSB8PSAweDgwOworY2xvc2VfZmFpbDoKKwlmaWxwX2Nsb3NlKGZpbGUsIE5VTEwpOworZmFpbF91bmxvY2s6CisJY29tcGxldGVfYWxsKCZtbS0+Y29yZV9kb25lKTsKK2ZhaWw6CisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL2ZzL2V4cG9ydGZzL01ha2VmaWxlIGIvZnMvZXhwb3J0ZnMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdjNWQ0ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4cG9ydGZzL01ha2VmaWxlCkBAIC0wLDAgKzEsNiBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGZpbGVzeXN0ZW0gZXhwb3J0IHN1cHBvcnQgcm91dGluZXMuCisKK29iai0kKENPTkZJR19FWFBPUlRGUykgKz0gZXhwb3J0ZnMubworCitleHBvcnRmcy1vYmpzIDo9IGV4cGZzLm8KZGlmZiAtLWdpdCBhL2ZzL2V4cG9ydGZzL2V4cGZzLmMgYi9mcy9leHBvcnRmcy9leHBmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0OWQ2MjUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHBvcnRmcy9leHBmcy5jCkBAIC0wLDAgKzEsNTQwIEBACisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisKK3N0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyBleHBvcnRfb3BfZGVmYXVsdDsKKworI2RlZmluZQlDQUxMKG9wcyxmdW4pICgob3BzLT5mdW4pPyhvcHMtPmZ1bik6ZXhwb3J0X29wX2RlZmF1bHQuZnVuKQorCisjZGVmaW5lIGRwcmludGsoZm10LCBhcmdzLi4uKSBkb3t9d2hpbGUoMCkKKworLyoqCisgKiBmaW5kX2V4cG9ydGVkX2RlbnRyeSAtIGhlbHBlciByb3V0aW5lIHRvIGltcGxlbWVudCBleHBvcnRfb3BlcmF0aW9ucy0+ZGVjb2RlX2ZoCisgKiBAc2I6CQlUaGUgJnN1cGVyX2Jsb2NrIGlkZW50aWZ5aW5nIHRoZSBmaWxlc3lzdGVtCisgKiBAb2JqOglBbiBvcGFxdWUgaWRlbnRpZmllciBvZiB0aGUgb2JqZWN0IHRvIGJlIGZvdW5kIC0gcGFzc2VkIHRvCisgKgkJZ2V0X2lub2RlCisgKiBAcGFyZW50OglBbiBvcHRpb25hbCBvcHFhdWUgaWRlbnRpZmllciBvZiB0aGUgcGFyZW50IG9mIHRoZSBvYmplY3QuCisgKiBAYWNjZXB0YWJsZToJQSBmdW5jdGlvbiB1c2VkIHRvIHRlc3QgcG9zc2libGUgJmRlbnRyaWVzIHRvIHNlZSBpZiB0aGV5IGFyZQorICoJCWFjY2VwdGFibGUKKyAqIEBjb250ZXh0OglBIHBhcmFtZXRlciB0byBAYWNjZXB0YWJsZSBzbyB0aGF0IGl0IGtub3dzIG9uIHdoYXQgYmFzaXMgdG8KKyAqCQlqdWRnZS4KKyAqCisgKiBmaW5kX2V4cG9ydGVkX2RlbnRyeSBpcyB0aGUgY2VudHJhbCBoZWxwZXIgcm91dGluZSB0byBlbmFibGUgZmlsZSBzeXN0ZW1zCisgKiB0byBwcm92aWRlIHRoZSBkZWNvZGVfZmgoKSBleHBvcnRfb3BlcmF0aW9uLiAgSXQncyBtYWluIHRhc2sgaXMgdG8gdGFrZQorICogYW4gJmlub2RlLCBmaW5kIG9yIGNyZWF0ZSBhbiBhcHByb3ByaWF0ZSAmZGVudHJ5IHN0cnVjdHVyZSwgYW5kIHBvc3NpYmx5CisgKiBzcGxpY2UgdGhpcyBpbnRvIHRoZSBkY2FjaGUgaW4gdGhlIGNvcnJlY3QgcGxhY2UuCisgKgorICogVGhlIGRlY29kZV9maCgpIG9wZXJhdGlvbiBwcm92aWRlZCBieSB0aGUgZmlsZXN5c3RlbSBzaG91bGQgY2FsbAorICogZmluZF9leHBvcnRlZF9kZW50cnkoKSB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlcnMgdGhhdCBpdCByZWNlaXZlZCBleGNlcHQKKyAqIHRoYXQgaW5zdGVhZCBvZiB0aGUgZmlsZSBoYW5kbGUgZnJhZ21lbnQsIHBvaW50ZXJzIHRvIG9wYXF1ZSBpZGVudGlmaWVycworICogZm9yIHRoZSBvYmplY3QgYW5kIG9wdGlvbmFsbHkgaXRzIHBhcmVudCBhcmUgcGFzc2VkLiAgVGhlIGRlZmF1bHQgZGVjb2RlX2ZoCisgKiByb3V0aW5lIHBhc3NlcyBvbmUgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGZpbGVoYW5kbGUgZnJhZ21lbnQsIGFuZAorICogb25lIDggYnl0ZXMgaW50byB0aGUgZnJhZ21lbnQuICBJdCBpcyBleHBlY3RlZCB0aGF0IG1vc3QgZmlsZXN5c3RlbXMgd2lsbAorICogdGFrZSB0aGlzIGFwcHJvYWNoLCB0aG91Z2ggdGhlIG9mZnNldCB0byB0aGUgcGFyZW50IGlkZW50aWZpZXIgbWF5IHdlbGwgYmUKKyAqIGRpZmZlcmVudC4KKyAqCisgKiBmaW5kX2V4cG9ydGVkX2RlbnRyeSgpIHdpbGwgY2FsbCBnZXRfZGVudHJ5IHRvIGdldCBhbiBkZW50cnkgcG9pbnRlciBmcm9tCisgKiB0aGUgZmlsZSBzeXN0ZW0uICBJZiBhbnkgJmRlbnRyeSBpbiB0aGUgZF9hbGlhcyBsaXN0IGlzIGFjY2VwdGFibGUsIGl0IHdpbGwKKyAqIGJlIHJldHVybmVkLiAgT3RoZXJ3aXNlIGZpbmRfZXhwb3J0ZWRfZGVudHJ5KCkgd2lsbCBhdHRlbXB0IHRvIHNwbGljZSBhIG5ldworICogJmRlbnRyeSBpbnRvIHRoZSBkY2FjaGUgdXNpbmcgZ2V0X25hbWUoKSBhbmQgZ2V0X3BhcmVudCgpIHRvIGZpbmQgdGhlCisgKiBhcHByb3ByaWF0ZSBwbGFjZS4KKyAqLworCitzdHJ1Y3QgZGVudHJ5ICoKK2ZpbmRfZXhwb3J0ZWRfZGVudHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKm9iaiwgdm9pZCAqcGFyZW50LAorCQkgICAgIGludCAoKmFjY2VwdGFibGUpKHZvaWQgKmNvbnRleHQsIHN0cnVjdCBkZW50cnkgKmRlKSwKKwkJICAgICB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBkZW50cnkgKnJlc3VsdCA9IE5VTEw7CisJc3RydWN0IGRlbnRyeSAqdGFyZ2V0X2RpcjsKKwlpbnQgZXJyOworCXN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyAqbm9wcyA9IHNiLT5zX2V4cG9ydF9vcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsZSwgKmhlYWQ7CisJc3RydWN0IGRlbnRyeSAqdG9wdXQgPSBOVUxMOworCWludCBub3Byb2dyZXNzOworCWNoYXIgbmJ1ZltOQU1FX01BWCsxXTsKKworCS8qCisJICogQXR0ZW1wdCB0byBmaW5kIHRoZSBpbm9kZS4KKwkgKi8KKwlyZXN1bHQgPSBDQUxMKHNiLT5zX2V4cG9ydF9vcCxnZXRfZGVudHJ5KShzYixvYmopOworCWVyciA9IC1FU1RBTEU7CisJaWYgKHJlc3VsdCA9PSBOVUxMKQorCQlnb3RvIGVycl9vdXQ7CisJaWYgKElTX0VSUihyZXN1bHQpKSB7CisJCWVyciA9IFBUUl9FUlIocmVzdWx0KTsKKwkJZ290byBlcnJfb3V0OworCX0KKwlpZiAoU19JU0RJUihyZXN1bHQtPmRfaW5vZGUtPmlfbW9kZSkgJiYKKwkgICAgKHJlc3VsdC0+ZF9mbGFncyAmIERDQUNIRV9ESVNDT05ORUNURUQpKSB7CisJCS8qIGl0IGlzIGFuIHVuY29ubmVjdGVkIGRpcmVjdG9yeSwgd2UgbXVzdCBjb25uZWN0IGl0ICovCisJCTsKKwl9IGVsc2UgeworCQlpZiAoYWNjZXB0YWJsZShjb250ZXh0LCByZXN1bHQpKQorCQkJcmV0dXJuIHJlc3VsdDsKKwkJaWYgKFNfSVNESVIocmVzdWx0LT5kX2lub2RlLT5pX21vZGUpKSB7CisJCQkvKiB0aGVyZSBpcyBubyBvdGhlciBkZW50cnksIHNvIGZhaWwgKi8KKwkJCWdvdG8gZXJyX3Jlc3VsdDsKKwkJfQorCQkvKiB0cnkgYW55IG90aGVyIGFsaWFzZXMgKi8KKwkJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJCWhlYWQgPSAmcmVzdWx0LT5kX2lub2RlLT5pX2RlbnRyeTsKKwkJbGlzdF9mb3JfZWFjaChsZSwgaGVhZCkgeworCQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gbGlzdF9lbnRyeShsZSwgc3RydWN0IGRlbnRyeSwgZF9hbGlhcyk7CisJCQlkZ2V0X2xvY2tlZChkZW50cnkpOworCQkJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwkJCWlmICh0b3B1dCkKKwkJCQlkcHV0KHRvcHV0KTsKKwkJCXRvcHV0ID0gTlVMTDsKKwkJCWlmIChkZW50cnkgIT0gcmVzdWx0ICYmCisJCQkgICAgYWNjZXB0YWJsZShjb250ZXh0LCBkZW50cnkpKSB7CisJCQkJZHB1dChyZXN1bHQpOworCQkJCXJldHVybiBkZW50cnk7CisJCQl9CisJCQlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwkJCXRvcHV0ID0gZGVudHJ5OworCQl9CisJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJCWlmICh0b3B1dCkKKwkJCWRwdXQodG9wdXQpOworCX0JCQkKKworCS8qIEl0J3MgYSBkaXJlY3RvcnksIG9yIHdlIGFyZSByZXF1aXJlZCB0byBjb25maXJtIHRoZSBmaWxlJ3MKKwkgKiBsb2NhdGlvbiBpbiB0aGUgdHJlZSBiYXNlZCBvbiB0aGUgcGFyZW50IGluZm9ybWF0aW9uCisgCSAqLworCWRwcmludGsoImZpbmRfZXhwb3J0ZWRfZGVudHJ5OiBuZWVkIHRvIGxvb2sgaGFyZGVyIGZvciAlcy8lZFxuIixzYi0+c19pZCwqKGludCopb2JqKTsKKwlpZiAoU19JU0RJUihyZXN1bHQtPmRfaW5vZGUtPmlfbW9kZSkpCisJCXRhcmdldF9kaXIgPSBkZ2V0KHJlc3VsdCk7CisJZWxzZSB7CisJCWlmIChwYXJlbnQgPT0gTlVMTCkKKwkJCWdvdG8gZXJyX3Jlc3VsdDsKKworCQl0YXJnZXRfZGlyID0gQ0FMTChzYi0+c19leHBvcnRfb3AsZ2V0X2RlbnRyeSkoc2IscGFyZW50KTsKKwkJaWYgKElTX0VSUih0YXJnZXRfZGlyKSkKKwkJCWVyciA9IFBUUl9FUlIodGFyZ2V0X2Rpcik7CisJCWlmICh0YXJnZXRfZGlyID09IE5VTEwgfHwgSVNfRVJSKHRhcmdldF9kaXIpKQorCQkJZ290byBlcnJfcmVzdWx0OworCX0KKwkvKgorCSAqIE5vdyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRhcmdldF9kaXIgaXMgcHJvcGVybHkgY29ubmVjdGVkLgorCSAqIEl0IG1heSBhbHJlYWR5IGJlLCBhcyB0aGUgZmxhZyBpc24ndCBhbHdheXMgdXBkYXRlZCB3aGVuIGNvbm5lY3Rpb24KKwkgKiBoYXBwZW5zLgorCSAqIFNvLCB3ZSB3YWxrIHVwIHBhcmVudCBsaW5rcyB1bnRpbCB3ZSBmaW5kIGEgY29ubmVjdGVkIGRpcmVjdG9yeSwKKwkgKiBvciB3ZSBydW4gb3V0IG9mIGRpcmVjdG9yaWVzLiAgVGhlbiB3ZSBmaW5kIHRoZSBwYXJlbnQsIGZpbmQKKwkgKiB0aGUgbmFtZSBvZiB0aGUgY2hpbGQgaW4gdGhhdCBwYXJlbnQsIGFuZCBkbyBhIGxvb2t1cC4KKwkgKiBUaGlzIHNob3VsZCBjb25uZWN0IHRoZSBjaGlsZCBpbnRvIHRoZSBwYXJlbnQKKwkgKiBXZSB0aGVuIHJlcGVhdC4KKwkgKi8KKworCS8qIGl0IGlzIHBvc3NpYmxlIHRoYXQgYSBjb25mdXNlZCBmaWxlIHN5c3RlbSBtaWdodCBub3QgbGV0IHVzIGNvbXBsZXRlIAorCSAqIHRoZSBwYXRoIHRvIHRoZSByb290LiAgRm9yIGV4YW1wbGUsIGlmIGdldF9wYXJlbnQgcmV0dXJucyBhIGRpcmVjdG9yeQorCSAqIGluIHdoaWNoIHdlIGNhbm5vdCBmaW5kIGEgbmFtZSBmb3IgdGhlIGNoaWxkLiAgV2hpbGUgdGhpcyBpbXBsaWVzIGEKKwkgKiB2ZXJ5IHNpY2sgZmlsZXN5c3RlbSB3ZSBkb24ndCB3YW50IGl0IHRvIGNhdXNlIGtuZnNkIHRvIHNwaW4uICBIZW5jZQorCSAqIHRoZSBub3Byb2dyZXNzIGNvdW50ZXIuICBJZiB3ZSBnbyB0aHJvdWdoIHRoZSBsb29wIDEwIHRpbWVzICgyIGlzCisJICogcHJvYmFibHkgZW5vdWdoKSB3aXRob3V0IGdldHRpbmcgYW55d2hlcmUsIHdlIGp1c3QgZ2l2ZSB1cAorCSAqLworCW5vcHJvZ3Jlc3M9IDA7CisJd2hpbGUgKHRhcmdldF9kaXItPmRfZmxhZ3MgJiBEQ0FDSEVfRElTQ09OTkVDVEVEICYmIG5vcHJvZ3Jlc3MrKyA8IDEwKSB7CisJCXN0cnVjdCBkZW50cnkgKnBkID0gdGFyZ2V0X2RpcjsKKworCQlkZ2V0KHBkKTsKKwkJc3Bpbl9sb2NrKCZwZC0+ZF9sb2NrKTsKKwkJd2hpbGUgKCFJU19ST09UKHBkKSAmJgorCQkJCShwZC0+ZF9wYXJlbnQtPmRfZmxhZ3MmRENBQ0hFX0RJU0NPTk5FQ1RFRCkpIHsKKwkJCXN0cnVjdCBkZW50cnkgKnBhcmVudCA9IHBkLT5kX3BhcmVudDsKKworCQkJZGdldChwYXJlbnQpOworCQkJc3Bpbl91bmxvY2soJnBkLT5kX2xvY2spOworCQkJZHB1dChwZCk7CisJCQlwZCA9IHBhcmVudDsKKwkJCXNwaW5fbG9jaygmcGQtPmRfbG9jayk7CisJCX0KKwkJc3Bpbl91bmxvY2soJnBkLT5kX2xvY2spOworCisJCWlmICghSVNfUk9PVChwZCkpIHsKKwkJCS8qIG11c3QgaGF2ZSBmb3VuZCBhIGNvbm5lY3RlZCBwYXJlbnQgLSBncmVhdCAqLworCQkJc3Bpbl9sb2NrKCZwZC0+ZF9sb2NrKTsKKwkJCXBkLT5kX2ZsYWdzICY9IH5EQ0FDSEVfRElTQ09OTkVDVEVEOworCQkJc3Bpbl91bmxvY2soJnBkLT5kX2xvY2spOworCQkJbm9wcm9ncmVzcyA9IDA7CisJCX0gZWxzZSBpZiAocGQgPT0gc2ItPnNfcm9vdCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJleHBvcnQ6IEVlZWsgZmlsZXN5c3RlbSByb290IGlzIG5vdCBjb25uZWN0ZWQsIGltcG9zc2libGVcbiIpOworCQkJc3Bpbl9sb2NrKCZwZC0+ZF9sb2NrKTsKKwkJCXBkLT5kX2ZsYWdzICY9IH5EQ0FDSEVfRElTQ09OTkVDVEVEOworCQkJc3Bpbl91bmxvY2soJnBkLT5kX2xvY2spOworCQkJbm9wcm9ncmVzcyA9IDA7CisJCX0gZWxzZSB7CisJCQkvKiB3ZSBoYXZlIGhpdCB0aGUgdG9wIG9mIGEgZGlzY29ubmVjdGVkIHBhdGguICBUcnkKKwkJCSAqIHRvIGZpbmQgcGFyZW50IGFuZCBjb25uZWN0CisJCQkgKiBub3RlOiByYWNpbmcgd2l0aCBzb21lIG90aGVyIHByb2Nlc3MgcmVuYW1pbmcgYQorCQkJICogZGlyZWN0b3J5IGlzbid0IG11Y2ggb2YgYSBwcm9ibGVtIGhlcmUuICBJZiBzb21lb25lCisJCQkgKiByZW5hbWVzIHRoZSBkaXJlY3RvcnksIGl0IHdpbGwgZW5kIHVwIHByb3Blcmx5CisJCQkgKiBjb25uZWN0ZWQsIHdoaWNoIGlzIHdoYXQgd2Ugd2FudAorCQkJICovCisJCQlzdHJ1Y3QgZGVudHJ5ICpwcGQ7CisJCQlzdHJ1Y3QgZGVudHJ5ICpucGQ7CisKKwkJCWRvd24oJnBkLT5kX2lub2RlLT5pX3NlbSk7CisJCQlwcGQgPSBDQUxMKG5vcHMsZ2V0X3BhcmVudCkocGQpOworCQkJdXAoJnBkLT5kX2lub2RlLT5pX3NlbSk7CisKKwkJCWlmIChJU19FUlIocHBkKSkgeworCQkJCWVyciA9IFBUUl9FUlIocHBkKTsKKwkJCQlkcHJpbnRrKCJmaW5kX2V4cG9ydGVkX2RlbnRyeTogZ2V0X3BhcmVudCBvZiAlbGQgZmFpbGVkLCBlcnIgJWRcbiIsCisJCQkJCXBkLT5kX2lub2RlLT5pX2lubywgZXJyKTsKKwkJCQlkcHV0KHBkKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWRwcmludGsoImZpbmRfZXhwb3J0ZWRfZGVudHJ5OiBmaW5kIG5hbWUgb2YgJWx1IGluICVsdVxuIiwgcGQtPmRfaW5vZGUtPmlfaW5vLCBwcGQtPmRfaW5vZGUtPmlfaW5vKTsKKwkJCWVyciA9IENBTEwobm9wcyxnZXRfbmFtZSkocHBkLCBuYnVmLCBwZCk7CisJCQlpZiAoZXJyKSB7CisJCQkJZHB1dChwcGQpOworCQkJCWRwdXQocGQpOworCQkJCWlmIChlcnIgPT0gLUVOT0VOVCkKKwkJCQkJLyogc29tZSByYWNlIGJldHdlZW4gZ2V0X3BhcmVudCBhbmQKKwkJCQkJICogZ2V0X25hbWU/ICBqdXN0IHRyeSBhZ2FpbgorCQkJCQkgKi8KKwkJCQkJY29udGludWU7CisJCQkJYnJlYWs7CisJCQl9CisJCQlkcHJpbnRrKCJmaW5kX2V4cG9ydGVkX2RlbnRyeTogZm91bmQgbmFtZTogJXNcbiIsIG5idWYpOworCQkJZG93bigmcHBkLT5kX2lub2RlLT5pX3NlbSk7CisJCQlucGQgPSBsb29rdXBfb25lX2xlbihuYnVmLCBwcGQsIHN0cmxlbihuYnVmKSk7CisJCQl1cCgmcHBkLT5kX2lub2RlLT5pX3NlbSk7CisJCQlpZiAoSVNfRVJSKG5wZCkpIHsKKwkJCQllcnIgPSBQVFJfRVJSKG5wZCk7CisJCQkJZHByaW50aygiZmluZF9leHBvcnRlZF9kZW50cnk6IGxvb2t1cCBmYWlsZWQ6ICVkXG4iLCBlcnIpOworCQkJCWRwdXQocHBkKTsKKwkJCQlkcHV0KHBkKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIHdlIGRpZG4ndCByZWFsbHkgd2FudCBucGQsIHdlIHJlYWxseSB3YW50ZWQKKwkJCSAqIGEgc2lkZS1lZmZlY3Qgb2YgdGhlIGxvb2t1cC4KKwkJCSAqIGhvcGVmdWxseSwgbnBkID09IHBkLCB0aG91Z2ggaXQgaXNuJ3QgcmVhbGx5CisJCQkgKiBhIHByb2JsZW0gaWYgaXQgaXNuJ3QKKwkJCSAqLworCQkJaWYgKG5wZCA9PSBwZCkKKwkJCQlub3Byb2dyZXNzID0gMDsKKwkJCWVsc2UKKwkJCQlwcmludGsoImZpbmRfZXhwb3J0ZWRfZGVudHJ5OiBucGQgIT0gcGRcbiIpOworCQkJZHB1dChucGQpOworCQkJZHB1dChwcGQpOworCQkJaWYgKElTX1JPT1QocGQpKSB7CisJCQkJLyogc29tZXRoaW5nIHdlbnQgd3JvbmcsIHdlIGhhdmUgdG8gZ2l2ZSB1cCAqLworCQkJCWRwdXQocGQpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWRwdXQocGQpOworCX0KKworCWlmICh0YXJnZXRfZGlyLT5kX2ZsYWdzICYgRENBQ0hFX0RJU0NPTk5FQ1RFRCkgeworCQkvKiBzb21ldGhpbmcgd2VudCB3cm9uZyAtIG9oLXdlbGwgKi8KKwkJaWYgKCFlcnIpCisJCQllcnIgPSAtRVNUQUxFOworCQlnb3RvIGVycl90YXJnZXQ7CisJfQorCS8qIGlmIHdlIHdlcmVuJ3QgYWZ0ZXIgYSBkaXJlY3RvcnksIGhhdmUgb25lIG1vcmUgc3RlcCB0byBnbyAqLworCWlmIChyZXN1bHQgIT0gdGFyZ2V0X2RpcikgeworCQlzdHJ1Y3QgZGVudHJ5ICpucmVzdWx0OworCQllcnIgPSBDQUxMKG5vcHMsZ2V0X25hbWUpKHRhcmdldF9kaXIsIG5idWYsIHJlc3VsdCk7CisJCWlmICghZXJyKSB7CisJCQlkb3duKCZ0YXJnZXRfZGlyLT5kX2lub2RlLT5pX3NlbSk7CisJCQlucmVzdWx0ID0gbG9va3VwX29uZV9sZW4obmJ1ZiwgdGFyZ2V0X2Rpciwgc3RybGVuKG5idWYpKTsKKwkJCXVwKCZ0YXJnZXRfZGlyLT5kX2lub2RlLT5pX3NlbSk7CisJCQlpZiAoIUlTX0VSUihucmVzdWx0KSkgeworCQkJCWlmIChucmVzdWx0LT5kX2lub2RlKSB7CisJCQkJCWRwdXQocmVzdWx0KTsKKwkJCQkJcmVzdWx0ID0gbnJlc3VsdDsKKwkJCQl9IGVsc2UKKwkJCQkJZHB1dChucmVzdWx0KTsKKwkJCX0KKwkJfQorCX0KKwlkcHV0KHRhcmdldF9kaXIpOworCS8qIG5vdyByZXN1bHQgaXMgcHJvcGVybHkgY29ubmVjdGVkLCBpdCBpcyBvdXIgYmVzdCBiZXQgKi8KKwlpZiAoYWNjZXB0YWJsZShjb250ZXh0LCByZXN1bHQpKQorCQlyZXR1cm4gcmVzdWx0OworCS8qIG9uZSBsYXN0IHRyeSBvZiB0aGUgYWxpYXNlcy4uICovCisJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJdG9wdXQgPSBOVUxMOworCWhlYWQgPSAmcmVzdWx0LT5kX2lub2RlLT5pX2RlbnRyeTsKKwlsaXN0X2Zvcl9lYWNoKGxlLCBoZWFkKSB7CisJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGxpc3RfZW50cnkobGUsIHN0cnVjdCBkZW50cnksIGRfYWxpYXMpOworCQlkZ2V0X2xvY2tlZChkZW50cnkpOworCQlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCQlpZiAodG9wdXQpIGRwdXQodG9wdXQpOworCQlpZiAoZGVudHJ5ICE9IHJlc3VsdCAmJgorCQkgICAgYWNjZXB0YWJsZShjb250ZXh0LCBkZW50cnkpKSB7CisJCQlkcHV0KHJlc3VsdCk7CisJCQlyZXR1cm4gZGVudHJ5OworCQl9CisJCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCQl0b3B1dCA9IGRlbnRyeTsKKwl9CisJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwlpZiAodG9wdXQpCisJCWRwdXQodG9wdXQpOworCisJLyogZHJhdCAtIEkganVzdCBjYW5ub3QgZmluZCBhbnl0aGluZyBhY2NlcHRhYmxlICovCisJZHB1dChyZXN1bHQpOworCS8qIEl0IG1pZ2h0IGJlIGp1c3RpZmlhYmxlIHRvIHJldHVybiBFU1RBTEUgaGVyZSwKKwkgKiBidXQgdGhlIGZpbGVoYW5kbGUgYXQtbGVhc3QgbG9va3MgcmVhc29uYWJsZSBnb29kCisJICogYW5kIGl0IGp1c3QgYmUgYSBwZXJtaXNzaW9uIHByb2JsZW0sIHNvIHJldHVybmluZworCSAqIC1FQUNDRVNTIGlzIHNhZmVyCisJICovCisJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CisKKyBlcnJfdGFyZ2V0OgorCWRwdXQodGFyZ2V0X2Rpcik7CisgZXJyX3Jlc3VsdDoKKwlkcHV0KHJlc3VsdCk7CisgZXJyX291dDoKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCisKKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmdldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqY2hpbGQpCit7CisJLyogZ2V0X3BhcmVudCBjYW5ub3QgYmUgc3VwcG9ydGVkIGdlbmVyaWNhbGx5LCB0aGUgbG9ja2luZworCSAqIGlzIHRvbyBpY2t5LgorCSAqIGluc3RlYWQsIHdlIGp1c3QgcmV0dXJuIEVBQ0NFUy4gIElmIHNlcnZlciByZWJvb3RzIG9yIGlub2RlcworCSAqIGdldCBmbHVzaGVkLCB5b3UgbG9zZQorCSAqLworCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworfQorCisKK3N0cnVjdCBnZXRkZW50c19jYWxsYmFjayB7CisJY2hhciAqbmFtZTsJCS8qIG5hbWUgdGhhdCB3YXMgZm91bmQuIEl0IGFscmVhZHkgcG9pbnRzIHRvIGEKKwkJCQkgICBidWZmZXIgTkFNRV9NQVgrMSBpcyBzaXplICovCisJdW5zaWduZWQgbG9uZyBpbm87CS8qIHRoZSBpbnVtIHdlIGFyZSBsb29raW5nIGZvciAqLworCWludCBmb3VuZDsJCS8qIGlub2RlIG1hdGNoZWQ/ICovCisJaW50IHNlcXVlbmNlOwkJLyogc2VxdWVuY2UgY291bnRlciAqLworfTsKKworLyoKKyAqIEEgcmF0aGVyIHN0cmFuZ2UgZmlsbGRpciBmdW5jdGlvbiB0byBjYXB0dXJlCisgKiB0aGUgbmFtZSBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIGlub2RlIG51bWJlci4KKyAqLworc3RhdGljIGludCBmaWxsZGlyX29uZSh2b2lkICogX19idWYsIGNvbnN0IGNoYXIgKiBuYW1lLCBpbnQgbGVuLAorCQkJbG9mZl90IHBvcywgaW5vX3QgaW5vLCB1bnNpZ25lZCBpbnQgZF90eXBlKQoreworCXN0cnVjdCBnZXRkZW50c19jYWxsYmFjayAqYnVmID0gX19idWY7CisJaW50IHJlc3VsdCA9IDA7CisKKwlidWYtPnNlcXVlbmNlKys7CisJaWYgKGJ1Zi0+aW5vID09IGlubykgeworCQltZW1jcHkoYnVmLT5uYW1lLCBuYW1lLCBsZW4pOworCQlidWYtPm5hbWVbbGVuXSA9ICdcMCc7CisJCWJ1Zi0+Zm91bmQgPSAxOworCQlyZXN1bHQgPSAtMTsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBnZXRfbmFtZSAtIGRlZmF1bHQgZXhwb3J0X29wZXJhdGlvbnMtPmdldF9uYW1lIGZ1bmN0aW9uCisgKiBAZGVudHJ5OiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRvIGZpbmQgYSBuYW1lCisgKiBAbmFtZTogICBhIHBvaW50ZXIgdG8gYSAlTkFNRV9NQVgrMSBjaGFyIGJ1ZmZlciB0byBzdG9yZSB0aGUgbmFtZQorICogQGNoaWxkOiAgdGhlIGRlbnRyeSBmb3IgdGhlIGNoaWxkIGRpcmVjdG9yeS4KKyAqCisgKiBjYWxscyByZWFkZGlyIG9uIHRoZSBwYXJlbnQgdW50aWwgaXQgZmluZHMgYW4gZW50cnkgd2l0aAorICogdGhlIHNhbWUgaW5vZGUgbnVtYmVyIGFzIHRoZSBjaGlsZCwgYW5kIHJldHVybnMgdGhhdC4KKyAqLworc3RhdGljIGludCBnZXRfbmFtZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgKm5hbWUsCisJCQlzdHJ1Y3QgZGVudHJ5ICpjaGlsZCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmRpciA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgZXJyb3I7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJc3RydWN0IGdldGRlbnRzX2NhbGxiYWNrIGJ1ZmZlcjsKKworCWVycm9yID0gLUVOT1RESVI7CisJaWYgKCFkaXIgfHwgIVNfSVNESVIoZGlyLT5pX21vZGUpKQorCQlnb3RvIG91dDsKKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKCFkaXItPmlfZm9wKQorCQlnb3RvIG91dDsKKwkvKgorCSAqIE9wZW4gdGhlIGRpcmVjdG9yeSAuLi4KKwkgKi8KKwlmaWxlID0gZGVudHJ5X29wZW4oZGdldChkZW50cnkpLCBOVUxMLCBPX1JET05MWSk7CisJZXJyb3IgPSBQVFJfRVJSKGZpbGUpOworCWlmIChJU19FUlIoZmlsZSkpCisJCWdvdG8gb3V0OworCisJZXJyb3IgPSAtRUlOVkFMOworCWlmICghZmlsZS0+Zl9vcC0+cmVhZGRpcikKKwkJZ290byBvdXRfY2xvc2U7CisKKwlidWZmZXIubmFtZSA9IG5hbWU7CisJYnVmZmVyLmlubyA9IGNoaWxkLT5kX2lub2RlLT5pX2lubzsKKwlidWZmZXIuZm91bmQgPSAwOworCWJ1ZmZlci5zZXF1ZW5jZSA9IDA7CisJd2hpbGUgKDEpIHsKKwkJaW50IG9sZF9zZXEgPSBidWZmZXIuc2VxdWVuY2U7CisKKwkJZXJyb3IgPSB2ZnNfcmVhZGRpcihmaWxlLCBmaWxsZGlyX29uZSwgJmJ1ZmZlcik7CisKKwkJaWYgKGVycm9yIDwgMCkKKwkJCWJyZWFrOworCisJCWVycm9yID0gMDsKKwkJaWYgKGJ1ZmZlci5mb3VuZCkKKwkJCWJyZWFrOworCQllcnJvciA9IC1FTk9FTlQ7CisJCWlmIChvbGRfc2VxID09IGJ1ZmZlci5zZXF1ZW5jZSkKKwkJCWJyZWFrOworCX0KKworb3V0X2Nsb3NlOgorCWZwdXQoZmlsZSk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpleHBvcnRfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBsb25nIGlubywgX191MzIgZ2VuZXJhdGlvbikKK3sKKworCS8qIGlnZXQgaXNuJ3QgcmVhbGx5IHJpZ2h0IGlmIHRoZSBpbm9kZSBpcyBjdXJyZW50bHkgdW5hbGxvY2F0ZWQhIQorCSAqIFRoaXMgc2hvdWxkIHJlYWxseSBhbGwgYmUgZG9uZSBpbnNpZGUgZWFjaCBmaWxlc3lzdGVtCisJICoKKwkgKiBleHQyZnMnIHJlYWRfaW5vZGUgaGFzIGJlZW4gc3RyZW5ndGhlZCB0byByZXR1cm4gYSBiYWRfaW5vZGUgaWYKKwkgKiB0aGUgaW5vZGUgaGFkIGJlZW4gZGVsZXRlZC4KKwkgKgorCSAqIEN1cnJlbnRseSB3ZSBkb24ndCBrbm93IHRoZSBnZW5lcmF0aW9uIGZvciBwYXJlbnQgZGlyZWN0b3J5LCBzbworCSAqIGEgZ2VuZXJhdGlvbiBvZiAwIG1lYW5zICJhY2NlcHQgYW55IgorCSAqLworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGRlbnRyeSAqcmVzdWx0OworCWlmIChpbm8gPT0gMCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVTVEFMRSk7CisJaW5vZGUgPSBpZ2V0KHNiLCBpbm8pOworCWlmIChpbm9kZSA9PSBOVUxMKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlpZiAoaXNfYmFkX2lub2RlKGlub2RlKQorCSAgICB8fCAoZ2VuZXJhdGlvbiAmJiBpbm9kZS0+aV9nZW5lcmF0aW9uICE9IGdlbmVyYXRpb24pCisJCSkgeworCQkvKiB3ZSBkaWRuJ3QgZmluZCB0aGUgcmlnaHQgaW5vZGUuLiAqLworCQlkcHJpbnRrKCJmaF92ZXJpZnk6IElub2RlICVsdSwgQmFkIGNvdW50OiAlZCAlZCBvciB2ZXJzaW9uICAldSAldVxuIiwKKwkJCWlub2RlLT5pX2lubywKKwkJCWlub2RlLT5pX25saW5rLCBhdG9taWNfcmVhZCgmaW5vZGUtPmlfY291bnQpLAorCQkJaW5vZGUtPmlfZ2VuZXJhdGlvbiwKKwkJCWdlbmVyYXRpb24pOworCisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gRVJSX1BUUigtRVNUQUxFKTsKKwl9CisJLyogbm93IHRvIGZpbmQgYSBkZW50cnkuCisJICogSWYgcG9zc2libGUsIGdldCBhIHdlbGwtY29ubmVjdGVkIG9uZQorCSAqLworCXJlc3VsdCA9IGRfYWxsb2NfYW5vbihpbm9kZSk7CisJaWYgKCFyZXN1bHQpIHsKKwkJaXB1dChpbm9kZSk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpnZXRfb2JqZWN0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKnZvYmpwKQoreworCV9fdTMyICpvYmpwID0gdm9ianA7CisJdW5zaWduZWQgbG9uZyBpbm8gPSBvYmpwWzBdOworCV9fdTMyIGdlbmVyYXRpb24gPSBvYmpwWzFdOworCisJcmV0dXJuIGV4cG9ydF9pZ2V0KHNiLCBpbm8sIGdlbmVyYXRpb24pOworfQorCisKKy8qKgorICogZXhwb3J0X2VuY29kZV9maCAtIGRlZmF1bHQgZXhwb3J0X29wZXJhdGlvbnMtPmVuY29kZV9maCBmdW5jdGlvbgorICogQGRlbnRyeTogIHRoZSBkZW50cnkgdG8gZW5jb2RlCisgKiBAZmg6ICAgICAgd2hlcmUgdG8gc3RvcmUgdGhlIGZpbGUgaGFuZGxlIGZyYWdtZW50CisgKiBAbWF4X2xlbjogbWF4aW11bSBsZW5ndGggdG8gc3RvcmUgdGhlcmUKKyAqIEBjb25uZWN0YWJsZTogd2hldGhlciB0byBzdG9yZSBwYXJlbnQgaW5mb3JtYXRpb24KKyAqCisgKiBUaGlzIGRlZmF1bHQgZW5jb2RlX2ZoIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB0aGUgMzIgaW5vZGUgbnVtYmVyCisgKiBpcyBzdWl0YWJsZSBmb3IgbG9jYXRpbmcgYW4gaW5vZGUsIGFuZCB0aGF0IHRoZSBnZW5lcmF0aW9uIG51bWJlcgorICogY2FuIGJlIHVzZWQgdG8gY2hlY2sgdGhhdCBpdCBpcyBzdGlsbCB2YWxpZC4gIEl0IHBsYWNlcyB0aGVtIGluIHRoZQorICogZmlsZWhhbmRsZSBmcmFnbWVudCB3aGVyZSBleHBvcnRfZGVjb2RlX2ZoIGV4cGVjdHMgdG8gZmluZCB0aGVtLgorICovCitzdGF0aWMgaW50IGV4cG9ydF9lbmNvZGVfZmgoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBfX3UzMiAqZmgsIGludCAqbWF4X2xlbiwKKwkJICAgaW50IGNvbm5lY3RhYmxlKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludCBsZW4gPSAqbWF4X2xlbjsKKwlpbnQgdHlwZSA9IDE7CisJCisJaWYgKGxlbiA8IDIgfHwgKGNvbm5lY3RhYmxlICYmIGxlbiA8IDQpKQorCQlyZXR1cm4gMjU1OworCisJbGVuID0gMjsKKwlmaFswXSA9IGlub2RlLT5pX2lubzsKKwlmaFsxXSA9IGlub2RlLT5pX2dlbmVyYXRpb247CisJaWYgKGNvbm5lY3RhYmxlICYmICFTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCXN0cnVjdCBpbm9kZSAqcGFyZW50OworCisJCXNwaW5fbG9jaygmZGVudHJ5LT5kX2xvY2spOworCQlwYXJlbnQgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOworCQlmaFsyXSA9IHBhcmVudC0+aV9pbm87CisJCWZoWzNdID0gcGFyZW50LT5pX2dlbmVyYXRpb247CisJCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CisJCWxlbiA9IDQ7CisJCXR5cGUgPSAyOworCX0KKwkqbWF4X2xlbiA9IGxlbjsKKwlyZXR1cm4gdHlwZTsKK30KKworCisvKioKKyAqIGV4cG9ydF9kZWNvZGVfZmggLSBkZWZhdWx0IGV4cG9ydF9vcGVyYXRpb25zLT5kZWNvZGVfZmggZnVuY3Rpb24KKyAqIEBzYjogIFRoZSBzdXBlcmJsb2NrCisgKiBAZmg6ICBwb2ludGVyIHRvIHRoZSBmaWxlIGhhbmRsZSBmcmFnbWVudAorICogQGZoX2xlbjogbGVuZ3RoIG9mIGZpbGUgaGFuZGxlIGZyYWdtZW50CisgKiBAYWNjZXB0YWJsZTogZnVuY3Rpb24gZm9yIHRlc3RpbmcgYWNjZXB0YWJpbGl0eSBvZiBkZW50cnlzCisgKiBAY29udGV4dDogICBjb250ZXh0IGZvciBAYWNjZXB0YWJsZQorICoKKyAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgZGVjb2RlX2ZoKCkgZnVuY3Rpb24uCisgKiBhIGZpbGVpZF90eXBlIG9mIDEgaW5kaWNhdGVzIHRoYXQgdGhlIGZpbGVoYW5kbGVmcmFnbWVudAorICoganVzdCBjb250YWlucyBhbiBvYmplY3QgaWRlbnRpZmllciB1bmRlcnN0b29kIGJ5ICBnZXRfZGVudHJ5LgorICogYSBmaWxlaWRfdHlwZSBvZiAyIHNheXMgdGhhdCB0aGVyZSBpcyBhbHNvIGEgZGlyZWN0b3J5CisgKiBpZGVudGlmaWVyIDggYnl0ZXMgaW4gdG8gdGhlIGZpbGVoYW5kbGVmcmFnZW1lbnQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpleHBvcnRfZGVjb2RlX2ZoKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIF9fdTMyICpmaCwgaW50IGZoX2xlbiwKKwkJCSAgICAgIGludCBmaWxlaWRfdHlwZSwKKwkJCSBpbnQgKCphY2NlcHRhYmxlKSh2b2lkICpjb250ZXh0LCBzdHJ1Y3QgZGVudHJ5ICpkZSksCisJCQkgdm9pZCAqY29udGV4dCkKK3sKKwlfX3UzMiBwYXJlbnRbMl07CisJcGFyZW50WzBdID0gcGFyZW50WzFdID0gMDsKKwlpZiAoZmhfbGVuIDwgMiB8fCBmaWxlaWRfdHlwZSA+IDIpCisJCXJldHVybiBOVUxMOworCWlmIChmaWxlaWRfdHlwZSA9PSAyKSB7CisJCWlmIChmaF9sZW4gPiAyKSBwYXJlbnRbMF0gPSBmaFsyXTsKKwkJaWYgKGZoX2xlbiA+IDMpIHBhcmVudFsxXSA9IGZoWzNdOworCX0KKwlyZXR1cm4gZmluZF9leHBvcnRlZF9kZW50cnkoc2IsIGZoLCBwYXJlbnQsCisJCQkJICAgYWNjZXB0YWJsZSwgY29udGV4dCk7Cit9CisKK3N0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyBleHBvcnRfb3BfZGVmYXVsdCA9IHsKKwkuZGVjb2RlX2ZoCT0gZXhwb3J0X2RlY29kZV9maCwKKwkuZW5jb2RlX2ZoCT0gZXhwb3J0X2VuY29kZV9maCwKKworCS5nZXRfbmFtZQk9IGdldF9uYW1lLAorCS5nZXRfcGFyZW50CT0gZ2V0X3BhcmVudCwKKwkuZ2V0X2RlbnRyeQk9IGdldF9vYmplY3QsCit9OworCitFWFBPUlRfU1lNQk9MKGV4cG9ydF9vcF9kZWZhdWx0KTsKK0VYUE9SVF9TWU1CT0woZmluZF9leHBvcnRlZF9kZW50cnkpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9mcy9leHQyL0NIQU5HRVMgYi9mcy9leHQyL0NIQU5HRVMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE1YWFmMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDIvQ0hBTkdFUwpAQCAtMCwwICsxLDE1NyBAQAorQ2hhbmdlcyBmcm9tIHZlcnNpb24gMC41YSB0byB2ZXJzaW9uIDAuNWIKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLSBOb3cgdGhhdCB3ZSBoYXZlIHN5c2N0bCgpLCB0aGUgaW1tdXRhYmxlIGZsYWcgY2Fubm90IGJlIGNoYW5nZWQgd2hlbgorCSAgdGhlIHN5c3RlbSBpcyBydW5uaW5nIGF0IHNlY3VyaXR5IGxldmVsID4gMC4KKwktIFNvbWUgY2xlYW51cHMgaW4gdGhlIGNvZGUuCisJLSBNb3JlIGNvbnNpc3RlbmN5IGNoZWNrcyBvbiBkaXJlY3Rvcmllcy4KKwktIFRoZSBleHQyLmRpZmYgcGF0Y2ggZnJvbSBUb20gTWF5IDxmdG9tQG5ldGNvbS5jb20+IGhhcyBiZWVuCisJICBpbnRlZ3JhdGVkLiAgVGhpcyBwYXRjaCByZXBsYWNlcyBleHBlbnNpdmUgIi8iIGFuZCAiJSIgd2l0aAorCSAgY2hlYXAgIj4+IiBhbmQgIiYiIHdoZXJlIHBvc3NpYmxlLgorCitDaGFuZ2VzIGZyb20gdmVyc2lvbiAwLjUgdG8gdmVyc2lvbiAwLjVhCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJLSBaZXJvIHRoZSBwYXJ0aWFsIGJsb2NrIGZvbGxvd2luZyB0aGUgZW5kIG9mIHRoZSBmaWxlIHdoZW4gYSBmaWxlCisJICBpcyB0cnVuY2F0ZWQuCisJLSBEYXRlcyB1cGRhdGVkIGluIHRoZSBjb3B5cmlnaHQuCisJLSBNb3JlIGNoZWNrcyB3aGVuIHRoZSBmaWxlc3lzdGVtIGlzIG1vdW50ZWQ6IHRoZSBjb3VudCBvZiBibG9ja3MsCisJICBmcmFnbWVudHMsIGFuZCBpbm9kZXMgcGVyIGdyb3VwIGlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgYmxvY2sgc2l6ZS4KKwktIFRoZSBidWZmZXJzIHVzZWQgYnkgdGhlIGVycm9yIHJvdXRpbmVzIGFyZSBub3cgc3RhdGljIHZhcmlhYmxlcywgdG8KKwkgIGF2b2lkIHVzaW5nIHNwYWNlIG9uIHRoZSBrZXJuZWwgc3RhY2ssIGFzIHJlcXVlc3RlZCBieSBMaW51cy4KKwktIFNvbWUgY2xlYW51cHMgaW4gdGhlIGVycm9yIG1lc3NhZ2VzIChzb21lIHZlcnNpb25zIG9mIHN5c2xvZyBjb250YWluCisJICBhIGJ1ZyB3aGljaCB0cnVuY2F0ZXMgYW4gZXJyb3IgbWVzc2FnZSBpZiBpdCBjb250YWlucyAnXG4nKS4KKwktIENoZWNrIHRoYXQgbm8gZGF0YSBjYW4gYmUgd3JpdHRlbiB0byBhIGZpbGUgcGFzdCB0aGUgMkdCIGxpbWl0LgorCS0gVGhlIGZhbW91cyByZWFkZGlyKCkgYnVnIGhhcyBiZWVuIGZpeGVkIGJ5IFN0ZXBoZW4gVHdlZWRpZS4KKwktIEFkZGVkIGEgcmV2aXNpb24gbGV2ZWwgaW4gdGhlIHN1cGVyYmxvY2suCisJLSBGdWxsIHN1cHBvcnQgZm9yIE9fU1lOQyBmbGFnIG9mIHRoZSBvcGVuIHN5c3RlbSBjYWxsLgorCS0gTmV3IG1vdW50IG9wdGlvbnM6IGByZXN1aWQ9I3VpZCcgYW5kIGByZXNnaWQ9I2dpZCcuICBgcmVzdWlkJyBjYXVzZXMKKwkgIGV4dDJmcyB0byBjb25zaWRlciB1c2VyICN1aWQgbGlrZSByb290IGZvciB0aGUgcmVzZXJ2ZWQgYmxvY2tzLgorCSAgYHJlc2dpZCcgYWN0cyB0aGUgc2FtZSB3YXkgd2l0aCBncm91cCAjZ2lkLiAgTmV3IGZpZWxkcyBpbiB0aGUKKwkgIHN1cGVyYmxvY2sgY29udGFpbiBkZWZhdWx0IHZhbHVlcyBmb3IgcmVzdWlkIGFuZCByZXNnaWQgYW5kIGNhbgorCSAgYmUgbW9kaWZpZWQgYnkgdHVuZTJmcy4KKwkgIElkZWEgY29tZXMgZnJvbSBSZW5lIENvdWduZW5jIDxjb3VnbmVuY0ByZW51eC5mcm11Zy5mci5uZXQ+LgorCS0gTmV3IG1vdW50IG9wdGlvbnM6IGBic2RkZicgYW5kIGBtaW5peGRmJy4gIGBic2RkZicgY2F1c2VzIGV4dDJmcworCSAgdG8gcmVtb3ZlIHRoZSBibG9ja3MgdXNlZCBmb3IgRlMgc3RydWN0dXJlcyBmcm9tIHRoZSB0b3RhbCBibG9jaworCSAgY291bnQgaW4gc3RhdGZzLiAgV2l0aCBgbWluaXhkZicsIGV4dDJmcyBtaW1pY3MgTWluaXggYmVoYXZpb3IKKwkgIGluIHN0YXRmcyAoaS5lLiBpdCByZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgYmxvY2tzIG9uIHRoZQorCSAgcGFydGl0aW9uKS4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gbWFrZSBiZGUgaGFwcHkgOi0pCisJLSBOZXcgZmlsZSBhdHRyaWJ1dGVzOgorCSAgLSBJbW11dGFibGUgZmlsZXMgY2Fubm90IGJlIG1vZGlmaWVkLiAgRGF0YSBjYW5ub3QgYmUgd3JpdHRlbiB0bworCSAgICB0aGVzZSBmaWxlcy4gIFRoZXkgY2Fubm90IGJlIHJlbW92ZWQsIHJlbmFtZWQgYW5kIG5ldyBsaW5rcyBjYW5ub3QKKwkgICAgYmUgY3JlYXRlZC4gIEV2ZW4gcm9vdCBjYW5ub3QgbW9kaWZ5IHRoZSBmaWxlcy4gIEhlIGhhcyB0byByZW1vdmUKKwkgICAgdGhlIGltbXV0YWJsZSBhdHRyaWJ1dGUgZmlyc3QuCisJICAtIEFwcGVuZC1vbmx5IGZpbGVzOiBjYW4gb25seSBiZSB3cml0dGVuIGluIGFwcGVuZC1tb2RlIHdoZW4gd3JpdGluZy4KKwkgICAgVGhleSBjYW5ub3QgYmUgcmVtb3ZlZCwgcmVuYW1lZCBhbmQgbmV3IGxpbmtzIGNhbm5vdCBiZSBjcmVhdGVkLgorCSAgICBOb3RlOiBmaWxlcyBtYXkgb25seSBiZSBhZGRlZCB0byBhbiBhcHBlbmQtb25seSBkaXJlY3RvcnkuCisJICAtIE5vLWR1bXAgZmlsZXM6IHRoZSBhdHRyaWJ1dGUgaXMgbm90IHVzZWQgYnkgdGhlIGtlcm5lbC4gIE15IHBvcnQKKwkgICAgb2YgZHVtcCB1c2VzIGl0IHRvIGF2b2lkIGJhY2tpbmcgdXAgZmlsZXMgd2hpY2ggYXJlIG5vdCBpbXBvcnRhbnQuCisJLSBOZXcgY2hlY2sgaW4gZXh0Ml9jaGVja19kaXJfZW50cnk6IHRoZSBpbm9kZSBudW1iZXIgaXMgY2hlY2tlZC4KKwktIFN1cHBvcnQgZm9yIGJpZyBmaWxlIHN5c3RlbXM6IHRoZSBjb3B5IG9mIHRoZSBGUyBkZXNjcmlwdG9yIGlzIG5vdworCSAgZHluYW1pY2FsbHkgYWxsb2NhdGVkIChwcmV2aW91cyB2ZXJzaW9ucyB1c2VkIGEgZml4ZWQgc2l6ZSBhcnJheSkuCisJICBUaGlzIGFsbG93cyB0byBtb3VudCAyR0IrIEZTLgorCS0gUmVvcmdhbml6YXRpb24gb2YgdGhlIGV4dDJfaW5vZGUgc3RydWN0dXJlIHRvIGFsbG93IG90aGVyIG9wZXJhdGluZworCSAgc3lzdGVtcyB0byBjcmVhdGUgc3BlY2lmaWMgZmllbGRzIGlmIHRoZXkgdXNlIGV4dDJmcyBhcyB0aGVpciBuYXRpdmUKKwkgIGZpbGUgc3lzdGVtLiAgQ3VycmVudGx5LCBleHQyZnMgaXMgb25seSBpbXBsZW1lbnRlZCBpbiBMaW51eCBidXQKKwkgIHdpbGwgc29vbiBiZSBwYXJ0IG9mIEdudSBIdXJkIGFuZCBvZiBNYXNpeC4KKworQ2hhbmdlcyBmcm9tIHZlcnNpb24gMC40YiB0byB2ZXJzaW9uIDAuNQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCS0gTmV3IHN1cGVyYmxvY2sgZmllbGRzOiBzX2xhc3RjaGVjayBhbmQgc19jaGVja2ludGVydmFsIGFkZGVkCisJICBieSBVd2UgT2hzZSA8dXdlQHRpcmthLmd1bi5kZT4gdG8gaW1wbGVtZW50IHRpbWVkZXBlbmRlbnQgY2hlY2tzCisJICBvZiB0aGUgZmlsZSBzeXN0ZW0KKwktIFJlYWwgcmFuZG9tIG51bWJlcnMgZm9yIHNlY3VyZSBybSBhZGRlZCBieSBQaWVycmUgZGVsIFBlcnVnaWEKKwkgIDxkZWxwZXJ1Z0BnbGEuZWNvbGVkb2MuaWJwLmZyPgorCS0gVGhlIG1vdW50IHdhcm5pbmdzIHJlbGF0ZWQgdG8gdGhlIHN0YXRlIG9mIGEgZnMgYXJlIG5vdCBwcmludGVkCisJICBpZiB0aGUgZnMgaXMgbW91bnRlZCByZWFkLW9ubHksIGlkZWEgYnkgTmljayBIb2xsb3dheQorCSAgPGFsZmllQGRjcy53YXJ3aWNrLmFjLnVrPgorCitDaGFuZ2VzIGZyb20gdmVyc2lvbiAwLjRhIHRvIHZlcnNpb24gMC40YgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwktIENvcHlyaWdodHMgY2hhbmdlZCB0byBpbmNsdWRlIHRoZSBuYW1lIG9mIG15IGxhYm9yYXRvcnkuCisJLSBDbGVhbiB1cCBvZiBiYWxsb2MuYyBhbmQgaWFsbG9jLmMuCisJLSBNb3JlIGNvbnNpc3RlbmN5IGNoZWNrcy4KKwktIEJsb2NrIHByZWFsbG9jYXRpb24gYWRkZWQgYnkgU3RlcGhlbiBUd2VlZGllLgorCS0gRGlyZWN0IHJlYWRzIG9mIGRpcmVjdG9yaWVzIGRpc2FsbG93ZWQuCisJLSBSZWFkYWhlYWQgaW1wbGVtZW50ZWQgaW4gcmVhZGRpciBieSBTdGVwaGVuIFR3ZWVkaWUuCisJLSBCdWdzIGluIGJsb2NrIGFuZCBpbm9kZXMgYWxsb2NhdGlvbiBmaXhlZC4KKwktIFJlYWRhaGVhZCBpbXBsZW1lbnRlZCBpbiBleHQyX2ZpbmRfZW50cnkgYnkgQ2hpcCBTYWx6ZW5iZXJnLgorCS0gTmV3IG1vdW50IG9wdGlvbnM6CisJICBgY2hlY2s9bm9uZXxub3JtYWx8c3RyaWN0JworCSAgYGRlYnVnJworCSAgYGVycm9ycz1jb250aW51ZXxyZW1vdW50LXJvfHBhbmljJworCSAgYGdycGlkJywgYGJzZGdyb3VwcycKKwkgIGBub2NoZWNrJworCSAgYG5vZ3JwaWQnLCBgc3lzdmdyb3VwcycKKwktIHRydW5jYXRlKCkgbm93IHRyaWVzIHRvIGRlYWxsb2NhdGUgY29udGlndW91cyBibG9ja3MgaW4gYSBzaW5nbGUgY2FsbAorCSAgdG8gZXh0Ml9mcmVlX2Jsb2NrcygpLgorCS0gbG90cyBvZiBjb3NtZXRpYyBjaGFuZ2VzLgorCitDaGFuZ2VzIGZyb20gdmVyc2lvbiAwLjQgdG8gdmVyc2lvbiAwLjRhCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgIC0gdGhlIGBzeW5jJyBvcHRpb24gc3VwcG9ydCBpcyBub3cgY29tcGxldGUuICBWZXJzaW9uIDAuNCB3YXMgbm90CisgICAgICAgICAgc3VwcG9ydGluZyBpdCB3aGVuIHRydW5jYXRpbmcgYSBmaWxlLiAgSSBoYXZlIHRlc3RlZCB0aGUgc3luY2hyb25vdXMKKyAgICAgICAgICB3cml0ZXMgYW5kIHRoZXkgd29yayBidXQgdGhleSBtYWtlIHRoZSBzeXN0ZW0gdmVyeSBzbG93IDotKCAgSSBoYXZlCisgICAgICAgICAgdG8gd29yayBhZ2FpbiBvbiB0aGlzIHRvIG1ha2UgaXQgZmFzdGVyLgorICAgICAgICAtIHdoZW4gZGV0ZWN0aW5nIGFuIGVycm9yIG9uIGEgbW91bnRlZCBmaWxlc3lzdGVtLCB2ZXJzaW9uIDAuNCB1c2VkCisgICAgICAgICAgdG8gdHJ5IHRvIHdyaXRlIGEgZmxhZyBpbiB0aGUgc3VwZXIgYmxvY2sgZXZlbiBpZiB0aGUgZmlsZXN5c3RlbSBoYWQKKyAgICAgICAgICBiZWVuIG1vdW50ZWQgcmVhZC1vbmx5LiAgVGhpcyBpcyBmaXhlZC4KKyAgICAgICAgLSB0aGUgYHNiPSMnIG9wdGlvbiBub3cgY2F1c2VzIHRoZSBrZXJuZWwgY29kZSB0byB1c2UgdGhlIGZpbGVzeXN0ZW0KKyAgICAgICAgICBkZXNjcmlwdG9ycyBsb2NhdGVkIGF0IGJsb2NrICMrMS4gIFZlcnNpb24gMC40IHVzZWQgdGhlIHN1cGVyYmxvY2sKKyAgICAgICAgICBiYWNrdXAgbG9jYXRlZCBhdCBibG9jayAjIGJ1dCB1c2VkIHRoZSBtYWluIGNvcHkgb2YgdGhlIGRlc2NyaXB0b3JzLgorICAgICAgICAtIGEgbmV3IGZpbGUgYXR0cmlidXRlIGBTJyBpcyBzdXBwb3J0ZWQuICBUaGlzIGF0dHJpYnV0ZSBjYXVzZXMKKyAgICAgICAgICBzeW5jaHJvbm91cyB3cml0ZXMgYnV0IGlzIGFwcGxpZWQgdG8gYSBmaWxlIG5vdCB0byB0aGUgZW50aXJlIGZpbGUKKyAgICAgICAgICBzeXN0ZW0gKHRoYW5rcyB0byBNaWNoYWVsIEtyYWVoZSA8a3JhZWhlQGJha3VuaW4ubm9ydGguZGU+IGZvcgorICAgICAgICAgIHN1Z2dlc3RpbmcgaXQpLgorICAgICAgICAtIHRoZSBkaXJlY3RvcnkgY2FjaGUgaXMgaW5oaWJpdGVkIGJ5IGRlZmF1bHQuICBUaGUgY2FjaGUgbWFuYWdlbWVudAorICAgICAgICAgIGNvZGUgc2VlbXMgdG8gYmUgYnVnZ3kgYW5kIEkgaGF2ZSB0byBsb29rIGF0IGl0IGNhcmVmdWxseSBiZWZvcmUKKyAgICAgICAgICB1c2luZyBpdCBhZ2Fpbi4KKyAgICAgICAgLSBkZWxldGluZyBhIGZpbGUgd2l0aCB0aGUgYHMnIGF0dHJpYnV0ZSAoc2VjdXJlIGRlbGV0aW9uKSBjYXVzZXMgaXRzCisgICAgICAgICAgYmxvY2tzIHRvIGJlIG92ZXJ3cml0dGVuIHdpdGggcmFuZG9tIHZhbHVlcyBub3Qgd2l0aCB6ZXJvcyAodGhhbmtzIHRvCisgICAgICAgICAgTWljaGFlbCBBLiBHcmlmZml0aCA8Z3JpZkBjcy51Y3IuZWR1PiBmb3Igc3VnZ2VzdGluZyBpdCkuCisgICAgICAgIC0gbG90cyBvZiBjb3NtZXRpYyBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlLgorCitDaGFuZ2VzIGZyb20gdmVyc2lvbiAwLjMgdG8gdmVyc2lvbiAwLjQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAtIFRocmVlIG5ldyBtb3VudCBvcHRpb25zIGFyZSBzdXBwb3J0ZWQ6IGBjaGVjaycsIGBzeW5jJyBhbmQgYHNiPSMnLgorICAgICAgICAgIGBjaGVjaycgdGVsbHMgdGhlIGtlcm5lbCBjb2RlIHRvIG1ha2UgbW9yZSBjb25zaXN0ZW5jeSBjaGVja3MKKyAgICAgICAgICB3aGVuIHRoZSBmaWxlIHN5c3RlbSBpcyBtb3VudGVkLiAgQ3VycmVudGx5LCB0aGUga2VybmVsIGNvZGUgY2hlY2tzCisgICAgICAgICAgdGhhdCB0aGUgYmxvY2tzIGFuZCBpbm9kZXMgYml0bWFwcyBhcmUgY29uc2lzdGVudCB3aXRoIHRoZSBmcmVlCisgICAgICAgICAgYmxvY2tzIGFuZCBpbm9kZXMgY291bnRzLiAgTW9yZSBjaGVja3Mgd2lsbCBiZSBhZGRlZCBpbiBmdXR1cmUKKyAgICAgICAgICByZWxlYXNlcy4KKyAgICAgICAgICBgc3luYycgdGVsbHMgdGhlIGtlcm5lbCBjb2RlIHRvIHVzZSBzeW5jaHJvbm91cyB3cml0ZXMgd2hlbiB1cGRhdGluZworICAgICAgICAgIGFuIGlub2RlLCBhIGJpdG1hcCwgYSBkaXJlY3RvcnkgZW50cnkgb3IgYW4gaW5kaXJlY3QgYmxvY2suICBUaGlzCisgICAgICAgICAgY2FuIG1ha2UgdGhlIGZpbGUgc3lzdGVtIG11Y2ggc2xvd2VyIGJ1dCBjYW4gYmUgYSBiaWcgd2luIGZvciBmaWxlcworICAgICAgICAgIHJlY292ZXJ5IGluIGNhc2Ugb2YgYSBjcmFzaCAoYW5kIHdlIGNhbiBub3cgc2F5IHRvIHRoZSBCU0QgZm9sa3MKKyAgICAgICAgICB0aGF0IExpbnV4IGFsc28gc3VwcG9ydHMgc3luY2hyb25vdXMgdXBkYXRlcyA6LSkuCisgICAgICAgICAgYHNiPSMnIHRlbGxzIHRoZSBrZXJuZWwgY29kZSB0byB1c2UgYW4gYWx0ZXJuYXRlIHN1cGVyIGJsb2NrIGluc3RlYWQKKyAgICAgICAgICBvZiBpdHMgbWFzdGVyIGNvcHkuICBgIycgaXMgdGhlIG51bWJlciBvZiB0aGUgYmxvY2sgKGNvdW50ZWQgaW4KKyAgICAgICAgICAxMDI0IGJ5dGVzIGJsb2Nrcykgd2hpY2ggY29udGFpbnMgdGhlIGFsdGVybmF0ZSBzdXBlciBibG9jay4KKyAgICAgICAgICBBbiBleHQyIGZpbGUgc3lzdGVtIHR5cGljYWxseSBjb250YWlucyBiYWNrdXBzIG9mIHRoZSBzdXBlciBibG9jaworICAgICAgICAgIGF0IGJsb2NrcyA4MTkzLCAxNjM4NSwgYW5kIHNvIG9uLgorICAgICAgICAtIEkgaGF2ZSBjaGFuZ2UgdGhlIG1lYW5pbmcgb2YgdGhlIHZhbGlkIGZsYWcgdXNlZCBieSBlMmZzY2suICBpdAorICAgICAgICAgIG5vdyBjb250YWlucyB0aGUgc3RhdGUgb2YgdGhlIGZpbGUgc3lzdGVtLiAgSWYgdGhlIGtlcm5lbCBjb2RlCisgICAgICAgICAgZGV0ZWN0cyBhbiBpbmNvbnNpc3RlbmN5IHdoaWxlIHRoZSBmaWxlIHN5c3RlbSBpcyBtb3VudGVkLCBpdCBmbGFncworICAgICAgICAgIGl0IGFzIGVycm9uZW91cyBhbmQgZTJmc2NrIHdpbGwgZGV0ZWN0IHRoYXQgb24gbmV4dCBydW4uCisgICAgICAgIC0gVGhlIHN1cGVyIGJsb2NrIG5vdyBjb250YWlucyBhIG1vdW50IGNvdW50ZXIuICBUaGlzIGNvdW50ZXIgaXMKKyAgICAgICAgICBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgdGhlIGZpbGUgc3lzdGVtIGlzIG1vdW50ZWQgcmVhZC93cml0ZS4gICBXaGVuCisgICAgICAgICAgdGhpcyBjb3VudGVyIGJlY29tZXMgYmlnZ2VyIHRoYW4gYSBtYXhpbWFsIG1vdW50IGNvdW50cyAoYWxzbyBzdG9yZWQKKyAgICAgICAgICBpbiB0aGUgc3VwZXIgYmxvY2spLCBlMmZzY2sgY2hlY2tzIHRoZSBmaWxlIHN5c3RlbSwgZXZlbiBpZiBpdCBoYWQKKyAgICAgICAgICBiZWVuIHVubW91bnRlZCBjbGVhbmx5LCBhbmQgcmVzZXRzIHRoaXMgY291bnRlciB0byAwLgorICAgICAgICAtIEZpbGUgYXR0cmlidXRlcyBhcmUgbm93IHN1cHBvcnRlZC4gIE9uZSBjYW4gYXNzb2NpYXRlIGEgc2V0IG9mCisgICAgICAgICAgYXR0cmlidXRlcyB0byBhIGZpbGUuICBUaHJlZSBhdHRyaWJ1dGVzIGFyZSBkZWZpbmVkOgorICAgICAgICAgIGBjJzogdGhlIGZpbGUgaXMgbWFya2VkIGZvciBhdXRvbWF0aWMgY29tcHJlc3Npb24sCisgICAgICAgICAgYHMnOiB0aGUgZmlsZSBpcyBtYXJrZWQgZm9yIHNlY3VyZSBkZWxldGlvbjogd2hlbiB0aGUgZmlsZSBpcworICAgICAgICAgIGRlbGV0ZWQsIGl0cyBibG9ja3MgYXJlIHplcm9lZCBhbmQgd3JpdHRlbiBiYWNrIHRvIHRoZSBkaXNrLAorICAgICAgICAgIGB1JzogdGhlIGZpbGUgaXMgbWFya2VkIGZvciB1bmRlbGV0aW9uOiB3aGVuIHRoZSBmaWxlIGlzIGRlbGV0ZWQsCisgICAgICAgICAgaXRzIGNvbnRlbnRzIGFyZSBzYXZlZCB0byBhbGxvdyBhIGZ1dHVyZSB1bmRlbGV0aW9uLgorICAgICAgICAgIEN1cnJlbnRseSwgb25seSB0aGUgYHMnIGF0dHJpYnV0ZSBpcyBpbXBsZW1lbnRlZCBpbiB0aGUga2VybmVsCisgICAgICAgICAgY29kZS4gIFN1cHBvcnQgZm9yIHRoZSBvdGhlciBhdHRyaWJ1dGVzIHdpbGwgYmUgYWRkZWQgaW4gYSBmdXR1cmUKKyAgICAgICAgICByZWxlYXNlLgorICAgICAgICAtIGEgZmV3IGJ1Z3MgcmVsYXRlZCB0byB0aW1lcyB1cGRhdGVzIGhhdmUgYmVlbiBmaXhlZCBieSBCcnVjZQorICAgICAgICAgIEV2YW5zIGFuZCBtZS4KKyAgICAgICAgLSBhIGJ1ZyByZWxhdGVkIHRvIHRoZSBsaW5rcyBjb3VudCBvZiBkZWxldGVkIGlub2RlcyBoYXMgYmVlbiBmaXhlZC4KKyAgICAgICAgICBQcmV2aW91cyB2ZXJzaW9ucyB1c2VkIHRvIGtlZXAgdGhlIGxpbmtzIGNvdW50IHNldCB0byAxIHdoZW4gYSBmaWxlCisgICAgICAgICAgd2FzIGRlbGV0ZWQuICBUaGUgbmV3IHZlcnNpb24gbm93IHNldHMgbGlua3NfY291bnQgdG8gMCB3aGVuIGRlbGV0aW5nCisgICAgICAgICAgdGhlIGxhc3QgbGluay4KKyAgICAgICAgLSBhIHJhY2UgY29uZGl0aW9uIHdoZW4gZGVhbGxvY2F0aW5nIGFuIGlub2RlIGhhcyBiZWVuIGZpeGVkIGJ5CisgICAgICAgICAgU3RlcGhlbiBUd2VlZGllLgorCmRpZmYgLS1naXQgYS9mcy9leHQyL01ha2VmaWxlIGIvZnMvZXh0Mi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTI0MGExCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0Mi9NYWtlZmlsZQpAQCAtMCwwICsxLDEyIEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgbGludXggZXh0Mi1maWxlc3lzdGVtIHJvdXRpbmVzLgorIworCitvYmotJChDT05GSUdfRVhUMl9GUykgKz0gZXh0Mi5vCisKK2V4dDIteSA6PSBiYWxsb2MubyBiaXRtYXAubyBkaXIubyBmaWxlLm8gZnN5bmMubyBpYWxsb2MubyBpbm9kZS5vIFwKKwkgIGlvY3RsLm8gbmFtZWkubyBzdXBlci5vIHN5bWxpbmsubworCitleHQyLSQoQ09ORklHX0VYVDJfRlNfWEFUVFIpCSArPSB4YXR0ci5vIHhhdHRyX3VzZXIubyB4YXR0cl90cnVzdGVkLm8KK2V4dDItJChDT05GSUdfRVhUMl9GU19QT1NJWF9BQ0wpICs9IGFjbC5vCitleHQyLSQoQ09ORklHX0VYVDJfRlNfU0VDVVJJVFkpCSArPSB4YXR0cl9zZWN1cml0eS5vCmRpZmYgLS1naXQgYS9mcy9leHQyL2FjbC5jIGIvZnMvZXh0Mi9hY2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzY5ZWU4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0Mi9hY2wuYwpAQCAtMCwwICsxLDUxOCBAQAorLyoKKyAqIGxpbnV4L2ZzL2V4dDIvYWNsLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBBbmRyZWFzIEdydWVuYmFjaGVyLCA8YWdydWVuQHN1c2UuZGU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgImV4dDIuaCIKKyNpbmNsdWRlICJ4YXR0ci5oIgorI2luY2x1ZGUgImFjbC5oIgorCisvKgorICogQ29udmVydCBmcm9tIGZpbGVzeXN0ZW0gdG8gaW4tbWVtb3J5IHJlcHJlc2VudGF0aW9uLgorICovCitzdGF0aWMgc3RydWN0IHBvc2l4X2FjbCAqCitleHQyX2FjbF9mcm9tX2Rpc2soY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplKQoreworCWNvbnN0IGNoYXIgKmVuZCA9IChjaGFyICopdmFsdWUgKyBzaXplOworCWludCBuLCBjb3VudDsKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CisKKwlpZiAoIXZhbHVlKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoc2l6ZSA8IHNpemVvZihleHQyX2FjbF9oZWFkZXIpKQorCQkgcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJaWYgKCgoZXh0Ml9hY2xfaGVhZGVyICopdmFsdWUpLT5hX3ZlcnNpb24gIT0KKwkgICAgY3B1X3RvX2xlMzIoRVhUMl9BQ0xfVkVSU0lPTikpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCXZhbHVlID0gKGNoYXIgKil2YWx1ZSArIHNpemVvZihleHQyX2FjbF9oZWFkZXIpOworCWNvdW50ID0gZXh0Ml9hY2xfY291bnQoc2l6ZSk7CisJaWYgKGNvdW50IDwgMCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJaWYgKGNvdW50ID09IDApCisJCXJldHVybiBOVUxMOworCWFjbCA9IHBvc2l4X2FjbF9hbGxvYyhjb3VudCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhY2wpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWZvciAobj0wOyBuIDwgY291bnQ7IG4rKykgeworCQlleHQyX2FjbF9lbnRyeSAqZW50cnkgPQorCQkJKGV4dDJfYWNsX2VudHJ5ICopdmFsdWU7CisJCWlmICgoY2hhciAqKXZhbHVlICsgc2l6ZW9mKGV4dDJfYWNsX2VudHJ5X3Nob3J0KSA+IGVuZCkKKwkJCWdvdG8gZmFpbDsKKwkJYWNsLT5hX2VudHJpZXNbbl0uZV90YWcgID0gbGUxNl90b19jcHUoZW50cnktPmVfdGFnKTsKKwkJYWNsLT5hX2VudHJpZXNbbl0uZV9wZXJtID0gbGUxNl90b19jcHUoZW50cnktPmVfcGVybSk7CisJCXN3aXRjaChhY2wtPmFfZW50cmllc1tuXS5lX3RhZykgeworCQkJY2FzZSBBQ0xfVVNFUl9PQko6CisJCQljYXNlIEFDTF9HUk9VUF9PQko6CisJCQljYXNlIEFDTF9NQVNLOgorCQkJY2FzZSBBQ0xfT1RIRVI6CisJCQkJdmFsdWUgPSAoY2hhciAqKXZhbHVlICsKKwkJCQkJc2l6ZW9mKGV4dDJfYWNsX2VudHJ5X3Nob3J0KTsKKwkJCQlhY2wtPmFfZW50cmllc1tuXS5lX2lkID0gQUNMX1VOREVGSU5FRF9JRDsKKwkJCQlicmVhazsKKworCQkJY2FzZSBBQ0xfVVNFUjoKKwkJCWNhc2UgQUNMX0dST1VQOgorCQkJCXZhbHVlID0gKGNoYXIgKil2YWx1ZSArIHNpemVvZihleHQyX2FjbF9lbnRyeSk7CisJCQkJaWYgKChjaGFyICopdmFsdWUgPiBlbmQpCisJCQkJCWdvdG8gZmFpbDsKKwkJCQlhY2wtPmFfZW50cmllc1tuXS5lX2lkID0KKwkJCQkJbGUzMl90b19jcHUoZW50cnktPmVfaWQpOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKwlpZiAodmFsdWUgIT0gZW5kKQorCQlnb3RvIGZhaWw7CisJcmV0dXJuIGFjbDsKKworZmFpbDoKKwlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOworCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworfQorCisvKgorICogQ29udmVydCBmcm9tIGluLW1lbW9yeSB0byBmaWxlc3lzdGVtIHJlcHJlc2VudGF0aW9uLgorICovCitzdGF0aWMgdm9pZCAqCitleHQyX2FjbF90b19kaXNrKGNvbnN0IHN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgc2l6ZV90ICpzaXplKQoreworCWV4dDJfYWNsX2hlYWRlciAqZXh0X2FjbDsKKwljaGFyICplOworCXNpemVfdCBuOworCisJKnNpemUgPSBleHQyX2FjbF9zaXplKGFjbC0+YV9jb3VudCk7CisJZXh0X2FjbCA9IChleHQyX2FjbF9oZWFkZXIgKilrbWFsbG9jKHNpemVvZihleHQyX2FjbF9oZWFkZXIpICsKKwkJYWNsLT5hX2NvdW50ICogc2l6ZW9mKGV4dDJfYWNsX2VudHJ5KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFleHRfYWNsKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlleHRfYWNsLT5hX3ZlcnNpb24gPSBjcHVfdG9fbGUzMihFWFQyX0FDTF9WRVJTSU9OKTsKKwllID0gKGNoYXIgKilleHRfYWNsICsgc2l6ZW9mKGV4dDJfYWNsX2hlYWRlcik7CisJZm9yIChuPTA7IG4gPCBhY2wtPmFfY291bnQ7IG4rKykgeworCQlleHQyX2FjbF9lbnRyeSAqZW50cnkgPSAoZXh0Ml9hY2xfZW50cnkgKillOworCQllbnRyeS0+ZV90YWcgID0gY3B1X3RvX2xlMTYoYWNsLT5hX2VudHJpZXNbbl0uZV90YWcpOworCQllbnRyeS0+ZV9wZXJtID0gY3B1X3RvX2xlMTYoYWNsLT5hX2VudHJpZXNbbl0uZV9wZXJtKTsKKwkJc3dpdGNoKGFjbC0+YV9lbnRyaWVzW25dLmVfdGFnKSB7CisJCQljYXNlIEFDTF9VU0VSOgorCQkJY2FzZSBBQ0xfR1JPVVA6CisJCQkJZW50cnktPmVfaWQgPQorCQkJCQljcHVfdG9fbGUzMihhY2wtPmFfZW50cmllc1tuXS5lX2lkKTsKKwkJCQllICs9IHNpemVvZihleHQyX2FjbF9lbnRyeSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQUNMX1VTRVJfT0JKOgorCQkJY2FzZSBBQ0xfR1JPVVBfT0JKOgorCQkJY2FzZSBBQ0xfTUFTSzoKKwkJCWNhc2UgQUNMX09USEVSOgorCQkJCWUgKz0gc2l6ZW9mKGV4dDJfYWNsX2VudHJ5X3Nob3J0KTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisJcmV0dXJuIChjaGFyICopZXh0X2FjbDsKKworZmFpbDoKKwlrZnJlZShleHRfYWNsKTsKKwlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcG9zaXhfYWNsICoKK2V4dDJfaWdldF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBvc2l4X2FjbCAqKmlfYWNsKQoreworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbCA9IEVYVDJfQUNMX05PVF9DQUNIRUQ7CisKKwlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCWlmICgqaV9hY2wgIT0gRVhUMl9BQ0xfTk9UX0NBQ0hFRCkKKwkJYWNsID0gcG9zaXhfYWNsX2R1cCgqaV9hY2wpOworCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKworCXJldHVybiBhY2w7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZXh0Ml9pc2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcG9zaXhfYWNsICoqaV9hY2wsCisJCSAgIHN0cnVjdCBwb3NpeF9hY2wgKmFjbCkKK3sKKwlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCWlmICgqaV9hY2wgIT0gRVhUMl9BQ0xfTk9UX0NBQ0hFRCkKKwkJcG9zaXhfYWNsX3JlbGVhc2UoKmlfYWNsKTsKKwkqaV9hY2wgPSBwb3NpeF9hY2xfZHVwKGFjbCk7CisJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworfQorCisvKgorICogaW5vZGUtPmlfc2VtOiBkb24ndCBjYXJlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcG9zaXhfYWNsICoKK2V4dDJfZ2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgZXh0Ml9pbm9kZV9pbmZvICplaSA9IEVYVDJfSShpbm9kZSk7CisJaW50IG5hbWVfaW5kZXg7CisJY2hhciAqdmFsdWUgPSBOVUxMOworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKKwlpbnQgcmV0dmFsOworCisJaWYgKCF0ZXN0X29wdChpbm9kZS0+aV9zYiwgUE9TSVhfQUNMKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlzd2l0Y2godHlwZSkgeworCQljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKKwkJCWFjbCA9IGV4dDJfaWdldF9hY2woaW5vZGUsICZlaS0+aV9hY2wpOworCQkJaWYgKGFjbCAhPSBFWFQyX0FDTF9OT1RfQ0FDSEVEKQorCQkJCXJldHVybiBhY2w7CisJCQluYW1lX2luZGV4ID0gRVhUMl9YQVRUUl9JTkRFWF9QT1NJWF9BQ0xfQUNDRVNTOworCQkJYnJlYWs7CisKKwkJY2FzZSBBQ0xfVFlQRV9ERUZBVUxUOgorCQkJYWNsID0gZXh0Ml9pZ2V0X2FjbChpbm9kZSwgJmVpLT5pX2RlZmF1bHRfYWNsKTsKKwkJCWlmIChhY2wgIT0gRVhUMl9BQ0xfTk9UX0NBQ0hFRCkKKwkJCQlyZXR1cm4gYWNsOworCQkJbmFtZV9pbmRleCA9IEVYVDJfWEFUVFJfSU5ERVhfUE9TSVhfQUNMX0RFRkFVTFQ7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCXJldHZhbCA9IGV4dDJfeGF0dHJfZ2V0KGlub2RlLCBuYW1lX2luZGV4LCAiIiwgTlVMTCwgMCk7CisJaWYgKHJldHZhbCA+IDApIHsKKwkJdmFsdWUgPSBrbWFsbG9jKHJldHZhbCwgR0ZQX0tFUk5FTCk7CisJCWlmICghdmFsdWUpCisJCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwkJcmV0dmFsID0gZXh0Ml94YXR0cl9nZXQoaW5vZGUsIG5hbWVfaW5kZXgsICIiLCB2YWx1ZSwgcmV0dmFsKTsKKwl9CisJaWYgKHJldHZhbCA+IDApCisJCWFjbCA9IGV4dDJfYWNsX2Zyb21fZGlzayh2YWx1ZSwgcmV0dmFsKTsKKwllbHNlIGlmIChyZXR2YWwgPT0gLUVOT0RBVEEgfHwgcmV0dmFsID09IC1FTk9TWVMpCisJCWFjbCA9IE5VTEw7CisJZWxzZQorCQlhY2wgPSBFUlJfUFRSKHJldHZhbCk7CisJaWYgKHZhbHVlKQorCQlrZnJlZSh2YWx1ZSk7CisKKwlpZiAoIUlTX0VSUihhY2wpKSB7CisJCXN3aXRjaCh0eXBlKSB7CisJCQljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKKwkJCQlleHQyX2lzZXRfYWNsKGlub2RlLCAmZWktPmlfYWNsLCBhY2wpOworCQkJCWJyZWFrOworCisJCQljYXNlIEFDTF9UWVBFX0RFRkFVTFQ6CisJCQkJZXh0Ml9pc2V0X2FjbChpbm9kZSwgJmVpLT5pX2RlZmF1bHRfYWNsLCBhY2wpOworCQkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBhY2w7Cit9CisKKy8qCisgKiBpbm9kZS0+aV9zZW06IGRvd24KKyAqLworc3RhdGljIGludAorZXh0Ml9zZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlLCBzdHJ1Y3QgcG9zaXhfYWNsICphY2wpCit7CisJc3RydWN0IGV4dDJfaW5vZGVfaW5mbyAqZWkgPSBFWFQyX0koaW5vZGUpOworCWludCBuYW1lX2luZGV4OworCXZvaWQgKnZhbHVlID0gTlVMTDsKKwlzaXplX3Qgc2l6ZTsKKwlpbnQgZXJyb3I7CisKKwlpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmICghdGVzdF9vcHQoaW5vZGUtPmlfc2IsIFBPU0lYX0FDTCkpCisJCXJldHVybiAwOworCisJc3dpdGNoKHR5cGUpIHsKKwkJY2FzZSBBQ0xfVFlQRV9BQ0NFU1M6CisJCQluYW1lX2luZGV4ID0gRVhUMl9YQVRUUl9JTkRFWF9QT1NJWF9BQ0xfQUNDRVNTOworCQkJaWYgKGFjbCkgeworCQkJCW1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKKwkJCQllcnJvciA9IHBvc2l4X2FjbF9lcXVpdl9tb2RlKGFjbCwgJm1vZGUpOworCQkJCWlmIChlcnJvciA8IDApCisJCQkJCXJldHVybiBlcnJvcjsKKwkJCQllbHNlIHsKKwkJCQkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisJCQkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQkJCQlpZiAoZXJyb3IgPT0gMCkKKwkJCQkJCWFjbCA9IE5VTEw7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBBQ0xfVFlQRV9ERUZBVUxUOgorCQkJbmFtZV9pbmRleCA9IEVYVDJfWEFUVFJfSU5ERVhfUE9TSVhfQUNMX0RFRkFVTFQ7CisJCQlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCQkJcmV0dXJuIGFjbCA/IC1FQUNDRVMgOiAwOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKyAJaWYgKGFjbCkgeworCQl2YWx1ZSA9IGV4dDJfYWNsX3RvX2Rpc2soYWNsLCAmc2l6ZSk7CisJCWlmIChJU19FUlIodmFsdWUpKQorCQkJcmV0dXJuIChpbnQpUFRSX0VSUih2YWx1ZSk7CisJfQorCisJZXJyb3IgPSBleHQyX3hhdHRyX3NldChpbm9kZSwgbmFtZV9pbmRleCwgIiIsIHZhbHVlLCBzaXplLCAwKTsKKworCWlmICh2YWx1ZSkKKwkJa2ZyZWUodmFsdWUpOworCWlmICghZXJyb3IpIHsKKwkJc3dpdGNoKHR5cGUpIHsKKwkJCWNhc2UgQUNMX1RZUEVfQUNDRVNTOgorCQkJCWV4dDJfaXNldF9hY2woaW5vZGUsICZlaS0+aV9hY2wsIGFjbCk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQUNMX1RZUEVfREVGQVVMVDoKKwkJCQlleHQyX2lzZXRfYWNsKGlub2RlLCAmZWktPmlfZGVmYXVsdF9hY2wsIGFjbCk7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50CitleHQyX2NoZWNrX2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaykKK3sKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2wgPSBleHQyX2dldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUyk7CisKKwlpZiAoYWNsKSB7CisJCWludCBlcnJvciA9IHBvc2l4X2FjbF9wZXJtaXNzaW9uKGlub2RlLCBhY2wsIG1hc2spOworCQlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJcmV0dXJuIC1FQUdBSU47Cit9CisKK2ludAorZXh0Ml9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlyZXR1cm4gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrLCBleHQyX2NoZWNrX2FjbCk7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBBQ0xzIG9mIGEgbmV3IGlub2RlLiBDYWxsZWQgZnJvbSBleHQyX25ld19pbm9kZS4KKyAqCisgKiBkaXItPmlfc2VtOiBkb3duCisgKiBpbm9kZS0+aV9zZW06IHVwIChhY2Nlc3MgdG8gaW5vZGUgaXMgc3RpbGwgZXhjbHVzaXZlKQorICovCitpbnQKK2V4dDJfaW5pdF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIpCit7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsID0gTlVMTDsKKwlpbnQgZXJyb3IgPSAwOworCisJaWYgKCFTX0lTTE5LKGlub2RlLT5pX21vZGUpKSB7CisJCWlmICh0ZXN0X29wdChkaXItPmlfc2IsIFBPU0lYX0FDTCkpIHsKKwkJCWFjbCA9IGV4dDJfZ2V0X2FjbChkaXIsIEFDTF9UWVBFX0RFRkFVTFQpOworCQkJaWYgKElTX0VSUihhY2wpKQorCQkJCXJldHVybiBQVFJfRVJSKGFjbCk7CisJCX0KKwkJaWYgKCFhY2wpCisJCQlpbm9kZS0+aV9tb2RlICY9IH5jdXJyZW50LT5mcy0+dW1hc2s7CisJfQorCWlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgUE9TSVhfQUNMKSAmJiBhY2wpIHsKKyAgICAgICAgICAgICAgIHN0cnVjdCBwb3NpeF9hY2wgKmNsb25lOworCSAgICAgICBtb2RlX3QgbW9kZTsKKworCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgeworCQkJZXJyb3IgPSBleHQyX3NldF9hY2woaW5vZGUsIEFDTF9UWVBFX0RFRkFVTFQsIGFjbCk7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBjbGVhbnVwOworCQl9CisJCWNsb25lID0gcG9zaXhfYWNsX2Nsb25lKGFjbCwgR0ZQX0tFUk5FTCk7CisJCWVycm9yID0gLUVOT01FTTsKKwkJaWYgKCFjbG9uZSkKKwkJCWdvdG8gY2xlYW51cDsKKwkJbW9kZSA9IGlub2RlLT5pX21vZGU7CisJCWVycm9yID0gcG9zaXhfYWNsX2NyZWF0ZV9tYXNxKGNsb25lLCAmbW9kZSk7CisJCWlmIChlcnJvciA+PSAwKSB7CisJCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKKwkJCWlmIChlcnJvciA+IDApIHsKKwkJCQkvKiBUaGlzIGlzIGFuIGV4dGVuZGVkIEFDTCAqLworCQkJCWVycm9yID0gZXh0Ml9zZXRfYWNsKGlub2RlLAorCQkJCQkJICAgICBBQ0xfVFlQRV9BQ0NFU1MsIGNsb25lKTsKKwkJCX0KKwkJfQorCQlwb3NpeF9hY2xfcmVsZWFzZShjbG9uZSk7CisJfQorY2xlYW51cDoKKyAgICAgICBwb3NpeF9hY2xfcmVsZWFzZShhY2wpOworICAgICAgIHJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIERvZXMgY2htb2QgZm9yIGFuIGlub2RlIHRoYXQgbWF5IGhhdmUgYW4gQWNjZXNzIENvbnRyb2wgTGlzdC4gVGhlCisgKiBpbm9kZS0+aV9tb2RlIGZpZWxkIG11c3QgYmUgdXBkYXRlZCB0byB0aGUgZGVzaXJlZCB2YWx1ZSBieSB0aGUgY2FsbGVyCisgKiBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgbnVtYmVyLgorICoKKyAqIFdlIGNoYW5nZSB0aGUgQUNMIHJhdGhlciB0aGFuIHN0b3Jpbmcgc29tZSBBQ0wgZW50cmllcyBpbiB0aGUgZmlsZQorICogbW9kZSBwZXJtaXNzaW9uIGJpdHMgKHdoaWNoIHdvdWxkIGJlIG1vcmUgZWZmaWNpZW50KSwgYmVjYXVzZSB0aGF0CisgKiB3b3VsZCBicmVhayBvbmNlIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgKGxpa2UgIEFDTF9BUFBFTkQsIEFDTF9ERUxFVEUKKyAqIGZvciBkaXJlY3RvcmllcykgYXJlIGFkZGVkLiBUaGVyZSBhcmUgbm8gbW9yZSBiaXRzIGF2YWlsYWJsZSBpbiB0aGUKKyAqIGZpbGUgbW9kZS4KKyAqCisgKiBpbm9kZS0+aV9zZW06IGRvd24KKyAqLworaW50CitleHQyX2FjbF9jaG1vZChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgKmNsb25lOworICAgICAgICBpbnQgZXJyb3I7CisKKwlpZiAoIXRlc3Rfb3B0KGlub2RlLT5pX3NiLCBQT1NJWF9BQ0wpKQorCQlyZXR1cm4gMDsKKwlpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCWFjbCA9IGV4dDJfZ2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTKTsKKwlpZiAoSVNfRVJSKGFjbCkgfHwgIWFjbCkKKwkJcmV0dXJuIFBUUl9FUlIoYWNsKTsKKwljbG9uZSA9IHBvc2l4X2FjbF9jbG9uZShhY2wsIEdGUF9LRVJORUwpOworCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CisJaWYgKCFjbG9uZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJZXJyb3IgPSBwb3NpeF9hY2xfY2htb2RfbWFzcShjbG9uZSwgaW5vZGUtPmlfbW9kZSk7CisJaWYgKCFlcnJvcikKKwkJZXJyb3IgPSBleHQyX3NldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgY2xvbmUpOworCXBvc2l4X2FjbF9yZWxlYXNlKGNsb25lKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBFeHRlbmRlZCBhdHRyaWJ1dCBoYW5kbGVycworICovCitzdGF0aWMgc2l6ZV90CitleHQyX3hhdHRyX2xpc3RfYWNsX2FjY2VzcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjaGFyICpsaXN0LCBzaXplX3QgbGlzdF9zaXplLAorCQkJICAgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQoreworCWNvbnN0IHNpemVfdCBzaXplID0gc2l6ZW9mKFhBVFRSX05BTUVfQUNMX0FDQ0VTUyk7CisKKwlpZiAoIXRlc3Rfb3B0KGlub2RlLT5pX3NiLCBQT1NJWF9BQ0wpKQorCQlyZXR1cm4gMDsKKwlpZiAobGlzdCAmJiBzaXplIDw9IGxpc3Rfc2l6ZSkKKwkJbWVtY3B5KGxpc3QsIFhBVFRSX05BTUVfQUNMX0FDQ0VTUywgc2l6ZSk7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzaXplX3QKK2V4dDJfeGF0dHJfbGlzdF9hY2xfZGVmYXVsdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjaGFyICpsaXN0LCBzaXplX3QgbGlzdF9zaXplLAorCQkJICAgIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lX2xlbikKK3sKKwljb25zdCBzaXplX3Qgc2l6ZSA9IHNpemVvZihYQVRUUl9OQU1FX0FDTF9ERUZBVUxUKTsKKworCWlmICghdGVzdF9vcHQoaW5vZGUtPmlfc2IsIFBPU0lYX0FDTCkpCisJCXJldHVybiAwOworCWlmIChsaXN0ICYmIHNpemUgPD0gbGlzdF9zaXplKQorCQltZW1jcHkobGlzdCwgWEFUVFJfTkFNRV9BQ0xfREVGQVVMVCwgc2l6ZSk7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbnQKK2V4dDJfeGF0dHJfZ2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSwgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CisJaW50IGVycm9yOworCisJaWYgKCF0ZXN0X29wdChpbm9kZS0+aV9zYiwgUE9TSVhfQUNMKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJYWNsID0gZXh0Ml9nZXRfYWNsKGlub2RlLCB0eXBlKTsKKwlpZiAoSVNfRVJSKGFjbCkpCisJCXJldHVybiBQVFJfRVJSKGFjbCk7CisJaWYgKGFjbCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RBVEE7CisJZXJyb3IgPSBwb3NpeF9hY2xfdG9feGF0dHIoYWNsLCBidWZmZXIsIHNpemUpOworCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQKK2V4dDJfeGF0dHJfZ2V0X2FjbF9hY2Nlc3Moc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKwlpZiAoc3RyY21wKG5hbWUsICIiKSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gZXh0Ml94YXR0cl9nZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsIGJ1ZmZlciwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQKK2V4dDJfeGF0dHJfZ2V0X2FjbF9kZWZhdWx0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQoreworCWlmIChzdHJjbXAobmFtZSwgIiIpICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBleHQyX3hhdHRyX2dldF9hY2woaW5vZGUsIEFDTF9UWVBFX0RFRkFVTFQsIGJ1ZmZlciwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQKK2V4dDJfeGF0dHJfc2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSwgY29uc3Qgdm9pZCAqdmFsdWUsCisJCSAgIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKKwlpbnQgZXJyb3I7CisKKwlpZiAoIXRlc3Rfb3B0KGlub2RlLT5pX3NiLCBQT1NJWF9BQ0wpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJaWYgKChjdXJyZW50LT5mc3VpZCAhPSBpbm9kZS0+aV91aWQpICYmICFjYXBhYmxlKENBUF9GT1dORVIpKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKHZhbHVlKSB7CisJCWFjbCA9IHBvc2l4X2FjbF9mcm9tX3hhdHRyKHZhbHVlLCBzaXplKTsKKwkJaWYgKElTX0VSUihhY2wpKQorCQkJcmV0dXJuIFBUUl9FUlIoYWNsKTsKKwkJZWxzZSBpZiAoYWNsKSB7CisJCQllcnJvciA9IHBvc2l4X2FjbF92YWxpZChhY2wpOworCQkJaWYgKGVycm9yKQorCQkJCWdvdG8gcmVsZWFzZV9hbmRfb3V0OworCQl9CisJfSBlbHNlCisJCWFjbCA9IE5VTEw7CisKKwllcnJvciA9IGV4dDJfc2V0X2FjbChpbm9kZSwgdHlwZSwgYWNsKTsKKworcmVsZWFzZV9hbmRfb3V0OgorCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50CitleHQyX3hhdHRyX3NldF9hY2xfYWNjZXNzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCWlmIChzdHJjbXAobmFtZSwgIiIpICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBleHQyX3hhdHRyX3NldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgdmFsdWUsIHNpemUpOworfQorCitzdGF0aWMgaW50CitleHQyX3hhdHRyX3NldF9hY2xfZGVmYXVsdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisJaWYgKHN0cmNtcChuYW1lLCAiIikgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIGV4dDJfeGF0dHJfc2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfREVGQVVMVCwgdmFsdWUsIHNpemUpOworfQorCitzdHJ1Y3QgeGF0dHJfaGFuZGxlciBleHQyX3hhdHRyX2FjbF9hY2Nlc3NfaGFuZGxlciA9IHsKKwkucHJlZml4CT0gWEFUVFJfTkFNRV9BQ0xfQUNDRVNTLAorCS5saXN0CT0gZXh0Ml94YXR0cl9saXN0X2FjbF9hY2Nlc3MsCisJLmdldAk9IGV4dDJfeGF0dHJfZ2V0X2FjbF9hY2Nlc3MsCisJLnNldAk9IGV4dDJfeGF0dHJfc2V0X2FjbF9hY2Nlc3MsCit9OworCitzdHJ1Y3QgeGF0dHJfaGFuZGxlciBleHQyX3hhdHRyX2FjbF9kZWZhdWx0X2hhbmRsZXIgPSB7CisJLnByZWZpeAk9IFhBVFRSX05BTUVfQUNMX0RFRkFVTFQsCisJLmxpc3QJPSBleHQyX3hhdHRyX2xpc3RfYWNsX2RlZmF1bHQsCisJLmdldAk9IGV4dDJfeGF0dHJfZ2V0X2FjbF9kZWZhdWx0LAorCS5zZXQJPSBleHQyX3hhdHRyX3NldF9hY2xfZGVmYXVsdCwKK307CmRpZmYgLS1naXQgYS9mcy9leHQyL2FjbC5oIGIvZnMvZXh0Mi9hY2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWQ5NmFlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0Mi9hY2wuaApAQCAtMCwwICsxLDgyIEBACisvKgorICBGaWxlOiBmcy9leHQyL2FjbC5oCisKKyAgKEMpIDIwMDEgQW5kcmVhcyBHcnVlbmJhY2hlciwgPGEuZ3J1ZW5iYWNoZXJAY29tcHV0ZXIub3JnPgorKi8KKworI2luY2x1ZGUgPGxpbnV4L3hhdHRyX2FjbC5oPgorCisjZGVmaW5lIEVYVDJfQUNMX1ZFUlNJT04JMHgwMDAxCisKK3R5cGVkZWYgc3RydWN0IHsKKwlfX2xlMTYJCWVfdGFnOworCV9fbGUxNgkJZV9wZXJtOworCV9fbGUzMgkJZV9pZDsKK30gZXh0Ml9hY2xfZW50cnk7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlfX2xlMTYJCWVfdGFnOworCV9fbGUxNgkJZV9wZXJtOworfSBleHQyX2FjbF9lbnRyeV9zaG9ydDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCV9fbGUzMgkJYV92ZXJzaW9uOworfSBleHQyX2FjbF9oZWFkZXI7CisKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IGV4dDJfYWNsX3NpemUoaW50IGNvdW50KQoreworCWlmIChjb3VudCA8PSA0KSB7CisJCXJldHVybiBzaXplb2YoZXh0Ml9hY2xfaGVhZGVyKSArCisJCSAgICAgICBjb3VudCAqIHNpemVvZihleHQyX2FjbF9lbnRyeV9zaG9ydCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHNpemVvZihleHQyX2FjbF9oZWFkZXIpICsKKwkJICAgICAgIDQgKiBzaXplb2YoZXh0Ml9hY2xfZW50cnlfc2hvcnQpICsKKwkJICAgICAgIChjb3VudCAtIDQpICogc2l6ZW9mKGV4dDJfYWNsX2VudHJ5KTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGV4dDJfYWNsX2NvdW50KHNpemVfdCBzaXplKQoreworCXNzaXplX3QgczsKKwlzaXplIC09IHNpemVvZihleHQyX2FjbF9oZWFkZXIpOworCXMgPSBzaXplIC0gNCAqIHNpemVvZihleHQyX2FjbF9lbnRyeV9zaG9ydCk7CisJaWYgKHMgPCAwKSB7CisJCWlmIChzaXplICUgc2l6ZW9mKGV4dDJfYWNsX2VudHJ5X3Nob3J0KSkKKwkJCXJldHVybiAtMTsKKwkJcmV0dXJuIHNpemUgLyBzaXplb2YoZXh0Ml9hY2xfZW50cnlfc2hvcnQpOworCX0gZWxzZSB7CisJCWlmIChzICUgc2l6ZW9mKGV4dDJfYWNsX2VudHJ5KSkKKwkJCXJldHVybiAtMTsKKwkJcmV0dXJuIHMgLyBzaXplb2YoZXh0Ml9hY2xfZW50cnkpICsgNDsKKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfRVhUMl9GU19QT1NJWF9BQ0wKKworLyogVmFsdWUgZm9yIGlub2RlLT51LmV4dDJfaS5pX2FjbCBhbmQgaW5vZGUtPnUuZXh0Ml9pLmlfZGVmYXVsdF9hY2wKKyAgIGlmIHRoZSBBQ0wgaGFzIG5vdCBiZWVuIGNhY2hlZCAqLworI2RlZmluZSBFWFQyX0FDTF9OT1RfQ0FDSEVEICgodm9pZCAqKS0xKQorCisvKiBhY2wuYyAqLworZXh0ZXJuIGludCBleHQyX3Blcm1pc3Npb24gKHN0cnVjdCBpbm9kZSAqLCBpbnQsIHN0cnVjdCBuYW1laWRhdGEgKik7CitleHRlcm4gaW50IGV4dDJfYWNsX2NobW9kIChzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gaW50IGV4dDJfaW5pdF9hY2wgKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaW5vZGUgKik7CisKKyNlbHNlCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNkZWZpbmUgZXh0Ml9wZXJtaXNzaW9uIE5VTEwKKyNkZWZpbmUgZXh0Ml9nZXRfYWNsCU5VTEwKKyNkZWZpbmUgZXh0Ml9zZXRfYWNsCU5VTEwKKworc3RhdGljIGlubGluZSBpbnQKK2V4dDJfYWNsX2NobW9kIChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBleHQyX2luaXRfYWNsIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaW5vZGUgKmRpcikKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9mcy9leHQyL2JhbGxvYy5jIGIvZnMvZXh0Mi9iYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTkxYWJlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0Mi9iYWxsb2MuYwpAQCAtMCwwICsxLDY5OSBAQAorLyoKKyAqICBsaW51eC9mcy9leHQyL2JhbGxvYy5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1CisgKiBSZW15IENhcmQgKGNhcmRAbWFzaS5pYnAuZnIpCisgKiBMYWJvcmF0b2lyZSBNQVNJIC0gSW5zdGl0dXQgQmxhaXNlIFBhc2NhbAorICogVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICoKKyAqICBFbmhhbmNlZCBibG9jayBhbGxvY2F0aW9uIGJ5IFN0ZXBoZW4gVHdlZWRpZSAoc2N0QHJlZGhhdC5jb20pLCAxOTkzCisgKiAgQmlnLWVuZGlhbiB0byBsaXR0bGUtZW5kaWFuIGJ5dGUtc3dhcHBpbmcvYml0bWFwcyBieQorICogICAgICAgIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSksIDE5OTUKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSAiZXh0Mi5oIgorI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorCisvKgorICogYmFsbG9jLmMgY29udGFpbnMgdGhlIGJsb2NrcyBhbGxvY2F0aW9uIGFuZCBkZWFsbG9jYXRpb24gcm91dGluZXMKKyAqLworCisvKgorICogVGhlIGZyZWUgYmxvY2tzIGFyZSBtYW5hZ2VkIGJ5IGJpdG1hcHMuICBBIGZpbGUgc3lzdGVtIGNvbnRhaW5zIHNldmVyYWwKKyAqIGJsb2NrcyBncm91cHMuICBFYWNoIGdyb3VwIGNvbnRhaW5zIDEgYml0bWFwIGJsb2NrIGZvciBibG9ja3MsIDEgYml0bWFwCisgKiBibG9jayBmb3IgaW5vZGVzLCBOIGJsb2NrcyBmb3IgdGhlIGlub2RlIHRhYmxlIGFuZCBkYXRhIGJsb2Nrcy4KKyAqCisgKiBUaGUgZmlsZSBzeXN0ZW0gY29udGFpbnMgZ3JvdXAgZGVzY3JpcHRvcnMgd2hpY2ggYXJlIGxvY2F0ZWQgYWZ0ZXIgdGhlCisgKiBzdXBlciBibG9jay4gIEVhY2ggZGVzY3JpcHRvciBjb250YWlucyB0aGUgbnVtYmVyIG9mIHRoZSBiaXRtYXAgYmxvY2sgYW5kCisgKiB0aGUgZnJlZSBibG9ja3MgY291bnQgaW4gdGhlIGJsb2NrLiAgVGhlIGRlc2NyaXB0b3JzIGFyZSBsb2FkZWQgaW4gbWVtb3J5CisgKiB3aGVuIGEgZmlsZSBzeXN0ZW0gaXMgbW91bnRlZCAoc2VlIGV4dDJfcmVhZF9zdXBlcikuCisgKi8KKworCisjZGVmaW5lIGluX3JhbmdlKGIsIGZpcnN0LCBsZW4pCSgoYikgPj0gKGZpcnN0KSAmJiAoYikgPD0gKGZpcnN0KSArIChsZW4pIC0gMSkKKworc3RydWN0IGV4dDJfZ3JvdXBfZGVzYyAqIGV4dDJfZ2V0X2dyb3VwX2Rlc2Moc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IGJsb2NrX2dyb3VwLAorCQkJCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKiBiaCkKK3sKKwl1bnNpZ25lZCBsb25nIGdyb3VwX2Rlc2M7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJc3RydWN0IGV4dDJfZ3JvdXBfZGVzYyAqIGRlc2M7CisJc3RydWN0IGV4dDJfc2JfaW5mbyAqc2JpID0gRVhUMl9TQihzYik7CisKKwlpZiAoYmxvY2tfZ3JvdXAgPj0gc2JpLT5zX2dyb3Vwc19jb3VudCkgeworCQlleHQyX2Vycm9yIChzYiwgImV4dDJfZ2V0X2dyb3VwX2Rlc2MiLAorCQkJICAgICJibG9ja19ncm91cCA+PSBncm91cHNfY291bnQgLSAiCisJCQkgICAgImJsb2NrX2dyb3VwID0gJWQsIGdyb3Vwc19jb3VudCA9ICVsdSIsCisJCQkgICAgYmxvY2tfZ3JvdXAsIHNiaS0+c19ncm91cHNfY291bnQpOworCisJCXJldHVybiBOVUxMOworCX0KKworCWdyb3VwX2Rlc2MgPSBibG9ja19ncm91cCA+PiBFWFQyX0RFU0NfUEVSX0JMT0NLX0JJVFMoc2IpOworCW9mZnNldCA9IGJsb2NrX2dyb3VwICYgKEVYVDJfREVTQ19QRVJfQkxPQ0soc2IpIC0gMSk7CisJaWYgKCFzYmktPnNfZ3JvdXBfZGVzY1tncm91cF9kZXNjXSkgeworCQlleHQyX2Vycm9yIChzYiwgImV4dDJfZ2V0X2dyb3VwX2Rlc2MiLAorCQkJICAgICJHcm91cCBkZXNjcmlwdG9yIG5vdCBsb2FkZWQgLSAiCisJCQkgICAgImJsb2NrX2dyb3VwID0gJWQsIGdyb3VwX2Rlc2MgPSAlbHUsIGRlc2MgPSAlbHUiLAorCQkJICAgICBibG9ja19ncm91cCwgZ3JvdXBfZGVzYywgb2Zmc2V0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZGVzYyA9IChzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjICopIHNiaS0+c19ncm91cF9kZXNjW2dyb3VwX2Rlc2NdLT5iX2RhdGE7CisJaWYgKGJoKQorCQkqYmggPSBzYmktPnNfZ3JvdXBfZGVzY1tncm91cF9kZXNjXTsKKwlyZXR1cm4gZGVzYyArIG9mZnNldDsKK30KKworLyoKKyAqIFJlYWQgdGhlIGJpdG1hcCBmb3IgYSBnaXZlbiBibG9ja19ncm91cCwgcmVhZGluZyBpbnRvIHRoZSBzcGVjaWZpZWQgCisgKiBzbG90IGluIHRoZSBzdXBlcmJsb2NrJ3MgYml0bWFwIGNhY2hlLgorICoKKyAqIFJldHVybiBidWZmZXJfaGVhZCBvbiBzdWNjZXNzIG9yIE5VTEwgaW4gY2FzZSBvZiBmYWlsdXJlLgorICovCitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICoKK3JlYWRfYmxvY2tfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGludCBibG9ja19ncm91cCkKK3sKKwlzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjICogZGVzYzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCA9IE5VTEw7CisJCisJZGVzYyA9IGV4dDJfZ2V0X2dyb3VwX2Rlc2MgKHNiLCBibG9ja19ncm91cCwgTlVMTCk7CisJaWYgKCFkZXNjKQorCQlnb3RvIGVycm9yX291dDsKKwliaCA9IHNiX2JyZWFkKHNiLCBsZTMyX3RvX2NwdShkZXNjLT5iZ19ibG9ja19iaXRtYXApKTsKKwlpZiAoIWJoKQorCQlleHQyX2Vycm9yIChzYiwgInJlYWRfYmxvY2tfYml0bWFwIiwKKwkJCSAgICAiQ2Fubm90IHJlYWQgYmxvY2sgYml0bWFwIC0gIgorCQkJICAgICJibG9ja19ncm91cCA9ICVkLCBibG9ja19iaXRtYXAgPSAldSIsCisJCQkgICAgYmxvY2tfZ3JvdXAsIGxlMzJfdG9fY3B1KGRlc2MtPmJnX2Jsb2NrX2JpdG1hcCkpOworZXJyb3Jfb3V0OgorCXJldHVybiBiaDsKK30KKworLyoKKyAqIFNldCBzYi0+c19kaXJ0IGhlcmUgYmVjYXVzZSB0aGUgc3VwZXJibG9jayB3YXMgImxvZ2ljYWxseSIgYWx0ZXJlZC4gIFdlCisgKiBuZWVkIHRvIHJlY2FsY3VsYXRlIGl0cyBmcmVlIGJsb2NrcyBjb3VudCBhbmQgZmx1c2ggaXQgb3V0LgorICovCitzdGF0aWMgaW50IHJlc2VydmVfYmxvY2tzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgZXh0Ml9zYl9pbmZvICpzYmkgPSBFWFQyX1NCKHNiKTsKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqZXMgPSBzYmktPnNfZXM7CisJdW5zaWduZWQgZnJlZV9ibG9ja3M7CisJdW5zaWduZWQgcm9vdF9ibG9ja3M7CisKKwlmcmVlX2Jsb2NrcyA9IHBlcmNwdV9jb3VudGVyX3JlYWRfcG9zaXRpdmUoJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIpOworCXJvb3RfYmxvY2tzID0gbGUzMl90b19jcHUoZXMtPnNfcl9ibG9ja3NfY291bnQpOworCisJaWYgKGZyZWVfYmxvY2tzIDwgY291bnQpCisJCWNvdW50ID0gZnJlZV9ibG9ja3M7CisKKwlpZiAoZnJlZV9ibG9ja3MgPCByb290X2Jsb2NrcyArIGNvdW50ICYmICFjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpICYmCisJICAgIHNiaS0+c19yZXN1aWQgIT0gY3VycmVudC0+ZnN1aWQgJiYKKwkgICAgKHNiaS0+c19yZXNnaWQgPT0gMCB8fCAhaW5fZ3JvdXBfcCAoc2JpLT5zX3Jlc2dpZCkpKSB7CisJCS8qCisJCSAqIFdlIGFyZSB0b28gY2xvc2UgdG8gcmVzZXJ2ZSBhbmQgd2UgYXJlIG5vdCBwcml2aWxlZ2VkLgorCQkgKiBDYW4gd2UgYWxsb2NhdGUgYW55dGhpbmcgYXQgYWxsPworCQkgKi8KKwkJaWYgKGZyZWVfYmxvY2tzID4gcm9vdF9ibG9ja3MpCisJCQljb3VudCA9IGZyZWVfYmxvY2tzIC0gcm9vdF9ibG9ja3M7CisJCWVsc2UKKwkJCXJldHVybiAwOworCX0KKworCXBlcmNwdV9jb3VudGVyX21vZCgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlciwgLWNvdW50KTsKKwlzYi0+c19kaXJ0ID0gMTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfYmxvY2tzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBjb3VudCkKK3sKKwlpZiAoY291bnQpIHsKKwkJc3RydWN0IGV4dDJfc2JfaW5mbyAqc2JpID0gRVhUMl9TQihzYik7CisKKwkJcGVyY3B1X2NvdW50ZXJfbW9kKCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyLCBjb3VudCk7CisJCXNiLT5zX2RpcnQgPSAxOworCX0KK30KKworc3RhdGljIGludCBncm91cF9yZXNlcnZlX2Jsb2NrcyhzdHJ1Y3QgZXh0Ml9zYl9pbmZvICpzYmksIGludCBncm91cF9ubywKKwlzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjICpkZXNjLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgY291bnQpCit7CisJdW5zaWduZWQgZnJlZV9ibG9ja3M7CisKKwlpZiAoIWRlc2MtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KQorCQlyZXR1cm4gMDsKKworCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhzYmksIGdyb3VwX25vKSk7CisJZnJlZV9ibG9ja3MgPSBsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCk7CisJaWYgKGZyZWVfYmxvY2tzIDwgY291bnQpCisJCWNvdW50ID0gZnJlZV9ibG9ja3M7CisJZGVzYy0+YmdfZnJlZV9ibG9ja3NfY291bnQgPSBjcHVfdG9fbGUxNihmcmVlX2Jsb2NrcyAtIGNvdW50KTsKKwlzcGluX3VubG9jayhzYl9iZ2xfbG9jayhzYmksIGdyb3VwX25vKSk7CisJbWFya19idWZmZXJfZGlydHkoYmgpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHZvaWQgZ3JvdXBfcmVsZWFzZV9ibG9ja3Moc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGdyb3VwX25vLAorCXN0cnVjdCBleHQyX2dyb3VwX2Rlc2MgKmRlc2MsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCBjb3VudCkKK3sKKwlpZiAoY291bnQpIHsKKwkJc3RydWN0IGV4dDJfc2JfaW5mbyAqc2JpID0gRVhUMl9TQihzYik7CisJCXVuc2lnbmVkIGZyZWVfYmxvY2tzOworCisJCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhzYmksIGdyb3VwX25vKSk7CisJCWZyZWVfYmxvY2tzID0gbGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9ibG9ja3NfY291bnQpOworCQlkZXNjLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCA9IGNwdV90b19sZTE2KGZyZWVfYmxvY2tzICsgY291bnQpOworCQlzcGluX3VubG9jayhzYl9iZ2xfbG9jayhzYmksIGdyb3VwX25vKSk7CisJCXNiLT5zX2RpcnQgPSAxOworCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJfQorfQorCisvKiBGcmVlIGdpdmVuIGJsb2NrcywgdXBkYXRlIHF1b3RhIGFuZCBpX2Jsb2NrcyBmaWVsZCAqLwordm9pZCBleHQyX2ZyZWVfYmxvY2tzIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgdW5zaWduZWQgbG9uZyBibG9jaywKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmggPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoMjsKKwl1bnNpZ25lZCBsb25nIGJsb2NrX2dyb3VwOworCXVuc2lnbmVkIGxvbmcgYml0OworCXVuc2lnbmVkIGxvbmcgaTsKKwl1bnNpZ25lZCBsb25nIG92ZXJmbG93OworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGV4dDJfc2JfaW5mbyAqIHNiaSA9IEVYVDJfU0Ioc2IpOworCXN0cnVjdCBleHQyX2dyb3VwX2Rlc2MgKiBkZXNjOworCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICogZXMgPSBzYmktPnNfZXM7CisJdW5zaWduZWQgZnJlZWQgPSAwLCBncm91cF9mcmVlZDsKKworCWlmIChibG9jayA8IGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2RhdGFfYmxvY2spIHx8CisJICAgIGJsb2NrICsgY291bnQgPCBibG9jayB8fAorCSAgICBibG9jayArIGNvdW50ID4gbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KSkgeworCQlleHQyX2Vycm9yIChzYiwgImV4dDJfZnJlZV9ibG9ja3MiLAorCQkJICAgICJGcmVlaW5nIGJsb2NrcyBub3QgaW4gZGF0YXpvbmUgLSAiCisJCQkgICAgImJsb2NrID0gJWx1LCBjb3VudCA9ICVsdSIsIGJsb2NrLCBjb3VudCk7CisJCWdvdG8gZXJyb3JfcmV0dXJuOworCX0KKworCWV4dDJfZGVidWcgKCJmcmVlaW5nIGJsb2NrKHMpICVsdS0lbHVcbiIsIGJsb2NrLCBibG9jayArIGNvdW50IC0gMSk7CisKK2RvX21vcmU6CisJb3ZlcmZsb3cgPSAwOworCWJsb2NrX2dyb3VwID0gKGJsb2NrIC0gbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jaykpIC8KKwkJICAgICAgRVhUMl9CTE9DS1NfUEVSX0dST1VQKHNiKTsKKwliaXQgPSAoYmxvY2sgLSBsZTMyX3RvX2NwdShlcy0+c19maXJzdF9kYXRhX2Jsb2NrKSkgJQorCQkgICAgICBFWFQyX0JMT0NLU19QRVJfR1JPVVAoc2IpOworCS8qCisJICogQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBmcmVlaW5nIGJsb2NrcyBhY3Jvc3MgYSBncm91cAorCSAqIGJvdW5kYXJ5LgorCSAqLworCWlmIChiaXQgKyBjb3VudCA+IEVYVDJfQkxPQ0tTX1BFUl9HUk9VUChzYikpIHsKKwkJb3ZlcmZsb3cgPSBiaXQgKyBjb3VudCAtIEVYVDJfQkxPQ0tTX1BFUl9HUk9VUChzYik7CisJCWNvdW50IC09IG92ZXJmbG93OworCX0KKwlicmVsc2UoYml0bWFwX2JoKTsKKwliaXRtYXBfYmggPSByZWFkX2Jsb2NrX2JpdG1hcChzYiwgYmxvY2tfZ3JvdXApOworCWlmICghYml0bWFwX2JoKQorCQlnb3RvIGVycm9yX3JldHVybjsKKworCWRlc2MgPSBleHQyX2dldF9ncm91cF9kZXNjIChzYiwgYmxvY2tfZ3JvdXAsICZiaDIpOworCWlmICghZGVzYykKKwkJZ290byBlcnJvcl9yZXR1cm47CisKKwlpZiAoaW5fcmFuZ2UgKGxlMzJfdG9fY3B1KGRlc2MtPmJnX2Jsb2NrX2JpdG1hcCksIGJsb2NrLCBjb3VudCkgfHwKKwkgICAgaW5fcmFuZ2UgKGxlMzJfdG9fY3B1KGRlc2MtPmJnX2lub2RlX2JpdG1hcCksIGJsb2NrLCBjb3VudCkgfHwKKwkgICAgaW5fcmFuZ2UgKGJsb2NrLCBsZTMyX3RvX2NwdShkZXNjLT5iZ19pbm9kZV90YWJsZSksCisJCSAgICAgIHNiaS0+c19pdGJfcGVyX2dyb3VwKSB8fAorCSAgICBpbl9yYW5nZSAoYmxvY2sgKyBjb3VudCAtIDEsIGxlMzJfdG9fY3B1KGRlc2MtPmJnX2lub2RlX3RhYmxlKSwKKwkJICAgICAgc2JpLT5zX2l0Yl9wZXJfZ3JvdXApKQorCQlleHQyX2Vycm9yIChzYiwgImV4dDJfZnJlZV9ibG9ja3MiLAorCQkJICAgICJGcmVlaW5nIGJsb2NrcyBpbiBzeXN0ZW0gem9uZXMgLSAiCisJCQkgICAgIkJsb2NrID0gJWx1LCBjb3VudCA9ICVsdSIsCisJCQkgICAgYmxvY2ssIGNvdW50KTsKKworCWZvciAoaSA9IDAsIGdyb3VwX2ZyZWVkID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJaWYgKCFleHQyX2NsZWFyX2JpdF9hdG9taWMoc2JfYmdsX2xvY2soc2JpLCBibG9ja19ncm91cCksCisJCQkJCQliaXQgKyBpLCBiaXRtYXBfYmgtPmJfZGF0YSkpIHsKKwkJCWV4dDJfZXJyb3Ioc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkiYml0IGFscmVhZHkgY2xlYXJlZCBmb3IgYmxvY2sgJWx1IiwgYmxvY2sgKyBpKTsKKwkJfSBlbHNlIHsKKwkJCWdyb3VwX2ZyZWVkKys7CisJCX0KKwl9CisKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaXRtYXBfYmgpOworCWlmIChzYi0+c19mbGFncyAmIE1TX1NZTkNIUk9OT1VTKQorCQlzeW5jX2RpcnR5X2J1ZmZlcihiaXRtYXBfYmgpOworCisJZ3JvdXBfcmVsZWFzZV9ibG9ja3Moc2IsIGJsb2NrX2dyb3VwLCBkZXNjLCBiaDIsIGdyb3VwX2ZyZWVkKTsKKwlmcmVlZCArPSBncm91cF9mcmVlZDsKKworCWlmIChvdmVyZmxvdykgeworCQlibG9jayArPSBjb3VudDsKKwkJY291bnQgPSBvdmVyZmxvdzsKKwkJZ290byBkb19tb3JlOworCX0KK2Vycm9yX3JldHVybjoKKwlicmVsc2UoYml0bWFwX2JoKTsKKwlyZWxlYXNlX2Jsb2NrcyhzYiwgZnJlZWQpOworCURRVU9UX0ZSRUVfQkxPQ0soaW5vZGUsIGZyZWVkKTsKK30KKworc3RhdGljIGludCBncmFiX2Jsb2NrKHNwaW5sb2NrX3QgKmxvY2ssIGNoYXIgKm1hcCwgdW5zaWduZWQgc2l6ZSwgaW50IGdvYWwpCit7CisJaW50IGs7CisJY2hhciAqcCwgKnI7CisKKwlpZiAoIWV4dDJfdGVzdF9iaXQoZ29hbCwgbWFwKSkKKwkJZ290byBnb3RfaXQ7CisKK3JlcGVhdDoKKwlpZiAoZ29hbCkgeworCQkvKgorCQkgKiBUaGUgZ29hbCB3YXMgb2NjdXBpZWQ7IHNlYXJjaCBmb3J3YXJkIGZvciBhIGZyZWUgCisJCSAqIGJsb2NrIHdpdGhpbiB0aGUgbmV4dCBYWCBibG9ja3MuCisJCSAqCisJCSAqIGVuZF9nb2FsIGlzIG1vcmUgb3IgbGVzcyByYW5kb20sIGJ1dCBpdCBoYXMgdG8gYmUKKwkJICogbGVzcyB0aGFuIEVYVDJfQkxPQ0tTX1BFUl9HUk9VUC4gQWxpZ25pbmcgdXAgdG8gdGhlCisJCSAqIG5leHQgNjQtYml0IGJvdW5kYXJ5IGlzIHNpbXBsZS4uCisJCSAqLworCQlrID0gKGdvYWwgKyA2MykgJiB+NjM7CisJCWdvYWwgPSBleHQyX2ZpbmRfbmV4dF96ZXJvX2JpdChtYXAsIGssIGdvYWwpOworCQlpZiAoZ29hbCA8IGspCisJCQlnb3RvIGdvdF9pdDsKKwkJLyoKKwkJICogU2VhcmNoIGluIHRoZSByZW1haW5kZXIgb2YgdGhlIGN1cnJlbnQgZ3JvdXAuCisJCSAqLworCX0KKworCXAgPSBtYXAgKyAoZ29hbCA+PiAzKTsKKwlyID0gbWVtc2NhbihwLCAwLCAoc2l6ZSAtIGdvYWwgKyA3KSA+PiAzKTsKKwlrID0gKHIgLSBtYXApIDw8IDM7CisJaWYgKGsgPCBzaXplKSB7CisJCS8qIAorCQkgKiBXZSBoYXZlIHN1Y2NlZWRlZCBpbiBmaW5kaW5nIGEgZnJlZSBieXRlIGluIHRoZSBibG9jaworCQkgKiBiaXRtYXAuICBOb3cgc2VhcmNoIGJhY2t3YXJkcyB0byBmaW5kIHRoZSBzdGFydCBvZiB0aGlzCisJCSAqIGdyb3VwIG9mIGZyZWUgYmxvY2tzIC0gd29uJ3QgdGFrZSBtb3JlIHRoYW4gNyBpdGVyYXRpb25zLgorCQkgKi8KKwkJZm9yIChnb2FsID0gazsgZ29hbCAmJiAhZXh0Ml90ZXN0X2JpdCAoZ29hbCAtIDEsIG1hcCk7IGdvYWwtLSkKKwkJCTsKKwkJZ290byBnb3RfaXQ7CisJfQorCisJayA9IGV4dDJfZmluZF9uZXh0X3plcm9fYml0ICgodTMyICopbWFwLCBzaXplLCBnb2FsKTsKKwlpZiAoayA8IHNpemUpIHsKKwkJZ29hbCA9IGs7CisJCWdvdG8gZ290X2l0OworCX0KKwlyZXR1cm4gLTE7Citnb3RfaXQ6CisJaWYgKGV4dDJfc2V0X2JpdF9hdG9taWMobG9jaywgZ29hbCwgKHZvaWQgKikgbWFwKSkgCisJCWdvdG8gcmVwZWF0OwkKKwlyZXR1cm4gZ29hbDsKK30KKworLyoKKyAqIGV4dDJfbmV3X2Jsb2NrIHVzZXMgYSBnb2FsIGJsb2NrIHRvIGFzc2lzdCBhbGxvY2F0aW9uLiAgSWYgdGhlIGdvYWwgaXMKKyAqIGZyZWUsIG9yIHRoZXJlIGlzIGEgZnJlZSBibG9jayB3aXRoaW4gMzIgYmxvY2tzIG9mIHRoZSBnb2FsLCB0aGF0IGJsb2NrCisgKiBpcyBhbGxvY2F0ZWQuICBPdGhlcndpc2UgYSBmb3J3YXJkIHNlYXJjaCBpcyBtYWRlIGZvciBhIGZyZWUgYmxvY2s7IHdpdGhpbiAKKyAqIGVhY2ggYmxvY2sgZ3JvdXAgdGhlIHNlYXJjaCBmaXJzdCBsb29rcyBmb3IgYW4gZW50aXJlIGZyZWUgYnl0ZSBpbiB0aGUgYmxvY2sKKyAqIGJpdG1hcCwgYW5kIHRoZW4gZm9yIGFueSBmcmVlIGJpdCBpZiB0aGF0IGZhaWxzLgorICogVGhpcyBmdW5jdGlvbiBhbHNvIHVwZGF0ZXMgcXVvdGEgYW5kIGlfYmxvY2tzIGZpZWxkLgorICovCitpbnQgZXh0Ml9uZXdfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgbG9uZyBnb2FsLAorCQkJdTMyICpwcmVhbGxvY19jb3VudCwgdTMyICpwcmVhbGxvY19ibG9jaywgaW50ICplcnIpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmggPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZ2RwX2JoOwkvKiBiaDIgKi8KKwlzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjICpkZXNjOworCWludCBncm91cF9ubzsJCQkvKiBpICovCisJaW50IHJldF9ibG9jazsJCQkvKiBqICovCisJaW50IGdyb3VwX2lkeDsJCQkvKiBrICovCisJaW50IHRhcmdldF9ibG9jazsJCS8qIHRtcCAqLworCWludCBibG9jayA9IDA7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBleHQyX3NiX2luZm8gKnNiaSA9IEVYVDJfU0Ioc2IpOworCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICplcyA9IHNiaS0+c19lczsKKwl1bnNpZ25lZCBncm91cF9zaXplID0gRVhUMl9CTE9DS1NfUEVSX0dST1VQKHNiKTsKKwl1bnNpZ25lZCBwcmVhbGxvY19nb2FsID0gZXMtPnNfcHJlYWxsb2NfYmxvY2tzOworCXVuc2lnbmVkIGdyb3VwX2FsbG9jID0gMCwgZXNfYWxsb2MsIGRxX2FsbG9jOworCWludCBucl9zY2FubmVkX2dyb3VwczsKKworCWlmICghcHJlYWxsb2NfZ29hbC0tKQorCQlwcmVhbGxvY19nb2FsID0gRVhUMl9ERUZBVUxUX1BSRUFMTE9DX0JMT0NLUyAtIDE7CisJaWYgKCFwcmVhbGxvY19jb3VudCB8fCAqcHJlYWxsb2NfY291bnQpCisJCXByZWFsbG9jX2dvYWwgPSAwOworCisJaWYgKERRVU9UX0FMTE9DX0JMT0NLKGlub2RlLCAxKSkgeworCQkqZXJyID0gLUVEUVVPVDsKKwkJZ290byBvdXQ7CisJfQorCisJd2hpbGUgKHByZWFsbG9jX2dvYWwgJiYgRFFVT1RfUFJFQUxMT0NfQkxPQ0soaW5vZGUsIHByZWFsbG9jX2dvYWwpKQorCQlwcmVhbGxvY19nb2FsLS07CisKKwlkcV9hbGxvYyA9IHByZWFsbG9jX2dvYWwgKyAxOworCWVzX2FsbG9jID0gcmVzZXJ2ZV9ibG9ja3Moc2IsIGRxX2FsbG9jKTsKKwlpZiAoIWVzX2FsbG9jKSB7CisJCSplcnIgPSAtRU5PU1BDOworCQlnb3RvIG91dF9kcXVvdDsKKwl9CisKKwlleHQyX2RlYnVnICgiZ29hbD0lbHUuXG4iLCBnb2FsKTsKKworCWlmIChnb2FsIDwgbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jaykgfHwKKwkgICAgZ29hbCA+PSBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpKQorCQlnb2FsID0gbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jayk7CisJZ3JvdXBfbm8gPSAoZ29hbCAtIGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2RhdGFfYmxvY2spKSAvIGdyb3VwX3NpemU7CisJZGVzYyA9IGV4dDJfZ2V0X2dyb3VwX2Rlc2MgKHNiLCBncm91cF9ubywgJmdkcF9iaCk7CisJaWYgKCFkZXNjKSB7CisJCS8qCisJCSAqIGdkcF9iaCBtYXkgc3RpbGwgYmUgdW5pbml0aWFsaXNlZC4gIEJ1dCBncm91cF9yZWxlYXNlX2Jsb2NrcworCQkgKiB3aWxsIG5vdCB0b3VjaCBpdCBiZWNhdXNlIGdyb3VwX2FsbG9jIGlzIHplcm8uCisJCSAqLworCQlnb3RvIGlvX2Vycm9yOworCX0KKworCWdyb3VwX2FsbG9jID0gZ3JvdXBfcmVzZXJ2ZV9ibG9ja3Moc2JpLCBncm91cF9ubywgZGVzYywKKwkJCQkJZ2RwX2JoLCBlc19hbGxvYyk7CisJaWYgKGdyb3VwX2FsbG9jKSB7CisJCXJldF9ibG9jayA9ICgoZ29hbCAtIGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2RhdGFfYmxvY2spKSAlCisJCQkJCWdyb3VwX3NpemUpOworCQlicmVsc2UoYml0bWFwX2JoKTsKKwkJYml0bWFwX2JoID0gcmVhZF9ibG9ja19iaXRtYXAoc2IsIGdyb3VwX25vKTsKKwkJaWYgKCFiaXRtYXBfYmgpCisJCQlnb3RvIGlvX2Vycm9yOworCQkKKwkJZXh0Ml9kZWJ1ZygiZ29hbCBpcyBhdCAlZDolZC5cbiIsIGdyb3VwX25vLCByZXRfYmxvY2spOworCisJCXJldF9ibG9jayA9IGdyYWJfYmxvY2soc2JfYmdsX2xvY2soc2JpLCBncm91cF9ubyksCisJCQkJYml0bWFwX2JoLT5iX2RhdGEsIGdyb3VwX3NpemUsIHJldF9ibG9jayk7CisJCWlmIChyZXRfYmxvY2sgPj0gMCkKKwkJCWdvdG8gZ290X2Jsb2NrOworCQlncm91cF9yZWxlYXNlX2Jsb2NrcyhzYiwgZ3JvdXBfbm8sIGRlc2MsIGdkcF9iaCwgZ3JvdXBfYWxsb2MpOworCQlncm91cF9hbGxvYyA9IDA7CisJfQorCisJZXh0Ml9kZWJ1ZyAoIkJpdCBub3QgZm91bmQgaW4gYmxvY2sgZ3JvdXAgJWQuXG4iLCBncm91cF9ubyk7CisKKwkvKgorCSAqIE5vdyBzZWFyY2ggdGhlIHJlc3Qgb2YgdGhlIGdyb3Vwcy4gIFdlIGFzc3VtZSB0aGF0IAorCSAqIGkgYW5kIGRlc2MgY29ycmVjdGx5IHBvaW50IHRvIHRoZSBsYXN0IGdyb3VwIHZpc2l0ZWQuCisJICovCisJbnJfc2Nhbm5lZF9ncm91cHMgPSAwOworcmV0cnk6CisJZm9yIChncm91cF9pZHggPSAwOyAhZ3JvdXBfYWxsb2MgJiYKKwkJCWdyb3VwX2lkeCA8IHNiaS0+c19ncm91cHNfY291bnQ7IGdyb3VwX2lkeCsrKSB7CisJCWdyb3VwX25vKys7CisJCWlmIChncm91cF9ubyA+PSBzYmktPnNfZ3JvdXBzX2NvdW50KQorCQkJZ3JvdXBfbm8gPSAwOworCQlkZXNjID0gZXh0Ml9nZXRfZ3JvdXBfZGVzYyhzYiwgZ3JvdXBfbm8sICZnZHBfYmgpOworCQlpZiAoIWRlc2MpCisJCQlnb3RvIGlvX2Vycm9yOworCQlncm91cF9hbGxvYyA9IGdyb3VwX3Jlc2VydmVfYmxvY2tzKHNiaSwgZ3JvdXBfbm8sIGRlc2MsCisJCQkJCQlnZHBfYmgsIGVzX2FsbG9jKTsKKwl9CisJaWYgKCFncm91cF9hbGxvYykgeworCQkqZXJyID0gLUVOT1NQQzsKKwkJZ290byBvdXRfcmVsZWFzZTsKKwl9CisJYnJlbHNlKGJpdG1hcF9iaCk7CisJYml0bWFwX2JoID0gcmVhZF9ibG9ja19iaXRtYXAoc2IsIGdyb3VwX25vKTsKKwlpZiAoIWJpdG1hcF9iaCkKKwkJZ290byBpb19lcnJvcjsKKworCXJldF9ibG9jayA9IGdyYWJfYmxvY2soc2JfYmdsX2xvY2soc2JpLCBncm91cF9ubyksIGJpdG1hcF9iaC0+Yl9kYXRhLAorCQkJCWdyb3VwX3NpemUsIDApOworCWlmIChyZXRfYmxvY2sgPCAwKSB7CisJCS8qCisJCSAqIElmIGEgZnJlZSBibG9jayBjb3VudGVyIGlzIGNvcnJ1cHRlZCB3ZSBjYW4gbG9vcCBpbmlmaW50ZWx5LgorCQkgKiBEZXRlY3QgdGhhdCBoZXJlLgorCQkgKi8KKwkJbnJfc2Nhbm5lZF9ncm91cHMrKzsKKwkJaWYgKG5yX3NjYW5uZWRfZ3JvdXBzID4gMiAqIHNiaS0+c19ncm91cHNfY291bnQpIHsKKwkJCWV4dDJfZXJyb3Ioc2IsICJleHQyX25ld19ibG9jayIsCisJCQkJImNvcnJ1cHRlZCBmcmVlIGJsb2NrcyBjb3VudGVycyIpOworCQkJZ290byBpb19lcnJvcjsKKwkJfQorCQkvKgorCQkgKiBTb21lb25lIGVsc2UgZ3JhYmJlZCB0aGUgbGFzdCBmcmVlIGJsb2NrIGluIHRoaXMgYmxvY2tncm91cAorCQkgKiBiZWZvcmUgdXMuICBSZXRyeSB0aGUgc2Nhbi4KKwkJICovCisJCWdyb3VwX3JlbGVhc2VfYmxvY2tzKHNiLCBncm91cF9ubywgZGVzYywgZ2RwX2JoLCBncm91cF9hbGxvYyk7CisJCWdyb3VwX2FsbG9jID0gMDsKKwkJZ290byByZXRyeTsKKwl9CisKK2dvdF9ibG9jazoKKwlleHQyX2RlYnVnKCJ1c2luZyBibG9jayBncm91cCAlZCglZClcbiIsCisJCWdyb3VwX25vLCBkZXNjLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCk7CisKKwl0YXJnZXRfYmxvY2sgPSByZXRfYmxvY2sgKyBncm91cF9ubyAqIGdyb3VwX3NpemUgKworCQkJbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jayk7CisKKwlpZiAodGFyZ2V0X2Jsb2NrID09IGxlMzJfdG9fY3B1KGRlc2MtPmJnX2Jsb2NrX2JpdG1hcCkgfHwKKwkgICAgdGFyZ2V0X2Jsb2NrID09IGxlMzJfdG9fY3B1KGRlc2MtPmJnX2lub2RlX2JpdG1hcCkgfHwKKwkgICAgaW5fcmFuZ2UodGFyZ2V0X2Jsb2NrLCBsZTMyX3RvX2NwdShkZXNjLT5iZ19pbm9kZV90YWJsZSksCisJCSAgICAgIHNiaS0+c19pdGJfcGVyX2dyb3VwKSkKKwkJZXh0Ml9lcnJvciAoc2IsICJleHQyX25ld19ibG9jayIsCisJCQkgICAgIkFsbG9jYXRpbmcgYmxvY2sgaW4gc3lzdGVtIHpvbmUgLSAiCisJCQkgICAgImJsb2NrID0gJXUiLCB0YXJnZXRfYmxvY2spOworCisJaWYgKHRhcmdldF9ibG9jayA+PSBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpKSB7CisJCWV4dDJfZXJyb3IgKHNiLCAiZXh0Ml9uZXdfYmxvY2siLAorCQkJICAgICJibG9jayglZCkgPj0gYmxvY2tzIGNvdW50KCVkKSAtICIKKwkJCSAgICAiYmxvY2tfZ3JvdXAgPSAlZCwgZXMgPT0gJXAgIiwgcmV0X2Jsb2NrLAorCQkJbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KSwgZ3JvdXBfbm8sIGVzKTsKKwkJZ290byBpb19lcnJvcjsKKwl9CisJYmxvY2sgPSB0YXJnZXRfYmxvY2s7CisKKwkvKiBPSywgd2UgX2hhZF8gYWxsb2NhdGVkIHNvbWV0aGluZyAqLworCWV4dDJfZGVidWcoImZvdW5kIGJpdCAlZFxuIiwgcmV0X2Jsb2NrKTsKKworCWRxX2FsbG9jLS07CisJZXNfYWxsb2MtLTsKKwlncm91cF9hbGxvYy0tOworCisJLyoKKwkgKiBEbyBibG9jayBwcmVhbGxvY2F0aW9uIG5vdyBpZiByZXF1aXJlZC4KKwkgKi8KKwl3cml0ZV9sb2NrKCZFWFQyX0koaW5vZGUpLT5pX21ldGFfbG9jayk7CisJaWYgKGdyb3VwX2FsbG9jICYmICEqcHJlYWxsb2NfY291bnQpIHsKKwkJdW5zaWduZWQgbjsKKworCQlmb3IgKG4gPSAwOyBuIDwgZ3JvdXBfYWxsb2MgJiYgKytyZXRfYmxvY2sgPCBncm91cF9zaXplOyBuKyspIHsKKwkJCWlmIChleHQyX3NldF9iaXRfYXRvbWljKHNiX2JnbF9sb2NrKHNiaSwgZ3JvdXBfbm8pLAorCQkJCQkJcmV0X2Jsb2NrLAorCQkJCQkJKHZvaWQqKSBiaXRtYXBfYmgtPmJfZGF0YSkpCisgCQkJCWJyZWFrOworCQl9CisJCSpwcmVhbGxvY19ibG9jayA9IGJsb2NrICsgMTsKKwkJKnByZWFsbG9jX2NvdW50ID0gbjsKKwkJZXNfYWxsb2MgLT0gbjsKKwkJZHFfYWxsb2MgLT0gbjsKKwkJZ3JvdXBfYWxsb2MgLT0gbjsKKwl9CisJd3JpdGVfdW5sb2NrKCZFWFQyX0koaW5vZGUpLT5pX21ldGFfbG9jayk7CisKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaXRtYXBfYmgpOworCWlmIChzYi0+c19mbGFncyAmIE1TX1NZTkNIUk9OT1VTKQorCQlzeW5jX2RpcnR5X2J1ZmZlcihiaXRtYXBfYmgpOworCisJZXh0Ml9kZWJ1ZyAoImFsbG9jYXRpbmcgYmxvY2sgJWQuICIsIGJsb2NrKTsKKworCSplcnIgPSAwOworb3V0X3JlbGVhc2U6CisJZ3JvdXBfcmVsZWFzZV9ibG9ja3Moc2IsIGdyb3VwX25vLCBkZXNjLCBnZHBfYmgsIGdyb3VwX2FsbG9jKTsKKwlyZWxlYXNlX2Jsb2NrcyhzYiwgZXNfYWxsb2MpOworb3V0X2RxdW90OgorCURRVU9UX0ZSRUVfQkxPQ0soaW5vZGUsIGRxX2FsbG9jKTsKK291dDoKKwlicmVsc2UoYml0bWFwX2JoKTsKKwlyZXR1cm4gYmxvY2s7CisKK2lvX2Vycm9yOgorCSplcnIgPSAtRUlPOworCWdvdG8gb3V0X3JlbGVhc2U7Cit9CisKK3Vuc2lnbmVkIGxvbmcgZXh0Ml9jb3VudF9mcmVlX2Jsb2NrcyAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpCit7CisJc3RydWN0IGV4dDJfZ3JvdXBfZGVzYyAqIGRlc2M7CisJdW5zaWduZWQgbG9uZyBkZXNjX2NvdW50ID0gMDsKKwlpbnQgaTsKKyNpZmRlZiBFWFQyRlNfREVCVUcKKwl1bnNpZ25lZCBsb25nIGJpdG1hcF9jb3VudCwgeDsKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqZXM7CisKKwlsb2NrX3N1cGVyIChzYik7CisJZXMgPSBFWFQyX1NCKHNiKS0+c19lczsKKwlkZXNjX2NvdW50ID0gMDsKKwliaXRtYXBfY291bnQgPSAwOworCWRlc2MgPSBOVUxMOworCWZvciAoaSA9IDA7IGkgPCBFWFQyX1NCKHNiKS0+c19ncm91cHNfY291bnQ7IGkrKykgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpdG1hcF9iaDsKKwkJZGVzYyA9IGV4dDJfZ2V0X2dyb3VwX2Rlc2MgKHNiLCBpLCBOVUxMKTsKKwkJaWYgKCFkZXNjKQorCQkJY29udGludWU7CisJCWRlc2NfY291bnQgKz0gbGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9ibG9ja3NfY291bnQpOworCQliaXRtYXBfYmggPSByZWFkX2Jsb2NrX2JpdG1hcChzYiwgaSk7CisJCWlmICghYml0bWFwX2JoKQorCQkJY29udGludWU7CisJCQorCQl4ID0gZXh0Ml9jb3VudF9mcmVlKGJpdG1hcF9iaCwgc2ItPnNfYmxvY2tzaXplKTsKKwkJcHJpbnRrICgiZ3JvdXAgJWQ6IHN0b3JlZCA9ICVkLCBjb3VudGVkID0gJWx1XG4iLAorCQkJaSwgbGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9ibG9ja3NfY291bnQpLCB4KTsKKwkJYml0bWFwX2NvdW50ICs9IHg7CisJCWJyZWxzZShiaXRtYXBfYmgpOworCX0KKwlwcmludGsoImV4dDJfY291bnRfZnJlZV9ibG9ja3M6IHN0b3JlZCA9ICVsdSwgY29tcHV0ZWQgPSAlbHUsICVsdVxuIiwKKwkJKGxvbmcpbGUzMl90b19jcHUoZXMtPnNfZnJlZV9ibG9ja3NfY291bnQpLAorCQlkZXNjX2NvdW50LCBiaXRtYXBfY291bnQpOworCXVubG9ja19zdXBlciAoc2IpOworCXJldHVybiBiaXRtYXBfY291bnQ7CisjZWxzZQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRVhUMl9TQihzYiktPnNfZ3JvdXBzX2NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBkZXNjID0gZXh0Ml9nZXRfZ3JvdXBfZGVzYyAoc2IsIGksIE5VTEwpOworICAgICAgICAgICAgICAgIGlmICghZGVzYykKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGRlc2NfY291bnQgKz0gbGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9ibG9ja3NfY291bnQpOworCX0KKwlyZXR1cm4gZGVzY19jb3VudDsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIGludAorYmxvY2tfaW5fdXNlKHVuc2lnbmVkIGxvbmcgYmxvY2ssIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGNoYXIgKm1hcCkKK3sKKwlyZXR1cm4gZXh0Ml90ZXN0X2JpdCAoKGJsb2NrIC0KKwkJbGUzMl90b19jcHUoRVhUMl9TQihzYiktPnNfZXMtPnNfZmlyc3RfZGF0YV9ibG9jaykpICUKKwkJCSBFWFQyX0JMT0NLU19QRVJfR1JPVVAoc2IpLCBtYXApOworfQorCitzdGF0aWMgaW5saW5lIGludCB0ZXN0X3Jvb3QoaW50IGEsIGludCBiKQoreworCWludCBudW0gPSBiOworCisJd2hpbGUgKGEgPiBudW0pCisJCW51bSAqPSBiOworCXJldHVybiBudW0gPT0gYTsKK30KKworc3RhdGljIGludCBleHQyX2dyb3VwX3NwYXJzZShpbnQgZ3JvdXApCit7CisJaWYgKGdyb3VwIDw9IDEpCisJCXJldHVybiAxOworCXJldHVybiAodGVzdF9yb290KGdyb3VwLCAzKSB8fCB0ZXN0X3Jvb3QoZ3JvdXAsIDUpIHx8CisJCXRlc3Rfcm9vdChncm91cCwgNykpOworfQorCisvKioKKyAqCWV4dDJfYmdfaGFzX3N1cGVyIC0gbnVtYmVyIG9mIGJsb2NrcyB1c2VkIGJ5IHRoZSBzdXBlcmJsb2NrIGluIGdyb3VwCisgKglAc2I6IHN1cGVyYmxvY2sgZm9yIGZpbGVzeXN0ZW0KKyAqCUBncm91cDogZ3JvdXAgbnVtYmVyIHRvIGNoZWNrCisgKgorICoJUmV0dXJuIHRoZSBudW1iZXIgb2YgYmxvY2tzIHVzZWQgYnkgdGhlIHN1cGVyYmxvY2sgKHByaW1hcnkgb3IgYmFja3VwKQorICoJaW4gdGhpcyBncm91cC4gIEN1cnJlbnRseSB0aGlzIHdpbGwgYmUgb25seSAwIG9yIDEuCisgKi8KK2ludCBleHQyX2JnX2hhc19zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZ3JvdXApCit7CisJaWYgKEVYVDJfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLEVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1BBUlNFX1NVUEVSKSYmCisJICAgICFleHQyX2dyb3VwX3NwYXJzZShncm91cCkpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKioKKyAqCWV4dDJfYmdfbnVtX2dkYiAtIG51bWJlciBvZiBibG9ja3MgdXNlZCBieSB0aGUgZ3JvdXAgdGFibGUgaW4gZ3JvdXAKKyAqCUBzYjogc3VwZXJibG9jayBmb3IgZmlsZXN5c3RlbQorICoJQGdyb3VwOiBncm91cCBudW1iZXIgdG8gY2hlY2sKKyAqCisgKglSZXR1cm4gdGhlIG51bWJlciBvZiBibG9ja3MgdXNlZCBieSB0aGUgZ3JvdXAgZGVzY3JpcHRvciB0YWJsZQorICoJKHByaW1hcnkgb3IgYmFja3VwKSBpbiB0aGlzIGdyb3VwLiAgSW4gdGhlIGZ1dHVyZSB0aGVyZSBtYXkgYmUgYQorICoJZGlmZmVyZW50IG51bWJlciBvZiBkZXNjcmlwdG9yIGJsb2NrcyBpbiBlYWNoIGdyb3VwLgorICovCit1bnNpZ25lZCBsb25nIGV4dDJfYmdfbnVtX2dkYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZ3JvdXApCit7CisJaWYgKEVYVDJfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLEVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1BBUlNFX1NVUEVSKSYmCisJICAgICFleHQyX2dyb3VwX3NwYXJzZShncm91cCkpCisJCXJldHVybiAwOworCXJldHVybiBFWFQyX1NCKHNiKS0+c19nZGJfY291bnQ7Cit9CisKKyNpZmRlZiBDT05GSUdfRVhUMl9DSEVDSworLyogQ2FsbGVkIGF0IG1vdW50LXRpbWUsIHN1cGVyLWJsb2NrIGlzIGxvY2tlZCAqLwordm9pZCBleHQyX2NoZWNrX2Jsb2Nrc19iaXRtYXAgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoID0gTlVMTDsKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqIGVzOworCXVuc2lnbmVkIGxvbmcgZGVzY19jb3VudCwgYml0bWFwX2NvdW50LCB4LCBqOworCXVuc2lnbmVkIGxvbmcgZGVzY19ibG9ja3M7CisJc3RydWN0IGV4dDJfZ3JvdXBfZGVzYyAqIGRlc2M7CisJaW50IGk7CisKKwllcyA9IEVYVDJfU0Ioc2IpLT5zX2VzOworCWRlc2NfY291bnQgPSAwOworCWJpdG1hcF9jb3VudCA9IDA7CisJZGVzYyA9IE5VTEw7CisJZm9yIChpID0gMDsgaSA8IEVYVDJfU0Ioc2IpLT5zX2dyb3Vwc19jb3VudDsgaSsrKSB7CisJCWRlc2MgPSBleHQyX2dldF9ncm91cF9kZXNjIChzYiwgaSwgTlVMTCk7CisJCWlmICghZGVzYykKKwkJCWNvbnRpbnVlOworCQlkZXNjX2NvdW50ICs9IGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KTsKKwkJYnJlbHNlKGJpdG1hcF9iaCk7CisJCWJpdG1hcF9iaCA9IHJlYWRfYmxvY2tfYml0bWFwKHNiLCBpKTsKKwkJaWYgKCFiaXRtYXBfYmgpCisJCQljb250aW51ZTsKKworCQlpZiAoZXh0Ml9iZ19oYXNfc3VwZXIoc2IsIGkpICYmCisJCQkJIWV4dDJfdGVzdF9iaXQoMCwgYml0bWFwX2JoLT5iX2RhdGEpKQorCQkJZXh0Ml9lcnJvcihzYiwgX19GVU5DVElPTl9fLAorCQkJCSAgICJTdXBlcmJsb2NrIGluIGdyb3VwICVkIGlzIG1hcmtlZCBmcmVlIiwgaSk7CisKKwkJZGVzY19ibG9ja3MgPSBleHQyX2JnX251bV9nZGIoc2IsIGkpOworCQlmb3IgKGogPSAwOyBqIDwgZGVzY19ibG9ja3M7IGorKykKKwkJCWlmICghZXh0Ml90ZXN0X2JpdChqICsgMSwgYml0bWFwX2JoLT5iX2RhdGEpKQorCQkJCWV4dDJfZXJyb3Ioc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkJICAgIkRlc2NyaXB0b3IgYmxvY2sgIyVsZCBpbiBncm91cCAiCisJCQkJCSAgICIlZCBpcyBtYXJrZWQgZnJlZSIsIGosIGkpOworCisJCWlmICghYmxvY2tfaW5fdXNlKGxlMzJfdG9fY3B1KGRlc2MtPmJnX2Jsb2NrX2JpdG1hcCksCisJCQkJCXNiLCBiaXRtYXBfYmgtPmJfZGF0YSkpCisJCQlleHQyX2Vycm9yKHNiLCAiZXh0Ml9jaGVja19ibG9ja3NfYml0bWFwIiwKKwkJCQkgICAgIkJsb2NrIGJpdG1hcCBmb3IgZ3JvdXAgJWQgaXMgbWFya2VkIGZyZWUiLAorCQkJCSAgICBpKTsKKworCQlpZiAoIWJsb2NrX2luX3VzZShsZTMyX3RvX2NwdShkZXNjLT5iZ19pbm9kZV9iaXRtYXApLAorCQkJCQlzYiwgYml0bWFwX2JoLT5iX2RhdGEpKQorCQkJZXh0Ml9lcnJvcihzYiwgImV4dDJfY2hlY2tfYmxvY2tzX2JpdG1hcCIsCisJCQkJICAgICJJbm9kZSBiaXRtYXAgZm9yIGdyb3VwICVkIGlzIG1hcmtlZCBmcmVlIiwKKwkJCQkgICAgaSk7CisKKwkJZm9yIChqID0gMDsgaiA8IEVYVDJfU0Ioc2IpLT5zX2l0Yl9wZXJfZ3JvdXA7IGorKykKKwkJCWlmICghYmxvY2tfaW5fdXNlKGxlMzJfdG9fY3B1KGRlc2MtPmJnX2lub2RlX3RhYmxlKSArIGosCisJCQkJCQlzYiwgYml0bWFwX2JoLT5iX2RhdGEpKQorCQkJCWV4dDJfZXJyb3IgKHNiLCAiZXh0Ml9jaGVja19ibG9ja3NfYml0bWFwIiwKKwkJCQkJICAgICJCbG9jayAjJWxkIG9mIHRoZSBpbm9kZSB0YWJsZSBpbiAiCisJCQkJCSAgICAiZ3JvdXAgJWQgaXMgbWFya2VkIGZyZWUiLCBqLCBpKTsKKworCQl4ID0gZXh0Ml9jb3VudF9mcmVlKGJpdG1hcF9iaCwgc2ItPnNfYmxvY2tzaXplKTsKKwkJaWYgKGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KSAhPSB4KQorCQkJZXh0Ml9lcnJvciAoc2IsICJleHQyX2NoZWNrX2Jsb2Nrc19iaXRtYXAiLAorCQkJCSAgICAiV3JvbmcgZnJlZSBibG9ja3MgY291bnQgZm9yIGdyb3VwICVkLCAiCisJCQkJICAgICJzdG9yZWQgPSAlZCwgY291bnRlZCA9ICVsdSIsIGksCisJCQkJICAgIGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KSwgeCk7CisJCWJpdG1hcF9jb3VudCArPSB4OworCX0KKwlpZiAobGUzMl90b19jcHUoZXMtPnNfZnJlZV9ibG9ja3NfY291bnQpICE9IGJpdG1hcF9jb3VudCkKKwkJZXh0Ml9lcnJvciAoc2IsICJleHQyX2NoZWNrX2Jsb2Nrc19iaXRtYXAiLAorCQkJIldyb25nIGZyZWUgYmxvY2tzIGNvdW50IGluIHN1cGVyIGJsb2NrLCAiCisJCQkic3RvcmVkID0gJWx1LCBjb3VudGVkID0gJWx1IiwKKwkJCSh1bnNpZ25lZCBsb25nKWxlMzJfdG9fY3B1KGVzLT5zX2ZyZWVfYmxvY2tzX2NvdW50KSwKKwkJCWJpdG1hcF9jb3VudCk7CisJYnJlbHNlKGJpdG1hcF9iaCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvYml0bWFwLmMgYi9mcy9leHQyL2JpdG1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMTQ1YjcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQyL2JpdG1hcC5jCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiAgbGludXgvZnMvZXh0Mi9iaXRtYXAuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NQorICogUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQorICogTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqLworCisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKworc3RhdGljIGludCBuaWJibGVtYXBbXSA9IHs0LCAzLCAzLCAyLCAzLCAyLCAyLCAxLCAzLCAyLCAyLCAxLCAyLCAxLCAxLCAwfTsKKwordW5zaWduZWQgbG9uZyBleHQyX2NvdW50X2ZyZWUgKHN0cnVjdCBidWZmZXJfaGVhZCAqIG1hcCwgdW5zaWduZWQgaW50IG51bWNoYXJzKQoreworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGxvbmcgc3VtID0gMDsKKwkKKwlpZiAoIW1hcCkgCisJCXJldHVybiAoMCk7CisJZm9yIChpID0gMDsgaSA8IG51bWNoYXJzOyBpKyspCisJCXN1bSArPSBuaWJibGVtYXBbbWFwLT5iX2RhdGFbaV0gJiAweGZdICsKKwkJCW5pYmJsZW1hcFsobWFwLT5iX2RhdGFbaV0gPj4gNCkgJiAweGZdOworCXJldHVybiAoc3VtKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2V4dDIvZGlyLmMgYi9mcy9leHQyL2Rpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNWY1MjgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQyL2Rpci5jCkBAIC0wLDAgKzEsNjczIEBACisvKgorICogIGxpbnV4L2ZzL2V4dDIvZGlyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUKKyAqIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKKyAqIExhYm9yYXRvaXJlIE1BU0kgLSBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogIGZyb20KKyAqCisgKiAgbGludXgvZnMvbWluaXgvZGlyLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICBleHQyIGRpcmVjdG9yeSBoYW5kbGluZyBmdW5jdGlvbnMKKyAqCisgKiAgQmlnLWVuZGlhbiB0byBsaXR0bGUtZW5kaWFuIGJ5dGUtc3dhcHBpbmcvYml0bWFwcyBieQorICogICAgICAgIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSksIDE5OTUKKyAqCisgKiBBbGwgY29kZSB0aGF0IHdvcmtzIHdpdGggZGlyZWN0b3J5IGxheW91dCBoYWQgYmVlbiBzd2l0Y2hlZCB0byBwYWdlY2FjaGUKKyAqIGFuZCBtb3ZlZCBoZXJlLiBBVgorICovCisKKyNpbmNsdWRlICJleHQyLmgiCisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisKK3R5cGVkZWYgc3RydWN0IGV4dDJfZGlyX2VudHJ5XzIgZXh0Ml9kaXJlbnQ7CisKKy8qCisgKiBleHQyIHVzZXMgYmxvY2stc2l6ZWQgY2h1bmtzLiBBcmd1YWJseSwgc2VjdG9yLXNpemVkIG9uZXMgd291bGQgYmUKKyAqIG1vcmUgcm9idXN0LCBidXQgd2UgaGF2ZSB3aGF0IHdlIGhhdmUKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBleHQyX2NodW5rX3NpemUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZXh0Ml9wdXRfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlrdW5tYXAocGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZGlyX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIChpbm9kZS0+aV9zaXplK1BBR0VfQ0FDSEVfU0laRS0xKT4+UEFHRV9DQUNIRV9TSElGVDsKK30KKworLyoKKyAqIFJldHVybiB0aGUgb2Zmc2V0IGludG8gcGFnZSBgcGFnZV9ucicgb2YgdGhlIGxhc3QgdmFsaWQKKyAqIGJ5dGUgaW4gdGhhdCBwYWdlLCBwbHVzIG9uZS4KKyAqLworc3RhdGljIHVuc2lnbmVkCitleHQyX2xhc3RfYnl0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIHBhZ2VfbnIpCit7CisJdW5zaWduZWQgbGFzdF9ieXRlID0gaW5vZGUtPmlfc2l6ZTsKKworCWxhc3RfYnl0ZSAtPSBwYWdlX25yIDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisJaWYgKGxhc3RfYnl0ZSA+IFBBR0VfQ0FDSEVfU0laRSkKKwkJbGFzdF9ieXRlID0gUEFHRV9DQUNIRV9TSVpFOworCXJldHVybiBsYXN0X2J5dGU7Cit9CisKK3N0YXRpYyBpbnQgZXh0Ml9jb21taXRfY2h1bmsoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCXN0cnVjdCBpbm9kZSAqZGlyID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlpbnQgZXJyID0gMDsKKwlkaXItPmlfdmVyc2lvbisrOworCXBhZ2UtPm1hcHBpbmctPmFfb3BzLT5jb21taXRfd3JpdGUoTlVMTCwgcGFnZSwgZnJvbSwgdG8pOworCWlmIChJU19ESVJTWU5DKGRpcikpCisJCWVyciA9IHdyaXRlX29uZV9wYWdlKHBhZ2UsIDEpOworCWVsc2UKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgZXh0Ml9jaGVja19wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBpbm9kZSAqZGlyID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLT5pX3NiOworCXVuc2lnbmVkIGNodW5rX3NpemUgPSBleHQyX2NodW5rX3NpemUoZGlyKTsKKwljaGFyICprYWRkciA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwl1MzIgbWF4X2ludW1iZXIgPSBsZTMyX3RvX2NwdShFWFQyX1NCKHNiKS0+c19lcy0+c19pbm9kZXNfY291bnQpOworCXVuc2lnbmVkIG9mZnMsIHJlY19sZW47CisJdW5zaWduZWQgbGltaXQgPSBQQUdFX0NBQ0hFX1NJWkU7CisJZXh0Ml9kaXJlbnQgKnA7CisJY2hhciAqZXJyb3I7CisKKwlpZiAoKGRpci0+aV9zaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQpID09IHBhZ2UtPmluZGV4KSB7CisJCWxpbWl0ID0gZGlyLT5pX3NpemUgJiB+UEFHRV9DQUNIRV9NQVNLOworCQlpZiAobGltaXQgJiAoY2h1bmtfc2l6ZSAtIDEpKQorCQkJZ290byBFYmFkc2l6ZTsKKwkJaWYgKCFsaW1pdCkKKwkJCWdvdG8gb3V0OworCX0KKwlmb3IgKG9mZnMgPSAwOyBvZmZzIDw9IGxpbWl0IC0gRVhUMl9ESVJfUkVDX0xFTigxKTsgb2ZmcyArPSByZWNfbGVuKSB7CisJCXAgPSAoZXh0Ml9kaXJlbnQgKikoa2FkZHIgKyBvZmZzKTsKKwkJcmVjX2xlbiA9IGxlMTZfdG9fY3B1KHAtPnJlY19sZW4pOworCisJCWlmIChyZWNfbGVuIDwgRVhUMl9ESVJfUkVDX0xFTigxKSkKKwkJCWdvdG8gRXNob3J0OworCQlpZiAocmVjX2xlbiAmIDMpCisJCQlnb3RvIEVhbGlnbjsKKwkJaWYgKHJlY19sZW4gPCBFWFQyX0RJUl9SRUNfTEVOKHAtPm5hbWVfbGVuKSkKKwkJCWdvdG8gRW5hbWVsZW47CisJCWlmICgoKG9mZnMgKyByZWNfbGVuIC0gMSkgXiBvZmZzKSAmIH4oY2h1bmtfc2l6ZS0xKSkKKwkJCWdvdG8gRXNwYW47CisJCWlmIChsZTMyX3RvX2NwdShwLT5pbm9kZSkgPiBtYXhfaW51bWJlcikKKwkJCWdvdG8gRWludW1iZXI7CisJfQorCWlmIChvZmZzICE9IGxpbWl0KQorCQlnb3RvIEVlbmQ7CitvdXQ6CisJU2V0UGFnZUNoZWNrZWQocGFnZSk7CisJcmV0dXJuOworCisJLyogVG9vIGJhZCwgd2UgaGFkIGFuIGVycm9yICovCisKK0ViYWRzaXplOgorCWV4dDJfZXJyb3Ioc2IsICJleHQyX2NoZWNrX3BhZ2UiLAorCQkic2l6ZSBvZiBkaXJlY3RvcnkgIyVsdSBpcyBub3QgYSBtdWx0aXBsZSBvZiBjaHVuayBzaXplIiwKKwkJZGlyLT5pX2lubworCSk7CisJZ290byBmYWlsOworRXNob3J0OgorCWVycm9yID0gInJlY19sZW4gaXMgc21hbGxlciB0aGFuIG1pbmltYWwiOworCWdvdG8gYmFkX2VudHJ5OworRWFsaWduOgorCWVycm9yID0gInVuYWxpZ25lZCBkaXJlY3RvcnkgZW50cnkiOworCWdvdG8gYmFkX2VudHJ5OworRW5hbWVsZW46CisJZXJyb3IgPSAicmVjX2xlbiBpcyB0b28gc21hbGwgZm9yIG5hbWVfbGVuIjsKKwlnb3RvIGJhZF9lbnRyeTsKK0VzcGFuOgorCWVycm9yID0gImRpcmVjdG9yeSBlbnRyeSBhY3Jvc3MgYmxvY2tzIjsKKwlnb3RvIGJhZF9lbnRyeTsKK0VpbnVtYmVyOgorCWVycm9yID0gImlub2RlIG91dCBvZiBib3VuZHMiOworYmFkX2VudHJ5OgorCWV4dDJfZXJyb3IgKHNiLCAiZXh0Ml9jaGVja19wYWdlIiwgImJhZCBlbnRyeSBpbiBkaXJlY3RvcnkgIyVsdTogJXMgLSAiCisJCSJvZmZzZXQ9JWx1LCBpbm9kZT0lbHUsIHJlY19sZW49JWQsIG5hbWVfbGVuPSVkIiwKKwkJZGlyLT5pX2lubywgZXJyb3IsIChwYWdlLT5pbmRleDw8UEFHRV9DQUNIRV9TSElGVCkrb2ZmcywKKwkJKHVuc2lnbmVkIGxvbmcpIGxlMzJfdG9fY3B1KHAtPmlub2RlKSwKKwkJcmVjX2xlbiwgcC0+bmFtZV9sZW4pOworCWdvdG8gZmFpbDsKK0VlbmQ6CisJcCA9IChleHQyX2RpcmVudCAqKShrYWRkciArIG9mZnMpOworCWV4dDJfZXJyb3IgKHNiLCAiZXh0Ml9jaGVja19wYWdlIiwKKwkJImVudHJ5IGluIGRpcmVjdG9yeSAjJWx1IHNwYW5zIHRoZSBwYWdlIGJvdW5kYXJ5IgorCQkib2Zmc2V0PSVsdSwgaW5vZGU9JWx1IiwKKwkJZGlyLT5pX2lubywgKHBhZ2UtPmluZGV4PDxQQUdFX0NBQ0hFX1NISUZUKStvZmZzLAorCQkodW5zaWduZWQgbG9uZykgbGUzMl90b19jcHUocC0+aW5vZGUpKTsKK2ZhaWw6CisJU2V0UGFnZUNoZWNrZWQocGFnZSk7CisJU2V0UGFnZUVycm9yKHBhZ2UpOworfQorCitzdGF0aWMgc3RydWN0IHBhZ2UgKiBleHQyX2dldF9wYWdlKHN0cnVjdCBpbm9kZSAqZGlyLCB1bnNpZ25lZCBsb25nIG4pCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBkaXItPmlfbWFwcGluZzsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHJlYWRfY2FjaGVfcGFnZShtYXBwaW5nLCBuLAorCQkJCShmaWxsZXJfdCopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlLCBOVUxMKTsKKwlpZiAoIUlTX0VSUihwYWdlKSkgeworCQl3YWl0X29uX3BhZ2VfbG9ja2VkKHBhZ2UpOworCQlrbWFwKHBhZ2UpOworCQlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkKKwkJCWdvdG8gZmFpbDsKKwkJaWYgKCFQYWdlQ2hlY2tlZChwYWdlKSkKKwkJCWV4dDJfY2hlY2tfcGFnZShwYWdlKTsKKwkJaWYgKFBhZ2VFcnJvcihwYWdlKSkKKwkJCWdvdG8gZmFpbDsKKwl9CisJcmV0dXJuIHBhZ2U7CisKK2ZhaWw6CisJZXh0Ml9wdXRfcGFnZShwYWdlKTsKKwlyZXR1cm4gRVJSX1BUUigtRUlPKTsKK30KKworLyoKKyAqIE5PVEUhIHVubGlrZSBzdHJuY21wLCBleHQyX21hdGNoIHJldHVybnMgMSBmb3Igc3VjY2VzcywgMCBmb3IgZmFpbHVyZS4KKyAqCisgKiBsZW4gPD0gRVhUMl9OQU1FX0xFTiBhbmQgZGUgIT0gTlVMTCBhcmUgZ3VhcmFudGVlZCBieSBjYWxsZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGV4dDJfbWF0Y2ggKGludCBsZW4sIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lLAorCQkJCQlzdHJ1Y3QgZXh0Ml9kaXJfZW50cnlfMiAqIGRlKQoreworCWlmIChsZW4gIT0gZGUtPm5hbWVfbGVuKQorCQlyZXR1cm4gMDsKKwlpZiAoIWRlLT5pbm9kZSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuICFtZW1jbXAobmFtZSwgZGUtPm5hbWUsIGxlbik7Cit9CisKKy8qCisgKiBwIGlzIGF0IGxlYXN0IDYgYnl0ZXMgYmVmb3JlIHRoZSBlbmQgb2YgcGFnZQorICovCitzdGF0aWMgaW5saW5lIGV4dDJfZGlyZW50ICpleHQyX25leHRfZW50cnkoZXh0Ml9kaXJlbnQgKnApCit7CisJcmV0dXJuIChleHQyX2RpcmVudCAqKSgoY2hhciopcCArIGxlMTZfdG9fY3B1KHAtPnJlY19sZW4pKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCAKK2V4dDJfdmFsaWRhdGVfZW50cnkoY2hhciAqYmFzZSwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBtYXNrKQoreworCWV4dDJfZGlyZW50ICpkZSA9IChleHQyX2RpcmVudCopKGJhc2UgKyBvZmZzZXQpOworCWV4dDJfZGlyZW50ICpwID0gKGV4dDJfZGlyZW50KikoYmFzZSArIChvZmZzZXQmbWFzaykpOworCXdoaWxlICgoY2hhciopcCA8IChjaGFyKilkZSkgeworCQlpZiAocC0+cmVjX2xlbiA9PSAwKQorCQkJYnJlYWs7CisJCXAgPSBleHQyX25leHRfZW50cnkocCk7CisJfQorCXJldHVybiAoY2hhciAqKXAgLSBiYXNlOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBleHQyX2ZpbGV0eXBlX3RhYmxlW0VYVDJfRlRfTUFYXSA9IHsKKwlbRVhUMl9GVF9VTktOT1dOXQk9IERUX1VOS05PV04sCisJW0VYVDJfRlRfUkVHX0ZJTEVdCT0gRFRfUkVHLAorCVtFWFQyX0ZUX0RJUl0JCT0gRFRfRElSLAorCVtFWFQyX0ZUX0NIUkRFVl0JPSBEVF9DSFIsCisJW0VYVDJfRlRfQkxLREVWXQk9IERUX0JMSywKKwlbRVhUMl9GVF9GSUZPXQkJPSBEVF9GSUZPLAorCVtFWFQyX0ZUX1NPQ0tdCQk9IERUX1NPQ0ssCisJW0VYVDJfRlRfU1lNTElOS10JPSBEVF9MTkssCit9OworCisjZGVmaW5lIFNfU0hJRlQgMTIKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGV4dDJfdHlwZV9ieV9tb2RlW1NfSUZNVCA+PiBTX1NISUZUXSA9IHsKKwlbU19JRlJFRyA+PiBTX1NISUZUXQk9IEVYVDJfRlRfUkVHX0ZJTEUsCisJW1NfSUZESVIgPj4gU19TSElGVF0JPSBFWFQyX0ZUX0RJUiwKKwlbU19JRkNIUiA+PiBTX1NISUZUXQk9IEVYVDJfRlRfQ0hSREVWLAorCVtTX0lGQkxLID4+IFNfU0hJRlRdCT0gRVhUMl9GVF9CTEtERVYsCisJW1NfSUZJRk8gPj4gU19TSElGVF0JPSBFWFQyX0ZUX0ZJRk8sCisJW1NfSUZTT0NLID4+IFNfU0hJRlRdCT0gRVhUMl9GVF9TT0NLLAorCVtTX0lGTE5LID4+IFNfU0hJRlRdCT0gRVhUMl9GVF9TWU1MSU5LLAorfTsKKworc3RhdGljIGlubGluZSB2b2lkIGV4dDJfc2V0X2RlX3R5cGUoZXh0Ml9kaXJlbnQgKmRlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCW1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKKwlpZiAoRVhUMl9IQVNfSU5DT01QQVRfRkVBVFVSRShpbm9kZS0+aV9zYiwgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX0ZJTEVUWVBFKSkKKwkJZGUtPmZpbGVfdHlwZSA9IGV4dDJfdHlwZV9ieV9tb2RlWyhtb2RlICYgU19JRk1UKT4+U19TSElGVF07CisJZWxzZQorCQlkZS0+ZmlsZV90eXBlID0gMDsKK30KKworc3RhdGljIGludAorZXh0Ml9yZWFkZGlyIChzdHJ1Y3QgZmlsZSAqIGZpbHAsIHZvaWQgKiBkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCWxvZmZfdCBwb3MgPSBmaWxwLT5mX3BvczsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXVuc2lnbmVkIGludCBvZmZzZXQgPSBwb3MgJiB+UEFHRV9DQUNIRV9NQVNLOworCXVuc2lnbmVkIGxvbmcgbiA9IHBvcyA+PiBQQUdFX0NBQ0hFX1NISUZUOworCXVuc2lnbmVkIGxvbmcgbnBhZ2VzID0gZGlyX3BhZ2VzKGlub2RlKTsKKwl1bnNpZ25lZCBjaHVua19tYXNrID0gfihleHQyX2NodW5rX3NpemUoaW5vZGUpLTEpOworCXVuc2lnbmVkIGNoYXIgKnR5cGVzID0gTlVMTDsKKwlpbnQgbmVlZF9yZXZhbGlkYXRlID0gKGZpbHAtPmZfdmVyc2lvbiAhPSBpbm9kZS0+aV92ZXJzaW9uKTsKKwlpbnQgcmV0OworCisJaWYgKHBvcyA+IGlub2RlLT5pX3NpemUgLSBFWFQyX0RJUl9SRUNfTEVOKDEpKQorCQlnb3RvIHN1Y2Nlc3M7CisKKwlpZiAoRVhUMl9IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX0ZJTEVUWVBFKSkKKwkJdHlwZXMgPSBleHQyX2ZpbGV0eXBlX3RhYmxlOworCisJZm9yICggOyBuIDwgbnBhZ2VzOyBuKyssIG9mZnNldCA9IDApIHsKKwkJY2hhciAqa2FkZHIsICpsaW1pdDsKKwkJZXh0Ml9kaXJlbnQgKmRlOworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGV4dDJfZ2V0X3BhZ2UoaW5vZGUsIG4pOworCisJCWlmIChJU19FUlIocGFnZSkpIHsKKwkJCWV4dDJfZXJyb3Ioc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkgICAiYmFkIHBhZ2UgaW4gIyVsdSIsCisJCQkJICAgaW5vZGUtPmlfaW5vKTsKKwkJCWZpbHAtPmZfcG9zICs9IFBBR0VfQ0FDSEVfU0laRSAtIG9mZnNldDsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJa2FkZHIgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJCWlmIChuZWVkX3JldmFsaWRhdGUpIHsKKwkJCW9mZnNldCA9IGV4dDJfdmFsaWRhdGVfZW50cnkoa2FkZHIsIG9mZnNldCwgY2h1bmtfbWFzayk7CisJCQluZWVkX3JldmFsaWRhdGUgPSAwOworCQl9CisJCWRlID0gKGV4dDJfZGlyZW50ICopKGthZGRyK29mZnNldCk7CisJCWxpbWl0ID0ga2FkZHIgKyBleHQyX2xhc3RfYnl0ZShpbm9kZSwgbikgLSBFWFQyX0RJUl9SRUNfTEVOKDEpOworCQlmb3IgKCA7KGNoYXIqKWRlIDw9IGxpbWl0OyBkZSA9IGV4dDJfbmV4dF9lbnRyeShkZSkpIHsKKwkJCWlmIChkZS0+cmVjX2xlbiA9PSAwKSB7CisJCQkJZXh0Ml9lcnJvcihzYiwgX19GVU5DVElPTl9fLAorCQkJCQkiemVyby1sZW5ndGggZGlyZWN0b3J5IGVudHJ5Iik7CisJCQkJcmV0ID0gLUVJTzsKKwkJCQlleHQyX3B1dF9wYWdlKHBhZ2UpOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJCWlmIChkZS0+aW5vZGUpIHsKKwkJCQlpbnQgb3ZlcjsKKwkJCQl1bnNpZ25lZCBjaGFyIGRfdHlwZSA9IERUX1VOS05PV047CisKKwkJCQlpZiAodHlwZXMgJiYgZGUtPmZpbGVfdHlwZSA8IEVYVDJfRlRfTUFYKQorCQkJCQlkX3R5cGUgPSB0eXBlc1tkZS0+ZmlsZV90eXBlXTsKKworCQkJCW9mZnNldCA9IChjaGFyICopZGUgLSBrYWRkcjsKKwkJCQlvdmVyID0gZmlsbGRpcihkaXJlbnQsIGRlLT5uYW1lLCBkZS0+bmFtZV9sZW4sCisJCQkJCQkobjw8UEFHRV9DQUNIRV9TSElGVCkgfCBvZmZzZXQsCisJCQkJCQlsZTMyX3RvX2NwdShkZS0+aW5vZGUpLCBkX3R5cGUpOworCQkJCWlmIChvdmVyKSB7CisJCQkJCWV4dDJfcHV0X3BhZ2UocGFnZSk7CisJCQkJCWdvdG8gc3VjY2VzczsKKwkJCQl9CisJCQl9CisJCQlmaWxwLT5mX3BvcyArPSBsZTE2X3RvX2NwdShkZS0+cmVjX2xlbik7CisJCX0KKwkJZXh0Ml9wdXRfcGFnZShwYWdlKTsKKwl9CisKK3N1Y2Nlc3M6CisJcmV0ID0gMDsKK2RvbmU6CisJZmlscC0+Zl92ZXJzaW9uID0gaW5vZGUtPmlfdmVyc2lvbjsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICoJZXh0Ml9maW5kX2VudHJ5KCkKKyAqCisgKiBmaW5kcyBhbiBlbnRyeSBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSB3aXRoIHRoZSB3YW50ZWQgbmFtZS4gSXQKKyAqIHJldHVybnMgdGhlIHBhZ2UgaW4gd2hpY2ggdGhlIGVudHJ5IHdhcyBmb3VuZCwgYW5kIHRoZSBlbnRyeSBpdHNlbGYKKyAqIChhcyBhIHBhcmFtZXRlciAtIHJlc19kaXIpLiBQYWdlIGlzIHJldHVybmVkIG1hcHBlZCBhbmQgdW5sb2NrZWQuCisgKiBFbnRyeSBpcyBndWFyYW50ZWVkIHRvIGJlIHZhbGlkLgorICovCitzdHJ1Y3QgZXh0Ml9kaXJfZW50cnlfMiAqIGV4dDJfZmluZF9lbnRyeSAoc3RydWN0IGlub2RlICogZGlyLAorCQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcGFnZSAqKiByZXNfcGFnZSkKK3sKKwljb25zdCBjaGFyICpuYW1lID0gZGVudHJ5LT5kX25hbWUubmFtZTsKKwlpbnQgbmFtZWxlbiA9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKKwl1bnNpZ25lZCByZWNsZW4gPSBFWFQyX0RJUl9SRUNfTEVOKG5hbWVsZW4pOworCXVuc2lnbmVkIGxvbmcgc3RhcnQsIG47CisJdW5zaWduZWQgbG9uZyBucGFnZXMgPSBkaXJfcGFnZXMoZGlyKTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7CisJc3RydWN0IGV4dDJfaW5vZGVfaW5mbyAqZWkgPSBFWFQyX0koZGlyKTsKKwlleHQyX2RpcmVudCAqIGRlOworCisJaWYgKG5wYWdlcyA9PSAwKQorCQlnb3RvIG91dDsKKworCS8qIE9GRlNFVF9DQUNIRSAqLworCSpyZXNfcGFnZSA9IE5VTEw7CisKKwlzdGFydCA9IGVpLT5pX2Rpcl9zdGFydF9sb29rdXA7CisJaWYgKHN0YXJ0ID49IG5wYWdlcykKKwkJc3RhcnQgPSAwOworCW4gPSBzdGFydDsKKwlkbyB7CisJCWNoYXIgKmthZGRyOworCQlwYWdlID0gZXh0Ml9nZXRfcGFnZShkaXIsIG4pOworCQlpZiAoIUlTX0VSUihwYWdlKSkgeworCQkJa2FkZHIgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJCQlkZSA9IChleHQyX2RpcmVudCAqKSBrYWRkcjsKKwkJCWthZGRyICs9IGV4dDJfbGFzdF9ieXRlKGRpciwgbikgLSByZWNsZW47CisJCQl3aGlsZSAoKGNoYXIgKikgZGUgPD0ga2FkZHIpIHsKKwkJCQlpZiAoZGUtPnJlY19sZW4gPT0gMCkgeworCQkJCQlleHQyX2Vycm9yKGRpci0+aV9zYiwgX19GVU5DVElPTl9fLAorCQkJCQkJInplcm8tbGVuZ3RoIGRpcmVjdG9yeSBlbnRyeSIpOworCQkJCQlleHQyX3B1dF9wYWdlKHBhZ2UpOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJaWYgKGV4dDJfbWF0Y2ggKG5hbWVsZW4sIG5hbWUsIGRlKSkKKwkJCQkJZ290byBmb3VuZDsKKwkJCQlkZSA9IGV4dDJfbmV4dF9lbnRyeShkZSk7CisJCQl9CisJCQlleHQyX3B1dF9wYWdlKHBhZ2UpOworCQl9CisJCWlmICgrK24gPj0gbnBhZ2VzKQorCQkJbiA9IDA7CisJfSB3aGlsZSAobiAhPSBzdGFydCk7CitvdXQ6CisJcmV0dXJuIE5VTEw7CisKK2ZvdW5kOgorCSpyZXNfcGFnZSA9IHBhZ2U7CisJZWktPmlfZGlyX3N0YXJ0X2xvb2t1cCA9IG47CisJcmV0dXJuIGRlOworfQorCitzdHJ1Y3QgZXh0Ml9kaXJfZW50cnlfMiAqIGV4dDJfZG90ZG90IChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHBhZ2UgKipwKQoreworCXN0cnVjdCBwYWdlICpwYWdlID0gZXh0Ml9nZXRfcGFnZShkaXIsIDApOworCWV4dDJfZGlyZW50ICpkZSA9IE5VTEw7CisKKwlpZiAoIUlTX0VSUihwYWdlKSkgeworCQlkZSA9IGV4dDJfbmV4dF9lbnRyeSgoZXh0Ml9kaXJlbnQgKikgcGFnZV9hZGRyZXNzKHBhZ2UpKTsKKwkJKnAgPSBwYWdlOworCX0KKwlyZXR1cm4gZGU7Cit9CisKK2lub190IGV4dDJfaW5vZGVfYnlfbmFtZShzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpbm9fdCByZXMgPSAwOworCXN0cnVjdCBleHQyX2Rpcl9lbnRyeV8yICogZGU7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJCisJZGUgPSBleHQyX2ZpbmRfZW50cnkgKGRpciwgZGVudHJ5LCAmcGFnZSk7CisJaWYgKGRlKSB7CisJCXJlcyA9IGxlMzJfdG9fY3B1KGRlLT5pbm9kZSk7CisJCWt1bm1hcChwYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCX0KKwlyZXR1cm4gcmVzOworfQorCisvKiBSZWxlYXNlcyB0aGUgcGFnZSAqLwordm9pZCBleHQyX3NldF9saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZXh0Ml9kaXJfZW50cnlfMiAqZGUsCisJCQlzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwl1bnNpZ25lZCBmcm9tID0gKGNoYXIgKikgZGUgLSAoY2hhciAqKSBwYWdlX2FkZHJlc3MocGFnZSk7CisJdW5zaWduZWQgdG8gPSBmcm9tICsgbGUxNl90b19jcHUoZGUtPnJlY19sZW4pOworCWludCBlcnI7CisKKwlsb2NrX3BhZ2UocGFnZSk7CisJZXJyID0gcGFnZS0+bWFwcGluZy0+YV9vcHMtPnByZXBhcmVfd3JpdGUoTlVMTCwgcGFnZSwgZnJvbSwgdG8pOworCWlmIChlcnIpCisJCUJVRygpOworCWRlLT5pbm9kZSA9IGNwdV90b19sZTMyKGlub2RlLT5pX2lubyk7CisJZXh0Ml9zZXRfZGVfdHlwZSAoZGUsIGlub2RlKTsKKwllcnIgPSBleHQyX2NvbW1pdF9jaHVuayhwYWdlLCBmcm9tLCB0byk7CisJZXh0Ml9wdXRfcGFnZShwYWdlKTsKKwlkaXItPmlfbXRpbWUgPSBkaXItPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCUVYVDJfSShkaXIpLT5pX2ZsYWdzICY9IH5FWFQyX0JUUkVFX0ZMOworCW1hcmtfaW5vZGVfZGlydHkoZGlyKTsKK30KKworLyoKKyAqCVBhcmVudCBpcyBsb2NrZWQuCisgKi8KK2ludCBleHQyX2FkZF9saW5rIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGlub2RlICpkaXIgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOworCWNvbnN0IGNoYXIgKm5hbWUgPSBkZW50cnktPmRfbmFtZS5uYW1lOworCWludCBuYW1lbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCXVuc2lnbmVkIGNodW5rX3NpemUgPSBleHQyX2NodW5rX3NpemUoZGlyKTsKKwl1bnNpZ25lZCByZWNsZW4gPSBFWFQyX0RJUl9SRUNfTEVOKG5hbWVsZW4pOworCXVuc2lnbmVkIHNob3J0IHJlY19sZW4sIG5hbWVfbGVuOworCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKKwlleHQyX2RpcmVudCAqIGRlOworCXVuc2lnbmVkIGxvbmcgbnBhZ2VzID0gZGlyX3BhZ2VzKGRpcik7CisJdW5zaWduZWQgbG9uZyBuOworCWNoYXIgKmthZGRyOworCXVuc2lnbmVkIGZyb20sIHRvOworCWludCBlcnI7CisKKwkvKgorCSAqIFdlIHRha2UgY2FyZSBvZiBkaXJlY3RvcnkgZXhwYW5zaW9uIGluIHRoZSBzYW1lIGxvb3AuCisJICogVGhpcyBjb2RlIHBsYXlzIG91dHNpZGUgaV9zaXplLCBzbyBpdCBsb2NrcyB0aGUgcGFnZQorCSAqIHRvIHByb3RlY3QgdGhhdCByZWdpb24uCisJICovCisJZm9yIChuID0gMDsgbiA8PSBucGFnZXM7IG4rKykgeworCQljaGFyICpkaXJfZW5kOworCisJCXBhZ2UgPSBleHQyX2dldF9wYWdlKGRpciwgbik7CisJCWVyciA9IFBUUl9FUlIocGFnZSk7CisJCWlmIChJU19FUlIocGFnZSkpCisJCQlnb3RvIG91dDsKKwkJbG9ja19wYWdlKHBhZ2UpOworCQlrYWRkciA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwkJZGlyX2VuZCA9IGthZGRyICsgZXh0Ml9sYXN0X2J5dGUoZGlyLCBuKTsKKwkJZGUgPSAoZXh0Ml9kaXJlbnQgKilrYWRkcjsKKwkJa2FkZHIgKz0gUEFHRV9DQUNIRV9TSVpFIC0gcmVjbGVuOworCQl3aGlsZSAoKGNoYXIgKilkZSA8PSBrYWRkcikgeworCQkJaWYgKChjaGFyICopZGUgPT0gZGlyX2VuZCkgeworCQkJCS8qIFdlIGhpdCBpX3NpemUgKi8KKwkJCQluYW1lX2xlbiA9IDA7CisJCQkJcmVjX2xlbiA9IGNodW5rX3NpemU7CisJCQkJZGUtPnJlY19sZW4gPSBjcHVfdG9fbGUxNihjaHVua19zaXplKTsKKwkJCQlkZS0+aW5vZGUgPSAwOworCQkJCWdvdG8gZ290X2l0OworCQkJfQorCQkJaWYgKGRlLT5yZWNfbGVuID09IDApIHsKKwkJCQlleHQyX2Vycm9yKGRpci0+aV9zYiwgX19GVU5DVElPTl9fLAorCQkJCQkiemVyby1sZW5ndGggZGlyZWN0b3J5IGVudHJ5Iik7CisJCQkJZXJyID0gLUVJTzsKKwkJCQlnb3RvIG91dF91bmxvY2s7CisJCQl9CisJCQllcnIgPSAtRUVYSVNUOworCQkJaWYgKGV4dDJfbWF0Y2ggKG5hbWVsZW4sIG5hbWUsIGRlKSkKKwkJCQlnb3RvIG91dF91bmxvY2s7CisJCQluYW1lX2xlbiA9IEVYVDJfRElSX1JFQ19MRU4oZGUtPm5hbWVfbGVuKTsKKwkJCXJlY19sZW4gPSBsZTE2X3RvX2NwdShkZS0+cmVjX2xlbik7CisJCQlpZiAoIWRlLT5pbm9kZSAmJiByZWNfbGVuID49IHJlY2xlbikKKwkJCQlnb3RvIGdvdF9pdDsKKwkJCWlmIChyZWNfbGVuID49IG5hbWVfbGVuICsgcmVjbGVuKQorCQkJCWdvdG8gZ290X2l0OworCQkJZGUgPSAoZXh0Ml9kaXJlbnQgKikgKChjaGFyICopIGRlICsgcmVjX2xlbik7CisJCX0KKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCWV4dDJfcHV0X3BhZ2UocGFnZSk7CisJfQorCUJVRygpOworCXJldHVybiAtRUlOVkFMOworCitnb3RfaXQ6CisJZnJvbSA9IChjaGFyKilkZSAtIChjaGFyKilwYWdlX2FkZHJlc3MocGFnZSk7CisJdG8gPSBmcm9tICsgcmVjX2xlbjsKKwllcnIgPSBwYWdlLT5tYXBwaW5nLT5hX29wcy0+cHJlcGFyZV93cml0ZShOVUxMLCBwYWdlLCBmcm9tLCB0byk7CisJaWYgKGVycikKKwkJZ290byBvdXRfdW5sb2NrOworCWlmIChkZS0+aW5vZGUpIHsKKwkJZXh0Ml9kaXJlbnQgKmRlMSA9IChleHQyX2RpcmVudCAqKSAoKGNoYXIgKikgZGUgKyBuYW1lX2xlbik7CisJCWRlMS0+cmVjX2xlbiA9IGNwdV90b19sZTE2KHJlY19sZW4gLSBuYW1lX2xlbik7CisJCWRlLT5yZWNfbGVuID0gY3B1X3RvX2xlMTYobmFtZV9sZW4pOworCQlkZSA9IGRlMTsKKwl9CisJZGUtPm5hbWVfbGVuID0gbmFtZWxlbjsKKwltZW1jcHkgKGRlLT5uYW1lLCBuYW1lLCBuYW1lbGVuKTsKKwlkZS0+aW5vZGUgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9pbm8pOworCWV4dDJfc2V0X2RlX3R5cGUgKGRlLCBpbm9kZSk7CisJZXJyID0gZXh0Ml9jb21taXRfY2h1bmsocGFnZSwgZnJvbSwgdG8pOworCWRpci0+aV9tdGltZSA9IGRpci0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJRVhUMl9JKGRpciktPmlfZmxhZ3MgJj0gfkVYVDJfQlRSRUVfRkw7CisJbWFya19pbm9kZV9kaXJ0eShkaXIpOworCS8qIE9GRlNFVF9DQUNIRSAqLworb3V0X3B1dDoKKwlleHQyX3B1dF9wYWdlKHBhZ2UpOworb3V0OgorCXJldHVybiBlcnI7CitvdXRfdW5sb2NrOgorCXVubG9ja19wYWdlKHBhZ2UpOworCWdvdG8gb3V0X3B1dDsKK30KKworLyoKKyAqIGV4dDJfZGVsZXRlX2VudHJ5IGRlbGV0ZXMgYSBkaXJlY3RvcnkgZW50cnkgYnkgbWVyZ2luZyBpdCB3aXRoIHRoZQorICogcHJldmlvdXMgZW50cnkuIFBhZ2UgaXMgdXAtdG8tZGF0ZS4gUmVsZWFzZXMgdGhlIHBhZ2UuCisgKi8KK2ludCBleHQyX2RlbGV0ZV9lbnRyeSAoc3RydWN0IGV4dDJfZGlyX2VudHJ5XzIgKiBkaXIsIHN0cnVjdCBwYWdlICogcGFnZSApCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBwYWdlLT5tYXBwaW5nOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCWNoYXIgKmthZGRyID0gcGFnZV9hZGRyZXNzKHBhZ2UpOworCXVuc2lnbmVkIGZyb20gPSAoKGNoYXIqKWRpciAtIGthZGRyKSAmIH4oZXh0Ml9jaHVua19zaXplKGlub2RlKS0xKTsKKwl1bnNpZ25lZCB0byA9ICgoY2hhciopZGlyIC0ga2FkZHIpICsgbGUxNl90b19jcHUoZGlyLT5yZWNfbGVuKTsKKwlleHQyX2RpcmVudCAqIHBkZSA9IE5VTEw7CisJZXh0Ml9kaXJlbnQgKiBkZSA9IChleHQyX2RpcmVudCAqKSAoa2FkZHIgKyBmcm9tKTsKKwlpbnQgZXJyOworCisJd2hpbGUgKChjaGFyKilkZSA8IChjaGFyKilkaXIpIHsKKwkJaWYgKGRlLT5yZWNfbGVuID09IDApIHsKKwkJCWV4dDJfZXJyb3IoaW5vZGUtPmlfc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkiemVyby1sZW5ndGggZGlyZWN0b3J5IGVudHJ5Iik7CisJCQllcnIgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwkJcGRlID0gZGU7CisJCWRlID0gZXh0Ml9uZXh0X2VudHJ5KGRlKTsKKwl9CisJaWYgKHBkZSkKKwkJZnJvbSA9IChjaGFyKilwZGUgLSAoY2hhciopcGFnZV9hZGRyZXNzKHBhZ2UpOworCWxvY2tfcGFnZShwYWdlKTsKKwllcnIgPSBtYXBwaW5nLT5hX29wcy0+cHJlcGFyZV93cml0ZShOVUxMLCBwYWdlLCBmcm9tLCB0byk7CisJaWYgKGVycikKKwkJQlVHKCk7CisJaWYgKHBkZSkKKwkJcGRlLT5yZWNfbGVuID0gY3B1X3RvX2xlMTYodG8tZnJvbSk7CisJZGlyLT5pbm9kZSA9IDA7CisJZXJyID0gZXh0Ml9jb21taXRfY2h1bmsocGFnZSwgZnJvbSwgdG8pOworCWlub2RlLT5pX2N0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCUVYVDJfSShpbm9kZSktPmlfZmxhZ3MgJj0gfkVYVDJfQlRSRUVfRkw7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CitvdXQ6CisJZXh0Ml9wdXRfcGFnZShwYWdlKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogU2V0IHRoZSBmaXJzdCBmcmFnbWVudCBvZiBkaXJlY3RvcnkuCisgKi8KK2ludCBleHQyX21ha2VfZW1wdHkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpwYXJlbnQpCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCXN0cnVjdCBwYWdlICpwYWdlID0gZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsIDApOworCXVuc2lnbmVkIGNodW5rX3NpemUgPSBleHQyX2NodW5rX3NpemUoaW5vZGUpOworCXN0cnVjdCBleHQyX2Rpcl9lbnRyeV8yICogZGU7CisJaW50IGVycjsKKwl2b2lkICprYWRkcjsKKworCWlmICghcGFnZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJZXJyID0gbWFwcGluZy0+YV9vcHMtPnByZXBhcmVfd3JpdGUoTlVMTCwgcGFnZSwgMCwgY2h1bmtfc2l6ZSk7CisJaWYgKGVycikgeworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJZ290byBmYWlsOworCX0KKwlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKyAgICAgICBtZW1zZXQoa2FkZHIsIDAsIGNodW5rX3NpemUpOworCWRlID0gKHN0cnVjdCBleHQyX2Rpcl9lbnRyeV8yICopa2FkZHI7CisJZGUtPm5hbWVfbGVuID0gMTsKKwlkZS0+cmVjX2xlbiA9IGNwdV90b19sZTE2KEVYVDJfRElSX1JFQ19MRU4oMSkpOworCW1lbWNweSAoZGUtPm5hbWUsICIuXDBcMCIsIDQpOworCWRlLT5pbm9kZSA9IGNwdV90b19sZTMyKGlub2RlLT5pX2lubyk7CisJZXh0Ml9zZXRfZGVfdHlwZSAoZGUsIGlub2RlKTsKKworCWRlID0gKHN0cnVjdCBleHQyX2Rpcl9lbnRyeV8yICopKGthZGRyICsgRVhUMl9ESVJfUkVDX0xFTigxKSk7CisJZGUtPm5hbWVfbGVuID0gMjsKKwlkZS0+cmVjX2xlbiA9IGNwdV90b19sZTE2KGNodW5rX3NpemUgLSBFWFQyX0RJUl9SRUNfTEVOKDEpKTsKKwlkZS0+aW5vZGUgPSBjcHVfdG9fbGUzMihwYXJlbnQtPmlfaW5vKTsKKwltZW1jcHkgKGRlLT5uYW1lLCAiLi5cMCIsIDQpOworCWV4dDJfc2V0X2RlX3R5cGUgKGRlLCBpbm9kZSk7CisJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCWVyciA9IGV4dDJfY29tbWl0X2NodW5rKHBhZ2UsIDAsIGNodW5rX3NpemUpOworZmFpbDoKKwlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIHJvdXRpbmUgdG8gY2hlY2sgdGhhdCB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBpcyBlbXB0eSAoZm9yIHJtZGlyKQorICovCitpbnQgZXh0Ml9lbXB0eV9kaXIgKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGksIG5wYWdlcyA9IGRpcl9wYWdlcyhpbm9kZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyBpKyspIHsKKwkJY2hhciAqa2FkZHI7CisJCWV4dDJfZGlyZW50ICogZGU7CisJCXBhZ2UgPSBleHQyX2dldF9wYWdlKGlub2RlLCBpKTsKKworCQlpZiAoSVNfRVJSKHBhZ2UpKQorCQkJY29udGludWU7CisKKwkJa2FkZHIgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisJCWRlID0gKGV4dDJfZGlyZW50ICopa2FkZHI7CisJCWthZGRyICs9IGV4dDJfbGFzdF9ieXRlKGlub2RlLCBpKSAtIEVYVDJfRElSX1JFQ19MRU4oMSk7CisKKwkJd2hpbGUgKChjaGFyICopZGUgPD0ga2FkZHIpIHsKKwkJCWlmIChkZS0+cmVjX2xlbiA9PSAwKSB7CisJCQkJZXh0Ml9lcnJvcihpbm9kZS0+aV9zYiwgX19GVU5DVElPTl9fLAorCQkJCQkiemVyby1sZW5ndGggZGlyZWN0b3J5IGVudHJ5Iik7CisJCQkJcHJpbnRrKCJrYWRkcj0lcCwgZGU9JXBcbiIsIGthZGRyLCBkZSk7CisJCQkJZ290byBub3RfZW1wdHk7CisJCQl9CisJCQlpZiAoZGUtPmlub2RlICE9IDApIHsKKwkJCQkvKiBjaGVjayBmb3IgLiBhbmQgLi4gKi8KKwkJCQlpZiAoZGUtPm5hbWVbMF0gIT0gJy4nKQorCQkJCQlnb3RvIG5vdF9lbXB0eTsKKwkJCQlpZiAoZGUtPm5hbWVfbGVuID4gMikKKwkJCQkJZ290byBub3RfZW1wdHk7CisJCQkJaWYgKGRlLT5uYW1lX2xlbiA8IDIpIHsKKwkJCQkJaWYgKGRlLT5pbm9kZSAhPQorCQkJCQkgICAgY3B1X3RvX2xlMzIoaW5vZGUtPmlfaW5vKSkKKwkJCQkJCWdvdG8gbm90X2VtcHR5OworCQkJCX0gZWxzZSBpZiAoZGUtPm5hbWVbMV0gIT0gJy4nKQorCQkJCQlnb3RvIG5vdF9lbXB0eTsKKwkJCX0KKwkJCWRlID0gZXh0Ml9uZXh0X2VudHJ5KGRlKTsKKwkJfQorCQlleHQyX3B1dF9wYWdlKHBhZ2UpOworCX0KKwlyZXR1cm4gMTsKKworbm90X2VtcHR5OgorCWV4dDJfcHV0X3BhZ2UocGFnZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXh0Ml9kaXJfb3BlcmF0aW9ucyA9IHsKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlYWQJCT0gZ2VuZXJpY19yZWFkX2RpciwKKwkucmVhZGRpcgk9IGV4dDJfcmVhZGRpciwKKwkuaW9jdGwJCT0gZXh0Ml9pb2N0bCwKKwkuZnN5bmMJCT0gZXh0Ml9zeW5jX2ZpbGUsCit9OwpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9leHQyLmggYi9mcy9leHQyL2V4dDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjFhNDBlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0Mi9leHQyLmgKQEAgLTAsMCArMSwxNjAgQEAKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDJfZnMuaD4KKworLyoKKyAqIHNlY29uZCBleHRlbmRlZCBmaWxlIHN5c3RlbSBpbm9kZSBkYXRhIGluIG1lbW9yeQorICovCitzdHJ1Y3QgZXh0Ml9pbm9kZV9pbmZvIHsKKwlfX2xlMzIJaV9kYXRhWzE1XTsKKwlfX3UzMglpX2ZsYWdzOworCV9fdTMyCWlfZmFkZHI7CisJX191OAlpX2ZyYWdfbm87CisJX191OAlpX2ZyYWdfc2l6ZTsKKwlfX3UxNglpX3N0YXRlOworCV9fdTMyCWlfZmlsZV9hY2w7CisJX191MzIJaV9kaXJfYWNsOworCV9fdTMyCWlfZHRpbWU7CisKKwkvKgorCSAqIGlfYmxvY2tfZ3JvdXAgaXMgdGhlIG51bWJlciBvZiB0aGUgYmxvY2sgZ3JvdXAgd2hpY2ggY29udGFpbnMKKwkgKiB0aGlzIGZpbGUncyBpbm9kZS4gIENvbnN0YW50IGFjcm9zcyB0aGUgbGlmZXRpbWUgb2YgdGhlIGlub2RlLAorCSAqIGl0IGlzIHVlZCBmb3IgbWFraW5nIGJsb2NrIGFsbG9jYXRpb24gZGVjaXNpb25zIC0gd2UgdHJ5IHRvCisJICogcGxhY2UgYSBmaWxlJ3MgZGF0YSBibG9ja3MgbmVhciBpdHMgaW5vZGUgYmxvY2ssIGFuZCBuZXcgaW5vZGVzCisJICogbmVhciB0byB0aGVpciBwYXJlbnQgZGlyZWN0b3J5J3MgaW5vZGUuCisJICovCisJX191MzIJaV9ibG9ja19ncm91cDsKKworCS8qCisJICogaV9uZXh0X2FsbG9jX2Jsb2NrIGlzIHRoZSBsb2dpY2FsIChmaWxlLXJlbGF0aXZlKSBudW1iZXIgb2YgdGhlCisJICogbW9zdC1yZWNlbnRseS1hbGxvY2F0ZWQgYmxvY2sgaW4gdGhpcyBmaWxlLiAgWWVzLCBpdCBpcyBtaXNuYW1lZC4KKwkgKiBXZSB1c2UgdGhpcyBmb3IgZGV0ZWN0aW5nIGxpbmVhcmx5IGFzY2VuZGluZyBhbGxvY2F0aW9uIHJlcXVlc3RzLgorCSAqLworCV9fdTMyCWlfbmV4dF9hbGxvY19ibG9jazsKKworCS8qCisJICogaV9uZXh0X2FsbG9jX2dvYWwgaXMgdGhlICpwaHlzaWNhbCogY29tcGFuaW9uIHRvIGlfbmV4dF9hbGxvY19ibG9jay4KKwkgKiBpdCB0aGUgdGhlIHBoeXNpY2FsIGJsb2NrIG51bWJlciBvZiB0aGUgYmxvY2sgd2hpY2ggd2FzIG1vc3QtcmVjZW50bHkKKwkgKiBhbGxvY2F0ZWQgdG8gdGhpcyBmaWxlLiAgVGhpcyBnaXZlIHVzIHRoZSBnb2FsICh0YXJnZXQpIGZvciB0aGUgbmV4dAorCSAqIGFsbG9jYXRpb24gd2hlbiB3ZSBkZXRlY3QgbGluZWFybHkgYXNjZW5kaW5nIHJlcXVlc3RzLgorCSAqLworCV9fdTMyCWlfbmV4dF9hbGxvY19nb2FsOworCV9fdTMyCWlfcHJlYWxsb2NfYmxvY2s7CisJX191MzIJaV9wcmVhbGxvY19jb3VudDsKKwlfX3UzMglpX2Rpcl9zdGFydF9sb29rdXA7CisjaWZkZWYgQ09ORklHX0VYVDJfRlNfWEFUVFIKKwkvKgorCSAqIEV4dGVuZGVkIGF0dHJpYnV0ZXMgY2FuIGJlIHJlYWQgaW5kZXBlbmRlbnRseSBvZiB0aGUgbWFpbiBmaWxlCisJICogZGF0YS4gVGFraW5nIGlfc2VtIGV2ZW4gd2hlbiByZWFkaW5nIHdvdWxkIGNhdXNlIGNvbnRlbnRpb24KKwkgKiBiZXR3ZWVuIHJlYWRlcnMgb2YgRUFzIGFuZCB3cml0ZXJzIG9mIHJlZ3VsYXIgZmlsZSBkYXRhLCBzbworCSAqIGluc3RlYWQgd2Ugc3luY2hyb25pemUgb24geGF0dHJfc2VtIHdoZW4gcmVhZGluZyBvciBjaGFuZ2luZworCSAqIEVBcy4KKwkgKi8KKwlzdHJ1Y3Qgcndfc2VtYXBob3JlIHhhdHRyX3NlbTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19FWFQyX0ZTX1BPU0lYX0FDTAorCXN0cnVjdCBwb3NpeF9hY2wJKmlfYWNsOworCXN0cnVjdCBwb3NpeF9hY2wJKmlfZGVmYXVsdF9hY2w7CisjZW5kaWYKKwlyd2xvY2tfdCBpX21ldGFfbG9jazsKKwlzdHJ1Y3QgaW5vZGUJdmZzX2lub2RlOworfTsKKworLyoKKyAqIElub2RlIGR5bmFtaWMgc3RhdGUgZmxhZ3MKKyAqLworI2RlZmluZSBFWFQyX1NUQVRFX05FVwkJCTB4MDAwMDAwMDEgLyogaW5vZGUgaXMgbmV3bHkgY3JlYXRlZCAqLworCisKKy8qCisgKiBGdW5jdGlvbiBwcm90b3R5cGVzCisgKi8KKworLyoKKyAqIE9rLCB0aGVzZSBkZWNsYXJhdGlvbnMgYXJlIGFsc28gaW4gPGxpbnV4L2tlcm5lbC5oPiBidXQgbm9uZSBvZiB0aGUKKyAqIGV4dDIgc291cmNlIHByb2dyYW1zIG5lZWRzIHRvIGluY2x1ZGUgaXQgc28gdGhleSBhcmUgZHVwbGljYXRlZCBoZXJlLgorICovCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGV4dDJfaW5vZGVfaW5mbyAqRVhUMl9JKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihpbm9kZSwgc3RydWN0IGV4dDJfaW5vZGVfaW5mbywgdmZzX2lub2RlKTsKK30KKworLyogYmFsbG9jLmMgKi8KK2V4dGVybiBpbnQgZXh0Ml9iZ19oYXNfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGdyb3VwKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGV4dDJfYmdfbnVtX2dkYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZ3JvdXApOworZXh0ZXJuIGludCBleHQyX25ld19ibG9jayAoc3RydWN0IGlub2RlICosIHVuc2lnbmVkIGxvbmcsCisJCQkgICBfX3UzMiAqLCBfX3UzMiAqLCBpbnQgKik7CitleHRlcm4gdm9pZCBleHQyX2ZyZWVfYmxvY2tzIChzdHJ1Y3QgaW5vZGUgKiwgdW5zaWduZWQgbG9uZywKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZXh0Ml9jb3VudF9mcmVlX2Jsb2NrcyAoc3RydWN0IHN1cGVyX2Jsb2NrICopOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZXh0Ml9jb3VudF9kaXJzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CitleHRlcm4gdm9pZCBleHQyX2NoZWNrX2Jsb2Nrc19iaXRtYXAgKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK2V4dGVybiBzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjICogZXh0Ml9nZXRfZ3JvdXBfZGVzYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwkJCQkJCSAgICB1bnNpZ25lZCBpbnQgYmxvY2tfZ3JvdXAsCisJCQkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqIGJoKTsKKworLyogZGlyLmMgKi8KK2V4dGVybiBpbnQgZXh0Ml9hZGRfbGluayAoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gaW5vX3QgZXh0Ml9pbm9kZV9ieV9uYW1lKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICopOworZXh0ZXJuIGludCBleHQyX21ha2VfZW1wdHkoc3RydWN0IGlub2RlICosIHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiBzdHJ1Y3QgZXh0Ml9kaXJfZW50cnlfMiAqIGV4dDJfZmluZF9lbnRyeSAoc3RydWN0IGlub2RlICosc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgcGFnZSAqKik7CitleHRlcm4gaW50IGV4dDJfZGVsZXRlX2VudHJ5IChzdHJ1Y3QgZXh0Ml9kaXJfZW50cnlfMiAqLCBzdHJ1Y3QgcGFnZSAqKTsKK2V4dGVybiBpbnQgZXh0Ml9lbXB0eV9kaXIgKHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiBzdHJ1Y3QgZXh0Ml9kaXJfZW50cnlfMiAqIGV4dDJfZG90ZG90IChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IHBhZ2UgKiopOworZXh0ZXJuIHZvaWQgZXh0Ml9zZXRfbGluayhzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGV4dDJfZGlyX2VudHJ5XzIgKiwgc3RydWN0IHBhZ2UgKiwgc3RydWN0IGlub2RlICopOworCisvKiBmc3luYy5jICovCitleHRlcm4gaW50IGV4dDJfc3luY19maWxlIChzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCk7CisKKy8qIGlhbGxvYy5jICovCitleHRlcm4gc3RydWN0IGlub2RlICogZXh0Ml9uZXdfaW5vZGUgKHN0cnVjdCBpbm9kZSAqLCBpbnQpOworZXh0ZXJuIHZvaWQgZXh0Ml9mcmVlX2lub2RlIChzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gdW5zaWduZWQgbG9uZyBleHQyX2NvdW50X2ZyZWVfaW5vZGVzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CitleHRlcm4gdm9pZCBleHQyX2NoZWNrX2lub2Rlc19iaXRtYXAgKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGV4dDJfY291bnRfZnJlZSAoc3RydWN0IGJ1ZmZlcl9oZWFkICosIHVuc2lnbmVkKTsKKworLyogaW5vZGUuYyAqLworZXh0ZXJuIHZvaWQgZXh0Ml9yZWFkX2lub2RlIChzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gaW50IGV4dDJfd3JpdGVfaW5vZGUgKHN0cnVjdCBpbm9kZSAqLCBpbnQpOworZXh0ZXJuIHZvaWQgZXh0Ml9kZWxldGVfaW5vZGUgKHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiBpbnQgZXh0Ml9zeW5jX2lub2RlIChzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gdm9pZCBleHQyX2Rpc2NhcmRfcHJlYWxsb2MgKHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiBpbnQgZXh0Ml9nZXRfYmxvY2soc3RydWN0IGlub2RlICosIHNlY3Rvcl90LCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwgaW50KTsKK2V4dGVybiB2b2lkIGV4dDJfdHJ1bmNhdGUgKHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiBpbnQgZXh0Ml9zZXRhdHRyIChzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBpYXR0ciAqKTsKK2V4dGVybiB2b2lkIGV4dDJfc2V0X2lub2RlX2ZsYWdzKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworCisvKiBpb2N0bC5jICovCitleHRlcm4gaW50IGV4dDJfaW9jdGwgKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsCisJCSAgICAgICB1bnNpZ25lZCBsb25nKTsKKworLyogc3VwZXIuYyAqLworZXh0ZXJuIHZvaWQgZXh0Ml9lcnJvciAoc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOworZXh0ZXJuIHZvaWQgZXh0Ml93YXJuaW5nIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIC4uLikKKwlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDMsIDQpKSk7CitleHRlcm4gdm9pZCBleHQyX3VwZGF0ZV9keW5hbWljX3JldiAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CitleHRlcm4gdm9pZCBleHQyX3dyaXRlX3N1cGVyIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CisKKy8qCisgKiBJbm9kZXMgYW5kIGZpbGVzIG9wZXJhdGlvbnMKKyAqLworCisvKiBkaXIuYyAqLworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXh0Ml9kaXJfb3BlcmF0aW9uczsKKworLyogZmlsZS5jICovCitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZXh0Ml9maWxlX2lub2RlX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBleHQyX2ZpbGVfb3BlcmF0aW9uczsKKworLyogaW5vZGUuYyAqLworZXh0ZXJuIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgZXh0Ml9hb3BzOworZXh0ZXJuIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgZXh0Ml9ub2JoX2FvcHM7CisKKy8qIG5hbWVpLmMgKi8KK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBleHQyX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGV4dDJfc3BlY2lhbF9pbm9kZV9vcGVyYXRpb25zOworCisvKiBzeW1saW5rLmMgKi8KK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBleHQyX2Zhc3Rfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGV4dDJfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOwpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9maWxlLmMgYi9mcy9leHQyL2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWU4NjE0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0Mi9maWxlLmMKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqICBsaW51eC9mcy9leHQyL2ZpbGUuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NQorICogUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQorICogTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqCisgKiAgZnJvbQorICoKKyAqICBsaW51eC9mcy9taW5peC9maWxlLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICBleHQyIGZzIHJlZ3VsYXIgZmlsZSBoYW5kbGluZyBwcmltaXRpdmVzCisgKgorICogIDY0LWJpdCBmaWxlIHN1cHBvcnQgb24gNjQtYml0IHBsYXRmb3JtcyBieSBKYWt1YiBKZWxpbmVrCisgKiAJKGpqQHN1bnNpdGUubXMubWZmLmN1bmkuY3opCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlICJleHQyLmgiCisjaW5jbHVkZSAieGF0dHIuaCIKKyNpbmNsdWRlICJhY2wuaCIKKworLyoKKyAqIENhbGxlZCB3aGVuIGFuIGlub2RlIGlzIHJlbGVhc2VkLiBOb3RlIHRoYXQgdGhpcyBpcyBkaWZmZXJlbnQKKyAqIGZyb20gZXh0Ml9vcGVuX2ZpbGU6IG9wZW4gZ2V0cyBjYWxsZWQgYXQgZXZlcnkgb3BlbiwgYnV0IHJlbGVhc2UKKyAqIGdldHMgY2FsbGVkIG9ubHkgd2hlbiAvYWxsLyB0aGUgZmlsZXMgYXJlIGNsb3NlZC4KKyAqLworc3RhdGljIGludCBleHQyX3JlbGVhc2VfZmlsZSAoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlpZiAoZmlscC0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCWV4dDJfZGlzY2FyZF9wcmVhbGxvYyAoaW5vZGUpOworCXJldHVybiAwOworfQorCisvKgorICogV2UgaGF2ZSBtb3N0bHkgTlVMTCdzIGhlcmU6IHRoZSBjdXJyZW50IGRlZmF1bHRzIGFyZSBvayBmb3IKKyAqIHRoZSBleHQyIGZpbGVzeXN0ZW0uCisgKi8KK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXh0Ml9maWxlX29wZXJhdGlvbnMgPSB7CisJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAorCS5yZWFkCQk9IGdlbmVyaWNfZmlsZV9yZWFkLAorCS53cml0ZQkJPSBnZW5lcmljX2ZpbGVfd3JpdGUsCisJLmFpb19yZWFkCT0gZ2VuZXJpY19maWxlX2Fpb19yZWFkLAorCS5haW9fd3JpdGUJPSBnZW5lcmljX2ZpbGVfYWlvX3dyaXRlLAorCS5pb2N0bAkJPSBleHQyX2lvY3RsLAorCS5tbWFwCQk9IGdlbmVyaWNfZmlsZV9tbWFwLAorCS5vcGVuCQk9IGdlbmVyaWNfZmlsZV9vcGVuLAorCS5yZWxlYXNlCT0gZXh0Ml9yZWxlYXNlX2ZpbGUsCisJLmZzeW5jCQk9IGV4dDJfc3luY19maWxlLAorCS5yZWFkdgkJPSBnZW5lcmljX2ZpbGVfcmVhZHYsCisJLndyaXRldgkJPSBnZW5lcmljX2ZpbGVfd3JpdGV2LAorCS5zZW5kZmlsZQk9IGdlbmVyaWNfZmlsZV9zZW5kZmlsZSwKK307CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGV4dDJfZmlsZV9pbm9kZV9vcGVyYXRpb25zID0geworCS50cnVuY2F0ZQk9IGV4dDJfdHJ1bmNhdGUsCisjaWZkZWYgQ09ORklHX0VYVDJfRlNfWEFUVFIKKwkuc2V0eGF0dHIJPSBnZW5lcmljX3NldHhhdHRyLAorCS5nZXR4YXR0cgk9IGdlbmVyaWNfZ2V0eGF0dHIsCisJLmxpc3R4YXR0cgk9IGV4dDJfbGlzdHhhdHRyLAorCS5yZW1vdmV4YXR0cgk9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCisjZW5kaWYKKwkuc2V0YXR0cgk9IGV4dDJfc2V0YXR0ciwKKwkucGVybWlzc2lvbgk9IGV4dDJfcGVybWlzc2lvbiwKK307CmRpZmYgLS1naXQgYS9mcy9leHQyL2ZzeW5jLmMgYi9mcy9leHQyL2ZzeW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzljMmU1ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDIvZnN5bmMuYwpAQCAtMCwwICsxLDUxIEBACisvKgorICogIGxpbnV4L2ZzL2V4dDIvZnN5bmMuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTMgIFN0ZXBoZW4gVHdlZWRpZSAoc2N0QGRjcy5lZC5hYy51aykKKyAqICBmcm9tCisgKiAgQ29weXJpZ2h0IChDKSAxOTkyICBSZW15IENhcmQgKGNhcmRAbWFzaS5pYnAuZnIpCisgKiAgICAgICAgICAgICAgICAgICAgICBMYWJvcmF0b2lyZSBNQVNJIC0gSW5zdGl0dXQgQmxhaXNlIFBhc2NhbAorICogICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICogIGZyb20KKyAqICBsaW51eC9mcy9taW5peC90cnVuY2F0ZS5jICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICogCisgKiAgZXh0MmZzIGZzeW5jIHByaW1pdGl2ZQorICoKKyAqICBCaWctZW5kaWFuIHRvIGxpdHRsZS1lbmRpYW4gYnl0ZS1zd2FwcGluZy9iaXRtYXBzIGJ5CisgKiAgICAgICAgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KSwgMTk5NQorICogCisgKiAgUmVtb3ZlZCB1bm5lY2Vzc2FyeSBjb2RlIGR1cGxpY2F0aW9uIGZvciBsaXR0bGUgZW5kaWFuIG1hY2hpbmVzCisgKiAgYW5kIGV4Y2Vzc2l2ZSBfX2lubGluZV9fcy4gCisgKiAgICAgICAgQW5kaSBLbGVlbiwgMTk5NworICoKKyAqIE1ham9yIHNpbXBsaWNhdGlvbnMgYW5kIGNsZWFudXAgLSB3ZSBvbmx5IG5lZWQgdG8gZG8gdGhlIG1ldGFkYXRhLCBiZWNhdXNlCisgKiB3ZSBjYW4gZGVwZW5kIG9uIGdlbmVyaWNfYmxvY2tfZmRhdGFzeW5jKCkgdG8gc3luYyB0aGUgZGF0YSBibG9ja3MuCisgKi8KKworI2luY2x1ZGUgImV4dDIuaCIKKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CQkvKiBmb3IgZnN5bmNfaW5vZGVfYnVmZmVycygpICovCisKKworLyoKKyAqCUZpbGUgbWF5IGJlIE5VTEwgd2hlbiB3ZSBhcmUgY2FsbGVkLiBQZXJoYXBzIHdlIHNob3VsZG4ndAorICoJZXZlbiBwYXNzIGZpbGUgdG8gZnN5bmMgPworICovCisKK2ludCBleHQyX3N5bmNfZmlsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgZGF0YXN5bmMpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgZXJyOworCWludCByZXQ7CisKKwlyZXQgPSBzeW5jX21hcHBpbmdfYnVmZmVycyhpbm9kZS0+aV9tYXBwaW5nKTsKKwlpZiAoIShpbm9kZS0+aV9zdGF0ZSAmIElfRElSVFkpKQorCQlyZXR1cm4gcmV0OworCWlmIChkYXRhc3luYyAmJiAhKGlub2RlLT5pX3N0YXRlICYgSV9ESVJUWV9EQVRBU1lOQykpCisJCXJldHVybiByZXQ7CisKKwllcnIgPSBleHQyX3N5bmNfaW5vZGUoaW5vZGUpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gZXJyOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9mcy9leHQyL2lhbGxvYy5jIGIvZnMvZXh0Mi9pYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2UwNTkxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0Mi9pYWxsb2MuYwpAQCAtMCwwICsxLDczNSBAQAorLyoKKyAqICBsaW51eC9mcy9leHQyL2lhbGxvYy5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1CisgKiBSZW15IENhcmQgKGNhcmRAbWFzaS5pYnAuZnIpCisgKiBMYWJvcmF0b2lyZSBNQVNJIC0gSW5zdGl0dXQgQmxhaXNlIFBhc2NhbAorICogVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICoKKyAqICBCU0QgdWZzLWluc3BpcmVkIGlub2RlIGFuZCBkaXJlY3RvcnkgYWxsb2NhdGlvbiBieSAKKyAqICBTdGVwaGVuIFR3ZWVkaWUgKHNjdEBkY3MuZWQuYWMudWspLCAxOTkzCisgKiAgQmlnLWVuZGlhbiB0byBsaXR0bGUtZW5kaWFuIGJ5dGUtc3dhcHBpbmcvYml0bWFwcyBieQorICogICAgICAgIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSksIDE5OTUKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlICJleHQyLmgiCisjaW5jbHVkZSAieGF0dHIuaCIKKyNpbmNsdWRlICJhY2wuaCIKKworLyoKKyAqIGlhbGxvYy5jIGNvbnRhaW5zIHRoZSBpbm9kZXMgYWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uIHJvdXRpbmVzCisgKi8KKworLyoKKyAqIFRoZSBmcmVlIGlub2RlcyBhcmUgbWFuYWdlZCBieSBiaXRtYXBzLiAgQSBmaWxlIHN5c3RlbSBjb250YWlucyBzZXZlcmFsCisgKiBibG9ja3MgZ3JvdXBzLiAgRWFjaCBncm91cCBjb250YWlucyAxIGJpdG1hcCBibG9jayBmb3IgYmxvY2tzLCAxIGJpdG1hcAorICogYmxvY2sgZm9yIGlub2RlcywgTiBibG9ja3MgZm9yIHRoZSBpbm9kZSB0YWJsZSBhbmQgZGF0YSBibG9ja3MuCisgKgorICogVGhlIGZpbGUgc3lzdGVtIGNvbnRhaW5zIGdyb3VwIGRlc2NyaXB0b3JzIHdoaWNoIGFyZSBsb2NhdGVkIGFmdGVyIHRoZQorICogc3VwZXIgYmxvY2suICBFYWNoIGRlc2NyaXB0b3IgY29udGFpbnMgdGhlIG51bWJlciBvZiB0aGUgYml0bWFwIGJsb2NrIGFuZAorICogdGhlIGZyZWUgYmxvY2tzIGNvdW50IGluIHRoZSBibG9jay4KKyAqLworCisKKy8qCisgKiBSZWFkIHRoZSBpbm9kZSBhbGxvY2F0aW9uIGJpdG1hcCBmb3IgYSBnaXZlbiBibG9ja19ncm91cCwgcmVhZGluZworICogaW50byB0aGUgc3BlY2lmaWVkIHNsb3QgaW4gdGhlIHN1cGVyYmxvY2sncyBiaXRtYXAgY2FjaGUuCisgKgorICogUmV0dXJuIGJ1ZmZlcl9oZWFkIG9mIGJpdG1hcCBvbiBzdWNjZXNzIG9yIE5VTEwuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKgorcmVhZF9pbm9kZV9iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIHVuc2lnbmVkIGxvbmcgYmxvY2tfZ3JvdXApCit7CisJc3RydWN0IGV4dDJfZ3JvdXBfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKworCWRlc2MgPSBleHQyX2dldF9ncm91cF9kZXNjKHNiLCBibG9ja19ncm91cCwgTlVMTCk7CisJaWYgKCFkZXNjKQorCQlnb3RvIGVycm9yX291dDsKKworCWJoID0gc2JfYnJlYWQoc2IsIGxlMzJfdG9fY3B1KGRlc2MtPmJnX2lub2RlX2JpdG1hcCkpOworCWlmICghYmgpCisJCWV4dDJfZXJyb3Ioc2IsICJyZWFkX2lub2RlX2JpdG1hcCIsCisJCQkgICAgIkNhbm5vdCByZWFkIGlub2RlIGJpdG1hcCAtICIKKwkJCSAgICAiYmxvY2tfZ3JvdXAgPSAlbHUsIGlub2RlX2JpdG1hcCA9ICV1IiwKKwkJCSAgICBibG9ja19ncm91cCwgbGUzMl90b19jcHUoZGVzYy0+YmdfaW5vZGVfYml0bWFwKSk7CitlcnJvcl9vdXQ6CisJcmV0dXJuIGJoOworfQorCitzdGF0aWMgdm9pZCBleHQyX3JlbGVhc2VfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGdyb3VwLCBpbnQgZGlyKQoreworCXN0cnVjdCBleHQyX2dyb3VwX2Rlc2MgKiBkZXNjOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwlkZXNjID0gZXh0Ml9nZXRfZ3JvdXBfZGVzYyhzYiwgZ3JvdXAsICZiaCk7CisJaWYgKCFkZXNjKSB7CisJCWV4dDJfZXJyb3Ioc2IsICJleHQyX3JlbGVhc2VfaW5vZGUiLAorCQkJImNhbid0IGdldCBkZXNjcmlwdG9yIGZvciBncm91cCAlZCIsIGdyb3VwKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhFWFQyX1NCKHNiKSwgZ3JvdXApKTsKKwlkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCA9CisJCWNwdV90b19sZTE2KGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KSArIDEpOworCWlmIChkaXIpCisJCWRlc2MtPmJnX3VzZWRfZGlyc19jb3VudCA9CisJCQljcHVfdG9fbGUxNihsZTE2X3RvX2NwdShkZXNjLT5iZ191c2VkX2RpcnNfY291bnQpIC0gMSk7CisJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soRVhUMl9TQihzYiksIGdyb3VwKSk7CisJaWYgKGRpcikKKwkJcGVyY3B1X2NvdW50ZXJfZGVjKCZFWFQyX1NCKHNiKS0+c19kaXJzX2NvdW50ZXIpOworCXNiLT5zX2RpcnQgPSAxOworCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKK30KKworLyoKKyAqIE5PVEUhIFdoZW4gd2UgZ2V0IHRoZSBpbm9kZSwgd2UncmUgdGhlIG9ubHkgcGVvcGxlCisgKiB0aGF0IGhhdmUgYWNjZXNzIHRvIGl0LCBhbmQgYXMgc3VjaCB0aGVyZSBhcmUgbm8KKyAqIHJhY2UgY29uZGl0aW9ucyB3ZSBoYXZlIHRvIHdvcnJ5IGFib3V0LiBUaGUgaW5vZGUKKyAqIGlzIG5vdCBvbiB0aGUgaGFzaC1saXN0cywgYW5kIGl0IGNhbm5vdCBiZSByZWFjaGVkCisgKiB0aHJvdWdoIHRoZSBmaWxlc3lzdGVtIGJlY2F1c2UgdGhlIGRpcmVjdG9yeSBlbnRyeQorICogaGFzIGJlZW4gZGVsZXRlZCBlYXJsaWVyLgorICoKKyAqIEhPV0VWRVI6IHdlIG11c3QgbWFrZSBzdXJlIHRoYXQgd2UgZ2V0IG5vIGFsaWFzZXMsCisgKiB3aGljaCBtZWFucyB0aGF0IHdlIGhhdmUgdG8gY2FsbCAiY2xlYXJfaW5vZGUoKSIKKyAqIF9iZWZvcmVfIHdlIG1hcmsgdGhlIGlub2RlIG5vdCBpbiB1c2UgaW4gdGhlIGlub2RlCisgKiBiaXRtYXBzLiBPdGhlcndpc2UgYSBuZXdseSBjcmVhdGVkIGZpbGUgbWlnaHQgdXNlCisgKiB0aGUgc2FtZSBpbm9kZSBudW1iZXIgKG5vdCBhY3R1YWxseSB0aGUgc2FtZSBwb2ludGVyCisgKiB0aG91Z2gpLCBhbmQgdGhlbiB3ZSdkIGhhdmUgdHdvIGlub2RlcyBzaGFyaW5nIHRoZQorICogc2FtZSBpbm9kZSBudW1iZXIgYW5kIHNwYWNlIG9uIHRoZSBoYXJkZGlzay4KKyAqLwordm9pZCBleHQyX2ZyZWVfaW5vZGUgKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiID0gaW5vZGUtPmlfc2I7CisJaW50IGlzX2RpcmVjdG9yeTsKKwl1bnNpZ25lZCBsb25nIGlubzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpdG1hcF9iaCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBibG9ja19ncm91cDsKKwl1bnNpZ25lZCBsb25nIGJpdDsKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqIGVzOworCisJaW5vID0gaW5vZGUtPmlfaW5vOworCWV4dDJfZGVidWcgKCJmcmVlaW5nIGlub2RlICVsdVxuIiwgaW5vKTsKKworCS8qCisJICogTm90ZTogd2UgbXVzdCBmcmVlIGFueSBxdW90YSBiZWZvcmUgbG9ja2luZyB0aGUgc3VwZXJibG9jaywKKwkgKiBhcyB3cml0aW5nIHRoZSBxdW90YSB0byBkaXNrIG1heSBuZWVkIHRoZSBsb2NrIGFzIHdlbGwuCisJICovCisJaWYgKCFpc19iYWRfaW5vZGUoaW5vZGUpKSB7CisJCS8qIFF1b3RhIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgaW4gaXB1dCgpICovCisJCWV4dDJfeGF0dHJfZGVsZXRlX2lub2RlKGlub2RlKTsKKwkgICAgCURRVU9UX0ZSRUVfSU5PREUoaW5vZGUpOworCQlEUVVPVF9EUk9QKGlub2RlKTsKKwl9CisKKwllcyA9IEVYVDJfU0Ioc2IpLT5zX2VzOworCWlzX2RpcmVjdG9yeSA9IFNfSVNESVIoaW5vZGUtPmlfbW9kZSk7CisKKwkvKiBEbyB0aGlzIEJFRk9SRSBtYXJraW5nIHRoZSBpbm9kZSBub3QgaW4gdXNlIG9yIHJldHVybmluZyBhbiBlcnJvciAqLworCWNsZWFyX2lub2RlIChpbm9kZSk7CisKKwlpZiAoaW5vIDwgRVhUMl9GSVJTVF9JTk8oc2IpIHx8CisJICAgIGlubyA+IGxlMzJfdG9fY3B1KGVzLT5zX2lub2Rlc19jb3VudCkpIHsKKwkJZXh0Ml9lcnJvciAoc2IsICJleHQyX2ZyZWVfaW5vZGUiLAorCQkJICAgICJyZXNlcnZlZCBvciBub25leGlzdGVudCBpbm9kZSAlbHUiLCBpbm8pOworCQlnb3RvIGVycm9yX3JldHVybjsKKwl9CisJYmxvY2tfZ3JvdXAgPSAoaW5vIC0gMSkgLyBFWFQyX0lOT0RFU19QRVJfR1JPVVAoc2IpOworCWJpdCA9IChpbm8gLSAxKSAlIEVYVDJfSU5PREVTX1BFUl9HUk9VUChzYik7CisJYnJlbHNlKGJpdG1hcF9iaCk7CisJYml0bWFwX2JoID0gcmVhZF9pbm9kZV9iaXRtYXAoc2IsIGJsb2NrX2dyb3VwKTsKKwlpZiAoIWJpdG1hcF9iaCkKKwkJZ290byBlcnJvcl9yZXR1cm47CisKKwkvKiBPaywgbm93IHdlIGNhbiBhY3R1YWxseSB1cGRhdGUgdGhlIGlub2RlIGJpdG1hcHMuLiAqLworCWlmICghZXh0Ml9jbGVhcl9iaXRfYXRvbWljKHNiX2JnbF9sb2NrKEVYVDJfU0Ioc2IpLCBibG9ja19ncm91cCksCisJCQkJYml0LCAodm9pZCAqKSBiaXRtYXBfYmgtPmJfZGF0YSkpCisJCWV4dDJfZXJyb3IgKHNiLCAiZXh0Ml9mcmVlX2lub2RlIiwKKwkJCSAgICAgICJiaXQgYWxyZWFkeSBjbGVhcmVkIGZvciBpbm9kZSAlbHUiLCBpbm8pOworCWVsc2UKKwkJZXh0Ml9yZWxlYXNlX2lub2RlKHNiLCBibG9ja19ncm91cCwgaXNfZGlyZWN0b3J5KTsKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaXRtYXBfYmgpOworCWlmIChzYi0+c19mbGFncyAmIE1TX1NZTkNIUk9OT1VTKQorCQlzeW5jX2RpcnR5X2J1ZmZlcihiaXRtYXBfYmgpOworZXJyb3JfcmV0dXJuOgorCWJyZWxzZShiaXRtYXBfYmgpOworfQorCisvKgorICogV2UgcGVyZm9ybSBhc3luY2hyb25vdXMgcHJlcmVhZGluZyBvZiB0aGUgbmV3IGlub2RlJ3MgaW5vZGUgYmxvY2sgd2hlbgorICogd2UgY3JlYXRlIHRoZSBpbm9kZSwgaW4gdGhlIGV4cGVjdGF0aW9uIHRoYXQgdGhlIGlub2RlIHdpbGwgYmUgd3JpdHRlbgorICogYmFjayBzb29uLiAgVGhlcmUgYXJlIHR3byByZWFzb25zOgorICoKKyAqIC0gV2hlbiBjcmVhdGluZyBhIGxhcmdlIG51bWJlciBvZiBmaWxlcywgdGhlIGFzeW5jIHByZXJlYWRzIHdpbGwgYmUKKyAqICAgbmljZWx5IG1lcmdlZCBpbnRvIGxhcmdlIHJlYWRzCisgKiAtIFdoZW4gd3JpdGluZyBvdXQgYSBsYXJnZSBudW1iZXIgb2YgaW5vZGVzLCB3ZSBkb24ndCBuZWVkIHRvIGtlZXAgb24KKyAqICAgc3RhbGxpbmcgdGhlIHdyaXRlcyB3aGlsZSB3ZSByZWFkIHRoZSBpbm9kZSBibG9jay4KKyAqCisgKiBGSVhNRTogZXh0Ml9nZXRfZ3JvdXBfZGVzYygpIG5lZWRzIHRvIGJlIHNpbXBsaWZpZWQuCisgKi8KK3N0YXRpYyB2b2lkIGV4dDJfcHJlcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXVuc2lnbmVkIGxvbmcgYmxvY2tfZ3JvdXA7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBibG9jazsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBleHQyX2dyb3VwX2Rlc2MgKiBnZHA7CisJc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaTsKKworCWJkaSA9IGlub2RlLT5pX21hcHBpbmctPmJhY2tpbmdfZGV2X2luZm87CisJaWYgKGJkaV9yZWFkX2Nvbmdlc3RlZChiZGkpKQorCQlyZXR1cm47CisJaWYgKGJkaV93cml0ZV9jb25nZXN0ZWQoYmRpKSkKKwkJcmV0dXJuOworCisJYmxvY2tfZ3JvdXAgPSAoaW5vZGUtPmlfaW5vIC0gMSkgLyBFWFQyX0lOT0RFU19QRVJfR1JPVVAoaW5vZGUtPmlfc2IpOworCWdkcCA9IGV4dDJfZ2V0X2dyb3VwX2Rlc2MoaW5vZGUtPmlfc2IsIGJsb2NrX2dyb3VwLCAmYmgpOworCWlmIChnZHAgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBGaWd1cmUgb3V0IHRoZSBvZmZzZXQgd2l0aGluIHRoZSBibG9jayBncm91cCBpbm9kZSB0YWJsZQorCSAqLworCW9mZnNldCA9ICgoaW5vZGUtPmlfaW5vIC0gMSkgJSBFWFQyX0lOT0RFU19QRVJfR1JPVVAoaW5vZGUtPmlfc2IpKSAqCisJCQkJRVhUMl9JTk9ERV9TSVpFKGlub2RlLT5pX3NiKTsKKwlibG9jayA9IGxlMzJfdG9fY3B1KGdkcC0+YmdfaW5vZGVfdGFibGUpICsKKwkJCQkob2Zmc2V0ID4+IEVYVDJfQkxPQ0tfU0laRV9CSVRTKGlub2RlLT5pX3NiKSk7CisJc2JfYnJlYWRhaGVhZChpbm9kZS0+aV9zYiwgYmxvY2spOworfQorCisvKgorICogVGhlcmUgYXJlIHR3byBwb2xpY2llcyBmb3IgYWxsb2NhdGluZyBhbiBpbm9kZS4gIElmIHRoZSBuZXcgaW5vZGUgaXMKKyAqIGEgZGlyZWN0b3J5LCB0aGVuIGEgZm9yd2FyZCBzZWFyY2ggaXMgbWFkZSBmb3IgYSBibG9jayBncm91cCB3aXRoIGJvdGgKKyAqIGZyZWUgc3BhY2UgYW5kIGEgbG93IGRpcmVjdG9yeS10by1pbm9kZSByYXRpbzsgaWYgdGhhdCBmYWlscywgdGhlbiBvZgorICogdGhlIGdyb3VwcyB3aXRoIGFib3ZlLWF2ZXJhZ2UgZnJlZSBzcGFjZSwgdGhhdCBncm91cCB3aXRoIHRoZSBmZXdlc3QKKyAqIGRpcmVjdG9yaWVzIGFscmVhZHkgaXMgY2hvc2VuLgorICoKKyAqIEZvciBvdGhlciBpbm9kZXMsIHNlYXJjaCBmb3J3YXJkIGZyb20gdGhlIHBhcmVudCBkaXJlY3RvcnlcJ3MgYmxvY2sKKyAqIGdyb3VwIHRvIGZpbmQgYSBmcmVlIGlub2RlLgorICovCitzdGF0aWMgaW50IGZpbmRfZ3JvdXBfZGlyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBpbm9kZSAqcGFyZW50KQoreworCWludCBuZ3JvdXBzID0gRVhUMl9TQihzYiktPnNfZ3JvdXBzX2NvdW50OworCWludCBhdmVmcmVlaSA9IGV4dDJfY291bnRfZnJlZV9pbm9kZXMoc2IpIC8gbmdyb3VwczsKKwlzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjICpkZXNjLCAqYmVzdF9kZXNjID0gTlVMTDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqYmVzdF9iaCA9IE5VTEw7CisJaW50IGdyb3VwLCBiZXN0X2dyb3VwID0gLTE7CisKKwlmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCBuZ3JvdXBzOyBncm91cCsrKSB7CisJCWRlc2MgPSBleHQyX2dldF9ncm91cF9kZXNjIChzYiwgZ3JvdXAsICZiaCk7CisJCWlmICghZGVzYyB8fCAhZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpCisJCQljb250aW51ZTsKKwkJaWYgKGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KSA8IGF2ZWZyZWVpKQorCQkJY29udGludWU7CisJCWlmICghYmVzdF9kZXNjIHx8IAorCQkgICAgKGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KSA+CisJCSAgICAgbGUxNl90b19jcHUoYmVzdF9kZXNjLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCkpKSB7CisJCQliZXN0X2dyb3VwID0gZ3JvdXA7CisJCQliZXN0X2Rlc2MgPSBkZXNjOworCQkJYmVzdF9iaCA9IGJoOworCQl9CisJfQorCWlmICghYmVzdF9kZXNjKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gYmVzdF9ncm91cDsKK30KKworLyogCisgKiBPcmxvdidzIGFsbG9jYXRvciBmb3IgZGlyZWN0b3JpZXMuIAorICogCisgKiBXZSBhbHdheXMgdHJ5IHRvIHNwcmVhZCBmaXJzdC1sZXZlbCBkaXJlY3Rvcmllcy4KKyAqCisgKiBJZiB0aGVyZSBhcmUgYmxvY2tncm91cHMgd2l0aCBib3RoIGZyZWUgaW5vZGVzIGFuZCBmcmVlIGJsb2NrcyBjb3VudHMgCisgKiBub3Qgd29yc2UgdGhhbiBhdmVyYWdlIHdlIHJldHVybiBvbmUgd2l0aCBzbWFsbGVzdCBkaXJlY3RvcnkgY291bnQuIAorICogT3RoZXJ3aXNlIHdlIHNpbXBseSByZXR1cm4gYSByYW5kb20gZ3JvdXAuIAorICogCisgKiBGb3IgdGhlIHJlc3QgcnVsZXMgbG9vayBzbzogCisgKiAKKyAqIEl0J3MgT0sgdG8gcHV0IGRpcmVjdG9yeSBpbnRvIGEgZ3JvdXAgdW5sZXNzIAorICogaXQgaGFzIHRvbyBtYW55IGRpcmVjdG9yaWVzIGFscmVhZHkgKG1heF9kaXJzKSBvciAKKyAqIGl0IGhhcyB0b28gZmV3IGZyZWUgaW5vZGVzIGxlZnQgKG1pbl9pbm9kZXMpIG9yIAorICogaXQgaGFzIHRvbyBmZXcgZnJlZSBibG9ja3MgbGVmdCAobWluX2Jsb2Nrcykgb3IgCisgKiBpdCdzIGFscmVhZHkgcnVubmluZyB0b28gbGFyZ2UgZGVidCAobWF4X2RlYnQpLiAKKyAqIFBhcmVudCdzIGdyb3VwIGlzIHByZWZlcmVkLCBpZiBpdCBkb2Vzbid0IHNhdGlzZnkgdGhlc2UgCisgKiBjb25kaXRpb25zIHdlIHNlYXJjaCBjeWNsaWNhbGx5IHRocm91Z2ggdGhlIHJlc3QuIElmIG5vbmUgCisgKiBvZiB0aGUgZ3JvdXBzIGxvb2sgZ29vZCB3ZSBqdXN0IGxvb2sgZm9yIGEgZ3JvdXAgd2l0aCBtb3JlIAorICogZnJlZSBpbm9kZXMgdGhhbiBhdmVyYWdlIChzdGFydGluZyBhdCBwYXJlbnQncyBncm91cCkuIAorICogCisgKiBEZWJ0IGlzIGluY3JlbWVudGVkIGVhY2ggdGltZSB3ZSBhbGxvY2F0ZSBhIGRpcmVjdG9yeSBhbmQgZGVjcmVtZW50ZWQgCisgKiB3aGVuIHdlIGFsbG9jYXRlIGFuIGlub2RlLCB3aXRoaW4gMC0tMjU1LiAKKyAqLyAKKworI2RlZmluZSBJTk9ERV9DT1NUIDY0CisjZGVmaW5lIEJMT0NLX0NPU1QgMjU2CisKK3N0YXRpYyBpbnQgZmluZF9ncm91cF9vcmxvdihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgaW5vZGUgKnBhcmVudCkKK3sKKwlpbnQgcGFyZW50X2dyb3VwID0gRVhUMl9JKHBhcmVudCktPmlfYmxvY2tfZ3JvdXA7CisJc3RydWN0IGV4dDJfc2JfaW5mbyAqc2JpID0gRVhUMl9TQihzYik7CisJc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKmVzID0gc2JpLT5zX2VzOworCWludCBuZ3JvdXBzID0gc2JpLT5zX2dyb3Vwc19jb3VudDsKKwlpbnQgaW5vZGVzX3Blcl9ncm91cCA9IEVYVDJfSU5PREVTX1BFUl9HUk9VUChzYik7CisJaW50IGZyZWVpOworCWludCBhdmVmcmVlaTsKKwlpbnQgZnJlZV9ibG9ja3M7CisJaW50IGF2ZWZyZWViOworCWludCBibG9ja3NfcGVyX2RpcjsKKwlpbnQgbmRpcnM7CisJaW50IG1heF9kZWJ0LCBtYXhfZGlycywgbWluX2Jsb2NrcywgbWluX2lub2RlczsKKwlpbnQgZ3JvdXAgPSAtMSwgaTsKKwlzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjICpkZXNjOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwlmcmVlaSA9IHBlcmNwdV9jb3VudGVyX3JlYWRfcG9zaXRpdmUoJnNiaS0+c19mcmVlaW5vZGVzX2NvdW50ZXIpOworCWF2ZWZyZWVpID0gZnJlZWkgLyBuZ3JvdXBzOworCWZyZWVfYmxvY2tzID0gcGVyY3B1X2NvdW50ZXJfcmVhZF9wb3NpdGl2ZSgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlcik7CisJYXZlZnJlZWIgPSBmcmVlX2Jsb2NrcyAvIG5ncm91cHM7CisJbmRpcnMgPSBwZXJjcHVfY291bnRlcl9yZWFkX3Bvc2l0aXZlKCZzYmktPnNfZGlyc19jb3VudGVyKTsKKworCWlmICgocGFyZW50ID09IHNiLT5zX3Jvb3QtPmRfaW5vZGUpIHx8CisJICAgIChFWFQyX0kocGFyZW50KS0+aV9mbGFncyAmIEVYVDJfVE9QRElSX0ZMKSkgeworCQlzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjICpiZXN0X2Rlc2MgPSBOVUxMOworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJlc3RfYmggPSBOVUxMOworCQlpbnQgYmVzdF9uZGlyID0gaW5vZGVzX3Blcl9ncm91cDsKKwkJaW50IGJlc3RfZ3JvdXAgPSAtMTsKKworCQlnZXRfcmFuZG9tX2J5dGVzKCZncm91cCwgc2l6ZW9mKGdyb3VwKSk7CisJCXBhcmVudF9ncm91cCA9ICh1bnNpZ25lZClncm91cCAlIG5ncm91cHM7CisJCWZvciAoaSA9IDA7IGkgPCBuZ3JvdXBzOyBpKyspIHsKKwkJCWdyb3VwID0gKHBhcmVudF9ncm91cCArIGkpICUgbmdyb3VwczsKKwkJCWRlc2MgPSBleHQyX2dldF9ncm91cF9kZXNjIChzYiwgZ3JvdXAsICZiaCk7CisJCQlpZiAoIWRlc2MgfHwgIWRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGxlMTZfdG9fY3B1KGRlc2MtPmJnX3VzZWRfZGlyc19jb3VudCkgPj0gYmVzdF9uZGlyKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KSA8IGF2ZWZyZWVpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KSA8IGF2ZWZyZWViKQorCQkJCWNvbnRpbnVlOworCQkJYmVzdF9ncm91cCA9IGdyb3VwOworCQkJYmVzdF9uZGlyID0gbGUxNl90b19jcHUoZGVzYy0+YmdfdXNlZF9kaXJzX2NvdW50KTsKKwkJCWJlc3RfZGVzYyA9IGRlc2M7CisJCQliZXN0X2JoID0gYmg7CisJCX0KKwkJaWYgKGJlc3RfZ3JvdXAgPj0gMCkgeworCQkJZGVzYyA9IGJlc3RfZGVzYzsKKwkJCWJoID0gYmVzdF9iaDsKKwkJCWdyb3VwID0gYmVzdF9ncm91cDsKKwkJCWdvdG8gZm91bmQ7CisJCX0KKwkJZ290byBmYWxsYmFjazsKKwl9CisKKwlpZiAobmRpcnMgPT0gMCkKKwkJbmRpcnMgPSAxOwkvKiBwZXJjcHVfY291bnRlcnMgYXJlIGFwcHJveGltYXRlLi4uICovCisKKwlibG9ja3NfcGVyX2RpciA9IChsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpLWZyZWVfYmxvY2tzKSAvIG5kaXJzOworCisJbWF4X2RpcnMgPSBuZGlycyAvIG5ncm91cHMgKyBpbm9kZXNfcGVyX2dyb3VwIC8gMTY7CisJbWluX2lub2RlcyA9IGF2ZWZyZWVpIC0gaW5vZGVzX3Blcl9ncm91cCAvIDQ7CisJbWluX2Jsb2NrcyA9IGF2ZWZyZWViIC0gRVhUMl9CTE9DS1NfUEVSX0dST1VQKHNiKSAvIDQ7CisKKwltYXhfZGVidCA9IEVYVDJfQkxPQ0tTX1BFUl9HUk9VUChzYikgLyBtYXgoYmxvY2tzX3Blcl9kaXIsIEJMT0NLX0NPU1QpOworCWlmIChtYXhfZGVidCAqIElOT0RFX0NPU1QgPiBpbm9kZXNfcGVyX2dyb3VwKQorCQltYXhfZGVidCA9IGlub2Rlc19wZXJfZ3JvdXAgLyBJTk9ERV9DT1NUOworCWlmIChtYXhfZGVidCA+IDI1NSkKKwkJbWF4X2RlYnQgPSAyNTU7CisJaWYgKG1heF9kZWJ0ID09IDApCisJCW1heF9kZWJ0ID0gMTsKKworCWZvciAoaSA9IDA7IGkgPCBuZ3JvdXBzOyBpKyspIHsKKwkJZ3JvdXAgPSAocGFyZW50X2dyb3VwICsgaSkgJSBuZ3JvdXBzOworCQlkZXNjID0gZXh0Ml9nZXRfZ3JvdXBfZGVzYyAoc2IsIGdyb3VwLCAmYmgpOworCQlpZiAoIWRlc2MgfHwgIWRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KQorCQkJY29udGludWU7CisJCWlmIChzYmktPnNfZGVidHNbZ3JvdXBdID49IG1heF9kZWJ0KQorCQkJY29udGludWU7CisJCWlmIChsZTE2X3RvX2NwdShkZXNjLT5iZ191c2VkX2RpcnNfY291bnQpID49IG1heF9kaXJzKQorCQkJY29udGludWU7CisJCWlmIChsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCkgPCBtaW5faW5vZGVzKQorCQkJY29udGludWU7CisJCWlmIChsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCkgPCBtaW5fYmxvY2tzKQorCQkJY29udGludWU7CisJCWdvdG8gZm91bmQ7CisJfQorCitmYWxsYmFjazoKKwlmb3IgKGkgPSAwOyBpIDwgbmdyb3VwczsgaSsrKSB7CisJCWdyb3VwID0gKHBhcmVudF9ncm91cCArIGkpICUgbmdyb3VwczsKKwkJZGVzYyA9IGV4dDJfZ2V0X2dyb3VwX2Rlc2MgKHNiLCBncm91cCwgJmJoKTsKKwkJaWYgKCFkZXNjIHx8ICFkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCkKKwkJCWNvbnRpbnVlOworCQlpZiAobGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpID49IGF2ZWZyZWVpKQorCQkJZ290byBmb3VuZDsKKwl9CisKKwlpZiAoYXZlZnJlZWkpIHsKKwkJLyoKKwkJICogVGhlIGZyZWUtaW5vZGVzIGNvdW50ZXIgaXMgYXBwcm94aW1hdGUsIGFuZCBmb3IgcmVhbGx5IHNtYWxsCisJCSAqIGZpbGVzeXN0ZW1zIHRoZSBhYm92ZSB0ZXN0IGNhbiBmYWlsIHRvIGZpbmQgYW55IGJsb2NrZ3JvdXBzCisJCSAqLworCQlhdmVmcmVlaSA9IDA7CisJCWdvdG8gZmFsbGJhY2s7CisJfQorCisJcmV0dXJuIC0xOworCitmb3VuZDoKKwlyZXR1cm4gZ3JvdXA7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9ncm91cF9vdGhlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgaW5vZGUgKnBhcmVudCkKK3sKKwlpbnQgcGFyZW50X2dyb3VwID0gRVhUMl9JKHBhcmVudCktPmlfYmxvY2tfZ3JvdXA7CisJaW50IG5ncm91cHMgPSBFWFQyX1NCKHNiKS0+c19ncm91cHNfY291bnQ7CisJc3RydWN0IGV4dDJfZ3JvdXBfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWludCBncm91cCwgaTsKKworCS8qCisJICogVHJ5IHRvIHBsYWNlIHRoZSBpbm9kZSBpbiBpdHMgcGFyZW50IGRpcmVjdG9yeQorCSAqLworCWdyb3VwID0gcGFyZW50X2dyb3VwOworCWRlc2MgPSBleHQyX2dldF9ncm91cF9kZXNjIChzYiwgZ3JvdXAsICZiaCk7CisJaWYgKGRlc2MgJiYgbGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpICYmCisJCQlsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCkpCisJCWdvdG8gZm91bmQ7CisKKwkvKgorCSAqIFdlJ3JlIGdvaW5nIHRvIHBsYWNlIHRoaXMgaW5vZGUgaW4gYSBkaWZmZXJlbnQgYmxvY2tncm91cCBmcm9tIGl0cworCSAqIHBhcmVudC4gIFdlIHdhbnQgdG8gY2F1c2UgZmlsZXMgaW4gYSBjb21tb24gZGlyZWN0b3J5IHRvIGFsbCBsYW5kIGluCisJICogdGhlIHNhbWUgYmxvY2tncm91cC4gIEJ1dCB3ZSB3YW50IGZpbGVzIHdoaWNoIGFyZSBpbiBhIGRpZmZlcmVudAorCSAqIGRpcmVjdG9yeSB3aGljaCBzaGFyZXMgYSBibG9ja2dyb3VwIHdpdGggb3VyIHBhcmVudCB0byBsYW5kIGluIGEKKwkgKiBkaWZmZXJlbnQgYmxvY2tncm91cC4KKwkgKgorCSAqIFNvIGFkZCBvdXIgZGlyZWN0b3J5J3MgaV9pbm8gaW50byB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIHRoZSBoYXNoLgorCSAqLworCWdyb3VwID0gKGdyb3VwICsgcGFyZW50LT5pX2lubykgJSBuZ3JvdXBzOworCisJLyoKKwkgKiBVc2UgYSBxdWFkcmF0aWMgaGFzaCB0byBmaW5kIGEgZ3JvdXAgd2l0aCBhIGZyZWUgaW5vZGUgYW5kIHNvbWUKKwkgKiBmcmVlIGJsb2Nrcy4KKwkgKi8KKwlmb3IgKGkgPSAxOyBpIDwgbmdyb3VwczsgaSA8PD0gMSkgeworCQlncm91cCArPSBpOworCQlpZiAoZ3JvdXAgPj0gbmdyb3VwcykKKwkJCWdyb3VwIC09IG5ncm91cHM7CisJCWRlc2MgPSBleHQyX2dldF9ncm91cF9kZXNjIChzYiwgZ3JvdXAsICZiaCk7CisJCWlmIChkZXNjICYmIGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KSAmJgorCQkJCWxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KSkKKwkJCWdvdG8gZm91bmQ7CisJfQorCisJLyoKKwkgKiBUaGF0IGZhaWxlZDogdHJ5IGxpbmVhciBzZWFyY2ggZm9yIGEgZnJlZSBpbm9kZSwgZXZlbiBpZiB0aGF0IGdyb3VwCisJICogaGFzIG5vIGZyZWUgYmxvY2tzLgorCSAqLworCWdyb3VwID0gcGFyZW50X2dyb3VwOworCWZvciAoaSA9IDA7IGkgPCBuZ3JvdXBzOyBpKyspIHsKKwkJaWYgKCsrZ3JvdXAgPj0gbmdyb3VwcykKKwkJCWdyb3VwID0gMDsKKwkJZGVzYyA9IGV4dDJfZ2V0X2dyb3VwX2Rlc2MgKHNiLCBncm91cCwgJmJoKTsKKwkJaWYgKGRlc2MgJiYgbGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpKQorCQkJZ290byBmb3VuZDsKKwl9CisKKwlyZXR1cm4gLTE7CisKK2ZvdW5kOgorCXJldHVybiBncm91cDsKK30KKworc3RydWN0IGlub2RlICpleHQyX25ld19pbm9kZShzdHJ1Y3QgaW5vZGUgKmRpciwgaW50IG1vZGUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpdG1hcF9iaCA9IE5VTEw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDI7CisJaW50IGdyb3VwLCBpOworCWlub190IGlubyA9IDA7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJc3RydWN0IGV4dDJfZ3JvdXBfZGVzYyAqZ2RwOworCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICplczsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZV9pbmZvICplaTsKKwlzdHJ1Y3QgZXh0Ml9zYl9pbmZvICpzYmk7CisJaW50IGVycjsKKworCXNiID0gZGlyLT5pX3NiOworCWlub2RlID0gbmV3X2lub2RlKHNiKTsKKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWVpID0gRVhUMl9JKGlub2RlKTsKKwlzYmkgPSBFWFQyX1NCKHNiKTsKKwllcyA9IHNiaS0+c19lczsKKwlpZiAoU19JU0RJUihtb2RlKSkgeworCQlpZiAodGVzdF9vcHQoc2IsIE9MREFMTE9DKSkKKwkJCWdyb3VwID0gZmluZF9ncm91cF9kaXIoc2IsIGRpcik7CisJCWVsc2UKKwkJCWdyb3VwID0gZmluZF9ncm91cF9vcmxvdihzYiwgZGlyKTsKKwl9IGVsc2UgCisJCWdyb3VwID0gZmluZF9ncm91cF9vdGhlcihzYiwgZGlyKTsKKworCWlmIChncm91cCA9PSAtMSkgeworCQllcnIgPSAtRU5PU1BDOworCQlnb3RvIGZhaWw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHNiaS0+c19ncm91cHNfY291bnQ7IGkrKykgeworCQlnZHAgPSBleHQyX2dldF9ncm91cF9kZXNjKHNiLCBncm91cCwgJmJoMik7CisJCWJyZWxzZShiaXRtYXBfYmgpOworCQliaXRtYXBfYmggPSByZWFkX2lub2RlX2JpdG1hcChzYiwgZ3JvdXApOworCQlpZiAoIWJpdG1hcF9iaCkgeworCQkJZXJyID0gLUVJTzsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlpbm8gPSAwOworCityZXBlYXRfaW5fdGhpc19ncm91cDoKKwkJaW5vID0gZXh0Ml9maW5kX25leHRfemVyb19iaXQoKHVuc2lnbmVkIGxvbmcgKiliaXRtYXBfYmgtPmJfZGF0YSwKKwkJCQkJICAgICAgRVhUMl9JTk9ERVNfUEVSX0dST1VQKHNiKSwgaW5vKTsKKwkJaWYgKGlubyA+PSBFWFQyX0lOT0RFU19QRVJfR1JPVVAoc2IpKSB7CisJCQkvKgorCQkJICogUmFyZSByYWNlOiBmaW5kX2dyb3VwX3h4KCkgZGVjaWRlZCB0aGF0IHRoZXJlIHdlcmUKKwkJCSAqIGZyZWUgaW5vZGVzIGluIHRoaXMgZ3JvdXAsIGJ1dCBieSB0aGUgdGltZSB3ZSB0cmllZAorCQkJICogdG8gYWxsb2NhdGUgb25lLCB0aGV5J3JlIGFsbCBnb25lLiAgVGhpcyBjYW4gYWxzbworCQkJICogb2NjdXIgYmVjYXVzZSB0aGUgY291bnRlcnMgd2hpY2ggZmluZF9ncm91cF9vcmxvdigpCisJCQkgKiB1c2VzIGFyZSBhcHByb3hpbWF0ZS4gIFNvIGp1c3QgZ28gYW5kIHNlYXJjaCB0aGUKKwkJCSAqIG5leHQgYmxvY2sgZ3JvdXAuCisJCQkgKi8KKwkJCWlmICgrK2dyb3VwID09IHNiaS0+c19ncm91cHNfY291bnQpCisJCQkJZ3JvdXAgPSAwOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGV4dDJfc2V0X2JpdF9hdG9taWMoc2JfYmdsX2xvY2soc2JpLCBncm91cCksCisJCQkJCQlpbm8sIGJpdG1hcF9iaC0+Yl9kYXRhKSkgeworCQkJLyogd2UgbG9zdCB0aGlzIGlub2RlICovCisJCQlpZiAoKytpbm8gPj0gRVhUMl9JTk9ERVNfUEVSX0dST1VQKHNiKSkgeworCQkJCS8qIHRoaXMgZ3JvdXAgaXMgZXhoYXVzdGVkLCB0cnkgbmV4dCBncm91cCAqLworCQkJCWlmICgrK2dyb3VwID09IHNiaS0+c19ncm91cHNfY291bnQpCisJCQkJCWdyb3VwID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qIHRyeSB0byBmaW5kIGZyZWUgaW5vZGUgaW4gdGhlIHNhbWUgZ3JvdXAgKi8KKwkJCWdvdG8gcmVwZWF0X2luX3RoaXNfZ3JvdXA7CisJCX0KKwkJZ290byBnb3Q7CisJfQorCisJLyoKKwkgKiBTY2FubmVkIGFsbCBibG9ja2dyb3Vwcy4KKwkgKi8KKwllcnIgPSAtRU5PU1BDOworCWdvdG8gZmFpbDsKK2dvdDoKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaXRtYXBfYmgpOworCWlmIChzYi0+c19mbGFncyAmIE1TX1NZTkNIUk9OT1VTKQorCQlzeW5jX2RpcnR5X2J1ZmZlcihiaXRtYXBfYmgpOworCWJyZWxzZShiaXRtYXBfYmgpOworCisJaW5vICs9IGdyb3VwICogRVhUMl9JTk9ERVNfUEVSX0dST1VQKHNiKSArIDE7CisJaWYgKGlubyA8IEVYVDJfRklSU1RfSU5PKHNiKSB8fCBpbm8gPiBsZTMyX3RvX2NwdShlcy0+c19pbm9kZXNfY291bnQpKSB7CisJCWV4dDJfZXJyb3IgKHNiLCAiZXh0Ml9uZXdfaW5vZGUiLAorCQkJICAgICJyZXNlcnZlZCBpbm9kZSBvciBpbm9kZSA+IGlub2RlcyBjb3VudCAtICIKKwkJCSAgICAiYmxvY2tfZ3JvdXAgPSAlZCxpbm9kZT0lbHUiLCBncm91cCwKKwkJCSAgICAodW5zaWduZWQgbG9uZykgaW5vKTsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBmYWlsOworCX0KKworCXBlcmNwdV9jb3VudGVyX21vZCgmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlciwgLTEpOworCWlmIChTX0lTRElSKG1vZGUpKQorCQlwZXJjcHVfY291bnRlcl9pbmMoJnNiaS0+c19kaXJzX2NvdW50ZXIpOworCisJc3Bpbl9sb2NrKHNiX2JnbF9sb2NrKHNiaSwgZ3JvdXApKTsKKwlnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50ID0KKyAgICAgICAgICAgICAgICBjcHVfdG9fbGUxNihsZTE2X3RvX2NwdShnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KSAtIDEpOworCWlmIChTX0lTRElSKG1vZGUpKSB7CisJCWlmIChzYmktPnNfZGVidHNbZ3JvdXBdIDwgMjU1KQorCQkJc2JpLT5zX2RlYnRzW2dyb3VwXSsrOworCQlnZHAtPmJnX3VzZWRfZGlyc19jb3VudCA9CisJCQljcHVfdG9fbGUxNihsZTE2X3RvX2NwdShnZHAtPmJnX3VzZWRfZGlyc19jb3VudCkgKyAxKTsKKwl9IGVsc2UgeworCQlpZiAoc2JpLT5zX2RlYnRzW2dyb3VwXSkKKwkJCXNiaS0+c19kZWJ0c1tncm91cF0tLTsKKwl9CisJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soc2JpLCBncm91cCkpOworCisJc2ItPnNfZGlydCA9IDE7CisJbWFya19idWZmZXJfZGlydHkoYmgyKTsKKwlpbm9kZS0+aV91aWQgPSBjdXJyZW50LT5mc3VpZDsKKwlpZiAodGVzdF9vcHQgKHNiLCBHUlBJRCkpCisJCWlub2RlLT5pX2dpZCA9IGRpci0+aV9naWQ7CisJZWxzZSBpZiAoZGlyLT5pX21vZGUgJiBTX0lTR0lEKSB7CisJCWlub2RlLT5pX2dpZCA9IGRpci0+aV9naWQ7CisJCWlmIChTX0lTRElSKG1vZGUpKQorCQkJbW9kZSB8PSBTX0lTR0lEOworCX0gZWxzZQorCQlpbm9kZS0+aV9naWQgPSBjdXJyZW50LT5mc2dpZDsKKwlpbm9kZS0+aV9tb2RlID0gbW9kZTsKKworCWlub2RlLT5pX2lubyA9IGlubzsKKwlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9TSVpFOwkvKiBUaGlzIGlzIHRoZSBvcHRpbWFsIElPIHNpemUgKGZvciBzdGF0KSwgbm90IHRoZSBmcyBibG9jayBzaXplICovCisJaW5vZGUtPmlfYmxvY2tzID0gMDsKKwlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCW1lbXNldChlaS0+aV9kYXRhLCAwLCBzaXplb2YoZWktPmlfZGF0YSkpOworCWVpLT5pX2ZsYWdzID0gRVhUMl9JKGRpciktPmlfZmxhZ3MgJiB+RVhUMl9CVFJFRV9GTDsKKwlpZiAoU19JU0xOSyhtb2RlKSkKKwkJZWktPmlfZmxhZ3MgJj0gfihFWFQyX0lNTVVUQUJMRV9GTHxFWFQyX0FQUEVORF9GTCk7CisJLyogZGlyc3luYyBpcyBvbmx5IGFwcGxpZWQgdG8gZGlyZWN0b3JpZXMgKi8KKwlpZiAoIVNfSVNESVIobW9kZSkpCisJCWVpLT5pX2ZsYWdzICY9IH5FWFQyX0RJUlNZTkNfRkw7CisJZWktPmlfZmFkZHIgPSAwOworCWVpLT5pX2ZyYWdfbm8gPSAwOworCWVpLT5pX2ZyYWdfc2l6ZSA9IDA7CisJZWktPmlfZmlsZV9hY2wgPSAwOworCWVpLT5pX2Rpcl9hY2wgPSAwOworCWVpLT5pX2R0aW1lID0gMDsKKwllaS0+aV9ibG9ja19ncm91cCA9IGdyb3VwOworCWVpLT5pX25leHRfYWxsb2NfYmxvY2sgPSAwOworCWVpLT5pX25leHRfYWxsb2NfZ29hbCA9IDA7CisJZWktPmlfcHJlYWxsb2NfYmxvY2sgPSAwOworCWVpLT5pX3ByZWFsbG9jX2NvdW50ID0gMDsKKwllaS0+aV9kaXJfc3RhcnRfbG9va3VwID0gMDsKKwllaS0+aV9zdGF0ZSA9IEVYVDJfU1RBVEVfTkVXOworCWV4dDJfc2V0X2lub2RlX2ZsYWdzKGlub2RlKTsKKwlzcGluX2xvY2soJnNiaS0+c19uZXh0X2dlbl9sb2NrKTsKKwlpbm9kZS0+aV9nZW5lcmF0aW9uID0gc2JpLT5zX25leHRfZ2VuZXJhdGlvbisrOworCXNwaW5fdW5sb2NrKCZzYmktPnNfbmV4dF9nZW5fbG9jayk7CisJaW5zZXJ0X2lub2RlX2hhc2goaW5vZGUpOworCisJaWYgKERRVU9UX0FMTE9DX0lOT0RFKGlub2RlKSkgeworCQlEUVVPVF9EUk9QKGlub2RlKTsKKwkJZXJyID0gLUVOT1NQQzsKKwkJZ290byBmYWlsMjsKKwl9CisJZXJyID0gZXh0Ml9pbml0X2FjbChpbm9kZSwgZGlyKTsKKwlpZiAoZXJyKSB7CisJCURRVU9UX0ZSRUVfSU5PREUoaW5vZGUpOworCQlnb3RvIGZhaWwyOworCX0KKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwlleHQyX2RlYnVnKCJhbGxvY2F0aW5nIGlub2RlICVsdVxuIiwgaW5vZGUtPmlfaW5vKTsKKwlleHQyX3ByZXJlYWRfaW5vZGUoaW5vZGUpOworCXJldHVybiBpbm9kZTsKKworZmFpbDI6CisJaW5vZGUtPmlfZmxhZ3MgfD0gU19OT1FVT1RBOworCWlub2RlLT5pX25saW5rID0gMDsKKwlpcHV0KGlub2RlKTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworCitmYWlsOgorCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwlpcHV0KGlub2RlKTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCit1bnNpZ25lZCBsb25nIGV4dDJfY291bnRfZnJlZV9pbm9kZXMgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiKQoreworCXN0cnVjdCBleHQyX2dyb3VwX2Rlc2MgKmRlc2M7CisJdW5zaWduZWQgbG9uZyBkZXNjX2NvdW50ID0gMDsKKwlpbnQgaTsJCisKKyNpZmRlZiBFWFQyRlNfREVCVUcKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqZXM7CisJdW5zaWduZWQgbG9uZyBiaXRtYXBfY291bnQgPSAwOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoID0gTlVMTDsKKworCWxvY2tfc3VwZXIgKHNiKTsKKwllcyA9IEVYVDJfU0Ioc2IpLT5zX2VzOworCWZvciAoaSA9IDA7IGkgPCBFWFQyX1NCKHNiKS0+c19ncm91cHNfY291bnQ7IGkrKykgeworCQl1bnNpZ25lZCB4OworCisJCWRlc2MgPSBleHQyX2dldF9ncm91cF9kZXNjIChzYiwgaSwgTlVMTCk7CisJCWlmICghZGVzYykKKwkJCWNvbnRpbnVlOworCQlkZXNjX2NvdW50ICs9IGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KTsKKwkJYnJlbHNlKGJpdG1hcF9iaCk7CisJCWJpdG1hcF9iaCA9IHJlYWRfaW5vZGVfYml0bWFwKHNiLCBpKTsKKwkJaWYgKCFiaXRtYXBfYmgpCisJCQljb250aW51ZTsKKworCQl4ID0gZXh0Ml9jb3VudF9mcmVlKGJpdG1hcF9iaCwgRVhUMl9JTk9ERVNfUEVSX0dST1VQKHNiKSAvIDgpOworCQlwcmludGsoImdyb3VwICVkOiBzdG9yZWQgPSAlZCwgY291bnRlZCA9ICV1XG4iLAorCQkJaSwgbGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpLCB4KTsKKwkJYml0bWFwX2NvdW50ICs9IHg7CisJfQorCWJyZWxzZShiaXRtYXBfYmgpOworCXByaW50aygiZXh0Ml9jb3VudF9mcmVlX2lub2Rlczogc3RvcmVkID0gJWx1LCBjb21wdXRlZCA9ICVsdSwgJWx1XG4iLAorCQlwZXJjcHVfY291bnRlcl9yZWFkKCZFWFQyX1NCKHNiKS0+c19mcmVlaW5vZGVzX2NvdW50ZXIpLAorCQlkZXNjX2NvdW50LCBiaXRtYXBfY291bnQpOworCXVubG9ja19zdXBlcihzYik7CisJcmV0dXJuIGRlc2NfY291bnQ7CisjZWxzZQorCWZvciAoaSA9IDA7IGkgPCBFWFQyX1NCKHNiKS0+c19ncm91cHNfY291bnQ7IGkrKykgeworCQlkZXNjID0gZXh0Ml9nZXRfZ3JvdXBfZGVzYyAoc2IsIGksIE5VTEwpOworCQlpZiAoIWRlc2MpCisJCQljb250aW51ZTsKKwkJZGVzY19jb3VudCArPSBsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCk7CisJfQorCXJldHVybiBkZXNjX2NvdW50OworI2VuZGlmCit9CisKKy8qIENhbGxlZCBhdCBtb3VudC10aW1lLCBzdXBlci1ibG9jayBpcyBsb2NrZWQgKi8KK3Vuc2lnbmVkIGxvbmcgZXh0Ml9jb3VudF9kaXJzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYikKK3sKKwl1bnNpZ25lZCBsb25nIGNvdW50ID0gMDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBFWFQyX1NCKHNiKS0+c19ncm91cHNfY291bnQ7IGkrKykgeworCQlzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjICpnZHAgPSBleHQyX2dldF9ncm91cF9kZXNjIChzYiwgaSwgTlVMTCk7CisJCWlmICghZ2RwKQorCQkJY29udGludWU7CisJCWNvdW50ICs9IGxlMTZfdG9fY3B1KGdkcC0+YmdfdXNlZF9kaXJzX2NvdW50KTsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCisjaWZkZWYgQ09ORklHX0VYVDJfQ0hFQ0sKKy8qIENhbGxlZCBhdCBtb3VudC10aW1lLCBzdXBlci1ibG9jayBpcyBsb2NrZWQgKi8KK3ZvaWQgZXh0Ml9jaGVja19pbm9kZXNfYml0bWFwIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYikKK3sKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqIGVzID0gRVhUMl9TQihzYiktPnNfZXM7CisJdW5zaWduZWQgbG9uZyBkZXNjX2NvdW50ID0gMCwgYml0bWFwX2NvdW50ID0gMDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpdG1hcF9iaCA9IE5VTEw7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRVhUMl9TQihzYiktPnNfZ3JvdXBzX2NvdW50OyBpKyspIHsKKwkJc3RydWN0IGV4dDJfZ3JvdXBfZGVzYyAqZGVzYzsKKwkJdW5zaWduZWQgeDsKKworCQlkZXNjID0gZXh0Ml9nZXRfZ3JvdXBfZGVzYyhzYiwgaSwgTlVMTCk7CisJCWlmICghZGVzYykKKwkJCWNvbnRpbnVlOworCQlkZXNjX2NvdW50ICs9IGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KTsKKwkJYnJlbHNlKGJpdG1hcF9iaCk7CisJCWJpdG1hcF9iaCA9IHJlYWRfaW5vZGVfYml0bWFwKHNiLCBpKTsKKwkJaWYgKCFiaXRtYXBfYmgpCisJCQljb250aW51ZTsKKwkJCisJCXggPSBleHQyX2NvdW50X2ZyZWUoYml0bWFwX2JoLCBFWFQyX0lOT0RFU19QRVJfR1JPVVAoc2IpIC8gOCk7CisJCWlmIChsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCkgIT0geCkKKwkJCWV4dDJfZXJyb3IgKHNiLCAiZXh0Ml9jaGVja19pbm9kZXNfYml0bWFwIiwKKwkJCQkgICAgIldyb25nIGZyZWUgaW5vZGVzIGNvdW50IGluIGdyb3VwICVkLCAiCisJCQkJICAgICJzdG9yZWQgPSAlZCwgY291bnRlZCA9ICVsdSIsIGksCisJCQkJICAgIGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KSwgeCk7CisJCWJpdG1hcF9jb3VudCArPSB4OworCX0KKwlicmVsc2UoYml0bWFwX2JoKTsKKwlpZiAocGVyY3B1X2NvdW50ZXJfcmVhZCgmRVhUMl9TQihzYiktPnNfZnJlZWlub2Rlc19jb3VudGVyKSAhPQorCQkJCWJpdG1hcF9jb3VudCkKKwkJZXh0Ml9lcnJvcihzYiwgImV4dDJfY2hlY2tfaW5vZGVzX2JpdG1hcCIsCisJCQkgICAgIldyb25nIGZyZWUgaW5vZGVzIGNvdW50IGluIHN1cGVyIGJsb2NrLCAiCisJCQkgICAgInN0b3JlZCA9ICVsdSwgY291bnRlZCA9ICVsdSIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpbGUzMl90b19jcHUoZXMtPnNfZnJlZV9pbm9kZXNfY291bnQpLAorCQkJICAgIGJpdG1hcF9jb3VudCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvaW5vZGUuYyBiL2ZzL2V4dDIvaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODkwYmUwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0Mi9pbm9kZS5jCkBAIC0wLDAgKzEsMTI3NiBAQAorLyoKKyAqICBsaW51eC9mcy9leHQyL2lub2RlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUKKyAqIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKKyAqIExhYm9yYXRvaXJlIE1BU0kgLSBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogIGZyb20KKyAqCisgKiAgbGludXgvZnMvbWluaXgvaW5vZGUuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKgorICogIEdvYWwtZGlyZWN0ZWQgYmxvY2sgYWxsb2NhdGlvbiBieSBTdGVwaGVuIFR3ZWVkaWUKKyAqIAkoc2N0QGRjcy5lZC5hYy51ayksIDE5OTMsIDE5OTgKKyAqICBCaWctZW5kaWFuIHRvIGxpdHRsZS1lbmRpYW4gYnl0ZS1zd2FwcGluZy9iaXRtYXBzIGJ5CisgKiAgICAgICAgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KSwgMTk5NQorICogIDY0LWJpdCBmaWxlIHN1cHBvcnQgb24gNjQtYml0IHBsYXRmb3JtcyBieSBKYWt1YiBKZWxpbmVrCisgKiAJKGpqQHN1bnNpdGUubXMubWZmLmN1bmkuY3opCisgKgorICogIEFzc29ydGVkIHJhY2UgZml4ZXMsIHJld3JpdGUgb2YgZXh0Ml9nZXRfYmxvY2soKSBieSBBbCBWaXJvLCAyMDAwCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2h1aWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L21wYWdlLmg+CisjaW5jbHVkZSAiZXh0Mi5oIgorI2luY2x1ZGUgImFjbC5oIgorCitNT0RVTEVfQVVUSE9SKCJSZW15IENhcmQgYW5kIG90aGVycyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTZWNvbmQgRXh0ZW5kZWQgRmlsZXN5c3RlbSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IGV4dDJfdXBkYXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBpbnQgZG9fc3luYyk7CisKKy8qCisgKiBUZXN0IHdoZXRoZXIgYW4gaW5vZGUgaXMgYSBmYXN0IHN5bWxpbmsuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGV4dDJfaW5vZGVfaXNfZmFzdF9zeW1saW5rKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW50IGVhX2Jsb2NrcyA9IEVYVDJfSShpbm9kZSktPmlfZmlsZV9hY2wgPworCQkoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplID4+IDkpIDogMDsKKworCXJldHVybiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSAmJgorCQlpbm9kZS0+aV9ibG9ja3MgLSBlYV9ibG9ja3MgPT0gMCk7Cit9CisKKy8qCisgKiBDYWxsZWQgYXQgdGhlIGxhc3QgaXB1dCgpIGlmIGlfbmxpbmsgaXMgemVyby4KKyAqLwordm9pZCBleHQyX2RlbGV0ZV9pbm9kZSAoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpCisJCWdvdG8gbm9fZGVsZXRlOworCUVYVDJfSShpbm9kZSktPmlfZHRpbWUJPSBnZXRfc2Vjb25kcygpOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCWV4dDJfdXBkYXRlX2lub2RlKGlub2RlLCBpbm9kZV9uZWVkc19zeW5jKGlub2RlKSk7CisKKwlpbm9kZS0+aV9zaXplID0gMDsKKwlpZiAoaW5vZGUtPmlfYmxvY2tzKQorCQlleHQyX3RydW5jYXRlIChpbm9kZSk7CisJZXh0Ml9mcmVlX2lub2RlIChpbm9kZSk7CisKKwlyZXR1cm47Citub19kZWxldGU6CisJY2xlYXJfaW5vZGUoaW5vZGUpOwkvKiBXZSBtdXN0IGd1YXJhbnRlZSBjbGVhcmluZyBvZiBpbm9kZS4uLiAqLworfQorCit2b2lkIGV4dDJfZGlzY2FyZF9wcmVhbGxvYyAoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisjaWZkZWYgRVhUMl9QUkVBTExPQ0FURQorCXN0cnVjdCBleHQyX2lub2RlX2luZm8gKmVpID0gRVhUMl9JKGlub2RlKTsKKwl3cml0ZV9sb2NrKCZlaS0+aV9tZXRhX2xvY2spOworCWlmIChlaS0+aV9wcmVhbGxvY19jb3VudCkgeworCQl1bnNpZ25lZCBzaG9ydCB0b3RhbCA9IGVpLT5pX3ByZWFsbG9jX2NvdW50OworCQl1bnNpZ25lZCBsb25nIGJsb2NrID0gZWktPmlfcHJlYWxsb2NfYmxvY2s7CisJCWVpLT5pX3ByZWFsbG9jX2NvdW50ID0gMDsKKwkJZWktPmlfcHJlYWxsb2NfYmxvY2sgPSAwOworCQl3cml0ZV91bmxvY2soJmVpLT5pX21ldGFfbG9jayk7CisJCWV4dDJfZnJlZV9ibG9ja3MgKGlub2RlLCBibG9jaywgdG90YWwpOworCQlyZXR1cm47CisJfSBlbHNlCisJCXdyaXRlX3VubG9jaygmZWktPmlfbWV0YV9sb2NrKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IGV4dDJfYWxsb2NfYmxvY2sgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCB1bnNpZ25lZCBsb25nIGdvYWwsIGludCAqZXJyKQoreworI2lmZGVmIEVYVDJGU19ERUJVRworCXN0YXRpYyB1bnNpZ25lZCBsb25nIGFsbG9jX2hpdHMsIGFsbG9jX2F0dGVtcHRzOworI2VuZGlmCisJdW5zaWduZWQgbG9uZyByZXN1bHQ7CisKKworI2lmZGVmIEVYVDJfUFJFQUxMT0NBVEUKKwlzdHJ1Y3QgZXh0Ml9pbm9kZV9pbmZvICplaSA9IEVYVDJfSShpbm9kZSk7CisJd3JpdGVfbG9jaygmZWktPmlfbWV0YV9sb2NrKTsKKwlpZiAoZWktPmlfcHJlYWxsb2NfY291bnQgJiYKKwkgICAgKGdvYWwgPT0gZWktPmlfcHJlYWxsb2NfYmxvY2sgfHwgZ29hbCArIDEgPT0gZWktPmlfcHJlYWxsb2NfYmxvY2spKQorCXsKKwkJcmVzdWx0ID0gZWktPmlfcHJlYWxsb2NfYmxvY2srKzsKKwkJZWktPmlfcHJlYWxsb2NfY291bnQtLTsKKwkJd3JpdGVfdW5sb2NrKCZlaS0+aV9tZXRhX2xvY2spOworCQlleHQyX2RlYnVnICgicHJlYWxsb2NhdGlvbiBoaXQgKCVsdS8lbHUpLlxuIiwKKwkJCSAgICArK2FsbG9jX2hpdHMsICsrYWxsb2NfYXR0ZW1wdHMpOworCX0gZWxzZSB7CisJCXdyaXRlX3VubG9jaygmZWktPmlfbWV0YV9sb2NrKTsKKwkJZXh0Ml9kaXNjYXJkX3ByZWFsbG9jIChpbm9kZSk7CisJCWV4dDJfZGVidWcgKCJwcmVhbGxvY2F0aW9uIG1pc3MgKCVsdS8lbHUpLlxuIiwKKwkJCSAgICBhbGxvY19oaXRzLCArK2FsbG9jX2F0dGVtcHRzKTsKKwkJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCisJCQlyZXN1bHQgPSBleHQyX25ld19ibG9jayAoaW5vZGUsIGdvYWwsIAorCQkJCSAmZWktPmlfcHJlYWxsb2NfY291bnQsCisJCQkJICZlaS0+aV9wcmVhbGxvY19ibG9jaywgZXJyKTsKKwkJZWxzZQorCQkJcmVzdWx0ID0gZXh0Ml9uZXdfYmxvY2soaW5vZGUsIGdvYWwsIE5VTEwsIE5VTEwsIGVycik7CisJfQorI2Vsc2UKKwlyZXN1bHQgPSBleHQyX25ld19ibG9jayAoaW5vZGUsIGdvYWwsIDAsIDAsIGVycik7CisjZW5kaWYKKwlyZXR1cm4gcmVzdWx0OworfQorCit0eXBlZGVmIHN0cnVjdCB7CisJX19sZTMyCSpwOworCV9fbGUzMglrZXk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKK30gSW5kaXJlY3Q7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGRfY2hhaW4oSW5kaXJlY3QgKnAsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIF9fbGUzMiAqdikKK3sKKwlwLT5rZXkgPSAqKHAtPnAgPSB2KTsKKwlwLT5iaCA9IGJoOworfQorCitzdGF0aWMgaW5saW5lIGludCB2ZXJpZnlfY2hhaW4oSW5kaXJlY3QgKmZyb20sIEluZGlyZWN0ICp0bykKK3sKKwl3aGlsZSAoZnJvbSA8PSB0byAmJiBmcm9tLT5rZXkgPT0gKmZyb20tPnApCisJCWZyb20rKzsKKwlyZXR1cm4gKGZyb20gPiB0byk7Cit9CisKKy8qKgorICoJZXh0Ml9ibG9ja190b19wYXRoIC0gcGFyc2UgdGhlIGJsb2NrIG51bWJlciBpbnRvIGFycmF5IG9mIG9mZnNldHMKKyAqCUBpbm9kZTogaW5vZGUgaW4gcXVlc3Rpb24gKHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gaXRzIHN1cGVyYmxvY2spCisgKglAaV9ibG9jazogYmxvY2sgbnVtYmVyIHRvIGJlIHBhcnNlZAorICoJQG9mZnNldHM6IGFycmF5IHRvIHN0b3JlIHRoZSBvZmZzZXRzIGluCisgKiAgICAgIEBib3VuZGFyeTogc2V0IHRoaXMgbm9uLXplcm8gaWYgdGhlIHJlZmVycmVkLXRvIGJsb2NrIGlzIGxpa2VseSB0byBiZQorICogICAgICAgICAgICAgZm9sbG93ZWQgKG9uIGRpc2spIGJ5IGFuIGluZGlyZWN0IGJsb2NrLgorICoJVG8gc3RvcmUgdGhlIGxvY2F0aW9ucyBvZiBmaWxlJ3MgZGF0YSBleHQyIHVzZXMgYSBkYXRhIHN0cnVjdHVyZSBjb21tb24KKyAqCWZvciBVTklYIGZpbGVzeXN0ZW1zIC0gdHJlZSBvZiBwb2ludGVycyBhbmNob3JlZCBpbiB0aGUgaW5vZGUsIHdpdGgKKyAqCWRhdGEgYmxvY2tzIGF0IGxlYXZlcyBhbmQgaW5kaXJlY3QgYmxvY2tzIGluIGludGVybWVkaWF0ZSBub2Rlcy4KKyAqCVRoaXMgZnVuY3Rpb24gdHJhbnNsYXRlcyB0aGUgYmxvY2sgbnVtYmVyIGludG8gcGF0aCBpbiB0aGF0IHRyZWUgLQorICoJcmV0dXJuIHZhbHVlIGlzIHRoZSBwYXRoIGxlbmd0aCBhbmQgQG9mZnNldHNbbl0gaXMgdGhlIG9mZnNldCBvZgorICoJcG9pbnRlciB0byAobisxKXRoIG5vZGUgaW4gdGhlIG50aCBvbmUuIElmIEBibG9jayBpcyBvdXQgb2YgcmFuZ2UKKyAqCShuZWdhdGl2ZSBvciB0b28gbGFyZ2UpIHdhcm5pbmcgaXMgcHJpbnRlZCBhbmQgemVybyByZXR1cm5lZC4KKyAqCisgKglOb3RlOiBmdW5jdGlvbiBkb2Vzbid0IGZpbmQgbm9kZSBhZGRyZXNzZXMsIHNvIG5vIElPIGlzIG5lZWRlZC4gQWxsCisgKgl3ZSBuZWVkIHRvIGtub3cgaXMgdGhlIGNhcGFjaXR5IG9mIGluZGlyZWN0IGJsb2NrcyAodGFrZW4gZnJvbSB0aGUKKyAqCWlub2RlLT5pX3NiKS4KKyAqLworCisvKgorICogUG9ydGFiaWxpdHkgbm90ZTogdGhlIGxhc3QgY29tcGFyaXNvbiAoY2hlY2sgdGhhdCB3ZSBmaXQgaW50byB0cmlwbGUKKyAqIGluZGlyZWN0IGJsb2NrKSBpcyBzcGVsbGVkIGRpZmZlcmVudGx5LCBiZWNhdXNlIG90aGVyd2lzZSBvbiBhbgorICogYXJjaGl0ZWN0dXJlIHdpdGggMzItYml0IGxvbmdzIGFuZCA4S2IgcGFnZXMgd2UgbWlnaHQgZ2V0IGludG8gdHJvdWJsZQorICogaWYgb3VyIGZpbGVzeXN0ZW0gaGFkIDhLYiBibG9ja3MuIFdlIG1pZ2h0IHVzZSBsb25nIGxvbmcsIGJ1dCB0aGF0IHdvdWxkCisgKiBraWxsIHVzIG9uIHg4Ni4gT2gsIHdlbGwsIGF0IGxlYXN0IHRoZSBzaWduIHByb3BhZ2F0aW9uIGRvZXMgbm90IG1hdHRlciAtCisgKiBpX2Jsb2NrIHdvdWxkIGhhdmUgdG8gYmUgbmVnYXRpdmUgaW4gdGhlIHZlcnkgYmVnaW5uaW5nLCBzbyB3ZSB3b3VsZCBub3QKKyAqIGdldCB0aGVyZSBhdCBhbGwuCisgKi8KKworc3RhdGljIGludCBleHQyX2Jsb2NrX3RvX3BhdGgoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCWxvbmcgaV9ibG9jaywgaW50IG9mZnNldHNbNF0sIGludCAqYm91bmRhcnkpCit7CisJaW50IHB0cnMgPSBFWFQyX0FERFJfUEVSX0JMT0NLKGlub2RlLT5pX3NiKTsKKwlpbnQgcHRyc19iaXRzID0gRVhUMl9BRERSX1BFUl9CTE9DS19CSVRTKGlub2RlLT5pX3NiKTsKKwljb25zdCBsb25nIGRpcmVjdF9ibG9ja3MgPSBFWFQyX05ESVJfQkxPQ0tTLAorCQlpbmRpcmVjdF9ibG9ja3MgPSBwdHJzLAorCQlkb3VibGVfYmxvY2tzID0gKDEgPDwgKHB0cnNfYml0cyAqIDIpKTsKKwlpbnQgbiA9IDA7CisJaW50IGZpbmFsID0gMDsKKworCWlmIChpX2Jsb2NrIDwgMCkgeworCQlleHQyX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAiZXh0Ml9ibG9ja190b19wYXRoIiwgImJsb2NrIDwgMCIpOworCX0gZWxzZSBpZiAoaV9ibG9jayA8IGRpcmVjdF9ibG9ja3MpIHsKKwkJb2Zmc2V0c1tuKytdID0gaV9ibG9jazsKKwkJZmluYWwgPSBkaXJlY3RfYmxvY2tzOworCX0gZWxzZSBpZiAoIChpX2Jsb2NrIC09IGRpcmVjdF9ibG9ja3MpIDwgaW5kaXJlY3RfYmxvY2tzKSB7CisJCW9mZnNldHNbbisrXSA9IEVYVDJfSU5EX0JMT0NLOworCQlvZmZzZXRzW24rK10gPSBpX2Jsb2NrOworCQlmaW5hbCA9IHB0cnM7CisJfSBlbHNlIGlmICgoaV9ibG9jayAtPSBpbmRpcmVjdF9ibG9ja3MpIDwgZG91YmxlX2Jsb2NrcykgeworCQlvZmZzZXRzW24rK10gPSBFWFQyX0RJTkRfQkxPQ0s7CisJCW9mZnNldHNbbisrXSA9IGlfYmxvY2sgPj4gcHRyc19iaXRzOworCQlvZmZzZXRzW24rK10gPSBpX2Jsb2NrICYgKHB0cnMgLSAxKTsKKwkJZmluYWwgPSBwdHJzOworCX0gZWxzZSBpZiAoKChpX2Jsb2NrIC09IGRvdWJsZV9ibG9ja3MpID4+IChwdHJzX2JpdHMgKiAyKSkgPCBwdHJzKSB7CisJCW9mZnNldHNbbisrXSA9IEVYVDJfVElORF9CTE9DSzsKKwkJb2Zmc2V0c1tuKytdID0gaV9ibG9jayA+PiAocHRyc19iaXRzICogMik7CisJCW9mZnNldHNbbisrXSA9IChpX2Jsb2NrID4+IHB0cnNfYml0cykgJiAocHRycyAtIDEpOworCQlvZmZzZXRzW24rK10gPSBpX2Jsb2NrICYgKHB0cnMgLSAxKTsKKwkJZmluYWwgPSBwdHJzOworCX0gZWxzZSB7CisJCWV4dDJfd2FybmluZyAoaW5vZGUtPmlfc2IsICJleHQyX2Jsb2NrX3RvX3BhdGgiLCAiYmxvY2sgPiBiaWciKTsKKwl9CisJaWYgKGJvdW5kYXJ5KQorCQkqYm91bmRhcnkgPSAoaV9ibG9jayAmIChwdHJzIC0gMSkpID09IChmaW5hbCAtIDEpOworCXJldHVybiBuOworfQorCisvKioKKyAqCWV4dDJfZ2V0X2JyYW5jaCAtIHJlYWQgdGhlIGNoYWluIG9mIGluZGlyZWN0IGJsb2NrcyBsZWFkaW5nIHRvIGRhdGEKKyAqCUBpbm9kZTogaW5vZGUgaW4gcXVlc3Rpb24KKyAqCUBkZXB0aDogZGVwdGggb2YgdGhlIGNoYWluICgxIC0gZGlyZWN0IHBvaW50ZXIsIGV0Yy4pCisgKglAb2Zmc2V0czogb2Zmc2V0cyBvZiBwb2ludGVycyBpbiBpbm9kZS9pbmRpcmVjdCBibG9ja3MKKyAqCUBjaGFpbjogcGxhY2UgdG8gc3RvcmUgdGhlIHJlc3VsdAorICoJQGVycjogaGVyZSB3ZSBzdG9yZSB0aGUgZXJyb3IgdmFsdWUKKyAqCisgKglGdW5jdGlvbiBmaWxscyB0aGUgYXJyYXkgb2YgdHJpcGxlcyA8a2V5LCBwLCBiaD4gYW5kIHJldHVybnMgJU5VTEwKKyAqCWlmIGV2ZXJ5dGhpbmcgd2VudCBPSyBvciB0aGUgcG9pbnRlciB0byB0aGUgbGFzdCBmaWxsZWQgdHJpcGxlCisgKgkoaW5jb21wbGV0ZSBvbmUpIG90aGVyd2lzZS4gVXBvbiB0aGUgcmV0dXJuIGNoYWluW2ldLmtleSBjb250YWlucworICoJdGhlIG51bWJlciBvZiAoaSsxKS10aCBibG9jayBpbiB0aGUgY2hhaW4gKGFzIGl0IGlzIHN0b3JlZCBpbiBtZW1vcnksCisgKglpLmUuIGxpdHRsZS1lbmRpYW4gMzItYml0KSwgY2hhaW5baV0ucCBjb250YWlucyB0aGUgYWRkcmVzcyBvZiB0aGF0CisgKgludW1iZXIgKGl0IHBvaW50cyBpbnRvIHN0cnVjdCBpbm9kZSBmb3IgaT09MCBhbmQgaW50byB0aGUgYmgtPmJfZGF0YQorICoJZm9yIGk+MCkgYW5kIGNoYWluW2ldLmJoIHBvaW50cyB0byB0aGUgYnVmZmVyX2hlYWQgb2YgaS10aCBpbmRpcmVjdAorICoJYmxvY2sgZm9yIGk+MCBhbmQgTlVMTCBmb3IgaT09MC4gSW4gb3RoZXIgd29yZHMsIGl0IGhvbGRzIHRoZSBibG9jaworICoJbnVtYmVycyBvZiB0aGUgY2hhaW4sIGFkZHJlc3NlcyB0aGV5IHdlcmUgdGFrZW4gZnJvbSAoYW5kIHdoZXJlIHdlIGNhbgorICoJdmVyaWZ5IHRoYXQgY2hhaW4gZGlkIG5vdCBjaGFuZ2UpIGFuZCBidWZmZXJfaGVhZHMgaG9zdGluZyB0aGVzZQorICoJbnVtYmVycy4KKyAqCisgKglGdW5jdGlvbiBzdG9wcyB3aGVuIGl0IHN0dW1ibGVzIHVwb24gemVybyBwb2ludGVyIChhYnNlbnQgYmxvY2spCisgKgkJKHBvaW50ZXIgdG8gbGFzdCB0cmlwbGUgcmV0dXJuZWQsICpAZXJyID09IDApCisgKglvciB3aGVuIGl0IGdldHMgYW4gSU8gZXJyb3IgcmVhZGluZyBhbiBpbmRpcmVjdCBibG9jaworICoJCShkaXR0bywgKkBlcnIgPT0gLUVJTykKKyAqCW9yIHdoZW4gaXQgbm90aWNlcyB0aGF0IGNoYWluIGhhZCBiZWVuIGNoYW5nZWQgd2hpbGUgaXQgd2FzIHJlYWRpbmcKKyAqCQkoZGl0dG8sICpAZXJyID09IC1FQUdBSU4pCisgKglvciB3aGVuIGl0IHJlYWRzIGFsbCBAZGVwdGgtMSBpbmRpcmVjdCBibG9ja3Mgc3VjY2Vzc2Z1bGx5IGFuZCBmaW5kcworICoJdGhlIHdob2xlIGNoYWluLCBhbGwgd2F5IHRvIHRoZSBkYXRhIChyZXR1cm5zICVOVUxMLCAqZXJyID09IDApLgorICovCitzdGF0aWMgSW5kaXJlY3QgKmV4dDJfZ2V0X2JyYW5jaChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSBpbnQgZGVwdGgsCisJCQkJIGludCAqb2Zmc2V0cywKKwkJCQkgSW5kaXJlY3QgY2hhaW5bNF0sCisJCQkJIGludCAqZXJyKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlJbmRpcmVjdCAqcCA9IGNoYWluOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwkqZXJyID0gMDsKKwkvKiBpX2RhdGEgaXMgbm90IGdvaW5nIGF3YXksIG5vIGxvY2sgbmVlZGVkICovCisJYWRkX2NoYWluIChjaGFpbiwgTlVMTCwgRVhUMl9JKGlub2RlKS0+aV9kYXRhICsgKm9mZnNldHMpOworCWlmICghcC0+a2V5KQorCQlnb3RvIG5vX2Jsb2NrOworCXdoaWxlICgtLWRlcHRoKSB7CisJCWJoID0gc2JfYnJlYWQoc2IsIGxlMzJfdG9fY3B1KHAtPmtleSkpOworCQlpZiAoIWJoKQorCQkJZ290byBmYWlsdXJlOworCQlyZWFkX2xvY2soJkVYVDJfSShpbm9kZSktPmlfbWV0YV9sb2NrKTsKKwkJaWYgKCF2ZXJpZnlfY2hhaW4oY2hhaW4sIHApKQorCQkJZ290byBjaGFuZ2VkOworCQlhZGRfY2hhaW4oKytwLCBiaCwgKF9fbGUzMiopYmgtPmJfZGF0YSArICorK29mZnNldHMpOworCQlyZWFkX3VubG9jaygmRVhUMl9JKGlub2RlKS0+aV9tZXRhX2xvY2spOworCQlpZiAoIXAtPmtleSkKKwkJCWdvdG8gbm9fYmxvY2s7CisJfQorCXJldHVybiBOVUxMOworCitjaGFuZ2VkOgorCXJlYWRfdW5sb2NrKCZFWFQyX0koaW5vZGUpLT5pX21ldGFfbG9jayk7CisJYnJlbHNlKGJoKTsKKwkqZXJyID0gLUVBR0FJTjsKKwlnb3RvIG5vX2Jsb2NrOworZmFpbHVyZToKKwkqZXJyID0gLUVJTzsKK25vX2Jsb2NrOgorCXJldHVybiBwOworfQorCisvKioKKyAqCWV4dDJfZmluZF9uZWFyIC0gZmluZCBhIHBsYWNlIGZvciBhbGxvY2F0aW9uIHdpdGggc3VmZmljaWVudCBsb2NhbGl0eQorICoJQGlub2RlOiBvd25lcgorICoJQGluZDogZGVzY3JpcHRvciBvZiBpbmRpcmVjdCBibG9jay4KKyAqCisgKglUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHByZWZlcmVkIHBsYWNlIGZvciBibG9jayBhbGxvY2F0aW9uLgorICoJSXQgaXMgdXNlZCB3aGVuIGhldXJpc3RpYyBmb3Igc2VxdWVudGlhbCBhbGxvY2F0aW9uIGZhaWxzLgorICoJUnVsZXMgYXJlOgorICoJICArIGlmIHRoZXJlIGlzIGEgYmxvY2sgdG8gdGhlIGxlZnQgb2Ygb3VyIHBvc2l0aW9uIC0gYWxsb2NhdGUgbmVhciBpdC4KKyAqCSAgKyBpZiBwb2ludGVyIHdpbGwgbGl2ZSBpbiBpbmRpcmVjdCBibG9jayAtIGFsbG9jYXRlIG5lYXIgdGhhdCBibG9jay4KKyAqCSAgKyBpZiBwb2ludGVyIHdpbGwgbGl2ZSBpbiBpbm9kZSAtIGFsbG9jYXRlIGluIHRoZSBzYW1lIGN5bGluZGVyIGdyb3VwLgorICoKKyAqIEluIHRoZSBsYXR0ZXIgY2FzZSB3ZSBjb2xvdXIgdGhlIHN0YXJ0aW5nIGJsb2NrIGJ5IHRoZSBjYWxsZXJzIFBJRCB0bworICogcHJldmVudCBpdCBmcm9tIGNsYXNoaW5nIHdpdGggY29uY3VycmVudCBhbGxvY2F0aW9ucyBmb3IgYSBkaWZmZXJlbnQgaW5vZGUKKyAqIGluIHRoZSBzYW1lIGJsb2NrIGdyb3VwLiAgIFRoZSBQSUQgaXMgdXNlZCBoZXJlIHNvIHRoYXQgZnVuY3Rpb25hbGx5IHJlbGF0ZWQKKyAqIGZpbGVzIHdpbGwgYmUgY2xvc2UtYnkgb24tZGlzay4KKyAqCisgKglDYWxsZXIgbXVzdCBtYWtlIHN1cmUgdGhhdCBAaW5kIGlzIHZhbGlkIGFuZCB3aWxsIHN0YXkgdGhhdCB3YXkuCisgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZXh0Ml9maW5kX25lYXIoc3RydWN0IGlub2RlICppbm9kZSwgSW5kaXJlY3QgKmluZCkKK3sKKwlzdHJ1Y3QgZXh0Ml9pbm9kZV9pbmZvICplaSA9IEVYVDJfSShpbm9kZSk7CisJX19sZTMyICpzdGFydCA9IGluZC0+YmggPyAoX19sZTMyICopIGluZC0+YmgtPmJfZGF0YSA6IGVpLT5pX2RhdGE7CisJX19sZTMyICpwOworCXVuc2lnbmVkIGxvbmcgYmdfc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBjb2xvdXI7CisKKwkvKiBUcnkgdG8gZmluZCBwcmV2aW91cyBibG9jayAqLworCWZvciAocCA9IGluZC0+cCAtIDE7IHAgPj0gc3RhcnQ7IHAtLSkKKwkJaWYgKCpwKQorCQkJcmV0dXJuIGxlMzJfdG9fY3B1KCpwKTsKKworCS8qIE5vIHN1Y2ggdGhpbmcsIHNvIGxldCdzIHRyeSBsb2NhdGlvbiBvZiBpbmRpcmVjdCBibG9jayAqLworCWlmIChpbmQtPmJoKQorCQlyZXR1cm4gaW5kLT5iaC0+Yl9ibG9ja25yOworCisJLyoKKwkgKiBJdCBpcyBnb2luZyB0byBiZSByZWZlcmVkIGZyb20gaW5vZGUgaXRzZWxmPyBPSywganVzdCBwdXQgaXQgaW50bworCSAqIHRoZSBzYW1lIGN5bGluZGVyIGdyb3VwIHRoZW4uCisJICovCisJYmdfc3RhcnQgPSAoZWktPmlfYmxvY2tfZ3JvdXAgKiBFWFQyX0JMT0NLU19QRVJfR1JPVVAoaW5vZGUtPmlfc2IpKSArCisJCWxlMzJfdG9fY3B1KEVYVDJfU0IoaW5vZGUtPmlfc2IpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spOworCWNvbG91ciA9IChjdXJyZW50LT5waWQgJSAxNikgKgorCQkJKEVYVDJfQkxPQ0tTX1BFUl9HUk9VUChpbm9kZS0+aV9zYikgLyAxNik7CisJcmV0dXJuIGJnX3N0YXJ0ICsgY29sb3VyOworfQorCisvKioKKyAqCWV4dDJfZmluZF9nb2FsIC0gZmluZCBhIHByZWZlcmVkIHBsYWNlIGZvciBhbGxvY2F0aW9uLgorICoJQGlub2RlOiBvd25lcgorICoJQGJsb2NrOiAgYmxvY2sgd2Ugd2FudAorICoJQGNoYWluOiAgY2hhaW4gb2YgaW5kaXJlY3QgYmxvY2tzCisgKglAcGFydGlhbDogcG9pbnRlciB0byB0aGUgbGFzdCB0cmlwbGUgd2l0aGluIGEgY2hhaW4KKyAqCUBnb2FsOglwbGFjZSB0byBzdG9yZSB0aGUgcmVzdWx0LgorICoKKyAqCU5vcm1hbGx5IHRoaXMgZnVuY3Rpb24gZmluZCB0aGUgcHJlZmVyZWQgcGxhY2UgZm9yIGJsb2NrIGFsbG9jYXRpb24sCisgKglzdG9yZXMgaXQgaW4gKkBnb2FsIGFuZCByZXR1cm5zIHplcm8uIElmIHRoZSBicmFuY2ggaGFkIGJlZW4gY2hhbmdlZAorICoJdW5kZXIgdXMgd2UgcmV0dXJuIC1FQUdBSU4uCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgZXh0Ml9maW5kX2dvYWwoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgbG9uZyBibG9jaywKKwkJCQkgSW5kaXJlY3QgY2hhaW5bNF0sCisJCQkJIEluZGlyZWN0ICpwYXJ0aWFsLAorCQkJCSB1bnNpZ25lZCBsb25nICpnb2FsKQoreworCXN0cnVjdCBleHQyX2lub2RlX2luZm8gKmVpID0gRVhUMl9JKGlub2RlKTsKKwl3cml0ZV9sb2NrKCZlaS0+aV9tZXRhX2xvY2spOworCWlmICgoYmxvY2sgPT0gZWktPmlfbmV4dF9hbGxvY19ibG9jayArIDEpICYmIGVpLT5pX25leHRfYWxsb2NfZ29hbCkgeworCQllaS0+aV9uZXh0X2FsbG9jX2Jsb2NrKys7CisJCWVpLT5pX25leHRfYWxsb2NfZ29hbCsrOworCX0gCisJaWYgKHZlcmlmeV9jaGFpbihjaGFpbiwgcGFydGlhbCkpIHsKKwkJLyoKKwkJICogdHJ5IHRoZSBoZXVyaXN0aWMgZm9yIHNlcXVlbnRpYWwgYWxsb2NhdGlvbiwKKwkJICogZmFpbGluZyB0aGF0IGF0IGxlYXN0IHRyeSB0byBnZXQgZGVjZW50IGxvY2FsaXR5LgorCQkgKi8KKwkJaWYgKGJsb2NrID09IGVpLT5pX25leHRfYWxsb2NfYmxvY2spCisJCQkqZ29hbCA9IGVpLT5pX25leHRfYWxsb2NfZ29hbDsKKwkJaWYgKCEqZ29hbCkKKwkJCSpnb2FsID0gZXh0Ml9maW5kX25lYXIoaW5vZGUsIHBhcnRpYWwpOworCQl3cml0ZV91bmxvY2soJmVpLT5pX21ldGFfbG9jayk7CisJCXJldHVybiAwOworCX0KKwl3cml0ZV91bmxvY2soJmVpLT5pX21ldGFfbG9jayk7CisJcmV0dXJuIC1FQUdBSU47Cit9CisKKy8qKgorICoJZXh0Ml9hbGxvY19icmFuY2ggLSBhbGxvY2F0ZSBhbmQgc2V0IHVwIGEgY2hhaW4gb2YgYmxvY2tzLgorICoJQGlub2RlOiBvd25lcgorICoJQG51bTogZGVwdGggb2YgdGhlIGNoYWluIChudW1iZXIgb2YgYmxvY2tzIHRvIGFsbG9jYXRlKQorICoJQG9mZnNldHM6IG9mZnNldHMgKGluIHRoZSBibG9ja3MpIHRvIHN0b3JlIHRoZSBwb2ludGVycyB0byBuZXh0LgorICoJQGJyYW5jaDogcGxhY2UgdG8gc3RvcmUgdGhlIGNoYWluIGluLgorICoKKyAqCVRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIEBudW0gYmxvY2tzLCB6ZXJvZXMgb3V0IGFsbCBidXQgdGhlIGxhc3Qgb25lLAorICoJbGlua3MgdGhlbSBpbnRvIGNoYWluIGFuZCAoaWYgd2UgYXJlIHN5bmNocm9ub3VzKSB3cml0ZXMgdGhlbSB0byBkaXNrLgorICoJSW4gb3RoZXIgd29yZHMsIGl0IHByZXBhcmVzIGEgYnJhbmNoIHRoYXQgY2FuIGJlIHNwbGljZWQgb250byB0aGUKKyAqCWlub2RlLiBJdCBzdG9yZXMgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoYXQgY2hhaW4gaW4gdGhlIGJyYW5jaFtdLCBpbgorICoJdGhlIHNhbWUgZm9ybWF0IGFzIGV4dDJfZ2V0X2JyYW5jaCgpIHdvdWxkIGRvLiBXZSBhcmUgY2FsbGluZyBpdCBhZnRlcgorICoJd2UgaGFkIHJlYWQgdGhlIGV4aXN0aW5nIHBhcnQgb2YgY2hhaW4gYW5kIHBhcnRpYWwgcG9pbnRzIHRvIHRoZSBsYXN0CisgKgl0cmlwbGUgb2YgdGhhdCAob25lIHdpdGggemVybyAtPmtleSkuIFVwb24gdGhlIGV4aXQgd2UgaGF2ZSB0aGUgc2FtZQorICoJcGljdHVyZSBhcyBhZnRlciB0aGUgc3VjY2Vzc2Z1bCBleHQyX2dldF9ibG9jaygpLCBleGNwZXQgdGhhdCBpbiBvbmUKKyAqCXBsYWNlIGNoYWluIGlzIGRpc2Nvbm5lY3RlZCAtICpicmFuY2gtPnAgaXMgc3RpbGwgemVybyAod2UgZGlkIG5vdAorICoJc2V0IHRoZSBsYXN0IGxpbmspLCBidXQgYnJhbmNoLT5rZXkgY29udGFpbnMgdGhlIG51bWJlciB0aGF0IHNob3VsZAorICoJYmUgcGxhY2VkIGludG8gKmJyYW5jaC0+cCB0byBmaWxsIHRoYXQgZ2FwLgorICoKKyAqCUlmIGFsbG9jYXRpb24gZmFpbHMgd2UgZnJlZSBhbGwgYmxvY2tzIHdlJ3ZlIGFsbG9jYXRlZCAoYW5kIGZvcmdldAorICoJdGhlaXIgYnVmZmVyX2hlYWRzKSBhbmQgcmV0dXJuIHRoZSBlcnJvciB2YWx1ZSB0aGUgZnJvbSBmYWlsZWQKKyAqCWV4dDJfYWxsb2NfYmxvY2soKSAobm9ybWFsbHkgLUVOT1NQQykuIE90aGVyd2lzZSB3ZSBzZXQgdGhlIGNoYWluCisgKglhcyBkZXNjcmliZWQgYWJvdmUgYW5kIHJldHVybiAwLgorICovCisKK3N0YXRpYyBpbnQgZXh0Ml9hbGxvY19icmFuY2goc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgaW50IG51bSwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBnb2FsLAorCQkJICAgICBpbnQgKm9mZnNldHMsCisJCQkgICAgIEluZGlyZWN0ICpicmFuY2gpCit7CisJaW50IGJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwlpbnQgbiA9IDA7CisJaW50IGVycjsKKwlpbnQgaTsKKwlpbnQgcGFyZW50ID0gZXh0Ml9hbGxvY19ibG9jayhpbm9kZSwgZ29hbCwgJmVycik7CisKKwlicmFuY2hbMF0ua2V5ID0gY3B1X3RvX2xlMzIocGFyZW50KTsKKwlpZiAocGFyZW50KSBmb3IgKG4gPSAxOyBuIDwgbnVtOyBuKyspIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwkJLyogQWxsb2NhdGUgdGhlIG5leHQgYmxvY2sgKi8KKwkJaW50IG5yID0gZXh0Ml9hbGxvY19ibG9jayhpbm9kZSwgcGFyZW50LCAmZXJyKTsKKwkJaWYgKCFucikKKwkJCWJyZWFrOworCQlicmFuY2hbbl0ua2V5ID0gY3B1X3RvX2xlMzIobnIpOworCQkvKgorCQkgKiBHZXQgYnVmZmVyX2hlYWQgZm9yIHBhcmVudCBibG9jaywgemVybyBpdCBvdXQgYW5kIHNldCAKKwkJICogdGhlIHBvaW50ZXIgdG8gbmV3IG9uZSwgdGhlbiBzZW5kIHBhcmVudCB0byBkaXNrLgorCQkgKi8KKwkJYmggPSBzYl9nZXRibGsoaW5vZGUtPmlfc2IsIHBhcmVudCk7CisJCWxvY2tfYnVmZmVyKGJoKTsKKwkJbWVtc2V0KGJoLT5iX2RhdGEsIDAsIGJsb2Nrc2l6ZSk7CisJCWJyYW5jaFtuXS5iaCA9IGJoOworCQlicmFuY2hbbl0ucCA9IChfX2xlMzIgKikgYmgtPmJfZGF0YSArIG9mZnNldHNbbl07CisJCSpicmFuY2hbbl0ucCA9IGJyYW5jaFtuXS5rZXk7CisJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJbWFya19idWZmZXJfZGlydHlfaW5vZGUoYmgsIGlub2RlKTsKKwkJLyogV2UgdXNlZCB0byBzeW5jIGJoIGhlcmUgaWYgSVNfU1lOQyhpbm9kZSkuCisJCSAqIEJ1dCB3ZSBub3cgcmVseSB1cG9uIGdlbmVyaWNfb3N5bmNfaW5vZGUoKQorCQkgKiBhbmQgYl9pbm9kZV9idWZmZXJzLiAgQnV0IG5vdCBmb3IgZGlyZWN0b3JpZXMuCisJCSAqLworCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSAmJiBJU19ESVJTWU5DKGlub2RlKSkKKwkJCXN5bmNfZGlydHlfYnVmZmVyKGJoKTsKKwkJcGFyZW50ID0gbnI7CisJfQorCWlmIChuID09IG51bSkKKwkJcmV0dXJuIDA7CisKKwkvKiBBbGxvY2F0aW9uIGZhaWxlZCwgZnJlZSB3aGF0IHdlIGFscmVhZHkgYWxsb2NhdGVkICovCisJZm9yIChpID0gMTsgaSA8IG47IGkrKykKKwkJYmZvcmdldChicmFuY2hbaV0uYmgpOworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCWV4dDJfZnJlZV9ibG9ja3MoaW5vZGUsIGxlMzJfdG9fY3B1KGJyYW5jaFtpXS5rZXkpLCAxKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqCWV4dDJfc3BsaWNlX2JyYW5jaCAtIHNwbGljZSB0aGUgYWxsb2NhdGVkIGJyYW5jaCBvbnRvIGlub2RlLgorICoJQGlub2RlOiBvd25lcgorICoJQGJsb2NrOiAobG9naWNhbCkgbnVtYmVyIG9mIGJsb2NrIHdlIGFyZSBhZGRpbmcKKyAqCUBjaGFpbjogY2hhaW4gb2YgaW5kaXJlY3QgYmxvY2tzICh3aXRoIGEgbWlzc2luZyBsaW5rIC0gc2VlCisgKgkJZXh0Ml9hbGxvY19icmFuY2gpCisgKglAd2hlcmU6IGxvY2F0aW9uIG9mIG1pc3NpbmcgbGluaworICoJQG51bTogICBudW1iZXIgb2YgYmxvY2tzIHdlIGFyZSBhZGRpbmcKKyAqCisgKglUaGlzIGZ1bmN0aW9uIHZlcmlmaWVzIHRoYXQgY2hhaW4gKHVwIHRvIHRoZSBtaXNzaW5nIGxpbmspIGhhZCBub3QKKyAqCWNoYW5nZWQsIGZpbGxzIHRoZSBtaXNzaW5nIGxpbmsgYW5kIGRvZXMgYWxsIGhvdXNla2VlcGluZyBuZWVkZWQgaW4KKyAqCWlub2RlICgtPmlfYmxvY2tzLCBldGMuKS4gSW4gY2FzZSBvZiBzdWNjZXNzIHdlIGVuZCB1cCB3aXRoIHRoZSBmdWxsCisgKgljaGFpbiB0byBuZXcgYmxvY2sgYW5kIHJldHVybiAwLiBPdGhlcndpc2UgKD09IGNoYWluIGhhZCBiZWVuIGNoYW5nZWQpCisgKgl3ZSBmcmVlIHRoZSBuZXcgYmxvY2tzIChmb3JnZXR0aW5nIHRoZWlyIGJ1ZmZlcl9oZWFkcywgaW5kZWVkKSBhbmQKKyAqCXJldHVybiAtRUFHQUlOLgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGV4dDJfc3BsaWNlX2JyYW5jaChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICAgbG9uZyBibG9jaywKKwkJCQkgICAgIEluZGlyZWN0IGNoYWluWzRdLAorCQkJCSAgICAgSW5kaXJlY3QgKndoZXJlLAorCQkJCSAgICAgaW50IG51bSkKK3sKKwlzdHJ1Y3QgZXh0Ml9pbm9kZV9pbmZvICplaSA9IEVYVDJfSShpbm9kZSk7CisJaW50IGk7CisKKwkvKiBWZXJpZnkgdGhhdCBwbGFjZSB3ZSBhcmUgc3BsaWNpbmcgdG8gaXMgc3RpbGwgdGhlcmUgYW5kIHZhY2FudCAqLworCisJd3JpdGVfbG9jaygmZWktPmlfbWV0YV9sb2NrKTsKKwlpZiAoIXZlcmlmeV9jaGFpbihjaGFpbiwgd2hlcmUtMSkgfHwgKndoZXJlLT5wKQorCQlnb3RvIGNoYW5nZWQ7CisKKwkvKiBUaGF0J3MgaXQgKi8KKworCSp3aGVyZS0+cCA9IHdoZXJlLT5rZXk7CisJZWktPmlfbmV4dF9hbGxvY19ibG9jayA9IGJsb2NrOworCWVpLT5pX25leHRfYWxsb2NfZ29hbCA9IGxlMzJfdG9fY3B1KHdoZXJlW251bS0xXS5rZXkpOworCisJd3JpdGVfdW5sb2NrKCZlaS0+aV9tZXRhX2xvY2spOworCisJLyogV2UgYXJlIGRvbmUgd2l0aCBhdG9taWMgc3R1ZmYsIG5vdyBkbyB0aGUgcmVzdCBvZiBob3VzZWtlZXBpbmcgKi8KKworCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKworCS8qIGhhZCB3ZSBzcGxpY2VkIGl0IG9udG8gaW5kaXJlY3QgYmxvY2s/ICovCisJaWYgKHdoZXJlLT5iaCkKKwkJbWFya19idWZmZXJfZGlydHlfaW5vZGUod2hlcmUtPmJoLCBpbm9kZSk7CisKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwlyZXR1cm4gMDsKKworY2hhbmdlZDoKKwl3cml0ZV91bmxvY2soJmVpLT5pX21ldGFfbG9jayk7CisJZm9yIChpID0gMTsgaSA8IG51bTsgaSsrKQorCQliZm9yZ2V0KHdoZXJlW2ldLmJoKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCisJCWV4dDJfZnJlZV9ibG9ja3MoaW5vZGUsIGxlMzJfdG9fY3B1KHdoZXJlW2ldLmtleSksIDEpOworCXJldHVybiAtRUFHQUlOOworfQorCisvKgorICogQWxsb2NhdGlvbiBzdHJhdGVneSBpcyBzaW1wbGU6IGlmIHdlIGhhdmUgdG8gYWxsb2NhdGUgc29tZXRoaW5nLCB3ZSB3aWxsCisgKiBoYXZlIHRvIGdvIHRoZSB3aG9sZSB3YXkgdG8gbGVhZi4gU28gbGV0J3MgZG8gaXQgYmVmb3JlIGF0dGFjaGluZyBhbnl0aGluZworICogdG8gdHJlZSwgc2V0IGxpbmthZ2UgYmV0d2VlbiB0aGUgbmV3Ym9ybiBibG9ja3MsIHdyaXRlIHRoZW0gaWYgc3luYyBpcworICogcmVxdWlyZWQsIHJlY2hlY2sgdGhlIHBhdGgsIGZyZWUgYW5kIHJlcGVhdCBpZiBjaGVjayBmYWlscywgb3RoZXJ3aXNlCisgKiBzZXQgdGhlIGxhc3QgbWlzc2luZyBsaW5rICh0aGF0IHdpbGwgcHJvdGVjdCB1cyBmcm9tIGFueSB0cnVuY2F0ZS1nZW5lcmF0ZWQKKyAqIHJlbW92YWxzIC0gYWxsIGJsb2NrcyBvbiB0aGUgcGF0aCBhcmUgaW1tdW5lIG5vdykgYW5kIHBvc3NpYmx5IGZvcmNlIHRoZQorICogd3JpdGUgb24gdGhlIHBhcmVudCBibG9jay4KKyAqIFRoYXQgaGFzIGEgbmljZSBhZGRpdGlvbmFsIHByb3BlcnR5OiBubyBzcGVjaWFsIHJlY292ZXJ5IGZyb20gdGhlIGZhaWxlZAorICogYWxsb2NhdGlvbnMgaXMgbmVlZGVkIC0gd2Ugc2ltcGx5IHJlbGVhc2UgYmxvY2tzIGFuZCBkbyBub3QgdG91Y2ggYW55dGhpbmcKKyAqIHJlYWNoYWJsZSBmcm9tIGlub2RlLgorICovCisKK2ludCBleHQyX2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBpYmxvY2ssIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LCBpbnQgY3JlYXRlKQoreworCWludCBlcnIgPSAtRUlPOworCWludCBvZmZzZXRzWzRdOworCUluZGlyZWN0IGNoYWluWzRdOworCUluZGlyZWN0ICpwYXJ0aWFsOworCXVuc2lnbmVkIGxvbmcgZ29hbDsKKwlpbnQgbGVmdDsKKwlpbnQgYm91bmRhcnkgPSAwOworCWludCBkZXB0aCA9IGV4dDJfYmxvY2tfdG9fcGF0aChpbm9kZSwgaWJsb2NrLCBvZmZzZXRzLCAmYm91bmRhcnkpOworCisJaWYgKGRlcHRoID09IDApCisJCWdvdG8gb3V0OworCityZXJlYWQ6CisJcGFydGlhbCA9IGV4dDJfZ2V0X2JyYW5jaChpbm9kZSwgZGVwdGgsIG9mZnNldHMsIGNoYWluLCAmZXJyKTsKKworCS8qIFNpbXBsZXN0IGNhc2UgLSBibG9jayBmb3VuZCwgbm8gYWxsb2NhdGlvbiBuZWVkZWQgKi8KKwlpZiAoIXBhcnRpYWwpIHsKK2dvdF9pdDoKKwkJbWFwX2JoKGJoX3Jlc3VsdCwgaW5vZGUtPmlfc2IsIGxlMzJfdG9fY3B1KGNoYWluW2RlcHRoLTFdLmtleSkpOworCQlpZiAoYm91bmRhcnkpCisJCQlzZXRfYnVmZmVyX2JvdW5kYXJ5KGJoX3Jlc3VsdCk7CisJCS8qIENsZWFuIHVwIGFuZCBleGl0ICovCisJCXBhcnRpYWwgPSBjaGFpbitkZXB0aC0xOyAvKiB0aGUgd2hvbGUgY2hhaW4gKi8KKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIE5leHQgc2ltcGxlIGNhc2UgLSBwbGFpbiBsb29rdXAgb3IgZmFpbGVkIHJlYWQgb2YgaW5kaXJlY3QgYmxvY2sgKi8KKwlpZiAoIWNyZWF0ZSB8fCBlcnIgPT0gLUVJTykgeworY2xlYW51cDoKKwkJd2hpbGUgKHBhcnRpYWwgPiBjaGFpbikgeworCQkJYnJlbHNlKHBhcnRpYWwtPmJoKTsKKwkJCXBhcnRpYWwtLTsKKwkJfQorb3V0OgorCQlyZXR1cm4gZXJyOworCX0KKworCS8qCisJICogSW5kaXJlY3QgYmxvY2sgbWlnaHQgYmUgcmVtb3ZlZCBieSB0cnVuY2F0ZSB3aGlsZSB3ZSB3ZXJlCisJICogcmVhZGluZyBpdC4gSGFuZGxpbmcgb2YgdGhhdCBjYXNlIChmb3JnZXQgd2hhdCB3ZSd2ZSBnb3QgYW5kCisJICogcmVyZWFkKSBpcyB0YWtlbiBvdXQgb2YgdGhlIG1haW4gcGF0aC4KKwkgKi8KKwlpZiAoZXJyID09IC1FQUdBSU4pCisJCWdvdG8gY2hhbmdlZDsKKworCWdvYWwgPSAwOworCWlmIChleHQyX2ZpbmRfZ29hbChpbm9kZSwgaWJsb2NrLCBjaGFpbiwgcGFydGlhbCwgJmdvYWwpIDwgMCkKKwkJZ290byBjaGFuZ2VkOworCisJbGVmdCA9IChjaGFpbiArIGRlcHRoKSAtIHBhcnRpYWw7CisJZXJyID0gZXh0Ml9hbGxvY19icmFuY2goaW5vZGUsIGxlZnQsIGdvYWwsCisJCQkJCW9mZnNldHMrKHBhcnRpYWwtY2hhaW4pLCBwYXJ0aWFsKTsKKwlpZiAoZXJyKQorCQlnb3RvIGNsZWFudXA7CisKKwlpZiAoZXh0Ml9zcGxpY2VfYnJhbmNoKGlub2RlLCBpYmxvY2ssIGNoYWluLCBwYXJ0aWFsLCBsZWZ0KSA8IDApCisJCWdvdG8gY2hhbmdlZDsKKworCXNldF9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7CisJZ290byBnb3RfaXQ7CisKK2NoYW5nZWQ6CisJd2hpbGUgKHBhcnRpYWwgPiBjaGFpbikgeworCQlicmVsc2UocGFydGlhbC0+YmgpOworCQlwYXJ0aWFsLS07CisJfQorCWdvdG8gcmVyZWFkOworfQorCitzdGF0aWMgaW50IGV4dDJfd3JpdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlyZXR1cm4gYmxvY2tfd3JpdGVfZnVsbF9wYWdlKHBhZ2UsIGV4dDJfZ2V0X2Jsb2NrLCB3YmMpOworfQorCitzdGF0aWMgaW50IGV4dDJfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiBtcGFnZV9yZWFkcGFnZShwYWdlLCBleHQyX2dldF9ibG9jayk7Cit9CisKK3N0YXRpYyBpbnQKK2V4dDJfcmVhZHBhZ2VzKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJc3RydWN0IGxpc3RfaGVhZCAqcGFnZXMsIHVuc2lnbmVkIG5yX3BhZ2VzKQoreworCXJldHVybiBtcGFnZV9yZWFkcGFnZXMobWFwcGluZywgcGFnZXMsIG5yX3BhZ2VzLCBleHQyX2dldF9ibG9jayk7Cit9CisKK3N0YXRpYyBpbnQKK2V4dDJfcHJlcGFyZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQl1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKwlyZXR1cm4gYmxvY2tfcHJlcGFyZV93cml0ZShwYWdlLGZyb20sdG8sZXh0Ml9nZXRfYmxvY2spOworfQorCitzdGF0aWMgaW50CitleHQyX25vYmhfcHJlcGFyZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQl1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKwlyZXR1cm4gbm9iaF9wcmVwYXJlX3dyaXRlKHBhZ2UsZnJvbSx0byxleHQyX2dldF9ibG9jayk7Cit9CisKK3N0YXRpYyBpbnQgZXh0Ml9ub2JoX3dyaXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCXJldHVybiBub2JoX3dyaXRlcGFnZShwYWdlLCBleHQyX2dldF9ibG9jaywgd2JjKTsKK30KKworc3RhdGljIHNlY3Rvcl90IGV4dDJfYm1hcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc2VjdG9yX3QgYmxvY2spCit7CisJcmV0dXJuIGdlbmVyaWNfYmxvY2tfYm1hcChtYXBwaW5nLGJsb2NrLGV4dDJfZ2V0X2Jsb2NrKTsKK30KKworc3RhdGljIGludAorZXh0Ml9nZXRfYmxvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGlibG9jaywgdW5zaWduZWQgbG9uZyBtYXhfYmxvY2tzLAorCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpCit7CisJaW50IHJldDsKKworCXJldCA9IGV4dDJfZ2V0X2Jsb2NrKGlub2RlLCBpYmxvY2ssIGJoX3Jlc3VsdCwgY3JlYXRlKTsKKwlpZiAocmV0ID09IDApCisJCWJoX3Jlc3VsdC0+Yl9zaXplID0gKDEgPDwgaW5vZGUtPmlfYmxrYml0cyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QKK2V4dDJfZGlyZWN0X0lPKGludCBydywgc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKKwkJCWxvZmZfdCBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgbnJfc2VncykKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKKworCXJldHVybiBibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLCBpbm9kZS0+aV9zYi0+c19iZGV2LCBpb3YsCisJCQkJb2Zmc2V0LCBucl9zZWdzLCBleHQyX2dldF9ibG9ja3MsIE5VTEwpOworfQorCitzdGF0aWMgaW50CitleHQyX3dyaXRlcGFnZXMoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCXJldHVybiBtcGFnZV93cml0ZXBhZ2VzKG1hcHBpbmcsIHdiYywgZXh0Ml9nZXRfYmxvY2spOworfQorCitzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGV4dDJfYW9wcyA9IHsKKwkucmVhZHBhZ2UJCT0gZXh0Ml9yZWFkcGFnZSwKKwkucmVhZHBhZ2VzCQk9IGV4dDJfcmVhZHBhZ2VzLAorCS53cml0ZXBhZ2UJCT0gZXh0Ml93cml0ZXBhZ2UsCisJLnN5bmNfcGFnZQkJPSBibG9ja19zeW5jX3BhZ2UsCisJLnByZXBhcmVfd3JpdGUJCT0gZXh0Ml9wcmVwYXJlX3dyaXRlLAorCS5jb21taXRfd3JpdGUJCT0gZ2VuZXJpY19jb21taXRfd3JpdGUsCisJLmJtYXAJCQk9IGV4dDJfYm1hcCwKKwkuZGlyZWN0X0lPCQk9IGV4dDJfZGlyZWN0X0lPLAorCS53cml0ZXBhZ2VzCQk9IGV4dDJfd3JpdGVwYWdlcywKK307CisKK3N0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgZXh0Ml9ub2JoX2FvcHMgPSB7CisJLnJlYWRwYWdlCQk9IGV4dDJfcmVhZHBhZ2UsCisJLnJlYWRwYWdlcwkJPSBleHQyX3JlYWRwYWdlcywKKwkud3JpdGVwYWdlCQk9IGV4dDJfbm9iaF93cml0ZXBhZ2UsCisJLnN5bmNfcGFnZQkJPSBibG9ja19zeW5jX3BhZ2UsCisJLnByZXBhcmVfd3JpdGUJCT0gZXh0Ml9ub2JoX3ByZXBhcmVfd3JpdGUsCisJLmNvbW1pdF93cml0ZQkJPSBub2JoX2NvbW1pdF93cml0ZSwKKwkuYm1hcAkJCT0gZXh0Ml9ibWFwLAorCS5kaXJlY3RfSU8JCT0gZXh0Ml9kaXJlY3RfSU8sCisJLndyaXRlcGFnZXMJCT0gZXh0Ml93cml0ZXBhZ2VzLAorfTsKKworLyoKKyAqIFByb2JhYmx5IGl0IHNob3VsZCBiZSBhIGxpYnJhcnkgZnVuY3Rpb24uLi4gc2VhcmNoIGZvciBmaXJzdCBub24temVybyB3b3JkCisgKiBvciBtZW1jbXAgd2l0aCB6ZXJvX3BhZ2UsIHdoYXRldmVyIGlzIGJldHRlciBmb3IgcGFydGljdWxhciBhcmNoaXRlY3R1cmUuCisgKiBMaW51cz8KKyAqLworc3RhdGljIGlubGluZSBpbnQgYWxsX3plcm9lcyhfX2xlMzIgKnAsIF9fbGUzMiAqcSkKK3sKKwl3aGlsZSAocCA8IHEpCisJCWlmICgqcCsrKQorCQkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICoJZXh0Ml9maW5kX3NoYXJlZCAtIGZpbmQgdGhlIGluZGlyZWN0IGJsb2NrcyBmb3IgcGFydGlhbCB0cnVuY2F0aW9uLgorICoJQGlub2RlOgkgIGlub2RlIGluIHF1ZXN0aW9uCisgKglAZGVwdGg6CSAgZGVwdGggb2YgdGhlIGFmZmVjdGVkIGJyYW5jaAorICoJQG9mZnNldHM6IG9mZnNldHMgb2YgcG9pbnRlcnMgaW4gdGhhdCBicmFuY2ggKHNlZSBleHQyX2Jsb2NrX3RvX3BhdGgpCisgKglAY2hhaW46CSAgcGxhY2UgdG8gc3RvcmUgdGhlIHBvaW50ZXJzIHRvIHBhcnRpYWwgaW5kaXJlY3QgYmxvY2tzCisgKglAdG9wOgkgIHBsYWNlIHRvIHRoZSAoZGV0YWNoZWQpIHRvcCBvZiBicmFuY2gKKyAqCisgKglUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIHVzZWQgYnkgZXh0Ml90cnVuY2F0ZSgpLgorICoKKyAqCVdoZW4gd2UgZG8gdHJ1bmNhdGUoKSB3ZSBtYXkgaGF2ZSB0byBjbGVhbiB0aGUgZW5kcyBvZiBzZXZlcmFsIGluZGlyZWN0CisgKglibG9ja3MgYnV0IGxlYXZlIHRoZSBibG9ja3MgdGhlbXNlbHZlcyBhbGl2ZS4gQmxvY2sgaXMgcGFydGlhbGx5CisgKgl0cnVuY2F0ZWQgaWYgc29tZSBkYXRhIGJlbG93IHRoZSBuZXcgaV9zaXplIGlzIHJlZmVyZWQgZnJvbSBpdCAoYW5kCisgKglpdCBpcyBvbiB0aGUgcGF0aCB0byB0aGUgZmlyc3QgY29tcGxldGVseSB0cnVuY2F0ZWQgZGF0YSBibG9jaywgaW5kZWVkKS4KKyAqCVdlIGhhdmUgdG8gZnJlZSB0aGUgdG9wIG9mIHRoYXQgcGF0aCBhbG9uZyB3aXRoIGV2ZXJ5dGhpbmcgdG8gdGhlIHJpZ2h0CisgKglvZiB0aGUgcGF0aC4gU2luY2Ugbm8gYWxsb2NhdGlvbiBwYXN0IHRoZSB0cnVuY2F0aW9uIHBvaW50IGlzIHBvc3NpYmxlCisgKgl1bnRpbCBleHQyX3RydW5jYXRlKCkgZmluaXNoZXMsIHdlIG1heSBzYWZlbHkgZG8gdGhlIGxhdHRlciwgYnV0IHRvcAorICoJb2YgYnJhbmNoIG1heSByZXF1aXJlIHNwZWNpYWwgYXR0ZW50aW9uIC0gcGFnZW91dCBiZWxvdyB0aGUgdHJ1bmNhdGlvbgorICoJcG9pbnQgbWlnaHQgdHJ5IHRvIHBvcHVsYXRlIGl0LgorICoKKyAqCVdlIGF0b21pY2FsbHkgZGV0YWNoIHRoZSB0b3Agb2YgYnJhbmNoIGZyb20gdGhlIHRyZWUsIHN0b3JlIHRoZSBibG9jaworICoJbnVtYmVyIG9mIGl0cyByb290IGluICpAdG9wLCBwb2ludGVycyB0byBidWZmZXJfaGVhZHMgb2YgcGFydGlhbGx5CisgKgl0cnVuY2F0ZWQgYmxvY2tzIC0gaW4gQGNoYWluW10uYmggYW5kIHBvaW50ZXJzIHRvIHRoZWlyIGxhc3QgZWxlbWVudHMKKyAqCXRoYXQgc2hvdWxkIG5vdCBiZSByZW1vdmVkIC0gaW4gQGNoYWluW10ucC4gUmV0dXJuIHZhbHVlIGlzIHRoZSBwb2ludGVyCisgKgl0byBsYXN0IGZpbGxlZCBlbGVtZW50IG9mIEBjaGFpbi4KKyAqCisgKglUaGUgd29yayBsZWZ0IHRvIGNhbGxlciB0byBkbyB0aGUgYWN0dWFsIGZyZWVpbmcgb2Ygc3VidHJlZXM6CisgKgkJYSkgZnJlZSB0aGUgc3VidHJlZSBzdGFydGluZyBmcm9tICpAdG9wCisgKgkJYikgZnJlZSB0aGUgc3VidHJlZXMgd2hvc2Ugcm9vdHMgYXJlIHN0b3JlZCBpbgorICoJCQkoQGNoYWluW2ldLnArMSAuLiBlbmQgb2YgQGNoYWluW2ldLmJoLT5iX2RhdGEpCisgKgkJYykgZnJlZSB0aGUgc3VidHJlZXMgZ3Jvd2luZyBmcm9tIHRoZSBpbm9kZSBwYXN0IHRoZSBAY2hhaW5bMF0ucAorICoJCQkobm8gcGFydGlhbGx5IHRydW5jYXRlZCBzdHVmZiB0aGVyZSkuCisgKi8KKworc3RhdGljIEluZGlyZWN0ICpleHQyX2ZpbmRfc2hhcmVkKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJaW50IGRlcHRoLAorCQkJCWludCBvZmZzZXRzWzRdLAorCQkJCUluZGlyZWN0IGNoYWluWzRdLAorCQkJCV9fbGUzMiAqdG9wKQoreworCUluZGlyZWN0ICpwYXJ0aWFsLCAqcDsKKwlpbnQgaywgZXJyOworCisJKnRvcCA9IDA7CisJZm9yIChrID0gZGVwdGg7IGsgPiAxICYmICFvZmZzZXRzW2stMV07IGstLSkKKwkJOworCXBhcnRpYWwgPSBleHQyX2dldF9icmFuY2goaW5vZGUsIGssIG9mZnNldHMsIGNoYWluLCAmZXJyKTsKKwlpZiAoIXBhcnRpYWwpCisJCXBhcnRpYWwgPSBjaGFpbiArIGstMTsKKwkvKgorCSAqIElmIHRoZSBicmFuY2ggYWNxdWlyZWQgY29udGludWF0aW9uIHNpbmNlIHdlJ3ZlIGxvb2tlZCBhdCBpdCAtCisJICogZmluZSwgaXQgc2hvdWxkIGFsbCBzdXJ2aXZlIGFuZCAobmV3KSB0b3AgZG9lc24ndCBiZWxvbmcgdG8gdXMuCisJICovCisJd3JpdGVfbG9jaygmRVhUMl9JKGlub2RlKS0+aV9tZXRhX2xvY2spOworCWlmICghcGFydGlhbC0+a2V5ICYmICpwYXJ0aWFsLT5wKSB7CisJCXdyaXRlX3VubG9jaygmRVhUMl9JKGlub2RlKS0+aV9tZXRhX2xvY2spOworCQlnb3RvIG5vX3RvcDsKKwl9CisJZm9yIChwPXBhcnRpYWw7IHA+Y2hhaW4gJiYgYWxsX3plcm9lcygoX19sZTMyKilwLT5iaC0+Yl9kYXRhLHAtPnApOyBwLS0pCisJCTsKKwkvKgorCSAqIE9LLCB3ZSd2ZSBmb3VuZCB0aGUgbGFzdCBibG9jayB0aGF0IG11c3Qgc3Vydml2ZS4gVGhlIHJlc3Qgb2Ygb3VyCisJICogYnJhbmNoIHNob3VsZCBiZSBkZXRhY2hlZCBiZWZvcmUgdW5sb2NraW5nLiBIb3dldmVyLCBpZiB0aGF0IHJlc3QKKwkgKiBvZiBicmFuY2ggaXMgYWxsIG91cnMgYW5kIGRvZXMgbm90IGdyb3cgaW1tZWRpYXRlbHkgZnJvbSB0aGUgaW5vZGUKKwkgKiBpdCdzIGVhc2llciB0byBjaGVhdCBhbmQganVzdCBkZWNyZW1lbnQgcGFydGlhbC0+cC4KKwkgKi8KKwlpZiAocCA9PSBjaGFpbiArIGsgLSAxICYmIHAgPiBjaGFpbikgeworCQlwLT5wLS07CisJfSBlbHNlIHsKKwkJKnRvcCA9ICpwLT5wOworCQkqcC0+cCA9IDA7CisJfQorCXdyaXRlX3VubG9jaygmRVhUMl9JKGlub2RlKS0+aV9tZXRhX2xvY2spOworCisJd2hpbGUocGFydGlhbCA+IHApCisJeworCQlicmVsc2UocGFydGlhbC0+YmgpOworCQlwYXJ0aWFsLS07CisJfQorbm9fdG9wOgorCXJldHVybiBwYXJ0aWFsOworfQorCisvKioKKyAqCWV4dDJfZnJlZV9kYXRhIC0gZnJlZSBhIGxpc3Qgb2YgZGF0YSBibG9ja3MKKyAqCUBpbm9kZToJaW5vZGUgd2UgYXJlIGRlYWxpbmcgd2l0aAorICoJQHA6CWFycmF5IG9mIGJsb2NrIG51bWJlcnMKKyAqCUBxOglwb2ludHMgaW1tZWRpYXRlbHkgcGFzdCB0aGUgZW5kIG9mIGFycmF5CisgKgorICoJV2UgYXJlIGZyZWVpbmcgYWxsIGJsb2NrcyByZWZlcmVkIGZyb20gdGhhdCBhcnJheSAobnVtYmVycyBhcmUKKyAqCXN0b3JlZCBhcyBsaXR0bGUtZW5kaWFuIDMyLWJpdCkgYW5kIHVwZGF0aW5nIEBpbm9kZS0+aV9ibG9ja3MKKyAqCWFwcHJvcHJpYXRlbHkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBleHQyX2ZyZWVfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBfX2xlMzIgKnAsIF9fbGUzMiAqcSkKK3sKKwl1bnNpZ25lZCBsb25nIGJsb2NrX3RvX2ZyZWUgPSAwLCBjb3VudCA9IDA7CisJdW5zaWduZWQgbG9uZyBucjsKKworCWZvciAoIDsgcCA8IHEgOyBwKyspIHsKKwkJbnIgPSBsZTMyX3RvX2NwdSgqcCk7CisJCWlmIChucikgeworCQkJKnAgPSAwOworCQkJLyogYWNjdW11bGF0ZSBibG9ja3MgdG8gZnJlZSBpZiB0aGV5J3JlIGNvbnRpZ3VvdXMgKi8KKwkJCWlmIChjb3VudCA9PSAwKQorCQkJCWdvdG8gZnJlZV90aGlzOworCQkJZWxzZSBpZiAoYmxvY2tfdG9fZnJlZSA9PSBuciAtIGNvdW50KQorCQkJCWNvdW50Kys7CisJCQllbHNlIHsKKwkJCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJCQlleHQyX2ZyZWVfYmxvY2tzIChpbm9kZSwgYmxvY2tfdG9fZnJlZSwgY291bnQpOworCQkJZnJlZV90aGlzOgorCQkJCWJsb2NrX3RvX2ZyZWUgPSBucjsKKwkJCQljb3VudCA9IDE7CisJCQl9CisJCX0KKwl9CisJaWYgKGNvdW50ID4gMCkgeworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJZXh0Ml9mcmVlX2Jsb2NrcyAoaW5vZGUsIGJsb2NrX3RvX2ZyZWUsIGNvdW50KTsKKwl9Cit9CisKKy8qKgorICoJZXh0Ml9mcmVlX2JyYW5jaGVzIC0gZnJlZSBhbiBhcnJheSBvZiBicmFuY2hlcworICoJQGlub2RlOglpbm9kZSB3ZSBhcmUgZGVhbGluZyB3aXRoCisgKglAcDoJYXJyYXkgb2YgYmxvY2sgbnVtYmVycworICoJQHE6CXBvaW50ZXIgaW1tZWRpYXRlbHkgcGFzdCB0aGUgZW5kIG9mIGFycmF5CisgKglAZGVwdGg6CWRlcHRoIG9mIHRoZSBicmFuY2hlcyB0byBmcmVlCisgKgorICoJV2UgYXJlIGZyZWVpbmcgYWxsIGJsb2NrcyByZWZlcmVkIGZyb20gdGhlc2UgYnJhbmNoZXMgKG51bWJlcnMgYXJlCisgKglzdG9yZWQgYXMgbGl0dGxlLWVuZGlhbiAzMi1iaXQpIGFuZCB1cGRhdGluZyBAaW5vZGUtPmlfYmxvY2tzCisgKglhcHByb3ByaWF0ZWx5LgorICovCitzdGF0aWMgdm9pZCBleHQyX2ZyZWVfYnJhbmNoZXMoc3RydWN0IGlub2RlICppbm9kZSwgX19sZTMyICpwLCBfX2xlMzIgKnEsIGludCBkZXB0aCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwl1bnNpZ25lZCBsb25nIG5yOworCisJaWYgKGRlcHRoLS0pIHsKKwkJaW50IGFkZHJfcGVyX2Jsb2NrID0gRVhUMl9BRERSX1BFUl9CTE9DSyhpbm9kZS0+aV9zYik7CisJCWZvciAoIDsgcCA8IHEgOyBwKyspIHsKKwkJCW5yID0gbGUzMl90b19jcHUoKnApOworCQkJaWYgKCFucikKKwkJCQljb250aW51ZTsKKwkJCSpwID0gMDsKKwkJCWJoID0gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIG5yKTsKKwkJCS8qCisJCQkgKiBBIHJlYWQgZmFpbHVyZT8gUmVwb3J0IGVycm9yIGFuZCBjbGVhciBzbG90CisJCQkgKiAoc2hvdWxkIGJlIHJhcmUpLgorCQkJICovIAorCQkJaWYgKCFiaCkgeworCQkJCWV4dDJfZXJyb3IoaW5vZGUtPmlfc2IsICJleHQyX2ZyZWVfYnJhbmNoZXMiLAorCQkJCQkiUmVhZCBmYWlsdXJlLCBpbm9kZT0lbGQsIGJsb2NrPSVsZCIsCisJCQkJCWlub2RlLT5pX2lubywgbnIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZXh0Ml9mcmVlX2JyYW5jaGVzKGlub2RlLAorCQkJCQkgICAoX19sZTMyKiliaC0+Yl9kYXRhLAorCQkJCQkgICAoX19sZTMyKiliaC0+Yl9kYXRhICsgYWRkcl9wZXJfYmxvY2ssCisJCQkJCSAgIGRlcHRoKTsKKwkJCWJmb3JnZXQoYmgpOworCQkJZXh0Ml9mcmVlX2Jsb2Nrcyhpbm9kZSwgbnIsIDEpOworCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCX0KKwl9IGVsc2UKKwkJZXh0Ml9mcmVlX2RhdGEoaW5vZGUsIHAsIHEpOworfQorCit2b2lkIGV4dDJfdHJ1bmNhdGUgKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCV9fbGUzMiAqaV9kYXRhID0gRVhUMl9JKGlub2RlKS0+aV9kYXRhOworCWludCBhZGRyX3Blcl9ibG9jayA9IEVYVDJfQUREUl9QRVJfQkxPQ0soaW5vZGUtPmlfc2IpOworCWludCBvZmZzZXRzWzRdOworCUluZGlyZWN0IGNoYWluWzRdOworCUluZGlyZWN0ICpwYXJ0aWFsOworCV9fbGUzMiBuciA9IDA7CisJaW50IG47CisJbG9uZyBpYmxvY2s7CisJdW5zaWduZWQgYmxvY2tzaXplOworCisJaWYgKCEoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSB8fCBTX0lTRElSKGlub2RlLT5pX21vZGUpIHx8CisJICAgIFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpKQorCQlyZXR1cm47CisJaWYgKGV4dDJfaW5vZGVfaXNfZmFzdF9zeW1saW5rKGlub2RlKSkKKwkJcmV0dXJuOworCWlmIChJU19BUFBFTkQoaW5vZGUpIHx8IElTX0lNTVVUQUJMRShpbm9kZSkpCisJCXJldHVybjsKKworCWV4dDJfZGlzY2FyZF9wcmVhbGxvYyhpbm9kZSk7CisKKwlibG9ja3NpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisJaWJsb2NrID0gKGlub2RlLT5pX3NpemUgKyBibG9ja3NpemUtMSkKKwkJCQkJPj4gRVhUMl9CTE9DS19TSVpFX0JJVFMoaW5vZGUtPmlfc2IpOworCisJaWYgKHRlc3Rfb3B0KGlub2RlLT5pX3NiLCBOT0JIKSkKKwkJbm9iaF90cnVuY2F0ZV9wYWdlKGlub2RlLT5pX21hcHBpbmcsIGlub2RlLT5pX3NpemUpOworCWVsc2UKKwkJYmxvY2tfdHJ1bmNhdGVfcGFnZShpbm9kZS0+aV9tYXBwaW5nLAorCQkJCWlub2RlLT5pX3NpemUsIGV4dDJfZ2V0X2Jsb2NrKTsKKworCW4gPSBleHQyX2Jsb2NrX3RvX3BhdGgoaW5vZGUsIGlibG9jaywgb2Zmc2V0cywgTlVMTCk7CisJaWYgKG4gPT0gMCkKKwkJcmV0dXJuOworCisJaWYgKG4gPT0gMSkgeworCQlleHQyX2ZyZWVfZGF0YShpbm9kZSwgaV9kYXRhK29mZnNldHNbMF0sCisJCQkJCWlfZGF0YSArIEVYVDJfTkRJUl9CTE9DS1MpOworCQlnb3RvIGRvX2luZGlyZWN0czsKKwl9CisKKwlwYXJ0aWFsID0gZXh0Ml9maW5kX3NoYXJlZChpbm9kZSwgbiwgb2Zmc2V0cywgY2hhaW4sICZucik7CisJLyogS2lsbCB0aGUgdG9wIG9mIHNoYXJlZCBicmFuY2ggKGFscmVhZHkgZGV0YWNoZWQpICovCisJaWYgKG5yKSB7CisJCWlmIChwYXJ0aWFsID09IGNoYWluKQorCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCWVsc2UKKwkJCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKHBhcnRpYWwtPmJoLCBpbm9kZSk7CisJCWV4dDJfZnJlZV9icmFuY2hlcyhpbm9kZSwgJm5yLCAmbnIrMSwgKGNoYWluK24tMSkgLSBwYXJ0aWFsKTsKKwl9CisJLyogQ2xlYXIgdGhlIGVuZHMgb2YgaW5kaXJlY3QgYmxvY2tzIG9uIHRoZSBzaGFyZWQgYnJhbmNoICovCisJd2hpbGUgKHBhcnRpYWwgPiBjaGFpbikgeworCQlleHQyX2ZyZWVfYnJhbmNoZXMoaW5vZGUsCisJCQkJICAgcGFydGlhbC0+cCArIDEsCisJCQkJICAgKF9fbGUzMiopcGFydGlhbC0+YmgtPmJfZGF0YSthZGRyX3Blcl9ibG9jaywKKwkJCQkgICAoY2hhaW4rbi0xKSAtIHBhcnRpYWwpOworCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShwYXJ0aWFsLT5iaCwgaW5vZGUpOworCQlicmVsc2UgKHBhcnRpYWwtPmJoKTsKKwkJcGFydGlhbC0tOworCX0KK2RvX2luZGlyZWN0czoKKwkvKiBLaWxsIHRoZSByZW1haW5pbmcgKHdob2xlKSBzdWJ0cmVlcyAqLworCXN3aXRjaCAob2Zmc2V0c1swXSkgeworCQlkZWZhdWx0OgorCQkJbnIgPSBpX2RhdGFbRVhUMl9JTkRfQkxPQ0tdOworCQkJaWYgKG5yKSB7CisJCQkJaV9kYXRhW0VYVDJfSU5EX0JMT0NLXSA9IDA7CisJCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCQkJZXh0Ml9mcmVlX2JyYW5jaGVzKGlub2RlLCAmbnIsICZucisxLCAxKTsKKwkJCX0KKwkJY2FzZSBFWFQyX0lORF9CTE9DSzoKKwkJCW5yID0gaV9kYXRhW0VYVDJfRElORF9CTE9DS107CisJCQlpZiAobnIpIHsKKwkJCQlpX2RhdGFbRVhUMl9ESU5EX0JMT0NLXSA9IDA7CisJCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCQkJZXh0Ml9mcmVlX2JyYW5jaGVzKGlub2RlLCAmbnIsICZucisxLCAyKTsKKwkJCX0KKwkJY2FzZSBFWFQyX0RJTkRfQkxPQ0s6CisJCQluciA9IGlfZGF0YVtFWFQyX1RJTkRfQkxPQ0tdOworCQkJaWYgKG5yKSB7CisJCQkJaV9kYXRhW0VYVDJfVElORF9CTE9DS10gPSAwOworCQkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQkJCWV4dDJfZnJlZV9icmFuY2hlcyhpbm9kZSwgJm5yLCAmbnIrMSwgMyk7CisJCQl9CisJCWNhc2UgRVhUMl9USU5EX0JMT0NLOgorCQkJOworCX0KKwlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlpZiAoaW5vZGVfbmVlZHNfc3luYyhpbm9kZSkpIHsKKwkJc3luY19tYXBwaW5nX2J1ZmZlcnMoaW5vZGUtPmlfbWFwcGluZyk7CisJCWV4dDJfc3luY19pbm9kZSAoaW5vZGUpOworCX0gZWxzZSB7CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBleHQyX2lub2RlICpleHQyX2dldF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbm9fdCBpbm8sCisJCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqKnApCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJdW5zaWduZWQgbG9uZyBibG9ja19ncm91cDsKKwl1bnNpZ25lZCBsb25nIGJsb2NrOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCXN0cnVjdCBleHQyX2dyb3VwX2Rlc2MgKiBnZHA7CisKKwkqcCA9IE5VTEw7CisJaWYgKChpbm8gIT0gRVhUMl9ST09UX0lOTyAmJiBpbm8gPCBFWFQyX0ZJUlNUX0lOTyhzYikpIHx8CisJICAgIGlubyA+IGxlMzJfdG9fY3B1KEVYVDJfU0Ioc2IpLT5zX2VzLT5zX2lub2Rlc19jb3VudCkpCisJCWdvdG8gRWludmFsOworCisJYmxvY2tfZ3JvdXAgPSAoaW5vIC0gMSkgLyBFWFQyX0lOT0RFU19QRVJfR1JPVVAoc2IpOworCWdkcCA9IGV4dDJfZ2V0X2dyb3VwX2Rlc2Moc2IsIGJsb2NrX2dyb3VwLCAmYmgpOworCWlmICghZ2RwKQorCQlnb3RvIEVnZHA7CisJLyoKKwkgKiBGaWd1cmUgb3V0IHRoZSBvZmZzZXQgd2l0aGluIHRoZSBibG9jayBncm91cCBpbm9kZSB0YWJsZQorCSAqLworCW9mZnNldCA9ICgoaW5vIC0gMSkgJSBFWFQyX0lOT0RFU19QRVJfR1JPVVAoc2IpKSAqIEVYVDJfSU5PREVfU0laRShzYik7CisJYmxvY2sgPSBsZTMyX3RvX2NwdShnZHAtPmJnX2lub2RlX3RhYmxlKSArCisJCShvZmZzZXQgPj4gRVhUMl9CTE9DS19TSVpFX0JJVFMoc2IpKTsKKwlpZiAoIShiaCA9IHNiX2JyZWFkKHNiLCBibG9jaykpKQorCQlnb3RvIEVpbzsKKworCSpwID0gYmg7CisJb2Zmc2V0ICY9IChFWFQyX0JMT0NLX1NJWkUoc2IpIC0gMSk7CisJcmV0dXJuIChzdHJ1Y3QgZXh0Ml9pbm9kZSAqKSAoYmgtPmJfZGF0YSArIG9mZnNldCk7CisKK0VpbnZhbDoKKwlleHQyX2Vycm9yKHNiLCAiZXh0Ml9nZXRfaW5vZGUiLCAiYmFkIGlub2RlIG51bWJlcjogJWx1IiwKKwkJICAgKHVuc2lnbmVkIGxvbmcpIGlubyk7CisJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CitFaW86CisJZXh0Ml9lcnJvcihzYiwgImV4dDJfZ2V0X2lub2RlIiwKKwkJICAgInVuYWJsZSB0byByZWFkIGlub2RlIGJsb2NrIC0gaW5vZGU9JWx1LCBibG9jaz0lbHUiLAorCQkgICAodW5zaWduZWQgbG9uZykgaW5vLCBibG9jayk7CitFZ2RwOgorCXJldHVybiBFUlJfUFRSKC1FSU8pOworfQorCit2b2lkIGV4dDJfc2V0X2lub2RlX2ZsYWdzKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJdW5zaWduZWQgaW50IGZsYWdzID0gRVhUMl9JKGlub2RlKS0+aV9mbGFnczsKKworCWlub2RlLT5pX2ZsYWdzICY9IH4oU19TWU5DfFNfQVBQRU5EfFNfSU1NVVRBQkxFfFNfTk9BVElNRXxTX0RJUlNZTkMpOworCWlmIChmbGFncyAmIEVYVDJfU1lOQ19GTCkKKwkJaW5vZGUtPmlfZmxhZ3MgfD0gU19TWU5DOworCWlmIChmbGFncyAmIEVYVDJfQVBQRU5EX0ZMKQorCQlpbm9kZS0+aV9mbGFncyB8PSBTX0FQUEVORDsKKwlpZiAoZmxhZ3MgJiBFWFQyX0lNTVVUQUJMRV9GTCkKKwkJaW5vZGUtPmlfZmxhZ3MgfD0gU19JTU1VVEFCTEU7CisJaWYgKGZsYWdzICYgRVhUMl9OT0FUSU1FX0ZMKQorCQlpbm9kZS0+aV9mbGFncyB8PSBTX05PQVRJTUU7CisJaWYgKGZsYWdzICYgRVhUMl9ESVJTWU5DX0ZMKQorCQlpbm9kZS0+aV9mbGFncyB8PSBTX0RJUlNZTkM7Cit9CisKK3ZvaWQgZXh0Ml9yZWFkX2lub2RlIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwlzdHJ1Y3QgZXh0Ml9pbm9kZV9pbmZvICplaSA9IEVYVDJfSShpbm9kZSk7CisJaW5vX3QgaW5vID0gaW5vZGUtPmlfaW5vOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXN0cnVjdCBleHQyX2lub2RlICogcmF3X2lub2RlID0gZXh0Ml9nZXRfaW5vZGUoaW5vZGUtPmlfc2IsIGlubywgJmJoKTsKKwlpbnQgbjsKKworI2lmZGVmIENPTkZJR19FWFQyX0ZTX1BPU0lYX0FDTAorCWVpLT5pX2FjbCA9IEVYVDJfQUNMX05PVF9DQUNIRUQ7CisJZWktPmlfZGVmYXVsdF9hY2wgPSBFWFQyX0FDTF9OT1RfQ0FDSEVEOworI2VuZGlmCisJaWYgKElTX0VSUihyYXdfaW5vZGUpKQorIAkJZ290byBiYWRfaW5vZGU7CisKKwlpbm9kZS0+aV9tb2RlID0gbGUxNl90b19jcHUocmF3X2lub2RlLT5pX21vZGUpOworCWlub2RlLT5pX3VpZCA9ICh1aWRfdClsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmlfdWlkX2xvdyk7CisJaW5vZGUtPmlfZ2lkID0gKGdpZF90KWxlMTZfdG9fY3B1KHJhd19pbm9kZS0+aV9naWRfbG93KTsKKwlpZiAoISh0ZXN0X29wdCAoaW5vZGUtPmlfc2IsIE5PX1VJRDMyKSkpIHsKKwkJaW5vZGUtPmlfdWlkIHw9IGxlMTZfdG9fY3B1KHJhd19pbm9kZS0+aV91aWRfaGlnaCkgPDwgMTY7CisJCWlub2RlLT5pX2dpZCB8PSBsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmlfZ2lkX2hpZ2gpIDw8IDE2OworCX0KKwlpbm9kZS0+aV9ubGluayA9IGxlMTZfdG9fY3B1KHJhd19pbm9kZS0+aV9saW5rc19jb3VudCk7CisJaW5vZGUtPmlfc2l6ZSA9IGxlMzJfdG9fY3B1KHJhd19pbm9kZS0+aV9zaXplKTsKKwlpbm9kZS0+aV9hdGltZS50dl9zZWMgPSBsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfYXRpbWUpOworCWlub2RlLT5pX2N0aW1lLnR2X3NlYyA9IGxlMzJfdG9fY3B1KHJhd19pbm9kZS0+aV9jdGltZSk7CisJaW5vZGUtPmlfbXRpbWUudHZfc2VjID0gbGUzMl90b19jcHUocmF3X2lub2RlLT5pX210aW1lKTsKKwlpbm9kZS0+aV9hdGltZS50dl9uc2VjID0gaW5vZGUtPmlfbXRpbWUudHZfbnNlYyA9IGlub2RlLT5pX2N0aW1lLnR2X25zZWMgPSAwOworCWVpLT5pX2R0aW1lID0gbGUzMl90b19jcHUocmF3X2lub2RlLT5pX2R0aW1lKTsKKwkvKiBXZSBub3cgaGF2ZSBlbm91Z2ggZmllbGRzIHRvIGNoZWNrIGlmIHRoZSBpbm9kZSB3YXMgYWN0aXZlIG9yIG5vdC4KKwkgKiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIG5mc2QgbWlnaHQgdHJ5IHRvIGFjY2VzcyBkZWFkIGlub2RlcworCSAqIHRoZSB0ZXN0IGlzIHRoYXQgc2FtZSBvbmUgdGhhdCBlMmZzY2sgdXNlcworCSAqIE5laWxCcm93biAxOTk5b2N0MTUKKwkgKi8KKwlpZiAoaW5vZGUtPmlfbmxpbmsgPT0gMCAmJiAoaW5vZGUtPmlfbW9kZSA9PSAwIHx8IGVpLT5pX2R0aW1lKSkgeworCQkvKiB0aGlzIGlub2RlIGlzIGRlbGV0ZWQgKi8KKwkJYnJlbHNlIChiaCk7CisJCWdvdG8gYmFkX2lub2RlOworCX0KKwlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9TSVpFOwkvKiBUaGlzIGlzIHRoZSBvcHRpbWFsIElPIHNpemUgKGZvciBzdGF0KSwgbm90IHRoZSBmcyBibG9jayBzaXplICovCisJaW5vZGUtPmlfYmxvY2tzID0gbGUzMl90b19jcHUocmF3X2lub2RlLT5pX2Jsb2Nrcyk7CisJZWktPmlfZmxhZ3MgPSBsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfZmxhZ3MpOworCWVpLT5pX2ZhZGRyID0gbGUzMl90b19jcHUocmF3X2lub2RlLT5pX2ZhZGRyKTsKKwllaS0+aV9mcmFnX25vID0gcmF3X2lub2RlLT5pX2ZyYWc7CisJZWktPmlfZnJhZ19zaXplID0gcmF3X2lub2RlLT5pX2ZzaXplOworCWVpLT5pX2ZpbGVfYWNsID0gbGUzMl90b19jcHUocmF3X2lub2RlLT5pX2ZpbGVfYWNsKTsKKwllaS0+aV9kaXJfYWNsID0gMDsKKwlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKKwkJaW5vZGUtPmlfc2l6ZSB8PSAoKF9fdTY0KWxlMzJfdG9fY3B1KHJhd19pbm9kZS0+aV9zaXplX2hpZ2gpKSA8PCAzMjsKKwllbHNlCisJCWVpLT5pX2Rpcl9hY2wgPSBsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfZGlyX2FjbCk7CisJZWktPmlfZHRpbWUgPSAwOworCWlub2RlLT5pX2dlbmVyYXRpb24gPSBsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfZ2VuZXJhdGlvbik7CisJZWktPmlfc3RhdGUgPSAwOworCWVpLT5pX25leHRfYWxsb2NfYmxvY2sgPSAwOworCWVpLT5pX25leHRfYWxsb2NfZ29hbCA9IDA7CisJZWktPmlfcHJlYWxsb2NfY291bnQgPSAwOworCWVpLT5pX2Jsb2NrX2dyb3VwID0gKGlubyAtIDEpIC8gRVhUMl9JTk9ERVNfUEVSX0dST1VQKGlub2RlLT5pX3NiKTsKKwllaS0+aV9kaXJfc3RhcnRfbG9va3VwID0gMDsKKworCS8qCisJICogTk9URSEgVGhlIGluLW1lbW9yeSBpbm9kZSBpX2RhdGEgYXJyYXkgaXMgaW4gbGl0dGxlLWVuZGlhbiBvcmRlcgorCSAqIGV2ZW4gb24gYmlnLWVuZGlhbiBtYWNoaW5lczogd2UgZG8gTk9UIGJ5dGVzd2FwIHRoZSBibG9jayBudW1iZXJzIQorCSAqLworCWZvciAobiA9IDA7IG4gPCBFWFQyX05fQkxPQ0tTOyBuKyspCisJCWVpLT5pX2RhdGFbbl0gPSByYXdfaW5vZGUtPmlfYmxvY2tbbl07CisKKwlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgeworCQlpbm9kZS0+aV9vcCA9ICZleHQyX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJmV4dDJfZmlsZV9vcGVyYXRpb25zOworCQlpZiAodGVzdF9vcHQoaW5vZGUtPmlfc2IsIE5PQkgpKQorCQkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmZXh0Ml9ub2JoX2FvcHM7CisJCWVsc2UKKwkJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmV4dDJfYW9wczsKKwl9IGVsc2UgaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaW5vZGUtPmlfb3AgPSAmZXh0Ml9kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJmV4dDJfZGlyX29wZXJhdGlvbnM7CisJCWlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgTk9CSCkpCisJCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZleHQyX25vYmhfYW9wczsKKwkJZWxzZQorCQkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmZXh0Ml9hb3BzOworCX0gZWxzZSBpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkgeworCQlpZiAoZXh0Ml9pbm9kZV9pc19mYXN0X3N5bWxpbmsoaW5vZGUpKQorCQkJaW5vZGUtPmlfb3AgPSAmZXh0Ml9mYXN0X3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJZWxzZSB7CisJCQlpbm9kZS0+aV9vcCA9ICZleHQyX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgTk9CSCkpCisJCQkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmZXh0Ml9ub2JoX2FvcHM7CisJCQllbHNlCisJCQkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmZXh0Ml9hb3BzOworCQl9CisJfSBlbHNlIHsKKwkJaW5vZGUtPmlfb3AgPSAmZXh0Ml9zcGVjaWFsX2lub2RlX29wZXJhdGlvbnM7CisJCWlmIChyYXdfaW5vZGUtPmlfYmxvY2tbMF0pCisJCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsCisJCQkgICBvbGRfZGVjb2RlX2RldihsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfYmxvY2tbMF0pKSk7CisJCWVsc2UgCisJCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsCisJCQkgICBuZXdfZGVjb2RlX2RldihsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfYmxvY2tbMV0pKSk7CisJfQorCWJyZWxzZSAoYmgpOworCWV4dDJfc2V0X2lub2RlX2ZsYWdzKGlub2RlKTsKKwlyZXR1cm47CisJCitiYWRfaW5vZGU6CisJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCXJldHVybjsKK30KKworc3RhdGljIGludCBleHQyX3VwZGF0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgaW50IGRvX3N5bmMpCit7CisJc3RydWN0IGV4dDJfaW5vZGVfaW5mbyAqZWkgPSBFWFQyX0koaW5vZGUpOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlpbm9fdCBpbm8gPSBpbm9kZS0+aV9pbm87CisJdWlkX3QgdWlkID0gaW5vZGUtPmlfdWlkOworCWdpZF90IGdpZCA9IGlub2RlLT5pX2dpZDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlzdHJ1Y3QgZXh0Ml9pbm9kZSAqIHJhd19pbm9kZSA9IGV4dDJfZ2V0X2lub2RlKHNiLCBpbm8sICZiaCk7CisJaW50IG47CisJaW50IGVyciA9IDA7CisKKwlpZiAoSVNfRVJSKHJhd19pbm9kZSkpCisgCQlyZXR1cm4gLUVJTzsKKworCS8qIEZvciBmaWVsZHMgbm90IG5vdCB0cmFja2luZyBpbiB0aGUgaW4tbWVtb3J5IGlub2RlLAorCSAqIGluaXRpYWxpc2UgdGhlbSB0byB6ZXJvIGZvciBuZXcgaW5vZGVzLiAqLworCWlmIChlaS0+aV9zdGF0ZSAmIEVYVDJfU1RBVEVfTkVXKQorCQltZW1zZXQocmF3X2lub2RlLCAwLCBFWFQyX1NCKHNiKS0+c19pbm9kZV9zaXplKTsKKworCXJhd19pbm9kZS0+aV9tb2RlID0gY3B1X3RvX2xlMTYoaW5vZGUtPmlfbW9kZSk7CisJaWYgKCEodGVzdF9vcHQoc2IsIE5PX1VJRDMyKSkpIHsKKwkJcmF3X2lub2RlLT5pX3VpZF9sb3cgPSBjcHVfdG9fbGUxNihsb3dfMTZfYml0cyh1aWQpKTsKKwkJcmF3X2lub2RlLT5pX2dpZF9sb3cgPSBjcHVfdG9fbGUxNihsb3dfMTZfYml0cyhnaWQpKTsKKy8qCisgKiBGaXggdXAgaW50ZXJvcGVyYWJpbGl0eSB3aXRoIG9sZCBrZXJuZWxzLiBPdGhlcndpc2UsIG9sZCBpbm9kZXMgZ2V0CisgKiByZS11c2VkIHdpdGggdGhlIHVwcGVyIDE2IGJpdHMgb2YgdGhlIHVpZC9naWQgaW50YWN0CisgKi8KKwkJaWYgKCFlaS0+aV9kdGltZSkgeworCQkJcmF3X2lub2RlLT5pX3VpZF9oaWdoID0gY3B1X3RvX2xlMTYoaGlnaF8xNl9iaXRzKHVpZCkpOworCQkJcmF3X2lub2RlLT5pX2dpZF9oaWdoID0gY3B1X3RvX2xlMTYoaGlnaF8xNl9iaXRzKGdpZCkpOworCQl9IGVsc2UgeworCQkJcmF3X2lub2RlLT5pX3VpZF9oaWdoID0gMDsKKwkJCXJhd19pbm9kZS0+aV9naWRfaGlnaCA9IDA7CisJCX0KKwl9IGVsc2UgeworCQlyYXdfaW5vZGUtPmlfdWlkX2xvdyA9IGNwdV90b19sZTE2KGZzX2hpZ2gybG93dWlkKHVpZCkpOworCQlyYXdfaW5vZGUtPmlfZ2lkX2xvdyA9IGNwdV90b19sZTE2KGZzX2hpZ2gybG93Z2lkKGdpZCkpOworCQlyYXdfaW5vZGUtPmlfdWlkX2hpZ2ggPSAwOworCQlyYXdfaW5vZGUtPmlfZ2lkX2hpZ2ggPSAwOworCX0KKwlyYXdfaW5vZGUtPmlfbGlua3NfY291bnQgPSBjcHVfdG9fbGUxNihpbm9kZS0+aV9ubGluayk7CisJcmF3X2lub2RlLT5pX3NpemUgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9zaXplKTsKKwlyYXdfaW5vZGUtPmlfYXRpbWUgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9hdGltZS50dl9zZWMpOworCXJhd19pbm9kZS0+aV9jdGltZSA9IGNwdV90b19sZTMyKGlub2RlLT5pX2N0aW1lLnR2X3NlYyk7CisJcmF3X2lub2RlLT5pX210aW1lID0gY3B1X3RvX2xlMzIoaW5vZGUtPmlfbXRpbWUudHZfc2VjKTsKKworCXJhd19pbm9kZS0+aV9ibG9ja3MgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9ibG9ja3MpOworCXJhd19pbm9kZS0+aV9kdGltZSA9IGNwdV90b19sZTMyKGVpLT5pX2R0aW1lKTsKKwlyYXdfaW5vZGUtPmlfZmxhZ3MgPSBjcHVfdG9fbGUzMihlaS0+aV9mbGFncyk7CisJcmF3X2lub2RlLT5pX2ZhZGRyID0gY3B1X3RvX2xlMzIoZWktPmlfZmFkZHIpOworCXJhd19pbm9kZS0+aV9mcmFnID0gZWktPmlfZnJhZ19ubzsKKwlyYXdfaW5vZGUtPmlfZnNpemUgPSBlaS0+aV9mcmFnX3NpemU7CisJcmF3X2lub2RlLT5pX2ZpbGVfYWNsID0gY3B1X3RvX2xlMzIoZWktPmlfZmlsZV9hY2wpOworCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKKwkJcmF3X2lub2RlLT5pX2Rpcl9hY2wgPSBjcHVfdG9fbGUzMihlaS0+aV9kaXJfYWNsKTsKKwllbHNlIHsKKwkJcmF3X2lub2RlLT5pX3NpemVfaGlnaCA9IGNwdV90b19sZTMyKGlub2RlLT5pX3NpemUgPj4gMzIpOworCQlpZiAoaW5vZGUtPmlfc2l6ZSA+IDB4N2ZmZmZmZmZVTEwpIHsKKwkJCWlmICghRVhUMl9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsCisJCQkJCUVYVDJfRkVBVFVSRV9ST19DT01QQVRfTEFSR0VfRklMRSkgfHwKKwkJCSAgICBFWFQyX1NCKHNiKS0+c19lcy0+c19yZXZfbGV2ZWwgPT0KKwkJCQkJY3B1X3RvX2xlMzIoRVhUMl9HT09EX09MRF9SRVYpKSB7CisJCQkgICAgICAgLyogSWYgdGhpcyBpcyB0aGUgZmlyc3QgbGFyZ2UgZmlsZQorCQkJCSogY3JlYXRlZCwgYWRkIGEgZmxhZyB0byB0aGUgc3VwZXJibG9jay4KKwkJCQkqLworCQkJCWxvY2tfa2VybmVsKCk7CisJCQkJZXh0Ml91cGRhdGVfZHluYW1pY19yZXYoc2IpOworCQkJCUVYVDJfU0VUX1JPX0NPTVBBVF9GRUFUVVJFKHNiLAorCQkJCQlFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX0xBUkdFX0ZJTEUpOworCQkJCXVubG9ja19rZXJuZWwoKTsKKwkJCQlleHQyX3dyaXRlX3N1cGVyKHNiKTsKKwkJCX0KKwkJfQorCX0KKwkKKwlyYXdfaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IGNwdV90b19sZTMyKGlub2RlLT5pX2dlbmVyYXRpb24pOworCWlmIChTX0lTQ0hSKGlub2RlLT5pX21vZGUpIHx8IFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaWYgKG9sZF92YWxpZF9kZXYoaW5vZGUtPmlfcmRldikpIHsKKwkJCXJhd19pbm9kZS0+aV9ibG9ja1swXSA9CisJCQkJY3B1X3RvX2xlMzIob2xkX2VuY29kZV9kZXYoaW5vZGUtPmlfcmRldikpOworCQkJcmF3X2lub2RlLT5pX2Jsb2NrWzFdID0gMDsKKwkJfSBlbHNlIHsKKwkJCXJhd19pbm9kZS0+aV9ibG9ja1swXSA9IDA7CisJCQlyYXdfaW5vZGUtPmlfYmxvY2tbMV0gPQorCQkJCWNwdV90b19sZTMyKG5ld19lbmNvZGVfZGV2KGlub2RlLT5pX3JkZXYpKTsKKwkJCXJhd19pbm9kZS0+aV9ibG9ja1syXSA9IDA7CisJCX0KKwl9IGVsc2UgZm9yIChuID0gMDsgbiA8IEVYVDJfTl9CTE9DS1M7IG4rKykKKwkJcmF3X2lub2RlLT5pX2Jsb2NrW25dID0gZWktPmlfZGF0YVtuXTsKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJaWYgKGRvX3N5bmMpIHsKKwkJc3luY19kaXJ0eV9idWZmZXIoYmgpOworCQlpZiAoYnVmZmVyX3JlcShiaCkgJiYgIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKKwkJCXByaW50ayAoIklPIGVycm9yIHN5bmNpbmcgZXh0MiBpbm9kZSBbJXM6JTA4bHhdXG4iLAorCQkJCXNiLT5zX2lkLCAodW5zaWduZWQgbG9uZykgaW5vKTsKKwkJCWVyciA9IC1FSU87CisJCX0KKwl9CisJZWktPmlfc3RhdGUgJj0gfkVYVDJfU1RBVEVfTkVXOworCWJyZWxzZSAoYmgpOworCXJldHVybiBlcnI7Cit9CisKK2ludCBleHQyX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB3YWl0KQoreworCXJldHVybiBleHQyX3VwZGF0ZV9pbm9kZShpbm9kZSwgd2FpdCk7Cit9CisKK2ludCBleHQyX3N5bmNfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgd2JjID0geworCQkuc3luY19tb2RlID0gV0JfU1lOQ19BTEwsCisJCS5ucl90b193cml0ZSA9IDAsCS8qIHN5c19mc3luYyBkaWQgdGhpcyAqLworCX07CisJcmV0dXJuIHN5bmNfaW5vZGUoaW5vZGUsICZ3YmMpOworfQorCitpbnQgZXh0Ml9zZXRhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICppYXR0cikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludCBlcnJvcjsKKworCWVycm9yID0gaW5vZGVfY2hhbmdlX29rKGlub2RlLCBpYXR0cik7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJaWYgKChpYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1VJRCAmJiBpYXR0ci0+aWFfdWlkICE9IGlub2RlLT5pX3VpZCkgfHwKKwkgICAgKGlhdHRyLT5pYV92YWxpZCAmIEFUVFJfR0lEICYmIGlhdHRyLT5pYV9naWQgIT0gaW5vZGUtPmlfZ2lkKSkgeworCQllcnJvciA9IERRVU9UX1RSQU5TRkVSKGlub2RlLCBpYXR0cikgPyAtRURRVU9UIDogMDsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOworCX0KKwllcnJvciA9IGlub2RlX3NldGF0dHIoaW5vZGUsIGlhdHRyKTsKKwlpZiAoIWVycm9yICYmIChpYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01PREUpKQorCQllcnJvciA9IGV4dDJfYWNsX2NobW9kKGlub2RlKTsKKwlyZXR1cm4gZXJyb3I7Cit9CmRpZmYgLS1naXQgYS9mcy9leHQyL2lvY3RsLmMgYi9mcy9leHQyL2lvY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA5ZDg2NwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDIvaW9jdGwuYwpAQCAtMCwwICsxLDgxIEBACisvKgorICogbGludXgvZnMvZXh0Mi9pb2N0bC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk1CisgKiBSZW15IENhcmQgKGNhcmRAbWFzaS5pYnAuZnIpCisgKiBMYWJvcmF0b2lyZSBNQVNJIC0gSW5zdGl0dXQgQmxhaXNlIFBhc2NhbAorICogVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICovCisKKyNpbmNsdWRlICJleHQyLmgiCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisKK2ludCBleHQyX2lvY3RsIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAorCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZXh0Ml9pbm9kZV9pbmZvICplaSA9IEVYVDJfSShpbm9kZSk7CisJdW5zaWduZWQgaW50IGZsYWdzOworCisJZXh0Ml9kZWJ1ZyAoImNtZCA9ICV1LCBhcmcgPSAlbHVcbiIsIGNtZCwgYXJnKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBFWFQyX0lPQ19HRVRGTEFHUzoKKwkJZmxhZ3MgPSBlaS0+aV9mbGFncyAmIEVYVDJfRkxfVVNFUl9WSVNJQkxFOworCQlyZXR1cm4gcHV0X3VzZXIoZmxhZ3MsIChpbnQgX191c2VyICopIGFyZyk7CisJY2FzZSBFWFQyX0lPQ19TRVRGTEFHUzogeworCQl1bnNpZ25lZCBpbnQgb2xkZmxhZ3M7CisKKwkJaWYgKElTX1JET05MWShpbm9kZSkpCisJCQlyZXR1cm4gLUVST0ZTOworCisJCWlmICgoY3VycmVudC0+ZnN1aWQgIT0gaW5vZGUtPmlfdWlkKSAmJiAhY2FwYWJsZShDQVBfRk9XTkVSKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCisJCWlmIChnZXRfdXNlcihmbGFncywgKGludCBfX3VzZXIgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJCWZsYWdzICY9IH5FWFQyX0RJUlNZTkNfRkw7CisKKwkJb2xkZmxhZ3MgPSBlaS0+aV9mbGFnczsKKworCQkvKgorCQkgKiBUaGUgSU1NVVRBQkxFIGFuZCBBUFBFTkRfT05MWSBmbGFncyBjYW4gb25seSBiZSBjaGFuZ2VkIGJ5CisJCSAqIHRoZSByZWxldmFudCBjYXBhYmlsaXR5LgorCQkgKgorCQkgKiBUaGlzIHRlc3QgbG9va3MgbmljZXIuIFRoYW5rcyB0byBQYXVsaW5lIE1pZGRlbGluaworCQkgKi8KKwkJaWYgKChmbGFncyBeIG9sZGZsYWdzKSAmIChFWFQyX0FQUEVORF9GTCB8IEVYVDJfSU1NVVRBQkxFX0ZMKSkgeworCQkJaWYgKCFjYXBhYmxlKENBUF9MSU5VWF9JTU1VVEFCTEUpKQorCQkJCXJldHVybiAtRVBFUk07CisJCX0KKworCQlmbGFncyA9IGZsYWdzICYgRVhUMl9GTF9VU0VSX01PRElGSUFCTEU7CisJCWZsYWdzIHw9IG9sZGZsYWdzICYgfkVYVDJfRkxfVVNFUl9NT0RJRklBQkxFOworCQllaS0+aV9mbGFncyA9IGZsYWdzOworCisJCWV4dDJfc2V0X2lub2RlX2ZsYWdzKGlub2RlKTsKKwkJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgRVhUMl9JT0NfR0VUVkVSU0lPTjoKKwkJcmV0dXJuIHB1dF91c2VyKGlub2RlLT5pX2dlbmVyYXRpb24sIChpbnQgX191c2VyICopIGFyZyk7CisJY2FzZSBFWFQyX0lPQ19TRVRWRVJTSU9OOgorCQlpZiAoKGN1cnJlbnQtPmZzdWlkICE9IGlub2RlLT5pX3VpZCkgJiYgIWNhcGFibGUoQ0FQX0ZPV05FUikpCisJCQlyZXR1cm4gLUVQRVJNOworCQlpZiAoSVNfUkRPTkxZKGlub2RlKSkKKwkJCXJldHVybiAtRVJPRlM7CisJCWlmIChnZXRfdXNlcihpbm9kZS0+aV9nZW5lcmF0aW9uLCAoaW50IF9fdXNlciAqKSBhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CQorCQlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1RUWTsKKwl9Cit9CmRpZmYgLS1naXQgYS9mcy9leHQyL25hbWVpLmMgYi9mcy9leHQyL25hbWVpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE3NmIzZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDIvbmFtZWkuYwpAQCAtMCwwICsxLDQxOCBAQAorLyoKKyAqIGxpbnV4L2ZzL2V4dDIvbmFtZWkuYworICoKKyAqIFJld3JpdGUgdG8gcGFnZWNhY2hlLiBBbG1vc3QgYWxsIGNvZGUgaGFkIGJlZW4gY2hhbmdlZCwgc28gYmxhbWUgbWUKKyAqIGlmIHRoZSB0aGluZ3MgZ28gd3JvbmcuIFBsZWFzZSwgc2VuZCBidWcgcmVwb3J0cyB0bworICogdmlyb0BwYXJjZWxmYXJjZS5saW51eC50aGVwbGFuZXQuY28udWsKKyAqCisgKiBTdHVmZiBoZXJlIGlzIGJhc2ljYWxseSBhIGdsdWUgYmV0d2VlbiB0aGUgVkZTIGFuZCBnZW5lcmljIFVOSVhpc2gKKyAqIGZpbGVzeXN0ZW0gdGhhdCBrZWVwcyBldmVyeXRoaW5nIGluIHBhZ2VjYWNoZS4gQWxsIGtub3dsZWRnZSBvZiB0aGUKKyAqIGRpcmVjdG9yeSBsYXlvdXQgaXMgaW4gZnMvZXh0Mi9kaXIuYyAtIGl0IHR1cm5lZCBvdXQgdG8gYmUgZWFzaWx5IHNlcGFyYXRhYmxlCisgKiBhbmQgaXQncyBlYXNpZXIgdG8gZGVidWcgdGhhdCB3YXkuIEluIHByaW5jaXBsZSB3ZSBtaWdodCB3YW50IHRvCisgKiBnZW5lcmFsaXplIHRoYXQgYSBiaXQgYW5kIHR1cm4gaXQgaW50byBhIGxpYnJhcnkuIE9yIG5vdC4KKyAqCisgKiBUaGUgb25seSBub24tc3RhdGljIG9iamVjdCBoZXJlIGlzIGV4dDJfZGlyX2lub2RlX29wZXJhdGlvbnMuCisgKgorICogVE9ETzogZ2V0IHJpZCBvZiBrbWFwKCkgdXNlLCBhZGQgcmVhZGFoZWFkLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NQorICogUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQorICogTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqCisgKiAgZnJvbQorICoKKyAqICBsaW51eC9mcy9taW5peC9uYW1laS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgQmlnLWVuZGlhbiB0byBsaXR0bGUtZW5kaWFuIGJ5dGUtc3dhcHBpbmcvYml0bWFwcyBieQorICogICAgICAgIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSksIDE5OTUKKyAqLworCisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgImV4dDIuaCIKKyNpbmNsdWRlICJ4YXR0ci5oIgorI2luY2x1ZGUgImFjbC5oIgorCisvKgorICogQ291cGxlIG9mIGhlbHBlciBmdW5jdGlvbnMgLSBtYWtlIHRoZSBjb2RlIHNsaWdodGx5IGNsZWFuZXIuCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIGV4dDJfaW5jX2NvdW50KHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW5vZGUtPmlfbmxpbmsrKzsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGV4dDJfZGVjX2NvdW50KHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW5vZGUtPmlfbmxpbmstLTsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZXh0Ml9hZGRfbm9uZGlyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpbnQgZXJyID0gZXh0Ml9hZGRfbGluayhkZW50cnksIGlub2RlKTsKKwlpZiAoIWVycikgeworCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCQlyZXR1cm4gMDsKKwl9CisJZXh0Ml9kZWNfY291bnQoaW5vZGUpOworCWlwdXQoaW5vZGUpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBNZXRob2RzIHRoZW1zZWx2ZXMuCisgKi8KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmV4dDJfbG9va3VwKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKwlpbm9fdCBpbm87CisJCisJaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+IEVYVDJfTkFNRV9MRU4pCisJCXJldHVybiBFUlJfUFRSKC1FTkFNRVRPT0xPTkcpOworCisJaW5vID0gZXh0Ml9pbm9kZV9ieV9uYW1lKGRpciwgZGVudHJ5KTsKKwlpbm9kZSA9IE5VTEw7CisJaWYgKGlubykgeworCQlpbm9kZSA9IGlnZXQoZGlyLT5pX3NiLCBpbm8pOworCQlpZiAoIWlub2RlKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CisJfQorCWlmIChpbm9kZSkKKwkJcmV0dXJuIGRfc3BsaWNlX2FsaWFzKGlub2RlLCBkZW50cnkpOworCWRfYWRkKGRlbnRyeSwgaW5vZGUpOworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgZGVudHJ5ICpleHQyX2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqY2hpbGQpCit7CisJdW5zaWduZWQgbG9uZyBpbm87CisJc3RydWN0IGRlbnRyeSAqcGFyZW50OworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGRlbnRyeSBkb3Rkb3Q7CisKKwlkb3Rkb3QuZF9uYW1lLm5hbWUgPSAiLi4iOworCWRvdGRvdC5kX25hbWUubGVuID0gMjsKKworCWlubyA9IGV4dDJfaW5vZGVfYnlfbmFtZShjaGlsZC0+ZF9pbm9kZSwgJmRvdGRvdCk7CisJaWYgKCFpbm8pCisJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworCWlub2RlID0gaWdldChjaGlsZC0+ZF9pbm9kZS0+aV9zYiwgaW5vKTsKKworCWlmICghaW5vZGUpCisJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworCXBhcmVudCA9IGRfYWxsb2NfYW5vbihpbm9kZSk7CisJaWYgKCFwYXJlbnQpIHsKKwkJaXB1dChpbm9kZSk7CisJCXBhcmVudCA9IEVSUl9QVFIoLUVOT01FTSk7CisJfQorCXJldHVybiBwYXJlbnQ7Cit9IAorCisvKgorICogQnkgdGhlIHRpbWUgdGhpcyBpcyBjYWxsZWQsIHdlIGFscmVhZHkgaGF2ZSBjcmVhdGVkCisgKiB0aGUgZGlyZWN0b3J5IGNhY2hlIGVudHJ5IGZvciB0aGUgbmV3IGZpbGUsIGJ1dCBpdAorICogaXMgc28gZmFyIG5lZ2F0aXZlIC0gaXQgaGFzIG5vIGlub2RlLgorICoKKyAqIElmIHRoZSBjcmVhdGUgc3VjY2VlZHMsIHdlIGZpbGwgaW4gdGhlIGlub2RlIGluZm9ybWF0aW9uCisgKiB3aXRoIGRfaW5zdGFudGlhdGUoKS4gCisgKi8KK3N0YXRpYyBpbnQgZXh0Ml9jcmVhdGUgKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgaW50IG1vZGUsIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZXh0Ml9uZXdfaW5vZGUgKGRpciwgbW9kZSk7CisJaW50IGVyciA9IFBUUl9FUlIoaW5vZGUpOworCWlmICghSVNfRVJSKGlub2RlKSkgeworCQlpbm9kZS0+aV9vcCA9ICZleHQyX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJmV4dDJfZmlsZV9vcGVyYXRpb25zOworCQlpZiAodGVzdF9vcHQoaW5vZGUtPmlfc2IsIE5PQkgpKQorCQkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmZXh0Ml9ub2JoX2FvcHM7CisJCWVsc2UKKwkJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmV4dDJfYW9wczsKKwkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCWVyciA9IGV4dDJfYWRkX25vbmRpcihkZW50cnksIGlub2RlKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBleHQyX21rbm9kIChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsIGRldl90IHJkZXYpCit7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJaW50IGVycjsKKworCWlmICghbmV3X3ZhbGlkX2RldihyZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpbm9kZSA9IGV4dDJfbmV3X2lub2RlIChkaXIsIG1vZGUpOworCWVyciA9IFBUUl9FUlIoaW5vZGUpOworCWlmICghSVNfRVJSKGlub2RlKSkgeworCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsIHJkZXYpOworI2lmZGVmIENPTkZJR19FWFQyX0ZTX1hBVFRSCisJCWlub2RlLT5pX29wID0gJmV4dDJfc3BlY2lhbF9pbm9kZV9vcGVyYXRpb25zOworI2VuZGlmCisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQllcnIgPSBleHQyX2FkZF9ub25kaXIoZGVudHJ5LCBpbm9kZSk7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZXh0Ml9zeW1saW5rIChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnksCisJY29uc3QgY2hhciAqIHN5bW5hbWUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2IgPSBkaXItPmlfc2I7CisJaW50IGVyciA9IC1FTkFNRVRPT0xPTkc7CisJdW5zaWduZWQgbCA9IHN0cmxlbihzeW1uYW1lKSsxOworCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCisJaWYgKGwgPiBzYi0+c19ibG9ja3NpemUpCisJCWdvdG8gb3V0OworCisJaW5vZGUgPSBleHQyX25ld19pbm9kZSAoZGlyLCBTX0lGTE5LIHwgU19JUldYVUdPKTsKKwllcnIgPSBQVFJfRVJSKGlub2RlKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkKKwkJZ290byBvdXQ7CisKKwlpZiAobCA+IHNpemVvZiAoRVhUMl9JKGlub2RlKS0+aV9kYXRhKSkgeworCQkvKiBzbG93IHN5bWxpbmsgKi8KKwkJaW5vZGUtPmlfb3AgPSAmZXh0Ml9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJCWlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgTk9CSCkpCisJCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZleHQyX25vYmhfYW9wczsKKwkJZWxzZQorCQkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmZXh0Ml9hb3BzOworCQllcnIgPSBwYWdlX3N5bWxpbmsoaW5vZGUsIHN5bW5hbWUsIGwpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXRfZmFpbDsKKwl9IGVsc2UgeworCQkvKiBmYXN0IHN5bWxpbmsgKi8KKwkJaW5vZGUtPmlfb3AgPSAmZXh0Ml9mYXN0X3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJbWVtY3B5KChjaGFyKikoRVhUMl9JKGlub2RlKS0+aV9kYXRhKSxzeW1uYW1lLGwpOworCQlpbm9kZS0+aV9zaXplID0gbC0xOworCX0KKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKworCWVyciA9IGV4dDJfYWRkX25vbmRpcihkZW50cnksIGlub2RlKTsKK291dDoKKwlyZXR1cm4gZXJyOworCitvdXRfZmFpbDoKKwlleHQyX2RlY19jb3VudChpbm9kZSk7CisJaXB1dCAoaW5vZGUpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgaW50IGV4dDJfbGluayAoc3RydWN0IGRlbnRyeSAqIG9sZF9kZW50cnksIHN0cnVjdCBpbm9kZSAqIGRpciwKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG9sZF9kZW50cnktPmRfaW5vZGU7CisKKwlpZiAoaW5vZGUtPmlfbmxpbmsgPj0gRVhUMl9MSU5LX01BWCkKKwkJcmV0dXJuIC1FTUxJTks7CisKKwlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJZXh0Ml9pbmNfY291bnQoaW5vZGUpOworCWF0b21pY19pbmMoJmlub2RlLT5pX2NvdW50KTsKKworCXJldHVybiBleHQyX2FkZF9ub25kaXIoZGVudHJ5LCBpbm9kZSk7Cit9CisKK3N0YXRpYyBpbnQgZXh0Ml9ta2RpcihzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnksIGludCBtb2RlKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCWludCBlcnIgPSAtRU1MSU5LOworCisJaWYgKGRpci0+aV9ubGluayA+PSBFWFQyX0xJTktfTUFYKQorCQlnb3RvIG91dDsKKworCWV4dDJfaW5jX2NvdW50KGRpcik7CisKKwlpbm9kZSA9IGV4dDJfbmV3X2lub2RlIChkaXIsIFNfSUZESVIgfCBtb2RlKTsKKwllcnIgPSBQVFJfRVJSKGlub2RlKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkKKwkJZ290byBvdXRfZGlyOworCisJaW5vZGUtPmlfb3AgPSAmZXh0Ml9kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9mb3AgPSAmZXh0Ml9kaXJfb3BlcmF0aW9uczsKKwlpZiAodGVzdF9vcHQoaW5vZGUtPmlfc2IsIE5PQkgpKQorCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZleHQyX25vYmhfYW9wczsKKwllbHNlCisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmV4dDJfYW9wczsKKworCWV4dDJfaW5jX2NvdW50KGlub2RlKTsKKworCWVyciA9IGV4dDJfbWFrZV9lbXB0eShpbm9kZSwgZGlyKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mYWlsOworCisJZXJyID0gZXh0Ml9hZGRfbGluayhkZW50cnksIGlub2RlKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mYWlsOworCisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKK291dDoKKwlyZXR1cm4gZXJyOworCitvdXRfZmFpbDoKKwlleHQyX2RlY19jb3VudChpbm9kZSk7CisJZXh0Ml9kZWNfY291bnQoaW5vZGUpOworCWlwdXQoaW5vZGUpOworb3V0X2RpcjoKKwlleHQyX2RlY19jb3VudChkaXIpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgaW50IGV4dDJfdW5saW5rKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBleHQyX2Rpcl9lbnRyeV8yICogZGU7CisJc3RydWN0IHBhZ2UgKiBwYWdlOworCWludCBlcnIgPSAtRU5PRU5UOworCisJZGUgPSBleHQyX2ZpbmRfZW50cnkgKGRpciwgZGVudHJ5LCAmcGFnZSk7CisJaWYgKCFkZSkKKwkJZ290byBvdXQ7CisKKwllcnIgPSBleHQyX2RlbGV0ZV9lbnRyeSAoZGUsIHBhZ2UpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJaW5vZGUtPmlfY3RpbWUgPSBkaXItPmlfY3RpbWU7CisJZXh0Ml9kZWNfY291bnQoaW5vZGUpOworCWVyciA9IDA7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBleHQyX3JtZGlyIChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgZXJyID0gLUVOT1RFTVBUWTsKKworCWlmIChleHQyX2VtcHR5X2Rpcihpbm9kZSkpIHsKKwkJZXJyID0gZXh0Ml91bmxpbmsoZGlyLCBkZW50cnkpOworCQlpZiAoIWVycikgeworCQkJaW5vZGUtPmlfc2l6ZSA9IDA7CisJCQlleHQyX2RlY19jb3VudChpbm9kZSk7CisJCQlleHQyX2RlY19jb3VudChkaXIpOworCQl9CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZXh0Ml9yZW5hbWUgKHN0cnVjdCBpbm9kZSAqIG9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKiBvbGRfZGVudHJ5LAorCXN0cnVjdCBpbm9kZSAqIG5ld19kaXIsCXN0cnVjdCBkZW50cnkgKiBuZXdfZGVudHJ5ICkKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBvbGRfaW5vZGUgPSBvbGRfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqIG5ld19pbm9kZSA9IG5ld19kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHBhZ2UgKiBkaXJfcGFnZSA9IE5VTEw7CisJc3RydWN0IGV4dDJfZGlyX2VudHJ5XzIgKiBkaXJfZGUgPSBOVUxMOworCXN0cnVjdCBwYWdlICogb2xkX3BhZ2U7CisJc3RydWN0IGV4dDJfZGlyX2VudHJ5XzIgKiBvbGRfZGU7CisJaW50IGVyciA9IC1FTk9FTlQ7CisKKwlvbGRfZGUgPSBleHQyX2ZpbmRfZW50cnkgKG9sZF9kaXIsIG9sZF9kZW50cnksICZvbGRfcGFnZSk7CisJaWYgKCFvbGRfZGUpCisJCWdvdG8gb3V0OworCisJaWYgKFNfSVNESVIob2xkX2lub2RlLT5pX21vZGUpKSB7CisJCWVyciA9IC1FSU87CisJCWRpcl9kZSA9IGV4dDJfZG90ZG90KG9sZF9pbm9kZSwgJmRpcl9wYWdlKTsKKwkJaWYgKCFkaXJfZGUpCisJCQlnb3RvIG91dF9vbGQ7CisJfQorCisJaWYgKG5ld19pbm9kZSkgeworCQlzdHJ1Y3QgcGFnZSAqbmV3X3BhZ2U7CisJCXN0cnVjdCBleHQyX2Rpcl9lbnRyeV8yICpuZXdfZGU7CisKKwkJZXJyID0gLUVOT1RFTVBUWTsKKwkJaWYgKGRpcl9kZSAmJiAhZXh0Ml9lbXB0eV9kaXIgKG5ld19pbm9kZSkpCisJCQlnb3RvIG91dF9kaXI7CisKKwkJZXJyID0gLUVOT0VOVDsKKwkJbmV3X2RlID0gZXh0Ml9maW5kX2VudHJ5IChuZXdfZGlyLCBuZXdfZGVudHJ5LCAmbmV3X3BhZ2UpOworCQlpZiAoIW5ld19kZSkKKwkJCWdvdG8gb3V0X2RpcjsKKwkJZXh0Ml9pbmNfY291bnQob2xkX2lub2RlKTsKKwkJZXh0Ml9zZXRfbGluayhuZXdfZGlyLCBuZXdfZGUsIG5ld19wYWdlLCBvbGRfaW5vZGUpOworCQluZXdfaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCQlpZiAoZGlyX2RlKQorCQkJbmV3X2lub2RlLT5pX25saW5rLS07CisJCWV4dDJfZGVjX2NvdW50KG5ld19pbm9kZSk7CisJfSBlbHNlIHsKKwkJaWYgKGRpcl9kZSkgeworCQkJZXJyID0gLUVNTElOSzsKKwkJCWlmIChuZXdfZGlyLT5pX25saW5rID49IEVYVDJfTElOS19NQVgpCisJCQkJZ290byBvdXRfZGlyOworCQl9CisJCWV4dDJfaW5jX2NvdW50KG9sZF9pbm9kZSk7CisJCWVyciA9IGV4dDJfYWRkX2xpbmsobmV3X2RlbnRyeSwgb2xkX2lub2RlKTsKKwkJaWYgKGVycikgeworCQkJZXh0Ml9kZWNfY291bnQob2xkX2lub2RlKTsKKwkJCWdvdG8gb3V0X2RpcjsKKwkJfQorCQlpZiAoZGlyX2RlKQorCQkJZXh0Ml9pbmNfY291bnQobmV3X2Rpcik7CisJfQorCisJLyoKKwkgKiBMaWtlIG1vc3Qgb3RoZXIgVW5peCBzeXN0ZW1zLCBzZXQgdGhlIGN0aW1lIGZvciBpbm9kZXMgb24gYQorIAkgKiByZW5hbWUuCisJICogZXh0Ml9kZWNfY291bnQoKSB3aWxsIG1hcmsgdGhlIGlub2RlIGRpcnR5LgorCSAqLworCW9sZF9pbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisKKwlleHQyX2RlbGV0ZV9lbnRyeSAob2xkX2RlLCBvbGRfcGFnZSk7CisJZXh0Ml9kZWNfY291bnQob2xkX2lub2RlKTsKKworCWlmIChkaXJfZGUpIHsKKwkJZXh0Ml9zZXRfbGluayhvbGRfaW5vZGUsIGRpcl9kZSwgZGlyX3BhZ2UsIG5ld19kaXIpOworCQlleHQyX2RlY19jb3VudChvbGRfZGlyKTsKKwl9CisJcmV0dXJuIDA7CisKKworb3V0X2RpcjoKKwlpZiAoZGlyX2RlKSB7CisJCWt1bm1hcChkaXJfcGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShkaXJfcGFnZSk7CisJfQorb3V0X29sZDoKKwlrdW5tYXAob2xkX3BhZ2UpOworCXBhZ2VfY2FjaGVfcmVsZWFzZShvbGRfcGFnZSk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZXh0Ml9kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkuY3JlYXRlCQk9IGV4dDJfY3JlYXRlLAorCS5sb29rdXAJCT0gZXh0Ml9sb29rdXAsCisJLmxpbmsJCT0gZXh0Ml9saW5rLAorCS51bmxpbmsJCT0gZXh0Ml91bmxpbmssCisJLnN5bWxpbmsJPSBleHQyX3N5bWxpbmssCisJLm1rZGlyCQk9IGV4dDJfbWtkaXIsCisJLnJtZGlyCQk9IGV4dDJfcm1kaXIsCisJLm1rbm9kCQk9IGV4dDJfbWtub2QsCisJLnJlbmFtZQkJPSBleHQyX3JlbmFtZSwKKyNpZmRlZiBDT05GSUdfRVhUMl9GU19YQVRUUgorCS5zZXR4YXR0cgk9IGdlbmVyaWNfc2V0eGF0dHIsCisJLmdldHhhdHRyCT0gZ2VuZXJpY19nZXR4YXR0ciwKKwkubGlzdHhhdHRyCT0gZXh0Ml9saXN0eGF0dHIsCisJLnJlbW92ZXhhdHRyCT0gZ2VuZXJpY19yZW1vdmV4YXR0ciwKKyNlbmRpZgorCS5zZXRhdHRyCT0gZXh0Ml9zZXRhdHRyLAorCS5wZXJtaXNzaW9uCT0gZXh0Ml9wZXJtaXNzaW9uLAorfTsKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZXh0Ml9zcGVjaWFsX2lub2RlX29wZXJhdGlvbnMgPSB7CisjaWZkZWYgQ09ORklHX0VYVDJfRlNfWEFUVFIKKwkuc2V0eGF0dHIJPSBnZW5lcmljX3NldHhhdHRyLAorCS5nZXR4YXR0cgk9IGdlbmVyaWNfZ2V0eGF0dHIsCisJLmxpc3R4YXR0cgk9IGV4dDJfbGlzdHhhdHRyLAorCS5yZW1vdmV4YXR0cgk9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCisjZW5kaWYKKwkuc2V0YXR0cgk9IGV4dDJfc2V0YXR0ciwKKwkucGVybWlzc2lvbgk9IGV4dDJfcGVybWlzc2lvbiwKK307CmRpZmYgLS1naXQgYS9mcy9leHQyL3N1cGVyLmMgYi9mcy9leHQyL3N1cGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdjYTc3YQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDIvc3VwZXIuYwpAQCAtMCwwICsxLDExNjEgQEAKKy8qCisgKiAgbGludXgvZnMvZXh0Mi9zdXBlci5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1CisgKiBSZW15IENhcmQgKGNhcmRAbWFzaS5pYnAuZnIpCisgKiBMYWJvcmF0b2lyZSBNQVNJIC0gSW5zdGl0dXQgQmxhaXNlIFBhc2NhbAorICogVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICoKKyAqICBmcm9tCisgKgorICogIGxpbnV4L2ZzL21pbml4L2lub2RlLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICBCaWctZW5kaWFuIHRvIGxpdHRsZS1lbmRpYW4gYnl0ZS1zd2FwcGluZy9iaXRtYXBzIGJ5CisgKiAgICAgICAgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KSwgMTk5NQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgImV4dDIuaCIKKyNpbmNsdWRlICJ4YXR0ci5oIgorI2luY2x1ZGUgImFjbC5oIgorCitzdGF0aWMgdm9pZCBleHQyX3N5bmNfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCSAgICBzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqZXMpOworc3RhdGljIGludCBleHQyX3JlbW91bnQgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBpbnQgKiBmbGFncywgY2hhciAqIGRhdGEpOworc3RhdGljIGludCBleHQyX3N0YXRmcyAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIHN0cnVjdCBrc3RhdGZzICogYnVmKTsKKwordm9pZCBleHQyX2Vycm9yIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgY29uc3QgY2hhciAqIGZ1bmN0aW9uLAorCQkgY29uc3QgY2hhciAqIGZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwlzdHJ1Y3QgZXh0Ml9zYl9pbmZvICpzYmkgPSBFWFQyX1NCKHNiKTsKKwlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqZXMgPSBzYmktPnNfZXM7CisKKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJc2JpLT5zX21vdW50X3N0YXRlIHw9IEVYVDJfRVJST1JfRlM7CisJCWVzLT5zX3N0YXRlID0KKwkJCWNwdV90b19sZTE2KGxlMTZfdG9fY3B1KGVzLT5zX3N0YXRlKSB8IEVYVDJfRVJST1JfRlMpOworCQlleHQyX3N5bmNfc3VwZXIoc2IsIGVzKTsKKwl9CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXByaW50ayhLRVJOX0NSSVQgIkVYVDItZnMgZXJyb3IgKGRldmljZSAlcyk6ICVzOiAiLHNiLT5zX2lkLCBmdW5jdGlvbik7CisJdnByaW50ayhmbXQsIGFyZ3MpOworCXByaW50aygiXG4iKTsKKwl2YV9lbmQoYXJncyk7CisKKwlpZiAodGVzdF9vcHQoc2IsIEVSUk9SU19QQU5JQykpCisJCXBhbmljKCJFWFQyLWZzIHBhbmljIGZyb20gcHJldmlvdXMgZXJyb3JcbiIpOworCWlmICh0ZXN0X29wdChzYiwgRVJST1JTX1JPKSkgeworCQlwcmludGsoIlJlbW91bnRpbmcgZmlsZXN5c3RlbSByZWFkLW9ubHlcbiIpOworCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CisJfQorfQorCit2b2lkIGV4dDJfd2FybmluZyAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIGNvbnN0IGNoYXIgKiBmdW5jdGlvbiwKKwkJICAgY29uc3QgY2hhciAqIGZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiRVhUMi1mcyB3YXJuaW5nIChkZXZpY2UgJXMpOiAlczogIiwKKwkgICAgICAgc2ItPnNfaWQsIGZ1bmN0aW9uKTsKKwl2cHJpbnRrKGZtdCwgYXJncyk7CisJcHJpbnRrKCJcbiIpOworCXZhX2VuZChhcmdzKTsKK30KKwordm9pZCBleHQyX3VwZGF0ZV9keW5hbWljX3JldihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICplcyA9IEVYVDJfU0Ioc2IpLT5zX2VzOworCisJaWYgKGxlMzJfdG9fY3B1KGVzLT5zX3Jldl9sZXZlbCkgPiBFWFQyX0dPT0RfT0xEX1JFVikKKwkJcmV0dXJuOworCisJZXh0Ml93YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCSAgICAgInVwZGF0aW5nIHRvIHJldiAlZCBiZWNhdXNlIG9mIG5ldyBmZWF0dXJlIGZsYWcsICIKKwkJICAgICAicnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWQiLAorCQkgICAgIEVYVDJfRFlOQU1JQ19SRVYpOworCisJZXMtPnNfZmlyc3RfaW5vID0gY3B1X3RvX2xlMzIoRVhUMl9HT09EX09MRF9GSVJTVF9JTk8pOworCWVzLT5zX2lub2RlX3NpemUgPSBjcHVfdG9fbGUxNihFWFQyX0dPT0RfT0xEX0lOT0RFX1NJWkUpOworCWVzLT5zX3Jldl9sZXZlbCA9IGNwdV90b19sZTMyKEVYVDJfRFlOQU1JQ19SRVYpOworCS8qIGxlYXZlIGVzLT5zX2ZlYXR1cmVfKmNvbXBhdCBmbGFncyBhbG9uZSAqLworCS8qIGVzLT5zX3V1aWQgd2lsbCBiZSBzZXQgYnkgZTJmc2NrIGlmIGVtcHR5ICovCisKKwkvKgorCSAqIFRoZSByZXN0IG9mIHRoZSBzdXBlcmJsb2NrIGZpZWxkcyBzaG91bGQgYmUgemVybywgYW5kIGlmIG5vdCBpdAorCSAqIG1lYW5zIHRoZXkgYXJlIGxpa2VseSBhbHJlYWR5IGluIHVzZSwgc28gbGVhdmUgdGhlbSBhbG9uZS4gIFdlCisJICogY2FuIGxlYXZlIGl0IHVwIHRvIGUyZnNjayB0byBjbGVhbiB1cCBhbnkgaW5jb25zaXN0ZW5jaWVzIHRoZXJlLgorCSAqLworfQorCitzdGF0aWMgdm9pZCBleHQyX3B1dF9zdXBlciAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpCit7CisJaW50IGRiX2NvdW50OworCWludCBpOworCXN0cnVjdCBleHQyX3NiX2luZm8gKnNiaSA9IEVYVDJfU0Ioc2IpOworCisJZXh0Ml94YXR0cl9wdXRfc3VwZXIoc2IpOworCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQlzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqZXMgPSBzYmktPnNfZXM7CisKKwkJZXMtPnNfc3RhdGUgPSBjcHVfdG9fbGUxNihzYmktPnNfbW91bnRfc3RhdGUpOworCQlleHQyX3N5bmNfc3VwZXIoc2IsIGVzKTsKKwl9CisJZGJfY291bnQgPSBzYmktPnNfZ2RiX2NvdW50OworCWZvciAoaSA9IDA7IGkgPCBkYl9jb3VudDsgaSsrKQorCQlpZiAoc2JpLT5zX2dyb3VwX2Rlc2NbaV0pCisJCQlicmVsc2UgKHNiaS0+c19ncm91cF9kZXNjW2ldKTsKKwlrZnJlZShzYmktPnNfZ3JvdXBfZGVzYyk7CisJa2ZyZWUoc2JpLT5zX2RlYnRzKTsKKwlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyKTsKKwlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZnJlZWlub2Rlc19jb3VudGVyKTsKKwlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZGlyc19jb3VudGVyKTsKKwlicmVsc2UgKHNiaS0+c19zYmgpOworCXNiLT5zX2ZzX2luZm8gPSBOVUxMOworCWtmcmVlKHNiaSk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKiBleHQyX2lub2RlX2NhY2hlcDsKKworc3RhdGljIHN0cnVjdCBpbm9kZSAqZXh0Ml9hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBleHQyX2lub2RlX2luZm8gKmVpOworCWVpID0gKHN0cnVjdCBleHQyX2lub2RlX2luZm8gKilrbWVtX2NhY2hlX2FsbG9jKGV4dDJfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJaWYgKCFlaSkKKwkJcmV0dXJuIE5VTEw7CisjaWZkZWYgQ09ORklHX0VYVDJfRlNfUE9TSVhfQUNMCisJZWktPmlfYWNsID0gRVhUMl9BQ0xfTk9UX0NBQ0hFRDsKKwllaS0+aV9kZWZhdWx0X2FjbCA9IEVYVDJfQUNMX05PVF9DQUNIRUQ7CisjZW5kaWYKKwllaS0+dmZzX2lub2RlLmlfdmVyc2lvbiA9IDE7CisJcmV0dXJuICZlaS0+dmZzX2lub2RlOworfQorCitzdGF0aWMgdm9pZCBleHQyX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlrbWVtX2NhY2hlX2ZyZWUoZXh0Ml9pbm9kZV9jYWNoZXAsIEVYVDJfSShpbm9kZSkpOworfQorCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBleHQyX2lub2RlX2luZm8gKmVpID0gKHN0cnVjdCBleHQyX2lub2RlX2luZm8gKikgZm9vOworCisJaWYgKChmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CisJICAgIFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikgeworCQlyd2xvY2tfaW5pdCgmZWktPmlfbWV0YV9sb2NrKTsKKyNpZmRlZiBDT05GSUdfRVhUMl9GU19YQVRUUgorCQlpbml0X3J3c2VtKCZlaS0+eGF0dHJfc2VtKTsKKyNlbmRpZgorCQlpbm9kZV9pbml0X29uY2UoJmVpLT52ZnNfaW5vZGUpOworCX0KK30KKyAKK3N0YXRpYyBpbnQgaW5pdF9pbm9kZWNhY2hlKHZvaWQpCit7CisJZXh0Ml9pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiZXh0Ml9pbm9kZV9jYWNoZSIsCisJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBleHQyX2lub2RlX2luZm8pLAorCQkJCQkgICAgIDAsIFNMQUJfUkVDTEFJTV9BQ0NPVU5ULAorCQkJCQkgICAgIGluaXRfb25jZSwgTlVMTCk7CisJaWYgKGV4dDJfaW5vZGVfY2FjaGVwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X2lub2RlY2FjaGUodm9pZCkKK3sKKwlpZiAoa21lbV9jYWNoZV9kZXN0cm95KGV4dDJfaW5vZGVfY2FjaGVwKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZXh0Ml9pbm9kZV9jYWNoZTogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOworfQorCitzdGF0aWMgdm9pZCBleHQyX2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisjaWZkZWYgQ09ORklHX0VYVDJfRlNfUE9TSVhfQUNMCisJc3RydWN0IGV4dDJfaW5vZGVfaW5mbyAqZWkgPSBFWFQyX0koaW5vZGUpOworCisJaWYgKGVpLT5pX2FjbCAmJiBlaS0+aV9hY2wgIT0gRVhUMl9BQ0xfTk9UX0NBQ0hFRCkgeworCQlwb3NpeF9hY2xfcmVsZWFzZShlaS0+aV9hY2wpOworCQllaS0+aV9hY2wgPSBFWFQyX0FDTF9OT1RfQ0FDSEVEOworCX0KKwlpZiAoZWktPmlfZGVmYXVsdF9hY2wgJiYgZWktPmlfZGVmYXVsdF9hY2wgIT0gRVhUMl9BQ0xfTk9UX0NBQ0hFRCkgeworCQlwb3NpeF9hY2xfcmVsZWFzZShlaS0+aV9kZWZhdWx0X2FjbCk7CisJCWVpLT5pX2RlZmF1bHRfYWNsID0gRVhUMl9BQ0xfTk9UX0NBQ0hFRDsKKwl9CisjZW5kaWYKKwlpZiAoIWlzX2JhZF9pbm9kZShpbm9kZSkpCisJCWV4dDJfZGlzY2FyZF9wcmVhbGxvYyhpbm9kZSk7Cit9CisKKworI2lmZGVmIENPTkZJR19RVU9UQQorc3RhdGljIHNzaXplX3QgZXh0Ml9xdW90YV9yZWFkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCBjaGFyICpkYXRhLCBzaXplX3QgbGVuLCBsb2ZmX3Qgb2ZmKTsKK3N0YXRpYyBzc2l6ZV90IGV4dDJfcXVvdGFfd3JpdGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW4sIGxvZmZfdCBvZmYpOworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBleHQyX3NvcHMgPSB7CisJLmFsbG9jX2lub2RlCT0gZXh0Ml9hbGxvY19pbm9kZSwKKwkuZGVzdHJveV9pbm9kZQk9IGV4dDJfZGVzdHJveV9pbm9kZSwKKwkucmVhZF9pbm9kZQk9IGV4dDJfcmVhZF9pbm9kZSwKKwkud3JpdGVfaW5vZGUJPSBleHQyX3dyaXRlX2lub2RlLAorCS5kZWxldGVfaW5vZGUJPSBleHQyX2RlbGV0ZV9pbm9kZSwKKwkucHV0X3N1cGVyCT0gZXh0Ml9wdXRfc3VwZXIsCisJLndyaXRlX3N1cGVyCT0gZXh0Ml93cml0ZV9zdXBlciwKKwkuc3RhdGZzCQk9IGV4dDJfc3RhdGZzLAorCS5yZW1vdW50X2ZzCT0gZXh0Ml9yZW1vdW50LAorCS5jbGVhcl9pbm9kZQk9IGV4dDJfY2xlYXJfaW5vZGUsCisjaWZkZWYgQ09ORklHX1FVT1RBCisJLnF1b3RhX3JlYWQJPSBleHQyX3F1b3RhX3JlYWQsCisJLnF1b3RhX3dyaXRlCT0gZXh0Ml9xdW90YV93cml0ZSwKKyNlbmRpZgorfTsKKworLyogWWVzLCBtb3N0IG9mIHRoZXNlIGFyZSBsZWZ0IGFzIE5VTEwhIQorICogQSBOVUxMIHZhbHVlIGltcGxpZXMgdGhlIGRlZmF1bHQsIHdoaWNoIHdvcmtzIHdpdGggZXh0Mi1saWtlIGZpbGUKKyAqIHN5c3RlbXMsIGJ1dCBjYW4gYmUgaW1wcm92ZWQgdXBvbi4KKyAqIEN1cnJlbnRseSBvbmx5IGdldF9wYXJlbnQgaXMgcmVxdWlyZWQuCisgKi8KK3N0cnVjdCBkZW50cnkgKmV4dDJfZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpjaGlsZCk7CitzdGF0aWMgc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIGV4dDJfZXhwb3J0X29wcyA9IHsKKwkuZ2V0X3BhcmVudCA9IGV4dDJfZ2V0X3BhcmVudCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9zYl9ibG9jayh2b2lkICoqZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIAlzYl9ibG9jazsKKwljaGFyIAkJKm9wdGlvbnMgPSAoY2hhciAqKSAqZGF0YTsKKworCWlmICghb3B0aW9ucyB8fCBzdHJuY21wKG9wdGlvbnMsICJzYj0iLCAzKSAhPSAwKQorCQlyZXR1cm4gMTsJLyogRGVmYXVsdCBsb2NhdGlvbiAqLworCW9wdGlvbnMgKz0gMzsKKwlzYl9ibG9jayA9IHNpbXBsZV9zdHJ0b3VsKG9wdGlvbnMsICZvcHRpb25zLCAwKTsKKwlpZiAoKm9wdGlvbnMgJiYgKm9wdGlvbnMgIT0gJywnKSB7CisJCXByaW50aygiRVhUMi1mczogSW52YWxpZCBzYiBzcGVjaWZpY2F0aW9uOiAlc1xuIiwKKwkJICAgICAgIChjaGFyICopICpkYXRhKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmICgqb3B0aW9ucyA9PSAnLCcpCisJCW9wdGlvbnMrKzsKKwkqZGF0YSA9ICh2b2lkICopIG9wdGlvbnM7CisJcmV0dXJuIHNiX2Jsb2NrOworfQorCitlbnVtIHsKKwlPcHRfYnNkX2RmLCBPcHRfbWluaXhfZGYsIE9wdF9ncnBpZCwgT3B0X25vZ3JwaWQsCisJT3B0X3Jlc2dpZCwgT3B0X3Jlc3VpZCwgT3B0X3NiLCBPcHRfZXJyX2NvbnQsIE9wdF9lcnJfcGFuaWMsIE9wdF9lcnJfcm8sCisJT3B0X25vdWlkMzIsIE9wdF9jaGVjaywgT3B0X25vY2hlY2ssIE9wdF9kZWJ1ZywgT3B0X29sZGFsbG9jLCBPcHRfb3Jsb3YsIE9wdF9ub2JoLAorCU9wdF91c2VyX3hhdHRyLCBPcHRfbm91c2VyX3hhdHRyLCBPcHRfYWNsLCBPcHRfbm9hY2wsCisJT3B0X2lnbm9yZSwgT3B0X2VyciwKK307CisKK3N0YXRpYyBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKKwl7T3B0X2JzZF9kZiwgImJzZGRmIn0sCisJe09wdF9taW5peF9kZiwgIm1pbml4ZGYifSwKKwl7T3B0X2dycGlkLCAiZ3JwaWQifSwKKwl7T3B0X2dycGlkLCAiYnNkZ3JvdXBzIn0sCisJe09wdF9ub2dycGlkLCAibm9ncnBpZCJ9LAorCXtPcHRfbm9ncnBpZCwgInN5c3Zncm91cHMifSwKKwl7T3B0X3Jlc2dpZCwgInJlc2dpZD0ldSJ9LAorCXtPcHRfcmVzdWlkLCAicmVzdWlkPSV1In0sCisJe09wdF9zYiwgInNiPSV1In0sCisJe09wdF9lcnJfY29udCwgImVycm9ycz1jb250aW51ZSJ9LAorCXtPcHRfZXJyX3BhbmljLCAiZXJyb3JzPXBhbmljIn0sCisJe09wdF9lcnJfcm8sICJlcnJvcnM9cmVtb3VudC1ybyJ9LAorCXtPcHRfbm91aWQzMiwgIm5vdWlkMzIifSwKKwl7T3B0X25vY2hlY2ssICJjaGVjaz1ub25lIn0sCisJe09wdF9ub2NoZWNrLCAibm9jaGVjayJ9LAorCXtPcHRfY2hlY2ssICJjaGVjayJ9LAorCXtPcHRfZGVidWcsICJkZWJ1ZyJ9LAorCXtPcHRfb2xkYWxsb2MsICJvbGRhbGxvYyJ9LAorCXtPcHRfb3Jsb3YsICJvcmxvdiJ9LAorCXtPcHRfbm9iaCwgIm5vYmgifSwKKwl7T3B0X3VzZXJfeGF0dHIsICJ1c2VyX3hhdHRyIn0sCisJe09wdF9ub3VzZXJfeGF0dHIsICJub3VzZXJfeGF0dHIifSwKKwl7T3B0X2FjbCwgImFjbCJ9LAorCXtPcHRfbm9hY2wsICJub2FjbCJ9LAorCXtPcHRfaWdub3JlLCAiZ3JwcXVvdGEifSwKKwl7T3B0X2lnbm9yZSwgIm5vcXVvdGEifSwKKwl7T3B0X2lnbm9yZSwgInF1b3RhIn0sCisJe09wdF9pZ25vcmUsICJ1c3JxdW90YSJ9LAorCXtPcHRfZXJyLCBOVUxMfQorfTsKKworc3RhdGljIGludCBwYXJzZV9vcHRpb25zIChjaGFyICogb3B0aW9ucywKKwkJCSAgc3RydWN0IGV4dDJfc2JfaW5mbyAqc2JpKQoreworCWNoYXIgKiBwOworCXN1YnN0cmluZ190IGFyZ3NbTUFYX09QVF9BUkdTXTsKKwl1bnNpZ25lZCBsb25nIGtpbmQgPSBFWFQyX01PVU5UX0VSUk9SU19DT05UOworCWludCBvcHRpb247CisKKwlpZiAoIW9wdGlvbnMpCisJCXJldHVybiAxOworCisJd2hpbGUgKChwID0gc3Ryc2VwICgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgeworCQlpbnQgdG9rZW47CisJCWlmICghKnApCisJCQljb250aW51ZTsKKworCQl0b2tlbiA9IG1hdGNoX3Rva2VuKHAsIHRva2VucywgYXJncyk7CisJCXN3aXRjaCAodG9rZW4pIHsKKwkJY2FzZSBPcHRfYnNkX2RmOgorCQkJY2xlYXJfb3B0IChzYmktPnNfbW91bnRfb3B0LCBNSU5JWF9ERik7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbWluaXhfZGY6CisJCQlzZXRfb3B0IChzYmktPnNfbW91bnRfb3B0LCBNSU5JWF9ERik7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZ3JwaWQ6CisJCQlzZXRfb3B0IChzYmktPnNfbW91bnRfb3B0LCBHUlBJRCk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm9ncnBpZDoKKwkJCWNsZWFyX29wdCAoc2JpLT5zX21vdW50X29wdCwgR1JQSUQpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3Jlc3VpZDoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAwOworCQkJc2JpLT5zX3Jlc3VpZCA9IG9wdGlvbjsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9yZXNnaWQ6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMDsKKwkJCXNiaS0+c19yZXNnaWQgPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfc2I6CisJCQkvKiBoYW5kbGVkIGJ5IGdldF9zYl9ibG9jaygpIGluc3RlYWQgb2YgaGVyZSAqLworCQkJLyogKnNiX2Jsb2NrID0gbWF0Y2hfaW50KCZhcmdzWzBdKTsgKi8KKwkJCWJyZWFrOworCQljYXNlIE9wdF9lcnJfcGFuaWM6CisJCQlraW5kID0gRVhUMl9NT1VOVF9FUlJPUlNfUEFOSUM7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZXJyX3JvOgorCQkJa2luZCA9IEVYVDJfTU9VTlRfRVJST1JTX1JPOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2Vycl9jb250OgorCQkJa2luZCA9IEVYVDJfTU9VTlRfRVJST1JTX0NPTlQ7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm91aWQzMjoKKwkJCXNldF9vcHQgKHNiaS0+c19tb3VudF9vcHQsIE5PX1VJRDMyKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9jaGVjazoKKyNpZmRlZiBDT05GSUdfRVhUMl9DSEVDSworCQkJc2V0X29wdCAoc2JpLT5zX21vdW50X29wdCwgQ0hFQ0spOworI2Vsc2UKKwkJCXByaW50aygiRVhUMiBDaGVjayBvcHRpb24gbm90IHN1cHBvcnRlZFxuIik7CisjZW5kaWYKKwkJCWJyZWFrOworCQljYXNlIE9wdF9ub2NoZWNrOgorCQkJY2xlYXJfb3B0IChzYmktPnNfbW91bnRfb3B0LCBDSEVDSyk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZGVidWc6CisJCQlzZXRfb3B0IChzYmktPnNfbW91bnRfb3B0LCBERUJVRyk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfb2xkYWxsb2M6CisJCQlzZXRfb3B0IChzYmktPnNfbW91bnRfb3B0LCBPTERBTExPQyk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfb3Jsb3Y6CisJCQljbGVhcl9vcHQgKHNiaS0+c19tb3VudF9vcHQsIE9MREFMTE9DKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9ub2JoOgorCQkJc2V0X29wdCAoc2JpLT5zX21vdW50X29wdCwgTk9CSCk7CisJCQlicmVhazsKKyNpZmRlZiBDT05GSUdfRVhUMl9GU19YQVRUUgorCQljYXNlIE9wdF91c2VyX3hhdHRyOgorCQkJc2V0X29wdCAoc2JpLT5zX21vdW50X29wdCwgWEFUVFJfVVNFUik7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm91c2VyX3hhdHRyOgorCQkJY2xlYXJfb3B0IChzYmktPnNfbW91bnRfb3B0LCBYQVRUUl9VU0VSKTsKKwkJCWJyZWFrOworI2Vsc2UKKwkJY2FzZSBPcHRfdXNlcl94YXR0cjoKKwkJY2FzZSBPcHRfbm91c2VyX3hhdHRyOgorCQkJcHJpbnRrKCJFWFQyIChubyl1c2VyX3hhdHRyIG9wdGlvbnMgbm90IHN1cHBvcnRlZFxuIik7CisJCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19FWFQyX0ZTX1BPU0lYX0FDTAorCQljYXNlIE9wdF9hY2w6CisJCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIFBPU0lYX0FDTCk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm9hY2w6CisJCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgUE9TSVhfQUNMKTsKKwkJCWJyZWFrOworI2Vsc2UKKwkJY2FzZSBPcHRfYWNsOgorCQljYXNlIE9wdF9ub2FjbDoKKwkJCXByaW50aygiRVhUMiAobm8pYWNsIG9wdGlvbnMgbm90IHN1cHBvcnRlZFxuIik7CisJCQlicmVhazsKKyNlbmRpZgorCQljYXNlIE9wdF9pZ25vcmU6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCQl9CisJfQorCXNiaS0+c19tb3VudF9vcHQgfD0ga2luZDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBleHQyX3NldHVwX3N1cGVyIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwkJCSAgICAgIHN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICogZXMsCisJCQkgICAgICBpbnQgcmVhZF9vbmx5KQoreworCWludCByZXMgPSAwOworCXN0cnVjdCBleHQyX3NiX2luZm8gKnNiaSA9IEVYVDJfU0Ioc2IpOworCisJaWYgKGxlMzJfdG9fY3B1KGVzLT5zX3Jldl9sZXZlbCkgPiBFWFQyX01BWF9TVVBQX1JFVikgeworCQlwcmludGsgKCJFWFQyLWZzIHdhcm5pbmc6IHJldmlzaW9uIGxldmVsIHRvbyBoaWdoLCAiCisJCQkiZm9yY2luZyByZWFkLW9ubHkgbW9kZVxuIik7CisJCXJlcyA9IE1TX1JET05MWTsKKwl9CisJaWYgKHJlYWRfb25seSkKKwkJcmV0dXJuIHJlczsKKwlpZiAoIShzYmktPnNfbW91bnRfc3RhdGUgJiBFWFQyX1ZBTElEX0ZTKSkKKwkJcHJpbnRrICgiRVhUMi1mcyB3YXJuaW5nOiBtb3VudGluZyB1bmNoZWNrZWQgZnMsICIKKwkJCSJydW5uaW5nIGUyZnNjayBpcyByZWNvbW1lbmRlZFxuIik7CisJZWxzZSBpZiAoKHNiaS0+c19tb3VudF9zdGF0ZSAmIEVYVDJfRVJST1JfRlMpKQorCQlwcmludGsgKCJFWFQyLWZzIHdhcm5pbmc6IG1vdW50aW5nIGZzIHdpdGggZXJyb3JzLCAiCisJCQkicnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWRcbiIpOworCWVsc2UgaWYgKChfX3MxNikgbGUxNl90b19jcHUoZXMtPnNfbWF4X21udF9jb3VudCkgPj0gMCAmJgorCQkgbGUxNl90b19jcHUoZXMtPnNfbW50X2NvdW50KSA+PQorCQkgKHVuc2lnbmVkIHNob3J0KSAoX19zMTYpIGxlMTZfdG9fY3B1KGVzLT5zX21heF9tbnRfY291bnQpKQorCQlwcmludGsgKCJFWFQyLWZzIHdhcm5pbmc6IG1heGltYWwgbW91bnQgY291bnQgcmVhY2hlZCwgIgorCQkJInJ1bm5pbmcgZTJmc2NrIGlzIHJlY29tbWVuZGVkXG4iKTsKKwllbHNlIGlmIChsZTMyX3RvX2NwdShlcy0+c19jaGVja2ludGVydmFsKSAmJgorCQkobGUzMl90b19jcHUoZXMtPnNfbGFzdGNoZWNrKSArIGxlMzJfdG9fY3B1KGVzLT5zX2NoZWNraW50ZXJ2YWwpIDw9IGdldF9zZWNvbmRzKCkpKQorCQlwcmludGsgKCJFWFQyLWZzIHdhcm5pbmc6IGNoZWNrdGltZSByZWFjaGVkLCAiCisJCQkicnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWRcbiIpOworCWlmICghbGUxNl90b19jcHUoZXMtPnNfbWF4X21udF9jb3VudCkpCisJCWVzLT5zX21heF9tbnRfY291bnQgPSBjcHVfdG9fbGUxNihFWFQyX0RGTF9NQVhfTU5UX0NPVU5UKTsKKwllcy0+c19tbnRfY291bnQ9Y3B1X3RvX2xlMTYobGUxNl90b19jcHUoZXMtPnNfbW50X2NvdW50KSArIDEpOworCWV4dDJfd3JpdGVfc3VwZXIoc2IpOworCWlmICh0ZXN0X29wdCAoc2IsIERFQlVHKSkKKwkJcHJpbnRrICgiW0VYVCBJSSBGUyAlcywgJXMsIGJzPSVsdSwgZnM9JWx1LCBnYz0lbHUsICIKKwkJCSJicGc9JWx1LCBpcGc9JWx1LCBtbz0lMDRseF1cbiIsCisJCQlFWFQyRlNfVkVSU0lPTiwgRVhUMkZTX0RBVEUsIHNiLT5zX2Jsb2Nrc2l6ZSwKKwkJCXNiaS0+c19mcmFnX3NpemUsCisJCQlzYmktPnNfZ3JvdXBzX2NvdW50LAorCQkJRVhUMl9CTE9DS1NfUEVSX0dST1VQKHNiKSwKKwkJCUVYVDJfSU5PREVTX1BFUl9HUk9VUChzYiksCisJCQlzYmktPnNfbW91bnRfb3B0KTsKKyNpZmRlZiBDT05GSUdfRVhUMl9DSEVDSworCWlmICh0ZXN0X29wdCAoc2IsIENIRUNLKSkgeworCQlleHQyX2NoZWNrX2Jsb2Nrc19iaXRtYXAgKHNiKTsKKwkJZXh0Ml9jaGVja19pbm9kZXNfYml0bWFwIChzYik7CisJfQorI2VuZGlmCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBleHQyX2NoZWNrX2Rlc2NyaXB0b3JzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYikKK3sKKwlpbnQgaTsKKwlpbnQgZGVzY19ibG9jayA9IDA7CisJc3RydWN0IGV4dDJfc2JfaW5mbyAqc2JpID0gRVhUMl9TQihzYik7CisJdW5zaWduZWQgbG9uZyBibG9jayA9IGxlMzJfdG9fY3B1KHNiaS0+c19lcy0+c19maXJzdF9kYXRhX2Jsb2NrKTsKKwlzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjICogZ2RwID0gTlVMTDsKKworCWV4dDJfZGVidWcgKCJDaGVja2luZyBncm91cCBkZXNjcmlwdG9ycyIpOworCisJZm9yIChpID0gMDsgaSA8IHNiaS0+c19ncm91cHNfY291bnQ7IGkrKykKKwl7CisJCWlmICgoaSAlIEVYVDJfREVTQ19QRVJfQkxPQ0soc2IpKSA9PSAwKQorCQkJZ2RwID0gKHN0cnVjdCBleHQyX2dyb3VwX2Rlc2MgKikgc2JpLT5zX2dyb3VwX2Rlc2NbZGVzY19ibG9jaysrXS0+Yl9kYXRhOworCQlpZiAobGUzMl90b19jcHUoZ2RwLT5iZ19ibG9ja19iaXRtYXApIDwgYmxvY2sgfHwKKwkJICAgIGxlMzJfdG9fY3B1KGdkcC0+YmdfYmxvY2tfYml0bWFwKSA+PSBibG9jayArIEVYVDJfQkxPQ0tTX1BFUl9HUk9VUChzYikpCisJCXsKKwkJCWV4dDJfZXJyb3IgKHNiLCAiZXh0Ml9jaGVja19kZXNjcmlwdG9ycyIsCisJCQkJICAgICJCbG9jayBiaXRtYXAgZm9yIGdyb3VwICVkIgorCQkJCSAgICAiIG5vdCBpbiBncm91cCAoYmxvY2sgJWx1KSEiLAorCQkJCSAgICBpLCAodW5zaWduZWQgbG9uZykgbGUzMl90b19jcHUoZ2RwLT5iZ19ibG9ja19iaXRtYXApKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChsZTMyX3RvX2NwdShnZHAtPmJnX2lub2RlX2JpdG1hcCkgPCBibG9jayB8fAorCQkgICAgbGUzMl90b19jcHUoZ2RwLT5iZ19pbm9kZV9iaXRtYXApID49IGJsb2NrICsgRVhUMl9CTE9DS1NfUEVSX0dST1VQKHNiKSkKKwkJeworCQkJZXh0Ml9lcnJvciAoc2IsICJleHQyX2NoZWNrX2Rlc2NyaXB0b3JzIiwKKwkJCQkgICAgIklub2RlIGJpdG1hcCBmb3IgZ3JvdXAgJWQiCisJCQkJICAgICIgbm90IGluIGdyb3VwIChibG9jayAlbHUpISIsCisJCQkJICAgIGksICh1bnNpZ25lZCBsb25nKSBsZTMyX3RvX2NwdShnZHAtPmJnX2lub2RlX2JpdG1hcCkpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGxlMzJfdG9fY3B1KGdkcC0+YmdfaW5vZGVfdGFibGUpIDwgYmxvY2sgfHwKKwkJICAgIGxlMzJfdG9fY3B1KGdkcC0+YmdfaW5vZGVfdGFibGUpICsgc2JpLT5zX2l0Yl9wZXJfZ3JvdXAgPj0KKwkJICAgIGJsb2NrICsgRVhUMl9CTE9DS1NfUEVSX0dST1VQKHNiKSkKKwkJeworCQkJZXh0Ml9lcnJvciAoc2IsICJleHQyX2NoZWNrX2Rlc2NyaXB0b3JzIiwKKwkJCQkgICAgIklub2RlIHRhYmxlIGZvciBncm91cCAlZCIKKwkJCQkgICAgIiBub3QgaW4gZ3JvdXAgKGJsb2NrICVsdSkhIiwKKwkJCQkgICAgaSwgKHVuc2lnbmVkIGxvbmcpIGxlMzJfdG9fY3B1KGdkcC0+YmdfaW5vZGVfdGFibGUpKTsKKwkJCXJldHVybiAwOworCQl9CisJCWJsb2NrICs9IEVYVDJfQkxPQ0tTX1BFUl9HUk9VUChzYik7CisJCWdkcCsrOworCX0KKwlyZXR1cm4gMTsKK30KKworI2RlZmluZSBsb2cyKG4pIGZmeih+KG4pKQorIAorLyoKKyAqIE1heGltYWwgZmlsZSBzaXplLiAgVGhlcmUgaXMgYSBkaXJlY3QsIGFuZCB7LGRvdWJsZS0sdHJpcGxlLX1pbmRpcmVjdAorICogYmxvY2sgbGltaXQsIGFuZCBhbHNvIGEgbGltaXQgb2YgKDJeMzIgLSAxKSA1MTItYnl0ZSBzZWN0b3JzIGluIGlfYmxvY2tzLgorICogV2UgbmVlZCB0byBiZSAxIGZpbGVzeXN0ZW0gYmxvY2sgbGVzcyB0aGFuIHRoZSAyXjMyIHNlY3RvciBsaW1pdC4KKyAqLworc3RhdGljIGxvZmZfdCBleHQyX21heF9zaXplKGludCBiaXRzKQoreworCWxvZmZfdCByZXMgPSBFWFQyX05ESVJfQkxPQ0tTOworCS8qIFRoaXMgY29uc3RhbnQgaXMgY2FsY3VsYXRlZCB0byBiZSB0aGUgbGFyZ2VzdCBmaWxlIHNpemUgZm9yIGEKKwkgKiBkZW5zZSwgNGstYmxvY2tzaXplIGZpbGUgc3VjaCB0aGF0IHRoZSB0b3RhbCBudW1iZXIgb2YKKwkgKiBzZWN0b3JzIGluIHRoZSBmaWxlLCBpbmNsdWRpbmcgZGF0YSBhbmQgYWxsIGluZGlyZWN0IGJsb2NrcywKKwkgKiBkb2VzIG5vdCBleGNlZWQgMl4zMi4gKi8KKwljb25zdCBsb2ZmX3QgdXBwZXJfbGltaXQgPSAweDFmZjdmZmZkMDAwTEw7CisKKwlyZXMgKz0gMUxMIDw8IChiaXRzLTIpOworCXJlcyArPSAxTEwgPDwgKDIqKGJpdHMtMikpOworCXJlcyArPSAxTEwgPDwgKDMqKGJpdHMtMikpOworCXJlcyA8PD0gYml0czsKKwlpZiAocmVzID4gdXBwZXJfbGltaXQpCisJCXJlcyA9IHVwcGVyX2xpbWl0OworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRlc2NyaXB0b3JfbG9jKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgbG9naWNfc2JfYmxvY2ssCisJCQkJICAgIGludCBucikKK3sKKwlzdHJ1Y3QgZXh0Ml9zYl9pbmZvICpzYmkgPSBFWFQyX1NCKHNiKTsKKwl1bnNpZ25lZCBsb25nIGJnLCBmaXJzdF9kYXRhX2Jsb2NrLCBmaXJzdF9tZXRhX2JnOworCWludCBoYXNfc3VwZXIgPSAwOworCQorCWZpcnN0X2RhdGFfYmxvY2sgPSBsZTMyX3RvX2NwdShzYmktPnNfZXMtPnNfZmlyc3RfZGF0YV9ibG9jayk7CisJZmlyc3RfbWV0YV9iZyA9IGxlMzJfdG9fY3B1KHNiaS0+c19lcy0+c19maXJzdF9tZXRhX2JnKTsKKworCWlmICghRVhUMl9IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX01FVEFfQkcpIHx8CisJICAgIG5yIDwgZmlyc3RfbWV0YV9iZykKKwkJcmV0dXJuIChsb2dpY19zYl9ibG9jayArIG5yICsgMSk7CisJYmcgPSBzYmktPnNfZGVzY19wZXJfYmxvY2sgKiBucjsKKwlpZiAoZXh0Ml9iZ19oYXNfc3VwZXIoc2IsIGJnKSkKKwkJaGFzX3N1cGVyID0gMTsKKwlyZXR1cm4gKGZpcnN0X2RhdGFfYmxvY2sgKyBoYXNfc3VwZXIgKyAoYmcgKiBzYmktPnNfYmxvY2tzX3Blcl9ncm91cCkpOworfQorCitzdGF0aWMgaW50IGV4dDJfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXN0cnVjdCBleHQyX3NiX2luZm8gKiBzYmk7CisJc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKiBlczsKKwlzdHJ1Y3QgaW5vZGUgKnJvb3Q7CisJdW5zaWduZWQgbG9uZyBibG9jazsKKwl1bnNpZ25lZCBsb25nIHNiX2Jsb2NrID0gZ2V0X3NiX2Jsb2NrKCZkYXRhKTsKKwl1bnNpZ25lZCBsb25nIGxvZ2ljX3NiX2Jsb2NrOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGRlZl9tb3VudF9vcHRzOworCWludCBibG9ja3NpemUgPSBCTE9DS19TSVpFOworCWludCBkYl9jb3VudDsKKwlpbnQgaSwgajsKKwlfX2xlMzIgZmVhdHVyZXM7CisKKwlzYmkgPSBrbWFsbG9jKHNpemVvZigqc2JpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYmkpCisJCXJldHVybiAtRU5PTUVNOworCXNiLT5zX2ZzX2luZm8gPSBzYmk7CisJbWVtc2V0KHNiaSwgMCwgc2l6ZW9mKCpzYmkpKTsKKworCS8qCisJICogU2VlIHdoYXQgdGhlIGN1cnJlbnQgYmxvY2tzaXplIGZvciB0aGUgZGV2aWNlIGlzLCBhbmQKKwkgKiB1c2UgdGhhdCBhcyB0aGUgYmxvY2tzaXplLiAgT3RoZXJ3aXNlIChvciBpZiB0aGUgYmxvY2tzaXplCisJICogaXMgc21hbGxlciB0aGFuIHRoZSBkZWZhdWx0KSB1c2UgdGhlIGRlZmF1bHQuCisJICogVGhpcyBpcyBpbXBvcnRhbnQgZm9yIGRldmljZXMgdGhhdCBoYXZlIGEgaGFyZHdhcmUKKwkgKiBzZWN0b3JzaXplIHRoYXQgaXMgbGFyZ2VyIHRoYW4gdGhlIGRlZmF1bHQuCisJICovCisJYmxvY2tzaXplID0gc2JfbWluX2Jsb2Nrc2l6ZShzYiwgQkxPQ0tfU0laRSk7CisJaWYgKCFibG9ja3NpemUpIHsKKwkJcHJpbnRrICgiRVhUMi1mczogdW5hYmxlIHRvIHNldCBibG9ja3NpemVcbiIpOworCQlnb3RvIGZhaWxlZF9zYmk7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgc3VwZXJibG9jayBkb2Vzbid0IHN0YXJ0IG9uIGEgaGFyZHdhcmUgc2VjdG9yIGJvdW5kYXJ5LAorCSAqIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0LiAgCisJICovCisJaWYgKGJsb2Nrc2l6ZSAhPSBCTE9DS19TSVpFKSB7CisJCWxvZ2ljX3NiX2Jsb2NrID0gKHNiX2Jsb2NrKkJMT0NLX1NJWkUpIC8gYmxvY2tzaXplOworCQlvZmZzZXQgPSAoc2JfYmxvY2sqQkxPQ0tfU0laRSkgJSBibG9ja3NpemU7CisJfSBlbHNlIHsKKwkJbG9naWNfc2JfYmxvY2sgPSBzYl9ibG9jazsKKwl9CisKKwlpZiAoIShiaCA9IHNiX2JyZWFkKHNiLCBsb2dpY19zYl9ibG9jaykpKSB7CisJCXByaW50ayAoIkVYVDItZnM6IHVuYWJsZSB0byByZWFkIHN1cGVyYmxvY2tcbiIpOworCQlnb3RvIGZhaWxlZF9zYmk7CisJfQorCS8qCisJICogTm90ZTogc19lcyBtdXN0IGJlIGluaXRpYWxpemVkIGFzIHNvb24gYXMgcG9zc2libGUgYmVjYXVzZQorCSAqICAgICAgIHNvbWUgZXh0MiBtYWNyby1pbnN0cnVjdGlvbnMgZGVwZW5kIG9uIGl0cyB2YWx1ZQorCSAqLworCWVzID0gKHN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICopICgoKGNoYXIgKiliaC0+Yl9kYXRhKSArIG9mZnNldCk7CisJc2JpLT5zX2VzID0gZXM7CisJc2ItPnNfbWFnaWMgPSBsZTE2X3RvX2NwdShlcy0+c19tYWdpYyk7CisKKwlpZiAoc2ItPnNfbWFnaWMgIT0gRVhUMl9TVVBFUl9NQUdJQykKKwkJZ290byBjYW50ZmluZF9leHQyOworCisJLyogU2V0IGRlZmF1bHRzIGJlZm9yZSB3ZSBwYXJzZSB0aGUgbW91bnQgb3B0aW9ucyAqLworCWRlZl9tb3VudF9vcHRzID0gbGUzMl90b19jcHUoZXMtPnNfZGVmYXVsdF9tb3VudF9vcHRzKTsKKwlpZiAoZGVmX21vdW50X29wdHMgJiBFWFQyX0RFRk1fREVCVUcpCisJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgREVCVUcpOworCWlmIChkZWZfbW91bnRfb3B0cyAmIEVYVDJfREVGTV9CU0RHUk9VUFMpCisJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgR1JQSUQpOworCWlmIChkZWZfbW91bnRfb3B0cyAmIEVYVDJfREVGTV9VSUQxNikKKwkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBOT19VSUQzMik7CisJaWYgKGRlZl9tb3VudF9vcHRzICYgRVhUMl9ERUZNX1hBVFRSX1VTRVIpCisJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgWEFUVFJfVVNFUik7CisJaWYgKGRlZl9tb3VudF9vcHRzICYgRVhUMl9ERUZNX0FDTCkKKwkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBQT1NJWF9BQ0wpOworCQorCWlmIChsZTE2X3RvX2NwdShzYmktPnNfZXMtPnNfZXJyb3JzKSA9PSBFWFQyX0VSUk9SU19QQU5JQykKKwkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBFUlJPUlNfUEFOSUMpOworCWVsc2UgaWYgKGxlMTZfdG9fY3B1KHNiaS0+c19lcy0+c19lcnJvcnMpID09IEVYVDJfRVJST1JTX1JPKQorCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIEVSUk9SU19STyk7CisKKwlzYmktPnNfcmVzdWlkID0gbGUxNl90b19jcHUoZXMtPnNfZGVmX3Jlc3VpZCk7CisJc2JpLT5zX3Jlc2dpZCA9IGxlMTZfdG9fY3B1KGVzLT5zX2RlZl9yZXNnaWQpOworCQorCWlmICghcGFyc2Vfb3B0aW9ucyAoKGNoYXIgKikgZGF0YSwgc2JpKSkKKwkJZ290byBmYWlsZWRfbW91bnQ7CisKKwlzYi0+c19mbGFncyA9IChzYi0+c19mbGFncyAmIH5NU19QT1NJWEFDTCkgfAorCQkoKEVYVDJfU0Ioc2IpLT5zX21vdW50X29wdCAmIEVYVDJfTU9VTlRfUE9TSVhfQUNMKSA/CisJCSBNU19QT1NJWEFDTCA6IDApOworCisJaWYgKGxlMzJfdG9fY3B1KGVzLT5zX3Jldl9sZXZlbCkgPT0gRVhUMl9HT09EX09MRF9SRVYgJiYKKwkgICAgKEVYVDJfSEFTX0NPTVBBVF9GRUFUVVJFKHNiLCB+MFUpIHx8CisJICAgICBFWFQyX0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwgfjBVKSB8fAorCSAgICAgRVhUMl9IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgfjBVKSkpCisJCXByaW50aygiRVhUMi1mcyB3YXJuaW5nOiBmZWF0dXJlIGZsYWdzIHNldCBvbiByZXYgMCBmcywgIgorCQkgICAgICAgInJ1bm5pbmcgZTJmc2NrIGlzIHJlY29tbWVuZGVkXG4iKTsKKwkvKgorCSAqIENoZWNrIGZlYXR1cmUgZmxhZ3MgcmVnYXJkbGVzcyBvZiB0aGUgcmV2aXNpb24gbGV2ZWwsIHNpbmNlIHdlCisJICogcHJldmlvdXNseSBkaWRuJ3QgY2hhbmdlIHRoZSByZXZpc2lvbiBsZXZlbCB3aGVuIHNldHRpbmcgdGhlIGZsYWdzLAorCSAqIHNvIHRoZXJlIGlzIGEgY2hhbmNlIGluY29tcGF0IGZsYWdzIGFyZSBzZXQgb24gYSByZXYgMCBmaWxlc3lzdGVtLgorCSAqLworCWZlYXR1cmVzID0gRVhUMl9IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgfkVYVDJfRkVBVFVSRV9JTkNPTVBBVF9TVVBQKTsKKwlpZiAoZmVhdHVyZXMpIHsKKwkJcHJpbnRrKCJFWFQyLWZzOiAlczogY291bGRuJ3QgbW91bnQgYmVjYXVzZSBvZiAiCisJCSAgICAgICAidW5zdXBwb3J0ZWQgb3B0aW9uYWwgZmVhdHVyZXMgKCV4KS5cbiIsCisJCSAgICAgICBzYi0+c19pZCwgbGUzMl90b19jcHUoZmVhdHVyZXMpKTsKKwkJZ290byBmYWlsZWRfbW91bnQ7CisJfQorCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSAmJgorCSAgICAoZmVhdHVyZXMgPSBFWFQyX0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwgfkVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1VQUCkpKXsKKwkJcHJpbnRrKCJFWFQyLWZzOiAlczogY291bGRuJ3QgbW91bnQgUkRXUiBiZWNhdXNlIG9mICIKKwkJICAgICAgICJ1bnN1cHBvcnRlZCBvcHRpb25hbCBmZWF0dXJlcyAoJXgpLlxuIiwKKwkJICAgICAgIHNiLT5zX2lkLCBsZTMyX3RvX2NwdShmZWF0dXJlcykpOworCQlnb3RvIGZhaWxlZF9tb3VudDsKKwl9CisKKwlibG9ja3NpemUgPSBCTE9DS19TSVpFIDw8IGxlMzJfdG9fY3B1KHNiaS0+c19lcy0+c19sb2dfYmxvY2tfc2l6ZSk7CisKKwkvKiBJZiB0aGUgYmxvY2tzaXplIGRvZXNuJ3QgbWF0Y2gsIHJlLXJlYWQgdGhlIHRoaW5nLi4gKi8KKwlpZiAoc2ItPnNfYmxvY2tzaXplICE9IGJsb2Nrc2l6ZSkgeworCQlicmVsc2UoYmgpOworCisJCWlmICghc2Jfc2V0X2Jsb2Nrc2l6ZShzYiwgYmxvY2tzaXplKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQyLWZzOiBibG9ja3NpemUgdG9vIHNtYWxsIGZvciBkZXZpY2UuXG4iKTsKKwkJCWdvdG8gZmFpbGVkX3NiaTsKKwkJfQorCisJCWxvZ2ljX3NiX2Jsb2NrID0gKHNiX2Jsb2NrKkJMT0NLX1NJWkUpIC8gYmxvY2tzaXplOworCQlvZmZzZXQgPSAoc2JfYmxvY2sqQkxPQ0tfU0laRSkgJSBibG9ja3NpemU7CisJCWJoID0gc2JfYnJlYWQoc2IsIGxvZ2ljX3NiX2Jsb2NrKTsKKwkJaWYoIWJoKSB7CisJCQlwcmludGsoIkVYVDItZnM6IENvdWxkbid0IHJlYWQgc3VwZXJibG9jayBvbiAiCisJCQkgICAgICAgIjJuZCB0cnkuXG4iKTsKKwkJCWdvdG8gZmFpbGVkX3NiaTsKKwkJfQorCQllcyA9IChzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqKSAoKChjaGFyICopYmgtPmJfZGF0YSkgKyBvZmZzZXQpOworCQlzYmktPnNfZXMgPSBlczsKKwkJaWYgKGVzLT5zX21hZ2ljICE9IGNwdV90b19sZTE2KEVYVDJfU1VQRVJfTUFHSUMpKSB7CisJCQlwcmludGsgKCJFWFQyLWZzOiBNYWdpYyBtaXNtYXRjaCwgdmVyeSB3ZWlyZCAhXG4iKTsKKwkJCWdvdG8gZmFpbGVkX21vdW50OworCQl9CisJfQorCisJc2ItPnNfbWF4Ynl0ZXMgPSBleHQyX21heF9zaXplKHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKworCWlmIChsZTMyX3RvX2NwdShlcy0+c19yZXZfbGV2ZWwpID09IEVYVDJfR09PRF9PTERfUkVWKSB7CisJCXNiaS0+c19pbm9kZV9zaXplID0gRVhUMl9HT09EX09MRF9JTk9ERV9TSVpFOworCQlzYmktPnNfZmlyc3RfaW5vID0gRVhUMl9HT09EX09MRF9GSVJTVF9JTk87CisJfSBlbHNlIHsKKwkJc2JpLT5zX2lub2RlX3NpemUgPSBsZTE2X3RvX2NwdShlcy0+c19pbm9kZV9zaXplKTsKKwkJc2JpLT5zX2ZpcnN0X2lubyA9IGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2lubyk7CisJCWlmICgoc2JpLT5zX2lub2RlX3NpemUgPCBFWFQyX0dPT0RfT0xEX0lOT0RFX1NJWkUpIHx8CisJCSAgICAoc2JpLT5zX2lub2RlX3NpemUgJiAoc2JpLT5zX2lub2RlX3NpemUgLSAxKSkgfHwKKwkJICAgIChzYmktPnNfaW5vZGVfc2l6ZSA+IGJsb2Nrc2l6ZSkpIHsKKwkJCXByaW50ayAoIkVYVDItZnM6IHVuc3VwcG9ydGVkIGlub2RlIHNpemU6ICVkXG4iLAorCQkJCXNiaS0+c19pbm9kZV9zaXplKTsKKwkJCWdvdG8gZmFpbGVkX21vdW50OworCQl9CisJfQorCisJc2JpLT5zX2ZyYWdfc2l6ZSA9IEVYVDJfTUlOX0ZSQUdfU0laRSA8PAorCQkJCSAgIGxlMzJfdG9fY3B1KGVzLT5zX2xvZ19mcmFnX3NpemUpOworCWlmIChzYmktPnNfZnJhZ19zaXplID09IDApCisJCWdvdG8gY2FudGZpbmRfZXh0MjsKKwlzYmktPnNfZnJhZ3NfcGVyX2Jsb2NrID0gc2ItPnNfYmxvY2tzaXplIC8gc2JpLT5zX2ZyYWdfc2l6ZTsKKworCXNiaS0+c19ibG9ja3NfcGVyX2dyb3VwID0gbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX3Blcl9ncm91cCk7CisJc2JpLT5zX2ZyYWdzX3Blcl9ncm91cCA9IGxlMzJfdG9fY3B1KGVzLT5zX2ZyYWdzX3Blcl9ncm91cCk7CisJc2JpLT5zX2lub2Rlc19wZXJfZ3JvdXAgPSBsZTMyX3RvX2NwdShlcy0+c19pbm9kZXNfcGVyX2dyb3VwKTsKKworCWlmIChFWFQyX0lOT0RFX1NJWkUoc2IpID09IDApCisJCWdvdG8gY2FudGZpbmRfZXh0MjsKKwlzYmktPnNfaW5vZGVzX3Blcl9ibG9jayA9IHNiLT5zX2Jsb2Nrc2l6ZSAvIEVYVDJfSU5PREVfU0laRShzYik7CisJaWYgKHNiaS0+c19pbm9kZXNfcGVyX2Jsb2NrID09IDApCisJCWdvdG8gY2FudGZpbmRfZXh0MjsKKwlzYmktPnNfaXRiX3Blcl9ncm91cCA9IHNiaS0+c19pbm9kZXNfcGVyX2dyb3VwIC8KKwkJCQkJc2JpLT5zX2lub2Rlc19wZXJfYmxvY2s7CisJc2JpLT5zX2Rlc2NfcGVyX2Jsb2NrID0gc2ItPnNfYmxvY2tzaXplIC8KKwkJCQkJc2l6ZW9mIChzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjKTsKKwlzYmktPnNfc2JoID0gYmg7CisJc2JpLT5zX21vdW50X3N0YXRlID0gbGUxNl90b19jcHUoZXMtPnNfc3RhdGUpOworCXNiaS0+c19hZGRyX3Blcl9ibG9ja19iaXRzID0KKwkJbG9nMiAoRVhUMl9BRERSX1BFUl9CTE9DSyhzYikpOworCXNiaS0+c19kZXNjX3Blcl9ibG9ja19iaXRzID0KKwkJbG9nMiAoRVhUMl9ERVNDX1BFUl9CTE9DSyhzYikpOworCisJaWYgKHNiLT5zX21hZ2ljICE9IEVYVDJfU1VQRVJfTUFHSUMpCisJCWdvdG8gY2FudGZpbmRfZXh0MjsKKworCWlmIChzYi0+c19ibG9ja3NpemUgIT0gYmgtPmJfc2l6ZSkgeworCQlpZiAoIXNpbGVudCkKKwkJCXByaW50ayAoIlZGUzogVW5zdXBwb3J0ZWQgYmxvY2tzaXplIG9uIGRldiAiCisJCQkJIiVzLlxuIiwgc2ItPnNfaWQpOworCQlnb3RvIGZhaWxlZF9tb3VudDsKKwl9CisKKwlpZiAoc2ItPnNfYmxvY2tzaXplICE9IHNiaS0+c19mcmFnX3NpemUpIHsKKwkJcHJpbnRrICgiRVhUMi1mczogZnJhZ3NpemUgJWx1ICE9IGJsb2Nrc2l6ZSAlbHUgKG5vdCBzdXBwb3J0ZWQgeWV0KVxuIiwKKwkJCXNiaS0+c19mcmFnX3NpemUsIHNiLT5zX2Jsb2Nrc2l6ZSk7CisJCWdvdG8gZmFpbGVkX21vdW50OworCX0KKworCWlmIChzYmktPnNfYmxvY2tzX3Blcl9ncm91cCA+IHNiLT5zX2Jsb2Nrc2l6ZSAqIDgpIHsKKwkJcHJpbnRrICgiRVhUMi1mczogI2Jsb2NrcyBwZXIgZ3JvdXAgdG9vIGJpZzogJWx1XG4iLAorCQkJc2JpLT5zX2Jsb2Nrc19wZXJfZ3JvdXApOworCQlnb3RvIGZhaWxlZF9tb3VudDsKKwl9CisJaWYgKHNiaS0+c19mcmFnc19wZXJfZ3JvdXAgPiBzYi0+c19ibG9ja3NpemUgKiA4KSB7CisJCXByaW50ayAoIkVYVDItZnM6ICNmcmFnbWVudHMgcGVyIGdyb3VwIHRvbyBiaWc6ICVsdVxuIiwKKwkJCXNiaS0+c19mcmFnc19wZXJfZ3JvdXApOworCQlnb3RvIGZhaWxlZF9tb3VudDsKKwl9CisJaWYgKHNiaS0+c19pbm9kZXNfcGVyX2dyb3VwID4gc2ItPnNfYmxvY2tzaXplICogOCkgeworCQlwcmludGsgKCJFWFQyLWZzOiAjaW5vZGVzIHBlciBncm91cCB0b28gYmlnOiAlbHVcbiIsCisJCQlzYmktPnNfaW5vZGVzX3Blcl9ncm91cCk7CisJCWdvdG8gZmFpbGVkX21vdW50OworCX0KKworCWlmIChFWFQyX0JMT0NLU19QRVJfR1JPVVAoc2IpID09IDApCisJCWdvdG8gY2FudGZpbmRfZXh0MjsKKwlzYmktPnNfZ3JvdXBzX2NvdW50ID0gKGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCkgLQorCQkJCSAgICAgICAgbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jaykgKworCQkJCSAgICAgICBFWFQyX0JMT0NLU19QRVJfR1JPVVAoc2IpIC0gMSkgLworCQkJCSAgICAgICBFWFQyX0JMT0NLU19QRVJfR1JPVVAoc2IpOworCWRiX2NvdW50ID0gKHNiaS0+c19ncm91cHNfY291bnQgKyBFWFQyX0RFU0NfUEVSX0JMT0NLKHNiKSAtIDEpIC8KKwkJICAgRVhUMl9ERVNDX1BFUl9CTE9DSyhzYik7CisJc2JpLT5zX2dyb3VwX2Rlc2MgPSBrbWFsbG9jIChkYl9jb3VudCAqIHNpemVvZiAoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBHRlBfS0VSTkVMKTsKKwlpZiAoc2JpLT5zX2dyb3VwX2Rlc2MgPT0gTlVMTCkgeworCQlwcmludGsgKCJFWFQyLWZzOiBub3QgZW5vdWdoIG1lbW9yeVxuIik7CisJCWdvdG8gZmFpbGVkX21vdW50OworCX0KKwlwZXJjcHVfY291bnRlcl9pbml0KCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyKTsKKwlwZXJjcHVfY291bnRlcl9pbml0KCZzYmktPnNfZnJlZWlub2Rlc19jb3VudGVyKTsKKwlwZXJjcHVfY291bnRlcl9pbml0KCZzYmktPnNfZGlyc19jb3VudGVyKTsKKwliZ2xfbG9ja19pbml0KCZzYmktPnNfYmxvY2tncm91cF9sb2NrKTsKKwlzYmktPnNfZGVidHMgPSBrbWFsbG9jKHNiaS0+c19ncm91cHNfY291bnQgKiBzaXplb2YoKnNiaS0+c19kZWJ0cyksCisJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYmktPnNfZGVidHMpIHsKKwkJcHJpbnRrICgiRVhUMi1mczogbm90IGVub3VnaCBtZW1vcnlcbiIpOworCQlnb3RvIGZhaWxlZF9tb3VudF9ncm91cF9kZXNjOworCX0KKwltZW1zZXQoc2JpLT5zX2RlYnRzLCAwLCBzYmktPnNfZ3JvdXBzX2NvdW50ICogc2l6ZW9mKCpzYmktPnNfZGVidHMpKTsKKwlmb3IgKGkgPSAwOyBpIDwgZGJfY291bnQ7IGkrKykgeworCQlibG9jayA9IGRlc2NyaXB0b3JfbG9jKHNiLCBsb2dpY19zYl9ibG9jaywgaSk7CisJCXNiaS0+c19ncm91cF9kZXNjW2ldID0gc2JfYnJlYWQoc2IsIGJsb2NrKTsKKwkJaWYgKCFzYmktPnNfZ3JvdXBfZGVzY1tpXSkgeworCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykKKwkJCQlicmVsc2UgKHNiaS0+c19ncm91cF9kZXNjW2pdKTsKKwkJCXByaW50ayAoIkVYVDItZnM6IHVuYWJsZSB0byByZWFkIGdyb3VwIGRlc2NyaXB0b3JzXG4iKTsKKwkJCWdvdG8gZmFpbGVkX21vdW50X2dyb3VwX2Rlc2M7CisJCX0KKwl9CisJaWYgKCFleHQyX2NoZWNrX2Rlc2NyaXB0b3JzIChzYikpIHsKKwkJcHJpbnRrICgiRVhUMi1mczogZ3JvdXAgZGVzY3JpcHRvcnMgY29ycnVwdGVkIVxuIik7CisJCWRiX2NvdW50ID0gaTsKKwkJZ290byBmYWlsZWRfbW91bnQyOworCX0KKwlzYmktPnNfZ2RiX2NvdW50ID0gZGJfY291bnQ7CisJZ2V0X3JhbmRvbV9ieXRlcygmc2JpLT5zX25leHRfZ2VuZXJhdGlvbiwgc2l6ZW9mKHUzMikpOworCXNwaW5fbG9ja19pbml0KCZzYmktPnNfbmV4dF9nZW5fbG9jayk7CisJLyoKKwkgKiBzZXQgdXAgZW5vdWdoIHNvIHRoYXQgaXQgY2FuIHJlYWQgYW4gaW5vZGUKKwkgKi8KKwlzYi0+c19vcCA9ICZleHQyX3NvcHM7CisJc2ItPnNfZXhwb3J0X29wID0gJmV4dDJfZXhwb3J0X29wczsKKwlzYi0+c194YXR0ciA9IGV4dDJfeGF0dHJfaGFuZGxlcnM7CisJcm9vdCA9IGlnZXQoc2IsIEVYVDJfUk9PVF9JTk8pOworCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdCk7CisJaWYgKCFzYi0+c19yb290KSB7CisJCWlwdXQocm9vdCk7CisJCXByaW50ayhLRVJOX0VSUiAiRVhUMi1mczogZ2V0IHJvb3QgaW5vZGUgZmFpbGVkXG4iKTsKKwkJZ290byBmYWlsZWRfbW91bnQyOworCX0KKwlpZiAoIVNfSVNESVIocm9vdC0+aV9tb2RlKSB8fCAhcm9vdC0+aV9ibG9ja3MgfHwgIXJvb3QtPmlfc2l6ZSkgeworCQlkcHV0KHNiLT5zX3Jvb3QpOworCQlzYi0+c19yb290ID0gTlVMTDsKKwkJcHJpbnRrKEtFUk5fRVJSICJFWFQyLWZzOiBjb3JydXB0IHJvb3QgaW5vZGUsIHJ1biBlMmZzY2tcbiIpOworCQlnb3RvIGZhaWxlZF9tb3VudDI7CisJfQorCWlmIChFWFQyX0hBU19DT01QQVRfRkVBVFVSRShzYiwgRVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCkpCisJCWV4dDJfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJIm1vdW50aW5nIGV4dDMgZmlsZXN5c3RlbSBhcyBleHQyXG4iKTsKKwlleHQyX3NldHVwX3N1cGVyIChzYiwgZXMsIHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKTsKKwlwZXJjcHVfY291bnRlcl9tb2QoJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIsCisJCQkJZXh0Ml9jb3VudF9mcmVlX2Jsb2NrcyhzYikpOworCXBlcmNwdV9jb3VudGVyX21vZCgmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlciwKKwkJCQlleHQyX2NvdW50X2ZyZWVfaW5vZGVzKHNiKSk7CisJcGVyY3B1X2NvdW50ZXJfbW9kKCZzYmktPnNfZGlyc19jb3VudGVyLAorCQkJCWV4dDJfY291bnRfZGlycyhzYikpOworCXJldHVybiAwOworCitjYW50ZmluZF9leHQyOgorCWlmICghc2lsZW50KQorCQlwcmludGsoIlZGUzogQ2FuJ3QgZmluZCBhbiBleHQyIGZpbGVzeXN0ZW0gb24gZGV2ICVzLlxuIiwKKwkJICAgICAgIHNiLT5zX2lkKTsKKwlnb3RvIGZhaWxlZF9tb3VudDsKKworZmFpbGVkX21vdW50MjoKKwlmb3IgKGkgPSAwOyBpIDwgZGJfY291bnQ7IGkrKykKKwkJYnJlbHNlKHNiaS0+c19ncm91cF9kZXNjW2ldKTsKK2ZhaWxlZF9tb3VudF9ncm91cF9kZXNjOgorCWtmcmVlKHNiaS0+c19ncm91cF9kZXNjKTsKKwlrZnJlZShzYmktPnNfZGVidHMpOworZmFpbGVkX21vdW50OgorCWJyZWxzZShiaCk7CitmYWlsZWRfc2JpOgorCXNiLT5zX2ZzX2luZm8gPSBOVUxMOworCWtmcmVlKHNiaSk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyB2b2lkIGV4dDJfY29tbWl0X3N1cGVyIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwkJCSAgICAgICBzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jayAqIGVzKQoreworCWVzLT5zX3d0aW1lID0gY3B1X3RvX2xlMzIoZ2V0X3NlY29uZHMoKSk7CisJbWFya19idWZmZXJfZGlydHkoRVhUMl9TQihzYiktPnNfc2JoKTsKKwlzYi0+c19kaXJ0ID0gMDsKK30KKworc3RhdGljIHZvaWQgZXh0Ml9zeW5jX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICplcykKK3sKKwllcy0+c19mcmVlX2Jsb2Nrc19jb3VudCA9IGNwdV90b19sZTMyKGV4dDJfY291bnRfZnJlZV9ibG9ja3Moc2IpKTsKKwllcy0+c19mcmVlX2lub2Rlc19jb3VudCA9IGNwdV90b19sZTMyKGV4dDJfY291bnRfZnJlZV9pbm9kZXMoc2IpKTsKKwllcy0+c193dGltZSA9IGNwdV90b19sZTMyKGdldF9zZWNvbmRzKCkpOworCW1hcmtfYnVmZmVyX2RpcnR5KEVYVDJfU0Ioc2IpLT5zX3NiaCk7CisJc3luY19kaXJ0eV9idWZmZXIoRVhUMl9TQihzYiktPnNfc2JoKTsKKwlzYi0+c19kaXJ0ID0gMDsKK30KKworLyoKKyAqIEluIHRoZSBzZWNvbmQgZXh0ZW5kZWQgZmlsZSBzeXN0ZW0sIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8KKyAqIHdyaXRlIHRoZSBzdXBlciBibG9jayBzaW5jZSB3ZSB1c2UgYSBtYXBwaW5nIG9mIHRoZQorICogZGlzayBzdXBlciBibG9jayBpbiBhIGJ1ZmZlci4KKyAqCisgKiBIb3dldmVyLCB0aGlzIGZ1bmN0aW9uIGlzIHN0aWxsIHVzZWQgdG8gc2V0IHRoZSBmcyB2YWxpZAorICogZmxhZ3MgdG8gMC4gIFdlIG5lZWQgdG8gc2V0IHRoaXMgZmxhZyB0byAwIHNpbmNlIHRoZSBmcworICogbWF5IGhhdmUgYmVlbiBjaGVja2VkIHdoaWxlIG1vdW50ZWQgYW5kIGUyZnNjayBtYXkgaGF2ZQorICogc2V0IHNfc3RhdGUgdG8gRVhUMl9WQUxJRF9GUyBhZnRlciBzb21lIGNvcnJlY3Rpb25zLgorICovCisKK3ZvaWQgZXh0Ml93cml0ZV9zdXBlciAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpCit7CisJc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKiBlczsKKwlsb2NrX2tlcm5lbCgpOworCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQllcyA9IEVYVDJfU0Ioc2IpLT5zX2VzOworCisJCWlmIChsZTE2X3RvX2NwdShlcy0+c19zdGF0ZSkgJiBFWFQyX1ZBTElEX0ZTKSB7CisJCQlleHQyX2RlYnVnICgic2V0dGluZyB2YWxpZCB0byAwXG4iKTsKKwkJCWVzLT5zX3N0YXRlID0gY3B1X3RvX2xlMTYobGUxNl90b19jcHUoZXMtPnNfc3RhdGUpICYKKwkJCQkJCSAgfkVYVDJfVkFMSURfRlMpOworCQkJZXMtPnNfZnJlZV9ibG9ja3NfY291bnQgPSBjcHVfdG9fbGUzMihleHQyX2NvdW50X2ZyZWVfYmxvY2tzKHNiKSk7CisJCQllcy0+c19mcmVlX2lub2Rlc19jb3VudCA9IGNwdV90b19sZTMyKGV4dDJfY291bnRfZnJlZV9pbm9kZXMoc2IpKTsKKwkJCWVzLT5zX210aW1lID0gY3B1X3RvX2xlMzIoZ2V0X3NlY29uZHMoKSk7CisJCQlleHQyX3N5bmNfc3VwZXIoc2IsIGVzKTsKKwkJfSBlbHNlCisJCQlleHQyX2NvbW1pdF9zdXBlciAoc2IsIGVzKTsKKwl9CisJc2ItPnNfZGlydCA9IDA7CisJdW5sb2NrX2tlcm5lbCgpOworfQorCitzdGF0aWMgaW50IGV4dDJfcmVtb3VudCAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIGludCAqIGZsYWdzLCBjaGFyICogZGF0YSkKK3sKKwlzdHJ1Y3QgZXh0Ml9zYl9pbmZvICogc2JpID0gRVhUMl9TQihzYik7CisJc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKiBlczsKKworCS8qCisJICogQWxsb3cgdGhlICJjaGVjayIgb3B0aW9uIHRvIGJlIHBhc3NlZCBhcyBhIHJlbW91bnQgb3B0aW9uLgorCSAqLworCWlmICghcGFyc2Vfb3B0aW9ucyAoZGF0YSwgc2JpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzYi0+c19mbGFncyA9IChzYi0+c19mbGFncyAmIH5NU19QT1NJWEFDTCkgfAorCQkoKHNiaS0+c19tb3VudF9vcHQgJiBFWFQyX01PVU5UX1BPU0lYX0FDTCkgPyBNU19QT1NJWEFDTCA6IDApOworCisJZXMgPSBzYmktPnNfZXM7CisJaWYgKCgqZmxhZ3MgJiBNU19SRE9OTFkpID09IChzYi0+c19mbGFncyAmIE1TX1JET05MWSkpCisJCXJldHVybiAwOworCWlmICgqZmxhZ3MgJiBNU19SRE9OTFkpIHsKKwkJaWYgKGxlMTZfdG9fY3B1KGVzLT5zX3N0YXRlKSAmIEVYVDJfVkFMSURfRlMgfHwKKwkJICAgICEoc2JpLT5zX21vdW50X3N0YXRlICYgRVhUMl9WQUxJRF9GUykpCisJCQlyZXR1cm4gMDsKKwkJLyoKKwkJICogT0ssIHdlIGFyZSByZW1vdW50aW5nIGEgdmFsaWQgcncgcGFydGl0aW9uIHJkb25seSwgc28gc2V0CisJCSAqIHRoZSByZG9ubHkgZmxhZyBhbmQgdGhlbiBtYXJrIHRoZSBwYXJ0aXRpb24gYXMgdmFsaWQgYWdhaW4uCisJCSAqLworCQllcy0+c19zdGF0ZSA9IGNwdV90b19sZTE2KHNiaS0+c19tb3VudF9zdGF0ZSk7CisJCWVzLT5zX210aW1lID0gY3B1X3RvX2xlMzIoZ2V0X3NlY29uZHMoKSk7CisJfSBlbHNlIHsKKwkJX19sZTMyIHJldCA9IEVYVDJfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLAorCQkJCQkgICAgICAgfkVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1VQUCk7CisJCWlmIChyZXQpIHsKKwkJCXByaW50aygiRVhUMi1mczogJXM6IGNvdWxkbid0IHJlbW91bnQgUkRXUiBiZWNhdXNlIG9mICIKKwkJCSAgICAgICAidW5zdXBwb3J0ZWQgb3B0aW9uYWwgZmVhdHVyZXMgKCV4KS5cbiIsCisJCQkgICAgICAgc2ItPnNfaWQsIGxlMzJfdG9fY3B1KHJldCkpOworCQkJcmV0dXJuIC1FUk9GUzsKKwkJfQorCQkvKgorCQkgKiBNb3VudGluZyBhIFJET05MWSBwYXJ0aXRpb24gcmVhZC13cml0ZSwgc28gcmVyZWFkIGFuZAorCQkgKiBzdG9yZSB0aGUgY3VycmVudCB2YWxpZCBmbGFnLiAgKEl0IG1heSBoYXZlIGJlZW4gY2hhbmdlZAorCQkgKiBieSBlMmZzY2sgc2luY2Ugd2Ugb3JpZ2luYWxseSBtb3VudGVkIHRoZSBwYXJ0aXRpb24uKQorCQkgKi8KKwkJc2JpLT5zX21vdW50X3N0YXRlID0gbGUxNl90b19jcHUoZXMtPnNfc3RhdGUpOworCQlpZiAoIWV4dDJfc2V0dXBfc3VwZXIgKHNiLCBlcywgMCkpCisJCQlzYi0+c19mbGFncyAmPSB+TVNfUkRPTkxZOworCX0KKwlleHQyX3N5bmNfc3VwZXIoc2IsIGVzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBleHQyX3N0YXRmcyAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIHN0cnVjdCBrc3RhdGZzICogYnVmKQoreworCXN0cnVjdCBleHQyX3NiX2luZm8gKnNiaSA9IEVYVDJfU0Ioc2IpOworCXVuc2lnbmVkIGxvbmcgb3ZlcmhlYWQ7CisJaW50IGk7CisKKwlpZiAodGVzdF9vcHQgKHNiLCBNSU5JWF9ERikpCisJCW92ZXJoZWFkID0gMDsKKwllbHNlIHsKKwkJLyoKKwkJICogQ29tcHV0ZSB0aGUgb3ZlcmhlYWQgKEZTIHN0cnVjdHVyZXMpCisJCSAqLworCisJCS8qCisJCSAqIEFsbCBvZiB0aGUgYmxvY2tzIGJlZm9yZSBmaXJzdF9kYXRhX2Jsb2NrIGFyZQorCQkgKiBvdmVyaGVhZAorCQkgKi8KKwkJb3ZlcmhlYWQgPSBsZTMyX3RvX2NwdShzYmktPnNfZXMtPnNfZmlyc3RfZGF0YV9ibG9jayk7CisKKwkJLyoKKwkJICogQWRkIHRoZSBvdmVyaGVhZCBhdHRyaWJ1dGVkIHRvIHRoZSBzdXBlcmJsb2NrIGFuZAorCQkgKiBibG9jayBncm91cCBkZXNjcmlwdG9ycy4gIElmIHRoZSBzcGFyc2Ugc3VwZXJibG9ja3MKKwkJICogZmVhdHVyZSBpcyB0dXJuZWQgb24sIHRoZW4gbm90IGFsbCBncm91cHMgaGF2ZSB0aGlzLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IHNiaS0+c19ncm91cHNfY291bnQ7IGkrKykKKwkJCW92ZXJoZWFkICs9IGV4dDJfYmdfaGFzX3N1cGVyKHNiLCBpKSArCisJCQkJZXh0Ml9iZ19udW1fZ2RiKHNiLCBpKTsKKworCQkvKgorCQkgKiBFdmVyeSBibG9jayBncm91cCBoYXMgYW4gaW5vZGUgYml0bWFwLCBhIGJsb2NrCisJCSAqIGJpdG1hcCwgYW5kIGFuIGlub2RlIHRhYmxlLgorCQkgKi8KKwkJb3ZlcmhlYWQgKz0gKHNiaS0+c19ncm91cHNfY291bnQgKgorCQkJICAgICAoMiArIHNiaS0+c19pdGJfcGVyX2dyb3VwKSk7CisJfQorCisJYnVmLT5mX3R5cGUgPSBFWFQyX1NVUEVSX01BR0lDOworCWJ1Zi0+Zl9ic2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKKwlidWYtPmZfYmxvY2tzID0gbGUzMl90b19jcHUoc2JpLT5zX2VzLT5zX2Jsb2Nrc19jb3VudCkgLSBvdmVyaGVhZDsKKwlidWYtPmZfYmZyZWUgPSBleHQyX2NvdW50X2ZyZWVfYmxvY2tzKHNiKTsKKwlidWYtPmZfYmF2YWlsID0gYnVmLT5mX2JmcmVlIC0gbGUzMl90b19jcHUoc2JpLT5zX2VzLT5zX3JfYmxvY2tzX2NvdW50KTsKKwlpZiAoYnVmLT5mX2JmcmVlIDwgbGUzMl90b19jcHUoc2JpLT5zX2VzLT5zX3JfYmxvY2tzX2NvdW50KSkKKwkJYnVmLT5mX2JhdmFpbCA9IDA7CisJYnVmLT5mX2ZpbGVzID0gbGUzMl90b19jcHUoc2JpLT5zX2VzLT5zX2lub2Rlc19jb3VudCk7CisJYnVmLT5mX2ZmcmVlID0gZXh0Ml9jb3VudF9mcmVlX2lub2RlcyAoc2IpOworCWJ1Zi0+Zl9uYW1lbGVuID0gRVhUMl9OQU1FX0xFTjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqZXh0Ml9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBleHQyX2ZpbGxfc3VwZXIpOworfQorCisjaWZkZWYgQ09ORklHX1FVT1RBCisKKy8qIFJlYWQgZGF0YSBmcm9tIHF1b3RhZmlsZSAtIGF2b2lkIHBhZ2VjYWNoZSBhbmQgc3VjaCBiZWNhdXNlIHdlIGNhbm5vdCBhZmZvcmQKKyAqIGFjcXVpcmluZyB0aGUgbG9ja3MuLi4gQXMgcXVvdGEgZmlsZXMgYXJlIG5ldmVyIHRydW5jYXRlZCBhbmQgcXVvdGEgY29kZQorICogaXRzZWxmIHNlcmlhbGl6ZXMgdGhlIG9wZXJhdGlvbnMgKGFuZCBub29uZSBlbHNlIHNob3VsZCB0b3VjaCB0aGUgZmlsZXMpCisgKiB3ZSBkb24ndCBoYXZlIHRvIGJlIGFmcmFpZCBvZiByYWNlcyAqLworc3RhdGljIHNzaXplX3QgZXh0Ml9xdW90YV9yZWFkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCBjaGFyICpkYXRhLAorCQkJICAgICAgIHNpemVfdCBsZW4sIGxvZmZfdCBvZmYpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHNiX2Rxb3B0KHNiKS0+ZmlsZXNbdHlwZV07CisJc2VjdG9yX3QgYmxrID0gb2ZmID4+IEVYVDJfQkxPQ0tfU0laRV9CSVRTKHNiKTsKKwlpbnQgZXJyID0gMDsKKwlpbnQgb2Zmc2V0ID0gb2ZmICYgKHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpOworCWludCB0b2NvcHk7CisJc2l6ZV90IHRvcmVhZDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgdG1wX2JoOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJbG9mZl90IGlfc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKworCWlmIChvZmYgPiBpX3NpemUpCisJCXJldHVybiAwOworCWlmIChvZmYrbGVuID4gaV9zaXplKQorCQlsZW4gPSBpX3NpemUtb2ZmOworCXRvcmVhZCA9IGxlbjsKKwl3aGlsZSAodG9yZWFkID4gMCkgeworCQl0b2NvcHkgPSBzYi0+c19ibG9ja3NpemUgLSBvZmZzZXQgPCB0b3JlYWQgPworCQkJCXNiLT5zX2Jsb2Nrc2l6ZSAtIG9mZnNldCA6IHRvcmVhZDsKKworCQl0bXBfYmguYl9zdGF0ZSA9IDA7CisJCWVyciA9IGV4dDJfZ2V0X2Jsb2NrKGlub2RlLCBibGssICZ0bXBfYmgsIDApOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJaWYgKCFidWZmZXJfbWFwcGVkKCZ0bXBfYmgpKQkvKiBBIGhvbGU/ICovCisJCQltZW1zZXQoZGF0YSwgMCwgdG9jb3B5KTsKKwkJZWxzZSB7CisJCQliaCA9IHNiX2JyZWFkKHNiLCB0bXBfYmguYl9ibG9ja25yKTsKKwkJCWlmICghYmgpCisJCQkJcmV0dXJuIC1FSU87CisJCQltZW1jcHkoZGF0YSwgYmgtPmJfZGF0YStvZmZzZXQsIHRvY29weSk7CisJCQlicmVsc2UoYmgpOworCQl9CisJCW9mZnNldCA9IDA7CisJCXRvcmVhZCAtPSB0b2NvcHk7CisJCWRhdGEgKz0gdG9jb3B5OworCQlibGsrKzsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworLyogV3JpdGUgdG8gcXVvdGFmaWxlICovCitzdGF0aWMgc3NpemVfdCBleHQyX3F1b3RhX3dyaXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLAorCQkJCWNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW4sIGxvZmZfdCBvZmYpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHNiX2Rxb3B0KHNiKS0+ZmlsZXNbdHlwZV07CisJc2VjdG9yX3QgYmxrID0gb2ZmID4+IEVYVDJfQkxPQ0tfU0laRV9CSVRTKHNiKTsKKwlpbnQgZXJyID0gMDsKKwlpbnQgb2Zmc2V0ID0gb2ZmICYgKHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpOworCWludCB0b2NvcHk7CisJc2l6ZV90IHRvd3JpdGUgPSBsZW47CisJc3RydWN0IGJ1ZmZlcl9oZWFkIHRtcF9iaDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCisJZG93bigmaW5vZGUtPmlfc2VtKTsKKwl3aGlsZSAodG93cml0ZSA+IDApIHsKKwkJdG9jb3B5ID0gc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0IDwgdG93cml0ZSA/CisJCQkJc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0IDogdG93cml0ZTsKKworCQl0bXBfYmguYl9zdGF0ZSA9IDA7CisJCWVyciA9IGV4dDJfZ2V0X2Jsb2NrKGlub2RlLCBibGssICZ0bXBfYmgsIDEpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJCWlmIChvZmZzZXQgfHwgdG9jb3B5ICE9IEVYVDJfQkxPQ0tfU0laRShzYikpCisJCQliaCA9IHNiX2JyZWFkKHNiLCB0bXBfYmguYl9ibG9ja25yKTsKKwkJZWxzZQorCQkJYmggPSBzYl9nZXRibGsoc2IsIHRtcF9iaC5iX2Jsb2NrbnIpOworCQlpZiAoIWJoKSB7CisJCQllcnIgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwkJbG9ja19idWZmZXIoYmgpOworCQltZW1jcHkoYmgtPmJfZGF0YStvZmZzZXQsIGRhdGEsIHRvY29weSk7CisJCWZsdXNoX2RjYWNoZV9wYWdlKGJoLT5iX3BhZ2UpOworCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJYnJlbHNlKGJoKTsKKwkJb2Zmc2V0ID0gMDsKKwkJdG93cml0ZSAtPSB0b2NvcHk7CisJCWRhdGEgKz0gdG9jb3B5OworCQlibGsrKzsKKwl9CitvdXQ6CisJaWYgKGxlbiA9PSB0b3dyaXRlKQorCQlyZXR1cm4gZXJyOworCWlmIChpbm9kZS0+aV9zaXplIDwgb2ZmK2xlbi10b3dyaXRlKQorCQlpX3NpemVfd3JpdGUoaW5vZGUsIG9mZitsZW4tdG93cml0ZSk7CisJaW5vZGUtPmlfdmVyc2lvbisrOworCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJdXAoJmlub2RlLT5pX3NlbSk7CisJcmV0dXJuIGxlbiAtIHRvd3JpdGU7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgZXh0Ml9mc190eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiZXh0MiIsCisJLmdldF9zYgkJPSBleHQyX2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfYmxvY2tfc3VwZXIsCisJLmZzX2ZsYWdzCT0gRlNfUkVRVUlSRVNfREVWLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9leHQyX2ZzKHZvaWQpCit7CisJaW50IGVyciA9IGluaXRfZXh0Ml94YXR0cigpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJZXJyID0gaW5pdF9pbm9kZWNhY2hlKCk7CisJaWYgKGVycikKKwkJZ290byBvdXQxOworICAgICAgICBlcnIgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZleHQyX2ZzX3R5cGUpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCXJldHVybiAwOworb3V0OgorCWRlc3Ryb3lfaW5vZGVjYWNoZSgpOworb3V0MToKKwlleGl0X2V4dDJfeGF0dHIoKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9leHQyX2ZzKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZleHQyX2ZzX3R5cGUpOworCWRlc3Ryb3lfaW5vZGVjYWNoZSgpOworCWV4aXRfZXh0Ml94YXR0cigpOworfQorCittb2R1bGVfaW5pdChpbml0X2V4dDJfZnMpCittb2R1bGVfZXhpdChleGl0X2V4dDJfZnMpCmRpZmYgLS1naXQgYS9mcy9leHQyL3N5bWxpbmsuYyBiL2ZzL2V4dDIvc3ltbGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmN2JhYzAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQyL3N5bWxpbmsuYwpAQCAtMCwwICsxLDUyIEBACisvKgorICogIGxpbnV4L2ZzL2V4dDIvc3ltbGluay5jCisgKgorICogT25seSBmYXN0IHN5bWxpbmtzIGxlZnQgaGVyZSAtIHRoZSByZXN0IGlzIGRvbmUgYnkgZ2VuZXJpYyBjb2RlLiBBViwgMTk5OQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NQorICogUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQorICogTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqCisgKiAgZnJvbQorICoKKyAqICBsaW51eC9mcy9taW5peC9zeW1saW5rLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICBleHQyIHN5bWxpbmsgaGFuZGxpbmcgY29kZQorICovCisKKyNpbmNsdWRlICJleHQyLmgiCisjaW5jbHVkZSAieGF0dHIuaCIKKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorCitzdGF0aWMgaW50IGV4dDJfZm9sbG93X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgZXh0Ml9pbm9kZV9pbmZvICplaSA9IEVYVDJfSShkZW50cnktPmRfaW5vZGUpOworCW5kX3NldF9saW5rKG5kLCAoY2hhciAqKWVpLT5pX2RhdGEpOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBleHQyX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkucmVhZGxpbmsJPSBnZW5lcmljX3JlYWRsaW5rLAorCS5mb2xsb3dfbGluawk9IHBhZ2VfZm9sbG93X2xpbmtfbGlnaHQsCisJLnB1dF9saW5rCT0gcGFnZV9wdXRfbGluaywKKyNpZmRlZiBDT05GSUdfRVhUMl9GU19YQVRUUgorCS5zZXR4YXR0cgk9IGdlbmVyaWNfc2V0eGF0dHIsCisJLmdldHhhdHRyCT0gZ2VuZXJpY19nZXR4YXR0ciwKKwkubGlzdHhhdHRyCT0gZXh0Ml9saXN0eGF0dHIsCisJLnJlbW92ZXhhdHRyCT0gZ2VuZXJpY19yZW1vdmV4YXR0ciwKKyNlbmRpZgorfTsKKyAKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGV4dDJfZmFzdF9zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnJlYWRsaW5rCT0gZ2VuZXJpY19yZWFkbGluaywKKwkuZm9sbG93X2xpbmsJPSBleHQyX2ZvbGxvd19saW5rLAorI2lmZGVmIENPTkZJR19FWFQyX0ZTX1hBVFRSCisJLnNldHhhdHRyCT0gZ2VuZXJpY19zZXR4YXR0ciwKKwkuZ2V0eGF0dHIJPSBnZW5lcmljX2dldHhhdHRyLAorCS5saXN0eGF0dHIJPSBleHQyX2xpc3R4YXR0ciwKKwkucmVtb3ZleGF0dHIJPSBnZW5lcmljX3JlbW92ZXhhdHRyLAorI2VuZGlmCit9OwpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi94YXR0ci5jIGIvZnMvZXh0Mi94YXR0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3OTgyYjUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQyL3hhdHRyLmMKQEAgLTAsMCArMSwxMDQzIEBACisvKgorICogbGludXgvZnMvZXh0Mi94YXR0ci5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgQW5kcmVhcyBHcnVlbmJhY2hlciA8YWdydWVuQHN1c2UuZGU+CisgKgorICogRml4IGJ5IEhhcnJpc29uIFhpbmcgPGhhcnJpc29uQG1vdW50YWludmlld2RhdGEuY29tPi4KKyAqIEV4dGVuZGVkIGF0dHJpYnV0ZXMgZm9yIHN5bWxpbmtzIGFuZCBzcGVjaWFsIGZpbGVzIGFkZGVkIHBlcgorICogIHN1Z2dlc3Rpb24gb2YgTHVrYSBSZW5rbyA8bHVrYS5yZW5rb0BoZXJtZXMuc2k+LgorICogeGF0dHIgY29uc29saWRhdGlvbiBDb3B5cmlnaHQgKGMpIDIwMDQgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQHJlZGhhdC5jb20+LAorICogIFJlZCBIYXQgSW5jLgorICoKKyAqLworCisvKgorICogRXh0ZW5kZWQgYXR0cmlidXRlcyBhcmUgc3RvcmVkIG9uIGRpc2sgYmxvY2tzIGFsbG9jYXRlZCBvdXRzaWRlIG9mCisgKiBhbnkgaW5vZGUuIFRoZSBpX2ZpbGVfYWNsIGZpZWxkIGlzIHRoZW4gbWFkZSB0byBwb2ludCB0byB0aGlzIGFsbG9jYXRlZAorICogYmxvY2suIElmIGFsbCBleHRlbmRlZCBhdHRyaWJ1dGVzIG9mIGFuIGlub2RlIGFyZSBpZGVudGljYWwsIHRoZXNlCisgKiBpbm9kZXMgbWF5IHNoYXJlIHRoZSBzYW1lIGV4dGVuZGVkIGF0dHJpYnV0ZSBibG9jay4gU3VjaCBzaXR1YXRpb25zCisgKiBhcmUgYXV0b21hdGljYWxseSBkZXRlY3RlZCBieSBrZWVwaW5nIGEgY2FjaGUgb2YgcmVjZW50IGF0dHJpYnV0ZSBibG9jaworICogbnVtYmVycyBhbmQgaGFzaGVzIG92ZXIgdGhlIGJsb2NrJ3MgY29udGVudHMgaW4gbWVtb3J5LgorICoKKyAqCisgKiBFeHRlbmRlZCBhdHRyaWJ1dGUgYmxvY2sgbGF5b3V0OgorICoKKyAqICAgKy0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqICAgfCBoZWFkZXIgICAgICAgICAgIHwKKyAqICAgfCBlbnRyeSAxICAgICAgICAgIHwgfAorICogICB8IGVudHJ5IDIgICAgICAgICAgfCB8IGdyb3dpbmcgZG93bndhcmRzCisgKiAgIHwgZW50cnkgMyAgICAgICAgICB8IHYKKyAqICAgfCBmb3VyIG51bGwgYnl0ZXMgIHwKKyAqICAgfCAuIC4gLiAgICAgICAgICAgIHwKKyAqICAgfCB2YWx1ZSAxICAgICAgICAgIHwgXgorICogICB8IHZhbHVlIDMgICAgICAgICAgfCB8IGdyb3dpbmcgdXB3YXJkcworICogICB8IHZhbHVlIDIgICAgICAgICAgfCB8CisgKiAgICstLS0tLS0tLS0tLS0tLS0tLS0rCisgKgorICogVGhlIGJsb2NrIGhlYWRlciBpcyBmb2xsb3dlZCBieSBtdWx0aXBsZSBlbnRyeSBkZXNjcmlwdG9ycy4gVGhlc2UgZW50cnkKKyAqIGRlc2NyaXB0b3JzIGFyZSB2YXJpYWJsZSBpbiBzaXplLCBhbmQgYWxsaWduZWQgdG8gRVhUMl9YQVRUUl9QQUQKKyAqIGJ5dGUgYm91bmRhcmllcy4gVGhlIGVudHJ5IGRlc2NyaXB0b3JzIGFyZSBzb3J0ZWQgYnkgYXR0cmlidXRlIG5hbWUsCisgKiBzbyB0aGF0IHR3byBleHRlbmRlZCBhdHRyaWJ1dGUgYmxvY2tzIGNhbiBiZSBjb21wYXJlZCBlZmZpY2llbnRseS4KKyAqCisgKiBBdHRyaWJ1dGUgdmFsdWVzIGFyZSBhbGlnbmVkIHRvIHRoZSBlbmQgb2YgdGhlIGJsb2NrLCBzdG9yZWQgaW4KKyAqIG5vIHNwZWNpZmljIG9yZGVyLiBUaGV5IGFyZSBhbHNvIHBhZGRlZCB0byBFWFQyX1hBVFRSX1BBRCBieXRlCisgKiBib3VuZGFyaWVzLiBObyBhZGRpdGlvbmFsIGdhcHMgYXJlIGxlZnQgYmV0d2VlbiB0aGVtLgorICoKKyAqIExvY2tpbmcgc3RyYXRlZ3kKKyAqIC0tLS0tLS0tLS0tLS0tLS0KKyAqIEVYVDJfSShpbm9kZSktPmlfZmlsZV9hY2wgaXMgcHJvdGVjdGVkIGJ5IEVYVDJfSShpbm9kZSktPnhhdHRyX3NlbS4KKyAqIEVBIGJsb2NrcyBhcmUgb25seSBjaGFuZ2VkIGlmIHRoZXkgYXJlIGV4Y2x1c2l2ZSB0byBhbiBpbm9kZSwgc28KKyAqIGhvbGRpbmcgeGF0dHJfc2VtIGFsc28gbWVhbnMgdGhhdCBub3RoaW5nIGJ1dCB0aGUgRUEgYmxvY2sncyByZWZlcmVuY2UKKyAqIGNvdW50IHdpbGwgY2hhbmdlLiBNdWx0aXBsZSB3cml0ZXJzIHRvIGFuIEVBIGJsb2NrIGFyZSBzeW5jaHJvbml6ZWQKKyAqIGJ5IHRoZSBiaCBsb2NrLiBObyBtb3JlIHRoYW4gYSBzaW5nbGUgYmggbG9jayBpcyBoZWxkIGF0IGFueSB0aW1lCisgKiB0byBhdm9pZCBkZWFkbG9ja3MuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tYmNhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgorI2luY2x1ZGUgImV4dDIuaCIKKyNpbmNsdWRlICJ4YXR0ci5oIgorI2luY2x1ZGUgImFjbC5oIgorCisjZGVmaW5lIEhEUihiaCkgKChzdHJ1Y3QgZXh0Ml94YXR0cl9oZWFkZXIgKikoKGJoKS0+Yl9kYXRhKSkKKyNkZWZpbmUgRU5UUlkocHRyKSAoKHN0cnVjdCBleHQyX3hhdHRyX2VudHJ5ICopKHB0cikpCisjZGVmaW5lIEZJUlNUX0VOVFJZKGJoKSBFTlRSWShIRFIoYmgpKzEpCisjZGVmaW5lIElTX0xBU1RfRU5UUlkoZW50cnkpICgqKF9fdTMyICopKGVudHJ5KSA9PSAwKQorCisjaWZkZWYgRVhUMl9YQVRUUl9ERUJVRworIyBkZWZpbmUgZWFfaWRlYnVnKGlub2RlLCBmLi4uKSBkbyB7IFwKKwkJcHJpbnRrKEtFUk5fREVCVUcgImlub2RlICVzOiVsZDogIiwgXAorCQkJaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubyk7IFwKKwkJcHJpbnRrKGYpOyBcCisJCXByaW50aygiXG4iKTsgXAorCX0gd2hpbGUgKDApCisjIGRlZmluZSBlYV9iZGVidWcoYmgsIGYuLi4pIGRvIHsgXAorCQljaGFyIGJbQkRFVk5BTUVfU0laRV07IFwKKwkJcHJpbnRrKEtFUk5fREVCVUcgImJsb2NrICVzOiVsdTogIiwgXAorCQkJYmRldm5hbWUoYmgtPmJfYmRldiwgYiksIFwKKwkJCSh1bnNpZ25lZCBsb25nKSBiaC0+Yl9ibG9ja25yKTsgXAorCQlwcmludGsoZik7IFwKKwkJcHJpbnRrKCJcbiIpOyBcCisJfSB3aGlsZSAoMCkKKyNlbHNlCisjIGRlZmluZSBlYV9pZGVidWcoZi4uLikKKyMgZGVmaW5lIGVhX2JkZWJ1ZyhmLi4uKQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZXh0Ml94YXR0cl9zZXQyKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwKKwkJCSAgIHN0cnVjdCBleHQyX3hhdHRyX2hlYWRlciAqKTsKKworc3RhdGljIGludCBleHQyX3hhdHRyX2NhY2hlX2luc2VydChzdHJ1Y3QgYnVmZmVyX2hlYWQgKik7CitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICpleHQyX3hhdHRyX2NhY2hlX2ZpbmQoc3RydWN0IGlub2RlICosCisJCQkJCQkgc3RydWN0IGV4dDJfeGF0dHJfaGVhZGVyICopOworc3RhdGljIHZvaWQgZXh0Ml94YXR0cl9yZWhhc2goc3RydWN0IGV4dDJfeGF0dHJfaGVhZGVyICosCisJCQkgICAgICBzdHJ1Y3QgZXh0Ml94YXR0cl9lbnRyeSAqKTsKKworc3RhdGljIHN0cnVjdCBtYl9jYWNoZSAqZXh0Ml94YXR0cl9jYWNoZTsKKworc3RhdGljIHN0cnVjdCB4YXR0cl9oYW5kbGVyICpleHQyX3hhdHRyX2hhbmRsZXJfbWFwW10gPSB7CisJW0VYVDJfWEFUVFJfSU5ERVhfVVNFUl0JCSAgICAgPSAmZXh0Ml94YXR0cl91c2VyX2hhbmRsZXIsCisjaWZkZWYgQ09ORklHX0VYVDJfRlNfUE9TSVhfQUNMCisJW0VYVDJfWEFUVFJfSU5ERVhfUE9TSVhfQUNMX0FDQ0VTU10gID0gJmV4dDJfeGF0dHJfYWNsX2FjY2Vzc19oYW5kbGVyLAorCVtFWFQyX1hBVFRSX0lOREVYX1BPU0lYX0FDTF9ERUZBVUxUXSA9ICZleHQyX3hhdHRyX2FjbF9kZWZhdWx0X2hhbmRsZXIsCisjZW5kaWYKKwlbRVhUMl9YQVRUUl9JTkRFWF9UUlVTVEVEXQkgICAgID0gJmV4dDJfeGF0dHJfdHJ1c3RlZF9oYW5kbGVyLAorI2lmZGVmIENPTkZJR19FWFQyX0ZTX1NFQ1VSSVRZCisJW0VYVDJfWEFUVFJfSU5ERVhfU0VDVVJJVFldCSAgICAgPSAmZXh0Ml94YXR0cl9zZWN1cml0eV9oYW5kbGVyLAorI2VuZGlmCit9OworCitzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqZXh0Ml94YXR0cl9oYW5kbGVyc1tdID0geworCSZleHQyX3hhdHRyX3VzZXJfaGFuZGxlciwKKwkmZXh0Ml94YXR0cl90cnVzdGVkX2hhbmRsZXIsCisjaWZkZWYgQ09ORklHX0VYVDJfRlNfUE9TSVhfQUNMCisJJmV4dDJfeGF0dHJfYWNsX2FjY2Vzc19oYW5kbGVyLAorCSZleHQyX3hhdHRyX2FjbF9kZWZhdWx0X2hhbmRsZXIsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRVhUMl9GU19TRUNVUklUWQorCSZleHQyX3hhdHRyX3NlY3VyaXR5X2hhbmRsZXIsCisjZW5kaWYKKwlOVUxMCit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCB4YXR0cl9oYW5kbGVyICoKK2V4dDJfeGF0dHJfaGFuZGxlcihpbnQgbmFtZV9pbmRleCkKK3sKKwlzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqaGFuZGxlciA9IE5VTEw7CisKKwlpZiAobmFtZV9pbmRleCA+IDAgJiYgbmFtZV9pbmRleCA8IEFSUkFZX1NJWkUoZXh0Ml94YXR0cl9oYW5kbGVyX21hcCkpCisJCWhhbmRsZXIgPSBleHQyX3hhdHRyX2hhbmRsZXJfbWFwW25hbWVfaW5kZXhdOworCXJldHVybiBoYW5kbGVyOworfQorCisvKgorICogZXh0Ml94YXR0cl9nZXQoKQorICoKKyAqIENvcHkgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGludG8gdGhlIGJ1ZmZlcgorICogcHJvdmlkZWQsIG9yIGNvbXB1dGUgdGhlIGJ1ZmZlciBzaXplIHJlcXVpcmVkLgorICogQnVmZmVyIGlzIE5VTEwgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHJlcXVpcmVkLgorICoKKyAqIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIgb24gZmFpbHVyZSwgb3IgdGhlIG51bWJlciBvZiBieXRlcworICogdXNlZCAvIHJlcXVpcmVkIG9uIHN1Y2Nlc3MuCisgKi8KK2ludAorZXh0Ml94YXR0cl9nZXQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5hbWVfaW5kZXgsIGNvbnN0IGNoYXIgKm5hbWUsCisJICAgICAgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9zaXplKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCXN0cnVjdCBleHQyX3hhdHRyX2VudHJ5ICplbnRyeTsKKwlzaXplX3QgbmFtZV9sZW4sIHNpemU7CisJY2hhciAqZW5kOworCWludCBlcnJvcjsKKworCWVhX2lkZWJ1Zyhpbm9kZSwgIm5hbWU9JWQuJXMsIGJ1ZmZlcj0lcCwgYnVmZmVyX3NpemU9JWxkIiwKKwkJICBuYW1lX2luZGV4LCBuYW1lLCBidWZmZXIsIChsb25nKWJ1ZmZlcl9zaXplKTsKKworCWlmIChuYW1lID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCWRvd25fcmVhZCgmRVhUMl9JKGlub2RlKS0+eGF0dHJfc2VtKTsKKwllcnJvciA9IC1FTk9EQVRBOworCWlmICghRVhUMl9JKGlub2RlKS0+aV9maWxlX2FjbCkKKwkJZ290byBjbGVhbnVwOworCWVhX2lkZWJ1Zyhpbm9kZSwgInJlYWRpbmcgYmxvY2sgJWQiLCBFWFQyX0koaW5vZGUpLT5pX2ZpbGVfYWNsKTsKKwliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCBFWFQyX0koaW5vZGUpLT5pX2ZpbGVfYWNsKTsKKwllcnJvciA9IC1FSU87CisJaWYgKCFiaCkKKwkJZ290byBjbGVhbnVwOworCWVhX2JkZWJ1ZyhiaCwgImJfY291bnQ9JWQsIHJlZmNvdW50PSVkIiwKKwkJYXRvbWljX3JlYWQoJihiaC0+Yl9jb3VudCkpLCBsZTMyX3RvX2NwdShIRFIoYmgpLT5oX3JlZmNvdW50KSk7CisJZW5kID0gYmgtPmJfZGF0YSArIGJoLT5iX3NpemU7CisJaWYgKEhEUihiaCktPmhfbWFnaWMgIT0gY3B1X3RvX2xlMzIoRVhUMl9YQVRUUl9NQUdJQykgfHwKKwkgICAgSERSKGJoKS0+aF9ibG9ja3MgIT0gY3B1X3RvX2xlMzIoMSkpIHsKK2JhZF9ibG9jazoJZXh0Ml9lcnJvcihpbm9kZS0+aV9zYiwgImV4dDJfeGF0dHJfZ2V0IiwKKwkJCSJpbm9kZSAlbGQ6IGJhZCBibG9jayAlZCIsIGlub2RlLT5pX2lubywKKwkJCUVYVDJfSShpbm9kZSktPmlfZmlsZV9hY2wpOworCQllcnJvciA9IC1FSU87CisJCWdvdG8gY2xlYW51cDsKKwl9CisJLyogZmluZCBuYW1lZCBhdHRyaWJ1dGUgKi8KKwluYW1lX2xlbiA9IHN0cmxlbihuYW1lKTsKKworCWVycm9yID0gLUVSQU5HRTsKKwlpZiAobmFtZV9sZW4gPiAyNTUpCisJCWdvdG8gY2xlYW51cDsKKwllbnRyeSA9IEZJUlNUX0VOVFJZKGJoKTsKKwl3aGlsZSAoIUlTX0xBU1RfRU5UUlkoZW50cnkpKSB7CisJCXN0cnVjdCBleHQyX3hhdHRyX2VudHJ5ICpuZXh0ID0KKwkJCUVYVDJfWEFUVFJfTkVYVChlbnRyeSk7CisJCWlmICgoY2hhciAqKW5leHQgPj0gZW5kKQorCQkJZ290byBiYWRfYmxvY2s7CisJCWlmIChuYW1lX2luZGV4ID09IGVudHJ5LT5lX25hbWVfaW5kZXggJiYKKwkJICAgIG5hbWVfbGVuID09IGVudHJ5LT5lX25hbWVfbGVuICYmCisJCSAgICBtZW1jbXAobmFtZSwgZW50cnktPmVfbmFtZSwgbmFtZV9sZW4pID09IDApCisJCQlnb3RvIGZvdW5kOworCQllbnRyeSA9IG5leHQ7CisJfQorCS8qIENoZWNrIHRoZSByZW1haW5pbmcgbmFtZSBlbnRyaWVzICovCisJd2hpbGUgKCFJU19MQVNUX0VOVFJZKGVudHJ5KSkgeworCQlzdHJ1Y3QgZXh0Ml94YXR0cl9lbnRyeSAqbmV4dCA9CisJCQlFWFQyX1hBVFRSX05FWFQoZW50cnkpOworCQlpZiAoKGNoYXIgKiluZXh0ID49IGVuZCkKKwkJCWdvdG8gYmFkX2Jsb2NrOworCQllbnRyeSA9IG5leHQ7CisJfQorCWlmIChleHQyX3hhdHRyX2NhY2hlX2luc2VydChiaCkpCisJCWVhX2lkZWJ1Zyhpbm9kZSwgImNhY2hlIGluc2VydCBmYWlsZWQiKTsKKwllcnJvciA9IC1FTk9EQVRBOworCWdvdG8gY2xlYW51cDsKK2ZvdW5kOgorCS8qIGNoZWNrIHRoZSBidWZmZXIgc2l6ZSAqLworCWlmIChlbnRyeS0+ZV92YWx1ZV9ibG9jayAhPSAwKQorCQlnb3RvIGJhZF9ibG9jazsKKwlzaXplID0gbGUzMl90b19jcHUoZW50cnktPmVfdmFsdWVfc2l6ZSk7CisJaWYgKHNpemUgPiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgfHwKKwkgICAgbGUxNl90b19jcHUoZW50cnktPmVfdmFsdWVfb2ZmcykgKyBzaXplID4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKQorCQlnb3RvIGJhZF9ibG9jazsKKworCWlmIChleHQyX3hhdHRyX2NhY2hlX2luc2VydChiaCkpCisJCWVhX2lkZWJ1Zyhpbm9kZSwgImNhY2hlIGluc2VydCBmYWlsZWQiKTsKKwlpZiAoYnVmZmVyKSB7CisJCWVycm9yID0gLUVSQU5HRTsKKwkJaWYgKHNpemUgPiBidWZmZXJfc2l6ZSkKKwkJCWdvdG8gY2xlYW51cDsKKwkJLyogcmV0dXJuIHZhbHVlIG9mIGF0dHJpYnV0ZSAqLworCQltZW1jcHkoYnVmZmVyLCBiaC0+Yl9kYXRhICsgbGUxNl90b19jcHUoZW50cnktPmVfdmFsdWVfb2ZmcyksCisJCQlzaXplKTsKKwl9CisJZXJyb3IgPSBzaXplOworCitjbGVhbnVwOgorCWJyZWxzZShiaCk7CisJdXBfcmVhZCgmRVhUMl9JKGlub2RlKS0+eGF0dHJfc2VtKTsKKworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIGV4dDJfeGF0dHJfbGlzdCgpCisgKgorICogQ29weSBhIGxpc3Qgb2YgYXR0cmlidXRlIG5hbWVzIGludG8gdGhlIGJ1ZmZlcgorICogcHJvdmlkZWQsIG9yIGNvbXB1dGUgdGhlIGJ1ZmZlciBzaXplIHJlcXVpcmVkLgorICogQnVmZmVyIGlzIE5VTEwgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHJlcXVpcmVkLgorICoKKyAqIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIgb24gZmFpbHVyZSwgb3IgdGhlIG51bWJlciBvZiBieXRlcworICogdXNlZCAvIHJlcXVpcmVkIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQKK2V4dDJfeGF0dHJfbGlzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjaGFyICpidWZmZXIsIHNpemVfdCBidWZmZXJfc2l6ZSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwlzdHJ1Y3QgZXh0Ml94YXR0cl9lbnRyeSAqZW50cnk7CisJY2hhciAqZW5kOworCXNpemVfdCByZXN0ID0gYnVmZmVyX3NpemU7CisJaW50IGVycm9yOworCisJZWFfaWRlYnVnKGlub2RlLCAiYnVmZmVyPSVwLCBidWZmZXJfc2l6ZT0lbGQiLAorCQkgIGJ1ZmZlciwgKGxvbmcpYnVmZmVyX3NpemUpOworCisJZG93bl9yZWFkKCZFWFQyX0koaW5vZGUpLT54YXR0cl9zZW0pOworCWVycm9yID0gMDsKKwlpZiAoIUVYVDJfSShpbm9kZSktPmlfZmlsZV9hY2wpCisJCWdvdG8gY2xlYW51cDsKKwllYV9pZGVidWcoaW5vZGUsICJyZWFkaW5nIGJsb2NrICVkIiwgRVhUMl9JKGlub2RlKS0+aV9maWxlX2FjbCk7CisJYmggPSBzYl9icmVhZChpbm9kZS0+aV9zYiwgRVhUMl9JKGlub2RlKS0+aV9maWxlX2FjbCk7CisJZXJyb3IgPSAtRUlPOworCWlmICghYmgpCisJCWdvdG8gY2xlYW51cDsKKwllYV9iZGVidWcoYmgsICJiX2NvdW50PSVkLCByZWZjb3VudD0lZCIsCisJCWF0b21pY19yZWFkKCYoYmgtPmJfY291bnQpKSwgbGUzMl90b19jcHUoSERSKGJoKS0+aF9yZWZjb3VudCkpOworCWVuZCA9IGJoLT5iX2RhdGEgKyBiaC0+Yl9zaXplOworCWlmIChIRFIoYmgpLT5oX21hZ2ljICE9IGNwdV90b19sZTMyKEVYVDJfWEFUVFJfTUFHSUMpIHx8CisJICAgIEhEUihiaCktPmhfYmxvY2tzICE9IGNwdV90b19sZTMyKDEpKSB7CitiYWRfYmxvY2s6CWV4dDJfZXJyb3IoaW5vZGUtPmlfc2IsICJleHQyX3hhdHRyX2xpc3QiLAorCQkJImlub2RlICVsZDogYmFkIGJsb2NrICVkIiwgaW5vZGUtPmlfaW5vLAorCQkJRVhUMl9JKGlub2RlKS0+aV9maWxlX2FjbCk7CisJCWVycm9yID0gLUVJTzsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIGNoZWNrIHRoZSBvbi1kaXNrIGRhdGEgc3RydWN0dXJlICovCisJZW50cnkgPSBGSVJTVF9FTlRSWShiaCk7CisJd2hpbGUgKCFJU19MQVNUX0VOVFJZKGVudHJ5KSkgeworCQlzdHJ1Y3QgZXh0Ml94YXR0cl9lbnRyeSAqbmV4dCA9IEVYVDJfWEFUVFJfTkVYVChlbnRyeSk7CisKKwkJaWYgKChjaGFyICopbmV4dCA+PSBlbmQpCisJCQlnb3RvIGJhZF9ibG9jazsKKwkJZW50cnkgPSBuZXh0OworCX0KKwlpZiAoZXh0Ml94YXR0cl9jYWNoZV9pbnNlcnQoYmgpKQorCQllYV9pZGVidWcoaW5vZGUsICJjYWNoZSBpbnNlcnQgZmFpbGVkIik7CisKKwkvKiBsaXN0IHRoZSBhdHRyaWJ1dGUgbmFtZXMgKi8KKwlmb3IgKGVudHJ5ID0gRklSU1RfRU5UUlkoYmgpOyAhSVNfTEFTVF9FTlRSWShlbnRyeSk7CisJICAgICBlbnRyeSA9IEVYVDJfWEFUVFJfTkVYVChlbnRyeSkpIHsKKwkJc3RydWN0IHhhdHRyX2hhbmRsZXIgKmhhbmRsZXIgPQorCQkJZXh0Ml94YXR0cl9oYW5kbGVyKGVudHJ5LT5lX25hbWVfaW5kZXgpOworCisJCWlmIChoYW5kbGVyKSB7CisJCQlzaXplX3Qgc2l6ZSA9IGhhbmRsZXItPmxpc3QoaW5vZGUsIGJ1ZmZlciwgcmVzdCwKKwkJCQkJCSAgICBlbnRyeS0+ZV9uYW1lLAorCQkJCQkJICAgIGVudHJ5LT5lX25hbWVfbGVuKTsKKwkJCWlmIChidWZmZXIpIHsKKwkJCQlpZiAoc2l6ZSA+IHJlc3QpIHsKKwkJCQkJZXJyb3IgPSAtRVJBTkdFOworCQkJCQlnb3RvIGNsZWFudXA7CisJCQkJfQorCQkJCWJ1ZmZlciArPSBzaXplOworCQkJfQorCQkJcmVzdCAtPSBzaXplOworCQl9CisJfQorCWVycm9yID0gYnVmZmVyX3NpemUgLSByZXN0OyAgLyogdG90YWwgc2l6ZSAqLworCitjbGVhbnVwOgorCWJyZWxzZShiaCk7CisJdXBfcmVhZCgmRVhUMl9JKGlub2RlKS0+eGF0dHJfc2VtKTsKKworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIElub2RlIG9wZXJhdGlvbiBsaXN0eGF0dHIoKQorICoKKyAqIGRlbnRyeS0+ZF9pbm9kZS0+aV9zZW06IGRvbid0IGNhcmUKKyAqLworc3NpemVfdAorZXh0Ml9saXN0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQoreworCXJldHVybiBleHQyX3hhdHRyX2xpc3QoZGVudHJ5LT5kX2lub2RlLCBidWZmZXIsIHNpemUpOworfQorCisvKgorICogSWYgdGhlIEVYVDJfRkVBVFVSRV9DT01QQVRfRVhUX0FUVFIgZmVhdHVyZSBvZiB0aGlzIGZpbGUgc3lzdGVtIGlzCisgKiBub3Qgc2V0LCBzZXQgaXQuCisgKi8KK3N0YXRpYyB2b2lkIGV4dDJfeGF0dHJfdXBkYXRlX3N1cGVyX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJaWYgKEVYVDJfSEFTX0NPTVBBVF9GRUFUVVJFKHNiLCBFWFQyX0ZFQVRVUkVfQ09NUEFUX0VYVF9BVFRSKSkKKwkJcmV0dXJuOworCisJbG9ja19zdXBlcihzYik7CisJRVhUMl9TQihzYiktPnNfZXMtPnNfZmVhdHVyZV9jb21wYXQgfD0KKwkJY3B1X3RvX2xlMzIoRVhUMl9GRUFUVVJFX0NPTVBBVF9FWFRfQVRUUik7CisJc2ItPnNfZGlydCA9IDE7CisJbWFya19idWZmZXJfZGlydHkoRVhUMl9TQihzYiktPnNfc2JoKTsKKwl1bmxvY2tfc3VwZXIoc2IpOworfQorCisvKgorICogZXh0Ml94YXR0cl9zZXQoKQorICoKKyAqIENyZWF0ZSwgcmVwbGFjZSBvciByZW1vdmUgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGZvciB0aGlzIGlub2RlLiBCdWZmZXIKKyAqIGlzIE5VTEwgdG8gcmVtb3ZlIGFuIGV4aXN0aW5nIGV4dGVuZGVkIGF0dHJpYnV0ZSwgYW5kIG5vbi1OVUxMIHRvCisgKiBlaXRoZXIgcmVwbGFjZSBhbiBleGlzdGluZyBleHRlbmRlZCBhdHRyaWJ1dGUsIG9yIGNyZWF0ZSBhIG5ldyBleHRlbmRlZAorICogYXR0cmlidXRlLiBUaGUgZmxhZ3MgWEFUVFJfUkVQTEFDRSBhbmQgWEFUVFJfQ1JFQVRFCisgKiBzcGVjaWZ5IHRoYXQgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIG11c3QgZXhpc3QgYW5kIG11c3Qgbm90IGV4aXN0CisgKiBwcmV2aW91cyB0byB0aGUgY2FsbCwgcmVzcGVjdGl2ZWx5LgorICoKKyAqIFJldHVybnMgMCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIgb24gZmFpbHVyZS4KKyAqLworaW50CitleHQyX3hhdHRyX3NldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbmFtZV9pbmRleCwgY29uc3QgY2hhciAqbmFtZSwKKwkgICAgICAgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCB2YWx1ZV9sZW4sIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJc3RydWN0IGV4dDJfeGF0dHJfaGVhZGVyICpoZWFkZXIgPSBOVUxMOworCXN0cnVjdCBleHQyX3hhdHRyX2VudHJ5ICpoZXJlLCAqbGFzdDsKKwlzaXplX3QgbmFtZV9sZW4sIGZyZWUsIG1pbl9vZmZzID0gc2ItPnNfYmxvY2tzaXplOworCWludCBub3RfZm91bmQgPSAxLCBlcnJvcjsKKwljaGFyICplbmQ7CisJCisJLyoKKwkgKiBoZWFkZXIgLS0gUG9pbnRzIGVpdGhlciBpbnRvIGJoLCBvciB0byBhIHRlbXBvcmFyaWx5CisJICogICAgICAgICAgIGFsbG9jYXRlZCBidWZmZXIuCisJICogaGVyZSAtLSBUaGUgbmFtZWQgZW50cnkgZm91bmQsIG9yIHRoZSBwbGFjZSBmb3IgaW5zZXJ0aW5nLCB3aXRoaW4KKwkgKiAgICAgICAgIHRoZSBibG9jayBwb2ludGVkIHRvIGJ5IGhlYWRlci4KKwkgKiBsYXN0IC0tIFBvaW50cyByaWdodCBhZnRlciB0aGUgbGFzdCBuYW1lZCBlbnRyeSB3aXRoaW4gdGhlIGJsb2NrCisJICogICAgICAgICBwb2ludGVkIHRvIGJ5IGhlYWRlci4KKwkgKiBtaW5fb2ZmcyAtLSBUaGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCB2YWx1ZSAodmFsdWVzIGFyZSBhbGlnbmVkCisJICogICAgICAgICAgICAgdG93YXJkcyB0aGUgZW5kIG9mIHRoZSBibG9jaykuCisJICogZW5kIC0tIFBvaW50cyByaWdodCBhZnRlciB0aGUgYmxvY2sgcG9pbnRlZCB0byBieSBoZWFkZXIuCisJICovCisJCisJZWFfaWRlYnVnKGlub2RlLCAibmFtZT0lZC4lcywgdmFsdWU9JXAsIHZhbHVlX2xlbj0lbGQiLAorCQkgIG5hbWVfaW5kZXgsIG5hbWUsIHZhbHVlLCAobG9uZyl2YWx1ZV9sZW4pOworCisJaWYgKElTX1JET05MWShpbm9kZSkpCisJCXJldHVybiAtRVJPRlM7CisJaWYgKElTX0lNTVVUQUJMRShpbm9kZSkgfHwgSVNfQVBQRU5EKGlub2RlKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwlpZiAodmFsdWUgPT0gTlVMTCkKKwkJdmFsdWVfbGVuID0gMDsKKwlpZiAobmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwluYW1lX2xlbiA9IHN0cmxlbihuYW1lKTsKKwlpZiAobmFtZV9sZW4gPiAyNTUgfHwgdmFsdWVfbGVuID4gc2ItPnNfYmxvY2tzaXplKQorCQlyZXR1cm4gLUVSQU5HRTsKKwlkb3duX3dyaXRlKCZFWFQyX0koaW5vZGUpLT54YXR0cl9zZW0pOworCWlmIChFWFQyX0koaW5vZGUpLT5pX2ZpbGVfYWNsKSB7CisJCS8qIFRoZSBpbm9kZSBhbHJlYWR5IGhhcyBhbiBleHRlbmRlZCBhdHRyaWJ1dGUgYmxvY2suICovCisJCWJoID0gc2JfYnJlYWQoc2IsIEVYVDJfSShpbm9kZSktPmlfZmlsZV9hY2wpOworCQllcnJvciA9IC1FSU87CisJCWlmICghYmgpCisJCQlnb3RvIGNsZWFudXA7CisJCWVhX2JkZWJ1ZyhiaCwgImJfY291bnQ9JWQsIHJlZmNvdW50PSVkIiwKKwkJCWF0b21pY19yZWFkKCYoYmgtPmJfY291bnQpKSwKKwkJCWxlMzJfdG9fY3B1KEhEUihiaCktPmhfcmVmY291bnQpKTsKKwkJaGVhZGVyID0gSERSKGJoKTsKKwkJZW5kID0gYmgtPmJfZGF0YSArIGJoLT5iX3NpemU7CisJCWlmIChoZWFkZXItPmhfbWFnaWMgIT0gY3B1X3RvX2xlMzIoRVhUMl9YQVRUUl9NQUdJQykgfHwKKwkJICAgIGhlYWRlci0+aF9ibG9ja3MgIT0gY3B1X3RvX2xlMzIoMSkpIHsKK2JhZF9ibG9jazoJCWV4dDJfZXJyb3Ioc2IsICJleHQyX3hhdHRyX3NldCIsCisJCQkJImlub2RlICVsZDogYmFkIGJsb2NrICVkIiwgaW5vZGUtPmlfaW5vLCAKKwkJCQkgICBFWFQyX0koaW5vZGUpLT5pX2ZpbGVfYWNsKTsKKwkJCWVycm9yID0gLUVJTzsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCQkvKiBGaW5kIHRoZSBuYW1lZCBhdHRyaWJ1dGUuICovCisJCWhlcmUgPSBGSVJTVF9FTlRSWShiaCk7CisJCXdoaWxlICghSVNfTEFTVF9FTlRSWShoZXJlKSkgeworCQkJc3RydWN0IGV4dDJfeGF0dHJfZW50cnkgKm5leHQgPSBFWFQyX1hBVFRSX05FWFQoaGVyZSk7CisJCQlpZiAoKGNoYXIgKiluZXh0ID49IGVuZCkKKwkJCQlnb3RvIGJhZF9ibG9jazsKKwkJCWlmICghaGVyZS0+ZV92YWx1ZV9ibG9jayAmJiBoZXJlLT5lX3ZhbHVlX3NpemUpIHsKKwkJCQlzaXplX3Qgb2ZmcyA9IGxlMTZfdG9fY3B1KGhlcmUtPmVfdmFsdWVfb2Zmcyk7CisJCQkJaWYgKG9mZnMgPCBtaW5fb2ZmcykKKwkJCQkJbWluX29mZnMgPSBvZmZzOworCQkJfQorCQkJbm90X2ZvdW5kID0gbmFtZV9pbmRleCAtIGhlcmUtPmVfbmFtZV9pbmRleDsKKwkJCWlmICghbm90X2ZvdW5kKQorCQkJCW5vdF9mb3VuZCA9IG5hbWVfbGVuIC0gaGVyZS0+ZV9uYW1lX2xlbjsKKwkJCWlmICghbm90X2ZvdW5kKQorCQkJCW5vdF9mb3VuZCA9IG1lbWNtcChuYW1lLCBoZXJlLT5lX25hbWUsbmFtZV9sZW4pOworCQkJaWYgKG5vdF9mb3VuZCA8PSAwKQorCQkJCWJyZWFrOworCQkJaGVyZSA9IG5leHQ7CisJCX0KKwkJbGFzdCA9IGhlcmU7CisJCS8qIFdlIHN0aWxsIG5lZWQgdG8gY29tcHV0ZSBtaW5fb2ZmcyBhbmQgbGFzdC4gKi8KKwkJd2hpbGUgKCFJU19MQVNUX0VOVFJZKGxhc3QpKSB7CisJCQlzdHJ1Y3QgZXh0Ml94YXR0cl9lbnRyeSAqbmV4dCA9IEVYVDJfWEFUVFJfTkVYVChsYXN0KTsKKwkJCWlmICgoY2hhciAqKW5leHQgPj0gZW5kKQorCQkJCWdvdG8gYmFkX2Jsb2NrOworCQkJaWYgKCFsYXN0LT5lX3ZhbHVlX2Jsb2NrICYmIGxhc3QtPmVfdmFsdWVfc2l6ZSkgeworCQkJCXNpemVfdCBvZmZzID0gbGUxNl90b19jcHUobGFzdC0+ZV92YWx1ZV9vZmZzKTsKKwkJCQlpZiAob2ZmcyA8IG1pbl9vZmZzKQorCQkJCQltaW5fb2ZmcyA9IG9mZnM7CisJCQl9CisJCQlsYXN0ID0gbmV4dDsKKwkJfQorCisJCS8qIENoZWNrIHdoZXRoZXIgd2UgaGF2ZSBlbm91Z2ggc3BhY2UgbGVmdC4gKi8KKwkJZnJlZSA9IG1pbl9vZmZzIC0gKChjaGFyKilsYXN0IC0gKGNoYXIqKWhlYWRlcikgLSBzaXplb2YoX191MzIpOworCX0gZWxzZSB7CisJCS8qIFdlIHdpbGwgdXNlIGEgbmV3IGV4dGVuZGVkIGF0dHJpYnV0ZSBibG9jay4gKi8KKwkJZnJlZSA9IHNiLT5zX2Jsb2Nrc2l6ZSAtCisJCQlzaXplb2Yoc3RydWN0IGV4dDJfeGF0dHJfaGVhZGVyKSAtIHNpemVvZihfX3UzMik7CisJCWhlcmUgPSBsYXN0ID0gTlVMTDsgIC8qIGF2b2lkIGdjYyB1bmluaXRpYWxpemVkIHdhcm5pbmcuICovCisJfQorCisJaWYgKG5vdF9mb3VuZCkgeworCQkvKiBSZXF1ZXN0IHRvIHJlbW92ZSBhIG5vbmV4aXN0ZW50IGF0dHJpYnV0ZT8gKi8KKwkJZXJyb3IgPSAtRU5PREFUQTsKKwkJaWYgKGZsYWdzICYgWEFUVFJfUkVQTEFDRSkKKwkJCWdvdG8gY2xlYW51cDsKKwkJZXJyb3IgPSAwOworCQlpZiAodmFsdWUgPT0gTlVMTCkKKwkJCWdvdG8gY2xlYW51cDsKKwl9IGVsc2UgeworCQkvKiBSZXF1ZXN0IHRvIGNyZWF0ZSBhbiBleGlzdGluZyBhdHRyaWJ1dGU/ICovCisJCWVycm9yID0gLUVFWElTVDsKKwkJaWYgKGZsYWdzICYgWEFUVFJfQ1JFQVRFKQorCQkJZ290byBjbGVhbnVwOworCQlpZiAoIWhlcmUtPmVfdmFsdWVfYmxvY2sgJiYgaGVyZS0+ZV92YWx1ZV9zaXplKSB7CisJCQlzaXplX3Qgc2l6ZSA9IGxlMzJfdG9fY3B1KGhlcmUtPmVfdmFsdWVfc2l6ZSk7CisKKwkJCWlmIChsZTE2X3RvX2NwdShoZXJlLT5lX3ZhbHVlX29mZnMpICsgc2l6ZSA+IAorCQkJICAgIHNiLT5zX2Jsb2Nrc2l6ZSB8fCBzaXplID4gc2ItPnNfYmxvY2tzaXplKQorCQkJCWdvdG8gYmFkX2Jsb2NrOworCQkJZnJlZSArPSBFWFQyX1hBVFRSX1NJWkUoc2l6ZSk7CisJCX0KKwkJZnJlZSArPSBFWFQyX1hBVFRSX0xFTihuYW1lX2xlbik7CisJfQorCWVycm9yID0gLUVOT1NQQzsKKwlpZiAoZnJlZSA8IEVYVDJfWEFUVFJfTEVOKG5hbWVfbGVuKSArIEVYVDJfWEFUVFJfU0laRSh2YWx1ZV9sZW4pKQorCQlnb3RvIGNsZWFudXA7CisKKwkvKiBIZXJlIHdlIGtub3cgdGhhdCB3ZSBjYW4gc2V0IHRoZSBuZXcgYXR0cmlidXRlLiAqLworCisJaWYgKGhlYWRlcikgeworCQlzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKmNlOworCisJCS8qIGFzc2VydChoZWFkZXIgPT0gSERSKGJoKSk7ICovCisJCWNlID0gbWJfY2FjaGVfZW50cnlfZ2V0KGV4dDJfeGF0dHJfY2FjaGUsIGJoLT5iX2JkZXYsCisJCQkJCWJoLT5iX2Jsb2NrbnIpOworCQlsb2NrX2J1ZmZlcihiaCk7CisJCWlmIChoZWFkZXItPmhfcmVmY291bnQgPT0gY3B1X3RvX2xlMzIoMSkpIHsKKwkJCWVhX2JkZWJ1ZyhiaCwgIm1vZGlmeWluZyBpbi1wbGFjZSIpOworCQkJaWYgKGNlKQorCQkJCW1iX2NhY2hlX2VudHJ5X2ZyZWUoY2UpOworCQkJLyoga2VlcCB0aGUgYnVmZmVyIGxvY2tlZCB3aGlsZSBtb2RpZnlpbmcgaXQuICovCisJCX0gZWxzZSB7CisJCQlpbnQgb2Zmc2V0OworCisJCQlpZiAoY2UpCisJCQkJbWJfY2FjaGVfZW50cnlfcmVsZWFzZShjZSk7CisJCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJCWVhX2JkZWJ1ZyhiaCwgImNsb25pbmciKTsKKwkJCWhlYWRlciA9IGttYWxsb2MoYmgtPmJfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCQllcnJvciA9IC1FTk9NRU07CisJCQlpZiAoaGVhZGVyID09IE5VTEwpCisJCQkJZ290byBjbGVhbnVwOworCQkJbWVtY3B5KGhlYWRlciwgSERSKGJoKSwgYmgtPmJfc2l6ZSk7CisJCQloZWFkZXItPmhfcmVmY291bnQgPSBjcHVfdG9fbGUzMigxKTsKKworCQkJb2Zmc2V0ID0gKGNoYXIgKiloZXJlIC0gYmgtPmJfZGF0YTsKKwkJCWhlcmUgPSBFTlRSWSgoY2hhciAqKWhlYWRlciArIG9mZnNldCk7CisJCQlvZmZzZXQgPSAoY2hhciAqKWxhc3QgLSBiaC0+Yl9kYXRhOworCQkJbGFzdCA9IEVOVFJZKChjaGFyICopaGVhZGVyICsgb2Zmc2V0KTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIEFsbG9jYXRlIGEgYnVmZmVyIHdoZXJlIHdlIGNvbnN0cnVjdCB0aGUgbmV3IGJsb2NrLiAqLworCQloZWFkZXIgPSBrbWFsbG9jKHNiLT5zX2Jsb2Nrc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWVycm9yID0gLUVOT01FTTsKKwkJaWYgKGhlYWRlciA9PSBOVUxMKQorCQkJZ290byBjbGVhbnVwOworCQltZW1zZXQoaGVhZGVyLCAwLCBzYi0+c19ibG9ja3NpemUpOworCQllbmQgPSAoY2hhciAqKWhlYWRlciArIHNiLT5zX2Jsb2Nrc2l6ZTsKKwkJaGVhZGVyLT5oX21hZ2ljID0gY3B1X3RvX2xlMzIoRVhUMl9YQVRUUl9NQUdJQyk7CisJCWhlYWRlci0+aF9ibG9ja3MgPSBoZWFkZXItPmhfcmVmY291bnQgPSBjcHVfdG9fbGUzMigxKTsKKwkJbGFzdCA9IGhlcmUgPSBFTlRSWShoZWFkZXIrMSk7CisJfQorCisJLyogSWZmIHdlIGFyZSBtb2RpZnlpbmcgdGhlIGJsb2NrIGluLXBsYWNlLCBiaCBpcyBsb2NrZWQgaGVyZS4gKi8KKworCWlmIChub3RfZm91bmQpIHsKKwkJLyogSW5zZXJ0IHRoZSBuZXcgbmFtZS4gKi8KKwkJc2l6ZV90IHNpemUgPSBFWFQyX1hBVFRSX0xFTihuYW1lX2xlbik7CisJCXNpemVfdCByZXN0ID0gKGNoYXIgKilsYXN0IC0gKGNoYXIgKiloZXJlOworCQltZW1tb3ZlKChjaGFyICopaGVyZSArIHNpemUsIGhlcmUsIHJlc3QpOworCQltZW1zZXQoaGVyZSwgMCwgc2l6ZSk7CisJCWhlcmUtPmVfbmFtZV9pbmRleCA9IG5hbWVfaW5kZXg7CisJCWhlcmUtPmVfbmFtZV9sZW4gPSBuYW1lX2xlbjsKKwkJbWVtY3B5KGhlcmUtPmVfbmFtZSwgbmFtZSwgbmFtZV9sZW4pOworCX0gZWxzZSB7CisJCWlmICghaGVyZS0+ZV92YWx1ZV9ibG9jayAmJiBoZXJlLT5lX3ZhbHVlX3NpemUpIHsKKwkJCWNoYXIgKmZpcnN0X3ZhbCA9IChjaGFyICopaGVhZGVyICsgbWluX29mZnM7CisJCQlzaXplX3Qgb2ZmcyA9IGxlMTZfdG9fY3B1KGhlcmUtPmVfdmFsdWVfb2Zmcyk7CisJCQljaGFyICp2YWwgPSAoY2hhciAqKWhlYWRlciArIG9mZnM7CisJCQlzaXplX3Qgc2l6ZSA9IEVYVDJfWEFUVFJfU0laRSgKKwkJCQlsZTMyX3RvX2NwdShoZXJlLT5lX3ZhbHVlX3NpemUpKTsKKworCQkJaWYgKHNpemUgPT0gRVhUMl9YQVRUUl9TSVpFKHZhbHVlX2xlbikpIHsKKwkJCQkvKiBUaGUgb2xkIGFuZCB0aGUgbmV3IHZhbHVlIGhhdmUgdGhlIHNhbWUKKwkJCQkgICBzaXplLiBKdXN0IHJlcGxhY2UuICovCisJCQkJaGVyZS0+ZV92YWx1ZV9zaXplID0gY3B1X3RvX2xlMzIodmFsdWVfbGVuKTsKKwkJCQltZW1zZXQodmFsICsgc2l6ZSAtIEVYVDJfWEFUVFJfUEFELCAwLAorCQkJCSAgICAgICBFWFQyX1hBVFRSX1BBRCk7IC8qIENsZWFyIHBhZCBieXRlcy4gKi8KKwkJCQltZW1jcHkodmFsLCB2YWx1ZSwgdmFsdWVfbGVuKTsKKwkJCQlnb3RvIHNraXBfcmVwbGFjZTsKKwkJCX0KKworCQkJLyogUmVtb3ZlIHRoZSBvbGQgdmFsdWUuICovCisJCQltZW1tb3ZlKGZpcnN0X3ZhbCArIHNpemUsIGZpcnN0X3ZhbCwgdmFsIC0gZmlyc3RfdmFsKTsKKwkJCW1lbXNldChmaXJzdF92YWwsIDAsIHNpemUpOworCQkJaGVyZS0+ZV92YWx1ZV9vZmZzID0gMDsKKwkJCW1pbl9vZmZzICs9IHNpemU7CisKKwkJCS8qIEFkanVzdCBhbGwgdmFsdWUgb2Zmc2V0cy4gKi8KKwkJCWxhc3QgPSBFTlRSWShoZWFkZXIrMSk7CisJCQl3aGlsZSAoIUlTX0xBU1RfRU5UUlkobGFzdCkpIHsKKwkJCQlzaXplX3QgbyA9IGxlMTZfdG9fY3B1KGxhc3QtPmVfdmFsdWVfb2Zmcyk7CisJCQkJaWYgKCFsYXN0LT5lX3ZhbHVlX2Jsb2NrICYmIG8gPCBvZmZzKQorCQkJCQlsYXN0LT5lX3ZhbHVlX29mZnMgPQorCQkJCQkJY3B1X3RvX2xlMTYobyArIHNpemUpOworCQkJCWxhc3QgPSBFWFQyX1hBVFRSX05FWFQobGFzdCk7CisJCQl9CisJCX0KKwkJaWYgKHZhbHVlID09IE5VTEwpIHsKKwkJCS8qIFJlbW92ZSB0aGUgb2xkIG5hbWUuICovCisJCQlzaXplX3Qgc2l6ZSA9IEVYVDJfWEFUVFJfTEVOKG5hbWVfbGVuKTsKKwkJCWxhc3QgPSBFTlRSWSgoY2hhciAqKWxhc3QgLSBzaXplKTsKKwkJCW1lbW1vdmUoaGVyZSwgKGNoYXIqKWhlcmUgKyBzaXplLAorCQkJCShjaGFyKilsYXN0IC0gKGNoYXIqKWhlcmUpOworCQkJbWVtc2V0KGxhc3QsIDAsIHNpemUpOworCQl9CisJfQorCisJaWYgKHZhbHVlICE9IE5VTEwpIHsKKwkJLyogSW5zZXJ0IHRoZSBuZXcgdmFsdWUuICovCisJCWhlcmUtPmVfdmFsdWVfc2l6ZSA9IGNwdV90b19sZTMyKHZhbHVlX2xlbik7CisJCWlmICh2YWx1ZV9sZW4pIHsKKwkJCXNpemVfdCBzaXplID0gRVhUMl9YQVRUUl9TSVpFKHZhbHVlX2xlbik7CisJCQljaGFyICp2YWwgPSAoY2hhciAqKWhlYWRlciArIG1pbl9vZmZzIC0gc2l6ZTsKKwkJCWhlcmUtPmVfdmFsdWVfb2ZmcyA9CisJCQkJY3B1X3RvX2xlMTYoKGNoYXIgKil2YWwgLSAoY2hhciAqKWhlYWRlcik7CisJCQltZW1zZXQodmFsICsgc2l6ZSAtIEVYVDJfWEFUVFJfUEFELCAwLAorCQkJICAgICAgIEVYVDJfWEFUVFJfUEFEKTsgLyogQ2xlYXIgdGhlIHBhZCBieXRlcy4gKi8KKwkJCW1lbWNweSh2YWwsIHZhbHVlLCB2YWx1ZV9sZW4pOworCQl9CisJfQorCitza2lwX3JlcGxhY2U6CisJaWYgKElTX0xBU1RfRU5UUlkoRU5UUlkoaGVhZGVyKzEpKSkgeworCQkvKiBUaGlzIGJsb2NrIGlzIG5vdyBlbXB0eS4gKi8KKwkJaWYgKGJoICYmIGhlYWRlciA9PSBIRFIoYmgpKQorCQkJdW5sb2NrX2J1ZmZlcihiaCk7ICAvKiB3ZSB3ZXJlIG1vZGlmeWluZyBpbi1wbGFjZS4gKi8KKwkJZXJyb3IgPSBleHQyX3hhdHRyX3NldDIoaW5vZGUsIGJoLCBOVUxMKTsKKwl9IGVsc2UgeworCQlleHQyX3hhdHRyX3JlaGFzaChoZWFkZXIsIGhlcmUpOworCQlpZiAoYmggJiYgaGVhZGVyID09IEhEUihiaCkpCisJCQl1bmxvY2tfYnVmZmVyKGJoKTsgIC8qIHdlIHdlcmUgbW9kaWZ5aW5nIGluLXBsYWNlLiAqLworCQllcnJvciA9IGV4dDJfeGF0dHJfc2V0Mihpbm9kZSwgYmgsIGhlYWRlcik7CisJfQorCitjbGVhbnVwOgorCWJyZWxzZShiaCk7CisJaWYgKCEoYmggJiYgaGVhZGVyID09IEhEUihiaCkpKQorCQlrZnJlZShoZWFkZXIpOworCXVwX3dyaXRlKCZFWFQyX0koaW5vZGUpLT54YXR0cl9zZW0pOworCisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogU2Vjb25kIGhhbGYgb2YgZXh0Ml94YXR0cl9zZXQoKTogVXBkYXRlIHRoZSBmaWxlIHN5c3RlbS4KKyAqLworc3RhdGljIGludAorZXh0Ml94YXR0cl9zZXQyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqb2xkX2JoLAorCQlzdHJ1Y3QgZXh0Ml94YXR0cl9oZWFkZXIgKmhlYWRlcikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpuZXdfYmggPSBOVUxMOworCWludCBlcnJvcjsKKworCWlmIChoZWFkZXIpIHsKKwkJbmV3X2JoID0gZXh0Ml94YXR0cl9jYWNoZV9maW5kKGlub2RlLCBoZWFkZXIpOworCQlpZiAobmV3X2JoKSB7CisJCQkvKiBXZSBmb3VuZCBhbiBpZGVudGljYWwgYmxvY2sgaW4gdGhlIGNhY2hlLiAqLworCQkJaWYgKG5ld19iaCA9PSBvbGRfYmgpIHsKKwkJCQllYV9iZGVidWcobmV3X2JoLCAia2VlcGluZyB0aGlzIGJsb2NrIik7CisJCQl9IGVsc2UgeworCQkJCS8qIFRoZSBvbGQgYmxvY2sgaXMgcmVsZWFzZWQgYWZ0ZXIgdXBkYXRpbmcKKwkJCQkgICB0aGUgaW5vZGUuICAqLworCQkJCWVhX2JkZWJ1ZyhuZXdfYmgsICJyZXVzaW5nIGJsb2NrIik7CisKKwkJCQllcnJvciA9IC1FRFFVT1Q7CisJCQkJaWYgKERRVU9UX0FMTE9DX0JMT0NLKGlub2RlLCAxKSkgeworCQkJCQl1bmxvY2tfYnVmZmVyKG5ld19iaCk7CisJCQkJCWdvdG8gY2xlYW51cDsKKwkJCQl9CisJCQkJSERSKG5ld19iaCktPmhfcmVmY291bnQgPSBjcHVfdG9fbGUzMigxICsKKwkJCQkJbGUzMl90b19jcHUoSERSKG5ld19iaCktPmhfcmVmY291bnQpKTsKKwkJCQllYV9iZGVidWcobmV3X2JoLCAicmVmY291bnQgbm93PSVkIiwKKwkJCQkJbGUzMl90b19jcHUoSERSKG5ld19iaCktPmhfcmVmY291bnQpKTsKKwkJCX0KKwkJCXVubG9ja19idWZmZXIobmV3X2JoKTsKKwkJfSBlbHNlIGlmIChvbGRfYmggJiYgaGVhZGVyID09IEhEUihvbGRfYmgpKSB7CisJCQkvKiBLZWVwIHRoaXMgYmxvY2suIE5vIG5lZWQgdG8gbG9jayB0aGUgYmxvY2sgYXMgd2UKKwkJCSAgIGRvbid0IG5lZWQgdG8gY2hhbmdlIHRoZSByZWZlcmVuY2UgY291bnQuICovCisJCQluZXdfYmggPSBvbGRfYmg7CisJCQlnZXRfYmgobmV3X2JoKTsKKwkJCWV4dDJfeGF0dHJfY2FjaGVfaW5zZXJ0KG5ld19iaCk7CisJCX0gZWxzZSB7CisJCQkvKiBXZSBuZWVkIHRvIGFsbG9jYXRlIGEgbmV3IGJsb2NrICovCisJCQlpbnQgZ29hbCA9IGxlMzJfdG9fY3B1KEVYVDJfU0Ioc2IpLT5zX2VzLT4KKwkJCQkJCSAgICAgICAgICAgc19maXJzdF9kYXRhX2Jsb2NrKSArCisJCQkJICAgRVhUMl9JKGlub2RlKS0+aV9ibG9ja19ncm91cCAqCisJCQkJICAgRVhUMl9CTE9DS1NfUEVSX0dST1VQKHNiKTsKKwkJCWludCBibG9jayA9IGV4dDJfbmV3X2Jsb2NrKGlub2RlLCBnb2FsLAorCQkJCQkJICAgTlVMTCwgTlVMTCwgJmVycm9yKTsKKwkJCWlmIChlcnJvcikKKwkJCQlnb3RvIGNsZWFudXA7CisJCQllYV9pZGVidWcoaW5vZGUsICJjcmVhdGluZyBibG9jayAlZCIsIGJsb2NrKTsKKworCQkJbmV3X2JoID0gc2JfZ2V0YmxrKHNiLCBibG9jayk7CisJCQlpZiAoIW5ld19iaCkgeworCQkJCWV4dDJfZnJlZV9ibG9ja3MoaW5vZGUsIGJsb2NrLCAxKTsKKwkJCQllcnJvciA9IC1FSU87CisJCQkJZ290byBjbGVhbnVwOworCQkJfQorCQkJbG9ja19idWZmZXIobmV3X2JoKTsKKwkJCW1lbWNweShuZXdfYmgtPmJfZGF0YSwgaGVhZGVyLCBuZXdfYmgtPmJfc2l6ZSk7CisJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKG5ld19iaCk7CisJCQl1bmxvY2tfYnVmZmVyKG5ld19iaCk7CisJCQlleHQyX3hhdHRyX2NhY2hlX2luc2VydChuZXdfYmgpOworCQkJCisJCQlleHQyX3hhdHRyX3VwZGF0ZV9zdXBlcl9ibG9jayhzYik7CisJCX0KKwkJbWFya19idWZmZXJfZGlydHkobmV3X2JoKTsKKwkJaWYgKElTX1NZTkMoaW5vZGUpKSB7CisJCQlzeW5jX2RpcnR5X2J1ZmZlcihuZXdfYmgpOworCQkJZXJyb3IgPSAtRUlPOworCQkJaWYgKGJ1ZmZlcl9yZXEobmV3X2JoKSAmJiAhYnVmZmVyX3VwdG9kYXRlKG5ld19iaCkpCisJCQkJZ290byBjbGVhbnVwOworCQl9CisJfQorCisJLyogVXBkYXRlIHRoZSBpbm9kZS4gKi8KKwlFWFQyX0koaW5vZGUpLT5pX2ZpbGVfYWNsID0gbmV3X2JoID8gbmV3X2JoLT5iX2Jsb2NrbnIgOiAwOworCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlpZiAoSVNfU1lOQyhpbm9kZSkpIHsKKwkJZXJyb3IgPSBleHQyX3N5bmNfaW5vZGUgKGlub2RlKTsKKwkJLyogSW4gY2FzZSBzeW5jIGZhaWxlZCBkdWUgdG8gRU5PU1BDIHRoZSBpbm9kZSB3YXMgYWN0dWFsbHkKKwkJICogd3JpdHRlbiAob25seSBzb21lIGRpcnR5IGRhdGEgd2VyZSBub3QpIHNvIHdlIGp1c3QgcHJvY2VlZAorCQkgKiBhcyBpZiBub3RoaW5nIGhhcHBlbmVkIGFuZCBjbGVhbnVwIHRoZSB1bnVzZWQgYmxvY2sgKi8KKwkJaWYgKGVycm9yICYmIGVycm9yICE9IC1FTk9TUEMpIHsKKwkJCWlmIChuZXdfYmggJiYgbmV3X2JoICE9IG9sZF9iaCkKKwkJCQlEUVVPVF9GUkVFX0JMT0NLKGlub2RlLCAxKTsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCX0gZWxzZQorCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKworCWVycm9yID0gMDsKKwlpZiAob2xkX2JoICYmIG9sZF9iaCAhPSBuZXdfYmgpIHsKKwkJc3RydWN0IG1iX2NhY2hlX2VudHJ5ICpjZTsKKworCQkvKgorCQkgKiBJZiB0aGVyZSB3YXMgYW4gb2xkIGJsb2NrIGFuZCB3ZSBhcmUgbm8gbG9uZ2VyIHVzaW5nIGl0LAorCQkgKiByZWxlYXNlIHRoZSBvbGQgYmxvY2suCisJCSAqLworCQljZSA9IG1iX2NhY2hlX2VudHJ5X2dldChleHQyX3hhdHRyX2NhY2hlLCBvbGRfYmgtPmJfYmRldiwKKwkJCQkJb2xkX2JoLT5iX2Jsb2NrbnIpOworCQlsb2NrX2J1ZmZlcihvbGRfYmgpOworCQlpZiAoSERSKG9sZF9iaCktPmhfcmVmY291bnQgPT0gY3B1X3RvX2xlMzIoMSkpIHsKKwkJCS8qIEZyZWUgdGhlIG9sZCBibG9jay4gKi8KKwkJCWlmIChjZSkKKwkJCQltYl9jYWNoZV9lbnRyeV9mcmVlKGNlKTsKKwkJCWVhX2JkZWJ1ZyhvbGRfYmgsICJmcmVlaW5nIik7CisJCQlleHQyX2ZyZWVfYmxvY2tzKGlub2RlLCBvbGRfYmgtPmJfYmxvY2tuciwgMSk7CisJCQkvKiBXZSBsZXQgb3VyIGNhbGxlciByZWxlYXNlIG9sZF9iaCwgc28gd2UKKwkJCSAqIG5lZWQgdG8gZHVwbGljYXRlIHRoZSBidWZmZXIgYmVmb3JlLiAqLworCQkJZ2V0X2JoKG9sZF9iaCk7CisJCQliZm9yZ2V0KG9sZF9iaCk7CisJCX0gZWxzZSB7CisJCQkvKiBEZWNyZW1lbnQgdGhlIHJlZmNvdW50IG9ubHkuICovCisJCQlIRFIob2xkX2JoKS0+aF9yZWZjb3VudCA9IGNwdV90b19sZTMyKAorCQkJCWxlMzJfdG9fY3B1KEhEUihvbGRfYmgpLT5oX3JlZmNvdW50KSAtIDEpOworCQkJaWYgKGNlKQorCQkJCW1iX2NhY2hlX2VudHJ5X3JlbGVhc2UoY2UpOworCQkJRFFVT1RfRlJFRV9CTE9DSyhpbm9kZSwgMSk7CisJCQltYXJrX2J1ZmZlcl9kaXJ0eShvbGRfYmgpOworCQkJZWFfYmRlYnVnKG9sZF9iaCwgInJlZmNvdW50IG5vdz0lZCIsCisJCQkJbGUzMl90b19jcHUoSERSKG9sZF9iaCktPmhfcmVmY291bnQpKTsKKwkJfQorCQl1bmxvY2tfYnVmZmVyKG9sZF9iaCk7CisJfQorCitjbGVhbnVwOgorCWJyZWxzZShuZXdfYmgpOworCisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogZXh0Ml94YXR0cl9kZWxldGVfaW5vZGUoKQorICoKKyAqIEZyZWUgZXh0ZW5kZWQgYXR0cmlidXRlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbm9kZS4gVGhpcworICogaXMgY2FsbGVkIGltbWVkaWF0ZWx5IGJlZm9yZSBhbiBpbm9kZSBpcyBmcmVlZC4KKyAqLwordm9pZAorZXh0Ml94YXR0cl9kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwlzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKmNlOworCisJZG93bl93cml0ZSgmRVhUMl9JKGlub2RlKS0+eGF0dHJfc2VtKTsKKwlpZiAoIUVYVDJfSShpbm9kZSktPmlfZmlsZV9hY2wpCisJCWdvdG8gY2xlYW51cDsKKwliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCBFWFQyX0koaW5vZGUpLT5pX2ZpbGVfYWNsKTsKKwlpZiAoIWJoKSB7CisJCWV4dDJfZXJyb3IoaW5vZGUtPmlfc2IsICJleHQyX3hhdHRyX2RlbGV0ZV9pbm9kZSIsCisJCQkiaW5vZGUgJWxkOiBibG9jayAlZCByZWFkIGVycm9yIiwgaW5vZGUtPmlfaW5vLAorCQkJRVhUMl9JKGlub2RlKS0+aV9maWxlX2FjbCk7CisJCWdvdG8gY2xlYW51cDsKKwl9CisJZWFfYmRlYnVnKGJoLCAiYl9jb3VudD0lZCIsIGF0b21pY19yZWFkKCYoYmgtPmJfY291bnQpKSk7CisJaWYgKEhEUihiaCktPmhfbWFnaWMgIT0gY3B1X3RvX2xlMzIoRVhUMl9YQVRUUl9NQUdJQykgfHwKKwkgICAgSERSKGJoKS0+aF9ibG9ja3MgIT0gY3B1X3RvX2xlMzIoMSkpIHsKKwkJZXh0Ml9lcnJvcihpbm9kZS0+aV9zYiwgImV4dDJfeGF0dHJfZGVsZXRlX2lub2RlIiwKKwkJCSJpbm9kZSAlbGQ6IGJhZCBibG9jayAlZCIsIGlub2RlLT5pX2lubywKKwkJCUVYVDJfSShpbm9kZSktPmlfZmlsZV9hY2wpOworCQlnb3RvIGNsZWFudXA7CisJfQorCWNlID0gbWJfY2FjaGVfZW50cnlfZ2V0KGV4dDJfeGF0dHJfY2FjaGUsIGJoLT5iX2JkZXYsIGJoLT5iX2Jsb2NrbnIpOworCWxvY2tfYnVmZmVyKGJoKTsKKwlpZiAoSERSKGJoKS0+aF9yZWZjb3VudCA9PSBjcHVfdG9fbGUzMigxKSkgeworCQlpZiAoY2UpCisJCQltYl9jYWNoZV9lbnRyeV9mcmVlKGNlKTsKKwkJZXh0Ml9mcmVlX2Jsb2Nrcyhpbm9kZSwgRVhUMl9JKGlub2RlKS0+aV9maWxlX2FjbCwgMSk7CisJCWdldF9iaChiaCk7CisJCWJmb3JnZXQoYmgpOworCX0gZWxzZSB7CisJCUhEUihiaCktPmhfcmVmY291bnQgPSBjcHVfdG9fbGUzMigKKwkJCWxlMzJfdG9fY3B1KEhEUihiaCktPmhfcmVmY291bnQpIC0gMSk7CisJCWlmIChjZSkKKwkJCW1iX2NhY2hlX2VudHJ5X3JlbGVhc2UoY2UpOworCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCWlmIChJU19TWU5DKGlub2RlKSkKKwkJCXN5bmNfZGlydHlfYnVmZmVyKGJoKTsKKwkJRFFVT1RfRlJFRV9CTE9DSyhpbm9kZSwgMSk7CisJfQorCWVhX2JkZWJ1ZyhiaCwgInJlZmNvdW50IG5vdz0lZCIsIGxlMzJfdG9fY3B1KEhEUihiaCktPmhfcmVmY291bnQpIC0gMSk7CisJdW5sb2NrX2J1ZmZlcihiaCk7CisJRVhUMl9JKGlub2RlKS0+aV9maWxlX2FjbCA9IDA7CisKK2NsZWFudXA6CisJYnJlbHNlKGJoKTsKKwl1cF93cml0ZSgmRVhUMl9JKGlub2RlKS0+eGF0dHJfc2VtKTsKK30KKworLyoKKyAqIGV4dDJfeGF0dHJfcHV0X3N1cGVyKCkKKyAqCisgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIGEgZmlsZSBzeXN0ZW0gaXMgdW5tb3VudGVkLgorICovCit2b2lkCitleHQyX3hhdHRyX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCW1iX2NhY2hlX3NocmluayhleHQyX3hhdHRyX2NhY2hlLCBzYi0+c19iZGV2KTsKK30KKworCisvKgorICogZXh0Ml94YXR0cl9jYWNoZV9pbnNlcnQoKQorICoKKyAqIENyZWF0ZSBhIG5ldyBlbnRyeSBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIGNhY2hlLCBhbmQgaW5zZXJ0CisgKiBpdCB1bmxlc3Mgc3VjaCBhbiBlbnRyeSBpcyBhbHJlYWR5IGluIHRoZSBjYWNoZS4KKyAqCisgKiBSZXR1cm5zIDAsIG9yIGEgbmVnYXRpdmUgZXJyb3IgbnVtYmVyIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQKK2V4dDJfeGF0dHJfY2FjaGVfaW5zZXJ0KHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJX191MzIgaGFzaCA9IGxlMzJfdG9fY3B1KEhEUihiaCktPmhfaGFzaCk7CisJc3RydWN0IG1iX2NhY2hlX2VudHJ5ICpjZTsKKwlpbnQgZXJyb3I7CisKKwljZSA9IG1iX2NhY2hlX2VudHJ5X2FsbG9jKGV4dDJfeGF0dHJfY2FjaGUpOworCWlmICghY2UpCisJCXJldHVybiAtRU5PTUVNOworCWVycm9yID0gbWJfY2FjaGVfZW50cnlfaW5zZXJ0KGNlLCBiaC0+Yl9iZGV2LCBiaC0+Yl9ibG9ja25yLCAmaGFzaCk7CisJaWYgKGVycm9yKSB7CisJCW1iX2NhY2hlX2VudHJ5X2ZyZWUoY2UpOworCQlpZiAoZXJyb3IgPT0gLUVCVVNZKSB7CisJCQllYV9iZGVidWcoYmgsICJhbHJlYWR5IGluIGNhY2hlICglZCBjYWNoZSBlbnRyaWVzKSIsCisJCQkJYXRvbWljX3JlYWQoJmV4dDJfeGF0dHJfY2FjaGUtPmNfZW50cnlfY291bnQpKTsKKwkJCWVycm9yID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCWVhX2JkZWJ1ZyhiaCwgImluc2VydGluZyBbJXhdICglZCBjYWNoZSBlbnRyaWVzKSIsIChpbnQpaGFzaCwKKwkJCSAgYXRvbWljX3JlYWQoJmV4dDJfeGF0dHJfY2FjaGUtPmNfZW50cnlfY291bnQpKTsKKwkJbWJfY2FjaGVfZW50cnlfcmVsZWFzZShjZSk7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIGV4dDJfeGF0dHJfY21wKCkKKyAqCisgKiBDb21wYXJlIHR3byBleHRlbmRlZCBhdHRyaWJ1dGUgYmxvY2tzIGZvciBlcXVhbGl0eS4KKyAqCisgKiBSZXR1cm5zIDAgaWYgdGhlIGJsb2NrcyBhcmUgZXF1YWwsIDEgaWYgdGhleSBkaWZmZXIsIGFuZAorICogYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIgb24gZXJyb3JzLgorICovCitzdGF0aWMgaW50CitleHQyX3hhdHRyX2NtcChzdHJ1Y3QgZXh0Ml94YXR0cl9oZWFkZXIgKmhlYWRlcjEsCisJICAgICAgIHN0cnVjdCBleHQyX3hhdHRyX2hlYWRlciAqaGVhZGVyMikKK3sKKwlzdHJ1Y3QgZXh0Ml94YXR0cl9lbnRyeSAqZW50cnkxLCAqZW50cnkyOworCisJZW50cnkxID0gRU5UUlkoaGVhZGVyMSsxKTsKKwllbnRyeTIgPSBFTlRSWShoZWFkZXIyKzEpOworCXdoaWxlICghSVNfTEFTVF9FTlRSWShlbnRyeTEpKSB7CisJCWlmIChJU19MQVNUX0VOVFJZKGVudHJ5MikpCisJCQlyZXR1cm4gMTsKKwkJaWYgKGVudHJ5MS0+ZV9oYXNoICE9IGVudHJ5Mi0+ZV9oYXNoIHx8CisJCSAgICBlbnRyeTEtPmVfbmFtZV9pbmRleCAhPSBlbnRyeTItPmVfbmFtZV9pbmRleCB8fAorCQkgICAgZW50cnkxLT5lX25hbWVfbGVuICE9IGVudHJ5Mi0+ZV9uYW1lX2xlbiB8fAorCQkgICAgZW50cnkxLT5lX3ZhbHVlX3NpemUgIT0gZW50cnkyLT5lX3ZhbHVlX3NpemUgfHwKKwkJICAgIG1lbWNtcChlbnRyeTEtPmVfbmFtZSwgZW50cnkyLT5lX25hbWUsIGVudHJ5MS0+ZV9uYW1lX2xlbikpCisJCQlyZXR1cm4gMTsKKwkJaWYgKGVudHJ5MS0+ZV92YWx1ZV9ibG9jayAhPSAwIHx8IGVudHJ5Mi0+ZV92YWx1ZV9ibG9jayAhPSAwKQorCQkJcmV0dXJuIC1FSU87CisJCWlmIChtZW1jbXAoKGNoYXIgKiloZWFkZXIxICsgbGUxNl90b19jcHUoZW50cnkxLT5lX3ZhbHVlX29mZnMpLAorCQkJICAgKGNoYXIgKiloZWFkZXIyICsgbGUxNl90b19jcHUoZW50cnkyLT5lX3ZhbHVlX29mZnMpLAorCQkJICAgbGUzMl90b19jcHUoZW50cnkxLT5lX3ZhbHVlX3NpemUpKSkKKwkJCXJldHVybiAxOworCisJCWVudHJ5MSA9IEVYVDJfWEFUVFJfTkVYVChlbnRyeTEpOworCQllbnRyeTIgPSBFWFQyX1hBVFRSX05FWFQoZW50cnkyKTsKKwl9CisJaWYgKCFJU19MQVNUX0VOVFJZKGVudHJ5MikpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCisvKgorICogZXh0Ml94YXR0cl9jYWNoZV9maW5kKCkKKyAqCisgKiBGaW5kIGFuIGlkZW50aWNhbCBleHRlbmRlZCBhdHRyaWJ1dGUgYmxvY2suCisgKgorICogUmV0dXJucyBhIGxvY2tlZCBidWZmZXIgaGVhZCB0byB0aGUgYmxvY2sgZm91bmQsIG9yIE5VTEwgaWYgc3VjaAorICogYSBibG9jayB3YXMgbm90IGZvdW5kIG9yIGFuIGVycm9yIG9jY3VycmVkLgorICovCitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICoKK2V4dDJfeGF0dHJfY2FjaGVfZmluZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZXh0Ml94YXR0cl9oZWFkZXIgKmhlYWRlcikKK3sKKwlfX3UzMiBoYXNoID0gbGUzMl90b19jcHUoaGVhZGVyLT5oX2hhc2gpOworCXN0cnVjdCBtYl9jYWNoZV9lbnRyeSAqY2U7CisKKwlpZiAoIWhlYWRlci0+aF9oYXNoKQorCQlyZXR1cm4gTlVMTDsgIC8qIG5ldmVyIHNoYXJlICovCisJZWFfaWRlYnVnKGlub2RlLCAibG9va2luZyBmb3IgY2FjaGVkIGJsb2NrcyBbJXhdIiwgKGludCloYXNoKTsKK2FnYWluOgorCWNlID0gbWJfY2FjaGVfZW50cnlfZmluZF9maXJzdChleHQyX3hhdHRyX2NhY2hlLCAwLAorCQkJCSAgICAgICBpbm9kZS0+aV9zYi0+c19iZGV2LCBoYXNoKTsKKwl3aGlsZSAoY2UpIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCQlpZiAoSVNfRVJSKGNlKSkgeworCQkJaWYgKFBUUl9FUlIoY2UpID09IC1FQUdBSU4pCisJCQkJZ290byBhZ2FpbjsKKwkJCWJyZWFrOworCQl9CisKKwkJYmggPSBzYl9icmVhZChpbm9kZS0+aV9zYiwgY2UtPmVfYmxvY2spOworCQlpZiAoIWJoKSB7CisJCQlleHQyX2Vycm9yKGlub2RlLT5pX3NiLCAiZXh0Ml94YXR0cl9jYWNoZV9maW5kIiwKKwkJCQkiaW5vZGUgJWxkOiBibG9jayAlbGQgcmVhZCBlcnJvciIsCisJCQkJaW5vZGUtPmlfaW5vLCAodW5zaWduZWQgbG9uZykgY2UtPmVfYmxvY2spOworCQl9IGVsc2UgeworCQkJbG9ja19idWZmZXIoYmgpOworCQkJaWYgKGxlMzJfdG9fY3B1KEhEUihiaCktPmhfcmVmY291bnQpID4KKwkJCQkgICBFWFQyX1hBVFRSX1JFRkNPVU5UX01BWCkgeworCQkJCWVhX2lkZWJ1Zyhpbm9kZSwgImJsb2NrICVsZCByZWZjb3VudCAlZD4lZCIsCisJCQkJCSAgKHVuc2lnbmVkIGxvbmcpIGNlLT5lX2Jsb2NrLAorCQkJCQkgIGxlMzJfdG9fY3B1KEhEUihiaCktPmhfcmVmY291bnQpLAorCQkJCQkgIEVYVDJfWEFUVFJfUkVGQ09VTlRfTUFYKTsKKwkJCX0gZWxzZSBpZiAoIWV4dDJfeGF0dHJfY21wKGhlYWRlciwgSERSKGJoKSkpIHsKKwkJCQllYV9iZGVidWcoYmgsICJiX2NvdW50PSVkIiwKKwkJCQkJICBhdG9taWNfcmVhZCgmKGJoLT5iX2NvdW50KSkpOworCQkJCW1iX2NhY2hlX2VudHJ5X3JlbGVhc2UoY2UpOworCQkJCXJldHVybiBiaDsKKwkJCX0KKwkJCXVubG9ja19idWZmZXIoYmgpOworCQkJYnJlbHNlKGJoKTsKKwkJfQorCQljZSA9IG1iX2NhY2hlX2VudHJ5X2ZpbmRfbmV4dChjZSwgMCwgaW5vZGUtPmlfc2ItPnNfYmRldiwgaGFzaCk7CisJfQorCXJldHVybiBOVUxMOworfQorCisjZGVmaW5lIE5BTUVfSEFTSF9TSElGVCA1CisjZGVmaW5lIFZBTFVFX0hBU0hfU0hJRlQgMTYKKworLyoKKyAqIGV4dDJfeGF0dHJfaGFzaF9lbnRyeSgpCisgKgorICogQ29tcHV0ZSB0aGUgaGFzaCBvZiBhbiBleHRlbmRlZCBhdHRyaWJ1dGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBleHQyX3hhdHRyX2hhc2hfZW50cnkoc3RydWN0IGV4dDJfeGF0dHJfaGVhZGVyICpoZWFkZXIsCisJCQkJCSBzdHJ1Y3QgZXh0Ml94YXR0cl9lbnRyeSAqZW50cnkpCit7CisJX191MzIgaGFzaCA9IDA7CisJY2hhciAqbmFtZSA9IGVudHJ5LT5lX25hbWU7CisJaW50IG47CisKKwlmb3IgKG49MDsgbiA8IGVudHJ5LT5lX25hbWVfbGVuOyBuKyspIHsKKwkJaGFzaCA9IChoYXNoIDw8IE5BTUVfSEFTSF9TSElGVCkgXgorCQkgICAgICAgKGhhc2ggPj4gKDgqc2l6ZW9mKGhhc2gpIC0gTkFNRV9IQVNIX1NISUZUKSkgXgorCQkgICAgICAgKm5hbWUrKzsKKwl9CisKKwlpZiAoZW50cnktPmVfdmFsdWVfYmxvY2sgPT0gMCAmJiBlbnRyeS0+ZV92YWx1ZV9zaXplICE9IDApIHsKKwkJX19sZTMyICp2YWx1ZSA9IChfX2xlMzIgKikoKGNoYXIgKiloZWFkZXIgKworCQkJbGUxNl90b19jcHUoZW50cnktPmVfdmFsdWVfb2ZmcykpOworCQlmb3IgKG4gPSAobGUzMl90b19jcHUoZW50cnktPmVfdmFsdWVfc2l6ZSkgKworCQkgICAgIEVYVDJfWEFUVFJfUk9VTkQpID4+IEVYVDJfWEFUVFJfUEFEX0JJVFM7IG47IG4tLSkgeworCQkJaGFzaCA9IChoYXNoIDw8IFZBTFVFX0hBU0hfU0hJRlQpIF4KKwkJCSAgICAgICAoaGFzaCA+PiAoOCpzaXplb2YoaGFzaCkgLSBWQUxVRV9IQVNIX1NISUZUKSkgXgorCQkJICAgICAgIGxlMzJfdG9fY3B1KCp2YWx1ZSsrKTsKKwkJfQorCX0KKwllbnRyeS0+ZV9oYXNoID0gY3B1X3RvX2xlMzIoaGFzaCk7Cit9CisKKyN1bmRlZiBOQU1FX0hBU0hfU0hJRlQKKyN1bmRlZiBWQUxVRV9IQVNIX1NISUZUCisKKyNkZWZpbmUgQkxPQ0tfSEFTSF9TSElGVCAxNgorCisvKgorICogZXh0Ml94YXR0cl9yZWhhc2goKQorICoKKyAqIFJlLWNvbXB1dGUgdGhlIGV4dGVuZGVkIGF0dHJpYnV0ZSBoYXNoIHZhbHVlIGFmdGVyIGFuIGVudHJ5IGhhcyBjaGFuZ2VkLgorICovCitzdGF0aWMgdm9pZCBleHQyX3hhdHRyX3JlaGFzaChzdHJ1Y3QgZXh0Ml94YXR0cl9oZWFkZXIgKmhlYWRlciwKKwkJCSAgICAgIHN0cnVjdCBleHQyX3hhdHRyX2VudHJ5ICplbnRyeSkKK3sKKwlzdHJ1Y3QgZXh0Ml94YXR0cl9lbnRyeSAqaGVyZTsKKwlfX3UzMiBoYXNoID0gMDsKKwkKKwlleHQyX3hhdHRyX2hhc2hfZW50cnkoaGVhZGVyLCBlbnRyeSk7CisJaGVyZSA9IEVOVFJZKGhlYWRlcisxKTsKKwl3aGlsZSAoIUlTX0xBU1RfRU5UUlkoaGVyZSkpIHsKKwkJaWYgKCFoZXJlLT5lX2hhc2gpIHsKKwkJCS8qIEJsb2NrIGlzIG5vdCBzaGFyZWQgaWYgYW4gZW50cnkncyBoYXNoIHZhbHVlID09IDAgKi8KKwkJCWhhc2ggPSAwOworCQkJYnJlYWs7CisJCX0KKwkJaGFzaCA9IChoYXNoIDw8IEJMT0NLX0hBU0hfU0hJRlQpIF4KKwkJICAgICAgIChoYXNoID4+ICg4KnNpemVvZihoYXNoKSAtIEJMT0NLX0hBU0hfU0hJRlQpKSBeCisJCSAgICAgICBsZTMyX3RvX2NwdShoZXJlLT5lX2hhc2gpOworCQloZXJlID0gRVhUMl9YQVRUUl9ORVhUKGhlcmUpOworCX0KKwloZWFkZXItPmhfaGFzaCA9IGNwdV90b19sZTMyKGhhc2gpOworfQorCisjdW5kZWYgQkxPQ0tfSEFTSF9TSElGVAorCitpbnQgX19pbml0Citpbml0X2V4dDJfeGF0dHIodm9pZCkKK3sKKwlleHQyX3hhdHRyX2NhY2hlID0gbWJfY2FjaGVfY3JlYXRlKCJleHQyX3hhdHRyIiwgTlVMTCwKKwkJc2l6ZW9mKHN0cnVjdCBtYl9jYWNoZV9lbnRyeSkgKworCQlzaXplb2YoKChzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKikgMCktPmVfaW5kZXhlc1swXSksIDEsIDYpOworCWlmICghZXh0Ml94YXR0cl9jYWNoZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK2V4aXRfZXh0Ml94YXR0cih2b2lkKQoreworCW1iX2NhY2hlX2Rlc3Ryb3koZXh0Ml94YXR0cl9jYWNoZSk7Cit9CmRpZmYgLS1naXQgYS9mcy9leHQyL3hhdHRyLmggYi9mcy9leHQyL3hhdHRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYzYmZkZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDIveGF0dHIuaApAQCAtMCwwICsxLDExOCBAQAorLyoKKyAgRmlsZTogbGludXgvZXh0Ml94YXR0ci5oCisKKyAgT24tZGlzayBmb3JtYXQgb2YgZXh0ZW5kZWQgYXR0cmlidXRlcyBmb3IgdGhlIGV4dDIgZmlsZXN5c3RlbS4KKworICAoQykgMjAwMSBBbmRyZWFzIEdydWVuYmFjaGVyLCA8YS5ncnVlbmJhY2hlckBjb21wdXRlci5vcmc+CisqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3hhdHRyLmg+CisKKy8qIE1hZ2ljIHZhbHVlIGluIGF0dHJpYnV0ZSBibG9ja3MgKi8KKyNkZWZpbmUgRVhUMl9YQVRUUl9NQUdJQwkJMHhFQTAyMDAwMAorCisvKiBNYXhpbXVtIG51bWJlciBvZiByZWZlcmVuY2VzIHRvIG9uZSBhdHRyaWJ1dGUgYmxvY2sgKi8KKyNkZWZpbmUgRVhUMl9YQVRUUl9SRUZDT1VOVF9NQVgJCTEwMjQKKworLyogTmFtZSBpbmRleGVzICovCisjZGVmaW5lIEVYVDJfWEFUVFJfSU5ERVhfVVNFUgkJCTEKKyNkZWZpbmUgRVhUMl9YQVRUUl9JTkRFWF9QT1NJWF9BQ0xfQUNDRVNTCTIKKyNkZWZpbmUgRVhUMl9YQVRUUl9JTkRFWF9QT1NJWF9BQ0xfREVGQVVMVAkzCisjZGVmaW5lIEVYVDJfWEFUVFJfSU5ERVhfVFJVU1RFRAkJNAorI2RlZmluZQlFWFQyX1hBVFRSX0lOREVYX0xVU1RSRQkJCTUKKyNkZWZpbmUgRVhUMl9YQVRUUl9JTkRFWF9TRUNVUklUWQkgICAgICAgIDYKKworc3RydWN0IGV4dDJfeGF0dHJfaGVhZGVyIHsKKwlfX2xlMzIJaF9tYWdpYzsJLyogbWFnaWMgbnVtYmVyIGZvciBpZGVudGlmaWNhdGlvbiAqLworCV9fbGUzMgloX3JlZmNvdW50OwkvKiByZWZlcmVuY2UgY291bnQgKi8KKwlfX2xlMzIJaF9ibG9ja3M7CS8qIG51bWJlciBvZiBkaXNrIGJsb2NrcyB1c2VkICovCisJX19sZTMyCWhfaGFzaDsJCS8qIGhhc2ggdmFsdWUgb2YgYWxsIGF0dHJpYnV0ZXMgKi8KKwlfX3UzMgloX3Jlc2VydmVkWzRdOwkvKiB6ZXJvIHJpZ2h0IG5vdyAqLworfTsKKworc3RydWN0IGV4dDJfeGF0dHJfZW50cnkgeworCV9fdTgJZV9uYW1lX2xlbjsJLyogbGVuZ3RoIG9mIG5hbWUgKi8KKwlfX3U4CWVfbmFtZV9pbmRleDsJLyogYXR0cmlidXRlIG5hbWUgaW5kZXggKi8KKwlfX2xlMTYJZV92YWx1ZV9vZmZzOwkvKiBvZmZzZXQgaW4gZGlzayBibG9jayBvZiB2YWx1ZSAqLworCV9fbGUzMgllX3ZhbHVlX2Jsb2NrOwkvKiBkaXNrIGJsb2NrIGF0dHJpYnV0ZSBpcyBzdG9yZWQgb24gKG4vaSkgKi8KKwlfX2xlMzIJZV92YWx1ZV9zaXplOwkvKiBzaXplIG9mIGF0dHJpYnV0ZSB2YWx1ZSAqLworCV9fbGUzMgllX2hhc2g7CQkvKiBoYXNoIHZhbHVlIG9mIG5hbWUgYW5kIHZhbHVlICovCisJY2hhcgllX25hbWVbMF07CS8qIGF0dHJpYnV0ZSBuYW1lICovCit9OworCisjZGVmaW5lIEVYVDJfWEFUVFJfUEFEX0JJVFMJCTIKKyNkZWZpbmUgRVhUMl9YQVRUUl9QQUQJCSgxPDxFWFQyX1hBVFRSX1BBRF9CSVRTKQorI2RlZmluZSBFWFQyX1hBVFRSX1JPVU5ECQkoRVhUMl9YQVRUUl9QQUQtMSkKKyNkZWZpbmUgRVhUMl9YQVRUUl9MRU4obmFtZV9sZW4pIFwKKwkoKChuYW1lX2xlbikgKyBFWFQyX1hBVFRSX1JPVU5EICsgXAorCXNpemVvZihzdHJ1Y3QgZXh0Ml94YXR0cl9lbnRyeSkpICYgfkVYVDJfWEFUVFJfUk9VTkQpCisjZGVmaW5lIEVYVDJfWEFUVFJfTkVYVChlbnRyeSkgXAorCSggKHN0cnVjdCBleHQyX3hhdHRyX2VudHJ5ICopKCBcCisJICAoY2hhciAqKShlbnRyeSkgKyBFWFQyX1hBVFRSX0xFTigoZW50cnkpLT5lX25hbWVfbGVuKSkgKQorI2RlZmluZSBFWFQyX1hBVFRSX1NJWkUoc2l6ZSkgXAorCSgoKHNpemUpICsgRVhUMl9YQVRUUl9ST1VORCkgJiB+RVhUMl9YQVRUUl9ST1VORCkKKworIyBpZmRlZiBDT05GSUdfRVhUMl9GU19YQVRUUgorCitleHRlcm4gc3RydWN0IHhhdHRyX2hhbmRsZXIgZXh0Ml94YXR0cl91c2VyX2hhbmRsZXI7CitleHRlcm4gc3RydWN0IHhhdHRyX2hhbmRsZXIgZXh0Ml94YXR0cl90cnVzdGVkX2hhbmRsZXI7CitleHRlcm4gc3RydWN0IHhhdHRyX2hhbmRsZXIgZXh0Ml94YXR0cl9hY2xfYWNjZXNzX2hhbmRsZXI7CitleHRlcm4gc3RydWN0IHhhdHRyX2hhbmRsZXIgZXh0Ml94YXR0cl9hY2xfZGVmYXVsdF9oYW5kbGVyOworZXh0ZXJuIHN0cnVjdCB4YXR0cl9oYW5kbGVyIGV4dDJfeGF0dHJfc2VjdXJpdHlfaGFuZGxlcjsKKworZXh0ZXJuIHNzaXplX3QgZXh0Ml9saXN0eGF0dHIoc3RydWN0IGRlbnRyeSAqLCBjaGFyICosIHNpemVfdCk7CisKK2V4dGVybiBpbnQgZXh0Ml94YXR0cl9nZXQoc3RydWN0IGlub2RlICosIGludCwgY29uc3QgY2hhciAqLCB2b2lkICosIHNpemVfdCk7CitleHRlcm4gaW50IGV4dDJfeGF0dHJfc2V0KHN0cnVjdCBpbm9kZSAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QsIGludCk7CisKK2V4dGVybiB2b2lkIGV4dDJfeGF0dHJfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiB2b2lkIGV4dDJfeGF0dHJfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKKworZXh0ZXJuIGludCBpbml0X2V4dDJfeGF0dHIodm9pZCk7CitleHRlcm4gdm9pZCBleGl0X2V4dDJfeGF0dHIodm9pZCk7CisKK2V4dGVybiBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqZXh0Ml94YXR0cl9oYW5kbGVyc1tdOworCisjIGVsc2UgIC8qIENPTkZJR19FWFQyX0ZTX1hBVFRSICovCisKK3N0YXRpYyBpbmxpbmUgaW50CitleHQyX3hhdHRyX2dldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbmFtZV9pbmRleCwKKwkgICAgICAgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitleHQyX3hhdHRyX3NldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbmFtZV9pbmRleCwgY29uc3QgY2hhciAqbmFtZSwKKwkgICAgICAgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2V4dDJfeGF0dHJfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZXh0Ml94YXR0cl9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKK30KKworc3RhdGljIGlubGluZSBpbnQKK2luaXRfZXh0Ml94YXR0cih2b2lkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2V4aXRfZXh0Ml94YXR0cih2b2lkKQoreworfQorCisjZGVmaW5lIGV4dDJfeGF0dHJfaGFuZGxlcnMgTlVMTAorCisjIGVuZGlmICAvKiBDT05GSUdfRVhUMl9GU19YQVRUUiAqLworCmRpZmYgLS1naXQgYS9mcy9leHQyL3hhdHRyX3NlY3VyaXR5LmMgYi9mcy9leHQyL3hhdHRyX3NlY3VyaXR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE2YzU5ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDIveGF0dHJfc2VjdXJpdHkuYwpAQCAtMCwwICsxLDUzIEBACisvKgorICogbGludXgvZnMvZXh0Mi94YXR0cl9zZWN1cml0eS5jCisgKiBIYW5kbGVyIGZvciBzdG9yaW5nIHNlY3VyaXR5IGxhYmVscyBhcyBleHRlbmRlZCBhdHRyaWJ1dGVzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXh0Ml9mcy5oPgorI2luY2x1ZGUgInhhdHRyLmgiCisKK3N0YXRpYyBzaXplX3QKK2V4dDJfeGF0dHJfc2VjdXJpdHlfbGlzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjaGFyICpsaXN0LCBzaXplX3QgbGlzdF9zaXplLAorCQkJIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lX2xlbikKK3sKKwljb25zdCBpbnQgcHJlZml4X2xlbiA9IHNpemVvZihYQVRUUl9TRUNVUklUWV9QUkVGSVgpLTE7CisJY29uc3Qgc2l6ZV90IHRvdGFsX2xlbiA9IHByZWZpeF9sZW4gKyBuYW1lX2xlbiArIDE7CisKKwlpZiAobGlzdCAmJiB0b3RhbF9sZW4gPD0gbGlzdF9zaXplKSB7CisJCW1lbWNweShsaXN0LCBYQVRUUl9TRUNVUklUWV9QUkVGSVgsIHByZWZpeF9sZW4pOworCQltZW1jcHkobGlzdCtwcmVmaXhfbGVuLCBuYW1lLCBuYW1lX2xlbik7CisJCWxpc3RbcHJlZml4X2xlbiArIG5hbWVfbGVuXSA9ICdcMCc7CisJfQorCXJldHVybiB0b3RhbF9sZW47Cit9CisKK3N0YXRpYyBpbnQKK2V4dDJfeGF0dHJfc2VjdXJpdHlfZ2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgICB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQoreworCWlmIChzdHJjbXAobmFtZSwgIiIpID09IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBleHQyX3hhdHRyX2dldChpbm9kZSwgRVhUMl9YQVRUUl9JTkRFWF9TRUNVUklUWSwgbmFtZSwKKwkJCSAgICAgIGJ1ZmZlciwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQKK2V4dDJfeGF0dHJfc2VjdXJpdHlfc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlpZiAoc3RyY21wKG5hbWUsICIiKSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gZXh0Ml94YXR0cl9zZXQoaW5vZGUsIEVYVDJfWEFUVFJfSU5ERVhfU0VDVVJJVFksIG5hbWUsCisJCQkgICAgICB2YWx1ZSwgc2l6ZSwgZmxhZ3MpOworfQorCitzdHJ1Y3QgeGF0dHJfaGFuZGxlciBleHQyX3hhdHRyX3NlY3VyaXR5X2hhbmRsZXIgPSB7CisJLnByZWZpeAk9IFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCwKKwkubGlzdAk9IGV4dDJfeGF0dHJfc2VjdXJpdHlfbGlzdCwKKwkuZ2V0CT0gZXh0Ml94YXR0cl9zZWN1cml0eV9nZXQsCisJLnNldAk9IGV4dDJfeGF0dHJfc2VjdXJpdHlfc2V0LAorfTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDIveGF0dHJfdHJ1c3RlZC5jIGIvZnMvZXh0Mi94YXR0cl90cnVzdGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJiMzBlZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDIveGF0dHJfdHJ1c3RlZC5jCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBsaW51eC9mcy9leHQyL3hhdHRyX3RydXN0ZWQuYworICogSGFuZGxlciBmb3IgdHJ1c3RlZCBleHRlbmRlZCBhdHRyaWJ1dGVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBieSBBbmRyZWFzIEdydWVuYmFjaGVyLCA8YS5ncnVlbmJhY2hlckBjb21wdXRlci5vcmc+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9leHQyX2ZzLmg+CisjaW5jbHVkZSAieGF0dHIuaCIKKworI2RlZmluZSBYQVRUUl9UUlVTVEVEX1BSRUZJWCAidHJ1c3RlZC4iCisKK3N0YXRpYyBzaXplX3QKK2V4dDJfeGF0dHJfdHJ1c3RlZF9saXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNoYXIgKmxpc3QsIHNpemVfdCBsaXN0X3NpemUsCisJCQljb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZV9sZW4pCit7CisJY29uc3QgaW50IHByZWZpeF9sZW4gPSBzaXplb2YoWEFUVFJfVFJVU1RFRF9QUkVGSVgpLTE7CisJY29uc3Qgc2l6ZV90IHRvdGFsX2xlbiA9IHByZWZpeF9sZW4gKyBuYW1lX2xlbiArIDE7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAwOworCisJaWYgKGxpc3QgJiYgdG90YWxfbGVuIDw9IGxpc3Rfc2l6ZSkgeworCQltZW1jcHkobGlzdCwgWEFUVFJfVFJVU1RFRF9QUkVGSVgsIHByZWZpeF9sZW4pOworCQltZW1jcHkobGlzdCtwcmVmaXhfbGVuLCBuYW1lLCBuYW1lX2xlbik7CisJCWxpc3RbcHJlZml4X2xlbiArIG5hbWVfbGVuXSA9ICdcMCc7CisJfQorCXJldHVybiB0b3RhbF9sZW47Cit9CisKK3N0YXRpYyBpbnQKK2V4dDJfeGF0dHJfdHJ1c3RlZF9nZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICAgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisJaWYgKHN0cmNtcChuYW1lLCAiIikgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCXJldHVybiBleHQyX3hhdHRyX2dldChpbm9kZSwgRVhUMl9YQVRUUl9JTkRFWF9UUlVTVEVELCBuYW1lLAorCQkJICAgICAgYnVmZmVyLCBzaXplKTsKK30KKworc3RhdGljIGludAorZXh0Ml94YXR0cl90cnVzdGVkX3NldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgICAgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisJaWYgKHN0cmNtcChuYW1lLCAiIikgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCXJldHVybiBleHQyX3hhdHRyX3NldChpbm9kZSwgRVhUMl9YQVRUUl9JTkRFWF9UUlVTVEVELCBuYW1lLAorCQkJICAgICAgdmFsdWUsIHNpemUsIGZsYWdzKTsKK30KKworc3RydWN0IHhhdHRyX2hhbmRsZXIgZXh0Ml94YXR0cl90cnVzdGVkX2hhbmRsZXIgPSB7CisJLnByZWZpeAk9IFhBVFRSX1RSVVNURURfUFJFRklYLAorCS5saXN0CT0gZXh0Ml94YXR0cl90cnVzdGVkX2xpc3QsCisJLmdldAk9IGV4dDJfeGF0dHJfdHJ1c3RlZF9nZXQsCisJLnNldAk9IGV4dDJfeGF0dHJfdHJ1c3RlZF9zZXQsCit9OwpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi94YXR0cl91c2VyLmMgYi9mcy9leHQyL3hhdHRyX3VzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzAzZWExCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0Mi94YXR0cl91c2VyLmMKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIGxpbnV4L2ZzL2V4dDIveGF0dHJfdXNlci5jCisgKiBIYW5kbGVyIGZvciBleHRlbmRlZCB1c2VyIGF0dHJpYnV0ZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIGJ5IEFuZHJlYXMgR3J1ZW5iYWNoZXIsIDxhLmdydWVuYmFjaGVyQGNvbXB1dGVyLm9yZz4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgImV4dDIuaCIKKyNpbmNsdWRlICJ4YXR0ci5oIgorCisjZGVmaW5lIFhBVFRSX1VTRVJfUFJFRklYICJ1c2VyLiIKKworc3RhdGljIHNpemVfdAorZXh0Ml94YXR0cl91c2VyX2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwgY2hhciAqbGlzdCwgc2l6ZV90IGxpc3Rfc2l6ZSwKKwkJICAgICBjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZV9sZW4pCit7CisJY29uc3Qgc2l6ZV90IHByZWZpeF9sZW4gPSBzaXplb2YoWEFUVFJfVVNFUl9QUkVGSVgpLTE7CisJY29uc3Qgc2l6ZV90IHRvdGFsX2xlbiA9IHByZWZpeF9sZW4gKyBuYW1lX2xlbiArIDE7CisKKwlpZiAoIXRlc3Rfb3B0KGlub2RlLT5pX3NiLCBYQVRUUl9VU0VSKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAobGlzdCAmJiB0b3RhbF9sZW4gPD0gbGlzdF9zaXplKSB7CisJCW1lbWNweShsaXN0LCBYQVRUUl9VU0VSX1BSRUZJWCwgcHJlZml4X2xlbik7CisJCW1lbWNweShsaXN0K3ByZWZpeF9sZW4sIG5hbWUsIG5hbWVfbGVuKTsKKwkJbGlzdFtwcmVmaXhfbGVuICsgbmFtZV9sZW5dID0gJ1wwJzsKKwl9CisJcmV0dXJuIHRvdGFsX2xlbjsKK30KKworc3RhdGljIGludAorZXh0Ml94YXR0cl91c2VyX2dldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgZXJyb3I7CisKKwlpZiAoc3RyY21wKG5hbWUsICIiKSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIXRlc3Rfb3B0KGlub2RlLT5pX3NiLCBYQVRUUl9VU0VSKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCWVycm9yID0gcGVybWlzc2lvbihpbm9kZSwgTUFZX1JFQUQsIE5VTEwpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJcmV0dXJuIGV4dDJfeGF0dHJfZ2V0KGlub2RlLCBFWFQyX1hBVFRSX0lOREVYX1VTRVIsIG5hbWUsIGJ1ZmZlciwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQKK2V4dDJfeGF0dHJfdXNlcl9zZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCWludCBlcnJvcjsKKworCWlmIChzdHJjbXAobmFtZSwgIiIpID09IDApCisJCXJldHVybiAtRUlOVkFMOworCWlmICghdGVzdF9vcHQoaW5vZGUtPmlfc2IsIFhBVFRSX1VTRVIpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJaWYgKCAhU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJgorCSAgICAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkgfHwgaW5vZGUtPmlfbW9kZSAmIFNfSVNWVFgpKQorCQlyZXR1cm4gLUVQRVJNOworCWVycm9yID0gcGVybWlzc2lvbihpbm9kZSwgTUFZX1dSSVRFLCBOVUxMKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCXJldHVybiBleHQyX3hhdHRyX3NldChpbm9kZSwgRVhUMl9YQVRUUl9JTkRFWF9VU0VSLCBuYW1lLAorCQkJICAgICAgdmFsdWUsIHNpemUsIGZsYWdzKTsKK30KKworc3RydWN0IHhhdHRyX2hhbmRsZXIgZXh0Ml94YXR0cl91c2VyX2hhbmRsZXIgPSB7CisJLnByZWZpeAk9IFhBVFRSX1VTRVJfUFJFRklYLAorCS5saXN0CT0gZXh0Ml94YXR0cl91c2VyX2xpc3QsCisJLmdldAk9IGV4dDJfeGF0dHJfdXNlcl9nZXQsCisJLnNldAk9IGV4dDJfeGF0dHJfdXNlcl9zZXQsCit9OwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9NYWtlZmlsZSBiL2ZzL2V4dDMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA0Y2Q0NAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDMvTWFrZWZpbGUKQEAgLTAsMCArMSwxMiBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGV4dDMtZmlsZXN5c3RlbSByb3V0aW5lcy4KKyMKKworb2JqLSQoQ09ORklHX0VYVDNfRlMpICs9IGV4dDMubworCitleHQzLXkJOj0gYmFsbG9jLm8gYml0bWFwLm8gZGlyLm8gZmlsZS5vIGZzeW5jLm8gaWFsbG9jLm8gaW5vZGUubyBcCisJICAgaW9jdGwubyBuYW1laS5vIHN1cGVyLm8gc3ltbGluay5vIGhhc2gubyByZXNpemUubworCitleHQzLSQoQ09ORklHX0VYVDNfRlNfWEFUVFIpCSArPSB4YXR0ci5vIHhhdHRyX3VzZXIubyB4YXR0cl90cnVzdGVkLm8KK2V4dDMtJChDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wpICs9IGFjbC5vCitleHQzLSQoQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkpCSArPSB4YXR0cl9zZWN1cml0eS5vCmRpZmYgLS1naXQgYS9mcy9leHQzL2FjbC5jIGIvZnMvZXh0My9hY2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjg1OTJjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0My9hY2wuYwpAQCAtMCwwICsxLDU0NyBAQAorLyoKKyAqIGxpbnV4L2ZzL2V4dDMvYWNsLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBBbmRyZWFzIEdydWVuYmFjaGVyLCA8YWdydWVuQHN1c2UuZGU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDNfamJkLmg+CisjaW5jbHVkZSA8bGludXgvZXh0M19mcy5oPgorI2luY2x1ZGUgInhhdHRyLmgiCisjaW5jbHVkZSAiYWNsLmgiCisKKy8qCisgKiBDb252ZXJ0IGZyb20gZmlsZXN5c3RlbSB0byBpbi1tZW1vcnkgcmVwcmVzZW50YXRpb24uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcG9zaXhfYWNsICoKK2V4dDNfYWNsX2Zyb21fZGlzayhjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUpCit7CisJY29uc3QgY2hhciAqZW5kID0gKGNoYXIgKil2YWx1ZSArIHNpemU7CisJaW50IG4sIGNvdW50OworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKKworCWlmICghdmFsdWUpCisJCXJldHVybiBOVUxMOworCWlmIChzaXplIDwgc2l6ZW9mKGV4dDNfYWNsX2hlYWRlcikpCisJCSByZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwlpZiAoKChleHQzX2FjbF9oZWFkZXIgKil2YWx1ZSktPmFfdmVyc2lvbiAhPQorCSAgICBjcHVfdG9fbGUzMihFWFQzX0FDTF9WRVJTSU9OKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJdmFsdWUgPSAoY2hhciAqKXZhbHVlICsgc2l6ZW9mKGV4dDNfYWNsX2hlYWRlcik7CisJY291bnQgPSBleHQzX2FjbF9jb3VudChzaXplKTsKKwlpZiAoY291bnQgPCAwKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwlpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisJYWNsID0gcG9zaXhfYWNsX2FsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFjbCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJZm9yIChuPTA7IG4gPCBjb3VudDsgbisrKSB7CisJCWV4dDNfYWNsX2VudHJ5ICplbnRyeSA9CisJCQkoZXh0M19hY2xfZW50cnkgKil2YWx1ZTsKKwkJaWYgKChjaGFyICopdmFsdWUgKyBzaXplb2YoZXh0M19hY2xfZW50cnlfc2hvcnQpID4gZW5kKQorCQkJZ290byBmYWlsOworCQlhY2wtPmFfZW50cmllc1tuXS5lX3RhZyAgPSBsZTE2X3RvX2NwdShlbnRyeS0+ZV90YWcpOworCQlhY2wtPmFfZW50cmllc1tuXS5lX3Blcm0gPSBsZTE2X3RvX2NwdShlbnRyeS0+ZV9wZXJtKTsKKwkJc3dpdGNoKGFjbC0+YV9lbnRyaWVzW25dLmVfdGFnKSB7CisJCQljYXNlIEFDTF9VU0VSX09CSjoKKwkJCWNhc2UgQUNMX0dST1VQX09CSjoKKwkJCWNhc2UgQUNMX01BU0s6CisJCQljYXNlIEFDTF9PVEhFUjoKKwkJCQl2YWx1ZSA9IChjaGFyICopdmFsdWUgKworCQkJCQlzaXplb2YoZXh0M19hY2xfZW50cnlfc2hvcnQpOworCQkJCWFjbC0+YV9lbnRyaWVzW25dLmVfaWQgPSBBQ0xfVU5ERUZJTkVEX0lEOworCQkJCWJyZWFrOworCisJCQljYXNlIEFDTF9VU0VSOgorCQkJY2FzZSBBQ0xfR1JPVVA6CisJCQkJdmFsdWUgPSAoY2hhciAqKXZhbHVlICsgc2l6ZW9mKGV4dDNfYWNsX2VudHJ5KTsKKwkJCQlpZiAoKGNoYXIgKil2YWx1ZSA+IGVuZCkKKwkJCQkJZ290byBmYWlsOworCQkJCWFjbC0+YV9lbnRyaWVzW25dLmVfaWQgPQorCQkJCQlsZTMyX3RvX2NwdShlbnRyeS0+ZV9pZCk7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJZ290byBmYWlsOworCQl9CisJfQorCWlmICh2YWx1ZSAhPSBlbmQpCisJCWdvdG8gZmFpbDsKKwlyZXR1cm4gYWNsOworCitmYWlsOgorCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CisJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Cit9CisKKy8qCisgKiBDb252ZXJ0IGZyb20gaW4tbWVtb3J5IHRvIGZpbGVzeXN0ZW0gcmVwcmVzZW50YXRpb24uCisgKi8KK3N0YXRpYyB2b2lkICoKK2V4dDNfYWNsX3RvX2Rpc2soY29uc3Qgc3RydWN0IHBvc2l4X2FjbCAqYWNsLCBzaXplX3QgKnNpemUpCit7CisJZXh0M19hY2xfaGVhZGVyICpleHRfYWNsOworCWNoYXIgKmU7CisJc2l6ZV90IG47CisKKwkqc2l6ZSA9IGV4dDNfYWNsX3NpemUoYWNsLT5hX2NvdW50KTsKKwlleHRfYWNsID0gKGV4dDNfYWNsX2hlYWRlciAqKWttYWxsb2Moc2l6ZW9mKGV4dDNfYWNsX2hlYWRlcikgKworCQlhY2wtPmFfY291bnQgKiBzaXplb2YoZXh0M19hY2xfZW50cnkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWV4dF9hY2wpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWV4dF9hY2wtPmFfdmVyc2lvbiA9IGNwdV90b19sZTMyKEVYVDNfQUNMX1ZFUlNJT04pOworCWUgPSAoY2hhciAqKWV4dF9hY2wgKyBzaXplb2YoZXh0M19hY2xfaGVhZGVyKTsKKwlmb3IgKG49MDsgbiA8IGFjbC0+YV9jb3VudDsgbisrKSB7CisJCWV4dDNfYWNsX2VudHJ5ICplbnRyeSA9IChleHQzX2FjbF9lbnRyeSAqKWU7CisJCWVudHJ5LT5lX3RhZyAgPSBjcHVfdG9fbGUxNihhY2wtPmFfZW50cmllc1tuXS5lX3RhZyk7CisJCWVudHJ5LT5lX3Blcm0gPSBjcHVfdG9fbGUxNihhY2wtPmFfZW50cmllc1tuXS5lX3Blcm0pOworCQlzd2l0Y2goYWNsLT5hX2VudHJpZXNbbl0uZV90YWcpIHsKKwkJCWNhc2UgQUNMX1VTRVI6CisJCQljYXNlIEFDTF9HUk9VUDoKKwkJCQllbnRyeS0+ZV9pZCA9CisJCQkJCWNwdV90b19sZTMyKGFjbC0+YV9lbnRyaWVzW25dLmVfaWQpOworCQkJCWUgKz0gc2l6ZW9mKGV4dDNfYWNsX2VudHJ5KTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBBQ0xfVVNFUl9PQko6CisJCQljYXNlIEFDTF9HUk9VUF9PQko6CisJCQljYXNlIEFDTF9NQVNLOgorCQkJY2FzZSBBQ0xfT1RIRVI6CisJCQkJZSArPSBzaXplb2YoZXh0M19hY2xfZW50cnlfc2hvcnQpOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKwlyZXR1cm4gKGNoYXIgKilleHRfYWNsOworCitmYWlsOgorCWtmcmVlKGV4dF9hY2wpOworCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwb3NpeF9hY2wgKgorZXh0M19pZ2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcG9zaXhfYWNsICoqaV9hY2wpCit7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsID0gRVhUM19BQ0xfTk9UX0NBQ0hFRDsKKworCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJaWYgKCppX2FjbCAhPSBFWFQzX0FDTF9OT1RfQ0FDSEVEKQorCQlhY2wgPSBwb3NpeF9hY2xfZHVwKCppX2FjbCk7CisJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCisJcmV0dXJuIGFjbDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitleHQzX2lzZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwb3NpeF9hY2wgKippX2FjbCwKKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBwb3NpeF9hY2wgKmFjbCkKK3sKKwlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCWlmICgqaV9hY2wgIT0gRVhUM19BQ0xfTk9UX0NBQ0hFRCkKKwkJcG9zaXhfYWNsX3JlbGVhc2UoKmlfYWNsKTsKKwkqaV9hY2wgPSBwb3NpeF9hY2xfZHVwKGFjbCk7CisJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworfQorCisvKgorICogSW5vZGUgb3BlcmF0aW9uIGdldF9wb3NpeF9hY2woKS4KKyAqCisgKiBpbm9kZS0+aV9zZW06IGRvbid0IGNhcmUKKyAqLworc3RhdGljIHN0cnVjdCBwb3NpeF9hY2wgKgorZXh0M19nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKQoreworCXN0cnVjdCBleHQzX2lub2RlX2luZm8gKmVpID0gRVhUM19JKGlub2RlKTsKKwlpbnQgbmFtZV9pbmRleDsKKwljaGFyICp2YWx1ZSA9IE5VTEw7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsOworCWludCByZXR2YWw7CisKKwlpZiAoIXRlc3Rfb3B0KGlub2RlLT5pX3NiLCBQT1NJWF9BQ0wpKQorCQlyZXR1cm4gTlVMTDsKKworCXN3aXRjaCh0eXBlKSB7CisJCWNhc2UgQUNMX1RZUEVfQUNDRVNTOgorCQkJYWNsID0gZXh0M19pZ2V0X2FjbChpbm9kZSwgJmVpLT5pX2FjbCk7CisJCQlpZiAoYWNsICE9IEVYVDNfQUNMX05PVF9DQUNIRUQpCisJCQkJcmV0dXJuIGFjbDsKKwkJCW5hbWVfaW5kZXggPSBFWFQzX1hBVFRSX0lOREVYX1BPU0lYX0FDTF9BQ0NFU1M7CisJCQlicmVhazsKKworCQljYXNlIEFDTF9UWVBFX0RFRkFVTFQ6CisJCQlhY2wgPSBleHQzX2lnZXRfYWNsKGlub2RlLCAmZWktPmlfZGVmYXVsdF9hY2wpOworCQkJaWYgKGFjbCAhPSBFWFQzX0FDTF9OT1RfQ0FDSEVEKQorCQkJCXJldHVybiBhY2w7CisJCQluYW1lX2luZGV4ID0gRVhUM19YQVRUUl9JTkRFWF9QT1NJWF9BQ0xfREVGQVVMVDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisJcmV0dmFsID0gZXh0M194YXR0cl9nZXQoaW5vZGUsIG5hbWVfaW5kZXgsICIiLCBOVUxMLCAwKTsKKwlpZiAocmV0dmFsID4gMCkgeworCQl2YWx1ZSA9IGttYWxsb2MocmV0dmFsLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF2YWx1ZSkKKwkJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCQlyZXR2YWwgPSBleHQzX3hhdHRyX2dldChpbm9kZSwgbmFtZV9pbmRleCwgIiIsIHZhbHVlLCByZXR2YWwpOworCX0KKwlpZiAocmV0dmFsID4gMCkKKwkJYWNsID0gZXh0M19hY2xfZnJvbV9kaXNrKHZhbHVlLCByZXR2YWwpOworCWVsc2UgaWYgKHJldHZhbCA9PSAtRU5PREFUQSB8fCByZXR2YWwgPT0gLUVOT1NZUykKKwkJYWNsID0gTlVMTDsKKwllbHNlCisJCWFjbCA9IEVSUl9QVFIocmV0dmFsKTsKKwlrZnJlZSh2YWx1ZSk7CisKKwlpZiAoIUlTX0VSUihhY2wpKSB7CisJCXN3aXRjaCh0eXBlKSB7CisJCQljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKKwkJCQlleHQzX2lzZXRfYWNsKGlub2RlLCAmZWktPmlfYWNsLCBhY2wpOworCQkJCWJyZWFrOworCisJCQljYXNlIEFDTF9UWVBFX0RFRkFVTFQ6CisJCQkJZXh0M19pc2V0X2FjbChpbm9kZSwgJmVpLT5pX2RlZmF1bHRfYWNsLCBhY2wpOworCQkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBhY2w7Cit9CisKKy8qCisgKiBTZXQgdGhlIGFjY2VzcyBvciBkZWZhdWx0IEFDTCBvZiBhbiBpbm9kZS4KKyAqCisgKiBpbm9kZS0+aV9zZW06IGRvd24gdW5sZXNzIGNhbGxlZCBmcm9tIGV4dDNfbmV3X2lub2RlCisgKi8KK3N0YXRpYyBpbnQKK2V4dDNfc2V0X2FjbChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSwKKwkgICAgIHN0cnVjdCBwb3NpeF9hY2wgKmFjbCkKK3sKKwlzdHJ1Y3QgZXh0M19pbm9kZV9pbmZvICplaSA9IEVYVDNfSShpbm9kZSk7CisJaW50IG5hbWVfaW5kZXg7CisJdm9pZCAqdmFsdWUgPSBOVUxMOworCXNpemVfdCBzaXplOworCWludCBlcnJvcjsKKworCWlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlzd2l0Y2godHlwZSkgeworCQljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKKwkJCW5hbWVfaW5kZXggPSBFWFQzX1hBVFRSX0lOREVYX1BPU0lYX0FDTF9BQ0NFU1M7CisJCQlpZiAoYWNsKSB7CisJCQkJbW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOworCQkJCWVycm9yID0gcG9zaXhfYWNsX2VxdWl2X21vZGUoYWNsLCAmbW9kZSk7CisJCQkJaWYgKGVycm9yIDwgMCkKKwkJCQkJcmV0dXJuIGVycm9yOworCQkJCWVsc2UgeworCQkJCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKKwkJCQkJZXh0M19tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOworCQkJCQlpZiAoZXJyb3IgPT0gMCkKKwkJCQkJCWFjbCA9IE5VTEw7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBBQ0xfVFlQRV9ERUZBVUxUOgorCQkJbmFtZV9pbmRleCA9IEVYVDNfWEFUVFJfSU5ERVhfUE9TSVhfQUNMX0RFRkFVTFQ7CisJCQlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCQkJcmV0dXJuIGFjbCA/IC1FQUNDRVMgOiAwOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKyAJaWYgKGFjbCkgeworCQl2YWx1ZSA9IGV4dDNfYWNsX3RvX2Rpc2soYWNsLCAmc2l6ZSk7CisJCWlmIChJU19FUlIodmFsdWUpKQorCQkJcmV0dXJuIChpbnQpUFRSX0VSUih2YWx1ZSk7CisJfQorCisJZXJyb3IgPSBleHQzX3hhdHRyX3NldF9oYW5kbGUoaGFuZGxlLCBpbm9kZSwgbmFtZV9pbmRleCwgIiIsCisJCQkJICAgICAgdmFsdWUsIHNpemUsIDApOworCisJa2ZyZWUodmFsdWUpOworCWlmICghZXJyb3IpIHsKKwkJc3dpdGNoKHR5cGUpIHsKKwkJCWNhc2UgQUNMX1RZUEVfQUNDRVNTOgorCQkJCWV4dDNfaXNldF9hY2woaW5vZGUsICZlaS0+aV9hY2wsIGFjbCk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQUNMX1RZUEVfREVGQVVMVDoKKwkJCQlleHQzX2lzZXRfYWNsKGlub2RlLCAmZWktPmlfZGVmYXVsdF9hY2wsIGFjbCk7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50CitleHQzX2NoZWNrX2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaykKK3sKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2wgPSBleHQzX2dldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUyk7CisKKwlpZiAoYWNsKSB7CisJCWludCBlcnJvciA9IHBvc2l4X2FjbF9wZXJtaXNzaW9uKGlub2RlLCBhY2wsIG1hc2spOworCQlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJcmV0dXJuIC1FQUdBSU47Cit9CisKK2ludAorZXh0M19wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlyZXR1cm4gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrLCBleHQzX2NoZWNrX2FjbCk7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBBQ0xzIG9mIGEgbmV3IGlub2RlLiBDYWxsZWQgZnJvbSBleHQzX25ld19pbm9kZS4KKyAqCisgKiBkaXItPmlfc2VtOiBkb3duCisgKiBpbm9kZS0+aV9zZW06IHVwIChhY2Nlc3MgdG8gaW5vZGUgaXMgc3RpbGwgZXhjbHVzaXZlKQorICovCitpbnQKK2V4dDNfaW5pdF9hY2woaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIpCit7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsID0gTlVMTDsKKwlpbnQgZXJyb3IgPSAwOworCisJaWYgKCFTX0lTTE5LKGlub2RlLT5pX21vZGUpKSB7CisJCWlmICh0ZXN0X29wdChkaXItPmlfc2IsIFBPU0lYX0FDTCkpIHsKKwkJCWFjbCA9IGV4dDNfZ2V0X2FjbChkaXIsIEFDTF9UWVBFX0RFRkFVTFQpOworCQkJaWYgKElTX0VSUihhY2wpKQorCQkJCXJldHVybiBQVFJfRVJSKGFjbCk7CisJCX0KKwkJaWYgKCFhY2wpCisJCQlpbm9kZS0+aV9tb2RlICY9IH5jdXJyZW50LT5mcy0+dW1hc2s7CisJfQorCWlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgUE9TSVhfQUNMKSAmJiBhY2wpIHsKKwkJc3RydWN0IHBvc2l4X2FjbCAqY2xvbmU7CisJCW1vZGVfdCBtb2RlOworCisJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCQllcnJvciA9IGV4dDNfc2V0X2FjbChoYW5kbGUsIGlub2RlLAorCQkJCQkgICAgIEFDTF9UWVBFX0RFRkFVTFQsIGFjbCk7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBjbGVhbnVwOworCQl9CisJCWNsb25lID0gcG9zaXhfYWNsX2Nsb25lKGFjbCwgR0ZQX0tFUk5FTCk7CisJCWVycm9yID0gLUVOT01FTTsKKwkJaWYgKCFjbG9uZSkKKwkJCWdvdG8gY2xlYW51cDsKKworCQltb2RlID0gaW5vZGUtPmlfbW9kZTsKKwkJZXJyb3IgPSBwb3NpeF9hY2xfY3JlYXRlX21hc3EoY2xvbmUsICZtb2RlKTsKKwkJaWYgKGVycm9yID49IDApIHsKKwkJCWlub2RlLT5pX21vZGUgPSBtb2RlOworCQkJaWYgKGVycm9yID4gMCkgeworCQkJCS8qIFRoaXMgaXMgYW4gZXh0ZW5kZWQgQUNMICovCisJCQkJZXJyb3IgPSBleHQzX3NldF9hY2woaGFuZGxlLCBpbm9kZSwKKwkJCQkJCSAgICAgQUNMX1RZUEVfQUNDRVNTLCBjbG9uZSk7CisJCQl9CisJCX0KKwkJcG9zaXhfYWNsX3JlbGVhc2UoY2xvbmUpOworCX0KK2NsZWFudXA6CisJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBEb2VzIGNobW9kIGZvciBhbiBpbm9kZSB0aGF0IG1heSBoYXZlIGFuIEFjY2VzcyBDb250cm9sIExpc3QuIFRoZQorICogaW5vZGUtPmlfbW9kZSBmaWVsZCBtdXN0IGJlIHVwZGF0ZWQgdG8gdGhlIGRlc2lyZWQgdmFsdWUgYnkgdGhlIGNhbGxlcgorICogYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIG51bWJlci4KKyAqCisgKiBXZSBjaGFuZ2UgdGhlIEFDTCByYXRoZXIgdGhhbiBzdG9yaW5nIHNvbWUgQUNMIGVudHJpZXMgaW4gdGhlIGZpbGUKKyAqIG1vZGUgcGVybWlzc2lvbiBiaXRzICh3aGljaCB3b3VsZCBiZSBtb3JlIGVmZmljaWVudCksIGJlY2F1c2UgdGhhdAorICogd291bGQgYnJlYWsgb25jZSBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIChsaWtlICBBQ0xfQVBQRU5ELCBBQ0xfREVMRVRFCisgKiBmb3IgZGlyZWN0b3JpZXMpIGFyZSBhZGRlZC4gVGhlcmUgYXJlIG5vIG1vcmUgYml0cyBhdmFpbGFibGUgaW4gdGhlCisgKiBmaWxlIG1vZGUuCisgKgorICogaW5vZGUtPmlfc2VtOiBkb3duCisgKi8KK2ludAorZXh0M19hY2xfY2htb2Qoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2wsICpjbG9uZTsKKyAgICAgICAgaW50IGVycm9yOworCisJaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwlpZiAoIXRlc3Rfb3B0KGlub2RlLT5pX3NiLCBQT1NJWF9BQ0wpKQorCQlyZXR1cm4gMDsKKwlhY2wgPSBleHQzX2dldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUyk7CisJaWYgKElTX0VSUihhY2wpIHx8ICFhY2wpCisJCXJldHVybiBQVFJfRVJSKGFjbCk7CisJY2xvbmUgPSBwb3NpeF9hY2xfY2xvbmUoYWNsLCBHRlBfS0VSTkVMKTsKKwlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOworCWlmICghY2xvbmUpCisJCXJldHVybiAtRU5PTUVNOworCWVycm9yID0gcG9zaXhfYWNsX2NobW9kX21hc3EoY2xvbmUsIGlub2RlLT5pX21vZGUpOworCWlmICghZXJyb3IpIHsKKwkJaGFuZGxlX3QgKmhhbmRsZTsKKwkJaW50IHJldHJpZXMgPSAwOworCisJcmV0cnk6CisJCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydChpbm9kZSwgRVhUM19EQVRBX1RSQU5TX0JMT0NLUyk7CisJCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQkJZXJyb3IgPSBQVFJfRVJSKGhhbmRsZSk7CisJCQlleHQzX3N0ZF9lcnJvcihpbm9kZS0+aV9zYiwgZXJyb3IpOworCQkJZ290byBvdXQ7CisJCX0KKwkJZXJyb3IgPSBleHQzX3NldF9hY2woaGFuZGxlLCBpbm9kZSwgQUNMX1RZUEVfQUNDRVNTLCBjbG9uZSk7CisJCWV4dDNfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJCWlmIChlcnJvciA9PSAtRU5PU1BDICYmCisJCSAgICBleHQzX3Nob3VsZF9yZXRyeV9hbGxvYyhpbm9kZS0+aV9zYiwgJnJldHJpZXMpKQorCQkJZ290byByZXRyeTsKKwl9CitvdXQ6CisJcG9zaXhfYWNsX3JlbGVhc2UoY2xvbmUpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIEV4dGVuZGVkIGF0dHJpYnV0ZSBoYW5kbGVycworICovCitzdGF0aWMgc2l6ZV90CitleHQzX3hhdHRyX2xpc3RfYWNsX2FjY2VzcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjaGFyICpsaXN0LCBzaXplX3QgbGlzdF9sZW4sCisJCQkgICBjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZV9sZW4pCit7CisJY29uc3Qgc2l6ZV90IHNpemUgPSBzaXplb2YoWEFUVFJfTkFNRV9BQ0xfQUNDRVNTKTsKKworCWlmICghdGVzdF9vcHQoaW5vZGUtPmlfc2IsIFBPU0lYX0FDTCkpCisJCXJldHVybiAwOworCWlmIChsaXN0ICYmIHNpemUgPD0gbGlzdF9sZW4pCisJCW1lbWNweShsaXN0LCBYQVRUUl9OQU1FX0FDTF9BQ0NFU1MsIHNpemUpOworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc2l6ZV90CitleHQzX3hhdHRyX2xpc3RfYWNsX2RlZmF1bHQoc3RydWN0IGlub2RlICppbm9kZSwgY2hhciAqbGlzdCwgc2l6ZV90IGxpc3RfbGVuLAorCQkJICAgIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lX2xlbikKK3sKKwljb25zdCBzaXplX3Qgc2l6ZSA9IHNpemVvZihYQVRUUl9OQU1FX0FDTF9ERUZBVUxUKTsKKworCWlmICghdGVzdF9vcHQoaW5vZGUtPmlfc2IsIFBPU0lYX0FDTCkpCisJCXJldHVybiAwOworCWlmIChsaXN0ICYmIHNpemUgPD0gbGlzdF9sZW4pCisJCW1lbWNweShsaXN0LCBYQVRUUl9OQU1FX0FDTF9ERUZBVUxULCBzaXplKTsKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGludAorZXh0M194YXR0cl9nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKKwlpbnQgZXJyb3I7CisKKwlpZiAoIXRlc3Rfb3B0KGlub2RlLT5pX3NiLCBQT1NJWF9BQ0wpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlhY2wgPSBleHQzX2dldF9hY2woaW5vZGUsIHR5cGUpOworCWlmIChJU19FUlIoYWNsKSkKKwkJcmV0dXJuIFBUUl9FUlIoYWNsKTsKKwlpZiAoYWNsID09IE5VTEwpCisJCXJldHVybiAtRU5PREFUQTsKKwllcnJvciA9IHBvc2l4X2FjbF90b194YXR0cihhY2wsIGJ1ZmZlciwgc2l6ZSk7CisJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludAorZXh0M194YXR0cl9nZXRfYWNsX2FjY2VzcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQkJICB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQoreworCWlmIChzdHJjbXAobmFtZSwgIiIpICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBleHQzX3hhdHRyX2dldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgYnVmZmVyLCBzaXplKTsKK30KKworc3RhdGljIGludAorZXh0M194YXR0cl9nZXRfYWNsX2RlZmF1bHQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisJaWYgKHN0cmNtcChuYW1lLCAiIikgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIGV4dDNfeGF0dHJfZ2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfREVGQVVMVCwgYnVmZmVyLCBzaXplKTsKK30KKworc3RhdGljIGludAorZXh0M194YXR0cl9zZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlLCBjb25zdCB2b2lkICp2YWx1ZSwKKwkJICAgc2l6ZV90IHNpemUpCit7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CisJaW50IGVycm9yLCByZXRyaWVzID0gMDsKKworCWlmICghdGVzdF9vcHQoaW5vZGUtPmlfc2IsIFBPU0lYX0FDTCkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwlpZiAoKGN1cnJlbnQtPmZzdWlkICE9IGlub2RlLT5pX3VpZCkgJiYgIWNhcGFibGUoQ0FQX0ZPV05FUikpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAodmFsdWUpIHsKKwkJYWNsID0gcG9zaXhfYWNsX2Zyb21feGF0dHIodmFsdWUsIHNpemUpOworCQlpZiAoSVNfRVJSKGFjbCkpCisJCQlyZXR1cm4gUFRSX0VSUihhY2wpOworCQllbHNlIGlmIChhY2wpIHsKKwkJCWVycm9yID0gcG9zaXhfYWNsX3ZhbGlkKGFjbCk7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byByZWxlYXNlX2FuZF9vdXQ7CisJCX0KKwl9IGVsc2UKKwkJYWNsID0gTlVMTDsKKworcmV0cnk6CisJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGlub2RlLCBFWFQzX0RBVEFfVFJBTlNfQkxPQ0tTKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpCisJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CisJZXJyb3IgPSBleHQzX3NldF9hY2woaGFuZGxlLCBpbm9kZSwgdHlwZSwgYWNsKTsKKwlleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOworCWlmIChlcnJvciA9PSAtRU5PU1BDICYmIGV4dDNfc2hvdWxkX3JldHJ5X2FsbG9jKGlub2RlLT5pX3NiLCAmcmV0cmllcykpCisJCWdvdG8gcmV0cnk7CisKK3JlbGVhc2VfYW5kX291dDoKKwlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludAorZXh0M194YXR0cl9zZXRfYWNsX2FjY2VzcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQkJICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlpZiAoc3RyY21wKG5hbWUsICIiKSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gZXh0M194YXR0cl9zZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsIHZhbHVlLCBzaXplKTsKK30KKworc3RhdGljIGludAorZXh0M194YXR0cl9zZXRfYWNsX2RlZmF1bHQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCWlmIChzdHJjbXAobmFtZSwgIiIpICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBleHQzX3hhdHRyX3NldF9hY2woaW5vZGUsIEFDTF9UWVBFX0RFRkFVTFQsIHZhbHVlLCBzaXplKTsKK30KKworc3RydWN0IHhhdHRyX2hhbmRsZXIgZXh0M194YXR0cl9hY2xfYWNjZXNzX2hhbmRsZXIgPSB7CisJLnByZWZpeAk9IFhBVFRSX05BTUVfQUNMX0FDQ0VTUywKKwkubGlzdAk9IGV4dDNfeGF0dHJfbGlzdF9hY2xfYWNjZXNzLAorCS5nZXQJPSBleHQzX3hhdHRyX2dldF9hY2xfYWNjZXNzLAorCS5zZXQJPSBleHQzX3hhdHRyX3NldF9hY2xfYWNjZXNzLAorfTsKKworc3RydWN0IHhhdHRyX2hhbmRsZXIgZXh0M194YXR0cl9hY2xfZGVmYXVsdF9oYW5kbGVyID0geworCS5wcmVmaXgJPSBYQVRUUl9OQU1FX0FDTF9ERUZBVUxULAorCS5saXN0CT0gZXh0M194YXR0cl9saXN0X2FjbF9kZWZhdWx0LAorCS5nZXQJPSBleHQzX3hhdHRyX2dldF9hY2xfZGVmYXVsdCwKKwkuc2V0CT0gZXh0M194YXR0cl9zZXRfYWNsX2RlZmF1bHQsCit9OwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9hY2wuaCBiL2ZzL2V4dDMvYWNsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThhZjBjMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDMvYWNsLmgKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAgRmlsZTogZnMvZXh0My9hY2wuaAorCisgIChDKSAyMDAxIEFuZHJlYXMgR3J1ZW5iYWNoZXIsIDxhLmdydWVuYmFjaGVyQGNvbXB1dGVyLm9yZz4KKyovCisKKyNpbmNsdWRlIDxsaW51eC94YXR0cl9hY2wuaD4KKworI2RlZmluZSBFWFQzX0FDTF9WRVJTSU9OCTB4MDAwMQorCit0eXBlZGVmIHN0cnVjdCB7CisJX19sZTE2CQllX3RhZzsKKwlfX2xlMTYJCWVfcGVybTsKKwlfX2xlMzIJCWVfaWQ7Cit9IGV4dDNfYWNsX2VudHJ5OworCit0eXBlZGVmIHN0cnVjdCB7CisJX19sZTE2CQllX3RhZzsKKwlfX2xlMTYJCWVfcGVybTsKK30gZXh0M19hY2xfZW50cnlfc2hvcnQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlfX2xlMzIJCWFfdmVyc2lvbjsKK30gZXh0M19hY2xfaGVhZGVyOworCitzdGF0aWMgaW5saW5lIHNpemVfdCBleHQzX2FjbF9zaXplKGludCBjb3VudCkKK3sKKwlpZiAoY291bnQgPD0gNCkgeworCQlyZXR1cm4gc2l6ZW9mKGV4dDNfYWNsX2hlYWRlcikgKworCQkgICAgICAgY291bnQgKiBzaXplb2YoZXh0M19hY2xfZW50cnlfc2hvcnQpOworCX0gZWxzZSB7CisJCXJldHVybiBzaXplb2YoZXh0M19hY2xfaGVhZGVyKSArCisJCSAgICAgICA0ICogc2l6ZW9mKGV4dDNfYWNsX2VudHJ5X3Nob3J0KSArCisJCSAgICAgICAoY291bnQgLSA0KSAqIHNpemVvZihleHQzX2FjbF9lbnRyeSk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCBleHQzX2FjbF9jb3VudChzaXplX3Qgc2l6ZSkKK3sKKwlzc2l6ZV90IHM7CisJc2l6ZSAtPSBzaXplb2YoZXh0M19hY2xfaGVhZGVyKTsKKwlzID0gc2l6ZSAtIDQgKiBzaXplb2YoZXh0M19hY2xfZW50cnlfc2hvcnQpOworCWlmIChzIDwgMCkgeworCQlpZiAoc2l6ZSAlIHNpemVvZihleHQzX2FjbF9lbnRyeV9zaG9ydCkpCisJCQlyZXR1cm4gLTE7CisJCXJldHVybiBzaXplIC8gc2l6ZW9mKGV4dDNfYWNsX2VudHJ5X3Nob3J0KTsKKwl9IGVsc2UgeworCQlpZiAocyAlIHNpemVvZihleHQzX2FjbF9lbnRyeSkpCisJCQlyZXR1cm4gLTE7CisJCXJldHVybiBzIC8gc2l6ZW9mKGV4dDNfYWNsX2VudHJ5KSArIDQ7CisJfQorfQorCisjaWZkZWYgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMCisKKy8qIFZhbHVlIGZvciBpbm9kZS0+dS5leHQzX2kuaV9hY2wgYW5kIGlub2RlLT51LmV4dDNfaS5pX2RlZmF1bHRfYWNsCisgICBpZiB0aGUgQUNMIGhhcyBub3QgYmVlbiBjYWNoZWQgKi8KKyNkZWZpbmUgRVhUM19BQ0xfTk9UX0NBQ0hFRCAoKHZvaWQgKiktMSkKKworLyogYWNsLmMgKi8KK2V4dGVybiBpbnQgZXh0M19wZXJtaXNzaW9uIChzdHJ1Y3QgaW5vZGUgKiwgaW50LCBzdHJ1Y3QgbmFtZWlkYXRhICopOworZXh0ZXJuIGludCBleHQzX2FjbF9jaG1vZCAoc3RydWN0IGlub2RlICopOworZXh0ZXJuIGludCBleHQzX2luaXRfYWNsIChoYW5kbGVfdCAqLCBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGlub2RlICopOworCitleHRlcm4gaW50IGluaXRfZXh0M19hY2wodm9pZCk7CitleHRlcm4gdm9pZCBleGl0X2V4dDNfYWNsKHZvaWQpOworCisjZWxzZSAgLyogQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMICovCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNkZWZpbmUgZXh0M19wZXJtaXNzaW9uIE5VTEwKKworc3RhdGljIGlubGluZSBpbnQKK2V4dDNfYWNsX2NobW9kKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitleHQzX2luaXRfYWNsKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpbm9kZSAqZGlyKQoreworCXJldHVybiAwOworfQorI2VuZGlmICAvKiBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wgKi8KKwpkaWZmIC0tZ2l0IGEvZnMvZXh0My9iYWxsb2MuYyBiL2ZzL2V4dDMvYmFsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NkNjMyZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDMvYmFsbG9jLmMKQEAgLTAsMCArMSwxNjAwIEBACisvKgorICogIGxpbnV4L2ZzL2V4dDMvYmFsbG9jLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUKKyAqIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKKyAqIExhYm9yYXRvaXJlIE1BU0kgLSBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogIEVuaGFuY2VkIGJsb2NrIGFsbG9jYXRpb24gYnkgU3RlcGhlbiBUd2VlZGllIChzY3RAcmVkaGF0LmNvbSksIDE5OTMKKyAqICBCaWctZW5kaWFuIHRvIGxpdHRsZS1lbmRpYW4gYnl0ZS1zd2FwcGluZy9iaXRtYXBzIGJ5CisgKiAgICAgICAgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KSwgMTk5NQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9qYmQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHQzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXh0M19qYmQuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisKKy8qCisgKiBiYWxsb2MuYyBjb250YWlucyB0aGUgYmxvY2tzIGFsbG9jYXRpb24gYW5kIGRlYWxsb2NhdGlvbiByb3V0aW5lcworICovCisKKy8qCisgKiBUaGUgZnJlZSBibG9ja3MgYXJlIG1hbmFnZWQgYnkgYml0bWFwcy4gIEEgZmlsZSBzeXN0ZW0gY29udGFpbnMgc2V2ZXJhbAorICogYmxvY2tzIGdyb3Vwcy4gIEVhY2ggZ3JvdXAgY29udGFpbnMgMSBiaXRtYXAgYmxvY2sgZm9yIGJsb2NrcywgMSBiaXRtYXAKKyAqIGJsb2NrIGZvciBpbm9kZXMsIE4gYmxvY2tzIGZvciB0aGUgaW5vZGUgdGFibGUgYW5kIGRhdGEgYmxvY2tzLgorICoKKyAqIFRoZSBmaWxlIHN5c3RlbSBjb250YWlucyBncm91cCBkZXNjcmlwdG9ycyB3aGljaCBhcmUgbG9jYXRlZCBhZnRlciB0aGUKKyAqIHN1cGVyIGJsb2NrLiAgRWFjaCBkZXNjcmlwdG9yIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgdGhlIGJpdG1hcCBibG9jayBhbmQKKyAqIHRoZSBmcmVlIGJsb2NrcyBjb3VudCBpbiB0aGUgYmxvY2suICBUaGUgZGVzY3JpcHRvcnMgYXJlIGxvYWRlZCBpbiBtZW1vcnkKKyAqIHdoZW4gYSBmaWxlIHN5c3RlbSBpcyBtb3VudGVkIChzZWUgZXh0M19yZWFkX3N1cGVyKS4KKyAqLworCisKKyNkZWZpbmUgaW5fcmFuZ2UoYiwgZmlyc3QsIGxlbikJKChiKSA+PSAoZmlyc3QpICYmIChiKSA8PSAoZmlyc3QpICsgKGxlbikgLSAxKQorCitzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICogZXh0M19nZXRfZ3JvdXBfZGVzYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgYmxvY2tfZ3JvdXAsCisJCQkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqIGJoKQoreworCXVuc2lnbmVkIGxvbmcgZ3JvdXBfZGVzYzsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwlzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICogZGVzYzsKKwlzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmkgPSBFWFQzX1NCKHNiKTsKKworCWlmIChibG9ja19ncm91cCA+PSBzYmktPnNfZ3JvdXBzX2NvdW50KSB7CisJCWV4dDNfZXJyb3IgKHNiLCAiZXh0M19nZXRfZ3JvdXBfZGVzYyIsCisJCQkgICAgImJsb2NrX2dyb3VwID49IGdyb3Vwc19jb3VudCAtICIKKwkJCSAgICAiYmxvY2tfZ3JvdXAgPSAlZCwgZ3JvdXBzX2NvdW50ID0gJWx1IiwKKwkJCSAgICBibG9ja19ncm91cCwgc2JpLT5zX2dyb3Vwc19jb3VudCk7CisKKwkJcmV0dXJuIE5VTEw7CisJfQorCXNtcF9ybWIoKTsKKworCWdyb3VwX2Rlc2MgPSBibG9ja19ncm91cCA+PiBFWFQzX0RFU0NfUEVSX0JMT0NLX0JJVFMoc2IpOworCW9mZnNldCA9IGJsb2NrX2dyb3VwICYgKEVYVDNfREVTQ19QRVJfQkxPQ0soc2IpIC0gMSk7CisJaWYgKCFzYmktPnNfZ3JvdXBfZGVzY1tncm91cF9kZXNjXSkgeworCQlleHQzX2Vycm9yIChzYiwgImV4dDNfZ2V0X2dyb3VwX2Rlc2MiLAorCQkJICAgICJHcm91cCBkZXNjcmlwdG9yIG5vdCBsb2FkZWQgLSAiCisJCQkgICAgImJsb2NrX2dyb3VwID0gJWQsIGdyb3VwX2Rlc2MgPSAlbHUsIGRlc2MgPSAlbHUiLAorCQkJICAgICBibG9ja19ncm91cCwgZ3JvdXBfZGVzYywgb2Zmc2V0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZGVzYyA9IChzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICopIHNiaS0+c19ncm91cF9kZXNjW2dyb3VwX2Rlc2NdLT5iX2RhdGE7CisJaWYgKGJoKQorCQkqYmggPSBzYmktPnNfZ3JvdXBfZGVzY1tncm91cF9kZXNjXTsKKwlyZXR1cm4gZGVzYyArIG9mZnNldDsKK30KKworLyoKKyAqIFJlYWQgdGhlIGJpdG1hcCBmb3IgYSBnaXZlbiBibG9ja19ncm91cCwgcmVhZGluZyBpbnRvIHRoZSBzcGVjaWZpZWQgCisgKiBzbG90IGluIHRoZSBzdXBlcmJsb2NrJ3MgYml0bWFwIGNhY2hlLgorICoKKyAqIFJldHVybiBidWZmZXJfaGVhZCBvbiBzdWNjZXNzIG9yIE5VTEwgaW4gY2FzZSBvZiBmYWlsdXJlLgorICovCitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICoKK3JlYWRfYmxvY2tfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGludCBibG9ja19ncm91cCkKK3sKKwlzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICogZGVzYzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCA9IE5VTEw7CisKKwlkZXNjID0gZXh0M19nZXRfZ3JvdXBfZGVzYyAoc2IsIGJsb2NrX2dyb3VwLCBOVUxMKTsKKwlpZiAoIWRlc2MpCisJCWdvdG8gZXJyb3Jfb3V0OworCWJoID0gc2JfYnJlYWQoc2IsIGxlMzJfdG9fY3B1KGRlc2MtPmJnX2Jsb2NrX2JpdG1hcCkpOworCWlmICghYmgpCisJCWV4dDNfZXJyb3IgKHNiLCAicmVhZF9ibG9ja19iaXRtYXAiLAorCQkJICAgICJDYW5ub3QgcmVhZCBibG9jayBiaXRtYXAgLSAiCisJCQkgICAgImJsb2NrX2dyb3VwID0gJWQsIGJsb2NrX2JpdG1hcCA9ICV1IiwKKwkJCSAgICBibG9ja19ncm91cCwgbGUzMl90b19jcHUoZGVzYy0+YmdfYmxvY2tfYml0bWFwKSk7CitlcnJvcl9vdXQ6CisJcmV0dXJuIGJoOworfQorLyoKKyAqIFRoZSByZXNlcnZhdGlvbiB3aW5kb3cgc3RydWN0dXJlIG9wZXJhdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBPcGVyYXRpb25zIGluY2x1ZGU6CisgKiBkdW1wLCBmaW5kLCBhZGQsIHJlbW92ZSwgaXNfZW1wdHksIGZpbmRfbmV4dF9yZXNlcnZhYmxlX3dpbmRvdywgZXRjLgorICoKKyAqIFdlIHVzZSBzb3J0ZWQgZG91YmxlIGxpbmtlZCBsaXN0IGZvciB0aGUgcGVyLWZpbGVzeXN0ZW0gcmVzZXJ2YXRpb24KKyAqIHdpbmRvdyBsaXN0LiAobGlrZSBpbiB2bV9yZWdpb24pLgorICoKKyAqIEluaXRpYWxseSwgd2Uga2VlcCB0aG9zZSBzbWFsbCBvcGVyYXRpb25zIGluIHRoZSBhYnN0cmFjdCBmdW5jdGlvbnMsCisgKiBzbyBsYXRlciBpZiB3ZSBuZWVkIGEgYmV0dGVyIHNlYXJjaGluZyB0cmVlIHRoYW4gZG91YmxlIGxpbmtlZC1saXN0LAorICogd2UgY291bGQgZWFzaWx5IHN3aXRjaCB0byB0aGF0IHdpdGhvdXQgY2hhbmdpbmcgdG9vIG11Y2gKKyAqIGNvZGUuCisgKi8KKyNpZiAwCitzdGF0aWMgdm9pZCBfX3Jzdl93aW5kb3dfZHVtcChzdHJ1Y3QgcmJfcm9vdCAqcm9vdCwgaW50IHZlcmJvc2UsCisJCQkgICAgICBjb25zdCBjaGFyICpmbikKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbjsKKwlzdHJ1Y3QgZXh0M19yZXNlcnZlX3dpbmRvd19ub2RlICpyc3YsICpwcmV2OworCWludCBiYWQ7CisKK3Jlc3RhcnQ6CisJbiA9IHJiX2ZpcnN0KHJvb3QpOworCWJhZCA9IDA7CisJcHJldiA9IE5VTEw7CisKKwlwcmludGsoIkJsb2NrIEFsbG9jYXRpb24gUmVzZXJ2YXRpb24gV2luZG93cyBNYXAgKCVzKTpcbiIsIGZuKTsKKwl3aGlsZSAobikgeworCQlyc3YgPSBsaXN0X2VudHJ5KG4sIHN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUsIHJzdl9ub2RlKTsKKwkJaWYgKHZlcmJvc2UpCisJCQlwcmludGsoInJlc2VydmF0aW9uIHdpbmRvdyAweCVwICIKKwkJCSAgICAgICAic3RhcnQ6ICAlZCwgZW5kOiAgJWRcbiIsCisJCQkgICAgICAgcnN2LCByc3YtPnJzdl9zdGFydCwgcnN2LT5yc3ZfZW5kKTsKKwkJaWYgKHJzdi0+cnN2X3N0YXJ0ICYmIHJzdi0+cnN2X3N0YXJ0ID49IHJzdi0+cnN2X2VuZCkgeworCQkJcHJpbnRrKCJCYWQgcmVzZXJ2YXRpb24gJXAgKHN0YXJ0ID49IGVuZClcbiIsCisJCQkgICAgICAgcnN2KTsKKwkJCWJhZCA9IDE7CisJCX0KKwkJaWYgKHByZXYgJiYgcHJldi0+cnN2X2VuZCA+PSByc3YtPnJzdl9zdGFydCkgeworCQkJcHJpbnRrKCJCYWQgcmVzZXJ2YXRpb24gJXAgKHByZXYtPmVuZCA+PSBzdGFydClcbiIsCisJCQkgICAgICAgcnN2KTsKKwkJCWJhZCA9IDE7CisJCX0KKwkJaWYgKGJhZCkgeworCQkJaWYgKCF2ZXJib3NlKSB7CisJCQkJcHJpbnRrKCJSZXN0YXJ0aW5nIHJlc2VydmF0aW9uIHdhbGsgaW4gdmVyYm9zZSBtb2RlXG4iKTsKKwkJCQl2ZXJib3NlID0gMTsKKwkJCQlnb3RvIHJlc3RhcnQ7CisJCQl9CisJCX0KKwkJbiA9IHJiX25leHQobik7CisJCXByZXYgPSByc3Y7CisJfQorCXByaW50aygiV2luZG93IG1hcCBjb21wbGV0ZS5cbiIpOworCWlmIChiYWQpCisJCUJVRygpOworfQorI2RlZmluZSByc3Zfd2luZG93X2R1bXAocm9vdCwgdmVyYm9zZSkgXAorCV9fcnN2X3dpbmRvd19kdW1wKChyb290KSwgKHZlcmJvc2UpLCBfX0ZVTkNUSU9OX18pCisjZWxzZQorI2RlZmluZSByc3Zfd2luZG93X2R1bXAocm9vdCwgdmVyYm9zZSkgZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworc3RhdGljIGludAorZ29hbF9pbl9teV9yZXNlcnZhdGlvbihzdHJ1Y3QgZXh0M19yZXNlcnZlX3dpbmRvdyAqcnN2LCBpbnQgZ29hbCwKKwkJCXVuc2lnbmVkIGludCBncm91cCwgc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpCit7CisJdW5zaWduZWQgbG9uZyBncm91cF9maXJzdF9ibG9jaywgZ3JvdXBfbGFzdF9ibG9jazsKKworCWdyb3VwX2ZpcnN0X2Jsb2NrID0gbGUzMl90b19jcHUoRVhUM19TQihzYiktPnNfZXMtPnNfZmlyc3RfZGF0YV9ibG9jaykgKworCQkJCWdyb3VwICogRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKTsKKwlncm91cF9sYXN0X2Jsb2NrID0gZ3JvdXBfZmlyc3RfYmxvY2sgKyBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpIC0gMTsKKworCWlmICgocnN2LT5fcnN2X3N0YXJ0ID4gZ3JvdXBfbGFzdF9ibG9jaykgfHwKKwkgICAgKHJzdi0+X3Jzdl9lbmQgPCBncm91cF9maXJzdF9ibG9jaykpCisJCXJldHVybiAwOworCWlmICgoZ29hbCA+PSAwKSAmJiAoKGdvYWwgKyBncm91cF9maXJzdF9ibG9jayA8IHJzdi0+X3Jzdl9zdGFydCkKKwkJfHwgKGdvYWwgKyBncm91cF9maXJzdF9ibG9jayA+IHJzdi0+X3Jzdl9lbmQpKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBGaW5kIHRoZSByZXNlcnZlZCB3aW5kb3cgd2hpY2ggaW5jbHVkZXMgdGhlIGdvYWwsIG9yIHRoZSBwcmV2aW91cyBvbmUKKyAqIGlmIHRoZSBnb2FsIGlzIG5vdCBpbiBhbnkgd2luZG93LgorICogUmV0dXJucyBOVUxMIGlmIHRoZXJlIGFyZSBubyB3aW5kb3dzIG9yIGlmIGFsbCB3aW5kb3dzIHN0YXJ0IGFmdGVyIHRoZSBnb2FsLgorICovCitzdGF0aWMgc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqCitzZWFyY2hfcmVzZXJ2ZV93aW5kb3coc3RydWN0IHJiX3Jvb3QgKnJvb3QsIHVuc2lnbmVkIGxvbmcgZ29hbCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbiA9IHJvb3QtPnJiX25vZGU7CisJc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqcnN2OworCisJaWYgKCFuKQorCQlyZXR1cm4gTlVMTDsKKworCWRvIHsKKwkJcnN2ID0gcmJfZW50cnkobiwgc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSwgcnN2X25vZGUpOworCisJCWlmIChnb2FsIDwgcnN2LT5yc3Zfc3RhcnQpCisJCQluID0gbi0+cmJfbGVmdDsKKwkJZWxzZSBpZiAoZ29hbCA+IHJzdi0+cnN2X2VuZCkKKwkJCW4gPSBuLT5yYl9yaWdodDsKKwkJZWxzZQorCQkJcmV0dXJuIHJzdjsKKwl9IHdoaWxlIChuKTsKKwkvKgorCSAqIFdlJ3ZlIGZhbGxlbiBvZmYgdGhlIGVuZCBvZiB0aGUgdHJlZTogdGhlIGdvYWwgd2Fzbid0IGluc2lkZQorCSAqIGFueSBwYXJ0aWN1bGFyIG5vZGUuICBPSywgdGhlIHByZXZpb3VzIG5vZGUgbXVzdCBiZSB0byBvbmUKKwkgKiBzaWRlIG9mIHRoZSBpbnRlcnZhbCBjb250YWluaW5nIHRoZSBnb2FsLiAgSWYgaXQncyB0aGUgUkhTLAorCSAqIHdlIG5lZWQgdG8gYmFjayB1cCBvbmUuCisJICovCisJaWYgKHJzdi0+cnN2X3N0YXJ0ID4gZ29hbCkgeworCQluID0gcmJfcHJldigmcnN2LT5yc3Zfbm9kZSk7CisJCXJzdiA9IHJiX2VudHJ5KG4sIHN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUsIHJzdl9ub2RlKTsKKwl9CisJcmV0dXJuIHJzdjsKK30KKwordm9pZCBleHQzX3Jzdl93aW5kb3dfYWRkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCSAgICBzdHJ1Y3QgZXh0M19yZXNlcnZlX3dpbmRvd19ub2RlICpyc3YpCit7CisJc3RydWN0IHJiX3Jvb3QgKnJvb3QgPSAmRVhUM19TQihzYiktPnNfcnN2X3dpbmRvd19yb290OworCXN0cnVjdCByYl9ub2RlICpub2RlID0gJnJzdi0+cnN2X25vZGU7CisJdW5zaWduZWQgaW50IHN0YXJ0ID0gcnN2LT5yc3Zfc3RhcnQ7CisKKwlzdHJ1Y3QgcmJfbm9kZSAqKiBwID0gJnJvb3QtPnJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKiBwYXJlbnQgPSBOVUxMOworCXN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUgKnRoaXM7CisKKwl3aGlsZSAoKnApCisJeworCQlwYXJlbnQgPSAqcDsKKwkJdGhpcyA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSwgcnN2X25vZGUpOworCisJCWlmIChzdGFydCA8IHRoaXMtPnJzdl9zdGFydCkKKwkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKKwkJZWxzZSBpZiAoc3RhcnQgPiB0aGlzLT5yc3ZfZW5kKQorCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwkJZWxzZQorCQkJQlVHKCk7CisJfQorCisJcmJfbGlua19ub2RlKG5vZGUsIHBhcmVudCwgcCk7CisJcmJfaW5zZXJ0X2NvbG9yKG5vZGUsIHJvb3QpOworfQorCitzdGF0aWMgdm9pZCByc3Zfd2luZG93X3JlbW92ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJICAgICAgc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqcnN2KQoreworCXJzdi0+cnN2X3N0YXJ0ID0gRVhUM19SRVNFUlZFX1dJTkRPV19OT1RfQUxMT0NBVEVEOworCXJzdi0+cnN2X2VuZCA9IEVYVDNfUkVTRVJWRV9XSU5ET1dfTk9UX0FMTE9DQVRFRDsKKwlyc3YtPnJzdl9hbGxvY19oaXQgPSAwOworCXJiX2VyYXNlKCZyc3YtPnJzdl9ub2RlLCAmRVhUM19TQihzYiktPnNfcnN2X3dpbmRvd19yb290KTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcnN2X2lzX2VtcHR5KHN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93ICpyc3YpCit7CisJLyogYSB2YWxpZCByZXNlcnZhdGlvbiBlbmQgYmxvY2sgY291bGQgbm90IGJlIDAgKi8KKwlyZXR1cm4gKHJzdi0+X3Jzdl9lbmQgPT0gRVhUM19SRVNFUlZFX1dJTkRPV19OT1RfQUxMT0NBVEVEKTsKK30KK3ZvaWQgZXh0M19pbml0X2Jsb2NrX2FsbG9jX2luZm8oc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgZXh0M19pbm9kZV9pbmZvICplaSA9IEVYVDNfSShpbm9kZSk7CisJc3RydWN0IGV4dDNfYmxvY2tfYWxsb2NfaW5mbyAqYmxvY2tfaSA9IGVpLT5pX2Jsb2NrX2FsbG9jX2luZm87CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCisJYmxvY2tfaSA9IGttYWxsb2Moc2l6ZW9mKCpibG9ja19pKSwgR0ZQX05PRlMpOworCWlmIChibG9ja19pKSB7CisJCXN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUgKnJzdiA9ICZibG9ja19pLT5yc3Zfd2luZG93X25vZGU7CisKKwkJcnN2LT5yc3Zfc3RhcnQgPSBFWFQzX1JFU0VSVkVfV0lORE9XX05PVF9BTExPQ0FURUQ7CisJCXJzdi0+cnN2X2VuZCA9IEVYVDNfUkVTRVJWRV9XSU5ET1dfTk9UX0FMTE9DQVRFRDsKKworCSAJLyoKKwkJICogaWYgZmlsZXN5c3RlbSBpcyBtb3VudGVkIHdpdGggTk9SRVNFUlZBVElPTiwgdGhlIGdvYWwKKwkJICogcmVzZXJ2YXRpb24gd2luZG93IHNpemUgaXMgc2V0IHRvIHplcm8gdG8gaW5kaWNhdGUKKwkJICogYmxvY2sgcmVzZXJ2YXRpb24gaXMgb2ZmCisJCSAqLworCQlpZiAoIXRlc3Rfb3B0KHNiLCBSRVNFUlZBVElPTikpCisJCQlyc3YtPnJzdl9nb2FsX3NpemUgPSAwOworCQllbHNlCisJCQlyc3YtPnJzdl9nb2FsX3NpemUgPSBFWFQzX0RFRkFVTFRfUkVTRVJWRV9CTE9DS1M7CisJCXJzdi0+cnN2X2FsbG9jX2hpdCA9IDA7CisJCWJsb2NrX2ktPmxhc3RfYWxsb2NfbG9naWNhbF9ibG9jayA9IDA7CisJCWJsb2NrX2ktPmxhc3RfYWxsb2NfcGh5c2ljYWxfYmxvY2sgPSAwOworCX0KKwllaS0+aV9ibG9ja19hbGxvY19pbmZvID0gYmxvY2tfaTsKK30KKwordm9pZCBleHQzX2Rpc2NhcmRfcmVzZXJ2YXRpb24oc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgZXh0M19pbm9kZV9pbmZvICplaSA9IEVYVDNfSShpbm9kZSk7CisJc3RydWN0IGV4dDNfYmxvY2tfYWxsb2NfaW5mbyAqYmxvY2tfaSA9IGVpLT5pX2Jsb2NrX2FsbG9jX2luZm87CisJc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqcnN2OworCXNwaW5sb2NrX3QgKnJzdl9sb2NrID0gJkVYVDNfU0IoaW5vZGUtPmlfc2IpLT5zX3Jzdl93aW5kb3dfbG9jazsKKworCWlmICghYmxvY2tfaSkKKwkJcmV0dXJuOworCisJcnN2ID0gJmJsb2NrX2ktPnJzdl93aW5kb3dfbm9kZTsKKwlpZiAoIXJzdl9pc19lbXB0eSgmcnN2LT5yc3Zfd2luZG93KSkgeworCQlzcGluX2xvY2socnN2X2xvY2spOworCQlpZiAoIXJzdl9pc19lbXB0eSgmcnN2LT5yc3Zfd2luZG93KSkKKwkJCXJzdl93aW5kb3dfcmVtb3ZlKGlub2RlLT5pX3NiLCByc3YpOworCQlzcGluX3VubG9jayhyc3ZfbG9jayk7CisJfQorfQorCisvKiBGcmVlIGdpdmVuIGJsb2NrcywgdXBkYXRlIHF1b3RhIGFuZCBpX2Jsb2NrcyBmaWVsZCAqLwordm9pZCBleHQzX2ZyZWVfYmxvY2tzX3NiKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkgdW5zaWduZWQgbG9uZyBibG9jaywgdW5zaWduZWQgbG9uZyBjb3VudCwKKwkJCSBpbnQgKnBkcXVvdF9mcmVlZF9ibG9ja3MpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmggPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZ2RfYmg7CisJdW5zaWduZWQgbG9uZyBibG9ja19ncm91cDsKKwl1bnNpZ25lZCBsb25nIGJpdDsKKwl1bnNpZ25lZCBsb25nIGk7CisJdW5zaWduZWQgbG9uZyBvdmVyZmxvdzsKKwlzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICogZGVzYzsKKwlzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqIGVzOworCXN0cnVjdCBleHQzX3NiX2luZm8gKnNiaTsKKwlpbnQgZXJyID0gMCwgcmV0OworCXVuc2lnbmVkIGdyb3VwX2ZyZWVkOworCisJKnBkcXVvdF9mcmVlZF9ibG9ja3MgPSAwOworCXNiaSA9IEVYVDNfU0Ioc2IpOworCWVzID0gc2JpLT5zX2VzOworCWlmIChibG9jayA8IGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2RhdGFfYmxvY2spIHx8CisJICAgIGJsb2NrICsgY291bnQgPCBibG9jayB8fAorCSAgICBibG9jayArIGNvdW50ID4gbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KSkgeworCQlleHQzX2Vycm9yIChzYiwgImV4dDNfZnJlZV9ibG9ja3MiLAorCQkJICAgICJGcmVlaW5nIGJsb2NrcyBub3QgaW4gZGF0YXpvbmUgLSAiCisJCQkgICAgImJsb2NrID0gJWx1LCBjb3VudCA9ICVsdSIsIGJsb2NrLCBjb3VudCk7CisJCWdvdG8gZXJyb3JfcmV0dXJuOworCX0KKworCWV4dDNfZGVidWcgKCJmcmVlaW5nIGJsb2NrKHMpICVsdS0lbHVcbiIsIGJsb2NrLCBibG9jayArIGNvdW50IC0gMSk7CisKK2RvX21vcmU6CisJb3ZlcmZsb3cgPSAwOworCWJsb2NrX2dyb3VwID0gKGJsb2NrIC0gbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jaykpIC8KKwkJICAgICAgRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKTsKKwliaXQgPSAoYmxvY2sgLSBsZTMyX3RvX2NwdShlcy0+c19maXJzdF9kYXRhX2Jsb2NrKSkgJQorCQkgICAgICBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpOworCS8qCisJICogQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBmcmVlaW5nIGJsb2NrcyBhY3Jvc3MgYSBncm91cAorCSAqIGJvdW5kYXJ5LgorCSAqLworCWlmIChiaXQgKyBjb3VudCA+IEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYikpIHsKKwkJb3ZlcmZsb3cgPSBiaXQgKyBjb3VudCAtIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYik7CisJCWNvdW50IC09IG92ZXJmbG93OworCX0KKwlicmVsc2UoYml0bWFwX2JoKTsKKwliaXRtYXBfYmggPSByZWFkX2Jsb2NrX2JpdG1hcChzYiwgYmxvY2tfZ3JvdXApOworCWlmICghYml0bWFwX2JoKQorCQlnb3RvIGVycm9yX3JldHVybjsKKwlkZXNjID0gZXh0M19nZXRfZ3JvdXBfZGVzYyAoc2IsIGJsb2NrX2dyb3VwLCAmZ2RfYmgpOworCWlmICghZGVzYykKKwkJZ290byBlcnJvcl9yZXR1cm47CisKKwlpZiAoaW5fcmFuZ2UgKGxlMzJfdG9fY3B1KGRlc2MtPmJnX2Jsb2NrX2JpdG1hcCksIGJsb2NrLCBjb3VudCkgfHwKKwkgICAgaW5fcmFuZ2UgKGxlMzJfdG9fY3B1KGRlc2MtPmJnX2lub2RlX2JpdG1hcCksIGJsb2NrLCBjb3VudCkgfHwKKwkgICAgaW5fcmFuZ2UgKGJsb2NrLCBsZTMyX3RvX2NwdShkZXNjLT5iZ19pbm9kZV90YWJsZSksCisJCSAgICAgIHNiaS0+c19pdGJfcGVyX2dyb3VwKSB8fAorCSAgICBpbl9yYW5nZSAoYmxvY2sgKyBjb3VudCAtIDEsIGxlMzJfdG9fY3B1KGRlc2MtPmJnX2lub2RlX3RhYmxlKSwKKwkJICAgICAgc2JpLT5zX2l0Yl9wZXJfZ3JvdXApKQorCQlleHQzX2Vycm9yIChzYiwgImV4dDNfZnJlZV9ibG9ja3MiLAorCQkJICAgICJGcmVlaW5nIGJsb2NrcyBpbiBzeXN0ZW0gem9uZXMgLSAiCisJCQkgICAgIkJsb2NrID0gJWx1LCBjb3VudCA9ICVsdSIsCisJCQkgICAgYmxvY2ssIGNvdW50KTsKKworCS8qCisJICogV2UgYXJlIGFib3V0IHRvIHN0YXJ0IHJlbGVhc2luZyBibG9ja3MgaW4gdGhlIGJpdG1hcCwKKwkgKiBzbyB3ZSBuZWVkIHVuZG8gYWNjZXNzLgorCSAqLworCS8qIEBAQCBjaGVjayBlcnJvcnMgKi8KKwlCVUZGRVJfVFJBQ0UoYml0bWFwX2JoLCAiZ2V0dGluZyB1bmRvIGFjY2VzcyIpOworCWVyciA9IGV4dDNfam91cm5hbF9nZXRfdW5kb19hY2Nlc3MoaGFuZGxlLCBiaXRtYXBfYmgpOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCisJLyoKKwkgKiBXZSBhcmUgYWJvdXQgdG8gbW9kaWZ5IHNvbWUgbWV0YWRhdGEuICBDYWxsIHRoZSBqb3VybmFsIEFQSXMKKwkgKiB0byB1bnNoYXJlIC0+Yl9kYXRhIGlmIGEgY3VycmVudGx5LWNvbW1pdHRpbmcgdHJhbnNhY3Rpb24gaXMKKwkgKiB1c2luZyBpdAorCSAqLworCUJVRkZFUl9UUkFDRShnZF9iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwllcnIgPSBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGdkX2JoKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yX3JldHVybjsKKworCWpiZF9sb2NrX2JoX3N0YXRlKGJpdG1hcF9iaCk7CisKKwlmb3IgKGkgPSAwLCBncm91cF9mcmVlZCA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCS8qCisJCSAqIEFuIEhKIHNwZWNpYWwuICBUaGlzIGlzIGV4cGVuc2l2ZS4uLgorCQkgKi8KKyNpZmRlZiBDT05GSUdfSkJEX0RFQlVHCisJCWpiZF91bmxvY2tfYmhfc3RhdGUoYml0bWFwX2JoKTsKKwkJeworCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpkZWJ1Z19iaDsKKwkJCWRlYnVnX2JoID0gc2JfZmluZF9nZXRfYmxvY2soc2IsIGJsb2NrICsgaSk7CisJCQlpZiAoZGVidWdfYmgpIHsKKwkJCQlCVUZGRVJfVFJBQ0UoZGVidWdfYmgsICJEZWxldGVkISIpOworCQkJCWlmICghYmgyamgoYml0bWFwX2JoKS0+Yl9jb21taXR0ZWRfZGF0YSkKKwkJCQkJQlVGRkVSX1RSQUNFKGRlYnVnX2JoLAorCQkJCQkJIk5vIGNvbW1pdGVkIGRhdGEgaW4gYml0bWFwIik7CisJCQkJQlVGRkVSX1RSQUNFMihkZWJ1Z19iaCwgYml0bWFwX2JoLCAiYml0bWFwIik7CisJCQkJX19icmVsc2UoZGVidWdfYmgpOworCQkJfQorCQl9CisJCWpiZF9sb2NrX2JoX3N0YXRlKGJpdG1hcF9iaCk7CisjZW5kaWYKKwkJaWYgKG5lZWRfcmVzY2hlZCgpKSB7CisJCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJpdG1hcF9iaCk7CisJCQljb25kX3Jlc2NoZWQoKTsKKwkJCWpiZF9sb2NrX2JoX3N0YXRlKGJpdG1hcF9iaCk7CisJCX0KKwkJLyogQEBAIFRoaXMgcHJldmVudHMgbmV3bHktYWxsb2NhdGVkIGRhdGEgZnJvbSBiZWluZworCQkgKiBmcmVlZCBhbmQgdGhlbiByZWFsbG9jYXRlZCB3aXRoaW4gdGhlIHNhbWUKKwkJICogdHJhbnNhY3Rpb24uIAorCQkgKiAKKwkJICogSWRlYWxseSB3ZSB3b3VsZCB3YW50IHRvIGFsbG93IHRoYXQgdG8gaGFwcGVuLCBidXQgdG8KKwkJICogZG8gc28gcmVxdWlyZXMgbWFraW5nIGpvdXJuYWxfZm9yZ2V0KCkgY2FwYWJsZSBvZgorCQkgKiByZXZva2luZyB0aGUgcXVldWVkIHdyaXRlIG9mIGEgZGF0YSBibG9jaywgd2hpY2gKKwkJICogaW1wbGllcyBibG9ja2luZyBvbiB0aGUgam91cm5hbCBsb2NrLiAgKmZvcmdldCgpCisJCSAqIGNhbm5vdCBibG9jayBkdWUgdG8gdHJ1bmNhdGUgcmFjZXMuCisJCSAqCisJCSAqIEV2ZW50dWFsbHkgd2UgY2FuIGZpeCB0aGlzIGJ5IG1ha2luZyBqb3VybmFsX2ZvcmdldCgpCisJCSAqIHJldHVybiBhIHN0YXR1cyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IGl0IHdhcyBhYmxlCisJCSAqIHRvIHJldm9rZSB0aGUgYnVmZmVyLiAgT24gc3VjY2Vzc2Z1bCByZXZva2UsIGl0IGlzCisJCSAqIHNhZmUgbm90IHRvIHNldCB0aGUgYWxsb2NhdGlvbiBiaXQgaW4gdGhlIGNvbW1pdHRlZAorCQkgKiBiaXRtYXAsIGJlY2F1c2Ugd2Uga25vdyB0aGF0IHRoZXJlIGlzIG5vIG91dHN0YW5kaW5nCisJCSAqIGFjdGl2aXR5IG9uIHRoZSBidWZmZXIgYW55IG1vcmUgYW5kIHNvIGl0IGlzIHNhZmUgdG8KKwkJICogcmVhbGxvY2F0ZSBpdC4gIAorCQkgKi8KKwkJQlVGRkVSX1RSQUNFKGJpdG1hcF9iaCwgInNldCBpbiBiX2NvbW1pdHRlZF9kYXRhIik7CisJCUpfQVNTRVJUX0JIKGJpdG1hcF9iaCwKKwkJCQliaDJqaChiaXRtYXBfYmgpLT5iX2NvbW1pdHRlZF9kYXRhICE9IE5VTEwpOworCQlleHQzX3NldF9iaXRfYXRvbWljKHNiX2JnbF9sb2NrKHNiaSwgYmxvY2tfZ3JvdXApLCBiaXQgKyBpLAorCQkJCWJoMmpoKGJpdG1hcF9iaCktPmJfY29tbWl0dGVkX2RhdGEpOworCisJCS8qCisJCSAqIFdlIGNsZWFyIHRoZSBiaXQgaW4gdGhlIGJpdG1hcCBhZnRlciBzZXR0aW5nIHRoZSBjb21taXR0ZWQKKwkJICogZGF0YSBiaXQsIGJlY2F1c2UgdGhpcyBpcyB0aGUgcmV2ZXJzZSBvcmRlciB0byB0aGF0IHdoaWNoCisJCSAqIHRoZSBhbGxvY2F0b3IgdXNlcy4KKwkJICovCisJCUJVRkZFUl9UUkFDRShiaXRtYXBfYmgsICJjbGVhciBiaXQiKTsKKwkJaWYgKCFleHQzX2NsZWFyX2JpdF9hdG9taWMoc2JfYmdsX2xvY2soc2JpLCBibG9ja19ncm91cCksCisJCQkJCQliaXQgKyBpLCBiaXRtYXBfYmgtPmJfZGF0YSkpIHsKKwkJCWpiZF91bmxvY2tfYmhfc3RhdGUoYml0bWFwX2JoKTsKKwkJCWV4dDNfZXJyb3Ioc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkiYml0IGFscmVhZHkgY2xlYXJlZCBmb3IgYmxvY2sgJWx1IiwgYmxvY2sgKyBpKTsKKwkJCWpiZF9sb2NrX2JoX3N0YXRlKGJpdG1hcF9iaCk7CisJCQlCVUZGRVJfVFJBQ0UoYml0bWFwX2JoLCAiYml0IGFscmVhZHkgY2xlYXJlZCIpOworCQl9IGVsc2UgeworCQkJZ3JvdXBfZnJlZWQrKzsKKwkJfQorCX0KKwlqYmRfdW5sb2NrX2JoX3N0YXRlKGJpdG1hcF9iaCk7CisKKwlzcGluX2xvY2soc2JfYmdsX2xvY2soc2JpLCBibG9ja19ncm91cCkpOworCWRlc2MtPmJnX2ZyZWVfYmxvY2tzX2NvdW50ID0KKwkJY3B1X3RvX2xlMTYobGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9ibG9ja3NfY291bnQpICsKKwkJCWdyb3VwX2ZyZWVkKTsKKwlzcGluX3VubG9jayhzYl9iZ2xfbG9jayhzYmksIGJsb2NrX2dyb3VwKSk7CisJcGVyY3B1X2NvdW50ZXJfbW9kKCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyLCBjb3VudCk7CisKKwkvKiBXZSBkaXJ0aWVkIHRoZSBiaXRtYXAgYmxvY2sgKi8KKwlCVUZGRVJfVFJBQ0UoYml0bWFwX2JoLCAiZGlydGllZCBiaXRtYXAgYmxvY2siKTsKKwllcnIgPSBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaXRtYXBfYmgpOworCisJLyogQW5kIHRoZSBncm91cCBkZXNjcmlwdG9yIGJsb2NrICovCisJQlVGRkVSX1RSQUNFKGdkX2JoLCAiZGlydGllZCBncm91cCBkZXNjcmlwdG9yIGJsb2NrIik7CisJcmV0ID0gZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZ2RfYmgpOworCWlmICghZXJyKSBlcnIgPSByZXQ7CisJKnBkcXVvdF9mcmVlZF9ibG9ja3MgKz0gZ3JvdXBfZnJlZWQ7CisKKwlpZiAob3ZlcmZsb3cgJiYgIWVycikgeworCQlibG9jayArPSBjb3VudDsKKwkJY291bnQgPSBvdmVyZmxvdzsKKwkJZ290byBkb19tb3JlOworCX0KKwlzYi0+c19kaXJ0ID0gMTsKK2Vycm9yX3JldHVybjoKKwlicmVsc2UoYml0bWFwX2JoKTsKKwlleHQzX3N0ZF9lcnJvcihzYiwgZXJyKTsKKwlyZXR1cm47Cit9CisKKy8qIEZyZWUgZ2l2ZW4gYmxvY2tzLCB1cGRhdGUgcXVvdGEgYW5kIGlfYmxvY2tzIGZpZWxkICovCit2b2lkIGV4dDNfZnJlZV9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCXVuc2lnbmVkIGxvbmcgYmxvY2ssIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJaW50IGRxdW90X2ZyZWVkX2Jsb2NrczsKKworCXNiID0gaW5vZGUtPmlfc2I7CisJaWYgKCFzYikgeworCQlwcmludGsgKCJleHQzX2ZyZWVfYmxvY2tzOiBub25leGlzdGVudCBkZXZpY2UiKTsKKwkJcmV0dXJuOworCX0KKwlleHQzX2ZyZWVfYmxvY2tzX3NiKGhhbmRsZSwgc2IsIGJsb2NrLCBjb3VudCwgJmRxdW90X2ZyZWVkX2Jsb2Nrcyk7CisJaWYgKGRxdW90X2ZyZWVkX2Jsb2NrcykKKwkJRFFVT1RfRlJFRV9CTE9DSyhpbm9kZSwgZHF1b3RfZnJlZWRfYmxvY2tzKTsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBGb3IgZXh0MyBhbGxvY2F0aW9ucywgd2UgbXVzdCBub3QgcmV1c2UgYW55IGJsb2NrcyB3aGljaCBhcmUKKyAqIGFsbG9jYXRlZCBpbiB0aGUgYml0bWFwIGJ1ZmZlcidzICJsYXN0IGNvbW1pdHRlZCBkYXRhIiBjb3B5LiAgVGhpcworICogcHJldmVudHMgZGVsZXRlcyBmcm9tIGZyZWVpbmcgdXAgdGhlIHBhZ2UgZm9yIHJldXNlIHVudGlsIHdlIGhhdmUKKyAqIGNvbW1pdHRlZCB0aGUgZGVsZXRlIHRyYW5zYWN0aW9uLgorICoKKyAqIElmIHdlIGRpZG4ndCBkbyB0aGlzLCB0aGVuIGRlbGV0aW5nIHNvbWV0aGluZyBhbmQgcmVhbGxvY2F0aW5nIGl0IGFzCisgKiBkYXRhIHdvdWxkIGFsbG93IHRoZSBvbGQgYmxvY2sgdG8gYmUgb3ZlcndyaXR0ZW4gYmVmb3JlIHRoZQorICogdHJhbnNhY3Rpb24gY29tbWl0dGVkIChiZWNhdXNlIHdlIGZvcmNlIGRhdGEgdG8gZGlzayBiZWZvcmUgY29tbWl0KS4KKyAqIFRoaXMgd291bGQgbGVhZCB0byBjb3JydXB0aW9uIGlmIHdlIGNyYXNoZWQgYmV0d2VlbiBvdmVyd3JpdGluZyB0aGUKKyAqIGRhdGEgYW5kIGNvbW1pdHRpbmcgdGhlIGRlbGV0ZS4gCisgKgorICogQEBAIFdlIG1heSB3YW50IHRvIG1ha2UgdGhpcyBhbGxvY2F0aW9uIGJlaGF2aW91ciBjb25kaXRpb25hbCBvbgorICogZGF0YS13cml0ZXMgYXQgc29tZSBwb2ludCwgYW5kIGRpc2FibGUgaXQgZm9yIG1ldGFkYXRhIGFsbG9jYXRpb25zIG9yCisgKiBzeW5jLWRhdGEgaW5vZGVzLgorICovCitzdGF0aWMgaW50IGV4dDNfdGVzdF9hbGxvY2F0YWJsZShpbnQgbnIsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCA9IGJoMmpoKGJoKTsKKworCWlmIChleHQzX3Rlc3RfYml0KG5yLCBiaC0+Yl9kYXRhKSkKKwkJcmV0dXJuIDA7CisKKwlqYmRfbG9ja19iaF9zdGF0ZShiaCk7CisJaWYgKCFqaC0+Yl9jb21taXR0ZWRfZGF0YSkKKwkJcmV0ID0gMTsKKwllbHNlCisJCXJldCA9ICFleHQzX3Rlc3RfYml0KG5yLCBqaC0+Yl9jb21taXR0ZWRfZGF0YSk7CisJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorYml0bWFwX3NlYXJjaF9uZXh0X3VzYWJsZV9ibG9jayhpbnQgc3RhcnQsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsCisJCQkJCWludCBtYXhibG9ja3MpCit7CisJaW50IG5leHQ7CisJc3RydWN0IGpvdXJuYWxfaGVhZCAqamggPSBiaDJqaChiaCk7CisKKwkvKgorCSAqIFRoZSBiaXRtYXAgc2VhcmNoIC0tLSBzZWFyY2ggZm9yd2FyZCBhbHRlcm5hdGVseSB0aHJvdWdoIHRoZSBhY3R1YWwKKwkgKiBiaXRtYXAgYW5kIHRoZSBsYXN0LWNvbW1pdHRlZCBjb3B5IHVudGlsIHdlIGZpbmQgYSBiaXQgZnJlZSBpbgorCSAqIGJvdGgKKwkgKi8KKwl3aGlsZSAoc3RhcnQgPCBtYXhibG9ja3MpIHsKKwkJbmV4dCA9IGV4dDNfZmluZF9uZXh0X3plcm9fYml0KGJoLT5iX2RhdGEsIG1heGJsb2Nrcywgc3RhcnQpOworCQlpZiAobmV4dCA+PSBtYXhibG9ja3MpCisJCQlyZXR1cm4gLTE7CisJCWlmIChleHQzX3Rlc3RfYWxsb2NhdGFibGUobmV4dCwgYmgpKQorCQkJcmV0dXJuIG5leHQ7CisJCWpiZF9sb2NrX2JoX3N0YXRlKGJoKTsKKwkJaWYgKGpoLT5iX2NvbW1pdHRlZF9kYXRhKQorCQkJc3RhcnQgPSBleHQzX2ZpbmRfbmV4dF96ZXJvX2JpdChqaC0+Yl9jb21taXR0ZWRfZGF0YSwKKwkJCQkJCSAJbWF4YmxvY2tzLCBuZXh0KTsKKwkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisJfQorCXJldHVybiAtMTsKK30KKworLyoKKyAqIEZpbmQgYW4gYWxsb2NhdGFibGUgYmxvY2sgaW4gYSBiaXRtYXAuICBXZSBob25vdXIgYm90aCB0aGUgYml0bWFwIGFuZAorICogaXRzIGxhc3QtY29tbWl0dGVkIGNvcHkgKGlmIHRoYXQgZXhpc3RzKSwgYW5kIHBlcmZvcm0gdGhlICJtb3N0CisgKiBhcHByb3ByaWF0ZSBhbGxvY2F0aW9uIiBhbGdvcml0aG0gb2YgbG9va2luZyBmb3IgYSBmcmVlIGJsb2NrIG5lYXIKKyAqIHRoZSBpbml0aWFsIGdvYWw7IHRoZW4gZm9yIGEgZnJlZSBieXRlIHNvbWV3aGVyZSBpbiB0aGUgYml0bWFwOyB0aGVuCisgKiBmb3IgYW55IGZyZWUgYml0IGluIHRoZSBiaXRtYXAuCisgKi8KK3N0YXRpYyBpbnQKK2ZpbmRfbmV4dF91c2FibGVfYmxvY2soaW50IHN0YXJ0LCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgbWF4YmxvY2tzKQoreworCWludCBoZXJlLCBuZXh0OworCWNoYXIgKnAsICpyOworCisJaWYgKHN0YXJ0ID4gMCkgeworCQkvKgorCQkgKiBUaGUgZ29hbCB3YXMgb2NjdXBpZWQ7IHNlYXJjaCBmb3J3YXJkIGZvciBhIGZyZWUgCisJCSAqIGJsb2NrIHdpdGhpbiB0aGUgbmV4dCBYWCBibG9ja3MuCisJCSAqCisJCSAqIGVuZF9nb2FsIGlzIG1vcmUgb3IgbGVzcyByYW5kb20sIGJ1dCBpdCBoYXMgdG8gYmUKKwkJICogbGVzcyB0aGFuIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUC4gQWxpZ25pbmcgdXAgdG8gdGhlCisJCSAqIG5leHQgNjQtYml0IGJvdW5kYXJ5IGlzIHNpbXBsZS4uCisJCSAqLworCQlpbnQgZW5kX2dvYWwgPSAoc3RhcnQgKyA2MykgJiB+NjM7CisJCWlmIChlbmRfZ29hbCA+IG1heGJsb2NrcykKKwkJCWVuZF9nb2FsID0gbWF4YmxvY2tzOworCQloZXJlID0gZXh0M19maW5kX25leHRfemVyb19iaXQoYmgtPmJfZGF0YSwgZW5kX2dvYWwsIHN0YXJ0KTsKKwkJaWYgKGhlcmUgPCBlbmRfZ29hbCAmJiBleHQzX3Rlc3RfYWxsb2NhdGFibGUoaGVyZSwgYmgpKQorCQkJcmV0dXJuIGhlcmU7CisJCWV4dDNfZGVidWcoIkJpdCBub3QgZm91bmQgbmVhciBnb2FsXG4iKTsKKwl9CisKKwloZXJlID0gc3RhcnQ7CisJaWYgKGhlcmUgPCAwKQorCQloZXJlID0gMDsKKworCXAgPSAoKGNoYXIgKiliaC0+Yl9kYXRhKSArIChoZXJlID4+IDMpOworCXIgPSBtZW1zY2FuKHAsIDAsIChtYXhibG9ja3MgLSBoZXJlICsgNykgPj4gMyk7CisJbmV4dCA9IChyIC0gKChjaGFyICopYmgtPmJfZGF0YSkpIDw8IDM7CisKKwlpZiAobmV4dCA8IG1heGJsb2NrcyAmJiBuZXh0ID49IHN0YXJ0ICYmIGV4dDNfdGVzdF9hbGxvY2F0YWJsZShuZXh0LCBiaCkpCisJCXJldHVybiBuZXh0OworCisJLyoKKwkgKiBUaGUgYml0bWFwIHNlYXJjaCAtLS0gc2VhcmNoIGZvcndhcmQgYWx0ZXJuYXRlbHkgdGhyb3VnaCB0aGUgYWN0dWFsCisJICogYml0bWFwIGFuZCB0aGUgbGFzdC1jb21taXR0ZWQgY29weSB1bnRpbCB3ZSBmaW5kIGEgYml0IGZyZWUgaW4KKwkgKiBib3RoCisJICovCisJaGVyZSA9IGJpdG1hcF9zZWFyY2hfbmV4dF91c2FibGVfYmxvY2soaGVyZSwgYmgsIG1heGJsb2Nrcyk7CisJcmV0dXJuIGhlcmU7Cit9CisKKy8qCisgKiBXZSB0aGluayB3ZSBjYW4gYWxsb2NhdGUgdGhpcyBibG9jayBpbiB0aGlzIGJpdG1hcC4gIFRyeSB0byBzZXQgdGhlIGJpdC4KKyAqIElmIHRoYXQgc3VjY2VlZHMgdGhlbiBjaGVjayB0aGF0IG5vYm9keSBoYXMgYWxsb2NhdGVkIGFuZCB0aGVuIGZyZWVkIHRoZQorICogYmxvY2sgc2luY2Ugd2Ugc2F3IHRoYXQgaXMgd2FzIG5vdCBtYXJrZWQgaW4gYl9jb21taXR0ZWRfZGF0YS4gIElmIGl0IF93YXNfCisgKiBhbGxvY2F0ZWQgYW5kIGZyZWVkIHRoZW4gY2xlYXIgdGhlIGJpdCBpbiB0aGUgYml0bWFwIGFnYWluIGFuZCByZXR1cm4KKyAqIHplcm8gKGZhaWx1cmUpLgorICovCitzdGF0aWMgaW5saW5lIGludAorY2xhaW1fYmxvY2soc3BpbmxvY2tfdCAqbG9jaywgaW50IGJsb2NrLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXN0cnVjdCBqb3VybmFsX2hlYWQgKmpoID0gYmgyamgoYmgpOworCWludCByZXQ7CisKKwlpZiAoZXh0M19zZXRfYml0X2F0b21pYyhsb2NrLCBibG9jaywgYmgtPmJfZGF0YSkpCisJCXJldHVybiAwOworCWpiZF9sb2NrX2JoX3N0YXRlKGJoKTsKKwlpZiAoamgtPmJfY29tbWl0dGVkX2RhdGEgJiYgZXh0M190ZXN0X2JpdChibG9jayxqaC0+Yl9jb21taXR0ZWRfZGF0YSkpIHsKKwkJZXh0M19jbGVhcl9iaXRfYXRvbWljKGxvY2ssIGJsb2NrLCBiaC0+Yl9kYXRhKTsKKwkJcmV0ID0gMDsKKwl9IGVsc2UgeworCQlyZXQgPSAxOworCX0KKwlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogSWYgd2UgZmFpbGVkIHRvIGFsbG9jYXRlIHRoZSBkZXNpcmVkIGJsb2NrIHRoZW4gd2UgbWF5IGVuZCB1cCBjcm9zc2luZyB0byBhCisgKiBuZXcgYml0bWFwLiAgSW4gdGhhdCBjYXNlIHdlIG11c3QgcmVsZWFzZSB3cml0ZSBhY2Nlc3MgdG8gdGhlIG9sZCBvbmUgdmlhCisgKiBleHQzX2pvdXJuYWxfcmVsZWFzZV9idWZmZXIoKSwgZWxzZSB3ZSdsbCBydW4gb3V0IG9mIGNyZWRpdHMuCisgKi8KK3N0YXRpYyBpbnQKK2V4dDNfdHJ5X3RvX2FsbG9jYXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGhhbmRsZV90ICpoYW5kbGUsIGludCBncm91cCwKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpdG1hcF9iaCwgaW50IGdvYWwsIHN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93ICpteV9yc3YpCit7CisJaW50IGdyb3VwX2ZpcnN0X2Jsb2NrLCBzdGFydCwgZW5kOworCisJLyogd2UgZG8gYWxsb2NhdGlvbiB3aXRoaW4gdGhlIHJlc2VydmF0aW9uIHdpbmRvdyBpZiB3ZSBoYXZlIGEgd2luZG93ICovCisJaWYgKG15X3JzdikgeworCQlncm91cF9maXJzdF9ibG9jayA9CisJCQlsZTMyX3RvX2NwdShFWFQzX1NCKHNiKS0+c19lcy0+c19maXJzdF9kYXRhX2Jsb2NrKSArCisJCQlncm91cCAqIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYik7CisJCWlmIChteV9yc3YtPl9yc3Zfc3RhcnQgPj0gZ3JvdXBfZmlyc3RfYmxvY2spCisJCQlzdGFydCA9IG15X3Jzdi0+X3Jzdl9zdGFydCAtIGdyb3VwX2ZpcnN0X2Jsb2NrOworCQllbHNlCisJCQkvKiByZXNlcnZhdGlvbiB3aW5kb3cgY3Jvc3MgZ3JvdXAgYm91bmRhcnkgKi8KKwkJCXN0YXJ0ID0gMDsKKwkJZW5kID0gbXlfcnN2LT5fcnN2X2VuZCAtIGdyb3VwX2ZpcnN0X2Jsb2NrICsgMTsKKwkJaWYgKGVuZCA+IEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYikpCisJCQkvKiByZXNlcnZhdGlvbiB3aW5kb3cgY3Jvc3NlcyBncm91cCBib3VuZGFyeSAqLworCQkJZW5kID0gRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKTsKKwkJaWYgKChzdGFydCA8PSBnb2FsKSAmJiAoZ29hbCA8IGVuZCkpCisJCQlzdGFydCA9IGdvYWw7CisJCWVsc2UKKwkJCWdvYWwgPSAtMTsKKwl9IGVsc2UgeworCQlpZiAoZ29hbCA+IDApCisJCQlzdGFydCA9IGdvYWw7CisJCWVsc2UKKwkJCXN0YXJ0ID0gMDsKKwkJZW5kID0gRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKTsKKwl9CisKKwlCVUdfT04oc3RhcnQgPiBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpKTsKKworcmVwZWF0OgorCWlmIChnb2FsIDwgMCB8fCAhZXh0M190ZXN0X2FsbG9jYXRhYmxlKGdvYWwsIGJpdG1hcF9iaCkpIHsKKwkJZ29hbCA9IGZpbmRfbmV4dF91c2FibGVfYmxvY2soc3RhcnQsIGJpdG1hcF9iaCwgZW5kKTsKKwkJaWYgKGdvYWwgPCAwKQorCQkJZ290byBmYWlsX2FjY2VzczsKKwkJaWYgKCFteV9yc3YpIHsKKwkJCWludCBpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgNyAmJiBnb2FsID4gc3RhcnQgJiYKKwkJCQkJZXh0M190ZXN0X2FsbG9jYXRhYmxlKGdvYWwgLSAxLAorCQkJCQkJCQliaXRtYXBfYmgpOworCQkJCQlpKyssIGdvYWwtLSkKKwkJCQk7CisJCX0KKwl9CisJc3RhcnQgPSBnb2FsOworCisJaWYgKCFjbGFpbV9ibG9jayhzYl9iZ2xfbG9jayhFWFQzX1NCKHNiKSwgZ3JvdXApLCBnb2FsLCBiaXRtYXBfYmgpKSB7CisJCS8qCisJCSAqIFRoZSBibG9jayB3YXMgYWxsb2NhdGVkIGJ5IGFub3RoZXIgdGhyZWFkLCBvciBpdCB3YXMKKwkJICogYWxsb2NhdGVkIGFuZCB0aGVuIGZyZWVkIGJ5IGFub3RoZXIgdGhyZWFkCisJCSAqLworCQlzdGFydCsrOworCQlnb2FsKys7CisJCWlmIChzdGFydCA+PSBlbmQpCisJCQlnb3RvIGZhaWxfYWNjZXNzOworCQlnb3RvIHJlcGVhdDsKKwl9CisJcmV0dXJuIGdvYWw7CitmYWlsX2FjY2VzczoKKwlyZXR1cm4gLTE7Cit9CisKKy8qKgorICogCWZpbmRfbmV4dF9yZXNlcnZhYmxlX3dpbmRvdygpOgorICoJCWZpbmQgYSByZXNlcnZhYmxlIHNwYWNlIHdpdGhpbiB0aGUgZ2l2ZW4gcmFuZ2UuCisgKgkJSXQgZG9lcyBub3QgYWxsb2NhdGUgdGhlIHJlc2VydmF0aW9uIHdpbmRvdyBmb3Igbm93OgorICoJCWFsbG9jX25ld19yZXNlcnZhdGlvbigpIHdpbGwgZG8gdGhlIHdvcmsgbGF0ZXIuCisgKgorICogCUBzZWFyY2hfaGVhZDogdGhlIGhlYWQgb2YgdGhlIHNlYXJjaGluZyBsaXN0OworICoJCVRoaXMgaXMgbm90IG5lY2Vzc2FyaWx5IHRoZSBsaXN0IGhlYWQgb2YgdGhlIHdob2xlIGZpbGVzeXN0ZW0KKyAqCisgKgkJV2UgaGF2ZSBib3RoIGhlYWQgYW5kIHN0YXJ0X2Jsb2NrIHRvIGFzc2lzdCB0aGUgc2VhcmNoCisgKgkJZm9yIHRoZSByZXNlcnZhYmxlIHNwYWNlLiBUaGUgbGlzdCBzdGFydHMgZnJvbSBoZWFkLAorICoJCWJ1dCB3ZSB3aWxsIHNoaWZ0IHRvIHRoZSBwbGFjZSB3aGVyZSBzdGFydF9ibG9jayBpcywKKyAqCQl0aGVuIHN0YXJ0IGZyb20gdGhlcmUsIHdoZW4gbG9va2luZyBmb3IgYSByZXNlcnZhYmxlIHNwYWNlLgorICoKKyAqIAlAc2l6ZTogdGhlIHRhcmdldCBuZXcgcmVzZXJ2YXRpb24gd2luZG93IHNpemUKKyAqCisgKiAJQGdyb3VwX2ZpcnN0X2Jsb2NrOiB0aGUgZmlyc3QgYmxvY2sgd2UgY29uc2lkZXIgdG8gc3RhcnQKKyAqCQkJdGhlIHJlYWwgc2VhcmNoIGZyb20KKyAqCisgKiAJQGxhc3RfYmxvY2s6CisgKgkJdGhlIG1heGltdW0gYmxvY2sgbnVtYmVyIHRoYXQgb3VyIGdvYWwgcmVzZXJ2YWJsZSBzcGFjZQorICoJCWNvdWxkIHN0YXJ0IGZyb20uIFRoaXMgaXMgbm9ybWFsbHkgdGhlIGxhc3QgYmxvY2sgaW4gdGhpcworICoJCWdyb3VwLiBUaGUgc2VhcmNoIHdpbGwgZW5kIHdoZW4gd2UgZm91bmQgdGhlIHN0YXJ0IG9mIG5leHQKKyAqCQlwb3NzaWJsZSByZXNlcnZhYmxlIHNwYWNlIGlzIG91dCBvZiB0aGlzIGJvdW5kYXJ5LgorICoJCVRoaXMgY291bGQgaGFuZGxlIHRoZSBjcm9zcyBib3VuZGFyeSByZXNlcnZhdGlvbiB3aW5kb3cKKyAqCQlyZXF1ZXN0LgorICoKKyAqIAliYXNpY2FsbHkgd2Ugc2VhcmNoIGZyb20gdGhlIGdpdmVuIHJhbmdlLCByYXRoZXIgdGhhbiB0aGUgd2hvbGUKKyAqIAlyZXNlcnZhdGlvbiBkb3VibGUgbGlua2VkIGxpc3QsIChzdGFydF9ibG9jaywgbGFzdF9ibG9jaykKKyAqIAl0byBmaW5kIGEgZnJlZSByZWdpb24gdGhhdCBpcyBvZiBteSBzaXplIGFuZCBoYXMgbm90CisgKiAJYmVlbiByZXNlcnZlZC4KKyAqCisgKglvbiBzdWNjZWVkLCBpdCByZXR1cm5zIHRoZSByZXNlcnZhdGlvbiB3aW5kb3cgdG8gYmUgYXBwZW5kZWQgdG8uCisgKglmYWlsZWQsIHJldHVybiBOVUxMLgorICovCitzdGF0aWMgc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqZmluZF9uZXh0X3Jlc2VydmFibGVfd2luZG93KAorCQkJCXN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUgKnNlYXJjaF9oZWFkLAorCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSwgaW50ICpzdGFydF9ibG9jaywKKwkJCQlpbnQgbGFzdF9ibG9jaykKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbmV4dDsKKwlzdHJ1Y3QgZXh0M19yZXNlcnZlX3dpbmRvd19ub2RlICpyc3YsICpwcmV2OworCWludCBjdXI7CisKKwkvKiBUT0RPOiBtYWtlIHRoZSBzdGFydCBvZiB0aGUgcmVzZXJ2YXRpb24gd2luZG93IGJ5dGUtYWxpZ25lZCAqLworCS8qIGN1ciA9ICpzdGFydF9ibG9jayAmIH43OyovCisJY3VyID0gKnN0YXJ0X2Jsb2NrOworCXJzdiA9IHNlYXJjaF9oZWFkOworCWlmICghcnN2KQorCQlyZXR1cm4gTlVMTDsKKworCXdoaWxlICgxKSB7CisJCWlmIChjdXIgPD0gcnN2LT5yc3ZfZW5kKQorCQkJY3VyID0gcnN2LT5yc3ZfZW5kICsgMTsKKworCQkvKiBUT0RPPworCQkgKiBpbiB0aGUgY2FzZSB3ZSBjb3VsZCBub3QgZmluZCBhIHJlc2VydmFibGUgc3BhY2UKKwkJICogdGhhdCBpcyB3aGF0IGlzIGV4cGVjdGVkLCBkdXJpbmcgdGhlIHJlLXNlYXJjaCwgd2UgY291bGQKKwkJICogcmVtZW1iZXIgd2hhdCdzIHRoZSBsYXJnZXN0IHJlc2VydmFibGUgc3BhY2Ugd2UgY291bGQgaGF2ZQorCQkgKiBhbmQgcmV0dXJuIHRoYXQgb25lLgorCQkgKgorCQkgKiBGb3Igbm93IGl0IHdpbGwgZmFpbCBpZiB3ZSBjb3VsZCBub3QgZmluZCB0aGUgcmVzZXJ2YWJsZQorCQkgKiBzcGFjZSB3aXRoIGV4cGVjdGVkLXNpemUgKG9yIG1vcmUpLi4uCisJCSAqLworCQlpZiAoY3VyID4gbGFzdF9ibG9jaykKKwkJCXJldHVybiBOVUxMOwkJLyogZmFpbCAqLworCisJCXByZXYgPSByc3Y7CisJCW5leHQgPSByYl9uZXh0KCZyc3YtPnJzdl9ub2RlKTsKKwkJcnN2ID0gbGlzdF9lbnRyeShuZXh0LCBzdHJ1Y3QgZXh0M19yZXNlcnZlX3dpbmRvd19ub2RlLCByc3Zfbm9kZSk7CisKKwkJLyoKKwkJICogUmVhY2hlZCB0aGUgbGFzdCByZXNlcnZhdGlvbiwgd2UgY2FuIGp1c3QgYXBwZW5kIHRvIHRoZQorCQkgKiBwcmV2aW91cyBvbmUuCisJCSAqLworCQlpZiAoIW5leHQpCisJCQlicmVhazsKKworCQlpZiAoY3VyICsgc2l6ZSA8PSByc3YtPnJzdl9zdGFydCkgeworCQkJLyoKKwkJCSAqIEZvdW5kIGEgcmVzZXJ2ZWFibGUgc3BhY2UgYmlnIGVub3VnaC4gIFdlIGNvdWxkCisJCQkgKiBoYXZlIGEgcmVzZXJ2YXRpb24gYWNyb3NzIHRoZSBncm91cCBib3VuZGFyeSBoZXJlCisJCSAJICovCisJCQlicmVhazsKKwkJfQorCX0KKwkvKgorCSAqIHdlIGNvbWUgaGVyZSBlaXRoZXIgOgorCSAqIHdoZW4gd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUgd2hvbGUgbGlzdCwKKwkgKiBhbmQgdGhlcmUgaXMgZW1wdHkgcmVzZXJ2YWJsZSBzcGFjZSBhZnRlciBsYXN0IGVudHJ5IGluIHRoZSBsaXN0LgorCSAqIGFwcGVuZCBpdCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgorCSAqCisJICogb3Igd2UgZm91bmQgb25lIHJlc2VydmFibGUgc3BhY2UgaW4gdGhlIG1pZGRsZSBvZiB0aGUgbGlzdCwKKwkgKiByZXR1cm4gdGhlIHJlc2VydmF0aW9uIHdpbmRvdyB0aGF0IHdlIGNvdWxkIGFwcGVuZCB0by4KKwkgKiBzdWNjZWVkLgorCSAqLworCSpzdGFydF9ibG9jayA9IGN1cjsKKwlyZXR1cm4gcHJldjsKK30KKworLyoqCisgKiAJYWxsb2NfbmV3X3Jlc2VydmF0aW9uKCktLWFsbG9jYXRlIGEgbmV3IHJlc2VydmF0aW9uIHdpbmRvdworICoKKyAqCQlUbyBtYWtlIGEgbmV3IHJlc2VydmF0aW9uLCB3ZSBzZWFyY2ggcGFydCBvZiB0aGUgZmlsZXN5c3RlbQorICoJCXJlc2VydmF0aW9uIGxpc3QgKHRoZSBsaXN0IHRoYXQgaW5zaWRlIHRoZSBncm91cCkuIFdlIHRyeSB0bworICoJCWFsbG9jYXRlIGEgbmV3IHJlc2VydmF0aW9uIHdpbmRvdyBuZWFyIHRoZSBhbGxvY2F0aW9uIGdvYWwsCisgKgkJb3IgdGhlIGJlZ2lubmluZyBvZiB0aGUgZ3JvdXAsIGlmIHRoZXJlIGlzIG5vIGdvYWwuCisgKgorICoJCVdlIGZpcnN0IGZpbmQgYSByZXNlcnZhYmxlIHNwYWNlIGFmdGVyIHRoZSBnb2FsLCB0aGVuIGZyb20KKyAqCQl0aGVyZSwgd2UgY2hlY2sgdGhlIGJpdG1hcCBmb3IgdGhlIGZpcnN0IGZyZWUgYmxvY2sgYWZ0ZXIKKyAqCQlpdC4gSWYgdGhlcmUgaXMgbm8gZnJlZSBibG9jayB1bnRpbCB0aGUgZW5kIG9mIGdyb3VwLCB0aGVuIHRoZQorICoJCXdob2xlIGdyb3VwIGlzIGZ1bGwsIHdlIGZhaWxlZC4gT3RoZXJ3aXNlLCBjaGVjayBpZiB0aGUgZnJlZQorICoJCWJsb2NrIGlzIGluc2lkZSB0aGUgZXhwZWN0ZWQgcmVzZXJ2YWJsZSBzcGFjZSwgaWYgc28sIHdlCisgKgkJc3VjY2VlZC4KKyAqCQlJZiB0aGUgZmlyc3QgZnJlZSBibG9jayBpcyBvdXRzaWRlIHRoZSByZXNlcnZhYmxlIHNwYWNlLCB0aGVuCisgKgkJc3RhcnQgZnJvbSB0aGUgZmlyc3QgZnJlZSBibG9jaywgd2Ugc2VhcmNoIGZvciBuZXh0IGF2YWlsYWJsZQorICoJCXNwYWNlLCBhbmQgZ28gb24uCisgKgorICoJb24gc3VjY2VlZCwgYSBuZXcgcmVzZXJ2YXRpb24gd2lsbCBiZSBmb3VuZCBhbmQgaW5zZXJ0ZWQgaW50byB0aGUgbGlzdAorICoJSXQgY29udGFpbnMgYXQgbGVhc3Qgb25lIGZyZWUgYmxvY2ssIGFuZCBpdCBkb2VzIG5vdCBvdmVybGFwIHdpdGggb3RoZXIKKyAqCXJlc2VydmF0aW9uIHdpbmRvd3MuCisgKgorICoJZmFpbGVkOiB3ZSBmYWlsZWQgdG8gZmluZCBhIHJlc2VydmF0aW9uIHdpbmRvdyBpbiB0aGlzIGdyb3VwCisgKgorICoJQHJzdjogdGhlIHJlc2VydmF0aW9uCisgKgorICoJQGdvYWw6IFRoZSBnb2FsIChncm91cC1yZWxhdGl2ZSkuICBJdCBpcyB3aGVyZSB0aGUgc2VhcmNoIGZvciBhCisgKgkJZnJlZSByZXNlcnZhYmxlIHNwYWNlIHNob3VsZCBzdGFydCBmcm9tLgorICoJCWlmIHdlIGhhdmUgYSBnb2FsKGdvYWwgPjAgKSwgdGhlbiBzdGFydCBmcm9tIHRoZXJlLAorICoJCW5vIGdvYWwoZ29hbCA9IC0xKSwgd2Ugc3RhcnQgZnJvbSB0aGUgZmlyc3QgYmxvY2sKKyAqCQlvZiB0aGUgZ3JvdXAuCisgKgorICoJQHNiOiB0aGUgc3VwZXIgYmxvY2sKKyAqCUBncm91cDogdGhlIGdyb3VwIHdlIGFyZSB0cnlpbmcgdG8gYWxsb2NhdGUgaW4KKyAqCUBiaXRtYXBfYmg6IHRoZSBibG9jayBncm91cCBibG9jayBiaXRtYXAKKyAqLworc3RhdGljIGludCBhbGxvY19uZXdfcmVzZXJ2YXRpb24oc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqbXlfcnN2LAorCQlpbnQgZ29hbCwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJdW5zaWduZWQgaW50IGdyb3VwLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpdG1hcF9iaCkKK3sKKwlzdHJ1Y3QgZXh0M19yZXNlcnZlX3dpbmRvd19ub2RlICpzZWFyY2hfaGVhZDsKKwlpbnQgZ3JvdXBfZmlyc3RfYmxvY2ssIGdyb3VwX2VuZF9ibG9jaywgc3RhcnRfYmxvY2s7CisJaW50IGZpcnN0X2ZyZWVfYmxvY2s7CisJaW50IHJlc2VydmFibGVfc3BhY2Vfc3RhcnQ7CisJc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqcHJldl9yc3Y7CisJc3RydWN0IHJiX3Jvb3QgKmZzX3Jzdl9yb290ID0gJkVYVDNfU0Ioc2IpLT5zX3Jzdl93aW5kb3dfcm9vdDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisKKwlncm91cF9maXJzdF9ibG9jayA9IGxlMzJfdG9fY3B1KEVYVDNfU0Ioc2IpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spICsKKwkJCQlncm91cCAqIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYik7CisJZ3JvdXBfZW5kX2Jsb2NrID0gZ3JvdXBfZmlyc3RfYmxvY2sgKyBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpIC0gMTsKKworCWlmIChnb2FsIDwgMCkKKwkJc3RhcnRfYmxvY2sgPSBncm91cF9maXJzdF9ibG9jazsKKwllbHNlCisJCXN0YXJ0X2Jsb2NrID0gZ29hbCArIGdyb3VwX2ZpcnN0X2Jsb2NrOworCisJc2l6ZSA9IG15X3Jzdi0+cnN2X2dvYWxfc2l6ZTsKKwlpZiAoIXJzdl9pc19lbXB0eSgmbXlfcnN2LT5yc3Zfd2luZG93KSkgeworCQkvKgorCQkgKiBpZiB0aGUgb2xkIHJlc2VydmF0aW9uIGlzIGNyb3NzIGdyb3VwIGJvdW5kYXJ5CisJCSAqIGFuZCBpZiB0aGUgZ29hbCBpcyBpbnNpZGUgdGhlIG9sZCByZXNlcnZhdGlvbiB3aW5kb3csCisJCSAqIHdlIHdpbGwgY29tZSBoZXJlIHdoZW4gd2UganVzdCBmYWlsZWQgdG8gYWxsb2NhdGUgZnJvbQorCQkgKiB0aGUgZmlyc3QgcGFydCBvZiB0aGUgd2luZG93LiBXZSBzdGlsbCBoYXZlIGFub3RoZXIgcGFydAorCQkgKiB0aGF0IGJlbG9uZ3MgdG8gdGhlIG5leHQgZ3JvdXAuIEluIHRoaXMgY2FzZSwgdGhlcmUgaXMgbm8KKwkJICogcG9pbnQgdG8gZGlzY2FyZCBvdXIgd2luZG93IGFuZCB0cnkgdG8gYWxsb2NhdGUgYSBuZXcgb25lCisJCSAqIGluIHRoaXMgZ3JvdXAod2hpY2ggd2lsbCBmYWlsKS4gd2Ugc2hvdWxkCisJCSAqIGtlZXAgdGhlIHJlc2VydmF0aW9uIHdpbmRvdywganVzdCBzaW1wbHkgbW92ZSBvbi4KKwkJICoKKwkJICogTWF5YmUgd2UgY291bGQgc2hpZnQgdGhlIHN0YXJ0IGJsb2NrIG9mIHRoZSByZXNlcnZhdGlvbgorCQkgKiB3aW5kb3cgdG8gdGhlIGZpcnN0IGJsb2NrIG9mIG5leHQgZ3JvdXAuCisJCSAqLworCisJCWlmICgobXlfcnN2LT5yc3Zfc3RhcnQgPD0gZ3JvdXBfZW5kX2Jsb2NrKSAmJgorCQkJCShteV9yc3YtPnJzdl9lbmQgPiBncm91cF9lbmRfYmxvY2spICYmCisJCQkJKHN0YXJ0X2Jsb2NrID49IG15X3Jzdi0+cnN2X3N0YXJ0KSkKKwkJCXJldHVybiAtMTsKKworCQlpZiAoKG15X3Jzdi0+cnN2X2FsbG9jX2hpdCA+CisJCSAgICAgKG15X3Jzdi0+cnN2X2VuZCAtIG15X3Jzdi0+cnN2X3N0YXJ0ICsgMSkgLyAyKSkgeworCQkJLyoKKwkJCSAqIGlmIHdlIHByZXZpb3VzbHkgYWxsb2NhdGlvbiBoaXQgcmF0aW9uIGlzIGdyZWF0ZXIgdGhhbiBoYWxmCisJCQkgKiB3ZSBkb3VibGUgdGhlIHNpemUgb2YgcmVzZXJ2YXRpb24gd2luZG93IG5leHQgdGltZQorCQkJICogb3RoZXJ3aXNlIGtlZXAgdGhlIHNhbWUKKwkJCSAqLworCQkJc2l6ZSA9IHNpemUgKiAyOworCQkJaWYgKHNpemUgPiBFWFQzX01BWF9SRVNFUlZFX0JMT0NLUykKKwkJCQlzaXplID0gRVhUM19NQVhfUkVTRVJWRV9CTE9DS1M7CisJCQlteV9yc3YtPnJzdl9nb2FsX3NpemU9IHNpemU7CisJCX0KKwl9CisJLyoKKwkgKiBzaGlmdCB0aGUgc2VhcmNoIHN0YXJ0IHRvIHRoZSB3aW5kb3cgbmVhciB0aGUgZ29hbCBibG9jaworCSAqLworCXNlYXJjaF9oZWFkID0gc2VhcmNoX3Jlc2VydmVfd2luZG93KGZzX3Jzdl9yb290LCBzdGFydF9ibG9jayk7CisKKwkvKgorCSAqIGZpbmRfbmV4dF9yZXNlcnZhYmxlX3dpbmRvdygpIHNpbXBseSBmaW5kcyBhIHJlc2VydmFibGUgd2luZG93CisJICogaW5zaWRlIHRoZSBnaXZlbiByYW5nZShzdGFydF9ibG9jaywgZ3JvdXBfZW5kX2Jsb2NrKS4KKwkgKgorCSAqIFRvIG1ha2Ugc3VyZSB0aGUgcmVzZXJ2YXRpb24gd2luZG93IGhhcyBhIGZyZWUgYml0IGluc2lkZSBpdCwgd2UKKwkgKiBuZWVkIHRvIGNoZWNrIHRoZSBiaXRtYXAgYWZ0ZXIgd2UgZm91bmQgYSByZXNlcnZhYmxlIHdpbmRvdy4KKwkgKi8KK3JldHJ5OgorCXByZXZfcnN2ID0gZmluZF9uZXh0X3Jlc2VydmFibGVfd2luZG93KHNlYXJjaF9oZWFkLCBzaXplLAorCQkJCQkJJnN0YXJ0X2Jsb2NrLCBncm91cF9lbmRfYmxvY2spOworCWlmIChwcmV2X3JzdiA9PSBOVUxMKQorCQlnb3RvIGZhaWxlZDsKKwlyZXNlcnZhYmxlX3NwYWNlX3N0YXJ0ID0gc3RhcnRfYmxvY2s7CisJLyoKKwkgKiBPbiBzdWNjZXNzLCBmaW5kX25leHRfcmVzZXJ2YWJsZV93aW5kb3coKSByZXR1cm5zIHRoZQorCSAqIHJlc2VydmF0aW9uIHdpbmRvdyB3aGVyZSB0aGVyZSBpcyBhIHJlc2VydmFibGUgc3BhY2UgYWZ0ZXIgaXQuCisJICogQmVmb3JlIHdlIHJlc2VydmUgdGhpcyByZXNlcnZhYmxlIHNwYWNlLCB3ZSBuZWVkCisJICogdG8gbWFrZSBzdXJlIHRoZXJlIGlzIGF0IGxlYXN0IGEgZnJlZSBibG9jayBpbnNpZGUgdGhpcyByZWdpb24uCisJICoKKwkgKiBzZWFyY2hpbmcgdGhlIGZpcnN0IGZyZWUgYml0IG9uIHRoZSBibG9jayBiaXRtYXAgYW5kIGNvcHkgb2YKKwkgKiBsYXN0IGNvbW1pdHRlZCBiaXRtYXAgYWx0ZXJuYXRpdmVseSwgdW50aWwgd2UgZm91bmQgYSBhbGxvY2F0YWJsZQorCSAqIGJsb2NrLiBTZWFyY2ggc3RhcnQgZnJvbSB0aGUgc3RhcnQgYmxvY2sgb2YgdGhlIHJlc2VydmFibGUgc3BhY2UKKwkgKiB3ZSBqdXN0IGZvdW5kLgorCSAqLworCWZpcnN0X2ZyZWVfYmxvY2sgPSBiaXRtYXBfc2VhcmNoX25leHRfdXNhYmxlX2Jsb2NrKAorCQkJcmVzZXJ2YWJsZV9zcGFjZV9zdGFydCAtIGdyb3VwX2ZpcnN0X2Jsb2NrLAorCQkJYml0bWFwX2JoLCBncm91cF9lbmRfYmxvY2sgLSBncm91cF9maXJzdF9ibG9jayArIDEpOworCisJaWYgKGZpcnN0X2ZyZWVfYmxvY2sgPCAwKSB7CisJCS8qCisJCSAqIG5vIGZyZWUgYmxvY2sgbGVmdCBvbiB0aGUgYml0bWFwLCBubyBwb2ludAorCQkgKiB0byByZXNlcnZlIHRoZSBzcGFjZS4gcmV0dXJuIGZhaWxlZC4KKwkJICovCisJCWdvdG8gZmFpbGVkOworCX0KKwlzdGFydF9ibG9jayA9IGZpcnN0X2ZyZWVfYmxvY2sgKyBncm91cF9maXJzdF9ibG9jazsKKwkvKgorCSAqIGNoZWNrIGlmIHRoZSBmaXJzdCBmcmVlIGJsb2NrIGlzIHdpdGhpbiB0aGUKKwkgKiBmcmVlIHNwYWNlIHdlIGp1c3QgZm91bmQKKwkgKi8KKwlpZiAoKHN0YXJ0X2Jsb2NrID49IHJlc2VydmFibGVfc3BhY2Vfc3RhcnQpICYmCisJICAoc3RhcnRfYmxvY2sgPCByZXNlcnZhYmxlX3NwYWNlX3N0YXJ0ICsgc2l6ZSkpCisJCWdvdG8gZm91bmRfcnN2X3dpbmRvdzsKKwkvKgorCSAqIGlmIHRoZSBmaXJzdCBmcmVlIGJpdCB3ZSBmb3VuZCBpcyBvdXQgb2YgdGhlIHJlc2VydmFibGUgc3BhY2UKKwkgKiB0aGlzIG1lYW5zIHRoZXJlIGlzIG5vIGZyZWUgYmxvY2sgb24gdGhlIHJlc2VydmFibGUgc3BhY2UKKwkgKiB3ZSBzaG91bGQgY29udGludWUgc2VhcmNoIGZvciBuZXh0IHJlc2VydmFibGUgc3BhY2UsCisJICogc3RhcnQgZnJvbSB3aGVyZSB0aGUgZnJlZSBibG9jayBpcywKKwkgKiB3ZSBhbHNvIHNoaWZ0IHRoZSBsaXN0IGhlYWQgdG8gd2hlcmUgd2Ugc3RvcHBlZCBsYXN0IHRpbWUKKwkgKi8KKwlzZWFyY2hfaGVhZCA9IHByZXZfcnN2OworCWdvdG8gcmV0cnk7CisKK2ZvdW5kX3Jzdl93aW5kb3c6CisJLyoKKwkgKiBncmVhdCEgdGhlIHJlc2VydmFibGUgc3BhY2UgY29udGFpbnMgc29tZSBmcmVlIGJsb2Nrcy4KKwkgKiBpZiB0aGUgc2VhcmNoIHJldHVybnMgdGhhdCB3ZSBzaG91bGQgYWRkIHRoZSBuZXcKKwkgKiB3aW5kb3cganVzdCBuZXh0IHRvIHdoZXJlIHRoZSBvbGQgd2luZG93LCB3ZSBkb24ndAorIAkgKiBuZWVkIHRvIHJlbW92ZSB0aGUgb2xkIHdpbmRvdyBmaXJzdCB0aGVuIGFkZCBpdCB0byB0aGUKKwkgKiBzYW1lIHBsYWNlLCBqdXN0IHVwZGF0ZSB0aGUgbmV3IHN0YXJ0IGFuZCBuZXcgZW5kLgorCSAqLworCWlmIChteV9yc3YgIT0gcHJldl9yc3YpICB7CisJCWlmICghcnN2X2lzX2VtcHR5KCZteV9yc3YtPnJzdl93aW5kb3cpKQorCQkJcnN2X3dpbmRvd19yZW1vdmUoc2IsIG15X3Jzdik7CisJfQorCW15X3Jzdi0+cnN2X3N0YXJ0ID0gcmVzZXJ2YWJsZV9zcGFjZV9zdGFydDsKKwlteV9yc3YtPnJzdl9lbmQgPSBteV9yc3YtPnJzdl9zdGFydCArIHNpemUgLSAxOworCW15X3Jzdi0+cnN2X2FsbG9jX2hpdCA9IDA7CisJaWYgKG15X3JzdiAhPSBwcmV2X3JzdikgIHsKKwkJZXh0M19yc3Zfd2luZG93X2FkZChzYiwgbXlfcnN2KTsKKwl9CisJcmV0dXJuIDA7CQkvKiBzdWNjZWVkICovCitmYWlsZWQ6CisJLyoKKwkgKiBmYWlsZWQgdG8gZmluZCBhIG5ldyByZXNlcnZhdGlvbiB3aW5kb3cgaW4gdGhlIGN1cnJlbnQKKwkgKiBncm91cCwgcmVtb3ZlIHRoZSBjdXJyZW50KHN0YWxlKSByZXNlcnZhdGlvbiB3aW5kb3cKKwkgKiBpZiB0aGVyZSBpcyBhbnkKKwkgKi8KKwlpZiAoIXJzdl9pc19lbXB0eSgmbXlfcnN2LT5yc3Zfd2luZG93KSkKKwkJcnN2X3dpbmRvd19yZW1vdmUoc2IsIG15X3Jzdik7CisJcmV0dXJuIC0xOwkJLyogZmFpbGVkICovCit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBtYWluIGZ1bmN0aW9uIHVzZWQgdG8gYWxsb2NhdGUgYSBuZXcgYmxvY2sgYW5kIGl0cyByZXNlcnZhdGlvbgorICogd2luZG93LgorICoKKyAqIEVhY2ggdGltZSB3aGVuIGEgbmV3IGJsb2NrIGFsbG9jYXRpb24gaXMgbmVlZCwgZmlyc3QgdHJ5IHRvIGFsbG9jYXRlIGZyb20KKyAqIGl0cyBvd24gcmVzZXJ2YXRpb24uICBJZiBpdCBkb2VzIG5vdCBoYXZlIGEgcmVzZXJ2YXRpb24gd2luZG93LCBpbnN0ZWFkIG9mCisgKiBsb29raW5nIGZvciBhIGZyZWUgYml0IG9uIGJpdG1hcCBmaXJzdCwgdGhlbiBsb29rIHVwIHRoZSByZXNlcnZhdGlvbiBsaXN0IHRvCisgKiBzZWUgaWYgaXQgaXMgaW5zaWRlIHNvbWVib2R5IGVsc2UncyByZXNlcnZhdGlvbiB3aW5kb3csIHdlIHRyeSB0byBhbGxvY2F0ZSBhCisgKiByZXNlcnZhdGlvbiB3aW5kb3cgZm9yIGl0IHN0YXJ0aW5nIGZyb20gdGhlIGdvYWwgZmlyc3QuIFRoZW4gZG8gdGhlIGJsb2NrCisgKiBhbGxvY2F0aW9uIHdpdGhpbiB0aGUgcmVzZXJ2YXRpb24gd2luZG93LgorICoKKyAqIFRoaXMgd2lsbCBhdm9pZCBrZWVwaW5nIG9uIHNlYXJjaGluZyB0aGUgcmVzZXJ2YXRpb24gbGlzdCBhZ2FpbiBhbmQKKyAqIGFnYWluIHdoZW4gc29tZWJvZGF5IGlzIGxvb2tpbmcgZm9yIGEgZnJlZSBibG9jayAod2l0aG91dAorICogcmVzZXJ2YXRpb24pLCBhbmQgdGhlcmUgYXJlIGxvdHMgb2YgZnJlZSBibG9ja3MsIGJ1dCB0aGV5IGFyZSBhbGwKKyAqIGJlaW5nIHJlc2VydmVkLgorICoKKyAqIFdlIHVzZSBhIHNvcnRlZCBkb3VibGUgbGlua2VkIGxpc3QgZm9yIHRoZSBwZXItZmlsZXN5c3RlbSByZXNlcnZhdGlvbiBsaXN0LgorICogVGhlIGluc2VydCwgcmVtb3ZlIGFuZCBmaW5kIGEgZnJlZSBzcGFjZShub24tcmVzZXJ2ZWQpIG9wZXJhdGlvbnMgZm9yIHRoZQorICogc29ydGVkIGRvdWJsZSBsaW5rZWQgbGlzdCBzaG91bGQgYmUgZmFzdC4KKyAqCisgKi8KK3N0YXRpYyBpbnQKK2V4dDNfdHJ5X3RvX2FsbG9jYXRlX3dpdGhfcnN2KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGhhbmRsZV90ICpoYW5kbGUsCisJCQl1bnNpZ25lZCBpbnQgZ3JvdXAsIHN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoLAorCQkJaW50IGdvYWwsIHN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUgKiBteV9yc3YsCisJCQlpbnQgKmVycnApCit7CisJc3BpbmxvY2tfdCAqcnN2X2xvY2s7CisJdW5zaWduZWQgbG9uZyBncm91cF9maXJzdF9ibG9jazsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgZmF0YWw7CisKKwkqZXJycCA9IDA7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB3ZSB1c2UgdW5kbyBhY2Nlc3MgZm9yIHRoZSBiaXRtYXAsIGJlY2F1c2UgaXQgaXMgY3JpdGljYWwKKwkgKiB0aGF0IHdlIGRvIHRoZSBmcm96ZW5fZGF0YSBDT1cgb24gYml0bWFwIGJ1ZmZlcnMgaW4gYWxsIGNhc2VzIGV2ZW4KKwkgKiBpZiB0aGUgYnVmZmVyIGlzIGluIEJKX0ZvcmdldCBzdGF0ZSBpbiB0aGUgY29tbWl0dGluZyB0cmFuc2FjdGlvbi4KKwkgKi8KKwlCVUZGRVJfVFJBQ0UoYml0bWFwX2JoLCAiZ2V0IHVuZG8gYWNjZXNzIGZvciBuZXcgYmxvY2siKTsKKwlmYXRhbCA9IGV4dDNfam91cm5hbF9nZXRfdW5kb19hY2Nlc3MoaGFuZGxlLCBiaXRtYXBfYmgpOworCWlmIChmYXRhbCkgeworCQkqZXJycCA9IGZhdGFsOworCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiB3ZSBkb24ndCBkZWFsIHdpdGggcmVzZXJ2YXRpb24gd2hlbgorCSAqIGZpbGVzeXN0ZW0gaXMgbW91bnRlZCB3aXRob3V0IHJlc2VydmF0aW9uCisJICogb3IgdGhlIGZpbGUgaXMgbm90IGEgcmVndWxhciBmaWxlCisJICogb3IgbGFzdCBhdHRlbXB0IHRvIGFsbG9jYXRlIGEgYmxvY2sgd2l0aCByZXNlcnZhdGlvbiB0dXJuZWQgb24gZmFpbGVkCisJICovCisJaWYgKG15X3JzdiA9PSBOVUxMICkgeworCQlyZXQgPSBleHQzX3RyeV90b19hbGxvY2F0ZShzYiwgaGFuZGxlLCBncm91cCwgYml0bWFwX2JoLCBnb2FsLCBOVUxMKTsKKwkJZ290byBvdXQ7CisJfQorCXJzdl9sb2NrID0gJkVYVDNfU0Ioc2IpLT5zX3Jzdl93aW5kb3dfbG9jazsKKwkvKgorCSAqIGdvYWwgaXMgYSBncm91cCByZWxhdGl2ZSBibG9jayBudW1iZXIgKGlmIHRoZXJlIGlzIGEgZ29hbCkKKwkgKiAwIDwgZ29hbCA8IEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYikKKwkgKiBmaXJzdCBibG9jayBpcyBhIGZpbGVzeXN0ZW0gd2lkZSBibG9jayBudW1iZXIKKwkgKiBmaXJzdCBibG9jayBpcyB0aGUgYmxvY2sgbnVtYmVyIG9mIHRoZSBmaXJzdCBibG9jayBpbiB0aGlzIGdyb3VwCisJICovCisJZ3JvdXBfZmlyc3RfYmxvY2sgPSBsZTMyX3RvX2NwdShFWFQzX1NCKHNiKS0+c19lcy0+c19maXJzdF9kYXRhX2Jsb2NrKSArCisJCQlncm91cCAqIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYik7CisKKwkvKgorCSAqIEJhc2ljYWxseSB3ZSB3aWxsIGFsbG9jYXRlIGEgbmV3IGJsb2NrIGZyb20gaW5vZGUncyByZXNlcnZhdGlvbgorCSAqIHdpbmRvdy4KKwkgKgorCSAqIFdlIG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgcmVzZXJ2YXRpb24gd2luZG93LCBpZjoKKwkgKiBhKSBpbm9kZSBkb2VzIG5vdCBoYXZlIGEgcmVzZXJ2YXRpb24gd2luZG93OyBvcgorCSAqIGIpIGxhc3QgYXR0ZW1wdCB0byBhbGxvY2F0ZSBhIGJsb2NrIGZyb20gZXhpc3RpbmcgcmVzZXJ2YXRpb24KKwkgKiAgICBmYWlsZWQ7IG9yCisJICogYykgd2UgY29tZSBoZXJlIHdpdGggYSBnb2FsIGFuZCB3aXRoIGEgcmVzZXJ2YXRpb24gd2luZG93CisJICoKKwkgKiBXZSBkbyBub3QgbmVlZCB0byBhbGxvY2F0ZSBhIG5ldyByZXNlcnZhdGlvbiB3aW5kb3cgaWYgd2UgY29tZSBoZXJlCisJICogYXQgdGhlIGJlZ2lubmluZyB3aXRoIGEgZ29hbCBhbmQgdGhlIGdvYWwgaXMgaW5zaWRlIHRoZSB3aW5kb3csIG9yCisJICogd2UgZG9uJ3QgaGF2ZSBhIGdvYWwgYnV0IGFscmVhZHkgaGF2ZSBhIHJlc2VydmF0aW9uIHdpbmRvdy4KKwkgKiB0aGVuIHdlIGNvdWxkIGdvIHRvIGFsbG9jYXRlIGZyb20gdGhlIHJlc2VydmF0aW9uIHdpbmRvdyBkaXJlY3RseS4KKwkgKi8KKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgZXh0M19yZXNlcnZlX3dpbmRvdyByc3ZfY29weTsKKworCQlyc3ZfY29weS5fcnN2X3N0YXJ0ID0gbXlfcnN2LT5yc3Zfc3RhcnQ7CisJCXJzdl9jb3B5Ll9yc3ZfZW5kID0gbXlfcnN2LT5yc3ZfZW5kOworCisJCWlmIChyc3ZfaXNfZW1wdHkoJnJzdl9jb3B5KSB8fCAocmV0IDwgMCkgfHwKKwkJCSFnb2FsX2luX215X3Jlc2VydmF0aW9uKCZyc3ZfY29weSwgZ29hbCwgZ3JvdXAsIHNiKSkgeworCQkJc3Bpbl9sb2NrKHJzdl9sb2NrKTsKKwkJCXJldCA9IGFsbG9jX25ld19yZXNlcnZhdGlvbihteV9yc3YsIGdvYWwsIHNiLAorCQkJCQkJCWdyb3VwLCBiaXRtYXBfYmgpOworCQkJcnN2X2NvcHkuX3Jzdl9zdGFydCA9IG15X3Jzdi0+cnN2X3N0YXJ0OworCQkJcnN2X2NvcHkuX3Jzdl9lbmQgPSBteV9yc3YtPnJzdl9lbmQ7CisJCQlzcGluX3VubG9jayhyc3ZfbG9jayk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlicmVhazsJCQkvKiBmYWlsZWQgKi8KKworCQkJaWYgKCFnb2FsX2luX215X3Jlc2VydmF0aW9uKCZyc3ZfY29weSwgZ29hbCwgZ3JvdXAsIHNiKSkKKwkJCQlnb2FsID0gLTE7CisJCX0KKwkJaWYgKChyc3ZfY29weS5fcnN2X3N0YXJ0ID49IGdyb3VwX2ZpcnN0X2Jsb2NrICsgRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKSkKKwkJICAgIHx8IChyc3ZfY29weS5fcnN2X2VuZCA8IGdyb3VwX2ZpcnN0X2Jsb2NrKSkKKwkJCUJVRygpOworCQlyZXQgPSBleHQzX3RyeV90b19hbGxvY2F0ZShzYiwgaGFuZGxlLCBncm91cCwgYml0bWFwX2JoLCBnb2FsLAorCQkJCQkgICAmcnN2X2NvcHkpOworCQlpZiAocmV0ID49IDApIHsKKwkJCW15X3Jzdi0+cnN2X2FsbG9jX2hpdCsrOworCQkJYnJlYWs7CQkJCS8qIHN1Y2NlZWQgKi8KKwkJfQorCX0KK291dDoKKwlpZiAocmV0ID49IDApIHsKKwkJQlVGRkVSX1RSQUNFKGJpdG1hcF9iaCwgImpvdXJuYWxfZGlydHlfbWV0YWRhdGEgZm9yICIKKwkJCQkJImJpdG1hcCBibG9jayIpOworCQlmYXRhbCA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJpdG1hcF9iaCk7CisJCWlmIChmYXRhbCkgeworCQkJKmVycnAgPSBmYXRhbDsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlyZXR1cm4gcmV0OworCX0KKworCUJVRkZFUl9UUkFDRShiaXRtYXBfYmgsICJqb3VybmFsX3JlbGVhc2VfYnVmZmVyIik7CisJZXh0M19qb3VybmFsX3JlbGVhc2VfYnVmZmVyKGhhbmRsZSwgYml0bWFwX2JoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGV4dDNfaGFzX2ZyZWVfYmxvY2tzKHN0cnVjdCBleHQzX3NiX2luZm8gKnNiaSkKK3sKKwlpbnQgZnJlZV9ibG9ja3MsIHJvb3RfYmxvY2tzOworCisJZnJlZV9ibG9ja3MgPSBwZXJjcHVfY291bnRlcl9yZWFkX3Bvc2l0aXZlKCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyKTsKKwlyb290X2Jsb2NrcyA9IGxlMzJfdG9fY3B1KHNiaS0+c19lcy0+c19yX2Jsb2Nrc19jb3VudCk7CisJaWYgKGZyZWVfYmxvY2tzIDwgcm9vdF9ibG9ja3MgKyAxICYmICFjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpICYmCisJCXNiaS0+c19yZXN1aWQgIT0gY3VycmVudC0+ZnN1aWQgJiYKKwkJKHNiaS0+c19yZXNnaWQgPT0gMCB8fCAhaW5fZ3JvdXBfcCAoc2JpLT5zX3Jlc2dpZCkpKSB7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIGV4dDNfc2hvdWxkX3JldHJ5X2FsbG9jKCkgaXMgY2FsbGVkIHdoZW4gRU5PU1BDIGlzIHJldHVybmVkLCBhbmQgaWYKKyAqIGl0IGlzIHByb2ZpdGFibGUgdG8gcmV0cnkgdGhlIG9wZXJhdGlvbiwgdGhpcyBmdW5jdGlvbiB3aWxsIHdhaXQKKyAqIGZvciB0aGUgY3VycmVudCBvciBjb21taXRpbmcgdHJhbnNhY3Rpb24gdG8gY29tcGxldGUsIGFuZCB0aGVuCisgKiByZXR1cm4gVFJVRS4KKyAqLworaW50IGV4dDNfc2hvdWxkX3JldHJ5X2FsbG9jKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqcmV0cmllcykKK3sKKwlpZiAoIWV4dDNfaGFzX2ZyZWVfYmxvY2tzKEVYVDNfU0Ioc2IpKSB8fCAoKnJldHJpZXMpKysgPiAzKQorCQlyZXR1cm4gMDsKKworCWpiZF9kZWJ1ZygxLCAiJXM6IHJldHJ5aW5nIG9wZXJhdGlvbiBhZnRlciBFTk9TUENcbiIsIHNiLT5zX2lkKTsKKworCXJldHVybiBqb3VybmFsX2ZvcmNlX2NvbW1pdF9uZXN0ZWQoRVhUM19TQihzYiktPnNfam91cm5hbCk7Cit9CisKKy8qCisgKiBleHQzX25ld19ibG9jayB1c2VzIGEgZ29hbCBibG9jayB0byBhc3Npc3QgYWxsb2NhdGlvbi4gIElmIHRoZSBnb2FsIGlzCisgKiBmcmVlLCBvciB0aGVyZSBpcyBhIGZyZWUgYmxvY2sgd2l0aGluIDMyIGJsb2NrcyBvZiB0aGUgZ29hbCwgdGhhdCBibG9jaworICogaXMgYWxsb2NhdGVkLiAgT3RoZXJ3aXNlIGEgZm9yd2FyZCBzZWFyY2ggaXMgbWFkZSBmb3IgYSBmcmVlIGJsb2NrOyB3aXRoaW4gCisgKiBlYWNoIGJsb2NrIGdyb3VwIHRoZSBzZWFyY2ggZmlyc3QgbG9va3MgZm9yIGFuIGVudGlyZSBmcmVlIGJ5dGUgaW4gdGhlIGJsb2NrCisgKiBiaXRtYXAsIGFuZCB0aGVuIGZvciBhbnkgZnJlZSBiaXQgaWYgdGhhdCBmYWlscy4KKyAqIFRoaXMgZnVuY3Rpb24gYWxzbyB1cGRhdGVzIHF1b3RhIGFuZCBpX2Jsb2NrcyBmaWVsZC4KKyAqLworaW50IGV4dDNfbmV3X2Jsb2NrKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQl1bnNpZ25lZCBsb25nIGdvYWwsIGludCAqZXJycCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpdG1hcF9iaCA9IE5VTEw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpnZHBfYmg7CisJaW50IGdyb3VwX25vOworCWludCBnb2FsX2dyb3VwOworCWludCByZXRfYmxvY2s7CisJaW50IGJnaTsJCQkvKiBibG9ja2dyb3VwIGl0ZXJhdGlvbiBpbmRleCAqLworCWludCB0YXJnZXRfYmxvY2s7CisJaW50IGZhdGFsID0gMCwgZXJyOworCWludCBwZXJmb3JtZWRfYWxsb2NhdGlvbiA9IDA7CisJaW50IGZyZWVfYmxvY2tzOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJc3RydWN0IGV4dDNfZ3JvdXBfZGVzYyAqZ2RwOworCXN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICplczsKKwlzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmk7CisJc3RydWN0IGV4dDNfcmVzZXJ2ZV93aW5kb3dfbm9kZSAqbXlfcnN2ID0gTlVMTDsKKwlzdHJ1Y3QgZXh0M19ibG9ja19hbGxvY19pbmZvICpibG9ja19pOworCXVuc2lnbmVkIHNob3J0IHdpbmRvd3N6ID0gMDsKKyNpZmRlZiBFWFQzRlNfREVCVUcKKwlzdGF0aWMgaW50IGdvYWxfaGl0cywgZ29hbF9hdHRlbXB0czsKKyNlbmRpZgorCXVuc2lnbmVkIGxvbmcgbmdyb3VwczsKKworCSplcnJwID0gLUVOT1NQQzsKKwlzYiA9IGlub2RlLT5pX3NiOworCWlmICghc2IpIHsKKwkJcHJpbnRrKCJleHQzX25ld19ibG9jazogbm9uZXhpc3RlbnQgZGV2aWNlIik7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogQ2hlY2sgcXVvdGEgZm9yIGFsbG9jYXRpb24gb2YgdGhpcyBibG9jay4KKwkgKi8KKwlpZiAoRFFVT1RfQUxMT0NfQkxPQ0soaW5vZGUsIDEpKSB7CisJCSplcnJwID0gLUVEUVVPVDsKKwkJcmV0dXJuIDA7CisJfQorCisJc2JpID0gRVhUM19TQihzYik7CisJZXMgPSBFWFQzX1NCKHNiKS0+c19lczsKKwlleHQzX2RlYnVnKCJnb2FsPSVsdS5cbiIsIGdvYWwpOworCS8qCisJICogQWxsb2NhdGUgYSBibG9jayBmcm9tIHJlc2VydmF0aW9uIG9ubHkgd2hlbgorCSAqIGZpbGVzeXN0ZW0gaXMgbW91bnRlZCB3aXRoIHJlc2VydmF0aW9uKGRlZmF1bHQsLW8gcmVzZXJ2YXRpb24pLCBhbmQKKwkgKiBpdCdzIGEgcmVndWxhciBmaWxlLCBhbmQKKwkgKiB0aGUgZGVzaXJlZCB3aW5kb3cgc2l6ZSBpcyBncmVhdGVyIHRoYW4gMCAoT25lIGNvdWxkIHVzZSBpb2N0bAorCSAqIGNvbW1hbmQgRVhUM19JT0NfU0VUUlNWU1ogdG8gc2V0IHRoZSB3aW5kb3cgc2l6ZSB0byAwIHRvIHR1cm4gb2ZmCisJICogcmVzZXJ2YXRpb24gb24gdGhhdCBwYXJ0aWN1bGFyIGZpbGUpCisJICovCisJYmxvY2tfaSA9IEVYVDNfSShpbm9kZSktPmlfYmxvY2tfYWxsb2NfaW5mbzsKKwlpZiAoYmxvY2tfaSAmJiAoKHdpbmRvd3N6ID0gYmxvY2tfaS0+cnN2X3dpbmRvd19ub2RlLnJzdl9nb2FsX3NpemUpID4gMCkpCisJCW15X3JzdiA9ICZibG9ja19pLT5yc3Zfd2luZG93X25vZGU7CisKKwlpZiAoIWV4dDNfaGFzX2ZyZWVfYmxvY2tzKHNiaSkpIHsKKwkJKmVycnAgPSAtRU5PU1BDOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIEZpcnN0LCB0ZXN0IHdoZXRoZXIgdGhlIGdvYWwgYmxvY2sgaXMgZnJlZS4KKwkgKi8KKwlpZiAoZ29hbCA8IGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2RhdGFfYmxvY2spIHx8CisJICAgIGdvYWwgPj0gbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KSkKKwkJZ29hbCA9IGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2RhdGFfYmxvY2spOworCWdyb3VwX25vID0gKGdvYWwgLSBsZTMyX3RvX2NwdShlcy0+c19maXJzdF9kYXRhX2Jsb2NrKSkgLworCQkJRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKTsKKwlnZHAgPSBleHQzX2dldF9ncm91cF9kZXNjKHNiLCBncm91cF9ubywgJmdkcF9iaCk7CisJaWYgKCFnZHApCisJCWdvdG8gaW9fZXJyb3I7CisKKwlnb2FsX2dyb3VwID0gZ3JvdXBfbm87CityZXRyeToKKwlmcmVlX2Jsb2NrcyA9IGxlMTZfdG9fY3B1KGdkcC0+YmdfZnJlZV9ibG9ja3NfY291bnQpOworCS8qCisJICogaWYgdGhlcmUgaXMgbm90IGVub3VnaCBmcmVlIGJsb2NrcyB0byBtYWtlIGEgbmV3IHJlc2V2YXRpb24KKwkgKiB0dXJuIG9mZiByZXNlcnZhdGlvbiBmb3IgdGhpcyBhbGxvY2F0aW9uCisJICovCisJaWYgKG15X3JzdiAmJiAoZnJlZV9ibG9ja3MgPCB3aW5kb3dzeikKKwkJJiYgKHJzdl9pc19lbXB0eSgmbXlfcnN2LT5yc3Zfd2luZG93KSkpCisJCW15X3JzdiA9IE5VTEw7CisKKwlpZiAoZnJlZV9ibG9ja3MgPiAwKSB7CisJCXJldF9ibG9jayA9ICgoZ29hbCAtIGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2RhdGFfYmxvY2spKSAlCisJCQkJRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKSk7CisJCWJpdG1hcF9iaCA9IHJlYWRfYmxvY2tfYml0bWFwKHNiLCBncm91cF9ubyk7CisJCWlmICghYml0bWFwX2JoKQorCQkJZ290byBpb19lcnJvcjsKKwkJcmV0X2Jsb2NrID0gZXh0M190cnlfdG9fYWxsb2NhdGVfd2l0aF9yc3Yoc2IsIGhhbmRsZSwgZ3JvdXBfbm8sCisJCQkJCWJpdG1hcF9iaCwgcmV0X2Jsb2NrLCBteV9yc3YsICZmYXRhbCk7CisJCWlmIChmYXRhbCkKKwkJCWdvdG8gb3V0OworCQlpZiAocmV0X2Jsb2NrID49IDApCisJCQlnb3RvIGFsbG9jYXRlZDsKKwl9CisKKwluZ3JvdXBzID0gRVhUM19TQihzYiktPnNfZ3JvdXBzX2NvdW50OworCXNtcF9ybWIoKTsKKworCS8qCisJICogTm93IHNlYXJjaCB0aGUgcmVzdCBvZiB0aGUgZ3JvdXBzLiAgV2UgYXNzdW1lIHRoYXQgCisJICogaSBhbmQgZ2RwIGNvcnJlY3RseSBwb2ludCB0byB0aGUgbGFzdCBncm91cCB2aXNpdGVkLgorCSAqLworCWZvciAoYmdpID0gMDsgYmdpIDwgbmdyb3VwczsgYmdpKyspIHsKKwkJZ3JvdXBfbm8rKzsKKwkJaWYgKGdyb3VwX25vID49IG5ncm91cHMpCisJCQlncm91cF9ubyA9IDA7CisJCWdkcCA9IGV4dDNfZ2V0X2dyb3VwX2Rlc2Moc2IsIGdyb3VwX25vLCAmZ2RwX2JoKTsKKwkJaWYgKCFnZHApIHsKKwkJCSplcnJwID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisJCWZyZWVfYmxvY2tzID0gbGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCk7CisJCS8qCisJCSAqIHNraXAgdGhpcyBncm91cCBpZiB0aGUgbnVtYmVyIG9mCisJCSAqIGZyZWUgYmxvY2tzIGlzIGxlc3MgdGhhbiBoYWxmIG9mIHRoZSByZXNlcnZhdGlvbgorCQkgKiB3aW5kb3cgc2l6ZS4KKwkJICovCisJCWlmIChmcmVlX2Jsb2NrcyA8PSAod2luZG93c3ovMikpCisJCQljb250aW51ZTsKKworCQlicmVsc2UoYml0bWFwX2JoKTsKKwkJYml0bWFwX2JoID0gcmVhZF9ibG9ja19iaXRtYXAoc2IsIGdyb3VwX25vKTsKKwkJaWYgKCFiaXRtYXBfYmgpCisJCQlnb3RvIGlvX2Vycm9yOworCQlyZXRfYmxvY2sgPSBleHQzX3RyeV90b19hbGxvY2F0ZV93aXRoX3JzdihzYiwgaGFuZGxlLCBncm91cF9ubywKKwkJCQkJYml0bWFwX2JoLCAtMSwgbXlfcnN2LCAmZmF0YWwpOworCQlpZiAoZmF0YWwpCisJCQlnb3RvIG91dDsKKwkJaWYgKHJldF9ibG9jayA+PSAwKSAKKwkJCWdvdG8gYWxsb2NhdGVkOworCX0KKwkvKgorCSAqIFdlIG1heSBlbmQgdXAgYSBib2d1cyBlYWxpZXIgRU5PU1BDIGVycm9yIGR1ZSB0bworCSAqIGZpbGVzeXN0ZW0gaXMgImZ1bGwiIG9mIHJlc2VydmF0aW9ucywgYnV0CisJICogdGhlcmUgbWF5YmUgaW5kZWVkIGZyZWUgYmxvY2tzIGF2YWxpYWJsZSBvbiBkaXNrCisJICogSW4gdGhpcyBjYXNlLCB3ZSBqdXN0IGZvcmdldCBhYm91dCB0aGUgcmVzZXJ2YXRpb25zCisJICoganVzdCBkbyBibG9jayBhbGxvY2F0aW9uIGFzIHdpdGhvdXQgcmVzZXJ2YXRpb25zLgorCSAqLworCWlmIChteV9yc3YpIHsKKwkJbXlfcnN2ID0gTlVMTDsKKwkJZ3JvdXBfbm8gPSBnb2FsX2dyb3VwOworCQlnb3RvIHJldHJ5OworCX0KKwkvKiBObyBzcGFjZSBsZWZ0IG9uIHRoZSBkZXZpY2UgKi8KKwkqZXJycCA9IC1FTk9TUEM7CisJZ290byBvdXQ7CisKK2FsbG9jYXRlZDoKKworCWV4dDNfZGVidWcoInVzaW5nIGJsb2NrIGdyb3VwICVkKCVkKVxuIiwKKwkJCWdyb3VwX25vLCBnZHAtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KTsKKworCUJVRkZFUl9UUkFDRShnZHBfYmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJZmF0YWwgPSBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGdkcF9iaCk7CisJaWYgKGZhdGFsKQorCQlnb3RvIG91dDsKKworCXRhcmdldF9ibG9jayA9IHJldF9ibG9jayArIGdyb3VwX25vICogRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKQorCQkJCSsgbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jayk7CisKKwlpZiAodGFyZ2V0X2Jsb2NrID09IGxlMzJfdG9fY3B1KGdkcC0+YmdfYmxvY2tfYml0bWFwKSB8fAorCSAgICB0YXJnZXRfYmxvY2sgPT0gbGUzMl90b19jcHUoZ2RwLT5iZ19pbm9kZV9iaXRtYXApIHx8CisJICAgIGluX3JhbmdlKHRhcmdldF9ibG9jaywgbGUzMl90b19jcHUoZ2RwLT5iZ19pbm9kZV90YWJsZSksCisJCSAgICAgIEVYVDNfU0Ioc2IpLT5zX2l0Yl9wZXJfZ3JvdXApKQorCQlleHQzX2Vycm9yKHNiLCAiZXh0M19uZXdfYmxvY2siLAorCQkJICAgICJBbGxvY2F0aW5nIGJsb2NrIGluIHN5c3RlbSB6b25lIC0gIgorCQkJICAgICJibG9jayA9ICV1IiwgdGFyZ2V0X2Jsb2NrKTsKKworCXBlcmZvcm1lZF9hbGxvY2F0aW9uID0gMTsKKworI2lmZGVmIENPTkZJR19KQkRfREVCVUcKKwl7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqZGVidWdfYmg7CisKKwkJLyogUmVjb3JkIGJpdG1hcCBidWZmZXIgc3RhdGUgaW4gdGhlIG5ld2x5IGFsbG9jYXRlZCBibG9jayAqLworCQlkZWJ1Z19iaCA9IHNiX2ZpbmRfZ2V0X2Jsb2NrKHNiLCB0YXJnZXRfYmxvY2spOworCQlpZiAoZGVidWdfYmgpIHsKKwkJCUJVRkZFUl9UUkFDRShkZWJ1Z19iaCwgInN0YXRlIHdoZW4gYWxsb2NhdGVkIik7CisJCQlCVUZGRVJfVFJBQ0UyKGRlYnVnX2JoLCBiaXRtYXBfYmgsICJiaXRtYXAgc3RhdGUiKTsKKwkJCWJyZWxzZShkZWJ1Z19iaCk7CisJCX0KKwl9CisJamJkX2xvY2tfYmhfc3RhdGUoYml0bWFwX2JoKTsKKwlzcGluX2xvY2soc2JfYmdsX2xvY2soc2JpLCBncm91cF9ubykpOworCWlmIChidWZmZXJfamJkKGJpdG1hcF9iaCkgJiYgYmgyamgoYml0bWFwX2JoKS0+Yl9jb21taXR0ZWRfZGF0YSkgeworCQlpZiAoZXh0M190ZXN0X2JpdChyZXRfYmxvY2ssCisJCQkJYmgyamgoYml0bWFwX2JoKS0+Yl9jb21taXR0ZWRfZGF0YSkpIHsKKwkJCXByaW50aygiJXM6IGJsb2NrIHdhcyB1bmV4cGVjdGVkbHkgc2V0IGluICIKKwkJCQkiYl9jb21taXR0ZWRfZGF0YVxuIiwgX19GVU5DVElPTl9fKTsKKwkJfQorCX0KKwlleHQzX2RlYnVnKCJmb3VuZCBiaXQgJWRcbiIsIHJldF9ibG9jayk7CisJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soc2JpLCBncm91cF9ubykpOworCWpiZF91bmxvY2tfYmhfc3RhdGUoYml0bWFwX2JoKTsKKyNlbmRpZgorCisJLyogcmV0X2Jsb2NrIHdhcyBibG9ja2dyb3VwLXJlbGF0aXZlLiAgTm93IGl0IGJlY29tZXMgZnMtcmVsYXRpdmUgKi8KKwlyZXRfYmxvY2sgPSB0YXJnZXRfYmxvY2s7CisKKwlpZiAocmV0X2Jsb2NrID49IGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCkpIHsKKwkJZXh0M19lcnJvcihzYiwgImV4dDNfbmV3X2Jsb2NrIiwKKwkJCSAgICAiYmxvY2soJWQpID49IGJsb2NrcyBjb3VudCglZCkgLSAiCisJCQkgICAgImJsb2NrX2dyb3VwID0gJWQsIGVzID09ICVwICIsIHJldF9ibG9jaywKKwkJCWxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCksIGdyb3VwX25vLCBlcyk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBhZGQgdGhlIG5ldyBidWZmZXIgdG8gYSBqb3VybmFsCisJICogbGlzdCBvZiBzb21lIGRlc2NyaXB0aW9uLiAgV2UgZG9uJ3Qga25vdyBpbiBhZHZhbmNlIHdoZXRoZXIKKwkgKiB0aGUgY2FsbGVyIHdhbnRzIHRvIHVzZSBpdCBhcyBtZXRhZGF0YSBvciBkYXRhLgorCSAqLworCWV4dDNfZGVidWcoImFsbG9jYXRpbmcgYmxvY2sgJWQuIEdvYWwgaGl0cyAlZCBvZiAlZC5cbiIsCisJCQlyZXRfYmxvY2ssIGdvYWxfaGl0cywgZ29hbF9hdHRlbXB0cyk7CisKKwlzcGluX2xvY2soc2JfYmdsX2xvY2soc2JpLCBncm91cF9ubykpOworCWdkcC0+YmdfZnJlZV9ibG9ja3NfY291bnQgPQorCQkJY3B1X3RvX2xlMTYobGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCkgLSAxKTsKKwlzcGluX3VubG9jayhzYl9iZ2xfbG9jayhzYmksIGdyb3VwX25vKSk7CisJcGVyY3B1X2NvdW50ZXJfbW9kKCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyLCAtMSk7CisKKwlCVUZGRVJfVFJBQ0UoZ2RwX2JoLCAiam91cm5hbF9kaXJ0eV9tZXRhZGF0YSBmb3IgZ3JvdXAgZGVzY3JpcHRvciIpOworCWVyciA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGdkcF9iaCk7CisJaWYgKCFmYXRhbCkKKwkJZmF0YWwgPSBlcnI7CisKKwlzYi0+c19kaXJ0ID0gMTsKKwlpZiAoZmF0YWwpCisJCWdvdG8gb3V0OworCisJKmVycnAgPSAwOworCWJyZWxzZShiaXRtYXBfYmgpOworCXJldHVybiByZXRfYmxvY2s7CisKK2lvX2Vycm9yOgorCSplcnJwID0gLUVJTzsKK291dDoKKwlpZiAoZmF0YWwpIHsKKwkJKmVycnAgPSBmYXRhbDsKKwkJZXh0M19zdGRfZXJyb3Ioc2IsIGZhdGFsKTsKKwl9CisJLyoKKwkgKiBVbmRvIHRoZSBibG9jayBhbGxvY2F0aW9uCisJICovCisJaWYgKCFwZXJmb3JtZWRfYWxsb2NhdGlvbikKKwkJRFFVT1RfRlJFRV9CTE9DSyhpbm9kZSwgMSk7CisJYnJlbHNlKGJpdG1hcF9iaCk7CisJcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGxvbmcgZXh0M19jb3VudF9mcmVlX2Jsb2NrcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXVuc2lnbmVkIGxvbmcgZGVzY19jb3VudDsKKwlzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICpnZHA7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBuZ3JvdXBzOworI2lmZGVmIEVYVDNGU19ERUJVRworCXN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICplczsKKwl1bnNpZ25lZCBsb25nIGJpdG1hcF9jb3VudCwgeDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpdG1hcF9iaCA9IE5VTEw7CisKKwlsb2NrX3N1cGVyKHNiKTsKKwllcyA9IEVYVDNfU0Ioc2IpLT5zX2VzOworCWRlc2NfY291bnQgPSAwOworCWJpdG1hcF9jb3VudCA9IDA7CisJZ2RwID0gTlVMTDsKKwlmb3IgKGkgPSAwOyBpIDwgRVhUM19TQihzYiktPnNfZ3JvdXBzX2NvdW50OyBpKyspIHsKKwkJZ2RwID0gZXh0M19nZXRfZ3JvdXBfZGVzYyhzYiwgaSwgTlVMTCk7CisJCWlmICghZ2RwKQorCQkJY29udGludWU7CisJCWRlc2NfY291bnQgKz0gbGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCk7CisJCWJyZWxzZShiaXRtYXBfYmgpOworCQliaXRtYXBfYmggPSByZWFkX2Jsb2NrX2JpdG1hcChzYiwgaSk7CisJCWlmIChiaXRtYXBfYmggPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCXggPSBleHQzX2NvdW50X2ZyZWUoYml0bWFwX2JoLCBzYi0+c19ibG9ja3NpemUpOworCQlwcmludGsoImdyb3VwICVkOiBzdG9yZWQgPSAlZCwgY291bnRlZCA9ICVsdVxuIiwKKwkJCWksIGxlMTZfdG9fY3B1KGdkcC0+YmdfZnJlZV9ibG9ja3NfY291bnQpLCB4KTsKKwkJYml0bWFwX2NvdW50ICs9IHg7CisJfQorCWJyZWxzZShiaXRtYXBfYmgpOworCXByaW50aygiZXh0M19jb3VudF9mcmVlX2Jsb2Nrczogc3RvcmVkID0gJXUsIGNvbXB1dGVkID0gJWx1LCAlbHVcbiIsCisJICAgICAgIGxlMzJfdG9fY3B1KGVzLT5zX2ZyZWVfYmxvY2tzX2NvdW50KSwgZGVzY19jb3VudCwgYml0bWFwX2NvdW50KTsKKwl1bmxvY2tfc3VwZXIoc2IpOworCXJldHVybiBiaXRtYXBfY291bnQ7CisjZWxzZQorCWRlc2NfY291bnQgPSAwOworCW5ncm91cHMgPSBFWFQzX1NCKHNiKS0+c19ncm91cHNfY291bnQ7CisJc21wX3JtYigpOworCWZvciAoaSA9IDA7IGkgPCBuZ3JvdXBzOyBpKyspIHsKKwkJZ2RwID0gZXh0M19nZXRfZ3JvdXBfZGVzYyhzYiwgaSwgTlVMTCk7CisJCWlmICghZ2RwKQorCQkJY29udGludWU7CisJCWRlc2NfY291bnQgKz0gbGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCk7CisJfQorCisJcmV0dXJuIGRlc2NfY291bnQ7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSBpbnQKK2Jsb2NrX2luX3VzZSh1bnNpZ25lZCBsb25nIGJsb2NrLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBjaGFyICptYXApCit7CisJcmV0dXJuIGV4dDNfdGVzdF9iaXQgKChibG9jayAtCisJCWxlMzJfdG9fY3B1KEVYVDNfU0Ioc2IpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spKSAlCisJCQkgRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKSwgbWFwKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGVzdF9yb290KGludCBhLCBpbnQgYikKK3sKKwlpbnQgbnVtID0gYjsKKworCXdoaWxlIChhID4gbnVtKQorCQludW0gKj0gYjsKKwlyZXR1cm4gbnVtID09IGE7Cit9CisKK3N0YXRpYyBpbnQgZXh0M19ncm91cF9zcGFyc2UoaW50IGdyb3VwKQoreworCWlmIChncm91cCA8PSAxKQorCQlyZXR1cm4gMTsKKwlpZiAoIShncm91cCAmIDEpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gKHRlc3Rfcm9vdChncm91cCwgNykgfHwgdGVzdF9yb290KGdyb3VwLCA1KSB8fAorCQl0ZXN0X3Jvb3QoZ3JvdXAsIDMpKTsKK30KKworLyoqCisgKglleHQzX2JnX2hhc19zdXBlciAtIG51bWJlciBvZiBibG9ja3MgdXNlZCBieSB0aGUgc3VwZXJibG9jayBpbiBncm91cAorICoJQHNiOiBzdXBlcmJsb2NrIGZvciBmaWxlc3lzdGVtCisgKglAZ3JvdXA6IGdyb3VwIG51bWJlciB0byBjaGVjaworICoKKyAqCVJldHVybiB0aGUgbnVtYmVyIG9mIGJsb2NrcyB1c2VkIGJ5IHRoZSBzdXBlcmJsb2NrIChwcmltYXJ5IG9yIGJhY2t1cCkKKyAqCWluIHRoaXMgZ3JvdXAuICBDdXJyZW50bHkgdGhpcyB3aWxsIGJlIG9ubHkgMCBvciAxLgorICovCitpbnQgZXh0M19iZ19oYXNfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGdyb3VwKQoreworCWlmIChFWFQzX0hBU19ST19DT01QQVRfRkVBVFVSRShzYixFWFQzX0ZFQVRVUkVfUk9fQ09NUEFUX1NQQVJTRV9TVVBFUikmJgorCSAgICAhZXh0M19ncm91cF9zcGFyc2UoZ3JvdXApKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKglleHQzX2JnX251bV9nZGIgLSBudW1iZXIgb2YgYmxvY2tzIHVzZWQgYnkgdGhlIGdyb3VwIHRhYmxlIGluIGdyb3VwCisgKglAc2I6IHN1cGVyYmxvY2sgZm9yIGZpbGVzeXN0ZW0KKyAqCUBncm91cDogZ3JvdXAgbnVtYmVyIHRvIGNoZWNrCisgKgorICoJUmV0dXJuIHRoZSBudW1iZXIgb2YgYmxvY2tzIHVzZWQgYnkgdGhlIGdyb3VwIGRlc2NyaXB0b3IgdGFibGUKKyAqCShwcmltYXJ5IG9yIGJhY2t1cCkgaW4gdGhpcyBncm91cC4gIEluIHRoZSBmdXR1cmUgdGhlcmUgbWF5IGJlIGEKKyAqCWRpZmZlcmVudCBudW1iZXIgb2YgZGVzY3JpcHRvciBibG9ja3MgaW4gZWFjaCBncm91cC4KKyAqLwordW5zaWduZWQgbG9uZyBleHQzX2JnX251bV9nZGIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGdyb3VwKQoreworCWlmIChFWFQzX0hBU19ST19DT01QQVRfRkVBVFVSRShzYixFWFQzX0ZFQVRVUkVfUk9fQ09NUEFUX1NQQVJTRV9TVVBFUikmJgorCSAgICAhZXh0M19ncm91cF9zcGFyc2UoZ3JvdXApKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gRVhUM19TQihzYiktPnNfZ2RiX2NvdW50OworfQorCisjaWZkZWYgQ09ORklHX0VYVDNfQ0hFQ0sKKy8qIENhbGxlZCBhdCBtb3VudC10aW1lLCBzdXBlci1ibG9jayBpcyBsb2NrZWQgKi8KK3ZvaWQgZXh0M19jaGVja19ibG9ja3NfYml0bWFwIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYikKK3sKKwlzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqZXM7CisJdW5zaWduZWQgbG9uZyBkZXNjX2NvdW50LCBiaXRtYXBfY291bnQsIHgsIGo7CisJdW5zaWduZWQgbG9uZyBkZXNjX2Jsb2NrczsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJpdG1hcF9iaCA9IE5VTEw7CisJc3RydWN0IGV4dDNfZ3JvdXBfZGVzYyAqZ2RwOworCWludCBpOworCisJZXMgPSBFWFQzX1NCKHNiKS0+c19lczsKKwlkZXNjX2NvdW50ID0gMDsKKwliaXRtYXBfY291bnQgPSAwOworCWdkcCA9IE5VTEw7CisJZm9yIChpID0gMDsgaSA8IEVYVDNfU0Ioc2IpLT5zX2dyb3Vwc19jb3VudDsgaSsrKSB7CisJCWdkcCA9IGV4dDNfZ2V0X2dyb3VwX2Rlc2MgKHNiLCBpLCBOVUxMKTsKKwkJaWYgKCFnZHApCisJCQljb250aW51ZTsKKwkJZGVzY19jb3VudCArPSBsZTE2X3RvX2NwdShnZHAtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KTsKKwkJYnJlbHNlKGJpdG1hcF9iaCk7CisJCWJpdG1hcF9iaCA9IHJlYWRfYmxvY2tfYml0bWFwKHNiLCBpKTsKKwkJaWYgKGJpdG1hcF9iaCA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJaWYgKGV4dDNfYmdfaGFzX3N1cGVyKHNiLCBpKSAmJgorCQkJCSFleHQzX3Rlc3RfYml0KDAsIGJpdG1hcF9iaC0+Yl9kYXRhKSkKKwkJCWV4dDNfZXJyb3Ioc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkgICAiU3VwZXJibG9jayBpbiBncm91cCAlZCBpcyBtYXJrZWQgZnJlZSIsIGkpOworCisJCWRlc2NfYmxvY2tzID0gZXh0M19iZ19udW1fZ2RiKHNiLCBpKTsKKwkJZm9yIChqID0gMDsgaiA8IGRlc2NfYmxvY2tzOyBqKyspCisJCQlpZiAoIWV4dDNfdGVzdF9iaXQoaiArIDEsIGJpdG1hcF9iaC0+Yl9kYXRhKSkKKwkJCQlleHQzX2Vycm9yKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkJCSAgICJEZXNjcmlwdG9yIGJsb2NrICMlbGQgaW4gZ3JvdXAgIgorCQkJCQkgICAiJWQgaXMgbWFya2VkIGZyZWUiLCBqLCBpKTsKKworCQlpZiAoIWJsb2NrX2luX3VzZSAobGUzMl90b19jcHUoZ2RwLT5iZ19ibG9ja19iaXRtYXApLAorCQkJCQkJc2IsIGJpdG1hcF9iaC0+Yl9kYXRhKSkKKwkJCWV4dDNfZXJyb3IgKHNiLCAiZXh0M19jaGVja19ibG9ja3NfYml0bWFwIiwKKwkJCQkgICAgIkJsb2NrIGJpdG1hcCBmb3IgZ3JvdXAgJWQgaXMgbWFya2VkIGZyZWUiLAorCQkJCSAgICBpKTsKKworCQlpZiAoIWJsb2NrX2luX3VzZSAobGUzMl90b19jcHUoZ2RwLT5iZ19pbm9kZV9iaXRtYXApLAorCQkJCQkJc2IsIGJpdG1hcF9iaC0+Yl9kYXRhKSkKKwkJCWV4dDNfZXJyb3IgKHNiLCAiZXh0M19jaGVja19ibG9ja3NfYml0bWFwIiwKKwkJCQkgICAgIklub2RlIGJpdG1hcCBmb3IgZ3JvdXAgJWQgaXMgbWFya2VkIGZyZWUiLAorCQkJCSAgICBpKTsKKworCQlmb3IgKGogPSAwOyBqIDwgRVhUM19TQihzYiktPnNfaXRiX3Blcl9ncm91cDsgaisrKQorCQkJaWYgKCFibG9ja19pbl91c2UgKGxlMzJfdG9fY3B1KGdkcC0+YmdfaW5vZGVfdGFibGUpICsgaiwKKwkJCQkJCQlzYiwgYml0bWFwX2JoLT5iX2RhdGEpKQorCQkJCWV4dDNfZXJyb3IgKHNiLCAiZXh0M19jaGVja19ibG9ja3NfYml0bWFwIiwKKwkJCQkJICAgICJCbG9jayAjJWQgb2YgdGhlIGlub2RlIHRhYmxlIGluICIKKwkJCQkJICAgICJncm91cCAlZCBpcyBtYXJrZWQgZnJlZSIsIGosIGkpOworCisJCXggPSBleHQzX2NvdW50X2ZyZWUoYml0bWFwX2JoLCBzYi0+c19ibG9ja3NpemUpOworCQlpZiAobGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCkgIT0geCkKKwkJCWV4dDNfZXJyb3IgKHNiLCAiZXh0M19jaGVja19ibG9ja3NfYml0bWFwIiwKKwkJCQkgICAgIldyb25nIGZyZWUgYmxvY2tzIGNvdW50IGZvciBncm91cCAlZCwgIgorCQkJCSAgICAic3RvcmVkID0gJWQsIGNvdW50ZWQgPSAlbHUiLCBpLAorCQkJCSAgICBsZTE2X3RvX2NwdShnZHAtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KSwgeCk7CisJCWJpdG1hcF9jb3VudCArPSB4OworCX0KKwlicmVsc2UoYml0bWFwX2JoKTsKKwlpZiAobGUzMl90b19jcHUoZXMtPnNfZnJlZV9ibG9ja3NfY291bnQpICE9IGJpdG1hcF9jb3VudCkKKwkJZXh0M19lcnJvciAoc2IsICJleHQzX2NoZWNrX2Jsb2Nrc19iaXRtYXAiLAorCQkJIldyb25nIGZyZWUgYmxvY2tzIGNvdW50IGluIHN1cGVyIGJsb2NrLCAiCisJCQkic3RvcmVkID0gJWx1LCBjb3VudGVkID0gJWx1IiwKKwkJCSh1bnNpZ25lZCBsb25nKWxlMzJfdG9fY3B1KGVzLT5zX2ZyZWVfYmxvY2tzX2NvdW50KSwKKwkJCWJpdG1hcF9jb3VudCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvYml0bWFwLmMgYi9mcy9leHQzL2JpdG1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNDE5YjkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQzL2JpdG1hcC5jCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiAgbGludXgvZnMvZXh0My9iaXRtYXAuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NQorICogUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQorICogTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqLworCisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKworCitzdGF0aWMgaW50IG5pYmJsZW1hcFtdID0gezQsIDMsIDMsIDIsIDMsIDIsIDIsIDEsIDMsIDIsIDIsIDEsIDIsIDEsIDEsIDB9OworCit1bnNpZ25lZCBsb25nIGV4dDNfY291bnRfZnJlZSAoc3RydWN0IGJ1ZmZlcl9oZWFkICogbWFwLCB1bnNpZ25lZCBpbnQgbnVtY2hhcnMpCit7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgbG9uZyBzdW0gPSAwOworCisJaWYgKCFtYXApIAorCQlyZXR1cm4gKDApOworCWZvciAoaSA9IDA7IGkgPCBudW1jaGFyczsgaSsrKQorCQlzdW0gKz0gbmliYmxlbWFwW21hcC0+Yl9kYXRhW2ldICYgMHhmXSArCisJCQluaWJibGVtYXBbKG1hcC0+Yl9kYXRhW2ldID4+IDQpICYgMHhmXTsKKwlyZXR1cm4gKHN1bSk7Cit9CmRpZmYgLS1naXQgYS9mcy9leHQzL2Rpci5jIGIvZnMvZXh0My9kaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzI4NjdhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0My9kaXIuYwpAQCAtMCwwICsxLDUxOSBAQAorLyoKKyAqICBsaW51eC9mcy9leHQzL2Rpci5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1CisgKiBSZW15IENhcmQgKGNhcmRAbWFzaS5pYnAuZnIpCisgKiBMYWJvcmF0b2lyZSBNQVNJIC0gSW5zdGl0dXQgQmxhaXNlIFBhc2NhbAorICogVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICoKKyAqICBmcm9tCisgKgorICogIGxpbnV4L2ZzL21pbml4L2Rpci5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgZXh0MyBkaXJlY3RvcnkgaGFuZGxpbmcgZnVuY3Rpb25zCisgKgorICogIEJpZy1lbmRpYW4gdG8gbGl0dGxlLWVuZGlhbiBieXRlLXN3YXBwaW5nL2JpdG1hcHMgYnkKKyAqICAgICAgICBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXAucnV0Z2Vycy5lZHUpLCAxOTk1CisgKgorICogSGFzaCBUcmVlIERpcmVjdG9yeSBpbmRleGluZyAoYykgMjAwMSAgRGFuaWVsIFBoaWxsaXBzCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2piZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3JidHJlZS5oPgorCitzdGF0aWMgdW5zaWduZWQgY2hhciBleHQzX2ZpbGV0eXBlX3RhYmxlW10gPSB7CisJRFRfVU5LTk9XTiwgRFRfUkVHLCBEVF9ESVIsIERUX0NIUiwgRFRfQkxLLCBEVF9GSUZPLCBEVF9TT0NLLCBEVF9MTksKK307CisKK3N0YXRpYyBpbnQgZXh0M19yZWFkZGlyKHN0cnVjdCBmaWxlICosIHZvaWQgKiwgZmlsbGRpcl90KTsKK3N0YXRpYyBpbnQgZXh0M19keF9yZWFkZGlyKHN0cnVjdCBmaWxlICogZmlscCwKKwkJCSAgIHZvaWQgKiBkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKTsKK3N0YXRpYyBpbnQgZXh0M19yZWxlYXNlX2RpciAoc3RydWN0IGlub2RlICogaW5vZGUsCisJCQkJc3RydWN0IGZpbGUgKiBmaWxwKTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBleHQzX2Rpcl9vcGVyYXRpb25zID0geworCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKKwkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAorCS5yZWFkZGlyCT0gZXh0M19yZWFkZGlyLAkJLyogd2UgdGFrZSBCS0wuIG5lZWRlZD8qLworCS5pb2N0bAkJPSBleHQzX2lvY3RsLAkJLyogQktMIGhlbGQgKi8KKwkuZnN5bmMJCT0gZXh0M19zeW5jX2ZpbGUsCS8qIEJLTCBoZWxkICovCisjaWZkZWYgQ09ORklHX0VYVDNfSU5ERVgKKwkucmVsZWFzZQk9IGV4dDNfcmVsZWFzZV9kaXIsCisjZW5kaWYKK307CisKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgZ2V0X2R0eXBlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBmaWxldHlwZSkKK3sKKwlpZiAoIUVYVDNfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9GSUxFVFlQRSkgfHwKKwkgICAgKGZpbGV0eXBlID49IEVYVDNfRlRfTUFYKSkKKwkJcmV0dXJuIERUX1VOS05PV047CisKKwlyZXR1cm4gKGV4dDNfZmlsZXR5cGVfdGFibGVbZmlsZXR5cGVdKTsKK30KKwkJCSAgICAgICAKKworaW50IGV4dDNfY2hlY2tfZGlyX2VudHJ5IChjb25zdCBjaGFyICogZnVuY3Rpb24sIHN0cnVjdCBpbm9kZSAqIGRpciwKKwkJCSAgc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKiBkZSwKKwkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgsCisJCQkgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCWNvbnN0IGNoYXIgKiBlcnJvcl9tc2cgPSBOVUxMOworIAljb25zdCBpbnQgcmxlbiA9IGxlMTZfdG9fY3B1KGRlLT5yZWNfbGVuKTsKKworCWlmIChybGVuIDwgRVhUM19ESVJfUkVDX0xFTigxKSkKKwkJZXJyb3JfbXNnID0gInJlY19sZW4gaXMgc21hbGxlciB0aGFuIG1pbmltYWwiOworCWVsc2UgaWYgKHJsZW4gJSA0ICE9IDApCisJCWVycm9yX21zZyA9ICJyZWNfbGVuICUgNCAhPSAwIjsKKwllbHNlIGlmIChybGVuIDwgRVhUM19ESVJfUkVDX0xFTihkZS0+bmFtZV9sZW4pKQorCQllcnJvcl9tc2cgPSAicmVjX2xlbiBpcyB0b28gc21hbGwgZm9yIG5hbWVfbGVuIjsKKwllbHNlIGlmICgoKGNoYXIgKikgZGUgLSBiaC0+Yl9kYXRhKSArIHJsZW4gPiBkaXItPmlfc2ItPnNfYmxvY2tzaXplKQorCQllcnJvcl9tc2cgPSAiZGlyZWN0b3J5IGVudHJ5IGFjcm9zcyBibG9ja3MiOworCWVsc2UgaWYgKGxlMzJfdG9fY3B1KGRlLT5pbm9kZSkgPgorCQkJbGUzMl90b19jcHUoRVhUM19TQihkaXItPmlfc2IpLT5zX2VzLT5zX2lub2Rlc19jb3VudCkpCisJCWVycm9yX21zZyA9ICJpbm9kZSBvdXQgb2YgYm91bmRzIjsKKworCWlmIChlcnJvcl9tc2cgIT0gTlVMTCkKKwkJZXh0M19lcnJvciAoZGlyLT5pX3NiLCBmdW5jdGlvbiwKKwkJCSJiYWQgZW50cnkgaW4gZGlyZWN0b3J5ICMlbHU6ICVzIC0gIgorCQkJIm9mZnNldD0lbHUsIGlub2RlPSVsdSwgcmVjX2xlbj0lZCwgbmFtZV9sZW49JWQiLAorCQkJZGlyLT5pX2lubywgZXJyb3JfbXNnLCBvZmZzZXQsCisJCQkodW5zaWduZWQgbG9uZykgbGUzMl90b19jcHUoZGUtPmlub2RlKSwKKwkJCXJsZW4sIGRlLT5uYW1lX2xlbik7CisJcmV0dXJuIGVycm9yX21zZyA9PSBOVUxMID8gMSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgZXh0M19yZWFkZGlyKHN0cnVjdCBmaWxlICogZmlscCwKKwkJCSB2b2lkICogZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwlpbnQgZXJyb3IgPSAwOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBibGs7CisJaW50IGksIG51bSwgc3RvcmVkOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoLCAqIHRtcCwgKiBiaGFbMTZdOworCXN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICogZGU7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJaW50IGVycjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJaW50IHJldCA9IDA7CisKKwlzYiA9IGlub2RlLT5pX3NiOworCisjaWZkZWYgQ09ORklHX0VYVDNfSU5ERVgKKwlpZiAoRVhUM19IQVNfQ09NUEFUX0ZFQVRVUkUoaW5vZGUtPmlfc2IsCisJCQkJICAgIEVYVDNfRkVBVFVSRV9DT01QQVRfRElSX0lOREVYKSAmJgorCSAgICAoKEVYVDNfSShpbm9kZSktPmlfZmxhZ3MgJiBFWFQzX0lOREVYX0ZMKSB8fAorCSAgICAgKChpbm9kZS0+aV9zaXplID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSA9PSAxKSkpIHsKKwkJZXJyID0gZXh0M19keF9yZWFkZGlyKGZpbHAsIGRpcmVudCwgZmlsbGRpcik7CisJCWlmIChlcnIgIT0gRVJSX0JBRF9EWF9ESVIpIHsKKwkJCXJldCA9IGVycjsKKwkJCWdvdG8gb3V0OworCQl9CisJCS8qCisJCSAqIFdlIGRvbid0IHNldCB0aGUgaW5vZGUgZGlydHkgZmxhZyBzaW5jZSBpdCdzIG5vdAorCQkgKiBjcml0aWNhbCB0aGF0IGl0IGdldCBmbHVzaGVkIGJhY2sgdG8gdGhlIGRpc2suCisJCSAqLworCQlFWFQzX0koZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpLT5pX2ZsYWdzICY9IH5FWFQzX0lOREVYX0ZMOworCX0KKyNlbmRpZgorCXN0b3JlZCA9IDA7CisJYmggPSBOVUxMOworCW9mZnNldCA9IGZpbHAtPmZfcG9zICYgKHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpOworCisJd2hpbGUgKCFlcnJvciAmJiAhc3RvcmVkICYmIGZpbHAtPmZfcG9zIDwgaW5vZGUtPmlfc2l6ZSkgeworCQlibGsgPSAoZmlscC0+Zl9wb3MpID4+IEVYVDNfQkxPQ0tfU0laRV9CSVRTKHNiKTsKKwkJYmggPSBleHQzX2JyZWFkKE5VTEwsIGlub2RlLCBibGssIDAsICZlcnIpOworCQlpZiAoIWJoKSB7CisJCQlleHQzX2Vycm9yIChzYiwgImV4dDNfcmVhZGRpciIsCisJCQkJImRpcmVjdG9yeSAjJWx1IGNvbnRhaW5zIGEgaG9sZSBhdCBvZmZzZXQgJWx1IiwKKwkJCQlpbm9kZS0+aV9pbm8sICh1bnNpZ25lZCBsb25nKWZpbHAtPmZfcG9zKTsKKwkJCWZpbHAtPmZfcG9zICs9IHNiLT5zX2Jsb2Nrc2l6ZSAtIG9mZnNldDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogRG8gdGhlIHJlYWRhaGVhZAorCQkgKi8KKwkJaWYgKCFvZmZzZXQpIHsKKwkJCWZvciAoaSA9IDE2ID4+IChFWFQzX0JMT0NLX1NJWkVfQklUUyhzYikgLSA5KSwgbnVtID0gMDsKKwkJCSAgICAgaSA+IDA7IGktLSkgeworCQkJCXRtcCA9IGV4dDNfZ2V0YmxrIChOVUxMLCBpbm9kZSwgKytibGssIDAsICZlcnIpOworCQkJCWlmICh0bXAgJiYgIWJ1ZmZlcl91cHRvZGF0ZSh0bXApICYmCisJCQkJCQkhYnVmZmVyX2xvY2tlZCh0bXApKQorCQkJCQliaGFbbnVtKytdID0gdG1wOworCQkJCWVsc2UKKwkJCQkJYnJlbHNlICh0bXApOworCQkJfQorCQkJaWYgKG51bSkgeworCQkJCWxsX3J3X2Jsb2NrIChSRUFEQSwgbnVtLCBiaGEpOworCQkJCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKKwkJCQkJYnJlbHNlIChiaGFbaV0pOworCQkJfQorCQl9CisKK3JldmFsaWRhdGU6CisJCS8qIElmIHRoZSBkaXIgYmxvY2sgaGFzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgY2FsbCB0bworCQkgKiByZWFkZGlyKDIpLCB0aGVuIHdlIG1pZ2h0IGJlIHBvaW50aW5nIHRvIGFuIGludmFsaWQKKwkJICogZGlyZW50IHJpZ2h0IG5vdy4gIFNjYW4gZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrCisJCSAqIHRvIG1ha2Ugc3VyZS4gKi8KKwkJaWYgKGZpbHAtPmZfdmVyc2lvbiAhPSBpbm9kZS0+aV92ZXJzaW9uKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgc2ItPnNfYmxvY2tzaXplICYmIGkgPCBvZmZzZXQ7ICkgeworCQkJCWRlID0gKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICopIAorCQkJCQkoYmgtPmJfZGF0YSArIGkpOworCQkJCS8qIEl0J3MgdG9vIGV4cGVuc2l2ZSB0byBkbyBhIGZ1bGwKKwkJCQkgKiBkaXJlbnQgdGVzdCBlYWNoIHRpbWUgcm91bmQgdGhpcworCQkJCSAqIGxvb3AsIGJ1dCB3ZSBkbyBoYXZlIHRvIHRlc3QgYXQKKwkJCQkgKiBsZWFzdCB0aGF0IGl0IGlzIG5vbi16ZXJvLiAgQQorCQkJCSAqIGZhaWx1cmUgd2lsbCBiZSBkZXRlY3RlZCBpbiB0aGUKKwkJCQkgKiBkaXJlbnQgdGVzdCBiZWxvdy4gKi8KKwkJCQlpZiAobGUxNl90b19jcHUoZGUtPnJlY19sZW4pIDwKKwkJCQkJCUVYVDNfRElSX1JFQ19MRU4oMSkpCisJCQkJCWJyZWFrOworCQkJCWkgKz0gbGUxNl90b19jcHUoZGUtPnJlY19sZW4pOworCQkJfQorCQkJb2Zmc2V0ID0gaTsKKwkJCWZpbHAtPmZfcG9zID0gKGZpbHAtPmZfcG9zICYgfihzYi0+c19ibG9ja3NpemUgLSAxKSkKKwkJCQl8IG9mZnNldDsKKwkJCWZpbHAtPmZfdmVyc2lvbiA9IGlub2RlLT5pX3ZlcnNpb247CisJCX0KKworCQl3aGlsZSAoIWVycm9yICYmIGZpbHAtPmZfcG9zIDwgaW5vZGUtPmlfc2l6ZSAKKwkJICAgICAgICYmIG9mZnNldCA8IHNiLT5zX2Jsb2Nrc2l6ZSkgeworCQkJZGUgPSAoc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKikgKGJoLT5iX2RhdGEgKyBvZmZzZXQpOworCQkJaWYgKCFleHQzX2NoZWNrX2Rpcl9lbnRyeSAoImV4dDNfcmVhZGRpciIsIGlub2RlLCBkZSwKKwkJCQkJCSAgIGJoLCBvZmZzZXQpKSB7CisJCQkJLyogT24gZXJyb3IsIHNraXAgdGhlIGZfcG9zIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IGJsb2NrLiAqLworCQkJCWZpbHAtPmZfcG9zID0gKGZpbHAtPmZfcG9zIHwKKwkJCQkJCShzYi0+c19ibG9ja3NpemUgLSAxKSkgKyAxOworCQkJCWJyZWxzZSAoYmgpOworCQkJCXJldCA9IHN0b3JlZDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCW9mZnNldCArPSBsZTE2X3RvX2NwdShkZS0+cmVjX2xlbik7CisJCQlpZiAobGUzMl90b19jcHUoZGUtPmlub2RlKSkgeworCQkJCS8qIFdlIG1pZ2h0IGJsb2NrIGluIHRoZSBuZXh0IHNlY3Rpb24KKwkJCQkgKiBpZiB0aGUgZGF0YSBkZXN0aW5hdGlvbiBpcworCQkJCSAqIGN1cnJlbnRseSBzd2FwcGVkIG91dC4gIFNvLCB1c2UgYQorCQkJCSAqIHZlcnNpb24gc3RhbXAgdG8gZGV0ZWN0IHdoZXRoZXIgb3IKKwkJCQkgKiBub3QgdGhlIGRpcmVjdG9yeSBoYXMgYmVlbiBtb2RpZmllZAorCQkJCSAqIGR1cmluZyB0aGUgY29weSBvcGVyYXRpb24uCisJCQkJICovCisJCQkJdW5zaWduZWQgbG9uZyB2ZXJzaW9uID0gZmlscC0+Zl92ZXJzaW9uOworCisJCQkJZXJyb3IgPSBmaWxsZGlyKGRpcmVudCwgZGUtPm5hbWUsCisJCQkJCQlkZS0+bmFtZV9sZW4sCisJCQkJCQlmaWxwLT5mX3BvcywKKwkJCQkJCWxlMzJfdG9fY3B1KGRlLT5pbm9kZSksCisJCQkJCQlnZXRfZHR5cGUoc2IsIGRlLT5maWxlX3R5cGUpKTsKKwkJCQlpZiAoZXJyb3IpCisJCQkJCWJyZWFrOworCQkJCWlmICh2ZXJzaW9uICE9IGZpbHAtPmZfdmVyc2lvbikKKwkJCQkJZ290byByZXZhbGlkYXRlOworCQkJCXN0b3JlZCArKzsKKwkJCX0KKwkJCWZpbHAtPmZfcG9zICs9IGxlMTZfdG9fY3B1KGRlLT5yZWNfbGVuKTsKKwkJfQorCQlvZmZzZXQgPSAwOworCQlicmVsc2UgKGJoKTsKKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIENPTkZJR19FWFQzX0lOREVYCisvKgorICogVGhlc2UgZnVuY3Rpb25zIGNvbnZlcnQgZnJvbSB0aGUgbWFqb3IvbWlub3IgaGFzaCB0byBhbiBmX3BvcworICogdmFsdWUuCisgKiAKKyAqIEN1cnJlbnRseSB3ZSBvbmx5IHVzZSBtYWpvciBoYXNoIG51bWVyLiAgVGhpcyBpcyB1bmZvcnR1bmF0ZSwgYnV0CisgKiBvbiAzMi1iaXQgbWFjaGluZXMsIHRoZSBzYW1lIFZGUyBpbnRlcmZhY2UgaXMgdXNlZCBmb3IgbHNlZWsgYW5kCisgKiBsbHNlZWssIHNvIGlmIHdlIHVzZSB0aGUgNjQgYml0IG9mZnNldCwgdGhlbiB0aGUgMzItYml0IHZlcnNpb25zIG9mCisgKiBsc2Vlay90ZWxsZGlyL3NlZWtkaXIgd2lsbCBibG93IG91dCBzcGVjdGFjdWxhcmx5LCBhbmQgZnJvbSB3aXRoaW4KKyAqIHRoZSBleHQyIGxvdy1sZXZlbCByb3V0aW5lLCB3ZSBkb24ndCBrbm93IGlmIHdlJ3JlIGJlaW5nIGNhbGxlZCBieQorICogYSA2NC1iaXQgdmVyc2lvbiBvZiB0aGUgc3lzdGVtIGNhbGwgb3IgdGhlIDMyLWJpdCB2ZXJzaW9uIG9mIHRoZQorICogc3lzdGVtIGNhbGwuICBXb3JzZSB5ZXQsIE5GU3YyIG9ubHkgYWxsb3dzIGZvciBhIDMyLWJpdCByZWFkZGlyCisgKiBjb29raWUuICBTaWdoLgorICovCisjZGVmaW5lIGhhc2gycG9zKG1ham9yLCBtaW5vcikJKG1ham9yID4+IDEpCisjZGVmaW5lIHBvczJtYWpfaGFzaChwb3MpCSgocG9zIDw8IDEpICYgMHhmZmZmZmZmZikKKyNkZWZpbmUgcG9zMm1pbl9oYXNoKHBvcykJKDApCisKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBob2xkcyB0aGUgbm9kZXMgb2YgdGhlIHJlZC1ibGFjayB0cmVlIHVzZWQgdG8gc3RvcmUKKyAqIHRoZSBkaXJlY3RvcnkgZW50cnkgaW4gaGFzaCBvcmRlci4KKyAqLworc3RydWN0IGZuYW1lIHsKKwlfX3UzMgkJaGFzaDsKKwlfX3UzMgkJbWlub3JfaGFzaDsKKwlzdHJ1Y3QgcmJfbm9kZQlyYl9oYXNoOyAKKwlzdHJ1Y3QgZm5hbWUJKm5leHQ7CisJX191MzIJCWlub2RlOworCV9fdTgJCW5hbWVfbGVuOworCV9fdTgJCWZpbGVfdHlwZTsKKwljaGFyCQluYW1lWzBdOworfTsKKworLyoKKyAqIFRoaXMgZnVuY3RvaW4gaW1wbGVtZW50cyBhIG5vbi1yZWN1cnNpdmUgd2F5IG9mIGZyZWVpbmcgYWxsIG9mIHRoZQorICogbm9kZXMgaW4gdGhlIHJlZC1ibGFjayB0cmVlLgorICovCitzdGF0aWMgdm9pZCBmcmVlX3JiX3RyZWVfZm5hbWUoc3RydWN0IHJiX3Jvb3QgKnJvb3QpCit7CisJc3RydWN0IHJiX25vZGUJKm4gPSByb290LT5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlCSpwYXJlbnQ7CisJc3RydWN0IGZuYW1lCSpmbmFtZTsKKworCXdoaWxlIChuKSB7CisJCS8qIERvIHRoZSBub2RlJ3MgY2hpbGRyZW4gZmlyc3QgKi8KKwkJaWYgKChuKS0+cmJfbGVmdCkgeworCQkJbiA9IG4tPnJiX2xlZnQ7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobi0+cmJfcmlnaHQpIHsKKwkJCW4gPSBuLT5yYl9yaWdodDsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qCisJCSAqIFRoZSBub2RlIGhhcyBubyBjaGlsZHJlbjsgZnJlZSBpdCwgYW5kIHRoZW4gemVybworCQkgKiBvdXQgcGFyZW50J3MgbGluayB0byBpdC4gIEZpbmFsbHkgZ28gdG8gdGhlCisJCSAqIGJlZ2lubmluZyBvZiB0aGUgbG9vcCBhbmQgdHJ5IHRvIGZyZWUgdGhlIHBhcmVudAorCQkgKiBub2RlLgorCQkgKi8KKwkJcGFyZW50ID0gbi0+cmJfcGFyZW50OworCQlmbmFtZSA9IHJiX2VudHJ5KG4sIHN0cnVjdCBmbmFtZSwgcmJfaGFzaCk7CisJCXdoaWxlIChmbmFtZSkgeworCQkJc3RydWN0IGZuYW1lICogb2xkID0gZm5hbWU7CisJCQlmbmFtZSA9IGZuYW1lLT5uZXh0OworCQkJa2ZyZWUgKG9sZCk7CisJCX0KKwkJaWYgKCFwYXJlbnQpCisJCQlyb290LT5yYl9ub2RlID0gTlVMTDsKKwkJZWxzZSBpZiAocGFyZW50LT5yYl9sZWZ0ID09IG4pCisJCQlwYXJlbnQtPnJiX2xlZnQgPSBOVUxMOworCQllbHNlIGlmIChwYXJlbnQtPnJiX3JpZ2h0ID09IG4pCisJCQlwYXJlbnQtPnJiX3JpZ2h0ID0gTlVMTDsKKwkJbiA9IHBhcmVudDsKKwl9CisJcm9vdC0+cmJfbm9kZSA9IE5VTEw7Cit9CisKKworc3RhdGljIHN0cnVjdCBkaXJfcHJpdmF0ZV9pbmZvICpjcmVhdGVfZGlyX2luZm8obG9mZl90IHBvcykKK3sKKwlzdHJ1Y3QgZGlyX3ByaXZhdGVfaW5mbyAqcDsKKworCXAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZGlyX3ByaXZhdGVfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghcCkKKwkJcmV0dXJuIE5VTEw7CisJcC0+cm9vdC5yYl9ub2RlID0gTlVMTDsKKwlwLT5jdXJyX25vZGUgPSBOVUxMOworCXAtPmV4dHJhX2ZuYW1lID0gTlVMTDsKKwlwLT5sYXN0X3BvcyA9IDA7CisJcC0+Y3Vycl9oYXNoID0gcG9zMm1hal9oYXNoKHBvcyk7CisJcC0+Y3Vycl9taW5vcl9oYXNoID0gcG9zMm1pbl9oYXNoKHBvcyk7CisJcC0+bmV4dF9oYXNoID0gMDsKKwlyZXR1cm4gcDsKK30KKwordm9pZCBleHQzX2h0cmVlX2ZyZWVfZGlyX2luZm8oc3RydWN0IGRpcl9wcml2YXRlX2luZm8gKnApCit7CisJZnJlZV9yYl90cmVlX2ZuYW1lKCZwLT5yb290KTsKKwlrZnJlZShwKTsKK30KKworLyoKKyAqIEdpdmVuIGEgZGlyZWN0b3J5IGVudHJ5LCBlbnRlciBpdCBpbnRvIHRoZSBmbmFtZSByYiB0cmVlLgorICovCitpbnQgZXh0M19odHJlZV9zdG9yZV9kaXJlbnQoc3RydWN0IGZpbGUgKmRpcl9maWxlLCBfX3UzMiBoYXNoLAorCQkJICAgICBfX3UzMiBtaW5vcl9oYXNoLAorCQkJICAgICBzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqZGlyZW50KQoreworCXN0cnVjdCByYl9ub2RlICoqcCwgKnBhcmVudCA9IE5VTEw7CisJc3RydWN0IGZuYW1lICogZm5hbWUsICpuZXdfZm47CisJc3RydWN0IGRpcl9wcml2YXRlX2luZm8gKmluZm87CisJaW50IGxlbjsKKworCWluZm8gPSAoc3RydWN0IGRpcl9wcml2YXRlX2luZm8gKikgZGlyX2ZpbGUtPnByaXZhdGVfZGF0YTsKKwlwID0gJmluZm8tPnJvb3QucmJfbm9kZTsKKworCS8qIENyZWF0ZSBhbmQgYWxsb2NhdGUgdGhlIGZuYW1lIHN0cnVjdHVyZSAqLworCWxlbiA9IHNpemVvZihzdHJ1Y3QgZm5hbWUpICsgZGlyZW50LT5uYW1lX2xlbiArIDE7CisJbmV3X2ZuID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCWlmICghbmV3X2ZuKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQobmV3X2ZuLCAwLCBsZW4pOworCW5ld19mbi0+aGFzaCA9IGhhc2g7CisJbmV3X2ZuLT5taW5vcl9oYXNoID0gbWlub3JfaGFzaDsKKwluZXdfZm4tPmlub2RlID0gbGUzMl90b19jcHUoZGlyZW50LT5pbm9kZSk7CisJbmV3X2ZuLT5uYW1lX2xlbiA9IGRpcmVudC0+bmFtZV9sZW47CisJbmV3X2ZuLT5maWxlX3R5cGUgPSBkaXJlbnQtPmZpbGVfdHlwZTsKKwltZW1jcHkobmV3X2ZuLT5uYW1lLCBkaXJlbnQtPm5hbWUsIGRpcmVudC0+bmFtZV9sZW4pOworCW5ld19mbi0+bmFtZVtkaXJlbnQtPm5hbWVfbGVuXSA9IDA7CisKKwl3aGlsZSAoKnApIHsKKwkJcGFyZW50ID0gKnA7CisJCWZuYW1lID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgZm5hbWUsIHJiX2hhc2gpOworCisJCS8qCisJCSAqIElmIHRoZSBoYXNoIGFuZCBtaW5vciBoYXNoIG1hdGNoIHVwLCB0aGVuIHdlIHB1dAorCQkgKiB0aGVtIG9uIGEgbGlua2VkIGxpc3QuICBUaGlzIHJhcmVseSBoYXBwZW5zLi4uCisJCSAqLworCQlpZiAoKG5ld19mbi0+aGFzaCA9PSBmbmFtZS0+aGFzaCkgJiYKKwkJICAgIChuZXdfZm4tPm1pbm9yX2hhc2ggPT0gZm5hbWUtPm1pbm9yX2hhc2gpKSB7CisJCQluZXdfZm4tPm5leHQgPSBmbmFtZS0+bmV4dDsKKwkJCWZuYW1lLT5uZXh0ID0gbmV3X2ZuOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAobmV3X2ZuLT5oYXNoIDwgZm5hbWUtPmhhc2gpCisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCWVsc2UgaWYgKG5ld19mbi0+aGFzaCA+IGZuYW1lLT5oYXNoKQorCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwkJZWxzZSBpZiAobmV3X2ZuLT5taW5vcl9oYXNoIDwgZm5hbWUtPm1pbm9yX2hhc2gpCisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCWVsc2UgLyogaWYgKG5ld19mbi0+bWlub3JfaGFzaCA+IGZuYW1lLT5taW5vcl9oYXNoKSAqLworCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwl9CisKKwlyYl9saW5rX25vZGUoJm5ld19mbi0+cmJfaGFzaCwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJm5ld19mbi0+cmJfaGFzaCwgJmluZm8tPnJvb3QpOworCXJldHVybiAwOworfQorCisKKworLyoKKyAqIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gZm9yIGV4dDNfZHhfcmVhZGRpci4gIEl0IGNhbGxzIGZpbGxkaXIKKyAqIGZvciBhbGwgZW50cmVzIG9uIHRoZSBmbmFtZSBsaW5rZWQgbGlzdC4gIChOb3JtYWxseSB0aGVyZSBpcyBvbmx5CisgKiBvbmUgZW50cnkgb24gdGhlIGxpbmtlZCBsaXN0LCB1bmxlc3MgdGhlcmUgYXJlIDYyIGJpdCBoYXNoIGNvbGxpc2lvbnMuKQorICovCitzdGF0aWMgaW50IGNhbGxfZmlsbGRpcihzdHJ1Y3QgZmlsZSAqIGZpbHAsIHZvaWQgKiBkaXJlbnQsCisJCQlmaWxsZGlyX3QgZmlsbGRpciwgc3RydWN0IGZuYW1lICpmbmFtZSkKK3sKKwlzdHJ1Y3QgZGlyX3ByaXZhdGVfaW5mbyAqaW5mbyA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlsb2ZmX3QJY3Vycl9wb3M7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiOworCWludCBlcnJvcjsKKworCXNiID0gaW5vZGUtPmlfc2I7CisKKwlpZiAoIWZuYW1lKSB7CisJCXByaW50aygiY2FsbF9maWxsZGlyOiBjYWxsZWQgd2l0aCBudWxsIGZuYW1lPyE/XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWN1cnJfcG9zID0gaGFzaDJwb3MoZm5hbWUtPmhhc2gsIGZuYW1lLT5taW5vcl9oYXNoKTsKKwl3aGlsZSAoZm5hbWUpIHsKKwkJZXJyb3IgPSBmaWxsZGlyKGRpcmVudCwgZm5hbWUtPm5hbWUsCisJCQkJZm5hbWUtPm5hbWVfbGVuLCBjdXJyX3BvcywgCisJCQkJZm5hbWUtPmlub2RlLAorCQkJCWdldF9kdHlwZShzYiwgZm5hbWUtPmZpbGVfdHlwZSkpOworCQlpZiAoZXJyb3IpIHsKKwkJCWZpbHAtPmZfcG9zID0gY3Vycl9wb3M7CisJCQlpbmZvLT5leHRyYV9mbmFtZSA9IGZuYW1lLT5uZXh0OworCQkJcmV0dXJuIGVycm9yOworCQl9CisJCWZuYW1lID0gZm5hbWUtPm5leHQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV4dDNfZHhfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqIGZpbHAsCisJCQkgdm9pZCAqIGRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJc3RydWN0IGRpcl9wcml2YXRlX2luZm8gKmluZm8gPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBmbmFtZSAqZm5hbWU7CisJaW50CXJldDsKKworCWlmICghaW5mbykgeworCQlpbmZvID0gY3JlYXRlX2Rpcl9pbmZvKGZpbHAtPmZfcG9zKTsKKwkJaWYgKCFpbmZvKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWZpbHAtPnByaXZhdGVfZGF0YSA9IGluZm87CisJfQorCisJaWYgKGZpbHAtPmZfcG9zID09IEVYVDNfSFRSRUVfRU9GKQorCQlyZXR1cm4gMDsJLyogRU9GICovCisKKwkvKiBTb21lIG9uZSBoYXMgbWVzc2VkIHdpdGggZl9wb3M7IHJlc2V0IHRoZSB3b3JsZCAqLworCWlmIChpbmZvLT5sYXN0X3BvcyAhPSBmaWxwLT5mX3BvcykgeworCQlmcmVlX3JiX3RyZWVfZm5hbWUoJmluZm8tPnJvb3QpOworCQlpbmZvLT5jdXJyX25vZGUgPSBOVUxMOworCQlpbmZvLT5leHRyYV9mbmFtZSA9IE5VTEw7CisJCWluZm8tPmN1cnJfaGFzaCA9IHBvczJtYWpfaGFzaChmaWxwLT5mX3Bvcyk7CisJCWluZm8tPmN1cnJfbWlub3JfaGFzaCA9IHBvczJtaW5faGFzaChmaWxwLT5mX3Bvcyk7CisJfQorCisJLyoKKwkgKiBJZiB0aGVyZSBhcmUgYW55IGxlZnRvdmVyIG5hbWVzIG9uIHRoZSBoYXNoIGNvbGxpc2lvbgorCSAqIGNoYWluLCByZXR1cm4gdGhlbSBmaXJzdC4KKwkgKi8KKwlpZiAoaW5mby0+ZXh0cmFfZm5hbWUgJiYKKwkgICAgY2FsbF9maWxsZGlyKGZpbHAsIGRpcmVudCwgZmlsbGRpciwgaW5mby0+ZXh0cmFfZm5hbWUpKQorCQlnb3RvIGZpbmlzaGVkOworCisJaWYgKCFpbmZvLT5jdXJyX25vZGUpCisJCWluZm8tPmN1cnJfbm9kZSA9IHJiX2ZpcnN0KCZpbmZvLT5yb290KTsKKworCXdoaWxlICgxKSB7CisJCS8qCisJCSAqIEZpbGwgdGhlIHJidHJlZSBpZiB3ZSBoYXZlIG5vIG1vcmUgZW50cmllcywKKwkJICogb3IgdGhlIGlub2RlIGhhcyBjaGFuZ2VkIHNpbmNlIHdlIGxhc3QgcmVhZCBpbiB0aGUKKwkJICogY2FjaGVkIGVudHJpZXMuIAorCQkgKi8KKwkJaWYgKCghaW5mby0+Y3Vycl9ub2RlKSB8fAorCQkgICAgKGZpbHAtPmZfdmVyc2lvbiAhPSBpbm9kZS0+aV92ZXJzaW9uKSkgeworCQkJaW5mby0+Y3Vycl9ub2RlID0gTlVMTDsKKwkJCWZyZWVfcmJfdHJlZV9mbmFtZSgmaW5mby0+cm9vdCk7CisJCQlmaWxwLT5mX3ZlcnNpb24gPSBpbm9kZS0+aV92ZXJzaW9uOworCQkJcmV0ID0gZXh0M19odHJlZV9maWxsX3RyZWUoZmlscCwgaW5mby0+Y3Vycl9oYXNoLAorCQkJCQkJICAgaW5mby0+Y3Vycl9taW5vcl9oYXNoLAorCQkJCQkJICAgJmluZm8tPm5leHRfaGFzaCk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQkJaWYgKHJldCA9PSAwKSB7CisJCQkJZmlscC0+Zl9wb3MgPSBFWFQzX0hUUkVFX0VPRjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWluZm8tPmN1cnJfbm9kZSA9IHJiX2ZpcnN0KCZpbmZvLT5yb290KTsKKwkJfQorCisJCWZuYW1lID0gcmJfZW50cnkoaW5mby0+Y3Vycl9ub2RlLCBzdHJ1Y3QgZm5hbWUsIHJiX2hhc2gpOworCQlpbmZvLT5jdXJyX2hhc2ggPSBmbmFtZS0+aGFzaDsKKwkJaW5mby0+Y3Vycl9taW5vcl9oYXNoID0gZm5hbWUtPm1pbm9yX2hhc2g7CisJCWlmIChjYWxsX2ZpbGxkaXIoZmlscCwgZGlyZW50LCBmaWxsZGlyLCBmbmFtZSkpCisJCQlicmVhazsKKworCQlpbmZvLT5jdXJyX25vZGUgPSByYl9uZXh0KGluZm8tPmN1cnJfbm9kZSk7CisJCWlmICghaW5mby0+Y3Vycl9ub2RlKSB7CisJCQlpZiAoaW5mby0+bmV4dF9oYXNoID09IH4wKSB7CisJCQkJZmlscC0+Zl9wb3MgPSBFWFQzX0hUUkVFX0VPRjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWluZm8tPmN1cnJfaGFzaCA9IGluZm8tPm5leHRfaGFzaDsKKwkJCWluZm8tPmN1cnJfbWlub3JfaGFzaCA9IDA7CisJCX0KKwl9CitmaW5pc2hlZDoKKwlpbmZvLT5sYXN0X3BvcyA9IGZpbHAtPmZfcG9zOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV4dDNfcmVsZWFzZV9kaXIgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisgICAgICAgaWYgKGZpbHAtPnByaXZhdGVfZGF0YSkKKwkJZXh0M19odHJlZV9mcmVlX2Rpcl9pbmZvKGZpbHAtPnByaXZhdGVfZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9leHQzL2ZpbGUuYyBiL2ZzL2V4dDMvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZDhjZjAyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0My9maWxlLmMKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiAgbGludXgvZnMvZXh0My9maWxlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUKKyAqIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKKyAqIExhYm9yYXRvaXJlIE1BU0kgLSBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogIGZyb20KKyAqCisgKiAgbGludXgvZnMvbWluaXgvZmlsZS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgZXh0MyBmcyByZWd1bGFyIGZpbGUgaGFuZGxpbmcgcHJpbWl0aXZlcworICoKKyAqICA2NC1iaXQgZmlsZSBzdXBwb3J0IG9uIDY0LWJpdCBwbGF0Zm9ybXMgYnkgSmFrdWIgSmVsaW5laworICoJKGpqQHN1bnNpdGUubXMubWZmLmN1bmkuY3opCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2piZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHQzX2piZC5oPgorI2luY2x1ZGUgInhhdHRyLmgiCisjaW5jbHVkZSAiYWNsLmgiCisKKy8qCisgKiBDYWxsZWQgd2hlbiBhbiBpbm9kZSBpcyByZWxlYXNlZC4gTm90ZSB0aGF0IHRoaXMgaXMgZGlmZmVyZW50CisgKiBmcm9tIGV4dDNfZmlsZV9vcGVuOiBvcGVuIGdldHMgY2FsbGVkIGF0IGV2ZXJ5IG9wZW4sIGJ1dCByZWxlYXNlCisgKiBnZXRzIGNhbGxlZCBvbmx5IHdoZW4gL2FsbC8gdGhlIGZpbGVzIGFyZSBjbG9zZWQuCisgKi8KK3N0YXRpYyBpbnQgZXh0M19yZWxlYXNlX2ZpbGUgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJLyogaWYgd2UgYXJlIHRoZSBsYXN0IHdyaXRlciBvbiB0aGUgaW5vZGUsIGRyb3AgdGhlIGJsb2NrIHJlc2VydmF0aW9uICovCisJaWYgKChmaWxwLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKKwkJCShhdG9taWNfcmVhZCgmaW5vZGUtPmlfd3JpdGVjb3VudCkgPT0gMSkpCisJCWV4dDNfZGlzY2FyZF9yZXNlcnZhdGlvbihpbm9kZSk7CisJaWYgKGlzX2R4KGlub2RlKSAmJiBmaWxwLT5wcml2YXRlX2RhdGEpCisJCWV4dDNfaHRyZWVfZnJlZV9kaXJfaW5mbyhmaWxwLT5wcml2YXRlX2RhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitleHQzX2ZpbGVfd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCBwb3MpCit7CisJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzc2l6ZV90IHJldDsKKwlpbnQgZXJyOworCisJcmV0ID0gZ2VuZXJpY19maWxlX2Fpb193cml0ZShpb2NiLCBidWYsIGNvdW50LCBwb3MpOworCisJLyoKKwkgKiBTa2lwIGZsdXNoaW5nIGlmIHRoZXJlIHdhcyBhbiBlcnJvciwgb3IgaWYgbm90aGluZyB3YXMgd3JpdHRlbi4KKwkgKi8KKwlpZiAocmV0IDw9IDApCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIElmIHRoZSBpbm9kZSBpcyBJU19TWU5DLCBvciBpcyBPX1NZTkMgYW5kIHdlIGFyZSBkb2luZyBkYXRhCisJICogam91cm5hbGxpbmcgdGhlbiB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGZvcmNlIHRoZSB0cmFuc2FjdGlvbgorCSAqIHRvIGRpc2sgdG8ga2VlcCBhbGwgbWV0YWRhdGEgdXB0b2RhdGUgc3luY2hyb25vdXNseS4KKwkgKi8KKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fU1lOQykgeworCQkvKgorCQkgKiBJZiB3ZSBhcmUgbm9uLWRhdGEtam91cm5hbGVkLCB0aGVuIHRoZSBkaXJ0eSBkYXRhIGhhcworCQkgKiBhbHJlYWR5IGJlZW4gZmx1c2hlZCB0byBiYWNraW5nIHN0b3JlIGJ5IGdlbmVyaWNfb3N5bmNfaW5vZGUsCisJCSAqIGFuZCB0aGUgaW5vZGUgaGFzIGJlZW4gZmx1c2hlZCB0b28gaWYgdGhlcmUgaGF2ZSBiZWVuIGFueQorCQkgKiBtb2RpZmljYXRpb25zIG90aGVyIHRoYW4gbWVyZSB0aW1lc3RhbXAgdXBkYXRlcy4KKwkJICoKKwkJICogT3BlbiBxdWVzdGlvbiAtLS0gZG8gd2UgY2FyZSBhYm91dCBmbHVzaGluZyB0aW1lc3RhbXBzIHRvbworCQkgKiBpZiB0aGUgaW5vZGUgaXMgSVNfU1lOQz8KKwkJICovCisJCWlmICghZXh0M19zaG91bGRfam91cm5hbF9kYXRhKGlub2RlKSkKKwkJCXJldHVybiByZXQ7CisKKwkJZ290byBmb3JjZV9jb21taXQ7CisJfQorCisJLyoKKwkgKiBTbyB3ZSBrbm93IHRoYXQgdGhlcmUgaGFzIGJlZW4gbm8gZm9yY2VkIGRhdGEgZmx1c2guICBJZiB0aGUgaW5vZGUKKwkgKiBpcyBtYXJrZWQgSVNfU1lOQywgd2UgbmVlZCB0byBmb3JjZSBvbmUgb3Vyc2VsdmVzLgorCSAqLworCWlmICghSVNfU1lOQyhpbm9kZSkpCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIE9wZW4gcXVlc3Rpb24gIzIgLS0tIHNob3VsZCB3ZSBmb3JjZSBkYXRhIHRvIGRpc2sgaGVyZSB0b28/ICBJZiB3ZQorCSAqIGRvbid0LCB0aGUgb25seSBpbXBhY3QgaXMgdGhhdCBkYXRhPXdyaXRlYmFjayBmaWxlc3lzdGVtcyB3b24ndAorCSAqIGZsdXNoIGRhdGEgdG8gZGlzayBhdXRvbWF0aWNhbGx5IG9uIElTX1NZTkMsIG9ubHkgbWV0YWRhdGEgKGJ1dAorCSAqIGhpc3RvcmljYWxseSwgdGhhdCBpcyB3aGF0IGV4dDIgaGFzIGRvbmUuKQorCSAqLworCitmb3JjZV9jb21taXQ6CisJZXJyID0gZXh0M19mb3JjZV9jb21taXQoaW5vZGUtPmlfc2IpOworCWlmIChlcnIpIAorCQlyZXR1cm4gZXJyOworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXh0M19maWxlX29wZXJhdGlvbnMgPSB7CisJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAorCS5yZWFkCQk9IGRvX3N5bmNfcmVhZCwKKwkud3JpdGUJCT0gZG9fc3luY193cml0ZSwKKwkuYWlvX3JlYWQJPSBnZW5lcmljX2ZpbGVfYWlvX3JlYWQsCisJLmFpb193cml0ZQk9IGV4dDNfZmlsZV93cml0ZSwKKwkucmVhZHYJCT0gZ2VuZXJpY19maWxlX3JlYWR2LAorCS53cml0ZXYJCT0gZ2VuZXJpY19maWxlX3dyaXRldiwKKwkuaW9jdGwJCT0gZXh0M19pb2N0bCwKKwkubW1hcAkJPSBnZW5lcmljX2ZpbGVfbW1hcCwKKwkub3BlbgkJPSBnZW5lcmljX2ZpbGVfb3BlbiwKKwkucmVsZWFzZQk9IGV4dDNfcmVsZWFzZV9maWxlLAorCS5mc3luYwkJPSBleHQzX3N5bmNfZmlsZSwKKwkuc2VuZGZpbGUJPSBnZW5lcmljX2ZpbGVfc2VuZGZpbGUsCit9OworCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBleHQzX2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkudHJ1bmNhdGUJPSBleHQzX3RydW5jYXRlLAorCS5zZXRhdHRyCT0gZXh0M19zZXRhdHRyLAorI2lmZGVmIENPTkZJR19FWFQzX0ZTX1hBVFRSCisJLnNldHhhdHRyCT0gZ2VuZXJpY19zZXR4YXR0ciwKKwkuZ2V0eGF0dHIJPSBnZW5lcmljX2dldHhhdHRyLAorCS5saXN0eGF0dHIJPSBleHQzX2xpc3R4YXR0ciwKKwkucmVtb3ZleGF0dHIJPSBnZW5lcmljX3JlbW92ZXhhdHRyLAorI2VuZGlmCisJLnBlcm1pc3Npb24JPSBleHQzX3Blcm1pc3Npb24sCit9OworCmRpZmYgLS1naXQgYS9mcy9leHQzL2ZzeW5jLmMgYi9mcy9leHQzL2ZzeW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkzODJhMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDMvZnN5bmMuYwpAQCAtMCwwICsxLDg4IEBACisvKgorICogIGxpbnV4L2ZzL2V4dDMvZnN5bmMuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTMgIFN0ZXBoZW4gVHdlZWRpZSAoc2N0QHJlZGhhdC5jb20pCisgKiAgZnJvbQorICogIENvcHlyaWdodCAoQykgMTk5MiAgUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQorICogICAgICAgICAgICAgICAgICAgICAgTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqICAgICAgICAgICAgICAgICAgICAgIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqICBmcm9tCisgKiAgbGludXgvZnMvbWluaXgvdHJ1bmNhdGUuYyAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqIAorICogIGV4dDNmcyBmc3luYyBwcmltaXRpdmUKKyAqCisgKiAgQmlnLWVuZGlhbiB0byBsaXR0bGUtZW5kaWFuIGJ5dGUtc3dhcHBpbmcvYml0bWFwcyBieQorICogICAgICAgIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSksIDE5OTUKKyAqIAorICogIFJlbW92ZWQgdW5uZWNlc3NhcnkgY29kZSBkdXBsaWNhdGlvbiBmb3IgbGl0dGxlIGVuZGlhbiBtYWNoaW5lcworICogIGFuZCBleGNlc3NpdmUgX19pbmxpbmVfX3MuIAorICogICAgICAgIEFuZGkgS2xlZW4sIDE5OTcKKyAqCisgKiBNYWpvciBzaW1wbGljYXRpb25zIGFuZCBjbGVhbnVwIC0gd2Ugb25seSBuZWVkIHRvIGRvIHRoZSBtZXRhZGF0YSwgYmVjYXVzZQorICogd2UgY2FuIGRlcGVuZCBvbiBnZW5lcmljX2Jsb2NrX2ZkYXRhc3luYygpIHRvIHN5bmMgdGhlIGRhdGEgYmxvY2tzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgorI2luY2x1ZGUgPGxpbnV4L2piZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHQzX2piZC5oPgorCisvKgorICogYWtwbTogQSBuZXcgZGVzaWduIGZvciBleHQzX3N5bmNfZmlsZSgpLgorICoKKyAqIFRoaXMgaXMgb25seSBjYWxsZWQgZnJvbSBzeXNfZnN5bmMoKSwgc3lzX2ZkYXRhc3luYygpIGFuZCBzeXNfbXN5bmMoKS4KKyAqIFRoZXJlIGNhbm5vdCBiZSBhIHRyYW5zYWN0aW9uIG9wZW4gYnkgdGhpcyB0YXNrLgorICogQW5vdGhlciB0YXNrIGNvdWxkIGhhdmUgZGlydGllZCB0aGlzIGlub2RlLiAgSXRzIGRhdGEgY2FuIGJlIGluIGFueQorICogc3RhdGUgaW4gdGhlIGpvdXJuYWxsaW5nIHN5c3RlbS4KKyAqCisgKiBXaGF0IHdlIGRvIGlzIGp1c3Qga2ljayBvZmYgYSBjb21taXQgYW5kIHdhaXQgb24gaXQuICBUaGlzIHdpbGwgc25hcHNob3QgdGhlCisgKiBpbm9kZSB0byBkaXNrLgorICovCisKK2ludCBleHQzX3N5bmNfZmlsZShzdHJ1Y3QgZmlsZSAqIGZpbGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGRhdGFzeW5jKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IHJldCA9IDA7CisKKwlKX0FTU0VSVChleHQzX2pvdXJuYWxfY3VycmVudF9oYW5kbGUoKSA9PSAwKTsKKworCS8qCisJICogZGF0YT13cml0ZWJhY2s6CisJICogIFRoZSBjYWxsZXIncyBmaWxlbWFwX2ZkYXRhd3JpdGUoKS93YWl0IHdpbGwgc3luYyB0aGUgZGF0YS4KKwkgKiAgc3luY19pbm9kZSgpIHdpbGwgc3luYyB0aGUgbWV0YWRhdGEKKwkgKgorCSAqIGRhdGE9b3JkZXJlZDoKKwkgKiAgVGhlIGNhbGxlcidzIGZpbGVtYXBfZmRhdGF3cml0ZSgpIHdpbGwgd3JpdGUgdGhlIGRhdGEgYW5kCisJICogIHN5bmNfaW5vZGUoKSB3aWxsIHdyaXRlIHRoZSBpbm9kZSBpZiBpdCBpcyBkaXJ0eS4gIFRoZW4gdGhlIGNhbGxlcidzCisJICogIGZpbGVtYXBfZmRhdGF3YWl0KCkgd2lsbCB3YWl0IG9uIHRoZSBwYWdlcy4KKwkgKgorCSAqIGRhdGE9am91cm5hbDoKKwkgKiAgZmlsZW1hcF9mZGF0YXdyaXRlIHdvbid0IGRvIGFueXRoaW5nICh0aGUgYnVmZmVycyBhcmUgY2xlYW4pLgorCSAqICBleHQzX2ZvcmNlX2NvbW1pdCB3aWxsIHdyaXRlIHRoZSBmaWxlIGRhdGEgaW50byB0aGUgam91cm5hbCBhbmQKKwkgKiAgd2lsbCB3YWl0IG9uIHRoYXQuCisJICogIGZpbGVtYXBfZmRhdGF3YWl0KCkgd2lsbCBlbmNvdW50ZXIgYSB0b24gb2YgbmV3bHktZGlydGllZCBwYWdlcworCSAqICAodGhleSB3ZXJlIGRpcnRpZWQgYnkgY29tbWl0KS4gIEJ1dCB0aGF0J3MgT0sgLSB0aGUgYmxvY2tzIGFyZQorCSAqICBzYWZlIGluLWpvdXJuYWwsIHdoaWNoIGlzIGFsbCBmc3luYygpIG5lZWRzIHRvIGVuc3VyZS4KKwkgKi8KKwlpZiAoZXh0M19zaG91bGRfam91cm5hbF9kYXRhKGlub2RlKSkgeworCQlyZXQgPSBleHQzX2ZvcmNlX2NvbW1pdChpbm9kZS0+aV9zYik7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogVGhlIFZGUyBoYXMgd3JpdHRlbiB0aGUgZmlsZSBkYXRhLiAgSWYgdGhlIGlub2RlIGlzIHVuYWx0ZXJlZAorCSAqIHRoZW4gd2UgbmVlZCBub3Qgc3RhcnQgYSBjb21taXQuCisJICovCisJaWYgKGlub2RlLT5pX3N0YXRlICYgKElfRElSVFlfU1lOQ3xJX0RJUlRZX0RBVEFTWU5DKSkgeworCQlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgd2JjID0geworCQkJLnN5bmNfbW9kZSA9IFdCX1NZTkNfQUxMLAorCQkJLm5yX3RvX3dyaXRlID0gMCwgLyogc3lzX2ZzeW5jIGRpZCB0aGlzICovCisJCX07CisJCXJldCA9IHN5bmNfaW5vZGUoaW5vZGUsICZ3YmMpOworCX0KK291dDoKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZnMvZXh0My9oYXNoLmMgYi9mcy9leHQzL2hhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTJkMTIzCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0My9oYXNoLmMKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiAgbGludXgvZnMvZXh0My9oYXNoLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgYnkgVGhlb2RvcmUgVHMnbworICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMIHYyLgorICogCisgKiBUaGlzIGZpbGUgbWF5IGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgUHVibGljCisgKiBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2piZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZXh0M19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0b2hhc2guaD4KKworI2RlZmluZSBERUxUQSAweDlFMzc3OUI5CisKK3N0YXRpYyB2b2lkIFRFQV90cmFuc2Zvcm0oX191MzIgYnVmWzRdLCBfX3UzMiBjb25zdCBpbltdKQoreworCV9fdTMyCXN1bSA9IDA7CisJX191MzIJYjAgPSBidWZbMF0sIGIxID0gYnVmWzFdOworCV9fdTMyCWEgPSBpblswXSwgYiA9IGluWzFdLCBjID0gaW5bMl0sIGQgPSBpblszXTsKKwlpbnQJbiA9IDE2OworCisJZG8geworCQlzdW0gKz0gREVMVEE7CisJCWIwICs9ICgoYjEgPDwgNCkrYSkgXiAoYjErc3VtKSBeICgoYjEgPj4gNSkrYik7CisJCWIxICs9ICgoYjAgPDwgNCkrYykgXiAoYjArc3VtKSBeICgoYjAgPj4gNSkrZCk7CisJfSB3aGlsZSgtLW4pOworCisJYnVmWzBdICs9IGIwOworCWJ1ZlsxXSArPSBiMTsKK30KKworCisvKiBUaGUgb2xkIGxlZ2FjeSBoYXNoICovCitzdGF0aWMgX191MzIgZHhfaGFja19oYXNoIChjb25zdCBjaGFyICpuYW1lLCBpbnQgbGVuKQoreworCV9fdTMyIGhhc2gwID0gMHgxMmEzZmUyZCwgaGFzaDEgPSAweDM3YWJlOGY5OworCXdoaWxlIChsZW4tLSkgeworCQlfX3UzMiBoYXNoID0gaGFzaDEgKyAoaGFzaDAgXiAoKm5hbWUrKyAqIDcxNTIzNzMpKTsKKworCQlpZiAoaGFzaCAmIDB4ODAwMDAwMDApIGhhc2ggLT0gMHg3ZmZmZmZmZjsKKwkJaGFzaDEgPSBoYXNoMDsKKwkJaGFzaDAgPSBoYXNoOworCX0KKwlyZXR1cm4gKGhhc2gwIDw8IDEpOworfQorCitzdGF0aWMgdm9pZCBzdHIyaGFzaGJ1Zihjb25zdCBjaGFyICptc2csIGludCBsZW4sIF9fdTMyICpidWYsIGludCBudW0pCit7CisJX191MzIJcGFkLCB2YWw7CisJaW50CWk7CisKKwlwYWQgPSAoX191MzIpbGVuIHwgKChfX3UzMilsZW4gPDwgOCk7CisJcGFkIHw9IHBhZCA8PCAxNjsKKworCXZhbCA9IHBhZDsKKwlpZiAobGVuID4gbnVtKjQpCisJCWxlbiA9IG51bSAqIDQ7CisJZm9yIChpPTA7IGkgPCBsZW47IGkrKykgeworCQlpZiAoKGkgJSA0KSA9PSAwKQorCQkJdmFsID0gcGFkOworCQl2YWwgPSBtc2dbaV0gKyAodmFsIDw8IDgpOworCQlpZiAoKGkgJSA0KSA9PSAzKSB7CisJCQkqYnVmKysgPSB2YWw7CisJCQl2YWwgPSBwYWQ7CisJCQludW0tLTsKKwkJfQorCX0KKwlpZiAoLS1udW0gPj0gMCkKKwkJKmJ1ZisrID0gdmFsOworCXdoaWxlICgtLW51bSA+PSAwKQorCQkqYnVmKysgPSBwYWQ7Cit9CisKKy8qCisgKiBSZXR1cm5zIHRoZSBoYXNoIG9mIGEgZmlsZW5hbWUuICBJZiBsZW4gaXMgMCBhbmQgbmFtZSBpcyBOVUxMLCB0aGVuCisgKiB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHRlc3Qgd2hldGhlciBvciBub3QgYSBoYXNoIHZlcnNpb24gaXMKKyAqIHN1cHBvcnRlZC4KKyAqIAorICogVGhlIHNlZWQgaXMgYW4gNCBsb25nd29yZCAoMzIgYml0cykgInNlY3JldCIgd2hpY2ggY2FuIGJlIHVzZWQgdG8KKyAqIHVuaXF1aWZ5IGEgaGFzaC4gIElmIHRoZSBzZWVkIGlzIGFsbCB6ZXJvJ3MsIHRoZW4gc29tZSBkZWZhdWx0IHNlZWQKKyAqIG1heSBiZSB1c2VkLgorICogCisgKiBBIHBhcnRpY3VsYXIgaGFzaCB2ZXJzaW9uIHNwZWNpZmllcyB3aGV0aGVyIG9yIG5vdCB0aGUgc2VlZCBpcworICogcmVwcmVzZW50ZWQsIGFuZCB3aGV0aGVyIG9yIG5vdCB0aGUgcmV0dXJuZWQgaGFzaCBpcyAzMiBiaXRzIG9yIDY0CisgKiBiaXRzLiAgMzIgYml0IGhhc2hlcyB3aWxsIHJldHVybiAwIGZvciB0aGUgbWlub3IgaGFzaC4KKyAqLworaW50IGV4dDNmc19kaXJoYXNoKGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4sIHN0cnVjdCBkeF9oYXNoX2luZm8gKmhpbmZvKQoreworCV9fdTMyCWhhc2g7CisJX191MzIJbWlub3JfaGFzaCA9IDA7CisJY29uc3QgY2hhcgkqcDsKKwlpbnQJCWk7CisJX191MzIgCQlpbls4XSwgYnVmWzRdOworCisJLyogSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBzZWVkIGZvciB0aGUgaGFzaCBjaGVja3N1bSBmdW5jdGlvbnMgKi8KKwlidWZbMF0gPSAweDY3NDUyMzAxOworCWJ1ZlsxXSA9IDB4ZWZjZGFiODk7CisJYnVmWzJdID0gMHg5OGJhZGNmZTsKKwlidWZbM10gPSAweDEwMzI1NDc2OworCisJLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBzZWVkIGlzIGFsbCB6ZXJvJ3MgKi8KKwlpZiAoaGluZm8tPnNlZWQpIHsKKwkJZm9yIChpPTA7IGkgPCA0OyBpKyspIHsKKwkJCWlmIChoaW5mby0+c2VlZFtpXSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaSA8IDQpCisJCQltZW1jcHkoYnVmLCBoaW5mby0+c2VlZCwgc2l6ZW9mKGJ1ZikpOworCX0KKworCXN3aXRjaCAoaGluZm8tPmhhc2hfdmVyc2lvbikgeworCWNhc2UgRFhfSEFTSF9MRUdBQ1k6CisJCWhhc2ggPSBkeF9oYWNrX2hhc2gobmFtZSwgbGVuKTsKKwkJYnJlYWs7CisJY2FzZSBEWF9IQVNIX0hBTEZfTUQ0OgorCQlwID0gbmFtZTsKKwkJd2hpbGUgKGxlbiA+IDApIHsKKwkJCXN0cjJoYXNoYnVmKHAsIGxlbiwgaW4sIDgpOworCQkJaGFsZl9tZDRfdHJhbnNmb3JtKGJ1ZiwgaW4pOworCQkJbGVuIC09IDMyOworCQkJcCArPSAzMjsKKwkJfQorCQltaW5vcl9oYXNoID0gYnVmWzJdOworCQloYXNoID0gYnVmWzFdOworCQlicmVhazsKKwljYXNlIERYX0hBU0hfVEVBOgorCQlwID0gbmFtZTsKKwkJd2hpbGUgKGxlbiA+IDApIHsKKwkJCXN0cjJoYXNoYnVmKHAsIGxlbiwgaW4sIDQpOworCQkJVEVBX3RyYW5zZm9ybShidWYsIGluKTsKKwkJCWxlbiAtPSAxNjsKKwkJCXAgKz0gMTY7CisJCX0KKwkJaGFzaCA9IGJ1ZlswXTsKKwkJbWlub3JfaGFzaCA9IGJ1ZlsxXTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaGluZm8tPmhhc2ggPSAwOworCQlyZXR1cm4gLTE7CisJfQorCWhhc2ggPSBoYXNoICYgfjE7CisJaWYgKGhhc2ggPT0gKEVYVDNfSFRSRUVfRU9GIDw8IDEpKQorCQloYXNoID0gKEVYVDNfSFRSRUVfRU9GLTEpIDw8IDE7CisJaGluZm8tPmhhc2ggPSBoYXNoOworCWhpbmZvLT5taW5vcl9oYXNoID0gbWlub3JfaGFzaDsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL2V4dDMvaWFsbG9jLmMgYi9mcy9leHQzL2lhbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNmYzZWEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQzL2lhbGxvYy5jCkBAIC0wLDAgKzEsNzk0IEBACisvKgorICogIGxpbnV4L2ZzL2V4dDMvaWFsbG9jLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUKKyAqIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKKyAqIExhYm9yYXRvaXJlIE1BU0kgLSBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogIEJTRCB1ZnMtaW5zcGlyZWQgaW5vZGUgYW5kIGRpcmVjdG9yeSBhbGxvY2F0aW9uIGJ5CisgKiAgU3RlcGhlbiBUd2VlZGllIChzY3RAcmVkaGF0LmNvbSksIDE5OTMKKyAqICBCaWctZW5kaWFuIHRvIGxpdHRsZS1lbmRpYW4gYnl0ZS1zd2FwcGluZy9iaXRtYXBzIGJ5CisgKiAgICAgICAgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KSwgMTk5NQorICovCisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9qYmQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHQzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXh0M19qYmQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaW5jbHVkZSAieGF0dHIuaCIKKyNpbmNsdWRlICJhY2wuaCIKKworLyoKKyAqIGlhbGxvYy5jIGNvbnRhaW5zIHRoZSBpbm9kZXMgYWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uIHJvdXRpbmVzCisgKi8KKworLyoKKyAqIFRoZSBmcmVlIGlub2RlcyBhcmUgbWFuYWdlZCBieSBiaXRtYXBzLiAgQSBmaWxlIHN5c3RlbSBjb250YWlucyBzZXZlcmFsCisgKiBibG9ja3MgZ3JvdXBzLiAgRWFjaCBncm91cCBjb250YWlucyAxIGJpdG1hcCBibG9jayBmb3IgYmxvY2tzLCAxIGJpdG1hcAorICogYmxvY2sgZm9yIGlub2RlcywgTiBibG9ja3MgZm9yIHRoZSBpbm9kZSB0YWJsZSBhbmQgZGF0YSBibG9ja3MuCisgKgorICogVGhlIGZpbGUgc3lzdGVtIGNvbnRhaW5zIGdyb3VwIGRlc2NyaXB0b3JzIHdoaWNoIGFyZSBsb2NhdGVkIGFmdGVyIHRoZQorICogc3VwZXIgYmxvY2suICBFYWNoIGRlc2NyaXB0b3IgY29udGFpbnMgdGhlIG51bWJlciBvZiB0aGUgYml0bWFwIGJsb2NrIGFuZAorICogdGhlIGZyZWUgYmxvY2tzIGNvdW50IGluIHRoZSBibG9jay4KKyAqLworCisKKy8qCisgKiBSZWFkIHRoZSBpbm9kZSBhbGxvY2F0aW9uIGJpdG1hcCBmb3IgYSBnaXZlbiBibG9ja19ncm91cCwgcmVhZGluZworICogaW50byB0aGUgc3BlY2lmaWVkIHNsb3QgaW4gdGhlIHN1cGVyYmxvY2sncyBiaXRtYXAgY2FjaGUuCisgKgorICogUmV0dXJuIGJ1ZmZlcl9oZWFkIG9mIGJpdG1hcCBvbiBzdWNjZXNzIG9yIE5VTEwuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKgorcmVhZF9pbm9kZV9iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIHVuc2lnbmVkIGxvbmcgYmxvY2tfZ3JvdXApCit7CisJc3RydWN0IGV4dDNfZ3JvdXBfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKworCWRlc2MgPSBleHQzX2dldF9ncm91cF9kZXNjKHNiLCBibG9ja19ncm91cCwgTlVMTCk7CisJaWYgKCFkZXNjKQorCQlnb3RvIGVycm9yX291dDsKKworCWJoID0gc2JfYnJlYWQoc2IsIGxlMzJfdG9fY3B1KGRlc2MtPmJnX2lub2RlX2JpdG1hcCkpOworCWlmICghYmgpCisJCWV4dDNfZXJyb3Ioc2IsICJyZWFkX2lub2RlX2JpdG1hcCIsCisJCQkgICAgIkNhbm5vdCByZWFkIGlub2RlIGJpdG1hcCAtICIKKwkJCSAgICAiYmxvY2tfZ3JvdXAgPSAlbHUsIGlub2RlX2JpdG1hcCA9ICV1IiwKKwkJCSAgICBibG9ja19ncm91cCwgbGUzMl90b19jcHUoZGVzYy0+YmdfaW5vZGVfYml0bWFwKSk7CitlcnJvcl9vdXQ6CisJcmV0dXJuIGJoOworfQorCisvKgorICogTk9URSEgV2hlbiB3ZSBnZXQgdGhlIGlub2RlLCB3ZSdyZSB0aGUgb25seSBwZW9wbGUKKyAqIHRoYXQgaGF2ZSBhY2Nlc3MgdG8gaXQsIGFuZCBhcyBzdWNoIHRoZXJlIGFyZSBubworICogcmFjZSBjb25kaXRpb25zIHdlIGhhdmUgdG8gd29ycnkgYWJvdXQuIFRoZSBpbm9kZQorICogaXMgbm90IG9uIHRoZSBoYXNoLWxpc3RzLCBhbmQgaXQgY2Fubm90IGJlIHJlYWNoZWQKKyAqIHRocm91Z2ggdGhlIGZpbGVzeXN0ZW0gYmVjYXVzZSB0aGUgZGlyZWN0b3J5IGVudHJ5CisgKiBoYXMgYmVlbiBkZWxldGVkIGVhcmxpZXIuCisgKgorICogSE9XRVZFUjogd2UgbXVzdCBtYWtlIHN1cmUgdGhhdCB3ZSBnZXQgbm8gYWxpYXNlcywKKyAqIHdoaWNoIG1lYW5zIHRoYXQgd2UgaGF2ZSB0byBjYWxsICJjbGVhcl9pbm9kZSgpIgorICogX2JlZm9yZV8gd2UgbWFyayB0aGUgaW5vZGUgbm90IGluIHVzZSBpbiB0aGUgaW5vZGUKKyAqIGJpdG1hcHMuIE90aGVyd2lzZSBhIG5ld2x5IGNyZWF0ZWQgZmlsZSBtaWdodCB1c2UKKyAqIHRoZSBzYW1lIGlub2RlIG51bWJlciAobm90IGFjdHVhbGx5IHRoZSBzYW1lIHBvaW50ZXIKKyAqIHRob3VnaCksIGFuZCB0aGVuIHdlJ2QgaGF2ZSB0d28gaW5vZGVzIHNoYXJpbmcgdGhlCisgKiBzYW1lIGlub2RlIG51bWJlciBhbmQgc3BhY2Ugb24gdGhlIGhhcmRkaXNrLgorICovCit2b2lkIGV4dDNfZnJlZV9pbm9kZSAoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2IgPSBpbm9kZS0+aV9zYjsKKwlpbnQgaXNfZGlyZWN0b3J5OworCXVuc2lnbmVkIGxvbmcgaW5vOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoID0gTlVMTDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoMjsKKwl1bnNpZ25lZCBsb25nIGJsb2NrX2dyb3VwOworCXVuc2lnbmVkIGxvbmcgYml0OworCXN0cnVjdCBleHQzX2dyb3VwX2Rlc2MgKiBnZHA7CisJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKiBlczsKKwlzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmk7CisJaW50IGZhdGFsID0gMCwgZXJyOworCisJaWYgKGF0b21pY19yZWFkKCZpbm9kZS0+aV9jb3VudCkgPiAxKSB7CisJCXByaW50ayAoImV4dDNfZnJlZV9pbm9kZTogaW5vZGUgaGFzIGNvdW50PSVkXG4iLAorCQkJCQlhdG9taWNfcmVhZCgmaW5vZGUtPmlfY291bnQpKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoaW5vZGUtPmlfbmxpbmspIHsKKwkJcHJpbnRrICgiZXh0M19mcmVlX2lub2RlOiBpbm9kZSBoYXMgbmxpbms9JWRcbiIsCisJCQlpbm9kZS0+aV9ubGluayk7CisJCXJldHVybjsKKwl9CisJaWYgKCFzYikgeworCQlwcmludGsoImV4dDNfZnJlZV9pbm9kZTogaW5vZGUgb24gbm9uZXhpc3RlbnQgZGV2aWNlXG4iKTsKKwkJcmV0dXJuOworCX0KKwlzYmkgPSBFWFQzX1NCKHNiKTsKKworCWlubyA9IGlub2RlLT5pX2lubzsKKwlleHQzX2RlYnVnICgiZnJlZWluZyBpbm9kZSAlbHVcbiIsIGlubyk7CisKKwkvKgorCSAqIE5vdGU6IHdlIG11c3QgZnJlZSBhbnkgcXVvdGEgYmVmb3JlIGxvY2tpbmcgdGhlIHN1cGVyYmxvY2ssCisJICogYXMgd3JpdGluZyB0aGUgcXVvdGEgdG8gZGlzayBtYXkgbmVlZCB0aGUgbG9jayBhcyB3ZWxsLgorCSAqLworCURRVU9UX0lOSVQoaW5vZGUpOworCWV4dDNfeGF0dHJfZGVsZXRlX2lub2RlKGhhbmRsZSwgaW5vZGUpOworCURRVU9UX0ZSRUVfSU5PREUoaW5vZGUpOworCURRVU9UX0RST1AoaW5vZGUpOworCisJaXNfZGlyZWN0b3J5ID0gU19JU0RJUihpbm9kZS0+aV9tb2RlKTsKKworCS8qIERvIHRoaXMgQkVGT1JFIG1hcmtpbmcgdGhlIGlub2RlIG5vdCBpbiB1c2Ugb3IgcmV0dXJuaW5nIGFuIGVycm9yICovCisJY2xlYXJfaW5vZGUgKGlub2RlKTsKKworCWVzID0gRVhUM19TQihzYiktPnNfZXM7CisJaWYgKGlubyA8IEVYVDNfRklSU1RfSU5PKHNiKSB8fCBpbm8gPiBsZTMyX3RvX2NwdShlcy0+c19pbm9kZXNfY291bnQpKSB7CisJCWV4dDNfZXJyb3IgKHNiLCAiZXh0M19mcmVlX2lub2RlIiwKKwkJCSAgICAicmVzZXJ2ZWQgb3Igbm9uZXhpc3RlbnQgaW5vZGUgJWx1IiwgaW5vKTsKKwkJZ290byBlcnJvcl9yZXR1cm47CisJfQorCWJsb2NrX2dyb3VwID0gKGlubyAtIDEpIC8gRVhUM19JTk9ERVNfUEVSX0dST1VQKHNiKTsKKwliaXQgPSAoaW5vIC0gMSkgJSBFWFQzX0lOT0RFU19QRVJfR1JPVVAoc2IpOworCWJpdG1hcF9iaCA9IHJlYWRfaW5vZGVfYml0bWFwKHNiLCBibG9ja19ncm91cCk7CisJaWYgKCFiaXRtYXBfYmgpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCisJQlVGRkVSX1RSQUNFKGJpdG1hcF9iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwlmYXRhbCA9IGV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYml0bWFwX2JoKTsKKwlpZiAoZmF0YWwpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCisJLyogT2ssIG5vdyB3ZSBjYW4gYWN0dWFsbHkgdXBkYXRlIHRoZSBpbm9kZSBiaXRtYXBzLi4gKi8KKwlpZiAoIWV4dDNfY2xlYXJfYml0X2F0b21pYyhzYl9iZ2xfbG9jayhzYmksIGJsb2NrX2dyb3VwKSwKKwkJCQkJYml0LCBiaXRtYXBfYmgtPmJfZGF0YSkpCisJCWV4dDNfZXJyb3IgKHNiLCAiZXh0M19mcmVlX2lub2RlIiwKKwkJCSAgICAgICJiaXQgYWxyZWFkeSBjbGVhcmVkIGZvciBpbm9kZSAlbHUiLCBpbm8pOworCWVsc2UgeworCQlnZHAgPSBleHQzX2dldF9ncm91cF9kZXNjIChzYiwgYmxvY2tfZ3JvdXAsICZiaDIpOworCisJCUJVRkZFUl9UUkFDRShiaDIsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJCWZhdGFsID0gZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBiaDIpOworCQlpZiAoZmF0YWwpIGdvdG8gZXJyb3JfcmV0dXJuOworCisJCWlmIChnZHApIHsKKwkJCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhzYmksIGJsb2NrX2dyb3VwKSk7CisJCQlnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50ID0gY3B1X3RvX2xlMTYoCisJCQkJbGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2lub2Rlc19jb3VudCkgKyAxKTsKKwkJCWlmIChpc19kaXJlY3RvcnkpCisJCQkJZ2RwLT5iZ191c2VkX2RpcnNfY291bnQgPSBjcHVfdG9fbGUxNigKKwkJCQkgIGxlMTZfdG9fY3B1KGdkcC0+YmdfdXNlZF9kaXJzX2NvdW50KSAtIDEpOworCQkJc3Bpbl91bmxvY2soc2JfYmdsX2xvY2soc2JpLCBibG9ja19ncm91cCkpOworCQkJcGVyY3B1X2NvdW50ZXJfaW5jKCZzYmktPnNfZnJlZWlub2Rlc19jb3VudGVyKTsKKwkJCWlmIChpc19kaXJlY3RvcnkpCisJCQkJcGVyY3B1X2NvdW50ZXJfZGVjKCZzYmktPnNfZGlyc19jb3VudGVyKTsKKworCQl9CisJCUJVRkZFUl9UUkFDRShiaDIsICJjYWxsIGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOworCQllcnIgPSBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaDIpOworCQlpZiAoIWZhdGFsKSBmYXRhbCA9IGVycjsKKwl9CisJQlVGRkVSX1RSQUNFKGJpdG1hcF9iaCwgImNhbGwgZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7CisJZXJyID0gZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYml0bWFwX2JoKTsKKwlpZiAoIWZhdGFsKQorCQlmYXRhbCA9IGVycjsKKwlzYi0+c19kaXJ0ID0gMTsKK2Vycm9yX3JldHVybjoKKwlicmVsc2UoYml0bWFwX2JoKTsKKwlleHQzX3N0ZF9lcnJvcihzYiwgZmF0YWwpOworfQorCisvKgorICogVGhlcmUgYXJlIHR3byBwb2xpY2llcyBmb3IgYWxsb2NhdGluZyBhbiBpbm9kZS4gIElmIHRoZSBuZXcgaW5vZGUgaXMKKyAqIGEgZGlyZWN0b3J5LCB0aGVuIGEgZm9yd2FyZCBzZWFyY2ggaXMgbWFkZSBmb3IgYSBibG9jayBncm91cCB3aXRoIGJvdGgKKyAqIGZyZWUgc3BhY2UgYW5kIGEgbG93IGRpcmVjdG9yeS10by1pbm9kZSByYXRpbzsgaWYgdGhhdCBmYWlscywgdGhlbiBvZgorICogdGhlIGdyb3VwcyB3aXRoIGFib3ZlLWF2ZXJhZ2UgZnJlZSBzcGFjZSwgdGhhdCBncm91cCB3aXRoIHRoZSBmZXdlc3QKKyAqIGRpcmVjdG9yaWVzIGFscmVhZHkgaXMgY2hvc2VuLgorICoKKyAqIEZvciBvdGhlciBpbm9kZXMsIHNlYXJjaCBmb3J3YXJkIGZyb20gdGhlIHBhcmVudCBkaXJlY3RvcnlcJ3MgYmxvY2sKKyAqIGdyb3VwIHRvIGZpbmQgYSBmcmVlIGlub2RlLgorICovCitzdGF0aWMgaW50IGZpbmRfZ3JvdXBfZGlyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBpbm9kZSAqcGFyZW50KQoreworCWludCBuZ3JvdXBzID0gRVhUM19TQihzYiktPnNfZ3JvdXBzX2NvdW50OworCWludCBmcmVlaSwgYXZlZnJlZWk7CisJc3RydWN0IGV4dDNfZ3JvdXBfZGVzYyAqZGVzYywgKmJlc3RfZGVzYyA9IE5VTEw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlpbnQgZ3JvdXAsIGJlc3RfZ3JvdXAgPSAtMTsKKworCWZyZWVpID0gcGVyY3B1X2NvdW50ZXJfcmVhZF9wb3NpdGl2ZSgmRVhUM19TQihzYiktPnNfZnJlZWlub2Rlc19jb3VudGVyKTsKKwlhdmVmcmVlaSA9IGZyZWVpIC8gbmdyb3VwczsKKworCWZvciAoZ3JvdXAgPSAwOyBncm91cCA8IG5ncm91cHM7IGdyb3VwKyspIHsKKwkJZGVzYyA9IGV4dDNfZ2V0X2dyb3VwX2Rlc2MgKHNiLCBncm91cCwgJmJoKTsKKwkJaWYgKCFkZXNjIHx8ICFkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCkKKwkJCWNvbnRpbnVlOworCQlpZiAobGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpIDwgYXZlZnJlZWkpCisJCQljb250aW51ZTsKKwkJaWYgKCFiZXN0X2Rlc2MgfHwgCisJCSAgICAobGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9ibG9ja3NfY291bnQpID4KKwkJICAgICBsZTE2X3RvX2NwdShiZXN0X2Rlc2MtPmJnX2ZyZWVfYmxvY2tzX2NvdW50KSkpIHsKKwkJCWJlc3RfZ3JvdXAgPSBncm91cDsKKwkJCWJlc3RfZGVzYyA9IGRlc2M7CisJCX0KKwl9CisJcmV0dXJuIGJlc3RfZ3JvdXA7Cit9CisKKy8qIAorICogT3Jsb3YncyBhbGxvY2F0b3IgZm9yIGRpcmVjdG9yaWVzLiAKKyAqIAorICogV2UgYWx3YXlzIHRyeSB0byBzcHJlYWQgZmlyc3QtbGV2ZWwgZGlyZWN0b3JpZXMuCisgKgorICogSWYgdGhlcmUgYXJlIGJsb2NrZ3JvdXBzIHdpdGggYm90aCBmcmVlIGlub2RlcyBhbmQgZnJlZSBibG9ja3MgY291bnRzIAorICogbm90IHdvcnNlIHRoYW4gYXZlcmFnZSB3ZSByZXR1cm4gb25lIHdpdGggc21hbGxlc3QgZGlyZWN0b3J5IGNvdW50LiAKKyAqIE90aGVyd2lzZSB3ZSBzaW1wbHkgcmV0dXJuIGEgcmFuZG9tIGdyb3VwLiAKKyAqIAorICogRm9yIHRoZSByZXN0IHJ1bGVzIGxvb2sgc286IAorICogCisgKiBJdCdzIE9LIHRvIHB1dCBkaXJlY3RvcnkgaW50byBhIGdyb3VwIHVubGVzcyAKKyAqIGl0IGhhcyB0b28gbWFueSBkaXJlY3RvcmllcyBhbHJlYWR5IChtYXhfZGlycykgb3IgCisgKiBpdCBoYXMgdG9vIGZldyBmcmVlIGlub2RlcyBsZWZ0IChtaW5faW5vZGVzKSBvciAKKyAqIGl0IGhhcyB0b28gZmV3IGZyZWUgYmxvY2tzIGxlZnQgKG1pbl9ibG9ja3MpIG9yIAorICogaXQncyBhbHJlYWR5IHJ1bm5pbmcgdG9vIGxhcmdlIGRlYnQgKG1heF9kZWJ0KS4gCisgKiBQYXJlbnQncyBncm91cCBpcyBwcmVmZXJlZCwgaWYgaXQgZG9lc24ndCBzYXRpc2Z5IHRoZXNlIAorICogY29uZGl0aW9ucyB3ZSBzZWFyY2ggY3ljbGljYWxseSB0aHJvdWdoIHRoZSByZXN0LiBJZiBub25lIAorICogb2YgdGhlIGdyb3VwcyBsb29rIGdvb2Qgd2UganVzdCBsb29rIGZvciBhIGdyb3VwIHdpdGggbW9yZSAKKyAqIGZyZWUgaW5vZGVzIHRoYW4gYXZlcmFnZSAoc3RhcnRpbmcgYXQgcGFyZW50J3MgZ3JvdXApLiAKKyAqIAorICogRGVidCBpcyBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgd2UgYWxsb2NhdGUgYSBkaXJlY3RvcnkgYW5kIGRlY3JlbWVudGVkIAorICogd2hlbiB3ZSBhbGxvY2F0ZSBhbiBpbm9kZSwgd2l0aGluIDAtLTI1NS4gCisgKi8gCisKKyNkZWZpbmUgSU5PREVfQ09TVCA2NAorI2RlZmluZSBCTE9DS19DT1NUIDI1NgorCitzdGF0aWMgaW50IGZpbmRfZ3JvdXBfb3Jsb3Yoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGlub2RlICpwYXJlbnQpCit7CisJaW50IHBhcmVudF9ncm91cCA9IEVYVDNfSShwYXJlbnQpLT5pX2Jsb2NrX2dyb3VwOworCXN0cnVjdCBleHQzX3NiX2luZm8gKnNiaSA9IEVYVDNfU0Ioc2IpOworCXN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICplcyA9IHNiaS0+c19lczsKKwlpbnQgbmdyb3VwcyA9IHNiaS0+c19ncm91cHNfY291bnQ7CisJaW50IGlub2Rlc19wZXJfZ3JvdXAgPSBFWFQzX0lOT0RFU19QRVJfR1JPVVAoc2IpOworCWludCBmcmVlaSwgYXZlZnJlZWk7CisJaW50IGZyZWViLCBhdmVmcmVlYjsKKwlpbnQgYmxvY2tzX3Blcl9kaXIsIG5kaXJzOworCWludCBtYXhfZGVidCwgbWF4X2RpcnMsIG1pbl9ibG9ja3MsIG1pbl9pbm9kZXM7CisJaW50IGdyb3VwID0gLTEsIGk7CisJc3RydWN0IGV4dDNfZ3JvdXBfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCisJZnJlZWkgPSBwZXJjcHVfY291bnRlcl9yZWFkX3Bvc2l0aXZlKCZzYmktPnNfZnJlZWlub2Rlc19jb3VudGVyKTsKKwlhdmVmcmVlaSA9IGZyZWVpIC8gbmdyb3VwczsKKwlmcmVlYiA9IHBlcmNwdV9jb3VudGVyX3JlYWRfcG9zaXRpdmUoJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIpOworCWF2ZWZyZWViID0gZnJlZWIgLyBuZ3JvdXBzOworCW5kaXJzID0gcGVyY3B1X2NvdW50ZXJfcmVhZF9wb3NpdGl2ZSgmc2JpLT5zX2RpcnNfY291bnRlcik7CisKKwlpZiAoKHBhcmVudCA9PSBzYi0+c19yb290LT5kX2lub2RlKSB8fAorCSAgICAoRVhUM19JKHBhcmVudCktPmlfZmxhZ3MgJiBFWFQzX1RPUERJUl9GTCkpIHsKKwkJaW50IGJlc3RfbmRpciA9IGlub2Rlc19wZXJfZ3JvdXA7CisJCWludCBiZXN0X2dyb3VwID0gLTE7CisKKwkJZ2V0X3JhbmRvbV9ieXRlcygmZ3JvdXAsIHNpemVvZihncm91cCkpOworCQlwYXJlbnRfZ3JvdXAgPSAodW5zaWduZWQpZ3JvdXAgJSBuZ3JvdXBzOworCQlmb3IgKGkgPSAwOyBpIDwgbmdyb3VwczsgaSsrKSB7CisJCQlncm91cCA9IChwYXJlbnRfZ3JvdXAgKyBpKSAlIG5ncm91cHM7CisJCQlkZXNjID0gZXh0M19nZXRfZ3JvdXBfZGVzYyAoc2IsIGdyb3VwLCAmYmgpOworCQkJaWYgKCFkZXNjIHx8ICFkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChsZTE2X3RvX2NwdShkZXNjLT5iZ191c2VkX2RpcnNfY291bnQpID49IGJlc3RfbmRpcikKKwkJCQljb250aW51ZTsKKwkJCWlmIChsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCkgPCBhdmVmcmVlaSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCkgPCBhdmVmcmVlYikKKwkJCQljb250aW51ZTsKKwkJCWJlc3RfZ3JvdXAgPSBncm91cDsKKwkJCWJlc3RfbmRpciA9IGxlMTZfdG9fY3B1KGRlc2MtPmJnX3VzZWRfZGlyc19jb3VudCk7CisJCX0KKwkJaWYgKGJlc3RfZ3JvdXAgPj0gMCkKKwkJCXJldHVybiBiZXN0X2dyb3VwOworCQlnb3RvIGZhbGxiYWNrOworCX0KKworCWJsb2Nrc19wZXJfZGlyID0gKGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCkgLSBmcmVlYikgLyBuZGlyczsKKworCW1heF9kaXJzID0gbmRpcnMgLyBuZ3JvdXBzICsgaW5vZGVzX3Blcl9ncm91cCAvIDE2OworCW1pbl9pbm9kZXMgPSBhdmVmcmVlaSAtIGlub2Rlc19wZXJfZ3JvdXAgLyA0OworCW1pbl9ibG9ja3MgPSBhdmVmcmVlYiAtIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYikgLyA0OworCisJbWF4X2RlYnQgPSBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpIC8gbWF4KGJsb2Nrc19wZXJfZGlyLCBCTE9DS19DT1NUKTsKKwlpZiAobWF4X2RlYnQgKiBJTk9ERV9DT1NUID4gaW5vZGVzX3Blcl9ncm91cCkKKwkJbWF4X2RlYnQgPSBpbm9kZXNfcGVyX2dyb3VwIC8gSU5PREVfQ09TVDsKKwlpZiAobWF4X2RlYnQgPiAyNTUpCisJCW1heF9kZWJ0ID0gMjU1OworCWlmIChtYXhfZGVidCA9PSAwKQorCQltYXhfZGVidCA9IDE7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmdyb3VwczsgaSsrKSB7CisJCWdyb3VwID0gKHBhcmVudF9ncm91cCArIGkpICUgbmdyb3VwczsKKwkJZGVzYyA9IGV4dDNfZ2V0X2dyb3VwX2Rlc2MgKHNiLCBncm91cCwgJmJoKTsKKwkJaWYgKCFkZXNjIHx8ICFkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCkKKwkJCWNvbnRpbnVlOworCQlpZiAobGUxNl90b19jcHUoZGVzYy0+YmdfdXNlZF9kaXJzX2NvdW50KSA+PSBtYXhfZGlycykKKwkJCWNvbnRpbnVlOworCQlpZiAobGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpIDwgbWluX2lub2RlcykKKwkJCWNvbnRpbnVlOworCQlpZiAobGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9ibG9ja3NfY291bnQpIDwgbWluX2Jsb2NrcykKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gZ3JvdXA7CisJfQorCitmYWxsYmFjazoKKwlmb3IgKGkgPSAwOyBpIDwgbmdyb3VwczsgaSsrKSB7CisJCWdyb3VwID0gKHBhcmVudF9ncm91cCArIGkpICUgbmdyb3VwczsKKwkJZGVzYyA9IGV4dDNfZ2V0X2dyb3VwX2Rlc2MgKHNiLCBncm91cCwgJmJoKTsKKwkJaWYgKCFkZXNjIHx8ICFkZXNjLT5iZ19mcmVlX2lub2Rlc19jb3VudCkKKwkJCWNvbnRpbnVlOworCQlpZiAobGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpID49IGF2ZWZyZWVpKQorCQkJcmV0dXJuIGdyb3VwOworCX0KKworCWlmIChhdmVmcmVlaSkgeworCQkvKgorCQkgKiBUaGUgZnJlZS1pbm9kZXMgY291bnRlciBpcyBhcHByb3hpbWF0ZSwgYW5kIGZvciByZWFsbHkgc21hbGwKKwkJICogZmlsZXN5c3RlbXMgdGhlIGFib3ZlIHRlc3QgY2FuIGZhaWwgdG8gZmluZCBhbnkgYmxvY2tncm91cHMKKwkJICovCisJCWF2ZWZyZWVpID0gMDsKKwkJZ290byBmYWxsYmFjazsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9ncm91cF9vdGhlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgaW5vZGUgKnBhcmVudCkKK3sKKwlpbnQgcGFyZW50X2dyb3VwID0gRVhUM19JKHBhcmVudCktPmlfYmxvY2tfZ3JvdXA7CisJaW50IG5ncm91cHMgPSBFWFQzX1NCKHNiKS0+c19ncm91cHNfY291bnQ7CisJc3RydWN0IGV4dDNfZ3JvdXBfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWludCBncm91cCwgaTsKKworCS8qCisJICogVHJ5IHRvIHBsYWNlIHRoZSBpbm9kZSBpbiBpdHMgcGFyZW50IGRpcmVjdG9yeQorCSAqLworCWdyb3VwID0gcGFyZW50X2dyb3VwOworCWRlc2MgPSBleHQzX2dldF9ncm91cF9kZXNjIChzYiwgZ3JvdXAsICZiaCk7CisJaWYgKGRlc2MgJiYgbGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpICYmCisJCQlsZTE2X3RvX2NwdShkZXNjLT5iZ19mcmVlX2Jsb2Nrc19jb3VudCkpCisJCXJldHVybiBncm91cDsKKworCS8qCisJICogV2UncmUgZ29pbmcgdG8gcGxhY2UgdGhpcyBpbm9kZSBpbiBhIGRpZmZlcmVudCBibG9ja2dyb3VwIGZyb20gaXRzCisJICogcGFyZW50LiAgV2Ugd2FudCB0byBjYXVzZSBmaWxlcyBpbiBhIGNvbW1vbiBkaXJlY3RvcnkgdG8gYWxsIGxhbmQgaW4KKwkgKiB0aGUgc2FtZSBibG9ja2dyb3VwLiAgQnV0IHdlIHdhbnQgZmlsZXMgd2hpY2ggYXJlIGluIGEgZGlmZmVyZW50CisJICogZGlyZWN0b3J5IHdoaWNoIHNoYXJlcyBhIGJsb2NrZ3JvdXAgd2l0aCBvdXIgcGFyZW50IHRvIGxhbmQgaW4gYQorCSAqIGRpZmZlcmVudCBibG9ja2dyb3VwLgorCSAqCisJICogU28gYWRkIG91ciBkaXJlY3RvcnkncyBpX2lubyBpbnRvIHRoZSBzdGFydGluZyBwb2ludCBmb3IgdGhlIGhhc2guCisJICovCisJZ3JvdXAgPSAoZ3JvdXAgKyBwYXJlbnQtPmlfaW5vKSAlIG5ncm91cHM7CisKKwkvKgorCSAqIFVzZSBhIHF1YWRyYXRpYyBoYXNoIHRvIGZpbmQgYSBncm91cCB3aXRoIGEgZnJlZSBpbm9kZSBhbmQgc29tZSBmcmVlCisJICogYmxvY2tzLgorCSAqLworCWZvciAoaSA9IDE7IGkgPCBuZ3JvdXBzOyBpIDw8PSAxKSB7CisJCWdyb3VwICs9IGk7CisJCWlmIChncm91cCA+PSBuZ3JvdXBzKQorCQkJZ3JvdXAgLT0gbmdyb3VwczsKKwkJZGVzYyA9IGV4dDNfZ2V0X2dyb3VwX2Rlc2MgKHNiLCBncm91cCwgJmJoKTsKKwkJaWYgKGRlc2MgJiYgbGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9pbm9kZXNfY291bnQpICYmCisJCQkJbGUxNl90b19jcHUoZGVzYy0+YmdfZnJlZV9ibG9ja3NfY291bnQpKQorCQkJcmV0dXJuIGdyb3VwOworCX0KKworCS8qCisJICogVGhhdCBmYWlsZWQ6IHRyeSBsaW5lYXIgc2VhcmNoIGZvciBhIGZyZWUgaW5vZGUsIGV2ZW4gaWYgdGhhdCBncm91cAorCSAqIGhhcyBubyBmcmVlIGJsb2Nrcy4KKwkgKi8KKwlncm91cCA9IHBhcmVudF9ncm91cDsKKwlmb3IgKGkgPSAwOyBpIDwgbmdyb3VwczsgaSsrKSB7CisJCWlmICgrK2dyb3VwID49IG5ncm91cHMpCisJCQlncm91cCA9IDA7CisJCWRlc2MgPSBleHQzX2dldF9ncm91cF9kZXNjIChzYiwgZ3JvdXAsICZiaCk7CisJCWlmIChkZXNjICYmIGxlMTZfdG9fY3B1KGRlc2MtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KSkKKwkJCXJldHVybiBncm91cDsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBUaGVyZSBhcmUgdHdvIHBvbGljaWVzIGZvciBhbGxvY2F0aW5nIGFuIGlub2RlLiAgSWYgdGhlIG5ldyBpbm9kZSBpcworICogYSBkaXJlY3RvcnksIHRoZW4gYSBmb3J3YXJkIHNlYXJjaCBpcyBtYWRlIGZvciBhIGJsb2NrIGdyb3VwIHdpdGggYm90aAorICogZnJlZSBzcGFjZSBhbmQgYSBsb3cgZGlyZWN0b3J5LXRvLWlub2RlIHJhdGlvOyBpZiB0aGF0IGZhaWxzLCB0aGVuIG9mCisgKiB0aGUgZ3JvdXBzIHdpdGggYWJvdmUtYXZlcmFnZSBmcmVlIHNwYWNlLCB0aGF0IGdyb3VwIHdpdGggdGhlIGZld2VzdAorICogZGlyZWN0b3JpZXMgYWxyZWFkeSBpcyBjaG9zZW4uCisgKgorICogRm9yIG90aGVyIGlub2Rlcywgc2VhcmNoIGZvcndhcmQgZnJvbSB0aGUgcGFyZW50IGRpcmVjdG9yeSdzIGJsb2NrCisgKiBncm91cCB0byBmaW5kIGEgZnJlZSBpbm9kZS4KKyAqLworc3RydWN0IGlub2RlICpleHQzX25ld19pbm9kZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKiBkaXIsIGludCBtb2RlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmggPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgyOworCWludCBncm91cDsKKwl1bnNpZ25lZCBsb25nIGlubyA9IDA7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJc3RydWN0IGV4dDNfZ3JvdXBfZGVzYyAqIGdkcCA9IE5VTEw7CisJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKiBlczsKKwlzdHJ1Y3QgZXh0M19pbm9kZV9pbmZvICplaTsKKwlzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmk7CisJaW50IGVyciA9IDA7CisJc3RydWN0IGlub2RlICpyZXQ7CisJaW50IGk7CisKKwkvKiBDYW5ub3QgY3JlYXRlIGZpbGVzIGluIGEgZGVsZXRlZCBkaXJlY3RvcnkgKi8KKwlpZiAoIWRpciB8fCAhZGlyLT5pX25saW5rKQorCQlyZXR1cm4gRVJSX1BUUigtRVBFUk0pOworCisJc2IgPSBkaXItPmlfc2I7CisJaW5vZGUgPSBuZXdfaW5vZGUoc2IpOworCWlmICghaW5vZGUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWVpID0gRVhUM19JKGlub2RlKTsKKworCXNiaSA9IEVYVDNfU0Ioc2IpOworCWVzID0gc2JpLT5zX2VzOworCWlmIChTX0lTRElSKG1vZGUpKSB7CisJCWlmICh0ZXN0X29wdCAoc2IsIE9MREFMTE9DKSkKKwkJCWdyb3VwID0gZmluZF9ncm91cF9kaXIoc2IsIGRpcik7CisJCWVsc2UKKwkJCWdyb3VwID0gZmluZF9ncm91cF9vcmxvdihzYiwgZGlyKTsKKwl9IGVsc2UgCisJCWdyb3VwID0gZmluZF9ncm91cF9vdGhlcihzYiwgZGlyKTsKKworCWVyciA9IC1FTk9TUEM7CisJaWYgKGdyb3VwID09IC0xKQorCQlnb3RvIG91dDsKKworCWZvciAoaSA9IDA7IGkgPCBzYmktPnNfZ3JvdXBzX2NvdW50OyBpKyspIHsKKwkJZXJyID0gLUVJTzsKKworCQlnZHAgPSBleHQzX2dldF9ncm91cF9kZXNjKHNiLCBncm91cCwgJmJoMik7CisJCWlmICghZ2RwKQorCQkJZ290byBmYWlsOworCisJCWJyZWxzZShiaXRtYXBfYmgpOworCQliaXRtYXBfYmggPSByZWFkX2lub2RlX2JpdG1hcChzYiwgZ3JvdXApOworCQlpZiAoIWJpdG1hcF9iaCkKKwkJCWdvdG8gZmFpbDsKKworCQlpbm8gPSAwOworCityZXBlYXRfaW5fdGhpc19ncm91cDoKKwkJaW5vID0gZXh0M19maW5kX25leHRfemVyb19iaXQoKHVuc2lnbmVkIGxvbmcgKikKKwkJCQliaXRtYXBfYmgtPmJfZGF0YSwgRVhUM19JTk9ERVNfUEVSX0dST1VQKHNiKSwgaW5vKTsKKwkJaWYgKGlubyA8IEVYVDNfSU5PREVTX1BFUl9HUk9VUChzYikpIHsKKworCQkJQlVGRkVSX1RSQUNFKGJpdG1hcF9iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwkJCWVyciA9IGV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYml0bWFwX2JoKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBmYWlsOworCisJCQlpZiAoIWV4dDNfc2V0X2JpdF9hdG9taWMoc2JfYmdsX2xvY2soc2JpLCBncm91cCksCisJCQkJCQlpbm8sIGJpdG1hcF9iaC0+Yl9kYXRhKSkgeworCQkJCS8qIHdlIHdvbiBpdCAqLworCQkJCUJVRkZFUl9UUkFDRShiaXRtYXBfYmgsCisJCQkJCSJjYWxsIGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOworCQkJCWVyciA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsCisJCQkJCQkJCWJpdG1hcF9iaCk7CisJCQkJaWYgKGVycikKKwkJCQkJZ290byBmYWlsOworCQkJCWdvdG8gZ290OworCQkJfQorCQkJLyogd2UgbG9zdCBpdCAqLworCQkJam91cm5hbF9yZWxlYXNlX2J1ZmZlcihoYW5kbGUsIGJpdG1hcF9iaCk7CisKKwkJCWlmICgrK2lubyA8IEVYVDNfSU5PREVTX1BFUl9HUk9VUChzYikpCisJCQkJZ290byByZXBlYXRfaW5fdGhpc19ncm91cDsKKwkJfQorCisJCS8qCisJCSAqIFRoaXMgY2FzZSBpcyBwb3NzaWJsZSBpbiBjb25jdXJyZW50IGVudmlyb25tZW50LiAgSXQgaXMgdmVyeQorCQkgKiByYXJlLiAgV2UgY2Fubm90IHJlcGVhdCB0aGUgZmluZF9ncm91cF94eHgoKSBjYWxsIGJlY2F1c2UKKwkJICogdGhhdCB3aWxsIHNpbXBseSByZXR1cm4gdGhlIHNhbWUgYmxvY2tncm91cCwgYmVjYXVzZSB0aGUKKwkJICogZ3JvdXAgZGVzY3JpcHRvciBtZXRhZGF0YSBoYXMgbm90IHlldCBiZWVuIHVwZGF0ZWQuCisJCSAqIFNvIHdlIGp1c3QgZ28gb250byB0aGUgbmV4dCBibG9ja2dyb3VwLgorCQkgKi8KKwkJaWYgKCsrZ3JvdXAgPT0gc2JpLT5zX2dyb3Vwc19jb3VudCkKKwkJCWdyb3VwID0gMDsKKwl9CisJZXJyID0gLUVOT1NQQzsKKwlnb3RvIG91dDsKKworZ290OgorCWlubyArPSBncm91cCAqIEVYVDNfSU5PREVTX1BFUl9HUk9VUChzYikgKyAxOworCWlmIChpbm8gPCBFWFQzX0ZJUlNUX0lOTyhzYikgfHwgaW5vID4gbGUzMl90b19jcHUoZXMtPnNfaW5vZGVzX2NvdW50KSkgeworCQlleHQzX2Vycm9yIChzYiwgImV4dDNfbmV3X2lub2RlIiwKKwkJCSAgICAicmVzZXJ2ZWQgaW5vZGUgb3IgaW5vZGUgPiBpbm9kZXMgY291bnQgLSAiCisJCQkgICAgImJsb2NrX2dyb3VwID0gJWQsIGlub2RlPSVsdSIsIGdyb3VwLCBpbm8pOworCQllcnIgPSAtRUlPOworCQlnb3RvIGZhaWw7CisJfQorCisJQlVGRkVSX1RSQUNFKGJoMiwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwllcnIgPSBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoMik7CisJaWYgKGVycikgZ290byBmYWlsOworCXNwaW5fbG9jayhzYl9iZ2xfbG9jayhzYmksIGdyb3VwKSk7CisJZ2RwLT5iZ19mcmVlX2lub2Rlc19jb3VudCA9CisJCWNwdV90b19sZTE2KGxlMTZfdG9fY3B1KGdkcC0+YmdfZnJlZV9pbm9kZXNfY291bnQpIC0gMSk7CisJaWYgKFNfSVNESVIobW9kZSkpIHsKKwkJZ2RwLT5iZ191c2VkX2RpcnNfY291bnQgPQorCQkJY3B1X3RvX2xlMTYobGUxNl90b19jcHUoZ2RwLT5iZ191c2VkX2RpcnNfY291bnQpICsgMSk7CisJfQorCXNwaW5fdW5sb2NrKHNiX2JnbF9sb2NrKHNiaSwgZ3JvdXApKTsKKwlCVUZGRVJfVFJBQ0UoYmgyLCAiY2FsbCBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEiKTsKKwllcnIgPSBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaDIpOworCWlmIChlcnIpIGdvdG8gZmFpbDsKKworCXBlcmNwdV9jb3VudGVyX2RlYygmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlcik7CisJaWYgKFNfSVNESVIobW9kZSkpCisJCXBlcmNwdV9jb3VudGVyX2luYygmc2JpLT5zX2RpcnNfY291bnRlcik7CisJc2ItPnNfZGlydCA9IDE7CisKKwlpbm9kZS0+aV91aWQgPSBjdXJyZW50LT5mc3VpZDsKKwlpZiAodGVzdF9vcHQgKHNiLCBHUlBJRCkpCisJCWlub2RlLT5pX2dpZCA9IGRpci0+aV9naWQ7CisJZWxzZSBpZiAoZGlyLT5pX21vZGUgJiBTX0lTR0lEKSB7CisJCWlub2RlLT5pX2dpZCA9IGRpci0+aV9naWQ7CisJCWlmIChTX0lTRElSKG1vZGUpKQorCQkJbW9kZSB8PSBTX0lTR0lEOworCX0gZWxzZQorCQlpbm9kZS0+aV9naWQgPSBjdXJyZW50LT5mc2dpZDsKKwlpbm9kZS0+aV9tb2RlID0gbW9kZTsKKworCWlub2RlLT5pX2lubyA9IGlubzsKKwkvKiBUaGlzIGlzIHRoZSBvcHRpbWFsIElPIHNpemUgKGZvciBzdGF0KSwgbm90IHRoZSBmcyBibG9jayBzaXplICovCisJaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfU0laRTsKKwlpbm9kZS0+aV9ibG9ja3MgPSAwOworCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisKKwltZW1zZXQoZWktPmlfZGF0YSwgMCwgc2l6ZW9mKGVpLT5pX2RhdGEpKTsKKwllaS0+aV9kaXJfc3RhcnRfbG9va3VwID0gMDsKKwllaS0+aV9kaXNrc2l6ZSA9IDA7CisKKwllaS0+aV9mbGFncyA9IEVYVDNfSShkaXIpLT5pX2ZsYWdzICYgfkVYVDNfSU5ERVhfRkw7CisJaWYgKFNfSVNMTksobW9kZSkpCisJCWVpLT5pX2ZsYWdzICY9IH4oRVhUM19JTU1VVEFCTEVfRkx8RVhUM19BUFBFTkRfRkwpOworCS8qIGRpcnN5bmMgb25seSBhcHBsaWVzIHRvIGRpcmVjdG9yaWVzICovCisJaWYgKCFTX0lTRElSKG1vZGUpKQorCQllaS0+aV9mbGFncyAmPSB+RVhUM19ESVJTWU5DX0ZMOworI2lmZGVmIEVYVDNfRlJBR01FTlRTCisJZWktPmlfZmFkZHIgPSAwOworCWVpLT5pX2ZyYWdfbm8gPSAwOworCWVpLT5pX2ZyYWdfc2l6ZSA9IDA7CisjZW5kaWYKKwllaS0+aV9maWxlX2FjbCA9IDA7CisJZWktPmlfZGlyX2FjbCA9IDA7CisJZWktPmlfZHRpbWUgPSAwOworCWVpLT5pX2Jsb2NrX2FsbG9jX2luZm8gPSBOVUxMOworCWVpLT5pX2Jsb2NrX2dyb3VwID0gZ3JvdXA7CisKKwlleHQzX3NldF9pbm9kZV9mbGFncyhpbm9kZSk7CisJaWYgKElTX0RJUlNZTkMoaW5vZGUpKQorCQloYW5kbGUtPmhfc3luYyA9IDE7CisJaW5zZXJ0X2lub2RlX2hhc2goaW5vZGUpOworCXNwaW5fbG9jaygmc2JpLT5zX25leHRfZ2VuX2xvY2spOworCWlub2RlLT5pX2dlbmVyYXRpb24gPSBzYmktPnNfbmV4dF9nZW5lcmF0aW9uKys7CisJc3Bpbl91bmxvY2soJnNiaS0+c19uZXh0X2dlbl9sb2NrKTsKKworCWVpLT5pX3N0YXRlID0gRVhUM19TVEFURV9ORVc7CisJZWktPmlfZXh0cmFfaXNpemUgPQorCQkoRVhUM19JTk9ERV9TSVpFKGlub2RlLT5pX3NiKSA+IEVYVDNfR09PRF9PTERfSU5PREVfU0laRSkgPworCQlzaXplb2Yoc3RydWN0IGV4dDNfaW5vZGUpIC0gRVhUM19HT09EX09MRF9JTk9ERV9TSVpFIDogMDsKKworCXJldCA9IGlub2RlOworCWlmKERRVU9UX0FMTE9DX0lOT0RFKGlub2RlKSkgeworCQlEUVVPVF9EUk9QKGlub2RlKTsKKwkJZXJyID0gLUVEUVVPVDsKKwkJZ290byBmYWlsMjsKKwl9CisJZXJyID0gZXh0M19pbml0X2FjbChoYW5kbGUsIGlub2RlLCBkaXIpOworCWlmIChlcnIpIHsKKwkJRFFVT1RfRlJFRV9JTk9ERShpbm9kZSk7CisJCWdvdG8gZmFpbDI7CisgIAl9CisJZXJyID0gZXh0M19tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOworCWlmIChlcnIpIHsKKwkJZXh0M19zdGRfZXJyb3Ioc2IsIGVycik7CisJCURRVU9UX0ZSRUVfSU5PREUoaW5vZGUpOworCQlnb3RvIGZhaWwyOworCX0KKworCWV4dDNfZGVidWcoImFsbG9jYXRpbmcgaW5vZGUgJWx1XG4iLCBpbm9kZS0+aV9pbm8pOworCWdvdG8gcmVhbGx5X291dDsKK2ZhaWw6CisJZXh0M19zdGRfZXJyb3Ioc2IsIGVycik7CitvdXQ6CisJaXB1dChpbm9kZSk7CisJcmV0ID0gRVJSX1BUUihlcnIpOworcmVhbGx5X291dDoKKwlicmVsc2UoYml0bWFwX2JoKTsKKwlyZXR1cm4gcmV0OworCitmYWlsMjoKKwlpbm9kZS0+aV9mbGFncyB8PSBTX05PUVVPVEE7CisJaW5vZGUtPmlfbmxpbmsgPSAwOworCWlwdXQoaW5vZGUpOworCWJyZWxzZShiaXRtYXBfYmgpOworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKKy8qIFZlcmlmeSB0aGF0IHdlIGFyZSBsb2FkaW5nIGEgdmFsaWQgb3JwaGFuIGZyb20gZGlzayAqLworc3RydWN0IGlub2RlICpleHQzX29ycGhhbl9nZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbG9uZyBpbm8pCit7CisJdW5zaWduZWQgbG9uZyBtYXhfaW5vID0gbGUzMl90b19jcHUoRVhUM19TQihzYiktPnNfZXMtPnNfaW5vZGVzX2NvdW50KTsKKwl1bnNpZ25lZCBsb25nIGJsb2NrX2dyb3VwOworCWludCBiaXQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmggPSBOVUxMOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOworCisJLyogRXJyb3IgY2FzZXMgLSBlMmZzY2sgaGFzIGFscmVhZHkgY2xlYW5lZCB1cCBmb3IgdXMgKi8KKwlpZiAoaW5vID4gbWF4X2lubykgeworCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgImJhZCBvcnBoYW4gaW5vICVsdSEgIGUyZnNjayB3YXMgcnVuP1xuIiwgaW5vKTsKKwkJZ290byBvdXQ7CisJfQorCisJYmxvY2tfZ3JvdXAgPSAoaW5vIC0gMSkgLyBFWFQzX0lOT0RFU19QRVJfR1JPVVAoc2IpOworCWJpdCA9IChpbm8gLSAxKSAlIEVYVDNfSU5PREVTX1BFUl9HUk9VUChzYik7CisJYml0bWFwX2JoID0gcmVhZF9pbm9kZV9iaXRtYXAoc2IsIGJsb2NrX2dyb3VwKTsKKwlpZiAoIWJpdG1hcF9iaCkgeworCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgImlub2RlIGJpdG1hcCBlcnJvciBmb3Igb3JwaGFuICVsdVxuIiwgaW5vKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogSGF2aW5nIHRoZSBpbm9kZSBiaXQgc2V0IHNob3VsZCBiZSBhIDEwMCUgaW5kaWNhdG9yIHRoYXQgdGhpcworCSAqIGlzIGEgdmFsaWQgb3JwaGFuIChubyBlMmZzY2sgcnVuIG9uIGZzKS4gIE9ycGhhbnMgYWxzbyBpbmNsdWRlCisJICogaW5vZGVzIHRoYXQgd2VyZSBiZWluZyB0cnVuY2F0ZWQsIHNvIHdlIGNhbid0IGNoZWNrIGlfbmxpbms9PTAuCisJICovCisJaWYgKCFleHQzX3Rlc3RfYml0KGJpdCwgYml0bWFwX2JoLT5iX2RhdGEpIHx8CisJCQkhKGlub2RlID0gaWdldChzYiwgaW5vKSkgfHwgaXNfYmFkX2lub2RlKGlub2RlKSB8fAorCQkJTkVYVF9PUlBIQU4oaW5vZGUpID4gbWF4X2lubykgeworCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgImJhZCBvcnBoYW4gaW5vZGUgJWx1ISAgZTJmc2NrIHdhcyBydW4/XG4iLCBpbm8pOworCQlwcmludGsoS0VSTl9OT1RJQ0UgImV4dDNfdGVzdF9iaXQoYml0PSVkLCBibG9jaz0lbGx1KSA9ICVkXG4iLAorCQkgICAgICAgYml0LCAodW5zaWduZWQgbG9uZyBsb25nKWJpdG1hcF9iaC0+Yl9ibG9ja25yLAorCQkgICAgICAgZXh0M190ZXN0X2JpdChiaXQsIGJpdG1hcF9iaC0+Yl9kYXRhKSk7CisJCXByaW50ayhLRVJOX05PVElDRSAiaW5vZGU9JXBcbiIsIGlub2RlKTsKKwkJaWYgKGlub2RlKSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgImlzX2JhZF9pbm9kZShpbm9kZSk9JWRcbiIsCisJCQkgICAgICAgaXNfYmFkX2lub2RlKGlub2RlKSk7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIk5FWFRfT1JQSEFOKGlub2RlKT0ldVxuIiwKKwkJCSAgICAgICBORVhUX09SUEhBTihpbm9kZSkpOworCQkJcHJpbnRrKEtFUk5fTk9USUNFICJtYXhfaW5vPSVsdVxuIiwgbWF4X2lubyk7CisJCX0KKwkJLyogQXZvaWQgZnJlZWluZyBibG9ja3MgaWYgd2UgZ290IGEgYmFkIGRlbGV0ZWQgaW5vZGUgKi8KKwkJaWYgKGlub2RlICYmIGlub2RlLT5pX25saW5rID09IDApCisJCQlpbm9kZS0+aV9ibG9ja3MgPSAwOworCQlpcHV0KGlub2RlKTsKKwkJaW5vZGUgPSBOVUxMOworCX0KK291dDoKKwlicmVsc2UoYml0bWFwX2JoKTsKKwlyZXR1cm4gaW5vZGU7Cit9CisKK3Vuc2lnbmVkIGxvbmcgZXh0M19jb3VudF9mcmVlX2lub2RlcyAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpCit7CisJdW5zaWduZWQgbG9uZyBkZXNjX2NvdW50OworCXN0cnVjdCBleHQzX2dyb3VwX2Rlc2MgKmdkcDsKKwlpbnQgaTsKKyNpZmRlZiBFWFQzRlNfREVCVUcKKwlzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqZXM7CisJdW5zaWduZWQgbG9uZyBiaXRtYXBfY291bnQsIHg7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmggPSBOVUxMOworCisJbG9ja19zdXBlciAoc2IpOworCWVzID0gRVhUM19TQihzYiktPnNfZXM7CisJZGVzY19jb3VudCA9IDA7CisJYml0bWFwX2NvdW50ID0gMDsKKwlnZHAgPSBOVUxMOworCWZvciAoaSA9IDA7IGkgPCBFWFQzX1NCKHNiKS0+c19ncm91cHNfY291bnQ7IGkrKykgeworCQlnZHAgPSBleHQzX2dldF9ncm91cF9kZXNjIChzYiwgaSwgTlVMTCk7CisJCWlmICghZ2RwKQorCQkJY29udGludWU7CisJCWRlc2NfY291bnQgKz0gbGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2lub2Rlc19jb3VudCk7CisJCWJyZWxzZShiaXRtYXBfYmgpOworCQliaXRtYXBfYmggPSByZWFkX2lub2RlX2JpdG1hcChzYiwgaSk7CisJCWlmICghYml0bWFwX2JoKQorCQkJY29udGludWU7CisKKwkJeCA9IGV4dDNfY291bnRfZnJlZShiaXRtYXBfYmgsIEVYVDNfSU5PREVTX1BFUl9HUk9VUChzYikgLyA4KTsKKwkJcHJpbnRrKCJncm91cCAlZDogc3RvcmVkID0gJWQsIGNvdW50ZWQgPSAlbHVcbiIsCisJCQlpLCBsZTE2X3RvX2NwdShnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KSwgeCk7CisJCWJpdG1hcF9jb3VudCArPSB4OworCX0KKwlicmVsc2UoYml0bWFwX2JoKTsKKwlwcmludGsoImV4dDNfY291bnRfZnJlZV9pbm9kZXM6IHN0b3JlZCA9ICV1LCBjb21wdXRlZCA9ICVsdSwgJWx1XG4iLAorCQlsZTMyX3RvX2NwdShlcy0+c19mcmVlX2lub2Rlc19jb3VudCksIGRlc2NfY291bnQsIGJpdG1hcF9jb3VudCk7CisJdW5sb2NrX3N1cGVyKHNiKTsKKwlyZXR1cm4gZGVzY19jb3VudDsKKyNlbHNlCisJZGVzY19jb3VudCA9IDA7CisJZm9yIChpID0gMDsgaSA8IEVYVDNfU0Ioc2IpLT5zX2dyb3Vwc19jb3VudDsgaSsrKSB7CisJCWdkcCA9IGV4dDNfZ2V0X2dyb3VwX2Rlc2MgKHNiLCBpLCBOVUxMKTsKKwkJaWYgKCFnZHApCisJCQljb250aW51ZTsKKwkJZGVzY19jb3VudCArPSBsZTE2X3RvX2NwdShnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KTsKKwkJY29uZF9yZXNjaGVkKCk7CisJfQorCXJldHVybiBkZXNjX2NvdW50OworI2VuZGlmCit9CisKKy8qIENhbGxlZCBhdCBtb3VudC10aW1lLCBzdXBlci1ibG9jayBpcyBsb2NrZWQgKi8KK3Vuc2lnbmVkIGxvbmcgZXh0M19jb3VudF9kaXJzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYikKK3sKKwl1bnNpZ25lZCBsb25nIGNvdW50ID0gMDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBFWFQzX1NCKHNiKS0+c19ncm91cHNfY291bnQ7IGkrKykgeworCQlzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICpnZHAgPSBleHQzX2dldF9ncm91cF9kZXNjIChzYiwgaSwgTlVMTCk7CisJCWlmICghZ2RwKQorCQkJY29udGludWU7CisJCWNvdW50ICs9IGxlMTZfdG9fY3B1KGdkcC0+YmdfdXNlZF9kaXJzX2NvdW50KTsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCisjaWZkZWYgQ09ORklHX0VYVDNfQ0hFQ0sKKy8qIENhbGxlZCBhdCBtb3VudC10aW1lLCBzdXBlci1ibG9jayBpcyBsb2NrZWQgKi8KK3ZvaWQgZXh0M19jaGVja19pbm9kZXNfYml0bWFwIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYikKK3sKKwlzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqIGVzOworCXVuc2lnbmVkIGxvbmcgZGVzY19jb3VudCwgYml0bWFwX2NvdW50LCB4OworCXN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoID0gTlVMTDsKKwlzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICogZ2RwOworCWludCBpOworCisJZXMgPSBFWFQzX1NCKHNiKS0+c19lczsKKwlkZXNjX2NvdW50ID0gMDsKKwliaXRtYXBfY291bnQgPSAwOworCWdkcCA9IE5VTEw7CisJZm9yIChpID0gMDsgaSA8IEVYVDNfU0Ioc2IpLT5zX2dyb3Vwc19jb3VudDsgaSsrKSB7CisJCWdkcCA9IGV4dDNfZ2V0X2dyb3VwX2Rlc2MgKHNiLCBpLCBOVUxMKTsKKwkJaWYgKCFnZHApCisJCQljb250aW51ZTsKKwkJZGVzY19jb3VudCArPSBsZTE2X3RvX2NwdShnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50KTsKKwkJYnJlbHNlKGJpdG1hcF9iaCk7CisJCWJpdG1hcF9iaCA9IHJlYWRfaW5vZGVfYml0bWFwKHNiLCBpKTsKKwkJaWYgKCFiaXRtYXBfYmgpCisJCQljb250aW51ZTsKKworCQl4ID0gZXh0M19jb3VudF9mcmVlKGJpdG1hcF9iaCwgRVhUM19JTk9ERVNfUEVSX0dST1VQKHNiKSAvIDgpOworCQlpZiAobGUxNl90b19jcHUoZ2RwLT5iZ19mcmVlX2lub2Rlc19jb3VudCkgIT0geCkKKwkJCWV4dDNfZXJyb3IgKHNiLCAiZXh0M19jaGVja19pbm9kZXNfYml0bWFwIiwKKwkJCQkgICAgIldyb25nIGZyZWUgaW5vZGVzIGNvdW50IGluIGdyb3VwICVkLCAiCisJCQkJICAgICJzdG9yZWQgPSAlZCwgY291bnRlZCA9ICVsdSIsIGksCisJCQkJICAgIGxlMTZfdG9fY3B1KGdkcC0+YmdfZnJlZV9pbm9kZXNfY291bnQpLCB4KTsKKwkJYml0bWFwX2NvdW50ICs9IHg7CisJfQorCWJyZWxzZShiaXRtYXBfYmgpOworCWlmIChsZTMyX3RvX2NwdShlcy0+c19mcmVlX2lub2Rlc19jb3VudCkgIT0gYml0bWFwX2NvdW50KQorCQlleHQzX2Vycm9yIChzYiwgImV4dDNfY2hlY2tfaW5vZGVzX2JpdG1hcCIsCisJCQkgICAgIldyb25nIGZyZWUgaW5vZGVzIGNvdW50IGluIHN1cGVyIGJsb2NrLCAiCisJCQkgICAgInN0b3JlZCA9ICVsdSwgY291bnRlZCA9ICVsdSIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpbGUzMl90b19jcHUoZXMtPnNfZnJlZV9pbm9kZXNfY291bnQpLAorCQkJICAgIGJpdG1hcF9jb3VudCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvaW5vZGUuYyBiL2ZzL2V4dDMvaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDBlYjI4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0My9pbm9kZS5jCkBAIC0wLDAgKzEsMzEzMiBAQAorLyoKKyAqICBsaW51eC9mcy9leHQzL2lub2RlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUKKyAqIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKKyAqIExhYm9yYXRvaXJlIE1BU0kgLSBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogIGZyb20KKyAqCisgKiAgbGludXgvZnMvbWluaXgvaW5vZGUuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKgorICogIEdvYWwtZGlyZWN0ZWQgYmxvY2sgYWxsb2NhdGlvbiBieSBTdGVwaGVuIFR3ZWVkaWUKKyAqIAkoc2N0QHJlZGhhdC5jb20pLCAxOTkzLCAxOTk4CisgKiAgQmlnLWVuZGlhbiB0byBsaXR0bGUtZW5kaWFuIGJ5dGUtc3dhcHBpbmcvYml0bWFwcyBieQorICogICAgICAgIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSksIDE5OTUKKyAqICA2NC1iaXQgZmlsZSBzdXBwb3J0IG9uIDY0LWJpdCBwbGF0Zm9ybXMgYnkgSmFrdWIgSmVsaW5laworICogCShqakBzdW5zaXRlLm1zLm1mZi5jdW5pLmN6KQorICoKKyAqICBBc3NvcnRlZCByYWNlIGZpeGVzLCByZXdyaXRlIG9mIGV4dDNfZ2V0X2Jsb2NrKCkgYnkgQWwgVmlybywgMjAwMAorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHQzX2piZC5oPgorI2luY2x1ZGUgPGxpbnV4L2piZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaHVpZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CisjaW5jbHVkZSA8bGludXgvbXBhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KKyNpbmNsdWRlICJ4YXR0ci5oIgorI2luY2x1ZGUgImFjbC5oIgorCitzdGF0aWMgaW50IGV4dDNfd3JpdGVwYWdlX3RyYW5zX2Jsb2NrcyhzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKKworLyoKKyAqIFRlc3Qgd2hldGhlciBhbiBpbm9kZSBpcyBhIGZhc3Qgc3ltbGluay4KKyAqLworc3RhdGljIGlubGluZSBpbnQgZXh0M19pbm9kZV9pc19mYXN0X3N5bWxpbmsoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpbnQgZWFfYmxvY2tzID0gRVhUM19JKGlub2RlKS0+aV9maWxlX2FjbCA/CisJCShpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgPj4gOSkgOiAwOworCisJcmV0dXJuIChTX0lTTE5LKGlub2RlLT5pX21vZGUpICYmCisJCWlub2RlLT5pX2Jsb2NrcyAtIGVhX2Jsb2NrcyA9PSAwKTsKK30KKworLyogVGhlIGV4dDMgZm9yZ2V0IGZ1bmN0aW9uIG11c3QgcGVyZm9ybSBhIHJldm9rZSBpZiB3ZSBhcmUgZnJlZWluZyBkYXRhCisgKiB3aGljaCBoYXMgYmVlbiBqb3VybmFsZWQuICBNZXRhZGF0YSAoZWcuIGluZGlyZWN0IGJsb2NrcykgbXVzdCBiZQorICogcmV2b2tlZCBpbiBhbGwgY2FzZXMuIAorICoKKyAqICJiaCIgbWF5IGJlIE5VTEw6IGEgbWV0YWRhdGEgYmxvY2sgbWF5IGhhdmUgYmVlbiBmcmVlZCBmcm9tIG1lbW9yeQorICogYnV0IHRoZXJlIG1heSBzdGlsbCBiZSBhIHJlY29yZCBvZiBpdCBpbiB0aGUgam91cm5hbCwgYW5kIHRoYXQgcmVjb3JkCisgKiBzdGlsbCBuZWVkcyB0byBiZSByZXZva2VkLgorICovCisKK2ludCBleHQzX2ZvcmdldChoYW5kbGVfdCAqaGFuZGxlLCBpbnQgaXNfbWV0YWRhdGEsCisJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAorCQkgICAgICAgaW50IGJsb2NrbnIpCit7CisJaW50IGVycjsKKworCW1pZ2h0X3NsZWVwKCk7CisKKwlCVUZGRVJfVFJBQ0UoYmgsICJlbnRlciIpOworCisJamJkX2RlYnVnKDQsICJmb3JnZXR0aW5nIGJoICVwOiBpc19tZXRhZGF0YSA9ICVkLCBtb2RlICVvLCAiCisJCSAgImRhdGEgbW9kZSAlbHhcbiIsCisJCSAgYmgsIGlzX21ldGFkYXRhLCBpbm9kZS0+aV9tb2RlLAorCQkgIHRlc3Rfb3B0KGlub2RlLT5pX3NiLCBEQVRBX0ZMQUdTKSk7CisKKwkvKiBOZXZlciB1c2UgdGhlIHJldm9rZSBmdW5jdGlvbiBpZiB3ZSBhcmUgZG9pbmcgZnVsbCBkYXRhCisJICogam91cm5hbGluZzogdGhlcmUgaXMgbm8gbmVlZCB0bywgYW5kIGEgVjEgc3VwZXJibG9jayB3b24ndAorCSAqIHN1cHBvcnQgaXQuICBPdGhlcndpc2UsIG9ubHkgc2tpcCB0aGUgcmV2b2tlIG9uIHVuLWpvdXJuYWxlZAorCSAqIGRhdGEgYmxvY2tzLiAqLworCisJaWYgKHRlc3Rfb3B0KGlub2RlLT5pX3NiLCBEQVRBX0ZMQUdTKSA9PSBFWFQzX01PVU5UX0pPVVJOQUxfREFUQSB8fAorCSAgICAoIWlzX21ldGFkYXRhICYmICFleHQzX3Nob3VsZF9qb3VybmFsX2RhdGEoaW5vZGUpKSkgeworCQlpZiAoYmgpIHsKKwkJCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgam91cm5hbF9mb3JnZXQiKTsKKwkJCXJldHVybiBleHQzX2pvdXJuYWxfZm9yZ2V0KGhhbmRsZSwgYmgpOworCQl9CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogZGF0YSE9am91cm5hbCAmJiAoaXNfbWV0YWRhdGEgfHwgc2hvdWxkX2pvdXJuYWxfZGF0YShpbm9kZSkpCisJICovCisJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBleHQzX2pvdXJuYWxfcmV2b2tlIik7CisJZXJyID0gZXh0M19qb3VybmFsX3Jldm9rZShoYW5kbGUsIGJsb2NrbnIsIGJoKTsKKwlpZiAoZXJyKQorCQlleHQzX2Fib3J0KGlub2RlLT5pX3NiLCBfX0ZVTkNUSU9OX18sCisJCQkgICAiZXJyb3IgJWQgd2hlbiBhdHRlbXB0aW5nIHJldm9rZSIsIGVycik7CisJQlVGRkVSX1RSQUNFKGJoLCAiZXhpdCIpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBXb3JrIG91dCBob3cgbWFueSBibG9ja3Mgd2UgbmVlZCB0byBwcm9ncmVzcyB3aXRoIHRoZSBuZXh0IGNodW5rIG9mIGEKKyAqIHRydW5jYXRlIHRyYW5zYWN0aW9uLgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGJsb2Nrc19mb3JfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSkgCit7CisJdW5zaWduZWQgbG9uZyBuZWVkZWQ7CisKKwluZWVkZWQgPSBpbm9kZS0+aV9ibG9ja3MgPj4gKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gOSk7CisKKwkvKiBHaXZlIG91cnNlbHZlcyBqdXN0IGVub3VnaCByb29tIHRvIGNvcGUgd2l0aCBpbm9kZXMgaW4gd2hpY2gKKwkgKiBpX2Jsb2NrcyBpcyBjb3JydXB0OiB3ZSd2ZSBzZWVuIGRpc2sgY29ycnVwdGlvbnMgaW4gdGhlIHBhc3QKKwkgKiB3aGljaCByZXN1bHRlZCBpbiByYW5kb20gZGF0YSBpbiBhbiBpbm9kZSB3aGljaCBsb29rZWQgZW5vdWdoCisJICogbGlrZSBhIHJlZ3VsYXIgZmlsZSBmb3IgZXh0MyB0byB0cnkgdG8gZGVsZXRlIGl0LiAgVGhpbmdzCisJICogd2lsbCBnbyBhIGJpdCBjcmF6eSBpZiB0aGF0IGhhcHBlbnMsIGJ1dCBhdCBsZWFzdCB3ZSBzaG91bGQKKwkgKiB0cnkgbm90IHRvIHBhbmljIHRoZSB3aG9sZSBrZXJuZWwuICovCisJaWYgKG5lZWRlZCA8IDIpCisJCW5lZWRlZCA9IDI7CisKKwkvKiBCdXQgd2UgbmVlZCB0byBib3VuZCB0aGUgdHJhbnNhY3Rpb24gc28gd2UgZG9uJ3Qgb3ZlcmZsb3cgdGhlCisJICogam91cm5hbC4gKi8KKwlpZiAobmVlZGVkID4gRVhUM19NQVhfVFJBTlNfREFUQSkgCisJCW5lZWRlZCA9IEVYVDNfTUFYX1RSQU5TX0RBVEE7CisKKwlyZXR1cm4gRVhUM19EQVRBX1RSQU5TX0JMT0NLUyArIG5lZWRlZDsKK30KKworLyogCisgKiBUcnVuY2F0ZSB0cmFuc2FjdGlvbnMgY2FuIGJlIGNvbXBsZXggYW5kIGFic29sdXRlbHkgaHVnZS4gIFNvIHdlIG5lZWQgdG8KKyAqIGJlIGFibGUgdG8gcmVzdGFydCB0aGUgdHJhbnNhY3Rpb24gYXQgYSBjb252ZW50aWVudCBjaGVja3BvaW50IHRvIG1ha2UKKyAqIHN1cmUgd2UgZG9uJ3Qgb3ZlcmZsb3cgdGhlIGpvdXJuYWwuCisgKgorICogc3RhcnRfdHJhbnNhY3Rpb24gZ2V0cyB1cyBhIG5ldyBoYW5kbGUgZm9yIGEgdHJ1bmNhdGUgdHJhbnNhY3Rpb24sCisgKiBhbmQgZXh0ZW5kX3RyYW5zYWN0aW9uIHRyaWVzIHRvIGV4dGVuZCB0aGUgZXhpc3Rpbmcgb25lIGEgYml0LiAgSWYKKyAqIGV4dGVuZCBmYWlscywgd2UgbmVlZCB0byBwcm9wYWdhdGUgdGhlIGZhaWx1cmUgdXAgYW5kIHJlc3RhcnQgdGhlCisgKiB0cmFuc2FjdGlvbiBpbiB0aGUgdG9wLWxldmVsIHRydW5jYXRlIGxvb3AuIC0tc2N0IAorICovCisKK3N0YXRpYyBoYW5kbGVfdCAqc3RhcnRfdHJhbnNhY3Rpb24oc3RydWN0IGlub2RlICppbm9kZSkgCit7CisJaGFuZGxlX3QgKnJlc3VsdDsKKworCXJlc3VsdCA9IGV4dDNfam91cm5hbF9zdGFydChpbm9kZSwgYmxvY2tzX2Zvcl90cnVuY2F0ZShpbm9kZSkpOworCWlmICghSVNfRVJSKHJlc3VsdCkpCisJCXJldHVybiByZXN1bHQ7CisKKwlleHQzX3N0ZF9lcnJvcihpbm9kZS0+aV9zYiwgUFRSX0VSUihyZXN1bHQpKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogVHJ5IHRvIGV4dGVuZCB0aGlzIHRyYW5zYWN0aW9uIGZvciB0aGUgcHVycG9zZXMgb2YgdHJ1bmNhdGlvbi4KKyAqCisgKiBSZXR1cm5zIDAgaWYgd2UgbWFuYWdlZCB0byBjcmVhdGUgbW9yZSByb29tLiAgSWYgd2UgY2FuJ3QgY3JlYXRlIG1vcmUKKyAqIHJvb20sIGFuZCB0aGUgdHJhbnNhY3Rpb24gbXVzdCBiZSByZXN0YXJ0ZWQgd2UgcmV0dXJuIDEuCisgKi8KK3N0YXRpYyBpbnQgdHJ5X3RvX2V4dGVuZF90cmFuc2FjdGlvbihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmIChoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHMgPiBFWFQzX1JFU0VSVkVfVFJBTlNfQkxPQ0tTKQorCQlyZXR1cm4gMDsKKwlpZiAoIWV4dDNfam91cm5hbF9leHRlbmQoaGFuZGxlLCBibG9ja3NfZm9yX3RydW5jYXRlKGlub2RlKSkpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKgorICogUmVzdGFydCB0aGUgdHJhbnNhY3Rpb24gYXNzb2NpYXRlZCB3aXRoICpoYW5kbGUuICBUaGlzIGRvZXMgYSBjb21taXQsCisgKiBzbyBiZWZvcmUgd2UgY2FsbCBoZXJlIGV2ZXJ5dGhpbmcgbXVzdCBiZSBjb25zaXN0ZW50bHkgZGlydGllZCBhZ2FpbnN0CisgKiB0aGlzIHRyYW5zYWN0aW9uLgorICovCitzdGF0aWMgaW50IGV4dDNfam91cm5hbF90ZXN0X3Jlc3RhcnQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlqYmRfZGVidWcoMiwgInJlc3RhcnRpbmcgaGFuZGxlICVwXG4iLCBoYW5kbGUpOworCXJldHVybiBleHQzX2pvdXJuYWxfcmVzdGFydChoYW5kbGUsIGJsb2Nrc19mb3JfdHJ1bmNhdGUoaW5vZGUpKTsKK30KKworLyoKKyAqIENhbGxlZCBhdCB0aGUgbGFzdCBpcHV0KCkgaWYgaV9ubGluayBpcyB6ZXJvLgorICovCit2b2lkIGV4dDNfZGVsZXRlX2lub2RlIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwloYW5kbGVfdCAqaGFuZGxlOworCisJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpCisJCWdvdG8gbm9fZGVsZXRlOworCisJaGFuZGxlID0gc3RhcnRfdHJhbnNhY3Rpb24oaW5vZGUpOworCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQkvKiBJZiB3ZSdyZSBnb2luZyB0byBza2lwIHRoZSBub3JtYWwgY2xlYW51cCwgd2Ugc3RpbGwKKwkJICogbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgaW4tY29yZSBvcnBoYW4gbGlua2VkIGxpc3QKKwkJICogaXMgcHJvcGVybHkgY2xlYW5lZCB1cC4gKi8KKwkJZXh0M19vcnBoYW5fZGVsKE5VTEwsIGlub2RlKTsKKwkJZ290byBub19kZWxldGU7CisJfQorCisJaWYgKElTX1NZTkMoaW5vZGUpKQorCQloYW5kbGUtPmhfc3luYyA9IDE7CisJaW5vZGUtPmlfc2l6ZSA9IDA7CisJaWYgKGlub2RlLT5pX2Jsb2NrcykKKwkJZXh0M190cnVuY2F0ZShpbm9kZSk7CisJLyoKKwkgKiBLaWxsIG9mZiB0aGUgb3JwaGFuIHJlY29yZCB3aGljaCBleHQzX3RydW5jYXRlIGNyZWF0ZWQuCisJICogQUtQTTogSSB0aGluayB0aGlzIGNhbiBiZSBpbnNpZGUgdGhlIGFib3ZlIGBpZicuCisJICogTm90ZSB0aGF0IGV4dDNfb3JwaGFuX2RlbCgpIGhhcyB0byBiZSBhYmxlIHRvIGNvcGUgd2l0aCB0aGUKKwkgKiBkZWxldGlvbiBvZiBhIG5vbi1leGlzdGVudCBvcnBoYW4gLSB0aGlzIGlzIGJlY2F1c2Ugd2UgZG9uJ3QKKwkgKiBrbm93IGlmIGV4dDNfdHJ1bmNhdGUoKSBhY3R1YWxseSBjcmVhdGVkIGFuIG9ycGhhbiByZWNvcmQuCisJICogKFdlbGwsIHdlIGNvdWxkIGRvIHRoaXMgaWYgd2UgbmVlZCB0bywgYnV0IGhlY2sgLSBpdCB3b3JrcykKKwkgKi8KKwlleHQzX29ycGhhbl9kZWwoaGFuZGxlLCBpbm9kZSk7CisJRVhUM19JKGlub2RlKS0+aV9kdGltZQk9IGdldF9zZWNvbmRzKCk7CisKKwkvKiAKKwkgKiBPbmUgc3VidGxlIG9yZGVyaW5nIHJlcXVpcmVtZW50OiBpZiBhbnl0aGluZyBoYXMgZ29uZSB3cm9uZworCSAqICh0cmFuc2FjdGlvbiBhYm9ydCwgSU8gZXJyb3JzLCB3aGF0ZXZlciksIHRoZW4gd2UgY2FuIHN0aWxsCisJICogZG8gdGhlc2UgbmV4dCBzdGVwcyAodGhlIGZzIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gbWFya2VkIGFzCisJICogaGF2aW5nIGVycm9ycyksIGJ1dCB3ZSBjYW4ndCBmcmVlIHRoZSBpbm9kZSBpZiB0aGUgbWFya19kaXJ0eQorCSAqIGZhaWxzLiAgCisJICovCisJaWYgKGV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKSkKKwkJLyogSWYgdGhhdCBmYWlsZWQsIGp1c3QgZG8gdGhlIHJlcXVpcmVkIGluLWNvcmUgaW5vZGUgY2xlYXIuICovCisJCWNsZWFyX2lub2RlKGlub2RlKTsKKwllbHNlCisJCWV4dDNfZnJlZV9pbm9kZShoYW5kbGUsIGlub2RlKTsKKwlleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOworCXJldHVybjsKK25vX2RlbGV0ZToKKwljbGVhcl9pbm9kZShpbm9kZSk7CS8qIFdlIG11c3QgZ3VhcmFudGVlIGNsZWFyaW5nIG9mIGlub2RlLi4uICovCit9CisKK3N0YXRpYyBpbnQgZXh0M19hbGxvY19ibG9jayAoaGFuZGxlX3QgKmhhbmRsZSwKKwkJCXN0cnVjdCBpbm9kZSAqIGlub2RlLCB1bnNpZ25lZCBsb25nIGdvYWwsIGludCAqZXJyKQoreworCXVuc2lnbmVkIGxvbmcgcmVzdWx0OworCisJcmVzdWx0ID0gZXh0M19uZXdfYmxvY2soaGFuZGxlLCBpbm9kZSwgZ29hbCwgZXJyKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKK3R5cGVkZWYgc3RydWN0IHsKKwlfX2xlMzIJKnA7CisJX19sZTMyCWtleTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworfSBJbmRpcmVjdDsKKworc3RhdGljIGlubGluZSB2b2lkIGFkZF9jaGFpbihJbmRpcmVjdCAqcCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgX19sZTMyICp2KQoreworCXAtPmtleSA9ICoocC0+cCA9IHYpOworCXAtPmJoID0gYmg7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHZlcmlmeV9jaGFpbihJbmRpcmVjdCAqZnJvbSwgSW5kaXJlY3QgKnRvKQoreworCXdoaWxlIChmcm9tIDw9IHRvICYmIGZyb20tPmtleSA9PSAqZnJvbS0+cCkKKwkJZnJvbSsrOworCXJldHVybiAoZnJvbSA+IHRvKTsKK30KKworLyoqCisgKglleHQzX2Jsb2NrX3RvX3BhdGggLSBwYXJzZSB0aGUgYmxvY2sgbnVtYmVyIGludG8gYXJyYXkgb2Ygb2Zmc2V0cworICoJQGlub2RlOiBpbm9kZSBpbiBxdWVzdGlvbiAod2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBpdHMgc3VwZXJibG9jaykKKyAqCUBpX2Jsb2NrOiBibG9jayBudW1iZXIgdG8gYmUgcGFyc2VkCisgKglAb2Zmc2V0czogYXJyYXkgdG8gc3RvcmUgdGhlIG9mZnNldHMgaW4KKyAqICAgICAgQGJvdW5kYXJ5OiBzZXQgdGhpcyBub24temVybyBpZiB0aGUgcmVmZXJyZWQtdG8gYmxvY2sgaXMgbGlrZWx5IHRvIGJlCisgKiAgICAgICAgICAgICBmb2xsb3dlZCAob24gZGlzaykgYnkgYW4gaW5kaXJlY3QgYmxvY2suCisgKgorICoJVG8gc3RvcmUgdGhlIGxvY2F0aW9ucyBvZiBmaWxlJ3MgZGF0YSBleHQzIHVzZXMgYSBkYXRhIHN0cnVjdHVyZSBjb21tb24KKyAqCWZvciBVTklYIGZpbGVzeXN0ZW1zIC0gdHJlZSBvZiBwb2ludGVycyBhbmNob3JlZCBpbiB0aGUgaW5vZGUsIHdpdGgKKyAqCWRhdGEgYmxvY2tzIGF0IGxlYXZlcyBhbmQgaW5kaXJlY3QgYmxvY2tzIGluIGludGVybWVkaWF0ZSBub2Rlcy4KKyAqCVRoaXMgZnVuY3Rpb24gdHJhbnNsYXRlcyB0aGUgYmxvY2sgbnVtYmVyIGludG8gcGF0aCBpbiB0aGF0IHRyZWUgLQorICoJcmV0dXJuIHZhbHVlIGlzIHRoZSBwYXRoIGxlbmd0aCBhbmQgQG9mZnNldHNbbl0gaXMgdGhlIG9mZnNldCBvZgorICoJcG9pbnRlciB0byAobisxKXRoIG5vZGUgaW4gdGhlIG50aCBvbmUuIElmIEBibG9jayBpcyBvdXQgb2YgcmFuZ2UKKyAqCShuZWdhdGl2ZSBvciB0b28gbGFyZ2UpIHdhcm5pbmcgaXMgcHJpbnRlZCBhbmQgemVybyByZXR1cm5lZC4KKyAqCisgKglOb3RlOiBmdW5jdGlvbiBkb2Vzbid0IGZpbmQgbm9kZSBhZGRyZXNzZXMsIHNvIG5vIElPIGlzIG5lZWRlZC4gQWxsCisgKgl3ZSBuZWVkIHRvIGtub3cgaXMgdGhlIGNhcGFjaXR5IG9mIGluZGlyZWN0IGJsb2NrcyAodGFrZW4gZnJvbSB0aGUKKyAqCWlub2RlLT5pX3NiKS4KKyAqLworCisvKgorICogUG9ydGFiaWxpdHkgbm90ZTogdGhlIGxhc3QgY29tcGFyaXNvbiAoY2hlY2sgdGhhdCB3ZSBmaXQgaW50byB0cmlwbGUKKyAqIGluZGlyZWN0IGJsb2NrKSBpcyBzcGVsbGVkIGRpZmZlcmVudGx5LCBiZWNhdXNlIG90aGVyd2lzZSBvbiBhbgorICogYXJjaGl0ZWN0dXJlIHdpdGggMzItYml0IGxvbmdzIGFuZCA4S2IgcGFnZXMgd2UgbWlnaHQgZ2V0IGludG8gdHJvdWJsZQorICogaWYgb3VyIGZpbGVzeXN0ZW0gaGFkIDhLYiBibG9ja3MuIFdlIG1pZ2h0IHVzZSBsb25nIGxvbmcsIGJ1dCB0aGF0IHdvdWxkCisgKiBraWxsIHVzIG9uIHg4Ni4gT2gsIHdlbGwsIGF0IGxlYXN0IHRoZSBzaWduIHByb3BhZ2F0aW9uIGRvZXMgbm90IG1hdHRlciAtCisgKiBpX2Jsb2NrIHdvdWxkIGhhdmUgdG8gYmUgbmVnYXRpdmUgaW4gdGhlIHZlcnkgYmVnaW5uaW5nLCBzbyB3ZSB3b3VsZCBub3QKKyAqIGdldCB0aGVyZSBhdCBhbGwuCisgKi8KKworc3RhdGljIGludCBleHQzX2Jsb2NrX3RvX3BhdGgoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCWxvbmcgaV9ibG9jaywgaW50IG9mZnNldHNbNF0sIGludCAqYm91bmRhcnkpCit7CisJaW50IHB0cnMgPSBFWFQzX0FERFJfUEVSX0JMT0NLKGlub2RlLT5pX3NiKTsKKwlpbnQgcHRyc19iaXRzID0gRVhUM19BRERSX1BFUl9CTE9DS19CSVRTKGlub2RlLT5pX3NiKTsKKwljb25zdCBsb25nIGRpcmVjdF9ibG9ja3MgPSBFWFQzX05ESVJfQkxPQ0tTLAorCQlpbmRpcmVjdF9ibG9ja3MgPSBwdHJzLAorCQlkb3VibGVfYmxvY2tzID0gKDEgPDwgKHB0cnNfYml0cyAqIDIpKTsKKwlpbnQgbiA9IDA7CisJaW50IGZpbmFsID0gMDsKKworCWlmIChpX2Jsb2NrIDwgMCkgeworCQlleHQzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAiZXh0M19ibG9ja190b19wYXRoIiwgImJsb2NrIDwgMCIpOworCX0gZWxzZSBpZiAoaV9ibG9jayA8IGRpcmVjdF9ibG9ja3MpIHsKKwkJb2Zmc2V0c1tuKytdID0gaV9ibG9jazsKKwkJZmluYWwgPSBkaXJlY3RfYmxvY2tzOworCX0gZWxzZSBpZiAoIChpX2Jsb2NrIC09IGRpcmVjdF9ibG9ja3MpIDwgaW5kaXJlY3RfYmxvY2tzKSB7CisJCW9mZnNldHNbbisrXSA9IEVYVDNfSU5EX0JMT0NLOworCQlvZmZzZXRzW24rK10gPSBpX2Jsb2NrOworCQlmaW5hbCA9IHB0cnM7CisJfSBlbHNlIGlmICgoaV9ibG9jayAtPSBpbmRpcmVjdF9ibG9ja3MpIDwgZG91YmxlX2Jsb2NrcykgeworCQlvZmZzZXRzW24rK10gPSBFWFQzX0RJTkRfQkxPQ0s7CisJCW9mZnNldHNbbisrXSA9IGlfYmxvY2sgPj4gcHRyc19iaXRzOworCQlvZmZzZXRzW24rK10gPSBpX2Jsb2NrICYgKHB0cnMgLSAxKTsKKwkJZmluYWwgPSBwdHJzOworCX0gZWxzZSBpZiAoKChpX2Jsb2NrIC09IGRvdWJsZV9ibG9ja3MpID4+IChwdHJzX2JpdHMgKiAyKSkgPCBwdHJzKSB7CisJCW9mZnNldHNbbisrXSA9IEVYVDNfVElORF9CTE9DSzsKKwkJb2Zmc2V0c1tuKytdID0gaV9ibG9jayA+PiAocHRyc19iaXRzICogMik7CisJCW9mZnNldHNbbisrXSA9IChpX2Jsb2NrID4+IHB0cnNfYml0cykgJiAocHRycyAtIDEpOworCQlvZmZzZXRzW24rK10gPSBpX2Jsb2NrICYgKHB0cnMgLSAxKTsKKwkJZmluYWwgPSBwdHJzOworCX0gZWxzZSB7CisJCWV4dDNfd2FybmluZyAoaW5vZGUtPmlfc2IsICJleHQzX2Jsb2NrX3RvX3BhdGgiLCAiYmxvY2sgPiBiaWciKTsKKwl9CisJaWYgKGJvdW5kYXJ5KQorCQkqYm91bmRhcnkgPSAoaV9ibG9jayAmIChwdHJzIC0gMSkpID09IChmaW5hbCAtIDEpOworCXJldHVybiBuOworfQorCisvKioKKyAqCWV4dDNfZ2V0X2JyYW5jaCAtIHJlYWQgdGhlIGNoYWluIG9mIGluZGlyZWN0IGJsb2NrcyBsZWFkaW5nIHRvIGRhdGEKKyAqCUBpbm9kZTogaW5vZGUgaW4gcXVlc3Rpb24KKyAqCUBkZXB0aDogZGVwdGggb2YgdGhlIGNoYWluICgxIC0gZGlyZWN0IHBvaW50ZXIsIGV0Yy4pCisgKglAb2Zmc2V0czogb2Zmc2V0cyBvZiBwb2ludGVycyBpbiBpbm9kZS9pbmRpcmVjdCBibG9ja3MKKyAqCUBjaGFpbjogcGxhY2UgdG8gc3RvcmUgdGhlIHJlc3VsdAorICoJQGVycjogaGVyZSB3ZSBzdG9yZSB0aGUgZXJyb3IgdmFsdWUKKyAqCisgKglGdW5jdGlvbiBmaWxscyB0aGUgYXJyYXkgb2YgdHJpcGxlcyA8a2V5LCBwLCBiaD4gYW5kIHJldHVybnMgJU5VTEwKKyAqCWlmIGV2ZXJ5dGhpbmcgd2VudCBPSyBvciB0aGUgcG9pbnRlciB0byB0aGUgbGFzdCBmaWxsZWQgdHJpcGxlCisgKgkoaW5jb21wbGV0ZSBvbmUpIG90aGVyd2lzZS4gVXBvbiB0aGUgcmV0dXJuIGNoYWluW2ldLmtleSBjb250YWlucworICoJdGhlIG51bWJlciBvZiAoaSsxKS10aCBibG9jayBpbiB0aGUgY2hhaW4gKGFzIGl0IGlzIHN0b3JlZCBpbiBtZW1vcnksCisgKglpLmUuIGxpdHRsZS1lbmRpYW4gMzItYml0KSwgY2hhaW5baV0ucCBjb250YWlucyB0aGUgYWRkcmVzcyBvZiB0aGF0CisgKgludW1iZXIgKGl0IHBvaW50cyBpbnRvIHN0cnVjdCBpbm9kZSBmb3IgaT09MCBhbmQgaW50byB0aGUgYmgtPmJfZGF0YQorICoJZm9yIGk+MCkgYW5kIGNoYWluW2ldLmJoIHBvaW50cyB0byB0aGUgYnVmZmVyX2hlYWQgb2YgaS10aCBpbmRpcmVjdAorICoJYmxvY2sgZm9yIGk+MCBhbmQgTlVMTCBmb3IgaT09MC4gSW4gb3RoZXIgd29yZHMsIGl0IGhvbGRzIHRoZSBibG9jaworICoJbnVtYmVycyBvZiB0aGUgY2hhaW4sIGFkZHJlc3NlcyB0aGV5IHdlcmUgdGFrZW4gZnJvbSAoYW5kIHdoZXJlIHdlIGNhbgorICoJdmVyaWZ5IHRoYXQgY2hhaW4gZGlkIG5vdCBjaGFuZ2UpIGFuZCBidWZmZXJfaGVhZHMgaG9zdGluZyB0aGVzZQorICoJbnVtYmVycy4KKyAqCisgKglGdW5jdGlvbiBzdG9wcyB3aGVuIGl0IHN0dW1ibGVzIHVwb24gemVybyBwb2ludGVyIChhYnNlbnQgYmxvY2spCisgKgkJKHBvaW50ZXIgdG8gbGFzdCB0cmlwbGUgcmV0dXJuZWQsICpAZXJyID09IDApCisgKglvciB3aGVuIGl0IGdldHMgYW4gSU8gZXJyb3IgcmVhZGluZyBhbiBpbmRpcmVjdCBibG9jaworICoJCShkaXR0bywgKkBlcnIgPT0gLUVJTykKKyAqCW9yIHdoZW4gaXQgbm90aWNlcyB0aGF0IGNoYWluIGhhZCBiZWVuIGNoYW5nZWQgd2hpbGUgaXQgd2FzIHJlYWRpbmcKKyAqCQkoZGl0dG8sICpAZXJyID09IC1FQUdBSU4pCisgKglvciB3aGVuIGl0IHJlYWRzIGFsbCBAZGVwdGgtMSBpbmRpcmVjdCBibG9ja3Mgc3VjY2Vzc2Z1bGx5IGFuZCBmaW5kcworICoJdGhlIHdob2xlIGNoYWluLCBhbGwgd2F5IHRvIHRoZSBkYXRhIChyZXR1cm5zICVOVUxMLCAqZXJyID09IDApLgorICovCitzdGF0aWMgSW5kaXJlY3QgKmV4dDNfZ2V0X2JyYW5jaChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZGVwdGgsIGludCAqb2Zmc2V0cywKKwkJCQkgSW5kaXJlY3QgY2hhaW5bNF0sIGludCAqZXJyKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlJbmRpcmVjdCAqcCA9IGNoYWluOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwkqZXJyID0gMDsKKwkvKiBpX2RhdGEgaXMgbm90IGdvaW5nIGF3YXksIG5vIGxvY2sgbmVlZGVkICovCisJYWRkX2NoYWluIChjaGFpbiwgTlVMTCwgRVhUM19JKGlub2RlKS0+aV9kYXRhICsgKm9mZnNldHMpOworCWlmICghcC0+a2V5KQorCQlnb3RvIG5vX2Jsb2NrOworCXdoaWxlICgtLWRlcHRoKSB7CisJCWJoID0gc2JfYnJlYWQoc2IsIGxlMzJfdG9fY3B1KHAtPmtleSkpOworCQlpZiAoIWJoKQorCQkJZ290byBmYWlsdXJlOworCQkvKiBSZWFkZXI6IHBvaW50ZXJzICovCisJCWlmICghdmVyaWZ5X2NoYWluKGNoYWluLCBwKSkKKwkJCWdvdG8gY2hhbmdlZDsKKwkJYWRkX2NoYWluKCsrcCwgYmgsIChfX2xlMzIqKWJoLT5iX2RhdGEgKyAqKytvZmZzZXRzKTsKKwkJLyogUmVhZGVyOiBlbmQgKi8KKwkJaWYgKCFwLT5rZXkpCisJCQlnb3RvIG5vX2Jsb2NrOworCX0KKwlyZXR1cm4gTlVMTDsKKworY2hhbmdlZDoKKwlicmVsc2UoYmgpOworCSplcnIgPSAtRUFHQUlOOworCWdvdG8gbm9fYmxvY2s7CitmYWlsdXJlOgorCSplcnIgPSAtRUlPOworbm9fYmxvY2s6CisJcmV0dXJuIHA7Cit9CisKKy8qKgorICoJZXh0M19maW5kX25lYXIgLSBmaW5kIGEgcGxhY2UgZm9yIGFsbG9jYXRpb24gd2l0aCBzdWZmaWNpZW50IGxvY2FsaXR5CisgKglAaW5vZGU6IG93bmVyCisgKglAaW5kOiBkZXNjcmlwdG9yIG9mIGluZGlyZWN0IGJsb2NrLgorICoKKyAqCVRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcHJlZmVyZWQgcGxhY2UgZm9yIGJsb2NrIGFsbG9jYXRpb24uCisgKglJdCBpcyB1c2VkIHdoZW4gaGV1cmlzdGljIGZvciBzZXF1ZW50aWFsIGFsbG9jYXRpb24gZmFpbHMuCisgKglSdWxlcyBhcmU6CisgKgkgICsgaWYgdGhlcmUgaXMgYSBibG9jayB0byB0aGUgbGVmdCBvZiBvdXIgcG9zaXRpb24gLSBhbGxvY2F0ZSBuZWFyIGl0LgorICoJICArIGlmIHBvaW50ZXIgd2lsbCBsaXZlIGluIGluZGlyZWN0IGJsb2NrIC0gYWxsb2NhdGUgbmVhciB0aGF0IGJsb2NrLgorICoJICArIGlmIHBvaW50ZXIgd2lsbCBsaXZlIGluIGlub2RlIC0gYWxsb2NhdGUgaW4gdGhlIHNhbWUKKyAqCSAgICBjeWxpbmRlciBncm91cC4gCisgKgorICogSW4gdGhlIGxhdHRlciBjYXNlIHdlIGNvbG91ciB0aGUgc3RhcnRpbmcgYmxvY2sgYnkgdGhlIGNhbGxlcnMgUElEIHRvCisgKiBwcmV2ZW50IGl0IGZyb20gY2xhc2hpbmcgd2l0aCBjb25jdXJyZW50IGFsbG9jYXRpb25zIGZvciBhIGRpZmZlcmVudCBpbm9kZQorICogaW4gdGhlIHNhbWUgYmxvY2sgZ3JvdXAuICAgVGhlIFBJRCBpcyB1c2VkIGhlcmUgc28gdGhhdCBmdW5jdGlvbmFsbHkgcmVsYXRlZAorICogZmlsZXMgd2lsbCBiZSBjbG9zZS1ieSBvbi1kaXNrLgorICoKKyAqCUNhbGxlciBtdXN0IG1ha2Ugc3VyZSB0aGF0IEBpbmQgaXMgdmFsaWQgYW5kIHdpbGwgc3RheSB0aGF0IHdheS4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBleHQzX2ZpbmRfbmVhcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBJbmRpcmVjdCAqaW5kKQoreworCXN0cnVjdCBleHQzX2lub2RlX2luZm8gKmVpID0gRVhUM19JKGlub2RlKTsKKwlfX2xlMzIgKnN0YXJ0ID0gaW5kLT5iaCA/IChfX2xlMzIqKSBpbmQtPmJoLT5iX2RhdGEgOiBlaS0+aV9kYXRhOworCV9fbGUzMiAqcDsKKwl1bnNpZ25lZCBsb25nIGJnX3N0YXJ0OworCXVuc2lnbmVkIGxvbmcgY29sb3VyOworCisJLyogVHJ5IHRvIGZpbmQgcHJldmlvdXMgYmxvY2sgKi8KKwlmb3IgKHAgPSBpbmQtPnAgLSAxOyBwID49IHN0YXJ0OyBwLS0pCisJCWlmICgqcCkKKwkJCXJldHVybiBsZTMyX3RvX2NwdSgqcCk7CisKKwkvKiBObyBzdWNoIHRoaW5nLCBzbyBsZXQncyB0cnkgbG9jYXRpb24gb2YgaW5kaXJlY3QgYmxvY2sgKi8KKwlpZiAoaW5kLT5iaCkKKwkJcmV0dXJuIGluZC0+YmgtPmJfYmxvY2tucjsKKworCS8qCisJICogSXQgaXMgZ29pbmcgdG8gYmUgcmVmZXJlZCBmcm9tIGlub2RlIGl0c2VsZj8gT0ssIGp1c3QgcHV0IGl0IGludG8KKwkgKiB0aGUgc2FtZSBjeWxpbmRlciBncm91cCB0aGVuLgorCSAqLworCWJnX3N0YXJ0ID0gKGVpLT5pX2Jsb2NrX2dyb3VwICogRVhUM19CTE9DS1NfUEVSX0dST1VQKGlub2RlLT5pX3NiKSkgKworCQlsZTMyX3RvX2NwdShFWFQzX1NCKGlub2RlLT5pX3NiKS0+c19lcy0+c19maXJzdF9kYXRhX2Jsb2NrKTsKKwljb2xvdXIgPSAoY3VycmVudC0+cGlkICUgMTYpICoKKwkJCShFWFQzX0JMT0NLU19QRVJfR1JPVVAoaW5vZGUtPmlfc2IpIC8gMTYpOworCXJldHVybiBiZ19zdGFydCArIGNvbG91cjsKK30KKworLyoqCisgKglleHQzX2ZpbmRfZ29hbCAtIGZpbmQgYSBwcmVmZXJlZCBwbGFjZSBmb3IgYWxsb2NhdGlvbi4KKyAqCUBpbm9kZTogb3duZXIKKyAqCUBibG9jazogIGJsb2NrIHdlIHdhbnQKKyAqCUBjaGFpbjogIGNoYWluIG9mIGluZGlyZWN0IGJsb2NrcworICoJQHBhcnRpYWw6IHBvaW50ZXIgdG8gdGhlIGxhc3QgdHJpcGxlIHdpdGhpbiBhIGNoYWluCisgKglAZ29hbDoJcGxhY2UgdG8gc3RvcmUgdGhlIHJlc3VsdC4KKyAqCisgKglOb3JtYWxseSB0aGlzIGZ1bmN0aW9uIGZpbmQgdGhlIHByZWZlcmVkIHBsYWNlIGZvciBibG9jayBhbGxvY2F0aW9uLAorICoJc3RvcmVzIGl0IGluICpAZ29hbCBhbmQgcmV0dXJucyB6ZXJvLiBJZiB0aGUgYnJhbmNoIGhhZCBiZWVuIGNoYW5nZWQKKyAqCXVuZGVyIHVzIHdlIHJldHVybiAtRUFHQUlOLgorICovCisKK3N0YXRpYyBpbnQgZXh0M19maW5kX2dvYWwoc3RydWN0IGlub2RlICppbm9kZSwgbG9uZyBibG9jaywgSW5kaXJlY3QgY2hhaW5bNF0sCisJCQkgIEluZGlyZWN0ICpwYXJ0aWFsLCB1bnNpZ25lZCBsb25nICpnb2FsKQoreworCXN0cnVjdCBleHQzX2Jsb2NrX2FsbG9jX2luZm8gKmJsb2NrX2kgPSAgRVhUM19JKGlub2RlKS0+aV9ibG9ja19hbGxvY19pbmZvOworCisJLyoKKwkgKiB0cnkgdGhlIGhldXJpc3RpYyBmb3Igc2VxdWVudGlhbCBhbGxvY2F0aW9uLAorCSAqIGZhaWxpbmcgdGhhdCBhdCBsZWFzdCB0cnkgdG8gZ2V0IGRlY2VudCBsb2NhbGl0eS4KKwkgKi8KKwlpZiAoYmxvY2tfaSAmJiAoYmxvY2sgPT0gYmxvY2tfaS0+bGFzdF9hbGxvY19sb2dpY2FsX2Jsb2NrICsgMSkKKwkJJiYgKGJsb2NrX2ktPmxhc3RfYWxsb2NfcGh5c2ljYWxfYmxvY2sgIT0gMCkpIHsKKwkJKmdvYWwgPSBibG9ja19pLT5sYXN0X2FsbG9jX3BoeXNpY2FsX2Jsb2NrICsgMTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHZlcmlmeV9jaGFpbihjaGFpbiwgcGFydGlhbCkpIHsKKwkJKmdvYWwgPSBleHQzX2ZpbmRfbmVhcihpbm9kZSwgcGFydGlhbCk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVBR0FJTjsKK30KKworLyoqCisgKglleHQzX2FsbG9jX2JyYW5jaCAtIGFsbG9jYXRlIGFuZCBzZXQgdXAgYSBjaGFpbiBvZiBibG9ja3MuCisgKglAaW5vZGU6IG93bmVyCisgKglAbnVtOiBkZXB0aCBvZiB0aGUgY2hhaW4gKG51bWJlciBvZiBibG9ja3MgdG8gYWxsb2NhdGUpCisgKglAb2Zmc2V0czogb2Zmc2V0cyAoaW4gdGhlIGJsb2NrcykgdG8gc3RvcmUgdGhlIHBvaW50ZXJzIHRvIG5leHQuCisgKglAYnJhbmNoOiBwbGFjZSB0byBzdG9yZSB0aGUgY2hhaW4gaW4uCisgKgorICoJVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgQG51bSBibG9ja3MsIHplcm9lcyBvdXQgYWxsIGJ1dCB0aGUgbGFzdCBvbmUsCisgKglsaW5rcyB0aGVtIGludG8gY2hhaW4gYW5kIChpZiB3ZSBhcmUgc3luY2hyb25vdXMpIHdyaXRlcyB0aGVtIHRvIGRpc2suCisgKglJbiBvdGhlciB3b3JkcywgaXQgcHJlcGFyZXMgYSBicmFuY2ggdGhhdCBjYW4gYmUgc3BsaWNlZCBvbnRvIHRoZQorICoJaW5vZGUuIEl0IHN0b3JlcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhhdCBjaGFpbiBpbiB0aGUgYnJhbmNoW10sIGluCisgKgl0aGUgc2FtZSBmb3JtYXQgYXMgZXh0M19nZXRfYnJhbmNoKCkgd291bGQgZG8uIFdlIGFyZSBjYWxsaW5nIGl0IGFmdGVyCisgKgl3ZSBoYWQgcmVhZCB0aGUgZXhpc3RpbmcgcGFydCBvZiBjaGFpbiBhbmQgcGFydGlhbCBwb2ludHMgdG8gdGhlIGxhc3QKKyAqCXRyaXBsZSBvZiB0aGF0IChvbmUgd2l0aCB6ZXJvIC0+a2V5KS4gVXBvbiB0aGUgZXhpdCB3ZSBoYXZlIHRoZSBzYW1lCisgKglwaWN0dXJlIGFzIGFmdGVyIHRoZSBzdWNjZXNzZnVsIGV4dDNfZ2V0X2Jsb2NrKCksIGV4Y3BldCB0aGF0IGluIG9uZQorICoJcGxhY2UgY2hhaW4gaXMgZGlzY29ubmVjdGVkIC0gKmJyYW5jaC0+cCBpcyBzdGlsbCB6ZXJvICh3ZSBkaWQgbm90CisgKglzZXQgdGhlIGxhc3QgbGluayksIGJ1dCBicmFuY2gtPmtleSBjb250YWlucyB0aGUgbnVtYmVyIHRoYXQgc2hvdWxkCisgKgliZSBwbGFjZWQgaW50byAqYnJhbmNoLT5wIHRvIGZpbGwgdGhhdCBnYXAuCisgKgorICoJSWYgYWxsb2NhdGlvbiBmYWlscyB3ZSBmcmVlIGFsbCBibG9ja3Mgd2UndmUgYWxsb2NhdGVkIChhbmQgZm9yZ2V0CisgKgl0aGVpciBidWZmZXJfaGVhZHMpIGFuZCByZXR1cm4gdGhlIGVycm9yIHZhbHVlIHRoZSBmcm9tIGZhaWxlZAorICoJZXh0M19hbGxvY19ibG9jaygpIChub3JtYWxseSAtRU5PU1BDKS4gT3RoZXJ3aXNlIHdlIHNldCB0aGUgY2hhaW4KKyAqCWFzIGRlc2NyaWJlZCBhYm92ZSBhbmQgcmV0dXJuIDAuCisgKi8KKworc3RhdGljIGludCBleHQzX2FsbG9jX2JyYW5jaChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICBpbnQgbnVtLAorCQkJICAgICB1bnNpZ25lZCBsb25nIGdvYWwsCisJCQkgICAgIGludCAqb2Zmc2V0cywKKwkJCSAgICAgSW5kaXJlY3QgKmJyYW5jaCkKK3sKKwlpbnQgYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCWludCBuID0gMCwga2V5cyA9IDA7CisJaW50IGVyciA9IDA7CisJaW50IGk7CisJaW50IHBhcmVudCA9IGV4dDNfYWxsb2NfYmxvY2soaGFuZGxlLCBpbm9kZSwgZ29hbCwgJmVycik7CisKKwlicmFuY2hbMF0ua2V5ID0gY3B1X3RvX2xlMzIocGFyZW50KTsKKwlpZiAocGFyZW50KSB7CisJCWZvciAobiA9IDE7IG4gPCBudW07IG4rKykgeworCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwkJCS8qIEFsbG9jYXRlIHRoZSBuZXh0IGJsb2NrICovCisJCQlpbnQgbnIgPSBleHQzX2FsbG9jX2Jsb2NrKGhhbmRsZSwgaW5vZGUsIHBhcmVudCwgJmVycik7CisJCQlpZiAoIW5yKQorCQkJCWJyZWFrOworCQkJYnJhbmNoW25dLmtleSA9IGNwdV90b19sZTMyKG5yKTsKKwkJCWtleXMgPSBuKzE7CisKKwkJCS8qCisJCQkgKiBHZXQgYnVmZmVyX2hlYWQgZm9yIHBhcmVudCBibG9jaywgemVybyBpdCBvdXQKKwkJCSAqIGFuZCBzZXQgdGhlIHBvaW50ZXIgdG8gbmV3IG9uZSwgdGhlbiBzZW5kCisJCQkgKiBwYXJlbnQgdG8gZGlzay4gIAorCQkJICovCisJCQliaCA9IHNiX2dldGJsayhpbm9kZS0+aV9zYiwgcGFyZW50KTsKKwkJCWJyYW5jaFtuXS5iaCA9IGJoOworCQkJbG9ja19idWZmZXIoYmgpOworCQkJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBnZXRfY3JlYXRlX2FjY2VzcyIpOworCQkJZXJyID0gZXh0M19qb3VybmFsX2dldF9jcmVhdGVfYWNjZXNzKGhhbmRsZSwgYmgpOworCQkJaWYgKGVycikgeworCQkJCXVubG9ja19idWZmZXIoYmgpOworCQkJCWJyZWxzZShiaCk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCW1lbXNldChiaC0+Yl9kYXRhLCAwLCBibG9ja3NpemUpOworCQkJYnJhbmNoW25dLnAgPSAoX19sZTMyKikgYmgtPmJfZGF0YSArIG9mZnNldHNbbl07CisJCQkqYnJhbmNoW25dLnAgPSBicmFuY2hbbl0ua2V5OworCQkJQlVGRkVSX1RSQUNFKGJoLCAibWFya2luZyB1cHRvZGF0ZSIpOworCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCQl1bmxvY2tfYnVmZmVyKGJoKTsKKworCQkJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEiKTsKKwkJCWVyciA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKKwkJCWlmIChlcnIpCisJCQkJYnJlYWs7CisKKwkJCXBhcmVudCA9IG5yOworCQl9CisJfQorCWlmIChuID09IG51bSkKKwkJcmV0dXJuIDA7CisKKwkvKiBBbGxvY2F0aW9uIGZhaWxlZCwgZnJlZSB3aGF0IHdlIGFscmVhZHkgYWxsb2NhdGVkICovCisJZm9yIChpID0gMTsgaSA8IGtleXM7IGkrKykgeworCQlCVUZGRVJfVFJBQ0UoYnJhbmNoW2ldLmJoLCAiY2FsbCBqb3VybmFsX2ZvcmdldCIpOworCQlleHQzX2pvdXJuYWxfZm9yZ2V0KGhhbmRsZSwgYnJhbmNoW2ldLmJoKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IGtleXM7IGkrKykKKwkJZXh0M19mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBsZTMyX3RvX2NwdShicmFuY2hbaV0ua2V5KSwgMSk7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKglleHQzX3NwbGljZV9icmFuY2ggLSBzcGxpY2UgdGhlIGFsbG9jYXRlZCBicmFuY2ggb250byBpbm9kZS4KKyAqCUBpbm9kZTogb3duZXIKKyAqCUBibG9jazogKGxvZ2ljYWwpIG51bWJlciBvZiBibG9jayB3ZSBhcmUgYWRkaW5nCisgKglAY2hhaW46IGNoYWluIG9mIGluZGlyZWN0IGJsb2NrcyAod2l0aCBhIG1pc3NpbmcgbGluayAtIHNlZQorICoJCWV4dDNfYWxsb2NfYnJhbmNoKQorICoJQHdoZXJlOiBsb2NhdGlvbiBvZiBtaXNzaW5nIGxpbmsKKyAqCUBudW06ICAgbnVtYmVyIG9mIGJsb2NrcyB3ZSBhcmUgYWRkaW5nCisgKgorICoJVGhpcyBmdW5jdGlvbiB2ZXJpZmllcyB0aGF0IGNoYWluICh1cCB0byB0aGUgbWlzc2luZyBsaW5rKSBoYWQgbm90CisgKgljaGFuZ2VkLCBmaWxscyB0aGUgbWlzc2luZyBsaW5rIGFuZCBkb2VzIGFsbCBob3VzZWtlZXBpbmcgbmVlZGVkIGluCisgKglpbm9kZSAoLT5pX2Jsb2NrcywgZXRjLikuIEluIGNhc2Ugb2Ygc3VjY2VzcyB3ZSBlbmQgdXAgd2l0aCB0aGUgZnVsbAorICoJY2hhaW4gdG8gbmV3IGJsb2NrIGFuZCByZXR1cm4gMC4gT3RoZXJ3aXNlICg9PSBjaGFpbiBoYWQgYmVlbiBjaGFuZ2VkKQorICoJd2UgZnJlZSB0aGUgbmV3IGJsb2NrcyAoZm9yZ2V0dGluZyB0aGVpciBidWZmZXJfaGVhZHMsIGluZGVlZCkgYW5kCisgKglyZXR1cm4gLUVBR0FJTi4KKyAqLworCitzdGF0aWMgaW50IGV4dDNfc3BsaWNlX2JyYW5jaChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb25nIGJsb2NrLAorCQkJICAgICAgSW5kaXJlY3QgY2hhaW5bNF0sIEluZGlyZWN0ICp3aGVyZSwgaW50IG51bSkKK3sKKwlpbnQgaTsKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgZXh0M19ibG9ja19hbGxvY19pbmZvICpibG9ja19pID0gRVhUM19JKGlub2RlKS0+aV9ibG9ja19hbGxvY19pbmZvOworCisJLyoKKwkgKiBJZiB3ZSdyZSBzcGxpY2luZyBpbnRvIGEgW3RkXWluZGlyZWN0IGJsb2NrIChhcyBvcHBvc2VkIHRvIHRoZQorCSAqIGlub2RlKSB0aGVuIHdlIG5lZWQgdG8gZ2V0IHdyaXRlIGFjY2VzcyB0byB0aGUgW3RkXWluZGlyZWN0IGJsb2NrCisJICogYmVmb3JlIHRoZSBzcGxpY2UuCisJICovCisJaWYgKHdoZXJlLT5iaCkgeworCQlCVUZGRVJfVFJBQ0Uod2hlcmUtPmJoLCAiZ2V0X3dyaXRlX2FjY2VzcyIpOworCQllcnIgPSBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIHdoZXJlLT5iaCk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycl9vdXQ7CisJfQorCS8qIFZlcmlmeSB0aGF0IHBsYWNlIHdlIGFyZSBzcGxpY2luZyB0byBpcyBzdGlsbCB0aGVyZSBhbmQgdmFjYW50ICovCisKKwlpZiAoIXZlcmlmeV9jaGFpbihjaGFpbiwgd2hlcmUtMSkgfHwgKndoZXJlLT5wKQorCQkvKiBXcml0ZXI6IGVuZCAqLworCQlnb3RvIGNoYW5nZWQ7CisKKwkvKiBUaGF0J3MgaXQgKi8KKworCSp3aGVyZS0+cCA9IHdoZXJlLT5rZXk7CisKKwkvKgorCSAqIHVwZGF0ZSB0aGUgbW9zdCByZWNlbnRseSBhbGxvY2F0ZWQgbG9naWNhbCAmIHBoeXNpY2FsIGJsb2NrCisJICogaW4gaV9ibG9ja19hbGxvY19pbmZvLCB0byBhc3Npc3QgZmluZCB0aGUgcHJvcGVyIGdvYWwgYmxvY2sgZm9yIG5leHQKKwkgKiBhbGxvY2F0aW9uCisJICovCisJaWYgKGJsb2NrX2kpIHsKKwkJYmxvY2tfaS0+bGFzdF9hbGxvY19sb2dpY2FsX2Jsb2NrID0gYmxvY2s7CisJCWJsb2NrX2ktPmxhc3RfYWxsb2NfcGh5c2ljYWxfYmxvY2sgPSBsZTMyX3RvX2NwdSh3aGVyZVtudW0tMV0ua2V5KTsKKwl9CisKKwkvKiBXZSBhcmUgZG9uZSB3aXRoIGF0b21pYyBzdHVmZiwgbm93IGRvIHRoZSByZXN0IG9mIGhvdXNla2VlcGluZyAqLworCisJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCWV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKKworCS8qIGhhZCB3ZSBzcGxpY2VkIGl0IG9udG8gaW5kaXJlY3QgYmxvY2s/ICovCisJaWYgKHdoZXJlLT5iaCkgeworCQkvKgorCQkgKiBha3BtOiBJZiB3ZSBzcGxpY2VkIGl0IG9udG8gYW4gaW5kaXJlY3QgYmxvY2ssIHdlIGhhdmVuJ3QKKwkJICogYWx0ZXJlZCB0aGUgaW5vZGUuICBOb3RlIGhvd2V2ZXIgdGhhdCBpZiBpdCBpcyBiZWluZyBzcGxpY2VkCisJCSAqIG9udG8gYW4gaW5kaXJlY3QgYmxvY2sgYXQgdGhlIHZlcnkgZW5kIG9mIHRoZSBmaWxlICh0aGUKKwkJICogZmlsZSBpcyBncm93aW5nKSB0aGVuIHdlICp3aWxsKiBhbHRlciB0aGUgaW5vZGUgdG8gcmVmbGVjdAorCQkgKiB0aGUgbmV3IGlfc2l6ZS4gIEJ1dCB0aGF0IGlzIG5vdCBkb25lIGhlcmUgLSBpdCBpcyBkb25lIGluCisJCSAqIGdlbmVyaWNfY29tbWl0X3dyaXRlLT5fX21hcmtfaW5vZGVfZGlydHktPmV4dDNfZGlydHlfaW5vZGUuCisJCSAqLworCQlqYmRfZGVidWcoNSwgInNwbGljaW5nIGluZGlyZWN0IG9ubHlcbiIpOworCQlCVUZGRVJfVFJBQ0Uod2hlcmUtPmJoLCAiY2FsbCBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEiKTsKKwkJZXJyID0gZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgd2hlcmUtPmJoKTsKKwkJaWYgKGVycikgCisJCQlnb3RvIGVycl9vdXQ7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogT0ssIHdlIHNwbGljZWQgaXQgaW50byB0aGUgaW5vZGUgaXRzZWxmIG9uIGEgZGlyZWN0IGJsb2NrLgorCQkgKiBJbm9kZSB3YXMgZGlydGllZCBhYm92ZS4KKwkJICovCisJCWpiZF9kZWJ1Zyg1LCAic3BsaWNpbmcgZGlyZWN0XG4iKTsKKwl9CisJcmV0dXJuIGVycjsKKworY2hhbmdlZDoKKwkvKgorCSAqIEFLUE06IGlmIHdoZXJlW2ldLmJoIGlzbid0IHBhcnQgb2YgdGhlIGN1cnJlbnQgdXBkYXRpbmcKKwkgKiB0cmFuc2FjdGlvbiB0aGVuIHdlIGV4cGxvZGUgbmFzdGlseS4gIFRlc3QgdGhpcyBjb2RlIHBhdGguCisJICovCisJamJkX2RlYnVnKDEsICJ0aGUgY2hhaW4gY2hhbmdlZDogdHJ5IGFnYWluXG4iKTsKKwllcnIgPSAtRUFHQUlOOworCitlcnJfb3V0OgorCWZvciAoaSA9IDE7IGkgPCBudW07IGkrKykgeworCQlCVUZGRVJfVFJBQ0Uod2hlcmVbaV0uYmgsICJjYWxsIGpvdXJuYWxfZm9yZ2V0Iik7CisJCWV4dDNfam91cm5hbF9mb3JnZXQoaGFuZGxlLCB3aGVyZVtpXS5iaCk7CisJfQorCS8qIEZvciB0aGUgbm9ybWFsIGNvbGxpc2lvbiBjbGVhbnVwIGNhc2UsIHdlIGZyZWUgdXAgdGhlIGJsb2Nrcy4KKwkgKiBPbiBnZW51aW5lIGZpbGVzeXN0ZW0gZXJyb3JzIHdlIGRvbid0IGV2ZW4gdGhpbmsgYWJvdXQgZG9pbmcKKwkgKiB0aGF0LiAqLworCWlmIChlcnIgPT0gLUVBR0FJTikKKwkJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQorCQkJZXh0M19mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCAKKwkJCQkJIGxlMzJfdG9fY3B1KHdoZXJlW2ldLmtleSksIDEpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBBbGxvY2F0aW9uIHN0cmF0ZWd5IGlzIHNpbXBsZTogaWYgd2UgaGF2ZSB0byBhbGxvY2F0ZSBzb21ldGhpbmcsIHdlIHdpbGwKKyAqIGhhdmUgdG8gZ28gdGhlIHdob2xlIHdheSB0byBsZWFmLiBTbyBsZXQncyBkbyBpdCBiZWZvcmUgYXR0YWNoaW5nIGFueXRoaW5nCisgKiB0byB0cmVlLCBzZXQgbGlua2FnZSBiZXR3ZWVuIHRoZSBuZXdib3JuIGJsb2Nrcywgd3JpdGUgdGhlbSBpZiBzeW5jIGlzCisgKiByZXF1aXJlZCwgcmVjaGVjayB0aGUgcGF0aCwgZnJlZSBhbmQgcmVwZWF0IGlmIGNoZWNrIGZhaWxzLCBvdGhlcndpc2UKKyAqIHNldCB0aGUgbGFzdCBtaXNzaW5nIGxpbmsgKHRoYXQgd2lsbCBwcm90ZWN0IHVzIGZyb20gYW55IHRydW5jYXRlLWdlbmVyYXRlZAorICogcmVtb3ZhbHMgLSBhbGwgYmxvY2tzIG9uIHRoZSBwYXRoIGFyZSBpbW11bmUgbm93KSBhbmQgcG9zc2libHkgZm9yY2UgdGhlCisgKiB3cml0ZSBvbiB0aGUgcGFyZW50IGJsb2NrLgorICogVGhhdCBoYXMgYSBuaWNlIGFkZGl0aW9uYWwgcHJvcGVydHk6IG5vIHNwZWNpYWwgcmVjb3ZlcnkgZnJvbSB0aGUgZmFpbGVkCisgKiBhbGxvY2F0aW9ucyBpcyBuZWVkZWQgLSB3ZSBzaW1wbHkgcmVsZWFzZSBibG9ja3MgYW5kIGRvIG5vdCB0b3VjaCBhbnl0aGluZworICogcmVhY2hhYmxlIGZyb20gaW5vZGUuCisgKgorICogYWtwbTogYGhhbmRsZScgY2FuIGJlIE5VTEwgaWYgY3JlYXRlID09IDAuCisgKgorICogVGhlIEJLTCBtYXkgbm90IGJlIGhlbGQgb24gZW50cnkgaGVyZS4gIEJlIHN1cmUgdG8gdGFrZSBpdCBlYXJseS4KKyAqLworCitzdGF0aWMgaW50CitleHQzX2dldF9ibG9ja19oYW5kbGUoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgaWJsb2NrLAorCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSwgaW50IGV4dGVuZF9kaXNrc2l6ZSkKK3sKKwlpbnQgZXJyID0gLUVJTzsKKwlpbnQgb2Zmc2V0c1s0XTsKKwlJbmRpcmVjdCBjaGFpbls0XTsKKwlJbmRpcmVjdCAqcGFydGlhbDsKKwl1bnNpZ25lZCBsb25nIGdvYWw7CisJaW50IGxlZnQ7CisJaW50IGJvdW5kYXJ5ID0gMDsKKwlpbnQgZGVwdGggPSBleHQzX2Jsb2NrX3RvX3BhdGgoaW5vZGUsIGlibG9jaywgb2Zmc2V0cywgJmJvdW5kYXJ5KTsKKwlzdHJ1Y3QgZXh0M19pbm9kZV9pbmZvICplaSA9IEVYVDNfSShpbm9kZSk7CisKKwlKX0FTU0VSVChoYW5kbGUgIT0gTlVMTCB8fCBjcmVhdGUgPT0gMCk7CisKKwlpZiAoZGVwdGggPT0gMCkKKwkJZ290byBvdXQ7CisKK3JlcmVhZDoKKwlwYXJ0aWFsID0gZXh0M19nZXRfYnJhbmNoKGlub2RlLCBkZXB0aCwgb2Zmc2V0cywgY2hhaW4sICZlcnIpOworCisJLyogU2ltcGxlc3QgY2FzZSAtIGJsb2NrIGZvdW5kLCBubyBhbGxvY2F0aW9uIG5lZWRlZCAqLworCWlmICghcGFydGlhbCkgeworCQljbGVhcl9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7Citnb3RfaXQ6CisJCW1hcF9iaChiaF9yZXN1bHQsIGlub2RlLT5pX3NiLCBsZTMyX3RvX2NwdShjaGFpbltkZXB0aC0xXS5rZXkpKTsKKwkJaWYgKGJvdW5kYXJ5KQorCQkJc2V0X2J1ZmZlcl9ib3VuZGFyeShiaF9yZXN1bHQpOworCQkvKiBDbGVhbiB1cCBhbmQgZXhpdCAqLworCQlwYXJ0aWFsID0gY2hhaW4rZGVwdGgtMTsgLyogdGhlIHdob2xlIGNoYWluICovCisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKiBOZXh0IHNpbXBsZSBjYXNlIC0gcGxhaW4gbG9va3VwIG9yIGZhaWxlZCByZWFkIG9mIGluZGlyZWN0IGJsb2NrICovCisJaWYgKCFjcmVhdGUgfHwgZXJyID09IC1FSU8pIHsKK2NsZWFudXA6CisJCXdoaWxlIChwYXJ0aWFsID4gY2hhaW4pIHsKKwkJCUJVRkZFUl9UUkFDRShwYXJ0aWFsLT5iaCwgImNhbGwgYnJlbHNlIik7CisJCQlicmVsc2UocGFydGlhbC0+YmgpOworCQkJcGFydGlhbC0tOworCQl9CisJCUJVRkZFUl9UUkFDRShiaF9yZXN1bHQsICJyZXR1cm5lZCIpOworb3V0OgorCQlyZXR1cm4gZXJyOworCX0KKworCS8qCisJICogSW5kaXJlY3QgYmxvY2sgbWlnaHQgYmUgcmVtb3ZlZCBieSB0cnVuY2F0ZSB3aGlsZSB3ZSB3ZXJlCisJICogcmVhZGluZyBpdC4gSGFuZGxpbmcgb2YgdGhhdCBjYXNlIChmb3JnZXQgd2hhdCB3ZSd2ZSBnb3QgYW5kCisJICogcmVyZWFkKSBpcyB0YWtlbiBvdXQgb2YgdGhlIG1haW4gcGF0aC4KKwkgKi8KKwlpZiAoZXJyID09IC1FQUdBSU4pCisJCWdvdG8gY2hhbmdlZDsKKworCWdvYWwgPSAwOworCWRvd24oJmVpLT50cnVuY2F0ZV9zZW0pOworCisJLyogbGF6eSBpbml0aWFsaXplIHRoZSBibG9jayBhbGxvY2F0aW9uIGluZm8gaGVyZSBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJiAoIWVpLT5pX2Jsb2NrX2FsbG9jX2luZm8pKSB7CisJCWV4dDNfaW5pdF9ibG9ja19hbGxvY19pbmZvKGlub2RlKTsKKwl9CisKKwlpZiAoZXh0M19maW5kX2dvYWwoaW5vZGUsIGlibG9jaywgY2hhaW4sIHBhcnRpYWwsICZnb2FsKSA8IDApIHsKKwkJdXAoJmVpLT50cnVuY2F0ZV9zZW0pOworCQlnb3RvIGNoYW5nZWQ7CisJfQorCisJbGVmdCA9IChjaGFpbiArIGRlcHRoKSAtIHBhcnRpYWw7CisKKwkvKgorCSAqIEJsb2NrIG91dCBleHQzX3RydW5jYXRlIHdoaWxlIHdlIGFsdGVyIHRoZSB0cmVlCisJICovCisJZXJyID0gZXh0M19hbGxvY19icmFuY2goaGFuZGxlLCBpbm9kZSwgbGVmdCwgZ29hbCwKKwkJCQkJb2Zmc2V0cysocGFydGlhbC1jaGFpbiksIHBhcnRpYWwpOworCisJLyogVGhlIGV4dDNfc3BsaWNlX2JyYW5jaCBjYWxsIHdpbGwgZnJlZSBhbmQgZm9yZ2V0IGFueSBidWZmZXJzCisJICogb24gdGhlIG5ldyBjaGFpbiBpZiB0aGVyZSBpcyBhIGZhaWx1cmUsIGJ1dCB0aGF0IHJpc2tzIHVzaW5nCisJICogdXAgdHJhbnNhY3Rpb24gY3JlZGl0cywgZXNwZWNpYWxseSBmb3IgYml0bWFwcyB3aGVyZSB0aGUKKwkgKiBjcmVkaXRzIGNhbm5vdCBiZSByZXR1cm5lZC4gIENhbiB3ZSBoYW5kbGUgdGhpcyBzb21laG93PyAgV2UKKwkgKiBtYXkgbmVlZCB0byByZXR1cm4gLUVBR0FJTiB1cHdhcmRzIGluIHRoZSB3b3JzdCBjYXNlLiAgLS1zY3QgKi8KKwlpZiAoIWVycikKKwkJZXJyID0gZXh0M19zcGxpY2VfYnJhbmNoKGhhbmRsZSwgaW5vZGUsIGlibG9jaywgY2hhaW4sCisJCQkJCSBwYXJ0aWFsLCBsZWZ0KTsKKwkvKiBpX2Rpc2tzaXplIGdyb3dpbmcgaXMgcHJvdGVjdGVkIGJ5IHRydW5jYXRlX3NlbQorCSAqIGRvbid0IGZvcmdldCB0byBwcm90ZWN0IGl0IGlmIHlvdSdyZSBhYm91dCB0byBpbXBsZW1lbnQKKwkgKiBjb25jdXJyZW50IGV4dDNfZ2V0X2Jsb2NrKCkgLWJ6enogKi8KKwlpZiAoIWVyciAmJiBleHRlbmRfZGlza3NpemUgJiYgaW5vZGUtPmlfc2l6ZSA+IGVpLT5pX2Rpc2tzaXplKQorCQllaS0+aV9kaXNrc2l6ZSA9IGlub2RlLT5pX3NpemU7CisJdXAoJmVpLT50cnVuY2F0ZV9zZW0pOworCWlmIChlcnIgPT0gLUVBR0FJTikKKwkJZ290byBjaGFuZ2VkOworCWlmIChlcnIpCisJCWdvdG8gY2xlYW51cDsKKworCXNldF9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7CisJZ290byBnb3RfaXQ7CisKK2NoYW5nZWQ6CisJd2hpbGUgKHBhcnRpYWwgPiBjaGFpbikgeworCQlqYmRfZGVidWcoMSwgImJ1ZmZlciBjaGFpbiBjaGFuZ2VkLCByZXRyeWluZ1xuIik7CisJCUJVRkZFUl9UUkFDRShwYXJ0aWFsLT5iaCwgImJyZWxzaW5nIik7CisJCWJyZWxzZShwYXJ0aWFsLT5iaCk7CisJCXBhcnRpYWwtLTsKKwl9CisJZ290byByZXJlYWQ7Cit9CisKK3N0YXRpYyBpbnQgZXh0M19nZXRfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgaWJsb2NrLAorCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpCit7CisJaGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7CisJaW50IHJldDsKKworCWlmIChjcmVhdGUpIHsKKwkJaGFuZGxlID0gZXh0M19qb3VybmFsX2N1cnJlbnRfaGFuZGxlKCk7CisJCUpfQVNTRVJUKGhhbmRsZSAhPSAwKTsKKwl9CisJcmV0ID0gZXh0M19nZXRfYmxvY2tfaGFuZGxlKGhhbmRsZSwgaW5vZGUsIGlibG9jaywKKwkJCQliaF9yZXN1bHQsIGNyZWF0ZSwgMSk7CisJcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBESU9fQ1JFRElUUyAoRVhUM19SRVNFUlZFX1RSQU5TX0JMT0NLUyArIDMyKQorCitzdGF0aWMgaW50CitleHQzX2RpcmVjdF9pb19nZXRfYmxvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGlibG9jaywKKwkJdW5zaWduZWQgbG9uZyBtYXhfYmxvY2tzLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwKKwkJaW50IGNyZWF0ZSkKK3sKKwloYW5kbGVfdCAqaGFuZGxlID0gam91cm5hbF9jdXJyZW50X2hhbmRsZSgpOworCWludCByZXQgPSAwOworCisJaWYgKCFoYW5kbGUpCisJCWdvdG8gZ2V0X2Jsb2NrOwkJLyogQSByZWFkICovCisKKwlpZiAoaGFuZGxlLT5oX3RyYW5zYWN0aW9uLT50X3N0YXRlID09IFRfTE9DS0VEKSB7CisJCS8qCisJCSAqIEh1Z2UgZGlyZWN0LWlvIHdyaXRlcyBjYW4gaG9sZCBvZmYgY29tbWl0cyBmb3IgbG9uZworCQkgKiBwZXJpb2RzIG9mIHRpbWUuICBMZXQgdGhpcyBjb21taXQgcnVuLgorCQkgKi8KKwkJZXh0M19qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwkJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGlub2RlLCBESU9fQ1JFRElUUyk7CisJCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJZ290byBnZXRfYmxvY2s7CisJfQorCisJaWYgKGhhbmRsZS0+aF9idWZmZXJfY3JlZGl0cyA8PSBFWFQzX1JFU0VSVkVfVFJBTlNfQkxPQ0tTKSB7CisJCS8qCisJCSAqIEdldHRpbmcgbG93IG9uIGJ1ZmZlciBjcmVkaXRzLi4uCisJCSAqLworCQlyZXQgPSBleHQzX2pvdXJuYWxfZXh0ZW5kKGhhbmRsZSwgRElPX0NSRURJVFMpOworCQlpZiAocmV0ID4gMCkgeworCQkJLyoKKwkJCSAqIENvdWxkbid0IGV4dGVuZCB0aGUgdHJhbnNhY3Rpb24uICBTdGFydCBhIG5ldyBvbmUuCisJCQkgKi8KKwkJCXJldCA9IGV4dDNfam91cm5hbF9yZXN0YXJ0KGhhbmRsZSwgRElPX0NSRURJVFMpOworCQl9CisJfQorCitnZXRfYmxvY2s6CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSBleHQzX2dldF9ibG9ja19oYW5kbGUoaGFuZGxlLCBpbm9kZSwgaWJsb2NrLAorCQkJCQliaF9yZXN1bHQsIGNyZWF0ZSwgMCk7CisJYmhfcmVzdWx0LT5iX3NpemUgPSAoMSA8PCBpbm9kZS0+aV9ibGtiaXRzKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGV4dDNfd3JpdGVwYWdlc19nZXRfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgaWJsb2NrLAorCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IGNyZWF0ZSkKK3sKKwlyZXR1cm4gZXh0M19kaXJlY3RfaW9fZ2V0X2Jsb2Nrcyhpbm9kZSwgaWJsb2NrLCAxLCBiaCwgY3JlYXRlKTsKK30KKworLyoKKyAqIGBoYW5kbGUnIGNhbiBiZSBOVUxMIGlmIGNyZWF0ZSBpcyB6ZXJvCisgKi8KK3N0cnVjdCBidWZmZXJfaGVhZCAqZXh0M19nZXRibGsoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICogaW5vZGUsCisJCQkJbG9uZyBibG9jaywgaW50IGNyZWF0ZSwgaW50ICogZXJycCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgZHVtbXk7CisJaW50IGZhdGFsID0gMCwgZXJyOworCisJSl9BU1NFUlQoaGFuZGxlICE9IE5VTEwgfHwgY3JlYXRlID09IDApOworCisJZHVtbXkuYl9zdGF0ZSA9IDA7CisJZHVtbXkuYl9ibG9ja25yID0gLTEwMDA7CisJYnVmZmVyX3RyYWNlX2luaXQoJmR1bW15LmJfaGlzdG9yeSk7CisJKmVycnAgPSBleHQzX2dldF9ibG9ja19oYW5kbGUoaGFuZGxlLCBpbm9kZSwgYmxvY2ssICZkdW1teSwgY3JlYXRlLCAxKTsKKwlpZiAoISplcnJwICYmIGJ1ZmZlcl9tYXBwZWQoJmR1bW15KSkgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCQliaCA9IHNiX2dldGJsayhpbm9kZS0+aV9zYiwgZHVtbXkuYl9ibG9ja25yKTsKKwkJaWYgKGJ1ZmZlcl9uZXcoJmR1bW15KSkgeworCQkJSl9BU1NFUlQoY3JlYXRlICE9IDApOworCQkJSl9BU1NFUlQoaGFuZGxlICE9IDApOworCisJCQkvKiBOb3cgdGhhdCB3ZSBkbyBub3QgYWx3YXlzIGpvdXJuYWwgZGF0YSwgd2UKKwkJCSAgIHNob3VsZCBrZWVwIGluIG1pbmQgd2hldGhlciB0aGlzIHNob3VsZAorCQkJICAgYWx3YXlzIGpvdXJuYWwgdGhlIG5ldyBidWZmZXIgYXMgbWV0YWRhdGEuCisJCQkgICBGb3Igbm93LCByZWd1bGFyIGZpbGUgd3JpdGVzIHVzZQorCQkJICAgZXh0M19nZXRfYmxvY2sgaW5zdGVhZCwgc28gaXQncyBub3QgYQorCQkJICAgcHJvYmxlbS4gKi8KKwkJCWxvY2tfYnVmZmVyKGJoKTsKKwkJCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgZ2V0X2NyZWF0ZV9hY2Nlc3MiKTsKKwkJCWZhdGFsID0gZXh0M19qb3VybmFsX2dldF9jcmVhdGVfYWNjZXNzKGhhbmRsZSwgYmgpOworCQkJaWYgKCFmYXRhbCAmJiAhYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQkJCW1lbXNldChiaC0+Yl9kYXRhLCAwLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOworCQkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQkJfQorCQkJdW5sb2NrX2J1ZmZlcihiaCk7CisJCQlCVUZGRVJfVFJBQ0UoYmgsICJjYWxsIGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOworCQkJZXJyID0gZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOworCQkJaWYgKCFmYXRhbCkKKwkJCQlmYXRhbCA9IGVycjsKKwkJfSBlbHNlIHsKKwkJCUJVRkZFUl9UUkFDRShiaCwgIm5vdCBhIG5ldyBidWZmZXIiKTsKKwkJfQorCQlpZiAoZmF0YWwpIHsKKwkJCSplcnJwID0gZmF0YWw7CisJCQlicmVsc2UoYmgpOworCQkJYmggPSBOVUxMOworCQl9CisJCXJldHVybiBiaDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBidWZmZXJfaGVhZCAqZXh0M19icmVhZChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwKKwkJCSAgICAgICBpbnQgYmxvY2ssIGludCBjcmVhdGUsIGludCAqZXJyKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCisJYmggPSBleHQzX2dldGJsayhoYW5kbGUsIGlub2RlLCBibG9jaywgY3JlYXRlLCBlcnIpOworCWlmICghYmgpCisJCXJldHVybiBiaDsKKwlpZiAoYnVmZmVyX3VwdG9kYXRlKGJoKSkKKwkJcmV0dXJuIGJoOworCWxsX3J3X2Jsb2NrKFJFQUQsIDEsICZiaCk7CisJd2FpdF9vbl9idWZmZXIoYmgpOworCWlmIChidWZmZXJfdXB0b2RhdGUoYmgpKQorCQlyZXR1cm4gYmg7CisJcHV0X2JoKGJoKTsKKwkqZXJyID0gLUVJTzsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCB3YWxrX3BhZ2VfYnVmZmVycygJaGFuZGxlX3QgKmhhbmRsZSwKKwkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQsCisJCQkJdW5zaWduZWQgZnJvbSwKKwkJCQl1bnNpZ25lZCB0bywKKwkJCQlpbnQgKnBhcnRpYWwsCisJCQkJaW50ICgqZm4pKAloYW5kbGVfdCAqaGFuZGxlLAorCQkJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwl1bnNpZ25lZCBibG9ja19zdGFydCwgYmxvY2tfZW5kOworCXVuc2lnbmVkIGJsb2Nrc2l6ZSA9IGhlYWQtPmJfc2l6ZTsKKwlpbnQgZXJyLCByZXQgPSAwOworCXN0cnVjdCBidWZmZXJfaGVhZCAqbmV4dDsKKworCWZvciAoCWJoID0gaGVhZCwgYmxvY2tfc3RhcnQgPSAwOworCQlyZXQgPT0gMCAmJiAoYmggIT0gaGVhZCB8fCAhYmxvY2tfc3RhcnQpOworCSAgICAJYmxvY2tfc3RhcnQgPSBibG9ja19lbmQsIGJoID0gbmV4dCkKKwl7CisJCW5leHQgPSBiaC0+Yl90aGlzX3BhZ2U7CisJCWJsb2NrX2VuZCA9IGJsb2NrX3N0YXJ0ICsgYmxvY2tzaXplOworCQlpZiAoYmxvY2tfZW5kIDw9IGZyb20gfHwgYmxvY2tfc3RhcnQgPj0gdG8pIHsKKwkJCWlmIChwYXJ0aWFsICYmICFidWZmZXJfdXB0b2RhdGUoYmgpKQorCQkJCSpwYXJ0aWFsID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWVyciA9ICgqZm4pKGhhbmRsZSwgYmgpOworCQlpZiAoIXJldCkKKwkJCXJldCA9IGVycjsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRvIHByZXNlcnZlIG9yZGVyaW5nLCBpdCBpcyBlc3NlbnRpYWwgdGhhdCB0aGUgaG9sZSBpbnN0YW50aWF0aW9uIGFuZAorICogdGhlIGRhdGEgd3JpdGUgYmUgZW5jYXBzdWxhdGVkIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uLiAgV2UgY2Fubm90CisgKiBjbG9zZSBvZmYgYSB0cmFuc2FjdGlvbiBhbmQgc3RhcnQgYSBuZXcgb25lIGJldHdlZW4gdGhlIGV4dDNfZ2V0X2Jsb2NrKCkKKyAqIGFuZCB0aGUgY29tbWl0X3dyaXRlKCkuICBTbyBkb2luZyB0aGUgam91cm5hbF9zdGFydCBhdCB0aGUgc3RhcnQgb2YKKyAqIHByZXBhcmVfd3JpdGUoKSBpcyB0aGUgcmlnaHQgcGxhY2UuCisgKgorICogQWxzbywgdGhpcyBmdW5jdGlvbiBjYW4gbmVzdCBpbnNpZGUgZXh0M193cml0ZXBhZ2UoKSAtPgorICogYmxvY2tfd3JpdGVfZnVsbF9wYWdlKCkuIEluIHRoYXQgY2FzZSwgd2UgKmtub3cqIHRoYXQgZXh0M193cml0ZXBhZ2UoKQorICogaGFzIGdlbmVyYXRlZCBlbm91Z2ggYnVmZmVyIGNyZWRpdHMgdG8gZG8gdGhlIHdob2xlIHBhZ2UuICBTbyB3ZSB3b24ndAorICogYmxvY2sgb24gdGhlIGpvdXJuYWwgaW4gdGhhdCBjYXNlLCB3aGljaCBpcyBnb29kLCBiZWNhdXNlIHRoZSBjYWxsZXIgbWF5CisgKiBiZSBQRl9NRU1BTExPQy4KKyAqCisgKiBCeSBhY2NpZGVudCwgZXh0MyBjYW4gYmUgcmVlbnRlcmVkIHdoZW4gYSB0cmFuc2FjdGlvbiBpcyBvcGVuIHZpYQorICogcXVvdGEgZmlsZSB3cml0ZXMuICBJZiB3ZSB3ZXJlIHRvIGNvbW1pdCB0aGUgdHJhbnNhY3Rpb24gd2hpbGUgdGh1cworICogcmVlbnRlcmVkLCB0aGVyZSBjYW4gYmUgYSBkZWFkbG9jayAtIHdlIHdvdWxkIGJlIGhvbGRpbmcgYSBxdW90YQorICogbG9jaywgYW5kIHRoZSBjb21taXQgd291bGQgbmV2ZXIgY29tcGxldGUgaWYgYW5vdGhlciB0aHJlYWQgaGFkIGEKKyAqIHRyYW5zYWN0aW9uIG9wZW4gYW5kIHdhcyBibG9ja2luZyBvbiB0aGUgcXVvdGEgbG9jayAtIGEgcmFua2luZworICogdmlvbGF0aW9uLgorICoKKyAqIFNvIHdoYXQgd2UgZG8gaXMgdG8gcmVseSBvbiB0aGUgZmFjdCB0aGF0IGpvdXJuYWxfc3RvcC9qb3VybmFsX3N0YXJ0CisgKiB3aWxsIF9ub3RfIHJ1biBjb21taXQgdW5kZXIgdGhlc2UgY2lyY3Vtc3RhbmNlcyBiZWNhdXNlIGhhbmRsZS0+aF9yZWYKKyAqIGlzIGVsZXZhdGVkLiAgV2UnbGwgc3RpbGwgaGF2ZSBlbm91Z2ggY3JlZGl0cyBmb3IgdGhlIHRpbnkgcXVvdGFmaWxlCisgKiB3cml0ZS4gIAorICovCisKK3N0YXRpYyBpbnQgZG9fam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZV90ICpoYW5kbGUsIAorCQkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWlmICghYnVmZmVyX21hcHBlZChiaCkgfHwgYnVmZmVyX2ZyZWVkKGJoKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmgpOworfQorCitzdGF0aWMgaW50IGV4dDNfcHJlcGFyZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkgICAgICB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlpbnQgcmV0LCBuZWVkZWRfYmxvY2tzID0gZXh0M193cml0ZXBhZ2VfdHJhbnNfYmxvY2tzKGlub2RlKTsKKwloYW5kbGVfdCAqaGFuZGxlOworCWludCByZXRyaWVzID0gMDsKKworcmV0cnk6CisJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGlub2RlLCBuZWVkZWRfYmxvY2tzKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOworCQlnb3RvIG91dDsKKwl9CisJaWYgKHRlc3Rfb3B0KGlub2RlLT5pX3NiLCBOT0JIKSkKKwkJcmV0ID0gbm9iaF9wcmVwYXJlX3dyaXRlKHBhZ2UsIGZyb20sIHRvLCBleHQzX2dldF9ibG9jayk7CisJZWxzZQorCQlyZXQgPSBibG9ja19wcmVwYXJlX3dyaXRlKHBhZ2UsIGZyb20sIHRvLCBleHQzX2dldF9ibG9jayk7CisJaWYgKHJldCkKKwkJZ290byBwcmVwYXJlX3dyaXRlX2ZhaWxlZDsKKworCWlmIChleHQzX3Nob3VsZF9qb3VybmFsX2RhdGEoaW5vZGUpKSB7CisJCXJldCA9IHdhbGtfcGFnZV9idWZmZXJzKGhhbmRsZSwgcGFnZV9idWZmZXJzKHBhZ2UpLAorCQkJCWZyb20sIHRvLCBOVUxMLCBkb19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MpOworCX0KK3ByZXBhcmVfd3JpdGVfZmFpbGVkOgorCWlmIChyZXQpCisJCWV4dDNfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJaWYgKHJldCA9PSAtRU5PU1BDICYmIGV4dDNfc2hvdWxkX3JldHJ5X2FsbG9jKGlub2RlLT5pX3NiLCAmcmV0cmllcykpCisJCWdvdG8gcmV0cnk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworaW50CitleHQzX2pvdXJuYWxfZGlydHlfZGF0YShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWludCBlcnIgPSBqb3VybmFsX2RpcnR5X2RhdGEoaGFuZGxlLCBiaCk7CisJaWYgKGVycikKKwkJZXh0M19qb3VybmFsX2Fib3J0X2hhbmRsZShfX0ZVTkNUSU9OX18sIF9fRlVOQ1RJT05fXywKKwkJCQkJCWJoLCBoYW5kbGUsZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiBGb3IgY29tbWl0X3dyaXRlKCkgaW4gZGF0YT1qb3VybmFsIG1vZGUgKi8KK3N0YXRpYyBpbnQgY29tbWl0X3dyaXRlX2ZuKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaWYgKCFidWZmZXJfbWFwcGVkKGJoKSB8fCBidWZmZXJfZnJlZWQoYmgpKQorCQlyZXR1cm4gMDsKKwlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwlyZXR1cm4gZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOworfQorCisvKgorICogV2UgbmVlZCB0byBwaWNrIHVwIHRoZSBuZXcgaW5vZGUgc2l6ZSB3aGljaCBnZW5lcmljX2NvbW1pdF93cml0ZSBnYXZlIHVzCisgKiBgZmlsZScgY2FuIGJlIE5VTEwgLSBlZywgd2hlbiBjYWxsZWQgZnJvbSBwYWdlX3N5bWxpbmsoKS4KKyAqCisgKiBleHQzIG5ldmVyIHBsYWNlcyBidWZmZXJzIG9uIGlub2RlLT5pX21hcHBpbmctPnByaXZhdGVfbGlzdC4gIG1ldGFkYXRhCisgKiBidWZmZXJzIGFyZSBtYW5hZ2VkIGludGVybmFsbHkuCisgKi8KKworc3RhdGljIGludCBleHQzX29yZGVyZWRfY29tbWl0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCSAgICAgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCit7CisJaGFuZGxlX3QgKmhhbmRsZSA9IGV4dDNfam91cm5hbF9jdXJyZW50X2hhbmRsZSgpOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCWludCByZXQgPSAwLCByZXQyOworCisJcmV0ID0gd2Fsa19wYWdlX2J1ZmZlcnMoaGFuZGxlLCBwYWdlX2J1ZmZlcnMocGFnZSksCisJCWZyb20sIHRvLCBOVUxMLCBleHQzX2pvdXJuYWxfZGlydHlfZGF0YSk7CisKKwlpZiAocmV0ID09IDApIHsKKwkJLyoKKwkJICogZ2VuZXJpY19jb21taXRfd3JpdGUoKSB3aWxsIHJ1biBtYXJrX2lub2RlX2RpcnR5KCkgaWYgaV9zaXplCisJCSAqIGNoYW5nZXMuICBTbyBsZXQncyBwaWdneWJhY2sgdGhlIGlfZGlza3NpemUgbWFya19pbm9kZV9kaXJ0eQorCQkgKiBpbnRvIHRoYXQuCisJCSAqLworCQlsb2ZmX3QgbmV3X2lfc2l6ZTsKKworCQluZXdfaV9zaXplID0gKChsb2ZmX3QpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgKyB0bzsKKwkJaWYgKG5ld19pX3NpemUgPiBFWFQzX0koaW5vZGUpLT5pX2Rpc2tzaXplKQorCQkJRVhUM19JKGlub2RlKS0+aV9kaXNrc2l6ZSA9IG5ld19pX3NpemU7CisJCXJldCA9IGdlbmVyaWNfY29tbWl0X3dyaXRlKGZpbGUsIHBhZ2UsIGZyb20sIHRvKTsKKwl9CisJcmV0MiA9IGV4dDNfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJaWYgKCFyZXQpCisJCXJldCA9IHJldDI7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBleHQzX3dyaXRlYmFja19jb21taXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJICAgICB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKwloYW5kbGVfdCAqaGFuZGxlID0gZXh0M19qb3VybmFsX2N1cnJlbnRfaGFuZGxlKCk7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJaW50IHJldCA9IDAsIHJldDI7CisJbG9mZl90IG5ld19pX3NpemU7CisKKwluZXdfaV9zaXplID0gKChsb2ZmX3QpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgKyB0bzsKKwlpZiAobmV3X2lfc2l6ZSA+IEVYVDNfSShpbm9kZSktPmlfZGlza3NpemUpCisJCUVYVDNfSShpbm9kZSktPmlfZGlza3NpemUgPSBuZXdfaV9zaXplOworCisJaWYgKHRlc3Rfb3B0KGlub2RlLT5pX3NiLCBOT0JIKSkKKwkJcmV0ID0gbm9iaF9jb21taXRfd3JpdGUoZmlsZSwgcGFnZSwgZnJvbSwgdG8pOworCWVsc2UKKwkJcmV0ID0gZ2VuZXJpY19jb21taXRfd3JpdGUoZmlsZSwgcGFnZSwgZnJvbSwgdG8pOworCisJcmV0MiA9IGV4dDNfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJaWYgKCFyZXQpCisJCXJldCA9IHJldDI7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBleHQzX2pvdXJuYWxsZWRfY29tbWl0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCWhhbmRsZV90ICpoYW5kbGUgPSBleHQzX2pvdXJuYWxfY3VycmVudF9oYW5kbGUoKTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlpbnQgcmV0ID0gMCwgcmV0MjsKKwlpbnQgcGFydGlhbCA9IDA7CisJbG9mZl90IHBvczsKKworCS8qCisJICogSGVyZSB3ZSBkdXBsaWNhdGUgdGhlIGdlbmVyaWNfY29tbWl0X3dyaXRlKCkgZnVuY3Rpb25hbGl0eQorCSAqLworCXBvcyA9ICgobG9mZl90KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpICsgdG87CisKKwlyZXQgPSB3YWxrX3BhZ2VfYnVmZmVycyhoYW5kbGUsIHBhZ2VfYnVmZmVycyhwYWdlKSwgZnJvbSwKKwkJCQl0bywgJnBhcnRpYWwsIGNvbW1pdF93cml0ZV9mbik7CisJaWYgKCFwYXJ0aWFsKQorCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJaWYgKHBvcyA+IGlub2RlLT5pX3NpemUpCisJCWlfc2l6ZV93cml0ZShpbm9kZSwgcG9zKTsKKwlFWFQzX0koaW5vZGUpLT5pX3N0YXRlIHw9IEVYVDNfU1RBVEVfSkRBVEE7CisJaWYgKGlub2RlLT5pX3NpemUgPiBFWFQzX0koaW5vZGUpLT5pX2Rpc2tzaXplKSB7CisJCUVYVDNfSShpbm9kZSktPmlfZGlza3NpemUgPSBpbm9kZS0+aV9zaXplOworCQlyZXQyID0gZXh0M19tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOworCQlpZiAoIXJldCkgCisJCQlyZXQgPSByZXQyOworCX0KKwlyZXQyID0gZXh0M19qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcmV0MjsKKwlyZXR1cm4gcmV0OworfQorCisvKiAKKyAqIGJtYXAoKSBpcyBzcGVjaWFsLiAgSXQgZ2V0cyB1c2VkIGJ5IGFwcGxpY2F0aW9ucyBzdWNoIGFzIGxpbG8gYW5kIGJ5CisgKiB0aGUgc3dhcHBlciB0byBmaW5kIHRoZSBvbi1kaXNrIGJsb2NrIG9mIGEgc3BlY2lmaWMgcGllY2Ugb2YgZGF0YS4KKyAqCisgKiBOYXR1cmFsbHksIHRoaXMgaXMgZGFuZ2Vyb3VzIGlmIHRoZSBibG9jayBjb25jZXJuZWQgaXMgc3RpbGwgaW4gdGhlCisgKiBqb3VybmFsLiAgSWYgc29tZWJvZHkgbWFrZXMgYSBzd2FwZmlsZSBvbiBhbiBleHQzIGRhdGEtam91cm5hbGluZworICogZmlsZXN5c3RlbSBhbmQgZW5hYmxlcyBzd2FwLCB0aGVuIHRoZXkgbWF5IGdldCBhIG5hc3R5IHNob2NrIHdoZW4gdGhlCisgKiBkYXRhIGdldHRpbmcgc3dhcHBlZCB0byB0aGF0IHN3YXBmaWxlIHN1ZGRlbmx5IGdldHMgb3ZlcndyaXR0ZW4gYnkKKyAqIHRoZSBvcmlnaW5hbCB6ZXJvJ3Mgd3JpdHRlbiBvdXQgcHJldmlvdXNseSB0byB0aGUgam91cm5hbCBhbmQKKyAqIGF3YWl0aW5nIHdyaXRlYmFjayBpbiB0aGUga2VybmVsJ3MgYnVmZmVyIGNhY2hlLiAKKyAqCisgKiBTbywgaWYgd2Ugc2VlIGFueSBibWFwIGNhbGxzIGhlcmUgb24gYSBtb2RpZmllZCwgZGF0YS1qb3VybmFsZWQgZmlsZSwKKyAqIHRha2UgZXh0cmEgc3RlcHMgdG8gZmx1c2ggYW55IGJsb2NrcyB3aGljaCBtaWdodCBiZSBpbiB0aGUgY2FjaGUuIAorICovCitzdGF0aWMgc2VjdG9yX3QgZXh0M19ibWFwKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzZWN0b3JfdCBibG9jaykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKKwlqb3VybmFsX3QgKmpvdXJuYWw7CisJaW50IGVycjsKKworCWlmIChFWFQzX0koaW5vZGUpLT5pX3N0YXRlICYgRVhUM19TVEFURV9KREFUQSkgeworCQkvKiAKKwkJICogVGhpcyBpcyBhIFJFQUxMWSBoZWF2eXdlaWdodCBhcHByb2FjaCwgYnV0IHRoZSB1c2Ugb2YKKwkJICogYm1hcCBvbiBkaXJ0eSBmaWxlcyBpcyBleHBlY3RlZCB0byBiZSBleHRyZW1lbHkgcmFyZToKKwkJICogb25seSBpZiB3ZSBydW4gbGlsbyBvciBzd2Fwb24gb24gYSBmcmVzaGx5IG1hZGUgZmlsZQorCQkgKiBkbyB3ZSBleHBlY3QgdGhpcyB0byBoYXBwZW4uIAorCQkgKgorCQkgKiAoYm1hcCByZXF1aXJlcyBDQVBfU1lTX1JBV0lPIHNvIHRoaXMgZG9lcyBub3QKKwkJICogcmVwcmVzZW50IGFuIHVucHJpdmlsZWdlZCB1c2VyIERPUyBhdHRhY2sgLS0tIHdlJ2QgYmUKKwkJICogaW4gdHJvdWJsZSBpZiBtb3J0YWwgdXNlcnMgY291bGQgdHJpZ2dlciB0aGlzIHBhdGggYXQKKwkJICogd2lsbC4pIAorCQkgKgorCQkgKiBOQi4gRVhUM19TVEFURV9KREFUQSBpcyBub3Qgc2V0IG9uIGZpbGVzIG90aGVyIHRoYW4KKwkJICogcmVndWxhciBmaWxlcy4gIElmIHNvbWVib2R5IHdhbnRzIHRvIGJtYXAgYSBkaXJlY3RvcnkKKwkJICogb3Igc3ltbGluayBhbmQgZ2V0cyBjb25mdXNlZCBiZWNhdXNlIHRoZSBidWZmZXIKKwkJICogaGFzbid0IHlldCBiZWVuIGZsdXNoZWQgdG8gZGlzaywgdGhleSBkZXNlcnZlCisJCSAqIGV2ZXJ5dGhpbmcgdGhleSBnZXQuCisJCSAqLworCisJCUVYVDNfSShpbm9kZSktPmlfc3RhdGUgJj0gfkVYVDNfU1RBVEVfSkRBVEE7CisJCWpvdXJuYWwgPSBFWFQzX0pPVVJOQUwoaW5vZGUpOworCQlqb3VybmFsX2xvY2tfdXBkYXRlcyhqb3VybmFsKTsKKwkJZXJyID0gam91cm5hbF9mbHVzaChqb3VybmFsKTsKKwkJam91cm5hbF91bmxvY2tfdXBkYXRlcyhqb3VybmFsKTsKKworCQlpZiAoZXJyKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIGdlbmVyaWNfYmxvY2tfYm1hcChtYXBwaW5nLGJsb2NrLGV4dDNfZ2V0X2Jsb2NrKTsKK30KKworc3RhdGljIGludCBiZ2V0X29uZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWdldF9iaChiaCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnB1dF9vbmUoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlwdXRfYmgoYmgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGpvdXJuYWxfZGlydHlfZGF0YV9mbihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWlmIChidWZmZXJfbWFwcGVkKGJoKSkKKwkJcmV0dXJuIGV4dDNfam91cm5hbF9kaXJ0eV9kYXRhKGhhbmRsZSwgYmgpOworCXJldHVybiAwOworfQorCisvKgorICogTm90ZSB0aGF0IHdlIGFsd2F5cyBzdGFydCBhIHRyYW5zYWN0aW9uIGV2ZW4gaWYgd2UncmUgbm90IGpvdXJuYWxsaW5nCisgKiBkYXRhLiAgVGhpcyBpcyB0byBwcmVzZXJ2ZSBvcmRlcmluZzogYW55IGhvbGUgaW5zdGFudGlhdGlvbiB3aXRoaW4KKyAqIF9fYmxvY2tfd3JpdGVfZnVsbF9wYWdlIC0+IGV4dDNfZ2V0X2Jsb2NrKCkgc2hvdWxkIGJlIGpvdXJuYWxsZWQKKyAqIGFsb25nIHdpdGggdGhlIGRhdGEgc28gd2UgZG9uJ3QgY3Jhc2ggYW5kIHRoZW4gZ2V0IG1ldGFkYXRhIHdoaWNoCisgKiByZWZlcnMgdG8gb2xkIGRhdGEuCisgKgorICogSW4gYWxsIGpvdXJuYWxsaW5nIG1vZGVzIGJsb2NrX3dyaXRlX2Z1bGxfcGFnZSgpIHdpbGwgc3RhcnQgdGhlIEkvTy4KKyAqCisgKiBQcm9ibGVtOgorICoKKyAqCWV4dDNfd3JpdGVwYWdlKCkgLT4ga21hbGxvYygpIC0+IF9fYWxsb2NfcGFnZXMoKSAtPiBwYWdlX2xhdW5kZXIoKSAtPgorICoJCWV4dDNfd3JpdGVwYWdlKCkKKyAqCisgKiBTaW1pbGFyIGZvcjoKKyAqCisgKglleHQzX2ZpbGVfd3JpdGUoKSAtPiBnZW5lcmljX2ZpbGVfd3JpdGUoKSAtPiBfX2FsbG9jX3BhZ2VzKCkgLT4gLi4uCisgKgorICogU2FtZSBhcHBsaWVzIHRvIGV4dDNfZ2V0X2Jsb2NrKCkuICBXZSB3aWxsIGRlYWRsb2NrIG9uIHZhcmlvdXMgdGhpbmdzIGxpa2UKKyAqIGxvY2tfam91cm5hbCBhbmQgaV90cnVuY2F0ZV9zZW0uCisgKgorICogU2V0dGluZyBQRl9NRU1BTExPQyBoZXJlIGRvZXNuJ3Qgd29yayAtIHRvbyBtYW55IGludGVybmFsIG1lbW9yeQorICogYWxsb2NhdGlvbnMgZmFpbC4KKyAqCisgKiAxNk1heTAxOiBJZiB3ZSdyZSByZWVudGVyZWQgdGhlbiBqb3VybmFsX2N1cnJlbnRfaGFuZGxlKCkgd2lsbCBiZQorICoJICAgIG5vbi16ZXJvLiBXZSBzaW1wbHkgKnJldHVybiouCisgKgorICogMSBKdWx5IDIwMDE6IEBAQCBGSVhNRToKKyAqICAgSW4gam91cm5hbGxlZCBkYXRhIG1vZGUsIGEgZGF0YSBidWZmZXIgbWF5IGJlIG1ldGFkYXRhIGFnYWluc3QgdGhlCisgKiAgIGN1cnJlbnQgdHJhbnNhY3Rpb24uICBCdXQgdGhlIHNhbWUgZmlsZSBpcyBwYXJ0IG9mIGEgc2hhcmVkIG1hcHBpbmcKKyAqICAgYW5kIHNvbWVvbmUgZG9lcyBhIHdyaXRlcGFnZSgpIG9uIGl0LgorICoKKyAqICAgV2Ugd2lsbCBtb3ZlIHRoZSBidWZmZXIgb250byB0aGUgYXN5bmNfZGF0YSBsaXN0LCBidXQgKmFmdGVyKiBpdCBoYXMKKyAqICAgYmVlbiBkaXJ0aWVkLiBTbyB0aGVyZSdzIGEgc21hbGwgd2luZG93IHdoZXJlIHdlIGhhdmUgZGlydHkgZGF0YSBvbgorICogICBCSl9NZXRhZGF0YS4KKyAqCisgKiAgIE5vdGUgdGhhdCB0aGlzIG9ubHkgYXBwbGllcyB0byB0aGUgbGFzdCBwYXJ0aWFsIHBhZ2UgaW4gdGhlIGZpbGUuICBUaGUKKyAqICAgYml0IHdoaWNoIGJsb2NrX3dyaXRlX2Z1bGxfcGFnZSgpIHVzZXMgcHJlcGFyZS9jb21taXQgZm9yLiAgKFRoYXQncworICogICBicm9rZW4gY29kZSBhbnl3YXk6IGl0J3Mgd3JvbmcgZm9yIG1zeW5jKCkpLgorICoKKyAqICAgSXQncyBhIHJhcmUgY2FzZTogYWZmZWN0cyB0aGUgZmluYWwgcGFydGlhbCBwYWdlLCBmb3Igam91cm5hbGxlZCBkYXRhCisgKiAgIHdoZXJlIHRoZSBmaWxlIGlzIHN1YmplY3QgdG8gYml0aCB3cml0ZSgpIGFuZCB3cml0ZXBhZ2UoKSBpbiB0aGUgc2FtZQorICogICB0cmFuc2N0aW9uLiAgVG8gZml4IGl0IHdlJ2xsIG5lZWQgYSBjdXN0b20gYmxvY2tfd3JpdGVfZnVsbF9wYWdlKCkuCisgKiAgIFdlJ2xsIHByb2JhYmx5IG5lZWQgdGhhdCBhbnl3YXkgZm9yIGpvdXJuYWxsaW5nIHdyaXRlcGFnZSgpIG91dHB1dC4KKyAqCisgKiBXZSBkb24ndCBob25vdXIgc3luY2hyb25vdXMgbW91bnRzIGZvciB3cml0ZXBhZ2UoKS4gIFRoYXQgd291bGQgYmUKKyAqIGRpc2FzdHJvdXMuICBBbnkgd3JpdGUoKSBvciBtZXRhZGF0YSBvcGVyYXRpb24gd2lsbCBzeW5jIHRoZSBmcyBmb3IKKyAqIHVzLgorICoKKyAqIEFLUE0yOiBpZiBhbGwgdGhlIHBhZ2UncyBidWZmZXJzIGFyZSBtYXBwZWQgdG8gZGlzayBhbmQgIWRhdGE9am91cm5hbCwKKyAqIHdlIGRvbid0IG5lZWQgdG8gb3BlbiBhIHRyYW5zYWN0aW9uIGhlcmUuCisgKi8KK3N0YXRpYyBpbnQgZXh0M19vcmRlcmVkX3dyaXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCXN0cnVjdCBidWZmZXJfaGVhZCAqcGFnZV9idWZzOworCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOworCWludCByZXQgPSAwOworCWludCBlcnI7CisKKwlKX0FTU0VSVChQYWdlTG9ja2VkKHBhZ2UpKTsKKworCS8qCisJICogV2UgZ2l2ZSB1cCBoZXJlIGlmIHdlJ3JlIHJlZW50ZXJlZCwgYmVjYXVzZSBpdCBtaWdodCBiZSBmb3IgYQorCSAqIGRpZmZlcmVudCBmaWxlc3lzdGVtLgorCSAqLworCWlmIChleHQzX2pvdXJuYWxfY3VycmVudF9oYW5kbGUoKSkKKwkJZ290byBvdXRfZmFpbDsKKworCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydChpbm9kZSwgZXh0M193cml0ZXBhZ2VfdHJhbnNfYmxvY2tzKGlub2RlKSk7CisKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOworCQlnb3RvIG91dF9mYWlsOworCX0KKworCWlmICghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkgeworCQljcmVhdGVfZW1wdHlfYnVmZmVycyhwYWdlLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUsCisJCQkJKDEgPDwgQkhfRGlydHkpfCgxIDw8IEJIX1VwdG9kYXRlKSk7CisJfQorCXBhZ2VfYnVmcyA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwl3YWxrX3BhZ2VfYnVmZmVycyhoYW5kbGUsIHBhZ2VfYnVmcywgMCwKKwkJCVBBR0VfQ0FDSEVfU0laRSwgTlVMTCwgYmdldF9vbmUpOworCisJcmV0ID0gYmxvY2tfd3JpdGVfZnVsbF9wYWdlKHBhZ2UsIGV4dDNfZ2V0X2Jsb2NrLCB3YmMpOworCisJLyoKKwkgKiBUaGUgcGFnZSBjYW4gYmVjb21lIHVubG9ja2VkIGF0IGFueSBwb2ludCBub3csIGFuZAorCSAqIHRydW5jYXRlIGNhbiB0aGVuIGNvbWUgaW4gYW5kIGNoYW5nZSB0aGluZ3MuICBTbyB3ZQorCSAqIGNhbid0IHRvdWNoICpwYWdlIGZyb20gbm93IG9uLiAgQnV0ICpwYWdlX2J1ZnMgaXMKKwkgKiBzYWZlIGR1ZSB0byBlbGV2YXRlZCByZWZjb3VudC4KKwkgKi8KKworCS8qCisJICogQW5kIGF0dGFjaCB0aGVtIHRvIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiAgQnV0IG9ubHkgaWYgCisJICogYmxvY2tfd3JpdGVfZnVsbF9wYWdlKCkgc3VjY2VlZGVkLiAgT3RoZXJ3aXNlIHRoZXkgYXJlIHVubWFwcGVkLAorCSAqIGFuZCBnZW5lcmFsbHkganVuay4KKwkgKi8KKwlpZiAocmV0ID09IDApIHsKKwkJZXJyID0gd2Fsa19wYWdlX2J1ZmZlcnMoaGFuZGxlLCBwYWdlX2J1ZnMsIDAsIFBBR0VfQ0FDSEVfU0laRSwKKwkJCQkJTlVMTCwgam91cm5hbF9kaXJ0eV9kYXRhX2ZuKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBlcnI7CisJfQorCXdhbGtfcGFnZV9idWZmZXJzKGhhbmRsZSwgcGFnZV9idWZzLCAwLAorCQkJUEFHRV9DQUNIRV9TSVpFLCBOVUxMLCBicHV0X29uZSk7CisJZXJyID0gZXh0M19qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gZXJyOworCXJldHVybiByZXQ7CisKK291dF9mYWlsOgorCXJlZGlydHlfcGFnZV9mb3Jfd3JpdGVwYWdlKHdiYywgcGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorZXh0M193cml0ZWJhY2tfd3JpdGVwYWdlX2hlbHBlcihzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlyZXR1cm4gYmxvY2tfd3JpdGVfZnVsbF9wYWdlKHBhZ2UsIGV4dDNfZ2V0X2Jsb2NrLCB3YmMpOworfQorCitzdGF0aWMgaW50CitleHQzX3dyaXRlYmFja193cml0ZXBhZ2VzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOworCWludCBlcnIsIHJldCA9IDA7CisKKwlpZiAoIW1hcHBpbmdfdGFnZ2VkKG1hcHBpbmcsIFBBR0VDQUNIRV9UQUdfRElSVFkpKQorCQlyZXR1cm4gcmV0OworCisJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGlub2RlLCBleHQzX3dyaXRlcGFnZV90cmFuc19ibG9ja3MoaW5vZGUpKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOworCQlyZXR1cm4gcmV0OworCX0KKworICAgICAgICByZXQgPSBfX21wYWdlX3dyaXRlcGFnZXMobWFwcGluZywgd2JjLCBleHQzX3dyaXRlcGFnZXNfZ2V0X2Jsb2NrLAorCQkJCQlleHQzX3dyaXRlYmFja193cml0ZXBhZ2VfaGVscGVyKTsKKworCS8qCisJICogTmVlZCB0byByZWFxdWlyZSB0aGUgaGFuZGxlIHNpbmNlIGV4dDNfd3JpdGVwYWdlc19nZXRfYmxvY2soKQorCSAqIGNhbiByZXN0YXJ0IHRoZSBoYW5kbGUKKwkgKi8KKwloYW5kbGUgPSBqb3VybmFsX2N1cnJlbnRfaGFuZGxlKCk7CisKKwllcnIgPSBleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOworCWlmICghcmV0KQorCQlyZXQgPSBlcnI7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBleHQzX3dyaXRlYmFja193cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJaGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7CisJaW50IHJldCA9IDA7CisJaW50IGVycjsKKworCWlmIChleHQzX2pvdXJuYWxfY3VycmVudF9oYW5kbGUoKSkKKwkJZ290byBvdXRfZmFpbDsKKworCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydChpbm9kZSwgZXh0M193cml0ZXBhZ2VfdHJhbnNfYmxvY2tzKGlub2RlKSk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJZ290byBvdXRfZmFpbDsKKwl9CisKKwlpZiAodGVzdF9vcHQoaW5vZGUtPmlfc2IsIE5PQkgpKQorCQlyZXQgPSBub2JoX3dyaXRlcGFnZShwYWdlLCBleHQzX2dldF9ibG9jaywgd2JjKTsKKwllbHNlCisJCXJldCA9IGJsb2NrX3dyaXRlX2Z1bGxfcGFnZShwYWdlLCBleHQzX2dldF9ibG9jaywgd2JjKTsKKworCWVyciA9IGV4dDNfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJaWYgKCFyZXQpCisJCXJldCA9IGVycjsKKwlyZXR1cm4gcmV0OworCitvdXRfZmFpbDoKKwlyZWRpcnR5X3BhZ2VfZm9yX3dyaXRlcGFnZSh3YmMsIHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZXh0M19qb3VybmFsbGVkX3dyaXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCQlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwloYW5kbGVfdCAqaGFuZGxlID0gTlVMTDsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgZXJyOworCisJaWYgKGV4dDNfam91cm5hbF9jdXJyZW50X2hhbmRsZSgpKQorCQlnb3RvIG5vX3dyaXRlOworCisJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGlub2RlLCBleHQzX3dyaXRlcGFnZV90cmFuc19ibG9ja3MoaW5vZGUpKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOworCQlnb3RvIG5vX3dyaXRlOworCX0KKworCWlmICghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSB8fCBQYWdlQ2hlY2tlZChwYWdlKSkgeworCQkvKgorCQkgKiBJdCdzIG1tYXBwZWQgcGFnZWNhY2hlLiAgQWRkIGJ1ZmZlcnMgYW5kIGpvdXJuYWwgaXQuICBUaGVyZQorCQkgKiBkb2Vzbid0IHNlZW0gbXVjaCBwb2ludCBpbiByZWRpcnR5aW5nIHRoZSBwYWdlIGhlcmUuCisJCSAqLworCQlDbGVhclBhZ2VDaGVja2VkKHBhZ2UpOworCQlyZXQgPSBibG9ja19wcmVwYXJlX3dyaXRlKHBhZ2UsIDAsIFBBR0VfQ0FDSEVfU0laRSwKKwkJCQkJZXh0M19nZXRfYmxvY2spOworCQlpZiAocmV0ICE9IDApCisJCQlnb3RvIG91dF91bmxvY2s7CisJCXJldCA9IHdhbGtfcGFnZV9idWZmZXJzKGhhbmRsZSwgcGFnZV9idWZmZXJzKHBhZ2UpLCAwLAorCQkJUEFHRV9DQUNIRV9TSVpFLCBOVUxMLCBkb19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MpOworCisJCWVyciA9IHdhbGtfcGFnZV9idWZmZXJzKGhhbmRsZSwgcGFnZV9idWZmZXJzKHBhZ2UpLCAwLAorCQkJCVBBR0VfQ0FDSEVfU0laRSwgTlVMTCwgY29tbWl0X3dyaXRlX2ZuKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJcmV0ID0gZXJyOworCQlFWFQzX0koaW5vZGUpLT5pX3N0YXRlIHw9IEVYVDNfU1RBVEVfSkRBVEE7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIEl0IG1heSBiZSBhIHBhZ2UgZnVsbCBvZiBjaGVja3BvaW50LW1vZGUgYnVmZmVycy4gIFdlIGRvbid0CisJCSAqIHJlYWxseSBrbm93IHVubGVzcyB3ZSBnbyBwb2tlIGFyb3VuZCBpbiB0aGUgYnVmZmVyX2hlYWRzLgorCQkgKiBCdXQgYmxvY2tfd3JpdGVfZnVsbF9wYWdlIHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5nLgorCQkgKi8KKwkJcmV0ID0gYmxvY2tfd3JpdGVfZnVsbF9wYWdlKHBhZ2UsIGV4dDNfZ2V0X2Jsb2NrLCB3YmMpOworCX0KKwllcnIgPSBleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOworCWlmICghcmV0KQorCQlyZXQgPSBlcnI7CitvdXQ6CisJcmV0dXJuIHJldDsKKworbm9fd3JpdGU6CisJcmVkaXJ0eV9wYWdlX2Zvcl93cml0ZXBhZ2Uod2JjLCBwYWdlKTsKK291dF91bmxvY2s6CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyBpbnQgZXh0M19yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJuIG1wYWdlX3JlYWRwYWdlKHBhZ2UsIGV4dDNfZ2V0X2Jsb2NrKTsKK30KKworc3RhdGljIGludAorZXh0M19yZWFkcGFnZXMoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQlzdHJ1Y3QgbGlzdF9oZWFkICpwYWdlcywgdW5zaWduZWQgbnJfcGFnZXMpCit7CisJcmV0dXJuIG1wYWdlX3JlYWRwYWdlcyhtYXBwaW5nLCBwYWdlcywgbnJfcGFnZXMsIGV4dDNfZ2V0X2Jsb2NrKTsKK30KKworc3RhdGljIGludCBleHQzX2ludmFsaWRhdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKK3sKKwlqb3VybmFsX3QgKmpvdXJuYWwgPSBFWFQzX0pPVVJOQUwocGFnZS0+bWFwcGluZy0+aG9zdCk7CisKKwkvKgorCSAqIElmIGl0J3MgYSBmdWxsIHRydW5jYXRlIHdlIGp1c3QgZm9yZ2V0IGFib3V0IHRoZSBwZW5kaW5nIGRpcnR5aW5nCisJICovCisJaWYgKG9mZnNldCA9PSAwKQorCQlDbGVhclBhZ2VDaGVja2VkKHBhZ2UpOworCisJcmV0dXJuIGpvdXJuYWxfaW52YWxpZGF0ZXBhZ2Uoam91cm5hbCwgcGFnZSwgb2Zmc2V0KTsKK30KKworc3RhdGljIGludCBleHQzX3JlbGVhc2VwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgd2FpdCkKK3sKKwlqb3VybmFsX3QgKmpvdXJuYWwgPSBFWFQzX0pPVVJOQUwocGFnZS0+bWFwcGluZy0+aG9zdCk7CisKKwlXQVJOX09OKFBhZ2VDaGVja2VkKHBhZ2UpKTsKKwlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpCisJCXJldHVybiAwOworCXJldHVybiBqb3VybmFsX3RyeV90b19mcmVlX2J1ZmZlcnMoam91cm5hbCwgcGFnZSwgd2FpdCk7Cit9CisKKy8qCisgKiBJZiB0aGUgT19ESVJFQ1Qgd3JpdGUgd2lsbCBleHRlbmQgdGhlIGZpbGUgdGhlbiBhZGQgdGhpcyBpbm9kZSB0byB0aGUKKyAqIG9ycGhhbiBsaXN0LiAgU28gcmVjb3Zlcnkgd2lsbCB0cnVuY2F0ZSBpdCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBzaXplCisgKiBpZiB0aGUgbWFjaGluZSBjcmFzaGVzIGR1cmluZyB0aGUgd3JpdGUuCisgKgorICogSWYgdGhlIE9fRElSRUNUIHdyaXRlIGlzIGludGFudGlhdGluZyBob2xlcyBpbnNpZGUgaV9zaXplIGFuZCB0aGUgbWFjaGluZQorICogY3Jhc2hlcyB0aGVuIHN0YWxlIGRpc2sgZGF0YSBfbWF5XyBiZSBleHBvc2VkIGluc2lkZSB0aGUgZmlsZS4KKyAqLworc3RhdGljIHNzaXplX3QgZXh0M19kaXJlY3RfSU8oaW50IHJ3LCBzdHJ1Y3Qga2lvY2IgKmlvY2IsCisJCQljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgbG9mZl90IG9mZnNldCwKKwkJCXVuc2lnbmVkIGxvbmcgbnJfc2VncykKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3QgZXh0M19pbm9kZV9pbmZvICplaSA9IEVYVDNfSShpbm9kZSk7CisJaGFuZGxlX3QgKmhhbmRsZSA9IE5VTEw7CisJc3NpemVfdCByZXQ7CisJaW50IG9ycGhhbiA9IDA7CisJc2l6ZV90IGNvdW50ID0gaW92X2xlbmd0aChpb3YsIG5yX3NlZ3MpOworCisJaWYgKHJ3ID09IFdSSVRFKSB7CisJCWxvZmZfdCBmaW5hbF9zaXplID0gb2Zmc2V0ICsgY291bnQ7CisKKwkJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGlub2RlLCBESU9fQ1JFRElUUyk7CisJCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKGZpbmFsX3NpemUgPiBpbm9kZS0+aV9zaXplKSB7CisJCQlyZXQgPSBleHQzX29ycGhhbl9hZGQoaGFuZGxlLCBpbm9kZSk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gb3V0X3N0b3A7CisJCQlvcnBoYW4gPSAxOworCQkJZWktPmlfZGlza3NpemUgPSBpbm9kZS0+aV9zaXplOworCQl9CisJfQorCisJcmV0ID0gYmxvY2tkZXZfZGlyZWN0X0lPKHJ3LCBpb2NiLCBpbm9kZSwgaW5vZGUtPmlfc2ItPnNfYmRldiwgaW92LCAKKwkJCQkgb2Zmc2V0LCBucl9zZWdzLAorCQkJCSBleHQzX2RpcmVjdF9pb19nZXRfYmxvY2tzLCBOVUxMKTsKKworCS8qCisJICogUmVhY3F1aXJlIHRoZSBoYW5kbGU6IGV4dDNfZGlyZWN0X2lvX2dldF9ibG9jaygpIGNhbiByZXN0YXJ0IHRoZQorCSAqIHRyYW5zYWN0aW9uCisJICovCisJaGFuZGxlID0gam91cm5hbF9jdXJyZW50X2hhbmRsZSgpOworCitvdXRfc3RvcDoKKwlpZiAoaGFuZGxlKSB7CisJCWludCBlcnI7CisKKwkJaWYgKG9ycGhhbiAmJiBpbm9kZS0+aV9ubGluaykKKwkJCWV4dDNfb3JwaGFuX2RlbChoYW5kbGUsIGlub2RlKTsKKwkJaWYgKG9ycGhhbiAmJiByZXQgPiAwKSB7CisJCQlsb2ZmX3QgZW5kID0gb2Zmc2V0ICsgcmV0OworCQkJaWYgKGVuZCA+IGlub2RlLT5pX3NpemUpIHsKKwkJCQllaS0+aV9kaXNrc2l6ZSA9IGVuZDsKKwkJCQlpX3NpemVfd3JpdGUoaW5vZGUsIGVuZCk7CisJCQkJLyoKKwkJCQkgKiBXZSdyZSBnb2luZyB0byByZXR1cm4gYSBwb3NpdGl2ZSBgcmV0JworCQkJCSAqIGhlcmUgZHVlIHRvIG5vbi16ZXJvLWxlbmd0aCBJL08sIHNvIHRoZXJlJ3MKKwkJCQkgKiBubyB3YXkgb2YgcmVwb3J0aW5nIGVycm9yIHJldHVybnMgZnJvbQorCQkJCSAqIGV4dDNfbWFya19pbm9kZV9kaXJ0eSgpIHRvIHVzZXJzcGFjZS4gIFNvCisJCQkJICogaWdub3JlIGl0LgorCQkJCSAqLworCQkJCWV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKKwkJCX0KKwkJfQorCQllcnIgPSBleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOworCQlpZiAocmV0ID09IDApCisJCQlyZXQgPSBlcnI7CisJfQorb3V0OgorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBQYWdlcyBjYW4gYmUgbWFya2VkIGRpcnR5IGNvbXBsZXRlbHkgYXN5bmNocm9ub3VzbHkgZnJvbSBleHQzJ3Mgam91cm5hbGxpbmcKKyAqIGFjdGl2aXR5LiAgQnkgZmlsZW1hcF9zeW5jX3B0ZSgpLCB0cnlfdG9fdW5tYXBfb25lKCksIGV0Yy4gIFdlIGNhbm5vdCBkbworICogbXVjaCBoZXJlIGJlY2F1c2UgLT5zZXRfcGFnZV9kaXJ0eSBpcyBjYWxsZWQgdW5kZXIgVkZTIGxvY2tzLiAgVGhlIHBhZ2UgaXMKKyAqIG5vdCBuZWNlc3NhcmlseSBsb2NrZWQuCisgKgorICogV2UgY2Fubm90IGp1c3QgZGlydHkgdGhlIHBhZ2UgYW5kIGxlYXZlIGF0dGFjaGVkIGJ1ZmZlcnMgY2xlYW4sIGJlY2F1c2UgdGhlCisgKiBidWZmZXJzJyBkaXJ0eSBzdGF0ZSBpcyAiZGVmaW5pdGl2ZSIuICBXZSBjYW5ub3QganVzdCBzZXQgdGhlIGJ1ZmZlcnMgZGlydHkKKyAqIG9yIGpiZGRpcnR5IGJlY2F1c2UgYWxsIHRoZSBqb3VybmFsbGluZyBjb2RlIHdpbGwgZXhwbG9kZS4KKyAqCisgKiBTbyB3aGF0IHdlIGRvIGlzIHRvIG1hcmsgdGhlIHBhZ2UgInBlbmRpbmcgZGlydHkiIGFuZCBuZXh0IHRpbWUgd3JpdGVwYWdlCisgKiBpcyBjYWxsZWQsIHByb3BhZ2F0ZSB0aGF0IGludG8gdGhlIGJ1ZmZlcnMgYXBwcm9wcmlhdGVseS4KKyAqLworc3RhdGljIGludCBleHQzX2pvdXJuYWxsZWRfc2V0X3BhZ2VfZGlydHkoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJU2V0UGFnZUNoZWNrZWQocGFnZSk7CisJcmV0dXJuIF9fc2V0X3BhZ2VfZGlydHlfbm9idWZmZXJzKHBhZ2UpOworfQorCitzdGF0aWMgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBleHQzX29yZGVyZWRfYW9wcyA9IHsKKwkucmVhZHBhZ2UJPSBleHQzX3JlYWRwYWdlLAorCS5yZWFkcGFnZXMJPSBleHQzX3JlYWRwYWdlcywKKwkud3JpdGVwYWdlCT0gZXh0M19vcmRlcmVkX3dyaXRlcGFnZSwKKwkuc3luY19wYWdlCT0gYmxvY2tfc3luY19wYWdlLAorCS5wcmVwYXJlX3dyaXRlCT0gZXh0M19wcmVwYXJlX3dyaXRlLAorCS5jb21taXRfd3JpdGUJPSBleHQzX29yZGVyZWRfY29tbWl0X3dyaXRlLAorCS5ibWFwCQk9IGV4dDNfYm1hcCwKKwkuaW52YWxpZGF0ZXBhZ2UJPSBleHQzX2ludmFsaWRhdGVwYWdlLAorCS5yZWxlYXNlcGFnZQk9IGV4dDNfcmVsZWFzZXBhZ2UsCisJLmRpcmVjdF9JTwk9IGV4dDNfZGlyZWN0X0lPLAorfTsKKworc3RhdGljIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgZXh0M193cml0ZWJhY2tfYW9wcyA9IHsKKwkucmVhZHBhZ2UJPSBleHQzX3JlYWRwYWdlLAorCS5yZWFkcGFnZXMJPSBleHQzX3JlYWRwYWdlcywKKwkud3JpdGVwYWdlCT0gZXh0M193cml0ZWJhY2tfd3JpdGVwYWdlLAorCS53cml0ZXBhZ2VzCT0gZXh0M193cml0ZWJhY2tfd3JpdGVwYWdlcywKKwkuc3luY19wYWdlCT0gYmxvY2tfc3luY19wYWdlLAorCS5wcmVwYXJlX3dyaXRlCT0gZXh0M19wcmVwYXJlX3dyaXRlLAorCS5jb21taXRfd3JpdGUJPSBleHQzX3dyaXRlYmFja19jb21taXRfd3JpdGUsCisJLmJtYXAJCT0gZXh0M19ibWFwLAorCS5pbnZhbGlkYXRlcGFnZQk9IGV4dDNfaW52YWxpZGF0ZXBhZ2UsCisJLnJlbGVhc2VwYWdlCT0gZXh0M19yZWxlYXNlcGFnZSwKKwkuZGlyZWN0X0lPCT0gZXh0M19kaXJlY3RfSU8sCit9OworCitzdGF0aWMgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBleHQzX2pvdXJuYWxsZWRfYW9wcyA9IHsKKwkucmVhZHBhZ2UJPSBleHQzX3JlYWRwYWdlLAorCS5yZWFkcGFnZXMJPSBleHQzX3JlYWRwYWdlcywKKwkud3JpdGVwYWdlCT0gZXh0M19qb3VybmFsbGVkX3dyaXRlcGFnZSwKKwkuc3luY19wYWdlCT0gYmxvY2tfc3luY19wYWdlLAorCS5wcmVwYXJlX3dyaXRlCT0gZXh0M19wcmVwYXJlX3dyaXRlLAorCS5jb21taXRfd3JpdGUJPSBleHQzX2pvdXJuYWxsZWRfY29tbWl0X3dyaXRlLAorCS5zZXRfcGFnZV9kaXJ0eQk9IGV4dDNfam91cm5hbGxlZF9zZXRfcGFnZV9kaXJ0eSwKKwkuYm1hcAkJPSBleHQzX2JtYXAsCisJLmludmFsaWRhdGVwYWdlCT0gZXh0M19pbnZhbGlkYXRlcGFnZSwKKwkucmVsZWFzZXBhZ2UJPSBleHQzX3JlbGVhc2VwYWdlLAorfTsKKwordm9pZCBleHQzX3NldF9hb3BzKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaWYgKGV4dDNfc2hvdWxkX29yZGVyX2RhdGEoaW5vZGUpKQorCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZleHQzX29yZGVyZWRfYW9wczsKKwllbHNlIGlmIChleHQzX3Nob3VsZF93cml0ZWJhY2tfZGF0YShpbm9kZSkpCisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmV4dDNfd3JpdGViYWNrX2FvcHM7CisJZWxzZQorCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZleHQzX2pvdXJuYWxsZWRfYW9wczsKK30KKworLyoKKyAqIGV4dDNfYmxvY2tfdHJ1bmNhdGVfcGFnZSgpIHplcm9lcyBvdXQgYSBtYXBwaW5nIGZyb20gZmlsZSBvZmZzZXQgYGZyb20nCisgKiB1cCB0byB0aGUgZW5kIG9mIHRoZSBibG9jayB3aGljaCBjb3JyZXNwb25kcyB0byBgZnJvbScuCisgKiBUaGlzIHJlcXVpcmVkIGR1cmluZyB0cnVuY2F0ZS4gV2UgbmVlZCB0byBwaHlzaWNhbGx5IHplcm8gdGhlIHRhaWwgZW5kCisgKiBvZiB0aGF0IGJsb2NrIHNvIGl0IGRvZXNuJ3QgeWllbGQgb2xkIGRhdGEgaWYgdGhlIGZpbGUgaXMgbGF0ZXIgZ3Jvd24uCisgKi8KK3N0YXRpYyBpbnQgZXh0M19ibG9ja190cnVuY2F0ZV9wYWdlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBwYWdlICpwYWdlLAorCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgbG9mZl90IGZyb20pCit7CisJdW5zaWduZWQgbG9uZyBpbmRleCA9IGZyb20gPj4gUEFHRV9DQUNIRV9TSElGVDsKKwl1bnNpZ25lZCBvZmZzZXQgPSBmcm9tICYgKFBBR0VfQ0FDSEVfU0laRS0xKTsKKwl1bnNpZ25lZCBibG9ja3NpemUsIGlibG9jaywgbGVuZ3RoLCBwb3M7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlpbnQgZXJyID0gMDsKKwl2b2lkICprYWRkcjsKKworCWJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwlsZW5ndGggPSBibG9ja3NpemUgLSAob2Zmc2V0ICYgKGJsb2Nrc2l6ZSAtIDEpKTsKKwlpYmxvY2sgPSBpbmRleCA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKworCS8qCisJICogRm9yICJub2JoIiBvcHRpb24sICB3ZSBjYW4gb25seSB3b3JrIGlmIHdlIGRvbid0IG5lZWQgdG8KKwkgKiByZWFkLWluIHRoZSBwYWdlIC0gb3RoZXJ3aXNlIHdlIGNyZWF0ZSBidWZmZXJzIHRvIGRvIHRoZSBJTy4KKwkgKi8KKwlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkgJiYgdGVzdF9vcHQoaW5vZGUtPmlfc2IsIE5PQkgpKSB7CisJCWlmIChQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQkJbWVtc2V0KGthZGRyICsgb2Zmc2V0LCAwLCBsZW5ndGgpOworCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKwkJCWdvdG8gdW5sb2NrOworCQl9CisJfQorCisJaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKQorCQljcmVhdGVfZW1wdHlfYnVmZmVycyhwYWdlLCBibG9ja3NpemUsIDApOworCisJLyogRmluZCB0aGUgYnVmZmVyIHRoYXQgY29udGFpbnMgIm9mZnNldCIgKi8KKwliaCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwlwb3MgPSBibG9ja3NpemU7CisJd2hpbGUgKG9mZnNldCA+PSBwb3MpIHsKKwkJYmggPSBiaC0+Yl90aGlzX3BhZ2U7CisJCWlibG9jaysrOworCQlwb3MgKz0gYmxvY2tzaXplOworCX0KKworCWVyciA9IDA7CisJaWYgKGJ1ZmZlcl9mcmVlZChiaCkpIHsKKwkJQlVGRkVSX1RSQUNFKGJoLCAiZnJlZWQ6IHNraXAiKTsKKwkJZ290byB1bmxvY2s7CisJfQorCisJaWYgKCFidWZmZXJfbWFwcGVkKGJoKSkgeworCQlCVUZGRVJfVFJBQ0UoYmgsICJ1bm1hcHBlZCIpOworCQlleHQzX2dldF9ibG9jayhpbm9kZSwgaWJsb2NrLCBiaCwgMCk7CisJCS8qIHVubWFwcGVkPyBJdCdzIGEgaG9sZSAtIG5vdGhpbmcgdG8gZG8gKi8KKwkJaWYgKCFidWZmZXJfbWFwcGVkKGJoKSkgeworCQkJQlVGRkVSX1RSQUNFKGJoLCAic3RpbGwgdW5tYXBwZWQiKTsKKwkJCWdvdG8gdW5sb2NrOworCQl9CisJfQorCisJLyogT2ssIGl0J3MgbWFwcGVkLiBNYWtlIHN1cmUgaXQncyB1cC10by1kYXRlICovCisJaWYgKFBhZ2VVcHRvZGF0ZShwYWdlKSkKKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisKKwlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKKwkJZXJyID0gLUVJTzsKKwkJbGxfcndfYmxvY2soUkVBRCwgMSwgJmJoKTsKKwkJd2FpdF9vbl9idWZmZXIoYmgpOworCQkvKiBVaGh1aC4gUmVhZCBlcnJvci4gQ29tcGxhaW4gYW5kIHB1bnQuICovCisJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkKKwkJCWdvdG8gdW5sb2NrOworCX0KKworCWlmIChleHQzX3Nob3VsZF9qb3VybmFsX2RhdGEoaW5vZGUpKSB7CisJCUJVRkZFUl9UUkFDRShiaCwgImdldCB3cml0ZSBhY2Nlc3MiKTsKKwkJZXJyID0gZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBiaCk7CisJCWlmIChlcnIpCisJCQlnb3RvIHVubG9jazsKKwl9CisKKwlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwltZW1zZXQoa2FkZHIgKyBvZmZzZXQsIDAsIGxlbmd0aCk7CisJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCisJQlVGRkVSX1RSQUNFKGJoLCAiemVyb2VkIGVuZCBvZiBibG9jayIpOworCisJZXJyID0gMDsKKwlpZiAoZXh0M19zaG91bGRfam91cm5hbF9kYXRhKGlub2RlKSkgeworCQllcnIgPSBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJfSBlbHNlIHsKKwkJaWYgKGV4dDNfc2hvdWxkX29yZGVyX2RhdGEoaW5vZGUpKQorCQkJZXJyID0gZXh0M19qb3VybmFsX2RpcnR5X2RhdGEoaGFuZGxlLCBiaCk7CisJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwl9CisKK3VubG9jazoKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFByb2JhYmx5IGl0IHNob3VsZCBiZSBhIGxpYnJhcnkgZnVuY3Rpb24uLi4gc2VhcmNoIGZvciBmaXJzdCBub24temVybyB3b3JkCisgKiBvciBtZW1jbXAgd2l0aCB6ZXJvX3BhZ2UsIHdoYXRldmVyIGlzIGJldHRlciBmb3IgcGFydGljdWxhciBhcmNoaXRlY3R1cmUuCisgKiBMaW51cz8KKyAqLworc3RhdGljIGlubGluZSBpbnQgYWxsX3plcm9lcyhfX2xlMzIgKnAsIF9fbGUzMiAqcSkKK3sKKwl3aGlsZSAocCA8IHEpCisJCWlmICgqcCsrKQorCQkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICoJZXh0M19maW5kX3NoYXJlZCAtIGZpbmQgdGhlIGluZGlyZWN0IGJsb2NrcyBmb3IgcGFydGlhbCB0cnVuY2F0aW9uLgorICoJQGlub2RlOgkgIGlub2RlIGluIHF1ZXN0aW9uCisgKglAZGVwdGg6CSAgZGVwdGggb2YgdGhlIGFmZmVjdGVkIGJyYW5jaAorICoJQG9mZnNldHM6IG9mZnNldHMgb2YgcG9pbnRlcnMgaW4gdGhhdCBicmFuY2ggKHNlZSBleHQzX2Jsb2NrX3RvX3BhdGgpCisgKglAY2hhaW46CSAgcGxhY2UgdG8gc3RvcmUgdGhlIHBvaW50ZXJzIHRvIHBhcnRpYWwgaW5kaXJlY3QgYmxvY2tzCisgKglAdG9wOgkgIHBsYWNlIHRvIHRoZSAoZGV0YWNoZWQpIHRvcCBvZiBicmFuY2gKKyAqCisgKglUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIHVzZWQgYnkgZXh0M190cnVuY2F0ZSgpLgorICoKKyAqCVdoZW4gd2UgZG8gdHJ1bmNhdGUoKSB3ZSBtYXkgaGF2ZSB0byBjbGVhbiB0aGUgZW5kcyBvZiBzZXZlcmFsCisgKglpbmRpcmVjdCBibG9ja3MgYnV0IGxlYXZlIHRoZSBibG9ja3MgdGhlbXNlbHZlcyBhbGl2ZS4gQmxvY2sgaXMKKyAqCXBhcnRpYWxseSB0cnVuY2F0ZWQgaWYgc29tZSBkYXRhIGJlbG93IHRoZSBuZXcgaV9zaXplIGlzIHJlZmVyZWQKKyAqCWZyb20gaXQgKGFuZCBpdCBpcyBvbiB0aGUgcGF0aCB0byB0aGUgZmlyc3QgY29tcGxldGVseSB0cnVuY2F0ZWQKKyAqCWRhdGEgYmxvY2ssIGluZGVlZCkuICBXZSBoYXZlIHRvIGZyZWUgdGhlIHRvcCBvZiB0aGF0IHBhdGggYWxvbmcKKyAqCXdpdGggZXZlcnl0aGluZyB0byB0aGUgcmlnaHQgb2YgdGhlIHBhdGguIFNpbmNlIG5vIGFsbG9jYXRpb24KKyAqCXBhc3QgdGhlIHRydW5jYXRpb24gcG9pbnQgaXMgcG9zc2libGUgdW50aWwgZXh0M190cnVuY2F0ZSgpCisgKglmaW5pc2hlcywgd2UgbWF5IHNhZmVseSBkbyB0aGUgbGF0dGVyLCBidXQgdG9wIG9mIGJyYW5jaCBtYXkKKyAqCXJlcXVpcmUgc3BlY2lhbCBhdHRlbnRpb24gLSBwYWdlb3V0IGJlbG93IHRoZSB0cnVuY2F0aW9uIHBvaW50CisgKgltaWdodCB0cnkgdG8gcG9wdWxhdGUgaXQuCisgKgorICoJV2UgYXRvbWljYWxseSBkZXRhY2ggdGhlIHRvcCBvZiBicmFuY2ggZnJvbSB0aGUgdHJlZSwgc3RvcmUgdGhlCisgKglibG9jayBudW1iZXIgb2YgaXRzIHJvb3QgaW4gKkB0b3AsIHBvaW50ZXJzIHRvIGJ1ZmZlcl9oZWFkcyBvZgorICoJcGFydGlhbGx5IHRydW5jYXRlZCBibG9ja3MgLSBpbiBAY2hhaW5bXS5iaCBhbmQgcG9pbnRlcnMgdG8KKyAqCXRoZWlyIGxhc3QgZWxlbWVudHMgdGhhdCBzaG91bGQgbm90IGJlIHJlbW92ZWQgLSBpbgorICoJQGNoYWluW10ucC4gUmV0dXJuIHZhbHVlIGlzIHRoZSBwb2ludGVyIHRvIGxhc3QgZmlsbGVkIGVsZW1lbnQKKyAqCW9mIEBjaGFpbi4KKyAqCisgKglUaGUgd29yayBsZWZ0IHRvIGNhbGxlciB0byBkbyB0aGUgYWN0dWFsIGZyZWVpbmcgb2Ygc3VidHJlZXM6CisgKgkJYSkgZnJlZSB0aGUgc3VidHJlZSBzdGFydGluZyBmcm9tICpAdG9wCisgKgkJYikgZnJlZSB0aGUgc3VidHJlZXMgd2hvc2Ugcm9vdHMgYXJlIHN0b3JlZCBpbgorICoJCQkoQGNoYWluW2ldLnArMSAuLiBlbmQgb2YgQGNoYWluW2ldLmJoLT5iX2RhdGEpCisgKgkJYykgZnJlZSB0aGUgc3VidHJlZXMgZ3Jvd2luZyBmcm9tIHRoZSBpbm9kZSBwYXN0IHRoZSBAY2hhaW5bMF0uCisgKgkJCShubyBwYXJ0aWFsbHkgdHJ1bmNhdGVkIHN0dWZmIHRoZXJlKS4gICovCisKK3N0YXRpYyBJbmRpcmVjdCAqZXh0M19maW5kX3NoYXJlZChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCWludCBkZXB0aCwKKwkJCQlpbnQgb2Zmc2V0c1s0XSwKKwkJCQlJbmRpcmVjdCBjaGFpbls0XSwKKwkJCQlfX2xlMzIgKnRvcCkKK3sKKwlJbmRpcmVjdCAqcGFydGlhbCwgKnA7CisJaW50IGssIGVycjsKKworCSp0b3AgPSAwOworCS8qIE1ha2UgayBpbmRleCB0aGUgZGVlcGVzdCBub24tbnVsbCBvZmZlc3QgKyAxICovCisJZm9yIChrID0gZGVwdGg7IGsgPiAxICYmICFvZmZzZXRzW2stMV07IGstLSkKKwkJOworCXBhcnRpYWwgPSBleHQzX2dldF9icmFuY2goaW5vZGUsIGssIG9mZnNldHMsIGNoYWluLCAmZXJyKTsKKwkvKiBXcml0ZXI6IHBvaW50ZXJzICovCisJaWYgKCFwYXJ0aWFsKQorCQlwYXJ0aWFsID0gY2hhaW4gKyBrLTE7CisJLyoKKwkgKiBJZiB0aGUgYnJhbmNoIGFjcXVpcmVkIGNvbnRpbnVhdGlvbiBzaW5jZSB3ZSd2ZSBsb29rZWQgYXQgaXQgLQorCSAqIGZpbmUsIGl0IHNob3VsZCBhbGwgc3Vydml2ZSBhbmQgKG5ldykgdG9wIGRvZXNuJ3QgYmVsb25nIHRvIHVzLgorCSAqLworCWlmICghcGFydGlhbC0+a2V5ICYmICpwYXJ0aWFsLT5wKQorCQkvKiBXcml0ZXI6IGVuZCAqLworCQlnb3RvIG5vX3RvcDsKKwlmb3IgKHA9cGFydGlhbDsgcD5jaGFpbiAmJiBhbGxfemVyb2VzKChfX2xlMzIqKXAtPmJoLT5iX2RhdGEscC0+cCk7IHAtLSkKKwkJOworCS8qCisJICogT0ssIHdlJ3ZlIGZvdW5kIHRoZSBsYXN0IGJsb2NrIHRoYXQgbXVzdCBzdXJ2aXZlLiBUaGUgcmVzdCBvZiBvdXIKKwkgKiBicmFuY2ggc2hvdWxkIGJlIGRldGFjaGVkIGJlZm9yZSB1bmxvY2tpbmcuIEhvd2V2ZXIsIGlmIHRoYXQgcmVzdAorCSAqIG9mIGJyYW5jaCBpcyBhbGwgb3VycyBhbmQgZG9lcyBub3QgZ3JvdyBpbW1lZGlhdGVseSBmcm9tIHRoZSBpbm9kZQorCSAqIGl0J3MgZWFzaWVyIHRvIGNoZWF0IGFuZCBqdXN0IGRlY3JlbWVudCBwYXJ0aWFsLT5wLgorCSAqLworCWlmIChwID09IGNoYWluICsgayAtIDEgJiYgcCA+IGNoYWluKSB7CisJCXAtPnAtLTsKKwl9IGVsc2UgeworCQkqdG9wID0gKnAtPnA7CisJCS8qIE5vcGUsIGRvbid0IGRvIHRoaXMgaW4gZXh0My4gIE11c3QgbGVhdmUgdGhlIHRyZWUgaW50YWN0ICovCisjaWYgMAorCQkqcC0+cCA9IDA7CisjZW5kaWYKKwl9CisJLyogV3JpdGVyOiBlbmQgKi8KKworCXdoaWxlKHBhcnRpYWwgPiBwKQorCXsKKwkJYnJlbHNlKHBhcnRpYWwtPmJoKTsKKwkJcGFydGlhbC0tOworCX0KK25vX3RvcDoKKwlyZXR1cm4gcGFydGlhbDsKK30KKworLyoKKyAqIFplcm8gYSBudW1iZXIgb2YgYmxvY2sgcG9pbnRlcnMgaW4gZWl0aGVyIGFuIGlub2RlIG9yIGFuIGluZGlyZWN0IGJsb2NrLgorICogSWYgd2UgcmVzdGFydCB0aGUgdHJhbnNhY3Rpb24gd2UgbXVzdCBhZ2FpbiBnZXQgd3JpdGUgYWNjZXNzIHRvIHRoZQorICogaW5kaXJlY3QgYmxvY2sgZm9yIGZ1cnRoZXIgbW9kaWZpY2F0aW9uLgorICoKKyAqIFdlIHJlbGVhc2UgYGNvdW50JyBibG9ja3Mgb24gZGlzaywgYnV0IChsYXN0IC0gZmlyc3QpIG1heSBiZSBncmVhdGVyCisgKiB0aGFuIGBjb3VudCcgYmVjYXVzZSB0aGVyZSBjYW4gYmUgaG9sZXMgaW4gdGhlcmUuCisgKi8KK3N0YXRpYyB2b2lkCitleHQzX2NsZWFyX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAorCQl1bnNpZ25lZCBsb25nIGJsb2NrX3RvX2ZyZWUsIHVuc2lnbmVkIGxvbmcgY291bnQsCisJCV9fbGUzMiAqZmlyc3QsIF9fbGUzMiAqbGFzdCkKK3sKKwlfX2xlMzIgKnA7CisJaWYgKHRyeV90b19leHRlbmRfdHJhbnNhY3Rpb24oaGFuZGxlLCBpbm9kZSkpIHsKKwkJaWYgKGJoKSB7CisJCQlCVUZGRVJfVFJBQ0UoYmgsICJjYWxsIGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOworCQkJZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgYmgpOworCQl9CisJCWV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKKwkJZXh0M19qb3VybmFsX3Rlc3RfcmVzdGFydChoYW5kbGUsIGlub2RlKTsKKwkJaWYgKGJoKSB7CisJCQlCVUZGRVJfVFJBQ0UoYmgsICJyZXRha2luZyB3cml0ZSBhY2Nlc3MiKTsKKwkJCWV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmgpOworCQl9CisJfQorCisJLyoKKwkgKiBBbnkgYnVmZmVycyB3aGljaCBhcmUgb24gdGhlIGpvdXJuYWwgd2lsbCBiZSBpbiBtZW1vcnkuIFdlIGZpbmQKKwkgKiB0aGVtIG9uIHRoZSBoYXNoIHRhYmxlIHNvIGpvdXJuYWxfcmV2b2tlKCkgd2lsbCBydW4gam91cm5hbF9mb3JnZXQoKQorCSAqIG9uIHRoZW0uICBXZSd2ZSBhbHJlYWR5IGRldGFjaGVkIGVhY2ggYmxvY2sgZnJvbSB0aGUgZmlsZSwgc28KKwkgKiBiZm9yZ2V0KCkgaW4gam91cm5hbF9mb3JnZXQoKSBzaG91bGQgYmUgc2FmZS4KKwkgKgorCSAqIEFLUE06IHR1cm4gb24gYmZvcmdldCBpbiBqb3VybmFsX2ZvcmdldCgpISEhCisJICovCisJZm9yIChwID0gZmlyc3Q7IHAgPCBsYXN0OyBwKyspIHsKKwkJdTMyIG5yID0gbGUzMl90b19jcHUoKnApOworCQlpZiAobnIpIHsKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwkJCSpwID0gMDsKKwkJCWJoID0gc2JfZmluZF9nZXRfYmxvY2soaW5vZGUtPmlfc2IsIG5yKTsKKwkJCWV4dDNfZm9yZ2V0KGhhbmRsZSwgMCwgaW5vZGUsIGJoLCBucik7CisJCX0KKwl9CisKKwlleHQzX2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGJsb2NrX3RvX2ZyZWUsIGNvdW50KTsKK30KKworLyoqCisgKiBleHQzX2ZyZWVfZGF0YSAtIGZyZWUgYSBsaXN0IG9mIGRhdGEgYmxvY2tzCisgKiBAaGFuZGxlOgloYW5kbGUgZm9yIHRoaXMgdHJhbnNhY3Rpb24KKyAqIEBpbm9kZToJaW5vZGUgd2UgYXJlIGRlYWxpbmcgd2l0aAorICogQHRoaXNfYmg6CWluZGlyZWN0IGJ1ZmZlcl9oZWFkIHdoaWNoIGNvbnRhaW5zICpAZmlyc3QgYW5kICpAbGFzdAorICogQGZpcnN0OglhcnJheSBvZiBibG9jayBudW1iZXJzCisgKiBAbGFzdDoJcG9pbnRzIGltbWVkaWF0ZWx5IHBhc3QgdGhlIGVuZCBvZiBhcnJheQorICoKKyAqIFdlIGFyZSBmcmVlaW5nIGFsbCBibG9ja3MgcmVmZXJlZCBmcm9tIHRoYXQgYXJyYXkgKG51bWJlcnMgYXJlIHN0b3JlZCBhcworICogbGl0dGxlLWVuZGlhbiAzMi1iaXQpIGFuZCB1cGRhdGluZyBAaW5vZGUtPmlfYmxvY2tzIGFwcHJvcHJpYXRlbHkuCisgKgorICogV2UgYWNjdW11bGF0ZSBjb250aWd1b3VzIHJ1bnMgb2YgYmxvY2tzIHRvIGZyZWUuICBDb252ZW5pZW50bHksIGlmIHRoZXNlCisgKiBibG9ja3MgYXJlIGNvbnRpZ3VvdXMgdGhlbiByZWxlYXNpbmcgdGhlbSBhdCBvbmUgdGltZSB3aWxsIG9ubHkgYWZmZWN0IG9uZQorICogb3IgdHdvIGJpdG1hcCBibG9ja3MgKCsgZ3JvdXAgZGVzY3JpcHRvcihzKSBhbmQgc3VwZXJibG9jaykgYW5kIHdlIHdvbid0CisgKiBhY3R1YWxseSB1c2UgYSBsb3Qgb2Ygam91cm5hbCBzcGFjZS4KKyAqCisgKiBAdGhpc19iaCB3aWxsIGJlICVOVUxMIGlmIEBmaXJzdCBhbmQgQGxhc3QgcG9pbnQgaW50byB0aGUgaW5vZGUncyBkaXJlY3QKKyAqIGJsb2NrIHBvaW50ZXJzLgorICovCitzdGF0aWMgdm9pZCBleHQzX2ZyZWVfZGF0YShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICp0aGlzX2JoLAorCQkJICAgX19sZTMyICpmaXJzdCwgX19sZTMyICpsYXN0KQoreworCXVuc2lnbmVkIGxvbmcgYmxvY2tfdG9fZnJlZSA9IDA7ICAgIC8qIFN0YXJ0aW5nIGJsb2NrICMgb2YgYSBydW4gKi8KKwl1bnNpZ25lZCBsb25nIGNvdW50ID0gMDsJICAgIC8qIE51bWJlciBvZiBibG9ja3MgaW4gdGhlIHJ1biAqLyAKKwlfX2xlMzIgKmJsb2NrX3RvX2ZyZWVfcCA9IE5VTEw7CSAgICAvKiBQb2ludGVyIGludG8gaW5vZGUvaW5kCisJCQkJCSAgICAgICBjb3JyZXNwb25kaW5nIHRvCisJCQkJCSAgICAgICBibG9ja190b19mcmVlICovCisJdW5zaWduZWQgbG9uZyBucjsJCSAgICAvKiBDdXJyZW50IGJsb2NrICMgKi8KKwlfX2xlMzIgKnA7CQkJICAgIC8qIFBvaW50ZXIgaW50byBpbm9kZS9pbmQKKwkJCQkJICAgICAgIGZvciBjdXJyZW50IGJsb2NrICovCisJaW50IGVycjsKKworCWlmICh0aGlzX2JoKSB7CQkJCS8qIEZvciBpbmRpcmVjdCBibG9jayAqLworCQlCVUZGRVJfVFJBQ0UodGhpc19iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwkJZXJyID0gZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCB0aGlzX2JoKTsKKwkJLyogSW1wb3J0YW50OiBpZiB3ZSBjYW4ndCB1cGRhdGUgdGhlIGluZGlyZWN0IHBvaW50ZXJzCisJCSAqIHRvIHRoZSBibG9ja3MsIHdlIGNhbid0IGZyZWUgdGhlbS4gKi8KKwkJaWYgKGVycikKKwkJCXJldHVybjsKKwl9CisKKwlmb3IgKHAgPSBmaXJzdDsgcCA8IGxhc3Q7IHArKykgeworCQluciA9IGxlMzJfdG9fY3B1KCpwKTsKKwkJaWYgKG5yKSB7CisJCQkvKiBhY2N1bXVsYXRlIGJsb2NrcyB0byBmcmVlIGlmIHRoZXkncmUgY29udGlndW91cyAqLworCQkJaWYgKGNvdW50ID09IDApIHsKKwkJCQlibG9ja190b19mcmVlID0gbnI7CisJCQkJYmxvY2tfdG9fZnJlZV9wID0gcDsKKwkJCQljb3VudCA9IDE7CisJCQl9IGVsc2UgaWYgKG5yID09IGJsb2NrX3RvX2ZyZWUgKyBjb3VudCkgeworCQkJCWNvdW50Kys7CisJCQl9IGVsc2UgeworCQkJCWV4dDNfY2xlYXJfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIHRoaXNfYmgsIAorCQkJCQkJICBibG9ja190b19mcmVlLAorCQkJCQkJICBjb3VudCwgYmxvY2tfdG9fZnJlZV9wLCBwKTsKKwkJCQlibG9ja190b19mcmVlID0gbnI7CisJCQkJYmxvY2tfdG9fZnJlZV9wID0gcDsKKwkJCQljb3VudCA9IDE7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoY291bnQgPiAwKQorCQlleHQzX2NsZWFyX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCB0aGlzX2JoLCBibG9ja190b19mcmVlLAorCQkJCSAgY291bnQsIGJsb2NrX3RvX2ZyZWVfcCwgcCk7CisKKwlpZiAodGhpc19iaCkgeworCQlCVUZGRVJfVFJBQ0UodGhpc19iaCwgImNhbGwgZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7CisJCWV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIHRoaXNfYmgpOworCX0KK30KKworLyoqCisgKglleHQzX2ZyZWVfYnJhbmNoZXMgLSBmcmVlIGFuIGFycmF5IG9mIGJyYW5jaGVzCisgKglAaGFuZGxlOiBKQkQgaGFuZGxlIGZvciB0aGlzIHRyYW5zYWN0aW9uCisgKglAaW5vZGU6CWlub2RlIHdlIGFyZSBkZWFsaW5nIHdpdGgKKyAqCUBwYXJlbnRfYmg6IHRoZSBidWZmZXJfaGVhZCB3aGljaCBjb250YWlucyAqQGZpcnN0IGFuZCAqQGxhc3QKKyAqCUBmaXJzdDoJYXJyYXkgb2YgYmxvY2sgbnVtYmVycworICoJQGxhc3Q6CXBvaW50ZXIgaW1tZWRpYXRlbHkgcGFzdCB0aGUgZW5kIG9mIGFycmF5CisgKglAZGVwdGg6CWRlcHRoIG9mIHRoZSBicmFuY2hlcyB0byBmcmVlCisgKgorICoJV2UgYXJlIGZyZWVpbmcgYWxsIGJsb2NrcyByZWZlcmVkIGZyb20gdGhlc2UgYnJhbmNoZXMgKG51bWJlcnMgYXJlCisgKglzdG9yZWQgYXMgbGl0dGxlLWVuZGlhbiAzMi1iaXQpIGFuZCB1cGRhdGluZyBAaW5vZGUtPmlfYmxvY2tzCisgKglhcHByb3ByaWF0ZWx5LgorICovCitzdGF0aWMgdm9pZCBleHQzX2ZyZWVfYnJhbmNoZXMoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnBhcmVudF9iaCwKKwkJCSAgICAgICBfX2xlMzIgKmZpcnN0LCBfX2xlMzIgKmxhc3QsIGludCBkZXB0aCkKK3sKKwl1bnNpZ25lZCBsb25nIG5yOworCV9fbGUzMiAqcDsKKworCWlmIChpc19oYW5kbGVfYWJvcnRlZChoYW5kbGUpKQorCQlyZXR1cm47CisKKwlpZiAoZGVwdGgtLSkgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCQlpbnQgYWRkcl9wZXJfYmxvY2sgPSBFWFQzX0FERFJfUEVSX0JMT0NLKGlub2RlLT5pX3NiKTsKKwkJcCA9IGxhc3Q7CisJCXdoaWxlICgtLXAgPj0gZmlyc3QpIHsKKwkJCW5yID0gbGUzMl90b19jcHUoKnApOworCQkJaWYgKCFucikKKwkJCQljb250aW51ZTsJCS8qIEEgaG9sZSAqLworCisJCQkvKiBHbyByZWFkIHRoZSBidWZmZXIgZm9yIHRoZSBuZXh0IGxldmVsIGRvd24gKi8KKwkJCWJoID0gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIG5yKTsKKworCQkJLyoKKwkJCSAqIEEgcmVhZCBmYWlsdXJlPyBSZXBvcnQgZXJyb3IgYW5kIGNsZWFyIHNsb3QKKwkJCSAqIChzaG91bGQgYmUgcmFyZSkuCisJCQkgKi8KKwkJCWlmICghYmgpIHsKKwkJCQlleHQzX2Vycm9yKGlub2RlLT5pX3NiLCAiZXh0M19mcmVlX2JyYW5jaGVzIiwKKwkJCQkJICAgIlJlYWQgZmFpbHVyZSwgaW5vZGU9JWxkLCBibG9jaz0lbGQiLAorCQkJCQkgICBpbm9kZS0+aV9pbm8sIG5yKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogVGhpcyB6YXBzIHRoZSBlbnRpcmUgYmxvY2suICBCb3R0b20gdXAuICovCisJCQlCVUZGRVJfVFJBQ0UoYmgsICJmcmVlIGNoaWxkIGJyYW5jaGVzIik7CisJCQlleHQzX2ZyZWVfYnJhbmNoZXMoaGFuZGxlLCBpbm9kZSwgYmgsCisJCQkJCSAgIChfX2xlMzIqKWJoLT5iX2RhdGEsCisJCQkJCSAgIChfX2xlMzIqKWJoLT5iX2RhdGEgKyBhZGRyX3Blcl9ibG9jaywKKwkJCQkJICAgZGVwdGgpOworCisJCQkvKgorCQkJICogV2UndmUgcHJvYmFibHkgam91cm5hbGxlZCB0aGUgaW5kaXJlY3QgYmxvY2sgc2V2ZXJhbAorCQkJICogdGltZXMgZHVyaW5nIHRoZSB0cnVuY2F0ZS4gIEJ1dCBpdCdzIG5vIGxvbmdlcgorCQkJICogbmVlZGVkIGFuZCB3ZSBub3cgZHJvcCBpdCBmcm9tIHRoZSB0cmFuc2FjdGlvbiB2aWEKKwkJCSAqIGpvdXJuYWxfcmV2b2tlKCkuCisJCQkgKgorCQkJICogVGhhdCdzIGVhc3kgaWYgaXQncyBleGNsdXNpdmVseSBwYXJ0IG9mIHRoaXMKKwkJCSAqIHRyYW5zYWN0aW9uLiAgQnV0IGlmIGl0J3MgcGFydCBvZiB0aGUgY29tbWl0dGluZworCQkJICogdHJhbnNhY3Rpb24gdGhlbiBqb3VybmFsX2ZvcmdldCgpIHdpbGwgc2ltcGx5CisJCQkgKiBicmVsc2UoKSBpdC4gIFRoYXQgbWVhbnMgdGhhdCBpZiB0aGUgdW5kZXJseWluZworCQkJICogYmxvY2sgaXMgcmVhbGxvY2F0ZWQgaW4gZXh0M19nZXRfYmxvY2soKSwKKwkJCSAqIHVubWFwX3VuZGVybHlpbmdfbWV0YWRhdGEoKSB3aWxsIGZpbmQgdGhpcyBibG9jaworCQkJICogYW5kIHdpbGwgdHJ5IHRvIGdldCByaWQgb2YgaXQuICBkYW1uLCBkYW1uLgorCQkJICoKKwkJCSAqIElmIHRoaXMgYmxvY2sgaGFzIGFscmVhZHkgYmVlbiBjb21taXR0ZWQgdG8gdGhlCisJCQkgKiBqb3VybmFsLCBhIHJldm9rZSByZWNvcmQgd2lsbCBiZSB3cml0dGVuLiAgQW5kCisJCQkgKiByZXZva2UgcmVjb3JkcyBtdXN0IGJlIGVtaXR0ZWQgKmJlZm9yZSogY2xlYXJpbmcKKwkJCSAqIHRoaXMgYmxvY2sncyBiaXQgaW4gdGhlIGJpdG1hcHMuCisJCQkgKi8KKwkJCWV4dDNfZm9yZ2V0KGhhbmRsZSwgMSwgaW5vZGUsIGJoLCBiaC0+Yl9ibG9ja25yKTsKKworCQkJLyoKKwkJCSAqIEV2ZXJ5dGhpbmcgYmVsb3cgdGhpcyB0aGlzIHBvaW50ZXIgaGFzIGJlZW4KKwkJCSAqIHJlbGVhc2VkLiAgTm93IGxldCB0aGlzIHRvcC1vZi1zdWJ0cmVlIGdvLgorCQkJICoKKwkJCSAqIFdlIHdhbnQgdGhlIGZyZWVpbmcgb2YgdGhpcyBpbmRpcmVjdCBibG9jayB0byBiZQorCQkJICogYXRvbWljIGluIHRoZSBqb3VybmFsIHdpdGggdGhlIHVwZGF0aW5nIG9mIHRoZQorCQkJICogYml0bWFwIGJsb2NrIHdoaWNoIG93bnMgaXQuICBTbyBtYWtlIHNvbWUgcm9vbSBpbgorCQkJICogdGhlIGpvdXJuYWwuCisJCQkgKgorCQkJICogV2UgemVybyB0aGUgcGFyZW50IHBvaW50ZXIgKmFmdGVyKiBmcmVlaW5nIGl0cworCQkJICogcG9pbnRlZSBpbiB0aGUgYml0bWFwcywgc28gaWYgZXh0ZW5kX3RyYW5zYWN0aW9uKCkKKwkJCSAqIGZvciBzb21lIHJlYXNvbiBmYWlscyB0byBwdXQgdGhlIGJpdG1hcCBjaGFuZ2VzIGFuZAorCQkJICogdGhlIHJlbGVhc2UgaW50byB0aGUgc2FtZSB0cmFuc2FjdGlvbiwgcmVjb3ZlcnkKKwkJCSAqIHdpbGwgbWVyZWx5IGNvbXBsYWluIGFib3V0IHJlbGVhc2luZyBhIGZyZWUgYmxvY2ssCisJCQkgKiByYXRoZXIgdGhhbiBsZWFraW5nIGJsb2Nrcy4KKwkJCSAqLworCQkJaWYgKGlzX2hhbmRsZV9hYm9ydGVkKGhhbmRsZSkpCisJCQkJcmV0dXJuOworCQkJaWYgKHRyeV90b19leHRlbmRfdHJhbnNhY3Rpb24oaGFuZGxlLCBpbm9kZSkpIHsKKwkJCQlleHQzX21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CisJCQkJZXh0M19qb3VybmFsX3Rlc3RfcmVzdGFydChoYW5kbGUsIGlub2RlKTsKKwkJCX0KKworCQkJZXh0M19mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBuciwgMSk7CisKKwkJCWlmIChwYXJlbnRfYmgpIHsKKwkJCQkvKgorCQkJCSAqIFRoZSBibG9jayB3aGljaCB3ZSBoYXZlIGp1c3QgZnJlZWQgaXMKKwkJCQkgKiBwb2ludGVkIHRvIGJ5IGFuIGluZGlyZWN0IGJsb2NrOiBqb3VybmFsIGl0CisJCQkJICovCisJCQkJQlVGRkVSX1RSQUNFKHBhcmVudF9iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwkJCQlpZiAoIWV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwKKwkJCQkJCQkJICAgcGFyZW50X2JoKSl7CisJCQkJCSpwID0gMDsKKwkJCQkJQlVGRkVSX1RSQUNFKHBhcmVudF9iaCwKKwkJCQkJImNhbGwgZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7CisJCQkJCWV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIAorCQkJCQkJCQkgICAgcGFyZW50X2JoKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKiBXZSBoYXZlIHJlYWNoZWQgdGhlIGJvdHRvbSBvZiB0aGUgdHJlZS4gKi8KKwkJQlVGRkVSX1RSQUNFKHBhcmVudF9iaCwgImZyZWUgZGF0YSBibG9ja3MiKTsKKwkJZXh0M19mcmVlX2RhdGEoaGFuZGxlLCBpbm9kZSwgcGFyZW50X2JoLCBmaXJzdCwgbGFzdCk7CisJfQorfQorCisvKgorICogZXh0M190cnVuY2F0ZSgpCisgKgorICogV2UgYmxvY2sgb3V0IGV4dDNfZ2V0X2Jsb2NrKCkgYmxvY2sgaW5zdGFudGlhdGlvbnMgYWNyb3NzIHRoZSBlbnRpcmUKKyAqIHRyYW5zYWN0aW9uLCBhbmQgVkZTL1ZNIGVuc3VyZXMgdGhhdCBleHQzX3RydW5jYXRlKCkgY2Fubm90IHJ1bgorICogc2ltdWx0YW5lb3VzbHkgb24gYmVoYWxmIG9mIHRoZSBzYW1lIGlub2RlLgorICoKKyAqIEFzIHdlIHdvcmsgdGhyb3VnaCB0aGUgdHJ1bmNhdGUgYW5kIGNvbW1taXQgYml0cyBvZiBpdCB0byB0aGUgam91cm5hbCB0aGVyZQorICogaXMgb25lIGNvcmUsIGd1aWRpbmcgcHJpbmNpcGxlOiB0aGUgZmlsZSdzIHRyZWUgbXVzdCBhbHdheXMgYmUgY29uc2lzdGVudCBvbgorICogZGlzay4gIFdlIG11c3QgYmUgYWJsZSB0byByZXN0YXJ0IHRoZSB0cnVuY2F0ZSBhZnRlciBhIGNyYXNoLgorICoKKyAqIFRoZSBmaWxlJ3MgdHJlZSBtYXkgYmUgdHJhbnNpZW50bHkgaW5jb25zaXN0ZW50IGluIG1lbW9yeSAoYWx0aG91Z2ggaXQKKyAqIHByb2JhYmx5IGlzbid0KSwgYnV0IHdoZW5ldmVyIHdlIGNsb3NlIG9mZiBhbmQgY29tbWl0IGEgam91cm5hbCB0cmFuc2FjdGlvbiwKKyAqIHRoZSBjb250ZW50cyBvZiAodGhlIGZpbGVzeXN0ZW0gKyB0aGUgam91cm5hbCkgbXVzdCBiZSBjb25zaXN0ZW50IGFuZAorICogcmVzdGFydGFibGUuICBJdCdzIHByZXR0eSBzaW1wbGUsIHJlYWxseTogYm90dG9tIHVwLCByaWdodCB0byBsZWZ0IChhbHRob3VnaAorICogbGVmdC10by1yaWdodCB3b3JrcyBPSyB0b28pLgorICoKKyAqIE5vdGUgdGhhdCBhdCByZWNvdmVyeSB0aW1lLCBqb3VybmFsIHJlcGxheSBvY2N1cnMgKmJlZm9yZSogdGhlIHJlc3RhcnQgb2YKKyAqIHRydW5jYXRlIGFnYWluc3QgdGhlIG9ycGhhbiBpbm9kZSBsaXN0LgorICoKKyAqIFRoZSBjb21taXR0ZWQgaW5vZGUgaGFzIHRoZSBuZXcsIGRlc2lyZWQgaV9zaXplICh3aGljaCBpcyB0aGUgc2FtZSBhcworICogaV9kaXNrc2l6ZSBpbiB0aGlzIGNhc2UpLiAgQWZ0ZXIgYSBjcmFzaCwgZXh0M19vcnBoYW5fY2xlYW51cCgpIHdpbGwgc2VlCisgKiB0aGF0IHRoaXMgaW5vZGUncyB0cnVuY2F0ZSBkaWQgbm90IGNvbXBsZXRlIGFuZCBpdCB3aWxsIGFnYWluIGNhbGwKKyAqIGV4dDNfdHJ1bmNhdGUoKSB0byBoYXZlIGFub3RoZXIgZ28uICBTbyB0aGVyZSB3aWxsIGJlIGluc3RhbnRpYXRlZCBibG9ja3MKKyAqIHRvIHRoZSByaWdodCBvZiB0aGUgdHJ1bmNhdGlvbiBwb2ludCBpbiBhIGNyYXNoZWQgZXh0MyBmaWxlc3lzdGVtLiAgQnV0CisgKiB0aGF0J3MgZmluZSAtIGFzIGxvbmcgYXMgdGhleSBhcmUgbGlua2VkIGZyb20gdGhlIGlub2RlLCB0aGUgcG9zdC1jcmFzaAorICogZXh0M190cnVuY2F0ZSgpIHJ1biB3aWxsIGZpbmQgdGhlbSBhbmQgcmVsZWFzZSB0aGVtLgorICovCisKK3ZvaWQgZXh0M190cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwloYW5kbGVfdCAqaGFuZGxlOworCXN0cnVjdCBleHQzX2lub2RlX2luZm8gKmVpID0gRVhUM19JKGlub2RlKTsKKwlfX2xlMzIgKmlfZGF0YSA9IGVpLT5pX2RhdGE7CisJaW50IGFkZHJfcGVyX2Jsb2NrID0gRVhUM19BRERSX1BFUl9CTE9DSyhpbm9kZS0+aV9zYik7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCWludCBvZmZzZXRzWzRdOworCUluZGlyZWN0IGNoYWluWzRdOworCUluZGlyZWN0ICpwYXJ0aWFsOworCV9fbGUzMiBuciA9IDA7CisJaW50IG47CisJbG9uZyBsYXN0X2Jsb2NrOworCXVuc2lnbmVkIGJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCWlmICghKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0RJUihpbm9kZS0+aV9tb2RlKSB8fAorCSAgICBTX0lTTE5LKGlub2RlLT5pX21vZGUpKSkKKwkJcmV0dXJuOworCWlmIChleHQzX2lub2RlX2lzX2Zhc3Rfc3ltbGluayhpbm9kZSkpCisJCXJldHVybjsKKwlpZiAoSVNfQVBQRU5EKGlub2RlKSB8fCBJU19JTU1VVEFCTEUoaW5vZGUpKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFdlIGhhdmUgdG8gbG9jayB0aGUgRU9GIHBhZ2UgaGVyZSwgYmVjYXVzZSBsb2NrX3BhZ2UoKSBuZXN0cworCSAqIG91dHNpZGUgam91cm5hbF9zdGFydCgpLgorCSAqLworCWlmICgoaW5vZGUtPmlfc2l6ZSAmIChibG9ja3NpemUgLSAxKSkgPT0gMCkgeworCQkvKiBCbG9jayBib3VuZGFyeT8gTm90aGluZyB0byBkbyAqLworCQlwYWdlID0gTlVMTDsKKwl9IGVsc2UgeworCQlwYWdlID0gZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsCisJCQkJaW5vZGUtPmlfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwkJaWYgKCFwYWdlKQorCQkJcmV0dXJuOworCX0KKworCWhhbmRsZSA9IHN0YXJ0X3RyYW5zYWN0aW9uKGlub2RlKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJaWYgKHBhZ2UpIHsKKwkJCWNsZWFyX2hpZ2hwYWdlKHBhZ2UpOworCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJfQorCQlyZXR1cm47CQkvKiBBS1BNOiByZXR1cm4gd2hhdD8gKi8KKwl9CisKKwlsYXN0X2Jsb2NrID0gKGlub2RlLT5pX3NpemUgKyBibG9ja3NpemUtMSkKKwkJCQkJPj4gRVhUM19CTE9DS19TSVpFX0JJVFMoaW5vZGUtPmlfc2IpOworCisJaWYgKHBhZ2UpCisJCWV4dDNfYmxvY2tfdHJ1bmNhdGVfcGFnZShoYW5kbGUsIHBhZ2UsIG1hcHBpbmcsIGlub2RlLT5pX3NpemUpOworCisJbiA9IGV4dDNfYmxvY2tfdG9fcGF0aChpbm9kZSwgbGFzdF9ibG9jaywgb2Zmc2V0cywgTlVMTCk7CisJaWYgKG4gPT0gMCkKKwkJZ290byBvdXRfc3RvcDsJLyogZXJyb3IgKi8KKworCS8qCisJICogT0suICBUaGlzIHRydW5jYXRlIGlzIGdvaW5nIHRvIGhhcHBlbi4gIFdlIGFkZCB0aGUgaW5vZGUgdG8gdGhlCisJICogb3JwaGFuIGxpc3QsIHNvIHRoYXQgaWYgdGhpcyB0cnVuY2F0ZSBzcGFucyBtdWx0aXBsZSB0cmFuc2FjdGlvbnMsCisJICogYW5kIHdlIGNyYXNoLCB3ZSB3aWxsIHJlc3VtZSB0aGUgdHJ1bmNhdGUgd2hlbiB0aGUgZmlsZXN5c3RlbQorCSAqIHJlY292ZXJzLiAgSXQgYWxzbyBtYXJrcyB0aGUgaW5vZGUgZGlydHksIHRvIGNhdGNoIHRoZSBuZXcgc2l6ZS4KKwkgKgorCSAqIEltcGxpY2F0aW9uOiB0aGUgZmlsZSBtdXN0IGFsd2F5cyBiZSBpbiBhIHNhbmUsIGNvbnNpc3RlbnQKKwkgKiB0cnVuY2F0YWJsZSBzdGF0ZSB3aGlsZSBlYWNoIHRyYW5zYWN0aW9uIGNvbW1pdHMuCisJICovCisJaWYgKGV4dDNfb3JwaGFuX2FkZChoYW5kbGUsIGlub2RlKSkKKwkJZ290byBvdXRfc3RvcDsKKworCS8qCisJICogVGhlIG9ycGhhbiBsaXN0IGVudHJ5IHdpbGwgbm93IHByb3RlY3QgdXMgZnJvbSBhbnkgY3Jhc2ggd2hpY2gKKwkgKiBvY2N1cnMgYmVmb3JlIHRoZSB0cnVuY2F0ZSBjb21wbGV0ZXMsIHNvIGl0IGlzIG5vdyBzYWZlIHRvIHByb3BhZ2F0ZQorCSAqIHRoZSBuZXcsIHNob3J0ZXIgaW5vZGUgc2l6ZSAoaGVsZCBmb3Igbm93IGluIGlfc2l6ZSkgaW50byB0aGUKKwkgKiBvbi1kaXNrIGlub2RlLiBXZSBkbyB0aGlzIHZpYSBpX2Rpc2tzaXplLCB3aGljaCBpcyB0aGUgdmFsdWUgd2hpY2gKKwkgKiBleHQzICpyZWFsbHkqIHdyaXRlcyBvbnRvIHRoZSBkaXNrIGlub2RlLgorCSAqLworCWVpLT5pX2Rpc2tzaXplID0gaW5vZGUtPmlfc2l6ZTsKKworCS8qCisJICogRnJvbSBoZXJlIHdlIGJsb2NrIG91dCBhbGwgZXh0M19nZXRfYmxvY2soKSBjYWxsZXJzIHdobyB3YW50IHRvCisJICogbW9kaWZ5IHRoZSBibG9jayBhbGxvY2F0aW9uIHRyZWUuCisJICovCisJZG93bigmZWktPnRydW5jYXRlX3NlbSk7CisKKwlpZiAobiA9PSAxKSB7CQkvKiBkaXJlY3QgYmxvY2tzICovCisJCWV4dDNfZnJlZV9kYXRhKGhhbmRsZSwgaW5vZGUsIE5VTEwsIGlfZGF0YStvZmZzZXRzWzBdLAorCQkJICAgICAgIGlfZGF0YSArIEVYVDNfTkRJUl9CTE9DS1MpOworCQlnb3RvIGRvX2luZGlyZWN0czsKKwl9CisKKwlwYXJ0aWFsID0gZXh0M19maW5kX3NoYXJlZChpbm9kZSwgbiwgb2Zmc2V0cywgY2hhaW4sICZucik7CisJLyogS2lsbCB0aGUgdG9wIG9mIHNoYXJlZCBicmFuY2ggKG5vdCBkZXRhY2hlZCkgKi8KKwlpZiAobnIpIHsKKwkJaWYgKHBhcnRpYWwgPT0gY2hhaW4pIHsKKwkJCS8qIFNoYXJlZCBicmFuY2ggZ3Jvd3MgZnJvbSB0aGUgaW5vZGUgKi8KKwkJCWV4dDNfZnJlZV9icmFuY2hlcyhoYW5kbGUsIGlub2RlLCBOVUxMLAorCQkJCQkgICAmbnIsICZucisxLCAoY2hhaW4rbi0xKSAtIHBhcnRpYWwpOworCQkJKnBhcnRpYWwtPnAgPSAwOworCQkJLyoKKwkJCSAqIFdlIG1hcmsgdGhlIGlub2RlIGRpcnR5IHByaW9yIHRvIHJlc3RhcnQsCisJCQkgKiBhbmQgcHJpb3IgdG8gc3RvcC4gIE5vIG5lZWQgZm9yIGl0IGhlcmUuCisJCQkgKi8KKwkJfSBlbHNlIHsKKwkJCS8qIFNoYXJlZCBicmFuY2ggZ3Jvd3MgZnJvbSBhbiBpbmRpcmVjdCBibG9jayAqLworCQkJQlVGRkVSX1RSQUNFKHBhcnRpYWwtPmJoLCAiZ2V0X3dyaXRlX2FjY2VzcyIpOworCQkJZXh0M19mcmVlX2JyYW5jaGVzKGhhbmRsZSwgaW5vZGUsIHBhcnRpYWwtPmJoLAorCQkJCQlwYXJ0aWFsLT5wLAorCQkJCQlwYXJ0aWFsLT5wKzEsIChjaGFpbituLTEpIC0gcGFydGlhbCk7CisJCX0KKwl9CisJLyogQ2xlYXIgdGhlIGVuZHMgb2YgaW5kaXJlY3QgYmxvY2tzIG9uIHRoZSBzaGFyZWQgYnJhbmNoICovCisJd2hpbGUgKHBhcnRpYWwgPiBjaGFpbikgeworCQlleHQzX2ZyZWVfYnJhbmNoZXMoaGFuZGxlLCBpbm9kZSwgcGFydGlhbC0+YmgsIHBhcnRpYWwtPnAgKyAxLAorCQkJCSAgIChfX2xlMzIqKXBhcnRpYWwtPmJoLT5iX2RhdGErYWRkcl9wZXJfYmxvY2ssCisJCQkJICAgKGNoYWluK24tMSkgLSBwYXJ0aWFsKTsKKwkJQlVGRkVSX1RSQUNFKHBhcnRpYWwtPmJoLCAiY2FsbCBicmVsc2UiKTsKKwkJYnJlbHNlIChwYXJ0aWFsLT5iaCk7CisJCXBhcnRpYWwtLTsKKwl9Citkb19pbmRpcmVjdHM6CisJLyogS2lsbCB0aGUgcmVtYWluaW5nICh3aG9sZSkgc3VidHJlZXMgKi8KKwlzd2l0Y2ggKG9mZnNldHNbMF0pIHsKKwkJZGVmYXVsdDoKKwkJCW5yID0gaV9kYXRhW0VYVDNfSU5EX0JMT0NLXTsKKwkJCWlmIChucikgeworCQkJCWV4dDNfZnJlZV9icmFuY2hlcyhoYW5kbGUsIGlub2RlLCBOVUxMLAorCQkJCQkJICAgJm5yLCAmbnIrMSwgMSk7CisJCQkJaV9kYXRhW0VYVDNfSU5EX0JMT0NLXSA9IDA7CisJCQl9CisJCWNhc2UgRVhUM19JTkRfQkxPQ0s6CisJCQluciA9IGlfZGF0YVtFWFQzX0RJTkRfQkxPQ0tdOworCQkJaWYgKG5yKSB7CisJCQkJZXh0M19mcmVlX2JyYW5jaGVzKGhhbmRsZSwgaW5vZGUsIE5VTEwsCisJCQkJCQkgICAmbnIsICZucisxLCAyKTsKKwkJCQlpX2RhdGFbRVhUM19ESU5EX0JMT0NLXSA9IDA7CisJCQl9CisJCWNhc2UgRVhUM19ESU5EX0JMT0NLOgorCQkJbnIgPSBpX2RhdGFbRVhUM19USU5EX0JMT0NLXTsKKwkJCWlmIChucikgeworCQkJCWV4dDNfZnJlZV9icmFuY2hlcyhoYW5kbGUsIGlub2RlLCBOVUxMLAorCQkJCQkJICAgJm5yLCAmbnIrMSwgMyk7CisJCQkJaV9kYXRhW0VYVDNfVElORF9CTE9DS10gPSAwOworCQkJfQorCQljYXNlIEVYVDNfVElORF9CTE9DSzoKKwkJCTsKKwl9CisKKwlleHQzX2Rpc2NhcmRfcmVzZXJ2YXRpb24oaW5vZGUpOworCisJdXAoJmVpLT50cnVuY2F0ZV9zZW0pOworCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCWV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKKworCS8qIEluIGEgbXVsdGktdHJhbnNhY3Rpb24gdHJ1bmNhdGUsIHdlIG9ubHkgbWFrZSB0aGUgZmluYWwKKwkgKiB0cmFuc2FjdGlvbiBzeW5jaHJvbm91cyAqLworCWlmIChJU19TWU5DKGlub2RlKSkKKwkJaGFuZGxlLT5oX3N5bmMgPSAxOworb3V0X3N0b3A6CisJLyoKKwkgKiBJZiB0aGlzIHdhcyBhIHNpbXBsZSBmdHJ1bmNhdGUoKSwgYW5kIHRoZSBmaWxlIHdpbGwgcmVtYWluIGFsaXZlCisJICogdGhlbiB3ZSBuZWVkIHRvIGNsZWFyIHVwIHRoZSBvcnBoYW4gcmVjb3JkIHdoaWNoIHdlIGNyZWF0ZWQgYWJvdmUuCisJICogSG93ZXZlciwgaWYgdGhpcyB3YXMgYSByZWFsIHVubGluayB0aGVuIHdlIHdlcmUgY2FsbGVkIGJ5CisJICogZXh0M19kZWxldGVfaW5vZGUoKSwgYW5kIHdlIGFsbG93IHRoYXQgZnVuY3Rpb24gdG8gY2xlYW4gdXAgdGhlCisJICogb3JwaGFuIGluZm8gZm9yIHVzLgorCSAqLworCWlmIChpbm9kZS0+aV9ubGluaykKKwkJZXh0M19vcnBoYW5fZGVsKGhhbmRsZSwgaW5vZGUpOworCisJZXh0M19qb3VybmFsX3N0b3AoaGFuZGxlKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZXh0M19nZXRfaW5vZGVfYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJdW5zaWduZWQgbG9uZyBpbm8sIHN0cnVjdCBleHQzX2lsb2MgKmlsb2MpCit7CisJdW5zaWduZWQgbG9uZyBkZXNjLCBncm91cF9kZXNjLCBibG9ja19ncm91cDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCwgYmxvY2s7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICogZ2RwOworCisKKwlpZiAoKGlubyAhPSBFWFQzX1JPT1RfSU5PICYmCisJCWlubyAhPSBFWFQzX0pPVVJOQUxfSU5PICYmCisJCWlubyAhPSBFWFQzX1JFU0laRV9JTk8gJiYKKwkJaW5vIDwgRVhUM19GSVJTVF9JTk8oc2IpKSB8fAorCQlpbm8gPiBsZTMyX3RvX2NwdSgKKwkJCUVYVDNfU0Ioc2IpLT5zX2VzLT5zX2lub2Rlc19jb3VudCkpIHsKKwkJZXh0M19lcnJvciAoc2IsICJleHQzX2dldF9pbm9kZV9ibG9jayIsCisJCQkgICAgImJhZCBpbm9kZSBudW1iZXI6ICVsdSIsIGlubyk7CisJCXJldHVybiAwOworCX0KKwlibG9ja19ncm91cCA9IChpbm8gLSAxKSAvIEVYVDNfSU5PREVTX1BFUl9HUk9VUChzYik7CisJaWYgKGJsb2NrX2dyb3VwID49IEVYVDNfU0Ioc2IpLT5zX2dyb3Vwc19jb3VudCkgeworCQlleHQzX2Vycm9yIChzYiwgImV4dDNfZ2V0X2lub2RlX2Jsb2NrIiwKKwkJCSAgICAiZ3JvdXAgPj0gZ3JvdXBzIGNvdW50Iik7CisJCXJldHVybiAwOworCX0KKwlzbXBfcm1iKCk7CisJZ3JvdXBfZGVzYyA9IGJsb2NrX2dyb3VwID4+IEVYVDNfREVTQ19QRVJfQkxPQ0tfQklUUyhzYik7CisJZGVzYyA9IGJsb2NrX2dyb3VwICYgKEVYVDNfREVTQ19QRVJfQkxPQ0soc2IpIC0gMSk7CisJYmggPSBFWFQzX1NCKHNiKS0+c19ncm91cF9kZXNjW2dyb3VwX2Rlc2NdOworCWlmICghYmgpIHsKKwkJZXh0M19lcnJvciAoc2IsICJleHQzX2dldF9pbm9kZV9ibG9jayIsCisJCQkgICAgIkRlc2NyaXB0b3Igbm90IGxvYWRlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlnZHAgPSAoc3RydWN0IGV4dDNfZ3JvdXBfZGVzYyAqKSBiaC0+Yl9kYXRhOworCS8qCisJICogRmlndXJlIG91dCB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgYmxvY2sgZ3JvdXAgaW5vZGUgdGFibGUKKwkgKi8KKwlvZmZzZXQgPSAoKGlubyAtIDEpICUgRVhUM19JTk9ERVNfUEVSX0dST1VQKHNiKSkgKgorCQlFWFQzX0lOT0RFX1NJWkUoc2IpOworCWJsb2NrID0gbGUzMl90b19jcHUoZ2RwW2Rlc2NdLmJnX2lub2RlX3RhYmxlKSArCisJCShvZmZzZXQgPj4gRVhUM19CTE9DS19TSVpFX0JJVFMoc2IpKTsKKworCWlsb2MtPmJsb2NrX2dyb3VwID0gYmxvY2tfZ3JvdXA7CisJaWxvYy0+b2Zmc2V0ID0gb2Zmc2V0ICYgKEVYVDNfQkxPQ0tfU0laRShzYikgLSAxKTsKKwlyZXR1cm4gYmxvY2s7Cit9CisKKy8qCisgKiBleHQzX2dldF9pbm9kZV9sb2MgcmV0dXJucyB3aXRoIGFuIGV4dHJhIHJlZmNvdW50IGFnYWluc3QgdGhlIGlub2RlJ3MKKyAqIHVuZGVybHlpbmcgYnVmZmVyX2hlYWQgb24gc3VjY2Vzcy4gSWYgJ2luX21lbScgaXMgdHJ1ZSwgd2UgaGF2ZSBhbGwKKyAqIGRhdGEgaW4gbWVtb3J5IHRoYXQgaXMgbmVlZGVkIHRvIHJlY3JlYXRlIHRoZSBvbi1kaXNrIHZlcnNpb24gb2YgdGhpcworICogaW5vZGUuCisgKi8KK3N0YXRpYyBpbnQgX19leHQzX2dldF9pbm9kZV9sb2Moc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQlzdHJ1Y3QgZXh0M19pbG9jICppbG9jLCBpbnQgaW5fbWVtKQoreworCXVuc2lnbmVkIGxvbmcgYmxvY2s7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCWJsb2NrID0gZXh0M19nZXRfaW5vZGVfYmxvY2soaW5vZGUtPmlfc2IsIGlub2RlLT5pX2lubywgaWxvYyk7CisJaWYgKCFibG9jaykKKwkJcmV0dXJuIC1FSU87CisKKwliaCA9IHNiX2dldGJsayhpbm9kZS0+aV9zYiwgYmxvY2spOworCWlmICghYmgpIHsKKwkJZXh0M19lcnJvciAoaW5vZGUtPmlfc2IsICJleHQzX2dldF9pbm9kZV9sb2MiLAorCQkJCSJ1bmFibGUgdG8gcmVhZCBpbm9kZSBibG9jayAtICIKKwkJCQkiaW5vZGU9JWx1LCBibG9jaz0lbHUiLCBpbm9kZS0+aV9pbm8sIGJsb2NrKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQlsb2NrX2J1ZmZlcihiaCk7CisJCWlmIChidWZmZXJfdXB0b2RhdGUoYmgpKSB7CisJCQkvKiBzb21lb25lIGJyb3VnaHQgaXQgdXB0b2RhdGUgd2hpbGUgd2Ugd2FpdGVkICovCisJCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJCWdvdG8gaGFzX2J1ZmZlcjsKKwkJfQorCisJCS8qCisJCSAqIElmIHdlIGhhdmUgYWxsIGluZm9ybWF0aW9uIG9mIHRoZSBpbm9kZSBpbiBtZW1vcnkgYW5kIHRoaXMKKwkJICogaXMgdGhlIG9ubHkgdmFsaWQgaW5vZGUgaW4gdGhlIGJsb2NrLCB3ZSBuZWVkIG5vdCByZWFkIHRoZQorCQkgKiBibG9jay4KKwkJICovCisJCWlmIChpbl9tZW0pIHsKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYml0bWFwX2JoOworCQkJc3RydWN0IGV4dDNfZ3JvdXBfZGVzYyAqZGVzYzsKKwkJCWludCBpbm9kZXNfcGVyX2J1ZmZlcjsKKwkJCWludCBpbm9kZV9vZmZzZXQsIGk7CisJCQlpbnQgYmxvY2tfZ3JvdXA7CisJCQlpbnQgc3RhcnQ7CisKKwkJCWJsb2NrX2dyb3VwID0gKGlub2RlLT5pX2lubyAtIDEpIC8KKwkJCQkJRVhUM19JTk9ERVNfUEVSX0dST1VQKGlub2RlLT5pX3NiKTsKKwkJCWlub2Rlc19wZXJfYnVmZmVyID0gYmgtPmJfc2l6ZSAvCisJCQkJRVhUM19JTk9ERV9TSVpFKGlub2RlLT5pX3NiKTsKKwkJCWlub2RlX29mZnNldCA9ICgoaW5vZGUtPmlfaW5vIC0gMSkgJQorCQkJCQlFWFQzX0lOT0RFU19QRVJfR1JPVVAoaW5vZGUtPmlfc2IpKTsKKwkJCXN0YXJ0ID0gaW5vZGVfb2Zmc2V0ICYgfihpbm9kZXNfcGVyX2J1ZmZlciAtIDEpOworCisJCQkvKiBJcyB0aGUgaW5vZGUgYml0bWFwIGluIGNhY2hlPyAqLworCQkJZGVzYyA9IGV4dDNfZ2V0X2dyb3VwX2Rlc2MoaW5vZGUtPmlfc2IsCisJCQkJCQlibG9ja19ncm91cCwgTlVMTCk7CisJCQlpZiAoIWRlc2MpCisJCQkJZ290byBtYWtlX2lvOworCisJCQliaXRtYXBfYmggPSBzYl9nZXRibGsoaW5vZGUtPmlfc2IsCisJCQkJCWxlMzJfdG9fY3B1KGRlc2MtPmJnX2lub2RlX2JpdG1hcCkpOworCQkJaWYgKCFiaXRtYXBfYmgpCisJCQkJZ290byBtYWtlX2lvOworCisJCQkvKgorCQkJICogSWYgdGhlIGlub2RlIGJpdG1hcCBpc24ndCBpbiBjYWNoZSB0aGVuIHRoZQorCQkJICogb3B0aW1pc2F0aW9uIG1heSBlbmQgdXAgcGVyZm9ybWluZyB0d28gcmVhZHMgaW5zdGVhZAorCQkJICogb2Ygb25lLCBzbyBza2lwIGl0LgorCQkJICovCisJCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaXRtYXBfYmgpKSB7CisJCQkJYnJlbHNlKGJpdG1hcF9iaCk7CisJCQkJZ290byBtYWtlX2lvOworCQkJfQorCQkJZm9yIChpID0gc3RhcnQ7IGkgPCBzdGFydCArIGlub2Rlc19wZXJfYnVmZmVyOyBpKyspIHsKKwkJCQlpZiAoaSA9PSBpbm9kZV9vZmZzZXQpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChleHQzX3Rlc3RfYml0KGksIGJpdG1hcF9iaC0+Yl9kYXRhKSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlicmVsc2UoYml0bWFwX2JoKTsKKwkJCWlmIChpID09IHN0YXJ0ICsgaW5vZGVzX3Blcl9idWZmZXIpIHsKKwkJCQkvKiBhbGwgb3RoZXIgaW5vZGVzIGFyZSBmcmVlLCBzbyBza2lwIEkvTyAqLworCQkJCW1lbXNldChiaC0+Yl9kYXRhLCAwLCBiaC0+Yl9zaXplKTsKKwkJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJCQlnb3RvIGhhc19idWZmZXI7CisJCQl9CisJCX0KKworbWFrZV9pbzoKKwkJLyoKKwkJICogVGhlcmUgYXJlIG90aGVyIHZhbGlkIGlub2RlcyBpbiB0aGUgYnVmZmVyLCB0aGlzIGlub2RlCisJCSAqIGhhcyBpbi1pbm9kZSB4YXR0cnMsIG9yIHdlIGRvbid0IGhhdmUgdGhpcyBpbm9kZSBpbiBtZW1vcnkuCisJCSAqIFJlYWQgdGhlIGJsb2NrIGZyb20gZGlzay4KKwkJICovCisJCWdldF9iaChiaCk7CisJCWJoLT5iX2VuZF9pbyA9IGVuZF9idWZmZXJfcmVhZF9zeW5jOworCQlzdWJtaXRfYmgoUkVBRCwgYmgpOworCQl3YWl0X29uX2J1ZmZlcihiaCk7CisJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQkJZXh0M19lcnJvcihpbm9kZS0+aV9zYiwgImV4dDNfZ2V0X2lub2RlX2xvYyIsCisJCQkJCSJ1bmFibGUgdG8gcmVhZCBpbm9kZSBibG9jayAtICIKKwkJCQkJImlub2RlPSVsdSwgYmxvY2s9JWx1IiwKKwkJCQkJaW5vZGUtPmlfaW5vLCBibG9jayk7CisJCQlicmVsc2UoYmgpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CitoYXNfYnVmZmVyOgorCWlsb2MtPmJoID0gYmg7CisJcmV0dXJuIDA7Cit9CisKK2ludCBleHQzX2dldF9pbm9kZV9sb2Moc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDNfaWxvYyAqaWxvYykKK3sKKwkvKiBXZSBoYXZlIGFsbCBpbm9kZSBkYXRhIGV4Y2VwdCB4YXR0cnMgaW4gbWVtb3J5IGhlcmUuICovCisJcmV0dXJuIF9fZXh0M19nZXRfaW5vZGVfbG9jKGlub2RlLCBpbG9jLAorCQkhKEVYVDNfSShpbm9kZSktPmlfc3RhdGUgJiBFWFQzX1NUQVRFX1hBVFRSKSk7Cit9CisKK3ZvaWQgZXh0M19zZXRfaW5vZGVfZmxhZ3Moc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwl1bnNpZ25lZCBpbnQgZmxhZ3MgPSBFWFQzX0koaW5vZGUpLT5pX2ZsYWdzOworCisJaW5vZGUtPmlfZmxhZ3MgJj0gfihTX1NZTkN8U19BUFBFTkR8U19JTU1VVEFCTEV8U19OT0FUSU1FfFNfRElSU1lOQyk7CisJaWYgKGZsYWdzICYgRVhUM19TWU5DX0ZMKQorCQlpbm9kZS0+aV9mbGFncyB8PSBTX1NZTkM7CisJaWYgKGZsYWdzICYgRVhUM19BUFBFTkRfRkwpCisJCWlub2RlLT5pX2ZsYWdzIHw9IFNfQVBQRU5EOworCWlmIChmbGFncyAmIEVYVDNfSU1NVVRBQkxFX0ZMKQorCQlpbm9kZS0+aV9mbGFncyB8PSBTX0lNTVVUQUJMRTsKKwlpZiAoZmxhZ3MgJiBFWFQzX05PQVRJTUVfRkwpCisJCWlub2RlLT5pX2ZsYWdzIHw9IFNfTk9BVElNRTsKKwlpZiAoZmxhZ3MgJiBFWFQzX0RJUlNZTkNfRkwpCisJCWlub2RlLT5pX2ZsYWdzIHw9IFNfRElSU1lOQzsKK30KKwordm9pZCBleHQzX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJc3RydWN0IGV4dDNfaWxvYyBpbG9jOworCXN0cnVjdCBleHQzX2lub2RlICpyYXdfaW5vZGU7CisJc3RydWN0IGV4dDNfaW5vZGVfaW5mbyAqZWkgPSBFWFQzX0koaW5vZGUpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaW50IGJsb2NrOworCisjaWZkZWYgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMCisJZWktPmlfYWNsID0gRVhUM19BQ0xfTk9UX0NBQ0hFRDsKKwllaS0+aV9kZWZhdWx0X2FjbCA9IEVYVDNfQUNMX05PVF9DQUNIRUQ7CisjZW5kaWYKKwllaS0+aV9ibG9ja19hbGxvY19pbmZvID0gTlVMTDsKKworCWlmIChfX2V4dDNfZ2V0X2lub2RlX2xvYyhpbm9kZSwgJmlsb2MsIDApKQorCQlnb3RvIGJhZF9pbm9kZTsKKwliaCA9IGlsb2MuYmg7CisJcmF3X2lub2RlID0gZXh0M19yYXdfaW5vZGUoJmlsb2MpOworCWlub2RlLT5pX21vZGUgPSBsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmlfbW9kZSk7CisJaW5vZGUtPmlfdWlkID0gKHVpZF90KWxlMTZfdG9fY3B1KHJhd19pbm9kZS0+aV91aWRfbG93KTsKKwlpbm9kZS0+aV9naWQgPSAoZ2lkX3QpbGUxNl90b19jcHUocmF3X2lub2RlLT5pX2dpZF9sb3cpOworCWlmKCEodGVzdF9vcHQgKGlub2RlLT5pX3NiLCBOT19VSUQzMikpKSB7CisJCWlub2RlLT5pX3VpZCB8PSBsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmlfdWlkX2hpZ2gpIDw8IDE2OworCQlpbm9kZS0+aV9naWQgfD0gbGUxNl90b19jcHUocmF3X2lub2RlLT5pX2dpZF9oaWdoKSA8PCAxNjsKKwl9CisJaW5vZGUtPmlfbmxpbmsgPSBsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmlfbGlua3NfY291bnQpOworCWlub2RlLT5pX3NpemUgPSBsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfc2l6ZSk7CisJaW5vZGUtPmlfYXRpbWUudHZfc2VjID0gbGUzMl90b19jcHUocmF3X2lub2RlLT5pX2F0aW1lKTsKKwlpbm9kZS0+aV9jdGltZS50dl9zZWMgPSBsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfY3RpbWUpOworCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IGxlMzJfdG9fY3B1KHJhd19pbm9kZS0+aV9tdGltZSk7CisJaW5vZGUtPmlfYXRpbWUudHZfbnNlYyA9IGlub2RlLT5pX2N0aW1lLnR2X25zZWMgPSBpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gMDsKKworCWVpLT5pX3N0YXRlID0gMDsKKwllaS0+aV9kaXJfc3RhcnRfbG9va3VwID0gMDsKKwllaS0+aV9kdGltZSA9IGxlMzJfdG9fY3B1KHJhd19pbm9kZS0+aV9kdGltZSk7CisJLyogV2Ugbm93IGhhdmUgZW5vdWdoIGZpZWxkcyB0byBjaGVjayBpZiB0aGUgaW5vZGUgd2FzIGFjdGl2ZSBvciBub3QuCisJICogVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBuZnNkIG1pZ2h0IHRyeSB0byBhY2Nlc3MgZGVhZCBpbm9kZXMKKwkgKiB0aGUgdGVzdCBpcyB0aGF0IHNhbWUgb25lIHRoYXQgZTJmc2NrIHVzZXMKKwkgKiBOZWlsQnJvd24gMTk5OW9jdDE1CisJICovCisJaWYgKGlub2RlLT5pX25saW5rID09IDApIHsKKwkJaWYgKGlub2RlLT5pX21vZGUgPT0gMCB8fAorCQkgICAgIShFWFQzX1NCKGlub2RlLT5pX3NiKS0+c19tb3VudF9zdGF0ZSAmIEVYVDNfT1JQSEFOX0ZTKSkgeworCQkJLyogdGhpcyBpbm9kZSBpcyBkZWxldGVkICovCisJCQlicmVsc2UgKGJoKTsKKwkJCWdvdG8gYmFkX2lub2RlOworCQl9CisJCS8qIFRoZSBvbmx5IHVubGlua2VkIGlub2RlcyB3ZSBsZXQgdGhyb3VnaCBoZXJlIGhhdmUKKwkJICogdmFsaWQgaV9tb2RlIGFuZCBhcmUgYmVpbmcgcmVhZCBieSB0aGUgb3JwaGFuCisJCSAqIHJlY292ZXJ5IGNvZGU6IHRoYXQncyBmaW5lLCB3ZSdyZSBhYm91dCB0byBjb21wbGV0ZQorCQkgKiB0aGUgcHJvY2VzcyBvZiBkZWxldGluZyB0aG9zZS4gKi8KKwl9CisJaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfU0laRTsJLyogVGhpcyBpcyB0aGUgb3B0aW1hbCBJTyBzaXplCisJCQkJCSAqIChmb3Igc3RhdCksIG5vdCB0aGUgZnMgYmxvY2sKKwkJCQkJICogc2l6ZSAqLyAgCisJaW5vZGUtPmlfYmxvY2tzID0gbGUzMl90b19jcHUocmF3X2lub2RlLT5pX2Jsb2Nrcyk7CisJZWktPmlfZmxhZ3MgPSBsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfZmxhZ3MpOworI2lmZGVmIEVYVDNfRlJBR01FTlRTCisJZWktPmlfZmFkZHIgPSBsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfZmFkZHIpOworCWVpLT5pX2ZyYWdfbm8gPSByYXdfaW5vZGUtPmlfZnJhZzsKKwllaS0+aV9mcmFnX3NpemUgPSByYXdfaW5vZGUtPmlfZnNpemU7CisjZW5kaWYKKwllaS0+aV9maWxlX2FjbCA9IGxlMzJfdG9fY3B1KHJhd19pbm9kZS0+aV9maWxlX2FjbCk7CisJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisJCWVpLT5pX2Rpcl9hY2wgPSBsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfZGlyX2FjbCk7CisJfSBlbHNlIHsKKwkJaW5vZGUtPmlfc2l6ZSB8PQorCQkJKChfX3U2NClsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfc2l6ZV9oaWdoKSkgPDwgMzI7CisJfQorCWVpLT5pX2Rpc2tzaXplID0gaW5vZGUtPmlfc2l6ZTsKKwlpbm9kZS0+aV9nZW5lcmF0aW9uID0gbGUzMl90b19jcHUocmF3X2lub2RlLT5pX2dlbmVyYXRpb24pOworCWVpLT5pX2Jsb2NrX2dyb3VwID0gaWxvYy5ibG9ja19ncm91cDsKKwkvKgorCSAqIE5PVEUhIFRoZSBpbi1tZW1vcnkgaW5vZGUgaV9kYXRhIGFycmF5IGlzIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIKKwkgKiBldmVuIG9uIGJpZy1lbmRpYW4gbWFjaGluZXM6IHdlIGRvIE5PVCBieXRlc3dhcCB0aGUgYmxvY2sgbnVtYmVycyEKKwkgKi8KKwlmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCBFWFQzX05fQkxPQ0tTOyBibG9jaysrKQorCQllaS0+aV9kYXRhW2Jsb2NrXSA9IHJhd19pbm9kZS0+aV9ibG9ja1tibG9ja107CisJSU5JVF9MSVNUX0hFQUQoJmVpLT5pX29ycGhhbik7CisKKwlpZiAoaW5vZGUtPmlfaW5vID49IEVYVDNfRklSU1RfSU5PKGlub2RlLT5pX3NiKSArIDEgJiYKKwkgICAgRVhUM19JTk9ERV9TSVpFKGlub2RlLT5pX3NiKSA+IEVYVDNfR09PRF9PTERfSU5PREVfU0laRSkgeworCQkvKgorCQkgKiBXaGVuIG1rZTJmcyBjcmVhdGVzIGJpZyBpbm9kZXMgaXQgZG9lcyBub3QgemVybyBvdXQKKwkJICogdGhlIHVudXNlZCBieXRlcyBhYm92ZSBFWFQzX0dPT0RfT0xEX0lOT0RFX1NJWkUsCisJCSAqIHNvIGlnbm9yZSB0aG9zZSBmaXJzdCBmZXcgaW5vZGVzLgorCQkgKi8KKwkJZWktPmlfZXh0cmFfaXNpemUgPSBsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmlfZXh0cmFfaXNpemUpOworCQlpZiAoRVhUM19HT09EX09MRF9JTk9ERV9TSVpFICsgZWktPmlfZXh0cmFfaXNpemUgPgorCQkgICAgRVhUM19JTk9ERV9TSVpFKGlub2RlLT5pX3NiKSkKKwkJCWdvdG8gYmFkX2lub2RlOworCQlpZiAoZWktPmlfZXh0cmFfaXNpemUgPT0gMCkgeworCQkJLyogVGhlIGV4dHJhIHNwYWNlIGlzIGN1cnJlbnRseSB1bnVzZWQuIFVzZSBpdC4gKi8KKwkJCWVpLT5pX2V4dHJhX2lzaXplID0gc2l6ZW9mKHN0cnVjdCBleHQzX2lub2RlKSAtCisJCQkJCSAgICBFWFQzX0dPT0RfT0xEX0lOT0RFX1NJWkU7CisJCX0gZWxzZSB7CisJCQlfX2xlMzIgKm1hZ2ljID0gKHZvaWQgKilyYXdfaW5vZGUgKworCQkJCQlFWFQzX0dPT0RfT0xEX0lOT0RFX1NJWkUgKworCQkJCQllaS0+aV9leHRyYV9pc2l6ZTsKKwkJCWlmICgqbWFnaWMgPT0gY3B1X3RvX2xlMzIoRVhUM19YQVRUUl9NQUdJQykpCisJCQkJIGVpLT5pX3N0YXRlIHw9IEVYVDNfU1RBVEVfWEFUVFI7CisJCX0KKwl9IGVsc2UKKwkJZWktPmlfZXh0cmFfaXNpemUgPSAwOworCisJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaW5vZGUtPmlfb3AgPSAmZXh0M19maWxlX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZleHQzX2ZpbGVfb3BlcmF0aW9uczsKKwkJZXh0M19zZXRfYW9wcyhpbm9kZSk7CisJfSBlbHNlIGlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCWlub2RlLT5pX29wID0gJmV4dDNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZleHQzX2Rpcl9vcGVyYXRpb25zOworCX0gZWxzZSBpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkgeworCQlpZiAoZXh0M19pbm9kZV9pc19mYXN0X3N5bWxpbmsoaW5vZGUpKQorCQkJaW5vZGUtPmlfb3AgPSAmZXh0M19mYXN0X3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJZWxzZSB7CisJCQlpbm9kZS0+aV9vcCA9ICZleHQzX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWV4dDNfc2V0X2FvcHMoaW5vZGUpOworCQl9CisJfSBlbHNlIHsKKwkJaW5vZGUtPmlfb3AgPSAmZXh0M19zcGVjaWFsX2lub2RlX29wZXJhdGlvbnM7CisJCWlmIChyYXdfaW5vZGUtPmlfYmxvY2tbMF0pCisJCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsCisJCQkgICBvbGRfZGVjb2RlX2RldihsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfYmxvY2tbMF0pKSk7CisJCWVsc2UgCisJCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsCisJCQkgICBuZXdfZGVjb2RlX2RldihsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmlfYmxvY2tbMV0pKSk7CisJfQorCWJyZWxzZSAoaWxvYy5iaCk7CisJZXh0M19zZXRfaW5vZGVfZmxhZ3MoaW5vZGUpOworCXJldHVybjsKKworYmFkX2lub2RlOgorCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBQb3N0IHRoZSBzdHJ1Y3QgaW5vZGUgaW5mbyBpbnRvIGFuIG9uLWRpc2sgaW5vZGUgbG9jYXRpb24gaW4gdGhlCisgKiBidWZmZXItY2FjaGUuICBUaGlzIGdvYmJsZXMgdGhlIGNhbGxlcidzIHJlZmVyZW5jZSB0byB0aGUKKyAqIGJ1ZmZlcl9oZWFkIGluIHRoZSBpbm9kZSBsb2NhdGlvbiBzdHJ1Y3QuCisgKgorICogVGhlIGNhbGxlciBtdXN0IGhhdmUgd3JpdGUgYWNjZXNzIHRvIGlsb2MtPmJoLgorICovCitzdGF0aWMgaW50IGV4dDNfZG9fdXBkYXRlX2lub2RlKGhhbmRsZV90ICpoYW5kbGUsIAorCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsIAorCQkJCXN0cnVjdCBleHQzX2lsb2MgKmlsb2MpCit7CisJc3RydWN0IGV4dDNfaW5vZGUgKnJhd19pbm9kZSA9IGV4dDNfcmF3X2lub2RlKGlsb2MpOworCXN0cnVjdCBleHQzX2lub2RlX2luZm8gKmVpID0gRVhUM19JKGlub2RlKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gaWxvYy0+Ymg7CisJaW50IGVyciA9IDAsIHJjLCBibG9jazsKKworCS8qIEZvciBmaWVsZHMgbm90IG5vdCB0cmFja2luZyBpbiB0aGUgaW4tbWVtb3J5IGlub2RlLAorCSAqIGluaXRpYWxpc2UgdGhlbSB0byB6ZXJvIGZvciBuZXcgaW5vZGVzLiAqLworCWlmIChlaS0+aV9zdGF0ZSAmIEVYVDNfU1RBVEVfTkVXKQorCQltZW1zZXQocmF3X2lub2RlLCAwLCBFWFQzX1NCKGlub2RlLT5pX3NiKS0+c19pbm9kZV9zaXplKTsKKworCXJhd19pbm9kZS0+aV9tb2RlID0gY3B1X3RvX2xlMTYoaW5vZGUtPmlfbW9kZSk7CisJaWYoISh0ZXN0X29wdChpbm9kZS0+aV9zYiwgTk9fVUlEMzIpKSkgeworCQlyYXdfaW5vZGUtPmlfdWlkX2xvdyA9IGNwdV90b19sZTE2KGxvd18xNl9iaXRzKGlub2RlLT5pX3VpZCkpOworCQlyYXdfaW5vZGUtPmlfZ2lkX2xvdyA9IGNwdV90b19sZTE2KGxvd18xNl9iaXRzKGlub2RlLT5pX2dpZCkpOworLyoKKyAqIEZpeCB1cCBpbnRlcm9wZXJhYmlsaXR5IHdpdGggb2xkIGtlcm5lbHMuIE90aGVyd2lzZSwgb2xkIGlub2RlcyBnZXQKKyAqIHJlLXVzZWQgd2l0aCB0aGUgdXBwZXIgMTYgYml0cyBvZiB0aGUgdWlkL2dpZCBpbnRhY3QKKyAqLworCQlpZighZWktPmlfZHRpbWUpIHsKKwkJCXJhd19pbm9kZS0+aV91aWRfaGlnaCA9CisJCQkJY3B1X3RvX2xlMTYoaGlnaF8xNl9iaXRzKGlub2RlLT5pX3VpZCkpOworCQkJcmF3X2lub2RlLT5pX2dpZF9oaWdoID0KKwkJCQljcHVfdG9fbGUxNihoaWdoXzE2X2JpdHMoaW5vZGUtPmlfZ2lkKSk7CisJCX0gZWxzZSB7CisJCQlyYXdfaW5vZGUtPmlfdWlkX2hpZ2ggPSAwOworCQkJcmF3X2lub2RlLT5pX2dpZF9oaWdoID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCXJhd19pbm9kZS0+aV91aWRfbG93ID0KKwkJCWNwdV90b19sZTE2KGZzX2hpZ2gybG93dWlkKGlub2RlLT5pX3VpZCkpOworCQlyYXdfaW5vZGUtPmlfZ2lkX2xvdyA9CisJCQljcHVfdG9fbGUxNihmc19oaWdoMmxvd2dpZChpbm9kZS0+aV9naWQpKTsKKwkJcmF3X2lub2RlLT5pX3VpZF9oaWdoID0gMDsKKwkJcmF3X2lub2RlLT5pX2dpZF9oaWdoID0gMDsKKwl9CisJcmF3X2lub2RlLT5pX2xpbmtzX2NvdW50ID0gY3B1X3RvX2xlMTYoaW5vZGUtPmlfbmxpbmspOworCXJhd19pbm9kZS0+aV9zaXplID0gY3B1X3RvX2xlMzIoZWktPmlfZGlza3NpemUpOworCXJhd19pbm9kZS0+aV9hdGltZSA9IGNwdV90b19sZTMyKGlub2RlLT5pX2F0aW1lLnR2X3NlYyk7CisJcmF3X2lub2RlLT5pX2N0aW1lID0gY3B1X3RvX2xlMzIoaW5vZGUtPmlfY3RpbWUudHZfc2VjKTsKKwlyYXdfaW5vZGUtPmlfbXRpbWUgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9tdGltZS50dl9zZWMpOworCXJhd19pbm9kZS0+aV9ibG9ja3MgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9ibG9ja3MpOworCXJhd19pbm9kZS0+aV9kdGltZSA9IGNwdV90b19sZTMyKGVpLT5pX2R0aW1lKTsKKwlyYXdfaW5vZGUtPmlfZmxhZ3MgPSBjcHVfdG9fbGUzMihlaS0+aV9mbGFncyk7CisjaWZkZWYgRVhUM19GUkFHTUVOVFMKKwlyYXdfaW5vZGUtPmlfZmFkZHIgPSBjcHVfdG9fbGUzMihlaS0+aV9mYWRkcik7CisJcmF3X2lub2RlLT5pX2ZyYWcgPSBlaS0+aV9mcmFnX25vOworCXJhd19pbm9kZS0+aV9mc2l6ZSA9IGVpLT5pX2ZyYWdfc2l6ZTsKKyNlbmRpZgorCXJhd19pbm9kZS0+aV9maWxlX2FjbCA9IGNwdV90b19sZTMyKGVpLT5pX2ZpbGVfYWNsKTsKKwlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwkJcmF3X2lub2RlLT5pX2Rpcl9hY2wgPSBjcHVfdG9fbGUzMihlaS0+aV9kaXJfYWNsKTsKKwl9IGVsc2UgeworCQlyYXdfaW5vZGUtPmlfc2l6ZV9oaWdoID0KKwkJCWNwdV90b19sZTMyKGVpLT5pX2Rpc2tzaXplID4+IDMyKTsKKwkJaWYgKGVpLT5pX2Rpc2tzaXplID4gMHg3ZmZmZmZmZlVMTCkgeworCQkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCQkJaWYgKCFFWFQzX0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwKKwkJCQkJRVhUM19GRUFUVVJFX1JPX0NPTVBBVF9MQVJHRV9GSUxFKSB8fAorCQkJICAgIEVYVDNfU0Ioc2IpLT5zX2VzLT5zX3Jldl9sZXZlbCA9PQorCQkJCQljcHVfdG9fbGUzMihFWFQzX0dPT0RfT0xEX1JFVikpIHsKKwkJCSAgICAgICAvKiBJZiB0aGlzIGlzIHRoZSBmaXJzdCBsYXJnZSBmaWxlCisJCQkJKiBjcmVhdGVkLCBhZGQgYSBmbGFnIHRvIHRoZSBzdXBlcmJsb2NrLgorCQkJCSovCisJCQkJZXJyID0gZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLAorCQkJCQkJRVhUM19TQihzYiktPnNfc2JoKTsKKwkJCQlpZiAoZXJyKQorCQkJCQlnb3RvIG91dF9icmVsc2U7CisJCQkJZXh0M191cGRhdGVfZHluYW1pY19yZXYoc2IpOworCQkJCUVYVDNfU0VUX1JPX0NPTVBBVF9GRUFUVVJFKHNiLAorCQkJCQlFWFQzX0ZFQVRVUkVfUk9fQ09NUEFUX0xBUkdFX0ZJTEUpOworCQkJCXNiLT5zX2RpcnQgPSAxOworCQkJCWhhbmRsZS0+aF9zeW5jID0gMTsKKwkJCQllcnIgPSBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLAorCQkJCQkJRVhUM19TQihzYiktPnNfc2JoKTsKKwkJCX0KKwkJfQorCX0KKwlyYXdfaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IGNwdV90b19sZTMyKGlub2RlLT5pX2dlbmVyYXRpb24pOworCWlmIChTX0lTQ0hSKGlub2RlLT5pX21vZGUpIHx8IFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaWYgKG9sZF92YWxpZF9kZXYoaW5vZGUtPmlfcmRldikpIHsKKwkJCXJhd19pbm9kZS0+aV9ibG9ja1swXSA9CisJCQkJY3B1X3RvX2xlMzIob2xkX2VuY29kZV9kZXYoaW5vZGUtPmlfcmRldikpOworCQkJcmF3X2lub2RlLT5pX2Jsb2NrWzFdID0gMDsKKwkJfSBlbHNlIHsKKwkJCXJhd19pbm9kZS0+aV9ibG9ja1swXSA9IDA7CisJCQlyYXdfaW5vZGUtPmlfYmxvY2tbMV0gPQorCQkJCWNwdV90b19sZTMyKG5ld19lbmNvZGVfZGV2KGlub2RlLT5pX3JkZXYpKTsKKwkJCXJhd19pbm9kZS0+aV9ibG9ja1syXSA9IDA7CisJCX0KKwl9IGVsc2UgZm9yIChibG9jayA9IDA7IGJsb2NrIDwgRVhUM19OX0JMT0NLUzsgYmxvY2srKykKKwkJcmF3X2lub2RlLT5pX2Jsb2NrW2Jsb2NrXSA9IGVpLT5pX2RhdGFbYmxvY2tdOworCisJaWYgKEVYVDNfSU5PREVfU0laRShpbm9kZS0+aV9zYikgPiBFWFQzX0dPT0RfT0xEX0lOT0RFX1NJWkUpCisJCXJhd19pbm9kZS0+aV9leHRyYV9pc2l6ZSA9IGNwdV90b19sZTE2KGVpLT5pX2V4dHJhX2lzaXplKTsKKworCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7CisJcmMgPSBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJaWYgKCFlcnIpCisJCWVyciA9IHJjOworCWVpLT5pX3N0YXRlICY9IH5FWFQzX1NUQVRFX05FVzsKKworb3V0X2JyZWxzZToKKwlicmVsc2UgKGJoKTsKKwlleHQzX3N0ZF9lcnJvcihpbm9kZS0+aV9zYiwgZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogZXh0M193cml0ZV9pbm9kZSgpCisgKgorICogV2UgYXJlIGNhbGxlZCBmcm9tIGEgZmV3IHBsYWNlczoKKyAqCisgKiAtIFdpdGhpbiBnZW5lcmljX2ZpbGVfd3JpdGUoKSBmb3IgT19TWU5DIGZpbGVzLgorICogICBIZXJlLCB0aGVyZSB3aWxsIGJlIG5vIHRyYW5zYWN0aW9uIHJ1bm5pbmcuIFdlIHdhaXQgZm9yIGFueSBydW5uaW5nCisgKiAgIHRyYXNuYWN0aW9uIHRvIGNvbW1pdC4KKyAqCisgKiAtIFdpdGhpbiBzeXNfc3luYygpLCBrdXBkYXRlIGFuZCBzdWNoLgorICogICBXZSB3YWl0IG9uIGNvbW1pdCwgaWYgdG9sIHRvLgorICoKKyAqIC0gV2l0aGluIHBydW5lX2ljYWNoZSgpIChQRl9NRU1BTExPQyA9PSB0cnVlKQorICogICBIZXJlIHdlIHNpbXBseSByZXR1cm4uICBXZSBjYW4ndCBhZmZvcmQgdG8gYmxvY2sga3N3YXBkIG9uIHRoZQorICogICBqb3VybmFsIGNvbW1pdC4KKyAqCisgKiBJbiBhbGwgY2FzZXMgaXQgaXMgYWN0dWFsbHkgc2FmZSBmb3IgdXMgdG8gcmV0dXJuIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcsCisgKiBiZWNhdXNlIHRoZSBpbm9kZSBoYXMgYmVlbiBjb3BpZWQgaW50byBhIHJhdyBpbm9kZSBidWZmZXIgaW4KKyAqIGV4dDNfbWFya19pbm9kZV9kaXJ0eSgpLiAgVGhpcyBpcyBhIGNvcnJlY3RuZXNzIHRoaW5nIGZvciBPX1NZTkMgYW5kIGZvcgorICoga25mc2QuCisgKgorICogTm90ZSB0aGF0IHdlIGFyZSBhYnNvbHV0ZWx5IGRlcGVuZGVudCB1cG9uIGFsbCBpbm9kZSBkaXJ0aWVycyBkb2luZyB0aGUKKyAqIHJpZ2h0IHRoaW5nOiB0aGV5ICptdXN0KiBjYWxsIG1hcmtfaW5vZGVfZGlydHkoKSBhZnRlciBkaXJ0eWluZyBpbmZvIGluCisgKiB3aGljaCB3ZSBhcmUgaW50ZXJlc3RlZC4KKyAqCisgKiBJdCB3b3VsZCBiZSBhIGJ1ZyBmb3IgdGhlbSB0byBub3QgZG8gdGhpcy4gIFRoZSBjb2RlOgorICoKKyAqCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpCisgKglzdHVmZigpOworICoJaW5vZGUtPmlfc2l6ZSA9IGV4cHI7CisgKgorICogaXMgaW4gZXJyb3IgYmVjYXVzZSBhIGtzd2FwZC1kcml2ZW4gd3JpdGVfaW5vZGUoKSBjb3VsZCBvY2N1ciB3aGlsZQorICogYHN0dWZmKCknIGlzIHJ1bm5pbmcsIGFuZCB0aGUgbmV3IGlfc2l6ZSB3aWxsIGJlIGxvc3QuICBQbHVzIHRoZSBpbm9kZQorICogd2lsbCBubyBsb25nZXIgYmUgb24gdGhlIHN1cGVyYmxvY2sncyBkaXJ0eSBpbm9kZSBsaXN0LgorICovCitpbnQgZXh0M193cml0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgd2FpdCkKK3sKKwlpZiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9NRU1BTExPQykKKwkJcmV0dXJuIDA7CisKKwlpZiAoZXh0M19qb3VybmFsX2N1cnJlbnRfaGFuZGxlKCkpIHsKKwkJamJkX2RlYnVnKDAsICJjYWxsZWQgcmVjdXJzaXZlbHksIG5vbi1QRl9NRU1BTExPQyFcbiIpOworCQlkdW1wX3N0YWNrKCk7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmICghd2FpdCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZXh0M19mb3JjZV9jb21taXQoaW5vZGUtPmlfc2IpOworfQorCisvKgorICogZXh0M19zZXRhdHRyKCkKKyAqCisgKiBDYWxsZWQgZnJvbSBub3RpZnlfY2hhbmdlLgorICoKKyAqIFdlIHdhbnQgdG8gdHJhcCBWRlMgYXR0ZW1wdHMgdG8gdHJ1bmNhdGUgdGhlIGZpbGUgYXMgc29vbiBhcworICogcG9zc2libGUuICBJbiBwYXJ0aWN1bGFyLCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IHdoZW4gdGhlIFZGUworICogc2hyaW5rcyBpX3NpemUsIHdlIHB1dCB0aGUgaW5vZGUgb24gdGhlIG9ycGhhbiBsaXN0IGFuZCBtb2RpZnkKKyAqIGlfZGlza3NpemUgaW1tZWRpYXRlbHksIHNvIHRoYXQgZHVyaW5nIHRoZSBzdWJzZXF1ZW50IGZsdXNoaW5nIG9mCisgKiBkaXJ0eSBwYWdlcyBhbmQgZnJlZWluZyBvZiBkaXNrIGJsb2Nrcywgd2UgY2FuIGd1YXJhbnRlZSB0aGF0IGFueQorICogY29tbWl0IHdpbGwgbGVhdmUgdGhlIGJsb2NrcyBiZWluZyBmbHVzaGVkIGluIGFuIHVudXNlZCBzdGF0ZSBvbgorICogZGlzay4gIChPbiByZWNvdmVyeSwgdGhlIGlub2RlIHdpbGwgZ2V0IHRydW5jYXRlZCBhbmQgdGhlIGJsb2NrcyB3aWxsCisgKiBiZSBmcmVlZCwgc28gd2UgaGF2ZSBhIHN0cm9uZyBndWFyYW50ZWUgdGhhdCBubyBmdXR1cmUgY29tbWl0IHdpbGwKKyAqIGxlYXZlIHRoZXNlIGJsb2NrcyB2aXNpYmxlIHRvIHRoZSB1c2VyLikgIAorICoKKyAqIENhbGxlZCB3aXRoIGlub2RlLT5zZW0gZG93bi4KKyAqLworaW50IGV4dDNfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqYXR0cikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludCBlcnJvciwgcmMgPSAwOworCWNvbnN0IHVuc2lnbmVkIGludCBpYV92YWxpZCA9IGF0dHItPmlhX3ZhbGlkOworCisJZXJyb3IgPSBpbm9kZV9jaGFuZ2Vfb2soaW5vZGUsIGF0dHIpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJaWYgKChpYV92YWxpZCAmIEFUVFJfVUlEICYmIGF0dHItPmlhX3VpZCAhPSBpbm9kZS0+aV91aWQpIHx8CisJCShpYV92YWxpZCAmIEFUVFJfR0lEICYmIGF0dHItPmlhX2dpZCAhPSBpbm9kZS0+aV9naWQpKSB7CisJCWhhbmRsZV90ICpoYW5kbGU7CisKKwkJLyogKHVzZXIrZ3JvdXApKihvbGQrbmV3KSBzdHJ1Y3R1cmUsIGlub2RlIHdyaXRlIChzYiwKKwkJICogaW5vZGUgYmxvY2ssID8gLSBidXQgdHJ1bmNhdGUgaW5vZGUgdXBkYXRlIGhhcyBpdCkgKi8KKwkJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGlub2RlLCA0KkVYVDNfUVVPVEFfSU5JVF9CTE9DS1MrMyk7CisJCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQkJZXJyb3IgPSBQVFJfRVJSKGhhbmRsZSk7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwkJZXJyb3IgPSBEUVVPVF9UUkFOU0ZFUihpbm9kZSwgYXR0cikgPyAtRURRVU9UIDogMDsKKwkJaWYgKGVycm9yKSB7CisJCQlleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOworCQkJcmV0dXJuIGVycm9yOworCQl9CisJCS8qIFVwZGF0ZSBjb3JyZXNwb25kaW5nIGluZm8gaW4gaW5vZGUgc28gdGhhdCBldmVyeXRoaW5nIGlzIGluCisJCSAqIG9uZSB0cmFuc2FjdGlvbiAqLworCQlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1VJRCkKKwkJCWlub2RlLT5pX3VpZCA9IGF0dHItPmlhX3VpZDsKKwkJaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9HSUQpCisJCQlpbm9kZS0+aV9naWQgPSBhdHRyLT5pYV9naWQ7CisJCWVycm9yID0gZXh0M19tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOworCQlleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOworCX0KKworCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmCisJICAgIGF0dHItPmlhX3ZhbGlkICYgQVRUUl9TSVpFICYmIGF0dHItPmlhX3NpemUgPCBpbm9kZS0+aV9zaXplKSB7CisJCWhhbmRsZV90ICpoYW5kbGU7CisKKwkJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGlub2RlLCAzKTsKKwkJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCQllcnJvciA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCisJCWVycm9yID0gZXh0M19vcnBoYW5fYWRkKGhhbmRsZSwgaW5vZGUpOworCQlFWFQzX0koaW5vZGUpLT5pX2Rpc2tzaXplID0gYXR0ci0+aWFfc2l6ZTsKKwkJcmMgPSBleHQzX21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CisJCWlmICghZXJyb3IpCisJCQllcnJvciA9IHJjOworCQlleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOworCX0KKworCXJjID0gaW5vZGVfc2V0YXR0cihpbm9kZSwgYXR0cik7CisKKwkvKiBJZiBpbm9kZV9zZXRhdHRyJ3MgY2FsbCB0byBleHQzX3RydW5jYXRlIGZhaWxlZCB0byBnZXQgYQorCSAqIHRyYW5zYWN0aW9uIGhhbmRsZSBhdCBhbGwsIHdlIG5lZWQgdG8gY2xlYW4gdXAgdGhlIGluLWNvcmUKKwkgKiBvcnBoYW4gbGlzdCBtYW51YWxseS4gKi8KKwlpZiAoaW5vZGUtPmlfbmxpbmspCisJCWV4dDNfb3JwaGFuX2RlbChOVUxMLCBpbm9kZSk7CisKKwlpZiAoIXJjICYmIChpYV92YWxpZCAmIEFUVFJfTU9ERSkpCisJCXJjID0gZXh0M19hY2xfY2htb2QoaW5vZGUpOworCitlcnJfb3V0OgorCWV4dDNfc3RkX2Vycm9yKGlub2RlLT5pX3NiLCBlcnJvcik7CisJaWYgKCFlcnJvcikKKwkJZXJyb3IgPSByYzsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworLyoKKyAqIGFrcG06IGhvdyBtYW55IGJsb2NrcyBkb3RoIG1ha2UgYSB3cml0ZXBhZ2UoKT8KKyAqCisgKiBXaXRoIE4gYmxvY2tzIHBlciBwYWdlLCBpdCBtYXkgYmU6CisgKiBOIGRhdGEgYmxvY2tzCisgKiAyIGluZGlyZWN0IGJsb2NrCisgKiAyIGRpbmRpcmVjdAorICogMSB0aW5kaXJlY3QKKyAqIE4rNSBiaXRtYXAgYmxvY2tzIChmcm9tIHRoZSBhYm92ZSkKKyAqIE4rNSBncm91cCBkZXNjcmlwdG9yIHN1bW1hcnkgYmxvY2tzCisgKiAxIGlub2RlIGJsb2NrCisgKiAxIHN1cGVyYmxvY2suCisgKiAyICogRVhUM19TSU5HTEVEQVRBX1RSQU5TX0JMT0NLUyBmb3IgdGhlIHF1b3RlIGZpbGVzCisgKgorICogMyAqIChOICsgNSkgKyAyICsgMiAqIEVYVDNfU0lOR0xFREFUQV9UUkFOU19CTE9DS1MKKyAqCisgKiBXaXRoIG9yZGVyZWQgb3Igd3JpdGViYWNrIGRhdGEgaXQncyB0aGUgc2FtZSwgbGVzcyB0aGUgTiBkYXRhIGJsb2Nrcy4KKyAqCisgKiBJZiB0aGUgaW5vZGUncyBkaXJlY3QgYmxvY2tzIGNhbiBob2xkIGFuIGludGVncmFsIG51bWJlciBvZiBwYWdlcyB0aGVuIGEKKyAqIHBhZ2UgY2Fubm90IHN0cmFkZGxlIHR3byBpbmRpcmVjdCBibG9ja3MsIGFuZCB3ZSBjYW4gb25seSB0b3VjaCBvbmUgaW5kaXJlY3QKKyAqIGFuZCBkaW5kaXJlY3QgYmxvY2ssIGFuZCB0aGUgIjUiIGFib3ZlIGJlY29tZXMgIjMiLgorICoKKyAqIFRoaXMgc3RpbGwgb3ZlcmVzdGltYXRlcyB1bmRlciBtb3N0IGNpcmN1bXN0YW5jZXMuICBJZiB3ZSB3ZXJlIHRvIHBhc3MgdGhlCisgKiBzdGFydCBhbmQgZW5kIG9mZnNldHMgaW4gaGVyZSBhcyB3ZWxsIHdlIGNvdWxkIGRvIGJsb2NrX3RvX3BhdGgoKSBvbiBlYWNoCisgKiBibG9jayBhbmQgd29yayBvdXQgdGhlIGV4YWN0IG51bWJlciBvZiBpbmRpcmVjdHMgd2hpY2ggYXJlIHRvdWNoZWQuICBQYWguCisgKi8KKworc3RhdGljIGludCBleHQzX3dyaXRlcGFnZV90cmFuc19ibG9ja3Moc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpbnQgYnBwID0gZXh0M19qb3VybmFsX2Jsb2Nrc19wZXJfcGFnZShpbm9kZSk7CisJaW50IGluZGlyZWN0cyA9IChFWFQzX05ESVJfQkxPQ0tTICUgYnBwKSA/IDUgOiAzOworCWludCByZXQ7CisKKwlpZiAoZXh0M19zaG91bGRfam91cm5hbF9kYXRhKGlub2RlKSkKKwkJcmV0ID0gMyAqIChicHAgKyBpbmRpcmVjdHMpICsgMjsKKwllbHNlCisJCXJldCA9IDIgKiAoYnBwICsgaW5kaXJlY3RzKSArIDI7CisKKyNpZmRlZiBDT05GSUdfUVVPVEEKKwkvKiBXZSBrbm93IHRoYXQgc3RydWN0dXJlIHdhcyBhbHJlYWR5IGFsbG9jYXRlZCBkdXJpbmcgRFFVT1RfSU5JVCBzbworCSAqIHdlIHdpbGwgYmUgdXBkYXRpbmcgb25seSB0aGUgZGF0YSBibG9ja3MgKyBpbm9kZXMgKi8KKwlyZXQgKz0gMipFWFQzX1FVT1RBX1RSQU5TX0JMT0NLUzsKKyNlbmRpZgorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFRoZSBjYWxsZXIgbXVzdCBoYXZlIHByZXZpb3VzbHkgY2FsbGVkIGV4dDNfcmVzZXJ2ZV9pbm9kZV93cml0ZSgpLgorICogR2l2ZSB0aGlzLCB3ZSBrbm93IHRoYXQgdGhlIGNhbGxlciBhbHJlYWR5IGhhcyB3cml0ZSBhY2Nlc3MgdG8gaWxvYy0+YmguCisgKi8KK2ludCBleHQzX21hcmtfaWxvY19kaXJ0eShoYW5kbGVfdCAqaGFuZGxlLAorCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZXh0M19pbG9jICppbG9jKQoreworCWludCBlcnIgPSAwOworCisJLyogdGhlIGRvX3VwZGF0ZV9pbm9kZSBjb25zdW1lcyBvbmUgYmgtPmJfY291bnQgKi8KKwlnZXRfYmgoaWxvYy0+YmgpOworCisJLyogZXh0M19kb191cGRhdGVfaW5vZGUoKSBkb2VzIGpvdXJuYWxfZGlydHlfbWV0YWRhdGEgKi8KKwllcnIgPSBleHQzX2RvX3VwZGF0ZV9pbm9kZShoYW5kbGUsIGlub2RlLCBpbG9jKTsKKwlwdXRfYmgoaWxvYy0+YmgpOworCXJldHVybiBlcnI7Cit9CisKKy8qIAorICogT24gc3VjY2VzcywgV2UgZW5kIHVwIHdpdGggYW4gb3V0c3RhbmRpbmcgcmVmZXJlbmNlIGNvdW50IGFnYWluc3QKKyAqIGlsb2MtPmJoLiAgVGhpcyBfbXVzdF8gYmUgY2xlYW5lZCB1cCBsYXRlci4gCisgKi8KKworaW50CitleHQzX3Jlc2VydmVfaW5vZGVfd3JpdGUoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwgCisJCQkgc3RydWN0IGV4dDNfaWxvYyAqaWxvYykKK3sKKwlpbnQgZXJyID0gMDsKKwlpZiAoaGFuZGxlKSB7CisJCWVyciA9IGV4dDNfZ2V0X2lub2RlX2xvYyhpbm9kZSwgaWxvYyk7CisJCWlmICghZXJyKSB7CisJCQlCVUZGRVJfVFJBQ0UoaWxvYy0+YmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJCQllcnIgPSBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGlsb2MtPmJoKTsKKwkJCWlmIChlcnIpIHsKKwkJCQlicmVsc2UoaWxvYy0+YmgpOworCQkJCWlsb2MtPmJoID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KKwlleHQzX3N0ZF9lcnJvcihpbm9kZS0+aV9zYiwgZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogYWtwbTogV2hhdCB3ZSBkbyBoZXJlIGlzIHRvIG1hcmsgdGhlIGluLWNvcmUgaW5vZGUgYXMgY2xlYW4KKyAqIHdpdGggcmVzcGVjdCB0byBpbm9kZSBkaXJ0aW5lc3MgKGl0IG1heSBzdGlsbCBiZSBkYXRhLWRpcnR5KS4KKyAqIFRoaXMgbWVhbnMgdGhhdCB0aGUgaW4tY29yZSBpbm9kZSBtYXkgYmUgcmVhcGVkIGJ5IHBydW5lX2ljYWNoZQorICogd2l0aG91dCBoYXZpbmcgdG8gcGVyZm9ybSBhbnkgSS9PLiAgVGhpcyBpcyBhIHZlcnkgZ29vZCB0aGluZywKKyAqIGJlY2F1c2UgKmFueSogdGFzayBtYXkgY2FsbCBwcnVuZV9pY2FjaGUgLSBldmVuIG9uZXMgd2hpY2gKKyAqIGhhdmUgYSB0cmFuc2FjdGlvbiBvcGVuIGFnYWluc3QgYSBkaWZmZXJlbnQgam91cm5hbC4KKyAqCisgKiBJcyB0aGlzIGNoZWF0aW5nPyAgTm90IHJlYWxseS4gIFN1cmUsIHdlIGhhdmVuJ3Qgd3JpdHRlbiB0aGUKKyAqIGlub2RlIG91dCwgYnV0IHBydW5lX2ljYWNoZSBpc24ndCBhIHVzZXItdmlzaWJsZSBzeW5jaW5nIGZ1bmN0aW9uLgorICogV2hlbmV2ZXIgdGhlIHVzZXIgd2FudHMgc3R1ZmYgc3luY2VkIChzeXNfc3luYywgc3lzX21zeW5jLCBzeXNfZnN5bmMpCisgKiB3ZSBzdGFydCBhbmQgd2FpdCBvbiBjb21taXRzLgorICoKKyAqIElzIHRoaXMgZWZmaWNpZW50L2VmZmVjdGl2ZT8gIFdlbGwsIHdlJ3JlIGJlaW5nIG5pY2UgdG8gdGhlIHN5c3RlbQorICogYnkgY2xlYW5pbmcgdXAgb3VyIGlub2RlcyBwcm9hY3RpdmVseSBzbyB0aGV5IGNhbiBiZSByZWFwZWQKKyAqIHdpdGhvdXQgSS9PLiAgQnV0IHdlIGFyZSBwb3RlbnRpYWxseSBsZWF2aW5nIHVwIHRvIGZpdmUgc2Vjb25kcycKKyAqIHdvcnRoIG9mIGlub2RlcyBmbG9hdGluZyBhYm91dCB3aGljaCBwcnVuZV9pY2FjaGUgd2FudHMgdXMgdG8KKyAqIHdyaXRlIG91dC4gIE9uZSB3YXkgdG8gZml4IHRoYXQgd291bGQgYmUgdG8gZ2V0IHBydW5lX2ljYWNoZSgpCisgKiB0byBkbyBhIHdyaXRlX3N1cGVyKCkgdG8gZnJlZSB1cCBzb21lIG1lbW9yeS4gIEl0IGhhcyB0aGUgZGVzaXJlZAorICogZWZmZWN0LgorICovCitpbnQgZXh0M19tYXJrX2lub2RlX2RpcnR5KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGV4dDNfaWxvYyBpbG9jOworCWludCBlcnI7CisKKwltaWdodF9zbGVlcCgpOworCWVyciA9IGV4dDNfcmVzZXJ2ZV9pbm9kZV93cml0ZShoYW5kbGUsIGlub2RlLCAmaWxvYyk7CisJaWYgKCFlcnIpCisJCWVyciA9IGV4dDNfbWFya19pbG9jX2RpcnR5KGhhbmRsZSwgaW5vZGUsICZpbG9jKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogYWtwbTogZXh0M19kaXJ0eV9pbm9kZSgpIGlzIGNhbGxlZCBmcm9tIF9fbWFya19pbm9kZV9kaXJ0eSgpCisgKgorICogV2UncmUgcmVhbGx5IGludGVyZXN0ZWQgaW4gdGhlIGNhc2Ugd2hlcmUgYSBmaWxlIGlzIGJlaW5nIGV4dGVuZGVkLgorICogaV9zaXplIGhhcyBiZWVuIGNoYW5nZWQgYnkgZ2VuZXJpY19jb21taXRfd3JpdGUoKSBhbmQgd2UgdGh1cyBuZWVkCisgKiB0byBpbmNsdWRlIHRoZSB1cGRhdGVkIGlub2RlIGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLgorICoKKyAqIEFsc28sIERRVU9UX0FMTE9DX1NQQUNFKCkgd2lsbCBhbHdheXMgZGlydHkgdGhlIGlub2RlIHdoZW4gYmxvY2tzCisgKiBhcmUgYWxsb2NhdGVkIHRvIHRoZSBmaWxlLgorICoKKyAqIElmIHRoZSBpbm9kZSBpcyBtYXJrZWQgc3luY2hyb25vdXMsIHdlIGRvbid0IGhvbm91ciB0aGF0IGhlcmUgLSBkb2luZworICogc28gd291bGQgY2F1c2UgYSBjb21taXQgb24gYXRpbWUgdXBkYXRlcywgd2hpY2ggd2UgZG9uJ3QgYm90aGVyIGRvaW5nLgorICogV2UgaGFuZGxlIHN5bmNocm9ub3VzIGlub2RlcyBhdCB0aGUgaGlnaGVzdCBwb3NzaWJsZSBsZXZlbC4KKyAqLwordm9pZCBleHQzX2RpcnR5X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaGFuZGxlX3QgKmN1cnJlbnRfaGFuZGxlID0gZXh0M19qb3VybmFsX2N1cnJlbnRfaGFuZGxlKCk7CisJaGFuZGxlX3QgKmhhbmRsZTsKKworCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydChpbm9kZSwgMik7CisJaWYgKElTX0VSUihoYW5kbGUpKQorCQlnb3RvIG91dDsKKwlpZiAoY3VycmVudF9oYW5kbGUgJiYKKwkJY3VycmVudF9oYW5kbGUtPmhfdHJhbnNhY3Rpb24gIT0gaGFuZGxlLT5oX3RyYW5zYWN0aW9uKSB7CisJCS8qIFRoaXMgdGFzayBoYXMgYSB0cmFuc2FjdGlvbiBvcGVuIGFnYWluc3QgYSBkaWZmZXJlbnQgZnMgKi8KKwkJcHJpbnRrKEtFUk5fRU1FUkcgIiVzOiB0cmFuc2FjdGlvbnMgZG8gbm90IG1hdGNoIVxuIiwKKwkJICAgICAgIF9fRlVOQ1RJT05fXyk7CisJfSBlbHNlIHsKKwkJamJkX2RlYnVnKDUsICJtYXJraW5nIGRpcnR5LiAgb3V0ZXIgaGFuZGxlPSVwXG4iLAorCQkJCWN1cnJlbnRfaGFuZGxlKTsKKwkJZXh0M19tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOworCX0KKwlleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOworb3V0OgorCXJldHVybjsKK30KKworI2lmZGVmIEFLUE0KKy8qIAorICogQmluZCBhbiBpbm9kZSdzIGJhY2tpbmcgYnVmZmVyX2hlYWQgaW50byB0aGlzIHRyYW5zYWN0aW9uLCB0byBwcmV2ZW50CisgKiBpdCBmcm9tIGJlaW5nIGZsdXNoZWQgdG8gZGlzayBlYXJseS4gIFVubGlrZQorICogZXh0M19yZXNlcnZlX2lub2RlX3dyaXRlLCB0aGlzIGxlYXZlcyBiZWhpbmQgbm8gYmggcmVmZXJlbmNlIGFuZAorICogcmV0dXJucyBubyBpbG9jIHN0cnVjdHVyZSwgc28gdGhlIGNhbGxlciBuZWVkcyB0byByZXBlYXQgdGhlIGlsb2MKKyAqIGxvb2t1cCB0byBtYXJrIHRoZSBpbm9kZSBkaXJ0eSBsYXRlci4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK2V4dDNfcGluX2lub2RlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGV4dDNfaWxvYyBpbG9jOworCisJaW50IGVyciA9IDA7CisJaWYgKGhhbmRsZSkgeworCQllcnIgPSBleHQzX2dldF9pbm9kZV9sb2MoaW5vZGUsICZpbG9jKTsKKwkJaWYgKCFlcnIpIHsKKwkJCUJVRkZFUl9UUkFDRShpbG9jLmJoLCAiZ2V0X3dyaXRlX2FjY2VzcyIpOworCQkJZXJyID0gam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgaWxvYy5iaCk7CisJCQlpZiAoIWVycikKKwkJCQllcnIgPSBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCAKKwkJCQkJCQkJICBpbG9jLmJoKTsKKwkJCWJyZWxzZShpbG9jLmJoKTsKKwkJfQorCX0KKwlleHQzX3N0ZF9lcnJvcihpbm9kZS0+aV9zYiwgZXJyKTsKKwlyZXR1cm4gZXJyOworfQorI2VuZGlmCisKK2ludCBleHQzX2NoYW5nZV9pbm9kZV9qb3VybmFsX2ZsYWcoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHZhbCkKK3sKKwlqb3VybmFsX3QgKmpvdXJuYWw7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlpbnQgZXJyOworCisJLyoKKwkgKiBXZSBoYXZlIHRvIGJlIHZlcnkgY2FyZWZ1bCBoZXJlOiBjaGFuZ2luZyBhIGRhdGEgYmxvY2sncworCSAqIGpvdXJuYWxpbmcgc3RhdHVzIGR5bmFtaWNhbGx5IGlzIGRhbmdlcm91cy4gIElmIHdlIHdyaXRlIGEKKwkgKiBkYXRhIGJsb2NrIHRvIHRoZSBqb3VybmFsLCBjaGFuZ2UgdGhlIHN0YXR1cyBhbmQgdGhlbiBkZWxldGUKKwkgKiB0aGF0IGJsb2NrLCB3ZSByaXNrIGZvcmdldHRpbmcgdG8gcmV2b2tlIHRoZSBvbGQgbG9nIHJlY29yZAorCSAqIGZyb20gdGhlIGpvdXJuYWwgYW5kIHNvIGEgc3Vic2VxdWVudCByZXBsYXkgY2FuIGNvcnJ1cHQgZGF0YS4KKwkgKiBTbywgZmlyc3Qgd2UgbWFrZSBzdXJlIHRoYXQgdGhlIGpvdXJuYWwgaXMgZW1wdHkgYW5kIHRoYXQKKwkgKiBub2JvZHkgaXMgY2hhbmdpbmcgYW55dGhpbmcuCisJICovCisKKwlqb3VybmFsID0gRVhUM19KT1VSTkFMKGlub2RlKTsKKwlpZiAoaXNfam91cm5hbF9hYm9ydGVkKGpvdXJuYWwpIHx8IElTX1JET05MWShpbm9kZSkpCisJCXJldHVybiAtRVJPRlM7CisKKwlqb3VybmFsX2xvY2tfdXBkYXRlcyhqb3VybmFsKTsKKwlqb3VybmFsX2ZsdXNoKGpvdXJuYWwpOworCisJLyoKKwkgKiBPSywgdGhlcmUgYXJlIG5vIHVwZGF0ZXMgcnVubmluZyBub3csIGFuZCBhbGwgY2FjaGVkIGRhdGEgaXMKKwkgKiBzeW5jZWQgdG8gZGlzay4gIFdlIGFyZSBub3cgaW4gYSBjb21wbGV0ZWx5IGNvbnNpc3RlbnQgc3RhdGUKKwkgKiB3aGljaCBkb2Vzbid0IGhhdmUgYW55dGhpbmcgaW4gdGhlIGpvdXJuYWwsIGFuZCB3ZSBrbm93IHRoYXQKKwkgKiBubyBmaWxlc3lzdGVtIHVwZGF0ZXMgYXJlIHJ1bm5pbmcsIHNvIGl0IGlzIHNhZmUgdG8gbW9kaWZ5CisJICogdGhlIGlub2RlJ3MgaW4tY29yZSBkYXRhLWpvdXJuYWxpbmcgc3RhdGUgZmxhZyBub3cuCisJICovCisKKwlpZiAodmFsKQorCQlFWFQzX0koaW5vZGUpLT5pX2ZsYWdzIHw9IEVYVDNfSk9VUk5BTF9EQVRBX0ZMOworCWVsc2UKKwkJRVhUM19JKGlub2RlKS0+aV9mbGFncyAmPSB+RVhUM19KT1VSTkFMX0RBVEFfRkw7CisJZXh0M19zZXRfYW9wcyhpbm9kZSk7CisKKwlqb3VybmFsX3VubG9ja191cGRhdGVzKGpvdXJuYWwpOworCisJLyogRmluYWxseSB3ZSBjYW4gbWFyayB0aGUgaW5vZGUgYXMgZGlydHkuICovCisKKwloYW5kbGUgPSBleHQzX2pvdXJuYWxfc3RhcnQoaW5vZGUsIDEpOworCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKKworCWVyciA9IGV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKKwloYW5kbGUtPmhfc3luYyA9IDE7CisJZXh0M19qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwlleHQzX3N0ZF9lcnJvcihpbm9kZS0+aV9zYiwgZXJyKTsKKworCXJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9mcy9leHQzL2lvY3RsLmMgYi9mcy9leHQzL2lvY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2ZDY4NgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDMvaW9jdGwuYwpAQCAtMCwwICsxLDI0MyBAQAorLyoKKyAqIGxpbnV4L2ZzL2V4dDMvaW9jdGwuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NQorICogUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQorICogTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9qYmQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHQzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXh0M19qYmQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworCitpbnQgZXh0M19pb2N0bCAoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCwgdW5zaWduZWQgaW50IGNtZCwKKwkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGV4dDNfaW5vZGVfaW5mbyAqZWkgPSBFWFQzX0koaW5vZGUpOworCXVuc2lnbmVkIGludCBmbGFnczsKKwl1bnNpZ25lZCBzaG9ydCByc3Zfd2luZG93X3NpemU7CisKKwlleHQzX2RlYnVnICgiY21kID0gJXUsIGFyZyA9ICVsdVxuIiwgY21kLCBhcmcpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEVYVDNfSU9DX0dFVEZMQUdTOgorCQlmbGFncyA9IGVpLT5pX2ZsYWdzICYgRVhUM19GTF9VU0VSX1ZJU0lCTEU7CisJCXJldHVybiBwdXRfdXNlcihmbGFncywgKGludCBfX3VzZXIgKikgYXJnKTsKKwljYXNlIEVYVDNfSU9DX1NFVEZMQUdTOiB7CisJCWhhbmRsZV90ICpoYW5kbGUgPSBOVUxMOworCQlpbnQgZXJyOworCQlzdHJ1Y3QgZXh0M19pbG9jIGlsb2M7CisJCXVuc2lnbmVkIGludCBvbGRmbGFnczsKKwkJdW5zaWduZWQgaW50IGpmbGFnOworCisJCWlmIChJU19SRE9OTFkoaW5vZGUpKQorCQkJcmV0dXJuIC1FUk9GUzsKKworCQlpZiAoKGN1cnJlbnQtPmZzdWlkICE9IGlub2RlLT5pX3VpZCkgJiYgIWNhcGFibGUoQ0FQX0ZPV05FUikpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKworCQlpZiAoZ2V0X3VzZXIoZmxhZ3MsIChpbnQgX191c2VyICopIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCQlmbGFncyAmPSB+RVhUM19ESVJTWU5DX0ZMOworCisJCW9sZGZsYWdzID0gZWktPmlfZmxhZ3M7CisKKwkJLyogVGhlIEpPVVJOQUxfREFUQSBmbGFnIGlzIG1vZGlmaWFibGUgb25seSBieSByb290ICovCisJCWpmbGFnID0gZmxhZ3MgJiBFWFQzX0pPVVJOQUxfREFUQV9GTDsKKworCQkvKgorCQkgKiBUaGUgSU1NVVRBQkxFIGFuZCBBUFBFTkRfT05MWSBmbGFncyBjYW4gb25seSBiZSBjaGFuZ2VkIGJ5CisJCSAqIHRoZSByZWxldmFudCBjYXBhYmlsaXR5LgorCQkgKgorCQkgKiBUaGlzIHRlc3QgbG9va3MgbmljZXIuIFRoYW5rcyB0byBQYXVsaW5lIE1pZGRlbGluaworCQkgKi8KKwkJaWYgKChmbGFncyBeIG9sZGZsYWdzKSAmIChFWFQzX0FQUEVORF9GTCB8IEVYVDNfSU1NVVRBQkxFX0ZMKSkgeworCQkJaWYgKCFjYXBhYmxlKENBUF9MSU5VWF9JTU1VVEFCTEUpKQorCQkJCXJldHVybiAtRVBFUk07CisJCX0KKworCQkvKgorCQkgKiBUaGUgSk9VUk5BTF9EQVRBIGZsYWcgY2FuIG9ubHkgYmUgY2hhbmdlZCBieQorCQkgKiB0aGUgcmVsZXZhbnQgY2FwYWJpbGl0eS4KKwkJICovCisJCWlmICgoamZsYWcgXiBvbGRmbGFncykgJiAoRVhUM19KT1VSTkFMX0RBVEFfRkwpKSB7CisJCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19SRVNPVVJDRSkpCisJCQkJcmV0dXJuIC1FUEVSTTsKKwkJfQorCisKKwkJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGlub2RlLCAxKTsKKwkJaWYgKElTX0VSUihoYW5kbGUpKQorCQkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKKwkJaWYgKElTX1NZTkMoaW5vZGUpKQorCQkJaGFuZGxlLT5oX3N5bmMgPSAxOworCQllcnIgPSBleHQzX3Jlc2VydmVfaW5vZGVfd3JpdGUoaGFuZGxlLCBpbm9kZSwgJmlsb2MpOworCQlpZiAoZXJyKQorCQkJZ290byBmbGFnc19lcnI7CisKKwkJZmxhZ3MgPSBmbGFncyAmIEVYVDNfRkxfVVNFUl9NT0RJRklBQkxFOworCQlmbGFncyB8PSBvbGRmbGFncyAmIH5FWFQzX0ZMX1VTRVJfTU9ESUZJQUJMRTsKKwkJZWktPmlfZmxhZ3MgPSBmbGFnczsKKworCQlleHQzX3NldF9pbm9kZV9mbGFncyhpbm9kZSk7CisJCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKworCQllcnIgPSBleHQzX21hcmtfaWxvY19kaXJ0eShoYW5kbGUsIGlub2RlLCAmaWxvYyk7CitmbGFnc19lcnI6CisJCWV4dDNfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCWlmICgoamZsYWcgXiBvbGRmbGFncykgJiAoRVhUM19KT1VSTkFMX0RBVEFfRkwpKQorCQkJZXJyID0gZXh0M19jaGFuZ2VfaW5vZGVfam91cm5hbF9mbGFnKGlub2RlLCBqZmxhZyk7CisJCXJldHVybiBlcnI7CisJfQorCWNhc2UgRVhUM19JT0NfR0VUVkVSU0lPTjoKKwljYXNlIEVYVDNfSU9DX0dFVFZFUlNJT05fT0xEOgorCQlyZXR1cm4gcHV0X3VzZXIoaW5vZGUtPmlfZ2VuZXJhdGlvbiwgKGludCBfX3VzZXIgKikgYXJnKTsKKwljYXNlIEVYVDNfSU9DX1NFVFZFUlNJT046CisJY2FzZSBFWFQzX0lPQ19TRVRWRVJTSU9OX09MRDogeworCQloYW5kbGVfdCAqaGFuZGxlOworCQlzdHJ1Y3QgZXh0M19pbG9jIGlsb2M7CisJCV9fdTMyIGdlbmVyYXRpb247CisJCWludCBlcnI7CisKKwkJaWYgKChjdXJyZW50LT5mc3VpZCAhPSBpbm9kZS0+aV91aWQpICYmICFjYXBhYmxlKENBUF9GT1dORVIpKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKElTX1JET05MWShpbm9kZSkpCisJCQlyZXR1cm4gLUVST0ZTOworCQlpZiAoZ2V0X3VzZXIoZ2VuZXJhdGlvbiwgKGludCBfX3VzZXIgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydChpbm9kZSwgMSk7CisJCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CisJCWVyciA9IGV4dDNfcmVzZXJ2ZV9pbm9kZV93cml0ZShoYW5kbGUsIGlub2RlLCAmaWxvYyk7CisJCWlmIChlcnIgPT0gMCkgeworCQkJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCQkJaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IGdlbmVyYXRpb247CisJCQllcnIgPSBleHQzX21hcmtfaWxvY19kaXJ0eShoYW5kbGUsIGlub2RlLCAmaWxvYyk7CisJCX0KKwkJZXh0M19qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwkJcmV0dXJuIGVycjsKKwl9CisjaWZkZWYgQ09ORklHX0pCRF9ERUJVRworCWNhc2UgRVhUM19JT0NfV0FJVF9GT1JfUkVBRE9OTFk6CisJCS8qCisJCSAqIFRoaXMgaXMgcmFjeSAtIGJ5IHRoZSB0aW1lIHdlJ3JlIHdva2VuIHVwIGFuZCBydW5uaW5nLAorCQkgKiB0aGUgc3VwZXJibG9jayBjb3VsZCBiZSByZWxlYXNlZC4gIEFuZCB0aGUgbW9kdWxlIGNvdWxkCisJCSAqIGhhdmUgYmVlbiB1bmxvYWRlZC4gIFNvIHN1ZSBtZS4KKwkJICoKKwkJICogUmV0dXJucyAxIGlmIGl0IHNsZXB0LCBlbHNlIHplcm8uCisJCSAqLworCQl7CisJCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJCQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwkJCWludCByZXQgPSAwOworCisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJYWRkX3dhaXRfcXVldWUoJkVYVDNfU0Ioc2IpLT5yb193YWl0X3F1ZXVlLCAmd2FpdCk7CisJCQlpZiAodGltZXJfcGVuZGluZygmRVhUM19TQihzYiktPnR1cm5fcm9fdGltZXIpKSB7CisJCQkJc2NoZWR1bGUoKTsKKwkJCQlyZXQgPSAxOworCQkJfQorCQkJcmVtb3ZlX3dhaXRfcXVldWUoJkVYVDNfU0Ioc2IpLT5yb193YWl0X3F1ZXVlLCAmd2FpdCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisjZW5kaWYKKwljYXNlIEVYVDNfSU9DX0dFVFJTVlNaOgorCQlpZiAodGVzdF9vcHQoaW5vZGUtPmlfc2IsIFJFU0VSVkFUSU9OKQorCQkJJiYgU19JU1JFRyhpbm9kZS0+aV9tb2RlKQorCQkJJiYgZWktPmlfYmxvY2tfYWxsb2NfaW5mbykgeworCQkJcnN2X3dpbmRvd19zaXplID0gZWktPmlfYmxvY2tfYWxsb2NfaW5mby0+cnN2X3dpbmRvd19ub2RlLnJzdl9nb2FsX3NpemU7CisJCQlyZXR1cm4gcHV0X3VzZXIocnN2X3dpbmRvd19zaXplLCAoaW50IF9fdXNlciAqKWFyZyk7CisJCX0KKwkJcmV0dXJuIC1FTk9UVFk7CisJY2FzZSBFWFQzX0lPQ19TRVRSU1ZTWjogeworCisJCWlmICghdGVzdF9vcHQoaW5vZGUtPmlfc2IsIFJFU0VSVkFUSU9OKSB8fCFTX0lTUkVHKGlub2RlLT5pX21vZGUpKQorCQkJcmV0dXJuIC1FTk9UVFk7CisKKwkJaWYgKElTX1JET05MWShpbm9kZSkpCisJCQlyZXR1cm4gLUVST0ZTOworCisJCWlmICgoY3VycmVudC0+ZnN1aWQgIT0gaW5vZGUtPmlfdWlkKSAmJiAhY2FwYWJsZShDQVBfRk9XTkVSKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCisJCWlmIChnZXRfdXNlcihyc3Zfd2luZG93X3NpemUsIChpbnQgX191c2VyICopYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChyc3Zfd2luZG93X3NpemUgPiBFWFQzX01BWF9SRVNFUlZFX0JMT0NLUykKKwkJCXJzdl93aW5kb3dfc2l6ZSA9IEVYVDNfTUFYX1JFU0VSVkVfQkxPQ0tTOworCisJCS8qCisJCSAqIG5lZWQgdG8gYWxsb2NhdGUgcmVzZXJ2YXRpb24gc3RydWN0dXJlIGZvciB0aGlzIGlub2RlCisJCSAqIGJlZm9yZSBzZXQgdGhlIHdpbmRvdyBzaXplCisJCSAqLworCQlkb3duKCZlaS0+dHJ1bmNhdGVfc2VtKTsKKwkJaWYgKCFlaS0+aV9ibG9ja19hbGxvY19pbmZvKQorCQkJZXh0M19pbml0X2Jsb2NrX2FsbG9jX2luZm8oaW5vZGUpOworCisJCWlmIChlaS0+aV9ibG9ja19hbGxvY19pbmZvKXsKKwkJCXN0cnVjdCBleHQzX3Jlc2VydmVfd2luZG93X25vZGUgKnJzdiA9ICZlaS0+aV9ibG9ja19hbGxvY19pbmZvLT5yc3Zfd2luZG93X25vZGU7CisJCQlyc3YtPnJzdl9nb2FsX3NpemUgPSByc3Zfd2luZG93X3NpemU7CisJCX0KKwkJdXAoJmVpLT50cnVuY2F0ZV9zZW0pOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBFWFQzX0lPQ19HUk9VUF9FWFRFTkQ6IHsKKwkJdW5zaWduZWQgbG9uZyBuX2Jsb2Nrc19jb3VudDsKKwkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCQlpbnQgZXJyOworCisJCWlmICghY2FwYWJsZShDQVBfU1lTX1JFU09VUkNFKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJaWYgKElTX1JET05MWShpbm9kZSkpCisJCQlyZXR1cm4gLUVST0ZTOworCisJCWlmIChnZXRfdXNlcihuX2Jsb2Nrc19jb3VudCwgKF9fdTMyIF9fdXNlciAqKWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQllcnIgPSBleHQzX2dyb3VwX2V4dGVuZChzYiwgRVhUM19TQihzYiktPnNfZXMsIG5fYmxvY2tzX2NvdW50KTsKKwkJam91cm5hbF9sb2NrX3VwZGF0ZXMoRVhUM19TQihzYiktPnNfam91cm5hbCk7CisJCWpvdXJuYWxfZmx1c2goRVhUM19TQihzYiktPnNfam91cm5hbCk7CisJCWpvdXJuYWxfdW5sb2NrX3VwZGF0ZXMoRVhUM19TQihzYiktPnNfam91cm5hbCk7CisKKwkJcmV0dXJuIGVycjsKKwl9CisJY2FzZSBFWFQzX0lPQ19HUk9VUF9BREQ6IHsKKwkJc3RydWN0IGV4dDNfbmV3X2dyb3VwX2RhdGEgaW5wdXQ7CisJCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwkJaW50IGVycjsKKworCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19SRVNPVVJDRSkpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCWlmIChJU19SRE9OTFkoaW5vZGUpKQorCQkJcmV0dXJuIC1FUk9GUzsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmlucHV0LCAoc3RydWN0IGV4dDNfbmV3X2dyb3VwX2lucHV0IF9fdXNlciAqKWFyZywKKwkJCQlzaXplb2YoaW5wdXQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWVyciA9IGV4dDNfZ3JvdXBfYWRkKHNiLCAmaW5wdXQpOworCQlqb3VybmFsX2xvY2tfdXBkYXRlcyhFWFQzX1NCKHNiKS0+c19qb3VybmFsKTsKKwkJam91cm5hbF9mbHVzaChFWFQzX1NCKHNiKS0+c19qb3VybmFsKTsKKwkJam91cm5hbF91bmxvY2tfdXBkYXRlcyhFWFQzX1NCKHNiKS0+c19qb3VybmFsKTsKKworCQlyZXR1cm4gZXJyOworCX0KKworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9UVFk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZnMvZXh0My9uYW1laS5jIGIvZnMvZXh0My9uYW1laS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NzQyZDgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQzL25hbWVpLmMKQEAgLTAsMCArMSwyMzc4IEBACisvKgorICogIGxpbnV4L2ZzL2V4dDMvbmFtZWkuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NQorICogUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQorICogTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqCisgKiAgZnJvbQorICoKKyAqICBsaW51eC9mcy9taW5peC9uYW1laS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgQmlnLWVuZGlhbiB0byBsaXR0bGUtZW5kaWFuIGJ5dGUtc3dhcHBpbmcvYml0bWFwcyBieQorICogICAgICAgIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSksIDE5OTUKKyAqICBEaXJlY3RvcnkgZW50cnkgZmlsZSB0eXBlIHN1cHBvcnQgYW5kIGZvcndhcmQgY29tcGF0aWJpbGl0eSBob29rcworICogIAlmb3IgQi10cmVlIGRpcmVjdG9yaWVzIGJ5IFRoZW9kb3JlIFRzJ28gKHR5dHNvQG1pdC5lZHUpLCAxOTk4CisgKiAgSGFzaCBUcmVlIERpcmVjdG9yeSBpbmRleGluZyAoYykKKyAqICAJRGFuaWVsIFBoaWxsaXBzLCAyMDAxCisgKiAgSGFzaCBUcmVlIERpcmVjdG9yeSBpbmRleGluZyBwb3J0aW5nCisgKiAgCUNocmlzdG9waGVyIExpLCAyMDAyCisgKiAgSGFzaCBUcmVlIERpcmVjdG9yeSBpbmRleGluZyBjbGVhbnVwCisgKiAJVGhlb2RvcmUgVHMnbywgMjAwMgorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9qYmQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZXh0M19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDNfamJkLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSAieGF0dHIuaCIKKyNpbmNsdWRlICJhY2wuaCIKKworLyoKKyAqIGRlZmluZSBob3cgZmFyIGFoZWFkIHRvIHJlYWQgZGlyZWN0b3JpZXMgd2hpbGUgc2VhcmNoaW5nIHRoZW0uCisgKi8KKyNkZWZpbmUgTkFNRUlfUkFfQ0hVTktTICAyCisjZGVmaW5lIE5BTUVJX1JBX0JMT0NLUyAgNAorI2RlZmluZSBOQU1FSV9SQV9TSVpFICAgICAgICAoTkFNRUlfUkFfQ0hVTktTICogTkFNRUlfUkFfQkxPQ0tTKQorI2RlZmluZSBOQU1FSV9SQV9JTkRFWChjLGIpICAoKChjKSAqIE5BTUVJX1JBX0JMT0NLUykgKyAoYikpCisKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmV4dDNfYXBwZW5kKGhhbmRsZV90ICpoYW5kbGUsCisJCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCXUzMiAqYmxvY2ssIGludCAqZXJyKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwkqYmxvY2sgPSBpbm9kZS0+aV9zaXplID4+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCisJaWYgKChiaCA9IGV4dDNfYnJlYWQoaGFuZGxlLCBpbm9kZSwgKmJsb2NrLCAxLCBlcnIpKSkgeworCQlpbm9kZS0+aV9zaXplICs9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwkJRVhUM19JKGlub2RlKS0+aV9kaXNrc2l6ZSA9IGlub2RlLT5pX3NpemU7CisJCWV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSxiaCk7CisJfQorCXJldHVybiBiaDsKK30KKworI2lmbmRlZiBhc3NlcnQKKyNkZWZpbmUgYXNzZXJ0KHRlc3QpIEpfQVNTRVJUKHRlc3QpCisjZW5kaWYKKworI2lmbmRlZiBzd2FwCisjZGVmaW5lIHN3YXAoeCwgeSkgZG8geyB0eXBlb2YoeCkgeiA9IHg7IHggPSB5OyB5ID0gejsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWZkZWYgRFhfREVCVUcKKyNkZWZpbmUgZHh0cmFjZShjb21tYW5kKSBjb21tYW5kCisjZWxzZQorI2RlZmluZSBkeHRyYWNlKGNvbW1hbmQpIAorI2VuZGlmCisKK3N0cnVjdCBmYWtlX2RpcmVudAoreworCV9fbGUzMiBpbm9kZTsKKwlfX2xlMTYgcmVjX2xlbjsKKwl1OCBuYW1lX2xlbjsKKwl1OCBmaWxlX3R5cGU7Cit9OworCitzdHJ1Y3QgZHhfY291bnRsaW1pdAoreworCV9fbGUxNiBsaW1pdDsKKwlfX2xlMTYgY291bnQ7Cit9OworCitzdHJ1Y3QgZHhfZW50cnkKK3sKKwlfX2xlMzIgaGFzaDsKKwlfX2xlMzIgYmxvY2s7Cit9OworCisvKgorICogZHhfcm9vdF9pbmZvIGlzIGxhaWQgb3V0IHNvIHRoYXQgaWYgaXQgc2hvdWxkIHNvbWVob3cgZ2V0IG92ZXJsYWlkIGJ5IGEKKyAqIGRpcmVudCB0aGUgdHdvIGxvdyBiaXRzIG9mIHRoZSBoYXNoIHZlcnNpb24gd2lsbCBiZSB6ZXJvLiAgVGhlcmVmb3JlLCB0aGUKKyAqIGhhc2ggdmVyc2lvbiBtb2QgNCBzaG91bGQgbmV2ZXIgYmUgMC4gIFNpbmNlcmVseSwgdGhlIHBhcmFub2lhIGRlcGFydG1lbnQuCisgKi8KKworc3RydWN0IGR4X3Jvb3QKK3sKKwlzdHJ1Y3QgZmFrZV9kaXJlbnQgZG90OworCWNoYXIgZG90X25hbWVbNF07CisJc3RydWN0IGZha2VfZGlyZW50IGRvdGRvdDsKKwljaGFyIGRvdGRvdF9uYW1lWzRdOworCXN0cnVjdCBkeF9yb290X2luZm8KKwl7CisJCV9fbGUzMiByZXNlcnZlZF96ZXJvOworCQl1OCBoYXNoX3ZlcnNpb247CisJCXU4IGluZm9fbGVuZ3RoOyAvKiA4ICovCisJCXU4IGluZGlyZWN0X2xldmVsczsKKwkJdTggdW51c2VkX2ZsYWdzOworCX0KKwlpbmZvOworCXN0cnVjdCBkeF9lbnRyeQllbnRyaWVzWzBdOworfTsKKworc3RydWN0IGR4X25vZGUKK3sKKwlzdHJ1Y3QgZmFrZV9kaXJlbnQgZmFrZTsKKwlzdHJ1Y3QgZHhfZW50cnkJZW50cmllc1swXTsKK307CisKKworc3RydWN0IGR4X2ZyYW1lCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgZHhfZW50cnkgKmVudHJpZXM7CisJc3RydWN0IGR4X2VudHJ5ICphdDsKK307CisKK3N0cnVjdCBkeF9tYXBfZW50cnkKK3sKKwl1MzIgaGFzaDsKKwl1MzIgb2ZmczsKK307CisKKyNpZmRlZiBDT05GSUdfRVhUM19JTkRFWAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBkeF9nZXRfYmxvY2sgKHN0cnVjdCBkeF9lbnRyeSAqZW50cnkpOworc3RhdGljIHZvaWQgZHhfc2V0X2Jsb2NrIChzdHJ1Y3QgZHhfZW50cnkgKmVudHJ5LCB1bnNpZ25lZCB2YWx1ZSk7CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGR4X2dldF9oYXNoIChzdHJ1Y3QgZHhfZW50cnkgKmVudHJ5KTsKK3N0YXRpYyB2b2lkIGR4X3NldF9oYXNoIChzdHJ1Y3QgZHhfZW50cnkgKmVudHJ5LCB1bnNpZ25lZCB2YWx1ZSk7CitzdGF0aWMgdW5zaWduZWQgZHhfZ2V0X2NvdW50IChzdHJ1Y3QgZHhfZW50cnkgKmVudHJpZXMpOworc3RhdGljIHVuc2lnbmVkIGR4X2dldF9saW1pdCAoc3RydWN0IGR4X2VudHJ5ICplbnRyaWVzKTsKK3N0YXRpYyB2b2lkIGR4X3NldF9jb3VudCAoc3RydWN0IGR4X2VudHJ5ICplbnRyaWVzLCB1bnNpZ25lZCB2YWx1ZSk7CitzdGF0aWMgdm9pZCBkeF9zZXRfbGltaXQgKHN0cnVjdCBkeF9lbnRyeSAqZW50cmllcywgdW5zaWduZWQgdmFsdWUpOworc3RhdGljIHVuc2lnbmVkIGR4X3Jvb3RfbGltaXQgKHN0cnVjdCBpbm9kZSAqZGlyLCB1bnNpZ25lZCBpbmZvc2l6ZSk7CitzdGF0aWMgdW5zaWduZWQgZHhfbm9kZV9saW1pdCAoc3RydWN0IGlub2RlICpkaXIpOworc3RhdGljIHN0cnVjdCBkeF9mcmFtZSAqZHhfcHJvYmUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJCSBzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJCQkgc3RydWN0IGR4X2hhc2hfaW5mbyAqaGluZm8sCisJCQkJIHN0cnVjdCBkeF9mcmFtZSAqZnJhbWUsCisJCQkJIGludCAqZXJyKTsKK3N0YXRpYyB2b2lkIGR4X3JlbGVhc2UgKHN0cnVjdCBkeF9mcmFtZSAqZnJhbWVzKTsKK3N0YXRpYyBpbnQgZHhfbWFrZV9tYXAgKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICpkZSwgaW50IHNpemUsCisJCQlzdHJ1Y3QgZHhfaGFzaF9pbmZvICpoaW5mbywgc3RydWN0IGR4X21hcF9lbnRyeSBtYXBbXSk7CitzdGF0aWMgdm9pZCBkeF9zb3J0X21hcChzdHJ1Y3QgZHhfbWFwX2VudHJ5ICptYXAsIHVuc2lnbmVkIGNvdW50KTsKK3N0YXRpYyBzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqZHhfbW92ZV9kaXJlbnRzIChjaGFyICpmcm9tLCBjaGFyICp0bywKKwkJc3RydWN0IGR4X21hcF9lbnRyeSAqb2Zmc2V0cywgaW50IGNvdW50KTsKK3N0YXRpYyBzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiogZHhfcGFja19kaXJlbnRzIChjaGFyICpiYXNlLCBpbnQgc2l6ZSk7CitzdGF0aWMgdm9pZCBkeF9pbnNlcnRfYmxvY2sgKHN0cnVjdCBkeF9mcmFtZSAqZnJhbWUsIHUzMiBoYXNoLCB1MzIgYmxvY2spOworc3RhdGljIGludCBleHQzX2h0cmVlX25leHRfYmxvY2soc3RydWN0IGlub2RlICpkaXIsIF9fdTMyIGhhc2gsCisJCQkJIHN0cnVjdCBkeF9mcmFtZSAqZnJhbWUsCisJCQkJIHN0cnVjdCBkeF9mcmFtZSAqZnJhbWVzLCAKKwkJCQkgX191MzIgKnN0YXJ0X2hhc2gpOworc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqIGV4dDNfZHhfZmluZF9lbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCSAgICAgICBzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKnJlc19kaXIsIGludCAqZXJyKTsKK3N0YXRpYyBpbnQgZXh0M19keF9hZGRfZW50cnkoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKKworLyoKKyAqIEZ1dHVyZTogdXNlIGhpZ2ggZm91ciBiaXRzIG9mIGJsb2NrIGZvciBjb2FsZXNjZS1vbi1kZWxldGUgZmxhZ3MKKyAqIE1hc2sgdGhlbSBvZmYgZm9yIG5vdy4KKyAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGR4X2dldF9ibG9jayAoc3RydWN0IGR4X2VudHJ5ICplbnRyeSkKK3sKKwlyZXR1cm4gbGUzMl90b19jcHUoZW50cnktPmJsb2NrKSAmIDB4MDBmZmZmZmY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkeF9zZXRfYmxvY2sgKHN0cnVjdCBkeF9lbnRyeSAqZW50cnksIHVuc2lnbmVkIHZhbHVlKQoreworCWVudHJ5LT5ibG9jayA9IGNwdV90b19sZTMyKHZhbHVlKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBkeF9nZXRfaGFzaCAoc3RydWN0IGR4X2VudHJ5ICplbnRyeSkKK3sKKwlyZXR1cm4gbGUzMl90b19jcHUoZW50cnktPmhhc2gpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHhfc2V0X2hhc2ggKHN0cnVjdCBkeF9lbnRyeSAqZW50cnksIHVuc2lnbmVkIHZhbHVlKQoreworCWVudHJ5LT5oYXNoID0gY3B1X3RvX2xlMzIodmFsdWUpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGR4X2dldF9jb3VudCAoc3RydWN0IGR4X2VudHJ5ICplbnRyaWVzKQoreworCXJldHVybiBsZTE2X3RvX2NwdSgoKHN0cnVjdCBkeF9jb3VudGxpbWl0ICopIGVudHJpZXMpLT5jb3VudCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZHhfZ2V0X2xpbWl0IChzdHJ1Y3QgZHhfZW50cnkgKmVudHJpZXMpCit7CisJcmV0dXJuIGxlMTZfdG9fY3B1KCgoc3RydWN0IGR4X2NvdW50bGltaXQgKikgZW50cmllcyktPmxpbWl0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGR4X3NldF9jb3VudCAoc3RydWN0IGR4X2VudHJ5ICplbnRyaWVzLCB1bnNpZ25lZCB2YWx1ZSkKK3sKKwkoKHN0cnVjdCBkeF9jb3VudGxpbWl0ICopIGVudHJpZXMpLT5jb3VudCA9IGNwdV90b19sZTE2KHZhbHVlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGR4X3NldF9saW1pdCAoc3RydWN0IGR4X2VudHJ5ICplbnRyaWVzLCB1bnNpZ25lZCB2YWx1ZSkKK3sKKwkoKHN0cnVjdCBkeF9jb3VudGxpbWl0ICopIGVudHJpZXMpLT5saW1pdCA9IGNwdV90b19sZTE2KHZhbHVlKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBkeF9yb290X2xpbWl0IChzdHJ1Y3QgaW5vZGUgKmRpciwgdW5zaWduZWQgaW5mb3NpemUpCit7CisJdW5zaWduZWQgZW50cnlfc3BhY2UgPSBkaXItPmlfc2ItPnNfYmxvY2tzaXplIC0gRVhUM19ESVJfUkVDX0xFTigxKSAtCisJCUVYVDNfRElSX1JFQ19MRU4oMikgLSBpbmZvc2l6ZTsKKwlyZXR1cm4gMD8gMjA6IGVudHJ5X3NwYWNlIC8gc2l6ZW9mKHN0cnVjdCBkeF9lbnRyeSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZHhfbm9kZV9saW1pdCAoc3RydWN0IGlub2RlICpkaXIpCit7CisJdW5zaWduZWQgZW50cnlfc3BhY2UgPSBkaXItPmlfc2ItPnNfYmxvY2tzaXplIC0gRVhUM19ESVJfUkVDX0xFTigwKTsKKwlyZXR1cm4gMD8gMjI6IGVudHJ5X3NwYWNlIC8gc2l6ZW9mKHN0cnVjdCBkeF9lbnRyeSk7Cit9CisKKy8qCisgKiBEZWJ1ZworICovCisjaWZkZWYgRFhfREVCVUcKK3N0YXRpYyB2b2lkIGR4X3Nob3dfaW5kZXggKGNoYXIgKiBsYWJlbCwgc3RydWN0IGR4X2VudHJ5ICplbnRyaWVzKQoreworICAgICAgICBpbnQgaSwgbiA9IGR4X2dldF9jb3VudCAoZW50cmllcyk7CisgICAgICAgIHByaW50aygiJXMgaW5kZXggIiwgbGFiZWwpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJpbnRrKCIleC0+JXUgIiwgaT8gZHhfZ2V0X2hhc2goZW50cmllcyArIGkpOiAwLCBkeF9nZXRfYmxvY2soZW50cmllcyArIGkpKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGsoIlxuIik7Cit9CisKK3N0cnVjdCBzdGF0cworeyAKKwl1bnNpZ25lZCBuYW1lczsKKwl1bnNpZ25lZCBzcGFjZTsKKwl1bnNpZ25lZCBiY291bnQ7Cit9OworCitzdGF0aWMgc3RydWN0IHN0YXRzIGR4X3Nob3dfbGVhZihzdHJ1Y3QgZHhfaGFzaF9pbmZvICpoaW5mbywgc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKmRlLAorCQkJCSBpbnQgc2l6ZSwgaW50IHNob3dfbmFtZXMpCit7CisJdW5zaWduZWQgbmFtZXMgPSAwLCBzcGFjZSA9IDA7CisJY2hhciAqYmFzZSA9IChjaGFyICopIGRlOworCXN0cnVjdCBkeF9oYXNoX2luZm8gaCA9ICpoaW5mbzsKKworCXByaW50aygibmFtZXM6ICIpOworCXdoaWxlICgoY2hhciAqKSBkZSA8IGJhc2UgKyBzaXplKQorCXsKKwkJaWYgKGRlLT5pbm9kZSkKKwkJeworCQkJaWYgKHNob3dfbmFtZXMpCisJCQl7CisJCQkJaW50IGxlbiA9IGRlLT5uYW1lX2xlbjsKKwkJCQljaGFyICpuYW1lID0gZGUtPm5hbWU7CisJCQkJd2hpbGUgKGxlbi0tKSBwcmludGsoIiVjIiwgKm5hbWUrKyk7CisJCQkJZXh0M2ZzX2Rpcmhhc2goZGUtPm5hbWUsIGRlLT5uYW1lX2xlbiwgJmgpOworCQkJCXByaW50aygiOiV4LiV1ICIsIGguaGFzaCwKKwkJCQkgICAgICAgKChjaGFyICopIGRlIC0gYmFzZSkpOworCQkJfQorCQkJc3BhY2UgKz0gRVhUM19ESVJfUkVDX0xFTihkZS0+bmFtZV9sZW4pOworCSAJCW5hbWVzKys7CisJCX0KKwkJZGUgPSAoc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKikgKChjaGFyICopIGRlICsgbGUxNl90b19jcHUoZGUtPnJlY19sZW4pKTsKKwl9CisJcHJpbnRrKCIoJWkpXG4iLCBuYW1lcyk7CisJcmV0dXJuIChzdHJ1Y3Qgc3RhdHMpIHsgbmFtZXMsIHNwYWNlLCAxIH07Cit9CisKK3N0cnVjdCBzdGF0cyBkeF9zaG93X2VudHJpZXMoc3RydWN0IGR4X2hhc2hfaW5mbyAqaGluZm8sIHN0cnVjdCBpbm9kZSAqZGlyLAorCQkJICAgICBzdHJ1Y3QgZHhfZW50cnkgKmVudHJpZXMsIGludCBsZXZlbHMpCit7CisJdW5zaWduZWQgYmxvY2tzaXplID0gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwl1bnNpZ25lZCBjb3VudCA9IGR4X2dldF9jb3VudCAoZW50cmllcyksIG5hbWVzID0gMCwgc3BhY2UgPSAwLCBpOworCXVuc2lnbmVkIGJjb3VudCA9IDA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlpbnQgZXJyOworCXByaW50aygiJWkgaW5kZXhlZCBibG9ja3MuLi5cbiIsIGNvdW50KTsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgZW50cmllcysrKQorCXsKKwkJdTMyIGJsb2NrID0gZHhfZ2V0X2Jsb2NrKGVudHJpZXMpLCBoYXNoID0gaT8gZHhfZ2V0X2hhc2goZW50cmllcyk6IDA7CisJCXUzMiByYW5nZSA9IGkgPCBjb3VudCAtIDE/IChkeF9nZXRfaGFzaChlbnRyaWVzICsgMSkgLSBoYXNoKTogfmhhc2g7CisJCXN0cnVjdCBzdGF0cyBzdGF0czsKKwkJcHJpbnRrKCIlcyUzdTolMDN1IGhhc2ggJTh4LyU4eCAiLGxldmVscz8iIjoiICAgIiwgaSwgYmxvY2ssIGhhc2gsIHJhbmdlKTsKKwkJaWYgKCEoYmggPSBleHQzX2JyZWFkIChOVUxMLGRpciwgYmxvY2ssIDAsJmVycikpKSBjb250aW51ZTsKKwkJc3RhdHMgPSBsZXZlbHM/CisJCSAgIGR4X3Nob3dfZW50cmllcyhoaW5mbywgZGlyLCAoKHN0cnVjdCBkeF9ub2RlICopIGJoLT5iX2RhdGEpLT5lbnRyaWVzLCBsZXZlbHMgLSAxKToKKwkJICAgZHhfc2hvd19sZWFmKGhpbmZvLCAoc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKikgYmgtPmJfZGF0YSwgYmxvY2tzaXplLCAwKTsKKwkJbmFtZXMgKz0gc3RhdHMubmFtZXM7CisJCXNwYWNlICs9IHN0YXRzLnNwYWNlOworCQliY291bnQgKz0gc3RhdHMuYmNvdW50OworCQlicmVsc2UgKGJoKTsKKwl9CisJaWYgKGJjb3VudCkKKwkJcHJpbnRrKCIlc25hbWVzICV1LCBmdWxsbmVzcyAldSAoJXUlJSlcbiIsIGxldmVscz8iIjoiICAgIiwKKwkJCW5hbWVzLCBzcGFjZS9iY291bnQsKHNwYWNlL2Jjb3VudCkqMTAwL2Jsb2Nrc2l6ZSk7CisJcmV0dXJuIChzdHJ1Y3Qgc3RhdHMpIHsgbmFtZXMsIHNwYWNlLCBiY291bnR9OworfQorI2VuZGlmIC8qIERYX0RFQlVHICovCisKKy8qCisgKiBQcm9iZSBmb3IgYSBkaXJlY3RvcnkgbGVhZiBibG9jayB0byBzZWFyY2guCisgKgorICogZHhfcHJvYmUgY2FuIHJldHVybiBFUlJfQkFEX0RYX0RJUiwgd2hpY2ggbWVhbnMgdGhlcmUgd2FzIGEgZm9ybWF0CisgKiBlcnJvciBpbiB0aGUgZGlyZWN0b3J5IGluZGV4LCBhbmQgdGhlIGNhbGxlciBzaG91bGQgZmFsbCBiYWNrIHRvCisgKiBzZWFyY2hpbmcgdGhlIGRpcmVjdG9yeSBub3JtYWxseS4gIFRoZSBjYWxsZXJzIG9mIGR4X3Byb2JlICoqTVVTVCoqCisgKiBjaGVjayBmb3IgdGhpcyBlcnJvciBjb2RlLCBhbmQgbWFrZSBzdXJlIGl0IG5ldmVyIGdldHMgcmVmbGVjdGVkCisgKiBiYWNrIHRvIHVzZXJzcGFjZS4KKyAqLworc3RhdGljIHN0cnVjdCBkeF9mcmFtZSAqCitkeF9wcm9iZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqZGlyLAorCSBzdHJ1Y3QgZHhfaGFzaF9pbmZvICpoaW5mbywgc3RydWN0IGR4X2ZyYW1lICpmcmFtZV9pbiwgaW50ICplcnIpCit7CisJdW5zaWduZWQgY291bnQsIGluZGlyZWN0OworCXN0cnVjdCBkeF9lbnRyeSAqYXQsICplbnRyaWVzLCAqcCwgKnEsICptOworCXN0cnVjdCBkeF9yb290ICpyb290OworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGR4X2ZyYW1lICpmcmFtZSA9IGZyYW1lX2luOworCXUzMiBoYXNoOworCisJZnJhbWUtPmJoID0gTlVMTDsKKwlpZiAoZGVudHJ5KQorCQlkaXIgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOworCWlmICghKGJoID0gZXh0M19icmVhZCAoTlVMTCxkaXIsIDAsIDAsIGVycikpKQorCQlnb3RvIGZhaWw7CisJcm9vdCA9IChzdHJ1Y3QgZHhfcm9vdCAqKSBiaC0+Yl9kYXRhOworCWlmIChyb290LT5pbmZvLmhhc2hfdmVyc2lvbiAhPSBEWF9IQVNIX1RFQSAmJgorCSAgICByb290LT5pbmZvLmhhc2hfdmVyc2lvbiAhPSBEWF9IQVNIX0hBTEZfTUQ0ICYmCisJICAgIHJvb3QtPmluZm8uaGFzaF92ZXJzaW9uICE9IERYX0hBU0hfTEVHQUNZKSB7CisJCWV4dDNfd2FybmluZyhkaXItPmlfc2IsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgIlVucmVjb2duaXNlZCBpbm9kZSBoYXNoIGNvZGUgJWQiLAorCQkJICAgICByb290LT5pbmZvLmhhc2hfdmVyc2lvbik7CisJCWJyZWxzZShiaCk7CisJCSplcnIgPSBFUlJfQkFEX0RYX0RJUjsKKwkJZ290byBmYWlsOworCX0KKwloaW5mby0+aGFzaF92ZXJzaW9uID0gcm9vdC0+aW5mby5oYXNoX3ZlcnNpb247CisJaGluZm8tPnNlZWQgPSBFWFQzX1NCKGRpci0+aV9zYiktPnNfaGFzaF9zZWVkOworCWlmIChkZW50cnkpCisJCWV4dDNmc19kaXJoYXNoKGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLmxlbiwgaGluZm8pOworCWhhc2ggPSBoaW5mby0+aGFzaDsKKworCWlmIChyb290LT5pbmZvLnVudXNlZF9mbGFncyAmIDEpIHsKKwkJZXh0M193YXJuaW5nKGRpci0+aV9zYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAiVW5pbXBsZW1lbnRlZCBpbm9kZSBoYXNoIGZsYWdzOiAlIzA2eCIsCisJCQkgICAgIHJvb3QtPmluZm8udW51c2VkX2ZsYWdzKTsKKwkJYnJlbHNlKGJoKTsKKwkJKmVyciA9IEVSUl9CQURfRFhfRElSOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKChpbmRpcmVjdCA9IHJvb3QtPmluZm8uaW5kaXJlY3RfbGV2ZWxzKSA+IDEpIHsKKwkJZXh0M193YXJuaW5nKGRpci0+aV9zYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAiVW5pbXBsZW1lbnRlZCBpbm9kZSBoYXNoIGRlcHRoOiAlIzA2eCIsCisJCQkgICAgIHJvb3QtPmluZm8uaW5kaXJlY3RfbGV2ZWxzKTsKKwkJYnJlbHNlKGJoKTsKKwkJKmVyciA9IEVSUl9CQURfRFhfRElSOworCQlnb3RvIGZhaWw7CisJfQorCisJZW50cmllcyA9IChzdHJ1Y3QgZHhfZW50cnkgKikgKCgoY2hhciAqKSZyb290LT5pbmZvKSArCisJCQkJICAgICAgIHJvb3QtPmluZm8uaW5mb19sZW5ndGgpOworCWFzc2VydChkeF9nZXRfbGltaXQoZW50cmllcykgPT0gZHhfcm9vdF9saW1pdChkaXIsCisJCQkJCQkgICAgICByb290LT5pbmZvLmluZm9fbGVuZ3RoKSk7CisJZHh0cmFjZSAocHJpbnRrKCJMb29rIHVwICV4IiwgaGFzaCkpOworCXdoaWxlICgxKQorCXsKKwkJY291bnQgPSBkeF9nZXRfY291bnQoZW50cmllcyk7CisJCWFzc2VydCAoY291bnQgJiYgY291bnQgPD0gZHhfZ2V0X2xpbWl0KGVudHJpZXMpKTsKKwkJcCA9IGVudHJpZXMgKyAxOworCQlxID0gZW50cmllcyArIGNvdW50IC0gMTsKKwkJd2hpbGUgKHAgPD0gcSkKKwkJeworCQkJbSA9IHAgKyAocSAtIHApLzI7CisJCQlkeHRyYWNlKHByaW50aygiLiIpKTsKKwkJCWlmIChkeF9nZXRfaGFzaChtKSA+IGhhc2gpCisJCQkJcSA9IG0gLSAxOworCQkJZWxzZQorCQkJCXAgPSBtICsgMTsKKwkJfQorCisJCWlmICgwKSAvLyBsaW5lYXIgc2VhcmNoIGNyb3NzIGNoZWNrCisJCXsKKwkJCXVuc2lnbmVkIG4gPSBjb3VudCAtIDE7CisJCQlhdCA9IGVudHJpZXM7CisJCQl3aGlsZSAobi0tKQorCQkJeworCQkJCWR4dHJhY2UocHJpbnRrKCIsIikpOworCQkJCWlmIChkeF9nZXRfaGFzaCgrK2F0KSA+IGhhc2gpCisJCQkJeworCQkJCQlhdC0tOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlhc3NlcnQgKGF0ID09IHAgLSAxKTsKKwkJfQorCisJCWF0ID0gcCAtIDE7CisJCWR4dHJhY2UocHJpbnRrKCIgJXgtPiV1XG4iLCBhdCA9PSBlbnRyaWVzPyAwOiBkeF9nZXRfaGFzaChhdCksIGR4X2dldF9ibG9jayhhdCkpKTsKKwkJZnJhbWUtPmJoID0gYmg7CisJCWZyYW1lLT5lbnRyaWVzID0gZW50cmllczsKKwkJZnJhbWUtPmF0ID0gYXQ7CisJCWlmICghaW5kaXJlY3QtLSkgcmV0dXJuIGZyYW1lOworCQlpZiAoIShiaCA9IGV4dDNfYnJlYWQgKE5VTEwsZGlyLCBkeF9nZXRfYmxvY2soYXQpLCAwLCBlcnIpKSkKKwkJCWdvdG8gZmFpbDI7CisJCWF0ID0gZW50cmllcyA9ICgoc3RydWN0IGR4X25vZGUgKikgYmgtPmJfZGF0YSktPmVudHJpZXM7CisJCWFzc2VydCAoZHhfZ2V0X2xpbWl0KGVudHJpZXMpID09IGR4X25vZGVfbGltaXQgKGRpcikpOworCQlmcmFtZSsrOworCX0KK2ZhaWwyOgorCXdoaWxlIChmcmFtZSA+PSBmcmFtZV9pbikgeworCQlicmVsc2UoZnJhbWUtPmJoKTsKKwkJZnJhbWUtLTsKKwl9CitmYWlsOgorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBkeF9yZWxlYXNlIChzdHJ1Y3QgZHhfZnJhbWUgKmZyYW1lcykKK3sKKwlpZiAoZnJhbWVzWzBdLmJoID09IE5VTEwpCisJCXJldHVybjsKKworCWlmICgoKHN0cnVjdCBkeF9yb290ICopIGZyYW1lc1swXS5iaC0+Yl9kYXRhKS0+aW5mby5pbmRpcmVjdF9sZXZlbHMpCisJCWJyZWxzZShmcmFtZXNbMV0uYmgpOworCWJyZWxzZShmcmFtZXNbMF0uYmgpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpbmNyZW1lbnRzIHRoZSBmcmFtZSBwb2ludGVyIHRvIHNlYXJjaCB0aGUgbmV4dCBsZWFmCisgKiBibG9jaywgYW5kIHJlYWRzIGluIHRoZSBuZWNlc3NhcnkgaW50ZXJ2ZW5pbmcgbm9kZXMgaWYgdGhlIHNlYXJjaAorICogc2hvdWxkIGJlIG5lY2Vzc2FyeS4gIFdoZXRoZXIgb3Igbm90IHRoZSBzZWFyY2ggaXMgbmVjZXNzYXJ5IGlzCisgKiBjb250cm9sbGVkIGJ5IHRoZSBoYXNoIHBhcmFtZXRlci4gIElmIHRoZSBoYXNoIHZhbHVlIGlzIGV2ZW4sIHRoZW4KKyAqIHRoZSBzZWFyY2ggaXMgb25seSBjb250aW51ZWQgaWYgdGhlIG5leHQgYmxvY2sgc3RhcnRzIHdpdGggdGhhdAorICogaGFzaCB2YWx1ZS4gIFRoaXMgaXMgdXNlZCBpZiB3ZSBhcmUgc2VhcmNoaW5nIGZvciBhIHNwZWNpZmljIGZpbGUuCisgKgorICogSWYgdGhlIGhhc2ggdmFsdWUgaXMgSEFTSF9OQl9BTFdBWVMsIHRoZW4gYWx3YXlzIGdvIHRvIHRoZSBuZXh0IGJsb2NrLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAxIGlmIHRoZSBjYWxsZXIgc2hvdWxkIGNvbnRpbnVlIHRvIHNlYXJjaCwKKyAqIG9yIDAgaWYgaXQgc2hvdWxkIG5vdC4gIElmIHRoZXJlIGlzIGFuIGVycm9yIHJlYWRpbmcgb25lIG9mIHRoZQorICogaW5kZXggYmxvY2tzLCBpdCB3aWxsIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqCisgKiBJZiBzdGFydF9oYXNoIGlzIG5vbi1udWxsLCBpdCB3aWxsIGJlIGZpbGxlZCBpbiB3aXRoIHRoZSBzdGFydGluZworICogaGFzaCBvZiB0aGUgbmV4dCBwYWdlLgorICovCitzdGF0aWMgaW50IGV4dDNfaHRyZWVfbmV4dF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmRpciwgX191MzIgaGFzaCwKKwkJCQkgc3RydWN0IGR4X2ZyYW1lICpmcmFtZSwKKwkJCQkgc3RydWN0IGR4X2ZyYW1lICpmcmFtZXMsIAorCQkJCSBfX3UzMiAqc3RhcnRfaGFzaCkKK3sKKwlzdHJ1Y3QgZHhfZnJhbWUgKnA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlpbnQgZXJyLCBudW1fZnJhbWVzID0gMDsKKwlfX3UzMiBiaGFzaDsKKworCXAgPSBmcmFtZTsKKwkvKgorCSAqIEZpbmQgdGhlIG5leHQgbGVhZiBwYWdlIGJ5IGluY3JlbWVudGluZyB0aGUgZnJhbWUgcG9pbnRlci4KKwkgKiBJZiB3ZSBydW4gb3V0IG9mIGVudHJpZXMgaW4gdGhlIGludGVyaW9yIG5vZGUsIGxvb3AgYXJvdW5kIGFuZAorCSAqIGluY3JlbWVudCBwb2ludGVyIGluIHRoZSBwYXJlbnQgbm9kZS4gIFdoZW4gd2UgYnJlYWsgb3V0IG9mCisJICogdGhpcyBsb29wLCBudW1fZnJhbWVzIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGludGVyaW9yCisJICogbm9kZXMgbmVlZCB0byBiZSByZWFkLgorCSAqLworCXdoaWxlICgxKSB7CisJCWlmICgrKyhwLT5hdCkgPCBwLT5lbnRyaWVzICsgZHhfZ2V0X2NvdW50KHAtPmVudHJpZXMpKQorCQkJYnJlYWs7CisJCWlmIChwID09IGZyYW1lcykKKwkJCXJldHVybiAwOworCQludW1fZnJhbWVzKys7CisJCXAtLTsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBoYXNoIGlzIDEsIHRoZW4gY29udGludWUgb25seSBpZiB0aGUgbmV4dCBwYWdlIGhhcyBhCisJICogY29udGludWF0aW9uIGhhc2ggb2YgYW55IHZhbHVlLiAgVGhpcyBpcyB1c2VkIGZvciByZWFkZGlyCisJICogaGFuZGxpbmcuICBPdGhlcndpc2UsIGNoZWNrIHRvIHNlZSBpZiB0aGUgaGFzaCBtYXRjaGVzIHRoZQorCSAqIGRlc2lyZWQgY29udGl1YXRpb24gaGFzaC4gIElmIGl0IGRvZXNuJ3QsIHJldHVybiBzaW5jZQorCSAqIHRoZXJlJ3Mgbm8gcG9pbnQgdG8gcmVhZCBpbiB0aGUgc3VjY2Vzc2l2ZSBpbmRleCBwYWdlcy4KKwkgKi8KKwliaGFzaCA9IGR4X2dldF9oYXNoKHAtPmF0KTsKKwlpZiAoc3RhcnRfaGFzaCkKKwkJKnN0YXJ0X2hhc2ggPSBiaGFzaDsKKwlpZiAoKGhhc2ggJiAxKSA9PSAwKSB7CisJCWlmICgoYmhhc2ggJiB+MSkgIT0gaGFzaCkKKwkJCXJldHVybiAwOworCX0KKwkvKgorCSAqIElmIHRoZSBoYXNoIGlzIEhBU0hfTkJfQUxXQVlTLCB3ZSBhbHdheXMgZ28gdG8gdGhlIG5leHQKKwkgKiBibG9jayBzbyBubyBjaGVjayBpcyBuZWNlc3NhcnkKKwkgKi8KKwl3aGlsZSAobnVtX2ZyYW1lcy0tKSB7CisJCWlmICghKGJoID0gZXh0M19icmVhZChOVUxMLCBkaXIsIGR4X2dldF9ibG9jayhwLT5hdCksCisJCQkJICAgICAgMCwgJmVycikpKQorCQkJcmV0dXJuIGVycjsgLyogRmFpbHVyZSAqLworCQlwKys7CisJCWJyZWxzZSAocC0+YmgpOworCQlwLT5iaCA9IGJoOworCQlwLT5hdCA9IHAtPmVudHJpZXMgPSAoKHN0cnVjdCBkeF9ub2RlICopIGJoLT5iX2RhdGEpLT5lbnRyaWVzOworCX0KKwlyZXR1cm4gMTsKK30KKworCisvKgorICogcCBpcyBhdCBsZWFzdCA2IGJ5dGVzIGJlZm9yZSB0aGUgZW5kIG9mIHBhZ2UKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqZXh0M19uZXh0X2VudHJ5KHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICpwKQoreworCXJldHVybiAoc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKikoKGNoYXIqKXAgKyBsZTE2X3RvX2NwdShwLT5yZWNfbGVuKSk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGZpbGxzIGEgcmVkLWJsYWNrIHRyZWUgd2l0aCBpbmZvcm1hdGlvbiBmcm9tIGEKKyAqIGRpcmVjdG9yeSBibG9jay4gIEl0IHJldHVybnMgdGhlIG51bWJlciBkaXJlY3RvcnkgZW50cmllcyBsb2FkZWQKKyAqIGludG8gdGhlIHRyZWUuICBJZiB0aGVyZSBpcyBhbiBlcnJvciBpdCBpcyByZXR1cm5lZCBpbiBlcnIuCisgKi8KK3N0YXRpYyBpbnQgaHRyZWVfZGlyYmxvY2tfdG9fdHJlZShzdHJ1Y3QgZmlsZSAqZGlyX2ZpbGUsCisJCQkJICBzdHJ1Y3QgaW5vZGUgKmRpciwgaW50IGJsb2NrLAorCQkJCSAgc3RydWN0IGR4X2hhc2hfaW5mbyAqaGluZm8sCisJCQkJICBfX3UzMiBzdGFydF9oYXNoLCBfX3UzMiBzdGFydF9taW5vcl9oYXNoKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKmRlLCAqdG9wOworCWludCBlcnIsIGNvdW50ID0gMDsKKworCWR4dHJhY2UocHJpbnRrKCJJbiBodHJlZSBkaXJibG9ja190b190cmVlOiBibG9jayAlZFxuIiwgYmxvY2spKTsKKwlpZiAoIShiaCA9IGV4dDNfYnJlYWQgKE5VTEwsIGRpciwgYmxvY2ssIDAsICZlcnIpKSkKKwkJcmV0dXJuIGVycjsKKworCWRlID0gKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICopIGJoLT5iX2RhdGE7CisJdG9wID0gKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICopICgoY2hhciAqKSBkZSArCisJCQkJCSAgIGRpci0+aV9zYi0+c19ibG9ja3NpemUgLQorCQkJCQkgICBFWFQzX0RJUl9SRUNfTEVOKDApKTsKKwlmb3IgKDsgZGUgPCB0b3A7IGRlID0gZXh0M19uZXh0X2VudHJ5KGRlKSkgeworCQlleHQzZnNfZGlyaGFzaChkZS0+bmFtZSwgZGUtPm5hbWVfbGVuLCBoaW5mbyk7CisJCWlmICgoaGluZm8tPmhhc2ggPCBzdGFydF9oYXNoKSB8fAorCQkgICAgKChoaW5mby0+aGFzaCA9PSBzdGFydF9oYXNoKSAmJgorCQkgICAgIChoaW5mby0+bWlub3JfaGFzaCA8IHN0YXJ0X21pbm9yX2hhc2gpKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoZGUtPmlub2RlID09IDApCisJCQljb250aW51ZTsKKwkJaWYgKChlcnIgPSBleHQzX2h0cmVlX3N0b3JlX2RpcmVudChkaXJfZmlsZSwKKwkJCQkgICBoaW5mby0+aGFzaCwgaGluZm8tPm1pbm9yX2hhc2gsIGRlKSkgIT0gMCkgeworCQkJYnJlbHNlKGJoKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJY291bnQrKzsKKwl9CisJYnJlbHNlKGJoKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZmlsbHMgYSByZWQtYmxhY2sgdHJlZSB3aXRoIGluZm9ybWF0aW9uIGZyb20gYQorICogZGlyZWN0b3J5LiAgV2Ugc3RhcnQgc2Nhbm5pbmcgdGhlIGRpcmVjdG9yeSBpbiBoYXNoIG9yZGVyLCBzdGFydGluZworICogYXQgc3RhcnRfaGFzaCBhbmQgc3RhcnRfbWlub3JfaGFzaC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluc2VydGVkIGludG8gdGhlIHRyZWUsCisgKiBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKi8KK2ludCBleHQzX2h0cmVlX2ZpbGxfdHJlZShzdHJ1Y3QgZmlsZSAqZGlyX2ZpbGUsIF9fdTMyIHN0YXJ0X2hhc2gsCisJCQkgX191MzIgc3RhcnRfbWlub3JfaGFzaCwgX191MzIgKm5leHRfaGFzaCkKK3sKKwlzdHJ1Y3QgZHhfaGFzaF9pbmZvIGhpbmZvOworCXN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICpkZTsKKwlzdHJ1Y3QgZHhfZnJhbWUgZnJhbWVzWzJdLCAqZnJhbWU7CisJc3RydWN0IGlub2RlICpkaXI7CisJaW50IGJsb2NrLCBlcnI7CisJaW50IGNvdW50ID0gMDsKKwlpbnQgcmV0OworCV9fdTMyIGhhc2h2YWw7CisKKwlkeHRyYWNlKHByaW50aygiSW4gaHRyZWVfZmlsbF90cmVlLCBzdGFydCBoYXNoOiAleDoleFxuIiwgc3RhcnRfaGFzaCwKKwkJICAgICAgIHN0YXJ0X21pbm9yX2hhc2gpKTsKKwlkaXIgPSBkaXJfZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJaWYgKCEoRVhUM19JKGRpciktPmlfZmxhZ3MgJiBFWFQzX0lOREVYX0ZMKSkgeworCQloaW5mby5oYXNoX3ZlcnNpb24gPSBFWFQzX1NCKGRpci0+aV9zYiktPnNfZGVmX2hhc2hfdmVyc2lvbjsKKwkJaGluZm8uc2VlZCA9IEVYVDNfU0IoZGlyLT5pX3NiKS0+c19oYXNoX3NlZWQ7CisJCWNvdW50ID0gaHRyZWVfZGlyYmxvY2tfdG9fdHJlZShkaXJfZmlsZSwgZGlyLCAwLCAmaGluZm8sCisJCQkJCSAgICAgICBzdGFydF9oYXNoLCBzdGFydF9taW5vcl9oYXNoKTsKKwkJKm5leHRfaGFzaCA9IH4wOworCQlyZXR1cm4gY291bnQ7CisJfQorCWhpbmZvLmhhc2ggPSBzdGFydF9oYXNoOworCWhpbmZvLm1pbm9yX2hhc2ggPSAwOworCWZyYW1lID0gZHhfcHJvYmUoTlVMTCwgZGlyX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLCAmaGluZm8sIGZyYW1lcywgJmVycik7CisJaWYgKCFmcmFtZSkKKwkJcmV0dXJuIGVycjsKKworCS8qIEFkZCAnLicgYW5kICcuLicgZnJvbSB0aGUgaHRyZWUgaGVhZGVyICovCisJaWYgKCFzdGFydF9oYXNoICYmICFzdGFydF9taW5vcl9oYXNoKSB7CisJCWRlID0gKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICopIGZyYW1lc1swXS5iaC0+Yl9kYXRhOworCQlpZiAoKGVyciA9IGV4dDNfaHRyZWVfc3RvcmVfZGlyZW50KGRpcl9maWxlLCAwLCAwLCBkZSkpICE9IDApCisJCQlnb3RvIGVycm91dDsKKwkJY291bnQrKzsKKwl9CisJaWYgKHN0YXJ0X2hhc2ggPCAyIHx8IChzdGFydF9oYXNoID09MiAmJiBzdGFydF9taW5vcl9oYXNoPT0wKSkgeworCQlkZSA9IChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSBmcmFtZXNbMF0uYmgtPmJfZGF0YTsKKwkJZGUgPSBleHQzX25leHRfZW50cnkoZGUpOworCQlpZiAoKGVyciA9IGV4dDNfaHRyZWVfc3RvcmVfZGlyZW50KGRpcl9maWxlLCAyLCAwLCBkZSkpICE9IDApCisJCQlnb3RvIGVycm91dDsKKwkJY291bnQrKzsKKwl9CisKKwl3aGlsZSAoMSkgeworCQlibG9jayA9IGR4X2dldF9ibG9jayhmcmFtZS0+YXQpOworCQlyZXQgPSBodHJlZV9kaXJibG9ja190b190cmVlKGRpcl9maWxlLCBkaXIsIGJsb2NrLCAmaGluZm8sCisJCQkJCSAgICAgc3RhcnRfaGFzaCwgc3RhcnRfbWlub3JfaGFzaCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQllcnIgPSByZXQ7CisJCQlnb3RvIGVycm91dDsKKwkJfQorCQljb3VudCArPSByZXQ7CisJCWhhc2h2YWwgPSB+MDsKKwkJcmV0ID0gZXh0M19odHJlZV9uZXh0X2Jsb2NrKGRpciwgSEFTSF9OQl9BTFdBWVMsIAorCQkJCQkgICAgZnJhbWUsIGZyYW1lcywgJmhhc2h2YWwpOworCQkqbmV4dF9oYXNoID0gaGFzaHZhbDsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWVyciA9IHJldDsKKwkJCWdvdG8gZXJyb3V0OworCQl9CisJCS8qCisJCSAqIFN0b3AgaWY6ICAoYSkgdGhlcmUgYXJlIG5vIG1vcmUgZW50cmllcywgb3IKKwkJICogKGIpIHdlIGhhdmUgaW5zZXJ0ZWQgYXQgbGVhc3Qgb25lIGVudHJ5IGFuZCB0aGUKKwkJICogbmV4dCBoYXNoIHZhbHVlIGlzIG5vdCBhIGNvbnRpbnVhdGlvbgorCQkgKi8KKwkJaWYgKChyZXQgPT0gMCkgfHwKKwkJICAgIChjb3VudCAmJiAoKGhhc2h2YWwgJiAxKSA9PSAwKSkpCisJCQlicmVhazsKKwl9CisJZHhfcmVsZWFzZShmcmFtZXMpOworCWR4dHJhY2UocHJpbnRrKCJGaWxsIHRyZWU6IHJldHVybmVkICVkIGVudHJpZXMsIG5leHQgaGFzaDogJXhcbiIsIAorCQkgICAgICAgY291bnQsICpuZXh0X2hhc2gpKTsKKwlyZXR1cm4gY291bnQ7CitlcnJvdXQ6CisJZHhfcmVsZWFzZShmcmFtZXMpOworCXJldHVybiAoZXJyKTsKK30KKworCisvKgorICogRGlyZWN0b3J5IGJsb2NrIHNwbGl0dGluZywgY29tcGFjdGluZworICovCisKK3N0YXRpYyBpbnQgZHhfbWFrZV9tYXAgKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICpkZSwgaW50IHNpemUsCisJCQlzdHJ1Y3QgZHhfaGFzaF9pbmZvICpoaW5mbywgc3RydWN0IGR4X21hcF9lbnRyeSAqbWFwX3RhaWwpCit7CisJaW50IGNvdW50ID0gMDsKKwljaGFyICpiYXNlID0gKGNoYXIgKikgZGU7CisJc3RydWN0IGR4X2hhc2hfaW5mbyBoID0gKmhpbmZvOworCisJd2hpbGUgKChjaGFyICopIGRlIDwgYmFzZSArIHNpemUpCisJeworCQlpZiAoZGUtPm5hbWVfbGVuICYmIGRlLT5pbm9kZSkgeworCQkJZXh0M2ZzX2Rpcmhhc2goZGUtPm5hbWUsIGRlLT5uYW1lX2xlbiwgJmgpOworCQkJbWFwX3RhaWwtLTsKKwkJCW1hcF90YWlsLT5oYXNoID0gaC5oYXNoOworCQkJbWFwX3RhaWwtPm9mZnMgPSAodTMyKSAoKGNoYXIgKikgZGUgLSBiYXNlKTsKKwkJCWNvdW50Kys7CisJCQljb25kX3Jlc2NoZWQoKTsKKwkJfQorCQkvKiBYWFg6IGRvIHdlIG5lZWQgdG8gY2hlY2sgcmVjX2xlbiA9PSAwIGNhc2U/IC1DaHJpcyAqLworCQlkZSA9IChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSAoKGNoYXIgKikgZGUgKyBsZTE2X3RvX2NwdShkZS0+cmVjX2xlbikpOworCX0KKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyB2b2lkIGR4X3NvcnRfbWFwIChzdHJ1Y3QgZHhfbWFwX2VudHJ5ICptYXAsIHVuc2lnbmVkIGNvdW50KQoreworICAgICAgICBzdHJ1Y3QgZHhfbWFwX2VudHJ5ICpwLCAqcSwgKnRvcCA9IG1hcCArIGNvdW50IC0gMTsKKyAgICAgICAgaW50IG1vcmU7CisgICAgICAgIC8qIENvbWJzb3J0IHVudGlsIGJ1YmJsZSBzb3J0IGRvZXNuJ3Qgc3VjayAqLworICAgICAgICB3aGlsZSAoY291bnQgPiAyKQorCXsKKyAgICAgICAgICAgICAgICBjb3VudCA9IGNvdW50KjEwLzEzOworICAgICAgICAgICAgICAgIGlmIChjb3VudCAtIDkgPCAyKSAvKiA5LCAxMCAtPiAxMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgPSAxMTsKKyAgICAgICAgICAgICAgICBmb3IgKHAgPSB0b3AsIHEgPSBwIC0gY291bnQ7IHEgPj0gbWFwOyBwLS0sIHEtLSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwLT5oYXNoIDwgcS0+aGFzaCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcCgqcCwgKnEpOworICAgICAgICB9CisgICAgICAgIC8qIEdhcmRlbiB2YXJpZXR5IGJ1YmJsZSBzb3J0ICovCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBtb3JlID0gMDsKKyAgICAgICAgICAgICAgICBxID0gdG9wOworICAgICAgICAgICAgICAgIHdoaWxlIChxLS0gPiBtYXApCisJCXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxWzFdLmhhc2ggPj0gcVswXS5oYXNoKQorCQkJCWNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgc3dhcCgqKHErMSksICpxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vcmUgPSAxOworCQl9CisJfSB3aGlsZShtb3JlKTsKK30KKworc3RhdGljIHZvaWQgZHhfaW5zZXJ0X2Jsb2NrKHN0cnVjdCBkeF9mcmFtZSAqZnJhbWUsIHUzMiBoYXNoLCB1MzIgYmxvY2spCit7CisJc3RydWN0IGR4X2VudHJ5ICplbnRyaWVzID0gZnJhbWUtPmVudHJpZXM7CisJc3RydWN0IGR4X2VudHJ5ICpvbGQgPSBmcmFtZS0+YXQsICpuZXcgPSBvbGQgKyAxOworCWludCBjb3VudCA9IGR4X2dldF9jb3VudChlbnRyaWVzKTsKKworCWFzc2VydChjb3VudCA8IGR4X2dldF9saW1pdChlbnRyaWVzKSk7CisJYXNzZXJ0KG9sZCA8IGVudHJpZXMgKyBjb3VudCk7CisJbWVtbW92ZShuZXcgKyAxLCBuZXcsIChjaGFyICopKGVudHJpZXMgKyBjb3VudCkgLSAoY2hhciAqKShuZXcpKTsKKwlkeF9zZXRfaGFzaChuZXcsIGhhc2gpOworCWR4X3NldF9ibG9jayhuZXcsIGJsb2NrKTsKKwlkeF9zZXRfY291bnQoZW50cmllcywgY291bnQgKyAxKTsKK30KKyNlbmRpZgorCisKK3N0YXRpYyB2b2lkIGV4dDNfdXBkYXRlX2R4X2ZsYWcoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpZiAoIUVYVDNfSEFTX0NPTVBBVF9GRUFUVVJFKGlub2RlLT5pX3NiLAorCQkJCSAgICAgRVhUM19GRUFUVVJFX0NPTVBBVF9ESVJfSU5ERVgpKQorCQlFWFQzX0koaW5vZGUpLT5pX2ZsYWdzICY9IH5FWFQzX0lOREVYX0ZMOworfQorCisvKgorICogTk9URSEgdW5saWtlIHN0cm5jbXAsIGV4dDNfbWF0Y2ggcmV0dXJucyAxIGZvciBzdWNjZXNzLCAwIGZvciBmYWlsdXJlLgorICoKKyAqIGBsZW4gPD0gRVhUM19OQU1FX0xFTicgaXMgZ3VhcmFudGVlZCBieSBjYWxsZXIuCisgKiBgZGUgIT0gTlVMTCcgaXMgZ3VhcmFudGVlZCBieSBjYWxsZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGV4dDNfbWF0Y2ggKGludCBsZW4sIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lLAorCQkJICAgICAgc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKiBkZSkKK3sKKwlpZiAobGVuICE9IGRlLT5uYW1lX2xlbikKKwkJcmV0dXJuIDA7CisJaWYgKCFkZS0+aW5vZGUpCisJCXJldHVybiAwOworCXJldHVybiAhbWVtY21wKG5hbWUsIGRlLT5uYW1lLCBsZW4pOworfQorCisvKgorICogUmV0dXJucyAwIGlmIG5vdCBmb3VuZCwgLTEgb24gZmFpbHVyZSwgYW5kIDEgb24gc3VjY2VzcworICovCitzdGF0aWMgaW5saW5lIGludCBzZWFyY2hfZGlyYmxvY2soc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgsCisJCQkJICBzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJCQkgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJCSAgc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKiogcmVzX2RpcikKK3sKKwlzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqIGRlOworCWNoYXIgKiBkbGltaXQ7CisJaW50IGRlX2xlbjsKKwljb25zdCBjaGFyICpuYW1lID0gZGVudHJ5LT5kX25hbWUubmFtZTsKKwlpbnQgbmFtZWxlbiA9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKKworCWRlID0gKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICopIGJoLT5iX2RhdGE7CisJZGxpbWl0ID0gYmgtPmJfZGF0YSArIGRpci0+aV9zYi0+c19ibG9ja3NpemU7CisJd2hpbGUgKChjaGFyICopIGRlIDwgZGxpbWl0KSB7CisJCS8qIHRoaXMgY29kZSBpcyBleGVjdXRlZCBxdWFkcmF0aWNhbGx5IG9mdGVuICovCisJCS8qIGRvIG1pbmltYWwgY2hlY2tpbmcgYGJ5IGhhbmQnICovCisKKwkJaWYgKChjaGFyICopIGRlICsgbmFtZWxlbiA8PSBkbGltaXQgJiYKKwkJICAgIGV4dDNfbWF0Y2ggKG5hbWVsZW4sIG5hbWUsIGRlKSkgeworCQkJLyogZm91bmQgYSBtYXRjaCAtIGp1c3QgdG8gYmUgc3VyZSwgZG8gYSBmdWxsIGNoZWNrICovCisJCQlpZiAoIWV4dDNfY2hlY2tfZGlyX2VudHJ5KCJleHQzX2ZpbmRfZW50cnkiLAorCQkJCQkJICBkaXIsIGRlLCBiaCwgb2Zmc2V0KSkKKwkJCQlyZXR1cm4gLTE7CisJCQkqcmVzX2RpciA9IGRlOworCQkJcmV0dXJuIDE7CisJCX0KKwkJLyogcHJldmVudCBsb29waW5nIG9uIGEgYmFkIGJsb2NrICovCisJCWRlX2xlbiA9IGxlMTZfdG9fY3B1KGRlLT5yZWNfbGVuKTsKKwkJaWYgKGRlX2xlbiA8PSAwKQorCQkJcmV0dXJuIC0xOworCQlvZmZzZXQgKz0gZGVfbGVuOworCQlkZSA9IChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSAoKGNoYXIgKikgZGUgKyBkZV9sZW4pOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKgorICoJZXh0M19maW5kX2VudHJ5KCkKKyAqCisgKiBmaW5kcyBhbiBlbnRyeSBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSB3aXRoIHRoZSB3YW50ZWQgbmFtZS4gSXQKKyAqIHJldHVybnMgdGhlIGNhY2hlIGJ1ZmZlciBpbiB3aGljaCB0aGUgZW50cnkgd2FzIGZvdW5kLCBhbmQgdGhlIGVudHJ5CisgKiBpdHNlbGYgKGFzIGEgcGFyYW1ldGVyIC0gcmVzX2RpcikuIEl0IGRvZXMgTk9UIHJlYWQgdGhlIGlub2RlIG9mIHRoZQorICogZW50cnkgLSB5b3UnbGwgaGF2ZSB0byBkbyB0aGF0IHlvdXJzZWxmIGlmIHlvdSB3YW50IHRvLgorICoKKyAqIFRoZSByZXR1cm5lZCBidWZmZXJfaGVhZCBoYXMgLT5iX2NvdW50IGVsZXZhdGVkLiAgVGhlIGNhbGxlciBpcyBleHBlY3RlZAorICogdG8gYnJlbHNlKCkgaXQgd2hlbiBhcHByb3ByaWF0ZS4KKyAqLworc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqIGV4dDNfZmluZF9lbnRyeSAoc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJCQlzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKiByZXNfZGlyKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoX3VzZVtOQU1FSV9SQV9TSVpFXTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwgKnJldCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBzdGFydCwgYmxvY2ssIGI7CisJaW50IHJhX21heCA9IDA7CQkvKiBOdW1iZXIgb2YgYmgncyBpbiB0aGUgcmVhZGFoZWFkCisJCQkJICAgYnVmZmVyLCBiaF91c2VbXSAqLworCWludCByYV9wdHIgPSAwOwkJLyogQ3VycmVudCBpbmRleCBpbnRvIHJlYWRhaGVhZAorCQkJCSAgIGJ1ZmZlciAqLworCWludCBudW0gPSAwOworCWludCBuYmxvY2tzLCBpLCBlcnI7CisJc3RydWN0IGlub2RlICpkaXIgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOworCWludCBuYW1lbGVuOworCWNvbnN0IHU4ICpuYW1lOworCXVuc2lnbmVkIGJsb2Nrc2l6ZTsKKworCSpyZXNfZGlyID0gTlVMTDsKKwlzYiA9IGRpci0+aV9zYjsKKwlibG9ja3NpemUgPSBzYi0+c19ibG9ja3NpemU7CisJbmFtZWxlbiA9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKKwluYW1lID0gZGVudHJ5LT5kX25hbWUubmFtZTsKKwlpZiAobmFtZWxlbiA+IEVYVDNfTkFNRV9MRU4pCisJCXJldHVybiBOVUxMOworI2lmZGVmIENPTkZJR19FWFQzX0lOREVYCisJaWYgKGlzX2R4KGRpcikpIHsKKwkJYmggPSBleHQzX2R4X2ZpbmRfZW50cnkoZGVudHJ5LCByZXNfZGlyLCAmZXJyKTsKKwkJLyoKKwkJICogT24gc3VjY2Vzcywgb3IgaWYgdGhlIGVycm9yIHdhcyBmaWxlIG5vdCBmb3VuZCwKKwkJICogcmV0dXJuLiAgT3RoZXJ3aXNlLCBmYWxsIGJhY2sgdG8gZG9pbmcgYSBzZWFyY2ggdGhlCisJCSAqIG9sZCBmYXNoaW9uZWQgd2F5LgorCQkgKi8KKwkJaWYgKGJoIHx8IChlcnIgIT0gRVJSX0JBRF9EWF9ESVIpKQorCQkJcmV0dXJuIGJoOworCQlkeHRyYWNlKHByaW50aygiZXh0M19maW5kX2VudHJ5OiBkeCBmYWlsZWQsIGZhbGxpbmcgYmFja1xuIikpOworCX0KKyNlbmRpZgorCW5ibG9ja3MgPSBkaXItPmlfc2l6ZSA+PiBFWFQzX0JMT0NLX1NJWkVfQklUUyhzYik7CisJc3RhcnQgPSBFWFQzX0koZGlyKS0+aV9kaXJfc3RhcnRfbG9va3VwOworCWlmIChzdGFydCA+PSBuYmxvY2tzKQorCQlzdGFydCA9IDA7CisJYmxvY2sgPSBzdGFydDsKK3Jlc3RhcnQ6CisJZG8geworCQkvKgorCQkgKiBXZSBkZWFsIHdpdGggdGhlIHJlYWQtYWhlYWQgbG9naWMgaGVyZS4KKwkJICovCisJCWlmIChyYV9wdHIgPj0gcmFfbWF4KSB7CisJCQkvKiBSZWZpbGwgdGhlIHJlYWRhaGVhZCBidWZmZXIgKi8KKwkJCXJhX3B0ciA9IDA7CisJCQliID0gYmxvY2s7CisJCQlmb3IgKHJhX21heCA9IDA7IHJhX21heCA8IE5BTUVJX1JBX1NJWkU7IHJhX21heCsrKSB7CisJCQkJLyoKKwkJCQkgKiBUZXJtaW5hdGUgaWYgd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUKKwkJCQkgKiBkaXJlY3RvcnkgYW5kIG11c3Qgd3JhcCwgb3IgaWYgb3VyCisJCQkJICogc2VhcmNoIGhhcyBmaW5pc2hlZCBhdCB0aGlzIGJsb2NrLgorCQkJCSAqLworCQkJCWlmIChiID49IG5ibG9ja3MgfHwgKG51bSAmJiBibG9jayA9PSBzdGFydCkpIHsKKwkJCQkJYmhfdXNlW3JhX21heF0gPSBOVUxMOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJbnVtKys7CisJCQkJYmggPSBleHQzX2dldGJsayhOVUxMLCBkaXIsIGIrKywgMCwgJmVycik7CisJCQkJYmhfdXNlW3JhX21heF0gPSBiaDsKKwkJCQlpZiAoYmgpCisJCQkJCWxsX3J3X2Jsb2NrKFJFQUQsIDEsICZiaCk7CisJCQl9CisJCX0KKwkJaWYgKChiaCA9IGJoX3VzZVtyYV9wdHIrK10pID09IE5VTEwpCisJCQlnb3RvIG5leHQ7CisJCXdhaXRfb25fYnVmZmVyKGJoKTsKKwkJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKSB7CisJCQkvKiByZWFkIGVycm9yLCBza2lwIGJsb2NrICYgaG9wZSBmb3IgdGhlIGJlc3QgKi8KKwkJCWV4dDNfZXJyb3Ioc2IsIF9fRlVOQ1RJT05fXywgInJlYWRpbmcgZGlyZWN0b3J5ICMlbHUgIgorCQkJCSAgICJvZmZzZXQgJWx1IiwgZGlyLT5pX2lubywgYmxvY2spOworCQkJYnJlbHNlKGJoKTsKKwkJCWdvdG8gbmV4dDsKKwkJfQorCQlpID0gc2VhcmNoX2RpcmJsb2NrKGJoLCBkaXIsIGRlbnRyeSwKKwkJCSAgICBibG9jayA8PCBFWFQzX0JMT0NLX1NJWkVfQklUUyhzYiksIHJlc19kaXIpOworCQlpZiAoaSA9PSAxKSB7CisJCQlFWFQzX0koZGlyKS0+aV9kaXJfc3RhcnRfbG9va3VwID0gYmxvY2s7CisJCQlyZXQgPSBiaDsKKwkJCWdvdG8gY2xlYW51cF9hbmRfZXhpdDsKKwkJfSBlbHNlIHsKKwkJCWJyZWxzZShiaCk7CisJCQlpZiAoaSA8IDApCisJCQkJZ290byBjbGVhbnVwX2FuZF9leGl0OworCQl9CisJbmV4dDoKKwkJaWYgKCsrYmxvY2sgPj0gbmJsb2NrcykKKwkJCWJsb2NrID0gMDsKKwl9IHdoaWxlIChibG9jayAhPSBzdGFydCk7CisKKwkvKgorCSAqIElmIHRoZSBkaXJlY3RvcnkgaGFzIGdyb3duIHdoaWxlIHdlIHdlcmUgc2VhcmNoaW5nLCB0aGVuCisJICogc2VhcmNoIHRoZSBsYXN0IHBhcnQgb2YgdGhlIGRpcmVjdG9yeSBiZWZvcmUgZ2l2aW5nIHVwLgorCSAqLworCWJsb2NrID0gbmJsb2NrczsKKwluYmxvY2tzID0gZGlyLT5pX3NpemUgPj4gRVhUM19CTE9DS19TSVpFX0JJVFMoc2IpOworCWlmIChibG9jayA8IG5ibG9ja3MpIHsKKwkJc3RhcnQgPSAwOworCQlnb3RvIHJlc3RhcnQ7CisJfQorCitjbGVhbnVwX2FuZF9leGl0OgorCS8qIENsZWFuIHVwIHRoZSByZWFkLWFoZWFkIGJsb2NrcyAqLworCWZvciAoOyByYV9wdHIgPCByYV9tYXg7IHJhX3B0cisrKQorCQlicmVsc2UgKGJoX3VzZVtyYV9wdHJdKTsKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgQ09ORklHX0VYVDNfSU5ERVgKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBleHQzX2R4X2ZpbmRfZW50cnkoc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkgICAgICAgc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKipyZXNfZGlyLCBpbnQgKmVycikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKKwlzdHJ1Y3QgZHhfaGFzaF9pbmZvCWhpbmZvOworCXUzMiBoYXNoOworCXN0cnVjdCBkeF9mcmFtZSBmcmFtZXNbMl0sICpmcmFtZTsKKwlzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqZGUsICp0b3A7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwl1bnNpZ25lZCBsb25nIGJsb2NrOworCWludCByZXR2YWw7CisJaW50IG5hbWVsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisJY29uc3QgdTggKm5hbWUgPSBkZW50cnktPmRfbmFtZS5uYW1lOworCXN0cnVjdCBpbm9kZSAqZGlyID0gZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZTsKKworCXNiID0gZGlyLT5pX3NiOworCWlmICghKGZyYW1lID0gZHhfcHJvYmUoZGVudHJ5LCBOVUxMLCAmaGluZm8sIGZyYW1lcywgZXJyKSkpCisJCXJldHVybiBOVUxMOworCWhhc2ggPSBoaW5mby5oYXNoOworCWRvIHsKKwkJYmxvY2sgPSBkeF9nZXRfYmxvY2soZnJhbWUtPmF0KTsKKwkJaWYgKCEoYmggPSBleHQzX2JyZWFkIChOVUxMLGRpciwgYmxvY2ssIDAsIGVycikpKQorCQkJZ290byBlcnJvdXQ7CisJCWRlID0gKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICopIGJoLT5iX2RhdGE7CisJCXRvcCA9IChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSAoKGNoYXIgKikgZGUgKyBzYi0+c19ibG9ja3NpemUgLQorCQkJCSAgICAgICBFWFQzX0RJUl9SRUNfTEVOKDApKTsKKwkJZm9yICg7IGRlIDwgdG9wOyBkZSA9IGV4dDNfbmV4dF9lbnRyeShkZSkpCisJCWlmIChleHQzX21hdGNoIChuYW1lbGVuLCBuYW1lLCBkZSkpIHsKKwkJCWlmICghZXh0M19jaGVja19kaXJfZW50cnkoImV4dDNfZmluZF9lbnRyeSIsCisJCQkJCQkgIGRpciwgZGUsIGJoLAorCQkJCSAgKGJsb2NrPDxFWFQzX0JMT0NLX1NJWkVfQklUUyhzYikpCisJCQkJCSAgKygoY2hhciAqKWRlIC0gYmgtPmJfZGF0YSkpKSB7CisJCQkJYnJlbHNlIChiaCk7CisJCQkJZ290byBlcnJvdXQ7CisJCQl9CisJCQkqcmVzX2RpciA9IGRlOworCQkJZHhfcmVsZWFzZSAoZnJhbWVzKTsKKwkJCXJldHVybiBiaDsKKwkJfQorCQlicmVsc2UgKGJoKTsKKwkJLyogQ2hlY2sgdG8gc2VlIGlmIHdlIHNob3VsZCBjb250aW51ZSB0byBzZWFyY2ggKi8KKwkJcmV0dmFsID0gZXh0M19odHJlZV9uZXh0X2Jsb2NrKGRpciwgaGFzaCwgZnJhbWUsCisJCQkJCSAgICAgICBmcmFtZXMsIE5VTEwpOworCQlpZiAocmV0dmFsIDwgMCkgeworCQkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgICJlcnJvciByZWFkaW5nIGluZGV4IHBhZ2UgaW4gZGlyZWN0b3J5ICMlbHUiLAorCQkJICAgICBkaXItPmlfaW5vKTsKKwkJCSplcnIgPSByZXR2YWw7CisJCQlnb3RvIGVycm91dDsKKwkJfQorCX0gd2hpbGUgKHJldHZhbCA9PSAxKTsKKworCSplcnIgPSAtRU5PRU5UOworZXJyb3V0OgorCWR4dHJhY2UocHJpbnRrKCIlcyBub3QgZm91bmRcbiIsIG5hbWUpKTsKKwlkeF9yZWxlYXNlIChmcmFtZXMpOworCXJldHVybiBOVUxMOworfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpleHQzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKiBkZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKworCWlmIChkZW50cnktPmRfbmFtZS5sZW4gPiBFWFQzX05BTUVfTEVOKQorCQlyZXR1cm4gRVJSX1BUUigtRU5BTUVUT09MT05HKTsKKworCWJoID0gZXh0M19maW5kX2VudHJ5KGRlbnRyeSwgJmRlKTsKKwlpbm9kZSA9IE5VTEw7CisJaWYgKGJoKSB7CisJCXVuc2lnbmVkIGxvbmcgaW5vID0gbGUzMl90b19jcHUoZGUtPmlub2RlKTsKKwkJYnJlbHNlIChiaCk7CisJCWlub2RlID0gaWdldChkaXItPmlfc2IsIGlubyk7CisKKwkJaWYgKCFpbm9kZSkKKwkJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworCX0KKwlpZiAoaW5vZGUpCisJCXJldHVybiBkX3NwbGljZV9hbGlhcyhpbm9kZSwgZGVudHJ5KTsKKwlkX2FkZChkZW50cnksIGlub2RlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworCitzdHJ1Y3QgZGVudHJ5ICpleHQzX2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqY2hpbGQpCit7CisJdW5zaWduZWQgbG9uZyBpbm87CisJc3RydWN0IGRlbnRyeSAqcGFyZW50OworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGRlbnRyeSBkb3Rkb3Q7CisJc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKiBkZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCisJZG90ZG90LmRfbmFtZS5uYW1lID0gIi4uIjsKKwlkb3Rkb3QuZF9uYW1lLmxlbiA9IDI7CisJZG90ZG90LmRfcGFyZW50ID0gY2hpbGQ7IC8qIGNvbmZ1c2luZywgaXNuJ3QgaXQhICovCisKKwliaCA9IGV4dDNfZmluZF9lbnRyeSgmZG90ZG90LCAmZGUpOworCWlub2RlID0gTlVMTDsKKwlpZiAoIWJoKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKKwlpbm8gPSBsZTMyX3RvX2NwdShkZS0+aW5vZGUpOworCWJyZWxzZShiaCk7CisJaW5vZGUgPSBpZ2V0KGNoaWxkLT5kX2lub2RlLT5pX3NiLCBpbm8pOworCisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CisKKwlwYXJlbnQgPSBkX2FsbG9jX2Fub24oaW5vZGUpOworCWlmICghcGFyZW50KSB7CisJCWlwdXQoaW5vZGUpOworCQlwYXJlbnQgPSBFUlJfUFRSKC1FTk9NRU0pOworCX0KKwlyZXR1cm4gcGFyZW50OworfSAKKworI2RlZmluZSBTX1NISUZUIDEyCitzdGF0aWMgdW5zaWduZWQgY2hhciBleHQzX3R5cGVfYnlfbW9kZVtTX0lGTVQgPj4gU19TSElGVF0gPSB7CisJW1NfSUZSRUcgPj4gU19TSElGVF0JPSBFWFQzX0ZUX1JFR19GSUxFLAorCVtTX0lGRElSID4+IFNfU0hJRlRdCT0gRVhUM19GVF9ESVIsCisJW1NfSUZDSFIgPj4gU19TSElGVF0JPSBFWFQzX0ZUX0NIUkRFViwKKwlbU19JRkJMSyA+PiBTX1NISUZUXQk9IEVYVDNfRlRfQkxLREVWLAorCVtTX0lGSUZPID4+IFNfU0hJRlRdCT0gRVhUM19GVF9GSUZPLAorCVtTX0lGU09DSyA+PiBTX1NISUZUXQk9IEVYVDNfRlRfU09DSywKKwlbU19JRkxOSyA+PiBTX1NISUZUXQk9IEVYVDNfRlRfU1lNTElOSywKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBleHQzX3NldF9kZV90eXBlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKmRlLAorCQkJCXVtb2RlX3QgbW9kZSkgeworCWlmIChFWFQzX0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfRklMRVRZUEUpKQorCQlkZS0+ZmlsZV90eXBlID0gZXh0M190eXBlX2J5X21vZGVbKG1vZGUgJiBTX0lGTVQpPj5TX1NISUZUXTsKK30KKworI2lmZGVmIENPTkZJR19FWFQzX0lOREVYCitzdGF0aWMgc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKgorZHhfbW92ZV9kaXJlbnRzKGNoYXIgKmZyb20sIGNoYXIgKnRvLCBzdHJ1Y3QgZHhfbWFwX2VudHJ5ICptYXAsIGludCBjb3VudCkKK3sKKwl1bnNpZ25lZCByZWNfbGVuID0gMDsKKworCXdoaWxlIChjb3VudC0tKSB7CisJCXN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICpkZSA9IChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSAoZnJvbSArIG1hcC0+b2Zmcyk7CisJCXJlY19sZW4gPSBFWFQzX0RJUl9SRUNfTEVOKGRlLT5uYW1lX2xlbik7CisJCW1lbWNweSAodG8sIGRlLCByZWNfbGVuKTsKKwkJKChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSB0byktPnJlY19sZW4gPQorCQkJCWNwdV90b19sZTE2KHJlY19sZW4pOworCQlkZS0+aW5vZGUgPSAwOworCQltYXArKzsKKwkJdG8gKz0gcmVjX2xlbjsKKwl9CisJcmV0dXJuIChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSAodG8gLSByZWNfbGVuKTsKK30KKworc3RhdGljIHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yKiBkeF9wYWNrX2RpcmVudHMoY2hhciAqYmFzZSwgaW50IHNpemUpCit7CisJc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKm5leHQsICp0bywgKnByZXYsICpkZSA9IChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSBiYXNlOworCXVuc2lnbmVkIHJlY19sZW4gPSAwOworCisJcHJldiA9IHRvID0gZGU7CisJd2hpbGUgKChjaGFyKilkZSA8IGJhc2UgKyBzaXplKSB7CisJCW5leHQgPSAoc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKikgKChjaGFyICopIGRlICsKKwkJCQkJCSAgICBsZTE2X3RvX2NwdShkZS0+cmVjX2xlbikpOworCQlpZiAoZGUtPmlub2RlICYmIGRlLT5uYW1lX2xlbikgeworCQkJcmVjX2xlbiA9IEVYVDNfRElSX1JFQ19MRU4oZGUtPm5hbWVfbGVuKTsKKwkJCWlmIChkZSA+IHRvKQorCQkJCW1lbW1vdmUodG8sIGRlLCByZWNfbGVuKTsKKwkJCXRvLT5yZWNfbGVuID0gY3B1X3RvX2xlMTYocmVjX2xlbik7CisJCQlwcmV2ID0gdG87CisJCQl0byA9IChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSAoKChjaGFyICopIHRvKSArIHJlY19sZW4pOworCQl9CisJCWRlID0gbmV4dDsKKwl9CisJcmV0dXJuIHByZXY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqZG9fc3BsaXQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICpkaXIsCisJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaCxzdHJ1Y3QgZHhfZnJhbWUgKmZyYW1lLAorCQkJc3RydWN0IGR4X2hhc2hfaW5mbyAqaGluZm8sIGludCAqZXJyb3IpCit7CisJdW5zaWduZWQgYmxvY2tzaXplID0gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwl1bnNpZ25lZCBjb3VudCwgY29udGludWVkOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgyOworCXUzMiBuZXdibG9jazsKKwl1MzIgaGFzaDI7CisJc3RydWN0IGR4X21hcF9lbnRyeSAqbWFwOworCWNoYXIgKmRhdGExID0gKCpiaCktPmJfZGF0YSwgKmRhdGEyOworCXVuc2lnbmVkIHNwbGl0OworCXN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICpkZSA9IE5VTEwsICpkZTI7CisJaW50CWVycjsKKworCWJoMiA9IGV4dDNfYXBwZW5kIChoYW5kbGUsIGRpciwgJm5ld2Jsb2NrLCBlcnJvcik7CisJaWYgKCEoYmgyKSkgeworCQlicmVsc2UoKmJoKTsKKwkJKmJoID0gTlVMTDsKKwkJZ290byBlcnJvdXQ7CisJfQorCisJQlVGRkVSX1RSQUNFKCpiaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwllcnIgPSBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsICpiaCk7CisJaWYgKGVycikgeworCWpvdXJuYWxfZXJyb3I6CisJCWJyZWxzZSgqYmgpOworCQlicmVsc2UoYmgyKTsKKwkJKmJoID0gTlVMTDsKKwkJZXh0M19zdGRfZXJyb3IoZGlyLT5pX3NiLCBlcnIpOworCQlnb3RvIGVycm91dDsKKwl9CisJQlVGRkVSX1RSQUNFKGZyYW1lLT5iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwllcnIgPSBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGZyYW1lLT5iaCk7CisJaWYgKGVycikKKwkJZ290byBqb3VybmFsX2Vycm9yOworCisJZGF0YTIgPSBiaDItPmJfZGF0YTsKKworCS8qIGNyZWF0ZSBtYXAgaW4gdGhlIGVuZCBvZiBkYXRhMiBibG9jayAqLworCW1hcCA9IChzdHJ1Y3QgZHhfbWFwX2VudHJ5ICopIChkYXRhMiArIGJsb2Nrc2l6ZSk7CisJY291bnQgPSBkeF9tYWtlX21hcCAoKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICopIGRhdGExLAorCQkJICAgICBibG9ja3NpemUsIGhpbmZvLCBtYXApOworCW1hcCAtPSBjb3VudDsKKwlzcGxpdCA9IGNvdW50LzI7IC8vIG5lZWQgdG8gYWRqdXN0IHRvIGFjdHVhbCBtaWRkbGUKKwlkeF9zb3J0X21hcCAobWFwLCBjb3VudCk7CisJaGFzaDIgPSBtYXBbc3BsaXRdLmhhc2g7CisJY29udGludWVkID0gaGFzaDIgPT0gbWFwW3NwbGl0IC0gMV0uaGFzaDsKKwlkeHRyYWNlKHByaW50aygiU3BsaXQgYmxvY2sgJWkgYXQgJXgsICVpLyVpXG4iLAorCQlkeF9nZXRfYmxvY2soZnJhbWUtPmF0KSwgaGFzaDIsIHNwbGl0LCBjb3VudC1zcGxpdCkpOworCisJLyogRmFuY3kgZGFuY2UgdG8gc3RheSB3aXRoaW4gdHdvIGJ1ZmZlcnMgKi8KKwlkZTIgPSBkeF9tb3ZlX2RpcmVudHMoZGF0YTEsIGRhdGEyLCBtYXAgKyBzcGxpdCwgY291bnQgLSBzcGxpdCk7CisJZGUgPSBkeF9wYWNrX2RpcmVudHMoZGF0YTEsYmxvY2tzaXplKTsKKwlkZS0+cmVjX2xlbiA9IGNwdV90b19sZTE2KGRhdGExICsgYmxvY2tzaXplIC0gKGNoYXIgKikgZGUpOworCWRlMi0+cmVjX2xlbiA9IGNwdV90b19sZTE2KGRhdGEyICsgYmxvY2tzaXplIC0gKGNoYXIgKikgZGUyKTsKKwlkeHRyYWNlKGR4X3Nob3dfbGVhZiAoaGluZm8sIChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSBkYXRhMSwgYmxvY2tzaXplLCAxKSk7CisJZHh0cmFjZShkeF9zaG93X2xlYWYgKGhpbmZvLCAoc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKikgZGF0YTIsIGJsb2Nrc2l6ZSwgMSkpOworCisJLyogV2hpY2ggYmxvY2sgZ2V0cyB0aGUgbmV3IGVudHJ5PyAqLworCWlmIChoaW5mby0+aGFzaCA+PSBoYXNoMikKKwl7CisJCXN3YXAoKmJoLCBiaDIpOworCQlkZSA9IGRlMjsKKwl9CisJZHhfaW5zZXJ0X2Jsb2NrIChmcmFtZSwgaGFzaDIgKyBjb250aW51ZWQsIG5ld2Jsb2NrKTsKKwllcnIgPSBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEgKGhhbmRsZSwgYmgyKTsKKwlpZiAoZXJyKQorCQlnb3RvIGpvdXJuYWxfZXJyb3I7CisJZXJyID0gZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhIChoYW5kbGUsIGZyYW1lLT5iaCk7CisJaWYgKGVycikKKwkJZ290byBqb3VybmFsX2Vycm9yOworCWJyZWxzZSAoYmgyKTsKKwlkeHRyYWNlKGR4X3Nob3dfaW5kZXggKCJmcmFtZSIsIGZyYW1lLT5lbnRyaWVzKSk7CitlcnJvdXQ6CisJcmV0dXJuIGRlOworfQorI2VuZGlmCisKKworLyoKKyAqIEFkZCBhIG5ldyBlbnRyeSBpbnRvIGEgZGlyZWN0b3J5IChsZWFmKSBibG9jay4gIElmIGRlIGlzIG5vbi1OVUxMLAorICogaXQgcG9pbnRzIHRvIGEgZGlyZWN0b3J5IGVudHJ5IHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gYmUgbGFyZ2UKKyAqIGVub3VnaCBmb3IgbmV3IGRpcmVjdG9yeSBlbnRyeS4gIElmIGRlIGlzIE5VTEwsIHRoZW4KKyAqIGFkZF9kaXJlbnRfdG9fYnVmIHdpbGwgYXR0ZW1wdCBzZWFyY2ggdGhlIGRpcmVjdG9yeSBibG9jayBmb3IKKyAqIHNwYWNlLiAgSXQgd2lsbCByZXR1cm4gLUVOT1NQQyBpZiBubyBzcGFjZSBpcyBhdmFpbGFibGUsIGFuZCAtRUlPCisgKiBhbmQgLUVFWElTVCBpZiBkaXJlY3RvcnkgZW50cnkgYWxyZWFkeSBleGlzdHMuCisgKiAKKyAqIE5PVEUhICBiaCBpcyBOT1QgcmVsZWFzZWQgaW4gdGhlIGNhc2Ugd2hlcmUgRU5PU1BDIGlzIHJldHVybmVkLiAgSW4KKyAqIGFsbCBvdGhlciBjYXNlcyBiaCBpcyByZWxlYXNlZC4KKyAqLworc3RhdGljIGludCBhZGRfZGlyZW50X3RvX2J1ZihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICpkZSwKKwkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpCit7CisJc3RydWN0IGlub2RlCSpkaXIgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOworCWNvbnN0IGNoYXIJKm5hbWUgPSBkZW50cnktPmRfbmFtZS5uYW1lOworCWludAkJbmFtZWxlbiA9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKKwl1bnNpZ25lZCBsb25nCW9mZnNldCA9IDA7CisJdW5zaWduZWQgc2hvcnQJcmVjbGVuOworCWludAkJbmxlbiwgcmxlbiwgZXJyOworCWNoYXIJCSp0b3A7CisKKwlyZWNsZW4gPSBFWFQzX0RJUl9SRUNfTEVOKG5hbWVsZW4pOworCWlmICghZGUpIHsKKwkJZGUgPSAoc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKiliaC0+Yl9kYXRhOworCQl0b3AgPSBiaC0+Yl9kYXRhICsgZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHJlY2xlbjsKKwkJd2hpbGUgKChjaGFyICopIGRlIDw9IHRvcCkgeworCQkJaWYgKCFleHQzX2NoZWNrX2Rpcl9lbnRyeSgiZXh0M19hZGRfZW50cnkiLCBkaXIsIGRlLAorCQkJCQkJICBiaCwgb2Zmc2V0KSkgeworCQkJCWJyZWxzZSAoYmgpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJaWYgKGV4dDNfbWF0Y2ggKG5hbWVsZW4sIG5hbWUsIGRlKSkgeworCQkJCWJyZWxzZSAoYmgpOworCQkJCXJldHVybiAtRUVYSVNUOworCQkJfQorCQkJbmxlbiA9IEVYVDNfRElSX1JFQ19MRU4oZGUtPm5hbWVfbGVuKTsKKwkJCXJsZW4gPSBsZTE2X3RvX2NwdShkZS0+cmVjX2xlbik7CisJCQlpZiAoKGRlLT5pbm9kZT8gcmxlbiAtIG5sZW46IHJsZW4pID49IHJlY2xlbikKKwkJCQlicmVhazsKKwkJCWRlID0gKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICopKChjaGFyICopZGUgKyBybGVuKTsKKwkJCW9mZnNldCArPSBybGVuOworCQl9CisJCWlmICgoY2hhciAqKSBkZSA+IHRvcCkKKwkJCXJldHVybiAtRU5PU1BDOworCX0KKwlCVUZGRVJfVFJBQ0UoYmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJZXJyID0gZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBiaCk7CisJaWYgKGVycikgeworCQlleHQzX3N0ZF9lcnJvcihkaXItPmlfc2IsIGVycik7CisJCWJyZWxzZShiaCk7CisJCXJldHVybiBlcnI7CisJfQorCisJLyogQnkgbm93IHRoZSBidWZmZXIgaXMgbWFya2VkIGZvciBqb3VybmFsaW5nICovCisJbmxlbiA9IEVYVDNfRElSX1JFQ19MRU4oZGUtPm5hbWVfbGVuKTsKKwlybGVuID0gbGUxNl90b19jcHUoZGUtPnJlY19sZW4pOworCWlmIChkZS0+aW5vZGUpIHsKKwkJc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKmRlMSA9IChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSgoY2hhciAqKWRlICsgbmxlbik7CisJCWRlMS0+cmVjX2xlbiA9IGNwdV90b19sZTE2KHJsZW4gLSBubGVuKTsKKwkJZGUtPnJlY19sZW4gPSBjcHVfdG9fbGUxNihubGVuKTsKKwkJZGUgPSBkZTE7CisJfQorCWRlLT5maWxlX3R5cGUgPSBFWFQzX0ZUX1VOS05PV047CisJaWYgKGlub2RlKSB7CisJCWRlLT5pbm9kZSA9IGNwdV90b19sZTMyKGlub2RlLT5pX2lubyk7CisJCWV4dDNfc2V0X2RlX3R5cGUoZGlyLT5pX3NiLCBkZSwgaW5vZGUtPmlfbW9kZSk7CisJfSBlbHNlCisJCWRlLT5pbm9kZSA9IDA7CisJZGUtPm5hbWVfbGVuID0gbmFtZWxlbjsKKwltZW1jcHkgKGRlLT5uYW1lLCBuYW1lLCBuYW1lbGVuKTsKKwkvKgorCSAqIFhYWCBzaG91bGRuJ3QgdXBkYXRlIGFueSB0aW1lcyB1bnRpbCBzdWNjZXNzZnVsCisJICogY29tcGxldGlvbiBvZiBzeXNjYWxsLCBidXQgdG9vIG1hbnkgY2FsbGVycyBkZXBlbmQKKwkgKiBvbiB0aGlzLgorCSAqCisJICogWFhYIHNpbWlsYXJseSwgdG9vIG1hbnkgY2FsbGVycyBkZXBlbmQgb24KKwkgKiBleHQzX25ld19pbm9kZSgpIHNldHRpbmcgdGhlIHRpbWVzLCBidXQgZXJyb3IKKwkgKiByZWNvdmVyeSBkZWxldGVzIHRoZSBpbm9kZSwgc28gdGhlIHdvcnN0IHRoYXQgY2FuCisJICogaGFwcGVuIGlzIHRoYXQgdGhlIHRpbWVzIGFyZSBzbGlnaHRseSBvdXQgb2YgZGF0ZQorCSAqIGFuZC9vciBkaWZmZXJlbnQgZnJvbSB0aGUgZGlyZWN0b3J5IGNoYW5nZSB0aW1lLgorCSAqLworCWRpci0+aV9tdGltZSA9IGRpci0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJZXh0M191cGRhdGVfZHhfZmxhZyhkaXIpOworCWRpci0+aV92ZXJzaW9uKys7CisJZXh0M19tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgZGlyKTsKKwlCVUZGRVJfVFJBQ0UoYmgsICJjYWxsIGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOworCWVyciA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKKwlpZiAoZXJyKQorCQlleHQzX3N0ZF9lcnJvcihkaXItPmlfc2IsIGVycik7CisJYnJlbHNlKGJoKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19FWFQzX0lOREVYCisvKgorICogVGhpcyBjb252ZXJ0cyBhIG9uZSBibG9jayB1bmluZGV4ZWQgZGlyZWN0b3J5IHRvIGEgMyBibG9jayBpbmRleGVkCisgKiBkaXJlY3RvcnksIGFuZCBhZGRzIHRoZSBkZW50cnkgdG8gdGhlIGluZGV4ZWQgZGlyZWN0b3J5LgorICovCitzdGF0aWMgaW50IG1ha2VfaW5kZXhlZF9kaXIoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJc3RydWN0IGlub2RlCSpkaXIgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOworCWNvbnN0IGNoYXIJKm5hbWUgPSBkZW50cnktPmRfbmFtZS5uYW1lOworCWludAkJbmFtZWxlbiA9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoMjsKKwlzdHJ1Y3QgZHhfcm9vdAkqcm9vdDsKKwlzdHJ1Y3QgZHhfZnJhbWUJZnJhbWVzWzJdLCAqZnJhbWU7CisJc3RydWN0IGR4X2VudHJ5ICplbnRyaWVzOworCXN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yCSpkZSwgKmRlMjsKKwljaGFyCQkqZGF0YTEsICp0b3A7CisJdW5zaWduZWQJbGVuOworCWludAkJcmV0dmFsOworCXVuc2lnbmVkCWJsb2Nrc2l6ZTsKKwlzdHJ1Y3QgZHhfaGFzaF9pbmZvIGhpbmZvOworCXUzMgkJYmxvY2s7CisJc3RydWN0IGZha2VfZGlyZW50ICpmZGU7CisKKwlibG9ja3NpemUgPSAgZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwlkeHRyYWNlKHByaW50aygiQ3JlYXRpbmcgaW5kZXhcbiIpKTsKKwlyZXR2YWwgPSBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKKwlpZiAocmV0dmFsKSB7CisJCWV4dDNfc3RkX2Vycm9yKGRpci0+aV9zYiwgcmV0dmFsKTsKKwkJYnJlbHNlKGJoKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJcm9vdCA9IChzdHJ1Y3QgZHhfcm9vdCAqKSBiaC0+Yl9kYXRhOworCisJYmgyID0gZXh0M19hcHBlbmQgKGhhbmRsZSwgZGlyLCAmYmxvY2ssICZyZXR2YWwpOworCWlmICghKGJoMikpIHsKKwkJYnJlbHNlKGJoKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJRVhUM19JKGRpciktPmlfZmxhZ3MgfD0gRVhUM19JTkRFWF9GTDsKKwlkYXRhMSA9IGJoMi0+Yl9kYXRhOworCisJLyogVGhlIDB0aCBibG9jayBiZWNvbWVzIHRoZSByb290LCBtb3ZlIHRoZSBkaXJlbnRzIG91dCAqLworCWZkZSA9ICZyb290LT5kb3Rkb3Q7CisJZGUgPSAoc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKikoKGNoYXIgKilmZGUgKyBsZTE2X3RvX2NwdShmZGUtPnJlY19sZW4pKTsKKwlsZW4gPSAoKGNoYXIgKikgcm9vdCkgKyBibG9ja3NpemUgLSAoY2hhciAqKSBkZTsKKwltZW1jcHkgKGRhdGExLCBkZSwgbGVuKTsKKwlkZSA9IChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSBkYXRhMTsKKwl0b3AgPSBkYXRhMSArIGxlbjsKKwl3aGlsZSAoKGNoYXIgKikoZGUyPSh2b2lkKilkZStsZTE2X3RvX2NwdShkZS0+cmVjX2xlbikpIDwgdG9wKQorCQlkZSA9IGRlMjsKKwlkZS0+cmVjX2xlbiA9IGNwdV90b19sZTE2KGRhdGExICsgYmxvY2tzaXplIC0gKGNoYXIgKikgZGUpOworCS8qIEluaXRpYWxpemUgdGhlIHJvb3Q7IHRoZSBkb3QgZGlyZW50cyBhbHJlYWR5IGV4aXN0ICovCisJZGUgPSAoc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKikgKCZyb290LT5kb3Rkb3QpOworCWRlLT5yZWNfbGVuID0gY3B1X3RvX2xlMTYoYmxvY2tzaXplIC0gRVhUM19ESVJfUkVDX0xFTigyKSk7CisJbWVtc2V0ICgmcm9vdC0+aW5mbywgMCwgc2l6ZW9mKHJvb3QtPmluZm8pKTsKKwlyb290LT5pbmZvLmluZm9fbGVuZ3RoID0gc2l6ZW9mKHJvb3QtPmluZm8pOworCXJvb3QtPmluZm8uaGFzaF92ZXJzaW9uID0gRVhUM19TQihkaXItPmlfc2IpLT5zX2RlZl9oYXNoX3ZlcnNpb247CisJZW50cmllcyA9IHJvb3QtPmVudHJpZXM7CisJZHhfc2V0X2Jsb2NrIChlbnRyaWVzLCAxKTsKKwlkeF9zZXRfY291bnQgKGVudHJpZXMsIDEpOworCWR4X3NldF9saW1pdCAoZW50cmllcywgZHhfcm9vdF9saW1pdChkaXIsIHNpemVvZihyb290LT5pbmZvKSkpOworCisJLyogSW5pdGlhbGl6ZSBhcyBmb3IgZHhfcHJvYmUgKi8KKwloaW5mby5oYXNoX3ZlcnNpb24gPSByb290LT5pbmZvLmhhc2hfdmVyc2lvbjsKKwloaW5mby5zZWVkID0gRVhUM19TQihkaXItPmlfc2IpLT5zX2hhc2hfc2VlZDsKKwlleHQzZnNfZGlyaGFzaChuYW1lLCBuYW1lbGVuLCAmaGluZm8pOworCWZyYW1lID0gZnJhbWVzOworCWZyYW1lLT5lbnRyaWVzID0gZW50cmllczsKKwlmcmFtZS0+YXQgPSBlbnRyaWVzOworCWZyYW1lLT5iaCA9IGJoOworCWJoID0gYmgyOworCWRlID0gZG9fc3BsaXQoaGFuZGxlLGRpciwgJmJoLCBmcmFtZSwgJmhpbmZvLCAmcmV0dmFsKTsKKwlkeF9yZWxlYXNlIChmcmFtZXMpOworCWlmICghKGRlKSkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHVybiBhZGRfZGlyZW50X3RvX2J1ZihoYW5kbGUsIGRlbnRyeSwgaW5vZGUsIGRlLCBiaCk7Cit9CisjZW5kaWYKKworLyoKKyAqCWV4dDNfYWRkX2VudHJ5KCkKKyAqCisgKiBhZGRzIGEgZmlsZSBlbnRyeSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSwgdXNpbmcgdGhlIHNhbWUKKyAqIHNlbWFudGljcyBhcyBleHQzX2ZpbmRfZW50cnkoKS4gSXQgcmV0dXJucyBOVUxMIGlmIGl0IGZhaWxlZC4KKyAqCisgKiBOT1RFISEgVGhlIGlub2RlIHBhcnQgb2YgJ2RlJyBpcyBsZWZ0IGF0IDAgLSB3aGljaCBtZWFucyB5b3UKKyAqIG1heSBub3Qgc2xlZXAgYmV0d2VlbiBjYWxsaW5nIHRoaXMgYW5kIHB1dHRpbmcgc29tZXRoaW5nIGludG8KKyAqIHRoZSBlbnRyeSwgYXMgc29tZW9uZSBlbHNlIG1pZ2h0IGhhdmUgdXNlZCBpdCB3aGlsZSB5b3Ugc2xlcHQuCisgKi8KK3N0YXRpYyBpbnQgZXh0M19hZGRfZW50cnkgKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBpbm9kZSAqZGlyID0gZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqZGU7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJaW50CXJldHZhbDsKKyNpZmRlZiBDT05GSUdfRVhUM19JTkRFWAorCWludAlkeF9mYWxsYmFjaz0wOworI2VuZGlmCisJdW5zaWduZWQgYmxvY2tzaXplOworCXVuc2lnbmVkIG5sZW4sIHJsZW47CisJdTMyIGJsb2NrLCBibG9ja3M7CisKKwlzYiA9IGRpci0+aV9zYjsKKwlibG9ja3NpemUgPSBzYi0+c19ibG9ja3NpemU7CisJaWYgKCFkZW50cnktPmRfbmFtZS5sZW4pCisJCXJldHVybiAtRUlOVkFMOworI2lmZGVmIENPTkZJR19FWFQzX0lOREVYCisJaWYgKGlzX2R4KGRpcikpIHsKKwkJcmV0dmFsID0gZXh0M19keF9hZGRfZW50cnkoaGFuZGxlLCBkZW50cnksIGlub2RlKTsKKwkJaWYgKCFyZXR2YWwgfHwgKHJldHZhbCAhPSBFUlJfQkFEX0RYX0RJUikpCisJCQlyZXR1cm4gcmV0dmFsOworCQlFWFQzX0koZGlyKS0+aV9mbGFncyAmPSB+RVhUM19JTkRFWF9GTDsKKwkJZHhfZmFsbGJhY2srKzsKKwkJZXh0M19tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgZGlyKTsKKwl9CisjZW5kaWYKKwlibG9ja3MgPSBkaXItPmlfc2l6ZSA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKKwlmb3IgKGJsb2NrID0gMCwgb2Zmc2V0ID0gMDsgYmxvY2sgPCBibG9ja3M7IGJsb2NrKyspIHsKKwkJYmggPSBleHQzX2JyZWFkKGhhbmRsZSwgZGlyLCBibG9jaywgMCwgJnJldHZhbCk7CisJCWlmKCFiaCkKKwkJCXJldHVybiByZXR2YWw7CisJCXJldHZhbCA9IGFkZF9kaXJlbnRfdG9fYnVmKGhhbmRsZSwgZGVudHJ5LCBpbm9kZSwgTlVMTCwgYmgpOworCQlpZiAocmV0dmFsICE9IC1FTk9TUEMpCisJCQlyZXR1cm4gcmV0dmFsOworCisjaWZkZWYgQ09ORklHX0VYVDNfSU5ERVgKKwkJaWYgKGJsb2NrcyA9PSAxICYmICFkeF9mYWxsYmFjayAmJgorCQkgICAgRVhUM19IQVNfQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDNfRkVBVFVSRV9DT01QQVRfRElSX0lOREVYKSkKKwkJCXJldHVybiBtYWtlX2luZGV4ZWRfZGlyKGhhbmRsZSwgZGVudHJ5LCBpbm9kZSwgYmgpOworI2VuZGlmCisJCWJyZWxzZShiaCk7CisJfQorCWJoID0gZXh0M19hcHBlbmQoaGFuZGxlLCBkaXIsICZibG9jaywgJnJldHZhbCk7CisJaWYgKCFiaCkKKwkJcmV0dXJuIHJldHZhbDsKKwlkZSA9IChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSBiaC0+Yl9kYXRhOworCWRlLT5pbm9kZSA9IDA7CisJZGUtPnJlY19sZW4gPSBjcHVfdG9fbGUxNihybGVuID0gYmxvY2tzaXplKTsKKwlubGVuID0gMDsKKwlyZXR1cm4gYWRkX2RpcmVudF90b19idWYoaGFuZGxlLCBkZW50cnksIGlub2RlLCBkZSwgYmgpOworfQorCisjaWZkZWYgQ09ORklHX0VYVDNfSU5ERVgKKy8qCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgdmFsdWUKKyAqLworc3RhdGljIGludCBleHQzX2R4X2FkZF9lbnRyeShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGR4X2ZyYW1lIGZyYW1lc1syXSwgKmZyYW1lOworCXN0cnVjdCBkeF9lbnRyeSAqZW50cmllcywgKmF0OworCXN0cnVjdCBkeF9oYXNoX2luZm8gaGluZm87CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJc3RydWN0IGlub2RlICpkaXIgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiID0gZGlyLT5pX3NiOworCXN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICpkZTsKKwlpbnQgZXJyOworCisJZnJhbWUgPSBkeF9wcm9iZShkZW50cnksIE5VTEwsICZoaW5mbywgZnJhbWVzLCAmZXJyKTsKKwlpZiAoIWZyYW1lKQorCQlyZXR1cm4gZXJyOworCWVudHJpZXMgPSBmcmFtZS0+ZW50cmllczsKKwlhdCA9IGZyYW1lLT5hdDsKKworCWlmICghKGJoID0gZXh0M19icmVhZChoYW5kbGUsZGlyLCBkeF9nZXRfYmxvY2soZnJhbWUtPmF0KSwgMCwgJmVycikpKQorCQlnb3RvIGNsZWFudXA7CisKKwlCVUZGRVJfVFJBQ0UoYmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJZXJyID0gZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBiaCk7CisJaWYgKGVycikKKwkJZ290byBqb3VybmFsX2Vycm9yOworCisJZXJyID0gYWRkX2RpcmVudF90b19idWYoaGFuZGxlLCBkZW50cnksIGlub2RlLCBOVUxMLCBiaCk7CisJaWYgKGVyciAhPSAtRU5PU1BDKSB7CisJCWJoID0gTlVMTDsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIEJsb2NrIGZ1bGwsIHNob3VsZCBjb21wcmVzcyBidXQgZm9yIG5vdyBqdXN0IHNwbGl0ICovCisJZHh0cmFjZShwcmludGsoInVzaW5nICV1IG9mICV1IG5vZGUgZW50cmllc1xuIiwKKwkJICAgICAgIGR4X2dldF9jb3VudChlbnRyaWVzKSwgZHhfZ2V0X2xpbWl0KGVudHJpZXMpKSk7CisJLyogTmVlZCB0byBzcGxpdCBpbmRleD8gKi8KKwlpZiAoZHhfZ2V0X2NvdW50KGVudHJpZXMpID09IGR4X2dldF9saW1pdChlbnRyaWVzKSkgeworCQl1MzIgbmV3YmxvY2s7CisJCXVuc2lnbmVkIGljb3VudCA9IGR4X2dldF9jb3VudChlbnRyaWVzKTsKKwkJaW50IGxldmVscyA9IGZyYW1lIC0gZnJhbWVzOworCQlzdHJ1Y3QgZHhfZW50cnkgKmVudHJpZXMyOworCQlzdHJ1Y3QgZHhfbm9kZSAqbm9kZTI7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgyOworCisJCWlmIChsZXZlbHMgJiYgKGR4X2dldF9jb3VudChmcmFtZXMtPmVudHJpZXMpID09CisJCQkgICAgICAgZHhfZ2V0X2xpbWl0KGZyYW1lcy0+ZW50cmllcykpKSB7CisJCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkgICAgICJEaXJlY3RvcnkgaW5kZXggZnVsbCFcbiIpOworCQkJZXJyID0gLUVOT1NQQzsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCQliaDIgPSBleHQzX2FwcGVuZCAoaGFuZGxlLCBkaXIsICZuZXdibG9jaywgJmVycik7CisJCWlmICghKGJoMikpCisJCQlnb3RvIGNsZWFudXA7CisJCW5vZGUyID0gKHN0cnVjdCBkeF9ub2RlICopKGJoMi0+Yl9kYXRhKTsKKwkJZW50cmllczIgPSBub2RlMi0+ZW50cmllczsKKwkJbm9kZTItPmZha2UucmVjX2xlbiA9IGNwdV90b19sZTE2KHNiLT5zX2Jsb2Nrc2l6ZSk7CisJCW5vZGUyLT5mYWtlLmlub2RlID0gMDsKKwkJQlVGRkVSX1RSQUNFKGZyYW1lLT5iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwkJZXJyID0gZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBmcmFtZS0+YmgpOworCQlpZiAoZXJyKQorCQkJZ290byBqb3VybmFsX2Vycm9yOworCQlpZiAobGV2ZWxzKSB7CisJCQl1bnNpZ25lZCBpY291bnQxID0gaWNvdW50LzIsIGljb3VudDIgPSBpY291bnQgLSBpY291bnQxOworCQkJdW5zaWduZWQgaGFzaDIgPSBkeF9nZXRfaGFzaChlbnRyaWVzICsgaWNvdW50MSk7CisJCQlkeHRyYWNlKHByaW50aygiU3BsaXQgaW5kZXggJWkvJWlcbiIsIGljb3VudDEsIGljb3VudDIpKTsKKworCQkJQlVGRkVSX1RSQUNFKGZyYW1lLT5iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsgLyogaW5kZXggcm9vdCAqLworCQkJZXJyID0gZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLAorCQkJCQkJCSAgICAgZnJhbWVzWzBdLmJoKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBqb3VybmFsX2Vycm9yOworCisJCQltZW1jcHkgKChjaGFyICopIGVudHJpZXMyLCAoY2hhciAqKSAoZW50cmllcyArIGljb3VudDEpLAorCQkJCWljb3VudDIgKiBzaXplb2Yoc3RydWN0IGR4X2VudHJ5KSk7CisJCQlkeF9zZXRfY291bnQgKGVudHJpZXMsIGljb3VudDEpOworCQkJZHhfc2V0X2NvdW50IChlbnRyaWVzMiwgaWNvdW50Mik7CisJCQlkeF9zZXRfbGltaXQgKGVudHJpZXMyLCBkeF9ub2RlX2xpbWl0KGRpcikpOworCisJCQkvKiBXaGljaCBpbmRleCBibG9jayBnZXRzIHRoZSBuZXcgZW50cnk/ICovCisJCQlpZiAoYXQgLSBlbnRyaWVzID49IGljb3VudDEpIHsKKwkJCQlmcmFtZS0+YXQgPSBhdCA9IGF0IC0gZW50cmllcyAtIGljb3VudDEgKyBlbnRyaWVzMjsKKwkJCQlmcmFtZS0+ZW50cmllcyA9IGVudHJpZXMgPSBlbnRyaWVzMjsKKwkJCQlzd2FwKGZyYW1lLT5iaCwgYmgyKTsKKwkJCX0KKwkJCWR4X2luc2VydF9ibG9jayAoZnJhbWVzICsgMCwgaGFzaDIsIG5ld2Jsb2NrKTsKKwkJCWR4dHJhY2UoZHhfc2hvd19pbmRleCAoIm5vZGUiLCBmcmFtZXNbMV0uZW50cmllcykpOworCQkJZHh0cmFjZShkeF9zaG93X2luZGV4ICgibm9kZSIsCisJCQkgICAgICAgKChzdHJ1Y3QgZHhfbm9kZSAqKSBiaDItPmJfZGF0YSktPmVudHJpZXMpKTsKKwkJCWVyciA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoMik7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gam91cm5hbF9lcnJvcjsKKwkJCWJyZWxzZSAoYmgyKTsKKwkJfSBlbHNlIHsKKwkJCWR4dHJhY2UocHJpbnRrKCJDcmVhdGluZyBzZWNvbmQgbGV2ZWwgaW5kZXguLi5cbiIpKTsKKwkJCW1lbWNweSgoY2hhciAqKSBlbnRyaWVzMiwgKGNoYXIgKikgZW50cmllcywKKwkJCSAgICAgICBpY291bnQgKiBzaXplb2Yoc3RydWN0IGR4X2VudHJ5KSk7CisJCQlkeF9zZXRfbGltaXQoZW50cmllczIsIGR4X25vZGVfbGltaXQoZGlyKSk7CisKKwkJCS8qIFNldCB1cCByb290ICovCisJCQlkeF9zZXRfY291bnQoZW50cmllcywgMSk7CisJCQlkeF9zZXRfYmxvY2soZW50cmllcyArIDAsIG5ld2Jsb2NrKTsKKwkJCSgoc3RydWN0IGR4X3Jvb3QgKikgZnJhbWVzWzBdLmJoLT5iX2RhdGEpLT5pbmZvLmluZGlyZWN0X2xldmVscyA9IDE7CisKKwkJCS8qIEFkZCBuZXcgYWNjZXNzIHBhdGggZnJhbWUgKi8KKwkJCWZyYW1lID0gZnJhbWVzICsgMTsKKwkJCWZyYW1lLT5hdCA9IGF0ID0gYXQgLSBlbnRyaWVzICsgZW50cmllczI7CisJCQlmcmFtZS0+ZW50cmllcyA9IGVudHJpZXMgPSBlbnRyaWVzMjsKKwkJCWZyYW1lLT5iaCA9IGJoMjsKKwkJCWVyciA9IGV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwKKwkJCQkJCQkgICAgIGZyYW1lLT5iaCk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gam91cm5hbF9lcnJvcjsKKwkJfQorCQlleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBmcmFtZXNbMF0uYmgpOworCX0KKwlkZSA9IGRvX3NwbGl0KGhhbmRsZSwgZGlyLCAmYmgsIGZyYW1lLCAmaGluZm8sICZlcnIpOworCWlmICghZGUpCisJCWdvdG8gY2xlYW51cDsKKwllcnIgPSBhZGRfZGlyZW50X3RvX2J1ZihoYW5kbGUsIGRlbnRyeSwgaW5vZGUsIGRlLCBiaCk7CisJYmggPSBOVUxMOworCWdvdG8gY2xlYW51cDsKKworam91cm5hbF9lcnJvcjoKKwlleHQzX3N0ZF9lcnJvcihkaXItPmlfc2IsIGVycik7CitjbGVhbnVwOgorCWlmIChiaCkKKwkJYnJlbHNlKGJoKTsKKwlkeF9yZWxlYXNlKGZyYW1lcyk7CisJcmV0dXJuIGVycjsKK30KKyNlbmRpZgorCisvKgorICogZXh0M19kZWxldGVfZW50cnkgZGVsZXRlcyBhIGRpcmVjdG9yeSBlbnRyeSBieSBtZXJnaW5nIGl0IHdpdGggdGhlCisgKiBwcmV2aW91cyBlbnRyeQorICovCitzdGF0aWMgaW50IGV4dDNfZGVsZXRlX2VudHJ5IChoYW5kbGVfdCAqaGFuZGxlLCAKKwkJCSAgICAgIHN0cnVjdCBpbm9kZSAqIGRpciwKKwkJCSAgICAgIHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICogZGVfZGVsLAorCQkJICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpCit7CisJc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKiBkZSwgKiBwZGU7CisJaW50IGk7CisKKwlpID0gMDsKKwlwZGUgPSBOVUxMOworCWRlID0gKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICopIGJoLT5iX2RhdGE7CisJd2hpbGUgKGkgPCBiaC0+Yl9zaXplKSB7CisJCWlmICghZXh0M19jaGVja19kaXJfZW50cnkoImV4dDNfZGVsZXRlX2VudHJ5IiwgZGlyLCBkZSwgYmgsIGkpKQorCQkJcmV0dXJuIC1FSU87CisJCWlmIChkZSA9PSBkZV9kZWwpICB7CisJCQlCVUZGRVJfVFJBQ0UoYmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJCQlleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKKwkJCWlmIChwZGUpCisJCQkJcGRlLT5yZWNfbGVuID0KKwkJCQkJY3B1X3RvX2xlMTYobGUxNl90b19jcHUocGRlLT5yZWNfbGVuKSArCisJCQkJCQkgICAgbGUxNl90b19jcHUoZGUtPnJlY19sZW4pKTsKKwkJCWVsc2UKKwkJCQlkZS0+aW5vZGUgPSAwOworCQkJZGlyLT5pX3ZlcnNpb24rKzsKKwkJCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7CisJCQlleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpICs9IGxlMTZfdG9fY3B1KGRlLT5yZWNfbGVuKTsKKwkJcGRlID0gZGU7CisJCWRlID0gKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICopCisJCQkoKGNoYXIgKikgZGUgKyBsZTE2X3RvX2NwdShkZS0+cmVjX2xlbikpOworCX0KKwlyZXR1cm4gLUVOT0VOVDsKK30KKworLyoKKyAqIGV4dDNfbWFya19pbm9kZV9kaXJ0eSBpcyBzb21ld2hhdCBleHBlbnNpdmUsIHNvIHVubGlrZSBleHQyIHdlCisgKiBkbyBub3QgcGVyZm9ybSBpdCBpbiB0aGVzZSBmdW5jdGlvbnMuICBXZSBwZXJmb3JtIGl0IGF0IHRoZSBjYWxsIHNpdGUsCisgKiBpZiBpdCBpcyBuZWVkZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBleHQzX2luY19jb3VudChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlub2RlLT5pX25saW5rKys7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBleHQzX2RlY19jb3VudChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlub2RlLT5pX25saW5rLS07Cit9CisKK3N0YXRpYyBpbnQgZXh0M19hZGRfbm9uZGlyKGhhbmRsZV90ICpoYW5kbGUsCisJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpbnQgZXJyID0gZXh0M19hZGRfZW50cnkoaGFuZGxlLCBkZW50cnksIGlub2RlKTsKKwlpZiAoIWVycikgeworCQlleHQzX21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CisJCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJCXJldHVybiAwOworCX0KKwlleHQzX2RlY19jb3VudChoYW5kbGUsIGlub2RlKTsKKwlpcHV0KGlub2RlKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogQnkgdGhlIHRpbWUgdGhpcyBpcyBjYWxsZWQsIHdlIGFscmVhZHkgaGF2ZSBjcmVhdGVkCisgKiB0aGUgZGlyZWN0b3J5IGNhY2hlIGVudHJ5IGZvciB0aGUgbmV3IGZpbGUsIGJ1dCBpdAorICogaXMgc28gZmFyIG5lZ2F0aXZlIC0gaXQgaGFzIG5vIGlub2RlLgorICoKKyAqIElmIHRoZSBjcmVhdGUgc3VjY2VlZHMsIHdlIGZpbGwgaW4gdGhlIGlub2RlIGluZm9ybWF0aW9uCisgKiB3aXRoIGRfaW5zdGFudGlhdGUoKS4gCisgKi8KK3N0YXRpYyBpbnQgZXh0M19jcmVhdGUgKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgaW50IG1vZGUsCisJCXN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWhhbmRsZV90ICpoYW5kbGU7IAorCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCWludCBlcnIsIHJldHJpZXMgPSAwOworCityZXRyeToKKwloYW5kbGUgPSBleHQzX2pvdXJuYWxfc3RhcnQoZGlyLCBFWFQzX0RBVEFfVFJBTlNfQkxPQ0tTICsKKwkJCQkJRVhUM19JTkRFWF9FWFRSQV9UUkFOU19CTE9DS1MgKyAzICsKKwkJCQkJMipFWFQzX1FVT1RBX0lOSVRfQkxPQ0tTKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpCisJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CisKKwlpZiAoSVNfRElSU1lOQyhkaXIpKQorCQloYW5kbGUtPmhfc3luYyA9IDE7CisKKwlpbm9kZSA9IGV4dDNfbmV3X2lub2RlIChoYW5kbGUsIGRpciwgbW9kZSk7CisJZXJyID0gUFRSX0VSUihpbm9kZSk7CisJaWYgKCFJU19FUlIoaW5vZGUpKSB7CisJCWlub2RlLT5pX29wID0gJmV4dDNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9mb3AgPSAmZXh0M19maWxlX29wZXJhdGlvbnM7CisJCWV4dDNfc2V0X2FvcHMoaW5vZGUpOworCQllcnIgPSBleHQzX2FkZF9ub25kaXIoaGFuZGxlLCBkZW50cnksIGlub2RlKTsKKwl9CisJZXh0M19qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwlpZiAoZXJyID09IC1FTk9TUEMgJiYgZXh0M19zaG91bGRfcmV0cnlfYWxsb2MoZGlyLT5pX3NiLCAmcmV0cmllcykpCisJCWdvdG8gcmV0cnk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBleHQzX21rbm9kIChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCWludCBtb2RlLCBkZXZfdCByZGV2KQoreworCWhhbmRsZV90ICpoYW5kbGU7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgZXJyLCByZXRyaWVzID0gMDsKKworCWlmICghbmV3X3ZhbGlkX2RldihyZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKK3JldHJ5OgorCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydChkaXIsIEVYVDNfREFUQV9UUkFOU19CTE9DS1MgKworCQkJIAkJRVhUM19JTkRFWF9FWFRSQV9UUkFOU19CTE9DS1MgKyAzICsKKwkJCQkJMipFWFQzX1FVT1RBX0lOSVRfQkxPQ0tTKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpCisJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CisKKwlpZiAoSVNfRElSU1lOQyhkaXIpKQorCQloYW5kbGUtPmhfc3luYyA9IDE7CisKKwlpbm9kZSA9IGV4dDNfbmV3X2lub2RlIChoYW5kbGUsIGRpciwgbW9kZSk7CisJZXJyID0gUFRSX0VSUihpbm9kZSk7CisJaWYgKCFJU19FUlIoaW5vZGUpKSB7CisJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwgcmRldik7CisjaWZkZWYgQ09ORklHX0VYVDNfRlNfWEFUVFIKKwkJaW5vZGUtPmlfb3AgPSAmZXh0M19zcGVjaWFsX2lub2RlX29wZXJhdGlvbnM7CisjZW5kaWYKKwkJZXJyID0gZXh0M19hZGRfbm9uZGlyKGhhbmRsZSwgZGVudHJ5LCBpbm9kZSk7CisJfQorCWV4dDNfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJaWYgKGVyciA9PSAtRU5PU1BDICYmIGV4dDNfc2hvdWxkX3JldHJ5X2FsbG9jKGRpci0+aV9zYiwgJnJldHJpZXMpKQorCQlnb3RvIHJldHJ5OworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZXh0M19ta2RpcihzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnksIGludCBtb2RlKQoreworCWhhbmRsZV90ICpoYW5kbGU7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogZGlyX2Jsb2NrOworCXN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICogZGU7CisJaW50IGVyciwgcmV0cmllcyA9IDA7CisKKwlpZiAoZGlyLT5pX25saW5rID49IEVYVDNfTElOS19NQVgpCisJCXJldHVybiAtRU1MSU5LOworCityZXRyeToKKwloYW5kbGUgPSBleHQzX2pvdXJuYWxfc3RhcnQoZGlyLCBFWFQzX0RBVEFfVFJBTlNfQkxPQ0tTICsKKwkJCQkJRVhUM19JTkRFWF9FWFRSQV9UUkFOU19CTE9DS1MgKyAzICsKKwkJCQkJMipFWFQzX1FVT1RBX0lOSVRfQkxPQ0tTKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpCisJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CisKKwlpZiAoSVNfRElSU1lOQyhkaXIpKQorCQloYW5kbGUtPmhfc3luYyA9IDE7CisKKwlpbm9kZSA9IGV4dDNfbmV3X2lub2RlIChoYW5kbGUsIGRpciwgU19JRkRJUiB8IG1vZGUpOworCWVyciA9IFBUUl9FUlIoaW5vZGUpOworCWlmIChJU19FUlIoaW5vZGUpKQorCQlnb3RvIG91dF9zdG9wOworCisJaW5vZGUtPmlfb3AgPSAmZXh0M19kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9mb3AgPSAmZXh0M19kaXJfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9zaXplID0gRVhUM19JKGlub2RlKS0+aV9kaXNrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwlkaXJfYmxvY2sgPSBleHQzX2JyZWFkIChoYW5kbGUsIGlub2RlLCAwLCAxLCAmZXJyKTsKKwlpZiAoIWRpcl9ibG9jaykgeworCQlpbm9kZS0+aV9ubGluay0tOyAvKiBpcyB0aGlzIG5saW5rID09IDA/ICovCisJCWV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKKwkJaXB1dCAoaW5vZGUpOworCQlnb3RvIG91dF9zdG9wOworCX0KKwlCVUZGRVJfVFJBQ0UoZGlyX2Jsb2NrLCAiZ2V0X3dyaXRlX2FjY2VzcyIpOworCWV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgZGlyX2Jsb2NrKTsKKwlkZSA9IChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSBkaXJfYmxvY2stPmJfZGF0YTsKKwlkZS0+aW5vZGUgPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9pbm8pOworCWRlLT5uYW1lX2xlbiA9IDE7CisJZGUtPnJlY19sZW4gPSBjcHVfdG9fbGUxNihFWFQzX0RJUl9SRUNfTEVOKGRlLT5uYW1lX2xlbikpOworCXN0cmNweSAoZGUtPm5hbWUsICIuIik7CisJZXh0M19zZXRfZGVfdHlwZShkaXItPmlfc2IsIGRlLCBTX0lGRElSKTsKKwlkZSA9IChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKQorCQkJKChjaGFyICopIGRlICsgbGUxNl90b19jcHUoZGUtPnJlY19sZW4pKTsKKwlkZS0+aW5vZGUgPSBjcHVfdG9fbGUzMihkaXItPmlfaW5vKTsKKwlkZS0+cmVjX2xlbiA9IGNwdV90b19sZTE2KGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZS1FWFQzX0RJUl9SRUNfTEVOKDEpKTsKKwlkZS0+bmFtZV9sZW4gPSAyOworCXN0cmNweSAoZGUtPm5hbWUsICIuLiIpOworCWV4dDNfc2V0X2RlX3R5cGUoZGlyLT5pX3NiLCBkZSwgU19JRkRJUik7CisJaW5vZGUtPmlfbmxpbmsgPSAyOworCUJVRkZFUl9UUkFDRShkaXJfYmxvY2ssICJjYWxsIGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOworCWV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGRpcl9ibG9jayk7CisJYnJlbHNlIChkaXJfYmxvY2spOworCWV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKKwllcnIgPSBleHQzX2FkZF9lbnRyeSAoaGFuZGxlLCBkZW50cnksIGlub2RlKTsKKwlpZiAoZXJyKSB7CisJCWlub2RlLT5pX25saW5rID0gMDsKKwkJZXh0M19tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOworCQlpcHV0IChpbm9kZSk7CisJCWdvdG8gb3V0X3N0b3A7CisJfQorCWRpci0+aV9ubGluaysrOworCWV4dDNfdXBkYXRlX2R4X2ZsYWcoZGlyKTsKKwlleHQzX21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBkaXIpOworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CitvdXRfc3RvcDoKKwlleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOworCWlmIChlcnIgPT0gLUVOT1NQQyAmJiBleHQzX3Nob3VsZF9yZXRyeV9hbGxvYyhkaXItPmlfc2IsICZyZXRyaWVzKSkKKwkJZ290byByZXRyeTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogcm91dGluZSB0byBjaGVjayB0aGF0IHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IGlzIGVtcHR5IChmb3Igcm1kaXIpCisgKi8KK3N0YXRpYyBpbnQgZW1wdHlfZGlyIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqIGRlLCAqIGRlMTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKKwlpbnQgZXJyID0gMDsKKworCXNiID0gaW5vZGUtPmlfc2I7CisJaWYgKGlub2RlLT5pX3NpemUgPCBFWFQzX0RJUl9SRUNfTEVOKDEpICsgRVhUM19ESVJfUkVDX0xFTigyKSB8fAorCSAgICAhKGJoID0gZXh0M19icmVhZCAoTlVMTCwgaW5vZGUsIDAsIDAsICZlcnIpKSkgeworCQlpZiAoZXJyKQorCQkJZXh0M19lcnJvcihpbm9kZS0+aV9zYiwgX19GVU5DVElPTl9fLAorCQkJCSAgICJlcnJvciAlZCByZWFkaW5nIGRpcmVjdG9yeSAjJWx1IG9mZnNldCAwIiwKKwkJCQkgICBlcnIsIGlub2RlLT5pX2lubyk7CisJCWVsc2UKKwkJCWV4dDNfd2FybmluZyhpbm9kZS0+aV9zYiwgX19GVU5DVElPTl9fLAorCQkJCSAgICAgImJhZCBkaXJlY3RvcnkgKGRpciAjJWx1KSAtIG5vIGRhdGEgYmxvY2siLAorCQkJCSAgICAgaW5vZGUtPmlfaW5vKTsKKwkJcmV0dXJuIDE7CisJfQorCWRlID0gKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICopIGJoLT5iX2RhdGE7CisJZGUxID0gKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICopCisJCQkoKGNoYXIgKikgZGUgKyBsZTE2X3RvX2NwdShkZS0+cmVjX2xlbikpOworCWlmIChsZTMyX3RvX2NwdShkZS0+aW5vZGUpICE9IGlub2RlLT5pX2lubyB8fAorCQkJIWxlMzJfdG9fY3B1KGRlMS0+aW5vZGUpIHx8IAorCQkJc3RyY21wICgiLiIsIGRlLT5uYW1lKSB8fAorCQkJc3RyY21wICgiLi4iLCBkZTEtPm5hbWUpKSB7CisJICAgIAlleHQzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAiZW1wdHlfZGlyIiwKKwkJCSAgICAgICJiYWQgZGlyZWN0b3J5IChkaXIgIyVsdSkgLSBubyBgLicgb3IgYC4uJyIsCisJCQkgICAgICBpbm9kZS0+aV9pbm8pOworCQlicmVsc2UgKGJoKTsKKwkJcmV0dXJuIDE7CisJfQorCW9mZnNldCA9IGxlMTZfdG9fY3B1KGRlLT5yZWNfbGVuKSArIGxlMTZfdG9fY3B1KGRlMS0+cmVjX2xlbik7CisJZGUgPSAoc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKikKKwkJCSgoY2hhciAqKSBkZTEgKyBsZTE2X3RvX2NwdShkZTEtPnJlY19sZW4pKTsKKwl3aGlsZSAob2Zmc2V0IDwgaW5vZGUtPmlfc2l6ZSApIHsKKwkJaWYgKCFiaCB8fAorCQkJKHZvaWQgKikgZGUgPj0gKHZvaWQgKikgKGJoLT5iX2RhdGErc2ItPnNfYmxvY2tzaXplKSkgeworCQkJZXJyID0gMDsKKwkJCWJyZWxzZSAoYmgpOworCQkJYmggPSBleHQzX2JyZWFkIChOVUxMLCBpbm9kZSwKKwkJCQlvZmZzZXQgPj4gRVhUM19CTE9DS19TSVpFX0JJVFMoc2IpLCAwLCAmZXJyKTsKKwkJCWlmICghYmgpIHsKKwkJCQlpZiAoZXJyKQorCQkJCQlleHQzX2Vycm9yKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkJCQkgICAiZXJyb3IgJWQgcmVhZGluZyBkaXJlY3RvcnkiCisJCQkJCQkgICAiICMlbHUgb2Zmc2V0ICVsdSIsCisJCQkJCQkgICBlcnIsIGlub2RlLT5pX2lubywgb2Zmc2V0KTsKKwkJCQlvZmZzZXQgKz0gc2ItPnNfYmxvY2tzaXplOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZGUgPSAoc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKikgYmgtPmJfZGF0YTsKKwkJfQorCQlpZiAoIWV4dDNfY2hlY2tfZGlyX2VudHJ5KCJlbXB0eV9kaXIiLCBpbm9kZSwgZGUsIGJoLCBvZmZzZXQpKSB7CisJCQlkZSA9IChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKShiaC0+Yl9kYXRhICsKKwkJCQkJCQkgc2ItPnNfYmxvY2tzaXplKTsKKwkJCW9mZnNldCA9IChvZmZzZXQgfCAoc2ItPnNfYmxvY2tzaXplIC0gMSkpICsgMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChsZTMyX3RvX2NwdShkZS0+aW5vZGUpKSB7CisJCQlicmVsc2UgKGJoKTsKKwkJCXJldHVybiAwOworCQl9CisJCW9mZnNldCArPSBsZTE2X3RvX2NwdShkZS0+cmVjX2xlbik7CisJCWRlID0gKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICopCisJCQkJKChjaGFyICopIGRlICsgbGUxNl90b19jcHUoZGUtPnJlY19sZW4pKTsKKwl9CisJYnJlbHNlIChiaCk7CisJcmV0dXJuIDE7Cit9CisKKy8qIGV4dDNfb3JwaGFuX2FkZCgpIGxpbmtzIGFuIHVubGlua2VkIG9yIHRydW5jYXRlZCBpbm9kZSBpbnRvIGEgbGlzdCBvZgorICogc3VjaCBpbm9kZXMsIHN0YXJ0aW5nIGF0IHRoZSBzdXBlcmJsb2NrLCBpbiBjYXNlIHdlIGNyYXNoIGJlZm9yZSB0aGUKKyAqIGZpbGUgaXMgY2xvc2VkL2RlbGV0ZWQsIG9yIGluIGNhc2UgdGhlIGlub2RlIHRydW5jYXRlIHNwYW5zIG11bHRpcGxlCisgKiB0cmFuc2FjdGlvbnMgYW5kIHRoZSBsYXN0IHRyYW5zYWN0aW9uIGlzIG5vdCByZWNvdmVyZWQgYWZ0ZXIgYSBjcmFzaC4KKyAqCisgKiBBdCBmaWxlc3lzdGVtIHJlY292ZXJ5IHRpbWUsIHdlIHdhbGsgdGhpcyBsaXN0IGRlbGV0aW5nIHVubGlua2VkCisgKiBpbm9kZXMgYW5kIHRydW5jYXRpbmcgbGlua2VkIGlub2RlcyBpbiBleHQzX29ycGhhbl9jbGVhbnVwKCkuCisgKi8KK2ludCBleHQzX29ycGhhbl9hZGQoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGV4dDNfaWxvYyBpbG9jOworCWludCBlcnIgPSAwLCByYzsKKworCWxvY2tfc3VwZXIoc2IpOworCWlmICghbGlzdF9lbXB0eSgmRVhUM19JKGlub2RlKS0+aV9vcnBoYW4pKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwkvKiBPcnBoYW4gaGFuZGxpbmcgaXMgb25seSB2YWxpZCBmb3IgZmlsZXMgd2l0aCBkYXRhIGJsb2NrcworCSAqIGJlaW5nIHRydW5jYXRlZCwgb3IgZmlsZXMgYmVpbmcgdW5saW5rZWQuICovCisKKwkvKiBAQEAgRklYTUU6IE9ic2VydmF0aW9uIGZyb20gYXZpcm86CisJICogSSB0aGluayBJIGNhbiB0cmlnZ2VyIEpfQVNTRVJUIGluIGV4dDNfb3JwaGFuX2FkZCgpLiAgV2UgYmxvY2sgCisJICogaGVyZSAob24gbG9ja19zdXBlcigpKSwgc28gcmFjZSB3aXRoIGV4dDNfbGluaygpIHdoaWNoIG1pZ2h0IGJ1bXAKKwkgKiAtPmlfbmxpbmsuIEZvciwgc2F5IGl0LCBjaGFyYWN0ZXIgZGV2aWNlLiBOb3QgYSByZWd1bGFyIGZpbGUsCisJICogbm90IGEgZGlyZWN0b3J5LCBub3QgYSBzeW1saW5rIGFuZCAtPmlfbmxpbmsgPiAwLgorCSAqLworCUpfQVNTRVJUICgoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSB8fCBTX0lTRElSKGlub2RlLT5pX21vZGUpIHx8CisJCVNfSVNMTksoaW5vZGUtPmlfbW9kZSkpIHx8IGlub2RlLT5pX25saW5rID09IDApOworCisJQlVGRkVSX1RSQUNFKEVYVDNfU0Ioc2IpLT5zX3NiaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwllcnIgPSBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIEVYVDNfU0Ioc2IpLT5zX3NiaCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfdW5sb2NrOworCisJZXJyID0gZXh0M19yZXNlcnZlX2lub2RlX3dyaXRlKGhhbmRsZSwgaW5vZGUsICZpbG9jKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwkvKiBJbnNlcnQgdGhpcyBpbm9kZSBhdCB0aGUgaGVhZCBvZiB0aGUgb24tZGlzayBvcnBoYW4gbGlzdC4uLiAqLworCU5FWFRfT1JQSEFOKGlub2RlKSA9IGxlMzJfdG9fY3B1KEVYVDNfU0Ioc2IpLT5zX2VzLT5zX2xhc3Rfb3JwaGFuKTsKKwlFWFQzX1NCKHNiKS0+c19lcy0+c19sYXN0X29ycGhhbiA9IGNwdV90b19sZTMyKGlub2RlLT5pX2lubyk7CisJZXJyID0gZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgRVhUM19TQihzYiktPnNfc2JoKTsKKwlyYyA9IGV4dDNfbWFya19pbG9jX2RpcnR5KGhhbmRsZSwgaW5vZGUsICZpbG9jKTsKKwlpZiAoIWVycikKKwkJZXJyID0gcmM7CisKKwkvKiBPbmx5IGFkZCB0byB0aGUgaGVhZCBvZiB0aGUgaW4tbWVtb3J5IGxpc3QgaWYgYWxsIHRoZQorCSAqIHByZXZpb3VzIG9wZXJhdGlvbnMgc3VjY2VlZGVkLiAgSWYgdGhlIG9ycGhhbl9hZGQgaXMgZ29pbmcgdG8KKwkgKiBmYWlsIChwb3NzaWJseSB0YWtpbmcgdGhlIGpvdXJuYWwgb2ZmbGluZSksIHdlIGNhbid0IHJpc2sKKwkgKiBsZWF2aW5nIHRoZSBpbm9kZSBvbiB0aGUgb3JwaGFuIGxpc3Q6IHN0cmF5IG9ycGhhbi1saXN0CisJICogZW50cmllcyBjYW4gY2F1c2UgcGFuaWNzIGF0IHVubW91bnQgdGltZS4KKwkgKgorCSAqIFRoaXMgaXMgc2FmZTogb24gZXJyb3Igd2UncmUgZ29pbmcgdG8gaWdub3JlIHRoZSBvcnBoYW4gbGlzdAorCSAqIGFueXdheSBvbiB0aGUgbmV4dCByZWNvdmVyeS4gKi8KKwlpZiAoIWVycikKKwkJbGlzdF9hZGQoJkVYVDNfSShpbm9kZSktPmlfb3JwaGFuLCAmRVhUM19TQihzYiktPnNfb3JwaGFuKTsKKworCWpiZF9kZWJ1Zyg0LCAic3VwZXJibG9jayB3aWxsIHBvaW50IHRvICVsZFxuIiwgaW5vZGUtPmlfaW5vKTsKKwlqYmRfZGVidWcoNCwgIm9ycGhhbiBpbm9kZSAlbGQgd2lsbCBwb2ludCB0byAlZFxuIiwKKwkJCWlub2RlLT5pX2lubywgTkVYVF9PUlBIQU4oaW5vZGUpKTsKK291dF91bmxvY2s6CisJdW5sb2NrX3N1cGVyKHNiKTsKKwlleHQzX3N0ZF9lcnJvcihpbm9kZS0+aV9zYiwgZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogZXh0M19vcnBoYW5fZGVsKCkgcmVtb3ZlcyBhbiB1bmxpbmtlZCBvciB0cnVuY2F0ZWQgaW5vZGUgZnJvbSB0aGUgbGlzdAorICogb2Ygc3VjaCBpbm9kZXMgc3RvcmVkIG9uIGRpc2ssIGJlY2F1c2UgaXQgaXMgZmluYWxseSBiZWluZyBjbGVhbmVkIHVwLgorICovCitpbnQgZXh0M19vcnBoYW5fZGVsKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcHJldjsKKwlzdHJ1Y3QgZXh0M19pbm9kZV9pbmZvICplaSA9IEVYVDNfSShpbm9kZSk7CisJc3RydWN0IGV4dDNfc2JfaW5mbyAqc2JpOworCXVuc2lnbmVkIGxvbmcgaW5vX25leHQ7CisJc3RydWN0IGV4dDNfaWxvYyBpbG9jOworCWludCBlcnIgPSAwOworCisJbG9ja19zdXBlcihpbm9kZS0+aV9zYik7CisJaWYgKGxpc3RfZW1wdHkoJmVpLT5pX29ycGhhbikpIHsKKwkJdW5sb2NrX3N1cGVyKGlub2RlLT5pX3NiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaW5vX25leHQgPSBORVhUX09SUEhBTihpbm9kZSk7CisJcHJldiA9IGVpLT5pX29ycGhhbi5wcmV2OworCXNiaSA9IEVYVDNfU0IoaW5vZGUtPmlfc2IpOworCisJamJkX2RlYnVnKDQsICJyZW1vdmUgaW5vZGUgJWx1IGZyb20gb3JwaGFuIGxpc3RcbiIsIGlub2RlLT5pX2lubyk7CisKKwlsaXN0X2RlbF9pbml0KCZlaS0+aV9vcnBoYW4pOworCisJLyogSWYgd2UncmUgb24gYW4gZXJyb3IgcGF0aCwgd2UgbWF5IG5vdCBoYXZlIGEgdmFsaWQKKwkgKiB0cmFuc2FjdGlvbiBoYW5kbGUgd2l0aCB3aGljaCB0byB1cGRhdGUgdGhlIG9ycGhhbiBsaXN0IG9uCisJICogZGlzaywgYnV0IHdlIHN0aWxsIG5lZWQgdG8gcmVtb3ZlIHRoZSBpbm9kZSBmcm9tIHRoZSBsaW5rZWQKKwkgKiBsaXN0IGluIG1lbW9yeS4gKi8KKwlpZiAoIWhhbmRsZSkKKwkJZ290byBvdXQ7CisKKwllcnIgPSBleHQzX3Jlc2VydmVfaW5vZGVfd3JpdGUoaGFuZGxlLCBpbm9kZSwgJmlsb2MpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2VycjsKKworCWlmIChwcmV2ID09ICZzYmktPnNfb3JwaGFuKSB7CisJCWpiZF9kZWJ1Zyg0LCAic3VwZXJibG9jayB3aWxsIHBvaW50IHRvICVsdVxuIiwgaW5vX25leHQpOworCQlCVUZGRVJfVFJBQ0Uoc2JpLT5zX3NiaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwkJZXJyID0gZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBzYmktPnNfc2JoKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X2JyZWxzZTsKKwkJc2JpLT5zX2VzLT5zX2xhc3Rfb3JwaGFuID0gY3B1X3RvX2xlMzIoaW5vX25leHQpOworCQllcnIgPSBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBzYmktPnNfc2JoKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgZXh0M19pbG9jIGlsb2MyOworCQlzdHJ1Y3QgaW5vZGUgKmlfcHJldiA9CisJCQkmbGlzdF9lbnRyeShwcmV2LCBzdHJ1Y3QgZXh0M19pbm9kZV9pbmZvLCBpX29ycGhhbiktPnZmc19pbm9kZTsKKworCQlqYmRfZGVidWcoNCwgIm9ycGhhbiBpbm9kZSAlbHUgd2lsbCBwb2ludCB0byAlbHVcbiIsCisJCQkgIGlfcHJldi0+aV9pbm8sIGlub19uZXh0KTsKKwkJZXJyID0gZXh0M19yZXNlcnZlX2lub2RlX3dyaXRlKGhhbmRsZSwgaV9wcmV2LCAmaWxvYzIpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXRfYnJlbHNlOworCQlORVhUX09SUEhBTihpX3ByZXYpID0gaW5vX25leHQ7CisJCWVyciA9IGV4dDNfbWFya19pbG9jX2RpcnR5KGhhbmRsZSwgaV9wcmV2LCAmaWxvYzIpOworCX0KKwlpZiAoZXJyKQorCQlnb3RvIG91dF9icmVsc2U7CisJTkVYVF9PUlBIQU4oaW5vZGUpID0gMDsKKwllcnIgPSBleHQzX21hcmtfaWxvY19kaXJ0eShoYW5kbGUsIGlub2RlLCAmaWxvYyk7CisKK291dF9lcnI6CisJZXh0M19zdGRfZXJyb3IoaW5vZGUtPmlfc2IsIGVycik7CitvdXQ6CisJdW5sb2NrX3N1cGVyKGlub2RlLT5pX3NiKTsKKwlyZXR1cm4gZXJyOworCitvdXRfYnJlbHNlOgorCWJyZWxzZShpbG9jLmJoKTsKKwlnb3RvIG91dF9lcnI7Cit9CisKK3N0YXRpYyBpbnQgZXh0M19ybWRpciAoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqIGRlOworCWhhbmRsZV90ICpoYW5kbGU7CisKKwkvKiBJbml0aWFsaXplIHF1b3RhcyBiZWZvcmUgc28gdGhhdCBldmVudHVhbCB3cml0ZXMgZ28gaW4KKwkgKiBzZXBhcmF0ZSB0cmFuc2FjdGlvbiAqLworCURRVU9UX0lOSVQoZGVudHJ5LT5kX2lub2RlKTsKKwloYW5kbGUgPSBleHQzX2pvdXJuYWxfc3RhcnQoZGlyLCBFWFQzX0RFTEVURV9UUkFOU19CTE9DS1MpOworCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKKworCXJldHZhbCA9IC1FTk9FTlQ7CisJYmggPSBleHQzX2ZpbmRfZW50cnkgKGRlbnRyeSwgJmRlKTsKKwlpZiAoIWJoKQorCQlnb3RvIGVuZF9ybWRpcjsKKworCWlmIChJU19ESVJTWU5DKGRpcikpCisJCWhhbmRsZS0+aF9zeW5jID0gMTsKKworCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCisJcmV0dmFsID0gLUVJTzsKKwlpZiAobGUzMl90b19jcHUoZGUtPmlub2RlKSAhPSBpbm9kZS0+aV9pbm8pCisJCWdvdG8gZW5kX3JtZGlyOworCisJcmV0dmFsID0gLUVOT1RFTVBUWTsKKwlpZiAoIWVtcHR5X2RpciAoaW5vZGUpKQorCQlnb3RvIGVuZF9ybWRpcjsKKworCXJldHZhbCA9IGV4dDNfZGVsZXRlX2VudHJ5KGhhbmRsZSwgZGlyLCBkZSwgYmgpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZW5kX3JtZGlyOworCWlmIChpbm9kZS0+aV9ubGluayAhPSAyKQorCQlleHQzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAiZXh0M19ybWRpciIsCisJCQkgICAgICAiZW1wdHkgZGlyZWN0b3J5IGhhcyBubGluayE9MiAoJWQpIiwKKwkJCSAgICAgIGlub2RlLT5pX25saW5rKTsKKwlpbm9kZS0+aV92ZXJzaW9uKys7CisJaW5vZGUtPmlfbmxpbmsgPSAwOworCS8qIFRoZXJlJ3Mgbm8gbmVlZCB0byBzZXQgaV9kaXNrc2l6ZTogdGhlIGZhY3QgdGhhdCBpX25saW5rIGlzCisJICogemVybyB3aWxsIGVuc3VyZSB0aGF0IHRoZSByaWdodCB0aGluZyBoYXBwZW5zIGR1cmluZyBhbnkKKwkgKiByZWNvdmVyeS4gKi8KKwlpbm9kZS0+aV9zaXplID0gMDsKKwlleHQzX29ycGhhbl9hZGQoaGFuZGxlLCBpbm9kZSk7CisJaW5vZGUtPmlfY3RpbWUgPSBkaXItPmlfY3RpbWUgPSBkaXItPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCWV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKKwlkaXItPmlfbmxpbmstLTsKKwlleHQzX3VwZGF0ZV9keF9mbGFnKGRpcik7CisJZXh0M19tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgZGlyKTsKKworZW5kX3JtZGlyOgorCWV4dDNfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJYnJlbHNlIChiaCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBleHQzX3VubGluayhzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICogZGU7CisJaGFuZGxlX3QgKmhhbmRsZTsKKworCS8qIEluaXRpYWxpemUgcXVvdGFzIGJlZm9yZSBzbyB0aGF0IGV2ZW50dWFsIHdyaXRlcyBnbworCSAqIGluIHNlcGFyYXRlIHRyYW5zYWN0aW9uICovCisJRFFVT1RfSU5JVChkZW50cnktPmRfaW5vZGUpOworCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydChkaXIsIEVYVDNfREVMRVRFX1RSQU5TX0JMT0NLUyk7CisJaWYgKElTX0VSUihoYW5kbGUpKQorCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOworCisJaWYgKElTX0RJUlNZTkMoZGlyKSkKKwkJaGFuZGxlLT5oX3N5bmMgPSAxOworCisJcmV0dmFsID0gLUVOT0VOVDsKKwliaCA9IGV4dDNfZmluZF9lbnRyeSAoZGVudHJ5LCAmZGUpOworCWlmICghYmgpCisJCWdvdG8gZW5kX3VubGluazsKKworCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCisJcmV0dmFsID0gLUVJTzsKKwlpZiAobGUzMl90b19jcHUoZGUtPmlub2RlKSAhPSBpbm9kZS0+aV9pbm8pCisJCWdvdG8gZW5kX3VubGluazsKKworCWlmICghaW5vZGUtPmlfbmxpbmspIHsKKwkJZXh0M193YXJuaW5nIChpbm9kZS0+aV9zYiwgImV4dDNfdW5saW5rIiwKKwkJCSAgICAgICJEZWxldGluZyBub25leGlzdGVudCBmaWxlICglbHUpLCAlZCIsCisJCQkgICAgICBpbm9kZS0+aV9pbm8sIGlub2RlLT5pX25saW5rKTsKKwkJaW5vZGUtPmlfbmxpbmsgPSAxOworCX0KKwlyZXR2YWwgPSBleHQzX2RlbGV0ZV9lbnRyeShoYW5kbGUsIGRpciwgZGUsIGJoKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVuZF91bmxpbms7CisJZGlyLT5pX2N0aW1lID0gZGlyLT5pX210aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlleHQzX3VwZGF0ZV9keF9mbGFnKGRpcik7CisJZXh0M19tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgZGlyKTsKKwlpbm9kZS0+aV9ubGluay0tOworCWlmICghaW5vZGUtPmlfbmxpbmspCisJCWV4dDNfb3JwaGFuX2FkZChoYW5kbGUsIGlub2RlKTsKKwlpbm9kZS0+aV9jdGltZSA9IGRpci0+aV9jdGltZTsKKwlleHQzX21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CisJcmV0dmFsID0gMDsKKworZW5kX3VubGluazoKKwlleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOworCWJyZWxzZSAoYmgpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgZXh0M19zeW1saW5rIChzdHJ1Y3QgaW5vZGUgKiBkaXIsCisJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqIHN5bW5hbWUpCit7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKwlpbnQgbCwgZXJyLCByZXRyaWVzID0gMDsKKworCWwgPSBzdHJsZW4oc3ltbmFtZSkrMTsKKwlpZiAobCA+IGRpci0+aV9zYi0+c19ibG9ja3NpemUpCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCityZXRyeToKKwloYW5kbGUgPSBleHQzX2pvdXJuYWxfc3RhcnQoZGlyLCBFWFQzX0RBVEFfVFJBTlNfQkxPQ0tTICsKKwkJCSAJCUVYVDNfSU5ERVhfRVhUUkFfVFJBTlNfQkxPQ0tTICsgNSArCisJCQkJCTIqRVhUM19RVU9UQV9JTklUX0JMT0NLUyk7CisJaWYgKElTX0VSUihoYW5kbGUpKQorCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOworCisJaWYgKElTX0RJUlNZTkMoZGlyKSkKKwkJaGFuZGxlLT5oX3N5bmMgPSAxOworCisJaW5vZGUgPSBleHQzX25ld19pbm9kZSAoaGFuZGxlLCBkaXIsIFNfSUZMTkt8U19JUldYVUdPKTsKKwllcnIgPSBQVFJfRVJSKGlub2RlKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkKKwkJZ290byBvdXRfc3RvcDsKKworCWlmIChsID4gc2l6ZW9mIChFWFQzX0koaW5vZGUpLT5pX2RhdGEpKSB7CisJCWlub2RlLT5pX29wID0gJmV4dDNfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCQlleHQzX3NldF9hb3BzKGlub2RlKTsKKwkJLyoKKwkJICogcGFnZV9zeW1saW5rKCkgY2FsbHMgaW50byBleHQzX3ByZXBhcmUvY29tbWl0X3dyaXRlLgorCQkgKiBXZSBoYXZlIGEgdHJhbnNhY3Rpb24gb3Blbi4gIEFsbCBpcyBzd2VldG5lc3MuICBJdCBhbHNvIHNldHMKKwkJICogaV9zaXplIGluIGdlbmVyaWNfY29tbWl0X3dyaXRlKCkuCisJCSAqLworCQllcnIgPSBwYWdlX3N5bWxpbmsoaW5vZGUsIHN5bW5hbWUsIGwpOworCQlpZiAoZXJyKSB7CisJCQlleHQzX2RlY19jb3VudChoYW5kbGUsIGlub2RlKTsKKwkJCWV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKKwkJCWlwdXQgKGlub2RlKTsKKwkJCWdvdG8gb3V0X3N0b3A7CisJCX0KKwl9IGVsc2UgeworCQlpbm9kZS0+aV9vcCA9ICZleHQzX2Zhc3Rfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCQltZW1jcHkoKGNoYXIqKSZFWFQzX0koaW5vZGUpLT5pX2RhdGEsc3ltbmFtZSxsKTsKKwkJaW5vZGUtPmlfc2l6ZSA9IGwtMTsKKwl9CisJRVhUM19JKGlub2RlKS0+aV9kaXNrc2l6ZSA9IGlub2RlLT5pX3NpemU7CisJZXJyID0gZXh0M19hZGRfbm9uZGlyKGhhbmRsZSwgZGVudHJ5LCBpbm9kZSk7CitvdXRfc3RvcDoKKwlleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOworCWlmIChlcnIgPT0gLUVOT1NQQyAmJiBleHQzX3Nob3VsZF9yZXRyeV9hbGxvYyhkaXItPmlfc2IsICZyZXRyaWVzKSkKKwkJZ290byByZXRyeTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGV4dDNfbGluayAoc3RydWN0IGRlbnRyeSAqIG9sZF9kZW50cnksCisJCXN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWhhbmRsZV90ICpoYW5kbGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG9sZF9kZW50cnktPmRfaW5vZGU7CisJaW50IGVyciwgcmV0cmllcyA9IDA7CisKKwlpZiAoaW5vZGUtPmlfbmxpbmsgPj0gRVhUM19MSU5LX01BWCkKKwkJcmV0dXJuIC1FTUxJTks7CisKK3JldHJ5OgorCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydChkaXIsIEVYVDNfREFUQV9UUkFOU19CTE9DS1MgKworCQkJCQlFWFQzX0lOREVYX0VYVFJBX1RSQU5TX0JMT0NLUyk7CisJaWYgKElTX0VSUihoYW5kbGUpKQorCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOworCisJaWYgKElTX0RJUlNZTkMoZGlyKSkKKwkJaGFuZGxlLT5oX3N5bmMgPSAxOworCisJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCWV4dDNfaW5jX2NvdW50KGhhbmRsZSwgaW5vZGUpOworCWF0b21pY19pbmMoJmlub2RlLT5pX2NvdW50KTsKKworCWVyciA9IGV4dDNfYWRkX25vbmRpcihoYW5kbGUsIGRlbnRyeSwgaW5vZGUpOworCWV4dDNfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJaWYgKGVyciA9PSAtRU5PU1BDICYmIGV4dDNfc2hvdWxkX3JldHJ5X2FsbG9jKGRpci0+aV9zYiwgJnJldHJpZXMpKQorCQlnb3RvIHJldHJ5OworCXJldHVybiBlcnI7Cit9CisKKyNkZWZpbmUgUEFSRU5UX0lOTyhidWZmZXIpIFwKKwkoKHN0cnVjdCBleHQzX2Rpcl9lbnRyeV8yICopICgoY2hhciAqKSBidWZmZXIgKyBcCisJbGUxNl90b19jcHUoKChzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqKSBidWZmZXIpLT5yZWNfbGVuKSkpLT5pbm9kZQorCisvKgorICogQW55Ym9keSBjYW4gcmVuYW1lIGFueXRoaW5nIHdpdGggdGhpczogdGhlIHBlcm1pc3Npb24gY2hlY2tzIGFyZSBsZWZ0IHRvIHRoZQorICogaGlnaGVyLWxldmVsIHJvdXRpbmVzLgorICovCitzdGF0aWMgaW50IGV4dDNfcmVuYW1lIChzdHJ1Y3QgaW5vZGUgKiBvbGRfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAorCQkJICAgc3RydWN0IGlub2RlICogbmV3X2RpcixzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQoreworCWhhbmRsZV90ICpoYW5kbGU7CisJc3RydWN0IGlub2RlICogb2xkX2lub2RlLCAqIG5ld19pbm9kZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBvbGRfYmgsICogbmV3X2JoLCAqIGRpcl9iaDsKKwlzdHJ1Y3QgZXh0M19kaXJfZW50cnlfMiAqIG9sZF9kZSwgKiBuZXdfZGU7CisJaW50IHJldHZhbDsKKworCW9sZF9iaCA9IG5ld19iaCA9IGRpcl9iaCA9IE5VTEw7CisKKwkvKiBJbml0aWFsaXplIHF1b3RhcyBiZWZvcmUgc28gdGhhdCBldmVudHVhbCB3cml0ZXMgZ28KKwkgKiBpbiBzZXBhcmF0ZSB0cmFuc2FjdGlvbiAqLworCWlmIChuZXdfZGVudHJ5LT5kX2lub2RlKQorCQlEUVVPVF9JTklUKG5ld19kZW50cnktPmRfaW5vZGUpOworCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydChvbGRfZGlyLCAyICogRVhUM19EQVRBX1RSQU5TX0JMT0NLUyArCisJCQkgCQlFWFQzX0lOREVYX0VYVFJBX1RSQU5TX0JMT0NLUyArIDIpOworCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKKworCWlmIChJU19ESVJTWU5DKG9sZF9kaXIpIHx8IElTX0RJUlNZTkMobmV3X2RpcikpCisJCWhhbmRsZS0+aF9zeW5jID0gMTsKKworCW9sZF9iaCA9IGV4dDNfZmluZF9lbnRyeSAob2xkX2RlbnRyeSwgJm9sZF9kZSk7CisJLyoKKwkgKiAgQ2hlY2sgZm9yIGlub2RlIG51bWJlciBpcyBfbm90XyBkdWUgdG8gcG9zc2libGUgSU8gZXJyb3JzLgorCSAqICBXZSBtaWdodCBybWRpciB0aGUgc291cmNlLCBrZWVwIGl0IGFzIHB3ZCBvZiBzb21lIHByb2Nlc3MKKwkgKiAgYW5kIG1lcnJpbHkga2lsbCB0aGUgbGluayB0byB3aGF0ZXZlciB3YXMgY3JlYXRlZCB1bmRlciB0aGUKKwkgKiAgc2FtZSBuYW1lLiBHb29kYnllIHN0aWNreSBiaXQgOy08CisJICovCisJb2xkX2lub2RlID0gb2xkX2RlbnRyeS0+ZF9pbm9kZTsKKwlyZXR2YWwgPSAtRU5PRU5UOworCWlmICghb2xkX2JoIHx8IGxlMzJfdG9fY3B1KG9sZF9kZS0+aW5vZGUpICE9IG9sZF9pbm9kZS0+aV9pbm8pCisJCWdvdG8gZW5kX3JlbmFtZTsKKworCW5ld19pbm9kZSA9IG5ld19kZW50cnktPmRfaW5vZGU7CisJbmV3X2JoID0gZXh0M19maW5kX2VudHJ5IChuZXdfZGVudHJ5LCAmbmV3X2RlKTsKKwlpZiAobmV3X2JoKSB7CisJCWlmICghbmV3X2lub2RlKSB7CisJCQlicmVsc2UgKG5ld19iaCk7CisJCQluZXdfYmggPSBOVUxMOworCQl9CisJfQorCWlmIChTX0lTRElSKG9sZF9pbm9kZS0+aV9tb2RlKSkgeworCQlpZiAobmV3X2lub2RlKSB7CisJCQlyZXR2YWwgPSAtRU5PVEVNUFRZOworCQkJaWYgKCFlbXB0eV9kaXIgKG5ld19pbm9kZSkpCisJCQkJZ290byBlbmRfcmVuYW1lOworCQl9CisJCXJldHZhbCA9IC1FSU87CisJCWRpcl9iaCA9IGV4dDNfYnJlYWQgKGhhbmRsZSwgb2xkX2lub2RlLCAwLCAwLCAmcmV0dmFsKTsKKwkJaWYgKCFkaXJfYmgpCisJCQlnb3RvIGVuZF9yZW5hbWU7CisJCWlmIChsZTMyX3RvX2NwdShQQVJFTlRfSU5PKGRpcl9iaC0+Yl9kYXRhKSkgIT0gb2xkX2Rpci0+aV9pbm8pCisJCQlnb3RvIGVuZF9yZW5hbWU7CisJCXJldHZhbCA9IC1FTUxJTks7CisJCWlmICghbmV3X2lub2RlICYmIG5ld19kaXIhPW9sZF9kaXIgJiYKKwkJCQluZXdfZGlyLT5pX25saW5rID49IEVYVDNfTElOS19NQVgpCisJCQlnb3RvIGVuZF9yZW5hbWU7CisJfQorCWlmICghbmV3X2JoKSB7CisJCXJldHZhbCA9IGV4dDNfYWRkX2VudHJ5IChoYW5kbGUsIG5ld19kZW50cnksIG9sZF9pbm9kZSk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGVuZF9yZW5hbWU7CisJfSBlbHNlIHsKKwkJQlVGRkVSX1RSQUNFKG5ld19iaCwgImdldCB3cml0ZSBhY2Nlc3MiKTsKKwkJZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBuZXdfYmgpOworCQluZXdfZGUtPmlub2RlID0gY3B1X3RvX2xlMzIob2xkX2lub2RlLT5pX2lubyk7CisJCWlmIChFWFQzX0hBU19JTkNPTVBBVF9GRUFUVVJFKG5ld19kaXItPmlfc2IsCisJCQkJCSAgICAgIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9GSUxFVFlQRSkpCisJCQluZXdfZGUtPmZpbGVfdHlwZSA9IG9sZF9kZS0+ZmlsZV90eXBlOworCQluZXdfZGlyLT5pX3ZlcnNpb24rKzsKKwkJQlVGRkVSX1RSQUNFKG5ld19iaCwgImNhbGwgZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhIik7CisJCWV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIG5ld19iaCk7CisJCWJyZWxzZShuZXdfYmgpOworCQluZXdfYmggPSBOVUxMOworCX0KKworCS8qCisJICogTGlrZSBtb3N0IG90aGVyIFVuaXggc3lzdGVtcywgc2V0IHRoZSBjdGltZSBmb3IgaW5vZGVzIG9uIGEKKwkgKiByZW5hbWUuCisJICovCisJb2xkX2lub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlleHQzX21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBvbGRfaW5vZGUpOworCisJLyoKKwkgKiBvaywgdGhhdCdzIGl0CisJICovCisJaWYgKGxlMzJfdG9fY3B1KG9sZF9kZS0+aW5vZGUpICE9IG9sZF9pbm9kZS0+aV9pbm8gfHwKKwkgICAgb2xkX2RlLT5uYW1lX2xlbiAhPSBvbGRfZGVudHJ5LT5kX25hbWUubGVuIHx8CisJICAgIHN0cm5jbXAob2xkX2RlLT5uYW1lLCBvbGRfZGVudHJ5LT5kX25hbWUubmFtZSwgb2xkX2RlLT5uYW1lX2xlbikgfHwKKwkgICAgKHJldHZhbCA9IGV4dDNfZGVsZXRlX2VudHJ5KGhhbmRsZSwgb2xkX2RpciwKKwkJCQkJb2xkX2RlLCBvbGRfYmgpKSA9PSAtRU5PRU5UKSB7CisJCS8qIG9sZF9kZSBjb3VsZCBoYXZlIG1vdmVkIGZyb20gdW5kZXIgdXMgZHVyaW5nIGh0cmVlIHNwbGl0LCBzbworCQkgKiBtYWtlIHN1cmUgdGhhdCB3ZSBhcmUgZGVsZXRpbmcgdGhlIHJpZ2h0IGVudHJ5LiAgV2UgbWlnaHQKKwkJICogYWxzbyBiZSBwb2ludGluZyB0byBhIHN0YWxlIGVudHJ5IGluIHRoZSB1bnVzZWQgcGFydCBvZgorCQkgKiBvbGRfYmggc28ganVzdCBjaGVja2luZyBpbnVtIGFuZCB0aGUgbmFtZSBpc24ndCBlbm91Z2guICovCisJCXN0cnVjdCBidWZmZXJfaGVhZCAqb2xkX2JoMjsKKwkJc3RydWN0IGV4dDNfZGlyX2VudHJ5XzIgKm9sZF9kZTI7CisKKwkJb2xkX2JoMiA9IGV4dDNfZmluZF9lbnRyeShvbGRfZGVudHJ5LCAmb2xkX2RlMik7CisJCWlmIChvbGRfYmgyKSB7CisJCQlyZXR2YWwgPSBleHQzX2RlbGV0ZV9lbnRyeShoYW5kbGUsIG9sZF9kaXIsCisJCQkJCQkgICBvbGRfZGUyLCBvbGRfYmgyKTsKKwkJCWJyZWxzZShvbGRfYmgyKTsKKwkJfQorCX0KKwlpZiAocmV0dmFsKSB7CisJCWV4dDNfd2FybmluZyhvbGRfZGlyLT5pX3NiLCAiZXh0M19yZW5hbWUiLAorCQkJCSJEZWxldGluZyBvbGQgZmlsZSAoJWx1KSwgJWQsIGVycm9yPSVkIiwKKwkJCQlvbGRfZGlyLT5pX2lubywgb2xkX2Rpci0+aV9ubGluaywgcmV0dmFsKTsKKwl9CisKKwlpZiAobmV3X2lub2RlKSB7CisJCW5ld19pbm9kZS0+aV9ubGluay0tOworCQluZXdfaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCX0KKwlvbGRfZGlyLT5pX2N0aW1lID0gb2xkX2Rpci0+aV9tdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJZXh0M191cGRhdGVfZHhfZmxhZyhvbGRfZGlyKTsKKwlpZiAoZGlyX2JoKSB7CisJCUJVRkZFUl9UUkFDRShkaXJfYmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJCWV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgZGlyX2JoKTsKKwkJUEFSRU5UX0lOTyhkaXJfYmgtPmJfZGF0YSkgPSBjcHVfdG9fbGUzMihuZXdfZGlyLT5pX2lubyk7CisJCUJVRkZFUl9UUkFDRShkaXJfYmgsICJjYWxsIGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YSIpOworCQlleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBkaXJfYmgpOworCQlvbGRfZGlyLT5pX25saW5rLS07CisJCWlmIChuZXdfaW5vZGUpIHsKKwkJCW5ld19pbm9kZS0+aV9ubGluay0tOworCQl9IGVsc2UgeworCQkJbmV3X2Rpci0+aV9ubGluaysrOworCQkJZXh0M191cGRhdGVfZHhfZmxhZyhuZXdfZGlyKTsKKwkJCWV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIG5ld19kaXIpOworCQl9CisJfQorCWV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIG9sZF9kaXIpOworCWlmIChuZXdfaW5vZGUpIHsKKwkJZXh0M19tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgbmV3X2lub2RlKTsKKwkJaWYgKCFuZXdfaW5vZGUtPmlfbmxpbmspCisJCQlleHQzX29ycGhhbl9hZGQoaGFuZGxlLCBuZXdfaW5vZGUpOworCX0KKwlyZXR2YWwgPSAwOworCitlbmRfcmVuYW1lOgorCWJyZWxzZSAoZGlyX2JoKTsKKwlicmVsc2UgKG9sZF9iaCk7CisJYnJlbHNlIChuZXdfYmgpOworCWV4dDNfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIGRpcmVjdG9yaWVzIGNhbiBoYW5kbGUgbW9zdCBvcGVyYXRpb25zLi4uCisgKi8KK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGV4dDNfZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLmNyZWF0ZQkJPSBleHQzX2NyZWF0ZSwKKwkubG9va3VwCQk9IGV4dDNfbG9va3VwLAorCS5saW5rCQk9IGV4dDNfbGluaywKKwkudW5saW5rCQk9IGV4dDNfdW5saW5rLAorCS5zeW1saW5rCT0gZXh0M19zeW1saW5rLAorCS5ta2RpcgkJPSBleHQzX21rZGlyLAorCS5ybWRpcgkJPSBleHQzX3JtZGlyLAorCS5ta25vZAkJPSBleHQzX21rbm9kLAorCS5yZW5hbWUJCT0gZXh0M19yZW5hbWUsCisJLnNldGF0dHIJPSBleHQzX3NldGF0dHIsCisjaWZkZWYgQ09ORklHX0VYVDNfRlNfWEFUVFIKKwkuc2V0eGF0dHIJPSBnZW5lcmljX3NldHhhdHRyLAorCS5nZXR4YXR0cgk9IGdlbmVyaWNfZ2V0eGF0dHIsCisJLmxpc3R4YXR0cgk9IGV4dDNfbGlzdHhhdHRyLAorCS5yZW1vdmV4YXR0cgk9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCisjZW5kaWYKKwkucGVybWlzc2lvbgk9IGV4dDNfcGVybWlzc2lvbiwKK307CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGV4dDNfc3BlY2lhbF9pbm9kZV9vcGVyYXRpb25zID0geworCS5zZXRhdHRyCT0gZXh0M19zZXRhdHRyLAorI2lmZGVmIENPTkZJR19FWFQzX0ZTX1hBVFRSCisJLnNldHhhdHRyCT0gZ2VuZXJpY19zZXR4YXR0ciwKKwkuZ2V0eGF0dHIJPSBnZW5lcmljX2dldHhhdHRyLAorCS5saXN0eGF0dHIJPSBleHQzX2xpc3R4YXR0ciwKKwkucmVtb3ZleGF0dHIJPSBnZW5lcmljX3JlbW92ZXhhdHRyLAorI2VuZGlmCisJLnBlcm1pc3Npb24JPSBleHQzX3Blcm1pc3Npb24sCit9OyAKZGlmZiAtLWdpdCBhL2ZzL2V4dDMvcmVzaXplLmMgYi9mcy9leHQzL3Jlc2l6ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjOWY4MTIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQzL3Jlc2l6ZS5jCkBAIC0wLDAgKzEsOTk2IEBACisvKgorICogIGxpbnV4L2ZzL2V4dDMvcmVzaXplLmMKKyAqCisgKiBTdXBwb3J0IGZvciByZXNpemluZyBhbiBleHQzIGZpbGVzeXN0ZW0gd2hpbGUgaXQgaXMgbW91bnRlZC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgQW5kcmVhcyBEaWxnZXIgPGFkaWxnZXJAY2x1c3RlcmZzLmNvbT4KKyAqCisgKiBUaGlzIGNvdWxkIHByb2JhYmx5IGJlIG1hZGUgaW50byBhIG1vZHVsZSwgYmVjYXVzZSBpdCBpcyBub3Qgb2Z0ZW4gaW4gdXNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2RlZmluZSBFWFQzRlNfREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9leHQzX2piZC5oPgorCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKworI2RlZmluZSBvdXRzaWRlKGIsIGZpcnN0LCBsYXN0KQkoKGIpIDwgKGZpcnN0KSB8fCAoYikgPj0gKGxhc3QpKQorI2RlZmluZSBpbnNpZGUoYiwgZmlyc3QsIGxhc3QpCSgoYikgPj0gKGZpcnN0KSAmJiAoYikgPCAobGFzdCkpCisKK3N0YXRpYyBpbnQgdmVyaWZ5X2dyb3VwX2lucHV0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkgICAgICBzdHJ1Y3QgZXh0M19uZXdfZ3JvdXBfZGF0YSAqaW5wdXQpCit7CisJc3RydWN0IGV4dDNfc2JfaW5mbyAqc2JpID0gRVhUM19TQihzYik7CisJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKmVzID0gc2JpLT5zX2VzOworCXVuc2lnbmVkIHN0YXJ0ID0gbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KTsKKwl1bnNpZ25lZCBlbmQgPSBzdGFydCArIGlucHV0LT5ibG9ja3NfY291bnQ7CisJdW5zaWduZWQgZ3JvdXAgPSBpbnB1dC0+Z3JvdXA7CisJdW5zaWduZWQgaXRlbmQgPSBpbnB1dC0+aW5vZGVfdGFibGUgKyBFWFQzX1NCKHNiKS0+c19pdGJfcGVyX2dyb3VwOworCXVuc2lnbmVkIG92ZXJoZWFkID0gZXh0M19iZ19oYXNfc3VwZXIoc2IsIGdyb3VwKSA/CisJCSgxICsgZXh0M19iZ19udW1fZ2RiKHNiLCBncm91cCkgKworCQkgbGUxNl90b19jcHUoZXMtPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrcykpIDogMDsKKwl1bnNpZ25lZCBtZXRhZW5kID0gc3RhcnQgKyBvdmVyaGVhZDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwlpbnQgZnJlZV9ibG9ja3NfY291bnQ7CisJaW50IGVyciA9IC1FSU5WQUw7CisKKwlpbnB1dC0+ZnJlZV9ibG9ja3NfY291bnQgPSBmcmVlX2Jsb2Nrc19jb3VudCA9CisJCWlucHV0LT5ibG9ja3NfY291bnQgLSAyIC0gb3ZlcmhlYWQgLSBzYmktPnNfaXRiX3Blcl9ncm91cDsKKworCWlmICh0ZXN0X29wdChzYiwgREVCVUcpKQorCQlwcmludGsoS0VSTl9ERUJVRyAiRVhUMy1mczogYWRkaW5nICVzIGdyb3VwICV1OiAldSBibG9ja3MgIgorCQkgICAgICAgIiglZCBmcmVlLCAldSByZXNlcnZlZClcbiIsCisJCSAgICAgICBleHQzX2JnX2hhc19zdXBlcihzYiwgaW5wdXQtPmdyb3VwKSA/ICJub3JtYWwiIDoKKwkJICAgICAgICJuby1zdXBlciIsIGlucHV0LT5ncm91cCwgaW5wdXQtPmJsb2Nrc19jb3VudCwKKwkJICAgICAgIGZyZWVfYmxvY2tzX2NvdW50LCBpbnB1dC0+cmVzZXJ2ZWRfYmxvY2tzKTsKKworCWlmIChncm91cCAhPSBzYmktPnNfZ3JvdXBzX2NvdW50KQorCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgIkNhbm5vdCBhZGQgYXQgZ3JvdXAgJXUgKG9ubHkgJWx1IGdyb3VwcykiLAorCQkJICAgICBpbnB1dC0+Z3JvdXAsIHNiaS0+c19ncm91cHNfY291bnQpOworCWVsc2UgaWYgKChzdGFydCAtIGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2RhdGFfYmxvY2spKSAlCisJCSBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpKQorCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywgIkxhc3QgZ3JvdXAgbm90IGZ1bGwiKTsKKwllbHNlIGlmIChpbnB1dC0+cmVzZXJ2ZWRfYmxvY2tzID4gaW5wdXQtPmJsb2Nrc19jb3VudCAvIDUpCisJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLCAiUmVzZXJ2ZWQgYmxvY2tzIHRvbyBoaWdoICgldSkiLAorCQkJICAgICBpbnB1dC0+cmVzZXJ2ZWRfYmxvY2tzKTsKKwllbHNlIGlmIChmcmVlX2Jsb2Nrc19jb3VudCA8IDApCisJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLCAiQmFkIGJsb2NrcyBjb3VudCAldSIsCisJCQkgICAgIGlucHV0LT5ibG9ja3NfY291bnQpOworCWVsc2UgaWYgKCEoYmggPSBzYl9icmVhZChzYiwgZW5kIC0gMSkpKQorCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywgIkNhbm5vdCByZWFkIGxhc3QgYmxvY2sgKCV1KSIsCisJCQkgICAgIGVuZCAtIDEpOworCWVsc2UgaWYgKG91dHNpZGUoaW5wdXQtPmJsb2NrX2JpdG1hcCwgc3RhcnQsIGVuZCkpCisJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAiQmxvY2sgYml0bWFwIG5vdCBpbiBncm91cCAoYmxvY2sgJXUpIiwKKwkJCSAgICAgaW5wdXQtPmJsb2NrX2JpdG1hcCk7CisJZWxzZSBpZiAob3V0c2lkZShpbnB1dC0+aW5vZGVfYml0bWFwLCBzdGFydCwgZW5kKSkKKwkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgICJJbm9kZSBiaXRtYXAgbm90IGluIGdyb3VwIChibG9jayAldSkiLAorCQkJICAgICBpbnB1dC0+aW5vZGVfYml0bWFwKTsKKwllbHNlIGlmIChvdXRzaWRlKGlucHV0LT5pbm9kZV90YWJsZSwgc3RhcnQsIGVuZCkgfHwKKwkgICAgICAgICBvdXRzaWRlKGl0ZW5kIC0gMSwgc3RhcnQsIGVuZCkpCisJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAiSW5vZGUgdGFibGUgbm90IGluIGdyb3VwIChibG9ja3MgJXUtJXUpIiwKKwkJCSAgICAgaW5wdXQtPmlub2RlX3RhYmxlLCBpdGVuZCAtIDEpOworCWVsc2UgaWYgKGlucHV0LT5pbm9kZV9iaXRtYXAgPT0gaW5wdXQtPmJsb2NrX2JpdG1hcCkKKwkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgICJCbG9jayBiaXRtYXAgc2FtZSBhcyBpbm9kZSBiaXRtYXAgKCV1KSIsCisJCQkgICAgIGlucHV0LT5ibG9ja19iaXRtYXApOworCWVsc2UgaWYgKGluc2lkZShpbnB1dC0+YmxvY2tfYml0bWFwLCBpbnB1dC0+aW5vZGVfdGFibGUsIGl0ZW5kKSkKKwkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgICJCbG9jayBiaXRtYXAgKCV1KSBpbiBpbm9kZSB0YWJsZSAoJXUtJXUpIiwKKwkJCSAgICAgaW5wdXQtPmJsb2NrX2JpdG1hcCwgaW5wdXQtPmlub2RlX3RhYmxlLCBpdGVuZC0xKTsKKwllbHNlIGlmIChpbnNpZGUoaW5wdXQtPmlub2RlX2JpdG1hcCwgaW5wdXQtPmlub2RlX3RhYmxlLCBpdGVuZCkpCisJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAiSW5vZGUgYml0bWFwICgldSkgaW4gaW5vZGUgdGFibGUgKCV1LSV1KSIsCisJCQkgICAgIGlucHV0LT5pbm9kZV9iaXRtYXAsIGlucHV0LT5pbm9kZV90YWJsZSwgaXRlbmQtMSk7CisJZWxzZSBpZiAoaW5zaWRlKGlucHV0LT5ibG9ja19iaXRtYXAsIHN0YXJ0LCBtZXRhZW5kKSkKKwkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgICJCbG9jayBiaXRtYXAgKCV1KSBpbiBHRFQgdGFibGUgKCV1LSV1KSIsCisJCQkgICAgIGlucHV0LT5ibG9ja19iaXRtYXAsIHN0YXJ0LCBtZXRhZW5kIC0gMSk7CisJZWxzZSBpZiAoaW5zaWRlKGlucHV0LT5pbm9kZV9iaXRtYXAsIHN0YXJ0LCBtZXRhZW5kKSkKKwkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgICJJbm9kZSBiaXRtYXAgKCV1KSBpbiBHRFQgdGFibGUgKCV1LSV1KSIsCisJCQkgICAgIGlucHV0LT5pbm9kZV9iaXRtYXAsIHN0YXJ0LCBtZXRhZW5kIC0gMSk7CisJZWxzZSBpZiAoaW5zaWRlKGlucHV0LT5pbm9kZV90YWJsZSwgc3RhcnQsIG1ldGFlbmQpIHx8CisJICAgICAgICAgaW5zaWRlKGl0ZW5kIC0gMSwgc3RhcnQsIG1ldGFlbmQpKQorCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKKwkJCSAgICAgIklub2RlIHRhYmxlICgldS0ldSkgb3ZlcmxhcHMgR0RUIHRhYmxlICgldS0ldSkiLAorCQkJICAgICBpbnB1dC0+aW5vZGVfdGFibGUsIGl0ZW5kIC0gMSwgc3RhcnQsIG1ldGFlbmQgLSAxKTsKKwllbHNlCisJCWVyciA9IDA7CisJYnJlbHNlKGJoKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJjbGVhbihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgdW5zaWduZWQgbG9uZyBibGspCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlpbnQgZXJyOworCisJYmggPSBzYl9nZXRibGsoc2IsIGJsayk7CisJaWYgKChlcnIgPSBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKSkpIHsKKwkJYnJlbHNlKGJoKTsKKwkJYmggPSBFUlJfUFRSKGVycik7CisJfSBlbHNlIHsKKwkJbG9ja19idWZmZXIoYmgpOworCQltZW1zZXQoYmgtPmJfZGF0YSwgMCwgc2ItPnNfYmxvY2tzaXplKTsKKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCXVubG9ja19idWZmZXIoYmgpOworCX0KKworCXJldHVybiBiaDsKK30KKworLyoKKyAqIFRvIGF2b2lkIGNhbGxpbmcgdGhlIGF0b21pYyBzZXRiaXQgaHVuZHJlZHMgb3IgdGhvdXNhbmRzIG9mIHRpbWVzLCB3ZSBvbmx5CisgKiBuZWVkIHRvIHVzZSBpdCB3aXRoaW4gYSBzaW5nbGUgYnl0ZSAodG8gZW5zdXJlIHdlIGdldCBlbmRpYW5uZXNzIHJpZ2h0KS4KKyAqIFdlIGNhbiB1c2UgbWVtc2V0IGZvciB0aGUgcmVzdCBvZiB0aGUgYml0bWFwIGFzIHRoZXJlIGFyZSBubyBvdGhlciB1c2Vycy4KKyAqLworc3RhdGljIHZvaWQgbWFya19iaXRtYXBfZW5kKGludCBzdGFydF9iaXQsIGludCBlbmRfYml0LCBjaGFyICpiaXRtYXApCit7CisJaW50IGk7CisKKwlpZiAoc3RhcnRfYml0ID49IGVuZF9iaXQpCisJCXJldHVybjsKKworCWV4dDNfZGVidWcoIm1hcmsgZW5kIGJpdHMgKyVkIHRocm91Z2ggKyVkIHVzZWRcbiIsIHN0YXJ0X2JpdCwgZW5kX2JpdCk7CisJZm9yIChpID0gc3RhcnRfYml0OyBpIDwgKChzdGFydF9iaXQgKyA3KSAmIH43VUwpOyBpKyspCisJCWV4dDNfc2V0X2JpdChpLCBiaXRtYXApOworCWlmIChpIDwgZW5kX2JpdCkKKwkJbWVtc2V0KGJpdG1hcCArIChpID4+IDMpLCAweGZmLCAoZW5kX2JpdCAtIGkpID4+IDMpOworfQorCisvKgorICogU2V0IHVwIHRoZSBibG9jayBhbmQgaW5vZGUgYml0bWFwcywgYW5kIHRoZSBpbm9kZSB0YWJsZSBmb3IgdGhlIG5ldyBncm91cC4KKyAqIFRoaXMgZG9lc24ndCBuZWVkIHRvIGJlIHBhcnQgb2YgdGhlIG1haW4gdHJhbnNhY3Rpb24sIHNpbmNlIHdlIGFyZSBvbmx5CisgKiBjaGFuZ2luZyBibG9ja3Mgb3V0c2lkZSB0aGUgYWN0dWFsIGZpbGVzeXN0ZW0uICBXZSBzdGlsbCBkbyBqb3VybmFsaW5nIHRvCisgKiBlbnN1cmUgdGhlIHJlY292ZXJ5IGlzIGNvcnJlY3QgaW4gY2FzZSBvZiBhIGZhaWx1cmUganVzdCBhZnRlciByZXNpemUuCisgKiBJZiBhbnkgcGFydCBvZiB0aGlzIGZhaWxzLCB3ZSBzaW1wbHkgYWJvcnQgdGhlIHJlc2l6ZS4KKyAqLworc3RhdGljIGludCBzZXR1cF9uZXdfZ3JvdXBfYmxvY2tzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICBzdHJ1Y3QgZXh0M19uZXdfZ3JvdXBfZGF0YSAqaW5wdXQpCit7CisJc3RydWN0IGV4dDNfc2JfaW5mbyAqc2JpID0gRVhUM19TQihzYik7CisJdW5zaWduZWQgbG9uZyBzdGFydCA9IGlucHV0LT5ncm91cCAqIHNiaS0+c19ibG9ja3NfcGVyX2dyb3VwICsKKwkJbGUzMl90b19jcHUoc2JpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spOworCWludCByZXNlcnZlZF9nZGIgPSBleHQzX2JnX2hhc19zdXBlcihzYiwgaW5wdXQtPmdyb3VwKSA/CisJCWxlMTZfdG9fY3B1KHNiaS0+c19lcy0+c19yZXNlcnZlZF9nZHRfYmxvY2tzKSA6IDA7CisJdW5zaWduZWQgbG9uZyBnZGJsb2NrcyA9IGV4dDNfYmdfbnVtX2dkYihzYiwgaW5wdXQtPmdyb3VwKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWhhbmRsZV90ICpoYW5kbGU7CisJdW5zaWduZWQgbG9uZyBibG9jazsKKwlpbnQgYml0OworCWludCBpOworCWludCBlcnIgPSAwLCBlcnIyOworCisJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0X3NiKHNiLCByZXNlcnZlZF9nZGIgKyBnZGJsb2NrcyArCisJCQkJICAgICAgIDIgKyBzYmktPnNfaXRiX3Blcl9ncm91cCk7CisJaWYgKElTX0VSUihoYW5kbGUpKQorCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOworCisJbG9ja19zdXBlcihzYik7CisJaWYgKGlucHV0LT5ncm91cCAhPSBzYmktPnNfZ3JvdXBzX2NvdW50KSB7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBleGl0X2pvdXJuYWw7CisJfQorCisJaWYgKElTX0VSUihiaCA9IGJjbGVhbihoYW5kbGUsIHNiLCBpbnB1dC0+YmxvY2tfYml0bWFwKSkpIHsKKwkJZXJyID0gUFRSX0VSUihiaCk7CisJCWdvdG8gZXhpdF9qb3VybmFsOworCX0KKworCWlmIChleHQzX2JnX2hhc19zdXBlcihzYiwgaW5wdXQtPmdyb3VwKSkgeworCQlleHQzX2RlYnVnKCJtYXJrIGJhY2t1cCBzdXBlcmJsb2NrICUjMDRseCAoKzApXG4iLCBzdGFydCk7CisJCWV4dDNfc2V0X2JpdCgwLCBiaC0+Yl9kYXRhKTsKKwl9CisKKwkvKiBDb3B5IGFsbCBvZiB0aGUgR0RUIGJsb2NrcyBpbnRvIHRoZSBiYWNrdXAgaW4gdGhpcyBncm91cCAqLworCWZvciAoaSA9IDAsIGJpdCA9IDEsIGJsb2NrID0gc3RhcnQgKyAxOworCSAgICAgaSA8IGdkYmxvY2tzOyBpKyssIGJsb2NrKyssIGJpdCsrKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqZ2RiOworCisJCWV4dDNfZGVidWcoInVwZGF0ZSBiYWNrdXAgZ3JvdXAgJSMwNGx4ICgrJWQpXG4iLCBibG9jaywgYml0KTsKKworCQlnZGIgPSBzYl9nZXRibGsoc2IsIGJsb2NrKTsKKwkJaWYgKChlcnIgPSBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGdkYikpKSB7CisJCQlicmVsc2UoZ2RiKTsKKwkJCWdvdG8gZXhpdF9iaDsKKwkJfQorCQlsb2NrX2J1ZmZlcihiaCk7CisJCW1lbWNweShnZGItPmJfZGF0YSwgc2JpLT5zX2dyb3VwX2Rlc2NbaV0sIGJoLT5iX3NpemUpOworCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGdkYik7CisJCXVubG9ja19idWZmZXIoYmgpOworCQlleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBnZGIpOworCQlleHQzX3NldF9iaXQoYml0LCBiaC0+Yl9kYXRhKTsKKwkJYnJlbHNlKGdkYik7CisJfQorCisJLyogWmVybyBvdXQgYWxsIG9mIHRoZSByZXNlcnZlZCBiYWNrdXAgZ3JvdXAgZGVzY3JpcHRvciB0YWJsZSBibG9ja3MgKi8KKwlmb3IgKGkgPSAwLCBiaXQgPSBnZGJsb2NrcyArIDEsIGJsb2NrID0gc3RhcnQgKyBiaXQ7CisJICAgICBpIDwgcmVzZXJ2ZWRfZ2RiOyBpKyssIGJsb2NrKyssIGJpdCsrKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqZ2RiOworCisJCWV4dDNfZGVidWcoImNsZWFyIHJlc2VydmVkIGJsb2NrICUjMDRseCAoKyVkKVxuIiwgYmxvY2ssIGJpdCk7CisKKwkJaWYgKElTX0VSUihnZGIgPSBiY2xlYW4oaGFuZGxlLCBzYiwgYmxvY2spKSkgeworCQkJZXJyID0gUFRSX0VSUihiaCk7CisJCQlnb3RvIGV4aXRfYmg7CisJCX0KKwkJZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZ2RiKTsKKwkJZXh0M19zZXRfYml0KGJpdCwgYmgtPmJfZGF0YSk7CisJCWJyZWxzZShnZGIpOworCX0KKwlleHQzX2RlYnVnKCJtYXJrIGJsb2NrIGJpdG1hcCAlIzA0eCAoKyVsZClcbiIsIGlucHV0LT5ibG9ja19iaXRtYXAsCisJCSAgIGlucHV0LT5ibG9ja19iaXRtYXAgLSBzdGFydCk7CisJZXh0M19zZXRfYml0KGlucHV0LT5ibG9ja19iaXRtYXAgLSBzdGFydCwgYmgtPmJfZGF0YSk7CisJZXh0M19kZWJ1ZygibWFyayBpbm9kZSBiaXRtYXAgJSMwNHggKCslbGQpXG4iLCBpbnB1dC0+aW5vZGVfYml0bWFwLAorCQkgICBpbnB1dC0+aW5vZGVfYml0bWFwIC0gc3RhcnQpOworCWV4dDNfc2V0X2JpdChpbnB1dC0+aW5vZGVfYml0bWFwIC0gc3RhcnQsIGJoLT5iX2RhdGEpOworCisJLyogWmVybyBvdXQgYWxsIG9mIHRoZSBpbm9kZSB0YWJsZSBibG9ja3MgKi8KKwlmb3IgKGkgPSAwLCBibG9jayA9IGlucHV0LT5pbm9kZV90YWJsZSwgYml0ID0gYmxvY2sgLSBzdGFydDsKKwkgICAgIGkgPCBzYmktPnNfaXRiX3Blcl9ncm91cDsgaSsrLCBiaXQrKywgYmxvY2srKykgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKml0OworCisJCWV4dDNfZGVidWcoImNsZWFyIGlub2RlIGJsb2NrICUjMDR4ICgrJWxkKVxuIiwgYmxvY2ssIGJpdCk7CisJCWlmIChJU19FUlIoaXQgPSBiY2xlYW4oaGFuZGxlLCBzYiwgYmxvY2spKSkgeworCQkJZXJyID0gUFRSX0VSUihpdCk7CisJCQlnb3RvIGV4aXRfYmg7CisJCX0KKwkJZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaXQpOworCQlicmVsc2UoaXQpOworCQlleHQzX3NldF9iaXQoYml0LCBiaC0+Yl9kYXRhKTsKKwl9CisJbWFya19iaXRtYXBfZW5kKGlucHV0LT5ibG9ja3NfY291bnQsIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYiksCisJCQliaC0+Yl9kYXRhKTsKKwlleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJYnJlbHNlKGJoKTsKKworCS8qIE1hcmsgdW51c2VkIGVudHJpZXMgaW4gaW5vZGUgYml0bWFwIHVzZWQgKi8KKwlleHQzX2RlYnVnKCJjbGVhciBpbm9kZSBiaXRtYXAgJSMwNHggKCslbGQpXG4iLAorCQkgICBpbnB1dC0+aW5vZGVfYml0bWFwLCBpbnB1dC0+aW5vZGVfYml0bWFwIC0gc3RhcnQpOworCWlmIChJU19FUlIoYmggPSBiY2xlYW4oaGFuZGxlLCBzYiwgaW5wdXQtPmlub2RlX2JpdG1hcCkpKSB7CisJCWVyciA9IFBUUl9FUlIoYmgpOworCQlnb3RvIGV4aXRfam91cm5hbDsKKwl9CisKKwltYXJrX2JpdG1hcF9lbmQoRVhUM19JTk9ERVNfUEVSX0dST1VQKHNiKSwgRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKSwKKwkJCWJoLT5iX2RhdGEpOworCWV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKK2V4aXRfYmg6CisJYnJlbHNlKGJoKTsKKworZXhpdF9qb3VybmFsOgorCXVubG9ja19zdXBlcihzYik7CisJaWYgKChlcnIyID0gZXh0M19qb3VybmFsX3N0b3AoaGFuZGxlKSkgJiYgIWVycikKKwkJZXJyID0gZXJyMjsKKworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBJdGVyYXRlIHRocm91Z2ggdGhlIGdyb3VwcyB3aGljaCBob2xkIEJBQ0tVUCBzdXBlcmJsb2NrL0dEVCBjb3BpZXMgaW4gYW4KKyAqIGV4dDMgZmlsZXN5c3RlbS4gIFRoZSBjb3VudGVycyBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgdG8gMSwgNSwgYW5kIDcgYmVmb3JlCisgKiBjYWxsaW5nIHRoaXMgZm9yIHRoZSBmaXJzdCB0aW1lLiAgSW4gYSBzcGFyc2UgZmlsZXN5c3RlbSBpdCB3aWxsIGJlIHRoZQorICogc2VxdWVuY2Ugb2YgcG93ZXJzIG9mIDMsIDUsIGFuZCA3OiAxLCAzLCA1LCA3LCA5LCAyNSwgMjcsIDQ5LCA4MSwgLi4uCisgKiBGb3IgYSBub24tc3BhcnNlIGZpbGVzeXN0ZW0gaXQgd2lsbCBiZSBldmVyeSBncm91cDogMSwgMiwgMywgNCwgLi4uCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBleHQzX2xpc3RfYmFja3VwcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCAqdGhyZWUsCisJCQkJICB1bnNpZ25lZCAqZml2ZSwgdW5zaWduZWQgKnNldmVuKQoreworCXVuc2lnbmVkICptaW4gPSB0aHJlZTsKKwlpbnQgbXVsdCA9IDM7CisJdW5zaWduZWQgcmV0OworCisJaWYgKCFFWFQzX0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwKKwkJCQkJRVhUM19GRUFUVVJFX1JPX0NPTVBBVF9TUEFSU0VfU1VQRVIpKSB7CisJCXJldCA9ICptaW47CisJCSptaW4gKz0gMTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoKmZpdmUgPCAqbWluKSB7CisJCW1pbiA9IGZpdmU7CisJCW11bHQgPSA1OworCX0KKwlpZiAoKnNldmVuIDwgKm1pbikgeworCQltaW4gPSBzZXZlbjsKKwkJbXVsdCA9IDc7CisJfQorCisJcmV0ID0gKm1pbjsKKwkqbWluICo9IG11bHQ7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogQ2hlY2sgdGhhdCBhbGwgb2YgdGhlIGJhY2t1cCBHRFQgYmxvY2tzIGFyZSBoZWxkIGluIHRoZSBwcmltYXJ5IEdEVCBibG9jay4KKyAqIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGV5IGFyZSBzdG9yZWQgaW4gZ3JvdXAgb3JkZXIuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YKKyAqIGdyb3VwcyBpbiBjdXJyZW50IGZpbGVzeXN0ZW0gdGhhdCBoYXZlIEJBQ0tVUFMsIG9yIC12ZSBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW50IHZlcmlmeV9yZXNlcnZlZF9nZGIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnByaW1hcnkpCit7CisJY29uc3QgdW5zaWduZWQgbG9uZyBibGsgPSBwcmltYXJ5LT5iX2Jsb2NrbnI7CisJY29uc3QgdW5zaWduZWQgbG9uZyBlbmQgPSBFWFQzX1NCKHNiKS0+c19ncm91cHNfY291bnQ7CisJdW5zaWduZWQgdGhyZWUgPSAxOworCXVuc2lnbmVkIGZpdmUgPSA1OworCXVuc2lnbmVkIHNldmVuID0gNzsKKwl1bnNpZ25lZCBncnA7CisJX191MzIgKnAgPSAoX191MzIgKilwcmltYXJ5LT5iX2RhdGE7CisJaW50IGdkYmFja3VwcyA9IDA7CisKKwl3aGlsZSAoKGdycCA9IGV4dDNfbGlzdF9iYWNrdXBzKHNiLCAmdGhyZWUsICZmaXZlLCAmc2V2ZW4pKSA8IGVuZCkgeworCQlpZiAobGUzMl90b19jcHUoKnArKykgIT0gZ3JwICogRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKSArIGJsayl7CisJCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkgICAgICJyZXNlcnZlZCBHRFQgJWxkIG1pc3NpbmcgZ3JwICVkICglbGQpXG4iLAorCQkJCSAgICAgYmxrLCBncnAsCisJCQkJICAgICBncnAgKiBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpICsgYmxrKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmICgrK2dkYmFja3VwcyA+IEVYVDNfQUREUl9QRVJfQkxPQ0soc2IpKQorCQkJcmV0dXJuIC1FRkJJRzsKKwl9CisKKwlyZXR1cm4gZ2RiYWNrdXBzOworfQorCisvKgorICogQ2FsbGVkIHdoZW4gd2UgbmVlZCB0byBicmluZyBhIHJlc2VydmVkIGdyb3VwIGRlc2NyaXB0b3IgdGFibGUgYmxvY2sgaW50bworICogdXNlIGZyb20gdGhlIHJlc2l6ZSBpbm9kZS4gIFRoZSBwcmltYXJ5IGNvcHkgb2YgdGhlIG5ldyBHRFQgYmxvY2sgY3VycmVudGx5CisgKiBpcyBhbiBpbmRpcmVjdCBibG9jayAodW5kZXIgdGhlIGRvdWJsZSBpbmRpcmVjdCBibG9jayBpbiB0aGUgcmVzaXplIGlub2RlKS4KKyAqIFRoZSBuZXcgYmFja3VwIEdEVCBibG9ja3Mgd2lsbCBiZSBzdG9yZWQgYXMgbGVhZiBibG9ja3MgaW4gdGhpcyBpbmRpcmVjdAorICogYmxvY2ssIGluIGdyb3VwIG9yZGVyLiAgRXZlbiB0aG91Z2ggd2Uga25vdyBhbGwgdGhlIGJsb2NrIG51bWJlcnMgd2UgbmVlZCwKKyAqIHdlIGNoZWNrIHRvIGVuc3VyZSB0aGF0IHRoZSByZXNpemUgaW5vZGUgaGFzIGFjdHVhbGx5IHJlc2VydmVkIHRoZXNlIGJsb2Nrcy4KKyAqCisgKiBEb24ndCBuZWVkIHRvIHVwZGF0ZSB0aGUgYmxvY2sgYml0bWFwcyBiZWNhdXNlIHRoZSBibG9ja3MgYXJlIHN0aWxsIGluIHVzZS4KKyAqCisgKiBXZSBnZXQgYWxsIG9mIHRoZSBlcnJvciBjYXNlcyBvdXQgb2YgdGhlIHdheSwgc28gdGhhdCB3ZSBhcmUgc3VyZSB0byBub3QKKyAqIGZhaWwgb25jZSB3ZSBzdGFydCBtb2RpZnlpbmcgdGhlIGRhdGEgb24gZGlzaywgYmVjYXVzZSBKQkQgaGFzIG5vIHJvbGxiYWNrLgorICovCitzdGF0aWMgaW50IGFkZF9uZXdfZ2RiKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCSAgICAgICBzdHJ1Y3QgZXh0M19uZXdfZ3JvdXBfZGF0YSAqaW5wdXQsCisJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipwcmltYXJ5KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqZXMgPSBFWFQzX1NCKHNiKS0+c19lczsKKwl1bnNpZ25lZCBsb25nIGdkYl9udW0gPSBpbnB1dC0+Z3JvdXAgLyBFWFQzX0RFU0NfUEVSX0JMT0NLKHNiKTsKKwl1bnNpZ25lZCBsb25nIGdkYmxvY2sgPSBFWFQzX1NCKHNiKS0+c19zYmgtPmJfYmxvY2tuciArIDEgKyBnZGJfbnVtOworCXN0cnVjdCBidWZmZXJfaGVhZCAqKm9fZ3JvdXBfZGVzYywgKipuX2dyb3VwX2Rlc2M7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaW5kOworCWludCBnZGJhY2t1cHM7CisJc3RydWN0IGV4dDNfaWxvYyBpbG9jOworCV9fdTMyICpkYXRhOworCWludCBlcnI7CisKKwlpZiAodGVzdF9vcHQoc2IsIERFQlVHKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICJFWFQzLWZzOiBleHQzX2FkZF9uZXdfZ2RiOiBhZGRpbmcgZ3JvdXAgYmxvY2sgJWx1XG4iLAorCQkgICAgICAgZ2RiX251bSk7CisKKwkvKgorCSAqIElmIHdlIGFyZSBub3QgdXNpbmcgdGhlIHByaW1hcnkgc3VwZXJibG9jay9HRFQgY29weSBkb24ndCByZXNpemUsCisJICogYmVjYXVzZSB0aGUgdXNlciB0b29scyBoYXZlIG5vIHdheSBvZiBoYW5kbGluZyB0aGlzLiAgUHJvYmFibHkgYQorCSAqIGJhZCB0aW1lIHRvIGRvIGl0IGFueXdheXMuCisJICovCisJaWYgKEVYVDNfU0Ioc2IpLT5zX3NiaC0+Yl9ibG9ja25yICE9CisJICAgIGxlMzJfdG9fY3B1KEVYVDNfU0Ioc2IpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spKSB7CisJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJIndvbid0IHJlc2l6ZSB1c2luZyBiYWNrdXAgc3VwZXJibG9jayBhdCAlbGx1XG4iLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylFWFQzX1NCKHNiKS0+c19zYmgtPmJfYmxvY2tucik7CisJCXJldHVybiAtRVBFUk07CisJfQorCisJKnByaW1hcnkgPSBzYl9icmVhZChzYiwgZ2RibG9jayk7CisJaWYgKCEqcHJpbWFyeSkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoKGdkYmFja3VwcyA9IHZlcmlmeV9yZXNlcnZlZF9nZGIoc2IsICpwcmltYXJ5KSkgPCAwKSB7CisJCWVyciA9IGdkYmFja3VwczsKKwkJZ290byBleGl0X2JoOworCX0KKworCWRhdGEgPSBFWFQzX0koaW5vZGUpLT5pX2RhdGEgKyBFWFQzX0RJTkRfQkxPQ0s7CisJZGluZCA9IHNiX2JyZWFkKHNiLCBsZTMyX3RvX2NwdSgqZGF0YSkpOworCWlmICghZGluZCkgeworCQllcnIgPSAtRUlPOworCQlnb3RvIGV4aXRfYmg7CisJfQorCisJZGF0YSA9IChfX3UzMiAqKWRpbmQtPmJfZGF0YTsKKwlpZiAobGUzMl90b19jcHUoZGF0YVtnZGJfbnVtICUgRVhUM19BRERSX1BFUl9CTE9DSyhzYildKSAhPSBnZGJsb2NrKSB7CisJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAibmV3IGdyb3VwICV1IEdEVCBibG9jayAlbHUgbm90IHJlc2VydmVkXG4iLAorCQkJICAgICBpbnB1dC0+Z3JvdXAsIGdkYmxvY2spOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGV4aXRfZGluZDsKKwl9CisKKwlpZiAoKGVyciA9IGV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgRVhUM19TQihzYiktPnNfc2JoKSkpCisJCWdvdG8gZXhpdF9kaW5kOworCisJaWYgKChlcnIgPSBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsICpwcmltYXJ5KSkpCisJCWdvdG8gZXhpdF9zYmg7CisKKwlpZiAoKGVyciA9IGV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgZGluZCkpKQorCQlnb3RvIGV4aXRfcHJpbWFyeTsKKworCS8qIGV4dDNfcmVzZXJ2ZV9pbm9kZV93cml0ZSgpIGdldHMgYSByZWZlcmVuY2Ugb24gdGhlIGlsb2MgKi8KKwlpZiAoKGVyciA9IGV4dDNfcmVzZXJ2ZV9pbm9kZV93cml0ZShoYW5kbGUsIGlub2RlLCAmaWxvYykpKQorCQlnb3RvIGV4aXRfZGluZGo7CisKKwluX2dyb3VwX2Rlc2MgPSAoc3RydWN0IGJ1ZmZlcl9oZWFkICoqKWttYWxsb2MoKGdkYl9udW0gKyAxKSAqCisJCQkJc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuX2dyb3VwX2Rlc2MpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZXh0M193YXJuaW5nIChzYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciAlbHUgZ3JvdXBzIiwgZ2RiX251bSArIDEpOworCQlnb3RvIGV4aXRfaW5vZGU7CisJfQorCisJLyoKKwkgKiBGaW5hbGx5LCB3ZSBoYXZlIGFsbCBvZiB0aGUgcG9zc2libGUgZmFpbHVyZXMgYmVoaW5kIHVzLi4uCisJICoKKwkgKiBSZW1vdmUgbmV3IEdEVCBibG9jayBmcm9tIGlub2RlIGRvdWJsZS1pbmRpcmVjdCBibG9jayBhbmQgY2xlYXIgb3V0CisJICogdGhlIG5ldyBHRFQgYmxvY2sgZm9yIHVzZSAod2hpY2ggYWxzbyAiZnJlZXMiIHRoZSBiYWNrdXAgR0RUIGJsb2NrcworCSAqIGZyb20gdGhlIHJlc2VydmVkIGlub2RlKS4gIFdlIGRvbid0IG5lZWQgdG8gY2hhbmdlIHRoZSBiaXRtYXBzIGZvcgorCSAqIHRoZXNlIGJsb2NrcywgYmVjYXVzZSB0aGV5IGFyZSBtYXJrZWQgYXMgaW4tdXNlIGZyb20gYmVpbmcgaW4gdGhlCisJICogcmVzZXJ2ZWQgaW5vZGUsIGFuZCB3aWxsIGJlY29tZSBHRFQgYmxvY2tzIChwcmltYXJ5IGFuZCBiYWNrdXApLgorCSAqLworCWRhdGFbZ2RiX251bSAlIEVYVDNfQUREUl9QRVJfQkxPQ0soc2IpXSA9IDA7CisJZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgZGluZCk7CisJYnJlbHNlKGRpbmQpOworCWlub2RlLT5pX2Jsb2NrcyAtPSAoZ2RiYWNrdXBzICsgMSkgKiBzYi0+c19ibG9ja3NpemUgPj4gOTsKKwlleHQzX21hcmtfaWxvY19kaXJ0eShoYW5kbGUsIGlub2RlLCAmaWxvYyk7CisJbWVtc2V0KCgqcHJpbWFyeSktPmJfZGF0YSwgMCwgc2ItPnNfYmxvY2tzaXplKTsKKwlleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCAqcHJpbWFyeSk7CisKKwlvX2dyb3VwX2Rlc2MgPSBFWFQzX1NCKHNiKS0+c19ncm91cF9kZXNjOworCW1lbWNweShuX2dyb3VwX2Rlc2MsIG9fZ3JvdXBfZGVzYywKKwkgICAgICAgRVhUM19TQihzYiktPnNfZ2RiX2NvdW50ICogc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSk7CisJbl9ncm91cF9kZXNjW2dkYl9udW1dID0gKnByaW1hcnk7CisJRVhUM19TQihzYiktPnNfZ3JvdXBfZGVzYyA9IG5fZ3JvdXBfZGVzYzsKKwlFWFQzX1NCKHNiKS0+c19nZGJfY291bnQrKzsKKwlrZnJlZShvX2dyb3VwX2Rlc2MpOworCisJZXMtPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrcyA9CisJCWNwdV90b19sZTE2KGxlMTZfdG9fY3B1KGVzLT5zX3Jlc2VydmVkX2dkdF9ibG9ja3MpIC0gMSk7CisJZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgRVhUM19TQihzYiktPnNfc2JoKTsKKworCXJldHVybiAwOworCitleGl0X2lub2RlOgorCS8vZXh0M19qb3VybmFsX3JlbGVhc2VfYnVmZmVyKGhhbmRsZSwgaWxvYy5iaCk7CisJYnJlbHNlKGlsb2MuYmgpOworZXhpdF9kaW5kajoKKwkvL2V4dDNfam91cm5hbF9yZWxlYXNlX2J1ZmZlcihoYW5kbGUsIGRpbmQpOworZXhpdF9wcmltYXJ5OgorCS8vZXh0M19qb3VybmFsX3JlbGVhc2VfYnVmZmVyKGhhbmRsZSwgKnByaW1hcnkpOworZXhpdF9zYmg6CisJLy9leHQzX2pvdXJuYWxfcmVsZWFzZV9idWZmZXIoaGFuZGxlLCAqcHJpbWFyeSk7CitleGl0X2RpbmQ6CisJYnJlbHNlKGRpbmQpOworZXhpdF9iaDoKKwlicmVsc2UoKnByaW1hcnkpOworCisJZXh0M19kZWJ1ZygibGVhdmluZyB3aXRoIGVycm9yICVkXG4iLCBlcnIpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbiB3ZSBhcmUgYWRkaW5nIGEgbmV3IGdyb3VwIHdoaWNoIGhhcyBhIGJhY2t1cCBjb3B5IG9mIGVhY2ggb2YKKyAqIHRoZSBHRFQgYmxvY2tzIChpLmUuIHNwYXJzZSBncm91cCkgYW5kIHRoZXJlIGFyZSByZXNlcnZlZCBHRFQgYmxvY2tzLgorICogV2UgbmVlZCB0byBhZGQgdGhlc2UgcmVzZXJ2ZWQgYmFja3VwIEdEVCBibG9ja3MgdG8gdGhlIHJlc2l6ZSBpbm9kZSwgc28KKyAqIHRoYXQgdGhleSBhcmUga2VwdCBmb3IgZnV0dXJlIHJlc2l6aW5nIGFuZCBub3QgYWxsb2NhdGVkIHRvIGZpbGVzLgorICoKKyAqIEVhY2ggcmVzZXJ2ZWQgYmFja3VwIEdEVCBibG9jayB3aWxsIGdvIGludG8gYSBkaWZmZXJlbnQgaW5kaXJlY3QgYmxvY2suCisgKiBUaGUgaW5kaXJlY3QgYmxvY2tzIGFyZSBhY3R1YWxseSB0aGUgcHJpbWFyeSByZXNlcnZlZCBHRFQgYmxvY2tzLAorICogc28gd2Uga25vdyBpbiBhZHZhbmNlIHdoYXQgdGhlaXIgYmxvY2sgbnVtYmVycyBhcmUuICBXZSBvbmx5IGdldCB0aGUKKyAqIGRvdWJsZS1pbmRpcmVjdCBibG9jayB0byB2ZXJpZnkgaXQgaXMgcG9pbnRpbmcgdG8gdGhlIHByaW1hcnkgcmVzZXJ2ZWQKKyAqIEdEVCBibG9ja3Mgc28gd2UgZG9uJ3Qgb3ZlcndyaXRlIGEgZGF0YSBibG9jayBieSBhY2NpZGVudC4gIFRoZSByZXNlcnZlZAorICogYmFja3VwIEdEVCBibG9ja3MgYXJlIHN0b3JlZCBpbiB0aGVpciByZXNlcnZlZCBwcmltYXJ5IEdEVCBibG9jay4KKyAqLworc3RhdGljIGludCByZXNlcnZlX2JhY2t1cF9nZGIoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgIHN0cnVjdCBleHQzX25ld19ncm91cF9kYXRhICppbnB1dCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJaW50IHJlc2VydmVkX2dkYiA9bGUxNl90b19jcHUoRVhUM19TQihzYiktPnNfZXMtPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2Nrcyk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICoqcHJpbWFyeTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpbmQ7CisJc3RydWN0IGV4dDNfaWxvYyBpbG9jOworCXVuc2lnbmVkIGxvbmcgYmxrOworCV9fdTMyICpkYXRhLCAqZW5kOworCWludCBnZGJhY2t1cHMgPSAwOworCWludCByZXMsIGk7CisJaW50IGVycjsKKworCXByaW1hcnkgPSBrbWFsbG9jKHJlc2VydmVkX2dkYiAqIHNpemVvZigqcHJpbWFyeSksIEdGUF9LRVJORUwpOworCWlmICghcHJpbWFyeSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkYXRhID0gRVhUM19JKGlub2RlKS0+aV9kYXRhICsgRVhUM19ESU5EX0JMT0NLOworCWRpbmQgPSBzYl9icmVhZChzYiwgbGUzMl90b19jcHUoKmRhdGEpKTsKKwlpZiAoIWRpbmQpIHsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBleGl0X2ZyZWU7CisJfQorCisJYmxrID0gRVhUM19TQihzYiktPnNfc2JoLT5iX2Jsb2NrbnIgKyAxICsgRVhUM19TQihzYiktPnNfZ2RiX2NvdW50OworCWRhdGEgPSAoX191MzIgKilkaW5kLT5iX2RhdGEgKyBFWFQzX1NCKHNiKS0+c19nZGJfY291bnQ7CisJZW5kID0gKF9fdTMyICopZGluZC0+Yl9kYXRhICsgRVhUM19BRERSX1BFUl9CTE9DSyhzYik7CisKKwkvKiBHZXQgZWFjaCByZXNlcnZlZCBwcmltYXJ5IEdEVCBibG9jayBhbmQgdmVyaWZ5IGl0IGhvbGRzIGJhY2t1cHMgKi8KKwlmb3IgKHJlcyA9IDA7IHJlcyA8IHJlc2VydmVkX2dkYjsgcmVzKyssIGJsaysrKSB7CisJCWlmIChsZTMyX3RvX2NwdSgqZGF0YSkgIT0gYmxrKSB7CisJCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkgICAgICJyZXNlcnZlZCBibG9jayAlbHUgbm90IGF0IG9mZnNldCAlbGRcbiIsCisJCQkJICAgICBibGssIChsb25nKShkYXRhIC0gKF9fdTMyICopZGluZC0+Yl9kYXRhKSk7CisJCQllcnIgPSAtRUlOVkFMOworCQkJZ290byBleGl0X2JoOworCQl9CisJCXByaW1hcnlbcmVzXSA9IHNiX2JyZWFkKHNiLCBibGspOworCQlpZiAoIXByaW1hcnlbcmVzXSkgeworCQkJZXJyID0gLUVJTzsKKwkJCWdvdG8gZXhpdF9iaDsKKwkJfQorCQlpZiAoKGdkYmFja3VwcyA9IHZlcmlmeV9yZXNlcnZlZF9nZGIoc2IsIHByaW1hcnlbcmVzXSkpIDwgMCkgeworCQkJYnJlbHNlKHByaW1hcnlbcmVzXSk7CisJCQllcnIgPSBnZGJhY2t1cHM7CisJCQlnb3RvIGV4aXRfYmg7CisJCX0KKwkJaWYgKCsrZGF0YSA+PSBlbmQpCisJCQlkYXRhID0gKF9fdTMyICopZGluZC0+Yl9kYXRhOworCX0KKworCWZvciAoaSA9IDA7IGkgPCByZXNlcnZlZF9nZGI7IGkrKykgeworCQlpZiAoKGVyciA9IGV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgcHJpbWFyeVtpXSkpKSB7CisJCQkvKgorCQkJaW50IGo7CisJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQorCQkJCWV4dDNfam91cm5hbF9yZWxlYXNlX2J1ZmZlcihoYW5kbGUsIHByaW1hcnlbal0pOworCQkJICovCisJCQlnb3RvIGV4aXRfYmg7CisJCX0KKwl9CisKKwlpZiAoKGVyciA9IGV4dDNfcmVzZXJ2ZV9pbm9kZV93cml0ZShoYW5kbGUsIGlub2RlLCAmaWxvYykpKQorCQlnb3RvIGV4aXRfYmg7CisKKwkvKgorCSAqIEZpbmFsbHkgd2UgY2FuIGFkZCBlYWNoIG9mIHRoZSByZXNlcnZlZCBiYWNrdXAgR0RUIGJsb2NrcyBmcm9tCisJICogdGhlIG5ldyBncm91cCB0byBpdHMgcmVzZXJ2ZWQgcHJpbWFyeSBHRFQgYmxvY2suCisJICovCisJYmxrID0gaW5wdXQtPmdyb3VwICogRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKTsKKwlmb3IgKGkgPSAwOyBpIDwgcmVzZXJ2ZWRfZ2RiOyBpKyspIHsKKwkJaW50IGVycjI7CisJCWRhdGEgPSAoX191MzIgKilwcmltYXJ5W2ldLT5iX2RhdGE7CisJCS8qIHByaW50aygicmVzZXJ2aW5nIGJhY2t1cCAlbHVbJXVdID0gJWx1XG4iLAorCQkgICAgICAgcHJpbWFyeVtpXS0+Yl9ibG9ja25yLCBnZGJhY2t1cHMsCisJCSAgICAgICBibGsgKyBwcmltYXJ5W2ldLT5iX2Jsb2NrbnIpOyAqLworCQlkYXRhW2dkYmFja3Vwc10gPSBjcHVfdG9fbGUzMihibGsgKyBwcmltYXJ5W2ldLT5iX2Jsb2NrbnIpOworCQllcnIyID0gZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgcHJpbWFyeVtpXSk7CisJCWlmICghZXJyKQorCQkJZXJyID0gZXJyMjsKKwl9CisJaW5vZGUtPmlfYmxvY2tzICs9IHJlc2VydmVkX2dkYiAqIHNiLT5zX2Jsb2Nrc2l6ZSA+PiA5OworCWV4dDNfbWFya19pbG9jX2RpcnR5KGhhbmRsZSwgaW5vZGUsICZpbG9jKTsKKworZXhpdF9iaDoKKwl3aGlsZSAoLS1yZXMgPj0gMCkKKwkJYnJlbHNlKHByaW1hcnlbcmVzXSk7CisJYnJlbHNlKGRpbmQpOworCitleGl0X2ZyZWU6CisJa2ZyZWUocHJpbWFyeSk7CisKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogVXBkYXRlIHRoZSBiYWNrdXAgY29waWVzIG9mIHRoZSBleHQzIG1ldGFkYXRhLiAgVGhlc2UgZG9uJ3QgbmVlZCB0byBiZSBwYXJ0CisgKiBvZiB0aGUgbWFpbiByZXNpemUgdHJhbnNhY3Rpb24sIGJlY2F1c2UgZTJmc2NrIHdpbGwgcmUtd3JpdGUgdGhlbSBpZiB0aGVyZQorICogaXMgYSBwcm9ibGVtIChiYXNpY2FsbHkgb25seSBPT00gd2lsbCBjYXVzZSBhIHByb2JsZW0pLiAgSG93ZXZlciwgd2UKKyAqIF9zaG91bGRfIHVwZGF0ZSB0aGUgYmFja3VwcyBpZiBwb3NzaWJsZSwgaW4gY2FzZSB0aGUgcHJpbWFyeSBnZXRzIHRyYXNoZWQKKyAqIGZvciBzb21lIHJlYXNvbiBhbmQgd2UgbmVlZCB0byBydW4gZTJmc2NrIGZyb20gYSBiYWNrdXAgc3VwZXJibG9jay4gIFRoZQorICogaW1wb3J0YW50IHBhcnQgaXMgdGhhdCB0aGUgbmV3IGJsb2NrIGFuZCBpbm9kZSBjb3VudHMgYXJlIGluIHRoZSBiYWNrdXAKKyAqIHN1cGVyYmxvY2tzLCBhbmQgdGhlIGxvY2F0aW9uIG9mIHRoZSBuZXcgZ3JvdXAgbWV0YWRhdGEgaW4gdGhlIEdEVCBiYWNrdXBzLgorICoKKyAqIFdlIGRvIG5vdCBuZWVkIGxvY2tfc3VwZXIoKSBmb3IgdGhpcywgYmVjYXVzZSB0aGVzZSBibG9ja3MgYXJlIG5vdAorICogb3RoZXJ3aXNlIHRvdWNoZWQgYnkgdGhlIGZpbGVzeXN0ZW0gY29kZSB3aGVuIGl0IGlzIG1vdW50ZWQuICBXZSBkb24ndAorICogbmVlZCB0byB3b3JyeSBhYm91dCBsYXN0IGNoYW5naW5nIGZyb20gc2JpLT5zX2dyb3Vwc19jb3VudCwgYmVjYXVzZSB0aGUKKyAqIHdvcnN0IHRoYXQgY2FuIGhhcHBlbiBpcyB0aGF0IHdlIGRvIG5vdCBjb3B5IHRoZSBmdWxsIG51bWJlciBvZiBiYWNrdXBzCisgKiBhdCB0aGlzIHRpbWUuICBUaGUgcmVzaXplIHdoaWNoIGNoYW5nZWQgc19ncm91cHNfY291bnQgd2lsbCBiYWNrdXAgYWdhaW4uCisgKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9iYWNrdXBzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkgICBpbnQgYmxrX29mZiwgY2hhciAqZGF0YSwgaW50IHNpemUpCit7CisJc3RydWN0IGV4dDNfc2JfaW5mbyAqc2JpID0gRVhUM19TQihzYik7CisJY29uc3QgdW5zaWduZWQgbG9uZyBsYXN0ID0gc2JpLT5zX2dyb3Vwc19jb3VudDsKKwljb25zdCBpbnQgYnBnID0gRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKTsKKwl1bnNpZ25lZCB0aHJlZSA9IDE7CisJdW5zaWduZWQgZml2ZSA9IDU7CisJdW5zaWduZWQgc2V2ZW4gPSA3OworCXVuc2lnbmVkIGdyb3VwOworCWludCByZXN0ID0gc2ItPnNfYmxvY2tzaXplIC0gc2l6ZTsKKwloYW5kbGVfdCAqaGFuZGxlOworCWludCBlcnIgPSAwLCBlcnIyOworCisJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0X3NiKHNiLCBFWFQzX01BWF9UUkFOU19EQVRBKTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJZ3JvdXAgPSAxOworCQllcnIgPSBQVFJfRVJSKGhhbmRsZSk7CisJCWdvdG8gZXhpdF9lcnI7CisJfQorCisJd2hpbGUgKChncm91cCA9IGV4dDNfbGlzdF9iYWNrdXBzKHNiLCAmdGhyZWUsICZmaXZlLCAmc2V2ZW4pKSA8IGxhc3QpIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCQkvKiBPdXQgb2Ygam91cm5hbCBzcGFjZSwgYW5kIGNhbid0IGdldCBtb3JlIC0gYWJvcnQgLSBzbyBzYWQgKi8KKwkJaWYgKGhhbmRsZS0+aF9idWZmZXJfY3JlZGl0cyA9PSAwICYmCisJCSAgICBleHQzX2pvdXJuYWxfZXh0ZW5kKGhhbmRsZSwgRVhUM19NQVhfVFJBTlNfREFUQSkgJiYKKwkJICAgIChlcnIgPSBleHQzX2pvdXJuYWxfcmVzdGFydChoYW5kbGUsIEVYVDNfTUFYX1RSQU5TX0RBVEEpKSkKKwkJCWJyZWFrOworCisJCWJoID0gc2JfZ2V0YmxrKHNiLCBncm91cCAqIGJwZyArIGJsa19vZmYpOworCQlleHQzX2RlYnVnKHNiLCBfX0ZVTkNUSU9OX18sICJ1cGRhdGUgbWV0YWRhdGEgYmFja3VwICUjMDRseFxuIiwKKwkJCSAgIGJoLT5iX2Jsb2NrbnIpOworCQlpZiAoKGVyciA9IGV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmgpKSkKKwkJCWJyZWFrOworCQlsb2NrX2J1ZmZlcihiaCk7CisJCW1lbWNweShiaC0+Yl9kYXRhLCBkYXRhLCBzaXplKTsKKwkJaWYgKHJlc3QpCisJCQltZW1zZXQoYmgtPmJfZGF0YSArIHNpemUsIDAsIHJlc3QpOworCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJdW5sb2NrX2J1ZmZlcihiaCk7CisJCWV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKKwkJYnJlbHNlKGJoKTsKKwl9CisJaWYgKChlcnIyID0gZXh0M19qb3VybmFsX3N0b3AoaGFuZGxlKSkgJiYgIWVycikKKwkJZXJyID0gZXJyMjsKKworCS8qCisJICogVWdoISBOZWVkIHRvIGhhdmUgZTJmc2NrIHdyaXRlIHRoZSBiYWNrdXAgY29waWVzLiAgSXQgaXMgdG9vCisJICogbGF0ZSB0byByZXZlcnQgdGhlIHJlc2l6ZSwgd2Ugc2hvdWxkbid0IGZhaWwganVzdCBiZWNhdXNlIG9mCisJICogdGhlIGJhY2t1cCBjb3BpZXMgKHRoZXkgYXJlIG9ubHkgbmVlZGVkIGluIGNhc2Ugb2YgY29ycnVwdGlvbikuCisJICoKKwkgKiBIb3dldmVyLCBpZiB3ZSBnb3QgaGVyZSB3ZSBoYXZlIGEgam91cm5hbCBwcm9ibGVtIHRvbywgc28gd2UKKwkgKiBjYW4ndCByZWFsbHkgc3RhcnQgYSB0cmFuc2FjdGlvbiB0byBtYXJrIHRoZSBzdXBlcmJsb2NrLgorCSAqIENoaWNrZW4gb3V0IGFuZCBqdXN0IHNldCB0aGUgZmxhZyBvbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHdyaXR0ZW4KKwkgKiB0byBkaXNrLCBhbmQgaWYgbm90IC0gd2Ugd2lsbCBzaW1wbHkgd2FpdCB1bnRpbCBuZXh0IGZzY2suCisJICovCitleGl0X2VycjoKKwlpZiAoZXJyKSB7CisJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAiY2FuJ3QgdXBkYXRlIGJhY2t1cCBmb3IgZ3JvdXAgJWQgKGVyciAlZCksICIKKwkJCSAgICAgImZvcmNpbmcgZnNjayBvbiBuZXh0IHJlYm9vdFxuIiwgZ3JvdXAsIGVycik7CisJCXNiaS0+c19tb3VudF9zdGF0ZSAmPSB+RVhUM19WQUxJRF9GUzsKKwkJc2JpLT5zX2VzLT5zX3N0YXRlICY9IH5jcHVfdG9fbGUxNihFWFQzX1ZBTElEX0ZTKTsKKwkJbWFya19idWZmZXJfZGlydHkoc2JpLT5zX3NiaCk7CisJfQorfQorCisvKiBBZGQgZ3JvdXAgZGVzY3JpcHRvciBkYXRhIHRvIGFuIGV4aXN0aW5nIG9yIG5ldyBncm91cCBkZXNjcmlwdG9yIGJsb2NrLgorICogRW5zdXJlIHdlIGhhbmRsZSBhbGwgcG9zc2libGUgZXJyb3IgY29uZGl0aW9ucyBfYmVmb3JlXyB3ZSBzdGFydCBtb2RpZnlpbmcKKyAqIHRoZSBmaWxlc3lzdGVtLCBiZWNhdXNlIHdlIGNhbm5vdCBhYm9ydCB0aGUgdHJhbnNhY3Rpb24gYW5kIG5vdCBoYXZlIGl0CisgKiB3cml0ZSB0aGUgZGF0YSB0byBkaXNrLgorICoKKyAqIElmIHdlIGFyZSBvbiBhIEdEVCBibG9jayBib3VuZGFyeSwgd2UgbmVlZCB0byBnZXQgdGhlIHJlc2VydmVkIEdEVCBibG9jay4KKyAqIE90aGVyd2lzZSwgd2UgbWF5IG5lZWQgdG8gYWRkIGJhY2t1cCBHRFQgYmxvY2tzIGZvciBhIHNwYXJzZSBncm91cC4KKyAqCisgKiBXZSBvbmx5IG5lZWQgdG8gaG9sZCB0aGUgc3VwZXJibG9jayBsb2NrIHdoaWxlIHdlIGFyZSBhY3R1YWxseSBhZGRpbmcKKyAqIGluIHRoZSBuZXcgZ3JvdXAncyBjb3VudHMgdG8gdGhlIHN1cGVyYmxvY2suICBQcmlvciB0byB0aGF0IHdlIGhhdmUKKyAqIG5vdCByZWFsbHkgImFkZGVkIiB0aGUgZ3JvdXAgYXQgYWxsLiAgV2UgcmUtY2hlY2sgdGhhdCB3ZSBhcmUgc3RpbGwKKyAqIGFkZGluZyBpbiB0aGUgbGFzdCBncm91cCBpbiBjYXNlIHRoaW5ncyBoYXZlIGNoYW5nZWQgc2luY2UgdmVyaWZ5aW5nLgorICovCitpbnQgZXh0M19ncm91cF9hZGQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGV4dDNfbmV3X2dyb3VwX2RhdGEgKmlucHV0KQoreworCXN0cnVjdCBleHQzX3NiX2luZm8gKnNiaSA9IEVYVDNfU0Ioc2IpOworCXN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICplcyA9IHNiaS0+c19lczsKKwlpbnQgcmVzZXJ2ZWRfZ2RiID0gZXh0M19iZ19oYXNfc3VwZXIoc2IsIGlucHV0LT5ncm91cCkgPworCQlsZTE2X3RvX2NwdShlcy0+c19yZXNlcnZlZF9nZHRfYmxvY2tzKSA6IDA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpwcmltYXJ5ID0gTlVMTDsKKwlzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICpnZHA7CisJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlpbnQgZ2RiX29mZiwgZ2RiX251bTsKKwlpbnQgZXJyLCBlcnIyOworCisJZ2RiX251bSA9IGlucHV0LT5ncm91cCAvIEVYVDNfREVTQ19QRVJfQkxPQ0soc2IpOworCWdkYl9vZmYgPSBpbnB1dC0+Z3JvdXAgJSBFWFQzX0RFU0NfUEVSX0JMT0NLKHNiKTsKKworCWlmIChnZGJfb2ZmID09IDAgJiYgIUVYVDNfSEFTX1JPX0NPTVBBVF9GRUFUVVJFKHNiLAorCQkJCQlFWFQzX0ZFQVRVUkVfUk9fQ09NUEFUX1NQQVJTRV9TVVBFUikpIHsKKwkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgICJDYW4ndCByZXNpemUgbm9uLXNwYXJzZSBmaWxlc3lzdGVtIGZ1cnRoZXJcbiIpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCWlmIChyZXNlcnZlZF9nZGIgfHwgZ2RiX29mZiA9PSAwKSB7CisJCWlmICghRVhUM19IQVNfQ09NUEFUX0ZFQVRVUkUoc2IsCisJCQkJCSAgICAgRVhUM19GRUFUVVJFX0NPTVBBVF9SRVNJWkVfSU5PREUpKXsKKwkJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJCSAgICAgIk5vIHJlc2VydmVkIEdEVCBibG9ja3MsIGNhbid0IHJlc2l6ZVxuIik7CisJCQlyZXR1cm4gLUVQRVJNOworCQl9CisJCWlub2RlID0gaWdldChzYiwgRVhUM19SRVNJWkVfSU5PKTsKKwkJaWYgKCFpbm9kZSB8fCBpc19iYWRfaW5vZGUoaW5vZGUpKSB7CisJCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkgICAgICJFcnJvciBvcGVuaW5nIHJlc2l6ZSBpbm9kZVxuIik7CisJCQlpcHV0KGlub2RlKTsKKwkJCXJldHVybiAtRU5PRU5UOworCQl9CisJfQorCisJaWYgKChlcnIgPSB2ZXJpZnlfZ3JvdXBfaW5wdXQoc2IsIGlucHV0KSkpCisJCWdvdG8gZXhpdF9wdXQ7CisKKwlpZiAoKGVyciA9IHNldHVwX25ld19ncm91cF9ibG9ja3Moc2IsIGlucHV0KSkpCisJCWdvdG8gZXhpdF9wdXQ7CisKKwkvKgorCSAqIFdlIHdpbGwgYWx3YXlzIGJlIG1vZGlmeWluZyBhdCBsZWFzdCB0aGUgc3VwZXJibG9jayBhbmQgYSBHRFQKKwkgKiBibG9jay4gIElmIHdlIGFyZSBhZGRpbmcgYSBncm91cCBwYXN0IHRoZSBsYXN0IGN1cnJlbnQgR0RUIGJsb2NrLAorCSAqIHdlIHdpbGwgYWxzbyBtb2RpZnkgdGhlIGlub2RlIGFuZCB0aGUgZGluZGlyZWN0IGJsb2NrLiAgSWYgd2UKKwkgKiBhcmUgYWRkaW5nIGEgZ3JvdXAgd2l0aCBzdXBlcmJsb2NrL0dEVCBiYWNrdXBzICB3ZSB3aWxsIGFsc28KKwkgKiBtb2RpZnkgZWFjaCBvZiB0aGUgcmVzZXJ2ZWQgR0RUIGRpbmRpcmVjdCBibG9ja3MuCisJICovCisJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0X3NiKHNiLAorCQkJCSAgICAgICBleHQzX2JnX2hhc19zdXBlcihzYiwgaW5wdXQtPmdyb3VwKSA/CisJCQkJICAgICAgIDMgKyByZXNlcnZlZF9nZGIgOiA0KTsKKwlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJZXJyID0gUFRSX0VSUihoYW5kbGUpOworCQlnb3RvIGV4aXRfcHV0OworCX0KKworCWxvY2tfc3VwZXIoc2IpOworCWlmIChpbnB1dC0+Z3JvdXAgIT0gRVhUM19TQihzYiktPnNfZ3JvdXBzX2NvdW50KSB7CisJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAibXVsdGlwbGUgcmVzaXplcnMgcnVuIG9uIGZpbGVzeXN0ZW0hXG4iKTsKKwkJZ290byBleGl0X2pvdXJuYWw7CisJfQorCisJaWYgKChlcnIgPSBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIHNiaS0+c19zYmgpKSkKKwkJZ290byBleGl0X2pvdXJuYWw7CisKKwkvKgorCSAqIFdlIHdpbGwgb25seSBlaXRoZXIgYWRkIHJlc2VydmVkIGdyb3VwIGJsb2NrcyB0byBhIGJhY2t1cCBncm91cAorCSAqIG9yIHJlbW92ZSByZXNlcnZlZCBibG9ja3MgZm9yIHRoZSBmaXJzdCBncm91cCBpbiBhIG5ldyBncm91cCBibG9jay4KKwkgKiBEb2luZyBib3RoIHdvdWxkIGJlIG1lYW4gbW9yZSBjb21wbGV4IGNvZGUsIGFuZCBzYW5lIHBlb3BsZSBkb24ndAorCSAqIHVzZSBub24tc3BhcnNlIGZpbGVzeXN0ZW1zIGFueW1vcmUuICBUaGlzIGlzIGFscmVhZHkgY2hlY2tlZCBhYm92ZS4KKwkgKi8KKwlpZiAoZ2RiX29mZikgeworCQlwcmltYXJ5ID0gc2JpLT5zX2dyb3VwX2Rlc2NbZ2RiX251bV07CisJCWlmICgoZXJyID0gZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBwcmltYXJ5KSkpCisJCQlnb3RvIGV4aXRfam91cm5hbDsKKworCQlpZiAocmVzZXJ2ZWRfZ2RiICYmIGV4dDNfYmdfbnVtX2dkYihzYiwgaW5wdXQtPmdyb3VwKSAmJgorCQkgICAgKGVyciA9IHJlc2VydmVfYmFja3VwX2dkYihoYW5kbGUsIGlub2RlLCBpbnB1dCkpKQorCQkJZ290byBleGl0X2pvdXJuYWw7CisJfSBlbHNlIGlmICgoZXJyID0gYWRkX25ld19nZGIoaGFuZGxlLCBpbm9kZSwgaW5wdXQsICZwcmltYXJ5KSkpCisJCWdvdG8gZXhpdF9qb3VybmFsOworCisJLyoKKwkgKiBPSywgbm93IHdlJ3ZlIHNldCB1cCB0aGUgbmV3IGdyb3VwLiAgVGltZSB0byBtYWtlIGl0IGFjdGl2ZS4KKwkgKgorCSAqIEN1cnJlbnQga2VybmVscyBkb24ndCBsb2NrIGFsbCBhbGxvY2F0aW9ucyB2aWEgbG9ja19zdXBlcigpLAorCSAqIHNvIHdlIGhhdmUgdG8gYmUgc2FmZSB3cnQuIGNvbmN1cnJlbnQgYWNjZXNzZXMgdGhlIGdyb3VwCisJICogZGF0YS4gIFNvIHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCB0byBzZXQgYWxsIG9mIHRoZSByZWxldmFudAorCSAqIGdyb3VwIGRlc2NyaXB0b3IgZGF0YSBldGMuICpiZWZvcmUqIHdlIGVuYWJsZSB0aGUgZ3JvdXAuCisJICoKKwkgKiBUaGUga2V5IGZpZWxkIGhlcmUgaXMgRVhUM19TQihzYiktPnNfZ3JvdXBzX2NvdW50OiBhcyBsb25nIGFzCisJICogdGhhdCByZXRhaW5zIGl0cyBvbGQgdmFsdWUsIG5vYm9keSBpcyBnb2luZyB0byBhY2Nlc3MgdGhlIG5ldworCSAqIGdyb3VwLgorCSAqCisJICogU28gZmlyc3Qgd2UgdXBkYXRlIGFsbCB0aGUgZGVzY3JpcHRvciBtZXRhZGF0YSBmb3IgdGhlIG5ldworCSAqIGdyb3VwOyB0aGVuIHdlIHVwZGF0ZSB0aGUgdG90YWwgZGlzayBibG9ja3MgY291bnQ7IHRoZW4gd2UKKwkgKiB1cGRhdGUgdGhlIGdyb3VwcyBjb3VudCB0byBlbmFibGUgdGhlIGdyb3VwOyB0aGVuIGZpbmFsbHkgd2UKKwkgKiB1cGRhdGUgdGhlIGZyZWUgc3BhY2UgY291bnRzIHNvIHRoYXQgdGhlIHN5c3RlbSBjYW4gc3RhcnQKKwkgKiB1c2luZyB0aGUgbmV3IGRpc2sgYmxvY2tzLgorCSAqLworCisJLyogVXBkYXRlIGdyb3VwIGRlc2NyaXB0b3IgYmxvY2sgZm9yIG5ldyBncm91cCAqLworCWdkcCA9IChzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICopcHJpbWFyeS0+Yl9kYXRhICsgZ2RiX29mZjsKKworCWdkcC0+YmdfYmxvY2tfYml0bWFwID0gY3B1X3RvX2xlMzIoaW5wdXQtPmJsb2NrX2JpdG1hcCk7CisJZ2RwLT5iZ19pbm9kZV9iaXRtYXAgPSBjcHVfdG9fbGUzMihpbnB1dC0+aW5vZGVfYml0bWFwKTsKKwlnZHAtPmJnX2lub2RlX3RhYmxlID0gY3B1X3RvX2xlMzIoaW5wdXQtPmlub2RlX3RhYmxlKTsKKwlnZHAtPmJnX2ZyZWVfYmxvY2tzX2NvdW50ID0gY3B1X3RvX2xlMTYoaW5wdXQtPmZyZWVfYmxvY2tzX2NvdW50KTsKKwlnZHAtPmJnX2ZyZWVfaW5vZGVzX2NvdW50ID0gY3B1X3RvX2xlMTYoRVhUM19JTk9ERVNfUEVSX0dST1VQKHNiKSk7CisKKwkvKgorCSAqIE1ha2UgdGhlIG5ldyBibG9ja3MgYW5kIGlub2RlcyB2YWxpZCBuZXh0LiAgV2UgZG8gdGhpcyBiZWZvcmUKKwkgKiBpbmNyZWFzaW5nIHRoZSBncm91cCBjb3VudCBzbyB0aGF0IG9uY2UgdGhlIGdyb3VwIGlzIGVuYWJsZWQsCisJICogYWxsIG9mIGl0cyBibG9ja3MgYW5kIGlub2RlcyBhcmUgYWxyZWFkeSB2YWxpZC4KKwkgKgorCSAqIFdlIGFsd2F5cyBhbGxvY2F0ZSBncm91cC1ieS1ncm91cCwgdGhlbiBibG9jay1ieS1ibG9jayBvcgorCSAqIGlub2RlLWJ5LWlub2RlIHdpdGhpbiBhIGdyb3VwLCBzbyBlbmFibGluZyB0aGVzZQorCSAqIGJsb2Nrcy9pbm9kZXMgYmVmb3JlIHRoZSBncm91cCBpcyBsaXZlIHdvbid0IGFjdHVhbGx5IGxldCB1cworCSAqIGFsbG9jYXRlIHRoZSBuZXcgc3BhY2UgeWV0LgorCSAqLworCWVzLT5zX2Jsb2Nrc19jb3VudCA9IGNwdV90b19sZTMyKGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCkgKworCQlpbnB1dC0+YmxvY2tzX2NvdW50KTsKKwllcy0+c19pbm9kZXNfY291bnQgPSBjcHVfdG9fbGUzMihsZTMyX3RvX2NwdShlcy0+c19pbm9kZXNfY291bnQpICsKKwkJRVhUM19JTk9ERVNfUEVSX0dST1VQKHNiKSk7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gcHJvdGVjdCBzX2dyb3Vwc19jb3VudCBhZ2FpbnN0IG90aGVyIENQVXMgc2VlaW5nCisJICogaW5jb25zaXN0ZW50IHN0YXRlIGluIHRoZSBzdXBlcmJsb2NrLgorCSAqCisJICogVGhlIHByZWNpc2UgcnVsZXMgd2UgdXNlIGFyZToKKwkgKgorCSAqICogV3JpdGVycyBvZiBzX2dyb3Vwc19jb3VudCAqbXVzdCogaG9sZCBsb2NrX3N1cGVyCisJICogQU5ECisJICogKiBXcml0ZXJzIG11c3QgcGVyZm9ybSBhIHNtcF93bWIoKSBhZnRlciB1cGRhdGluZyBhbGwgZGVwZW5kZW50CisJICogICBkYXRhIGFuZCBiZWZvcmUgbW9kaWZ5aW5nIHRoZSBncm91cHMgY291bnQKKwkgKgorCSAqICogUmVhZGVycyBtdXN0IGhvbGQgbG9ja19zdXBlcigpIG92ZXIgdGhlIGFjY2VzcworCSAqIE9SCisJICogKiBSZWFkZXJzIG11c3QgcGVyZm9ybSBhbiBzbXBfcm1iKCkgYWZ0ZXIgcmVhZGluZyB0aGUgZ3JvdXBzIGNvdW50CisJICogICBhbmQgYmVmb3JlIHJlYWRpbmcgYW55IGRlcGVuZGVudCBkYXRhLgorCSAqCisJICogTkIuIFRoZXNlIHJ1bGVzIGNhbiBiZSByZWxheGVkIHdoZW4gY2hlY2tpbmcgdGhlIGdyb3VwIGNvdW50CisJICogd2hpbGUgZnJlZWluZyBkYXRhLCBhcyB3ZSBjYW4gb25seSBhbGxvY2F0ZSBmcm9tIGEgYmxvY2sKKwkgKiBncm91cCBhZnRlciBzZXJpYWxpc2luZyBhZ2FpbnN0IHRoZSBncm91cCBjb3VudCwgYW5kIHdlIGNhbgorCSAqIG9ubHkgdGhlbiBmcmVlIGFmdGVyIHNlcmlhbGlzaW5nIGluIHR1cm4gYWdhaW5zdCB0aGF0CisJICogYWxsb2NhdGlvbi4KKwkgKi8KKwlzbXBfd21iKCk7CisKKwkvKiBVcGRhdGUgdGhlIGdsb2JhbCBmcyBzaXplIGZpZWxkcyAqLworCUVYVDNfU0Ioc2IpLT5zX2dyb3Vwc19jb3VudCsrOworCisJZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgcHJpbWFyeSk7CisKKwkvKiBVcGRhdGUgdGhlIHJlc2VydmVkIGJsb2NrIGNvdW50cyBvbmx5IG9uY2UgdGhlIG5ldyBncm91cCBpcworCSAqIGFjdGl2ZS4gKi8KKwllcy0+c19yX2Jsb2Nrc19jb3VudCA9IGNwdV90b19sZTMyKGxlMzJfdG9fY3B1KGVzLT5zX3JfYmxvY2tzX2NvdW50KSArCisJCWlucHV0LT5yZXNlcnZlZF9ibG9ja3MpOworCisJLyogVXBkYXRlIHRoZSBmcmVlIHNwYWNlIGNvdW50cyAqLworCXBlcmNwdV9jb3VudGVyX21vZCgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlciwKKwkJCSAgIGlucHV0LT5mcmVlX2Jsb2Nrc19jb3VudCk7CisJcGVyY3B1X2NvdW50ZXJfbW9kKCZzYmktPnNfZnJlZWlub2Rlc19jb3VudGVyLAorCQkJICAgRVhUM19JTk9ERVNfUEVSX0dST1VQKHNiKSk7CisKKwlleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBFWFQzX1NCKHNiKS0+c19zYmgpOworCXNiLT5zX2RpcnQgPSAxOworCitleGl0X2pvdXJuYWw6CisJdW5sb2NrX3N1cGVyKHNiKTsKKwlpZiAoKGVycjIgPSBleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpKSAmJiAhZXJyKQorCQllcnIgPSBlcnIyOworCWlmICghZXJyKSB7CisJCXVwZGF0ZV9iYWNrdXBzKHNiLCBzYmktPnNfc2JoLT5iX2Jsb2NrbnIsIChjaGFyICopZXMsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrKSk7CisJCXVwZGF0ZV9iYWNrdXBzKHNiLCBwcmltYXJ5LT5iX2Jsb2NrbnIsIHByaW1hcnktPmJfZGF0YSwKKwkJCSAgICAgICBwcmltYXJ5LT5iX3NpemUpOworCX0KK2V4aXRfcHV0OgorCWlwdXQoaW5vZGUpOworCXJldHVybiBlcnI7Cit9IC8qIGV4dDNfZ3JvdXBfYWRkICovCisKKy8qIEV4dGVuZCB0aGUgZmlsZXN5c3RlbSB0byB0aGUgbmV3IG51bWJlciBvZiBibG9ja3Mgc3BlY2lmaWVkLiAgVGhpcyBlbnRyeQorICogcG9pbnQgaXMgb25seSB1c2VkIHRvIGV4dGVuZCB0aGUgY3VycmVudCBmaWxlc3lzdGVtIHRvIHRoZSBlbmQgb2YgdGhlIGxhc3QKKyAqIGV4aXN0aW5nIGdyb3VwLiAgSXQgY2FuIGJlIGFjY2Vzc2VkIHZpYSBpb2N0bCwgb3IgYnkgInJlbW91bnQscmVzaXplPTxzaXplPiIKKyAqIGZvciBlbWVyZ2VuY2llcyAoYmVjYXVzZSBpdCBoYXMgbm8gZGVwZW5kZW5jaWVzIG9uIHJlc2VydmVkIGJsb2NrcykuCisgKgorICogSWYgd2UgX3JlYWxseV8gd2FudGVkLCB3ZSBjb3VsZCB1c2UgZGVmYXVsdCB2YWx1ZXMgdG8gY2FsbCBleHQzX2dyb3VwX2FkZCgpCisgKiBhbGxvdyB0aGUgInJlbW91bnQiIHRyaWNrIHRvIHdvcmsgZm9yIGFyYml0cmFyeSByZXNpemluZywgYXNzdW1pbmcgZW5vdWdoCisgKiBHRFQgYmxvY2tzIGFyZSByZXNlcnZlZCB0byBncm93IHRvIHRoZSBkZXNpcmVkIHNpemUuCisgKi8KK2ludCBleHQzX2dyb3VwX2V4dGVuZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqZXMsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgbl9ibG9ja3NfY291bnQpCit7CisJdW5zaWduZWQgbG9uZyBvX2Jsb2Nrc19jb3VudDsKKwl1bnNpZ25lZCBsb25nIG9fZ3JvdXBzX2NvdW50OworCXVuc2lnbmVkIGxvbmcgbGFzdDsKKwlpbnQgYWRkOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCWhhbmRsZV90ICpoYW5kbGU7CisJaW50IGVyciwgZnJlZWRfYmxvY2tzOworCisJLyogV2UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBsb2NraW5nIHdydCBvdGhlciByZXNpemVycyBqdXN0CisJICogeWV0OiB3ZSdyZSBnb2luZyB0byByZXZhbGlkYXRlIGVzLT5zX2Jsb2Nrc19jb3VudCBhZnRlcgorCSAqIHRha2luZyBsb2NrX3N1cGVyKCkgYmVsb3cuICovCisJb19ibG9ja3NfY291bnQgPSBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpOworCW9fZ3JvdXBzX2NvdW50ID0gRVhUM19TQihzYiktPnNfZ3JvdXBzX2NvdW50OworCisJaWYgKHRlc3Rfb3B0KHNiLCBERUJVRykpCisJCXByaW50ayhLRVJOX0RFQlVHICJFWFQzLWZzOiBleHRlbmRpbmcgbGFzdCBncm91cCBmcm9tICVsdSB0byAlbHUgYmxvY2tzXG4iLAorCQkgICAgICAgb19ibG9ja3NfY291bnQsIG5fYmxvY2tzX2NvdW50KTsKKworCWlmIChuX2Jsb2Nrc19jb3VudCA9PSAwIHx8IG5fYmxvY2tzX2NvdW50ID09IG9fYmxvY2tzX2NvdW50KQorCQlyZXR1cm4gMDsKKworCWlmIChuX2Jsb2Nrc19jb3VudCA8IG9fYmxvY2tzX2NvdW50KSB7CisJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAiY2FuJ3Qgc2hyaW5rIEZTIC0gcmVzaXplIGFib3J0ZWQiKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKiBIYW5kbGUgdGhlIHJlbWFpbmluZyBibG9ja3MgaW4gdGhlIGxhc3QgZ3JvdXAgb25seS4gKi8KKwlsYXN0ID0gKG9fYmxvY2tzX2NvdW50IC0gbGUzMl90b19jcHUoZXMtPnNfZmlyc3RfZGF0YV9ibG9jaykpICUKKwkJRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKTsKKworCWlmIChsYXN0ID09IDApIHsKKwkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sCisJCQkgICAgICJuZWVkIHRvIHVzZSBleHQyb25saW5lIHRvIHJlc2l6ZSBmdXJ0aGVyXG4iKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlhZGQgPSBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpIC0gbGFzdDsKKworCWlmIChvX2Jsb2Nrc19jb3VudCArIGFkZCA+IG5fYmxvY2tzX2NvdW50KQorCQlhZGQgPSBuX2Jsb2Nrc19jb3VudCAtIG9fYmxvY2tzX2NvdW50OworCisJaWYgKG9fYmxvY2tzX2NvdW50ICsgYWRkIDwgbl9ibG9ja3NfY291bnQpCisJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAid2lsbCBvbmx5IGZpbmlzaCBncm91cCAoJWx1IGJsb2NrcywgJXUgbmV3KSIsCisJCQkgICAgIG9fYmxvY2tzX2NvdW50ICsgYWRkLCBhZGQpOworCisJLyogU2VlIGlmIHRoZSBkZXZpY2UgaXMgYWN0dWFsbHkgYXMgYmlnIGFzIHdoYXQgd2FzIHJlcXVlc3RlZCAqLworCWJoID0gc2JfYnJlYWQoc2IsIG9fYmxvY2tzX2NvdW50ICsgYWRkIC0xKTsKKwlpZiAoIWJoKSB7CisJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAiY2FuJ3QgcmVhZCBsYXN0IGJsb2NrLCByZXNpemUgYWJvcnRlZCIpOworCQlyZXR1cm4gLUVOT1NQQzsKKwl9CisJYnJlbHNlKGJoKTsKKworCS8qIFdlIHdpbGwgdXBkYXRlIHRoZSBzdXBlcmJsb2NrLCBvbmUgYmxvY2sgYml0bWFwLCBhbmQKKwkgKiBvbmUgZ3JvdXAgZGVzY3JpcHRvciB2aWEgZXh0M19mcmVlX2Jsb2NrcygpLgorCSAqLworCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydF9zYihzYiwgMyk7CisJaWYgKElTX0VSUihoYW5kbGUpKSB7CisJCWVyciA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJZXh0M193YXJuaW5nKHNiLCBfX0ZVTkNUSU9OX18sICJlcnJvciAlZCBvbiBqb3VybmFsIHN0YXJ0IixlcnIpOworCQlnb3RvIGV4aXRfcHV0OworCX0KKworCWxvY2tfc3VwZXIoc2IpOworCWlmIChvX2Jsb2Nrc19jb3VudCAhPSBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpKSB7CisJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAibXVsdGlwbGUgcmVzaXplcnMgcnVuIG9uIGZpbGVzeXN0ZW0hXG4iKTsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIGV4aXRfcHV0OworCX0KKworCWlmICgoZXJyID0gZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLAorCQkJCQkJIEVYVDNfU0Ioc2IpLT5zX3NiaCkpKSB7CisJCWV4dDNfd2FybmluZyhzYiwgX19GVU5DVElPTl9fLAorCQkJICAgICAiZXJyb3IgJWQgb24gam91cm5hbCB3cml0ZSBhY2Nlc3MiLCBlcnIpOworCQl1bmxvY2tfc3VwZXIoc2IpOworCQlleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOworCQlnb3RvIGV4aXRfcHV0OworCX0KKwllcy0+c19ibG9ja3NfY291bnQgPSBjcHVfdG9fbGUzMihvX2Jsb2Nrc19jb3VudCArIGFkZCk7CisJZXh0M19qb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgRVhUM19TQihzYiktPnNfc2JoKTsKKwlzYi0+c19kaXJ0ID0gMTsKKwl1bmxvY2tfc3VwZXIoc2IpOworCWV4dDNfZGVidWcoImZyZWVpbmcgYmxvY2tzICVsZCB0aHJvdWdoICVsZFxuIiwgb19ibG9ja3NfY291bnQsCisJCSAgIG9fYmxvY2tzX2NvdW50ICsgYWRkKTsKKwlleHQzX2ZyZWVfYmxvY2tzX3NiKGhhbmRsZSwgc2IsIG9fYmxvY2tzX2NvdW50LCBhZGQsICZmcmVlZF9ibG9ja3MpOworCWV4dDNfZGVidWcoImZyZWVkIGJsb2NrcyAlbGQgdGhyb3VnaCAlbGRcbiIsIG9fYmxvY2tzX2NvdW50LAorCQkgICBvX2Jsb2Nrc19jb3VudCArIGFkZCk7CisJaWYgKChlcnIgPSBleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpKSkKKwkJZ290byBleGl0X3B1dDsKKwlpZiAodGVzdF9vcHQoc2IsIERFQlVHKSkKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkVYVDMtZnM6IGV4dGVuZGVkIGdyb3VwIHRvICV1IGJsb2Nrc1xuIiwKKwkJICAgICAgIGxlMzJfdG9fY3B1KGVzLT5zX2Jsb2Nrc19jb3VudCkpOworCXVwZGF0ZV9iYWNrdXBzKHNiLCBFWFQzX1NCKHNiKS0+c19zYmgtPmJfYmxvY2tuciwgKGNoYXIgKillcywKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jaykpOworZXhpdF9wdXQ6CisJcmV0dXJuIGVycjsKK30gLyogZXh0M19ncm91cF9leHRlbmQgKi8KZGlmZiAtLWdpdCBhL2ZzL2V4dDMvc3VwZXIuYyBiL2ZzL2V4dDMvc3VwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDViNDQwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0My9zdXBlci5jCkBAIC0wLDAgKzEsMjUzOSBAQAorLyoKKyAqICBsaW51eC9mcy9leHQzL3N1cGVyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUKKyAqIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKKyAqIExhYm9yYXRvaXJlIE1BU0kgLSBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogIGZyb20KKyAqCisgKiAgbGludXgvZnMvbWluaXgvaW5vZGUuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKgorICogIEJpZy1lbmRpYW4gdG8gbGl0dGxlLWVuZGlhbiBieXRlLXN3YXBwaW5nL2JpdG1hcHMgYnkKKyAqICAgICAgICBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXAucnV0Z2Vycy5lZHUpLCAxOTk1CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2piZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHQzX2piZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSAieGF0dHIuaCIKKyNpbmNsdWRlICJhY2wuaCIKKworc3RhdGljIGludCBleHQzX2xvYWRfam91cm5hbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKik7CitzdGF0aWMgaW50IGV4dDNfY3JlYXRlX2pvdXJuYWwoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICosCisJCQkgICAgICAgaW50KTsKK3N0YXRpYyB2b2lkIGV4dDNfY29tbWl0X3N1cGVyIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwkJCSAgICAgICBzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqIGVzLAorCQkJICAgICAgIGludCBzeW5jKTsKK3N0YXRpYyB2b2lkIGV4dDNfbWFya19yZWNvdmVyeV9jb21wbGV0ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwkJCQkJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKiBlcyk7CitzdGF0aWMgdm9pZCBleHQzX2NsZWFyX2pvdXJuYWxfZXJyKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLAorCQkJCSAgIHN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICogZXMpOworc3RhdGljIGludCBleHQzX3N5bmNfZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHdhaXQpOworc3RhdGljIGNvbnN0IGNoYXIgKmV4dDNfZGVjb2RlX2Vycm9yKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBpbnQgZXJybm8sCisJCQkJICAgICBjaGFyIG5idWZbMTZdKTsKK3N0YXRpYyBpbnQgZXh0M19yZW1vdW50IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgaW50ICogZmxhZ3MsIGNoYXIgKiBkYXRhKTsKK3N0YXRpYyBpbnQgZXh0M19zdGF0ZnMgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBzdHJ1Y3Qga3N0YXRmcyAqIGJ1Zik7CitzdGF0aWMgdm9pZCBleHQzX3VubG9ja2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworc3RhdGljIHZvaWQgZXh0M193cml0ZV9zdXBlciAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpOworc3RhdGljIHZvaWQgZXh0M193cml0ZV9zdXBlcl9sb2NrZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CisKKy8qIAorICogV3JhcHBlcnMgZm9yIGpvdXJuYWxfc3RhcnQvZW5kLgorICoKKyAqIFRoZSBvbmx5IHNwZWNpYWwgdGhpbmcgd2UgbmVlZCB0byBkbyBoZXJlIGlzIHRvIG1ha2Ugc3VyZSB0aGF0IGFsbAorICogam91cm5hbF9lbmQgY2FsbHMgcmVzdWx0IGluIHRoZSBzdXBlcmJsb2NrIGJlaW5nIG1hcmtlZCBkaXJ0eSwgc28KKyAqIHRoYXQgc3luYygpIHdpbGwgY2FsbCB0aGUgZmlsZXN5c3RlbSdzIHdyaXRlX3N1cGVyIGNhbGxiYWNrIGlmCisgKiBhcHByb3ByaWF0ZS4gCisgKi8KK2hhbmRsZV90ICpleHQzX2pvdXJuYWxfc3RhcnRfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IG5ibG9ja3MpCit7CisJam91cm5hbF90ICpqb3VybmFsOworCisJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQorCQlyZXR1cm4gRVJSX1BUUigtRVJPRlMpOworCisJLyogU3BlY2lhbCBjYXNlIGhlcmU6IGlmIHRoZSBqb3VybmFsIGhhcyBhYm9ydGVkIGJlaGluZCBvdXIKKwkgKiBiYWNrcyAoZWcuIEVJTyBpbiB0aGUgY29tbWl0IHRocmVhZCksIHRoZW4gd2Ugc3RpbGwgbmVlZCB0bworCSAqIHRha2UgdGhlIEZTIGl0c2VsZiByZWFkb25seSBjbGVhbmx5LiAqLworCWpvdXJuYWwgPSBFWFQzX1NCKHNiKS0+c19qb3VybmFsOworCWlmIChpc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkpIHsKKwkJZXh0M19hYm9ydChzYiwgX19GVU5DVElPTl9fLAorCQkJICAgIkRldGVjdGVkIGFib3J0ZWQgam91cm5hbCIpOworCQlyZXR1cm4gRVJSX1BUUigtRVJPRlMpOworCX0KKworCXJldHVybiBqb3VybmFsX3N0YXJ0KGpvdXJuYWwsIG5ibG9ja3MpOworfQorCisvKiAKKyAqIFRoZSBvbmx5IHNwZWNpYWwgdGhpbmcgd2UgbmVlZCB0byBkbyBoZXJlIGlzIHRvIG1ha2Ugc3VyZSB0aGF0IGFsbAorICogam91cm5hbF9zdG9wIGNhbGxzIHJlc3VsdCBpbiB0aGUgc3VwZXJibG9jayBiZWluZyBtYXJrZWQgZGlydHksIHNvCisgKiB0aGF0IHN5bmMoKSB3aWxsIGNhbGwgdGhlIGZpbGVzeXN0ZW0ncyB3cml0ZV9zdXBlciBjYWxsYmFjayBpZgorICogYXBwcm9wcmlhdGUuIAorICovCitpbnQgX19leHQzX2pvdXJuYWxfc3RvcChjb25zdCBjaGFyICp3aGVyZSwgaGFuZGxlX3QgKmhhbmRsZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCWludCBlcnI7CisJaW50IHJjOworCisJc2IgPSBoYW5kbGUtPmhfdHJhbnNhY3Rpb24tPnRfam91cm5hbC0+al9wcml2YXRlOworCWVyciA9IGhhbmRsZS0+aF9lcnI7CisJcmMgPSBqb3VybmFsX3N0b3AoaGFuZGxlKTsKKworCWlmICghZXJyKQorCQllcnIgPSByYzsKKwlpZiAoZXJyKQorCQlfX2V4dDNfc3RkX2Vycm9yKHNiLCB3aGVyZSwgZXJyKTsKKwlyZXR1cm4gZXJyOworfQorCit2b2lkIGV4dDNfam91cm5hbF9hYm9ydF9oYW5kbGUoY29uc3QgY2hhciAqY2FsbGVyLCBjb25zdCBjaGFyICplcnJfZm4sCisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGhhbmRsZV90ICpoYW5kbGUsIGludCBlcnIpCit7CisJY2hhciBuYnVmWzE2XTsKKwljb25zdCBjaGFyICplcnJzdHIgPSBleHQzX2RlY29kZV9lcnJvcihOVUxMLCBlcnIsIG5idWYpOworCisJaWYgKGJoKQorCQlCVUZGRVJfVFJBQ0UoYmgsICJhYm9ydCIpOworCisJaWYgKCFoYW5kbGUtPmhfZXJyKQorCQloYW5kbGUtPmhfZXJyID0gZXJyOworCisJaWYgKGlzX2hhbmRsZV9hYm9ydGVkKGhhbmRsZSkpCisJCXJldHVybjsKKworCXByaW50ayhLRVJOX0VSUiAiJXM6IGFib3J0aW5nIHRyYW5zYWN0aW9uOiAlcyBpbiAlc1xuIiwKKwkgICAgICAgY2FsbGVyLCBlcnJzdHIsIGVycl9mbik7CisKKwlqb3VybmFsX2Fib3J0X2hhbmRsZShoYW5kbGUpOworfQorCisvKiBEZWFsIHdpdGggdGhlIHJlcG9ydGluZyBvZiBmYWlsdXJlIGNvbmRpdGlvbnMgb24gYSBmaWxlc3lzdGVtIHN1Y2ggYXMKKyAqIGluY29uc2lzdGVuY2llcyBkZXRlY3RlZCBvciByZWFkIElPIGZhaWx1cmVzLgorICoKKyAqIE9uIGV4dDIsIHdlIGNhbiBzdG9yZSB0aGUgZXJyb3Igc3RhdGUgb2YgdGhlIGZpbGVzeXN0ZW0gaW4gdGhlCisgKiBzdXBlcmJsb2NrLiAgVGhhdCBpcyBub3QgcG9zc2libGUgb24gZXh0MywgYmVjYXVzZSB3ZSBtYXkgaGF2ZSBvdGhlcgorICogd3JpdGUgb3JkZXJpbmcgY29uc3RyYWludHMgb24gdGhlIHN1cGVyYmxvY2sgd2hpY2ggcHJldmVudCB1cyBmcm9tCisgKiB3cml0aW5nIGl0IG91dCBzdHJhaWdodCBhd2F5OyBhbmQgZ2l2ZW4gdGhhdCB0aGUgam91cm5hbCBpcyBhYm91dCB0bworICogYmUgYWJvcnRlZCwgd2UgY2FuJ3QgcmVseSBvbiB0aGUgY3VycmVudCwgb3IgZnV0dXJlLCB0cmFuc2FjdGlvbnMgdG8KKyAqIHdyaXRlIG91dCB0aGUgc3VwZXJibG9jayBzYWZlbHkuCisgKgorICogV2UnbGwganVzdCB1c2UgdGhlIGpvdXJuYWxfYWJvcnQoKSBlcnJvciBjb2RlIHRvIHJlY29yZCBhbiBlcnJvciBpbgorICogdGhlIGpvdXJuYWwgaW5zdGVhZC4gIE9uIHJlY292ZXJ5LCB0aGUgam91cm5hbCB3aWxsIGNvbXBhaW4gYWJvdXQKKyAqIHRoYXQgZXJyb3IgdW50aWwgd2UndmUgbm90ZWQgaXQgZG93biBhbmQgY2xlYXJlZCBpdC4KKyAqLworCitzdGF0aWMgdm9pZCBleHQzX2hhbmRsZV9lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICplcyA9IEVYVDNfU0Ioc2IpLT5zX2VzOworCisJRVhUM19TQihzYiktPnNfbW91bnRfc3RhdGUgfD0gRVhUM19FUlJPUl9GUzsKKwllcy0+c19zdGF0ZSB8PSBjcHVfdG9fbGUxNihFWFQzX0VSUk9SX0ZTKTsKKworCWlmIChzYi0+c19mbGFncyAmIE1TX1JET05MWSkKKwkJcmV0dXJuOworCisJaWYgKHRlc3Rfb3B0IChzYiwgRVJST1JTX1JPKSkgeworCQlwcmludGsgKEtFUk5fQ1JJVCAiUmVtb3VudGluZyBmaWxlc3lzdGVtIHJlYWQtb25seVxuIik7CisJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKKwl9IGVsc2UgeworCQlqb3VybmFsX3QgKmpvdXJuYWwgPSBFWFQzX1NCKHNiKS0+c19qb3VybmFsOworCisJCUVYVDNfU0Ioc2IpLT5zX21vdW50X29wdCB8PSBFWFQzX01PVU5UX0FCT1JUOworCQlpZiAoam91cm5hbCkKKwkJCWpvdXJuYWxfYWJvcnQoam91cm5hbCwgLUVJTyk7CisJfQorCWlmICh0ZXN0X29wdChzYiwgRVJST1JTX1BBTklDKSkKKwkJcGFuaWMoIkVYVDMtZnMgKGRldmljZSAlcyk6IHBhbmljIGZvcmNlZCBhZnRlciBlcnJvclxuIiwKKwkJCXNiLT5zX2lkKTsKKwlleHQzX2NvbW1pdF9zdXBlcihzYiwgZXMsIDEpOworfQorCit2b2lkIGV4dDNfZXJyb3IgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBjb25zdCBjaGFyICogZnVuY3Rpb24sCisJCSBjb25zdCBjaGFyICogZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKwlwcmludGsoS0VSTl9DUklUICJFWFQzLWZzIGVycm9yIChkZXZpY2UgJXMpOiAlczogIixzYi0+c19pZCwgZnVuY3Rpb24pOworCXZwcmludGsoZm10LCBhcmdzKTsKKwlwcmludGsoIlxuIik7CisJdmFfZW5kKGFyZ3MpOworCisJZXh0M19oYW5kbGVfZXJyb3Ioc2IpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZXh0M19kZWNvZGVfZXJyb3Ioc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIGludCBlcnJubywKKwkJCQkgICAgIGNoYXIgbmJ1ZlsxNl0pCit7CisJY2hhciAqZXJyc3RyID0gTlVMTDsKKworCXN3aXRjaCAoZXJybm8pIHsKKwljYXNlIC1FSU86CisJCWVycnN0ciA9ICJJTyBmYWlsdXJlIjsKKwkJYnJlYWs7CisJY2FzZSAtRU5PTUVNOgorCQllcnJzdHIgPSAiT3V0IG9mIG1lbW9yeSI7CisJCWJyZWFrOworCWNhc2UgLUVST0ZTOgorCQlpZiAoIXNiIHx8IEVYVDNfU0Ioc2IpLT5zX2pvdXJuYWwtPmpfZmxhZ3MgJiBKRlNfQUJPUlQpCisJCQllcnJzdHIgPSAiSm91cm5hbCBoYXMgYWJvcnRlZCI7CisJCWVsc2UKKwkJCWVycnN0ciA9ICJSZWFkb25seSBmaWxlc3lzdGVtIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogSWYgdGhlIGNhbGxlciBwYXNzZWQgaW4gYW4gZXh0cmEgYnVmZmVyIGZvciB1bmtub3duCisJCSAqIGVycm9ycywgdGV4dHVhbGlzZSB0aGVtIG5vdy4gIEVsc2Ugd2UganVzdCByZXR1cm4KKwkJICogTlVMTC4gKi8KKwkJaWYgKG5idWYpIHsKKwkJCS8qIENoZWNrIGZvciB0cnVuY2F0ZWQgZXJyb3IgY29kZXMuLi4gKi8KKwkJCWlmIChzbnByaW50ZihuYnVmLCAxNiwgImVycm9yICVkIiwgLWVycm5vKSA+PSAwKQorCQkJCWVycnN0ciA9IG5idWY7CisJCX0KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGVycnN0cjsKK30KKworLyogX19leHQzX3N0ZF9lcnJvciBkZWNvZGVzIGV4cGVjdGVkIGVycm9ycyBmcm9tIGpvdXJuYWxpbmcgZnVuY3Rpb25zCisgKiBhdXRvbWF0aWNhbGx5IGFuZCBpbnZva2VzIHRoZSBhcHByb3ByaWF0ZSBlcnJvciByZXNwb25zZS4gICovCisKK3ZvaWQgX19leHQzX3N0ZF9lcnJvciAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIGNvbnN0IGNoYXIgKiBmdW5jdGlvbiwKKwkJICAgICAgIGludCBlcnJubykKK3sKKwljaGFyIG5idWZbMTZdOworCWNvbnN0IGNoYXIgKmVycnN0ciA9IGV4dDNfZGVjb2RlX2Vycm9yKHNiLCBlcnJubywgbmJ1Zik7CisKKwlwcmludGsgKEtFUk5fQ1JJVCAiRVhUMy1mcyBlcnJvciAoZGV2aWNlICVzKSBpbiAlczogJXNcbiIsCisJCXNiLT5zX2lkLCBmdW5jdGlvbiwgZXJyc3RyKTsKKworCWV4dDNfaGFuZGxlX2Vycm9yKHNiKTsKK30KKworLyoKKyAqIGV4dDNfYWJvcnQgaXMgYSBtdWNoIHN0cm9uZ2VyIGZhaWx1cmUgaGFuZGxlciB0aGFuIGV4dDNfZXJyb3IuICBUaGUKKyAqIGFib3J0IGZ1bmN0aW9uIG1heSBiZSB1c2VkIHRvIGRlYWwgd2l0aCB1bnJlY292ZXJhYmxlIGZhaWx1cmVzIHN1Y2gKKyAqIGFzIGpvdXJuYWwgSU8gZXJyb3JzIG9yIEVOT01FTSBhdCBhIGNyaXRpY2FsIG1vbWVudCBpbiBsb2cgbWFuYWdlbWVudC4KKyAqCisgKiBXZSB1bmNvbmRpdGlvbmFsbHkgZm9yY2UgdGhlIGZpbGVzeXN0ZW0gaW50byBhbiBBQk9SVHxSRUFET05MWSBzdGF0ZSwKKyAqIHVubGVzcyB0aGUgZXJyb3IgcmVzcG9uc2Ugb24gdGhlIGZzIGhhcyBiZWVuIHNldCB0byBwYW5pYyBpbiB3aGljaAorICogY2FzZSB3ZSB0YWtlIHRoZSBlYXN5IHdheSBvdXQgYW5kIHBhbmljIGltbWVkaWF0ZWx5LgorICovCisKK3ZvaWQgZXh0M19hYm9ydCAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIGNvbnN0IGNoYXIgKiBmdW5jdGlvbiwKKwkJIGNvbnN0IGNoYXIgKiBmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisKKwlwcmludGsgKEtFUk5fQ1JJVCAiZXh0M19hYm9ydCBjYWxsZWQuXG4iKTsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJcHJpbnRrKEtFUk5fQ1JJVCAiRVhUMy1mcyBlcnJvciAoZGV2aWNlICVzKTogJXM6ICIsc2ItPnNfaWQsIGZ1bmN0aW9uKTsKKwl2cHJpbnRrKGZtdCwgYXJncyk7CisJcHJpbnRrKCJcbiIpOworCXZhX2VuZChhcmdzKTsKKworCWlmICh0ZXN0X29wdChzYiwgRVJST1JTX1BBTklDKSkKKwkJcGFuaWMoIkVYVDMtZnMgcGFuaWMgZnJvbSBwcmV2aW91cyBlcnJvclxuIik7CisKKwlpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpCisJCXJldHVybjsKKworCXByaW50ayhLRVJOX0NSSVQgIlJlbW91bnRpbmcgZmlsZXN5c3RlbSByZWFkLW9ubHlcbiIpOworCUVYVDNfU0Ioc2IpLT5zX21vdW50X3N0YXRlIHw9IEVYVDNfRVJST1JfRlM7CisJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCUVYVDNfU0Ioc2IpLT5zX21vdW50X29wdCB8PSBFWFQzX01PVU5UX0FCT1JUOworCWpvdXJuYWxfYWJvcnQoRVhUM19TQihzYiktPnNfam91cm5hbCwgLUVJTyk7Cit9CisKK3ZvaWQgZXh0M193YXJuaW5nIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgY29uc3QgY2hhciAqIGZ1bmN0aW9uLAorCQkgICBjb25zdCBjaGFyICogZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKwlwcmludGsoS0VSTl9XQVJOSU5HICJFWFQzLWZzIHdhcm5pbmcgKGRldmljZSAlcyk6ICVzOiAiLAorCSAgICAgICBzYi0+c19pZCwgZnVuY3Rpb24pOworCXZwcmludGsoZm10LCBhcmdzKTsKKwlwcmludGsoIlxuIik7CisJdmFfZW5kKGFyZ3MpOworfQorCit2b2lkIGV4dDNfdXBkYXRlX2R5bmFtaWNfcmV2KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKmVzID0gRVhUM19TQihzYiktPnNfZXM7CisKKwlpZiAobGUzMl90b19jcHUoZXMtPnNfcmV2X2xldmVsKSA+IEVYVDNfR09PRF9PTERfUkVWKQorCQlyZXR1cm47CisKKwlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywKKwkJICAgICAidXBkYXRpbmcgdG8gcmV2ICVkIGJlY2F1c2Ugb2YgbmV3IGZlYXR1cmUgZmxhZywgIgorCQkgICAgICJydW5uaW5nIGUyZnNjayBpcyByZWNvbW1lbmRlZCIsCisJCSAgICAgRVhUM19EWU5BTUlDX1JFVik7CisKKwllcy0+c19maXJzdF9pbm8gPSBjcHVfdG9fbGUzMihFWFQzX0dPT0RfT0xEX0ZJUlNUX0lOTyk7CisJZXMtPnNfaW5vZGVfc2l6ZSA9IGNwdV90b19sZTE2KEVYVDNfR09PRF9PTERfSU5PREVfU0laRSk7CisJZXMtPnNfcmV2X2xldmVsID0gY3B1X3RvX2xlMzIoRVhUM19EWU5BTUlDX1JFVik7CisJLyogbGVhdmUgZXMtPnNfZmVhdHVyZV8qY29tcGF0IGZsYWdzIGFsb25lICovCisJLyogZXMtPnNfdXVpZCB3aWxsIGJlIHNldCBieSBlMmZzY2sgaWYgZW1wdHkgKi8KKworCS8qCisJICogVGhlIHJlc3Qgb2YgdGhlIHN1cGVyYmxvY2sgZmllbGRzIHNob3VsZCBiZSB6ZXJvLCBhbmQgaWYgbm90IGl0CisJICogbWVhbnMgdGhleSBhcmUgbGlrZWx5IGFscmVhZHkgaW4gdXNlLCBzbyBsZWF2ZSB0aGVtIGFsb25lLiAgV2UKKwkgKiBjYW4gbGVhdmUgaXQgdXAgdG8gZTJmc2NrIHRvIGNsZWFuIHVwIGFueSBpbmNvbnNpc3RlbmNpZXMgdGhlcmUuCisJICovCit9CisKKy8qCisgKiBPcGVuIHRoZSBleHRlcm5hbCBqb3VybmFsIGRldmljZQorICovCitzdGF0aWMgc3RydWN0IGJsb2NrX2RldmljZSAqZXh0M19ibGtkZXZfZ2V0KGRldl90IGRldikKK3sKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OworCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKKworCWJkZXYgPSBvcGVuX2J5X2Rldm51bShkZXYsIEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpOworCWlmIChJU19FUlIoYmRldikpCisJCWdvdG8gZmFpbDsKKwlyZXR1cm4gYmRldjsKKworZmFpbDoKKwlwcmludGsoS0VSTl9FUlIgIkVYVDM6IGZhaWxlZCB0byBvcGVuIGpvdXJuYWwgZGV2aWNlICVzOiAlbGRcbiIsCisJCQlfX2JkZXZuYW1lKGRldiwgYiksIFBUUl9FUlIoYmRldikpOworCXJldHVybiBOVUxMOworfQorCisvKgorICogUmVsZWFzZSB0aGUgam91cm5hbCBkZXZpY2UKKyAqLworc3RhdGljIGludCBleHQzX2Jsa2Rldl9wdXQoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKK3sKKwliZF9yZWxlYXNlKGJkZXYpOworCXJldHVybiBibGtkZXZfcHV0KGJkZXYpOworfQorCitzdGF0aWMgaW50IGV4dDNfYmxrZGV2X3JlbW92ZShzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmkpCit7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKKwlpbnQgcmV0ID0gLUVOT0RFVjsKKworCWJkZXYgPSBzYmktPmpvdXJuYWxfYmRldjsKKwlpZiAoYmRldikgeworCQlyZXQgPSBleHQzX2Jsa2Rldl9wdXQoYmRldik7CisJCXNiaS0+am91cm5hbF9iZGV2ID0gTlVMTDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW5vZGUgKm9ycGhhbl9saXN0X2VudHJ5KHN0cnVjdCBsaXN0X2hlYWQgKmwpCit7CisJcmV0dXJuICZsaXN0X2VudHJ5KGwsIHN0cnVjdCBleHQzX2lub2RlX2luZm8sIGlfb3JwaGFuKS0+dmZzX2lub2RlOworfQorCitzdGF0aWMgdm9pZCBkdW1wX29ycGhhbl9saXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBleHQzX3NiX2luZm8gKnNiaSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsOworCisJcHJpbnRrKEtFUk5fRVJSICJzYiBvcnBoYW4gaGVhZCBpcyAlZFxuIiwgCisJICAgICAgIGxlMzJfdG9fY3B1KHNiaS0+c19lcy0+c19sYXN0X29ycGhhbikpOworCisJcHJpbnRrKEtFUk5fRVJSICJzYl9pbmZvIG9ycGhhbiBsaXN0OlxuIik7CisJbGlzdF9mb3JfZWFjaChsLCAmc2JpLT5zX29ycGhhbikgeworCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gb3JwaGFuX2xpc3RfZW50cnkobCk7CisJCXByaW50ayhLRVJOX0VSUiAiICAiCisJCSAgICAgICAiaW5vZGUgJXM6JWxkIGF0ICVwOiBtb2RlICVvLCBubGluayAlZCwgbmV4dCAlZFxuIiwKKwkJICAgICAgIGlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8sIGlub2RlLAorCQkgICAgICAgaW5vZGUtPmlfbW9kZSwgaW5vZGUtPmlfbmxpbmssIAorCQkgICAgICAgTkVYVF9PUlBIQU4oaW5vZGUpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGV4dDNfcHV0X3N1cGVyIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYikKK3sKKwlzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmkgPSBFWFQzX1NCKHNiKTsKKwlzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqZXMgPSBzYmktPnNfZXM7CisJaW50IGk7CisKKwlleHQzX3hhdHRyX3B1dF9zdXBlcihzYik7CisJam91cm5hbF9kZXN0cm95KHNiaS0+c19qb3VybmFsKTsKKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJRVhUM19DTEVBUl9JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUik7CisJCWVzLT5zX3N0YXRlID0gY3B1X3RvX2xlMTYoc2JpLT5zX21vdW50X3N0YXRlKTsKKwkJQlVGRkVSX1RSQUNFKHNiaS0+c19zYmgsICJtYXJraW5nIGRpcnR5Iik7CisJCW1hcmtfYnVmZmVyX2RpcnR5KHNiaS0+c19zYmgpOworCQlleHQzX2NvbW1pdF9zdXBlcihzYiwgZXMsIDEpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBzYmktPnNfZ2RiX2NvdW50OyBpKyspCisJCWJyZWxzZShzYmktPnNfZ3JvdXBfZGVzY1tpXSk7CisJa2ZyZWUoc2JpLT5zX2dyb3VwX2Rlc2MpOworCXBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koJnNiaS0+c19mcmVlYmxvY2tzX2NvdW50ZXIpOworCXBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koJnNiaS0+c19mcmVlaW5vZGVzX2NvdW50ZXIpOworCXBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koJnNiaS0+c19kaXJzX2NvdW50ZXIpOworCWJyZWxzZShzYmktPnNfc2JoKTsKKyNpZmRlZiBDT05GSUdfUVVPVEEKKwlmb3IgKGkgPSAwOyBpIDwgTUFYUVVPVEFTOyBpKyspCisJCWtmcmVlKHNiaS0+c19xZl9uYW1lc1tpXSk7CisjZW5kaWYKKworCS8qIERlYnVnZ2luZyBjb2RlIGp1c3QgaW4gY2FzZSB0aGUgaW4tbWVtb3J5IGlub2RlIG9ycGhhbiBsaXN0CisJICogaXNuJ3QgZW1wdHkuICBUaGUgb24tZGlzayBvbmUgY2FuIGJlIG5vbi1lbXB0eSBpZiB3ZSd2ZQorCSAqIGRldGVjdGVkIGFuIGVycm9yIGFuZCB0YWtlbiB0aGUgZnMgcmVhZG9ubHksIGJ1dCB0aGUKKwkgKiBpbi1tZW1vcnkgbGlzdCBoYWQgYmV0dGVyIGJlIGNsZWFuIGJ5IHRoaXMgcG9pbnQuICovCisJaWYgKCFsaXN0X2VtcHR5KCZzYmktPnNfb3JwaGFuKSkKKwkJZHVtcF9vcnBoYW5fbGlzdChzYiwgc2JpKTsKKwlKX0FTU0VSVChsaXN0X2VtcHR5KCZzYmktPnNfb3JwaGFuKSk7CisKKwlpbnZhbGlkYXRlX2JkZXYoc2ItPnNfYmRldiwgMCk7CisJaWYgKHNiaS0+am91cm5hbF9iZGV2ICYmIHNiaS0+am91cm5hbF9iZGV2ICE9IHNiLT5zX2JkZXYpIHsKKwkJLyoKKwkJICogSW52YWxpZGF0ZSB0aGUgam91cm5hbCBkZXZpY2UncyBidWZmZXJzLiAgV2UgZG9uJ3Qgd2FudCB0aGVtCisJCSAqIGZsb2F0aW5nIGFib3V0IGluIG1lbW9yeSAtIHRoZSBwaHlzaWNhbCBqb3VybmFsIGRldmljZSBtYXkKKwkJICogaG90c3dhcHBlZCwgYW5kIGl0IGJyZWFrcyB0aGUgYHJvLWFmdGVyJyB0ZXN0aW5nIGNvZGUuCisJCSAqLworCQlzeW5jX2Jsb2NrZGV2KHNiaS0+am91cm5hbF9iZGV2KTsKKwkJaW52YWxpZGF0ZV9iZGV2KHNiaS0+am91cm5hbF9iZGV2LCAwKTsKKwkJZXh0M19ibGtkZXZfcmVtb3ZlKHNiaSk7CisJfQorCXNiLT5zX2ZzX2luZm8gPSBOVUxMOworCWtmcmVlKHNiaSk7CisJcmV0dXJuOworfQorCitzdGF0aWMga21lbV9jYWNoZV90ICpleHQzX2lub2RlX2NhY2hlcDsKKworLyoKKyAqIENhbGxlZCBpbnNpZGUgdHJhbnNhY3Rpb24sIHNvIHVzZSBHRlBfTk9GUworICovCitzdGF0aWMgc3RydWN0IGlub2RlICpleHQzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGV4dDNfaW5vZGVfaW5mbyAqZWk7CisKKwllaSA9IGttZW1fY2FjaGVfYWxsb2MoZXh0M19pbm9kZV9jYWNoZXAsIFNMQUJfTk9GUyk7CisJaWYgKCFlaSkKKwkJcmV0dXJuIE5VTEw7CisjaWZkZWYgQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMCisJZWktPmlfYWNsID0gRVhUM19BQ0xfTk9UX0NBQ0hFRDsKKwllaS0+aV9kZWZhdWx0X2FjbCA9IEVYVDNfQUNMX05PVF9DQUNIRUQ7CisjZW5kaWYKKwllaS0+aV9ibG9ja19hbGxvY19pbmZvID0gTlVMTDsKKwllaS0+dmZzX2lub2RlLmlfdmVyc2lvbiA9IDE7CisJcmV0dXJuICZlaS0+dmZzX2lub2RlOworfQorCitzdGF0aWMgdm9pZCBleHQzX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlrbWVtX2NhY2hlX2ZyZWUoZXh0M19pbm9kZV9jYWNoZXAsIEVYVDNfSShpbm9kZSkpOworfQorCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBleHQzX2lub2RlX2luZm8gKmVpID0gKHN0cnVjdCBleHQzX2lub2RlX2luZm8gKikgZm9vOworCisJaWYgKChmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CisJICAgIFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikgeworCQlJTklUX0xJU1RfSEVBRCgmZWktPmlfb3JwaGFuKTsKKyNpZmRlZiBDT05GSUdfRVhUM19GU19YQVRUUgorCQlpbml0X3J3c2VtKCZlaS0+eGF0dHJfc2VtKTsKKyNlbmRpZgorCQlpbml0X01VVEVYKCZlaS0+dHJ1bmNhdGVfc2VtKTsKKwkJaW5vZGVfaW5pdF9vbmNlKCZlaS0+dmZzX2lub2RlKTsKKwl9Cit9CisgCitzdGF0aWMgaW50IGluaXRfaW5vZGVjYWNoZSh2b2lkKQoreworCWV4dDNfaW5vZGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoImV4dDNfaW5vZGVfY2FjaGUiLAorCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgZXh0M19pbm9kZV9pbmZvKSwKKwkJCQkJICAgICAwLCBTTEFCX1JFQ0xBSU1fQUNDT1VOVCwKKwkJCQkJICAgICBpbml0X29uY2UsIE5VTEwpOworCWlmIChleHQzX2lub2RlX2NhY2hlcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGVzdHJveV9pbm9kZWNhY2hlKHZvaWQpCit7CisJaWYgKGttZW1fY2FjaGVfZGVzdHJveShleHQzX2lub2RlX2NhY2hlcCkpCisJCXByaW50ayhLRVJOX0lORk8gImV4dDNfaW5vZGVfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKK30KKworc3RhdGljIHZvaWQgZXh0M19jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBleHQzX2Jsb2NrX2FsbG9jX2luZm8gKnJzdiA9IEVYVDNfSShpbm9kZSktPmlfYmxvY2tfYWxsb2NfaW5mbzsKKyNpZmRlZiBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wKKyAgICAgICBpZiAoRVhUM19JKGlub2RlKS0+aV9hY2wgJiYKKyAgICAgICAgICAgRVhUM19JKGlub2RlKS0+aV9hY2wgIT0gRVhUM19BQ0xfTk9UX0NBQ0hFRCkgeworICAgICAgICAgICAgICAgcG9zaXhfYWNsX3JlbGVhc2UoRVhUM19JKGlub2RlKS0+aV9hY2wpOworICAgICAgICAgICAgICAgRVhUM19JKGlub2RlKS0+aV9hY2wgPSBFWFQzX0FDTF9OT1RfQ0FDSEVEOworICAgICAgIH0KKyAgICAgICBpZiAoRVhUM19JKGlub2RlKS0+aV9kZWZhdWx0X2FjbCAmJgorICAgICAgICAgICBFWFQzX0koaW5vZGUpLT5pX2RlZmF1bHRfYWNsICE9IEVYVDNfQUNMX05PVF9DQUNIRUQpIHsKKyAgICAgICAgICAgICAgIHBvc2l4X2FjbF9yZWxlYXNlKEVYVDNfSShpbm9kZSktPmlfZGVmYXVsdF9hY2wpOworICAgICAgICAgICAgICAgRVhUM19JKGlub2RlKS0+aV9kZWZhdWx0X2FjbCA9IEVYVDNfQUNMX05PVF9DQUNIRUQ7CisgICAgICAgfQorI2VuZGlmCisJZXh0M19kaXNjYXJkX3Jlc2VydmF0aW9uKGlub2RlKTsKKwlFWFQzX0koaW5vZGUpLT5pX2Jsb2NrX2FsbG9jX2luZm8gPSBOVUxMOworCWtmcmVlKHJzdik7Cit9CisKKyNpZmRlZiBDT05GSUdfUVVPVEEKKworI2RlZmluZSBRVFlQRTJOQU1FKHQpICgodCk9PVVTUlFVT1RBPyJ1c2VyIjoiZ3JvdXAiKQorI2RlZmluZSBRVFlQRTJNT1BUKG9uLCB0KSAoKHQpPT1VU1JRVU9UQT8oKG9uKSMjVVNSSlFVT1RBKTooKG9uKSMjR1JQSlFVT1RBKSkKKworc3RhdGljIGludCBleHQzX2RxdW90X2luaXRpYWxpemUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpOworc3RhdGljIGludCBleHQzX2RxdW90X2Ryb3Aoc3RydWN0IGlub2RlICppbm9kZSk7CitzdGF0aWMgaW50IGV4dDNfd3JpdGVfZHF1b3Qoc3RydWN0IGRxdW90ICpkcXVvdCk7CitzdGF0aWMgaW50IGV4dDNfYWNxdWlyZV9kcXVvdChzdHJ1Y3QgZHF1b3QgKmRxdW90KTsKK3N0YXRpYyBpbnQgZXh0M19yZWxlYXNlX2RxdW90KHN0cnVjdCBkcXVvdCAqZHF1b3QpOworc3RhdGljIGludCBleHQzX21hcmtfZHF1b3RfZGlydHkoc3RydWN0IGRxdW90ICpkcXVvdCk7CitzdGF0aWMgaW50IGV4dDNfd3JpdGVfaW5mbyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSk7CitzdGF0aWMgaW50IGV4dDNfcXVvdGFfb24oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIGludCBmb3JtYXRfaWQsIGNoYXIgKnBhdGgpOworc3RhdGljIGludCBleHQzX3F1b3RhX29uX21vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKTsKK3N0YXRpYyBzc2l6ZV90IGV4dDNfcXVvdGFfcmVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwgY2hhciAqZGF0YSwKKwkJCSAgICAgICBzaXplX3QgbGVuLCBsb2ZmX3Qgb2ZmKTsKK3N0YXRpYyBzc2l6ZV90IGV4dDNfcXVvdGFfd3JpdGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsCisJCQkJY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbiwgbG9mZl90IG9mZik7CisKK3N0YXRpYyBzdHJ1Y3QgZHF1b3Rfb3BlcmF0aW9ucyBleHQzX3F1b3RhX29wZXJhdGlvbnMgPSB7CisJLmluaXRpYWxpemUJPSBleHQzX2RxdW90X2luaXRpYWxpemUsCisJLmRyb3AJCT0gZXh0M19kcXVvdF9kcm9wLAorCS5hbGxvY19zcGFjZQk9IGRxdW90X2FsbG9jX3NwYWNlLAorCS5hbGxvY19pbm9kZQk9IGRxdW90X2FsbG9jX2lub2RlLAorCS5mcmVlX3NwYWNlCT0gZHF1b3RfZnJlZV9zcGFjZSwKKwkuZnJlZV9pbm9kZQk9IGRxdW90X2ZyZWVfaW5vZGUsCisJLnRyYW5zZmVyCT0gZHF1b3RfdHJhbnNmZXIsCisJLndyaXRlX2RxdW90CT0gZXh0M193cml0ZV9kcXVvdCwKKwkuYWNxdWlyZV9kcXVvdAk9IGV4dDNfYWNxdWlyZV9kcXVvdCwKKwkucmVsZWFzZV9kcXVvdAk9IGV4dDNfcmVsZWFzZV9kcXVvdCwKKwkubWFya19kaXJ0eQk9IGV4dDNfbWFya19kcXVvdF9kaXJ0eSwKKwkud3JpdGVfaW5mbwk9IGV4dDNfd3JpdGVfaW5mbworfTsKKworc3RhdGljIHN0cnVjdCBxdW90YWN0bF9vcHMgZXh0M19xY3RsX29wZXJhdGlvbnMgPSB7CisJLnF1b3RhX29uCT0gZXh0M19xdW90YV9vbiwKKwkucXVvdGFfb2ZmCT0gdmZzX3F1b3RhX29mZiwKKwkucXVvdGFfc3luYwk9IHZmc19xdW90YV9zeW5jLAorCS5nZXRfaW5mbwk9IHZmc19nZXRfZHFpbmZvLAorCS5zZXRfaW5mbwk9IHZmc19zZXRfZHFpbmZvLAorCS5nZXRfZHFibGsJPSB2ZnNfZ2V0X2RxYmxrLAorCS5zZXRfZHFibGsJPSB2ZnNfc2V0X2RxYmxrCit9OworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBleHQzX3NvcHMgPSB7CisJLmFsbG9jX2lub2RlCT0gZXh0M19hbGxvY19pbm9kZSwKKwkuZGVzdHJveV9pbm9kZQk9IGV4dDNfZGVzdHJveV9pbm9kZSwKKwkucmVhZF9pbm9kZQk9IGV4dDNfcmVhZF9pbm9kZSwKKwkud3JpdGVfaW5vZGUJPSBleHQzX3dyaXRlX2lub2RlLAorCS5kaXJ0eV9pbm9kZQk9IGV4dDNfZGlydHlfaW5vZGUsCisJLmRlbGV0ZV9pbm9kZQk9IGV4dDNfZGVsZXRlX2lub2RlLAorCS5wdXRfc3VwZXIJPSBleHQzX3B1dF9zdXBlciwKKwkud3JpdGVfc3VwZXIJPSBleHQzX3dyaXRlX3N1cGVyLAorCS5zeW5jX2ZzCT0gZXh0M19zeW5jX2ZzLAorCS53cml0ZV9zdXBlcl9sb2NrZnMgPSBleHQzX3dyaXRlX3N1cGVyX2xvY2tmcywKKwkudW5sb2NrZnMJPSBleHQzX3VubG9ja2ZzLAorCS5zdGF0ZnMJCT0gZXh0M19zdGF0ZnMsCisJLnJlbW91bnRfZnMJPSBleHQzX3JlbW91bnQsCisJLmNsZWFyX2lub2RlCT0gZXh0M19jbGVhcl9pbm9kZSwKKyNpZmRlZiBDT05GSUdfUVVPVEEKKwkucXVvdGFfcmVhZAk9IGV4dDNfcXVvdGFfcmVhZCwKKwkucXVvdGFfd3JpdGUJPSBleHQzX3F1b3RhX3dyaXRlLAorI2VuZGlmCit9OworCitzdHJ1Y3QgZGVudHJ5ICpleHQzX2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqY2hpbGQpOworc3RhdGljIHN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyBleHQzX2V4cG9ydF9vcHMgPSB7CisJLmdldF9wYXJlbnQgPSBleHQzX2dldF9wYXJlbnQsCit9OworCitlbnVtIHsKKwlPcHRfYnNkX2RmLCBPcHRfbWluaXhfZGYsIE9wdF9ncnBpZCwgT3B0X25vZ3JwaWQsCisJT3B0X3Jlc2dpZCwgT3B0X3Jlc3VpZCwgT3B0X3NiLCBPcHRfZXJyX2NvbnQsIE9wdF9lcnJfcGFuaWMsIE9wdF9lcnJfcm8sCisJT3B0X25vdWlkMzIsIE9wdF9jaGVjaywgT3B0X25vY2hlY2ssIE9wdF9kZWJ1ZywgT3B0X29sZGFsbG9jLCBPcHRfb3Jsb3YsCisJT3B0X3VzZXJfeGF0dHIsIE9wdF9ub3VzZXJfeGF0dHIsIE9wdF9hY2wsIE9wdF9ub2FjbCwKKwlPcHRfcmVzZXJ2YXRpb24sIE9wdF9ub3Jlc2VydmF0aW9uLCBPcHRfbm9sb2FkLCBPcHRfbm9iaCwKKwlPcHRfY29tbWl0LCBPcHRfam91cm5hbF91cGRhdGUsIE9wdF9qb3VybmFsX2ludW0sCisJT3B0X2Fib3J0LCBPcHRfZGF0YV9qb3VybmFsLCBPcHRfZGF0YV9vcmRlcmVkLCBPcHRfZGF0YV93cml0ZWJhY2ssCisJT3B0X3VzcmpxdW90YSwgT3B0X2dycGpxdW90YSwgT3B0X29mZnVzcmpxdW90YSwgT3B0X29mZmdycGpxdW90YSwKKwlPcHRfanFmbXRfdmZzb2xkLCBPcHRfanFmbXRfdmZzdjAsCisJT3B0X2lnbm9yZSwgT3B0X2JhcnJpZXIsIE9wdF9lcnIsIE9wdF9yZXNpemUsCit9OworCitzdGF0aWMgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CisJe09wdF9ic2RfZGYsICJic2RkZiJ9LAorCXtPcHRfbWluaXhfZGYsICJtaW5peGRmIn0sCisJe09wdF9ncnBpZCwgImdycGlkIn0sCisJe09wdF9ncnBpZCwgImJzZGdyb3VwcyJ9LAorCXtPcHRfbm9ncnBpZCwgIm5vZ3JwaWQifSwKKwl7T3B0X25vZ3JwaWQsICJzeXN2Z3JvdXBzIn0sCisJe09wdF9yZXNnaWQsICJyZXNnaWQ9JXUifSwKKwl7T3B0X3Jlc3VpZCwgInJlc3VpZD0ldSJ9LAorCXtPcHRfc2IsICJzYj0ldSJ9LAorCXtPcHRfZXJyX2NvbnQsICJlcnJvcnM9Y29udGludWUifSwKKwl7T3B0X2Vycl9wYW5pYywgImVycm9ycz1wYW5pYyJ9LAorCXtPcHRfZXJyX3JvLCAiZXJyb3JzPXJlbW91bnQtcm8ifSwKKwl7T3B0X25vdWlkMzIsICJub3VpZDMyIn0sCisJe09wdF9ub2NoZWNrLCAibm9jaGVjayJ9LAorCXtPcHRfbm9jaGVjaywgImNoZWNrPW5vbmUifSwKKwl7T3B0X2NoZWNrLCAiY2hlY2sifSwKKwl7T3B0X2RlYnVnLCAiZGVidWcifSwKKwl7T3B0X29sZGFsbG9jLCAib2xkYWxsb2MifSwKKwl7T3B0X29ybG92LCAib3Jsb3YifSwKKwl7T3B0X3VzZXJfeGF0dHIsICJ1c2VyX3hhdHRyIn0sCisJe09wdF9ub3VzZXJfeGF0dHIsICJub3VzZXJfeGF0dHIifSwKKwl7T3B0X2FjbCwgImFjbCJ9LAorCXtPcHRfbm9hY2wsICJub2FjbCJ9LAorCXtPcHRfcmVzZXJ2YXRpb24sICJyZXNlcnZhdGlvbiJ9LAorCXtPcHRfbm9yZXNlcnZhdGlvbiwgIm5vcmVzZXJ2YXRpb24ifSwKKwl7T3B0X25vbG9hZCwgIm5vbG9hZCJ9LAorCXtPcHRfbm9iaCwgIm5vYmgifSwKKwl7T3B0X2NvbW1pdCwgImNvbW1pdD0ldSJ9LAorCXtPcHRfam91cm5hbF91cGRhdGUsICJqb3VybmFsPXVwZGF0ZSJ9LAorCXtPcHRfam91cm5hbF9pbnVtLCAiam91cm5hbD0ldSJ9LAorCXtPcHRfYWJvcnQsICJhYm9ydCJ9LAorCXtPcHRfZGF0YV9qb3VybmFsLCAiZGF0YT1qb3VybmFsIn0sCisJe09wdF9kYXRhX29yZGVyZWQsICJkYXRhPW9yZGVyZWQifSwKKwl7T3B0X2RhdGFfd3JpdGViYWNrLCAiZGF0YT13cml0ZWJhY2sifSwKKwl7T3B0X29mZnVzcmpxdW90YSwgInVzcmpxdW90YT0ifSwKKwl7T3B0X3VzcmpxdW90YSwgInVzcmpxdW90YT0lcyJ9LAorCXtPcHRfb2ZmZ3JwanF1b3RhLCAiZ3JwanF1b3RhPSJ9LAorCXtPcHRfZ3JwanF1b3RhLCAiZ3JwanF1b3RhPSVzIn0sCisJe09wdF9qcWZtdF92ZnNvbGQsICJqcWZtdD12ZnNvbGQifSwKKwl7T3B0X2pxZm10X3Zmc3YwLCAianFmbXQ9dmZzdjAifSwKKwl7T3B0X2lnbm9yZSwgImdycHF1b3RhIn0sCisJe09wdF9pZ25vcmUsICJub3F1b3RhIn0sCisJe09wdF9pZ25vcmUsICJxdW90YSJ9LAorCXtPcHRfaWdub3JlLCAidXNycXVvdGEifSwKKwl7T3B0X2JhcnJpZXIsICJiYXJyaWVyPSV1In0sCisJe09wdF9lcnIsIE5VTEx9LAorCXtPcHRfcmVzaXplLCAicmVzaXplIn0sCit9OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfc2JfYmxvY2sodm9pZCAqKmRhdGEpCit7CisJdW5zaWduZWQgbG9uZyAJc2JfYmxvY2s7CisJY2hhciAJCSpvcHRpb25zID0gKGNoYXIgKikgKmRhdGE7CisKKwlpZiAoIW9wdGlvbnMgfHwgc3RybmNtcChvcHRpb25zLCAic2I9IiwgMykgIT0gMCkKKwkJcmV0dXJuIDE7CS8qIERlZmF1bHQgbG9jYXRpb24gKi8KKwlvcHRpb25zICs9IDM7CisJc2JfYmxvY2sgPSBzaW1wbGVfc3RydG91bChvcHRpb25zLCAmb3B0aW9ucywgMCk7CisJaWYgKCpvcHRpb25zICYmICpvcHRpb25zICE9ICcsJykgeworCQlwcmludGsoIkVYVDMtZnM6IEludmFsaWQgc2Igc3BlY2lmaWNhdGlvbjogJXNcbiIsCisJCSAgICAgICAoY2hhciAqKSAqZGF0YSk7CisJCXJldHVybiAxOworCX0KKwlpZiAoKm9wdGlvbnMgPT0gJywnKQorCQlvcHRpb25zKys7CisJKmRhdGEgPSAodm9pZCAqKSBvcHRpb25zOworCXJldHVybiBzYl9ibG9jazsKK30KKworc3RhdGljIGludCBwYXJzZV9vcHRpb25zIChjaGFyICogb3B0aW9ucywgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCSAgdW5zaWduZWQgbG9uZyAqIGludW0sIHVuc2lnbmVkIGxvbmcgKm5fYmxvY2tzX2NvdW50LCBpbnQgaXNfcmVtb3VudCkKK3sKKwlzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmkgPSBFWFQzX1NCKHNiKTsKKwljaGFyICogcDsKKwlzdWJzdHJpbmdfdCBhcmdzW01BWF9PUFRfQVJHU107CisJaW50IGRhdGFfb3B0ID0gMDsKKwlpbnQgb3B0aW9uOworI2lmZGVmIENPTkZJR19RVU9UQQorCWludCBxdHlwZTsKKwljaGFyICpxbmFtZTsKKyNlbmRpZgorCisJaWYgKCFvcHRpb25zKQorCQlyZXR1cm4gMTsKKworCXdoaWxlICgocCA9IHN0cnNlcCAoJm9wdGlvbnMsICIsIikpICE9IE5VTEwpIHsKKwkJaW50IHRva2VuOworCQlpZiAoISpwKQorCQkJY29udGludWU7CisKKwkJdG9rZW4gPSBtYXRjaF90b2tlbihwLCB0b2tlbnMsIGFyZ3MpOworCQlzd2l0Y2ggKHRva2VuKSB7CisJCWNhc2UgT3B0X2JzZF9kZjoKKwkJCWNsZWFyX29wdCAoc2JpLT5zX21vdW50X29wdCwgTUlOSVhfREYpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X21pbml4X2RmOgorCQkJc2V0X29wdCAoc2JpLT5zX21vdW50X29wdCwgTUlOSVhfREYpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2dycGlkOgorCQkJc2V0X29wdCAoc2JpLT5zX21vdW50X29wdCwgR1JQSUQpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X25vZ3JwaWQ6CisJCQljbGVhcl9vcHQgKHNiaS0+c19tb3VudF9vcHQsIEdSUElEKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9yZXN1aWQ6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMDsKKwkJCXNiaS0+c19yZXN1aWQgPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfcmVzZ2lkOgorCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpCisJCQkJcmV0dXJuIDA7CisJCQlzYmktPnNfcmVzZ2lkID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3NiOgorCQkJLyogaGFuZGxlZCBieSBnZXRfc2JfYmxvY2soKSBpbnN0ZWFkIG9mIGhlcmUgKi8KKwkJCS8qICpzYl9ibG9jayA9IG1hdGNoX2ludCgmYXJnc1swXSk7ICovCisJCQlicmVhazsKKwkJY2FzZSBPcHRfZXJyX3BhbmljOgorCQkJY2xlYXJfb3B0IChzYmktPnNfbW91bnRfb3B0LCBFUlJPUlNfQ09OVCk7CisJCQljbGVhcl9vcHQgKHNiaS0+c19tb3VudF9vcHQsIEVSUk9SU19STyk7CisJCQlzZXRfb3B0IChzYmktPnNfbW91bnRfb3B0LCBFUlJPUlNfUEFOSUMpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2Vycl9ybzoKKwkJCWNsZWFyX29wdCAoc2JpLT5zX21vdW50X29wdCwgRVJST1JTX0NPTlQpOworCQkJY2xlYXJfb3B0IChzYmktPnNfbW91bnRfb3B0LCBFUlJPUlNfUEFOSUMpOworCQkJc2V0X29wdCAoc2JpLT5zX21vdW50X29wdCwgRVJST1JTX1JPKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9lcnJfY29udDoKKwkJCWNsZWFyX29wdCAoc2JpLT5zX21vdW50X29wdCwgRVJST1JTX1JPKTsKKwkJCWNsZWFyX29wdCAoc2JpLT5zX21vdW50X29wdCwgRVJST1JTX1BBTklDKTsKKwkJCXNldF9vcHQgKHNiaS0+c19tb3VudF9vcHQsIEVSUk9SU19DT05UKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9ub3VpZDMyOgorCQkJc2V0X29wdCAoc2JpLT5zX21vdW50X29wdCwgTk9fVUlEMzIpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2NoZWNrOgorI2lmZGVmIENPTkZJR19FWFQzX0NIRUNLCisJCQlzZXRfb3B0IChzYmktPnNfbW91bnRfb3B0LCBDSEVDSyk7CisjZWxzZQorCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIkVYVDMgQ2hlY2sgb3B0aW9uIG5vdCBzdXBwb3J0ZWRcbiIpOworI2VuZGlmCisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm9jaGVjazoKKwkJCWNsZWFyX29wdCAoc2JpLT5zX21vdW50X29wdCwgQ0hFQ0spOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2RlYnVnOgorCQkJc2V0X29wdCAoc2JpLT5zX21vdW50X29wdCwgREVCVUcpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X29sZGFsbG9jOgorCQkJc2V0X29wdCAoc2JpLT5zX21vdW50X29wdCwgT0xEQUxMT0MpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X29ybG92OgorCQkJY2xlYXJfb3B0IChzYmktPnNfbW91bnRfb3B0LCBPTERBTExPQyk7CisJCQlicmVhazsKKyNpZmRlZiBDT05GSUdfRVhUM19GU19YQVRUUgorCQljYXNlIE9wdF91c2VyX3hhdHRyOgorCQkJc2V0X29wdCAoc2JpLT5zX21vdW50X29wdCwgWEFUVFJfVVNFUik7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm91c2VyX3hhdHRyOgorCQkJY2xlYXJfb3B0IChzYmktPnNfbW91bnRfb3B0LCBYQVRUUl9VU0VSKTsKKwkJCWJyZWFrOworI2Vsc2UKKwkJY2FzZSBPcHRfdXNlcl94YXR0cjoKKwkJY2FzZSBPcHRfbm91c2VyX3hhdHRyOgorCQkJcHJpbnRrKCJFWFQzIChubyl1c2VyX3hhdHRyIG9wdGlvbnMgbm90IHN1cHBvcnRlZFxuIik7CisJCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTAorCQljYXNlIE9wdF9hY2w6CisJCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIFBPU0lYX0FDTCk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm9hY2w6CisJCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgUE9TSVhfQUNMKTsKKwkJCWJyZWFrOworI2Vsc2UKKwkJY2FzZSBPcHRfYWNsOgorCQljYXNlIE9wdF9ub2FjbDoKKwkJCXByaW50aygiRVhUMyAobm8pYWNsIG9wdGlvbnMgbm90IHN1cHBvcnRlZFxuIik7CisJCQlicmVhazsKKyNlbmRpZgorCQljYXNlIE9wdF9yZXNlcnZhdGlvbjoKKwkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgUkVTRVJWQVRJT04pOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X25vcmVzZXJ2YXRpb246CisJCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgUkVTRVJWQVRJT04pOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2pvdXJuYWxfdXBkYXRlOgorCQkJLyogQEBAIEZJWE1FICovCisJCQkvKiBFdmVudHVhbGx5IHdlIHdpbGwgd2FudCB0byBiZSBhYmxlIHRvIGNyZWF0ZQorCQkJICAgYSBqb3VybmFsIGZpbGUgaGVyZS4gIEZvciBub3csIG9ubHkgYWxsb3cgdGhlCisJCQkgICB1c2VyIHRvIHNwZWNpZnkgYW4gZXhpc3RpbmcgaW5vZGUgdG8gYmUgdGhlCisJCQkgICBqb3VybmFsIGZpbGUuICovCisJCQlpZiAoaXNfcmVtb3VudCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogY2Fubm90IHNwZWNpZnkgIgorCQkJCSAgICAgICAiam91cm5hbCBvbiByZW1vdW50XG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXNldF9vcHQgKHNiaS0+c19tb3VudF9vcHQsIFVQREFURV9KT1VSTkFMKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9qb3VybmFsX2ludW06CisJCQlpZiAoaXNfcmVtb3VudCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogY2Fubm90IHNwZWNpZnkgIgorCQkJCSAgICAgICAiam91cm5hbCBvbiByZW1vdW50XG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAwOworCQkJKmludW0gPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm9sb2FkOgorCQkJc2V0X29wdCAoc2JpLT5zX21vdW50X29wdCwgTk9MT0FEKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9jb21taXQ6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmIChvcHRpb24gPCAwKQorCQkJCXJldHVybiAwOworCQkJaWYgKG9wdGlvbiA9PSAwKQorCQkJCW9wdGlvbiA9IEpCRF9ERUZBVUxUX01BWF9DT01NSVRfQUdFOworCQkJc2JpLT5zX2NvbW1pdF9pbnRlcnZhbCA9IEhaICogb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2RhdGFfam91cm5hbDoKKwkJCWRhdGFfb3B0ID0gRVhUM19NT1VOVF9KT1VSTkFMX0RBVEE7CisJCQlnb3RvIGRhdGFjaGVjazsKKwkJY2FzZSBPcHRfZGF0YV9vcmRlcmVkOgorCQkJZGF0YV9vcHQgPSBFWFQzX01PVU5UX09SREVSRURfREFUQTsKKwkJCWdvdG8gZGF0YWNoZWNrOworCQljYXNlIE9wdF9kYXRhX3dyaXRlYmFjazoKKwkJCWRhdGFfb3B0ID0gRVhUM19NT1VOVF9XUklURUJBQ0tfREFUQTsKKwkJZGF0YWNoZWNrOgorCQkJaWYgKGlzX3JlbW91bnQpIHsKKwkJCQlpZiAoKHNiaS0+c19tb3VudF9vcHQgJiBFWFQzX01PVU5UX0RBVEFfRkxBR1MpCisJCQkJCQkhPSBkYXRhX29wdCkgeworCQkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkJCSJFWFQzLWZzOiBjYW5ub3QgY2hhbmdlIGRhdGEgIgorCQkJCQkJIm1vZGUgb24gcmVtb3VudFxuIik7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJc2JpLT5zX21vdW50X29wdCAmPSB+RVhUM19NT1VOVF9EQVRBX0ZMQUdTOworCQkJCXNiaS0+c19tb3VudF9vcHQgfD0gZGF0YV9vcHQ7CisJCQl9CisJCQlicmVhazsKKyNpZmRlZiBDT05GSUdfUVVPVEEKKwkJY2FzZSBPcHRfdXNyanF1b3RhOgorCQkJcXR5cGUgPSBVU1JRVU9UQTsKKwkJCWdvdG8gc2V0X3FmX25hbWU7CisJCWNhc2UgT3B0X2dycGpxdW90YToKKwkJCXF0eXBlID0gR1JQUVVPVEE7CitzZXRfcWZfbmFtZToKKwkJCWlmIChzYl9hbnlfcXVvdGFfZW5hYmxlZChzYikpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkJIkVYVDMtZnM6IENhbm5vdCBjaGFuZ2Ugam91cm5hbGxlZCAiCisJCQkJCSJxdW90YSBvcHRpb25zIHdoZW4gcXVvdGEgdHVybmVkIG9uLlxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlxbmFtZSA9IG1hdGNoX3N0cmR1cCgmYXJnc1swXSk7CisJCQlpZiAoIXFuYW1lKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCSJFWFQzLWZzOiBub3QgZW5vdWdoIG1lbW9yeSBmb3IgIgorCQkJCQkic3RvcmluZyBxdW90YWZpbGUgbmFtZS5cbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJaWYgKHNiaS0+c19xZl9uYW1lc1txdHlwZV0gJiYKKwkJCSAgICBzdHJjbXAoc2JpLT5zX3FmX25hbWVzW3F0eXBlXSwgcW5hbWUpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCSJFWFQzLWZzOiAlcyBxdW90YSBmaWxlIGFscmVhZHkgIgorCQkJCQkic3BlY2lmaWVkLlxuIiwgUVRZUEUyTkFNRShxdHlwZSkpOworCQkJCWtmcmVlKHFuYW1lKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXNiaS0+c19xZl9uYW1lc1txdHlwZV0gPSBxbmFtZTsKKwkJCWlmIChzdHJjaHIoc2JpLT5zX3FmX25hbWVzW3F0eXBlXSwgJy8nKSkgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCQkiRVhUMy1mczogcXVvdGFmaWxlIG11c3QgYmUgb24gIgorCQkJCQkiZmlsZXN5c3RlbSByb290LlxuIik7CisJCQkJa2ZyZWUoc2JpLT5zX3FmX25hbWVzW3F0eXBlXSk7CisJCQkJc2JpLT5zX3FmX25hbWVzW3F0eXBlXSA9IE5VTEw7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBPcHRfb2ZmdXNyanF1b3RhOgorCQkJcXR5cGUgPSBVU1JRVU9UQTsKKwkJCWdvdG8gY2xlYXJfcWZfbmFtZTsKKwkJY2FzZSBPcHRfb2ZmZ3JwanF1b3RhOgorCQkJcXR5cGUgPSBHUlBRVU9UQTsKK2NsZWFyX3FmX25hbWU6CisJCQlpZiAoc2JfYW55X3F1b3RhX2VuYWJsZWQoc2IpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBDYW5ub3QgY2hhbmdlICIKKwkJCQkJImpvdXJuYWxsZWQgcXVvdGEgb3B0aW9ucyB3aGVuICIKKwkJCQkJInF1b3RhIHR1cm5lZCBvbi5cbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJa2ZyZWUoc2JpLT5zX3FmX25hbWVzW3F0eXBlXSk7CisJCQlzYmktPnNfcWZfbmFtZXNbcXR5cGVdID0gTlVMTDsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9qcWZtdF92ZnNvbGQ6CisJCQlzYmktPnNfanF1b3RhX2ZtdCA9IFFGTVRfVkZTX09MRDsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9qcWZtdF92ZnN2MDoKKwkJCXNiaS0+c19qcXVvdGFfZm10ID0gUUZNVF9WRlNfVjA7CisJCQlicmVhazsKKyNlbHNlCisJCWNhc2UgT3B0X3VzcmpxdW90YToKKwkJY2FzZSBPcHRfZ3JwanF1b3RhOgorCQljYXNlIE9wdF9vZmZ1c3JqcXVvdGE6CisJCWNhc2UgT3B0X29mZmdycGpxdW90YToKKwkJY2FzZSBPcHRfanFmbXRfdmZzb2xkOgorCQljYXNlIE9wdF9qcWZtdF92ZnN2MDoKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJCSJFWFQzLWZzOiBqb3VybmFsbGVkIHF1b3RhIG9wdGlvbnMgbm90ICIKKwkJCQkic3VwcG9ydGVkLlxuIik7CisJCQlicmVhazsKKyNlbmRpZgorCQljYXNlIE9wdF9hYm9ydDoKKwkJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgQUJPUlQpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2JhcnJpZXI6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmIChvcHRpb24pCisJCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBCQVJSSUVSKTsKKwkJCWVsc2UKKwkJCQljbGVhcl9vcHQoc2JpLT5zX21vdW50X29wdCwgQkFSUklFUik7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfaWdub3JlOgorCQkJYnJlYWs7CisJCWNhc2UgT3B0X3Jlc2l6ZToKKwkJCWlmICghbl9ibG9ja3NfY291bnQpIHsKKwkJCQlwcmludGsoIkVYVDMtZnM6IHJlc2l6ZSBvcHRpb24gb25seSBhdmFpbGFibGUgIgorCQkJCQkiZm9yIHJlbW91bnRcbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJbWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKTsKKwkJCSpuX2Jsb2Nrc19jb3VudCA9IG9wdGlvbjsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9ub2JoOgorCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBOT0JIKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrIChLRVJOX0VSUgorCQkJCSJFWFQzLWZzOiBVbnJlY29nbml6ZWQgbW91bnQgb3B0aW9uIFwiJXNcIiAiCisJCQkJIm9yIG1pc3NpbmcgdmFsdWVcbiIsIHApOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisjaWZkZWYgQ09ORklHX1FVT1RBCisJaWYgKCFzYmktPnNfanF1b3RhX2ZtdCAmJiAoc2JpLT5zX3FmX25hbWVzW1VTUlFVT1RBXSB8fAorCSAgICBzYmktPnNfcWZfbmFtZXNbR1JQUVVPVEFdKSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJCSJFWFQzLWZzOiBqb3VybmFsbGVkIHF1b3RhIGZvcm1hdCBub3Qgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZXh0M19zZXR1cF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqZXMsCisJCQkgICAgaW50IHJlYWRfb25seSkKK3sKKwlzdHJ1Y3QgZXh0M19zYl9pbmZvICpzYmkgPSBFWFQzX1NCKHNiKTsKKwlpbnQgcmVzID0gMDsKKworCWlmIChsZTMyX3RvX2NwdShlcy0+c19yZXZfbGV2ZWwpID4gRVhUM19NQVhfU1VQUF9SRVYpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiRVhUMy1mcyB3YXJuaW5nOiByZXZpc2lvbiBsZXZlbCB0b28gaGlnaCwgIgorCQkJImZvcmNpbmcgcmVhZC1vbmx5IG1vZGVcbiIpOworCQlyZXMgPSBNU19SRE9OTFk7CisJfQorCWlmIChyZWFkX29ubHkpCisJCXJldHVybiByZXM7CisJaWYgKCEoc2JpLT5zX21vdW50X3N0YXRlICYgRVhUM19WQUxJRF9GUykpCisJCXByaW50ayAoS0VSTl9XQVJOSU5HICJFWFQzLWZzIHdhcm5pbmc6IG1vdW50aW5nIHVuY2hlY2tlZCBmcywgIgorCQkJInJ1bm5pbmcgZTJmc2NrIGlzIHJlY29tbWVuZGVkXG4iKTsKKwllbHNlIGlmICgoc2JpLT5zX21vdW50X3N0YXRlICYgRVhUM19FUlJPUl9GUykpCisJCXByaW50ayAoS0VSTl9XQVJOSU5HCisJCQkiRVhUMy1mcyB3YXJuaW5nOiBtb3VudGluZyBmcyB3aXRoIGVycm9ycywgIgorCQkJInJ1bm5pbmcgZTJmc2NrIGlzIHJlY29tbWVuZGVkXG4iKTsKKwllbHNlIGlmICgoX19zMTYpIGxlMTZfdG9fY3B1KGVzLT5zX21heF9tbnRfY291bnQpID49IDAgJiYKKwkJIGxlMTZfdG9fY3B1KGVzLT5zX21udF9jb3VudCkgPj0KKwkJICh1bnNpZ25lZCBzaG9ydCkgKF9fczE2KSBsZTE2X3RvX2NwdShlcy0+c19tYXhfbW50X2NvdW50KSkKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcKKwkJCSJFWFQzLWZzIHdhcm5pbmc6IG1heGltYWwgbW91bnQgY291bnQgcmVhY2hlZCwgIgorCQkJInJ1bm5pbmcgZTJmc2NrIGlzIHJlY29tbWVuZGVkXG4iKTsKKwllbHNlIGlmIChsZTMyX3RvX2NwdShlcy0+c19jaGVja2ludGVydmFsKSAmJgorCQkobGUzMl90b19jcHUoZXMtPnNfbGFzdGNoZWNrKSArCisJCQlsZTMyX3RvX2NwdShlcy0+c19jaGVja2ludGVydmFsKSA8PSBnZXRfc2Vjb25kcygpKSkKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcKKwkJCSJFWFQzLWZzIHdhcm5pbmc6IGNoZWNrdGltZSByZWFjaGVkLCAiCisJCQkicnVubmluZyBlMmZzY2sgaXMgcmVjb21tZW5kZWRcbiIpOworI2lmIDAKKwkJLyogQEBAIFdlIF93aWxsXyB3YW50IHRvIGNsZWFyIHRoZSB2YWxpZCBiaXQgaWYgd2UgZmluZAorICAgICAgICAgICAgICAgICAgIGluY29uc2lzdGVuY2llcywgdG8gZm9yY2UgYSBmc2NrIGF0IHJlYm9vdC4gIEJ1dCBmb3IKKyAgICAgICAgICAgICAgICAgICBhIHBsYWluIGpvdXJuYWxlZCBmaWxlc3lzdGVtIHdlIGNhbiBrZWVwIGl0IHNldCBhcworICAgICAgICAgICAgICAgICAgIHZhbGlkIGZvcmV2ZXIhIDopICovCisJZXMtPnNfc3RhdGUgPSBjcHVfdG9fbGUxNihsZTE2X3RvX2NwdShlcy0+c19zdGF0ZSkgJiB+RVhUM19WQUxJRF9GUyk7CisjZW5kaWYKKwlpZiAoIShfX3MxNikgbGUxNl90b19jcHUoZXMtPnNfbWF4X21udF9jb3VudCkpCisJCWVzLT5zX21heF9tbnRfY291bnQgPSBjcHVfdG9fbGUxNihFWFQzX0RGTF9NQVhfTU5UX0NPVU5UKTsKKwllcy0+c19tbnRfY291bnQ9Y3B1X3RvX2xlMTYobGUxNl90b19jcHUoZXMtPnNfbW50X2NvdW50KSArIDEpOworCWVzLT5zX210aW1lID0gY3B1X3RvX2xlMzIoZ2V0X3NlY29uZHMoKSk7CisJZXh0M191cGRhdGVfZHluYW1pY19yZXYoc2IpOworCUVYVDNfU0VUX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKTsKKworCWV4dDNfY29tbWl0X3N1cGVyKHNiLCBlcywgMSk7CisJaWYgKHRlc3Rfb3B0KHNiLCBERUJVRykpCisJCXByaW50ayhLRVJOX0lORk8gIltFWFQzIEZTIGJzPSVsdSwgZ2M9JWx1LCAiCisJCQkJImJwZz0lbHUsIGlwZz0lbHUsIG1vPSUwNGx4XVxuIiwKKwkJCXNiLT5zX2Jsb2Nrc2l6ZSwKKwkJCXNiaS0+c19ncm91cHNfY291bnQsCisJCQlFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpLAorCQkJRVhUM19JTk9ERVNfUEVSX0dST1VQKHNiKSwKKwkJCXNiaS0+c19tb3VudF9vcHQpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiRVhUMyBGUyBvbiAlcywgIiwgc2ItPnNfaWQpOworCWlmIChFWFQzX1NCKHNiKS0+c19qb3VybmFsLT5qX2lub2RlID09IE5VTEwpIHsKKwkJY2hhciBiW0JERVZOQU1FX1NJWkVdOworCisJCXByaW50aygiZXh0ZXJuYWwgam91cm5hbCBvbiAlc1xuIiwKKwkJCWJkZXZuYW1lKEVYVDNfU0Ioc2IpLT5zX2pvdXJuYWwtPmpfZGV2LCBiKSk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCJpbnRlcm5hbCBqb3VybmFsXG4iKTsKKwl9CisjaWZkZWYgQ09ORklHX0VYVDNfQ0hFQ0sKKwlpZiAodGVzdF9vcHQgKHNiLCBDSEVDSykpIHsKKwkJZXh0M19jaGVja19ibG9ja3NfYml0bWFwIChzYik7CisJCWV4dDNfY2hlY2tfaW5vZGVzX2JpdG1hcCAoc2IpOworCX0KKyNlbmRpZgorCXJldHVybiByZXM7Cit9CisKKy8qIENhbGxlZCBhdCBtb3VudC10aW1lLCBzdXBlci1ibG9jayBpcyBsb2NrZWQgKi8KK3N0YXRpYyBpbnQgZXh0M19jaGVja19kZXNjcmlwdG9ycyAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpCit7CisJc3RydWN0IGV4dDNfc2JfaW5mbyAqc2JpID0gRVhUM19TQihzYik7CisJdW5zaWduZWQgbG9uZyBibG9jayA9IGxlMzJfdG9fY3B1KHNiaS0+c19lcy0+c19maXJzdF9kYXRhX2Jsb2NrKTsKKwlzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICogZ2RwID0gTlVMTDsKKwlpbnQgZGVzY19ibG9jayA9IDA7CisJaW50IGk7CisKKwlleHQzX2RlYnVnICgiQ2hlY2tpbmcgZ3JvdXAgZGVzY3JpcHRvcnMiKTsKKworCWZvciAoaSA9IDA7IGkgPCBzYmktPnNfZ3JvdXBzX2NvdW50OyBpKyspCisJeworCQlpZiAoKGkgJSBFWFQzX0RFU0NfUEVSX0JMT0NLKHNiKSkgPT0gMCkKKwkJCWdkcCA9IChzdHJ1Y3QgZXh0M19ncm91cF9kZXNjICopCisJCQkJCXNiaS0+c19ncm91cF9kZXNjW2Rlc2NfYmxvY2srK10tPmJfZGF0YTsKKwkJaWYgKGxlMzJfdG9fY3B1KGdkcC0+YmdfYmxvY2tfYml0bWFwKSA8IGJsb2NrIHx8CisJCSAgICBsZTMyX3RvX2NwdShnZHAtPmJnX2Jsb2NrX2JpdG1hcCkgPj0KKwkJCQlibG9jayArIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYikpCisJCXsKKwkJCWV4dDNfZXJyb3IgKHNiLCAiZXh0M19jaGVja19kZXNjcmlwdG9ycyIsCisJCQkJICAgICJCbG9jayBiaXRtYXAgZm9yIGdyb3VwICVkIgorCQkJCSAgICAiIG5vdCBpbiBncm91cCAoYmxvY2sgJWx1KSEiLAorCQkJCSAgICBpLCAodW5zaWduZWQgbG9uZykKKwkJCQkJbGUzMl90b19jcHUoZ2RwLT5iZ19ibG9ja19iaXRtYXApKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChsZTMyX3RvX2NwdShnZHAtPmJnX2lub2RlX2JpdG1hcCkgPCBibG9jayB8fAorCQkgICAgbGUzMl90b19jcHUoZ2RwLT5iZ19pbm9kZV9iaXRtYXApID49CisJCQkJYmxvY2sgKyBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpKQorCQl7CisJCQlleHQzX2Vycm9yIChzYiwgImV4dDNfY2hlY2tfZGVzY3JpcHRvcnMiLAorCQkJCSAgICAiSW5vZGUgYml0bWFwIGZvciBncm91cCAlZCIKKwkJCQkgICAgIiBub3QgaW4gZ3JvdXAgKGJsb2NrICVsdSkhIiwKKwkJCQkgICAgaSwgKHVuc2lnbmVkIGxvbmcpCisJCQkJCWxlMzJfdG9fY3B1KGdkcC0+YmdfaW5vZGVfYml0bWFwKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAobGUzMl90b19jcHUoZ2RwLT5iZ19pbm9kZV90YWJsZSkgPCBibG9jayB8fAorCQkgICAgbGUzMl90b19jcHUoZ2RwLT5iZ19pbm9kZV90YWJsZSkgKyBzYmktPnNfaXRiX3Blcl9ncm91cCA+PQorCQkgICAgYmxvY2sgKyBFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpKQorCQl7CisJCQlleHQzX2Vycm9yIChzYiwgImV4dDNfY2hlY2tfZGVzY3JpcHRvcnMiLAorCQkJCSAgICAiSW5vZGUgdGFibGUgZm9yIGdyb3VwICVkIgorCQkJCSAgICAiIG5vdCBpbiBncm91cCAoYmxvY2sgJWx1KSEiLAorCQkJCSAgICBpLCAodW5zaWduZWQgbG9uZykKKwkJCQkJbGUzMl90b19jcHUoZ2RwLT5iZ19pbm9kZV90YWJsZSkpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYmxvY2sgKz0gRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKTsKKwkJZ2RwKys7CisJfQorCisJc2JpLT5zX2VzLT5zX2ZyZWVfYmxvY2tzX2NvdW50PWNwdV90b19sZTMyKGV4dDNfY291bnRfZnJlZV9ibG9ja3Moc2IpKTsKKwlzYmktPnNfZXMtPnNfZnJlZV9pbm9kZXNfY291bnQ9Y3B1X3RvX2xlMzIoZXh0M19jb3VudF9mcmVlX2lub2RlcyhzYikpOworCXJldHVybiAxOworfQorCisKKy8qIGV4dDNfb3JwaGFuX2NsZWFudXAoKSB3YWxrcyBhIHNpbmdseS1saW5rZWQgbGlzdCBvZiBpbm9kZXMgKHN0YXJ0aW5nIGF0CisgKiB0aGUgc3VwZXJibG9jaykgd2hpY2ggd2VyZSBkZWxldGVkIGZyb20gYWxsIGRpcmVjdG9yaWVzLCBidXQgaGVsZCBvcGVuIGJ5CisgKiBhIHByb2Nlc3MgYXQgdGhlIHRpbWUgb2YgYSBjcmFzaC4gIFdlIHdhbGsgdGhlIGxpc3QgYW5kIHRyeSB0byBkZWxldGUgdGhlc2UKKyAqIGlub2RlcyBhdCByZWNvdmVyeSB0aW1lIChvbmx5IHdpdGggYSByZWFkLXdyaXRlIGZpbGVzeXN0ZW0pLgorICoKKyAqIEluIG9yZGVyIHRvIGtlZXAgdGhlIG9ycGhhbiBpbm9kZSBjaGFpbiBjb25zaXN0ZW50IGR1cmluZyB0cmF2ZXJzYWwgKGluCisgKiBjYXNlIG9mIGNyYXNoIGR1cmluZyByZWNvdmVyeSksIHdlIGxpbmsgZWFjaCBpbm9kZSBpbnRvIHRoZSBzdXBlcmJsb2NrCisgKiBvcnBoYW4gbGlzdF9oZWFkIGFuZCBoYW5kbGUgaXQgdGhlIHNhbWUgd2F5IGFzIGFuIGlub2RlIGRlbGV0aW9uIGR1cmluZworICogbm9ybWFsIG9wZXJhdGlvbiAod2hpY2ggam91cm5hbHMgdGhlIG9wZXJhdGlvbnMgZm9yIHVzKS4KKyAqCisgKiBXZSBvbmx5IGRvIGFuIGlnZXQoKSBhbmQgYW4gaXB1dCgpIG9uIGVhY2ggaW5vZGUsIHdoaWNoIGlzIHZlcnkgc2FmZSBpZiB3ZQorICogYWNjaWRlbnRhbGx5IHBvaW50IGF0IGFuIGluLXVzZSBvciBhbHJlYWR5IGRlbGV0ZWQgaW5vZGUuICBUaGUgd29yc3QgdGhhdAorICogY2FuIGhhcHBlbiBpbiB0aGlzIGNhc2UgaXMgdGhhdCB3ZSBnZXQgYSAiYml0IGFscmVhZHkgY2xlYXJlZCIgbWVzc2FnZSBmcm9tCisgKiBleHQzX2ZyZWVfaW5vZGUoKS4gIFRoZSBvbmx5IHJlYXNvbiB3ZSB3b3VsZCBwb2ludCBhdCBhIHdyb25nIGlub2RlIGlzIGlmCisgKiBlMmZzY2sgd2FzIHJ1biBvbiB0aGlzIGZpbGVzeXN0ZW0sIGFuZCBpdCBtdXN0IGhhdmUgYWxyZWFkeSBkb25lIHRoZSBvcnBoYW4KKyAqIGlub2RlIGNsZWFudXAgZm9yIHVzLCBzbyB3ZSBjYW4gc2FmZWx5IGFib3J0IHdpdGhvdXQgYW55IGZ1cnRoZXIgYWN0aW9uLgorICovCitzdGF0aWMgdm9pZCBleHQzX29ycGhhbl9jbGVhbnVwIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwkJCQkgc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKiBlcykKK3sKKwl1bnNpZ25lZCBpbnQgc19mbGFncyA9IHNiLT5zX2ZsYWdzOworCWludCBucl9vcnBoYW5zID0gMCwgbnJfdHJ1bmNhdGVzID0gMDsKKyNpZmRlZiBDT05GSUdfUVVPVEEKKwlpbnQgaTsKKyNlbmRpZgorCWlmICghZXMtPnNfbGFzdF9vcnBoYW4pIHsKKwkJamJkX2RlYnVnKDQsICJubyBvcnBoYW4gaW5vZGVzIHRvIGNsZWFuIHVwXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChFWFQzX1NCKHNiKS0+c19tb3VudF9zdGF0ZSAmIEVYVDNfRVJST1JfRlMpIHsKKwkJaWYgKGVzLT5zX2xhc3Rfb3JwaGFuKQorCQkJamJkX2RlYnVnKDEsICJFcnJvcnMgb24gZmlsZXN5c3RlbSwgIgorCQkJCSAgImNsZWFyaW5nIG9ycGhhbiBsaXN0LlxuIik7CisJCWVzLT5zX2xhc3Rfb3JwaGFuID0gMDsKKwkJamJkX2RlYnVnKDEsICJTa2lwcGluZyBvcnBoYW4gcmVjb3Zlcnkgb24gZnMgd2l0aCBlcnJvcnMuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzX2ZsYWdzICYgTVNfUkRPTkxZKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkVYVDMtZnM6ICVzOiBvcnBoYW4gY2xlYW51cCBvbiByZWFkb25seSBmc1xuIiwKKwkJICAgICAgIHNiLT5zX2lkKTsKKwkJc2ItPnNfZmxhZ3MgJj0gfk1TX1JET05MWTsKKwl9CisjaWZkZWYgQ09ORklHX1FVT1RBCisJLyogTmVlZGVkIGZvciBpcHV0KCkgdG8gd29yayBjb3JyZWN0bHkgYW5kIG5vdCB0cmFzaCBkYXRhICovCisJc2ItPnNfZmxhZ3MgfD0gTVNfQUNUSVZFOworCS8qIFR1cm4gb24gcXVvdGFzIHNvIHRoYXQgdGhleSBhcmUgdXBkYXRlZCBjb3JyZWN0bHkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYUVVPVEFTOyBpKyspIHsKKwkJaWYgKEVYVDNfU0Ioc2IpLT5zX3FmX25hbWVzW2ldKSB7CisJCQlpbnQgcmV0ID0gZXh0M19xdW90YV9vbl9tb3VudChzYiwgaSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkJIkVYVDMtZnM6IENhbm5vdCB0dXJuIG9uIGpvdXJuYWxsZWQgIgorCQkJCQkicXVvdGE6IGVycm9yICVkXG4iLCByZXQpOworCQl9CisJfQorI2VuZGlmCisKKwl3aGlsZSAoZXMtPnNfbGFzdF9vcnBoYW4pIHsKKwkJc3RydWN0IGlub2RlICppbm9kZTsKKworCQlpZiAoIShpbm9kZSA9CisJCSAgICAgIGV4dDNfb3JwaGFuX2dldChzYiwgbGUzMl90b19jcHUoZXMtPnNfbGFzdF9vcnBoYW4pKSkpIHsKKwkJCWVzLT5zX2xhc3Rfb3JwaGFuID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJbGlzdF9hZGQoJkVYVDNfSShpbm9kZSktPmlfb3JwaGFuLCAmRVhUM19TQihzYiktPnNfb3JwaGFuKTsKKwkJRFFVT1RfSU5JVChpbm9kZSk7CisJCWlmIChpbm9kZS0+aV9ubGluaykgeworCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkiJXM6IHRydW5jYXRpbmcgaW5vZGUgJWxkIHRvICVMZCBieXRlc1xuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIGlub2RlLT5pX2lubywgaW5vZGUtPmlfc2l6ZSk7CisJCQlqYmRfZGVidWcoMiwgInRydW5jYXRpbmcgaW5vZGUgJWxkIHRvICVMZCBieXRlc1xuIiwKKwkJCQkgIGlub2RlLT5pX2lubywgaW5vZGUtPmlfc2l6ZSk7CisJCQlleHQzX3RydW5jYXRlKGlub2RlKTsKKwkJCW5yX3RydW5jYXRlcysrOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkiJXM6IGRlbGV0aW5nIHVucmVmZXJlbmNlZCBpbm9kZSAlbGRcbiIsCisJCQkJX19GVU5DVElPTl9fLCBpbm9kZS0+aV9pbm8pOworCQkJamJkX2RlYnVnKDIsICJkZWxldGluZyB1bnJlZmVyZW5jZWQgaW5vZGUgJWxkXG4iLAorCQkJCSAgaW5vZGUtPmlfaW5vKTsKKwkJCW5yX29ycGhhbnMrKzsKKwkJfQorCQlpcHV0KGlub2RlKTsgIC8qIFRoZSBkZWxldGUgbWFnaWMgaGFwcGVucyBoZXJlISAqLworCX0KKworI2RlZmluZSBQTFVSQUwoeCkgKHgpLCAoKHgpPT0xKSA/ICIiIDogInMiCisKKwlpZiAobnJfb3JwaGFucykKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRVhUMy1mczogJXM6ICVkIG9ycGhhbiBpbm9kZSVzIGRlbGV0ZWRcbiIsCisJCSAgICAgICBzYi0+c19pZCwgUExVUkFMKG5yX29ycGhhbnMpKTsKKwlpZiAobnJfdHJ1bmNhdGVzKQorCQlwcmludGsoS0VSTl9JTkZPICJFWFQzLWZzOiAlczogJWQgdHJ1bmNhdGUlcyBjbGVhbmVkIHVwXG4iLAorCQkgICAgICAgc2ItPnNfaWQsIFBMVVJBTChucl90cnVuY2F0ZXMpKTsKKyNpZmRlZiBDT05GSUdfUVVPVEEKKwkvKiBUdXJuIHF1b3RhcyBvZmYgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYUVVPVEFTOyBpKyspIHsKKwkJaWYgKHNiX2Rxb3B0KHNiKS0+ZmlsZXNbaV0pCisJCQl2ZnNfcXVvdGFfb2ZmKHNiLCBpKTsKKwl9CisjZW5kaWYKKwlzYi0+c19mbGFncyA9IHNfZmxhZ3M7IC8qIFJlc3RvcmUgTVNfUkRPTkxZIHN0YXR1cyAqLworfQorCisjZGVmaW5lIGxvZzIobikgZmZ6KH4obikpCisKKy8qCisgKiBNYXhpbWFsIGZpbGUgc2l6ZS4gIFRoZXJlIGlzIGEgZGlyZWN0LCBhbmQgeyxkb3VibGUtLHRyaXBsZS19aW5kaXJlY3QKKyAqIGJsb2NrIGxpbWl0LCBhbmQgYWxzbyBhIGxpbWl0IG9mICgyXjMyIC0gMSkgNTEyLWJ5dGUgc2VjdG9ycyBpbiBpX2Jsb2Nrcy4KKyAqIFdlIG5lZWQgdG8gYmUgMSBmaWxlc3lzdGVtIGJsb2NrIGxlc3MgdGhhbiB0aGUgMl4zMiBzZWN0b3IgbGltaXQuCisgKi8KK3N0YXRpYyBsb2ZmX3QgZXh0M19tYXhfc2l6ZShpbnQgYml0cykKK3sKKwlsb2ZmX3QgcmVzID0gRVhUM19ORElSX0JMT0NLUzsKKwkvKiBUaGlzIGNvbnN0YW50IGlzIGNhbGN1bGF0ZWQgdG8gYmUgdGhlIGxhcmdlc3QgZmlsZSBzaXplIGZvciBhCisJICogZGVuc2UsIDRrLWJsb2Nrc2l6ZSBmaWxlIHN1Y2ggdGhhdCB0aGUgdG90YWwgbnVtYmVyIG9mCisJICogc2VjdG9ycyBpbiB0aGUgZmlsZSwgaW5jbHVkaW5nIGRhdGEgYW5kIGFsbCBpbmRpcmVjdCBibG9ja3MsCisJICogZG9lcyBub3QgZXhjZWVkIDJeMzIuICovCisJY29uc3QgbG9mZl90IHVwcGVyX2xpbWl0ID0gMHgxZmY3ZmZmZDAwMExMOworCisJcmVzICs9IDFMTCA8PCAoYml0cy0yKTsKKwlyZXMgKz0gMUxMIDw8ICgyKihiaXRzLTIpKTsKKwlyZXMgKz0gMUxMIDw8ICgzKihiaXRzLTIpKTsKKwlyZXMgPDw9IGJpdHM7CisJaWYgKHJlcyA+IHVwcGVyX2xpbWl0KQorCQlyZXMgPSB1cHBlcl9saW1pdDsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkZXNjcmlwdG9yX2xvYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGxvZ2ljX3NiX2Jsb2NrLAorCQkJCSAgICBpbnQgbnIpCit7CisJc3RydWN0IGV4dDNfc2JfaW5mbyAqc2JpID0gRVhUM19TQihzYik7CisJdW5zaWduZWQgbG9uZyBiZywgZmlyc3RfZGF0YV9ibG9jaywgZmlyc3RfbWV0YV9iZzsKKwlpbnQgaGFzX3N1cGVyID0gMDsKKworCWZpcnN0X2RhdGFfYmxvY2sgPSBsZTMyX3RvX2NwdShzYmktPnNfZXMtPnNfZmlyc3RfZGF0YV9ibG9jayk7CisJZmlyc3RfbWV0YV9iZyA9IGxlMzJfdG9fY3B1KHNiaS0+c19lcy0+c19maXJzdF9tZXRhX2JnKTsKKworCWlmICghRVhUM19IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUM19GRUFUVVJFX0lOQ09NUEFUX01FVEFfQkcpIHx8CisJICAgIG5yIDwgZmlyc3RfbWV0YV9iZykKKwkJcmV0dXJuIChsb2dpY19zYl9ibG9jayArIG5yICsgMSk7CisJYmcgPSBzYmktPnNfZGVzY19wZXJfYmxvY2sgKiBucjsKKwlpZiAoZXh0M19iZ19oYXNfc3VwZXIoc2IsIGJnKSkKKwkJaGFzX3N1cGVyID0gMTsKKwlyZXR1cm4gKGZpcnN0X2RhdGFfYmxvY2sgKyBoYXNfc3VwZXIgKyAoYmcgKiBzYmktPnNfYmxvY2tzX3Blcl9ncm91cCkpOworfQorCisKK3N0YXRpYyBpbnQgZXh0M19maWxsX3N1cGVyIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICplcyA9IE5VTEw7CisJc3RydWN0IGV4dDNfc2JfaW5mbyAqc2JpOworCXVuc2lnbmVkIGxvbmcgYmxvY2s7CisJdW5zaWduZWQgbG9uZyBzYl9ibG9jayA9IGdldF9zYl9ibG9jaygmZGF0YSk7CisJdW5zaWduZWQgbG9uZyBsb2dpY19zYl9ibG9jazsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IDA7CisJdW5zaWduZWQgbG9uZyBqb3VybmFsX2ludW0gPSAwOworCXVuc2lnbmVkIGxvbmcgZGVmX21vdW50X29wdHM7CisJc3RydWN0IGlub2RlICpyb290OworCWludCBibG9ja3NpemU7CisJaW50IGhibG9jazsKKwlpbnQgZGJfY291bnQ7CisJaW50IGk7CisJaW50IG5lZWRzX3JlY292ZXJ5OworCV9fbGUzMiBmZWF0dXJlczsKKworCXNiaSA9IGttYWxsb2Moc2l6ZW9mKCpzYmkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNiaSkKKwkJcmV0dXJuIC1FTk9NRU07CisJc2ItPnNfZnNfaW5mbyA9IHNiaTsKKwltZW1zZXQoc2JpLCAwLCBzaXplb2YoKnNiaSkpOworCXNiaS0+c19tb3VudF9vcHQgPSAwOworCXNiaS0+c19yZXN1aWQgPSBFWFQzX0RFRl9SRVNVSUQ7CisJc2JpLT5zX3Jlc2dpZCA9IEVYVDNfREVGX1JFU0dJRDsKKworCXVubG9ja19rZXJuZWwoKTsKKworCWJsb2Nrc2l6ZSA9IHNiX21pbl9ibG9ja3NpemUoc2IsIEVYVDNfTUlOX0JMT0NLX1NJWkUpOworCWlmICghYmxvY2tzaXplKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogdW5hYmxlIHRvIHNldCBibG9ja3NpemVcbiIpOworCQlnb3RvIG91dF9mYWlsOworCX0KKworCS8qCisJICogVGhlIGV4dDMgc3VwZXJibG9jayB3aWxsIG5vdCBiZSBidWZmZXIgYWxpZ25lZCBmb3Igb3RoZXIgdGhhbiAxa0IKKwkgKiBibG9jayBzaXplcy4gIFdlIG5lZWQgdG8gY2FsY3VsYXRlIHRoZSBvZmZzZXQgZnJvbSBidWZmZXIgc3RhcnQuCisJICovCisJaWYgKGJsb2Nrc2l6ZSAhPSBFWFQzX01JTl9CTE9DS19TSVpFKSB7CisJCWxvZ2ljX3NiX2Jsb2NrID0gKHNiX2Jsb2NrICogRVhUM19NSU5fQkxPQ0tfU0laRSkgLyBibG9ja3NpemU7CisJCW9mZnNldCA9IChzYl9ibG9jayAqIEVYVDNfTUlOX0JMT0NLX1NJWkUpICUgYmxvY2tzaXplOworCX0gZWxzZSB7CisJCWxvZ2ljX3NiX2Jsb2NrID0gc2JfYmxvY2s7CisJfQorCisJaWYgKCEoYmggPSBzYl9icmVhZChzYiwgbG9naWNfc2JfYmxvY2spKSkgeworCQlwcmludGsgKEtFUk5fRVJSICJFWFQzLWZzOiB1bmFibGUgdG8gcmVhZCBzdXBlcmJsb2NrXG4iKTsKKwkJZ290byBvdXRfZmFpbDsKKwl9CisJLyoKKwkgKiBOb3RlOiBzX2VzIG11c3QgYmUgaW5pdGlhbGl6ZWQgYXMgc29vbiBhcyBwb3NzaWJsZSBiZWNhdXNlCisJICogICAgICAgc29tZSBleHQzIG1hY3JvLWluc3RydWN0aW9ucyBkZXBlbmQgb24gaXRzIHZhbHVlCisJICovCisJZXMgPSAoc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKikgKCgoY2hhciAqKWJoLT5iX2RhdGEpICsgb2Zmc2V0KTsKKwlzYmktPnNfZXMgPSBlczsKKwlzYi0+c19tYWdpYyA9IGxlMTZfdG9fY3B1KGVzLT5zX21hZ2ljKTsKKwlpZiAoc2ItPnNfbWFnaWMgIT0gRVhUM19TVVBFUl9NQUdJQykKKwkJZ290byBjYW50ZmluZF9leHQzOworCisJLyogU2V0IGRlZmF1bHRzIGJlZm9yZSB3ZSBwYXJzZSB0aGUgbW91bnQgb3B0aW9ucyAqLworCWRlZl9tb3VudF9vcHRzID0gbGUzMl90b19jcHUoZXMtPnNfZGVmYXVsdF9tb3VudF9vcHRzKTsKKwlpZiAoZGVmX21vdW50X29wdHMgJiBFWFQzX0RFRk1fREVCVUcpCisJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgREVCVUcpOworCWlmIChkZWZfbW91bnRfb3B0cyAmIEVYVDNfREVGTV9CU0RHUk9VUFMpCisJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgR1JQSUQpOworCWlmIChkZWZfbW91bnRfb3B0cyAmIEVYVDNfREVGTV9VSUQxNikKKwkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBOT19VSUQzMik7CisJaWYgKGRlZl9tb3VudF9vcHRzICYgRVhUM19ERUZNX1hBVFRSX1VTRVIpCisJCXNldF9vcHQoc2JpLT5zX21vdW50X29wdCwgWEFUVFJfVVNFUik7CisJaWYgKGRlZl9tb3VudF9vcHRzICYgRVhUM19ERUZNX0FDTCkKKwkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBQT1NJWF9BQ0wpOworCWlmICgoZGVmX21vdW50X29wdHMgJiBFWFQzX0RFRk1fSk1PREUpID09IEVYVDNfREVGTV9KTU9ERV9EQVRBKQorCQlzYmktPnNfbW91bnRfb3B0IHw9IEVYVDNfTU9VTlRfSk9VUk5BTF9EQVRBOworCWVsc2UgaWYgKChkZWZfbW91bnRfb3B0cyAmIEVYVDNfREVGTV9KTU9ERSkgPT0gRVhUM19ERUZNX0pNT0RFX09SREVSRUQpCisJCXNiaS0+c19tb3VudF9vcHQgfD0gRVhUM19NT1VOVF9PUkRFUkVEX0RBVEE7CisJZWxzZSBpZiAoKGRlZl9tb3VudF9vcHRzICYgRVhUM19ERUZNX0pNT0RFKSA9PSBFWFQzX0RFRk1fSk1PREVfV0JBQ0spCisJCXNiaS0+c19tb3VudF9vcHQgfD0gRVhUM19NT1VOVF9XUklURUJBQ0tfREFUQTsKKworCWlmIChsZTE2X3RvX2NwdShzYmktPnNfZXMtPnNfZXJyb3JzKSA9PSBFWFQzX0VSUk9SU19QQU5JQykKKwkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBFUlJPUlNfUEFOSUMpOworCWVsc2UgaWYgKGxlMTZfdG9fY3B1KHNiaS0+c19lcy0+c19lcnJvcnMpID09IEVYVDNfRVJST1JTX1JPKQorCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIEVSUk9SU19STyk7CisKKwlzYmktPnNfcmVzdWlkID0gbGUxNl90b19jcHUoZXMtPnNfZGVmX3Jlc3VpZCk7CisJc2JpLT5zX3Jlc2dpZCA9IGxlMTZfdG9fY3B1KGVzLT5zX2RlZl9yZXNnaWQpOworCisJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBSRVNFUlZBVElPTik7CisKKwlpZiAoIXBhcnNlX29wdGlvbnMgKChjaGFyICopIGRhdGEsIHNiLCAmam91cm5hbF9pbnVtLCBOVUxMLCAwKSkKKwkJZ290byBmYWlsZWRfbW91bnQ7CisKKwlzYi0+c19mbGFncyA9IChzYi0+c19mbGFncyAmIH5NU19QT1NJWEFDTCkgfAorCQkoKHNiaS0+c19tb3VudF9vcHQgJiBFWFQzX01PVU5UX1BPU0lYX0FDTCkgPyBNU19QT1NJWEFDTCA6IDApOworCisJaWYgKGxlMzJfdG9fY3B1KGVzLT5zX3Jldl9sZXZlbCkgPT0gRVhUM19HT09EX09MRF9SRVYgJiYKKwkgICAgKEVYVDNfSEFTX0NPTVBBVF9GRUFUVVJFKHNiLCB+MFUpIHx8CisJICAgICBFWFQzX0hBU19ST19DT01QQVRfRkVBVFVSRShzYiwgfjBVKSB8fAorCSAgICAgRVhUM19IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgfjBVKSkpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgCisJCSAgICAgICAiRVhUMy1mcyB3YXJuaW5nOiBmZWF0dXJlIGZsYWdzIHNldCBvbiByZXYgMCBmcywgIgorCQkgICAgICAgInJ1bm5pbmcgZTJmc2NrIGlzIHJlY29tbWVuZGVkXG4iKTsKKwkvKgorCSAqIENoZWNrIGZlYXR1cmUgZmxhZ3MgcmVnYXJkbGVzcyBvZiB0aGUgcmV2aXNpb24gbGV2ZWwsIHNpbmNlIHdlCisJICogcHJldmlvdXNseSBkaWRuJ3QgY2hhbmdlIHRoZSByZXZpc2lvbiBsZXZlbCB3aGVuIHNldHRpbmcgdGhlIGZsYWdzLAorCSAqIHNvIHRoZXJlIGlzIGEgY2hhbmNlIGluY29tcGF0IGZsYWdzIGFyZSBzZXQgb24gYSByZXYgMCBmaWxlc3lzdGVtLgorCSAqLworCWZlYXR1cmVzID0gRVhUM19IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgfkVYVDNfRkVBVFVSRV9JTkNPTVBBVF9TVVBQKTsKKwlpZiAoZmVhdHVyZXMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiAlczogY291bGRuJ3QgbW91bnQgYmVjYXVzZSBvZiAiCisJCSAgICAgICAidW5zdXBwb3J0ZWQgb3B0aW9uYWwgZmVhdHVyZXMgKCV4KS5cbiIsCisJCSAgICAgICBzYi0+c19pZCwgbGUzMl90b19jcHUoZmVhdHVyZXMpKTsKKwkJZ290byBmYWlsZWRfbW91bnQ7CisJfQorCWZlYXR1cmVzID0gRVhUM19IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsIH5FWFQzX0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFApOworCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSAmJiBmZWF0dXJlcykgeworCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6ICVzOiBjb3VsZG4ndCBtb3VudCBSRFdSIGJlY2F1c2Ugb2YgIgorCQkgICAgICAgInVuc3VwcG9ydGVkIG9wdGlvbmFsIGZlYXR1cmVzICgleCkuXG4iLAorCQkgICAgICAgc2ItPnNfaWQsIGxlMzJfdG9fY3B1KGZlYXR1cmVzKSk7CisJCWdvdG8gZmFpbGVkX21vdW50OworCX0KKwlibG9ja3NpemUgPSBCTE9DS19TSVpFIDw8IGxlMzJfdG9fY3B1KGVzLT5zX2xvZ19ibG9ja19zaXplKTsKKworCWlmIChibG9ja3NpemUgPCBFWFQzX01JTl9CTE9DS19TSVpFIHx8CisJICAgIGJsb2Nrc2l6ZSA+IEVYVDNfTUFYX0JMT0NLX1NJWkUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIAorCQkgICAgICAgIkVYVDMtZnM6IFVuc3VwcG9ydGVkIGZpbGVzeXN0ZW0gYmxvY2tzaXplICVkIG9uICVzLlxuIiwKKwkJICAgICAgIGJsb2Nrc2l6ZSwgc2ItPnNfaWQpOworCQlnb3RvIGZhaWxlZF9tb3VudDsKKwl9CisKKwloYmxvY2sgPSBiZGV2X2hhcmRzZWN0X3NpemUoc2ItPnNfYmRldik7CisJaWYgKHNiLT5zX2Jsb2Nrc2l6ZSAhPSBibG9ja3NpemUpIHsKKwkJLyoKKwkJICogTWFrZSBzdXJlIHRoZSBibG9ja3NpemUgZm9yIHRoZSBmaWxlc3lzdGVtIGlzIGxhcmdlcgorCQkgKiB0aGFuIHRoZSBoYXJkd2FyZSBzZWN0b3JzaXplIGZvciB0aGUgbWFjaGluZS4KKwkJICovCisJCWlmIChibG9ja3NpemUgPCBoYmxvY2spIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogYmxvY2tzaXplICVkIHRvbyBzbWFsbCBmb3IgIgorCQkJICAgICAgICJkZXZpY2UgYmxvY2tzaXplICVkLlxuIiwgYmxvY2tzaXplLCBoYmxvY2spOworCQkJZ290byBmYWlsZWRfbW91bnQ7CisJCX0KKworCQlicmVsc2UgKGJoKTsKKwkJc2Jfc2V0X2Jsb2Nrc2l6ZShzYiwgYmxvY2tzaXplKTsKKwkJbG9naWNfc2JfYmxvY2sgPSAoc2JfYmxvY2sgKiBFWFQzX01JTl9CTE9DS19TSVpFKSAvIGJsb2Nrc2l6ZTsKKwkJb2Zmc2V0ID0gKHNiX2Jsb2NrICogRVhUM19NSU5fQkxPQ0tfU0laRSkgJSBibG9ja3NpemU7CisJCWJoID0gc2JfYnJlYWQoc2IsIGxvZ2ljX3NiX2Jsb2NrKTsKKwkJaWYgKCFiaCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIAorCQkJICAgICAgICJFWFQzLWZzOiBDYW4ndCByZWFkIHN1cGVyYmxvY2sgb24gMm5kIHRyeS5cbiIpOworCQkJZ290byBmYWlsZWRfbW91bnQ7CisJCX0KKwkJZXMgPSAoc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKikoKChjaGFyICopYmgtPmJfZGF0YSkgKyBvZmZzZXQpOworCQlzYmktPnNfZXMgPSBlczsKKwkJaWYgKGVzLT5zX21hZ2ljICE9IGNwdV90b19sZTE2KEVYVDNfU1VQRVJfTUFHSUMpKSB7CisJCQlwcmludGsgKEtFUk5fRVJSIAorCQkJCSJFWFQzLWZzOiBNYWdpYyBtaXNtYXRjaCwgdmVyeSB3ZWlyZCAhXG4iKTsKKwkJCWdvdG8gZmFpbGVkX21vdW50OworCQl9CisJfQorCisJc2ItPnNfbWF4Ynl0ZXMgPSBleHQzX21heF9zaXplKHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKworCWlmIChsZTMyX3RvX2NwdShlcy0+c19yZXZfbGV2ZWwpID09IEVYVDNfR09PRF9PTERfUkVWKSB7CisJCXNiaS0+c19pbm9kZV9zaXplID0gRVhUM19HT09EX09MRF9JTk9ERV9TSVpFOworCQlzYmktPnNfZmlyc3RfaW5vID0gRVhUM19HT09EX09MRF9GSVJTVF9JTk87CisJfSBlbHNlIHsKKwkJc2JpLT5zX2lub2RlX3NpemUgPSBsZTE2X3RvX2NwdShlcy0+c19pbm9kZV9zaXplKTsKKwkJc2JpLT5zX2ZpcnN0X2lubyA9IGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2lubyk7CisJCWlmICgoc2JpLT5zX2lub2RlX3NpemUgPCBFWFQzX0dPT0RfT0xEX0lOT0RFX1NJWkUpIHx8CisJCSAgICAoc2JpLT5zX2lub2RlX3NpemUgJiAoc2JpLT5zX2lub2RlX3NpemUgLSAxKSkgfHwKKwkJICAgIChzYmktPnNfaW5vZGVfc2l6ZSA+IGJsb2Nrc2l6ZSkpIHsKKwkJCXByaW50ayAoS0VSTl9FUlIKKwkJCQkiRVhUMy1mczogdW5zdXBwb3J0ZWQgaW5vZGUgc2l6ZTogJWRcbiIsCisJCQkJc2JpLT5zX2lub2RlX3NpemUpOworCQkJZ290byBmYWlsZWRfbW91bnQ7CisJCX0KKwl9CisJc2JpLT5zX2ZyYWdfc2l6ZSA9IEVYVDNfTUlOX0ZSQUdfU0laRSA8PAorCQkJCSAgIGxlMzJfdG9fY3B1KGVzLT5zX2xvZ19mcmFnX3NpemUpOworCWlmIChibG9ja3NpemUgIT0gc2JpLT5zX2ZyYWdfc2l6ZSkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJFWFQzLWZzOiBmcmFnc2l6ZSAlbHUgIT0gYmxvY2tzaXplICV1ICh1bnN1cHBvcnRlZClcbiIsCisJCSAgICAgICBzYmktPnNfZnJhZ19zaXplLCBibG9ja3NpemUpOworCQlnb3RvIGZhaWxlZF9tb3VudDsKKwl9CisJc2JpLT5zX2ZyYWdzX3Blcl9ibG9jayA9IDE7CisJc2JpLT5zX2Jsb2Nrc19wZXJfZ3JvdXAgPSBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfcGVyX2dyb3VwKTsKKwlzYmktPnNfZnJhZ3NfcGVyX2dyb3VwID0gbGUzMl90b19jcHUoZXMtPnNfZnJhZ3NfcGVyX2dyb3VwKTsKKwlzYmktPnNfaW5vZGVzX3Blcl9ncm91cCA9IGxlMzJfdG9fY3B1KGVzLT5zX2lub2Rlc19wZXJfZ3JvdXApOworCWlmIChFWFQzX0lOT0RFX1NJWkUoc2IpID09IDApCisJCWdvdG8gY2FudGZpbmRfZXh0MzsKKwlzYmktPnNfaW5vZGVzX3Blcl9ibG9jayA9IGJsb2Nrc2l6ZSAvIEVYVDNfSU5PREVfU0laRShzYik7CisJaWYgKHNiaS0+c19pbm9kZXNfcGVyX2Jsb2NrID09IDApCisJCWdvdG8gY2FudGZpbmRfZXh0MzsKKwlzYmktPnNfaXRiX3Blcl9ncm91cCA9IHNiaS0+c19pbm9kZXNfcGVyX2dyb3VwIC8KKwkJCQkJc2JpLT5zX2lub2Rlc19wZXJfYmxvY2s7CisJc2JpLT5zX2Rlc2NfcGVyX2Jsb2NrID0gYmxvY2tzaXplIC8gc2l6ZW9mKHN0cnVjdCBleHQzX2dyb3VwX2Rlc2MpOworCXNiaS0+c19zYmggPSBiaDsKKwlzYmktPnNfbW91bnRfc3RhdGUgPSBsZTE2X3RvX2NwdShlcy0+c19zdGF0ZSk7CisJc2JpLT5zX2FkZHJfcGVyX2Jsb2NrX2JpdHMgPSBsb2cyKEVYVDNfQUREUl9QRVJfQkxPQ0soc2IpKTsKKwlzYmktPnNfZGVzY19wZXJfYmxvY2tfYml0cyA9IGxvZzIoRVhUM19ERVNDX1BFUl9CTE9DSyhzYikpOworCWZvciAoaT0wOyBpIDwgNDsgaSsrKQorCQlzYmktPnNfaGFzaF9zZWVkW2ldID0gbGUzMl90b19jcHUoZXMtPnNfaGFzaF9zZWVkW2ldKTsKKwlzYmktPnNfZGVmX2hhc2hfdmVyc2lvbiA9IGVzLT5zX2RlZl9oYXNoX3ZlcnNpb247CisKKwlpZiAoc2JpLT5zX2Jsb2Nrc19wZXJfZ3JvdXAgPiBibG9ja3NpemUgKiA4KSB7CisJCXByaW50ayAoS0VSTl9FUlIKKwkJCSJFWFQzLWZzOiAjYmxvY2tzIHBlciBncm91cCB0b28gYmlnOiAlbHVcbiIsCisJCQlzYmktPnNfYmxvY2tzX3Blcl9ncm91cCk7CisJCWdvdG8gZmFpbGVkX21vdW50OworCX0KKwlpZiAoc2JpLT5zX2ZyYWdzX3Blcl9ncm91cCA+IGJsb2Nrc2l6ZSAqIDgpIHsKKwkJcHJpbnRrIChLRVJOX0VSUgorCQkJIkVYVDMtZnM6ICNmcmFnbWVudHMgcGVyIGdyb3VwIHRvbyBiaWc6ICVsdVxuIiwKKwkJCXNiaS0+c19mcmFnc19wZXJfZ3JvdXApOworCQlnb3RvIGZhaWxlZF9tb3VudDsKKwl9CisJaWYgKHNiaS0+c19pbm9kZXNfcGVyX2dyb3VwID4gYmxvY2tzaXplICogOCkgeworCQlwcmludGsgKEtFUk5fRVJSCisJCQkiRVhUMy1mczogI2lub2RlcyBwZXIgZ3JvdXAgdG9vIGJpZzogJWx1XG4iLAorCQkJc2JpLT5zX2lub2Rlc19wZXJfZ3JvdXApOworCQlnb3RvIGZhaWxlZF9tb3VudDsKKwl9CisKKwlpZiAoRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKSA9PSAwKQorCQlnb3RvIGNhbnRmaW5kX2V4dDM7CisJc2JpLT5zX2dyb3Vwc19jb3VudCA9IChsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpIC0KKwkJCSAgICAgICBsZTMyX3RvX2NwdShlcy0+c19maXJzdF9kYXRhX2Jsb2NrKSArCisJCQkgICAgICAgRVhUM19CTE9DS1NfUEVSX0dST1VQKHNiKSAtIDEpIC8KKwkJCSAgICAgIEVYVDNfQkxPQ0tTX1BFUl9HUk9VUChzYik7CisJZGJfY291bnQgPSAoc2JpLT5zX2dyb3Vwc19jb3VudCArIEVYVDNfREVTQ19QRVJfQkxPQ0soc2IpIC0gMSkgLworCQkgICBFWFQzX0RFU0NfUEVSX0JMT0NLKHNiKTsKKwlzYmktPnNfZ3JvdXBfZGVzYyA9IGttYWxsb2MoZGJfY291bnQgKiBzaXplb2YgKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwKKwkJCQkgICAgR0ZQX0tFUk5FTCk7CisJaWYgKHNiaS0+c19ncm91cF9kZXNjID09IE5VTEwpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiRVhUMy1mczogbm90IGVub3VnaCBtZW1vcnlcbiIpOworCQlnb3RvIGZhaWxlZF9tb3VudDsKKwl9CisKKwlwZXJjcHVfY291bnRlcl9pbml0KCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyKTsKKwlwZXJjcHVfY291bnRlcl9pbml0KCZzYmktPnNfZnJlZWlub2Rlc19jb3VudGVyKTsKKwlwZXJjcHVfY291bnRlcl9pbml0KCZzYmktPnNfZGlyc19jb3VudGVyKTsKKwliZ2xfbG9ja19pbml0KCZzYmktPnNfYmxvY2tncm91cF9sb2NrKTsKKworCWZvciAoaSA9IDA7IGkgPCBkYl9jb3VudDsgaSsrKSB7CisJCWJsb2NrID0gZGVzY3JpcHRvcl9sb2Moc2IsIGxvZ2ljX3NiX2Jsb2NrLCBpKTsKKwkJc2JpLT5zX2dyb3VwX2Rlc2NbaV0gPSBzYl9icmVhZChzYiwgYmxvY2spOworCQlpZiAoIXNiaS0+c19ncm91cF9kZXNjW2ldKSB7CisJCQlwcmludGsgKEtFUk5fRVJSICJFWFQzLWZzOiAiCisJCQkJImNhbid0IHJlYWQgZ3JvdXAgZGVzY3JpcHRvciAlZFxuIiwgaSk7CisJCQlkYl9jb3VudCA9IGk7CisJCQlnb3RvIGZhaWxlZF9tb3VudDI7CisJCX0KKwl9CisJaWYgKCFleHQzX2NoZWNrX2Rlc2NyaXB0b3JzIChzYikpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiRVhUMy1mczogZ3JvdXAgZGVzY3JpcHRvcnMgY29ycnVwdGVkICFcbiIpOworCQlnb3RvIGZhaWxlZF9tb3VudDI7CisJfQorCXNiaS0+c19nZGJfY291bnQgPSBkYl9jb3VudDsKKwlnZXRfcmFuZG9tX2J5dGVzKCZzYmktPnNfbmV4dF9nZW5lcmF0aW9uLCBzaXplb2YodTMyKSk7CisJc3Bpbl9sb2NrX2luaXQoJnNiaS0+c19uZXh0X2dlbl9sb2NrKTsKKwkvKiBwZXIgZmlsZXlzdGVtIHJlc2VydmF0aW9uIGxpc3QgaGVhZCAmIGxvY2sgKi8KKwlzcGluX2xvY2tfaW5pdCgmc2JpLT5zX3Jzdl93aW5kb3dfbG9jayk7CisJc2JpLT5zX3Jzdl93aW5kb3dfcm9vdCA9IFJCX1JPT1Q7CisJLyogQWRkIGEgc2luZ2xlLCBzdGF0aWMgZHVtbXkgcmVzZXJ2YXRpb24gdG8gdGhlIHN0YXJ0IG9mIHRoZQorCSAqIHJlc2VydmF0aW9uIHdpbmRvdyBsaXN0IC0tLSBpdCBnaXZlcyB1cyBhIHBsYWNlaG9sZGVyIGZvcgorCSAqIGFwcGVuZC1hdC1zdGFydC1vZi1saXN0IHdoaWNoIG1ha2VzIHRoZSBhbGxvY2F0aW9uIGxvZ2ljCisJICogX211Y2hfIHNpbXBsZXIuICovCisJc2JpLT5zX3Jzdl93aW5kb3dfaGVhZC5yc3Zfc3RhcnQgPSBFWFQzX1JFU0VSVkVfV0lORE9XX05PVF9BTExPQ0FURUQ7CisJc2JpLT5zX3Jzdl93aW5kb3dfaGVhZC5yc3ZfZW5kID0gRVhUM19SRVNFUlZFX1dJTkRPV19OT1RfQUxMT0NBVEVEOworCXNiaS0+c19yc3Zfd2luZG93X2hlYWQucnN2X2FsbG9jX2hpdCA9IDA7CisJc2JpLT5zX3Jzdl93aW5kb3dfaGVhZC5yc3ZfZ29hbF9zaXplID0gMDsKKwlleHQzX3Jzdl93aW5kb3dfYWRkKHNiLCAmc2JpLT5zX3Jzdl93aW5kb3dfaGVhZCk7CisKKwkvKgorCSAqIHNldCB1cCBlbm91Z2ggc28gdGhhdCBpdCBjYW4gcmVhZCBhbiBpbm9kZQorCSAqLworCXNiLT5zX29wID0gJmV4dDNfc29wczsKKwlzYi0+c19leHBvcnRfb3AgPSAmZXh0M19leHBvcnRfb3BzOworCXNiLT5zX3hhdHRyID0gZXh0M194YXR0cl9oYW5kbGVyczsKKyNpZmRlZiBDT05GSUdfUVVPVEEKKwlzYi0+c19xY29wID0gJmV4dDNfcWN0bF9vcGVyYXRpb25zOworCXNiLT5kcV9vcCA9ICZleHQzX3F1b3RhX29wZXJhdGlvbnM7CisjZW5kaWYKKwlJTklUX0xJU1RfSEVBRCgmc2JpLT5zX29ycGhhbik7IC8qIHVubGlua2VkIGJ1dCBvcGVuIGZpbGVzICovCisKKwlzYi0+c19yb290ID0gTlVMTDsKKworCW5lZWRzX3JlY292ZXJ5ID0gKGVzLT5zX2xhc3Rfb3JwaGFuICE9IDAgfHwKKwkJCSAgRVhUM19IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwKKwkJCQkgICAgRVhUM19GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIpKTsKKworCS8qCisJICogVGhlIGZpcnN0IGlub2RlIHdlIGxvb2sgYXQgaXMgdGhlIGpvdXJuYWwgaW5vZGUuICBEb24ndCB0cnkKKwkgKiByb290IGZpcnN0OiBpdCBtYXkgYmUgbW9kaWZpZWQgaW4gdGhlIGpvdXJuYWwhCisJICovCisJaWYgKCF0ZXN0X29wdChzYiwgTk9MT0FEKSAmJgorCSAgICBFWFQzX0hBU19DT01QQVRfRkVBVFVSRShzYiwgRVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCkpIHsKKwkJaWYgKGV4dDNfbG9hZF9qb3VybmFsKHNiLCBlcykpCisJCQlnb3RvIGZhaWxlZF9tb3VudDI7CisJfSBlbHNlIGlmIChqb3VybmFsX2ludW0pIHsKKwkJaWYgKGV4dDNfY3JlYXRlX2pvdXJuYWwoc2IsIGVzLCBqb3VybmFsX2ludW0pKQorCQkJZ290byBmYWlsZWRfbW91bnQyOworCX0gZWxzZSB7CisJCWlmICghc2lsZW50KQorCQkJcHJpbnRrIChLRVJOX0VSUgorCQkJCSJleHQzOiBObyBqb3VybmFsIG9uIGZpbGVzeXN0ZW0gb24gJXNcbiIsCisJCQkJc2ItPnNfaWQpOworCQlnb3RvIGZhaWxlZF9tb3VudDI7CisJfQorCisJLyogV2UgaGF2ZSBub3cgdXBkYXRlZCB0aGUgam91cm5hbCBpZiByZXF1aXJlZCwgc28gd2UgY2FuCisJICogdmFsaWRhdGUgdGhlIGRhdGEgam91cm5hbGluZyBtb2RlLiAqLworCXN3aXRjaCAodGVzdF9vcHQoc2IsIERBVEFfRkxBR1MpKSB7CisJY2FzZSAwOgorCQkvKiBObyBtb2RlIHNldCwgYXNzdW1lIGEgZGVmYXVsdCBiYXNlZCBvbiB0aGUgam91cm5hbAorICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdGllczogT1JERVJFRF9EQVRBIGlmIHRoZSBqb3VybmFsIGNhbgorICAgICAgICAgICAgICAgICAgIGNvcGUsIGVsc2UgSk9VUk5BTF9EQVRBICovCisJCWlmIChqb3VybmFsX2NoZWNrX2F2YWlsYWJsZV9mZWF0dXJlcworCQkgICAgKHNiaS0+c19qb3VybmFsLCAwLCAwLCBKRlNfRkVBVFVSRV9JTkNPTVBBVF9SRVZPS0UpKQorCQkJc2V0X29wdChzYmktPnNfbW91bnRfb3B0LCBPUkRFUkVEX0RBVEEpOworCQllbHNlCisJCQlzZXRfb3B0KHNiaS0+c19tb3VudF9vcHQsIEpPVVJOQUxfREFUQSk7CisJCWJyZWFrOworCisJY2FzZSBFWFQzX01PVU5UX09SREVSRURfREFUQToKKwljYXNlIEVYVDNfTU9VTlRfV1JJVEVCQUNLX0RBVEE6CisJCWlmICgham91cm5hbF9jaGVja19hdmFpbGFibGVfZmVhdHVyZXMKKwkJICAgIChzYmktPnNfam91cm5hbCwgMCwgMCwgSkZTX0ZFQVRVUkVfSU5DT01QQVRfUkVWT0tFKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBKb3VybmFsIGRvZXMgbm90IHN1cHBvcnQgIgorCQkJICAgICAgICJyZXF1ZXN0ZWQgZGF0YSBqb3VybmFsaW5nIG1vZGVcbiIpOworCQkJZ290byBmYWlsZWRfbW91bnQzOworCQl9CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJaWYgKHRlc3Rfb3B0KHNiLCBOT0JIKSkgeworCQlpZiAoc2ItPnNfYmxvY2tzaXplX2JpdHMgIT0gUEFHRV9DQUNIRV9TSElGVCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRVhUMy1mczogSWdub3Jpbmcgbm9iaCBvcHRpb24gIgorCQkJCSJzaW5jZSBmaWxlc3lzdGVtIGJsb2Nrc2l6ZSBkb2Vzbid0IG1hdGNoICIKKwkJCQkicGFnZXNpemVcbiIpOworCQkJY2xlYXJfb3B0KHNiaS0+c19tb3VudF9vcHQsIE5PQkgpOworCQl9CisJCWlmICghKHRlc3Rfb3B0KHNiLCBEQVRBX0ZMQUdTKSA9PSBFWFQzX01PVU5UX1dSSVRFQkFDS19EQVRBKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRVhUMy1mczogSWdub3Jpbmcgbm9iaCBvcHRpb24gLSAiCisJCQkJIml0cyBzdXBwb3J0ZWQgb25seSB3aXRoIHdyaXRlYmFjayBtb2RlXG4iKTsKKwkJCWNsZWFyX29wdChzYmktPnNfbW91bnRfb3B0LCBOT0JIKTsKKwkJfQorCX0KKwkvKgorCSAqIFRoZSBqb3VybmFsX2xvYWQgd2lsbCBoYXZlIGRvbmUgYW55IG5lY2Vzc2FyeSBsb2cgcmVjb3ZlcnksCisJICogc28gd2UgY2FuIHNhZmVseSBtb3VudCB0aGUgcmVzdCBvZiB0aGUgZmlsZXN5c3RlbSBub3cuCisJICovCisKKwlyb290ID0gaWdldChzYiwgRVhUM19ST09UX0lOTyk7CisJc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290KTsKKwlpZiAoIXNiLT5zX3Jvb3QpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBnZXQgcm9vdCBpbm9kZSBmYWlsZWRcbiIpOworCQlpcHV0KHJvb3QpOworCQlnb3RvIGZhaWxlZF9tb3VudDM7CisJfQorCWlmICghU19JU0RJUihyb290LT5pX21vZGUpIHx8ICFyb290LT5pX2Jsb2NrcyB8fCAhcm9vdC0+aV9zaXplKSB7CisJCWRwdXQoc2ItPnNfcm9vdCk7CisJCXNiLT5zX3Jvb3QgPSBOVUxMOworCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IGNvcnJ1cHQgcm9vdCBpbm9kZSwgcnVuIGUyZnNja1xuIik7CisJCWdvdG8gZmFpbGVkX21vdW50MzsKKwl9CisKKwlleHQzX3NldHVwX3N1cGVyIChzYiwgZXMsIHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKTsKKwkvKgorCSAqIGFrcG06IGNvcmUgcmVhZF9zdXBlcigpIGNhbGxzIGluIGhlcmUgd2l0aCB0aGUgc3VwZXJibG9jayBsb2NrZWQuCisJICogVGhhdCBkZWFkbG9ja3MsIGJlY2F1c2Ugb3JwaGFuIGNsZWFudXAgbmVlZHMgdG8gbG9jayB0aGUgc3VwZXJibG9jaworCSAqIGluIG51bWVyb3VzIHBsYWNlcy4gIEhlcmUgd2UganVzdCBwb3AgdGhlIGxvY2sgLSBpdCdzIHJlbGF0aXZlbHkKKwkgKiBoYXJtbGVzcywgYmVjYXVzZSB3ZSBhcmUgbm93IHJlYWR5IHRvIGFjY2VwdCB3cml0ZV9zdXBlcigpIHJlcXVlc3RzLAorCSAqIGFuZCBhdmlybyBzYXlzIHRoYXQncyB0aGUgb25seSByZWFzb24gZm9yIGhhbmdpbmcgb250byB0aGUKKwkgKiBzdXBlcmJsb2NrIGxvY2suCisJICovCisJRVhUM19TQihzYiktPnNfbW91bnRfc3RhdGUgfD0gRVhUM19PUlBIQU5fRlM7CisJZXh0M19vcnBoYW5fY2xlYW51cChzYiwgZXMpOworCUVYVDNfU0Ioc2IpLT5zX21vdW50X3N0YXRlICY9IH5FWFQzX09SUEhBTl9GUzsKKwlpZiAobmVlZHNfcmVjb3ZlcnkpCisJCXByaW50ayAoS0VSTl9JTkZPICJFWFQzLWZzOiByZWNvdmVyeSBjb21wbGV0ZS5cbiIpOworCWV4dDNfbWFya19yZWNvdmVyeV9jb21wbGV0ZShzYiwgZXMpOworCXByaW50ayAoS0VSTl9JTkZPICJFWFQzLWZzOiBtb3VudGVkIGZpbGVzeXN0ZW0gd2l0aCAlcyBkYXRhIG1vZGUuXG4iLAorCQl0ZXN0X29wdChzYixEQVRBX0ZMQUdTKSA9PSBFWFQzX01PVU5UX0pPVVJOQUxfREFUQSA/ICJqb3VybmFsIjoKKwkJdGVzdF9vcHQoc2IsREFUQV9GTEFHUykgPT0gRVhUM19NT1VOVF9PUkRFUkVEX0RBVEEgPyAib3JkZXJlZCI6CisJCSJ3cml0ZWJhY2siKTsKKworCXBlcmNwdV9jb3VudGVyX21vZCgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlciwKKwkJZXh0M19jb3VudF9mcmVlX2Jsb2NrcyhzYikpOworCXBlcmNwdV9jb3VudGVyX21vZCgmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlciwKKwkJZXh0M19jb3VudF9mcmVlX2lub2RlcyhzYikpOworCXBlcmNwdV9jb3VudGVyX21vZCgmc2JpLT5zX2RpcnNfY291bnRlciwKKwkJZXh0M19jb3VudF9kaXJzKHNiKSk7CisKKwlsb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworCitjYW50ZmluZF9leHQzOgorCWlmICghc2lsZW50KQorCQlwcmludGsoS0VSTl9FUlIgIlZGUzogQ2FuJ3QgZmluZCBleHQzIGZpbGVzeXN0ZW0gb24gZGV2ICVzLlxuIiwKKwkJICAgICAgIHNiLT5zX2lkKTsKKwlnb3RvIGZhaWxlZF9tb3VudDsKKworZmFpbGVkX21vdW50MzoKKwlqb3VybmFsX2Rlc3Ryb3koc2JpLT5zX2pvdXJuYWwpOworZmFpbGVkX21vdW50MjoKKwlmb3IgKGkgPSAwOyBpIDwgZGJfY291bnQ7IGkrKykKKwkJYnJlbHNlKHNiaS0+c19ncm91cF9kZXNjW2ldKTsKKwlrZnJlZShzYmktPnNfZ3JvdXBfZGVzYyk7CitmYWlsZWRfbW91bnQ6CisjaWZkZWYgQ09ORklHX1FVT1RBCisJZm9yIChpID0gMDsgaSA8IE1BWFFVT1RBUzsgaSsrKQorCQlrZnJlZShzYmktPnNfcWZfbmFtZXNbaV0pOworI2VuZGlmCisJZXh0M19ibGtkZXZfcmVtb3ZlKHNiaSk7CisJYnJlbHNlKGJoKTsKK291dF9mYWlsOgorCXNiLT5zX2ZzX2luZm8gPSBOVUxMOworCWtmcmVlKHNiaSk7CisJbG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoKKyAqIFNldHVwIGFueSBwZXItZnMgam91cm5hbCBwYXJhbWV0ZXJzIG5vdy4gIFdlJ2xsIGRvIHRoaXMgYm90aCBvbgorICogaW5pdGlhbCBtb3VudCwgb25jZSB0aGUgam91cm5hbCBoYXMgYmVlbiBpbml0aWFsaXNlZCBidXQgYmVmb3JlIHdlJ3ZlCisgKiBkb25lIGFueSByZWNvdmVyeTsgYW5kIGFnYWluIG9uIGFueSBzdWJzZXF1ZW50IHJlbW91bnQuIAorICovCitzdGF0aWMgdm9pZCBleHQzX2luaXRfam91cm5hbF9wYXJhbXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgam91cm5hbF90ICpqb3VybmFsKQoreworCXN0cnVjdCBleHQzX3NiX2luZm8gKnNiaSA9IEVYVDNfU0Ioc2IpOworCisJaWYgKHNiaS0+c19jb21taXRfaW50ZXJ2YWwpCisJCWpvdXJuYWwtPmpfY29tbWl0X2ludGVydmFsID0gc2JpLT5zX2NvbW1pdF9pbnRlcnZhbDsKKwkvKiBXZSBjb3VsZCBhbHNvIHNldCB1cCBhbiBleHQzLXNwZWNpZmljIGRlZmF1bHQgZm9yIHRoZSBjb21taXQKKwkgKiBpbnRlcnZhbCBoZXJlLCBidXQgZm9yIG5vdyB3ZSdsbCBqdXN0IGZhbGwgYmFjayB0byB0aGUgamJkCisJICogZGVmYXVsdC4gKi8KKworCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwlpZiAodGVzdF9vcHQoc2IsIEJBUlJJRVIpKQorCQlqb3VybmFsLT5qX2ZsYWdzIHw9IEpGU19CQVJSSUVSOworCWVsc2UKKwkJam91cm5hbC0+al9mbGFncyAmPSB+SkZTX0JBUlJJRVI7CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7Cit9CisKK3N0YXRpYyBqb3VybmFsX3QgKmV4dDNfZ2V0X2pvdXJuYWwoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGpvdXJuYWxfaW51bSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmpvdXJuYWxfaW5vZGU7CisJam91cm5hbF90ICpqb3VybmFsOworCisJLyogRmlyc3QsIHRlc3QgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYSB2YWxpZCBpbm9kZSBvbiBkaXNrLiAgQmFkCisJICogdGhpbmdzIGhhcHBlbiBpZiB3ZSBpZ2V0KCkgYW4gdW51c2VkIGlub2RlLCBhcyB0aGUgc3Vic2VxdWVudAorCSAqIGlwdXQoKSB3aWxsIHRyeSB0byBkZWxldGUgaXQuICovCisKKwlqb3VybmFsX2lub2RlID0gaWdldChzYiwgam91cm5hbF9pbnVtKTsKKwlpZiAoIWpvdXJuYWxfaW5vZGUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBubyBqb3VybmFsIGZvdW5kLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoIWpvdXJuYWxfaW5vZGUtPmlfbmxpbmspIHsKKwkJbWFrZV9iYWRfaW5vZGUoam91cm5hbF9pbm9kZSk7CisJCWlwdXQoam91cm5hbF9pbm9kZSk7CisJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogam91cm5hbCBpbm9kZSBpcyBkZWxldGVkLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWpiZF9kZWJ1ZygyLCAiSm91cm5hbCBpbm9kZSBmb3VuZCBhdCAlcDogJUxkIGJ5dGVzXG4iLAorCQkgIGpvdXJuYWxfaW5vZGUsIGpvdXJuYWxfaW5vZGUtPmlfc2l6ZSk7CisJaWYgKGlzX2JhZF9pbm9kZShqb3VybmFsX2lub2RlKSB8fCAhU19JU1JFRyhqb3VybmFsX2lub2RlLT5pX21vZGUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogaW52YWxpZCBqb3VybmFsIGlub2RlLlxuIik7CisJCWlwdXQoam91cm5hbF9pbm9kZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWpvdXJuYWwgPSBqb3VybmFsX2luaXRfaW5vZGUoam91cm5hbF9pbm9kZSk7CisJaWYgKCFqb3VybmFsKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogQ291bGQgbm90IGxvYWQgam91cm5hbCBpbm9kZVxuIik7CisJCWlwdXQoam91cm5hbF9pbm9kZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlqb3VybmFsLT5qX3ByaXZhdGUgPSBzYjsKKwlleHQzX2luaXRfam91cm5hbF9wYXJhbXMoc2IsIGpvdXJuYWwpOworCXJldHVybiBqb3VybmFsOworfQorCitzdGF0aWMgam91cm5hbF90ICpleHQzX2dldF9kZXZfam91cm5hbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgICAgICBkZXZfdCBqX2RldikKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlqb3VybmFsX3QgKmpvdXJuYWw7CisJaW50IHN0YXJ0OworCWludCBsZW47CisJaW50IGhibG9jaywgYmxvY2tzaXplOworCXVuc2lnbmVkIGxvbmcgc2JfYmxvY2s7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKiBlczsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OworCisJYmRldiA9IGV4dDNfYmxrZGV2X2dldChqX2Rldik7CisJaWYgKGJkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoYmRfY2xhaW0oYmRldiwgc2IpKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgICJFWFQzOiBmYWlsZWQgdG8gY2xhaW0gZXh0ZXJuYWwgam91cm5hbCBkZXZpY2UuXG4iKTsKKwkJYmxrZGV2X3B1dChiZGV2KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJYmxvY2tzaXplID0gc2ItPnNfYmxvY2tzaXplOworCWhibG9jayA9IGJkZXZfaGFyZHNlY3Rfc2l6ZShiZGV2KTsKKwlpZiAoYmxvY2tzaXplIDwgaGJsb2NrKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkJIkVYVDMtZnM6IGJsb2Nrc2l6ZSB0b28gc21hbGwgZm9yIGpvdXJuYWwgZGV2aWNlLlxuIik7CisJCWdvdG8gb3V0X2JkZXY7CisJfQorCisJc2JfYmxvY2sgPSBFWFQzX01JTl9CTE9DS19TSVpFIC8gYmxvY2tzaXplOworCW9mZnNldCA9IEVYVDNfTUlOX0JMT0NLX1NJWkUgJSBibG9ja3NpemU7CisJc2V0X2Jsb2Nrc2l6ZShiZGV2LCBibG9ja3NpemUpOworCWlmICghKGJoID0gX19icmVhZChiZGV2LCBzYl9ibG9jaywgYmxvY2tzaXplKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBjb3VsZG4ndCByZWFkIHN1cGVyYmxvY2sgb2YgIgorCQkgICAgICAgImV4dGVybmFsIGpvdXJuYWxcbiIpOworCQlnb3RvIG91dF9iZGV2OworCX0KKworCWVzID0gKHN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICopICgoKGNoYXIgKiliaC0+Yl9kYXRhKSArIG9mZnNldCk7CisJaWYgKChsZTE2X3RvX2NwdShlcy0+c19tYWdpYykgIT0gRVhUM19TVVBFUl9NQUdJQykgfHwKKwkgICAgIShsZTMyX3RvX2NwdShlcy0+c19mZWF0dXJlX2luY29tcGF0KSAmCisJICAgICAgRVhUM19GRUFUVVJFX0lOQ09NUEFUX0pPVVJOQUxfREVWKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IGV4dGVybmFsIGpvdXJuYWwgaGFzICIKKwkJCQkJImJhZCBzdXBlcmJsb2NrXG4iKTsKKwkJYnJlbHNlKGJoKTsKKwkJZ290byBvdXRfYmRldjsKKwl9CisKKwlpZiAobWVtY21wKEVYVDNfU0Ioc2IpLT5zX2VzLT5zX2pvdXJuYWxfdXVpZCwgZXMtPnNfdXVpZCwgMTYpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogam91cm5hbCBVVUlEIGRvZXMgbm90IG1hdGNoXG4iKTsKKwkJYnJlbHNlKGJoKTsKKwkJZ290byBvdXRfYmRldjsKKwl9CisKKwlsZW4gPSBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpOworCXN0YXJ0ID0gc2JfYmxvY2sgKyAxOworCWJyZWxzZShiaCk7CS8qIHdlJ3JlIGRvbmUgd2l0aCB0aGUgc3VwZXJibG9jayAqLworCisJam91cm5hbCA9IGpvdXJuYWxfaW5pdF9kZXYoYmRldiwgc2ItPnNfYmRldiwKKwkJCQkJc3RhcnQsIGxlbiwgYmxvY2tzaXplKTsKKwlpZiAoIWpvdXJuYWwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBmYWlsZWQgdG8gY3JlYXRlIGRldmljZSBqb3VybmFsXG4iKTsKKwkJZ290byBvdXRfYmRldjsKKwl9CisJam91cm5hbC0+al9wcml2YXRlID0gc2I7CisJbGxfcndfYmxvY2soUkVBRCwgMSwgJmpvdXJuYWwtPmpfc2JfYnVmZmVyKTsKKwl3YWl0X29uX2J1ZmZlcihqb3VybmFsLT5qX3NiX2J1ZmZlcik7CisJaWYgKCFidWZmZXJfdXB0b2RhdGUoam91cm5hbC0+al9zYl9idWZmZXIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRVhUMy1mczogSS9PIGVycm9yIG9uIGpvdXJuYWwgZGV2aWNlXG4iKTsKKwkJZ290byBvdXRfam91cm5hbDsKKwl9CisJaWYgKGJlMzJfdG9fY3B1KGpvdXJuYWwtPmpfc3VwZXJibG9jay0+c19ucl91c2VycykgIT0gMSkgeworCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IEV4dGVybmFsIGpvdXJuYWwgaGFzIG1vcmUgdGhhbiBvbmUgIgorCQkJCQkidXNlciAodW5zdXBwb3J0ZWQpIC0gJWRcbiIsCisJCQliZTMyX3RvX2NwdShqb3VybmFsLT5qX3N1cGVyYmxvY2stPnNfbnJfdXNlcnMpKTsKKwkJZ290byBvdXRfam91cm5hbDsKKwl9CisJRVhUM19TQihzYiktPmpvdXJuYWxfYmRldiA9IGJkZXY7CisJZXh0M19pbml0X2pvdXJuYWxfcGFyYW1zKHNiLCBqb3VybmFsKTsKKwlyZXR1cm4gam91cm5hbDsKK291dF9qb3VybmFsOgorCWpvdXJuYWxfZGVzdHJveShqb3VybmFsKTsKK291dF9iZGV2OgorCWV4dDNfYmxrZGV2X3B1dChiZGV2KTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBleHQzX2xvYWRfam91cm5hbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwkJCSAgICAgc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKiBlcykKK3sKKwlqb3VybmFsX3QgKmpvdXJuYWw7CisJaW50IGpvdXJuYWxfaW51bSA9IGxlMzJfdG9fY3B1KGVzLT5zX2pvdXJuYWxfaW51bSk7CisJZGV2X3Qgam91cm5hbF9kZXYgPSBuZXdfZGVjb2RlX2RldihsZTMyX3RvX2NwdShlcy0+c19qb3VybmFsX2RldikpOworCWludCBlcnIgPSAwOworCWludCByZWFsbHlfcmVhZF9vbmx5OworCisJcmVhbGx5X3JlYWRfb25seSA9IGJkZXZfcmVhZF9vbmx5KHNiLT5zX2JkZXYpOworCisJLyoKKwkgKiBBcmUgd2UgbG9hZGluZyBhIGJsYW5rIGpvdXJuYWwgb3IgcGVyZm9ybWluZyByZWNvdmVyeSBhZnRlciBhCisJICogY3Jhc2g/ICBGb3IgcmVjb3ZlcnksIHdlIG5lZWQgdG8gY2hlY2sgaW4gYWR2YW5jZSB3aGV0aGVyIHdlCisJICogY2FuIGdldCByZWFkLXdyaXRlIGFjY2VzcyB0byB0aGUgZGV2aWNlLgorCSAqLworCisJaWYgKEVYVDNfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKSkgeworCQlpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gIkVYVDMtZnM6IElORk86IHJlY292ZXJ5ICIKKwkJCQkJInJlcXVpcmVkIG9uIHJlYWRvbmx5IGZpbGVzeXN0ZW0uXG4iKTsKKwkJCWlmIChyZWFsbHlfcmVhZF9vbmx5KSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiB3cml0ZSBhY2Nlc3MgIgorCQkJCQkidW5hdmFpbGFibGUsIGNhbm5vdCBwcm9jZWVkLlxuIik7CisJCQkJcmV0dXJuIC1FUk9GUzsKKwkJCX0KKwkJCXByaW50ayAoS0VSTl9JTkZPICJFWFQzLWZzOiB3cml0ZSBhY2Nlc3Mgd2lsbCAiCisJCQkJCSJiZSBlbmFibGVkIGR1cmluZyByZWNvdmVyeS5cbiIpOworCQl9CisJfQorCisJaWYgKGpvdXJuYWxfaW51bSAmJiBqb3VybmFsX2RldikgeworCQlwcmludGsoS0VSTl9FUlIgIkVYVDMtZnM6IGZpbGVzeXN0ZW0gaGFzIGJvdGggam91cm5hbCAiCisJCSAgICAgICAiYW5kIGlub2RlIGpvdXJuYWxzIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChqb3VybmFsX2ludW0pIHsKKwkJaWYgKCEoam91cm5hbCA9IGV4dDNfZ2V0X2pvdXJuYWwoc2IsIGpvdXJuYWxfaW51bSkpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJaWYgKCEoam91cm5hbCA9IGV4dDNfZ2V0X2Rldl9qb3VybmFsKHNiLCBqb3VybmFsX2RldikpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFyZWFsbHlfcmVhZF9vbmx5ICYmIHRlc3Rfb3B0KHNiLCBVUERBVEVfSk9VUk5BTCkpIHsKKwkJZXJyID0gam91cm5hbF91cGRhdGVfZm9ybWF0KGpvdXJuYWwpOworCQlpZiAoZXJyKSAgeworCQkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBlcnJvciB1cGRhdGluZyBqb3VybmFsLlxuIik7CisJCQlqb3VybmFsX2Rlc3Ryb3koam91cm5hbCk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJaWYgKCFFWFQzX0hBU19JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUikpCisJCWVyciA9IGpvdXJuYWxfd2lwZShqb3VybmFsLCAhcmVhbGx5X3JlYWRfb25seSk7CisJaWYgKCFlcnIpCisJCWVyciA9IGpvdXJuYWxfbG9hZChqb3VybmFsKTsKKworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBlcnJvciBsb2FkaW5nIGpvdXJuYWwuXG4iKTsKKwkJam91cm5hbF9kZXN0cm95KGpvdXJuYWwpOworCQlyZXR1cm4gZXJyOworCX0KKworCUVYVDNfU0Ioc2IpLT5zX2pvdXJuYWwgPSBqb3VybmFsOworCWV4dDNfY2xlYXJfam91cm5hbF9lcnIoc2IsIGVzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBleHQzX2NyZWF0ZV9qb3VybmFsKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLAorCQkJICAgICAgIHN0cnVjdCBleHQzX3N1cGVyX2Jsb2NrICogZXMsCisJCQkgICAgICAgaW50IGpvdXJuYWxfaW51bSkKK3sKKwlqb3VybmFsX3QgKmpvdXJuYWw7CisKKwlpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiByZWFkb25seSBmaWxlc3lzdGVtIHdoZW4gdHJ5aW5nIHRvICIKKwkJCQkiY3JlYXRlIGpvdXJuYWwuXG4iKTsKKwkJcmV0dXJuIC1FUk9GUzsKKwl9CisKKwlpZiAoIShqb3VybmFsID0gZXh0M19nZXRfam91cm5hbChzYiwgam91cm5hbF9pbnVtKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJcHJpbnRrKEtFUk5fSU5GTyAiRVhUMy1mczogY3JlYXRpbmcgbmV3IGpvdXJuYWwgb24gaW5vZGUgJWRcbiIsCisJICAgICAgIGpvdXJuYWxfaW51bSk7CisKKwlpZiAoam91cm5hbF9jcmVhdGUoam91cm5hbCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFWFQzLWZzOiBlcnJvciBjcmVhdGluZyBqb3VybmFsLlxuIik7CisJCWpvdXJuYWxfZGVzdHJveShqb3VybmFsKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJRVhUM19TQihzYiktPnNfam91cm5hbCA9IGpvdXJuYWw7CisKKwlleHQzX3VwZGF0ZV9keW5hbWljX3JldihzYik7CisJRVhUM19TRVRfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUM19GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIpOworCUVYVDNfU0VUX0NPTVBBVF9GRUFUVVJFKHNiLCBFWFQzX0ZFQVRVUkVfQ09NUEFUX0hBU19KT1VSTkFMKTsKKworCWVzLT5zX2pvdXJuYWxfaW51bSA9IGNwdV90b19sZTMyKGpvdXJuYWxfaW51bSk7CisJc2ItPnNfZGlydCA9IDE7CisKKwkvKiBNYWtlIHN1cmUgd2UgZmx1c2ggdGhlIHJlY292ZXJ5IGZsYWcgdG8gZGlzay4gKi8KKwlleHQzX2NvbW1pdF9zdXBlcihzYiwgZXMsIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGV4dDNfY29tbWl0X3N1cGVyIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwkJCSAgICAgICBzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqIGVzLAorCQkJICAgICAgIGludCBzeW5jKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqc2JoID0gRVhUM19TQihzYiktPnNfc2JoOworCisJaWYgKCFzYmgpCisJCXJldHVybjsKKwllcy0+c193dGltZSA9IGNwdV90b19sZTMyKGdldF9zZWNvbmRzKCkpOworCWVzLT5zX2ZyZWVfYmxvY2tzX2NvdW50ID0gY3B1X3RvX2xlMzIoZXh0M19jb3VudF9mcmVlX2Jsb2NrcyhzYikpOworCWVzLT5zX2ZyZWVfaW5vZGVzX2NvdW50ID0gY3B1X3RvX2xlMzIoZXh0M19jb3VudF9mcmVlX2lub2RlcyhzYikpOworCUJVRkZFUl9UUkFDRShzYmgsICJtYXJraW5nIGRpcnR5Iik7CisJbWFya19idWZmZXJfZGlydHkoc2JoKTsKKwlpZiAoc3luYykKKwkJc3luY19kaXJ0eV9idWZmZXIoc2JoKTsKK30KKworCisvKgorICogSGF2ZSB3ZSBqdXN0IGZpbmlzaGVkIHJlY292ZXJ5PyAgSWYgc28sIGFuZCBpZiB3ZSBhcmUgbW91bnRpbmcgKG9yCisgKiByZW1vdW50aW5nKSB0aGUgZmlsZXN5c3RlbSByZWFkb25seSwgdGhlbiB3ZSB3aWxsIGVuZCB1cCB3aXRoIGEKKyAqIGNvbnNpc3RlbnQgZnMgb24gZGlzay4gIFJlY29yZCB0aGF0IGZhY3QuCisgKi8KK3N0YXRpYyB2b2lkIGV4dDNfbWFya19yZWNvdmVyeV9jb21wbGV0ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwkJCQkJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKiBlcykKK3sKKwlqb3VybmFsX3QgKmpvdXJuYWwgPSBFWFQzX1NCKHNiKS0+c19qb3VybmFsOworCisJam91cm5hbF9sb2NrX3VwZGF0ZXMoam91cm5hbCk7CisJam91cm5hbF9mbHVzaChqb3VybmFsKTsKKwlpZiAoRVhUM19IQVNfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUM19GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIpICYmCisJICAgIHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSB7CisJCUVYVDNfQ0xFQVJfSU5DT01QQVRfRkVBVFVSRShzYiwgRVhUM19GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIpOworCQlzYi0+c19kaXJ0ID0gMDsKKwkJZXh0M19jb21taXRfc3VwZXIoc2IsIGVzLCAxKTsKKwl9CisJam91cm5hbF91bmxvY2tfdXBkYXRlcyhqb3VybmFsKTsKK30KKworLyoKKyAqIElmIHdlIGFyZSBtb3VudGluZyAob3IgcmVhZC13cml0ZSByZW1vdW50aW5nKSBhIGZpbGVzeXN0ZW0gd2hvc2Ugam91cm5hbAorICogaGFzIHJlY29yZGVkIGFuIGVycm9yIGZyb20gYSBwcmV2aW91cyBsaWZldGltZSwgbW92ZSB0aGF0IGVycm9yIHRvIHRoZQorICogbWFpbiBmaWxlc3lzdGVtIG5vdy4KKyAqLworc3RhdGljIHZvaWQgZXh0M19jbGVhcl9qb3VybmFsX2VycihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwkJCQkgICBzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqIGVzKQoreworCWpvdXJuYWxfdCAqam91cm5hbDsKKwlpbnQgal9lcnJubzsKKwljb25zdCBjaGFyICplcnJzdHI7CisKKwlqb3VybmFsID0gRVhUM19TQihzYiktPnNfam91cm5hbDsKKworCS8qCisJICogTm93IGNoZWNrIGZvciBhbnkgZXJyb3Igc3RhdHVzIHdoaWNoIG1heSBoYXZlIGJlZW4gcmVjb3JkZWQgaW4gdGhlCisJICogam91cm5hbCBieSBhIHByaW9yIGV4dDNfZXJyb3IoKSBvciBleHQzX2Fib3J0KCkKKwkgKi8KKworCWpfZXJybm8gPSBqb3VybmFsX2Vycm5vKGpvdXJuYWwpOworCWlmIChqX2Vycm5vKSB7CisJCWNoYXIgbmJ1ZlsxNl07CisKKwkJZXJyc3RyID0gZXh0M19kZWNvZGVfZXJyb3Ioc2IsIGpfZXJybm8sIG5idWYpOworCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywgIkZpbGVzeXN0ZW0gZXJyb3IgcmVjb3JkZWQgIgorCQkJICAgICAiZnJvbSBwcmV2aW91cyBtb3VudDogJXMiLCBlcnJzdHIpOworCQlleHQzX3dhcm5pbmcoc2IsIF9fRlVOQ1RJT05fXywgIk1hcmtpbmcgZnMgaW4gbmVlZCBvZiAiCisJCQkgICAgICJmaWxlc3lzdGVtIGNoZWNrLiIpOworCisJCUVYVDNfU0Ioc2IpLT5zX21vdW50X3N0YXRlIHw9IEVYVDNfRVJST1JfRlM7CisJCWVzLT5zX3N0YXRlIHw9IGNwdV90b19sZTE2KEVYVDNfRVJST1JfRlMpOworCQlleHQzX2NvbW1pdF9zdXBlciAoc2IsIGVzLCAxKTsKKworCQlqb3VybmFsX2NsZWFyX2Vycihqb3VybmFsKTsKKwl9Cit9CisKKy8qCisgKiBGb3JjZSB0aGUgcnVubmluZyBhbmQgY29tbWl0dGluZyB0cmFuc2FjdGlvbnMgdG8gY29tbWl0LAorICogYW5kIHdhaXQgb24gdGhlIGNvbW1pdC4KKyAqLworaW50IGV4dDNfZm9yY2VfY29tbWl0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJam91cm5hbF90ICpqb3VybmFsOworCWludCByZXQ7CisKKwlpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpCisJCXJldHVybiAwOworCisJam91cm5hbCA9IEVYVDNfU0Ioc2IpLT5zX2pvdXJuYWw7CisJc2ItPnNfZGlydCA9IDA7CisJcmV0ID0gZXh0M19qb3VybmFsX2ZvcmNlX2NvbW1pdChqb3VybmFsKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRXh0MyBhbHdheXMgam91cm5hbHMgdXBkYXRlcyB0byB0aGUgc3VwZXJibG9jayBpdHNlbGYsIHNvIHdlIGRvbid0CisgKiBoYXZlIHRvIHByb3BhZ2F0ZSBhbnkgb3RoZXIgdXBkYXRlcyB0byB0aGUgc3VwZXJibG9jayBvbiBkaXNrIGF0IHRoaXMKKyAqIHBvaW50LiAgSnVzdCBzdGFydCBhbiBhc3luYyB3cml0ZWJhY2sgdG8gZ2V0IHRoZSBidWZmZXJzIG9uIHRoZWlyIHdheQorICogdG8gdGhlIGRpc2suCisgKgorICogVGhpcyBpbXBsaWNpdGx5IHRyaWdnZXJzIHRoZSB3cml0ZWJlaGluZCBvbiBzeW5jKCkuCisgKi8KKworc3RhdGljIHZvaWQgZXh0M193cml0ZV9zdXBlciAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpCit7CisJaWYgKGRvd25fdHJ5bG9jaygmc2ItPnNfbG9jaykgPT0gMCkKKwkJQlVHKCk7CisJc2ItPnNfZGlydCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgZXh0M19zeW5jX2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB3YWl0KQoreworCXRpZF90IHRhcmdldDsKKworCXNiLT5zX2RpcnQgPSAwOworCWlmIChqb3VybmFsX3N0YXJ0X2NvbW1pdChFWFQzX1NCKHNiKS0+c19qb3VybmFsLCAmdGFyZ2V0KSkgeworCQlpZiAod2FpdCkKKwkJCWxvZ193YWl0X2NvbW1pdChFWFQzX1NCKHNiKS0+c19qb3VybmFsLCB0YXJnZXQpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIExWTSBjYWxscyB0aGlzIGZ1bmN0aW9uIGJlZm9yZSBhIChyZWFkLW9ubHkpIHNuYXBzaG90IGlzIGNyZWF0ZWQuICBUaGlzCisgKiBnaXZlcyB1cyBhIGNoYW5jZSB0byBmbHVzaCB0aGUgam91cm5hbCBjb21wbGV0ZWx5IGFuZCBtYXJrIHRoZSBmcyBjbGVhbi4KKyAqLworc3RhdGljIHZvaWQgZXh0M193cml0ZV9zdXBlcl9sb2NrZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzYi0+c19kaXJ0ID0gMDsKKworCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQlqb3VybmFsX3QgKmpvdXJuYWwgPSBFWFQzX1NCKHNiKS0+c19qb3VybmFsOworCisJCS8qIE5vdyB3ZSBzZXQgdXAgdGhlIGpvdXJuYWwgYmFycmllci4gKi8KKwkJam91cm5hbF9sb2NrX3VwZGF0ZXMoam91cm5hbCk7CisJCWpvdXJuYWxfZmx1c2goam91cm5hbCk7CisKKwkJLyogSm91cm5hbCBibG9ja2VkIGFuZCBmbHVzaGVkLCBjbGVhciBuZWVkc19yZWNvdmVyeSBmbGFnLiAqLworCQlFWFQzX0NMRUFSX0lOQ09NUEFUX0ZFQVRVUkUoc2IsIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSKTsKKwkJZXh0M19jb21taXRfc3VwZXIoc2IsIEVYVDNfU0Ioc2IpLT5zX2VzLCAxKTsKKwl9Cit9CisKKy8qCisgKiBDYWxsZWQgYnkgTFZNIGFmdGVyIHRoZSBzbmFwc2hvdCBpcyBkb25lLiAgV2UgbmVlZCB0byByZXNldCB0aGUgUkVDT1ZFUgorICogZmxhZyBoZXJlLCBldmVuIHRob3VnaCB0aGUgZmlsZXN5c3RlbSBpcyBub3QgdGVjaG5pY2FsbHkgZGlydHkgeWV0LgorICovCitzdGF0aWMgdm9pZCBleHQzX3VubG9ja2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCWxvY2tfc3VwZXIoc2IpOworCQkvKiBSZXNlciB0aGUgbmVlZHNfcmVjb3ZlcnkgZmxhZyBiZWZvcmUgdGhlIGZzIGlzIHVubG9ja2VkLiAqLworCQlFWFQzX1NFVF9JTkNPTVBBVF9GRUFUVVJFKHNiLCBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfUkVDT1ZFUik7CisJCWV4dDNfY29tbWl0X3N1cGVyKHNiLCBFWFQzX1NCKHNiKS0+c19lcywgMSk7CisJCXVubG9ja19zdXBlcihzYik7CisJCWpvdXJuYWxfdW5sb2NrX3VwZGF0ZXMoRVhUM19TQihzYiktPnNfam91cm5hbCk7CisJfQorfQorCitzdGF0aWMgaW50IGV4dDNfcmVtb3VudCAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIGludCAqIGZsYWdzLCBjaGFyICogZGF0YSkKK3sKKwlzdHJ1Y3QgZXh0M19zdXBlcl9ibG9jayAqIGVzOworCXN0cnVjdCBleHQzX3NiX2luZm8gKnNiaSA9IEVYVDNfU0Ioc2IpOworCXVuc2lnbmVkIGxvbmcgdG1wOworCXVuc2lnbmVkIGxvbmcgbl9ibG9ja3NfY291bnQgPSAwOworCisJLyoKKwkgKiBBbGxvdyB0aGUgImNoZWNrIiBvcHRpb24gdG8gYmUgcGFzc2VkIGFzIGEgcmVtb3VudCBvcHRpb24uCisJICovCisJaWYgKCFwYXJzZV9vcHRpb25zKGRhdGEsIHNiLCAmdG1wLCAmbl9ibG9ja3NfY291bnQsIDEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChzYmktPnNfbW91bnRfb3B0ICYgRVhUM19NT1VOVF9BQk9SVCkKKwkJZXh0M19hYm9ydChzYiwgX19GVU5DVElPTl9fLCAiQWJvcnQgZm9yY2VkIGJ5IHVzZXIiKTsKKworCXNiLT5zX2ZsYWdzID0gKHNiLT5zX2ZsYWdzICYgfk1TX1BPU0lYQUNMKSB8CisJCSgoc2JpLT5zX21vdW50X29wdCAmIEVYVDNfTU9VTlRfUE9TSVhfQUNMKSA/IE1TX1BPU0lYQUNMIDogMCk7CisKKwllcyA9IHNiaS0+c19lczsKKworCWV4dDNfaW5pdF9qb3VybmFsX3BhcmFtcyhzYiwgc2JpLT5zX2pvdXJuYWwpOworCisJaWYgKCgqZmxhZ3MgJiBNU19SRE9OTFkpICE9IChzYi0+c19mbGFncyAmIE1TX1JET05MWSkgfHwKKwkJbl9ibG9ja3NfY291bnQgPiBsZTMyX3RvX2NwdShlcy0+c19ibG9ja3NfY291bnQpKSB7CisJCWlmIChzYmktPnNfbW91bnRfb3B0ICYgRVhUM19NT1VOVF9BQk9SVCkKKwkJCXJldHVybiAtRVJPRlM7CisKKwkJaWYgKCpmbGFncyAmIE1TX1JET05MWSkgeworCQkJLyoKKwkJCSAqIEZpcnN0IG9mIGFsbCwgdGhlIHVuY29uZGl0aW9uYWwgc3R1ZmYgd2UgaGF2ZSB0byBkbworCQkJICogdG8gZGlzYWJsZSByZXBsYXkgb2YgdGhlIGpvdXJuYWwgd2hlbiB3ZSBuZXh0IHJlbW91bnQKKwkJCSAqLworCQkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCisJCQkvKgorCQkJICogT0ssIHRlc3QgaWYgd2UgYXJlIHJlbW91bnRpbmcgYSB2YWxpZCBydyBwYXJ0aXRpb24KKwkJCSAqIHJlYWRvbmx5LCBhbmQgaWYgc28gc2V0IHRoZSByZG9ubHkgZmxhZyBhbmQgdGhlbgorCQkJICogbWFyayB0aGUgcGFydGl0aW9uIGFzIHZhbGlkIGFnYWluLgorCQkJICovCisJCQlpZiAoIShlcy0+c19zdGF0ZSAmIGNwdV90b19sZTE2KEVYVDNfVkFMSURfRlMpKSAmJgorCQkJICAgIChzYmktPnNfbW91bnRfc3RhdGUgJiBFWFQzX1ZBTElEX0ZTKSkKKwkJCQllcy0+c19zdGF0ZSA9IGNwdV90b19sZTE2KHNiaS0+c19tb3VudF9zdGF0ZSk7CisKKwkJCWV4dDNfbWFya19yZWNvdmVyeV9jb21wbGV0ZShzYiwgZXMpOworCQl9IGVsc2UgeworCQkJX19sZTMyIHJldDsKKwkJCWlmICgocmV0ID0gRVhUM19IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsCisJCQkJCX5FWFQzX0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFApKSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVYVDMtZnM6ICVzOiBjb3VsZG4ndCAiCisJCQkJICAgICAgICJyZW1vdW50IFJEV1IgYmVjYXVzZSBvZiB1bnN1cHBvcnRlZCAiCisJCQkJICAgICAgICJvcHRpb25hbCBmZWF0dXJlcyAoJXgpLlxuIiwKKwkJCQkgICAgICAgc2ItPnNfaWQsIGxlMzJfdG9fY3B1KHJldCkpOworCQkJCXJldHVybiAtRVJPRlM7CisJCQl9CisJCQkvKgorCQkJICogTW91bnRpbmcgYSBSRE9OTFkgcGFydGl0aW9uIHJlYWQtd3JpdGUsIHNvIHJlcmVhZAorCQkJICogYW5kIHN0b3JlIHRoZSBjdXJyZW50IHZhbGlkIGZsYWcuICAoSXQgbWF5IGhhdmUKKwkJCSAqIGJlZW4gY2hhbmdlZCBieSBlMmZzY2sgc2luY2Ugd2Ugb3JpZ2luYWxseSBtb3VudGVkCisJCQkgKiB0aGUgcGFydGl0aW9uLikKKwkJCSAqLworCQkJZXh0M19jbGVhcl9qb3VybmFsX2VycihzYiwgZXMpOworCQkJc2JpLT5zX21vdW50X3N0YXRlID0gbGUxNl90b19jcHUoZXMtPnNfc3RhdGUpOworCQkJaWYgKChyZXQgPSBleHQzX2dyb3VwX2V4dGVuZChzYiwgZXMsIG5fYmxvY2tzX2NvdW50KSkpCisJCQkJcmV0dXJuIHJldDsKKwkJCWlmICghZXh0M19zZXR1cF9zdXBlciAoc2IsIGVzLCAwKSkKKwkJCQlzYi0+c19mbGFncyAmPSB+TVNfUkRPTkxZOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV4dDNfc3RhdGZzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgc3RydWN0IGtzdGF0ZnMgKiBidWYpCit7CisJc3RydWN0IGV4dDNfc3VwZXJfYmxvY2sgKmVzID0gRVhUM19TQihzYiktPnNfZXM7CisJdW5zaWduZWQgbG9uZyBvdmVyaGVhZDsKKwlpbnQgaTsKKworCWlmICh0ZXN0X29wdCAoc2IsIE1JTklYX0RGKSkKKwkJb3ZlcmhlYWQgPSAwOworCWVsc2UgeworCQl1bnNpZ25lZCBsb25nIG5ncm91cHM7CisJCW5ncm91cHMgPSBFWFQzX1NCKHNiKS0+c19ncm91cHNfY291bnQ7CisJCXNtcF9ybWIoKTsKKworCQkvKgorCQkgKiBDb21wdXRlIHRoZSBvdmVyaGVhZCAoRlMgc3RydWN0dXJlcykKKwkJICovCisKKwkJLyoKKwkJICogQWxsIG9mIHRoZSBibG9ja3MgYmVmb3JlIGZpcnN0X2RhdGFfYmxvY2sgYXJlCisJCSAqIG92ZXJoZWFkCisJCSAqLworCQlvdmVyaGVhZCA9IGxlMzJfdG9fY3B1KGVzLT5zX2ZpcnN0X2RhdGFfYmxvY2spOworCisJCS8qCisJCSAqIEFkZCB0aGUgb3ZlcmhlYWQgYXR0cmlidXRlZCB0byB0aGUgc3VwZXJibG9jayBhbmQKKwkJICogYmxvY2sgZ3JvdXAgZGVzY3JpcHRvcnMuICBJZiB0aGUgc3BhcnNlIHN1cGVyYmxvY2tzCisJCSAqIGZlYXR1cmUgaXMgdHVybmVkIG9uLCB0aGVuIG5vdCBhbGwgZ3JvdXBzIGhhdmUgdGhpcy4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBuZ3JvdXBzOyBpKyspIHsKKwkJCW92ZXJoZWFkICs9IGV4dDNfYmdfaGFzX3N1cGVyKHNiLCBpKSArCisJCQkJZXh0M19iZ19udW1fZ2RiKHNiLCBpKTsKKwkJCWNvbmRfcmVzY2hlZCgpOworCQl9CisKKwkJLyoKKwkJICogRXZlcnkgYmxvY2sgZ3JvdXAgaGFzIGFuIGlub2RlIGJpdG1hcCwgYSBibG9jaworCQkgKiBiaXRtYXAsIGFuZCBhbiBpbm9kZSB0YWJsZS4KKwkJICovCisJCW92ZXJoZWFkICs9IChuZ3JvdXBzICogKDIgKyBFWFQzX1NCKHNiKS0+c19pdGJfcGVyX2dyb3VwKSk7CisJfQorCisJYnVmLT5mX3R5cGUgPSBFWFQzX1NVUEVSX01BR0lDOworCWJ1Zi0+Zl9ic2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKKwlidWYtPmZfYmxvY2tzID0gbGUzMl90b19jcHUoZXMtPnNfYmxvY2tzX2NvdW50KSAtIG92ZXJoZWFkOworCWJ1Zi0+Zl9iZnJlZSA9IGV4dDNfY291bnRfZnJlZV9ibG9ja3MgKHNiKTsKKwlidWYtPmZfYmF2YWlsID0gYnVmLT5mX2JmcmVlIC0gbGUzMl90b19jcHUoZXMtPnNfcl9ibG9ja3NfY291bnQpOworCWlmIChidWYtPmZfYmZyZWUgPCBsZTMyX3RvX2NwdShlcy0+c19yX2Jsb2Nrc19jb3VudCkpCisJCWJ1Zi0+Zl9iYXZhaWwgPSAwOworCWJ1Zi0+Zl9maWxlcyA9IGxlMzJfdG9fY3B1KGVzLT5zX2lub2Rlc19jb3VudCk7CisJYnVmLT5mX2ZmcmVlID0gZXh0M19jb3VudF9mcmVlX2lub2RlcyAoc2IpOworCWJ1Zi0+Zl9uYW1lbGVuID0gRVhUM19OQU1FX0xFTjsKKwlyZXR1cm4gMDsKK30KKworLyogSGVscGVyIGZ1bmN0aW9uIGZvciB3cml0aW5nIHF1b3RhcyBvbiBzeW5jIC0gd2UgbmVlZCB0byBzdGFydCB0cmFuc2FjdGlvbiBiZWZvcmUgcXVvdGEgZmlsZQorICogaXMgbG9ja2VkIGZvciB3cml0ZS4gT3RoZXJ3aXNlIHRoZSBhcmUgcG9zc2libGUgZGVhZGxvY2tzOgorICogUHJvY2VzcyAxICAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3MgMgorICogZXh0M19jcmVhdGUoKSAgICAgICAgICAgICAgICAgICAgIHF1b3RhX3N5bmMoKQorICogICBqb3VybmFsX3N0YXJ0KCkgICAgICAgICAgICAgICAgICAgd3JpdGVfZHF1b3QoKQorICogICBEUVVPVF9JTklUKCkgICAgICAgICAgICAgICAgICAgICAgICBkb3duKGRxaW9fc2VtKQorICogICAgIGRvd24oZHFpb19zZW0pICAgICAgICAgICAgICAgICAgICBqb3VybmFsX3N0YXJ0KCkKKyAqCisgKi8KKworI2lmZGVmIENPTkZJR19RVU9UQQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbm9kZSAqZHF1b3RfdG9faW5vZGUoc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlyZXR1cm4gc2JfZHFvcHQoZHF1b3QtPmRxX3NiKS0+ZmlsZXNbZHF1b3QtPmRxX3R5cGVdOworfQorCitzdGF0aWMgaW50IGV4dDNfZHF1b3RfaW5pdGlhbGl6ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSkKK3sKKwloYW5kbGVfdCAqaGFuZGxlOworCWludCByZXQsIGVycjsKKworCS8qIFdlIG1heSBjcmVhdGUgcXVvdGEgc3RydWN0dXJlIHNvIHdlIG5lZWQgdG8gcmVzZXJ2ZSBlbm91Z2ggYmxvY2tzICovCisJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGlub2RlLCAyKkVYVDNfUVVPVEFfSU5JVF9CTE9DS1MpOworCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKKwlyZXQgPSBkcXVvdF9pbml0aWFsaXplKGlub2RlLCB0eXBlKTsKKwllcnIgPSBleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOworCWlmICghcmV0KQorCQlyZXQgPSBlcnI7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBleHQzX2RxdW90X2Ryb3Aoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwloYW5kbGVfdCAqaGFuZGxlOworCWludCByZXQsIGVycjsKKworCS8qIFdlIG1heSBkZWxldGUgcXVvdGEgc3RydWN0dXJlIHNvIHdlIG5lZWQgdG8gcmVzZXJ2ZSBlbm91Z2ggYmxvY2tzICovCisJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGlub2RlLCAyKkVYVDNfUVVPVEFfSU5JVF9CTE9DS1MpOworCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKKwlyZXQgPSBkcXVvdF9kcm9wKGlub2RlKTsKKwllcnIgPSBleHQzX2pvdXJuYWxfc3RvcChoYW5kbGUpOworCWlmICghcmV0KQorCQlyZXQgPSBlcnI7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBleHQzX3dyaXRlX2RxdW90KHN0cnVjdCBkcXVvdCAqZHF1b3QpCit7CisJaW50IHJldCwgZXJyOworCWhhbmRsZV90ICpoYW5kbGU7CisJc3RydWN0IGlub2RlICppbm9kZTsKKworCWlub2RlID0gZHF1b3RfdG9faW5vZGUoZHF1b3QpOworCWhhbmRsZSA9IGV4dDNfam91cm5hbF9zdGFydChpbm9kZSwKKwkJCQkJRVhUM19RVU9UQV9UUkFOU19CTE9DS1MpOworCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKKwlyZXQgPSBkcXVvdF9jb21taXQoZHF1b3QpOworCWVyciA9IGV4dDNfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJaWYgKCFyZXQpCisJCXJldCA9IGVycjsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGV4dDNfYWNxdWlyZV9kcXVvdChzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCWludCByZXQsIGVycjsKKwloYW5kbGVfdCAqaGFuZGxlOworCisJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGRxdW90X3RvX2lub2RlKGRxdW90KSwKKwkJCQkJRVhUM19RVU9UQV9JTklUX0JMT0NLUyk7CisJaWYgKElTX0VSUihoYW5kbGUpKQorCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOworCXJldCA9IGRxdW90X2FjcXVpcmUoZHF1b3QpOworCWVyciA9IGV4dDNfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJaWYgKCFyZXQpCisJCXJldCA9IGVycjsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGV4dDNfcmVsZWFzZV9kcXVvdChzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCWludCByZXQsIGVycjsKKwloYW5kbGVfdCAqaGFuZGxlOworCisJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KGRxdW90X3RvX2lub2RlKGRxdW90KSwKKwkJCQkJRVhUM19RVU9UQV9JTklUX0JMT0NLUyk7CisJaWYgKElTX0VSUihoYW5kbGUpKQorCQlyZXR1cm4gUFRSX0VSUihoYW5kbGUpOworCXJldCA9IGRxdW90X3JlbGVhc2UoZHF1b3QpOworCWVyciA9IGV4dDNfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJaWYgKCFyZXQpCisJCXJldCA9IGVycjsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGV4dDNfbWFya19kcXVvdF9kaXJ0eShzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCS8qIEFyZSB3ZSBqb3VybmFsbGluZyBxdW90YXM/ICovCisJaWYgKEVYVDNfU0IoZHF1b3QtPmRxX3NiKS0+c19xZl9uYW1lc1tVU1JRVU9UQV0gfHwKKwkgICAgRVhUM19TQihkcXVvdC0+ZHFfc2IpLT5zX3FmX25hbWVzW0dSUFFVT1RBXSkgeworCQlkcXVvdF9tYXJrX2RxdW90X2RpcnR5KGRxdW90KTsKKwkJcmV0dXJuIGV4dDNfd3JpdGVfZHF1b3QoZHF1b3QpOworCX0gZWxzZSB7CisJCXJldHVybiBkcXVvdF9tYXJrX2RxdW90X2RpcnR5KGRxdW90KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZXh0M193cml0ZV9pbmZvKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQoreworCWludCByZXQsIGVycjsKKwloYW5kbGVfdCAqaGFuZGxlOworCisJLyogRGF0YSBibG9jayArIGlub2RlIGJsb2NrICovCisJaGFuZGxlID0gZXh0M19qb3VybmFsX3N0YXJ0KHNiLT5zX3Jvb3QtPmRfaW5vZGUsIDIpOworCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJcmV0dXJuIFBUUl9FUlIoaGFuZGxlKTsKKwlyZXQgPSBkcXVvdF9jb21taXRfaW5mbyhzYiwgdHlwZSk7CisJZXJyID0gZXh0M19qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gZXJyOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBUdXJuIG9uIHF1b3RhcyBkdXJpbmcgbW91bnQgdGltZSAtIHdlIG5lZWQgdG8gZmluZAorICogdGhlIHF1b3RhIGZpbGUgYW5kIHN1Y2guLi4KKyAqLworc3RhdGljIGludCBleHQzX3F1b3RhX29uX21vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQoreworCWludCBlcnI7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXN0cnVjdCBxc3RyIG5hbWUgPSB7IC5uYW1lID0gRVhUM19TQihzYiktPnNfcWZfbmFtZXNbdHlwZV0sCisJCQkgICAgIC5oYXNoID0gMCwKKwkJCSAgICAgLmxlbiA9IHN0cmxlbihFWFQzX1NCKHNiKS0+c19xZl9uYW1lc1t0eXBlXSl9OworCisJZGVudHJ5ID0gbG9va3VwX2hhc2goJm5hbWUsIHNiLT5zX3Jvb3QpOworCWlmIChJU19FUlIoZGVudHJ5KSkKKwkJcmV0dXJuIFBUUl9FUlIoZGVudHJ5KTsKKwllcnIgPSB2ZnNfcXVvdGFfb25fbW91bnQodHlwZSwgRVhUM19TQihzYiktPnNfanF1b3RhX2ZtdCwgZGVudHJ5KTsKKwkvKiBOb3cgaW52YWxpZGF0ZSBhbmQgcHV0IHRoZSBkZW50cnkgLSBxdW90YSBnb3QgaXRzIG93biByZWZlcmVuY2UKKwkgKiB0byBpbm9kZSBhbmQgZGVudHJ5IGhhcyBhdCBsZWFzdCB3cm9uZyBoYXNoIHNvIHdlIGhhZCBiZXR0ZXIKKwkgKiB0aHJvdyBpdCBhd2F5ICovCisJZF9pbnZhbGlkYXRlKGRlbnRyeSk7CisJZHB1dChkZW50cnkpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBTdGFuZGFyZCBmdW5jdGlvbiB0byBiZSBjYWxsZWQgb24gcXVvdGFfb24KKyAqLworc3RhdGljIGludCBleHQzX3F1b3RhX29uKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCBpbnQgZm9ybWF0X2lkLAorCQkJIGNoYXIgKnBhdGgpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCisJLyogTm90IGpvdXJuYWxsaW5nIHF1b3RhPyAqLworCWlmICghRVhUM19TQihzYiktPnNfcWZfbmFtZXNbVVNSUVVPVEFdICYmCisJICAgICFFWFQzX1NCKHNiKS0+c19xZl9uYW1lc1tHUlBRVU9UQV0pCisJCXJldHVybiB2ZnNfcXVvdGFfb24oc2IsIHR5cGUsIGZvcm1hdF9pZCwgcGF0aCk7CisJZXJyID0gcGF0aF9sb29rdXAocGF0aCwgTE9PS1VQX0ZPTExPVywgJm5kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCS8qIFF1b3RhZmlsZSBub3Qgb24gdGhlIHNhbWUgZmlsZXN5c3RlbT8gKi8KKwlpZiAobmQubW50LT5tbnRfc2IgIT0gc2IpIHsKKwkJcGF0aF9yZWxlYXNlKCZuZCk7CisJCXJldHVybiAtRVhERVY7CisJfQorCS8qIFF1b3RhZmlsZSBub3Qgb2YgZnMgcm9vdD8gKi8KKwlpZiAobmQuZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZSAhPSBzYi0+c19yb290LT5kX2lub2RlKQorCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkiRVhUMy1mczogUXVvdGEgZmlsZSBub3Qgb24gZmlsZXN5c3RlbSByb290LiAiCisJCQkiSm91cm5hbGxlZCBxdW90YSB3aWxsIG5vdCB3b3JrLlxuIik7CisJcGF0aF9yZWxlYXNlKCZuZCk7CisJcmV0dXJuIHZmc19xdW90YV9vbihzYiwgdHlwZSwgZm9ybWF0X2lkLCBwYXRoKTsKK30KKworLyogUmVhZCBkYXRhIGZyb20gcXVvdGFmaWxlIC0gYXZvaWQgcGFnZWNhY2hlIGFuZCBzdWNoIGJlY2F1c2Ugd2UgY2Fubm90IGFmZm9yZAorICogYWNxdWlyaW5nIHRoZSBsb2Nrcy4uLiBBcyBxdW90YSBmaWxlcyBhcmUgbmV2ZXIgdHJ1bmNhdGVkIGFuZCBxdW90YSBjb2RlCisgKiBpdHNlbGYgc2VyaWFsaXplcyB0aGUgb3BlcmF0aW9ucyAoYW5kIG5vb25lIGVsc2Ugc2hvdWxkIHRvdWNoIHRoZSBmaWxlcykKKyAqIHdlIGRvbid0IGhhdmUgdG8gYmUgYWZyYWlkIG9mIHJhY2VzICovCitzdGF0aWMgc3NpemVfdCBleHQzX3F1b3RhX3JlYWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIGNoYXIgKmRhdGEsCisJCQkgICAgICAgc2l6ZV90IGxlbiwgbG9mZl90IG9mZikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gc2JfZHFvcHQoc2IpLT5maWxlc1t0eXBlXTsKKwlzZWN0b3JfdCBibGsgPSBvZmYgPj4gRVhUM19CTE9DS19TSVpFX0JJVFMoc2IpOworCWludCBlcnIgPSAwOworCWludCBvZmZzZXQgPSBvZmYgJiAoc2ItPnNfYmxvY2tzaXplIC0gMSk7CisJaW50IHRvY29weTsKKwlzaXplX3QgdG9yZWFkOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJbG9mZl90IGlfc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKworCWlmIChvZmYgPiBpX3NpemUpCisJCXJldHVybiAwOworCWlmIChvZmYrbGVuID4gaV9zaXplKQorCQlsZW4gPSBpX3NpemUtb2ZmOworCXRvcmVhZCA9IGxlbjsKKwl3aGlsZSAodG9yZWFkID4gMCkgeworCQl0b2NvcHkgPSBzYi0+c19ibG9ja3NpemUgLSBvZmZzZXQgPCB0b3JlYWQgPworCQkJCXNiLT5zX2Jsb2Nrc2l6ZSAtIG9mZnNldCA6IHRvcmVhZDsKKwkJYmggPSBleHQzX2JyZWFkKE5VTEwsIGlub2RlLCBibGssIDAsICZlcnIpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJaWYgKCFiaCkJLyogQSBob2xlPyAqLworCQkJbWVtc2V0KGRhdGEsIDAsIHRvY29weSk7CisJCWVsc2UKKwkJCW1lbWNweShkYXRhLCBiaC0+Yl9kYXRhK29mZnNldCwgdG9jb3B5KTsKKwkJYnJlbHNlKGJoKTsKKwkJb2Zmc2V0ID0gMDsKKwkJdG9yZWFkIC09IHRvY29weTsKKwkJZGF0YSArPSB0b2NvcHk7CisJCWJsaysrOworCX0KKwlyZXR1cm4gbGVuOworfQorCisvKiBXcml0ZSB0byBxdW90YWZpbGUgKHdlIGtub3cgdGhlIHRyYW5zYWN0aW9uIGlzIGFscmVhZHkgc3RhcnRlZCBhbmQgaGFzCisgKiBlbm91Z2ggY3JlZGl0cykgKi8KK3N0YXRpYyBzc2l6ZV90IGV4dDNfcXVvdGFfd3JpdGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsCisJCQkJY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbiwgbG9mZl90IG9mZikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gc2JfZHFvcHQoc2IpLT5maWxlc1t0eXBlXTsKKwlzZWN0b3JfdCBibGsgPSBvZmYgPj4gRVhUM19CTE9DS19TSVpFX0JJVFMoc2IpOworCWludCBlcnIgPSAwOworCWludCBvZmZzZXQgPSBvZmYgJiAoc2ItPnNfYmxvY2tzaXplIC0gMSk7CisJaW50IHRvY29weTsKKwlpbnQgam91cm5hbF9xdW90YSA9IEVYVDNfU0Ioc2IpLT5zX3FmX25hbWVzW3R5cGVdICE9IE5VTEw7CisJc2l6ZV90IHRvd3JpdGUgPSBsZW47CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwloYW5kbGVfdCAqaGFuZGxlID0gam91cm5hbF9jdXJyZW50X2hhbmRsZSgpOworCisJZG93bigmaW5vZGUtPmlfc2VtKTsKKwl3aGlsZSAodG93cml0ZSA+IDApIHsKKwkJdG9jb3B5ID0gc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0IDwgdG93cml0ZSA/CisJCQkJc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0IDogdG93cml0ZTsKKwkJYmggPSBleHQzX2JyZWFkKGhhbmRsZSwgaW5vZGUsIGJsaywgMSwgJmVycik7CisJCWlmICghYmgpCisJCQlnb3RvIG91dDsKKwkJaWYgKGpvdXJuYWxfcXVvdGEpIHsKKwkJCWVyciA9IGV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgYmgpOworCQkJaWYgKGVycikgeworCQkJCWJyZWxzZShiaCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwkJbG9ja19idWZmZXIoYmgpOworCQltZW1jcHkoYmgtPmJfZGF0YStvZmZzZXQsIGRhdGEsIHRvY29weSk7CisJCWZsdXNoX2RjYWNoZV9wYWdlKGJoLT5iX3BhZ2UpOworCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJaWYgKGpvdXJuYWxfcXVvdGEpCisJCQllcnIgPSBleHQzX2pvdXJuYWxfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBiaCk7CisJCWVsc2UgeworCQkJLyogQWx3YXlzIGRvIGF0IGxlYXN0IG9yZGVyZWQgd3JpdGVzIGZvciBxdW90YXMgKi8KKwkJCWVyciA9IGV4dDNfam91cm5hbF9kaXJ0eV9kYXRhKGhhbmRsZSwgYmgpOworCQkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQl9CisJCWJyZWxzZShiaCk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwkJb2Zmc2V0ID0gMDsKKwkJdG93cml0ZSAtPSB0b2NvcHk7CisJCWRhdGEgKz0gdG9jb3B5OworCQlibGsrKzsKKwl9CitvdXQ6CisJaWYgKGxlbiA9PSB0b3dyaXRlKQorCQlyZXR1cm4gZXJyOworCWlmIChpbm9kZS0+aV9zaXplIDwgb2ZmK2xlbi10b3dyaXRlKSB7CisJCWlfc2l6ZV93cml0ZShpbm9kZSwgb2ZmK2xlbi10b3dyaXRlKTsKKwkJRVhUM19JKGlub2RlKS0+aV9kaXNrc2l6ZSA9IGlub2RlLT5pX3NpemU7CisJfQorCWlub2RlLT5pX3ZlcnNpb24rKzsKKwlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCWV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKKwl1cCgmaW5vZGUtPmlfc2VtKTsKKwlyZXR1cm4gbGVuIC0gdG93cml0ZTsKK30KKworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmV4dDNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgZXh0M19maWxsX3N1cGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGV4dDNfZnNfdHlwZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImV4dDMiLAorCS5nZXRfc2IJCT0gZXh0M19nZXRfc2IsCisJLmtpbGxfc2IJPSBraWxsX2Jsb2NrX3N1cGVyLAorCS5mc19mbGFncwk9IEZTX1JFUVVJUkVTX0RFViwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfZXh0M19mcyh2b2lkKQoreworCWludCBlcnIgPSBpbml0X2V4dDNfeGF0dHIoKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWVyciA9IGluaXRfaW5vZGVjYWNoZSgpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MTsKKyAgICAgICAgZXJyID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmZXh0M19mc190eXBlKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwlyZXR1cm4gMDsKK291dDoKKwlkZXN0cm95X2lub2RlY2FjaGUoKTsKK291dDE6CisgCWV4aXRfZXh0M194YXR0cigpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2V4dDNfZnModm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmV4dDNfZnNfdHlwZSk7CisJZGVzdHJveV9pbm9kZWNhY2hlKCk7CisJZXhpdF9leHQzX3hhdHRyKCk7Cit9CisKK01PRFVMRV9BVVRIT1IoIlJlbXkgQ2FyZCwgU3RlcGhlbiBUd2VlZGllLCBBbmRyZXcgTW9ydG9uLCBBbmRyZWFzIERpbGdlciwgVGhlb2RvcmUgVHMnbyBhbmQgb3RoZXJzIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNlY29uZCBFeHRlbmRlZCBGaWxlc3lzdGVtIHdpdGggam91cm5hbGluZyBleHRlbnNpb25zIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7Cittb2R1bGVfaW5pdChpbml0X2V4dDNfZnMpCittb2R1bGVfZXhpdChleGl0X2V4dDNfZnMpCmRpZmYgLS1naXQgYS9mcy9leHQzL3N5bWxpbmsuYyBiL2ZzL2V4dDMvc3ltbGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjM2U3MjgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQzL3N5bWxpbmsuYwpAQCAtMCwwICsxLDU0IEBACisvKgorICogIGxpbnV4L2ZzL2V4dDMvc3ltbGluay5jCisgKgorICogT25seSBmYXN0IHN5bWxpbmtzIGxlZnQgaGVyZSAtIHRoZSByZXN0IGlzIGRvbmUgYnkgZ2VuZXJpYyBjb2RlLiBBViwgMTk5OQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NQorICogUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQorICogTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqCisgKiAgZnJvbQorICoKKyAqICBsaW51eC9mcy9taW5peC9zeW1saW5rLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICBleHQzIHN5bWxpbmsgaGFuZGxpbmcgY29kZQorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2piZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgInhhdHRyLmgiCisKK3N0YXRpYyBpbnQgZXh0M19mb2xsb3dfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBleHQzX2lub2RlX2luZm8gKmVpID0gRVhUM19JKGRlbnRyeS0+ZF9pbm9kZSk7CisJbmRfc2V0X2xpbmsobmQsIChjaGFyKillaS0+aV9kYXRhKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZXh0M19zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnJlYWRsaW5rCT0gZ2VuZXJpY19yZWFkbGluaywKKwkuZm9sbG93X2xpbmsJPSBwYWdlX2ZvbGxvd19saW5rX2xpZ2h0LAorCS5wdXRfbGluawk9IHBhZ2VfcHV0X2xpbmssCisjaWZkZWYgQ09ORklHX0VYVDNfRlNfWEFUVFIKKwkuc2V0eGF0dHIJPSBnZW5lcmljX3NldHhhdHRyLAorCS5nZXR4YXR0cgk9IGdlbmVyaWNfZ2V0eGF0dHIsCisJLmxpc3R4YXR0cgk9IGV4dDNfbGlzdHhhdHRyLAorCS5yZW1vdmV4YXR0cgk9IGdlbmVyaWNfcmVtb3ZleGF0dHIsCisjZW5kaWYKK307CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGV4dDNfZmFzdF9zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnJlYWRsaW5rCT0gZ2VuZXJpY19yZWFkbGluaywKKwkuZm9sbG93X2xpbmsJPSBleHQzX2ZvbGxvd19saW5rLAorI2lmZGVmIENPTkZJR19FWFQzX0ZTX1hBVFRSCisJLnNldHhhdHRyCT0gZ2VuZXJpY19zZXR4YXR0ciwKKwkuZ2V0eGF0dHIJPSBnZW5lcmljX2dldHhhdHRyLAorCS5saXN0eGF0dHIJPSBleHQzX2xpc3R4YXR0ciwKKwkucmVtb3ZleGF0dHIJPSBnZW5lcmljX3JlbW92ZXhhdHRyLAorI2VuZGlmCit9OwpkaWZmIC0tZ2l0IGEvZnMvZXh0My94YXR0ci5jIGIvZnMvZXh0My94YXR0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYmM2ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQzL3hhdHRyLmMKQEAgLTAsMCArMSwxMzIwIEBACisvKgorICogbGludXgvZnMvZXh0My94YXR0ci5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgQW5kcmVhcyBHcnVlbmJhY2hlciwgPGFncnVlbkBzdXNlLmRlPgorICoKKyAqIEZpeCBieSBIYXJyaXNvbiBYaW5nIDxoYXJyaXNvbkBtb3VudGFpbnZpZXdkYXRhLmNvbT4uCisgKiBFeHQzIGNvZGUgd2l0aCBhIGxvdCBvZiBoZWxwIGZyb20gRXJpYyBKYXJtYW4gPGVqYXJtYW5AYWNtLm9yZz4uCisgKiBFeHRlbmRlZCBhdHRyaWJ1dGVzIGZvciBzeW1saW5rcyBhbmQgc3BlY2lhbCBmaWxlcyBhZGRlZCBwZXIKKyAqICBzdWdnZXN0aW9uIG9mIEx1a2EgUmVua28gPGx1a2EucmVua29AaGVybWVzLnNpPi4KKyAqIHhhdHRyIGNvbnNvbGlkYXRpb24gQ29weXJpZ2h0IChjKSAyMDA0IEphbWVzIE1vcnJpcyA8am1vcnJpc0ByZWRoYXQuY29tPiwKKyAqICBSZWQgSGF0IEluYy4KKyAqIGVhLWluLWlub2RlIHN1cHBvcnQgYnkgQWxleCBUb21hcyA8YWxleEBjbHVzdGVyZnMuY29tPiBha2EgYnp6egorICogIGFuZCBBbmRyZWFzIEdydWVuYmFjaGVyIDxhZ3J1ZW5Ac3VzZS5kZT4uCisgKi8KKworLyoKKyAqIEV4dGVuZGVkIGF0dHJpYnV0ZXMgYXJlIHN0b3JlZCBkaXJlY3RseSBpbiBpbm9kZXMgKG9uIGZpbGUgc3lzdGVtcyB3aXRoCisgKiBpbm9kZXMgYmlnZ2VyIHRoYW4gMTI4IGJ5dGVzKSBhbmQgb24gYWRkaXRpb25hbCBkaXNrIGJsb2Nrcy4gVGhlIGlfZmlsZV9hY2wKKyAqIGZpZWxkIGNvbnRhaW5zIHRoZSBibG9jayBudW1iZXIgaWYgYW4gaW5vZGUgdXNlcyBhbiBhZGRpdGlvbmFsIGJsb2NrLiBBbGwKKyAqIGF0dHJpYnV0ZXMgbXVzdCBmaXQgaW4gdGhlIGlub2RlIGFuZCBvbmUgYWRkaXRpb25hbCBibG9jay4gQmxvY2tzIHRoYXQKKyAqIGNvbnRhaW4gdGhlIGlkZW50aWNhbCBzZXQgb2YgYXR0cmlidXRlcyBtYXkgYmUgc2hhcmVkIGFtb25nIHNldmVyYWwgaW5vZGVzLgorICogSWRlbnRpY2FsIGJsb2NrcyBhcmUgZGV0ZWN0ZWQgYnkga2VlcGluZyBhIGNhY2hlIG9mIGJsb2NrcyB0aGF0IGhhdmUKKyAqIHJlY2VudGx5IGJlZW4gYWNjZXNzZWQuCisgKgorICogVGhlIGF0dHJpYnV0ZXMgaW4gaW5vZGVzIGFuZCBvbiBibG9ja3MgaGF2ZSBhIGRpZmZlcmVudCBoZWFkZXI7IHRoZSBlbnRyaWVzCisgKiBhcmUgc3RvcmVkIGluIHRoZSBzYW1lIGZvcm1hdDoKKyAqCisgKiAgICstLS0tLS0tLS0tLS0tLS0tLS0rCisgKiAgIHwgaGVhZGVyICAgICAgICAgICB8CisgKiAgIHwgZW50cnkgMSAgICAgICAgICB8IHwKKyAqICAgfCBlbnRyeSAyICAgICAgICAgIHwgfCBncm93aW5nIGRvd253YXJkcworICogICB8IGVudHJ5IDMgICAgICAgICAgfCB2CisgKiAgIHwgZm91ciBudWxsIGJ5dGVzICB8CisgKiAgIHwgLiAuIC4gICAgICAgICAgICB8CisgKiAgIHwgdmFsdWUgMSAgICAgICAgICB8IF4KKyAqICAgfCB2YWx1ZSAzICAgICAgICAgIHwgfCBncm93aW5nIHVwd2FyZHMKKyAqICAgfCB2YWx1ZSAyICAgICAgICAgIHwgfAorICogICArLS0tLS0tLS0tLS0tLS0tLS0tKworICoKKyAqIFRoZSBoZWFkZXIgaXMgZm9sbG93ZWQgYnkgbXVsdGlwbGUgZW50cnkgZGVzY3JpcHRvcnMuIEluIGRpc2sgYmxvY2tzLCB0aGUKKyAqIGVudHJ5IGRlc2NyaXB0b3JzIGFyZSBrZXB0IHNvcnRlZC4gSW4gaW5vZGVzLCB0aGV5IGFyZSB1bnNvcnRlZC4gVGhlCisgKiBhdHRyaWJ1dGUgdmFsdWVzIGFyZSBhbGlnbmVkIHRvIHRoZSBlbmQgb2YgdGhlIGJsb2NrIGluIG5vIHNwZWNpZmljIG9yZGVyLgorICoKKyAqIExvY2tpbmcgc3RyYXRlZ3kKKyAqIC0tLS0tLS0tLS0tLS0tLS0KKyAqIEVYVDNfSShpbm9kZSktPmlfZmlsZV9hY2wgaXMgcHJvdGVjdGVkIGJ5IEVYVDNfSShpbm9kZSktPnhhdHRyX3NlbS4KKyAqIEVBIGJsb2NrcyBhcmUgb25seSBjaGFuZ2VkIGlmIHRoZXkgYXJlIGV4Y2x1c2l2ZSB0byBhbiBpbm9kZSwgc28KKyAqIGhvbGRpbmcgeGF0dHJfc2VtIGFsc28gbWVhbnMgdGhhdCBub3RoaW5nIGJ1dCB0aGUgRUEgYmxvY2sncyByZWZlcmVuY2UKKyAqIGNvdW50IGNhbiBjaGFuZ2UuIE11bHRpcGxlIHdyaXRlcnMgdG8gdGhlIHNhbWUgYmxvY2sgYXJlIHN5bmNocm9uaXplZAorICogYnkgdGhlIGJ1ZmZlciBsb2NrLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXh0M19qYmQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHQzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbWJjYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CisjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KKyNpbmNsdWRlICJ4YXR0ci5oIgorI2luY2x1ZGUgImFjbC5oIgorCisjZGVmaW5lIEJIRFIoYmgpICgoc3RydWN0IGV4dDNfeGF0dHJfaGVhZGVyICopKChiaCktPmJfZGF0YSkpCisjZGVmaW5lIEVOVFJZKHB0cikgKChzdHJ1Y3QgZXh0M194YXR0cl9lbnRyeSAqKShwdHIpKQorI2RlZmluZSBCRklSU1QoYmgpIEVOVFJZKEJIRFIoYmgpKzEpCisjZGVmaW5lIElTX0xBU1RfRU5UUlkoZW50cnkpICgqKF9fdTMyICopKGVudHJ5KSA9PSAwKQorCisjZGVmaW5lIElIRFIoaW5vZGUsIHJhd19pbm9kZSkgXAorCSgoc3RydWN0IGV4dDNfeGF0dHJfaWJvZHlfaGVhZGVyICopIFwKKwkJKCh2b2lkICopcmF3X2lub2RlICsgXAorCQkgRVhUM19HT09EX09MRF9JTk9ERV9TSVpFICsgXAorCQkgRVhUM19JKGlub2RlKS0+aV9leHRyYV9pc2l6ZSkpCisjZGVmaW5lIElGSVJTVChoZHIpICgoc3RydWN0IGV4dDNfeGF0dHJfZW50cnkgKikoKGhkcikrMSkpCisKKyNpZmRlZiBFWFQzX1hBVFRSX0RFQlVHCisjIGRlZmluZSBlYV9pZGVidWcoaW5vZGUsIGYuLi4pIGRvIHsgXAorCQlwcmludGsoS0VSTl9ERUJVRyAiaW5vZGUgJXM6JWxkOiAiLCBcCisJCQlpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vKTsgXAorCQlwcmludGsoZik7IFwKKwkJcHJpbnRrKCJcbiIpOyBcCisJfSB3aGlsZSAoMCkKKyMgZGVmaW5lIGVhX2JkZWJ1ZyhiaCwgZi4uLikgZG8geyBcCisJCWNoYXIgYltCREVWTkFNRV9TSVpFXTsgXAorCQlwcmludGsoS0VSTl9ERUJVRyAiYmxvY2sgJXM6JWx1OiAiLCBcCisJCQliZGV2bmFtZShiaC0+Yl9iZGV2LCBiKSwgXAorCQkJKHVuc2lnbmVkIGxvbmcpIGJoLT5iX2Jsb2NrbnIpOyBcCisJCXByaW50ayhmKTsgXAorCQlwcmludGsoIlxuIik7IFwKKwl9IHdoaWxlICgwKQorI2Vsc2UKKyMgZGVmaW5lIGVhX2lkZWJ1ZyhmLi4uKQorIyBkZWZpbmUgZWFfYmRlYnVnKGYuLi4pCisjZW5kaWYKKworc3RhdGljIHZvaWQgZXh0M194YXR0cl9jYWNoZV9pbnNlcnQoc3RydWN0IGJ1ZmZlcl9oZWFkICopOworc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqZXh0M194YXR0cl9jYWNoZV9maW5kKHN0cnVjdCBpbm9kZSAqLAorCQkJCQkJIHN0cnVjdCBleHQzX3hhdHRyX2hlYWRlciAqLAorCQkJCQkJIHN0cnVjdCBtYl9jYWNoZV9lbnRyeSAqKik7CitzdGF0aWMgdm9pZCBleHQzX3hhdHRyX3JlaGFzaChzdHJ1Y3QgZXh0M194YXR0cl9oZWFkZXIgKiwKKwkJCSAgICAgIHN0cnVjdCBleHQzX3hhdHRyX2VudHJ5ICopOworCitzdGF0aWMgc3RydWN0IG1iX2NhY2hlICpleHQzX3hhdHRyX2NhY2hlOworCitzdGF0aWMgc3RydWN0IHhhdHRyX2hhbmRsZXIgKmV4dDNfeGF0dHJfaGFuZGxlcl9tYXBbXSA9IHsKKwlbRVhUM19YQVRUUl9JTkRFWF9VU0VSXQkJICAgICA9ICZleHQzX3hhdHRyX3VzZXJfaGFuZGxlciwKKyNpZmRlZiBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wKKwlbRVhUM19YQVRUUl9JTkRFWF9QT1NJWF9BQ0xfQUNDRVNTXSAgPSAmZXh0M194YXR0cl9hY2xfYWNjZXNzX2hhbmRsZXIsCisJW0VYVDNfWEFUVFJfSU5ERVhfUE9TSVhfQUNMX0RFRkFVTFRdID0gJmV4dDNfeGF0dHJfYWNsX2RlZmF1bHRfaGFuZGxlciwKKyNlbmRpZgorCVtFWFQzX1hBVFRSX0lOREVYX1RSVVNURURdCSAgICAgPSAmZXh0M194YXR0cl90cnVzdGVkX2hhbmRsZXIsCisjaWZkZWYgQ09ORklHX0VYVDNfRlNfU0VDVVJJVFkKKwlbRVhUM19YQVRUUl9JTkRFWF9TRUNVUklUWV0JICAgICA9ICZleHQzX3hhdHRyX3NlY3VyaXR5X2hhbmRsZXIsCisjZW5kaWYKK307CisKK3N0cnVjdCB4YXR0cl9oYW5kbGVyICpleHQzX3hhdHRyX2hhbmRsZXJzW10gPSB7CisJJmV4dDNfeGF0dHJfdXNlcl9oYW5kbGVyLAorCSZleHQzX3hhdHRyX3RydXN0ZWRfaGFuZGxlciwKKyNpZmRlZiBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0wKKwkmZXh0M194YXR0cl9hY2xfYWNjZXNzX2hhbmRsZXIsCisJJmV4dDNfeGF0dHJfYWNsX2RlZmF1bHRfaGFuZGxlciwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZCisJJmV4dDNfeGF0dHJfc2VjdXJpdHlfaGFuZGxlciwKKyNlbmRpZgorCU5VTEwKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHhhdHRyX2hhbmRsZXIgKgorZXh0M194YXR0cl9oYW5kbGVyKGludCBuYW1lX2luZGV4KQoreworCXN0cnVjdCB4YXR0cl9oYW5kbGVyICpoYW5kbGVyID0gTlVMTDsKKworCWlmIChuYW1lX2luZGV4ID4gMCAmJiBuYW1lX2luZGV4IDwgQVJSQVlfU0laRShleHQzX3hhdHRyX2hhbmRsZXJfbWFwKSkKKwkJaGFuZGxlciA9IGV4dDNfeGF0dHJfaGFuZGxlcl9tYXBbbmFtZV9pbmRleF07CisJcmV0dXJuIGhhbmRsZXI7Cit9CisKKy8qCisgKiBJbm9kZSBvcGVyYXRpb24gbGlzdHhhdHRyKCkKKyAqCisgKiBkZW50cnktPmRfaW5vZGUtPmlfc2VtOiBkb24ndCBjYXJlCisgKi8KK3NzaXplX3QKK2V4dDNfbGlzdHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKwlyZXR1cm4gZXh0M194YXR0cl9saXN0KGRlbnRyeS0+ZF9pbm9kZSwgYnVmZmVyLCBzaXplKTsKK30KKworc3RhdGljIGludAorZXh0M194YXR0cl9jaGVja19uYW1lcyhzdHJ1Y3QgZXh0M194YXR0cl9lbnRyeSAqZW50cnksIHZvaWQgKmVuZCkKK3sKKwl3aGlsZSAoIUlTX0xBU1RfRU5UUlkoZW50cnkpKSB7CisJCXN0cnVjdCBleHQzX3hhdHRyX2VudHJ5ICpuZXh0ID0gRVhUM19YQVRUUl9ORVhUKGVudHJ5KTsKKwkJaWYgKCh2b2lkICopbmV4dCA+PSBlbmQpCisJCQlyZXR1cm4gLUVJTzsKKwkJZW50cnkgPSBuZXh0OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2V4dDNfeGF0dHJfY2hlY2tfYmxvY2soc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlpbnQgZXJyb3I7CisKKwlpZiAoQkhEUihiaCktPmhfbWFnaWMgIT0gY3B1X3RvX2xlMzIoRVhUM19YQVRUUl9NQUdJQykgfHwKKwkgICAgQkhEUihiaCktPmhfYmxvY2tzICE9IGNwdV90b19sZTMyKDEpKQorCQlyZXR1cm4gLUVJTzsKKwllcnJvciA9IGV4dDNfeGF0dHJfY2hlY2tfbmFtZXMoQkZJUlNUKGJoKSwgYmgtPmJfZGF0YSArIGJoLT5iX3NpemUpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2V4dDNfeGF0dHJfY2hlY2tfZW50cnkoc3RydWN0IGV4dDNfeGF0dHJfZW50cnkgKmVudHJ5LCBzaXplX3Qgc2l6ZSkKK3sKKwlzaXplX3QgdmFsdWVfc2l6ZSA9IGxlMzJfdG9fY3B1KGVudHJ5LT5lX3ZhbHVlX3NpemUpOworCisJaWYgKGVudHJ5LT5lX3ZhbHVlX2Jsb2NrICE9IDAgfHwgdmFsdWVfc2l6ZSA+IHNpemUgfHwKKwkgICAgbGUxNl90b19jcHUoZW50cnktPmVfdmFsdWVfb2ZmcykgKyB2YWx1ZV9zaXplID4gc2l6ZSkKKwkJcmV0dXJuIC1FSU87CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2V4dDNfeGF0dHJfZmluZF9lbnRyeShzdHJ1Y3QgZXh0M194YXR0cl9lbnRyeSAqKnBlbnRyeSwgaW50IG5hbWVfaW5kZXgsCisJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBzaXplLCBpbnQgc29ydGVkKQoreworCXN0cnVjdCBleHQzX3hhdHRyX2VudHJ5ICplbnRyeTsKKwlzaXplX3QgbmFtZV9sZW47CisJaW50IGNtcCA9IDE7CisKKwlpZiAobmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwluYW1lX2xlbiA9IHN0cmxlbihuYW1lKTsKKwllbnRyeSA9ICpwZW50cnk7CisJZm9yICg7ICFJU19MQVNUX0VOVFJZKGVudHJ5KTsgZW50cnkgPSBFWFQzX1hBVFRSX05FWFQoZW50cnkpKSB7CisJCWNtcCA9IG5hbWVfaW5kZXggLSBlbnRyeS0+ZV9uYW1lX2luZGV4OworCQlpZiAoIWNtcCkKKwkJCWNtcCA9IG5hbWVfbGVuIC0gZW50cnktPmVfbmFtZV9sZW47CisJCWlmICghY21wKQorCQkJY21wID0gbWVtY21wKG5hbWUsIGVudHJ5LT5lX25hbWUsIG5hbWVfbGVuKTsKKwkJaWYgKGNtcCA8PSAwICYmIChzb3J0ZWQgfHwgY21wID09IDApKQorCQkJYnJlYWs7CisJfQorCSpwZW50cnkgPSBlbnRyeTsKKwlpZiAoIWNtcCAmJiBleHQzX3hhdHRyX2NoZWNrX2VudHJ5KGVudHJ5LCBzaXplKSkKKwkJCXJldHVybiAtRUlPOworCXJldHVybiBjbXAgPyAtRU5PREFUQSA6IDA7Cit9CisKK2ludAorZXh0M194YXR0cl9ibG9ja19nZXQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5hbWVfaW5kZXgsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnVmZmVyX3NpemUpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJc3RydWN0IGV4dDNfeGF0dHJfZW50cnkgKmVudHJ5OworCXNpemVfdCBzaXplOworCWludCBlcnJvcjsKKworCWVhX2lkZWJ1Zyhpbm9kZSwgIm5hbWU9JWQuJXMsIGJ1ZmZlcj0lcCwgYnVmZmVyX3NpemU9JWxkIiwKKwkJICBuYW1lX2luZGV4LCBuYW1lLCBidWZmZXIsIChsb25nKWJ1ZmZlcl9zaXplKTsKKworCWVycm9yID0gLUVOT0RBVEE7CisJaWYgKCFFWFQzX0koaW5vZGUpLT5pX2ZpbGVfYWNsKQorCQlnb3RvIGNsZWFudXA7CisJZWFfaWRlYnVnKGlub2RlLCAicmVhZGluZyBibG9jayAlZCIsIEVYVDNfSShpbm9kZSktPmlfZmlsZV9hY2wpOworCWJoID0gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIEVYVDNfSShpbm9kZSktPmlfZmlsZV9hY2wpOworCWlmICghYmgpCisJCWdvdG8gY2xlYW51cDsKKwllYV9iZGVidWcoYmgsICJiX2NvdW50PSVkLCByZWZjb3VudD0lZCIsCisJCWF0b21pY19yZWFkKCYoYmgtPmJfY291bnQpKSwgbGUzMl90b19jcHUoQkhEUihiaCktPmhfcmVmY291bnQpKTsKKwlpZiAoZXh0M194YXR0cl9jaGVja19ibG9jayhiaCkpIHsKK2JhZF9ibG9jazoJZXh0M19lcnJvcihpbm9kZS0+aV9zYiwgX19GVU5DVElPTl9fLAorCQkJICAgImlub2RlICVsZDogYmFkIGJsb2NrICVkIiwgaW5vZGUtPmlfaW5vLAorCQkJICAgRVhUM19JKGlub2RlKS0+aV9maWxlX2FjbCk7CisJCWVycm9yID0gLUVJTzsKKwkJZ290byBjbGVhbnVwOworCX0KKwlleHQzX3hhdHRyX2NhY2hlX2luc2VydChiaCk7CisJZW50cnkgPSBCRklSU1QoYmgpOworCWVycm9yID0gZXh0M194YXR0cl9maW5kX2VudHJ5KCZlbnRyeSwgbmFtZV9pbmRleCwgbmFtZSwgYmgtPmJfc2l6ZSwgMSk7CisJaWYgKGVycm9yID09IC1FSU8pCisJCWdvdG8gYmFkX2Jsb2NrOworCWlmIChlcnJvcikKKwkJZ290byBjbGVhbnVwOworCXNpemUgPSBsZTMyX3RvX2NwdShlbnRyeS0+ZV92YWx1ZV9zaXplKTsKKwlpZiAoYnVmZmVyKSB7CisJCWVycm9yID0gLUVSQU5HRTsKKwkJaWYgKHNpemUgPiBidWZmZXJfc2l6ZSkKKwkJCWdvdG8gY2xlYW51cDsKKwkJbWVtY3B5KGJ1ZmZlciwgYmgtPmJfZGF0YSArIGxlMTZfdG9fY3B1KGVudHJ5LT5lX3ZhbHVlX29mZnMpLAorCQkgICAgICAgc2l6ZSk7CisJfQorCWVycm9yID0gc2l6ZTsKKworY2xlYW51cDoKKwlicmVsc2UoYmgpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludAorZXh0M194YXR0cl9pYm9keV9nZXQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5hbWVfaW5kZXgsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnVmZmVyX3NpemUpCit7CisJc3RydWN0IGV4dDNfeGF0dHJfaWJvZHlfaGVhZGVyICpoZWFkZXI7CisJc3RydWN0IGV4dDNfeGF0dHJfZW50cnkgKmVudHJ5OworCXN0cnVjdCBleHQzX2lub2RlICpyYXdfaW5vZGU7CisJc3RydWN0IGV4dDNfaWxvYyBpbG9jOworCXNpemVfdCBzaXplOworCXZvaWQgKmVuZDsKKwlpbnQgZXJyb3I7CisKKwlpZiAoIShFWFQzX0koaW5vZGUpLT5pX3N0YXRlICYgRVhUM19TVEFURV9YQVRUUikpCisJCXJldHVybiAtRU5PREFUQTsKKwllcnJvciA9IGV4dDNfZ2V0X2lub2RlX2xvYyhpbm9kZSwgJmlsb2MpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCXJhd19pbm9kZSA9IGV4dDNfcmF3X2lub2RlKCZpbG9jKTsKKwloZWFkZXIgPSBJSERSKGlub2RlLCByYXdfaW5vZGUpOworCWVudHJ5ID0gSUZJUlNUKGhlYWRlcik7CisJZW5kID0gKHZvaWQgKilyYXdfaW5vZGUgKyBFWFQzX1NCKGlub2RlLT5pX3NiKS0+c19pbm9kZV9zaXplOworCWVycm9yID0gZXh0M194YXR0cl9jaGVja19uYW1lcyhlbnRyeSwgZW5kKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gY2xlYW51cDsKKwllcnJvciA9IGV4dDNfeGF0dHJfZmluZF9lbnRyeSgmZW50cnksIG5hbWVfaW5kZXgsIG5hbWUsCisJCQkJICAgICAgZW5kIC0gKHZvaWQgKillbnRyeSwgMCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGNsZWFudXA7CisJc2l6ZSA9IGxlMzJfdG9fY3B1KGVudHJ5LT5lX3ZhbHVlX3NpemUpOworCWlmIChidWZmZXIpIHsKKwkJZXJyb3IgPSAtRVJBTkdFOworCQlpZiAoc2l6ZSA+IGJ1ZmZlcl9zaXplKQorCQkJZ290byBjbGVhbnVwOworCQltZW1jcHkoYnVmZmVyLCAodm9pZCAqKUlGSVJTVChoZWFkZXIpICsKKwkJICAgICAgIGxlMTZfdG9fY3B1KGVudHJ5LT5lX3ZhbHVlX29mZnMpLCBzaXplKTsKKwl9CisJZXJyb3IgPSBzaXplOworCitjbGVhbnVwOgorCWJyZWxzZShpbG9jLmJoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBleHQzX3hhdHRyX2dldCgpCisgKgorICogQ29weSBhbiBleHRlbmRlZCBhdHRyaWJ1dGUgaW50byB0aGUgYnVmZmVyCisgKiBwcm92aWRlZCwgb3IgY29tcHV0ZSB0aGUgYnVmZmVyIHNpemUgcmVxdWlyZWQuCisgKiBCdWZmZXIgaXMgTlVMTCB0byBjb21wdXRlIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgcmVxdWlyZWQuCisgKgorICogUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIG51bWJlciBvbiBmYWlsdXJlLCBvciB0aGUgbnVtYmVyIG9mIGJ5dGVzCisgKiB1c2VkIC8gcmVxdWlyZWQgb24gc3VjY2Vzcy4KKyAqLworaW50CitleHQzX3hhdHRyX2dldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbmFtZV9pbmRleCwgY29uc3QgY2hhciAqbmFtZSwKKwkgICAgICAgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnVmZmVyX3NpemUpCit7CisJaW50IGVycm9yOworCisJZG93bl9yZWFkKCZFWFQzX0koaW5vZGUpLT54YXR0cl9zZW0pOworCWVycm9yID0gZXh0M194YXR0cl9pYm9keV9nZXQoaW5vZGUsIG5hbWVfaW5kZXgsIG5hbWUsIGJ1ZmZlciwKKwkJCQkgICAgIGJ1ZmZlcl9zaXplKTsKKwlpZiAoZXJyb3IgPT0gLUVOT0RBVEEpCisJCWVycm9yID0gZXh0M194YXR0cl9ibG9ja19nZXQoaW5vZGUsIG5hbWVfaW5kZXgsIG5hbWUsIGJ1ZmZlciwKKwkJCQkJICAgICBidWZmZXJfc2l6ZSk7CisJdXBfcmVhZCgmRVhUM19JKGlub2RlKS0+eGF0dHJfc2VtKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQKK2V4dDNfeGF0dHJfbGlzdF9lbnRyaWVzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQzX3hhdHRyX2VudHJ5ICplbnRyeSwKKwkJCWNoYXIgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9zaXplKQoreworCXNpemVfdCByZXN0ID0gYnVmZmVyX3NpemU7CisKKwlmb3IgKDsgIUlTX0xBU1RfRU5UUlkoZW50cnkpOyBlbnRyeSA9IEVYVDNfWEFUVFJfTkVYVChlbnRyeSkpIHsKKwkJc3RydWN0IHhhdHRyX2hhbmRsZXIgKmhhbmRsZXIgPQorCQkJZXh0M194YXR0cl9oYW5kbGVyKGVudHJ5LT5lX25hbWVfaW5kZXgpOworCisJCWlmIChoYW5kbGVyKSB7CisJCQlzaXplX3Qgc2l6ZSA9IGhhbmRsZXItPmxpc3QoaW5vZGUsIGJ1ZmZlciwgcmVzdCwKKwkJCQkJCSAgICBlbnRyeS0+ZV9uYW1lLAorCQkJCQkJICAgIGVudHJ5LT5lX25hbWVfbGVuKTsKKwkJCWlmIChidWZmZXIpIHsKKwkJCQlpZiAoc2l6ZSA+IHJlc3QpCisJCQkJCXJldHVybiAtRVJBTkdFOworCQkJCWJ1ZmZlciArPSBzaXplOworCQkJfQorCQkJcmVzdCAtPSBzaXplOworCQl9CisJfQorCXJldHVybiBidWZmZXJfc2l6ZSAtIHJlc3Q7Cit9CisKK2ludAorZXh0M194YXR0cl9ibG9ja19saXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9zaXplKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCWludCBlcnJvcjsKKworCWVhX2lkZWJ1Zyhpbm9kZSwgImJ1ZmZlcj0lcCwgYnVmZmVyX3NpemU9JWxkIiwKKwkJICBidWZmZXIsIChsb25nKWJ1ZmZlcl9zaXplKTsKKworCWVycm9yID0gMDsKKwlpZiAoIUVYVDNfSShpbm9kZSktPmlfZmlsZV9hY2wpCisJCWdvdG8gY2xlYW51cDsKKwllYV9pZGVidWcoaW5vZGUsICJyZWFkaW5nIGJsb2NrICVkIiwgRVhUM19JKGlub2RlKS0+aV9maWxlX2FjbCk7CisJYmggPSBzYl9icmVhZChpbm9kZS0+aV9zYiwgRVhUM19JKGlub2RlKS0+aV9maWxlX2FjbCk7CisJZXJyb3IgPSAtRUlPOworCWlmICghYmgpCisJCWdvdG8gY2xlYW51cDsKKwllYV9iZGVidWcoYmgsICJiX2NvdW50PSVkLCByZWZjb3VudD0lZCIsCisJCWF0b21pY19yZWFkKCYoYmgtPmJfY291bnQpKSwgbGUzMl90b19jcHUoQkhEUihiaCktPmhfcmVmY291bnQpKTsKKwlpZiAoZXh0M194YXR0cl9jaGVja19ibG9jayhiaCkpIHsKKwkJZXh0M19lcnJvcihpbm9kZS0+aV9zYiwgX19GVU5DVElPTl9fLAorCQkJICAgImlub2RlICVsZDogYmFkIGJsb2NrICVkIiwgaW5vZGUtPmlfaW5vLAorCQkJICAgRVhUM19JKGlub2RlKS0+aV9maWxlX2FjbCk7CisJCWVycm9yID0gLUVJTzsKKwkJZ290byBjbGVhbnVwOworCX0KKwlleHQzX3hhdHRyX2NhY2hlX2luc2VydChiaCk7CisJZXJyb3IgPSBleHQzX3hhdHRyX2xpc3RfZW50cmllcyhpbm9kZSwgQkZJUlNUKGJoKSwgYnVmZmVyLCBidWZmZXJfc2l6ZSk7CisKK2NsZWFudXA6CisJYnJlbHNlKGJoKTsKKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludAorZXh0M194YXR0cl9pYm9keV9saXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9zaXplKQoreworCXN0cnVjdCBleHQzX3hhdHRyX2lib2R5X2hlYWRlciAqaGVhZGVyOworCXN0cnVjdCBleHQzX2lub2RlICpyYXdfaW5vZGU7CisJc3RydWN0IGV4dDNfaWxvYyBpbG9jOworCXZvaWQgKmVuZDsKKwlpbnQgZXJyb3I7CisKKwlpZiAoIShFWFQzX0koaW5vZGUpLT5pX3N0YXRlICYgRVhUM19TVEFURV9YQVRUUikpCisJCXJldHVybiAwOworCWVycm9yID0gZXh0M19nZXRfaW5vZGVfbG9jKGlub2RlLCAmaWxvYyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJcmF3X2lub2RlID0gZXh0M19yYXdfaW5vZGUoJmlsb2MpOworCWhlYWRlciA9IElIRFIoaW5vZGUsIHJhd19pbm9kZSk7CisJZW5kID0gKHZvaWQgKilyYXdfaW5vZGUgKyBFWFQzX1NCKGlub2RlLT5pX3NiKS0+c19pbm9kZV9zaXplOworCWVycm9yID0gZXh0M194YXR0cl9jaGVja19uYW1lcyhJRklSU1QoaGVhZGVyKSwgZW5kKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gY2xlYW51cDsKKwllcnJvciA9IGV4dDNfeGF0dHJfbGlzdF9lbnRyaWVzKGlub2RlLCBJRklSU1QoaGVhZGVyKSwKKwkJCQkJYnVmZmVyLCBidWZmZXJfc2l6ZSk7CisKK2NsZWFudXA6CisJYnJlbHNlKGlsb2MuYmgpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIGV4dDNfeGF0dHJfbGlzdCgpCisgKgorICogQ29weSBhIGxpc3Qgb2YgYXR0cmlidXRlIG5hbWVzIGludG8gdGhlIGJ1ZmZlcgorICogcHJvdmlkZWQsIG9yIGNvbXB1dGUgdGhlIGJ1ZmZlciBzaXplIHJlcXVpcmVkLgorICogQnVmZmVyIGlzIE5VTEwgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHJlcXVpcmVkLgorICoKKyAqIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIgb24gZmFpbHVyZSwgb3IgdGhlIG51bWJlciBvZiBieXRlcworICogdXNlZCAvIHJlcXVpcmVkIG9uIHN1Y2Nlc3MuCisgKi8KK2ludAorZXh0M194YXR0cl9saXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9zaXplKQoreworCWludCBpX2Vycm9yLCBiX2Vycm9yOworCisJZG93bl9yZWFkKCZFWFQzX0koaW5vZGUpLT54YXR0cl9zZW0pOworCWlfZXJyb3IgPSBleHQzX3hhdHRyX2lib2R5X2xpc3QoaW5vZGUsIGJ1ZmZlciwgYnVmZmVyX3NpemUpOworCWlmIChpX2Vycm9yIDwgMCkgeworCQliX2Vycm9yID0gMDsKKwl9IGVsc2UgeworCQlpZiAoYnVmZmVyKSB7CisJCQlidWZmZXIgKz0gaV9lcnJvcjsKKwkJCWJ1ZmZlcl9zaXplIC09IGlfZXJyb3I7CisJCX0KKwkJYl9lcnJvciA9IGV4dDNfeGF0dHJfYmxvY2tfbGlzdChpbm9kZSwgYnVmZmVyLCBidWZmZXJfc2l6ZSk7CisJCWlmIChiX2Vycm9yIDwgMCkKKwkJCWlfZXJyb3IgPSAwOworCX0KKwl1cF9yZWFkKCZFWFQzX0koaW5vZGUpLT54YXR0cl9zZW0pOworCXJldHVybiBpX2Vycm9yICsgYl9lcnJvcjsKK30KKworLyoKKyAqIElmIHRoZSBFWFQzX0ZFQVRVUkVfQ09NUEFUX0VYVF9BVFRSIGZlYXR1cmUgb2YgdGhpcyBmaWxlIHN5c3RlbSBpcworICogbm90IHNldCwgc2V0IGl0LgorICovCitzdGF0aWMgdm9pZCBleHQzX3hhdHRyX3VwZGF0ZV9zdXBlcl9ibG9jayhoYW5kbGVfdCAqaGFuZGxlLAorCQkJCQkgIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJaWYgKEVYVDNfSEFTX0NPTVBBVF9GRUFUVVJFKHNiLCBFWFQzX0ZFQVRVUkVfQ09NUEFUX0VYVF9BVFRSKSkKKwkJcmV0dXJuOworCisJbG9ja19zdXBlcihzYik7CisJaWYgKGV4dDNfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgRVhUM19TQihzYiktPnNfc2JoKSA9PSAwKSB7CisJCUVYVDNfU0Ioc2IpLT5zX2VzLT5zX2ZlYXR1cmVfY29tcGF0IHw9CisJCQljcHVfdG9fbGUzMihFWFQzX0ZFQVRVUkVfQ09NUEFUX0VYVF9BVFRSKTsKKwkJc2ItPnNfZGlydCA9IDE7CisJCWV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIEVYVDNfU0Ioc2IpLT5zX3NiaCk7CisJfQorCXVubG9ja19zdXBlcihzYik7Cit9CisKKy8qCisgKiBSZWxlYXNlIHRoZSB4YXR0ciBibG9jayBCSDogSWYgdGhlIHJlZmVyZW5jZSBjb3VudCBpcyA+IDEsIGRlY3JlbWVudAorICogaXQ7IG90aGVyd2lzZSBmcmVlIHRoZSBibG9jay4KKyAqLworc3RhdGljIHZvaWQKK2V4dDNfeGF0dHJfcmVsZWFzZV9ibG9jayhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJc3RydWN0IG1iX2NhY2hlX2VudHJ5ICpjZSA9IE5VTEw7CisKKwljZSA9IG1iX2NhY2hlX2VudHJ5X2dldChleHQzX3hhdHRyX2NhY2hlLCBiaC0+Yl9iZGV2LCBiaC0+Yl9ibG9ja25yKTsKKwlpZiAoQkhEUihiaCktPmhfcmVmY291bnQgPT0gY3B1X3RvX2xlMzIoMSkpIHsKKwkJZWFfYmRlYnVnKGJoLCAicmVmY291bnQgbm93PTA7IGZyZWVpbmciKTsKKwkJaWYgKGNlKQorCQkJbWJfY2FjaGVfZW50cnlfZnJlZShjZSk7CisJCWV4dDNfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgYmgtPmJfYmxvY2tuciwgMSk7CisJCWdldF9iaChiaCk7CisJCWV4dDNfZm9yZ2V0KGhhbmRsZSwgMSwgaW5vZGUsIGJoLCBiaC0+Yl9ibG9ja25yKTsKKwl9IGVsc2UgeworCQlpZiAoZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBiaCkgPT0gMCkgeworCQkJbG9ja19idWZmZXIoYmgpOworCQkJQkhEUihiaCktPmhfcmVmY291bnQgPSBjcHVfdG9fbGUzMigKKwkJCQlsZTMyX3RvX2NwdShCSERSKGJoKS0+aF9yZWZjb3VudCkgLSAxKTsKKwkJCWV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGJoKTsKKwkJCWlmIChJU19TWU5DKGlub2RlKSkKKwkJCQloYW5kbGUtPmhfc3luYyA9IDE7CisJCQlEUVVPVF9GUkVFX0JMT0NLKGlub2RlLCAxKTsKKwkJCXVubG9ja19idWZmZXIoYmgpOworCQkJZWFfYmRlYnVnKGJoLCAicmVmY291bnQgbm93PSVkOyByZWxlYXNpbmciLAorCQkJCSAgbGUzMl90b19jcHUoQkhEUihiaCktPmhfcmVmY291bnQpKTsKKwkJfQorCQlpZiAoY2UpCisJCQltYl9jYWNoZV9lbnRyeV9yZWxlYXNlKGNlKTsKKwl9Cit9CisKK3N0cnVjdCBleHQzX3hhdHRyX2luZm8geworCWludCBuYW1lX2luZGV4OworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3Qgdm9pZCAqdmFsdWU7CisJc2l6ZV90IHZhbHVlX2xlbjsKK307CisKK3N0cnVjdCBleHQzX3hhdHRyX3NlYXJjaCB7CisJc3RydWN0IGV4dDNfeGF0dHJfZW50cnkgKmZpcnN0OworCXZvaWQgKmJhc2U7CisJdm9pZCAqZW5kOworCXN0cnVjdCBleHQzX3hhdHRyX2VudHJ5ICpoZXJlOworCWludCBub3RfZm91bmQ7Cit9OworCitzdGF0aWMgaW50CitleHQzX3hhdHRyX3NldF9lbnRyeShzdHJ1Y3QgZXh0M194YXR0cl9pbmZvICppLCBzdHJ1Y3QgZXh0M194YXR0cl9zZWFyY2ggKnMpCit7CisJc3RydWN0IGV4dDNfeGF0dHJfZW50cnkgKmxhc3Q7CisJc2l6ZV90IGZyZWUsIG1pbl9vZmZzID0gcy0+ZW5kIC0gcy0+YmFzZSwgbmFtZV9sZW4gPSBzdHJsZW4oaS0+bmFtZSk7CisKKwkvKiBDb21wdXRlIG1pbl9vZmZzIGFuZCBsYXN0LiAqLworCWxhc3QgPSBzLT5maXJzdDsKKwlmb3IgKDsgIUlTX0xBU1RfRU5UUlkobGFzdCk7IGxhc3QgPSBFWFQzX1hBVFRSX05FWFQobGFzdCkpIHsKKwkJaWYgKCFsYXN0LT5lX3ZhbHVlX2Jsb2NrICYmIGxhc3QtPmVfdmFsdWVfc2l6ZSkgeworCQkJc2l6ZV90IG9mZnMgPSBsZTE2X3RvX2NwdShsYXN0LT5lX3ZhbHVlX29mZnMpOworCQkJaWYgKG9mZnMgPCBtaW5fb2ZmcykKKwkJCQltaW5fb2ZmcyA9IG9mZnM7CisJCX0KKwl9CisJZnJlZSA9IG1pbl9vZmZzIC0gKCh2b2lkICopbGFzdCAtIHMtPmJhc2UpIC0gc2l6ZW9mKF9fdTMyKTsKKwlpZiAoIXMtPm5vdF9mb3VuZCkgeworCQlpZiAoIXMtPmhlcmUtPmVfdmFsdWVfYmxvY2sgJiYgcy0+aGVyZS0+ZV92YWx1ZV9zaXplKSB7CisJCQlzaXplX3Qgc2l6ZSA9IGxlMzJfdG9fY3B1KHMtPmhlcmUtPmVfdmFsdWVfc2l6ZSk7CisJCQlmcmVlICs9IEVYVDNfWEFUVFJfU0laRShzaXplKTsKKwkJfQorCQlmcmVlICs9IEVYVDNfWEFUVFJfTEVOKG5hbWVfbGVuKTsKKwl9CisJaWYgKGktPnZhbHVlKSB7CisJCWlmIChmcmVlIDwgRVhUM19YQVRUUl9TSVpFKGktPnZhbHVlX2xlbikgfHwKKwkJICAgIGZyZWUgPCBFWFQzX1hBVFRSX0xFTihuYW1lX2xlbikgKworCQkJICAgRVhUM19YQVRUUl9TSVpFKGktPnZhbHVlX2xlbikpCisJCQlyZXR1cm4gLUVOT1NQQzsKKwl9CisKKwlpZiAoaS0+dmFsdWUgJiYgcy0+bm90X2ZvdW5kKSB7CisJCS8qIEluc2VydCB0aGUgbmV3IG5hbWUuICovCisJCXNpemVfdCBzaXplID0gRVhUM19YQVRUUl9MRU4obmFtZV9sZW4pOworCQlzaXplX3QgcmVzdCA9ICh2b2lkICopbGFzdCAtICh2b2lkICopcy0+aGVyZSArIHNpemVvZihfX3UzMik7CisJCW1lbW1vdmUoKHZvaWQgKilzLT5oZXJlICsgc2l6ZSwgcy0+aGVyZSwgcmVzdCk7CisJCW1lbXNldChzLT5oZXJlLCAwLCBzaXplKTsKKwkJcy0+aGVyZS0+ZV9uYW1lX2luZGV4ID0gaS0+bmFtZV9pbmRleDsKKwkJcy0+aGVyZS0+ZV9uYW1lX2xlbiA9IG5hbWVfbGVuOworCQltZW1jcHkocy0+aGVyZS0+ZV9uYW1lLCBpLT5uYW1lLCBuYW1lX2xlbik7CisJfSBlbHNlIHsKKwkJaWYgKCFzLT5oZXJlLT5lX3ZhbHVlX2Jsb2NrICYmIHMtPmhlcmUtPmVfdmFsdWVfc2l6ZSkgeworCQkJdm9pZCAqZmlyc3RfdmFsID0gcy0+YmFzZSArIG1pbl9vZmZzOworCQkJc2l6ZV90IG9mZnMgPSBsZTE2X3RvX2NwdShzLT5oZXJlLT5lX3ZhbHVlX29mZnMpOworCQkJdm9pZCAqdmFsID0gcy0+YmFzZSArIG9mZnM7CisJCQlzaXplX3Qgc2l6ZSA9IEVYVDNfWEFUVFJfU0laRSgKKwkJCQlsZTMyX3RvX2NwdShzLT5oZXJlLT5lX3ZhbHVlX3NpemUpKTsKKworCQkJaWYgKGktPnZhbHVlICYmIHNpemUgPT0gRVhUM19YQVRUUl9TSVpFKGktPnZhbHVlX2xlbikpIHsKKwkJCQkvKiBUaGUgb2xkIGFuZCB0aGUgbmV3IHZhbHVlIGhhdmUgdGhlIHNhbWUKKwkJCQkgICBzaXplLiBKdXN0IHJlcGxhY2UuICovCisJCQkJcy0+aGVyZS0+ZV92YWx1ZV9zaXplID0KKwkJCQkJY3B1X3RvX2xlMzIoaS0+dmFsdWVfbGVuKTsKKwkJCQltZW1zZXQodmFsICsgc2l6ZSAtIEVYVDNfWEFUVFJfUEFELCAwLAorCQkJCSAgICAgICBFWFQzX1hBVFRSX1BBRCk7IC8qIENsZWFyIHBhZCBieXRlcy4gKi8KKwkJCQltZW1jcHkodmFsLCBpLT52YWx1ZSwgaS0+dmFsdWVfbGVuKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJLyogUmVtb3ZlIHRoZSBvbGQgdmFsdWUuICovCisJCQltZW1tb3ZlKGZpcnN0X3ZhbCArIHNpemUsIGZpcnN0X3ZhbCwgdmFsIC0gZmlyc3RfdmFsKTsKKwkJCW1lbXNldChmaXJzdF92YWwsIDAsIHNpemUpOworCQkJcy0+aGVyZS0+ZV92YWx1ZV9zaXplID0gMDsKKwkJCXMtPmhlcmUtPmVfdmFsdWVfb2ZmcyA9IDA7CisJCQltaW5fb2ZmcyArPSBzaXplOworCisJCQkvKiBBZGp1c3QgYWxsIHZhbHVlIG9mZnNldHMuICovCisJCQlsYXN0ID0gcy0+Zmlyc3Q7CisJCQl3aGlsZSAoIUlTX0xBU1RfRU5UUlkobGFzdCkpIHsKKwkJCQlzaXplX3QgbyA9IGxlMTZfdG9fY3B1KGxhc3QtPmVfdmFsdWVfb2Zmcyk7CisJCQkJaWYgKCFsYXN0LT5lX3ZhbHVlX2Jsb2NrICYmCisJCQkJICAgIGxhc3QtPmVfdmFsdWVfc2l6ZSAmJiBvIDwgb2ZmcykKKwkJCQkJbGFzdC0+ZV92YWx1ZV9vZmZzID0KKwkJCQkJCWNwdV90b19sZTE2KG8gKyBzaXplKTsKKwkJCQlsYXN0ID0gRVhUM19YQVRUUl9ORVhUKGxhc3QpOworCQkJfQorCQl9CisJCWlmICghaS0+dmFsdWUpIHsKKwkJCS8qIFJlbW92ZSB0aGUgb2xkIG5hbWUuICovCisJCQlzaXplX3Qgc2l6ZSA9IEVYVDNfWEFUVFJfTEVOKG5hbWVfbGVuKTsKKwkJCWxhc3QgPSBFTlRSWSgodm9pZCAqKWxhc3QgLSBzaXplKTsKKwkJCW1lbW1vdmUocy0+aGVyZSwgKHZvaWQgKilzLT5oZXJlICsgc2l6ZSwKKwkJCQkodm9pZCAqKWxhc3QgLSAodm9pZCAqKXMtPmhlcmUgKyBzaXplb2YoX191MzIpKTsKKwkJCW1lbXNldChsYXN0LCAwLCBzaXplKTsKKwkJfQorCX0KKworCWlmIChpLT52YWx1ZSkgeworCQkvKiBJbnNlcnQgdGhlIG5ldyB2YWx1ZS4gKi8KKwkJcy0+aGVyZS0+ZV92YWx1ZV9zaXplID0gY3B1X3RvX2xlMzIoaS0+dmFsdWVfbGVuKTsKKwkJaWYgKGktPnZhbHVlX2xlbikgeworCQkJc2l6ZV90IHNpemUgPSBFWFQzX1hBVFRSX1NJWkUoaS0+dmFsdWVfbGVuKTsKKwkJCXZvaWQgKnZhbCA9IHMtPmJhc2UgKyBtaW5fb2ZmcyAtIHNpemU7CisJCQlzLT5oZXJlLT5lX3ZhbHVlX29mZnMgPSBjcHVfdG9fbGUxNihtaW5fb2ZmcyAtIHNpemUpOworCQkJbWVtc2V0KHZhbCArIHNpemUgLSBFWFQzX1hBVFRSX1BBRCwgMCwKKwkJCSAgICAgICBFWFQzX1hBVFRSX1BBRCk7IC8qIENsZWFyIHRoZSBwYWQgYnl0ZXMuICovCisJCQltZW1jcHkodmFsLCBpLT52YWx1ZSwgaS0+dmFsdWVfbGVuKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGV4dDNfeGF0dHJfYmxvY2tfZmluZCB7CisJc3RydWN0IGV4dDNfeGF0dHJfc2VhcmNoIHM7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKK307CisKK2ludAorZXh0M194YXR0cl9ibG9ja19maW5kKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQzX3hhdHRyX2luZm8gKmksCisJCSAgICAgIHN0cnVjdCBleHQzX3hhdHRyX2Jsb2NrX2ZpbmQgKmJzKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlpbnQgZXJyb3I7CisKKwllYV9pZGVidWcoaW5vZGUsICJuYW1lPSVkLiVzLCB2YWx1ZT0lcCwgdmFsdWVfbGVuPSVsZCIsCisJCSAgaS0+bmFtZV9pbmRleCwgaS0+bmFtZSwgaS0+dmFsdWUsIChsb25nKWktPnZhbHVlX2xlbik7CisKKwlpZiAoRVhUM19JKGlub2RlKS0+aV9maWxlX2FjbCkgeworCQkvKiBUaGUgaW5vZGUgYWxyZWFkeSBoYXMgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIGJsb2NrLiAqLworCQlicy0+YmggPSBzYl9icmVhZChzYiwgRVhUM19JKGlub2RlKS0+aV9maWxlX2FjbCk7CisJCWVycm9yID0gLUVJTzsKKwkJaWYgKCFicy0+YmgpCisJCQlnb3RvIGNsZWFudXA7CisJCWVhX2JkZWJ1Zyhicy0+YmgsICJiX2NvdW50PSVkLCByZWZjb3VudD0lZCIsCisJCQlhdG9taWNfcmVhZCgmKGJzLT5iaC0+Yl9jb3VudCkpLAorCQkJbGUzMl90b19jcHUoQkhEUihicy0+YmgpLT5oX3JlZmNvdW50KSk7CisJCWlmIChleHQzX3hhdHRyX2NoZWNrX2Jsb2NrKGJzLT5iaCkpIHsKKwkJCWV4dDNfZXJyb3Ioc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkiaW5vZGUgJWxkOiBiYWQgYmxvY2sgJWQiLCBpbm9kZS0+aV9pbm8sCisJCQkJRVhUM19JKGlub2RlKS0+aV9maWxlX2FjbCk7CisJCQllcnJvciA9IC1FSU87CisJCQlnb3RvIGNsZWFudXA7CisJCX0KKwkJLyogRmluZCB0aGUgbmFtZWQgYXR0cmlidXRlLiAqLworCQlicy0+cy5iYXNlID0gQkhEUihicy0+YmgpOworCQlicy0+cy5maXJzdCA9IEJGSVJTVChicy0+YmgpOworCQlicy0+cy5lbmQgPSBicy0+YmgtPmJfZGF0YSArIGJzLT5iaC0+Yl9zaXplOworCQlicy0+cy5oZXJlID0gYnMtPnMuZmlyc3Q7CisJCWVycm9yID0gZXh0M194YXR0cl9maW5kX2VudHJ5KCZicy0+cy5oZXJlLCBpLT5uYW1lX2luZGV4LAorCQkJCQkgICAgICBpLT5uYW1lLCBicy0+YmgtPmJfc2l6ZSwgMSk7CisJCWlmIChlcnJvciAmJiBlcnJvciAhPSAtRU5PREFUQSkKKwkJCWdvdG8gY2xlYW51cDsKKwkJYnMtPnMubm90X2ZvdW5kID0gZXJyb3I7CisJfQorCWVycm9yID0gMDsKKworY2xlYW51cDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQKK2V4dDNfeGF0dHJfYmxvY2tfc2V0KGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCSAgICAgc3RydWN0IGV4dDNfeGF0dHJfaW5mbyAqaSwKKwkJICAgICBzdHJ1Y3QgZXh0M194YXR0cl9ibG9ja19maW5kICpicykKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpuZXdfYmggPSBOVUxMOworCXN0cnVjdCBleHQzX3hhdHRyX3NlYXJjaCAqcyA9ICZicy0+czsKKwlzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKmNlID0gTlVMTDsKKwlpbnQgZXJyb3I7CisKKyNkZWZpbmUgaGVhZGVyKHgpICgoc3RydWN0IGV4dDNfeGF0dHJfaGVhZGVyICopKHgpKQorCisJaWYgKGktPnZhbHVlICYmIGktPnZhbHVlX2xlbiA+IHNiLT5zX2Jsb2Nrc2l6ZSkKKwkJcmV0dXJuIC1FTk9TUEM7CisJaWYgKHMtPmJhc2UpIHsKKwkJY2UgPSBtYl9jYWNoZV9lbnRyeV9nZXQoZXh0M194YXR0cl9jYWNoZSwgYnMtPmJoLT5iX2JkZXYsCisJCQkJCWJzLT5iaC0+Yl9ibG9ja25yKTsKKwkJaWYgKGhlYWRlcihzLT5iYXNlKS0+aF9yZWZjb3VudCA9PSBjcHVfdG9fbGUzMigxKSkgeworCQkJaWYgKGNlKSB7CisJCQkJbWJfY2FjaGVfZW50cnlfZnJlZShjZSk7CisJCQkJY2UgPSBOVUxMOworCQkJfQorCQkJZWFfYmRlYnVnKGJzLT5iaCwgIm1vZGlmeWluZyBpbi1wbGFjZSIpOworCQkJZXJyb3IgPSBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJzLT5iaCk7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBjbGVhbnVwOworCQkJbG9ja19idWZmZXIoYnMtPmJoKTsKKwkJCWVycm9yID0gZXh0M194YXR0cl9zZXRfZW50cnkoaSwgcyk7CisJCQlpZiAoIWVycm9yKSB7CisJCQkJaWYgKCFJU19MQVNUX0VOVFJZKHMtPmZpcnN0KSkKKwkJCQkJZXh0M194YXR0cl9yZWhhc2goaGVhZGVyKHMtPmJhc2UpLAorCQkJCQkJCSAgcy0+aGVyZSk7CisJCQkJZXh0M194YXR0cl9jYWNoZV9pbnNlcnQoYnMtPmJoKTsKKwkJCX0KKwkJCXVubG9ja19idWZmZXIoYnMtPmJoKTsKKwkJCWlmIChlcnJvciA9PSAtRUlPKQorCQkJCWdvdG8gYmFkX2Jsb2NrOworCQkJaWYgKCFlcnJvcikKKwkJCQllcnJvciA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsCisJCQkJCQkJCSAgICBicy0+YmgpOworCQkJaWYgKGVycm9yKQorCQkJCWdvdG8gY2xlYW51cDsKKwkJCWdvdG8gaW5zZXJ0ZWQ7CisJCX0gZWxzZSB7CisJCQlpbnQgb2Zmc2V0ID0gKGNoYXIgKilzLT5oZXJlIC0gYnMtPmJoLT5iX2RhdGE7CisKKwkJCWlmIChjZSkgeworCQkJCW1iX2NhY2hlX2VudHJ5X3JlbGVhc2UoY2UpOworCQkJCWNlID0gTlVMTDsKKwkJCX0KKwkJCWVhX2JkZWJ1Zyhicy0+YmgsICJjbG9uaW5nIik7CisJCQlzLT5iYXNlID0ga21hbGxvYyhicy0+YmgtPmJfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCQllcnJvciA9IC1FTk9NRU07CisJCQlpZiAocy0+YmFzZSA9PSBOVUxMKQorCQkJCWdvdG8gY2xlYW51cDsKKwkJCW1lbWNweShzLT5iYXNlLCBCSERSKGJzLT5iaCksIGJzLT5iaC0+Yl9zaXplKTsKKwkJCXMtPmZpcnN0ID0gRU5UUlkoaGVhZGVyKHMtPmJhc2UpKzEpOworCQkJaGVhZGVyKHMtPmJhc2UpLT5oX3JlZmNvdW50ID0gY3B1X3RvX2xlMzIoMSk7CisJCQlzLT5oZXJlID0gRU5UUlkocy0+YmFzZSArIG9mZnNldCk7CisJCQlzLT5lbmQgPSBzLT5iYXNlICsgYnMtPmJoLT5iX3NpemU7CisJCX0KKwl9IGVsc2UgeworCQkvKiBBbGxvY2F0ZSBhIGJ1ZmZlciB3aGVyZSB3ZSBjb25zdHJ1Y3QgdGhlIG5ldyBibG9jay4gKi8KKwkJcy0+YmFzZSA9IGttYWxsb2Moc2ItPnNfYmxvY2tzaXplLCBHRlBfS0VSTkVMKTsKKwkJLyogYXNzZXJ0KGhlYWRlciA9PSBzLT5iYXNlKSAqLworCQllcnJvciA9IC1FTk9NRU07CisJCWlmIChzLT5iYXNlID09IE5VTEwpCisJCQlnb3RvIGNsZWFudXA7CisJCW1lbXNldChzLT5iYXNlLCAwLCBzYi0+c19ibG9ja3NpemUpOworCQloZWFkZXIocy0+YmFzZSktPmhfbWFnaWMgPSBjcHVfdG9fbGUzMihFWFQzX1hBVFRSX01BR0lDKTsKKwkJaGVhZGVyKHMtPmJhc2UpLT5oX2Jsb2NrcyA9IGNwdV90b19sZTMyKDEpOworCQloZWFkZXIocy0+YmFzZSktPmhfcmVmY291bnQgPSBjcHVfdG9fbGUzMigxKTsKKwkJcy0+Zmlyc3QgPSBFTlRSWShoZWFkZXIocy0+YmFzZSkrMSk7CisJCXMtPmhlcmUgPSBFTlRSWShoZWFkZXIocy0+YmFzZSkrMSk7CisJCXMtPmVuZCA9IHMtPmJhc2UgKyBzYi0+c19ibG9ja3NpemU7CisJfQorCisJZXJyb3IgPSBleHQzX3hhdHRyX3NldF9lbnRyeShpLCBzKTsKKwlpZiAoZXJyb3IgPT0gLUVJTykKKwkJZ290byBiYWRfYmxvY2s7CisJaWYgKGVycm9yKQorCQlnb3RvIGNsZWFudXA7CisJaWYgKCFJU19MQVNUX0VOVFJZKHMtPmZpcnN0KSkKKwkJZXh0M194YXR0cl9yZWhhc2goaGVhZGVyKHMtPmJhc2UpLCBzLT5oZXJlKTsKKworaW5zZXJ0ZWQ6CisJaWYgKCFJU19MQVNUX0VOVFJZKHMtPmZpcnN0KSkgeworCQluZXdfYmggPSBleHQzX3hhdHRyX2NhY2hlX2ZpbmQoaW5vZGUsIGhlYWRlcihzLT5iYXNlKSwgJmNlKTsKKwkJaWYgKG5ld19iaCkgeworCQkJLyogV2UgZm91bmQgYW4gaWRlbnRpY2FsIGJsb2NrIGluIHRoZSBjYWNoZS4gKi8KKwkJCWlmIChuZXdfYmggPT0gYnMtPmJoKQorCQkJCWVhX2JkZWJ1ZyhuZXdfYmgsICJrZWVwaW5nIik7CisJCQllbHNlIHsKKwkJCQkvKiBUaGUgb2xkIGJsb2NrIGlzIHJlbGVhc2VkIGFmdGVyIHVwZGF0aW5nCisJCQkJICAgdGhlIGlub2RlLiAqLworCQkJCWVycm9yID0gLUVEUVVPVDsKKwkJCQlpZiAoRFFVT1RfQUxMT0NfQkxPQ0soaW5vZGUsIDEpKQorCQkJCQlnb3RvIGNsZWFudXA7CisJCQkJZXJyb3IgPSBleHQzX2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsCisJCQkJCQkJCSAgICAgIG5ld19iaCk7CisJCQkJaWYgKGVycm9yKQorCQkJCQlnb3RvIGNsZWFudXBfZHF1b3Q7CisJCQkJbG9ja19idWZmZXIobmV3X2JoKTsKKwkJCQlCSERSKG5ld19iaCktPmhfcmVmY291bnQgPSBjcHVfdG9fbGUzMigxICsKKwkJCQkJbGUzMl90b19jcHUoQkhEUihuZXdfYmgpLT5oX3JlZmNvdW50KSk7CisJCQkJZWFfYmRlYnVnKG5ld19iaCwgInJldXNpbmc7IHJlZmNvdW50IG5vdz0lZCIsCisJCQkJCWxlMzJfdG9fY3B1KEJIRFIobmV3X2JoKS0+aF9yZWZjb3VudCkpOworCQkJCXVubG9ja19idWZmZXIobmV3X2JoKTsKKwkJCQllcnJvciA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsCisJCQkJCQkJCSAgICBuZXdfYmgpOworCQkJCWlmIChlcnJvcikKKwkJCQkJZ290byBjbGVhbnVwX2RxdW90OworCQkJfQorCQkJbWJfY2FjaGVfZW50cnlfcmVsZWFzZShjZSk7CisJCQljZSA9IE5VTEw7CisJCX0gZWxzZSBpZiAoYnMtPmJoICYmIHMtPmJhc2UgPT0gYnMtPmJoLT5iX2RhdGEpIHsKKwkJCS8qIFdlIHdlcmUgbW9kaWZ5aW5nIHRoaXMgYmxvY2sgaW4tcGxhY2UuICovCisJCQllYV9iZGVidWcoYnMtPmJoLCAia2VlcGluZyB0aGlzIGJsb2NrIik7CisJCQluZXdfYmggPSBicy0+Ymg7CisJCQlnZXRfYmgobmV3X2JoKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFdlIG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgYmxvY2sgKi8KKwkJCWludCBnb2FsID0gbGUzMl90b19jcHUoCisJCQkJCUVYVDNfU0Ioc2IpLT5zX2VzLT5zX2ZpcnN0X2RhdGFfYmxvY2spICsKKwkJCQlFWFQzX0koaW5vZGUpLT5pX2Jsb2NrX2dyb3VwICoKKwkJCQlFWFQzX0JMT0NLU19QRVJfR1JPVVAoc2IpOworCQkJaW50IGJsb2NrID0gZXh0M19uZXdfYmxvY2soaGFuZGxlLCBpbm9kZSwgZ29hbCwgJmVycm9yKTsKKwkJCWlmIChlcnJvcikKKwkJCQlnb3RvIGNsZWFudXA7CisJCQllYV9pZGVidWcoaW5vZGUsICJjcmVhdGluZyBibG9jayAlZCIsIGJsb2NrKTsKKworCQkJbmV3X2JoID0gc2JfZ2V0YmxrKHNiLCBibG9jayk7CisJCQlpZiAoIW5ld19iaCkgeworZ2V0YmxrX2ZhaWxlZDoKKwkJCQlleHQzX2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGJsb2NrLCAxKTsKKwkJCQllcnJvciA9IC1FSU87CisJCQkJZ290byBjbGVhbnVwOworCQkJfQorCQkJbG9ja19idWZmZXIobmV3X2JoKTsKKwkJCWVycm9yID0gZXh0M19qb3VybmFsX2dldF9jcmVhdGVfYWNjZXNzKGhhbmRsZSwgbmV3X2JoKTsKKwkJCWlmIChlcnJvcikgeworCQkJCXVubG9ja19idWZmZXIobmV3X2JoKTsKKwkJCQlnb3RvIGdldGJsa19mYWlsZWQ7CisJCQl9CisJCQltZW1jcHkobmV3X2JoLT5iX2RhdGEsIHMtPmJhc2UsIG5ld19iaC0+Yl9zaXplKTsKKwkJCXNldF9idWZmZXJfdXB0b2RhdGUobmV3X2JoKTsKKwkJCXVubG9ja19idWZmZXIobmV3X2JoKTsKKwkJCWV4dDNfeGF0dHJfY2FjaGVfaW5zZXJ0KG5ld19iaCk7CisJCQllcnJvciA9IGV4dDNfam91cm5hbF9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIG5ld19iaCk7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBjbGVhbnVwOworCQl9CisJfQorCisJLyogVXBkYXRlIHRoZSBpbm9kZS4gKi8KKwlFWFQzX0koaW5vZGUpLT5pX2ZpbGVfYWNsID0gbmV3X2JoID8gbmV3X2JoLT5iX2Jsb2NrbnIgOiAwOworCisJLyogRHJvcCB0aGUgcHJldmlvdXMgeGF0dHIgYmxvY2suICovCisJaWYgKGJzLT5iaCAmJiBicy0+YmggIT0gbmV3X2JoKQorCQlleHQzX3hhdHRyX3JlbGVhc2VfYmxvY2soaGFuZGxlLCBpbm9kZSwgYnMtPmJoKTsKKwllcnJvciA9IDA7CisKK2NsZWFudXA6CisJaWYgKGNlKQorCQltYl9jYWNoZV9lbnRyeV9yZWxlYXNlKGNlKTsKKwlicmVsc2UobmV3X2JoKTsKKwlpZiAoIShicy0+YmggJiYgcy0+YmFzZSA9PSBicy0+YmgtPmJfZGF0YSkpCisJCWtmcmVlKHMtPmJhc2UpOworCisJcmV0dXJuIGVycm9yOworCitjbGVhbnVwX2RxdW90OgorCURRVU9UX0ZSRUVfQkxPQ0soaW5vZGUsIDEpOworCWdvdG8gY2xlYW51cDsKKworYmFkX2Jsb2NrOgorCWV4dDNfZXJyb3IoaW5vZGUtPmlfc2IsIF9fRlVOQ1RJT05fXywKKwkJICAgImlub2RlICVsZDogYmFkIGJsb2NrICVkIiwgaW5vZGUtPmlfaW5vLAorCQkgICBFWFQzX0koaW5vZGUpLT5pX2ZpbGVfYWNsKTsKKwlnb3RvIGNsZWFudXA7CisKKyN1bmRlZiBoZWFkZXIKK30KKworc3RydWN0IGV4dDNfeGF0dHJfaWJvZHlfZmluZCB7CisJc3RydWN0IGV4dDNfeGF0dHJfc2VhcmNoIHM7CisJc3RydWN0IGV4dDNfaWxvYyBpbG9jOworfTsKKworaW50CitleHQzX3hhdHRyX2lib2R5X2ZpbmQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dDNfeGF0dHJfaW5mbyAqaSwKKwkJICAgICAgc3RydWN0IGV4dDNfeGF0dHJfaWJvZHlfZmluZCAqaXMpCit7CisJc3RydWN0IGV4dDNfeGF0dHJfaWJvZHlfaGVhZGVyICpoZWFkZXI7CisJc3RydWN0IGV4dDNfaW5vZGUgKnJhd19pbm9kZTsKKwlpbnQgZXJyb3I7CisKKwlpZiAoRVhUM19JKGlub2RlKS0+aV9leHRyYV9pc2l6ZSA9PSAwKQorCQlyZXR1cm4gMDsKKwlyYXdfaW5vZGUgPSBleHQzX3Jhd19pbm9kZSgmaXMtPmlsb2MpOworCWhlYWRlciA9IElIRFIoaW5vZGUsIHJhd19pbm9kZSk7CisJaXMtPnMuYmFzZSA9IGlzLT5zLmZpcnN0ID0gSUZJUlNUKGhlYWRlcik7CisJaXMtPnMuaGVyZSA9IGlzLT5zLmZpcnN0OworCWlzLT5zLmVuZCA9ICh2b2lkICopcmF3X2lub2RlICsgRVhUM19TQihpbm9kZS0+aV9zYiktPnNfaW5vZGVfc2l6ZTsKKwlpZiAoRVhUM19JKGlub2RlKS0+aV9zdGF0ZSAmIEVYVDNfU1RBVEVfWEFUVFIpIHsKKwkJZXJyb3IgPSBleHQzX3hhdHRyX2NoZWNrX25hbWVzKElGSVJTVChoZWFkZXIpLCBpcy0+cy5lbmQpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJCS8qIEZpbmQgdGhlIG5hbWVkIGF0dHJpYnV0ZS4gKi8KKwkJZXJyb3IgPSBleHQzX3hhdHRyX2ZpbmRfZW50cnkoJmlzLT5zLmhlcmUsIGktPm5hbWVfaW5kZXgsCisJCQkJCSAgICAgIGktPm5hbWUsIGlzLT5zLmVuZCAtCisJCQkJCSAgICAgICh2b2lkICopaXMtPnMuYmFzZSwgMCk7CisJCWlmIChlcnJvciAmJiBlcnJvciAhPSAtRU5PREFUQSkKKwkJCXJldHVybiBlcnJvcjsKKwkJaXMtPnMubm90X2ZvdW5kID0gZXJyb3I7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitleHQzX3hhdHRyX2lib2R5X3NldChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkgICAgIHN0cnVjdCBleHQzX3hhdHRyX2luZm8gKmksCisJCSAgICAgc3RydWN0IGV4dDNfeGF0dHJfaWJvZHlfZmluZCAqaXMpCit7CisJc3RydWN0IGV4dDNfeGF0dHJfaWJvZHlfaGVhZGVyICpoZWFkZXI7CisJc3RydWN0IGV4dDNfeGF0dHJfc2VhcmNoICpzID0gJmlzLT5zOworCWludCBlcnJvcjsKKworCWlmIChFWFQzX0koaW5vZGUpLT5pX2V4dHJhX2lzaXplID09IDApCisJCXJldHVybiAtRU5PU1BDOworCWVycm9yID0gZXh0M194YXR0cl9zZXRfZW50cnkoaSwgcyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJaGVhZGVyID0gSUhEUihpbm9kZSwgZXh0M19yYXdfaW5vZGUoJmlzLT5pbG9jKSk7CisJaWYgKCFJU19MQVNUX0VOVFJZKHMtPmZpcnN0KSkgeworCQloZWFkZXItPmhfbWFnaWMgPSBjcHVfdG9fbGUzMihFWFQzX1hBVFRSX01BR0lDKTsKKwkJRVhUM19JKGlub2RlKS0+aV9zdGF0ZSB8PSBFWFQzX1NUQVRFX1hBVFRSOworCX0gZWxzZSB7CisJCWhlYWRlci0+aF9tYWdpYyA9IGNwdV90b19sZTMyKDApOworCQlFWFQzX0koaW5vZGUpLT5pX3N0YXRlICY9IH5FWFQzX1NUQVRFX1hBVFRSOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGV4dDNfeGF0dHJfc2V0X2hhbmRsZSgpCisgKgorICogQ3JlYXRlLCByZXBsYWNlIG9yIHJlbW92ZSBhbiBleHRlbmRlZCBhdHRyaWJ1dGUgZm9yIHRoaXMgaW5vZGUuIEJ1ZmZlcgorICogaXMgTlVMTCB0byByZW1vdmUgYW4gZXhpc3RpbmcgZXh0ZW5kZWQgYXR0cmlidXRlLCBhbmQgbm9uLU5VTEwgdG8KKyAqIGVpdGhlciByZXBsYWNlIGFuIGV4aXN0aW5nIGV4dGVuZGVkIGF0dHJpYnV0ZSwgb3IgY3JlYXRlIGEgbmV3IGV4dGVuZGVkCisgKiBhdHRyaWJ1dGUuIFRoZSBmbGFncyBYQVRUUl9SRVBMQUNFIGFuZCBYQVRUUl9DUkVBVEUKKyAqIHNwZWNpZnkgdGhhdCBhbiBleHRlbmRlZCBhdHRyaWJ1dGUgbXVzdCBleGlzdCBhbmQgbXVzdCBub3QgZXhpc3QKKyAqIHByZXZpb3VzIHRvIHRoZSBjYWxsLCByZXNwZWN0aXZlbHkuCisgKgorICogUmV0dXJucyAwLCBvciBhIG5lZ2F0aXZlIGVycm9yIG51bWJlciBvbiBmYWlsdXJlLgorICovCitpbnQKK2V4dDNfeGF0dHJfc2V0X2hhbmRsZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbmFtZV9pbmRleCwKKwkJICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCB2YWx1ZV9sZW4sCisJCSAgICAgIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgZXh0M194YXR0cl9pbmZvIGkgPSB7CisJCS5uYW1lX2luZGV4ID0gbmFtZV9pbmRleCwKKwkJLm5hbWUgPSBuYW1lLAorCQkudmFsdWUgPSB2YWx1ZSwKKwkJLnZhbHVlX2xlbiA9IHZhbHVlX2xlbiwKKworCX07CisJc3RydWN0IGV4dDNfeGF0dHJfaWJvZHlfZmluZCBpcyA9IHsKKwkJLnMgPSB7IC5ub3RfZm91bmQgPSAtRU5PREFUQSwgfSwKKwl9OworCXN0cnVjdCBleHQzX3hhdHRyX2Jsb2NrX2ZpbmQgYnMgPSB7CisJCS5zID0geyAubm90X2ZvdW5kID0gLUVOT0RBVEEsIH0sCisJfTsKKwlpbnQgZXJyb3I7CisKKwlpZiAoSVNfUkRPTkxZKGlub2RlKSkKKwkJcmV0dXJuIC1FUk9GUzsKKwlpZiAoSVNfSU1NVVRBQkxFKGlub2RlKSB8fCBJU19BUFBFTkQoaW5vZGUpKQorCQlyZXR1cm4gLUVQRVJNOworCWlmICghbmFtZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHN0cmxlbihuYW1lKSA+IDI1NSkKKwkJcmV0dXJuIC1FUkFOR0U7CisJZG93bl93cml0ZSgmRVhUM19JKGlub2RlKS0+eGF0dHJfc2VtKTsKKwllcnJvciA9IGV4dDNfZ2V0X2lub2RlX2xvYyhpbm9kZSwgJmlzLmlsb2MpOworCWlmIChlcnJvcikKKwkJZ290byBjbGVhbnVwOworCisJaWYgKEVYVDNfSShpbm9kZSktPmlfc3RhdGUgJiBFWFQzX1NUQVRFX05FVykgeworCQlzdHJ1Y3QgZXh0M19pbm9kZSAqcmF3X2lub2RlID0gZXh0M19yYXdfaW5vZGUoJmlzLmlsb2MpOworCQltZW1zZXQocmF3X2lub2RlLCAwLCBFWFQzX1NCKGlub2RlLT5pX3NiKS0+c19pbm9kZV9zaXplKTsKKwkJRVhUM19JKGlub2RlKS0+aV9zdGF0ZSAmPSB+RVhUM19TVEFURV9ORVc7CisJfQorCisJZXJyb3IgPSBleHQzX3hhdHRyX2lib2R5X2ZpbmQoaW5vZGUsICZpLCAmaXMpOworCWlmIChlcnJvcikKKwkJZ290byBjbGVhbnVwOworCWlmIChpcy5zLm5vdF9mb3VuZCkKKwkJZXJyb3IgPSBleHQzX3hhdHRyX2Jsb2NrX2ZpbmQoaW5vZGUsICZpLCAmYnMpOworCWlmIChlcnJvcikKKwkJZ290byBjbGVhbnVwOworCWlmIChpcy5zLm5vdF9mb3VuZCAmJiBicy5zLm5vdF9mb3VuZCkgeworCQllcnJvciA9IC1FTk9EQVRBOworCQlpZiAoZmxhZ3MgJiBYQVRUUl9SRVBMQUNFKQorCQkJZ290byBjbGVhbnVwOworCQllcnJvciA9IDA7CisJCWlmICghdmFsdWUpCisJCQlnb3RvIGNsZWFudXA7CisJfSBlbHNlIHsKKwkJZXJyb3IgPSAtRUVYSVNUOworCQlpZiAoZmxhZ3MgJiBYQVRUUl9DUkVBVEUpCisJCQlnb3RvIGNsZWFudXA7CisJfQorCWVycm9yID0gZXh0M19qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBpcy5pbG9jLmJoKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gY2xlYW51cDsKKwlpZiAoIXZhbHVlKSB7CisJCWlmICghaXMucy5ub3RfZm91bmQpCisJCQllcnJvciA9IGV4dDNfeGF0dHJfaWJvZHlfc2V0KGhhbmRsZSwgaW5vZGUsICZpLCAmaXMpOworCQllbHNlIGlmICghYnMucy5ub3RfZm91bmQpCisJCQllcnJvciA9IGV4dDNfeGF0dHJfYmxvY2tfc2V0KGhhbmRsZSwgaW5vZGUsICZpLCAmYnMpOworCX0gZWxzZSB7CisJCWVycm9yID0gZXh0M194YXR0cl9pYm9keV9zZXQoaGFuZGxlLCBpbm9kZSwgJmksICZpcyk7CisJCWlmICghZXJyb3IgJiYgIWJzLnMubm90X2ZvdW5kKSB7CisJCQlpLnZhbHVlID0gTlVMTDsKKwkJCWVycm9yID0gZXh0M194YXR0cl9ibG9ja19zZXQoaGFuZGxlLCBpbm9kZSwgJmksICZicyk7CisJCX0gZWxzZSBpZiAoZXJyb3IgPT0gLUVOT1NQQykgeworCQkJZXJyb3IgPSBleHQzX3hhdHRyX2Jsb2NrX3NldChoYW5kbGUsIGlub2RlLCAmaSwgJmJzKTsKKwkJCWlmIChlcnJvcikKKwkJCQlnb3RvIGNsZWFudXA7CisJCQlpZiAoIWlzLnMubm90X2ZvdW5kKSB7CisJCQkJaS52YWx1ZSA9IE5VTEw7CisJCQkJZXJyb3IgPSBleHQzX3hhdHRyX2lib2R5X3NldChoYW5kbGUsIGlub2RlLCAmaSwKKwkJCQkJCQkgICAgICZpcyk7CisJCQl9CisJCX0KKwl9CisJaWYgKCFlcnJvcikgeworCQlleHQzX3hhdHRyX3VwZGF0ZV9zdXBlcl9ibG9jayhoYW5kbGUsIGlub2RlLT5pX3NiKTsKKwkJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCQllcnJvciA9IGV4dDNfbWFya19pbG9jX2RpcnR5KGhhbmRsZSwgaW5vZGUsICZpcy5pbG9jKTsKKwkJLyoKKwkJICogVGhlIGJoIGlzIGNvbnN1bWVkIGJ5IGV4dDNfbWFya19pbG9jX2RpcnR5LCBldmVuIHdpdGgKKwkJICogZXJyb3IgIT0gMC4KKwkJICovCisJCWlzLmlsb2MuYmggPSBOVUxMOworCQlpZiAoSVNfU1lOQyhpbm9kZSkpCisJCQloYW5kbGUtPmhfc3luYyA9IDE7CisJfQorCitjbGVhbnVwOgorCWJyZWxzZShpcy5pbG9jLmJoKTsKKwlicmVsc2UoYnMuYmgpOworCXVwX3dyaXRlKCZFWFQzX0koaW5vZGUpLT54YXR0cl9zZW0pOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIGV4dDNfeGF0dHJfc2V0KCkKKyAqCisgKiBMaWtlIGV4dDNfeGF0dHJfc2V0X2hhbmRsZSwgYnV0IHN0YXJ0IGZyb20gYW4gaW5vZGUuIFRoaXMgZXh0ZW5kZWQKKyAqIGF0dHJpYnV0ZSBtb2RpZmljYXRpb24gaXMgYSBmaWxlc3lzdGVtIHRyYW5zYWN0aW9uIGJ5IGl0c2VsZi4KKyAqCisgKiBSZXR1cm5zIDAsIG9yIGEgbmVnYXRpdmUgZXJyb3IgbnVtYmVyIG9uIGZhaWx1cmUuCisgKi8KK2ludAorZXh0M194YXR0cl9zZXQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5hbWVfaW5kZXgsIGNvbnN0IGNoYXIgKm5hbWUsCisJICAgICAgIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3QgdmFsdWVfbGVuLCBpbnQgZmxhZ3MpCit7CisJaGFuZGxlX3QgKmhhbmRsZTsKKwlpbnQgZXJyb3IsIHJldHJpZXMgPSAwOworCityZXRyeToKKwloYW5kbGUgPSBleHQzX2pvdXJuYWxfc3RhcnQoaW5vZGUsIEVYVDNfREFUQV9UUkFOU19CTE9DS1MpOworCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQllcnJvciA9IFBUUl9FUlIoaGFuZGxlKTsKKwl9IGVsc2UgeworCQlpbnQgZXJyb3IyOworCisJCWVycm9yID0gZXh0M194YXR0cl9zZXRfaGFuZGxlKGhhbmRsZSwgaW5vZGUsIG5hbWVfaW5kZXgsIG5hbWUsCisJCQkJCSAgICAgIHZhbHVlLCB2YWx1ZV9sZW4sIGZsYWdzKTsKKwkJZXJyb3IyID0gZXh0M19qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwkJaWYgKGVycm9yID09IC1FTk9TUEMgJiYKKwkJICAgIGV4dDNfc2hvdWxkX3JldHJ5X2FsbG9jKGlub2RlLT5pX3NiLCAmcmV0cmllcykpCisJCQlnb3RvIHJldHJ5OworCQlpZiAoZXJyb3IgPT0gMCkKKwkJCWVycm9yID0gZXJyb3IyOworCX0KKworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIGV4dDNfeGF0dHJfZGVsZXRlX2lub2RlKCkKKyAqCisgKiBGcmVlIGV4dGVuZGVkIGF0dHJpYnV0ZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5vZGUuIFRoaXMKKyAqIGlzIGNhbGxlZCBpbW1lZGlhdGVseSBiZWZvcmUgYW4gaW5vZGUgaXMgZnJlZWQuIFdlIGhhdmUgZXhjbHVzaXZlCisgKiBhY2Nlc3MgdG8gdGhlIGlub2RlLgorICovCit2b2lkCitleHQzX3hhdHRyX2RlbGV0ZV9pbm9kZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCisJaWYgKCFFWFQzX0koaW5vZGUpLT5pX2ZpbGVfYWNsKQorCQlnb3RvIGNsZWFudXA7CisJYmggPSBzYl9icmVhZChpbm9kZS0+aV9zYiwgRVhUM19JKGlub2RlKS0+aV9maWxlX2FjbCk7CisJaWYgKCFiaCkgeworCQlleHQzX2Vycm9yKGlub2RlLT5pX3NiLCBfX0ZVTkNUSU9OX18sCisJCQkiaW5vZGUgJWxkOiBibG9jayAlZCByZWFkIGVycm9yIiwgaW5vZGUtPmlfaW5vLAorCQkJRVhUM19JKGlub2RlKS0+aV9maWxlX2FjbCk7CisJCWdvdG8gY2xlYW51cDsKKwl9CisJaWYgKEJIRFIoYmgpLT5oX21hZ2ljICE9IGNwdV90b19sZTMyKEVYVDNfWEFUVFJfTUFHSUMpIHx8CisJICAgIEJIRFIoYmgpLT5oX2Jsb2NrcyAhPSBjcHVfdG9fbGUzMigxKSkgeworCQlleHQzX2Vycm9yKGlub2RlLT5pX3NiLCBfX0ZVTkNUSU9OX18sCisJCQkiaW5vZGUgJWxkOiBiYWQgYmxvY2sgJWQiLCBpbm9kZS0+aV9pbm8sCisJCQlFWFQzX0koaW5vZGUpLT5pX2ZpbGVfYWNsKTsKKwkJZ290byBjbGVhbnVwOworCX0KKwlleHQzX3hhdHRyX3JlbGVhc2VfYmxvY2soaGFuZGxlLCBpbm9kZSwgYmgpOworCUVYVDNfSShpbm9kZSktPmlfZmlsZV9hY2wgPSAwOworCitjbGVhbnVwOgorCWJyZWxzZShiaCk7Cit9CisKKy8qCisgKiBleHQzX3hhdHRyX3B1dF9zdXBlcigpCisgKgorICogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIGZpbGUgc3lzdGVtIGlzIHVubW91bnRlZC4KKyAqLwordm9pZAorZXh0M194YXR0cl9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwltYl9jYWNoZV9zaHJpbmsoZXh0M194YXR0cl9jYWNoZSwgc2ItPnNfYmRldik7Cit9CisKKy8qCisgKiBleHQzX3hhdHRyX2NhY2hlX2luc2VydCgpCisgKgorICogQ3JlYXRlIGEgbmV3IGVudHJ5IGluIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGUgY2FjaGUsIGFuZCBpbnNlcnQKKyAqIGl0IHVubGVzcyBzdWNoIGFuIGVudHJ5IGlzIGFscmVhZHkgaW4gdGhlIGNhY2hlLgorICoKKyAqIFJldHVybnMgMCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIHZvaWQKK2V4dDNfeGF0dHJfY2FjaGVfaW5zZXJ0KHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJX191MzIgaGFzaCA9IGxlMzJfdG9fY3B1KEJIRFIoYmgpLT5oX2hhc2gpOworCXN0cnVjdCBtYl9jYWNoZV9lbnRyeSAqY2U7CisJaW50IGVycm9yOworCisJY2UgPSBtYl9jYWNoZV9lbnRyeV9hbGxvYyhleHQzX3hhdHRyX2NhY2hlKTsKKwlpZiAoIWNlKSB7CisJCWVhX2JkZWJ1ZyhiaCwgIm91dCBvZiBtZW1vcnkiKTsKKwkJcmV0dXJuOworCX0KKwllcnJvciA9IG1iX2NhY2hlX2VudHJ5X2luc2VydChjZSwgYmgtPmJfYmRldiwgYmgtPmJfYmxvY2tuciwgJmhhc2gpOworCWlmIChlcnJvcikgeworCQltYl9jYWNoZV9lbnRyeV9mcmVlKGNlKTsKKwkJaWYgKGVycm9yID09IC1FQlVTWSkgeworCQkJZWFfYmRlYnVnKGJoLCAiYWxyZWFkeSBpbiBjYWNoZSIpOworCQkJZXJyb3IgPSAwOworCQl9CisJfSBlbHNlIHsKKwkJZWFfYmRlYnVnKGJoLCAiaW5zZXJ0aW5nIFsleF0iLCAoaW50KWhhc2gpOworCQltYl9jYWNoZV9lbnRyeV9yZWxlYXNlKGNlKTsKKwl9Cit9CisKKy8qCisgKiBleHQzX3hhdHRyX2NtcCgpCisgKgorICogQ29tcGFyZSB0d28gZXh0ZW5kZWQgYXR0cmlidXRlIGJsb2NrcyBmb3IgZXF1YWxpdHkuCisgKgorICogUmV0dXJucyAwIGlmIHRoZSBibG9ja3MgYXJlIGVxdWFsLCAxIGlmIHRoZXkgZGlmZmVyLCBhbmQKKyAqIGEgbmVnYXRpdmUgZXJyb3IgbnVtYmVyIG9uIGVycm9ycy4KKyAqLworc3RhdGljIGludAorZXh0M194YXR0cl9jbXAoc3RydWN0IGV4dDNfeGF0dHJfaGVhZGVyICpoZWFkZXIxLAorCSAgICAgICBzdHJ1Y3QgZXh0M194YXR0cl9oZWFkZXIgKmhlYWRlcjIpCit7CisJc3RydWN0IGV4dDNfeGF0dHJfZW50cnkgKmVudHJ5MSwgKmVudHJ5MjsKKworCWVudHJ5MSA9IEVOVFJZKGhlYWRlcjErMSk7CisJZW50cnkyID0gRU5UUlkoaGVhZGVyMisxKTsKKwl3aGlsZSAoIUlTX0xBU1RfRU5UUlkoZW50cnkxKSkgeworCQlpZiAoSVNfTEFTVF9FTlRSWShlbnRyeTIpKQorCQkJcmV0dXJuIDE7CisJCWlmIChlbnRyeTEtPmVfaGFzaCAhPSBlbnRyeTItPmVfaGFzaCB8fAorCQkgICAgZW50cnkxLT5lX25hbWVfaW5kZXggIT0gZW50cnkyLT5lX25hbWVfaW5kZXggfHwKKwkJICAgIGVudHJ5MS0+ZV9uYW1lX2xlbiAhPSBlbnRyeTItPmVfbmFtZV9sZW4gfHwKKwkJICAgIGVudHJ5MS0+ZV92YWx1ZV9zaXplICE9IGVudHJ5Mi0+ZV92YWx1ZV9zaXplIHx8CisJCSAgICBtZW1jbXAoZW50cnkxLT5lX25hbWUsIGVudHJ5Mi0+ZV9uYW1lLCBlbnRyeTEtPmVfbmFtZV9sZW4pKQorCQkJcmV0dXJuIDE7CisJCWlmIChlbnRyeTEtPmVfdmFsdWVfYmxvY2sgIT0gMCB8fCBlbnRyeTItPmVfdmFsdWVfYmxvY2sgIT0gMCkKKwkJCXJldHVybiAtRUlPOworCQlpZiAobWVtY21wKChjaGFyICopaGVhZGVyMSArIGxlMTZfdG9fY3B1KGVudHJ5MS0+ZV92YWx1ZV9vZmZzKSwKKwkJCSAgIChjaGFyICopaGVhZGVyMiArIGxlMTZfdG9fY3B1KGVudHJ5Mi0+ZV92YWx1ZV9vZmZzKSwKKwkJCSAgIGxlMzJfdG9fY3B1KGVudHJ5MS0+ZV92YWx1ZV9zaXplKSkpCisJCQlyZXR1cm4gMTsKKworCQllbnRyeTEgPSBFWFQzX1hBVFRSX05FWFQoZW50cnkxKTsKKwkJZW50cnkyID0gRVhUM19YQVRUUl9ORVhUKGVudHJ5Mik7CisJfQorCWlmICghSVNfTEFTVF9FTlRSWShlbnRyeTIpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGV4dDNfeGF0dHJfY2FjaGVfZmluZCgpCisgKgorICogRmluZCBhbiBpZGVudGljYWwgZXh0ZW5kZWQgYXR0cmlidXRlIGJsb2NrLgorICoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBibG9jayBmb3VuZCwgb3IgTlVMTCBpZiBzdWNoIGEgYmxvY2sgd2FzCisgKiBub3QgZm91bmQgb3IgYW4gZXJyb3Igb2NjdXJyZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKgorZXh0M194YXR0cl9jYWNoZV9maW5kKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHQzX3hhdHRyX2hlYWRlciAqaGVhZGVyLAorCQkgICAgICBzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKipwY2UpCit7CisJX191MzIgaGFzaCA9IGxlMzJfdG9fY3B1KGhlYWRlci0+aF9oYXNoKTsKKwlzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKmNlOworCisJaWYgKCFoZWFkZXItPmhfaGFzaCkKKwkJcmV0dXJuIE5VTEw7ICAvKiBuZXZlciBzaGFyZSAqLworCWVhX2lkZWJ1Zyhpbm9kZSwgImxvb2tpbmcgZm9yIGNhY2hlZCBibG9ja3MgWyV4XSIsIChpbnQpaGFzaCk7CithZ2FpbjoKKwljZSA9IG1iX2NhY2hlX2VudHJ5X2ZpbmRfZmlyc3QoZXh0M194YXR0cl9jYWNoZSwgMCwKKwkJCQkgICAgICAgaW5vZGUtPmlfc2ItPnNfYmRldiwgaGFzaCk7CisJd2hpbGUgKGNlKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwkJaWYgKElTX0VSUihjZSkpIHsKKwkJCWlmIChQVFJfRVJSKGNlKSA9PSAtRUFHQUlOKQorCQkJCWdvdG8gYWdhaW47CisJCQlicmVhazsKKwkJfQorCQliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCBjZS0+ZV9ibG9jayk7CisJCWlmICghYmgpIHsKKwkJCWV4dDNfZXJyb3IoaW5vZGUtPmlfc2IsIF9fRlVOQ1RJT05fXywKKwkJCQkiaW5vZGUgJWxkOiBibG9jayAlbGQgcmVhZCBlcnJvciIsCisJCQkJaW5vZGUtPmlfaW5vLCAodW5zaWduZWQgbG9uZykgY2UtPmVfYmxvY2spOworCQl9IGVsc2UgaWYgKGxlMzJfdG9fY3B1KEJIRFIoYmgpLT5oX3JlZmNvdW50KSA+PQorCQkJCUVYVDNfWEFUVFJfUkVGQ09VTlRfTUFYKSB7CisJCQllYV9pZGVidWcoaW5vZGUsICJibG9jayAlbGQgcmVmY291bnQgJWQ+PSVkIiwKKwkJCQkgICh1bnNpZ25lZCBsb25nKSBjZS0+ZV9ibG9jaywKKwkJCQkgIGxlMzJfdG9fY3B1KEJIRFIoYmgpLT5oX3JlZmNvdW50KSwKKwkJCQkJICBFWFQzX1hBVFRSX1JFRkNPVU5UX01BWCk7CisJCX0gZWxzZSBpZiAoZXh0M194YXR0cl9jbXAoaGVhZGVyLCBCSERSKGJoKSkgPT0gMCkgeworCQkJKnBjZSA9IGNlOworCQkJcmV0dXJuIGJoOworCQl9CisJCWJyZWxzZShiaCk7CisJCWNlID0gbWJfY2FjaGVfZW50cnlfZmluZF9uZXh0KGNlLCAwLCBpbm9kZS0+aV9zYi0+c19iZGV2LCBoYXNoKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKyNkZWZpbmUgTkFNRV9IQVNIX1NISUZUIDUKKyNkZWZpbmUgVkFMVUVfSEFTSF9TSElGVCAxNgorCisvKgorICogZXh0M194YXR0cl9oYXNoX2VudHJ5KCkKKyAqCisgKiBDb21wdXRlIHRoZSBoYXNoIG9mIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGV4dDNfeGF0dHJfaGFzaF9lbnRyeShzdHJ1Y3QgZXh0M194YXR0cl9oZWFkZXIgKmhlYWRlciwKKwkJCQkJIHN0cnVjdCBleHQzX3hhdHRyX2VudHJ5ICplbnRyeSkKK3sKKwlfX3UzMiBoYXNoID0gMDsKKwljaGFyICpuYW1lID0gZW50cnktPmVfbmFtZTsKKwlpbnQgbjsKKworCWZvciAobj0wOyBuIDwgZW50cnktPmVfbmFtZV9sZW47IG4rKykgeworCQloYXNoID0gKGhhc2ggPDwgTkFNRV9IQVNIX1NISUZUKSBeCisJCSAgICAgICAoaGFzaCA+PiAoOCpzaXplb2YoaGFzaCkgLSBOQU1FX0hBU0hfU0hJRlQpKSBeCisJCSAgICAgICAqbmFtZSsrOworCX0KKworCWlmIChlbnRyeS0+ZV92YWx1ZV9ibG9jayA9PSAwICYmIGVudHJ5LT5lX3ZhbHVlX3NpemUgIT0gMCkgeworCQlfX2xlMzIgKnZhbHVlID0gKF9fbGUzMiAqKSgoY2hhciAqKWhlYWRlciArCisJCQlsZTE2X3RvX2NwdShlbnRyeS0+ZV92YWx1ZV9vZmZzKSk7CisJCWZvciAobiA9IChsZTMyX3RvX2NwdShlbnRyeS0+ZV92YWx1ZV9zaXplKSArCisJCSAgICAgRVhUM19YQVRUUl9ST1VORCkgPj4gRVhUM19YQVRUUl9QQURfQklUUzsgbjsgbi0tKSB7CisJCQloYXNoID0gKGhhc2ggPDwgVkFMVUVfSEFTSF9TSElGVCkgXgorCQkJICAgICAgIChoYXNoID4+ICg4KnNpemVvZihoYXNoKSAtIFZBTFVFX0hBU0hfU0hJRlQpKSBeCisJCQkgICAgICAgbGUzMl90b19jcHUoKnZhbHVlKyspOworCQl9CisJfQorCWVudHJ5LT5lX2hhc2ggPSBjcHVfdG9fbGUzMihoYXNoKTsKK30KKworI3VuZGVmIE5BTUVfSEFTSF9TSElGVAorI3VuZGVmIFZBTFVFX0hBU0hfU0hJRlQKKworI2RlZmluZSBCTE9DS19IQVNIX1NISUZUIDE2CisKKy8qCisgKiBleHQzX3hhdHRyX3JlaGFzaCgpCisgKgorICogUmUtY29tcHV0ZSB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIGhhc2ggdmFsdWUgYWZ0ZXIgYW4gZW50cnkgaGFzIGNoYW5nZWQuCisgKi8KK3N0YXRpYyB2b2lkIGV4dDNfeGF0dHJfcmVoYXNoKHN0cnVjdCBleHQzX3hhdHRyX2hlYWRlciAqaGVhZGVyLAorCQkJICAgICAgc3RydWN0IGV4dDNfeGF0dHJfZW50cnkgKmVudHJ5KQoreworCXN0cnVjdCBleHQzX3hhdHRyX2VudHJ5ICpoZXJlOworCV9fdTMyIGhhc2ggPSAwOworCisJZXh0M194YXR0cl9oYXNoX2VudHJ5KGhlYWRlciwgZW50cnkpOworCWhlcmUgPSBFTlRSWShoZWFkZXIrMSk7CisJd2hpbGUgKCFJU19MQVNUX0VOVFJZKGhlcmUpKSB7CisJCWlmICghaGVyZS0+ZV9oYXNoKSB7CisJCQkvKiBCbG9jayBpcyBub3Qgc2hhcmVkIGlmIGFuIGVudHJ5J3MgaGFzaCB2YWx1ZSA9PSAwICovCisJCQloYXNoID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWhhc2ggPSAoaGFzaCA8PCBCTE9DS19IQVNIX1NISUZUKSBeCisJCSAgICAgICAoaGFzaCA+PiAoOCpzaXplb2YoaGFzaCkgLSBCTE9DS19IQVNIX1NISUZUKSkgXgorCQkgICAgICAgbGUzMl90b19jcHUoaGVyZS0+ZV9oYXNoKTsKKwkJaGVyZSA9IEVYVDNfWEFUVFJfTkVYVChoZXJlKTsKKwl9CisJaGVhZGVyLT5oX2hhc2ggPSBjcHVfdG9fbGUzMihoYXNoKTsKK30KKworI3VuZGVmIEJMT0NLX0hBU0hfU0hJRlQKKworaW50IF9faW5pdAoraW5pdF9leHQzX3hhdHRyKHZvaWQpCit7CisJZXh0M194YXR0cl9jYWNoZSA9IG1iX2NhY2hlX2NyZWF0ZSgiZXh0M194YXR0ciIsIE5VTEwsCisJCXNpemVvZihzdHJ1Y3QgbWJfY2FjaGVfZW50cnkpICsKKwkJc2l6ZW9mKCgoc3RydWN0IG1iX2NhY2hlX2VudHJ5ICopIDApLT5lX2luZGV4ZXNbMF0pLCAxLCA2KTsKKwlpZiAoIWV4dDNfeGF0dHJfY2FjaGUpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCit2b2lkCitleGl0X2V4dDNfeGF0dHIodm9pZCkKK3sKKwlpZiAoZXh0M194YXR0cl9jYWNoZSkKKwkJbWJfY2FjaGVfZGVzdHJveShleHQzX3hhdHRyX2NhY2hlKTsKKwlleHQzX3hhdHRyX2NhY2hlID0gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2ZzL2V4dDMveGF0dHIuaCBiL2ZzL2V4dDMveGF0dHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjMxYTY5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0My94YXR0ci5oCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICBGaWxlOiBmcy9leHQzL3hhdHRyLmgKKworICBPbi1kaXNrIGZvcm1hdCBvZiBleHRlbmRlZCBhdHRyaWJ1dGVzIGZvciB0aGUgZXh0MyBmaWxlc3lzdGVtLgorCisgIChDKSAyMDAxIEFuZHJlYXMgR3J1ZW5iYWNoZXIsIDxhLmdydWVuYmFjaGVyQGNvbXB1dGVyLm9yZz4KKyovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC94YXR0ci5oPgorCisvKiBNYWdpYyB2YWx1ZSBpbiBhdHRyaWJ1dGUgYmxvY2tzICovCisjZGVmaW5lIEVYVDNfWEFUVFJfTUFHSUMJCTB4RUEwMjAwMDAKKworLyogTWF4aW11bSBudW1iZXIgb2YgcmVmZXJlbmNlcyB0byBvbmUgYXR0cmlidXRlIGJsb2NrICovCisjZGVmaW5lIEVYVDNfWEFUVFJfUkVGQ09VTlRfTUFYCQkxMDI0CisKKy8qIE5hbWUgaW5kZXhlcyAqLworI2RlZmluZSBFWFQzX1hBVFRSX0lOREVYX1VTRVIJCQkxCisjZGVmaW5lIEVYVDNfWEFUVFJfSU5ERVhfUE9TSVhfQUNMX0FDQ0VTUwkyCisjZGVmaW5lIEVYVDNfWEFUVFJfSU5ERVhfUE9TSVhfQUNMX0RFRkFVTFQJMworI2RlZmluZSBFWFQzX1hBVFRSX0lOREVYX1RSVVNURUQJCTQKKyNkZWZpbmUJRVhUM19YQVRUUl9JTkRFWF9MVVNUUkUJCQk1CisjZGVmaW5lIEVYVDNfWEFUVFJfSU5ERVhfU0VDVVJJVFkJICAgICAgICA2CisKK3N0cnVjdCBleHQzX3hhdHRyX2hlYWRlciB7CisJX19sZTMyCWhfbWFnaWM7CS8qIG1hZ2ljIG51bWJlciBmb3IgaWRlbnRpZmljYXRpb24gKi8KKwlfX2xlMzIJaF9yZWZjb3VudDsJLyogcmVmZXJlbmNlIGNvdW50ICovCisJX19sZTMyCWhfYmxvY2tzOwkvKiBudW1iZXIgb2YgZGlzayBibG9ja3MgdXNlZCAqLworCV9fbGUzMgloX2hhc2g7CQkvKiBoYXNoIHZhbHVlIG9mIGFsbCBhdHRyaWJ1dGVzICovCisJX191MzIJaF9yZXNlcnZlZFs0XTsJLyogemVybyByaWdodCBub3cgKi8KK307CisKK3N0cnVjdCBleHQzX3hhdHRyX2lib2R5X2hlYWRlciB7CisJX19sZTMyCWhfbWFnaWM7CS8qIG1hZ2ljIG51bWJlciBmb3IgaWRlbnRpZmljYXRpb24gKi8KK307CisKK3N0cnVjdCBleHQzX3hhdHRyX2VudHJ5IHsKKwlfX3U4CWVfbmFtZV9sZW47CS8qIGxlbmd0aCBvZiBuYW1lICovCisJX191OAllX25hbWVfaW5kZXg7CS8qIGF0dHJpYnV0ZSBuYW1lIGluZGV4ICovCisJX19sZTE2CWVfdmFsdWVfb2ZmczsJLyogb2Zmc2V0IGluIGRpc2sgYmxvY2sgb2YgdmFsdWUgKi8KKwlfX2xlMzIJZV92YWx1ZV9ibG9jazsJLyogZGlzayBibG9jayBhdHRyaWJ1dGUgaXMgc3RvcmVkIG9uIChuL2kpICovCisJX19sZTMyCWVfdmFsdWVfc2l6ZTsJLyogc2l6ZSBvZiBhdHRyaWJ1dGUgdmFsdWUgKi8KKwlfX2xlMzIJZV9oYXNoOwkJLyogaGFzaCB2YWx1ZSBvZiBuYW1lIGFuZCB2YWx1ZSAqLworCWNoYXIJZV9uYW1lWzBdOwkvKiBhdHRyaWJ1dGUgbmFtZSAqLworfTsKKworI2RlZmluZSBFWFQzX1hBVFRSX1BBRF9CSVRTCQkyCisjZGVmaW5lIEVYVDNfWEFUVFJfUEFECQkoMTw8RVhUM19YQVRUUl9QQURfQklUUykKKyNkZWZpbmUgRVhUM19YQVRUUl9ST1VORAkJKEVYVDNfWEFUVFJfUEFELTEpCisjZGVmaW5lIEVYVDNfWEFUVFJfTEVOKG5hbWVfbGVuKSBcCisJKCgobmFtZV9sZW4pICsgRVhUM19YQVRUUl9ST1VORCArIFwKKwlzaXplb2Yoc3RydWN0IGV4dDNfeGF0dHJfZW50cnkpKSAmIH5FWFQzX1hBVFRSX1JPVU5EKQorI2RlZmluZSBFWFQzX1hBVFRSX05FWFQoZW50cnkpIFwKKwkoIChzdHJ1Y3QgZXh0M194YXR0cl9lbnRyeSAqKSggXAorCSAgKGNoYXIgKikoZW50cnkpICsgRVhUM19YQVRUUl9MRU4oKGVudHJ5KS0+ZV9uYW1lX2xlbikpICkKKyNkZWZpbmUgRVhUM19YQVRUUl9TSVpFKHNpemUpIFwKKwkoKChzaXplKSArIEVYVDNfWEFUVFJfUk9VTkQpICYgfkVYVDNfWEFUVFJfUk9VTkQpCisKKyMgaWZkZWYgQ09ORklHX0VYVDNfRlNfWEFUVFIKKworZXh0ZXJuIHN0cnVjdCB4YXR0cl9oYW5kbGVyIGV4dDNfeGF0dHJfdXNlcl9oYW5kbGVyOworZXh0ZXJuIHN0cnVjdCB4YXR0cl9oYW5kbGVyIGV4dDNfeGF0dHJfdHJ1c3RlZF9oYW5kbGVyOworZXh0ZXJuIHN0cnVjdCB4YXR0cl9oYW5kbGVyIGV4dDNfeGF0dHJfYWNsX2FjY2Vzc19oYW5kbGVyOworZXh0ZXJuIHN0cnVjdCB4YXR0cl9oYW5kbGVyIGV4dDNfeGF0dHJfYWNsX2RlZmF1bHRfaGFuZGxlcjsKK2V4dGVybiBzdHJ1Y3QgeGF0dHJfaGFuZGxlciBleHQzX3hhdHRyX3NlY3VyaXR5X2hhbmRsZXI7CisKK2V4dGVybiBzc2l6ZV90IGV4dDNfbGlzdHhhdHRyKHN0cnVjdCBkZW50cnkgKiwgY2hhciAqLCBzaXplX3QpOworCitleHRlcm4gaW50IGV4dDNfeGF0dHJfZ2V0KHN0cnVjdCBpbm9kZSAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgdm9pZCAqLCBzaXplX3QpOworZXh0ZXJuIGludCBleHQzX3hhdHRyX2xpc3Qoc3RydWN0IGlub2RlICosIGNoYXIgKiwgc2l6ZV90KTsKK2V4dGVybiBpbnQgZXh0M194YXR0cl9zZXQoc3RydWN0IGlub2RlICosIGludCwgY29uc3QgY2hhciAqLCBjb25zdCB2b2lkICosIHNpemVfdCwgaW50KTsKK2V4dGVybiBpbnQgZXh0M194YXR0cl9zZXRfaGFuZGxlKGhhbmRsZV90ICosIHN0cnVjdCBpbm9kZSAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QsIGludCk7CisKK2V4dGVybiB2b2lkIGV4dDNfeGF0dHJfZGVsZXRlX2lub2RlKGhhbmRsZV90ICosIHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiB2b2lkIGV4dDNfeGF0dHJfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKKworZXh0ZXJuIGludCBpbml0X2V4dDNfeGF0dHIodm9pZCk7CitleHRlcm4gdm9pZCBleGl0X2V4dDNfeGF0dHIodm9pZCk7CisKK2V4dGVybiBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqZXh0M194YXR0cl9oYW5kbGVyc1tdOworCisjIGVsc2UgIC8qIENPTkZJR19FWFQzX0ZTX1hBVFRSICovCisKK3N0YXRpYyBpbmxpbmUgaW50CitleHQzX3hhdHRyX2dldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbmFtZV9pbmRleCwgY29uc3QgY2hhciAqbmFtZSwKKwkgICAgICAgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2V4dDNfeGF0dHJfbGlzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2V4dDNfeGF0dHJfc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBuYW1lX2luZGV4LCBjb25zdCBjaGFyICpuYW1lLAorCSAgICAgICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitleHQzX3hhdHRyX3NldF9oYW5kbGUoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5hbWVfaW5kZXgsCisJICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitleHQzX3hhdHRyX2RlbGV0ZV9pbm9kZShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2V4dDNfeGF0dHJfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Citpbml0X2V4dDNfeGF0dHIodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitleGl0X2V4dDNfeGF0dHIodm9pZCkKK3sKK30KKworI2RlZmluZSBleHQzX3hhdHRyX2hhbmRsZXJzCU5VTEwKKworIyBlbmRpZiAgLyogQ09ORklHX0VYVDNfRlNfWEFUVFIgKi8KZGlmZiAtLWdpdCBhL2ZzL2V4dDMveGF0dHJfc2VjdXJpdHkuYyBiL2ZzL2V4dDMveGF0dHJfc2VjdXJpdHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGMxYzQxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZXh0My94YXR0cl9zZWN1cml0eS5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBsaW51eC9mcy9leHQzL3hhdHRyX3NlY3VyaXR5LmMKKyAqIEhhbmRsZXIgZm9yIHN0b3Jpbmcgc2VjdXJpdHkgbGFiZWxzIGFzIGV4dGVuZGVkIGF0dHJpYnV0ZXMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9leHQzX2piZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDNfZnMuaD4KKyNpbmNsdWRlICJ4YXR0ci5oIgorCitzdGF0aWMgc2l6ZV90CitleHQzX3hhdHRyX3NlY3VyaXR5X2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwgY2hhciAqbGlzdCwgc2l6ZV90IGxpc3Rfc2l6ZSwKKwkJCSBjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZV9sZW4pCit7CisJY29uc3Qgc2l6ZV90IHByZWZpeF9sZW4gPSBzaXplb2YoWEFUVFJfU0VDVVJJVFlfUFJFRklYKS0xOworCWNvbnN0IHNpemVfdCB0b3RhbF9sZW4gPSBwcmVmaXhfbGVuICsgbmFtZV9sZW4gKyAxOworCisKKwlpZiAobGlzdCAmJiB0b3RhbF9sZW4gPD0gbGlzdF9zaXplKSB7CisJCW1lbWNweShsaXN0LCBYQVRUUl9TRUNVUklUWV9QUkVGSVgsIHByZWZpeF9sZW4pOworCQltZW1jcHkobGlzdCtwcmVmaXhfbGVuLCBuYW1lLCBuYW1lX2xlbik7CisJCWxpc3RbcHJlZml4X2xlbiArIG5hbWVfbGVuXSA9ICdcMCc7CisJfQorCXJldHVybiB0b3RhbF9sZW47Cit9CisKK3N0YXRpYyBpbnQKK2V4dDNfeGF0dHJfc2VjdXJpdHlfZ2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgICB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQoreworCWlmIChzdHJjbXAobmFtZSwgIiIpID09IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBleHQzX3hhdHRyX2dldChpbm9kZSwgRVhUM19YQVRUUl9JTkRFWF9TRUNVUklUWSwgbmFtZSwKKwkJCSAgICAgIGJ1ZmZlciwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQKK2V4dDNfeGF0dHJfc2VjdXJpdHlfc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlpZiAoc3RyY21wKG5hbWUsICIiKSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gZXh0M194YXR0cl9zZXQoaW5vZGUsIEVYVDNfWEFUVFJfSU5ERVhfU0VDVVJJVFksIG5hbWUsCisJCQkgICAgICB2YWx1ZSwgc2l6ZSwgZmxhZ3MpOworfQorCitzdHJ1Y3QgeGF0dHJfaGFuZGxlciBleHQzX3hhdHRyX3NlY3VyaXR5X2hhbmRsZXIgPSB7CisJLnByZWZpeAk9IFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCwKKwkubGlzdAk9IGV4dDNfeGF0dHJfc2VjdXJpdHlfbGlzdCwKKwkuZ2V0CT0gZXh0M194YXR0cl9zZWN1cml0eV9nZXQsCisJLnNldAk9IGV4dDNfeGF0dHJfc2VjdXJpdHlfc2V0LAorfTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDMveGF0dHJfdHJ1c3RlZC5jIGIvZnMvZXh0My94YXR0cl90cnVzdGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY4YmZkMQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDMveGF0dHJfdHJ1c3RlZC5jCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBsaW51eC9mcy9leHQzL3hhdHRyX3RydXN0ZWQuYworICogSGFuZGxlciBmb3IgdHJ1c3RlZCBleHRlbmRlZCBhdHRyaWJ1dGVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBieSBBbmRyZWFzIEdydWVuYmFjaGVyLCA8YS5ncnVlbmJhY2hlckBjb21wdXRlci5vcmc+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9leHQzX2piZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDNfZnMuaD4KKyNpbmNsdWRlICJ4YXR0ci5oIgorCisjZGVmaW5lIFhBVFRSX1RSVVNURURfUFJFRklYICJ0cnVzdGVkLiIKKworc3RhdGljIHNpemVfdAorZXh0M194YXR0cl90cnVzdGVkX2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwgY2hhciAqbGlzdCwgc2l6ZV90IGxpc3Rfc2l6ZSwKKwkJCWNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lX2xlbikKK3sKKwljb25zdCBzaXplX3QgcHJlZml4X2xlbiA9IHNpemVvZihYQVRUUl9UUlVTVEVEX1BSRUZJWCktMTsKKwljb25zdCBzaXplX3QgdG90YWxfbGVuID0gcHJlZml4X2xlbiArIG5hbWVfbGVuICsgMTsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAobGlzdCAmJiB0b3RhbF9sZW4gPD0gbGlzdF9zaXplKSB7CisJCW1lbWNweShsaXN0LCBYQVRUUl9UUlVTVEVEX1BSRUZJWCwgcHJlZml4X2xlbik7CisJCW1lbWNweShsaXN0K3ByZWZpeF9sZW4sIG5hbWUsIG5hbWVfbGVuKTsKKwkJbGlzdFtwcmVmaXhfbGVuICsgbmFtZV9sZW5dID0gJ1wwJzsKKwl9CisJcmV0dXJuIHRvdGFsX2xlbjsKK30KKworc3RhdGljIGludAorZXh0M194YXR0cl90cnVzdGVkX2dldChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgICAgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKwlpZiAoc3RyY21wKG5hbWUsICIiKSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisJcmV0dXJuIGV4dDNfeGF0dHJfZ2V0KGlub2RlLCBFWFQzX1hBVFRSX0lOREVYX1RSVVNURUQsIG5hbWUsCisJCQkgICAgICBidWZmZXIsIHNpemUpOworfQorCitzdGF0aWMgaW50CitleHQzX3hhdHRyX3RydXN0ZWRfc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlpZiAoc3RyY21wKG5hbWUsICIiKSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisJcmV0dXJuIGV4dDNfeGF0dHJfc2V0KGlub2RlLCBFWFQzX1hBVFRSX0lOREVYX1RSVVNURUQsIG5hbWUsCisJCQkgICAgICB2YWx1ZSwgc2l6ZSwgZmxhZ3MpOworfQorCitzdHJ1Y3QgeGF0dHJfaGFuZGxlciBleHQzX3hhdHRyX3RydXN0ZWRfaGFuZGxlciA9IHsKKwkucHJlZml4CT0gWEFUVFJfVFJVU1RFRF9QUkVGSVgsCisJLmxpc3QJPSBleHQzX3hhdHRyX3RydXN0ZWRfbGlzdCwKKwkuZ2V0CT0gZXh0M194YXR0cl90cnVzdGVkX2dldCwKKwkuc2V0CT0gZXh0M194YXR0cl90cnVzdGVkX3NldCwKK307CmRpZmYgLS1naXQgYS9mcy9leHQzL3hhdHRyX3VzZXIuYyBiL2ZzL2V4dDMveGF0dHJfdXNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MDdjYWUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9leHQzL3hhdHRyX3VzZXIuYwpAQCAtMCwwICsxLDc5IEBACisvKgorICogbGludXgvZnMvZXh0My94YXR0cl91c2VyLmMKKyAqIEhhbmRsZXIgZm9yIGV4dGVuZGVkIHVzZXIgYXR0cmlidXRlcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgYnkgQW5kcmVhcyBHcnVlbmJhY2hlciwgPGEuZ3J1ZW5iYWNoZXJAY29tcHV0ZXIub3JnPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZXh0M19qYmQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHQzX2ZzLmg+CisjaW5jbHVkZSAieGF0dHIuaCIKKworI2RlZmluZSBYQVRUUl9VU0VSX1BSRUZJWCAidXNlci4iCisKK3N0YXRpYyBzaXplX3QKK2V4dDNfeGF0dHJfdXNlcl9saXN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNoYXIgKmxpc3QsIHNpemVfdCBsaXN0X3NpemUsCisJCSAgICAgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQoreworCWNvbnN0IHNpemVfdCBwcmVmaXhfbGVuID0gc2l6ZW9mKFhBVFRSX1VTRVJfUFJFRklYKS0xOworCWNvbnN0IHNpemVfdCB0b3RhbF9sZW4gPSBwcmVmaXhfbGVuICsgbmFtZV9sZW4gKyAxOworCisJaWYgKCF0ZXN0X29wdChpbm9kZS0+aV9zYiwgWEFUVFJfVVNFUikpCisJCXJldHVybiAwOworCisJaWYgKGxpc3QgJiYgdG90YWxfbGVuIDw9IGxpc3Rfc2l6ZSkgeworCQltZW1jcHkobGlzdCwgWEFUVFJfVVNFUl9QUkVGSVgsIHByZWZpeF9sZW4pOworCQltZW1jcHkobGlzdCtwcmVmaXhfbGVuLCBuYW1lLCBuYW1lX2xlbik7CisJCWxpc3RbcHJlZml4X2xlbiArIG5hbWVfbGVuXSA9ICdcMCc7CisJfQorCXJldHVybiB0b3RhbF9sZW47Cit9CisKK3N0YXRpYyBpbnQKK2V4dDNfeGF0dHJfdXNlcl9nZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisJaW50IGVycm9yOworCisJaWYgKHN0cmNtcChuYW1lLCAiIikgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCF0ZXN0X29wdChpbm9kZS0+aV9zYiwgWEFUVFJfVVNFUikpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwllcnJvciA9IHBlcm1pc3Npb24oaW5vZGUsIE1BWV9SRUFELCBOVUxMKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCXJldHVybiBleHQzX3hhdHRyX2dldChpbm9kZSwgRVhUM19YQVRUUl9JTkRFWF9VU0VSLCBuYW1lLCBidWZmZXIsIHNpemUpOworfQorCitzdGF0aWMgaW50CitleHQzX3hhdHRyX3VzZXJfc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlpbnQgZXJyb3I7CisKKwlpZiAoc3RyY21wKG5hbWUsICIiKSA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIXRlc3Rfb3B0KGlub2RlLT5pX3NiLCBYQVRUUl9VU0VSKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmICggIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYKKwkgICAgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpIHx8IGlub2RlLT5pX21vZGUgJiBTX0lTVlRYKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwllcnJvciA9IHBlcm1pc3Npb24oaW5vZGUsIE1BWV9XUklURSwgTlVMTCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlyZXR1cm4gZXh0M194YXR0cl9zZXQoaW5vZGUsIEVYVDNfWEFUVFJfSU5ERVhfVVNFUiwgbmFtZSwKKwkJCSAgICAgIHZhbHVlLCBzaXplLCBmbGFncyk7Cit9CisKK3N0cnVjdCB4YXR0cl9oYW5kbGVyIGV4dDNfeGF0dHJfdXNlcl9oYW5kbGVyID0geworCS5wcmVmaXgJPSBYQVRUUl9VU0VSX1BSRUZJWCwKKwkubGlzdAk9IGV4dDNfeGF0dHJfdXNlcl9saXN0LAorCS5nZXQJPSBleHQzX3hhdHRyX3VzZXJfZ2V0LAorCS5zZXQJPSBleHQzX3hhdHRyX3VzZXJfc2V0LAorfTsKZGlmZiAtLWdpdCBhL2ZzL2ZhdC9NYWtlZmlsZSBiL2ZzL2ZhdC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmI1ZjA2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZmF0L01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IGZhdCBmaWxlc3lzdGVtIHN1cHBvcnQuCisjCisKK29iai0kKENPTkZJR19GQVRfRlMpICs9IGZhdC5vCisKK2ZhdC1vYmpzIDo9IGNhY2hlLm8gZGlyLm8gZmF0ZW50Lm8gZmlsZS5vIGlub2RlLm8gbWlzYy5vCmRpZmYgLS1naXQgYS9mcy9mYXQvY2FjaGUuYyBiL2ZzL2ZhdC9jYWNoZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNTJlNDYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9mYXQvY2FjaGUuYwpAQCAtMCwwICsxLDMyNCBAQAorLyoKKyAqICBsaW51eC9mcy9mYXQvY2FjaGUuYworICoKKyAqICBXcml0dGVuIDE5OTIsMTk5MyBieSBXZXJuZXIgQWxtZXNiZXJnZXIKKyAqCisgKiAgTWFyIDE5OTkuIEFWLiBDaGFuZ2VkIGNhY2hlLCBzbyB0aGF0IGl0IHVzZXMgdGhlIHN0YXJ0aW5nIGNsdXN0ZXIgaW5zdGVhZAorICoJb2YgaW5vZGUgbnVtYmVyLgorICogIE1heSAxOTk5LiBBVi4gRml4ZWQgdGhlIGJvZ29zaXR5IHdpdGggRkFUMzIgKHJlYWQgIkZBVDI4IikuIEZzY2tpbmcgbHVzZXJzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21zZG9zX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKworLyogdGhpcyBtdXN0IGJlID4gMC4gKi8KKyNkZWZpbmUgRkFUX01BWF9DQUNIRQk4CisKK3N0cnVjdCBmYXRfY2FjaGUgeworCXN0cnVjdCBsaXN0X2hlYWQgY2FjaGVfbGlzdDsKKwlpbnQgbnJfY29udGlnOwkvKiBudW1iZXIgb2YgY29udGlndW91cyBjbHVzdGVycyAqLworCWludCBmY2x1c3RlcjsJLyogY2x1c3RlciBudW1iZXIgaW4gdGhlIGZpbGUuICovCisJaW50IGRjbHVzdGVyOwkvKiBjbHVzdGVyIG51bWJlciBvbiBkaXNrLiAqLworfTsKKworc3RydWN0IGZhdF9jYWNoZV9pZCB7CisJdW5zaWduZWQgaW50IGlkOworCWludCBucl9jb250aWc7CisJaW50IGZjbHVzdGVyOworCWludCBkY2x1c3RlcjsKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IGZhdF9tYXhfY2FjaGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gRkFUX01BWF9DQUNIRTsKK30KKworc3RhdGljIGttZW1fY2FjaGVfdCAqZmF0X2NhY2hlX2NhY2hlcDsKKworc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKmZvbywga21lbV9jYWNoZV90ICpjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IGZhdF9jYWNoZSAqY2FjaGUgPSAoc3RydWN0IGZhdF9jYWNoZSAqKWZvbzsKKworCWlmICgoZmxhZ3MgJiAoU0xBQl9DVE9SX1ZFUklGWXxTTEFCX0NUT1JfQ09OU1RSVUNUT1IpKSA9PQorCSAgICBTTEFCX0NUT1JfQ09OU1RSVUNUT1IpCisJCUlOSVRfTElTVF9IRUFEKCZjYWNoZS0+Y2FjaGVfbGlzdCk7Cit9CisKK2ludCBfX2luaXQgZmF0X2NhY2hlX2luaXQodm9pZCkKK3sKKwlmYXRfY2FjaGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoImZhdF9jYWNoZSIsCisJCQkJc2l6ZW9mKHN0cnVjdCBmYXRfY2FjaGUpLAorCQkJCTAsIFNMQUJfUkVDTEFJTV9BQ0NPVU5ULAorCQkJCWluaXRfb25jZSwgTlVMTCk7CisJaWYgKGZhdF9jYWNoZV9jYWNoZXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX19leGl0IGZhdF9jYWNoZV9kZXN0cm95KHZvaWQpCit7CisJaWYgKGttZW1fY2FjaGVfZGVzdHJveShmYXRfY2FjaGVfY2FjaGVwKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiZmF0X2NhY2hlOiBub3QgYWxsIHN0cnVjdHVyZXMgd2VyZSBmcmVlZFxuIik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGZhdF9jYWNoZSAqZmF0X2NhY2hlX2FsbG9jKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2MoZmF0X2NhY2hlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZmF0X2NhY2hlX2ZyZWUoc3RydWN0IGZhdF9jYWNoZSAqY2FjaGUpCit7CisJQlVHX09OKCFsaXN0X2VtcHR5KCZjYWNoZS0+Y2FjaGVfbGlzdCkpOworCWttZW1fY2FjaGVfZnJlZShmYXRfY2FjaGVfY2FjaGVwLCBjYWNoZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmYXRfY2FjaGVfdXBkYXRlX2xydShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQlzdHJ1Y3QgZmF0X2NhY2hlICpjYWNoZSkKK3sKKwlpZiAoTVNET1NfSShpbm9kZSktPmNhY2hlX2xydS5uZXh0ICE9ICZjYWNoZS0+Y2FjaGVfbGlzdCkKKwkJbGlzdF9tb3ZlKCZjYWNoZS0+Y2FjaGVfbGlzdCwgJk1TRE9TX0koaW5vZGUpLT5jYWNoZV9scnUpOworfQorCitzdGF0aWMgaW50IGZhdF9jYWNoZV9sb29rdXAoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZjbHVzLAorCQkJICAgIHN0cnVjdCBmYXRfY2FjaGVfaWQgKmNpZCwKKwkJCSAgICBpbnQgKmNhY2hlZF9mY2x1cywgaW50ICpjYWNoZWRfZGNsdXMpCit7CisJc3RhdGljIHN0cnVjdCBmYXRfY2FjaGUgbm9oaXQgPSB7IC5mY2x1c3RlciA9IDAsIH07CisKKwlzdHJ1Y3QgZmF0X2NhY2hlICpoaXQgPSAmbm9oaXQsICpwOworCWludCBvZmZzZXQgPSAtMTsKKworCXNwaW5fbG9jaygmTVNET1NfSShpbm9kZSktPmNhY2hlX2xydV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZNU0RPU19JKGlub2RlKS0+Y2FjaGVfbHJ1LCBjYWNoZV9saXN0KSB7CisJCS8qIEZpbmQgdGhlIGNhY2hlIG9mICJmY2x1cyIgb3IgbmVhcmVzdCBjYWNoZS4gKi8KKwkJaWYgKHAtPmZjbHVzdGVyIDw9IGZjbHVzICYmIGhpdC0+ZmNsdXN0ZXIgPCBwLT5mY2x1c3RlcikgeworCQkJaGl0ID0gcDsKKwkJCWlmICgoaGl0LT5mY2x1c3RlciArIGhpdC0+bnJfY29udGlnKSA8IGZjbHVzKSB7CisJCQkJb2Zmc2V0ID0gaGl0LT5ucl9jb250aWc7CisJCQl9IGVsc2UgeworCQkJCW9mZnNldCA9IGZjbHVzIC0gaGl0LT5mY2x1c3RlcjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlpZiAoaGl0ICE9ICZub2hpdCkgeworCQlmYXRfY2FjaGVfdXBkYXRlX2xydShpbm9kZSwgaGl0KTsKKworCQljaWQtPmlkID0gTVNET1NfSShpbm9kZSktPmNhY2hlX3ZhbGlkX2lkOworCQljaWQtPm5yX2NvbnRpZyA9IGhpdC0+bnJfY29udGlnOworCQljaWQtPmZjbHVzdGVyID0gaGl0LT5mY2x1c3RlcjsKKwkJY2lkLT5kY2x1c3RlciA9IGhpdC0+ZGNsdXN0ZXI7CisJCSpjYWNoZWRfZmNsdXMgPSBjaWQtPmZjbHVzdGVyICsgb2Zmc2V0OworCQkqY2FjaGVkX2RjbHVzID0gY2lkLT5kY2x1c3RlciArIG9mZnNldDsKKwl9CisJc3Bpbl91bmxvY2soJk1TRE9TX0koaW5vZGUpLT5jYWNoZV9scnVfbG9jayk7CisKKwlyZXR1cm4gb2Zmc2V0OworfQorCitzdGF0aWMgc3RydWN0IGZhdF9jYWNoZSAqZmF0X2NhY2hlX21lcmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSBzdHJ1Y3QgZmF0X2NhY2hlX2lkICpuZXcpCit7CisJc3RydWN0IGZhdF9jYWNoZSAqcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocCwgJk1TRE9TX0koaW5vZGUpLT5jYWNoZV9scnUsIGNhY2hlX2xpc3QpIHsKKwkJLyogRmluZCB0aGUgc2FtZSBwYXJ0IGFzICJuZXciIGluIGNsdXN0ZXItY2hhaW4uICovCisJCWlmIChwLT5mY2x1c3RlciA9PSBuZXctPmZjbHVzdGVyKSB7CisJCQlCVUdfT04ocC0+ZGNsdXN0ZXIgIT0gbmV3LT5kY2x1c3Rlcik7CisJCQlpZiAobmV3LT5ucl9jb250aWcgPiBwLT5ucl9jb250aWcpCisJCQkJcC0+bnJfY29udGlnID0gbmV3LT5ucl9jb250aWc7CisJCQlyZXR1cm4gcDsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgZmF0X2NhY2hlX2FkZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmF0X2NhY2hlX2lkICpuZXcpCit7CisJc3RydWN0IGZhdF9jYWNoZSAqY2FjaGUsICp0bXA7CisKKwlpZiAobmV3LT5mY2x1c3RlciA9PSAtMSkgLyogZHVtbXkgY2FjaGUgKi8KKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrKCZNU0RPU19JKGlub2RlKS0+Y2FjaGVfbHJ1X2xvY2spOworCWlmIChuZXctPmlkICE9IEZBVF9DQUNIRV9WQUxJRCAmJgorCSAgICBuZXctPmlkICE9IE1TRE9TX0koaW5vZGUpLT5jYWNoZV92YWxpZF9pZCkKKwkJZ290byBvdXQ7CS8qIHRoaXMgY2FjaGUgd2FzIGludmFsaWRhdGVkICovCisKKwljYWNoZSA9IGZhdF9jYWNoZV9tZXJnZShpbm9kZSwgbmV3KTsKKwlpZiAoY2FjaGUgPT0gTlVMTCkgeworCQlpZiAoTVNET1NfSShpbm9kZSktPm5yX2NhY2hlcyA8IGZhdF9tYXhfY2FjaGUoaW5vZGUpKSB7CisJCQlNU0RPU19JKGlub2RlKS0+bnJfY2FjaGVzKys7CisJCQlzcGluX3VubG9jaygmTVNET1NfSShpbm9kZSktPmNhY2hlX2xydV9sb2NrKTsKKworCQkJdG1wID0gZmF0X2NhY2hlX2FsbG9jKGlub2RlKTsKKwkJCXNwaW5fbG9jaygmTVNET1NfSShpbm9kZSktPmNhY2hlX2xydV9sb2NrKTsKKwkJCWNhY2hlID0gZmF0X2NhY2hlX21lcmdlKGlub2RlLCBuZXcpOworCQkJaWYgKGNhY2hlICE9IE5VTEwpIHsKKwkJCQlNU0RPU19JKGlub2RlKS0+bnJfY2FjaGVzLS07CisJCQkJZmF0X2NhY2hlX2ZyZWUodG1wKTsKKwkJCQlnb3RvIG91dF91cGRhdGVfbHJ1OworCQkJfQorCQkJY2FjaGUgPSB0bXA7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgbGlzdF9oZWFkICpwID0gTVNET1NfSShpbm9kZSktPmNhY2hlX2xydS5wcmV2OworCQkJY2FjaGUgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBmYXRfY2FjaGUsIGNhY2hlX2xpc3QpOworCQl9CisJCWNhY2hlLT5mY2x1c3RlciA9IG5ldy0+ZmNsdXN0ZXI7CisJCWNhY2hlLT5kY2x1c3RlciA9IG5ldy0+ZGNsdXN0ZXI7CisJCWNhY2hlLT5ucl9jb250aWcgPSBuZXctPm5yX2NvbnRpZzsKKwl9CitvdXRfdXBkYXRlX2xydToKKwlmYXRfY2FjaGVfdXBkYXRlX2xydShpbm9kZSwgY2FjaGUpOworb3V0OgorCXNwaW5fdW5sb2NrKCZNU0RPU19JKGlub2RlKS0+Y2FjaGVfbHJ1X2xvY2spOworfQorCisvKgorICogQ2FjaGUgaW52YWxpZGF0aW9uIG9jY3VycyByYXJlbHksIHRodXMgdGhlIExSVSBjaGFpbiBpcyBub3QgdXBkYXRlZC4gSXQKKyAqIGZpeGVzIGl0c2VsZiBhZnRlciBhIHdoaWxlLgorICovCitzdGF0aWMgdm9pZCBfX2ZhdF9jYWNoZV9pbnZhbF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBtc2Rvc19pbm9kZV9pbmZvICppID0gTVNET1NfSShpbm9kZSk7CisJc3RydWN0IGZhdF9jYWNoZSAqY2FjaGU7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmktPmNhY2hlX2xydSkpIHsKKwkJY2FjaGUgPSBsaXN0X2VudHJ5KGktPmNhY2hlX2xydS5uZXh0LCBzdHJ1Y3QgZmF0X2NhY2hlLCBjYWNoZV9saXN0KTsKKwkJbGlzdF9kZWxfaW5pdCgmY2FjaGUtPmNhY2hlX2xpc3QpOworCQlpLT5ucl9jYWNoZXMtLTsKKwkJZmF0X2NhY2hlX2ZyZWUoY2FjaGUpOworCX0KKwkvKiBVcGRhdGUuIFRoZSBjb3B5IG9mIGNhY2hlcyBiZWZvcmUgdGhpcyBpZCBpcyBkaXNjYXJkZWQuICovCisJaS0+Y2FjaGVfdmFsaWRfaWQrKzsKKwlpZiAoaS0+Y2FjaGVfdmFsaWRfaWQgPT0gRkFUX0NBQ0hFX1ZBTElEKQorCQlpLT5jYWNoZV92YWxpZF9pZCsrOworfQorCit2b2lkIGZhdF9jYWNoZV9pbnZhbF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXNwaW5fbG9jaygmTVNET1NfSShpbm9kZSktPmNhY2hlX2xydV9sb2NrKTsKKwlfX2ZhdF9jYWNoZV9pbnZhbF9pbm9kZShpbm9kZSk7CisJc3Bpbl91bmxvY2soJk1TRE9TX0koaW5vZGUpLT5jYWNoZV9scnVfbG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNhY2hlX2NvbnRpZ3VvdXMoc3RydWN0IGZhdF9jYWNoZV9pZCAqY2lkLCBpbnQgZGNsdXMpCit7CisJY2lkLT5ucl9jb250aWcrKzsKKwlyZXR1cm4gKChjaWQtPmRjbHVzdGVyICsgY2lkLT5ucl9jb250aWcpID09IGRjbHVzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNhY2hlX2luaXQoc3RydWN0IGZhdF9jYWNoZV9pZCAqY2lkLCBpbnQgZmNsdXMsIGludCBkY2x1cykKK3sKKwljaWQtPmlkID0gRkFUX0NBQ0hFX1ZBTElEOworCWNpZC0+ZmNsdXN0ZXIgPSBmY2x1czsKKwljaWQtPmRjbHVzdGVyID0gZGNsdXM7CisJY2lkLT5ucl9jb250aWcgPSAwOworfQorCitpbnQgZmF0X2dldF9jbHVzdGVyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBjbHVzdGVyLCBpbnQgKmZjbHVzLCBpbnQgKmRjbHVzKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwljb25zdCBpbnQgbGltaXQgPSBzYi0+c19tYXhieXRlcyA+PiBNU0RPU19TQihzYiktPmNsdXN0ZXJfYml0czsKKwlzdHJ1Y3QgZmF0X2VudHJ5IGZhdGVudDsKKwlzdHJ1Y3QgZmF0X2NhY2hlX2lkIGNpZDsKKwlpbnQgbnI7CisKKwlCVUdfT04oTVNET1NfSShpbm9kZSktPmlfc3RhcnQgPT0gMCk7CisKKwkqZmNsdXMgPSAwOworCSpkY2x1cyA9IE1TRE9TX0koaW5vZGUpLT5pX3N0YXJ0OworCWlmIChjbHVzdGVyID09IDApCisJCXJldHVybiAwOworCisJaWYgKGZhdF9jYWNoZV9sb29rdXAoaW5vZGUsIGNsdXN0ZXIsICZjaWQsIGZjbHVzLCBkY2x1cykgPCAwKSB7CisJCS8qCisJCSAqIGR1bW15LCBhbHdheXMgbm90IGNvbnRpZ3VvdXMKKwkJICogVGhpcyBpcyByZWluaXRpYWxpemVkIGJ5IGNhY2hlX2luaXQoKSwgbGF0ZXIuCisJCSAqLworCQljYWNoZV9pbml0KCZjaWQsIC0xLCAtMSk7CisJfQorCisJZmF0ZW50X2luaXQoJmZhdGVudCk7CisJd2hpbGUgKCpmY2x1cyA8IGNsdXN0ZXIpIHsKKwkJLyogcHJldmVudCB0aGUgaW5maW5pdGUgbG9vcCBvZiBjbHVzdGVyIGNoYWluICovCisJCWlmICgqZmNsdXMgPiBsaW1pdCkgeworCQkJZmF0X2ZzX3BhbmljKHNiLCAiJXM6IGRldGVjdGVkIHRoZSBjbHVzdGVyIGNoYWluIGxvb3AiCisJCQkJICAgICAiIChpX3BvcyAlbGxkKSIsIF9fRlVOQ1RJT05fXywKKwkJCQkgICAgIE1TRE9TX0koaW5vZGUpLT5pX3Bvcyk7CisJCQluciA9IC1FSU87CisJCQlnb3RvIG91dDsKKwkJfQorCisJCW5yID0gZmF0X2VudF9yZWFkKGlub2RlLCAmZmF0ZW50LCAqZGNsdXMpOworCQlpZiAobnIgPCAwKQorCQkJZ290byBvdXQ7CisJCWVsc2UgaWYgKG5yID09IEZBVF9FTlRfRlJFRSkgeworCQkJZmF0X2ZzX3BhbmljKHNiLCAiJXM6IGludmFsaWQgY2x1c3RlciBjaGFpbiIKKwkJCQkgICAgICIgKGlfcG9zICVsbGQpIiwgX19GVU5DVElPTl9fLAorCQkJCSAgICAgTVNET1NfSShpbm9kZSktPmlfcG9zKTsKKwkJCW5yID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9IGVsc2UgaWYgKG5yID09IEZBVF9FTlRfRU9GKSB7CisJCQlmYXRfY2FjaGVfYWRkKGlub2RlLCAmY2lkKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCSgqZmNsdXMpKys7CisJCSpkY2x1cyA9IG5yOworCQlpZiAoIWNhY2hlX2NvbnRpZ3VvdXMoJmNpZCwgKmRjbHVzKSkKKwkJCWNhY2hlX2luaXQoJmNpZCwgKmZjbHVzLCAqZGNsdXMpOworCX0KKwluciA9IDA7CisJZmF0X2NhY2hlX2FkZChpbm9kZSwgJmNpZCk7CitvdXQ6CisJZmF0ZW50X2JyZWxzZSgmZmF0ZW50KTsKKwlyZXR1cm4gbnI7Cit9CisKK3N0YXRpYyBpbnQgZmF0X2JtYXBfY2x1c3RlcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgY2x1c3RlcikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJaW50IHJldCwgZmNsdXMsIGRjbHVzOworCisJaWYgKE1TRE9TX0koaW5vZGUpLT5pX3N0YXJ0ID09IDApCisJCXJldHVybiAwOworCisJcmV0ID0gZmF0X2dldF9jbHVzdGVyKGlub2RlLCBjbHVzdGVyLCAmZmNsdXMsICZkY2x1cyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJZWxzZSBpZiAocmV0ID09IEZBVF9FTlRfRU9GKSB7CisJCWZhdF9mc19wYW5pYyhzYiwgIiVzOiByZXF1ZXN0IGJleW9uZCBFT0YgKGlfcG9zICVsbGQpIiwKKwkJCSAgICAgX19GVU5DVElPTl9fLCBNU0RPU19JKGlub2RlKS0+aV9wb3MpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIGRjbHVzOworfQorCitpbnQgZmF0X2JtYXAoc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3Qgc2VjdG9yLCBzZWN0b3JfdCAqcGh5cykKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSA9IE1TRE9TX1NCKHNiKTsKKwlzZWN0b3JfdCBsYXN0X2Jsb2NrOworCWludCBjbHVzdGVyLCBvZmZzZXQ7CisKKwkqcGh5cyA9IDA7CisJaWYgKChzYmktPmZhdF9iaXRzICE9IDMyKSAmJiAoaW5vZGUtPmlfaW5vID09IE1TRE9TX1JPT1RfSU5PKSkgeworCQlpZiAoc2VjdG9yIDwgKHNiaS0+ZGlyX2VudHJpZXMgPj4gc2JpLT5kaXJfcGVyX2Jsb2NrX2JpdHMpKQorCQkJKnBoeXMgPSBzZWN0b3IgKyBzYmktPmRpcl9zdGFydDsKKwkJcmV0dXJuIDA7CisJfQorCWxhc3RfYmxvY2sgPSAoTVNET1NfSShpbm9kZSktPm1tdV9wcml2YXRlICsgKHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpKQorCQk+PiBzYi0+c19ibG9ja3NpemVfYml0czsKKwlpZiAoc2VjdG9yID49IGxhc3RfYmxvY2spCisJCXJldHVybiAwOworCisJY2x1c3RlciA9IHNlY3RvciA+PiAoc2JpLT5jbHVzdGVyX2JpdHMgLSBzYi0+c19ibG9ja3NpemVfYml0cyk7CisJb2Zmc2V0ICA9IHNlY3RvciAmIChzYmktPnNlY19wZXJfY2x1cyAtIDEpOworCWNsdXN0ZXIgPSBmYXRfYm1hcF9jbHVzdGVyKGlub2RlLCBjbHVzdGVyKTsKKwlpZiAoY2x1c3RlciA8IDApCisJCXJldHVybiBjbHVzdGVyOworCWVsc2UgaWYgKGNsdXN0ZXIpCisJCSpwaHlzID0gZmF0X2NsdXNfdG9fYmxrbnIoc2JpLCBjbHVzdGVyKSArIG9mZnNldDsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL2ZhdC9kaXIuYyBiL2ZzL2ZhdC9kaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWFlMWI3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZmF0L2Rpci5jCkBAIC0wLDAgKzEsMTI3MSBAQAorLyoKKyAqICBsaW51eC9mcy9mYXQvZGlyLmMKKyAqCisgKiAgZGlyZWN0b3J5IGhhbmRsaW5nIGZ1bmN0aW9ucyBmb3IgZmF0LWJhc2VkIGZpbGVzeXN0ZW1zCisgKgorICogIFdyaXR0ZW4gMTk5MiwxOTkzIGJ5IFdlcm5lciBBbG1lc2JlcmdlcgorICoKKyAqICBIaWRkZW4gZmlsZXMgMTk5NSBieSBBbGJlcnQgQ2FoYWxhbiA8YWxiZXJ0QGNjcy5uZXUuZWR1PiA8YWRjQGNvZS5uZXUuZWR1PgorICoKKyAqICBWRkFUIGV4dGVuc2lvbnMgYnkgR29yZG9uIENoYWZmZWUgPGNoYWZmZWVAcGxhdGVhdS5jcy5iZXJrZWxleS5lZHU+CisgKiAgTWVyZ2VkIHdpdGggbXNkb3MgZnMgYnkgSGVucmlrIFN0b3JuZXIgPHN0b3JuZXJAb3NpcmlzLnBpbmcuZGs+CisgKiAgUmV3cml0dGVuIGZvciBjb25zdGFudCBpbnVtYmVycy4gUGx1Z2dlZCBidWZmZXIgb3ZlcnJ1biBpbiByZWFkZGlyKCkuIEFWCisgKiAgU2hvcnQgbmFtZSB0cmFuc2xhdGlvbiAxOTk5LCAyMDAxIGJ5IFdvbGZyYW0gUGllbmtvc3MgPHdwQGJzemguZGU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvbXNkb3NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kaXJlbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworc3RhdGljIGlubGluZSBsb2ZmX3QgZmF0X21ha2VfaV9wb3Moc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCQkgICAgc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSAqZGUpCit7CisJcmV0dXJuICgobG9mZl90KWJoLT5iX2Jsb2NrbnIgPDwgTVNET1NfU0Ioc2IpLT5kaXJfcGVyX2Jsb2NrX2JpdHMpCisJCXwgKGRlIC0gKHN0cnVjdCBtc2Rvc19kaXJfZW50cnkgKiliaC0+Yl9kYXRhKTsKK30KKworLyogUmV0dXJucyB0aGUgaW5vZGUgbnVtYmVyIG9mIHRoZSBkaXJlY3RvcnkgZW50cnkgYXQgb2Zmc2V0IHBvcy4gSWYgYmggaXMKKyAgIG5vbi1OVUxMLCBpdCBpcyBicmVsc2UnZCBiZWZvcmUuIFBvcyBpcyBpbmNyZW1lbnRlZC4gVGhlIGJ1ZmZlciBoZWFkZXIgaXMKKyAgIHJldHVybmVkIGluIGJoLgorICAgQVYuIE1vc3Qgb2Z0ZW4gd2UgZG8gaXQgaXRlbS1ieS1pdGVtLiBNYWtlcyBzZW5zZSB0byBvcHRpbWl6ZS4KKyAgIEFWLiBPSywgdGhlcmUgd2UgZ286IGlmIGJvdGggYmggYW5kIGRlIGFyZSBub24tTlVMTCB3ZSBhc3N1bWUgdGhhdCB3ZSBqdXN0CisgICBBVi4gd2FudCB0aGUgbmV4dCBlbnRyeSAodG9vayBvbmUgZXhwbGljaXQgZGU9TlVMTCBpbiB2ZmF0L25hbWVpLmMpLgorICAgQVYuIEl0J3MgZG9uZSBpbiBmYXRfZ2V0X2VudHJ5KCkgKGlubGluZWQpLCBoZXJlIHRoZSBzbG93IGNhc2UgbGl2ZXMuCisgICBBVi4gQWRkaXRpb25hbGx5LCB3aGVuIHdlIHJldHVybiAtMSAoaS5lLiByZWFjaGVkIHRoZSBlbmQgb2YgZGlyZWN0b3J5KQorICAgQVYuIHdlIG1ha2UgYmggTlVMTC4KKyAqLworc3RhdGljIGludCBmYXRfX2dldF9lbnRyeShzdHJ1Y3QgaW5vZGUgKmRpciwgbG9mZl90ICpwb3MsCisJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJoLCBzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5ICoqZGUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRpci0+aV9zYjsKKwlzZWN0b3JfdCBwaHlzLCBpYmxvY2s7CisJaW50IG9mZnNldDsKKwlpbnQgZXJyOworCituZXh0OgorCWlmICgqYmgpCisJCWJyZWxzZSgqYmgpOworCisJKmJoID0gTlVMTDsKKwlpYmxvY2sgPSAqcG9zID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCWVyciA9IGZhdF9ibWFwKGRpciwgaWJsb2NrLCAmcGh5cyk7CisJaWYgKGVyciB8fCAhcGh5cykKKwkJcmV0dXJuIC0xOwkvKiBiZXlvbmQgRU9GIG9yIGVycm9yICovCisKKwkqYmggPSBzYl9icmVhZChzYiwgcGh5cyk7CisJaWYgKCpiaCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRkFUOiBEaXJlY3RvcnkgYnJlYWQoYmxvY2sgJWxsdSkgZmFpbGVkXG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwaHlzKTsKKwkJLyogc2tpcCB0aGlzIGJsb2NrICovCisJCSpwb3MgPSAoaWJsb2NrICsgMSkgPDwgc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJCWdvdG8gbmV4dDsKKwl9CisKKwlvZmZzZXQgPSAqcG9zICYgKHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpOworCSpwb3MgKz0gc2l6ZW9mKHN0cnVjdCBtc2Rvc19kaXJfZW50cnkpOworCSpkZSA9IChzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5ICopKCgqYmgpLT5iX2RhdGEgKyBvZmZzZXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZhdF9nZXRfZW50cnkoc3RydWN0IGlub2RlICpkaXIsIGxvZmZfdCAqcG9zLAorCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqKmJoLAorCQkJCXN0cnVjdCBtc2Rvc19kaXJfZW50cnkgKipkZSkKK3sKKwkvKiBGYXN0IHN0dWZmIGZpcnN0ICovCisJaWYgKCpiaCAmJiAqZGUgJiYKKwkgICAgKCpkZSAtIChzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5ICopKCpiaCktPmJfZGF0YSkgPCBNU0RPU19TQihkaXItPmlfc2IpLT5kaXJfcGVyX2Jsb2NrIC0gMSkgeworCQkqcG9zICs9IHNpemVvZihzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5KTsKKwkJKCpkZSkrKzsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBmYXRfX2dldF9lbnRyeShkaXIsIHBvcywgYmgsIGRlKTsKK30KKworLyoKKyAqIENvbnZlcnQgVW5pY29kZSAxNiB0byBVVEY4LCB0cmFuc2xhdGVkIFVuaWNvZGUsIG9yIEFTQ0lJLgorICogSWYgdW5pX3hsYXRlIGlzIGVuYWJsZWQgYW5kIHdlIGNhbid0IGdldCBhIDE6MSBjb252ZXJzaW9uLCB1c2UgYQorICogY29sb24gYXMgYW4gZXNjYXBlIGNoYXJhY3RlciBzaW5jZSBpdCBpcyBub3JtYWxseSBpbnZhbGlkIG9uIHRoZSB2ZmF0CisgKiBmaWxlc3lzdGVtLiBUaGUgZm9sbG93aW5nIGZvdXIgY2hhcmFjdGVycyBhcmUgdGhlIGhleGFkZWNpbWFsIGRpZ2l0cworICogb2YgVW5pY29kZSB2YWx1ZS4gVGhpcyBsZXRzIHVzIGRvIGEgZnVsbCBkdW1wIGFuZCByZXN0b3JlIG9mIFVuaWNvZGUKKyAqIGZpbGVuYW1lcy4gV2UgY291bGQgZ2V0IGludG8gc29tZSB0cm91YmxlIHdpdGggbG9uZyBVbmljb2RlIG5hbWVzLAorICogYnV0IGlnbm9yZSB0aGF0IHJpZ2h0IG5vdy4KKyAqIEFoZW0uLi4gU3RhY2sgc21hc2hpbmcgaW4gcmluZyAwIGlzbid0IGZ1bi4gRml4ZWQuCisgKi8KK3N0YXRpYyBpbnQgdW5pMTZfdG9feDgodW5zaWduZWQgY2hhciAqYXNjaWksIHdjaGFyX3QgKnVuaSwgaW50IHVuaV94bGF0ZSwKKwkJICAgICAgIHN0cnVjdCBubHNfdGFibGUgKm5scykKK3sKKwl3Y2hhcl90ICppcCwgZWM7CisJdW5zaWduZWQgY2hhciAqb3AsIG5jOworCWludCBjaGFybGVuOworCWludCBrOworCisJaXAgPSB1bmk7CisJb3AgPSBhc2NpaTsKKworCXdoaWxlICgqaXApIHsKKwkJZWMgPSAqaXArKzsKKwkJaWYgKCAoY2hhcmxlbiA9IG5scy0+dW5pMmNoYXIoZWMsIG9wLCBOTFNfTUFYX0NIQVJTRVRfU0laRSkpID4gMCkgeworCQkJb3AgKz0gY2hhcmxlbjsKKwkJfSBlbHNlIHsKKwkJCWlmICh1bmlfeGxhdGUgPT0gMSkgeworCQkJCSpvcCA9ICc6JzsKKwkJCQlmb3IgKGsgPSA0OyBrID4gMDsgay0tKSB7CisJCQkJCW5jID0gZWMgJiAweEY7CisJCQkJCW9wW2tdID0gbmMgPiA5CT8gbmMgKyAoJ2EnIC0gMTApCisJCQkJCQkJOiBuYyArICcwJzsKKwkJCQkJZWMgPj49IDQ7CisJCQkJfQorCQkJCW9wICs9IDU7CisJCQl9IGVsc2UgeworCQkJCSpvcCsrID0gJz8nOworCQkJfQorCQl9CisJCS8qIFdlIGhhdmUgc29tZSBzbGFjayB0aGVyZSwgc28gaXQncyBPSyAqLworCQlpZiAob3A+YXNjaWkrMjU2KSB7CisJCQlvcCA9IGFzY2lpICsgMjU2OworCQkJYnJlYWs7CisJCX0KKwl9CisJKm9wID0gMDsKKwlyZXR1cm4gKG9wIC0gYXNjaWkpOworfQorCitzdGF0aWMgaW5saW5lIGludAorZmF0X3Nob3J0MnVuaShzdHJ1Y3QgbmxzX3RhYmxlICp0LCB1bnNpZ25lZCBjaGFyICpjLCBpbnQgY2xlbiwgd2NoYXJfdCAqdW5pKQoreworCWludCBjaGFybGVuOworCisJY2hhcmxlbiA9IHQtPmNoYXIydW5pKGMsIGNsZW4sIHVuaSk7CisJaWYgKGNoYXJsZW4gPCAwKSB7CisJCSp1bmkgPSAweDAwM2Y7CS8qIGEgcXVlc3Rpb24gbWFyayAqLworCQljaGFybGVuID0gMTsKKwl9CisJcmV0dXJuIGNoYXJsZW47Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitmYXRfc2hvcnQybG93ZXJfdW5pKHN0cnVjdCBubHNfdGFibGUgKnQsIHVuc2lnbmVkIGNoYXIgKmMsIGludCBjbGVuLCB3Y2hhcl90ICp1bmkpCit7CisJaW50IGNoYXJsZW47CisJd2NoYXJfdCB3YzsKKworCWNoYXJsZW4gPSB0LT5jaGFyMnVuaShjLCBjbGVuLCAmd2MpOworCWlmIChjaGFybGVuIDwgMCkgeworCQkqdW5pID0gMHgwMDNmOwkvKiBhIHF1ZXN0aW9uIG1hcmsgKi8KKwkJY2hhcmxlbiA9IDE7CisJfSBlbHNlIGlmIChjaGFybGVuIDw9IDEpIHsKKwkJdW5zaWduZWQgY2hhciBuYyA9IHQtPmNoYXJzZXQybG93ZXJbKmNdOworCisJCWlmICghbmMpCisJCQluYyA9ICpjOworCisJCWlmICggKGNoYXJsZW4gPSB0LT5jaGFyMnVuaSgmbmMsIDEsIHVuaSkpIDwgMCkgeworCQkJKnVuaSA9IDB4MDAzZjsJLyogYSBxdWVzdGlvbiBtYXJrICovCisJCQljaGFybGVuID0gMTsKKwkJfQorCX0gZWxzZQorCQkqdW5pID0gd2M7CisKKwlyZXR1cm4gY2hhcmxlbjsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2ZhdF9zaG9ydG5hbWUydW5pKHN0cnVjdCBubHNfdGFibGUgKm5scywgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgYnVmX3NpemUsCisJCSAgd2NoYXJfdCAqdW5pX2J1ZiwgdW5zaWduZWQgc2hvcnQgb3B0LCBpbnQgbG93ZXIpCit7CisJaW50IGxlbiA9IDA7CisKKwlpZiAob3B0ICYgVkZBVF9TRk5fRElTUExBWV9MT1dFUikKKwkJbGVuID0gIGZhdF9zaG9ydDJsb3dlcl91bmkobmxzLCBidWYsIGJ1Zl9zaXplLCB1bmlfYnVmKTsKKwllbHNlIGlmIChvcHQgJiBWRkFUX1NGTl9ESVNQTEFZX1dJTjk1KQorCQlsZW4gPSBmYXRfc2hvcnQydW5pKG5scywgYnVmLCBidWZfc2l6ZSwgdW5pX2J1Zik7CisJZWxzZSBpZiAob3B0ICYgVkZBVF9TRk5fRElTUExBWV9XSU5OVCkgeworCQlpZiAobG93ZXIpCisJCQlsZW4gPSBmYXRfc2hvcnQybG93ZXJfdW5pKG5scywgYnVmLCBidWZfc2l6ZSwgdW5pX2J1Zik7CisJCWVsc2UKKwkJCWxlbiA9IGZhdF9zaG9ydDJ1bmkobmxzLCBidWYsIGJ1Zl9zaXplLCB1bmlfYnVmKTsKKwl9IGVsc2UKKwkJbGVuID0gZmF0X3Nob3J0MnVuaShubHMsIGJ1ZiwgYnVmX3NpemUsIHVuaV9idWYpOworCisJcmV0dXJuIGxlbjsKK30KKworLyoKKyAqIFJldHVybiB2YWx1ZXM6IG5lZ2F0aXZlIC0+IGVycm9yLCAwIC0+IG5vdCBmb3VuZCwgcG9zaXRpdmUgLT4gZm91bmQsCisgKiB2YWx1ZSBpcyB0aGUgdG90YWwgYW1vdW50IG9mIHNsb3RzLCBpbmNsdWRpbmcgdGhlIHNob3J0bmFtZSBlbnRyeS4KKyAqLworaW50IGZhdF9zZWFyY2hfbG9uZyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lLAorCQkgICAgaW50IG5hbWVfbGVuLCBzdHJ1Y3QgZmF0X3Nsb3RfaW5mbyAqc2luZm8pCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBtc2Rvc19zYl9pbmZvICpzYmkgPSBNU0RPU19TQihzYik7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSAqZGU7CisJc3RydWN0IG5sc190YWJsZSAqbmxzX2lvID0gc2JpLT5ubHNfaW87CisJc3RydWN0IG5sc190YWJsZSAqbmxzX2Rpc2sgPSBzYmktPm5sc19kaXNrOworCXdjaGFyX3QgYnVmdW5hbWVbMTRdOworCXVuc2lnbmVkIGNoYXIgeGxhdGVfbGVuLCBucl9zbG90czsKKwl3Y2hhcl90ICp1bmljb2RlID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyIHdvcmtbOF0sIGJ1Zm5hbWVbMjYwXTsJLyogMjU2ICsgNCAqLworCWludCB1bmlfeGxhdGUgPSBzYmktPm9wdGlvbnMudW5pY29kZV94bGF0ZTsKKwlpbnQgdXRmOCA9IHNiaS0+b3B0aW9ucy51dGY4OworCWludCBhbnljYXNlID0gKHNiaS0+b3B0aW9ucy5uYW1lX2NoZWNrICE9ICdzJyk7CisJdW5zaWduZWQgc2hvcnQgb3B0X3Nob3J0bmFtZSA9IHNiaS0+b3B0aW9ucy5zaG9ydG5hbWU7CisJbG9mZl90IGNwb3MgPSAwOworCWludCBjaGwsIGksIGosIGxhc3RfdSwgZXJyOworCisJZXJyID0gLUVOT0VOVDsKKwl3aGlsZSgxKSB7CisJCWlmIChmYXRfZ2V0X2VudHJ5KGlub2RlLCAmY3BvcywgJmJoLCAmZGUpID09IC0xKQorCQkJZ290byBFT0RpcjsKK3BhcnNlX3JlY29yZDoKKwkJbnJfc2xvdHMgPSAwOworCQlpZiAoZGUtPm5hbWVbMF0gPT0gREVMRVRFRF9GTEFHKQorCQkJY29udGludWU7CisJCWlmIChkZS0+YXR0ciAhPSBBVFRSX0VYVCAmJiAoZGUtPmF0dHIgJiBBVFRSX1ZPTFVNRSkpCisJCQljb250aW51ZTsKKwkJaWYgKGRlLT5hdHRyICE9IEFUVFJfRVhUICYmIElTX0ZSRUUoZGUtPm5hbWUpKQorCQkJY29udGludWU7CisJCWlmIChkZS0+YXR0ciA9PSBBVFRSX0VYVCkgeworCQkJc3RydWN0IG1zZG9zX2Rpcl9zbG90ICpkczsKKwkJCXVuc2lnbmVkIGNoYXIgaWQ7CisJCQl1bnNpZ25lZCBjaGFyIHNsb3Q7CisJCQl1bnNpZ25lZCBjaGFyIHNsb3RzOworCQkJdW5zaWduZWQgY2hhciBzdW07CisJCQl1bnNpZ25lZCBjaGFyIGFsaWFzX2NoZWNrc3VtOworCisJCQlpZiAoIXVuaWNvZGUpIHsKKwkJCQl1bmljb2RlID0gKHdjaGFyX3QgKikKKwkJCQkJX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCQkJCWlmICghdW5pY29kZSkgeworCQkJCQlicmVsc2UoYmgpOworCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQl9CisJCQl9CitwYXJzZV9sb25nOgorCQkJc2xvdHMgPSAwOworCQkJZHMgPSAoc3RydWN0IG1zZG9zX2Rpcl9zbG90ICopIGRlOworCQkJaWQgPSBkcy0+aWQ7CisJCQlpZiAoIShpZCAmIDB4NDApKQorCQkJCWNvbnRpbnVlOworCQkJc2xvdHMgPSBpZCAmIH4weDQwOworCQkJaWYgKHNsb3RzID4gMjAgfHwgIXNsb3RzKQkvKiBjZWlsKDI1NiAqIDIgLyAyNikgKi8KKwkJCQljb250aW51ZTsKKwkJCW5yX3Nsb3RzID0gc2xvdHM7CisJCQlhbGlhc19jaGVja3N1bSA9IGRzLT5hbGlhc19jaGVja3N1bTsKKworCQkJc2xvdCA9IHNsb3RzOworCQkJd2hpbGUgKDEpIHsKKwkJCQlpbnQgb2Zmc2V0OworCisJCQkJc2xvdC0tOworCQkJCW9mZnNldCA9IHNsb3QgKiAxMzsKKwkJCQlmYXQxNl90b3djaGFyKHVuaWNvZGUgKyBvZmZzZXQsIGRzLT5uYW1lMF80LCA1KTsKKwkJCQlmYXQxNl90b3djaGFyKHVuaWNvZGUgKyBvZmZzZXQgKyA1LCBkcy0+bmFtZTVfMTAsIDYpOworCQkJCWZhdDE2X3Rvd2NoYXIodW5pY29kZSArIG9mZnNldCArIDExLCBkcy0+bmFtZTExXzEyLCAyKTsKKworCQkJCWlmIChkcy0+aWQgJiAweDQwKSB7CisJCQkJCXVuaWNvZGVbb2Zmc2V0ICsgMTNdID0gMDsKKwkJCQl9CisJCQkJaWYgKGZhdF9nZXRfZW50cnkoaW5vZGUsICZjcG9zLCAmYmgsICZkZSkgPCAwKQorCQkJCQlnb3RvIEVPRGlyOworCQkJCWlmIChzbG90ID09IDApCisJCQkJCWJyZWFrOworCQkJCWRzID0gKHN0cnVjdCBtc2Rvc19kaXJfc2xvdCAqKSBkZTsKKwkJCQlpZiAoZHMtPmF0dHIgIT0gIEFUVFJfRVhUKQorCQkJCQlnb3RvIHBhcnNlX3JlY29yZDsKKwkJCQlpZiAoKGRzLT5pZCAmIH4weDQwKSAhPSBzbG90KQorCQkJCQlnb3RvIHBhcnNlX2xvbmc7CisJCQkJaWYgKGRzLT5hbGlhc19jaGVja3N1bSAhPSBhbGlhc19jaGVja3N1bSkKKwkJCQkJZ290byBwYXJzZV9sb25nOworCQkJfQorCQkJaWYgKGRlLT5uYW1lWzBdID09IERFTEVURURfRkxBRykKKwkJCQljb250aW51ZTsKKwkJCWlmIChkZS0+YXR0ciA9PSAgQVRUUl9FWFQpCisJCQkJZ290byBwYXJzZV9sb25nOworCQkJaWYgKElTX0ZSRUUoZGUtPm5hbWUpIHx8IChkZS0+YXR0ciAmIEFUVFJfVk9MVU1FKSkKKwkJCQljb250aW51ZTsKKwkJCWZvciAoc3VtID0gMCwgaSA9IDA7IGkgPCAxMTsgaSsrKQorCQkJCXN1bSA9ICgoKHN1bSYxKTw8Nyl8KChzdW0mMHhmZSk+PjEpKSArIGRlLT5uYW1lW2ldOworCQkJaWYgKHN1bSAhPSBhbGlhc19jaGVja3N1bSkKKwkJCQlucl9zbG90cyA9IDA7CisJCX0KKworCQltZW1jcHkod29yaywgZGUtPm5hbWUsIHNpemVvZihkZS0+bmFtZSkpOworCQkvKiBzZWUgbmFtZWkuYywgbXNkb3NfZm9ybWF0X25hbWUgKi8KKwkJaWYgKHdvcmtbMF0gPT0gMHgwNSkKKwkJCXdvcmtbMF0gPSAweEU1OworCQlmb3IgKGkgPSAwLCBqID0gMCwgbGFzdF91ID0gMDsgaSA8IDg7KSB7CisJCQlpZiAoIXdvcmtbaV0pIGJyZWFrOworCQkJY2hsID0gZmF0X3Nob3J0bmFtZTJ1bmkobmxzX2Rpc2ssICZ3b3JrW2ldLCA4IC0gaSwKKwkJCQkJCSZidWZ1bmFtZVtqKytdLCBvcHRfc2hvcnRuYW1lLAorCQkJCQkJZGUtPmxjYXNlICYgQ0FTRV9MT1dFUl9CQVNFKTsKKwkJCWlmIChjaGwgPD0gMSkgeworCQkJCWlmICh3b3JrW2ldICE9ICcgJykKKwkJCQkJbGFzdF91ID0gajsKKwkJCX0gZWxzZSB7CisJCQkJbGFzdF91ID0gajsKKwkJCX0KKwkJCWkgKz0gY2hsOworCQl9CisJCWogPSBsYXN0X3U7CisJCWZhdF9zaG9ydDJ1bmkobmxzX2Rpc2ssICIuIiwgMSwgJmJ1ZnVuYW1lW2orK10pOworCQlmb3IgKGkgPSAwOyBpIDwgMzspIHsKKwkJCWlmICghZGUtPmV4dFtpXSkgYnJlYWs7CisJCQljaGwgPSBmYXRfc2hvcnRuYW1lMnVuaShubHNfZGlzaywgJmRlLT5leHRbaV0sIDMgLSBpLAorCQkJCQkJJmJ1ZnVuYW1lW2orK10sIG9wdF9zaG9ydG5hbWUsCisJCQkJCQlkZS0+bGNhc2UgJiBDQVNFX0xPV0VSX0VYVCk7CisJCQlpZiAoY2hsIDw9IDEpIHsKKwkJCQlpZiAoZGUtPmV4dFtpXSAhPSAnICcpCisJCQkJCWxhc3RfdSA9IGo7CisJCQl9IGVsc2UgeworCQkJCWxhc3RfdSA9IGo7CisJCQl9CisJCQlpICs9IGNobDsKKwkJfQorCQlpZiAoIWxhc3RfdSkKKwkJCWNvbnRpbnVlOworCisJCWJ1ZnVuYW1lW2xhc3RfdV0gPSAweDAwMDA7CisJCXhsYXRlX2xlbiA9IHV0ZjgKKwkJCT91dGY4X3djc3RvbWJzKGJ1Zm5hbWUsIGJ1ZnVuYW1lLCBzaXplb2YoYnVmbmFtZSkpCisJCQk6dW5pMTZfdG9feDgoYnVmbmFtZSwgYnVmdW5hbWUsIHVuaV94bGF0ZSwgbmxzX2lvKTsKKwkJaWYgKHhsYXRlX2xlbiA9PSBuYW1lX2xlbikKKwkJCWlmICgoIWFueWNhc2UgJiYgIW1lbWNtcChuYW1lLCBidWZuYW1lLCB4bGF0ZV9sZW4pKSB8fAorCQkJICAgIChhbnljYXNlICYmICFubHNfc3RybmljbXAobmxzX2lvLCBuYW1lLCBidWZuYW1lLAorCQkJCQkJCQl4bGF0ZV9sZW4pKSkKKwkJCQlnb3RvIEZvdW5kOworCisJCWlmIChucl9zbG90cykgeworCQkJeGxhdGVfbGVuID0gdXRmOAorCQkJCT91dGY4X3djc3RvbWJzKGJ1Zm5hbWUsIHVuaWNvZGUsIHNpemVvZihidWZuYW1lKSkKKwkJCQk6dW5pMTZfdG9feDgoYnVmbmFtZSwgdW5pY29kZSwgdW5pX3hsYXRlLCBubHNfaW8pOworCQkJaWYgKHhsYXRlX2xlbiAhPSBuYW1lX2xlbikKKwkJCQljb250aW51ZTsKKwkJCWlmICgoIWFueWNhc2UgJiYgIW1lbWNtcChuYW1lLCBidWZuYW1lLCB4bGF0ZV9sZW4pKSB8fAorCQkJICAgIChhbnljYXNlICYmICFubHNfc3RybmljbXAobmxzX2lvLCBuYW1lLCBidWZuYW1lLAorCQkJCQkJCQl4bGF0ZV9sZW4pKSkKKwkJCQlnb3RvIEZvdW5kOworCQl9CisJfQorCitGb3VuZDoKKwlucl9zbG90cysrOwkvKiBpbmNsdWRlIHRoZSBkZSAqLworCXNpbmZvLT5zbG90X29mZiA9IGNwb3MgLSBucl9zbG90cyAqIHNpemVvZigqZGUpOworCXNpbmZvLT5ucl9zbG90cyA9IG5yX3Nsb3RzOworCXNpbmZvLT5kZSA9IGRlOworCXNpbmZvLT5iaCA9IGJoOworCXNpbmZvLT5pX3BvcyA9IGZhdF9tYWtlX2lfcG9zKHNiLCBzaW5mby0+YmgsIHNpbmZvLT5kZSk7CisJZXJyID0gMDsKK0VPRGlyOgorCWlmICh1bmljb2RlKQorCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdW5pY29kZSk7CisKKwlyZXR1cm4gZXJyOworfQorCitFWFBPUlRfU1lNQk9MKGZhdF9zZWFyY2hfbG9uZyk7CisKK3N0cnVjdCBmYXRfaW9jdGxfZmlsbGRpcl9jYWxsYmFjayB7CisJc3RydWN0IGRpcmVudCBfX3VzZXIgKmRpcmVudDsKKwlpbnQgcmVzdWx0OworCS8qIGZvciBkaXIgaW9jdGwgKi8KKwljb25zdCBjaGFyICpsb25nbmFtZTsKKwlpbnQgbG9uZ19sZW47CisJY29uc3QgY2hhciAqc2hvcnRuYW1lOworCWludCBzaG9ydF9sZW47Cit9OworCitzdGF0aWMgaW50IGZhdF9yZWFkZGlyeChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LAorCQkJZmlsbGRpcl90IGZpbGxkaXIsIGludCBzaG9ydF9vbmx5LCBpbnQgYm90aCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSA9IE1TRE9TX1NCKHNiKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBtc2Rvc19kaXJfZW50cnkgKmRlOworCXN0cnVjdCBubHNfdGFibGUgKm5sc19pbyA9IHNiaS0+bmxzX2lvOworCXN0cnVjdCBubHNfdGFibGUgKm5sc19kaXNrID0gc2JpLT5ubHNfZGlzazsKKwl1bnNpZ25lZCBjaGFyIGxvbmdfc2xvdHM7CisJY29uc3QgY2hhciAqZmlsbF9uYW1lOworCWludCBmaWxsX2xlbjsKKwl3Y2hhcl90IGJ1ZnVuYW1lWzE0XTsKKwl3Y2hhcl90ICp1bmljb2RlID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyIGMsIHdvcmtbOF0sIGJ1Zm5hbWVbNTZdLCAqcHRuYW1lID0gYnVmbmFtZTsKKwl1bnNpZ25lZCBsb25nIGxwb3MsIGR1bW15LCAqZnVycmZ1ID0gJmxwb3M7CisJaW50IHVuaV94bGF0ZSA9IHNiaS0+b3B0aW9ucy51bmljb2RlX3hsYXRlOworCWludCBpc3ZmYXQgPSBzYmktPm9wdGlvbnMuaXN2ZmF0OworCWludCB1dGY4ID0gc2JpLT5vcHRpb25zLnV0Zjg7CisJaW50IG5vY2FzZSA9IHNiaS0+b3B0aW9ucy5ub2Nhc2U7CisJdW5zaWduZWQgc2hvcnQgb3B0X3Nob3J0bmFtZSA9IHNiaS0+b3B0aW9ucy5zaG9ydG5hbWU7CisJdW5zaWduZWQgbG9uZyBpbnVtOworCWludCBjaGksIGNobCwgaSwgaTIsIGosIGxhc3QsIGxhc3RfdSwgZG90b2Zmc2V0ID0gMDsKKwlsb2ZmX3QgY3BvczsKKwlpbnQgcmV0ID0gMDsKKworCWxvY2tfa2VybmVsKCk7CisKKwljcG9zID0gZmlscC0+Zl9wb3M7CisJLyogRmFrZSAuIGFuZCAuLiBmb3IgdGhlIHJvb3QgZGlyZWN0b3J5LiAqLworCWlmIChpbm9kZS0+aV9pbm8gPT0gTVNET1NfUk9PVF9JTk8pIHsKKwkJd2hpbGUgKGNwb3MgPCAyKSB7CisJCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuLiIsIGNwb3MrMSwgY3BvcywgTVNET1NfUk9PVF9JTk8sIERUX0RJUikgPCAwKQorCQkJCWdvdG8gb3V0OworCQkJY3BvcysrOworCQkJZmlscC0+Zl9wb3MrKzsKKwkJfQorCQlpZiAoY3BvcyA9PSAyKSB7CisJCQlkdW1teSA9IDI7CisJCQlmdXJyZnUgPSAmZHVtbXk7CisJCQljcG9zID0gMDsKKwkJfQorCX0KKwlpZiAoY3BvcyAmIChzaXplb2Yoc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSktMSkpIHsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBvdXQ7CisJfQorCisJYmggPSBOVUxMOworR2V0TmV3OgorCWxvbmdfc2xvdHMgPSAwOworCWlmIChmYXRfZ2V0X2VudHJ5KGlub2RlLCAmY3BvcywgJmJoLCAmZGUpID09IC0xKQorCQlnb3RvIEVPRGlyOworCS8qIENoZWNrIGZvciBsb25nIGZpbGVuYW1lIGVudHJ5ICovCisJaWYgKGlzdmZhdCkgeworCQlpZiAoZGUtPm5hbWVbMF0gPT0gREVMRVRFRF9GTEFHKQorCQkJZ290byBSZWNFbmQ7CisJCWlmIChkZS0+YXR0ciAhPSBBVFRSX0VYVCAmJiAoZGUtPmF0dHIgJiBBVFRSX1ZPTFVNRSkpCisJCQlnb3RvIFJlY0VuZDsKKwkJaWYgKGRlLT5hdHRyICE9IEFUVFJfRVhUICYmIElTX0ZSRUUoZGUtPm5hbWUpKQorCQkJZ290byBSZWNFbmQ7CisJfSBlbHNlIHsKKwkJaWYgKChkZS0+YXR0ciAmIEFUVFJfVk9MVU1FKSB8fCBJU19GUkVFKGRlLT5uYW1lKSkKKwkJCWdvdG8gUmVjRW5kOworCX0KKworCWlmIChpc3ZmYXQgJiYgZGUtPmF0dHIgPT0gQVRUUl9FWFQpIHsKKwkJc3RydWN0IG1zZG9zX2Rpcl9zbG90ICpkczsKKwkJdW5zaWduZWQgY2hhciBpZDsKKwkJdW5zaWduZWQgY2hhciBzbG90OworCQl1bnNpZ25lZCBjaGFyIHNsb3RzOworCQl1bnNpZ25lZCBjaGFyIHN1bTsKKwkJdW5zaWduZWQgY2hhciBhbGlhc19jaGVja3N1bTsKKworCQlpZiAoIXVuaWNvZGUpIHsKKwkJCXVuaWNvZGUgPSAod2NoYXJfdCAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwkJCWlmICghdW5pY29kZSkgeworCQkJCWZpbHAtPmZfcG9zID0gY3BvczsKKwkJCQlicmVsc2UoYmgpOworCQkJCXJldCA9IC1FTk9NRU07CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KK1BhcnNlTG9uZzoKKwkJc2xvdHMgPSAwOworCQlkcyA9IChzdHJ1Y3QgbXNkb3NfZGlyX3Nsb3QgKikgZGU7CisJCWlkID0gZHMtPmlkOworCQlpZiAoIShpZCAmIDB4NDApKQorCQkJZ290byBSZWNFbmQ7CisJCXNsb3RzID0gaWQgJiB+MHg0MDsKKwkJaWYgKHNsb3RzID4gMjAgfHwgIXNsb3RzKQkvKiBjZWlsKDI1NiAqIDIgLyAyNikgKi8KKwkJCWdvdG8gUmVjRW5kOworCQlsb25nX3Nsb3RzID0gc2xvdHM7CisJCWFsaWFzX2NoZWNrc3VtID0gZHMtPmFsaWFzX2NoZWNrc3VtOworCisJCXNsb3QgPSBzbG90czsKKwkJd2hpbGUgKDEpIHsKKwkJCWludCBvZmZzZXQ7CisKKwkJCXNsb3QtLTsKKwkJCW9mZnNldCA9IHNsb3QgKiAxMzsKKwkJCWZhdDE2X3Rvd2NoYXIodW5pY29kZSArIG9mZnNldCwgZHMtPm5hbWUwXzQsIDUpOworCQkJZmF0MTZfdG93Y2hhcih1bmljb2RlICsgb2Zmc2V0ICsgNSwgZHMtPm5hbWU1XzEwLCA2KTsKKwkJCWZhdDE2X3Rvd2NoYXIodW5pY29kZSArIG9mZnNldCArIDExLCBkcy0+bmFtZTExXzEyLCAyKTsKKworCQkJaWYgKGRzLT5pZCAmIDB4NDApIHsKKwkJCQl1bmljb2RlW29mZnNldCArIDEzXSA9IDA7CisJCQl9CisJCQlpZiAoZmF0X2dldF9lbnRyeShpbm9kZSwgJmNwb3MsICZiaCwgJmRlKSA9PSAtMSkKKwkJCQlnb3RvIEVPRGlyOworCQkJaWYgKHNsb3QgPT0gMCkKKwkJCQlicmVhazsKKwkJCWRzID0gKHN0cnVjdCBtc2Rvc19kaXJfc2xvdCAqKSBkZTsKKwkJCWlmIChkcy0+YXR0ciAhPSAgQVRUUl9FWFQpCisJCQkJZ290byBSZWNFbmQ7CS8qIFhYWCAqLworCQkJaWYgKChkcy0+aWQgJiB+MHg0MCkgIT0gc2xvdCkKKwkJCQlnb3RvIFBhcnNlTG9uZzsKKwkJCWlmIChkcy0+YWxpYXNfY2hlY2tzdW0gIT0gYWxpYXNfY2hlY2tzdW0pCisJCQkJZ290byBQYXJzZUxvbmc7CisJCX0KKwkJaWYgKGRlLT5uYW1lWzBdID09IERFTEVURURfRkxBRykKKwkJCWdvdG8gUmVjRW5kOworCQlpZiAoZGUtPmF0dHIgPT0gIEFUVFJfRVhUKQorCQkJZ290byBQYXJzZUxvbmc7CisJCWlmIChJU19GUkVFKGRlLT5uYW1lKSB8fCAoZGUtPmF0dHIgJiBBVFRSX1ZPTFVNRSkpCisJCQlnb3RvIFJlY0VuZDsKKwkJZm9yIChzdW0gPSAwLCBpID0gMDsgaSA8IDExOyBpKyspCisJCQlzdW0gPSAoKChzdW0mMSk8PDcpfCgoc3VtJjB4ZmUpPj4xKSkgKyBkZS0+bmFtZVtpXTsKKwkJaWYgKHN1bSAhPSBhbGlhc19jaGVja3N1bSkKKwkJCWxvbmdfc2xvdHMgPSAwOworCX0KKworCWlmIChzYmktPm9wdGlvbnMuZG90c09LKSB7CisJCXB0bmFtZSA9IGJ1Zm5hbWU7CisJCWRvdG9mZnNldCA9IDA7CisJCWlmIChkZS0+YXR0ciAmIEFUVFJfSElEREVOKSB7CisJCQkqcHRuYW1lKysgPSAnLic7CisJCQlkb3RvZmZzZXQgPSAxOworCQl9CisJfQorCisJbWVtY3B5KHdvcmssIGRlLT5uYW1lLCBzaXplb2YoZGUtPm5hbWUpKTsKKwkvKiBzZWUgbmFtZWkuYywgbXNkb3NfZm9ybWF0X25hbWUgKi8KKwlpZiAod29ya1swXSA9PSAweDA1KQorCQl3b3JrWzBdID0gMHhFNTsKKwlmb3IgKGkgPSAwLCBqID0gMCwgbGFzdCA9IDAsIGxhc3RfdSA9IDA7IGkgPCA4OykgeworCQlpZiAoIShjID0gd29ya1tpXSkpIGJyZWFrOworCQljaGwgPSBmYXRfc2hvcnRuYW1lMnVuaShubHNfZGlzaywgJndvcmtbaV0sIDggLSBpLAorCQkJCQkmYnVmdW5hbWVbaisrXSwgb3B0X3Nob3J0bmFtZSwKKwkJCQkJZGUtPmxjYXNlICYgQ0FTRV9MT1dFUl9CQVNFKTsKKwkJaWYgKGNobCA8PSAxKSB7CisJCQlwdG5hbWVbaSsrXSA9ICghbm9jYXNlICYmIGM+PSdBJyAmJiBjPD0nWicpID8gYyszMiA6IGM7CisJCQlpZiAoYyAhPSAnICcpIHsKKwkJCQlsYXN0ID0gaTsKKwkJCQlsYXN0X3UgPSBqOworCQkJfQorCQl9IGVsc2UgeworCQkJbGFzdF91ID0gajsKKwkJCWZvciAoY2hpID0gMDsgY2hpIDwgY2hsICYmIGkgPCA4OyBjaGkrKykgeworCQkJCXB0bmFtZVtpXSA9IHdvcmtbaV07CisJCQkJaSsrOyBsYXN0ID0gaTsKKwkJCX0KKwkJfQorCX0KKwlpID0gbGFzdDsKKwlqID0gbGFzdF91OworCWZhdF9zaG9ydDJ1bmkobmxzX2Rpc2ssICIuIiwgMSwgJmJ1ZnVuYW1lW2orK10pOworCXB0bmFtZVtpKytdID0gJy4nOworCWZvciAoaTIgPSAwOyBpMiA8IDM7KSB7CisJCWlmICghKGMgPSBkZS0+ZXh0W2kyXSkpIGJyZWFrOworCQljaGwgPSBmYXRfc2hvcnRuYW1lMnVuaShubHNfZGlzaywgJmRlLT5leHRbaTJdLCAzIC0gaTIsCisJCQkJCSZidWZ1bmFtZVtqKytdLCBvcHRfc2hvcnRuYW1lLAorCQkJCQlkZS0+bGNhc2UgJiBDQVNFX0xPV0VSX0VYVCk7CisJCWlmIChjaGwgPD0gMSkgeworCQkJaTIrKzsKKwkJCXB0bmFtZVtpKytdID0gKCFub2Nhc2UgJiYgYz49J0EnICYmIGM8PSdaJykgPyBjKzMyIDogYzsKKwkJCWlmIChjICE9ICcgJykgeworCQkJCWxhc3QgPSBpOworCQkJCWxhc3RfdSA9IGo7CisJCQl9CisJCX0gZWxzZSB7CisJCQlsYXN0X3UgPSBqOworCQkJZm9yIChjaGkgPSAwOyBjaGkgPCBjaGwgJiYgaTIgPCAzOyBjaGkrKykgeworCQkJCXB0bmFtZVtpKytdID0gZGUtPmV4dFtpMisrXTsKKwkJCQlsYXN0ID0gaTsKKwkJCX0KKwkJfQorCX0KKwlpZiAoIWxhc3QpCisJCWdvdG8gUmVjRW5kOworCisJaSA9IGxhc3QgKyBkb3RvZmZzZXQ7CisJaiA9IGxhc3RfdTsKKworCWxwb3MgPSBjcG9zIC0gKGxvbmdfc2xvdHMrMSkqc2l6ZW9mKHN0cnVjdCBtc2Rvc19kaXJfZW50cnkpOworCWlmICghbWVtY21wKGRlLT5uYW1lLCBNU0RPU19ET1QsIE1TRE9TX05BTUUpKQorCQlpbnVtID0gaW5vZGUtPmlfaW5vOworCWVsc2UgaWYgKCFtZW1jbXAoZGUtPm5hbWUsIE1TRE9TX0RPVERPVCwgTVNET1NfTkFNRSkpIHsKKwkJaW51bSA9IHBhcmVudF9pbm8oZmlscC0+Zl9kZW50cnkpOworCX0gZWxzZSB7CisJCWxvZmZfdCBpX3BvcyA9IGZhdF9tYWtlX2lfcG9zKHNiLCBiaCwgZGUpOworCQlzdHJ1Y3QgaW5vZGUgKnRtcCA9IGZhdF9pZ2V0KHNiLCBpX3Bvcyk7CisJCWlmICh0bXApIHsKKwkJCWludW0gPSB0bXAtPmlfaW5vOworCQkJaXB1dCh0bXApOworCQl9IGVsc2UKKwkJCWludW0gPSBpdW5pcXVlKHNiLCBNU0RPU19ST09UX0lOTyk7CisJfQorCisJaWYgKGlzdmZhdCkgeworCQlidWZ1bmFtZVtqXSA9IDB4MDAwMDsKKwkJaSA9IHV0ZjggPyB1dGY4X3djc3RvbWJzKGJ1Zm5hbWUsIGJ1ZnVuYW1lLCBzaXplb2YoYnVmbmFtZSkpCisJCQkgOiB1bmkxNl90b194OChidWZuYW1lLCBidWZ1bmFtZSwgdW5pX3hsYXRlLCBubHNfaW8pOworCX0KKworCWZpbGxfbmFtZSA9IGJ1Zm5hbWU7CisJZmlsbF9sZW4gPSBpOworCWlmICghc2hvcnRfb25seSAmJiBsb25nX3Nsb3RzKSB7CisJCS8qIGNvbnZlcnQgdGhlIHVuaWNvZGUgbG9uZyBuYW1lLiAyNjEgaXMgbWF4aW11bSBzaXplCisJCSAqIG9mIHVuaWNvZGUgYnVmZmVyLiAoMTMgKiBzbG90cyArIG51bCkgKi8KKwkJdm9pZCAqbG9uZ25hbWUgPSB1bmljb2RlICsgMjYxOworCQlpbnQgYnVmX3NpemUgPSBQQUdFX1NJWkUgLSAoMjYxICogc2l6ZW9mKHVuaWNvZGVbMF0pKTsKKwkJaW50IGxvbmdfbGVuID0gdXRmOAorCQkJPyB1dGY4X3djc3RvbWJzKGxvbmduYW1lLCB1bmljb2RlLCBidWZfc2l6ZSkKKwkJCTogdW5pMTZfdG9feDgobG9uZ25hbWUsIHVuaWNvZGUsIHVuaV94bGF0ZSwgbmxzX2lvKTsKKworCQlpZiAoIWJvdGgpIHsKKwkJCWZpbGxfbmFtZSA9IGxvbmduYW1lOworCQkJZmlsbF9sZW4gPSBsb25nX2xlbjsKKwkJfSBlbHNlIHsKKwkJCS8qIGhhY2sgZm9yIGZhdF9pb2N0bF9maWxsZGlyKCkgKi8KKwkJCXN0cnVjdCBmYXRfaW9jdGxfZmlsbGRpcl9jYWxsYmFjayAqcCA9IGRpcmVudDsKKworCQkJcC0+bG9uZ25hbWUgPSBsb25nbmFtZTsKKwkJCXAtPmxvbmdfbGVuID0gbG9uZ19sZW47CisJCQlwLT5zaG9ydG5hbWUgPSBidWZuYW1lOworCQkJcC0+c2hvcnRfbGVuID0gaTsKKwkJCWZpbGxfbmFtZSA9IE5VTEw7CisJCQlmaWxsX2xlbiA9IDA7CisJCX0KKwl9CisJaWYgKGZpbGxkaXIoZGlyZW50LCBmaWxsX25hbWUsIGZpbGxfbGVuLCAqZnVycmZ1LCBpbnVtLAorCQkgICAgKGRlLT5hdHRyICYgQVRUUl9ESVIpID8gRFRfRElSIDogRFRfUkVHKSA8IDApCisJCWdvdG8gRmlsbEZhaWxlZDsKKworUmVjRW5kOgorCWZ1cnJmdSA9ICZscG9zOworCWZpbHAtPmZfcG9zID0gY3BvczsKKwlnb3RvIEdldE5ldzsKK0VPRGlyOgorCWZpbHAtPmZfcG9zID0gY3BvczsKK0ZpbGxGYWlsZWQ6CisJaWYgKGJoKQorCQlicmVsc2UoYmgpOworCWlmICh1bmljb2RlKQorCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpdW5pY29kZSk7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZmF0X3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXJldHVybiBmYXRfcmVhZGRpcngoaW5vZGUsIGZpbHAsIGRpcmVudCwgZmlsbGRpciwgMCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgZmF0X2lvY3RsX2ZpbGxkaXIodm9pZCAqX19idWYsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lX2xlbiwKKwkJCSAgICAgbG9mZl90IG9mZnNldCwgaW5vX3QgaW5vLCB1bnNpZ25lZCBpbnQgZF90eXBlKQoreworCXN0cnVjdCBmYXRfaW9jdGxfZmlsbGRpcl9jYWxsYmFjayAqYnVmID0gX19idWY7CisJc3RydWN0IGRpcmVudCBfX3VzZXIgKmQxID0gYnVmLT5kaXJlbnQ7CisJc3RydWN0IGRpcmVudCBfX3VzZXIgKmQyID0gZDEgKyAxOworCisJaWYgKGJ1Zi0+cmVzdWx0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlidWYtPnJlc3VsdCsrOworCisJaWYgKG5hbWUgIT0gTlVMTCkgeworCQkvKiBkaXJlbnQgaGFzIG9ubHkgc2hvcnQgbmFtZSAqLworCQlpZiAobmFtZV9sZW4gPj0gc2l6ZW9mKGQxLT5kX25hbWUpKQorCQkJbmFtZV9sZW4gPSBzaXplb2YoZDEtPmRfbmFtZSkgLSAxOworCisJCWlmIChwdXRfdXNlcigwLCBkMi0+ZF9uYW1lKQkJCXx8CisJCSAgICBwdXRfdXNlcigwLCAmZDItPmRfcmVjbGVuKQkJCXx8CisJCSAgICBjb3B5X3RvX3VzZXIoZDEtPmRfbmFtZSwgbmFtZSwgbmFtZV9sZW4pCXx8CisJCSAgICBwdXRfdXNlcigwLCBkMS0+ZF9uYW1lICsgbmFtZV9sZW4pCQl8fAorCQkgICAgcHV0X3VzZXIobmFtZV9sZW4sICZkMS0+ZF9yZWNsZW4pKQorCQkJZ290byBlZmF1bHQ7CisJfSBlbHNlIHsKKwkJLyogZGlyZW50IGhhcyBzaG9ydCBhbmQgbG9uZyBuYW1lICovCisJCWNvbnN0IGNoYXIgKmxvbmduYW1lID0gYnVmLT5sb25nbmFtZTsKKwkJaW50IGxvbmdfbGVuID0gYnVmLT5sb25nX2xlbjsKKwkJY29uc3QgY2hhciAqc2hvcnRuYW1lID0gYnVmLT5zaG9ydG5hbWU7CisJCWludCBzaG9ydF9sZW4gPSBidWYtPnNob3J0X2xlbjsKKworCQlpZiAobG9uZ19sZW4gPj0gc2l6ZW9mKGQxLT5kX25hbWUpKQorCQkJbG9uZ19sZW4gPSBzaXplb2YoZDEtPmRfbmFtZSkgLSAxOworCQlpZiAoc2hvcnRfbGVuID49IHNpemVvZihkMS0+ZF9uYW1lKSkKKwkJCXNob3J0X2xlbiA9IHNpemVvZihkMS0+ZF9uYW1lKSAtIDE7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihkMi0+ZF9uYW1lLCBsb25nbmFtZSwgbG9uZ19sZW4pCXx8CisJCSAgICBwdXRfdXNlcigwLCBkMi0+ZF9uYW1lICsgbG9uZ19sZW4pCQkJfHwKKwkJICAgIHB1dF91c2VyKGxvbmdfbGVuLCAmZDItPmRfcmVjbGVuKQkJCXx8CisJCSAgICBwdXRfdXNlcihpbm8sICZkMi0+ZF9pbm8pCQkJCXx8CisJCSAgICBwdXRfdXNlcihvZmZzZXQsICZkMi0+ZF9vZmYpCQkJfHwKKwkJICAgIGNvcHlfdG9fdXNlcihkMS0+ZF9uYW1lLCBzaG9ydG5hbWUsIHNob3J0X2xlbikJfHwKKwkJICAgIHB1dF91c2VyKDAsIGQxLT5kX25hbWUgKyBzaG9ydF9sZW4pCQkJfHwKKwkJICAgIHB1dF91c2VyKHNob3J0X2xlbiwgJmQxLT5kX3JlY2xlbikpCisJCQlnb3RvIGVmYXVsdDsKKwl9CisJcmV0dXJuIDA7CitlZmF1bHQ6CisJYnVmLT5yZXN1bHQgPSAtRUZBVUxUOworCXJldHVybiAtRUZBVUxUOworfQorCitzdGF0aWMgaW50IGZhdF9kaXJfaW9jdGwoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCwKKwkJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZmF0X2lvY3RsX2ZpbGxkaXJfY2FsbGJhY2sgYnVmOworCXN0cnVjdCBkaXJlbnQgX191c2VyICpkMTsKKwlpbnQgcmV0LCBzaG9ydF9vbmx5LCBib3RoOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFZGQVRfSU9DVExfUkVBRERJUl9TSE9SVDoKKwkJc2hvcnRfb25seSA9IDE7CisJCWJvdGggPSAwOworCQlicmVhazsKKwljYXNlIFZGQVRfSU9DVExfUkVBRERJUl9CT1RIOgorCQlzaG9ydF9vbmx5ID0gMDsKKwkJYm90aCA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBmYXRfZ2VuZXJpY19pb2N0bChpbm9kZSwgZmlscCwgY21kLCBhcmcpOworCX0KKworCWQxID0gKHN0cnVjdCBkaXJlbnQgX191c2VyICopYXJnOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZDEsIHNpemVvZihzdHJ1Y3QgZGlyZW50WzJdKSkpCisJCXJldHVybiAtRUZBVUxUOworCS8qCisJICogWWVzLCB3ZSBkb24ndCBuZWVkIHRoaXMgcHV0X3VzZXIoKSBhYnNvbHV0ZWx5LiBIb3dldmVyIG9sZAorCSAqIGNvZGUgZGlkbid0IHJldHVybiB0aGUgcmlnaHQgdmFsdWUuIFNvLCBhcHAgdXNlIHRoaXMgdmFsdWUsCisJICogaW4gb3JkZXIgdG8gY2hlY2sgd2hldGhlciBpdCBpcyBFT0YuCisJICovCisJaWYgKHB1dF91c2VyKDAsICZkMS0+ZF9yZWNsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWJ1Zi5kaXJlbnQgPSBkMTsKKwlidWYucmVzdWx0ID0gMDsKKwlkb3duKCZpbm9kZS0+aV9zZW0pOworCXJldCA9IC1FTk9FTlQ7CisJaWYgKCFJU19ERUFERElSKGlub2RlKSkgeworCQlyZXQgPSBmYXRfcmVhZGRpcngoaW5vZGUsIGZpbHAsICZidWYsIGZhdF9pb2N0bF9maWxsZGlyLAorCQkJCSAgIHNob3J0X29ubHksIGJvdGgpOworCX0KKwl1cCgmaW5vZGUtPmlfc2VtKTsKKwlpZiAocmV0ID49IDApCisJCXJldCA9IGJ1Zi5yZXN1bHQ7CisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmYXRfZGlyX29wZXJhdGlvbnMgPSB7CisJLnJlYWQJCT0gZ2VuZXJpY19yZWFkX2RpciwKKwkucmVhZGRpcgk9IGZhdF9yZWFkZGlyLAorCS5pb2N0bAkJPSBmYXRfZGlyX2lvY3RsLAorCS5mc3luYwkJPSBmaWxlX2ZzeW5jLAorfTsKKworc3RhdGljIGludCBmYXRfZ2V0X3Nob3J0X2VudHJ5KHN0cnVjdCBpbm9kZSAqZGlyLCBsb2ZmX3QgKnBvcywKKwkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaCwKKwkJCSAgICAgICBzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5ICoqZGUpCit7CisJd2hpbGUgKGZhdF9nZXRfZW50cnkoZGlyLCBwb3MsIGJoLCBkZSkgPj0gMCkgeworCQkvKiBmcmVlIGVudHJ5IG9yIGxvbmcgbmFtZSBlbnRyeSBvciB2b2x1bWUgbGFiZWwgKi8KKwkJaWYgKCFJU19GUkVFKCgqZGUpLT5uYW1lKSAmJiAhKCgqZGUpLT5hdHRyICYgQVRUUl9WT0xVTUUpKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAtRU5PRU5UOworfQorCisvKgorICogVGhlICIuLiIgZW50cnkgY2FuIG5vdCBwcm92aWRlIHRoZSAic3RydWN0IGZhdF9zbG90X2luZm8iIGluZm9ybWF0aW9ucworICogZm9yIGlub2RlLiBTbywgdGhpcyBmdW5jdGlvbiBwcm92aWRlIHRoZSBzb21lIGluZm9ybWF0aW9ucyBvbmx5LgorICovCitpbnQgZmF0X2dldF9kb3Rkb3RfZW50cnkoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJoLAorCQkJIHN0cnVjdCBtc2Rvc19kaXJfZW50cnkgKipkZSwgbG9mZl90ICppX3BvcykKK3sKKwlsb2ZmX3Qgb2Zmc2V0OworCisJb2Zmc2V0ID0gMDsKKwkqYmggPSBOVUxMOworCXdoaWxlIChmYXRfZ2V0X3Nob3J0X2VudHJ5KGRpciwgJm9mZnNldCwgYmgsIGRlKSA+PSAwKSB7CisJCWlmICghc3RybmNtcCgoKmRlKS0+bmFtZSwgTVNET1NfRE9URE9ULCBNU0RPU19OQU1FKSkgeworCQkJKmlfcG9zID0gZmF0X21ha2VfaV9wb3MoZGlyLT5pX3NiLCAqYmgsICpkZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLUVOT0VOVDsKK30KKworRVhQT1JUX1NZTUJPTChmYXRfZ2V0X2RvdGRvdF9lbnRyeSk7CisKKy8qIFNlZSBpZiBkaXJlY3RvcnkgaXMgZW1wdHkgKi8KK2ludCBmYXRfZGlyX2VtcHR5KHN0cnVjdCBpbm9kZSAqZGlyKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSAqZGU7CisJbG9mZl90IGNwb3M7CisJaW50IHJlc3VsdCA9IDA7CisKKwliaCA9IE5VTEw7CisJY3BvcyA9IDA7CisJd2hpbGUgKGZhdF9nZXRfc2hvcnRfZW50cnkoZGlyLCAmY3BvcywgJmJoLCAmZGUpID49IDApIHsKKwkJaWYgKHN0cm5jbXAoZGUtPm5hbWUsIE1TRE9TX0RPVCAgICwgTVNET1NfTkFNRSkgJiYKKwkJICAgIHN0cm5jbXAoZGUtPm5hbWUsIE1TRE9TX0RPVERPVCwgTVNET1NfTkFNRSkpIHsKKwkJCXJlc3VsdCA9IC1FTk9URU1QVFk7CisJCQlicmVhazsKKwkJfQorCX0KKwlicmVsc2UoYmgpOworCXJldHVybiByZXN1bHQ7Cit9CisKK0VYUE9SVF9TWU1CT0woZmF0X2Rpcl9lbXB0eSk7CisKKy8qCisgKiBmYXRfc3ViZGlycyBjb3VudHMgdGhlIG51bWJlciBvZiBzdWItZGlyZWN0b3JpZXMgb2YgZGlyLiBJdCBjYW4gYmUgcnVuCisgKiBvbiBkaXJlY3RvcmllcyBiZWluZyBjcmVhdGVkLgorICovCitpbnQgZmF0X3N1YmRpcnMoc3RydWN0IGlub2RlICpkaXIpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5ICpkZTsKKwlsb2ZmX3QgY3BvczsKKwlpbnQgY291bnQgPSAwOworCisJYmggPSBOVUxMOworCWNwb3MgPSAwOworCXdoaWxlIChmYXRfZ2V0X3Nob3J0X2VudHJ5KGRpciwgJmNwb3MsICZiaCwgJmRlKSA+PSAwKSB7CisJCWlmIChkZS0+YXR0ciAmIEFUVFJfRElSKQorCQkJY291bnQrKzsKKwl9CisJYnJlbHNlKGJoKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qCisgKiBTY2FucyBhIGRpcmVjdG9yeSBmb3IgYSBnaXZlbiBmaWxlIChuYW1lIHBvaW50cyB0byBpdHMgZm9ybWF0dGVkIG5hbWUpLgorICogUmV0dXJucyBhbiBlcnJvciBjb2RlIG9yIHplcm8uCisgKi8KK2ludCBmYXRfc2NhbihzdHJ1Y3QgaW5vZGUgKmRpciwgY29uc3QgdW5zaWduZWQgY2hhciAqbmFtZSwKKwkgICAgIHN0cnVjdCBmYXRfc2xvdF9pbmZvICpzaW5mbykKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLT5pX3NiOworCisJc2luZm8tPnNsb3Rfb2ZmID0gMDsKKwlzaW5mby0+YmggPSBOVUxMOworCXdoaWxlIChmYXRfZ2V0X3Nob3J0X2VudHJ5KGRpciwgJnNpbmZvLT5zbG90X29mZiwgJnNpbmZvLT5iaCwKKwkJCQkgICAmc2luZm8tPmRlKSA+PSAwKSB7CisJCWlmICghc3RybmNtcChzaW5mby0+ZGUtPm5hbWUsIG5hbWUsIE1TRE9TX05BTUUpKSB7CisJCQlzaW5mby0+c2xvdF9vZmYgLT0gc2l6ZW9mKCpzaW5mby0+ZGUpOworCQkJc2luZm8tPm5yX3Nsb3RzID0gMTsKKwkJCXNpbmZvLT5pX3BvcyA9IGZhdF9tYWtlX2lfcG9zKHNiLCBzaW5mby0+YmgsIHNpbmZvLT5kZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLUVOT0VOVDsKK30KKworRVhQT1JUX1NZTUJPTChmYXRfc2Nhbik7CisKK3N0YXRpYyBpbnQgX19mYXRfcmVtb3ZlX2VudHJpZXMoc3RydWN0IGlub2RlICpkaXIsIGxvZmZfdCBwb3MsIGludCBucl9zbG90cykKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLT5pX3NiOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSAqZGUsICplbmRwOworCWludCBlcnIgPSAwLCBvcmlnX3Nsb3RzOworCisJd2hpbGUgKG5yX3Nsb3RzKSB7CisJCWJoID0gTlVMTDsKKwkJaWYgKGZhdF9nZXRfZW50cnkoZGlyLCAmcG9zLCAmYmgsICZkZSkgPCAwKSB7CisJCQllcnIgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKworCQlvcmlnX3Nsb3RzID0gbnJfc2xvdHM7CisJCWVuZHAgPSAoc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSAqKShiaC0+Yl9kYXRhICsgc2ItPnNfYmxvY2tzaXplKTsKKwkJd2hpbGUgKG5yX3Nsb3RzICYmIGRlIDwgZW5kcCkgeworCQkJZGUtPm5hbWVbMF0gPSBERUxFVEVEX0ZMQUc7CisJCQlkZSsrOworCQkJbnJfc2xvdHMtLTsKKwkJfQorCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCWlmIChJU19ESVJTWU5DKGRpcikpCisJCQllcnIgPSBzeW5jX2RpcnR5X2J1ZmZlcihiaCk7CisJCWJyZWxzZShiaCk7CisJCWlmIChlcnIpCisJCQlicmVhazsKKworCQkvKiBwb3MgaXMgKm5leHQqIGRlJ3MgcG9zaXRpb24sIHNvIHRoaXMgZG9lcyBgLSBzaXplb2YoZGUpJyAqLworCQlwb3MgKz0gKChvcmlnX3Nsb3RzIC0gbnJfc2xvdHMpICogc2l6ZW9mKCpkZSkpIC0gc2l6ZW9mKCpkZSk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworaW50IGZhdF9yZW1vdmVfZW50cmllcyhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGZhdF9zbG90X2luZm8gKnNpbmZvKQoreworCXN0cnVjdCBtc2Rvc19kaXJfZW50cnkgKmRlOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaW50IGVyciA9IDAsIG5yX3Nsb3RzOworCisJLyoKKwkgKiBGaXJzdCBzdGFnZTogUmVtb3ZlIHRoZSBzaG9ydG5hbWUuIEJ5IHRoaXMsIHRoZSBkaXJlY3RvcnkKKwkgKiBlbnRyeSBpcyByZW1vdmVkLgorCSAqLworCW5yX3Nsb3RzID0gc2luZm8tPm5yX3Nsb3RzOworCWRlID0gc2luZm8tPmRlOworCXNpbmZvLT5kZSA9IE5VTEw7CisJYmggPSBzaW5mby0+Ymg7CisJc2luZm8tPmJoID0gTlVMTDsKKwl3aGlsZSAobnJfc2xvdHMgJiYgZGUgPj0gKHN0cnVjdCBtc2Rvc19kaXJfZW50cnkgKiliaC0+Yl9kYXRhKSB7CisJCWRlLT5uYW1lWzBdID0gREVMRVRFRF9GTEFHOworCQlkZS0tOworCQlucl9zbG90cy0tOworCX0KKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJaWYgKElTX0RJUlNZTkMoZGlyKSkKKwkJZXJyID0gc3luY19kaXJ0eV9idWZmZXIoYmgpOworCWJyZWxzZShiaCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlkaXItPmlfdmVyc2lvbisrOworCisJaWYgKG5yX3Nsb3RzKSB7CisJCS8qCisJCSAqIFNlY29uZCBzdGFnZTogcmVtb3ZlIHRoZSByZW1haW5pbmcgbG9uZ25hbWUgc2xvdHMuCisJCSAqIChUaGlzIGRpcmVjdG9yeSBlbnRyeSBpcyBhbHJlYWR5IHJlbW92ZWQsIGFuZCBzbyByZXR1cm4KKwkJICogdGhlIHN1Y2Nlc3MpCisJCSAqLworCQllcnIgPSBfX2ZhdF9yZW1vdmVfZW50cmllcyhkaXIsIHNpbmZvLT5zbG90X29mZiwgbnJfc2xvdHMpOworCQlpZiAoZXJyKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIkZBVDogQ291bGRuJ3QgcmVtb3ZlIHRoZSBsb25nIG5hbWUgc2xvdHNcbiIpOworCQl9CisJfQorCisJZGlyLT5pX210aW1lID0gZGlyLT5pX2F0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlpZiAoSVNfRElSU1lOQyhkaXIpKQorCQkodm9pZClmYXRfc3luY19pbm9kZShkaXIpOworCWVsc2UKKwkJbWFya19pbm9kZV9kaXJ0eShkaXIpOworCisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woZmF0X3JlbW92ZV9lbnRyaWVzKTsKKworc3RhdGljIGludCBmYXRfemVyb2VkX2NsdXN0ZXIoc3RydWN0IGlub2RlICpkaXIsIHNlY3Rvcl90IGJsa25yLCBpbnQgbnJfdXNlZCwKKwkJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJocywgaW50IG5yX2JocykKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLT5pX3NiOworCXNlY3Rvcl90IGxhc3RfYmxrbnIgPSBibGtuciArIE1TRE9TX1NCKHNiKS0+c2VjX3Blcl9jbHVzOworCWludCBlcnIsIGksIG47CisKKwkvKiBaZXJvaW5nIHRoZSB1bnVzZWQgYmxvY2tzIG9uIHRoaXMgY2x1c3RlciAqLworCWJsa25yICs9IG5yX3VzZWQ7CisJbiA9IG5yX3VzZWQ7CisJd2hpbGUgKGJsa25yIDwgbGFzdF9ibGtucikgeworCQliaHNbbl0gPSBzYl9nZXRibGsoc2IsIGJsa25yKTsKKwkJaWYgKCFiaHNbbl0pIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIGVycm9yOworCQl9CisJCW1lbXNldChiaHNbbl0tPmJfZGF0YSwgMCwgc2ItPnNfYmxvY2tzaXplKTsKKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaHNbbl0pOworCQltYXJrX2J1ZmZlcl9kaXJ0eShiaHNbbl0pOworCisJCW4rKzsKKwkJYmxrbnIrKzsKKwkJaWYgKG4gPT0gbnJfYmhzKSB7CisJCQlpZiAoSVNfRElSU1lOQyhkaXIpKSB7CisJCQkJZXJyID0gZmF0X3N5bmNfYmhzKGJocywgbik7CisJCQkJaWYgKGVycikKKwkJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCQkJYnJlbHNlKGJoc1tpXSk7CisJCQluID0gMDsKKwkJfQorCX0KKwlpZiAoSVNfRElSU1lOQyhkaXIpKSB7CisJCWVyciA9IGZhdF9zeW5jX2JocyhiaHMsIG4pOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJvcjsKKwl9CisJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJYnJlbHNlKGJoc1tpXSk7CisKKwlyZXR1cm4gMDsKKworZXJyb3I6CisJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJYmZvcmdldChiaHNbaV0pOworCXJldHVybiBlcnI7Cit9CisKK2ludCBmYXRfYWxsb2NfbmV3X2RpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHRpbWVzcGVjICp0cykKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLT5pX3NiOworCXN0cnVjdCBtc2Rvc19zYl9pbmZvICpzYmkgPSBNU0RPU19TQihzYik7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaHNbTUFYX0JVRl9QRVJfUEFHRV07CisJc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSAqZGU7CisJc2VjdG9yX3QgYmxrbnI7CisJX19sZTE2IGRhdGUsIHRpbWU7CisJaW50IGVyciwgY2x1c3RlcjsKKworCWVyciA9IGZhdF9hbGxvY19jbHVzdGVycyhkaXIsICZjbHVzdGVyLCAxKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yOworCisJYmxrbnIgPSBmYXRfY2x1c190b19ibGtucihzYmksIGNsdXN0ZXIpOworCWJoc1swXSA9IHNiX2dldGJsayhzYiwgYmxrbnIpOworCWlmICghYmhzWzBdKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZTsKKwl9CisKKwlmYXRfZGF0ZV91bml4MmRvcyh0cy0+dHZfc2VjLCAmdGltZSwgJmRhdGUpOworCisJZGUgPSAoc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSAqKWJoc1swXS0+Yl9kYXRhOworCS8qIGZpbGxpbmcgdGhlIG5ldyBkaXJlY3Rvcnkgc2xvdHMgKCIuIiBhbmQgIi4uIiBlbnRyaWVzKSAqLworCW1lbWNweShkZVswXS5uYW1lLCBNU0RPU19ET1QsIE1TRE9TX05BTUUpOworCW1lbWNweShkZVsxXS5uYW1lLCBNU0RPU19ET1RET1QsIE1TRE9TX05BTUUpOworCWRlLT5hdHRyID0gZGVbMV0uYXR0ciA9IEFUVFJfRElSOworCWRlWzBdLmxjYXNlID0gZGVbMV0ubGNhc2UgPSAwOworCWRlWzBdLnRpbWUgPSBkZVsxXS50aW1lID0gdGltZTsKKwlkZVswXS5kYXRlID0gZGVbMV0uZGF0ZSA9IGRhdGU7CisJZGVbMF0uY3RpbWVfY3MgPSBkZVsxXS5jdGltZV9jcyA9IDA7CisJaWYgKHNiaS0+b3B0aW9ucy5pc3ZmYXQpIHsKKwkJLyogZXh0cmEgdGltZXN0YW1wcyAqLworCQlkZVswXS5jdGltZSA9IGRlWzFdLmN0aW1lID0gdGltZTsKKwkJZGVbMF0uYWRhdGUgPSBkZVswXS5jZGF0ZSA9IGRlWzFdLmFkYXRlID0gZGVbMV0uY2RhdGUgPSBkYXRlOworCX0gZWxzZSB7CisJCWRlWzBdLmN0aW1lID0gZGVbMV0uY3RpbWUgPSAwOworCQlkZVswXS5hZGF0ZSA9IGRlWzBdLmNkYXRlID0gZGVbMV0uYWRhdGUgPSBkZVsxXS5jZGF0ZSA9IDA7CisJfQorCWRlWzBdLnN0YXJ0ID0gY3B1X3RvX2xlMTYoY2x1c3Rlcik7CisJZGVbMF0uc3RhcnRoaSA9IGNwdV90b19sZTE2KGNsdXN0ZXIgPj4gMTYpOworCWRlWzFdLnN0YXJ0ID0gY3B1X3RvX2xlMTYoTVNET1NfSShkaXIpLT5pX2xvZ3N0YXJ0KTsKKwlkZVsxXS5zdGFydGhpID0gY3B1X3RvX2xlMTYoTVNET1NfSShkaXIpLT5pX2xvZ3N0YXJ0ID4+IDE2KTsKKwlkZVswXS5zaXplID0gZGVbMV0uc2l6ZSA9IDA7CisJbWVtc2V0KGRlICsgMiwgMCwgc2ItPnNfYmxvY2tzaXplIC0gMiAqIHNpemVvZigqZGUpKTsKKwlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoc1swXSk7CisJbWFya19idWZmZXJfZGlydHkoYmhzWzBdKTsKKworCWVyciA9IGZhdF96ZXJvZWRfY2x1c3RlcihkaXIsIGJsa25yLCAxLCBiaHMsIE1BWF9CVUZfUEVSX1BBR0UpOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3JfZnJlZTsKKworCXJldHVybiBjbHVzdGVyOworCitlcnJvcl9mcmVlOgorCWZhdF9mcmVlX2NsdXN0ZXJzKGRpciwgY2x1c3Rlcik7CitlcnJvcjoKKwlyZXR1cm4gZXJyOworfQorCitFWFBPUlRfU1lNQk9MKGZhdF9hbGxvY19uZXdfZGlyKTsKKworc3RhdGljIGludCBmYXRfYWRkX25ld19lbnRyaWVzKHN0cnVjdCBpbm9kZSAqZGlyLCB2b2lkICpzbG90cywgaW50IG5yX3Nsb3RzLAorCQkJICAgICAgIGludCAqbnJfY2x1c3Rlciwgc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSAqKmRlLAorCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJoLCBsb2ZmX3QgKmlfcG9zKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPmlfc2I7CisJc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSA9IE1TRE9TX1NCKHNiKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoc1tNQVhfQlVGX1BFUl9QQUdFXTsKKwlzZWN0b3JfdCBibGtuciwgc3RhcnRfYmxrbnIsIGxhc3RfYmxrbnI7CisJdW5zaWduZWQgbG9uZyBzaXplLCBjb3B5OworCWludCBlcnIsIGksIG4sIG9mZnNldCwgY2x1c3RlclsyXTsKKworCS8qCisJICogVGhlIG1pbmltdW0gY2x1c3RlciBzaXplIGlzIDUxMmJ5dGVzLCBhbmQgbWF4aW11bSBlbnRyeQorCSAqIHNpemUgaXMgMzIqc2xvdHMgKDY3MmJ5dGVzKS4gIFNvLCBpZmYgdGhlIGNsdXN0ZXIgc2l6ZSBpcworCSAqIDUxMmJ5dGVzLCB3ZSBtYXkgbmVlZCB0d28gY2x1c3RlcnMuCisJICovCisJc2l6ZSA9IG5yX3Nsb3RzICogc2l6ZW9mKHN0cnVjdCBtc2Rvc19kaXJfZW50cnkpOworCSpucl9jbHVzdGVyID0gKHNpemUgKyAoc2JpLT5jbHVzdGVyX3NpemUgLSAxKSkgPj4gc2JpLT5jbHVzdGVyX2JpdHM7CisJQlVHX09OKCpucl9jbHVzdGVyID4gMik7CisKKwllcnIgPSBmYXRfYWxsb2NfY2x1c3RlcnMoZGlyLCBjbHVzdGVyLCAqbnJfY2x1c3Rlcik7CisJaWYgKGVycikKKwkJZ290byBlcnJvcjsKKworCS8qCisJICogRmlyc3Qgc3RhZ2U6IEZpbGwgdGhlIGRpcmVjdG9yeSBlbnRyeS4gIE5PVEU6IFRoaXMgY2x1c3RlcgorCSAqIGlzIG5vdCByZWZlcmVuY2VkIGZyb20gYW55IGlub2RlIHlldCwgc28gdXBkYXRlcyBvcmRlciBpcworCSAqIG5vdCBpbXBvcnRhbnQuCisJICovCisJaSA9IG4gPSBjb3B5ID0gMDsKKwlkbyB7CisJCXN0YXJ0X2Jsa25yID0gYmxrbnIgPSBmYXRfY2x1c190b19ibGtucihzYmksIGNsdXN0ZXJbaV0pOworCQlsYXN0X2Jsa25yID0gc3RhcnRfYmxrbnIgKyBzYmktPnNlY19wZXJfY2x1czsKKwkJd2hpbGUgKGJsa25yIDwgbGFzdF9ibGtucikgeworCQkJYmhzW25dID0gc2JfZ2V0YmxrKHNiLCBibGtucik7CisJCQlpZiAoIWJoc1tuXSkgeworCQkJCWVyciA9IC1FTk9NRU07CisJCQkJZ290byBlcnJvcl9ub21lbTsKKwkJCX0KKworCQkJLyogZmlsbCB0aGUgZGlyZWN0b3J5IGVudHJ5ICovCisJCQljb3B5ID0gbWluKHNpemUsIHNiLT5zX2Jsb2Nrc2l6ZSk7CisJCQltZW1jcHkoYmhzW25dLT5iX2RhdGEsIHNsb3RzLCBjb3B5KTsKKwkJCXNsb3RzICs9IGNvcHk7CisJCQlzaXplIC09IGNvcHk7CisJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoc1tuXSk7CisJCQltYXJrX2J1ZmZlcl9kaXJ0eShiaHNbbl0pOworCQkJaWYgKCFzaXplKQorCQkJCWJyZWFrOworCQkJbisrOworCQkJYmxrbnIrKzsKKwkJfQorCX0gd2hpbGUgKCsraSA8ICpucl9jbHVzdGVyKTsKKworCW1lbXNldChiaHNbbl0tPmJfZGF0YSArIGNvcHksIDAsIHNiLT5zX2Jsb2Nrc2l6ZSAtIGNvcHkpOworCW9mZnNldCA9IGNvcHkgLSBzaXplb2Yoc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSk7CisJZ2V0X2JoKGJoc1tuXSk7CisJKmJoID0gYmhzW25dOworCSpkZSA9IChzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5ICopKCgqYmgpLT5iX2RhdGEgKyBvZmZzZXQpOworCSppX3BvcyA9IGZhdF9tYWtlX2lfcG9zKHNiLCAqYmgsICpkZSk7CisKKwkvKiBTZWNvbmQgc3RhZ2U6IGNsZWFyIHRoZSByZXN0IG9mIGNsdXN0ZXIsIGFuZCB3cml0ZSBvdXRzICovCisJZXJyID0gZmF0X3plcm9lZF9jbHVzdGVyKGRpciwgc3RhcnRfYmxrbnIsICsrbiwgYmhzLCBNQVhfQlVGX1BFUl9QQUdFKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yX2ZyZWU7CisKKwlyZXR1cm4gY2x1c3RlclswXTsKKworZXJyb3JfZnJlZToKKwlicmVsc2UoKmJoKTsKKwkqYmggPSBOVUxMOworCW4gPSAwOworZXJyb3Jfbm9tZW06CisJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJYmZvcmdldChiaHNbaV0pOworCWZhdF9mcmVlX2NsdXN0ZXJzKGRpciwgY2x1c3RlclswXSk7CitlcnJvcjoKKwlyZXR1cm4gZXJyOworfQorCitpbnQgZmF0X2FkZF9lbnRyaWVzKHN0cnVjdCBpbm9kZSAqZGlyLCB2b2lkICpzbG90cywgaW50IG5yX3Nsb3RzLAorCQkgICAgc3RydWN0IGZhdF9zbG90X2luZm8gKnNpbmZvKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPmlfc2I7CisJc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSA9IE1TRE9TX1NCKHNiKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqcHJldiwgKmJoc1szXTsgLyogMzIqc2xvdHMgKDY3MmJ5dGVzKSAqLworCXN0cnVjdCBtc2Rvc19kaXJfZW50cnkgKmRlOworCWludCBlcnIsIGZyZWVfc2xvdHMsIGksIG5yX2JoczsKKwlsb2ZmX3QgcG9zLCBpX3BvczsKKworCXNpbmZvLT5ucl9zbG90cyA9IG5yX3Nsb3RzOworCisJLyogRmlyc3Qgc3RhZ2U6IHNlYXJjaCBmcmVlIGRpcmVjb3RyeSBlbnRyaWVzICovCisJZnJlZV9zbG90cyA9IG5yX2JocyA9IDA7CisJYmggPSBwcmV2ID0gTlVMTDsKKwlwb3MgPSAwOworCWVyciA9IC1FTk9TUEM7CisJd2hpbGUgKGZhdF9nZXRfZW50cnkoZGlyLCAmcG9zLCAmYmgsICZkZSkgPiAtMSkgeworCQkvKiBjaGVjayB0aGUgbWF4aW11bSBzaXplIG9mIGRpcmVjdG9yeSAqLworCQlpZiAocG9zID49IEZBVF9NQVhfRElSX1NJWkUpCisJCQlnb3RvIGVycm9yOworCisJCWlmIChJU19GUkVFKGRlLT5uYW1lKSkgeworCQkJaWYgKHByZXYgIT0gYmgpIHsKKwkJCQlnZXRfYmgoYmgpOworCQkJCWJoc1tucl9iaHNdID0gcHJldiA9IGJoOworCQkJCW5yX2JocysrOworCQkJfQorCQkJZnJlZV9zbG90cysrOworCQkJaWYgKGZyZWVfc2xvdHMgPT0gbnJfc2xvdHMpCisJCQkJZ290byBmb3VuZDsKKwkJfSBlbHNlIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBucl9iaHM7IGkrKykKKwkJCQlicmVsc2UoYmhzW2ldKTsKKwkJCXByZXYgPSBOVUxMOworCQkJZnJlZV9zbG90cyA9IG5yX2JocyA9IDA7CisJCX0KKwl9CisJaWYgKGRpci0+aV9pbm8gPT0gTVNET1NfUk9PVF9JTk8pIHsKKwkJaWYgKHNiaS0+ZmF0X2JpdHMgIT0gMzIpCisJCQlnb3RvIGVycm9yOworCX0gZWxzZSBpZiAoTVNET1NfSShkaXIpLT5pX3N0YXJ0ID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGQVQ6IENvcnJ1cHRlZCBkaXJlY3RvcnkgKGlfcG9zICVsbGQpXG4iLAorCQkgICAgICAgTVNET1NfSShkaXIpLT5pX3Bvcyk7CisJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyb3I7CisJfQorCitmb3VuZDoKKwllcnIgPSAwOworCXBvcyAtPSBmcmVlX3Nsb3RzICogc2l6ZW9mKCpkZSk7CisJbnJfc2xvdHMgLT0gZnJlZV9zbG90czsKKwlpZiAoZnJlZV9zbG90cykgeworCQkvKgorCQkgKiBTZWNvbmQgc3RhZ2U6IGZpbGxpbmcgdGhlIGZyZWUgZW50cmllcyB3aXRoIG5ldyBlbnRyaWVzLgorCQkgKiBOT1RFOiBJZiB0aGlzIHNsb3RzIGhhcyBzaG9ydG5hbWUsIGZpcnN0LCB3ZSB3cml0ZQorCQkgKiB0aGUgbG9uZyBuYW1lIHNsb3RzLCB0aGVuIHdyaXRlIHRoZSBzaG9ydCBuYW1lLgorCQkgKi8KKwkJaW50IHNpemUgPSBmcmVlX3Nsb3RzICogc2l6ZW9mKCpkZSk7CisJCWludCBvZmZzZXQgPSBwb3MgJiAoc2ItPnNfYmxvY2tzaXplIC0gMSk7CisJCWludCBsb25nX2JocyA9IG5yX2JocyAtIChucl9zbG90cyA9PSAwKTsKKworCQkvKiBGaWxsIHRoZSBsb25nIG5hbWUgc2xvdHMuICovCisJCWZvciAoaSA9IDA7IGkgPCBsb25nX2JoczsgaSsrKSB7CisJCQlpbnQgY29weSA9IG1pbl90KGludCwgc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0LCBzaXplKTsKKwkJCW1lbWNweShiaHNbaV0tPmJfZGF0YSArIG9mZnNldCwgc2xvdHMsIGNvcHkpOworCQkJbWFya19idWZmZXJfZGlydHkoYmhzW2ldKTsKKwkJCW9mZnNldCA9IDA7CisJCQlzbG90cyArPSBjb3B5OworCQkJc2l6ZSAtPSBjb3B5OworCQl9CisJCWlmIChsb25nX2JocyAmJiBJU19ESVJTWU5DKGRpcikpCisJCQllcnIgPSBmYXRfc3luY19iaHMoYmhzLCBsb25nX2Jocyk7CisJCWlmICghZXJyICYmIGkgPCBucl9iaHMpIHsKKwkJCS8qIEZpbGwgdGhlIHNob3J0IG5hbWUgc2xvdC4gKi8KKwkJCWludCBjb3B5ID0gbWluX3QoaW50LCBzYi0+c19ibG9ja3NpemUgLSBvZmZzZXQsIHNpemUpOworCQkJbWVtY3B5KGJoc1tpXS0+Yl9kYXRhICsgb2Zmc2V0LCBzbG90cywgY29weSk7CisJCQltYXJrX2J1ZmZlcl9kaXJ0eShiaHNbaV0pOworCQkJaWYgKElTX0RJUlNZTkMoZGlyKSkKKwkJCQllcnIgPSBzeW5jX2RpcnR5X2J1ZmZlcihiaHNbaV0pOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCBucl9iaHM7IGkrKykKKwkJCWJyZWxzZShiaHNbaV0pOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJvcl9yZW1vdmU7CisJfQorCisJaWYgKG5yX3Nsb3RzKSB7CisJCWludCBjbHVzdGVyLCBucl9jbHVzdGVyOworCisJCS8qCisJCSAqIFRoaXJkIHN0YWdlOiBhbGxvY2F0ZSB0aGUgY2x1c3RlciBmb3IgbmV3IGVudHJpZXMuCisJCSAqIEFuZCBpbml0aWFsaXplIHRoZSBjbHVzdGVyIHdpdGggbmV3IGVudHJpZXMsIHRoZW4KKwkJICogYWRkIHRoZSBjbHVzdGVyIHRvIGRpci4KKwkJICovCisJCWNsdXN0ZXIgPSBmYXRfYWRkX25ld19lbnRyaWVzKGRpciwgc2xvdHMsIG5yX3Nsb3RzLCAmbnJfY2x1c3RlciwKKwkJCQkJICAgICAgJmRlLCAmYmgsICZpX3Bvcyk7CisJCWlmIChjbHVzdGVyIDwgMCkgeworCQkJZXJyID0gY2x1c3RlcjsKKwkJCWdvdG8gZXJyb3JfcmVtb3ZlOworCQl9CisJCWVyciA9IGZhdF9jaGFpbl9hZGQoZGlyLCBjbHVzdGVyLCBucl9jbHVzdGVyKTsKKwkJaWYgKGVycikgeworCQkJZmF0X2ZyZWVfY2x1c3RlcnMoZGlyLCBjbHVzdGVyKTsKKwkJCWdvdG8gZXJyb3JfcmVtb3ZlOworCQl9CisJCWlmIChkaXItPmlfc2l6ZSAmIChzYmktPmNsdXN0ZXJfc2l6ZSAtIDEpKSB7CisJCQlmYXRfZnNfcGFuaWMoc2IsICJPZGQgZGlyZWN0b3J5IHNpemUiKTsKKwkJCWRpci0+aV9zaXplID0gKGRpci0+aV9zaXplICsgc2JpLT5jbHVzdGVyX3NpemUgLSAxKQorCQkJCSYgfigobG9mZl90KXNiaS0+Y2x1c3Rlcl9zaXplIC0gMSk7CisJCX0KKwkJZGlyLT5pX3NpemUgKz0gbnJfY2x1c3RlciA8PCBzYmktPmNsdXN0ZXJfYml0czsKKwkJTVNET1NfSShkaXIpLT5tbXVfcHJpdmF0ZSArPSBucl9jbHVzdGVyIDw8IHNiaS0+Y2x1c3Rlcl9iaXRzOworCX0KKwlzaW5mby0+c2xvdF9vZmYgPSBwb3M7CisJc2luZm8tPmRlID0gZGU7CisJc2luZm8tPmJoID0gYmg7CisJc2luZm8tPmlfcG9zID0gZmF0X21ha2VfaV9wb3Moc2IsIHNpbmZvLT5iaCwgc2luZm8tPmRlKTsKKworCXJldHVybiAwOworCitlcnJvcjoKKwlicmVsc2UoYmgpOworCWZvciAoaSA9IDA7IGkgPCBucl9iaHM7IGkrKykKKwkJYnJlbHNlKGJoc1tpXSk7CisJcmV0dXJuIGVycjsKKworZXJyb3JfcmVtb3ZlOgorCWJyZWxzZShiaCk7CisJaWYgKGZyZWVfc2xvdHMpCisJCV9fZmF0X3JlbW92ZV9lbnRyaWVzKGRpciwgcG9zLCBmcmVlX3Nsb3RzKTsKKwlyZXR1cm4gZXJyOworfQorCitFWFBPUlRfU1lNQk9MKGZhdF9hZGRfZW50cmllcyk7CmRpZmYgLS1naXQgYS9mcy9mYXQvZmF0ZW50LmMgYi9mcy9mYXQvZmF0ZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE2NGNkNQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2ZhdC9mYXRlbnQuYwpAQCAtMCwwICsxLDYxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNCwgT0dBV0EgSGlyb2Z1bWkKKyAqIFJlbGVhc2VkIHVuZGVyIEdQTCB2Mi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tc2Rvc19mcy5oPgorCitzdHJ1Y3QgZmF0ZW50X29wZXJhdGlvbnMgeworCXZvaWQgKCplbnRfYmxvY2tucikoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCwgaW50ICosIHNlY3Rvcl90ICopOworCXZvaWQgKCplbnRfc2V0X3B0cikoc3RydWN0IGZhdF9lbnRyeSAqLCBpbnQpOworCWludCAoKmVudF9icmVhZCkoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBmYXRfZW50cnkgKiwKKwkJCSBpbnQsIHNlY3Rvcl90KTsKKwlpbnQgKCplbnRfZ2V0KShzdHJ1Y3QgZmF0X2VudHJ5ICopOworCXZvaWQgKCplbnRfcHV0KShzdHJ1Y3QgZmF0X2VudHJ5ICosIGludCk7CisJaW50ICgqZW50X25leHQpKHN0cnVjdCBmYXRfZW50cnkgKik7Cit9OworCitzdGF0aWMgdm9pZCBmYXQxMl9lbnRfYmxvY2tucihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZW50cnksCisJCQkgICAgICBpbnQgKm9mZnNldCwgc2VjdG9yX3QgKmJsb2NrbnIpCit7CisJc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSA9IE1TRE9TX1NCKHNiKTsKKwlpbnQgYnl0ZXMgPSBlbnRyeSArIChlbnRyeSA+PiAxKTsKKwlXQVJOX09OKGVudHJ5IDwgRkFUX1NUQVJUX0VOVCB8fCBzYmktPm1heF9jbHVzdGVyIDw9IGVudHJ5KTsKKwkqb2Zmc2V0ID0gYnl0ZXMgJiAoc2ItPnNfYmxvY2tzaXplIC0gMSk7CisJKmJsb2NrbnIgPSBzYmktPmZhdF9zdGFydCArIChieXRlcyA+PiBzYi0+c19ibG9ja3NpemVfYml0cyk7Cit9CisKK3N0YXRpYyB2b2lkIGZhdF9lbnRfYmxvY2tucihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZW50cnksCisJCQkgICAgaW50ICpvZmZzZXQsIHNlY3Rvcl90ICpibG9ja25yKQoreworCXN0cnVjdCBtc2Rvc19zYl9pbmZvICpzYmkgPSBNU0RPU19TQihzYik7CisJaW50IGJ5dGVzID0gKGVudHJ5IDw8IHNiaS0+ZmF0ZW50X3NoaWZ0KTsKKwlXQVJOX09OKGVudHJ5IDwgRkFUX1NUQVJUX0VOVCB8fCBzYmktPm1heF9jbHVzdGVyIDw9IGVudHJ5KTsKKwkqb2Zmc2V0ID0gYnl0ZXMgJiAoc2ItPnNfYmxvY2tzaXplIC0gMSk7CisJKmJsb2NrbnIgPSBzYmktPmZhdF9zdGFydCArIChieXRlcyA+PiBzYi0+c19ibG9ja3NpemVfYml0cyk7Cit9CisKK3N0YXRpYyB2b2lkIGZhdDEyX2VudF9zZXRfcHRyKHN0cnVjdCBmYXRfZW50cnkgKmZhdGVudCwgaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaHMgPSBmYXRlbnQtPmJoczsKKwlpZiAoZmF0ZW50LT5ucl9iaHMgPT0gMSkgeworCQlXQVJOX09OKG9mZnNldCA+PSAoYmhzWzBdLT5iX3NpemUgLSAxKSk7CisJCWZhdGVudC0+dS5lbnQxMl9wWzBdID0gYmhzWzBdLT5iX2RhdGEgKyBvZmZzZXQ7CisJCWZhdGVudC0+dS5lbnQxMl9wWzFdID0gYmhzWzBdLT5iX2RhdGEgKyAob2Zmc2V0ICsgMSk7CisJfSBlbHNlIHsKKwkJV0FSTl9PTihvZmZzZXQgIT0gKGJoc1swXS0+Yl9zaXplIC0gMSkpOworCQlmYXRlbnQtPnUuZW50MTJfcFswXSA9IGJoc1swXS0+Yl9kYXRhICsgb2Zmc2V0OworCQlmYXRlbnQtPnUuZW50MTJfcFsxXSA9IGJoc1sxXS0+Yl9kYXRhOworCX0KK30KKworc3RhdGljIHZvaWQgZmF0MTZfZW50X3NldF9wdHIoc3RydWN0IGZhdF9lbnRyeSAqZmF0ZW50LCBpbnQgb2Zmc2V0KQoreworCVdBUk5fT04ob2Zmc2V0ICYgKDIgLSAxKSk7CisJZmF0ZW50LT51LmVudDE2X3AgPSAoX19sZTE2ICopKGZhdGVudC0+YmhzWzBdLT5iX2RhdGEgKyBvZmZzZXQpOworfQorCitzdGF0aWMgdm9pZCBmYXQzMl9lbnRfc2V0X3B0cihzdHJ1Y3QgZmF0X2VudHJ5ICpmYXRlbnQsIGludCBvZmZzZXQpCit7CisJV0FSTl9PTihvZmZzZXQgJiAoNCAtIDEpKTsKKwlmYXRlbnQtPnUuZW50MzJfcCA9IChfX2xlMzIgKikoZmF0ZW50LT5iaHNbMF0tPmJfZGF0YSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbnQgZmF0MTJfZW50X2JyZWFkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBmYXRfZW50cnkgKmZhdGVudCwKKwkJCSAgIGludCBvZmZzZXQsIHNlY3Rvcl90IGJsb2NrbnIpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhzID0gZmF0ZW50LT5iaHM7CisKKwlXQVJOX09OKGJsb2NrbnIgPCBNU0RPU19TQihzYiktPmZhdF9zdGFydCk7CisJYmhzWzBdID0gc2JfYnJlYWQoc2IsIGJsb2NrbnIpOworCWlmICghYmhzWzBdKQorCQlnb3RvIGVycjsKKworCWlmICgob2Zmc2V0ICsgMSkgPCBzYi0+c19ibG9ja3NpemUpCisJCWZhdGVudC0+bnJfYmhzID0gMTsKKwllbHNlIHsKKwkJLyogVGhpcyBlbnRyeSBpcyBibG9jayBib3VuZGFyeSwgaXQgbmVlZHMgdGhlIG5leHQgYmxvY2sgKi8KKwkJYmxvY2tucisrOworCQliaHNbMV0gPSBzYl9icmVhZChzYiwgYmxvY2tucik7CisJCWlmICghYmhzWzFdKQorCQkJZ290byBlcnJfYnJlbHNlOworCQlmYXRlbnQtPm5yX2JocyA9IDI7CisJfQorCWZhdDEyX2VudF9zZXRfcHRyKGZhdGVudCwgb2Zmc2V0KTsKKwlyZXR1cm4gMDsKKworZXJyX2JyZWxzZToKKwlicmVsc2UoYmhzWzBdKTsKK2VycjoKKwlwcmludGsoS0VSTl9FUlIgIkZBVDogRkFUIHJlYWQgZmFpbGVkIChibG9ja25yICVsbHUpXG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJsb2NrbnIpOworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaW50IGZhdF9lbnRfYnJlYWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGZhdF9lbnRyeSAqZmF0ZW50LAorCQkJIGludCBvZmZzZXQsIHNlY3Rvcl90IGJsb2NrbnIpCit7CisJc3RydWN0IGZhdGVudF9vcGVyYXRpb25zICpvcHMgPSBNU0RPU19TQihzYiktPmZhdGVudF9vcHM7CisKKwlXQVJOX09OKGJsb2NrbnIgPCBNU0RPU19TQihzYiktPmZhdF9zdGFydCk7CisJZmF0ZW50LT5iaHNbMF0gPSBzYl9icmVhZChzYiwgYmxvY2tucik7CisJaWYgKCFmYXRlbnQtPmJoc1swXSkgeworCQlwcmludGsoS0VSTl9FUlIgIkZBVDogRkFUIHJlYWQgZmFpbGVkIChibG9ja25yICVsbHUpXG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylibG9ja25yKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWZhdGVudC0+bnJfYmhzID0gMTsKKwlvcHMtPmVudF9zZXRfcHRyKGZhdGVudCwgb2Zmc2V0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmYXQxMl9lbnRfZ2V0KHN0cnVjdCBmYXRfZW50cnkgKmZhdGVudCkKK3sKKwl1OCAqKmVudDEyX3AgPSBmYXRlbnQtPnUuZW50MTJfcDsKKwlpbnQgbmV4dDsKKworCWlmIChmYXRlbnQtPmVudHJ5ICYgMSkKKwkJbmV4dCA9ICgqZW50MTJfcFswXSA+PiA0KSB8ICgqZW50MTJfcFsxXSA8PCA0KTsKKwllbHNlCisJCW5leHQgPSAoKmVudDEyX3BbMV0gPDwgOCkgfCAqZW50MTJfcFswXTsKKwluZXh0ICY9IDB4MGZmZjsKKwlpZiAobmV4dCA+PSBCQURfRkFUMTIpCisJCW5leHQgPSBGQVRfRU5UX0VPRjsKKwlyZXR1cm4gbmV4dDsKK30KKworc3RhdGljIGludCBmYXQxNl9lbnRfZ2V0KHN0cnVjdCBmYXRfZW50cnkgKmZhdGVudCkKK3sKKwlpbnQgbmV4dCA9IGxlMTZfdG9fY3B1KCpmYXRlbnQtPnUuZW50MTZfcCk7CisJV0FSTl9PTigodW5zaWduZWQgbG9uZylmYXRlbnQtPnUuZW50MTZfcCAmICgyIC0gMSkpOworCWlmIChuZXh0ID49IEJBRF9GQVQxNikKKwkJbmV4dCA9IEZBVF9FTlRfRU9GOworCXJldHVybiBuZXh0OworfQorCitzdGF0aWMgaW50IGZhdDMyX2VudF9nZXQoc3RydWN0IGZhdF9lbnRyeSAqZmF0ZW50KQoreworCWludCBuZXh0ID0gbGUzMl90b19jcHUoKmZhdGVudC0+dS5lbnQzMl9wKSAmIDB4MGZmZmZmZmY7CisJV0FSTl9PTigodW5zaWduZWQgbG9uZylmYXRlbnQtPnUuZW50MzJfcCAmICg0IC0gMSkpOworCWlmIChuZXh0ID49IEJBRF9GQVQzMikKKwkJbmV4dCA9IEZBVF9FTlRfRU9GOworCXJldHVybiBuZXh0OworfQorCitzdGF0aWMgdm9pZCBmYXQxMl9lbnRfcHV0KHN0cnVjdCBmYXRfZW50cnkgKmZhdGVudCwgaW50IG5ldykKK3sKKwl1OCAqKmVudDEyX3AgPSBmYXRlbnQtPnUuZW50MTJfcDsKKworCWlmIChuZXcgPT0gRkFUX0VOVF9FT0YpCisJCW5ldyA9IEVPRl9GQVQxMjsKKworCWlmIChmYXRlbnQtPmVudHJ5ICYgMSkgeworCQkqZW50MTJfcFswXSA9IChuZXcgPDwgNCkgfCAoKmVudDEyX3BbMF0gJiAweDBmKTsKKwkJKmVudDEyX3BbMV0gPSBuZXcgPj4gNDsKKwl9IGVsc2UgeworCQkqZW50MTJfcFswXSA9IG5ldyAmIDB4ZmY7CisJCSplbnQxMl9wWzFdID0gKCplbnQxMl9wWzFdICYgMHhmMCkgfCAobmV3ID4+IDgpOworCX0KKworCW1hcmtfYnVmZmVyX2RpcnR5KGZhdGVudC0+YmhzWzBdKTsKKwlpZiAoZmF0ZW50LT5ucl9iaHMgPT0gMikKKwkJbWFya19idWZmZXJfZGlydHkoZmF0ZW50LT5iaHNbMV0pOworfQorCitzdGF0aWMgdm9pZCBmYXQxNl9lbnRfcHV0KHN0cnVjdCBmYXRfZW50cnkgKmZhdGVudCwgaW50IG5ldykKK3sKKwlpZiAobmV3ID09IEZBVF9FTlRfRU9GKQorCQluZXcgPSBFT0ZfRkFUMTY7CisKKwkqZmF0ZW50LT51LmVudDE2X3AgPSBjcHVfdG9fbGUxNihuZXcpOworCW1hcmtfYnVmZmVyX2RpcnR5KGZhdGVudC0+YmhzWzBdKTsKK30KKworc3RhdGljIHZvaWQgZmF0MzJfZW50X3B1dChzdHJ1Y3QgZmF0X2VudHJ5ICpmYXRlbnQsIGludCBuZXcpCit7CisJaWYgKG5ldyA9PSBGQVRfRU5UX0VPRikKKwkJbmV3ID0gRU9GX0ZBVDMyOworCisJV0FSTl9PTihuZXcgJiAweGYwMDAwMDAwKTsKKwluZXcgfD0gbGUzMl90b19jcHUoKmZhdGVudC0+dS5lbnQzMl9wKSAmIH4weDBmZmZmZmZmOworCSpmYXRlbnQtPnUuZW50MzJfcCA9IGNwdV90b19sZTMyKG5ldyk7CisJbWFya19idWZmZXJfZGlydHkoZmF0ZW50LT5iaHNbMF0pOworfQorCitzdGF0aWMgaW50IGZhdDEyX2VudF9uZXh0KHN0cnVjdCBmYXRfZW50cnkgKmZhdGVudCkKK3sKKwl1OCAqKmVudDEyX3AgPSBmYXRlbnQtPnUuZW50MTJfcDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaHMgPSBmYXRlbnQtPmJoczsKKwl1OCAqbmV4dHAgPSBlbnQxMl9wWzFdICsgMSArIChmYXRlbnQtPmVudHJ5ICYgMSk7CisKKwlmYXRlbnQtPmVudHJ5Kys7CisJaWYgKGZhdGVudC0+bnJfYmhzID09IDEpIHsKKwkJV0FSTl9PTihlbnQxMl9wWzBdID4gKHU4ICopKGJoc1swXS0+Yl9kYXRhICsgKGJoc1swXS0+Yl9zaXplIC0gMikpKTsKKwkJV0FSTl9PTihlbnQxMl9wWzFdID4gKHU4ICopKGJoc1swXS0+Yl9kYXRhICsgKGJoc1swXS0+Yl9zaXplIC0gMSkpKTsKKwkJaWYgKG5leHRwIDwgKHU4ICopKGJoc1swXS0+Yl9kYXRhICsgKGJoc1swXS0+Yl9zaXplIC0gMSkpKSB7CisJCQllbnQxMl9wWzBdID0gbmV4dHAgLSAxOworCQkJZW50MTJfcFsxXSA9IG5leHRwOworCQkJcmV0dXJuIDE7CisJCX0KKwl9IGVsc2UgeworCQlXQVJOX09OKGVudDEyX3BbMF0gIT0gKHU4ICopKGJoc1swXS0+Yl9kYXRhICsgKGJoc1swXS0+Yl9zaXplIC0gMSkpKTsKKwkJV0FSTl9PTihlbnQxMl9wWzFdICE9ICh1OCAqKWJoc1sxXS0+Yl9kYXRhKTsKKwkJZW50MTJfcFswXSA9IG5leHRwIC0gMTsKKwkJZW50MTJfcFsxXSA9IG5leHRwOworCQlicmVsc2UoYmhzWzBdKTsKKwkJYmhzWzBdID0gYmhzWzFdOworCQlmYXRlbnQtPm5yX2JocyA9IDE7CisJCXJldHVybiAxOworCX0KKwllbnQxMl9wWzBdID0gTlVMTDsKKwllbnQxMl9wWzFdID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmYXQxNl9lbnRfbmV4dChzdHJ1Y3QgZmF0X2VudHJ5ICpmYXRlbnQpCit7CisJY29uc3Qgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGZhdGVudC0+YmhzWzBdOworCWZhdGVudC0+ZW50cnkrKzsKKwlpZiAoZmF0ZW50LT51LmVudDE2X3AgPCAoX19sZTE2ICopKGJoLT5iX2RhdGEgKyAoYmgtPmJfc2l6ZSAtIDIpKSkgeworCQlmYXRlbnQtPnUuZW50MTZfcCsrOworCQlyZXR1cm4gMTsKKwl9CisJZmF0ZW50LT51LmVudDE2X3AgPSBOVUxMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZhdDMyX2VudF9uZXh0KHN0cnVjdCBmYXRfZW50cnkgKmZhdGVudCkKK3sKKwljb25zdCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gZmF0ZW50LT5iaHNbMF07CisJZmF0ZW50LT5lbnRyeSsrOworCWlmIChmYXRlbnQtPnUuZW50MzJfcCA8IChfX2xlMzIgKikoYmgtPmJfZGF0YSArIChiaC0+Yl9zaXplIC0gNCkpKSB7CisJCWZhdGVudC0+dS5lbnQzMl9wKys7CisJCXJldHVybiAxOworCX0KKwlmYXRlbnQtPnUuZW50MzJfcCA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmF0ZW50X29wZXJhdGlvbnMgZmF0MTJfb3BzID0geworCS5lbnRfYmxvY2tucgk9IGZhdDEyX2VudF9ibG9ja25yLAorCS5lbnRfc2V0X3B0cgk9IGZhdDEyX2VudF9zZXRfcHRyLAorCS5lbnRfYnJlYWQJPSBmYXQxMl9lbnRfYnJlYWQsCisJLmVudF9nZXQJPSBmYXQxMl9lbnRfZ2V0LAorCS5lbnRfcHV0CT0gZmF0MTJfZW50X3B1dCwKKwkuZW50X25leHQJPSBmYXQxMl9lbnRfbmV4dCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmF0ZW50X29wZXJhdGlvbnMgZmF0MTZfb3BzID0geworCS5lbnRfYmxvY2tucgk9IGZhdF9lbnRfYmxvY2tuciwKKwkuZW50X3NldF9wdHIJPSBmYXQxNl9lbnRfc2V0X3B0ciwKKwkuZW50X2JyZWFkCT0gZmF0X2VudF9icmVhZCwKKwkuZW50X2dldAk9IGZhdDE2X2VudF9nZXQsCisJLmVudF9wdXQJPSBmYXQxNl9lbnRfcHV0LAorCS5lbnRfbmV4dAk9IGZhdDE2X2VudF9uZXh0LAorfTsKKworc3RhdGljIHN0cnVjdCBmYXRlbnRfb3BlcmF0aW9ucyBmYXQzMl9vcHMgPSB7CisJLmVudF9ibG9ja25yCT0gZmF0X2VudF9ibG9ja25yLAorCS5lbnRfc2V0X3B0cgk9IGZhdDMyX2VudF9zZXRfcHRyLAorCS5lbnRfYnJlYWQJPSBmYXRfZW50X2JyZWFkLAorCS5lbnRfZ2V0CT0gZmF0MzJfZW50X2dldCwKKwkuZW50X3B1dAk9IGZhdDMyX2VudF9wdXQsCisJLmVudF9uZXh0CT0gZmF0MzJfZW50X25leHQsCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgbG9ja19mYXQoc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSkKK3sKKwlkb3duKCZzYmktPmZhdF9sb2NrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHVubG9ja19mYXQoc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSkKK3sKKwl1cCgmc2JpLT5mYXRfbG9jayk7Cit9CisKK3ZvaWQgZmF0X2VudF9hY2Nlc3NfaW5pdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBtc2Rvc19zYl9pbmZvICpzYmkgPSBNU0RPU19TQihzYik7CisKKwlpbml0X01VVEVYKCZzYmktPmZhdF9sb2NrKTsKKworCXN3aXRjaCAoc2JpLT5mYXRfYml0cykgeworCWNhc2UgMzI6CisJCXNiaS0+ZmF0ZW50X3NoaWZ0ID0gMjsKKwkJc2JpLT5mYXRlbnRfb3BzID0gJmZhdDMyX29wczsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJc2JpLT5mYXRlbnRfc2hpZnQgPSAxOworCQlzYmktPmZhdGVudF9vcHMgPSAmZmF0MTZfb3BzOworCQlicmVhazsKKwljYXNlIDEyOgorCQlzYmktPmZhdGVudF9zaGlmdCA9IC0xOworCQlzYmktPmZhdGVudF9vcHMgPSAmZmF0MTJfb3BzOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZhdF9lbnRfdXBkYXRlX3B0cihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgICAgc3RydWN0IGZhdF9lbnRyeSAqZmF0ZW50LAorCQkJCSAgICAgaW50IG9mZnNldCwgc2VjdG9yX3QgYmxvY2tucikKK3sKKwlzdHJ1Y3QgbXNkb3Nfc2JfaW5mbyAqc2JpID0gTVNET1NfU0Ioc2IpOworCXN0cnVjdCBmYXRlbnRfb3BlcmF0aW9ucyAqb3BzID0gc2JpLT5mYXRlbnRfb3BzOworCXN0cnVjdCBidWZmZXJfaGVhZCAqKmJocyA9IGZhdGVudC0+YmhzOworCisJLyogSXMgdGhpcyBmYXRlbnQncyBibG9ja3MgaW5jbHVkaW5nIHRoaXMgZW50cnk/ICovCisJaWYgKCFmYXRlbnQtPm5yX2JocyB8fCBiaHNbMF0tPmJfYmxvY2tuciAhPSBibG9ja25yKQorCQlyZXR1cm4gMDsKKwkvKiBEb2VzIHRoaXMgZW50cnkgbmVlZCB0aGUgbmV4dCBibG9jaz8gKi8KKwlpZiAoc2JpLT5mYXRfYml0cyA9PSAxMiAmJiAob2Zmc2V0ICsgMSkgPj0gc2ItPnNfYmxvY2tzaXplKSB7CisJCWlmIChmYXRlbnQtPm5yX2JocyAhPSAyIHx8IGJoc1sxXS0+Yl9ibG9ja25yICE9IChibG9ja25yICsgMSkpCisJCQlyZXR1cm4gMDsKKwl9CisJb3BzLT5lbnRfc2V0X3B0cihmYXRlbnQsIG9mZnNldCk7CisJcmV0dXJuIDE7Cit9CisKK2ludCBmYXRfZW50X3JlYWQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZhdF9lbnRyeSAqZmF0ZW50LCBpbnQgZW50cnkpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBtc2Rvc19zYl9pbmZvICpzYmkgPSBNU0RPU19TQihpbm9kZS0+aV9zYik7CisJc3RydWN0IGZhdGVudF9vcGVyYXRpb25zICpvcHMgPSBzYmktPmZhdGVudF9vcHM7CisJaW50IGVyciwgb2Zmc2V0OworCXNlY3Rvcl90IGJsb2NrbnI7CisKKwlpZiAoZW50cnkgPCBGQVRfU1RBUlRfRU5UIHx8IHNiaS0+bWF4X2NsdXN0ZXIgPD0gZW50cnkpIHsKKwkJZmF0ZW50X2JyZWxzZShmYXRlbnQpOworCQlmYXRfZnNfcGFuaWMoc2IsICJpbnZhbGlkIGFjY2VzcyB0byBGQVQgKGVudHJ5IDB4JTA4eCkiLCBlbnRyeSk7CisJCXJldHVybiAtRUlPOworCX0KKworCWZhdGVudF9zZXRfZW50cnkoZmF0ZW50LCBlbnRyeSk7CisJb3BzLT5lbnRfYmxvY2tucihzYiwgZW50cnksICZvZmZzZXQsICZibG9ja25yKTsKKworCWlmICghZmF0X2VudF91cGRhdGVfcHRyKHNiLCBmYXRlbnQsIG9mZnNldCwgYmxvY2tucikpIHsKKwkJZmF0ZW50X2JyZWxzZShmYXRlbnQpOworCQllcnIgPSBvcHMtPmVudF9icmVhZChzYiwgZmF0ZW50LCBvZmZzZXQsIGJsb2NrbnIpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIG9wcy0+ZW50X2dldChmYXRlbnQpOworfQorCisvKiBGSVhNRTogV2UgY2FuIHdyaXRlIHRoZSBibG9ja3MgYXMgbW9yZSBiaWcgY2h1bmsuICovCitzdGF0aWMgaW50IGZhdF9taXJyb3JfYmhzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJocywKKwkJCSAgaW50IG5yX2JocykKK3sKKwlzdHJ1Y3QgbXNkb3Nfc2JfaW5mbyAqc2JpID0gTVNET1NfU0Ioc2IpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqY19iaDsKKwlpbnQgZXJyLCBuLCBjb3B5OworCisJZXJyID0gMDsKKwlmb3IgKGNvcHkgPSAxOyBjb3B5IDwgc2JpLT5mYXRzOyBjb3B5KyspIHsKKwkJc2VjdG9yX3QgYmFja3VwX2ZhdCA9IHNiaS0+ZmF0X2xlbmd0aCAqIGNvcHk7CisKKwkJZm9yIChuID0gMDsgbiA8IG5yX2JoczsgbisrKSB7CisJCQljX2JoID0gc2JfZ2V0YmxrKHNiLCBiYWNrdXBfZmF0ICsgYmhzW25dLT5iX2Jsb2NrbnIpOworCQkJaWYgKCFjX2JoKSB7CisJCQkJZXJyID0gLUVOT01FTTsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQkJbWVtY3B5KGNfYmgtPmJfZGF0YSwgYmhzW25dLT5iX2RhdGEsIHNiLT5zX2Jsb2Nrc2l6ZSk7CisJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGNfYmgpOworCQkJbWFya19idWZmZXJfZGlydHkoY19iaCk7CisJCQlpZiAoc2ItPnNfZmxhZ3MgJiBNU19TWU5DSFJPTk9VUykKKwkJCQllcnIgPSBzeW5jX2RpcnR5X2J1ZmZlcihjX2JoKTsKKwkJCWJyZWxzZShjX2JoKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBlcnJvcjsKKwkJfQorCX0KK2Vycm9yOgorCXJldHVybiBlcnI7Cit9CisKK2ludCBmYXRfZW50X3dyaXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmYXRfZW50cnkgKmZhdGVudCwKKwkJICBpbnQgbmV3LCBpbnQgd2FpdCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGZhdGVudF9vcGVyYXRpb25zICpvcHMgPSBNU0RPU19TQihzYiktPmZhdGVudF9vcHM7CisJaW50IGVycjsKKworCW9wcy0+ZW50X3B1dChmYXRlbnQsIG5ldyk7CisJaWYgKHdhaXQpIHsKKwkJZXJyID0gZmF0X3N5bmNfYmhzKGZhdGVudC0+YmhzLCBmYXRlbnQtPm5yX2Jocyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gZmF0X21pcnJvcl9iaHMoc2IsIGZhdGVudC0+YmhzLCBmYXRlbnQtPm5yX2Jocyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZhdF9lbnRfbmV4dChzdHJ1Y3QgbXNkb3Nfc2JfaW5mbyAqc2JpLAorCQkJICAgICAgIHN0cnVjdCBmYXRfZW50cnkgKmZhdGVudCkKK3sKKwlpZiAoc2JpLT5mYXRlbnRfb3BzLT5lbnRfbmV4dChmYXRlbnQpKSB7CisJCWlmIChmYXRlbnQtPmVudHJ5IDwgc2JpLT5tYXhfY2x1c3RlcikKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZmF0X2VudF9yZWFkX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQkJICAgICBzdHJ1Y3QgZmF0X2VudHJ5ICpmYXRlbnQpCit7CisJc3RydWN0IGZhdGVudF9vcGVyYXRpb25zICpvcHMgPSBNU0RPU19TQihzYiktPmZhdGVudF9vcHM7CisJc2VjdG9yX3QgYmxvY2tucjsKKwlpbnQgb2Zmc2V0OworCisJZmF0ZW50X2JyZWxzZShmYXRlbnQpOworCW9wcy0+ZW50X2Jsb2NrbnIoc2IsIGZhdGVudC0+ZW50cnksICZvZmZzZXQsICZibG9ja25yKTsKKwlyZXR1cm4gb3BzLT5lbnRfYnJlYWQoc2IsIGZhdGVudCwgb2Zmc2V0LCBibG9ja25yKTsKK30KKworc3RhdGljIHZvaWQgZmF0X2NvbGxlY3RfYmhzKHN0cnVjdCBidWZmZXJfaGVhZCAqKmJocywgaW50ICpucl9iaHMsCisJCQkgICAgc3RydWN0IGZhdF9lbnRyeSAqZmF0ZW50KQoreworCWludCBuLCBpOworCisJZm9yIChuID0gMDsgbiA8IGZhdGVudC0+bnJfYmhzOyBuKyspIHsKKwkJZm9yIChpID0gMDsgaSA8ICpucl9iaHM7IGkrKykgeworCQkJaWYgKGZhdGVudC0+YmhzW25dID09IGJoc1tpXSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaSA9PSAqbnJfYmhzKSB7CisJCQlnZXRfYmgoZmF0ZW50LT5iaHNbbl0pOworCQkJYmhzW2ldID0gZmF0ZW50LT5iaHNbbl07CisJCQkoKm5yX2JocykrKzsKKwkJfQorCX0KK30KKworaW50IGZhdF9hbGxvY19jbHVzdGVycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgKmNsdXN0ZXIsIGludCBucl9jbHVzdGVyKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgbXNkb3Nfc2JfaW5mbyAqc2JpID0gTVNET1NfU0Ioc2IpOworCXN0cnVjdCBmYXRlbnRfb3BlcmF0aW9ucyAqb3BzID0gc2JpLT5mYXRlbnRfb3BzOworCXN0cnVjdCBmYXRfZW50cnkgZmF0ZW50LCBwcmV2X2VudDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoc1tNQVhfQlVGX1BFUl9QQUdFXTsKKwlpbnQgaSwgY291bnQsIGVyciwgbnJfYmhzLCBpZHhfY2x1czsKKworCUJVR19PTihucl9jbHVzdGVyID4gKE1BWF9CVUZfUEVSX1BBR0UgLyAyKSk7CS8qIGZpeGVkIGxpbWl0ICovCisKKwlsb2NrX2ZhdChzYmkpOworCWlmIChzYmktPmZyZWVfY2x1c3RlcnMgIT0gLTEgJiYgc2JpLT5mcmVlX2NsdXN0ZXJzIDwgbnJfY2x1c3RlcikgeworCQl1bmxvY2tfZmF0KHNiaSk7CisJCXJldHVybiAtRU5PU1BDOworCX0KKworCWVyciA9IG5yX2JocyA9IGlkeF9jbHVzID0gMDsKKwljb3VudCA9IEZBVF9TVEFSVF9FTlQ7CisJZmF0ZW50X2luaXQoJnByZXZfZW50KTsKKwlmYXRlbnRfaW5pdCgmZmF0ZW50KTsKKwlmYXRlbnRfc2V0X2VudHJ5KCZmYXRlbnQsIHNiaS0+cHJldl9mcmVlICsgMSk7CisJd2hpbGUgKGNvdW50IDwgc2JpLT5tYXhfY2x1c3RlcikgeworCQlpZiAoZmF0ZW50LmVudHJ5ID49IHNiaS0+bWF4X2NsdXN0ZXIpCisJCQlmYXRlbnQuZW50cnkgPSBGQVRfU1RBUlRfRU5UOworCQlmYXRlbnRfc2V0X2VudHJ5KCZmYXRlbnQsIGZhdGVudC5lbnRyeSk7CisJCWVyciA9IGZhdF9lbnRfcmVhZF9ibG9jayhzYiwgJmZhdGVudCk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKworCQkvKiBGaW5kIHRoZSBmcmVlIGVudHJpZXMgaW4gYSBibG9jayAqLworCQlkbyB7CisJCQlpZiAob3BzLT5lbnRfZ2V0KCZmYXRlbnQpID09IEZBVF9FTlRfRlJFRSkgeworCQkJCWludCBlbnRyeSA9IGZhdGVudC5lbnRyeTsKKworCQkJCS8qIG1ha2UgdGhlIGNsdXN0ZXIgY2hhaW4gKi8KKwkJCQlvcHMtPmVudF9wdXQoJmZhdGVudCwgRkFUX0VOVF9FT0YpOworCQkJCWlmIChwcmV2X2VudC5ucl9iaHMpCisJCQkJCW9wcy0+ZW50X3B1dCgmcHJldl9lbnQsIGVudHJ5KTsKKworCQkJCWZhdF9jb2xsZWN0X2JocyhiaHMsICZucl9iaHMsICZmYXRlbnQpOworCisJCQkJc2JpLT5wcmV2X2ZyZWUgPSBlbnRyeTsKKwkJCQlpZiAoc2JpLT5mcmVlX2NsdXN0ZXJzICE9IC0xKQorCQkJCQlzYmktPmZyZWVfY2x1c3RlcnMtLTsKKworCQkJCWNsdXN0ZXJbaWR4X2NsdXNdID0gZW50cnk7CisJCQkJaWR4X2NsdXMrKzsKKwkJCQlpZiAoaWR4X2NsdXMgPT0gbnJfY2x1c3RlcikKKwkJCQkJZ290byBvdXQ7CisKKwkJCQkvKgorCQkJCSAqIGZhdF9jb2xsZWN0X2JocygpIGdldHMgcmVmLWNvdW50IG9mIGJocywKKwkJCQkgKiBzbyB3ZSBjYW4gc3RpbGwgdXNlIHRoZSBwcmV2X2VudC4KKwkJCQkgKi8KKwkJCQlwcmV2X2VudCA9IGZhdGVudDsKKwkJCX0KKwkJCWNvdW50Kys7CisJCQlpZiAoY291bnQgPT0gc2JpLT5tYXhfY2x1c3RlcikKKwkJCQlicmVhazsKKwkJfSB3aGlsZSAoZmF0X2VudF9uZXh0KHNiaSwgJmZhdGVudCkpOworCX0KKworCS8qIENvdWxkbid0IGFsbG9jYXRlIHRoZSBmcmVlIGVudHJpZXMgKi8KKwlzYmktPmZyZWVfY2x1c3RlcnMgPSAwOworCWVyciA9IC1FTk9TUEM7CisKK291dDoKKwl1bmxvY2tfZmF0KHNiaSk7CisJZmF0ZW50X2JyZWxzZSgmZmF0ZW50KTsKKwlpZiAoIWVycikgeworCQlpZiAoaW5vZGVfbmVlZHNfc3luYyhpbm9kZSkpCisJCQllcnIgPSBmYXRfc3luY19iaHMoYmhzLCBucl9iaHMpOworCQlpZiAoIWVycikKKwkJCWVyciA9IGZhdF9taXJyb3JfYmhzKHNiLCBiaHMsIG5yX2Jocyk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBucl9iaHM7IGkrKykKKwkJYnJlbHNlKGJoc1tpXSk7CisJZmF0X2NsdXN0ZXJzX2ZsdXNoKHNiKTsKKworCWlmIChlcnIgJiYgaWR4X2NsdXMpCisJCWZhdF9mcmVlX2NsdXN0ZXJzKGlub2RlLCBjbHVzdGVyWzBdKTsKKworCXJldHVybiBlcnI7Cit9CisKK2ludCBmYXRfZnJlZV9jbHVzdGVycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgY2x1c3RlcikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSA9IE1TRE9TX1NCKHNiKTsKKwlzdHJ1Y3QgZmF0ZW50X29wZXJhdGlvbnMgKm9wcyA9IHNiaS0+ZmF0ZW50X29wczsKKwlzdHJ1Y3QgZmF0X2VudHJ5IGZhdGVudDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoc1tNQVhfQlVGX1BFUl9QQUdFXTsKKwlpbnQgaSwgZXJyLCBucl9iaHM7CisKKwlucl9iaHMgPSAwOworCWZhdGVudF9pbml0KCZmYXRlbnQpOworCWxvY2tfZmF0KHNiaSk7CisJZG8geworCQljbHVzdGVyID0gZmF0X2VudF9yZWFkKGlub2RlLCAmZmF0ZW50LCBjbHVzdGVyKTsKKwkJaWYgKGNsdXN0ZXIgPCAwKSB7CisJCQllcnIgPSBjbHVzdGVyOworCQkJZ290byBlcnJvcjsKKwkJfSBlbHNlIGlmIChjbHVzdGVyID09IEZBVF9FTlRfRlJFRSkgeworCQkJZmF0X2ZzX3BhbmljKHNiLCAiJXM6IGRlbGV0aW5nIEZBVCBlbnRyeSBiZXlvbmQgRU9GIiwKKwkJCQkgICAgIF9fRlVOQ1RJT05fXyk7CisJCQllcnIgPSAtRUlPOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCW9wcy0+ZW50X3B1dCgmZmF0ZW50LCBGQVRfRU5UX0ZSRUUpOworCQlpZiAoc2JpLT5mcmVlX2NsdXN0ZXJzICE9IC0xKQorCQkJc2JpLT5mcmVlX2NsdXN0ZXJzKys7CisKKwkJaWYgKG5yX2JocyArIGZhdGVudC5ucl9iaHMgPiBNQVhfQlVGX1BFUl9QQUdFKSB7CisJCQlpZiAoc2ItPnNfZmxhZ3MgJiBNU19TWU5DSFJPTk9VUykgeworCQkJCWVyciA9IGZhdF9zeW5jX2JocyhiaHMsIG5yX2Jocyk7CisJCQkJaWYgKGVycikKKwkJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJCWVyciA9IGZhdF9taXJyb3JfYmhzKHNiLCBiaHMsIG5yX2Jocyk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gZXJyb3I7CisJCQlmb3IgKGkgPSAwOyBpIDwgbnJfYmhzOyBpKyspCisJCQkJYnJlbHNlKGJoc1tpXSk7CisJCQlucl9iaHMgPSAwOworCQl9CisJCWZhdF9jb2xsZWN0X2JocyhiaHMsICZucl9iaHMsICZmYXRlbnQpOworCX0gd2hpbGUgKGNsdXN0ZXIgIT0gRkFUX0VOVF9FT0YpOworCisJaWYgKHNiLT5zX2ZsYWdzICYgTVNfU1lOQ0hST05PVVMpIHsKKwkJZXJyID0gZmF0X3N5bmNfYmhzKGJocywgbnJfYmhzKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyb3I7CisJfQorCWVyciA9IGZhdF9taXJyb3JfYmhzKHNiLCBiaHMsIG5yX2Jocyk7CitlcnJvcjoKKwlmYXRlbnRfYnJlbHNlKCZmYXRlbnQpOworCWZvciAoaSA9IDA7IGkgPCBucl9iaHM7IGkrKykKKwkJYnJlbHNlKGJoc1tpXSk7CisJdW5sb2NrX2ZhdChzYmkpOworCisJZmF0X2NsdXN0ZXJzX2ZsdXNoKHNiKTsKKworCXJldHVybiBlcnI7Cit9CisKK0VYUE9SVF9TWU1CT0woZmF0X2ZyZWVfY2x1c3RlcnMpOworCitpbnQgZmF0X2NvdW50X2ZyZWVfY2x1c3RlcnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgbXNkb3Nfc2JfaW5mbyAqc2JpID0gTVNET1NfU0Ioc2IpOworCXN0cnVjdCBmYXRlbnRfb3BlcmF0aW9ucyAqb3BzID0gc2JpLT5mYXRlbnRfb3BzOworCXN0cnVjdCBmYXRfZW50cnkgZmF0ZW50OworCWludCBlcnIgPSAwLCBmcmVlOworCisJbG9ja19mYXQoc2JpKTsKKwlpZiAoc2JpLT5mcmVlX2NsdXN0ZXJzICE9IC0xKQorCQlnb3RvIG91dDsKKworCWZyZWUgPSAwOworCWZhdGVudF9pbml0KCZmYXRlbnQpOworCWZhdGVudF9zZXRfZW50cnkoJmZhdGVudCwgRkFUX1NUQVJUX0VOVCk7CisJd2hpbGUgKGZhdGVudC5lbnRyeSA8IHNiaS0+bWF4X2NsdXN0ZXIpIHsKKwkJZXJyID0gZmF0X2VudF9yZWFkX2Jsb2NrKHNiLCAmZmF0ZW50KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCisJCWRvIHsKKwkJCWlmIChvcHMtPmVudF9nZXQoJmZhdGVudCkgPT0gRkFUX0VOVF9GUkVFKQorCQkJCWZyZWUrKzsKKwkJfSB3aGlsZSAoZmF0X2VudF9uZXh0KHNiaSwgJmZhdGVudCkpOworCX0KKwlzYmktPmZyZWVfY2x1c3RlcnMgPSBmcmVlOworCWZhdGVudF9icmVsc2UoJmZhdGVudCk7CitvdXQ6CisJdW5sb2NrX2ZhdChzYmkpOworCXJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9mcy9mYXQvZmlsZS5jIGIvZnMvZmF0L2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmZmYTkxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZmF0L2ZpbGUuYwpAQCAtMCwwICsxLDMwOCBAQAorLyoKKyAqICBsaW51eC9mcy9mYXQvZmlsZS5jCisgKgorICogIFdyaXR0ZW4gMTk5MiwxOTkzIGJ5IFdlcm5lciBBbG1lc2JlcmdlcgorICoKKyAqICByZWd1bGFyIGZpbGUgaGFuZGxpbmcgcHJpbWl0aXZlcyBmb3IgZmF0LWJhc2VkIGZpbGVzeXN0ZW1zCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tc2Rvc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKworc3RhdGljIHNzaXplX3QgZmF0X2ZpbGVfYWlvX3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90IHBvcykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gaW9jYi0+a2lfZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IGdlbmVyaWNfZmlsZV9haW9fd3JpdGUoaW9jYiwgYnVmLCBjb3VudCwgcG9zKTsKKwlpZiAocmV0dmFsID4gMCkgeworCQlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwkJTVNET1NfSShpbm9kZSktPmlfYXR0cnMgfD0gQVRUUl9BUkNIOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKy8vCQljaGVjayB0aGUgbG9ja2luZyBydWxlcworLy8JCWlmIChJU19TWU5DKGlub2RlKSkKKy8vCQkJZmF0X3N5bmNfaW5vZGUoaW5vZGUpOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgc3NpemVfdCBmYXRfZmlsZV93cml0ZXYoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgbnJfc2VncywgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gZ2VuZXJpY19maWxlX3dyaXRldihmaWxwLCBpb3YsIG5yX3NlZ3MsIHBwb3MpOworCWlmIChyZXR2YWwgPiAwKSB7CisJCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCQlNU0RPU19JKGlub2RlKS0+aV9hdHRycyB8PSBBVFRSX0FSQ0g7CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgZmF0X2dlbmVyaWNfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBtc2Rvc19zYl9pbmZvICpzYmkgPSBNU0RPU19TQihpbm9kZS0+aV9zYik7CisJdTMyIF9fdXNlciAqdXNlcl9hdHRyID0gKHUzMiBfX3VzZXIgKilhcmc7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgRkFUX0lPQ1RMX0dFVF9BVFRSSUJVVEVTOgorCXsKKwkJdTMyIGF0dHI7CisKKwkJaWYgKGlub2RlLT5pX2lubyA9PSBNU0RPU19ST09UX0lOTykKKwkJCWF0dHIgPSBBVFRSX0RJUjsKKwkJZWxzZQorCQkJYXR0ciA9IGZhdF9hdHRyKGlub2RlKTsKKworCQlyZXR1cm4gcHV0X3VzZXIoYXR0ciwgdXNlcl9hdHRyKTsKKwl9CisJY2FzZSBGQVRfSU9DVExfU0VUX0FUVFJJQlVURVM6CisJeworCQl1MzIgYXR0ciwgb2xkYXR0cjsKKwkJaW50IGVyciwgaXNfZGlyID0gU19JU0RJUihpbm9kZS0+aV9tb2RlKTsKKwkJc3RydWN0IGlhdHRyIGlhOworCisJCWVyciA9IGdldF91c2VyKGF0dHIsIHVzZXJfYXR0cik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCWRvd24oJmlub2RlLT5pX3NlbSk7CisKKwkJaWYgKElTX1JET05MWShpbm9kZSkpIHsKKwkJCWVyciA9IC1FUk9GUzsKKwkJCWdvdG8gdXA7CisJCX0KKworCQkvKgorCQkgKiBBVFRSX1ZPTFVNRSBhbmQgQVRUUl9ESVIgY2Fubm90IGJlIGNoYW5nZWQ7IHRoaXMgYWxzbworCQkgKiBwcmV2ZW50cyB0aGUgdXNlciBmcm9tIHR1cm5pbmcgdXMgaW50byBhIFZGQVQKKwkJICogbG9uZ25hbWUgZW50cnkuICBBbHNvLCB3ZSBvYnZpb3VzbHkgY2FuJ3Qgc2V0CisJCSAqIGFueSBvZiB0aGUgTlRGUyBhdHRyaWJ1dGVzIGluIHRoZSBoaWdoIDI0IGJpdHMuCisJCSAqLworCQlhdHRyICY9IDB4ZmYgJiB+KEFUVFJfVk9MVU1FIHwgQVRUUl9ESVIpOworCQkvKiBNZXJnZSBpbiBBVFRSX1ZPTFVNRSBhbmQgQVRUUl9ESVIgKi8KKwkJYXR0ciB8PSAoTVNET1NfSShpbm9kZSktPmlfYXR0cnMgJiBBVFRSX1ZPTFVNRSkgfAorCQkJKGlzX2RpciA/IEFUVFJfRElSIDogMCk7CisJCW9sZGF0dHIgPSBmYXRfYXR0cihpbm9kZSk7CisKKwkJLyogRXF1aXZhbGVudCB0byBhIGNobW9kKCkgKi8KKwkJaWEuaWFfdmFsaWQgPSBBVFRSX01PREUgfCBBVFRSX0NUSU1FOworCQlpZiAoaXNfZGlyKSB7CisJCQlpYS5pYV9tb2RlID0gTVNET1NfTUtNT0RFKGF0dHIsCisJCQkJU19JUldYVUdPICYgfnNiaS0+b3B0aW9ucy5mc19kbWFzaykKKwkJCQl8IFNfSUZESVI7CisJCX0gZWxzZSB7CisJCQlpYS5pYV9tb2RlID0gTVNET1NfTUtNT0RFKGF0dHIsCisJCQkJKFNfSVJVR08gfCBTX0lXVUdPIHwgKGlub2RlLT5pX21vZGUgJiBTX0lYVUdPKSkKKwkJCQkmIH5zYmktPm9wdGlvbnMuZnNfZm1hc2spCisJCQkJfCBTX0lGUkVHOworCQl9CisKKwkJLyogVGhlIHJvb3QgZGlyZWN0b3J5IGhhcyBubyBhdHRyaWJ1dGVzICovCisJCWlmIChpbm9kZS0+aV9pbm8gPT0gTVNET1NfUk9PVF9JTk8gJiYgYXR0ciAhPSBBVFRSX0RJUikgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gdXA7CisJCX0KKworCQlpZiAoc2JpLT5vcHRpb25zLnN5c19pbW11dGFibGUpIHsKKwkJCWlmICgoYXR0ciB8IG9sZGF0dHIpICYgQVRUUl9TWVMpIHsKKwkJCQlpZiAoIWNhcGFibGUoQ0FQX0xJTlVYX0lNTVVUQUJMRSkpIHsKKwkJCQkJZXJyID0gLUVQRVJNOworCQkJCQlnb3RvIHVwOworCQkJCX0KKwkJCX0KKwkJfQorCisJCS8qIFRoaXMgTVVTVCBiZSBkb25lIGJlZm9yZSBkb2luZyBhbnl0aGluZyBpcnJldmVyc2libGUuLi4gKi8KKwkJZXJyID0gbm90aWZ5X2NoYW5nZShmaWxwLT5mX2RlbnRyeSwgJmlhKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gdXA7CisKKwkJaWYgKHNiaS0+b3B0aW9ucy5zeXNfaW1tdXRhYmxlKSB7CisJCQlpZiAoYXR0ciAmIEFUVFJfU1lTKQorCQkJCWlub2RlLT5pX2ZsYWdzIHw9IFNfSU1NVVRBQkxFOworCQkJZWxzZQorCQkJCWlub2RlLT5pX2ZsYWdzICY9IFNfSU1NVVRBQkxFOworCQl9CisKKwkJTVNET1NfSShpbm9kZSktPmlfYXR0cnMgPSBhdHRyICYgQVRUUl9VTlVTRUQ7CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCXVwOgorCQl1cCgmaW5vZGUtPmlfc2VtKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9UVFk7CS8qIEluYXBwcm9wcmlhdGUgaW9jdGwgZm9yIGRldmljZSAqLworCX0KK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmYXRfZmlsZV9vcGVyYXRpb25zID0geworCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKKwkucmVhZAkJPSBkb19zeW5jX3JlYWQsCisJLndyaXRlCQk9IGRvX3N5bmNfd3JpdGUsCisJLnJlYWR2CQk9IGdlbmVyaWNfZmlsZV9yZWFkdiwKKwkud3JpdGV2CQk9IGZhdF9maWxlX3dyaXRldiwKKwkuYWlvX3JlYWQJPSBnZW5lcmljX2ZpbGVfYWlvX3JlYWQsCisJLmFpb193cml0ZQk9IGZhdF9maWxlX2Fpb193cml0ZSwKKwkubW1hcAkJPSBnZW5lcmljX2ZpbGVfbW1hcCwKKwkuaW9jdGwJCT0gZmF0X2dlbmVyaWNfaW9jdGwsCisJLmZzeW5jCQk9IGZpbGVfZnN5bmMsCisJLnNlbmRmaWxlCT0gZ2VuZXJpY19maWxlX3NlbmRmaWxlLAorfTsKKworaW50IGZhdF9ub3RpZnlfY2hhbmdlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICphdHRyKQoreworCXN0cnVjdCBtc2Rvc19zYl9pbmZvICpzYmkgPSBNU0RPU19TQihkZW50cnktPmRfc2IpOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IG1hc2ssIGVycm9yID0gMDsKKworCWxvY2tfa2VybmVsKCk7CisKKwkvKiBGQVQgY2Fubm90IHRydW5jYXRlIHRvIGEgbG9uZ2VyIGZpbGUgKi8KKwlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpIHsKKwkJaWYgKGF0dHItPmlhX3NpemUgPiBpbm9kZS0+aV9zaXplKSB7CisJCQllcnJvciA9IC1FUEVSTTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJZXJyb3IgPSBpbm9kZV9jaGFuZ2Vfb2soaW5vZGUsIGF0dHIpOworCWlmIChlcnJvcikgeworCQlpZiAoc2JpLT5vcHRpb25zLnF1aWV0KQorCQkJZXJyb3IgPSAwOworCQlnb3RvIG91dDsKKwl9CisJaWYgKCgoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1VJRCkgJiYKKwkgICAgIChhdHRyLT5pYV91aWQgIT0gc2JpLT5vcHRpb25zLmZzX3VpZCkpIHx8CisJICAgICgoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0dJRCkgJiYKKwkgICAgIChhdHRyLT5pYV9naWQgIT0gc2JpLT5vcHRpb25zLmZzX2dpZCkpIHx8CisJICAgICgoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01PREUpICYmCisJICAgICAoYXR0ci0+aWFfbW9kZSAmIH5NU0RPU19WQUxJRF9NT0RFKSkpCisJCWVycm9yID0gLUVQRVJNOworCisJaWYgKGVycm9yKSB7CisJCWlmIChzYmktPm9wdGlvbnMucXVpZXQpCisJCQllcnJvciA9IDA7CisJCWdvdG8gb3V0OworCX0KKwllcnJvciA9IGlub2RlX3NldGF0dHIoaW5vZGUsIGF0dHIpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisKKwlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJbWFzayA9IHNiaS0+b3B0aW9ucy5mc19kbWFzazsKKwllbHNlCisJCW1hc2sgPSBzYmktPm9wdGlvbnMuZnNfZm1hc2s7CisJaW5vZGUtPmlfbW9kZSAmPSBTX0lGTVQgfCAoU19JUldYVUdPICYgfm1hc2spOworb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK0VYUE9SVF9TWU1CT0woZmF0X25vdGlmeV9jaGFuZ2UpOworCisvKiBGcmVlIGFsbCBjbHVzdGVycyBhZnRlciB0aGUgc2tpcCd0aCBjbHVzdGVyLiAqLworc3RhdGljIGludCBmYXRfZnJlZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgc2tpcCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJaW50IGVyciwgd2FpdCwgZnJlZV9zdGFydCwgaV9zdGFydCwgaV9sb2dzdGFydDsKKworCWlmIChNU0RPU19JKGlub2RlKS0+aV9zdGFydCA9PSAwKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogV3JpdGUgYSBuZXcgRU9GLCBhbmQgZ2V0IHRoZSByZW1haW5pbmcgY2x1c3RlciBjaGFpbiBmb3IgZnJlZWluZy4KKwkgKi8KKwl3YWl0ID0gSVNfRElSU1lOQyhpbm9kZSk7CisJaWYgKHNraXApIHsKKwkJc3RydWN0IGZhdF9lbnRyeSBmYXRlbnQ7CisJCWludCByZXQsIGZjbHVzLCBkY2x1czsKKworCQlyZXQgPSBmYXRfZ2V0X2NsdXN0ZXIoaW5vZGUsIHNraXAgLSAxLCAmZmNsdXMsICZkY2x1cyk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJZWxzZSBpZiAocmV0ID09IEZBVF9FTlRfRU9GKQorCQkJcmV0dXJuIDA7CisKKwkJZmF0ZW50X2luaXQoJmZhdGVudCk7CisJCXJldCA9IGZhdF9lbnRfcmVhZChpbm9kZSwgJmZhdGVudCwgZGNsdXMpOworCQlpZiAocmV0ID09IEZBVF9FTlRfRU9GKSB7CisJCQlmYXRlbnRfYnJlbHNlKCZmYXRlbnQpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAocmV0ID09IEZBVF9FTlRfRlJFRSkgeworCQkJZmF0X2ZzX3BhbmljKHNiLAorCQkJCSAgICAgIiVzOiBpbnZhbGlkIGNsdXN0ZXIgY2hhaW4gKGlfcG9zICVsbGQpIiwKKwkJCQkgICAgIF9fRlVOQ1RJT05fXywgTVNET1NfSShpbm9kZSktPmlfcG9zKTsKKwkJCXJldCA9IC1FSU87CisJCX0gZWxzZSBpZiAocmV0ID4gMCkgeworCQkJZXJyID0gZmF0X2VudF93cml0ZShpbm9kZSwgJmZhdGVudCwgRkFUX0VOVF9FT0YsIHdhaXQpOworCQkJaWYgKGVycikKKwkJCQlyZXQgPSBlcnI7CisJCX0KKwkJZmF0ZW50X2JyZWxzZSgmZmF0ZW50KTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCWZyZWVfc3RhcnQgPSByZXQ7CisJCWlfc3RhcnQgPSBpX2xvZ3N0YXJ0ID0gMDsKKwkJZmF0X2NhY2hlX2ludmFsX2lub2RlKGlub2RlKTsKKwl9IGVsc2UgeworCQlmYXRfY2FjaGVfaW52YWxfaW5vZGUoaW5vZGUpOworCisJCWlfc3RhcnQgPSBmcmVlX3N0YXJ0ID0gTVNET1NfSShpbm9kZSktPmlfc3RhcnQ7CisJCWlfbG9nc3RhcnQgPSBNU0RPU19JKGlub2RlKS0+aV9sb2dzdGFydDsKKwkJTVNET1NfSShpbm9kZSktPmlfc3RhcnQgPSAwOworCQlNU0RPU19JKGlub2RlKS0+aV9sb2dzdGFydCA9IDA7CisJfQorCU1TRE9TX0koaW5vZGUpLT5pX2F0dHJzIHw9IEFUVFJfQVJDSDsKKwlpbm9kZS0+aV9jdGltZSA9IGlub2RlLT5pX210aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlpZiAod2FpdCkgeworCQllcnIgPSBmYXRfc3luY19pbm9kZShpbm9kZSk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycm9yOworCX0gZWxzZQorCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwlpbm9kZS0+aV9ibG9ja3MgPSBza2lwIDw8IChNU0RPU19TQihzYiktPmNsdXN0ZXJfYml0cyAtIDkpOworCisJLyogRnJlZWluZyB0aGUgcmVtYWluZWQgY2x1c3RlciBjaGFpbiAqLworCXJldHVybiBmYXRfZnJlZV9jbHVzdGVycyhpbm9kZSwgZnJlZV9zdGFydCk7CisKK2Vycm9yOgorCWlmIChpX3N0YXJ0KSB7CisJCU1TRE9TX0koaW5vZGUpLT5pX3N0YXJ0ID0gaV9zdGFydDsKKwkJTVNET1NfSShpbm9kZSktPmlfbG9nc3RhcnQgPSBpX2xvZ3N0YXJ0OworCX0KKwlyZXR1cm4gZXJyOworfQorCit2b2lkIGZhdF90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBtc2Rvc19zYl9pbmZvICpzYmkgPSBNU0RPU19TQihpbm9kZS0+aV9zYik7CisJY29uc3QgdW5zaWduZWQgaW50IGNsdXN0ZXJfc2l6ZSA9IHNiaS0+Y2x1c3Rlcl9zaXplOworCWludCBucl9jbHVzdGVyczsKKworCS8qCisJICogVGhpcyBwcm90ZWN0cyBhZ2FpbnN0IHRydW5jYXRpbmcgYSBmaWxlIGJpZ2dlciB0aGFuIGl0IHdhcyB0aGVuCisJICogdHJ5aW5nIHRvIHdyaXRlIGludG8gdGhlIGhvbGUuCisJICovCisJaWYgKE1TRE9TX0koaW5vZGUpLT5tbXVfcHJpdmF0ZSA+IGlub2RlLT5pX3NpemUpCisJCU1TRE9TX0koaW5vZGUpLT5tbXVfcHJpdmF0ZSA9IGlub2RlLT5pX3NpemU7CisKKwlucl9jbHVzdGVycyA9IChpbm9kZS0+aV9zaXplICsgKGNsdXN0ZXJfc2l6ZSAtIDEpKSA+PiBzYmktPmNsdXN0ZXJfYml0czsKKworCWxvY2tfa2VybmVsKCk7CisJZmF0X2ZyZWUoaW5vZGUsIG5yX2NsdXN0ZXJzKTsKKwl1bmxvY2tfa2VybmVsKCk7Cit9CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGZhdF9maWxlX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnRydW5jYXRlCT0gZmF0X3RydW5jYXRlLAorCS5zZXRhdHRyCT0gZmF0X25vdGlmeV9jaGFuZ2UsCit9OwpkaWZmIC0tZ2l0IGEvZnMvZmF0L2lub2RlLmMgYi9mcy9mYXQvaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2NlZTg0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZmF0L2lub2RlLmMKQEAgLTAsMCArMSwxMzUxIEBACisvKgorICogIGxpbnV4L2ZzL2ZhdC9pbm9kZS5jCisgKgorICogIFdyaXR0ZW4gMTk5MiwxOTkzIGJ5IFdlcm5lciBBbG1lc2JlcmdlcgorICogIFZGQVQgZXh0ZW5zaW9ucyBieSBHb3Jkb24gQ2hhZmZlZSwgbWVyZ2VkIHdpdGggbXNkb3MgZnMgYnkgSGVucmlrIFN0b3JuZXIKKyAqICBSZXdyaXR0ZW4gZm9yIHRoZSBjb25zdGFudCBpbnVtYmVycyBzdXBwb3J0IGJ5IEFsIFZpcm8KKyAqCisgKiAgRml4ZXM6CisgKgorICoJTWF4IENvaGFuOiBGaXhlZCBpbnZhbGlkIEZTSU5GTyBvZmZzZXQgd2hlbiBpbmZvX3NlY3RvciBpcyAwCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tc2Rvc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCisjaWZuZGVmIENPTkZJR19GQVRfREVGQVVMVF9JT0NIQVJTRVQKKy8qIGlmIHVzZXIgZG9uJ3Qgc2VsZWN0IFZGQVQsIHRoaXMgaXMgdW5kZWZpbmVkLiAqLworI2RlZmluZSBDT05GSUdfRkFUX0RFRkFVTFRfSU9DSEFSU0VUCSIiCisjZW5kaWYKKworc3RhdGljIGludCBmYXRfZGVmYXVsdF9jb2RlcGFnZSA9IENPTkZJR19GQVRfREVGQVVMVF9DT0RFUEFHRTsKK3N0YXRpYyBjaGFyIGZhdF9kZWZhdWx0X2lvY2hhcnNldFtdID0gQ09ORklHX0ZBVF9ERUZBVUxUX0lPQ0hBUlNFVDsKKworCitzdGF0aWMgaW50IGZhdF9hZGRfY2x1c3RlcihzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWludCBlcnIsIGNsdXN0ZXI7CisKKwllcnIgPSBmYXRfYWxsb2NfY2x1c3RlcnMoaW5vZGUsICZjbHVzdGVyLCAxKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCS8qIEZJWE1FOiB0aGlzIGNsdXN0ZXIgc2hvdWxkIGJlIGFkZGVkIGFmdGVyIGRhdGEgb2YgdGhpcworCSAqIGNsdXN0ZXIgaXMgd3JpdGVkICovCisJZXJyID0gZmF0X2NoYWluX2FkZChpbm9kZSwgY2x1c3RlciwgMSk7CisJaWYgKGVycikKKwkJZmF0X2ZyZWVfY2x1c3RlcnMoaW5vZGUsIGNsdXN0ZXIpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZmF0X2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBpYmxvY2ssCisJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXNlY3Rvcl90IHBoeXM7CisJaW50IGVycjsKKworCWVyciA9IGZhdF9ibWFwKGlub2RlLCBpYmxvY2ssICZwaHlzKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWlmIChwaHlzKSB7CisJCW1hcF9iaChiaF9yZXN1bHQsIHNiLCBwaHlzKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmICghY3JlYXRlKQorCQlyZXR1cm4gMDsKKwlpZiAoaWJsb2NrICE9IE1TRE9TX0koaW5vZGUpLT5tbXVfcHJpdmF0ZSA+PiBzYi0+c19ibG9ja3NpemVfYml0cykgeworCQlmYXRfZnNfcGFuaWMoc2IsICJjb3JydXB0ZWQgZmlsZSBzaXplIChpX3BvcyAlbGxkLCAlbGxkKSIsCisJCQkgICAgIE1TRE9TX0koaW5vZGUpLT5pX3BvcywgTVNET1NfSShpbm9kZSktPm1tdV9wcml2YXRlKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmICghKCh1bnNpZ25lZCBsb25nKWlibG9jayAmIChNU0RPU19TQihzYiktPnNlY19wZXJfY2x1cyAtIDEpKSkgeworCQllcnIgPSBmYXRfYWRkX2NsdXN0ZXIoaW5vZGUpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisJTVNET1NfSShpbm9kZSktPm1tdV9wcml2YXRlICs9IHNiLT5zX2Jsb2Nrc2l6ZTsKKwllcnIgPSBmYXRfYm1hcChpbm9kZSwgaWJsb2NrLCAmcGh5cyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlpZiAoIXBoeXMpCisJCUJVRygpOworCXNldF9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7CisJbWFwX2JoKGJoX3Jlc3VsdCwgc2IsIHBoeXMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZhdF93cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCXJldHVybiBibG9ja193cml0ZV9mdWxsX3BhZ2UocGFnZSwgZmF0X2dldF9ibG9jaywgd2JjKTsKK30KKworc3RhdGljIGludCBmYXRfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiBibG9ja19yZWFkX2Z1bGxfcGFnZShwYWdlLCBmYXRfZ2V0X2Jsb2NrKTsKK30KKworc3RhdGljIGludCBmYXRfcHJlcGFyZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkgICAgIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCXJldHVybiBjb250X3ByZXBhcmVfd3JpdGUocGFnZSwgZnJvbSwgdG8sIGZhdF9nZXRfYmxvY2ssCisJCQkJICAmTVNET1NfSShwYWdlLT5tYXBwaW5nLT5ob3N0KS0+bW11X3ByaXZhdGUpOworfQorCitzdGF0aWMgc2VjdG9yX3QgX2ZhdF9ibWFwKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzZWN0b3JfdCBibG9jaykKK3sKKwlyZXR1cm4gZ2VuZXJpY19ibG9ja19ibWFwKG1hcHBpbmcsIGJsb2NrLCBmYXRfZ2V0X2Jsb2NrKTsKK30KKworc3RhdGljIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgZmF0X2FvcHMgPSB7CisJLnJlYWRwYWdlCT0gZmF0X3JlYWRwYWdlLAorCS53cml0ZXBhZ2UJPSBmYXRfd3JpdGVwYWdlLAorCS5zeW5jX3BhZ2UJPSBibG9ja19zeW5jX3BhZ2UsCisJLnByZXBhcmVfd3JpdGUJPSBmYXRfcHJlcGFyZV93cml0ZSwKKwkuY29tbWl0X3dyaXRlCT0gZ2VuZXJpY19jb21taXRfd3JpdGUsCisJLmJtYXAJCT0gX2ZhdF9ibWFwCit9OworCisvKgorICogTmV3IEZBVCBpbm9kZSBzdHVmZi4gV2UgZG8gdGhlIGZvbGxvd2luZzoKKyAqCWEpIGlfaW5vIGlzIGNvbnN0YW50IGFuZCBoYXMgbm90aGluZyB3aXRoIG9uLWRpc2sgbG9jYXRpb24uCisgKgliKSBGQVQgbWFuYWdlcyBpdHMgb3duIGNhY2hlIG9mIGRpcmVjdG9yeSBlbnRyaWVzLgorICoJYykgKlRoaXMqIGNhY2hlIGlzIGluZGV4ZWQgYnkgb24tZGlzayBsb2NhdGlvbi4KKyAqCWQpIGlub2RlIGhhcyBhbiBhc3NvY2lhdGVkIGRpcmVjdG9yeSBlbnRyeSwgYWxsIHJpZ2h0LCBidXQKKyAqCQlpdCBtYXkgYmUgdW5oYXNoZWQuCisgKgllKSBjdXJyZW50bHkgZW50cmllcyBhcmUgc3RvcmVkIHdpdGhpbiBzdHJ1Y3QgaW5vZGUuIFRoYXQgc2hvdWxkCisgKgkJY2hhbmdlLgorICoJZikgd2UgZGVhbCB3aXRoIHJhY2VzIGluIHRoZSBmb2xsb3dpbmcgd2F5OgorICoJCTEuIHJlYWRkaXIoKSBhbmQgbG9va3VwKCkgZG8gRkFULWRpci1jYWNoZSBsb29rdXAuCisgKgkJMi4gcmVuYW1lKCkgdW5oYXNoZXMgdGhlIEYtZC1jIGVudHJ5IGFuZCByZWhhc2hlcyBpdCBpbgorICoJCQlhIG5ldyBwbGFjZS4KKyAqCQkzLiB1bmxpbmsoKSBhbmQgcm1kaXIoKSB1bmhhc2ggRi1kLWMgZW50cnkuCisgKgkJNC4gZmF0X3dyaXRlX2lub2RlKCkgY2hlY2tzIHdoZXRoZXIgdGhlIHRoaW5nIGlzIHVuaGFzaGVkLgorICoJCQlJZiBpdCBpcyB3ZSBzaWxlbnRseSByZXR1cm4uIElmIGl0IGlzbid0IHdlIGRvIGJyZWFkKCksCisgKgkJCWNoZWNrIGlmIHRoZSBsb2NhdGlvbiBpcyBzdGlsbCB2YWxpZCBhbmQgcmV0cnkgaWYgaXQKKyAqCQkJaXNuJ3QuIE90aGVyd2lzZSB3ZSBkbyBjaGFuZ2VzLgorICoJCTUuIFNwaW5sb2NrIGlzIHVzZWQgdG8gcHJvdGVjdCBoYXNoL3VuaGFzaC9sb2NhdGlvbiBjaGVjay9sb29rdXAKKyAqCQk2LiBmYXRfY2xlYXJfaW5vZGUoKSB1bmhhc2hlcyB0aGUgRi1kLWMgZW50cnkuCisgKgkJNy4gbG9va3VwKCkgYW5kIHJlYWRkaXIoKSBkbyBpZ3JhYigpIGlmIHRoZXkgZmluZCBhIEYtZC1jIGVudHJ5CisgKgkJCWFuZCBjb25zaWRlciBuZWdhdGl2ZSByZXN1bHQgYXMgY2FjaGUgbWlzcy4KKyAqLworCitzdGF0aWMgdm9pZCBmYXRfaGFzaF9pbml0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSA9IE1TRE9TX1NCKHNiKTsKKwlpbnQgaTsKKworCXNwaW5fbG9ja19pbml0KCZzYmktPmlub2RlX2hhc2hfbG9jayk7CisJZm9yIChpID0gMDsgaSA8IEZBVF9IQVNIX1NJWkU7IGkrKykKKwkJSU5JVF9ITElTVF9IRUFEKCZzYmktPmlub2RlX2hhc2h0YWJsZVtpXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBmYXRfaGFzaChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBsb2ZmX3QgaV9wb3MpCit7CisJdW5zaWduZWQgbG9uZyB0bXAgPSAodW5zaWduZWQgbG9uZylpX3BvcyB8ICh1bnNpZ25lZCBsb25nKSBzYjsKKwl0bXAgPSB0bXAgKyAodG1wID4+IEZBVF9IQVNIX0JJVFMpICsgKHRtcCA+PiBGQVRfSEFTSF9CSVRTICogMik7CisJcmV0dXJuIHRtcCAmIEZBVF9IQVNIX01BU0s7Cit9CisKK3ZvaWQgZmF0X2F0dGFjaChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgaV9wb3MpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBtc2Rvc19zYl9pbmZvICpzYmkgPSBNU0RPU19TQihzYik7CisKKwlzcGluX2xvY2soJnNiaS0+aW5vZGVfaGFzaF9sb2NrKTsKKwlNU0RPU19JKGlub2RlKS0+aV9wb3MgPSBpX3BvczsKKwlobGlzdF9hZGRfaGVhZCgmTVNET1NfSShpbm9kZSktPmlfZmF0X2hhc2gsCisJCQlzYmktPmlub2RlX2hhc2h0YWJsZSArIGZhdF9oYXNoKHNiLCBpX3BvcykpOworCXNwaW5fdW5sb2NrKCZzYmktPmlub2RlX2hhc2hfbG9jayk7Cit9CisKK0VYUE9SVF9TWU1CT0woZmF0X2F0dGFjaCk7CisKK3ZvaWQgZmF0X2RldGFjaChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBtc2Rvc19zYl9pbmZvICpzYmkgPSBNU0RPU19TQihpbm9kZS0+aV9zYik7CisJc3Bpbl9sb2NrKCZzYmktPmlub2RlX2hhc2hfbG9jayk7CisJTVNET1NfSShpbm9kZSktPmlfcG9zID0gMDsKKwlobGlzdF9kZWxfaW5pdCgmTVNET1NfSShpbm9kZSktPmlfZmF0X2hhc2gpOworCXNwaW5fdW5sb2NrKCZzYmktPmlub2RlX2hhc2hfbG9jayk7Cit9CisKK0VYUE9SVF9TWU1CT0woZmF0X2RldGFjaCk7CisKK3N0cnVjdCBpbm9kZSAqZmF0X2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgbG9mZl90IGlfcG9zKQoreworCXN0cnVjdCBtc2Rvc19zYl9pbmZvICpzYmkgPSBNU0RPU19TQihzYik7CisJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQgPSBzYmktPmlub2RlX2hhc2h0YWJsZSArIGZhdF9oYXNoKHNiLCBpX3Bvcyk7CisJc3RydWN0IGhsaXN0X25vZGUgKl9wOworCXN0cnVjdCBtc2Rvc19pbm9kZV9pbmZvICppOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOworCisJc3Bpbl9sb2NrKCZzYmktPmlub2RlX2hhc2hfbG9jayk7CisJaGxpc3RfZm9yX2VhY2hfZW50cnkoaSwgX3AsIGhlYWQsIGlfZmF0X2hhc2gpIHsKKwkJQlVHX09OKGktPnZmc19pbm9kZS5pX3NiICE9IHNiKTsKKwkJaWYgKGktPmlfcG9zICE9IGlfcG9zKQorCQkJY29udGludWU7CisJCWlub2RlID0gaWdyYWIoJmktPnZmc19pbm9kZSk7CisJCWlmIChpbm9kZSkKKwkJCWJyZWFrOworCX0KKwlzcGluX3VubG9jaygmc2JpLT5pbm9kZV9oYXNoX2xvY2spOworCXJldHVybiBpbm9kZTsKK30KKworc3RhdGljIGludCBpc19leGVjKHVuc2lnbmVkIGNoYXIgKmV4dGVuc2lvbikKK3sKKwl1bnNpZ25lZCBjaGFyICpleGVfZXh0ZW5zaW9ucyA9ICJFWEVDT01CQVQiLCAqd2FsazsKKworCWZvciAod2FsayA9IGV4ZV9leHRlbnNpb25zOyAqd2Fsazsgd2FsayArPSAzKQorCQlpZiAoIXN0cm5jbXAoZXh0ZW5zaW9uLCB3YWxrLCAzKSkKKwkJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZhdF9jYWxjX2Rpcl9zaXplKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSA9IE1TRE9TX1NCKGlub2RlLT5pX3NiKTsKKwlpbnQgcmV0LCBmY2x1cywgZGNsdXM7CisKKwlpbm9kZS0+aV9zaXplID0gMDsKKwlpZiAoTVNET1NfSShpbm9kZSktPmlfc3RhcnQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBmYXRfZ2V0X2NsdXN0ZXIoaW5vZGUsIEZBVF9FTlRfRU9GLCAmZmNsdXMsICZkY2x1cyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJaW5vZGUtPmlfc2l6ZSA9IChmY2x1cyArIDEpIDw8IHNiaS0+Y2x1c3Rlcl9iaXRzOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGRvZXNuJ3QgZGVhbCB3aXRoIHJvb3QgaW5vZGUgKi8KK3N0YXRpYyBpbnQgZmF0X2ZpbGxfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSAqZGUpCit7CisJc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSA9IE1TRE9TX1NCKGlub2RlLT5pX3NiKTsKKwlpbnQgZXJyb3I7CisKKwlNU0RPU19JKGlub2RlKS0+aV9wb3MgPSAwOworCWlub2RlLT5pX3VpZCA9IHNiaS0+b3B0aW9ucy5mc191aWQ7CisJaW5vZGUtPmlfZ2lkID0gc2JpLT5vcHRpb25zLmZzX2dpZDsKKwlpbm9kZS0+aV92ZXJzaW9uKys7CisJaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IGdldF9zZWNvbmRzKCk7CisKKwlpZiAoKGRlLT5hdHRyICYgQVRUUl9ESVIpICYmICFJU19GUkVFKGRlLT5uYW1lKSkgeworCQlpbm9kZS0+aV9nZW5lcmF0aW9uICY9IH4xOworCQlpbm9kZS0+aV9tb2RlID0gTVNET1NfTUtNT0RFKGRlLT5hdHRyLAorCQkJU19JUldYVUdPICYgfnNiaS0+b3B0aW9ucy5mc19kbWFzaykgfCBTX0lGRElSOworCQlpbm9kZS0+aV9vcCA9IHNiaS0+ZGlyX29wczsKKwkJaW5vZGUtPmlfZm9wID0gJmZhdF9kaXJfb3BlcmF0aW9uczsKKworCQlNU0RPU19JKGlub2RlKS0+aV9zdGFydCA9IGxlMTZfdG9fY3B1KGRlLT5zdGFydCk7CisJCWlmIChzYmktPmZhdF9iaXRzID09IDMyKQorCQkJTVNET1NfSShpbm9kZSktPmlfc3RhcnQgfD0gKGxlMTZfdG9fY3B1KGRlLT5zdGFydGhpKSA8PCAxNik7CisKKwkJTVNET1NfSShpbm9kZSktPmlfbG9nc3RhcnQgPSBNU0RPU19JKGlub2RlKS0+aV9zdGFydDsKKwkJZXJyb3IgPSBmYXRfY2FsY19kaXJfc2l6ZShpbm9kZSk7CisJCWlmIChlcnJvciA8IDApCisJCQlyZXR1cm4gZXJyb3I7CisJCU1TRE9TX0koaW5vZGUpLT5tbXVfcHJpdmF0ZSA9IGlub2RlLT5pX3NpemU7CisKKwkJaW5vZGUtPmlfbmxpbmsgPSBmYXRfc3ViZGlycyhpbm9kZSk7CisJfSBlbHNlIHsgLyogbm90IGEgZGlyZWN0b3J5ICovCisJCWlub2RlLT5pX2dlbmVyYXRpb24gfD0gMTsKKwkJaW5vZGUtPmlfbW9kZSA9IE1TRE9TX01LTU9ERShkZS0+YXR0ciwKKwkJICAgICgoc2JpLT5vcHRpb25zLnNob3dleGVjICYmCisJCQkhaXNfZXhlYyhkZS0+ZXh0KSkKKwkJCT8gU19JUlVHT3xTX0lXVUdPIDogU19JUldYVUdPKQorCQkgICAgJiB+c2JpLT5vcHRpb25zLmZzX2ZtYXNrKSB8IFNfSUZSRUc7CisJCU1TRE9TX0koaW5vZGUpLT5pX3N0YXJ0ID0gbGUxNl90b19jcHUoZGUtPnN0YXJ0KTsKKwkJaWYgKHNiaS0+ZmF0X2JpdHMgPT0gMzIpCisJCQlNU0RPU19JKGlub2RlKS0+aV9zdGFydCB8PSAobGUxNl90b19jcHUoZGUtPnN0YXJ0aGkpIDw8IDE2KTsKKworCQlNU0RPU19JKGlub2RlKS0+aV9sb2dzdGFydCA9IE1TRE9TX0koaW5vZGUpLT5pX3N0YXJ0OworCQlpbm9kZS0+aV9zaXplID0gbGUzMl90b19jcHUoZGUtPnNpemUpOworCQlpbm9kZS0+aV9vcCA9ICZmYXRfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9mb3AgPSAmZmF0X2ZpbGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmZmF0X2FvcHM7CisJCU1TRE9TX0koaW5vZGUpLT5tbXVfcHJpdmF0ZSA9IGlub2RlLT5pX3NpemU7CisJfQorCWlmIChkZS0+YXR0ciAmIEFUVFJfU1lTKSB7CisJCWlmIChzYmktPm9wdGlvbnMuc3lzX2ltbXV0YWJsZSkKKwkJCWlub2RlLT5pX2ZsYWdzIHw9IFNfSU1NVVRBQkxFOworCX0KKwlNU0RPU19JKGlub2RlKS0+aV9hdHRycyA9IGRlLT5hdHRyICYgQVRUUl9VTlVTRUQ7CisJLyogdGhpcyBpcyBhcyBjbG9zZSB0byB0aGUgdHJ1dGggYXMgd2UgY2FuIGdldCAuLi4gKi8KKwlpbm9kZS0+aV9ibGtzaXplID0gc2JpLT5jbHVzdGVyX3NpemU7CisJaW5vZGUtPmlfYmxvY2tzID0gKChpbm9kZS0+aV9zaXplICsgKHNiaS0+Y2x1c3Rlcl9zaXplIC0gMSkpCisJCQkgICAmIH4oKGxvZmZfdClzYmktPmNsdXN0ZXJfc2l6ZSAtIDEpKSA+PiA5OworCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IGlub2RlLT5pX2F0aW1lLnR2X3NlYyA9CisJCWRhdGVfZG9zMnVuaXgobGUxNl90b19jcHUoZGUtPnRpbWUpLCBsZTE2X3RvX2NwdShkZS0+ZGF0ZSkpOworCWlub2RlLT5pX210aW1lLnR2X25zZWMgPSBpbm9kZS0+aV9hdGltZS50dl9uc2VjID0gMDsKKwlpZiAoc2JpLT5vcHRpb25zLmlzdmZhdCkgeworCQlpbnQgc2VjcyA9IGRlLT5jdGltZV9jcyAvIDEwMDsKKwkJaW50IGNzZWNzID0gZGUtPmN0aW1lX2NzICUgMTAwOworCQlpbm9kZS0+aV9jdGltZS50dl9zZWMgID0KKwkJCWRhdGVfZG9zMnVuaXgobGUxNl90b19jcHUoZGUtPmN0aW1lKSwKKwkJCQkgICAgICBsZTE2X3RvX2NwdShkZS0+Y2RhdGUpKSArIHNlY3M7CisJCWlub2RlLT5pX2N0aW1lLnR2X25zZWMgPSBjc2VjcyAqIDEwMDAwMDAwOworCX0gZWxzZQorCQlpbm9kZS0+aV9jdGltZSA9IGlub2RlLT5pX210aW1lOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBpbm9kZSAqZmF0X2J1aWxkX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQlzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5ICpkZSwgbG9mZl90IGlfcG9zKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IGVycjsKKworCWlub2RlID0gZmF0X2lnZXQoc2IsIGlfcG9zKTsKKwlpZiAoaW5vZGUpCisJCWdvdG8gb3V0OworCWlub2RlID0gbmV3X2lub2RlKHNiKTsKKwlpZiAoIWlub2RlKSB7CisJCWlub2RlID0gRVJSX1BUUigtRU5PTUVNKTsKKwkJZ290byBvdXQ7CisJfQorCWlub2RlLT5pX2lubyA9IGl1bmlxdWUoc2IsIE1TRE9TX1JPT1RfSU5PKTsKKwlpbm9kZS0+aV92ZXJzaW9uID0gMTsKKwllcnIgPSBmYXRfZmlsbF9pbm9kZShpbm9kZSwgZGUpOworCWlmIChlcnIpIHsKKwkJaXB1dChpbm9kZSk7CisJCWlub2RlID0gRVJSX1BUUihlcnIpOworCQlnb3RvIG91dDsKKwl9CisJZmF0X2F0dGFjaChpbm9kZSwgaV9wb3MpOworCWluc2VydF9pbm9kZV9oYXNoKGlub2RlKTsKK291dDoKKwlyZXR1cm4gaW5vZGU7Cit9CisKK0VYUE9SVF9TWU1CT0woZmF0X2J1aWxkX2lub2RlKTsKKworc3RhdGljIHZvaWQgZmF0X2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmICghaXNfYmFkX2lub2RlKGlub2RlKSkgeworCQlpbm9kZS0+aV9zaXplID0gMDsKKwkJZmF0X3RydW5jYXRlKGlub2RlKTsKKwl9CisJY2xlYXJfaW5vZGUoaW5vZGUpOworfQorCitzdGF0aWMgdm9pZCBmYXRfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgbXNkb3Nfc2JfaW5mbyAqc2JpID0gTVNET1NfU0IoaW5vZGUtPmlfc2IpOworCisJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpCisJCXJldHVybjsKKwlsb2NrX2tlcm5lbCgpOworCXNwaW5fbG9jaygmc2JpLT5pbm9kZV9oYXNoX2xvY2spOworCWZhdF9jYWNoZV9pbnZhbF9pbm9kZShpbm9kZSk7CisJaGxpc3RfZGVsX2luaXQoJk1TRE9TX0koaW5vZGUpLT5pX2ZhdF9oYXNoKTsKKwlzcGluX3VubG9jaygmc2JpLT5pbm9kZV9oYXNoX2xvY2spOworCXVubG9ja19rZXJuZWwoKTsKK30KKworc3RhdGljIHZvaWQgZmF0X3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBtc2Rvc19zYl9pbmZvICpzYmkgPSBNU0RPU19TQihzYik7CisKKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpCisJCWZhdF9jbHVzdGVyc19mbHVzaChzYik7CisKKwlpZiAoc2JpLT5ubHNfZGlzaykgeworCQl1bmxvYWRfbmxzKHNiaS0+bmxzX2Rpc2spOworCQlzYmktPm5sc19kaXNrID0gTlVMTDsKKwkJc2JpLT5vcHRpb25zLmNvZGVwYWdlID0gZmF0X2RlZmF1bHRfY29kZXBhZ2U7CisJfQorCWlmIChzYmktPm5sc19pbykgeworCQl1bmxvYWRfbmxzKHNiaS0+bmxzX2lvKTsKKwkJc2JpLT5ubHNfaW8gPSBOVUxMOworCX0KKwlpZiAoc2JpLT5vcHRpb25zLmlvY2hhcnNldCAhPSBmYXRfZGVmYXVsdF9pb2NoYXJzZXQpIHsKKwkJa2ZyZWUoc2JpLT5vcHRpb25zLmlvY2hhcnNldCk7CisJCXNiaS0+b3B0aW9ucy5pb2NoYXJzZXQgPSBmYXRfZGVmYXVsdF9pb2NoYXJzZXQ7CisJfQorCisJc2ItPnNfZnNfaW5mbyA9IE5VTEw7CisJa2ZyZWUoc2JpKTsKK30KKworc3RhdGljIGttZW1fY2FjaGVfdCAqZmF0X2lub2RlX2NhY2hlcDsKKworc3RhdGljIHN0cnVjdCBpbm9kZSAqZmF0X2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IG1zZG9zX2lub2RlX2luZm8gKmVpOworCWVpID0ga21lbV9jYWNoZV9hbGxvYyhmYXRfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJaWYgKCFlaSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuICZlaS0+dmZzX2lub2RlOworfQorCitzdGF0aWMgdm9pZCBmYXRfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWttZW1fY2FjaGVfZnJlZShmYXRfaW5vZGVfY2FjaGVwLCBNU0RPU19JKGlub2RlKSk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICogZm9vLCBrbWVtX2NhY2hlX3QgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IG1zZG9zX2lub2RlX2luZm8gKmVpID0gKHN0cnVjdCBtc2Rvc19pbm9kZV9pbmZvICopZm9vOworCisJaWYgKChmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CisJICAgIFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikgeworCQlzcGluX2xvY2tfaW5pdCgmZWktPmNhY2hlX2xydV9sb2NrKTsKKwkJZWktPm5yX2NhY2hlcyA9IDA7CisJCWVpLT5jYWNoZV92YWxpZF9pZCA9IEZBVF9DQUNIRV9WQUxJRCArIDE7CisJCUlOSVRfTElTVF9IRUFEKCZlaS0+Y2FjaGVfbHJ1KTsKKwkJSU5JVF9ITElTVF9OT0RFKCZlaS0+aV9mYXRfaGFzaCk7CisJCWlub2RlX2luaXRfb25jZSgmZWktPnZmc19pbm9kZSk7CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBmYXRfaW5pdF9pbm9kZWNhY2hlKHZvaWQpCit7CisJZmF0X2lub2RlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJmYXRfaW5vZGVfY2FjaGUiLAorCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgbXNkb3NfaW5vZGVfaW5mbyksCisJCQkJCSAgICAgMCwgU0xBQl9SRUNMQUlNX0FDQ09VTlQsCisJCQkJCSAgICAgaW5pdF9vbmNlLCBOVUxMKTsKKwlpZiAoZmF0X2lub2RlX2NhY2hlcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGZhdF9kZXN0cm95X2lub2RlY2FjaGUodm9pZCkKK3sKKwlpZiAoa21lbV9jYWNoZV9kZXN0cm95KGZhdF9pbm9kZV9jYWNoZXApKQorCQlwcmludGsoS0VSTl9JTkZPICJmYXRfaW5vZGVfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKK30KKworc3RhdGljIGludCBmYXRfcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpkYXRhKQoreworCXN0cnVjdCBtc2Rvc19zYl9pbmZvICpzYmkgPSBNU0RPU19TQihzYik7CisJKmZsYWdzIHw9IE1TX05PRElSQVRJTUUgfCAoc2JpLT5vcHRpb25zLmlzdmZhdCA/IDAgOiBNU19OT0FUSU1FKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmYXRfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICpidWYpCit7CisJc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSA9IE1TRE9TX1NCKHNiKTsKKworCS8qIElmIHRoZSBjb3VudCBvZiBmcmVlIGNsdXN0ZXIgaXMgc3RpbGwgdW5rbm93biwgY291bnRzIGl0IGhlcmUuICovCisJaWYgKHNiaS0+ZnJlZV9jbHVzdGVycyA9PSAtMSkgeworCQlpbnQgZXJyID0gZmF0X2NvdW50X2ZyZWVfY2x1c3RlcnMoc2IpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlidWYtPmZfdHlwZSA9IHNiLT5zX21hZ2ljOworCWJ1Zi0+Zl9ic2l6ZSA9IHNiaS0+Y2x1c3Rlcl9zaXplOworCWJ1Zi0+Zl9ibG9ja3MgPSBzYmktPm1heF9jbHVzdGVyIC0gRkFUX1NUQVJUX0VOVDsKKwlidWYtPmZfYmZyZWUgPSBzYmktPmZyZWVfY2x1c3RlcnM7CisJYnVmLT5mX2JhdmFpbCA9IHNiaS0+ZnJlZV9jbHVzdGVyczsKKwlidWYtPmZfbmFtZWxlbiA9IHNiaS0+b3B0aW9ucy5pc3ZmYXQgPyAyNjAgOiAxMjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZhdF93cml0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgd2FpdCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSA9IE1TRE9TX1NCKHNiKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBtc2Rvc19kaXJfZW50cnkgKnJhd19lbnRyeTsKKwlsb2ZmX3QgaV9wb3M7CisJaW50IGVyciA9IDA7CisKK3JldHJ5OgorCWlfcG9zID0gTVNET1NfSShpbm9kZSktPmlfcG9zOworCWlmIChpbm9kZS0+aV9pbm8gPT0gTVNET1NfUk9PVF9JTk8gfHwgIWlfcG9zKQorCQlyZXR1cm4gMDsKKworCWxvY2tfa2VybmVsKCk7CisJYmggPSBzYl9icmVhZChzYiwgaV9wb3MgPj4gc2JpLT5kaXJfcGVyX2Jsb2NrX2JpdHMpOworCWlmICghYmgpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGQVQ6IHVuYWJsZSB0byByZWFkIGlub2RlIGJsb2NrICIKKwkJICAgICAgICJmb3IgdXBkYXRpbmcgKGlfcG9zICVsbGQpXG4iLCBpX3Bvcyk7CisJCWVyciA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKwlzcGluX2xvY2soJnNiaS0+aW5vZGVfaGFzaF9sb2NrKTsKKwlpZiAoaV9wb3MgIT0gTVNET1NfSShpbm9kZSktPmlfcG9zKSB7CisJCXNwaW5fdW5sb2NrKCZzYmktPmlub2RlX2hhc2hfbG9jayk7CisJCWJyZWxzZShiaCk7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJZ290byByZXRyeTsKKwl9CisKKwlyYXdfZW50cnkgPSAmKChzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5ICopIChiaC0+Yl9kYXRhKSkKKwkgICAgW2lfcG9zICYgKHNiaS0+ZGlyX3Blcl9ibG9jayAtIDEpXTsKKwlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJcmF3X2VudHJ5LT5zaXplID0gMDsKKwllbHNlCisJCXJhd19lbnRyeS0+c2l6ZSA9IGNwdV90b19sZTMyKGlub2RlLT5pX3NpemUpOworCXJhd19lbnRyeS0+YXR0ciA9IGZhdF9hdHRyKGlub2RlKTsKKwlyYXdfZW50cnktPnN0YXJ0ID0gY3B1X3RvX2xlMTYoTVNET1NfSShpbm9kZSktPmlfbG9nc3RhcnQpOworCXJhd19lbnRyeS0+c3RhcnRoaSA9IGNwdV90b19sZTE2KE1TRE9TX0koaW5vZGUpLT5pX2xvZ3N0YXJ0ID4+IDE2KTsKKwlmYXRfZGF0ZV91bml4MmRvcyhpbm9kZS0+aV9tdGltZS50dl9zZWMsICZyYXdfZW50cnktPnRpbWUsICZyYXdfZW50cnktPmRhdGUpOworCWlmIChzYmktPm9wdGlvbnMuaXN2ZmF0KSB7CisJCWZhdF9kYXRlX3VuaXgyZG9zKGlub2RlLT5pX2N0aW1lLnR2X3NlYywmcmF3X2VudHJ5LT5jdGltZSwmcmF3X2VudHJ5LT5jZGF0ZSk7CisJCXJhd19lbnRyeS0+Y3RpbWVfY3MgPSAoaW5vZGUtPmlfY3RpbWUudHZfc2VjICYgMSkgKiAxMDAgKworCQkJaW5vZGUtPmlfY3RpbWUudHZfbnNlYyAvIDEwMDAwMDAwOworCX0KKwlzcGluX3VubG9jaygmc2JpLT5pbm9kZV9oYXNoX2xvY2spOworCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwlpZiAod2FpdCkKKwkJZXJyID0gc3luY19kaXJ0eV9idWZmZXIoYmgpOworCWJyZWxzZShiaCk7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnI7Cit9CisKK2ludCBmYXRfc3luY19pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiBmYXRfd3JpdGVfaW5vZGUoaW5vZGUsIDEpOworfQorCitFWFBPUlRfU1lNQk9MKGZhdF9zeW5jX2lub2RlKTsKKworc3RhdGljIGludCBmYXRfc2hvd19vcHRpb25zKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHZmc21vdW50ICptbnQpOworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGZhdF9zb3BzID0geworCS5hbGxvY19pbm9kZQk9IGZhdF9hbGxvY19pbm9kZSwKKwkuZGVzdHJveV9pbm9kZQk9IGZhdF9kZXN0cm95X2lub2RlLAorCS53cml0ZV9pbm9kZQk9IGZhdF93cml0ZV9pbm9kZSwKKwkuZGVsZXRlX2lub2RlCT0gZmF0X2RlbGV0ZV9pbm9kZSwKKwkucHV0X3N1cGVyCT0gZmF0X3B1dF9zdXBlciwKKwkuc3RhdGZzCQk9IGZhdF9zdGF0ZnMsCisJLmNsZWFyX2lub2RlCT0gZmF0X2NsZWFyX2lub2RlLAorCS5yZW1vdW50X2ZzCT0gZmF0X3JlbW91bnQsCisKKwkucmVhZF9pbm9kZQk9IG1ha2VfYmFkX2lub2RlLAorCisJLnNob3dfb3B0aW9ucwk9IGZhdF9zaG93X29wdGlvbnMsCit9OworCisvKgorICogYSBGQVQgZmlsZSBoYW5kbGUgd2l0aCBmaHR5cGUgMyBpcworICogIDAvICBpX2lubyAtIGZvciBmYXN0LCByZWxpYWJsZSBsb29rdXAgaWYgc3RpbGwgaW4gdGhlIGNhY2hlCisgKiAgMS8gIGlfZ2VuZXJhdGlvbiAtIHRvIHNlZSBpZiBpX2lubyBpcyBzdGlsbCB2YWxpZAorICogICAgICAgICAgYml0IDAgPT0gMCBpZmYgZGlyZWN0b3J5CisgKiAgMi8gIGlfcG9zKDgtMzkpIC0gaWYgaW5vIGhhcyBjaGFuZ2VkLCBidXQgc3RpbGwgaW4gY2FjaGUKKyAqICAzLyAgaV9wb3MoNC03KXxpX2xvZ3N0YXJ0IC0gdG8gc2VtaS12ZXJpZnkgaW5vZGUgZm91bmQgYXQgaV9wb3MKKyAqICA0LyAgaV9wb3MoMC0zKXxwYXJlbnQtPmlfbG9nc3RhcnQgLSBtYXliZSB1c2VkIHRvIGh1bnQgZm9yIHRoZSBmaWxlIG9uIGRpc2MKKyAqCisgKiBIYWNrIGZvciBORlN2MjogTWF4aW11bSBGQVQgZW50cnkgbnVtYmVyIGlzIDI4Yml0cyBhbmQgbWF4aW11bQorICogaV9wb3MgaXMgNDBiaXRzIChibG9ja25yKDMyKSArIGRpciBvZmZzZXQoOCkpLCBzbyB0d28gNGJpdHMKKyAqIG9mIGlfbG9nc3RhcnQgaXMgdXNlZCB0byBzdG9yZSB0aGUgZGlyZWN0b3J5IGVudHJ5IG9mZnNldC4KKyAqLworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqCitmYXRfZGVjb2RlX2ZoKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIF9fdTMyICpmaCwgaW50IGxlbiwgaW50IGZodHlwZSwKKwkgICAgICBpbnQgKCphY2NlcHRhYmxlKSh2b2lkICpjb250ZXh0LCBzdHJ1Y3QgZGVudHJ5ICpkZSksCisJICAgICAgdm9pZCAqY29udGV4dCkKK3sKKwlpZiAoZmh0eXBlICE9IDMpCisJCXJldHVybiBFUlJfUFRSKC1FU1RBTEUpOworCWlmIChsZW4gPCA1KQorCQlyZXR1cm4gRVJSX1BUUigtRVNUQUxFKTsKKworCXJldHVybiBzYi0+c19leHBvcnRfb3AtPmZpbmRfZXhwb3J0ZWRfZGVudHJ5KHNiLCBmaCwgTlVMTCwgYWNjZXB0YWJsZSwgY29udGV4dCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpmYXRfZ2V0X2RlbnRyeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICppbnVtcCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKKwlzdHJ1Y3QgZGVudHJ5ICpyZXN1bHQ7CisJX191MzIgKmZoID0gaW51bXA7CisKKwlpbm9kZSA9IGlnZXQoc2IsIGZoWzBdKTsKKwlpZiAoIWlub2RlIHx8IGlzX2JhZF9pbm9kZShpbm9kZSkgfHwgaW5vZGUtPmlfZ2VuZXJhdGlvbiAhPSBmaFsxXSkgeworCQlpZiAoaW5vZGUpCisJCQlpcHV0KGlub2RlKTsKKwkJaW5vZGUgPSBOVUxMOworCX0KKwlpZiAoIWlub2RlKSB7CisJCWxvZmZfdCBpX3BvczsKKwkJaW50IGlfbG9nc3RhcnQgPSBmaFszXSAmIDB4MGZmZmZmZmY7CisKKwkJaV9wb3MgPSAobG9mZl90KWZoWzJdIDw8IDg7CisJCWlfcG9zIHw9ICgoZmhbM10gPj4gMjQpICYgMHhmMCkgfCAoZmhbNF0gPj4gMjgpOworCisJCS8qIHRyeSAyIC0gc2VlIGlmIGlfcG9zIGlzIGluIEYtZC1jCisJCSAqIHJlcXVpcmUgaV9sb2dzdGFydCB0byBiZSB0aGUgc2FtZQorCQkgKiBXaWxsIGZhaWwgaWYgeW91IHRydW5jYXRlIGFuZCB0aGVuIHJlLXdyaXRlCisJCSAqLworCisJCWlub2RlID0gZmF0X2lnZXQoc2IsIGlfcG9zKTsKKwkJaWYgKGlub2RlICYmIE1TRE9TX0koaW5vZGUpLT5pX2xvZ3N0YXJ0ICE9IGlfbG9nc3RhcnQpIHsKKwkJCWlwdXQoaW5vZGUpOworCQkJaW5vZGUgPSBOVUxMOworCQl9CisJfQorCWlmICghaW5vZGUpIHsKKwkJLyogRm9yIG5vdywgZG8gbm90aGluZworCQkgKiBXaGF0IHdlIGNvdWxkIGRvIGlzOgorCQkgKiBmb2xsb3cgdGhlIGZpbGUgc3RhcnRpbmcgYXQgZmhbNF0sIGFuZCByZWNvcmQKKwkJICogdGhlICIuLiIgZW50cnksIGFuZCB0aGUgbmFtZSBvZiB0aGUgZmhbMl0gZW50cnkuCisJCSAqIFRoZSBmb2xsb3cgdGhlICIuLiIgZmlsZSBmaW5kaW5nIHRoZSBuZXh0IHN0ZXAgdXAuCisJCSAqIFRoaXMgd2F5IHdlIGJ1aWxkIGEgcGF0aCB0byB0aGUgcm9vdCBvZgorCQkgKiB0aGUgdHJlZS4gSWYgdGhpcyB3b3Jrcywgd2UgbG9va3VwIHRoZSBwYXRoIGFuZCBzbworCQkgKiBnZXQgdGhpcyBpbm9kZSBpbnRvIHRoZSBjYWNoZS4KKwkJICogRmluYWxseSB0cnkgdGhlIGZhdF9pZ2V0IGxvb2t1cCBhZ2FpbgorCQkgKiBJZiB0aGF0IGZhaWxzLCB0aGVuIHdlYXJlIHRvdGFsbHkgb3V0IG9mIGx1Y2sKKwkJICogQnV0IGFsbCB0aGF0IGlzIGZvciBhbm90aGVyIGRheQorCQkgKi8KKwl9CisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVTVEFMRSk7CisKKworCS8qIG5vdyB0byBmaW5kIGEgZGVudHJ5LgorCSAqIElmIHBvc3NpYmxlLCBnZXQgYSB3ZWxsLWNvbm5lY3RlZCBvbmUKKwkgKi8KKwlyZXN1bHQgPSBkX2FsbG9jX2Fub24oaW5vZGUpOworCWlmIChyZXN1bHQgPT0gTlVMTCkgeworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCXJlc3VsdC0+ZF9vcCA9IHNiLT5zX3Jvb3QtPmRfb3A7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludAorZmF0X2VuY29kZV9maChzdHJ1Y3QgZGVudHJ5ICpkZSwgX191MzIgKmZoLCBpbnQgKmxlbnAsIGludCBjb25uZWN0YWJsZSkKK3sKKwlpbnQgbGVuID0gKmxlbnA7CisJc3RydWN0IGlub2RlICppbm9kZSA9ICBkZS0+ZF9pbm9kZTsKKwl1MzIgaXBvc19oLCBpcG9zX20sIGlwb3NfbDsKKworCWlmIChsZW4gPCA1KQorCQlyZXR1cm4gMjU1OyAvKiBubyByb29tICovCisKKwlpcG9zX2ggPSBNU0RPU19JKGlub2RlKS0+aV9wb3MgPj4gODsKKwlpcG9zX20gPSAoTVNET1NfSShpbm9kZSktPmlfcG9zICYgMHhmMCkgPDwgMjQ7CisJaXBvc19sID0gKE1TRE9TX0koaW5vZGUpLT5pX3BvcyAmIDB4MGYpIDw8IDI4OworCSpsZW5wID0gNTsKKwlmaFswXSA9IGlub2RlLT5pX2lubzsKKwlmaFsxXSA9IGlub2RlLT5pX2dlbmVyYXRpb247CisJZmhbMl0gPSBpcG9zX2g7CisJZmhbM10gPSBpcG9zX20gfCBNU0RPU19JKGlub2RlKS0+aV9sb2dzdGFydDsKKwlzcGluX2xvY2soJmRlLT5kX2xvY2spOworCWZoWzRdID0gaXBvc19sIHwgTVNET1NfSShkZS0+ZF9wYXJlbnQtPmRfaW5vZGUpLT5pX2xvZ3N0YXJ0OworCXNwaW5fdW5sb2NrKCZkZS0+ZF9sb2NrKTsKKwlyZXR1cm4gMzsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmZhdF9nZXRfcGFyZW50KHN0cnVjdCBkZW50cnkgKmNoaWxkKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSAqZGU7CisJbG9mZl90IGlfcG9zOworCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWludCBlcnI7CisKKwlsb2NrX2tlcm5lbCgpOworCisJZXJyID0gZmF0X2dldF9kb3Rkb3RfZW50cnkoY2hpbGQtPmRfaW5vZGUsICZiaCwgJmRlLCAmaV9wb3MpOworCWlmIChlcnIpIHsKKwkJcGFyZW50ID0gRVJSX1BUUihlcnIpOworCQlnb3RvIG91dDsKKwl9CisJaW5vZGUgPSBmYXRfYnVpbGRfaW5vZGUoY2hpbGQtPmRfc2IsIGRlLCBpX3Bvcyk7CisJYnJlbHNlKGJoKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkgeworCQlwYXJlbnQgPSBFUlJfUFRSKFBUUl9FUlIoaW5vZGUpKTsKKwkJZ290byBvdXQ7CisJfQorCXBhcmVudCA9IGRfYWxsb2NfYW5vbihpbm9kZSk7CisJaWYgKCFwYXJlbnQpIHsKKwkJaXB1dChpbm9kZSk7CisJCXBhcmVudCA9IEVSUl9QVFIoLUVOT01FTSk7CisJfQorb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKworCXJldHVybiBwYXJlbnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgZmF0X2V4cG9ydF9vcHMgPSB7CisJLmRlY29kZV9maAk9IGZhdF9kZWNvZGVfZmgsCisJLmVuY29kZV9maAk9IGZhdF9lbmNvZGVfZmgsCisJLmdldF9kZW50cnkJPSBmYXRfZ2V0X2RlbnRyeSwKKwkuZ2V0X3BhcmVudAk9IGZhdF9nZXRfcGFyZW50LAorfTsKKworc3RhdGljIGludCBmYXRfc2hvd19vcHRpb25zKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHZmc21vdW50ICptbnQpCit7CisJc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSA9IE1TRE9TX1NCKG1udC0+bW50X3NiKTsKKwlzdHJ1Y3QgZmF0X21vdW50X29wdGlvbnMgKm9wdHMgPSAmc2JpLT5vcHRpb25zOworCWludCBpc3ZmYXQgPSBvcHRzLT5pc3ZmYXQ7CisKKwlpZiAob3B0cy0+ZnNfdWlkICE9IDApCisJCXNlcV9wcmludGYobSwgIix1aWQ9JXUiLCBvcHRzLT5mc191aWQpOworCWlmIChvcHRzLT5mc19naWQgIT0gMCkKKwkJc2VxX3ByaW50ZihtLCAiLGdpZD0ldSIsIG9wdHMtPmZzX2dpZCk7CisJc2VxX3ByaW50ZihtLCAiLGZtYXNrPSUwNG8iLCBvcHRzLT5mc19mbWFzayk7CisJc2VxX3ByaW50ZihtLCAiLGRtYXNrPSUwNG8iLCBvcHRzLT5mc19kbWFzayk7CisJaWYgKHNiaS0+bmxzX2Rpc2spCisJCXNlcV9wcmludGYobSwgIixjb2RlcGFnZT0lcyIsIHNiaS0+bmxzX2Rpc2stPmNoYXJzZXQpOworCWlmIChpc3ZmYXQpIHsKKwkJaWYgKHNiaS0+bmxzX2lvKQorCQkJc2VxX3ByaW50ZihtLCAiLGlvY2hhcnNldD0lcyIsIHNiaS0+bmxzX2lvLT5jaGFyc2V0KTsKKworCQlzd2l0Y2ggKG9wdHMtPnNob3J0bmFtZSkgeworCQljYXNlIFZGQVRfU0ZOX0RJU1BMQVlfV0lOOTUgfCBWRkFUX1NGTl9DUkVBVEVfV0lOOTU6CisJCQlzZXFfcHV0cyhtLCAiLHNob3J0bmFtZT13aW45NSIpOworCQkJYnJlYWs7CisJCWNhc2UgVkZBVF9TRk5fRElTUExBWV9XSU5OVCB8IFZGQVRfU0ZOX0NSRUFURV9XSU5OVDoKKwkJCXNlcV9wdXRzKG0sICIsc2hvcnRuYW1lPXdpbm50Iik7CisJCQlicmVhazsKKwkJY2FzZSBWRkFUX1NGTl9ESVNQTEFZX1dJTk5UIHwgVkZBVF9TRk5fQ1JFQVRFX1dJTjk1OgorCQkJc2VxX3B1dHMobSwgIixzaG9ydG5hbWU9bWl4ZWQiKTsKKwkJCWJyZWFrOworCQljYXNlIFZGQVRfU0ZOX0RJU1BMQVlfTE9XRVIgfCBWRkFUX1NGTl9DUkVBVEVfV0lOOTU6CisJCQkvKiBzZXFfcHV0cyhtLCAiLHNob3J0bmFtZT1sb3dlciIpOyAqLworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzZXFfcHV0cyhtLCAiLHNob3J0bmFtZT11bmtub3duIik7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAob3B0cy0+bmFtZV9jaGVjayAhPSAnbicpCisJCXNlcV9wcmludGYobSwgIixjaGVjaz0lYyIsIG9wdHMtPm5hbWVfY2hlY2spOworCWlmIChvcHRzLT5xdWlldCkKKwkJc2VxX3B1dHMobSwgIixxdWlldCIpOworCWlmIChvcHRzLT5zaG93ZXhlYykKKwkJc2VxX3B1dHMobSwgIixzaG93ZXhlYyIpOworCWlmIChvcHRzLT5zeXNfaW1tdXRhYmxlKQorCQlzZXFfcHV0cyhtLCAiLHN5c19pbW11dGFibGUiKTsKKwlpZiAoIWlzdmZhdCkgeworCQlpZiAob3B0cy0+ZG90c09LKQorCQkJc2VxX3B1dHMobSwgIixkb3RzT0s9eWVzIik7CisJCWlmIChvcHRzLT5ub2Nhc2UpCisJCQlzZXFfcHV0cyhtLCAiLG5vY2FzZSIpOworCX0gZWxzZSB7CisJCWlmIChvcHRzLT51dGY4KQorCQkJc2VxX3B1dHMobSwgIix1dGY4Iik7CisJCWlmIChvcHRzLT51bmljb2RlX3hsYXRlKQorCQkJc2VxX3B1dHMobSwgIix1bmlfeGxhdGUiKTsKKwkJaWYgKCFvcHRzLT5udW10YWlsKQorCQkJc2VxX3B1dHMobSwgIixub251bXRhaWwiKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworZW51bSB7CisJT3B0X2NoZWNrX24sIE9wdF9jaGVja19yLCBPcHRfY2hlY2tfcywgT3B0X3VpZCwgT3B0X2dpZCwKKwlPcHRfdW1hc2ssIE9wdF9kbWFzaywgT3B0X2ZtYXNrLCBPcHRfY29kZXBhZ2UsIE9wdF9ub2Nhc2UsCisJT3B0X3F1aWV0LCBPcHRfc2hvd2V4ZWMsIE9wdF9kZWJ1ZywgT3B0X2ltbXV0YWJsZSwKKwlPcHRfZG90cywgT3B0X25vZG90cywKKwlPcHRfY2hhcnNldCwgT3B0X3Nob3J0bmFtZV9sb3dlciwgT3B0X3Nob3J0bmFtZV93aW45NSwKKwlPcHRfc2hvcnRuYW1lX3dpbm50LCBPcHRfc2hvcnRuYW1lX21peGVkLCBPcHRfdXRmOF9ubywgT3B0X3V0ZjhfeWVzLAorCU9wdF91bmlfeGxfbm8sIE9wdF91bmlfeGxfeWVzLCBPcHRfbm9udW10YWlsX25vLCBPcHRfbm9udW10YWlsX3llcywKKwlPcHRfb2Jzb2xhdGUsIE9wdF9lcnIsCit9OworCitzdGF0aWMgbWF0Y2hfdGFibGVfdCBmYXRfdG9rZW5zID0geworCXtPcHRfY2hlY2tfciwgImNoZWNrPXJlbGF4ZWQifSwKKwl7T3B0X2NoZWNrX3MsICJjaGVjaz1zdHJpY3QifSwKKwl7T3B0X2NoZWNrX24sICJjaGVjaz1ub3JtYWwifSwKKwl7T3B0X2NoZWNrX3IsICJjaGVjaz1yIn0sCisJe09wdF9jaGVja19zLCAiY2hlY2s9cyJ9LAorCXtPcHRfY2hlY2tfbiwgImNoZWNrPW4ifSwKKwl7T3B0X3VpZCwgInVpZD0ldSJ9LAorCXtPcHRfZ2lkLCAiZ2lkPSV1In0sCisJe09wdF91bWFzaywgInVtYXNrPSVvIn0sCisJe09wdF9kbWFzaywgImRtYXNrPSVvIn0sCisJe09wdF9mbWFzaywgImZtYXNrPSVvIn0sCisJe09wdF9jb2RlcGFnZSwgImNvZGVwYWdlPSV1In0sCisJe09wdF9ub2Nhc2UsICJub2Nhc2UifSwKKwl7T3B0X3F1aWV0LCAicXVpZXQifSwKKwl7T3B0X3Nob3dleGVjLCAic2hvd2V4ZWMifSwKKwl7T3B0X2RlYnVnLCAiZGVidWcifSwKKwl7T3B0X2ltbXV0YWJsZSwgInN5c19pbW11dGFibGUifSwKKwl7T3B0X29ic29sYXRlLCAiY29udj1iaW5hcnkifSwKKwl7T3B0X29ic29sYXRlLCAiY29udj10ZXh0In0sCisJe09wdF9vYnNvbGF0ZSwgImNvbnY9YXV0byJ9LAorCXtPcHRfb2Jzb2xhdGUsICJjb252PWIifSwKKwl7T3B0X29ic29sYXRlLCAiY29udj10In0sCisJe09wdF9vYnNvbGF0ZSwgImNvbnY9YSJ9LAorCXtPcHRfb2Jzb2xhdGUsICJmYXQ9JXUifSwKKwl7T3B0X29ic29sYXRlLCAiYmxvY2tzaXplPSV1In0sCisJe09wdF9vYnNvbGF0ZSwgImN2Zl9mb3JtYXQ9JTIwcyJ9LAorCXtPcHRfb2Jzb2xhdGUsICJjdmZfb3B0aW9ucz0lMTAwcyJ9LAorCXtPcHRfb2Jzb2xhdGUsICJwb3NpeCJ9LAorCXtPcHRfZXJyLCBOVUxMfQorfTsKK3N0YXRpYyBtYXRjaF90YWJsZV90IG1zZG9zX3Rva2VucyA9IHsKKwl7T3B0X25vZG90cywgIm5vZG90cyJ9LAorCXtPcHRfbm9kb3RzLCAiZG90c09LPW5vIn0sCisJe09wdF9kb3RzLCAiZG90cyJ9LAorCXtPcHRfZG90cywgImRvdHNPSz15ZXMifSwKKwl7T3B0X2VyciwgTlVMTH0KK307CitzdGF0aWMgbWF0Y2hfdGFibGVfdCB2ZmF0X3Rva2VucyA9IHsKKwl7T3B0X2NoYXJzZXQsICJpb2NoYXJzZXQ9JXMifSwKKwl7T3B0X3Nob3J0bmFtZV9sb3dlciwgInNob3J0bmFtZT1sb3dlciJ9LAorCXtPcHRfc2hvcnRuYW1lX3dpbjk1LCAic2hvcnRuYW1lPXdpbjk1In0sCisJe09wdF9zaG9ydG5hbWVfd2lubnQsICJzaG9ydG5hbWU9d2lubnQifSwKKwl7T3B0X3Nob3J0bmFtZV9taXhlZCwgInNob3J0bmFtZT1taXhlZCJ9LAorCXtPcHRfdXRmOF9ubywgInV0Zjg9MCJ9LAkJLyogMCBvciBubyBvciBmYWxzZSAqLworCXtPcHRfdXRmOF9ubywgInV0Zjg9bm8ifSwKKwl7T3B0X3V0Zjhfbm8sICJ1dGY4PWZhbHNlIn0sCisJe09wdF91dGY4X3llcywgInV0Zjg9MSJ9LAkJLyogZW1wdHkgb3IgMSBvciB5ZXMgb3IgdHJ1ZSAqLworCXtPcHRfdXRmOF95ZXMsICJ1dGY4PXllcyJ9LAorCXtPcHRfdXRmOF95ZXMsICJ1dGY4PXRydWUifSwKKwl7T3B0X3V0ZjhfeWVzLCAidXRmOCJ9LAorCXtPcHRfdW5pX3hsX25vLCAidW5pX3hsYXRlPTAifSwJCS8qIDAgb3Igbm8gb3IgZmFsc2UgKi8KKwl7T3B0X3VuaV94bF9ubywgInVuaV94bGF0ZT1ubyJ9LAorCXtPcHRfdW5pX3hsX25vLCAidW5pX3hsYXRlPWZhbHNlIn0sCisJe09wdF91bmlfeGxfeWVzLCAidW5pX3hsYXRlPTEifSwJLyogZW1wdHkgb3IgMSBvciB5ZXMgb3IgdHJ1ZSAqLworCXtPcHRfdW5pX3hsX3llcywgInVuaV94bGF0ZT15ZXMifSwKKwl7T3B0X3VuaV94bF95ZXMsICJ1bmlfeGxhdGU9dHJ1ZSJ9LAorCXtPcHRfdW5pX3hsX3llcywgInVuaV94bGF0ZSJ9LAorCXtPcHRfbm9udW10YWlsX25vLCAibm9udW10YWlsPTAifSwJLyogMCBvciBubyBvciBmYWxzZSAqLworCXtPcHRfbm9udW10YWlsX25vLCAibm9udW10YWlsPW5vIn0sCisJe09wdF9ub251bXRhaWxfbm8sICJub251bXRhaWw9ZmFsc2UifSwKKwl7T3B0X25vbnVtdGFpbF95ZXMsICJub251bXRhaWw9MSJ9LAkvKiBlbXB0eSBvciAxIG9yIHllcyBvciB0cnVlICovCisJe09wdF9ub251bXRhaWxfeWVzLCAibm9udW10YWlsPXllcyJ9LAorCXtPcHRfbm9udW10YWlsX3llcywgIm5vbnVtdGFpbD10cnVlIn0sCisJe09wdF9ub251bXRhaWxfeWVzLCAibm9udW10YWlsIn0sCisJe09wdF9lcnIsIE5VTEx9Cit9OworCitzdGF0aWMgaW50IHBhcnNlX29wdGlvbnMoY2hhciAqb3B0aW9ucywgaW50IGlzX3ZmYXQsIGludCAqZGVidWcsCisJCQkgc3RydWN0IGZhdF9tb3VudF9vcHRpb25zICpvcHRzKQoreworCWNoYXIgKnA7CisJc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOworCWludCBvcHRpb247CisJY2hhciAqaW9jaGFyc2V0OworCisJb3B0cy0+aXN2ZmF0ID0gaXNfdmZhdDsKKworCW9wdHMtPmZzX3VpZCA9IGN1cnJlbnQtPnVpZDsKKwlvcHRzLT5mc19naWQgPSBjdXJyZW50LT5naWQ7CisJb3B0cy0+ZnNfZm1hc2sgPSBvcHRzLT5mc19kbWFzayA9IGN1cnJlbnQtPmZzLT51bWFzazsKKwlvcHRzLT5jb2RlcGFnZSA9IGZhdF9kZWZhdWx0X2NvZGVwYWdlOworCW9wdHMtPmlvY2hhcnNldCA9IGZhdF9kZWZhdWx0X2lvY2hhcnNldDsKKwlpZiAoaXNfdmZhdCkKKwkJb3B0cy0+c2hvcnRuYW1lID0gVkZBVF9TRk5fRElTUExBWV9MT1dFUnxWRkFUX1NGTl9DUkVBVEVfV0lOOTU7CisJZWxzZQorCQlvcHRzLT5zaG9ydG5hbWUgPSAwOworCW9wdHMtPm5hbWVfY2hlY2sgPSAnbic7CisJb3B0cy0+cXVpZXQgPSBvcHRzLT5zaG93ZXhlYyA9IG9wdHMtPnN5c19pbW11dGFibGUgPSBvcHRzLT5kb3RzT0sgPSAgMDsKKwlvcHRzLT51dGY4ID0gb3B0cy0+dW5pY29kZV94bGF0ZSA9IDA7CisJb3B0cy0+bnVtdGFpbCA9IDE7CisJb3B0cy0+bm9jYXNlID0gMDsKKwkqZGVidWcgPSAwOworCisJaWYgKCFvcHRpb25zKQorCQlyZXR1cm4gMDsKKworCXdoaWxlICgocCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgeworCQlpbnQgdG9rZW47CisJCWlmICghKnApCisJCQljb250aW51ZTsKKworCQl0b2tlbiA9IG1hdGNoX3Rva2VuKHAsIGZhdF90b2tlbnMsIGFyZ3MpOworCQlpZiAodG9rZW4gPT0gT3B0X2VycikgeworCQkJaWYgKGlzX3ZmYXQpCisJCQkJdG9rZW4gPSBtYXRjaF90b2tlbihwLCB2ZmF0X3Rva2VucywgYXJncyk7CisJCQllbHNlCisJCQkJdG9rZW4gPSBtYXRjaF90b2tlbihwLCBtc2Rvc190b2tlbnMsIGFyZ3MpOworCQl9CisJCXN3aXRjaCAodG9rZW4pIHsKKwkJY2FzZSBPcHRfY2hlY2tfczoKKwkJCW9wdHMtPm5hbWVfY2hlY2sgPSAncyc7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfY2hlY2tfcjoKKwkJCW9wdHMtPm5hbWVfY2hlY2sgPSAncic7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfY2hlY2tfbjoKKwkJCW9wdHMtPm5hbWVfY2hlY2sgPSAnbic7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm9jYXNlOgorCQkJaWYgKCFpc192ZmF0KQorCQkJCW9wdHMtPm5vY2FzZSA9IDE7CisJCQllbHNlIHsKKwkJCQkvKiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSAqLworCQkJCW9wdHMtPnNob3J0bmFtZSA9IFZGQVRfU0ZOX0RJU1BMQVlfV0lOOTUKKwkJCQkJfCBWRkFUX1NGTl9DUkVBVEVfV0lOOTU7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBPcHRfcXVpZXQ6CisJCQlvcHRzLT5xdWlldCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfc2hvd2V4ZWM6CisJCQlvcHRzLT5zaG93ZXhlYyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZGVidWc6CisJCQkqZGVidWcgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2ltbXV0YWJsZToKKwkJCW9wdHMtPnN5c19pbW11dGFibGUgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3VpZDoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAwOworCQkJb3B0cy0+ZnNfdWlkID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2dpZDoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAwOworCQkJb3B0cy0+ZnNfZ2lkID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3VtYXNrOgorCQkJaWYgKG1hdGNoX29jdGFsKCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMDsKKwkJCW9wdHMtPmZzX2ZtYXNrID0gb3B0cy0+ZnNfZG1hc2sgPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZG1hc2s6CisJCQlpZiAobWF0Y2hfb2N0YWwoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAwOworCQkJb3B0cy0+ZnNfZG1hc2sgPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZm1hc2s6CisJCQlpZiAobWF0Y2hfb2N0YWwoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAwOworCQkJb3B0cy0+ZnNfZm1hc2sgPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfY29kZXBhZ2U6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMDsKKwkJCW9wdHMtPmNvZGVwYWdlID0gb3B0aW9uOworCQkJYnJlYWs7CisKKwkJLyogbXNkb3Mgc3BlY2lmaWMgKi8KKwkJY2FzZSBPcHRfZG90czoKKwkJCW9wdHMtPmRvdHNPSyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm9kb3RzOgorCQkJb3B0cy0+ZG90c09LID0gMDsKKwkJCWJyZWFrOworCisJCS8qIHZmYXQgc3BlY2lmaWMgKi8KKwkJY2FzZSBPcHRfY2hhcnNldDoKKwkJCWlmIChvcHRzLT5pb2NoYXJzZXQgIT0gZmF0X2RlZmF1bHRfaW9jaGFyc2V0KQorCQkJCWtmcmVlKG9wdHMtPmlvY2hhcnNldCk7CisJCQlpb2NoYXJzZXQgPSBtYXRjaF9zdHJkdXAoJmFyZ3NbMF0pOworCQkJaWYgKCFpb2NoYXJzZXQpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQlvcHRzLT5pb2NoYXJzZXQgPSBpb2NoYXJzZXQ7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfc2hvcnRuYW1lX2xvd2VyOgorCQkJb3B0cy0+c2hvcnRuYW1lID0gVkZBVF9TRk5fRElTUExBWV9MT1dFUgorCQkJCQl8IFZGQVRfU0ZOX0NSRUFURV9XSU45NTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9zaG9ydG5hbWVfd2luOTU6CisJCQlvcHRzLT5zaG9ydG5hbWUgPSBWRkFUX1NGTl9ESVNQTEFZX1dJTjk1CisJCQkJCXwgVkZBVF9TRk5fQ1JFQVRFX1dJTjk1OworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3Nob3J0bmFtZV93aW5udDoKKwkJCW9wdHMtPnNob3J0bmFtZSA9IFZGQVRfU0ZOX0RJU1BMQVlfV0lOTlQKKwkJCQkJfCBWRkFUX1NGTl9DUkVBVEVfV0lOTlQ7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfc2hvcnRuYW1lX21peGVkOgorCQkJb3B0cy0+c2hvcnRuYW1lID0gVkZBVF9TRk5fRElTUExBWV9XSU5OVAorCQkJCQl8IFZGQVRfU0ZOX0NSRUFURV9XSU45NTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF91dGY4X25vOgkJLyogMCBvciBubyBvciBmYWxzZSAqLworCQkJb3B0cy0+dXRmOCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfdXRmOF95ZXM6CQkvKiBlbXB0eSBvciAxIG9yIHllcyBvciB0cnVlICovCisJCQlvcHRzLT51dGY4ID0gMTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF91bmlfeGxfbm86CQkvKiAwIG9yIG5vIG9yIGZhbHNlICovCisJCQlvcHRzLT51bmljb2RlX3hsYXRlID0gMDsKKwkJCWJyZWFrOworCQljYXNlIE9wdF91bmlfeGxfeWVzOgkJLyogZW1wdHkgb3IgMSBvciB5ZXMgb3IgdHJ1ZSAqLworCQkJb3B0cy0+dW5pY29kZV94bGF0ZSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm9udW10YWlsX25vOgkJLyogMCBvciBubyBvciBmYWxzZSAqLworCQkJb3B0cy0+bnVtdGFpbCA9IDE7CS8qIG5lZ2F0ZWQgb3B0aW9uICovCisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm9udW10YWlsX3llczoJCS8qIGVtcHR5IG9yIDEgb3IgeWVzIG9yIHRydWUgKi8KKwkJCW9wdHMtPm51bXRhaWwgPSAwOwkvKiBuZWdhdGVkIG9wdGlvbiAqLworCQkJYnJlYWs7CisKKwkJLyogb2Jzb2xldGUgbW91bnQgb3B0aW9ucyAqLworCQljYXNlIE9wdF9vYnNvbGF0ZToKKwkJCXByaW50ayhLRVJOX0lORk8gIkZBVDogXCIlc1wiIG9wdGlvbiBpcyBvYnNvbGV0ZSwgIgorCQkJICAgICAgICJub3Qgc3VwcG9ydGVkIG5vd1xuIiwgcCk7CisJCQlicmVhazsKKwkJLyogdW5rbm93biBvcHRpb24gKi8KKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiRkFUOiBVbnJlY29nbml6ZWQgbW91bnQgb3B0aW9uIFwiJXNcIiAiCisJCQkgICAgICAgIm9yIG1pc3NpbmcgdmFsdWVcbiIsIHApOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJLyogVVRGOCBkb2Vzbid0IHByb3ZpZGUgRkFUIHNlbWFudGljcyAqLworCWlmICghc3RyY21wKG9wdHMtPmlvY2hhcnNldCwgInV0ZjgiKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkZBVDogdXRmOCBpcyBub3QgYSByZWNvbW1lbmRlZCBJTyBjaGFyc2V0IgorCQkgICAgICAgIiBmb3IgRkFUIGZpbGVzeXN0ZW1zLCBmaWxlc3lzdGVtIHdpbGwgYmUgY2FzZSBzZW5zaXRpdmUhXG4iKTsKKwl9CisKKwlpZiAob3B0cy0+dW5pY29kZV94bGF0ZSkKKwkJb3B0cy0+dXRmOCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmYXRfcmVhZF9yb290KHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBtc2Rvc19zYl9pbmZvICpzYmkgPSBNU0RPU19TQihzYik7CisJaW50IGVycm9yOworCisJTVNET1NfSShpbm9kZSktPmlfcG9zID0gMDsKKwlpbm9kZS0+aV91aWQgPSBzYmktPm9wdGlvbnMuZnNfdWlkOworCWlub2RlLT5pX2dpZCA9IHNiaS0+b3B0aW9ucy5mc19naWQ7CisJaW5vZGUtPmlfdmVyc2lvbisrOworCWlub2RlLT5pX2dlbmVyYXRpb24gPSAwOworCWlub2RlLT5pX21vZGUgPSAoU19JUldYVUdPICYgfnNiaS0+b3B0aW9ucy5mc19kbWFzaykgfCBTX0lGRElSOworCWlub2RlLT5pX29wID0gc2JpLT5kaXJfb3BzOworCWlub2RlLT5pX2ZvcCA9ICZmYXRfZGlyX29wZXJhdGlvbnM7CisJaWYgKHNiaS0+ZmF0X2JpdHMgPT0gMzIpIHsKKwkJTVNET1NfSShpbm9kZSktPmlfc3RhcnQgPSBzYmktPnJvb3RfY2x1c3RlcjsKKwkJZXJyb3IgPSBmYXRfY2FsY19kaXJfc2l6ZShpbm9kZSk7CisJCWlmIChlcnJvciA8IDApCisJCQlyZXR1cm4gZXJyb3I7CisJfSBlbHNlIHsKKwkJTVNET1NfSShpbm9kZSktPmlfc3RhcnQgPSAwOworCQlpbm9kZS0+aV9zaXplID0gc2JpLT5kaXJfZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5KTsKKwl9CisJaW5vZGUtPmlfYmxrc2l6ZSA9IHNiaS0+Y2x1c3Rlcl9zaXplOworCWlub2RlLT5pX2Jsb2NrcyA9ICgoaW5vZGUtPmlfc2l6ZSArIChzYmktPmNsdXN0ZXJfc2l6ZSAtIDEpKQorCQkJICAgJiB+KChsb2ZmX3Qpc2JpLT5jbHVzdGVyX3NpemUgLSAxKSkgPj4gOTsKKwlNU0RPU19JKGlub2RlKS0+aV9sb2dzdGFydCA9IDA7CisJTVNET1NfSShpbm9kZSktPm1tdV9wcml2YXRlID0gaW5vZGUtPmlfc2l6ZTsKKworCU1TRE9TX0koaW5vZGUpLT5pX2F0dHJzID0gQVRUUl9OT05FOworCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IGlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IGlub2RlLT5pX2N0aW1lLnR2X3NlYyA9IDA7CisJaW5vZGUtPmlfbXRpbWUudHZfbnNlYyA9IGlub2RlLT5pX2F0aW1lLnR2X25zZWMgPSBpbm9kZS0+aV9jdGltZS50dl9uc2VjID0gMDsKKwlpbm9kZS0+aV9ubGluayA9IGZhdF9zdWJkaXJzKGlub2RlKSsyOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkIHRoZSBzdXBlciBibG9jayBvZiBhbiBNUy1ET1MgRlMuCisgKi8KK2ludCBmYXRfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50LAorCQkgICBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyAqZnNfZGlyX2lub2RlX29wcywgaW50IGlzdmZhdCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKnJvb3RfaW5vZGUgPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGZhdF9ib290X3NlY3RvciAqYjsKKwlzdHJ1Y3QgbXNkb3Nfc2JfaW5mbyAqc2JpOworCXUxNiBsb2dpY2FsX3NlY3Rvcl9zaXplOworCXUzMiB0b3RhbF9zZWN0b3JzLCB0b3RhbF9jbHVzdGVycywgZmF0X2NsdXN0ZXJzLCByb290ZGlyX3NlY3RvcnM7CisJaW50IGRlYnVnOworCXVuc2lnbmVkIGludCBtZWRpYTsKKwlsb25nIGVycm9yOworCWNoYXIgYnVmWzUwXTsKKworCXNiaSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtc2Rvc19zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYmkpCisJCXJldHVybiAtRU5PTUVNOworCXNiLT5zX2ZzX2luZm8gPSBzYmk7CisJbWVtc2V0KHNiaSwgMCwgc2l6ZW9mKHN0cnVjdCBtc2Rvc19zYl9pbmZvKSk7CisKKwlzYi0+c19mbGFncyB8PSBNU19OT0RJUkFUSU1FOworCXNiLT5zX21hZ2ljID0gTVNET1NfU1VQRVJfTUFHSUM7CisJc2ItPnNfb3AgPSAmZmF0X3NvcHM7CisJc2ItPnNfZXhwb3J0X29wID0gJmZhdF9leHBvcnRfb3BzOworCXNiaS0+ZGlyX29wcyA9IGZzX2Rpcl9pbm9kZV9vcHM7CisKKwllcnJvciA9IHBhcnNlX29wdGlvbnMoZGF0YSwgaXN2ZmF0LCAmZGVidWcsICZzYmktPm9wdGlvbnMpOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfZmFpbDsKKworCWVycm9yID0gLUVJTzsKKwlzYl9taW5fYmxvY2tzaXplKHNiLCA1MTIpOworCWJoID0gc2JfYnJlYWQoc2IsIDApOworCWlmIChiaCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRkFUOiB1bmFibGUgdG8gcmVhZCBib290IHNlY3RvclxuIik7CisJCWdvdG8gb3V0X2ZhaWw7CisJfQorCisJYiA9IChzdHJ1Y3QgZmF0X2Jvb3Rfc2VjdG9yICopIGJoLT5iX2RhdGE7CisJaWYgKCFiLT5yZXNlcnZlZCkgeworCQlpZiAoIXNpbGVudCkKKwkJCXByaW50ayhLRVJOX0VSUiAiRkFUOiBib2d1cyBudW1iZXIgb2YgcmVzZXJ2ZWQgc2VjdG9yc1xuIik7CisJCWJyZWxzZShiaCk7CisJCWdvdG8gb3V0X2ludmFsaWQ7CisJfQorCWlmICghYi0+ZmF0cykgeworCQlpZiAoIXNpbGVudCkKKwkJCXByaW50ayhLRVJOX0VSUiAiRkFUOiBib2d1cyBudW1iZXIgb2YgRkFUIHN0cnVjdHVyZVxuIik7CisJCWJyZWxzZShiaCk7CisJCWdvdG8gb3V0X2ludmFsaWQ7CisJfQorCisJLyoKKwkgKiBFYXJsaWVyIHdlIGNoZWNrZWQgaGVyZSB0aGF0IGItPnNlY3NfdHJhY2sgYW5kIGItPmhlYWQgYXJlIG5vbnplcm8sCisJICogYnV0IGl0IHR1cm5zIG91dCB2YWxpZCBGQVQgZmlsZXN5c3RlbXMgY2FuIGhhdmUgemVybyB0aGVyZS4KKwkgKi8KKworCW1lZGlhID0gYi0+bWVkaWE7CisJaWYgKCFGQVRfVkFMSURfTUVESUEobWVkaWEpKSB7CisJCWlmICghc2lsZW50KQorCQkJcHJpbnRrKEtFUk5fRVJSICJGQVQ6IGludmFsaWQgbWVkaWEgdmFsdWUgKDB4JTAyeClcbiIsCisJCQkgICAgICAgbWVkaWEpOworCQlicmVsc2UoYmgpOworCQlnb3RvIG91dF9pbnZhbGlkOworCX0KKwlsb2dpY2FsX3NlY3Rvcl9zaXplID0KKwkJbGUxNl90b19jcHUoZ2V0X3VuYWxpZ25lZCgoX19sZTE2ICopJmItPnNlY3Rvcl9zaXplKSk7CisJaWYgKCFsb2dpY2FsX3NlY3Rvcl9zaXplCisJICAgIHx8IChsb2dpY2FsX3NlY3Rvcl9zaXplICYgKGxvZ2ljYWxfc2VjdG9yX3NpemUgLSAxKSkKKwkgICAgfHwgKGxvZ2ljYWxfc2VjdG9yX3NpemUgPCA1MTIpCisJICAgIHx8IChQQUdFX0NBQ0hFX1NJWkUgPCBsb2dpY2FsX3NlY3Rvcl9zaXplKSkgeworCQlpZiAoIXNpbGVudCkKKwkJCXByaW50ayhLRVJOX0VSUiAiRkFUOiBib2d1cyBsb2dpY2FsIHNlY3RvciBzaXplICV1XG4iLAorCQkJICAgICAgIGxvZ2ljYWxfc2VjdG9yX3NpemUpOworCQlicmVsc2UoYmgpOworCQlnb3RvIG91dF9pbnZhbGlkOworCX0KKwlzYmktPnNlY19wZXJfY2x1cyA9IGItPnNlY19wZXJfY2x1czsKKwlpZiAoIXNiaS0+c2VjX3Blcl9jbHVzCisJICAgIHx8IChzYmktPnNlY19wZXJfY2x1cyAmIChzYmktPnNlY19wZXJfY2x1cyAtIDEpKSkgeworCQlpZiAoIXNpbGVudCkKKwkJCXByaW50ayhLRVJOX0VSUiAiRkFUOiBib2d1cyBzZWN0b3JzIHBlciBjbHVzdGVyICV1XG4iLAorCQkJICAgICAgIHNiaS0+c2VjX3Blcl9jbHVzKTsKKwkJYnJlbHNlKGJoKTsKKwkJZ290byBvdXRfaW52YWxpZDsKKwl9CisKKwlpZiAobG9naWNhbF9zZWN0b3Jfc2l6ZSA8IHNiLT5zX2Jsb2Nrc2l6ZSkgeworCQlwcmludGsoS0VSTl9FUlIgIkZBVDogbG9naWNhbCBzZWN0b3Igc2l6ZSB0b28gc21hbGwgZm9yIGRldmljZSIKKwkJICAgICAgICIgKGxvZ2ljYWwgc2VjdG9yIHNpemUgPSAldSlcbiIsIGxvZ2ljYWxfc2VjdG9yX3NpemUpOworCQlicmVsc2UoYmgpOworCQlnb3RvIG91dF9mYWlsOworCX0KKwlpZiAobG9naWNhbF9zZWN0b3Jfc2l6ZSA+IHNiLT5zX2Jsb2Nrc2l6ZSkgeworCQlicmVsc2UoYmgpOworCisJCWlmICghc2Jfc2V0X2Jsb2Nrc2l6ZShzYiwgbG9naWNhbF9zZWN0b3Jfc2l6ZSkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiRkFUOiB1bmFibGUgdG8gc2V0IGJsb2Nrc2l6ZSAldVxuIiwKKwkJCSAgICAgICBsb2dpY2FsX3NlY3Rvcl9zaXplKTsKKwkJCWdvdG8gb3V0X2ZhaWw7CisJCX0KKwkJYmggPSBzYl9icmVhZChzYiwgMCk7CisJCWlmIChiaCA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkZBVDogdW5hYmxlIHRvIHJlYWQgYm9vdCBzZWN0b3IiCisJCQkgICAgICAgIiAobG9naWNhbCBzZWN0b3Igc2l6ZSA9ICVsdSlcbiIsCisJCQkgICAgICAgc2ItPnNfYmxvY2tzaXplKTsKKwkJCWdvdG8gb3V0X2ZhaWw7CisJCX0KKwkJYiA9IChzdHJ1Y3QgZmF0X2Jvb3Rfc2VjdG9yICopIGJoLT5iX2RhdGE7CisJfQorCisJc2JpLT5jbHVzdGVyX3NpemUgPSBzYi0+c19ibG9ja3NpemUgKiBzYmktPnNlY19wZXJfY2x1czsKKwlzYmktPmNsdXN0ZXJfYml0cyA9IGZmcyhzYmktPmNsdXN0ZXJfc2l6ZSkgLSAxOworCXNiaS0+ZmF0cyA9IGItPmZhdHM7CisJc2JpLT5mYXRfYml0cyA9IDA7CQkvKiBEb24ndCBrbm93IHlldCAqLworCXNiaS0+ZmF0X3N0YXJ0ID0gbGUxNl90b19jcHUoYi0+cmVzZXJ2ZWQpOworCXNiaS0+ZmF0X2xlbmd0aCA9IGxlMTZfdG9fY3B1KGItPmZhdF9sZW5ndGgpOworCXNiaS0+cm9vdF9jbHVzdGVyID0gMDsKKwlzYmktPmZyZWVfY2x1c3RlcnMgPSAtMTsJLyogRG9uJ3Qga25vdyB5ZXQgKi8KKwlzYmktPnByZXZfZnJlZSA9IEZBVF9TVEFSVF9FTlQ7CisKKwlpZiAoIXNiaS0+ZmF0X2xlbmd0aCAmJiBiLT5mYXQzMl9sZW5ndGgpIHsKKwkJc3RydWN0IGZhdF9ib290X2ZzaW5mbyAqZnNpbmZvOworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmZzaW5mb19iaDsKKworCQkvKiBNdXN0IGJlIEZBVDMyICovCisJCXNiaS0+ZmF0X2JpdHMgPSAzMjsKKwkJc2JpLT5mYXRfbGVuZ3RoID0gbGUzMl90b19jcHUoYi0+ZmF0MzJfbGVuZ3RoKTsKKwkJc2JpLT5yb290X2NsdXN0ZXIgPSBsZTMyX3RvX2NwdShiLT5yb290X2NsdXN0ZXIpOworCisJCXNiLT5zX21heGJ5dGVzID0gMHhmZmZmZmZmZjsKKworCQkvKiBNQyAtIGlmIGluZm9fc2VjdG9yIGlzIDAsIGRvbid0IG11bHRpcGx5IGJ5IDAgKi8KKwkJc2JpLT5mc2luZm9fc2VjdG9yID0gbGUxNl90b19jcHUoYi0+aW5mb19zZWN0b3IpOworCQlpZiAoc2JpLT5mc2luZm9fc2VjdG9yID09IDApCisJCQlzYmktPmZzaW5mb19zZWN0b3IgPSAxOworCisJCWZzaW5mb19iaCA9IHNiX2JyZWFkKHNiLCBzYmktPmZzaW5mb19zZWN0b3IpOworCQlpZiAoZnNpbmZvX2JoID09IE5VTEwpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiRkFUOiBicmVhZCBmYWlsZWQsIEZTSU5GTyBibG9jayIKKwkJCSAgICAgICAiIChzZWN0b3IgPSAlbHUpXG4iLCBzYmktPmZzaW5mb19zZWN0b3IpOworCQkJYnJlbHNlKGJoKTsKKwkJCWdvdG8gb3V0X2ZhaWw7CisJCX0KKworCQlmc2luZm8gPSAoc3RydWN0IGZhdF9ib290X2ZzaW5mbyAqKWZzaW5mb19iaC0+Yl9kYXRhOworCQlpZiAoIUlTX0ZTSU5GTyhmc2luZm8pKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgIkZBVDogRGlkIG5vdCBmaW5kIHZhbGlkIEZTSU5GTyBzaWduYXR1cmUuXG4iCisJCQkgICAgICAgIiAgICAgRm91bmQgc2lnbmF0dXJlMSAweCUwOHggc2lnbmF0dXJlMiAweCUwOHgiCisJCQkgICAgICAgIiAoc2VjdG9yID0gJWx1KVxuIiwKKwkJCSAgICAgICBsZTMyX3RvX2NwdShmc2luZm8tPnNpZ25hdHVyZTEpLAorCQkJICAgICAgIGxlMzJfdG9fY3B1KGZzaW5mby0+c2lnbmF0dXJlMiksCisJCQkgICAgICAgc2JpLT5mc2luZm9fc2VjdG9yKTsKKwkJfSBlbHNlIHsKKwkJCXNiaS0+ZnJlZV9jbHVzdGVycyA9IGxlMzJfdG9fY3B1KGZzaW5mby0+ZnJlZV9jbHVzdGVycyk7CisJCQlzYmktPnByZXZfZnJlZSA9IGxlMzJfdG9fY3B1KGZzaW5mby0+bmV4dF9jbHVzdGVyKTsKKwkJfQorCisJCWJyZWxzZShmc2luZm9fYmgpOworCX0KKworCXNiaS0+ZGlyX3Blcl9ibG9jayA9IHNiLT5zX2Jsb2Nrc2l6ZSAvIHNpemVvZihzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5KTsKKwlzYmktPmRpcl9wZXJfYmxvY2tfYml0cyA9IGZmcyhzYmktPmRpcl9wZXJfYmxvY2spIC0gMTsKKworCXNiaS0+ZGlyX3N0YXJ0ID0gc2JpLT5mYXRfc3RhcnQgKyBzYmktPmZhdHMgKiBzYmktPmZhdF9sZW5ndGg7CisJc2JpLT5kaXJfZW50cmllcyA9CisJCWxlMTZfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fbGUxNiAqKSZiLT5kaXJfZW50cmllcykpOworCWlmIChzYmktPmRpcl9lbnRyaWVzICYgKHNiaS0+ZGlyX3Blcl9ibG9jayAtIDEpKSB7CisJCWlmICghc2lsZW50KQorCQkJcHJpbnRrKEtFUk5fRVJSICJGQVQ6IGJvZ3VzIGRpcmVjdHJveS1lbnRyaWVzIHBlciBibG9jayIKKwkJCSAgICAgICAiICgldSlcbiIsIHNiaS0+ZGlyX2VudHJpZXMpOworCQlicmVsc2UoYmgpOworCQlnb3RvIG91dF9pbnZhbGlkOworCX0KKworCXJvb3RkaXJfc2VjdG9ycyA9IHNiaS0+ZGlyX2VudHJpZXMKKwkJKiBzaXplb2Yoc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSkgLyBzYi0+c19ibG9ja3NpemU7CisJc2JpLT5kYXRhX3N0YXJ0ID0gc2JpLT5kaXJfc3RhcnQgKyByb290ZGlyX3NlY3RvcnM7CisJdG90YWxfc2VjdG9ycyA9IGxlMTZfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fbGUxNiAqKSZiLT5zZWN0b3JzKSk7CisJaWYgKHRvdGFsX3NlY3RvcnMgPT0gMCkKKwkJdG90YWxfc2VjdG9ycyA9IGxlMzJfdG9fY3B1KGItPnRvdGFsX3NlY3QpOworCisJdG90YWxfY2x1c3RlcnMgPSAodG90YWxfc2VjdG9ycyAtIHNiaS0+ZGF0YV9zdGFydCkgLyBzYmktPnNlY19wZXJfY2x1czsKKworCWlmIChzYmktPmZhdF9iaXRzICE9IDMyKQorCQlzYmktPmZhdF9iaXRzID0gKHRvdGFsX2NsdXN0ZXJzID4gTUFYX0ZBVDEyKSA/IDE2IDogMTI7CisKKwkvKiBjaGVjayB0aGF0IEZBVCB0YWJsZSBkb2VzIG5vdCBvdmVyZmxvdyAqLworCWZhdF9jbHVzdGVycyA9IHNiaS0+ZmF0X2xlbmd0aCAqIHNiLT5zX2Jsb2Nrc2l6ZSAqIDggLyBzYmktPmZhdF9iaXRzOworCXRvdGFsX2NsdXN0ZXJzID0gbWluKHRvdGFsX2NsdXN0ZXJzLCBmYXRfY2x1c3RlcnMgLSBGQVRfU1RBUlRfRU5UKTsKKwlpZiAodG90YWxfY2x1c3RlcnMgPiBNQVhfRkFUKHNiKSkgeworCQlpZiAoIXNpbGVudCkKKwkJCXByaW50ayhLRVJOX0VSUiAiRkFUOiBjb3VudCBvZiBjbHVzdGVycyB0b28gYmlnICgldSlcbiIsCisJCQkgICAgICAgdG90YWxfY2x1c3RlcnMpOworCQlicmVsc2UoYmgpOworCQlnb3RvIG91dF9pbnZhbGlkOworCX0KKworCXNiaS0+bWF4X2NsdXN0ZXIgPSB0b3RhbF9jbHVzdGVycyArIEZBVF9TVEFSVF9FTlQ7CisJLyogY2hlY2sgdGhlIGZyZWVfY2x1c3RlcnMsIGl0J3Mgbm90IG5lY2Vzc2FyaWx5IGNvcnJlY3QgKi8KKwlpZiAoc2JpLT5mcmVlX2NsdXN0ZXJzICE9IC0xICYmIHNiaS0+ZnJlZV9jbHVzdGVycyA+IHRvdGFsX2NsdXN0ZXJzKQorCQlzYmktPmZyZWVfY2x1c3RlcnMgPSAtMTsKKwkvKiBjaGVjayB0aGUgcHJldl9mcmVlLCBpdCdzIG5vdCBuZWNlc3NhcmlseSBjb3JyZWN0ICovCisJc2JpLT5wcmV2X2ZyZWUgJT0gc2JpLT5tYXhfY2x1c3RlcjsKKwlpZiAoc2JpLT5wcmV2X2ZyZWUgPCBGQVRfU1RBUlRfRU5UKQorCQlzYmktPnByZXZfZnJlZSA9IEZBVF9TVEFSVF9FTlQ7CisKKwlicmVsc2UoYmgpOworCisJLyogc2V0IHVwIGVub3VnaCBzbyB0aGF0IGl0IGNhbiByZWFkIGFuIGlub2RlICovCisJZmF0X2hhc2hfaW5pdChzYik7CisJZmF0X2VudF9hY2Nlc3NfaW5pdChzYik7CisKKwkvKgorCSAqIFRoZSBsb3cgYnl0ZSBvZiBGQVQncyBmaXJzdCBlbnRyeSBtdXN0IGhhdmUgc2FtZSB2YWx1ZSB3aXRoCisJICogbWVkaWEtZmllbGQuICBCdXQgaW4gcmVhbCB3b3JsZCwgdG9vIG1hbnkgZGV2aWNlcyBpcworCSAqIHdyaXRpbmcgd3JvbmcgdmFsdWUuICBTbywgcmVtb3ZlZCB0aGF0IHZhbGlkaXR5IGNoZWNrLgorCSAqCisJICogaWYgKEZBVF9GSVJTVF9FTlQoc2IsIG1lZGlhKSAhPSBmaXJzdCkKKwkgKi8KKworCWVycm9yID0gLUVJTlZBTDsKKwlzcHJpbnRmKGJ1ZiwgImNwJWQiLCBzYmktPm9wdGlvbnMuY29kZXBhZ2UpOworCXNiaS0+bmxzX2Rpc2sgPSBsb2FkX25scyhidWYpOworCWlmICghc2JpLT5ubHNfZGlzaykgeworCQlwcmludGsoS0VSTl9FUlIgIkZBVDogY29kZXBhZ2UgJXMgbm90IGZvdW5kXG4iLCBidWYpOworCQlnb3RvIG91dF9mYWlsOworCX0KKworCS8qIEZJWE1FOiB1dGY4IGlzIHVzaW5nIGlvY2hhcnNldCBmb3IgdXBwZXIvbG93ZXIgY29udmVyc2lvbiAqLworCWlmIChzYmktPm9wdGlvbnMuaXN2ZmF0KSB7CisJCXNiaS0+bmxzX2lvID0gbG9hZF9ubHMoc2JpLT5vcHRpb25zLmlvY2hhcnNldCk7CisJCWlmICghc2JpLT5ubHNfaW8pIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiRkFUOiBJTyBjaGFyc2V0ICVzIG5vdCBmb3VuZFxuIiwKKwkJCSAgICAgICBzYmktPm9wdGlvbnMuaW9jaGFyc2V0KTsKKwkJCWdvdG8gb3V0X2ZhaWw7CisJCX0KKwl9CisKKwllcnJvciA9IC1FTk9NRU07CisJcm9vdF9pbm9kZSA9IG5ld19pbm9kZShzYik7CisJaWYgKCFyb290X2lub2RlKQorCQlnb3RvIG91dF9mYWlsOworCXJvb3RfaW5vZGUtPmlfaW5vID0gTVNET1NfUk9PVF9JTk87CisJcm9vdF9pbm9kZS0+aV92ZXJzaW9uID0gMTsKKwllcnJvciA9IGZhdF9yZWFkX3Jvb3Qocm9vdF9pbm9kZSk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXRfZmFpbDsKKwllcnJvciA9IC1FTk9NRU07CisJaW5zZXJ0X2lub2RlX2hhc2gocm9vdF9pbm9kZSk7CisJc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290X2lub2RlKTsKKwlpZiAoIXNiLT5zX3Jvb3QpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGQVQ6IGdldCByb290IGlub2RlIGZhaWxlZFxuIik7CisJCWdvdG8gb3V0X2ZhaWw7CisJfQorCisJcmV0dXJuIDA7CisKK291dF9pbnZhbGlkOgorCWVycm9yID0gLUVJTlZBTDsKKwlpZiAoIXNpbGVudCkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiVkZTOiBDYW4ndCBmaW5kIGEgdmFsaWQgRkFUIGZpbGVzeXN0ZW0iCisJCSAgICAgICAiIG9uIGRldiAlcy5cbiIsIHNiLT5zX2lkKTsKKworb3V0X2ZhaWw6CisJaWYgKHJvb3RfaW5vZGUpCisJCWlwdXQocm9vdF9pbm9kZSk7CisJaWYgKHNiaS0+bmxzX2lvKQorCQl1bmxvYWRfbmxzKHNiaS0+bmxzX2lvKTsKKwlpZiAoc2JpLT5ubHNfZGlzaykKKwkJdW5sb2FkX25scyhzYmktPm5sc19kaXNrKTsKKwlpZiAoc2JpLT5vcHRpb25zLmlvY2hhcnNldCAhPSBmYXRfZGVmYXVsdF9pb2NoYXJzZXQpCisJCWtmcmVlKHNiaS0+b3B0aW9ucy5pb2NoYXJzZXQpOworCXNiLT5zX2ZzX2luZm8gPSBOVUxMOworCWtmcmVlKHNiaSk7CisJcmV0dXJuIGVycm9yOworfQorCitFWFBPUlRfU1lNQk9MKGZhdF9maWxsX3N1cGVyKTsKKworaW50IF9faW5pdCBmYXRfY2FjaGVfaW5pdCh2b2lkKTsKK3ZvaWQgX19leGl0IGZhdF9jYWNoZV9kZXN0cm95KHZvaWQpOworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2ZhdF9mcyh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBmYXRfY2FjaGVfaW5pdCgpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldHVybiBmYXRfaW5pdF9pbm9kZWNhY2hlKCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2ZhdF9mcyh2b2lkKQoreworCWZhdF9jYWNoZV9kZXN0cm95KCk7CisJZmF0X2Rlc3Ryb3lfaW5vZGVjYWNoZSgpOworfQorCittb2R1bGVfaW5pdChpbml0X2ZhdF9mcykKK21vZHVsZV9leGl0KGV4aXRfZmF0X2ZzKQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9mcy9mYXQvbWlzYy5jIGIvZnMvZmF0L21pc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTBkZjIxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZmF0L21pc2MuYwpAQCAtMCwwICsxLDIyNSBAQAorLyoKKyAqICBsaW51eC9mcy9mYXQvbWlzYy5jCisgKgorICogIFdyaXR0ZW4gMTk5MiwxOTkzIGJ5IFdlcm5lciBBbG1lc2JlcmdlcgorICogIDIyLzExLzIwMDAgLSBGaXhlZCBmYXRfZGF0ZV91bml4MmRvcyBmb3IgZGF0ZXMgZWFybGllciB0aGFuIDAxLzAxLzE5ODAKKyAqCQkgYW5kIGRhdGVfZG9zMnVuaXggZm9yIGRhdGU9PTAgYnkgSWdvciBaaGJhbm92KGJzZ0B1bml5YXIuYWMucnUpCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbXNkb3NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorCisvKgorICogZmF0X2ZzX3BhbmljIHJlcG9ydHMgYSBzZXZlcmUgZmlsZSBzeXN0ZW0gcHJvYmxlbSBhbmQgc2V0cyB0aGUgZmlsZSBzeXN0ZW0KKyAqIHJlYWQtb25seS4gVGhlIGZpbGUgc3lzdGVtIGNhbiBiZSBtYWRlIHdyaXRhYmxlIGFnYWluIGJ5IHJlbW91bnRpbmcgaXQuCisgKi8KK3ZvaWQgZmF0X2ZzX3BhbmljKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCisJcHJpbnRrKEtFUk5fRVJSICJGQVQ6IEZpbGVzeXN0ZW0gcGFuaWMgKGRldiAlcylcbiIsIHMtPnNfaWQpOworCisJcHJpbnRrKEtFUk5fRVJSICIgICAgIik7CisJdmFfc3RhcnQoYXJncywgZm10KTsKKwl2cHJpbnRrKGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCXByaW50aygiXG4iKTsKKworCWlmICghKHMtPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCXMtPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCQlwcmludGsoS0VSTl9FUlIgIiAgICBGaWxlIHN5c3RlbSBoYXMgYmVlbiBzZXQgcmVhZC1vbmx5XG4iKTsKKwl9Cit9CisKK0VYUE9SVF9TWU1CT0woZmF0X2ZzX3BhbmljKTsKKworLyogRmx1c2hlcyB0aGUgbnVtYmVyIG9mIGZyZWUgY2x1c3RlcnMgb24gRkFUMzIgKi8KKy8qIFhYWDogTmVlZCB0byB3cml0ZSBvbmUgcGVyIEZTSU5GTyBibG9jay4gIEN1cnJlbnRseSBvbmx5IHdyaXRlcyAxICovCit2b2lkIGZhdF9jbHVzdGVyc19mbHVzaChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBtc2Rvc19zYl9pbmZvICpzYmkgPSBNU0RPU19TQihzYik7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgZmF0X2Jvb3RfZnNpbmZvICpmc2luZm87CisKKwlpZiAoc2JpLT5mYXRfYml0cyAhPSAzMikKKwkJcmV0dXJuOworCisJYmggPSBzYl9icmVhZChzYiwgc2JpLT5mc2luZm9fc2VjdG9yKTsKKwlpZiAoYmggPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIkZBVDogYnJlYWQgZmFpbGVkIGluIGZhdF9jbHVzdGVyc19mbHVzaFxuIik7CisJCXJldHVybjsKKwl9CisKKwlmc2luZm8gPSAoc3RydWN0IGZhdF9ib290X2ZzaW5mbyAqKWJoLT5iX2RhdGE7CisJLyogU2FuaXR5IGNoZWNrICovCisJaWYgKCFJU19GU0lORk8oZnNpbmZvKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkZBVDogRGlkIG5vdCBmaW5kIHZhbGlkIEZTSU5GTyBzaWduYXR1cmUuXG4iCisJCSAgICAgICAiICAgICBGb3VuZCBzaWduYXR1cmUxIDB4JTA4eCBzaWduYXR1cmUyIDB4JTA4eCIKKwkJICAgICAgICIgKHNlY3RvciA9ICVsdSlcbiIsCisJCSAgICAgICBsZTMyX3RvX2NwdShmc2luZm8tPnNpZ25hdHVyZTEpLAorCQkgICAgICAgbGUzMl90b19jcHUoZnNpbmZvLT5zaWduYXR1cmUyKSwKKwkJICAgICAgIHNiaS0+ZnNpbmZvX3NlY3Rvcik7CisJfSBlbHNlIHsKKwkJaWYgKHNiaS0+ZnJlZV9jbHVzdGVycyAhPSAtMSkKKwkJCWZzaW5mby0+ZnJlZV9jbHVzdGVycyA9IGNwdV90b19sZTMyKHNiaS0+ZnJlZV9jbHVzdGVycyk7CisJCWlmIChzYmktPnByZXZfZnJlZSAhPSAtMSkKKwkJCWZzaW5mby0+bmV4dF9jbHVzdGVyID0gY3B1X3RvX2xlMzIoc2JpLT5wcmV2X2ZyZWUpOworCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCWlmIChzYi0+c19mbGFncyAmIE1TX1NZTkNIUk9OT1VTKQorCQkJc3luY19kaXJ0eV9idWZmZXIoYmgpOworCX0KKwlicmVsc2UoYmgpOworfQorCisvKgorICogZmF0X2NoYWluX2FkZCgpIGFkZHMgYSBuZXcgY2x1c3RlciB0byB0aGUgY2hhaW4gb2YgY2x1c3RlcnMgcmVwcmVzZW50ZWQKKyAqIGJ5IGlub2RlLgorICovCitpbnQgZmF0X2NoYWluX2FkZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbmV3X2RjbHVzLCBpbnQgbnJfY2x1c3RlcikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IG1zZG9zX3NiX2luZm8gKnNiaSA9IE1TRE9TX1NCKHNiKTsKKwlpbnQgcmV0LCBuZXdfZmNsdXMsIGxhc3Q7CisKKwkvKgorCSAqIFdlIG11c3QgbG9jYXRlIHRoZSBsYXN0IGNsdXN0ZXIgb2YgdGhlIGZpbGUgdG8gYWRkIHRoaXMgbmV3CisJICogb25lIChuZXdfZGNsdXMpIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmsgbGlzdCAodGhlIEZBVCkuCisJICovCisJbGFzdCA9IG5ld19mY2x1cyA9IDA7CisJaWYgKE1TRE9TX0koaW5vZGUpLT5pX3N0YXJ0KSB7CisJCWludCBmY2x1cywgZGNsdXM7CisKKwkJcmV0ID0gZmF0X2dldF9jbHVzdGVyKGlub2RlLCBGQVRfRU5UX0VPRiwgJmZjbHVzLCAmZGNsdXMpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCW5ld19mY2x1cyA9IGZjbHVzICsgMTsKKwkJbGFzdCA9IGRjbHVzOworCX0KKworCS8qIGFkZCBuZXcgb25lIHRvIHRoZSBsYXN0IG9mIHRoZSBjbHVzdGVyIGNoYWluICovCisJaWYgKGxhc3QpIHsKKwkJc3RydWN0IGZhdF9lbnRyeSBmYXRlbnQ7CisKKwkJZmF0ZW50X2luaXQoJmZhdGVudCk7CisJCXJldCA9IGZhdF9lbnRfcmVhZChpbm9kZSwgJmZhdGVudCwgbGFzdCk7CisJCWlmIChyZXQgPj0gMCkgeworCQkJaW50IHdhaXQgPSBpbm9kZV9uZWVkc19zeW5jKGlub2RlKTsKKwkJCXJldCA9IGZhdF9lbnRfd3JpdGUoaW5vZGUsICZmYXRlbnQsIG5ld19kY2x1cywgd2FpdCk7CisJCQlmYXRlbnRfYnJlbHNlKCZmYXRlbnQpOworCQl9CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKy8vCQlmYXRfY2FjaGVfYWRkKGlub2RlLCBuZXdfZmNsdXMsIG5ld19kY2x1cyk7CisJfSBlbHNlIHsKKwkJTVNET1NfSShpbm9kZSktPmlfc3RhcnQgPSBuZXdfZGNsdXM7CisJCU1TRE9TX0koaW5vZGUpLT5pX2xvZ3N0YXJ0ID0gbmV3X2RjbHVzOworCQkvKgorCQkgKiBTaW5jZSBnZW5lcmljX29zeW5jX2lub2RlKCkgc3luY2hyb25pemUgbGF0ZXIgaWYKKwkJICogdGhpcyBpcyBub3QgZGlyZWN0b3J5LCB3ZSBkb24ndCBoZXJlLgorCQkgKi8KKwkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgSVNfRElSU1lOQyhpbm9kZSkpIHsKKwkJCXJldCA9IGZhdF9zeW5jX2lub2RlKGlub2RlKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfSBlbHNlCisJCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwl9CisJaWYgKG5ld19mY2x1cyAhPSAoaW5vZGUtPmlfYmxvY2tzID4+IChzYmktPmNsdXN0ZXJfYml0cyAtIDkpKSkgeworCQlmYXRfZnNfcGFuaWMoc2IsICJjbHVzdGVycyBiYWRseSBjb21wdXRlZCAoJWQgIT0gJWx1KSIsCisJCQluZXdfZmNsdXMsIGlub2RlLT5pX2Jsb2NrcyA+PiAoc2JpLT5jbHVzdGVyX2JpdHMgLSA5KSk7CisJCWZhdF9jYWNoZV9pbnZhbF9pbm9kZShpbm9kZSk7CisJfQorCWlub2RlLT5pX2Jsb2NrcyArPSBucl9jbHVzdGVyIDw8IChzYmktPmNsdXN0ZXJfYml0cyAtIDkpOworCisJcmV0dXJuIDA7Cit9CisKK2V4dGVybiBzdHJ1Y3QgdGltZXpvbmUgc3lzX3R6OworCisvKiBMaW5lYXIgZGF5IG51bWJlcnMgb2YgdGhlIHJlc3BlY3RpdmUgMXN0cyBpbiBub24tbGVhcCB5ZWFycy4gKi8KK3N0YXRpYyBpbnQgZGF5X25bXSA9IHsKKyAgIC8qIEphbiAgRmViICBNYXIgIEFwciAgIE1heSAgSnVuICBKdWwgIEF1ZyAgU2VwICBPY3QgIE5vdiAgRGVjICovCisJMCwgIDMxLCAgNTksICA5MCwgIDEyMCwgMTUxLCAxODEsIDIxMiwgMjQzLCAyNzMsIDMwNCwgMzM0LCAwLCAwLCAwLCAwCit9OworCisvKiBDb252ZXJ0IGEgTVMtRE9TIHRpbWUvZGF0ZSBwYWlyIHRvIGEgVU5JWCBkYXRlIChzZWNvbmRzIHNpbmNlIDEgMSA3MCkuICovCitpbnQgZGF0ZV9kb3MydW5peCh1bnNpZ25lZCBzaG9ydCB0aW1lLCB1bnNpZ25lZCBzaG9ydCBkYXRlKQoreworCWludCBtb250aCwgeWVhciwgc2VjczsKKworCS8qCisJICogZmlyc3Qgc3VidHJhY3QgYW5kIG1hc2sgYWZ0ZXIgdGhhdC4uLiBPdGhlcndpc2UsIGlmCisJICogZGF0ZSA9PSAwLCBiYWQgdGhpbmdzIGhhcHBlbgorCSAqLworCW1vbnRoID0gKChkYXRlID4+IDUpIC0gMSkgJiAxNTsKKwl5ZWFyID0gZGF0ZSA+PiA5OworCXNlY3MgPSAodGltZSAmIDMxKSoyKzYwKigodGltZSA+PiA1KSAmIDYzKSsodGltZSA+PiAxMSkqMzYwMCs4NjQwMCoKKwkgICAgKChkYXRlICYgMzEpLTErZGF5X25bbW9udGhdKyh5ZWFyLzQpK3llYXIqMzY1LSgoeWVhciAmIDMpID09IDAgJiYKKwkgICAgbW9udGggPCAyID8gMSA6IDApKzM2NTMpOworCQkJLyogZGF5cyBzaW5jZSAxLjEuNzAgcGx1cyA4MCdzIGxlYXAgZGF5ICovCisJc2VjcyArPSBzeXNfdHoudHpfbWludXRlc3dlc3QqNjA7CisJcmV0dXJuIHNlY3M7Cit9CisKKy8qIENvbnZlcnQgbGluZWFyIFVOSVggZGF0ZSB0byBhIE1TLURPUyB0aW1lL2RhdGUgcGFpci4gKi8KK3ZvaWQgZmF0X2RhdGVfdW5peDJkb3MoaW50IHVuaXhfZGF0ZSwgX19sZTE2ICp0aW1lLCBfX2xlMTYgKmRhdGUpCit7CisJaW50IGRheSwgeWVhciwgbmxfZGF5LCBtb250aDsKKworCXVuaXhfZGF0ZSAtPSBzeXNfdHoudHpfbWludXRlc3dlc3QqNjA7CisKKwkvKiBKYW4gMSBHTVQgMDA6MDA6MDAgMTk4MC4gQnV0IHdoYXQgYWJvdXQgYW5vdGhlciB0aW1lIHpvbmU/ICovCisJaWYgKHVuaXhfZGF0ZSA8IDMxNTUzMjgwMCkKKwkJdW5peF9kYXRlID0gMzE1NTMyODAwOworCisJKnRpbWUgPSBjcHVfdG9fbGUxNigodW5peF9kYXRlICUgNjApLzIrKCgodW5peF9kYXRlLzYwKSAlIDYwKSA8PCA1KSsKKwkgICAgKCgodW5peF9kYXRlLzM2MDApICUgMjQpIDw8IDExKSk7CisJZGF5ID0gdW5peF9kYXRlLzg2NDAwLTM2NTI7CisJeWVhciA9IGRheS8zNjU7CisJaWYgKCh5ZWFyKzMpLzQrMzY1KnllYXIgPiBkYXkpCisJCXllYXItLTsKKwlkYXkgLT0gKHllYXIrMykvNCszNjUqeWVhcjsKKwlpZiAoZGF5ID09IDU5ICYmICEoeWVhciAmIDMpKSB7CisJCW5sX2RheSA9IGRheTsKKwkJbW9udGggPSAyOworCX0gZWxzZSB7CisJCW5sX2RheSA9ICh5ZWFyICYgMykgfHwgZGF5IDw9IDU5ID8gZGF5IDogZGF5LTE7CisJCWZvciAobW9udGggPSAwOyBtb250aCA8IDEyOyBtb250aCsrKSB7CisJCQlpZiAoZGF5X25bbW9udGhdID4gbmxfZGF5KQorCQkJCWJyZWFrOworCQl9CisJfQorCSpkYXRlID0gY3B1X3RvX2xlMTYobmxfZGF5LWRheV9uW21vbnRoLTFdKzErKG1vbnRoIDw8IDUpKyh5ZWFyIDw8IDkpKTsKK30KKworRVhQT1JUX1NZTUJPTChmYXRfZGF0ZV91bml4MmRvcyk7CisKK2ludCBmYXRfc3luY19iaHMoc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhzLCBpbnQgbnJfYmhzKQoreworCWludCBpLCBlLCBlcnIgPSAwOworCisJZm9yIChpID0gMDsgaSA8IG5yX2JoczsgaSsrKSB7CisJCWxvY2tfYnVmZmVyKGJoc1tpXSk7CisJCWlmICh0ZXN0X2NsZWFyX2J1ZmZlcl9kaXJ0eShiaHNbaV0pKSB7CisJCQlnZXRfYmgoYmhzW2ldKTsKKwkJCWJoc1tpXS0+Yl9lbmRfaW8gPSBlbmRfYnVmZmVyX3dyaXRlX3N5bmM7CisJCQllID0gc3VibWl0X2JoKFdSSVRFLCBiaHNbaV0pOworCQkJaWYgKCFlcnIgJiYgZSkKKwkJCQllcnIgPSBlOworCQl9IGVsc2UKKwkJCXVubG9ja19idWZmZXIoYmhzW2ldKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IG5yX2JoczsgaSsrKSB7CisJCXdhaXRfb25fYnVmZmVyKGJoc1tpXSk7CisJCWlmIChidWZmZXJfZW9wbm90c3VwcChiaHNbaV0pKSB7CisJCQljbGVhcl9idWZmZXJfZW9wbm90c3VwcChiaHNbaV0pOworCQkJZXJyID0gLUVPUE5PVFNVUFA7CisJCX0gZWxzZSBpZiAoIWVyciAmJiAhYnVmZmVyX3VwdG9kYXRlKGJoc1tpXSkpCisJCQllcnIgPSAtRUlPOworCX0KKwlyZXR1cm4gZXJyOworfQorCitFWFBPUlRfU1lNQk9MKGZhdF9zeW5jX2Jocyk7CmRpZmYgLS1naXQgYS9mcy9mY250bC5jIGIvZnMvZmNudGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTcwODA2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZmNudGwuYwpAQCAtMCwwICsxLDYwMSBAQAorLyoKKyAqICBsaW51eC9mcy9mY250bC5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqLworCisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbm90aWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKworI2luY2x1ZGUgPGFzbS9wb2xsLmg+CisjaW5jbHVkZSA8YXNtL3NpZ2luZm8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCit2b2lkIGZhc3RjYWxsIHNldF9jbG9zZV9vbl9leGVjKHVuc2lnbmVkIGludCBmZCwgaW50IGZsYWcpCit7CisJc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMgPSBjdXJyZW50LT5maWxlczsKKwlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOworCWlmIChmbGFnKQorCQlGRF9TRVQoZmQsIGZpbGVzLT5jbG9zZV9vbl9leGVjKTsKKwllbHNlCisJCUZEX0NMUihmZCwgZmlsZXMtPmNsb3NlX29uX2V4ZWMpOworCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0X2Nsb3NlX29uX2V4ZWModW5zaWduZWQgaW50IGZkKQoreworCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzID0gY3VycmVudC0+ZmlsZXM7CisJaW50IHJlczsKKwlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOworCXJlcyA9IEZEX0lTU0VUKGZkLCBmaWxlcy0+Y2xvc2Vfb25fZXhlYyk7CisJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCXJldHVybiByZXM7Cit9CisKKy8qCisgKiBsb2NhdGVfZmQgZmluZHMgYSBmcmVlIGZpbGUgZGVzY3JpcHRvciBpbiB0aGUgb3Blbl9mZHMgZmRzZXQsCisgKiBleHBhbmRpbmcgdGhlIGZkIGFycmF5cyBpZiBuZWNlc3NhcnkuICBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZQorICogZmlsZV9sb2NrIGhlbGQgZm9yIHdyaXRlLgorICovCisKK3N0YXRpYyBpbnQgbG9jYXRlX2ZkKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzLCAKKwkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IG9yaWdfc3RhcnQpCit7CisJdW5zaWduZWQgaW50IG5ld2ZkOworCXVuc2lnbmVkIGludCBzdGFydDsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKG9yaWdfc3RhcnQgPj0gY3VycmVudC0+c2lnbmFsLT5ybGltW1JMSU1JVF9OT0ZJTEVdLnJsaW1fY3VyKQorCQlnb3RvIG91dDsKKworcmVwZWF0OgorCS8qCisJICogU29tZW9uZSBtaWdodCBoYXZlIGNsb3NlZCBmZCdzIGluIHRoZSByYW5nZQorCSAqIG9yaWdfc3RhcnQuLmZpbGVzLT5uZXh0X2ZkCisJICovCisJc3RhcnQgPSBvcmlnX3N0YXJ0OworCWlmIChzdGFydCA8IGZpbGVzLT5uZXh0X2ZkKQorCQlzdGFydCA9IGZpbGVzLT5uZXh0X2ZkOworCisJbmV3ZmQgPSBzdGFydDsKKwlpZiAoc3RhcnQgPCBmaWxlcy0+bWF4X2Zkc2V0KSB7CisJCW5ld2ZkID0gZmluZF9uZXh0X3plcm9fYml0KGZpbGVzLT5vcGVuX2Zkcy0+ZmRzX2JpdHMsCisJCQlmaWxlcy0+bWF4X2Zkc2V0LCBzdGFydCk7CisJfQorCQorCWVycm9yID0gLUVNRklMRTsKKwlpZiAobmV3ZmQgPj0gY3VycmVudC0+c2lnbmFsLT5ybGltW1JMSU1JVF9OT0ZJTEVdLnJsaW1fY3VyKQorCQlnb3RvIG91dDsKKworCWVycm9yID0gZXhwYW5kX2ZpbGVzKGZpbGVzLCBuZXdmZCk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIElmIHdlIG5lZWRlZCB0byBleHBhbmQgdGhlIGZzIGFycmF5IHdlCisJICogbWlnaHQgaGF2ZSBibG9ja2VkIC0gdHJ5IGFnYWluLgorCSAqLworCWlmIChlcnJvcikKKwkJZ290byByZXBlYXQ7CisKKwlpZiAoc3RhcnQgPD0gZmlsZXMtPm5leHRfZmQpCisJCWZpbGVzLT5uZXh0X2ZkID0gbmV3ZmQgKyAxOworCQorCWVycm9yID0gbmV3ZmQ7CisJCitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IGR1cGZkKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgc3RhcnQpCit7CisJc3RydWN0IGZpbGVzX3N0cnVjdCAqIGZpbGVzID0gY3VycmVudC0+ZmlsZXM7CisJaW50IGZkOworCisJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlmZCA9IGxvY2F0ZV9mZChmaWxlcywgZmlsZSwgc3RhcnQpOworCWlmIChmZCA+PSAwKSB7CisJCUZEX1NFVChmZCwgZmlsZXMtPm9wZW5fZmRzKTsKKwkJRkRfQ0xSKGZkLCBmaWxlcy0+Y2xvc2Vfb25fZXhlYyk7CisJCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwkJZmRfaW5zdGFsbChmZCwgZmlsZSk7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCQlmcHV0KGZpbGUpOworCX0KKworCXJldHVybiBmZDsKK30KKworYXNtbGlua2FnZSBsb25nIHN5c19kdXAyKHVuc2lnbmVkIGludCBvbGRmZCwgdW5zaWduZWQgaW50IG5ld2ZkKQoreworCWludCBlcnIgPSAtRUJBREY7CisJc3RydWN0IGZpbGUgKiBmaWxlLCAqdG9mcmVlOworCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcyA9IGN1cnJlbnQtPmZpbGVzOworCisJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlpZiAoIShmaWxlID0gZmNoZWNrKG9sZGZkKSkpCisJCWdvdG8gb3V0X3VubG9jazsKKwllcnIgPSBuZXdmZDsKKwlpZiAobmV3ZmQgPT0gb2xkZmQpCisJCWdvdG8gb3V0X3VubG9jazsKKwllcnIgPSAtRUJBREY7CisJaWYgKG5ld2ZkID49IGN1cnJlbnQtPnNpZ25hbC0+cmxpbVtSTElNSVRfTk9GSUxFXS5ybGltX2N1cikKKwkJZ290byBvdXRfdW5sb2NrOworCWdldF9maWxlKGZpbGUpOwkJCS8qIFdlIGFyZSBub3cgZmluaXNoZWQgd2l0aCBvbGRmZCAqLworCisJZXJyID0gZXhwYW5kX2ZpbGVzKGZpbGVzLCBuZXdmZCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0X2ZwdXQ7CisKKwkvKiBUbyBhdm9pZCByYWNlcyB3aXRoIG9wZW4oKSBhbmQgZHVwKCksIHdlIHdpbGwgbWFyayB0aGUgZmQgYXMKKwkgKiBpbi11c2UgaW4gdGhlIG9wZW4tZmlsZSBiaXRtYXAgdGhyb3VnaG91dCB0aGUgZW50aXJlIGR1cDIoKQorCSAqIHByb2Nlc3MuICBUaGlzIGlzIHF1aXRlIHNhZmU6IGRvX2Nsb3NlKCkgdXNlcyB0aGUgZmQgYXJyYXkKKwkgKiBlbnRyeSwgbm90IHRoZSBiaXRtYXAsIHRvIGRlY2lkZSB3aGF0IHdvcmsgbmVlZHMgdG8gYmUKKwkgKiBkb25lLiAgLS1zY3QgKi8KKwkvKiBEb2Vzbid0IHdvcmsuIG9wZW4oKSBtaWdodCBiZSB0aGVyZSBmaXJzdC4gLS1BViAqLworCisJLyogWWVzLiBJdCdzIGEgcmFjZS4gSW4gdXNlciBzcGFjZS4gTm90aGluZyBzYW5lIHRvIGRvICovCisJZXJyID0gLUVCVVNZOworCXRvZnJlZSA9IGZpbGVzLT5mZFtuZXdmZF07CisJaWYgKCF0b2ZyZWUgJiYgRkRfSVNTRVQobmV3ZmQsIGZpbGVzLT5vcGVuX2ZkcykpCisJCWdvdG8gb3V0X2ZwdXQ7CisKKwlmaWxlcy0+ZmRbbmV3ZmRdID0gZmlsZTsKKwlGRF9TRVQobmV3ZmQsIGZpbGVzLT5vcGVuX2Zkcyk7CisJRkRfQ0xSKG5ld2ZkLCBmaWxlcy0+Y2xvc2Vfb25fZXhlYyk7CisJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCisJaWYgKHRvZnJlZSkKKwkJZmlscF9jbG9zZSh0b2ZyZWUsIGZpbGVzKTsKKwllcnIgPSBuZXdmZDsKK291dDoKKwlyZXR1cm4gZXJyOworb3V0X3VubG9jazoKKwlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJZ290byBvdXQ7CisKK291dF9mcHV0OgorCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlmcHV0KGZpbGUpOworCWdvdG8gb3V0OworfQorCithc21saW5rYWdlIGxvbmcgc3lzX2R1cCh1bnNpZ25lZCBpbnQgZmlsZGVzKQoreworCWludCByZXQgPSAtRUJBREY7CisJc3RydWN0IGZpbGUgKiBmaWxlID0gZmdldChmaWxkZXMpOworCisJaWYgKGZpbGUpCisJCXJldCA9IGR1cGZkKGZpbGUsIDApOworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgU0VURkxfTUFTSyAoT19BUFBFTkQgfCBPX05PTkJMT0NLIHwgT19OREVMQVkgfCBGQVNZTkMgfCBPX0RJUkVDVCB8IE9fTk9BVElNRSkKKworc3RhdGljIGludCBzZXRmbChpbnQgZmQsIHN0cnVjdCBmaWxlICogZmlscCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgZXJyb3IgPSAwOworCisJLyogT19BUFBFTkQgY2Fubm90IGJlIGNsZWFyZWQgaWYgdGhlIGZpbGUgaXMgbWFya2VkIGFzIGFwcGVuZC1vbmx5ICovCisJaWYgKCEoYXJnICYgT19BUFBFTkQpICYmIElTX0FQUEVORChpbm9kZSkpCisJCXJldHVybiAtRVBFUk07CisKKwkvKiBPX05PQVRJTUUgY2FuIG9ubHkgYmUgc2V0IGJ5IHRoZSBvd25lciBvciBzdXBlcnVzZXIgKi8KKwlpZiAoKGFyZyAmIE9fTk9BVElNRSkgJiYgIShmaWxwLT5mX2ZsYWdzICYgT19OT0FUSU1FKSkKKwkJaWYgKGN1cnJlbnQtPmZzdWlkICE9IGlub2RlLT5pX3VpZCAmJiAhY2FwYWJsZShDQVBfRk9XTkVSKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkvKiByZXF1aXJlZCBmb3Igc3RyaWN0IFN1bk9TIGVtdWxhdGlvbiAqLworCWlmIChPX05PTkJMT0NLICE9IE9fTkRFTEFZKQorCSAgICAgICBpZiAoYXJnICYgT19OREVMQVkpCisJCSAgIGFyZyB8PSBPX05PTkJMT0NLOworCisJaWYgKGFyZyAmIE9fRElSRUNUKSB7CisJCWlmICghZmlscC0+Zl9tYXBwaW5nIHx8ICFmaWxwLT5mX21hcHBpbmctPmFfb3BzIHx8CisJCQkhZmlscC0+Zl9tYXBwaW5nLT5hX29wcy0+ZGlyZWN0X0lPKQorCQkJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChmaWxwLT5mX29wICYmIGZpbHAtPmZfb3AtPmNoZWNrX2ZsYWdzKQorCQllcnJvciA9IGZpbHAtPmZfb3AtPmNoZWNrX2ZsYWdzKGFyZyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlsb2NrX2tlcm5lbCgpOworCWlmICgoYXJnIF4gZmlscC0+Zl9mbGFncykgJiBGQVNZTkMpIHsKKwkJaWYgKGZpbHAtPmZfb3AgJiYgZmlscC0+Zl9vcC0+ZmFzeW5jKSB7CisJCQllcnJvciA9IGZpbHAtPmZfb3AtPmZhc3luYyhmZCwgZmlscCwgKGFyZyAmIEZBU1lOQykgIT0gMCk7CisJCQlpZiAoZXJyb3IgPCAwKQorCQkJCWdvdG8gb3V0OworCQl9CisJfQorCisJZmlscC0+Zl9mbGFncyA9IChhcmcgJiBTRVRGTF9NQVNLKSB8IChmaWxwLT5mX2ZsYWdzICYgflNFVEZMX01BU0spOworIG91dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBmX21vZG93bihzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgbG9uZyBwaWQsCisgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsIHVpZF90IGV1aWQsIGludCBmb3JjZSkKK3sKKwl3cml0ZV9sb2NrX2lycSgmZmlscC0+Zl9vd25lci5sb2NrKTsKKwlpZiAoZm9yY2UgfHwgIWZpbHAtPmZfb3duZXIucGlkKSB7CisJCWZpbHAtPmZfb3duZXIucGlkID0gcGlkOworCQlmaWxwLT5mX293bmVyLnVpZCA9IHVpZDsKKwkJZmlscC0+Zl9vd25lci5ldWlkID0gZXVpZDsKKwl9CisJd3JpdGVfdW5sb2NrX2lycSgmZmlscC0+Zl9vd25lci5sb2NrKTsKK30KKworaW50IGZfc2V0b3duKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBsb25nIGFyZywgaW50IGZvcmNlKQoreworCWludCBlcnI7CisJCisJZXJyID0gc2VjdXJpdHlfZmlsZV9zZXRfZm93bmVyKGZpbHApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlmX21vZG93bihmaWxwLCBhcmcsIGN1cnJlbnQtPnVpZCwgY3VycmVudC0+ZXVpZCwgZm9yY2UpOworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKGZfc2V0b3duKTsKKwordm9pZCBmX2RlbG93bihzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlmX21vZG93bihmaWxwLCAwLCAwLCAwLCAxKTsKK30KKworc3RhdGljIGxvbmcgZG9fZmNudGwoaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZywKKwkJc3RydWN0IGZpbGUgKmZpbHApCit7CisJbG9uZyBlcnIgPSAtRUlOVkFMOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEZfRFVQRkQ6CisJCWdldF9maWxlKGZpbHApOworCQllcnIgPSBkdXBmZChmaWxwLCBhcmcpOworCQlicmVhazsKKwljYXNlIEZfR0VURkQ6CisJCWVyciA9IGdldF9jbG9zZV9vbl9leGVjKGZkKSA/IEZEX0NMT0VYRUMgOiAwOworCQlicmVhazsKKwljYXNlIEZfU0VURkQ6CisJCWVyciA9IDA7CisJCXNldF9jbG9zZV9vbl9leGVjKGZkLCBhcmcgJiBGRF9DTE9FWEVDKTsKKwkJYnJlYWs7CisJY2FzZSBGX0dFVEZMOgorCQllcnIgPSBmaWxwLT5mX2ZsYWdzOworCQlicmVhazsKKwljYXNlIEZfU0VURkw6CisJCWVyciA9IHNldGZsKGZkLCBmaWxwLCBhcmcpOworCQlicmVhazsKKwljYXNlIEZfR0VUTEs6CisJCWVyciA9IGZjbnRsX2dldGxrKGZpbHAsIChzdHJ1Y3QgZmxvY2sgX191c2VyICopIGFyZyk7CisJCWJyZWFrOworCWNhc2UgRl9TRVRMSzoKKwljYXNlIEZfU0VUTEtXOgorCQllcnIgPSBmY250bF9zZXRsayhmaWxwLCBjbWQsIChzdHJ1Y3QgZmxvY2sgX191c2VyICopIGFyZyk7CisJCWJyZWFrOworCWNhc2UgRl9HRVRPV046CisJCS8qCisJCSAqIFhYWCBJZiBmX293bmVyIGlzIGEgcHJvY2VzcyBncm91cCwgdGhlCisJCSAqIG5lZ2F0aXZlIHJldHVybiB2YWx1ZSB3aWxsIGdldCBjb252ZXJ0ZWQKKwkJICogaW50byBhbiBlcnJvci4gIE9vcHMuICBJZiB3ZSBrZWVwIHRoZQorCQkgKiBjdXJyZW50IHN5c2NhbGwgY29udmVudGlvbnMsIHRoZSBvbmx5IHdheQorCQkgKiB0byBmaXggdGhpcyB3aWxsIGJlIGluIGxpYmMuCisJCSAqLworCQllcnIgPSBmaWxwLT5mX293bmVyLnBpZDsKKwkJZm9yY2Vfc3VjY2Vzc2Z1bF9zeXNjYWxsX3JldHVybigpOworCQlicmVhazsKKwljYXNlIEZfU0VUT1dOOgorCQllcnIgPSBmX3NldG93bihmaWxwLCBhcmcsIDEpOworCQlicmVhazsKKwljYXNlIEZfR0VUU0lHOgorCQllcnIgPSBmaWxwLT5mX293bmVyLnNpZ251bTsKKwkJYnJlYWs7CisJY2FzZSBGX1NFVFNJRzoKKwkJLyogYXJnID09IDAgcmVzdG9yZXMgZGVmYXVsdCBiZWhhdmlvdXIuICovCisJCWlmIChhcmcgPCAwIHx8IGFyZyA+IF9OU0lHKSB7CisJCQlicmVhazsKKwkJfQorCQllcnIgPSAwOworCQlmaWxwLT5mX293bmVyLnNpZ251bSA9IGFyZzsKKwkJYnJlYWs7CisJY2FzZSBGX0dFVExFQVNFOgorCQllcnIgPSBmY250bF9nZXRsZWFzZShmaWxwKTsKKwkJYnJlYWs7CisJY2FzZSBGX1NFVExFQVNFOgorCQllcnIgPSBmY250bF9zZXRsZWFzZShmZCwgZmlscCwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBGX05PVElGWToKKwkJZXJyID0gZmNudGxfZGlybm90aWZ5KGZkLCBmaWxwLCBhcmcpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIGVycjsKK30KKworYXNtbGlua2FnZSBsb25nIHN5c19mY250bCh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQorewkKKwlzdHJ1Y3QgZmlsZSAqZmlscDsKKwlsb25nIGVyciA9IC1FQkFERjsKKworCWZpbHAgPSBmZ2V0KGZkKTsKKwlpZiAoIWZpbHApCisJCWdvdG8gb3V0OworCisJZXJyID0gc2VjdXJpdHlfZmlsZV9mY250bChmaWxwLCBjbWQsIGFyZyk7CisJaWYgKGVycikgeworCQlmcHV0KGZpbHApOworCQlyZXR1cm4gZXJyOworCX0KKworCWVyciA9IGRvX2ZjbnRsKGZkLCBjbWQsIGFyZywgZmlscCk7CisKKyAJZnB1dChmaWxwKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCisjaWYgQklUU19QRVJfTE9ORyA9PSAzMgorYXNtbGlua2FnZSBsb25nIHN5c19mY250bDY0KHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CQorCXN0cnVjdCBmaWxlICogZmlscDsKKwlsb25nIGVycjsKKworCWVyciA9IC1FQkFERjsKKwlmaWxwID0gZmdldChmZCk7CisJaWYgKCFmaWxwKQorCQlnb3RvIG91dDsKKworCWVyciA9IHNlY3VyaXR5X2ZpbGVfZmNudGwoZmlscCwgY21kLCBhcmcpOworCWlmIChlcnIpIHsKKwkJZnB1dChmaWxwKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJZXJyID0gLUVCQURGOworCQorCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgRl9HRVRMSzY0OgorCQkJZXJyID0gZmNudGxfZ2V0bGs2NChmaWxwLCAoc3RydWN0IGZsb2NrNjQgX191c2VyICopIGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSBGX1NFVExLNjQ6CisJCWNhc2UgRl9TRVRMS1c2NDoKKwkJCWVyciA9IGZjbnRsX3NldGxrNjQoZmlscCwgY21kLCAoc3RydWN0IGZsb2NrNjQgX191c2VyICopIGFyZyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWVyciA9IGRvX2ZjbnRsKGZkLCBjbWQsIGFyZywgZmlscCk7CisJCQlicmVhazsKKwl9CisJZnB1dChmaWxwKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorI2VuZGlmCisKKy8qIFRhYmxlIHRvIGNvbnZlcnQgc2lnaW8gc2lnbmFsIGNvZGVzIGludG8gcG9sbCBiYW5kIGJpdG1hcHMgKi8KKworc3RhdGljIGxvbmcgYmFuZF90YWJsZVtOU0lHUE9MTF0gPSB7CisJUE9MTElOIHwgUE9MTFJETk9STSwJCQkvKiBQT0xMX0lOICovCisJUE9MTE9VVCB8IFBPTExXUk5PUk0gfCBQT0xMV1JCQU5ELAkvKiBQT0xMX09VVCAqLworCVBPTExJTiB8IFBPTExSRE5PUk0gfCBQT0xMTVNHLAkJLyogUE9MTF9NU0cgKi8KKwlQT0xMRVJSLAkJCQkvKiBQT0xMX0VSUiAqLworCVBPTExQUkkgfCBQT0xMUkRCQU5ELAkJCS8qIFBPTExfUFJJICovCisJUE9MTEhVUCB8IFBPTExFUlIJCQkvKiBQT0xMX0hVUCAqLworfTsKKworc3RhdGljIGlubGluZSBpbnQgc2lnaW9fcGVybShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBmb3duX3N0cnVjdCAqZm93biwgaW50IHNpZykKK3sKKwlyZXR1cm4gKCgoZm93bi0+ZXVpZCA9PSAwKSB8fAorCQkgKGZvd24tPmV1aWQgPT0gcC0+c3VpZCkgfHwgKGZvd24tPmV1aWQgPT0gcC0+dWlkKSB8fAorCQkgKGZvd24tPnVpZCA9PSBwLT5zdWlkKSB8fCAoZm93bi0+dWlkID09IHAtPnVpZCkpICYmCisJCSFzZWN1cml0eV9maWxlX3NlbmRfc2lnaW90YXNrKHAsIGZvd24sIHNpZykpOworfQorCitzdGF0aWMgdm9pZCBzZW5kX3NpZ2lvX3RvX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICpwLAorCQkJICAgICAgIHN0cnVjdCBmb3duX3N0cnVjdCAqZm93biwgCisJCQkgICAgICAgaW50IGZkLAorCQkJICAgICAgIGludCByZWFzb24pCit7CisJaWYgKCFzaWdpb19wZXJtKHAsIGZvd24sIGZvd24tPnNpZ251bSkpCisJCXJldHVybjsKKworCXN3aXRjaCAoZm93bi0+c2lnbnVtKSB7CisJCXNpZ2luZm9fdCBzaTsKKwkJZGVmYXVsdDoKKwkJCS8qIFF1ZXVlIGEgcnQgc2lnbmFsIHdpdGggdGhlIGFwcHJvcHJpYXRlIGZkIGFzIGl0cworCQkJICAgdmFsdWUuICBXZSB1c2UgU0lfU0lHSU8gYXMgdGhlIHNvdXJjZSwgbm90IAorCQkJICAgU0lfS0VSTkVMLCBzaW5jZSBrZXJuZWwgc2lnbmFscyBhbHdheXMgZ2V0IAorCQkJICAgZGVsaXZlcmVkIGV2ZW4gaWYgd2UgY2FuJ3QgcXVldWUuICBGYWlsdXJlIHRvCisJCQkgICBxdWV1ZSBpbiB0aGlzIGNhc2UgX3Nob3VsZF8gYmUgcmVwb3J0ZWQ7IHdlIGZhbGwKKwkJCSAgIGJhY2sgdG8gU0lHSU8gaW4gdGhhdCBjYXNlLiAtLXNjdCAqLworCQkJc2kuc2lfc2lnbm8gPSBmb3duLT5zaWdudW07CisJCQlzaS5zaV9lcnJubyA9IDA7CisJCSAgICAgICAgc2kuc2lfY29kZSAgPSByZWFzb247CisJCQkvKiBNYWtlIHN1cmUgd2UgYXJlIGNhbGxlZCB3aXRoIG9uZSBvZiB0aGUgUE9MTF8qCisJCQkgICByZWFzb25zLCBvdGhlcndpc2Ugd2UgY291bGQgbGVhayBrZXJuZWwgc3RhY2sgaW50bworCQkJICAgdXNlcnNwYWNlLiAgKi8KKwkJCWlmICgocmVhc29uICYgX19TSV9NQVNLKSAhPSBfX1NJX1BPTEwpCisJCQkJQlVHKCk7CisJCQlpZiAocmVhc29uIC0gUE9MTF9JTiA+PSBOU0lHUE9MTCkKKwkJCQlzaS5zaV9iYW5kICA9IH4wTDsKKwkJCWVsc2UKKwkJCQlzaS5zaV9iYW5kID0gYmFuZF90YWJsZVtyZWFzb24gLSBQT0xMX0lOXTsKKwkJCXNpLnNpX2ZkICAgID0gZmQ7CisJCQlpZiAoIXNlbmRfc2lnX2luZm8oZm93bi0+c2lnbnVtLCAmc2ksIHApKQorCQkJCWJyZWFrOworCQkvKiBmYWxsLXRocm91Z2g6IGZhbGwgYmFjayBvbiB0aGUgb2xkIHBsYWluIFNJR0lPIHNpZ25hbCAqLworCQljYXNlIDA6CisJCQlzZW5kX2dyb3VwX3NpZ19pbmZvKFNJR0lPLCBTRU5EX1NJR19QUklWLCBwKTsKKwl9Cit9CisKK3ZvaWQgc2VuZF9zaWdpbyhzdHJ1Y3QgZm93bl9zdHJ1Y3QgKmZvd24sIGludCBmZCwgaW50IGJhbmQpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwOworCWludCBwaWQ7CisJCisJcmVhZF9sb2NrKCZmb3duLT5sb2NrKTsKKwlwaWQgPSBmb3duLT5waWQ7CisJaWYgKCFwaWQpCisJCWdvdG8gb3V0X3VubG9ja19mb3duOworCQorCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CisJaWYgKHBpZCA+IDApIHsKKwkJcCA9IGZpbmRfdGFza19ieV9waWQocGlkKTsKKwkJaWYgKHApIHsKKwkJCXNlbmRfc2lnaW9fdG9fdGFzayhwLCBmb3duLCBmZCwgYmFuZCk7CisJCX0KKwl9IGVsc2UgeworCQlkb19lYWNoX3Rhc2tfcGlkKC1waWQsIFBJRFRZUEVfUEdJRCwgcCkgeworCQkJc2VuZF9zaWdpb190b190YXNrKHAsIGZvd24sIGZkLCBiYW5kKTsKKwkJfSB3aGlsZV9lYWNoX3Rhc2tfcGlkKC1waWQsIFBJRFRZUEVfUEdJRCwgcCk7CisJfQorCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKyBvdXRfdW5sb2NrX2Zvd246CisJcmVhZF91bmxvY2soJmZvd24tPmxvY2spOworfQorCitzdGF0aWMgdm9pZCBzZW5kX3NpZ3VyZ190b190YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGZvd25fc3RydWN0ICpmb3duKQoreworCWlmIChzaWdpb19wZXJtKHAsIGZvd24sIFNJR1VSRykpCisJCXNlbmRfZ3JvdXBfc2lnX2luZm8oU0lHVVJHLCBTRU5EX1NJR19QUklWLCBwKTsKK30KKworaW50IHNlbmRfc2lndXJnKHN0cnVjdCBmb3duX3N0cnVjdCAqZm93bikKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CisJaW50IHBpZCwgcmV0ID0gMDsKKwkKKwlyZWFkX2xvY2soJmZvd24tPmxvY2spOworCXBpZCA9IGZvd24tPnBpZDsKKwlpZiAoIXBpZCkKKwkJZ290byBvdXRfdW5sb2NrX2Zvd247CisKKwlyZXQgPSAxOworCQorCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CisJaWYgKHBpZCA+IDApIHsKKwkJcCA9IGZpbmRfdGFza19ieV9waWQocGlkKTsKKwkJaWYgKHApIHsKKwkJCXNlbmRfc2lndXJnX3RvX3Rhc2socCwgZm93bik7CisJCX0KKwl9IGVsc2UgeworCQlkb19lYWNoX3Rhc2tfcGlkKC1waWQsIFBJRFRZUEVfUEdJRCwgcCkgeworCQkJc2VuZF9zaWd1cmdfdG9fdGFzayhwLCBmb3duKTsKKwkJfSB3aGlsZV9lYWNoX3Rhc2tfcGlkKC1waWQsIFBJRFRZUEVfUEdJRCwgcCk7CisJfQorCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKyBvdXRfdW5sb2NrX2Zvd246CisJcmVhZF91bmxvY2soJmZvd24tPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBERUZJTkVfUldMT0NLKGZhc3luY19sb2NrKTsKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKmZhc3luY19jYWNoZTsKKworLyoKKyAqIGZhc3luY19oZWxwZXIoKSBpcyB1c2VkIGJ5IHNvbWUgY2hhcmFjdGVyIGRldmljZSBkcml2ZXJzIChtYWlubHkgbWljZSkKKyAqIHRvIHNldCB1cCB0aGUgZmFzeW5jIHF1ZXVlLiBJdCByZXR1cm5zIG5lZ2F0aXZlIG9uIGVycm9yLCAwIGlmIGl0IGRpZAorICogbm8gY2hhbmdlcyBhbmQgcG9zaXRpdmUgaWYgaXQgYWRkZWQvZGVsZXRlZCB0aGUgZW50cnkuCisgKi8KK2ludCBmYXN5bmNfaGVscGVyKGludCBmZCwgc3RydWN0IGZpbGUgKiBmaWxwLCBpbnQgb24sIHN0cnVjdCBmYXN5bmNfc3RydWN0ICoqZmFwcCkKK3sKKwlzdHJ1Y3QgZmFzeW5jX3N0cnVjdCAqZmEsICoqZnA7CisJc3RydWN0IGZhc3luY19zdHJ1Y3QgKm5ldyA9IE5VTEw7CisJaW50IHJlc3VsdCA9IDA7CisKKwlpZiAob24pIHsKKwkJbmV3ID0ga21lbV9jYWNoZV9hbGxvYyhmYXN5bmNfY2FjaGUsIFNMQUJfS0VSTkVMKTsKKwkJaWYgKCFuZXcpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJd3JpdGVfbG9ja19pcnEoJmZhc3luY19sb2NrKTsKKwlmb3IgKGZwID0gZmFwcDsgKGZhID0gKmZwKSAhPSBOVUxMOyBmcCA9ICZmYS0+ZmFfbmV4dCkgeworCQlpZiAoZmEtPmZhX2ZpbGUgPT0gZmlscCkgeworCQkJaWYob24pIHsKKwkJCQlmYS0+ZmFfZmQgPSBmZDsKKwkJCQlrbWVtX2NhY2hlX2ZyZWUoZmFzeW5jX2NhY2hlLCBuZXcpOworCQkJfSBlbHNlIHsKKwkJCQkqZnAgPSBmYS0+ZmFfbmV4dDsKKwkJCQlrbWVtX2NhY2hlX2ZyZWUoZmFzeW5jX2NhY2hlLCBmYSk7CisJCQkJcmVzdWx0ID0gMTsKKwkJCX0KKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKG9uKSB7CisJCW5ldy0+bWFnaWMgPSBGQVNZTkNfTUFHSUM7CisJCW5ldy0+ZmFfZmlsZSA9IGZpbHA7CisJCW5ldy0+ZmFfZmQgPSBmZDsKKwkJbmV3LT5mYV9uZXh0ID0gKmZhcHA7CisJCSpmYXBwID0gbmV3OworCQlyZXN1bHQgPSAxOworCX0KK291dDoKKwl3cml0ZV91bmxvY2tfaXJxKCZmYXN5bmNfbG9jayk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworRVhQT1JUX1NZTUJPTChmYXN5bmNfaGVscGVyKTsKKwordm9pZCBfX2tpbGxfZmFzeW5jKHN0cnVjdCBmYXN5bmNfc3RydWN0ICpmYSwgaW50IHNpZywgaW50IGJhbmQpCit7CisJd2hpbGUgKGZhKSB7CisJCXN0cnVjdCBmb3duX3N0cnVjdCAqIGZvd247CisJCWlmIChmYS0+bWFnaWMgIT0gRkFTWU5DX01BR0lDKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImtpbGxfZmFzeW5jOiBiYWQgbWFnaWMgbnVtYmVyIGluICIKKwkJCSAgICAgICAiZmFzeW5jX3N0cnVjdCFcbiIpOworCQkJcmV0dXJuOworCQl9CisJCWZvd24gPSAmZmEtPmZhX2ZpbGUtPmZfb3duZXI7CisJCS8qIERvbid0IHNlbmQgU0lHVVJHIHRvIHByb2Nlc3NlcyB3aGljaCBoYXZlIG5vdCBzZXQgYQorCQkgICBxdWV1ZWQgc2lnbnVtOiBTSUdVUkcgaGFzIGl0cyBvd24gZGVmYXVsdCBzaWduYWxsaW5nCisJCSAgIG1lY2hhbmlzbS4gKi8KKwkJaWYgKCEoc2lnID09IFNJR1VSRyAmJiBmb3duLT5zaWdudW0gPT0gMCkpCisJCQlzZW5kX3NpZ2lvKGZvd24sIGZhLT5mYV9mZCwgYmFuZCk7CisJCWZhID0gZmEtPmZhX25leHQ7CisJfQorfQorCitFWFBPUlRfU1lNQk9MKF9fa2lsbF9mYXN5bmMpOworCit2b2lkIGtpbGxfZmFzeW5jKHN0cnVjdCBmYXN5bmNfc3RydWN0ICoqZnAsIGludCBzaWcsIGludCBiYW5kKQoreworCS8qIEZpcnN0IGEgcXVpY2sgdGVzdCB3aXRob3V0IGxvY2tpbmc6IHVzdWFsbHkKKwkgKiB0aGUgbGlzdCBpcyBlbXB0eS4KKwkgKi8KKwlpZiAoKmZwKSB7CisJCXJlYWRfbG9jaygmZmFzeW5jX2xvY2spOworCQkvKiByZXJlYWQgKmZwIGFmdGVyIG9idGFpbmluZyB0aGUgbG9jayAqLworCQlfX2tpbGxfZmFzeW5jKCpmcCwgc2lnLCBiYW5kKTsKKwkJcmVhZF91bmxvY2soJmZhc3luY19sb2NrKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGtpbGxfZmFzeW5jKTsKKworc3RhdGljIGludCBfX2luaXQgZmFzeW5jX2luaXQodm9pZCkKK3sKKwlmYXN5bmNfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiZmFzeW5jX2NhY2hlIiwKKwkJc2l6ZW9mKHN0cnVjdCBmYXN5bmNfc3RydWN0KSwgMCwgU0xBQl9QQU5JQywgTlVMTCwgTlVMTCk7CisJcmV0dXJuIDA7Cit9CisKK21vZHVsZV9pbml0KGZhc3luY19pbml0KQpkaWZmIC0tZ2l0IGEvZnMvZmlmby5jIGIvZnMvZmlmby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NTU5MTYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9maWZvLmMKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiAgbGludXgvZnMvZmlmby5jCisgKgorICogIHdyaXR0ZW4gYnkgUGF1bCBILiBIYXJncm92ZQorICoKKyAqICBGaXhlczoKKyAqCTEwLTA2LTE5OTksIEFWOiBmaXhlZCBPT00gaGFuZGxpbmcgaW4gZmlmb19vcGVuKCksIG1vdmVkCisgKgkJCWluaXRpYWxpemF0aW9uIHRoZXJlLCBzd2l0Y2hlZCB0byBleHRlcm5hbAorICoJCQlhbGxvY2F0aW9uIG9mIHBpcGVfaW5vZGVfaW5mby4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BpcGVfZnNfaS5oPgorCitzdGF0aWMgdm9pZCB3YWl0X2Zvcl9wYXJ0bmVyKHN0cnVjdCBpbm9kZSogaW5vZGUsIHVuc2lnbmVkIGludCogY250KQoreworCWludCBjdXIgPSAqY250OwkKKwl3aGlsZShjdXIgPT0gKmNudCkgeworCQlwaXBlX3dhaXQoaW5vZGUpOworCQlpZihzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgd2FrZV91cF9wYXJ0bmVyKHN0cnVjdCBpbm9kZSogaW5vZGUpCit7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKFBJUEVfV0FJVCgqaW5vZGUpKTsKK30KKworc3RhdGljIGludCBmaWZvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJaW50IHJldDsKKworCXJldCA9IC1FUkVTVEFSVFNZUzsKKwlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlKFBJUEVfU0VNKCppbm9kZSkpKQorCQlnb3RvIGVycl9ub2xvY2tfbm9jbGVhbnVwOworCisJaWYgKCFpbm9kZS0+aV9waXBlKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWlmKCFwaXBlX25ldyhpbm9kZSkpCisJCQlnb3RvIGVycl9ub2NsZWFudXA7CisJfQorCWZpbHAtPmZfdmVyc2lvbiA9IDA7CisKKwkvKiBXZSBjYW4gb25seSBkbyByZWd1bGFyIHJlYWQvd3JpdGUgb24gZmlmb3MgKi8KKwlmaWxwLT5mX21vZGUgJj0gKEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSk7CisKKwlzd2l0Y2ggKGZpbHAtPmZfbW9kZSkgeworCWNhc2UgMToKKwkvKgorCSAqICBPX1JET05MWQorCSAqICBQT1NJWC4xIHNheXMgdGhhdCBPX05PTkJMT0NLIG1lYW5zIHJldHVybiB3aXRoIHRoZSBGSUZPCisJICogIG9wZW5lZCwgZXZlbiB3aGVuIHRoZXJlIGlzIG5vIHByb2Nlc3Mgd3JpdGluZyB0aGUgRklGTy4KKwkgKi8KKwkJZmlscC0+Zl9vcCA9ICZyZWFkX2ZpZm9fZm9wczsKKwkJUElQRV9SQ09VTlRFUigqaW5vZGUpKys7CisJCWlmIChQSVBFX1JFQURFUlMoKmlub2RlKSsrID09IDApCisJCQl3YWtlX3VwX3BhcnRuZXIoaW5vZGUpOworCisJCWlmICghUElQRV9XUklURVJTKCppbm9kZSkpIHsKKwkJCWlmICgoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spKSB7CisJCQkJLyogc3VwcHJlc3MgUE9MTEhVUCB1bnRpbCB3ZSBoYXZlCisJCQkJICogc2VlbiBhIHdyaXRlciAqLworCQkJCWZpbHAtPmZfdmVyc2lvbiA9IFBJUEVfV0NPVU5URVIoKmlub2RlKTsKKwkJCX0gZWxzZSAKKwkJCXsKKwkJCQl3YWl0X2Zvcl9wYXJ0bmVyKGlub2RlLCAmUElQRV9XQ09VTlRFUigqaW5vZGUpKTsKKwkJCQlpZihzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQkJZ290byBlcnJfcmQ7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJCisJY2FzZSAyOgorCS8qCisJICogIE9fV1JPTkxZCisJICogIFBPU0lYLjEgc2F5cyB0aGF0IE9fTk9OQkxPQ0sgbWVhbnMgcmV0dXJuIC0xIHdpdGgKKwkgKiAgZXJybm89RU5YSU8gd2hlbiB0aGVyZSBpcyBubyBwcm9jZXNzIHJlYWRpbmcgdGhlIEZJRk8uCisJICovCisJCXJldCA9IC1FTlhJTzsKKwkJaWYgKChmaWxwLT5mX2ZsYWdzICYgT19OT05CTE9DSykgJiYgIVBJUEVfUkVBREVSUygqaW5vZGUpKQorCQkJZ290byBlcnI7CisKKwkJZmlscC0+Zl9vcCA9ICZ3cml0ZV9maWZvX2ZvcHM7CisJCVBJUEVfV0NPVU5URVIoKmlub2RlKSsrOworCQlpZiAoIVBJUEVfV1JJVEVSUygqaW5vZGUpKyspCisJCQl3YWtlX3VwX3BhcnRuZXIoaW5vZGUpOworCisJCWlmICghUElQRV9SRUFERVJTKCppbm9kZSkpIHsKKwkJCXdhaXRfZm9yX3BhcnRuZXIoaW5vZGUsICZQSVBFX1JDT1VOVEVSKCppbm9kZSkpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCWdvdG8gZXJyX3dyOworCQl9CisJCWJyZWFrOworCQorCWNhc2UgMzoKKwkvKgorCSAqICBPX1JEV1IKKwkgKiAgUE9TSVguMSBsZWF2ZXMgdGhpcyBjYXNlICJ1bmRlZmluZWQiIHdoZW4gT19OT05CTE9DSyBpcyBzZXQuCisJICogIFRoaXMgaW1wbGVtZW50YXRpb24gd2lsbCBORVZFUiBibG9jayBvbiBhIE9fUkRXUiBvcGVuLCBzaW5jZQorCSAqICB0aGUgcHJvY2VzcyBjYW4gYXQgbGVhc3QgdGFsayB0byBpdHNlbGYuCisJICovCisJCWZpbHAtPmZfb3AgPSAmcmR3cl9maWZvX2ZvcHM7CisKKwkJUElQRV9SRUFERVJTKCppbm9kZSkrKzsKKwkJUElQRV9XUklURVJTKCppbm9kZSkrKzsKKwkJUElQRV9SQ09VTlRFUigqaW5vZGUpKys7CisJCVBJUEVfV0NPVU5URVIoKmlub2RlKSsrOworCQlpZiAoUElQRV9SRUFERVJTKCppbm9kZSkgPT0gMSB8fCBQSVBFX1dSSVRFUlMoKmlub2RlKSA9PSAxKQorCQkJd2FrZV91cF9wYXJ0bmVyKGlub2RlKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBPayEgKi8KKwl1cChQSVBFX1NFTSgqaW5vZGUpKTsKKwlyZXR1cm4gMDsKKworZXJyX3JkOgorCWlmICghLS1QSVBFX1JFQURFUlMoKmlub2RlKSkKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKFBJUEVfV0FJVCgqaW5vZGUpKTsKKwlyZXQgPSAtRVJFU1RBUlRTWVM7CisJZ290byBlcnI7CisKK2Vycl93cjoKKwlpZiAoIS0tUElQRV9XUklURVJTKCppbm9kZSkpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZShQSVBFX1dBSVQoKmlub2RlKSk7CisJcmV0ID0gLUVSRVNUQVJUU1lTOworCWdvdG8gZXJyOworCitlcnI6CisJaWYgKCFQSVBFX1JFQURFUlMoKmlub2RlKSAmJiAhUElQRV9XUklURVJTKCppbm9kZSkpCisJCWZyZWVfcGlwZV9pbmZvKGlub2RlKTsKKworZXJyX25vY2xlYW51cDoKKwl1cChQSVBFX1NFTSgqaW5vZGUpKTsKKworZXJyX25vbG9ja19ub2NsZWFudXA6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIER1bW15IGRlZmF1bHQgZmlsZS1vcGVyYXRpb25zOiB0aGUgb25seSB0aGluZyB0aGlzIGRvZXMKKyAqIGlzIGNvbnRhaW4gdGhlIG9wZW4gdGhhdCB0aGVuIGZpbGxzIGluIHRoZSBjb3JyZWN0IG9wZXJhdGlvbnMKKyAqIGRlcGVuZGluZyBvbiB0aGUgYWNjZXNzIG1vZGUgb2YgdGhlIGZpbGUuLi4KKyAqLworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZWZfZmlmb19mb3BzID0geworCS5vcGVuCQk9IGZpZm9fb3BlbiwJLyogd2lsbCBzZXQgcmVhZCBvciB3cml0ZSBwaXBlX2ZvcHMgKi8KK307CmRpZmYgLS1naXQgYS9mcy9maWxlLmMgYi9mcy9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJiNWYyNQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2ZpbGUuYwpAQCAtMCwwICsxLDI1NCBAQAorLyoKKyAqICBsaW51eC9mcy9maWxlLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk4LTE5OTksIFN0ZXBoZW4gVHdlZWRpZSBhbmQgQmlsbCBIYXdlcworICoKKyAqICBNYW5hZ2UgdGhlIGR5bmFtaWMgZmQgYXJyYXlzIGluIHRoZSBwcm9jZXNzIGZpbGVzX3N0cnVjdC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworCisvKgorICogQWxsb2NhdGUgYW4gZmQgYXJyYXksIHVzaW5nIGttYWxsb2Mgb3Igdm1hbGxvYy4KKyAqIE5vdGU6IHRoZSBhcnJheSBpc24ndCBjbGVhcmVkIGF0IGFsbG9jYXRpb24gdGltZS4KKyAqLworc3RydWN0IGZpbGUgKiogYWxsb2NfZmRfYXJyYXkoaW50IG51bSkKK3sKKwlzdHJ1Y3QgZmlsZSAqKm5ld19mZHM7CisJaW50IHNpemUgPSBudW0gKiBzaXplb2Yoc3RydWN0IGZpbGUgKik7CisKKwlpZiAoc2l6ZSA8PSBQQUdFX1NJWkUpCisJCW5ld19mZHMgPSAoc3RydWN0IGZpbGUgKiopIGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJZWxzZSAKKwkJbmV3X2ZkcyA9IChzdHJ1Y3QgZmlsZSAqKikgdm1hbGxvYyhzaXplKTsKKwlyZXR1cm4gbmV3X2ZkczsKK30KKwordm9pZCBmcmVlX2ZkX2FycmF5KHN0cnVjdCBmaWxlICoqYXJyYXksIGludCBudW0pCit7CisJaW50IHNpemUgPSBudW0gKiBzaXplb2Yoc3RydWN0IGZpbGUgKik7CisKKwlpZiAoIWFycmF5KSB7CisJCXByaW50ayAoS0VSTl9FUlIgImZyZWVfZmRfYXJyYXk6IGFycmF5ID0gMCAobnVtID0gJWQpXG4iLCBudW0pOworCQlyZXR1cm47CisJfQorCisJaWYgKG51bSA8PSBOUl9PUEVOX0RFRkFVTFQpIC8qIERvbid0IGZyZWUgdGhlIGVtYmVkZGVkIGZkIGFycmF5ISAqLworCQlyZXR1cm47CisJZWxzZSBpZiAoc2l6ZSA8PSBQQUdFX1NJWkUpCisJCWtmcmVlKGFycmF5KTsKKwllbHNlCisJCXZmcmVlKGFycmF5KTsKK30KKworLyoKKyAqIEV4cGFuZCB0aGUgZmQgYXJyYXkgaW4gdGhlIGZpbGVzX3N0cnVjdC4gIENhbGxlZCB3aXRoIHRoZSBmaWxlcworICogc3BpbmxvY2sgaGVsZCBmb3Igd3JpdGUuCisgKi8KKworc3RhdGljIGludCBleHBhbmRfZmRfYXJyYXkoc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMsIGludCBucikKKwlfX3JlbGVhc2VzKGZpbGVzLT5maWxlX2xvY2spCisJX19hY3F1aXJlcyhmaWxlcy0+ZmlsZV9sb2NrKQoreworCXN0cnVjdCBmaWxlICoqbmV3X2ZkczsKKwlpbnQgZXJyb3IsIG5mZHM7CisKKwkKKwllcnJvciA9IC1FTUZJTEU7CisJaWYgKGZpbGVzLT5tYXhfZmRzID49IE5SX09QRU4gfHwgbnIgPj0gTlJfT1BFTikKKwkJZ290byBvdXQ7CisKKwluZmRzID0gZmlsZXMtPm1heF9mZHM7CisJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCisJLyogCisJICogRXhwYW5kIHRvIHRoZSBtYXggaW4gZWFzeSBzdGVwcywgYW5kIGtlZXAgZXhwYW5kaW5nIGl0IHVudGlsCisJICogd2UgaGF2ZSBlbm91Z2ggZm9yIHRoZSByZXF1ZXN0ZWQgZmQgYXJyYXkgc2l6ZS4gCisJICovCisKKwlkbyB7CisjaWYgTlJfT1BFTl9ERUZBVUxUIDwgMjU2CisJCWlmIChuZmRzIDwgMjU2KQorCQkJbmZkcyA9IDI1NjsKKwkJZWxzZSAKKyNlbmRpZgorCQlpZiAobmZkcyA8IChQQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGZpbGUgKikpKQorCQkJbmZkcyA9IFBBR0VfU0laRSAvIHNpemVvZihzdHJ1Y3QgZmlsZSAqKTsKKwkJZWxzZSB7CisJCQluZmRzID0gbmZkcyAqIDI7CisJCQlpZiAobmZkcyA+IE5SX09QRU4pCisJCQkJbmZkcyA9IE5SX09QRU47CisJCX0KKwl9IHdoaWxlIChuZmRzIDw9IG5yKTsKKworCWVycm9yID0gLUVOT01FTTsKKwluZXdfZmRzID0gYWxsb2NfZmRfYXJyYXkobmZkcyk7CisJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlpZiAoIW5ld19mZHMpCisJCWdvdG8gb3V0OworCisJLyogQ29weSB0aGUgZXhpc3RpbmcgYXJyYXkgYW5kIGluc3RhbGwgdGhlIG5ldyBwb2ludGVyICovCisKKwlpZiAobmZkcyA+IGZpbGVzLT5tYXhfZmRzKSB7CisJCXN0cnVjdCBmaWxlICoqb2xkX2ZkczsKKwkJaW50IGk7CisJCQorCQlvbGRfZmRzID0geGNoZygmZmlsZXMtPmZkLCBuZXdfZmRzKTsKKwkJaSA9IHhjaGcoJmZpbGVzLT5tYXhfZmRzLCBuZmRzKTsKKworCQkvKiBEb24ndCBjb3B5L2NsZWFyIHRoZSBhcnJheSBpZiB3ZSBhcmUgY3JlYXRpbmcgYSBuZXcKKwkJICAgZmQgYXJyYXkgZm9yIGZvcmsoKSAqLworCQlpZiAoaSkgeworCQkJbWVtY3B5KG5ld19mZHMsIG9sZF9mZHMsIGkgKiBzaXplb2Yoc3RydWN0IGZpbGUgKikpOworCQkJLyogY2xlYXIgdGhlIHJlbWFpbmRlciBvZiB0aGUgYXJyYXkgKi8KKwkJCW1lbXNldCgmbmV3X2Zkc1tpXSwgMCwKKwkJCSAgICAgICAobmZkcy1pKSAqIHNpemVvZihzdHJ1Y3QgZmlsZSAqKSk7IAorCisJCQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJCQlmcmVlX2ZkX2FycmF5KG9sZF9mZHMsIGkpOworCQkJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIFNvbWVib2R5IGV4cGFuZGVkIHRoZSBhcnJheSB3aGlsZSB3ZSBzbGVwdCAuLi4gKi8KKwkJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCQlmcmVlX2ZkX2FycmF5KG5ld19mZHMsIG5mZHMpOworCQlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOworCX0KKwllcnJvciA9IDA7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogQWxsb2NhdGUgYW4gZmRzZXQgYXJyYXksIHVzaW5nIGttYWxsb2Mgb3Igdm1hbGxvYy4KKyAqIE5vdGU6IHRoZSBhcnJheSBpc24ndCBjbGVhcmVkIGF0IGFsbG9jYXRpb24gdGltZS4KKyAqLworZmRfc2V0ICogYWxsb2NfZmRzZXQoaW50IG51bSkKK3sKKwlmZF9zZXQgKm5ld19mZHNldDsKKwlpbnQgc2l6ZSA9IG51bSAvIDg7CisKKwlpZiAoc2l6ZSA8PSBQQUdFX1NJWkUpCisJCW5ld19mZHNldCA9IChmZF9zZXQgKikga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwllbHNlCisJCW5ld19mZHNldCA9IChmZF9zZXQgKikgdm1hbGxvYyhzaXplKTsKKwlyZXR1cm4gbmV3X2Zkc2V0OworfQorCit2b2lkIGZyZWVfZmRzZXQoZmRfc2V0ICphcnJheSwgaW50IG51bSkKK3sKKwlpbnQgc2l6ZSA9IG51bSAvIDg7CisKKwlpZiAobnVtIDw9IF9fRkRfU0VUU0laRSkgLyogRG9uJ3QgZnJlZSBhbiBlbWJlZGRlZCBmZHNldCAqLworCQlyZXR1cm47CisJZWxzZSBpZiAoc2l6ZSA8PSBQQUdFX1NJWkUpCisJCWtmcmVlKGFycmF5KTsKKwllbHNlCisJCXZmcmVlKGFycmF5KTsKK30KKworLyoKKyAqIEV4cGFuZCB0aGUgZmRzZXQgaW4gdGhlIGZpbGVzX3N0cnVjdC4gIENhbGxlZCB3aXRoIHRoZSBmaWxlcyBzcGlubG9jaworICogaGVsZCBmb3Igd3JpdGUuCisgKi8KK3N0YXRpYyBpbnQgZXhwYW5kX2Zkc2V0KHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzLCBpbnQgbnIpCisJX19yZWxlYXNlcyhmaWxlLT5maWxlX2xvY2spCisJX19hY3F1aXJlcyhmaWxlLT5maWxlX2xvY2spCit7CisJZmRfc2V0ICpuZXdfb3BlbnNldCA9IE5VTEwsICpuZXdfZXhlY3NldCA9IE5VTEw7CisJaW50IGVycm9yLCBuZmRzID0gMDsKKworCWVycm9yID0gLUVNRklMRTsKKwlpZiAoZmlsZXMtPm1heF9mZHNldCA+PSBOUl9PUEVOIHx8IG5yID49IE5SX09QRU4pCisJCWdvdG8gb3V0OworCisJbmZkcyA9IGZpbGVzLT5tYXhfZmRzZXQ7CisJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCisJLyogRXhwYW5kIHRvIHRoZSBtYXggaW4gZWFzeSBzdGVwcyAqLworCWRvIHsKKwkJaWYgKG5mZHMgPCAoUEFHRV9TSVpFICogOCkpCisJCQluZmRzID0gUEFHRV9TSVpFICogODsKKwkJZWxzZSB7CisJCQluZmRzID0gbmZkcyAqIDI7CisJCQlpZiAobmZkcyA+IE5SX09QRU4pCisJCQkJbmZkcyA9IE5SX09QRU47CisJCX0KKwl9IHdoaWxlIChuZmRzIDw9IG5yKTsKKworCWVycm9yID0gLUVOT01FTTsKKwluZXdfb3BlbnNldCA9IGFsbG9jX2Zkc2V0KG5mZHMpOworCW5ld19leGVjc2V0ID0gYWxsb2NfZmRzZXQobmZkcyk7CisJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlpZiAoIW5ld19vcGVuc2V0IHx8ICFuZXdfZXhlY3NldCkKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IDA7CisJCisJLyogQ29weSB0aGUgZXhpc3RpbmcgdGFibGVzIGFuZCBpbnN0YWxsIHRoZSBuZXcgcG9pbnRlcnMgKi8KKwlpZiAobmZkcyA+IGZpbGVzLT5tYXhfZmRzZXQpIHsKKwkJaW50IGkgPSBmaWxlcy0+bWF4X2Zkc2V0IC8gKHNpemVvZih1bnNpZ25lZCBsb25nKSAqIDgpOworCQlpbnQgY291bnQgPSAobmZkcyAtIGZpbGVzLT5tYXhfZmRzZXQpIC8gODsKKwkJCisJCS8qIAorCQkgKiBEb24ndCBjb3B5IHRoZSBlbnRpcmUgYXJyYXkgaWYgdGhlIGN1cnJlbnQgZmRzZXQgaXMKKwkJICogbm90IHlldCBpbml0aWFsaXNlZC4gIAorCQkgKi8KKwkJaWYgKGkpIHsKKwkJCW1lbWNweSAobmV3X29wZW5zZXQsIGZpbGVzLT5vcGVuX2ZkcywgZmlsZXMtPm1heF9mZHNldC84KTsKKwkJCW1lbWNweSAobmV3X2V4ZWNzZXQsIGZpbGVzLT5jbG9zZV9vbl9leGVjLCBmaWxlcy0+bWF4X2Zkc2V0LzgpOworCQkJbWVtc2V0ICgmbmV3X29wZW5zZXQtPmZkc19iaXRzW2ldLCAwLCBjb3VudCk7CisJCQltZW1zZXQgKCZuZXdfZXhlY3NldC0+ZmRzX2JpdHNbaV0sIDAsIGNvdW50KTsKKwkJfQorCQkKKwkJbmZkcyA9IHhjaGcoJmZpbGVzLT5tYXhfZmRzZXQsIG5mZHMpOworCQluZXdfb3BlbnNldCA9IHhjaGcoJmZpbGVzLT5vcGVuX2ZkcywgbmV3X29wZW5zZXQpOworCQluZXdfZXhlY3NldCA9IHhjaGcoJmZpbGVzLT5jbG9zZV9vbl9leGVjLCBuZXdfZXhlY3NldCk7CisJCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwkJZnJlZV9mZHNldCAobmV3X29wZW5zZXQsIG5mZHMpOworCQlmcmVlX2Zkc2V0IChuZXdfZXhlY3NldCwgbmZkcyk7CisJCXNwaW5fbG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJCXJldHVybiAwOworCX0gCisJLyogU29tZWJvZHkgZXhwYW5kZWQgdGhlIGFycmF5IHdoaWxlIHdlIHNsZXB0IC4uLiAqLworCitvdXQ6CisJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCWlmIChuZXdfb3BlbnNldCkKKwkJZnJlZV9mZHNldChuZXdfb3BlbnNldCwgbmZkcyk7CisJaWYgKG5ld19leGVjc2V0KQorCQlmcmVlX2Zkc2V0KG5ld19leGVjc2V0LCBuZmRzKTsKKwlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIEV4cGFuZCBmaWxlcy4KKyAqIFJldHVybiA8MCBvbiBlcnJvcjsgMCBub3RoaW5nIGRvbmU7IDEgZmlsZXMgZXhwYW5kZWQsIHdlIG1heSBoYXZlIGJsb2NrZWQuCisgKiBTaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIGZpbGVzLT5maWxlX2xvY2sgc3BpbmxvY2sgaGVsZCBmb3Igd3JpdGUuCisgKi8KK2ludCBleHBhbmRfZmlsZXMoc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMsIGludCBucikKK3sKKwlpbnQgZXJyLCBleHBhbmQgPSAwOworCisJaWYgKG5yID49IGZpbGVzLT5tYXhfZmRzZXQpIHsKKwkJZXhwYW5kID0gMTsKKwkJaWYgKChlcnIgPSBleHBhbmRfZmRzZXQoZmlsZXMsIG5yKSkpCisJCQlnb3RvIG91dDsKKwl9CisJaWYgKG5yID49IGZpbGVzLT5tYXhfZmRzKSB7CisJCWV4cGFuZCA9IDE7CisJCWlmICgoZXJyID0gZXhwYW5kX2ZkX2FycmF5KGZpbGVzLCBucikpKQorCQkJZ290byBvdXQ7CisJfQorCWVyciA9IGV4cGFuZDsKK291dDoKKwlyZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvZnMvZmlsZV90YWJsZS5jIGIvZnMvZmlsZV90YWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZDgzY2IKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9maWxlX3RhYmxlLmMKQEAgLTAsMCArMSwyNTUgQEAKKy8qCisgKiAgbGludXgvZnMvZmlsZV90YWJsZS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTcgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KQorICovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9ldmVudHBvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKworLyogc3lzY3RsIHR1bmFibGVzLi4uICovCitzdHJ1Y3QgZmlsZXNfc3RhdF9zdHJ1Y3QgZmlsZXNfc3RhdCA9IHsKKwkubWF4X2ZpbGVzID0gTlJfRklMRQorfTsKKworRVhQT1JUX1NZTUJPTChmaWxlc19zdGF0KTsgLyogTmVlZGVkIGJ5IHVuaXgubyAqLworCisvKiBwdWJsaWMuIE5vdCBwcmV0dHkhICovCisgX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXAgREVGSU5FX1NQSU5MT0NLKGZpbGVzX2xvY2spOworCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGZpbHBfY291bnRfbG9jayk7CisKKy8qIHNsYWIgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBhcmUgY2FsbGVkIGZyb20gYXJiaXRyYXJ5CisgKiBjb250ZXh0IGFuZCBtdXN0IGJlIGZ1bGx5IHRocmVhZGVkIC0gdXNlIGEgbG9jYWwgc3BpbmxvY2sKKyAqIHRvIHByb3RlY3QgZmlsZXNfc3RhdC5ucl9maWxlcworICovCit2b2lkIGZpbHBfY3Rvcih2b2lkICogb2JqcCwgc3RydWN0IGttZW1fY2FjaGVfcyAqY2FjaGVwLCB1bnNpZ25lZCBsb25nIGNmbGFncykKK3sKKwlpZiAoKGNmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CisJICAgIFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZmlscF9jb3VudF9sb2NrLCBmbGFncyk7CisJCWZpbGVzX3N0YXQubnJfZmlsZXMrKzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmlscF9jb3VudF9sb2NrLCBmbGFncyk7CisJfQorfQorCit2b2lkIGZpbHBfZHRvcih2b2lkICogb2JqcCwgc3RydWN0IGttZW1fY2FjaGVfcyAqY2FjaGVwLCB1bnNpZ25lZCBsb25nIGRmbGFncykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZmaWxwX2NvdW50X2xvY2ssIGZsYWdzKTsKKwlmaWxlc19zdGF0Lm5yX2ZpbGVzLS07CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmlscF9jb3VudF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmaWxlX2ZyZWUoc3RydWN0IGZpbGUgKmYpCit7CisJa21lbV9jYWNoZV9mcmVlKGZpbHBfY2FjaGVwLCBmKTsKK30KKworLyogRmluZCBhbiB1bnVzZWQgZmlsZSBzdHJ1Y3R1cmUgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gaXQuCisgKiBSZXR1cm5zIE5VTEwsIGlmIHRoZXJlIGFyZSBubyBtb3JlIGZyZWUgZmlsZSBzdHJ1Y3R1cmVzIG9yCisgKiB3ZSBydW4gb3V0IG9mIG1lbW9yeS4KKyAqLworc3RydWN0IGZpbGUgKmdldF9lbXB0eV9maWxwKHZvaWQpCit7CitzdGF0aWMgaW50IG9sZF9tYXg7CisJc3RydWN0IGZpbGUgKiBmOworCisJLyoKKwkgKiBQcml2aWxlZ2VkIHVzZXJzIGNhbiBnbyBhYm92ZSBtYXhfZmlsZXMKKwkgKi8KKwlpZiAoZmlsZXNfc3RhdC5ucl9maWxlcyA8IGZpbGVzX3N0YXQubWF4X2ZpbGVzIHx8CisJCQkJY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgeworCQlmID0ga21lbV9jYWNoZV9hbGxvYyhmaWxwX2NhY2hlcCwgR0ZQX0tFUk5FTCk7CisJCWlmIChmKSB7CisJCQltZW1zZXQoZiwgMCwgc2l6ZW9mKCpmKSk7CisJCQlpZiAoc2VjdXJpdHlfZmlsZV9hbGxvYyhmKSkgeworCQkJCWZpbGVfZnJlZShmKTsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCQlldmVudHBvbGxfaW5pdF9maWxlKGYpOworCQkJYXRvbWljX3NldCgmZi0+Zl9jb3VudCwgMSk7CisJCQlmLT5mX3VpZCA9IGN1cnJlbnQtPmZzdWlkOworCQkJZi0+Zl9naWQgPSBjdXJyZW50LT5mc2dpZDsKKwkJCXJ3bG9ja19pbml0KCZmLT5mX293bmVyLmxvY2spOworCQkJLyogZi0+Zl92ZXJzaW9uOiAwICovCisJCQlJTklUX0xJU1RfSEVBRCgmZi0+Zl9saXN0KTsKKwkJCWYtPmZfbWF4Y291bnQgPSBJTlRfTUFYOworCQkJcmV0dXJuIGY7CisJCX0KKwl9CisKKwkvKiBSYW4gb3V0IG9mIGZpbHBzIC0gcmVwb3J0IHRoYXQgKi8KKwlpZiAoZmlsZXNfc3RhdC5tYXhfZmlsZXMgPj0gb2xkX21heCkgeworCQlwcmludGsoS0VSTl9JTkZPICJWRlM6IGZpbGUtbWF4IGxpbWl0ICVkIHJlYWNoZWRcbiIsCisJCQkJCWZpbGVzX3N0YXQubWF4X2ZpbGVzKTsKKwkJb2xkX21heCA9IGZpbGVzX3N0YXQubWF4X2ZpbGVzOworCX0gZWxzZSB7CisJCS8qIEJpZyBwcm9ibGVtcy4uLiAqLworCQlwcmludGsoS0VSTl9XQVJOSU5HICJWRlM6IGZpbHAgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCX0KK2ZhaWw6CisJcmV0dXJuIE5VTEw7Cit9CisKK0VYUE9SVF9TWU1CT0woZ2V0X2VtcHR5X2ZpbHApOworCit2b2lkIGZhc3RjYWxsIGZwdXQoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmZpbGUtPmZfY291bnQpKQorCQlfX2ZwdXQoZmlsZSk7Cit9CisKK0VYUE9SVF9TWU1CT0woZnB1dCk7CisKKy8qIF9fZnB1dCBpcyBjYWxsZWQgZnJvbSB0YXNrIGNvbnRleHQgd2hlbiBhaW8gY29tcGxldGlvbiByZWxlYXNlcyB0aGUgbGFzdAorICogbGFzdCB1c2Ugb2YgYSBzdHJ1Y3QgZmlsZSAqLiAgRG8gbm90IHVzZSBvdGhlcndpc2UuCisgKi8KK3ZvaWQgZmFzdGNhbGwgX19mcHV0KHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCXN0cnVjdCB2ZnNtb3VudCAqbW50ID0gZmlsZS0+Zl92ZnNtbnQ7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKworCW1pZ2h0X3NsZWVwKCk7CisJLyoKKwkgKiBUaGUgZnVuY3Rpb24gZXZlbnRwb2xsX3JlbGVhc2UoKSBzaG91bGQgYmUgdGhlIGZpcnN0IGNhbGxlZAorCSAqIGluIHRoZSBmaWxlIGNsZWFudXAgY2hhaW4uCisJICovCisJZXZlbnRwb2xsX3JlbGVhc2UoZmlsZSk7CisJbG9ja3NfcmVtb3ZlX2Zsb2NrKGZpbGUpOworCisJaWYgKGZpbGUtPmZfb3AgJiYgZmlsZS0+Zl9vcC0+cmVsZWFzZSkKKwkJZmlsZS0+Zl9vcC0+cmVsZWFzZShpbm9kZSwgZmlsZSk7CisJc2VjdXJpdHlfZmlsZV9mcmVlKGZpbGUpOworCWlmICh1bmxpa2VseShpbm9kZS0+aV9jZGV2ICE9IE5VTEwpKQorCQljZGV2X3B1dChpbm9kZS0+aV9jZGV2KTsKKwlmb3BzX3B1dChmaWxlLT5mX29wKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCXB1dF93cml0ZV9hY2Nlc3MoaW5vZGUpOworCWZpbGVfa2lsbChmaWxlKTsKKwlmaWxlLT5mX2RlbnRyeSA9IE5VTEw7CisJZmlsZS0+Zl92ZnNtbnQgPSBOVUxMOworCWZpbGVfZnJlZShmaWxlKTsKKwlkcHV0KGRlbnRyeSk7CisJbW50cHV0KG1udCk7Cit9CisKK3N0cnVjdCBmaWxlIGZhc3RjYWxsICpmZ2V0KHVuc2lnbmVkIGludCBmZCkKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcyA9IGN1cnJlbnQtPmZpbGVzOworCisJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlmaWxlID0gZmNoZWNrX2ZpbGVzKGZpbGVzLCBmZCk7CisJaWYgKGZpbGUpCisJCWdldF9maWxlKGZpbGUpOworCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwlyZXR1cm4gZmlsZTsKK30KKworRVhQT1JUX1NZTUJPTChmZ2V0KTsKKworLyoKKyAqIExpZ2h0d2VpZ2h0IGZpbGUgbG9va3VwIC0gbm8gcmVmY250IGluY3JlbWVudCBpZiBmZCB0YWJsZSBpc24ndCBzaGFyZWQuIAorICogWW91IGNhbiB1c2UgdGhpcyBvbmx5IGlmIGl0IGlzIGd1cmFudGVlZCB0aGF0IHRoZSBjdXJyZW50IHRhc2sgYWxyZWFkeSAKKyAqIGhvbGRzIGEgcmVmY250IHRvIHRoYXQgZmlsZS4gVGhhdCBjaGVjayBoYXMgdG8gYmUgZG9uZSBhdCBmZ2V0KCkgb25seQorICogYW5kIGEgZmxhZyBpcyByZXR1cm5lZCB0byBiZSBwYXNzZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZnB1dF9saWdodCgpLgorICogVGhlcmUgbXVzdCBub3QgYmUgYSBjbG9uaW5nIGJldHdlZW4gYW4gZmdldF9saWdodC9mcHV0X2xpZ2h0IHBhaXIuCisgKi8KK3N0cnVjdCBmaWxlIGZhc3RjYWxsICpmZ2V0X2xpZ2h0KHVuc2lnbmVkIGludCBmZCwgaW50ICpmcHV0X25lZWRlZCkKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcyA9IGN1cnJlbnQtPmZpbGVzOworCisJKmZwdXRfbmVlZGVkID0gMDsKKwlpZiAobGlrZWx5KChhdG9taWNfcmVhZCgmZmlsZXMtPmNvdW50KSA9PSAxKSkpIHsKKwkJZmlsZSA9IGZjaGVja19maWxlcyhmaWxlcywgZmQpOworCX0gZWxzZSB7CisJCXNwaW5fbG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJCWZpbGUgPSBmY2hlY2tfZmlsZXMoZmlsZXMsIGZkKTsKKwkJaWYgKGZpbGUpIHsKKwkJCWdldF9maWxlKGZpbGUpOworCQkJKmZwdXRfbmVlZGVkID0gMTsKKwkJfQorCQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJfQorCXJldHVybiBmaWxlOworfQorCisKK3ZvaWQgcHV0X2ZpbHAoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmZpbGUtPmZfY291bnQpKSB7CisJCXNlY3VyaXR5X2ZpbGVfZnJlZShmaWxlKTsKKwkJZmlsZV9raWxsKGZpbGUpOworCQlmaWxlX2ZyZWUoZmlsZSk7CisJfQorfQorCit2b2lkIGZpbGVfbW92ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3sKKwlpZiAoIWxpc3QpCisJCXJldHVybjsKKwlmaWxlX2xpc3RfbG9jaygpOworCWxpc3RfbW92ZSgmZmlsZS0+Zl9saXN0LCBsaXN0KTsKKwlmaWxlX2xpc3RfdW5sb2NrKCk7Cit9CisKK3ZvaWQgZmlsZV9raWxsKHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmICghbGlzdF9lbXB0eSgmZmlsZS0+Zl9saXN0KSkgeworCQlmaWxlX2xpc3RfbG9jaygpOworCQlsaXN0X2RlbF9pbml0KCZmaWxlLT5mX2xpc3QpOworCQlmaWxlX2xpc3RfdW5sb2NrKCk7CisJfQorfQorCitpbnQgZnNfbWF5X3JlbW91bnRfcm8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCisJLyogQ2hlY2sgdGhhdCBubyBmaWxlcyBhcmUgY3VycmVudGx5IG9wZW5lZCBmb3Igd3JpdGluZy4gKi8KKwlmaWxlX2xpc3RfbG9jaygpOworCWxpc3RfZm9yX2VhY2gocCwgJnNiLT5zX2ZpbGVzKSB7CisJCXN0cnVjdCBmaWxlICpmaWxlID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgZmlsZSwgZl9saXN0KTsKKwkJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCisJCS8qIEZpbGUgd2l0aCBwZW5kaW5nIGRlbGV0ZT8gKi8KKwkJaWYgKGlub2RlLT5pX25saW5rID09IDApCisJCQlnb3RvIHRvb19iYWQ7CisKKwkJLyogV3JpdGVhYmxlIGZpbGU/ICovCisJCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlnb3RvIHRvb19iYWQ7CisJfQorCWZpbGVfbGlzdF91bmxvY2soKTsKKwlyZXR1cm4gMTsgLyogVGlzJyBjb29sIGJyby4gKi8KK3Rvb19iYWQ6CisJZmlsZV9saXN0X3VubG9jaygpOworCXJldHVybiAwOworfQorCit2b2lkIF9faW5pdCBmaWxlc19pbml0KHVuc2lnbmVkIGxvbmcgbWVtcGFnZXMpCit7IAorCWludCBuOyAKKwkvKiBPbmUgZmlsZSB3aXRoIGFzc29jaWF0ZWQgaW5vZGUgYW5kIGRjYWNoZSBpcyB2ZXJ5IHJvdWdobHkgMUsuIAorCSAqIFBlciBkZWZhdWx0IGRvbid0IHVzZSBtb3JlIHRoYW4gMTAlIG9mIG91ciBtZW1vcnkgZm9yIGZpbGVzLiAKKwkgKi8gCisKKwluID0gKG1lbXBhZ2VzICogKFBBR0VfU0laRSAvIDEwMjQpKSAvIDEwOworCWZpbGVzX3N0YXQubWF4X2ZpbGVzID0gbjsgCisJaWYgKGZpbGVzX3N0YXQubWF4X2ZpbGVzIDwgTlJfRklMRSkKKwkJZmlsZXNfc3RhdC5tYXhfZmlsZXMgPSBOUl9GSUxFOworfSAKZGlmZiAtLWdpdCBhL2ZzL2ZpbGVzeXN0ZW1zLmMgYi9mcy9maWxlc3lzdGVtcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MDgyYmYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9maWxlc3lzdGVtcy5jCkBAIC0wLDAgKzEsMjM2IEBACisvKgorICogIGxpbnV4L2ZzL2ZpbGVzeXN0ZW1zLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICB0YWJsZSBvZiBjb25maWd1cmVkIGZpbGVzeXN0ZW1zCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisvKgorICogSGFuZGxpbmcgb2YgZmlsZXN5c3RlbSBkcml2ZXJzIGxpc3QuCisgKiBSdWxlczoKKyAqCUluY2x1c2lvbiB0by9yZW1vdmFscyBmcm9tL3NjYW5uaW5nIG9mIGxpc3QgYXJlIHByb3RlY3RlZCBieSBzcGlubG9jay4KKyAqCUR1cmluZyB0aGUgdW5sb2FkIG1vZHVsZSBtdXN0IGNhbGwgdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCkuCisgKglXZSBjYW4gYWNjZXNzIHRoZSBmaWVsZHMgb2YgbGlzdCBlbGVtZW50IGlmOgorICoJCTEpIHNwaW5sb2NrIGlzIGhlbGQgb3IKKyAqCQkyKSB3ZSBob2xkIHRoZSByZWZlcmVuY2UgdG8gdGhlIG1vZHVsZS4KKyAqCVRoZSBsYXR0ZXIgY2FuIGJlIGd1YXJhbnRlZWQgYnkgY2FsbCBvZiB0cnlfbW9kdWxlX2dldCgpOyBpZiBpdAorICoJcmV0dXJuZWQgMCB3ZSBtdXN0IHNraXAgdGhlIGVsZW1lbnQsIG90aGVyd2lzZSB3ZSBnb3QgdGhlIHJlZmVyZW5jZS4KKyAqCU9uY2UgdGhlIHJlZmVyZW5jZSBpcyBvYnRhaW5lZCB3ZSBjYW4gZHJvcCB0aGUgc3BpbmxvY2suCisgKi8KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmaWxlX3N5c3RlbXM7CitzdGF0aWMgREVGSU5FX1JXTE9DSyhmaWxlX3N5c3RlbXNfbG9jayk7CisKKy8qIFdBUk5JTkc6IFRoaXMgY2FuIGJlIHVzZWQgb25seSBpZiB3ZSBfYWxyZWFkeV8gb3duIGEgcmVmZXJlbmNlICovCit2b2lkIGdldF9maWxlc3lzdGVtKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmcykKK3sKKwlfX21vZHVsZV9nZXQoZnMtPm93bmVyKTsKK30KKwordm9pZCBwdXRfZmlsZXN5c3RlbShzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnMpCit7CisJbW9kdWxlX3B1dChmcy0+b3duZXIpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKipmaW5kX2ZpbGVzeXN0ZW0oY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqKnA7CisJZm9yIChwPSZmaWxlX3N5c3RlbXM7ICpwOyBwPSYoKnApLT5uZXh0KQorCQlpZiAoc3RyY21wKCgqcCktPm5hbWUsbmFtZSkgPT0gMCkKKwkJCWJyZWFrOworCXJldHVybiBwOworfQorCisvKioKKyAqCXJlZ2lzdGVyX2ZpbGVzeXN0ZW0gLSByZWdpc3RlciBhIG5ldyBmaWxlc3lzdGVtCisgKglAZnM6IHRoZSBmaWxlIHN5c3RlbSBzdHJ1Y3R1cmUKKyAqCisgKglBZGRzIHRoZSBmaWxlIHN5c3RlbSBwYXNzZWQgdG8gdGhlIGxpc3Qgb2YgZmlsZSBzeXN0ZW1zIHRoZSBrZXJuZWwKKyAqCWlzIGF3YXJlIG9mIGZvciBtb3VudCBhbmQgb3RoZXIgc3lzY2FsbHMuIFJldHVybnMgMCBvbiBzdWNjZXNzLAorICoJb3IgYSBuZWdhdGl2ZSBlcnJubyBjb2RlIG9uIGFuIGVycm9yLgorICoKKyAqCVRoZSAmc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgdGhhdCBpcyBwYXNzZWQgaXMgbGlua2VkIGludG8gdGhlIGtlcm5lbCAKKyAqCXN0cnVjdHVyZXMgYW5kIG11c3Qgbm90IGJlIGZyZWVkIHVudGlsIHRoZSBmaWxlIHN5c3RlbSBoYXMgYmVlbgorICoJdW5yZWdpc3RlcmVkLgorICovCisgCitpbnQgcmVnaXN0ZXJfZmlsZXN5c3RlbShzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqIGZzKQoreworCWludCByZXMgPSAwOworCXN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICoqIHA7CisKKwlpZiAoIWZzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZnMtPm5leHQpCisJCXJldHVybiAtRUJVU1k7CisJSU5JVF9MSVNUX0hFQUQoJmZzLT5mc19zdXBlcnMpOworCXdyaXRlX2xvY2soJmZpbGVfc3lzdGVtc19sb2NrKTsKKwlwID0gZmluZF9maWxlc3lzdGVtKGZzLT5uYW1lKTsKKwlpZiAoKnApCisJCXJlcyA9IC1FQlVTWTsKKwllbHNlCisJCSpwID0gZnM7CisJd3JpdGVfdW5sb2NrKCZmaWxlX3N5c3RlbXNfbG9jayk7CisJcmV0dXJuIHJlczsKK30KKworRVhQT1JUX1NZTUJPTChyZWdpc3Rlcl9maWxlc3lzdGVtKTsKKworLyoqCisgKgl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0gLSB1bnJlZ2lzdGVyIGEgZmlsZSBzeXN0ZW0KKyAqCUBmczogZmlsZXN5c3RlbSB0byB1bnJlZ2lzdGVyCisgKgorICoJUmVtb3ZlIGEgZmlsZSBzeXN0ZW0gdGhhdCB3YXMgcHJldmlvdXNseSBzdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZAorICoJd2l0aCB0aGUga2VybmVsLiBBbiBlcnJvciBpcyByZXR1cm5lZCBpZiB0aGUgZmlsZSBzeXN0ZW0gaXMgbm90IGZvdW5kLgorICoJWmVybyBpcyByZXR1cm5lZCBvbiBhIHN1Y2Nlc3MuCisgKgkKKyAqCU9uY2UgdGhpcyBmdW5jdGlvbiBoYXMgcmV0dXJuZWQgdGhlICZzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBzdHJ1Y3R1cmUKKyAqCW1heSBiZSBmcmVlZCBvciByZXVzZWQuCisgKi8KKyAKK2ludCB1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKiBmcykKK3sKKwlzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqKiB0bXA7CisKKwl3cml0ZV9sb2NrKCZmaWxlX3N5c3RlbXNfbG9jayk7CisJdG1wID0gJmZpbGVfc3lzdGVtczsKKwl3aGlsZSAoKnRtcCkgeworCQlpZiAoZnMgPT0gKnRtcCkgeworCQkJKnRtcCA9IGZzLT5uZXh0OworCQkJZnMtPm5leHQgPSBOVUxMOworCQkJd3JpdGVfdW5sb2NrKCZmaWxlX3N5c3RlbXNfbG9jayk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQl0bXAgPSAmKCp0bXApLT5uZXh0OworCX0KKwl3cml0ZV91bmxvY2soJmZpbGVfc3lzdGVtc19sb2NrKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0pOworCitzdGF0aWMgaW50IGZzX2luZGV4KGNvbnN0IGNoYXIgX191c2VyICogX19uYW1lKQoreworCXN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICogdG1wOworCWNoYXIgKiBuYW1lOworCWludCBlcnIsIGluZGV4OworCisJbmFtZSA9IGdldG5hbWUoX19uYW1lKTsKKwllcnIgPSBQVFJfRVJSKG5hbWUpOworCWlmIChJU19FUlIobmFtZSkpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSAtRUlOVkFMOworCXJlYWRfbG9jaygmZmlsZV9zeXN0ZW1zX2xvY2spOworCWZvciAodG1wPWZpbGVfc3lzdGVtcywgaW5kZXg9MCA7IHRtcCA7IHRtcD10bXAtPm5leHQsIGluZGV4KyspIHsKKwkJaWYgKHN0cmNtcCh0bXAtPm5hbWUsbmFtZSkgPT0gMCkgeworCQkJZXJyID0gaW5kZXg7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZWFkX3VubG9jaygmZmlsZV9zeXN0ZW1zX2xvY2spOworCXB1dG5hbWUobmFtZSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBmc19uYW1lKHVuc2lnbmVkIGludCBpbmRleCwgY2hhciBfX3VzZXIgKiBidWYpCit7CisJc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKiB0bXA7CisJaW50IGxlbiwgcmVzOworCisJcmVhZF9sb2NrKCZmaWxlX3N5c3RlbXNfbG9jayk7CisJZm9yICh0bXAgPSBmaWxlX3N5c3RlbXM7IHRtcDsgdG1wID0gdG1wLT5uZXh0LCBpbmRleC0tKQorCQlpZiAoaW5kZXggPD0gMCAmJiB0cnlfbW9kdWxlX2dldCh0bXAtPm93bmVyKSkKKwkJCWJyZWFrOworCXJlYWRfdW5sb2NrKCZmaWxlX3N5c3RlbXNfbG9jayk7CisJaWYgKCF0bXApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogT0ssIHdlIGdvdCB0aGUgcmVmZXJlbmNlLCBzbyB3ZSBjYW4gc2FmZWx5IGJsb2NrICovCisJbGVuID0gc3RybGVuKHRtcC0+bmFtZSkgKyAxOworCXJlcyA9IGNvcHlfdG9fdXNlcihidWYsIHRtcC0+bmFtZSwgbGVuKSA/IC1FRkFVTFQgOiAwOworCXB1dF9maWxlc3lzdGVtKHRtcCk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBmc19tYXhpbmRleCh2b2lkKQoreworCXN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICogdG1wOworCWludCBpbmRleDsKKworCXJlYWRfbG9jaygmZmlsZV9zeXN0ZW1zX2xvY2spOworCWZvciAodG1wID0gZmlsZV9zeXN0ZW1zLCBpbmRleCA9IDAgOyB0bXAgOyB0bXAgPSB0bXAtPm5leHQsIGluZGV4KyspCisJCTsKKwlyZWFkX3VubG9jaygmZmlsZV9zeXN0ZW1zX2xvY2spOworCXJldHVybiBpbmRleDsKK30KKworLyoKKyAqIFdoZWUuLiBXZWlyZCBzeXN2IHN5c2NhbGwuIAorICovCithc21saW5rYWdlIGxvbmcgc3lzX3N5c2ZzKGludCBvcHRpb24sIHVuc2lnbmVkIGxvbmcgYXJnMSwgdW5zaWduZWQgbG9uZyBhcmcyKQoreworCWludCByZXR2YWwgPSAtRUlOVkFMOworCisJc3dpdGNoIChvcHRpb24pIHsKKwkJY2FzZSAxOgorCQkJcmV0dmFsID0gZnNfaW5kZXgoKGNvbnN0IGNoYXIgX191c2VyICopIGFyZzEpOworCQkJYnJlYWs7CisKKwkJY2FzZSAyOgorCQkJcmV0dmFsID0gZnNfbmFtZShhcmcxLCAoY2hhciBfX3VzZXIgKikgYXJnMik7CisJCQlicmVhazsKKworCQljYXNlIDM6CisJCQlyZXR2YWwgPSBmc19tYXhpbmRleCgpOworCQkJYnJlYWs7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBnZXRfZmlsZXN5c3RlbV9saXN0KGNoYXIgKiBidWYpCit7CisJaW50IGxlbiA9IDA7CisJc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKiB0bXA7CisKKwlyZWFkX2xvY2soJmZpbGVfc3lzdGVtc19sb2NrKTsKKwl0bXAgPSBmaWxlX3N5c3RlbXM7CisJd2hpbGUgKHRtcCAmJiBsZW4gPCBQQUdFX1NJWkUgLSA4MCkgeworCQlsZW4gKz0gc3ByaW50ZihidWYrbGVuLCAiJXNcdCVzXG4iLAorCQkJKHRtcC0+ZnNfZmxhZ3MgJiBGU19SRVFVSVJFU19ERVYpID8gIiIgOiAibm9kZXYiLAorCQkJdG1wLT5uYW1lKTsKKwkJdG1wID0gdG1wLT5uZXh0OworCX0KKwlyZWFkX3VubG9jaygmZmlsZV9zeXN0ZW1zX2xvY2spOworCXJldHVybiBsZW47Cit9CisKK3N0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpnZXRfZnNfdHlwZShjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmczsKKworCXJlYWRfbG9jaygmZmlsZV9zeXN0ZW1zX2xvY2spOworCWZzID0gKihmaW5kX2ZpbGVzeXN0ZW0obmFtZSkpOworCWlmIChmcyAmJiAhdHJ5X21vZHVsZV9nZXQoZnMtPm93bmVyKSkKKwkJZnMgPSBOVUxMOworCXJlYWRfdW5sb2NrKCZmaWxlX3N5c3RlbXNfbG9jayk7CisJaWYgKCFmcyAmJiAocmVxdWVzdF9tb2R1bGUoIiVzIiwgbmFtZSkgPT0gMCkpIHsKKwkJcmVhZF9sb2NrKCZmaWxlX3N5c3RlbXNfbG9jayk7CisJCWZzID0gKihmaW5kX2ZpbGVzeXN0ZW0obmFtZSkpOworCQlpZiAoZnMgJiYgIXRyeV9tb2R1bGVfZ2V0KGZzLT5vd25lcikpCisJCQlmcyA9IE5VTEw7CisJCXJlYWRfdW5sb2NrKCZmaWxlX3N5c3RlbXNfbG9jayk7CisJfQorCXJldHVybiBmczsKK30KKworRVhQT1JUX1NZTUJPTChnZXRfZnNfdHlwZSk7CmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy9NYWtlZmlsZSBiL2ZzL2ZyZWV2eGZzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YWQwOTcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9mcmVldnhmcy9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKKyMKKyMgVnhGUyBNYWtlZmlsZQorIworCitvYmotJChDT05GSUdfVlhGU19GUykgKz0gZnJlZXZ4ZnMubworCitmcmVldnhmcy1vYmpzIDo9IHZ4ZnNfYm1hcC5vIHZ4ZnNfZnNoZWFkLm8gdnhmc19pbW1lZC5vIHZ4ZnNfaW5vZGUubyBcCisJCSB2eGZzX2xvb2t1cC5vIHZ4ZnNfb2x0Lm8gdnhmc19zdWJyLm8gdnhmc19zdXBlci5vCmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzLmggYi9mcy9mcmVldnhmcy92eGZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRhMDI1MgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2ZyZWV2eGZzL3Z4ZnMuaApAQCAtMCwwICsxLDI2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKyNpZm5kZWYgX1ZYRlNfU1VQRVJfSF8KKyNkZWZpbmUgX1ZYRlNfU1VQRVJfSF8KKworLyoKKyAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBzdXBlcmJsb2NrIHN0cnVjdHVyZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIGRpc2sgYW5kIGNvcmUKKyAqIHN1cGVyYmxvY2tzIG9mIHRoZSBWZXJpdGFzIEZpbGVzeXN0ZW0uCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgInZ4ZnNfa2NvbXBhdC5oIgorCisKKy8qCisgKiBEYXRhIHR5cGVzIGZvciB1c2Ugd2l0aCB0aGUgVnhGUyBvbmRpc2sgZm9ybWF0LgorICovCit0eXBlZGVmCWludDMyX3QJCXZ4X2RhZGRyX3Q7Cit0eXBlZGVmIGludDMyX3QJCXZ4X2lub190OworCisvKgorICogU3VwZXJibG9jayBtYWdpYyBudW1iZXIgKHZ4ZnNfc3VwZXItPnZzX21hZ2ljKS4KKyAqLworI2RlZmluZSBWWEZTX1NVUEVSX01BR0lDCTB4YTUwMUZDRjUKKworLyoKKyAqIFRoZSByb290IGlub2RlLgorICovCisjZGVmaW5lIFZYRlNfUk9PVF9JTk8JCTIKKworLyoKKyAqIE51bSBvZiBlbnRyaWVzIGluIGZyZWUgZXh0ZW50IGFycmF5CisgKi8KKyNkZWZpbmUgVlhGU19ORUZSRUUJCTMyCisKKworLyoKKyAqIFZ4RlMgc3VwZXJibG9jayAoZGlzaykuCisgKi8KK3N0cnVjdCB2eGZzX3NiIHsKKwkvKgorCSAqIFJlYWRvbmx5IGZpZWxkcyBmb3IgdGhlIHZlcnNpb24gMSBzdXBlcmJsb2NrLgorCSAqCisJICogTG90cyBvZiB0aGlzIGZpZWxkcyBhcmUgbm8gbW9yZSB1c2VkIGJ5IHZlcnNpb24gMgorCSAqIGFuZCBuZXZlciBmaWxlc3lzdGVtcy4KKwkgKi8KKwl1X2ludDMyX3QJdnNfbWFnaWM7CQkvKiBNYWdpYyBudW1iZXIgKi8KKwlpbnQzMl90CQl2c192ZXJzaW9uOwkJLyogVnhGUyB2ZXJzaW9uICovCisJdV9pbnQzMl90CXZzX2N0aW1lOwkJLyogY3JlYXRlIHRpbWUgLSBzZWNzICovCisJdV9pbnQzMl90CXZzX2N1dGltZTsJCS8qIGNyZWF0ZSB0aW1lIC0gdXNlY3MgKi8KKwlpbnQzMl90CQlfX3VudXNlZDE7CQkvKiB1bnVzZWQgKi8KKwlpbnQzMl90CQlfX3VudXNlZDI7CQkvKiB1bnVzZWQgKi8KKwl2eF9kYWRkcl90CXZzX29sZF9sb2dzdGFydDsJLyogb2Jzb2xldGUgKi8KKwl2eF9kYWRkcl90CXZzX29sZF9sb2dlbmQ7CQkvKiBvYnNvbGV0ZSAqLworCWludDMyX3QJCXZzX2JzaXplOwkJLyogYmxvY2sgc2l6ZSAqLworCWludDMyX3QJCXZzX3NpemU7CQkvKiBudW1iZXIgb2YgYmxvY2tzICovCisJaW50MzJfdAkJdnNfZHNpemU7CQkvKiBudW1iZXIgb2YgZGF0YSBibG9ja3MgKi8KKwl1X2ludDMyX3QJdnNfb2xkX25pbm9kZTsJCS8qIG9ic29sZXRlICovCisJaW50MzJfdAkJdnNfb2xkX25hdTsJCS8qIG9ic29sZXRlICovCisJaW50MzJfdAkJX191bnVzZWQzOwkJLyogdW51c2VkICovCisJaW50MzJfdAkJdnNfb2xkX2RlZmlleHRzaXplOwkvKiBvYnNvbGV0ZSAqLworCWludDMyX3QJCXZzX29sZF9pbGJzaXplOwkJLyogb2Jzb2xldGUgKi8KKwlpbnQzMl90CQl2c19pbW1lZGxlbjsJCS8qIHNpemUgb2YgaW1tZWRpYXRlIGRhdGEgYXJlYSAqLworCWludDMyX3QJCXZzX25kYWRkcjsJCS8qIG51bWJlciBvZiBkaXJlY3QgZXh0ZW50ZXMgKi8KKwl2eF9kYWRkcl90CXZzX2ZpcnN0YXU7CQkvKiBhZGRyZXNzIG9mIGZpcnN0IEFVICovCisJdnhfZGFkZHJfdAl2c19lbWFwOwkJLyogb2Zmc2V0IG9mIGV4dGVudCBtYXAgaW4gQVUgKi8KKwl2eF9kYWRkcl90CXZzX2ltYXA7CQkvKiBvZmZzZXQgb2YgaW5vZGUgbWFwIGluIEFVICovCisJdnhfZGFkZHJfdAl2c19pZXh0b3A7CQkvKiBvZmZzZXQgb2YgRXh0T3AuIG1hcCBpbiBBVSAqLworCXZ4X2RhZGRyX3QJdnNfaXN0YXJ0OwkJLyogb2Zmc2V0IG9mIGlub2RlIGxpc3QgaW4gQVUgKi8KKwl2eF9kYWRkcl90CXZzX2JzdGFydDsJCS8qIG9mZnNldCBvZiBmZGJsb2NrIGluIEFVICovCisJdnhfZGFkZHJfdAl2c19mZW1hcDsJCS8qIGF1Zmlyc3QgKyBlbWFwICovCisJdnhfZGFkZHJfdAl2c19maW1hcDsJCS8qIGF1Zmlyc3QgKyBpbWFwICovCisJdnhfZGFkZHJfdAl2c19maWV4dG9wOwkJLyogYXVmaXJzdCArIGlleHRvcCAqLworCXZ4X2RhZGRyX3QJdnNfZmlzdGFydDsJCS8qIGF1Zmlyc3QgKyBpc3RhcnQgKi8KKwl2eF9kYWRkcl90CXZzX2Zic3RhcnQ7CQkvKiBhdWZpcnN0ICsgYnN0YXJ0ICovCisJaW50MzJfdAkJdnNfbmluZGlyOwkJLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gaW5kaXIgKi8KKwlpbnQzMl90CQl2c19hdWxlbjsJCS8qIGxlbmd0aCBvZiBBVSBpbiBibG9ja3MgKi8KKwlpbnQzMl90CQl2c19hdWltbGVuOwkJLyogbGVuZ3RoIG9mIGltYXAgaW4gYmxvY2tzICovCisJaW50MzJfdAkJdnNfYXVlbWxlbjsJCS8qIGxlbmd0aCBvZiBlbWFwIGluIGJsb2NrcyAqLworCWludDMyX3QJCXZzX2F1aWxlbjsJCS8qIGxlbmd0aCBvZiBpbGlzdCBpbiBibG9ja3MgKi8KKwlpbnQzMl90CQl2c19hdXBhZDsJCS8qIGxlbmd0aCBvZiBwYWQgaW4gYmxvY2tzICovCisJaW50MzJfdAkJdnNfYXVibG9ja3M7CQkvKiBkYXRhIGJsb2NrcyBpbiBBVSAqLworCWludDMyX3QJCXZzX21heHRpZXI7CQkvKiBsb2cgYmFzZSAyIG9mIGF1YmxvY2tzICovCisJaW50MzJfdAkJdnNfaW5vcGI7CQkvKiBudW1iZXIgb2YgaW5vZGVzIHBlciBibGsgKi8KKwlpbnQzMl90CQl2c19vbGRfaW5vcGF1OwkJLyogb2Jzb2xldGUgKi8KKwlpbnQzMl90CQl2c19vbGRfaW5vcGlsYjsJCS8qIG9ic29sZXRlICovCisJaW50MzJfdAkJdnNfb2xkX25kaXJpcGF1OwkvKiBvYnNvbGV0ZSAqLworCWludDMyX3QJCXZzX2lhZGRybGVuOwkJLyogc2l6ZSBvZiBpbmRpcmVjdCBhZGRyIGV4dC4gKi8KKwlpbnQzMl90CQl2c19ic2hpZnQ7CQkvKiBsb2cgYmFzZSAyIG9mIGJzaXplICovCisJaW50MzJfdAkJdnNfaW5vc2hpZnQ7CQkvKiBsb2cgYmFzZSAyIG9mIGlub2JwICovCisJaW50MzJfdAkJdnNfYm1hc2s7CQkvKiB+KCBic2l6ZSAtIDEgKSAqLworCWludDMyX3QJCXZzX2JvZmZtYXNrOwkJLyogYnNpemUgLSAxICovCisJaW50MzJfdAkJdnNfb2xkX2lub21hc2s7CQkvKiBvbGRfaW5vcGlsYiAtIDEgKi8KKwlpbnQzMl90CQl2c19jaGVja3N1bTsJCS8qIGNoZWNrc3VtIG9mIFYxIGRhdGEgKi8KKwkKKwkvKgorCSAqIFZlcnNpb24gMSwgd3JpdGFibGUKKwkgKi8KKwlpbnQzMl90CQl2c19mcmVlOwkJLyogbnVtYmVyIG9mIGZyZWUgYmxvY2tzICovCisJaW50MzJfdAkJdnNfaWZyZWU7CQkvKiBudW1iZXIgb2YgZnJlZSBpbm9kZXMgKi8KKwlpbnQzMl90CQl2c19lZnJlZVtWWEZTX05FRlJFRV07CS8qIG51bWJlciBvZiBmcmVlIGV4dGVudHMgYnkgc2l6ZSAqLworCWludDMyX3QJCXZzX2ZsYWdzOwkJLyogZmxhZ3MgPyE/ICovCisJdV9pbnQ4X3QJdnNfbW9kOwkJCS8qIGZpbGVzeXN0ZW0gaGFzIGJlZW4gY2hhbmdlZCAqLworCXVfaW50OF90CXZzX2NsZWFuOwkJLyogY2xlYW4gRlMgKi8KKwl1X2ludDE2X3QJX191bnVzZWQ0OwkJLyogdW51c2VkICovCisJdV9pbnQzMl90CXZzX2ZpcnN0bG9naWQ7CQkvKiBtb3VudCB0aW1lIGxvZyBJRCAqLworCXVfaW50MzJfdAl2c193dGltZTsJCS8qIGxhc3QgdGltZSB3cml0dGVuIC0gc2VjICovCisJdV9pbnQzMl90CXZzX3d1dGltZTsJCS8qIGxhc3QgdGltZSB3cml0dGVuIC0gdXNlYyAqLworCXVfaW50OF90CXZzX2ZuYW1lWzZdOwkJLyogRlMgbmFtZSAqLworCXVfaW50OF90CXZzX2ZwYWNrWzZdOwkJLyogRlMgcGFjayBuYW1lICovCisJaW50MzJfdAkJdnNfbG9ndmVyc2lvbjsJCS8qIGxvZyBmb3JtYXQgdmVyc2lvbiAqLworCWludDMyX3QJCV9fdW51c2VkNTsJCS8qIHVudXNlZCAqLworCQorCS8qCisJICogVmVyc2lvbiAyLCBSZWFkLW9ubHkKKwkgKi8KKwl2eF9kYWRkcl90CXZzX29sdGV4dFsyXTsJCS8qIE9MVCBleHRlbnQgYW5kIHJlcGxpY2EgKi8KKwlpbnQzMl90CQl2c19vbHRzaXplOwkJLyogT0xUIGV4dGVudCBzaXplICovCisJaW50MzJfdAkJdnNfaWF1aW1sZW47CQkvKiBzaXplIG9mIGlub2RlIG1hcCAqLworCWludDMyX3QJCXZzX2lhdXNpemU7CQkvKiBzaXplIG9mIElBVSBpbiBibG9ja3MgKi8KKwlpbnQzMl90CQl2c19kaW5vc2l6ZTsJCS8qIHNpemUgb2YgaW5vZGUgaW4gYnl0ZXMgKi8KKwlpbnQzMl90CQl2c19vbGRfZG5pYWRkcjsJCS8qIGluZGlyIGxldmVscyBwZXIgaW5vZGUgKi8KKwlpbnQzMl90CQl2c19jaGVja3N1bTI7CQkvKiBjaGVja3N1bSBvZiBWMiBSTyAqLworCisJLyoKKwkgKiBBY3R1YWxseSBtdWNoIG1vcmUuLi4KKwkgKi8KK307CisKKworLyoKKyAqIEluIGNvcmUgc3VwZXJibG9jayBmaWxlc3lzdGVtIHByaXZhdGUgZGF0YSBmb3IgVnhGUy4KKyAqLworc3RydWN0IHZ4ZnNfc2JfaW5mbyB7CisJc3RydWN0IHZ4ZnNfc2IJCSp2c2lfcmF3OwkvKiByYXcgKG9uIGRpc2spIHN1cGVibG9jayAqLworCXN0cnVjdCBidWZmZXJfaGVhZAkqdnNpX2JwOwkvKiBidWZmZXIgZm9yIHJhdyBzdXBlcmJsb2NrKi8KKwlzdHJ1Y3QgaW5vZGUJCSp2c2lfZnNoaXA7CS8qIGZpbGVzZXQgaGVhZGVyIGlub2RlICovCisJc3RydWN0IGlub2RlCQkqdnNpX2lsaXN0OwkvKiBpbm9kZSBsaXN0IGlub2RlICovCisJc3RydWN0IGlub2RlCQkqdnNpX3N0aWxpc3Q7CS8qIHN0cnVjdHVhbCBpbm9kZSBsaXN0IGlub2RlICovCisJdV9sb25nCQkJdnNpX2lleHQ7CS8qIGluaXRpYWwgaW5vZGUgbGlzdCAqLworCWlub190CQkJdnNpX2ZzaGlubzsJLyogZmlsZXNldCBoZWFkZXIgaW5vZGUgKi8KKwlkYWRkcl90CQkJdnNpX29sdGV4dDsJLyogT0xUIGV4dGVudCAqLworCWRhZGRyX3QJCQl2c2lfb2x0c2l6ZTsJLyogT0xUIHNpemUgKi8KK307CisKKworLyoKKyAqIEZpbGUgbW9kZXMuICBGaWxlIHR5cGVzIGFib3ZlIDB4ZjAwMCBhcmUgdnhmcyBpbnRlcm5hbCBvbmx5LCB0aGV5IHNob3VsZAorICogbm90IGJlIHBhc3NlZCBiYWNrIHRvIGhpZ2hlciBsZXZlbHMgb2YgdGhlIHN5c3RlbS4gIHZ4ZnMgZmlsZSB0eXBlcyBtdXN0CisgKiBuZXZlciBoYXZlIG9uZSBvZiB0aGUgcmVndWxhciBmaWxlIHR5cGUgYml0cyBzZXQuCisgKi8KK2VudW0gdnhmc19tb2RlIHsKKwlWWEZTX0lTVUlEID0gMHgwMDAwMDgwMCwJLyogc2V0dWlkICovCisJVlhGU19JU0dJRCA9IDB4MDAwMDA0MDAsCS8qIHNldGdpZCAqLworCVZYRlNfSVNWVFggPSAweDAwMDAwMjAwLAkvKiBzdGlja3kgYml0ICovCisJVlhGU19JUkVBRCA9IDB4MDAwMDAxMDAsCS8qIHJlYWQgKi8KKwlWWEZTX0lXUklURSA9IDB4MDAwMDAwODAsCS8qIHdyaXRlICovCisJVlhGU19JRVhFQyA9IDB4MDAwMDAwNDAsCS8qIGV4ZWMgKi8KKworCVZYRlNfSUZJRk8gPSAweDAwMDAxMDAwLAkvKiBOYW1lZCBwaXBlICovCisJVlhGU19JRkNIUiA9IDB4MDAwMDIwMDAsCS8qIENoYXJhY3RlciBkZXZpY2UgKi8KKwlWWEZTX0lGRElSID0gMHgwMDAwNDAwMCwJLyogRGlyZWN0b3J5ICovCisJVlhGU19JRk5BTSA9IDB4MDAwMDUwMDAsCS8qIFhlbml4IGRldmljZSA/PyAqLworCVZYRlNfSUZCTEsgPSAweDAwMDA2MDAwLAkvKiBCbG9jayBkZXZpY2UgKi8KKwlWWEZTX0lGUkVHID0gMHgwMDAwODAwMCwJLyogUmVndWxhciBmaWxlICovCisJVlhGU19JRkNNUCA9IDB4MDAwMDkwMDAsCS8qIENvbXByZXNzZWQgZmlsZSA/IT8gKi8KKwlWWEZTX0lGTE5LID0gMHgwMDAwYTAwMCwJLyogU3ltbGluayAqLworCVZYRlNfSUZTT0MgPSAweDAwMDBjMDAwLAkvKiBTb2NrZXQgKi8KKworCS8qIFZ4RlMgaW50ZXJuYWwgKi8KKwlWWEZTX0lGRlNIID0gMHgxMDAwMDAwMCwJLyogRmlsZXNldCBoZWFkZXIgKi8KKwlWWEZTX0lGSUxUID0gMHgyMDAwMDAwMCwJLyogSW5vZGUgbGlzdCAqLworCVZYRlNfSUZJQVUgPSAweDMwMDAwMDAwLAkvKiBJbm9kZSBhbGxvY2F0aW9uIHVuaXQgKi8KKwlWWEZTX0lGQ1VUID0gMHg0MDAwMDAwMCwJLyogQ3VycmVudCB1c2FnZSB0YWJsZSAqLworCVZYRlNfSUZBVFQgPSAweDUwMDAwMDAwLAkvKiBBdHRyLiBpbm9kZSAqLworCVZYRlNfSUZMQ1QgPSAweDYwMDAwMDAwLAkvKiBMaW5rIGNvdW50IHRhYmxlICovCisJVlhGU19JRklBVCA9IDB4NzAwMDAwMDAsCS8qIEluZGlyZWN0IGF0dHJpYnV0ZSBmaWxlICovCisJVlhGU19JRkVNUiA9IDB4ODAwMDAwMDAsCS8qIEV4dGVudCBtYXAgcmVvcmcgZmlsZSAqLworCVZYRlNfSUZRVU8gPSAweDkwMDAwMDAwLAkvKiBCU0QgcXVvdGEgZmlsZSAqLworCVZYRlNfSUZQVEkgPSAweGEwMDAwMDAwLAkvKiAiUGFzcyB0aHJvdWdoIiBpbm9kZSAqLworCVZYRlNfSUZMQUIgPSAweDExMDAwMDAwLAkvKiBEZXZpY2UgbGFiZWwgZmlsZSAqLworCVZYRlNfSUZPTFQgPSAweDEyMDAwMDAwLAkvKiBPTFQgZmlsZSAqLworCVZYRlNfSUZMT0cgPSAweDEzMDAwMDAwLAkvKiBMb2cgZmlsZSAqLworCVZYRlNfSUZFTVAgPSAweDE0MDAwMDAwLAkvKiBFeHRlbnQgbWFwIGZpbGUgKi8KKwlWWEZTX0lGRUFVID0gMHgxNTAwMDAwMCwJLyogRXh0ZW50IEFVIGZpbGUgKi8KKwlWWEZTX0lGQVVTID0gMHgxNjAwMDAwMCwJLyogRXh0ZW50IEFVIHN1bW1hcnkgZmlsZSAqLworCVZYRlNfSUZERVYgPSAweDE3MDAwMDAwLAkvKiBEZXZpY2UgY29uZmlnIGZpbGUgKi8KKworfTsKKworI2RlZmluZQlWWEZTX1RZUEVfTUFTSwkJMHhmZmZmZjAwMAorCisjZGVmaW5lIFZYRlNfSVNfVFlQRShpcCx0eXBlKQkoKChpcCktPnZpaV9tb2RlICYgVlhGU19UWVBFX01BU0spID09ICh0eXBlKSkKKyNkZWZpbmUgVlhGU19JU0ZJRk8oeCkJCVZYRlNfSVNfVFlQRSgoeCksVlhGU19JRklGTykKKyNkZWZpbmUgVlhGU19JU0NIUih4KQkJVlhGU19JU19UWVBFKCh4KSxWWEZTX0lGQ0hSKQorI2RlZmluZSBWWEZTX0lTRElSKHgpCQlWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZESVIpCisjZGVmaW5lIFZYRlNfSVNOQU0oeCkJCVZYRlNfSVNfVFlQRSgoeCksVlhGU19JRk5BTSkKKyNkZWZpbmUgVlhGU19JU0JMSyh4KQkJVlhGU19JU19UWVBFKCh4KSxWWEZTX0lGQkxLKQorI2RlZmluZSBWWEZTX0lTTE5LKHgpCQlWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZMTkspCisjZGVmaW5lIFZYRlNfSVNSRUcoeCkJCVZYRlNfSVNfVFlQRSgoeCksVlhGU19JRlJFRykKKyNkZWZpbmUgVlhGU19JU0NNUCh4KQkJVlhGU19JU19UWVBFKCh4KSxWWEZTX0lGQ01QKQorI2RlZmluZSBWWEZTX0lTU09DKHgpCQlWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZTT0MpCisKKyNkZWZpbmUgVlhGU19JU0ZTSCh4KQkJVlhGU19JU19UWVBFKCh4KSxWWEZTX0lGRlNIKQorI2RlZmluZSBWWEZTX0lTSUxUKHgpCQlWWEZTX0lTX1RZUEUoKHgpLFZYRlNfSUZJTFQpCisKKy8qCisgKiBJbm1vZGUgb3JnYW5pc2F0aW9uIHR5cGVzLgorICovCitlbnVtIHsKKwlWWEZTX09SR19OT05FCT0gMCwJLyogSW5vZGUgaGFzICpubyogZm9ybWF0ID8hPyAqLworCVZYRlNfT1JHX0VYVDQJPSAxLAkvKiBFeHQ0ICovCisJVlhGU19PUkdfSU1NRUQJPSAyLAkvKiBBbGwgZGF0YSBzdG9yZWQgaW4gaW5vZGUgKi8KKwlWWEZTX09SR19UWVBFRAk9IDMsCS8qIFR5cGVkIGV4dGVudHMgKi8KK307CisKKyNkZWZpbmUgVlhGU19JU19PUkcoaXAsb3JnKQkoKGlwKS0+dmlpX29yZ3R5cGUgPT0gKG9yZykpCisjZGVmaW5lIFZYRlNfSVNOT05FKGlwKQkJVlhGU19JU19PUkcoKGlwKSwgVlhGU19PUkdfTk9ORSkKKyNkZWZpbmUgVlhGU19JU0VYVDQoaXApCQlWWEZTX0lTX09SRygoaXApLCBWWEZTX09SR19FWFQ0KQorI2RlZmluZSBWWEZTX0lTSU1NRUQoaXApCVZYRlNfSVNfT1JHKChpcCksIFZYRlNfT1JHX0lNTUVEKQorI2RlZmluZSBWWEZTX0lTVFlQRUQoaXApCVZYRlNfSVNfT1JHKChpcCksIFZYRlNfT1JHX1RZUEVEKQorCisKKy8qCisgKiBHZXQgZmlsZXN5c3RlbSBwcml2YXRlIGRhdGEgZnJvbSBWRlMgaW5vZGUuCisgKi8KKyNkZWZpbmUgVlhGU19JTk8oaXApIFwKKwkoKHN0cnVjdCB2eGZzX2lub2RlX2luZm8gKikoaXApLT51LmdlbmVyaWNfaXApCisKKy8qCisgKiBHZXQgZmlsZXN5c3RlbSBwcml2YXRlIGRhdGEgZnJvbSBWRlMgc3VwZXJibG9jay4KKyAqLworI2RlZmluZSBWWEZTX1NCSShzYnApIFwKKwkoKHN0cnVjdCB2eGZzX3NiX2luZm8gKikoc2JwKS0+c19mc19pbmZvKQorCisjZW5kaWYgLyogX1ZYRlNfU1VQRVJfSF8gKi8KZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfYm1hcC5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19ibWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM0YjU3ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfYm1hcC5jCkBAIC0wLDAgKzEsMjgwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKS4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gZmlsZXN5c3RlbSB0byBkaXNrIGJsb2NrIG1hcHBpbmcuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKKyNpbmNsdWRlICJ2eGZzLmgiCisjaW5jbHVkZSAidnhmc19pbm9kZS5oIgorCisKKyNpZmRlZiBESUFHTk9TVElDCitzdGF0aWMgdm9pZAordnhmc190eXBkdW1wKHN0cnVjdCB2eGZzX3R5cGVkICp0eXApCit7CisJcHJpbnRrKEtFUk5fREVCVUcgInR5cGU9JUx1ICIsIHR5cC0+dnRfaGRyID4+IFZYRlNfVFlQRURfVFlQRVNISUZUKTsKKwlwcmludGsoIm9mZnNldD0lTHggIiwgdHlwLT52dF9oZHIgJiBWWEZTX1RZUEVEX09GRlNFVE1BU0spOworCXByaW50aygiYmxvY2s9JXggIiwgdHlwLT52dF9ibG9jayk7CisJcHJpbnRrKCJzaXplPSV4XG4iLCB0eXAtPnZ0X3NpemUpOworfQorI2VuZGlmCisKKy8qKgorICogdnhmc19ibWFwX2V4dDQgLSBkbyBibWFwIGZvciBleHQ0IGV4dGVudHMKKyAqIEBpcDoJCXBvaW50ZXIgdG8gdGhlIGlub2RlIHdlIGRvIGJtYXAgZm9yCisgKiBAaWJsb2NrOglsb2dpY2FsIGJsb2NrLgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICB2eGZzX2JtYXBfZXh0NCBwZXJmb3JtcyB0aGUgYm1hcCBvcGVyYXRpb24gZm9yIGlub2RlcyB3aXRoCisgKiAgIGV4dDQtc3R5bGUgZXh0ZW50cyAod2hpY2ggYXJlIG11Y2ggbGlrZSB0aGUgdHJhZGl0aW9uYWwgVU5JWAorICogICBpbm9kZSBvcmdhbmlzYXRpb24pLgorICoKKyAqIFJldHVybnM6CisgKiAgIFRoZSBwaHlzaWNhbCBibG9jayBudW1iZXIgb24gc3VjY2VzcywgZWxzZSBaZXJvLgorICovCitzdGF0aWMgZGFkZHJfdAordnhmc19ibWFwX2V4dDQoc3RydWN0IGlub2RlICppcCwgbG9uZyBibikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaXAtPmlfc2I7CisJc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqdmlwID0gVlhGU19JTk8oaXApOworCXVuc2lnbmVkIGxvbmcgYnNpemUgPSBzYi0+c19ibG9ja3NpemU7CisJdTMyIGluZHNpemUgPSB2aXAtPnZpaV9leHQ0LnZlNF9pbmRzaXplOworCWludCBpOworCisJaWYgKGluZHNpemUgPiBzYi0+c19ibG9ja3NpemUpCisJCWdvdG8gZmFpbF9zaXplOworCisJZm9yIChpID0gMDsgaSA8IFZYRlNfTkRBRERSOyBpKyspIHsKKwkJc3RydWN0IGRpcmVjdCAqZCA9IHZpcC0+dmlpX2V4dDQudmU0X2RpcmVjdCArIGk7CisJCWlmIChibiA+PSAwICYmIGJuIDwgZC0+c2l6ZSkKKwkJCXJldHVybiAoYm4gKyBkLT5leHRlbnQpOworCQlibiAtPSBkLT5zaXplOworCX0KKworCWlmICgoYm4gLyAoaW5kc2l6ZSAqIGluZHNpemUgKiBic2l6ZSAvIDQpKSA9PSAwKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYnVmOworCQlkYWRkcl90CWJubzsKKwkJdTMyICppbmRpcjsKKworCQlidWYgPSBzYl9icmVhZChzYiwgdmlwLT52aWlfZXh0NC52ZTRfaW5kaXJbMF0pOworCQlpZiAoIWJ1ZiB8fCAhYnVmZmVyX21hcHBlZChidWYpKQorCQkJZ290byBmYWlsX2J1ZjsKKworCQlpbmRpciA9ICh1MzIgKilidWYtPmJfZGF0YTsKKwkJYm5vID0gaW5kaXJbKGJuL2luZHNpemUpICUgKGluZHNpemUqYm4pXSArIChibiVpbmRzaXplKTsKKworCQlicmVsc2UoYnVmKTsKKwkJcmV0dXJuIGJubzsKKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibm8gbWF0Y2hpbmcgaW5kaXI/Iik7CisKKwlyZXR1cm4gMDsKKworZmFpbF9zaXplOgorCXByaW50aygidnhmczogaW5kaXJlY3QgZXh0ZW50IHRvIGJpZyFcbiIpOworZmFpbF9idWY6CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdnhmc19ibWFwX2luZGlyIC0gcmVjdXJzaW9uIGZvciB2eGZzX2JtYXBfdHlwZWQKKyAqIEBpcDoJCXBvaW50ZXIgdG8gdGhlIGlub2RlIHdlIGRvIGJtYXAgZm9yCisgKiBAaW5kaXI6CWluZGlyZWN0IGJsb2NrIHdlIHN0YXJ0IHJlYWRpbmcgYXQKKyAqIEBzaXplOglzaXplIG9mIHRoZSB0eXBlZCBhcmVhIHRvIHNlYXJjaAorICogQGJsb2NrOglwYXJ0aWFsbHkgcmVzdWx0IGZyb20gZnVydGhlciBzZWFyY2hlcworICoKKyAqIERlc2NyaXB0aW9uOgorICogICB2eGZzX2JtYXBfaW5kaXIgcmVhZHMgYSAmc3RydWN0IHZ4ZnNfdHlwZWQgYXQgQGluZGlyCisgKiAgIGFuZCBwZXJmb3JtcyB0aGUgdHlwZS1kZWZpbmVkIGFjdGlvbi4KKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgIFRoZSBwaHlzaWNhbCBibG9jayBudW1iZXIgb24gc3VjY2VzcywgZWxzZSBaZXJvLgorICoKKyAqIE5vdGU6CisgKiAgIEtlcm5lbHN0YWNrIGlzIHJhcmUuICBVbnJlY3Vyc2U/CisgKi8KK3N0YXRpYyBkYWRkcl90Cit2eGZzX2JtYXBfaW5kaXIoc3RydWN0IGlub2RlICppcCwgbG9uZyBpbmRpciwgaW50IHNpemUsIGxvbmcgYmxvY2spCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkCQkqYnAgPSBOVUxMOworCWRhZGRyX3QJCQkJcGJsb2NrID0gMDsKKwlpbnQJCQkJaTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplICogVlhGU19UWVBFRF9QRVJfQkxPQ0soaXAtPmlfc2IpOyBpKyspIHsKKwkJc3RydWN0IHZ4ZnNfdHlwZWQJKnR5cDsKKwkJaW50NjRfdAkJCW9mZjsKKworCQlicCA9IHNiX2JyZWFkKGlwLT5pX3NiLAorCQkJCWluZGlyICsgKGkgLyBWWEZTX1RZUEVEX1BFUl9CTE9DSyhpcC0+aV9zYikpKTsKKwkJaWYgKCFidWZmZXJfbWFwcGVkKGJwKSkKKwkJCXJldHVybiAwOworCisJCXR5cCA9ICgoc3RydWN0IHZ4ZnNfdHlwZWQgKilicC0+Yl9kYXRhKSArCisJCQkoaSAlIFZYRlNfVFlQRURfUEVSX0JMT0NLKGlwLT5pX3NiKSk7CisJCW9mZiA9ICh0eXAtPnZ0X2hkciAmIFZYRlNfVFlQRURfT0ZGU0VUTUFTSyk7CisKKwkJaWYgKGJsb2NrIDwgb2ZmKSB7CisJCQlicmVsc2UoYnApOworCQkJY29udGludWU7CisJCX0KKworCQlzd2l0Y2ggKCh1X2ludDMyX3QpKHR5cC0+dnRfaGRyID4+IFZYRlNfVFlQRURfVFlQRVNISUZUKSkgeworCQljYXNlIFZYRlNfVFlQRURfSU5ESVJFQ1Q6CisJCQlwYmxvY2sgPSB2eGZzX2JtYXBfaW5kaXIoaXAsIHR5cC0+dnRfYmxvY2ssCisJCQkJCXR5cC0+dnRfc2l6ZSwgYmxvY2sgLSBvZmYpOworCQkJaWYgKHBibG9jayA9PSAtMikKKwkJCQlicmVhazsKKwkJCWdvdG8gb3V0OworCQljYXNlIFZYRlNfVFlQRURfREFUQToKKwkJCWlmICgoYmxvY2sgLSBvZmYpID49IHR5cC0+dnRfc2l6ZSkKKwkJCQlicmVhazsKKwkJCXBibG9jayA9ICh0eXAtPnZ0X2Jsb2NrICsgYmxvY2sgLSBvZmYpOworCQkJZ290byBvdXQ7CisJCWNhc2UgVlhGU19UWVBFRF9JTkRJUkVDVF9ERVY0OgorCQljYXNlIFZYRlNfVFlQRURfREFUQV9ERVY0OiB7CisJCQlzdHJ1Y3Qgdnhmc190eXBlZF9kZXY0CSp0eXA0ID0KKwkJCQkoc3RydWN0IHZ4ZnNfdHlwZWRfZGV2NCAqKXR5cDsKKworCQkJcHJpbnRrKEtFUk5fSU5GTyAiXG5cblRZUEVEX0RFVjQgZGV0ZWN0ZWQhXG4iKTsKKwkJCXByaW50ayhLRVJOX0lORk8gImJsb2NrOiAlTHVcdHNpemU6ICVMZFx0ZGV2OiAlZFxuIiwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSB0eXA0LT52ZDRfYmxvY2ssCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgdHlwNC0+dmQ0X3NpemUsCisJCQkgICAgICAgdHlwNC0+dmQ0X2Rldik7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJZGVmYXVsdDoKKwkJCUJVRygpOworCQl9CisJCWJyZWxzZShicCk7CisJfQorCitmYWlsOgorCXBibG9jayA9IDA7CitvdXQ6CisJYnJlbHNlKGJwKTsKKwlyZXR1cm4gKHBibG9jayk7Cit9CisKKy8qKgorICogdnhmc19ibWFwX3R5cGVkIC0gYm1hcCBmb3IgdHlwZWQgZXh0ZW50cworICogQGlwOgkJcG9pbnRlciB0byB0aGUgaW5vZGUgd2UgZG8gYm1hcCBmb3IKKyAqIEBpYmxvY2s6CWxvZ2ljYWwgYmxvY2sKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgUGVyZm9ybXMgdGhlIGJtYXAgb3BlcmF0aW9uIGZvciB0eXBlZCBleHRlbnRzLgorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgVGhlIHBoeXNpY2FsIGJsb2NrIG51bWJlciBvbiBzdWNjZXNzLCBlbHNlIFplcm8uCisgKi8KK3N0YXRpYyBkYWRkcl90Cit2eGZzX2JtYXBfdHlwZWQoc3RydWN0IGlub2RlICppcCwgbG9uZyBpYmxvY2spCit7CisJc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbwkJKnZpcCA9IFZYRlNfSU5PKGlwKTsKKwlkYWRkcl90CQkJCXBibG9jayA9IDA7CisJaW50CQkJCWk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVlhGU19OVFlQRUQ7IGkrKykgeworCQlzdHJ1Y3Qgdnhmc190eXBlZAkqdHlwID0gdmlwLT52aWlfb3JnLnR5cGVkICsgaTsKKwkJaW50NjRfdAkJCW9mZiA9ICh0eXAtPnZ0X2hkciAmIFZYRlNfVFlQRURfT0ZGU0VUTUFTSyk7CisKKyNpZmRlZiBESUFHTk9TVElDCisJCXZ4ZnNfdHlwZHVtcCh0eXApOworI2VuZGlmCisJCWlmIChpYmxvY2sgPCBvZmYpCisJCQljb250aW51ZTsKKwkJc3dpdGNoICgodV9pbnQzMl90KSh0eXAtPnZ0X2hkciA+PiBWWEZTX1RZUEVEX1RZUEVTSElGVCkpIHsKKwkJY2FzZSBWWEZTX1RZUEVEX0lORElSRUNUOgorCQkJcGJsb2NrID0gdnhmc19ibWFwX2luZGlyKGlwLCB0eXAtPnZ0X2Jsb2NrLAorCQkJCQl0eXAtPnZ0X3NpemUsIGlibG9jayAtIG9mZik7CisJCQlpZiAocGJsb2NrID09IC0yKQorCQkJCWJyZWFrOworCQkJcmV0dXJuIChwYmxvY2spOworCQljYXNlIFZYRlNfVFlQRURfREFUQToKKwkJCWlmICgoaWJsb2NrIC0gb2ZmKSA8IHR5cC0+dnRfc2l6ZSkKKwkJCQlyZXR1cm4gKHR5cC0+dnRfYmxvY2sgKyBpYmxvY2sgLSBvZmYpOworCQkJYnJlYWs7CisJCWNhc2UgVlhGU19UWVBFRF9JTkRJUkVDVF9ERVY0OgorCQljYXNlIFZYRlNfVFlQRURfREFUQV9ERVY0OiB7CisJCQlzdHJ1Y3Qgdnhmc190eXBlZF9kZXY0CSp0eXA0ID0KKwkJCQkoc3RydWN0IHZ4ZnNfdHlwZWRfZGV2NCAqKXR5cDsKKworCQkJcHJpbnRrKEtFUk5fSU5GTyAiXG5cblRZUEVEX0RFVjQgZGV0ZWN0ZWQhXG4iKTsKKwkJCXByaW50ayhLRVJOX0lORk8gImJsb2NrOiAlTHVcdHNpemU6ICVMZFx0ZGV2OiAlZFxuIiwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSB0eXA0LT52ZDRfYmxvY2ssCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgdHlwNC0+dmQ0X3NpemUsCisJCQkgICAgICAgdHlwNC0+dmQ0X2Rldik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlkZWZhdWx0OgorCQkJQlVHKCk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB2eGZzX2JtYXAxIC0gdnhmcy1pbnRlcm5hbCBibWFwIG9wZXJhdGlvbgorICogQGlwOgkJCXBvaW50ZXIgdG8gdGhlIGlub2RlIHdlIGRvIGJtYXAgZm9yCisgKiBAaWJsb2NrOgkJbG9naWNhbCBibG9jaworICoKKyAqIERlc2NyaXB0aW9uOgorICogICB2eGZzX2JtYXAxIHBlcmZvbXMgYSBsb2dpY2FsIHRvIHBoeXNpY2FsIGJsb2NrIG1hcHBpbmcKKyAqICAgZm9yIHZ4ZnMtaW50ZXJuYWwgcHVycG9zZXMuCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICBUaGUgcGh5c2ljYWwgYmxvY2sgbnVtYmVyIG9uIHN1Y2Nlc3MsIGVsc2UgWmVyby4KKyAqLworZGFkZHJfdAordnhmc19ibWFwMShzdHJ1Y3QgaW5vZGUgKmlwLCBsb25nIGlibG9jaykKK3sKKwlzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvCQkqdmlwID0gVlhGU19JTk8oaXApOworCisJaWYgKFZYRlNfSVNFWFQ0KHZpcCkpCisJCXJldHVybiB2eGZzX2JtYXBfZXh0NChpcCwgaWJsb2NrKTsKKwlpZiAoVlhGU19JU1RZUEVEKHZpcCkpCisJCXJldHVybiB2eGZzX2JtYXBfdHlwZWQoaXAsIGlibG9jayk7CisJaWYgKFZYRlNfSVNOT05FKHZpcCkpCisJCWdvdG8gdW5zdXBwOworCWlmIChWWEZTX0lTSU1NRUQodmlwKSkKKwkJZ290byB1bnN1cHA7CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICJ2eGZzOiBpbm9kZSAlbGQgaGFzIG5vIHZhbGlkIG9yZ3R5cGUgKCV4KVxuIiwKKwkJCWlwLT5pX2lubywgdmlwLT52aWlfb3JndHlwZSk7CisJQlVHKCk7CisKK3Vuc3VwcDoKKwlwcmludGsoS0VSTl9XQVJOSU5HICJ2eGZzOiBpbm9kZSAlbGQgaGFzIGFuIHVuc3VwcG9ydGVkIG9yZ3R5cGUgKCV4KVxuIiwKKwkJCWlwLT5pX2lubywgdmlwLT52aWlfb3JndHlwZSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2Rpci5oIGIvZnMvZnJlZXZ4ZnMvdnhmc19kaXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTRkZmVmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZnJlZXZ4ZnMvdnhmc19kaXIuaApAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKS4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqLworI2lmbmRlZiBfVlhGU19ESVJfSF8KKyNkZWZpbmUgX1ZYRlNfRElSX0hfCisKKy8qCisgKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gZGlyZWN0b3J5IHN0cnVjdHVyZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIHZ4ZnMgZGlyZWN0b3J5IGZvcm1hdC4KKyAqLworCisKKy8qCisgKiBWeEZTIGRpcmVjdG9yeSBibG9jayBoZWFkZXIuCisgKgorICogVGhpcyBlbnRyeSBpcyB0aGUgaGVhZCBvZiBldmVyeSBmaWxlc3lzdGVtIGJsb2NrIGluIGEgZGlyZWN0b3J5LgorICogSXQgaXMgdXNlZCBmb3IgZnJlZSBzcGFjZSBtYW5hZ21lbnQgYW5kIGFkZGl0aW9uYWxseSBpbmNsdWRlcworICogYSBoYXNoIGZvciBzcGVlZGluZyB1cCBkaXJlY3Rvcnkgc2VhcmNoIChsb29rdXApLgorICoKKyAqIFRoZSBoYXNoIG1heSBiZSBlbXB0eSBhbmQgaW4gZmFjdCB3ZSBkbyBub3QgdXNlIGl0IGFsbCBpbiB0aGUKKyAqIExpbnV4IGRyaXZlciBmb3Igbm93LgorICovCitzdHJ1Y3Qgdnhmc19kaXJibGsgeworCXVfaW50MTZfdAlkX2ZyZWU7CQkvKiBmcmVlIHNwYWNlIGluIGRpcmJsb2NrICovCisJdV9pbnQxNl90CWRfbmhhc2g7CS8qIG5vIG9mIGhhc2ggY2hhaW5zICovCisJdV9pbnQxNl90CWRfaGFzaFsxXTsJLyogaGFzaCBjaGFpbiAqLworfTsKKworLyoKKyAqIFZYRlNfTkFNRUxFTiBpcyB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIGRfbmFtZSBmaWVsZAorICoJb2YgYW4gVnhGUyBkaXJlY3RvcnkgZW50cnkuCisgKi8KKyNkZWZpbmUgVlhGU19OQU1FTEVOCTI1NgorCisvKgorICogVnhGUyBkaXJlY3RvcnkgZW50cnkuCisgKi8KK3N0cnVjdCB2eGZzX2RpcmVjdCB7CisJdnhfaW5vX3QJZF9pbm87CQkJLyogaW5vZGUgbnVtYmVyICovCisJdV9pbnQxNl90CWRfcmVjbGVuOwkJLyogcmVjb3JkIGxlbmd0aCAqLworCXVfaW50MTZfdAlkX25hbWVsZW47CQkvKiBkX25hbWUgbGVuZ3RoICovCisJdV9pbnQxNl90CWRfaGFzaG5leHQ7CQkvKiBuZXh0IGhhc2ggZW50cnkgKi8KKwljaGFyCQlkX25hbWVbVlhGU19OQU1FTEVOXTsJLyogbmFtZSAqLworfTsKKworLyoKKyAqIFZYRlNfRElSUEFEIGRlZmluZXMgdGhlIGRpcmVjdG9yeSBlbnRyeSBib3VuZGFyaWVzLCBpcyBfbXVzdF8gYmUKKyAqCWEgbXVsdGlwbGUgb2YgZm91ci4KKyAqIFZYRlNfTkFNRU1JTiBpcyB0aGUgbGVuZ3RoIG9mIGEgZGlyZWN0b3J5IGVudHJ5IHdpdGggYSBOVUxMIGRfbmFtZS4KKyAqIFZYRlNfRElSUk9VTkQgaXMgYW4gaW50ZXJuYWwgbWFjcm9zIHRoYXQgcm91bmRzIGEgbGVuZ3RoIHRvIGEgdmFsdWUKKyAqCXVzYWJsZSBmb3IgZGlyZWN0b3J5IHNpemVzLgorICogVlhGU19ESVJMRU4gY2FsY3VsYXRlcyB0aGUgZGlyZWN0b3J5IGVudHJ5IHNpemUgZm9yIGFuIGVudHJ5IHdpdGgKKyAqCWEgZF9uYW1lIHdpdGggc2l6ZSBsZW4uCisgKi8KKyNkZWZpbmUgVlhGU19ESVJQQUQJCTQKKyNkZWZpbmUgVlhGU19OQU1FTUlOCQkoKGludCkoKHN0cnVjdCB2eGZzX2RpcmVjdCAqKTApLT5kX25hbWUpCisjZGVmaW5lIFZYRlNfRElSUk9VTkQobGVuKQkoKFZYRlNfRElSUEFEICsgKGxlbikgLSAxKSAmIH4oVlhGU19ESVJQQUQgLTEpKQorI2RlZmluZSBWWEZTX0RJUkxFTihsZW4pCShWWEZTX0RJUlJPVU5EKFZYRlNfTkFNRU1JTiArIChsZW4pKSkKKworLyoKKyAqIFZYRlNfRElSQkxLT1YgaXMgdGhlIG92ZXJoZWFkIG9mIGEgc3BlY2lmaWMgZGlyYmxvY2suCisgKi8KKyNkZWZpbmUgVlhGU19ESVJCTEtPVihkYnApCSgoc2l6ZW9mKHNob3J0KSAqIGRicC0+ZF9uaGFzaCkgKyA0KQorCisjZW5kaWYgLyogX1ZYRlNfRElSX0hfICovCmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2V4dGVybi5oIGIvZnMvZnJlZXZ4ZnMvdnhmc19leHRlcm4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGJlOTE3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZnJlZXZ4ZnMvdnhmc19leHRlcm4uaApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKS4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqLworI2lmbmRlZiBfVlhGU19FWFRFUk5fSF8KKyNkZWZpbmUgX1ZYRlNfRVhURVJOX0hfCisKKy8qCisgKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gZXh0ZXJuYWwgcHJvdG90eXBlcy4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgcHJvdG90eXBlcyBmb3IgYWxsIHZ4ZnMgZnVuY3Rpb25zIHVzZWQKKyAqIG91dHNpZGUgdGhlaXIgcmVzcGVjdGl2ZSBzb3VyY2UgZmlsZXMuCisgKi8KKworCitzdHJ1Y3Qga21lbV9jYWNoZV9zOworc3RydWN0IHN1cGVyX2Jsb2NrOworc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbzsKK3N0cnVjdCBpbm9kZTsKKworCisvKiB2eGZzX2JtYXAuYyAqLworZXh0ZXJuIGRhZGRyX3QJCQl2eGZzX2JtYXAxKHN0cnVjdCBpbm9kZSAqLCBsb25nKTsKKworLyogdnhmc19mc2hlYWQuYyAqLworZXh0ZXJuIGludAkJCXZ4ZnNfcmVhZF9mc2hlYWQoc3RydWN0IHN1cGVyX2Jsb2NrICopOworCisvKiB2eGZzX2lub2RlLmMgKi8KK2V4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZV9zCSp2eGZzX2lub2RlX2NhY2hlcDsKK2V4dGVybiB2b2lkCQkJdnhmc19kdW1waShzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvICosIGlub190KTsKK2V4dGVybiBzdHJ1Y3QgaW5vZGUgKgkJdnhmc19nZXRfZmFrZV9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwKKwkJCQkJc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqKTsKK2V4dGVybiB2b2lkCQkJdnhmc19wdXRfZmFrZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqCXZ4ZnNfYmxraWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdV9sb25nLCBpbm9fdCk7CitleHRlcm4gc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqCXZ4ZnNfc3RpZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbm9fdCk7CitleHRlcm4gdm9pZAkJCXZ4ZnNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gdm9pZAkJCXZ4ZnNfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICopOworCisvKiB2eGZzX2xvb2t1cC5jICovCitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMJdnhmc19kaXJfaW5vZGVfb3BzOworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMJdnhmc19kaXJfb3BlcmF0aW9uczsKKworLyogdnhmc19vbHQuYyAqLworZXh0ZXJuIGludAkJCXZ4ZnNfcmVhZF9vbHQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHVfbG9uZyk7CisKKy8qIHZ4ZnNfc3Vici5jICovCitleHRlcm4gc3RydWN0IHBhZ2UgKgkJdnhmc19nZXRfcGFnZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqLCB1X2xvbmcpOworZXh0ZXJuIHZvaWQJCQl2eGZzX3B1dF9wYWdlKHN0cnVjdCBwYWdlICopOworZXh0ZXJuIHN0cnVjdCBidWZmZXJfaGVhZCAqCXZ4ZnNfYnJlYWQoc3RydWN0IGlub2RlICosIGludCk7CisKKyNlbmRpZiAvKiBfVlhGU19FWFRFUk5fSF8gKi8KZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfZnNoZWFkLmMgYi9mcy9mcmVldnhmcy92eGZzX2ZzaGVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YjE5ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9mcmVldnhmcy92eGZzX2ZzaGVhZC5jCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKS4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gZmlsZXNldCBoZWFkZXIgcm91dGluZXMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCisjaW5jbHVkZSAidnhmcy5oIgorI2luY2x1ZGUgInZ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ2eGZzX2V4dGVybi5oIgorI2luY2x1ZGUgInZ4ZnNfZnNoZWFkLmgiCisKKworI2lmZGVmIERJQUdOT1NUSUMKK3N0YXRpYyB2b2lkCit2eGZzX2R1bXBmc2goc3RydWN0IHZ4ZnNfZnNoICpmaHApCit7CisJcHJpbnRrKCJcblxuZHVtcGluZyBmaWxlc2V0IGhlYWRlcjpcbiIpOworCXByaW50aygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJcHJpbnRrKCJ2ZXJzaW9uOiAldVxuIiwgZmhwLT5mc2hfdmVyc2lvbik7CisJcHJpbnRrKCJmc2luZGV4OiAldVxuIiwgZmhwLT5mc2hfZnNpbmRleCk7CisJcHJpbnRrKCJpYXVpbm86ICV1XHRuaW5vZGVzOiV1XG4iLAorCQkJZmhwLT5mc2hfaWF1aW5vLCBmaHAtPmZzaF9uaW5vZGVzKTsKKwlwcmludGsoIm1heGlub2RlOiAldVx0bGN0aW5vOiAldVxuIiwKKwkJCWZocC0+ZnNoX21heGlub2RlLCBmaHAtPmZzaF9sY3Rpbm8pOworCXByaW50aygibmF1OiAldVxuIiwgZmhwLT5mc2hfbmF1KTsKKwlwcmludGsoImlsaXN0aW5vWzBdOiAldVx0aWxpc3Rpbm9bMV06ICV1XG4iLAorCQkJZmhwLT5mc2hfaWxpc3Rpbm9bMF0sIGZocC0+ZnNoX2lsaXN0aW5vWzFdKTsKK30KKyNlbmRpZgorCisvKioKKyAqIHZ4ZnNfZ2V0ZnNoIC0gcmVhZCBmaWxlc2V0IGhlYWRlciBpbnRvIG1lbW9yeQorICogQGlwOgkJdGhlIChmYWtlKSBmaWxlc2V0IGhlYWRlciBpbm9kZQorICogQHdoaWNoOgkwIGZvciB0aGUgc3RydWN0dXJhbCwgMSBmb3IgdGhlIHByaW1hcnkgZnNoLgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICB2eGZzX2dldGZzaCByZWFkcyBlaXRoZXIgdGhlIHN0cnVjdHVyYWwgb3IgcHJpbWFyeSBmaWxlc2V0IGhlYWRlcgorICogICBkZXNjcmliZWQgYnkgQGlwIGludG8gbWVtb3J5LgorICoKKyAqIFJldHVybnM6CisgKiAgIFRoZSBmaWxlc2V0IGhlYWRlciBzdHJ1Y3R1cmUgb24gc3VjY2VzcywgZWxzZSBaZXJvLgorICovCitzdGF0aWMgc3RydWN0IHZ4ZnNfZnNoICoKK3Z4ZnNfZ2V0ZnNoKHN0cnVjdCBpbm9kZSAqaXAsIGludCB3aGljaCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJCSpicDsKKworCWJwID0gdnhmc19icmVhZChpcCwgd2hpY2gpOworCWlmIChidWZmZXJfbWFwcGVkKGJwKSkgeworCQlzdHJ1Y3Qgdnhmc19mc2gJCSpmaHA7CisKKwkJaWYgKCEoZmhwID0ga21hbGxvYyhzaXplb2YoKmZocCksIFNMQUJfS0VSTkVMKSkpCisJCQlyZXR1cm4gTlVMTDsKKwkJbWVtY3B5KGZocCwgYnAtPmJfZGF0YSwgc2l6ZW9mKCpmaHApKTsKKworCQlicmVsc2UoYnApOworCQlyZXR1cm4gKGZocCk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogdnhmc19yZWFkX2ZzaGVhZCAtIHJlYWQgdGhlIGZpbGVzZXQgaGVhZGVycworICogQHNicDoJc3VwZXJibG9jayB0byB3aGljaCB0aGUgZmlsZXNldCBiZWxvbmdzCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIHZ4ZnNfcmVhZF9mc2hlYWQgd2lsbCBmaWxsIHRoZSBpbm9kZSBhbmQgc3RydWN0dXJhbCBpbm9kZSBsaXN0IGluIEBzYi4KKyAqCisgKiBSZXR1cm5zOgorICogICBaZXJvIG9uIHN1Y2Nlc3MsIGVsc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlICgtRUlOVkFMKS4KKyAqLworaW50Cit2eGZzX3JlYWRfZnNoZWFkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2JwKQoreworCXN0cnVjdCB2eGZzX3NiX2luZm8JCSppbmZwID0gVlhGU19TQkkoc2JwKTsKKwlzdHJ1Y3Qgdnhmc19mc2gJCQkqcGZwLCAqc2ZwOworCXN0cnVjdCB2eGZzX2lub2RlX2luZm8JCSp2aXAsICp0aXA7CisKKwl2aXAgPSB2eGZzX2Jsa2lnZXQoc2JwLCBpbmZwLT52c2lfaWV4dCwgaW5mcC0+dnNpX2ZzaGlubyk7CisJaWYgKCF2aXApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ2eGZzOiB1bmFibGVkIHRvIHJlYWQgZnNoIGlub2RlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICghVlhGU19JU0ZTSCh2aXApKSB7CisJCXByaW50ayhLRVJOX0VSUiAidnhmczogZnNoIGxpc3QgaW5vZGUgaXMgb2Ygd3JvbmcgdHlwZSAoJXgpXG4iLAorCQkJCXZpcC0+dmlpX21vZGUgJiBWWEZTX1RZUEVfTUFTSyk7IAorCQlnb3RvIG91dF9mcmVlX2ZzaGlwOworCX0KKworCisjaWZkZWYgRElBR05PU1RJQworCXByaW50aygidnhmczogZnNoIGlub2RlIGR1bXA6XG4iKTsKKwl2eGZzX2R1bXBpKHZpcCwgaW5mcC0+dnNpX2ZzaGlubyk7CisjZW5kaWYKKworCWluZnAtPnZzaV9mc2hpcCA9IHZ4ZnNfZ2V0X2Zha2VfaW5vZGUoc2JwLCB2aXApOworCWlmICghaW5mcC0+dnNpX2ZzaGlwKSB7CisJCXByaW50ayhLRVJOX0VSUiAidnhmczogdW5hYmxlZCB0byBnZXQgZnNoIGlub2RlXG4iKTsKKwkJZ290byBvdXRfZnJlZV9mc2hpcDsKKwl9CisKKwlzZnAgPSB2eGZzX2dldGZzaChpbmZwLT52c2lfZnNoaXAsIDApOworCWlmICghc2ZwKSB7CisJCXByaW50ayhLRVJOX0VSUiAidnhmczogdW5hYmxlZCB0byBnZXQgc3RydWN0dXJhbCBmc2hcbiIpOworCQlnb3RvIG91dF9pcHV0X2ZzaGlwOworCX0gCisKKyNpZmRlZiBESUFHTk9TVElDCisJdnhmc19kdW1wZnNoKHNmcCk7CisjZW5kaWYKKworCXBmcCA9IHZ4ZnNfZ2V0ZnNoKGluZnAtPnZzaV9mc2hpcCwgMSk7CisJaWYgKCFwZnApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ2eGZzOiB1bmFibGVkIHRvIGdldCBwcmltYXJ5IGZzaFxuIik7CisJCWdvdG8gb3V0X2ZyZWVfc2ZwOworCX0KKworI2lmZGVmIERJQUdOT1NUSUMKKwl2eGZzX2R1bXBmc2gocGZwKTsKKyNlbmRpZgorCisJdGlwID0gdnhmc19ibGtpZ2V0KHNicCwgaW5mcC0+dnNpX2lleHQsIHNmcC0+ZnNoX2lsaXN0aW5vWzBdKTsKKwlpZiAoIXRpcCkKKwkJZ290byBvdXRfZnJlZV9wZnA7CisKKwlpbmZwLT52c2lfc3RpbGlzdCA9IHZ4ZnNfZ2V0X2Zha2VfaW5vZGUoc2JwLCB0aXApOworCWlmICghaW5mcC0+dnNpX3N0aWxpc3QpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ2eGZzOiB1bmFibGVkIHRvIGdldCBzdHJ1Y3R1YWwgbGlzdCBpbm9kZVxuIik7CisJCWtmcmVlKHRpcCk7CisJCWdvdG8gb3V0X2ZyZWVfcGZwOworCX0KKwlpZiAoIVZYRlNfSVNJTFQoVlhGU19JTk8oaW5mcC0+dnNpX3N0aWxpc3QpKSkgeworCQlwcmludGsoS0VSTl9FUlIgInZ4ZnM6IHN0cnVjdHVhbCBsaXN0IGlub2RlIGlzIG9mIHdyb25nIHR5cGUgKCV4KVxuIiwKKwkJCQlWWEZTX0lOTyhpbmZwLT52c2lfc3RpbGlzdCktPnZpaV9tb2RlICYgVlhGU19UWVBFX01BU0spOyAKKwkJZ290byBvdXRfaXB1dF9zdGlsaXN0OworCX0KKworCXRpcCA9IHZ4ZnNfc3RpZ2V0KHNicCwgcGZwLT5mc2hfaWxpc3Rpbm9bMF0pOworCWlmICghdGlwKQorCQlnb3RvIG91dF9pcHV0X3N0aWxpc3Q7CisJaW5mcC0+dnNpX2lsaXN0ID0gdnhmc19nZXRfZmFrZV9pbm9kZShzYnAsIHRpcCk7CisJaWYgKCFpbmZwLT52c2lfaWxpc3QpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ2eGZzOiB1bmFibGVkIHRvIGdldCBpbm9kZSBsaXN0IGlub2RlXG4iKTsKKwkJa2ZyZWUodGlwKTsKKwkJZ290byBvdXRfaXB1dF9zdGlsaXN0OworCX0KKwlpZiAoIVZYRlNfSVNJTFQoVlhGU19JTk8oaW5mcC0+dnNpX2lsaXN0KSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ2eGZzOiBpbm9kZSBsaXN0IGlub2RlIGlzIG9mIHdyb25nIHR5cGUgKCV4KVxuIiwKKwkJCQlWWEZTX0lOTyhpbmZwLT52c2lfaWxpc3QpLT52aWlfbW9kZSAmIFZYRlNfVFlQRV9NQVNLKTsKKwkJZ290byBvdXRfaXB1dF9pbGlzdDsKKwl9CisKKwlyZXR1cm4gMDsKKworIG91dF9pcHV0X2lsaXN0OgorIAlpcHV0KGluZnAtPnZzaV9pbGlzdCk7Cisgb3V0X2lwdXRfc3RpbGlzdDoKKyAJaXB1dChpbmZwLT52c2lfc3RpbGlzdCk7Cisgb3V0X2ZyZWVfcGZwOgorCWtmcmVlKHBmcCk7Cisgb3V0X2ZyZWVfc2ZwOgorIAlrZnJlZShzZnApOworIG91dF9pcHV0X2ZzaGlwOgorCWlwdXQoaW5mcC0+dnNpX2ZzaGlwKTsKKwlyZXR1cm4gLUVJTlZBTDsKKyBvdXRfZnJlZV9mc2hpcDoKKyAJa2ZyZWUodmlwKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfZnNoZWFkLmggYi9mcy9mcmVldnhmcy92eGZzX2ZzaGVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZDBkNjQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9mcmVldnhmcy92eGZzX2ZzaGVhZC5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBDaHJpc3RvcGggSGVsbHdpZy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICovCisjaWZuZGVmIF9WWEZTX0ZTSEVBRF9IXworI2RlZmluZSBfVlhGU19GU0hFQURfSF8KKworLyoKKyAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBmaWxlc2V0IGhlYWRlciBzdHJ1Y3R1cmVzLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgcGh5c2ljYWwgc3RydWN0dXJlIG9mIHRoZSBWeEZTCisgKiBmaWxlc2V0IGhlYWRlci4KKyAqLworCisKKy8qCisgKiBGaWxlc2V0IGhlYWRlciAKKyAqLworc3RydWN0IHZ4ZnNfZnNoIHsKKwl1X2ludDMyX3QJZnNoX3ZlcnNpb247CQkvKiBmaWxlc2V0IGhlYWRlciB2ZXJzaW9uICovCisJdV9pbnQzMl90CWZzaF9mc2luZGV4OwkJLyogZmlsZXNldCBpbmRleCAqLworCXVfaW50MzJfdAlmc2hfdGltZTsJCS8qIG1vZGlmaWNhdGlvbiB0aW1lIC0gc2VjICovCisJdV9pbnQzMl90CWZzaF91dGltZTsJCS8qIG1vZGlmaWNhdGlvbiB0aW1lIC0gdXNlYyAqLworCXVfaW50MzJfdAlmc2hfZXh0b3A7CQkvKiBleHRvcCBmbGFncyAqLworCXZ4X2lub190CWZzaF9uaW5vZGVzOwkJLyogYWxsb2NhdGVkIGlub2RlcyAqLworCXVfaW50MzJfdAlmc2hfbmF1OwkJLyogbnVtYmVyIG9mIElBVXMgKi8KKwl1X2ludDMyX3QJZnNoX29sZF9pbGVzaXplOwkvKiBvbGQgc2l6ZSBvZiBpbGlzdCAqLworCXVfaW50MzJfdAlmc2hfZGZsYWdzOwkJLyogZmxhZ3MgKi8KKwl1X2ludDMyX3QJZnNoX3F1b3RhOwkJLyogcXVvdGEgbGltaXQgKi8KKwl2eF9pbm9fdAlmc2hfbWF4aW5vZGU7CQkvKiBtYXhpbXVtIGlub2RlIG51bWJlciAqLworCXZ4X2lub190CWZzaF9pYXVpbm87CQkvKiBJQVUgaW5vZGUgKi8KKwl2eF9pbm9fdAlmc2hfaWxpc3Rpbm9bMl07CS8qIGlsaXN0IGlub2RlcyAqLworCXZ4X2lub190CWZzaF9sY3Rpbm87CQkvKiBsaW5rIGNvdW50IHRhYmxlIGlub2RlICovCisKKwkvKgorCSAqIFNsaWdodGx5IG1vcmUgZmllbGRzIGZvbGxvdywgYnV0IHRoZXkKKwkgKiAgYSkgYXJlIG5vdCBvZiBhbnkgaW50ZXJlc3QgZm9yIHVzLCBhbmQKKwkgKiAgYikgZGlmZmVyIGEgbG90IGluIGRpZmZlcmVudCB2eGZzIHZlcnNpb25zL3BvcnRzCisJICovCit9OworCisjZW5kaWYgLyogX1ZYRlNfRlNIRUFEX0hfICovCmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2ltbWVkLmMgYi9mcy9mcmVldnhmcy92eGZzX2ltbWVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM2NzdhYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW1tZWQuYwpAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIHN1cHBvcnQgZm9yICdpbW1lZCcgaW5vZGVzLgorICovCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKworI2luY2x1ZGUgInZ4ZnMuaCIKKyNpbmNsdWRlICJ2eGZzX2lub2RlLmgiCisKKworc3RhdGljIGludAl2eGZzX2ltbWVkX2ZvbGxvd19saW5rKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IG5hbWVpZGF0YSAqKTsKKworc3RhdGljIGludAl2eGZzX2ltbWVkX3JlYWRwYWdlKHN0cnVjdCBmaWxlICosIHN0cnVjdCBwYWdlICopOworCisvKgorICogSW5vZGUgb3BlcmF0aW9ucyBmb3IgaW1tZWQgc3ltbGlua3MuCisgKgorICogVW5saWtlZCBhbGwgb3RoZXIgb3BlcmF0aW9ucyB3ZSBkbyBub3QgZ28gdGhyb3VnaCB0aGUgcGFnZWNhY2hlLAorICogYnV0IGRvIGFsbCB3b3JrIGRpcmVjdGx5IG9uIHRoZSBpbm9kZS4KKyAqLworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdnhmc19pbW1lZF9zeW1saW5rX2lvcHMgPSB7CisJLnJlYWRsaW5rID0JCWdlbmVyaWNfcmVhZGxpbmssCisJLmZvbGxvd19saW5rID0JCXZ4ZnNfaW1tZWRfZm9sbG93X2xpbmssCit9OworCisvKgorICogQWRyZXNzIHNwYWNlIG9wZXJhdGlvbnMgZm9yIGltbWVkIGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4KKyAqLworc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB2eGZzX2ltbWVkX2FvcHMgPSB7CisJLnJlYWRwYWdlID0JCXZ4ZnNfaW1tZWRfcmVhZHBhZ2UsCit9OworCisvKioKKyAqIHZ4ZnNfaW1tZWRfZm9sbG93X2xpbmsgLSBmb2xsb3cgaW1tZWQgc3ltbGluaworICogQGRwOgkJZGVudHJ5IGZvciB0aGUgbGluaworICogQG5wOgkJcGF0aG5hbWUgbG9va3VwIGRhdGEgZm9yIHRoZSBjdXJyZW50IHBhdGggd2FsaworICoKKyAqIERlc2NyaXB0aW9uOgorICogICB2eGZzX2ltbWVkX2ZvbGxvd19saW5rIHJlc3RhcnRzIHRoZSBwYXRobmFtZSBsb29rdXAgd2l0aAorICogICB0aGUgZGF0YSBvYnRhaW5lZCBmcm9tIEBkcC4KKyAqCisgKiBSZXR1cm5zOgorICogICBaZXJvIG9uIHN1Y2Nlc3MsIGVsc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW50Cit2eGZzX2ltbWVkX2ZvbGxvd19saW5rKHN0cnVjdCBkZW50cnkgKmRwLCBzdHJ1Y3QgbmFtZWlkYXRhICpucCkKK3sKKwlzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvCQkqdmlwID0gVlhGU19JTk8oZHAtPmRfaW5vZGUpOworCW5kX3NldF9saW5rKG5wLCB2aXAtPnZpaV9pbW1lZC52aV9pbW1lZCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdnhmc19pbW1lZF9yZWFkcGFnZSAtIHJlYWQgcGFydCBvZiBhbiBpbW1lZCBpbm9kZSBpbnRvIHBhZ2VjYWNoZQorICogQGZpbGU6CWZpbGUgY29udGV4dCAodW51c2VkKQorICogQHBhZ2U6CXBhZ2UgZnJhbWUgdG8gZmlsbCBpbi4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgdnhmc19pbW1lZF9yZWFkcGFnZSByZWFkcyBhIHBhcnQgb2YgdGhlIGltbWVkIGFyZWEgb2YgdGhlCisgKiAgIGZpbGUgdGhhdCBob3N0cyBAcHAgaW50byB0aGUgcGFnZWNhY2hlLgorICoKKyAqIFJldHVybnM6CisgKiAgIFplcm8gb24gc3VjY2VzcywgZWxzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKgorICogTG9ja2luZyBzdGF0dXM6CisgKiAgIEBwYWdlIGlzIGxvY2tlZCBhbmQgd2lsbCBiZSB1bmxvY2tlZC4KKyAqLworc3RhdGljIGludAordnhmc19pbW1lZF9yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZnAsIHN0cnVjdCBwYWdlICpwcCkKK3sKKwlzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvCSp2aXAgPSBWWEZTX0lOTyhwcC0+bWFwcGluZy0+aG9zdCk7CisJdV9pbnQ2NF90CQlvZmZzZXQgPSBwcC0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVDsKKwljYWRkcl90CQkJa2FkZHI7CisKKwlrYWRkciA9IGttYXAocHApOworCW1lbWNweShrYWRkciwgdmlwLT52aWlfaW1tZWQudmlfaW1tZWQgKyBvZmZzZXQsIFBBR0VfQ0FDSEVfU0laRSk7CisJa3VubWFwKHBwKTsKKwkKKwlmbHVzaF9kY2FjaGVfcGFnZShwcCk7CisJU2V0UGFnZVVwdG9kYXRlKHBwKTsKKyAgICAgICAgdW5sb2NrX3BhZ2UocHApOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2lub2RlLmMgYi9mcy9mcmVldnhmcy92eGZzX2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY3MmQyZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfaW5vZGUuYwpAQCAtMCwwICsxLDM1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIGlub2RlIHJvdXRpbmVzLgorICovCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJ2eGZzLmgiCisjaW5jbHVkZSAidnhmc19pbm9kZS5oIgorI2luY2x1ZGUgInZ4ZnNfZXh0ZXJuLmgiCisKKworZXh0ZXJuIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgdnhmc19hb3BzOworZXh0ZXJuIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgdnhmc19pbW1lZF9hb3BzOworCitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdnhmc19pbW1lZF9zeW1saW5rX2lvcHM7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZ4ZnNfZmlsZV9vcGVyYXRpb25zID0geworCS5vcGVuID0JCQlnZW5lcmljX2ZpbGVfb3BlbiwKKwkubGxzZWVrID0JCWdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlYWQgPQkJCWdlbmVyaWNfZmlsZV9yZWFkLAorCS5tbWFwID0JCQlnZW5lcmljX2ZpbGVfbW1hcCwKKwkuc2VuZGZpbGUgPQkJZ2VuZXJpY19maWxlX3NlbmRmaWxlLAorfTsKKworCitrbWVtX2NhY2hlX3QJCSp2eGZzX2lub2RlX2NhY2hlcDsKKworCisjaWZkZWYgRElBR05PU1RJQworLyoKKyAqIER1bXAgaW5vZGUgY29udGVudHMgKHBhcnRpYWxseSkuCisgKi8KK3ZvaWQKK3Z4ZnNfZHVtcGkoc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqdmlwLCBpbm9fdCBpbm8pCit7CisJcHJpbnRrKEtFUk5fREVCVUcgIlxuXG4iKTsKKwlpZiAoaW5vKQorCQlwcmludGsoS0VSTl9ERUJVRyAiZHVtcGluZyB2eGZzIGlub2RlICVsZFxuIiwgaW5vKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0RFQlVHICJkdW1waW5nIHVua25vd24gdnhmcyBpbm9kZVxuIik7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAibW9kZSBpcyAleFxuIiwgdmlwLT52aWlfbW9kZSk7CisJcHJpbnRrKEtFUk5fREVCVUcgIm5saW5rOiV1LCB1aWQ6JXUsIGdpZDoldVxuIiwKKwkJCXZpcC0+dmlpX25saW5rLCB2aXAtPnZpaV91aWQsIHZpcC0+dmlpX2dpZCk7CisJcHJpbnRrKEtFUk5fREVCVUcgInNpemU6JUx4LCBibG9ja3M6JXVcbiIsCisJCQl2aXAtPnZpaV9zaXplLCB2aXAtPnZpaV9ibG9ja3MpOworCXByaW50ayhLRVJOX0RFQlVHICJvcmd0eXBlOiV1XG4iLCB2aXAtPnZpaV9vcmd0eXBlKTsKK30KKyNlbmRpZgorCisKKy8qKgorICogdnhmc19ibGtpZ2V0IC0gZmluZCBpbm9kZSBiYXNlZCBvbiBleHRlbnQgIworICogQHNicDoJc3VwZXJibG9jayBvZiB0aGUgZmlsZXN5c3RlbSB3ZSBzZWFyY2ggaW4KKyAqIEBleHRlbnQ6CW51bWJlciBvZiB0aGUgZXh0ZW50IHRvIHNlYXJjaAorICogQGlubzoJaW5vZGUgbnVtYmVyIHRvIHNlYXJjaAorICoKKyAqIERlc2NyaXB0aW9uOgorICogIHZ4ZnNfYmxraWdldCBzZWFyY2hlcyBpbm9kZSBAaW5vIGluIHRoZSBmaWxlc3lzdGVtIGRlc2NyaWJlZCBieQorICogIEBzYnAgaW4gdGhlIGV4dGVudCBAZXh0ZW50LgorICogIFJldHVybnMgdGhlIG1hdGNoaW5nIFZ4RlMgaW5vZGUgb24gc3VjY2VzcywgZWxzZSBhIE5VTEwgcG9pbnRlci4KKyAqCisgKiBOT1RFOgorICogIFdoaWxlIF9fdnhmc19pZ2V0IHVzZXMgdGhlIHBhZ2VjYWNoZSB2eGZzX2Jsa2lnZXQgdXNlcyB0aGUKKyAqICBidWZmZXJjYWNoZS4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSB1c2VkIG91dHNpZGUgdGhlCisgKiAgcmVhZF9zdXBlcigpIG1ldGhvZCwgb3RoZXJ3aXNlIHRoZSBkYXRhIG1heSBiZSBpbmNvaGVyZW50LgorICovCitzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvICoKK3Z4ZnNfYmxraWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCwgdV9sb25nIGV4dGVudCwgaW5vX3QgaW5vKQoreworCXN0cnVjdCBidWZmZXJfaGVhZAkJKmJwOworCXVfbG9uZwkJCQlibG9jaywgb2Zmc2V0OworCisJYmxvY2sgPSBleHRlbnQgKyAoKGlubyAqIFZYRlNfSVNJWkUpIC8gc2JwLT5zX2Jsb2Nrc2l6ZSk7CisJb2Zmc2V0ID0gKChpbm8gJSAoc2JwLT5zX2Jsb2Nrc2l6ZSAvIFZYRlNfSVNJWkUpKSAqIFZYRlNfSVNJWkUpOworCWJwID0gc2JfYnJlYWQoc2JwLCBibG9jayk7CisKKwlpZiAoYnVmZmVyX21hcHBlZChicCkpIHsKKwkJc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbwkqdmlwOworCQlzdHJ1Y3Qgdnhmc19kaW5vZGUJKmRpcDsKKworCQlpZiAoISh2aXAgPSBrbWVtX2NhY2hlX2FsbG9jKHZ4ZnNfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCkpKQorCQkJZ290byBmYWlsOworCQlkaXAgPSAoc3RydWN0IHZ4ZnNfZGlub2RlICopKGJwLT5iX2RhdGEgKyBvZmZzZXQpOworCQltZW1jcHkodmlwLCBkaXAsIHNpemVvZigqdmlwKSk7CisjaWZkZWYgRElBR05PU1RJQworCQl2eGZzX2R1bXBpKHZpcCwgaW5vKTsKKyNlbmRpZgorCQlicmVsc2UoYnApOworCQlyZXR1cm4gKHZpcCk7CisJfQorCitmYWlsOgorCXByaW50ayhLRVJOX1dBUk5JTkcgInZ4ZnM6IHVuYWJsZSB0byByZWFkIGJsb2NrICVsZFxuIiwgYmxvY2spOworCWJyZWxzZShicCk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogX192eGZzX2lnZXQgLSBnZW5lcmljIGZpbmQgaW5vZGUgZmFjaWxpdHkKKyAqIEBzYnA6CQlWRlMgc3VwZXJibG9jaworICogQGlubzoJCWlub2RlIG51bWJlcgorICogQGlsaXN0cDoJCWlub2RlIGxpc3QKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICBTZWFyY2ggdGhlIGZvciBpbm9kZSBudW1iZXIgQGlubyBpbiB0aGUgZmlsZXN5c3RlbQorICogIGRlc2NyaWJlZCBieSBAc2JwLiAgVXNlIHRoZSBzcGVjaWZpZWQgaW5vZGUgdGFibGUgKEBpbGlzdHApLgorICogIFJldHVybnMgdGhlIG1hdGNoaW5nIFZ4RlMgaW5vZGUgb24gc3VjY2VzcywgZWxzZSBhIE5VTEwgcG9pbnRlci4KKyAqLworc3RhdGljIHN0cnVjdCB2eGZzX2lub2RlX2luZm8gKgorX192eGZzX2lnZXQoaW5vX3QgaW5vLCBzdHJ1Y3QgaW5vZGUgKmlsaXN0cCkKK3sKKwlzdHJ1Y3QgcGFnZQkJCSpwcDsKKwl1X2xvbmcJCQkJb2Zmc2V0OworCisJb2Zmc2V0ID0gKGlubyAlIChQQUdFX1NJWkUgLyBWWEZTX0lTSVpFKSkgKiBWWEZTX0lTSVpFOworCXBwID0gdnhmc19nZXRfcGFnZShpbGlzdHAtPmlfbWFwcGluZywgaW5vICogVlhGU19JU0laRSAvIFBBR0VfU0laRSk7CisKKwlpZiAoIUlTX0VSUihwcCkpIHsKKwkJc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbwkqdmlwOworCQlzdHJ1Y3Qgdnhmc19kaW5vZGUJKmRpcDsKKwkJY2FkZHJfdAkJCWthZGRyID0gKGNoYXIgKilwYWdlX2FkZHJlc3MocHApOworCisJCWlmICghKHZpcCA9IGttZW1fY2FjaGVfYWxsb2Modnhmc19pbm9kZV9jYWNoZXAsIFNMQUJfS0VSTkVMKSkpCisJCQlnb3RvIGZhaWw7CisJCWRpcCA9IChzdHJ1Y3Qgdnhmc19kaW5vZGUgKikoa2FkZHIgKyBvZmZzZXQpOworCQltZW1jcHkodmlwLCBkaXAsIHNpemVvZigqdmlwKSk7CisjaWZkZWYgRElBR05PU1RJQworCQl2eGZzX2R1bXBpKHZpcCwgaW5vKTsKKyNlbmRpZgorCQl2eGZzX3B1dF9wYWdlKHBwKTsKKwkJcmV0dXJuICh2aXApOworCX0KKworCXByaW50ayhLRVJOX1dBUk5JTkcgInZ4ZnM6IGVycm9yIG9uIHBhZ2UgJXBcbiIsIHBwKTsKKwlyZXR1cm4gTlVMTDsKKworZmFpbDoKKwlwcmludGsoS0VSTl9XQVJOSU5HICJ2eGZzOiB1bmFibGUgdG8gcmVhZCBpbm9kZSAlbGRcbiIsICh1bnNpZ25lZCBsb25nKWlubyk7CisJdnhmc19wdXRfcGFnZShwcCk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogdnhmc19zdGlnZXQgLSBmaW5kIGlub2RlIHVzaW5nIHRoZSBzdHJ1Y3R1cmFsIGlub2RlIGxpc3QKKyAqIEBzYnA6CVZGUyBzdXBlcmJsb2NrCisgKiBAaW5vOglpbm9kZSAjCisgKgorICogRGVzY3JpcHRpb246CisgKiAgRmluZCBpbm9kZSBAaW5vIGluIHRoZSBmaWxlc3lzdGVtIGRlc2NyaWJlZCBieSBAc2JwIHVzaW5nCisgKiAgdGhlIHN0cnVjdHVyYWwgaW5vZGUgbGlzdC4KKyAqICBSZXR1cm5zIHRoZSBtYXRjaGluZyBWeEZTIGlub2RlIG9uIHN1Y2Nlc3MsIGVsc2UgYSBOVUxMIHBvaW50ZXIuCisgKi8KK3N0cnVjdCB2eGZzX2lub2RlX2luZm8gKgordnhmc19zdGlnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIGlub190IGlubykKK3sKKyAgICAgICAgcmV0dXJuIF9fdnhmc19pZ2V0KGlubywgVlhGU19TQkkoc2JwKS0+dnNpX3N0aWxpc3QpOworfQorCisvKioKKyAqIHZ4ZnNfdHJhbnNtb2QgLSBtb2RlIGZvciBhIFZ4RlMgaW5vZGUKKyAqIEB2aXA6CVZ4RlMgaW5vZGUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICB2eGZzX3RyYW5zbW9kIHJldHVybnMgYSBMaW51eCBtb2RlX3QgZm9yIGEgZ2l2ZW4KKyAqICBWeEZTIGlub2RlIHN0cnVjdHVyZS4KKyAqLworc3RhdGljIF9faW5saW5lX18gbW9kZV90Cit2eGZzX3RyYW5zbW9kKHN0cnVjdCB2eGZzX2lub2RlX2luZm8gKnZpcCkKK3sKKwltb2RlX3QJCQlyZXQgPSB2aXAtPnZpaV9tb2RlICYgflZYRlNfVFlQRV9NQVNLOworCisJaWYgKFZYRlNfSVNGSUZPKHZpcCkpCisJCXJldCB8PSBTX0lGSUZPOworCWlmIChWWEZTX0lTQ0hSKHZpcCkpCisJCXJldCB8PSBTX0lGQ0hSOworCWlmIChWWEZTX0lTRElSKHZpcCkpCisJCXJldCB8PSBTX0lGRElSOworCWlmIChWWEZTX0lTQkxLKHZpcCkpCisJCXJldCB8PSBTX0lGQkxLOworCWlmIChWWEZTX0lTTE5LKHZpcCkpCisJCXJldCB8PSBTX0lGTE5LOworCWlmIChWWEZTX0lTUkVHKHZpcCkpCisJCXJldCB8PSBTX0lGUkVHOworCWlmIChWWEZTX0lTU09DKHZpcCkpCisJCXJldCB8PSBTX0lGU09DSzsKKworCXJldHVybiAocmV0KTsKK30KKworLyoqCisgKiB2eGZzX2lpbml0LSBoZWxwZXIgdG8gZmlsbCBpbm9kZSBmaWVsZHMKKyAqIEBpcDoJCVZGUyBpbm9kZQorICogQHZpcDoJVnhGUyBpbm9kZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogIHZ4ZnNfaW5zdGlubyBpcyBhIGhlbHBlciBmdW5jdGlvbiB0byBmaWxsIGluIGFsbCByZWxldmFudAorICogIGZpZWxkcyBpbiBAaXAgZnJvbSBAdmlwLgorICovCitzdGF0aWMgdm9pZAordnhmc19paW5pdChzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3Qgdnhmc19pbm9kZV9pbmZvICp2aXApCit7CisKKwlpcC0+aV9tb2RlID0gdnhmc190cmFuc21vZCh2aXApOworCWlwLT5pX3VpZCA9ICh1aWRfdCl2aXAtPnZpaV91aWQ7CisJaXAtPmlfZ2lkID0gKGdpZF90KXZpcC0+dmlpX2dpZDsKKworCWlwLT5pX25saW5rID0gdmlwLT52aWlfbmxpbms7CisJaXAtPmlfc2l6ZSA9IHZpcC0+dmlpX3NpemU7CisKKwlpcC0+aV9hdGltZS50dl9zZWMgPSB2aXAtPnZpaV9hdGltZTsKKwlpcC0+aV9jdGltZS50dl9zZWMgPSB2aXAtPnZpaV9jdGltZTsKKwlpcC0+aV9tdGltZS50dl9zZWMgPSB2aXAtPnZpaV9tdGltZTsKKwlpcC0+aV9hdGltZS50dl9uc2VjID0gMDsKKwlpcC0+aV9jdGltZS50dl9uc2VjID0gMDsKKwlpcC0+aV9tdGltZS50dl9uc2VjID0gMDsKKworCWlwLT5pX2Jsa3NpemUgPSBQQUdFX1NJWkU7CisJaXAtPmlfYmxvY2tzID0gdmlwLT52aWlfYmxvY2tzOworCWlwLT5pX2dlbmVyYXRpb24gPSB2aXAtPnZpaV9nZW47CisKKwlpcC0+dS5nZW5lcmljX2lwID0gKHZvaWQgKil2aXA7CisJCit9CisKKy8qKgorICogdnhmc19nZXRfZmFrZV9pbm9kZSAtIGdldCBmYWtlIGlub2RlIHN0cnVjdHVyZQorICogQHNicDoJCWZpbGVzeXN0ZW0gc3VwZXJibG9jaworICogQHZpcDoJCWZzcHJpdiBpbm9kZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogIHZ4ZnNfZmFrZV9pbm9kZSBnZXRzIGEgZmFrZSBpbm9kZSAobm90IGluIHRoZSBpbm9kZSBoYXNoKSBmb3IgYQorICogIHN1cGVyYmxvY2ssIHZ4ZnNfaW5vZGUgcGFpci4KKyAqICBSZXR1cm5zIHRoZSBmaWxsZWQgVkZTIGlub2RlLgorICovCitzdHJ1Y3QgaW5vZGUgKgordnhmc19nZXRfZmFrZV9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCwgc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyAqdmlwKQoreworCXN0cnVjdCBpbm9kZQkJCSppcCA9IE5VTEw7CisKKwlpZiAoKGlwID0gbmV3X2lub2RlKHNicCkpKSB7CisJCXZ4ZnNfaWluaXQoaXAsIHZpcCk7CisJCWlwLT5pX21hcHBpbmctPmFfb3BzID0gJnZ4ZnNfYW9wczsKKwl9CisJcmV0dXJuIChpcCk7Cit9CisKKy8qKgorICogdnhmc19wdXRfZmFrZV9pbm9kZSAtIGZyZWUgZmFrZWQgaW5vZGUKKyAqICppcDoJCQlWRlMgaW5vZGUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICB2eGZzX3B1dF9mYWtlX2lub2RlIGZyZWVzIGFsbCBkYXRhIGFzc3NvY2lhdGVkIHdpdGggQGlwLgorICovCit2b2lkCit2eGZzX3B1dF9mYWtlX2lub2RlKHN0cnVjdCBpbm9kZSAqaXApCit7CisJaXB1dChpcCk7Cit9CisKKy8qKgorICogdnhmc19yZWFkX2lub2RlIC0gZmlsbCBpbiBpbm9kZSBpbmZvcm1hdGlvbgorICogQGlwOgkJaW5vZGUgcG9pbnRlciB0byBmaWxsCisgKgorICogRGVzY3JpcHRpb246CisgKiAgdnhmc19yZWFkX2lub2RlIHJlYWRzIHRoZSBkaXNrIGlub2RlIGZvciBAaXAgYW5kIGZpbGxzCisgKiAgaW4gYWxsIHJlbGV2YW50IGZpZWxkcyBpbiBAaXAuCisgKi8KK3ZvaWQKK3Z4ZnNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlwKQoreworCXN0cnVjdCBzdXBlcl9ibG9jawkJKnNicCA9IGlwLT5pX3NiOworCXN0cnVjdCB2eGZzX2lub2RlX2luZm8JCSp2aXA7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucwkqYW9wczsKKwlpbm9fdAkJCQlpbm8gPSBpcC0+aV9pbm87CisKKwlpZiAoISh2aXAgPSBfX3Z4ZnNfaWdldChpbm8sIFZYRlNfU0JJKHNicCktPnZzaV9pbGlzdCkpKQorCQlyZXR1cm47CisKKwl2eGZzX2lpbml0KGlwLCB2aXApOworCisJaWYgKFZYRlNfSVNJTU1FRCh2aXApKQorCQlhb3BzID0gJnZ4ZnNfaW1tZWRfYW9wczsKKwllbHNlCisJCWFvcHMgPSAmdnhmc19hb3BzOworCisJaWYgKFNfSVNSRUcoaXAtPmlfbW9kZSkpIHsKKwkJaXAtPmlfZm9wID0gJnZ4ZnNfZmlsZV9vcGVyYXRpb25zOworCQlpcC0+aV9tYXBwaW5nLT5hX29wcyA9IGFvcHM7CisJfSBlbHNlIGlmIChTX0lTRElSKGlwLT5pX21vZGUpKSB7CisJCWlwLT5pX29wID0gJnZ4ZnNfZGlyX2lub2RlX29wczsKKwkJaXAtPmlfZm9wID0gJnZ4ZnNfZGlyX29wZXJhdGlvbnM7CisJCWlwLT5pX21hcHBpbmctPmFfb3BzID0gYW9wczsKKwl9IGVsc2UgaWYgKFNfSVNMTksoaXAtPmlfbW9kZSkpIHsKKwkJaWYgKCFWWEZTX0lTSU1NRUQodmlwKSkgeworCQkJaXAtPmlfb3AgPSAmcGFnZV9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJCQlpcC0+aV9tYXBwaW5nLT5hX29wcyA9ICZ2eGZzX2FvcHM7CisJCX0gZWxzZQorCQkJaXAtPmlfb3AgPSAmdnhmc19pbW1lZF9zeW1saW5rX2lvcHM7CisJfSBlbHNlCisJCWluaXRfc3BlY2lhbF9pbm9kZShpcCwgaXAtPmlfbW9kZSwgb2xkX2RlY29kZV9kZXYodmlwLT52aWlfcmRldikpOworCisJcmV0dXJuOworfQorCisvKioKKyAqIHZ4ZnNfY2xlYXJfaW5vZGUgLSByZW1vdmUgaW5vZGUgZnJvbSBtYWluIG1lbW9yeQorICogQGlwOgkJaW5vZGUgdG8gZGlzY2FyZC4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICB2eGZzX2NsZWFyX2lub2RlKCkgaXMgY2FsbGVkIG9uIHRoZSBmaW5hbCBpcHV0IGFuZCBmcmVlcyB0aGUgcHJpdmF0ZQorICogIGlub2RlIGFyZWEuCisgKi8KK3ZvaWQKK3Z4ZnNfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICppcCkKK3sKKwlrbWVtX2NhY2hlX2ZyZWUodnhmc19pbm9kZV9jYWNoZXAsIGlwLT51LmdlbmVyaWNfaXApOworfQpkaWZmIC0tZ2l0IGEvZnMvZnJlZXZ4ZnMvdnhmc19pbm9kZS5oIGIvZnMvZnJlZXZ4ZnMvdnhmc19pbm9kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MGFlYjEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9mcmVldnhmcy92eGZzX2lub2RlLmgKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBDaHJpc3RvcGggSGVsbHdpZy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciwKKyAqICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgorICogMi4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICovCisjaWZuZGVmIF9WWEZTX0lOT0RFX0hfCisjZGVmaW5lIF9WWEZTX0lOT0RFX0hfCisKKy8qCisgKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gaW5vZGUgc3RydWN0dXJlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgZGlzayBhbmQgY29yZQorICogaW5vZGVzIG9mIHRoZSBWZXJpdGFzIEZpbGVzeXN0ZW0uCisgKi8KKworCisjZGVmaW5lIFZYRlNfSVNJWkUJCTB4MTAwCQkvKiBJbm9kZSBzaXplICovCisKKyNkZWZpbmUgVlhGU19OREFERFIJCTEwCQkvKiBOdW1iZXIgb2YgZGlyZWN0IGFkZHJzIGluIGlub2RlICovCisjZGVmaW5lIFZYRlNfTklBRERSCQkyCQkvKiBOdW1iZXIgb2YgaW5kaXJlY3QgYWRkcnMgaW4gaW5vZGUgKi8KKyNkZWZpbmUgVlhGU19OSU1NRUQJCTk2CQkvKiBTaXplIG9mIGltbWVkaWF0ZSBkYXRhIGluIGlub2RlICovCisjZGVmaW5lIFZYRlNfTlRZUEVECQk2CQkvKiBOdW0gb2YgdHlwZWQgZXh0ZW50cyAqLworCisjZGVmaW5lIFZYRlNfVFlQRURfT0ZGU0VUTUFTSwkoMHgwMEZGRkZGRkZGRkZGRkZGVUxMKQorI2RlZmluZSBWWEZTX1RZUEVEX1RZUEVNQVNLCSgweEZGMDAwMDAwMDAwMDAwMDBVTEwpCisjZGVmaW5lIFZYRlNfVFlQRURfVFlQRVNISUZUCTU2CisKKyNkZWZpbmUgVlhGU19UWVBFRF9QRVJfQkxPQ0soc2JwKSBcCisJKChzYnApLT5zX2Jsb2Nrc2l6ZSAvIHNpemVvZihzdHJ1Y3Qgdnhmc190eXBlZCkpCisKKy8qCisgKiBQb3NzaWJsZSBleHRlbnQgZGVzY3JpcHRvciB0eXBlcyBmb3IgJVZYRlNfT1JHX1RZUEVEIGV4dGVudHMuCisgKi8KK2VudW0geworCVZYRlNfVFlQRURfSU5ESVJFQ1QJCT0gMSwKKwlWWEZTX1RZUEVEX0RBVEEJCQk9IDIsCisJVlhGU19UWVBFRF9JTkRJUkVDVF9ERVY0CT0gMywKKwlWWEZTX1RZUEVEX0RBVEFfREVWNAkJPSA0LAorfTsKKworLyoKKyAqIERhdGEgc3RvcmVkIGltbWVkaWF0ZWx5IGluIHRoZSBpbm9kZS4KKyAqLworc3RydWN0IHZ4ZnNfaW1tZWQgeworCXVfaW50OF90CXZpX2ltbWVkW1ZYRlNfTklNTUVEXTsKK307CisKK3N0cnVjdCB2eGZzX2V4dDQgeworCXVfaW50MzJfdAkJdmU0X3NwYXJlOwkJLyogPz8gKi8KKwl1X2ludDMyX3QJCXZlNF9pbmRzaXplOwkJLyogSW5kaXJlY3QgZXh0ZW50IHNpemUgKi8KKwl2eF9kYWRkcl90CQl2ZTRfaW5kaXJbVlhGU19OSUFERFJdOwkvKiBJbmRpcmVjdCBleHRlbnRzICovCisJc3RydWN0IGRpcmVjdCB7CQkJCQkvKiBEaXJlY3QgZXh0ZW50cyAqLworCQl2eF9kYWRkcl90CWV4dGVudDsJCQkvKiBFeHRlbnQgbnVtYmVyICovCisJCWludDMyX3QJCXNpemU7CQkJLyogU2l6ZSBvZiBleHRlbnQgKi8KKwl9IHZlNF9kaXJlY3RbVlhGU19OREFERFJdOworfTsKKworc3RydWN0IHZ4ZnNfdHlwZWQgeworCXVfaW50NjRfdAl2dF9oZHI7CQkvKiBIZWFkZXIsIDB4VFRPT09PT09PT09PT09PTzsgVD10eXBlLE89b2ZmcyAqLworCXZ4X2RhZGRyX3QJdnRfYmxvY2s7CS8qIEV4dGVudCBibG9jayAqLworCWludDMyX3QJCXZ0X3NpemU7CS8qIFNpemUgaW4gYmxvY2tzICovCit9OworCitzdHJ1Y3Qgdnhmc190eXBlZF9kZXY0IHsKKwl1X2ludDY0X3QJdmQ0X2hkcjsJLyogSGVhZGVyLCAweFRUT09PT09PT09PT09PT087IFQ9dHlwZSxPPW9mZnMgKi8KKwl1X2ludDY0X3QJdmQ0X2Jsb2NrOwkvKiBFeHRlbnQgYmxvY2sgKi8KKwl1X2ludDY0X3QJdmQ0X3NpemU7CS8qIFNpemUgaW4gYmxvY2tzICovCisJaW50MzJfdAkJdmQ0X2RldjsJLyogRGV2aWNlIElEICovCisJdV9pbnQzMl90CV9fcGFkMTsKK307CisKKy8qCisgKiBUaGUgaW5vZGUgYXMgY29udGFpbmVkIG9uIHRoZSBwaHlzaWNhbCBkZXZpY2UuCisgKi8KK3N0cnVjdCB2eGZzX2Rpbm9kZSB7CisJaW50MzJfdAkJdmRpX21vZGU7CisJdV9pbnQzMl90CXZkaV9ubGluazsJLyogTGluayBjb3VudCAqLworCXVfaW50MzJfdAl2ZGlfdWlkOwkvKiBVSUQgKi8KKwl1X2ludDMyX3QJdmRpX2dpZDsJLyogR0lEICovCisJdV9pbnQ2NF90CXZkaV9zaXplOwkvKiBJbm9kZSBzaXplIGluIGJ5dGVzICovCisJdV9pbnQzMl90CXZkaV9hdGltZTsJLyogTGFzdCB0aW1lIGFjY2Vzc2VkIC0gc2VjICovCisJdV9pbnQzMl90CXZkaV9hdXRpbWU7CS8qIExhc3QgdGltZSBhY2Nlc3NlZCAtIHVzZWMgKi8KKwl1X2ludDMyX3QJdmRpX210aW1lOwkvKiBMYXN0IG1vZGlmeSB0aW1lIC0gc2VjICovCisJdV9pbnQzMl90CXZkaV9tdXRpbWU7CS8qIExhc3QgbW9kaWZ5IHRpbWUgLSB1c2VjICovCisJdV9pbnQzMl90CXZkaV9jdGltZTsJLyogQ3JlYXRlIHRpbWUgLSBzZWMgKi8KKwl1X2ludDMyX3QJdmRpX2N1dGltZTsJLyogQ3JlYXRlIHRpbWUgLSB1c2VjICovCisJdV9pbnQ4X3QJdmRpX2FmbGFnczsJLyogQWxsb2NhdGlvbiBmbGFncyAqLworCXVfaW50OF90CXZkaV9vcmd0eXBlOwkvKiBPcmdhbmlzYXRpb24gdHlwZSAqLworCXVfaW50MTZfdAl2ZGlfZW9wZmxhZ3M7CisJdV9pbnQzMl90CXZkaV9lb3BkYXRhOworCXVuaW9uIHsKKwkJdV9pbnQzMl90CQlyZGV2OworCQl1X2ludDMyX3QJCWRvdGRvdDsKKwkJc3RydWN0IHsKKwkJCXVfaW50MzJfdAlyZXNlcnZlZDsKKwkJCXVfaW50MzJfdAlmaXhleHRzaXplOworCQl9IGlfcmVndWxhcjsKKwkJc3RydWN0IHsKKwkJCXVfaW50MzJfdAltYXRjaGlubzsKKwkJCXVfaW50MzJfdAlmc2V0aW5kZXg7CisJCX0gaV92eHNwZWM7CisJCXVfaW50NjRfdAkJYWxpZ247CisJfSB2ZGlfZnRhcmVhOworCXVfaW50MzJfdAl2ZGlfYmxvY2tzOwkvKiBIb3cgbXVjaCBibG9ja3MgZG9lcyBpbm9kZSBvY2N1cHkgKi8KKwl1X2ludDMyX3QJdmRpX2dlbjsJLyogSW5vZGUgZ2VuZXJhdGlvbiAqLworCXVfaW50NjRfdAl2ZGlfdmVyc2lvbjsJLyogVmVyc2lvbiAqLworCXVuaW9uIHsKKwkJc3RydWN0IHZ4ZnNfaW1tZWQJaW1tZWQ7CisJCXN0cnVjdCB2eGZzX2V4dDQJZXh0NDsKKwkJc3RydWN0IHZ4ZnNfdHlwZWQJdHlwZWRbVlhGU19OVFlQRURdOworCX0gdmRpX29yZzsKKwl1X2ludDMyX3QJdmRpX2lhdHRyaW5vOworfTsKKworI2RlZmluZSB2ZGlfcmRldgl2ZGlfZnRhcmVhLnJkZXYKKyNkZWZpbmUgdmRpX2RvdGRvdAl2ZGlfZnRhcmVhLmRvdGRvdAorI2RlZmluZSB2ZGlfZml4ZXh0c2l6ZQl2ZGlfZnRhcmVhLnJlZ3VsYXIuZml4ZXh0c2l6ZQorI2RlZmluZSB2ZGlfbWF0Y2hpbm8JdmRpX2Z0YXJlYS52eHNwZWMubWF0Y2hpbm8KKyNkZWZpbmUgdmRpX2ZzZXRpbmRleAl2ZGlfZnRhcmVhLnZ4c3BlYy5mc2V0aW5kZXgKKworI2RlZmluZSB2ZGlfaW1tZWQJdmRpX29yZy5pbW1lZAorI2RlZmluZSB2ZGlfZXh0NAl2ZGlfb3JnLmV4dDQKKyNkZWZpbmUgdmRpX3R5cGVkCXZkaV9vcmcudHlwZWQKKworCisvKgorICogVGhlIGlub2RlIGFzIHJlcHJlc2VudGVkIGluIHRoZSBtYWluIG1lbW9yeS4KKyAqCisgKiBUQkQ6IFRoaXMgc2hvdWxkIGJlY29tZSBhIHNlcGFyYXRlIHN0cnVjdHVyZS4uLgorICovCisjZGVmaW5lIHZ4ZnNfaW5vZGVfaW5mbwl2eGZzX2Rpbm9kZQorCisjZGVmaW5lIHZpaV9tb2RlCXZkaV9tb2RlCisjZGVmaW5lIHZpaV91aWQJCXZkaV91aWQKKyNkZWZpbmUgdmlpX2dpZAkJdmRpX2dpZAorI2RlZmluZSB2aWlfbmxpbmsJdmRpX25saW5rCisjZGVmaW5lIHZpaV9zaXplCXZkaV9zaXplCisjZGVmaW5lIHZpaV9hdGltZQl2ZGlfYXRpbWUKKyNkZWZpbmUgdmlpX2N0aW1lCXZkaV9jdGltZQorI2RlZmluZSB2aWlfbXRpbWUJdmRpX210aW1lCisjZGVmaW5lIHZpaV9ibG9ja3MJdmRpX2Jsb2NrcworI2RlZmluZSB2aWlfb3JnCQl2ZGlfb3JnCisjZGVmaW5lIHZpaV9vcmd0eXBlCXZkaV9vcmd0eXBlCisjZGVmaW5lIHZpaV9nZW4JCXZkaV9nZW4KKworI2RlZmluZSB2aWlfcmRldgl2ZGlfZnRhcmVhLnJkZXYKKyNkZWZpbmUgdmlpX2RvdGRvdAl2ZGlfZnRhcmVhLmRvdGRvdAorI2RlZmluZSB2aWlfZml4ZXh0c2l6ZQl2ZGlfZnRhcmVhLnJlZ3VsYXIuZml4ZXh0c2l6ZQorI2RlZmluZSB2aWlfbWF0Y2hpbm8JdmRpX2Z0YXJlYS52eHNwZWMubWF0Y2hpbm8KKyNkZWZpbmUgdmlpX2ZzZXRpbmRleAl2ZGlfZnRhcmVhLnZ4c3BlYy5mc2V0aW5kZXgKKworI2RlZmluZSB2aWlfaW1tZWQJdmRpX29yZy5pbW1lZAorI2RlZmluZSB2aWlfZXh0NAl2ZGlfb3JnLmV4dDQKKyNkZWZpbmUgdmlpX3R5cGVkCXZkaV9vcmcudHlwZWQKKworI2VuZGlmIC8qIF9WWEZTX0lOT0RFX0hfICovCmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2tjb21wYXQuaCBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfa2NvbXBhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MmE0Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9mcmVldnhmcy92eGZzX2tjb21wYXQuaApAQCAtMCwwICsxLDQ5IEBACisjaWZuZGVmIF9WWEZTX0tDT01QQVRfSAorI2RlZmluZSBfVlhGU19LQ09NUEFUX0gKKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2lmIChMSU5VWF9WRVJTSU9OX0NPREUgPCBLRVJORUxfVkVSU0lPTigyLDUsMCkpCisKKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKwordHlwZWRlZiBsb25nIHNlY3Rvcl90OworCisvKiBGcm9tIGluY2x1ZGUvbGludXgvZnMuaCAoTGludXggMi41LjItcHJlMykgICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBidWZmZXJfaGVhZCAqIHNiX2JyZWFkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBibG9jaykKK3sKKwlyZXR1cm4gYnJlYWQoc2ItPnNfZGV2LCBibG9jaywgc2ItPnNfYmxvY2tzaXplKTsKK30KKworLyogRGl0by4gICovCitzdGF0aWMgaW5saW5lIHZvaWQgbWFwX2JoKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBibG9jaykKK3sKKwliaC0+Yl9zdGF0ZSB8PSAxIDw8IEJIX01hcHBlZDsKKwliaC0+Yl9kZXYgPSBzYi0+c19kZXY7CisJYmgtPmJfYmxvY2tuciA9IGJsb2NrOworfQorCisvKiBGcm9tIGZzL2Jsb2NrX2Rldi5jIChMaW51eCAyLjUuMi1wcmUyKSAgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNiX3NldF9ibG9ja3NpemUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHNpemUpCit7CisJaW50IGJpdHM7CisJaWYgKHNldF9ibG9ja3NpemUoc2ItPnNfZGV2LCBzaXplKSA8IDApCisJCXJldHVybiAwOworCXNiLT5zX2Jsb2Nrc2l6ZSA9IHNpemU7CisJZm9yIChiaXRzID0gOSwgc2l6ZSA+Pj0gOTsgc2l6ZSA+Pj0gMTsgYml0cysrKQorCQk7CisJc2ItPnNfYmxvY2tzaXplX2JpdHMgPSBiaXRzOworCXJldHVybiBzYi0+c19ibG9ja3NpemU7Cit9CisKKy8qIERpdG8uICAqLworc3RhdGljIGlubGluZSBpbnQgc2JfbWluX2Jsb2Nrc2l6ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgc2l6ZSkKK3sKKwlpbnQgbWluc2l6ZSA9IGdldF9oYXJkc2VjdF9zaXplKHNiLT5zX2Rldik7CisJaWYgKHNpemUgPCBtaW5zaXplKQorCQlzaXplID0gbWluc2l6ZTsKKwlyZXR1cm4gc2Jfc2V0X2Jsb2Nrc2l6ZShzYiwgc2l6ZSk7Cit9CisKKyNlbmRpZiAvKiBLZXJuZWwgMi40ICovCisjZW5kaWYgLyogX1ZYRlNfS0NPTVBBVF9IICovCmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX2xvb2t1cC5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19sb29rdXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDZhZTI1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvZnJlZXZ4ZnMvdnhmc19sb29rdXAuYwpAQCAtMCwwICsxLDMyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKgorICogVmVyaXRhcyBmaWxlc3lzdGVtIGRyaXZlciAtIGxvb2t1cCBhbmQgb3RoZXIgZGlyZWN0b3J5IHJlbGF0ZWQgY29kZS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCisjaW5jbHVkZSAidnhmcy5oIgorI2luY2x1ZGUgInZ4ZnNfZGlyLmgiCisjaW5jbHVkZSAidnhmc19pbm9kZS5oIgorI2luY2x1ZGUgInZ4ZnNfZXh0ZXJuLmgiCisKKy8qCisgKiBOdW1iZXIgb2YgVnhGUyBibG9ja3MgcGVyIHBhZ2UuCisgKi8KKyNkZWZpbmUgVlhGU19CTE9DS19QRVJfUEFHRShzYnApICAoKFBBR0VfQ0FDSEVfU0laRSAvIChzYnApLT5zX2Jsb2Nrc2l6ZSkpCisKKworc3RhdGljIHN0cnVjdCBkZW50cnkgKgl2eGZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgbmFtZWlkYXRhICopOworc3RhdGljIGludAkJdnhmc19yZWFkZGlyKHN0cnVjdCBmaWxlICosIHZvaWQgKiwgZmlsbGRpcl90KTsKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdnhmc19kaXJfaW5vZGVfb3BzID0geworCS5sb29rdXAgPQkJdnhmc19sb29rdXAsCit9OworCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZ4ZnNfZGlyX29wZXJhdGlvbnMgPSB7CisJLnJlYWRkaXIgPQkJdnhmc19yZWFkZGlyLAorfTsKKworIAorc3RhdGljIF9faW5saW5lX18gdV9sb25nCitkaXJfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gKGlub2RlLT5pX3NpemUgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOworfQorIAorc3RhdGljIF9faW5saW5lX18gdV9sb25nCitkaXJfYmxvY2tzKHN0cnVjdCBpbm9kZSAqaXApCit7CisJdV9sb25nCQkJYnNpemUgPSBpcC0+aV9zYi0+c19ibG9ja3NpemU7CisJcmV0dXJuIChpcC0+aV9zaXplICsgYnNpemUgLSAxKSAmIH4oYnNpemUgLSAxKTsKK30KKworLyoKKyAqIE5PVEUhIHVubGlrZSBzdHJuY21wLCB2eGZzX21hdGNoIHJldHVybnMgMSBmb3Igc3VjY2VzcywgMCBmb3IgZmFpbHVyZS4KKyAqCisgKiBsZW4gPD0gVlhGU19OQU1FTEVOIGFuZCBkZSAhPSBOVUxMIGFyZSBndWFyYW50ZWVkIGJ5IGNhbGxlci4KKyAqLworc3RhdGljIF9faW5saW5lX18gaW50Cit2eGZzX21hdGNoKGludCBsZW4sIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lLCBzdHJ1Y3Qgdnhmc19kaXJlY3QgKmRlKQoreworCWlmIChsZW4gIT0gZGUtPmRfbmFtZWxlbikKKwkJcmV0dXJuIDA7CisJaWYgKCFkZS0+ZF9pbm8pCisJCXJldHVybiAwOworCXJldHVybiAhbWVtY21wKG5hbWUsIGRlLT5kX25hbWUsIGxlbik7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHN0cnVjdCB2eGZzX2RpcmVjdCAqCit2eGZzX25leHRfZW50cnkoc3RydWN0IHZ4ZnNfZGlyZWN0ICpkZSkKK3sKKwlyZXR1cm4gKChzdHJ1Y3Qgdnhmc19kaXJlY3QgKikoKGNoYXIqKWRlICsgZGUtPmRfcmVjbGVuKSk7Cit9CisKKy8qKgorICogdnhmc19maW5kX2VudHJ5IC0gZmluZCBhIG1hdGhpbmcgZGlyZWN0b3J5IGVudHJ5IGZvciBhIGRlbnRyeQorICogQGlwOgkJZGlyZWN0b3J5IGlub2RlCisgKiBAZHA6CQlkZW50cnkgZm9yIHdoaWNoIHdlIHdhbnQgdG8gZmluZCBhIGRpcmVjdAorICogQHBwcDoJZ2V0cyBmaWxsZWQgd2l0aCB0aGUgcGFnZSB0aGUgcmV0dXJuIHZhbHVlIHNpdHMgaW4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgdnhmc19maW5kX2VudHJ5IGZpbmRzIGEgJnN0cnVjdCB2eGZzX2RpcmVjdCBmb3IgdGhlIFZGUyBkaXJlY3RvcnkKKyAqICAgY2FjaGUgZW50cnkgQGRwLiAgQHBwcCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBwYWdlIHRoZSByZXR1cm4KKyAqICAgdmFsdWUgcmVzaWRlcyBpbi4KKyAqCisgKiBSZXR1cm5zOgorICogICBUaGUgd2FudGVkIGRpcmVjdCBvbiBzdWNjZXNzLCBlbHNlIGEgTlVMTCBwb2ludGVyLgorICovCitzdGF0aWMgc3RydWN0IHZ4ZnNfZGlyZWN0ICoKK3Z4ZnNfZmluZF9lbnRyeShzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZGVudHJ5ICpkcCwgc3RydWN0IHBhZ2UgKipwcHApCit7CisJdV9sb25nCQkJCW5wYWdlcywgcGFnZSwgbmJsb2NrcywgcGJsb2NrcywgYmxvY2s7CisJdV9sb25nCQkJCWJzaXplID0gaXAtPmlfc2ItPnNfYmxvY2tzaXplOworCWNvbnN0IGNoYXIJCQkqbmFtZSA9IGRwLT5kX25hbWUubmFtZTsKKwlpbnQJCQkJbmFtZWxlbiA9IGRwLT5kX25hbWUubGVuOworCisJbnBhZ2VzID0gZGlyX3BhZ2VzKGlwKTsKKwluYmxvY2tzID0gZGlyX2Jsb2NrcyhpcCk7CisJcGJsb2NrcyA9IFZYRlNfQkxPQ0tfUEVSX1BBR0UoaXAtPmlfc2IpOworCQorCWZvciAocGFnZSA9IDA7IHBhZ2UgPCBucGFnZXM7IHBhZ2UrKykgeworCQljYWRkcl90CQkJa2FkZHI7CisJCXN0cnVjdCBwYWdlCQkqcHA7CisKKwkJcHAgPSB2eGZzX2dldF9wYWdlKGlwLT5pX21hcHBpbmcsIHBhZ2UpOworCQlpZiAoSVNfRVJSKHBwKSkKKwkJCWNvbnRpbnVlOworCQlrYWRkciA9IChjYWRkcl90KXBhZ2VfYWRkcmVzcyhwcCk7CisKKwkJZm9yIChibG9jayA9IDA7IGJsb2NrIDw9IG5ibG9ja3MgJiYgYmxvY2sgPD0gcGJsb2NrczsgYmxvY2srKykgeworCQkJY2FkZHJfdAkJCWJhZGRyLCBsaW1pdDsKKwkJCXN0cnVjdCB2eGZzX2RpcmJsawkqZGJwOworCQkJc3RydWN0IHZ4ZnNfZGlyZWN0CSpkZTsKKworCQkJYmFkZHIgPSBrYWRkciArIChibG9jayAqIGJzaXplKTsKKwkJCWxpbWl0ID0gYmFkZHIgKyBic2l6ZSAtIFZYRlNfRElSTEVOKDEpOworCQkJCisJCQlkYnAgPSAoc3RydWN0IHZ4ZnNfZGlyYmxrICopYmFkZHI7CisJCQlkZSA9IChzdHJ1Y3Qgdnhmc19kaXJlY3QgKikoYmFkZHIgKyBWWEZTX0RJUkJMS09WKGRicCkpOworCisJCQlmb3IgKDsgKGNhZGRyX3QpZGUgPD0gbGltaXQ7IGRlID0gdnhmc19uZXh0X2VudHJ5KGRlKSkgeworCQkJCWlmICghZGUtPmRfcmVjbGVuKQorCQkJCQlicmVhazsKKwkJCQlpZiAoIWRlLT5kX2lubykKKwkJCQkJY29udGludWU7CisJCQkJaWYgKHZ4ZnNfbWF0Y2gobmFtZWxlbiwgbmFtZSwgZGUpKSB7CisJCQkJCSpwcHAgPSBwcDsKKwkJCQkJcmV0dXJuIChkZSk7CisJCQkJfQorCQkJfQorCQl9CisJCXZ4ZnNfcHV0X3BhZ2UocHApOworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIHZ4ZnNfaW5vZGVfYnlfbmFtZSAtIGZpbmQgaW5vZGUgbnVtYmVyIGZvciBkZW50cnkKKyAqIEBkaXA6CWRpcmVjdG9yeSB0byBzZWFyY2ggaW4KKyAqIEBkcDoJCWRlbnRyeSB3ZSBzZWFjaCBmb3IKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgdnhmc19pbm9kZV9ieV9uYW1lIGZpbmRzIG91dCB0aGUgaW5vZGUgbnVtYmVyIG9mCisgKiAgIHRoZSBwYXRoIGNvbXBvbmVudCBkZXNjcmliZWQgYnkgQGRwIGluIEBkaXAuCisgKgorICogUmV0dXJuczoKKyAqICAgVGhlIHdhbnRlZCBpbm9kZSBudW1iZXIgb24gc3VjY2VzcywgZWxzZSBaZXJvLgorICovCitzdGF0aWMgaW5vX3QKK3Z4ZnNfaW5vZGVfYnlfbmFtZShzdHJ1Y3QgaW5vZGUgKmRpcCwgc3RydWN0IGRlbnRyeSAqZHApCit7CisJc3RydWN0IHZ4ZnNfZGlyZWN0CQkqZGU7CisJc3RydWN0IHBhZ2UJCQkqcHA7CisJaW5vX3QJCQkJaW5vID0gMDsKKworCWRlID0gdnhmc19maW5kX2VudHJ5KGRpcCwgZHAsICZwcCk7CisJaWYgKGRlKSB7CisJCWlubyA9IGRlLT5kX2lubzsKKwkJa3VubWFwKHBwKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBwKTsKKwl9CisJCisJcmV0dXJuIChpbm8pOworfQorCisvKioKKyAqIHZ4ZnNfbG9va3VwIC0gbG9va3VwIHBhdGhuYW1lIGNvbXBvbmVudAorICogQGRpcDoJZGlyIGluIHdoaWNoIHdlIGxvb2t1cAorICogQGRwOgkJZGVudHJ5IHdlIGxvb2t1cAorICogQG5kOgkJbG9va3VwIG5hbWVpZGF0YQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICB2eGZzX2xvb2t1cCB0cmllcyB0byBsb29rdXAgdGhlIHBhdGhuYW1lIGNvbXBvbmVudCBkZXNjcmliZWQKKyAqICAgYnkgQGRwIGluIEBkaXAuCisgKgorICogUmV0dXJuczoKKyAqICAgQSBOVUxMLXBvaW50ZXIgb24gc3VjY2VzcywgZWxzZSBhbiBuZWdhdGl2ZSBlcnJvciBjb2RlIGVuY29kZWQKKyAqICAgaW4gdGhlIHJldHVybiBwb2ludGVyLgorICovCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqCit2eGZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpcCwgc3RydWN0IGRlbnRyeSAqZHAsIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZQkJKmlwID0gTlVMTDsKKwlpbm9fdAkJCWlubzsKKwkJCSAKKwlpZiAoZHAtPmRfbmFtZS5sZW4gPiBWWEZTX05BTUVMRU4pCisJCXJldHVybiBFUlJfUFRSKC1FTkFNRVRPT0xPTkcpOworCQkJCSAKKwlsb2NrX2tlcm5lbCgpOworCWlubyA9IHZ4ZnNfaW5vZGVfYnlfbmFtZShkaXAsIGRwKTsKKwlpZiAoaW5vKSB7CisJCWlwID0gaWdldChkaXAtPmlfc2IsIGlubyk7CisJCWlmICghaXApIHsKKwkJCXVubG9ja19rZXJuZWwoKTsKKwkJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworCQl9CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlkX2FkZChkcCwgaXApOworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIHZ4ZnNfcmVhZGRpciAtIHJlYWQgYSBkaXJlY3RvcnkKKyAqIEBmcDoJCXRoZSBkaXJlY3RvcnkgdG8gcmVhZAorICogQHJldHA6CXJldHVybiBidWZmZXIKKyAqIEBmaWxsZXI6CWZpbGxkaXIgY2FsbGJhY2sKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgdnhmc19yZWFkZGlyIGZpbGxzIEByZXRwIHdpdGggZGlyZWN0b3J5IGVudHJpZXMgZnJvbSBAZnAKKyAqICAgdXNpbmcgdGhlIFZGUyBzdXBwbGllZCBjYWxsYmFjayBAZmlsbGVyLgorICoKKyAqIFJldHVybnM6CisgKiAgIFplcm8uCisgKi8KK3N0YXRpYyBpbnQKK3Z4ZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZnAsIHZvaWQgKnJldHAsIGZpbGxkaXJfdCBmaWxsZXIpCit7CisJc3RydWN0IGlub2RlCQkqaXAgPSBmcC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHN1cGVyX2Jsb2NrCSpzYnAgPSBpcC0+aV9zYjsKKwl1X2xvbmcJCQlic2l6ZSA9IHNicC0+c19ibG9ja3NpemU7CisJdV9sb25nCQkJcGFnZSwgbnBhZ2VzLCBibG9jaywgcGJsb2NrcywgbmJsb2Nrcywgb2Zmc2V0OworCWxvZmZfdAkJCXBvczsKKworCXN3aXRjaCAoKGxvbmcpZnAtPmZfcG9zKSB7CisJY2FzZSAwOgorCQlpZiAoZmlsbGVyKHJldHAsICIuIiwgMSwgZnAtPmZfcG9zLCBpcC0+aV9pbm8sIERUX0RJUikgPCAwKQorCQkJZ290byBvdXQ7CisJCWZwLT5mX3BvcysrOworCQkvKiBmYWxsdGhyb3VnaCAqLworCWNhc2UgMToKKwkJaWYgKGZpbGxlcihyZXRwLCAiLi4iLCAyLCBmcC0+Zl9wb3MsIFZYRlNfSU5PKGlwKS0+dmlpX2RvdGRvdCwgRFRfRElSKSA8IDApCisJCQlnb3RvIG91dDsKKwkJZnAtPmZfcG9zKys7CisJCS8qIGZhbGx0aHJvdWdoICovCisJfQorCisJcG9zID0gZnAtPmZfcG9zIC0gMjsKKwkKKwlpZiAocG9zID4gVlhGU19ESVJST1VORChpcC0+aV9zaXplKSkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAwOworCX0KKworCW5wYWdlcyA9IGRpcl9wYWdlcyhpcCk7CisJbmJsb2NrcyA9IGRpcl9ibG9ja3MoaXApOworCXBibG9ja3MgPSBWWEZTX0JMT0NLX1BFUl9QQUdFKHNicCk7CisKKwlwYWdlID0gcG9zID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJb2Zmc2V0ID0gcG9zICYgflBBR0VfQ0FDSEVfTUFTSzsKKwlibG9jayA9ICh1X2xvbmcpKHBvcyA+PiBzYnAtPnNfYmxvY2tzaXplX2JpdHMpICUgcGJsb2NrczsKKworCWZvciAoOyBwYWdlIDwgbnBhZ2VzOyBwYWdlKyssIGJsb2NrID0gMCkgeworCQljYWRkcl90CQkJa2FkZHI7CisJCXN0cnVjdCBwYWdlCQkqcHA7CisKKwkJcHAgPSB2eGZzX2dldF9wYWdlKGlwLT5pX21hcHBpbmcsIHBhZ2UpOworCQlpZiAoSVNfRVJSKHBwKSkKKwkJCWNvbnRpbnVlOworCQlrYWRkciA9IChjYWRkcl90KXBhZ2VfYWRkcmVzcyhwcCk7CisKKwkJZm9yICg7IGJsb2NrIDw9IG5ibG9ja3MgJiYgYmxvY2sgPD0gcGJsb2NrczsgYmxvY2srKykgeworCQkJY2FkZHJfdAkJCWJhZGRyLCBsaW1pdDsKKwkJCXN0cnVjdCB2eGZzX2RpcmJsawkqZGJwOworCQkJc3RydWN0IHZ4ZnNfZGlyZWN0CSpkZTsKKworCQkJYmFkZHIgPSBrYWRkciArIChibG9jayAqIGJzaXplKTsKKwkJCWxpbWl0ID0gYmFkZHIgKyBic2l6ZSAtIFZYRlNfRElSTEVOKDEpOworCQorCQkJZGJwID0gKHN0cnVjdCB2eGZzX2RpcmJsayAqKWJhZGRyOworCQkJZGUgPSAoc3RydWN0IHZ4ZnNfZGlyZWN0ICopCisJCQkJKG9mZnNldCA/CisJCQkJIChrYWRkciArIG9mZnNldCkgOgorCQkJCSAoYmFkZHIgKyBWWEZTX0RJUkJMS09WKGRicCkpKTsKKworCQkJZm9yICg7IChjYWRkcl90KWRlIDw9IGxpbWl0OyBkZSA9IHZ4ZnNfbmV4dF9lbnRyeShkZSkpIHsKKwkJCQlpbnQJb3ZlcjsKKworCQkJCWlmICghZGUtPmRfcmVjbGVuKQorCQkJCQlicmVhazsKKwkJCQlpZiAoIWRlLT5kX2lubykKKwkJCQkJY29udGludWU7CisKKwkJCQlvZmZzZXQgPSAoY2FkZHJfdClkZSAtIGthZGRyOworCQkJCW92ZXIgPSBmaWxsZXIocmV0cCwgZGUtPmRfbmFtZSwgZGUtPmRfbmFtZWxlbiwKKwkJCQkJKChwYWdlIDw8IFBBR0VfQ0FDSEVfU0hJRlQpIHwgb2Zmc2V0KSArIDIsCisJCQkJCWRlLT5kX2lubywgRFRfVU5LTk9XTik7CisJCQkJaWYgKG92ZXIpIHsKKwkJCQkJdnhmc19wdXRfcGFnZShwcCk7CisJCQkJCWdvdG8gZG9uZTsKKwkJCQl9CisJCQl9CisJCQlvZmZzZXQgPSAwOworCQl9CisJCXZ4ZnNfcHV0X3BhZ2UocHApOworCQlvZmZzZXQgPSAwOworCX0KKworZG9uZToKKwlmcC0+Zl9wb3MgPSAoKHBhZ2UgPDwgUEFHRV9DQUNIRV9TSElGVCkgfCBvZmZzZXQpICsgMjsKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy9mcmVldnhmcy92eGZzX29sdC5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19vbHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTIwNGUzCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZnJlZXZ4ZnMvdnhmc19vbHQuYwpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIENocmlzdG9waCBIZWxsd2lnLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisvKiAKKyAqIFZlcml0YXMgZmlsZXN5c3RlbSBkcml2ZXIgLSBvYmplY3QgbG9jYXRpb24gdGFibGUgc3VwcG9ydC4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgInZ4ZnMuaCIKKyNpbmNsdWRlICJ2eGZzX29sdC5oIgorCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQKK3Z4ZnNfZ2V0X2ZzaGVhZChzdHJ1Y3Qgdnhmc19vbHRmc2hlYWQgKmZzaHAsIHN0cnVjdCB2eGZzX3NiX2luZm8gKmluZnApCit7CisJaWYgKGluZnAtPnZzaV9mc2hpbm8pCisJCUJVRygpOworCWluZnAtPnZzaV9mc2hpbm8gPSBmc2hwLT5vbHRfZnNpbm9bMF07Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQKK3Z4ZnNfZ2V0X2lsaXN0KHN0cnVjdCB2eGZzX29sdGlsaXN0ICppbGlzdHAsIHN0cnVjdCB2eGZzX3NiX2luZm8gKmluZnApCit7CisJaWYgKGluZnAtPnZzaV9pZXh0KQorCQlCVUcoKTsKKwlpbmZwLT52c2lfaWV4dCA9IGlsaXN0cC0+b2x0X2lleHRbMF07IAorfQorCitzdGF0aWMgX19pbmxpbmVfXyB1X2xvbmcKK3Z4ZnNfb2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2JwLCBkYWRkcl90IGJsb2NrLCB1X2xvbmcgYnNpemUpCit7CisJaWYgKHNicC0+c19ibG9ja3NpemUgJSBic2l6ZSkKKwkJQlVHKCk7CisJcmV0dXJuIChibG9jayAqIChzYnAtPnNfYmxvY2tzaXplIC8gYnNpemUpKTsKK30KKworCisvKioKKyAqIHZ4ZnNfcmVhZF9vbHQgLSByZWFkIG9sdAorICogQHNicDoJc3VwZXJibG9jayBvZiB0aGUgZmlsZXN5c3RlbQorICogQGJzaXplOglibG9ja3NpemUgb2YgdGhlIGZpbGVzeXN0ZW0KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgdnhmc19yZWFkX29sdCByZWFkcyB0aGUgb2x0IG9mIHRoZSBmaWxlc3lzdGVtIGRlc2NyaWJlZCBieSBAc2JwCisgKiAgIGludG8gbWFpbiBtZW1vcnkgYW5kIGRvZXMgc29tZSBiYXNpYyBzZXR1cC4KKyAqCisgKiBSZXR1cm5zOgorICogICBaZXJvIG9uIHN1Y2Nlc3MsIGVsc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitpbnQKK3Z4ZnNfcmVhZF9vbHQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIHVfbG9uZyBic2l6ZSkKK3sKKwlzdHJ1Y3Qgdnhmc19zYl9pbmZvCSppbmZwID0gVlhGU19TQkkoc2JwKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJwOworCXN0cnVjdCB2eGZzX29sdAkJKm9wOworCWNoYXIJCQkqb2FkZHIsICplYWRkcjsKKworCisJYnAgPSBzYl9icmVhZChzYnAsIHZ4ZnNfb2Jsb2NrKHNicCwgaW5mcC0+dnNpX29sdGV4dCwgYnNpemUpKTsKKwlpZiAoIWJwIHx8ICFicC0+Yl9kYXRhKQorCQlnb3RvIGZhaWw7CisKKwlvcCA9IChzdHJ1Y3Qgdnhmc19vbHQgKilicC0+Yl9kYXRhOworCWlmIChvcC0+b2x0X21hZ2ljICE9IFZYRlNfT0xUX01BR0lDKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAidnhmczogaXZhbGlkIG9sdCBtYWdpYyBudW1iZXJcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJLyoKKwkgKiBJdCBpcyBpbiB0aGVvcnkgcG9zc2libGUgdGhhdCB2c2lfb2x0c2l6ZSBpcyA+IDEuCisJICogSSd2ZSBub3Qgc2VlbiBhbnkgc3VjaCBmaWxlc3lzdGVtIHlldCBhbmQgSSdtIGxhenkuLiAgLS1oY2gKKwkgKi8KKwlpZiAoaW5mcC0+dnNpX29sdHNpemUgPiAxKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAidnhmczogb2x0c2l6ZSA+IDEgZGV0ZWN0ZWQuXG4iKTsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJ2eGZzOiBwbGVhc2Ugbm90aWZ5IGhjaEBpbmZyYWRlYWQub3JnXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCW9hZGRyID0gKGNoYXIgKilicC0+Yl9kYXRhICsgb3AtPm9sdF9zaXplOworCWVhZGRyID0gKGNoYXIgKilicC0+Yl9kYXRhICsgKGluZnAtPnZzaV9vbHRzaXplICogc2JwLT5zX2Jsb2Nrc2l6ZSk7CisKKwl3aGlsZSAob2FkZHIgPCBlYWRkcikgeworCQlzdHJ1Y3Qgdnhmc19vbHRjb21tb24JKm9jcCA9CisJCQkoc3RydWN0IHZ4ZnNfb2x0Y29tbW9uICopb2FkZHI7CisJCQorCQlzd2l0Y2ggKG9jcC0+b2x0X3R5cGUpIHsKKwkJY2FzZSBWWEZTX09MVF9GU0hFQUQ6CisJCQl2eGZzX2dldF9mc2hlYWQoKHN0cnVjdCB2eGZzX29sdGZzaGVhZCAqKW9hZGRyLCBpbmZwKTsKKwkJCWJyZWFrOworCQljYXNlIFZYRlNfT0xUX0lMSVNUOgorCQkJdnhmc19nZXRfaWxpc3QoKHN0cnVjdCB2eGZzX29sdGlsaXN0ICopb2FkZHIsIGluZnApOworCQkJYnJlYWs7CisJCX0KKworCQlvYWRkciArPSBvY3AtPm9sdF9zaXplOworCX0KKworCWJyZWxzZShicCk7CisJcmV0dXJuIDA7CisKK2ZhaWw6CisJYnJlbHNlKGJwKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfb2x0LmggYi9mcy9mcmVldnhmcy92eGZzX29sdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MzI0MjkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9mcmVldnhmcy92eGZzX29sdC5oCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKS4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqLworI2lmbmRlZiBfVlhGU19PTFRfSF8KKyNkZWZpbmUgX1ZYRlNfT0xUX0hfCisKKy8qCisgKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gT2JqZWN0IExvY2F0aW9uIFRhYmxlIGRhdGEgc3RydWN0dXJlcy4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgZm9yIHRoZSBPYmplY3QgTG9jYXRpb24gVGFibGUgdXNlZAorICogYnkgdGhlIFZlcml0YXMgRmlsZXN5c3RlbSB2ZXJzaW9uIDIgYW5kIG5ld2VyLgorICovCisKKworLyoKKyAqIE9MVCBtYWdpYyBudW1iZXIgKHZ4ZnNfb2x0LT5vbHRfbWFnaWMpLgorICovCisjZGVmaW5lIFZYRlNfT0xUX01BR0lDCQkweGE1MDRGQ0Y1CisKKy8qCisgKiBWeEZTIE9MVCBlbnRyeSB0eXBlcy4KKyAqLworZW51bSB7CisJVlhGU19PTFRfRlJFRQk9IDEsCisJVlhGU19PTFRfRlNIRUFECT0gMiwKKwlWWEZTX09MVF9DVVQJPSAzLAorCVZYRlNfT0xUX0lMSVNUCT0gNCwKKwlWWEZTX09MVF9ERVYJPSA1LAorCVZYRlNfT0xUX1NCCT0gNgorfTsKKworLyoKKyAqIFZ4RlMgT0xUIGhlYWRlci4KKyAqCisgKiBUaGUgT2JqZWN0IExvY2F0aW9uIFRhYmxlIGhlYWRlciBpcyBwbGFjZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoCisgKiBPTFQgZXh0ZW50LiAgSXQgaXMgdXNlZCB0byBmaW5nIGNlcnRhaW4gZmlsZXN5c3RlbS13aWRlIG1ldGFkYXRhLCBlLmcuCisgKiB0aGUgaW5pdGFsIGlub2RlIGxpc3QsIHRoZSBmaWxlc2V0IGhlYWRlciBvciB0aGUgZGV2aWNlIGNvbmZpZ3VyYXRpb24uCisgKi8KK3N0cnVjdCB2eGZzX29sdCB7CisJdV9pbnQzMl90CW9sdF9tYWdpYzsJLyogbWFnaWMgbnVtYmVyCQkJKi8KKwl1X2ludDMyX3QJb2x0X3NpemU7CS8qIHNpemUgb2YgdGhpcyBlbnRyeQkJKi8KKwl1X2ludDMyX3QJb2x0X2NoZWNrc3VtOwkvKiBjaGVja3N1bSBvZiBleHRlbnQJCSovCisJdV9pbnQzMl90CV9fdW51c2VkMTsJLyogPz8/CQkJCSovCisJdV9pbnQzMl90CW9sdF9tdGltZTsJLyogdGltZSBvZiBsYXN0IG1vZC4gKHNlYykJKi8KKwl1X2ludDMyX3QJb2x0X211dGltZTsJLyogdGltZSBvZiBsYXN0IG1vZC4gKHVzZWMpCSovCisJdV9pbnQzMl90CW9sdF90b3RmcmVlOwkvKiBmcmVlIHNwYWNlIGluIE9MVCBleHRlbnQJKi8KKwl2eF9kYWRkcl90CW9sdF9leHRlbnRzWzJdOwkvKiBhZGRyIG9mIHRoaXMgZXh0ZW50LCByZXBsaWNhCSovCisJdV9pbnQzMl90CW9sdF9lc2l6ZTsJLyogc2l6ZSBvZiB0aGlzIGV4dGVudAkJKi8KKwl2eF9kYWRkcl90CW9sdF9uZXh0WzJdOyAgICAvKiBhZGRyIG9mIG5leHQgZXh0ZW50LCByZXBsaWNhCSovCisJdV9pbnQzMl90CW9sdF9uc2l6ZTsJLyogc2l6ZSBvZiBuZXh0IGV4dGVudAkJKi8KKwl1X2ludDMyX3QJX191bnVzZWQyOwkvKiBhbGlnbiB0byA4IGJ5dGUgYm91bmRhcnkJKi8KK307CisKKy8qCisgKiBWeEZTIGNvbW1vbiBPTFQgZW50cnkgKG9uIGRpc2spLgorICovCitzdHJ1Y3Qgdnhmc19vbHRjb21tb24geworCXVfaW50MzJfdAlvbHRfdHlwZTsJLyogdHlwZSBvZiB0aGlzIHJlY29yZAkJKi8KKwl1X2ludDMyX3QJb2x0X3NpemU7CS8qIHNpemUgb2YgdGhpcyByZWNvcmQJCSovCit9OworCisvKgorICogVnhGUyBmcmVlIE9MVCBlbnRyeSAob24gZGlzaykuCisgKi8KK3N0cnVjdCB2eGZzX29sdGZyZWUgeworCXVfaW50MzJfdAlvbHRfdHlwZTsJLyogdHlwZSBvZiB0aGlzIHJlY29yZAkJKi8KKwl1X2ludDMyX3QJb2x0X2ZzaXplOwkvKiBzaXplIG9mIHRoaXMgZnJlZSByZWNvcmQJKi8KK307CisKKy8qCisgKiBWeEZTIGluaXRpYWwtaW5vZGUgbGlzdCAob24gZGlzaykuCisgKi8KK3N0cnVjdCB2eGZzX29sdGlsaXN0IHsKKwl1X2ludDMyX3QJb2x0X3R5cGU7CS8qIHR5cGUgb2YgdGhpcyByZWNvcmQJCSovCisJdV9pbnQzMl90CW9sdF9zaXplOwkvKiBzaXplIG9mIHRoaXMgcmVjb3JkCQkqLworCXZ4X2lub190CW9sdF9pZXh0WzJdOwkvKiBpbml0aWFsIGlub2RlIGxpc3QsIHJlcGxpY2EJKi8KK307CisKKy8qCisgKiBDdXJyZW50IFVzYWdlIFRhYmxlIAorICovCitzdHJ1Y3Qgdnhmc19vbHRjdXQgeworCXVfaW50MzJfdAlvbHRfdHlwZTsJLyogdHlwZSBvZiB0aGlzIHJlY29yZAkJKi8KKwl1X2ludDMyX3QJb2x0X3NpemU7CS8qIHNpemUgb2YgdGhpcyByZWNvcmQJCSovCisJdnhfaW5vX3QJb2x0X2N1dGlubzsJLyogaW5vZGUgb2YgY3VycmVudCB1c2FnZSB0YWJsZQkqLworCXVfaW50MzJfdAlfX3BhZDsJCS8qIHVudXNlZCwgOCBieXRlIGFsaWduCQkqLworfTsKKworLyoKKyAqIElub2RlcyBjb250YWluaW5nIFN1cGVyYmxvY2ssIEludGVudCBsb2cgYW5kIE9MVHMgCisgKi8KK3N0cnVjdCB2eGZzX29sdHNiIHsKKwl1X2ludDMyX3QJb2x0X3R5cGU7CS8qIHR5cGUgb2YgdGhpcyByZWNvcmQJCSovCisJdV9pbnQzMl90CW9sdF9zaXplOwkvKiBzaXplIG9mIHRoaXMgcmVjb3JkCQkqLworCXZ4X2lub190CW9sdF9zYmlubzsJLyogaW5vZGUgb2Ygc3VwZXJibG9jayBmaWxlCSovCisJdV9pbnQzMl90CV9fdW51c2VkMTsJLyogPz8/CQkJCSovCisJdnhfaW5vX3QJb2x0X2xvZ2lub1syXTsJLyogaW5vZGUgb2YgbG9nIGZpbGUscmVwbGljYQkqLworCXZ4X2lub190CW9sdF9vbHRpbm9bMl07CS8qIGlub2RlIG9mIE9MVCwgcmVwbGljYQkqLworfTsKKworLyoKKyAqIElub2RlIGNvbnRhaW5pbmcgZGV2aWNlIGNvbmZpZ3VyYXRpb24gKyBpdCdzIHJlcGxpY2EgCisgKi8KK3N0cnVjdCB2eGZzX29sdGRldiB7CisJdV9pbnQzMl90CW9sdF90eXBlOwkvKiB0eXBlIG9mIHRoaXMgcmVjb3JkCQkqLworCXVfaW50MzJfdAlvbHRfc2l6ZTsJLyogc2l6ZSBvZiB0aGlzIHJlY29yZAkJKi8KKwl2eF9pbm9fdAlvbHRfZGV2aW5vWzJdOwkvKiBpbm9kZSBvZiBkZXZpY2UgY29uZmlnIGZpbGVzCSovCit9OworCisvKgorICogRmlsZXNldCBoZWFkZXIgCisgKi8KK3N0cnVjdCB2eGZzX29sdGZzaGVhZCB7CisJdV9pbnQzMl90CW9sdF90eXBlOwkvKiB0eXBlIG51bWJlcgkJCSovCisJdV9pbnQzMl90CW9sdF9zaXplOwkvKiBzaXplIG9mIHRoaXMgcmVjb3JkCQkqLworCXZ4X2lub190CW9sdF9mc2lub1syXTsgICAvKiBpbm9kZXMgb2YgZmlsZXNldCBoZWFkZXIJKi8KK307CisKKyNlbmRpZiAvKiBfVlhGU19PTFRfSF8gKi8KZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfc3Vici5jIGIvZnMvZnJlZXZ4ZnMvdnhmc19zdWJyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUzMDU2MQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfc3Vici5jCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKS4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gc2hhcmVkIHN1YnJvdXRpbmVzLgorICovCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisKKyNpbmNsdWRlICJ2eGZzX2tjb21wYXQuaCIKKyNpbmNsdWRlICJ2eGZzX2V4dGVybi5oIgorCisKK3N0YXRpYyBpbnQJCXZ4ZnNfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKiwgc3RydWN0IHBhZ2UgKik7CitzdGF0aWMgc2VjdG9yX3QJCXZ4ZnNfYm1hcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqLCBzZWN0b3JfdCk7CisKK3N0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgdnhmc19hb3BzID0geworCS5yZWFkcGFnZSA9CQl2eGZzX3JlYWRwYWdlLAorCS5ibWFwID0JCQl2eGZzX2JtYXAsCisJLnN5bmNfcGFnZSA9CQlibG9ja19zeW5jX3BhZ2UsCit9OworCitpbmxpbmUgdm9pZAordnhmc19wdXRfcGFnZShzdHJ1Y3QgcGFnZSAqcHApCit7CisJa3VubWFwKHBwKTsKKwlwYWdlX2NhY2hlX3JlbGVhc2UocHApOworfQorCisvKioKKyAqIHZ4ZnNfZ2V0X3BhZ2UgLSByZWFkIGEgcGFnZSBpbnRvIG1lbW9yeS4KKyAqIEBpcDoJCWlub2RlIHRvIHJlYWQgZnJvbQorICogQG46CQlwYWdlIG51bWJlcgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICB2eGZzX2dldF9wYWdlIHJlYWRzIHRoZSBAbiB0aCBwYWdlIG9mIEBpcCBpbnRvIHRoZSBwYWdlY2FjaGUuCisgKgorICogUmV0dXJuczoKKyAqICAgVGhlIHdhbnRlZCBwYWdlIG9uIHN1Y2Nlc3MsIGVsc2UgYSBOVUxMIHBvaW50ZXIuCisgKi8KK3N0cnVjdCBwYWdlICoKK3Z4ZnNfZ2V0X3BhZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHVfbG9uZyBuKQoreworCXN0cnVjdCBwYWdlICoJCQlwcDsKKworCXBwID0gcmVhZF9jYWNoZV9wYWdlKG1hcHBpbmcsIG4sCisJCQkoZmlsbGVyX3QqKW1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZSwgTlVMTCk7CisKKwlpZiAoIUlTX0VSUihwcCkpIHsKKwkJd2FpdF9vbl9wYWdlX2xvY2tlZChwcCk7CisJCWttYXAocHApOworCQlpZiAoIVBhZ2VVcHRvZGF0ZShwcCkpCisJCQlnb3RvIGZhaWw7CisJCS8qKiBpZiAoIVBhZ2VDaGVja2VkKHBwKSkgKiovCisJCQkvKiogdnhmc19jaGVja19wYWdlKHBwKTsgKiovCisJCWlmIChQYWdlRXJyb3IocHApKQorCQkJZ290byBmYWlsOworCX0KKwkKKwlyZXR1cm4gKHBwKTsKKwkJIAorZmFpbDoKKwl2eGZzX3B1dF9wYWdlKHBwKTsKKwlyZXR1cm4gRVJSX1BUUigtRUlPKTsKK30KKworLyoqCisgKiB2eGZzX2JyZWFkIC0gcmVhZCBidWZmZXIgZm9yIGEgZ2l2ZSBpbm9kZSxibG9jayB0dXBsZQorICogQGlwOgkJaW5vZGUKKyAqIEBibG9jazoJbG9naWNhbCBibG9jaworICoKKyAqIERlc2NyaXB0aW9uOgorICogICBUaGUgdnhmc19icmVhZCBmdW5jdGlvbiByZWFkcyBibG9jayBubyBAYmxvY2sgIG9mCisgKiAgIEBpcCBpbnRvIHRoZSBidWZmZXJjYWNoZS4KKyAqCisgKiBSZXR1cm5zOgorICogICBUaGUgcmVzdWx0aW5nICZzdHJ1Y3QgYnVmZmVyX2hlYWQuCisgKi8KK3N0cnVjdCBidWZmZXJfaGVhZCAqCit2eGZzX2JyZWFkKHN0cnVjdCBpbm9kZSAqaXAsIGludCBibG9jaykKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJwOworCWRhZGRyX3QJCQlwYmxvY2s7CisKKwlwYmxvY2sgPSB2eGZzX2JtYXAxKGlwLCBibG9jayk7CisJYnAgPSBzYl9icmVhZChpcC0+aV9zYiwgcGJsb2NrKTsKKworCXJldHVybiAoYnApOworfQorCisvKioKKyAqIHZ4ZnNfZ2V0X2Jsb2NrIC0gbG9jYXRlIGJ1ZmZlciBmb3IgZ2l2ZW4gaW5vZGUsYmxvY2sgdHVwbGUgCisgKiBAaXA6CQlpbm9kZQorICogQGlibG9jazoJbG9naWNhbCBibG9jaworICogQGJwOgkJYnVmZmVyIHNrZWxldG9uCisgKiBAY3JlYXRlOgklVFJVRSBpZiBibG9ja3MgbWF5IGJlIG5ld2x5IGFsbG9jYXRlZC4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgVGhlIHZ4ZnNfZ2V0X2Jsb2NrIGZ1bmN0aW9uIGZpbGxzIEBicCB3aXRoIHRoZSByaWdodCBwaHlzaWNhbAorICogICBibG9jayBhbmQgZGV2aWNlIG51bWJlciB0byBwZXJmb3JtIGEgbG93bGV2ZWwgcmVhZC93cml0ZSBvbgorICogICBpdC4KKyAqCisgKiBSZXR1cm5zOgorICogICBaZXJvIG9uIHN1Y2Nlc3MsIGVsc2UgYSBuZWdhdGl2IGVycm9yIGNvZGUgKC1FSU8pLgorICovCitzdGF0aWMgaW50Cit2eGZzX2dldGJsayhzdHJ1Y3QgaW5vZGUgKmlwLCBzZWN0b3JfdCBpYmxvY2ssCisJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYnAsIGludCBjcmVhdGUpCit7CisJZGFkZHJfdAkJCXBibG9jazsKKworCXBibG9jayA9IHZ4ZnNfYm1hcDEoaXAsIGlibG9jayk7CisJaWYgKHBibG9jayAhPSAwKSB7CisJCW1hcF9iaChicCwgaXAtPmlfc2IsIHBibG9jayk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRUlPOworfQorCisvKioKKyAqIHZ4ZnNfcmVhZHBhZ2UgLSByZWFkIG9uZSBwYWdlIHN5bmNocm9ub3VzbHkgaW50byB0aGUgcGFnZWNhY2hlCisgKiBAZmlsZToJZmlsZSBjb250ZXh0ICh1bnVzZWQpCisgKiBAcGFnZToJcGFnZSBmcmFtZSB0byBmaWxsIGluLgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBUaGUgdnhmc19yZWFkcGFnZSByb3V0aW5lIHJlYWRzIEBwYWdlIHN5bmNocm9ub3VzbHkgaW50byB0aGUKKyAqICAgcGFnZWNhY2hlLgorICoKKyAqIFJldHVybnM6CisgKiAgIFplcm8gb24gc3VjY2VzcywgZWxzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKgorICogTG9ja2luZyBzdGF0dXM6CisgKiAgIEBwYWdlIGlzIGxvY2tlZCBhbmQgd2lsbCBiZSB1bmxvY2tlZC4KKyAqLworc3RhdGljIGludAordnhmc19yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJuIGJsb2NrX3JlYWRfZnVsbF9wYWdlKHBhZ2UsIHZ4ZnNfZ2V0YmxrKTsKK30KKyAKKy8qKgorICogdnhmc19ibWFwIC0gcGVyZm9ybSBsb2dpY2FsIHRvIHBoeXNpY2FsIGJsb2NrIG1hcHBpbmcKKyAqIEBtYXBwaW5nOglsb2dpY2FsIHRvIHBoeXNpY2FsIG1hcHBpbmcgdG8gdXNlCisgKiBAYmxvY2s6CWxvZ2ljYWwgYmxvY2sgKHJlbGF0aXZlIHRvIEBtYXBwaW5nKS4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgVnhmc19ibWFwIGZpbmQgb3V0IHRoZSBjb3JyZXNwb25kaW5nIHBoc2ljYWwgYmxvY2sgdG8gdGhlCisgKiAgIEBtYXBwaW5nLCBAYmxvY2sgcGFpci4KKyAqCisgKiBSZXR1cm5zOgorICogICBQaHlzaWNhbCBibG9jayBudW1iZXIgb24gc3VjY2VzcywgZWxzZSBaZXJvLgorICoKKyAqIExvY2tpbmcgc3RhdHVzOgorICogICBXZSBhcmUgdW5kZXIgdGhlIGJrbC4KKyAqLworc3RhdGljIHNlY3Rvcl90Cit2eGZzX2JtYXAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHNlY3Rvcl90IGJsb2NrKQoreworCXJldHVybiBnZW5lcmljX2Jsb2NrX2JtYXAobWFwcGluZywgYmxvY2ssIHZ4ZnNfZ2V0YmxrKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2ZyZWV2eGZzL3Z4ZnNfc3VwZXIuYyBiL2ZzL2ZyZWV2eGZzL3Z4ZnNfc3VwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWUyYzdiCi0tLSAvZGV2L251bGwKKysrIGIvZnMvZnJlZXZ4ZnMvdnhmc19zdXBlci5jCkBAIC0wLDAgKzEsMjc4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKS4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorICogQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBWZXJpdGFzIGZpbGVzeXN0ZW0gZHJpdmVyIC0gc3VwZXJibG9jayByZWxhdGVkIHJvdXRpbmVzLgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisKKyNpbmNsdWRlICJ2eGZzLmgiCisjaW5jbHVkZSAidnhmc19leHRlcm4uaCIKKyNpbmNsdWRlICJ2eGZzX2Rpci5oIgorI2luY2x1ZGUgInZ4ZnNfaW5vZGUuaCIKKworCitNT0RVTEVfQVVUSE9SKCJDaHJpc3RvcGggSGVsbHdpZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJWZXJpdGFzIEZpbGVzeXN0ZW0gKFZ4RlMpIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworCitNT0RVTEVfQUxJQVMoInZ4ZnMiKTsgLyogbWFrZXMgbW91bnQgLXQgdnhmcyBhdXRvbG9hZCB0aGUgbW9kdWxlICovCisKKworc3RhdGljIHZvaWQJCXZ4ZnNfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK3N0YXRpYyBpbnQJCXZ4ZnNfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3Qga3N0YXRmcyAqKTsKK3N0YXRpYyBpbnQJCXZ4ZnNfcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50ICosIGNoYXIgKik7CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyB2eGZzX3N1cGVyX29wcyA9IHsKKwkucmVhZF9pbm9kZSA9CQl2eGZzX3JlYWRfaW5vZGUsCisJLmNsZWFyX2lub2RlID0JCXZ4ZnNfY2xlYXJfaW5vZGUsCisJLnB1dF9zdXBlciA9CQl2eGZzX3B1dF9zdXBlciwKKwkuc3RhdGZzID0JCXZ4ZnNfc3RhdGZzLAorCS5yZW1vdW50X2ZzID0JCXZ4ZnNfcmVtb3VudCwKK307CisKKy8qKgorICogdnhmc19wdXRfc3VwZXIgLSBmcmVlIHN1cGVyYmxvY2sgcmVzb3VyY2VzCisgKiBAc2JwOglWRlMgc3VwZXJibG9jay4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgdnhmc19wdXRfc3VwZXIgZnJlZXMgYWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgZm9yIEBzYnAKKyAqICAgYWZ0ZXIgdGhlIGxhc3QgaW5zdGFuY2Ugb2YgdGhlIGZpbGVzeXN0ZW0gaXMgdW5tb3VudGVkLgorICovCisKK3N0YXRpYyB2b2lkCit2eGZzX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCkKK3sKKwlzdHJ1Y3Qgdnhmc19zYl9pbmZvCSppbmZwID0gVlhGU19TQkkoc2JwKTsKKworCXZ4ZnNfcHV0X2Zha2VfaW5vZGUoaW5mcC0+dnNpX2ZzaGlwKTsKKwl2eGZzX3B1dF9mYWtlX2lub2RlKGluZnAtPnZzaV9pbGlzdCk7CisJdnhmc19wdXRfZmFrZV9pbm9kZShpbmZwLT52c2lfc3RpbGlzdCk7CisKKwlicmVsc2UoaW5mcC0+dnNpX2JwKTsKKwlrZnJlZShpbmZwKTsKK30KKworLyoqCisgKiB2eGZzX3N0YXRmcyAtIGdldCBmaWxlc3lzdGVtIGluZm9ybWF0aW9uCisgKiBAc2JwOglWRlMgc3VwZXJibG9jaworICogQGJ1ZnA6CW91dHB1dCBidWZmZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgdnhmc19zdGF0ZnMgZmlsbHMgdGhlIHN0YXRmcyBidWZmZXIgQGJ1ZnAgd2l0aCBpbmZvcm1hdGlvbgorICogICBhYm91dCB0aGUgZmlsZXN5c3RlbSBkZXNjcmliZWQgYnkgQHNicC4KKyAqCisgKiBSZXR1cm5zOgorICogICBaZXJvLgorICoKKyAqIExvY2tpbmc6CisgKiAgIE5vIGxvY2tzIGhlbGQuCisgKgorICogTm90ZXM6CisgKiAgIFRoaXMgaXMgZXZlcnl0aGluZyBidXQgY29tcGxldGUuLi4KKyAqLworc3RhdGljIGludAordnhmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIHN0cnVjdCBrc3RhdGZzICpidWZwKQoreworCXN0cnVjdCB2eGZzX3NiX2luZm8JCSppbmZwID0gVlhGU19TQkkoc2JwKTsKKworCWJ1ZnAtPmZfdHlwZSA9IFZYRlNfU1VQRVJfTUFHSUM7CisJYnVmcC0+Zl9ic2l6ZSA9IHNicC0+c19ibG9ja3NpemU7CisJYnVmcC0+Zl9ibG9ja3MgPSBpbmZwLT52c2lfcmF3LT52c19kc2l6ZTsKKwlidWZwLT5mX2JmcmVlID0gaW5mcC0+dnNpX3Jhdy0+dnNfZnJlZTsKKwlidWZwLT5mX2JhdmFpbCA9IDA7CisJYnVmcC0+Zl9maWxlcyA9IDA7CisJYnVmcC0+Zl9mZnJlZSA9IGluZnAtPnZzaV9yYXctPnZzX2lmcmVlOworCWJ1ZnAtPmZfbmFtZWxlbiA9IFZYRlNfTkFNRUxFTjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZ4ZnNfcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpkYXRhKQoreworCSpmbGFncyB8PSBNU19SRE9OTFk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdnhmc19yZWFkX3N1cGVyIC0gcmVhZCBzdXBlcmJsb2NrIGludG8gbWVtb3J5IGFuZCBpbml0YWxpemUgZmlsZXN5c3RlbQorICogQHNicDoJCVZGUyBzdXBlcmJsb2NrICh0byBmaWxsKQorICogQGRwOgkJCWZzIHByaXZhdGUgbW91bnQgZGF0YQorICogQHNpbGVudDoJCWRvIG5vdCBjb21wbGFpbiBsb3VkbHkgd2hlbiBzdGggaXMgd3JvbmcKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgV2UgYXJlIGNhbGxlZCBvbiB0aGUgZmlyc3QgbW91bnQgb2YgYSBmaWxlc3lzdGVtIHRvIHJlYWQgdGhlCisgKiAgIHN1cGVyYmxvY2sgaW50byBtZW1vcnkgYW5kIGRvIHNvbWUgYmFzaWMgc2V0dXAuCisgKgorICogUmV0dXJuczoKKyAqICAgVGhlIHN1cGVyYmxvY2sgb24gc3VjY2VzcywgZWxzZSAlTlVMTC4KKyAqCisgKiBMb2NraW5nOgorICogICBXZSBhcmUgdW5kZXIgdGhlIGJrbCBhbmQgQHNicC0+c19sb2NrLgorICovCitzdGF0aWMgaW50IHZ4ZnNfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCwgdm9pZCAqZHAsIGludCBzaWxlbnQpCit7CisJc3RydWN0IHZ4ZnNfc2JfaW5mbwkqaW5mcDsKKwlzdHJ1Y3Qgdnhmc19zYgkJKnJzYnA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkCSpicCA9IE5VTEw7CisJdV9sb25nCQkJYnNpemU7CisJc3RydWN0IGlub2RlICpyb290OworCisJc2JwLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKKworCWluZnAgPSBrbWFsbG9jKHNpemVvZigqaW5mcCksIEdGUF9LRVJORUwpOworCWlmICghaW5mcCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJ2eGZzOiB1bmFibGUgdG8gYWxsb2NhdGUgaW5jb3JlIHN1cGVyYmxvY2tcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGluZnAsIDAsIHNpemVvZigqaW5mcCkpOworCisJYnNpemUgPSBzYl9taW5fYmxvY2tzaXplKHNicCwgQkxPQ0tfU0laRSk7CisJaWYgKCFic2l6ZSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJ2eGZzOiB1bmFibGUgdG8gc2V0IGJsb2Nrc2l6ZVxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWJwID0gc2JfYnJlYWQoc2JwLCAxKTsKKwlpZiAoIWJwIHx8ICFidWZmZXJfbWFwcGVkKGJwKSkgeworCQlpZiAoIXNpbGVudCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSJ2eGZzOiB1bmFibGUgdG8gcmVhZCBkaXNrIHN1cGVyYmxvY2tcbiIpOworCQl9CisJCWdvdG8gb3V0OworCX0KKworCXJzYnAgPSAoc3RydWN0IHZ4ZnNfc2IgKilicC0+Yl9kYXRhOworCWlmIChyc2JwLT52c19tYWdpYyAhPSBWWEZTX1NVUEVSX01BR0lDKSB7CisJCWlmICghc2lsZW50KQorCQkJcHJpbnRrKEtFUk5fTk9USUNFICJ2eGZzOiBXUk9ORyBzdXBlcmJsb2NrIG1hZ2ljXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKChyc2JwLT52c192ZXJzaW9uIDwgMiB8fCByc2JwLT52c192ZXJzaW9uID4gNCkgJiYgIXNpbGVudCkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgInZ4ZnM6IHVuc3VwcG9ydGVkIFZ4RlMgdmVyc2lvbiAoJWQpXG4iLAorCQkgICAgICAgcnNicC0+dnNfdmVyc2lvbik7CisJCWdvdG8gb3V0OworCX0KKworI2lmZGVmIERJQUdOT1NUSUMKKwlwcmludGsoS0VSTl9ERUJVRyAidnhmczogc3VwcG9ydGVkIFZ4RlMgdmVyc2lvbiAoJWQpXG4iLCByc2JwLT52c192ZXJzaW9uKTsKKwlwcmludGsoS0VSTl9ERUJVRyAidnhmczogYmxvY2tzaXplOiAlZFxuIiwgcnNicC0+dnNfYnNpemUpOworI2VuZGlmCisKKwlzYnAtPnNfbWFnaWMgPSByc2JwLT52c19tYWdpYzsKKwlzYnAtPnNfZnNfaW5mbyA9ICh2b2lkICopaW5mcDsKKworCWluZnAtPnZzaV9yYXcgPSByc2JwOworCWluZnAtPnZzaV9icCA9IGJwOworCWluZnAtPnZzaV9vbHRleHQgPSByc2JwLT52c19vbHRleHRbMF07CisJaW5mcC0+dnNpX29sdHNpemUgPSByc2JwLT52c19vbHRzaXplOworCisJaWYgKCFzYl9zZXRfYmxvY2tzaXplKHNicCwgcnNicC0+dnNfYnNpemUpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInZ4ZnM6IHVuYWJsZSB0byBzZXQgZmluYWwgYmxvY2sgc2l6ZVxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWlmICh2eGZzX3JlYWRfb2x0KHNicCwgYnNpemUpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInZ4ZnM6IHVuYWJsZSB0byByZWFkIG9sdFxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWlmICh2eGZzX3JlYWRfZnNoZWFkKHNicCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAidnhmczogdW5hYmxlIHRvIHJlYWQgZnNoZWFkXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJc2JwLT5zX29wID0gJnZ4ZnNfc3VwZXJfb3BzOworCXJvb3QgPSBpZ2V0KHNicCwgVlhGU19ST09UX0lOTyk7CisJc2JwLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdCk7CisJaWYgKCFzYnAtPnNfcm9vdCkgeworCQlpcHV0KHJvb3QpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJ2eGZzOiB1bmFibGUgdG8gZ2V0IHJvb3QgZGVudHJ5LlxuIik7CisJCWdvdG8gb3V0X2ZyZWVfaWxpc3Q7CisJfQorCisJcmV0dXJuIDA7CisJCitvdXRfZnJlZV9pbGlzdDoKKwl2eGZzX3B1dF9mYWtlX2lub2RlKGluZnAtPnZzaV9mc2hpcCk7CisJdnhmc19wdXRfZmFrZV9pbm9kZShpbmZwLT52c2lfaWxpc3QpOworCXZ4ZnNfcHV0X2Zha2VfaW5vZGUoaW5mcC0+dnNpX3N0aWxpc3QpOworb3V0OgorCWJyZWxzZShicCk7CisJa2ZyZWUoaW5mcCk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qCisgKiBUaGUgdXN1YWwgbW9kdWxlIGJsdXJiLgorICovCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICp2eGZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoreworCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIHZ4ZnNfZmlsbF9zdXBlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSB2eGZzX2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJ2eGZzIiwKKwkuZ2V0X3NiCQk9IHZ4ZnNfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9ibG9ja19zdXBlciwKKwkuZnNfZmxhZ3MJPSBGU19SRVFVSVJFU19ERVYsCit9OworCitzdGF0aWMgaW50IF9faW5pdAordnhmc19pbml0KHZvaWQpCit7CisJdnhmc19pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgidnhmc19pbm9kZSIsCisJCQlzaXplb2Yoc3RydWN0IHZ4ZnNfaW5vZGVfaW5mbyksIDAsIAorCQkJU0xBQl9SRUNMQUlNX0FDQ09VTlQsIE5VTEwsIE5VTEwpOworCWlmICh2eGZzX2lub2RlX2NhY2hlcCkKKwkJcmV0dXJuIChyZWdpc3Rlcl9maWxlc3lzdGVtKCZ2eGZzX2ZzX3R5cGUpKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHZvaWQgX19leGl0Cit2eGZzX2NsZWFudXAodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnZ4ZnNfZnNfdHlwZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KHZ4ZnNfaW5vZGVfY2FjaGVwKTsKK30KKworbW9kdWxlX2luaXQodnhmc19pbml0KTsKK21vZHVsZV9leGl0KHZ4ZnNfY2xlYW51cCk7CmRpZmYgLS1naXQgYS9mcy9mcy13cml0ZWJhY2suYyBiL2ZzL2ZzLXdyaXRlYmFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZWZiMzYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9mcy13cml0ZWJhY2suYwpAQCAtMCwwICsxLDY5NSBAQAorLyoKKyAqIGZzL2ZzLXdyaXRlYmFjay5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyLCBMaW51cyBUb3J2YWxkcy4KKyAqCisgKiBDb250YWlucyBhbGwgdGhlIGZ1bmN0aW9ucyByZWxhdGVkIHRvIHdyaXRpbmcgYmFjayBhbmQgd2FpdGluZworICogdXBvbiBkaXJ0eSBpbm9kZXMgYWdhaW5zdCBzdXBlcmJsb2NrcywgYW5kIHdyaXRpbmcgYmFjayBkaXJ0eQorICogcGFnZXMgYWdhaW5zdCBpbm9kZXMuICBpZTogZGF0YSB3cml0ZWJhY2suICBXcml0ZW91dCBvZiB0aGUKKyAqIGlub2RlIGl0c2VsZiBpcyBub3QgaGFuZGxlZCBoZXJlLgorICoKKyAqIDEwQXByMjAwMglha3BtQHppcC5jb20uYXUKKyAqCQlTcGxpdCBvdXQgb2YgZnMvaW5vZGUuYworICoJCUFkZGl0aW9ucyBmb3IgYWRkcmVzc19zcGFjZS1iYXNlZCB3cml0ZWJhY2sKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisKK2V4dGVybiBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmJsb2NrZGV2X3N1cGVyYmxvY2s7CisKKy8qKgorICoJX19tYXJrX2lub2RlX2RpcnR5IC0JaW50ZXJuYWwgZnVuY3Rpb24KKyAqCUBpbm9kZTogaW5vZGUgdG8gbWFyaworICoJQGZsYWdzOiB3aGF0IGtpbmQgb2YgZGlydHkgKGkuZS4gSV9ESVJUWV9TWU5DKQorICoJTWFyayBhbiBpbm9kZSBhcyBkaXJ0eS4gQ2FsbGVycyBzaG91bGQgdXNlIG1hcmtfaW5vZGVfZGlydHkgb3IKKyAqICAJbWFya19pbm9kZV9kaXJ0eV9zeW5jLgorICoKKyAqIFB1dCB0aGUgaW5vZGUgb24gdGhlIHN1cGVyIGJsb2NrJ3MgZGlydHkgbGlzdC4KKyAqCisgKiBDQVJFRlVMISBXZSBtYXJrIGl0IGRpcnR5IHVuY29uZGl0aW9uYWxseSwgYnV0IG1vdmUgaXQgb250byB0aGUKKyAqIGRpcnR5IGxpc3Qgb25seSBpZiBpdCBpcyBoYXNoZWQgb3IgaWYgaXQgcmVmZXJzIHRvIGEgYmxvY2tkZXYuCisgKiBJZiBpdCB3YXMgbm90IGhhc2hlZCwgaXQgd2lsbCBuZXZlciBiZSBhZGRlZCB0byB0aGUgZGlydHkgbGlzdAorICogZXZlbiBpZiBpdCBpcyBsYXRlciBoYXNoZWQsIGFzIGl0IHdpbGwgaGF2ZSBiZWVuIG1hcmtlZCBkaXJ0eSBhbHJlYWR5LgorICoKKyAqIEluIHNob3J0LCBtYWtlIHN1cmUgeW91IGhhc2ggYW55IGlub2RlcyBfYmVmb3JlXyB5b3Ugc3RhcnQgbWFya2luZworICogdGhlbSBkaXJ0eS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uICptdXN0KiBiZSBhdG9taWMgZm9yIHRoZSBJX0RJUlRZX1BBR0VTIGNhc2UgLQorICogc2V0X3BhZ2VfZGlydHkoKSBpcyBjYWxsZWQgdW5kZXIgc3BpbmxvY2sgaW4gc2V2ZXJhbCBwbGFjZXMuCisgKgorICogTm90ZSB0aGF0IGZvciBibG9ja2RldnMsIGlub2RlLT5kaXJ0aWVkX3doZW4gcmVwcmVzZW50cyB0aGUgZGlydHlpbmcgdGltZSBvZgorICogdGhlIGJsb2NrLXNwZWNpYWwgaW5vZGUgKC9kZXYvaGRhMSkgaXRzZWxmLiAgQW5kIHRoZSAtPmRpcnRpZWRfd2hlbiBmaWVsZCBvZgorICogdGhlIGtlcm5lbC1pbnRlcm5hbCBibG9ja2RldiBpbm9kZSByZXByZXNlbnRzIHRoZSBkaXJ0eWluZyB0aW1lIG9mIHRoZQorICogYmxvY2tkZXYncyBwYWdlcy4gIFRoaXMgaXMgd2h5IGZvciBJX0RJUlRZX1BBR0VTIHdlIGFsd2F5cyB1c2UKKyAqIHBhZ2UtPm1hcHBpbmctPmhvc3QsIHNvIHRoZSBwYWdlLWRpcnR5aW5nIHRpbWUgaXMgcmVjb3JkZWQgaW4gdGhlIGludGVybmFsCisgKiBibG9ja2RldiBpbm9kZS4KKyAqLwordm9pZCBfX21hcmtfaW5vZGVfZGlydHkoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZsYWdzKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKworCS8qCisJICogRG9uJ3QgZG8gdGhpcyBmb3IgSV9ESVJUWV9QQUdFUyAtIHRoYXQgZG9lc24ndCBhY3R1YWxseQorCSAqIGRpcnR5IHRoZSBpbm9kZSBpdHNlbGYKKwkgKi8KKwlpZiAoZmxhZ3MgJiAoSV9ESVJUWV9TWU5DIHwgSV9ESVJUWV9EQVRBU1lOQykpIHsKKwkJaWYgKHNiLT5zX29wLT5kaXJ0eV9pbm9kZSkKKwkJCXNiLT5zX29wLT5kaXJ0eV9pbm9kZShpbm9kZSk7CisJfQorCisJLyoKKwkgKiBtYWtlIHN1cmUgdGhhdCBjaGFuZ2VzIGFyZSBzZWVuIGJ5IGFsbCBjcHVzIGJlZm9yZSB3ZSB0ZXN0IGlfc3RhdGUKKwkgKiAtLSBtaWt1bGFzCisJICovCisJc21wX21iKCk7CisKKwkvKiBhdm9pZCB0aGUgbG9ja2luZyBpZiB3ZSBjYW4gKi8KKwlpZiAoKGlub2RlLT5pX3N0YXRlICYgZmxhZ3MpID09IGZsYWdzKQorCQlyZXR1cm47CisKKwlpZiAodW5saWtlbHkoYmxvY2tfZHVtcCkpIHsKKwkJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gTlVMTDsKKwkJY29uc3QgY2hhciAqbmFtZSA9ICI/IjsKKworCQlpZiAoIWxpc3RfZW1wdHkoJmlub2RlLT5pX2RlbnRyeSkpIHsKKwkJCWRlbnRyeSA9IGxpc3RfZW50cnkoaW5vZGUtPmlfZGVudHJ5Lm5leHQsCisJCQkJCSAgICBzdHJ1Y3QgZGVudHJ5LCBkX2FsaWFzKTsKKwkJCWlmIChkZW50cnkgJiYgZGVudHJ5LT5kX25hbWUubmFtZSkKKwkJCQluYW1lID0gKGNvbnN0IGNoYXIgKikgZGVudHJ5LT5kX25hbWUubmFtZTsKKwkJfQorCisJCWlmIChpbm9kZS0+aV9pbm8gfHwgc3RyY21wKGlub2RlLT5pX3NiLT5zX2lkLCAiYmRldiIpKQorCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCSAgICAgICAiJXMoJWQpOiBkaXJ0aWVkIGlub2RlICVsdSAoJXMpIG9uICVzXG4iLAorCQkJICAgICAgIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgaW5vZGUtPmlfaW5vLAorCQkJICAgICAgIG5hbWUsIGlub2RlLT5pX3NiLT5zX2lkKTsKKwl9CisKKwlzcGluX2xvY2soJmlub2RlX2xvY2spOworCWlmICgoaW5vZGUtPmlfc3RhdGUgJiBmbGFncykgIT0gZmxhZ3MpIHsKKwkJY29uc3QgaW50IHdhc19kaXJ0eSA9IGlub2RlLT5pX3N0YXRlICYgSV9ESVJUWTsKKworCQlpbm9kZS0+aV9zdGF0ZSB8PSBmbGFnczsKKworCQkvKgorCQkgKiBJZiB0aGUgaW5vZGUgaXMgbG9ja2VkLCBqdXN0IHVwZGF0ZSBpdHMgZGlydHkgc3RhdGUuIAorCQkgKiBUaGUgdW5sb2NrZXIgd2lsbCBwbGFjZSB0aGUgaW5vZGUgb24gdGhlIGFwcHJvcHJpYXRlCisJCSAqIHN1cGVyYmxvY2sgbGlzdCwgYmFzZWQgdXBvbiBpdHMgc3RhdGUuCisJCSAqLworCQlpZiAoaW5vZGUtPmlfc3RhdGUgJiBJX0xPQ0spCisJCQlnb3RvIG91dDsKKworCQkvKgorCQkgKiBPbmx5IGFkZCB2YWxpZCAoaGFzaGVkKSBpbm9kZXMgdG8gdGhlIHN1cGVyYmxvY2sncworCQkgKiBkaXJ0eSBsaXN0LiAgQWRkIGJsb2NrZGV2IGlub2RlcyBhcyB3ZWxsLgorCQkgKi8KKwkJaWYgKCFTX0lTQkxLKGlub2RlLT5pX21vZGUpKSB7CisJCQlpZiAoaGxpc3RfdW5oYXNoZWQoJmlub2RlLT5pX2hhc2gpKQorCQkJCWdvdG8gb3V0OworCQl9CisJCWlmIChpbm9kZS0+aV9zdGF0ZSAmIChJX0ZSRUVJTkd8SV9DTEVBUikpCisJCQlnb3RvIG91dDsKKworCQkvKgorCQkgKiBJZiB0aGUgaW5vZGUgd2FzIGFscmVhZHkgb24gc19kaXJ0eSBvciBzX2lvLCBkb24ndAorCQkgKiByZXBvc2l0aW9uIGl0ICh0aGF0IHdvdWxkIGJyZWFrIHNfZGlydHkgdGltZS1vcmRlcmluZykuCisJCSAqLworCQlpZiAoIXdhc19kaXJ0eSkgeworCQkJaW5vZGUtPmRpcnRpZWRfd2hlbiA9IGppZmZpZXM7CisJCQlsaXN0X21vdmUoJmlub2RlLT5pX2xpc3QsICZzYi0+c19kaXJ0eSk7CisJCX0KKwl9CitvdXQ6CisJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworfQorCitFWFBPUlRfU1lNQk9MKF9fbWFya19pbm9kZV9kaXJ0eSk7CisKK3N0YXRpYyBpbnQgd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHN5bmMpCit7CisJaWYgKGlub2RlLT5pX3NiLT5zX29wLT53cml0ZV9pbm9kZSAmJiAhaXNfYmFkX2lub2RlKGlub2RlKSkKKwkJcmV0dXJuIGlub2RlLT5pX3NiLT5zX29wLT53cml0ZV9pbm9kZShpbm9kZSwgc3luYyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXcml0ZSBhIHNpbmdsZSBpbm9kZSdzIGRpcnR5IHBhZ2VzIGFuZCBpbm9kZSBkYXRhIG91dCB0byBkaXNrLgorICogSWYgYHdhaXQnIGlzIHNldCwgd2FpdCBvbiB0aGUgd3JpdGVvdXQuCisgKgorICogVGhlIHdob2xlIHdyaXRlb3V0IGRlc2lnbiBpcyBxdWl0ZSBjb21wbGV4IGFuZCBmcmFnaWxlLiAgV2Ugd2FudCB0byBhdm9pZAorICogc3RhcnZhdGlvbiBvZiBwYXJ0aWN1bGFyIGlub2RlcyB3aGVuIG90aGVycyBhcmUgYmVpbmcgcmVkaXJ0aWVkLCBwcmV2ZW50CisgKiBsaXZlbG9ja3MsIGV0Yy4KKyAqCisgKiBDYWxsZWQgdW5kZXIgaW5vZGVfbG9jay4KKyAqLworc3RhdGljIGludAorX19zeW5jX3NpbmdsZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwl1bnNpZ25lZCBkaXJ0eTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCWludCB3YWl0ID0gd2JjLT5zeW5jX21vZGUgPT0gV0JfU1lOQ19BTEw7CisJaW50IHJldDsKKworCUJVR19PTihpbm9kZS0+aV9zdGF0ZSAmIElfTE9DSyk7CisKKwkvKiBTZXQgSV9MT0NLLCByZXNldCBJX0RJUlRZICovCisJZGlydHkgPSBpbm9kZS0+aV9zdGF0ZSAmIElfRElSVFk7CisJaW5vZGUtPmlfc3RhdGUgfD0gSV9MT0NLOworCWlub2RlLT5pX3N0YXRlICY9IH5JX0RJUlRZOworCisJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworCisJcmV0ID0gZG9fd3JpdGVwYWdlcyhtYXBwaW5nLCB3YmMpOworCisJLyogRG9uJ3Qgd3JpdGUgdGhlIGlub2RlIGlmIG9ubHkgSV9ESVJUWV9QQUdFUyB3YXMgc2V0ICovCisJaWYgKGRpcnR5ICYgKElfRElSVFlfU1lOQyB8IElfRElSVFlfREFUQVNZTkMpKSB7CisJCWludCBlcnIgPSB3cml0ZV9pbm9kZShpbm9kZSwgd2FpdCk7CisJCWlmIChyZXQgPT0gMCkKKwkJCXJldCA9IGVycjsKKwl9CisKKwlpZiAod2FpdCkgeworCQlpbnQgZXJyID0gZmlsZW1hcF9mZGF0YXdhaXQobWFwcGluZyk7CisJCWlmIChyZXQgPT0gMCkKKwkJCXJldCA9IGVycjsKKwl9CisKKwlzcGluX2xvY2soJmlub2RlX2xvY2spOworCWlub2RlLT5pX3N0YXRlICY9IH5JX0xPQ0s7CisJaWYgKCEoaW5vZGUtPmlfc3RhdGUgJiBJX0ZSRUVJTkcpKSB7CisJCWlmICghKGlub2RlLT5pX3N0YXRlICYgSV9ESVJUWSkgJiYKKwkJICAgIG1hcHBpbmdfdGFnZ2VkKG1hcHBpbmcsIFBBR0VDQUNIRV9UQUdfRElSVFkpKSB7CisJCQkvKgorCQkJICogV2UgZGlkbid0IHdyaXRlIGJhY2sgYWxsIHRoZSBwYWdlcy4gIG5mc193cml0ZXBhZ2VzKCkKKwkJCSAqIHNvbWV0aW1lcyBiYWxlcyBvdXQgd2l0aG91dCBkb2luZyBhbnl0aGluZy4gUmVkaXJ0eQorCQkJICogdGhlIGlub2RlLiAgSXQgaXMgc3RpbGwgb24gc2ItPnNfaW8uCisJCQkgKi8KKwkJCWlmICh3YmMtPmZvcl9rdXBkYXRlKSB7CisJCQkJLyoKKwkJCQkgKiBGb3IgdGhlIGt1cGRhdGUgZnVuY3Rpb24gd2UgbGVhdmUgdGhlIGlub2RlCisJCQkJICogYXQgdGhlIGhlYWQgb2Ygc2JfZGlydHkgc28gaXQgd2lsbCBnZXQgbW9yZQorCQkJCSAqIHdyaXRlb3V0IGFzIHNvb24gYXMgdGhlIHF1ZXVlIGJlY29tZXMKKwkJCQkgKiB1bmNvbmdlc3RlZC4KKwkJCQkgKi8KKwkJCQlpbm9kZS0+aV9zdGF0ZSB8PSBJX0RJUlRZX1BBR0VTOworCQkJCWxpc3RfbW92ZV90YWlsKCZpbm9kZS0+aV9saXN0LCAmc2ItPnNfZGlydHkpOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIE90aGVyd2lzZSBmdWxseSByZWRpcnR5IHRoZSBpbm9kZSBzbyB0aGF0CisJCQkJICogb3RoZXIgaW5vZGVzIG9uIHRoaXMgc3VwZXJibG9jayB3aWxsIGdldCBzb21lCisJCQkJICogd3JpdGVvdXQuICBPdGhlcndpc2UgaGVhdnkgd3JpdGluZyB0byBvbmUKKwkJCQkgKiBmaWxlIHdvdWxkIGluZGVmaW5pdGVseSBzdXNwZW5kIHdyaXRlb3V0IG9mCisJCQkJICogYWxsIHRoZSBvdGhlciBmaWxlcy4KKwkJCQkgKi8KKwkJCQlpbm9kZS0+aV9zdGF0ZSB8PSBJX0RJUlRZX1BBR0VTOworCQkJCWlub2RlLT5kaXJ0aWVkX3doZW4gPSBqaWZmaWVzOworCQkJCWxpc3RfbW92ZSgmaW5vZGUtPmlfbGlzdCwgJnNiLT5zX2RpcnR5KTsKKwkJCX0KKwkJfSBlbHNlIGlmIChpbm9kZS0+aV9zdGF0ZSAmIElfRElSVFkpIHsKKwkJCS8qCisJCQkgKiBTb21lb25lIHJlZGlydGllZCB0aGUgaW5vZGUgd2hpbGUgd2VyZSB3cml0aW5nIGJhY2sKKwkJCSAqIHRoZSBwYWdlcy4KKwkJCSAqLworCQkJbGlzdF9tb3ZlKCZpbm9kZS0+aV9saXN0LCAmc2ItPnNfZGlydHkpOworCQl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZpbm9kZS0+aV9jb3VudCkpIHsKKwkJCS8qCisJCQkgKiBUaGUgaW5vZGUgaXMgY2xlYW4sIGludXNlCisJCQkgKi8KKwkJCWxpc3RfbW92ZSgmaW5vZGUtPmlfbGlzdCwgJmlub2RlX2luX3VzZSk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogVGhlIGlub2RlIGlzIGNsZWFuLCB1bnVzZWQKKwkJCSAqLworCQkJbGlzdF9tb3ZlKCZpbm9kZS0+aV9saXN0LCAmaW5vZGVfdW51c2VkKTsKKwkJCWlub2Rlc19zdGF0Lm5yX3VudXNlZCsrOworCQl9CisJfQorCXdha2VfdXBfaW5vZGUoaW5vZGUpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBXcml0ZSBvdXQgYW4gaW5vZGUncyBkaXJ0eSBwYWdlcy4gIENhbGxlZCB1bmRlciBpbm9kZV9sb2NrLgorICovCitzdGF0aWMgaW50CitfX3dyaXRlYmFja19zaW5nbGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCXdhaXRfcXVldWVfaGVhZF90ICp3cWg7CisKKwlpZiAoKHdiYy0+c3luY19tb2RlICE9IFdCX1NZTkNfQUxMKSAmJiAoaW5vZGUtPmlfc3RhdGUgJiBJX0xPQ0spKSB7CisJCWxpc3RfbW92ZSgmaW5vZGUtPmlfbGlzdCwgJmlub2RlLT5pX3NiLT5zX2RpcnR5KTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBJdCdzIGEgZGF0YS1pbnRlZ3JpdHkgc3luYy4gIFdlIG11c3Qgd2FpdC4KKwkgKi8KKwlpZiAoaW5vZGUtPmlfc3RhdGUgJiBJX0xPQ0spIHsKKwkJREVGSU5FX1dBSVRfQklUKHdxLCAmaW5vZGUtPmlfc3RhdGUsIF9fSV9MT0NLKTsKKworCQl3cWggPSBiaXRfd2FpdHF1ZXVlKCZpbm9kZS0+aV9zdGF0ZSwgX19JX0xPQ0spOworCQlkbyB7CisJCQlfX2lnZXQoaW5vZGUpOworCQkJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworCQkJX193YWl0X29uX2JpdCh3cWgsICZ3cSwgaW5vZGVfd2FpdCwKKwkJCQkJCQlUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQlpcHV0KGlub2RlKTsKKwkJCXNwaW5fbG9jaygmaW5vZGVfbG9jayk7CisJCX0gd2hpbGUgKGlub2RlLT5pX3N0YXRlICYgSV9MT0NLKTsKKwl9CisJcmV0dXJuIF9fc3luY19zaW5nbGVfaW5vZGUoaW5vZGUsIHdiYyk7Cit9CisKKy8qCisgKiBXcml0ZSBvdXQgYSBzdXBlcmJsb2NrJ3MgbGlzdCBvZiBkaXJ0eSBpbm9kZXMuICBBIHdhaXQgd2lsbCBiZSBwZXJmb3JtZWQKKyAqIHVwb24gbm8gaW5vZGVzLCBhbGwgaW5vZGVzIG9yIHRoZSBmaW5hbCBvbmUsIGRlcGVuZGluZyB1cG9uIHN5bmNfbW9kZS4KKyAqCisgKiBJZiBvbGRlcl90aGFuX3RoaXMgaXMgbm9uLU5VTEwsIHRoZW4gb25seSB3cml0ZSBvdXQgaW5vZGVzIHdoaWNoCisgKiBoYWQgdGhlaXIgZmlyc3QgZGlydHlpbmcgYXQgYSB0aW1lIGVhcmxpZXIgdGhhbiAqb2xkZXJfdGhhbl90aGlzLgorICoKKyAqIElmIHdlJ3JlIGEgcGRsZnVzaCB0aHJlYWQsIHRoZW4gaW1wbGVtZW50IHBkZmx1c2ggY29sbGlzaW9uIGF2b2lkYW5jZQorICogYWdhaW5zdCB0aGUgZW50aXJlIGxpc3QuCisgKgorICogV0JfU1lOQ19IT0xEIGlzIGEgaGFjayBmb3Igc3lzX3N5bmMoKTogcmVhdHRhY2ggdGhlIGlub2RlIHRvIHNiLT5zX2RpcnR5IHNvCisgKiB0aGF0IGl0IGNhbiBiZSBsb2NhdGVkIGZvciB3YWl0aW5nIG9uIGluIF9fd3JpdGViYWNrX3NpbmdsZV9pbm9kZSgpLgorICoKKyAqIENhbGxlZCB1bmRlciBpbm9kZV9sb2NrLgorICoKKyAqIElmIGBiZGknIGlzIG5vbi16ZXJvIHRoZW4gd2UncmUgYmVpbmcgYXNrZWQgdG8gd3JpdGViYWNrIGEgc3BlY2lmaWMgcXVldWUuCisgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB0aGUgYmxvY2tkZXYgc3VwZXJibG9jaydzIGlub2RlcyBhcmUgYmFja2VkIGJ5CisgKiBhIHZhcmlldHkgb2YgcXVldWVzLCBzbyBhbGwgaW5vZGVzIGFyZSBzZWFyY2hlZC4gIEZvciBvdGhlciBzdXBlcmJsb2NrcywKKyAqIGFzc3VtZSB0aGF0IGFsbCBpbm9kZXMgYXJlIGJhY2tlZCBieSB0aGUgc2FtZSBxdWV1ZS4KKyAqCisgKiBGSVhNRTogdGhpcyBsaW5lYXIgc2VhcmNoIGNvdWxkIGdldCBleHBlbnNpdmUgd2l0aCBtYW55IGZpbGV5c3RlbXMuICBCdXQKKyAqIGhvdyB0byBmaXg/ICBXZSBuZWVkIHRvIGdvIGZyb20gYW4gYWRkcmVzc19zcGFjZSB0byBhbGwgaW5vZGVzIHdoaWNoIHNoYXJlCisgKiBhIHF1ZXVlIHdpdGggdGhhdCBhZGRyZXNzX3NwYWNlLiAgKEVhc3k6IGhhdmUgYSBnbG9iYWwgImRpcnR5IHN1cGVyYmxvY2tzIgorICogbGlzdCkuCisgKgorICogVGhlIGlub2RlcyB0byBiZSB3cml0dGVuIGFyZSBwYXJrZWQgb24gc2ItPnNfaW8uICBUaGV5IGFyZSBtb3ZlZCBiYWNrIG9udG8KKyAqIHNiLT5zX2RpcnR5IGFzIHRoZXkgYXJlIHNlbGVjdGVkIGZvciB3cml0aW5nLiAgVGhpcyB3YXksIG5vbmUgY2FuIGJlIG1pc3NlZAorICogb24gdGhlIHdyaXRlciB0aHJvdHRsaW5nIHBhdGgsIGFuZCB3ZSBnZXQgZGVjZW50IGJhbGFuY2luZyBiZXR3ZWVuIG1hbnkKKyAqIHRocm90dGxlZCB0aHJlYWRzOiB3ZSBkb24ndCB3YW50IHRoZW0gYWxsIHBpbGluZyB1cCBvbiBfX3dhaXRfb25faW5vZGUuCisgKi8KK3N0YXRpYyB2b2lkCitzeW5jX3NiX2lub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwljb25zdCB1bnNpZ25lZCBsb25nIHN0YXJ0ID0gamlmZmllczsJLyogbGl2ZWxvY2sgYXZvaWRhbmNlICovCisKKwlpZiAoIXdiYy0+Zm9yX2t1cGRhdGUgfHwgbGlzdF9lbXB0eSgmc2ItPnNfaW8pKQorCQlsaXN0X3NwbGljZV9pbml0KCZzYi0+c19kaXJ0eSwgJnNiLT5zX2lvKTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmc2ItPnNfaW8pKSB7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBsaXN0X2VudHJ5KHNiLT5zX2lvLnByZXYsCisJCQkJCQlzdHJ1Y3QgaW5vZGUsIGlfbGlzdCk7CisJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKKwkJc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSA9IG1hcHBpbmctPmJhY2tpbmdfZGV2X2luZm87CisJCWxvbmcgcGFnZXNfc2tpcHBlZDsKKworCQlpZiAoIWJkaV9jYXBfd3JpdGViYWNrX2RpcnR5KGJkaSkpIHsKKwkJCWxpc3RfbW92ZSgmaW5vZGUtPmlfbGlzdCwgJnNiLT5zX2RpcnR5KTsKKwkJCWlmIChzYiA9PSBibG9ja2Rldl9zdXBlcmJsb2NrKSB7CisJCQkJLyoKKwkJCQkgKiBEaXJ0eSBtZW1vcnktYmFja2VkIGJsb2NrZGV2OiB0aGUgcmFtZGlzaworCQkJCSAqIGRyaXZlciBkb2VzIHRoaXMuICBTa2lwIGp1c3QgdGhpcyBpbm9kZQorCQkJCSAqLworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyoKKwkJCSAqIERpcnR5IG1lbW9yeS1iYWNrZWQgaW5vZGUgYWdhaW5zdCBhIGZpbGVzeXN0ZW0gb3RoZXIKKwkJCSAqIHRoYW4gdGhlIGtlcm5lbC1pbnRlcm5hbCBiZGV2IGZpbGVzeXN0ZW0uICBTa2lwIHRoZQorCQkJICogZW50aXJlIHN1cGVyYmxvY2suCisJCQkgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHdiYy0+bm9uYmxvY2tpbmcgJiYgYmRpX3dyaXRlX2Nvbmdlc3RlZChiZGkpKSB7CisJCQl3YmMtPmVuY291bnRlcmVkX2Nvbmdlc3Rpb24gPSAxOworCQkJaWYgKHNiICE9IGJsb2NrZGV2X3N1cGVyYmxvY2spCisJCQkJYnJlYWs7CQkvKiBTa2lwIGEgY29uZ2VzdGVkIGZzICovCisJCQlsaXN0X21vdmUoJmlub2RlLT5pX2xpc3QsICZzYi0+c19kaXJ0eSk7CisJCQljb250aW51ZTsJCS8qIFNraXAgYSBjb25nZXN0ZWQgYmxvY2tkZXYgKi8KKwkJfQorCisJCWlmICh3YmMtPmJkaSAmJiBiZGkgIT0gd2JjLT5iZGkpIHsKKwkJCWlmIChzYiAhPSBibG9ja2Rldl9zdXBlcmJsb2NrKQorCQkJCWJyZWFrOwkJLyogZnMgaGFzIHRoZSB3cm9uZyBxdWV1ZSAqLworCQkJbGlzdF9tb3ZlKCZpbm9kZS0+aV9saXN0LCAmc2ItPnNfZGlydHkpOworCQkJY29udGludWU7CQkvKiBibG9ja2RldiBoYXMgd3JvbmcgcXVldWUgKi8KKwkJfQorCisJCS8qIFdhcyB0aGlzIGlub2RlIGRpcnRpZWQgYWZ0ZXIgc3luY19zYl9pbm9kZXMgd2FzIGNhbGxlZD8gKi8KKwkJaWYgKHRpbWVfYWZ0ZXIoaW5vZGUtPmRpcnRpZWRfd2hlbiwgc3RhcnQpKQorCQkJYnJlYWs7CisKKwkJLyogV2FzIHRoaXMgaW5vZGUgZGlydGllZCB0b28gcmVjZW50bHk/ICovCisJCWlmICh3YmMtPm9sZGVyX3RoYW5fdGhpcyAmJiB0aW1lX2FmdGVyKGlub2RlLT5kaXJ0aWVkX3doZW4sCisJCQkJCQkqd2JjLT5vbGRlcl90aGFuX3RoaXMpKQorCQkJYnJlYWs7CisKKwkJLyogSXMgYW5vdGhlciBwZGZsdXNoIGFscmVhZHkgZmx1c2hpbmcgdGhpcyBxdWV1ZT8gKi8KKwkJaWYgKGN1cnJlbnRfaXNfcGRmbHVzaCgpICYmICF3cml0ZWJhY2tfYWNxdWlyZShiZGkpKQorCQkJYnJlYWs7CisKKwkJQlVHX09OKGlub2RlLT5pX3N0YXRlICYgSV9GUkVFSU5HKTsKKwkJX19pZ2V0KGlub2RlKTsKKwkJcGFnZXNfc2tpcHBlZCA9IHdiYy0+cGFnZXNfc2tpcHBlZDsKKwkJX193cml0ZWJhY2tfc2luZ2xlX2lub2RlKGlub2RlLCB3YmMpOworCQlpZiAod2JjLT5zeW5jX21vZGUgPT0gV0JfU1lOQ19IT0xEKSB7CisJCQlpbm9kZS0+ZGlydGllZF93aGVuID0gamlmZmllczsKKwkJCWxpc3RfbW92ZSgmaW5vZGUtPmlfbGlzdCwgJnNiLT5zX2RpcnR5KTsKKwkJfQorCQlpZiAoY3VycmVudF9pc19wZGZsdXNoKCkpCisJCQl3cml0ZWJhY2tfcmVsZWFzZShiZGkpOworCQlpZiAod2JjLT5wYWdlc19za2lwcGVkICE9IHBhZ2VzX3NraXBwZWQpIHsKKwkJCS8qCisJCQkgKiB3cml0ZWJhY2sgaXMgbm90IG1ha2luZyBwcm9ncmVzcyBkdWUgdG8gbG9ja2VkCisJCQkgKiBidWZmZXJzLiAgU2tpcCB0aGlzIGlub2RlIGZvciBub3cuCisJCQkgKi8KKwkJCWxpc3RfbW92ZSgmaW5vZGUtPmlfbGlzdCwgJnNiLT5zX2RpcnR5KTsKKwkJfQorCQlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CisJCWNvbmRfcmVzY2hlZCgpOworCQlpcHV0KGlub2RlKTsKKwkJc3Bpbl9sb2NrKCZpbm9kZV9sb2NrKTsKKwkJaWYgKHdiYy0+bnJfdG9fd3JpdGUgPD0gMCkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm47CQkvKiBMZWF2ZSBhbnkgdW53cml0dGVuIGlub2RlcyBvbiBzX2lvICovCit9CisKKy8qCisgKiBTdGFydCB3cml0ZWJhY2sgb2YgZGlydHkgcGFnZWNhY2hlIGRhdGEgYWdhaW5zdCBhbGwgdW5sb2NrZWQgaW5vZGVzLgorICoKKyAqIE5vdGU6CisgKiBXZSBkb24ndCBuZWVkIHRvIGdyYWIgYSByZWZlcmVuY2UgdG8gc3VwZXJibG9jayBoZXJlLiBJZiBpdCBoYXMgbm9uLWVtcHR5CisgKiAtPnNfZGlydHkgaXQncyBoYWRuJ3QgYmVlbiBraWxsZWQgeWV0IGFuZCBraWxsX3N1cGVyKCkgd29uJ3QgcHJvY2VlZAorICogcGFzdCBzeW5jX2lub2Rlc19zYigpIHVudGlsIGJvdGggdGhlIC0+c19kaXJ0eSBhbmQgLT5zX2lvIGxpc3RzIGFyZQorICogZW1wdHkuIFNpbmNlIF9fc3luY19zaW5nbGVfaW5vZGUoKSByZWdhaW5zIGlub2RlX2xvY2sgYmVmb3JlIGl0IGZpbmFsbHkgbW92ZXMKKyAqIGlub2RlIGZyb20gc3VwZXJibG9jayBsaXN0cyB3ZSBhcmUgT0suCisgKgorICogSWYgYG9sZGVyX3RoYW5fdGhpcycgaXMgbm9uLXplcm8gdGhlbiBvbmx5IGZsdXNoIGlub2RlcyB3aGljaCBoYXZlIGEKKyAqIGZsdXNodGltZSBvbGRlciB0aGFuICpvbGRlcl90aGFuX3RoaXMuCisgKgorICogSWYgYGJkaScgaXMgbm9uLXplcm8gdGhlbiB3ZSB3aWxsIHNjYW4gdGhlIGZpcnN0IGlub2RlIGFnYWluc3QgZWFjaAorICogc3VwZXJibG9jayB1bnRpbCB3ZSBmaW5kIHRoZSBtYXRjaGluZyBvbmVzLiAgT25lIGdyb3VwIHdpbGwgYmUgdGhlIGRpcnR5CisgKiBpbm9kZXMgYWdhaW5zdCBhIGZpbGVzeXN0ZW0uICBUaGVuIHdoZW4gd2UgaGl0IHRoZSBkdW1teSBibG9ja2RldiBzdXBlcmJsb2NrLAorICogc3luY19zYl9pbm9kZXMgd2lsbCBzZWVrb3V0IHRoZSBibG9ja2RldiB3aGljaCBtYXRjaGVzIGBiZGknLiAgTWF5YmUgbm90CisgKiBzdXBlci1lZmZpY2llbnQgYnV0IHdlJ3JlIGFib3V0IHRvIGRvIGEgdG9uIG9mIEkvTy4uLgorICovCit2b2lkCit3cml0ZWJhY2tfaW5vZGVzKHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisKKwltaWdodF9zbGVlcCgpOworCXNwaW5fbG9jaygmc2JfbG9jayk7CityZXN0YXJ0OgorCXNiID0gc2JfZW50cnkoc3VwZXJfYmxvY2tzLnByZXYpOworCWZvciAoOyBzYiAhPSBzYl9lbnRyeSgmc3VwZXJfYmxvY2tzKTsgc2IgPSBzYl9lbnRyeShzYi0+c19saXN0LnByZXYpKSB7CisJCWlmICghbGlzdF9lbXB0eSgmc2ItPnNfZGlydHkpIHx8ICFsaXN0X2VtcHR5KCZzYi0+c19pbykpIHsKKwkJCS8qIHdlJ3JlIG1ha2luZyBvdXIgb3duIGdldF9zdXBlciBoZXJlICovCisJCQlzYi0+c19jb3VudCsrOworCQkJc3Bpbl91bmxvY2soJnNiX2xvY2spOworCQkJLyoKKwkJCSAqIElmIHdlIGNhbid0IGdldCB0aGUgcmVhZGxvY2ssIHRoZXJlJ3Mgbm8gc2Vuc2UgaW4KKwkJCSAqIHdhaXRpbmcgYXJvdW5kLCBtb3N0IG9mIHRoZSB0aW1lIHRoZSBGUyBpcyBnb2luZyB0bworCQkJICogYmUgdW5tb3VudGVkIGJ5IHRoZSB0aW1lIGl0IGlzIHJlbGVhc2VkLgorCQkJICovCisJCQlpZiAoZG93bl9yZWFkX3RyeWxvY2soJnNiLT5zX3Vtb3VudCkpIHsKKwkJCQlpZiAoc2ItPnNfcm9vdCkgeworCQkJCQlzcGluX2xvY2soJmlub2RlX2xvY2spOworCQkJCQlzeW5jX3NiX2lub2RlcyhzYiwgd2JjKTsKKwkJCQkJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworCQkJCX0KKwkJCQl1cF9yZWFkKCZzYi0+c191bW91bnQpOworCQkJfQorCQkJc3Bpbl9sb2NrKCZzYl9sb2NrKTsKKwkJCWlmIChfX3B1dF9zdXBlcl9hbmRfbmVlZF9yZXN0YXJ0KHNiKSkKKwkJCQlnb3RvIHJlc3RhcnQ7CisJCX0KKwkJaWYgKHdiYy0+bnJfdG9fd3JpdGUgPD0gMCkKKwkJCWJyZWFrOworCX0KKwlzcGluX3VubG9jaygmc2JfbG9jayk7Cit9CisKKy8qCisgKiB3cml0ZWJhY2sgYW5kIHdhaXQgdXBvbiB0aGUgZmlsZXN5c3RlbSdzIGRpcnR5IGlub2Rlcy4gIFRoZSBjYWxsZXIgd2lsbAorICogZG8gdGhpcyBpbiB0d28gcGFzc2VzIC0gb25lIHRvIHdyaXRlLCBhbmQgb25lIHRvIHdhaXQuICBXQl9TWU5DX0hPTEQgaXMKKyAqIHVzZWQgdG8gcGFyayB0aGUgd3JpdHRlbiBpbm9kZXMgb24gc2ItPnNfZGlydHkgZm9yIHRoZSB3YWl0IHBhc3MuCisgKgorICogQSBmaW5pdGUgbGltaXQgaXMgc2V0IG9uIHRoZSBudW1iZXIgb2YgcGFnZXMgd2hpY2ggd2lsbCBiZSB3cml0dGVuLgorICogVG8gcHJldmVudCBpbmZpbml0ZSBsaXZlbG9jayBvZiBzeXNfc3luYygpLgorICoKKyAqIFdlIGFkZCBpbiB0aGUgbnVtYmVyIG9mIHBvdGVudGlhbGx5IGRpcnR5IGlub2RlcywgYmVjYXVzZSBlYWNoIGlub2RlIHdyaXRlCisgKiBjYW4gZGlydHkgcGFnZWNhY2hlIGluIHRoZSB1bmRlcmx5aW5nIGJsb2NrZGV2LgorICovCit2b2lkIHN5bmNfaW5vZGVzX3NiKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB3YWl0KQoreworCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCB3YmMgPSB7CisJCS5zeW5jX21vZGUJPSB3YWl0ID8gV0JfU1lOQ19BTEwgOiBXQl9TWU5DX0hPTEQsCisJfTsKKwl1bnNpZ25lZCBsb25nIG5yX2RpcnR5ID0gcmVhZF9wYWdlX3N0YXRlKG5yX2RpcnR5KTsKKwl1bnNpZ25lZCBsb25nIG5yX3Vuc3RhYmxlID0gcmVhZF9wYWdlX3N0YXRlKG5yX3Vuc3RhYmxlKTsKKworCXdiYy5ucl90b193cml0ZSA9IG5yX2RpcnR5ICsgbnJfdW5zdGFibGUgKworCQkJKGlub2Rlc19zdGF0Lm5yX2lub2RlcyAtIGlub2Rlc19zdGF0Lm5yX3VudXNlZCkgKworCQkJbnJfZGlydHkgKyBucl91bnN0YWJsZTsKKwl3YmMubnJfdG9fd3JpdGUgKz0gd2JjLm5yX3RvX3dyaXRlIC8gMjsJCS8qIEJpdCBtb3JlIGZvciBsdWNrICovCisJc3Bpbl9sb2NrKCZpbm9kZV9sb2NrKTsKKwlzeW5jX3NiX2lub2RlcyhzYiwgJndiYyk7CisJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworfQorCisvKgorICogUmF0aGVyIGxhbWUgbGl2ZWxvY2sgYXZvaWRhbmNlLgorICovCitzdGF0aWMgdm9pZCBzZXRfc2Jfc3luY2luZyhpbnQgdmFsKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJc3Bpbl9sb2NrKCZzYl9sb2NrKTsKKwlzYiA9IHNiX2VudHJ5KHN1cGVyX2Jsb2Nrcy5wcmV2KTsKKwlmb3IgKDsgc2IgIT0gc2JfZW50cnkoJnN1cGVyX2Jsb2Nrcyk7IHNiID0gc2JfZW50cnkoc2ItPnNfbGlzdC5wcmV2KSkgeworCQlzYi0+c19zeW5jaW5nID0gdmFsOworCX0KKwlzcGluX3VubG9jaygmc2JfbG9jayk7Cit9CisKKy8qCisgKiBGaW5kIGEgc3VwZXJibG9jayB3aXRoIGlub2RlcyB0aGF0IG5lZWQgdG8gYmUgc3luY2VkCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmdldF9zdXBlcl90b19zeW5jKHZvaWQpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKK3Jlc3RhcnQ6CisJc3Bpbl9sb2NrKCZzYl9sb2NrKTsKKwlzYiA9IHNiX2VudHJ5KHN1cGVyX2Jsb2Nrcy5wcmV2KTsKKwlmb3IgKDsgc2IgIT0gc2JfZW50cnkoJnN1cGVyX2Jsb2Nrcyk7IHNiID0gc2JfZW50cnkoc2ItPnNfbGlzdC5wcmV2KSkgeworCQlpZiAoc2ItPnNfc3luY2luZykKKwkJCWNvbnRpbnVlOworCQlzYi0+c19zeW5jaW5nID0gMTsKKwkJc2ItPnNfY291bnQrKzsKKwkJc3Bpbl91bmxvY2soJnNiX2xvY2spOworCQlkb3duX3JlYWQoJnNiLT5zX3Vtb3VudCk7CisJCWlmICghc2ItPnNfcm9vdCkgeworCQkJZHJvcF9zdXBlcihzYik7CisJCQlnb3RvIHJlc3RhcnQ7CisJCX0KKwkJcmV0dXJuIHNiOworCX0KKwlzcGluX3VubG9jaygmc2JfbG9jayk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogc3luY19pbm9kZXMKKyAqCisgKiBzeW5jX2lub2RlcygpIGdvZXMgdGhyb3VnaCBlYWNoIHN1cGVyIGJsb2NrJ3MgZGlydHkgaW5vZGUgbGlzdCwgd3JpdGVzIHRoZQorICogaW5vZGVzIG91dCwgd2FpdHMgb24gdGhlIHdyaXRlb3V0IGFuZCBwdXRzIHRoZSBpbm9kZXMgYmFjayBvbiB0aGUgbm9ybWFsCisgKiBsaXN0LgorICoKKyAqIFRoaXMgaXMgZm9yIHN5c19zeW5jKCkuICBmc3luY19kZXYoKSB1c2VzIHRoZSBzYW1lIGFsZ29yaXRobS4gIFRoZSBzdWJ0bGUKKyAqIHBhcnQgb2YgdGhlIHN5bmMgZnVuY3Rpb25zIGlzIHRoYXQgdGhlIGJsb2NrZGV2ICJzdXBlcmJsb2NrIiBpcyBwcm9jZXNzZWQKKyAqIGxhc3QuICBUaGlzIGlzIGJlY2F1c2UgdGhlIHdyaXRlX2lub2RlKCkgZnVuY3Rpb24gb2YgYSB0eXBpY2FsIGZzIHdpbGwKKyAqIHBlcmZvcm0gbm8gSS9PLCBidXQgd2lsbCBtYXJrIGJ1ZmZlcnMgaW4gdGhlIGJsb2NrZGV2IG1hcHBpbmcgYXMgZGlydHkuCisgKiBXaGF0IHdlIHdhbnQgdG8gZG8gaXMgdG8gcGVyZm9ybSBhbGwgdGhhdCBkaXJ0eWluZyBmaXJzdCwgYW5kIHRoZW4gd3JpdGUKKyAqIGJhY2sgYWxsIHRob3NlIGlub2RlIGJsb2NrcyB2aWEgdGhlIGJsb2NrZGV2IG1hcHBpbmcgaW4gb25lIHN3ZWVwLiAgU28gdGhlCisgKiBhZGRpdGlvbmFsIChzb21ld2hhdCByZWR1bmRhbnQpIHN5bmNfYmxvY2tkZXYoKSBjYWxscyBoZXJlIGFyZSB0byBtYWtlCisgKiBzdXJlIHRoYXQgcmVhbGx5IGhhcHBlbnMuICBCZWNhdXNlIGlmIHdlIGNhbGwgc3luY19pbm9kZXNfc2Iod2FpdD0xKSB3aXRoCisgKiBvdXRzdGFuZGluZyBkaXJ0eSBpbm9kZXMsIHRoZSB3cml0ZWJhY2sgZ29lcyBibG9jay1hdC1hLXRpbWUgd2l0aGluIHRoZQorICogZmlsZXN5c3RlbSdzIHdyaXRlX2lub2RlKCkuICBUaGlzIGlzIGV4dHJlbWVseSBzbG93LgorICovCit2b2lkIHN5bmNfaW5vZGVzKGludCB3YWl0KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisKKwlzZXRfc2Jfc3luY2luZygwKTsKKwl3aGlsZSAoKHNiID0gZ2V0X3N1cGVyX3RvX3N5bmMoKSkgIT0gTlVMTCkgeworCQlzeW5jX2lub2Rlc19zYihzYiwgMCk7CisJCXN5bmNfYmxvY2tkZXYoc2ItPnNfYmRldik7CisJCWRyb3Bfc3VwZXIoc2IpOworCX0KKwlpZiAod2FpdCkgeworCQlzZXRfc2Jfc3luY2luZygwKTsKKwkJd2hpbGUgKChzYiA9IGdldF9zdXBlcl90b19zeW5jKCkpICE9IE5VTEwpIHsKKwkJCXN5bmNfaW5vZGVzX3NiKHNiLCAxKTsKKwkJCXN5bmNfYmxvY2tkZXYoc2ItPnNfYmRldik7CisJCQlkcm9wX3N1cGVyKHNiKTsKKwkJfQorCX0KK30KKworLyoqCisgKgl3cml0ZV9pbm9kZV9ub3cJLQl3cml0ZSBhbiBpbm9kZSB0byBkaXNrCisgKglAaW5vZGU6IGlub2RlIHRvIHdyaXRlIHRvIGRpc2sKKyAqCUBzeW5jOiB3aGV0aGVyIHRoZSB3cml0ZSBzaG91bGQgYmUgc3luY2hyb25vdXMgb3Igbm90CisgKgorICoJVGhpcyBmdW5jdGlvbiBjb21taXRzIGFuIGlub2RlIHRvIGRpc2sgaW1tZWRpYXRlbHkgaWYgaXQgaXMKKyAqCWRpcnR5LiBUaGlzIGlzIHByaW1hcmlseSBuZWVkZWQgYnkga25mc2QuCisgKi8KKyAKK2ludCB3cml0ZV9pbm9kZV9ub3coc3RydWN0IGlub2RlICppbm9kZSwgaW50IHN5bmMpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgd2JjID0geworCQkubnJfdG9fd3JpdGUgPSBMT05HX01BWCwKKwkJLnN5bmNfbW9kZSA9IFdCX1NZTkNfQUxMLAorCX07CisKKwlpZiAoIW1hcHBpbmdfY2FwX3dyaXRlYmFja19kaXJ0eShpbm9kZS0+aV9tYXBwaW5nKSkKKwkJcmV0dXJuIDA7CisKKwltaWdodF9zbGVlcCgpOworCXNwaW5fbG9jaygmaW5vZGVfbG9jayk7CisJcmV0ID0gX193cml0ZWJhY2tfc2luZ2xlX2lub2RlKGlub2RlLCAmd2JjKTsKKwlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CisJaWYgKHN5bmMpCisJCXdhaXRfb25faW5vZGUoaW5vZGUpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHdyaXRlX2lub2RlX25vdyk7CisKKy8qKgorICogc3luY19pbm9kZSAtIHdyaXRlIGFuIGlub2RlIGFuZCBpdHMgcGFnZXMgdG8gZGlzay4KKyAqIEBpbm9kZTogdGhlIGlub2RlIHRvIHN5bmMKKyAqIEB3YmM6IGNvbnRyb2xzIHRoZSB3cml0ZWJhY2sgbW9kZQorICoKKyAqIHN5bmNfaW5vZGUoKSB3aWxsIHdyaXRlIGFuIGlub2RlIGFuZCBpdHMgcGFnZXMgdG8gZGlzay4gIEl0IHdpbGwgYWxzbworICogY29ycmVjdGx5IHVwZGF0ZSB0aGUgaW5vZGUgb24gaXRzIHN1cGVyYmxvY2sncyBkaXJ0eSBpbm9kZSBsaXN0cyBhbmQgd2lsbAorICogdXBkYXRlIGlub2RlLT5pX3N0YXRlLgorICoKKyAqIFRoZSBjYWxsZXIgbXVzdCBoYXZlIGEgcmVmIG9uIHRoZSBpbm9kZS4KKyAqLworaW50IHN5bmNfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7CisJaW50IHJldDsKKworCXNwaW5fbG9jaygmaW5vZGVfbG9jayk7CisJcmV0ID0gX193cml0ZWJhY2tfc2luZ2xlX2lub2RlKGlub2RlLCB3YmMpOworCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChzeW5jX2lub2RlKTsKKworLyoqCisgKiBnZW5lcmljX29zeW5jX2lub2RlIC0gZmx1c2ggYWxsIGRpcnR5IGRhdGEgZm9yIGEgZ2l2ZW4gaW5vZGUgdG8gZGlzaworICogQGlub2RlOiBpbm9kZSB0byB3cml0ZQorICogQHdoYXQ6ICB3aGF0IHRvIHdyaXRlIGFuZCB3YWl0IHVwb24KKyAqCisgKiBUaGlzIGNhbiBiZSBjYWxsZWQgYnkgZmlsZV93cml0ZSBmdW5jdGlvbnMgZm9yIGZpbGVzIHdoaWNoIGhhdmUgdGhlCisgKiBPX1NZTkMgZmxhZyBzZXQsIHRvIGZsdXNoIGRpcnR5IHdyaXRlcyB0byBkaXNrLgorICoKKyAqIEB3aGF0IGlzIGEgYml0bWFzaywgc3BlY2lmeWluZyB3aGljaCBwYXJ0IG9mIHRoZSBpbm9kZSdzIGRhdGEgc2hvdWxkIGJlCisgKiB3cml0dGVuIGFuZCB3YWl0ZWQgdXBvbjoKKyAqCisgKiAgICBPU1lOQ19EQVRBOiAgICAgaV9tYXBwaW5nJ3MgZGlydHkgZGF0YQorICogICAgT1NZTkNfTUVUQURBVEE6IHRoZSBidWZmZXJzIGF0IGlfbWFwcGluZy0+cHJpdmF0ZV9saXN0CisgKiAgICBPU1lOQ19JTk9ERTogICAgdGhlIGlub2RlIGl0c2VsZgorICovCisKK2ludCBnZW5lcmljX29zeW5jX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBpbnQgd2hhdCkKK3sKKwlpbnQgZXJyID0gMDsKKwlpbnQgbmVlZF93cml0ZV9pbm9kZV9ub3cgPSAwOworCWludCBlcnIyOworCisJY3VycmVudC0+ZmxhZ3MgfD0gUEZfU1lOQ1dSSVRFOworCWlmICh3aGF0ICYgT1NZTkNfREFUQSkKKwkJZXJyID0gZmlsZW1hcF9mZGF0YXdyaXRlKG1hcHBpbmcpOworCWlmICh3aGF0ICYgKE9TWU5DX01FVEFEQVRBfE9TWU5DX0RBVEEpKSB7CisJCWVycjIgPSBzeW5jX21hcHBpbmdfYnVmZmVycyhtYXBwaW5nKTsKKwkJaWYgKCFlcnIpCisJCQllcnIgPSBlcnIyOworCX0KKwlpZiAod2hhdCAmIE9TWU5DX0RBVEEpIHsKKwkJZXJyMiA9IGZpbGVtYXBfZmRhdGF3YWl0KG1hcHBpbmcpOworCQlpZiAoIWVycikKKwkJCWVyciA9IGVycjI7CisJfQorCWN1cnJlbnQtPmZsYWdzICY9IH5QRl9TWU5DV1JJVEU7CisKKwlzcGluX2xvY2soJmlub2RlX2xvY2spOworCWlmICgoaW5vZGUtPmlfc3RhdGUgJiBJX0RJUlRZKSAmJgorCSAgICAoKHdoYXQgJiBPU1lOQ19JTk9ERSkgfHwgKGlub2RlLT5pX3N0YXRlICYgSV9ESVJUWV9EQVRBU1lOQykpKQorCQluZWVkX3dyaXRlX2lub2RlX25vdyA9IDE7CisJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworCisJaWYgKG5lZWRfd3JpdGVfaW5vZGVfbm93KSB7CisJCWVycjIgPSB3cml0ZV9pbm9kZV9ub3coaW5vZGUsIDEpOworCQlpZiAoIWVycikKKwkJCWVyciA9IGVycjI7CisJfQorCWVsc2UKKwkJd2FpdF9vbl9pbm9kZShpbm9kZSk7CisKKwlyZXR1cm4gZXJyOworfQorCitFWFBPUlRfU1lNQk9MKGdlbmVyaWNfb3N5bmNfaW5vZGUpOworCisvKioKKyAqIHdyaXRlYmFja19hY3F1aXJlOiBhdHRlbXB0IHRvIGdldCBleGNsdXNpdmUgd3JpdGViYWNrIGFjY2VzcyB0byBhIGRldmljZQorICogQGJkaTogdGhlIGRldmljZSdzIGJhY2tpbmdfZGV2X2luZm8gc3RydWN0dXJlCisgKgorICogSXQgaXMgYSB3YXN0ZSBvZiByZXNvdXJjZXMgdG8gaGF2ZSBtb3JlIHRoYW4gb25lIHBkZmx1c2ggdGhyZWFkIGJsb2NrZWQgb24KKyAqIGEgc2luZ2xlIHJlcXVlc3QgcXVldWUuICBFeGNsdXNpb24gYXQgdGhlIHJlcXVlc3RfcXVldWUgbGV2ZWwgaXMgb2J0YWluZWQKKyAqIHZpYSBhIGZsYWcgaW4gdGhlIHJlcXVlc3RfcXVldWUncyBiYWNraW5nX2Rldl9pbmZvLnN0YXRlLgorICoKKyAqIE5vbi1yZXF1ZXN0X3F1ZXVlLWJhY2tlZCBhZGRyZXNzX3NwYWNlcyB3aWxsIHNoYXJlIGRlZmF1bHRfYmFja2luZ19kZXZfaW5mbywKKyAqIHVubGVzcyB0aGV5IGltcGxlbWVudCB0aGVpciBvd24uICBXaGljaCBpcyBzb21ld2hhdCBpbmVmZmljaWVudCwgYXMgdGhpcworICogbWF5IHByZXZlbnQgY29uY3VycmVudCB3cml0ZWJhY2sgYWdhaW5zdCBtdWx0aXBsZSBkZXZpY2VzLgorICovCitpbnQgd3JpdGViYWNrX2FjcXVpcmUoc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSkKK3sKKwlyZXR1cm4gIXRlc3RfYW5kX3NldF9iaXQoQkRJX3BkZmx1c2gsICZiZGktPnN0YXRlKTsKK30KKworLyoqCisgKiB3cml0ZWJhY2tfaW5fcHJvZ3Jlc3M6IGRldGVybWluZSB3aGV0aGVyIHRoZXJlIGlzIHdyaXRlYmFjayBpbiBwcm9ncmVzcworICogICAgICAgICAgICAgICAgICAgICAgICBhZ2FpbnN0IGEgYmFja2luZyBkZXZpY2UuCisgKiBAYmRpOiB0aGUgZGV2aWNlJ3MgYmFja2luZ19kZXZfaW5mbyBzdHJ1Y3R1cmUuCisgKi8KK2ludCB3cml0ZWJhY2tfaW5fcHJvZ3Jlc3Moc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSkKK3sKKwlyZXR1cm4gdGVzdF9iaXQoQkRJX3BkZmx1c2gsICZiZGktPnN0YXRlKTsKK30KKworLyoqCisgKiB3cml0ZWJhY2tfcmVsZWFzZTogcmVsaW5xdWlzaCBleGNsdXNpdmUgd3JpdGViYWNrIGFjY2VzcyBhZ2FpbnN0IGEgZGV2aWNlLgorICogQGJkaTogdGhlIGRldmljZSdzIGJhY2tpbmdfZGV2X2luZm8gc3RydWN0dXJlCisgKi8KK3ZvaWQgd3JpdGViYWNrX3JlbGVhc2Uoc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSkKK3sKKwlCVUdfT04oIXdyaXRlYmFja19pbl9wcm9ncmVzcyhiZGkpKTsKKwljbGVhcl9iaXQoQkRJX3BkZmx1c2gsICZiZGktPnN0YXRlKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2hmcy9NYWtlZmlsZSBiL2ZzL2hmcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDFmNWE4NQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmcy9NYWtlZmlsZQpAQCAtMCwwICsxLDEwIEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGludXggaGZzIGZpbGVzeXN0ZW0gcm91dGluZXMuCisjCisKK29iai0kKENPTkZJR19IRlNfRlMpICs9IGhmcy5vCisKK2hmcy1vYmpzIDo9IGJpdG1hcC5vIGJmaW5kLm8gYm5vZGUubyBicmVjLm8gYnRyZWUubyBcCisJICAgIGNhdGFsb2cubyBkaXIubyBleHRlbnQubyBpbm9kZS5vIGF0dHIubyBtZGIubyBcCisgICAgICAgICAgICBwYXJ0X3RibC5vIHN0cmluZy5vIHN1cGVyLm8gc3lzZGVwLm8gdHJhbnMubworCmRpZmYgLS1naXQgYS9mcy9oZnMvYXR0ci5jIGIvZnMvaGZzL2F0dHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDU3ZWM1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvaGZzL2F0dHIuYwpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqICBsaW51eC9mcy9oZnMvYXR0ci5jCisgKgorICogKEMpIDIwMDMgQXJkaXMgVGVjaG5vbG9naWVzIDxyb21hbkBhcmRpc3RlY2guY29tPgorICoKKyAqIEV4cG9ydCBoZnMgZGF0YSB2aWEgeGF0dHIKKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3hhdHRyLmg+CisKKyNpbmNsdWRlICJoZnNfZnMuaCIKKyNpbmNsdWRlICJidHJlZS5oIgorCitpbnQgaGZzX3NldHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwKKwkJIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGhmc19maW5kX2RhdGEgZmQ7CisJaGZzX2NhdF9yZWMgcmVjOworCXN0cnVjdCBoZnNfY2F0X2ZpbGUgKmZpbGU7CisJaW50IHJlczsKKworCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSB8fCBIRlNfSVNfUlNSQyhpbm9kZSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXJlcyA9IGhmc19maW5kX2luaXQoSEZTX1NCKGlub2RlLT5pX3NiKS0+Y2F0X3RyZWUsICZmZCk7CisJaWYgKHJlcykKKwkJcmV0dXJuIHJlczsKKwlmZC5zZWFyY2hfa2V5LT5jYXQgPSBIRlNfSShpbm9kZSktPmNhdF9rZXk7CisJcmVzID0gaGZzX2JyZWNfZmluZCgmZmQpOworCWlmIChyZXMpCisJCWdvdG8gb3V0OworCWhmc19ibm9kZV9yZWFkKGZkLmJub2RlLCAmcmVjLCBmZC5lbnRyeW9mZnNldCwKKwkJCXNpemVvZihzdHJ1Y3QgaGZzX2NhdF9maWxlKSk7CisJZmlsZSA9ICZyZWMuZmlsZTsKKworCWlmICghc3RyY21wKG5hbWUsICJoZnMudHlwZSIpKSB7CisJCWlmIChzaXplID09IDQpCisJCQltZW1jcHkoJmZpbGUtPlVzcldkcy5mZFR5cGUsIHZhbHVlLCA0KTsKKwkJZWxzZQorCQkJcmVzID0gLUVSQU5HRTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImhmcy5jcmVhdG9yIikpIHsKKwkJaWYgKHNpemUgPT0gNCkKKwkJCW1lbWNweSgmZmlsZS0+VXNyV2RzLmZkQ3JlYXRvciwgdmFsdWUsIDQpOworCQllbHNlCisJCQlyZXMgPSAtRVJBTkdFOworCX0gZWxzZQorCQlyZXMgPSAtRU9QTk9UU1VQUDsKKwlpZiAoIXJlcykKKwkJaGZzX2Jub2RlX3dyaXRlKGZkLmJub2RlLCAmcmVjLCBmZC5lbnRyeW9mZnNldCwKKwkJCQlzaXplb2Yoc3RydWN0IGhmc19jYXRfZmlsZSkpOworb3V0OgorCWhmc19maW5kX2V4aXQoJmZkKTsKKwlyZXR1cm4gcmVzOworfQorCitzc2l6ZV90IGhmc19nZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGhmc19maW5kX2RhdGEgZmQ7CisJaGZzX2NhdF9yZWMgcmVjOworCXN0cnVjdCBoZnNfY2F0X2ZpbGUgKmZpbGU7CisJc3NpemVfdCByZXMgPSAwOworCisJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpIHx8IEhGU19JU19SU1JDKGlub2RlKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKHNpemUpIHsKKwkJcmVzID0gaGZzX2ZpbmRfaW5pdChIRlNfU0IoaW5vZGUtPmlfc2IpLT5jYXRfdHJlZSwgJmZkKTsKKwkJaWYgKHJlcykKKwkJCXJldHVybiByZXM7CisJCWZkLnNlYXJjaF9rZXktPmNhdCA9IEhGU19JKGlub2RlKS0+Y2F0X2tleTsKKwkJcmVzID0gaGZzX2JyZWNfZmluZCgmZmQpOworCQlpZiAocmVzKQorCQkJZ290byBvdXQ7CisJCWhmc19ibm9kZV9yZWFkKGZkLmJub2RlLCAmcmVjLCBmZC5lbnRyeW9mZnNldCwKKwkJCQlzaXplb2Yoc3RydWN0IGhmc19jYXRfZmlsZSkpOworCX0KKwlmaWxlID0gJnJlYy5maWxlOworCisJaWYgKCFzdHJjbXAobmFtZSwgImhmcy50eXBlIikpIHsKKwkJaWYgKHNpemUgPj0gNCkgeworCQkJbWVtY3B5KHZhbHVlLCAmZmlsZS0+VXNyV2RzLmZkVHlwZSwgNCk7CisJCQlyZXMgPSA0OworCQl9IGVsc2UKKwkJCXJlcyA9IHNpemUgPyAtRVJBTkdFIDogNDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImhmcy5jcmVhdG9yIikpIHsKKwkJaWYgKHNpemUgPj0gNCkgeworCQkJbWVtY3B5KHZhbHVlLCAmZmlsZS0+VXNyV2RzLmZkQ3JlYXRvciwgNCk7CisJCQlyZXMgPSA0OworCQl9IGVsc2UKKwkJCXJlcyA9IHNpemUgPyAtRVJBTkdFIDogNDsKKwl9IGVsc2UKKwkJcmVzID0gLUVOT0RBVEE7CitvdXQ6CisJaWYgKHNpemUpCisJCWhmc19maW5kX2V4aXQoJmZkKTsKKwlyZXR1cm4gcmVzOworfQorCisjZGVmaW5lIEhGU19BVFRSTElTVF9TSVpFIChzaXplb2YoImhmcy5jcmVhdG9yIikrc2l6ZW9mKCJoZnMudHlwZSIpKQorCitzc2l6ZV90IGhmc19saXN0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisKKwlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgfHwgSEZTX0lTX1JTUkMoaW5vZGUpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoIWJ1ZmZlciB8fCAhc2l6ZSkKKwkJcmV0dXJuIEhGU19BVFRSTElTVF9TSVpFOworCWlmIChzaXplIDwgSEZTX0FUVFJMSVNUX1NJWkUpCisJCXJldHVybiAtRVJBTkdFOworCXN0cmNweShidWZmZXIsICJoZnMudHlwZSIpOworCXN0cmNweShidWZmZXIgKyBzaXplb2YoImhmcy50eXBlIiksICJoZnMuY3JlYXRvciIpOworCisJcmV0dXJuIEhGU19BVFRSTElTVF9TSVpFOworfQpkaWZmIC0tZ2l0IGEvZnMvaGZzL2JmaW5kLmMgYi9mcy9oZnMvYmZpbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTQ1MGFlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaGZzL2JmaW5kLmMKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgKiAgbGludXgvZnMvaGZzL2JmaW5kLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEKKyAqIEJyYWQgQm95ZXIgKGZsYXJAYWxsYW5kcmlhLmNvbSkKKyAqIChDKSAyMDAzIEFyZGlzIFRlY2hub2xvZ2llcyA8cm9tYW5AYXJkaXN0ZWNoLmNvbT4KKyAqCisgKiBTZWFyY2ggcm91dGluZXMgZm9yIGJ0cmVlcworICovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSAiYnRyZWUuaCIKKworaW50IGhmc19maW5kX2luaXQoc3RydWN0IGhmc19idHJlZSAqdHJlZSwgc3RydWN0IGhmc19maW5kX2RhdGEgKmZkKQoreworCXZvaWQgKnB0cjsKKworCWZkLT50cmVlID0gdHJlZTsKKwlmZC0+Ym5vZGUgPSBOVUxMOworCXB0ciA9IGttYWxsb2ModHJlZS0+bWF4X2tleV9sZW4gKiAyICsgNCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwdHIpCisJCXJldHVybiAtRU5PTUVNOworCWZkLT5zZWFyY2hfa2V5ID0gcHRyOworCWZkLT5rZXkgPSBwdHIgKyB0cmVlLT5tYXhfa2V5X2xlbiArIDI7CisJZHByaW50KERCR19CTk9ERV9SRUZTLCAiZmluZF9pbml0OiAlZCAoJXApXG4iLCB0cmVlLT5jbmlkLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOworCWRvd24oJnRyZWUtPnRyZWVfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaGZzX2ZpbmRfZXhpdChzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqZmQpCit7CisJaGZzX2Jub2RlX3B1dChmZC0+Ym5vZGUpOworCWtmcmVlKGZkLT5zZWFyY2hfa2V5KTsKKwlkcHJpbnQoREJHX0JOT0RFX1JFRlMsICJmaW5kX2V4aXQ6ICVkICglcClcbiIsIGZkLT50cmVlLT5jbmlkLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOworCXVwKCZmZC0+dHJlZS0+dHJlZV9sb2NrKTsKKwlmZC0+dHJlZSA9IE5VTEw7Cit9CisKKy8qIEZpbmQgdGhlIHJlY29yZCBpbiBibm9kZSB0aGF0IGJlc3QgbWF0Y2hlcyBrZXkgKG5vdCBncmVhdGVyIHRoYW4uLi4pKi8KK2ludCBfX2hmc19icmVjX2ZpbmQoc3RydWN0IGhmc19ibm9kZSAqYm5vZGUsIHN0cnVjdCBoZnNfZmluZF9kYXRhICpmZCkKK3sKKwlpbnQgY21wdmFsOworCXUxNiBvZmYsIGxlbiwga2V5bGVuOworCWludCByZWM7CisJaW50IGIsIGU7CisJaW50IHJlczsKKworCWIgPSAwOworCWUgPSBibm9kZS0+bnVtX3JlY3MgLSAxOworCXJlcyA9IC1FTk9FTlQ7CisJZG8geworCQlyZWMgPSAoZSArIGIpIC8gMjsKKwkJbGVuID0gaGZzX2JyZWNfbGVub2ZmKGJub2RlLCByZWMsICZvZmYpOworCQlrZXlsZW4gPSBoZnNfYnJlY19rZXlsZW4oYm5vZGUsIHJlYyk7CisJCWhmc19ibm9kZV9yZWFkKGJub2RlLCBmZC0+a2V5LCBvZmYsIGtleWxlbik7CisJCWNtcHZhbCA9IGJub2RlLT50cmVlLT5rZXljbXAoZmQtPmtleSwgZmQtPnNlYXJjaF9rZXkpOworCQlpZiAoIWNtcHZhbCkgeworCQkJZSA9IHJlYzsKKwkJCXJlcyA9IDA7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJaWYgKGNtcHZhbCA8IDApCisJCQliID0gcmVjICsgMTsKKwkJZWxzZQorCQkJZSA9IHJlYyAtIDE7CisJfSB3aGlsZSAoYiA8PSBlKTsKKwkvL3ByaW50aygiJWQ6ICVkLCVkLCVkXG4iLCBibm9kZS0+dGhpcywgYiwgZSwgcmVjKTsKKwlpZiAocmVjICE9IGUgJiYgZSA+PSAwKSB7CisJCWxlbiA9IGhmc19icmVjX2xlbm9mZihibm9kZSwgZSwgJm9mZik7CisJCWtleWxlbiA9IGhmc19icmVjX2tleWxlbihibm9kZSwgZSk7CisJCWhmc19ibm9kZV9yZWFkKGJub2RlLCBmZC0+a2V5LCBvZmYsIGtleWxlbik7CisJfQorZG9uZToKKwlmZC0+cmVjb3JkID0gZTsKKwlmZC0+a2V5b2Zmc2V0ID0gb2ZmOworCWZkLT5rZXlsZW5ndGggPSBrZXlsZW47CisJZmQtPmVudHJ5b2Zmc2V0ID0gb2ZmICsga2V5bGVuOworCWZkLT5lbnRyeWxlbmd0aCA9IGxlbiAtIGtleWxlbjsKKwlyZXR1cm4gcmVzOworfQorCisvKiBUcmF2ZXJzZSBhIEIqVHJlZSBmcm9tIHRoZSByb290IHRvIGEgbGVhZiBmaW5kaW5nIGJlc3QgZml0IHRvIGtleSAqLworLyogUmV0dXJuIGFsbG9jYXRlZCBjb3B5IG9mIG5vZGUgZm91bmQsIHNldCByZWNudW0gdG8gYmVzdCByZWNvcmQgKi8KK2ludCBoZnNfYnJlY19maW5kKHN0cnVjdCBoZnNfZmluZF9kYXRhICpmZCkKK3sKKwlzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlOworCXN0cnVjdCBoZnNfYm5vZGUgKmJub2RlOworCXUzMiBuaWR4LCBwYXJlbnQ7CisJX19iZTMyIGRhdGE7CisJaW50IGhlaWdodCwgcmVzOworCisJdHJlZSA9IGZkLT50cmVlOworCWlmIChmZC0+Ym5vZGUpCisJCWhmc19ibm9kZV9wdXQoZmQtPmJub2RlKTsKKwlmZC0+Ym5vZGUgPSBOVUxMOworCW5pZHggPSB0cmVlLT5yb290OworCWlmICghbmlkeCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJaGVpZ2h0ID0gdHJlZS0+ZGVwdGg7CisJcmVzID0gMDsKKwlwYXJlbnQgPSAwOworCWZvciAoOzspIHsKKwkJYm5vZGUgPSBoZnNfYm5vZGVfZmluZCh0cmVlLCBuaWR4KTsKKwkJaWYgKElTX0VSUihibm9kZSkpIHsKKwkJCXJlcyA9IFBUUl9FUlIoYm5vZGUpOworCQkJYm5vZGUgPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGJub2RlLT5oZWlnaHQgIT0gaGVpZ2h0KQorCQkJZ290byBpbnZhbGlkOworCQlpZiAoYm5vZGUtPnR5cGUgIT0gKC0taGVpZ2h0ID8gSEZTX05PREVfSU5ERVggOiBIRlNfTk9ERV9MRUFGKSkKKwkJCWdvdG8gaW52YWxpZDsKKwkJYm5vZGUtPnBhcmVudCA9IHBhcmVudDsKKworCQlyZXMgPSBfX2hmc19icmVjX2ZpbmQoYm5vZGUsIGZkKTsKKwkJaWYgKCFoZWlnaHQpCisJCQlicmVhazsKKwkJaWYgKGZkLT5yZWNvcmQgPCAwKQorCQkJZ290byByZWxlYXNlOworCisJCXBhcmVudCA9IG5pZHg7CisJCWhmc19ibm9kZV9yZWFkKGJub2RlLCAmZGF0YSwgZmQtPmVudHJ5b2Zmc2V0LCA0KTsKKwkJbmlkeCA9IGJlMzJfdG9fY3B1KGRhdGEpOworCQloZnNfYm5vZGVfcHV0KGJub2RlKTsKKwl9CisJZmQtPmJub2RlID0gYm5vZGU7CisJcmV0dXJuIHJlczsKKworaW52YWxpZDoKKwlwcmludGsoIkhGUzogaW5jb25zaXN0ZW5jeSBpbiBCKlRyZWUgKCVkLCVkLCVkLCV1LCV1KVxuIiwKKwkJaGVpZ2h0LCBibm9kZS0+aGVpZ2h0LCBibm9kZS0+dHlwZSwgbmlkeCwgcGFyZW50KTsKKwlyZXMgPSAtRUlPOworcmVsZWFzZToKKwloZnNfYm5vZGVfcHV0KGJub2RlKTsKKwlyZXR1cm4gcmVzOworfQorCitpbnQgaGZzX2JyZWNfcmVhZChzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqZmQsIHZvaWQgKnJlYywgaW50IHJlY19sZW4pCit7CisJaW50IHJlczsKKworCXJlcyA9IGhmc19icmVjX2ZpbmQoZmQpOworCWlmIChyZXMpCisJCXJldHVybiByZXM7CisJaWYgKGZkLT5lbnRyeWxlbmd0aCA+IHJlY19sZW4pCisJCXJldHVybiAtRUlOVkFMOworCWhmc19ibm9kZV9yZWFkKGZkLT5ibm9kZSwgcmVjLCBmZC0+ZW50cnlvZmZzZXQsIGZkLT5lbnRyeWxlbmd0aCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBoZnNfYnJlY19nb3RvKHN0cnVjdCBoZnNfZmluZF9kYXRhICpmZCwgaW50IGNudCkKK3sKKwlzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlOworCXN0cnVjdCBoZnNfYm5vZGUgKmJub2RlOworCWludCBpZHgsIHJlcyA9IDA7CisJdTE2IG9mZiwgbGVuLCBrZXlsZW47CisKKwlibm9kZSA9IGZkLT5ibm9kZTsKKwl0cmVlID0gYm5vZGUtPnRyZWU7CisKKwlpZiAoY250IDwgMCkgeworCQljbnQgPSAtY250OworCQl3aGlsZSAoY250ID4gZmQtPnJlY29yZCkgeworCQkJY250IC09IGZkLT5yZWNvcmQgKyAxOworCQkJZmQtPnJlY29yZCA9IGJub2RlLT5udW1fcmVjcyAtIDE7CisJCQlpZHggPSBibm9kZS0+cHJldjsKKwkJCWlmICghaWR4KSB7CisJCQkJcmVzID0gLUVOT0VOVDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWhmc19ibm9kZV9wdXQoYm5vZGUpOworCQkJYm5vZGUgPSBoZnNfYm5vZGVfZmluZCh0cmVlLCBpZHgpOworCQkJaWYgKElTX0VSUihibm9kZSkpIHsKKwkJCQlyZXMgPSBQVFJfRVJSKGJub2RlKTsKKwkJCQlibm9kZSA9IE5VTEw7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwkJZmQtPnJlY29yZCAtPSBjbnQ7CisJfSBlbHNlIHsKKwkJd2hpbGUgKGNudCA+PSBibm9kZS0+bnVtX3JlY3MgLSBmZC0+cmVjb3JkKSB7CisJCQljbnQgLT0gYm5vZGUtPm51bV9yZWNzIC0gZmQtPnJlY29yZDsKKwkJCWZkLT5yZWNvcmQgPSAwOworCQkJaWR4ID0gYm5vZGUtPm5leHQ7CisJCQlpZiAoIWlkeCkgeworCQkJCXJlcyA9IC1FTk9FTlQ7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQloZnNfYm5vZGVfcHV0KGJub2RlKTsKKwkJCWJub2RlID0gaGZzX2Jub2RlX2ZpbmQodHJlZSwgaWR4KTsKKwkJCWlmIChJU19FUlIoYm5vZGUpKSB7CisJCQkJcmVzID0gUFRSX0VSUihibm9kZSk7CisJCQkJYm5vZGUgPSBOVUxMOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJCWZkLT5yZWNvcmQgKz0gY250OworCX0KKworCWxlbiA9IGhmc19icmVjX2xlbm9mZihibm9kZSwgZmQtPnJlY29yZCwgJm9mZik7CisJa2V5bGVuID0gaGZzX2JyZWNfa2V5bGVuKGJub2RlLCBmZC0+cmVjb3JkKTsKKwlmZC0+a2V5b2Zmc2V0ID0gb2ZmOworCWZkLT5rZXlsZW5ndGggPSBrZXlsZW47CisJZmQtPmVudHJ5b2Zmc2V0ID0gb2ZmICsga2V5bGVuOworCWZkLT5lbnRyeWxlbmd0aCA9IGxlbiAtIGtleWxlbjsKKwloZnNfYm5vZGVfcmVhZChibm9kZSwgZmQtPmtleSwgb2ZmLCBrZXlsZW4pOworb3V0OgorCWZkLT5ibm9kZSA9IGJub2RlOworCXJldHVybiByZXM7Cit9CmRpZmYgLS1naXQgYS9mcy9oZnMvYml0bWFwLmMgYi9mcy9oZnMvYml0bWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRlNzU3OQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmcy9iaXRtYXAuYwpAQCAtMCwwICsxLDI0MyBAQAorLyoKKyAqICBsaW51eC9mcy9oZnMvYml0bWFwLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYtMTk5NyAgUGF1bCBILiBIYXJncm92ZQorICogKEMpIDIwMDMgQXJkaXMgVGVjaG5vbG9naWVzIDxyb21hbkBhcmRpc3RlY2guY29tPgorICogVGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICoKKyAqIEJhc2VkIG9uIEdQTGVkIGNvZGUgQ29weXJpZ2h0IChDKSAxOTk1ICBNaWNoYWVsIERyZWhlcgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29kZSB0byBtb2RpZnkgdGhlIHZvbHVtZSBiaXRtYXA6CisgKiBzZWFyY2gvc2V0L2NsZWFyIGJpdHMuCisgKi8KKworI2luY2x1ZGUgImhmc19mcy5oIgorCisvKgorICogaGZzX2ZpbmRfemVyb19iaXQoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogIEdpdmVuIGEgYmxvY2sgb2YgbWVtb3J5LCBpdHMgbGVuZ3RoIGluIGJpdHMsIGFuZCBhIHN0YXJ0aW5nIGJpdCBudW1iZXIsCisgKiAgZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgdGhlIGZpcnN0IHplcm8gYml0cyAoaW4gbGVmdC10by1yaWdodCBvcmRlcmluZykKKyAqICBpbiB0aGF0IHJhbmdlLgorICoKKyAqICBSZXR1cm5zID49ICdzaXplJyBpZiBubyB6ZXJvIGJpdHMgYXJlIGZvdW5kIGluIHRoZSByYW5nZS4KKyAqCisgKiAgQWNjZXNzZXMgbWVtb3J5IGluIDMyLWJpdCBhbGlnbmVkIGNodW5rcyBvZiAzMi1iaXRzIGFuZCB0aHVzCisgKiAgbWF5IHJlYWQgYmV5b25kIHRoZSAnc2l6ZSd0aCBiaXQuCisgKi8KK3N0YXRpYyB1MzIgaGZzX2ZpbmRfc2V0X3plcm9fYml0cyhfX2JlMzIgKmJpdG1hcCwgdTMyIHNpemUsIHUzMiBvZmZzZXQsIHUzMiAqbWF4KQoreworCV9fYmUzMiAqY3VyciwgKmVuZDsKKwl1MzIgbWFzaywgc3RhcnQsIGxlbiwgbjsKKwlfX2JlMzIgdmFsOworCWludCBpOworCisJbGVuID0gKm1heDsKKwlpZiAoIWxlbikKKwkJcmV0dXJuIHNpemU7CisKKwljdXJyID0gYml0bWFwICsgKG9mZnNldCAvIDMyKTsKKwllbmQgPSBiaXRtYXAgKyAoKHNpemUgKyAzMSkgLyAzMik7CisKKwkvKiBzY2FuIHRoZSBmaXJzdCBwYXJ0aWFsIHUzMiBmb3IgemVybyBiaXRzICovCisJdmFsID0gKmN1cnI7CisJaWYgKH52YWwpIHsKKwkJbiA9IGJlMzJfdG9fY3B1KHZhbCk7CisJCWkgPSBvZmZzZXQgJSAzMjsKKwkJbWFzayA9ICgxVSA8PCAzMSkgPj4gaTsKKwkJZm9yICg7IGkgPCAzMjsgbWFzayA+Pj0gMSwgaSsrKSB7CisJCQlpZiAoIShuICYgbWFzaykpCisJCQkJZ290byBmb3VuZDsKKwkJfQorCX0KKworCS8qIHNjYW4gY29tcGxldGUgdTMycyBmb3IgdGhlIGZpcnN0IHplcm8gYml0ICovCisJd2hpbGUgKCsrY3VyciA8IGVuZCkgeworCQl2YWwgPSAqY3VycjsKKwkJaWYgKH52YWwpIHsKKwkJCW4gPSBiZTMyX3RvX2NwdSh2YWwpOworCQkJbWFzayA9IDEgPDwgMzE7CisJCQlmb3IgKGkgPSAwOyBpIDwgMzI7IG1hc2sgPj49IDEsIGkrKykgeworCQkJCWlmICghKG4gJiBtYXNrKSkKKwkJCQkJZ290byBmb3VuZDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gc2l6ZTsKKworZm91bmQ6CisJc3RhcnQgPSAoY3VyciAtIGJpdG1hcCkgKiAzMiArIGk7CisJaWYgKHN0YXJ0ID49IHNpemUpCisJCXJldHVybiBzdGFydDsKKwkvKiBkbyBhbnkgcGFydGlhbCB1MzIgYXQgdGhlIHN0YXJ0ICovCisJbGVuID0gbWluKHNpemUgLSBzdGFydCwgbGVuKTsKKwl3aGlsZSAoMSkgeworCQluIHw9IG1hc2s7CisJCWlmICgrK2kgPj0gMzIpCisJCQlicmVhazsKKwkJbWFzayA+Pj0gMTsKKwkJaWYgKCEtLWxlbiB8fCBuICYgbWFzaykKKwkJCWdvdG8gZG9uZTsKKwl9CisJaWYgKCEtLWxlbikKKwkJZ290byBkb25lOworCSpjdXJyKysgPSBjcHVfdG9fYmUzMihuKTsKKwkvKiBkbyBmdWxsIHUzMnMgKi8KKwl3aGlsZSAoMSkgeworCQluID0gYmUzMl90b19jcHUoKmN1cnIpOworCQlpZiAobGVuIDwgMzIpCisJCQlicmVhazsKKwkJaWYgKG4pIHsKKwkJCWxlbiA9IDMyOworCQkJYnJlYWs7CisJCX0KKwkJKmN1cnIrKyA9IGNwdV90b19iZTMyKDB4ZmZmZmZmZmYpOworCQlsZW4gLT0gMzI7CisJfQorCS8qIGRvIGFueSBwYXJ0aWFsIHUzMiBhdCBlbmQgKi8KKwltYXNrID0gMVUgPDwgMzE7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWlmIChuICYgbWFzaykKKwkJCWJyZWFrOworCQluIHw9IG1hc2s7CisJCW1hc2sgPj49IDE7CisJfQorZG9uZToKKwkqY3VyciA9IGNwdV90b19iZTMyKG4pOworCSptYXggPSAoY3VyciAtIGJpdG1hcCkgKiAzMiArIGkgLSBzdGFydDsKKwlyZXR1cm4gc3RhcnQ7Cit9CisKKy8qCisgKiBoZnNfdmJtX3NlYXJjaF9mcmVlKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgU2VhcmNoIGZvciAnbnVtX2JpdHMnIGNvbnNlY3V0aXZlIGNsZWFyZWQgYml0cyBpbiB0aGUgYml0bWFwIGJsb2NrcyBvZgorICogICB0aGUgaGZzIE1EQi4gJ21kYicgaGFkIGJldHRlciBiZSBsb2NrZWQgb3IgdGhlIHJldHVybmVkIHJhbmdlCisgKiAgIG1heSBiZSBubyBsb25nZXIgZnJlZSwgd2hlbiB0aGlzIGZ1bmN0aW9ucyByZXR1cm5zIQorICogICBYWFggQ3VycmVudGx5IHRoZSBzZWFyY2ggc3RhcnRzIGZyb20gYml0IDAsIGJ1dCBpdCBzaG91bGQgc3RhcnQgd2l0aAorICogICB0aGUgYml0IG51bWJlciBzdG9yZWQgaW4gJ3NfYWxsb2NfcHRyJyBvZiB0aGUgTURCLgorICogSW5wdXQgVmFyaWFibGUocyk6CisgKiAgIHN0cnVjdCBoZnNfbWRiICptZGI6IFBvaW50ZXIgdG8gdGhlIGhmcyBNREIKKyAqICAgdTE2ICpudW1fYml0czogUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGNsZWFyZWQgYml0cworICogICAgIHRvIHNlYXJjaCBmb3IKKyAqIE91dHB1dCBWYXJpYWJsZShzKToKKyAqICAgdTE2ICpudW1fYml0czogVGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBjbGVhciBiaXRzIG9mIHRoZQorICogICAgIHJldHVybmVkIHJhbmdlLiBJZiB0aGUgYml0bWFwIGlzIGZyYWdtZW50ZWQsIHRoaXMgd2lsbCBiZSBsZXNzIHRoYW4KKyAqICAgICByZXF1ZXN0ZWQgYW5kIGl0IHdpbGwgYmUgemVybywgd2hlbiB0aGUgZGlzayBpcyBmdWxsLgorICogUmV0dXJuczoKKyAqICAgVGhlIG51bWJlciBvZiB0aGUgZmlyc3QgYml0IG9mIHRoZSByYW5nZSBvZiBjbGVhcmVkIGJpdHMgd2hpY2ggaGFzIGJlZW4KKyAqICAgZm91bmQuIFdoZW4gJ251bV9iaXRzJyBpcyB6ZXJvLCB0aGlzIGlzIGludmFsaWQhCisgKiBQcmVjb25kaXRpb25zOgorICogICAnbWRiJyBwb2ludHMgdG8gYSAidmFsaWQiIChzdHJ1Y3QgaGZzX21kYikuCisgKiAgICdudW1fYml0cycgcG9pbnRzIHRvIGEgdmFyaWFibGUgb2YgdHlwZSAodTE2KSwgd2hpY2ggY29udGFpbnMKKyAqCXRoZSBudW1iZXIgb2YgY2xlYXJlZCBiaXRzIHRvIGZpbmQuCisgKiBQb3N0Y29uZGl0aW9uczoKKyAqICAgJ251bV9iaXRzJyBpcyBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUgZm91bmQgc2VxdWVuY2UuCisgKi8KK3UzMiBoZnNfdmJtX3NlYXJjaF9mcmVlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHUzMiBnb2FsLCB1MzIgKm51bV9iaXRzKQoreworCXZvaWQgKmJpdG1hcDsKKwl1MzIgcG9zOworCisJLyogbWFrZSBzdXJlIHdlIGhhdmUgYWN0dWFsIHdvcmsgdG8gcGVyZm9ybSAqLworCWlmICghKm51bV9iaXRzKQorCQlyZXR1cm4gMDsKKworCWRvd24oJkhGU19TQihzYiktPmJpdG1hcF9sb2NrKTsKKwliaXRtYXAgPSBIRlNfU0Ioc2IpLT5iaXRtYXA7CisKKwlwb3MgPSBoZnNfZmluZF9zZXRfemVyb19iaXRzKGJpdG1hcCwgSEZTX1NCKHNiKS0+ZnNfYWJsb2NrcywgZ29hbCwgbnVtX2JpdHMpOworCWlmIChwb3MgPj0gSEZTX1NCKHNiKS0+ZnNfYWJsb2NrcykgeworCQlpZiAoZ29hbCkKKwkJCXBvcyA9IGhmc19maW5kX3NldF96ZXJvX2JpdHMoYml0bWFwLCBnb2FsLCAwLCBudW1fYml0cyk7CisJCWlmIChwb3MgPj0gSEZTX1NCKHNiKS0+ZnNfYWJsb2NrcykgeworCQkJKm51bV9iaXRzID0gcG9zID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJZHByaW50KERCR19CSVRNQVAsICJhbGxvY19iaXRzOiAldSwldVxuIiwgcG9zLCAqbnVtX2JpdHMpOworCUhGU19TQihzYiktPmZyZWVfYWJsb2NrcyAtPSAqbnVtX2JpdHM7CisJaGZzX2JpdG1hcF9kaXJ0eShzYik7CitvdXQ6CisJdXAoJkhGU19TQihzYiktPmJpdG1hcF9sb2NrKTsKKwlyZXR1cm4gcG9zOworfQorCisKKy8qCisgKiBoZnNfY2xlYXJfdmJtX2JpdHMoKQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBDbGVhciB0aGUgcmVxdWVzdGVkIGJpdHMgaW4gdGhlIHZvbHVtZSBiaXRtYXAgb2YgdGhlIGhmcyBmaWxlc3lzdGVtCisgKiBJbnB1dCBWYXJpYWJsZShzKToKKyAqICAgc3RydWN0IGhmc19tZGIgKm1kYjogUG9pbnRlciB0byB0aGUgaGZzIE1EQgorICogICB1MTYgc3RhcnQ6IFRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IGJpdAorICogICB1MTYgY291bnQ6IFRoZSBudW1iZXIgb2YgYml0cworICogT3V0cHV0IFZhcmlhYmxlKHMpOgorICogICBOb25lCisgKiBSZXR1cm5zOgorICogICAgMDogbm8gZXJyb3IKKyAqICAgLTE6IE9uZSBvZiB0aGUgYml0cyB3YXMgYWxyZWFkeSBjbGVhci4gIFRoaXMgaXMgYSBzdHJhbmdlCisgKgkgZXJyb3IgYW5kIHdoZW4gaXQgaGFwcGVucywgdGhlIGZpbGVzeXN0ZW0gbXVzdCBiZSByZXBhaXJlZCEKKyAqICAgLTI6IE9uZSBvciBtb3JlIG9mIHRoZSBiaXRzIGFyZSBvdXQgb2YgcmFuZ2Ugb2YgdGhlIGJpdG1hcC4KKyAqIFByZWNvbmRpdGlvbnM6CisgKiAgICdtZGInIHBvaW50cyB0byBhICJ2YWxpZCIgKHN0cnVjdCBoZnNfbWRiKS4KKyAqIFBvc3Rjb25kaXRpb25zOgorICogICBTdGFydGluZyB3aXRoIGJpdCBudW1iZXIgJ3N0YXJ0JywgJ2NvdW50JyBiaXRzIGluIHRoZSB2b2x1bWUgYml0bWFwCisgKiAgIGFyZSBjbGVhcmVkLiBUaGUgYWZmZWN0ZWQgYml0bWFwIGJsb2NrcyBhcmUgbWFya2VkICJkaXJ0eSIsIHRoZSBmcmVlCisgKiAgIGJsb2NrIGNvdW50IG9mIHRoZSBNREIgaXMgdXBkYXRlZCBhbmQgdGhlIE1EQiBpcyBtYXJrZWQgZGlydHkuCisgKi8KK2ludCBoZnNfY2xlYXJfdmJtX2JpdHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdTE2IHN0YXJ0LCB1MTYgY291bnQpCit7CisJX19iZTMyICpjdXJyOworCXUzMiBtYXNrOworCWludCBpLCBsZW47CisKKwkvKiBpcyB0aGVyZSBhbnkgYWN0dWFsIHdvcmsgdG8gYmUgZG9uZT8gKi8KKwlpZiAoIWNvdW50KQorCQlyZXR1cm4gMDsKKworCWRwcmludChEQkdfQklUTUFQLCAiY2xlYXJfYml0czogJXUsJXVcbiIsIHN0YXJ0LCBjb3VudCk7CisJLyogYXJlIGFsbCBvZiB0aGUgYml0cyBpbiByYW5nZT8gKi8KKwlpZiAoKHN0YXJ0ICsgY291bnQpID4gSEZTX1NCKHNiKS0+ZnNfYWJsb2NrcykKKwkJcmV0dXJuIC0yOworCisJZG93bigmSEZTX1NCKHNiKS0+Yml0bWFwX2xvY2spOworCS8qIGJpdG1hcCBpcyBhbHdheXMgb24gYSAzMi1iaXQgYm91bmRhcnkgKi8KKwljdXJyID0gSEZTX1NCKHNiKS0+Yml0bWFwICsgKHN0YXJ0IC8gMzIpOworCWxlbiA9IGNvdW50OworCisJLyogZG8gYW55IHBhcnRpYWwgdTMyIGF0IHRoZSBzdGFydCAqLworCWkgPSBzdGFydCAlIDMyOworCWlmIChpKSB7CisJCWludCBqID0gMzIgLSBpOworCQltYXNrID0gMHhmZmZmZmZmZlUgPDwgajsKKwkJaWYgKGogPiBjb3VudCkgeworCQkJbWFzayB8PSAweGZmZmZmZmZmVSA+PiAoaSArIGNvdW50KTsKKwkJCSpjdXJyICY9IGNwdV90b19iZTMyKG1hc2spOworCQkJZ290byBvdXQ7CisJCX0KKwkJKmN1cnIrKyAmPSBjcHVfdG9fYmUzMihtYXNrKTsKKwkJY291bnQgLT0gajsKKwl9CisKKwkvKiBkbyBmdWxsIHUzMnMgKi8KKwl3aGlsZSAoY291bnQgPj0gMzIpIHsKKwkJKmN1cnIrKyA9IDA7CisJCWNvdW50IC09IDMyOworCX0KKwkvKiBkbyBhbnkgcGFydGlhbCB1MzIgYXQgZW5kICovCisJaWYgKGNvdW50KSB7CisJCW1hc2sgPSAweGZmZmZmZmZmVSA+PiBjb3VudDsKKwkJKmN1cnIgJj0gY3B1X3RvX2JlMzIobWFzayk7CisJfQorb3V0OgorCUhGU19TQihzYiktPmZyZWVfYWJsb2NrcyArPSBsZW47CisJdXAoJkhGU19TQihzYiktPmJpdG1hcF9sb2NrKTsKKwloZnNfYml0bWFwX2RpcnR5KHNiKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMvaGZzL2Jub2RlLmMgYi9mcy9oZnMvYm5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWQxMjExCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaGZzL2Jub2RlLmMKQEAgLTAsMCArMSw0OTggQEAKKy8qCisgKiAgbGludXgvZnMvaGZzL2Jub2RlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEKKyAqIEJyYWQgQm95ZXIgKGZsYXJAYWxsYW5kcmlhLmNvbSkKKyAqIChDKSAyMDAzIEFyZGlzIFRlY2hub2xvZ2llcyA8cm9tYW5AYXJkaXN0ZWNoLmNvbT4KKyAqCisgKiBIYW5kbGUgYmFzaWMgYnRyZWUgbm9kZSBvcGVyYXRpb25zCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisKKyNpbmNsdWRlICJidHJlZS5oIgorCisjZGVmaW5lIFJFRl9QQUdFUwkwCisKK3ZvaWQgaGZzX2Jub2RlX3JlYWQoc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgdm9pZCAqYnVmLAorCQlpbnQgb2ZmLCBpbnQgbGVuKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCisJb2ZmICs9IG5vZGUtPnBhZ2Vfb2Zmc2V0OworCXBhZ2UgPSBub2RlLT5wYWdlWzBdOworCisJbWVtY3B5KGJ1Ziwga21hcChwYWdlKSArIG9mZiwgbGVuKTsKKwlrdW5tYXAocGFnZSk7Cit9CisKK3UxNiBoZnNfYm5vZGVfcmVhZF91MTYoc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgaW50IG9mZikKK3sKKwlfX2JlMTYgZGF0YTsKKwkvLyBvcHRpbWl6ZSBsYXRlci4uLgorCWhmc19ibm9kZV9yZWFkKG5vZGUsICZkYXRhLCBvZmYsIDIpOworCXJldHVybiBiZTE2X3RvX2NwdShkYXRhKTsKK30KKwordTggaGZzX2Jub2RlX3JlYWRfdTgoc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgaW50IG9mZikKK3sKKwl1OCBkYXRhOworCS8vIG9wdGltaXplIGxhdGVyLi4uCisJaGZzX2Jub2RlX3JlYWQobm9kZSwgJmRhdGEsIG9mZiwgMSk7CisJcmV0dXJuIGRhdGE7Cit9CisKK3ZvaWQgaGZzX2Jub2RlX3JlYWRfa2V5KHN0cnVjdCBoZnNfYm5vZGUgKm5vZGUsIHZvaWQgKmtleSwgaW50IG9mZikKK3sKKwlzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlOworCWludCBrZXlfbGVuOworCisJdHJlZSA9IG5vZGUtPnRyZWU7CisJaWYgKG5vZGUtPnR5cGUgPT0gSEZTX05PREVfTEVBRiB8fAorCSAgICB0cmVlLT5hdHRyaWJ1dGVzICYgSEZTX1RSRUVfVkFSSURYS0VZUykKKwkJa2V5X2xlbiA9IGhmc19ibm9kZV9yZWFkX3U4KG5vZGUsIG9mZikgKyAxOworCWVsc2UKKwkJa2V5X2xlbiA9IHRyZWUtPm1heF9rZXlfbGVuICsgMTsKKworCWhmc19ibm9kZV9yZWFkKG5vZGUsIGtleSwgb2ZmLCBrZXlfbGVuKTsKK30KKwordm9pZCBoZnNfYm5vZGVfd3JpdGUoc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgdm9pZCAqYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCisJb2ZmICs9IG5vZGUtPnBhZ2Vfb2Zmc2V0OworCXBhZ2UgPSBub2RlLT5wYWdlWzBdOworCisJbWVtY3B5KGttYXAocGFnZSkgKyBvZmYsIGJ1ZiwgbGVuKTsKKwlrdW5tYXAocGFnZSk7CisJc2V0X3BhZ2VfZGlydHkocGFnZSk7Cit9CisKK3ZvaWQgaGZzX2Jub2RlX3dyaXRlX3UxNihzdHJ1Y3QgaGZzX2Jub2RlICpub2RlLCBpbnQgb2ZmLCB1MTYgZGF0YSkKK3sKKwlfX2JlMTYgdiA9IGNwdV90b19iZTE2KGRhdGEpOworCS8vIG9wdGltaXplIGxhdGVyLi4uCisJaGZzX2Jub2RlX3dyaXRlKG5vZGUsICZ2LCBvZmYsIDIpOworfQorCit2b2lkIGhmc19ibm9kZV93cml0ZV91OChzdHJ1Y3QgaGZzX2Jub2RlICpub2RlLCBpbnQgb2ZmLCB1OCBkYXRhKQoreworCS8vIG9wdGltaXplIGxhdGVyLi4uCisJaGZzX2Jub2RlX3dyaXRlKG5vZGUsICZkYXRhLCBvZmYsIDEpOworfQorCit2b2lkIGhmc19ibm9kZV9jbGVhcihzdHJ1Y3QgaGZzX2Jub2RlICpub2RlLCBpbnQgb2ZmLCBpbnQgbGVuKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCisJb2ZmICs9IG5vZGUtPnBhZ2Vfb2Zmc2V0OworCXBhZ2UgPSBub2RlLT5wYWdlWzBdOworCisJbWVtc2V0KGttYXAocGFnZSkgKyBvZmYsIDAsIGxlbik7CisJa3VubWFwKHBhZ2UpOworCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworfQorCit2b2lkIGhmc19ibm9kZV9jb3B5KHN0cnVjdCBoZnNfYm5vZGUgKmRzdF9ub2RlLCBpbnQgZHN0LAorCQlzdHJ1Y3QgaGZzX2Jub2RlICpzcmNfbm9kZSwgaW50IHNyYywgaW50IGxlbikKK3sKKwlzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlOworCXN0cnVjdCBwYWdlICpzcmNfcGFnZSwgKmRzdF9wYWdlOworCisJZHByaW50KERCR19CTk9ERV9NT0QsICJjb3B5Ynl0ZXM6ICV1LCV1LCV1XG4iLCBkc3QsIHNyYywgbGVuKTsKKwlpZiAoIWxlbikKKwkJcmV0dXJuOworCXRyZWUgPSBzcmNfbm9kZS0+dHJlZTsKKwlzcmMgKz0gc3JjX25vZGUtPnBhZ2Vfb2Zmc2V0OworCWRzdCArPSBkc3Rfbm9kZS0+cGFnZV9vZmZzZXQ7CisJc3JjX3BhZ2UgPSBzcmNfbm9kZS0+cGFnZVswXTsKKwlkc3RfcGFnZSA9IGRzdF9ub2RlLT5wYWdlWzBdOworCisJbWVtY3B5KGttYXAoZHN0X3BhZ2UpICsgZHN0LCBrbWFwKHNyY19wYWdlKSArIHNyYywgbGVuKTsKKwlrdW5tYXAoc3JjX3BhZ2UpOworCWt1bm1hcChkc3RfcGFnZSk7CisJc2V0X3BhZ2VfZGlydHkoZHN0X3BhZ2UpOworfQorCit2b2lkIGhmc19ibm9kZV9tb3ZlKHN0cnVjdCBoZnNfYm5vZGUgKm5vZGUsIGludCBkc3QsIGludCBzcmMsIGludCBsZW4pCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdm9pZCAqcHRyOworCisJZHByaW50KERCR19CTk9ERV9NT0QsICJtb3ZlYnl0ZXM6ICV1LCV1LCV1XG4iLCBkc3QsIHNyYywgbGVuKTsKKwlpZiAoIWxlbikKKwkJcmV0dXJuOworCXNyYyArPSBub2RlLT5wYWdlX29mZnNldDsKKwlkc3QgKz0gbm9kZS0+cGFnZV9vZmZzZXQ7CisJcGFnZSA9IG5vZGUtPnBhZ2VbMF07CisJcHRyID0ga21hcChwYWdlKTsKKwltZW1tb3ZlKHB0ciArIGRzdCwgcHRyICsgc3JjLCBsZW4pOworCWt1bm1hcChwYWdlKTsKKwlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKK30KKwordm9pZCBoZnNfYm5vZGVfZHVtcChzdHJ1Y3QgaGZzX2Jub2RlICpub2RlKQoreworCXN0cnVjdCBoZnNfYm5vZGVfZGVzYyBkZXNjOworCV9fYmUzMiBjbmlkOworCWludCBpLCBvZmYsIGtleV9vZmY7CisKKwlkcHJpbnQoREJHX0JOT0RFX01PRCwgImJub2RlOiAlZFxuIiwgbm9kZS0+dGhpcyk7CisJaGZzX2Jub2RlX3JlYWQobm9kZSwgJmRlc2MsIDAsIHNpemVvZihkZXNjKSk7CisJZHByaW50KERCR19CTk9ERV9NT0QsICIlZCwgJWQsICVkLCAlZCwgJWRcbiIsCisJCWJlMzJfdG9fY3B1KGRlc2MubmV4dCksIGJlMzJfdG9fY3B1KGRlc2MucHJldiksCisJCWRlc2MudHlwZSwgZGVzYy5oZWlnaHQsIGJlMTZfdG9fY3B1KGRlc2MubnVtX3JlY3MpKTsKKworCW9mZiA9IG5vZGUtPnRyZWUtPm5vZGVfc2l6ZSAtIDI7CisJZm9yIChpID0gYmUxNl90b19jcHUoZGVzYy5udW1fcmVjcyk7IGkgPj0gMDsgb2ZmIC09IDIsIGktLSkgeworCQlrZXlfb2ZmID0gaGZzX2Jub2RlX3JlYWRfdTE2KG5vZGUsIG9mZik7CisJCWRwcmludChEQkdfQk5PREVfTU9ELCAiICVkIiwga2V5X29mZik7CisJCWlmIChpICYmIG5vZGUtPnR5cGUgPT0gSEZTX05PREVfSU5ERVgpIHsKKwkJCWludCB0bXA7CisKKwkJCWlmIChub2RlLT50cmVlLT5hdHRyaWJ1dGVzICYgSEZTX1RSRUVfVkFSSURYS0VZUykKKwkJCQl0bXAgPSAoaGZzX2Jub2RlX3JlYWRfdTgobm9kZSwga2V5X29mZikgfCAxKSArIDE7CisJCQllbHNlCisJCQkJdG1wID0gbm9kZS0+dHJlZS0+bWF4X2tleV9sZW4gKyAxOworCQkJZHByaW50KERCR19CTk9ERV9NT0QsICIgKCVkLCVkIiwgdG1wLCBoZnNfYm5vZGVfcmVhZF91OChub2RlLCBrZXlfb2ZmKSk7CisJCQloZnNfYm5vZGVfcmVhZChub2RlLCAmY25pZCwga2V5X29mZiArIHRtcCwgNCk7CisJCQlkcHJpbnQoREJHX0JOT0RFX01PRCwgIiwlZCkiLCBiZTMyX3RvX2NwdShjbmlkKSk7CisJCX0gZWxzZSBpZiAoaSAmJiBub2RlLT50eXBlID09IEhGU19OT0RFX0xFQUYpIHsKKwkJCWludCB0bXA7CisKKwkJCXRtcCA9IGhmc19ibm9kZV9yZWFkX3U4KG5vZGUsIGtleV9vZmYpOworCQkJZHByaW50KERCR19CTk9ERV9NT0QsICIgKCVkKSIsIHRtcCk7CisJCX0KKwl9CisJZHByaW50KERCR19CTk9ERV9NT0QsICJcbiIpOworfQorCit2b2lkIGhmc19ibm9kZV91bmxpbmsoc3RydWN0IGhmc19ibm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlOworCXN0cnVjdCBoZnNfYm5vZGUgKnRtcDsKKwlfX2JlMzIgY25pZDsKKworCXRyZWUgPSBub2RlLT50cmVlOworCWlmIChub2RlLT5wcmV2KSB7CisJCXRtcCA9IGhmc19ibm9kZV9maW5kKHRyZWUsIG5vZGUtPnByZXYpOworCQlpZiAoSVNfRVJSKHRtcCkpCisJCQlyZXR1cm47CisJCXRtcC0+bmV4dCA9IG5vZGUtPm5leHQ7CisJCWNuaWQgPSBjcHVfdG9fYmUzMih0bXAtPm5leHQpOworCQloZnNfYm5vZGVfd3JpdGUodG1wLCAmY25pZCwgb2Zmc2V0b2Yoc3RydWN0IGhmc19ibm9kZV9kZXNjLCBuZXh0KSwgNCk7CisJCWhmc19ibm9kZV9wdXQodG1wKTsKKwl9IGVsc2UgaWYgKG5vZGUtPnR5cGUgPT0gSEZTX05PREVfTEVBRikKKwkJdHJlZS0+bGVhZl9oZWFkID0gbm9kZS0+bmV4dDsKKworCWlmIChub2RlLT5uZXh0KSB7CisJCXRtcCA9IGhmc19ibm9kZV9maW5kKHRyZWUsIG5vZGUtPm5leHQpOworCQlpZiAoSVNfRVJSKHRtcCkpCisJCQlyZXR1cm47CisJCXRtcC0+cHJldiA9IG5vZGUtPnByZXY7CisJCWNuaWQgPSBjcHVfdG9fYmUzMih0bXAtPnByZXYpOworCQloZnNfYm5vZGVfd3JpdGUodG1wLCAmY25pZCwgb2Zmc2V0b2Yoc3RydWN0IGhmc19ibm9kZV9kZXNjLCBwcmV2KSwgNCk7CisJCWhmc19ibm9kZV9wdXQodG1wKTsKKwl9IGVsc2UgaWYgKG5vZGUtPnR5cGUgPT0gSEZTX05PREVfTEVBRikKKwkJdHJlZS0+bGVhZl90YWlsID0gbm9kZS0+cHJldjsKKworCS8vIG1vdmUgZG93bj8KKwlpZiAoIW5vZGUtPnByZXYgJiYgIW5vZGUtPm5leHQpIHsKKwkJcHJpbnRrKCJoZnNfYnRyZWVfZGVsX2xldmVsXG4iKTsKKwl9CisJaWYgKCFub2RlLT5wYXJlbnQpIHsKKwkJdHJlZS0+cm9vdCA9IDA7CisJCXRyZWUtPmRlcHRoID0gMDsKKwl9CisJc2V0X2JpdChIRlNfQk5PREVfREVMRVRFRCwgJm5vZGUtPmZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaGZzX2Jub2RlX2hhc2godTMyIG51bSkKK3sKKwludW0gPSAobnVtID4+IDE2KSArIG51bTsKKwludW0gKz0gbnVtID4+IDg7CisJcmV0dXJuIG51bSAmIChOT0RFX0hBU0hfU0laRSAtIDEpOworfQorCitzdHJ1Y3QgaGZzX2Jub2RlICpoZnNfYm5vZGVfZmluZGhhc2goc3RydWN0IGhmc19idHJlZSAqdHJlZSwgdTMyIGNuaWQpCit7CisJc3RydWN0IGhmc19ibm9kZSAqbm9kZTsKKworCWlmIChjbmlkID49IHRyZWUtPm5vZGVfY291bnQpIHsKKwkJcHJpbnRrKCJIRlM6IHJlcXVlc3QgZm9yIG5vbi1leGlzdGVudCBub2RlICVkIGluIEIqVHJlZVxuIiwgY25pZCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWZvciAobm9kZSA9IHRyZWUtPm5vZGVfaGFzaFtoZnNfYm5vZGVfaGFzaChjbmlkKV07CisJICAgICBub2RlOyBub2RlID0gbm9kZS0+bmV4dF9oYXNoKSB7CisJCWlmIChub2RlLT50aGlzID09IGNuaWQpIHsKKwkJCXJldHVybiBub2RlOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGhmc19ibm9kZSAqX19oZnNfYm5vZGVfY3JlYXRlKHN0cnVjdCBoZnNfYnRyZWUgKnRyZWUsIHUzMiBjbmlkKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgKm5vZGUyOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOworCXN0cnVjdCBwYWdlICpwYWdlOworCWludCBzaXplLCBibG9jaywgaSwgaGFzaDsKKwlsb2ZmX3Qgb2ZmOworCisJaWYgKGNuaWQgPj0gdHJlZS0+bm9kZV9jb3VudCkgeworCQlwcmludGsoIkhGUzogcmVxdWVzdCBmb3Igbm9uLWV4aXN0ZW50IG5vZGUgJWQgaW4gQipUcmVlXG4iLCBjbmlkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc2IgPSB0cmVlLT5pbm9kZS0+aV9zYjsKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBoZnNfYm5vZGUpICsgdHJlZS0+cGFnZXNfcGVyX2Jub2RlICoKKwkJc2l6ZW9mKHN0cnVjdCBwYWdlICopOworCW5vZGUgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghbm9kZSkKKwkJcmV0dXJuIE5VTEw7CisJbWVtc2V0KG5vZGUsIDAsIHNpemUpOworCW5vZGUtPnRyZWUgPSB0cmVlOworCW5vZGUtPnRoaXMgPSBjbmlkOworCXNldF9iaXQoSEZTX0JOT0RFX05FVywgJm5vZGUtPmZsYWdzKTsKKwlhdG9taWNfc2V0KCZub2RlLT5yZWZjbnQsIDEpOworCWRwcmludChEQkdfQk5PREVfUkVGUywgIm5ld19ub2RlKCVkOiVkKTogMVxuIiwKKwkgICAgICAgbm9kZS0+dHJlZS0+Y25pZCwgbm9kZS0+dGhpcyk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmbm9kZS0+bG9ja193cSk7CisJc3Bpbl9sb2NrKCZ0cmVlLT5oYXNoX2xvY2spOworCW5vZGUyID0gaGZzX2Jub2RlX2ZpbmRoYXNoKHRyZWUsIGNuaWQpOworCWlmICghbm9kZTIpIHsKKwkJaGFzaCA9IGhmc19ibm9kZV9oYXNoKGNuaWQpOworCQlub2RlLT5uZXh0X2hhc2ggPSB0cmVlLT5ub2RlX2hhc2hbaGFzaF07CisJCXRyZWUtPm5vZGVfaGFzaFtoYXNoXSA9IG5vZGU7CisJCXRyZWUtPm5vZGVfaGFzaF9jbnQrKzsKKwl9IGVsc2UgeworCQlzcGluX3VubG9jaygmdHJlZS0+aGFzaF9sb2NrKTsKKwkJa2ZyZWUobm9kZSk7CisJCXdhaXRfZXZlbnQobm9kZTItPmxvY2tfd3EsICF0ZXN0X2JpdChIRlNfQk5PREVfTkVXLCAmbm9kZTItPmZsYWdzKSk7CisJCXJldHVybiBub2RlMjsKKwl9CisJc3Bpbl91bmxvY2soJnRyZWUtPmhhc2hfbG9jayk7CisKKwltYXBwaW5nID0gdHJlZS0+aW5vZGUtPmlfbWFwcGluZzsKKwlvZmYgPSAobG9mZl90KWNuaWQgKiB0cmVlLT5ub2RlX3NpemU7CisJYmxvY2sgPSBvZmYgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlub2RlLT5wYWdlX29mZnNldCA9IG9mZiAmIH5QQUdFX0NBQ0hFX01BU0s7CisJZm9yIChpID0gMDsgaSA8IHRyZWUtPnBhZ2VzX3Blcl9ibm9kZTsgaSsrKSB7CisJCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UobWFwcGluZywgYmxvY2srKywgKGZpbGxlcl90ICopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlLCBOVUxMKTsKKwkJaWYgKElTX0VSUihwYWdlKSkKKwkJCWdvdG8gZmFpbDsKKwkJaWYgKFBhZ2VFcnJvcihwYWdlKSkgeworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJZ290byBmYWlsOworCQl9CisjaWYgIVJFRl9QQUdFUworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisjZW5kaWYKKwkJbm9kZS0+cGFnZVtpXSA9IHBhZ2U7CisJfQorCisJcmV0dXJuIG5vZGU7CitmYWlsOgorCXNldF9iaXQoSEZTX0JOT0RFX0VSUk9SLCAmbm9kZS0+ZmxhZ3MpOworCXJldHVybiBub2RlOworfQorCit2b2lkIGhmc19ibm9kZV91bmhhc2goc3RydWN0IGhmc19ibm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgaGZzX2Jub2RlICoqcDsKKworCWRwcmludChEQkdfQk5PREVfUkVGUywgInJlbW92ZV9ub2RlKCVkOiVkKTogJWRcbiIsCisJCW5vZGUtPnRyZWUtPmNuaWQsIG5vZGUtPnRoaXMsIGF0b21pY19yZWFkKCZub2RlLT5yZWZjbnQpKTsKKwlmb3IgKHAgPSAmbm9kZS0+dHJlZS0+bm9kZV9oYXNoW2hmc19ibm9kZV9oYXNoKG5vZGUtPnRoaXMpXTsKKwkgICAgICpwICYmICpwICE9IG5vZGU7IHAgPSAmKCpwKS0+bmV4dF9oYXNoKQorCQk7CisJaWYgKCEqcCkKKwkJQlVHKCk7CisJKnAgPSBub2RlLT5uZXh0X2hhc2g7CisJbm9kZS0+dHJlZS0+bm9kZV9oYXNoX2NudC0tOworfQorCisvKiBMb2FkIGEgcGFydGljdWxhciBub2RlIG91dCBvZiBhIHRyZWUgKi8KK3N0cnVjdCBoZnNfYm5vZGUgKmhmc19ibm9kZV9maW5kKHN0cnVjdCBoZnNfYnRyZWUgKnRyZWUsIHUzMiBudW0pCit7CisJc3RydWN0IGhmc19ibm9kZSAqbm9kZTsKKwlzdHJ1Y3QgaGZzX2Jub2RlX2Rlc2MgKmRlc2M7CisJaW50IGksIHJlY19vZmYsIG9mZiwgbmV4dF9vZmY7CisJaW50IGVudHJ5X3NpemUsIGtleV9zaXplOworCisJc3Bpbl9sb2NrKCZ0cmVlLT5oYXNoX2xvY2spOworCW5vZGUgPSBoZnNfYm5vZGVfZmluZGhhc2godHJlZSwgbnVtKTsKKwlpZiAobm9kZSkgeworCQloZnNfYm5vZGVfZ2V0KG5vZGUpOworCQlzcGluX3VubG9jaygmdHJlZS0+aGFzaF9sb2NrKTsKKwkJd2FpdF9ldmVudChub2RlLT5sb2NrX3dxLCAhdGVzdF9iaXQoSEZTX0JOT0RFX05FVywgJm5vZGUtPmZsYWdzKSk7CisJCWlmICh0ZXN0X2JpdChIRlNfQk5PREVfRVJST1IsICZub2RlLT5mbGFncykpCisJCQlnb3RvIG5vZGVfZXJyb3I7CisJCXJldHVybiBub2RlOworCX0KKwlzcGluX3VubG9jaygmdHJlZS0+aGFzaF9sb2NrKTsKKwlub2RlID0gX19oZnNfYm5vZGVfY3JlYXRlKHRyZWUsIG51bSk7CisJaWYgKCFub2RlKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlpZiAodGVzdF9iaXQoSEZTX0JOT0RFX0VSUk9SLCAmbm9kZS0+ZmxhZ3MpKQorCQlnb3RvIG5vZGVfZXJyb3I7CisJaWYgKCF0ZXN0X2JpdChIRlNfQk5PREVfTkVXLCAmbm9kZS0+ZmxhZ3MpKQorCQlyZXR1cm4gbm9kZTsKKworCWRlc2MgPSAoc3RydWN0IGhmc19ibm9kZV9kZXNjICopKGttYXAobm9kZS0+cGFnZVswXSkgKyBub2RlLT5wYWdlX29mZnNldCk7CisJbm9kZS0+cHJldiA9IGJlMzJfdG9fY3B1KGRlc2MtPnByZXYpOworCW5vZGUtPm5leHQgPSBiZTMyX3RvX2NwdShkZXNjLT5uZXh0KTsKKwlub2RlLT5udW1fcmVjcyA9IGJlMTZfdG9fY3B1KGRlc2MtPm51bV9yZWNzKTsKKwlub2RlLT50eXBlID0gZGVzYy0+dHlwZTsKKwlub2RlLT5oZWlnaHQgPSBkZXNjLT5oZWlnaHQ7CisJa3VubWFwKG5vZGUtPnBhZ2VbMF0pOworCisJc3dpdGNoIChub2RlLT50eXBlKSB7CisJY2FzZSBIRlNfTk9ERV9IRUFERVI6CisJY2FzZSBIRlNfTk9ERV9NQVA6CisJCWlmIChub2RlLT5oZWlnaHQgIT0gMCkKKwkJCWdvdG8gbm9kZV9lcnJvcjsKKwkJYnJlYWs7CisJY2FzZSBIRlNfTk9ERV9MRUFGOgorCQlpZiAobm9kZS0+aGVpZ2h0ICE9IDEpCisJCQlnb3RvIG5vZGVfZXJyb3I7CisJCWJyZWFrOworCWNhc2UgSEZTX05PREVfSU5ERVg6CisJCWlmIChub2RlLT5oZWlnaHQgPD0gMSB8fCBub2RlLT5oZWlnaHQgPiB0cmVlLT5kZXB0aCkKKwkJCWdvdG8gbm9kZV9lcnJvcjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byBub2RlX2Vycm9yOworCX0KKworCXJlY19vZmYgPSB0cmVlLT5ub2RlX3NpemUgLSAyOworCW9mZiA9IGhmc19ibm9kZV9yZWFkX3UxNihub2RlLCByZWNfb2ZmKTsKKwlpZiAob2ZmICE9IHNpemVvZihzdHJ1Y3QgaGZzX2Jub2RlX2Rlc2MpKQorCQlnb3RvIG5vZGVfZXJyb3I7CisJZm9yIChpID0gMTsgaSA8PSBub2RlLT5udW1fcmVjczsgb2ZmID0gbmV4dF9vZmYsIGkrKykgeworCQlyZWNfb2ZmIC09IDI7CisJCW5leHRfb2ZmID0gaGZzX2Jub2RlX3JlYWRfdTE2KG5vZGUsIHJlY19vZmYpOworCQlpZiAobmV4dF9vZmYgPD0gb2ZmIHx8CisJCSAgICBuZXh0X29mZiA+IHRyZWUtPm5vZGVfc2l6ZSB8fAorCQkgICAgbmV4dF9vZmYgJiAxKQorCQkJZ290byBub2RlX2Vycm9yOworCQllbnRyeV9zaXplID0gbmV4dF9vZmYgLSBvZmY7CisJCWlmIChub2RlLT50eXBlICE9IEhGU19OT0RFX0lOREVYICYmCisJCSAgICBub2RlLT50eXBlICE9IEhGU19OT0RFX0xFQUYpCisJCQljb250aW51ZTsKKwkJa2V5X3NpemUgPSBoZnNfYm5vZGVfcmVhZF91OChub2RlLCBvZmYpICsgMTsKKwkJaWYgKGtleV9zaXplID49IGVudHJ5X3NpemUgLyp8fCBrZXlfc2l6ZSAmIDEqLykKKwkJCWdvdG8gbm9kZV9lcnJvcjsKKwl9CisJY2xlYXJfYml0KEhGU19CTk9ERV9ORVcsICZub2RlLT5mbGFncyk7CisJd2FrZV91cCgmbm9kZS0+bG9ja193cSk7CisJcmV0dXJuIG5vZGU7CisKK25vZGVfZXJyb3I6CisJc2V0X2JpdChIRlNfQk5PREVfRVJST1IsICZub2RlLT5mbGFncyk7CisJY2xlYXJfYml0KEhGU19CTk9ERV9ORVcsICZub2RlLT5mbGFncyk7CisJd2FrZV91cCgmbm9kZS0+bG9ja193cSk7CisJaGZzX2Jub2RlX3B1dChub2RlKTsKKwlyZXR1cm4gRVJSX1BUUigtRUlPKTsKK30KKwordm9pZCBoZnNfYm5vZGVfZnJlZShzdHJ1Y3QgaGZzX2Jub2RlICpub2RlKQoreworCS8vaW50IGk7CisKKwkvL2ZvciAoaSA9IDA7IGkgPCBub2RlLT50cmVlLT5wYWdlc19wZXJfYm5vZGU7IGkrKykKKwkvLwlpZiAobm9kZS0+cGFnZVtpXSkKKwkvLwkJcGFnZV9jYWNoZV9yZWxlYXNlKG5vZGUtPnBhZ2VbaV0pOworCWtmcmVlKG5vZGUpOworfQorCitzdHJ1Y3QgaGZzX2Jub2RlICpoZnNfYm5vZGVfY3JlYXRlKHN0cnVjdCBoZnNfYnRyZWUgKnRyZWUsIHUzMiBudW0pCit7CisJc3RydWN0IGhmc19ibm9kZSAqbm9kZTsKKwlzdHJ1Y3QgcGFnZSAqKnBhZ2VwOworCWludCBpOworCisJc3Bpbl9sb2NrKCZ0cmVlLT5oYXNoX2xvY2spOworCW5vZGUgPSBoZnNfYm5vZGVfZmluZGhhc2godHJlZSwgbnVtKTsKKwlzcGluX3VubG9jaygmdHJlZS0+aGFzaF9sb2NrKTsKKwlpZiAobm9kZSkKKwkJQlVHKCk7CisJbm9kZSA9IF9faGZzX2Jub2RlX2NyZWF0ZSh0cmVlLCBudW0pOworCWlmICghbm9kZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJaWYgKHRlc3RfYml0KEhGU19CTk9ERV9FUlJPUiwgJm5vZGUtPmZsYWdzKSkgeworCQloZnNfYm5vZGVfcHV0KG5vZGUpOworCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKKwl9CisKKwlwYWdlcCA9IG5vZGUtPnBhZ2U7CisJbWVtc2V0KGttYXAoKnBhZ2VwKSArIG5vZGUtPnBhZ2Vfb2Zmc2V0LCAwLAorCSAgICAgICBtaW4oKGludClQQUdFX0NBQ0hFX1NJWkUsIChpbnQpdHJlZS0+bm9kZV9zaXplKSk7CisJc2V0X3BhZ2VfZGlydHkoKnBhZ2VwKTsKKwlrdW5tYXAoKnBhZ2VwKTsKKwlmb3IgKGkgPSAxOyBpIDwgdHJlZS0+cGFnZXNfcGVyX2Jub2RlOyBpKyspIHsKKwkJbWVtc2V0KGttYXAoKisrcGFnZXApLCAwLCBQQUdFX0NBQ0hFX1NJWkUpOworCQlzZXRfcGFnZV9kaXJ0eSgqcGFnZXApOworCQlrdW5tYXAoKnBhZ2VwKTsKKwl9CisJY2xlYXJfYml0KEhGU19CTk9ERV9ORVcsICZub2RlLT5mbGFncyk7CisJd2FrZV91cCgmbm9kZS0+bG9ja193cSk7CisKKwlyZXR1cm4gbm9kZTsKK30KKwordm9pZCBoZnNfYm5vZGVfZ2V0KHN0cnVjdCBoZnNfYm5vZGUgKm5vZGUpCit7CisJaWYgKG5vZGUpIHsKKwkJYXRvbWljX2luYygmbm9kZS0+cmVmY250KTsKKyNpZiBSRUZfUEFHRVMKKwkJeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IG5vZGUtPnRyZWUtPnBhZ2VzX3Blcl9ibm9kZTsgaSsrKQorCQkJZ2V0X3BhZ2Uobm9kZS0+cGFnZVtpXSk7CisJCX0KKyNlbmRpZgorCQlkcHJpbnQoREJHX0JOT0RFX1JFRlMsICJnZXRfbm9kZSglZDolZCk6ICVkXG4iLAorCQkgICAgICAgbm9kZS0+dHJlZS0+Y25pZCwgbm9kZS0+dGhpcywgYXRvbWljX3JlYWQoJm5vZGUtPnJlZmNudCkpOworCX0KK30KKworLyogRGlzcG9zZSBvZiByZXNvdXJjZXMgdXNlZCBieSBhIG5vZGUgKi8KK3ZvaWQgaGZzX2Jub2RlX3B1dChzdHJ1Y3QgaGZzX2Jub2RlICpub2RlKQoreworCWlmIChub2RlKSB7CisJCXN0cnVjdCBoZnNfYnRyZWUgKnRyZWUgPSBub2RlLT50cmVlOworCQlpbnQgaTsKKworCQlkcHJpbnQoREJHX0JOT0RFX1JFRlMsICJwdXRfbm9kZSglZDolZCk6ICVkXG4iLAorCQkgICAgICAgbm9kZS0+dHJlZS0+Y25pZCwgbm9kZS0+dGhpcywgYXRvbWljX3JlYWQoJm5vZGUtPnJlZmNudCkpOworCQlpZiAoIWF0b21pY19yZWFkKCZub2RlLT5yZWZjbnQpKQorCQkJQlVHKCk7CisJCWlmICghYXRvbWljX2RlY19hbmRfbG9jaygmbm9kZS0+cmVmY250LCAmdHJlZS0+aGFzaF9sb2NrKSkgeworI2lmIFJFRl9QQUdFUworCQkJZm9yIChpID0gMDsgaSA8IHRyZWUtPnBhZ2VzX3Blcl9ibm9kZTsgaSsrKQorCQkJCXB1dF9wYWdlKG5vZGUtPnBhZ2VbaV0pOworI2VuZGlmCisJCQlyZXR1cm47CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IHRyZWUtPnBhZ2VzX3Blcl9ibm9kZTsgaSsrKSB7CisJCQltYXJrX3BhZ2VfYWNjZXNzZWQobm9kZS0+cGFnZVtpXSk7CisjaWYgUkVGX1BBR0VTCisJCQlwdXRfcGFnZShub2RlLT5wYWdlW2ldKTsKKyNlbmRpZgorCQl9CisKKwkJaWYgKHRlc3RfYml0KEhGU19CTk9ERV9ERUxFVEVELCAmbm9kZS0+ZmxhZ3MpKSB7CisJCQloZnNfYm5vZGVfdW5oYXNoKG5vZGUpOworCQkJc3Bpbl91bmxvY2soJnRyZWUtPmhhc2hfbG9jayk7CisJCQloZnNfYm1hcF9mcmVlKG5vZGUpOworCQkJaGZzX2Jub2RlX2ZyZWUobm9kZSk7CisJCQlyZXR1cm47CisJCX0KKwkJc3Bpbl91bmxvY2soJnRyZWUtPmhhc2hfbG9jayk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZnMvaGZzL2JyZWMuYyBiL2ZzL2hmcy9icmVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q4ZmZmMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmcy9icmVjLmMKQEAgLTAsMCArMSw0OTYgQEAKKy8qCisgKiAgbGludXgvZnMvaGZzL2JyZWMuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMQorICogQnJhZCBCb3llciAoZmxhckBhbGxhbmRyaWEuY29tKQorICogKEMpIDIwMDMgQXJkaXMgVGVjaG5vbG9naWVzIDxyb21hbkBhcmRpc3RlY2guY29tPgorICoKKyAqIEhhbmRsZSBpbmRpdmlkdWFsIGJ0cmVlIHJlY29yZHMKKyAqLworCisjaW5jbHVkZSAiYnRyZWUuaCIKKworc3RhdGljIHN0cnVjdCBoZnNfYm5vZGUgKmhmc19ibm9kZV9zcGxpdChzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqZmQpOworc3RhdGljIGludCBoZnNfYnJlY191cGRhdGVfcGFyZW50KHN0cnVjdCBoZnNfZmluZF9kYXRhICpmZCk7CitzdGF0aWMgaW50IGhmc19idHJlZV9pbmNfaGVpZ2h0KHN0cnVjdCBoZnNfYnRyZWUgKnRyZWUpOworCisvKiBHZXQgdGhlIGxlbmd0aCBhbmQgb2Zmc2V0IG9mIHRoZSBnaXZlbiByZWNvcmQgaW4gdGhlIGdpdmVuIG5vZGUgKi8KK3UxNiBoZnNfYnJlY19sZW5vZmYoc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgdTE2IHJlYywgdTE2ICpvZmYpCit7CisJX19iZTE2IHJldHZhbFsyXTsKKwl1MTYgZGF0YW9mZjsKKworCWRhdGFvZmYgPSBub2RlLT50cmVlLT5ub2RlX3NpemUgLSAocmVjICsgMikgKiAyOworCWhmc19ibm9kZV9yZWFkKG5vZGUsIHJldHZhbCwgZGF0YW9mZiwgNCk7CisJKm9mZiA9IGJlMTZfdG9fY3B1KHJldHZhbFsxXSk7CisJcmV0dXJuIGJlMTZfdG9fY3B1KHJldHZhbFswXSkgLSAqb2ZmOworfQorCisvKiBHZXQgdGhlIGxlbmd0aCBvZiB0aGUga2V5IGZyb20gYSBrZXllZCByZWNvcmQgKi8KK3UxNiBoZnNfYnJlY19rZXlsZW4oc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgdTE2IHJlYykKK3sKKwl1MTYgcmV0dmFsLCByZWNvZmY7CisKKwlpZiAobm9kZS0+dHlwZSAhPSBIRlNfTk9ERV9JTkRFWCAmJiBub2RlLT50eXBlICE9IEhGU19OT0RFX0xFQUYpCisJCXJldHVybiAwOworCisJaWYgKChub2RlLT50eXBlID09IEhGU19OT0RFX0lOREVYKSAmJgorCSAgICEobm9kZS0+dHJlZS0+YXR0cmlidXRlcyAmIEhGU19UUkVFX1ZBUklEWEtFWVMpKSB7CisJCWlmIChub2RlLT50cmVlLT5hdHRyaWJ1dGVzICYgSEZTX1RSRUVfQklHS0VZUykKKwkJCXJldHZhbCA9IG5vZGUtPnRyZWUtPm1heF9rZXlfbGVuICsgMjsKKwkJZWxzZQorCQkJcmV0dmFsID0gbm9kZS0+dHJlZS0+bWF4X2tleV9sZW4gKyAxOworCX0gZWxzZSB7CisJCXJlY29mZiA9IGhmc19ibm9kZV9yZWFkX3UxNihub2RlLCBub2RlLT50cmVlLT5ub2RlX3NpemUgLSAocmVjICsgMSkgKiAyKTsKKwkJaWYgKCFyZWNvZmYpCisJCQlyZXR1cm4gMDsKKwkJaWYgKG5vZGUtPnRyZWUtPmF0dHJpYnV0ZXMgJiBIRlNfVFJFRV9CSUdLRVlTKQorCQkJcmV0dmFsID0gaGZzX2Jub2RlX3JlYWRfdTE2KG5vZGUsIHJlY29mZikgKyAyOworCQllbHNlCisJCQlyZXR2YWwgPSAoaGZzX2Jub2RlX3JlYWRfdTgobm9kZSwgcmVjb2ZmKSB8IDEpICsgMTsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworaW50IGhmc19icmVjX2luc2VydChzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqZmQsIHZvaWQgKmVudHJ5LCBpbnQgZW50cnlfbGVuKQoreworCXN0cnVjdCBoZnNfYnRyZWUgKnRyZWU7CisJc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgKm5ld19ub2RlOworCWludCBzaXplLCBrZXlfbGVuLCByZWM7CisJaW50IGRhdGFfb2ZmLCBlbmRfb2ZmOworCWludCBpZHhfcmVjX29mZiwgZGF0YV9yZWNfb2ZmLCBlbmRfcmVjX29mZjsKKwlfX2JlMzIgY25pZDsKKworCXRyZWUgPSBmZC0+dHJlZTsKKwlpZiAoIWZkLT5ibm9kZSkgeworCQlpZiAoIXRyZWUtPnJvb3QpCisJCQloZnNfYnRyZWVfaW5jX2hlaWdodCh0cmVlKTsKKwkJZmQtPmJub2RlID0gaGZzX2Jub2RlX2ZpbmQodHJlZSwgdHJlZS0+bGVhZl9oZWFkKTsKKwkJaWYgKElTX0VSUihmZC0+Ym5vZGUpKQorCQkJcmV0dXJuIFBUUl9FUlIoZmQtPmJub2RlKTsKKwkJZmQtPnJlY29yZCA9IC0xOworCX0KKwluZXdfbm9kZSA9IE5VTEw7CisJa2V5X2xlbiA9IChmZC0+c2VhcmNoX2tleS0+a2V5X2xlbiB8IDEpICsgMTsKK2FnYWluOgorCS8qIG5ldyByZWNvcmQgaWR4IGFuZCBjb21wbGV0ZSByZWNvcmQgc2l6ZSAqLworCXJlYyA9IGZkLT5yZWNvcmQgKyAxOworCXNpemUgPSBrZXlfbGVuICsgZW50cnlfbGVuOworCisJbm9kZSA9IGZkLT5ibm9kZTsKKwloZnNfYm5vZGVfZHVtcChub2RlKTsKKwkvKiBnZXQgbGFzdCBvZmZzZXQgKi8KKwllbmRfcmVjX29mZiA9IHRyZWUtPm5vZGVfc2l6ZSAtIChub2RlLT5udW1fcmVjcyArIDEpICogMjsKKwllbmRfb2ZmID0gaGZzX2Jub2RlX3JlYWRfdTE2KG5vZGUsIGVuZF9yZWNfb2ZmKTsKKwllbmRfcmVjX29mZiAtPSAyOworCWRwcmludChEQkdfQk5PREVfTU9ELCAiaW5zZXJ0X3JlYzogJWQsICVkLCAlZCwgJWRcbiIsIHJlYywgc2l6ZSwgZW5kX29mZiwgZW5kX3JlY19vZmYpOworCWlmIChzaXplID4gZW5kX3JlY19vZmYgLSBlbmRfb2ZmKSB7CisJCWlmIChuZXdfbm9kZSkKKwkJCXBhbmljKCJub3QgZW5vdWdoIHJvb20hXG4iKTsKKwkJbmV3X25vZGUgPSBoZnNfYm5vZGVfc3BsaXQoZmQpOworCQlpZiAoSVNfRVJSKG5ld19ub2RlKSkKKwkJCXJldHVybiBQVFJfRVJSKG5ld19ub2RlKTsKKwkJZ290byBhZ2FpbjsKKwl9CisJaWYgKG5vZGUtPnR5cGUgPT0gSEZTX05PREVfTEVBRikgeworCQl0cmVlLT5sZWFmX2NvdW50Kys7CisJCW1hcmtfaW5vZGVfZGlydHkodHJlZS0+aW5vZGUpOworCX0KKwlub2RlLT5udW1fcmVjcysrOworCS8qIHdyaXRlIG5ldyBsYXN0IG9mZnNldCAqLworCWhmc19ibm9kZV93cml0ZV91MTYobm9kZSwgb2Zmc2V0b2Yoc3RydWN0IGhmc19ibm9kZV9kZXNjLCBudW1fcmVjcyksIG5vZGUtPm51bV9yZWNzKTsKKwloZnNfYm5vZGVfd3JpdGVfdTE2KG5vZGUsIGVuZF9yZWNfb2ZmLCBlbmRfb2ZmICsgc2l6ZSk7CisJZGF0YV9vZmYgPSBlbmRfb2ZmOworCWRhdGFfcmVjX29mZiA9IGVuZF9yZWNfb2ZmICsgMjsKKwlpZHhfcmVjX29mZiA9IHRyZWUtPm5vZGVfc2l6ZSAtIChyZWMgKyAxKSAqIDI7CisJaWYgKGlkeF9yZWNfb2ZmID09IGRhdGFfcmVjX29mZikKKwkJZ290byBza2lwOworCS8qIG1vdmUgYWxsIGZvbGxvd2luZyBlbnRyaWVzICovCisJZG8geworCQlkYXRhX29mZiA9IGhmc19ibm9kZV9yZWFkX3UxNihub2RlLCBkYXRhX3JlY19vZmYgKyAyKTsKKwkJaGZzX2Jub2RlX3dyaXRlX3UxNihub2RlLCBkYXRhX3JlY19vZmYsIGRhdGFfb2ZmICsgc2l6ZSk7CisJCWRhdGFfcmVjX29mZiArPSAyOworCX0gd2hpbGUgKGRhdGFfcmVjX29mZiA8IGlkeF9yZWNfb2ZmKTsKKworCS8qIG1vdmUgZGF0YSBhd2F5ICovCisJaGZzX2Jub2RlX21vdmUobm9kZSwgZGF0YV9vZmYgKyBzaXplLCBkYXRhX29mZiwKKwkJICAgICAgIGVuZF9vZmYgLSBkYXRhX29mZik7CisKK3NraXA6CisJaGZzX2Jub2RlX3dyaXRlKG5vZGUsIGZkLT5zZWFyY2hfa2V5LCBkYXRhX29mZiwga2V5X2xlbik7CisJaGZzX2Jub2RlX3dyaXRlKG5vZGUsIGVudHJ5LCBkYXRhX29mZiArIGtleV9sZW4sIGVudHJ5X2xlbik7CisJaGZzX2Jub2RlX2R1bXAobm9kZSk7CisKKwlpZiAobmV3X25vZGUpIHsKKwkJLyogdXBkYXRlIHBhcmVudCBrZXkgaWYgd2UgaW5zZXJ0ZWQgYSBrZXkKKwkJICogYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCBub2RlCisJCSAqLworCQlpZiAoIXJlYyAmJiBuZXdfbm9kZSAhPSBub2RlKQorCQkJaGZzX2JyZWNfdXBkYXRlX3BhcmVudChmZCk7CisKKwkJaGZzX2Jub2RlX3B1dChmZC0+Ym5vZGUpOworCQlpZiAoIW5ld19ub2RlLT5wYXJlbnQpIHsKKwkJCWhmc19idHJlZV9pbmNfaGVpZ2h0KHRyZWUpOworCQkJbmV3X25vZGUtPnBhcmVudCA9IHRyZWUtPnJvb3Q7CisJCX0KKwkJZmQtPmJub2RlID0gaGZzX2Jub2RlX2ZpbmQodHJlZSwgbmV3X25vZGUtPnBhcmVudCk7CisKKwkJLyogY3JlYXRlIGluZGV4IGRhdGEgZW50cnkgKi8KKwkJY25pZCA9IGNwdV90b19iZTMyKG5ld19ub2RlLT50aGlzKTsKKwkJZW50cnkgPSAmY25pZDsKKwkJZW50cnlfbGVuID0gc2l6ZW9mKGNuaWQpOworCisJCS8qIGdldCBpbmRleCBrZXkgKi8KKwkJaGZzX2Jub2RlX3JlYWRfa2V5KG5ld19ub2RlLCBmZC0+c2VhcmNoX2tleSwgMTQpOworCQlfX2hmc19icmVjX2ZpbmQoZmQtPmJub2RlLCBmZCk7CisKKwkJaGZzX2Jub2RlX3B1dChuZXdfbm9kZSk7CisJCW5ld19ub2RlID0gTlVMTDsKKworCQlpZiAodHJlZS0+YXR0cmlidXRlcyAmIEhGU19UUkVFX1ZBUklEWEtFWVMpCisJCQlrZXlfbGVuID0gZmQtPnNlYXJjaF9rZXktPmtleV9sZW4gKyAxOworCQllbHNlIHsKKwkJCWZkLT5zZWFyY2hfa2V5LT5rZXlfbGVuID0gdHJlZS0+bWF4X2tleV9sZW47CisJCQlrZXlfbGVuID0gdHJlZS0+bWF4X2tleV9sZW4gKyAxOworCQl9CisJCWdvdG8gYWdhaW47CisJfQorCisJaWYgKCFyZWMpCisJCWhmc19icmVjX3VwZGF0ZV9wYXJlbnQoZmQpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBoZnNfYnJlY19yZW1vdmUoc3RydWN0IGhmc19maW5kX2RhdGEgKmZkKQoreworCXN0cnVjdCBoZnNfYnRyZWUgKnRyZWU7CisJc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgKnBhcmVudDsKKwlpbnQgZW5kX29mZiwgcmVjX29mZiwgZGF0YV9vZmYsIHNpemU7CisKKwl0cmVlID0gZmQtPnRyZWU7CisJbm9kZSA9IGZkLT5ibm9kZTsKK2FnYWluOgorCXJlY19vZmYgPSB0cmVlLT5ub2RlX3NpemUgLSAoZmQtPnJlY29yZCArIDIpICogMjsKKwllbmRfb2ZmID0gdHJlZS0+bm9kZV9zaXplIC0gKG5vZGUtPm51bV9yZWNzICsgMSkgKiAyOworCisJaWYgKG5vZGUtPnR5cGUgPT0gSEZTX05PREVfTEVBRikgeworCQl0cmVlLT5sZWFmX2NvdW50LS07CisJCW1hcmtfaW5vZGVfZGlydHkodHJlZS0+aW5vZGUpOworCX0KKwloZnNfYm5vZGVfZHVtcChub2RlKTsKKwlkcHJpbnQoREJHX0JOT0RFX01PRCwgInJlbW92ZV9yZWM6ICVkLCAlZFxuIiwgZmQtPnJlY29yZCwgZmQtPmtleWxlbmd0aCArIGZkLT5lbnRyeWxlbmd0aCk7CisJaWYgKCEtLW5vZGUtPm51bV9yZWNzKSB7CisJCWhmc19ibm9kZV91bmxpbmsobm9kZSk7CisJCWlmICghbm9kZS0+cGFyZW50KQorCQkJcmV0dXJuIDA7CisJCXBhcmVudCA9IGhmc19ibm9kZV9maW5kKHRyZWUsIG5vZGUtPnBhcmVudCk7CisJCWlmIChJU19FUlIocGFyZW50KSkKKwkJCXJldHVybiBQVFJfRVJSKHBhcmVudCk7CisJCWhmc19ibm9kZV9wdXQobm9kZSk7CisJCW5vZGUgPSBmZC0+Ym5vZGUgPSBwYXJlbnQ7CisKKwkJX19oZnNfYnJlY19maW5kKG5vZGUsIGZkKTsKKwkJZ290byBhZ2FpbjsKKwl9CisJaGZzX2Jub2RlX3dyaXRlX3UxNihub2RlLCBvZmZzZXRvZihzdHJ1Y3QgaGZzX2Jub2RlX2Rlc2MsIG51bV9yZWNzKSwgbm9kZS0+bnVtX3JlY3MpOworCisJaWYgKHJlY19vZmYgPT0gZW5kX29mZikKKwkJZ290byBza2lwOworCXNpemUgPSBmZC0+a2V5bGVuZ3RoICsgZmQtPmVudHJ5bGVuZ3RoOworCisJZG8geworCQlkYXRhX29mZiA9IGhmc19ibm9kZV9yZWFkX3UxNihub2RlLCByZWNfb2ZmKTsKKwkJaGZzX2Jub2RlX3dyaXRlX3UxNihub2RlLCByZWNfb2ZmICsgMiwgZGF0YV9vZmYgLSBzaXplKTsKKwkJcmVjX29mZiAtPSAyOworCX0gd2hpbGUgKHJlY19vZmYgPj0gZW5kX29mZik7CisKKwkvKiBmaWxsIGhvbGUgKi8KKwloZnNfYm5vZGVfbW92ZShub2RlLCBmZC0+a2V5b2Zmc2V0LCBmZC0+a2V5b2Zmc2V0ICsgc2l6ZSwKKwkJICAgICAgIGRhdGFfb2ZmIC0gZmQtPmtleW9mZnNldCAtIHNpemUpOworc2tpcDoKKwloZnNfYm5vZGVfZHVtcChub2RlKTsKKwlpZiAoIWZkLT5yZWNvcmQpCisJCWhmc19icmVjX3VwZGF0ZV9wYXJlbnQoZmQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGhmc19ibm9kZSAqaGZzX2Jub2RlX3NwbGl0KHN0cnVjdCBoZnNfZmluZF9kYXRhICpmZCkKK3sKKwlzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlOworCXN0cnVjdCBoZnNfYm5vZGUgKm5vZGUsICpuZXdfbm9kZTsKKwlzdHJ1Y3QgaGZzX2Jub2RlX2Rlc2Mgbm9kZV9kZXNjOworCWludCBudW1fcmVjcywgbmV3X3JlY19vZmYsIG5ld19vZmYsIG9sZF9yZWNfb2ZmOworCWludCBkYXRhX3N0YXJ0LCBkYXRhX2VuZCwgc2l6ZTsKKworCXRyZWUgPSBmZC0+dHJlZTsKKwlub2RlID0gZmQtPmJub2RlOworCW5ld19ub2RlID0gaGZzX2JtYXBfYWxsb2ModHJlZSk7CisJaWYgKElTX0VSUihuZXdfbm9kZSkpCisJCXJldHVybiBuZXdfbm9kZTsKKwloZnNfYm5vZGVfZ2V0KG5vZGUpOworCWRwcmludChEQkdfQk5PREVfTU9ELCAic3BsaXRfbm9kZXM6ICVkIC0gJWQgLSAlZFxuIiwKKwkJbm9kZS0+dGhpcywgbmV3X25vZGUtPnRoaXMsIG5vZGUtPm5leHQpOworCW5ld19ub2RlLT5uZXh0ID0gbm9kZS0+bmV4dDsKKwluZXdfbm9kZS0+cHJldiA9IG5vZGUtPnRoaXM7CisJbmV3X25vZGUtPnBhcmVudCA9IG5vZGUtPnBhcmVudDsKKwluZXdfbm9kZS0+dHlwZSA9IG5vZGUtPnR5cGU7CisJbmV3X25vZGUtPmhlaWdodCA9IG5vZGUtPmhlaWdodDsKKworCXNpemUgPSB0cmVlLT5ub2RlX3NpemUgLyAyIC0gbm9kZS0+bnVtX3JlY3MgKiAyIC0gMTQ7CisJb2xkX3JlY19vZmYgPSB0cmVlLT5ub2RlX3NpemUgLSA0OworCW51bV9yZWNzID0gMTsKKwlmb3IgKDs7KSB7CisJCWRhdGFfc3RhcnQgPSBoZnNfYm5vZGVfcmVhZF91MTYobm9kZSwgb2xkX3JlY19vZmYpOworCQlpZiAoZGF0YV9zdGFydCA+IHNpemUpCisJCQlicmVhazsKKwkJb2xkX3JlY19vZmYgLT0gMjsKKwkJaWYgKCsrbnVtX3JlY3MgPCBub2RlLT5udW1fcmVjcykKKwkJCWNvbnRpbnVlOworCQkvKiBwYW5pYz8gKi8KKwkJaGZzX2Jub2RlX3B1dChub2RlKTsKKwkJaGZzX2Jub2RlX3B1dChuZXdfbm9kZSk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9TUEMpOworCX0KKworCWlmIChmZC0+cmVjb3JkICsgMSA8IG51bV9yZWNzKSB7CisJCS8qIG5ldyByZWNvcmQgaXMgaW4gdGhlIGxvd2VyIGhhbGYsCisJCSAqIHNvIGxlYXZlIHNvbWUgbW9yZSBzcGFjZSB0aGVyZQorCQkgKi8KKwkJb2xkX3JlY19vZmYgKz0gMjsKKwkJbnVtX3JlY3MtLTsKKwkJZGF0YV9zdGFydCA9IGhmc19ibm9kZV9yZWFkX3UxNihub2RlLCBvbGRfcmVjX29mZik7CisJfSBlbHNlIHsKKwkJaGZzX2Jub2RlX3B1dChub2RlKTsKKwkJaGZzX2Jub2RlX2dldChuZXdfbm9kZSk7CisJCWZkLT5ibm9kZSA9IG5ld19ub2RlOworCQlmZC0+cmVjb3JkIC09IG51bV9yZWNzOworCQlmZC0+a2V5b2Zmc2V0IC09IGRhdGFfc3RhcnQgLSAxNDsKKwkJZmQtPmVudHJ5b2Zmc2V0IC09IGRhdGFfc3RhcnQgLSAxNDsKKwl9CisJbmV3X25vZGUtPm51bV9yZWNzID0gbm9kZS0+bnVtX3JlY3MgLSBudW1fcmVjczsKKwlub2RlLT5udW1fcmVjcyA9IG51bV9yZWNzOworCisJbmV3X3JlY19vZmYgPSB0cmVlLT5ub2RlX3NpemUgLSAyOworCW5ld19vZmYgPSAxNDsKKwlzaXplID0gZGF0YV9zdGFydCAtIG5ld19vZmY7CisJbnVtX3JlY3MgPSBuZXdfbm9kZS0+bnVtX3JlY3M7CisJZGF0YV9lbmQgPSBkYXRhX3N0YXJ0OworCXdoaWxlIChudW1fcmVjcykgeworCQloZnNfYm5vZGVfd3JpdGVfdTE2KG5ld19ub2RlLCBuZXdfcmVjX29mZiwgbmV3X29mZik7CisJCW9sZF9yZWNfb2ZmIC09IDI7CisJCW5ld19yZWNfb2ZmIC09IDI7CisJCWRhdGFfZW5kID0gaGZzX2Jub2RlX3JlYWRfdTE2KG5vZGUsIG9sZF9yZWNfb2ZmKTsKKwkJbmV3X29mZiA9IGRhdGFfZW5kIC0gc2l6ZTsKKwkJbnVtX3JlY3MtLTsKKwl9CisJaGZzX2Jub2RlX3dyaXRlX3UxNihuZXdfbm9kZSwgbmV3X3JlY19vZmYsIG5ld19vZmYpOworCWhmc19ibm9kZV9jb3B5KG5ld19ub2RlLCAxNCwgbm9kZSwgZGF0YV9zdGFydCwgZGF0YV9lbmQgLSBkYXRhX3N0YXJ0KTsKKworCS8qIHVwZGF0ZSBuZXcgYm5vZGUgaGVhZGVyICovCisJbm9kZV9kZXNjLm5leHQgPSBjcHVfdG9fYmUzMihuZXdfbm9kZS0+bmV4dCk7CisJbm9kZV9kZXNjLnByZXYgPSBjcHVfdG9fYmUzMihuZXdfbm9kZS0+cHJldik7CisJbm9kZV9kZXNjLnR5cGUgPSBuZXdfbm9kZS0+dHlwZTsKKwlub2RlX2Rlc2MuaGVpZ2h0ID0gbmV3X25vZGUtPmhlaWdodDsKKwlub2RlX2Rlc2MubnVtX3JlY3MgPSBjcHVfdG9fYmUxNihuZXdfbm9kZS0+bnVtX3JlY3MpOworCW5vZGVfZGVzYy5yZXNlcnZlZCA9IDA7CisJaGZzX2Jub2RlX3dyaXRlKG5ld19ub2RlLCAmbm9kZV9kZXNjLCAwLCBzaXplb2Yobm9kZV9kZXNjKSk7CisKKwkvKiB1cGRhdGUgcHJldmlvdXMgYm5vZGUgaGVhZGVyICovCisJbm9kZS0+bmV4dCA9IG5ld19ub2RlLT50aGlzOworCWhmc19ibm9kZV9yZWFkKG5vZGUsICZub2RlX2Rlc2MsIDAsIHNpemVvZihub2RlX2Rlc2MpKTsKKwlub2RlX2Rlc2MubmV4dCA9IGNwdV90b19iZTMyKG5vZGUtPm5leHQpOworCW5vZGVfZGVzYy5udW1fcmVjcyA9IGNwdV90b19iZTE2KG5vZGUtPm51bV9yZWNzKTsKKwloZnNfYm5vZGVfd3JpdGUobm9kZSwgJm5vZGVfZGVzYywgMCwgc2l6ZW9mKG5vZGVfZGVzYykpOworCisJLyogdXBkYXRlIG5leHQgYm5vZGUgaGVhZGVyICovCisJaWYgKG5ld19ub2RlLT5uZXh0KSB7CisJCXN0cnVjdCBoZnNfYm5vZGUgKm5leHRfbm9kZSA9IGhmc19ibm9kZV9maW5kKHRyZWUsIG5ld19ub2RlLT5uZXh0KTsKKwkJbmV4dF9ub2RlLT5wcmV2ID0gbmV3X25vZGUtPnRoaXM7CisJCWhmc19ibm9kZV9yZWFkKG5leHRfbm9kZSwgJm5vZGVfZGVzYywgMCwgc2l6ZW9mKG5vZGVfZGVzYykpOworCQlub2RlX2Rlc2MucHJldiA9IGNwdV90b19iZTMyKG5leHRfbm9kZS0+cHJldik7CisJCWhmc19ibm9kZV93cml0ZShuZXh0X25vZGUsICZub2RlX2Rlc2MsIDAsIHNpemVvZihub2RlX2Rlc2MpKTsKKwkJaGZzX2Jub2RlX3B1dChuZXh0X25vZGUpOworCX0gZWxzZSBpZiAobm9kZS0+dGhpcyA9PSB0cmVlLT5sZWFmX3RhaWwpIHsKKwkJLyogaWYgdGhlcmUgaXMgbm8gbmV4dCBub2RlLCB0aGlzIG1pZ2h0IGJlIHRoZSBuZXcgdGFpbCAqLworCQl0cmVlLT5sZWFmX3RhaWwgPSBuZXdfbm9kZS0+dGhpczsKKwkJbWFya19pbm9kZV9kaXJ0eSh0cmVlLT5pbm9kZSk7CisJfQorCisJaGZzX2Jub2RlX2R1bXAobm9kZSk7CisJaGZzX2Jub2RlX2R1bXAobmV3X25vZGUpOworCWhmc19ibm9kZV9wdXQobm9kZSk7CisKKwlyZXR1cm4gbmV3X25vZGU7Cit9CisKK3N0YXRpYyBpbnQgaGZzX2JyZWNfdXBkYXRlX3BhcmVudChzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqZmQpCit7CisJc3RydWN0IGhmc19idHJlZSAqdHJlZTsKKwlzdHJ1Y3QgaGZzX2Jub2RlICpub2RlLCAqbmV3X25vZGUsICpwYXJlbnQ7CisJaW50IG5ld2tleWxlbiwgZGlmZjsKKwlpbnQgcmVjLCByZWNfb2ZmLCBlbmRfcmVjX29mZjsKKwlpbnQgc3RhcnRfb2ZmLCBlbmRfb2ZmOworCisJdHJlZSA9IGZkLT50cmVlOworCW5vZGUgPSBmZC0+Ym5vZGU7CisJbmV3X25vZGUgPSBOVUxMOworCWlmICghbm9kZS0+cGFyZW50KQorCQlyZXR1cm4gMDsKKworYWdhaW46CisJcGFyZW50ID0gaGZzX2Jub2RlX2ZpbmQodHJlZSwgbm9kZS0+cGFyZW50KTsKKwlpZiAoSVNfRVJSKHBhcmVudCkpCisJCXJldHVybiBQVFJfRVJSKHBhcmVudCk7CisJX19oZnNfYnJlY19maW5kKHBhcmVudCwgZmQpOworCWhmc19ibm9kZV9kdW1wKHBhcmVudCk7CisJcmVjID0gZmQtPnJlY29yZDsKKworCS8qIHNpemUgZGlmZmVyZW5jZSBiZXR3ZWVuIG9sZCBhbmQgbmV3IGtleSAqLworCWlmICh0cmVlLT5hdHRyaWJ1dGVzICYgSEZTX1RSRUVfVkFSSURYS0VZUykKKwkJbmV3a2V5bGVuID0gKGhmc19ibm9kZV9yZWFkX3U4KG5vZGUsIDE0KSB8IDEpICsgMTsKKwllbHNlCisJCWZkLT5rZXlsZW5ndGggPSBuZXdrZXlsZW4gPSB0cmVlLT5tYXhfa2V5X2xlbiArIDE7CisJZHByaW50KERCR19CTk9ERV9NT0QsICJ1cGRhdGVfcmVjOiAlZCwgJWQsICVkXG4iLCByZWMsIGZkLT5rZXlsZW5ndGgsIG5ld2tleWxlbik7CisKKwlyZWNfb2ZmID0gdHJlZS0+bm9kZV9zaXplIC0gKHJlYyArIDIpICogMjsKKwllbmRfcmVjX29mZiA9IHRyZWUtPm5vZGVfc2l6ZSAtIChwYXJlbnQtPm51bV9yZWNzICsgMSkgKiAyOworCWRpZmYgPSBuZXdrZXlsZW4gLSBmZC0+a2V5bGVuZ3RoOworCWlmICghZGlmZikKKwkJZ290byBza2lwOworCWlmIChkaWZmID4gMCkgeworCQllbmRfb2ZmID0gaGZzX2Jub2RlX3JlYWRfdTE2KHBhcmVudCwgZW5kX3JlY19vZmYpOworCQlpZiAoZW5kX3JlY19vZmYgLSBlbmRfb2ZmIDwgZGlmZikgeworCisJCQlwcmludGsoInNwbGl0dGluZyBpbmRleCBub2RlLi4uXG4iKTsKKwkJCWZkLT5ibm9kZSA9IHBhcmVudDsKKwkJCW5ld19ub2RlID0gaGZzX2Jub2RlX3NwbGl0KGZkKTsKKwkJCWlmIChJU19FUlIobmV3X25vZGUpKQorCQkJCXJldHVybiBQVFJfRVJSKG5ld19ub2RlKTsKKwkJCXBhcmVudCA9IGZkLT5ibm9kZTsKKwkJCXJlYyA9IGZkLT5yZWNvcmQ7CisJCQlyZWNfb2ZmID0gdHJlZS0+bm9kZV9zaXplIC0gKHJlYyArIDIpICogMjsKKwkJCWVuZF9yZWNfb2ZmID0gdHJlZS0+bm9kZV9zaXplIC0gKHBhcmVudC0+bnVtX3JlY3MgKyAxKSAqIDI7CisJCX0KKwl9CisKKwllbmRfb2ZmID0gc3RhcnRfb2ZmID0gaGZzX2Jub2RlX3JlYWRfdTE2KHBhcmVudCwgcmVjX29mZik7CisJaGZzX2Jub2RlX3dyaXRlX3UxNihwYXJlbnQsIHJlY19vZmYsIHN0YXJ0X29mZiArIGRpZmYpOworCXN0YXJ0X29mZiAtPSA0OwkvKiBtb3ZlIHByZXZpb3VzIGNuaWQgdG9vICovCisKKwl3aGlsZSAocmVjX29mZiA+IGVuZF9yZWNfb2ZmKSB7CisJCXJlY19vZmYgLT0gMjsKKwkJZW5kX29mZiA9IGhmc19ibm9kZV9yZWFkX3UxNihwYXJlbnQsIHJlY19vZmYpOworCQloZnNfYm5vZGVfd3JpdGVfdTE2KHBhcmVudCwgcmVjX29mZiwgZW5kX29mZiArIGRpZmYpOworCX0KKwloZnNfYm5vZGVfbW92ZShwYXJlbnQsIHN0YXJ0X29mZiArIGRpZmYsIHN0YXJ0X29mZiwKKwkJICAgICAgIGVuZF9vZmYgLSBzdGFydF9vZmYpOworc2tpcDoKKwloZnNfYm5vZGVfY29weShwYXJlbnQsIGZkLT5rZXlvZmZzZXQsIG5vZGUsIDE0LCBuZXdrZXlsZW4pOworCWlmICghKHRyZWUtPmF0dHJpYnV0ZXMgJiBIRlNfVFJFRV9WQVJJRFhLRVlTKSkKKwkJaGZzX2Jub2RlX3dyaXRlX3U4KHBhcmVudCwgZmQtPmtleW9mZnNldCwgbmV3a2V5bGVuIC0gMSk7CisJaGZzX2Jub2RlX2R1bXAocGFyZW50KTsKKworCWhmc19ibm9kZV9wdXQobm9kZSk7CisJbm9kZSA9IHBhcmVudDsKKworCWlmIChuZXdfbm9kZSkgeworCQlfX2JlMzIgY25pZDsKKworCQlmZC0+Ym5vZGUgPSBoZnNfYm5vZGVfZmluZCh0cmVlLCBuZXdfbm9kZS0+cGFyZW50KTsKKwkJLyogY3JlYXRlIGluZGV4IGtleSBhbmQgZW50cnkgKi8KKwkJaGZzX2Jub2RlX3JlYWRfa2V5KG5ld19ub2RlLCBmZC0+c2VhcmNoX2tleSwgMTQpOworCQljbmlkID0gY3B1X3RvX2JlMzIobmV3X25vZGUtPnRoaXMpOworCisJCV9faGZzX2JyZWNfZmluZChmZC0+Ym5vZGUsIGZkKTsKKwkJaGZzX2JyZWNfaW5zZXJ0KGZkLCAmY25pZCwgc2l6ZW9mKGNuaWQpKTsKKwkJaGZzX2Jub2RlX3B1dChmZC0+Ym5vZGUpOworCQloZnNfYm5vZGVfcHV0KG5ld19ub2RlKTsKKworCQlpZiAoIXJlYykgeworCQkJaWYgKG5ld19ub2RlID09IG5vZGUpCisJCQkJZ290byBvdXQ7CisJCQkvKiByZXN0b3JlIHNlYXJjaF9rZXkgKi8KKwkJCWhmc19ibm9kZV9yZWFkX2tleShub2RlLCBmZC0+c2VhcmNoX2tleSwgMTQpOworCQl9CisJfQorCisJaWYgKCFyZWMgJiYgbm9kZS0+cGFyZW50KQorCQlnb3RvIGFnYWluOworb3V0OgorCWZkLT5ibm9kZSA9IG5vZGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGZzX2J0cmVlX2luY19oZWlnaHQoc3RydWN0IGhmc19idHJlZSAqdHJlZSkKK3sKKwlzdHJ1Y3QgaGZzX2Jub2RlICpub2RlLCAqbmV3X25vZGU7CisJc3RydWN0IGhmc19ibm9kZV9kZXNjIG5vZGVfZGVzYzsKKwlpbnQga2V5X3NpemUsIHJlYzsKKwlfX2JlMzIgY25pZDsKKworCW5vZGUgPSBOVUxMOworCWlmICh0cmVlLT5yb290KSB7CisJCW5vZGUgPSBoZnNfYm5vZGVfZmluZCh0cmVlLCB0cmVlLT5yb290KTsKKwkJaWYgKElTX0VSUihub2RlKSkKKwkJCXJldHVybiBQVFJfRVJSKG5vZGUpOworCX0KKwluZXdfbm9kZSA9IGhmc19ibWFwX2FsbG9jKHRyZWUpOworCWlmIChJU19FUlIobmV3X25vZGUpKSB7CisJCWhmc19ibm9kZV9wdXQobm9kZSk7CisJCXJldHVybiBQVFJfRVJSKG5ld19ub2RlKTsKKwl9CisKKwl0cmVlLT5yb290ID0gbmV3X25vZGUtPnRoaXM7CisJaWYgKCF0cmVlLT5kZXB0aCkgeworCQl0cmVlLT5sZWFmX2hlYWQgPSB0cmVlLT5sZWFmX3RhaWwgPSBuZXdfbm9kZS0+dGhpczsKKwkJbmV3X25vZGUtPnR5cGUgPSBIRlNfTk9ERV9MRUFGOworCQluZXdfbm9kZS0+bnVtX3JlY3MgPSAwOworCX0gZWxzZSB7CisJCW5ld19ub2RlLT50eXBlID0gSEZTX05PREVfSU5ERVg7CisJCW5ld19ub2RlLT5udW1fcmVjcyA9IDE7CisJfQorCW5ld19ub2RlLT5wYXJlbnQgPSAwOworCW5ld19ub2RlLT5uZXh0ID0gMDsKKwluZXdfbm9kZS0+cHJldiA9IDA7CisJbmV3X25vZGUtPmhlaWdodCA9ICsrdHJlZS0+ZGVwdGg7CisKKwlub2RlX2Rlc2MubmV4dCA9IGNwdV90b19iZTMyKG5ld19ub2RlLT5uZXh0KTsKKwlub2RlX2Rlc2MucHJldiA9IGNwdV90b19iZTMyKG5ld19ub2RlLT5wcmV2KTsKKwlub2RlX2Rlc2MudHlwZSA9IG5ld19ub2RlLT50eXBlOworCW5vZGVfZGVzYy5oZWlnaHQgPSBuZXdfbm9kZS0+aGVpZ2h0OworCW5vZGVfZGVzYy5udW1fcmVjcyA9IGNwdV90b19iZTE2KG5ld19ub2RlLT5udW1fcmVjcyk7CisJbm9kZV9kZXNjLnJlc2VydmVkID0gMDsKKwloZnNfYm5vZGVfd3JpdGUobmV3X25vZGUsICZub2RlX2Rlc2MsIDAsIHNpemVvZihub2RlX2Rlc2MpKTsKKworCXJlYyA9IHRyZWUtPm5vZGVfc2l6ZSAtIDI7CisJaGZzX2Jub2RlX3dyaXRlX3UxNihuZXdfbm9kZSwgcmVjLCAxNCk7CisKKwlpZiAobm9kZSkgeworCQkvKiBpbnNlcnQgb2xkIHJvb3QgaWR4IGludG8gbmV3IHJvb3QgKi8KKwkJbm9kZS0+cGFyZW50ID0gdHJlZS0+cm9vdDsKKwkJaWYgKG5vZGUtPnR5cGUgPT0gSEZTX05PREVfTEVBRiB8fAorCQkgICAgdHJlZS0+YXR0cmlidXRlcyAmIEhGU19UUkVFX1ZBUklEWEtFWVMpCisJCQlrZXlfc2l6ZSA9IGhmc19ibm9kZV9yZWFkX3U4KG5vZGUsIDE0KSArIDE7CisJCWVsc2UKKwkJCWtleV9zaXplID0gdHJlZS0+bWF4X2tleV9sZW4gKyAxOworCQloZnNfYm5vZGVfY29weShuZXdfbm9kZSwgMTQsIG5vZGUsIDE0LCBrZXlfc2l6ZSk7CisKKwkJaWYgKCEodHJlZS0+YXR0cmlidXRlcyAmIEhGU19UUkVFX1ZBUklEWEtFWVMpKSB7CisJCQlrZXlfc2l6ZSA9IHRyZWUtPm1heF9rZXlfbGVuICsgMTsKKwkJCWhmc19ibm9kZV93cml0ZV91OChuZXdfbm9kZSwgMTQsIHRyZWUtPm1heF9rZXlfbGVuKTsKKwkJfQorCQlrZXlfc2l6ZSA9IChrZXlfc2l6ZSArIDEpICYgLTI7CisJCWNuaWQgPSBjcHVfdG9fYmUzMihub2RlLT50aGlzKTsKKwkJaGZzX2Jub2RlX3dyaXRlKG5ld19ub2RlLCAmY25pZCwgMTQgKyBrZXlfc2l6ZSwgNCk7CisKKwkJcmVjIC09IDI7CisJCWhmc19ibm9kZV93cml0ZV91MTYobmV3X25vZGUsIHJlYywgMTQgKyBrZXlfc2l6ZSArIDQpOworCisJCWhmc19ibm9kZV9wdXQobm9kZSk7CisJfQorCWhmc19ibm9kZV9wdXQobmV3X25vZGUpOworCW1hcmtfaW5vZGVfZGlydHkodHJlZS0+aW5vZGUpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy9oZnMvYnRyZWUuYyBiL2ZzL2hmcy9idHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NDcyNWUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9oZnMvYnRyZWUuYwpAQCAtMCwwICsxLDMyNyBAQAorLyoKKyAqICBsaW51eC9mcy9oZnMvYnRyZWUuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMQorICogQnJhZCBCb3llciAoZmxhckBhbGxhbmRyaWEuY29tKQorICogKEMpIDIwMDMgQXJkaXMgVGVjaG5vbG9naWVzIDxyb21hbkBhcmRpc3RlY2guY29tPgorICoKKyAqIEhhbmRsZSBvcGVuaW5nL2Nsb3NpbmcgYnRyZWUKKyAqLworCisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorCisjaW5jbHVkZSAiYnRyZWUuaCIKKworLyogR2V0IGEgcmVmZXJlbmNlIHRvIGEgQipUcmVlIGFuZCBkbyBzb21lIGluaXRpYWwgY2hlY2tzICovCitzdHJ1Y3QgaGZzX2J0cmVlICpoZnNfYnRyZWVfb3BlbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1MzIgaWQsIGJ0cmVlX2tleWNtcCBrZXljbXApCit7CisJc3RydWN0IGhmc19idHJlZSAqdHJlZTsKKwlzdHJ1Y3QgaGZzX2J0cmVlX2hlYWRlcl9yZWMgKmhlYWQ7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdW5zaWduZWQgaW50IHNpemU7CisKKwl0cmVlID0ga21hbGxvYyhzaXplb2YoKnRyZWUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRyZWUpCisJCXJldHVybiBOVUxMOworCW1lbXNldCh0cmVlLCAwLCBzaXplb2YoKnRyZWUpKTsKKworCWluaXRfTVVURVgoJnRyZWUtPnRyZWVfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnRyZWUtPmhhc2hfbG9jayk7CisJLyogU2V0IHRoZSBjb3JyZWN0IGNvbXBhcmUgZnVuY3Rpb24gKi8KKwl0cmVlLT5zYiA9IHNiOworCXRyZWUtPmNuaWQgPSBpZDsKKwl0cmVlLT5rZXljbXAgPSBrZXljbXA7CisKKwl0cmVlLT5pbm9kZSA9IGlnZXRfbG9ja2VkKHNiLCBpZCk7CisJaWYgKCF0cmVlLT5pbm9kZSkKKwkJZ290byBmcmVlX3RyZWU7CisJaWYgKCEodHJlZS0+aW5vZGUtPmlfc3RhdGUgJiBJX05FVykpCisJCUJVRygpOworCXsKKwlzdHJ1Y3QgaGZzX21kYiAqbWRiID0gSEZTX1NCKHNiKS0+bWRiOworCUhGU19JKHRyZWUtPmlub2RlKS0+ZmxhZ3MgPSAwOworCWluaXRfTVVURVgoJkhGU19JKHRyZWUtPmlub2RlKS0+ZXh0ZW50c19sb2NrKTsKKwlzd2l0Y2ggKGlkKSB7CisJY2FzZSBIRlNfRVhUX0NOSUQ6CisJCWhmc19pbm9kZV9yZWFkX2ZvcmsodHJlZS0+aW5vZGUsIG1kYi0+ZHJYVEV4dFJlYywgbWRiLT5kclhURmxTaXplLAorCQkJCSAgICBtZGItPmRyWFRGbFNpemUsIGJlMzJfdG9fY3B1KG1kYi0+ZHJYVENscFNpeikpOworCQl0cmVlLT5pbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZoZnNfYnRyZWVfYW9wczsKKwkJYnJlYWs7CisJY2FzZSBIRlNfQ0FUX0NOSUQ6CisJCWhmc19pbm9kZV9yZWFkX2ZvcmsodHJlZS0+aW5vZGUsIG1kYi0+ZHJDVEV4dFJlYywgbWRiLT5kckNURmxTaXplLAorCQkJCSAgICBtZGItPmRyQ1RGbFNpemUsIGJlMzJfdG9fY3B1KG1kYi0+ZHJDVENscFNpeikpOworCQl0cmVlLT5pbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZoZnNfYnRyZWVfYW9wczsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCX0KKwl1bmxvY2tfbmV3X2lub2RlKHRyZWUtPmlub2RlKTsKKworCW1hcHBpbmcgPSB0cmVlLT5pbm9kZS0+aV9tYXBwaW5nOworCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UobWFwcGluZywgMCwgKGZpbGxlcl90ICopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlLCBOVUxMKTsKKwlpZiAoSVNfRVJSKHBhZ2UpKQorCQlnb3RvIGZyZWVfdHJlZTsKKworCS8qIExvYWQgdGhlIGhlYWRlciAqLworCWhlYWQgPSAoc3RydWN0IGhmc19idHJlZV9oZWFkZXJfcmVjICopKGttYXAocGFnZSkgKyBzaXplb2Yoc3RydWN0IGhmc19ibm9kZV9kZXNjKSk7CisJdHJlZS0+cm9vdCA9IGJlMzJfdG9fY3B1KGhlYWQtPnJvb3QpOworCXRyZWUtPmxlYWZfY291bnQgPSBiZTMyX3RvX2NwdShoZWFkLT5sZWFmX2NvdW50KTsKKwl0cmVlLT5sZWFmX2hlYWQgPSBiZTMyX3RvX2NwdShoZWFkLT5sZWFmX2hlYWQpOworCXRyZWUtPmxlYWZfdGFpbCA9IGJlMzJfdG9fY3B1KGhlYWQtPmxlYWZfdGFpbCk7CisJdHJlZS0+bm9kZV9jb3VudCA9IGJlMzJfdG9fY3B1KGhlYWQtPm5vZGVfY291bnQpOworCXRyZWUtPmZyZWVfbm9kZXMgPSBiZTMyX3RvX2NwdShoZWFkLT5mcmVlX25vZGVzKTsKKwl0cmVlLT5hdHRyaWJ1dGVzID0gYmUzMl90b19jcHUoaGVhZC0+YXR0cmlidXRlcyk7CisJdHJlZS0+bm9kZV9zaXplID0gYmUxNl90b19jcHUoaGVhZC0+bm9kZV9zaXplKTsKKwl0cmVlLT5tYXhfa2V5X2xlbiA9IGJlMTZfdG9fY3B1KGhlYWQtPm1heF9rZXlfbGVuKTsKKwl0cmVlLT5kZXB0aCA9IGJlMTZfdG9fY3B1KGhlYWQtPmRlcHRoKTsKKworCXNpemUgPSB0cmVlLT5ub2RlX3NpemU7CisJaWYgKCFzaXplIHx8IHNpemUgJiAoc2l6ZSAtIDEpKQorCQlnb3RvIGZhaWxfcGFnZTsKKwlpZiAoIXRyZWUtPm5vZGVfY291bnQpCisJCWdvdG8gZmFpbF9wYWdlOworCXRyZWUtPm5vZGVfc2l6ZV9zaGlmdCA9IGZmcyhzaXplKSAtIDE7CisJdHJlZS0+cGFnZXNfcGVyX2Jub2RlID0gKHRyZWUtPm5vZGVfc2l6ZSArIFBBR0VfQ0FDSEVfU0laRSAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisKKwlrdW5tYXAocGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCXJldHVybiB0cmVlOworCisgZmFpbF9wYWdlOgorCXRyZWUtPmlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmhmc19hb3BzOworCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKyBmcmVlX3RyZWU6CisJaXB1dCh0cmVlLT5pbm9kZSk7CisJa2ZyZWUodHJlZSk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIFJlbGVhc2UgcmVzb3VyY2VzIHVzZWQgYnkgYSBidHJlZSAqLwordm9pZCBoZnNfYnRyZWVfY2xvc2Uoc3RydWN0IGhmc19idHJlZSAqdHJlZSkKK3sKKwlzdHJ1Y3QgaGZzX2Jub2RlICpub2RlOworCWludCBpOworCisJaWYgKCF0cmVlKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgTk9ERV9IQVNIX1NJWkU7IGkrKykgeworCQl3aGlsZSAoKG5vZGUgPSB0cmVlLT5ub2RlX2hhc2hbaV0pKSB7CisJCQl0cmVlLT5ub2RlX2hhc2hbaV0gPSBub2RlLT5uZXh0X2hhc2g7CisJCQlpZiAoYXRvbWljX3JlYWQoJm5vZGUtPnJlZmNudCkpCisJCQkJcHJpbnRrKCJIRlM6IG5vZGUgJWQ6JWQgc3RpbGwgaGFzICVkIHVzZXIocykhXG4iLAorCQkJCQlub2RlLT50cmVlLT5jbmlkLCBub2RlLT50aGlzLCBhdG9taWNfcmVhZCgmbm9kZS0+cmVmY250KSk7CisJCQloZnNfYm5vZGVfZnJlZShub2RlKTsKKwkJCXRyZWUtPm5vZGVfaGFzaF9jbnQtLTsKKwkJfQorCX0KKwlpcHV0KHRyZWUtPmlub2RlKTsKKwlrZnJlZSh0cmVlKTsKK30KKwordm9pZCBoZnNfYnRyZWVfd3JpdGUoc3RydWN0IGhmc19idHJlZSAqdHJlZSkKK3sKKwlzdHJ1Y3QgaGZzX2J0cmVlX2hlYWRlcl9yZWMgKmhlYWQ7CisJc3RydWN0IGhmc19ibm9kZSAqbm9kZTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCW5vZGUgPSBoZnNfYm5vZGVfZmluZCh0cmVlLCAwKTsKKwlpZiAoSVNfRVJSKG5vZGUpKQorCQkvKiBwYW5pYz8gKi8KKwkJcmV0dXJuOworCS8qIExvYWQgdGhlIGhlYWRlciAqLworCXBhZ2UgPSBub2RlLT5wYWdlWzBdOworCWhlYWQgPSAoc3RydWN0IGhmc19idHJlZV9oZWFkZXJfcmVjICopKGttYXAocGFnZSkgKyBzaXplb2Yoc3RydWN0IGhmc19ibm9kZV9kZXNjKSk7CisKKwloZWFkLT5yb290ID0gY3B1X3RvX2JlMzIodHJlZS0+cm9vdCk7CisJaGVhZC0+bGVhZl9jb3VudCA9IGNwdV90b19iZTMyKHRyZWUtPmxlYWZfY291bnQpOworCWhlYWQtPmxlYWZfaGVhZCA9IGNwdV90b19iZTMyKHRyZWUtPmxlYWZfaGVhZCk7CisJaGVhZC0+bGVhZl90YWlsID0gY3B1X3RvX2JlMzIodHJlZS0+bGVhZl90YWlsKTsKKwloZWFkLT5ub2RlX2NvdW50ID0gY3B1X3RvX2JlMzIodHJlZS0+bm9kZV9jb3VudCk7CisJaGVhZC0+ZnJlZV9ub2RlcyA9IGNwdV90b19iZTMyKHRyZWUtPmZyZWVfbm9kZXMpOworCWhlYWQtPmF0dHJpYnV0ZXMgPSBjcHVfdG9fYmUzMih0cmVlLT5hdHRyaWJ1dGVzKTsKKwloZWFkLT5kZXB0aCA9IGNwdV90b19iZTE2KHRyZWUtPmRlcHRoKTsKKworCWt1bm1hcChwYWdlKTsKKwlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKwloZnNfYm5vZGVfcHV0KG5vZGUpOworfQorCitzdGF0aWMgc3RydWN0IGhmc19ibm9kZSAqaGZzX2JtYXBfbmV3X2JtYXAoc3RydWN0IGhmc19ibm9kZSAqcHJldiwgdTMyIGlkeCkKK3sKKwlzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlID0gcHJldi0+dHJlZTsKKwlzdHJ1Y3QgaGZzX2Jub2RlICpub2RlOworCXN0cnVjdCBoZnNfYm5vZGVfZGVzYyBkZXNjOworCV9fYmUzMiBjbmlkOworCisJbm9kZSA9IGhmc19ibm9kZV9jcmVhdGUodHJlZSwgaWR4KTsKKwlpZiAoSVNfRVJSKG5vZGUpKQorCQlyZXR1cm4gbm9kZTsKKworCWlmICghdHJlZS0+ZnJlZV9ub2RlcykKKwkJcGFuaWMoIkZJWE1FISEhIik7CisJdHJlZS0+ZnJlZV9ub2Rlcy0tOworCXByZXYtPm5leHQgPSBpZHg7CisJY25pZCA9IGNwdV90b19iZTMyKGlkeCk7CisJaGZzX2Jub2RlX3dyaXRlKHByZXYsICZjbmlkLCBvZmZzZXRvZihzdHJ1Y3QgaGZzX2Jub2RlX2Rlc2MsIG5leHQpLCA0KTsKKworCW5vZGUtPnR5cGUgPSBIRlNfTk9ERV9NQVA7CisJbm9kZS0+bnVtX3JlY3MgPSAxOworCWhmc19ibm9kZV9jbGVhcihub2RlLCAwLCB0cmVlLT5ub2RlX3NpemUpOworCWRlc2MubmV4dCA9IDA7CisJZGVzYy5wcmV2ID0gMDsKKwlkZXNjLnR5cGUgPSBIRlNfTk9ERV9NQVA7CisJZGVzYy5oZWlnaHQgPSAwOworCWRlc2MubnVtX3JlY3MgPSBjcHVfdG9fYmUxNigxKTsKKwlkZXNjLnJlc2VydmVkID0gMDsKKwloZnNfYm5vZGVfd3JpdGUobm9kZSwgJmRlc2MsIDAsIHNpemVvZihkZXNjKSk7CisJaGZzX2Jub2RlX3dyaXRlX3UxNihub2RlLCAxNCwgMHg4MDAwKTsKKwloZnNfYm5vZGVfd3JpdGVfdTE2KG5vZGUsIHRyZWUtPm5vZGVfc2l6ZSAtIDIsIDE0KTsKKwloZnNfYm5vZGVfd3JpdGVfdTE2KG5vZGUsIHRyZWUtPm5vZGVfc2l6ZSAtIDQsIHRyZWUtPm5vZGVfc2l6ZSAtIDYpOworCisJcmV0dXJuIG5vZGU7Cit9CisKK3N0cnVjdCBoZnNfYm5vZGUgKmhmc19ibWFwX2FsbG9jKHN0cnVjdCBoZnNfYnRyZWUgKnRyZWUpCit7CisJc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgKm5leHRfbm9kZTsKKwlzdHJ1Y3QgcGFnZSAqKnBhZ2VwOworCXUzMiBuaWR4LCBpZHg7CisJdTE2IG9mZiwgbGVuOworCXU4ICpkYXRhLCBieXRlLCBtOworCWludCBpOworCisJd2hpbGUgKCF0cmVlLT5mcmVlX25vZGVzKSB7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSB0cmVlLT5pbm9kZTsKKwkJdTMyIGNvdW50OworCQlpbnQgcmVzOworCisJCXJlcyA9IGhmc19leHRlbmRfZmlsZShpbm9kZSk7CisJCWlmIChyZXMpCisJCQlyZXR1cm4gRVJSX1BUUihyZXMpOworCQlIRlNfSShpbm9kZSktPnBoeXNfc2l6ZSA9IGlub2RlLT5pX3NpemUgPQorCQkJCShsb2ZmX3QpSEZTX0koaW5vZGUpLT5hbGxvY19ibG9ja3MgKgorCQkJCUhGU19TQih0cmVlLT5zYiktPmFsbG9jX2Jsa3N6OworCQlIRlNfSShpbm9kZSktPmZzX2Jsb2NrcyA9IGlub2RlLT5pX3NpemUgPj4KKwkJCQkJICB0cmVlLT5zYi0+c19ibG9ja3NpemVfYml0czsKKwkJaW5vZGVfc2V0X2J5dGVzKGlub2RlLCBpbm9kZS0+aV9zaXplKTsKKwkJY291bnQgPSBpbm9kZS0+aV9zaXplID4+IHRyZWUtPm5vZGVfc2l6ZV9zaGlmdDsKKwkJdHJlZS0+ZnJlZV9ub2RlcyA9IGNvdW50IC0gdHJlZS0+bm9kZV9jb3VudDsKKwkJdHJlZS0+bm9kZV9jb3VudCA9IGNvdW50OworCX0KKworCW5pZHggPSAwOworCW5vZGUgPSBoZnNfYm5vZGVfZmluZCh0cmVlLCBuaWR4KTsKKwlpZiAoSVNfRVJSKG5vZGUpKQorCQlyZXR1cm4gbm9kZTsKKwlsZW4gPSBoZnNfYnJlY19sZW5vZmYobm9kZSwgMiwgJm9mZik7CisKKwlvZmYgKz0gbm9kZS0+cGFnZV9vZmZzZXQ7CisJcGFnZXAgPSBub2RlLT5wYWdlICsgKG9mZiA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwlkYXRhID0ga21hcCgqcGFnZXApOworCW9mZiAmPSB+UEFHRV9DQUNIRV9NQVNLOworCWlkeCA9IDA7CisKKwlmb3IgKDs7KSB7CisJCXdoaWxlIChsZW4pIHsKKwkJCWJ5dGUgPSBkYXRhW29mZl07CisJCQlpZiAoYnl0ZSAhPSAweGZmKSB7CisJCQkJZm9yIChtID0gMHg4MCwgaSA9IDA7IGkgPCA4OyBtID4+PSAxLCBpKyspIHsKKwkJCQkJaWYgKCEoYnl0ZSAmIG0pKSB7CisJCQkJCQlpZHggKz0gaTsKKwkJCQkJCWRhdGFbb2ZmXSB8PSBtOworCQkJCQkJc2V0X3BhZ2VfZGlydHkoKnBhZ2VwKTsKKwkJCQkJCWt1bm1hcCgqcGFnZXApOworCQkJCQkJdHJlZS0+ZnJlZV9ub2Rlcy0tOworCQkJCQkJbWFya19pbm9kZV9kaXJ0eSh0cmVlLT5pbm9kZSk7CisJCQkJCQloZnNfYm5vZGVfcHV0KG5vZGUpOworCQkJCQkJcmV0dXJuIGhmc19ibm9kZV9jcmVhdGUodHJlZSwgaWR4KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmICgrK29mZiA+PSBQQUdFX0NBQ0hFX1NJWkUpIHsKKwkJCQlrdW5tYXAoKnBhZ2VwKTsKKwkJCQlkYXRhID0ga21hcCgqKytwYWdlcCk7CisJCQkJb2ZmID0gMDsKKwkJCX0KKwkJCWlkeCArPSA4OworCQkJbGVuLS07CisJCX0KKwkJa3VubWFwKCpwYWdlcCk7CisJCW5pZHggPSBub2RlLT5uZXh0OworCQlpZiAoIW5pZHgpIHsKKwkJCXByaW50aygiY3JlYXRlIG5ldyBibWFwIG5vZGUuLi5cbiIpOworCQkJbmV4dF9ub2RlID0gaGZzX2JtYXBfbmV3X2JtYXAobm9kZSwgaWR4KTsKKwkJfSBlbHNlCisJCQluZXh0X25vZGUgPSBoZnNfYm5vZGVfZmluZCh0cmVlLCBuaWR4KTsKKwkJaGZzX2Jub2RlX3B1dChub2RlKTsKKwkJaWYgKElTX0VSUihuZXh0X25vZGUpKQorCQkJcmV0dXJuIG5leHRfbm9kZTsKKwkJbm9kZSA9IG5leHRfbm9kZTsKKworCQlsZW4gPSBoZnNfYnJlY19sZW5vZmYobm9kZSwgMCwgJm9mZik7CisJCW9mZiArPSBub2RlLT5wYWdlX29mZnNldDsKKwkJcGFnZXAgPSBub2RlLT5wYWdlICsgKG9mZiA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwkJZGF0YSA9IGttYXAoKnBhZ2VwKTsKKwkJb2ZmICY9IH5QQUdFX0NBQ0hFX01BU0s7CisJfQorfQorCit2b2lkIGhmc19ibWFwX2ZyZWUoc3RydWN0IGhmc19ibm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlOworCXN0cnVjdCBwYWdlICpwYWdlOworCXUxNiBvZmYsIGxlbjsKKwl1MzIgbmlkeDsKKwl1OCAqZGF0YSwgYnl0ZSwgbTsKKworCWRwcmludChEQkdfQk5PREVfTU9ELCAiYnRyZWVfZnJlZV9ub2RlOiAldVxuIiwgbm9kZS0+dGhpcyk7CisJdHJlZSA9IG5vZGUtPnRyZWU7CisJbmlkeCA9IG5vZGUtPnRoaXM7CisJbm9kZSA9IGhmc19ibm9kZV9maW5kKHRyZWUsIDApOworCWlmIChJU19FUlIobm9kZSkpCisJCXJldHVybjsKKwlsZW4gPSBoZnNfYnJlY19sZW5vZmYobm9kZSwgMiwgJm9mZik7CisJd2hpbGUgKG5pZHggPj0gbGVuICogOCkgeworCQl1MzIgaTsKKworCQluaWR4IC09IGxlbiAqIDg7CisJCWkgPSBub2RlLT5uZXh0OworCQloZnNfYm5vZGVfcHV0KG5vZGUpOworCQlpZiAoIWkpIHsKKwkJCS8qIHBhbmljICovOworCQkJcHJpbnRrKCJIRlM6IHVuYWJsZSB0byBmcmVlIGJub2RlICV1LiBibWFwIG5vdCBmb3VuZCFcbiIsIG5vZGUtPnRoaXMpOworCQkJcmV0dXJuOworCQl9CisJCW5vZGUgPSBoZnNfYm5vZGVfZmluZCh0cmVlLCBpKTsKKwkJaWYgKElTX0VSUihub2RlKSkKKwkJCXJldHVybjsKKwkJaWYgKG5vZGUtPnR5cGUgIT0gSEZTX05PREVfTUFQKSB7CisJCQkvKiBwYW5pYyAqLzsKKwkJCXByaW50aygiSEZTOiBpbnZhbGlkIGJtYXAgZm91bmQhICgldSwlZClcbiIsIG5vZGUtPnRoaXMsIG5vZGUtPnR5cGUpOworCQkJaGZzX2Jub2RlX3B1dChub2RlKTsKKwkJCXJldHVybjsKKwkJfQorCQlsZW4gPSBoZnNfYnJlY19sZW5vZmYobm9kZSwgMCwgJm9mZik7CisJfQorCW9mZiArPSBub2RlLT5wYWdlX29mZnNldCArIG5pZHggLyA4OworCXBhZ2UgPSBub2RlLT5wYWdlW29mZiA+PiBQQUdFX0NBQ0hFX1NISUZUXTsKKwlkYXRhID0ga21hcChwYWdlKTsKKwlvZmYgJj0gflBBR0VfQ0FDSEVfTUFTSzsKKwltID0gMSA8PCAofm5pZHggJiA3KTsKKwlieXRlID0gZGF0YVtvZmZdOworCWlmICghKGJ5dGUgJiBtKSkgeworCQlwcmludGsoIkhGUzogdHJ5aW5nIHRvIGZyZWUgZnJlZSBibm9kZSAldSglZClcbiIsIG5vZGUtPnRoaXMsIG5vZGUtPnR5cGUpOworCQlrdW5tYXAocGFnZSk7CisJCWhmc19ibm9kZV9wdXQobm9kZSk7CisJCXJldHVybjsKKwl9CisJZGF0YVtvZmZdID0gYnl0ZSAmIH5tOworCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworCWt1bm1hcChwYWdlKTsKKwloZnNfYm5vZGVfcHV0KG5vZGUpOworCXRyZWUtPmZyZWVfbm9kZXMrKzsKKwltYXJrX2lub2RlX2RpcnR5KHRyZWUtPmlub2RlKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2hmcy9idHJlZS5oIGIvZnMvaGZzL2J0cmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M1MTkwNQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmcy9idHJlZS5oCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICogIGxpbnV4L2ZzL2hmcy9idHJlZS5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxCisgKiBCcmFkIEJveWVyIChmbGFyQGFsbGFuZHJpYS5jb20pCisgKiAoQykgMjAwMyBBcmRpcyBUZWNobm9sb2dpZXMgPHJvbWFuQGFyZGlzdGVjaC5jb20+CisgKi8KKworI2luY2x1ZGUgImhmc19mcy5oIgorCit0eXBlZGVmIGludCAoKmJ0cmVlX2tleWNtcCkoY29uc3QgYnRyZWVfa2V5ICosIGNvbnN0IGJ0cmVlX2tleSAqKTsKKworI2RlZmluZSBOT0RFX0hBU0hfU0laRSAgMjU2CisKKy8qIEEgSEZTIEJUcmVlIGhlbGQgaW4gbWVtb3J5ICovCitzdHJ1Y3QgaGZzX2J0cmVlIHsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJYnRyZWVfa2V5Y21wIGtleWNtcDsKKworCXUzMiBjbmlkOworCXUzMiByb290OworCXUzMiBsZWFmX2NvdW50OworCXUzMiBsZWFmX2hlYWQ7CisJdTMyIGxlYWZfdGFpbDsKKwl1MzIgbm9kZV9jb3VudDsKKwl1MzIgZnJlZV9ub2RlczsKKwl1MzIgYXR0cmlidXRlczsKKworCXVuc2lnbmVkIGludCBub2RlX3NpemU7CisJdW5zaWduZWQgaW50IG5vZGVfc2l6ZV9zaGlmdDsKKwl1bnNpZ25lZCBpbnQgbWF4X2tleV9sZW47CisJdW5zaWduZWQgaW50IGRlcHRoOworCisJLy91bnNpZ25lZCBpbnQgbWFwMV9zaXplLCBtYXBfc2l6ZTsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHRyZWVfbG9jazsKKworCXVuc2lnbmVkIGludCBwYWdlc19wZXJfYm5vZGU7CisJc3BpbmxvY2tfdCBoYXNoX2xvY2s7CisJc3RydWN0IGhmc19ibm9kZSAqbm9kZV9oYXNoW05PREVfSEFTSF9TSVpFXTsKKwlpbnQgbm9kZV9oYXNoX2NudDsKK307CisKKy8qIEEgSEZTIEJUcmVlIG5vZGUgaW4gbWVtb3J5ICovCitzdHJ1Y3QgaGZzX2Jub2RlIHsKKwlzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlOworCisJdTMyIHByZXY7CisJdTMyIHRoaXM7CisJdTMyIG5leHQ7CisJdTMyIHBhcmVudDsKKworCXUxNiBudW1fcmVjczsKKwl1OCB0eXBlOworCXU4IGhlaWdodDsKKworCXN0cnVjdCBoZnNfYm5vZGUgKm5leHRfaGFzaDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXdhaXRfcXVldWVfaGVhZF90IGxvY2tfd3E7CisJYXRvbWljX3QgcmVmY250OworCXVuc2lnbmVkIGludCBwYWdlX29mZnNldDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZVswXTsKK307CisKKyNkZWZpbmUgSEZTX0JOT0RFX0VSUk9SCQkwCisjZGVmaW5lIEhGU19CTk9ERV9ORVcJCTEKKyNkZWZpbmUgSEZTX0JOT0RFX0RFTEVURUQJMgorCitzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSB7CisJYnRyZWVfa2V5ICprZXk7CisJYnRyZWVfa2V5ICpzZWFyY2hfa2V5OworCXN0cnVjdCBoZnNfYnRyZWUgKnRyZWU7CisJc3RydWN0IGhmc19ibm9kZSAqYm5vZGU7CisJaW50IHJlY29yZDsKKwlpbnQga2V5b2Zmc2V0LCBrZXlsZW5ndGg7CisJaW50IGVudHJ5b2Zmc2V0LCBlbnRyeWxlbmd0aDsKK307CisKKworLyogYnRyZWUuYyAqLworZXh0ZXJuIHN0cnVjdCBoZnNfYnRyZWUgKmhmc19idHJlZV9vcGVuKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1MzIsIGJ0cmVlX2tleWNtcCk7CitleHRlcm4gdm9pZCBoZnNfYnRyZWVfY2xvc2Uoc3RydWN0IGhmc19idHJlZSAqKTsKK2V4dGVybiB2b2lkIGhmc19idHJlZV93cml0ZShzdHJ1Y3QgaGZzX2J0cmVlICopOworZXh0ZXJuIHN0cnVjdCBoZnNfYm5vZGUgKiBoZnNfYm1hcF9hbGxvYyhzdHJ1Y3QgaGZzX2J0cmVlICopOworZXh0ZXJuIHZvaWQgaGZzX2JtYXBfZnJlZShzdHJ1Y3QgaGZzX2Jub2RlICpub2RlKTsKKworLyogYm5vZGUuYyAqLworZXh0ZXJuIHZvaWQgaGZzX2Jub2RlX3JlYWQoc3RydWN0IGhmc19ibm9kZSAqLCB2b2lkICosIGludCwgaW50KTsKK2V4dGVybiB1MTYgaGZzX2Jub2RlX3JlYWRfdTE2KHN0cnVjdCBoZnNfYm5vZGUgKiwgaW50KTsKK2V4dGVybiB1OCBoZnNfYm5vZGVfcmVhZF91OChzdHJ1Y3QgaGZzX2Jub2RlICosIGludCk7CitleHRlcm4gdm9pZCBoZnNfYm5vZGVfcmVhZF9rZXkoc3RydWN0IGhmc19ibm9kZSAqLCB2b2lkICosIGludCk7CitleHRlcm4gdm9pZCBoZnNfYm5vZGVfd3JpdGUoc3RydWN0IGhmc19ibm9kZSAqLCB2b2lkICosIGludCwgaW50KTsKK2V4dGVybiB2b2lkIGhmc19ibm9kZV93cml0ZV91MTYoc3RydWN0IGhmc19ibm9kZSAqLCBpbnQsIHUxNik7CitleHRlcm4gdm9pZCBoZnNfYm5vZGVfd3JpdGVfdTgoc3RydWN0IGhmc19ibm9kZSAqLCBpbnQsIHU4KTsKK2V4dGVybiB2b2lkIGhmc19ibm9kZV9jbGVhcihzdHJ1Y3QgaGZzX2Jub2RlICosIGludCwgaW50KTsKK2V4dGVybiB2b2lkIGhmc19ibm9kZV9jb3B5KHN0cnVjdCBoZnNfYm5vZGUgKiwgaW50LAorCQkJICAgc3RydWN0IGhmc19ibm9kZSAqLCBpbnQsIGludCk7CitleHRlcm4gdm9pZCBoZnNfYm5vZGVfbW92ZShzdHJ1Y3QgaGZzX2Jub2RlICosIGludCwgaW50LCBpbnQpOworZXh0ZXJuIHZvaWQgaGZzX2Jub2RlX2R1bXAoc3RydWN0IGhmc19ibm9kZSAqKTsKK2V4dGVybiB2b2lkIGhmc19ibm9kZV91bmxpbmsoc3RydWN0IGhmc19ibm9kZSAqKTsKK2V4dGVybiBzdHJ1Y3QgaGZzX2Jub2RlICpoZnNfYm5vZGVfZmluZGhhc2goc3RydWN0IGhmc19idHJlZSAqLCB1MzIpOworZXh0ZXJuIHN0cnVjdCBoZnNfYm5vZGUgKmhmc19ibm9kZV9maW5kKHN0cnVjdCBoZnNfYnRyZWUgKiwgdTMyKTsKK2V4dGVybiB2b2lkIGhmc19ibm9kZV91bmhhc2goc3RydWN0IGhmc19ibm9kZSAqKTsKK2V4dGVybiB2b2lkIGhmc19ibm9kZV9mcmVlKHN0cnVjdCBoZnNfYm5vZGUgKik7CitleHRlcm4gc3RydWN0IGhmc19ibm9kZSAqaGZzX2Jub2RlX2NyZWF0ZShzdHJ1Y3QgaGZzX2J0cmVlICosIHUzMik7CitleHRlcm4gdm9pZCBoZnNfYm5vZGVfZ2V0KHN0cnVjdCBoZnNfYm5vZGUgKik7CitleHRlcm4gdm9pZCBoZnNfYm5vZGVfcHV0KHN0cnVjdCBoZnNfYm5vZGUgKik7CisKKy8qIGJyZWMuYyAqLworZXh0ZXJuIHUxNiBoZnNfYnJlY19sZW5vZmYoc3RydWN0IGhmc19ibm9kZSAqLCB1MTYsIHUxNiAqKTsKK2V4dGVybiB1MTYgaGZzX2JyZWNfa2V5bGVuKHN0cnVjdCBoZnNfYm5vZGUgKiwgdTE2KTsKK2V4dGVybiBpbnQgaGZzX2JyZWNfaW5zZXJ0KHN0cnVjdCBoZnNfZmluZF9kYXRhICosIHZvaWQgKiwgaW50KTsKK2V4dGVybiBpbnQgaGZzX2JyZWNfcmVtb3ZlKHN0cnVjdCBoZnNfZmluZF9kYXRhICopOworCisvKiBiZmluZC5jICovCitleHRlcm4gaW50IGhmc19maW5kX2luaXQoc3RydWN0IGhmc19idHJlZSAqLCBzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqKTsKK2V4dGVybiB2b2lkIGhmc19maW5kX2V4aXQoc3RydWN0IGhmc19maW5kX2RhdGEgKik7CitleHRlcm4gaW50IF9faGZzX2JyZWNfZmluZChzdHJ1Y3QgaGZzX2Jub2RlICosIHN0cnVjdCBoZnNfZmluZF9kYXRhICopOworZXh0ZXJuIGludCBoZnNfYnJlY19maW5kKHN0cnVjdCBoZnNfZmluZF9kYXRhICopOworZXh0ZXJuIGludCBoZnNfYnJlY19yZWFkKHN0cnVjdCBoZnNfZmluZF9kYXRhICosIHZvaWQgKiwgaW50KTsKK2V4dGVybiBpbnQgaGZzX2JyZWNfZ290byhzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqLCBpbnQpOworCisKK3N0cnVjdCBoZnNfYm5vZGVfZGVzYyB7CisJX19iZTMyIG5leHQ7CQkvKiAoVikgTnVtYmVyIG9mIHRoZSBuZXh0IG5vZGUgYXQgdGhpcyBsZXZlbCAqLworCV9fYmUzMiBwcmV2OwkJLyogKFYpIE51bWJlciBvZiB0aGUgcHJldiBub2RlIGF0IHRoaXMgbGV2ZWwgKi8KKwl1OCB0eXBlOwkJLyogKEYpIFRoZSB0eXBlIG9mIG5vZGUgKi8KKwl1OCBoZWlnaHQ7CQkvKiAoRikgVGhlIGxldmVsIG9mIHRoaXMgbm9kZSAobGVhdmVzPTEpICovCisJX19iZTE2IG51bV9yZWNzOwkvKiAoVikgVGhlIG51bWJlciBvZiByZWNvcmRzIGluIHRoaXMgbm9kZSAqLworCXUxNiByZXNlcnZlZDsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgSEZTX05PREVfSU5ERVgJMHgwMAkvKiBBbiBpbnRlcm5hbCAoaW5kZXgpIG5vZGUgKi8KKyNkZWZpbmUgSEZTX05PREVfSEVBREVSCTB4MDEJLyogVGhlIHRyZWUgaGVhZGVyIG5vZGUgKG5vZGUgMCkgKi8KKyNkZWZpbmUgSEZTX05PREVfTUFQCTB4MDIJLyogSG9sZHMgcGFydCBvZiB0aGUgYml0bWFwIG9mIHVzZWQgbm9kZXMgKi8KKyNkZWZpbmUgSEZTX05PREVfTEVBRgkweEZGCS8qIEEgbGVhZiAobmROSGVpZ2h0PT0xKSBub2RlICovCisKK3N0cnVjdCBoZnNfYnRyZWVfaGVhZGVyX3JlYyB7CisJX19iZTE2IGRlcHRoOwkJLyogKFYpIFRoZSBudW1iZXIgb2YgbGV2ZWxzIGluIHRoaXMgQi10cmVlICovCisJX19iZTMyIHJvb3Q7CQkvKiAoVikgVGhlIG5vZGUgbnVtYmVyIG9mIHRoZSByb290IG5vZGUgKi8KKwlfX2JlMzIgbGVhZl9jb3VudDsJLyogKFYpIFRoZSBudW1iZXIgb2YgbGVhZiByZWNvcmRzICovCisJX19iZTMyIGxlYWZfaGVhZDsJLyogKFYpIFRoZSBudW1iZXIgb2YgdGhlIGZpcnN0IGxlYWYgbm9kZSAqLworCV9fYmUzMiBsZWFmX3RhaWw7CS8qIChWKSBUaGUgbnVtYmVyIG9mIHRoZSBsYXN0IGxlYWYgbm9kZSAqLworCV9fYmUxNiBub2RlX3NpemU7CS8qIChGKSBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIGEgbm9kZSAoPTUxMikgKi8KKwlfX2JlMTYgbWF4X2tleV9sZW47CS8qIChGKSBUaGUgbGVuZ3RoIG9mIGEga2V5IGluIGFuIGluZGV4IG5vZGUgKi8KKwlfX2JlMzIgbm9kZV9jb3VudDsJLyogKFYpIFRoZSB0b3RhbCBudW1iZXIgb2Ygbm9kZXMgKi8KKwlfX2JlMzIgZnJlZV9ub2RlczsJLyogKFYpIFRoZSBudW1iZXIgb2YgdW51c2VkIG5vZGVzICovCisJdTE2IHJlc2VydmVkMTsKKwlfX2JlMzIgY2x1bXBfc2l6ZTsJLyogKEYpIGNsdW1wIHNpemUuIG5vdCB1c3VhbGx5IHVzZWQuICovCisJdTggYnRyZWVfdHlwZTsJCS8qIChGKSBCVHJlZSB0eXBlICovCisJdTggcmVzZXJ2ZWQyOworCV9fYmUzMiBhdHRyaWJ1dGVzOwkvKiAoRikgYXR0cmlidXRlcyAqLworCXUzMiByZXNlcnZlZDNbMTZdOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBIRlNfTk9ERV9JTkRFWAkweDAwCS8qIEFuIGludGVybmFsIChpbmRleCkgbm9kZSAqLworI2RlZmluZSBIRlNfTk9ERV9IRUFERVIJMHgwMQkvKiBUaGUgdHJlZSBoZWFkZXIgbm9kZSAobm9kZSAwKSAqLworI2RlZmluZSBIRlNfTk9ERV9NQVAJCTB4MDIJLyogSG9sZHMgcGFydCBvZiB0aGUgYml0bWFwIG9mIHVzZWQgbm9kZXMgKi8KKyNkZWZpbmUgSEZTX05PREVfTEVBRgkJMHhGRgkvKiBBIGxlYWYgKG5kTkhlaWdodD09MSkgbm9kZSAqLworCisjZGVmaW5lIEJUUkVFX0FUVFJfQkFEQ0xPU0UJMHgwMDAwMDAwMQkvKiBiLXRyZWUgbm90IGNsb3NlZCBwcm9wZXJseS4gbm90CisJCQkJCQkgICB1c2VkIGJ5IGhmc3BsdXMuICovCisjZGVmaW5lIEhGU19UUkVFX0JJR0tFWVMJMHgwMDAwMDAwMgkvKiBrZXkgbGVuZ3RoIGlzIHUxNiBpbnN0ZWFkIG9mIHU4LgorCQkJCQkJICAgdXNlZCBieSBoZnNwbHVzLiAqLworI2RlZmluZSBIRlNfVFJFRV9WQVJJRFhLRVlTCTB4MDAwMDAwMDQJLyogdmFyaWFibGUga2V5IGxlbmd0aCBpbnN0ZWFkIG9mCisJCQkJCQkgICBtYXgga2V5IGxlbmd0aC4gdXNlIGRpbiBjYXRhbG9nCisJCQkJCQkgICBiLXRyZWUgYnV0IG5vdCBpbiBleHRlbnRzCisJCQkJCQkgICBiLXRyZWUgKGhmc3BsdXMpLiAqLwpkaWZmIC0tZ2l0IGEvZnMvaGZzL2NhdGFsb2cuYyBiL2ZzL2hmcy9jYXRhbG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVkZWRlZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmcy9jYXRhbG9nLmMKQEAgLTAsMCArMSwzNDcgQEAKKy8qCisgKiAgbGludXgvZnMvaGZzL2NhdGFsb2cuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk3ICBQYXVsIEguIEhhcmdyb3ZlCisgKiAoQykgMjAwMyBBcmRpcyBUZWNobm9sb2dpZXMgPHJvbWFuQGFyZGlzdGVjaC5jb20+CisgKiBUaGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBmdW5jdGlvbnMgcmVsYXRlZCB0byB0aGUgY2F0YWxvZyBCLXRyZWUuCisgKgorICogQ2FjaGUgY29kZSBzaGFtZWxlc3NseSBzdG9sZW4gZnJvbQorICogICAgIGxpbnV4L2ZzL2lub2RlLmMgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICogICAgIHJlLXNoYW1lbGVzc2x5IHN0b2xlbiBDb3B5cmlnaHQgKEMpIDE5OTcgTGludXMgVG9ydmFsZHMKKyAqLworCisjaW5jbHVkZSAiaGZzX2ZzLmgiCisjaW5jbHVkZSAiYnRyZWUuaCIKKworLyoKKyAqIGhmc19jYXRfYnVpbGRfa2V5KCkKKyAqCisgKiBHaXZlbiB0aGUgSUQgb2YgdGhlIHBhcmVudCBhbmQgdGhlIG5hbWUgYnVpbGQgYSBzZWFyY2gga2V5LgorICovCit2b2lkIGhmc19jYXRfYnVpbGRfa2V5KGJ0cmVlX2tleSAqa2V5LCB1MzIgcGFyZW50LCBzdHJ1Y3QgcXN0ciAqbmFtZSkKK3sKKwlrZXktPmNhdC5yZXNlcnZlZCA9IDA7CisJa2V5LT5jYXQuUGFySUQgPSBjcHVfdG9fYmUzMihwYXJlbnQpOworCWlmIChuYW1lKSB7CisJCWhmc190cml2Mm1hYygma2V5LT5jYXQuQ05hbWUsIG5hbWUpOworCQlrZXktPmtleV9sZW4gPSA2ICsga2V5LT5jYXQuQ05hbWUubGVuOworCX0gZWxzZSB7CisJCW1lbXNldCgma2V5LT5jYXQuQ05hbWUsIDAsIHNpemVvZihzdHJ1Y3QgaGZzX25hbWUpKTsKKwkJa2V5LT5rZXlfbGVuID0gNjsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaGZzX2NhdF9idWlsZF9yZWNvcmQoaGZzX2NhdF9yZWMgKnJlYywgdTMyIGNuaWQsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJX19iZTMyIG10aW1lID0gaGZzX210aW1lKCk7CisKKwltZW1zZXQocmVjLCAwLCBzaXplb2YoKnJlYykpOworCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCXJlYy0+dHlwZSA9IEhGU19DRFJfRElSOworCQlyZWMtPmRpci5EaXJJRCA9IGNwdV90b19iZTMyKGNuaWQpOworCQlyZWMtPmRpci5DckRhdCA9IG10aW1lOworCQlyZWMtPmRpci5NZERhdCA9IG10aW1lOworCQlyZWMtPmRpci5Ca0RhdCA9IDA7CisJCXJlYy0+ZGlyLlVzckluZm8uZnJWaWV3ID0gY3B1X3RvX2JlMTYoMHhmZik7CisJCXJldHVybiBzaXplb2Yoc3RydWN0IGhmc19jYXRfZGlyKTsKKwl9IGVsc2UgeworCQkvKiBpbml0IHNvbWUgZmllbGRzIGZvciB0aGUgZmlsZSByZWNvcmQgKi8KKwkJcmVjLT50eXBlID0gSEZTX0NEUl9GSUw7CisJCXJlYy0+ZmlsZS5GbGFncyA9IEhGU19GSUxfVVNFRCB8IEhGU19GSUxfVEhEOworCQlpZiAoIShpbm9kZS0+aV9tb2RlICYgU19JV1VTUikpCisJCQlyZWMtPmZpbGUuRmxhZ3MgfD0gSEZTX0ZJTF9MT0NLOworCQlyZWMtPmZpbGUuRmxOdW0gPSBjcHVfdG9fYmUzMihjbmlkKTsKKwkJcmVjLT5maWxlLkNyRGF0ID0gbXRpbWU7CisJCXJlYy0+ZmlsZS5NZERhdCA9IG10aW1lOworCQlyZWMtPmZpbGUuQmtEYXQgPSAwOworCQlyZWMtPmZpbGUuVXNyV2RzLmZkVHlwZSA9IEhGU19TQihpbm9kZS0+aV9zYiktPnNfdHlwZTsKKwkJcmVjLT5maWxlLlVzcldkcy5mZENyZWF0b3IgPSBIRlNfU0IoaW5vZGUtPmlfc2IpLT5zX2NyZWF0b3I7CisJCXJldHVybiBzaXplb2Yoc3RydWN0IGhmc19jYXRfZmlsZSk7CisJfQorfQorCitzdGF0aWMgaW50IGhmc19jYXRfYnVpbGRfdGhyZWFkKGhmc19jYXRfcmVjICpyZWMsIGludCB0eXBlLAorCQkJCXUzMiBwYXJlbnRpZCwgc3RydWN0IHFzdHIgKm5hbWUpCit7CisJcmVjLT50eXBlID0gdHlwZTsKKwltZW1zZXQocmVjLT50aHJlYWQucmVzZXJ2ZWQsIDAsIHNpemVvZihyZWMtPnRocmVhZC5yZXNlcnZlZCkpOworCXJlYy0+dGhyZWFkLlBhcklEID0gY3B1X3RvX2JlMzIocGFyZW50aWQpOworCWhmc190cml2Mm1hYygmcmVjLT50aHJlYWQuQ05hbWUsIG5hbWUpOworCXJldHVybiBzaXplb2Yoc3RydWN0IGhmc19jYXRfdGhyZWFkKTsKK30KKworLyoKKyAqIGNyZWF0ZV9lbnRyeSgpCisgKgorICogQWRkIGEgbmV3IGZpbGUgb3IgZGlyZWN0b3J5IHRvIHRoZSBjYXRhbG9nIEItdHJlZSBhbmQKKyAqIHJldHVybiBhIChzdHJ1Y3QgaGZzX2NhdF9lbnRyeSkgZm9yIGl0IGluICcqcmVzdWx0Jy4KKyAqLworaW50IGhmc19jYXRfY3JlYXRlKHUzMiBjbmlkLCBzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHFzdHIgKnN0ciwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSBmZDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXVuaW9uIGhmc19jYXRfcmVjIGVudHJ5OworCWludCBlbnRyeV9zaXplOworCWludCBlcnI7CisKKwlkcHJpbnQoREJHX0NBVF9NT0QsICJjcmVhdGVfY2F0OiAlcywldSglZClcbiIsIHN0ci0+bmFtZSwgY25pZCwgaW5vZGUtPmlfbmxpbmspOworCWlmIChkaXItPmlfc2l6ZSA+PSBIRlNfTUFYX1ZBTEVOQ0UpCisJCXJldHVybiAtRU5PU1BDOworCisJc2IgPSBkaXItPmlfc2I7CisJaGZzX2ZpbmRfaW5pdChIRlNfU0Ioc2IpLT5jYXRfdHJlZSwgJmZkKTsKKworCWhmc19jYXRfYnVpbGRfa2V5KGZkLnNlYXJjaF9rZXksIGNuaWQsIE5VTEwpOworCWVudHJ5X3NpemUgPSBoZnNfY2F0X2J1aWxkX3RocmVhZCgmZW50cnksIFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgPworCQkJSEZTX0NEUl9USEQgOiBIRlNfQ0RSX0ZUSCwKKwkJCWRpci0+aV9pbm8sIHN0cik7CisJZXJyID0gaGZzX2JyZWNfZmluZCgmZmQpOworCWlmIChlcnIgIT0gLUVOT0VOVCkgeworCQlpZiAoIWVycikKKwkJCWVyciA9IC1FRVhJU1Q7CisJCWdvdG8gZXJyMjsKKwl9CisJZXJyID0gaGZzX2JyZWNfaW5zZXJ0KCZmZCwgJmVudHJ5LCBlbnRyeV9zaXplKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycjI7CisKKwloZnNfY2F0X2J1aWxkX2tleShmZC5zZWFyY2hfa2V5LCBkaXItPmlfaW5vLCBzdHIpOworCWVudHJ5X3NpemUgPSBoZnNfY2F0X2J1aWxkX3JlY29yZCgmZW50cnksIGNuaWQsIGlub2RlKTsKKwllcnIgPSBoZnNfYnJlY19maW5kKCZmZCk7CisJaWYgKGVyciAhPSAtRU5PRU5UKSB7CisJCS8qIHBhbmljPyAqLworCQlpZiAoIWVycikKKwkJCWVyciA9IC1FRVhJU1Q7CisJCWdvdG8gZXJyMTsKKwl9CisJZXJyID0gaGZzX2JyZWNfaW5zZXJ0KCZmZCwgJmVudHJ5LCBlbnRyeV9zaXplKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycjE7CisKKwlkaXItPmlfc2l6ZSsrOworCWRpci0+aV9tdGltZSA9IGRpci0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJbWFya19pbm9kZV9kaXJ0eShkaXIpOworCWhmc19maW5kX2V4aXQoJmZkKTsKKwlyZXR1cm4gMDsKKworZXJyMToKKwloZnNfY2F0X2J1aWxkX2tleShmZC5zZWFyY2hfa2V5LCBjbmlkLCBOVUxMKTsKKwlpZiAoIWhmc19icmVjX2ZpbmQoJmZkKSkKKwkJaGZzX2JyZWNfcmVtb3ZlKCZmZCk7CitlcnIyOgorCWhmc19maW5kX2V4aXQoJmZkKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogaGZzX2NhdF9jb21wYXJlKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgVGhpcyBpcyB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbiB1c2VkIGZvciB0aGUgY2F0YWxvZyBCLXRyZWUuICBJbgorICogICBjb21wYXJpbmcgY2F0YWxvZyBCLXRyZWUgZW50cmllcywgdGhlIHBhcmVudCBpZCBpcyB0aGUgbW9zdAorICogICBzaWduaWZpY2FudCBmaWVsZCAoY29tcGFyZWQgYXMgdW5zaWduZWQgaW50cykuICBUaGUgbmFtZSBmaWVsZCBpcworICogICB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgKGNvbXBhcmVkIGluICJNYWNpbnRvc2ggbGV4aWNhbCBvcmRlciIsCisgKiAgIHNlZSBoZnNfc3RyY21wKCkgaW4gc3RyaW5nLmMpCisgKiBJbnB1dCBWYXJpYWJsZShzKToKKyAqICAgc3RydWN0IGhmc19jYXRfa2V5ICprZXkxOiBwb2ludGVyIHRvIHRoZSBmaXJzdCBrZXkgdG8gY29tcGFyZQorICogICBzdHJ1Y3QgaGZzX2NhdF9rZXkgKmtleTI6IHBvaW50ZXIgdG8gdGhlIHNlY29uZCBrZXkgdG8gY29tcGFyZQorICogT3V0cHV0IFZhcmlhYmxlKHMpOgorICogICBOT05FCisgKiBSZXR1cm5zOgorICogICBpbnQ6IG5lZ2F0aXZlIGlmIGtleTE8a2V5MiwgcG9zaXRpdmUgaWYga2V5MT5rZXkyLCBhbmQgMCBpZiBrZXkxPT1rZXkyCisgKiBQcmVjb25kaXRpb25zOgorICogICBrZXkxIGFuZCBrZXkyIHBvaW50IHRvICJ2YWxpZCIgKHN0cnVjdCBoZnNfY2F0X2tleSlzLgorICogUG9zdGNvbmRpdGlvbnM6CisgKiAgIFRoaXMgZnVuY3Rpb24gaGFzIG5vIHNpZGUtZWZmZWN0cworICovCitpbnQgaGZzX2NhdF9rZXljbXAoY29uc3QgYnRyZWVfa2V5ICprZXkxLCBjb25zdCBidHJlZV9rZXkgKmtleTIpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IGJlMzJfdG9fY3B1KGtleTEtPmNhdC5QYXJJRCkgLSBiZTMyX3RvX2NwdShrZXkyLT5jYXQuUGFySUQpOworCWlmICghcmV0dmFsKQorCQlyZXR2YWwgPSBoZnNfc3RyY21wKGtleTEtPmNhdC5DTmFtZS5uYW1lLCBrZXkxLT5jYXQuQ05hbWUubGVuLAorCQkJCSAgICBrZXkyLT5jYXQuQ05hbWUubmFtZSwga2V5Mi0+Y2F0LkNOYW1lLmxlbik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBUcnkgdG8gZ2V0IGEgY2F0YWxvZyBlbnRyeSBmb3IgZ2l2ZW4gY2F0YWxvZyBpZCAqLworLy8gbW92ZSB0byByZWFkX3N1cGVyPz8/CitpbnQgaGZzX2NhdF9maW5kX2JyZWMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdTMyIGNuaWQsCisJCSAgICAgIHN0cnVjdCBoZnNfZmluZF9kYXRhICpmZCkKK3sKKwloZnNfY2F0X3JlYyByZWM7CisJaW50IHJlcywgbGVuLCB0eXBlOworCisJaGZzX2NhdF9idWlsZF9rZXkoZmQtPnNlYXJjaF9rZXksIGNuaWQsIE5VTEwpOworCXJlcyA9IGhmc19icmVjX3JlYWQoZmQsICZyZWMsIHNpemVvZihyZWMpKTsKKwlpZiAocmVzKQorCQlyZXR1cm4gcmVzOworCisJdHlwZSA9IHJlYy50eXBlOworCWlmICh0eXBlICE9IEhGU19DRFJfVEhEICYmIHR5cGUgIT0gSEZTX0NEUl9GVEgpIHsKKwkJcHJpbnRrKCJIRlMtZnM6IEZvdW5kIGJhZCB0aHJlYWQgcmVjb3JkIGluIGNhdGFsb2dcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlmZC0+c2VhcmNoX2tleS0+Y2F0LlBhcklEID0gcmVjLnRocmVhZC5QYXJJRDsKKwlsZW4gPSBmZC0+c2VhcmNoX2tleS0+Y2F0LkNOYW1lLmxlbiA9IHJlYy50aHJlYWQuQ05hbWUubGVuOworCW1lbWNweShmZC0+c2VhcmNoX2tleS0+Y2F0LkNOYW1lLm5hbWUsIHJlYy50aHJlYWQuQ05hbWUubmFtZSwgbGVuKTsKKwlyZXR1cm4gaGZzX2JyZWNfZmluZChmZCk7Cit9CisKKworLyoKKyAqIGhmc19jYXRfZGVsZXRlKCkKKyAqCisgKiBEZWxldGUgdGhlIGluZGljYXRlZCBmaWxlIG9yIGRpcmVjdG9yeS4KKyAqIFRoZSBhc3NvY2lhdGVkIHRocmVhZCBpcyBhbHNvIHJlbW92ZWQgdW5sZXNzICgnd2l0aF90aHJlYWQnPT0wKS4KKyAqLworaW50IGhmc19jYXRfZGVsZXRlKHUzMiBjbmlkLCBzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHFzdHIgKnN0cikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXN0cnVjdCBoZnNfZmluZF9kYXRhIGZkOworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwlpbnQgcmVzLCB0eXBlOworCisJZHByaW50KERCR19DQVRfTU9ELCAiZGVsZXRlX2NhdDogJXMsJXVcbiIsIHN0ciA/IHN0ci0+bmFtZSA6IE5VTEwsIGNuaWQpOworCXNiID0gZGlyLT5pX3NiOworCWhmc19maW5kX2luaXQoSEZTX1NCKHNiKS0+Y2F0X3RyZWUsICZmZCk7CisKKwloZnNfY2F0X2J1aWxkX2tleShmZC5zZWFyY2hfa2V5LCBkaXItPmlfaW5vLCBzdHIpOworCXJlcyA9IGhmc19icmVjX2ZpbmQoJmZkKTsKKwlpZiAocmVzKQorCQlnb3RvIG91dDsKKworCXR5cGUgPSBoZnNfYm5vZGVfcmVhZF91OChmZC5ibm9kZSwgZmQuZW50cnlvZmZzZXQpOworCWlmICh0eXBlID09IEhGU19DRFJfRklMKSB7CisJCXN0cnVjdCBoZnNfY2F0X2ZpbGUgZmlsZTsKKwkJaGZzX2Jub2RlX3JlYWQoZmQuYm5vZGUsICZmaWxlLCBmZC5lbnRyeW9mZnNldCwgc2l6ZW9mKGZpbGUpKTsKKwkJaWYgKGJlMzJfdG9fY3B1KGZpbGUuRmxOdW0pID09IGNuaWQpIHsKKyNpZiAwCisJCQloZnNfZnJlZV9mb3JrKHNiLCAmZmlsZSwgSEZTX0ZLX0RBVEEpOworI2VuZGlmCisJCQloZnNfZnJlZV9mb3JrKHNiLCAmZmlsZSwgSEZTX0ZLX1JTUkMpOworCQl9CisJfQorCisJbGlzdF9mb3JfZWFjaChwb3MsICZIRlNfSShkaXIpLT5vcGVuX2Rpcl9saXN0KSB7CisJCXN0cnVjdCBoZnNfcmVhZGRpcl9kYXRhICpyZCA9CisJCQlsaXN0X2VudHJ5KHBvcywgc3RydWN0IGhmc19yZWFkZGlyX2RhdGEsIGxpc3QpOworCQlpZiAoZmQudHJlZS0+a2V5Y21wKGZkLnNlYXJjaF9rZXksICh2b2lkICopJnJkLT5rZXkpIDwgMCkKKwkJCXJkLT5maWxlLT5mX3Bvcy0tOworCX0KKworCXJlcyA9IGhmc19icmVjX3JlbW92ZSgmZmQpOworCWlmIChyZXMpCisJCWdvdG8gb3V0OworCisJaGZzX2NhdF9idWlsZF9rZXkoZmQuc2VhcmNoX2tleSwgY25pZCwgTlVMTCk7CisJcmVzID0gaGZzX2JyZWNfZmluZCgmZmQpOworCWlmICghcmVzKSB7CisJCXJlcyA9IGhmc19icmVjX3JlbW92ZSgmZmQpOworCQlpZiAocmVzKQorCQkJZ290byBvdXQ7CisJfQorCisJZGlyLT5pX3NpemUtLTsKKwlkaXItPmlfbXRpbWUgPSBkaXItPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCW1hcmtfaW5vZGVfZGlydHkoZGlyKTsKKwlyZXMgPSAwOworb3V0OgorCWhmc19maW5kX2V4aXQoJmZkKTsKKworCXJldHVybiByZXM7Cit9CisKKy8qCisgKiBoZnNfY2F0X21vdmUoKQorICoKKyAqIFJlbmFtZSBhIGZpbGUgb3IgZGlyZWN0b3J5LCBwb3NzaWJseSB0byBhIG5ldyBkaXJlY3RvcnkuCisgKiBJZiB0aGUgZGVzdGluYXRpb24gZXhpc3RzIGl0IGlzIHJlbW92ZWQgYW5kIGEKKyAqIChzdHJ1Y3QgaGZzX2NhdF9lbnRyeSkgZm9yIGl0IGlzIHJldHVybmVkIGluICcqcmVzdWx0Jy4KKyAqLworaW50IGhmc19jYXRfbW92ZSh1MzIgY25pZCwgc3RydWN0IGlub2RlICpzcmNfZGlyLCBzdHJ1Y3QgcXN0ciAqc3JjX25hbWUsCisJCSBzdHJ1Y3QgaW5vZGUgKmRzdF9kaXIsIHN0cnVjdCBxc3RyICpkc3RfbmFtZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXN0cnVjdCBoZnNfZmluZF9kYXRhIHNyY19mZCwgZHN0X2ZkOworCXVuaW9uIGhmc19jYXRfcmVjIGVudHJ5OworCWludCBlbnRyeV9zaXplLCB0eXBlOworCWludCBlcnI7CisKKwlkcHJpbnQoREJHX0NBVF9NT0QsICJyZW5hbWVfY2F0OiAldSAtICVsdSwlcyAtICVsdSwlc1xuIiwgY25pZCwgc3JjX2Rpci0+aV9pbm8sIHNyY19uYW1lLT5uYW1lLAorCQlkc3RfZGlyLT5pX2lubywgZHN0X25hbWUtPm5hbWUpOworCXNiID0gc3JjX2Rpci0+aV9zYjsKKwloZnNfZmluZF9pbml0KEhGU19TQihzYiktPmNhdF90cmVlLCAmc3JjX2ZkKTsKKwlkc3RfZmQgPSBzcmNfZmQ7CisKKwkvKiBmaW5kIHRoZSBvbGQgZGlyIGVudHJ5IGFuZCByZWFkIHRoZSBkYXRhICovCisJaGZzX2NhdF9idWlsZF9rZXkoc3JjX2ZkLnNlYXJjaF9rZXksIHNyY19kaXItPmlfaW5vLCBzcmNfbmFtZSk7CisJZXJyID0gaGZzX2JyZWNfZmluZCgmc3JjX2ZkKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWhmc19ibm9kZV9yZWFkKHNyY19mZC5ibm9kZSwgJmVudHJ5LCBzcmNfZmQuZW50cnlvZmZzZXQsCisJCQkgICAgc3JjX2ZkLmVudHJ5bGVuZ3RoKTsKKworCS8qIGNyZWF0ZSBuZXcgZGlyIGVudHJ5IHdpdGggdGhlIGRhdGEgZnJvbSB0aGUgb2xkIGVudHJ5ICovCisJaGZzX2NhdF9idWlsZF9rZXkoZHN0X2ZkLnNlYXJjaF9rZXksIGRzdF9kaXItPmlfaW5vLCBkc3RfbmFtZSk7CisJZXJyID0gaGZzX2JyZWNfZmluZCgmZHN0X2ZkKTsKKwlpZiAoZXJyICE9IC1FTk9FTlQpIHsKKwkJaWYgKCFlcnIpCisJCQllcnIgPSAtRUVYSVNUOworCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSBoZnNfYnJlY19pbnNlcnQoJmRzdF9mZCwgJmVudHJ5LCBzcmNfZmQuZW50cnlsZW5ndGgpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWRzdF9kaXItPmlfc2l6ZSsrOworCWRzdF9kaXItPmlfbXRpbWUgPSBkc3RfZGlyLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwltYXJrX2lub2RlX2RpcnR5KGRzdF9kaXIpOworCisJLyogZmluYWxseSByZW1vdmUgdGhlIG9sZCBlbnRyeSAqLworCWhmc19jYXRfYnVpbGRfa2V5KHNyY19mZC5zZWFyY2hfa2V5LCBzcmNfZGlyLT5pX2lubywgc3JjX25hbWUpOworCWVyciA9IGhmc19icmVjX2ZpbmQoJnNyY19mZCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZXJyID0gaGZzX2JyZWNfcmVtb3ZlKCZzcmNfZmQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCXNyY19kaXItPmlfc2l6ZS0tOworCXNyY19kaXItPmlfbXRpbWUgPSBzcmNfZGlyLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwltYXJrX2lub2RlX2RpcnR5KHNyY19kaXIpOworCisJdHlwZSA9IGVudHJ5LnR5cGU7CisJaWYgKHR5cGUgPT0gSEZTX0NEUl9GSUwgJiYgIShlbnRyeS5maWxlLkZsYWdzICYgSEZTX0ZJTF9USEQpKQorCQlnb3RvIG91dDsKKworCS8qIHJlbW92ZSBvbGQgdGhyZWFkIGVudHJ5ICovCisJaGZzX2NhdF9idWlsZF9rZXkoc3JjX2ZkLnNlYXJjaF9rZXksIGNuaWQsIE5VTEwpOworCWVyciA9IGhmc19icmVjX2ZpbmQoJnNyY19mZCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZXJyID0gaGZzX2JyZWNfcmVtb3ZlKCZzcmNfZmQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJLyogY3JlYXRlIG5ldyB0aHJlYWQgZW50cnkgKi8KKwloZnNfY2F0X2J1aWxkX2tleShkc3RfZmQuc2VhcmNoX2tleSwgY25pZCwgTlVMTCk7CisJZW50cnlfc2l6ZSA9IGhmc19jYXRfYnVpbGRfdGhyZWFkKCZlbnRyeSwgdHlwZSA9PSBIRlNfQ0RSX0ZJTCA/IEhGU19DRFJfRlRIIDogSEZTX0NEUl9USEQsCisJCQkJCWRzdF9kaXItPmlfaW5vLCBkc3RfbmFtZSk7CisJZXJyID0gaGZzX2JyZWNfZmluZCgmZHN0X2ZkKTsKKwlpZiAoZXJyICE9IC1FTk9FTlQpIHsKKwkJaWYgKCFlcnIpCisJCQllcnIgPSAtRUVYSVNUOworCQlnb3RvIG91dDsKKwl9CisJZXJyID0gaGZzX2JyZWNfaW5zZXJ0KCZkc3RfZmQsICZlbnRyeSwgZW50cnlfc2l6ZSk7CitvdXQ6CisJaGZzX2Jub2RlX3B1dChkc3RfZmQuYm5vZGUpOworCWhmc19maW5kX2V4aXQoJnNyY19mZCk7CisJcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL2ZzL2hmcy9kaXIuYyBiL2ZzL2hmcy9kaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTU5OTgyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaGZzL2Rpci5jCkBAIC0wLDAgKzEsMzMwIEBACisvKgorICogIGxpbnV4L2ZzL2hmcy9kaXIuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk3ICBQYXVsIEguIEhhcmdyb3ZlCisgKiAoQykgMjAwMyBBcmRpcyBUZWNobm9sb2dpZXMgPHJvbWFuQGFyZGlzdGVjaC5jb20+CisgKiBUaGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGRpcmVjdG9yeS1yZWxhdGVkIGZ1bmN0aW9ucyBpbmRlcGVuZGVudCBvZiB3aGljaAorICogc2NoZW1lIGlzIGJlaW5nIHVzZWQgdG8gcmVwcmVzZW50IGZvcmtzLgorICoKKyAqIEJhc2VkIG9uIHRoZSBtaW5peCBmaWxlIHN5c3RlbSBjb2RlLCAoQykgMTk5MSwgMTk5MiBieSBMaW51cyBUb3J2YWxkcworICovCisKKyNpbmNsdWRlICJoZnNfZnMuaCIKKyNpbmNsdWRlICJidHJlZS5oIgorCisvKgorICogaGZzX2xvb2t1cCgpCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpoZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkJIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWhmc19jYXRfcmVjIHJlYzsKKwlzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSBmZDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKKwlpbnQgcmVzOworCisJZGVudHJ5LT5kX29wID0gJmhmc19kZW50cnlfb3BlcmF0aW9uczsKKworCWhmc19maW5kX2luaXQoSEZTX1NCKGRpci0+aV9zYiktPmNhdF90cmVlLCAmZmQpOworCWhmc19jYXRfYnVpbGRfa2V5KGZkLnNlYXJjaF9rZXksIGRpci0+aV9pbm8sICZkZW50cnktPmRfbmFtZSk7CisJcmVzID0gaGZzX2JyZWNfcmVhZCgmZmQsICZyZWMsIHNpemVvZihyZWMpKTsKKwlpZiAocmVzKSB7CisJCWhmc19maW5kX2V4aXQoJmZkKTsKKwkJaWYgKHJlcyA9PSAtRU5PRU5UKSB7CisJCQkvKiBObyBzdWNoIGVudHJ5ICovCisJCQlpbm9kZSA9IE5VTEw7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJcmV0dXJuIEVSUl9QVFIocmVzKTsKKwl9CisJaW5vZGUgPSBoZnNfaWdldChkaXItPmlfc2IsICZmZC5zZWFyY2hfa2V5LT5jYXQsICZyZWMpOworCWhmc19maW5kX2V4aXQoJmZkKTsKKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKK2RvbmU6CisJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBoZnNfcmVhZGRpcgorICovCitzdGF0aWMgaW50IGhmc19yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJaW50IGxlbiwgZXJyOworCWNoYXIgc3RyYnVmW0hGU19OQU1FTEVOICsgMV07CisJdW5pb24gaGZzX2NhdF9yZWMgZW50cnk7CisJc3RydWN0IGhmc19maW5kX2RhdGEgZmQ7CisJc3RydWN0IGhmc19yZWFkZGlyX2RhdGEgKnJkOworCXUxNiB0eXBlOworCisJaWYgKGZpbHAtPmZfcG9zID49IGlub2RlLT5pX3NpemUpCisJCXJldHVybiAwOworCisJaGZzX2ZpbmRfaW5pdChIRlNfU0Ioc2IpLT5jYXRfdHJlZSwgJmZkKTsKKwloZnNfY2F0X2J1aWxkX2tleShmZC5zZWFyY2hfa2V5LCBpbm9kZS0+aV9pbm8sIE5VTEwpOworCWVyciA9IGhmc19icmVjX2ZpbmQoJmZkKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCXN3aXRjaCAoKHUzMilmaWxwLT5mX3BvcykgeworCWNhc2UgMDoKKwkJLyogVGhpcyBpcyBjb21wbGV0ZWx5IGFydGlmaWNpYWwuLi4gKi8KKwkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLiIsIDEsIDAsIGlub2RlLT5pX2lubywgRFRfRElSKSkKKwkJCWdvdG8gb3V0OworCQlmaWxwLT5mX3BvcysrOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIDE6CisJCWhmc19ibm9kZV9yZWFkKGZkLmJub2RlLCAmZW50cnksIGZkLmVudHJ5b2Zmc2V0LCBmZC5lbnRyeWxlbmd0aCk7CisJCWlmIChlbnRyeS50eXBlICE9IEhGU19DRFJfVEhEKSB7CisJCQlwcmludGsoIkhGUzogYmFkIGNhdGFsb2cgZm9sZGVyIHRocmVhZFxuIik7CisJCQllcnIgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwkJLy9pZiAoZmQuZW50cnlsZW5ndGggPCBIRlNfTUlOX1RIUkVBRF9TWikgeworCQkvLwlwcmludGsoIkhGUzogdHJ1bmNhdGVkIGNhdGFsb2cgdGhyZWFkXG4iKTsKKwkJLy8JZXJyID0gLUVJTzsKKwkJLy8JZ290byBvdXQ7CisJCS8vfQorCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuLiIsIDIsIDEsCisJCQkgICAgYmUzMl90b19jcHUoZW50cnkudGhyZWFkLlBhcklEKSwgRFRfRElSKSkKKwkJCWdvdG8gb3V0OworCQlmaWxwLT5mX3BvcysrOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwlkZWZhdWx0OgorCQlpZiAoZmlscC0+Zl9wb3MgPj0gaW5vZGUtPmlfc2l6ZSkKKwkJCWdvdG8gb3V0OworCQllcnIgPSBoZnNfYnJlY19nb3RvKCZmZCwgZmlscC0+Zl9wb3MgLSAxKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCX0KKworCWZvciAoOzspIHsKKwkJaWYgKGJlMzJfdG9fY3B1KGZkLmtleS0+Y2F0LlBhcklEKSAhPSBpbm9kZS0+aV9pbm8pIHsKKwkJCXByaW50aygiSEZTOiB3YWxrZWQgcGFzdCBlbmQgb2YgZGlyXG4iKTsKKwkJCWVyciA9IC1FSU87CisJCQlnb3RvIG91dDsKKwkJfQorCQloZnNfYm5vZGVfcmVhZChmZC5ibm9kZSwgJmVudHJ5LCBmZC5lbnRyeW9mZnNldCwgZmQuZW50cnlsZW5ndGgpOworCQl0eXBlID0gZW50cnkudHlwZTsKKwkJbGVuID0gaGZzX21hYzJ0cml2KHN0cmJ1ZiwgJmZkLmtleS0+Y2F0LkNOYW1lKTsKKwkJaWYgKHR5cGUgPT0gSEZTX0NEUl9ESVIpIHsKKwkJCWlmIChmZC5lbnRyeWxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgaGZzX2NhdF9kaXIpKSB7CisJCQkJcHJpbnRrKCJIRlM6IHNtYWxsIGRpciBlbnRyeVxuIik7CisJCQkJZXJyID0gLUVJTzsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWlmIChmaWxsZGlyKGRpcmVudCwgc3RyYnVmLCBsZW4sIGZpbHAtPmZfcG9zLAorCQkJCSAgICBiZTMyX3RvX2NwdShlbnRyeS5kaXIuRGlySUQpLCBEVF9ESVIpKQorCQkJCWJyZWFrOworCQl9IGVsc2UgaWYgKHR5cGUgPT0gSEZTX0NEUl9GSUwpIHsKKwkJCWlmIChmZC5lbnRyeWxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgaGZzX2NhdF9maWxlKSkgeworCQkJCXByaW50aygiSEZTOiBzbWFsbCBmaWxlIGVudHJ5XG4iKTsKKwkJCQllcnIgPSAtRUlPOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJaWYgKGZpbGxkaXIoZGlyZW50LCBzdHJidWYsIGxlbiwgZmlscC0+Zl9wb3MsCisJCQkJICAgIGJlMzJfdG9fY3B1KGVudHJ5LmZpbGUuRmxOdW0pLCBEVF9SRUcpKQorCQkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJcHJpbnRrKCJIRlM6IGJhZCBjYXRhbG9nIGVudHJ5IHR5cGUgJWRcbiIsIHR5cGUpOworCQkJZXJyID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisJCWZpbHAtPmZfcG9zKys7CisJCWlmIChmaWxwLT5mX3BvcyA+PSBpbm9kZS0+aV9zaXplKQorCQkJZ290byBvdXQ7CisJCWVyciA9IGhmc19icmVjX2dvdG8oJmZkLCAxKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCX0KKwlyZCA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlpZiAoIXJkKSB7CisJCXJkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGhmc19yZWFkZGlyX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFyZCkgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWZpbHAtPnByaXZhdGVfZGF0YSA9IHJkOworCQlyZC0+ZmlsZSA9IGZpbHA7CisJCWxpc3RfYWRkKCZyZC0+bGlzdCwgJkhGU19JKGlub2RlKS0+b3Blbl9kaXJfbGlzdCk7CisJfQorCW1lbWNweSgmcmQtPmtleSwgJmZkLmtleSwgc2l6ZW9mKHN0cnVjdCBoZnNfY2F0X2tleSkpOworb3V0OgorCWhmc19maW5kX2V4aXQoJmZkKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGhmc19kaXJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgaGZzX3JlYWRkaXJfZGF0YSAqcmQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaWYgKHJkKSB7CisJCWxpc3RfZGVsKCZyZC0+bGlzdCk7CisJCWtmcmVlKHJkKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBoZnNfY3JlYXRlKCkKKyAqCisgKiBUaGlzIGlzIHRoZSBjcmVhdGUoKSBlbnRyeSBpbiB0aGUgaW5vZGVfb3BlcmF0aW9ucyBzdHJ1Y3R1cmUgZm9yCisgKiByZWd1bGFyIEhGUyBkaXJlY3Rvcmllcy4gIFRoZSBwdXJwb3NlIGlzIHRvIGNyZWF0ZSBhIG5ldyBmaWxlIGluCisgKiBhIGRpcmVjdG9yeSBhbmQgcmV0dXJuIGEgY29ycmVzcG9uZGluZyBpbm9kZSwgZ2l2ZW4gdGhlIGlub2RlIGZvcgorICogdGhlIGRpcmVjdG9yeSBhbmQgdGhlIG5hbWUgKGFuZCBpdHMgbGVuZ3RoKSBvZiB0aGUgbmV3IGZpbGUuCisgKi8KK3N0YXRpYyBpbnQgaGZzX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKKwkJICAgICAgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgcmVzOworCisJaW5vZGUgPSBoZnNfbmV3X2lub2RlKGRpciwgJmRlbnRyeS0+ZF9uYW1lLCBtb2RlKTsKKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCXJlcyA9IGhmc19jYXRfY3JlYXRlKGlub2RlLT5pX2lubywgZGlyLCAmZGVudHJ5LT5kX25hbWUsIGlub2RlKTsKKwlpZiAocmVzKSB7CisJCWlub2RlLT5pX25saW5rID0gMDsKKwkJaGZzX2RlbGV0ZV9pbm9kZShpbm9kZSk7CisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gcmVzOworCX0KKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCXJldHVybiAwOworfQorCisvKgorICogaGZzX21rZGlyKCkKKyAqCisgKiBUaGlzIGlzIHRoZSBta2RpcigpIGVudHJ5IGluIHRoZSBpbm9kZV9vcGVyYXRpb25zIHN0cnVjdHVyZSBmb3IKKyAqIHJlZ3VsYXIgSEZTIGRpcmVjdG9yaWVzLiAgVGhlIHB1cnBvc2UgaXMgdG8gY3JlYXRlIGEgbmV3IGRpcmVjdG9yeQorICogaW4gYSBkaXJlY3RvcnksIGdpdmVuIHRoZSBpbm9kZSBmb3IgdGhlIHBhcmVudCBkaXJlY3RvcnkgYW5kIHRoZQorICogbmFtZSAoYW5kIGl0cyBsZW5ndGgpIG9mIHRoZSBuZXcgZGlyZWN0b3J5LgorICovCitzdGF0aWMgaW50IGhmc19ta2RpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWludCByZXM7CisKKwlpbm9kZSA9IGhmc19uZXdfaW5vZGUoZGlyLCAmZGVudHJ5LT5kX25hbWUsIFNfSUZESVIgfCBtb2RlKTsKKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCXJlcyA9IGhmc19jYXRfY3JlYXRlKGlub2RlLT5pX2lubywgZGlyLCAmZGVudHJ5LT5kX25hbWUsIGlub2RlKTsKKwlpZiAocmVzKSB7CisJCWlub2RlLT5pX25saW5rID0gMDsKKwkJaGZzX2RlbGV0ZV9pbm9kZShpbm9kZSk7CisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gcmVzOworCX0KKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCXJldHVybiAwOworfQorCisvKgorICogaGZzX3VubGluaygpCisgKgorICogVGhpcyBpcyB0aGUgdW5saW5rKCkgZW50cnkgaW4gdGhlIGlub2RlX29wZXJhdGlvbnMgc3RydWN0dXJlIGZvcgorICogcmVndWxhciBIRlMgZGlyZWN0b3JpZXMuICBUaGUgcHVycG9zZSBpcyB0byBkZWxldGUgYW4gZXhpc3RpbmcKKyAqIGZpbGUsIGdpdmVuIHRoZSBpbm9kZSBmb3IgdGhlIHBhcmVudCBkaXJlY3RvcnkgYW5kIHRoZSBuYW1lCisgKiAoYW5kIGl0cyBsZW5ndGgpIG9mIHRoZSBleGlzdGluZyBmaWxlLgorICovCitzdGF0aWMgaW50IGhmc191bmxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWludCByZXM7CisKKwlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlyZXMgPSBoZnNfY2F0X2RlbGV0ZShpbm9kZS0+aV9pbm8sIGRpciwgJmRlbnRyeS0+ZF9uYW1lKTsKKwlpZiAocmVzKQorCQlyZXR1cm4gcmVzOworCisJaW5vZGUtPmlfbmxpbmstLTsKKwloZnNfZGVsZXRlX2lub2RlKGlub2RlKTsKKwlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisKKwlyZXR1cm4gcmVzOworfQorCisvKgorICogaGZzX3JtZGlyKCkKKyAqCisgKiBUaGlzIGlzIHRoZSBybWRpcigpIGVudHJ5IGluIHRoZSBpbm9kZV9vcGVyYXRpb25zIHN0cnVjdHVyZSBmb3IKKyAqIHJlZ3VsYXIgSEZTIGRpcmVjdG9yaWVzLiAgVGhlIHB1cnBvc2UgaXMgdG8gZGVsZXRlIGFuIGV4aXN0aW5nCisgKiBkaXJlY3RvcnksIGdpdmVuIHRoZSBpbm9kZSBmb3IgdGhlIHBhcmVudCBkaXJlY3RvcnkgYW5kIHRoZSBuYW1lCisgKiAoYW5kIGl0cyBsZW5ndGgpIG9mIHRoZSBleGlzdGluZyBkaXJlY3RvcnkuCisgKi8KK3N0YXRpYyBpbnQgaGZzX3JtZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgcmVzOworCisJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaWYgKGlub2RlLT5pX3NpemUgIT0gMikKKwkJcmV0dXJuIC1FTk9URU1QVFk7CisJcmVzID0gaGZzX2NhdF9kZWxldGUoaW5vZGUtPmlfaW5vLCBkaXIsICZkZW50cnktPmRfbmFtZSk7CisJaWYgKHJlcykKKwkJcmV0dXJuIHJlczsKKwlpbm9kZS0+aV9ubGluayA9IDA7CisJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCWhmc19kZWxldGVfaW5vZGUoaW5vZGUpOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCXJldHVybiAwOworfQorCisvKgorICogaGZzX3JlbmFtZSgpCisgKgorICogVGhpcyBpcyB0aGUgcmVuYW1lKCkgZW50cnkgaW4gdGhlIGlub2RlX29wZXJhdGlvbnMgc3RydWN0dXJlIGZvcgorICogcmVndWxhciBIRlMgZGlyZWN0b3JpZXMuICBUaGUgcHVycG9zZSBpcyB0byByZW5hbWUgYW4gZXhpc3RpbmcKKyAqIGZpbGUgb3IgZGlyZWN0b3J5LCBnaXZlbiB0aGUgaW5vZGUgZm9yIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQKKyAqIHRoZSBuYW1lIChhbmQgaXRzIGxlbmd0aCkgb2YgdGhlIGV4aXN0aW5nIGZpbGUvZGlyZWN0b3J5IGFuZCB0aGUKKyAqIGlub2RlIGZvciB0aGUgbmV3IGRpcmVjdG9yeSBhbmQgdGhlIG5hbWUgKGFuZCBpdHMgbGVuZ3RoKSBvZiB0aGUKKyAqIG5ldyBmaWxlL2RpcmVjdG9yeS4KKyAqIFhYWDogaG93IGRvIHlvdSBoYW5kbGUgbXVzdF9iZSBkaXI/CisgKi8KK3N0YXRpYyBpbnQgaGZzX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCisJCSAgICAgIHN0cnVjdCBpbm9kZSAqbmV3X2Rpciwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKK3sKKwlpbnQgcmVzOworCisJLyogVW5saW5rIGRlc3RpbmF0aW9uIGlmIGl0IGFscmVhZHkgZXhpc3RzICovCisJaWYgKG5ld19kZW50cnktPmRfaW5vZGUpIHsKKwkJcmVzID0gaGZzX3VubGluayhuZXdfZGlyLCBuZXdfZGVudHJ5KTsKKwkJaWYgKHJlcykKKwkJCXJldHVybiByZXM7CisJfQorCisJcmVzID0gaGZzX2NhdF9tb3ZlKG9sZF9kZW50cnktPmRfaW5vZGUtPmlfaW5vLAorCQkJICAgb2xkX2RpciwgJm9sZF9kZW50cnktPmRfbmFtZSwKKwkJCSAgIG5ld19kaXIsICZuZXdfZGVudHJ5LT5kX25hbWUpOworCWlmICghcmVzKQorCQloZnNfY2F0X2J1aWxkX2tleSgoYnRyZWVfa2V5ICopJkhGU19JKG9sZF9kZW50cnktPmRfaW5vZGUpLT5jYXRfa2V5LAorCQkJCSAgbmV3X2Rpci0+aV9pbm8sICZuZXdfZGVudHJ5LT5kX25hbWUpOworCXJldHVybiByZXM7Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgaGZzX2Rpcl9vcGVyYXRpb25zID0geworCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIJPSBoZnNfcmVhZGRpciwKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlbGVhc2UJPSBoZnNfZGlyX3JlbGVhc2UsCit9OworCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBoZnNfZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLmNyZWF0ZQkJPSBoZnNfY3JlYXRlLAorCS5sb29rdXAJCT0gaGZzX2xvb2t1cCwKKwkudW5saW5rCQk9IGhmc191bmxpbmssCisJLm1rZGlyCQk9IGhmc19ta2RpciwKKwkucm1kaXIJCT0gaGZzX3JtZGlyLAorCS5yZW5hbWUJCT0gaGZzX3JlbmFtZSwKKwkuc2V0YXR0cgk9IGhmc19pbm9kZV9zZXRhdHRyLAorfTsKZGlmZiAtLWdpdCBhL2ZzL2hmcy9leHRlbnQuYyBiL2ZzL2hmcy9leHRlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmM4NTEwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaGZzL2V4dGVudC5jCkBAIC0wLDAgKzEsNTI3IEBACisvKgorICogIGxpbnV4L2ZzL2hmcy9leHRlbnQuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk3ICBQYXVsIEguIEhhcmdyb3ZlCisgKiAoQykgMjAwMyBBcmRpcyBUZWNobm9sb2dpZXMgPHJvbWFuQGFyZGlzdGVjaC5jb20+CisgKiBUaGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBmdW5jdGlvbnMgcmVsYXRlZCB0byB0aGUgZXh0ZW50cyBCLXRyZWUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKworI2luY2x1ZGUgImhmc19mcy5oIgorI2luY2x1ZGUgImJ0cmVlLmgiCisKKy8qPT09PT09PT09PT09PT09PSBGaWxlLWxvY2FsIGZ1bmN0aW9ucyA9PT09PT09PT09PT09PT09Ki8KKworLyoKKyAqIGJ1aWxkX2tleQorICovCitzdGF0aWMgdm9pZCBoZnNfZXh0X2J1aWxkX2tleShoZnNfYnRyZWVfa2V5ICprZXksIHUzMiBjbmlkLCB1MTYgYmxvY2ssIHU4IHR5cGUpCit7CisJa2V5LT5rZXlfbGVuID0gNzsKKwlrZXktPmV4dC5Ga1R5cGUgPSB0eXBlOworCWtleS0+ZXh0LkZOdW0gPSBjcHVfdG9fYmUzMihjbmlkKTsKKwlrZXktPmV4dC5GQUJOID0gY3B1X3RvX2JlMTYoYmxvY2spOworfQorCisvKgorICogaGZzX2V4dF9jb21wYXJlKCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgVGhpcyBpcyB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbiB1c2VkIGZvciB0aGUgZXh0ZW50cyBCLXRyZWUuICBJbgorICogICBjb21wYXJpbmcgZXh0ZW50IEItdHJlZSBlbnRyaWVzLCB0aGUgZmlsZSBpZCBpcyB0aGUgbW9zdAorICogICBzaWduaWZpY2FudCBmaWVsZCAoY29tcGFyZWQgYXMgdW5zaWduZWQgaW50cyk7IHRoZSBmb3JrIHR5cGUgaXMKKyAqICAgdGhlIHNlY29uZCBtb3N0IHNpZ25pZmljYW50IGZpZWxkIChjb21wYXJlZCBhcyB1bnNpZ25lZCBjaGFycyk7CisgKiAgIGFuZCB0aGUgYWxsb2NhdGlvbiBibG9jayBudW1iZXIgZmllbGQgaXMgdGhlIGxlYXN0IHNpZ25pZmljYW50CisgKiAgIChjb21wYXJlZCBhcyB1bnNpZ25lZCBpbnRzKS4KKyAqIElucHV0IFZhcmlhYmxlKHMpOgorICogICBzdHJ1Y3QgaGZzX2V4dF9rZXkgKmtleTE6IHBvaW50ZXIgdG8gdGhlIGZpcnN0IGtleSB0byBjb21wYXJlCisgKiAgIHN0cnVjdCBoZnNfZXh0X2tleSAqa2V5MjogcG9pbnRlciB0byB0aGUgc2Vjb25kIGtleSB0byBjb21wYXJlCisgKiBPdXRwdXQgVmFyaWFibGUocyk6CisgKiAgIE5PTkUKKyAqIFJldHVybnM6CisgKiAgIGludDogbmVnYXRpdmUgaWYga2V5MTxrZXkyLCBwb3NpdGl2ZSBpZiBrZXkxPmtleTIsIGFuZCAwIGlmIGtleTE9PWtleTIKKyAqIFByZWNvbmRpdGlvbnM6CisgKiAgIGtleTEgYW5kIGtleTIgcG9pbnQgdG8gInZhbGlkIiAoc3RydWN0IGhmc19leHRfa2V5KXMuCisgKiBQb3N0Y29uZGl0aW9uczoKKyAqICAgVGhpcyBmdW5jdGlvbiBoYXMgbm8gc2lkZS1lZmZlY3RzICovCitpbnQgaGZzX2V4dF9rZXljbXAoY29uc3QgYnRyZWVfa2V5ICprZXkxLCBjb25zdCBidHJlZV9rZXkgKmtleTIpCit7CisJX19iZTMyIGZudW0xLCBmbnVtMjsKKwlfX2JlMTYgYmxvY2sxLCBibG9jazI7CisKKwlmbnVtMSA9IGtleTEtPmV4dC5GTnVtOworCWZudW0yID0ga2V5Mi0+ZXh0LkZOdW07CisJaWYgKGZudW0xICE9IGZudW0yKQorCQlyZXR1cm4gYmUzMl90b19jcHUoZm51bTEpIDwgYmUzMl90b19jcHUoZm51bTIpID8gLTEgOiAxOworCWlmIChrZXkxLT5leHQuRmtUeXBlICE9IGtleTItPmV4dC5Ga1R5cGUpCisJCXJldHVybiBrZXkxLT5leHQuRmtUeXBlIDwga2V5Mi0+ZXh0LkZrVHlwZSA/IC0xIDogMTsKKworCWJsb2NrMSA9IGtleTEtPmV4dC5GQUJOOworCWJsb2NrMiA9IGtleTItPmV4dC5GQUJOOworCWlmIChibG9jazEgPT0gYmxvY2syKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gYmUxNl90b19jcHUoYmxvY2sxKSA8IGJlMTZfdG9fY3B1KGJsb2NrMikgPyAtMSA6IDE7Cit9CisKKy8qCisgKiBoZnNfZXh0X2ZpbmRfYmxvY2sKKyAqCisgKiBGaW5kIGEgYmxvY2sgd2l0aGluIGFuIGV4dGVudCByZWNvcmQKKyAqLworc3RhdGljIHUxNiBoZnNfZXh0X2ZpbmRfYmxvY2soc3RydWN0IGhmc19leHRlbnQgKmV4dCwgdTE2IG9mZikKK3sKKwlpbnQgaTsKKwl1MTYgY291bnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgZXh0KyssIGkrKykgeworCQljb3VudCA9IGJlMTZfdG9fY3B1KGV4dC0+Y291bnQpOworCQlpZiAob2ZmIDwgY291bnQpCisJCQlyZXR1cm4gYmUxNl90b19jcHUoZXh0LT5ibG9jaykgKyBvZmY7CisJCW9mZiAtPSBjb3VudDsKKwl9CisJLyogcGFuaWM/ICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGZzX2V4dF9ibG9ja19jb3VudChzdHJ1Y3QgaGZzX2V4dGVudCAqZXh0KQoreworCWludCBpOworCXUxNiBjb3VudCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgZXh0KyssIGkrKykKKwkJY291bnQgKz0gYmUxNl90b19jcHUoZXh0LT5jb3VudCk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgdTE2IGhmc19leHRfbGFzdGJsb2NrKHN0cnVjdCBoZnNfZXh0ZW50ICpleHQpCit7CisJaW50IGk7CisKKwlleHQgKz0gMjsKKwlmb3IgKGkgPSAwOyBpIDwgMjsgZXh0LS0sIGkrKykKKwkJaWYgKGV4dC0+Y291bnQpCisJCQlicmVhazsKKwlyZXR1cm4gYmUxNl90b19jcHUoZXh0LT5ibG9jaykgKyBiZTE2X3RvX2NwdShleHQtPmNvdW50KTsKK30KKworc3RhdGljIHZvaWQgX19oZnNfZXh0X3dyaXRlX2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqZmQpCit7CisJaW50IHJlczsKKworCWhmc19leHRfYnVpbGRfa2V5KGZkLT5zZWFyY2hfa2V5LCBpbm9kZS0+aV9pbm8sIEhGU19JKGlub2RlKS0+Y2FjaGVkX3N0YXJ0LAorCQkJICBIRlNfSVNfUlNSQyhpbm9kZSkgPyAgSEZTX0ZLX1JTUkMgOiBIRlNfRktfREFUQSk7CisJcmVzID0gaGZzX2JyZWNfZmluZChmZCk7CisJaWYgKEhGU19JKGlub2RlKS0+ZmxhZ3MgJiBIRlNfRkxHX0VYVF9ORVcpIHsKKwkJaWYgKHJlcyAhPSAtRU5PRU5UKQorCQkJcmV0dXJuOworCQloZnNfYnJlY19pbnNlcnQoZmQsIEhGU19JKGlub2RlKS0+Y2FjaGVkX2V4dGVudHMsIHNpemVvZihoZnNfZXh0ZW50X3JlYykpOworCQlIRlNfSShpbm9kZSktPmZsYWdzICY9IH4oSEZTX0ZMR19FWFRfRElSVFl8SEZTX0ZMR19FWFRfTkVXKTsKKwl9IGVsc2UgeworCQlpZiAocmVzKQorCQkJcmV0dXJuOworCQloZnNfYm5vZGVfd3JpdGUoZmQtPmJub2RlLCBIRlNfSShpbm9kZSktPmNhY2hlZF9leHRlbnRzLCBmZC0+ZW50cnlvZmZzZXQsIGZkLT5lbnRyeWxlbmd0aCk7CisJCUhGU19JKGlub2RlKS0+ZmxhZ3MgJj0gfkhGU19GTEdfRVhUX0RJUlRZOworCX0KK30KKwordm9pZCBoZnNfZXh0X3dyaXRlX2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBoZnNfZmluZF9kYXRhIGZkOworCisJaWYgKEhGU19JKGlub2RlKS0+ZmxhZ3MgJiBIRlNfRkxHX0VYVF9ESVJUWSkgeworCQloZnNfZmluZF9pbml0KEhGU19TQihpbm9kZS0+aV9zYiktPmV4dF90cmVlLCAmZmQpOworCQlfX2hmc19leHRfd3JpdGVfZXh0ZW50KGlub2RlLCAmZmQpOworCQloZnNfZmluZF9leGl0KCZmZCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCBfX2hmc19leHRfcmVhZF9leHRlbnQoc3RydWN0IGhmc19maW5kX2RhdGEgKmZkLCBzdHJ1Y3QgaGZzX2V4dGVudCAqZXh0ZW50LAorCQkJCQl1MzIgY25pZCwgdTMyIGJsb2NrLCB1OCB0eXBlKQoreworCWludCByZXM7CisKKwloZnNfZXh0X2J1aWxkX2tleShmZC0+c2VhcmNoX2tleSwgY25pZCwgYmxvY2ssIHR5cGUpOworCWZkLT5rZXktPmV4dC5GTnVtID0gMDsKKwlyZXMgPSBoZnNfYnJlY19maW5kKGZkKTsKKwlpZiAocmVzICYmIHJlcyAhPSAtRU5PRU5UKQorCQlyZXR1cm4gcmVzOworCWlmIChmZC0+a2V5LT5leHQuRk51bSAhPSBmZC0+c2VhcmNoX2tleS0+ZXh0LkZOdW0gfHwKKwkgICAgZmQtPmtleS0+ZXh0LkZrVHlwZSAhPSBmZC0+c2VhcmNoX2tleS0+ZXh0LkZrVHlwZSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJaWYgKGZkLT5lbnRyeWxlbmd0aCAhPSBzaXplb2YoaGZzX2V4dGVudF9yZWMpKQorCQlyZXR1cm4gLUVJTzsKKwloZnNfYm5vZGVfcmVhZChmZC0+Ym5vZGUsIGV4dGVudCwgZmQtPmVudHJ5b2Zmc2V0LCBzaXplb2YoaGZzX2V4dGVudF9yZWMpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgX19oZnNfZXh0X2NhY2hlX2V4dGVudChzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqZmQsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHUzMiBibG9jaykKK3sKKwlpbnQgcmVzOworCisJaWYgKEhGU19JKGlub2RlKS0+ZmxhZ3MgJiBIRlNfRkxHX0VYVF9ESVJUWSkKKwkJX19oZnNfZXh0X3dyaXRlX2V4dGVudChpbm9kZSwgZmQpOworCisJcmVzID0gX19oZnNfZXh0X3JlYWRfZXh0ZW50KGZkLCBIRlNfSShpbm9kZSktPmNhY2hlZF9leHRlbnRzLCBpbm9kZS0+aV9pbm8sCisJCQkJICAgIGJsb2NrLCBIRlNfSVNfUlNSQyhpbm9kZSkgPyBIRlNfRktfUlNSQyA6IEhGU19GS19EQVRBKTsKKwlpZiAoIXJlcykgeworCQlIRlNfSShpbm9kZSktPmNhY2hlZF9zdGFydCA9IGJlMTZfdG9fY3B1KGZkLT5rZXktPmV4dC5GQUJOKTsKKwkJSEZTX0koaW5vZGUpLT5jYWNoZWRfYmxvY2tzID0gaGZzX2V4dF9ibG9ja19jb3VudChIRlNfSShpbm9kZSktPmNhY2hlZF9leHRlbnRzKTsKKwl9IGVsc2UgeworCQlIRlNfSShpbm9kZSktPmNhY2hlZF9zdGFydCA9IEhGU19JKGlub2RlKS0+Y2FjaGVkX2Jsb2NrcyA9IDA7CisJCUhGU19JKGlub2RlKS0+ZmxhZ3MgJj0gfihIRlNfRkxHX0VYVF9ESVJUWXxIRlNfRkxHX0VYVF9ORVcpOworCX0KKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IGhmc19leHRfcmVhZF9leHRlbnQoc3RydWN0IGlub2RlICppbm9kZSwgdTE2IGJsb2NrKQoreworCXN0cnVjdCBoZnNfZmluZF9kYXRhIGZkOworCWludCByZXM7CisKKwlpZiAoYmxvY2sgPj0gSEZTX0koaW5vZGUpLT5jYWNoZWRfc3RhcnQgJiYKKwkgICAgYmxvY2sgPCBIRlNfSShpbm9kZSktPmNhY2hlZF9zdGFydCArIEhGU19JKGlub2RlKS0+Y2FjaGVkX2Jsb2NrcykKKwkJcmV0dXJuIDA7CisKKwloZnNfZmluZF9pbml0KEhGU19TQihpbm9kZS0+aV9zYiktPmV4dF90cmVlLCAmZmQpOworCXJlcyA9IF9faGZzX2V4dF9jYWNoZV9leHRlbnQoJmZkLCBpbm9kZSwgYmxvY2spOworCWhmc19maW5kX2V4aXQoJmZkKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBoZnNfZHVtcF9leHRlbnQoc3RydWN0IGhmc19leHRlbnQgKmV4dGVudCkKK3sKKwlpbnQgaTsKKworCWRwcmludChEQkdfRVhURU5ULCAiICAgIik7CisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJZHByaW50KERCR19FWFRFTlQsICIgJXU6JXUiLCBiZTE2X3RvX2NwdShleHRlbnRbaV0uYmxvY2spLAorCQkJCSBiZTE2X3RvX2NwdShleHRlbnRbaV0uY291bnQpKTsKKwlkcHJpbnQoREJHX0VYVEVOVCwgIlxuIik7Cit9CisKK3N0YXRpYyBpbnQgaGZzX2FkZF9leHRlbnQoc3RydWN0IGhmc19leHRlbnQgKmV4dGVudCwgdTE2IG9mZnNldCwKKwkJCSAgdTE2IGFsbG9jX2Jsb2NrLCB1MTYgYmxvY2tfY291bnQpCit7CisJdTE2IGNvdW50LCBzdGFydDsKKwlpbnQgaTsKKworCWhmc19kdW1wX2V4dGVudChleHRlbnQpOworCWZvciAoaSA9IDA7IGkgPCAzOyBleHRlbnQrKywgaSsrKSB7CisJCWNvdW50ID0gYmUxNl90b19jcHUoZXh0ZW50LT5jb3VudCk7CisJCWlmIChvZmZzZXQgPT0gY291bnQpIHsKKwkJCXN0YXJ0ID0gYmUxNl90b19jcHUoZXh0ZW50LT5ibG9jayk7CisJCQlpZiAoYWxsb2NfYmxvY2sgIT0gc3RhcnQgKyBjb3VudCkgeworCQkJCWlmICgrK2kgPj0gMykKKwkJCQkJcmV0dXJuIC1FTk9TUEM7CisJCQkJZXh0ZW50Kys7CisJCQkJZXh0ZW50LT5ibG9jayA9IGNwdV90b19iZTE2KGFsbG9jX2Jsb2NrKTsKKwkJCX0gZWxzZQorCQkJCWJsb2NrX2NvdW50ICs9IGNvdW50OworCQkJZXh0ZW50LT5jb3VudCA9IGNwdV90b19iZTE2KGJsb2NrX2NvdW50KTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKG9mZnNldCA8IGNvdW50KQorCQkJYnJlYWs7CisJCW9mZnNldCAtPSBjb3VudDsKKwl9CisJLyogcGFuaWM/ICovCisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQgaGZzX2ZyZWVfZXh0ZW50cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgaGZzX2V4dGVudCAqZXh0ZW50LAorCQkJICAgIHUxNiBvZmZzZXQsIHUxNiBibG9ja19ucikKK3sKKwl1MTYgY291bnQsIHN0YXJ0OworCWludCBpOworCisJaGZzX2R1bXBfZXh0ZW50KGV4dGVudCk7CisJZm9yIChpID0gMDsgaSA8IDM7IGV4dGVudCsrLCBpKyspIHsKKwkJY291bnQgPSBiZTE2X3RvX2NwdShleHRlbnQtPmNvdW50KTsKKwkJaWYgKG9mZnNldCA9PSBjb3VudCkKKwkJCWdvdG8gZm91bmQ7CisJCWVsc2UgaWYgKG9mZnNldCA8IGNvdW50KQorCQkJYnJlYWs7CisJCW9mZnNldCAtPSBjb3VudDsKKwl9CisJLyogcGFuaWM/ICovCisJcmV0dXJuIC1FSU87Citmb3VuZDoKKwlmb3IgKDs7KSB7CisJCXN0YXJ0ID0gYmUxNl90b19jcHUoZXh0ZW50LT5ibG9jayk7CisJCWlmIChjb3VudCA8PSBibG9ja19ucikgeworCQkJaGZzX2NsZWFyX3ZibV9iaXRzKHNiLCBzdGFydCwgY291bnQpOworCQkJZXh0ZW50LT5ibG9jayA9IDA7CisJCQlleHRlbnQtPmNvdW50ID0gMDsKKwkJCWJsb2NrX25yIC09IGNvdW50OworCQl9IGVsc2UgeworCQkJY291bnQgLT0gYmxvY2tfbnI7CisJCQloZnNfY2xlYXJfdmJtX2JpdHMoc2IsIHN0YXJ0ICsgY291bnQsIGJsb2NrX25yKTsKKwkJCWV4dGVudC0+Y291bnQgPSBjcHVfdG9fYmUxNihjb3VudCk7CisJCQlibG9ja19uciA9IDA7CisJCX0KKwkJaWYgKCFibG9ja19uciB8fCAhaSkKKwkJCXJldHVybiAwOworCQlpLS07CisJCWV4dGVudC0tOworCQljb3VudCA9IGJlMTZfdG9fY3B1KGV4dGVudC0+Y291bnQpOworCX0KK30KKworaW50IGhmc19mcmVlX2Zvcmsoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGhmc19jYXRfZmlsZSAqZmlsZSwgaW50IHR5cGUpCit7CisJc3RydWN0IGhmc19maW5kX2RhdGEgZmQ7CisJdTMyIHRvdGFsX2Jsb2NrcywgYmxvY2tzLCBzdGFydDsKKwl1MzIgY25pZCA9IGJlMzJfdG9fY3B1KGZpbGUtPkZsTnVtKTsKKwlzdHJ1Y3QgaGZzX2V4dGVudCAqZXh0ZW50OworCWludCByZXMsIGk7CisKKwlpZiAodHlwZSA9PSBIRlNfRktfREFUQSkgeworCQl0b3RhbF9ibG9ja3MgPSBiZTMyX3RvX2NwdShmaWxlLT5QeUxlbik7CisJCWV4dGVudCA9IGZpbGUtPkV4dFJlYzsKKwl9IGVsc2UgeworCQl0b3RhbF9ibG9ja3MgPSBiZTMyX3RvX2NwdShmaWxlLT5SUHlMZW4pOworCQlleHRlbnQgPSBmaWxlLT5SRXh0UmVjOworCX0KKwl0b3RhbF9ibG9ja3MgLz0gSEZTX1NCKHNiKS0+YWxsb2NfYmxrc3o7CisJaWYgKCF0b3RhbF9ibG9ja3MpCisJCXJldHVybiAwOworCisJYmxvY2tzID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgZXh0ZW50KyssIGkrKykKKwkJYmxvY2tzICs9IGJlMTZfdG9fY3B1KGV4dGVudFtpXS5jb3VudCk7CisKKwlyZXMgPSBoZnNfZnJlZV9leHRlbnRzKHNiLCBleHRlbnQsIGJsb2NrcywgYmxvY2tzKTsKKwlpZiAocmVzKQorCQlyZXR1cm4gcmVzOworCWlmICh0b3RhbF9ibG9ja3MgPT0gYmxvY2tzKQorCQlyZXR1cm4gMDsKKworCWhmc19maW5kX2luaXQoSEZTX1NCKHNiKS0+ZXh0X3RyZWUsICZmZCk7CisJZG8geworCQlyZXMgPSBfX2hmc19leHRfcmVhZF9leHRlbnQoJmZkLCBleHRlbnQsIGNuaWQsIHRvdGFsX2Jsb2NrcywgdHlwZSk7CisJCWlmIChyZXMpCisJCQlicmVhazsKKwkJc3RhcnQgPSBiZTE2X3RvX2NwdShmZC5rZXktPmV4dC5GQUJOKTsKKwkJaGZzX2ZyZWVfZXh0ZW50cyhzYiwgZXh0ZW50LCB0b3RhbF9ibG9ja3MgLSBzdGFydCwgdG90YWxfYmxvY2tzKTsKKwkJaGZzX2JyZWNfcmVtb3ZlKCZmZCk7CisJCXRvdGFsX2Jsb2NrcyA9IHN0YXJ0OworCX0gd2hpbGUgKHRvdGFsX2Jsb2NrcyA+IGJsb2Nrcyk7CisJaGZzX2ZpbmRfZXhpdCgmZmQpOworCisJcmV0dXJuIHJlczsKK30KKworLyoKKyAqIGhmc19nZXRfYmxvY2sKKyAqLworaW50IGhmc19nZXRfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgYmxvY2ssCisJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwl1MTYgZGJsb2NrLCBhYmxvY2s7CisJaW50IHJlczsKKworCXNiID0gaW5vZGUtPmlfc2I7CisJLyogQ29udmVydCBpbm9kZSBibG9jayB0byBkaXNrIGFsbG9jYXRpb24gYmxvY2sgKi8KKwlhYmxvY2sgPSAodTMyKWJsb2NrIC8gSEZTX1NCKHNiKS0+ZnNfZGl2OworCisJaWYgKGJsb2NrID49IEhGU19JKGlub2RlKS0+ZnNfYmxvY2tzKSB7CisJCWlmIChibG9jayA+IEhGU19JKGlub2RlKS0+ZnNfYmxvY2tzIHx8ICFjcmVhdGUpCisJCQlyZXR1cm4gLUVJTzsKKwkJaWYgKGFibG9jayA+PSBIRlNfSShpbm9kZSktPmFsbG9jX2Jsb2NrcykgeworCQkJcmVzID0gaGZzX2V4dGVuZF9maWxlKGlub2RlKTsKKwkJCWlmIChyZXMpCisJCQkJcmV0dXJuIHJlczsKKwkJfQorCX0gZWxzZQorCQljcmVhdGUgPSAwOworCisJaWYgKGFibG9jayA8IEhGU19JKGlub2RlKS0+Zmlyc3RfYmxvY2tzKSB7CisJCWRibG9jayA9IGhmc19leHRfZmluZF9ibG9jayhIRlNfSShpbm9kZSktPmZpcnN0X2V4dGVudHMsIGFibG9jayk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlkb3duKCZIRlNfSShpbm9kZSktPmV4dGVudHNfbG9jayk7CisJcmVzID0gaGZzX2V4dF9yZWFkX2V4dGVudChpbm9kZSwgYWJsb2NrKTsKKwlpZiAoIXJlcykKKwkJZGJsb2NrID0gaGZzX2V4dF9maW5kX2Jsb2NrKEhGU19JKGlub2RlKS0+Y2FjaGVkX2V4dGVudHMsCisJCQkJCSAgICBhYmxvY2sgLSBIRlNfSShpbm9kZSktPmNhY2hlZF9zdGFydCk7CisJZWxzZSB7CisJCXVwKCZIRlNfSShpbm9kZSktPmV4dGVudHNfbG9jayk7CisJCXJldHVybiAtRUlPOworCX0KKwl1cCgmSEZTX0koaW5vZGUpLT5leHRlbnRzX2xvY2spOworCitkb25lOgorCW1hcF9iaChiaF9yZXN1bHQsIHNiLCBIRlNfU0Ioc2IpLT5mc19zdGFydCArCisJICAgICAgIGRibG9jayAqIEhGU19TQihzYiktPmZzX2RpdiArCisJICAgICAgICh1MzIpYmxvY2sgJSBIRlNfU0Ioc2IpLT5mc19kaXYpOworCisJaWYgKGNyZWF0ZSkgeworCQlzZXRfYnVmZmVyX25ldyhiaF9yZXN1bHQpOworCQlIRlNfSShpbm9kZSktPnBoeXNfc2l6ZSArPSBzYi0+c19ibG9ja3NpemU7CisJCUhGU19JKGlub2RlKS0+ZnNfYmxvY2tzKys7CisJCWlub2RlX2FkZF9ieXRlcyhpbm9kZSwgc2ItPnNfYmxvY2tzaXplKTsKKwkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJfQorCXJldHVybiAwOworfQorCitpbnQgaGZzX2V4dGVuZF9maWxlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXUzMiBzdGFydCwgbGVuLCBnb2FsOworCWludCByZXM7CisKKwlkb3duKCZIRlNfSShpbm9kZSktPmV4dGVudHNfbG9jayk7CisJaWYgKEhGU19JKGlub2RlKS0+YWxsb2NfYmxvY2tzID09IEhGU19JKGlub2RlKS0+Zmlyc3RfYmxvY2tzKQorCQlnb2FsID0gaGZzX2V4dF9sYXN0YmxvY2soSEZTX0koaW5vZGUpLT5maXJzdF9leHRlbnRzKTsKKwllbHNlIHsKKwkJcmVzID0gaGZzX2V4dF9yZWFkX2V4dGVudChpbm9kZSwgSEZTX0koaW5vZGUpLT5hbGxvY19ibG9ja3MpOworCQlpZiAocmVzKQorCQkJZ290byBvdXQ7CisJCWdvYWwgPSBoZnNfZXh0X2xhc3RibG9jayhIRlNfSShpbm9kZSktPmNhY2hlZF9leHRlbnRzKTsKKwl9CisKKwlsZW4gPSBIRlNfSShpbm9kZSktPmNsdW1wX2Jsb2NrczsKKwlzdGFydCA9IGhmc192Ym1fc2VhcmNoX2ZyZWUoc2IsIGdvYWwsICZsZW4pOworCWlmICghbGVuKSB7CisJCXJlcyA9IC1FTk9TUEM7CisJCWdvdG8gb3V0OworCX0KKworCWRwcmludChEQkdfRVhURU5ULCAiZXh0ZW5kICVsdTogJXUsJXVcbiIsIGlub2RlLT5pX2lubywgc3RhcnQsIGxlbik7CisJaWYgKEhGU19JKGlub2RlKS0+YWxsb2NfYmxvY2tzID09IEhGU19JKGlub2RlKS0+Zmlyc3RfYmxvY2tzKSB7CisJCWlmICghSEZTX0koaW5vZGUpLT5maXJzdF9ibG9ja3MpIHsKKwkJCWRwcmludChEQkdfRVhURU5ULCAiZmlyc3QgZXh0ZW50c1xuIik7CisJCQkvKiBubyBleHRlbnRzIHlldCAqLworCQkJSEZTX0koaW5vZGUpLT5maXJzdF9leHRlbnRzWzBdLmJsb2NrID0gY3B1X3RvX2JlMTYoc3RhcnQpOworCQkJSEZTX0koaW5vZGUpLT5maXJzdF9leHRlbnRzWzBdLmNvdW50ID0gY3B1X3RvX2JlMTYobGVuKTsKKwkJCXJlcyA9IDA7CisJCX0gZWxzZSB7CisJCQkvKiB0cnkgdG8gYXBwZW5kIHRvIGV4dGVudHMgaW4gaW5vZGUgKi8KKwkJCXJlcyA9IGhmc19hZGRfZXh0ZW50KEhGU19JKGlub2RlKS0+Zmlyc3RfZXh0ZW50cywKKwkJCQkJICAgICBIRlNfSShpbm9kZSktPmFsbG9jX2Jsb2NrcywKKwkJCQkJICAgICBzdGFydCwgbGVuKTsKKwkJCWlmIChyZXMgPT0gLUVOT1NQQykKKwkJCQlnb3RvIGluc2VydF9leHRlbnQ7CisJCX0KKwkJaWYgKCFyZXMpIHsKKwkJCWhmc19kdW1wX2V4dGVudChIRlNfSShpbm9kZSktPmZpcnN0X2V4dGVudHMpOworCQkJSEZTX0koaW5vZGUpLT5maXJzdF9ibG9ja3MgKz0gbGVuOworCQl9CisJfSBlbHNlIHsKKwkJcmVzID0gaGZzX2FkZF9leHRlbnQoSEZTX0koaW5vZGUpLT5jYWNoZWRfZXh0ZW50cywKKwkJCQkgICAgIEhGU19JKGlub2RlKS0+YWxsb2NfYmxvY2tzIC0KKwkJCQkgICAgIEhGU19JKGlub2RlKS0+Y2FjaGVkX3N0YXJ0LAorCQkJCSAgICAgc3RhcnQsIGxlbik7CisJCWlmICghcmVzKSB7CisJCQloZnNfZHVtcF9leHRlbnQoSEZTX0koaW5vZGUpLT5jYWNoZWRfZXh0ZW50cyk7CisJCQlIRlNfSShpbm9kZSktPmZsYWdzIHw9IEhGU19GTEdfRVhUX0RJUlRZOworCQkJSEZTX0koaW5vZGUpLT5jYWNoZWRfYmxvY2tzICs9IGxlbjsKKwkJfSBlbHNlIGlmIChyZXMgPT0gLUVOT1NQQykKKwkJCWdvdG8gaW5zZXJ0X2V4dGVudDsKKwl9CitvdXQ6CisJdXAoJkhGU19JKGlub2RlKS0+ZXh0ZW50c19sb2NrKTsKKwlpZiAoIXJlcykgeworCQlIRlNfSShpbm9kZSktPmFsbG9jX2Jsb2NrcyArPSBsZW47CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQlpZiAoaW5vZGUtPmlfaW5vIDwgSEZTX0ZJUlNUVVNFUl9DTklEKQorCQkJc2V0X2JpdChIRlNfRkxHX0FMVF9NREJfRElSVFksICZIRlNfU0Ioc2IpLT5mbGFncyk7CisJCXNldF9iaXQoSEZTX0ZMR19NREJfRElSVFksICZIRlNfU0Ioc2IpLT5mbGFncyk7CisJCXNiLT5zX2RpcnQgPSAxOworCX0KKwlyZXR1cm4gcmVzOworCitpbnNlcnRfZXh0ZW50OgorCWRwcmludChEQkdfRVhURU5ULCAiaW5zZXJ0IG5ldyBleHRlbnRcbiIpOworCWhmc19leHRfd3JpdGVfZXh0ZW50KGlub2RlKTsKKworCW1lbXNldChIRlNfSShpbm9kZSktPmNhY2hlZF9leHRlbnRzLCAwLCBzaXplb2YoaGZzX2V4dGVudF9yZWMpKTsKKwlIRlNfSShpbm9kZSktPmNhY2hlZF9leHRlbnRzWzBdLmJsb2NrID0gY3B1X3RvX2JlMTYoc3RhcnQpOworCUhGU19JKGlub2RlKS0+Y2FjaGVkX2V4dGVudHNbMF0uY291bnQgPSBjcHVfdG9fYmUxNihsZW4pOworCWhmc19kdW1wX2V4dGVudChIRlNfSShpbm9kZSktPmNhY2hlZF9leHRlbnRzKTsKKwlIRlNfSShpbm9kZSktPmZsYWdzIHw9IEhGU19GTEdfRVhUX0RJUlRZfEhGU19GTEdfRVhUX05FVzsKKwlIRlNfSShpbm9kZSktPmNhY2hlZF9zdGFydCA9IEhGU19JKGlub2RlKS0+YWxsb2NfYmxvY2tzOworCUhGU19JKGlub2RlKS0+Y2FjaGVkX2Jsb2NrcyA9IGxlbjsKKworCXJlcyA9IDA7CisJZ290byBvdXQ7Cit9CisKK3ZvaWQgaGZzX2ZpbGVfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGhmc19maW5kX2RhdGEgZmQ7CisJdTE2IGJsa19jbnQsIGFsbG9jX2NudCwgc3RhcnQ7CisJdTMyIHNpemU7CisJaW50IHJlczsKKworCWRwcmludChEQkdfSU5PREUsICJ0cnVuY2F0ZTogJWx1LCAlTHUgLT4gJUx1XG4iLCBpbm9kZS0+aV9pbm8sCisJICAgICAgIChsb25nIGxvbmcpSEZTX0koaW5vZGUpLT5waHlzX3NpemUsIGlub2RlLT5pX3NpemUpOworCWlmIChpbm9kZS0+aV9zaXplID4gSEZTX0koaW5vZGUpLT5waHlzX3NpemUpIHsKKwkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwkJaW50IHJlczsKKworCQlzaXplID0gaW5vZGUtPmlfc2l6ZSAtIDE7CisJCXBhZ2UgPSBncmFiX2NhY2hlX3BhZ2UobWFwcGluZywgc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwkJaWYgKCFwYWdlKQorCQkJcmV0dXJuOworCQlzaXplICY9IFBBR0VfQ0FDSEVfU0laRSAtIDE7CisJCXNpemUrKzsKKwkJcmVzID0gbWFwcGluZy0+YV9vcHMtPnByZXBhcmVfd3JpdGUoTlVMTCwgcGFnZSwgc2l6ZSwgc2l6ZSk7CisJCWlmICghcmVzKQorCQkJcmVzID0gbWFwcGluZy0+YV9vcHMtPmNvbW1pdF93cml0ZShOVUxMLCBwYWdlLCBzaXplLCBzaXplKTsKKwkJaWYgKHJlcykKKwkJCWlub2RlLT5pX3NpemUgPSBIRlNfSShpbm9kZSktPnBoeXNfc2l6ZTsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCXJldHVybjsKKwl9CisJc2l6ZSA9IGlub2RlLT5pX3NpemUgKyBIRlNfU0Ioc2IpLT5hbGxvY19ibGtzeiAtIDE7CisJYmxrX2NudCA9IHNpemUgLyBIRlNfU0Ioc2IpLT5hbGxvY19ibGtzejsKKwlhbGxvY19jbnQgPSBIRlNfSShpbm9kZSktPmFsbG9jX2Jsb2NrczsKKwlpZiAoYmxrX2NudCA9PSBhbGxvY19jbnQpCisJCWdvdG8gb3V0OworCisJZG93bigmSEZTX0koaW5vZGUpLT5leHRlbnRzX2xvY2spOworCWhmc19maW5kX2luaXQoSEZTX1NCKHNiKS0+ZXh0X3RyZWUsICZmZCk7CisJd2hpbGUgKDEpIHsKKwkJaWYgKGFsbG9jX2NudCA9PSBIRlNfSShpbm9kZSktPmZpcnN0X2Jsb2NrcykgeworCQkJaGZzX2ZyZWVfZXh0ZW50cyhzYiwgSEZTX0koaW5vZGUpLT5maXJzdF9leHRlbnRzLAorCQkJCQkgYWxsb2NfY250LCBhbGxvY19jbnQgLSBibGtfY250KTsKKwkJCWhmc19kdW1wX2V4dGVudChIRlNfSShpbm9kZSktPmZpcnN0X2V4dGVudHMpOworCQkJSEZTX0koaW5vZGUpLT5maXJzdF9ibG9ja3MgPSBibGtfY250OworCQkJYnJlYWs7CisJCX0KKwkJcmVzID0gX19oZnNfZXh0X2NhY2hlX2V4dGVudCgmZmQsIGlub2RlLCBhbGxvY19jbnQpOworCQlpZiAocmVzKQorCQkJYnJlYWs7CisJCXN0YXJ0ID0gSEZTX0koaW5vZGUpLT5jYWNoZWRfc3RhcnQ7CisJCWhmc19mcmVlX2V4dGVudHMoc2IsIEhGU19JKGlub2RlKS0+Y2FjaGVkX2V4dGVudHMsCisJCQkJIGFsbG9jX2NudCAtIHN0YXJ0LCBhbGxvY19jbnQgLSBibGtfY250KTsKKwkJaGZzX2R1bXBfZXh0ZW50KEhGU19JKGlub2RlKS0+Y2FjaGVkX2V4dGVudHMpOworCQlpZiAoYmxrX2NudCA+IHN0YXJ0KSB7CisJCQlIRlNfSShpbm9kZSktPmZsYWdzIHw9IEhGU19GTEdfRVhUX0RJUlRZOworCQkJYnJlYWs7CisJCX0KKwkJYWxsb2NfY250ID0gc3RhcnQ7CisJCUhGU19JKGlub2RlKS0+Y2FjaGVkX3N0YXJ0ID0gSEZTX0koaW5vZGUpLT5jYWNoZWRfYmxvY2tzID0gMDsKKwkJSEZTX0koaW5vZGUpLT5mbGFncyAmPSB+KEhGU19GTEdfRVhUX0RJUlRZfEhGU19GTEdfRVhUX05FVyk7CisJCWhmc19icmVjX3JlbW92ZSgmZmQpOworCX0KKwloZnNfZmluZF9leGl0KCZmZCk7CisJdXAoJkhGU19JKGlub2RlKS0+ZXh0ZW50c19sb2NrKTsKKworCUhGU19JKGlub2RlKS0+YWxsb2NfYmxvY2tzID0gYmxrX2NudDsKK291dDoKKwlIRlNfSShpbm9kZSktPnBoeXNfc2l6ZSA9IGlub2RlLT5pX3NpemU7CisJSEZTX0koaW5vZGUpLT5mc19ibG9ja3MgPSAoaW5vZGUtPmlfc2l6ZSArIHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCWlub2RlX3NldF9ieXRlcyhpbm9kZSwgSEZTX0koaW5vZGUpLT5mc19ibG9ja3MgPDwgc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworfQpkaWZmIC0tZ2l0IGEvZnMvaGZzL2hmcy5oIGIvZnMvaGZzL2hmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNmIzM2EKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9oZnMvaGZzLmgKQEAgLTAsMCArMSwyODcgQEAKKy8qCisgKiAgbGludXgvZnMvaGZzL2hmcy5oCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcgIFBhdWwgSC4gSGFyZ3JvdmUKKyAqIChDKSAyMDAzIEFyZGlzIFRlY2hub2xvZ2llcyA8cm9tYW5AYXJkaXN0ZWNoLmNvbT4KKyAqIFRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9IRlNfSAorI2RlZmluZSBfSEZTX0gKKworLyogb2Zmc2V0cyB0byB2YXJpb3VzIGJsb2NrcyAqLworI2RlZmluZSBIRlNfRERfQkxLCQkwIC8qIERyaXZlciBEZXNjcmlwdG9yIGJsb2NrICovCisjZGVmaW5lIEhGU19QTUFQX0JMSwkJMSAvKiBGaXJzdCBibG9jayBvZiBwYXJ0aXRpb24gbWFwICovCisjZGVmaW5lIEhGU19NREJfQkxLCQkyIC8qIEJsb2NrICh3L2kgcGFydGl0aW9uKSBvZiBNREIgKi8KKworLyogbWFnaWMgbnVtYmVycyBmb3IgdmFyaW91cyBkaXNrIGJsb2NrcyAqLworI2RlZmluZSBIRlNfRFJWUl9ERVNDX01BR0lDCTB4NDU1MiAvKiAiRVIiOiBkcml2ZXIgZGVzY3JpcHRvciBtYXAgKi8KKyNkZWZpbmUgSEZTX09MRF9QTUFQX01BR0lDCTB4NTQ1MyAvKiAiVFMiOiBvbGQtdHlwZSBwYXJ0aXRpb24gbWFwICovCisjZGVmaW5lIEhGU19ORVdfUE1BUF9NQUdJQwkweDUwNEQgLyogIlBNIjogbmV3LXR5cGUgcGFydGl0aW9uIG1hcCAqLworI2RlZmluZSBIRlNfU1VQRVJfTUFHSUMJCTB4NDI0NCAvKiAiQkQiOiBIRlMgTURCIChzdXBlciBibG9jaykgKi8KKyNkZWZpbmUgSEZTX01GU19TVVBFUl9NQUdJQwkweEQyRDcgLyogTUZTIE1EQiAoc3VwZXIgYmxvY2spICovCisKKy8qIHZhcmlvdXMgRklYRUQgc2l6ZSBwYXJhbWV0ZXJzICovCisjZGVmaW5lIEhGU19TRUNUT1JfU0laRQkJNTEyICAgIC8qIHNpemUgb2YgYW4gSEZTIHNlY3RvciAqLworI2RlZmluZSBIRlNfU0VDVE9SX1NJWkVfQklUUwk5ICAgICAgLyogbG9nXzIoSEZTX1NFQ1RPUl9TSVpFKSAqLworI2RlZmluZSBIRlNfTkFNRUxFTgkJMzEgICAgIC8qIG1heGltdW0gbGVuZ3RoIG9mIGFuIEhGUyBmaWxlbmFtZSAqLworI2RlZmluZSBIRlNfTUFYX1ZBTEVOQ0UJCTMyNzY3VQorCisvKiBNZWFuaW5ncyBvZiB0aGUgZHJBdHJiIGZpZWxkIG9mIHRoZSBNREIsCisgKiBSZWZlcmVuY2U6IF9JbnNpZGUgTWFjaW50b3NoOiBGaWxlc18gcC4gMi02MQorICovCisjZGVmaW5lIEhGU19TQl9BVFRSSUJfSExPQ0sJKDEgPDwgNykKKyNkZWZpbmUgSEZTX1NCX0FUVFJJQl9VTk1OVAkoMSA8PCA4KQorI2RlZmluZSBIRlNfU0JfQVRUUklCX1NQQVJFRAkoMSA8PCA5KQorI2RlZmluZSBIRlNfU0JfQVRUUklCX0lOQ05TVE5UCSgxIDw8IDExKQorI2RlZmluZSBIRlNfU0JfQVRUUklCX1NMT0NLCSgxIDw8IDE1KQorCisvKiBTb21lIHNwZWNpYWwgRmlsZSBJRCBudW1iZXJzICovCisjZGVmaW5lIEhGU19QT1JfQ05JRAkJMQkvKiBQYXJlbnQgT2YgdGhlIFJvb3QgKi8KKyNkZWZpbmUgSEZTX1JPT1RfQ05JRAkJMgkvKiBST09UIGRpcmVjdG9yeSAqLworI2RlZmluZSBIRlNfRVhUX0NOSUQJCTMJLyogRVhUZW50cyBCLXRyZWUgKi8KKyNkZWZpbmUgSEZTX0NBVF9DTklECQk0CS8qIENBVGFsb2cgQi10cmVlICovCisjZGVmaW5lIEhGU19CQURfQ05JRAkJNQkvKiBCQUQgYmxvY2tzIGZpbGUgKi8KKyNkZWZpbmUgSEZTX0FMTE9DX0NOSUQJCTYJLyogQUxMT0NhdGlvbiBmaWxlIChIRlMrKSAqLworI2RlZmluZSBIRlNfU1RBUlRfQ05JRAkJNwkvKiBTVEFSVHVwIGZpbGUgKEhGUyspICovCisjZGVmaW5lIEhGU19BVFRSX0NOSUQJCTgJLyogQVRUUmlidXRlcyBmaWxlIChIRlMrKSAqLworI2RlZmluZSBIRlNfRVhDSF9DTklECQkxNQkvKiBFeGNoYW5nZUZpbGVzIHRlbXAgaWQgKi8KKyNkZWZpbmUgSEZTX0ZJUlNUVVNFUl9DTklECTE2CisKKy8qIHZhbHVlcyBmb3IgaGZzX2NhdF9yZWMuY2RyVHlwZSAqLworI2RlZmluZSBIRlNfQ0RSX0RJUiAgICAweDAxICAgIC8qIGZvbGRlciAoZGlyZWN0b3J5KSAqLworI2RlZmluZSBIRlNfQ0RSX0ZJTCAgICAweDAyICAgIC8qIGZpbGUgKi8KKyNkZWZpbmUgSEZTX0NEUl9USEQgICAgMHgwMyAgICAvKiBmb2xkZXIgKGRpcmVjdG9yeSkgdGhyZWFkICovCisjZGVmaW5lIEhGU19DRFJfRlRIICAgIDB4MDQgICAgLyogZmlsZSB0aHJlYWQgKi8KKworLyogbGVnYWwgdmFsdWVzIGZvciBoZnNfZXh0X2tleS5Ga1R5cGUgYW5kIGhmc19maWxlLmZvcmsgKi8KKyNkZWZpbmUgSEZTX0ZLX0RBVEEJMHgwMAorI2RlZmluZSBIRlNfRktfUlNSQwkweEZGCisKKy8qIGJpdHMgaW4gaGZzX2ZpbF9lbnRyeS5GbGFncyAqLworI2RlZmluZSBIRlNfRklMX0xPQ0sJMHgwMSAgLyogbG9ja2VkICovCisjZGVmaW5lIEhGU19GSUxfVEhECTB4MDIgIC8qIGZpbGUgdGhyZWFkICovCisjZGVmaW5lIEhGU19GSUxfRE9QRU4gICAweDA0ICAvKiBkYXRhIGZvcmsgb3BlbiAqLworI2RlZmluZSBIRlNfRklMX1JPUEVOICAgMHgwOCAgLyogcmVzb3VyY2UgZm9yayBvcGVuICovCisjZGVmaW5lIEhGU19GSUxfRElSICAgICAweDEwICAvKiBkaXJlY3RvcnkgKGFsd2F5cyBjbGVhcikgKi8KKyNkZWZpbmUgSEZTX0ZJTF9OT0NPUFkgIDB4NDAgIC8qIGNvcHktcHJvdGVjdGVkIGZpbGUgKi8KKyNkZWZpbmUgSEZTX0ZJTF9VU0VECTB4ODAgIC8qIG9wZW4gKi8KKworLyogYml0cyBpbiBoZnNfZGlyX2VudHJ5LkZsYWdzLiBkaXJmbGFncyBpcyAxNiBiaXRzLiAqLworI2RlZmluZSBIRlNfRElSX0xPQ0sgICAgICAgIDB4MDEgIC8qIGxvY2tlZCAqLworI2RlZmluZSBIRlNfRElSX1RIRCAgICAgICAgIDB4MDIgIC8qIGRpcmVjdG9yeSB0aHJlYWQgKi8KKyNkZWZpbmUgSEZTX0RJUl9JTkVYUEZPTERFUiAweDA0ICAvKiBpbiBhIHNoYXJlZCBhcmVhICovCisjZGVmaW5lIEhGU19ESVJfTU9VTlRFRCAgICAgMHgwOCAgLyogbW91bnRlZCAqLworI2RlZmluZSBIRlNfRElSX0RJUiAgICAgICAgIDB4MTAgIC8qIGRpcmVjdG9yeSAoYWx3YXlzIHNldCkgKi8KKyNkZWZpbmUgSEZTX0RJUl9FWFBGT0xERVIgICAweDIwICAvKiBzaGFyZSBwb2ludCAqLworCisvKiBiaXRzIGhmc19maW5mby5mZEZsYWdzICovCisjZGVmaW5lIEhGU19GTEdfSU5JVEVECQkweDAxMDAKKyNkZWZpbmUgSEZTX0ZMR19MT0NLRUQJCTB4MTAwMAorI2RlZmluZSBIRlNfRkxHX0lOVklTSUJMRQkweDQwMDAKKworLyo9PT09PT09PSBIRlMgc3RydWN0dXJlcyBhcyB0aGV5IGFwcGVhciBvbiB0aGUgZGlzayA9PT09PT09PSovCisKKyNkZWZpbmUgX19wYWNrZWQgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpCisKKy8qIFBhc2NhbC1zdHlsZSBzdHJpbmcgb2YgdXAgdG8gMzEgY2hhcmFjdGVycyAqLworc3RydWN0IGhmc19uYW1lIHsKKwl1OCBsZW47CisJdTggbmFtZVtIRlNfTkFNRUxFTl07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaGZzX3BvaW50IHsKKwlfX2JlMTYgdjsKKwlfX2JlMTYgaDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBoZnNfcmVjdCB7CisJX19iZTE2IHRvcDsKKwlfX2JlMTYgbGVmdDsKKwlfX2JlMTYgYm90dG9tOworCV9fYmUxNiByaWdodDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBoZnNfZmluZm8geworCV9fYmUzMiBmZFR5cGU7CisJX19iZTMyIGZkQ3JlYXRvcjsKKwlfX2JlMTYgZmRGbGFnczsKKwlzdHJ1Y3QgaGZzX3BvaW50IGZkTG9jYXRpb247CisJX19iZTE2IGZkRmxkcjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBoZnNfZnhpbmZvIHsKKwlfX2JlMTYgZmRJY29uSUQ7CisJdTggZmRVbnVzZWRbOF07CisJX19iZTE2IGZkQ29tbWVudDsKKwlfX2JlMzIgZmRQdXRBd2F5OworfSBfX3BhY2tlZDsKKworc3RydWN0IGhmc19kaW5mbyB7CisJc3RydWN0IGhmc19yZWN0IGZyUmVjdDsKKwlfX2JlMTYgZnJGbGFnczsKKwlzdHJ1Y3QgaGZzX3BvaW50IGZyTG9jYXRpb247CisJX19iZTE2IGZyVmlldzsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBoZnNfZHhpbmZvIHsKKwlzdHJ1Y3QgaGZzX3BvaW50IGZyU2Nyb2xsOworCV9fYmUzMiBmck9wZW5DaGFpbjsKKwlfX2JlMTYgZnJVbnVzZWQ7CisJX19iZTE2IGZyQ29tbWVudDsKKwlfX2JlMzIgZnJQdXRBd2F5OworfSBfX3BhY2tlZDsKKwordW5pb24gaGZzX2ZpbmRlcl9pbmZvIHsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgaGZzX2ZpbmZvIGZpbmZvOworCQlzdHJ1Y3QgaGZzX2Z4aW5mbyBmeGluZm87CisJfSBmaWxlOworCXN0cnVjdCB7CisJCXN0cnVjdCBoZnNfZGluZm8gZGluZm87CisJCXN0cnVjdCBoZnNfZHhpbmZvIGR4aW5mbzsKKwl9IGRpcjsKK30gX19wYWNrZWQ7CisKKy8qIENhc3QgdG8gYSBwb2ludGVyIHRvIGEgZ2VuZXJpYyBia2V5ICovCisjZGVmaW5lCUhGU19CS0VZKFgpCSgoKHZvaWQpKChYKS0+S2V5TGVuKSksICgoc3RydWN0IGhmc19ia2V5ICopKFgpKSkKKworLyogVGhlIGtleSB1c2VkIGluIHRoZSBjYXRhbG9nIGItdHJlZTogKi8KK3N0cnVjdCBoZnNfY2F0X2tleSB7CisJdTgga2V5X2xlbjsJCS8qIG51bWJlciBvZiBieXRlcyBpbiB0aGUga2V5ICovCisJdTggcmVzZXJ2ZWQ7CQkvKiBwYWRkaW5nICovCisJX19iZTMyIFBhcklEOwkJLyogQ05JRCBvZiB0aGUgcGFyZW50IGRpciAqLworCXN0cnVjdCBoZnNfbmFtZQlDTmFtZTsJLyogVGhlIGZpbGVuYW1lIG9mIHRoZSBlbnRyeSAqLworfSBfX3BhY2tlZDsKKworLyogVGhlIGtleSB1c2VkIGluIHRoZSBleHRlbnRzIGItdHJlZTogKi8KK3N0cnVjdCBoZnNfZXh0X2tleSB7CisJdTgga2V5X2xlbjsJCS8qIG51bWJlciBvZiBieXRlcyBpbiB0aGUga2V5ICovCisJdTggRmtUeXBlOwkJLyogSEZTX0ZLX3tEQVRBLFJTUkN9ICovCisJX19iZTMyIEZOdW07CQkvKiBUaGUgRmlsZSBJRCBvZiB0aGUgZmlsZSAqLworCV9fYmUxNiBGQUJOOwkJLyogYWxsb2NhdGlvbiBibG9ja3MgbnVtYmVyKi8KK30gX19wYWNrZWQ7CisKK3R5cGVkZWYgdW5pb24gaGZzX2J0cmVlX2tleSB7CisJdTgga2V5X2xlbjsJCQkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGtleSAqLworCXN0cnVjdCBoZnNfY2F0X2tleSBjYXQ7CisJc3RydWN0IGhmc19leHRfa2V5IGV4dDsKK30gaGZzX2J0cmVlX2tleTsKKwordHlwZWRlZiB1bmlvbiBoZnNfYnRyZWVfa2V5IGJ0cmVlX2tleTsKKworc3RydWN0IGhmc19leHRlbnQgeworCV9fYmUxNiBibG9jazsKKwlfX2JlMTYgY291bnQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgaGZzX2V4dGVudCBoZnNfZXh0ZW50X3JlY1szXTsKKworLyogVGhlIGNhdGFsb2cgcmVjb3JkIGZvciBhIGZpbGUgKi8KK3N0cnVjdCBoZnNfY2F0X2ZpbGUgeworCXM4IHR5cGU7CQkJLyogVGhlIHR5cGUgb2YgZW50cnkgKi8KKwl1OCByZXNlcnZlZDsKKwl1OCBGbGFnczsJCQkvKiBGbGFncyBzdWNoIGFzIHJlYWQtb25seSAqLworCXM4IFR5cDsJCQkJLyogZmlsZSB2ZXJzaW9uIG51bWJlciA9IDAgKi8KKwlzdHJ1Y3QgaGZzX2ZpbmZvIFVzcldkczsJLyogZGF0YSB1c2VkIGJ5IHRoZSBGaW5kZXIgKi8KKwlfX2JlMzIgRmxOdW07CQkJLyogVGhlIENOSUQgKi8KKwlfX2JlMTYgU3RCbGs7CQkJLyogb2Jzb2xldGUgKi8KKwlfX2JlMzIgTGdMZW47CQkJLyogVGhlIGxvZ2ljYWwgRU9GIG9mIHRoZSBkYXRhIGZvcmsqLworCV9fYmUzMiBQeUxlbjsJCQkvKiBUaGUgcGh5c2ljYWwgRU9GIG9mIHRoZSBkYXRhIGZvcmsgKi8KKwlfX2JlMTYgUlN0QmxrOwkJCS8qIG9ic29sZXRlICovCisJX19iZTMyIFJMZ0xlbjsJCQkvKiBUaGUgbG9naWNhbCBFT0Ygb2YgdGhlIHJzcmMgZm9yayAqLworCV9fYmUzMiBSUHlMZW47CQkJLyogVGhlIHBoeXNpY2FsIEVPRiBvZiB0aGUgcnNyYyBmb3JrICovCisJX19iZTMyIENyRGF0OwkJCS8qIFRoZSBjcmVhdGlvbiBkYXRlICovCisJX19iZTMyIE1kRGF0OwkJCS8qIFRoZSBtb2RpZmllZCBkYXRlICovCisJX19iZTMyIEJrRGF0OwkJCS8qIFRoZSBsYXN0IGJhY2t1cCBkYXRlICovCisJc3RydWN0IGhmc19meGluZm8gRm5kckluZm87CS8qIG1vcmUgZGF0YSBmb3IgdGhlIEZpbmRlciAqLworCV9fYmUxNiBDbHBTaXplOwkJCS8qIG51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZQorCQkJCQkgICB3aGVuIGV4dGVuZGluZyBmaWxlcyAqLworCWhmc19leHRlbnRfcmVjIEV4dFJlYzsJCS8qIGZpcnN0IGV4dGVudCByZWNvcmQKKwkJCQkJICAgZm9yIHRoZSBkYXRhIGZvcmsgKi8KKwloZnNfZXh0ZW50X3JlYyBSRXh0UmVjOwkJLyogZmlyc3QgZXh0ZW50IHJlY29yZAorCQkJCQkgICBmb3IgdGhlIHJlc291cmNlIGZvcmsgKi8KKwl1MzIgUmVzcnY7CQkJLyogcmVzZXJ2ZWQgYnkgQXBwbGUgKi8KK30gX19wYWNrZWQ7CisKKy8qIHRoZSBjYXRhbG9nIHJlY29yZCBmb3IgYSBkaXJlY3RvcnkgKi8KK3N0cnVjdCBoZnNfY2F0X2RpciB7CisJczggdHlwZTsJCQkvKiBUaGUgdHlwZSBvZiBlbnRyeSAqLworCXU4IHJlc2VydmVkOworCV9fYmUxNiBGbGFnczsJCQkvKiBmbGFncyAqLworCV9fYmUxNiBWYWw7CQkJLyogVmFsZW5jZTogbnVtYmVyIG9mIGZpbGVzIGFuZAorCQkJCQkgICBkaXJzIGluIHRoZSBkaXJlY3RvcnkgKi8KKwlfX2JlMzIgRGlySUQ7CQkJLyogVGhlIENOSUQgKi8KKwlfX2JlMzIgQ3JEYXQ7CQkJLyogVGhlIGNyZWF0aW9uIGRhdGUgKi8KKwlfX2JlMzIgTWREYXQ7CQkJLyogVGhlIG1vZGlmaWNhdGlvbiBkYXRlICovCisJX19iZTMyIEJrRGF0OwkJCS8qIFRoZSBsYXN0IGJhY2t1cCBkYXRlICovCisJc3RydWN0IGhmc19kaW5mbyBVc3JJbmZvOwkvKiBkYXRhIHVzZWQgYnkgdGhlIEZpbmRlciAqLworCXN0cnVjdCBoZnNfZHhpbmZvIEZuZHJJbmZvOwkvKiBtb3JlIGRhdGEgdXNlZCBieSBGaW5kZXIgKi8KKwl1OCBSZXNydlsxNl07CQkJLyogcmVzZXJ2ZWQgYnkgQXBwbGUgKi8KK30gX19wYWNrZWQ7CisKKy8qIHRoZSBjYXRhbG9nIHJlY29yZCBmb3IgYSB0aHJlYWQgKi8KK3N0cnVjdCBoZnNfY2F0X3RocmVhZCB7CisJczggdHlwZTsJCQkvKiBUaGUgdHlwZSBvZiBlbnRyeSAqLworCXU4IHJlc2VydmVkWzldOwkJCS8qIHJlc2VydmVkIGJ5IEFwcGxlICovCisJX19iZTMyIFBhcklEOwkJCS8qIENOSUQgb2YgcGFyZW50IGRpcmVjdG9yeSAqLworCXN0cnVjdCBoZnNfbmFtZSBDTmFtZTsJCS8qIFRoZSBuYW1lIG9mIHRoaXMgZW50cnkgKi8KK30gIF9fcGFja2VkOworCisvKiBBIGNhdGFsb2cgdHJlZSByZWNvcmQgKi8KK3R5cGVkZWYgdW5pb24gaGZzX2NhdF9yZWMgeworCXM4IHR5cGU7CQkJLyogVGhlIHR5cGUgb2YgZW50cnkgKi8KKwlzdHJ1Y3QgaGZzX2NhdF9maWxlIGZpbGU7CisJc3RydWN0IGhmc19jYXRfZGlyIGRpcjsKKwlzdHJ1Y3QgaGZzX2NhdF90aHJlYWQgdGhyZWFkOworfSBoZnNfY2F0X3JlYzsKKworc3RydWN0IGhmc19tZGIgeworCV9fYmUxNiBkclNpZ1dvcmQ7CQkvKiBTaWduYXR1cmUgd29yZCBpbmRpY2F0aW5nIGZzIHR5cGUgKi8KKwlfX2JlMzIgZHJDckRhdGU7CQkvKiBmcyBjcmVhdGlvbiBkYXRlL3RpbWUgKi8KKwlfX2JlMzIgZHJMc01vZDsJCQkvKiBmcyBtb2RpZmljYXRpb24gZGF0ZS90aW1lICovCisJX19iZTE2IGRyQXRyYjsJCQkvKiBmcyBhdHRyaWJ1dGVzICovCisJX19iZTE2IGRyTm1GbHM7CQkJLyogbnVtYmVyIG9mIGZpbGVzIGluIHJvb3QgZGlyZWN0b3J5ICovCisJX19iZTE2IGRyVkJNU3Q7CQkJLyogbG9jYXRpb24gKGluIDUxMi1ieXRlIGJsb2NrcykKKwkJCQkJICAgb2YgdGhlIHZvbHVtZSBiaXRtYXAgKi8KKwlfX2JlMTYgZHJBbGxvY1B0cjsJCS8qIGxvY2F0aW9uIChpbiBhbGxvY2F0aW9uIGJsb2NrcykKKwkJCQkJICAgdG8gYmVnaW4gbmV4dCBhbGxvY2F0aW9uIHNlYXJjaCAqLworCV9fYmUxNiBkck5tQWxCbGtzOwkJLyogbnVtYmVyIG9mIGFsbG9jYXRpb24gYmxvY2tzICovCisJX19iZTMyIGRyQWxCbGtTaXo7CQkvKiBieXRlcyBpbiBhbiBhbGxvY2F0aW9uIGJsb2NrICovCisJX19iZTMyIGRyQ2xwU2l6OwkJLyogY2x1bXBzaXplLCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvCisJCQkJCSAgIGFsbG9jYXRlIHdoZW4gZXh0ZW5kaW5nIGEgZmlsZSAqLworCV9fYmUxNiBkckFsQmxTdDsJCS8qIGxvY2F0aW9uIChpbiA1MTItYnl0ZSBibG9ja3MpCisJCQkJCSAgIG9mIHRoZSBmaXJzdCBhbGxvY2F0aW9uIGJsb2NrICovCisJX19iZTMyIGRyTnh0Q05JRDsJCS8qIENOSUQgdG8gYXNzaWduIHRvIHRoZSBuZXh0CisJCQkJCSAgIGZpbGUgb3IgZGlyZWN0b3J5IGNyZWF0ZWQgKi8KKwlfX2JlMTYgZHJGcmVlQmtzOwkJLyogbnVtYmVyIG9mIGZyZWUgYWxsb2NhdGlvbiBibG9ja3MgKi8KKwl1OCBkclZOWzI4XTsJCQkvKiB0aGUgdm9sdW1lIGxhYmVsICovCisJX19iZTMyIGRyVm9sQmtVcDsJCS8qIGZzIGJhY2t1cCBkYXRlL3RpbWUgKi8KKwlfX2JlMTYgZHJWU2VxTnVtOwkJLyogYmFja3VwIHNlcXVlbmNlIG51bWJlciAqLworCV9fYmUzMiBkcldyQ250OwkJCS8qIGZzIHdyaXRlIGNvdW50ICovCisJX19iZTMyIGRyWFRDbHBTaXo7CQkvKiBjbHVtcHNpemUgZm9yIHRoZSBleHRlbnRzIEItdHJlZSAqLworCV9fYmUzMiBkckNUQ2xwU2l6OwkJLyogY2x1bXBzaXplIGZvciB0aGUgY2F0YWxvZyBCLXRyZWUgKi8KKwlfX2JlMTYgZHJObVJ0RGlyczsJCS8qIG51bWJlciBvZiBkaXJlY3RvcmllcyBpbgorCQkJCQkgICB0aGUgcm9vdCBkaXJlY3RvcnkgKi8KKwlfX2JlMzIgZHJGaWxDbnQ7CQkvKiBudW1iZXIgb2YgZmlsZXMgaW4gdGhlIGZzICovCisJX19iZTMyIGRyRGlyQ250OwkJLyogbnVtYmVyIG9mIGRpcmVjdG9yaWVzIGluIHRoZSBmcyAqLworCXU4IGRyRm5kckluZm9bMzJdOwkJLyogZGF0YSB1c2VkIGJ5IHRoZSBGaW5kZXIgKi8KKwlfX2JlMTYgZHJFbWJlZFNpZ1dvcmQ7CQkvKiBlbWJlZGRlZCB2b2x1bWUgc2lnbmF0dXJlICovCisJX19iZTMyIGRyRW1iZWRFeHRlbnQ7CQkvKiBzdGFydGluZyBibG9jayBudW1iZXIgKHhkclN0QUJOKQorCQkJCQkgICBhbmQgbnVtYmVyIG9mIGFsbG9jYXRpb24gYmxvY2tzCisJCQkJCSAgICh4ZHJOdW1BQmxrcykgb2NjdXBpZWQgYnkgZW1iZWRkZWQKKwkJCQkJICAgdm9sdW1lICovCisJX19iZTMyIGRyWFRGbFNpemU7CQkvKiBieXRlcyBpbiB0aGUgZXh0ZW50cyBCLXRyZWUgKi8KKwloZnNfZXh0ZW50X3JlYyBkclhURXh0UmVjOwkvKiBleHRlbnRzIEItdHJlZSdzIGZpcnN0IDMgZXh0ZW50cyAqLworCV9fYmUzMiBkckNURmxTaXplOwkJLyogYnl0ZXMgaW4gdGhlIGNhdGFsb2cgQi10cmVlICovCisJaGZzX2V4dGVudF9yZWMgZHJDVEV4dFJlYzsJLyogY2F0YWxvZyBCLXRyZWUncyBmaXJzdCAzIGV4dGVudHMgKi8KK30gX19wYWNrZWQ7CisKKy8qPT09PT09PT0gRGF0YSBzdHJ1Y3R1cmVzIGtlcHQgaW4gbWVtb3J5ID09PT09PT09Ki8KKworc3RydWN0IGhmc19yZWFkZGlyX2RhdGEgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlzdHJ1Y3QgaGZzX2NhdF9rZXkga2V5OworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9oZnMvaGZzX2ZzLmggYi9mcy9oZnMvaGZzX2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRjOGVmOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmcy9oZnNfZnMuaApAQCAtMCwwICsxLDI4NiBAQAorLyoKKyAqICBsaW51eC9mcy9oZnMvaGZzX2ZzLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NyAgUGF1bCBILiBIYXJncm92ZQorICogKEMpIDIwMDMgQXJkaXMgVGVjaG5vbG9naWVzIDxyb21hbkBhcmRpc3RlY2guY29tPgorICogVGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0hGU19GU19ICisjZGVmaW5lIF9MSU5VWF9IRlNfRlNfSAorCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiaGZzLmgiCisKKyNkZWZpbmUgREJHX0JOT0RFX1JFRlMJMHgwMDAwMDAwMQorI2RlZmluZSBEQkdfQk5PREVfTU9ECTB4MDAwMDAwMDIKKyNkZWZpbmUgREJHX0NBVF9NT0QJMHgwMDAwMDAwNAorI2RlZmluZSBEQkdfSU5PREUJMHgwMDAwMDAwOAorI2RlZmluZSBEQkdfU1VQRVIJMHgwMDAwMDAxMAorI2RlZmluZSBEQkdfRVhURU5UCTB4MDAwMDAwMjAKKyNkZWZpbmUgREJHX0JJVE1BUAkweDAwMDAwMDQwCisKKy8vI2RlZmluZSBEQkdfTUFTSwkoREJHX0VYVEVOVHxEQkdfSU5PREV8REJHX0JOT0RFX01PRHxEQkdfQ0FUX01PRHxEQkdfQklUTUFQKQorLy8jZGVmaW5lIERCR19NQVNLCShEQkdfQk5PREVfTU9EfERCR19DQVRfTU9EfERCR19JTk9ERSkKKy8vI2RlZmluZSBEQkdfTUFTSwkoREJHX0NBVF9NT0R8REJHX0JOT0RFX1JFRlN8REJHX0lOT0RFfERCR19FWFRFTlQpCisjZGVmaW5lIERCR19NQVNLCSgwKQorCisjZGVmaW5lIGRwcmludChmbGcsIGZtdCwgYXJncy4uLikgXAorCWlmIChmbGcgJiBEQkdfTUFTSykgcHJpbnRrKGZtdCAsICMjIGFyZ3MpCisKKyNkZWZpbmUgaGZzX3dhcm4oZm9ybWF0LCBhcmdzLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HIGZvcm1hdCAsICMjIGFyZ3MpCisjZGVmaW5lIGhmc19lcnJvcihmb3JtYXQsIGFyZ3MuLi4pIHByaW50ayhLRVJOX0VSUiBmb3JtYXQgLCAjIyBhcmdzKQorCisvKgorICogc3RydWN0IGhmc19pbm9kZV9pbmZvCisgKgorICogVGhlIEhGUy1zcGVjaWZpYyBwYXJ0IG9mIGEgTGludXggKHN0cnVjdCBpbm9kZSkKKyAqLworc3RydWN0IGhmc19pbm9kZV9pbmZvIHsKKwlhdG9taWNfdCBvcGVuY250OworCisJdW5zaWduZWQgaW50IGZsYWdzOworCisJLyogdG8gZGVhbCB3aXRoIGxvY2FsdGltZSB1Z2xpbmVzcyAqLworCWludCB0el9zZWNvbmRzd2VzdDsKKworCXN0cnVjdCBoZnNfY2F0X2tleSBjYXRfa2V5OworCisJc3RydWN0IGxpc3RfaGVhZCBvcGVuX2Rpcl9saXN0OworCXN0cnVjdCBpbm9kZSAqcnNyY19pbm9kZTsKKworCXN0cnVjdCBzZW1hcGhvcmUgZXh0ZW50c19sb2NrOworCisJdTE2IGFsbG9jX2Jsb2NrcywgY2x1bXBfYmxvY2tzOworCXNlY3Rvcl90IGZzX2Jsb2NrczsKKwkvKiBBbGxvY2F0aW9uIGV4dGVudHMgZnJvbSBjYXRsb2cgcmVjb3JkIG9yIHZvbHVtZSBoZWFkZXIgKi8KKwloZnNfZXh0ZW50X3JlYyBmaXJzdF9leHRlbnRzOworCXUxNiBmaXJzdF9ibG9ja3M7CisJaGZzX2V4dGVudF9yZWMgY2FjaGVkX2V4dGVudHM7CisJdTE2IGNhY2hlZF9zdGFydCwgY2FjaGVkX2Jsb2NrczsKKworCWxvZmZfdCBwaHlzX3NpemU7CisJc3RydWN0IGlub2RlIHZmc19pbm9kZTsKK307CisKKyNkZWZpbmUgSEZTX0ZMR19SU1JDCQkweDAwMDEKKyNkZWZpbmUgSEZTX0ZMR19FWFRfRElSVFkJMHgwMDAyCisjZGVmaW5lIEhGU19GTEdfRVhUX05FVwkJMHgwMDA0CisKKyNkZWZpbmUgSEZTX0lTX1JTUkMoaW5vZGUpCShIRlNfSShpbm9kZSktPmZsYWdzICYgSEZTX0ZMR19SU1JDKQorCisvKgorICogc3RydWN0IGhmc19zYl9pbmZvCisgKgorICogVGhlIEhGUy1zcGVjaWZpYyBwYXJ0IG9mIGEgTGludXggKHN0cnVjdCBzdXBlcl9ibG9jaykKKyAqLworc3RydWN0IGhmc19zYl9pbmZvIHsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm1kYl9iaDsJCS8qIFRoZSBoZnNfYnVmZmVyCisJCQkJCQkgICBob2xkaW5nIHRoZSByZWFsCisJCQkJCQkgICBzdXBlcmJsb2NrIChha2EgVklCCisJCQkJCQkgICBvciBNREIpICovCisJc3RydWN0IGhmc19tZGIgKm1kYjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmFsdF9tZGJfYmg7CQkvKiBUaGUgaGZzX2J1ZmZlciBob2xkaW5nCisJCQkJCQkgICB0aGUgYWx0ZXJuYXRlIHN1cGVyYmxvY2sgKi8KKwlzdHJ1Y3QgaGZzX21kYiAqYWx0X21kYjsKKwlfX2JlMzIgKmJpdG1hcDsJCQkJLyogVGhlIHBhZ2UgaG9sZGluZyB0aGUKKwkJCQkJCSAgIGFsbG9jYXRpb24gYml0bWFwICovCisJc3RydWN0IGhmc19idHJlZSAqZXh0X3RyZWU7CQkJLyogSW5mb3JtYXRpb24gYWJvdXQKKwkJCQkJCSAgIHRoZSBleHRlbnRzIGItdHJlZSAqLworCXN0cnVjdCBoZnNfYnRyZWUgKmNhdF90cmVlOwkJCS8qIEluZm9ybWF0aW9uIGFib3V0CisJCQkJCQkgICB0aGUgY2F0YWxvZyBiLXRyZWUgKi8KKwl1MzIgZmlsZV9jb3VudDsJCQkJLyogVGhlIG51bWJlciBvZgorCQkJCQkJICAgcmVndWxhciBmaWxlcyBpbgorCQkJCQkJICAgdGhlIGZpbGVzeXN0ZW0gKi8KKwl1MzIgZm9sZGVyX2NvdW50OwkJCS8qIFRoZSBudW1iZXIgb2YKKwkJCQkJCSAgIGRpcmVjdG9yaWVzIGluIHRoZQorCQkJCQkJICAgZmlsZXN5c3RlbSAqLworCXUzMiBuZXh0X2lkOwkJCQkvKiBUaGUgbmV4dCBhdmFpbGFibGUKKwkJCQkJCSAgIGZpbGUgaWQgbnVtYmVyICovCisJdTMyIGNsdW1wYWJsa3M7CQkJCS8qIFRoZSBudW1iZXIgb2YgYWxsb2NhdGlvbgorCQkJCQkJICAgYmxvY2tzIHRvIHRyeSB0byBhZGQgd2hlbgorCQkJCQkJICAgZXh0ZW5kaW5nIGEgZmlsZSAqLworCXUzMiBmc19zdGFydDsJCQkJLyogVGhlIGZpcnN0IDUxMi1ieXRlCisJCQkJCQkgICBibG9jayByZXByZXNlbnRlZAorCQkJCQkJICAgaW4gdGhlIGJpdG1hcCAqLworCXUzMiBwYXJ0X3N0YXJ0OworCXUxNiByb290X2ZpbGVzOwkJCQkvKiBUaGUgbnVtYmVyIG9mCisJCQkJCQkgICByZWd1bGFyCisJCQkJCQkgICAobm9uLWRpcmVjdG9yeSkKKwkJCQkJCSAgIGZpbGVzIGluIHRoZSByb290CisJCQkJCQkgICBkaXJlY3RvcnkgKi8KKwl1MTYgcm9vdF9kaXJzOwkJCQkvKiBUaGUgbnVtYmVyIG9mCisJCQkJCQkgICBkaXJlY3RvcmllcyBpbiB0aGUKKwkJCQkJCSAgIHJvb3QgZGlyZWN0b3J5ICovCisJdTE2IGZzX2FibG9ja3M7CQkJCS8qIFRoZSBudW1iZXIgb2YKKwkJCQkJCSAgIGFsbG9jYXRpb24gYmxvY2tzCisJCQkJCQkgICBpbiB0aGUgZmlsZXN5c3RlbSAqLworCXUxNiBmcmVlX2FibG9ja3M7CQkJLyogdGhlIG51bWJlciBvZiB1bnVzZWQKKwkJCQkJCSAgIGFsbG9jYXRpb24gYmxvY2tzCisJCQkJCQkgICBpbiB0aGUgZmlsZXN5c3RlbSAqLworCXUzMiBhbGxvY19ibGtzejsJCQkvKiBUaGUgc2l6ZSBvZiBhbgorCQkJCQkJICAgImFsbG9jYXRpb24gYmxvY2siICovCisJaW50IHNfcXVpZXQ7CQkJCS8qIFNpbGVudCBmYWlsdXJlIHdoZW4KKwkJCQkJCSAgIGNoYW5naW5nIG93bmVyIG9yIG1vZGU/ICovCisJX19iZTMyIHNfdHlwZTsJCQkJLyogVHlwZSBmb3IgbmV3IGZpbGVzICovCisJX19iZTMyIHNfY3JlYXRvcjsJCQkvKiBDcmVhdG9yIGZvciBuZXcgZmlsZXMgKi8KKwl1bW9kZV90IHNfZmlsZV91bWFzazsJCQkvKiBUaGUgdW1hc2sgYXBwbGllZCB0byB0aGUKKwkJCQkJCSAgIHBlcm1pc3Npb25zIG9uIGFsbCBmaWxlcyAqLworCXVtb2RlX3Qgc19kaXJfdW1hc2s7CQkJLyogVGhlIHVtYXNrIGFwcGxpZWQgdG8gdGhlCisJCQkJCQkgICBwZXJtaXNzaW9ucyBvbiBhbGwgZGlycyAqLworCXVpZF90IHNfdWlkOwkJCQkvKiBUaGUgdWlkIG9mIGFsbCBmaWxlcyAqLworCWdpZF90IHNfZ2lkOwkJCQkvKiBUaGUgZ2lkIG9mIGFsbCBmaWxlcyAqLworCisJaW50IHNlc3Npb24sIHBhcnQ7CisKKwlzdHJ1Y3Qgc2VtYXBob3JlIGJpdG1hcF9sb2NrOworCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXUxNiBibG9ja29mZnNldDsKKworCWludCBmc19kaXY7CisKKwlzdHJ1Y3QgaGxpc3RfaGVhZCByc3JjX2lub2RlczsKK307CisKKyNkZWZpbmUgSEZTX0ZMR19CSVRNQVBfRElSVFkJMAorI2RlZmluZSBIRlNfRkxHX01EQl9ESVJUWQkxCisjZGVmaW5lIEhGU19GTEdfQUxUX01EQl9ESVJUWQkyCisKKy8qIGJpdG1hcC5jICovCitleHRlcm4gdTMyIGhmc192Ym1fc2VhcmNoX2ZyZWUoc3RydWN0IHN1cGVyX2Jsb2NrICosIHUzMiwgdTMyICopOworZXh0ZXJuIGludCBoZnNfY2xlYXJfdmJtX2JpdHMoc3RydWN0IHN1cGVyX2Jsb2NrICosIHUxNiwgdTE2KTsKKworLyogY2F0YWxvZy5jICovCitleHRlcm4gaW50IGhmc19jYXRfa2V5Y21wKGNvbnN0IGJ0cmVlX2tleSAqLCBjb25zdCBidHJlZV9rZXkgKik7CitzdHJ1Y3QgaGZzX2ZpbmRfZGF0YTsKK2V4dGVybiBpbnQgaGZzX2NhdF9maW5kX2JyZWMoc3RydWN0IHN1cGVyX2Jsb2NrICosIHUzMiwgc3RydWN0IGhmc19maW5kX2RhdGEgKik7CitleHRlcm4gaW50IGhmc19jYXRfY3JlYXRlKHUzMiwgc3RydWN0IGlub2RlICosIHN0cnVjdCBxc3RyICosIHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiBpbnQgaGZzX2NhdF9kZWxldGUodTMyLCBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IHFzdHIgKik7CitleHRlcm4gaW50IGhmc19jYXRfbW92ZSh1MzIsIHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgcXN0ciAqLAorCQkJc3RydWN0IGlub2RlICosIHN0cnVjdCBxc3RyICopOworZXh0ZXJuIHZvaWQgaGZzX2NhdF9idWlsZF9rZXkoYnRyZWVfa2V5ICosIHUzMiwgc3RydWN0IHFzdHIgKik7CisKKy8qIGRpci5jICovCitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBoZnNfZGlyX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgaGZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCisvKiBleHRlbnQuYyAqLworZXh0ZXJuIGludCBoZnNfZXh0X2tleWNtcChjb25zdCBidHJlZV9rZXkgKiwgY29uc3QgYnRyZWVfa2V5ICopOworZXh0ZXJuIGludCBoZnNfZnJlZV9mb3JrKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgaGZzX2NhdF9maWxlICosIGludCk7CitleHRlcm4gdm9pZCBoZnNfZXh0X3dyaXRlX2V4dGVudChzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gaW50IGhmc19leHRlbmRfZmlsZShzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gdm9pZCBoZnNfZmlsZV90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKik7CisKK2V4dGVybiBpbnQgaGZzX2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKiwgc2VjdG9yX3QsIHN0cnVjdCBidWZmZXJfaGVhZCAqLCBpbnQpOworCisvKiBpbm9kZS5jICovCitleHRlcm4gc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBoZnNfYW9wczsKK2V4dGVybiBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGhmc19idHJlZV9hb3BzOworCitleHRlcm4gc3RydWN0IGlub2RlICpoZnNfbmV3X2lub2RlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgcXN0ciAqLCBpbnQpOworZXh0ZXJuIHZvaWQgaGZzX2lub2RlX3dyaXRlX2Zvcmsoc3RydWN0IGlub2RlICosIHN0cnVjdCBoZnNfZXh0ZW50ICosIF9fYmUzMiAqLCBfX2JlMzIgKik7CitleHRlcm4gaW50IGhmc193cml0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKK2V4dGVybiBpbnQgaGZzX2lub2RlX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgaWF0dHIgKik7CitleHRlcm4gdm9pZCBoZnNfaW5vZGVfcmVhZF9mb3JrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBoZnNfZXh0ZW50ICpleHQsCisJCQlfX2JlMzIgbG9nX3NpemUsIF9fYmUzMiBwaHlzX3NpemUsIHUzMiBjbHVtcF9zaXplKTsKK2V4dGVybiBzdHJ1Y3QgaW5vZGUgKmhmc19pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgaGZzX2NhdF9rZXkgKiwgaGZzX2NhdF9yZWMgKik7CitleHRlcm4gdm9pZCBoZnNfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICopOworZXh0ZXJuIHZvaWQgaGZzX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CisKKy8qIGF0dHIuYyAqLworZXh0ZXJuIGludCBoZnNfc2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpuYW1lLAorCQkJY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpOworZXh0ZXJuIHNzaXplX3QgaGZzX2dldHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgICB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUpOworZXh0ZXJuIHNzaXplX3QgaGZzX2xpc3R4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOworCisvKiBtZGIuYyAqLworZXh0ZXJuIGludCBoZnNfbWRiX2dldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CitleHRlcm4gdm9pZCBoZnNfbWRiX2NvbW1pdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CitleHRlcm4gdm9pZCBoZnNfbWRiX2Nsb3NlKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK2V4dGVybiB2b2lkIGhmc19tZGJfcHV0KHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKKworLyogcGFydF90YmwuYyAqLworZXh0ZXJuIGludCBoZnNfcGFydF9maW5kKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzZWN0b3JfdCAqLCBzZWN0b3JfdCAqKTsKKworLyogc3RyaW5nLmMgKi8KK2V4dGVybiBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgaGZzX2RlbnRyeV9vcGVyYXRpb25zOworCitleHRlcm4gaW50IGhmc19oYXNoX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBxc3RyICopOworZXh0ZXJuIGludCBoZnNfc3RyY21wKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50LAorCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCk7CitleHRlcm4gaW50IGhmc19jb21wYXJlX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBxc3RyICosIHN0cnVjdCBxc3RyICopOworCisvKiB0cmFucy5jICovCitleHRlcm4gdm9pZCBoZnNfdHJpdjJtYWMoc3RydWN0IGhmc19uYW1lICosIHN0cnVjdCBxc3RyICopOworZXh0ZXJuIGludCBoZnNfbWFjMnRyaXYoY2hhciAqLCBjb25zdCBzdHJ1Y3QgaGZzX25hbWUgKik7CisKK2V4dGVybiBzdHJ1Y3QgdGltZXpvbmUgc3lzX3R6OworCisvKgorICogVGhlcmUgYXJlIHR3byB0aW1lIHN5c3RlbXMuICBCb3RoIGFyZSBiYXNlZCBvbiBzZWNvbmRzIHNpbmNlCisgKiBhIHBhcnRpY3VsYXIgdGltZS9kYXRlLgorICoJVW5peDoJdW5zaWduZWQgbGlsLWVuZGlhbiBzaW5jZSAwMDowMCBHTVQsIEphbi4gMSwgMTk3MAorICoJbWFjOgl1bnNpZ25lZCBiaWctZW5kaWFuIHNpbmNlIDAwOjAwIEdNVCwgSmFuLiAxLCAxOTA0CisgKgorICovCisjZGVmaW5lIF9faGZzX3VfdG9fbXRpbWUoc2VjKQljcHVfdG9fYmUzMihzZWMgKyAyMDgyODQ0ODAwVSAtIHN5c190ei50el9taW51dGVzd2VzdCAqIDYwKQorI2RlZmluZSBfX2hmc19tX3RvX3V0aW1lKHNlYykJKGJlMzJfdG9fY3B1KHNlYykgLSAyMDgyODQ0ODAwVSAgKyBzeXNfdHoudHpfbWludXRlc3dlc3QgKiA2MCkKKworI2RlZmluZSBIRlNfSShpbm9kZSkJKGxpc3RfZW50cnkoaW5vZGUsIHN0cnVjdCBoZnNfaW5vZGVfaW5mbywgdmZzX2lub2RlKSkKKyNkZWZpbmUgSEZTX1NCKHNiKQkoKHN0cnVjdCBoZnNfc2JfaW5mbyAqKShzYiktPnNfZnNfaW5mbykKKworI2RlZmluZSBoZnNfbV90b191dGltZSh0aW1lKQkoc3RydWN0IHRpbWVzcGVjKXsgLnR2X3NlYyA9IF9faGZzX21fdG9fdXRpbWUodGltZSkgfQorI2RlZmluZSBoZnNfdV90b19tdGltZSh0aW1lKQlfX2hmc191X3RvX210aW1lKCh0aW1lKS50dl9zZWMpCisjZGVmaW5lIGhmc19tdGltZSgpCQlfX2hmc191X3RvX210aW1lKGdldF9zZWNvbmRzKCkpCisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqaGZzX21kYl9uYW1lKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJcmV0dXJuIHNiLT5zX2lkOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGZzX2JpdG1hcF9kaXJ0eShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXNldF9iaXQoSEZTX0ZMR19CSVRNQVBfRElSVFksICZIRlNfU0Ioc2IpLT5mbGFncyk7CisJc2ItPnNfZGlydCA9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoZnNfYnVmZmVyX3N5bmMoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwl3aGlsZSAoYnVmZmVyX2xvY2tlZChiaCkpIHsKKwkJd2FpdF9vbl9idWZmZXIoYmgpOworCX0KKwlpZiAoYnVmZmVyX2RpcnR5KGJoKSkgeworCQlsbF9yd19ibG9jayhXUklURSwgMSwgJmJoKTsKKwkJd2FpdF9vbl9idWZmZXIoYmgpOworCX0KK30KKworI2RlZmluZSBzYl9icmVhZDUxMihzYiwgc2VjLCBkYXRhKSAoewkJCVwKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKl9fYmg7CQkJXAorCXNlY3Rvcl90IF9fYmxvY2s7CQkJCVwKKwlsb2ZmX3QgX19zdGFydDsJCQkJCVwKKwlpbnQgX19vZmZzZXQ7CQkJCQlcCisJCQkJCQkJXAorCV9fc3RhcnQgPSAobG9mZl90KShzZWMpIDw8IEhGU19TRUNUT1JfU0laRV9CSVRTO1wKKwlfX2Jsb2NrID0gX19zdGFydCA+PiAoc2IpLT5zX2Jsb2Nrc2l6ZV9iaXRzOwlcCisJX19vZmZzZXQgPSBfX3N0YXJ0ICYgKChzYiktPnNfYmxvY2tzaXplIC0gMSk7CVwKKwlfX2JoID0gc2JfYnJlYWQoKHNiKSwgX19ibG9jayk7CQkJXAorCWlmIChsaWtlbHkoX19iaCAhPSBOVUxMKSkJCQlcCisJCWRhdGEgPSAodm9pZCAqKShfX2JoLT5iX2RhdGEgKyBfX29mZnNldCk7XAorCWVsc2UJCQkJCQlcCisJCWRhdGEgPSBOVUxMOwkJCQlcCisJX19iaDsJCQkJCQlcCit9KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2hmcy9pbm9kZS5jIGIvZnMvaGZzL2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUxOTEyMwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmcy9pbm9kZS5jCkBAIC0wLDAgKzEsNjM2IEBACisvKgorICogIGxpbnV4L2ZzL2hmcy9pbm9kZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcgIFBhdWwgSC4gSGFyZ3JvdmUKKyAqIChDKSAyMDAzIEFyZGlzIFRlY2hub2xvZ2llcyA8cm9tYW5AYXJkaXN0ZWNoLmNvbT4KKyAqIFRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgaW5vZGUtcmVsYXRlZCBmdW5jdGlvbnMgd2hpY2ggZG8gbm90IGRlcGVuZCBvbgorICogd2hpY2ggc2NoZW1lIGlzIGJlaW5nIHVzZWQgdG8gcmVwcmVzZW50IGZvcmtzLgorICoKKyAqIEJhc2VkIG9uIHRoZSBtaW5peCBmaWxlIHN5c3RlbSBjb2RlLCAoQykgMTk5MSwgMTk5MiBieSBMaW51cyBUb3J2YWxkcworICovCisKKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21wYWdlLmg+CisKKyNpbmNsdWRlICJoZnNfZnMuaCIKKyNpbmNsdWRlICJidHJlZS5oIgorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBoZnNfZmlsZV9vcGVyYXRpb25zOworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGhmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CisKKy8qPT09PT09PT09PT09PT09PSBWYXJpYWJsZS1saWtlIG1hY3JvcyA9PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBIRlNfVkFMSURfTU9ERV9CSVRTICAoU19JRlJFRyB8IFNfSUZESVIgfCBTX0lSV1hVR08pCisKK3N0YXRpYyBpbnQgaGZzX3dyaXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7CisJcmV0dXJuIGJsb2NrX3dyaXRlX2Z1bGxfcGFnZShwYWdlLCBoZnNfZ2V0X2Jsb2NrLCB3YmMpOworfQorCitzdGF0aWMgaW50IGhmc19yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJuIGJsb2NrX3JlYWRfZnVsbF9wYWdlKHBhZ2UsIGhmc19nZXRfYmxvY2spOworfQorCitzdGF0aWMgaW50IGhmc19wcmVwYXJlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCit7CisJcmV0dXJuIGNvbnRfcHJlcGFyZV93cml0ZShwYWdlLCBmcm9tLCB0bywgaGZzX2dldF9ibG9jaywKKwkJCQkgICZIRlNfSShwYWdlLT5tYXBwaW5nLT5ob3N0KS0+cGh5c19zaXplKTsKK30KKworc3RhdGljIHNlY3Rvcl90IGhmc19ibWFwKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzZWN0b3JfdCBibG9jaykKK3sKKwlyZXR1cm4gZ2VuZXJpY19ibG9ja19ibWFwKG1hcHBpbmcsIGJsb2NrLCBoZnNfZ2V0X2Jsb2NrKTsKK30KKworc3RhdGljIGludCBoZnNfcmVsZWFzZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBtYXNrKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlOworCXN0cnVjdCBoZnNfYm5vZGUgKm5vZGU7CisJdTMyIG5pZHg7CisJaW50IGksIHJlcyA9IDE7CisKKwlzd2l0Y2ggKGlub2RlLT5pX2lubykgeworCWNhc2UgSEZTX0VYVF9DTklEOgorCQl0cmVlID0gSEZTX1NCKHNiKS0+ZXh0X3RyZWU7CisJCWJyZWFrOworCWNhc2UgSEZTX0NBVF9DTklEOgorCQl0cmVlID0gSEZTX1NCKHNiKS0+Y2F0X3RyZWU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHRyZWUtPm5vZGVfc2l6ZSA+PSBQQUdFX0NBQ0hFX1NJWkUpIHsKKwkJbmlkeCA9IHBhZ2UtPmluZGV4ID4+ICh0cmVlLT5ub2RlX3NpemVfc2hpZnQgLSBQQUdFX0NBQ0hFX1NISUZUKTsKKwkJc3Bpbl9sb2NrKCZ0cmVlLT5oYXNoX2xvY2spOworCQlub2RlID0gaGZzX2Jub2RlX2ZpbmRoYXNoKHRyZWUsIG5pZHgpOworCQlpZiAoIW5vZGUpCisJCQk7CisJCWVsc2UgaWYgKGF0b21pY19yZWFkKCZub2RlLT5yZWZjbnQpKQorCQkJcmVzID0gMDsKKwkJaWYgKHJlcyAmJiBub2RlKSB7CisJCQloZnNfYm5vZGVfdW5oYXNoKG5vZGUpOworCQkJaGZzX2Jub2RlX2ZyZWUobm9kZSk7CisJCX0KKwkJc3Bpbl91bmxvY2soJnRyZWUtPmhhc2hfbG9jayk7CisJfSBlbHNlIHsKKwkJbmlkeCA9IHBhZ2UtPmluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gdHJlZS0+bm9kZV9zaXplX3NoaWZ0KTsKKwkJaSA9IDEgPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSB0cmVlLT5ub2RlX3NpemVfc2hpZnQpOworCQlzcGluX2xvY2soJnRyZWUtPmhhc2hfbG9jayk7CisJCWRvIHsKKwkJCW5vZGUgPSBoZnNfYm5vZGVfZmluZGhhc2godHJlZSwgbmlkeCsrKTsKKwkJCWlmICghbm9kZSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChhdG9taWNfcmVhZCgmbm9kZS0+cmVmY250KSkgeworCQkJCXJlcyA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCQloZnNfYm5vZGVfdW5oYXNoKG5vZGUpOworCQkJaGZzX2Jub2RlX2ZyZWUobm9kZSk7CisJCX0gd2hpbGUgKC0taSAmJiBuaWR4IDwgdHJlZS0+bm9kZV9jb3VudCk7CisJCXNwaW5fdW5sb2NrKCZ0cmVlLT5oYXNoX2xvY2spOworCX0KKwkvL3ByaW50aygicmVsZWFzZXBhZ2U6ICVsdSwleCA9ICVkXG4iLCBwYWdlLT5pbmRleCwgbWFzaywgcmVzKTsKKwlyZXR1cm4gcmVzID8gdHJ5X3RvX2ZyZWVfYnVmZmVycyhwYWdlKSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgaGZzX2dldF9ibG9ja3Moc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgaWJsb2NrLCB1bnNpZ25lZCBsb25nIG1heF9ibG9ja3MsCisJCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LCBpbnQgY3JlYXRlKQoreworCWludCByZXQ7CisKKwlyZXQgPSBoZnNfZ2V0X2Jsb2NrKGlub2RlLCBpYmxvY2ssIGJoX3Jlc3VsdCwgY3JlYXRlKTsKKwlpZiAoIXJldCkKKwkJYmhfcmVzdWx0LT5iX3NpemUgPSAoMSA8PCBpbm9kZS0+aV9ibGtiaXRzKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBoZnNfZGlyZWN0X0lPKGludCBydywgc3RydWN0IGtpb2NiICppb2NiLAorCQljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgbG9mZl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBucl9zZWdzKQoreworCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZy0+aG9zdDsKKworCXJldHVybiBibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLCBpbm9kZS0+aV9zYi0+c19iZGV2LCBpb3YsCisJCQkJICBvZmZzZXQsIG5yX3NlZ3MsIGhmc19nZXRfYmxvY2tzLCBOVUxMKTsKK30KKworc3RhdGljIGludCBoZnNfd3JpdGVwYWdlcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCSAgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7CisJcmV0dXJuIG1wYWdlX3dyaXRlcGFnZXMobWFwcGluZywgd2JjLCBoZnNfZ2V0X2Jsb2NrKTsKK30KKworc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBoZnNfYnRyZWVfYW9wcyA9IHsKKwkucmVhZHBhZ2UJPSBoZnNfcmVhZHBhZ2UsCisJLndyaXRlcGFnZQk9IGhmc193cml0ZXBhZ2UsCisJLnN5bmNfcGFnZQk9IGJsb2NrX3N5bmNfcGFnZSwKKwkucHJlcGFyZV93cml0ZQk9IGhmc19wcmVwYXJlX3dyaXRlLAorCS5jb21taXRfd3JpdGUJPSBnZW5lcmljX2NvbW1pdF93cml0ZSwKKwkuYm1hcAkJPSBoZnNfYm1hcCwKKwkucmVsZWFzZXBhZ2UJPSBoZnNfcmVsZWFzZXBhZ2UsCit9OworCitzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGhmc19hb3BzID0geworCS5yZWFkcGFnZQk9IGhmc19yZWFkcGFnZSwKKwkud3JpdGVwYWdlCT0gaGZzX3dyaXRlcGFnZSwKKwkuc3luY19wYWdlCT0gYmxvY2tfc3luY19wYWdlLAorCS5wcmVwYXJlX3dyaXRlCT0gaGZzX3ByZXBhcmVfd3JpdGUsCisJLmNvbW1pdF93cml0ZQk9IGdlbmVyaWNfY29tbWl0X3dyaXRlLAorCS5ibWFwCQk9IGhmc19ibWFwLAorCS5kaXJlY3RfSU8JPSBoZnNfZGlyZWN0X0lPLAorCS53cml0ZXBhZ2VzCT0gaGZzX3dyaXRlcGFnZXMsCit9OworCisvKgorICogaGZzX25ld19pbm9kZQorICovCitzdHJ1Y3QgaW5vZGUgKmhmc19uZXdfaW5vZGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBxc3RyICpuYW1lLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLT5pX3NiOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBuZXdfaW5vZGUoc2IpOworCWlmICghaW5vZGUpCisJCXJldHVybiBOVUxMOworCisJaW5pdF9NVVRFWCgmSEZTX0koaW5vZGUpLT5leHRlbnRzX2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZIRlNfSShpbm9kZSktPm9wZW5fZGlyX2xpc3QpOworCWhmc19jYXRfYnVpbGRfa2V5KChidHJlZV9rZXkgKikmSEZTX0koaW5vZGUpLT5jYXRfa2V5LCBkaXItPmlfaW5vLCBuYW1lKTsKKwlpbm9kZS0+aV9pbm8gPSBIRlNfU0Ioc2IpLT5uZXh0X2lkKys7CisJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisJaW5vZGUtPmlfdWlkID0gY3VycmVudC0+ZnN1aWQ7CisJaW5vZGUtPmlfZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJaW5vZGUtPmlfbmxpbmsgPSAxOworCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJaW5vZGUtPmlfYmxrc2l6ZSA9IEhGU19TQihzYiktPmFsbG9jX2Jsa3N6OworCUhGU19JKGlub2RlKS0+ZmxhZ3MgPSAwOworCUhGU19JKGlub2RlKS0+cnNyY19pbm9kZSA9IE5VTEw7CisJSEZTX0koaW5vZGUpLT5mc19ibG9ja3MgPSAwOworCWlmIChTX0lTRElSKG1vZGUpKSB7CisJCWlub2RlLT5pX3NpemUgPSAyOworCQlIRlNfU0Ioc2IpLT5mb2xkZXJfY291bnQrKzsKKwkJaWYgKGRpci0+aV9pbm8gPT0gSEZTX1JPT1RfQ05JRCkKKwkJCUhGU19TQihzYiktPnJvb3RfZGlycysrOworCQlpbm9kZS0+aV9vcCA9ICZoZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZoZnNfZGlyX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX21vZGUgfD0gU19JUldYVUdPOworCQlpbm9kZS0+aV9tb2RlICY9IH5IRlNfU0IoaW5vZGUtPmlfc2IpLT5zX2Rpcl91bWFzazsKKwl9IGVsc2UgaWYgKFNfSVNSRUcobW9kZSkpIHsKKwkJSEZTX0koaW5vZGUpLT5jbHVtcF9ibG9ja3MgPSBIRlNfU0Ioc2IpLT5jbHVtcGFibGtzOworCQlIRlNfU0Ioc2IpLT5maWxlX2NvdW50Kys7CisJCWlmIChkaXItPmlfaW5vID09IEhGU19ST09UX0NOSUQpCisJCQlIRlNfU0Ioc2IpLT5yb290X2ZpbGVzKys7CisJCWlub2RlLT5pX29wID0gJmhmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZoZnNfZmlsZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZoZnNfYW9wczsKKwkJaW5vZGUtPmlfbW9kZSB8PSBTX0lSVUdPfFNfSVhVR087CisJCWlmIChtb2RlICYgU19JV1VTUikKKwkJCWlub2RlLT5pX21vZGUgfD0gU19JV1VHTzsKKwkJaW5vZGUtPmlfbW9kZSAmPSB+SEZTX1NCKGlub2RlLT5pX3NiKS0+c19maWxlX3VtYXNrOworCQlIRlNfSShpbm9kZSktPnBoeXNfc2l6ZSA9IDA7CisJCUhGU19JKGlub2RlKS0+YWxsb2NfYmxvY2tzID0gMDsKKwkJSEZTX0koaW5vZGUpLT5maXJzdF9ibG9ja3MgPSAwOworCQlIRlNfSShpbm9kZSktPmNhY2hlZF9zdGFydCA9IDA7CisJCUhGU19JKGlub2RlKS0+Y2FjaGVkX2Jsb2NrcyA9IDA7CisJCW1lbXNldChIRlNfSShpbm9kZSktPmZpcnN0X2V4dGVudHMsIDAsIHNpemVvZihoZnNfZXh0ZW50X3JlYykpOworCQltZW1zZXQoSEZTX0koaW5vZGUpLT5jYWNoZWRfZXh0ZW50cywgMCwgc2l6ZW9mKGhmc19leHRlbnRfcmVjKSk7CisJfQorCWluc2VydF9pbm9kZV9oYXNoKGlub2RlKTsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwlzZXRfYml0KEhGU19GTEdfTURCX0RJUlRZLCAmSEZTX1NCKHNiKS0+ZmxhZ3MpOworCXNiLT5zX2RpcnQgPSAxOworCisJcmV0dXJuIGlub2RlOworfQorCit2b2lkIGhmc19kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisKKwlkcHJpbnQoREJHX0lOT0RFLCAiZGVsZXRlX2lub2RlOiAlbHVcbiIsIGlub2RlLT5pX2lubyk7CisJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJSEZTX1NCKHNiKS0+Zm9sZGVyX2NvdW50LS07CisJCWlmIChIRlNfSShpbm9kZSktPmNhdF9rZXkuUGFySUQgPT0gY3B1X3RvX2JlMzIoSEZTX1JPT1RfQ05JRCkpCisJCQlIRlNfU0Ioc2IpLT5yb290X2RpcnMtLTsKKwkJc2V0X2JpdChIRlNfRkxHX01EQl9ESVJUWSwgJkhGU19TQihzYiktPmZsYWdzKTsKKwkJc2ItPnNfZGlydCA9IDE7CisJCXJldHVybjsKKwl9CisJSEZTX1NCKHNiKS0+ZmlsZV9jb3VudC0tOworCWlmIChIRlNfSShpbm9kZSktPmNhdF9rZXkuUGFySUQgPT0gY3B1X3RvX2JlMzIoSEZTX1JPT1RfQ05JRCkpCisJCUhGU19TQihzYiktPnJvb3RfZmlsZXMtLTsKKwlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgeworCQlpZiAoIWlub2RlLT5pX25saW5rKSB7CisJCQlpbm9kZS0+aV9zaXplID0gMDsKKwkJCWhmc19maWxlX3RydW5jYXRlKGlub2RlKTsKKwkJfQorCX0KKwlzZXRfYml0KEhGU19GTEdfTURCX0RJUlRZLCAmSEZTX1NCKHNiKS0+ZmxhZ3MpOworCXNiLT5zX2RpcnQgPSAxOworfQorCit2b2lkIGhmc19pbm9kZV9yZWFkX2Zvcmsoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGhmc19leHRlbnQgKmV4dCwKKwkJCSBfX2JlMzIgX19sb2dfc2l6ZSwgX19iZTMyIHBoeXNfc2l6ZSwgdTMyIGNsdW1wX3NpemUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXUzMiBsb2dfc2l6ZSA9IGJlMzJfdG9fY3B1KF9fbG9nX3NpemUpOworCXUxNiBjb3VudDsKKwlpbnQgaTsKKworCW1lbWNweShIRlNfSShpbm9kZSktPmZpcnN0X2V4dGVudHMsIGV4dCwgc2l6ZW9mKGhmc19leHRlbnRfcmVjKSk7CisJZm9yIChjb3VudCA9IDAsIGkgPSAwOyBpIDwgMzsgaSsrKQorCQljb3VudCArPSBiZTE2X3RvX2NwdShleHRbaV0uY291bnQpOworCUhGU19JKGlub2RlKS0+Zmlyc3RfYmxvY2tzID0gY291bnQ7CisKKwlpbm9kZS0+aV9zaXplID0gSEZTX0koaW5vZGUpLT5waHlzX3NpemUgPSBsb2dfc2l6ZTsKKwlIRlNfSShpbm9kZSktPmZzX2Jsb2NrcyA9IChsb2dfc2l6ZSArIHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCWlub2RlX3NldF9ieXRlcyhpbm9kZSwgSEZTX0koaW5vZGUpLT5mc19ibG9ja3MgPDwgc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCUhGU19JKGlub2RlKS0+YWxsb2NfYmxvY2tzID0gYmUzMl90b19jcHUocGh5c19zaXplKSAvCisJCQkJICAgICBIRlNfU0Ioc2IpLT5hbGxvY19ibGtzejsKKwlIRlNfSShpbm9kZSktPmNsdW1wX2Jsb2NrcyA9IGNsdW1wX3NpemUgLyBIRlNfU0Ioc2IpLT5hbGxvY19ibGtzejsKKwlpZiAoIUhGU19JKGlub2RlKS0+Y2x1bXBfYmxvY2tzKQorCQlIRlNfSShpbm9kZSktPmNsdW1wX2Jsb2NrcyA9IEhGU19TQihzYiktPmNsdW1wYWJsa3M7Cit9CisKK3N0cnVjdCBoZnNfaWdldF9kYXRhIHsKKwlzdHJ1Y3QgaGZzX2NhdF9rZXkgKmtleTsKKwloZnNfY2F0X3JlYyAqcmVjOworfTsKKworc3RhdGljIGludCBoZnNfdGVzdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBoZnNfaWdldF9kYXRhICppZGF0YSA9IGRhdGE7CisJaGZzX2NhdF9yZWMgKnJlYzsKKworCXJlYyA9IGlkYXRhLT5yZWM7CisJc3dpdGNoIChyZWMtPnR5cGUpIHsKKwljYXNlIEhGU19DRFJfRElSOgorCQlyZXR1cm4gaW5vZGUtPmlfaW5vID09IGJlMzJfdG9fY3B1KHJlYy0+ZGlyLkRpcklEKTsKKwljYXNlIEhGU19DRFJfRklMOgorCQlyZXR1cm4gaW5vZGUtPmlfaW5vID09IGJlMzJfdG9fY3B1KHJlYy0+ZmlsZS5GbE51bSk7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldHVybiAxOworCX0KK30KKworLyoKKyAqIGhmc19yZWFkX2lub2RlCisgKi8KK3N0YXRpYyBpbnQgaGZzX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaGZzX2lnZXRfZGF0YSAqaWRhdGEgPSBkYXRhOworCXN0cnVjdCBoZnNfc2JfaW5mbyAqaHNiID0gSEZTX1NCKGlub2RlLT5pX3NiKTsKKwloZnNfY2F0X3JlYyAqcmVjOworCisJSEZTX0koaW5vZGUpLT5mbGFncyA9IDA7CisJSEZTX0koaW5vZGUpLT5yc3JjX2lub2RlID0gTlVMTDsKKwlpbml0X01VVEVYKCZIRlNfSShpbm9kZSktPmV4dGVudHNfbG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJkhGU19JKGlub2RlKS0+b3Blbl9kaXJfbGlzdCk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBpbm9kZSAqLworCWlub2RlLT5pX3VpZCA9IGhzYi0+c191aWQ7CisJaW5vZGUtPmlfZ2lkID0gaHNiLT5zX2dpZDsKKwlpbm9kZS0+aV9ubGluayA9IDE7CisJaW5vZGUtPmlfYmxrc2l6ZSA9IEhGU19TQihpbm9kZS0+aV9zYiktPmFsbG9jX2Jsa3N6OworCisJaWYgKGlkYXRhLT5rZXkpCisJCUhGU19JKGlub2RlKS0+Y2F0X2tleSA9ICppZGF0YS0+a2V5OworCWVsc2UKKwkJSEZTX0koaW5vZGUpLT5mbGFncyB8PSBIRlNfRkxHX1JTUkM7CisJSEZTX0koaW5vZGUpLT50el9zZWNvbmRzd2VzdCA9IHN5c190ei50el9taW51dGVzd2VzdCAqIDYwOworCisJcmVjID0gaWRhdGEtPnJlYzsKKwlzd2l0Y2ggKHJlYy0+dHlwZSkgeworCWNhc2UgSEZTX0NEUl9GSUw6CisJCWlmICghSEZTX0lTX1JTUkMoaW5vZGUpKSB7CisJCQloZnNfaW5vZGVfcmVhZF9mb3JrKGlub2RlLCByZWMtPmZpbGUuRXh0UmVjLCByZWMtPmZpbGUuTGdMZW4sCisJCQkJCSAgICByZWMtPmZpbGUuUHlMZW4sIGJlMTZfdG9fY3B1KHJlYy0+ZmlsZS5DbHBTaXplKSk7CisJCX0gZWxzZSB7CisJCQloZnNfaW5vZGVfcmVhZF9mb3JrKGlub2RlLCByZWMtPmZpbGUuUkV4dFJlYywgcmVjLT5maWxlLlJMZ0xlbiwKKwkJCQkJICAgIHJlYy0+ZmlsZS5SUHlMZW4sIGJlMTZfdG9fY3B1KHJlYy0+ZmlsZS5DbHBTaXplKSk7CisJCX0KKworCQlpbm9kZS0+aV9pbm8gPSBiZTMyX3RvX2NwdShyZWMtPmZpbGUuRmxOdW0pOworCQlpbm9kZS0+aV9tb2RlID0gU19JUlVHTyB8IFNfSVhVR087CisJCWlmICghKHJlYy0+ZmlsZS5GbGFncyAmIEhGU19GSUxfTE9DSykpCisJCQlpbm9kZS0+aV9tb2RlIHw9IFNfSVdVR087CisJCWlub2RlLT5pX21vZGUgJj0gfmhzYi0+c19maWxlX3VtYXNrOworCQlpbm9kZS0+aV9tb2RlIHw9IFNfSUZSRUc7CisJCWlub2RlLT5pX2N0aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9CisJCQkJaGZzX21fdG9fdXRpbWUocmVjLT5maWxlLk1kRGF0KTsKKwkJaW5vZGUtPmlfb3AgPSAmaGZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJmhmc19maWxlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmhmc19hb3BzOworCQlicmVhazsKKwljYXNlIEhGU19DRFJfRElSOgorCQlpbm9kZS0+aV9pbm8gPSBiZTMyX3RvX2NwdShyZWMtPmRpci5EaXJJRCk7CisJCWlub2RlLT5pX3NpemUgPSBiZTE2X3RvX2NwdShyZWMtPmRpci5WYWwpICsgMjsKKwkJSEZTX0koaW5vZGUpLT5mc19ibG9ja3MgPSAwOworCQlpbm9kZS0+aV9tb2RlID0gU19JRkRJUiB8IChTX0lSV1hVR08gJiB+aHNiLT5zX2Rpcl91bWFzayk7CisJCWlub2RlLT5pX2N0aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9CisJCQkJaGZzX21fdG9fdXRpbWUocmVjLT5kaXIuTWREYXQpOworCQlpbm9kZS0+aV9vcCA9ICZoZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZoZnNfZGlyX29wZXJhdGlvbnM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBfX2hmc19pZ2V0KCkKKyAqCisgKiBHaXZlbiB0aGUgTURCIGZvciBhIEhGUyBmaWxlc3lzdGVtLCBhICdrZXknIGFuZCBhbiAnZW50cnknIGluCisgKiB0aGUgY2F0YWxvZyBCLXRyZWUgYW5kIHRoZSAndHlwZScgb2YgdGhlIGRlc2lyZWQgZmlsZSByZXR1cm4gdGhlCisgKiBpbm9kZSBmb3IgdGhhdCBmaWxlL2RpcmVjdG9yeSBvciBOVUxMLiAgTm90ZSB0aGF0ICd0eXBlJyBpbmRpY2F0ZXMKKyAqIHdoZXRoZXIgd2Ugd2FudCB0aGUgYWN0dWFsIGZpbGUgb3IgZGlyZWN0b3J5LCBvciB0aGUgY29ycmVzcG9uZGluZworICogbWV0YWRhdGEgKEFwcGxlRG91YmxlIGhlYWRlciBmaWxlIG9yIENBUCBtZXRhZGF0YSBmaWxlKS4KKyAqLworc3RydWN0IGlub2RlICpoZnNfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgaGZzX2NhdF9rZXkgKmtleSwgaGZzX2NhdF9yZWMgKnJlYykKK3sKKwlzdHJ1Y3QgaGZzX2lnZXRfZGF0YSBkYXRhID0geyBrZXksIHJlYyB9OworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJdTMyIGNuaWQ7CisKKwlzd2l0Y2ggKHJlYy0+dHlwZSkgeworCWNhc2UgSEZTX0NEUl9ESVI6CisJCWNuaWQgPSBiZTMyX3RvX2NwdShyZWMtPmRpci5EaXJJRCk7CisJCWJyZWFrOworCWNhc2UgSEZTX0NEUl9GSUw6CisJCWNuaWQgPSBiZTMyX3RvX2NwdShyZWMtPmZpbGUuRmxOdW0pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTlVMTDsKKwl9CisJaW5vZGUgPSBpZ2V0NV9sb2NrZWQoc2IsIGNuaWQsIGhmc190ZXN0X2lub2RlLCBoZnNfcmVhZF9pbm9kZSwgJmRhdGEpOworCWlmIChpbm9kZSAmJiAoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykpCisJCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOworCXJldHVybiBpbm9kZTsKK30KKwordm9pZCBoZnNfaW5vZGVfd3JpdGVfZm9yayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaGZzX2V4dGVudCAqZXh0LAorCQkJICBfX2JlMzIgKmxvZ19zaXplLCBfX2JlMzIgKnBoeXNfc2l6ZSkKK3sKKwltZW1jcHkoZXh0LCBIRlNfSShpbm9kZSktPmZpcnN0X2V4dGVudHMsIHNpemVvZihoZnNfZXh0ZW50X3JlYykpOworCisJaWYgKGxvZ19zaXplKQorCQkqbG9nX3NpemUgPSBjcHVfdG9fYmUzMihpbm9kZS0+aV9zaXplKTsKKwlpZiAocGh5c19zaXplKQorCQkqcGh5c19zaXplID0gY3B1X3RvX2JlMzIoSEZTX0koaW5vZGUpLT5hbGxvY19ibG9ja3MgKgorCQkJCQkgSEZTX1NCKGlub2RlLT5pX3NiKS0+YWxsb2NfYmxrc3opOworfQorCitpbnQgaGZzX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB1bnVzZWQpCit7CisJc3RydWN0IGlub2RlICptYWluX2lub2RlID0gaW5vZGU7CisJc3RydWN0IGhmc19maW5kX2RhdGEgZmQ7CisJaGZzX2NhdF9yZWMgcmVjOworCisJZHByaW50KERCR19JTk9ERSwgImhmc193cml0ZV9pbm9kZTogJWx1XG4iLCBpbm9kZS0+aV9pbm8pOworCWhmc19leHRfd3JpdGVfZXh0ZW50KGlub2RlKTsKKworCWlmIChpbm9kZS0+aV9pbm8gPCBIRlNfRklSU1RVU0VSX0NOSUQpIHsKKwkJc3dpdGNoIChpbm9kZS0+aV9pbm8pIHsKKwkJY2FzZSBIRlNfUk9PVF9DTklEOgorCQkJYnJlYWs7CisJCWNhc2UgSEZTX0VYVF9DTklEOgorCQkJaGZzX2J0cmVlX3dyaXRlKEhGU19TQihpbm9kZS0+aV9zYiktPmV4dF90cmVlKTsKKwkJCXJldHVybiAwOworCQljYXNlIEhGU19DQVRfQ05JRDoKKwkJCWhmc19idHJlZV93cml0ZShIRlNfU0IoaW5vZGUtPmlfc2IpLT5jYXRfdHJlZSk7CisJCQlyZXR1cm4gMDsKKwkJZGVmYXVsdDoKKwkJCUJVRygpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisKKwlpZiAoSEZTX0lTX1JTUkMoaW5vZGUpKQorCQltYWluX2lub2RlID0gSEZTX0koaW5vZGUpLT5yc3JjX2lub2RlOworCisJaWYgKCFtYWluX2lub2RlLT5pX25saW5rKQorCQlyZXR1cm4gMDsKKworCWlmIChoZnNfZmluZF9pbml0KEhGU19TQihtYWluX2lub2RlLT5pX3NiKS0+Y2F0X3RyZWUsICZmZCkpCisJCS8qIHBhbmljPyAqLworCQlyZXR1cm4gLUVJTzsKKworCWZkLnNlYXJjaF9rZXktPmNhdCA9IEhGU19JKG1haW5faW5vZGUpLT5jYXRfa2V5OworCWlmIChoZnNfYnJlY19maW5kKCZmZCkpCisJCS8qIHBhbmljPyAqLworCQlnb3RvIG91dDsKKworCWlmIChTX0lTRElSKG1haW5faW5vZGUtPmlfbW9kZSkpIHsKKwkJaWYgKGZkLmVudHJ5bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBoZnNfY2F0X2RpcikpCisJCQkvKiBwYW5pYz8gKi87CisJCWhmc19ibm9kZV9yZWFkKGZkLmJub2RlLCAmcmVjLCBmZC5lbnRyeW9mZnNldCwKKwkJCSAgIHNpemVvZihzdHJ1Y3QgaGZzX2NhdF9kaXIpKTsKKwkJaWYgKHJlYy50eXBlICE9IEhGU19DRFJfRElSIHx8CisJCSAgICBiZTMyX3RvX2NwdShyZWMuZGlyLkRpcklEKSAhPSBpbm9kZS0+aV9pbm8pIHsKKwkJfQorCisJCXJlYy5kaXIuTWREYXQgPSBoZnNfdV90b19tdGltZShpbm9kZS0+aV9tdGltZSk7CisJCXJlYy5kaXIuVmFsID0gY3B1X3RvX2JlMTYoaW5vZGUtPmlfc2l6ZSAtIDIpOworCisJCWhmc19ibm9kZV93cml0ZShmZC5ibm9kZSwgJnJlYywgZmQuZW50cnlvZmZzZXQsCisJCQkgICAgc2l6ZW9mKHN0cnVjdCBoZnNfY2F0X2RpcikpOworCX0gZWxzZSBpZiAoSEZTX0lTX1JTUkMoaW5vZGUpKSB7CisJCWhmc19ibm9kZV9yZWFkKGZkLmJub2RlLCAmcmVjLCBmZC5lbnRyeW9mZnNldCwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGhmc19jYXRfZmlsZSkpOworCQloZnNfaW5vZGVfd3JpdGVfZm9yayhpbm9kZSwgcmVjLmZpbGUuUkV4dFJlYywKKwkJCQkgICAgICZyZWMuZmlsZS5STGdMZW4sICZyZWMuZmlsZS5SUHlMZW4pOworCQloZnNfYm5vZGVfd3JpdGUoZmQuYm5vZGUsICZyZWMsIGZkLmVudHJ5b2Zmc2V0LAorCQkJCXNpemVvZihzdHJ1Y3QgaGZzX2NhdF9maWxlKSk7CisJfSBlbHNlIHsKKwkJaWYgKGZkLmVudHJ5bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBoZnNfY2F0X2ZpbGUpKQorCQkJLyogcGFuaWM/ICovOworCQloZnNfYm5vZGVfcmVhZChmZC5ibm9kZSwgJnJlYywgZmQuZW50cnlvZmZzZXQsCisJCQkgICBzaXplb2Yoc3RydWN0IGhmc19jYXRfZmlsZSkpOworCQlpZiAocmVjLnR5cGUgIT0gSEZTX0NEUl9GSUwgfHwKKwkJICAgIGJlMzJfdG9fY3B1KHJlYy5maWxlLkZsTnVtKSAhPSBpbm9kZS0+aV9pbm8pIHsKKwkJfQorCisJCWlmIChpbm9kZS0+aV9tb2RlICYgU19JV1VTUikKKwkJCXJlYy5maWxlLkZsYWdzICY9IH5IRlNfRklMX0xPQ0s7CisJCWVsc2UKKwkJCXJlYy5maWxlLkZsYWdzIHw9IEhGU19GSUxfTE9DSzsKKwkJaGZzX2lub2RlX3dyaXRlX2ZvcmsoaW5vZGUsIHJlYy5maWxlLkV4dFJlYywgJnJlYy5maWxlLkxnTGVuLCAmcmVjLmZpbGUuUHlMZW4pOworCQlyZWMuZmlsZS5NZERhdCA9IGhmc191X3RvX210aW1lKGlub2RlLT5pX210aW1lKTsKKworCQloZnNfYm5vZGVfd3JpdGUoZmQuYm5vZGUsICZyZWMsIGZkLmVudHJ5b2Zmc2V0LAorCQkJICAgIHNpemVvZihzdHJ1Y3QgaGZzX2NhdF9maWxlKSk7CisJfQorb3V0OgorCWhmc19maW5kX2V4aXQoJmZkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmhmc19maWxlX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJCSAgICAgIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOworCWhmc19jYXRfcmVjIHJlYzsKKwlzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSBmZDsKKwlpbnQgcmVzOworCisJaWYgKEhGU19JU19SU1JDKGRpcikgfHwgc3RyY21wKGRlbnRyeS0+ZF9uYW1lLm5hbWUsICJyc3JjIikpCisJCWdvdG8gb3V0OworCisJaW5vZGUgPSBIRlNfSShkaXIpLT5yc3JjX2lub2RlOworCWlmIChpbm9kZSkKKwkJZ290byBvdXQ7CisKKwlpbm9kZSA9IG5ld19pbm9kZShkaXItPmlfc2IpOworCWlmICghaW5vZGUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaGZzX2ZpbmRfaW5pdChIRlNfU0IoZGlyLT5pX3NiKS0+Y2F0X3RyZWUsICZmZCk7CisJZmQuc2VhcmNoX2tleS0+Y2F0ID0gSEZTX0koZGlyKS0+Y2F0X2tleTsKKwlyZXMgPSBoZnNfYnJlY19yZWFkKCZmZCwgJnJlYywgc2l6ZW9mKHJlYykpOworCWlmICghcmVzKSB7CisJCXN0cnVjdCBoZnNfaWdldF9kYXRhIGlkYXRhID0geyBOVUxMLCAmcmVjIH07CisJCWhmc19yZWFkX2lub2RlKGlub2RlLCAmaWRhdGEpOworCX0KKwloZnNfZmluZF9leGl0KCZmZCk7CisJaWYgKHJlcykgeworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIEVSUl9QVFIocmVzKTsKKwl9CisJSEZTX0koaW5vZGUpLT5yc3JjX2lub2RlID0gZGlyOworCUhGU19JKGRpciktPnJzcmNfaW5vZGUgPSBpbm9kZTsKKwlpZ3JhYihkaXIpOworCWhsaXN0X2FkZF9oZWFkKCZpbm9kZS0+aV9oYXNoLCAmSEZTX1NCKGRpci0+aV9zYiktPnJzcmNfaW5vZGVzKTsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKK291dDoKKwlkX2FkZChkZW50cnksIGlub2RlKTsKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBoZnNfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpZiAoSEZTX0lTX1JTUkMoaW5vZGUpICYmIEhGU19JKGlub2RlKS0+cnNyY19pbm9kZSkgeworCQlIRlNfSShIRlNfSShpbm9kZSktPnJzcmNfaW5vZGUpLT5yc3JjX2lub2RlID0gTlVMTDsKKwkJaXB1dChIRlNfSShpbm9kZSktPnJzcmNfaW5vZGUpOworCX0KK30KKworc3RhdGljIGludCBoZnNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywKKwkJCSAgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYgbWFzayAmIE1BWV9FWEVDKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrLCBOVUxMKTsKK30KKworc3RhdGljIGludCBoZnNfZmlsZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChIRlNfSVNfUlNSQyhpbm9kZSkpCisJCWlub2RlID0gSEZTX0koaW5vZGUpLT5yc3JjX2lub2RlOworCWlmIChhdG9taWNfcmVhZCgmZmlsZS0+Zl9jb3VudCkgIT0gMSkKKwkJcmV0dXJuIDA7CisJYXRvbWljX2luYygmSEZTX0koaW5vZGUpLT5vcGVuY250KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZnNfZmlsZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8vc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCisJaWYgKEhGU19JU19SU1JDKGlub2RlKSkKKwkJaW5vZGUgPSBIRlNfSShpbm9kZSktPnJzcmNfaW5vZGU7CisJaWYgKGF0b21pY19yZWFkKCZmaWxlLT5mX2NvdW50KSAhPSAwKQorCQlyZXR1cm4gMDsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmSEZTX0koaW5vZGUpLT5vcGVuY250KSkgeworCQlkb3duKCZpbm9kZS0+aV9zZW0pOworCQloZnNfZmlsZV90cnVuY2F0ZShpbm9kZSk7CisJCS8vaWYgKGlub2RlLT5pX2ZsYWdzICYgU19ERUFEKSB7CisJCS8vCWhmc19kZWxldGVfY2F0KGlub2RlLT5pX2lubywgSEZTUExVU19TQihzYikuaGlkZGVuX2RpciwgTlVMTCk7CisJCS8vCWhmc19kZWxldGVfaW5vZGUoaW5vZGUpOworCQkvL30KKwkJdXAoJmlub2RlLT5pX3NlbSk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogaGZzX25vdGlmeV9jaGFuZ2UoKQorICoKKyAqIEJhc2VkIHZlcnkgY2xvc2VseSBvbiBmcy9tc2Rvcy9pbm9kZS5jIGJ5IFdlcm5lciBBbG1lc2JlcmdlcgorICoKKyAqIFRoaXMgaXMgdGhlIG5vdGlmeV9jaGFuZ2UoKSBmaWVsZCBpbiB0aGUgc3VwZXJfb3BlcmF0aW9ucyBzdHJ1Y3R1cmUKKyAqIGZvciBIRlMgZmlsZSBzeXN0ZW1zLiAgVGhlIHB1cnBvc2UgaXMgdG8gdGFrZSB0aGF0IGNoYW5nZXMgbWFkZSB0bworICogYW4gaW5vZGUgYW5kIGFwcGx5IHRoZW4gaW4gYSBmaWxlc3lzdGVtLWRlcGVuZGVudCBtYW5uZXIuICBJbiB0aGlzCisgKiBjYXNlIHRoZSBwcm9jZXNzIGhhcyBhIGZldyBvZiB0YXNrcyB0byBkbzoKKyAqICAxKSBwcmV2ZW50IGNoYW5nZXMgdG8gdGhlIGlfdWlkIGFuZCBpX2dpZCBmaWVsZHMuCisgKiAgMikgbWFwIGZpbGUgcGVybWlzc2lvbnMgdG8gdGhlIGNsb3Nlc3QgYWxsb3dhYmxlIHBlcm1pc3Npb25zCisgKiAgMykgU2luY2UgbXVsdGlwbGUgTGludXggZmlsZXMgY2FuIHNoYXJlIHRoZSBzYW1lIG9uLWRpc2sgaW5vZGUgdW5kZXIKKyAqICAgICBIRlMgKGZvciBpbnN0YW5jZSB0aGUgZGF0YSBhbmQgcmVzb3VyY2UgZm9ya3Mgb2YgYSBmaWxlKSBhIGNoYW5nZQorICogICAgIHRvIHBlcm1pc3Npb25zIG11c3QgYmUgYXBwbGllZCB0byBhbGwgb3RoZXIgaW4tY29yZSBpbm9kZXMgd2hpY2gKKyAqICAgICBjb3JyZXNwb25kIHRvIHRoZSBzYW1lIEhGUyBmaWxlLgorICovCisKK2ludCBoZnNfaW5vZGVfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqIGF0dHIpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaGZzX3NiX2luZm8gKmhzYiA9IEhGU19TQihpbm9kZS0+aV9zYik7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBpbm9kZV9jaGFuZ2Vfb2soaW5vZGUsIGF0dHIpOyAvKiBiYXNpYyBwZXJtaXNzaW9uIGNoZWNrcyAqLworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJLyogbm8gdWlnL2dpZCBjaGFuZ2VzIGFuZCBsaW1pdCB3aGljaCBtb2RlIGJpdHMgY2FuIGJlIHNldCAqLworCWlmICgoKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9VSUQpICYmCisJICAgICAoYXR0ci0+aWFfdWlkICE9IGhzYi0+c191aWQpKSB8fAorCSAgICAoKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9HSUQpICYmCisJICAgICAoYXR0ci0+aWFfZ2lkICE9IGhzYi0+c19naWQpKSB8fAorCSAgICAoKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9NT0RFKSAmJgorCSAgICAgKChTX0lTRElSKGlub2RlLT5pX21vZGUpICYmCisJICAgICAgIChhdHRyLT5pYV9tb2RlICE9IGlub2RlLT5pX21vZGUpKSB8fAorCSAgICAgIChhdHRyLT5pYV9tb2RlICYgfkhGU19WQUxJRF9NT0RFX0JJVFMpKSkpIHsKKwkJcmV0dXJuIGhzYi0+c19xdWlldCA/IDAgOiBlcnJvcjsKKwl9CisKKwlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01PREUpIHsKKwkJLyogT25seSB0aGUgJ3cnIGJpdHMgY2FuIGV2ZXIgY2hhbmdlIGFuZCBvbmx5IGFsbCB0b2dldGhlci4gKi8KKwkJaWYgKGF0dHItPmlhX21vZGUgJiBTX0lXVVNSKQorCQkJYXR0ci0+aWFfbW9kZSA9IGlub2RlLT5pX21vZGUgfCBTX0lXVUdPOworCQllbHNlCisJCQlhdHRyLT5pYV9tb2RlID0gaW5vZGUtPmlfbW9kZSAmIH5TX0lXVUdPOworCQlhdHRyLT5pYV9tb2RlICY9IFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgPyB+aHNiLT5zX2Rpcl91bWFzazogfmhzYi0+c19maWxlX3VtYXNrOworCX0KKwllcnJvciA9IGlub2RlX3NldGF0dHIoaW5vZGUsIGF0dHIpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaGZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlYWQJCT0gZ2VuZXJpY19maWxlX3JlYWQsCisJLndyaXRlCQk9IGdlbmVyaWNfZmlsZV93cml0ZSwKKwkubW1hcAkJPSBnZW5lcmljX2ZpbGVfbW1hcCwKKwkuc2VuZGZpbGUJPSBnZW5lcmljX2ZpbGVfc2VuZGZpbGUsCisJLmZzeW5jCQk9IGZpbGVfZnN5bmMsCisJLm9wZW4JCT0gaGZzX2ZpbGVfb3BlbiwKKwkucmVsZWFzZQk9IGhmc19maWxlX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgaGZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkubG9va3VwCQk9IGhmc19maWxlX2xvb2t1cCwKKwkudHJ1bmNhdGUJPSBoZnNfZmlsZV90cnVuY2F0ZSwKKwkuc2V0YXR0cgk9IGhmc19pbm9kZV9zZXRhdHRyLAorCS5wZXJtaXNzaW9uCT0gaGZzX3Blcm1pc3Npb24sCisJLnNldHhhdHRyCT0gaGZzX3NldHhhdHRyLAorCS5nZXR4YXR0cgk9IGhmc19nZXR4YXR0ciwKKwkubGlzdHhhdHRyCT0gaGZzX2xpc3R4YXR0ciwKK307CmRpZmYgLS1naXQgYS9mcy9oZnMvbWRiLmMgYi9mcy9oZnMvbWRiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVmYjY0MAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmcy9tZGIuYwpAQCAtMCwwICsxLDM0MyBAQAorLyoKKyAqICBsaW51eC9mcy9oZnMvbWRiLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NyAgUGF1bCBILiBIYXJncm92ZQorICogKEMpIDIwMDMgQXJkaXMgVGVjaG5vbG9naWVzIDxyb21hbkBhcmRpc3RlY2guY29tPgorICogVGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgZm9yIHJlYWRpbmcvd3JpdGluZyB0aGUgTURCLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jZHJvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+CisKKyNpbmNsdWRlICJoZnNfZnMuaCIKKyNpbmNsdWRlICJidHJlZS5oIgorCisvKj09PT09PT09PT09PT09PT0gRmlsZS1sb2NhbCBkYXRhIHR5cGVzID09PT09PT09PT09PT09PT0qLworCisvKgorICogVGhlIEhGUyBNYXN0ZXIgRGlyZWN0b3J5IEJsb2NrIChNREIpLgorICoKKyAqIEFsc28ga25vd24gYXMgdGhlIFZvbHVtZSBJbmZvcm1hdGlvbiBCbG9jayAoVklCKSwgdGhpcyBzdHJ1Y3R1cmUgaXMKKyAqIHRoZSBIRlMgZXF1aXZhbGVudCBvZiBhIHN1cGVyYmxvY2suCisgKgorICogUmVmZXJlbmNlOiBfSW5zaWRlIE1hY2ludG9zaDogRmlsZXNfIHBhZ2VzIDItNTkgdGhyb3VnaCAyLTYyCisgKgorICogbW9kaWZpZWQgZm9yIEhGUyBFeHRlbmRlZAorICovCisKK3N0YXRpYyBpbnQgaGZzX2dldF9sYXN0X3Nlc3Npb24oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQlzZWN0b3JfdCAqc3RhcnQsIHNlY3Rvcl90ICpzaXplKQoreworCXN0cnVjdCBjZHJvbV9tdWx0aXNlc3Npb24gbXNfaW5mbzsKKwlzdHJ1Y3QgY2Ryb21fdG9jZW50cnkgdGU7CisJaW50IHJlczsKKworCS8qIGRlZmF1bHQgdmFsdWVzICovCisJKnN0YXJ0ID0gMDsKKwkqc2l6ZSA9IHNiLT5zX2JkZXYtPmJkX2lub2RlLT5pX3NpemUgPj4gOTsKKworCWlmIChIRlNfU0Ioc2IpLT5zZXNzaW9uID49IDApIHsKKwkJdGUuY2R0ZV90cmFjayA9IEhGU19TQihzYiktPnNlc3Npb247CisJCXRlLmNkdGVfZm9ybWF0ID0gQ0RST01fTEJBOworCQlyZXMgPSBpb2N0bF9ieV9iZGV2KHNiLT5zX2JkZXYsIENEUk9NUkVBRFRPQ0VOVFJZLCAodW5zaWduZWQgbG9uZykmdGUpOworCQlpZiAoIXJlcyAmJiAodGUuY2R0ZV9jdHJsICYgQ0RST01fREFUQV9UUkFDSykgPT0gNCkgeworCQkJKnN0YXJ0ID0gKHNlY3Rvcl90KXRlLmNkdGVfYWRkci5sYmEgPDwgMjsKKwkJCXJldHVybiAwOworCQl9CisJCXByaW50ayhLRVJOX0VSUiAiSEZTOiBJbnZhbGlkIHNlc3Npb24gbnVtYmVyIG9yIHR5cGUgb2YgdHJhY2tcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbXNfaW5mby5hZGRyX2Zvcm1hdCA9IENEUk9NX0xCQTsKKwlyZXMgPSBpb2N0bF9ieV9iZGV2KHNiLT5zX2JkZXYsIENEUk9NTVVMVElTRVNTSU9OLCAodW5zaWduZWQgbG9uZykmbXNfaW5mbyk7CisJaWYgKCFyZXMgJiYgbXNfaW5mby54YV9mbGFnKQorCQkqc3RhcnQgPSAoc2VjdG9yX3QpbXNfaW5mby5hZGRyLmxiYSA8PCAyOworCXJldHVybiAwOworfQorCisvKgorICogaGZzX21kYl9nZXQoKQorICoKKyAqIEJ1aWxkIHRoZSBpbi1jb3JlIE1EQiBmb3IgYSBmaWxlc3lzdGVtLCBpbmNsdWRpbmcKKyAqIHRoZSBCLXRyZWVzIGFuZCB0aGUgdm9sdW1lIGJpdG1hcC4KKyAqLworaW50IGhmc19tZGJfZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgaGZzX21kYiAqbWRiLCAqbWRiMjsKKwl1bnNpZ25lZCBpbnQgYmxvY2s7CisJY2hhciAqcHRyOworCWludCBvZmYyLCBsZW4sIHNpemUsIHNlY3Q7CisJc2VjdG9yX3QgcGFydF9zdGFydCwgcGFydF9zaXplOworCWxvZmZfdCBvZmY7CisJX19iZTE2IGF0dHJpYjsKKworCS8qIHNldCB0aGUgZGV2aWNlIGRyaXZlciB0byA1MTItYnl0ZSBibG9ja3MgKi8KKwlzaXplID0gc2JfbWluX2Jsb2Nrc2l6ZShzYiwgSEZTX1NFQ1RPUl9TSVpFKTsKKwlpZiAoIXNpemUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGhmc19nZXRfbGFzdF9zZXNzaW9uKHNiLCAmcGFydF9zdGFydCwgJnBhcnRfc2l6ZSkpCisJCXJldHVybiAtRUlOVkFMOworCXdoaWxlICgxKSB7CisJCS8qIFNlZSBpZiB0aGlzIGlzIGFuIEhGUyBmaWxlc3lzdGVtICovCisJCWJoID0gc2JfYnJlYWQ1MTIoc2IsIHBhcnRfc3RhcnQgKyBIRlNfTURCX0JMSywgbWRiKTsKKwkJaWYgKCFiaCkKKwkJCWdvdG8gb3V0OworCisJCWlmIChtZGItPmRyU2lnV29yZCA9PSBjcHVfdG9fYmUxNihIRlNfU1VQRVJfTUFHSUMpKQorCQkJYnJlYWs7CisJCWJyZWxzZShiaCk7CisKKwkJLyogY2hlY2sgZm9yIGEgcGFydGl0aW9uIGJsb2NrCisJCSAqIChzaG91bGQgZG8gdGhpcyBvbmx5IGZvciBjZHJvbS9sb29wIHRob3VnaCkKKwkJICovCisJCWlmIChoZnNfcGFydF9maW5kKHNiLCAmcGFydF9zdGFydCwgJnBhcnRfc2l6ZSkpCisJCQlnb3RvIG91dDsKKwl9CisKKwlIRlNfU0Ioc2IpLT5hbGxvY19ibGtzeiA9IHNpemUgPSBiZTMyX3RvX2NwdShtZGItPmRyQWxCbGtTaXopOworCWlmICghc2l6ZSB8fCAoc2l6ZSAmIChIRlNfU0VDVE9SX1NJWkUgLSAxKSkpIHsKKwkJaGZzX3dhcm4oImhmc19mczogYmFkIGFsbG9jYXRpb24gYmxvY2sgc2l6ZSAlZFxuIiwgc2l6ZSk7CisJCWdvdG8gb3V0X2JoOworCX0KKworCXNpemUgPSBtaW4oSEZTX1NCKHNiKS0+YWxsb2NfYmxrc3osICh1MzIpUEFHRV9TSVpFKTsKKwkvKiBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA1MTIgKi8KKwl3aGlsZSAoc2l6ZSAmIChzaXplIC0gMSkpCisJCXNpemUgLT0gSEZTX1NFQ1RPUl9TSVpFOworCXNlY3QgPSBiZTE2X3RvX2NwdShtZGItPmRyQWxCbFN0KSArIHBhcnRfc3RhcnQ7CisJLyogYWxpZ24gYmxvY2sgc2l6ZSB0byBmaXJzdCBzZWN0b3IgKi8KKwl3aGlsZSAoc2VjdCAmICgoc2l6ZSAtIDEpID4+IEhGU19TRUNUT1JfU0laRV9CSVRTKSkKKwkJc2l6ZSA+Pj0gMTsKKwkvKiBhbGlnbiBibG9jayBzaXplIHRvIHdlaXJkIGFsbG9jIHNpemUgKi8KKwl3aGlsZSAoSEZTX1NCKHNiKS0+YWxsb2NfYmxrc3ogJiAoc2l6ZSAtIDEpKQorCQlzaXplID4+PSAxOworCWJyZWxzZShiaCk7CisJaWYgKCFzYl9zZXRfYmxvY2tzaXplKHNiLCBzaXplKSkgeworCQlwcmludGsoImhmc19mczogdW5hYmxlIHRvIHNldCBibG9ja3NpemUgdG8gJXVcbiIsIHNpemUpOworCQlnb3RvIG91dDsKKwl9CisKKwliaCA9IHNiX2JyZWFkNTEyKHNiLCBwYXJ0X3N0YXJ0ICsgSEZTX01EQl9CTEssIG1kYik7CisJaWYgKCFiaCkKKwkJZ290byBvdXQ7CisJaWYgKG1kYi0+ZHJTaWdXb3JkICE9IGNwdV90b19iZTE2KEhGU19TVVBFUl9NQUdJQykpCisJCWdvdG8gb3V0X2JoOworCisJSEZTX1NCKHNiKS0+bWRiX2JoID0gYmg7CisJSEZTX1NCKHNiKS0+bWRiID0gbWRiOworCisJLyogVGhlc2UgcGFyYW1ldGVycyBhcmUgcmVhZCBmcm9tIHRoZSBNREIsIGFuZCBuZXZlciB3cml0dGVuICovCisJSEZTX1NCKHNiKS0+cGFydF9zdGFydCA9IHBhcnRfc3RhcnQ7CisJSEZTX1NCKHNiKS0+ZnNfYWJsb2NrcyA9IGJlMTZfdG9fY3B1KG1kYi0+ZHJObUFsQmxrcyk7CisJSEZTX1NCKHNiKS0+ZnNfZGl2ID0gSEZTX1NCKHNiKS0+YWxsb2NfYmxrc3ogPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJSEZTX1NCKHNiKS0+Y2x1bXBhYmxrcyA9IGJlMzJfdG9fY3B1KG1kYi0+ZHJDbHBTaXopIC8KKwkJCQkgSEZTX1NCKHNiKS0+YWxsb2NfYmxrc3o7CisJaWYgKCFIRlNfU0Ioc2IpLT5jbHVtcGFibGtzKQorCQlIRlNfU0Ioc2IpLT5jbHVtcGFibGtzID0gMTsKKwlIRlNfU0Ioc2IpLT5mc19zdGFydCA9IChiZTE2X3RvX2NwdShtZGItPmRyQWxCbFN0KSArIHBhcnRfc3RhcnQpID4+CisJCQkgICAgICAgKHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gSEZTX1NFQ1RPUl9TSVpFX0JJVFMpOworCisJLyogVGhlc2UgcGFyYW1ldGVycyBhcmUgcmVhZCBmcm9tIGFuZCB3cml0dGVuIHRvIHRoZSBNREIgKi8KKwlIRlNfU0Ioc2IpLT5mcmVlX2FibG9ja3MgPSBiZTE2X3RvX2NwdShtZGItPmRyRnJlZUJrcyk7CisJSEZTX1NCKHNiKS0+bmV4dF9pZCA9IGJlMzJfdG9fY3B1KG1kYi0+ZHJOeHRDTklEKTsKKwlIRlNfU0Ioc2IpLT5yb290X2ZpbGVzID0gYmUxNl90b19jcHUobWRiLT5kck5tRmxzKTsKKwlIRlNfU0Ioc2IpLT5yb290X2RpcnMgPSBiZTE2X3RvX2NwdShtZGItPmRyTm1SdERpcnMpOworCUhGU19TQihzYiktPmZpbGVfY291bnQgPSBiZTMyX3RvX2NwdShtZGItPmRyRmlsQ250KTsKKwlIRlNfU0Ioc2IpLT5mb2xkZXJfY291bnQgPSBiZTMyX3RvX2NwdShtZGItPmRyRGlyQ250KTsKKworCS8qIFRSWSB0byBnZXQgdGhlIGFsdGVybmF0ZSAoYmFja3VwKSBNREIuICovCisJc2VjdCA9IHBhcnRfc3RhcnQgKyBwYXJ0X3NpemUgLSAyOworCWJoID0gc2JfYnJlYWQ1MTIoc2IsIHNlY3QsIG1kYjIpOworCWlmIChiaCkgeworCQlpZiAobWRiMi0+ZHJTaWdXb3JkID09IGNwdV90b19iZTE2KEhGU19TVVBFUl9NQUdJQykpIHsKKwkJCUhGU19TQihzYiktPmFsdF9tZGJfYmggPSBiaDsKKwkJCUhGU19TQihzYiktPmFsdF9tZGIgPSBtZGIyOworCQl9IGVsc2UKKwkJCWJyZWxzZShiaCk7CisJfQorCisJaWYgKCFIRlNfU0Ioc2IpLT5hbHRfbWRiKSB7CisJCWhmc193YXJuKCJoZnNfZnM6IHVuYWJsZSB0byBsb2NhdGUgYWx0ZXJuYXRlIE1EQlxuIik7CisJCWhmc193YXJuKCJoZnNfZnM6IGNvbnRpbnVpbmcgd2l0aG91dCBhbiBhbHRlcm5hdGUgTURCXG4iKTsKKwl9CisKKwlIRlNfU0Ioc2IpLT5iaXRtYXAgPSAoX19iZTMyICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBQQUdFX1NJWkUgPCA4MTkyID8gMSA6IDApOworCWlmICghSEZTX1NCKHNiKS0+Yml0bWFwKQorCQlnb3RvIG91dDsKKworCS8qIHJlYWQgaW4gdGhlIGJpdG1hcCAqLworCWJsb2NrID0gYmUxNl90b19jcHUobWRiLT5kclZCTVN0KSArIHBhcnRfc3RhcnQ7CisJb2ZmID0gKGxvZmZfdClibG9jayA8PCBIRlNfU0VDVE9SX1NJWkVfQklUUzsKKwlzaXplID0gKEhGU19TQihzYiktPmZzX2FibG9ja3MgKyA4KSAvIDg7CisJcHRyID0gKHU4ICopSEZTX1NCKHNiKS0+Yml0bWFwOworCXdoaWxlIChzaXplKSB7CisJCWJoID0gc2JfYnJlYWQoc2IsIG9mZiA+PiBzYi0+c19ibG9ja3NpemVfYml0cyk7CisJCWlmICghYmgpIHsKKwkJCWhmc193YXJuKCJoZnNfZnM6IHVuYWJsZSB0byByZWFkIHZvbHVtZSBiaXRtYXBcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKwkJb2ZmMiA9IG9mZiAmIChzYi0+c19ibG9ja3NpemUgLSAxKTsKKwkJbGVuID0gbWluKChpbnQpc2ItPnNfYmxvY2tzaXplIC0gb2ZmMiwgc2l6ZSk7CisJCW1lbWNweShwdHIsIGJoLT5iX2RhdGEgKyBvZmYyLCBsZW4pOworCQlicmVsc2UoYmgpOworCQlwdHIgKz0gbGVuOworCQlvZmYgKz0gbGVuOworCQlzaXplIC09IGxlbjsKKwl9CisKKwlIRlNfU0Ioc2IpLT5leHRfdHJlZSA9IGhmc19idHJlZV9vcGVuKHNiLCBIRlNfRVhUX0NOSUQsIGhmc19leHRfa2V5Y21wKTsKKwlpZiAoIUhGU19TQihzYiktPmV4dF90cmVlKSB7CisJCWhmc193YXJuKCJoZnNfZnM6IHVuYWJsZSB0byBvcGVuIGV4dGVudCB0cmVlXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCUhGU19TQihzYiktPmNhdF90cmVlID0gaGZzX2J0cmVlX29wZW4oc2IsIEhGU19DQVRfQ05JRCwgaGZzX2NhdF9rZXljbXApOworCWlmICghSEZTX1NCKHNiKS0+Y2F0X3RyZWUpIHsKKwkJaGZzX3dhcm4oImhmc19mczogdW5hYmxlIHRvIG9wZW4gY2F0YWxvZyB0cmVlXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJYXR0cmliID0gbWRiLT5kckF0cmI7CisJaWYgKCEoYXR0cmliICYgY3B1X3RvX2JlMTYoSEZTX1NCX0FUVFJJQl9VTk1OVCkpKSB7CisJCWhmc193YXJuKCJIRlMtZnMgd2FybmluZzogRmlsZXN5c3RlbSB3YXMgbm90IGNsZWFubHkgdW5tb3VudGVkLCAiCisJCQkgInJ1bm5pbmcgZnNjay5oZnMgaXMgcmVjb21tZW5kZWQuICBtb3VudGluZyByZWFkLW9ubHkuXG4iKTsKKwkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCX0KKwlpZiAoKGF0dHJpYiAmIGNwdV90b19iZTE2KEhGU19TQl9BVFRSSUJfU0xPQ0spKSkgeworCQloZnNfd2FybigiSEZTLWZzOiBGaWxlc3lzdGVtIGlzIG1hcmtlZCBsb2NrZWQsIG1vdW50aW5nIHJlYWQtb25seS5cbiIpOworCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CisJfQorCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQkvKiBNYXJrIHRoZSB2b2x1bWUgdW5jbGVhbmx5IHVubW91bnRlZCBpbiBjYXNlIHdlIGNyYXNoICovCisJCWF0dHJpYiAmPSBjcHVfdG9fYmUxNih+SEZTX1NCX0FUVFJJQl9VTk1OVCk7CisJCWF0dHJpYiB8PSBjcHVfdG9fYmUxNihIRlNfU0JfQVRUUklCX0lOQ05TVE5UKTsKKwkJbWRiLT5kckF0cmIgPSBhdHRyaWI7CisJCW1kYi0+ZHJXckNudCA9IGNwdV90b19iZTMyKGJlMzJfdG9fY3B1KG1kYi0+ZHJXckNudCkgKyAxKTsKKwkJbWRiLT5kckxzTW9kID0gaGZzX210aW1lKCk7CisKKwkJbWFya19idWZmZXJfZGlydHkoSEZTX1NCKHNiKS0+bWRiX2JoKTsKKwkJaGZzX2J1ZmZlcl9zeW5jKEhGU19TQihzYiktPm1kYl9iaCk7CisJfQorCisJcmV0dXJuIDA7CisKK291dF9iaDoKKwlicmVsc2UoYmgpOworb3V0OgorCWhmc19tZGJfcHV0KHNiKTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyoKKyAqIGhmc19tZGJfY29tbWl0KCkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgVGhpcyB1cGRhdGVzIHRoZSBNREIgb24gZGlzayAobG9vayBhbHNvIGF0IGhmc193cml0ZV9zdXBlcigpKS4KKyAqICAgSXQgZG9lcyBub3QgY2hlY2ssIGlmIHRoZSBzdXBlcmJsb2NrIGhhcyBiZWVuIG1vZGlmaWVkLCBvcgorICogICBpZiB0aGUgZmlsZXN5c3RlbSBoYXMgYmVlbiBtb3VudGVkIHJlYWQtb25seS4gSXQgaXMgbWFpbmx5CisgKiAgIGNhbGxlZCBieSBoZnNfd3JpdGVfc3VwZXIoKSBhbmQgaGZzX2J0cmVlX2V4dGVuZCgpLgorICogSW5wdXQgVmFyaWFibGUocyk6CisgKiAgIHN0cnVjdCBoZnNfbWRiICptZGI6IFBvaW50ZXIgdG8gdGhlIGhmcyBNREIKKyAqICAgaW50IGJhY2t1cDsKKyAqIE91dHB1dCBWYXJpYWJsZShzKToKKyAqICAgTk9ORQorICogUmV0dXJuczoKKyAqICAgdm9pZAorICogUHJlY29uZGl0aW9uczoKKyAqICAgJ21kYicgcG9pbnRzIHRvIGEgInZhbGlkIiAoc3RydWN0IGhmc19tZGIpLgorICogUG9zdGNvbmRpdGlvbnM6CisgKiAgIFRoZSBIRlMgTURCIGFuZCBvbiBkaXNrIHdpbGwgYmUgdXBkYXRlZCwgYnkgY29weWluZyB0aGUgcG9zc2libHkKKyAqICAgbW9kaWZpZWQgZmllbGRzIGZyb20gdGhlIGluIG1lbW9yeSBNREIgKGluIG5hdGl2ZSBieXRlIG9yZGVyKSB0bworICogICB0aGUgZGlzayBibG9jayBidWZmZXIuCisgKiAgIElmICdiYWNrdXAnIGlzIG5vbi16ZXJvIHRoZW4gdGhlIGFsdGVybmF0ZSBNREIgaXMgYWxzbyB3cml0dGVuCisgKiAgIGFuZCB0aGUgZnVuY3Rpb24gZG9lc24ndCByZXR1cm4gdW50aWwgaXQgaXMgYWN0dWFsbHkgb24gZGlzay4KKyAqLwordm9pZCBoZnNfbWRiX2NvbW1pdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBoZnNfbWRiICptZGIgPSBIRlNfU0Ioc2IpLT5tZGI7CisKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEhGU19GTEdfTURCX0RJUlRZLCAmSEZTX1NCKHNiKS0+ZmxhZ3MpKSB7CisJCS8qIFRoZXNlIHBhcmFtZXRlcnMgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCwgc28gd3JpdGUgdGhlbSBiYWNrICovCisJCW1kYi0+ZHJMc01vZCA9IGhmc19tdGltZSgpOworCQltZGItPmRyRnJlZUJrcyA9IGNwdV90b19iZTE2KEhGU19TQihzYiktPmZyZWVfYWJsb2Nrcyk7CisJCW1kYi0+ZHJOeHRDTklEID0gY3B1X3RvX2JlMzIoSEZTX1NCKHNiKS0+bmV4dF9pZCk7CisJCW1kYi0+ZHJObUZscyA9IGNwdV90b19iZTE2KEhGU19TQihzYiktPnJvb3RfZmlsZXMpOworCQltZGItPmRyTm1SdERpcnMgPSBjcHVfdG9fYmUxNihIRlNfU0Ioc2IpLT5yb290X2RpcnMpOworCQltZGItPmRyRmlsQ250ID0gY3B1X3RvX2JlMzIoSEZTX1NCKHNiKS0+ZmlsZV9jb3VudCk7CisJCW1kYi0+ZHJEaXJDbnQgPSBjcHVfdG9fYmUzMihIRlNfU0Ioc2IpLT5mb2xkZXJfY291bnQpOworCisJCS8qIHdyaXRlIE1EQiB0byBkaXNrICovCisJCW1hcmtfYnVmZmVyX2RpcnR5KEhGU19TQihzYiktPm1kYl9iaCk7CisJfQorCisJLyogd3JpdGUgdGhlIGJhY2t1cCBNREIsIG5vdCByZXR1cm5pbmcgdW50aWwgaXQgaXMgd3JpdHRlbi4KKwkgKiB3ZSBvbmx5IGRvIHRoaXMgd2hlbiBlaXRoZXIgdGhlIGNhdGFsb2cgb3IgZXh0ZW50cyBvdmVyZmxvdworCSAqIGZpbGVzIGdyb3cuICovCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChIRlNfRkxHX0FMVF9NREJfRElSVFksICZIRlNfU0Ioc2IpLT5mbGFncykgJiYKKwkgICAgSEZTX1NCKHNiKS0+YWx0X21kYikgeworCQloZnNfaW5vZGVfd3JpdGVfZm9yayhIRlNfU0Ioc2IpLT5leHRfdHJlZS0+aW5vZGUsIG1kYi0+ZHJYVEV4dFJlYywKKwkJCQkgICAgICZtZGItPmRyWFRGbFNpemUsIE5VTEwpOworCQloZnNfaW5vZGVfd3JpdGVfZm9yayhIRlNfU0Ioc2IpLT5jYXRfdHJlZS0+aW5vZGUsIG1kYi0+ZHJDVEV4dFJlYywKKwkJCQkgICAgICZtZGItPmRyQ1RGbFNpemUsIE5VTEwpOworCQltZW1jcHkoSEZTX1NCKHNiKS0+YWx0X21kYiwgSEZTX1NCKHNiKS0+bWRiLCBIRlNfU0VDVE9SX1NJWkUpOworCQlIRlNfU0Ioc2IpLT5hbHRfbWRiLT5kckF0cmIgfD0gY3B1X3RvX2JlMTYoSEZTX1NCX0FUVFJJQl9VTk1OVCk7CisJCUhGU19TQihzYiktPmFsdF9tZGItPmRyQXRyYiAmPSBjcHVfdG9fYmUxNih+SEZTX1NCX0FUVFJJQl9JTkNOU1ROVCk7CisJCW1hcmtfYnVmZmVyX2RpcnR5KEhGU19TQihzYiktPmFsdF9tZGJfYmgpOworCQloZnNfYnVmZmVyX3N5bmMoSEZTX1NCKHNiKS0+YWx0X21kYl9iaCk7CisJfQorCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChIRlNfRkxHX0JJVE1BUF9ESVJUWSwgJkhGU19TQihzYiktPmZsYWdzKSkgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCQlzZWN0b3JfdCBibG9jazsKKwkJY2hhciAqcHRyOworCQlpbnQgb2ZmLCBzaXplLCBsZW47CisKKwkJYmxvY2sgPSBiZTE2X3RvX2NwdShIRlNfU0Ioc2IpLT5tZGItPmRyVkJNU3QpICsgSEZTX1NCKHNiKS0+cGFydF9zdGFydDsKKwkJb2ZmID0gKGJsb2NrIDw8IEhGU19TRUNUT1JfU0laRV9CSVRTKSAmIChzYi0+c19ibG9ja3NpemUgLSAxKTsKKwkJYmxvY2sgPj49IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gSEZTX1NFQ1RPUl9TSVpFX0JJVFM7CisJCXNpemUgPSAoSEZTX1NCKHNiKS0+ZnNfYWJsb2NrcyArIDcpIC8gODsKKwkJcHRyID0gKHU4ICopSEZTX1NCKHNiKS0+Yml0bWFwOworCQl3aGlsZSAoc2l6ZSkgeworCQkJYmggPSBzYl9icmVhZChzYiwgYmxvY2spOworCQkJaWYgKCFiaCkgeworCQkJCWhmc193YXJuKCJoZnNfZnM6IHVuYWJsZSB0byByZWFkIHZvbHVtZSBiaXRtYXBcbiIpOworCQkJCWJyZWFrOworCQkJfQorCQkJbGVuID0gbWluKChpbnQpc2ItPnNfYmxvY2tzaXplIC0gb2ZmLCBzaXplKTsKKwkJCW1lbWNweShiaC0+Yl9kYXRhICsgb2ZmLCBwdHIsIGxlbik7CisJCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCQlicmVsc2UoYmgpOworCQkJYmxvY2srKzsKKwkJCW9mZiA9IDA7CisJCQlwdHIgKz0gbGVuOworCQkJc2l6ZSAtPSBsZW47CisJCX0KKwl9Cit9CisKK3ZvaWQgaGZzX21kYl9jbG9zZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCS8qIHVwZGF0ZSB2b2x1bWUgYXR0cmlidXRlcyAqLworCWlmIChzYi0+c19mbGFncyAmIE1TX1JET05MWSkKKwkJcmV0dXJuOworCUhGU19TQihzYiktPm1kYi0+ZHJBdHJiIHw9IGNwdV90b19iZTE2KEhGU19TQl9BVFRSSUJfVU5NTlQpOworCUhGU19TQihzYiktPm1kYi0+ZHJBdHJiICY9IGNwdV90b19iZTE2KH5IRlNfU0JfQVRUUklCX0lOQ05TVE5UKTsKKwltYXJrX2J1ZmZlcl9kaXJ0eShIRlNfU0Ioc2IpLT5tZGJfYmgpOworfQorCisvKgorICogaGZzX21kYl9wdXQoKQorICoKKyAqIFJlbGVhc2UgdGhlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGluLWNvcmUgTURCLiAgKi8KK3ZvaWQgaGZzX21kYl9wdXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwkvKiBmcmVlIHRoZSBCLXRyZWVzICovCisJaGZzX2J0cmVlX2Nsb3NlKEhGU19TQihzYiktPmV4dF90cmVlKTsKKwloZnNfYnRyZWVfY2xvc2UoSEZTX1NCKHNiKS0+Y2F0X3RyZWUpOworCisJLyogZnJlZSB0aGUgYnVmZmVycyBob2xkaW5nIHRoZSBwcmltYXJ5IGFuZCBhbHRlcm5hdGUgTURCcyAqLworCWJyZWxzZShIRlNfU0Ioc2IpLT5tZGJfYmgpOworCWJyZWxzZShIRlNfU0Ioc2IpLT5hbHRfbWRiX2JoKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2hmcy9wYXJ0X3RibC5jIGIvZnMvaGZzL3BhcnRfdGJsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZhZGQ1MwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmcy9wYXJ0X3RibC5jCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogIGxpbnV4L2ZzL2hmcy9wYXJ0X3RibC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTE5OTcgIFBhdWwgSC4gSGFyZ3JvdmUKKyAqIChDKSAyMDAzIEFyZGlzIFRlY2hub2xvZ2llcyA8cm9tYW5AYXJkaXN0ZWNoLmNvbT4KKyAqIFRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqCisgKiBPcmlnaW5hbCBjb2RlIHRvIGhhbmRsZSB0aGUgbmV3IHN0eWxlIE1hYyBwYXJ0aXRpb24gdGFibGUgYmFzZWQgb24KKyAqIGEgcGF0Y2ggY29udHJpYnV0ZWQgYnkgSG9sZ2VyIFNjaGVtZWwgKGFlZ2xvc0B2YWxpbm9yLm93bC5kZSkuCisgKi8KKworI2luY2x1ZGUgImhmc19mcy5oIgorCisvKgorICogVGhlIG5ldyBzdHlsZSBNYWMgcGFydGl0aW9uIG1hcAorICoKKyAqIEZvciBlYWNoIHBhcnRpdGlvbiBvbiB0aGUgbWVkaWEgdGhlcmUgaXMgYSBwaHlzaWNhbCBibG9jayAoNTEyLWJ5dGUKKyAqIGJsb2NrKSBjb250YWluaW5nIG9uZSBvZiB0aGVzZSBzdHJ1Y3R1cmVzLiAgVGhlc2UgYmxvY2tzIGFyZQorICogY29udGlndW91cyBzdGFydGluZyBhdCBibG9jayAxLgorICovCitzdHJ1Y3QgbmV3X3BtYXAgeworCV9fYmUxNglwbVNpZzsJCS8qIHNpZ25hdHVyZSAqLworCV9fYmUxNglyZVNpZ1BhZDsJLyogcGFkZGluZyAqLworCV9fYmUzMglwbU1hcEJsa0NudDsJLyogcGFydGl0aW9uIGJsb2NrcyBjb3VudCAqLworCV9fYmUzMglwbVB5UGFydFN0YXJ0OwkvKiBwaHlzaWNhbCBibG9jayBzdGFydCBvZiBwYXJ0aXRpb24gKi8KKwlfX2JlMzIJcG1QYXJ0QmxrQ250OwkvKiBwaHlzaWNhbCBibG9jayBjb3VudCBvZiBwYXJ0aXRpb24gKi8KKwl1OAlwbVBhcnROYW1lWzMyXTsJLyogKG51bGwgdGVybWluYXRlZD8pIHN0cmluZworCQkJCSAgIGdpdmluZyB0aGUgbmFtZSBvZiB0aGlzCisJCQkJICAgcGFydGl0aW9uICovCisJdTgJcG1QYXJ0VHlwZVszMl07CS8qIChudWxsIHRlcm1pbmF0ZWQ/KSBzdHJpbmcKKwkJCQkgICBnaXZpbmcgdGhlIHR5cGUgb2YgdGhpcworCQkJCSAgIHBhcnRpdGlvbiAqLworCS8qIGEgYnVuY2ggbW9yZSBzdHVmZiB3ZSBkb24ndCBuZWVkICovCit9IF9fcGFja2VkOworCisvKgorICogVGhlIG9sZCBzdHlsZSBNYWMgcGFydGl0aW9uIG1hcAorICoKKyAqIFRoZSBwYXJ0aXRpb24gbWFwIGNvbnNpc3RzIGZvciBhIDItYnl0ZSBzaWduYXR1cmUgZm9sbG93ZWQgYnkgYW4KKyAqIGFycmF5IG9mIHRoZXNlIHN0cnVjdHVyZXMuICBUaGUgbWFwIGlzIHRlcm1pbmF0ZWQgd2l0aCBhbiBhbGwtemVybworICogb25lIG9mIHRoZXNlLgorICovCitzdHJ1Y3Qgb2xkX3BtYXAgeworCV9fYmUxNgkJcGRTaWc7CS8qIFNpZ25hdHVyZSBieXRlcyAqLworCXN0cnVjdCAJb2xkX3BtYXBfZW50cnkgeworCQlfX2JlMzIJcGRTdGFydDsKKwkJX19iZTMyCXBkU2l6ZTsKKwkJX19iZTMyCXBkRlNJRDsKKwl9CXBkRW50cnlbNDJdOworfSBfX3BhY2tlZDsKKworLyoKKyAqIGhmc19wYXJ0X2ZpbmQoKQorICoKKyAqIFBhcnNlIHRoZSBwYXJ0aXRpb24gbWFwIGxvb2tpbmcgZm9yIHRoZQorICogc3RhcnQgYW5kIGxlbmd0aCBvZiB0aGUgJ3BhcnQndGggSEZTIHBhcnRpdGlvbi4KKyAqLworaW50IGhmc19wYXJ0X2ZpbmQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJICBzZWN0b3JfdCAqcGFydF9zdGFydCwgc2VjdG9yX3QgKnBhcnRfc2l6ZSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCV9fYmUxNiAqZGF0YTsKKwlpbnQgaSwgc2l6ZSwgcmVzOworCisJcmVzID0gLUVOT0VOVDsKKwliaCA9IHNiX2JyZWFkNTEyKHNiLCAqcGFydF9zdGFydCArIEhGU19QTUFQX0JMSywgZGF0YSk7CisJaWYgKCFiaCkKKwkJcmV0dXJuIC1FSU87CisKKwlzd2l0Y2ggKGJlMTZfdG9fY3B1KCpkYXRhKSkgeworCWNhc2UgSEZTX09MRF9QTUFQX01BR0lDOgorCSAgeworCQlzdHJ1Y3Qgb2xkX3BtYXAgKnBtOworCQlzdHJ1Y3Qgb2xkX3BtYXBfZW50cnkgKnA7CisKKwkJcG0gPSAoc3RydWN0IG9sZF9wbWFwICopYmgtPmJfZGF0YTsKKwkJcCA9IHBtLT5wZEVudHJ5OworCQlzaXplID0gNDI7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplOyBwKyssIGkrKykgeworCQkJaWYgKHAtPnBkU3RhcnQgJiYgcC0+cGRTaXplICYmCisJCQkgICAgcC0+cGRGU0lEID09IGNwdV90b19iZTMyKDB4NTQ0NjUzMzEpLyoiVEZTMSIqLyAmJgorCQkJICAgIChIRlNfU0Ioc2IpLT5wYXJ0IDwgMCB8fCBIRlNfU0Ioc2IpLT5wYXJ0ID09IGkpKSB7CisJCQkJKnBhcnRfc3RhcnQgKz0gYmUzMl90b19jcHUocC0+cGRTdGFydCk7CisJCQkJKnBhcnRfc2l6ZSA9IGJlMzJfdG9fY3B1KHAtPnBkU2l6ZSk7CisJCQkJcmVzID0gMDsKKwkJCX0KKwkJfQorCQlicmVhazsKKwkgIH0KKwljYXNlIEhGU19ORVdfUE1BUF9NQUdJQzoKKwkgIHsKKwkJc3RydWN0IG5ld19wbWFwICpwbTsKKworCQlwbSA9IChzdHJ1Y3QgbmV3X3BtYXAgKiliaC0+Yl9kYXRhOworCQlzaXplID0gYmUzMl90b19jcHUocG0tPnBtTWFwQmxrQ250KTsKKwkJZm9yIChpID0gMDsgaSA8IHNpemU7KSB7CisJCQlpZiAoIW1lbWNtcChwbS0+cG1QYXJ0VHlwZSwiQXBwbGVfSEZTIiwgOSkgJiYKKwkJCSAgICAoSEZTX1NCKHNiKS0+cGFydCA8IDAgfHwgSEZTX1NCKHNiKS0+cGFydCA9PSBpKSkgeworCQkJCSpwYXJ0X3N0YXJ0ICs9IGJlMzJfdG9fY3B1KHBtLT5wbVB5UGFydFN0YXJ0KTsKKwkJCQkqcGFydF9zaXplID0gYmUzMl90b19jcHUocG0tPnBtUGFydEJsa0NudCk7CisJCQkJcmVzID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWxzZShiaCk7CisJCQliaCA9IHNiX2JyZWFkNTEyKHNiLCAqcGFydF9zdGFydCArIEhGU19QTUFQX0JMSyArICsraSwgcG0pOworCQkJaWYgKCFiaCkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCWlmIChwbS0+cG1TaWcgIT0gY3B1X3RvX2JlMTYoSEZTX05FV19QTUFQX01BR0lDKSkKKwkJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwkgIH0KKwl9CisJYnJlbHNlKGJoKTsKKworCXJldHVybiByZXM7Cit9CmRpZmYgLS1naXQgYS9mcy9oZnMvc3RyaW5nLmMgYi9mcy9oZnMvc3RyaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI3YTVhZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmcy9zdHJpbmcuYwpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqICBsaW51eC9mcy9oZnMvc3RyaW5nLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMTk5NyAgUGF1bCBILiBIYXJncm92ZQorICogKEMpIDIwMDMgQXJkaXMgVGVjaG5vbG9naWVzIDxyb21hbkBhcmRpc3RlY2guY29tPgorICogVGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgc3RyaW5nIGNvbXBhcmlzb24gZnVuY3Rpb24gZm9yIHRoZQorICogTWFjaW50b3NoIGNoYXJhY3RlciBzZXQuCisgKgorICogVGhlIGNvZGUgaW4gdGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBjb2RlIHdoaWNoIGlzIGNvcHlyaWdodAorICogMTk4NiwgMTk4OSwgMTk5MCBieSBBYmFjdXMgUmVzZWFyY2ggYW5kIERldmVsb3BtZW50LCBJbmMuIChBUkRJKQorICogSXQgaXMgdXNlZCBoZXJlIGJ5IHRoZSBwZXJtaXNzaW9uIG9mIEFSREkncyBwcmVzaWRlbnQgQ2xpZmYgTWF0dGhld3MuCisgKi8KKworI2luY2x1ZGUgImhmc19mcy5oIgorI2luY2x1ZGUgPGxpbnV4L2RjYWNoZS5oPgorCisvKj09PT09PT09PT09PT09PT0gRmlsZS1sb2NhbCB2YXJpYWJsZXMgPT09PT09PT09PT09PT09PSovCisKKy8qCisgKiB1bnNpZ25lZCBjaGFyIGNhc2VvcmRlcltdCisgKgorICogRGVmaW5lcyB0aGUgbGV4aWNhbCBvcmRlcmluZyBvZiBjaGFyYWN0ZXJzIG9uIHRoZSBNYWNpbnRvc2gKKyAqCisgKiBDb21wb3NpdGlvbiBvZiB0aGUgJ2Nhc2Vmb2xkJyBhbmQgJ29yZGVyJyB0YWJsZXMgZnJvbSBBUkRJJ3MgY29kZQorICogd2l0aCB0aGUgZW50cnkgZm9yIDB4MjAgY2hhbmdlZCB0byBtYXRjaCB0aGF0IGZvciAweENBIHRvIHJlbW92ZQorICogc3BlY2lhbCBjYXNlIGZvciB0aG9zZSB0d28gY2hhcmFjdGVycy4KKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2FzZW9yZGVyWzI1Nl0gPSB7CisJMHgwMCwweDAxLDB4MDIsMHgwMywweDA0LDB4MDUsMHgwNiwweDA3LDB4MDgsMHgwOSwweDBBLDB4MEIsMHgwQywweDBELDB4MEUsMHgwRiwKKwkweDEwLDB4MTEsMHgxMiwweDEzLDB4MTQsMHgxNSwweDE2LDB4MTcsMHgxOCwweDE5LDB4MUEsMHgxQiwweDFDLDB4MUQsMHgxRSwweDFGLAorCTB4MjAsMHgyMiwweDIzLDB4MjgsMHgyOSwweDJBLDB4MkIsMHgyQywweDJGLDB4MzAsMHgzMSwweDMyLDB4MzMsMHgzNCwweDM1LDB4MzYsCisJMHgzNywweDM4LDB4MzksMHgzQSwweDNCLDB4M0MsMHgzRCwweDNFLDB4M0YsMHg0MCwweDQxLDB4NDIsMHg0MywweDQ0LDB4NDUsMHg0NiwKKwkweDQ3LDB4NDgsMHg1NywweDU5LDB4NUQsMHg1RiwweDY2LDB4NjgsMHg2QSwweDZDLDB4NzIsMHg3NCwweDc2LDB4NzgsMHg3QSwweDdFLAorCTB4OEMsMHg4RSwweDkwLDB4OTIsMHg5NSwweDk3LDB4OUUsMHhBMCwweEEyLDB4QTQsMHhBNywweEE5LDB4QUEsMHhBQiwweEFDLDB4QUQsCisJMHg0RSwweDQ4LDB4NTcsMHg1OSwweDVELDB4NUYsMHg2NiwweDY4LDB4NkEsMHg2QywweDcyLDB4NzQsMHg3NiwweDc4LDB4N0EsMHg3RSwKKwkweDhDLDB4OEUsMHg5MCwweDkyLDB4OTUsMHg5NywweDlFLDB4QTAsMHhBMiwweEE0LDB4QTcsMHhBRiwweEIwLDB4QjEsMHhCMiwweEIzLAorCTB4NEEsMHg0QywweDVBLDB4NjAsMHg3QiwweDdGLDB4OTgsMHg0RiwweDQ5LDB4NTEsMHg0QSwweDRCLDB4NEMsMHg1QSwweDYwLDB4NjMsCisJMHg2NCwweDY1LDB4NkUsMHg2RiwweDcwLDB4NzEsMHg3QiwweDg0LDB4ODUsMHg4NiwweDdGLDB4ODAsMHg5QSwweDlCLDB4OUMsMHg5OCwKKwkweEI0LDB4QjUsMHhCNiwweEI3LDB4QjgsMHhCOSwweEJBLDB4OTQsMHhCQiwweEJDLDB4QkQsMHhCRSwweEJGLDB4QzAsMHg0RCwweDgxLAorCTB4QzEsMHhDMiwweEMzLDB4QzQsMHhDNSwweEM2LDB4QzcsMHhDOCwweEM5LDB4Q0EsMHhDQiwweDU1LDB4OEEsMHhDQywweDRELDB4ODEsCisJMHhDRCwweENFLDB4Q0YsMHhEMCwweEQxLDB4RDIsMHhEMywweDI2LDB4MjcsMHhENCwweDIwLDB4NDksMHg0QiwweDgwLDB4ODIsMHg4MiwKKwkweEQ1LDB4RDYsMHgyNCwweDI1LDB4MkQsMHgyRSwweEQ3LDB4RDgsMHhBNiwweEQ5LDB4REEsMHhEQiwweERDLDB4REQsMHhERSwweERGLAorCTB4RTAsMHhFMSwweEUyLDB4RTMsMHhFNCwweEU1LDB4RTYsMHhFNywweEU4LDB4RTksMHhFQSwweEVCLDB4RUMsMHhFRCwweEVFLDB4RUYsCisJMHhGMCwweEYxLDB4RjIsMHhGMywweEY0LDB4RjUsMHhGNiwweEY3LDB4RjgsMHhGOSwweEZBLDB4RkIsMHhGQywweEZELDB4RkUsMHhGRgorfTsKKworLyo9PT09PT09PT09PT09PT09IEdsb2JhbCBmdW5jdGlvbnMgPT09PT09PT09PT09PT09PSovCisKKy8qCisgKiBIYXNoIGEgc3RyaW5nIHRvIGFuIGludGVnZXIgaW4gYSBjYXNlLWluZGVwZW5kZW50IHdheQorICovCitpbnQgaGZzX2hhc2hfZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHFzdHIgKnRoaXMpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqbmFtZSA9IHRoaXMtPm5hbWU7CisJdW5zaWduZWQgaW50IGhhc2gsIGxlbiA9IHRoaXMtPmxlbjsKKworCWlmIChsZW4gPiBIRlNfTkFNRUxFTikKKwkJbGVuID0gSEZTX05BTUVMRU47CisKKwloYXNoID0gaW5pdF9uYW1lX2hhc2goKTsKKwlmb3IgKDsgbGVuOyBsZW4tLSkKKwkJaGFzaCA9IHBhcnRpYWxfbmFtZV9oYXNoKGNhc2VvcmRlclsqbmFtZSsrXSwgaGFzaCk7CisJdGhpcy0+aGFzaCA9IGVuZF9uYW1lX2hhc2goaGFzaCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDb21wYXJlIHR3byBzdHJpbmdzIGluIHRoZSBIRlMgZmlsZW5hbWUgY2hhcmFjdGVyIG9yZGVyaW5nCisgKiBSZXR1cm5zIHBvc2l0aXZlLCBuZWdhdGl2ZSwgb3IgemVybywgbm90IGp1c3QgMCBvciAoKy8tKTEKKyAqCisgKiBFcXVpdmFsZW50IHRvIEFSREkncyBjYWxsOgorICoJUk9NbGliX1JlbFN0cmluZyhzMSsxLCBzMisxLCB0cnVlLCBmYWxzZSwgKHMxWzBdPDwxNikgfCBzMlswXSkKKyAqLworaW50IGhmc19zdHJjbXAoY29uc3QgdW5zaWduZWQgY2hhciAqczEsIHVuc2lnbmVkIGludCBsZW4xLAorCSAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzMiwgdW5zaWduZWQgaW50IGxlbjIpCit7CisJaW50IGxlbiwgdG1wOworCisJbGVuID0gKGxlbjEgPiBsZW4yKSA/IGxlbjIgOiBsZW4xOworCisJd2hpbGUgKGxlbi0tKSB7CisJCXRtcCA9IChpbnQpY2FzZW9yZGVyWyooczErKyldIC0gKGludCljYXNlb3JkZXJbKihzMisrKV07CisJCWlmICh0bXApCisJCQlyZXR1cm4gdG1wOworCX0KKwlyZXR1cm4gbGVuMSAtIGxlbjI7Cit9CisKKy8qCisgKiBUZXN0IGZvciBlcXVhbGl0eSBvZiB0d28gc3RyaW5ncyBpbiB0aGUgSEZTIGZpbGVuYW1lIGNoYXJhY3RlciBvcmRlcmluZy4KKyAqIHJldHVybiAxIG9uIGZhaWx1cmUgYW5kIDAgb24gc3VjY2VzcworICovCitpbnQgaGZzX2NvbXBhcmVfZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHFzdHIgKnMxLCBzdHJ1Y3QgcXN0ciAqczIpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqbjEsICpuMjsKKwlpbnQgbGVuOworCisJbGVuID0gczEtPmxlbjsKKwlpZiAobGVuID49IEhGU19OQU1FTEVOKSB7CisJCWlmIChzMi0+bGVuIDwgSEZTX05BTUVMRU4pCisJCQlyZXR1cm4gMTsKKwkJbGVuID0gSEZTX05BTUVMRU47CisJfSBlbHNlIGlmIChsZW4gIT0gczItPmxlbikKKwkJcmV0dXJuIDE7CisKKwluMSA9IHMxLT5uYW1lOworCW4yID0gczItPm5hbWU7CisJd2hpbGUgKGxlbi0tKSB7CisJCWlmIChjYXNlb3JkZXJbKm4xKytdICE9IGNhc2VvcmRlclsqbjIrK10pCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy9oZnMvc3VwZXIuYyBiL2ZzL2hmcy9zdXBlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMmMxOTMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9oZnMvc3VwZXIuYwpAQCAtMCwwICsxLDM5NSBAQAorLyoKKyAqICBsaW51eC9mcy9oZnMvc3VwZXIuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk3ICBQYXVsIEguIEhhcmdyb3ZlCisgKiAoQykgMjAwMyBBcmRpcyBUZWNobm9sb2dpZXMgPHJvbWFuQGFyZGlzdGVjaC5jb20+CisgKiBUaGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGhmc19yZWFkX3N1cGVyKCksIHNvbWUgb2YgdGhlIHN1cGVyX29wcyBhbmQKKyAqIGluaXRfbW9kdWxlKCkgYW5kIGNsZWFudXBfbW9kdWxlKCkuCVRoZSByZW1haW5pbmcgc3VwZXJfb3BzIGFyZSBpbgorICogaW5vZGUuYyBzaW5jZSB0aGV5IGRlYWwgd2l0aCBpbm9kZXMuCisgKgorICogQmFzZWQgb24gdGhlIG1pbml4IGZpbGUgc3lzdGVtIGNvZGUsIChDKSAxOTkxLCAxOTkyIGJ5IExpbnVzIFRvcnZhbGRzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJzZXIuaD4KKyNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKworI2luY2x1ZGUgImhmc19mcy5oIgorI2luY2x1ZGUgImJ0cmVlLmgiCisKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKmhmc19pbm9kZV9jYWNoZXA7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoKKyAqIGhmc193cml0ZV9zdXBlcigpCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBWRlMgb25seS4gV2hlbiB0aGUgZmlsZXN5c3RlbQorICogICBpcyBtb3VudGVkIHIvdyBpdCB1cGRhdGVzIHRoZSBNREIgb24gZGlzay4KKyAqIElucHV0IFZhcmlhYmxlKHMpOgorICogICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOiBQb2ludGVyIHRvIHRoZSBoZnMgc3VwZXJibG9jaworICogT3V0cHV0IFZhcmlhYmxlKHMpOgorICogICBOT05FCisgKiBSZXR1cm5zOgorICogICB2b2lkCisgKiBQcmVjb25kaXRpb25zOgorICogICAnc2InIHBvaW50cyB0byBhICJ2YWxpZCIgKHN0cnVjdCBzdXBlcl9ibG9jaykuCisgKiBQb3N0Y29uZGl0aW9uczoKKyAqICAgVGhlIE1EQiBpcyBtYXJrZWQgJ3Vuc3VjY2Vzc2Z1bGx5IHVubW91bnRlZCcgYnkgY2xlYXJpbmcgYml0IDggb2YgZHJBdHJiCisgKiAgIChoZnNfcHV0X3N1cGVyKCkgbXVzdCBzZXQgdGhpcyBmbGFnISkuIFNvbWUgTURCIGZpZWxkcyBhcmUgdXBkYXRlZAorICogICBhbmQgdGhlIE1EQiBidWZmZXIgaXMgd3JpdHRlbiB0byBkaXNrIGJ5IGNhbGxpbmcgaGZzX21kYl9jb21taXQoKS4KKyAqLworc3RhdGljIHZvaWQgaGZzX3dyaXRlX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc2ItPnNfZGlydCA9IDA7CisJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQorCQlyZXR1cm47CisJLyogc3luYyBldmVyeXRoaW5nIHRvIHRoZSBidWZmZXJzICovCisJaGZzX21kYl9jb21taXQoc2IpOworfQorCisvKgorICogaGZzX3B1dF9zdXBlcigpCisgKgorICogVGhpcyBpcyB0aGUgcHV0X3N1cGVyKCkgZW50cnkgaW4gdGhlIHN1cGVyX29wZXJhdGlvbnMgc3RydWN0dXJlIGZvcgorICogSEZTIGZpbGVzeXN0ZW1zLiAgVGhlIHB1cnBvc2UgaXMgdG8gcmVsZWFzZSB0aGUgcmVzb3VyY2VzCisgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHN1cGVyYmxvY2sgc2IuCisgKi8KK3N0YXRpYyB2b2lkIGhmc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwloZnNfbWRiX2Nsb3NlKHNiKTsKKwkvKiByZWxlYXNlIHRoZSBNREIncyByZXNvdXJjZXMgKi8KKwloZnNfbWRiX3B1dChzYik7Cit9CisKKy8qCisgKiBoZnNfc3RhdGZzKCkKKyAqCisgKiBUaGlzIGlzIHRoZSBzdGF0ZnMoKSBlbnRyeSBpbiB0aGUgc3VwZXJfb3BlcmF0aW9ucyBzdHJ1Y3R1cmUgZm9yCisgKiBIRlMgZmlsZXN5c3RlbXMuICBUaGUgcHVycG9zZSBpcyB0byByZXR1cm4gdmFyaW91cyBkYXRhIGFib3V0IHRoZQorICogZmlsZXN5c3RlbS4KKyAqCisgKiBjaGFuZ2VkIGZfZmlsZXMvZl9mZnJlZSB0byByZWZsZWN0IHRoZSBmc19hYmxvY2svZnJlZV9hYmxvY2tzLgorICovCitzdGF0aWMgaW50IGhmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK3sKKwlidWYtPmZfdHlwZSA9IEhGU19TVVBFUl9NQUdJQzsKKwlidWYtPmZfYnNpemUgPSBzYi0+c19ibG9ja3NpemU7CisJYnVmLT5mX2Jsb2NrcyA9ICh1MzIpSEZTX1NCKHNiKS0+ZnNfYWJsb2NrcyAqIEhGU19TQihzYiktPmZzX2RpdjsKKwlidWYtPmZfYmZyZWUgPSAodTMyKUhGU19TQihzYiktPmZyZWVfYWJsb2NrcyAqIEhGU19TQihzYiktPmZzX2RpdjsKKwlidWYtPmZfYmF2YWlsID0gYnVmLT5mX2JmcmVlOworCWJ1Zi0+Zl9maWxlcyA9IEhGU19TQihzYiktPmZzX2FibG9ja3M7CisJYnVmLT5mX2ZmcmVlID0gSEZTX1NCKHNiKS0+ZnJlZV9hYmxvY2tzOworCWJ1Zi0+Zl9uYW1lbGVuID0gSEZTX05BTUVMRU47CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZnNfcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpkYXRhKQoreworCSpmbGFncyB8PSBNU19OT0RJUkFUSU1FOworCWlmICgoKmZsYWdzICYgTVNfUkRPTkxZKSA9PSAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKQorCQlyZXR1cm4gMDsKKwlpZiAoISgqZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCWlmICghKEhGU19TQihzYiktPm1kYi0+ZHJBdHJiICYgY3B1X3RvX2JlMTYoSEZTX1NCX0FUVFJJQl9VTk1OVCkpKSB7CisJCQlwcmludGsoIkhGUy1mcyB3YXJuaW5nOiBGaWxlc3lzdGVtIHdhcyBub3QgY2xlYW5seSB1bm1vdW50ZWQsICIKKwkJCSAgICAgICAicnVubmluZyBmc2NrLmhmcyBpcyByZWNvbW1lbmRlZC4gIGxlYXZpbmcgcmVhZC1vbmx5LlxuIik7CisJCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CisJCQkqZmxhZ3MgfD0gTVNfUkRPTkxZOworCQl9IGVsc2UgaWYgKEhGU19TQihzYiktPm1kYi0+ZHJBdHJiICYgY3B1X3RvX2JlMTYoSEZTX1NCX0FUVFJJQl9TTE9DSykpIHsKKwkJCXByaW50aygiSEZTLWZzOiBGaWxlc3lzdGVtIGlzIG1hcmtlZCBsb2NrZWQsIGxlYXZpbmcgcmVhZC1vbmx5LlxuIik7CisJCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CisJCQkqZmxhZ3MgfD0gTVNfUkRPTkxZOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlub2RlICpoZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgaGZzX2lub2RlX2luZm8gKmk7CisKKwlpID0ga21lbV9jYWNoZV9hbGxvYyhoZnNfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJcmV0dXJuIGkgPyAmaS0+dmZzX2lub2RlIDogTlVMTDsKK30KKworc3RhdGljIHZvaWQgaGZzX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlrbWVtX2NhY2hlX2ZyZWUoaGZzX2lub2RlX2NhY2hlcCwgSEZTX0koaW5vZGUpKTsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGhmc19zdXBlcl9vcGVyYXRpb25zID0geworCS5hbGxvY19pbm9kZQk9IGhmc19hbGxvY19pbm9kZSwKKwkuZGVzdHJveV9pbm9kZQk9IGhmc19kZXN0cm95X2lub2RlLAorCS53cml0ZV9pbm9kZQk9IGhmc193cml0ZV9pbm9kZSwKKwkuY2xlYXJfaW5vZGUJPSBoZnNfY2xlYXJfaW5vZGUsCisJLnB1dF9zdXBlcgk9IGhmc19wdXRfc3VwZXIsCisJLndyaXRlX3N1cGVyCT0gaGZzX3dyaXRlX3N1cGVyLAorCS5zdGF0ZnMJCT0gaGZzX3N0YXRmcywKKwkucmVtb3VudF9mcyAgICAgPSBoZnNfcmVtb3VudCwKK307CisKK2VudW0geworCW9wdF91aWQsIG9wdF9naWQsIG9wdF91bWFzaywgb3B0X2ZpbGVfdW1hc2ssIG9wdF9kaXJfdW1hc2ssCisJb3B0X3BhcnQsIG9wdF9zZXNzaW9uLCBvcHRfdHlwZSwgb3B0X2NyZWF0b3IsIG9wdF9xdWlldCwKKwlvcHRfZXJyCit9OworCitzdGF0aWMgbWF0Y2hfdGFibGVfdCB0b2tlbnMgPSB7CisJeyBvcHRfdWlkLCAidWlkPSV1IiB9LAorCXsgb3B0X2dpZCwgImdpZD0ldSIgfSwKKwl7IG9wdF91bWFzaywgInVtYXNrPSVvIiB9LAorCXsgb3B0X2ZpbGVfdW1hc2ssICJmaWxlX3VtYXNrPSVvIiB9LAorCXsgb3B0X2Rpcl91bWFzaywgImRpcl91bWFzaz0lbyIgfSwKKwl7IG9wdF9wYXJ0LCAicGFydD0ldSIgfSwKKwl7IG9wdF9zZXNzaW9uLCAic2Vzc2lvbj0ldSIgfSwKKwl7IG9wdF90eXBlLCAidHlwZT0lcyIgfSwKKwl7IG9wdF9jcmVhdG9yLCAiY3JlYXRvcj0lcyIgfSwKKwl7IG9wdF9xdWlldCwgInF1aWV0IiB9LAorCXsgb3B0X2VyciwgTlVMTCB9Cit9OworCitzdGF0aWMgaW5saW5lIGludCBtYXRjaF9mb3VyY2hhcihzdWJzdHJpbmdfdCAqYXJnLCB1MzIgKnJlc3VsdCkKK3sKKwlpZiAoYXJnLT50byAtIGFyZy0+ZnJvbSAhPSA0KQorCQlyZXR1cm4gLUVJTlZBTDsKKwltZW1jcHkocmVzdWx0LCBhcmctPmZyb20sIDQpOworCXJldHVybiAwOworfQorCisvKgorICogcGFyc2Vfb3B0aW9ucygpCisgKgorICogYWRhcHRlZCBmcm9tIGxpbnV4L2ZzL21zZG9zL2lub2RlLmMgd3JpdHRlbiAxOTkyLDkzIGJ5IFdlcm5lciBBbG1lc2JlcmdlcgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgaGZzX3JlYWRfc3VwZXIoKSB0byBwYXJzZSB0aGUgbW91bnQgb3B0aW9ucy4KKyAqLworc3RhdGljIGludCBwYXJzZV9vcHRpb25zKGNoYXIgKm9wdGlvbnMsIHN0cnVjdCBoZnNfc2JfaW5mbyAqaHNiKQoreworCWNoYXIgKnA7CisJc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOworCWludCB0bXAsIHRva2VuOworCisJLyogaW5pdGlhbGl6ZSB0aGUgc2Igd2l0aCBkZWZhdWx0cyAqLworCWhzYi0+c191aWQgPSBjdXJyZW50LT51aWQ7CisJaHNiLT5zX2dpZCA9IGN1cnJlbnQtPmdpZDsKKwloc2ItPnNfZmlsZV91bWFzayA9IDAxMzM7CisJaHNiLT5zX2Rpcl91bWFzayA9IDAwMjI7CisJaHNiLT5zX3R5cGUgPSBoc2ItPnNfY3JlYXRvciA9IGNwdV90b19iZTMyKDB4M2YzZjNmM2YpOwkvKiA9PSAnPz8/PycgKi8KKwloc2ItPnNfcXVpZXQgPSAwOworCWhzYi0+cGFydCA9IC0xOworCWhzYi0+c2Vzc2lvbiA9IC0xOworCisJaWYgKCFvcHRpb25zKQorCQlyZXR1cm4gMTsKKworCXdoaWxlICgocCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgeworCQlpZiAoISpwKQorCQkJY29udGludWU7CisKKwkJdG9rZW4gPSBtYXRjaF90b2tlbihwLCB0b2tlbnMsIGFyZ3MpOworCQlzd2l0Y2ggKHRva2VuKSB7CisJCWNhc2Ugb3B0X3VpZDoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZ0bXApKSB7CisJCQkJcHJpbnRrKCJIRlM6IHVpZCByZXF1aXJlcyBhbiBhcmd1bWVudFxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQloc2ItPnNfdWlkID0gKHVpZF90KXRtcDsKKwkJCWJyZWFrOworCQljYXNlIG9wdF9naWQ6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmdG1wKSkgeworCQkJCXByaW50aygiSEZTOiBnaWQgcmVxdWlyZXMgYW4gYXJndW1lbnRcbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJaHNiLT5zX2dpZCA9IChnaWRfdCl0bXA7CisJCQlicmVhazsKKwkJY2FzZSBvcHRfdW1hc2s6CisJCQlpZiAobWF0Y2hfb2N0YWwoJmFyZ3NbMF0sICZ0bXApKSB7CisJCQkJcHJpbnRrKCJIRlM6IHVtYXNrIHJlcXVpcmVzIGEgdmFsdWVcbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJaHNiLT5zX2ZpbGVfdW1hc2sgPSAodW1vZGVfdCl0bXA7CisJCQloc2ItPnNfZGlyX3VtYXNrID0gKHVtb2RlX3QpdG1wOworCQkJYnJlYWs7CisJCWNhc2Ugb3B0X2ZpbGVfdW1hc2s6CisJCQlpZiAobWF0Y2hfb2N0YWwoJmFyZ3NbMF0sICZ0bXApKSB7CisJCQkJcHJpbnRrKCJIRlM6IGZpbGVfdW1hc2sgcmVxdWlyZXMgYSB2YWx1ZVxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQloc2ItPnNfZmlsZV91bWFzayA9ICh1bW9kZV90KXRtcDsKKwkJCWJyZWFrOworCQljYXNlIG9wdF9kaXJfdW1hc2s6CisJCQlpZiAobWF0Y2hfb2N0YWwoJmFyZ3NbMF0sICZ0bXApKSB7CisJCQkJcHJpbnRrKCJIRlM6IGRpcl91bWFzayByZXF1aXJlcyBhIHZhbHVlXG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWhzYi0+c19kaXJfdW1hc2sgPSAodW1vZGVfdCl0bXA7CisJCQlicmVhazsKKwkJY2FzZSBvcHRfcGFydDoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZoc2ItPnBhcnQpKSB7CisJCQkJcHJpbnRrKCJIRlM6IHBhcnQgcmVxdWlyZXMgYW4gYXJndW1lbnRcbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2Ugb3B0X3Nlc3Npb246CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmaHNiLT5zZXNzaW9uKSkgeworCQkJCXByaW50aygiSEZTOiBzZXNzaW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIG9wdF90eXBlOgorCQkJaWYgKG1hdGNoX2ZvdXJjaGFyKCZhcmdzWzBdLCAmaHNiLT5zX3R5cGUpKSB7CisJCQkJcHJpbnRrKCJIRlMrLWZzOiB0eXBlIHJlcXVpcmVzIGEgNCBjaGFyYWN0ZXIgdmFsdWVcbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2Ugb3B0X2NyZWF0b3I6CisJCQlpZiAobWF0Y2hfZm91cmNoYXIoJmFyZ3NbMF0sICZoc2ItPnNfY3JlYXRvcikpIHsKKwkJCQlwcmludGsoIkhGUystZnM6IGNyZWF0b3IgcmVxdWlyZXMgYSA0IGNoYXJhY3RlciB2YWx1ZVxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBvcHRfcXVpZXQ6CisJCQloc2ItPnNfcXVpZXQgPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWhzYi0+c19kaXJfdW1hc2sgJj0gMDc3NzsKKwloc2ItPnNfZmlsZV91bWFzayAmPSAwNTc3OworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBoZnNfcmVhZF9zdXBlcigpCisgKgorICogVGhpcyBpcyB0aGUgZnVuY3Rpb24gdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgbW91bnRpbmcgYW4gSEZTCisgKiBmaWxlc3lzdGVtLglJdCBwZXJmb3JtcyBhbGwgdGhlIHRhc2tzIG5lY2Vzc2FyeSB0byBnZXQgZW5vdWdoIGRhdGEKKyAqIGZyb20gdGhlIGRpc2sgdG8gcmVhZCB0aGUgcm9vdCBpbm9kZS4gIFRoaXMgaW5jbHVkZXMgcGFyc2luZyB0aGUKKyAqIG1vdW50IG9wdGlvbnMsIGRlYWxpbmcgd2l0aCBNYWNpbnRvc2ggcGFydGl0aW9ucywgcmVhZGluZyB0aGUKKyAqIHN1cGVyYmxvY2sgYW5kIHRoZSBhbGxvY2F0aW9uIGJpdG1hcCBibG9ja3MsIGNhbGxpbmcKKyAqIGhmc19idHJlZV9pbml0KCkgdG8gZ2V0IHRoZSBuZWNlc3NhcnkgZGF0YSBhYm91dCB0aGUgZXh0ZW50cyBhbmQKKyAqIGNhdGFsb2cgQi10cmVlcyBhbmQsIGZpbmFsbHksIHJlYWRpbmcgdGhlIHJvb3QgaW5vZGUgaW50byBtZW1vcnkuCisgKi8KK3N0YXRpYyBpbnQgaGZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgaGZzX3NiX2luZm8gKnNiaTsKKwlzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSBmZDsKKwloZnNfY2F0X3JlYyByZWM7CisJc3RydWN0IGlub2RlICpyb290X2lub2RlOworCWludCByZXM7CisKKwlzYmkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaGZzX3NiX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNiaSkKKwkJcmV0dXJuIC1FTk9NRU07CisJc2ItPnNfZnNfaW5mbyA9IHNiaTsKKwltZW1zZXQoc2JpLCAwLCBzaXplb2Yoc3RydWN0IGhmc19zYl9pbmZvKSk7CisJSU5JVF9ITElTVF9IRUFEKCZzYmktPnJzcmNfaW5vZGVzKTsKKworCXJlcyA9IC1FSU5WQUw7CisJaWYgKCFwYXJzZV9vcHRpb25zKChjaGFyICopZGF0YSwgc2JpKSkgeworCQloZnNfd2FybigiaGZzX2ZzOiB1bmFibGUgdG8gcGFyc2UgbW91bnQgb3B0aW9ucy5cbiIpOworCQlnb3RvIGJhaWwzOworCX0KKworCXNiLT5zX29wID0gJmhmc19zdXBlcl9vcGVyYXRpb25zOworCXNiLT5zX2ZsYWdzIHw9IE1TX05PRElSQVRJTUU7CisJaW5pdF9NVVRFWCgmc2JpLT5iaXRtYXBfbG9jayk7CisKKwlyZXMgPSBoZnNfbWRiX2dldChzYik7CisJaWYgKHJlcykgeworCQlpZiAoIXNpbGVudCkKKwkJCWhmc193YXJuKCJWRlM6IENhbid0IGZpbmQgYSBIRlMgZmlsZXN5c3RlbSBvbiBkZXYgJXMuXG4iLAorCQkJCWhmc19tZGJfbmFtZShzYikpOworCQlyZXMgPSAtRUlOVkFMOworCQlnb3RvIGJhaWwyOworCX0KKworCS8qIHRyeSB0byBnZXQgdGhlIHJvb3QgaW5vZGUgKi8KKwloZnNfZmluZF9pbml0KEhGU19TQihzYiktPmNhdF90cmVlLCAmZmQpOworCXJlcyA9IGhmc19jYXRfZmluZF9icmVjKHNiLCBIRlNfUk9PVF9DTklELCAmZmQpOworCWlmICghcmVzKQorCQloZnNfYm5vZGVfcmVhZChmZC5ibm9kZSwgJnJlYywgZmQuZW50cnlvZmZzZXQsIGZkLmVudHJ5bGVuZ3RoKTsKKwlpZiAocmVzKSB7CisJCWhmc19maW5kX2V4aXQoJmZkKTsKKwkJZ290byBiYWlsX25vX3Jvb3Q7CisJfQorCXJvb3RfaW5vZGUgPSBoZnNfaWdldChzYiwgJmZkLnNlYXJjaF9rZXktPmNhdCwgJnJlYyk7CisJaGZzX2ZpbmRfZXhpdCgmZmQpOworCWlmICghcm9vdF9pbm9kZSkKKwkJZ290byBiYWlsX25vX3Jvb3Q7CisKKwlzYi0+c19yb290ID0gZF9hbGxvY19yb290KHJvb3RfaW5vZGUpOworCWlmICghc2ItPnNfcm9vdCkKKwkJZ290byBiYWlsX2lwdXQ7CisKKwlzYi0+c19yb290LT5kX29wID0gJmhmc19kZW50cnlfb3BlcmF0aW9uczsKKworCS8qIGV2ZXJ5dGhpbmcncyBva2F5ICovCisJcmV0dXJuIDA7CisKK2JhaWxfaXB1dDoKKwlpcHV0KHJvb3RfaW5vZGUpOworYmFpbF9ub19yb290OgorCWhmc193YXJuKCJoZnNfZnM6IGdldCByb290IGlub2RlIGZhaWxlZC5cbiIpOworCWhmc19tZGJfcHV0KHNiKTsKK2JhaWwyOgorYmFpbDM6CisJa2ZyZWUoc2JpKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpoZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCQkJCSAgICAgIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgaGZzX2ZpbGxfc3VwZXIpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgaGZzX2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJoZnMiLAorCS5nZXRfc2IJCT0gaGZzX2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfYmxvY2tfc3VwZXIsCisJLmZzX2ZsYWdzCT0gRlNfUkVRVUlSRVNfREVWLAorfTsKKworc3RhdGljIHZvaWQgaGZzX2luaXRfb25jZSh2b2lkICpwLCBrbWVtX2NhY2hlX3QgKmNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgaGZzX2lub2RlX2luZm8gKmkgPSBwOworCisJaWYgKChmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09IFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikKKwkJaW5vZGVfaW5pdF9vbmNlKCZpLT52ZnNfaW5vZGUpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2hmc19mcyh2b2lkKQoreworCWludCBlcnI7CisKKwloZnNfaW5vZGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoImhmc19pbm9kZV9jYWNoZSIsCisJCXNpemVvZihzdHJ1Y3QgaGZzX2lub2RlX2luZm8pLCAwLCBTTEFCX0hXQ0FDSEVfQUxJR04sCisJCWhmc19pbml0X29uY2UsIE5VTEwpOworCWlmICghaGZzX2lub2RlX2NhY2hlcCkKKwkJcmV0dXJuIC1FTk9NRU07CisJZXJyID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmaGZzX2ZzX3R5cGUpOworCWlmIChlcnIpCisJCWttZW1fY2FjaGVfZGVzdHJveShoZnNfaW5vZGVfY2FjaGVwKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9oZnNfZnModm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmhmc19mc190eXBlKTsKKwlpZiAoa21lbV9jYWNoZV9kZXN0cm95KGhmc19pbm9kZV9jYWNoZXApKQorCQlwcmludGsoS0VSTl9JTkZPICJoZnNfaW5vZGVfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9oZnNfZnMpCittb2R1bGVfZXhpdChleGl0X2hmc19mcykKZGlmZiAtLWdpdCBhL2ZzL2hmcy9zeXNkZXAuYyBiL2ZzL2hmcy9zeXNkZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmY4OWVjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaGZzL3N5c2RlcC5jCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiAgbGludXgvZnMvaGZzL3N5c2RlcC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2ICBQYXVsIEguIEhhcmdyb3ZlCisgKiAoQykgMjAwMyBBcmRpcyBUZWNobm9sb2dpZXMgPHJvbWFuQGFyZGlzdGVjaC5jb20+CisgKiBUaGlzIGZpbGUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb2RlIHRvIGRvIHZhcmlvdXMgc3lzdGVtIGRlcGVuZGVudCB0aGluZ3MuCisgKi8KKworI2luY2x1ZGUgImhmc19mcy5oIgorCisvKiBkZW50cnkgY2FzZS1oYW5kbGluZzoganVzdCBsb3dlcmNhc2UgZXZlcnl0aGluZyAqLworCitzdGF0aWMgaW50IGhmc19yZXZhbGlkYXRlX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IGRpZmY7CisKKwlpZighaW5vZGUpCisJCXJldHVybiAxOworCisJLyogZml4IHVwIGlub2RlIG9uIGEgdGltZXpvbmUgY2hhbmdlICovCisJZGlmZiA9IHN5c190ei50el9taW51dGVzd2VzdCAqIDYwIC0gSEZTX0koaW5vZGUpLT50el9zZWNvbmRzd2VzdDsKKwlpZiAoZGlmZikgeworCQlpbm9kZS0+aV9jdGltZS50dl9zZWMgKz0gZGlmZjsKKwkJaW5vZGUtPmlfYXRpbWUudHZfc2VjICs9IGRpZmY7CisJCWlub2RlLT5pX210aW1lLnR2X3NlYyArPSBkaWZmOworCQlIRlNfSShpbm9kZSktPnR6X3NlY29uZHN3ZXN0ICs9IGRpZmY7CisJfQorCXJldHVybiAxOworfQorCitzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgaGZzX2RlbnRyeV9vcGVyYXRpb25zID0KK3sKKwkuZF9yZXZhbGlkYXRlCT0gaGZzX3JldmFsaWRhdGVfZGVudHJ5LAorCS5kX2hhc2gJCT0gaGZzX2hhc2hfZGVudHJ5LAorCS5kX2NvbXBhcmUJPSBoZnNfY29tcGFyZV9kZW50cnksCit9OworCmRpZmYgLS1naXQgYS9mcy9oZnMvdHJhbnMuYyBiL2ZzL2hmcy90cmFucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiOTcyMGEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9oZnMvdHJhbnMuYwpAQCAtMCwwICsxLDcyIEBACisvKgorICogIGxpbnV4L2ZzL2hmcy90cmFucy5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcgIFBhdWwgSC4gSGFyZ3JvdmUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiB0aGUgTWFjaW50b3NoCisgKiBjaGFyYWN0ZXIgc2V0IGFuZCB2YXJpb3VzIG90aGVyIGVuY29kaW5ncy4gIFRoaXMgaW5jbHVkZXMgZGVhbGluZworICogd2l0aCAnOicgdnMuICcvJyBhcyB0aGUgcGF0aC1lbGVtZW50IHNlcGFyYXRvci4KKyAqLworCisjaW5jbHVkZSAiaGZzX2ZzLmgiCisKKy8qPT09PT09PT09PT09PT09PSBHbG9iYWwgZnVuY3Rpb25zID09PT09PT09PT09PT09PT0qLworCisvKgorICogaGZzX21hYzJ0cml2KCkKKyAqCisgKiBHaXZlbiBhICdQYXNjYWwgU3RyaW5nJyAoYSBzdHJpbmcgcHJlY2VkZWQgYnkgYSBsZW5ndGggYnl0ZSkgaW4KKyAqIHRoZSBNYWNpbnRvc2ggY2hhcmFjdGVyIHNldCBwcm9kdWNlIHRoZSBjb3JyZXNwb25kaW5nIGZpbGVuYW1lIHVzaW5nCisgKiB0aGUgJ3RyaXZpYWwnIG5hbWUtbWFuZ2xpbmcgc2NoZW1lLCByZXR1cm5pbmcgdGhlIGxlbmd0aCBvZiB0aGUKKyAqIG1hbmdsZWQgZmlsZW5hbWUuICBOb3RlIHRoYXQgdGhlIG91dHB1dCBzdHJpbmcgaXMgbm90IE5VTEwKKyAqIHRlcm1pbmF0ZWQuCisgKgorICogVGhlIG5hbWUtbWFuZ2xpbmcgd29ya3MgYXMgZm9sbG93czoKKyAqIFRoZSBjaGFyYWN0ZXIgJy8nLCB3aGljaCBpcyBpbGxlZ2FsIGluIExpbnV4IGZpbGVuYW1lcyBpcyByZXBsYWNlZAorICogYnkgJzonIHdoaWNoIG5ldmVyIGFwcGVhcnMgaW4gSEZTIGZpbGVuYW1lcy4JIEFsbCBvdGhlciBjaGFyYWN0ZXJzCisgKiBhcmUgcGFzc2VkIHVuY2hhbmdlZCBmcm9tIGlucHV0IHRvIG91dHB1dC4KKyAqLworaW50IGhmc19tYWMydHJpdihjaGFyICpvdXQsIGNvbnN0IHN0cnVjdCBoZnNfbmFtZSAqaW4pCit7CisJY29uc3QgY2hhciAqcDsKKwljaGFyIGM7CisJaW50IGksIGxlbjsKKworCWxlbiA9IGluLT5sZW47CisJcCA9IGluLT5uYW1lOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQljID0gKnArKzsKKwkJKm91dCsrID0gYyA9PSAnLycgPyAnOicgOiBjOworCX0KKwlyZXR1cm4gaTsKK30KKworLyoKKyAqIGhmc190cml2Mm1hYygpCisgKgorICogR2l2ZW4gYW4gQVNDSUkgc3RyaW5nIChub3QgbnVsbC10ZXJtaW5hdGVkKSBhbmQgaXRzIGxlbmd0aCwKKyAqIGdlbmVyYXRlIHRoZSBjb3JyZXNwb25kaW5nIGZpbGVuYW1lIGluIHRoZSBNYWNpbnRvc2ggY2hhcmFjdGVyIHNldAorICogdXNpbmcgdGhlICd0cml2aWFsJyBuYW1lLW1hbmdsaW5nIHNjaGVtZSwgcmV0dXJuaW5nIHRoZSBsZW5ndGggb2YKKyAqIHRoZSBtYW5nbGVkIGZpbGVuYW1lLiAgTm90ZSB0aGF0IHRoZSBvdXRwdXQgc3RyaW5nIGlzIG5vdCBOVUxMCisgKiB0ZXJtaW5hdGVkLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBhIGludmVyc2UgdG8gaGZzX21hYzJ0cml2KCkuCisgKiBBICc6JyBpcyByZXBsYWNlZCBieSBhICcvJy4KKyAqLwordm9pZCBoZnNfdHJpdjJtYWMoc3RydWN0IGhmc19uYW1lICpvdXQsIHN0cnVjdCBxc3RyICppbikKK3sKKwljb25zdCBjaGFyICpzcmM7CisJY2hhciAqZHN0LCBjOworCWludCBpLCBsZW47CisKKwlvdXQtPmxlbiA9IGxlbiA9IG1pbigodW5zaWduZWQgaW50KUhGU19OQU1FTEVOLCBpbi0+bGVuKTsKKwlzcmMgPSBpbi0+bmFtZTsKKwlkc3QgPSBvdXQtPm5hbWU7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWMgPSAqc3JjKys7CisJCSpkc3QrKyA9IGMgPT0gJzonID8gJy8nIDogYzsKKwl9CisJZm9yICg7IGkgPCBIRlNfTkFNRUxFTjsgaSsrKQorCQkqZHN0KysgPSAwOworfQpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9NYWtlZmlsZSBiL2ZzL2hmc3BsdXMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NjMGRmNwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmc3BsdXMvTWFrZWZpbGUKQEAgLTAsMCArMSw5IEBACisjCisjIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGhmc3BsdXMgZmlsZXN5c3RlbSByb3V0aW5lcy4KKyMKKworb2JqLSQoQ09ORklHX0hGU1BMVVNfRlMpICs9IGhmc3BsdXMubworCitoZnNwbHVzLW9ianMgOj0gc3VwZXIubyBvcHRpb25zLm8gaW5vZGUubyBpb2N0bC5vIGV4dGVudHMubyBjYXRhbG9nLm8gZGlyLm8gYnRyZWUubyBcCisJCWJub2RlLm8gYnJlYy5vIGJmaW5kLm8gdGFibGVzLm8gdW5pY29kZS5vIHdyYXBwZXIubyBiaXRtYXAubyBwYXJ0X3RibC5vCisKZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvYmZpbmQuYyBiL2ZzL2hmc3BsdXMvYmZpbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTdjZGRlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaGZzcGx1cy9iZmluZC5jCkBAIC0wLDAgKzEsMjEwIEBACisvKgorICogIGxpbnV4L2ZzL2hmc3BsdXMvYmZpbmQuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMQorICogQnJhZCBCb3llciAoZmxhckBhbGxhbmRyaWEuY29tKQorICogKEMpIDIwMDMgQXJkaXMgVGVjaG5vbG9naWVzIDxyb21hbkBhcmRpc3RlY2guY29tPgorICoKKyAqIFNlYXJjaCByb3V0aW5lcyBmb3IgYnRyZWVzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlICJoZnNwbHVzX2ZzLmgiCisKK2ludCBoZnNfZmluZF9pbml0KHN0cnVjdCBoZnNfYnRyZWUgKnRyZWUsIHN0cnVjdCBoZnNfZmluZF9kYXRhICpmZCkKK3sKKwl2b2lkICpwdHI7CisKKwlmZC0+dHJlZSA9IHRyZWU7CisJZmQtPmJub2RlID0gTlVMTDsKKwlwdHIgPSBrbWFsbG9jKHRyZWUtPm1heF9rZXlfbGVuICogMiArIDQsIEdGUF9LRVJORUwpOworCWlmICghcHRyKQorCQlyZXR1cm4gLUVOT01FTTsKKwlmZC0+c2VhcmNoX2tleSA9IHB0cjsKKwlmZC0+a2V5ID0gcHRyICsgdHJlZS0+bWF4X2tleV9sZW4gKyAyOworCWRwcmludChEQkdfQk5PREVfUkVGUywgImZpbmRfaW5pdDogJWQgKCVwKVxuIiwgdHJlZS0+Y25pZCwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKKwlkb3duKCZ0cmVlLT50cmVlX2xvY2spOworCXJldHVybiAwOworfQorCit2b2lkIGhmc19maW5kX2V4aXQoc3RydWN0IGhmc19maW5kX2RhdGEgKmZkKQoreworCWhmc19ibm9kZV9wdXQoZmQtPmJub2RlKTsKKwlrZnJlZShmZC0+c2VhcmNoX2tleSk7CisJZHByaW50KERCR19CTk9ERV9SRUZTLCAiZmluZF9leGl0OiAlZCAoJXApXG4iLCBmZC0+dHJlZS0+Y25pZCwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKKwl1cCgmZmQtPnRyZWUtPnRyZWVfbG9jayk7CisJZmQtPnRyZWUgPSBOVUxMOworfQorCisvKiBGaW5kIHRoZSByZWNvcmQgaW4gYm5vZGUgdGhhdCBiZXN0IG1hdGNoZXMga2V5IChub3QgZ3JlYXRlciB0aGFuLi4uKSovCitpbnQgX19oZnNfYnJlY19maW5kKHN0cnVjdCBoZnNfYm5vZGUgKmJub2RlLCBzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqZmQpCit7CisJaW50IGNtcHZhbDsKKwl1MTYgb2ZmLCBsZW4sIGtleWxlbjsKKwlpbnQgcmVjOworCWludCBiLCBlOworCWludCByZXM7CisKKwliID0gMDsKKwllID0gYm5vZGUtPm51bV9yZWNzIC0gMTsKKwlyZXMgPSAtRU5PRU5UOworCWRvIHsKKwkJcmVjID0gKGUgKyBiKSAvIDI7CisJCWxlbiA9IGhmc19icmVjX2xlbm9mZihibm9kZSwgcmVjLCAmb2ZmKTsKKwkJa2V5bGVuID0gaGZzX2JyZWNfa2V5bGVuKGJub2RlLCByZWMpOworCQloZnNfYm5vZGVfcmVhZChibm9kZSwgZmQtPmtleSwgb2ZmLCBrZXlsZW4pOworCQljbXB2YWwgPSBibm9kZS0+dHJlZS0+a2V5Y21wKGZkLT5rZXksIGZkLT5zZWFyY2hfa2V5KTsKKwkJaWYgKCFjbXB2YWwpIHsKKwkJCWUgPSByZWM7CisJCQlyZXMgPSAwOworCQkJZ290byBkb25lOworCQl9CisJCWlmIChjbXB2YWwgPCAwKQorCQkJYiA9IHJlYyArIDE7CisJCWVsc2UKKwkJCWUgPSByZWMgLSAxOworCX0gd2hpbGUgKGIgPD0gZSk7CisJLy9wcmludGsoIiVkOiAlZCwlZCwlZFxuIiwgYm5vZGUtPnRoaXMsIGIsIGUsIHJlYyk7CisJaWYgKHJlYyAhPSBlICYmIGUgPj0gMCkgeworCQlsZW4gPSBoZnNfYnJlY19sZW5vZmYoYm5vZGUsIGUsICZvZmYpOworCQlrZXlsZW4gPSBoZnNfYnJlY19rZXlsZW4oYm5vZGUsIGUpOworCQloZnNfYm5vZGVfcmVhZChibm9kZSwgZmQtPmtleSwgb2ZmLCBrZXlsZW4pOworCX0KK2RvbmU6CisJZmQtPnJlY29yZCA9IGU7CisJZmQtPmtleW9mZnNldCA9IG9mZjsKKwlmZC0+a2V5bGVuZ3RoID0ga2V5bGVuOworCWZkLT5lbnRyeW9mZnNldCA9IG9mZiArIGtleWxlbjsKKwlmZC0+ZW50cnlsZW5ndGggPSBsZW4gLSBrZXlsZW47CisJcmV0dXJuIHJlczsKK30KKworLyogVHJhdmVyc2UgYSBCKlRyZWUgZnJvbSB0aGUgcm9vdCB0byBhIGxlYWYgZmluZGluZyBiZXN0IGZpdCB0byBrZXkgKi8KKy8qIFJldHVybiBhbGxvY2F0ZWQgY29weSBvZiBub2RlIGZvdW5kLCBzZXQgcmVjbnVtIHRvIGJlc3QgcmVjb3JkICovCitpbnQgaGZzX2JyZWNfZmluZChzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqZmQpCit7CisJc3RydWN0IGhmc19idHJlZSAqdHJlZTsKKwlzdHJ1Y3QgaGZzX2Jub2RlICpibm9kZTsKKwl1MzIgbmlkeCwgcGFyZW50OworCV9fYmUzMiBkYXRhOworCWludCBoZWlnaHQsIHJlczsKKworCXRyZWUgPSBmZC0+dHJlZTsKKwlpZiAoZmQtPmJub2RlKQorCQloZnNfYm5vZGVfcHV0KGZkLT5ibm9kZSk7CisJZmQtPmJub2RlID0gTlVMTDsKKwluaWR4ID0gdHJlZS0+cm9vdDsKKwlpZiAoIW5pZHgpCisJCXJldHVybiAtRU5PRU5UOworCWhlaWdodCA9IHRyZWUtPmRlcHRoOworCXJlcyA9IDA7CisJcGFyZW50ID0gMDsKKwlmb3IgKDs7KSB7CisJCWJub2RlID0gaGZzX2Jub2RlX2ZpbmQodHJlZSwgbmlkeCk7CisJCWlmIChJU19FUlIoYm5vZGUpKSB7CisJCQlyZXMgPSBQVFJfRVJSKGJub2RlKTsKKwkJCWJub2RlID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChibm9kZS0+aGVpZ2h0ICE9IGhlaWdodCkKKwkJCWdvdG8gaW52YWxpZDsKKwkJaWYgKGJub2RlLT50eXBlICE9ICgtLWhlaWdodCA/IEhGU19OT0RFX0lOREVYIDogSEZTX05PREVfTEVBRikpCisJCQlnb3RvIGludmFsaWQ7CisJCWJub2RlLT5wYXJlbnQgPSBwYXJlbnQ7CisKKwkJcmVzID0gX19oZnNfYnJlY19maW5kKGJub2RlLCBmZCk7CisJCWlmICghaGVpZ2h0KQorCQkJYnJlYWs7CisJCWlmIChmZC0+cmVjb3JkIDwgMCkKKwkJCWdvdG8gcmVsZWFzZTsKKworCQlwYXJlbnQgPSBuaWR4OworCQloZnNfYm5vZGVfcmVhZChibm9kZSwgJmRhdGEsIGZkLT5lbnRyeW9mZnNldCwgNCk7CisJCW5pZHggPSBiZTMyX3RvX2NwdShkYXRhKTsKKwkJaGZzX2Jub2RlX3B1dChibm9kZSk7CisJfQorCWZkLT5ibm9kZSA9IGJub2RlOworCXJldHVybiByZXM7CisKK2ludmFsaWQ6CisJcHJpbnRrKCJIRlMrLWZzOiBpbmNvbnNpc3RlbmN5IGluIEIqVHJlZSAoJWQsJWQsJWQsJXUsJXUpXG4iLAorCQloZWlnaHQsIGJub2RlLT5oZWlnaHQsIGJub2RlLT50eXBlLCBuaWR4LCBwYXJlbnQpOworCXJlcyA9IC1FSU87CityZWxlYXNlOgorCWhmc19ibm9kZV9wdXQoYm5vZGUpOworCXJldHVybiByZXM7Cit9CisKK2ludCBoZnNfYnJlY19yZWFkKHN0cnVjdCBoZnNfZmluZF9kYXRhICpmZCwgdm9pZCAqcmVjLCBpbnQgcmVjX2xlbikKK3sKKwlpbnQgcmVzOworCisJcmVzID0gaGZzX2JyZWNfZmluZChmZCk7CisJaWYgKHJlcykKKwkJcmV0dXJuIHJlczsKKwlpZiAoZmQtPmVudHJ5bGVuZ3RoID4gcmVjX2xlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaGZzX2Jub2RlX3JlYWQoZmQtPmJub2RlLCByZWMsIGZkLT5lbnRyeW9mZnNldCwgZmQtPmVudHJ5bGVuZ3RoKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGhmc19icmVjX2dvdG8oc3RydWN0IGhmc19maW5kX2RhdGEgKmZkLCBpbnQgY250KQoreworCXN0cnVjdCBoZnNfYnRyZWUgKnRyZWU7CisJc3RydWN0IGhmc19ibm9kZSAqYm5vZGU7CisJaW50IGlkeCwgcmVzID0gMDsKKwl1MTYgb2ZmLCBsZW4sIGtleWxlbjsKKworCWJub2RlID0gZmQtPmJub2RlOworCXRyZWUgPSBibm9kZS0+dHJlZTsKKworCWlmIChjbnQgPCAwKSB7CisJCWNudCA9IC1jbnQ7CisJCXdoaWxlIChjbnQgPiBmZC0+cmVjb3JkKSB7CisJCQljbnQgLT0gZmQtPnJlY29yZCArIDE7CisJCQlmZC0+cmVjb3JkID0gYm5vZGUtPm51bV9yZWNzIC0gMTsKKwkJCWlkeCA9IGJub2RlLT5wcmV2OworCQkJaWYgKCFpZHgpIHsKKwkJCQlyZXMgPSAtRU5PRU5UOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJaGZzX2Jub2RlX3B1dChibm9kZSk7CisJCQlibm9kZSA9IGhmc19ibm9kZV9maW5kKHRyZWUsIGlkeCk7CisJCQlpZiAoSVNfRVJSKGJub2RlKSkgeworCQkJCXJlcyA9IFBUUl9FUlIoYm5vZGUpOworCQkJCWJub2RlID0gTlVMTDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQlmZC0+cmVjb3JkIC09IGNudDsKKwl9IGVsc2UgeworCQl3aGlsZSAoY250ID49IGJub2RlLT5udW1fcmVjcyAtIGZkLT5yZWNvcmQpIHsKKwkJCWNudCAtPSBibm9kZS0+bnVtX3JlY3MgLSBmZC0+cmVjb3JkOworCQkJZmQtPnJlY29yZCA9IDA7CisJCQlpZHggPSBibm9kZS0+bmV4dDsKKwkJCWlmICghaWR4KSB7CisJCQkJcmVzID0gLUVOT0VOVDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWhmc19ibm9kZV9wdXQoYm5vZGUpOworCQkJYm5vZGUgPSBoZnNfYm5vZGVfZmluZCh0cmVlLCBpZHgpOworCQkJaWYgKElTX0VSUihibm9kZSkpIHsKKwkJCQlyZXMgPSBQVFJfRVJSKGJub2RlKTsKKwkJCQlibm9kZSA9IE5VTEw7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwkJZmQtPnJlY29yZCArPSBjbnQ7CisJfQorCisJbGVuID0gaGZzX2JyZWNfbGVub2ZmKGJub2RlLCBmZC0+cmVjb3JkLCAmb2ZmKTsKKwlrZXlsZW4gPSBoZnNfYnJlY19rZXlsZW4oYm5vZGUsIGZkLT5yZWNvcmQpOworCWZkLT5rZXlvZmZzZXQgPSBvZmY7CisJZmQtPmtleWxlbmd0aCA9IGtleWxlbjsKKwlmZC0+ZW50cnlvZmZzZXQgPSBvZmYgKyBrZXlsZW47CisJZmQtPmVudHJ5bGVuZ3RoID0gbGVuIC0ga2V5bGVuOworCWhmc19ibm9kZV9yZWFkKGJub2RlLCBmZC0+a2V5LCBvZmYsIGtleWxlbik7CitvdXQ6CisJZmQtPmJub2RlID0gYm5vZGU7CisJcmV0dXJuIHJlczsKK30KZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvYml0bWFwLmMgYi9mcy9oZnNwbHVzL2JpdG1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZDMxNjQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9oZnNwbHVzL2JpdG1hcC5jCkBAIC0wLDAgKzEsMjIxIEBACisvKgorICogIGxpbnV4L2ZzL2hmc3BsdXMvYml0bWFwLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEKKyAqIEJyYWQgQm95ZXIgKGZsYXJAYWxsYW5kcmlhLmNvbSkKKyAqIChDKSAyMDAzIEFyZGlzIFRlY2hub2xvZ2llcyA8cm9tYW5AYXJkaXN0ZWNoLmNvbT4KKyAqCisgKiBIYW5kbGluZyBvZiBhbGxvY2F0aW9uIGZpbGUKKyAqLworCisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorCisjaW5jbHVkZSAiaGZzcGx1c19mcy5oIgorI2luY2x1ZGUgImhmc3BsdXNfcmF3LmgiCisKKyNkZWZpbmUgUEFHRV9DQUNIRV9CSVRTCShQQUdFX0NBQ0hFX1NJWkUgKiA4KQorCitpbnQgaGZzcGx1c19ibG9ja19hbGxvY2F0ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1MzIgc2l6ZSwgdTMyIG9mZnNldCwgdTMyICptYXgpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CisJX19iZTMyICpwcHRyLCAqY3VyciwgKmVuZDsKKwl1MzIgbWFzaywgc3RhcnQsIGxlbiwgbjsKKwlfX2JlMzIgdmFsOworCWludCBpOworCisJbGVuID0gKm1heDsKKwlpZiAoIWxlbikKKwkJcmV0dXJuIHNpemU7CisKKwlkcHJpbnQoREJHX0JJVE1BUCwgImJsb2NrX2FsbG9jYXRlOiAldSwldSwldVxuIiwgc2l6ZSwgb2Zmc2V0LCBsZW4pOworCWRvd24oJkhGU1BMVVNfU0Ioc2IpLmFsbG9jX2ZpbGUtPmlfc2VtKTsKKwltYXBwaW5nID0gSEZTUExVU19TQihzYikuYWxsb2NfZmlsZS0+aV9tYXBwaW5nOworCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UobWFwcGluZywgb2Zmc2V0IC8gUEFHRV9DQUNIRV9CSVRTLAorCQkJICAgICAgIChmaWxsZXJfdCAqKW1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZSwgTlVMTCk7CisJcHB0ciA9IGttYXAocGFnZSk7CisJY3VyciA9IHBwdHIgKyAob2Zmc2V0ICYgKFBBR0VfQ0FDSEVfQklUUyAtIDEpKSAvIDMyOworCWkgPSBvZmZzZXQgJSAzMjsKKwlvZmZzZXQgJj0gfihQQUdFX0NBQ0hFX0JJVFMgLSAxKTsKKwlpZiAoKHNpemUgXiBvZmZzZXQpIC8gUEFHRV9DQUNIRV9CSVRTKQorCQllbmQgPSBwcHRyICsgUEFHRV9DQUNIRV9CSVRTIC8gMzI7CisJZWxzZQorCQllbmQgPSBwcHRyICsgKChzaXplICsgMzEpICYgKFBBR0VfQ0FDSEVfQklUUyAtIDEpKSAvIDMyOworCisJLyogc2NhbiB0aGUgZmlyc3QgcGFydGlhbCB1MzIgZm9yIHplcm8gYml0cyAqLworCXZhbCA9ICpjdXJyOworCWlmICh+dmFsKSB7CisJCW4gPSBiZTMyX3RvX2NwdSh2YWwpOworCQltYXNrID0gKDFVIDw8IDMxKSA+PiBpOworCQlmb3IgKDsgaSA8IDMyOyBtYXNrID4+PSAxLCBpKyspIHsKKwkJCWlmICghKG4gJiBtYXNrKSkKKwkJCQlnb3RvIGZvdW5kOworCQl9CisJfQorCWN1cnIrKzsKKworCS8qIHNjYW4gY29tcGxldGUgdTMycyBmb3IgdGhlIGZpcnN0IHplcm8gYml0ICovCisJd2hpbGUgKDEpIHsKKwkJd2hpbGUgKGN1cnIgPCBlbmQpIHsKKwkJCXZhbCA9ICpjdXJyOworCQkJaWYgKH52YWwpIHsKKwkJCQluID0gYmUzMl90b19jcHUodmFsKTsKKwkJCQltYXNrID0gMSA8PCAzMTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgMzI7IG1hc2sgPj49IDEsIGkrKykgeworCQkJCQlpZiAoIShuICYgbWFzaykpCisJCQkJCQlnb3RvIGZvdW5kOworCQkJCX0KKwkJCX0KKwkJCWN1cnIrKzsKKwkJfQorCQlrdW5tYXAocGFnZSk7CisJCW9mZnNldCArPSBQQUdFX0NBQ0hFX0JJVFM7CisJCWlmIChvZmZzZXQgPj0gc2l6ZSkKKwkJCWJyZWFrOworCQlwYWdlID0gcmVhZF9jYWNoZV9wYWdlKG1hcHBpbmcsIG9mZnNldCAvIFBBR0VfQ0FDSEVfQklUUywKKwkJCQkgICAgICAgKGZpbGxlcl90ICopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlLCBOVUxMKTsKKwkJY3VyciA9IHBwdHIgPSBrbWFwKHBhZ2UpOworCQlpZiAoKHNpemUgXiBvZmZzZXQpIC8gUEFHRV9DQUNIRV9CSVRTKQorCQkJZW5kID0gcHB0ciArIFBBR0VfQ0FDSEVfQklUUyAvIDMyOworCQllbHNlCisJCQllbmQgPSBwcHRyICsgKChzaXplICsgMzEpICYgKFBBR0VfQ0FDSEVfQklUUyAtIDEpKSAvIDMyOworCX0KKwlkcHJpbnQoREJHX0JJVE1BUCwgImJpdG1hcCBmdWxsXG4iKTsKKwlzdGFydCA9IHNpemU7CisJZ290byBvdXQ7CisKK2ZvdW5kOgorCXN0YXJ0ID0gb2Zmc2V0ICsgKGN1cnIgLSBwcHRyKSAqIDMyICsgaTsKKwlpZiAoc3RhcnQgPj0gc2l6ZSkgeworCQlkcHJpbnQoREJHX0JJVE1BUCwgImJpdG1hcCBmdWxsXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCS8qIGRvIGFueSBwYXJ0aWFsIHUzMiBhdCB0aGUgc3RhcnQgKi8KKwlsZW4gPSBtaW4oc2l6ZSAtIHN0YXJ0LCBsZW4pOworCXdoaWxlICgxKSB7CisJCW4gfD0gbWFzazsKKwkJaWYgKCsraSA+PSAzMikKKwkJCWJyZWFrOworCQltYXNrID4+PSAxOworCQlpZiAoIS0tbGVuIHx8IG4gJiBtYXNrKQorCQkJZ290byBkb25lOworCX0KKwlpZiAoIS0tbGVuKQorCQlnb3RvIGRvbmU7CisJKmN1cnIrKyA9IGNwdV90b19iZTMyKG4pOworCS8qIGRvIGZ1bGwgdTMycyAqLworCXdoaWxlICgxKSB7CisJCXdoaWxlIChjdXJyIDwgZW5kKSB7CisJCQluID0gYmUzMl90b19jcHUoKmN1cnIpOworCQkJaWYgKGxlbiA8IDMyKQorCQkJCWdvdG8gbGFzdDsKKwkJCWlmIChuKSB7CisJCQkJbGVuID0gMzI7CisJCQkJZ290byBsYXN0OworCQkJfQorCQkJKmN1cnIrKyA9IGNwdV90b19iZTMyKDB4ZmZmZmZmZmYpOworCQkJbGVuIC09IDMyOworCQl9CisJCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworCQlrdW5tYXAocGFnZSk7CisJCW9mZnNldCArPSBQQUdFX0NBQ0hFX0JJVFM7CisJCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UobWFwcGluZywgb2Zmc2V0IC8gUEFHRV9DQUNIRV9CSVRTLAorCQkJCSAgICAgICAoZmlsbGVyX3QgKiltYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2UsIE5VTEwpOworCQlwcHRyID0ga21hcChwYWdlKTsKKwkJY3VyciA9IHBwdHI7CisJCWVuZCA9IHBwdHIgKyBQQUdFX0NBQ0hFX0JJVFMgLyAzMjsKKwl9CitsYXN0OgorCS8qIGRvIGFueSBwYXJ0aWFsIHUzMiBhdCBlbmQgKi8KKwltYXNrID0gMVUgPDwgMzE7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWlmIChuICYgbWFzaykKKwkJCWJyZWFrOworCQluIHw9IG1hc2s7CisJCW1hc2sgPj49IDE7CisJfQorZG9uZToKKwkqY3VyciA9IGNwdV90b19iZTMyKG4pOworCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworCWt1bm1hcChwYWdlKTsKKwkqbWF4ID0gb2Zmc2V0ICsgKGN1cnIgLSBwcHRyKSAqIDMyICsgaSAtIHN0YXJ0OworCUhGU1BMVVNfU0Ioc2IpLmZyZWVfYmxvY2tzIC09ICptYXg7CisJc2ItPnNfZGlydCA9IDE7CisJZHByaW50KERCR19CSVRNQVAsICItPiAldSwldVxuIiwgc3RhcnQsICptYXgpOworb3V0OgorCXVwKCZIRlNQTFVTX1NCKHNiKS5hbGxvY19maWxlLT5pX3NlbSk7CisJcmV0dXJuIHN0YXJ0OworfQorCitpbnQgaGZzcGx1c19ibG9ja19mcmVlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHUzMiBvZmZzZXQsIHUzMiBjb3VudCkKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKKwlfX2JlMzIgKnBwdHIsICpjdXJyLCAqZW5kOworCXUzMiBtYXNrLCBsZW4sIHBucjsKKwlpbnQgaTsKKworCS8qIGlzIHRoZXJlIGFueSBhY3R1YWwgd29yayB0byBiZSBkb25lPyAqLworCWlmICghY291bnQpCisJCXJldHVybiAwOworCisJZHByaW50KERCR19CSVRNQVAsICJibG9ja19mcmVlOiAldSwldVxuIiwgb2Zmc2V0LCBjb3VudCk7CisJLyogYXJlIGFsbCBvZiB0aGUgYml0cyBpbiByYW5nZT8gKi8KKwlpZiAoKG9mZnNldCArIGNvdW50KSA+IEhGU1BMVVNfU0Ioc2IpLnRvdGFsX2Jsb2NrcykKKwkJcmV0dXJuIC0yOworCisJZG93bigmSEZTUExVU19TQihzYikuYWxsb2NfZmlsZS0+aV9zZW0pOworCW1hcHBpbmcgPSBIRlNQTFVTX1NCKHNiKS5hbGxvY19maWxlLT5pX21hcHBpbmc7CisJcG5yID0gb2Zmc2V0IC8gUEFHRV9DQUNIRV9CSVRTOworCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UobWFwcGluZywgcG5yLCAoZmlsbGVyX3QgKiltYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2UsIE5VTEwpOworCXBwdHIgPSBrbWFwKHBhZ2UpOworCWN1cnIgPSBwcHRyICsgKG9mZnNldCAmIChQQUdFX0NBQ0hFX0JJVFMgLSAxKSkgLyAzMjsKKwllbmQgPSBwcHRyICsgUEFHRV9DQUNIRV9CSVRTIC8gMzI7CisJbGVuID0gY291bnQ7CisKKwkvKiBkbyBhbnkgcGFydGlhbCB1MzIgYXQgdGhlIHN0YXJ0ICovCisJaSA9IG9mZnNldCAlIDMyOworCWlmIChpKSB7CisJCWludCBqID0gMzIgLSBpOworCQltYXNrID0gMHhmZmZmZmZmZlUgPDwgajsKKwkJaWYgKGogPiBjb3VudCkgeworCQkJbWFzayB8PSAweGZmZmZmZmZmVSA+PiAoaSArIGNvdW50KTsKKwkJCSpjdXJyKysgJj0gY3B1X3RvX2JlMzIobWFzayk7CisJCQlnb3RvIG91dDsKKwkJfQorCQkqY3VycisrICY9IGNwdV90b19iZTMyKG1hc2spOworCQljb3VudCAtPSBqOworCX0KKworCS8qIGRvIGZ1bGwgdTMycyAqLworCXdoaWxlICgxKSB7CisJCXdoaWxlIChjdXJyIDwgZW5kKSB7CisJCQlpZiAoY291bnQgPCAzMikKKwkJCQlnb3RvIGRvbmU7CisJCQkqY3VycisrID0gMDsKKwkJCWNvdW50IC09IDMyOworCQl9CisJCWlmICghY291bnQpCisJCQlicmVhazsKKwkJc2V0X3BhZ2VfZGlydHkocGFnZSk7CisJCWt1bm1hcChwYWdlKTsKKwkJcGFnZSA9IHJlYWRfY2FjaGVfcGFnZShtYXBwaW5nLCArK3BuciwgKGZpbGxlcl90ICopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlLCBOVUxMKTsKKwkJcHB0ciA9IGttYXAocGFnZSk7CisJCWN1cnIgPSBwcHRyOworCQllbmQgPSBwcHRyICsgUEFHRV9DQUNIRV9CSVRTIC8gMzI7CisJfQorZG9uZToKKwkvKiBkbyBhbnkgcGFydGlhbCB1MzIgYXQgZW5kICovCisJaWYgKGNvdW50KSB7CisJCW1hc2sgPSAweGZmZmZmZmZmVSA+PiBjb3VudDsKKwkJKmN1cnIgJj0gY3B1X3RvX2JlMzIobWFzayk7CisJfQorb3V0OgorCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworCWt1bm1hcChwYWdlKTsKKwlIRlNQTFVTX1NCKHNiKS5mcmVlX2Jsb2NrcyArPSBsZW47CisJc2ItPnNfZGlydCA9IDE7CisJdXAoJkhGU1BMVVNfU0Ioc2IpLmFsbG9jX2ZpbGUtPmlfc2VtKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9ibm9kZS5jIGIvZnMvaGZzcGx1cy9ibm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2Nzg3MmUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9oZnNwbHVzL2Jub2RlLmMKQEAgLTAsMCArMSw2NjIgQEAKKy8qCisgKiAgbGludXgvZnMvaGZzcGx1cy9ibm9kZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxCisgKiBCcmFkIEJveWVyIChmbGFyQGFsbGFuZHJpYS5jb20pCisgKiAoQykgMjAwMyBBcmRpcyBUZWNobm9sb2dpZXMgPHJvbWFuQGFyZGlzdGVjaC5jb20+CisgKgorICogSGFuZGxlIGJhc2ljIGJ0cmVlIG5vZGUgb3BlcmF0aW9ucworICovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3dhcC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2luY2x1ZGUgImhmc3BsdXNfZnMuaCIKKyNpbmNsdWRlICJoZnNwbHVzX3Jhdy5oIgorCisjZGVmaW5lIFJFRl9QQUdFUwkwCisKKy8qIENvcHkgYSBzcGVjaWZpZWQgcmFuZ2Ugb2YgYnl0ZXMgZnJvbSB0aGUgcmF3IGRhdGEgb2YgYSBub2RlICovCit2b2lkIGhmc19ibm9kZV9yZWFkKHN0cnVjdCBoZnNfYm5vZGUgKm5vZGUsIHZvaWQgKmJ1ZiwgaW50IG9mZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgcGFnZSAqKnBhZ2VwOworCWludCBsOworCisJb2ZmICs9IG5vZGUtPnBhZ2Vfb2Zmc2V0OworCXBhZ2VwID0gbm9kZS0+cGFnZSArIChvZmYgPj4gUEFHRV9DQUNIRV9TSElGVCk7CisJb2ZmICY9IH5QQUdFX0NBQ0hFX01BU0s7CisKKwlsID0gbWluKGxlbiwgKGludClQQUdFX0NBQ0hFX1NJWkUgLSBvZmYpOworCW1lbWNweShidWYsIGttYXAoKnBhZ2VwKSArIG9mZiwgbCk7CisJa3VubWFwKCpwYWdlcCk7CisKKwl3aGlsZSAoKGxlbiAtPSBsKSAhPSAwKSB7CisJCWJ1ZiArPSBsOworCQlsID0gbWluKGxlbiwgKGludClQQUdFX0NBQ0hFX1NJWkUpOworCQltZW1jcHkoYnVmLCBrbWFwKCorK3BhZ2VwKSwgbCk7CisJCWt1bm1hcCgqcGFnZXApOworCX0KK30KKwordTE2IGhmc19ibm9kZV9yZWFkX3UxNihzdHJ1Y3QgaGZzX2Jub2RlICpub2RlLCBpbnQgb2ZmKQoreworCV9fYmUxNiBkYXRhOworCS8vIG9wdGltaXplIGxhdGVyLi4uCisJaGZzX2Jub2RlX3JlYWQobm9kZSwgJmRhdGEsIG9mZiwgMik7CisJcmV0dXJuIGJlMTZfdG9fY3B1KGRhdGEpOworfQorCit1OCBoZnNfYm5vZGVfcmVhZF91OChzdHJ1Y3QgaGZzX2Jub2RlICpub2RlLCBpbnQgb2ZmKQoreworCXU4IGRhdGE7CisJLy8gb3B0aW1pemUgbGF0ZXIuLi4KKwloZnNfYm5vZGVfcmVhZChub2RlLCAmZGF0YSwgb2ZmLCAxKTsKKwlyZXR1cm4gZGF0YTsKK30KKwordm9pZCBoZnNfYm5vZGVfcmVhZF9rZXkoc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgdm9pZCAqa2V5LCBpbnQgb2ZmKQoreworCXN0cnVjdCBoZnNfYnRyZWUgKnRyZWU7CisJaW50IGtleV9sZW47CisKKwl0cmVlID0gbm9kZS0+dHJlZTsKKwlpZiAobm9kZS0+dHlwZSA9PSBIRlNfTk9ERV9MRUFGIHx8CisJICAgIHRyZWUtPmF0dHJpYnV0ZXMgJiBIRlNfVFJFRV9WQVJJRFhLRVlTKQorCQlrZXlfbGVuID0gaGZzX2Jub2RlX3JlYWRfdTE2KG5vZGUsIG9mZikgKyAyOworCWVsc2UKKwkJa2V5X2xlbiA9IHRyZWUtPm1heF9rZXlfbGVuICsgMjsKKworCWhmc19ibm9kZV9yZWFkKG5vZGUsIGtleSwgb2ZmLCBrZXlfbGVuKTsKK30KKwordm9pZCBoZnNfYm5vZGVfd3JpdGUoc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgdm9pZCAqYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKQoreworCXN0cnVjdCBwYWdlICoqcGFnZXA7CisJaW50IGw7CisKKwlvZmYgKz0gbm9kZS0+cGFnZV9vZmZzZXQ7CisJcGFnZXAgPSBub2RlLT5wYWdlICsgKG9mZiA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwlvZmYgJj0gflBBR0VfQ0FDSEVfTUFTSzsKKworCWwgPSBtaW4obGVuLCAoaW50KVBBR0VfQ0FDSEVfU0laRSAtIG9mZik7CisJbWVtY3B5KGttYXAoKnBhZ2VwKSArIG9mZiwgYnVmLCBsKTsKKwlzZXRfcGFnZV9kaXJ0eSgqcGFnZXApOworCWt1bm1hcCgqcGFnZXApOworCisJd2hpbGUgKChsZW4gLT0gbCkgIT0gMCkgeworCQlidWYgKz0gbDsKKwkJbCA9IG1pbihsZW4sIChpbnQpUEFHRV9DQUNIRV9TSVpFKTsKKwkJbWVtY3B5KGttYXAoKisrcGFnZXApLCBidWYsIGwpOworCQlzZXRfcGFnZV9kaXJ0eSgqcGFnZXApOworCQlrdW5tYXAoKnBhZ2VwKTsKKwl9Cit9CisKK3ZvaWQgaGZzX2Jub2RlX3dyaXRlX3UxNihzdHJ1Y3QgaGZzX2Jub2RlICpub2RlLCBpbnQgb2ZmLCB1MTYgZGF0YSkKK3sKKwlfX2JlMTYgdiA9IGNwdV90b19iZTE2KGRhdGEpOworCS8vIG9wdGltaXplIGxhdGVyLi4uCisJaGZzX2Jub2RlX3dyaXRlKG5vZGUsICZ2LCBvZmYsIDIpOworfQorCit2b2lkIGhmc19ibm9kZV9jbGVhcihzdHJ1Y3QgaGZzX2Jub2RlICpub2RlLCBpbnQgb2ZmLCBpbnQgbGVuKQoreworCXN0cnVjdCBwYWdlICoqcGFnZXA7CisJaW50IGw7CisKKwlvZmYgKz0gbm9kZS0+cGFnZV9vZmZzZXQ7CisJcGFnZXAgPSBub2RlLT5wYWdlICsgKG9mZiA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwlvZmYgJj0gflBBR0VfQ0FDSEVfTUFTSzsKKworCWwgPSBtaW4obGVuLCAoaW50KVBBR0VfQ0FDSEVfU0laRSAtIG9mZik7CisJbWVtc2V0KGttYXAoKnBhZ2VwKSArIG9mZiwgMCwgbCk7CisJc2V0X3BhZ2VfZGlydHkoKnBhZ2VwKTsKKwlrdW5tYXAoKnBhZ2VwKTsKKworCXdoaWxlICgobGVuIC09IGwpICE9IDApIHsKKwkJbCA9IG1pbihsZW4sIChpbnQpUEFHRV9DQUNIRV9TSVpFKTsKKwkJbWVtc2V0KGttYXAoKisrcGFnZXApLCAwLCBsKTsKKwkJc2V0X3BhZ2VfZGlydHkoKnBhZ2VwKTsKKwkJa3VubWFwKCpwYWdlcCk7CisJfQorfQorCit2b2lkIGhmc19ibm9kZV9jb3B5KHN0cnVjdCBoZnNfYm5vZGUgKmRzdF9ub2RlLCBpbnQgZHN0LAorCQkgICAgc3RydWN0IGhmc19ibm9kZSAqc3JjX25vZGUsIGludCBzcmMsIGludCBsZW4pCit7CisJc3RydWN0IGhmc19idHJlZSAqdHJlZTsKKwlzdHJ1Y3QgcGFnZSAqKnNyY19wYWdlLCAqKmRzdF9wYWdlOworCWludCBsOworCisJZHByaW50KERCR19CTk9ERV9NT0QsICJjb3B5Ynl0ZXM6ICV1LCV1LCV1XG4iLCBkc3QsIHNyYywgbGVuKTsKKwlpZiAoIWxlbikKKwkJcmV0dXJuOworCXRyZWUgPSBzcmNfbm9kZS0+dHJlZTsKKwlzcmMgKz0gc3JjX25vZGUtPnBhZ2Vfb2Zmc2V0OworCWRzdCArPSBkc3Rfbm9kZS0+cGFnZV9vZmZzZXQ7CisJc3JjX3BhZ2UgPSBzcmNfbm9kZS0+cGFnZSArIChzcmMgPj4gUEFHRV9DQUNIRV9TSElGVCk7CisJc3JjICY9IH5QQUdFX0NBQ0hFX01BU0s7CisJZHN0X3BhZ2UgPSBkc3Rfbm9kZS0+cGFnZSArIChkc3QgPj4gUEFHRV9DQUNIRV9TSElGVCk7CisJZHN0ICY9IH5QQUdFX0NBQ0hFX01BU0s7CisKKwlpZiAoc3JjID09IGRzdCkgeworCQlsID0gbWluKGxlbiwgKGludClQQUdFX0NBQ0hFX1NJWkUgLSBzcmMpOworCQltZW1jcHkoa21hcCgqZHN0X3BhZ2UpICsgc3JjLCBrbWFwKCpzcmNfcGFnZSkgKyBzcmMsIGwpOworCQlrdW5tYXAoKnNyY19wYWdlKTsKKwkJc2V0X3BhZ2VfZGlydHkoKmRzdF9wYWdlKTsKKwkJa3VubWFwKCpkc3RfcGFnZSk7CisKKwkJd2hpbGUgKChsZW4gLT0gbCkgIT0gMCkgeworCQkJbCA9IG1pbihsZW4sIChpbnQpUEFHRV9DQUNIRV9TSVpFKTsKKwkJCW1lbWNweShrbWFwKCorK2RzdF9wYWdlKSwga21hcCgqKytzcmNfcGFnZSksIGwpOworCQkJa3VubWFwKCpzcmNfcGFnZSk7CisJCQlzZXRfcGFnZV9kaXJ0eSgqZHN0X3BhZ2UpOworCQkJa3VubWFwKCpkc3RfcGFnZSk7CisJCX0KKwl9IGVsc2UgeworCQl2b2lkICpzcmNfcHRyLCAqZHN0X3B0cjsKKworCQlkbyB7CisJCQlzcmNfcHRyID0ga21hcCgqc3JjX3BhZ2UpICsgc3JjOworCQkJZHN0X3B0ciA9IGttYXAoKmRzdF9wYWdlKSArIGRzdDsKKwkJCWlmIChQQUdFX0NBQ0hFX1NJWkUgLSBzcmMgPCBQQUdFX0NBQ0hFX1NJWkUgLSBkc3QpIHsKKwkJCQlsID0gUEFHRV9DQUNIRV9TSVpFIC0gc3JjOworCQkJCXNyYyA9IDA7CisJCQkJZHN0ICs9IGw7CisJCQl9IGVsc2UgeworCQkJCWwgPSBQQUdFX0NBQ0hFX1NJWkUgLSBkc3Q7CisJCQkJc3JjICs9IGw7CisJCQkJZHN0ID0gMDsKKwkJCX0KKwkJCWwgPSBtaW4obGVuLCBsKTsKKwkJCW1lbWNweShkc3RfcHRyLCBzcmNfcHRyLCBsKTsKKwkJCWt1bm1hcCgqc3JjX3BhZ2UpOworCQkJc2V0X3BhZ2VfZGlydHkoKmRzdF9wYWdlKTsKKwkJCWt1bm1hcCgqZHN0X3BhZ2UpOworCQkJaWYgKCFkc3QpCisJCQkJZHN0X3BhZ2UrKzsKKwkJCWVsc2UKKwkJCQlzcmNfcGFnZSsrOworCQl9IHdoaWxlICgobGVuIC09IGwpKTsKKwl9Cit9CisKK3ZvaWQgaGZzX2Jub2RlX21vdmUoc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgaW50IGRzdCwgaW50IHNyYywgaW50IGxlbikKK3sKKwlzdHJ1Y3QgcGFnZSAqKnNyY19wYWdlLCAqKmRzdF9wYWdlOworCWludCBsOworCisJZHByaW50KERCR19CTk9ERV9NT0QsICJtb3ZlYnl0ZXM6ICV1LCV1LCV1XG4iLCBkc3QsIHNyYywgbGVuKTsKKwlpZiAoIWxlbikKKwkJcmV0dXJuOworCXNyYyArPSBub2RlLT5wYWdlX29mZnNldDsKKwlkc3QgKz0gbm9kZS0+cGFnZV9vZmZzZXQ7CisJaWYgKGRzdCA+IHNyYykgeworCQlzcmMgKz0gbGVuIC0gMTsKKwkJc3JjX3BhZ2UgPSBub2RlLT5wYWdlICsgKHNyYyA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwkJc3JjID0gKHNyYyAmIH5QQUdFX0NBQ0hFX01BU0spICsgMTsKKwkJZHN0ICs9IGxlbiAtIDE7CisJCWRzdF9wYWdlID0gbm9kZS0+cGFnZSArIChkc3QgPj4gUEFHRV9DQUNIRV9TSElGVCk7CisJCWRzdCA9IChkc3QgJiB+UEFHRV9DQUNIRV9NQVNLKSArIDE7CisKKwkJaWYgKHNyYyA9PSBkc3QpIHsKKwkJCXdoaWxlIChzcmMgPCBsZW4pIHsKKwkJCQltZW1tb3ZlKGttYXAoKmRzdF9wYWdlKSwga21hcCgqc3JjX3BhZ2UpLCBzcmMpOworCQkJCWt1bm1hcCgqc3JjX3BhZ2UpOworCQkJCXNldF9wYWdlX2RpcnR5KCpkc3RfcGFnZSk7CisJCQkJa3VubWFwKCpkc3RfcGFnZSk7CisJCQkJbGVuIC09IHNyYzsKKwkJCQlzcmMgPSBQQUdFX0NBQ0hFX1NJWkU7CisJCQkJc3JjX3BhZ2UtLTsKKwkJCQlkc3RfcGFnZS0tOworCQkJfQorCQkJc3JjIC09IGxlbjsKKwkJCW1lbW1vdmUoa21hcCgqZHN0X3BhZ2UpICsgc3JjLCBrbWFwKCpzcmNfcGFnZSkgKyBzcmMsIGxlbik7CisJCQlrdW5tYXAoKnNyY19wYWdlKTsKKwkJCXNldF9wYWdlX2RpcnR5KCpkc3RfcGFnZSk7CisJCQlrdW5tYXAoKmRzdF9wYWdlKTsKKwkJfSBlbHNlIHsKKwkJCXZvaWQgKnNyY19wdHIsICpkc3RfcHRyOworCisJCQlkbyB7CisJCQkJc3JjX3B0ciA9IGttYXAoKnNyY19wYWdlKSArIHNyYzsKKwkJCQlkc3RfcHRyID0ga21hcCgqZHN0X3BhZ2UpICsgZHN0OworCQkJCWlmIChzcmMgPCBkc3QpIHsKKwkJCQkJbCA9IHNyYzsKKwkJCQkJc3JjID0gUEFHRV9DQUNIRV9TSVpFOworCQkJCQlkc3QgLT0gbDsKKwkJCQl9IGVsc2UgeworCQkJCQlsID0gZHN0OworCQkJCQlzcmMgLT0gbDsKKwkJCQkJZHN0ID0gUEFHRV9DQUNIRV9TSVpFOworCQkJCX0KKwkJCQlsID0gbWluKGxlbiwgbCk7CisJCQkJbWVtbW92ZShkc3RfcHRyIC0gbCwgc3JjX3B0ciAtIGwsIGwpOworCQkJCWt1bm1hcCgqc3JjX3BhZ2UpOworCQkJCXNldF9wYWdlX2RpcnR5KCpkc3RfcGFnZSk7CisJCQkJa3VubWFwKCpkc3RfcGFnZSk7CisJCQkJaWYgKGRzdCA9PSBQQUdFX0NBQ0hFX1NJWkUpCisJCQkJCWRzdF9wYWdlLS07CisJCQkJZWxzZQorCQkJCQlzcmNfcGFnZS0tOworCQkJfSB3aGlsZSAoKGxlbiAtPSBsKSk7CisJCX0KKwl9IGVsc2UgeworCQlzcmNfcGFnZSA9IG5vZGUtPnBhZ2UgKyAoc3JjID4+IFBBR0VfQ0FDSEVfU0hJRlQpOworCQlzcmMgJj0gflBBR0VfQ0FDSEVfTUFTSzsKKwkJZHN0X3BhZ2UgPSBub2RlLT5wYWdlICsgKGRzdCA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwkJZHN0ICY9IH5QQUdFX0NBQ0hFX01BU0s7CisKKwkJaWYgKHNyYyA9PSBkc3QpIHsKKwkJCWwgPSBtaW4obGVuLCAoaW50KVBBR0VfQ0FDSEVfU0laRSAtIHNyYyk7CisJCQltZW1tb3ZlKGttYXAoKmRzdF9wYWdlKSArIHNyYywga21hcCgqc3JjX3BhZ2UpICsgc3JjLCBsKTsKKwkJCWt1bm1hcCgqc3JjX3BhZ2UpOworCQkJc2V0X3BhZ2VfZGlydHkoKmRzdF9wYWdlKTsKKwkJCWt1bm1hcCgqZHN0X3BhZ2UpOworCisJCQl3aGlsZSAoKGxlbiAtPSBsKSAhPSAwKSB7CisJCQkJbCA9IG1pbihsZW4sIChpbnQpUEFHRV9DQUNIRV9TSVpFKTsKKwkJCQltZW1tb3ZlKGttYXAoKisrZHN0X3BhZ2UpLCBrbWFwKCorK3NyY19wYWdlKSwgbCk7CisJCQkJa3VubWFwKCpzcmNfcGFnZSk7CisJCQkJc2V0X3BhZ2VfZGlydHkoKmRzdF9wYWdlKTsKKwkJCQlrdW5tYXAoKmRzdF9wYWdlKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXZvaWQgKnNyY19wdHIsICpkc3RfcHRyOworCisJCQlkbyB7CisJCQkJc3JjX3B0ciA9IGttYXAoKnNyY19wYWdlKSArIHNyYzsKKwkJCQlkc3RfcHRyID0ga21hcCgqZHN0X3BhZ2UpICsgZHN0OworCQkJCWlmIChQQUdFX0NBQ0hFX1NJWkUgLSBzcmMgPCBQQUdFX0NBQ0hFX1NJWkUgLSBkc3QpIHsKKwkJCQkJbCA9IFBBR0VfQ0FDSEVfU0laRSAtIHNyYzsKKwkJCQkJc3JjID0gMDsKKwkJCQkJZHN0ICs9IGw7CisJCQkJfSBlbHNlIHsKKwkJCQkJbCA9IFBBR0VfQ0FDSEVfU0laRSAtIGRzdDsKKwkJCQkJc3JjICs9IGw7CisJCQkJCWRzdCA9IDA7CisJCQkJfQorCQkJCWwgPSBtaW4obGVuLCBsKTsKKwkJCQltZW1tb3ZlKGRzdF9wdHIsIHNyY19wdHIsIGwpOworCQkJCWt1bm1hcCgqc3JjX3BhZ2UpOworCQkJCXNldF9wYWdlX2RpcnR5KCpkc3RfcGFnZSk7CisJCQkJa3VubWFwKCpkc3RfcGFnZSk7CisJCQkJaWYgKCFkc3QpCisJCQkJCWRzdF9wYWdlKys7CisJCQkJZWxzZQorCQkJCQlzcmNfcGFnZSsrOworCQkJfSB3aGlsZSAoKGxlbiAtPSBsKSk7CisJCX0KKwl9Cit9CisKK3ZvaWQgaGZzX2Jub2RlX2R1bXAoc3RydWN0IGhmc19ibm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgaGZzX2Jub2RlX2Rlc2MgZGVzYzsKKwlfX2JlMzIgY25pZDsKKwlpbnQgaSwgb2ZmLCBrZXlfb2ZmOworCisJZHByaW50KERCR19CTk9ERV9NT0QsICJibm9kZTogJWRcbiIsIG5vZGUtPnRoaXMpOworCWhmc19ibm9kZV9yZWFkKG5vZGUsICZkZXNjLCAwLCBzaXplb2YoZGVzYykpOworCWRwcmludChEQkdfQk5PREVfTU9ELCAiJWQsICVkLCAlZCwgJWQsICVkXG4iLAorCQliZTMyX3RvX2NwdShkZXNjLm5leHQpLCBiZTMyX3RvX2NwdShkZXNjLnByZXYpLAorCQlkZXNjLnR5cGUsIGRlc2MuaGVpZ2h0LCBiZTE2X3RvX2NwdShkZXNjLm51bV9yZWNzKSk7CisKKwlvZmYgPSBub2RlLT50cmVlLT5ub2RlX3NpemUgLSAyOworCWZvciAoaSA9IGJlMTZfdG9fY3B1KGRlc2MubnVtX3JlY3MpOyBpID49IDA7IG9mZiAtPSAyLCBpLS0pIHsKKwkJa2V5X29mZiA9IGhmc19ibm9kZV9yZWFkX3UxNihub2RlLCBvZmYpOworCQlkcHJpbnQoREJHX0JOT0RFX01PRCwgIiAlZCIsIGtleV9vZmYpOworCQlpZiAoaSAmJiBub2RlLT50eXBlID09IEhGU19OT0RFX0lOREVYKSB7CisJCQlpbnQgdG1wOworCisJCQlpZiAobm9kZS0+dHJlZS0+YXR0cmlidXRlcyAmIEhGU19UUkVFX1ZBUklEWEtFWVMpCisJCQkJdG1wID0gaGZzX2Jub2RlX3JlYWRfdTE2KG5vZGUsIGtleV9vZmYpICsgMjsKKwkJCWVsc2UKKwkJCQl0bXAgPSBub2RlLT50cmVlLT5tYXhfa2V5X2xlbiArIDI7CisJCQlkcHJpbnQoREJHX0JOT0RFX01PRCwgIiAoJWQiLCB0bXApOworCQkJaGZzX2Jub2RlX3JlYWQobm9kZSwgJmNuaWQsIGtleV9vZmYgKyB0bXAsIDQpOworCQkJZHByaW50KERCR19CTk9ERV9NT0QsICIsJWQpIiwgYmUzMl90b19jcHUoY25pZCkpOworCQl9IGVsc2UgaWYgKGkgJiYgbm9kZS0+dHlwZSA9PSBIRlNfTk9ERV9MRUFGKSB7CisJCQlpbnQgdG1wOworCisJCQl0bXAgPSBoZnNfYm5vZGVfcmVhZF91MTYobm9kZSwga2V5X29mZik7CisJCQlkcHJpbnQoREJHX0JOT0RFX01PRCwgIiAoJWQpIiwgdG1wKTsKKwkJfQorCX0KKwlkcHJpbnQoREJHX0JOT0RFX01PRCwgIlxuIik7Cit9CisKK3ZvaWQgaGZzX2Jub2RlX3VubGluayhzdHJ1Y3QgaGZzX2Jub2RlICpub2RlKQoreworCXN0cnVjdCBoZnNfYnRyZWUgKnRyZWU7CisJc3RydWN0IGhmc19ibm9kZSAqdG1wOworCV9fYmUzMiBjbmlkOworCisJdHJlZSA9IG5vZGUtPnRyZWU7CisJaWYgKG5vZGUtPnByZXYpIHsKKwkJdG1wID0gaGZzX2Jub2RlX2ZpbmQodHJlZSwgbm9kZS0+cHJldik7CisJCWlmIChJU19FUlIodG1wKSkKKwkJCXJldHVybjsKKwkJdG1wLT5uZXh0ID0gbm9kZS0+bmV4dDsKKwkJY25pZCA9IGNwdV90b19iZTMyKHRtcC0+bmV4dCk7CisJCWhmc19ibm9kZV93cml0ZSh0bXAsICZjbmlkLCBvZmZzZXRvZihzdHJ1Y3QgaGZzX2Jub2RlX2Rlc2MsIG5leHQpLCA0KTsKKwkJaGZzX2Jub2RlX3B1dCh0bXApOworCX0gZWxzZSBpZiAobm9kZS0+dHlwZSA9PSBIRlNfTk9ERV9MRUFGKQorCQl0cmVlLT5sZWFmX2hlYWQgPSBub2RlLT5uZXh0OworCisJaWYgKG5vZGUtPm5leHQpIHsKKwkJdG1wID0gaGZzX2Jub2RlX2ZpbmQodHJlZSwgbm9kZS0+bmV4dCk7CisJCWlmIChJU19FUlIodG1wKSkKKwkJCXJldHVybjsKKwkJdG1wLT5wcmV2ID0gbm9kZS0+cHJldjsKKwkJY25pZCA9IGNwdV90b19iZTMyKHRtcC0+cHJldik7CisJCWhmc19ibm9kZV93cml0ZSh0bXAsICZjbmlkLCBvZmZzZXRvZihzdHJ1Y3QgaGZzX2Jub2RlX2Rlc2MsIHByZXYpLCA0KTsKKwkJaGZzX2Jub2RlX3B1dCh0bXApOworCX0gZWxzZSBpZiAobm9kZS0+dHlwZSA9PSBIRlNfTk9ERV9MRUFGKQorCQl0cmVlLT5sZWFmX3RhaWwgPSBub2RlLT5wcmV2OworCisJLy8gbW92ZSBkb3duPworCWlmICghbm9kZS0+cHJldiAmJiAhbm9kZS0+bmV4dCkgeworCQlwcmludGsoImhmc19idHJlZV9kZWxfbGV2ZWxcbiIpOworCX0KKwlpZiAoIW5vZGUtPnBhcmVudCkgeworCQl0cmVlLT5yb290ID0gMDsKKwkJdHJlZS0+ZGVwdGggPSAwOworCX0KKwlzZXRfYml0KEhGU19CTk9ERV9ERUxFVEVELCAmbm9kZS0+ZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIGludCBoZnNfYm5vZGVfaGFzaCh1MzIgbnVtKQoreworCW51bSA9IChudW0gPj4gMTYpICsgbnVtOworCW51bSArPSBudW0gPj4gODsKKwlyZXR1cm4gbnVtICYgKE5PREVfSEFTSF9TSVpFIC0gMSk7Cit9CisKK3N0cnVjdCBoZnNfYm5vZGUgKmhmc19ibm9kZV9maW5kaGFzaChzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlLCB1MzIgY25pZCkKK3sKKwlzdHJ1Y3QgaGZzX2Jub2RlICpub2RlOworCisJaWYgKGNuaWQgPj0gdHJlZS0+bm9kZV9jb3VudCkgeworCQlwcmludGsoIkhGUystZnM6IHJlcXVlc3QgZm9yIG5vbi1leGlzdGVudCBub2RlICVkIGluIEIqVHJlZVxuIiwgY25pZCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWZvciAobm9kZSA9IHRyZWUtPm5vZGVfaGFzaFtoZnNfYm5vZGVfaGFzaChjbmlkKV07CisJICAgICBub2RlOyBub2RlID0gbm9kZS0+bmV4dF9oYXNoKSB7CisJCWlmIChub2RlLT50aGlzID09IGNuaWQpIHsKKwkJCXJldHVybiBub2RlOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGhmc19ibm9kZSAqX19oZnNfYm5vZGVfY3JlYXRlKHN0cnVjdCBoZnNfYnRyZWUgKnRyZWUsIHUzMiBjbmlkKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgKm5vZGUyOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOworCXN0cnVjdCBwYWdlICpwYWdlOworCWludCBzaXplLCBibG9jaywgaSwgaGFzaDsKKwlsb2ZmX3Qgb2ZmOworCisJaWYgKGNuaWQgPj0gdHJlZS0+bm9kZV9jb3VudCkgeworCQlwcmludGsoIkhGUystZnM6IHJlcXVlc3QgZm9yIG5vbi1leGlzdGVudCBub2RlICVkIGluIEIqVHJlZVxuIiwgY25pZCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXNiID0gdHJlZS0+aW5vZGUtPmlfc2I7CisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaGZzX2Jub2RlKSArIHRyZWUtPnBhZ2VzX3Blcl9ibm9kZSAqCisJCXNpemVvZihzdHJ1Y3QgcGFnZSAqKTsKKwlub2RlID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5vZGUpCisJCXJldHVybiBOVUxMOworCW1lbXNldChub2RlLCAwLCBzaXplKTsKKwlub2RlLT50cmVlID0gdHJlZTsKKwlub2RlLT50aGlzID0gY25pZDsKKwlzZXRfYml0KEhGU19CTk9ERV9ORVcsICZub2RlLT5mbGFncyk7CisJYXRvbWljX3NldCgmbm9kZS0+cmVmY250LCAxKTsKKwlkcHJpbnQoREJHX0JOT0RFX1JFRlMsICJuZXdfbm9kZSglZDolZCk6IDFcbiIsCisJICAgICAgIG5vZGUtPnRyZWUtPmNuaWQsIG5vZGUtPnRoaXMpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm5vZGUtPmxvY2tfd3EpOworCXNwaW5fbG9jaygmdHJlZS0+aGFzaF9sb2NrKTsKKwlub2RlMiA9IGhmc19ibm9kZV9maW5kaGFzaCh0cmVlLCBjbmlkKTsKKwlpZiAoIW5vZGUyKSB7CisJCWhhc2ggPSBoZnNfYm5vZGVfaGFzaChjbmlkKTsKKwkJbm9kZS0+bmV4dF9oYXNoID0gdHJlZS0+bm9kZV9oYXNoW2hhc2hdOworCQl0cmVlLT5ub2RlX2hhc2hbaGFzaF0gPSBub2RlOworCQl0cmVlLT5ub2RlX2hhc2hfY250Kys7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2soJnRyZWUtPmhhc2hfbG9jayk7CisJCWtmcmVlKG5vZGUpOworCQl3YWl0X2V2ZW50KG5vZGUyLT5sb2NrX3dxLCAhdGVzdF9iaXQoSEZTX0JOT0RFX05FVywgJm5vZGUyLT5mbGFncykpOworCQlyZXR1cm4gbm9kZTI7CisJfQorCXNwaW5fdW5sb2NrKCZ0cmVlLT5oYXNoX2xvY2spOworCisJbWFwcGluZyA9IHRyZWUtPmlub2RlLT5pX21hcHBpbmc7CisJb2ZmID0gKGxvZmZfdCljbmlkIDw8IHRyZWUtPm5vZGVfc2l6ZV9zaGlmdDsKKwlibG9jayA9IG9mZiA+PiBQQUdFX0NBQ0hFX1NISUZUOworCW5vZGUtPnBhZ2Vfb2Zmc2V0ID0gb2ZmICYgflBBR0VfQ0FDSEVfTUFTSzsKKwlmb3IgKGkgPSAwOyBpIDwgdHJlZS0+cGFnZXNfcGVyX2Jub2RlOyBibG9jaysrLCBpKyspIHsKKwkJcGFnZSA9IHJlYWRfY2FjaGVfcGFnZShtYXBwaW5nLCBibG9jaywgKGZpbGxlcl90ICopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlLCBOVUxMKTsKKwkJaWYgKElTX0VSUihwYWdlKSkKKwkJCWdvdG8gZmFpbDsKKwkJaWYgKFBhZ2VFcnJvcihwYWdlKSkgeworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJZ290byBmYWlsOworCQl9CisjaWYgIVJFRl9QQUdFUworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisjZW5kaWYKKwkJbm9kZS0+cGFnZVtpXSA9IHBhZ2U7CisJfQorCisJcmV0dXJuIG5vZGU7CitmYWlsOgorCXNldF9iaXQoSEZTX0JOT0RFX0VSUk9SLCAmbm9kZS0+ZmxhZ3MpOworCXJldHVybiBub2RlOworfQorCit2b2lkIGhmc19ibm9kZV91bmhhc2goc3RydWN0IGhmc19ibm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgaGZzX2Jub2RlICoqcDsKKworCWRwcmludChEQkdfQk5PREVfUkVGUywgInJlbW92ZV9ub2RlKCVkOiVkKTogJWRcbiIsCisJCW5vZGUtPnRyZWUtPmNuaWQsIG5vZGUtPnRoaXMsIGF0b21pY19yZWFkKCZub2RlLT5yZWZjbnQpKTsKKwlmb3IgKHAgPSAmbm9kZS0+dHJlZS0+bm9kZV9oYXNoW2hmc19ibm9kZV9oYXNoKG5vZGUtPnRoaXMpXTsKKwkgICAgICpwICYmICpwICE9IG5vZGU7IHAgPSAmKCpwKS0+bmV4dF9oYXNoKQorCQk7CisJaWYgKCEqcCkKKwkJQlVHKCk7CisJKnAgPSBub2RlLT5uZXh0X2hhc2g7CisJbm9kZS0+dHJlZS0+bm9kZV9oYXNoX2NudC0tOworfQorCisvKiBMb2FkIGEgcGFydGljdWxhciBub2RlIG91dCBvZiBhIHRyZWUgKi8KK3N0cnVjdCBoZnNfYm5vZGUgKmhmc19ibm9kZV9maW5kKHN0cnVjdCBoZnNfYnRyZWUgKnRyZWUsIHUzMiBudW0pCit7CisJc3RydWN0IGhmc19ibm9kZSAqbm9kZTsKKwlzdHJ1Y3QgaGZzX2Jub2RlX2Rlc2MgKmRlc2M7CisJaW50IGksIHJlY19vZmYsIG9mZiwgbmV4dF9vZmY7CisJaW50IGVudHJ5X3NpemUsIGtleV9zaXplOworCisJc3Bpbl9sb2NrKCZ0cmVlLT5oYXNoX2xvY2spOworCW5vZGUgPSBoZnNfYm5vZGVfZmluZGhhc2godHJlZSwgbnVtKTsKKwlpZiAobm9kZSkgeworCQloZnNfYm5vZGVfZ2V0KG5vZGUpOworCQlzcGluX3VubG9jaygmdHJlZS0+aGFzaF9sb2NrKTsKKwkJd2FpdF9ldmVudChub2RlLT5sb2NrX3dxLCAhdGVzdF9iaXQoSEZTX0JOT0RFX05FVywgJm5vZGUtPmZsYWdzKSk7CisJCWlmICh0ZXN0X2JpdChIRlNfQk5PREVfRVJST1IsICZub2RlLT5mbGFncykpCisJCQlnb3RvIG5vZGVfZXJyb3I7CisJCXJldHVybiBub2RlOworCX0KKwlzcGluX3VubG9jaygmdHJlZS0+aGFzaF9sb2NrKTsKKwlub2RlID0gX19oZnNfYm5vZGVfY3JlYXRlKHRyZWUsIG51bSk7CisJaWYgKCFub2RlKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlpZiAodGVzdF9iaXQoSEZTX0JOT0RFX0VSUk9SLCAmbm9kZS0+ZmxhZ3MpKQorCQlnb3RvIG5vZGVfZXJyb3I7CisJaWYgKCF0ZXN0X2JpdChIRlNfQk5PREVfTkVXLCAmbm9kZS0+ZmxhZ3MpKQorCQlyZXR1cm4gbm9kZTsKKworCWRlc2MgPSAoc3RydWN0IGhmc19ibm9kZV9kZXNjICopKGttYXAobm9kZS0+cGFnZVswXSkgKyBub2RlLT5wYWdlX29mZnNldCk7CisJbm9kZS0+cHJldiA9IGJlMzJfdG9fY3B1KGRlc2MtPnByZXYpOworCW5vZGUtPm5leHQgPSBiZTMyX3RvX2NwdShkZXNjLT5uZXh0KTsKKwlub2RlLT5udW1fcmVjcyA9IGJlMTZfdG9fY3B1KGRlc2MtPm51bV9yZWNzKTsKKwlub2RlLT50eXBlID0gZGVzYy0+dHlwZTsKKwlub2RlLT5oZWlnaHQgPSBkZXNjLT5oZWlnaHQ7CisJa3VubWFwKG5vZGUtPnBhZ2VbMF0pOworCisJc3dpdGNoIChub2RlLT50eXBlKSB7CisJY2FzZSBIRlNfTk9ERV9IRUFERVI6CisJY2FzZSBIRlNfTk9ERV9NQVA6CisJCWlmIChub2RlLT5oZWlnaHQgIT0gMCkKKwkJCWdvdG8gbm9kZV9lcnJvcjsKKwkJYnJlYWs7CisJY2FzZSBIRlNfTk9ERV9MRUFGOgorCQlpZiAobm9kZS0+aGVpZ2h0ICE9IDEpCisJCQlnb3RvIG5vZGVfZXJyb3I7CisJCWJyZWFrOworCWNhc2UgSEZTX05PREVfSU5ERVg6CisJCWlmIChub2RlLT5oZWlnaHQgPD0gMSB8fCBub2RlLT5oZWlnaHQgPiB0cmVlLT5kZXB0aCkKKwkJCWdvdG8gbm9kZV9lcnJvcjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byBub2RlX2Vycm9yOworCX0KKworCXJlY19vZmYgPSB0cmVlLT5ub2RlX3NpemUgLSAyOworCW9mZiA9IGhmc19ibm9kZV9yZWFkX3UxNihub2RlLCByZWNfb2ZmKTsKKwlpZiAob2ZmICE9IHNpemVvZihzdHJ1Y3QgaGZzX2Jub2RlX2Rlc2MpKQorCQlnb3RvIG5vZGVfZXJyb3I7CisJZm9yIChpID0gMTsgaSA8PSBub2RlLT5udW1fcmVjczsgb2ZmID0gbmV4dF9vZmYsIGkrKykgeworCQlyZWNfb2ZmIC09IDI7CisJCW5leHRfb2ZmID0gaGZzX2Jub2RlX3JlYWRfdTE2KG5vZGUsIHJlY19vZmYpOworCQlpZiAobmV4dF9vZmYgPD0gb2ZmIHx8CisJCSAgICBuZXh0X29mZiA+IHRyZWUtPm5vZGVfc2l6ZSB8fAorCQkgICAgbmV4dF9vZmYgJiAxKQorCQkJZ290byBub2RlX2Vycm9yOworCQllbnRyeV9zaXplID0gbmV4dF9vZmYgLSBvZmY7CisJCWlmIChub2RlLT50eXBlICE9IEhGU19OT0RFX0lOREVYICYmCisJCSAgICBub2RlLT50eXBlICE9IEhGU19OT0RFX0xFQUYpCisJCQljb250aW51ZTsKKwkJa2V5X3NpemUgPSBoZnNfYm5vZGVfcmVhZF91MTYobm9kZSwgb2ZmKSArIDI7CisJCWlmIChrZXlfc2l6ZSA+PSBlbnRyeV9zaXplIHx8IGtleV9zaXplICYgMSkKKwkJCWdvdG8gbm9kZV9lcnJvcjsKKwl9CisJY2xlYXJfYml0KEhGU19CTk9ERV9ORVcsICZub2RlLT5mbGFncyk7CisJd2FrZV91cCgmbm9kZS0+bG9ja193cSk7CisJcmV0dXJuIG5vZGU7CisKK25vZGVfZXJyb3I6CisJc2V0X2JpdChIRlNfQk5PREVfRVJST1IsICZub2RlLT5mbGFncyk7CisJY2xlYXJfYml0KEhGU19CTk9ERV9ORVcsICZub2RlLT5mbGFncyk7CisJd2FrZV91cCgmbm9kZS0+bG9ja193cSk7CisJaGZzX2Jub2RlX3B1dChub2RlKTsKKwlyZXR1cm4gRVJSX1BUUigtRUlPKTsKK30KKwordm9pZCBoZnNfYm5vZGVfZnJlZShzdHJ1Y3QgaGZzX2Jub2RlICpub2RlKQoreworCS8vaW50IGk7CisKKwkvL2ZvciAoaSA9IDA7IGkgPCBub2RlLT50cmVlLT5wYWdlc19wZXJfYm5vZGU7IGkrKykKKwkvLwlpZiAobm9kZS0+cGFnZVtpXSkKKwkvLwkJcGFnZV9jYWNoZV9yZWxlYXNlKG5vZGUtPnBhZ2VbaV0pOworCWtmcmVlKG5vZGUpOworfQorCitzdHJ1Y3QgaGZzX2Jub2RlICpoZnNfYm5vZGVfY3JlYXRlKHN0cnVjdCBoZnNfYnRyZWUgKnRyZWUsIHUzMiBudW0pCit7CisJc3RydWN0IGhmc19ibm9kZSAqbm9kZTsKKwlzdHJ1Y3QgcGFnZSAqKnBhZ2VwOworCWludCBpOworCisJc3Bpbl9sb2NrKCZ0cmVlLT5oYXNoX2xvY2spOworCW5vZGUgPSBoZnNfYm5vZGVfZmluZGhhc2godHJlZSwgbnVtKTsKKwlzcGluX3VubG9jaygmdHJlZS0+aGFzaF9sb2NrKTsKKwlpZiAobm9kZSkgeworCQlwcmludGsoIm5ldyBub2RlICV1IGFscmVhZHkgaGFzaGVkP1xuIiwgbnVtKTsKKwkJQlVHKCk7CisJfQorCW5vZGUgPSBfX2hmc19ibm9kZV9jcmVhdGUodHJlZSwgbnVtKTsKKwlpZiAoIW5vZGUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWlmICh0ZXN0X2JpdChIRlNfQk5PREVfRVJST1IsICZub2RlLT5mbGFncykpIHsKKwkJaGZzX2Jub2RlX3B1dChub2RlKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CisJfQorCisJcGFnZXAgPSBub2RlLT5wYWdlOworCW1lbXNldChrbWFwKCpwYWdlcCkgKyBub2RlLT5wYWdlX29mZnNldCwgMCwKKwkgICAgICAgbWluKChpbnQpUEFHRV9DQUNIRV9TSVpFLCAoaW50KXRyZWUtPm5vZGVfc2l6ZSkpOworCXNldF9wYWdlX2RpcnR5KCpwYWdlcCk7CisJa3VubWFwKCpwYWdlcCk7CisJZm9yIChpID0gMTsgaSA8IHRyZWUtPnBhZ2VzX3Blcl9ibm9kZTsgaSsrKSB7CisJCW1lbXNldChrbWFwKCorK3BhZ2VwKSwgMCwgUEFHRV9DQUNIRV9TSVpFKTsKKwkJc2V0X3BhZ2VfZGlydHkoKnBhZ2VwKTsKKwkJa3VubWFwKCpwYWdlcCk7CisJfQorCWNsZWFyX2JpdChIRlNfQk5PREVfTkVXLCAmbm9kZS0+ZmxhZ3MpOworCXdha2VfdXAoJm5vZGUtPmxvY2tfd3EpOworCisJcmV0dXJuIG5vZGU7Cit9CisKK3ZvaWQgaGZzX2Jub2RlX2dldChzdHJ1Y3QgaGZzX2Jub2RlICpub2RlKQoreworCWlmIChub2RlKSB7CisJCWF0b21pY19pbmMoJm5vZGUtPnJlZmNudCk7CisjaWYgUkVGX1BBR0VTCisJCXsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBub2RlLT50cmVlLT5wYWdlc19wZXJfYm5vZGU7IGkrKykKKwkJCWdldF9wYWdlKG5vZGUtPnBhZ2VbaV0pOworCQl9CisjZW5kaWYKKwkJZHByaW50KERCR19CTk9ERV9SRUZTLCAiZ2V0X25vZGUoJWQ6JWQpOiAlZFxuIiwKKwkJICAgICAgIG5vZGUtPnRyZWUtPmNuaWQsIG5vZGUtPnRoaXMsIGF0b21pY19yZWFkKCZub2RlLT5yZWZjbnQpKTsKKwl9Cit9CisKKy8qIERpc3Bvc2Ugb2YgcmVzb3VyY2VzIHVzZWQgYnkgYSBub2RlICovCit2b2lkIGhmc19ibm9kZV9wdXQoc3RydWN0IGhmc19ibm9kZSAqbm9kZSkKK3sKKwlpZiAobm9kZSkgeworCQlzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlID0gbm9kZS0+dHJlZTsKKwkJaW50IGk7CisKKwkJZHByaW50KERCR19CTk9ERV9SRUZTLCAicHV0X25vZGUoJWQ6JWQpOiAlZFxuIiwKKwkJICAgICAgIG5vZGUtPnRyZWUtPmNuaWQsIG5vZGUtPnRoaXMsIGF0b21pY19yZWFkKCZub2RlLT5yZWZjbnQpKTsKKwkJaWYgKCFhdG9taWNfcmVhZCgmbm9kZS0+cmVmY250KSkKKwkJCUJVRygpOworCQlpZiAoIWF0b21pY19kZWNfYW5kX2xvY2soJm5vZGUtPnJlZmNudCwgJnRyZWUtPmhhc2hfbG9jaykpIHsKKyNpZiBSRUZfUEFHRVMKKwkJCWZvciAoaSA9IDA7IGkgPCB0cmVlLT5wYWdlc19wZXJfYm5vZGU7IGkrKykKKwkJCQlwdXRfcGFnZShub2RlLT5wYWdlW2ldKTsKKyNlbmRpZgorCQkJcmV0dXJuOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCB0cmVlLT5wYWdlc19wZXJfYm5vZGU7IGkrKykgeworCQkJbWFya19wYWdlX2FjY2Vzc2VkKG5vZGUtPnBhZ2VbaV0pOworI2lmIFJFRl9QQUdFUworCQkJcHV0X3BhZ2Uobm9kZS0+cGFnZVtpXSk7CisjZW5kaWYKKwkJfQorCisJCWlmICh0ZXN0X2JpdChIRlNfQk5PREVfREVMRVRFRCwgJm5vZGUtPmZsYWdzKSkgeworCQkJaGZzX2Jub2RlX3VuaGFzaChub2RlKTsKKwkJCXNwaW5fdW5sb2NrKCZ0cmVlLT5oYXNoX2xvY2spOworCQkJaGZzX2JtYXBfZnJlZShub2RlKTsKKwkJCWhmc19ibm9kZV9mcmVlKG5vZGUpOworCQkJcmV0dXJuOworCQl9CisJCXNwaW5fdW5sb2NrKCZ0cmVlLT5oYXNoX2xvY2spOworCX0KK30KKwpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9icmVjLmMgYi9mcy9oZnNwbHVzL2JyZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2NlZjJhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaGZzcGx1cy9icmVjLmMKQEAgLTAsMCArMSw0OTEgQEAKKy8qCisgKiAgbGludXgvZnMvaGZzcGx1cy9icmVjLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEKKyAqIEJyYWQgQm95ZXIgKGZsYXJAYWxsYW5kcmlhLmNvbSkKKyAqIChDKSAyMDAzIEFyZGlzIFRlY2hub2xvZ2llcyA8cm9tYW5AYXJkaXN0ZWNoLmNvbT4KKyAqCisgKiBIYW5kbGUgaW5kaXZpZHVhbCBidHJlZSByZWNvcmRzCisgKi8KKworI2luY2x1ZGUgImhmc3BsdXNfZnMuaCIKKyNpbmNsdWRlICJoZnNwbHVzX3Jhdy5oIgorCitzdGF0aWMgc3RydWN0IGhmc19ibm9kZSAqaGZzX2Jub2RlX3NwbGl0KHN0cnVjdCBoZnNfZmluZF9kYXRhICpmZCk7CitzdGF0aWMgaW50IGhmc19icmVjX3VwZGF0ZV9wYXJlbnQoc3RydWN0IGhmc19maW5kX2RhdGEgKmZkKTsKK3N0YXRpYyBpbnQgaGZzX2J0cmVlX2luY19oZWlnaHQoc3RydWN0IGhmc19idHJlZSAqKTsKKworLyogR2V0IHRoZSBsZW5ndGggYW5kIG9mZnNldCBvZiB0aGUgZ2l2ZW4gcmVjb3JkIGluIHRoZSBnaXZlbiBub2RlICovCit1MTYgaGZzX2JyZWNfbGVub2ZmKHN0cnVjdCBoZnNfYm5vZGUgKm5vZGUsIHUxNiByZWMsIHUxNiAqb2ZmKQoreworCV9fYmUxNiByZXR2YWxbMl07CisJdTE2IGRhdGFvZmY7CisKKwlkYXRhb2ZmID0gbm9kZS0+dHJlZS0+bm9kZV9zaXplIC0gKHJlYyArIDIpICogMjsKKwloZnNfYm5vZGVfcmVhZChub2RlLCByZXR2YWwsIGRhdGFvZmYsIDQpOworCSpvZmYgPSBiZTE2X3RvX2NwdShyZXR2YWxbMV0pOworCXJldHVybiBiZTE2X3RvX2NwdShyZXR2YWxbMF0pIC0gKm9mZjsKK30KKworLyogR2V0IHRoZSBsZW5ndGggb2YgdGhlIGtleSBmcm9tIGEga2V5ZWQgcmVjb3JkICovCit1MTYgaGZzX2JyZWNfa2V5bGVuKHN0cnVjdCBoZnNfYm5vZGUgKm5vZGUsIHUxNiByZWMpCit7CisJdTE2IHJldHZhbCwgcmVjb2ZmOworCisJaWYgKG5vZGUtPnR5cGUgIT0gSEZTX05PREVfSU5ERVggJiYgbm9kZS0+dHlwZSAhPSBIRlNfTk9ERV9MRUFGKQorCQlyZXR1cm4gMDsKKworCWlmICgobm9kZS0+dHlwZSA9PSBIRlNfTk9ERV9JTkRFWCkgJiYKKwkgICAhKG5vZGUtPnRyZWUtPmF0dHJpYnV0ZXMgJiBIRlNfVFJFRV9WQVJJRFhLRVlTKSkgeworCQlyZXR2YWwgPSBub2RlLT50cmVlLT5tYXhfa2V5X2xlbiArIDI7CisJfSBlbHNlIHsKKwkJcmVjb2ZmID0gaGZzX2Jub2RlX3JlYWRfdTE2KG5vZGUsIG5vZGUtPnRyZWUtPm5vZGVfc2l6ZSAtIChyZWMgKyAxKSAqIDIpOworCQlpZiAoIXJlY29mZikKKwkJCXJldHVybiAwOworCQlpZiAobm9kZS0+dHJlZS0+YXR0cmlidXRlcyAmIEhGU19UUkVFX0JJR0tFWVMpCisJCQlyZXR2YWwgPSBoZnNfYm5vZGVfcmVhZF91MTYobm9kZSwgcmVjb2ZmKSArIDI7CisJCWVsc2UKKwkJCXJldHZhbCA9IChoZnNfYm5vZGVfcmVhZF91OChub2RlLCByZWNvZmYpIHwgMSkgKyAxOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgaGZzX2JyZWNfaW5zZXJ0KHN0cnVjdCBoZnNfZmluZF9kYXRhICpmZCwgdm9pZCAqZW50cnksIGludCBlbnRyeV9sZW4pCit7CisJc3RydWN0IGhmc19idHJlZSAqdHJlZTsKKwlzdHJ1Y3QgaGZzX2Jub2RlICpub2RlLCAqbmV3X25vZGU7CisJaW50IHNpemUsIGtleV9sZW4sIHJlYzsKKwlpbnQgZGF0YV9vZmYsIGVuZF9vZmY7CisJaW50IGlkeF9yZWNfb2ZmLCBkYXRhX3JlY19vZmYsIGVuZF9yZWNfb2ZmOworCV9fYmUzMiBjbmlkOworCisJdHJlZSA9IGZkLT50cmVlOworCWlmICghZmQtPmJub2RlKSB7CisJCWlmICghdHJlZS0+cm9vdCkKKwkJCWhmc19idHJlZV9pbmNfaGVpZ2h0KHRyZWUpOworCQlmZC0+Ym5vZGUgPSBoZnNfYm5vZGVfZmluZCh0cmVlLCB0cmVlLT5sZWFmX2hlYWQpOworCQlpZiAoSVNfRVJSKGZkLT5ibm9kZSkpCisJCQlyZXR1cm4gUFRSX0VSUihmZC0+Ym5vZGUpOworCQlmZC0+cmVjb3JkID0gLTE7CisJfQorCW5ld19ub2RlID0gTlVMTDsKKwlrZXlfbGVuID0gYmUxNl90b19jcHUoZmQtPnNlYXJjaF9rZXktPmtleV9sZW4pICsgMjsKK2FnYWluOgorCS8qIG5ldyByZWNvcmQgaWR4IGFuZCBjb21wbGV0ZSByZWNvcmQgc2l6ZSAqLworCXJlYyA9IGZkLT5yZWNvcmQgKyAxOworCXNpemUgPSBrZXlfbGVuICsgZW50cnlfbGVuOworCisJbm9kZSA9IGZkLT5ibm9kZTsKKwloZnNfYm5vZGVfZHVtcChub2RlKTsKKwkvKiBnZXQgbGFzdCBvZmZzZXQgKi8KKwllbmRfcmVjX29mZiA9IHRyZWUtPm5vZGVfc2l6ZSAtIChub2RlLT5udW1fcmVjcyArIDEpICogMjsKKwllbmRfb2ZmID0gaGZzX2Jub2RlX3JlYWRfdTE2KG5vZGUsIGVuZF9yZWNfb2ZmKTsKKwllbmRfcmVjX29mZiAtPSAyOworCWRwcmludChEQkdfQk5PREVfTU9ELCAiaW5zZXJ0X3JlYzogJWQsICVkLCAlZCwgJWRcbiIsIHJlYywgc2l6ZSwgZW5kX29mZiwgZW5kX3JlY19vZmYpOworCWlmIChzaXplID4gZW5kX3JlY19vZmYgLSBlbmRfb2ZmKSB7CisJCWlmIChuZXdfbm9kZSkKKwkJCXBhbmljKCJub3QgZW5vdWdoIHJvb20hXG4iKTsKKwkJbmV3X25vZGUgPSBoZnNfYm5vZGVfc3BsaXQoZmQpOworCQlpZiAoSVNfRVJSKG5ld19ub2RlKSkKKwkJCXJldHVybiBQVFJfRVJSKG5ld19ub2RlKTsKKwkJZ290byBhZ2FpbjsKKwl9CisJaWYgKG5vZGUtPnR5cGUgPT0gSEZTX05PREVfTEVBRikgeworCQl0cmVlLT5sZWFmX2NvdW50Kys7CisJCW1hcmtfaW5vZGVfZGlydHkodHJlZS0+aW5vZGUpOworCX0KKwlub2RlLT5udW1fcmVjcysrOworCS8qIHdyaXRlIG5ldyBsYXN0IG9mZnNldCAqLworCWhmc19ibm9kZV93cml0ZV91MTYobm9kZSwgb2Zmc2V0b2Yoc3RydWN0IGhmc19ibm9kZV9kZXNjLCBudW1fcmVjcyksIG5vZGUtPm51bV9yZWNzKTsKKwloZnNfYm5vZGVfd3JpdGVfdTE2KG5vZGUsIGVuZF9yZWNfb2ZmLCBlbmRfb2ZmICsgc2l6ZSk7CisJZGF0YV9vZmYgPSBlbmRfb2ZmOworCWRhdGFfcmVjX29mZiA9IGVuZF9yZWNfb2ZmICsgMjsKKwlpZHhfcmVjX29mZiA9IHRyZWUtPm5vZGVfc2l6ZSAtIChyZWMgKyAxKSAqIDI7CisJaWYgKGlkeF9yZWNfb2ZmID09IGRhdGFfcmVjX29mZikKKwkJZ290byBza2lwOworCS8qIG1vdmUgYWxsIGZvbGxvd2luZyBlbnRyaWVzICovCisJZG8geworCQlkYXRhX29mZiA9IGhmc19ibm9kZV9yZWFkX3UxNihub2RlLCBkYXRhX3JlY19vZmYgKyAyKTsKKwkJaGZzX2Jub2RlX3dyaXRlX3UxNihub2RlLCBkYXRhX3JlY19vZmYsIGRhdGFfb2ZmICsgc2l6ZSk7CisJCWRhdGFfcmVjX29mZiArPSAyOworCX0gd2hpbGUgKGRhdGFfcmVjX29mZiA8IGlkeF9yZWNfb2ZmKTsKKworCS8qIG1vdmUgZGF0YSBhd2F5ICovCisJaGZzX2Jub2RlX21vdmUobm9kZSwgZGF0YV9vZmYgKyBzaXplLCBkYXRhX29mZiwKKwkJICAgICAgIGVuZF9vZmYgLSBkYXRhX29mZik7CisKK3NraXA6CisJaGZzX2Jub2RlX3dyaXRlKG5vZGUsIGZkLT5zZWFyY2hfa2V5LCBkYXRhX29mZiwga2V5X2xlbik7CisJaGZzX2Jub2RlX3dyaXRlKG5vZGUsIGVudHJ5LCBkYXRhX29mZiArIGtleV9sZW4sIGVudHJ5X2xlbik7CisJaGZzX2Jub2RlX2R1bXAobm9kZSk7CisKKwlpZiAobmV3X25vZGUpIHsKKwkJLyogdXBkYXRlIHBhcmVudCBrZXkgaWYgd2UgaW5zZXJ0ZWQgYSBrZXkKKwkJICogYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCBub2RlCisJCSAqLworCQlpZiAoIXJlYyAmJiBuZXdfbm9kZSAhPSBub2RlKQorCQkJaGZzX2JyZWNfdXBkYXRlX3BhcmVudChmZCk7CisKKwkJaGZzX2Jub2RlX3B1dChmZC0+Ym5vZGUpOworCQlpZiAoIW5ld19ub2RlLT5wYXJlbnQpIHsKKwkJCWhmc19idHJlZV9pbmNfaGVpZ2h0KHRyZWUpOworCQkJbmV3X25vZGUtPnBhcmVudCA9IHRyZWUtPnJvb3Q7CisJCX0KKwkJZmQtPmJub2RlID0gaGZzX2Jub2RlX2ZpbmQodHJlZSwgbmV3X25vZGUtPnBhcmVudCk7CisKKwkJLyogY3JlYXRlIGluZGV4IGRhdGEgZW50cnkgKi8KKwkJY25pZCA9IGNwdV90b19iZTMyKG5ld19ub2RlLT50aGlzKTsKKwkJZW50cnkgPSAmY25pZDsKKwkJZW50cnlfbGVuID0gc2l6ZW9mKGNuaWQpOworCisJCS8qIGdldCBpbmRleCBrZXkgKi8KKwkJaGZzX2Jub2RlX3JlYWRfa2V5KG5ld19ub2RlLCBmZC0+c2VhcmNoX2tleSwgMTQpOworCQlfX2hmc19icmVjX2ZpbmQoZmQtPmJub2RlLCBmZCk7CisKKwkJaGZzX2Jub2RlX3B1dChuZXdfbm9kZSk7CisJCW5ld19ub2RlID0gTlVMTDsKKworCQlpZiAodHJlZS0+YXR0cmlidXRlcyAmIEhGU19UUkVFX1ZBUklEWEtFWVMpCisJCQlrZXlfbGVuID0gYmUxNl90b19jcHUoZmQtPnNlYXJjaF9rZXktPmtleV9sZW4pICsgMjsKKwkJZWxzZSB7CisJCQlmZC0+c2VhcmNoX2tleS0+a2V5X2xlbiA9IGNwdV90b19iZTE2KHRyZWUtPm1heF9rZXlfbGVuKTsKKwkJCWtleV9sZW4gPSB0cmVlLT5tYXhfa2V5X2xlbiArIDI7CisJCX0KKwkJZ290byBhZ2FpbjsKKwl9CisKKwlpZiAoIXJlYykKKwkJaGZzX2JyZWNfdXBkYXRlX3BhcmVudChmZCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGhmc19icmVjX3JlbW92ZShzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqZmQpCit7CisJc3RydWN0IGhmc19idHJlZSAqdHJlZTsKKwlzdHJ1Y3QgaGZzX2Jub2RlICpub2RlLCAqcGFyZW50OworCWludCBlbmRfb2ZmLCByZWNfb2ZmLCBkYXRhX29mZiwgc2l6ZTsKKworCXRyZWUgPSBmZC0+dHJlZTsKKwlub2RlID0gZmQtPmJub2RlOworYWdhaW46CisJcmVjX29mZiA9IHRyZWUtPm5vZGVfc2l6ZSAtIChmZC0+cmVjb3JkICsgMikgKiAyOworCWVuZF9vZmYgPSB0cmVlLT5ub2RlX3NpemUgLSAobm9kZS0+bnVtX3JlY3MgKyAxKSAqIDI7CisKKwlpZiAobm9kZS0+dHlwZSA9PSBIRlNfTk9ERV9MRUFGKSB7CisJCXRyZWUtPmxlYWZfY291bnQtLTsKKwkJbWFya19pbm9kZV9kaXJ0eSh0cmVlLT5pbm9kZSk7CisJfQorCWhmc19ibm9kZV9kdW1wKG5vZGUpOworCWRwcmludChEQkdfQk5PREVfTU9ELCAicmVtb3ZlX3JlYzogJWQsICVkXG4iLCBmZC0+cmVjb3JkLCBmZC0+a2V5bGVuZ3RoICsgZmQtPmVudHJ5bGVuZ3RoKTsKKwlpZiAoIS0tbm9kZS0+bnVtX3JlY3MpIHsKKwkJaGZzX2Jub2RlX3VubGluayhub2RlKTsKKwkJaWYgKCFub2RlLT5wYXJlbnQpCisJCQlyZXR1cm4gMDsKKwkJcGFyZW50ID0gaGZzX2Jub2RlX2ZpbmQodHJlZSwgbm9kZS0+cGFyZW50KTsKKwkJaWYgKElTX0VSUihwYXJlbnQpKQorCQkJcmV0dXJuIFBUUl9FUlIocGFyZW50KTsKKwkJaGZzX2Jub2RlX3B1dChub2RlKTsKKwkJbm9kZSA9IGZkLT5ibm9kZSA9IHBhcmVudDsKKworCQlfX2hmc19icmVjX2ZpbmQobm9kZSwgZmQpOworCQlnb3RvIGFnYWluOworCX0KKwloZnNfYm5vZGVfd3JpdGVfdTE2KG5vZGUsIG9mZnNldG9mKHN0cnVjdCBoZnNfYm5vZGVfZGVzYywgbnVtX3JlY3MpLCBub2RlLT5udW1fcmVjcyk7CisKKwlpZiAocmVjX29mZiA9PSBlbmRfb2ZmKQorCQlnb3RvIHNraXA7CisJc2l6ZSA9IGZkLT5rZXlsZW5ndGggKyBmZC0+ZW50cnlsZW5ndGg7CisKKwlkbyB7CisJCWRhdGFfb2ZmID0gaGZzX2Jub2RlX3JlYWRfdTE2KG5vZGUsIHJlY19vZmYpOworCQloZnNfYm5vZGVfd3JpdGVfdTE2KG5vZGUsIHJlY19vZmYgKyAyLCBkYXRhX29mZiAtIHNpemUpOworCQlyZWNfb2ZmIC09IDI7CisJfSB3aGlsZSAocmVjX29mZiA+PSBlbmRfb2ZmKTsKKworCS8qIGZpbGwgaG9sZSAqLworCWhmc19ibm9kZV9tb3ZlKG5vZGUsIGZkLT5rZXlvZmZzZXQsIGZkLT5rZXlvZmZzZXQgKyBzaXplLAorCQkgICAgICAgZGF0YV9vZmYgLSBmZC0+a2V5b2Zmc2V0IC0gc2l6ZSk7Citza2lwOgorCWhmc19ibm9kZV9kdW1wKG5vZGUpOworCWlmICghZmQtPnJlY29yZCkKKwkJaGZzX2JyZWNfdXBkYXRlX3BhcmVudChmZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaGZzX2Jub2RlICpoZnNfYm5vZGVfc3BsaXQoc3RydWN0IGhmc19maW5kX2RhdGEgKmZkKQoreworCXN0cnVjdCBoZnNfYnRyZWUgKnRyZWU7CisJc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgKm5ld19ub2RlOworCXN0cnVjdCBoZnNfYm5vZGVfZGVzYyBub2RlX2Rlc2M7CisJaW50IG51bV9yZWNzLCBuZXdfcmVjX29mZiwgbmV3X29mZiwgb2xkX3JlY19vZmY7CisJaW50IGRhdGFfc3RhcnQsIGRhdGFfZW5kLCBzaXplOworCisJdHJlZSA9IGZkLT50cmVlOworCW5vZGUgPSBmZC0+Ym5vZGU7CisJbmV3X25vZGUgPSBoZnNfYm1hcF9hbGxvYyh0cmVlKTsKKwlpZiAoSVNfRVJSKG5ld19ub2RlKSkKKwkJcmV0dXJuIG5ld19ub2RlOworCWhmc19ibm9kZV9nZXQobm9kZSk7CisJZHByaW50KERCR19CTk9ERV9NT0QsICJzcGxpdF9ub2RlczogJWQgLSAlZCAtICVkXG4iLAorCQlub2RlLT50aGlzLCBuZXdfbm9kZS0+dGhpcywgbm9kZS0+bmV4dCk7CisJbmV3X25vZGUtPm5leHQgPSBub2RlLT5uZXh0OworCW5ld19ub2RlLT5wcmV2ID0gbm9kZS0+dGhpczsKKwluZXdfbm9kZS0+cGFyZW50ID0gbm9kZS0+cGFyZW50OworCW5ld19ub2RlLT50eXBlID0gbm9kZS0+dHlwZTsKKwluZXdfbm9kZS0+aGVpZ2h0ID0gbm9kZS0+aGVpZ2h0OworCisJc2l6ZSA9IHRyZWUtPm5vZGVfc2l6ZSAvIDIgLSBub2RlLT5udW1fcmVjcyAqIDIgLSAxNDsKKwlvbGRfcmVjX29mZiA9IHRyZWUtPm5vZGVfc2l6ZSAtIDQ7CisJbnVtX3JlY3MgPSAxOworCWZvciAoOzspIHsKKwkJZGF0YV9zdGFydCA9IGhmc19ibm9kZV9yZWFkX3UxNihub2RlLCBvbGRfcmVjX29mZik7CisJCWlmIChkYXRhX3N0YXJ0ID4gc2l6ZSkKKwkJCWJyZWFrOworCQlvbGRfcmVjX29mZiAtPSAyOworCQlpZiAoKytudW1fcmVjcyA8IG5vZGUtPm51bV9yZWNzKQorCQkJY29udGludWU7CisJCS8qIHBhbmljPyAqLworCQloZnNfYm5vZGVfcHV0KG5vZGUpOworCQloZnNfYm5vZGVfcHV0KG5ld19ub2RlKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT1NQQyk7CisJfQorCisJaWYgKGZkLT5yZWNvcmQgKyAxIDwgbnVtX3JlY3MpIHsKKwkJLyogbmV3IHJlY29yZCBpcyBpbiB0aGUgbG93ZXIgaGFsZiwKKwkJICogc28gbGVhdmUgc29tZSBtb3JlIHNwYWNlIHRoZXJlCisJCSAqLworCQlvbGRfcmVjX29mZiArPSAyOworCQludW1fcmVjcy0tOworCQlkYXRhX3N0YXJ0ID0gaGZzX2Jub2RlX3JlYWRfdTE2KG5vZGUsIG9sZF9yZWNfb2ZmKTsKKwl9IGVsc2UgeworCQloZnNfYm5vZGVfcHV0KG5vZGUpOworCQloZnNfYm5vZGVfZ2V0KG5ld19ub2RlKTsKKwkJZmQtPmJub2RlID0gbmV3X25vZGU7CisJCWZkLT5yZWNvcmQgLT0gbnVtX3JlY3M7CisJCWZkLT5rZXlvZmZzZXQgLT0gZGF0YV9zdGFydCAtIDE0OworCQlmZC0+ZW50cnlvZmZzZXQgLT0gZGF0YV9zdGFydCAtIDE0OworCX0KKwluZXdfbm9kZS0+bnVtX3JlY3MgPSBub2RlLT5udW1fcmVjcyAtIG51bV9yZWNzOworCW5vZGUtPm51bV9yZWNzID0gbnVtX3JlY3M7CisKKwluZXdfcmVjX29mZiA9IHRyZWUtPm5vZGVfc2l6ZSAtIDI7CisJbmV3X29mZiA9IDE0OworCXNpemUgPSBkYXRhX3N0YXJ0IC0gbmV3X29mZjsKKwludW1fcmVjcyA9IG5ld19ub2RlLT5udW1fcmVjczsKKwlkYXRhX2VuZCA9IGRhdGFfc3RhcnQ7CisJd2hpbGUgKG51bV9yZWNzKSB7CisJCWhmc19ibm9kZV93cml0ZV91MTYobmV3X25vZGUsIG5ld19yZWNfb2ZmLCBuZXdfb2ZmKTsKKwkJb2xkX3JlY19vZmYgLT0gMjsKKwkJbmV3X3JlY19vZmYgLT0gMjsKKwkJZGF0YV9lbmQgPSBoZnNfYm5vZGVfcmVhZF91MTYobm9kZSwgb2xkX3JlY19vZmYpOworCQluZXdfb2ZmID0gZGF0YV9lbmQgLSBzaXplOworCQludW1fcmVjcy0tOworCX0KKwloZnNfYm5vZGVfd3JpdGVfdTE2KG5ld19ub2RlLCBuZXdfcmVjX29mZiwgbmV3X29mZik7CisJaGZzX2Jub2RlX2NvcHkobmV3X25vZGUsIDE0LCBub2RlLCBkYXRhX3N0YXJ0LCBkYXRhX2VuZCAtIGRhdGFfc3RhcnQpOworCisJLyogdXBkYXRlIG5ldyBibm9kZSBoZWFkZXIgKi8KKwlub2RlX2Rlc2MubmV4dCA9IGNwdV90b19iZTMyKG5ld19ub2RlLT5uZXh0KTsKKwlub2RlX2Rlc2MucHJldiA9IGNwdV90b19iZTMyKG5ld19ub2RlLT5wcmV2KTsKKwlub2RlX2Rlc2MudHlwZSA9IG5ld19ub2RlLT50eXBlOworCW5vZGVfZGVzYy5oZWlnaHQgPSBuZXdfbm9kZS0+aGVpZ2h0OworCW5vZGVfZGVzYy5udW1fcmVjcyA9IGNwdV90b19iZTE2KG5ld19ub2RlLT5udW1fcmVjcyk7CisJbm9kZV9kZXNjLnJlc2VydmVkID0gMDsKKwloZnNfYm5vZGVfd3JpdGUobmV3X25vZGUsICZub2RlX2Rlc2MsIDAsIHNpemVvZihub2RlX2Rlc2MpKTsKKworCS8qIHVwZGF0ZSBwcmV2aW91cyBibm9kZSBoZWFkZXIgKi8KKwlub2RlLT5uZXh0ID0gbmV3X25vZGUtPnRoaXM7CisJaGZzX2Jub2RlX3JlYWQobm9kZSwgJm5vZGVfZGVzYywgMCwgc2l6ZW9mKG5vZGVfZGVzYykpOworCW5vZGVfZGVzYy5uZXh0ID0gY3B1X3RvX2JlMzIobm9kZS0+bmV4dCk7CisJbm9kZV9kZXNjLm51bV9yZWNzID0gY3B1X3RvX2JlMTYobm9kZS0+bnVtX3JlY3MpOworCWhmc19ibm9kZV93cml0ZShub2RlLCAmbm9kZV9kZXNjLCAwLCBzaXplb2Yobm9kZV9kZXNjKSk7CisKKwkvKiB1cGRhdGUgbmV4dCBibm9kZSBoZWFkZXIgKi8KKwlpZiAobmV3X25vZGUtPm5leHQpIHsKKwkJc3RydWN0IGhmc19ibm9kZSAqbmV4dF9ub2RlID0gaGZzX2Jub2RlX2ZpbmQodHJlZSwgbmV3X25vZGUtPm5leHQpOworCQluZXh0X25vZGUtPnByZXYgPSBuZXdfbm9kZS0+dGhpczsKKwkJaGZzX2Jub2RlX3JlYWQobmV4dF9ub2RlLCAmbm9kZV9kZXNjLCAwLCBzaXplb2Yobm9kZV9kZXNjKSk7CisJCW5vZGVfZGVzYy5wcmV2ID0gY3B1X3RvX2JlMzIobmV4dF9ub2RlLT5wcmV2KTsKKwkJaGZzX2Jub2RlX3dyaXRlKG5leHRfbm9kZSwgJm5vZGVfZGVzYywgMCwgc2l6ZW9mKG5vZGVfZGVzYykpOworCQloZnNfYm5vZGVfcHV0KG5leHRfbm9kZSk7CisJfSBlbHNlIGlmIChub2RlLT50aGlzID09IHRyZWUtPmxlYWZfdGFpbCkgeworCQkvKiBpZiB0aGVyZSBpcyBubyBuZXh0IG5vZGUsIHRoaXMgbWlnaHQgYmUgdGhlIG5ldyB0YWlsICovCisJCXRyZWUtPmxlYWZfdGFpbCA9IG5ld19ub2RlLT50aGlzOworCQltYXJrX2lub2RlX2RpcnR5KHRyZWUtPmlub2RlKTsKKwl9CisKKwloZnNfYm5vZGVfZHVtcChub2RlKTsKKwloZnNfYm5vZGVfZHVtcChuZXdfbm9kZSk7CisJaGZzX2Jub2RlX3B1dChub2RlKTsKKworCXJldHVybiBuZXdfbm9kZTsKK30KKworc3RhdGljIGludCBoZnNfYnJlY191cGRhdGVfcGFyZW50KHN0cnVjdCBoZnNfZmluZF9kYXRhICpmZCkKK3sKKwlzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlOworCXN0cnVjdCBoZnNfYm5vZGUgKm5vZGUsICpuZXdfbm9kZSwgKnBhcmVudDsKKwlpbnQgbmV3a2V5bGVuLCBkaWZmOworCWludCByZWMsIHJlY19vZmYsIGVuZF9yZWNfb2ZmOworCWludCBzdGFydF9vZmYsIGVuZF9vZmY7CisKKwl0cmVlID0gZmQtPnRyZWU7CisJbm9kZSA9IGZkLT5ibm9kZTsKKwluZXdfbm9kZSA9IE5VTEw7CisJaWYgKCFub2RlLT5wYXJlbnQpCisJCXJldHVybiAwOworCithZ2FpbjoKKwlwYXJlbnQgPSBoZnNfYm5vZGVfZmluZCh0cmVlLCBub2RlLT5wYXJlbnQpOworCWlmIChJU19FUlIocGFyZW50KSkKKwkJcmV0dXJuIFBUUl9FUlIocGFyZW50KTsKKwlfX2hmc19icmVjX2ZpbmQocGFyZW50LCBmZCk7CisJaGZzX2Jub2RlX2R1bXAocGFyZW50KTsKKwlyZWMgPSBmZC0+cmVjb3JkOworCisJLyogc2l6ZSBkaWZmZXJlbmNlIGJldHdlZW4gb2xkIGFuZCBuZXcga2V5ICovCisJaWYgKHRyZWUtPmF0dHJpYnV0ZXMgJiBIRlNfVFJFRV9WQVJJRFhLRVlTKQorCQluZXdrZXlsZW4gPSBoZnNfYm5vZGVfcmVhZF91MTYobm9kZSwgMTQpICsgMjsKKwllbHNlCisJCWZkLT5rZXlsZW5ndGggPSBuZXdrZXlsZW4gPSB0cmVlLT5tYXhfa2V5X2xlbiArIDI7CisJZHByaW50KERCR19CTk9ERV9NT0QsICJ1cGRhdGVfcmVjOiAlZCwgJWQsICVkXG4iLCByZWMsIGZkLT5rZXlsZW5ndGgsIG5ld2tleWxlbik7CisKKwlyZWNfb2ZmID0gdHJlZS0+bm9kZV9zaXplIC0gKHJlYyArIDIpICogMjsKKwllbmRfcmVjX29mZiA9IHRyZWUtPm5vZGVfc2l6ZSAtIChwYXJlbnQtPm51bV9yZWNzICsgMSkgKiAyOworCWRpZmYgPSBuZXdrZXlsZW4gLSBmZC0+a2V5bGVuZ3RoOworCWlmICghZGlmZikKKwkJZ290byBza2lwOworCWlmIChkaWZmID4gMCkgeworCQllbmRfb2ZmID0gaGZzX2Jub2RlX3JlYWRfdTE2KHBhcmVudCwgZW5kX3JlY19vZmYpOworCQlpZiAoZW5kX3JlY19vZmYgLSBlbmRfb2ZmIDwgZGlmZikgeworCisJCQlwcmludGsoInNwbGl0dGluZyBpbmRleCBub2RlLi4uXG4iKTsKKwkJCWZkLT5ibm9kZSA9IHBhcmVudDsKKwkJCW5ld19ub2RlID0gaGZzX2Jub2RlX3NwbGl0KGZkKTsKKwkJCWlmIChJU19FUlIobmV3X25vZGUpKQorCQkJCXJldHVybiBQVFJfRVJSKG5ld19ub2RlKTsKKwkJCXBhcmVudCA9IGZkLT5ibm9kZTsKKwkJCXJlYyA9IGZkLT5yZWNvcmQ7CisJCQlyZWNfb2ZmID0gdHJlZS0+bm9kZV9zaXplIC0gKHJlYyArIDIpICogMjsKKwkJCWVuZF9yZWNfb2ZmID0gdHJlZS0+bm9kZV9zaXplIC0gKHBhcmVudC0+bnVtX3JlY3MgKyAxKSAqIDI7CisJCX0KKwl9CisKKwllbmRfb2ZmID0gc3RhcnRfb2ZmID0gaGZzX2Jub2RlX3JlYWRfdTE2KHBhcmVudCwgcmVjX29mZik7CisJaGZzX2Jub2RlX3dyaXRlX3UxNihwYXJlbnQsIHJlY19vZmYsIHN0YXJ0X29mZiArIGRpZmYpOworCXN0YXJ0X29mZiAtPSA0OwkvKiBtb3ZlIHByZXZpb3VzIGNuaWQgdG9vICovCisKKwl3aGlsZSAocmVjX29mZiA+IGVuZF9yZWNfb2ZmKSB7CisJCXJlY19vZmYgLT0gMjsKKwkJZW5kX29mZiA9IGhmc19ibm9kZV9yZWFkX3UxNihwYXJlbnQsIHJlY19vZmYpOworCQloZnNfYm5vZGVfd3JpdGVfdTE2KHBhcmVudCwgcmVjX29mZiwgZW5kX29mZiArIGRpZmYpOworCX0KKwloZnNfYm5vZGVfbW92ZShwYXJlbnQsIHN0YXJ0X29mZiArIGRpZmYsIHN0YXJ0X29mZiwKKwkJICAgICAgIGVuZF9vZmYgLSBzdGFydF9vZmYpOworc2tpcDoKKwloZnNfYm5vZGVfY29weShwYXJlbnQsIGZkLT5rZXlvZmZzZXQsIG5vZGUsIDE0LCBuZXdrZXlsZW4pOworCWhmc19ibm9kZV9kdW1wKHBhcmVudCk7CisKKwloZnNfYm5vZGVfcHV0KG5vZGUpOworCW5vZGUgPSBwYXJlbnQ7CisKKwlpZiAobmV3X25vZGUpIHsKKwkJX19iZTMyIGNuaWQ7CisKKwkJZmQtPmJub2RlID0gaGZzX2Jub2RlX2ZpbmQodHJlZSwgbmV3X25vZGUtPnBhcmVudCk7CisJCS8qIGNyZWF0ZSBpbmRleCBrZXkgYW5kIGVudHJ5ICovCisJCWhmc19ibm9kZV9yZWFkX2tleShuZXdfbm9kZSwgZmQtPnNlYXJjaF9rZXksIDE0KTsKKwkJY25pZCA9IGNwdV90b19iZTMyKG5ld19ub2RlLT50aGlzKTsKKworCQlfX2hmc19icmVjX2ZpbmQoZmQtPmJub2RlLCBmZCk7CisJCWhmc19icmVjX2luc2VydChmZCwgJmNuaWQsIHNpemVvZihjbmlkKSk7CisJCWhmc19ibm9kZV9wdXQoZmQtPmJub2RlKTsKKwkJaGZzX2Jub2RlX3B1dChuZXdfbm9kZSk7CisKKwkJaWYgKCFyZWMpIHsKKwkJCWlmIChuZXdfbm9kZSA9PSBub2RlKQorCQkJCWdvdG8gb3V0OworCQkJLyogcmVzdG9yZSBzZWFyY2hfa2V5ICovCisJCQloZnNfYm5vZGVfcmVhZF9rZXkobm9kZSwgZmQtPnNlYXJjaF9rZXksIDE0KTsKKwkJfQorCX0KKworCWlmICghcmVjICYmIG5vZGUtPnBhcmVudCkKKwkJZ290byBhZ2FpbjsKK291dDoKKwlmZC0+Ym5vZGUgPSBub2RlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhmc19idHJlZV9pbmNfaGVpZ2h0KHN0cnVjdCBoZnNfYnRyZWUgKnRyZWUpCit7CisJc3RydWN0IGhmc19ibm9kZSAqbm9kZSwgKm5ld19ub2RlOworCXN0cnVjdCBoZnNfYm5vZGVfZGVzYyBub2RlX2Rlc2M7CisJaW50IGtleV9zaXplLCByZWM7CisJX19iZTMyIGNuaWQ7CisKKwlub2RlID0gTlVMTDsKKwlpZiAodHJlZS0+cm9vdCkgeworCQlub2RlID0gaGZzX2Jub2RlX2ZpbmQodHJlZSwgdHJlZS0+cm9vdCk7CisJCWlmIChJU19FUlIobm9kZSkpCisJCQlyZXR1cm4gUFRSX0VSUihub2RlKTsKKwl9CisJbmV3X25vZGUgPSBoZnNfYm1hcF9hbGxvYyh0cmVlKTsKKwlpZiAoSVNfRVJSKG5ld19ub2RlKSkgeworCQloZnNfYm5vZGVfcHV0KG5vZGUpOworCQlyZXR1cm4gUFRSX0VSUihuZXdfbm9kZSk7CisJfQorCisJdHJlZS0+cm9vdCA9IG5ld19ub2RlLT50aGlzOworCWlmICghdHJlZS0+ZGVwdGgpIHsKKwkJdHJlZS0+bGVhZl9oZWFkID0gdHJlZS0+bGVhZl90YWlsID0gbmV3X25vZGUtPnRoaXM7CisJCW5ld19ub2RlLT50eXBlID0gSEZTX05PREVfTEVBRjsKKwkJbmV3X25vZGUtPm51bV9yZWNzID0gMDsKKwl9IGVsc2UgeworCQluZXdfbm9kZS0+dHlwZSA9IEhGU19OT0RFX0lOREVYOworCQluZXdfbm9kZS0+bnVtX3JlY3MgPSAxOworCX0KKwluZXdfbm9kZS0+cGFyZW50ID0gMDsKKwluZXdfbm9kZS0+bmV4dCA9IDA7CisJbmV3X25vZGUtPnByZXYgPSAwOworCW5ld19ub2RlLT5oZWlnaHQgPSArK3RyZWUtPmRlcHRoOworCisJbm9kZV9kZXNjLm5leHQgPSBjcHVfdG9fYmUzMihuZXdfbm9kZS0+bmV4dCk7CisJbm9kZV9kZXNjLnByZXYgPSBjcHVfdG9fYmUzMihuZXdfbm9kZS0+cHJldik7CisJbm9kZV9kZXNjLnR5cGUgPSBuZXdfbm9kZS0+dHlwZTsKKwlub2RlX2Rlc2MuaGVpZ2h0ID0gbmV3X25vZGUtPmhlaWdodDsKKwlub2RlX2Rlc2MubnVtX3JlY3MgPSBjcHVfdG9fYmUxNihuZXdfbm9kZS0+bnVtX3JlY3MpOworCW5vZGVfZGVzYy5yZXNlcnZlZCA9IDA7CisJaGZzX2Jub2RlX3dyaXRlKG5ld19ub2RlLCAmbm9kZV9kZXNjLCAwLCBzaXplb2Yobm9kZV9kZXNjKSk7CisKKwlyZWMgPSB0cmVlLT5ub2RlX3NpemUgLSAyOworCWhmc19ibm9kZV93cml0ZV91MTYobmV3X25vZGUsIHJlYywgMTQpOworCisJaWYgKG5vZGUpIHsKKwkJLyogaW5zZXJ0IG9sZCByb290IGlkeCBpbnRvIG5ldyByb290ICovCisJCW5vZGUtPnBhcmVudCA9IHRyZWUtPnJvb3Q7CisJCWlmIChub2RlLT50eXBlID09IEhGU19OT0RFX0xFQUYgfHwKKwkJICAgIHRyZWUtPmF0dHJpYnV0ZXMgJiBIRlNfVFJFRV9WQVJJRFhLRVlTKQorCQkJa2V5X3NpemUgPSBoZnNfYm5vZGVfcmVhZF91MTYobm9kZSwgMTQpICsgMjsKKwkJZWxzZQorCQkJa2V5X3NpemUgPSB0cmVlLT5tYXhfa2V5X2xlbiArIDI7CisJCWhmc19ibm9kZV9jb3B5KG5ld19ub2RlLCAxNCwgbm9kZSwgMTQsIGtleV9zaXplKTsKKworCQlpZiAoISh0cmVlLT5hdHRyaWJ1dGVzICYgSEZTX1RSRUVfVkFSSURYS0VZUykpIHsKKwkJCWtleV9zaXplID0gdHJlZS0+bWF4X2tleV9sZW4gKyAyOworCQkJaGZzX2Jub2RlX3dyaXRlX3UxNihuZXdfbm9kZSwgMTQsIHRyZWUtPm1heF9rZXlfbGVuKTsKKwkJfQorCQljbmlkID0gY3B1X3RvX2JlMzIobm9kZS0+dGhpcyk7CisJCWhmc19ibm9kZV93cml0ZShuZXdfbm9kZSwgJmNuaWQsIDE0ICsga2V5X3NpemUsIDQpOworCisJCXJlYyAtPSAyOworCQloZnNfYm5vZGVfd3JpdGVfdTE2KG5ld19ub2RlLCByZWMsIDE0ICsga2V5X3NpemUgKyA0KTsKKworCQloZnNfYm5vZGVfcHV0KG5vZGUpOworCX0KKwloZnNfYm5vZGVfcHV0KG5ld19ub2RlKTsKKwltYXJrX2lub2RlX2RpcnR5KHRyZWUtPmlub2RlKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9idHJlZS5jIGIvZnMvaGZzcGx1cy9idHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MzI2YWEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9oZnNwbHVzL2J0cmVlLmMKQEAgLTAsMCArMSwzMTkgQEAKKy8qCisgKiAgbGludXgvZnMvaGZzcGx1cy9idHJlZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxCisgKiBCcmFkIEJveWVyIChmbGFyQGFsbGFuZHJpYS5jb20pCisgKiAoQykgMjAwMyBBcmRpcyBUZWNobm9sb2dpZXMgPHJvbWFuQGFyZGlzdGVjaC5jb20+CisgKgorICogSGFuZGxlIG9wZW5pbmcvY2xvc2luZyBidHJlZQorICovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorCisjaW5jbHVkZSAiaGZzcGx1c19mcy5oIgorI2luY2x1ZGUgImhmc3BsdXNfcmF3LmgiCisKKworLyogR2V0IGEgcmVmZXJlbmNlIHRvIGEgQipUcmVlIGFuZCBkbyBzb21lIGluaXRpYWwgY2hlY2tzICovCitzdHJ1Y3QgaGZzX2J0cmVlICpoZnNfYnRyZWVfb3BlbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1MzIgaWQpCit7CisJc3RydWN0IGhmc19idHJlZSAqdHJlZTsKKwlzdHJ1Y3QgaGZzX2J0cmVlX2hlYWRlcl9yZWMgKmhlYWQ7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdW5zaWduZWQgaW50IHNpemU7CisKKwl0cmVlID0ga21hbGxvYyhzaXplb2YoKnRyZWUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRyZWUpCisJCXJldHVybiBOVUxMOworCW1lbXNldCh0cmVlLCAwLCBzaXplb2YoKnRyZWUpKTsKKworCWluaXRfTVVURVgoJnRyZWUtPnRyZWVfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnRyZWUtPmhhc2hfbG9jayk7CisJLyogU2V0IHRoZSBjb3JyZWN0IGNvbXBhcmUgZnVuY3Rpb24gKi8KKwl0cmVlLT5zYiA9IHNiOworCXRyZWUtPmNuaWQgPSBpZDsKKwlpZiAoaWQgPT0gSEZTUExVU19FWFRfQ05JRCkgeworCQl0cmVlLT5rZXljbXAgPSBoZnNwbHVzX2V4dF9jbXBfa2V5OworCX0gZWxzZSBpZiAoaWQgPT0gSEZTUExVU19DQVRfQ05JRCkgeworCQl0cmVlLT5rZXljbXAgPSBoZnNwbHVzX2NhdF9jbXBfa2V5OworCX0gZWxzZSB7CisJCXByaW50aygiSEZTKy1mczogdW5rbm93biBCKlRyZWUgcmVxdWVzdGVkXG4iKTsKKwkJZ290byBmcmVlX3RyZWU7CisJfQorCXRyZWUtPmlub2RlID0gaWdldChzYiwgaWQpOworCWlmICghdHJlZS0+aW5vZGUpCisJCWdvdG8gZnJlZV90cmVlOworCisJbWFwcGluZyA9IHRyZWUtPmlub2RlLT5pX21hcHBpbmc7CisJcGFnZSA9IHJlYWRfY2FjaGVfcGFnZShtYXBwaW5nLCAwLCAoZmlsbGVyX3QgKiltYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2UsIE5VTEwpOworCWlmIChJU19FUlIocGFnZSkpCisJCWdvdG8gZnJlZV90cmVlOworCisJLyogTG9hZCB0aGUgaGVhZGVyICovCisJaGVhZCA9IChzdHJ1Y3QgaGZzX2J0cmVlX2hlYWRlcl9yZWMgKikoa21hcChwYWdlKSArIHNpemVvZihzdHJ1Y3QgaGZzX2Jub2RlX2Rlc2MpKTsKKwl0cmVlLT5yb290ID0gYmUzMl90b19jcHUoaGVhZC0+cm9vdCk7CisJdHJlZS0+bGVhZl9jb3VudCA9IGJlMzJfdG9fY3B1KGhlYWQtPmxlYWZfY291bnQpOworCXRyZWUtPmxlYWZfaGVhZCA9IGJlMzJfdG9fY3B1KGhlYWQtPmxlYWZfaGVhZCk7CisJdHJlZS0+bGVhZl90YWlsID0gYmUzMl90b19jcHUoaGVhZC0+bGVhZl90YWlsKTsKKwl0cmVlLT5ub2RlX2NvdW50ID0gYmUzMl90b19jcHUoaGVhZC0+bm9kZV9jb3VudCk7CisJdHJlZS0+ZnJlZV9ub2RlcyA9IGJlMzJfdG9fY3B1KGhlYWQtPmZyZWVfbm9kZXMpOworCXRyZWUtPmF0dHJpYnV0ZXMgPSBiZTMyX3RvX2NwdShoZWFkLT5hdHRyaWJ1dGVzKTsKKwl0cmVlLT5ub2RlX3NpemUgPSBiZTE2X3RvX2NwdShoZWFkLT5ub2RlX3NpemUpOworCXRyZWUtPm1heF9rZXlfbGVuID0gYmUxNl90b19jcHUoaGVhZC0+bWF4X2tleV9sZW4pOworCXRyZWUtPmRlcHRoID0gYmUxNl90b19jcHUoaGVhZC0+ZGVwdGgpOworCisJc2l6ZSA9IHRyZWUtPm5vZGVfc2l6ZTsKKwlpZiAoIXNpemUgfHwgc2l6ZSAmIChzaXplIC0gMSkpCisJCWdvdG8gZmFpbF9wYWdlOworCWlmICghdHJlZS0+bm9kZV9jb3VudCkKKwkJZ290byBmYWlsX3BhZ2U7CisJdHJlZS0+bm9kZV9zaXplX3NoaWZ0ID0gZmZzKHNpemUpIC0gMTsKKworCXRyZWUtPnBhZ2VzX3Blcl9ibm9kZSA9ICh0cmVlLT5ub2RlX3NpemUgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCisJa3VubWFwKHBhZ2UpOworCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwlyZXR1cm4gdHJlZTsKKworIGZhaWxfcGFnZToKKwl0cmVlLT5pbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZoZnNwbHVzX2FvcHM7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworIGZyZWVfdHJlZToKKwlpcHV0KHRyZWUtPmlub2RlKTsKKwlrZnJlZSh0cmVlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyogUmVsZWFzZSByZXNvdXJjZXMgdXNlZCBieSBhIGJ0cmVlICovCit2b2lkIGhmc19idHJlZV9jbG9zZShzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlKQoreworCXN0cnVjdCBoZnNfYm5vZGUgKm5vZGU7CisJaW50IGk7CisKKwlpZiAoIXRyZWUpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBOT0RFX0hBU0hfU0laRTsgaSsrKSB7CisJCXdoaWxlICgobm9kZSA9IHRyZWUtPm5vZGVfaGFzaFtpXSkpIHsKKwkJCXRyZWUtPm5vZGVfaGFzaFtpXSA9IG5vZGUtPm5leHRfaGFzaDsKKwkJCWlmIChhdG9taWNfcmVhZCgmbm9kZS0+cmVmY250KSkKKwkJCQlwcmludGsoIkhGUys6IG5vZGUgJWQ6JWQgc3RpbGwgaGFzICVkIHVzZXIocykhXG4iLAorCQkJCQlub2RlLT50cmVlLT5jbmlkLCBub2RlLT50aGlzLCBhdG9taWNfcmVhZCgmbm9kZS0+cmVmY250KSk7CisJCQloZnNfYm5vZGVfZnJlZShub2RlKTsKKwkJCXRyZWUtPm5vZGVfaGFzaF9jbnQtLTsKKwkJfQorCX0KKwlpcHV0KHRyZWUtPmlub2RlKTsKKwlrZnJlZSh0cmVlKTsKK30KKwordm9pZCBoZnNfYnRyZWVfd3JpdGUoc3RydWN0IGhmc19idHJlZSAqdHJlZSkKK3sKKwlzdHJ1Y3QgaGZzX2J0cmVlX2hlYWRlcl9yZWMgKmhlYWQ7CisJc3RydWN0IGhmc19ibm9kZSAqbm9kZTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCW5vZGUgPSBoZnNfYm5vZGVfZmluZCh0cmVlLCAwKTsKKwlpZiAoSVNfRVJSKG5vZGUpKQorCQkvKiBwYW5pYz8gKi8KKwkJcmV0dXJuOworCS8qIExvYWQgdGhlIGhlYWRlciAqLworCXBhZ2UgPSBub2RlLT5wYWdlWzBdOworCWhlYWQgPSAoc3RydWN0IGhmc19idHJlZV9oZWFkZXJfcmVjICopKGttYXAocGFnZSkgKyBzaXplb2Yoc3RydWN0IGhmc19ibm9kZV9kZXNjKSk7CisKKwloZWFkLT5yb290ID0gY3B1X3RvX2JlMzIodHJlZS0+cm9vdCk7CisJaGVhZC0+bGVhZl9jb3VudCA9IGNwdV90b19iZTMyKHRyZWUtPmxlYWZfY291bnQpOworCWhlYWQtPmxlYWZfaGVhZCA9IGNwdV90b19iZTMyKHRyZWUtPmxlYWZfaGVhZCk7CisJaGVhZC0+bGVhZl90YWlsID0gY3B1X3RvX2JlMzIodHJlZS0+bGVhZl90YWlsKTsKKwloZWFkLT5ub2RlX2NvdW50ID0gY3B1X3RvX2JlMzIodHJlZS0+bm9kZV9jb3VudCk7CisJaGVhZC0+ZnJlZV9ub2RlcyA9IGNwdV90b19iZTMyKHRyZWUtPmZyZWVfbm9kZXMpOworCWhlYWQtPmF0dHJpYnV0ZXMgPSBjcHVfdG9fYmUzMih0cmVlLT5hdHRyaWJ1dGVzKTsKKwloZWFkLT5kZXB0aCA9IGNwdV90b19iZTE2KHRyZWUtPmRlcHRoKTsKKworCWt1bm1hcChwYWdlKTsKKwlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKwloZnNfYm5vZGVfcHV0KG5vZGUpOworfQorCitzdGF0aWMgc3RydWN0IGhmc19ibm9kZSAqaGZzX2JtYXBfbmV3X2JtYXAoc3RydWN0IGhmc19ibm9kZSAqcHJldiwgdTMyIGlkeCkKK3sKKwlzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlID0gcHJldi0+dHJlZTsKKwlzdHJ1Y3QgaGZzX2Jub2RlICpub2RlOworCXN0cnVjdCBoZnNfYm5vZGVfZGVzYyBkZXNjOworCV9fYmUzMiBjbmlkOworCisJbm9kZSA9IGhmc19ibm9kZV9jcmVhdGUodHJlZSwgaWR4KTsKKwlpZiAoSVNfRVJSKG5vZGUpKQorCQlyZXR1cm4gbm9kZTsKKworCXRyZWUtPmZyZWVfbm9kZXMtLTsKKwlwcmV2LT5uZXh0ID0gaWR4OworCWNuaWQgPSBjcHVfdG9fYmUzMihpZHgpOworCWhmc19ibm9kZV93cml0ZShwcmV2LCAmY25pZCwgb2Zmc2V0b2Yoc3RydWN0IGhmc19ibm9kZV9kZXNjLCBuZXh0KSwgNCk7CisKKwlub2RlLT50eXBlID0gSEZTX05PREVfTUFQOworCW5vZGUtPm51bV9yZWNzID0gMTsKKwloZnNfYm5vZGVfY2xlYXIobm9kZSwgMCwgdHJlZS0+bm9kZV9zaXplKTsKKwlkZXNjLm5leHQgPSAwOworCWRlc2MucHJldiA9IDA7CisJZGVzYy50eXBlID0gSEZTX05PREVfTUFQOworCWRlc2MuaGVpZ2h0ID0gMDsKKwlkZXNjLm51bV9yZWNzID0gY3B1X3RvX2JlMTYoMSk7CisJZGVzYy5yZXNlcnZlZCA9IDA7CisJaGZzX2Jub2RlX3dyaXRlKG5vZGUsICZkZXNjLCAwLCBzaXplb2YoZGVzYykpOworCWhmc19ibm9kZV93cml0ZV91MTYobm9kZSwgMTQsIDB4ODAwMCk7CisJaGZzX2Jub2RlX3dyaXRlX3UxNihub2RlLCB0cmVlLT5ub2RlX3NpemUgLSAyLCAxNCk7CisJaGZzX2Jub2RlX3dyaXRlX3UxNihub2RlLCB0cmVlLT5ub2RlX3NpemUgLSA0LCB0cmVlLT5ub2RlX3NpemUgLSA2KTsKKworCXJldHVybiBub2RlOworfQorCitzdHJ1Y3QgaGZzX2Jub2RlICpoZnNfYm1hcF9hbGxvYyhzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlKQoreworCXN0cnVjdCBoZnNfYm5vZGUgKm5vZGUsICpuZXh0X25vZGU7CisJc3RydWN0IHBhZ2UgKipwYWdlcDsKKwl1MzIgbmlkeCwgaWR4OworCXUxNiBvZmYsIGxlbjsKKwl1OCAqZGF0YSwgYnl0ZSwgbTsKKwlpbnQgaTsKKworCXdoaWxlICghdHJlZS0+ZnJlZV9ub2RlcykgeworCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gdHJlZS0+aW5vZGU7CisJCXUzMiBjb3VudDsKKwkJaW50IHJlczsKKworCQlyZXMgPSBoZnNwbHVzX2ZpbGVfZXh0ZW5kKGlub2RlKTsKKwkJaWYgKHJlcykKKwkJCXJldHVybiBFUlJfUFRSKHJlcyk7CisJCUhGU1BMVVNfSShpbm9kZSkucGh5c19zaXplID0gaW5vZGUtPmlfc2l6ZSA9CisJCQkJKGxvZmZfdClIRlNQTFVTX0koaW5vZGUpLmFsbG9jX2Jsb2NrcyA8PAorCQkJCUhGU1BMVVNfU0IodHJlZS0+c2IpLmFsbG9jX2Jsa3N6X3NoaWZ0OworCQlIRlNQTFVTX0koaW5vZGUpLmZzX2Jsb2NrcyA9IEhGU1BMVVNfSShpbm9kZSkuYWxsb2NfYmxvY2tzIDw8CisJCQkJCSAgICAgSEZTUExVU19TQih0cmVlLT5zYikuZnNfc2hpZnQ7CisJCWlub2RlX3NldF9ieXRlcyhpbm9kZSwgaW5vZGUtPmlfc2l6ZSk7CisJCWNvdW50ID0gaW5vZGUtPmlfc2l6ZSA+PiB0cmVlLT5ub2RlX3NpemVfc2hpZnQ7CisJCXRyZWUtPmZyZWVfbm9kZXMgPSBjb3VudCAtIHRyZWUtPm5vZGVfY291bnQ7CisJCXRyZWUtPm5vZGVfY291bnQgPSBjb3VudDsKKwl9CisKKwluaWR4ID0gMDsKKwlub2RlID0gaGZzX2Jub2RlX2ZpbmQodHJlZSwgbmlkeCk7CisJaWYgKElTX0VSUihub2RlKSkKKwkJcmV0dXJuIG5vZGU7CisJbGVuID0gaGZzX2JyZWNfbGVub2ZmKG5vZGUsIDIsICZvZmYpOworCisJb2ZmICs9IG5vZGUtPnBhZ2Vfb2Zmc2V0OworCXBhZ2VwID0gbm9kZS0+cGFnZSArIChvZmYgPj4gUEFHRV9DQUNIRV9TSElGVCk7CisJZGF0YSA9IGttYXAoKnBhZ2VwKTsKKwlvZmYgJj0gflBBR0VfQ0FDSEVfTUFTSzsKKwlpZHggPSAwOworCisJZm9yICg7OykgeworCQl3aGlsZSAobGVuKSB7CisJCQlieXRlID0gZGF0YVtvZmZdOworCQkJaWYgKGJ5dGUgIT0gMHhmZikgeworCQkJCWZvciAobSA9IDB4ODAsIGkgPSAwOyBpIDwgODsgbSA+Pj0gMSwgaSsrKSB7CisJCQkJCWlmICghKGJ5dGUgJiBtKSkgeworCQkJCQkJaWR4ICs9IGk7CisJCQkJCQlkYXRhW29mZl0gfD0gbTsKKwkJCQkJCXNldF9wYWdlX2RpcnR5KCpwYWdlcCk7CisJCQkJCQlrdW5tYXAoKnBhZ2VwKTsKKwkJCQkJCXRyZWUtPmZyZWVfbm9kZXMtLTsKKwkJCQkJCW1hcmtfaW5vZGVfZGlydHkodHJlZS0+aW5vZGUpOworCQkJCQkJaGZzX2Jub2RlX3B1dChub2RlKTsKKwkJCQkJCWlmICghaWR4KSB7CisJCQkJCQkJcHJpbnRrKCJ1bmV4cGVjdGVkIGlkeCAldSAoJXUpXG4iLCBpZHgsIG5vZGUtPnRoaXMpOworCQkJCQkJCUJVRygpOworCQkJCQkJfQorCQkJCQkJcmV0dXJuIGhmc19ibm9kZV9jcmVhdGUodHJlZSwgaWR4KTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmICgrK29mZiA+PSBQQUdFX0NBQ0hFX1NJWkUpIHsKKwkJCQlrdW5tYXAoKnBhZ2VwKTsKKwkJCQlkYXRhID0ga21hcCgqKytwYWdlcCk7CisJCQkJb2ZmID0gMDsKKwkJCX0KKwkJCWlkeCArPSA4OworCQkJbGVuLS07CisJCX0KKwkJa3VubWFwKCpwYWdlcCk7CisJCW5pZHggPSBub2RlLT5uZXh0OworCQlpZiAoIW5pZHgpIHsKKwkJCXByaW50aygiY3JlYXRlIG5ldyBibWFwIG5vZGUuLi5cbiIpOworCQkJbmV4dF9ub2RlID0gaGZzX2JtYXBfbmV3X2JtYXAobm9kZSwgaWR4KTsKKwkJfSBlbHNlCisJCQluZXh0X25vZGUgPSBoZnNfYm5vZGVfZmluZCh0cmVlLCBuaWR4KTsKKwkJaGZzX2Jub2RlX3B1dChub2RlKTsKKwkJaWYgKElTX0VSUihuZXh0X25vZGUpKQorCQkJcmV0dXJuIG5leHRfbm9kZTsKKwkJbm9kZSA9IG5leHRfbm9kZTsKKworCQlsZW4gPSBoZnNfYnJlY19sZW5vZmYobm9kZSwgMCwgJm9mZik7CisJCW9mZiArPSBub2RlLT5wYWdlX29mZnNldDsKKwkJcGFnZXAgPSBub2RlLT5wYWdlICsgKG9mZiA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwkJZGF0YSA9IGttYXAoKnBhZ2VwKTsKKwkJb2ZmICY9IH5QQUdFX0NBQ0hFX01BU0s7CisJfQorfQorCit2b2lkIGhmc19ibWFwX2ZyZWUoc3RydWN0IGhmc19ibm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlOworCXN0cnVjdCBwYWdlICpwYWdlOworCXUxNiBvZmYsIGxlbjsKKwl1MzIgbmlkeDsKKwl1OCAqZGF0YSwgYnl0ZSwgbTsKKworCWRwcmludChEQkdfQk5PREVfTU9ELCAiYnRyZWVfZnJlZV9ub2RlOiAldVxuIiwgbm9kZS0+dGhpcyk7CisJaWYgKCFub2RlLT50aGlzKQorCQlCVUcoKTsKKwl0cmVlID0gbm9kZS0+dHJlZTsKKwluaWR4ID0gbm9kZS0+dGhpczsKKwlub2RlID0gaGZzX2Jub2RlX2ZpbmQodHJlZSwgMCk7CisJaWYgKElTX0VSUihub2RlKSkKKwkJcmV0dXJuOworCWxlbiA9IGhmc19icmVjX2xlbm9mZihub2RlLCAyLCAmb2ZmKTsKKwl3aGlsZSAobmlkeCA+PSBsZW4gKiA4KSB7CisJCXUzMiBpOworCisJCW5pZHggLT0gbGVuICogODsKKwkJaSA9IG5vZGUtPm5leHQ7CisJCWhmc19ibm9kZV9wdXQobm9kZSk7CisJCWlmICghaSkgeworCQkJLyogcGFuaWMgKi87CisJCQlwcmludGsoIkhGUzogdW5hYmxlIHRvIGZyZWUgYm5vZGUgJXUuIGJtYXAgbm90IGZvdW5kIVxuIiwgbm9kZS0+dGhpcyk7CisJCQlyZXR1cm47CisJCX0KKwkJbm9kZSA9IGhmc19ibm9kZV9maW5kKHRyZWUsIGkpOworCQlpZiAoSVNfRVJSKG5vZGUpKQorCQkJcmV0dXJuOworCQlpZiAobm9kZS0+dHlwZSAhPSBIRlNfTk9ERV9NQVApIHsKKwkJCS8qIHBhbmljICovOworCQkJcHJpbnRrKCJIRlM6IGludmFsaWQgYm1hcCBmb3VuZCEgKCV1LCVkKVxuIiwgbm9kZS0+dGhpcywgbm9kZS0+dHlwZSk7CisJCQloZnNfYm5vZGVfcHV0KG5vZGUpOworCQkJcmV0dXJuOworCQl9CisJCWxlbiA9IGhmc19icmVjX2xlbm9mZihub2RlLCAwLCAmb2ZmKTsKKwl9CisJb2ZmICs9IG5vZGUtPnBhZ2Vfb2Zmc2V0ICsgbmlkeCAvIDg7CisJcGFnZSA9IG5vZGUtPnBhZ2Vbb2ZmID4+IFBBR0VfQ0FDSEVfU0hJRlRdOworCWRhdGEgPSBrbWFwKHBhZ2UpOworCW9mZiAmPSB+UEFHRV9DQUNIRV9NQVNLOworCW0gPSAxIDw8ICh+bmlkeCAmIDcpOworCWJ5dGUgPSBkYXRhW29mZl07CisJaWYgKCEoYnl0ZSAmIG0pKSB7CisJCXByaW50aygiSEZTOiB0cnlpbmcgdG8gZnJlZSBmcmVlIGJub2RlICV1KCVkKVxuIiwgbm9kZS0+dGhpcywgbm9kZS0+dHlwZSk7CisJCWt1bm1hcChwYWdlKTsKKwkJaGZzX2Jub2RlX3B1dChub2RlKTsKKwkJcmV0dXJuOworCX0KKwlkYXRhW29mZl0gPSBieXRlICYgfm07CisJc2V0X3BhZ2VfZGlydHkocGFnZSk7CisJa3VubWFwKHBhZ2UpOworCWhmc19ibm9kZV9wdXQobm9kZSk7CisJdHJlZS0+ZnJlZV9ub2RlcysrOworCW1hcmtfaW5vZGVfZGlydHkodHJlZS0+aW5vZGUpOworfQpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9jYXRhbG9nLmMgYi9mcy9oZnNwbHVzL2NhdGFsb2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDcxMjc5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvaGZzcGx1cy9jYXRhbG9nLmMKQEAgLTAsMCArMSwzNTggQEAKKy8qCisgKiAgbGludXgvZnMvaGZzcGx1cy9jYXRhbG9nLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEKKyAqIEJyYWQgQm95ZXIgKGZsYXJAYWxsYW5kcmlhLmNvbSkKKyAqIChDKSAyMDAzIEFyZGlzIFRlY2hub2xvZ2llcyA8cm9tYW5AYXJkaXN0ZWNoLmNvbT4KKyAqCisgKiBIYW5kbGluZyBvZiBjYXRhbG9nIHJlY29yZHMKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworI2luY2x1ZGUgImhmc3BsdXNfZnMuaCIKKyNpbmNsdWRlICJoZnNwbHVzX3Jhdy5oIgorCitpbnQgaGZzcGx1c19jYXRfY21wX2tleShoZnNwbHVzX2J0cmVlX2tleSAqazEsIGhmc3BsdXNfYnRyZWVfa2V5ICprMikKK3sKKwlfX2JlMzIgazFwLCBrMnA7CisKKwlrMXAgPSBrMS0+Y2F0LnBhcmVudDsKKwlrMnAgPSBrMi0+Y2F0LnBhcmVudDsKKwlpZiAoazFwICE9IGsycCkKKwkJcmV0dXJuIGJlMzJfdG9fY3B1KGsxcCkgPCBiZTMyX3RvX2NwdShrMnApID8gLTEgOiAxOworCisJcmV0dXJuIGhmc3BsdXNfdW5pc3RyY21wKCZrMS0+Y2F0Lm5hbWUsICZrMi0+Y2F0Lm5hbWUpOworfQorCit2b2lkIGhmc3BsdXNfY2F0X2J1aWxkX2tleShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBoZnNwbHVzX2J0cmVlX2tleSAqa2V5LAorCQkJICAgdTMyIHBhcmVudCwgc3RydWN0IHFzdHIgKnN0cikKK3sKKwlpbnQgbGVuOworCisJa2V5LT5jYXQucGFyZW50ID0gY3B1X3RvX2JlMzIocGFyZW50KTsKKwlpZiAoc3RyKSB7CisJCWhmc3BsdXNfYXNjMnVuaShzYiwgJmtleS0+Y2F0Lm5hbWUsIHN0ci0+bmFtZSwgc3RyLT5sZW4pOworCQlsZW4gPSBiZTE2X3RvX2NwdShrZXktPmNhdC5uYW1lLmxlbmd0aCk7CisJfSBlbHNlIHsKKwkJa2V5LT5jYXQubmFtZS5sZW5ndGggPSAwOworCQlsZW4gPSAwOworCX0KKwlrZXktPmtleV9sZW4gPSBjcHVfdG9fYmUxNig2ICsgMiAqIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkIGhmc3BsdXNfY2F0X2J1aWxkX2tleV91bmkoaGZzcGx1c19idHJlZV9rZXkgKmtleSwgdTMyIHBhcmVudCwKKwkJCQkgICAgICBzdHJ1Y3QgaGZzcGx1c191bmlzdHIgKm5hbWUpCit7CisJaW50IHVzdHJsZW47CisKKwl1c3RybGVuID0gYmUxNl90b19jcHUobmFtZS0+bGVuZ3RoKTsKKwlrZXktPmNhdC5wYXJlbnQgPSBjcHVfdG9fYmUzMihwYXJlbnQpOworCWtleS0+Y2F0Lm5hbWUubGVuZ3RoID0gY3B1X3RvX2JlMTYodXN0cmxlbik7CisJdXN0cmxlbiAqPSAyOworCW1lbWNweShrZXktPmNhdC5uYW1lLnVuaWNvZGUsIG5hbWUtPnVuaWNvZGUsIHVzdHJsZW4pOworCWtleS0+a2V5X2xlbiA9IGNwdV90b19iZTE2KDYgKyB1c3RybGVuKTsKK30KKworc3RhdGljIHZvaWQgaGZzcGx1c19zZXRfcGVybXMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGhmc3BsdXNfcGVybSAqcGVybXMpCit7CisJaWYgKGlub2RlLT5pX2ZsYWdzICYgU19JTU1VVEFCTEUpCisJCXBlcm1zLT5yb290ZmxhZ3MgfD0gSEZTUExVU19GTEdfSU1NVVRBQkxFOworCWVsc2UKKwkJcGVybXMtPnJvb3RmbGFncyAmPSB+SEZTUExVU19GTEdfSU1NVVRBQkxFOworCWlmIChpbm9kZS0+aV9mbGFncyAmIFNfQVBQRU5EKQorCQlwZXJtcy0+cm9vdGZsYWdzIHw9IEhGU1BMVVNfRkxHX0FQUEVORDsKKwllbHNlCisJCXBlcm1zLT5yb290ZmxhZ3MgJj0gfkhGU1BMVVNfRkxHX0FQUEVORDsKKwlIRlNQTFVTX0koaW5vZGUpLnJvb3RmbGFncyA9IHBlcm1zLT5yb290ZmxhZ3M7CisJSEZTUExVU19JKGlub2RlKS51c2VyZmxhZ3MgPSBwZXJtcy0+dXNlcmZsYWdzOworCXBlcm1zLT5tb2RlID0gY3B1X3RvX2JlMTYoaW5vZGUtPmlfbW9kZSk7CisJcGVybXMtPm93bmVyID0gY3B1X3RvX2JlMzIoaW5vZGUtPmlfdWlkKTsKKwlwZXJtcy0+Z3JvdXAgPSBjcHVfdG9fYmUzMihpbm9kZS0+aV9naWQpOworfQorCitzdGF0aWMgaW50IGhmc3BsdXNfY2F0X2J1aWxkX3JlY29yZChoZnNwbHVzX2NhdF9lbnRyeSAqZW50cnksIHUzMiBjbmlkLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCXN0cnVjdCBoZnNwbHVzX2NhdF9mb2xkZXIgKmZvbGRlcjsKKworCQlmb2xkZXIgPSAmZW50cnktPmZvbGRlcjsKKwkJbWVtc2V0KGZvbGRlciwgMCwgc2l6ZW9mKCpmb2xkZXIpKTsKKwkJZm9sZGVyLT50eXBlID0gY3B1X3RvX2JlMTYoSEZTUExVU19GT0xERVIpOworCQlmb2xkZXItPmlkID0gY3B1X3RvX2JlMzIoaW5vZGUtPmlfaW5vKTsKKwkJZm9sZGVyLT5jcmVhdGVfZGF0ZSA9IGZvbGRlci0+Y29udGVudF9tb2RfZGF0ZSA9CisJCQlmb2xkZXItPmF0dHJpYnV0ZV9tb2RfZGF0ZSA9IGZvbGRlci0+YWNjZXNzX2RhdGUgPSBoZnNwX25vdzJtdCgpOworCQloZnNwbHVzX3NldF9wZXJtcyhpbm9kZSwgJmZvbGRlci0+cGVybWlzc2lvbnMpOworCQlpZiAoaW5vZGUgPT0gSEZTUExVU19TQihpbm9kZS0+aV9zYikuaGlkZGVuX2RpcikKKwkJCS8qIGludmlzaWJsZSBhbmQgbmFtZWxvY2tlZCAqLworCQkJZm9sZGVyLT51c2VyX2luZm8uZnJGbGFncyA9IGNwdV90b19iZTE2KDB4NTAwMCk7CisJCXJldHVybiBzaXplb2YoKmZvbGRlcik7CisJfSBlbHNlIHsKKwkJc3RydWN0IGhmc3BsdXNfY2F0X2ZpbGUgKmZpbGU7CisKKwkJZmlsZSA9ICZlbnRyeS0+ZmlsZTsKKwkJbWVtc2V0KGZpbGUsIDAsIHNpemVvZigqZmlsZSkpOworCQlmaWxlLT50eXBlID0gY3B1X3RvX2JlMTYoSEZTUExVU19GSUxFKTsKKwkJZmlsZS0+ZmxhZ3MgPSBjcHVfdG9fYmUxNihIRlNQTFVTX0ZJTEVfVEhSRUFEX0VYSVNUUyk7CisJCWZpbGUtPmlkID0gY3B1X3RvX2JlMzIoY25pZCk7CisJCWZpbGUtPmNyZWF0ZV9kYXRlID0gZmlsZS0+Y29udGVudF9tb2RfZGF0ZSA9CisJCQlmaWxlLT5hdHRyaWJ1dGVfbW9kX2RhdGUgPSBmaWxlLT5hY2Nlc3NfZGF0ZSA9IGhmc3Bfbm93Mm10KCk7CisJCWlmIChjbmlkID09IGlub2RlLT5pX2lubykgeworCQkJaGZzcGx1c19zZXRfcGVybXMoaW5vZGUsICZmaWxlLT5wZXJtaXNzaW9ucyk7CisJCQlmaWxlLT51c2VyX2luZm8uZmRUeXBlID0gY3B1X3RvX2JlMzIoSEZTUExVU19TQihpbm9kZS0+aV9zYikudHlwZSk7CisJCQlmaWxlLT51c2VyX2luZm8uZmRDcmVhdG9yID0gY3B1X3RvX2JlMzIoSEZTUExVU19TQihpbm9kZS0+aV9zYikuY3JlYXRvcik7CisJCQlpZiAoKGZpbGUtPnBlcm1pc3Npb25zLnJvb3RmbGFncyB8IGZpbGUtPnBlcm1pc3Npb25zLnVzZXJmbGFncykgJiBIRlNQTFVTX0ZMR19JTU1VVEFCTEUpCisJCQkJZmlsZS0+ZmxhZ3MgfD0gY3B1X3RvX2JlMTYoSEZTUExVU19GSUxFX0xPQ0tFRCk7CisJCX0gZWxzZSB7CisJCQlmaWxlLT51c2VyX2luZm8uZmRUeXBlID0gY3B1X3RvX2JlMzIoSEZTUF9IQVJETElOS19UWVBFKTsKKwkJCWZpbGUtPnVzZXJfaW5mby5mZENyZWF0b3IgPSBjcHVfdG9fYmUzMihIRlNQX0hGU1BMVVNfQ1JFQVRPUik7CisJCQlmaWxlLT51c2VyX2luZm8uZmRGbGFncyA9IGNwdV90b19iZTE2KDB4MTAwKTsKKwkJCWZpbGUtPnBlcm1pc3Npb25zLmRldiA9IGNwdV90b19iZTMyKEhGU1BMVVNfSShpbm9kZSkuZGV2KTsKKwkJfQorCQlyZXR1cm4gc2l6ZW9mKCpmaWxlKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaGZzcGx1c19maWxsX2NhdF90aHJlYWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkgICBoZnNwbHVzX2NhdF9lbnRyeSAqZW50cnksIGludCB0eXBlLAorCQkJCSAgIHUzMiBwYXJlbnRpZCwgc3RydWN0IHFzdHIgKnN0cikKK3sKKwllbnRyeS0+dHlwZSA9IGNwdV90b19iZTE2KHR5cGUpOworCWVudHJ5LT50aHJlYWQucmVzZXJ2ZWQgPSAwOworCWVudHJ5LT50aHJlYWQucGFyZW50SUQgPSBjcHVfdG9fYmUzMihwYXJlbnRpZCk7CisJaGZzcGx1c19hc2MydW5pKHNiLCAmZW50cnktPnRocmVhZC5ub2RlTmFtZSwgc3RyLT5uYW1lLCBzdHItPmxlbik7CisJcmV0dXJuIDEwICsgYmUxNl90b19jcHUoZW50cnktPnRocmVhZC5ub2RlTmFtZS5sZW5ndGgpICogMjsKK30KKworLyogVHJ5IHRvIGdldCBhIGNhdGFsb2cgZW50cnkgZm9yIGdpdmVuIGNhdGFsb2cgaWQgKi8KK2ludCBoZnNwbHVzX2ZpbmRfY2F0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHUzMiBjbmlkLAorCQkgICAgIHN0cnVjdCBoZnNfZmluZF9kYXRhICpmZCkKK3sKKwloZnNwbHVzX2NhdF9lbnRyeSB0bXA7CisJaW50IGVycjsKKwl1MTYgdHlwZTsKKworCWhmc3BsdXNfY2F0X2J1aWxkX2tleShzYiwgZmQtPnNlYXJjaF9rZXksIGNuaWQsIE5VTEwpOworCWVyciA9IGhmc19icmVjX3JlYWQoZmQsICZ0bXAsIHNpemVvZihoZnNwbHVzX2NhdF9lbnRyeSkpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwl0eXBlID0gYmUxNl90b19jcHUodG1wLnR5cGUpOworCWlmICh0eXBlICE9IEhGU1BMVVNfRk9MREVSX1RIUkVBRCAmJiB0eXBlICE9IEhGU1BMVVNfRklMRV9USFJFQUQpIHsKKwkJcHJpbnRrKCJIRlMrLWZzOiBGb3VuZCBiYWQgdGhyZWFkIHJlY29yZCBpbiBjYXRhbG9nXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaGZzcGx1c19jYXRfYnVpbGRfa2V5X3VuaShmZC0+c2VhcmNoX2tleSwgYmUzMl90b19jcHUodG1wLnRocmVhZC5wYXJlbnRJRCksCisJCQkJICZ0bXAudGhyZWFkLm5vZGVOYW1lKTsKKwlyZXR1cm4gaGZzX2JyZWNfZmluZChmZCk7Cit9CisKK2ludCBoZnNwbHVzX2NyZWF0ZV9jYXQodTMyIGNuaWQsIHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgcXN0ciAqc3RyLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBoZnNfZmluZF9kYXRhIGZkOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJaGZzcGx1c19jYXRfZW50cnkgZW50cnk7CisJaW50IGVudHJ5X3NpemU7CisJaW50IGVycjsKKworCWRwcmludChEQkdfQ0FUX01PRCwgImNyZWF0ZV9jYXQ6ICVzLCV1KCVkKVxuIiwgc3RyLT5uYW1lLCBjbmlkLCBpbm9kZS0+aV9ubGluayk7CisJc2IgPSBkaXItPmlfc2I7CisJaGZzX2ZpbmRfaW5pdChIRlNQTFVTX1NCKHNiKS5jYXRfdHJlZSwgJmZkKTsKKworCWhmc3BsdXNfY2F0X2J1aWxkX2tleShzYiwgZmQuc2VhcmNoX2tleSwgY25pZCwgTlVMTCk7CisJZW50cnlfc2l6ZSA9IGhmc3BsdXNfZmlsbF9jYXRfdGhyZWFkKHNiLCAmZW50cnksIFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgPworCQkJSEZTUExVU19GT0xERVJfVEhSRUFEIDogSEZTUExVU19GSUxFX1RIUkVBRCwKKwkJCWRpci0+aV9pbm8sIHN0cik7CisJZXJyID0gaGZzX2JyZWNfZmluZCgmZmQpOworCWlmIChlcnIgIT0gLUVOT0VOVCkgeworCQlpZiAoIWVycikKKwkJCWVyciA9IC1FRVhJU1Q7CisJCWdvdG8gZXJyMjsKKwl9CisJZXJyID0gaGZzX2JyZWNfaW5zZXJ0KCZmZCwgJmVudHJ5LCBlbnRyeV9zaXplKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycjI7CisKKwloZnNwbHVzX2NhdF9idWlsZF9rZXkoc2IsIGZkLnNlYXJjaF9rZXksIGRpci0+aV9pbm8sIHN0cik7CisJZW50cnlfc2l6ZSA9IGhmc3BsdXNfY2F0X2J1aWxkX3JlY29yZCgmZW50cnksIGNuaWQsIGlub2RlKTsKKwllcnIgPSBoZnNfYnJlY19maW5kKCZmZCk7CisJaWYgKGVyciAhPSAtRU5PRU5UKSB7CisJCS8qIHBhbmljPyAqLworCQlpZiAoIWVycikKKwkJCWVyciA9IC1FRVhJU1Q7CisJCWdvdG8gZXJyMTsKKwl9CisJZXJyID0gaGZzX2JyZWNfaW5zZXJ0KCZmZCwgJmVudHJ5LCBlbnRyeV9zaXplKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycjE7CisKKwlkaXItPmlfc2l6ZSsrOworCWRpci0+aV9tdGltZSA9IGRpci0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJbWFya19pbm9kZV9kaXJ0eShkaXIpOworCWhmc19maW5kX2V4aXQoJmZkKTsKKwlyZXR1cm4gMDsKKworZXJyMToKKwloZnNwbHVzX2NhdF9idWlsZF9rZXkoc2IsIGZkLnNlYXJjaF9rZXksIGNuaWQsIE5VTEwpOworCWlmICghaGZzX2JyZWNfZmluZCgmZmQpKQorCQloZnNfYnJlY19yZW1vdmUoJmZkKTsKK2VycjI6CisJaGZzX2ZpbmRfZXhpdCgmZmQpOworCXJldHVybiBlcnI7Cit9CisKK2ludCBoZnNwbHVzX2RlbGV0ZV9jYXQodTMyIGNuaWQsIHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgcXN0ciAqc3RyKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJc3RydWN0IGhmc19maW5kX2RhdGEgZmQ7CisJc3RydWN0IGhmc3BsdXNfZm9ya19yYXcgZm9yazsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisJaW50IGVyciwgb2ZmOworCXUxNiB0eXBlOworCisJZHByaW50KERCR19DQVRfTU9ELCAiZGVsZXRlX2NhdDogJXMsJXVcbiIsIHN0ciA/IHN0ci0+bmFtZSA6IE5VTEwsIGNuaWQpOworCXNiID0gZGlyLT5pX3NiOworCWhmc19maW5kX2luaXQoSEZTUExVU19TQihzYikuY2F0X3RyZWUsICZmZCk7CisKKwlpZiAoIXN0cikgeworCQlpbnQgbGVuOworCisJCWhmc3BsdXNfY2F0X2J1aWxkX2tleShzYiwgZmQuc2VhcmNoX2tleSwgY25pZCwgTlVMTCk7CisJCWVyciA9IGhmc19icmVjX2ZpbmQoJmZkKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCisJCW9mZiA9IGZkLmVudHJ5b2Zmc2V0ICsgb2Zmc2V0b2Yoc3RydWN0IGhmc3BsdXNfY2F0X3RocmVhZCwgbm9kZU5hbWUpOworCQlmZC5zZWFyY2hfa2V5LT5jYXQucGFyZW50ID0gY3B1X3RvX2JlMzIoZGlyLT5pX2lubyk7CisJCWhmc19ibm9kZV9yZWFkKGZkLmJub2RlLCAmZmQuc2VhcmNoX2tleS0+Y2F0Lm5hbWUubGVuZ3RoLCBvZmYsIDIpOworCQlsZW4gPSBiZTE2X3RvX2NwdShmZC5zZWFyY2hfa2V5LT5jYXQubmFtZS5sZW5ndGgpICogMjsKKwkJaGZzX2Jub2RlX3JlYWQoZmQuYm5vZGUsICZmZC5zZWFyY2hfa2V5LT5jYXQubmFtZS51bmljb2RlLCBvZmYgKyAyLCBsZW4pOworCQlmZC5zZWFyY2hfa2V5LT5rZXlfbGVuID0gY3B1X3RvX2JlMTYoNiArIGxlbik7CisJfSBlbHNlCisJCWhmc3BsdXNfY2F0X2J1aWxkX2tleShzYiwgZmQuc2VhcmNoX2tleSwgZGlyLT5pX2lubywgc3RyKTsKKworCWVyciA9IGhmc19icmVjX2ZpbmQoJmZkKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCXR5cGUgPSBoZnNfYm5vZGVfcmVhZF91MTYoZmQuYm5vZGUsIGZkLmVudHJ5b2Zmc2V0KTsKKwlpZiAodHlwZSA9PSBIRlNQTFVTX0ZJTEUpIHsKKyNpZiAwCisJCW9mZiA9IGZkLmVudHJ5b2Zmc2V0ICsgb2Zmc2V0b2YoaGZzcGx1c19jYXRfZmlsZSwgZGF0YV9mb3JrKTsKKwkJaGZzX2Jub2RlX3JlYWQoZmQuYm5vZGUsICZmb3JrLCBvZmYsIHNpemVvZihmb3JrKSk7CisJCWhmc3BsdXNfZnJlZV9mb3JrKHNiLCBjbmlkLCAmZm9yaywgSEZTUExVU19UWVBFX0RBVEEpOworI2VuZGlmCisKKwkJb2ZmID0gZmQuZW50cnlvZmZzZXQgKyBvZmZzZXRvZihzdHJ1Y3QgaGZzcGx1c19jYXRfZmlsZSwgcnNyY19mb3JrKTsKKwkJaGZzX2Jub2RlX3JlYWQoZmQuYm5vZGUsICZmb3JrLCBvZmYsIHNpemVvZihmb3JrKSk7CisJCWhmc3BsdXNfZnJlZV9mb3JrKHNiLCBjbmlkLCAmZm9yaywgSEZTUExVU19UWVBFX1JTUkMpOworCX0KKworCWxpc3RfZm9yX2VhY2gocG9zLCAmSEZTUExVU19JKGRpcikub3Blbl9kaXJfbGlzdCkgeworCQlzdHJ1Y3QgaGZzcGx1c19yZWFkZGlyX2RhdGEgKnJkID0KKwkJCWxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgaGZzcGx1c19yZWFkZGlyX2RhdGEsIGxpc3QpOworCQlpZiAoZmQudHJlZS0+a2V5Y21wKGZkLnNlYXJjaF9rZXksICh2b2lkICopJnJkLT5rZXkpIDwgMCkKKwkJCXJkLT5maWxlLT5mX3Bvcy0tOworCX0KKworCWVyciA9IGhmc19icmVjX3JlbW92ZSgmZmQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJaGZzcGx1c19jYXRfYnVpbGRfa2V5KHNiLCBmZC5zZWFyY2hfa2V5LCBjbmlkLCBOVUxMKTsKKwllcnIgPSBoZnNfYnJlY19maW5kKCZmZCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwllcnIgPSBoZnNfYnJlY19yZW1vdmUoJmZkKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWRpci0+aV9zaXplLS07CisJZGlyLT5pX210aW1lID0gZGlyLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwltYXJrX2lub2RlX2RpcnR5KGRpcik7CitvdXQ6CisJaGZzX2ZpbmRfZXhpdCgmZmQpOworCisJcmV0dXJuIGVycjsKK30KKworaW50IGhmc3BsdXNfcmVuYW1lX2NhdCh1MzIgY25pZCwKKwkJICAgICAgIHN0cnVjdCBpbm9kZSAqc3JjX2Rpciwgc3RydWN0IHFzdHIgKnNyY19uYW1lLAorCQkgICAgICAgc3RydWN0IGlub2RlICpkc3RfZGlyLCBzdHJ1Y3QgcXN0ciAqZHN0X25hbWUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwlzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSBzcmNfZmQsIGRzdF9mZDsKKwloZnNwbHVzX2NhdF9lbnRyeSBlbnRyeTsKKwlpbnQgZW50cnlfc2l6ZSwgdHlwZTsKKwlpbnQgZXJyID0gMDsKKworCWRwcmludChEQkdfQ0FUX01PRCwgInJlbmFtZV9jYXQ6ICV1IC0gJWx1LCVzIC0gJWx1LCVzXG4iLCBjbmlkLCBzcmNfZGlyLT5pX2lubywgc3JjX25hbWUtPm5hbWUsCisJCWRzdF9kaXItPmlfaW5vLCBkc3RfbmFtZS0+bmFtZSk7CisJc2IgPSBzcmNfZGlyLT5pX3NiOworCWhmc19maW5kX2luaXQoSEZTUExVU19TQihzYikuY2F0X3RyZWUsICZzcmNfZmQpOworCWRzdF9mZCA9IHNyY19mZDsKKworCS8qIGZpbmQgdGhlIG9sZCBkaXIgZW50cnkgYW5kIHJlYWQgdGhlIGRhdGEgKi8KKwloZnNwbHVzX2NhdF9idWlsZF9rZXkoc2IsIHNyY19mZC5zZWFyY2hfa2V5LCBzcmNfZGlyLT5pX2lubywgc3JjX25hbWUpOworCWVyciA9IGhmc19icmVjX2ZpbmQoJnNyY19mZCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwloZnNfYm5vZGVfcmVhZChzcmNfZmQuYm5vZGUsICZlbnRyeSwgc3JjX2ZkLmVudHJ5b2Zmc2V0LAorCQkJCXNyY19mZC5lbnRyeWxlbmd0aCk7CisKKwkvKiBjcmVhdGUgbmV3IGRpciBlbnRyeSB3aXRoIHRoZSBkYXRhIGZyb20gdGhlIG9sZCBlbnRyeSAqLworCWhmc3BsdXNfY2F0X2J1aWxkX2tleShzYiwgZHN0X2ZkLnNlYXJjaF9rZXksIGRzdF9kaXItPmlfaW5vLCBkc3RfbmFtZSk7CisJZXJyID0gaGZzX2JyZWNfZmluZCgmZHN0X2ZkKTsKKwlpZiAoZXJyICE9IC1FTk9FTlQpIHsKKwkJaWYgKCFlcnIpCisJCQllcnIgPSAtRUVYSVNUOworCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSBoZnNfYnJlY19pbnNlcnQoJmRzdF9mZCwgJmVudHJ5LCBzcmNfZmQuZW50cnlsZW5ndGgpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWRzdF9kaXItPmlfc2l6ZSsrOworCWRzdF9kaXItPmlfbXRpbWUgPSBkc3RfZGlyLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwltYXJrX2lub2RlX2RpcnR5KGRzdF9kaXIpOworCisJLyogZmluYWxseSByZW1vdmUgdGhlIG9sZCBlbnRyeSAqLworCWhmc3BsdXNfY2F0X2J1aWxkX2tleShzYiwgc3JjX2ZkLnNlYXJjaF9rZXksIHNyY19kaXItPmlfaW5vLCBzcmNfbmFtZSk7CisJZXJyID0gaGZzX2JyZWNfZmluZCgmc3JjX2ZkKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwllcnIgPSBoZnNfYnJlY19yZW1vdmUoJnNyY19mZCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJc3JjX2Rpci0+aV9zaXplLS07CisJc3JjX2Rpci0+aV9tdGltZSA9IHNyY19kaXItPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCW1hcmtfaW5vZGVfZGlydHkoc3JjX2Rpcik7CisKKwkvKiByZW1vdmUgb2xkIHRocmVhZCBlbnRyeSAqLworCWhmc3BsdXNfY2F0X2J1aWxkX2tleShzYiwgc3JjX2ZkLnNlYXJjaF9rZXksIGNuaWQsIE5VTEwpOworCWVyciA9IGhmc19icmVjX2ZpbmQoJnNyY19mZCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJdHlwZSA9IGhmc19ibm9kZV9yZWFkX3UxNihzcmNfZmQuYm5vZGUsIHNyY19mZC5lbnRyeW9mZnNldCk7CisJZXJyID0gaGZzX2JyZWNfcmVtb3ZlKCZzcmNfZmQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJLyogY3JlYXRlIG5ldyB0aHJlYWQgZW50cnkgKi8KKwloZnNwbHVzX2NhdF9idWlsZF9rZXkoc2IsIGRzdF9mZC5zZWFyY2hfa2V5LCBjbmlkLCBOVUxMKTsKKwllbnRyeV9zaXplID0gaGZzcGx1c19maWxsX2NhdF90aHJlYWQoc2IsICZlbnRyeSwgdHlwZSwgZHN0X2Rpci0+aV9pbm8sIGRzdF9uYW1lKTsKKwllcnIgPSBoZnNfYnJlY19maW5kKCZkc3RfZmQpOworCWlmIChlcnIgIT0gLUVOT0VOVCkgeworCQlpZiAoIWVycikKKwkJCWVyciA9IC1FRVhJU1Q7CisJCWdvdG8gb3V0OworCX0KKwllcnIgPSBoZnNfYnJlY19pbnNlcnQoJmRzdF9mZCwgJmVudHJ5LCBlbnRyeV9zaXplKTsKK291dDoKKwloZnNfYm5vZGVfcHV0KGRzdF9mZC5ibm9kZSk7CisJaGZzX2ZpbmRfZXhpdCgmc3JjX2ZkKTsKKwlyZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9kaXIuYyBiL2ZzL2hmc3BsdXMvZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JkYTc2NgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmc3BsdXMvZGlyLmMKQEAgLTAsMCArMSw0ODQgQEAKKy8qCisgKiAgbGludXgvZnMvaGZzcGx1cy9kaXIuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMQorICogQnJhZCBCb3llciAoZmxhckBhbGxhbmRyaWEuY29tKQorICogKEMpIDIwMDMgQXJkaXMgVGVjaG5vbG9naWVzIDxyb21hbkBhcmRpc3RlY2guY29tPgorICoKKyAqIEhhbmRsaW5nIG9mIGRpcmVjdG9yaWVzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpbmNsdWRlICJoZnNwbHVzX2ZzLmgiCisjaW5jbHVkZSAiaGZzcGx1c19yYXcuaCIKKworc3RhdGljIGlubGluZSB2b2lkIGhmc3BsdXNfaW5zdGFudGlhdGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1MzIgY25pZCkKK3sKKwlkZW50cnktPmRfZnNkYXRhID0gKHZvaWQgKikodW5zaWduZWQgbG9uZyljbmlkOworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7Cit9CisKKy8qIEZpbmQgdGhlIGVudHJ5IGluc2lkZSBkaXIgbmFtZWQgZGVudHJ5LT5kX25hbWUgKi8KK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpoZnNwbHVzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJCSAgICAgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CisJc3RydWN0IGhmc19maW5kX2RhdGEgZmQ7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwloZnNwbHVzX2NhdF9lbnRyeSBlbnRyeTsKKwlpbnQgZXJyOworCXUzMiBjbmlkLCBsaW5raWQgPSAwOworCXUxNiB0eXBlOworCisJc2IgPSBkaXItPmlfc2I7CisJZGVudHJ5LT5kX2ZzZGF0YSA9IE5VTEw7CisJaGZzX2ZpbmRfaW5pdChIRlNQTFVTX1NCKHNiKS5jYXRfdHJlZSwgJmZkKTsKKwloZnNwbHVzX2NhdF9idWlsZF9rZXkoc2IsIGZkLnNlYXJjaF9rZXksIGRpci0+aV9pbm8sICZkZW50cnktPmRfbmFtZSk7CithZ2FpbjoKKwllcnIgPSBoZnNfYnJlY19yZWFkKCZmZCwgJmVudHJ5LCBzaXplb2YoZW50cnkpKTsKKwlpZiAoZXJyKSB7CisJCWlmIChlcnIgPT0gLUVOT0VOVCkgeworCQkJaGZzX2ZpbmRfZXhpdCgmZmQpOworCQkJLyogTm8gc3VjaCBlbnRyeSAqLworCQkJaW5vZGUgPSBOVUxMOworCQkJZ290byBvdXQ7CisJCX0KKwkJZ290byBmYWlsOworCX0KKwl0eXBlID0gYmUxNl90b19jcHUoZW50cnkudHlwZSk7CisJaWYgKHR5cGUgPT0gSEZTUExVU19GT0xERVIpIHsKKwkJaWYgKGZkLmVudHJ5bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBoZnNwbHVzX2NhdF9mb2xkZXIpKSB7CisJCQllcnIgPSAtRUlPOworCQkJZ290byBmYWlsOworCQl9CisJCWNuaWQgPSBiZTMyX3RvX2NwdShlbnRyeS5mb2xkZXIuaWQpOworCQlkZW50cnktPmRfZnNkYXRhID0gKHZvaWQgKikodW5zaWduZWQgbG9uZyljbmlkOworCX0gZWxzZSBpZiAodHlwZSA9PSBIRlNQTFVTX0ZJTEUpIHsKKwkJaWYgKGZkLmVudHJ5bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBoZnNwbHVzX2NhdF9maWxlKSkgeworCQkJZXJyID0gLUVJTzsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQljbmlkID0gYmUzMl90b19jcHUoZW50cnkuZmlsZS5pZCk7CisJCWlmIChlbnRyeS5maWxlLnVzZXJfaW5mby5mZFR5cGUgPT0gY3B1X3RvX2JlMzIoSEZTUF9IQVJETElOS19UWVBFKSAmJgorCQkgICAgZW50cnkuZmlsZS51c2VyX2luZm8uZmRDcmVhdG9yID09IGNwdV90b19iZTMyKEhGU1BfSEZTUExVU19DUkVBVE9SKSkgeworCQkJc3RydWN0IHFzdHIgc3RyOworCQkJY2hhciBuYW1lWzMyXTsKKworCQkJaWYgKGRlbnRyeS0+ZF9mc2RhdGEpIHsKKwkJCQllcnIgPSAtRU5PRU5UOworCQkJCWlub2RlID0gTlVMTDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWRlbnRyeS0+ZF9mc2RhdGEgPSAodm9pZCAqKSh1bnNpZ25lZCBsb25nKWNuaWQ7CisJCQlsaW5raWQgPSBiZTMyX3RvX2NwdShlbnRyeS5maWxlLnBlcm1pc3Npb25zLmRldik7CisJCQlzdHIubGVuID0gc3ByaW50ZihuYW1lLCAiaU5vZGUlZCIsIGxpbmtpZCk7CisJCQlzdHIubmFtZSA9IG5hbWU7CisJCQloZnNwbHVzX2NhdF9idWlsZF9rZXkoc2IsIGZkLnNlYXJjaF9rZXksIEhGU1BMVVNfU0Ioc2IpLmhpZGRlbl9kaXItPmlfaW5vLCAmc3RyKTsKKwkJCWdvdG8gYWdhaW47CisJCX0gZWxzZSBpZiAoIWRlbnRyeS0+ZF9mc2RhdGEpCisJCQlkZW50cnktPmRfZnNkYXRhID0gKHZvaWQgKikodW5zaWduZWQgbG9uZyljbmlkOworCX0gZWxzZSB7CisJCXByaW50aygiSEZTKy1mczogSWxsZWdhbCBjYXRhbG9nIGVudHJ5IHR5cGUgaW4gbG9va3VwXG4iKTsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBmYWlsOworCX0KKwloZnNfZmluZF9leGl0KCZmZCk7CisJaW5vZGUgPSBpZ2V0KGRpci0+aV9zYiwgY25pZCk7CisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CisJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCisJCUhGU1BMVVNfSShpbm9kZSkuZGV2ID0gbGlua2lkOworb3V0OgorCWRfYWRkKGRlbnRyeSwgaW5vZGUpOworCXJldHVybiBOVUxMOworZmFpbDoKKwloZnNfZmluZF9leGl0KCZmZCk7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworc3RhdGljIGludCBoZnNwbHVzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlpbnQgbGVuLCBlcnI7CisJY2hhciBzdHJidWZbSEZTUExVU19NQVhfU1RSTEVOICsgMV07CisJaGZzcGx1c19jYXRfZW50cnkgZW50cnk7CisJc3RydWN0IGhmc19maW5kX2RhdGEgZmQ7CisJc3RydWN0IGhmc3BsdXNfcmVhZGRpcl9kYXRhICpyZDsKKwl1MTYgdHlwZTsKKworCWlmIChmaWxwLT5mX3BvcyA+PSBpbm9kZS0+aV9zaXplKQorCQlyZXR1cm4gMDsKKworCWhmc19maW5kX2luaXQoSEZTUExVU19TQihzYikuY2F0X3RyZWUsICZmZCk7CisJaGZzcGx1c19jYXRfYnVpbGRfa2V5KHNiLCBmZC5zZWFyY2hfa2V5LCBpbm9kZS0+aV9pbm8sIE5VTEwpOworCWVyciA9IGhmc19icmVjX2ZpbmQoJmZkKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCXN3aXRjaCAoKHUzMilmaWxwLT5mX3BvcykgeworCWNhc2UgMDoKKwkJLyogVGhpcyBpcyBjb21wbGV0ZWx5IGFydGlmaWNpYWwuLi4gKi8KKwkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLiIsIDEsIDAsIGlub2RlLT5pX2lubywgRFRfRElSKSkKKwkJCWdvdG8gb3V0OworCQlmaWxwLT5mX3BvcysrOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIDE6CisJCWhmc19ibm9kZV9yZWFkKGZkLmJub2RlLCAmZW50cnksIGZkLmVudHJ5b2Zmc2V0LCBmZC5lbnRyeWxlbmd0aCk7CisJCWlmIChiZTE2X3RvX2NwdShlbnRyeS50eXBlKSAhPSBIRlNQTFVTX0ZPTERFUl9USFJFQUQpIHsKKwkJCXByaW50aygiSEZTKy1mczogYmFkIGNhdGFsb2cgZm9sZGVyIHRocmVhZFxuIik7CisJCQllcnIgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKGZkLmVudHJ5bGVuZ3RoIDwgSEZTUExVU19NSU5fVEhSRUFEX1NaKSB7CisJCQlwcmludGsoIkhGUystZnM6IHRydW5jYXRlZCBjYXRhbG9nIHRocmVhZFxuIik7CisJCQllcnIgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLi4iLCAyLCAxLAorCQkJICAgIGJlMzJfdG9fY3B1KGVudHJ5LnRocmVhZC5wYXJlbnRJRCksIERUX0RJUikpCisJCQlnb3RvIG91dDsKKwkJZmlscC0+Zl9wb3MrKzsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJZGVmYXVsdDoKKwkJaWYgKGZpbHAtPmZfcG9zID49IGlub2RlLT5pX3NpemUpCisJCQlnb3RvIG91dDsKKwkJZXJyID0gaGZzX2JyZWNfZ290bygmZmQsIGZpbHAtPmZfcG9zIC0gMSk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwl9CisKKwlmb3IgKDs7KSB7CisJCWlmIChiZTMyX3RvX2NwdShmZC5rZXktPmNhdC5wYXJlbnQpICE9IGlub2RlLT5pX2lubykgeworCQkJcHJpbnRrKCJIRlMrLWZzOiB3YWxrZWQgcGFzdCBlbmQgb2YgZGlyXG4iKTsKKwkJCWVyciA9IC1FSU87CisJCQlnb3RvIG91dDsKKwkJfQorCQloZnNfYm5vZGVfcmVhZChmZC5ibm9kZSwgJmVudHJ5LCBmZC5lbnRyeW9mZnNldCwgZmQuZW50cnlsZW5ndGgpOworCQl0eXBlID0gYmUxNl90b19jcHUoZW50cnkudHlwZSk7CisJCWxlbiA9IEhGU1BMVVNfTUFYX1NUUkxFTjsKKwkJZXJyID0gaGZzcGx1c191bmkyYXNjKHNiLCAmZmQua2V5LT5jYXQubmFtZSwgc3RyYnVmLCAmbGVuKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCQlpZiAodHlwZSA9PSBIRlNQTFVTX0ZPTERFUikgeworCQkJaWYgKGZkLmVudHJ5bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBoZnNwbHVzX2NhdF9mb2xkZXIpKSB7CisJCQkJcHJpbnRrKCJIRlMrLWZzOiBzbWFsbCBkaXIgZW50cnlcbiIpOworCQkJCWVyciA9IC1FSU87CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlpZiAoSEZTUExVU19TQihzYikuaGlkZGVuX2RpciAmJgorCQkJICAgIEhGU1BMVVNfU0Ioc2IpLmhpZGRlbl9kaXItPmlfaW5vID09IGJlMzJfdG9fY3B1KGVudHJ5LmZvbGRlci5pZCkpCisJCQkJZ290byBuZXh0OworCQkJaWYgKGZpbGxkaXIoZGlyZW50LCBzdHJidWYsIGxlbiwgZmlscC0+Zl9wb3MsCisJCQkJICAgIGJlMzJfdG9fY3B1KGVudHJ5LmZvbGRlci5pZCksIERUX0RJUikpCisJCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAodHlwZSA9PSBIRlNQTFVTX0ZJTEUpIHsKKwkJCWlmIChmZC5lbnRyeWxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgaGZzcGx1c19jYXRfZmlsZSkpIHsKKwkJCQlwcmludGsoIkhGUystZnM6IHNtYWxsIGZpbGUgZW50cnlcbiIpOworCQkJCWVyciA9IC1FSU87CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlpZiAoZmlsbGRpcihkaXJlbnQsIHN0cmJ1ZiwgbGVuLCBmaWxwLT5mX3BvcywKKwkJCQkgICAgYmUzMl90b19jcHUoZW50cnkuZmlsZS5pZCksIERUX1JFRykpCisJCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlwcmludGsoIkhGUystZnM6IGJhZCBjYXRhbG9nIGVudHJ5IHR5cGVcbiIpOworCQkJZXJyID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisJbmV4dDoKKwkJZmlscC0+Zl9wb3MrKzsKKwkJaWYgKGZpbHAtPmZfcG9zID49IGlub2RlLT5pX3NpemUpCisJCQlnb3RvIG91dDsKKwkJZXJyID0gaGZzX2JyZWNfZ290bygmZmQsIDEpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJfQorCXJkID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWlmICghcmQpIHsKKwkJcmQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaGZzcGx1c19yZWFkZGlyX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFyZCkgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWZpbHAtPnByaXZhdGVfZGF0YSA9IHJkOworCQlyZC0+ZmlsZSA9IGZpbHA7CisJCWxpc3RfYWRkKCZyZC0+bGlzdCwgJkhGU1BMVVNfSShpbm9kZSkub3Blbl9kaXJfbGlzdCk7CisJfQorCW1lbWNweSgmcmQtPmtleSwgZmQua2V5LCBzaXplb2Yoc3RydWN0IGhmc3BsdXNfY2F0X2tleSkpOworb3V0OgorCWhmc19maW5kX2V4aXQoJmZkKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGhmc3BsdXNfZGlyX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGhmc3BsdXNfcmVhZGRpcl9kYXRhICpyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpZiAocmQpIHsKKwkJbGlzdF9kZWwoJnJkLT5saXN0KTsKKwkJa2ZyZWUocmQpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZnNwbHVzX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKKwkJCSAgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgcmVzOworCisJaW5vZGUgPSBoZnNwbHVzX25ld19pbm9kZShkaXItPmlfc2IsIG1vZGUpOworCWlmICghaW5vZGUpCisJCXJldHVybiAtRU5PU1BDOworCisJcmVzID0gaGZzcGx1c19jcmVhdGVfY2F0KGlub2RlLT5pX2lubywgZGlyLCAmZGVudHJ5LT5kX25hbWUsIGlub2RlKTsKKwlpZiAocmVzKSB7CisJCWlub2RlLT5pX25saW5rID0gMDsKKwkJaGZzcGx1c19kZWxldGVfaW5vZGUoaW5vZGUpOworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIHJlczsKKwl9CisJaGZzcGx1c19pbnN0YW50aWF0ZShkZW50cnksIGlub2RlLCBpbm9kZS0+aV9pbm8pOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhmc3BsdXNfbGluayhzdHJ1Y3QgZGVudHJ5ICpzcmNfZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmRzdF9kaXIsCisJCQlzdHJ1Y3QgZGVudHJ5ICpkc3RfZGVudHJ5KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkc3RfZGlyLT5pX3NiOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBzcmNfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqc3JjX2RpciA9IHNyY19kZW50cnktPmRfcGFyZW50LT5kX2lub2RlOworCXN0cnVjdCBxc3RyIHN0cjsKKwljaGFyIG5hbWVbMzJdOworCXUzMiBjbmlkLCBpZDsKKwlpbnQgcmVzOworCisJaWYgKEhGU1BMVVNfSVNfUlNSQyhpbm9kZSkpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoaW5vZGUtPmlfaW5vID09ICh1MzIpKHVuc2lnbmVkIGxvbmcpc3JjX2RlbnRyeS0+ZF9mc2RhdGEpIHsKKwkJZm9yICg7OykgeworCQkJZ2V0X3JhbmRvbV9ieXRlcygmaWQsIHNpemVvZihjbmlkKSk7CisJCQlpZCAmPSAweDNmZmZmZmZmOworCQkJc3RyLm5hbWUgPSBuYW1lOworCQkJc3RyLmxlbiA9IHNwcmludGYobmFtZSwgImlOb2RlJWQiLCBpZCk7CisJCQlyZXMgPSBoZnNwbHVzX3JlbmFtZV9jYXQoaW5vZGUtPmlfaW5vLAorCQkJCQkJIHNyY19kaXIsICZzcmNfZGVudHJ5LT5kX25hbWUsCisJCQkJCQkgSEZTUExVU19TQihzYikuaGlkZGVuX2RpciwgJnN0cik7CisJCQlpZiAoIXJlcykKKwkJCQlicmVhazsKKwkJCWlmIChyZXMgIT0gLUVFWElTVCkKKwkJCQlyZXR1cm4gcmVzOworCQl9CisJCUhGU1BMVVNfSShpbm9kZSkuZGV2ID0gaWQ7CisJCWNuaWQgPSBIRlNQTFVTX1NCKHNiKS5uZXh0X2NuaWQrKzsKKwkJc3JjX2RlbnRyeS0+ZF9mc2RhdGEgPSAodm9pZCAqKSh1bnNpZ25lZCBsb25nKWNuaWQ7CisJCXJlcyA9IGhmc3BsdXNfY3JlYXRlX2NhdChjbmlkLCBzcmNfZGlyLCAmc3JjX2RlbnRyeS0+ZF9uYW1lLCBpbm9kZSk7CisJCWlmIChyZXMpCisJCQkvKiBwYW5pYz8gKi8KKwkJCXJldHVybiByZXM7CisJCUhGU1BMVVNfU0Ioc2IpLmZpbGVfY291bnQrKzsKKwl9CisJY25pZCA9IEhGU1BMVVNfU0Ioc2IpLm5leHRfY25pZCsrOworCXJlcyA9IGhmc3BsdXNfY3JlYXRlX2NhdChjbmlkLCBkc3RfZGlyLCAmZHN0X2RlbnRyeS0+ZF9uYW1lLCBpbm9kZSk7CisJaWYgKHJlcykKKwkJcmV0dXJuIHJlczsKKworCWlub2RlLT5pX25saW5rKys7CisJaGZzcGx1c19pbnN0YW50aWF0ZShkc3RfZGVudHJ5LCBpbm9kZSwgY25pZCk7CisJYXRvbWljX2luYygmaW5vZGUtPmlfY291bnQpOworCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwlIRlNQTFVTX1NCKHNiKS5maWxlX2NvdW50Kys7CisJc2ItPnNfZGlydCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZnNwbHVzX3VubGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPmlfc2I7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgcXN0ciBzdHI7CisJY2hhciBuYW1lWzMyXTsKKwl1MzIgY25pZDsKKwlpbnQgcmVzOworCisJaWYgKEhGU1BMVVNfSVNfUlNSQyhpbm9kZSkpCisJCXJldHVybiAtRVBFUk07CisKKwljbmlkID0gKHUzMikodW5zaWduZWQgbG9uZylkZW50cnktPmRfZnNkYXRhOworCWlmIChpbm9kZS0+aV9pbm8gPT0gY25pZCAmJgorCSAgICBhdG9taWNfcmVhZCgmSEZTUExVU19JKGlub2RlKS5vcGVuY250KSkgeworCQlzdHIubmFtZSA9IG5hbWU7CisJCXN0ci5sZW4gPSBzcHJpbnRmKG5hbWUsICJ0ZW1wJWx1IiwgaW5vZGUtPmlfaW5vKTsKKwkJcmVzID0gaGZzcGx1c19yZW5hbWVfY2F0KGlub2RlLT5pX2lubywKKwkJCQkJIGRpciwgJmRlbnRyeS0+ZF9uYW1lLAorCQkJCQkgSEZTUExVU19TQihzYikuaGlkZGVuX2RpciwgJnN0cik7CisJCWlmICghcmVzKQorCQkJaW5vZGUtPmlfZmxhZ3MgfD0gU19ERUFEOworCQlyZXR1cm4gcmVzOworCX0KKwlyZXMgPSBoZnNwbHVzX2RlbGV0ZV9jYXQoY25pZCwgZGlyLCAmZGVudHJ5LT5kX25hbWUpOworCWlmIChyZXMpCisJCXJldHVybiByZXM7CisKKwlpbm9kZS0+aV9ubGluay0tOworCWhmc3BsdXNfZGVsZXRlX2lub2RlKGlub2RlKTsKKwlpZiAoaW5vZGUtPmlfaW5vICE9IGNuaWQgJiYgIWlub2RlLT5pX25saW5rKSB7CisJCWlmICghYXRvbWljX3JlYWQoJkhGU1BMVVNfSShpbm9kZSkub3BlbmNudCkpIHsKKwkJCXJlcyA9IGhmc3BsdXNfZGVsZXRlX2NhdChpbm9kZS0+aV9pbm8sIEhGU1BMVVNfU0Ioc2IpLmhpZGRlbl9kaXIsIE5VTEwpOworCQkJaWYgKCFyZXMpCisJCQkJaGZzcGx1c19kZWxldGVfaW5vZGUoaW5vZGUpOworCQl9IGVsc2UKKwkJCWlub2RlLT5pX2ZsYWdzIHw9IFNfREVBRDsKKwl9CisJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBoZnNwbHVzX21rZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IHJlczsKKworCWlub2RlID0gaGZzcGx1c19uZXdfaW5vZGUoZGlyLT5pX3NiLCBTX0lGRElSIHwgbW9kZSk7CisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlyZXMgPSBoZnNwbHVzX2NyZWF0ZV9jYXQoaW5vZGUtPmlfaW5vLCBkaXIsICZkZW50cnktPmRfbmFtZSwgaW5vZGUpOworCWlmIChyZXMpIHsKKwkJaW5vZGUtPmlfbmxpbmsgPSAwOworCQloZnNwbHVzX2RlbGV0ZV9pbm9kZShpbm9kZSk7CisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gcmVzOworCX0KKwloZnNwbHVzX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUsIGlub2RlLT5pX2lubyk7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGZzcGx1c19ybWRpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IHJlczsKKworCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWlmIChpbm9kZS0+aV9zaXplICE9IDIpCisJCXJldHVybiAtRU5PVEVNUFRZOworCXJlcyA9IGhmc3BsdXNfZGVsZXRlX2NhdChpbm9kZS0+aV9pbm8sIGRpciwgJmRlbnRyeS0+ZF9uYW1lKTsKKwlpZiAocmVzKQorCQlyZXR1cm4gcmVzOworCWlub2RlLT5pX25saW5rID0gMDsKKwlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJaGZzcGx1c19kZWxldGVfaW5vZGUoaW5vZGUpOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhmc3BsdXNfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJICAgY29uc3QgY2hhciAqc3ltbmFtZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IHJlczsKKworCXNiID0gZGlyLT5pX3NiOworCWlub2RlID0gaGZzcGx1c19uZXdfaW5vZGUoc2IsIFNfSUZMTksgfCBTX0lSV1hVR08pOworCWlmICghaW5vZGUpCisJCXJldHVybiAtRU5PU1BDOworCisJcmVzID0gcGFnZV9zeW1saW5rKGlub2RlLCBzeW1uYW1lLCBzdHJsZW4oc3ltbmFtZSkgKyAxKTsKKwlpZiAocmVzKSB7CisJCWlub2RlLT5pX25saW5rID0gMDsKKwkJaGZzcGx1c19kZWxldGVfaW5vZGUoaW5vZGUpOworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwlyZXMgPSBoZnNwbHVzX2NyZWF0ZV9jYXQoaW5vZGUtPmlfaW5vLCBkaXIsICZkZW50cnktPmRfbmFtZSwgaW5vZGUpOworCisJaWYgKCFyZXMpIHsKKwkJaGZzcGx1c19pbnN0YW50aWF0ZShkZW50cnksIGlub2RlLCBpbm9kZS0+aV9pbm8pOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwl9CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IGhmc3BsdXNfbWtub2Qoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCSBpbnQgbW9kZSwgZGV2X3QgcmRldikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IHJlczsKKworCXNiID0gZGlyLT5pX3NiOworCWlub2RlID0gaGZzcGx1c19uZXdfaW5vZGUoc2IsIG1vZGUpOworCWlmICghaW5vZGUpCisJCXJldHVybiAtRU5PU1BDOworCisJcmVzID0gaGZzcGx1c19jcmVhdGVfY2F0KGlub2RlLT5pX2lubywgZGlyLCAmZGVudHJ5LT5kX25hbWUsIGlub2RlKTsKKwlpZiAocmVzKSB7CisJCWlub2RlLT5pX25saW5rID0gMDsKKwkJaGZzcGx1c19kZWxldGVfaW5vZGUoaW5vZGUpOworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIHJlczsKKwl9CisJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBtb2RlLCByZGV2KTsKKwloZnNwbHVzX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUsIGlub2RlLT5pX2lubyk7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZnNwbHVzX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCisJCQkgIHN0cnVjdCBpbm9kZSAqbmV3X2Rpciwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKK3sKKwlpbnQgcmVzOworCisJLyogVW5saW5rIGRlc3RpbmF0aW9uIGlmIGl0IGFscmVhZHkgZXhpc3RzICovCisJaWYgKG5ld19kZW50cnktPmRfaW5vZGUpIHsKKwkJcmVzID0gaGZzcGx1c191bmxpbmsobmV3X2RpciwgbmV3X2RlbnRyeSk7CisJCWlmIChyZXMpCisJCQlyZXR1cm4gcmVzOworCX0KKworCXJlcyA9IGhmc3BsdXNfcmVuYW1lX2NhdCgodTMyKSh1bnNpZ25lZCBsb25nKW9sZF9kZW50cnktPmRfZnNkYXRhLAorCQkJCSBvbGRfZGlyLCAmb2xkX2RlbnRyeS0+ZF9uYW1lLAorCQkJCSBuZXdfZGlyLCAmbmV3X2RlbnRyeS0+ZF9uYW1lKTsKKwlpZiAoIXJlcykKKwkJbmV3X2RlbnRyeS0+ZF9mc2RhdGEgPSBvbGRfZGVudHJ5LT5kX2ZzZGF0YTsKKwlyZXR1cm4gcmVzOworfQorCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBoZnNwbHVzX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0geworCS5sb29rdXAJCT0gaGZzcGx1c19sb29rdXAsCisJLmNyZWF0ZQkJPSBoZnNwbHVzX2NyZWF0ZSwKKwkubGluawkJPSBoZnNwbHVzX2xpbmssCisJLnVubGluawkJPSBoZnNwbHVzX3VubGluaywKKwkubWtkaXIJCT0gaGZzcGx1c19ta2RpciwKKwkucm1kaXIJCT0gaGZzcGx1c19ybWRpciwKKwkuc3ltbGluawk9IGhmc3BsdXNfc3ltbGluaywKKwkubWtub2QJCT0gaGZzcGx1c19ta25vZCwKKwkucmVuYW1lCQk9IGhmc3BsdXNfcmVuYW1lLAorfTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBoZnNwbHVzX2Rpcl9vcGVyYXRpb25zID0geworCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIJPSBoZnNwbHVzX3JlYWRkaXIsCisJLmlvY3RsICAgICAgICAgID0gaGZzcGx1c19pb2N0bCwKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlbGVhc2UJPSBoZnNwbHVzX2Rpcl9yZWxlYXNlLAorfTsKZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvZXh0ZW50cy5jIGIvZnMvaGZzcGx1cy9leHRlbnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc2NDk4YwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmc3BsdXMvZXh0ZW50cy5jCkBAIC0wLDAgKzEsNTA1IEBACisvKgorICogIGxpbnV4L2ZzL2hmc3BsdXMvZXh0ZW50cy5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxCisgKiBCcmFkIEJveWVyIChmbGFyQGFsbGFuZHJpYS5jb20pCisgKiAoQykgMjAwMyBBcmRpcyBUZWNobm9sb2dpZXMgPHJvbWFuQGFyZGlzdGVjaC5jb20+CisgKgorICogSGFuZGxpbmcgb2YgRXh0ZW50cyBib3RoIGluIGNhdGFsb2cgYW5kIGV4dGVudHMgb3ZlcmZsb3cgdHJlZXMKKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpbmNsdWRlICJoZnNwbHVzX2ZzLmgiCisjaW5jbHVkZSAiaGZzcGx1c19yYXcuaCIKKworLyogQ29tcGFyZSB0d28gZXh0ZW50cyBrZXlzLCByZXR1cm5zIDAgb24gc2FtZSwgcG9zL25lZyBmb3IgZGlmZmVyZW5jZSAqLworaW50IGhmc3BsdXNfZXh0X2NtcF9rZXkoaGZzcGx1c19idHJlZV9rZXkgKmsxLCBoZnNwbHVzX2J0cmVlX2tleSAqazIpCit7CisJX19iZTMyIGsxaWQsIGsyaWQ7CisJX19iZTMyIGsxcywgazJzOworCisJazFpZCA9IGsxLT5leHQuY25pZDsKKwlrMmlkID0gazItPmV4dC5jbmlkOworCWlmIChrMWlkICE9IGsyaWQpCisJCXJldHVybiBiZTMyX3RvX2NwdShrMWlkKSA8IGJlMzJfdG9fY3B1KGsyaWQpID8gLTEgOiAxOworCisJaWYgKGsxLT5leHQuZm9ya190eXBlICE9IGsyLT5leHQuZm9ya190eXBlKQorCQlyZXR1cm4gazEtPmV4dC5mb3JrX3R5cGUgPCBrMi0+ZXh0LmZvcmtfdHlwZSA/IC0xIDogMTsKKworCWsxcyA9IGsxLT5leHQuc3RhcnRfYmxvY2s7CisJazJzID0gazItPmV4dC5zdGFydF9ibG9jazsKKwlpZiAoazFzID09IGsycykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGJlMzJfdG9fY3B1KGsxcykgPCBiZTMyX3RvX2NwdShrMnMpID8gLTEgOiAxOworfQorCitzdGF0aWMgdm9pZCBoZnNwbHVzX2V4dF9idWlsZF9rZXkoaGZzcGx1c19idHJlZV9rZXkgKmtleSwgdTMyIGNuaWQsCisJCQkJICB1MzIgYmxvY2ssIHU4IHR5cGUpCit7CisJa2V5LT5rZXlfbGVuID0gY3B1X3RvX2JlMTYoSEZTUExVU19FWFRfS0VZTEVOIC0gMik7CisJa2V5LT5leHQuY25pZCA9IGNwdV90b19iZTMyKGNuaWQpOworCWtleS0+ZXh0LnN0YXJ0X2Jsb2NrID0gY3B1X3RvX2JlMzIoYmxvY2spOworCWtleS0+ZXh0LmZvcmtfdHlwZSA9IHR5cGU7CisJa2V5LT5leHQucGFkID0gMDsKK30KKworc3RhdGljIHUzMiBoZnNwbHVzX2V4dF9maW5kX2Jsb2NrKHN0cnVjdCBoZnNwbHVzX2V4dGVudCAqZXh0LCB1MzIgb2ZmKQoreworCWludCBpOworCXUzMiBjb3VudDsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBleHQrKywgaSsrKSB7CisJCWNvdW50ID0gYmUzMl90b19jcHUoZXh0LT5ibG9ja19jb3VudCk7CisJCWlmIChvZmYgPCBjb3VudCkKKwkJCXJldHVybiBiZTMyX3RvX2NwdShleHQtPnN0YXJ0X2Jsb2NrKSArIG9mZjsKKwkJb2ZmIC09IGNvdW50OworCX0KKwkvKiBwYW5pYz8gKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZnNwbHVzX2V4dF9ibG9ja19jb3VudChzdHJ1Y3QgaGZzcGx1c19leHRlbnQgKmV4dCkKK3sKKwlpbnQgaTsKKwl1MzIgY291bnQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IDg7IGV4dCsrLCBpKyspCisJCWNvdW50ICs9IGJlMzJfdG9fY3B1KGV4dC0+YmxvY2tfY291bnQpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHUzMiBoZnNwbHVzX2V4dF9sYXN0YmxvY2soc3RydWN0IGhmc3BsdXNfZXh0ZW50ICpleHQpCit7CisJaW50IGk7CisKKwlleHQgKz0gNzsKKwlmb3IgKGkgPSAwOyBpIDwgNzsgZXh0LS0sIGkrKykKKwkJaWYgKGV4dC0+YmxvY2tfY291bnQpCisJCQlicmVhazsKKwlyZXR1cm4gYmUzMl90b19jcHUoZXh0LT5zdGFydF9ibG9jaykgKyBiZTMyX3RvX2NwdShleHQtPmJsb2NrX2NvdW50KTsKK30KKworc3RhdGljIHZvaWQgX19oZnNwbHVzX2V4dF93cml0ZV9leHRlbnQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGhmc19maW5kX2RhdGEgKmZkKQoreworCWludCByZXM7CisKKwloZnNwbHVzX2V4dF9idWlsZF9rZXkoZmQtPnNlYXJjaF9rZXksIGlub2RlLT5pX2lubywgSEZTUExVU19JKGlub2RlKS5jYWNoZWRfc3RhcnQsCisJCQkgICAgICBIRlNQTFVTX0lTX1JTUkMoaW5vZGUpID8gIEhGU1BMVVNfVFlQRV9SU1JDIDogSEZTUExVU19UWVBFX0RBVEEpOworCXJlcyA9IGhmc19icmVjX2ZpbmQoZmQpOworCWlmIChIRlNQTFVTX0koaW5vZGUpLmZsYWdzICYgSEZTUExVU19GTEdfRVhUX05FVykgeworCQlpZiAocmVzICE9IC1FTk9FTlQpCisJCQlyZXR1cm47CisJCWhmc19icmVjX2luc2VydChmZCwgSEZTUExVU19JKGlub2RlKS5jYWNoZWRfZXh0ZW50cywgc2l6ZW9mKGhmc3BsdXNfZXh0ZW50X3JlYykpOworCQlIRlNQTFVTX0koaW5vZGUpLmZsYWdzICY9IH4oSEZTUExVU19GTEdfRVhUX0RJUlRZIHwgSEZTUExVU19GTEdfRVhUX05FVyk7CisJfSBlbHNlIHsKKwkJaWYgKHJlcykKKwkJCXJldHVybjsKKwkJaGZzX2Jub2RlX3dyaXRlKGZkLT5ibm9kZSwgSEZTUExVU19JKGlub2RlKS5jYWNoZWRfZXh0ZW50cywgZmQtPmVudHJ5b2Zmc2V0LCBmZC0+ZW50cnlsZW5ndGgpOworCQlIRlNQTFVTX0koaW5vZGUpLmZsYWdzICY9IH5IRlNQTFVTX0ZMR19FWFRfRElSVFk7CisJfQorfQorCit2b2lkIGhmc3BsdXNfZXh0X3dyaXRlX2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmIChIRlNQTFVTX0koaW5vZGUpLmZsYWdzICYgSEZTUExVU19GTEdfRVhUX0RJUlRZKSB7CisJCXN0cnVjdCBoZnNfZmluZF9kYXRhIGZkOworCisJCWhmc19maW5kX2luaXQoSEZTUExVU19TQihpbm9kZS0+aV9zYikuZXh0X3RyZWUsICZmZCk7CisJCV9faGZzcGx1c19leHRfd3JpdGVfZXh0ZW50KGlub2RlLCAmZmQpOworCQloZnNfZmluZF9leGl0KCZmZCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCBfX2hmc3BsdXNfZXh0X3JlYWRfZXh0ZW50KHN0cnVjdCBoZnNfZmluZF9kYXRhICpmZCwKKwkJCQkJICAgIHN0cnVjdCBoZnNwbHVzX2V4dGVudCAqZXh0ZW50LAorCQkJCQkgICAgdTMyIGNuaWQsIHUzMiBibG9jaywgdTggdHlwZSkKK3sKKwlpbnQgcmVzOworCisJaGZzcGx1c19leHRfYnVpbGRfa2V5KGZkLT5zZWFyY2hfa2V5LCBjbmlkLCBibG9jaywgdHlwZSk7CisJZmQtPmtleS0+ZXh0LmNuaWQgPSAwOworCXJlcyA9IGhmc19icmVjX2ZpbmQoZmQpOworCWlmIChyZXMgJiYgcmVzICE9IC1FTk9FTlQpCisJCXJldHVybiByZXM7CisJaWYgKGZkLT5rZXktPmV4dC5jbmlkICE9IGZkLT5zZWFyY2hfa2V5LT5leHQuY25pZCB8fAorCSAgICBmZC0+a2V5LT5leHQuZm9ya190eXBlICE9IGZkLT5zZWFyY2hfa2V5LT5leHQuZm9ya190eXBlKQorCQlyZXR1cm4gLUVOT0VOVDsKKwlpZiAoZmQtPmVudHJ5bGVuZ3RoICE9IHNpemVvZihoZnNwbHVzX2V4dGVudF9yZWMpKQorCQlyZXR1cm4gLUVJTzsKKwloZnNfYm5vZGVfcmVhZChmZC0+Ym5vZGUsIGV4dGVudCwgZmQtPmVudHJ5b2Zmc2V0LCBzaXplb2YoaGZzcGx1c19leHRlbnRfcmVjKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9faGZzcGx1c19leHRfY2FjaGVfZXh0ZW50KHN0cnVjdCBoZnNfZmluZF9kYXRhICpmZCwgc3RydWN0IGlub2RlICppbm9kZSwgdTMyIGJsb2NrKQoreworCWludCByZXM7CisKKwlpZiAoSEZTUExVU19JKGlub2RlKS5mbGFncyAmIEhGU1BMVVNfRkxHX0VYVF9ESVJUWSkKKwkJX19oZnNwbHVzX2V4dF93cml0ZV9leHRlbnQoaW5vZGUsIGZkKTsKKworCXJlcyA9IF9faGZzcGx1c19leHRfcmVhZF9leHRlbnQoZmQsIEhGU1BMVVNfSShpbm9kZSkuY2FjaGVkX2V4dGVudHMsIGlub2RlLT5pX2lubywKKwkJCQkJYmxvY2ssIEhGU1BMVVNfSVNfUlNSQyhpbm9kZSkgPyBIRlNQTFVTX1RZUEVfUlNSQyA6IEhGU1BMVVNfVFlQRV9EQVRBKTsKKwlpZiAoIXJlcykgeworCQlIRlNQTFVTX0koaW5vZGUpLmNhY2hlZF9zdGFydCA9IGJlMzJfdG9fY3B1KGZkLT5rZXktPmV4dC5zdGFydF9ibG9jayk7CisJCUhGU1BMVVNfSShpbm9kZSkuY2FjaGVkX2Jsb2NrcyA9IGhmc3BsdXNfZXh0X2Jsb2NrX2NvdW50KEhGU1BMVVNfSShpbm9kZSkuY2FjaGVkX2V4dGVudHMpOworCX0gZWxzZSB7CisJCUhGU1BMVVNfSShpbm9kZSkuY2FjaGVkX3N0YXJ0ID0gSEZTUExVU19JKGlub2RlKS5jYWNoZWRfYmxvY2tzID0gMDsKKwkJSEZTUExVU19JKGlub2RlKS5mbGFncyAmPSB+KEhGU1BMVVNfRkxHX0VYVF9ESVJUWSB8IEhGU1BMVVNfRkxHX0VYVF9ORVcpOworCX0KKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IGhmc3BsdXNfZXh0X3JlYWRfZXh0ZW50KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHUzMiBibG9jaykKK3sKKwlzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSBmZDsKKwlpbnQgcmVzOworCisJaWYgKGJsb2NrID49IEhGU1BMVVNfSShpbm9kZSkuY2FjaGVkX3N0YXJ0ICYmCisJICAgIGJsb2NrIDwgSEZTUExVU19JKGlub2RlKS5jYWNoZWRfc3RhcnQgKyBIRlNQTFVTX0koaW5vZGUpLmNhY2hlZF9ibG9ja3MpCisJCXJldHVybiAwOworCisJaGZzX2ZpbmRfaW5pdChIRlNQTFVTX1NCKGlub2RlLT5pX3NiKS5leHRfdHJlZSwgJmZkKTsKKwlyZXMgPSBfX2hmc3BsdXNfZXh0X2NhY2hlX2V4dGVudCgmZmQsIGlub2RlLCBibG9jayk7CisJaGZzX2ZpbmRfZXhpdCgmZmQpOworCXJldHVybiByZXM7Cit9CisKKy8qIEdldCBhIGJsb2NrIGF0IGlibG9jayBmb3IgaW5vZGUsIHBvc3NpYmx5IGFsbG9jYXRpbmcgaWYgY3JlYXRlICovCitpbnQgaGZzcGx1c19nZXRfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgaWJsb2NrLAorCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCWludCByZXMgPSAtRUlPOworCXUzMiBhYmxvY2ssIGRibG9jaywgbWFzazsKKwlpbnQgc2hpZnQ7CisKKwlzYiA9IGlub2RlLT5pX3NiOworCisJLyogQ29udmVydCBpbm9kZSBibG9jayB0byBkaXNrIGFsbG9jYXRpb24gYmxvY2sgKi8KKwlzaGlmdCA9IEhGU1BMVVNfU0Ioc2IpLmFsbG9jX2Jsa3N6X3NoaWZ0IC0gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJYWJsb2NrID0gaWJsb2NrID4+IEhGU1BMVVNfU0Ioc2IpLmZzX3NoaWZ0OworCisJaWYgKGlibG9jayA+PSBIRlNQTFVTX0koaW5vZGUpLmZzX2Jsb2NrcykgeworCQlpZiAoaWJsb2NrID4gSEZTUExVU19JKGlub2RlKS5mc19ibG9ja3MgfHwgIWNyZWF0ZSkKKwkJCXJldHVybiAtRUlPOworCQlpZiAoYWJsb2NrID49IEhGU1BMVVNfSShpbm9kZSkuYWxsb2NfYmxvY2tzKSB7CisJCQlyZXMgPSBoZnNwbHVzX2ZpbGVfZXh0ZW5kKGlub2RlKTsKKwkJCWlmIChyZXMpCisJCQkJcmV0dXJuIHJlczsKKwkJfQorCX0gZWxzZQorCQljcmVhdGUgPSAwOworCisJaWYgKGFibG9jayA8IEhGU1BMVVNfSShpbm9kZSkuZmlyc3RfYmxvY2tzKSB7CisJCWRibG9jayA9IGhmc3BsdXNfZXh0X2ZpbmRfYmxvY2soSEZTUExVU19JKGlub2RlKS5maXJzdF9leHRlbnRzLCBhYmxvY2spOworCQlnb3RvIGRvbmU7CisJfQorCisJZG93bigmSEZTUExVU19JKGlub2RlKS5leHRlbnRzX2xvY2spOworCXJlcyA9IGhmc3BsdXNfZXh0X3JlYWRfZXh0ZW50KGlub2RlLCBhYmxvY2spOworCWlmICghcmVzKSB7CisJCWRibG9jayA9IGhmc3BsdXNfZXh0X2ZpbmRfYmxvY2soSEZTUExVU19JKGlub2RlKS5jYWNoZWRfZXh0ZW50cywgYWJsb2NrIC0KKwkJCQkJICAgICBIRlNQTFVTX0koaW5vZGUpLmNhY2hlZF9zdGFydCk7CisJfSBlbHNlIHsKKwkJdXAoJkhGU1BMVVNfSShpbm9kZSkuZXh0ZW50c19sb2NrKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXVwKCZIRlNQTFVTX0koaW5vZGUpLmV4dGVudHNfbG9jayk7CisKK2RvbmU6CisJZHByaW50KERCR19FWFRFTlQsICJnZXRfYmxvY2soJWx1KTogJWxsdSAtICV1XG4iLCBpbm9kZS0+aV9pbm8sIChsb25nIGxvbmcpaWJsb2NrLCBkYmxvY2spOworCW1hc2sgPSAoMSA8PCBIRlNQTFVTX1NCKHNiKS5mc19zaGlmdCkgLSAxOworCW1hcF9iaChiaF9yZXN1bHQsIHNiLCAoZGJsb2NrIDw8IEhGU1BMVVNfU0Ioc2IpLmZzX3NoaWZ0KSArIEhGU1BMVVNfU0Ioc2IpLmJsb2Nrb2Zmc2V0ICsgKGlibG9jayAmIG1hc2spKTsKKwlpZiAoY3JlYXRlKSB7CisJCXNldF9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7CisJCUhGU1BMVVNfSShpbm9kZSkucGh5c19zaXplICs9IHNiLT5zX2Jsb2Nrc2l6ZTsKKwkJSEZTUExVU19JKGlub2RlKS5mc19ibG9ja3MrKzsKKwkJaW5vZGVfYWRkX2J5dGVzKGlub2RlLCBzYi0+c19ibG9ja3NpemUpOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGhmc3BsdXNfZHVtcF9leHRlbnQoc3RydWN0IGhmc3BsdXNfZXh0ZW50ICpleHRlbnQpCit7CisJaW50IGk7CisKKwlkcHJpbnQoREJHX0VYVEVOVCwgIiAgICIpOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCWRwcmludChEQkdfRVhURU5ULCAiICV1OiV1IiwgYmUzMl90b19jcHUoZXh0ZW50W2ldLnN0YXJ0X2Jsb2NrKSwKKwkJCQkgYmUzMl90b19jcHUoZXh0ZW50W2ldLmJsb2NrX2NvdW50KSk7CisJZHByaW50KERCR19FWFRFTlQsICJcbiIpOworfQorCitzdGF0aWMgaW50IGhmc3BsdXNfYWRkX2V4dGVudChzdHJ1Y3QgaGZzcGx1c19leHRlbnQgKmV4dGVudCwgdTMyIG9mZnNldCwKKwkJCSAgICAgIHUzMiBhbGxvY19ibG9jaywgdTMyIGJsb2NrX2NvdW50KQoreworCXUzMiBjb3VudCwgc3RhcnQ7CisJaW50IGk7CisKKwloZnNwbHVzX2R1bXBfZXh0ZW50KGV4dGVudCk7CisJZm9yIChpID0gMDsgaSA8IDg7IGV4dGVudCsrLCBpKyspIHsKKwkJY291bnQgPSBiZTMyX3RvX2NwdShleHRlbnQtPmJsb2NrX2NvdW50KTsKKwkJaWYgKG9mZnNldCA9PSBjb3VudCkgeworCQkJc3RhcnQgPSBiZTMyX3RvX2NwdShleHRlbnQtPnN0YXJ0X2Jsb2NrKTsKKwkJCWlmIChhbGxvY19ibG9jayAhPSBzdGFydCArIGNvdW50KSB7CisJCQkJaWYgKCsraSA+PSA4KQorCQkJCQlyZXR1cm4gLUVOT1NQQzsKKwkJCQlleHRlbnQrKzsKKwkJCQlleHRlbnQtPnN0YXJ0X2Jsb2NrID0gY3B1X3RvX2JlMzIoYWxsb2NfYmxvY2spOworCQkJfSBlbHNlCisJCQkJYmxvY2tfY291bnQgKz0gY291bnQ7CisJCQlleHRlbnQtPmJsb2NrX2NvdW50ID0gY3B1X3RvX2JlMzIoYmxvY2tfY291bnQpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAob2Zmc2V0IDwgY291bnQpCisJCQlicmVhazsKKwkJb2Zmc2V0IC09IGNvdW50OworCX0KKwkvKiBwYW5pYz8gKi8KKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCBoZnNwbHVzX2ZyZWVfZXh0ZW50cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCXN0cnVjdCBoZnNwbHVzX2V4dGVudCAqZXh0ZW50LAorCQkJCXUzMiBvZmZzZXQsIHUzMiBibG9ja19ucikKK3sKKwl1MzIgY291bnQsIHN0YXJ0OworCWludCBpOworCisJaGZzcGx1c19kdW1wX2V4dGVudChleHRlbnQpOworCWZvciAoaSA9IDA7IGkgPCA4OyBleHRlbnQrKywgaSsrKSB7CisJCWNvdW50ID0gYmUzMl90b19jcHUoZXh0ZW50LT5ibG9ja19jb3VudCk7CisJCWlmIChvZmZzZXQgPT0gY291bnQpCisJCQlnb3RvIGZvdW5kOworCQllbHNlIGlmIChvZmZzZXQgPCBjb3VudCkKKwkJCWJyZWFrOworCQlvZmZzZXQgLT0gY291bnQ7CisJfQorCS8qIHBhbmljPyAqLworCXJldHVybiAtRUlPOworZm91bmQ6CisJZm9yICg7OykgeworCQlzdGFydCA9IGJlMzJfdG9fY3B1KGV4dGVudC0+c3RhcnRfYmxvY2spOworCQlpZiAoY291bnQgPD0gYmxvY2tfbnIpIHsKKwkJCWhmc3BsdXNfYmxvY2tfZnJlZShzYiwgc3RhcnQsIGNvdW50KTsKKwkJCWV4dGVudC0+YmxvY2tfY291bnQgPSAwOworCQkJZXh0ZW50LT5zdGFydF9ibG9jayA9IDA7CisJCQlibG9ja19uciAtPSBjb3VudDsKKwkJfSBlbHNlIHsKKwkJCWNvdW50IC09IGJsb2NrX25yOworCQkJaGZzcGx1c19ibG9ja19mcmVlKHNiLCBzdGFydCArIGNvdW50LCBibG9ja19ucik7CisJCQlleHRlbnQtPmJsb2NrX2NvdW50ID0gY3B1X3RvX2JlMzIoY291bnQpOworCQkJYmxvY2tfbnIgPSAwOworCQl9CisJCWlmICghYmxvY2tfbnIgfHwgIWkpCisJCQlyZXR1cm4gMDsKKwkJaS0tOworCQlleHRlbnQtLTsKKwkJY291bnQgPSBiZTMyX3RvX2NwdShleHRlbnQtPmJsb2NrX2NvdW50KTsKKwl9Cit9CisKK2ludCBoZnNwbHVzX2ZyZWVfZm9yayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1MzIgY25pZCwgc3RydWN0IGhmc3BsdXNfZm9ya19yYXcgKmZvcmssIGludCB0eXBlKQoreworCXN0cnVjdCBoZnNfZmluZF9kYXRhIGZkOworCWhmc3BsdXNfZXh0ZW50X3JlYyBleHRfZW50cnk7CisJdTMyIHRvdGFsX2Jsb2NrcywgYmxvY2tzLCBzdGFydDsKKwlpbnQgcmVzLCBpOworCisJdG90YWxfYmxvY2tzID0gYmUzMl90b19jcHUoZm9yay0+dG90YWxfYmxvY2tzKTsKKwlpZiAoIXRvdGFsX2Jsb2NrcykKKwkJcmV0dXJuIDA7CisKKwlibG9ja3MgPSAwOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCWJsb2NrcyArPSBiZTMyX3RvX2NwdShmb3JrLT5leHRlbnRzW2ldLmJsb2NrX2NvdW50KTsKKworCXJlcyA9IGhmc3BsdXNfZnJlZV9leHRlbnRzKHNiLCBmb3JrLT5leHRlbnRzLCBibG9ja3MsIGJsb2Nrcyk7CisJaWYgKHJlcykKKwkJcmV0dXJuIHJlczsKKwlpZiAodG90YWxfYmxvY2tzID09IGJsb2NrcykKKwkJcmV0dXJuIDA7CisKKwloZnNfZmluZF9pbml0KEhGU1BMVVNfU0Ioc2IpLmV4dF90cmVlLCAmZmQpOworCWRvIHsKKwkJcmVzID0gX19oZnNwbHVzX2V4dF9yZWFkX2V4dGVudCgmZmQsIGV4dF9lbnRyeSwgY25pZCwKKwkJCQkJCXRvdGFsX2Jsb2NrcywgdHlwZSk7CisJCWlmIChyZXMpCisJCQlicmVhazsKKwkJc3RhcnQgPSBiZTMyX3RvX2NwdShmZC5rZXktPmV4dC5zdGFydF9ibG9jayk7CisJCWhmc3BsdXNfZnJlZV9leHRlbnRzKHNiLCBleHRfZW50cnksCisJCQkJICAgICB0b3RhbF9ibG9ja3MgLSBzdGFydCwKKwkJCQkgICAgIHRvdGFsX2Jsb2Nrcyk7CisJCWhmc19icmVjX3JlbW92ZSgmZmQpOworCQl0b3RhbF9ibG9ja3MgPSBzdGFydDsKKwl9IHdoaWxlICh0b3RhbF9ibG9ja3MgPiBibG9ja3MpOworCWhmc19maW5kX2V4aXQoJmZkKTsKKworCXJldHVybiByZXM7Cit9CisKK2ludCBoZnNwbHVzX2ZpbGVfZXh0ZW5kKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXUzMiBzdGFydCwgbGVuLCBnb2FsOworCWludCByZXM7CisKKwlpZiAoSEZTUExVU19TQihzYikuYWxsb2NfZmlsZS0+aV9zaXplICogOCA8IEhGU1BMVVNfU0Ioc2IpLnRvdGFsX2Jsb2NrcyAtIEhGU1BMVVNfU0Ioc2IpLmZyZWVfYmxvY2tzICsgOCkgeworCQkvLyBleHRlbmQgYWxsb2MgZmlsZQorCQlwcmludGsoImV4dGVuZCBhbGxvYyBmaWxlISAoJUx1LCV1LCV1KVxuIiwgSEZTUExVU19TQihzYikuYWxsb2NfZmlsZS0+aV9zaXplICogOCwKKwkJCUhGU1BMVVNfU0Ioc2IpLnRvdGFsX2Jsb2NrcywgSEZTUExVU19TQihzYikuZnJlZV9ibG9ja3MpOworCQlyZXR1cm4gLUVOT1NQQzsKKwkJLy9CVUcoKTsKKwl9CisKKwlkb3duKCZIRlNQTFVTX0koaW5vZGUpLmV4dGVudHNfbG9jayk7CisJaWYgKEhGU1BMVVNfSShpbm9kZSkuYWxsb2NfYmxvY2tzID09IEhGU1BMVVNfSShpbm9kZSkuZmlyc3RfYmxvY2tzKQorCQlnb2FsID0gaGZzcGx1c19leHRfbGFzdGJsb2NrKEhGU1BMVVNfSShpbm9kZSkuZmlyc3RfZXh0ZW50cyk7CisJZWxzZSB7CisJCXJlcyA9IGhmc3BsdXNfZXh0X3JlYWRfZXh0ZW50KGlub2RlLCBIRlNQTFVTX0koaW5vZGUpLmFsbG9jX2Jsb2Nrcyk7CisJCWlmIChyZXMpCisJCQlnb3RvIG91dDsKKwkJZ29hbCA9IGhmc3BsdXNfZXh0X2xhc3RibG9jayhIRlNQTFVTX0koaW5vZGUpLmNhY2hlZF9leHRlbnRzKTsKKwl9CisKKwlsZW4gPSBIRlNQTFVTX0koaW5vZGUpLmNsdW1wX2Jsb2NrczsKKwlzdGFydCA9IGhmc3BsdXNfYmxvY2tfYWxsb2NhdGUoc2IsIEhGU1BMVVNfU0Ioc2IpLnRvdGFsX2Jsb2NrcywgZ29hbCwgJmxlbik7CisJaWYgKHN0YXJ0ID49IEhGU1BMVVNfU0Ioc2IpLnRvdGFsX2Jsb2NrcykgeworCQlzdGFydCA9IGhmc3BsdXNfYmxvY2tfYWxsb2NhdGUoc2IsIGdvYWwsIDAsICZsZW4pOworCQlpZiAoc3RhcnQgPj0gZ29hbCkgeworCQkJcmVzID0gLUVOT1NQQzsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJZHByaW50KERCR19FWFRFTlQsICJleHRlbmQgJWx1OiAldSwldVxuIiwgaW5vZGUtPmlfaW5vLCBzdGFydCwgbGVuKTsKKwlpZiAoSEZTUExVU19JKGlub2RlKS5hbGxvY19ibG9ja3MgPD0gSEZTUExVU19JKGlub2RlKS5maXJzdF9ibG9ja3MpIHsKKwkJaWYgKCFIRlNQTFVTX0koaW5vZGUpLmZpcnN0X2Jsb2NrcykgeworCQkJZHByaW50KERCR19FWFRFTlQsICJmaXJzdCBleHRlbnRzXG4iKTsKKwkJCS8qIG5vIGV4dGVudHMgeWV0ICovCisJCQlIRlNQTFVTX0koaW5vZGUpLmZpcnN0X2V4dGVudHNbMF0uc3RhcnRfYmxvY2sgPSBjcHVfdG9fYmUzMihzdGFydCk7CisJCQlIRlNQTFVTX0koaW5vZGUpLmZpcnN0X2V4dGVudHNbMF0uYmxvY2tfY291bnQgPSBjcHVfdG9fYmUzMihsZW4pOworCQkJcmVzID0gMDsKKwkJfSBlbHNlIHsKKwkJCS8qIHRyeSB0byBhcHBlbmQgdG8gZXh0ZW50cyBpbiBpbm9kZSAqLworCQkJcmVzID0gaGZzcGx1c19hZGRfZXh0ZW50KEhGU1BMVVNfSShpbm9kZSkuZmlyc3RfZXh0ZW50cywKKwkJCQkJCSBIRlNQTFVTX0koaW5vZGUpLmFsbG9jX2Jsb2NrcywKKwkJCQkJCSBzdGFydCwgbGVuKTsKKwkJCWlmIChyZXMgPT0gLUVOT1NQQykKKwkJCQlnb3RvIGluc2VydF9leHRlbnQ7CisJCX0KKwkJaWYgKCFyZXMpIHsKKwkJCWhmc3BsdXNfZHVtcF9leHRlbnQoSEZTUExVU19JKGlub2RlKS5maXJzdF9leHRlbnRzKTsKKwkJCUhGU1BMVVNfSShpbm9kZSkuZmlyc3RfYmxvY2tzICs9IGxlbjsKKwkJfQorCX0gZWxzZSB7CisJCXJlcyA9IGhmc3BsdXNfYWRkX2V4dGVudChIRlNQTFVTX0koaW5vZGUpLmNhY2hlZF9leHRlbnRzLAorCQkJCQkgSEZTUExVU19JKGlub2RlKS5hbGxvY19ibG9ja3MgLQorCQkJCQkgSEZTUExVU19JKGlub2RlKS5jYWNoZWRfc3RhcnQsCisJCQkJCSBzdGFydCwgbGVuKTsKKwkJaWYgKCFyZXMpIHsKKwkJCWhmc3BsdXNfZHVtcF9leHRlbnQoSEZTUExVU19JKGlub2RlKS5jYWNoZWRfZXh0ZW50cyk7CisJCQlIRlNQTFVTX0koaW5vZGUpLmZsYWdzIHw9IEhGU1BMVVNfRkxHX0VYVF9ESVJUWTsKKwkJCUhGU1BMVVNfSShpbm9kZSkuY2FjaGVkX2Jsb2NrcyArPSBsZW47CisJCX0gZWxzZSBpZiAocmVzID09IC1FTk9TUEMpCisJCQlnb3RvIGluc2VydF9leHRlbnQ7CisJfQorb3V0OgorCXVwKCZIRlNQTFVTX0koaW5vZGUpLmV4dGVudHNfbG9jayk7CisJaWYgKCFyZXMpIHsKKwkJSEZTUExVU19JKGlub2RlKS5hbGxvY19ibG9ja3MgKz0gbGVuOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwl9CisJcmV0dXJuIHJlczsKKworaW5zZXJ0X2V4dGVudDoKKwlkcHJpbnQoREJHX0VYVEVOVCwgImluc2VydCBuZXcgZXh0ZW50XG4iKTsKKwloZnNwbHVzX2V4dF93cml0ZV9leHRlbnQoaW5vZGUpOworCisJbWVtc2V0KEhGU1BMVVNfSShpbm9kZSkuY2FjaGVkX2V4dGVudHMsIDAsIHNpemVvZihoZnNwbHVzX2V4dGVudF9yZWMpKTsKKwlIRlNQTFVTX0koaW5vZGUpLmNhY2hlZF9leHRlbnRzWzBdLnN0YXJ0X2Jsb2NrID0gY3B1X3RvX2JlMzIoc3RhcnQpOworCUhGU1BMVVNfSShpbm9kZSkuY2FjaGVkX2V4dGVudHNbMF0uYmxvY2tfY291bnQgPSBjcHVfdG9fYmUzMihsZW4pOworCWhmc3BsdXNfZHVtcF9leHRlbnQoSEZTUExVU19JKGlub2RlKS5jYWNoZWRfZXh0ZW50cyk7CisJSEZTUExVU19JKGlub2RlKS5mbGFncyB8PSBIRlNQTFVTX0ZMR19FWFRfRElSVFkgfCBIRlNQTFVTX0ZMR19FWFRfTkVXOworCUhGU1BMVVNfSShpbm9kZSkuY2FjaGVkX3N0YXJ0ID0gSEZTUExVU19JKGlub2RlKS5hbGxvY19ibG9ja3M7CisJSEZTUExVU19JKGlub2RlKS5jYWNoZWRfYmxvY2tzID0gbGVuOworCisJcmVzID0gMDsKKwlnb3RvIG91dDsKK30KKwordm9pZCBoZnNwbHVzX2ZpbGVfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IGhmc19maW5kX2RhdGEgZmQ7CisJdTMyIGFsbG9jX2NudCwgYmxrX2NudCwgc3RhcnQ7CisJaW50IHJlczsKKworCWRwcmludChEQkdfSU5PREUsICJ0cnVuY2F0ZTogJWx1LCAlTHUgLT4gJUx1XG4iLCBpbm9kZS0+aV9pbm8sCisJICAgICAgIChsb25nIGxvbmcpSEZTUExVU19JKGlub2RlKS5waHlzX3NpemUsIGlub2RlLT5pX3NpemUpOworCWlmIChpbm9kZS0+aV9zaXplID4gSEZTUExVU19JKGlub2RlKS5waHlzX3NpemUpIHsKKwkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwkJdTMyIHNpemUgPSBpbm9kZS0+aV9zaXplIC0gMTsKKwkJaW50IHJlczsKKworCQlwYWdlID0gZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsIHNpemUgPj4gUEFHRV9DQUNIRV9TSElGVCk7CisJCWlmICghcGFnZSkKKwkJCXJldHVybjsKKwkJc2l6ZSAmPSBQQUdFX0NBQ0hFX1NJWkUgLSAxOworCQlzaXplKys7CisJCXJlcyA9IG1hcHBpbmctPmFfb3BzLT5wcmVwYXJlX3dyaXRlKE5VTEwsIHBhZ2UsIHNpemUsIHNpemUpOworCQlpZiAoIXJlcykKKwkJCXJlcyA9IG1hcHBpbmctPmFfb3BzLT5jb21taXRfd3JpdGUoTlVMTCwgcGFnZSwgc2l6ZSwgc2l6ZSk7CisJCWlmIChyZXMpCisJCQlpbm9kZS0+aV9zaXplID0gSEZTUExVU19JKGlub2RlKS5waHlzX3NpemU7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQlyZXR1cm47CisJfQorCWJsa19jbnQgPSAoaW5vZGUtPmlfc2l6ZSArIEhGU1BMVVNfU0Ioc2IpLmFsbG9jX2Jsa3N6IC0gMSkgPj4gSEZTUExVU19TQihzYikuYWxsb2NfYmxrc3pfc2hpZnQ7CisJYWxsb2NfY250ID0gSEZTUExVU19JKGlub2RlKS5hbGxvY19ibG9ja3M7CisJaWYgKGJsa19jbnQgPT0gYWxsb2NfY250KQorCQlnb3RvIG91dDsKKworCWRvd24oJkhGU1BMVVNfSShpbm9kZSkuZXh0ZW50c19sb2NrKTsKKwloZnNfZmluZF9pbml0KEhGU1BMVVNfU0Ioc2IpLmV4dF90cmVlLCAmZmQpOworCXdoaWxlICgxKSB7CisJCWlmIChhbGxvY19jbnQgPT0gSEZTUExVU19JKGlub2RlKS5maXJzdF9ibG9ja3MpIHsKKwkJCWhmc3BsdXNfZnJlZV9leHRlbnRzKHNiLCBIRlNQTFVTX0koaW5vZGUpLmZpcnN0X2V4dGVudHMsCisJCQkJCSAgICAgYWxsb2NfY250LCBhbGxvY19jbnQgLSBibGtfY250KTsKKwkJCWhmc3BsdXNfZHVtcF9leHRlbnQoSEZTUExVU19JKGlub2RlKS5maXJzdF9leHRlbnRzKTsKKwkJCUhGU1BMVVNfSShpbm9kZSkuZmlyc3RfYmxvY2tzID0gYmxrX2NudDsKKwkJCWJyZWFrOworCQl9CisJCXJlcyA9IF9faGZzcGx1c19leHRfY2FjaGVfZXh0ZW50KCZmZCwgaW5vZGUsIGFsbG9jX2NudCk7CisJCWlmIChyZXMpCisJCQlicmVhazsKKwkJc3RhcnQgPSBIRlNQTFVTX0koaW5vZGUpLmNhY2hlZF9zdGFydDsKKwkJaGZzcGx1c19mcmVlX2V4dGVudHMoc2IsIEhGU1BMVVNfSShpbm9kZSkuY2FjaGVkX2V4dGVudHMsCisJCQkJICAgICBhbGxvY19jbnQgLSBzdGFydCwgYWxsb2NfY250IC0gYmxrX2NudCk7CisJCWhmc3BsdXNfZHVtcF9leHRlbnQoSEZTUExVU19JKGlub2RlKS5jYWNoZWRfZXh0ZW50cyk7CisJCWlmIChibGtfY250ID4gc3RhcnQpIHsKKwkJCUhGU1BMVVNfSShpbm9kZSkuZmxhZ3MgfD0gSEZTUExVU19GTEdfRVhUX0RJUlRZOworCQkJYnJlYWs7CisJCX0KKwkJYWxsb2NfY250ID0gc3RhcnQ7CisJCUhGU1BMVVNfSShpbm9kZSkuY2FjaGVkX3N0YXJ0ID0gSEZTUExVU19JKGlub2RlKS5jYWNoZWRfYmxvY2tzID0gMDsKKwkJSEZTUExVU19JKGlub2RlKS5mbGFncyAmPSB+KEhGU1BMVVNfRkxHX0VYVF9ESVJUWSB8IEhGU1BMVVNfRkxHX0VYVF9ORVcpOworCQloZnNfYnJlY19yZW1vdmUoJmZkKTsKKwl9CisJaGZzX2ZpbmRfZXhpdCgmZmQpOworCXVwKCZIRlNQTFVTX0koaW5vZGUpLmV4dGVudHNfbG9jayk7CisKKwlIRlNQTFVTX0koaW5vZGUpLmFsbG9jX2Jsb2NrcyA9IGJsa19jbnQ7CitvdXQ6CisJSEZTUExVU19JKGlub2RlKS5waHlzX3NpemUgPSBpbm9kZS0+aV9zaXplOworCUhGU1BMVVNfSShpbm9kZSkuZnNfYmxvY2tzID0gKGlub2RlLT5pX3NpemUgKyBzYi0+c19ibG9ja3NpemUgLSAxKSA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKKwlpbm9kZV9zZXRfYnl0ZXMoaW5vZGUsIEhGU1BMVVNfSShpbm9kZSkuZnNfYmxvY2tzIDw8IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvaGZzcGx1c19mcy5oIGIvZnMvaGZzcGx1cy9oZnNwbHVzX2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMzMDk0YQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmc3BsdXMvaGZzcGx1c19mcy5oCkBAIC0wLDAgKzEsNDE0IEBACisvKgorICogIGxpbnV4L2luY2x1ZGUvbGludXgvaGZzcGx1c19mcy5oCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5CisgKiBCcmFkIEJveWVyIChmbGFyQHBhbnRzLm51KQorICogKEMpIDIwMDMgQXJkaXMgVGVjaG5vbG9naWVzIDxyb21hbkBhcmRpc3RlY2guY29tPgorICoKKyAqLworCisjaWZuZGVmIF9MSU5VWF9IRlNQTFVTX0ZTX0gKKyNkZWZpbmUgX0xJTlVYX0hGU1BMVVNfRlNfSAorCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlICJoZnNwbHVzX3Jhdy5oIgorCisjZGVmaW5lIERCR19CTk9ERV9SRUZTCTB4MDAwMDAwMDEKKyNkZWZpbmUgREJHX0JOT0RFX01PRAkweDAwMDAwMDAyCisjZGVmaW5lIERCR19DQVRfTU9ECTB4MDAwMDAwMDQKKyNkZWZpbmUgREJHX0lOT0RFCTB4MDAwMDAwMDgKKyNkZWZpbmUgREJHX1NVUEVSCTB4MDAwMDAwMTAKKyNkZWZpbmUgREJHX0VYVEVOVAkweDAwMDAwMDIwCisjZGVmaW5lIERCR19CSVRNQVAJMHgwMDAwMDA0MAorCisvLyNkZWZpbmUgREJHX01BU0sJKERCR19FWFRFTlR8REJHX0lOT0RFfERCR19CTk9ERV9NT0QpCisvLyNkZWZpbmUgREJHX01BU0sJKERCR19CTk9ERV9NT0R8REJHX0NBVF9NT0R8REJHX0lOT0RFKQorLy8jZGVmaW5lIERCR19NQVNLCShEQkdfQ0FUX01PRHxEQkdfQk5PREVfUkVGU3xEQkdfSU5PREV8REJHX0VYVEVOVCkKKyNkZWZpbmUgREJHX01BU0sJKDApCisKKyNkZWZpbmUgZHByaW50KGZsZywgZm10LCBhcmdzLi4uKSBcCisJaWYgKGZsZyAmIERCR19NQVNLKSBwcmludGsoZm10ICwgIyMgYXJncykKKworLyogUnVudGltZSBjb25maWcgb3B0aW9ucyAqLworI2RlZmluZSBIRlNQTFVTX0RFRl9DUl9UWVBFICAgIDB4M0YzRjNGM0YgIC8qICc/Pz8/JyAqLworCisjZGVmaW5lIEhGU1BMVVNfVFlQRV9EQVRBIDB4MDAKKyNkZWZpbmUgSEZTUExVU19UWVBFX1JTUkMgMHhGRgorCit0eXBlZGVmIGludCAoKmJ0cmVlX2tleWNtcCkoaGZzcGx1c19idHJlZV9rZXkgKiwgaGZzcGx1c19idHJlZV9rZXkgKik7CisKKyNkZWZpbmUgTk9ERV9IQVNIX1NJWkUJMjU2CisKKy8qIEFuIEhGUysgQlRyZWUgaGVsZCBpbiBtZW1vcnkgKi8KK3N0cnVjdCBoZnNfYnRyZWUgeworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlidHJlZV9rZXljbXAga2V5Y21wOworCisJdTMyIGNuaWQ7CisJdTMyIHJvb3Q7CisJdTMyIGxlYWZfY291bnQ7CisJdTMyIGxlYWZfaGVhZDsKKwl1MzIgbGVhZl90YWlsOworCXUzMiBub2RlX2NvdW50OworCXUzMiBmcmVlX25vZGVzOworCXUzMiBhdHRyaWJ1dGVzOworCisJdW5zaWduZWQgaW50IG5vZGVfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgbm9kZV9zaXplX3NoaWZ0OworCXVuc2lnbmVkIGludCBtYXhfa2V5X2xlbjsKKwl1bnNpZ25lZCBpbnQgZGVwdGg7CisKKwkvL3Vuc2lnbmVkIGludCBtYXAxX3NpemUsIG1hcF9zaXplOworCXN0cnVjdCBzZW1hcGhvcmUgdHJlZV9sb2NrOworCisJdW5zaWduZWQgaW50IHBhZ2VzX3Blcl9ibm9kZTsKKwlzcGlubG9ja190IGhhc2hfbG9jazsKKwlzdHJ1Y3QgaGZzX2Jub2RlICpub2RlX2hhc2hbTk9ERV9IQVNIX1NJWkVdOworCWludCBub2RlX2hhc2hfY250OworfTsKKworc3RydWN0IHBhZ2U7CisKKy8qIEFuIEhGUysgQlRyZWUgbm9kZSBpbiBtZW1vcnkgKi8KK3N0cnVjdCBoZnNfYm5vZGUgeworCXN0cnVjdCBoZnNfYnRyZWUgKnRyZWU7CisKKwl1MzIgcHJldjsKKwl1MzIgdGhpczsKKwl1MzIgbmV4dDsKKwl1MzIgcGFyZW50OworCisJdTE2IG51bV9yZWNzOworCXU4IHR5cGU7CisJdTggaGVpZ2h0OworCisJc3RydWN0IGhmc19ibm9kZSAqbmV4dF9oYXNoOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJd2FpdF9xdWV1ZV9oZWFkX3QgbG9ja193cTsKKwlhdG9taWNfdCByZWZjbnQ7CisJdW5zaWduZWQgaW50IHBhZ2Vfb2Zmc2V0OworCXN0cnVjdCBwYWdlICpwYWdlWzBdOworfTsKKworI2RlZmluZSBIRlNfQk5PREVfTE9DSwkJMAorI2RlZmluZSBIRlNfQk5PREVfRVJST1IJCTEKKyNkZWZpbmUgSEZTX0JOT0RFX05FVwkJMgorI2RlZmluZSBIRlNfQk5PREVfRElSVFkJCTMKKyNkZWZpbmUgSEZTX0JOT0RFX0RFTEVURUQJNAorCisvKgorICogSEZTKyBzdXBlcmJsb2NrIGluZm8gKGJ1aWx0IGZyb20gVm9sdW1lIEhlYWRlciBvbiBkaXNrKQorICovCisKK3N0cnVjdCBoZnNwbHVzX3ZoOworc3RydWN0IGhmc19idHJlZTsKKworc3RydWN0IGhmc3BsdXNfc2JfaW5mbyB7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpzX3ZoYmg7CisJc3RydWN0IGhmc3BsdXNfdmggKnNfdmhkcjsKKwlzdHJ1Y3QgaGZzX2J0cmVlICpleHRfdHJlZTsKKwlzdHJ1Y3QgaGZzX2J0cmVlICpjYXRfdHJlZTsKKwlzdHJ1Y3QgaGZzX2J0cmVlICphdHRyX3RyZWU7CisJc3RydWN0IGlub2RlICphbGxvY19maWxlOworCXN0cnVjdCBpbm9kZSAqaGlkZGVuX2RpcjsKKwlzdHJ1Y3QgbmxzX3RhYmxlICpubHM7CisKKwkvKiBSdW50aW1lIHZhcmlhYmxlcyAqLworCXUzMiBibG9ja29mZnNldDsKKwl1MzIgc2VjdF9jb3VudDsKKwlpbnQgZnNfc2hpZnQ7CisKKwkvKiBTdHVmZiBpbiBob3N0IG9yZGVyIGZyb20gVm9sIEhlYWRlciAqLworCXUzMiBhbGxvY19ibGtzejsKKwlpbnQgYWxsb2NfYmxrc3pfc2hpZnQ7CisJdTMyIHRvdGFsX2Jsb2NrczsKKwl1MzIgZnJlZV9ibG9ja3M7CisJdTMyIG5leHRfYWxsb2M7CisJdTMyIG5leHRfY25pZDsKKwl1MzIgZmlsZV9jb3VudDsKKwl1MzIgZm9sZGVyX2NvdW50OworCXUzMiBkYXRhX2NsdW1wX2Jsb2NrcywgcnNyY19jbHVtcF9ibG9ja3M7CisKKwkvKiBDb25maWcgb3B0aW9ucyAqLworCXUzMiBjcmVhdG9yOworCXUzMiB0eXBlOworCisJdW1vZGVfdCB1bWFzazsKKwl1aWRfdCB1aWQ7CisJZ2lkX3QgZ2lkOworCisJaW50IHBhcnQsIHNlc3Npb247CisKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJYXRvbWljX3QgaW5vZGVfY250OworCXUzMiBsYXN0X2lub2RlX2NudDsKKworCXN0cnVjdCBobGlzdF9oZWFkIHJzcmNfaW5vZGVzOworfTsKKworI2RlZmluZSBIRlNQTFVTX1NCX1dSSVRFQkFDS1VQCTB4MDAwMQorI2RlZmluZSBIRlNQTFVTX1NCX05PREVDT01QT1NFCTB4MDAwMgorCisKK3N0cnVjdCBoZnNwbHVzX2lub2RlX2luZm8geworCXN0cnVjdCBzZW1hcGhvcmUgZXh0ZW50c19sb2NrOworCXUzMiBjbHVtcF9ibG9ja3MsIGFsbG9jX2Jsb2NrczsKKwlzZWN0b3JfdCBmc19ibG9ja3M7CisJLyogQWxsb2NhdGlvbiBleHRlbnRzIGZyb20gY2F0YWxvZyByZWNvcmQgb3Igdm9sdW1lIGhlYWRlciAqLworCWhmc3BsdXNfZXh0ZW50X3JlYyBmaXJzdF9leHRlbnRzOworCXUzMiBmaXJzdF9ibG9ja3M7CisJaGZzcGx1c19leHRlbnRfcmVjIGNhY2hlZF9leHRlbnRzOworCXUzMiBjYWNoZWRfc3RhcnQsIGNhY2hlZF9ibG9ja3M7CisJYXRvbWljX3Qgb3BlbmNudDsKKworCXN0cnVjdCBpbm9kZSAqcnNyY19pbm9kZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogRGV2aWNlIG51bWJlciBpbiBoZnNwbHVzX3Blcm1pc3Npb25zIGluIGNhdGFsb2cgKi8KKwl1MzIgZGV2OworCS8qIEJTRCBzeXN0ZW0gYW5kIHVzZXIgZmlsZSBmbGFncyAqLworCXU4IHJvb3RmbGFnczsKKwl1OCB1c2VyZmxhZ3M7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIG9wZW5fZGlyX2xpc3Q7CisJbG9mZl90IHBoeXNfc2l6ZTsKKwlzdHJ1Y3QgaW5vZGUgdmZzX2lub2RlOworfTsKKworI2RlZmluZSBIRlNQTFVTX0ZMR19SU1JDCTB4MDAwMQorI2RlZmluZSBIRlNQTFVTX0ZMR19FWFRfRElSVFkJMHgwMDAyCisjZGVmaW5lIEhGU1BMVVNfRkxHX0VYVF9ORVcJMHgwMDA0CisKKyNkZWZpbmUgSEZTUExVU19JU19EQVRBKGlub2RlKSAgICghKEhGU1BMVVNfSShpbm9kZSkuZmxhZ3MgJiBIRlNQTFVTX0ZMR19SU1JDKSkKKyNkZWZpbmUgSEZTUExVU19JU19SU1JDKGlub2RlKSAgIChIRlNQTFVTX0koaW5vZGUpLmZsYWdzICYgSEZTUExVU19GTEdfUlNSQykKKworc3RydWN0IGhmc19maW5kX2RhdGEgeworCS8qIGZpbGxlZCBieSBjYWxsZXIgKi8KKwloZnNwbHVzX2J0cmVlX2tleSAqc2VhcmNoX2tleTsKKwloZnNwbHVzX2J0cmVlX2tleSAqa2V5OworCS8qIGZpbGxlZCBieSBmaW5kICovCisJc3RydWN0IGhmc19idHJlZSAqdHJlZTsKKwlzdHJ1Y3QgaGZzX2Jub2RlICpibm9kZTsKKwkvKiBmaWxsZWQgYnkgZmluZHJlYyAqLworCWludCByZWNvcmQ7CisJaW50IGtleW9mZnNldCwga2V5bGVuZ3RoOworCWludCBlbnRyeW9mZnNldCwgZW50cnlsZW5ndGg7Cit9OworCitzdHJ1Y3QgaGZzcGx1c19yZWFkZGlyX2RhdGEgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlzdHJ1Y3QgaGZzcGx1c19jYXRfa2V5IGtleTsKK307CisKKyNkZWZpbmUgaGZzX2J0cmVlX29wZW4gaGZzcGx1c19idHJlZV9vcGVuCisjZGVmaW5lIGhmc19idHJlZV9jbG9zZSBoZnNwbHVzX2J0cmVlX2Nsb3NlCisjZGVmaW5lIGhmc19idHJlZV93cml0ZSBoZnNwbHVzX2J0cmVlX3dyaXRlCisjZGVmaW5lIGhmc19ibWFwX2FsbG9jIGhmc3BsdXNfYm1hcF9hbGxvYworI2RlZmluZSBoZnNfYm1hcF9mcmVlIGhmc3BsdXNfYm1hcF9mcmVlCisjZGVmaW5lIGhmc19ibm9kZV9yZWFkIGhmc3BsdXNfYm5vZGVfcmVhZAorI2RlZmluZSBoZnNfYm5vZGVfcmVhZF91MTYgaGZzcGx1c19ibm9kZV9yZWFkX3UxNgorI2RlZmluZSBoZnNfYm5vZGVfcmVhZF91OCBoZnNwbHVzX2Jub2RlX3JlYWRfdTgKKyNkZWZpbmUgaGZzX2Jub2RlX3JlYWRfa2V5IGhmc3BsdXNfYm5vZGVfcmVhZF9rZXkKKyNkZWZpbmUgaGZzX2Jub2RlX3dyaXRlIGhmc3BsdXNfYm5vZGVfd3JpdGUKKyNkZWZpbmUgaGZzX2Jub2RlX3dyaXRlX3UxNiBoZnNwbHVzX2Jub2RlX3dyaXRlX3UxNgorI2RlZmluZSBoZnNfYm5vZGVfY2xlYXIgaGZzcGx1c19ibm9kZV9jbGVhcgorI2RlZmluZSBoZnNfYm5vZGVfY29weSBoZnNwbHVzX2Jub2RlX2NvcHkKKyNkZWZpbmUgaGZzX2Jub2RlX21vdmUgaGZzcGx1c19ibm9kZV9tb3ZlCisjZGVmaW5lIGhmc19ibm9kZV9kdW1wIGhmc3BsdXNfYm5vZGVfZHVtcAorI2RlZmluZSBoZnNfYm5vZGVfdW5saW5rIGhmc3BsdXNfYm5vZGVfdW5saW5rCisjZGVmaW5lIGhmc19ibm9kZV9maW5kaGFzaCBoZnNwbHVzX2Jub2RlX2ZpbmRoYXNoCisjZGVmaW5lIGhmc19ibm9kZV9maW5kIGhmc3BsdXNfYm5vZGVfZmluZAorI2RlZmluZSBoZnNfYm5vZGVfdW5oYXNoIGhmc3BsdXNfYm5vZGVfdW5oYXNoCisjZGVmaW5lIGhmc19ibm9kZV9mcmVlIGhmc3BsdXNfYm5vZGVfZnJlZQorI2RlZmluZSBoZnNfYm5vZGVfY3JlYXRlIGhmc3BsdXNfYm5vZGVfY3JlYXRlCisjZGVmaW5lIGhmc19ibm9kZV9nZXQgaGZzcGx1c19ibm9kZV9nZXQKKyNkZWZpbmUgaGZzX2Jub2RlX3B1dCBoZnNwbHVzX2Jub2RlX3B1dAorI2RlZmluZSBoZnNfYnJlY19sZW5vZmYgaGZzcGx1c19icmVjX2xlbm9mZgorI2RlZmluZSBoZnNfYnJlY19rZXlsZW4gaGZzcGx1c19icmVjX2tleWxlbgorI2RlZmluZSBoZnNfYnJlY19pbnNlcnQgaGZzcGx1c19icmVjX2luc2VydAorI2RlZmluZSBoZnNfYnJlY19yZW1vdmUgaGZzcGx1c19icmVjX3JlbW92ZQorI2RlZmluZSBoZnNfZmluZF9pbml0IGhmc3BsdXNfZmluZF9pbml0CisjZGVmaW5lIGhmc19maW5kX2V4aXQgaGZzcGx1c19maW5kX2V4aXQKKyNkZWZpbmUgX19oZnNfYnJlY19maW5kIF9faHBsdXNmc19icmVjX2ZpbmQKKyNkZWZpbmUgaGZzX2JyZWNfZmluZCBoZnNwbHVzX2JyZWNfZmluZAorI2RlZmluZSBoZnNfYnJlY19yZWFkIGhmc3BsdXNfYnJlY19yZWFkCisjZGVmaW5lIGhmc19icmVjX2dvdG8gaGZzcGx1c19icmVjX2dvdG8KKyNkZWZpbmUgaGZzX3BhcnRfZmluZCBoZnNwbHVzX3BhcnRfZmluZAorCisvKgorICogZGVmaW5pdGlvbnMgZm9yIGV4dDIgZmxhZyBpb2N0bHMgKGxpbnV4IHJlYWxseSBuZWVkcyBhIGdlbmVyaWMKKyAqIGludGVyZmFjZSBmb3IgdGhpcykuCisgKi8KKworLyogZXh0MiBpb2N0bHMgKEVYVDJfSU9DX0dFVEZMQUdTIGFuZCBFWFQyX0lPQ19TRVRGTEFHUykgdG8gc3VwcG9ydAorICogY2hhdHRyL2xzYXR0ciAqLworI2RlZmluZSBIRlNQTFVTX0lPQ19FWFQyX0dFVEZMQUdTCV9JT1IoJ2YnLCAxLCBsb25nKQorI2RlZmluZSBIRlNQTFVTX0lPQ19FWFQyX1NFVEZMQUdTCV9JT1coJ2YnLCAyLCBsb25nKQorCisjZGVmaW5lIEVYVDJfRkxBR19JTU1VVEFCTEUJCTB4MDAwMDAwMTAgLyogSW1tdXRhYmxlIGZpbGUgKi8KKyNkZWZpbmUgRVhUMl9GTEFHX0FQUEVORAkJMHgwMDAwMDAyMCAvKiB3cml0ZXMgdG8gZmlsZSBtYXkgb25seSBhcHBlbmQgKi8KKyNkZWZpbmUgRVhUMl9GTEFHX05PRFVNUAkJMHgwMDAwMDA0MCAvKiBkbyBub3QgZHVtcCBmaWxlICovCisKKworLyoKKyAqIEZ1bmN0aW9ucyBpbiBhbnkgKi5jIHVzZWQgaW4gb3RoZXIgZmlsZXMKKyAqLworCisvKiBiaXRtYXAuYyAqLworaW50IGhmc3BsdXNfYmxvY2tfYWxsb2NhdGUoc3RydWN0IHN1cGVyX2Jsb2NrICosIHUzMiwgdTMyLCB1MzIgKik7CitpbnQgaGZzcGx1c19ibG9ja19mcmVlKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1MzIsIHUzMik7CisKKy8qIGJ0cmVlLmMgKi8KK3N0cnVjdCBoZnNfYnRyZWUgKmhmc19idHJlZV9vcGVuKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1MzIpOwordm9pZCBoZnNfYnRyZWVfY2xvc2Uoc3RydWN0IGhmc19idHJlZSAqKTsKK3ZvaWQgaGZzX2J0cmVlX3dyaXRlKHN0cnVjdCBoZnNfYnRyZWUgKik7CitzdHJ1Y3QgaGZzX2Jub2RlICpoZnNfYm1hcF9hbGxvYyhzdHJ1Y3QgaGZzX2J0cmVlICopOwordm9pZCBoZnNfYm1hcF9mcmVlKHN0cnVjdCBoZnNfYm5vZGUgKik7CisKKy8qIGJub2RlLmMgKi8KK3ZvaWQgaGZzX2Jub2RlX3JlYWQoc3RydWN0IGhmc19ibm9kZSAqLCB2b2lkICosIGludCwgaW50KTsKK3UxNiBoZnNfYm5vZGVfcmVhZF91MTYoc3RydWN0IGhmc19ibm9kZSAqLCBpbnQpOwordTggaGZzX2Jub2RlX3JlYWRfdTgoc3RydWN0IGhmc19ibm9kZSAqLCBpbnQpOwordm9pZCBoZnNfYm5vZGVfcmVhZF9rZXkoc3RydWN0IGhmc19ibm9kZSAqLCB2b2lkICosIGludCk7Cit2b2lkIGhmc19ibm9kZV93cml0ZShzdHJ1Y3QgaGZzX2Jub2RlICosIHZvaWQgKiwgaW50LCBpbnQpOwordm9pZCBoZnNfYm5vZGVfd3JpdGVfdTE2KHN0cnVjdCBoZnNfYm5vZGUgKiwgaW50LCB1MTYpOwordm9pZCBoZnNfYm5vZGVfY2xlYXIoc3RydWN0IGhmc19ibm9kZSAqLCBpbnQsIGludCk7Cit2b2lkIGhmc19ibm9kZV9jb3B5KHN0cnVjdCBoZnNfYm5vZGUgKiwgaW50LAorCQkgICAgc3RydWN0IGhmc19ibm9kZSAqLCBpbnQsIGludCk7Cit2b2lkIGhmc19ibm9kZV9tb3ZlKHN0cnVjdCBoZnNfYm5vZGUgKiwgaW50LCBpbnQsIGludCk7Cit2b2lkIGhmc19ibm9kZV9kdW1wKHN0cnVjdCBoZnNfYm5vZGUgKik7Cit2b2lkIGhmc19ibm9kZV91bmxpbmsoc3RydWN0IGhmc19ibm9kZSAqKTsKK3N0cnVjdCBoZnNfYm5vZGUgKmhmc19ibm9kZV9maW5kaGFzaChzdHJ1Y3QgaGZzX2J0cmVlICosIHUzMik7CitzdHJ1Y3QgaGZzX2Jub2RlICpoZnNfYm5vZGVfZmluZChzdHJ1Y3QgaGZzX2J0cmVlICosIHUzMik7Cit2b2lkIGhmc19ibm9kZV91bmhhc2goc3RydWN0IGhmc19ibm9kZSAqKTsKK3ZvaWQgaGZzX2Jub2RlX2ZyZWUoc3RydWN0IGhmc19ibm9kZSAqKTsKK3N0cnVjdCBoZnNfYm5vZGUgKmhmc19ibm9kZV9jcmVhdGUoc3RydWN0IGhmc19idHJlZSAqLCB1MzIpOwordm9pZCBoZnNfYm5vZGVfZ2V0KHN0cnVjdCBoZnNfYm5vZGUgKik7Cit2b2lkIGhmc19ibm9kZV9wdXQoc3RydWN0IGhmc19ibm9kZSAqKTsKKworLyogYnJlYy5jICovCit1MTYgaGZzX2JyZWNfbGVub2ZmKHN0cnVjdCBoZnNfYm5vZGUgKiwgdTE2LCB1MTYgKik7Cit1MTYgaGZzX2JyZWNfa2V5bGVuKHN0cnVjdCBoZnNfYm5vZGUgKiwgdTE2KTsKK2ludCBoZnNfYnJlY19pbnNlcnQoc3RydWN0IGhmc19maW5kX2RhdGEgKiwgdm9pZCAqLCBpbnQpOworaW50IGhmc19icmVjX3JlbW92ZShzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqKTsKKworLyogYmZpbmQuYyAqLworaW50IGhmc19maW5kX2luaXQoc3RydWN0IGhmc19idHJlZSAqLCBzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqKTsKK3ZvaWQgaGZzX2ZpbmRfZXhpdChzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqKTsKK2ludCBfX2hmc19icmVjX2ZpbmQoc3RydWN0IGhmc19ibm9kZSAqLCBzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqKTsKK2ludCBoZnNfYnJlY19maW5kKHN0cnVjdCBoZnNfZmluZF9kYXRhICopOworaW50IGhmc19icmVjX3JlYWQoc3RydWN0IGhmc19maW5kX2RhdGEgKiwgdm9pZCAqLCBpbnQpOworaW50IGhmc19icmVjX2dvdG8oc3RydWN0IGhmc19maW5kX2RhdGEgKiwgaW50KTsKKworLyogY2F0YWxvZy5jICovCitpbnQgaGZzcGx1c19jYXRfY21wX2tleShoZnNwbHVzX2J0cmVlX2tleSAqLCBoZnNwbHVzX2J0cmVlX2tleSAqKTsKK3ZvaWQgaGZzcGx1c19jYXRfYnVpbGRfa2V5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGhmc3BsdXNfYnRyZWVfa2V5ICosIHUzMiwgc3RydWN0IHFzdHIgKik7CitpbnQgaGZzcGx1c19maW5kX2NhdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdTMyLCBzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqKTsKK2ludCBoZnNwbHVzX2NyZWF0ZV9jYXQodTMyLCBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IHFzdHIgKiwgc3RydWN0IGlub2RlICopOworaW50IGhmc3BsdXNfZGVsZXRlX2NhdCh1MzIsIHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgcXN0ciAqKTsKK2ludCBoZnNwbHVzX3JlbmFtZV9jYXQodTMyLCBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IHFzdHIgKiwKKwkJICAgICAgIHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgcXN0ciAqKTsKKworLyogZXh0ZW50cy5jICovCitpbnQgaGZzcGx1c19leHRfY21wX2tleShoZnNwbHVzX2J0cmVlX2tleSAqLCBoZnNwbHVzX2J0cmVlX2tleSAqKTsKK3ZvaWQgaGZzcGx1c19leHRfd3JpdGVfZXh0ZW50KHN0cnVjdCBpbm9kZSAqKTsKK2ludCBoZnNwbHVzX2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKiwgc2VjdG9yX3QsIHN0cnVjdCBidWZmZXJfaGVhZCAqLCBpbnQpOworaW50IGhmc3BsdXNfZnJlZV9mb3JrKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1MzIsIHN0cnVjdCBoZnNwbHVzX2ZvcmtfcmF3ICosIGludCk7CitpbnQgaGZzcGx1c19maWxlX2V4dGVuZChzdHJ1Y3QgaW5vZGUgKik7Cit2b2lkIGhmc3BsdXNfZmlsZV90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKik7CisKKy8qIGlub2RlLmMgKi8KK2V4dGVybiBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGhmc3BsdXNfYW9wczsKK2V4dGVybiBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGhmc3BsdXNfYnRyZWVfYW9wczsKKwordm9pZCBoZnNwbHVzX2lub2RlX3JlYWRfZm9yayhzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGhmc3BsdXNfZm9ya19yYXcgKik7Cit2b2lkIGhmc3BsdXNfaW5vZGVfd3JpdGVfZm9yayhzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGhmc3BsdXNfZm9ya19yYXcgKik7CitpbnQgaGZzcGx1c19jYXRfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGhmc19maW5kX2RhdGEgKik7CitpbnQgaGZzcGx1c19jYXRfd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICopOworc3RydWN0IGlub2RlICpoZnNwbHVzX25ld19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50KTsKK3ZvaWQgaGZzcGx1c19kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICopOworCisvKiBpb2N0bC5jICovCitpbnQgaGZzcGx1c19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKKwkJICB1bnNpZ25lZCBsb25nIGFyZyk7CitpbnQgaGZzcGx1c19zZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpOworc3NpemVfdCBoZnNwbHVzX2dldHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUpOworc3NpemVfdCBoZnNwbHVzX2xpc3R4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOworCisvKiBvcHRpb25zLmMgKi8KK2ludCBwYXJzZV9vcHRpb25zKGNoYXIgKiwgc3RydWN0IGhmc3BsdXNfc2JfaW5mbyAqKTsKK3ZvaWQgZmlsbF9kZWZhdWx0cyhzdHJ1Y3QgaGZzcGx1c19zYl9pbmZvICopOworCisvKiB0YWJsZXMuYyAqLworZXh0ZXJuIHUxNiBoZnNwbHVzX2Nhc2VfZm9sZF90YWJsZVtdOworZXh0ZXJuIHUxNiBoZnNwbHVzX2RlY29tcG9zZV90YWJsZVtdOworZXh0ZXJuIHUxNiBoZnNwbHVzX2NvbXBvc2VfdGFibGVbXTsKKworLyogdW5pY29kZS5jICovCitpbnQgaGZzcGx1c191bmlzdHJjbXAoY29uc3Qgc3RydWN0IGhmc3BsdXNfdW5pc3RyICosIGNvbnN0IHN0cnVjdCBoZnNwbHVzX3VuaXN0ciAqKTsKK2ludCBoZnNwbHVzX3VuaTJhc2Moc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IHN0cnVjdCBoZnNwbHVzX3VuaXN0ciAqLCBjaGFyICosIGludCAqKTsKK2ludCBoZnNwbHVzX2FzYzJ1bmkoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBoZnNwbHVzX3VuaXN0ciAqLCBjb25zdCBjaGFyICosIGludCk7CisKKy8qIHdyYXBwZXIuYyAqLworaW50IGhmc3BsdXNfcmVhZF93cmFwcGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKKworaW50IGhmc19wYXJ0X2ZpbmQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHNlY3Rvcl90ICosIHNlY3Rvcl90ICopOworCisvKiBhY2Nlc3MgbWFjcm9zICovCisvKgorc3RhdGljIGlubGluZSBzdHJ1Y3QgaGZzcGx1c19zYl9pbmZvICpIRlNQTFVTX1NCKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJcmV0dXJuIHNiLT5zX2ZzX2luZm87Cit9CitzdGF0aWMgaW5saW5lIHN0cnVjdCBoZnNwbHVzX2lub2RlX2luZm8gKkhGU1BMVVNfSShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiBsaXN0X2VudHJ5KGlub2RlLCBzdHJ1Y3QgaGZzcGx1c19pbm9kZV9pbmZvLCB2ZnNfaW5vZGUpOworfQorKi8KKyNkZWZpbmUgSEZTUExVU19TQihzdXBlcikJKCooc3RydWN0IGhmc3BsdXNfc2JfaW5mbyAqKShzdXBlciktPnNfZnNfaW5mbykKKyNkZWZpbmUgSEZTUExVU19JKGlub2RlKQkoKmxpc3RfZW50cnkoaW5vZGUsIHN0cnVjdCBoZnNwbHVzX2lub2RlX2luZm8sIHZmc19pbm9kZSkpCisKKyNpZiAxCisjZGVmaW5lIGhmc3BsdXNfa21hcChwKQkJKHsgc3RydWN0IHBhZ2UgKl9fcCA9IChwKTsga21hcChfX3ApOyB9KQorI2RlZmluZSBoZnNwbHVzX2t1bm1hcChwKQkoeyBzdHJ1Y3QgcGFnZSAqX19wID0gKHApOyBrdW5tYXAoX19wKTsgX19wOyB9KQorI2Vsc2UKKyNkZWZpbmUgaGZzcGx1c19rbWFwKHApCQlrbWFwKHApCisjZGVmaW5lIGhmc3BsdXNfa3VubWFwKHApCWt1bm1hcChwKQorI2VuZGlmCisKKyNkZWZpbmUgc2JfYnJlYWQ1MTIoc2IsIHNlYywgZGF0YSkgKHsJCQlcCisJc3RydWN0IGJ1ZmZlcl9oZWFkICpfX2JoOwkJCVwKKwlzZWN0b3JfdCBfX2Jsb2NrOwkJCQlcCisJbG9mZl90IF9fc3RhcnQ7CQkJCQlcCisJaW50IF9fb2Zmc2V0OwkJCQkJXAorCQkJCQkJCVwKKwlfX3N0YXJ0ID0gKGxvZmZfdCkoc2VjKSA8PCBIRlNQTFVTX1NFQ1RPUl9TSElGVDtcCisJX19ibG9jayA9IF9fc3RhcnQgPj4gKHNiKS0+c19ibG9ja3NpemVfYml0czsJXAorCV9fb2Zmc2V0ID0gX19zdGFydCAmICgoc2IpLT5zX2Jsb2Nrc2l6ZSAtIDEpOwlcCisJX19iaCA9IHNiX2JyZWFkKChzYiksIF9fYmxvY2spOwkJCVwKKwlpZiAobGlrZWx5KF9fYmggIT0gTlVMTCkpCQkJXAorCQlkYXRhID0gKHZvaWQgKikoX19iaC0+Yl9kYXRhICsgX19vZmZzZXQpO1wKKwllbHNlCQkJCQkJXAorCQlkYXRhID0gTlVMTDsJCQkJXAorCV9fYmg7CQkJCQkJXAorfSkKKworLyogdGltZSBtYWNyb3MgKi8KKyNkZWZpbmUgX19oZnNwX210MnV0KHQpCQkoYmUzMl90b19jcHUodCkgLSAyMDgyODQ0ODAwVSkKKyNkZWZpbmUgX19oZnNwX3V0Mm10KHQpCQkoY3B1X3RvX2JlMzIodCArIDIwODI4NDQ4MDBVKSkKKworLyogY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBoZnNwX210MnV0KHQpCQkoc3RydWN0IHRpbWVzcGVjKXsgLnR2X3NlYyA9IF9faGZzcF9tdDJ1dCh0KSB9CisjZGVmaW5lIGhmc3BfdXQybXQodCkJCV9faGZzcF91dDJtdCgodCkudHZfc2VjKQorI2RlZmluZSBoZnNwX25vdzJtdCgpCQlfX2hmc3BfdXQybXQoZ2V0X3NlY29uZHMoKSkKKworI2RlZmluZSBrZGV2X3RfdG9fbnIoeCkJCSh4KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvaGZzcGx1c19yYXcuaCBiL2ZzL2hmc3BsdXMvaGZzcGx1c19yYXcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmFkMzdjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaGZzcGx1cy9oZnNwbHVzX3Jhdy5oCkBAIC0wLDAgKzEsMzI2IEBACisvKgorICogIGxpbnV4L2luY2x1ZGUvbGludXgvaGZzcGx1c19yYXcuaAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OQorICogQnJhZCBCb3llciAoZmxhckBwYW50cy5udSkKKyAqIChDKSAyMDAzIEFyZGlzIFRlY2hub2xvZ2llcyA8cm9tYW5AYXJkaXN0ZWNoLmNvbT4KKyAqCisgKiBGb3JtYXQgb2Ygc3RydWN0dXJlcyBvbiBkaXNrCisgKiBJbmZvcm1hdGlvbiB0YWtlbiBmcm9tIEFwcGxlIFRlY2hub3RlICMxMTUwIChIRlMgUGx1cyBWb2x1bWUgRm9ybWF0KQorICoKKyAqLworCisjaWZuZGVmIF9MSU5VWF9IRlNQTFVTX1JBV19ICisjZGVmaW5lIF9MSU5VWF9IRlNQTFVTX1JBV19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIF9fcGFja2VkIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKQorCisvKiBTb21lIGNvbnN0YW50cyAqLworI2RlZmluZSBIRlNQTFVTX1NFQ1RPUl9TSVpFICAgICAgICA1MTIKKyNkZWZpbmUgSEZTUExVU19TRUNUT1JfU0hJRlQgICAgICAgICA5CisjZGVmaW5lIEhGU1BMVVNfVk9MSEVBRF9TRUNUT1IgICAgICAgMgorI2RlZmluZSBIRlNQTFVTX1ZPTEhFQURfU0lHICAgICAweDQ4MmIKKyNkZWZpbmUgSEZTUExVU19TVVBFUl9NQUdJQyAgICAgMHg0ODJiCisjZGVmaW5lIEhGU1BMVVNfQ1VSUkVOVF9WRVJTSU9OICAgICAgNAorCisjZGVmaW5lIEhGU1BfV1JBUF9NQUdJQyAgICAgICAgIDB4NDI0NAorI2RlZmluZSBIRlNQX1dSQVBfQVRUUklCX1NMT0NLICAweDgwMDAKKyNkZWZpbmUgSEZTUF9XUkFQX0FUVFJJQl9TUEFSRUQgMHgwMjAwCisKKyNkZWZpbmUgSEZTUF9XUkFQT0ZGX1NJRyAgICAgICAgICAweDAwCisjZGVmaW5lIEhGU1BfV1JBUE9GRl9BVFRSSUIgICAgICAgMHgwQQorI2RlZmluZSBIRlNQX1dSQVBPRkZfQUJMS1NJWkUgICAgIDB4MTQKKyNkZWZpbmUgSEZTUF9XUkFQT0ZGX0FCTEtTVEFSVCAgICAweDFDCisjZGVmaW5lIEhGU1BfV1JBUE9GRl9FTUJFRFNJRyAgICAgMHg3QworI2RlZmluZSBIRlNQX1dSQVBPRkZfRU1CRURFWFQgICAgIDB4N0UKKworI2RlZmluZSBIRlNQX0hJRERFTkRJUl9OQU1FCSJceGUyXHg5MFx4ODBceGUyXHg5MFx4ODBceGUyXHg5MFx4ODBceGUyXHg5MFx4ODBIRlMrIFByaXZhdGUgRGF0YSIKKworI2RlZmluZSBIRlNQX0hBUkRMSU5LX1RZUEUJMHg2ODZjNmU2YgkvKiAnaGxuaycgKi8KKyNkZWZpbmUgSEZTUF9IRlNQTFVTX0NSRUFUT1IJMHg2ODY2NzMyYgkvKiAnaGZzKycgKi8KKworI2RlZmluZSBIRlNQX01PVU5UX1ZFUlNJT04JMHg0ODJiNGM3OAkvKiAnSCtMeCcgKi8KKworLyogU3RydWN0dXJlcyB1c2VkIG9uIGRpc2sgKi8KKwordHlwZWRlZiBfX2JlMzIgaGZzcGx1c19jbmlkOwordHlwZWRlZiBfX2JlMTYgaGZzcGx1c191bmljaHI7CisKKy8qIEEgInN0cmluZyIgYXMgdXNlZCBpbiBmaWxlbmFtZXMsIGV0Yy4gKi8KK3N0cnVjdCBoZnNwbHVzX3VuaXN0ciB7CisJX19iZTE2IGxlbmd0aDsKKwloZnNwbHVzX3VuaWNociB1bmljb2RlWzI1NV07Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEhGU1BMVVNfTUFYX1NUUkxFTiAyNTUKKworLyogUE9TSVggcGVybWlzc2lvbnMgKi8KK3N0cnVjdCBoZnNwbHVzX3Blcm0geworCV9fYmUzMiBvd25lcjsKKwlfX2JlMzIgZ3JvdXA7CisJdTggIHJvb3RmbGFnczsKKwl1OCAgdXNlcmZsYWdzOworCV9fYmUxNiBtb2RlOworCV9fYmUzMiBkZXY7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEhGU1BMVVNfRkxHX05PRFVNUAkweDAxCisjZGVmaW5lIEhGU1BMVVNfRkxHX0lNTVVUQUJMRQkweDAyCisjZGVmaW5lIEhGU1BMVVNfRkxHX0FQUEVORAkweDA0CisKKy8qIEEgc2luZ2xlIGNvbnRpZ3VvdXMgYXJlYSBvZiBhIGZpbGUgKi8KK3N0cnVjdCBoZnNwbHVzX2V4dGVudCB7CisJX19iZTMyIHN0YXJ0X2Jsb2NrOworCV9fYmUzMiBibG9ja19jb3VudDsKK30gX19wYWNrZWQ7Cit0eXBlZGVmIHN0cnVjdCBoZnNwbHVzX2V4dGVudCBoZnNwbHVzX2V4dGVudF9yZWNbOF07CisKKy8qIEluZm9ybWF0aW9uIGZvciBhICJGb3JrIiBpbiBhIGZpbGUgKi8KK3N0cnVjdCBoZnNwbHVzX2ZvcmtfcmF3IHsKKwlfX2JlNjQgdG90YWxfc2l6ZTsKKwlfX2JlMzIgY2x1bXBfc2l6ZTsKKwlfX2JlMzIgdG90YWxfYmxvY2tzOworCWhmc3BsdXNfZXh0ZW50X3JlYyBleHRlbnRzOworfSBfX3BhY2tlZDsKKworLyogSEZTKyBWb2x1bWUgSGVhZGVyICovCitzdHJ1Y3QgaGZzcGx1c192aCB7CisJX19iZTE2IHNpZ25hdHVyZTsKKwlfX2JlMTYgdmVyc2lvbjsKKwlfX2JlMzIgYXR0cmlidXRlczsKKwlfX2JlMzIgbGFzdF9tb3VudF92ZXJzOworCXUzMiByZXNlcnZlZDsKKworCV9fYmUzMiBjcmVhdGVfZGF0ZTsKKwlfX2JlMzIgbW9kaWZ5X2RhdGU7CisJX19iZTMyIGJhY2t1cF9kYXRlOworCV9fYmUzMiBjaGVja2VkX2RhdGU7CisKKwlfX2JlMzIgZmlsZV9jb3VudDsKKwlfX2JlMzIgZm9sZGVyX2NvdW50OworCisJX19iZTMyIGJsb2Nrc2l6ZTsKKwlfX2JlMzIgdG90YWxfYmxvY2tzOworCV9fYmUzMiBmcmVlX2Jsb2NrczsKKworCV9fYmUzMiBuZXh0X2FsbG9jOworCV9fYmUzMiByc3JjX2NsdW1wX3N6OworCV9fYmUzMiBkYXRhX2NsdW1wX3N6OworCWhmc3BsdXNfY25pZCBuZXh0X2NuaWQ7CisKKwlfX2JlMzIgd3JpdGVfY291bnQ7CisJX19iZTY0IGVuY29kaW5nc19ibXA7CisKKwl1OCBmaW5kZXJfaW5mb1szMl07CisKKwlzdHJ1Y3QgaGZzcGx1c19mb3JrX3JhdyBhbGxvY19maWxlOworCXN0cnVjdCBoZnNwbHVzX2ZvcmtfcmF3IGV4dF9maWxlOworCXN0cnVjdCBoZnNwbHVzX2ZvcmtfcmF3IGNhdF9maWxlOworCXN0cnVjdCBoZnNwbHVzX2ZvcmtfcmF3IGF0dHJfZmlsZTsKKwlzdHJ1Y3QgaGZzcGx1c19mb3JrX3JhdyBzdGFydF9maWxlOworfSBfX3BhY2tlZDsKKworLyogSEZTKyB2b2x1bWUgYXR0cmlidXRlcyAqLworI2RlZmluZSBIRlNQTFVTX1ZPTF9VTk1OVCAgICAgKDEgPDwgOCkKKyNkZWZpbmUgSEZTUExVU19WT0xfU1BBUkVfQkxLICgxIDw8IDkpCisjZGVmaW5lIEhGU1BMVVNfVk9MX05PQ0FDSEUgICAoMSA8PCAxMCkKKyNkZWZpbmUgSEZTUExVU19WT0xfSU5DTlNUTlQgICgxIDw8IDExKQorI2RlZmluZSBIRlNQTFVTX1ZPTF9TT0ZUTE9DSyAgKDEgPDwgMTUpCisKKy8qIEhGUysgQlRyZWUgbm9kZSBkZXNjcmlwdG9yICovCitzdHJ1Y3QgaGZzX2Jub2RlX2Rlc2MgeworCV9fYmUzMiBuZXh0OworCV9fYmUzMiBwcmV2OworCXM4IHR5cGU7CisJdTggaGVpZ2h0OworCV9fYmUxNiBudW1fcmVjczsKKwl1MTYgcmVzZXJ2ZWQ7Cit9IF9fcGFja2VkOworCisvKiBIRlMrIEJUcmVlIG5vZGUgdHlwZXMgKi8KKyNkZWZpbmUgSEZTX05PREVfSU5ERVgJMHgwMAorI2RlZmluZSBIRlNfTk9ERV9IRUFERVIJMHgwMQorI2RlZmluZSBIRlNfTk9ERV9NQVAJMHgwMgorI2RlZmluZSBIRlNfTk9ERV9MRUFGCTB4RkYKKworLyogSEZTKyBCVHJlZSBoZWFkZXIgKi8KK3N0cnVjdCBoZnNfYnRyZWVfaGVhZGVyX3JlYyB7CisJX19iZTE2IGRlcHRoOworCV9fYmUzMiByb290OworCV9fYmUzMiBsZWFmX2NvdW50OworCV9fYmUzMiBsZWFmX2hlYWQ7CisJX19iZTMyIGxlYWZfdGFpbDsKKwlfX2JlMTYgbm9kZV9zaXplOworCV9fYmUxNiBtYXhfa2V5X2xlbjsKKwlfX2JlMzIgbm9kZV9jb3VudDsKKwlfX2JlMzIgZnJlZV9ub2RlczsKKwl1MTYgcmVzZXJ2ZWQxOworCV9fYmUzMiBjbHVtcF9zaXplOworCXU4IGJ0cmVlX3R5cGU7CisJdTggcmVzZXJ2ZWQyOworCV9fYmUzMiBhdHRyaWJ1dGVzOworCXUzMiByZXNlcnZlZDNbMTZdOworfSBfX3BhY2tlZDsKKworLyogQlRyZWUgYXR0cmlidXRlcyAqLworI2RlZmluZSBIRlNfVFJFRV9CSUdLRVlTCTIKKyNkZWZpbmUgSEZTX1RSRUVfVkFSSURYS0VZUwk0CisKKy8qIEhGUysgQlRyZWUgbWlzYyBpbmZvICovCisjZGVmaW5lIEhGU1BMVVNfVFJFRV9IRUFEIDAKKyNkZWZpbmUgSEZTUExVU19OT0RFX01YU1ogMzI3NjgKKworLyogU29tZSBzcGVjaWFsIEZpbGUgSUQgbnVtYmVycyAoc3RvbGVuIGZyb20gaGZzLmgpICovCisjZGVmaW5lIEhGU1BMVVNfUE9SX0NOSUQJCTEJLyogUGFyZW50IE9mIHRoZSBSb290ICovCisjZGVmaW5lIEhGU1BMVVNfUk9PVF9DTklECQkyCS8qIFJPT1QgZGlyZWN0b3J5ICovCisjZGVmaW5lIEhGU1BMVVNfRVhUX0NOSUQJCTMJLyogRVhUZW50cyBCLXRyZWUgKi8KKyNkZWZpbmUgSEZTUExVU19DQVRfQ05JRAkJNAkvKiBDQVRhbG9nIEItdHJlZSAqLworI2RlZmluZSBIRlNQTFVTX0JBRF9DTklECQk1CS8qIEJBRCBibG9ja3MgZmlsZSAqLworI2RlZmluZSBIRlNQTFVTX0FMTE9DX0NOSUQJCTYJLyogQUxMT0NhdGlvbiBmaWxlICovCisjZGVmaW5lIEhGU1BMVVNfU1RBUlRfQ05JRAkJNwkvKiBTVEFSVHVwIGZpbGUgKi8KKyNkZWZpbmUgSEZTUExVU19BVFRSX0NOSUQJCTgJLyogQVRUUmlidXRlcyBmaWxlICovCisjZGVmaW5lIEhGU1BMVVNfRVhDSF9DTklECQkxNQkvKiBFeGNoYW5nZUZpbGVzIHRlbXAgaWQgKi8KKyNkZWZpbmUgSEZTUExVU19GSVJTVFVTRVJfQ05JRAkJMTYJLyogZmlyc3QgYXZhaWxhYmxlIHVzZXIgaWQgKi8KKworLyogSEZTKyBjYXRhbG9nIGVudHJ5IGtleSAqLworc3RydWN0IGhmc3BsdXNfY2F0X2tleSB7CisJX19iZTE2IGtleV9sZW47CisJaGZzcGx1c19jbmlkIHBhcmVudDsKKwlzdHJ1Y3QgaGZzcGx1c191bmlzdHIgbmFtZTsKK30gX19wYWNrZWQ7CisKKworLyogU3RydWN0cyBmcm9tIGhmcy5oICovCitzdHJ1Y3QgaGZzcF9wb2ludCB7CisJX19iZTE2IHY7CisJX19iZTE2IGg7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaGZzcF9yZWN0IHsKKwlfX2JlMTYgdG9wOworCV9fYmUxNiBsZWZ0OworCV9fYmUxNiBib3R0b207CisJX19iZTE2IHJpZ2h0OworfSBfX3BhY2tlZDsKKworCisvKiBIRlMgZGlyZWN0b3J5IGluZm8gKHN0b2xlbiBmcm9tIGhmcy5oICovCitzdHJ1Y3QgREluZm8geworCXN0cnVjdCBoZnNwX3JlY3QgZnJSZWN0OworCV9fYmUxNiBmckZsYWdzOworCXN0cnVjdCBoZnNwX3BvaW50IGZyTG9jYXRpb247CisJX19iZTE2IGZyVmlldzsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBEWEluZm8geworCXN0cnVjdCBoZnNwX3BvaW50IGZyU2Nyb2xsOworCV9fYmUzMiBmck9wZW5DaGFpbjsKKwlfX2JlMTYgZnJVbnVzZWQ7CisJX19iZTE2IGZyQ29tbWVudDsKKwlfX2JlMzIgZnJQdXRBd2F5OworfSBfX3BhY2tlZDsKKworLyogSEZTKyBmb2xkZXIgZGF0YSAocGFydCBvZiBhbiBoZnNwbHVzX2NhdF9lbnRyeSkgKi8KK3N0cnVjdCBoZnNwbHVzX2NhdF9mb2xkZXIgeworCV9fYmUxNiB0eXBlOworCV9fYmUxNiBmbGFnczsKKwlfX2JlMzIgdmFsZW5jZTsKKwloZnNwbHVzX2NuaWQgaWQ7CisJX19iZTMyIGNyZWF0ZV9kYXRlOworCV9fYmUzMiBjb250ZW50X21vZF9kYXRlOworCV9fYmUzMiBhdHRyaWJ1dGVfbW9kX2RhdGU7CisJX19iZTMyIGFjY2Vzc19kYXRlOworCV9fYmUzMiBiYWNrdXBfZGF0ZTsKKwlzdHJ1Y3QgaGZzcGx1c19wZXJtIHBlcm1pc3Npb25zOworCXN0cnVjdCBESW5mbyB1c2VyX2luZm87CisJc3RydWN0IERYSW5mbyBmaW5kZXJfaW5mbzsKKwlfX2JlMzIgdGV4dF9lbmNvZGluZzsKKwl1MzIgcmVzZXJ2ZWQ7Cit9IF9fcGFja2VkOworCisvKiBIRlMgZmlsZSBpbmZvIChzdG9sZW4gZnJvbSBoZnMuaCkgKi8KK3N0cnVjdCBGSW5mbyB7CisJX19iZTMyIGZkVHlwZTsKKwlfX2JlMzIgZmRDcmVhdG9yOworCV9fYmUxNiBmZEZsYWdzOworCXN0cnVjdCBoZnNwX3BvaW50IGZkTG9jYXRpb247CisJX19iZTE2IGZkRmxkcjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBGWEluZm8geworCV9fYmUxNiBmZEljb25JRDsKKwl1OCBmZFVudXNlZFs4XTsKKwlfX2JlMTYgZmRDb21tZW50OworCV9fYmUzMiBmZFB1dEF3YXk7Cit9IF9fcGFja2VkOworCisvKiBIRlMrIGZpbGUgZGF0YSAocGFydCBvZiBhIGNhdF9lbnRyeSkgKi8KK3N0cnVjdCBoZnNwbHVzX2NhdF9maWxlIHsKKwlfX2JlMTYgdHlwZTsKKwlfX2JlMTYgZmxhZ3M7CisJdTMyIHJlc2VydmVkMTsKKwloZnNwbHVzX2NuaWQgaWQ7CisJX19iZTMyIGNyZWF0ZV9kYXRlOworCV9fYmUzMiBjb250ZW50X21vZF9kYXRlOworCV9fYmUzMiBhdHRyaWJ1dGVfbW9kX2RhdGU7CisJX19iZTMyIGFjY2Vzc19kYXRlOworCV9fYmUzMiBiYWNrdXBfZGF0ZTsKKwlzdHJ1Y3QgaGZzcGx1c19wZXJtIHBlcm1pc3Npb25zOworCXN0cnVjdCBGSW5mbyB1c2VyX2luZm87CisJc3RydWN0IEZYSW5mbyBmaW5kZXJfaW5mbzsKKwlfX2JlMzIgdGV4dF9lbmNvZGluZzsKKwl1MzIgcmVzZXJ2ZWQyOworCisJc3RydWN0IGhmc3BsdXNfZm9ya19yYXcgZGF0YV9mb3JrOworCXN0cnVjdCBoZnNwbHVzX2ZvcmtfcmF3IHJzcmNfZm9yazsKK30gX19wYWNrZWQ7CisKKy8qIEZpbGUgYXR0cmlidXRlIGJpdHMgKi8KKyNkZWZpbmUgSEZTUExVU19GSUxFX0xPQ0tFRAkJMHgwMDAxCisjZGVmaW5lIEhGU1BMVVNfRklMRV9USFJFQURfRVhJU1RTCTB4MDAwMgorCisvKiBIRlMrIGNhdGFsb2cgdGhyZWFkIChwYXJ0IG9mIGEgY2F0X2VudHJ5KSAqLworc3RydWN0IGhmc3BsdXNfY2F0X3RocmVhZCB7CisJX19iZTE2IHR5cGU7CisJczE2IHJlc2VydmVkOworCWhmc3BsdXNfY25pZCBwYXJlbnRJRDsKKwlzdHJ1Y3QgaGZzcGx1c191bmlzdHIgbm9kZU5hbWU7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEhGU1BMVVNfTUlOX1RIUkVBRF9TWiAxMAorCisvKiBBIGRhdGEgcmVjb3JkIGluIHRoZSBjYXRhbG9nIHRyZWUgKi8KK3R5cGVkZWYgdW5pb24geworCV9fYmUxNiB0eXBlOworCXN0cnVjdCBoZnNwbHVzX2NhdF9mb2xkZXIgZm9sZGVyOworCXN0cnVjdCBoZnNwbHVzX2NhdF9maWxlIGZpbGU7CisJc3RydWN0IGhmc3BsdXNfY2F0X3RocmVhZCB0aHJlYWQ7Cit9IF9fcGFja2VkIGhmc3BsdXNfY2F0X2VudHJ5OworCisvKiBIRlMrIGNhdGFsb2cgZW50cnkgdHlwZSAqLworI2RlZmluZSBIRlNQTFVTX0ZPTERFUiAgICAgICAgIDB4MDAwMQorI2RlZmluZSBIRlNQTFVTX0ZJTEUgICAgICAgICAgIDB4MDAwMgorI2RlZmluZSBIRlNQTFVTX0ZPTERFUl9USFJFQUQgIDB4MDAwMworI2RlZmluZSBIRlNQTFVTX0ZJTEVfVEhSRUFEICAgIDB4MDAwNAorCisvKiBIRlMrIGV4dGVudHMgdHJlZSBrZXkgKi8KK3N0cnVjdCBoZnNwbHVzX2V4dF9rZXkgeworCV9fYmUxNiBrZXlfbGVuOworCXU4IGZvcmtfdHlwZTsKKwl1OCBwYWQ7CisJaGZzcGx1c19jbmlkIGNuaWQ7CisJX19iZTMyIHN0YXJ0X2Jsb2NrOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBIRlNQTFVTX0VYVF9LRVlMRU4gMTIKKworLyogSEZTKyBnZW5lcmljIEJUcmVlIGtleSAqLwordHlwZWRlZiB1bmlvbiB7CisJX19iZTE2IGtleV9sZW47CisJc3RydWN0IGhmc3BsdXNfY2F0X2tleSBjYXQ7CisJc3RydWN0IGhmc3BsdXNfZXh0X2tleSBleHQ7Cit9IF9fcGFja2VkIGhmc3BsdXNfYnRyZWVfa2V5OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvaW5vZGUuYyBiL2ZzL2hmc3BsdXMvaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTY0MjcwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaGZzcGx1cy9pbm9kZS5jCkBAIC0wLDAgKzEsNTU1IEBACisvKgorICogIGxpbnV4L2ZzL2hmc3BsdXMvaW5vZGUuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMQorICogQnJhZCBCb3llciAoZmxhckBhbGxhbmRyaWEuY29tKQorICogKEMpIDIwMDMgQXJkaXMgVGVjaG5vbG9naWVzIDxyb21hbkBhcmRpc3RlY2guY29tPgorICoKKyAqIElub2RlIGhhbmRsaW5nIHJvdXRpbmVzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21wYWdlLmg+CisKKyNpbmNsdWRlICJoZnNwbHVzX2ZzLmgiCisjaW5jbHVkZSAiaGZzcGx1c19yYXcuaCIKKworc3RhdGljIGludCBoZnNwbHVzX3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwkvL3ByaW50aygicmVhZHBhZ2U6ICVsdVxuIiwgcGFnZS0+aW5kZXgpOworCXJldHVybiBibG9ja19yZWFkX2Z1bGxfcGFnZShwYWdlLCBoZnNwbHVzX2dldF9ibG9jayk7Cit9CisKK3N0YXRpYyBpbnQgaGZzcGx1c193cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCS8vcHJpbnRrKCJ3cml0ZXBhZ2U6ICVsdVxuIiwgcGFnZS0+aW5kZXgpOworCXJldHVybiBibG9ja193cml0ZV9mdWxsX3BhZ2UocGFnZSwgaGZzcGx1c19nZXRfYmxvY2ssIHdiYyk7Cit9CisKK3N0YXRpYyBpbnQgaGZzcGx1c19wcmVwYXJlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCit7CisJcmV0dXJuIGNvbnRfcHJlcGFyZV93cml0ZShwYWdlLCBmcm9tLCB0bywgaGZzcGx1c19nZXRfYmxvY2ssCisJCSZIRlNQTFVTX0kocGFnZS0+bWFwcGluZy0+aG9zdCkucGh5c19zaXplKTsKK30KKworc3RhdGljIHNlY3Rvcl90IGhmc3BsdXNfYm1hcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc2VjdG9yX3QgYmxvY2spCit7CisJcmV0dXJuIGdlbmVyaWNfYmxvY2tfYm1hcChtYXBwaW5nLCBibG9jaywgaGZzcGx1c19nZXRfYmxvY2spOworfQorCitzdGF0aWMgaW50IGhmc3BsdXNfcmVsZWFzZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBtYXNrKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgaGZzX2J0cmVlICp0cmVlOworCXN0cnVjdCBoZnNfYm5vZGUgKm5vZGU7CisJdTMyIG5pZHg7CisJaW50IGksIHJlcyA9IDE7CisKKwlzd2l0Y2ggKGlub2RlLT5pX2lubykgeworCWNhc2UgSEZTUExVU19FWFRfQ05JRDoKKwkJdHJlZSA9IEhGU1BMVVNfU0Ioc2IpLmV4dF90cmVlOworCQlicmVhazsKKwljYXNlIEhGU1BMVVNfQ0FUX0NOSUQ6CisJCXRyZWUgPSBIRlNQTFVTX1NCKHNiKS5jYXRfdHJlZTsKKwkJYnJlYWs7CisJY2FzZSBIRlNQTFVTX0FUVFJfQ05JRDoKKwkJdHJlZSA9IEhGU1BMVVNfU0Ioc2IpLmF0dHJfdHJlZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJCXJldHVybiAwOworCX0KKwlpZiAodHJlZS0+bm9kZV9zaXplID49IFBBR0VfQ0FDSEVfU0laRSkgeworCQluaWR4ID0gcGFnZS0+aW5kZXggPj4gKHRyZWUtPm5vZGVfc2l6ZV9zaGlmdCAtIFBBR0VfQ0FDSEVfU0hJRlQpOworCQlzcGluX2xvY2soJnRyZWUtPmhhc2hfbG9jayk7CisJCW5vZGUgPSBoZnNfYm5vZGVfZmluZGhhc2godHJlZSwgbmlkeCk7CisJCWlmICghbm9kZSkKKwkJCTsKKwkJZWxzZSBpZiAoYXRvbWljX3JlYWQoJm5vZGUtPnJlZmNudCkpCisJCQlyZXMgPSAwOworCQlpZiAocmVzICYmIG5vZGUpIHsKKwkJCWhmc19ibm9kZV91bmhhc2gobm9kZSk7CisJCQloZnNfYm5vZGVfZnJlZShub2RlKTsKKwkJfQorCQlzcGluX3VubG9jaygmdHJlZS0+aGFzaF9sb2NrKTsKKwl9IGVsc2UgeworCQluaWR4ID0gcGFnZS0+aW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSB0cmVlLT5ub2RlX3NpemVfc2hpZnQpOworCQlpID0gMSA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIHRyZWUtPm5vZGVfc2l6ZV9zaGlmdCk7CisJCXNwaW5fbG9jaygmdHJlZS0+aGFzaF9sb2NrKTsKKwkJZG8geworCQkJbm9kZSA9IGhmc19ibm9kZV9maW5kaGFzaCh0cmVlLCBuaWR4KyspOworCQkJaWYgKCFub2RlKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGF0b21pY19yZWFkKCZub2RlLT5yZWZjbnQpKSB7CisJCQkJcmVzID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWhmc19ibm9kZV91bmhhc2gobm9kZSk7CisJCQloZnNfYm5vZGVfZnJlZShub2RlKTsKKwkJfSB3aGlsZSAoLS1pICYmIG5pZHggPCB0cmVlLT5ub2RlX2NvdW50KTsKKwkJc3Bpbl91bmxvY2soJnRyZWUtPmhhc2hfbG9jayk7CisJfQorCS8vcHJpbnRrKCJyZWxlYXNlcGFnZTogJWx1LCV4ID0gJWRcbiIsIHBhZ2UtPmluZGV4LCBtYXNrLCByZXMpOworCXJldHVybiByZXMgPyB0cnlfdG9fZnJlZV9idWZmZXJzKHBhZ2UpIDogMDsKK30KKworc3RhdGljIGludCBoZnNwbHVzX2dldF9ibG9ja3Moc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgaWJsb2NrLCB1bnNpZ25lZCBsb25nIG1heF9ibG9ja3MsCisJCQkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaGZzcGx1c19nZXRfYmxvY2soaW5vZGUsIGlibG9jaywgYmhfcmVzdWx0LCBjcmVhdGUpOworCWlmICghcmV0KQorCQliaF9yZXN1bHQtPmJfc2l6ZSA9ICgxIDw8IGlub2RlLT5pX2Jsa2JpdHMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGhmc3BsdXNfZGlyZWN0X0lPKGludCBydywgc3RydWN0IGtpb2NiICppb2NiLAorCQljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgbG9mZl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBucl9zZWdzKQoreworCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfbWFwcGluZy0+aG9zdDsKKworCXJldHVybiBibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLCBpbm9kZS0+aV9zYi0+c19iZGV2LCBpb3YsCisJCQkJICBvZmZzZXQsIG5yX3NlZ3MsIGhmc3BsdXNfZ2V0X2Jsb2NrcywgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgaGZzcGx1c193cml0ZXBhZ2VzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJICAgICAgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7CisJcmV0dXJuIG1wYWdlX3dyaXRlcGFnZXMobWFwcGluZywgd2JjLCBoZnNwbHVzX2dldF9ibG9jayk7Cit9CisKK3N0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgaGZzcGx1c19idHJlZV9hb3BzID0geworCS5yZWFkcGFnZQk9IGhmc3BsdXNfcmVhZHBhZ2UsCisJLndyaXRlcGFnZQk9IGhmc3BsdXNfd3JpdGVwYWdlLAorCS5zeW5jX3BhZ2UJPSBibG9ja19zeW5jX3BhZ2UsCisJLnByZXBhcmVfd3JpdGUJPSBoZnNwbHVzX3ByZXBhcmVfd3JpdGUsCisJLmNvbW1pdF93cml0ZQk9IGdlbmVyaWNfY29tbWl0X3dyaXRlLAorCS5ibWFwCQk9IGhmc3BsdXNfYm1hcCwKKwkucmVsZWFzZXBhZ2UJPSBoZnNwbHVzX3JlbGVhc2VwYWdlLAorfTsKKworc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBoZnNwbHVzX2FvcHMgPSB7CisJLnJlYWRwYWdlCT0gaGZzcGx1c19yZWFkcGFnZSwKKwkud3JpdGVwYWdlCT0gaGZzcGx1c193cml0ZXBhZ2UsCisJLnN5bmNfcGFnZQk9IGJsb2NrX3N5bmNfcGFnZSwKKwkucHJlcGFyZV93cml0ZQk9IGhmc3BsdXNfcHJlcGFyZV93cml0ZSwKKwkuY29tbWl0X3dyaXRlCT0gZ2VuZXJpY19jb21taXRfd3JpdGUsCisJLmJtYXAJCT0gaGZzcGx1c19ibWFwLAorCS5kaXJlY3RfSU8JPSBoZnNwbHVzX2RpcmVjdF9JTywKKwkud3JpdGVwYWdlcwk9IGhmc3BsdXNfd3JpdGVwYWdlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpoZnNwbHVzX2ZpbGVfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkJCSAgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGhmc19maW5kX2RhdGEgZmQ7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRpci0+aV9zYjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKKwlpbnQgZXJyOworCisJaWYgKEhGU1BMVVNfSVNfUlNSQyhkaXIpIHx8IHN0cmNtcChkZW50cnktPmRfbmFtZS5uYW1lLCAicnNyYyIpKQorCQlnb3RvIG91dDsKKworCWlub2RlID0gSEZTUExVU19JKGRpcikucnNyY19pbm9kZTsKKwlpZiAoaW5vZGUpCisJCWdvdG8gb3V0OworCisJaW5vZGUgPSBuZXdfaW5vZGUoc2IpOworCWlmICghaW5vZGUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJaW5vZGUtPmlfaW5vID0gZGlyLT5pX2lubzsKKwlJTklUX0xJU1RfSEVBRCgmSEZTUExVU19JKGlub2RlKS5vcGVuX2Rpcl9saXN0KTsKKwlpbml0X01VVEVYKCZIRlNQTFVTX0koaW5vZGUpLmV4dGVudHNfbG9jayk7CisJSEZTUExVU19JKGlub2RlKS5mbGFncyA9IEhGU1BMVVNfRkxHX1JTUkM7CisKKwloZnNfZmluZF9pbml0KEhGU1BMVVNfU0Ioc2IpLmNhdF90cmVlLCAmZmQpOworCWVyciA9IGhmc3BsdXNfZmluZF9jYXQoc2IsIGRpci0+aV9pbm8sICZmZCk7CisJaWYgKCFlcnIpCisJCWVyciA9IGhmc3BsdXNfY2F0X3JlYWRfaW5vZGUoaW5vZGUsICZmZCk7CisJaGZzX2ZpbmRfZXhpdCgmZmQpOworCWlmIChlcnIpIHsKKwkJaXB1dChpbm9kZSk7CisJCXJldHVybiBFUlJfUFRSKGVycik7CisJfQorCUhGU1BMVVNfSShpbm9kZSkucnNyY19pbm9kZSA9IGRpcjsKKwlIRlNQTFVTX0koZGlyKS5yc3JjX2lub2RlID0gaW5vZGU7CisJaWdyYWIoZGlyKTsKKwlobGlzdF9hZGRfaGVhZCgmaW5vZGUtPmlfaGFzaCwgJkhGU1BMVVNfU0Ioc2IpLnJzcmNfaW5vZGVzKTsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwl7CisJdm9pZCBoZnNwbHVzX2lub2RlX2NoZWNrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworCWF0b21pY19pbmMoJkhGU1BMVVNfU0Ioc2IpLmlub2RlX2NudCk7CisJaGZzcGx1c19pbm9kZV9jaGVjayhzYik7CisJfQorb3V0OgorCWRfYWRkKGRlbnRyeSwgaW5vZGUpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBoZnNwbHVzX2dldF9wZXJtcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaGZzcGx1c19wZXJtICpwZXJtcywgaW50IGRpcikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJdTE2IG1vZGU7CisKKwltb2RlID0gYmUxNl90b19jcHUocGVybXMtPm1vZGUpOworCisJaW5vZGUtPmlfdWlkID0gYmUzMl90b19jcHUocGVybXMtPm93bmVyKTsKKwlpZiAoIWlub2RlLT5pX3VpZCAmJiAhbW9kZSkKKwkJaW5vZGUtPmlfdWlkID0gSEZTUExVU19TQihzYikudWlkOworCisJaW5vZGUtPmlfZ2lkID0gYmUzMl90b19jcHUocGVybXMtPmdyb3VwKTsKKwlpZiAoIWlub2RlLT5pX2dpZCAmJiAhbW9kZSkKKwkJaW5vZGUtPmlfZ2lkID0gSEZTUExVU19TQihzYikuZ2lkOworCisJaWYgKGRpcikgeworCQltb2RlID0gbW9kZSA/IChtb2RlICYgU19JQUxMVUdPKSA6CisJCQkoU19JUldYVUdPICYgfihIRlNQTFVTX1NCKHNiKS51bWFzaykpOworCQltb2RlIHw9IFNfSUZESVI7CisJfSBlbHNlIGlmICghbW9kZSkKKwkJbW9kZSA9IFNfSUZSRUcgfCAoKFNfSVJVR098U19JV1VHTykgJgorCQkJfihIRlNQTFVTX1NCKHNiKS51bWFzaykpOworCWlub2RlLT5pX21vZGUgPSBtb2RlOworCisJSEZTUExVU19JKGlub2RlKS5yb290ZmxhZ3MgPSBwZXJtcy0+cm9vdGZsYWdzOworCUhGU1BMVVNfSShpbm9kZSkudXNlcmZsYWdzID0gcGVybXMtPnVzZXJmbGFnczsKKwlpZiAocGVybXMtPnJvb3RmbGFncyAmIEhGU1BMVVNfRkxHX0lNTVVUQUJMRSkKKwkJaW5vZGUtPmlfZmxhZ3MgfD0gU19JTU1VVEFCTEU7CisJZWxzZQorCQlpbm9kZS0+aV9mbGFncyAmPSB+U19JTU1VVEFCTEU7CisJaWYgKHBlcm1zLT5yb290ZmxhZ3MgJiBIRlNQTFVTX0ZMR19BUFBFTkQpCisJCWlub2RlLT5pX2ZsYWdzIHw9IFNfQVBQRU5EOworCWVsc2UKKwkJaW5vZGUtPmlfZmxhZ3MgJj0gflNfQVBQRU5EOworfQorCitzdGF0aWMgdm9pZCBoZnNwbHVzX3NldF9wZXJtcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaGZzcGx1c19wZXJtICpwZXJtcykKK3sKKwlpZiAoaW5vZGUtPmlfZmxhZ3MgJiBTX0lNTVVUQUJMRSkKKwkJcGVybXMtPnJvb3RmbGFncyB8PSBIRlNQTFVTX0ZMR19JTU1VVEFCTEU7CisJZWxzZQorCQlwZXJtcy0+cm9vdGZsYWdzICY9IH5IRlNQTFVTX0ZMR19JTU1VVEFCTEU7CisJaWYgKGlub2RlLT5pX2ZsYWdzICYgU19BUFBFTkQpCisJCXBlcm1zLT5yb290ZmxhZ3MgfD0gSEZTUExVU19GTEdfQVBQRU5EOworCWVsc2UKKwkJcGVybXMtPnJvb3RmbGFncyAmPSB+SEZTUExVU19GTEdfQVBQRU5EOworCXBlcm1zLT51c2VyZmxhZ3MgPSBIRlNQTFVTX0koaW5vZGUpLnVzZXJmbGFnczsKKwlwZXJtcy0+bW9kZSA9IGNwdV90b19iZTE2KGlub2RlLT5pX21vZGUpOworCXBlcm1zLT5vd25lciA9IGNwdV90b19iZTMyKGlub2RlLT5pX3VpZCk7CisJcGVybXMtPmdyb3VwID0gY3B1X3RvX2JlMzIoaW5vZGUtPmlfZ2lkKTsKKwlwZXJtcy0+ZGV2ID0gY3B1X3RvX2JlMzIoSEZTUExVU19JKGlub2RlKS5kZXYpOworfQorCitzdGF0aWMgaW50IGhmc3BsdXNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJLyogTUFZX0VYRUMgaXMgYWxzbyB1c2VkIGZvciBsb29rdXAsIGlmIG5vIHggYml0IGlzIHNldCBhbGxvdyBsb29rdXAsCisJICogb3Blbl9leGVjIGhhcyB0aGUgc2FtZSB0ZXN0LCBzbyBpdCdzIHN0aWxsIG5vdCBleGVjdXRhYmxlLCBpZiBhIHggYml0CisJICogaXMgc2V0IGZhbGwgYmFjayB0byBzdGFuZGFyZCBwZXJtaXNzaW9uIGNoZWNrLgorCSAqLworCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmIG1hc2sgJiBNQVlfRVhFQyAmJiAhKGlub2RlLT5pX21vZGUgJiAwMTExKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGdlbmVyaWNfcGVybWlzc2lvbihpbm9kZSwgbWFzaywgTlVMTCk7Cit9CisKKworc3RhdGljIGludCBoZnNwbHVzX2ZpbGVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAoSEZTUExVU19JU19SU1JDKGlub2RlKSkKKwkJaW5vZGUgPSBIRlNQTFVTX0koaW5vZGUpLnJzcmNfaW5vZGU7CisJaWYgKGF0b21pY19yZWFkKCZmaWxlLT5mX2NvdW50KSAhPSAxKQorCQlyZXR1cm4gMDsKKwlhdG9taWNfaW5jKCZIRlNQTFVTX0koaW5vZGUpLm9wZW5jbnQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhmc3BsdXNfZmlsZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKworCWlmIChIRlNQTFVTX0lTX1JTUkMoaW5vZGUpKQorCQlpbm9kZSA9IEhGU1BMVVNfSShpbm9kZSkucnNyY19pbm9kZTsKKwlpZiAoYXRvbWljX3JlYWQoJmZpbGUtPmZfY291bnQpICE9IDApCisJCXJldHVybiAwOworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZIRlNQTFVTX0koaW5vZGUpLm9wZW5jbnQpKSB7CisJCWRvd24oJmlub2RlLT5pX3NlbSk7CisJCWhmc3BsdXNfZmlsZV90cnVuY2F0ZShpbm9kZSk7CisJCWlmIChpbm9kZS0+aV9mbGFncyAmIFNfREVBRCkgeworCQkJaGZzcGx1c19kZWxldGVfY2F0KGlub2RlLT5pX2lubywgSEZTUExVU19TQihzYikuaGlkZGVuX2RpciwgTlVMTCk7CisJCQloZnNwbHVzX2RlbGV0ZV9pbm9kZShpbm9kZSk7CisJCX0KKwkJdXAoJmlub2RlLT5pX3NlbSk7CisJfQorCXJldHVybiAwOworfQorCitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgaGZzcGx1c19kaXJfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGhmc3BsdXNfZGlyX29wZXJhdGlvbnM7CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBoZnNwbHVzX2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkubG9va3VwCQk9IGhmc3BsdXNfZmlsZV9sb29rdXAsCisJLnRydW5jYXRlCT0gaGZzcGx1c19maWxlX3RydW5jYXRlLAorCS5wZXJtaXNzaW9uCT0gaGZzcGx1c19wZXJtaXNzaW9uLAorCS5zZXR4YXR0cgk9IGhmc3BsdXNfc2V0eGF0dHIsCisJLmdldHhhdHRyCT0gaGZzcGx1c19nZXR4YXR0ciwKKwkubGlzdHhhdHRyCT0gaGZzcGx1c19saXN0eGF0dHIsCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBoZnNwbHVzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkubGxzZWVrIAk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlYWQJCT0gZ2VuZXJpY19maWxlX3JlYWQsCisJLndyaXRlCQk9IGdlbmVyaWNfZmlsZV93cml0ZSwKKwkubW1hcAkJPSBnZW5lcmljX2ZpbGVfbW1hcCwKKwkuc2VuZGZpbGUJPSBnZW5lcmljX2ZpbGVfc2VuZGZpbGUsCisJLmZzeW5jCQk9IGZpbGVfZnN5bmMsCisJLm9wZW4JCT0gaGZzcGx1c19maWxlX29wZW4sCisJLnJlbGVhc2UJPSBoZnNwbHVzX2ZpbGVfcmVsZWFzZSwKKwkuaW9jdGwgICAgICAgICAgPSBoZnNwbHVzX2lvY3RsLAorfTsKKworc3RydWN0IGlub2RlICpoZnNwbHVzX25ld19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbmV3X2lub2RlKHNiKTsKKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gTlVMTDsKKworCXsKKwl2b2lkIGhmc3BsdXNfaW5vZGVfY2hlY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CisJYXRvbWljX2luYygmSEZTUExVU19TQihzYikuaW5vZGVfY250KTsKKwloZnNwbHVzX2lub2RlX2NoZWNrKHNiKTsKKwl9CisJaW5vZGUtPmlfaW5vID0gSEZTUExVU19TQihzYikubmV4dF9jbmlkKys7CisJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisJaW5vZGUtPmlfdWlkID0gY3VycmVudC0+ZnN1aWQ7CisJaW5vZGUtPmlfZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJaW5vZGUtPmlfbmxpbmsgPSAxOworCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJaW5vZGUtPmlfYmxrc2l6ZSA9IEhGU1BMVVNfU0Ioc2IpLmFsbG9jX2Jsa3N6OworCUlOSVRfTElTVF9IRUFEKCZIRlNQTFVTX0koaW5vZGUpLm9wZW5fZGlyX2xpc3QpOworCWluaXRfTVVURVgoJkhGU1BMVVNfSShpbm9kZSkuZXh0ZW50c19sb2NrKTsKKwlhdG9taWNfc2V0KCZIRlNQTFVTX0koaW5vZGUpLm9wZW5jbnQsIDApOworCUhGU1BMVVNfSShpbm9kZSkuZmxhZ3MgPSAwOworCW1lbXNldChIRlNQTFVTX0koaW5vZGUpLmZpcnN0X2V4dGVudHMsIDAsIHNpemVvZihoZnNwbHVzX2V4dGVudF9yZWMpKTsKKwltZW1zZXQoSEZTUExVU19JKGlub2RlKS5jYWNoZWRfZXh0ZW50cywgMCwgc2l6ZW9mKGhmc3BsdXNfZXh0ZW50X3JlYykpOworCUhGU1BMVVNfSShpbm9kZSkuYWxsb2NfYmxvY2tzID0gMDsKKwlIRlNQTFVTX0koaW5vZGUpLmZpcnN0X2Jsb2NrcyA9IDA7CisJSEZTUExVU19JKGlub2RlKS5jYWNoZWRfc3RhcnQgPSAwOworCUhGU1BMVVNfSShpbm9kZSkuY2FjaGVkX2Jsb2NrcyA9IDA7CisJSEZTUExVU19JKGlub2RlKS5waHlzX3NpemUgPSAwOworCUhGU1BMVVNfSShpbm9kZSkuZnNfYmxvY2tzID0gMDsKKwlIRlNQTFVTX0koaW5vZGUpLnJzcmNfaW5vZGUgPSBOVUxMOworCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCWlub2RlLT5pX3NpemUgPSAyOworCQlIRlNQTFVTX1NCKHNiKS5mb2xkZXJfY291bnQrKzsKKwkJaW5vZGUtPmlfb3AgPSAmaGZzcGx1c19kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJmhmc3BsdXNfZGlyX29wZXJhdGlvbnM7CisJfSBlbHNlIGlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisJCUhGU1BMVVNfU0Ioc2IpLmZpbGVfY291bnQrKzsKKwkJaW5vZGUtPmlfb3AgPSAmaGZzcGx1c19maWxlX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZoZnNwbHVzX2ZpbGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmaGZzcGx1c19hb3BzOworCQlIRlNQTFVTX0koaW5vZGUpLmNsdW1wX2Jsb2NrcyA9IEhGU1BMVVNfU0Ioc2IpLmRhdGFfY2x1bXBfYmxvY2tzOworCX0gZWxzZSBpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkgeworCQlIRlNQTFVTX1NCKHNiKS5maWxlX2NvdW50Kys7CisJCWlub2RlLT5pX29wID0gJnBhZ2Vfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZoZnNwbHVzX2FvcHM7CisJCUhGU1BMVVNfSShpbm9kZSkuY2x1bXBfYmxvY2tzID0gMTsKKwl9IGVsc2UKKwkJSEZTUExVU19TQihzYikuZmlsZV9jb3VudCsrOworCWluc2VydF9pbm9kZV9oYXNoKGlub2RlKTsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwlzYi0+c19kaXJ0ID0gMTsKKworCXJldHVybiBpbm9kZTsKK30KKwordm9pZCBoZnNwbHVzX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKworCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCUhGU1BMVVNfU0Ioc2IpLmZvbGRlcl9jb3VudC0tOworCQlzYi0+c19kaXJ0ID0gMTsKKwkJcmV0dXJuOworCX0KKwlIRlNQTFVTX1NCKHNiKS5maWxlX2NvdW50LS07CisJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaWYgKCFpbm9kZS0+aV9ubGluaykgeworCQkJaW5vZGUtPmlfc2l6ZSA9IDA7CisJCQloZnNwbHVzX2ZpbGVfdHJ1bmNhdGUoaW5vZGUpOworCQl9CisJfSBlbHNlIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKSB7CisJCWlub2RlLT5pX3NpemUgPSAwOworCQloZnNwbHVzX2ZpbGVfdHJ1bmNhdGUoaW5vZGUpOworCX0KKwlzYi0+c19kaXJ0ID0gMTsKK30KKwordm9pZCBoZnNwbHVzX2lub2RlX3JlYWRfZm9yayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaGZzcGx1c19mb3JrX3JhdyAqZm9yaykKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJdTMyIGNvdW50OworCWludCBpOworCisJbWVtY3B5KCZIRlNQTFVTX0koaW5vZGUpLmZpcnN0X2V4dGVudHMsICZmb3JrLT5leHRlbnRzLAorCSAgICAgICBzaXplb2YoaGZzcGx1c19leHRlbnRfcmVjKSk7CisJZm9yIChjb3VudCA9IDAsIGkgPSAwOyBpIDwgODsgaSsrKQorCQljb3VudCArPSBiZTMyX3RvX2NwdShmb3JrLT5leHRlbnRzW2ldLmJsb2NrX2NvdW50KTsKKwlIRlNQTFVTX0koaW5vZGUpLmZpcnN0X2Jsb2NrcyA9IGNvdW50OworCW1lbXNldChIRlNQTFVTX0koaW5vZGUpLmNhY2hlZF9leHRlbnRzLCAwLCBzaXplb2YoaGZzcGx1c19leHRlbnRfcmVjKSk7CisJSEZTUExVU19JKGlub2RlKS5jYWNoZWRfc3RhcnQgPSAwOworCUhGU1BMVVNfSShpbm9kZSkuY2FjaGVkX2Jsb2NrcyA9IDA7CisKKwlIRlNQTFVTX0koaW5vZGUpLmFsbG9jX2Jsb2NrcyA9IGJlMzJfdG9fY3B1KGZvcmstPnRvdGFsX2Jsb2Nrcyk7CisJaW5vZGUtPmlfc2l6ZSA9IEhGU1BMVVNfSShpbm9kZSkucGh5c19zaXplID0gYmU2NF90b19jcHUoZm9yay0+dG90YWxfc2l6ZSk7CisJSEZTUExVU19JKGlub2RlKS5mc19ibG9ja3MgPSAoaW5vZGUtPmlfc2l6ZSArIHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCWlub2RlX3NldF9ieXRlcyhpbm9kZSwgSEZTUExVU19JKGlub2RlKS5mc19ibG9ja3MgPDwgc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCUhGU1BMVVNfSShpbm9kZSkuY2x1bXBfYmxvY2tzID0gYmUzMl90b19jcHUoZm9yay0+Y2x1bXBfc2l6ZSkgPj4gSEZTUExVU19TQihzYikuYWxsb2NfYmxrc3pfc2hpZnQ7CisJaWYgKCFIRlNQTFVTX0koaW5vZGUpLmNsdW1wX2Jsb2NrcykKKwkJSEZTUExVU19JKGlub2RlKS5jbHVtcF9ibG9ja3MgPSBIRlNQTFVTX0lTX1JTUkMoaW5vZGUpID8gSEZTUExVU19TQihzYikucnNyY19jbHVtcF9ibG9ja3MgOgorCQkJCUhGU1BMVVNfU0Ioc2IpLmRhdGFfY2x1bXBfYmxvY2tzOworfQorCit2b2lkIGhmc3BsdXNfaW5vZGVfd3JpdGVfZm9yayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaGZzcGx1c19mb3JrX3JhdyAqZm9yaykKK3sKKwltZW1jcHkoJmZvcmstPmV4dGVudHMsICZIRlNQTFVTX0koaW5vZGUpLmZpcnN0X2V4dGVudHMsCisJICAgICAgIHNpemVvZihoZnNwbHVzX2V4dGVudF9yZWMpKTsKKwlmb3JrLT50b3RhbF9zaXplID0gY3B1X3RvX2JlNjQoaW5vZGUtPmlfc2l6ZSk7CisJZm9yay0+dG90YWxfYmxvY2tzID0gY3B1X3RvX2JlMzIoSEZTUExVU19JKGlub2RlKS5hbGxvY19ibG9ja3MpOworfQorCitpbnQgaGZzcGx1c19jYXRfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSAqZmQpCit7CisJaGZzcGx1c19jYXRfZW50cnkgZW50cnk7CisJaW50IHJlcyA9IDA7CisJdTE2IHR5cGU7CisKKwl0eXBlID0gaGZzX2Jub2RlX3JlYWRfdTE2KGZkLT5ibm9kZSwgZmQtPmVudHJ5b2Zmc2V0KTsKKworCUhGU1BMVVNfSShpbm9kZSkuZGV2ID0gMDsKKwlpbm9kZS0+aV9ibGtzaXplID0gSEZTUExVU19TQihpbm9kZS0+aV9zYikuYWxsb2NfYmxrc3o7CisJaWYgKHR5cGUgPT0gSEZTUExVU19GT0xERVIpIHsKKwkJc3RydWN0IGhmc3BsdXNfY2F0X2ZvbGRlciAqZm9sZGVyID0gJmVudHJ5LmZvbGRlcjsKKworCQlpZiAoZmQtPmVudHJ5bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBoZnNwbHVzX2NhdF9mb2xkZXIpKQorCQkJLyogcGFuaWM/ICovOworCQloZnNfYm5vZGVfcmVhZChmZC0+Ym5vZGUsICZlbnRyeSwgZmQtPmVudHJ5b2Zmc2V0LAorCQkJCQlzaXplb2Yoc3RydWN0IGhmc3BsdXNfY2F0X2ZvbGRlcikpOworCQloZnNwbHVzX2dldF9wZXJtcyhpbm9kZSwgJmZvbGRlci0+cGVybWlzc2lvbnMsIDEpOworCQlpbm9kZS0+aV9ubGluayA9IDE7CisJCWlub2RlLT5pX3NpemUgPSAyICsgYmUzMl90b19jcHUoZm9sZGVyLT52YWxlbmNlKTsKKwkJaW5vZGUtPmlfYXRpbWUgPSBoZnNwX210MnV0KGZvbGRlci0+YWNjZXNzX2RhdGUpOworCQlpbm9kZS0+aV9tdGltZSA9IGhmc3BfbXQydXQoZm9sZGVyLT5jb250ZW50X21vZF9kYXRlKTsKKwkJaW5vZGUtPmlfY3RpbWUgPSBpbm9kZS0+aV9tdGltZTsKKwkJSEZTUExVU19JKGlub2RlKS5mc19ibG9ja3MgPSAwOworCQlpbm9kZS0+aV9vcCA9ICZoZnNwbHVzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9mb3AgPSAmaGZzcGx1c19kaXJfb3BlcmF0aW9uczsKKwl9IGVsc2UgaWYgKHR5cGUgPT0gSEZTUExVU19GSUxFKSB7CisJCXN0cnVjdCBoZnNwbHVzX2NhdF9maWxlICpmaWxlID0gJmVudHJ5LmZpbGU7CisKKwkJaWYgKGZkLT5lbnRyeWxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgaGZzcGx1c19jYXRfZmlsZSkpCisJCQkvKiBwYW5pYz8gKi87CisJCWhmc19ibm9kZV9yZWFkKGZkLT5ibm9kZSwgJmVudHJ5LCBmZC0+ZW50cnlvZmZzZXQsCisJCQkJCXNpemVvZihzdHJ1Y3QgaGZzcGx1c19jYXRfZmlsZSkpOworCisJCWhmc3BsdXNfaW5vZGVfcmVhZF9mb3JrKGlub2RlLCBIRlNQTFVTX0lTX0RBVEEoaW5vZGUpID8KKwkJCQkJJmZpbGUtPmRhdGFfZm9yayA6ICZmaWxlLT5yc3JjX2ZvcmspOworCQloZnNwbHVzX2dldF9wZXJtcyhpbm9kZSwgJmZpbGUtPnBlcm1pc3Npb25zLCAwKTsKKwkJaW5vZGUtPmlfbmxpbmsgPSAxOworCQlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgeworCQkJaWYgKGZpbGUtPnBlcm1pc3Npb25zLmRldikKKwkJCQlpbm9kZS0+aV9ubGluayA9IGJlMzJfdG9fY3B1KGZpbGUtPnBlcm1pc3Npb25zLmRldik7CisJCQlpbm9kZS0+aV9vcCA9ICZoZnNwbHVzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWlub2RlLT5pX2ZvcCA9ICZoZnNwbHVzX2ZpbGVfb3BlcmF0aW9uczsKKwkJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmhmc3BsdXNfYW9wczsKKwkJfSBlbHNlIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKSB7CisJCQlpbm9kZS0+aV9vcCA9ICZwYWdlX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmhmc3BsdXNfYW9wczsKKwkJfSBlbHNlIHsKKwkJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwKKwkJCQkJICAgYmUzMl90b19jcHUoZmlsZS0+cGVybWlzc2lvbnMuZGV2KSk7CisJCX0KKwkJaW5vZGUtPmlfYXRpbWUgPSBoZnNwX210MnV0KGZpbGUtPmFjY2Vzc19kYXRlKTsKKwkJaW5vZGUtPmlfbXRpbWUgPSBoZnNwX210MnV0KGZpbGUtPmNvbnRlbnRfbW9kX2RhdGUpOworCQlpbm9kZS0+aV9jdGltZSA9IGlub2RlLT5pX210aW1lOworCX0gZWxzZSB7CisJCXByaW50aygiSEZTKy1mczogYmFkIGNhdGFsb2cgZW50cnkgdXNlZCB0byBjcmVhdGUgaW5vZGVcbiIpOworCQlyZXMgPSAtRUlPOworCX0KKwlyZXR1cm4gcmVzOworfQorCitpbnQgaGZzcGx1c19jYXRfd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKm1haW5faW5vZGUgPSBpbm9kZTsKKwlzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSBmZDsKKwloZnNwbHVzX2NhdF9lbnRyeSBlbnRyeTsKKworCWlmIChIRlNQTFVTX0lTX1JTUkMoaW5vZGUpKQorCQltYWluX2lub2RlID0gSEZTUExVU19JKGlub2RlKS5yc3JjX2lub2RlOworCisJaWYgKCFtYWluX2lub2RlLT5pX25saW5rKQorCQlyZXR1cm4gMDsKKworCWlmIChoZnNfZmluZF9pbml0KEhGU1BMVVNfU0IobWFpbl9pbm9kZS0+aV9zYikuY2F0X3RyZWUsICZmZCkpCisJCS8qIHBhbmljPyAqLworCQlyZXR1cm4gLUVJTzsKKworCWlmIChoZnNwbHVzX2ZpbmRfY2F0KG1haW5faW5vZGUtPmlfc2IsIG1haW5faW5vZGUtPmlfaW5vLCAmZmQpKQorCQkvKiBwYW5pYz8gKi8KKwkJZ290byBvdXQ7CisKKwlpZiAoU19JU0RJUihtYWluX2lub2RlLT5pX21vZGUpKSB7CisJCXN0cnVjdCBoZnNwbHVzX2NhdF9mb2xkZXIgKmZvbGRlciA9ICZlbnRyeS5mb2xkZXI7CisKKwkJaWYgKGZkLmVudHJ5bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBoZnNwbHVzX2NhdF9mb2xkZXIpKQorCQkJLyogcGFuaWM/ICovOworCQloZnNfYm5vZGVfcmVhZChmZC5ibm9kZSwgJmVudHJ5LCBmZC5lbnRyeW9mZnNldCwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBoZnNwbHVzX2NhdF9mb2xkZXIpKTsKKwkJLyogc2ltcGxlIG5vZGUgY2hlY2tzPyAqLworCQloZnNwbHVzX3NldF9wZXJtcyhpbm9kZSwgJmZvbGRlci0+cGVybWlzc2lvbnMpOworCQlmb2xkZXItPmFjY2Vzc19kYXRlID0gaGZzcF91dDJtdChpbm9kZS0+aV9hdGltZSk7CisJCWZvbGRlci0+Y29udGVudF9tb2RfZGF0ZSA9IGhmc3BfdXQybXQoaW5vZGUtPmlfbXRpbWUpOworCQlmb2xkZXItPmF0dHJpYnV0ZV9tb2RfZGF0ZSA9IGhmc3BfdXQybXQoaW5vZGUtPmlfY3RpbWUpOworCQlmb2xkZXItPnZhbGVuY2UgPSBjcHVfdG9fYmUzMihpbm9kZS0+aV9zaXplIC0gMik7CisJCWhmc19ibm9kZV93cml0ZShmZC5ibm9kZSwgJmVudHJ5LCBmZC5lbnRyeW9mZnNldCwKKwkJCQkJIHNpemVvZihzdHJ1Y3QgaGZzcGx1c19jYXRfZm9sZGVyKSk7CisJfSBlbHNlIGlmIChIRlNQTFVTX0lTX1JTUkMoaW5vZGUpKSB7CisJCXN0cnVjdCBoZnNwbHVzX2NhdF9maWxlICpmaWxlID0gJmVudHJ5LmZpbGU7CisJCWhmc19ibm9kZV9yZWFkKGZkLmJub2RlLCAmZW50cnksIGZkLmVudHJ5b2Zmc2V0LAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaGZzcGx1c19jYXRfZmlsZSkpOworCQloZnNwbHVzX2lub2RlX3dyaXRlX2ZvcmsoaW5vZGUsICZmaWxlLT5yc3JjX2ZvcmspOworCQloZnNfYm5vZGVfd3JpdGUoZmQuYm5vZGUsICZlbnRyeSwgZmQuZW50cnlvZmZzZXQsCisJCQkJc2l6ZW9mKHN0cnVjdCBoZnNwbHVzX2NhdF9maWxlKSk7CisJfSBlbHNlIHsKKwkJc3RydWN0IGhmc3BsdXNfY2F0X2ZpbGUgKmZpbGUgPSAmZW50cnkuZmlsZTsKKworCQlpZiAoZmQuZW50cnlsZW5ndGggPCBzaXplb2Yoc3RydWN0IGhmc3BsdXNfY2F0X2ZpbGUpKQorCQkJLyogcGFuaWM/ICovOworCQloZnNfYm5vZGVfcmVhZChmZC5ibm9kZSwgJmVudHJ5LCBmZC5lbnRyeW9mZnNldCwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBoZnNwbHVzX2NhdF9maWxlKSk7CisJCWhmc3BsdXNfaW5vZGVfd3JpdGVfZm9yayhpbm9kZSwgJmZpbGUtPmRhdGFfZm9yayk7CisJCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKQorCQkJSEZTUExVU19JKGlub2RlKS5kZXYgPSBpbm9kZS0+aV9ubGluazsKKwkJaWYgKFNfSVNDSFIoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkKKwkJCUhGU1BMVVNfSShpbm9kZSkuZGV2ID0ga2Rldl90X3RvX25yKGlub2RlLT5pX3JkZXYpOworCQloZnNwbHVzX3NldF9wZXJtcyhpbm9kZSwgJmZpbGUtPnBlcm1pc3Npb25zKTsKKwkJaWYgKChmaWxlLT5wZXJtaXNzaW9ucy5yb290ZmxhZ3MgfCBmaWxlLT5wZXJtaXNzaW9ucy51c2VyZmxhZ3MpICYgSEZTUExVU19GTEdfSU1NVVRBQkxFKQorCQkJZmlsZS0+ZmxhZ3MgfD0gY3B1X3RvX2JlMTYoSEZTUExVU19GSUxFX0xPQ0tFRCk7CisJCWVsc2UKKwkJCWZpbGUtPmZsYWdzICY9IGNwdV90b19iZTE2KH5IRlNQTFVTX0ZJTEVfTE9DS0VEKTsKKwkJZmlsZS0+YWNjZXNzX2RhdGUgPSBoZnNwX3V0Mm10KGlub2RlLT5pX2F0aW1lKTsKKwkJZmlsZS0+Y29udGVudF9tb2RfZGF0ZSA9IGhmc3BfdXQybXQoaW5vZGUtPmlfbXRpbWUpOworCQlmaWxlLT5hdHRyaWJ1dGVfbW9kX2RhdGUgPSBoZnNwX3V0Mm10KGlub2RlLT5pX2N0aW1lKTsKKwkJaGZzX2Jub2RlX3dyaXRlKGZkLmJub2RlLCAmZW50cnksIGZkLmVudHJ5b2Zmc2V0LAorCQkJCQkgc2l6ZW9mKHN0cnVjdCBoZnNwbHVzX2NhdF9maWxlKSk7CisJfQorb3V0OgorCWhmc19maW5kX2V4aXQoJmZkKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvaW9jdGwuYyBiL2ZzL2hmc3BsdXMvaW9jdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDdhYTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvaGZzcGx1cy9pb2N0bC5jCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogIGxpbnV4L2ZzL2hmc3BsdXMvaW9jdGwuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMworICogRXRoYW4gQmVuc29uIDxlcmJlbnNvbkBhbGFza2EubmV0PgorICogcGFydGlhbGx5IGRlcml2ZWQgZnJvbSBsaW51eC9mcy9leHQyL2lvY3RsLmMKKyAqIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NQorICogUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQorICogTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqCisgKiBoZnNwbHVzIGlvY3RscworICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgveGF0dHIuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgImhmc3BsdXNfZnMuaCIKKworaW50IGhmc3BsdXNfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCSAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdW5zaWduZWQgaW50IGZsYWdzOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEhGU1BMVVNfSU9DX0VYVDJfR0VURkxBR1M6CisJCWZsYWdzID0gMDsKKwkJaWYgKEhGU1BMVVNfSShpbm9kZSkucm9vdGZsYWdzICYgSEZTUExVU19GTEdfSU1NVVRBQkxFKQorCQkJZmxhZ3MgfD0gRVhUMl9GTEFHX0lNTVVUQUJMRTsgLyogRVhUMl9JTU1VVEFCTEVfRkwgKi8KKwkJaWYgKEhGU1BMVVNfSShpbm9kZSkucm9vdGZsYWdzICYgSEZTUExVU19GTEdfQVBQRU5EKQorCQkJZmxhZ3MgfD0gRVhUMl9GTEFHX0FQUEVORDsgLyogRVhUMl9BUFBFTkRfRkwgKi8KKwkJaWYgKEhGU1BMVVNfSShpbm9kZSkudXNlcmZsYWdzICYgSEZTUExVU19GTEdfTk9EVU1QKQorCQkJZmxhZ3MgfD0gRVhUMl9GTEFHX05PRFVNUDsgLyogRVhUMl9OT0RVTVBfRkwgKi8KKwkJcmV0dXJuIHB1dF91c2VyKGZsYWdzLCAoaW50IF9fdXNlciAqKWFyZyk7CisJY2FzZSBIRlNQTFVTX0lPQ19FWFQyX1NFVEZMQUdTOiB7CisJCWlmIChJU19SRE9OTFkoaW5vZGUpKQorCQkJcmV0dXJuIC1FUk9GUzsKKworCQlpZiAoKGN1cnJlbnQtPmZzdWlkICE9IGlub2RlLT5pX3VpZCkgJiYgIWNhcGFibGUoQ0FQX0ZPV05FUikpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKworCQlpZiAoZ2V0X3VzZXIoZmxhZ3MsIChpbnQgX191c2VyICopYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChmbGFncyAmIChFWFQyX0ZMQUdfSU1NVVRBQkxFfEVYVDJfRkxBR19BUFBFTkQpIHx8CisJCSAgICBIRlNQTFVTX0koaW5vZGUpLnJvb3RmbGFncyAmIChIRlNQTFVTX0ZMR19JTU1VVEFCTEV8SEZTUExVU19GTEdfQVBQRU5EKSkgeworCQkJaWYgKCFjYXBhYmxlKENBUF9MSU5VWF9JTU1VVEFCTEUpKQorCQkJCXJldHVybiAtRVBFUk07CisJCX0KKworCQkvKiBkb24ndCBzaWxlbnRseSBpZ25vcmUgdW5zdXBwb3J0ZWQgZXh0MiBmbGFncyAqLworCQlpZiAoZmxhZ3MgJiB+KEVYVDJfRkxBR19JTU1VVEFCTEV8RVhUMl9GTEFHX0FQUEVORHwKKwkJCSAgICAgIEVYVDJfRkxBR19OT0RVTVApKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJCWlmIChmbGFncyAmIEVYVDJfRkxBR19JTU1VVEFCTEUpIHsgLyogRVhUMl9JTU1VVEFCTEVfRkwgKi8KKwkJCWlub2RlLT5pX2ZsYWdzIHw9IFNfSU1NVVRBQkxFOworCQkJSEZTUExVU19JKGlub2RlKS5yb290ZmxhZ3MgfD0gSEZTUExVU19GTEdfSU1NVVRBQkxFOworCQl9IGVsc2UgeworCQkJaW5vZGUtPmlfZmxhZ3MgJj0gflNfSU1NVVRBQkxFOworCQkJSEZTUExVU19JKGlub2RlKS5yb290ZmxhZ3MgJj0gfkhGU1BMVVNfRkxHX0lNTVVUQUJMRTsKKwkJfQorCQlpZiAoZmxhZ3MgJiBFWFQyX0ZMQUdfQVBQRU5EKSB7IC8qIEVYVDJfQVBQRU5EX0ZMICovCisJCQlpbm9kZS0+aV9mbGFncyB8PSBTX0FQUEVORDsKKwkJCUhGU1BMVVNfSShpbm9kZSkucm9vdGZsYWdzIHw9IEhGU1BMVVNfRkxHX0FQUEVORDsKKwkJfSBlbHNlIHsKKwkJCWlub2RlLT5pX2ZsYWdzICY9IH5TX0FQUEVORDsKKwkJCUhGU1BMVVNfSShpbm9kZSkucm9vdGZsYWdzICY9IH5IRlNQTFVTX0ZMR19BUFBFTkQ7CisJCX0KKwkJaWYgKGZsYWdzICYgRVhUMl9GTEFHX05PRFVNUCkgLyogRVhUMl9OT0RVTVBfRkwgKi8KKwkJCUhGU1BMVVNfSShpbm9kZSkudXNlcmZsYWdzIHw9IEhGU1BMVVNfRkxHX05PRFVNUDsKKwkJZWxzZQorCQkJSEZTUExVU19JKGlub2RlKS51c2VyZmxhZ3MgJj0gfkhGU1BMVVNfRkxHX05PRFVNUDsKKworCQlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQlyZXR1cm4gMDsKKwl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9UVFk7CisJfQorfQorCitpbnQgaGZzcGx1c19zZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSBmZDsKKwloZnNwbHVzX2NhdF9lbnRyeSBlbnRyeTsKKwlzdHJ1Y3QgaGZzcGx1c19jYXRfZmlsZSAqZmlsZTsKKwlpbnQgcmVzOworCisJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpIHx8IEhGU1BMVVNfSVNfUlNSQyhpbm9kZSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXJlcyA9IGhmc19maW5kX2luaXQoSEZTUExVU19TQihpbm9kZS0+aV9zYikuY2F0X3RyZWUsICZmZCk7CisJaWYgKHJlcykKKwkJcmV0dXJuIHJlczsKKwlyZXMgPSBoZnNwbHVzX2ZpbmRfY2F0KGlub2RlLT5pX3NiLCBpbm9kZS0+aV9pbm8sICZmZCk7CisJaWYgKHJlcykKKwkJZ290byBvdXQ7CisJaGZzX2Jub2RlX3JlYWQoZmQuYm5vZGUsICZlbnRyeSwgZmQuZW50cnlvZmZzZXQsCisJCQlzaXplb2Yoc3RydWN0IGhmc3BsdXNfY2F0X2ZpbGUpKTsKKwlmaWxlID0gJmVudHJ5LmZpbGU7CisKKwlpZiAoIXN0cmNtcChuYW1lLCAiaGZzLnR5cGUiKSkgeworCQlpZiAoc2l6ZSA9PSA0KQorCQkJbWVtY3B5KCZmaWxlLT51c2VyX2luZm8uZmRUeXBlLCB2YWx1ZSwgNCk7CisJCWVsc2UKKwkJCXJlcyA9IC1FUkFOR0U7CisJfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJoZnMuY3JlYXRvciIpKSB7CisJCWlmIChzaXplID09IDQpCisJCQltZW1jcHkoJmZpbGUtPnVzZXJfaW5mby5mZENyZWF0b3IsIHZhbHVlLCA0KTsKKwkJZWxzZQorCQkJcmVzID0gLUVSQU5HRTsKKwl9IGVsc2UKKwkJcmVzID0gLUVPUE5PVFNVUFA7CisJaWYgKCFyZXMpCisJCWhmc19ibm9kZV93cml0ZShmZC5ibm9kZSwgJmVudHJ5LCBmZC5lbnRyeW9mZnNldCwKKwkJCQlzaXplb2Yoc3RydWN0IGhmc3BsdXNfY2F0X2ZpbGUpKTsKK291dDoKKwloZnNfZmluZF9leGl0KCZmZCk7CisJcmV0dXJuIHJlczsKK30KKworc3NpemVfdCBoZnNwbHVzX2dldHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaGZzX2ZpbmRfZGF0YSBmZDsKKwloZnNwbHVzX2NhdF9lbnRyeSBlbnRyeTsKKwlzdHJ1Y3QgaGZzcGx1c19jYXRfZmlsZSAqZmlsZTsKKwlzc2l6ZV90IHJlcyA9IDA7CisKKwlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgfHwgSEZTUExVU19JU19SU1JDKGlub2RlKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKHNpemUpIHsKKwkJcmVzID0gaGZzX2ZpbmRfaW5pdChIRlNQTFVTX1NCKGlub2RlLT5pX3NiKS5jYXRfdHJlZSwgJmZkKTsKKwkJaWYgKHJlcykKKwkJCXJldHVybiByZXM7CisJCXJlcyA9IGhmc3BsdXNfZmluZF9jYXQoaW5vZGUtPmlfc2IsIGlub2RlLT5pX2lubywgJmZkKTsKKwkJaWYgKHJlcykKKwkJCWdvdG8gb3V0OworCQloZnNfYm5vZGVfcmVhZChmZC5ibm9kZSwgJmVudHJ5LCBmZC5lbnRyeW9mZnNldCwKKwkJCQlzaXplb2Yoc3RydWN0IGhmc3BsdXNfY2F0X2ZpbGUpKTsKKwl9CisJZmlsZSA9ICZlbnRyeS5maWxlOworCisJaWYgKCFzdHJjbXAobmFtZSwgImhmcy50eXBlIikpIHsKKwkJaWYgKHNpemUgPj0gNCkgeworCQkJbWVtY3B5KHZhbHVlLCAmZmlsZS0+dXNlcl9pbmZvLmZkVHlwZSwgNCk7CisJCQlyZXMgPSA0OworCQl9IGVsc2UKKwkJCXJlcyA9IHNpemUgPyAtRVJBTkdFIDogNDsKKwl9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgImhmcy5jcmVhdG9yIikpIHsKKwkJaWYgKHNpemUgPj0gNCkgeworCQkJbWVtY3B5KHZhbHVlLCAmZmlsZS0+dXNlcl9pbmZvLmZkQ3JlYXRvciwgNCk7CisJCQlyZXMgPSA0OworCQl9IGVsc2UKKwkJCXJlcyA9IHNpemUgPyAtRVJBTkdFIDogNDsKKwl9IGVsc2UKKwkJcmVzID0gLUVOT0RBVEE7CitvdXQ6CisJaWYgKHNpemUpCisJCWhmc19maW5kX2V4aXQoJmZkKTsKKwlyZXR1cm4gcmVzOworfQorCisjZGVmaW5lIEhGU1BMVVNfQVRUUkxJU1RfU0laRSAoc2l6ZW9mKCJoZnMuY3JlYXRvciIpK3NpemVvZigiaGZzLnR5cGUiKSkKKworc3NpemVfdCBoZnNwbHVzX2xpc3R4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKworCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSB8fCBIRlNQTFVTX0lTX1JTUkMoaW5vZGUpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoIWJ1ZmZlciB8fCAhc2l6ZSkKKwkJcmV0dXJuIEhGU1BMVVNfQVRUUkxJU1RfU0laRTsKKwlpZiAoc2l6ZSA8IEhGU1BMVVNfQVRUUkxJU1RfU0laRSkKKwkJcmV0dXJuIC1FUkFOR0U7CisJc3RyY3B5KGJ1ZmZlciwgImhmcy50eXBlIik7CisJc3RyY3B5KGJ1ZmZlciArIHNpemVvZigiaGZzLnR5cGUiKSwgImhmcy5jcmVhdG9yIik7CisKKwlyZXR1cm4gSEZTUExVU19BVFRSTElTVF9TSVpFOworfQpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy9vcHRpb25zLmMgYi9mcy9oZnNwbHVzL29wdGlvbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2NhMDEwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaGZzcGx1cy9vcHRpb25zLmMKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiAgbGludXgvZnMvaGZzcGx1cy9vcHRpb25zLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEKKyAqIEJyYWQgQm95ZXIgKGZsYXJAYWxsYW5kcmlhLmNvbSkKKyAqIChDKSAyMDAzIEFyZGlzIFRlY2hub2xvZ2llcyA8cm9tYW5AYXJkaXN0ZWNoLmNvbT4KKyAqCisgKiBPcHRpb24gcGFyc2luZworICovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgImhmc3BsdXNfZnMuaCIKKworZW51bSB7CisJb3B0X2NyZWF0b3IsIG9wdF90eXBlLAorCW9wdF91bWFzaywgb3B0X3VpZCwgb3B0X2dpZCwKKwlvcHRfcGFydCwgb3B0X3Nlc3Npb24sIG9wdF9ubHMsCisJb3B0X25vZGVjb21wb3NlLCBvcHRfZGVjb21wb3NlLAorCW9wdF9lcnIKK307CisKK3N0YXRpYyBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKKwl7IG9wdF9jcmVhdG9yLCAiY3JlYXRvcj0lcyIgfSwKKwl7IG9wdF90eXBlLCAidHlwZT0lcyIgfSwKKwl7IG9wdF91bWFzaywgInVtYXNrPSVvIiB9LAorCXsgb3B0X3VpZCwgInVpZD0ldSIgfSwKKwl7IG9wdF9naWQsICJnaWQ9JXUiIH0sCisJeyBvcHRfcGFydCwgInBhcnQ9JXUiIH0sCisJeyBvcHRfc2Vzc2lvbiwgInNlc3Npb249JXUiIH0sCisJeyBvcHRfbmxzLCAibmxzPSVzIiB9LAorCXsgb3B0X2RlY29tcG9zZSwgImRlY29tcG9zZSIgfSwKKwl7IG9wdF9ub2RlY29tcG9zZSwgIm5vZGVjb21wb3NlIiB9LAorCXsgb3B0X2VyciwgTlVMTCB9Cit9OworCisvKiBJbml0aWFsaXplIGFuIG9wdGlvbnMgb2JqZWN0IHRvIHJlYXNvbmFibGUgZGVmYXVsdHMgKi8KK3ZvaWQgZmlsbF9kZWZhdWx0cyhzdHJ1Y3QgaGZzcGx1c19zYl9pbmZvICpvcHRzKQoreworCWlmICghb3B0cykKKwkJcmV0dXJuOworCisJb3B0cy0+Y3JlYXRvciA9IEhGU1BMVVNfREVGX0NSX1RZUEU7CisJb3B0cy0+dHlwZSA9IEhGU1BMVVNfREVGX0NSX1RZUEU7CisJb3B0cy0+dW1hc2sgPSBjdXJyZW50LT5mcy0+dW1hc2s7CisJb3B0cy0+dWlkID0gY3VycmVudC0+dWlkOworCW9wdHMtPmdpZCA9IGN1cnJlbnQtPmdpZDsKKwlvcHRzLT5wYXJ0ID0gLTE7CisJb3B0cy0+c2Vzc2lvbiA9IC0xOworfQorCisvKiBjb252ZXJ0IGEgImZvdXIgYnl0ZSBjaGFyYWN0ZXIiIHRvIGEgMzIgYml0IGludCB3aXRoIGVycm9yIGNoZWNrcyAqLworc3RhdGljIGlubGluZSBpbnQgbWF0Y2hfZm91cmNoYXIoc3Vic3RyaW5nX3QgKmFyZywgdTMyICpyZXN1bHQpCit7CisJaWYgKGFyZy0+dG8gLSBhcmctPmZyb20gIT0gNCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbWVtY3B5KHJlc3VsdCwgYXJnLT5mcm9tLCA0KTsKKwlyZXR1cm4gMDsKK30KKworLyogUGFyc2Ugb3B0aW9ucyBmcm9tIG1vdW50LiBSZXR1cm5zIDAgb24gZmFpbHVyZSAqLworLyogaW5wdXQgaXMgdGhlIG9wdGlvbnMgcGFzc2VkIHRvIG1vdW50KCkgYXMgYSBzdHJpbmcgKi8KK2ludCBwYXJzZV9vcHRpb25zKGNoYXIgKmlucHV0LCBzdHJ1Y3QgaGZzcGx1c19zYl9pbmZvICpzYmkpCit7CisJY2hhciAqcDsKKwlzdWJzdHJpbmdfdCBhcmdzW01BWF9PUFRfQVJHU107CisJaW50IHRtcCwgdG9rZW47CisKKwlpZiAoIWlucHV0KQorCQlnb3RvIGRvbmU7CisKKwl3aGlsZSAoKHAgPSBzdHJzZXAoJmlucHV0LCAiLCIpKSAhPSBOVUxMKSB7CisJCWlmICghKnApCisJCQljb250aW51ZTsKKworCQl0b2tlbiA9IG1hdGNoX3Rva2VuKHAsIHRva2VucywgYXJncyk7CisJCXN3aXRjaCAodG9rZW4pIHsKKwkJY2FzZSBvcHRfY3JlYXRvcjoKKwkJCWlmIChtYXRjaF9mb3VyY2hhcigmYXJnc1swXSwgJnNiaS0+Y3JlYXRvcikpIHsKKwkJCQlwcmludGsoIkhGUystZnM6IGNyZWF0b3IgcmVxdWlyZXMgYSA0IGNoYXJhY3RlciB2YWx1ZVxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBvcHRfdHlwZToKKwkJCWlmIChtYXRjaF9mb3VyY2hhcigmYXJnc1swXSwgJnNiaS0+dHlwZSkpIHsKKwkJCQlwcmludGsoIkhGUystZnM6IHR5cGUgcmVxdWlyZXMgYSA0IGNoYXJhY3RlciB2YWx1ZVxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBvcHRfdW1hc2s6CisJCQlpZiAobWF0Y2hfb2N0YWwoJmFyZ3NbMF0sICZ0bXApKSB7CisJCQkJcHJpbnRrKCJIRlMrLWZzOiB1bWFzayByZXF1aXJlcyBhIHZhbHVlXG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXNiaS0+dW1hc2sgPSAodW1vZGVfdCl0bXA7CisJCQlicmVhazsKKwkJY2FzZSBvcHRfdWlkOgorCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJnRtcCkpIHsKKwkJCQlwcmludGsoIkhGUystZnM6IHVpZCByZXF1aXJlcyBhbiBhcmd1bWVudFxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlzYmktPnVpZCA9ICh1aWRfdCl0bXA7CisJCQlicmVhazsKKwkJY2FzZSBvcHRfZ2lkOgorCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJnRtcCkpIHsKKwkJCQlwcmludGsoIkhGUystZnM6IGdpZCByZXF1aXJlcyBhbiBhcmd1bWVudFxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlzYmktPmdpZCA9IChnaWRfdCl0bXA7CisJCQlicmVhazsKKwkJY2FzZSBvcHRfcGFydDoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZzYmktPnBhcnQpKSB7CisJCQkJcHJpbnRrKCJIRlMrLWZzOiBwYXJ0IHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIG9wdF9zZXNzaW9uOgorCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJnNiaS0+c2Vzc2lvbikpIHsKKwkJCQlwcmludGsoIkhGUystZnM6IHNlc3Npb24gcmVxdWlyZXMgYW4gYXJndW1lbnRcbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2Ugb3B0X25sczoKKwkJCWlmIChzYmktPm5scykgeworCQkJCXByaW50aygiSEZTKy1mczogdW5hYmxlIHRvIGNoYW5nZSBubHMgbWFwcGluZ1xuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlwID0gbWF0Y2hfc3RyZHVwKCZhcmdzWzBdKTsKKwkJCXNiaS0+bmxzID0gbG9hZF9ubHMocCk7CisJCQlpZiAoIXNiaS0+bmxzKSB7CisJCQkJcHJpbnRrKCJIRlMrLWZzOiB1bmFibGUgdG8gbG9hZCBubHMgbWFwcGluZyBcIiVzXCJcbiIsIHApOworCQkJCWtmcmVlKHApOworCQkJCXJldHVybiAwOworCQkJfQorCQkJa2ZyZWUocCk7CisJCQlicmVhazsKKwkJY2FzZSBvcHRfZGVjb21wb3NlOgorCQkJc2JpLT5mbGFncyAmPSB+SEZTUExVU19TQl9OT0RFQ09NUE9TRTsKKwkJCWJyZWFrOworCQljYXNlIG9wdF9ub2RlY29tcG9zZToKKwkJCXNiaS0+ZmxhZ3MgfD0gSEZTUExVU19TQl9OT0RFQ09NUE9TRTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKK2RvbmU6CisJaWYgKCFzYmktPm5scykgeworCQkvKiB0cnkgdXRmOCBmaXJzdCwgYXMgdGhpcyBpcyB0aGUgb2xkIGRlZmF1bHQgYmVoYXZpb3VyICovCisJCXNiaS0+bmxzID0gbG9hZF9ubHMoInV0ZjgiKTsKKwkJaWYgKCFzYmktPm5scykKKwkJCXNiaS0+bmxzID0gbG9hZF9ubHNfZGVmYXVsdCgpOworCQlpZiAoIXNiaS0+bmxzKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL3BhcnRfdGJsLmMgYi9mcy9oZnNwbHVzL3BhcnRfdGJsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU3ODMwNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmc3BsdXMvcGFydF90YmwuYwpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIGxpbnV4L2ZzL2hmcy9wYXJ0X3RibC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTE5OTcgIFBhdWwgSC4gSGFyZ3JvdmUKKyAqIFRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKyAqCisgKiBPcmlnaW5hbCBjb2RlIHRvIGhhbmRsZSB0aGUgbmV3IHN0eWxlIE1hYyBwYXJ0aXRpb24gdGFibGUgYmFzZWQgb24KKyAqIGEgcGF0Y2ggY29udHJpYnV0ZWQgYnkgSG9sZ2VyIFNjaGVtZWwgKGFlZ2xvc0B2YWxpbm9yLm93bC5kZSkuCisgKgorICogSW4gZnVuY3Rpb24gcHJlY29uZGl0aW9ucyB0aGUgdGVybSAidmFsaWQiIGFwcGxpZWQgdG8gYSBwb2ludGVyIHRvCisgKiBhIHN0cnVjdHVyZSBtZWFucyB0aGF0IHRoZSBwb2ludGVyIGlzIG5vbi1OVUxMIGFuZCB0aGUgc3RydWN0dXJlIGl0CisgKiBwb2ludHMgdG8gaGFzIGFsbCBmaWVsZHMgaW5pdGlhbGl6ZWQgdG8gY29uc2lzdGVudCB2YWx1ZXMuCisgKgorICovCisKKyNpbmNsdWRlICJoZnNwbHVzX2ZzLmgiCisKKy8qIG9mZnNldHMgdG8gdmFyaW91cyBibG9ja3MgKi8KKyNkZWZpbmUgSEZTX0REX0JMSwkJMCAvKiBEcml2ZXIgRGVzY3JpcHRvciBibG9jayAqLworI2RlZmluZSBIRlNfUE1BUF9CTEsJCTEgLyogRmlyc3QgYmxvY2sgb2YgcGFydGl0aW9uIG1hcCAqLworI2RlZmluZSBIRlNfTURCX0JMSwkJMiAvKiBCbG9jayAody9pIHBhcnRpdGlvbikgb2YgTURCICovCisKKy8qIG1hZ2ljIG51bWJlcnMgZm9yIHZhcmlvdXMgZGlzayBibG9ja3MgKi8KKyNkZWZpbmUgSEZTX0RSVlJfREVTQ19NQUdJQwkweDQ1NTIgLyogIkVSIjogZHJpdmVyIGRlc2NyaXB0b3IgbWFwICovCisjZGVmaW5lIEhGU19PTERfUE1BUF9NQUdJQwkweDU0NTMgLyogIlRTIjogb2xkLXR5cGUgcGFydGl0aW9uIG1hcCAqLworI2RlZmluZSBIRlNfTkVXX1BNQVBfTUFHSUMJMHg1MDREIC8qICJQTSI6IG5ldy10eXBlIHBhcnRpdGlvbiBtYXAgKi8KKyNkZWZpbmUgSEZTX1NVUEVSX01BR0lDCQkweDQyNDQgLyogIkJEIjogSEZTIE1EQiAoc3VwZXIgYmxvY2spICovCisjZGVmaW5lIEhGU19NRlNfU1VQRVJfTUFHSUMJMHhEMkQ3IC8qIE1GUyBNREIgKHN1cGVyIGJsb2NrKSAqLworCisvKgorICogVGhlIG5ldyBzdHlsZSBNYWMgcGFydGl0aW9uIG1hcAorICoKKyAqIEZvciBlYWNoIHBhcnRpdGlvbiBvbiB0aGUgbWVkaWEgdGhlcmUgaXMgYSBwaHlzaWNhbCBibG9jayAoNTEyLWJ5dGUKKyAqIGJsb2NrKSBjb250YWluaW5nIG9uZSBvZiB0aGVzZSBzdHJ1Y3R1cmVzLiAgVGhlc2UgYmxvY2tzIGFyZQorICogY29udGlndW91cyBzdGFydGluZyBhdCBibG9jayAxLgorICovCitzdHJ1Y3QgbmV3X3BtYXAgeworCV9fYmUxNglwbVNpZzsJCS8qIHNpZ25hdHVyZSAqLworCV9fYmUxNglyZVNpZ1BhZDsJLyogcGFkZGluZyAqLworCV9fYmUzMglwbU1hcEJsa0NudDsJLyogcGFydGl0aW9uIGJsb2NrcyBjb3VudCAqLworCV9fYmUzMglwbVB5UGFydFN0YXJ0OwkvKiBwaHlzaWNhbCBibG9jayBzdGFydCBvZiBwYXJ0aXRpb24gKi8KKwlfX2JlMzIJcG1QYXJ0QmxrQ250OwkvKiBwaHlzaWNhbCBibG9jayBjb3VudCBvZiBwYXJ0aXRpb24gKi8KKwl1OAlwbVBhcnROYW1lWzMyXTsJLyogKG51bGwgdGVybWluYXRlZD8pIHN0cmluZworCQkJCSAgIGdpdmluZyB0aGUgbmFtZSBvZiB0aGlzCisJCQkJICAgcGFydGl0aW9uICovCisJdTgJcG1QYXJ0VHlwZVszMl07CS8qIChudWxsIHRlcm1pbmF0ZWQ/KSBzdHJpbmcKKwkJCQkgICBnaXZpbmcgdGhlIHR5cGUgb2YgdGhpcworCQkJCSAgIHBhcnRpdGlvbiAqLworCS8qIGEgYnVuY2ggbW9yZSBzdHVmZiB3ZSBkb24ndCBuZWVkICovCit9IF9fcGFja2VkOworCisvKgorICogVGhlIG9sZCBzdHlsZSBNYWMgcGFydGl0aW9uIG1hcAorICoKKyAqIFRoZSBwYXJ0aXRpb24gbWFwIGNvbnNpc3RzIGZvciBhIDItYnl0ZSBzaWduYXR1cmUgZm9sbG93ZWQgYnkgYW4KKyAqIGFycmF5IG9mIHRoZXNlIHN0cnVjdHVyZXMuICBUaGUgbWFwIGlzIHRlcm1pbmF0ZWQgd2l0aCBhbiBhbGwtemVybworICogb25lIG9mIHRoZXNlLgorICovCitzdHJ1Y3Qgb2xkX3BtYXAgeworCV9fYmUxNgkJcGRTaWc7CS8qIFNpZ25hdHVyZSBieXRlcyAqLworCXN0cnVjdCAJb2xkX3BtYXBfZW50cnkgeworCQlfX2JlMzIJcGRTdGFydDsKKwkJX19iZTMyCXBkU2l6ZTsKKwkJX19iZTMyCXBkRlNJRDsKKwl9CXBkRW50cnlbNDJdOworfSBfX3BhY2tlZDsKKworLyoKKyAqIGhmc19wYXJ0X2ZpbmQoKQorICoKKyAqIFBhcnNlIHRoZSBwYXJ0aXRpb24gbWFwIGxvb2tpbmcgZm9yIHRoZQorICogc3RhcnQgYW5kIGxlbmd0aCBvZiB0aGUgJ3BhcnQndGggSEZTIHBhcnRpdGlvbi4KKyAqLworaW50IGhmc19wYXJ0X2ZpbmQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJICBzZWN0b3JfdCAqcGFydF9zdGFydCwgc2VjdG9yX3QgKnBhcnRfc2l6ZSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCV9fYmUxNiAqZGF0YTsKKwlpbnQgaSwgc2l6ZSwgcmVzOworCisJcmVzID0gLUVOT0VOVDsKKwliaCA9IHNiX2JyZWFkNTEyKHNiLCAqcGFydF9zdGFydCArIEhGU19QTUFQX0JMSywgZGF0YSk7CisJaWYgKCFiaCkKKwkJcmV0dXJuIC1FSU87CisKKwlzd2l0Y2ggKGJlMTZfdG9fY3B1KCpkYXRhKSkgeworCWNhc2UgSEZTX09MRF9QTUFQX01BR0lDOgorCSAgeworCQlzdHJ1Y3Qgb2xkX3BtYXAgKnBtOworCQlzdHJ1Y3Qgb2xkX3BtYXBfZW50cnkgKnA7CisKKwkJcG0gPSAoc3RydWN0IG9sZF9wbWFwICopYmgtPmJfZGF0YTsKKwkJcCA9IHBtLT5wZEVudHJ5OworCQlzaXplID0gNDI7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplOyBwKyssIGkrKykgeworCQkJaWYgKHAtPnBkU3RhcnQgJiYgcC0+cGRTaXplICYmCisJCQkgICAgcC0+cGRGU0lEID09IGNwdV90b19iZTMyKDB4NTQ0NjUzMzEpLyoiVEZTMSIqLyAmJgorCQkJICAgIChIRlNQTFVTX1NCKHNiKS5wYXJ0IDwgMCB8fCBIRlNQTFVTX1NCKHNiKS5wYXJ0ID09IGkpKSB7CisJCQkJKnBhcnRfc3RhcnQgKz0gYmUzMl90b19jcHUocC0+cGRTdGFydCk7CisJCQkJKnBhcnRfc2l6ZSA9IGJlMzJfdG9fY3B1KHAtPnBkU2l6ZSk7CisJCQkJcmVzID0gMDsKKwkJCX0KKwkJfQorCQlicmVhazsKKwkgIH0KKwljYXNlIEhGU19ORVdfUE1BUF9NQUdJQzoKKwkgIHsKKwkJc3RydWN0IG5ld19wbWFwICpwbTsKKworCQlwbSA9IChzdHJ1Y3QgbmV3X3BtYXAgKiliaC0+Yl9kYXRhOworCQlzaXplID0gYmUzMl90b19jcHUocG0tPnBtTWFwQmxrQ250KTsKKwkJZm9yIChpID0gMDsgaSA8IHNpemU7KSB7CisJCQlpZiAoIW1lbWNtcChwbS0+cG1QYXJ0VHlwZSwiQXBwbGVfSEZTIiwgOSkgJiYKKwkJCSAgICAoSEZTUExVU19TQihzYikucGFydCA8IDAgfHwgSEZTUExVU19TQihzYikucGFydCA9PSBpKSkgeworCQkJCSpwYXJ0X3N0YXJ0ICs9IGJlMzJfdG9fY3B1KHBtLT5wbVB5UGFydFN0YXJ0KTsKKwkJCQkqcGFydF9zaXplID0gYmUzMl90b19jcHUocG0tPnBtUGFydEJsa0NudCk7CisJCQkJcmVzID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWxzZShiaCk7CisJCQliaCA9IHNiX2JyZWFkNTEyKHNiLCAqcGFydF9zdGFydCArIEhGU19QTUFQX0JMSyArICsraSwgcG0pOworCQkJaWYgKCFiaCkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCWlmIChwbS0+cG1TaWcgIT0gY3B1X3RvX2JlMTYoSEZTX05FV19QTUFQX01BR0lDKSkKKwkJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwkgIH0KKwl9CisJYnJlbHNlKGJoKTsKKworCXJldHVybiByZXM7Cit9CmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL3N1cGVyLmMgYi9mcy9oZnNwbHVzL3N1cGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY4MDQ0NgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmc3BsdXMvc3VwZXIuYwpAQCAtMCwwICsxLDUwMiBAQAorLyoKKyAqICBsaW51eC9mcy9oZnNwbHVzL3N1cGVyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEKKyAqIEJyYWQgQm95ZXIgKGZsYXJAYWxsYW5kcmlhLmNvbSkKKyAqIChDKSAyMDAzIEFyZGlzIFRlY2hub2xvZ2llcyA8cm9tYW5AYXJkaXN0ZWNoLmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmhmc3BsdXNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CitzdGF0aWMgdm9pZCBoZnNwbHVzX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CisKKyNpbmNsdWRlICJoZnNwbHVzX2ZzLmgiCisKK3ZvaWQgaGZzcGx1c19pbm9kZV9jaGVjayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworI2lmIDAKKwl1MzIgY250ID0gYXRvbWljX3JlYWQoJkhGU1BMVVNfU0Ioc2IpLmlub2RlX2NudCk7CisJdTMyIGxhc3RfY250ID0gSEZTUExVU19TQihzYikubGFzdF9pbm9kZV9jbnQ7CisKKwlpZiAoY250IDw9IChsYXN0X2NudCAvIDIpIHx8CisJICAgIGNudCA+PSAobGFzdF9jbnQgKiAyKSkgeworCQlIRlNQTFVTX1NCKHNiKS5sYXN0X2lub2RlX2NudCA9IGNudDsKKwkJcHJpbnRrKCJpbm9kZV9jaGVjazogJXUsJXUsJXVcbiIsIGNudCwgbGFzdF9jbnQsCisJCQlIRlNQTFVTX1NCKHNiKS5jYXRfdHJlZSA/IEhGU1BMVVNfU0Ioc2IpLmNhdF90cmVlLT5ub2RlX2hhc2hfY250IDogMCk7CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGhmc3BsdXNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBoZnNfZmluZF9kYXRhIGZkOworCXN0cnVjdCBoZnNwbHVzX3ZoICp2aGRyOworCWludCBlcnI7CisKKwlhdG9taWNfaW5jKCZIRlNQTFVTX1NCKGlub2RlLT5pX3NiKS5pbm9kZV9jbnQpOworCWhmc3BsdXNfaW5vZGVfY2hlY2soaW5vZGUtPmlfc2IpOworCUlOSVRfTElTVF9IRUFEKCZIRlNQTFVTX0koaW5vZGUpLm9wZW5fZGlyX2xpc3QpOworCWluaXRfTVVURVgoJkhGU1BMVVNfSShpbm9kZSkuZXh0ZW50c19sb2NrKTsKKwlIRlNQTFVTX0koaW5vZGUpLmZsYWdzID0gMDsKKwlIRlNQTFVTX0koaW5vZGUpLnJzcmNfaW5vZGUgPSBOVUxMOworCisJaWYgKGlub2RlLT5pX2lubyA+PSBIRlNQTFVTX0ZJUlNUVVNFUl9DTklEKSB7CisJcmVhZF9pbm9kZToKKwkJaGZzX2ZpbmRfaW5pdChIRlNQTFVTX1NCKGlub2RlLT5pX3NiKS5jYXRfdHJlZSwgJmZkKTsKKwkJZXJyID0gaGZzcGx1c19maW5kX2NhdChpbm9kZS0+aV9zYiwgaW5vZGUtPmlfaW5vLCAmZmQpOworCQlpZiAoIWVycikKKwkJCWVyciA9IGhmc3BsdXNfY2F0X3JlYWRfaW5vZGUoaW5vZGUsICZmZCk7CisJCWhmc19maW5kX2V4aXQoJmZkKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gYmFkX2lub2RlOworCQlyZXR1cm47CisJfQorCXZoZHIgPSBIRlNQTFVTX1NCKGlub2RlLT5pX3NiKS5zX3ZoZHI7CisJc3dpdGNoKGlub2RlLT5pX2lubykgeworCWNhc2UgSEZTUExVU19ST09UX0NOSUQ6CisJCWdvdG8gcmVhZF9pbm9kZTsKKwljYXNlIEhGU1BMVVNfRVhUX0NOSUQ6CisJCWhmc3BsdXNfaW5vZGVfcmVhZF9mb3JrKGlub2RlLCAmdmhkci0+ZXh0X2ZpbGUpOworCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZoZnNwbHVzX2J0cmVlX2FvcHM7CisJCWJyZWFrOworCWNhc2UgSEZTUExVU19DQVRfQ05JRDoKKwkJaGZzcGx1c19pbm9kZV9yZWFkX2ZvcmsoaW5vZGUsICZ2aGRyLT5jYXRfZmlsZSk7CisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmhmc3BsdXNfYnRyZWVfYW9wczsKKwkJYnJlYWs7CisJY2FzZSBIRlNQTFVTX0FMTE9DX0NOSUQ6CisJCWhmc3BsdXNfaW5vZGVfcmVhZF9mb3JrKGlub2RlLCAmdmhkci0+YWxsb2NfZmlsZSk7CisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmhmc3BsdXNfYW9wczsKKwkJYnJlYWs7CisJY2FzZSBIRlNQTFVTX1NUQVJUX0NOSUQ6CisJCWhmc3BsdXNfaW5vZGVfcmVhZF9mb3JrKGlub2RlLCAmdmhkci0+c3RhcnRfZmlsZSk7CisJCWJyZWFrOworCWNhc2UgSEZTUExVU19BVFRSX0NOSUQ6CisJCWhmc3BsdXNfaW5vZGVfcmVhZF9mb3JrKGlub2RlLCAmdmhkci0+YXR0cl9maWxlKTsKKwkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmaGZzcGx1c19idHJlZV9hb3BzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlnb3RvIGJhZF9pbm9kZTsKKwl9CisKKwlyZXR1cm47CisKKyBiYWRfaW5vZGU6CisJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworfQorCitzdGF0aWMgaW50IGhmc3BsdXNfd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHVudXNlZCkKK3sKKwlzdHJ1Y3QgaGZzcGx1c192aCAqdmhkcjsKKwlpbnQgcmV0ID0gMDsKKworCWRwcmludChEQkdfSU5PREUsICJoZnNwbHVzX3dyaXRlX2lub2RlOiAlbHVcbiIsIGlub2RlLT5pX2lubyk7CisJaGZzcGx1c19leHRfd3JpdGVfZXh0ZW50KGlub2RlKTsKKwlpZiAoaW5vZGUtPmlfaW5vID49IEhGU1BMVVNfRklSU1RVU0VSX0NOSUQpIHsKKwkJcmV0dXJuIGhmc3BsdXNfY2F0X3dyaXRlX2lub2RlKGlub2RlKTsKKwl9CisJdmhkciA9IEhGU1BMVVNfU0IoaW5vZGUtPmlfc2IpLnNfdmhkcjsKKwlzd2l0Y2ggKGlub2RlLT5pX2lubykgeworCWNhc2UgSEZTUExVU19ST09UX0NOSUQ6CisJCXJldCA9IGhmc3BsdXNfY2F0X3dyaXRlX2lub2RlKGlub2RlKTsKKwkJYnJlYWs7CisJY2FzZSBIRlNQTFVTX0VYVF9DTklEOgorCQlpZiAodmhkci0+ZXh0X2ZpbGUudG90YWxfc2l6ZSAhPSBjcHVfdG9fYmU2NChpbm9kZS0+aV9zaXplKSkgeworCQkJSEZTUExVU19TQihpbm9kZS0+aV9zYikuZmxhZ3MgfD0gSEZTUExVU19TQl9XUklURUJBQ0tVUDsKKwkJCWlub2RlLT5pX3NiLT5zX2RpcnQgPSAxOworCQl9CisJCWhmc3BsdXNfaW5vZGVfd3JpdGVfZm9yayhpbm9kZSwgJnZoZHItPmV4dF9maWxlKTsKKwkJaGZzX2J0cmVlX3dyaXRlKEhGU1BMVVNfU0IoaW5vZGUtPmlfc2IpLmV4dF90cmVlKTsKKwkJYnJlYWs7CisJY2FzZSBIRlNQTFVTX0NBVF9DTklEOgorCQlpZiAodmhkci0+Y2F0X2ZpbGUudG90YWxfc2l6ZSAhPSBjcHVfdG9fYmU2NChpbm9kZS0+aV9zaXplKSkgeworCQkJSEZTUExVU19TQihpbm9kZS0+aV9zYikuZmxhZ3MgfD0gSEZTUExVU19TQl9XUklURUJBQ0tVUDsKKwkJCWlub2RlLT5pX3NiLT5zX2RpcnQgPSAxOworCQl9CisJCWhmc3BsdXNfaW5vZGVfd3JpdGVfZm9yayhpbm9kZSwgJnZoZHItPmNhdF9maWxlKTsKKwkJaGZzX2J0cmVlX3dyaXRlKEhGU1BMVVNfU0IoaW5vZGUtPmlfc2IpLmNhdF90cmVlKTsKKwkJYnJlYWs7CisJY2FzZSBIRlNQTFVTX0FMTE9DX0NOSUQ6CisJCWlmICh2aGRyLT5hbGxvY19maWxlLnRvdGFsX3NpemUgIT0gY3B1X3RvX2JlNjQoaW5vZGUtPmlfc2l6ZSkpIHsKKwkJCUhGU1BMVVNfU0IoaW5vZGUtPmlfc2IpLmZsYWdzIHw9IEhGU1BMVVNfU0JfV1JJVEVCQUNLVVA7CisJCQlpbm9kZS0+aV9zYi0+c19kaXJ0ID0gMTsKKwkJfQorCQloZnNwbHVzX2lub2RlX3dyaXRlX2ZvcmsoaW5vZGUsICZ2aGRyLT5hbGxvY19maWxlKTsKKwkJYnJlYWs7CisJY2FzZSBIRlNQTFVTX1NUQVJUX0NOSUQ6CisJCWlmICh2aGRyLT5zdGFydF9maWxlLnRvdGFsX3NpemUgIT0gY3B1X3RvX2JlNjQoaW5vZGUtPmlfc2l6ZSkpIHsKKwkJCUhGU1BMVVNfU0IoaW5vZGUtPmlfc2IpLmZsYWdzIHw9IEhGU1BMVVNfU0JfV1JJVEVCQUNLVVA7CisJCQlpbm9kZS0+aV9zYi0+c19kaXJ0ID0gMTsKKwkJfQorCQloZnNwbHVzX2lub2RlX3dyaXRlX2ZvcmsoaW5vZGUsICZ2aGRyLT5zdGFydF9maWxlKTsKKwkJYnJlYWs7CisJY2FzZSBIRlNQTFVTX0FUVFJfQ05JRDoKKwkJaWYgKHZoZHItPmF0dHJfZmlsZS50b3RhbF9zaXplICE9IGNwdV90b19iZTY0KGlub2RlLT5pX3NpemUpKSB7CisJCQlIRlNQTFVTX1NCKGlub2RlLT5pX3NiKS5mbGFncyB8PSBIRlNQTFVTX1NCX1dSSVRFQkFDS1VQOworCQkJaW5vZGUtPmlfc2ItPnNfZGlydCA9IDE7CisJCX0KKwkJaGZzcGx1c19pbm9kZV93cml0ZV9mb3JrKGlub2RlLCAmdmhkci0+YXR0cl9maWxlKTsKKwkJaGZzX2J0cmVlX3dyaXRlKEhGU1BMVVNfU0IoaW5vZGUtPmlfc2IpLmF0dHJfdHJlZSk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBoZnNwbHVzX2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJZHByaW50KERCR19JTk9ERSwgImhmc3BsdXNfY2xlYXJfaW5vZGU6ICVsdVxuIiwgaW5vZGUtPmlfaW5vKTsKKwlhdG9taWNfZGVjKCZIRlNQTFVTX1NCKGlub2RlLT5pX3NiKS5pbm9kZV9jbnQpOworCWlmIChIRlNQTFVTX0lTX1JTUkMoaW5vZGUpKSB7CisJCUhGU1BMVVNfSShIRlNQTFVTX0koaW5vZGUpLnJzcmNfaW5vZGUpLnJzcmNfaW5vZGUgPSBOVUxMOworCQlpcHV0KEhGU1BMVVNfSShpbm9kZSkucnNyY19pbm9kZSk7CisJfQorCWhmc3BsdXNfaW5vZGVfY2hlY2soaW5vZGUtPmlfc2IpOworfQorCitzdGF0aWMgdm9pZCBoZnNwbHVzX3dyaXRlX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGhmc3BsdXNfdmggKnZoZHIgPSBIRlNQTFVTX1NCKHNiKS5zX3ZoZHI7CisKKwlkcHJpbnQoREJHX1NVUEVSLCAiaGZzcGx1c193cml0ZV9zdXBlclxuIik7CisJc2ItPnNfZGlydCA9IDA7CisJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQorCQkvKiB3YXJuPyAqLworCQlyZXR1cm47CisKKwl2aGRyLT5mcmVlX2Jsb2NrcyA9IGNwdV90b19iZTMyKEhGU1BMVVNfU0Ioc2IpLmZyZWVfYmxvY2tzKTsKKwl2aGRyLT5uZXh0X2FsbG9jID0gY3B1X3RvX2JlMzIoSEZTUExVU19TQihzYikubmV4dF9hbGxvYyk7CisJdmhkci0+bmV4dF9jbmlkID0gY3B1X3RvX2JlMzIoSEZTUExVU19TQihzYikubmV4dF9jbmlkKTsKKwl2aGRyLT5mb2xkZXJfY291bnQgPSBjcHVfdG9fYmUzMihIRlNQTFVTX1NCKHNiKS5mb2xkZXJfY291bnQpOworCXZoZHItPmZpbGVfY291bnQgPSBjcHVfdG9fYmUzMihIRlNQTFVTX1NCKHNiKS5maWxlX2NvdW50KTsKKworCW1hcmtfYnVmZmVyX2RpcnR5KEhGU1BMVVNfU0Ioc2IpLnNfdmhiaCk7CisJaWYgKEhGU1BMVVNfU0Ioc2IpLmZsYWdzICYgSEZTUExVU19TQl9XUklURUJBQ0tVUCkgeworCQlpZiAoSEZTUExVU19TQihzYikuc2VjdF9jb3VudCkgeworCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwkJCXUzMiBibG9jaywgb2Zmc2V0OworCisJCQlibG9jayA9IEhGU1BMVVNfU0Ioc2IpLmJsb2Nrb2Zmc2V0OworCQkJYmxvY2sgKz0gKEhGU1BMVVNfU0Ioc2IpLnNlY3RfY291bnQgLSAyKSA+PiAoc2ItPnNfYmxvY2tzaXplX2JpdHMgLSA5KTsKKwkJCW9mZnNldCA9ICgoSEZTUExVU19TQihzYikuc2VjdF9jb3VudCAtIDIpIDw8IDkpICYgKHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpOworCQkJcHJpbnRrKCJiYWNrdXA6ICV1LCV1LCV1LCV1XG4iLCBIRlNQTFVTX1NCKHNiKS5ibG9ja29mZnNldCwKKwkJCQlIRlNQTFVTX1NCKHNiKS5zZWN0X2NvdW50LCBibG9jaywgb2Zmc2V0KTsKKwkJCWJoID0gc2JfYnJlYWQoc2IsIGJsb2NrKTsKKwkJCWlmIChiaCkgeworCQkJCXZoZHIgPSAoc3RydWN0IGhmc3BsdXNfdmggKikoYmgtPmJfZGF0YSArIG9mZnNldCk7CisJCQkJaWYgKGJlMTZfdG9fY3B1KHZoZHItPnNpZ25hdHVyZSkgPT0gSEZTUExVU19WT0xIRUFEX1NJRykgeworCQkJCQltZW1jcHkodmhkciwgSEZTUExVU19TQihzYikuc192aGRyLCBzaXplb2YoKnZoZHIpKTsKKwkJCQkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQkJCQlicmVsc2UoYmgpOworCQkJCX0gZWxzZQorCQkJCQlwcmludGsoImJhY2t1cCBub3QgZm91bmQhXG4iKTsKKwkJCX0KKwkJfQorCQlIRlNQTFVTX1NCKHNiKS5mbGFncyAmPSB+SEZTUExVU19TQl9XUklURUJBQ0tVUDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGhmc3BsdXNfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJZHByaW50KERCR19TVVBFUiwgImhmc3BsdXNfcHV0X3N1cGVyXG4iKTsKKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJc3RydWN0IGhmc3BsdXNfdmggKnZoZHIgPSBIRlNQTFVTX1NCKHNiKS5zX3ZoZHI7CisKKwkJdmhkci0+bW9kaWZ5X2RhdGUgPSBoZnNwX25vdzJtdCgpOworCQl2aGRyLT5hdHRyaWJ1dGVzIHw9IGNwdV90b19iZTMyKEhGU1BMVVNfVk9MX1VOTU5UKTsKKwkJdmhkci0+YXR0cmlidXRlcyAmPSBjcHVfdG9fYmUzMih+SEZTUExVU19WT0xfSU5DTlNUTlQpOworCQltYXJrX2J1ZmZlcl9kaXJ0eShIRlNQTFVTX1NCKHNiKS5zX3ZoYmgpOworCQlsbF9yd19ibG9jayhXUklURSwgMSwgJkhGU1BMVVNfU0Ioc2IpLnNfdmhiaCk7CisJCXdhaXRfb25fYnVmZmVyKEhGU1BMVVNfU0Ioc2IpLnNfdmhiaCk7CisJfQorCisJaGZzX2J0cmVlX2Nsb3NlKEhGU1BMVVNfU0Ioc2IpLmNhdF90cmVlKTsKKwloZnNfYnRyZWVfY2xvc2UoSEZTUExVU19TQihzYikuZXh0X3RyZWUpOworCWlwdXQoSEZTUExVU19TQihzYikuYWxsb2NfZmlsZSk7CisJaXB1dChIRlNQTFVTX1NCKHNiKS5oaWRkZW5fZGlyKTsKKwlicmVsc2UoSEZTUExVU19TQihzYikuc192aGJoKTsKKwlpZiAoSEZTUExVU19TQihzYikubmxzKQorCQl1bmxvYWRfbmxzKEhGU1BMVVNfU0Ioc2IpLm5scyk7Cit9CisKK3N0YXRpYyBpbnQgaGZzcGx1c19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK3sKKwlidWYtPmZfdHlwZSA9IEhGU1BMVVNfU1VQRVJfTUFHSUM7CisJYnVmLT5mX2JzaXplID0gc2ItPnNfYmxvY2tzaXplOworCWJ1Zi0+Zl9ibG9ja3MgPSBIRlNQTFVTX1NCKHNiKS50b3RhbF9ibG9ja3MgPDwgSEZTUExVU19TQihzYikuZnNfc2hpZnQ7CisJYnVmLT5mX2JmcmVlID0gSEZTUExVU19TQihzYikuZnJlZV9ibG9ja3MgPDwgSEZTUExVU19TQihzYikuZnNfc2hpZnQ7CisJYnVmLT5mX2JhdmFpbCA9IGJ1Zi0+Zl9iZnJlZTsKKwlidWYtPmZfZmlsZXMgPSAweEZGRkZGRkZGOworCWJ1Zi0+Zl9mZnJlZSA9IDB4RkZGRkZGRkYgLSBIRlNQTFVTX1NCKHNiKS5uZXh0X2NuaWQ7CisJYnVmLT5mX25hbWVsZW4gPSBIRlNQTFVTX01BWF9TVFJMRU47CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZnNwbHVzX3JlbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50ICpmbGFncywgY2hhciAqZGF0YSkKK3sKKwlpZiAoKCpmbGFncyAmIE1TX1JET05MWSkgPT0gKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkKKwkJcmV0dXJuIDA7CisJaWYgKCEoKmZsYWdzICYgTVNfUkRPTkxZKSkgeworCQlzdHJ1Y3QgaGZzcGx1c192aCAqdmhkciA9IEhGU1BMVVNfU0Ioc2IpLnNfdmhkcjsKKworCQlpZiAoISh2aGRyLT5hdHRyaWJ1dGVzICYgY3B1X3RvX2JlMzIoSEZTUExVU19WT0xfVU5NTlQpKSkgeworCQkJcHJpbnRrKCJIRlMrLWZzIHdhcm5pbmc6IEZpbGVzeXN0ZW0gd2FzIG5vdCBjbGVhbmx5IHVubW91bnRlZCwgIgorCQkJICAgICAgICJydW5uaW5nIGZzY2suaGZzcGx1cyBpcyByZWNvbW1lbmRlZC4gIGxlYXZpbmcgcmVhZC1vbmx5LlxuIik7CisJCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CisJCQkqZmxhZ3MgfD0gTVNfUkRPTkxZOworCQl9IGVsc2UgaWYgKHZoZHItPmF0dHJpYnV0ZXMgJiBjcHVfdG9fYmUzMihIRlNQTFVTX1ZPTF9TT0ZUTE9DSykpIHsKKwkJCXByaW50aygiSEZTKy1mczogRmlsZXN5c3RlbSBpcyBtYXJrZWQgbG9ja2VkLCBsZWF2aW5nIHJlYWQtb25seS5cbiIpOworCQkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCQkJKmZsYWdzIHw9IE1TX1JET05MWTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGhmc3BsdXNfc29wcyA9IHsKKwkuYWxsb2NfaW5vZGUJPSBoZnNwbHVzX2FsbG9jX2lub2RlLAorCS5kZXN0cm95X2lub2RlCT0gaGZzcGx1c19kZXN0cm95X2lub2RlLAorCS5yZWFkX2lub2RlCT0gaGZzcGx1c19yZWFkX2lub2RlLAorCS53cml0ZV9pbm9kZQk9IGhmc3BsdXNfd3JpdGVfaW5vZGUsCisJLmNsZWFyX2lub2RlCT0gaGZzcGx1c19jbGVhcl9pbm9kZSwKKwkucHV0X3N1cGVyCT0gaGZzcGx1c19wdXRfc3VwZXIsCisJLndyaXRlX3N1cGVyCT0gaGZzcGx1c193cml0ZV9zdXBlciwKKwkuc3RhdGZzCQk9IGhmc3BsdXNfc3RhdGZzLAorCS5yZW1vdW50X2ZzCT0gaGZzcGx1c19yZW1vdW50LAorfTsKKworc3RhdGljIGludCBoZnNwbHVzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgaGZzcGx1c192aCAqdmhkcjsKKwlzdHJ1Y3QgaGZzcGx1c19zYl9pbmZvICpzYmk7CisJaGZzcGx1c19jYXRfZW50cnkgZW50cnk7CisJc3RydWN0IGhmc19maW5kX2RhdGEgZmQ7CisJc3RydWN0IGlub2RlICpyb290OworCXN0cnVjdCBxc3RyIHN0cjsKKwlzdHJ1Y3QgbmxzX3RhYmxlICpubHMgPSBOVUxMOworCWludCBlcnIgPSAtRUlOVkFMOworCisJc2JpID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGhmc3BsdXNfc2JfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghc2JpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChzYmksIDAsIHNpemVvZihIRlNQTFVTX1NCKHNiKSkpOworCXNiLT5zX2ZzX2luZm8gPSBzYmk7CisJSU5JVF9ITElTVF9IRUFEKCZzYmktPnJzcmNfaW5vZGVzKTsKKwlmaWxsX2RlZmF1bHRzKHNiaSk7CisJaWYgKCFwYXJzZV9vcHRpb25zKGRhdGEsIHNiaSkpIHsKKwkJaWYgKCFzaWxlbnQpCisJCQlwcmludGsoIkhGUystZnM6IHVuYWJsZSB0byBwYXJzZSBtb3VudCBvcHRpb25zXG4iKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIHRlbXBvcmFyaWx5IHVzZSB1dGY4IHRvIGNvcnJlY3RseSBmaW5kIHRoZSBoaWRkZW4gZGlyIGJlbG93ICovCisJbmxzID0gc2JpLT5ubHM7CisJc2JpLT5ubHMgPSBsb2FkX25scygidXRmOCIpOworCWlmICghbmxzKSB7CisJCXByaW50aygiSEZTKzogdW5hYmxlIHRvIGxvYWQgbmxzIGZvciB1dGY4XG4iKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIEdyYWIgdGhlIHZvbHVtZSBoZWFkZXIgKi8KKwlpZiAoaGZzcGx1c19yZWFkX3dyYXBwZXIoc2IpKSB7CisJCWlmICghc2lsZW50KQorCQkJcHJpbnRrKCJIRlMrLWZzOiB1bmFibGUgdG8gZmluZCBIRlMrIHN1cGVyYmxvY2tcbiIpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGNsZWFudXA7CisJfQorCXZoZHIgPSBIRlNQTFVTX1NCKHNiKS5zX3ZoZHI7CisKKwkvKiBDb3B5IHBhcnRzIG9mIHRoZSB2b2x1bWUgaGVhZGVyIGludG8gdGhlIHN1cGVyYmxvY2sgKi8KKwlzYi0+c19tYWdpYyA9IGJlMTZfdG9fY3B1KHZoZHItPnNpZ25hdHVyZSk7CisJaWYgKGJlMTZfdG9fY3B1KHZoZHItPnZlcnNpb24pICE9IEhGU1BMVVNfQ1VSUkVOVF9WRVJTSU9OKSB7CisJCWlmICghc2lsZW50KQorCQkJcHJpbnRrKCJIRlMrLWZzOiB3cm9uZyBmaWxlc3lzdGVtIHZlcnNpb25cbiIpOworCQlnb3RvIGNsZWFudXA7CisJfQorCUhGU1BMVVNfU0Ioc2IpLnRvdGFsX2Jsb2NrcyA9IGJlMzJfdG9fY3B1KHZoZHItPnRvdGFsX2Jsb2Nrcyk7CisJSEZTUExVU19TQihzYikuZnJlZV9ibG9ja3MgPSBiZTMyX3RvX2NwdSh2aGRyLT5mcmVlX2Jsb2Nrcyk7CisJSEZTUExVU19TQihzYikubmV4dF9hbGxvYyA9IGJlMzJfdG9fY3B1KHZoZHItPm5leHRfYWxsb2MpOworCUhGU1BMVVNfU0Ioc2IpLm5leHRfY25pZCA9IGJlMzJfdG9fY3B1KHZoZHItPm5leHRfY25pZCk7CisJSEZTUExVU19TQihzYikuZmlsZV9jb3VudCA9IGJlMzJfdG9fY3B1KHZoZHItPmZpbGVfY291bnQpOworCUhGU1BMVVNfU0Ioc2IpLmZvbGRlcl9jb3VudCA9IGJlMzJfdG9fY3B1KHZoZHItPmZvbGRlcl9jb3VudCk7CisJSEZTUExVU19TQihzYikuZGF0YV9jbHVtcF9ibG9ja3MgPSBiZTMyX3RvX2NwdSh2aGRyLT5kYXRhX2NsdW1wX3N6KSA+PiBIRlNQTFVTX1NCKHNiKS5hbGxvY19ibGtzel9zaGlmdDsKKwlpZiAoIUhGU1BMVVNfU0Ioc2IpLmRhdGFfY2x1bXBfYmxvY2tzKQorCQlIRlNQTFVTX1NCKHNiKS5kYXRhX2NsdW1wX2Jsb2NrcyA9IDE7CisJSEZTUExVU19TQihzYikucnNyY19jbHVtcF9ibG9ja3MgPSBiZTMyX3RvX2NwdSh2aGRyLT5yc3JjX2NsdW1wX3N6KSA+PiBIRlNQTFVTX1NCKHNiKS5hbGxvY19ibGtzel9zaGlmdDsKKwlpZiAoIUhGU1BMVVNfU0Ioc2IpLnJzcmNfY2x1bXBfYmxvY2tzKQorCQlIRlNQTFVTX1NCKHNiKS5yc3JjX2NsdW1wX2Jsb2NrcyA9IDE7CisKKwkvKiBTZXQgdXAgb3BlcmF0aW9ucyBzbyB3ZSBjYW4gbG9hZCBtZXRhZGF0YSAqLworCXNiLT5zX29wID0gJmhmc3BsdXNfc29wczsKKwlzYi0+c19tYXhieXRlcyA9IE1BWF9MRlNfRklMRVNJWkU7CisKKwlpZiAoISh2aGRyLT5hdHRyaWJ1dGVzICYgY3B1X3RvX2JlMzIoSEZTUExVU19WT0xfVU5NTlQpKSkgeworCQlpZiAoIXNpbGVudCkKKwkJCXByaW50aygiSEZTKy1mcyB3YXJuaW5nOiBGaWxlc3lzdGVtIHdhcyBub3QgY2xlYW5seSB1bm1vdW50ZWQsICIKKwkJCSAgICAgICAicnVubmluZyBmc2NrLmhmc3BsdXMgaXMgcmVjb21tZW5kZWQuICBtb3VudGluZyByZWFkLW9ubHkuXG4iKTsKKwkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCX0gZWxzZSBpZiAodmhkci0+YXR0cmlidXRlcyAmIGNwdV90b19iZTMyKEhGU1BMVVNfVk9MX1NPRlRMT0NLKSkgeworCQlpZiAoIXNpbGVudCkKKwkJCXByaW50aygiSEZTKy1mczogRmlsZXN5c3RlbSBpcyBtYXJrZWQgbG9ja2VkLCBtb3VudGluZyByZWFkLW9ubHkuXG4iKTsKKwkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCX0KKworCS8qIExvYWQgbWV0YWRhdGEgb2JqZWN0cyAoQipUcmVlcykgKi8KKwlIRlNQTFVTX1NCKHNiKS5leHRfdHJlZSA9IGhmc19idHJlZV9vcGVuKHNiLCBIRlNQTFVTX0VYVF9DTklEKTsKKwlpZiAoIUhGU1BMVVNfU0Ioc2IpLmV4dF90cmVlKSB7CisJCWlmICghc2lsZW50KQorCQkJcHJpbnRrKCJIRlMrLWZzOiBmYWlsZWQgdG8gbG9hZCBleHRlbnRzIGZpbGVcbiIpOworCQlnb3RvIGNsZWFudXA7CisJfQorCUhGU1BMVVNfU0Ioc2IpLmNhdF90cmVlID0gaGZzX2J0cmVlX29wZW4oc2IsIEhGU1BMVVNfQ0FUX0NOSUQpOworCWlmICghSEZTUExVU19TQihzYikuY2F0X3RyZWUpIHsKKwkJaWYgKCFzaWxlbnQpCisJCQlwcmludGsoIkhGUystZnM6IGZhaWxlZCB0byBsb2FkIGNhdGFsb2cgZmlsZVxuIik7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwlIRlNQTFVTX1NCKHNiKS5hbGxvY19maWxlID0gaWdldChzYiwgSEZTUExVU19BTExPQ19DTklEKTsKKwlpZiAoIUhGU1BMVVNfU0Ioc2IpLmFsbG9jX2ZpbGUpIHsKKwkJaWYgKCFzaWxlbnQpCisJCQlwcmludGsoIkhGUystZnM6IGZhaWxlZCB0byBsb2FkIGFsbG9jYXRpb24gZmlsZVxuIik7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKiBMb2FkIHRoZSByb290IGRpcmVjdG9yeSAqLworCXJvb3QgPSBpZ2V0KHNiLCBIRlNQTFVTX1JPT1RfQ05JRCk7CisJc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290KTsKKwlpZiAoIXNiLT5zX3Jvb3QpIHsKKwkJaWYgKCFzaWxlbnQpCisJCQlwcmludGsoIkhGUystZnM6IGZhaWxlZCB0byBsb2FkIHJvb3QgZGlyZWN0b3J5XG4iKTsKKwkJaXB1dChyb290KTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCXN0ci5sZW4gPSBzaXplb2YoSEZTUF9ISURERU5ESVJfTkFNRSkgLSAxOworCXN0ci5uYW1lID0gSEZTUF9ISURERU5ESVJfTkFNRTsKKwloZnNfZmluZF9pbml0KEhGU1BMVVNfU0Ioc2IpLmNhdF90cmVlLCAmZmQpOworCWhmc3BsdXNfY2F0X2J1aWxkX2tleShzYiwgZmQuc2VhcmNoX2tleSwgSEZTUExVU19ST09UX0NOSUQsICZzdHIpOworCWlmICghaGZzX2JyZWNfcmVhZCgmZmQsICZlbnRyeSwgc2l6ZW9mKGVudHJ5KSkpIHsKKwkJaGZzX2ZpbmRfZXhpdCgmZmQpOworCQlpZiAoZW50cnkudHlwZSAhPSBjcHVfdG9fYmUxNihIRlNQTFVTX0ZPTERFUikpCisJCQlnb3RvIGNsZWFudXA7CisJCUhGU1BMVVNfU0Ioc2IpLmhpZGRlbl9kaXIgPSBpZ2V0KHNiLCBiZTMyX3RvX2NwdShlbnRyeS5mb2xkZXIuaWQpKTsKKwkJaWYgKCFIRlNQTFVTX1NCKHNiKS5oaWRkZW5fZGlyKQorCQkJZ290byBjbGVhbnVwOworCX0gZWxzZQorCQloZnNfZmluZF9leGl0KCZmZCk7CisKKwlpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpCisJCWdvdG8gb3V0OworCisJLyogSCtMWCA9PSBoZnNwbHVzdXRpbHMsIEgrTHggPT0gdGhpcyBkcml2ZXIsIEgrbHggaXMgdW51c2VkCisJICogYWxsIHRocmVlIGFyZSByZWdpc3RlcmVkIHdpdGggQXBwbGUgZm9yIG91ciB1c2UKKwkgKi8KKwl2aGRyLT5sYXN0X21vdW50X3ZlcnMgPSBjcHVfdG9fYmUzMihIRlNQX01PVU5UX1ZFUlNJT04pOworCXZoZHItPm1vZGlmeV9kYXRlID0gaGZzcF9ub3cybXQoKTsKKwl2aGRyLT53cml0ZV9jb3VudCA9IGNwdV90b19iZTMyKGJlMzJfdG9fY3B1KHZoZHItPndyaXRlX2NvdW50KSArIDEpOworCXZoZHItPmF0dHJpYnV0ZXMgJj0gY3B1X3RvX2JlMzIofkhGU1BMVVNfVk9MX1VOTU5UKTsKKwl2aGRyLT5hdHRyaWJ1dGVzIHw9IGNwdV90b19iZTMyKEhGU1BMVVNfVk9MX0lOQ05TVE5UKTsKKwltYXJrX2J1ZmZlcl9kaXJ0eShIRlNQTFVTX1NCKHNiKS5zX3ZoYmgpOworCWxsX3J3X2Jsb2NrKFdSSVRFLCAxLCAmSEZTUExVU19TQihzYikuc192aGJoKTsKKwl3YWl0X29uX2J1ZmZlcihIRlNQTFVTX1NCKHNiKS5zX3ZoYmgpOworCisJaWYgKCFIRlNQTFVTX1NCKHNiKS5oaWRkZW5fZGlyKSB7CisJCXByaW50aygiSEZTKzogY3JlYXRlIGhpZGRlbiBkaXIuLi5cbiIpOworCQlIRlNQTFVTX1NCKHNiKS5oaWRkZW5fZGlyID0gaGZzcGx1c19uZXdfaW5vZGUoc2IsIFNfSUZESVIpOworCQloZnNwbHVzX2NyZWF0ZV9jYXQoSEZTUExVU19TQihzYikuaGlkZGVuX2Rpci0+aV9pbm8sIHNiLT5zX3Jvb3QtPmRfaW5vZGUsCisJCQkJICAgJnN0ciwgSEZTUExVU19TQihzYikuaGlkZGVuX2Rpcik7CisJCW1hcmtfaW5vZGVfZGlydHkoSEZTUExVU19TQihzYikuaGlkZGVuX2Rpcik7CisJfQorb3V0OgorCXVubG9hZF9ubHMoc2JpLT5ubHMpOworCXNiaS0+bmxzID0gbmxzOworCXJldHVybiAwOworCitjbGVhbnVwOgorCWhmc3BsdXNfcHV0X3N1cGVyKHNiKTsKKwlpZiAobmxzKQorCQl1bmxvYWRfbmxzKG5scyk7CisJcmV0dXJuIGVycjsKK30KKworTU9EVUxFX0FVVEhPUigiQnJhZCBCb3llciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJFeHRlbmRlZCBNYWNpbnRvc2ggRmlsZXN5c3RlbSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMga21lbV9jYWNoZV90ICpoZnNwbHVzX2lub2RlX2NhY2hlcDsKKworc3RhdGljIHN0cnVjdCBpbm9kZSAqaGZzcGx1c19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBoZnNwbHVzX2lub2RlX2luZm8gKmk7CisKKwlpID0ga21lbV9jYWNoZV9hbGxvYyhoZnNwbHVzX2lub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCXJldHVybiBpID8gJmktPnZmc19pbm9kZSA6IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGhmc3BsdXNfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWttZW1fY2FjaGVfZnJlZShoZnNwbHVzX2lub2RlX2NhY2hlcCwgJkhGU1BMVVNfSShpbm9kZSkpOworfQorCisjZGVmaW5lIEhGU1BMVVNfSU5PREVfU0laRQlzaXplb2Yoc3RydWN0IGhmc3BsdXNfaW5vZGVfaW5mbykKKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqaGZzcGx1c19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCQkJCSAgaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBoZnNwbHVzX2ZpbGxfc3VwZXIpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgaGZzcGx1c19mc190eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiaGZzcGx1cyIsCisJLmdldF9zYgkJPSBoZnNwbHVzX2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfYmxvY2tfc3VwZXIsCisJLmZzX2ZsYWdzCT0gRlNfUkVRVUlSRVNfREVWLAorfTsKKworc3RhdGljIHZvaWQgaGZzcGx1c19pbml0X29uY2Uodm9pZCAqcCwga21lbV9jYWNoZV90ICpjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IGhmc3BsdXNfaW5vZGVfaW5mbyAqaSA9IHA7CisKKwlpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRll8U0xBQl9DVE9SX0NPTlNUUlVDVE9SKSkgPT0gU0xBQl9DVE9SX0NPTlNUUlVDVE9SKQorCQlpbm9kZV9pbml0X29uY2UoJmktPnZmc19pbm9kZSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfaGZzcGx1c19mcyh2b2lkKQoreworCWludCBlcnI7CisKKwloZnNwbHVzX2lub2RlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJoZnNwbHVzX2ljYWNoZSIsCisJCUhGU1BMVVNfSU5PREVfU0laRSwgMCwgU0xBQl9IV0NBQ0hFX0FMSUdOLAorCQloZnNwbHVzX2luaXRfb25jZSwgTlVMTCk7CisJaWYgKCFoZnNwbHVzX2lub2RlX2NhY2hlcCkKKwkJcmV0dXJuIC1FTk9NRU07CisJZXJyID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmaGZzcGx1c19mc190eXBlKTsKKwlpZiAoZXJyKQorCQlrbWVtX2NhY2hlX2Rlc3Ryb3koaGZzcGx1c19pbm9kZV9jYWNoZXApOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2hmc3BsdXNfZnModm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmhmc3BsdXNfZnNfdHlwZSk7CisJaWYgKGttZW1fY2FjaGVfZGVzdHJveShoZnNwbHVzX2lub2RlX2NhY2hlcCkpCisJCXByaW50ayhLRVJOX0lORk8gImhmc3BsdXNfaW5vZGVfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9oZnNwbHVzX2ZzKQorbW9kdWxlX2V4aXQoZXhpdF9oZnNwbHVzX2ZzKQpkaWZmIC0tZ2l0IGEvZnMvaGZzcGx1cy90YWJsZXMuYyBiL2ZzL2hmc3BsdXMvdGFibGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI5MTE3MwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmc3BsdXMvdGFibGVzLmMKQEAgLTAsMCArMSwzMjQ1IEBACisvKgorICogbGludXgvZnMvaGZzcGx1cy90YWJsZXMuYworICoKKyAqIFZhcmlvdXMgZGF0YSB0YWJsZXMKKyAqLworCisjaW5jbHVkZSAiaGZzcGx1c19mcy5oIgorCisvKgorICogIFVuaWNvZGUgY2FzZSBmb2xkaW5nIHRhYmxlIHRha2VuIGZyb20gQXBwbGUgVGVjaG5vdGUgIzExNTAKKyAqICAoSEZTIFBsdXMgVm9sdW1lIEZvcm1hdCkKKyAqLworCit1MTYgaGZzcGx1c19jYXNlX2ZvbGRfdGFibGVbXSA9IHsKKy8qCisgKiAgVGhlIGxvd2VyIGNhc2UgdGFibGUgY29uc2lzdHMgb2YgYSAyNTYtZW50cnkgaGlnaC1ieXRlIHRhYmxlIGZvbGxvd2VkIGJ5CisgKiAgc29tZSBudW1iZXIgb2YgMjU2LWVudHJ5IHN1YnRhYmxlcy4gVGhlIGhpZ2gtYnl0ZSB0YWJsZSBjb250YWlucyBlaXRoZXIgYW4KKyAqICBvZmZzZXQgdG8gdGhlIHN1YnRhYmxlIGZvciBjaGFyYWN0ZXJzIHdpdGggdGhhdCBoaWdoIGJ5dGUgb3IgemVybywgd2hpY2gKKyAqICBtZWFucyB0aGF0IHRoZXJlIGFyZSBubyBjYXNlIG1hcHBpbmdzIG9yIGlnbm9yZWQgY2hhcmFjdGVycyBpbiB0aGF0IGJsb2NrLgorICogIElnbm9yZWQgY2hhcmFjdGVycyBhcmUgbWFwcGVkIHRvIHplcm8uCisgKi8KKworICAgIC8vIEhpZ2gtYnl0ZSBpbmRpY2VzICggPT0gMCBpZmYgbm8gY2FzZSBtYXBwaW5nIGFuZCBubyBpZ25vcmFibGVzICkKKworCisgICAgLyogMCAqLyAweDAxMDAsIDB4MDIwMCwgMHgwMDAwLCAweDAzMDAsIDB4MDQwMCwgMHgwNTAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAgICAgICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIC8qIDEgKi8gMHgwNjAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgICAgICAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAvKiAyICovIDB4MDcwMCwgMHgwODAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgICAgICAgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgLyogMyAqLyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAgICAgICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIC8qIDQgKi8gMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgICAgICAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAvKiA1ICovIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgICAgICAgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgLyogNiAqLyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAgICAgICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIC8qIDcgKi8gMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgICAgICAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAvKiA4ICovIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgICAgICAgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgLyogOSAqLyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAgICAgICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIC8qIEEgKi8gMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgICAgICAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAvKiBCICovIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgICAgICAgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgLyogQyAqLyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAgICAgICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIC8qIEQgKi8gMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgICAgICAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAvKiBFICovIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgICAgICAgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgLyogRiAqLyAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAgICAgICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDkwMCwgMHgwQTAwLAorCisgICAgLy8gVGFibGUgMSAoZm9yIGhpZ2ggYnl0ZSAweDAwKQorCisgICAgLyogMCAqLyAweEZGRkYsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsIDB4MDAwNCwgMHgwMDA1LCAweDAwMDYsIDB4MDAwNywKKyAgICAgICAgICAgIDB4MDAwOCwgMHgwMDA5LCAweDAwMEEsIDB4MDAwQiwgMHgwMDBDLCAweDAwMEQsIDB4MDAwRSwgMHgwMDBGLAorICAgIC8qIDEgKi8gMHgwMDEwLCAweDAwMTEsIDB4MDAxMiwgMHgwMDEzLCAweDAwMTQsIDB4MDAxNSwgMHgwMDE2LCAweDAwMTcsCisgICAgICAgICAgICAweDAwMTgsIDB4MDAxOSwgMHgwMDFBLCAweDAwMUIsIDB4MDAxQywgMHgwMDFELCAweDAwMUUsIDB4MDAxRiwKKyAgICAvKiAyICovIDB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywgMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LAorICAgICAgICAgICAgMHgwMDI4LCAweDAwMjksIDB4MDAyQSwgMHgwMDJCLCAweDAwMkMsIDB4MDAyRCwgMHgwMDJFLCAweDAwMkYsCisgICAgLyogMyAqLyAweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIDB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKyAgICAgICAgICAgIDB4MDAzOCwgMHgwMDM5LCAweDAwM0EsIDB4MDAzQiwgMHgwMDNDLCAweDAwM0QsIDB4MDAzRSwgMHgwMDNGLAorICAgIC8qIDQgKi8gMHgwMDQwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisgICAgICAgICAgICAweDAwNjgsIDB4MDA2OSwgMHgwMDZBLCAweDAwNkIsIDB4MDA2QywgMHgwMDZELCAweDAwNkUsIDB4MDA2RiwKKyAgICAvKiA1ICovIDB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LAorICAgICAgICAgICAgMHgwMDc4LCAweDAwNzksIDB4MDA3QSwgMHgwMDVCLCAweDAwNUMsIDB4MDA1RCwgMHgwMDVFLCAweDAwNUYsCisgICAgLyogNiAqLyAweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIDB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywKKyAgICAgICAgICAgIDB4MDA2OCwgMHgwMDY5LCAweDAwNkEsIDB4MDA2QiwgMHgwMDZDLCAweDAwNkQsIDB4MDA2RSwgMHgwMDZGLAorICAgIC8qIDcgKi8gMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCisgICAgICAgICAgICAweDAwNzgsIDB4MDA3OSwgMHgwMDdBLCAweDAwN0IsIDB4MDA3QywgMHgwMDdELCAweDAwN0UsIDB4MDA3RiwKKyAgICAvKiA4ICovIDB4MDA4MCwgMHgwMDgxLCAweDAwODIsIDB4MDA4MywgMHgwMDg0LCAweDAwODUsIDB4MDA4NiwgMHgwMDg3LAorICAgICAgICAgICAgMHgwMDg4LCAweDAwODksIDB4MDA4QSwgMHgwMDhCLCAweDAwOEMsIDB4MDA4RCwgMHgwMDhFLCAweDAwOEYsCisgICAgLyogOSAqLyAweDAwOTAsIDB4MDA5MSwgMHgwMDkyLCAweDAwOTMsIDB4MDA5NCwgMHgwMDk1LCAweDAwOTYsIDB4MDA5NywKKyAgICAgICAgICAgIDB4MDA5OCwgMHgwMDk5LCAweDAwOUEsIDB4MDA5QiwgMHgwMDlDLCAweDAwOUQsIDB4MDA5RSwgMHgwMDlGLAorICAgIC8qIEEgKi8gMHgwMEEwLCAweDAwQTEsIDB4MDBBMiwgMHgwMEEzLCAweDAwQTQsIDB4MDBBNSwgMHgwMEE2LCAweDAwQTcsCisgICAgICAgICAgICAweDAwQTgsIDB4MDBBOSwgMHgwMEFBLCAweDAwQUIsIDB4MDBBQywgMHgwMEFELCAweDAwQUUsIDB4MDBBRiwKKyAgICAvKiBCICovIDB4MDBCMCwgMHgwMEIxLCAweDAwQjIsIDB4MDBCMywgMHgwMEI0LCAweDAwQjUsIDB4MDBCNiwgMHgwMEI3LAorICAgICAgICAgICAgMHgwMEI4LCAweDAwQjksIDB4MDBCQSwgMHgwMEJCLCAweDAwQkMsIDB4MDBCRCwgMHgwMEJFLCAweDAwQkYsCisgICAgLyogQyAqLyAweDAwQzAsIDB4MDBDMSwgMHgwMEMyLCAweDAwQzMsIDB4MDBDNCwgMHgwMEM1LCAweDAwRTYsIDB4MDBDNywKKyAgICAgICAgICAgIDB4MDBDOCwgMHgwMEM5LCAweDAwQ0EsIDB4MDBDQiwgMHgwMENDLCAweDAwQ0QsIDB4MDBDRSwgMHgwMENGLAorICAgIC8qIEQgKi8gMHgwMEYwLCAweDAwRDEsIDB4MDBEMiwgMHgwMEQzLCAweDAwRDQsIDB4MDBENSwgMHgwMEQ2LCAweDAwRDcsCisgICAgICAgICAgICAweDAwRjgsIDB4MDBEOSwgMHgwMERBLCAweDAwREIsIDB4MDBEQywgMHgwMERELCAweDAwRkUsIDB4MDBERiwKKyAgICAvKiBFICovIDB4MDBFMCwgMHgwMEUxLCAweDAwRTIsIDB4MDBFMywgMHgwMEU0LCAweDAwRTUsIDB4MDBFNiwgMHgwMEU3LAorICAgICAgICAgICAgMHgwMEU4LCAweDAwRTksIDB4MDBFQSwgMHgwMEVCLCAweDAwRUMsIDB4MDBFRCwgMHgwMEVFLCAweDAwRUYsCisgICAgLyogRiAqLyAweDAwRjAsIDB4MDBGMSwgMHgwMEYyLCAweDAwRjMsIDB4MDBGNCwgMHgwMEY1LCAweDAwRjYsIDB4MDBGNywKKyAgICAgICAgICAgIDB4MDBGOCwgMHgwMEY5LCAweDAwRkEsIDB4MDBGQiwgMHgwMEZDLCAweDAwRkQsIDB4MDBGRSwgMHgwMEZGLAorCisgICAgLy8gVGFibGUgMiAoZm9yIGhpZ2ggYnl0ZSAweDAxKQorCisgICAgLyogMCAqLyAweDAxMDAsIDB4MDEwMSwgMHgwMTAyLCAweDAxMDMsIDB4MDEwNCwgMHgwMTA1LCAweDAxMDYsIDB4MDEwNywKKyAgICAgICAgICAgIDB4MDEwOCwgMHgwMTA5LCAweDAxMEEsIDB4MDEwQiwgMHgwMTBDLCAweDAxMEQsIDB4MDEwRSwgMHgwMTBGLAorICAgIC8qIDEgKi8gMHgwMTExLCAweDAxMTEsIDB4MDExMiwgMHgwMTEzLCAweDAxMTQsIDB4MDExNSwgMHgwMTE2LCAweDAxMTcsCisgICAgICAgICAgICAweDAxMTgsIDB4MDExOSwgMHgwMTFBLCAweDAxMUIsIDB4MDExQywgMHgwMTFELCAweDAxMUUsIDB4MDExRiwKKyAgICAvKiAyICovIDB4MDEyMCwgMHgwMTIxLCAweDAxMjIsIDB4MDEyMywgMHgwMTI0LCAweDAxMjUsIDB4MDEyNywgMHgwMTI3LAorICAgICAgICAgICAgMHgwMTI4LCAweDAxMjksIDB4MDEyQSwgMHgwMTJCLCAweDAxMkMsIDB4MDEyRCwgMHgwMTJFLCAweDAxMkYsCisgICAgLyogMyAqLyAweDAxMzAsIDB4MDEzMSwgMHgwMTMzLCAweDAxMzMsIDB4MDEzNCwgMHgwMTM1LCAweDAxMzYsIDB4MDEzNywKKyAgICAgICAgICAgIDB4MDEzOCwgMHgwMTM5LCAweDAxM0EsIDB4MDEzQiwgMHgwMTNDLCAweDAxM0QsIDB4MDEzRSwgMHgwMTQwLAorICAgIC8qIDQgKi8gMHgwMTQwLCAweDAxNDIsIDB4MDE0MiwgMHgwMTQzLCAweDAxNDQsIDB4MDE0NSwgMHgwMTQ2LCAweDAxNDcsCisgICAgICAgICAgICAweDAxNDgsIDB4MDE0OSwgMHgwMTRCLCAweDAxNEIsIDB4MDE0QywgMHgwMTRELCAweDAxNEUsIDB4MDE0RiwKKyAgICAvKiA1ICovIDB4MDE1MCwgMHgwMTUxLCAweDAxNTMsIDB4MDE1MywgMHgwMTU0LCAweDAxNTUsIDB4MDE1NiwgMHgwMTU3LAorICAgICAgICAgICAgMHgwMTU4LCAweDAxNTksIDB4MDE1QSwgMHgwMTVCLCAweDAxNUMsIDB4MDE1RCwgMHgwMTVFLCAweDAxNUYsCisgICAgLyogNiAqLyAweDAxNjAsIDB4MDE2MSwgMHgwMTYyLCAweDAxNjMsIDB4MDE2NCwgMHgwMTY1LCAweDAxNjcsIDB4MDE2NywKKyAgICAgICAgICAgIDB4MDE2OCwgMHgwMTY5LCAweDAxNkEsIDB4MDE2QiwgMHgwMTZDLCAweDAxNkQsIDB4MDE2RSwgMHgwMTZGLAorICAgIC8qIDcgKi8gMHgwMTcwLCAweDAxNzEsIDB4MDE3MiwgMHgwMTczLCAweDAxNzQsIDB4MDE3NSwgMHgwMTc2LCAweDAxNzcsCisgICAgICAgICAgICAweDAxNzgsIDB4MDE3OSwgMHgwMTdBLCAweDAxN0IsIDB4MDE3QywgMHgwMTdELCAweDAxN0UsIDB4MDE3RiwKKyAgICAvKiA4ICovIDB4MDE4MCwgMHgwMjUzLCAweDAxODMsIDB4MDE4MywgMHgwMTg1LCAweDAxODUsIDB4MDI1NCwgMHgwMTg4LAorICAgICAgICAgICAgMHgwMTg4LCAweDAyNTYsIDB4MDI1NywgMHgwMThDLCAweDAxOEMsIDB4MDE4RCwgMHgwMURELCAweDAyNTksCisgICAgLyogOSAqLyAweDAyNUIsIDB4MDE5MiwgMHgwMTkyLCAweDAyNjAsIDB4MDI2MywgMHgwMTk1LCAweDAyNjksIDB4MDI2OCwKKyAgICAgICAgICAgIDB4MDE5OSwgMHgwMTk5LCAweDAxOUEsIDB4MDE5QiwgMHgwMjZGLCAweDAyNzIsIDB4MDE5RSwgMHgwMjc1LAorICAgIC8qIEEgKi8gMHgwMUEwLCAweDAxQTEsIDB4MDFBMywgMHgwMUEzLCAweDAxQTUsIDB4MDFBNSwgMHgwMUE2LCAweDAxQTgsCisgICAgICAgICAgICAweDAxQTgsIDB4MDI4MywgMHgwMUFBLCAweDAxQUIsIDB4MDFBRCwgMHgwMUFELCAweDAyODgsIDB4MDFBRiwKKyAgICAvKiBCICovIDB4MDFCMCwgMHgwMjhBLCAweDAyOEIsIDB4MDFCNCwgMHgwMUI0LCAweDAxQjYsIDB4MDFCNiwgMHgwMjkyLAorICAgICAgICAgICAgMHgwMUI5LCAweDAxQjksIDB4MDFCQSwgMHgwMUJCLCAweDAxQkQsIDB4MDFCRCwgMHgwMUJFLCAweDAxQkYsCisgICAgLyogQyAqLyAweDAxQzAsIDB4MDFDMSwgMHgwMUMyLCAweDAxQzMsIDB4MDFDNiwgMHgwMUM2LCAweDAxQzYsIDB4MDFDOSwKKyAgICAgICAgICAgIDB4MDFDOSwgMHgwMUM5LCAweDAxQ0MsIDB4MDFDQywgMHgwMUNDLCAweDAxQ0QsIDB4MDFDRSwgMHgwMUNGLAorICAgIC8qIEQgKi8gMHgwMUQwLCAweDAxRDEsIDB4MDFEMiwgMHgwMUQzLCAweDAxRDQsIDB4MDFENSwgMHgwMUQ2LCAweDAxRDcsCisgICAgICAgICAgICAweDAxRDgsIDB4MDFEOSwgMHgwMURBLCAweDAxREIsIDB4MDFEQywgMHgwMURELCAweDAxREUsIDB4MDFERiwKKyAgICAvKiBFICovIDB4MDFFMCwgMHgwMUUxLCAweDAxRTIsIDB4MDFFMywgMHgwMUU1LCAweDAxRTUsIDB4MDFFNiwgMHgwMUU3LAorICAgICAgICAgICAgMHgwMUU4LCAweDAxRTksIDB4MDFFQSwgMHgwMUVCLCAweDAxRUMsIDB4MDFFRCwgMHgwMUVFLCAweDAxRUYsCisgICAgLyogRiAqLyAweDAxRjAsIDB4MDFGMywgMHgwMUYzLCAweDAxRjMsIDB4MDFGNCwgMHgwMUY1LCAweDAxRjYsIDB4MDFGNywKKyAgICAgICAgICAgIDB4MDFGOCwgMHgwMUY5LCAweDAxRkEsIDB4MDFGQiwgMHgwMUZDLCAweDAxRkQsIDB4MDFGRSwgMHgwMUZGLAorCisgICAgLy8gVGFibGUgMyAoZm9yIGhpZ2ggYnl0ZSAweDAzKQorCisgICAgLyogMCAqLyAweDAzMDAsIDB4MDMwMSwgMHgwMzAyLCAweDAzMDMsIDB4MDMwNCwgMHgwMzA1LCAweDAzMDYsIDB4MDMwNywKKyAgICAgICAgICAgIDB4MDMwOCwgMHgwMzA5LCAweDAzMEEsIDB4MDMwQiwgMHgwMzBDLCAweDAzMEQsIDB4MDMwRSwgMHgwMzBGLAorICAgIC8qIDEgKi8gMHgwMzEwLCAweDAzMTEsIDB4MDMxMiwgMHgwMzEzLCAweDAzMTQsIDB4MDMxNSwgMHgwMzE2LCAweDAzMTcsCisgICAgICAgICAgICAweDAzMTgsIDB4MDMxOSwgMHgwMzFBLCAweDAzMUIsIDB4MDMxQywgMHgwMzFELCAweDAzMUUsIDB4MDMxRiwKKyAgICAvKiAyICovIDB4MDMyMCwgMHgwMzIxLCAweDAzMjIsIDB4MDMyMywgMHgwMzI0LCAweDAzMjUsIDB4MDMyNiwgMHgwMzI3LAorICAgICAgICAgICAgMHgwMzI4LCAweDAzMjksIDB4MDMyQSwgMHgwMzJCLCAweDAzMkMsIDB4MDMyRCwgMHgwMzJFLCAweDAzMkYsCisgICAgLyogMyAqLyAweDAzMzAsIDB4MDMzMSwgMHgwMzMyLCAweDAzMzMsIDB4MDMzNCwgMHgwMzM1LCAweDAzMzYsIDB4MDMzNywKKyAgICAgICAgICAgIDB4MDMzOCwgMHgwMzM5LCAweDAzM0EsIDB4MDMzQiwgMHgwMzNDLCAweDAzM0QsIDB4MDMzRSwgMHgwMzNGLAorICAgIC8qIDQgKi8gMHgwMzQwLCAweDAzNDEsIDB4MDM0MiwgMHgwMzQzLCAweDAzNDQsIDB4MDM0NSwgMHgwMzQ2LCAweDAzNDcsCisgICAgICAgICAgICAweDAzNDgsIDB4MDM0OSwgMHgwMzRBLCAweDAzNEIsIDB4MDM0QywgMHgwMzRELCAweDAzNEUsIDB4MDM0RiwKKyAgICAvKiA1ICovIDB4MDM1MCwgMHgwMzUxLCAweDAzNTIsIDB4MDM1MywgMHgwMzU0LCAweDAzNTUsIDB4MDM1NiwgMHgwMzU3LAorICAgICAgICAgICAgMHgwMzU4LCAweDAzNTksIDB4MDM1QSwgMHgwMzVCLCAweDAzNUMsIDB4MDM1RCwgMHgwMzVFLCAweDAzNUYsCisgICAgLyogNiAqLyAweDAzNjAsIDB4MDM2MSwgMHgwMzYyLCAweDAzNjMsIDB4MDM2NCwgMHgwMzY1LCAweDAzNjYsIDB4MDM2NywKKyAgICAgICAgICAgIDB4MDM2OCwgMHgwMzY5LCAweDAzNkEsIDB4MDM2QiwgMHgwMzZDLCAweDAzNkQsIDB4MDM2RSwgMHgwMzZGLAorICAgIC8qIDcgKi8gMHgwMzcwLCAweDAzNzEsIDB4MDM3MiwgMHgwMzczLCAweDAzNzQsIDB4MDM3NSwgMHgwMzc2LCAweDAzNzcsCisgICAgICAgICAgICAweDAzNzgsIDB4MDM3OSwgMHgwMzdBLCAweDAzN0IsIDB4MDM3QywgMHgwMzdELCAweDAzN0UsIDB4MDM3RiwKKyAgICAvKiA4ICovIDB4MDM4MCwgMHgwMzgxLCAweDAzODIsIDB4MDM4MywgMHgwMzg0LCAweDAzODUsIDB4MDM4NiwgMHgwMzg3LAorICAgICAgICAgICAgMHgwMzg4LCAweDAzODksIDB4MDM4QSwgMHgwMzhCLCAweDAzOEMsIDB4MDM4RCwgMHgwMzhFLCAweDAzOEYsCisgICAgLyogOSAqLyAweDAzOTAsIDB4MDNCMSwgMHgwM0IyLCAweDAzQjMsIDB4MDNCNCwgMHgwM0I1LCAweDAzQjYsIDB4MDNCNywKKyAgICAgICAgICAgIDB4MDNCOCwgMHgwM0I5LCAweDAzQkEsIDB4MDNCQiwgMHgwM0JDLCAweDAzQkQsIDB4MDNCRSwgMHgwM0JGLAorICAgIC8qIEEgKi8gMHgwM0MwLCAweDAzQzEsIDB4MDNBMiwgMHgwM0MzLCAweDAzQzQsIDB4MDNDNSwgMHgwM0M2LCAweDAzQzcsCisgICAgICAgICAgICAweDAzQzgsIDB4MDNDOSwgMHgwM0FBLCAweDAzQUIsIDB4MDNBQywgMHgwM0FELCAweDAzQUUsIDB4MDNBRiwKKyAgICAvKiBCICovIDB4MDNCMCwgMHgwM0IxLCAweDAzQjIsIDB4MDNCMywgMHgwM0I0LCAweDAzQjUsIDB4MDNCNiwgMHgwM0I3LAorICAgICAgICAgICAgMHgwM0I4LCAweDAzQjksIDB4MDNCQSwgMHgwM0JCLCAweDAzQkMsIDB4MDNCRCwgMHgwM0JFLCAweDAzQkYsCisgICAgLyogQyAqLyAweDAzQzAsIDB4MDNDMSwgMHgwM0MyLCAweDAzQzMsIDB4MDNDNCwgMHgwM0M1LCAweDAzQzYsIDB4MDNDNywKKyAgICAgICAgICAgIDB4MDNDOCwgMHgwM0M5LCAweDAzQ0EsIDB4MDNDQiwgMHgwM0NDLCAweDAzQ0QsIDB4MDNDRSwgMHgwM0NGLAorICAgIC8qIEQgKi8gMHgwM0QwLCAweDAzRDEsIDB4MDNEMiwgMHgwM0QzLCAweDAzRDQsIDB4MDNENSwgMHgwM0Q2LCAweDAzRDcsCisgICAgICAgICAgICAweDAzRDgsIDB4MDNEOSwgMHgwM0RBLCAweDAzREIsIDB4MDNEQywgMHgwM0RELCAweDAzREUsIDB4MDNERiwKKyAgICAvKiBFICovIDB4MDNFMCwgMHgwM0UxLCAweDAzRTMsIDB4MDNFMywgMHgwM0U1LCAweDAzRTUsIDB4MDNFNywgMHgwM0U3LAorICAgICAgICAgICAgMHgwM0U5LCAweDAzRTksIDB4MDNFQiwgMHgwM0VCLCAweDAzRUQsIDB4MDNFRCwgMHgwM0VGLCAweDAzRUYsCisgICAgLyogRiAqLyAweDAzRjAsIDB4MDNGMSwgMHgwM0YyLCAweDAzRjMsIDB4MDNGNCwgMHgwM0Y1LCAweDAzRjYsIDB4MDNGNywKKyAgICAgICAgICAgIDB4MDNGOCwgMHgwM0Y5LCAweDAzRkEsIDB4MDNGQiwgMHgwM0ZDLCAweDAzRkQsIDB4MDNGRSwgMHgwM0ZGLAorCisgICAgLy8gVGFibGUgNCAoZm9yIGhpZ2ggYnl0ZSAweDA0KQorCisgICAgLyogMCAqLyAweDA0MDAsIDB4MDQwMSwgMHgwNDUyLCAweDA0MDMsIDB4MDQ1NCwgMHgwNDU1LCAweDA0NTYsIDB4MDQwNywKKyAgICAgICAgICAgIDB4MDQ1OCwgMHgwNDU5LCAweDA0NUEsIDB4MDQ1QiwgMHgwNDBDLCAweDA0MEQsIDB4MDQwRSwgMHgwNDVGLAorICAgIC8qIDEgKi8gMHgwNDMwLCAweDA0MzEsIDB4MDQzMiwgMHgwNDMzLCAweDA0MzQsIDB4MDQzNSwgMHgwNDM2LCAweDA0MzcsCisgICAgICAgICAgICAweDA0MzgsIDB4MDQxOSwgMHgwNDNBLCAweDA0M0IsIDB4MDQzQywgMHgwNDNELCAweDA0M0UsIDB4MDQzRiwKKyAgICAvKiAyICovIDB4MDQ0MCwgMHgwNDQxLCAweDA0NDIsIDB4MDQ0MywgMHgwNDQ0LCAweDA0NDUsIDB4MDQ0NiwgMHgwNDQ3LAorICAgICAgICAgICAgMHgwNDQ4LCAweDA0NDksIDB4MDQ0QSwgMHgwNDRCLCAweDA0NEMsIDB4MDQ0RCwgMHgwNDRFLCAweDA0NEYsCisgICAgLyogMyAqLyAweDA0MzAsIDB4MDQzMSwgMHgwNDMyLCAweDA0MzMsIDB4MDQzNCwgMHgwNDM1LCAweDA0MzYsIDB4MDQzNywKKyAgICAgICAgICAgIDB4MDQzOCwgMHgwNDM5LCAweDA0M0EsIDB4MDQzQiwgMHgwNDNDLCAweDA0M0QsIDB4MDQzRSwgMHgwNDNGLAorICAgIC8qIDQgKi8gMHgwNDQwLCAweDA0NDEsIDB4MDQ0MiwgMHgwNDQzLCAweDA0NDQsIDB4MDQ0NSwgMHgwNDQ2LCAweDA0NDcsCisgICAgICAgICAgICAweDA0NDgsIDB4MDQ0OSwgMHgwNDRBLCAweDA0NEIsIDB4MDQ0QywgMHgwNDRELCAweDA0NEUsIDB4MDQ0RiwKKyAgICAvKiA1ICovIDB4MDQ1MCwgMHgwNDUxLCAweDA0NTIsIDB4MDQ1MywgMHgwNDU0LCAweDA0NTUsIDB4MDQ1NiwgMHgwNDU3LAorICAgICAgICAgICAgMHgwNDU4LCAweDA0NTksIDB4MDQ1QSwgMHgwNDVCLCAweDA0NUMsIDB4MDQ1RCwgMHgwNDVFLCAweDA0NUYsCisgICAgLyogNiAqLyAweDA0NjEsIDB4MDQ2MSwgMHgwNDYzLCAweDA0NjMsIDB4MDQ2NSwgMHgwNDY1LCAweDA0NjcsIDB4MDQ2NywKKyAgICAgICAgICAgIDB4MDQ2OSwgMHgwNDY5LCAweDA0NkIsIDB4MDQ2QiwgMHgwNDZELCAweDA0NkQsIDB4MDQ2RiwgMHgwNDZGLAorICAgIC8qIDcgKi8gMHgwNDcxLCAweDA0NzEsIDB4MDQ3MywgMHgwNDczLCAweDA0NzUsIDB4MDQ3NSwgMHgwNDc2LCAweDA0NzcsCisgICAgICAgICAgICAweDA0NzksIDB4MDQ3OSwgMHgwNDdCLCAweDA0N0IsIDB4MDQ3RCwgMHgwNDdELCAweDA0N0YsIDB4MDQ3RiwKKyAgICAvKiA4ICovIDB4MDQ4MSwgMHgwNDgxLCAweDA0ODIsIDB4MDQ4MywgMHgwNDg0LCAweDA0ODUsIDB4MDQ4NiwgMHgwNDg3LAorICAgICAgICAgICAgMHgwNDg4LCAweDA0ODksIDB4MDQ4QSwgMHgwNDhCLCAweDA0OEMsIDB4MDQ4RCwgMHgwNDhFLCAweDA0OEYsCisgICAgLyogOSAqLyAweDA0OTEsIDB4MDQ5MSwgMHgwNDkzLCAweDA0OTMsIDB4MDQ5NSwgMHgwNDk1LCAweDA0OTcsIDB4MDQ5NywKKyAgICAgICAgICAgIDB4MDQ5OSwgMHgwNDk5LCAweDA0OUIsIDB4MDQ5QiwgMHgwNDlELCAweDA0OUQsIDB4MDQ5RiwgMHgwNDlGLAorICAgIC8qIEEgKi8gMHgwNEExLCAweDA0QTEsIDB4MDRBMywgMHgwNEEzLCAweDA0QTUsIDB4MDRBNSwgMHgwNEE3LCAweDA0QTcsCisgICAgICAgICAgICAweDA0QTksIDB4MDRBOSwgMHgwNEFCLCAweDA0QUIsIDB4MDRBRCwgMHgwNEFELCAweDA0QUYsIDB4MDRBRiwKKyAgICAvKiBCICovIDB4MDRCMSwgMHgwNEIxLCAweDA0QjMsIDB4MDRCMywgMHgwNEI1LCAweDA0QjUsIDB4MDRCNywgMHgwNEI3LAorICAgICAgICAgICAgMHgwNEI5LCAweDA0QjksIDB4MDRCQiwgMHgwNEJCLCAweDA0QkQsIDB4MDRCRCwgMHgwNEJGLCAweDA0QkYsCisgICAgLyogQyAqLyAweDA0QzAsIDB4MDRDMSwgMHgwNEMyLCAweDA0QzQsIDB4MDRDNCwgMHgwNEM1LCAweDA0QzYsIDB4MDRDOCwKKyAgICAgICAgICAgIDB4MDRDOCwgMHgwNEM5LCAweDA0Q0EsIDB4MDRDQywgMHgwNENDLCAweDA0Q0QsIDB4MDRDRSwgMHgwNENGLAorICAgIC8qIEQgKi8gMHgwNEQwLCAweDA0RDEsIDB4MDREMiwgMHgwNEQzLCAweDA0RDQsIDB4MDRENSwgMHgwNEQ2LCAweDA0RDcsCisgICAgICAgICAgICAweDA0RDgsIDB4MDREOSwgMHgwNERBLCAweDA0REIsIDB4MDREQywgMHgwNERELCAweDA0REUsIDB4MDRERiwKKyAgICAvKiBFICovIDB4MDRFMCwgMHgwNEUxLCAweDA0RTIsIDB4MDRFMywgMHgwNEU0LCAweDA0RTUsIDB4MDRFNiwgMHgwNEU3LAorICAgICAgICAgICAgMHgwNEU4LCAweDA0RTksIDB4MDRFQSwgMHgwNEVCLCAweDA0RUMsIDB4MDRFRCwgMHgwNEVFLCAweDA0RUYsCisgICAgLyogRiAqLyAweDA0RjAsIDB4MDRGMSwgMHgwNEYyLCAweDA0RjMsIDB4MDRGNCwgMHgwNEY1LCAweDA0RjYsIDB4MDRGNywKKyAgICAgICAgICAgIDB4MDRGOCwgMHgwNEY5LCAweDA0RkEsIDB4MDRGQiwgMHgwNEZDLCAweDA0RkQsIDB4MDRGRSwgMHgwNEZGLAorCisgICAgLy8gVGFibGUgNSAoZm9yIGhpZ2ggYnl0ZSAweDA1KQorCisgICAgLyogMCAqLyAweDA1MDAsIDB4MDUwMSwgMHgwNTAyLCAweDA1MDMsIDB4MDUwNCwgMHgwNTA1LCAweDA1MDYsIDB4MDUwNywKKyAgICAgICAgICAgIDB4MDUwOCwgMHgwNTA5LCAweDA1MEEsIDB4MDUwQiwgMHgwNTBDLCAweDA1MEQsIDB4MDUwRSwgMHgwNTBGLAorICAgIC8qIDEgKi8gMHgwNTEwLCAweDA1MTEsIDB4MDUxMiwgMHgwNTEzLCAweDA1MTQsIDB4MDUxNSwgMHgwNTE2LCAweDA1MTcsCisgICAgICAgICAgICAweDA1MTgsIDB4MDUxOSwgMHgwNTFBLCAweDA1MUIsIDB4MDUxQywgMHgwNTFELCAweDA1MUUsIDB4MDUxRiwKKyAgICAvKiAyICovIDB4MDUyMCwgMHgwNTIxLCAweDA1MjIsIDB4MDUyMywgMHgwNTI0LCAweDA1MjUsIDB4MDUyNiwgMHgwNTI3LAorICAgICAgICAgICAgMHgwNTI4LCAweDA1MjksIDB4MDUyQSwgMHgwNTJCLCAweDA1MkMsIDB4MDUyRCwgMHgwNTJFLCAweDA1MkYsCisgICAgLyogMyAqLyAweDA1MzAsIDB4MDU2MSwgMHgwNTYyLCAweDA1NjMsIDB4MDU2NCwgMHgwNTY1LCAweDA1NjYsIDB4MDU2NywKKyAgICAgICAgICAgIDB4MDU2OCwgMHgwNTY5LCAweDA1NkEsIDB4MDU2QiwgMHgwNTZDLCAweDA1NkQsIDB4MDU2RSwgMHgwNTZGLAorICAgIC8qIDQgKi8gMHgwNTcwLCAweDA1NzEsIDB4MDU3MiwgMHgwNTczLCAweDA1NzQsIDB4MDU3NSwgMHgwNTc2LCAweDA1NzcsCisgICAgICAgICAgICAweDA1NzgsIDB4MDU3OSwgMHgwNTdBLCAweDA1N0IsIDB4MDU3QywgMHgwNTdELCAweDA1N0UsIDB4MDU3RiwKKyAgICAvKiA1ICovIDB4MDU4MCwgMHgwNTgxLCAweDA1ODIsIDB4MDU4MywgMHgwNTg0LCAweDA1ODUsIDB4MDU4NiwgMHgwNTU3LAorICAgICAgICAgICAgMHgwNTU4LCAweDA1NTksIDB4MDU1QSwgMHgwNTVCLCAweDA1NUMsIDB4MDU1RCwgMHgwNTVFLCAweDA1NUYsCisgICAgLyogNiAqLyAweDA1NjAsIDB4MDU2MSwgMHgwNTYyLCAweDA1NjMsIDB4MDU2NCwgMHgwNTY1LCAweDA1NjYsIDB4MDU2NywKKyAgICAgICAgICAgIDB4MDU2OCwgMHgwNTY5LCAweDA1NkEsIDB4MDU2QiwgMHgwNTZDLCAweDA1NkQsIDB4MDU2RSwgMHgwNTZGLAorICAgIC8qIDcgKi8gMHgwNTcwLCAweDA1NzEsIDB4MDU3MiwgMHgwNTczLCAweDA1NzQsIDB4MDU3NSwgMHgwNTc2LCAweDA1NzcsCisgICAgICAgICAgICAweDA1NzgsIDB4MDU3OSwgMHgwNTdBLCAweDA1N0IsIDB4MDU3QywgMHgwNTdELCAweDA1N0UsIDB4MDU3RiwKKyAgICAvKiA4ICovIDB4MDU4MCwgMHgwNTgxLCAweDA1ODIsIDB4MDU4MywgMHgwNTg0LCAweDA1ODUsIDB4MDU4NiwgMHgwNTg3LAorICAgICAgICAgICAgMHgwNTg4LCAweDA1ODksIDB4MDU4QSwgMHgwNThCLCAweDA1OEMsIDB4MDU4RCwgMHgwNThFLCAweDA1OEYsCisgICAgLyogOSAqLyAweDA1OTAsIDB4MDU5MSwgMHgwNTkyLCAweDA1OTMsIDB4MDU5NCwgMHgwNTk1LCAweDA1OTYsIDB4MDU5NywKKyAgICAgICAgICAgIDB4MDU5OCwgMHgwNTk5LCAweDA1OUEsIDB4MDU5QiwgMHgwNTlDLCAweDA1OUQsIDB4MDU5RSwgMHgwNTlGLAorICAgIC8qIEEgKi8gMHgwNUEwLCAweDA1QTEsIDB4MDVBMiwgMHgwNUEzLCAweDA1QTQsIDB4MDVBNSwgMHgwNUE2LCAweDA1QTcsCisgICAgICAgICAgICAweDA1QTgsIDB4MDVBOSwgMHgwNUFBLCAweDA1QUIsIDB4MDVBQywgMHgwNUFELCAweDA1QUUsIDB4MDVBRiwKKyAgICAvKiBCICovIDB4MDVCMCwgMHgwNUIxLCAweDA1QjIsIDB4MDVCMywgMHgwNUI0LCAweDA1QjUsIDB4MDVCNiwgMHgwNUI3LAorICAgICAgICAgICAgMHgwNUI4LCAweDA1QjksIDB4MDVCQSwgMHgwNUJCLCAweDA1QkMsIDB4MDVCRCwgMHgwNUJFLCAweDA1QkYsCisgICAgLyogQyAqLyAweDA1QzAsIDB4MDVDMSwgMHgwNUMyLCAweDA1QzMsIDB4MDVDNCwgMHgwNUM1LCAweDA1QzYsIDB4MDVDNywKKyAgICAgICAgICAgIDB4MDVDOCwgMHgwNUM5LCAweDA1Q0EsIDB4MDVDQiwgMHgwNUNDLCAweDA1Q0QsIDB4MDVDRSwgMHgwNUNGLAorICAgIC8qIEQgKi8gMHgwNUQwLCAweDA1RDEsIDB4MDVEMiwgMHgwNUQzLCAweDA1RDQsIDB4MDVENSwgMHgwNUQ2LCAweDA1RDcsCisgICAgICAgICAgICAweDA1RDgsIDB4MDVEOSwgMHgwNURBLCAweDA1REIsIDB4MDVEQywgMHgwNURELCAweDA1REUsIDB4MDVERiwKKyAgICAvKiBFICovIDB4MDVFMCwgMHgwNUUxLCAweDA1RTIsIDB4MDVFMywgMHgwNUU0LCAweDA1RTUsIDB4MDVFNiwgMHgwNUU3LAorICAgICAgICAgICAgMHgwNUU4LCAweDA1RTksIDB4MDVFQSwgMHgwNUVCLCAweDA1RUMsIDB4MDVFRCwgMHgwNUVFLCAweDA1RUYsCisgICAgLyogRiAqLyAweDA1RjAsIDB4MDVGMSwgMHgwNUYyLCAweDA1RjMsIDB4MDVGNCwgMHgwNUY1LCAweDA1RjYsIDB4MDVGNywKKyAgICAgICAgICAgIDB4MDVGOCwgMHgwNUY5LCAweDA1RkEsIDB4MDVGQiwgMHgwNUZDLCAweDA1RkQsIDB4MDVGRSwgMHgwNUZGLAorCisgICAgLy8gVGFibGUgNiAoZm9yIGhpZ2ggYnl0ZSAweDEwKQorCisgICAgLyogMCAqLyAweDEwMDAsIDB4MTAwMSwgMHgxMDAyLCAweDEwMDMsIDB4MTAwNCwgMHgxMDA1LCAweDEwMDYsIDB4MTAwNywKKyAgICAgICAgICAgIDB4MTAwOCwgMHgxMDA5LCAweDEwMEEsIDB4MTAwQiwgMHgxMDBDLCAweDEwMEQsIDB4MTAwRSwgMHgxMDBGLAorICAgIC8qIDEgKi8gMHgxMDEwLCAweDEwMTEsIDB4MTAxMiwgMHgxMDEzLCAweDEwMTQsIDB4MTAxNSwgMHgxMDE2LCAweDEwMTcsCisgICAgICAgICAgICAweDEwMTgsIDB4MTAxOSwgMHgxMDFBLCAweDEwMUIsIDB4MTAxQywgMHgxMDFELCAweDEwMUUsIDB4MTAxRiwKKyAgICAvKiAyICovIDB4MTAyMCwgMHgxMDIxLCAweDEwMjIsIDB4MTAyMywgMHgxMDI0LCAweDEwMjUsIDB4MTAyNiwgMHgxMDI3LAorICAgICAgICAgICAgMHgxMDI4LCAweDEwMjksIDB4MTAyQSwgMHgxMDJCLCAweDEwMkMsIDB4MTAyRCwgMHgxMDJFLCAweDEwMkYsCisgICAgLyogMyAqLyAweDEwMzAsIDB4MTAzMSwgMHgxMDMyLCAweDEwMzMsIDB4MTAzNCwgMHgxMDM1LCAweDEwMzYsIDB4MTAzNywKKyAgICAgICAgICAgIDB4MTAzOCwgMHgxMDM5LCAweDEwM0EsIDB4MTAzQiwgMHgxMDNDLCAweDEwM0QsIDB4MTAzRSwgMHgxMDNGLAorICAgIC8qIDQgKi8gMHgxMDQwLCAweDEwNDEsIDB4MTA0MiwgMHgxMDQzLCAweDEwNDQsIDB4MTA0NSwgMHgxMDQ2LCAweDEwNDcsCisgICAgICAgICAgICAweDEwNDgsIDB4MTA0OSwgMHgxMDRBLCAweDEwNEIsIDB4MTA0QywgMHgxMDRELCAweDEwNEUsIDB4MTA0RiwKKyAgICAvKiA1ICovIDB4MTA1MCwgMHgxMDUxLCAweDEwNTIsIDB4MTA1MywgMHgxMDU0LCAweDEwNTUsIDB4MTA1NiwgMHgxMDU3LAorICAgICAgICAgICAgMHgxMDU4LCAweDEwNTksIDB4MTA1QSwgMHgxMDVCLCAweDEwNUMsIDB4MTA1RCwgMHgxMDVFLCAweDEwNUYsCisgICAgLyogNiAqLyAweDEwNjAsIDB4MTA2MSwgMHgxMDYyLCAweDEwNjMsIDB4MTA2NCwgMHgxMDY1LCAweDEwNjYsIDB4MTA2NywKKyAgICAgICAgICAgIDB4MTA2OCwgMHgxMDY5LCAweDEwNkEsIDB4MTA2QiwgMHgxMDZDLCAweDEwNkQsIDB4MTA2RSwgMHgxMDZGLAorICAgIC8qIDcgKi8gMHgxMDcwLCAweDEwNzEsIDB4MTA3MiwgMHgxMDczLCAweDEwNzQsIDB4MTA3NSwgMHgxMDc2LCAweDEwNzcsCisgICAgICAgICAgICAweDEwNzgsIDB4MTA3OSwgMHgxMDdBLCAweDEwN0IsIDB4MTA3QywgMHgxMDdELCAweDEwN0UsIDB4MTA3RiwKKyAgICAvKiA4ICovIDB4MTA4MCwgMHgxMDgxLCAweDEwODIsIDB4MTA4MywgMHgxMDg0LCAweDEwODUsIDB4MTA4NiwgMHgxMDg3LAorICAgICAgICAgICAgMHgxMDg4LCAweDEwODksIDB4MTA4QSwgMHgxMDhCLCAweDEwOEMsIDB4MTA4RCwgMHgxMDhFLCAweDEwOEYsCisgICAgLyogOSAqLyAweDEwOTAsIDB4MTA5MSwgMHgxMDkyLCAweDEwOTMsIDB4MTA5NCwgMHgxMDk1LCAweDEwOTYsIDB4MTA5NywKKyAgICAgICAgICAgIDB4MTA5OCwgMHgxMDk5LCAweDEwOUEsIDB4MTA5QiwgMHgxMDlDLCAweDEwOUQsIDB4MTA5RSwgMHgxMDlGLAorICAgIC8qIEEgKi8gMHgxMEQwLCAweDEwRDEsIDB4MTBEMiwgMHgxMEQzLCAweDEwRDQsIDB4MTBENSwgMHgxMEQ2LCAweDEwRDcsCisgICAgICAgICAgICAweDEwRDgsIDB4MTBEOSwgMHgxMERBLCAweDEwREIsIDB4MTBEQywgMHgxMERELCAweDEwREUsIDB4MTBERiwKKyAgICAvKiBCICovIDB4MTBFMCwgMHgxMEUxLCAweDEwRTIsIDB4MTBFMywgMHgxMEU0LCAweDEwRTUsIDB4MTBFNiwgMHgxMEU3LAorICAgICAgICAgICAgMHgxMEU4LCAweDEwRTksIDB4MTBFQSwgMHgxMEVCLCAweDEwRUMsIDB4MTBFRCwgMHgxMEVFLCAweDEwRUYsCisgICAgLyogQyAqLyAweDEwRjAsIDB4MTBGMSwgMHgxMEYyLCAweDEwRjMsIDB4MTBGNCwgMHgxMEY1LCAweDEwQzYsIDB4MTBDNywKKyAgICAgICAgICAgIDB4MTBDOCwgMHgxMEM5LCAweDEwQ0EsIDB4MTBDQiwgMHgxMENDLCAweDEwQ0QsIDB4MTBDRSwgMHgxMENGLAorICAgIC8qIEQgKi8gMHgxMEQwLCAweDEwRDEsIDB4MTBEMiwgMHgxMEQzLCAweDEwRDQsIDB4MTBENSwgMHgxMEQ2LCAweDEwRDcsCisgICAgICAgICAgICAweDEwRDgsIDB4MTBEOSwgMHgxMERBLCAweDEwREIsIDB4MTBEQywgMHgxMERELCAweDEwREUsIDB4MTBERiwKKyAgICAvKiBFICovIDB4MTBFMCwgMHgxMEUxLCAweDEwRTIsIDB4MTBFMywgMHgxMEU0LCAweDEwRTUsIDB4MTBFNiwgMHgxMEU3LAorICAgICAgICAgICAgMHgxMEU4LCAweDEwRTksIDB4MTBFQSwgMHgxMEVCLCAweDEwRUMsIDB4MTBFRCwgMHgxMEVFLCAweDEwRUYsCisgICAgLyogRiAqLyAweDEwRjAsIDB4MTBGMSwgMHgxMEYyLCAweDEwRjMsIDB4MTBGNCwgMHgxMEY1LCAweDEwRjYsIDB4MTBGNywKKyAgICAgICAgICAgIDB4MTBGOCwgMHgxMEY5LCAweDEwRkEsIDB4MTBGQiwgMHgxMEZDLCAweDEwRkQsIDB4MTBGRSwgMHgxMEZGLAorCisgICAgLy8gVGFibGUgNyAoZm9yIGhpZ2ggYnl0ZSAweDIwKQorCisgICAgLyogMCAqLyAweDIwMDAsIDB4MjAwMSwgMHgyMDAyLCAweDIwMDMsIDB4MjAwNCwgMHgyMDA1LCAweDIwMDYsIDB4MjAwNywKKyAgICAgICAgICAgIDB4MjAwOCwgMHgyMDA5LCAweDIwMEEsIDB4MjAwQiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIC8qIDEgKi8gMHgyMDEwLCAweDIwMTEsIDB4MjAxMiwgMHgyMDEzLCAweDIwMTQsIDB4MjAxNSwgMHgyMDE2LCAweDIwMTcsCisgICAgICAgICAgICAweDIwMTgsIDB4MjAxOSwgMHgyMDFBLCAweDIwMUIsIDB4MjAxQywgMHgyMDFELCAweDIwMUUsIDB4MjAxRiwKKyAgICAvKiAyICovIDB4MjAyMCwgMHgyMDIxLCAweDIwMjIsIDB4MjAyMywgMHgyMDI0LCAweDIwMjUsIDB4MjAyNiwgMHgyMDI3LAorICAgICAgICAgICAgMHgyMDI4LCAweDIwMjksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwMkYsCisgICAgLyogMyAqLyAweDIwMzAsIDB4MjAzMSwgMHgyMDMyLCAweDIwMzMsIDB4MjAzNCwgMHgyMDM1LCAweDIwMzYsIDB4MjAzNywKKyAgICAgICAgICAgIDB4MjAzOCwgMHgyMDM5LCAweDIwM0EsIDB4MjAzQiwgMHgyMDNDLCAweDIwM0QsIDB4MjAzRSwgMHgyMDNGLAorICAgIC8qIDQgKi8gMHgyMDQwLCAweDIwNDEsIDB4MjA0MiwgMHgyMDQzLCAweDIwNDQsIDB4MjA0NSwgMHgyMDQ2LCAweDIwNDcsCisgICAgICAgICAgICAweDIwNDgsIDB4MjA0OSwgMHgyMDRBLCAweDIwNEIsIDB4MjA0QywgMHgyMDRELCAweDIwNEUsIDB4MjA0RiwKKyAgICAvKiA1ICovIDB4MjA1MCwgMHgyMDUxLCAweDIwNTIsIDB4MjA1MywgMHgyMDU0LCAweDIwNTUsIDB4MjA1NiwgMHgyMDU3LAorICAgICAgICAgICAgMHgyMDU4LCAweDIwNTksIDB4MjA1QSwgMHgyMDVCLCAweDIwNUMsIDB4MjA1RCwgMHgyMDVFLCAweDIwNUYsCisgICAgLyogNiAqLyAweDIwNjAsIDB4MjA2MSwgMHgyMDYyLCAweDIwNjMsIDB4MjA2NCwgMHgyMDY1LCAweDIwNjYsIDB4MjA2NywKKyAgICAgICAgICAgIDB4MjA2OCwgMHgyMDY5LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIC8qIDcgKi8gMHgyMDcwLCAweDIwNzEsIDB4MjA3MiwgMHgyMDczLCAweDIwNzQsIDB4MjA3NSwgMHgyMDc2LCAweDIwNzcsCisgICAgICAgICAgICAweDIwNzgsIDB4MjA3OSwgMHgyMDdBLCAweDIwN0IsIDB4MjA3QywgMHgyMDdELCAweDIwN0UsIDB4MjA3RiwKKyAgICAvKiA4ICovIDB4MjA4MCwgMHgyMDgxLCAweDIwODIsIDB4MjA4MywgMHgyMDg0LCAweDIwODUsIDB4MjA4NiwgMHgyMDg3LAorICAgICAgICAgICAgMHgyMDg4LCAweDIwODksIDB4MjA4QSwgMHgyMDhCLCAweDIwOEMsIDB4MjA4RCwgMHgyMDhFLCAweDIwOEYsCisgICAgLyogOSAqLyAweDIwOTAsIDB4MjA5MSwgMHgyMDkyLCAweDIwOTMsIDB4MjA5NCwgMHgyMDk1LCAweDIwOTYsIDB4MjA5NywKKyAgICAgICAgICAgIDB4MjA5OCwgMHgyMDk5LCAweDIwOUEsIDB4MjA5QiwgMHgyMDlDLCAweDIwOUQsIDB4MjA5RSwgMHgyMDlGLAorICAgIC8qIEEgKi8gMHgyMEEwLCAweDIwQTEsIDB4MjBBMiwgMHgyMEEzLCAweDIwQTQsIDB4MjBBNSwgMHgyMEE2LCAweDIwQTcsCisgICAgICAgICAgICAweDIwQTgsIDB4MjBBOSwgMHgyMEFBLCAweDIwQUIsIDB4MjBBQywgMHgyMEFELCAweDIwQUUsIDB4MjBBRiwKKyAgICAvKiBCICovIDB4MjBCMCwgMHgyMEIxLCAweDIwQjIsIDB4MjBCMywgMHgyMEI0LCAweDIwQjUsIDB4MjBCNiwgMHgyMEI3LAorICAgICAgICAgICAgMHgyMEI4LCAweDIwQjksIDB4MjBCQSwgMHgyMEJCLCAweDIwQkMsIDB4MjBCRCwgMHgyMEJFLCAweDIwQkYsCisgICAgLyogQyAqLyAweDIwQzAsIDB4MjBDMSwgMHgyMEMyLCAweDIwQzMsIDB4MjBDNCwgMHgyMEM1LCAweDIwQzYsIDB4MjBDNywKKyAgICAgICAgICAgIDB4MjBDOCwgMHgyMEM5LCAweDIwQ0EsIDB4MjBDQiwgMHgyMENDLCAweDIwQ0QsIDB4MjBDRSwgMHgyMENGLAorICAgIC8qIEQgKi8gMHgyMEQwLCAweDIwRDEsIDB4MjBEMiwgMHgyMEQzLCAweDIwRDQsIDB4MjBENSwgMHgyMEQ2LCAweDIwRDcsCisgICAgICAgICAgICAweDIwRDgsIDB4MjBEOSwgMHgyMERBLCAweDIwREIsIDB4MjBEQywgMHgyMERELCAweDIwREUsIDB4MjBERiwKKyAgICAvKiBFICovIDB4MjBFMCwgMHgyMEUxLCAweDIwRTIsIDB4MjBFMywgMHgyMEU0LCAweDIwRTUsIDB4MjBFNiwgMHgyMEU3LAorICAgICAgICAgICAgMHgyMEU4LCAweDIwRTksIDB4MjBFQSwgMHgyMEVCLCAweDIwRUMsIDB4MjBFRCwgMHgyMEVFLCAweDIwRUYsCisgICAgLyogRiAqLyAweDIwRjAsIDB4MjBGMSwgMHgyMEYyLCAweDIwRjMsIDB4MjBGNCwgMHgyMEY1LCAweDIwRjYsIDB4MjBGNywKKyAgICAgICAgICAgIDB4MjBGOCwgMHgyMEY5LCAweDIwRkEsIDB4MjBGQiwgMHgyMEZDLCAweDIwRkQsIDB4MjBGRSwgMHgyMEZGLAorCisgICAgLy8gVGFibGUgOCAoZm9yIGhpZ2ggYnl0ZSAweDIxKQorCisgICAgLyogMCAqLyAweDIxMDAsIDB4MjEwMSwgMHgyMTAyLCAweDIxMDMsIDB4MjEwNCwgMHgyMTA1LCAweDIxMDYsIDB4MjEwNywKKyAgICAgICAgICAgIDB4MjEwOCwgMHgyMTA5LCAweDIxMEEsIDB4MjEwQiwgMHgyMTBDLCAweDIxMEQsIDB4MjEwRSwgMHgyMTBGLAorICAgIC8qIDEgKi8gMHgyMTEwLCAweDIxMTEsIDB4MjExMiwgMHgyMTEzLCAweDIxMTQsIDB4MjExNSwgMHgyMTE2LCAweDIxMTcsCisgICAgICAgICAgICAweDIxMTgsIDB4MjExOSwgMHgyMTFBLCAweDIxMUIsIDB4MjExQywgMHgyMTFELCAweDIxMUUsIDB4MjExRiwKKyAgICAvKiAyICovIDB4MjEyMCwgMHgyMTIxLCAweDIxMjIsIDB4MjEyMywgMHgyMTI0LCAweDIxMjUsIDB4MjEyNiwgMHgyMTI3LAorICAgICAgICAgICAgMHgyMTI4LCAweDIxMjksIDB4MjEyQSwgMHgyMTJCLCAweDIxMkMsIDB4MjEyRCwgMHgyMTJFLCAweDIxMkYsCisgICAgLyogMyAqLyAweDIxMzAsIDB4MjEzMSwgMHgyMTMyLCAweDIxMzMsIDB4MjEzNCwgMHgyMTM1LCAweDIxMzYsIDB4MjEzNywKKyAgICAgICAgICAgIDB4MjEzOCwgMHgyMTM5LCAweDIxM0EsIDB4MjEzQiwgMHgyMTNDLCAweDIxM0QsIDB4MjEzRSwgMHgyMTNGLAorICAgIC8qIDQgKi8gMHgyMTQwLCAweDIxNDEsIDB4MjE0MiwgMHgyMTQzLCAweDIxNDQsIDB4MjE0NSwgMHgyMTQ2LCAweDIxNDcsCisgICAgICAgICAgICAweDIxNDgsIDB4MjE0OSwgMHgyMTRBLCAweDIxNEIsIDB4MjE0QywgMHgyMTRELCAweDIxNEUsIDB4MjE0RiwKKyAgICAvKiA1ICovIDB4MjE1MCwgMHgyMTUxLCAweDIxNTIsIDB4MjE1MywgMHgyMTU0LCAweDIxNTUsIDB4MjE1NiwgMHgyMTU3LAorICAgICAgICAgICAgMHgyMTU4LCAweDIxNTksIDB4MjE1QSwgMHgyMTVCLCAweDIxNUMsIDB4MjE1RCwgMHgyMTVFLCAweDIxNUYsCisgICAgLyogNiAqLyAweDIxNzAsIDB4MjE3MSwgMHgyMTcyLCAweDIxNzMsIDB4MjE3NCwgMHgyMTc1LCAweDIxNzYsIDB4MjE3NywKKyAgICAgICAgICAgIDB4MjE3OCwgMHgyMTc5LCAweDIxN0EsIDB4MjE3QiwgMHgyMTdDLCAweDIxN0QsIDB4MjE3RSwgMHgyMTdGLAorICAgIC8qIDcgKi8gMHgyMTcwLCAweDIxNzEsIDB4MjE3MiwgMHgyMTczLCAweDIxNzQsIDB4MjE3NSwgMHgyMTc2LCAweDIxNzcsCisgICAgICAgICAgICAweDIxNzgsIDB4MjE3OSwgMHgyMTdBLCAweDIxN0IsIDB4MjE3QywgMHgyMTdELCAweDIxN0UsIDB4MjE3RiwKKyAgICAvKiA4ICovIDB4MjE4MCwgMHgyMTgxLCAweDIxODIsIDB4MjE4MywgMHgyMTg0LCAweDIxODUsIDB4MjE4NiwgMHgyMTg3LAorICAgICAgICAgICAgMHgyMTg4LCAweDIxODksIDB4MjE4QSwgMHgyMThCLCAweDIxOEMsIDB4MjE4RCwgMHgyMThFLCAweDIxOEYsCisgICAgLyogOSAqLyAweDIxOTAsIDB4MjE5MSwgMHgyMTkyLCAweDIxOTMsIDB4MjE5NCwgMHgyMTk1LCAweDIxOTYsIDB4MjE5NywKKyAgICAgICAgICAgIDB4MjE5OCwgMHgyMTk5LCAweDIxOUEsIDB4MjE5QiwgMHgyMTlDLCAweDIxOUQsIDB4MjE5RSwgMHgyMTlGLAorICAgIC8qIEEgKi8gMHgyMUEwLCAweDIxQTEsIDB4MjFBMiwgMHgyMUEzLCAweDIxQTQsIDB4MjFBNSwgMHgyMUE2LCAweDIxQTcsCisgICAgICAgICAgICAweDIxQTgsIDB4MjFBOSwgMHgyMUFBLCAweDIxQUIsIDB4MjFBQywgMHgyMUFELCAweDIxQUUsIDB4MjFBRiwKKyAgICAvKiBCICovIDB4MjFCMCwgMHgyMUIxLCAweDIxQjIsIDB4MjFCMywgMHgyMUI0LCAweDIxQjUsIDB4MjFCNiwgMHgyMUI3LAorICAgICAgICAgICAgMHgyMUI4LCAweDIxQjksIDB4MjFCQSwgMHgyMUJCLCAweDIxQkMsIDB4MjFCRCwgMHgyMUJFLCAweDIxQkYsCisgICAgLyogQyAqLyAweDIxQzAsIDB4MjFDMSwgMHgyMUMyLCAweDIxQzMsIDB4MjFDNCwgMHgyMUM1LCAweDIxQzYsIDB4MjFDNywKKyAgICAgICAgICAgIDB4MjFDOCwgMHgyMUM5LCAweDIxQ0EsIDB4MjFDQiwgMHgyMUNDLCAweDIxQ0QsIDB4MjFDRSwgMHgyMUNGLAorICAgIC8qIEQgKi8gMHgyMUQwLCAweDIxRDEsIDB4MjFEMiwgMHgyMUQzLCAweDIxRDQsIDB4MjFENSwgMHgyMUQ2LCAweDIxRDcsCisgICAgICAgICAgICAweDIxRDgsIDB4MjFEOSwgMHgyMURBLCAweDIxREIsIDB4MjFEQywgMHgyMURELCAweDIxREUsIDB4MjFERiwKKyAgICAvKiBFICovIDB4MjFFMCwgMHgyMUUxLCAweDIxRTIsIDB4MjFFMywgMHgyMUU0LCAweDIxRTUsIDB4MjFFNiwgMHgyMUU3LAorICAgICAgICAgICAgMHgyMUU4LCAweDIxRTksIDB4MjFFQSwgMHgyMUVCLCAweDIxRUMsIDB4MjFFRCwgMHgyMUVFLCAweDIxRUYsCisgICAgLyogRiAqLyAweDIxRjAsIDB4MjFGMSwgMHgyMUYyLCAweDIxRjMsIDB4MjFGNCwgMHgyMUY1LCAweDIxRjYsIDB4MjFGNywKKyAgICAgICAgICAgIDB4MjFGOCwgMHgyMUY5LCAweDIxRkEsIDB4MjFGQiwgMHgyMUZDLCAweDIxRkQsIDB4MjFGRSwgMHgyMUZGLAorCisgICAgLy8gVGFibGUgOSAoZm9yIGhpZ2ggYnl0ZSAweEZFKQorCisgICAgLyogMCAqLyAweEZFMDAsIDB4RkUwMSwgMHhGRTAyLCAweEZFMDMsIDB4RkUwNCwgMHhGRTA1LCAweEZFMDYsIDB4RkUwNywKKyAgICAgICAgICAgIDB4RkUwOCwgMHhGRTA5LCAweEZFMEEsIDB4RkUwQiwgMHhGRTBDLCAweEZFMEQsIDB4RkUwRSwgMHhGRTBGLAorICAgIC8qIDEgKi8gMHhGRTEwLCAweEZFMTEsIDB4RkUxMiwgMHhGRTEzLCAweEZFMTQsIDB4RkUxNSwgMHhGRTE2LCAweEZFMTcsCisgICAgICAgICAgICAweEZFMTgsIDB4RkUxOSwgMHhGRTFBLCAweEZFMUIsIDB4RkUxQywgMHhGRTFELCAweEZFMUUsIDB4RkUxRiwKKyAgICAvKiAyICovIDB4RkUyMCwgMHhGRTIxLCAweEZFMjIsIDB4RkUyMywgMHhGRTI0LCAweEZFMjUsIDB4RkUyNiwgMHhGRTI3LAorICAgICAgICAgICAgMHhGRTI4LCAweEZFMjksIDB4RkUyQSwgMHhGRTJCLCAweEZFMkMsIDB4RkUyRCwgMHhGRTJFLCAweEZFMkYsCisgICAgLyogMyAqLyAweEZFMzAsIDB4RkUzMSwgMHhGRTMyLCAweEZFMzMsIDB4RkUzNCwgMHhGRTM1LCAweEZFMzYsIDB4RkUzNywKKyAgICAgICAgICAgIDB4RkUzOCwgMHhGRTM5LCAweEZFM0EsIDB4RkUzQiwgMHhGRTNDLCAweEZFM0QsIDB4RkUzRSwgMHhGRTNGLAorICAgIC8qIDQgKi8gMHhGRTQwLCAweEZFNDEsIDB4RkU0MiwgMHhGRTQzLCAweEZFNDQsIDB4RkU0NSwgMHhGRTQ2LCAweEZFNDcsCisgICAgICAgICAgICAweEZFNDgsIDB4RkU0OSwgMHhGRTRBLCAweEZFNEIsIDB4RkU0QywgMHhGRTRELCAweEZFNEUsIDB4RkU0RiwKKyAgICAvKiA1ICovIDB4RkU1MCwgMHhGRTUxLCAweEZFNTIsIDB4RkU1MywgMHhGRTU0LCAweEZFNTUsIDB4RkU1NiwgMHhGRTU3LAorICAgICAgICAgICAgMHhGRTU4LCAweEZFNTksIDB4RkU1QSwgMHhGRTVCLCAweEZFNUMsIDB4RkU1RCwgMHhGRTVFLCAweEZFNUYsCisgICAgLyogNiAqLyAweEZFNjAsIDB4RkU2MSwgMHhGRTYyLCAweEZFNjMsIDB4RkU2NCwgMHhGRTY1LCAweEZFNjYsIDB4RkU2NywKKyAgICAgICAgICAgIDB4RkU2OCwgMHhGRTY5LCAweEZFNkEsIDB4RkU2QiwgMHhGRTZDLCAweEZFNkQsIDB4RkU2RSwgMHhGRTZGLAorICAgIC8qIDcgKi8gMHhGRTcwLCAweEZFNzEsIDB4RkU3MiwgMHhGRTczLCAweEZFNzQsIDB4RkU3NSwgMHhGRTc2LCAweEZFNzcsCisgICAgICAgICAgICAweEZFNzgsIDB4RkU3OSwgMHhGRTdBLCAweEZFN0IsIDB4RkU3QywgMHhGRTdELCAweEZFN0UsIDB4RkU3RiwKKyAgICAvKiA4ICovIDB4RkU4MCwgMHhGRTgxLCAweEZFODIsIDB4RkU4MywgMHhGRTg0LCAweEZFODUsIDB4RkU4NiwgMHhGRTg3LAorICAgICAgICAgICAgMHhGRTg4LCAweEZFODksIDB4RkU4QSwgMHhGRThCLCAweEZFOEMsIDB4RkU4RCwgMHhGRThFLCAweEZFOEYsCisgICAgLyogOSAqLyAweEZFOTAsIDB4RkU5MSwgMHhGRTkyLCAweEZFOTMsIDB4RkU5NCwgMHhGRTk1LCAweEZFOTYsIDB4RkU5NywKKyAgICAgICAgICAgIDB4RkU5OCwgMHhGRTk5LCAweEZFOUEsIDB4RkU5QiwgMHhGRTlDLCAweEZFOUQsIDB4RkU5RSwgMHhGRTlGLAorICAgIC8qIEEgKi8gMHhGRUEwLCAweEZFQTEsIDB4RkVBMiwgMHhGRUEzLCAweEZFQTQsIDB4RkVBNSwgMHhGRUE2LCAweEZFQTcsCisgICAgICAgICAgICAweEZFQTgsIDB4RkVBOSwgMHhGRUFBLCAweEZFQUIsIDB4RkVBQywgMHhGRUFELCAweEZFQUUsIDB4RkVBRiwKKyAgICAvKiBCICovIDB4RkVCMCwgMHhGRUIxLCAweEZFQjIsIDB4RkVCMywgMHhGRUI0LCAweEZFQjUsIDB4RkVCNiwgMHhGRUI3LAorICAgICAgICAgICAgMHhGRUI4LCAweEZFQjksIDB4RkVCQSwgMHhGRUJCLCAweEZFQkMsIDB4RkVCRCwgMHhGRUJFLCAweEZFQkYsCisgICAgLyogQyAqLyAweEZFQzAsIDB4RkVDMSwgMHhGRUMyLCAweEZFQzMsIDB4RkVDNCwgMHhGRUM1LCAweEZFQzYsIDB4RkVDNywKKyAgICAgICAgICAgIDB4RkVDOCwgMHhGRUM5LCAweEZFQ0EsIDB4RkVDQiwgMHhGRUNDLCAweEZFQ0QsIDB4RkVDRSwgMHhGRUNGLAorICAgIC8qIEQgKi8gMHhGRUQwLCAweEZFRDEsIDB4RkVEMiwgMHhGRUQzLCAweEZFRDQsIDB4RkVENSwgMHhGRUQ2LCAweEZFRDcsCisgICAgICAgICAgICAweEZFRDgsIDB4RkVEOSwgMHhGRURBLCAweEZFREIsIDB4RkVEQywgMHhGRURELCAweEZFREUsIDB4RkVERiwKKyAgICAvKiBFICovIDB4RkVFMCwgMHhGRUUxLCAweEZFRTIsIDB4RkVFMywgMHhGRUU0LCAweEZFRTUsIDB4RkVFNiwgMHhGRUU3LAorICAgICAgICAgICAgMHhGRUU4LCAweEZFRTksIDB4RkVFQSwgMHhGRUVCLCAweEZFRUMsIDB4RkVFRCwgMHhGRUVFLCAweEZFRUYsCisgICAgLyogRiAqLyAweEZFRjAsIDB4RkVGMSwgMHhGRUYyLCAweEZFRjMsIDB4RkVGNCwgMHhGRUY1LCAweEZFRjYsIDB4RkVGNywKKyAgICAgICAgICAgIDB4RkVGOCwgMHhGRUY5LCAweEZFRkEsIDB4RkVGQiwgMHhGRUZDLCAweEZFRkQsIDB4RkVGRSwgMHgwMDAwLAorCisgICAgLy8gVGFibGUgMTAgKGZvciBoaWdoIGJ5dGUgMHhGRikKKworICAgIC8qIDAgKi8gMHhGRjAwLCAweEZGMDEsIDB4RkYwMiwgMHhGRjAzLCAweEZGMDQsIDB4RkYwNSwgMHhGRjA2LCAweEZGMDcsCisgICAgICAgICAgICAweEZGMDgsIDB4RkYwOSwgMHhGRjBBLCAweEZGMEIsIDB4RkYwQywgMHhGRjBELCAweEZGMEUsIDB4RkYwRiwKKyAgICAvKiAxICovIDB4RkYxMCwgMHhGRjExLCAweEZGMTIsIDB4RkYxMywgMHhGRjE0LCAweEZGMTUsIDB4RkYxNiwgMHhGRjE3LAorICAgICAgICAgICAgMHhGRjE4LCAweEZGMTksIDB4RkYxQSwgMHhGRjFCLCAweEZGMUMsIDB4RkYxRCwgMHhGRjFFLCAweEZGMUYsCisgICAgLyogMiAqLyAweEZGMjAsIDB4RkY0MSwgMHhGRjQyLCAweEZGNDMsIDB4RkY0NCwgMHhGRjQ1LCAweEZGNDYsIDB4RkY0NywKKyAgICAgICAgICAgIDB4RkY0OCwgMHhGRjQ5LCAweEZGNEEsIDB4RkY0QiwgMHhGRjRDLCAweEZGNEQsIDB4RkY0RSwgMHhGRjRGLAorICAgIC8qIDMgKi8gMHhGRjUwLCAweEZGNTEsIDB4RkY1MiwgMHhGRjUzLCAweEZGNTQsIDB4RkY1NSwgMHhGRjU2LCAweEZGNTcsCisgICAgICAgICAgICAweEZGNTgsIDB4RkY1OSwgMHhGRjVBLCAweEZGM0IsIDB4RkYzQywgMHhGRjNELCAweEZGM0UsIDB4RkYzRiwKKyAgICAvKiA0ICovIDB4RkY0MCwgMHhGRjQxLCAweEZGNDIsIDB4RkY0MywgMHhGRjQ0LCAweEZGNDUsIDB4RkY0NiwgMHhGRjQ3LAorICAgICAgICAgICAgMHhGRjQ4LCAweEZGNDksIDB4RkY0QSwgMHhGRjRCLCAweEZGNEMsIDB4RkY0RCwgMHhGRjRFLCAweEZGNEYsCisgICAgLyogNSAqLyAweEZGNTAsIDB4RkY1MSwgMHhGRjUyLCAweEZGNTMsIDB4RkY1NCwgMHhGRjU1LCAweEZGNTYsIDB4RkY1NywKKyAgICAgICAgICAgIDB4RkY1OCwgMHhGRjU5LCAweEZGNUEsIDB4RkY1QiwgMHhGRjVDLCAweEZGNUQsIDB4RkY1RSwgMHhGRjVGLAorICAgIC8qIDYgKi8gMHhGRjYwLCAweEZGNjEsIDB4RkY2MiwgMHhGRjYzLCAweEZGNjQsIDB4RkY2NSwgMHhGRjY2LCAweEZGNjcsCisgICAgICAgICAgICAweEZGNjgsIDB4RkY2OSwgMHhGRjZBLCAweEZGNkIsIDB4RkY2QywgMHhGRjZELCAweEZGNkUsIDB4RkY2RiwKKyAgICAvKiA3ICovIDB4RkY3MCwgMHhGRjcxLCAweEZGNzIsIDB4RkY3MywgMHhGRjc0LCAweEZGNzUsIDB4RkY3NiwgMHhGRjc3LAorICAgICAgICAgICAgMHhGRjc4LCAweEZGNzksIDB4RkY3QSwgMHhGRjdCLCAweEZGN0MsIDB4RkY3RCwgMHhGRjdFLCAweEZGN0YsCisgICAgLyogOCAqLyAweEZGODAsIDB4RkY4MSwgMHhGRjgyLCAweEZGODMsIDB4RkY4NCwgMHhGRjg1LCAweEZGODYsIDB4RkY4NywKKyAgICAgICAgICAgIDB4RkY4OCwgMHhGRjg5LCAweEZGOEEsIDB4RkY4QiwgMHhGRjhDLCAweEZGOEQsIDB4RkY4RSwgMHhGRjhGLAorICAgIC8qIDkgKi8gMHhGRjkwLCAweEZGOTEsIDB4RkY5MiwgMHhGRjkzLCAweEZGOTQsIDB4RkY5NSwgMHhGRjk2LCAweEZGOTcsCisgICAgICAgICAgICAweEZGOTgsIDB4RkY5OSwgMHhGRjlBLCAweEZGOUIsIDB4RkY5QywgMHhGRjlELCAweEZGOUUsIDB4RkY5RiwKKyAgICAvKiBBICovIDB4RkZBMCwgMHhGRkExLCAweEZGQTIsIDB4RkZBMywgMHhGRkE0LCAweEZGQTUsIDB4RkZBNiwgMHhGRkE3LAorICAgICAgICAgICAgMHhGRkE4LCAweEZGQTksIDB4RkZBQSwgMHhGRkFCLCAweEZGQUMsIDB4RkZBRCwgMHhGRkFFLCAweEZGQUYsCisgICAgLyogQiAqLyAweEZGQjAsIDB4RkZCMSwgMHhGRkIyLCAweEZGQjMsIDB4RkZCNCwgMHhGRkI1LCAweEZGQjYsIDB4RkZCNywKKyAgICAgICAgICAgIDB4RkZCOCwgMHhGRkI5LCAweEZGQkEsIDB4RkZCQiwgMHhGRkJDLCAweEZGQkQsIDB4RkZCRSwgMHhGRkJGLAorICAgIC8qIEMgKi8gMHhGRkMwLCAweEZGQzEsIDB4RkZDMiwgMHhGRkMzLCAweEZGQzQsIDB4RkZDNSwgMHhGRkM2LCAweEZGQzcsCisgICAgICAgICAgICAweEZGQzgsIDB4RkZDOSwgMHhGRkNBLCAweEZGQ0IsIDB4RkZDQywgMHhGRkNELCAweEZGQ0UsIDB4RkZDRiwKKyAgICAvKiBEICovIDB4RkZEMCwgMHhGRkQxLCAweEZGRDIsIDB4RkZEMywgMHhGRkQ0LCAweEZGRDUsIDB4RkZENiwgMHhGRkQ3LAorICAgICAgICAgICAgMHhGRkQ4LCAweEZGRDksIDB4RkZEQSwgMHhGRkRCLCAweEZGREMsIDB4RkZERCwgMHhGRkRFLCAweEZGREYsCisgICAgLyogRSAqLyAweEZGRTAsIDB4RkZFMSwgMHhGRkUyLCAweEZGRTMsIDB4RkZFNCwgMHhGRkU1LCAweEZGRTYsIDB4RkZFNywKKyAgICAgICAgICAgIDB4RkZFOCwgMHhGRkU5LCAweEZGRUEsIDB4RkZFQiwgMHhGRkVDLCAweEZGRUQsIDB4RkZFRSwgMHhGRkVGLAorICAgIC8qIEYgKi8gMHhGRkYwLCAweEZGRjEsIDB4RkZGMiwgMHhGRkYzLCAweEZGRjQsIDB4RkZGNSwgMHhGRkY2LCAweEZGRjcsCisgICAgICAgICAgICAweEZGRjgsIDB4RkZGOSwgMHhGRkZBLCAweEZGRkIsIDB4RkZGQywgMHhGRkZELCAweEZGRkUsIDB4RkZGRiwKK307CisKK3UxNiBoZnNwbHVzX2RlY29tcG9zZV90YWJsZVtdID0geworCS8qIGJhc2UgdGFibGUgKi8KKwkweDAwMTAsIDB4MDRjMCwgMHgwMDAwLCAweDA2ZjAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweDAwMDAsIDB4MDdiMCwKKwkvKiBjaGFyIHRhYmxlIDB4MF9fXyAqLworCTB4MDAyMCwgMHgwMDcwLCAweDAxNjAsIDB4MDE5MCwgMHgwMjMwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMmQwLCAweDAzNDAsIDB4MDM2MCwgMHgwM2IwLCAweDAzZTAsIDB4MDQwMCwgMHgwNDMwLAorCS8qIGNoYXIgdGFibGUgMHgwMF9fICovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMzAsIDB4MDA0MCwgMHgwMDUwLCAweDAwNjAsCisJLyogY2hhciB2YWx1ZXMgMHgwMGNfICovCisJMHgyMDQyLCAweDIwNGEsIDB4MjA1MiwgMHgyMDVhLCAweDIwNjIsIDB4MjA2YSwgMHgwMDAwLCAweDIwNzIsCisJMHgyMDdhLCAweDIwODIsIDB4MjA4YSwgMHgyMDkyLCAweDIwOWEsIDB4MjBhMiwgMHgyMGFhLCAweDIwYjIsCisJLyogY2hhciB2YWx1ZXMgMHgwMGRfICovCisJMHgwMDAwLCAweDIwYmEsIDB4MjBjMiwgMHgyMGNhLCAweDIwZDIsIDB4MjBkYSwgMHgyMGUyLCAweDAwMDAsCisJMHgwMDAwLCAweDIwZWEsIDB4MjBmMiwgMHgyMGZhLCAweDIxMDIsIDB4MjEwYSwgMHgwMDAwLCAweDAwMDAsCisJLyogY2hhciB2YWx1ZXMgMHgwMGVfICovCisJMHgyMTEyLCAweDIxMWEsIDB4MjEyMiwgMHgyMTJhLCAweDIxMzIsIDB4MjEzYSwgMHgwMDAwLCAweDIxNDIsCisJMHgyMTRhLCAweDIxNTIsIDB4MjE1YSwgMHgyMTYyLCAweDIxNmEsIDB4MjE3MiwgMHgyMTdhLCAweDIxODIsCisJLyogY2hhciB2YWx1ZXMgMHgwMGZfICovCisJMHgwMDAwLCAweDIxOGEsIDB4MjE5MiwgMHgyMTlhLCAweDIxYTIsIDB4MjFhYSwgMHgyMWIyLCAweDAwMDAsCisJMHgwMDAwLCAweDIxYmEsIDB4MjFjMiwgMHgyMWNhLCAweDIxZDIsIDB4MjFkYSwgMHgwMDAwLCAweDIxZTIsCisJLyogY2hhciB0YWJsZSAweDAxX18gKi8KKwkweDAwODAsIDB4MDA5MCwgMHgwMGEwLCAweDAwYjAsIDB4MDBjMCwgMHgwMGQwLCAweDAwZTAsIDB4MDBmMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMTAwLCAweDAxMTAsIDB4MDEyMCwgMHgwMTMwLCAweDAxNDAsIDB4MDE1MCwKKwkvKiBjaGFyIHZhbHVlcyAweDAxMF8gKi8KKwkweDIxZWEsIDB4MjFmMiwgMHgyMWZhLCAweDIyMDIsIDB4MjIwYSwgMHgyMjEyLCAweDIyMWEsIDB4MjIyMiwKKwkweDIyMmEsIDB4MjIzMiwgMHgyMjNhLCAweDIyNDIsIDB4MjI0YSwgMHgyMjUyLCAweDIyNWEsIDB4MjI2MiwKKwkvKiBjaGFyIHZhbHVlcyAweDAxMV8gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgyMjZhLCAweDIyNzIsIDB4MjI3YSwgMHgyMjgyLCAweDIyOGEsIDB4MjI5MiwKKwkweDIyOWEsIDB4MjJhMiwgMHgyMmFhLCAweDIyYjIsIDB4MjJiYSwgMHgyMmMyLCAweDIyY2EsIDB4MjJkMiwKKwkvKiBjaGFyIHZhbHVlcyAweDAxMl8gKi8KKwkweDIyZGEsIDB4MjJlMiwgMHgyMmVhLCAweDIyZjIsIDB4MjJmYSwgMHgyMzAyLCAweDAwMDAsIDB4MDAwMCwKKwkweDIzMGEsIDB4MjMxMiwgMHgyMzFhLCAweDIzMjIsIDB4MjMyYSwgMHgyMzMyLCAweDIzM2EsIDB4MjM0MiwKKwkvKiBjaGFyIHZhbHVlcyAweDAxM18gKi8KKwkweDIzNGEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjM1MiwgMHgyMzVhLCAweDIzNjIsIDB4MjM2YSwKKwkweDAwMDAsIDB4MjM3MiwgMHgyMzdhLCAweDIzODIsIDB4MjM4YSwgMHgyMzkyLCAweDIzOWEsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDAxNF8gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIzYTIsIDB4MjNhYSwgMHgyM2IyLCAweDIzYmEsIDB4MjNjMiwKKwkweDIzY2EsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjNkMiwgMHgyM2RhLCAweDIzZTIsIDB4MjNlYSwKKwkvKiBjaGFyIHZhbHVlcyAweDAxNV8gKi8KKwkweDIzZjIsIDB4MjNmYSwgMHgwMDAwLCAweDAwMDAsIDB4MjQwMiwgMHgyNDBhLCAweDI0MTIsIDB4MjQxYSwKKwkweDI0MjIsIDB4MjQyYSwgMHgyNDMyLCAweDI0M2EsIDB4MjQ0MiwgMHgyNDRhLCAweDI0NTIsIDB4MjQ1YSwKKwkvKiBjaGFyIHZhbHVlcyAweDAxNl8gKi8KKwkweDI0NjIsIDB4MjQ2YSwgMHgyNDcyLCAweDI0N2EsIDB4MjQ4MiwgMHgyNDhhLCAweDAwMDAsIDB4MDAwMCwKKwkweDI0OTIsIDB4MjQ5YSwgMHgyNGEyLCAweDI0YWEsIDB4MjRiMiwgMHgyNGJhLCAweDI0YzIsIDB4MjRjYSwKKwkvKiBjaGFyIHZhbHVlcyAweDAxN18gKi8KKwkweDI0ZDIsIDB4MjRkYSwgMHgyNGUyLCAweDI0ZWEsIDB4MjRmMiwgMHgyNGZhLCAweDI1MDIsIDB4MjUwYSwKKwkweDI1MTIsIDB4MjUxYSwgMHgyNTIyLCAweDI1MmEsIDB4MjUzMiwgMHgyNTNhLCAweDI1NDIsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDAxYV8gKi8KKwkweDI1NGEsIDB4MjU1MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjU1YSwKKwkvKiBjaGFyIHZhbHVlcyAweDAxYl8gKi8KKwkweDI1NjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDAxY18gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyNTZhLCAweDI1NzIsIDB4MjU3YSwKKwkvKiBjaGFyIHZhbHVlcyAweDAxZF8gKi8KKwkweDI1ODIsIDB4MjU4YSwgMHgyNTkyLCAweDI1OWEsIDB4MjVhMiwgMHgyNWFiLCAweDI1YjcsIDB4MjVjMywKKwkweDI1Y2YsIDB4MjVkYiwgMHgyNWU3LCAweDI1ZjMsIDB4MjVmZiwgMHgwMDAwLCAweDI2MGIsIDB4MjYxNywKKwkvKiBjaGFyIHZhbHVlcyAweDAxZV8gKi8KKwkweDI2MjMsIDB4MjYyZiwgMHgyNjNhLCAweDI2NDIsIDB4MDAwMCwgMHgwMDAwLCAweDI2NGEsIDB4MjY1MiwKKwkweDI2NWEsIDB4MjY2MiwgMHgyNjZhLCAweDI2NzIsIDB4MjY3YiwgMHgyNjg3LCAweDI2OTIsIDB4MjY5YSwKKwkvKiBjaGFyIHZhbHVlcyAweDAxZl8gKi8KKwkweDI2YTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjZhYSwgMHgyNmIyLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgyNmJiLCAweDI2YzcsIDB4MjZkMiwgMHgyNmRhLCAweDI2ZTIsIDB4MjZlYSwKKwkvKiBjaGFyIHRhYmxlIDB4MDJfXyAqLworCTB4MDE3MCwgMHgwMTgwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MDIwXyAqLworCTB4MjZmMiwgMHgyNmZhLCAweDI3MDIsIDB4MjcwYSwgMHgyNzEyLCAweDI3MWEsIDB4MjcyMiwgMHgyNzJhLAorCTB4MjczMiwgMHgyNzNhLCAweDI3NDIsIDB4Mjc0YSwgMHgyNzUyLCAweDI3NWEsIDB4Mjc2MiwgMHgyNzZhLAorCS8qIGNoYXIgdmFsdWVzIDB4MDIxXyAqLworCTB4Mjc3MiwgMHgyNzdhLCAweDI3ODIsIDB4Mjc4YSwgMHgyNzkyLCAweDI3OWEsIDB4MjdhMiwgMHgyN2FhLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdGFibGUgMHgwM19fICovCisJMHgwMDAwLCAweDAxYTAsIDB4MDAwMCwgMHgwMDAwLCAweDAxYjAsIDB4MDAwMCwgMHgwMDAwLCAweDAxYzAsCisJMHgwMWQwLCAweDAxZTAsIDB4MDFmMCwgMHgwMjAwLCAweDAyMTAsIDB4MDIyMCwgMHgwMDAwLCAweDAwMDAsCisJLyogY2hhciB2YWx1ZXMgMHgwMzFfICovCisJMHgyN2IyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJLyogY2hhciB2YWx1ZXMgMHgwMzRfICovCisJMHgyN2I5LCAweDI3YmQsIDB4MDAwMCwgMHgyN2MxLCAweDI3YzYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJLyogY2hhciB2YWx1ZXMgMHgwMzdfICovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDI3Y2QsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyN2QxLCAweDAwMDAsCisJLyogY2hhciB2YWx1ZXMgMHgwMzhfICovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjdkNiwgMHgyN2RlLCAweDI3ZTUsCisJMHgyN2VhLCAweDI3ZjIsIDB4MjdmYSwgMHgwMDAwLCAweDI4MDIsIDB4MDAwMCwgMHgyODBhLCAweDI4MTIsCisJLyogY2hhciB2YWx1ZXMgMHgwMzlfICovCisJMHgyODFiLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJLyogY2hhciB2YWx1ZXMgMHgwM2FfICovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MjgyNiwgMHgyODJlLCAweDI4MzYsIDB4MjgzZSwgMHgyODQ2LCAweDI4NGUsCisJLyogY2hhciB2YWx1ZXMgMHgwM2JfICovCisJMHgyODU3LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJLyogY2hhciB2YWx1ZXMgMHgwM2NfICovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4Mjg2MiwgMHgyODZhLCAweDI4NzIsIDB4Mjg3YSwgMHgyODgyLCAweDAwMDAsCisJLyogY2hhciB2YWx1ZXMgMHgwM2RfICovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyODhhLCAweDI4OTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJLyogY2hhciB0YWJsZSAweDA0X18gKi8KKwkweDAyNDAsIDB4MDI1MCwgMHgwMDAwLCAweDAyNjAsIDB4MDAwMCwgMHgwMjcwLCAweDAwMDAsIDB4MDI4MCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDI5MCwgMHgwMmEwLCAweDAyYjAsIDB4MDJjMCwKKwkvKiBjaGFyIHZhbHVlcyAweDA0MF8gKi8KKwkweDAwMDAsIDB4Mjg5YSwgMHgwMDAwLCAweDI4YTIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjhhYSwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjhiMiwgMHgwMDAwLCAweDI4YmEsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDA0MV8gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MjhjMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDA0M18gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MjhjYSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDA0NV8gKi8KKwkweDAwMDAsIDB4MjhkMiwgMHgwMDAwLCAweDI4ZGEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjhlMiwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjhlYSwgMHgwMDAwLCAweDI4ZjIsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDA0N18gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDI4ZmEsIDB4MjkwMiwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDA0Y18gKi8KKwkweDAwMDAsIDB4MjkwYSwgMHgyOTEyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDA0ZF8gKi8KKwkweDI5MWEsIDB4MjkyMiwgMHgyOTJhLCAweDI5MzIsIDB4MjkzOSwgMHgyOTNkLCAweDI5NDIsIDB4Mjk0YSwKKwkweDI5NTEsIDB4Mjk1NSwgMHgyOTVhLCAweDI5NjIsIDB4Mjk2YSwgMHgyOTcyLCAweDI5N2EsIDB4Mjk4MiwKKwkvKiBjaGFyIHZhbHVlcyAweDA0ZV8gKi8KKwkweDI5ODksIDB4Mjk4ZCwgMHgyOTkyLCAweDI5OWEsIDB4MjlhMiwgMHgyOWFhLCAweDI5YjIsIDB4MjliYSwKKwkweDI5YzEsIDB4MjljNSwgMHgyOWNhLCAweDI5ZDIsIDB4MDAwMCwgMHgwMDAwLCAweDI5ZGEsIDB4MjllMiwKKwkvKiBjaGFyIHZhbHVlcyAweDA0Zl8gKi8KKwkweDI5ZWEsIDB4MjlmMiwgMHgyOWZhLCAweDJhMDIsIDB4MmEwYSwgMHgyYTEyLCAweDAwMDAsIDB4MDAwMCwKKwkweDJhMWEsIDB4MmEyMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHRhYmxlIDB4MDlfXyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAyZTAsIDB4MDJmMCwgMHgwMDAwLCAweDAzMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDMxMCwgMHgwMzIwLCAweDAzMzAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MDkyXyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgyYTJhLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MDkzXyAqLworCTB4MDAwMCwgMHgyYTMyLCAweDAwMDAsIDB4MDAwMCwgMHgyYTNhLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MDk1XyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MmE0MiwgMHgyYTRhLCAweDJhNTIsIDB4MmE1YSwgMHgyYTYyLCAweDJhNmEsIDB4MmE3MiwgMHgyYTdhLAorCS8qIGNoYXIgdmFsdWVzIDB4MDliXyAqLworCTB4MmE4MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MDljXyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MmE4YSwgMHgyYTkyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MDlkXyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyYTlhLCAweDJhYTIsIDB4MDAwMCwgMHgyYWFhLAorCS8qIGNoYXIgdGFibGUgMHgwYV9fICovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDM1MCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJLyogY2hhciB2YWx1ZXMgMHgwYTVfICovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDJhYjIsIDB4MmFiYSwgMHgyYWMyLCAweDJhY2EsIDB4MDAwMCwgMHgyYWQyLCAweDAwMDAsCisJLyogY2hhciB0YWJsZSAweDBiX18gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDM3MCwgMHgwMzgwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDM5MCwgMHgwMDAwLCAweDAwMDAsIDB4MDNhMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDBiNF8gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDJhZGEsIDB4MDAwMCwgMHgwMDAwLCAweDJhZTIsIDB4MmFlYSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDBiNV8gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MmFmMiwgMHgyYWZhLCAweDAwMDAsIDB4MmIwMiwKKwkvKiBjaGFyIHZhbHVlcyAweDBiOV8gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MmIwYSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDBiY18gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgyYjEyLCAweDJiMWEsIDB4MmIyMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHRhYmxlIDB4MGNfXyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwM2MwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwM2QwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MGM0XyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MmIyYSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MGNjXyAqLworCTB4MmIzMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyYjNhLAorCTB4MmI0MiwgMHgwMDAwLCAweDJiNGEsIDB4MmI1MywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdGFibGUgMHgwZF9fICovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAzZjAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJLyogY2hhciB2YWx1ZXMgMHgwZDRfICovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MmI1ZSwgMHgyYjY2LCAweDJiNmUsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJLyogY2hhciB0YWJsZSAweDBlX18gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDA0MTAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDA0MjAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDBlM18gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDJiNzYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDBlYl8gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDJiN2UsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHRhYmxlIDB4MGZfXyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwNDQwLCAweDA0NTAsIDB4MDQ2MCwgMHgwNDcwLAorCTB4MDQ4MCwgMHgwNDkwLCAweDA0YTAsIDB4MDRiMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MGY0XyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MmI4NiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDJiOGUsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MGY1XyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDJiOTYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyYjllLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyYmE2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MGY2XyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgyYmFlLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MGY3XyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MmJiNiwgMHgwMDAwLCAweDJiYmUsIDB4MmJjNiwgMHgyYmNmLAorCTB4MmJkYSwgMHgyYmUzLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MGY4XyAqLworCTB4MDAwMCwgMHgyYmVlLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MGY5XyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MmJmNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDJiZmUsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MGZhXyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDJjMDYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyYzBlLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyYzE2LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MGZiXyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgyYzFlLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdGFibGUgMHgxX19fICovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwNGQwLCAweDA1ZTAsCisJLyogY2hhciB0YWJsZSAweDFlX18gKi8KKwkweDA0ZTAsIDB4MDRmMCwgMHgwNTAwLCAweDA1MTAsIDB4MDUyMCwgMHgwNTMwLCAweDA1NDAsIDB4MDU1MCwKKwkweDA1NjAsIDB4MDU3MCwgMHgwNTgwLCAweDA1OTAsIDB4MDVhMCwgMHgwNWIwLCAweDA1YzAsIDB4MDVkMCwKKwkvKiBjaGFyIHZhbHVlcyAweDFlMF8gKi8KKwkweDJjMjYsIDB4MmMyZSwgMHgyYzM2LCAweDJjM2UsIDB4MmM0NiwgMHgyYzRlLCAweDJjNTYsIDB4MmM1ZSwKKwkweDJjNjcsIDB4MmM3MywgMHgyYzdlLCAweDJjODYsIDB4MmM4ZSwgMHgyYzk2LCAweDJjOWUsIDB4MmNhNiwKKwkvKiBjaGFyIHZhbHVlcyAweDFlMV8gKi8KKwkweDJjYWUsIDB4MmNiNiwgMHgyY2JlLCAweDJjYzYsIDB4MmNjZiwgMHgyY2RiLCAweDJjZTcsIDB4MmNmMywKKwkweDJjZmUsIDB4MmQwNiwgMHgyZDBlLCAweDJkMTYsIDB4MmQxZiwgMHgyZDJiLCAweDJkMzYsIDB4MmQzZSwKKwkvKiBjaGFyIHZhbHVlcyAweDFlMl8gKi8KKwkweDJkNDYsIDB4MmQ0ZSwgMHgyZDU2LCAweDJkNWUsIDB4MmQ2NiwgMHgyZDZlLCAweDJkNzYsIDB4MmQ3ZSwKKwkweDJkODYsIDB4MmQ4ZSwgMHgyZDk2LCAweDJkOWUsIDB4MmRhNiwgMHgyZGFlLCAweDJkYjcsIDB4MmRjMywKKwkvKiBjaGFyIHZhbHVlcyAweDFlM18gKi8KKwkweDJkY2UsIDB4MmRkNiwgMHgyZGRlLCAweDJkZTYsIDB4MmRlZSwgMHgyZGY2LCAweDJkZmUsIDB4MmUwNiwKKwkweDJlMGYsIDB4MmUxYiwgMHgyZTI2LCAweDJlMmUsIDB4MmUzNiwgMHgyZTNlLCAweDJlNDYsIDB4MmU0ZSwKKwkvKiBjaGFyIHZhbHVlcyAweDFlNF8gKi8KKwkweDJlNTYsIDB4MmU1ZSwgMHgyZTY2LCAweDJlNmUsIDB4MmU3NiwgMHgyZTdlLCAweDJlODYsIDB4MmU4ZSwKKwkweDJlOTYsIDB4MmU5ZSwgMHgyZWE2LCAweDJlYWUsIDB4MmViNywgMHgyZWMzLCAweDJlY2YsIDB4MmVkYiwKKwkvKiBjaGFyIHZhbHVlcyAweDFlNV8gKi8KKwkweDJlZTcsIDB4MmVmMywgMHgyZWZmLCAweDJmMGIsIDB4MmYxNiwgMHgyZjFlLCAweDJmMjYsIDB4MmYyZSwKKwkweDJmMzYsIDB4MmYzZSwgMHgyZjQ2LCAweDJmNGUsIDB4MmY1NywgMHgyZjYzLCAweDJmNmUsIDB4MmY3NiwKKwkvKiBjaGFyIHZhbHVlcyAweDFlNl8gKi8KKwkweDJmN2UsIDB4MmY4NiwgMHgyZjhlLCAweDJmOTYsIDB4MmY5ZiwgMHgyZmFiLCAweDJmYjcsIDB4MmZjMywKKwkweDJmY2YsIDB4MmZkYiwgMHgyZmU2LCAweDJmZWUsIDB4MmZmNiwgMHgyZmZlLCAweDMwMDYsIDB4MzAwZSwKKwkvKiBjaGFyIHZhbHVlcyAweDFlN18gKi8KKwkweDMwMTYsIDB4MzAxZSwgMHgzMDI2LCAweDMwMmUsIDB4MzAzNiwgMHgzMDNlLCAweDMwNDYsIDB4MzA0ZSwKKwkweDMwNTcsIDB4MzA2MywgMHgzMDZmLCAweDMwN2IsIDB4MzA4NiwgMHgzMDhlLCAweDMwOTYsIDB4MzA5ZSwKKwkvKiBjaGFyIHZhbHVlcyAweDFlOF8gKi8KKwkweDMwYTYsIDB4MzBhZSwgMHgzMGI2LCAweDMwYmUsIDB4MzBjNiwgMHgzMGNlLCAweDMwZDYsIDB4MzBkZSwKKwkweDMwZTYsIDB4MzBlZSwgMHgzMGY2LCAweDMwZmUsIDB4MzEwNiwgMHgzMTBlLCAweDMxMTYsIDB4MzExZSwKKwkvKiBjaGFyIHZhbHVlcyAweDFlOV8gKi8KKwkweDMxMjYsIDB4MzEyZSwgMHgzMTM2LCAweDMxM2UsIDB4MzE0NiwgMHgzMTRlLCAweDMxNTYsIDB4MzE1ZSwKKwkweDMxNjYsIDB4MzE2ZSwgMHgwMDAwLCAweDMxNzYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDFlYV8gKi8KKwkweDMxN2UsIDB4MzE4NiwgMHgzMThlLCAweDMxOTYsIDB4MzE5ZiwgMHgzMWFiLCAweDMxYjcsIDB4MzFjMywKKwkweDMxY2YsIDB4MzFkYiwgMHgzMWU3LCAweDMxZjMsIDB4MzFmZiwgMHgzMjBiLCAweDMyMTcsIDB4MzIyMywKKwkvKiBjaGFyIHZhbHVlcyAweDFlYl8gKi8KKwkweDMyMmYsIDB4MzIzYiwgMHgzMjQ3LCAweDMyNTMsIDB4MzI1ZiwgMHgzMjZiLCAweDMyNzcsIDB4MzI4MywKKwkweDMyOGUsIDB4MzI5NiwgMHgzMjllLCAweDMyYTYsIDB4MzJhZSwgMHgzMmI2LCAweDMyYmYsIDB4MzJjYiwKKwkvKiBjaGFyIHZhbHVlcyAweDFlY18gKi8KKwkweDMyZDcsIDB4MzJlMywgMHgzMmVmLCAweDMyZmIsIDB4MzMwNywgMHgzMzEzLCAweDMzMWYsIDB4MzMyYiwKKwkweDMzMzYsIDB4MzMzZSwgMHgzMzQ2LCAweDMzNGUsIDB4MzM1NiwgMHgzMzVlLCAweDMzNjYsIDB4MzM2ZSwKKwkvKiBjaGFyIHZhbHVlcyAweDFlZF8gKi8KKwkweDMzNzcsIDB4MzM4MywgMHgzMzhmLCAweDMzOWIsIDB4MzNhNywgMHgzM2IzLCAweDMzYmYsIDB4MzNjYiwKKwkweDMzZDcsIDB4MzNlMywgMHgzM2VmLCAweDMzZmIsIDB4MzQwNywgMHgzNDEzLCAweDM0MWYsIDB4MzQyYiwKKwkvKiBjaGFyIHZhbHVlcyAweDFlZV8gKi8KKwkweDM0MzcsIDB4MzQ0MywgMHgzNDRmLCAweDM0NWIsIDB4MzQ2NiwgMHgzNDZlLCAweDM0NzYsIDB4MzQ3ZSwKKwkweDM0ODcsIDB4MzQ5MywgMHgzNDlmLCAweDM0YWIsIDB4MzRiNywgMHgzNGMzLCAweDM0Y2YsIDB4MzRkYiwKKwkvKiBjaGFyIHZhbHVlcyAweDFlZl8gKi8KKwkweDM0ZTcsIDB4MzRmMywgMHgzNGZlLCAweDM1MDYsIDB4MzUwZSwgMHgzNTE2LCAweDM1MWUsIDB4MzUyNiwKKwkweDM1MmUsIDB4MzUzNiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHRhYmxlIDB4MWZfXyAqLworCTB4MDVmMCwgMHgwNjAwLCAweDA2MTAsIDB4MDYyMCwgMHgwNjMwLCAweDA2NDAsIDB4MDY1MCwgMHgwNjYwLAorCTB4MDY3MCwgMHgwNjgwLCAweDA2OTAsIDB4MDZhMCwgMHgwNmIwLCAweDA2YzAsIDB4MDZkMCwgMHgwNmUwLAorCS8qIGNoYXIgdmFsdWVzIDB4MWYwXyAqLworCTB4MzUzZSwgMHgzNTQ2LCAweDM1NGYsIDB4MzU1YiwgMHgzNTY3LCAweDM1NzMsIDB4MzU3ZiwgMHgzNThiLAorCTB4MzU5NiwgMHgzNTllLCAweDM1YTcsIDB4MzViMywgMHgzNWJmLCAweDM1Y2IsIDB4MzVkNywgMHgzNWUzLAorCS8qIGNoYXIgdmFsdWVzIDB4MWYxXyAqLworCTB4MzVlZSwgMHgzNWY2LCAweDM1ZmYsIDB4MzYwYiwgMHgzNjE3LCAweDM2MjMsIDB4MDAwMCwgMHgwMDAwLAorCTB4MzYyZSwgMHgzNjM2LCAweDM2M2YsIDB4MzY0YiwgMHgzNjU3LCAweDM2NjMsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MWYyXyAqLworCTB4MzY2ZSwgMHgzNjc2LCAweDM2N2YsIDB4MzY4YiwgMHgzNjk3LCAweDM2YTMsIDB4MzZhZiwgMHgzNmJiLAorCTB4MzZjNiwgMHgzNmNlLCAweDM2ZDcsIDB4MzZlMywgMHgzNmVmLCAweDM2ZmIsIDB4MzcwNywgMHgzNzEzLAorCS8qIGNoYXIgdmFsdWVzIDB4MWYzXyAqLworCTB4MzcxZSwgMHgzNzI2LCAweDM3MmYsIDB4MzczYiwgMHgzNzQ3LCAweDM3NTMsIDB4Mzc1ZiwgMHgzNzZiLAorCTB4Mzc3NiwgMHgzNzdlLCAweDM3ODcsIDB4Mzc5MywgMHgzNzlmLCAweDM3YWIsIDB4MzdiNywgMHgzN2MzLAorCS8qIGNoYXIgdmFsdWVzIDB4MWY0XyAqLworCTB4MzdjZSwgMHgzN2Q2LCAweDM3ZGYsIDB4MzdlYiwgMHgzN2Y3LCAweDM4MDMsIDB4MDAwMCwgMHgwMDAwLAorCTB4MzgwZSwgMHgzODE2LCAweDM4MWYsIDB4MzgyYiwgMHgzODM3LCAweDM4NDMsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MWY1XyAqLworCTB4Mzg0ZSwgMHgzODU2LCAweDM4NWYsIDB4Mzg2YiwgMHgzODc3LCAweDM4ODMsIDB4Mzg4ZiwgMHgzODliLAorCTB4MDAwMCwgMHgzOGE2LCAweDAwMDAsIDB4MzhhZiwgMHgwMDAwLCAweDM4YmIsIDB4MDAwMCwgMHgzOGM3LAorCS8qIGNoYXIgdmFsdWVzIDB4MWY2XyAqLworCTB4MzhkMiwgMHgzOGRhLCAweDM4ZTMsIDB4MzhlZiwgMHgzOGZiLCAweDM5MDcsIDB4MzkxMywgMHgzOTFmLAorCTB4MzkyYSwgMHgzOTMyLCAweDM5M2IsIDB4Mzk0NywgMHgzOTUzLCAweDM5NWYsIDB4Mzk2YiwgMHgzOTc3LAorCS8qIGNoYXIgdmFsdWVzIDB4MWY3XyAqLworCTB4Mzk4MiwgMHgzOThhLCAweDM5OTIsIDB4Mzk5YSwgMHgzOWEyLCAweDM5YWEsIDB4MzliMiwgMHgzOWJhLAorCTB4MzljMiwgMHgzOWNhLCAweDM5ZDIsIDB4MzlkYSwgMHgzOWUyLCAweDM5ZWEsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MWY4XyAqLworCTB4MzlmMywgMHgzOWZmLCAweDNhMGMsIDB4M2ExYywgMHgzYTJjLCAweDNhM2MsIDB4M2E0YywgMHgzYTVjLAorCTB4M2E2YiwgMHgzYTc3LCAweDNhODQsIDB4M2E5NCwgMHgzYWE0LCAweDNhYjQsIDB4M2FjNCwgMHgzYWQ0LAorCS8qIGNoYXIgdmFsdWVzIDB4MWY5XyAqLworCTB4M2FlMywgMHgzYWVmLCAweDNhZmMsIDB4M2IwYywgMHgzYjFjLCAweDNiMmMsIDB4M2IzYywgMHgzYjRjLAorCTB4M2I1YiwgMHgzYjY3LCAweDNiNzQsIDB4M2I4NCwgMHgzYjk0LCAweDNiYTQsIDB4M2JiNCwgMHgzYmM0LAorCS8qIGNoYXIgdmFsdWVzIDB4MWZhXyAqLworCTB4M2JkMywgMHgzYmRmLCAweDNiZWMsIDB4M2JmYywgMHgzYzBjLCAweDNjMWMsIDB4M2MyYywgMHgzYzNjLAorCTB4M2M0YiwgMHgzYzU3LCAweDNjNjQsIDB4M2M3NCwgMHgzYzg0LCAweDNjOTQsIDB4M2NhNCwgMHgzY2I0LAorCS8qIGNoYXIgdmFsdWVzIDB4MWZiXyAqLworCTB4M2NjMiwgMHgzY2NhLCAweDNjZDMsIDB4M2NkZSwgMHgzY2U3LCAweDAwMDAsIDB4M2NmMiwgMHgzY2ZiLAorCTB4M2QwNiwgMHgzZDBlLCAweDNkMTYsIDB4M2QxZSwgMHgzZDI2LCAweDAwMDAsIDB4M2QyZCwgMHgwMDAwLAorCS8qIGNoYXIgdmFsdWVzIDB4MWZjXyAqLworCTB4MDAwMCwgMHgzZDMyLCAweDNkM2IsIDB4M2Q0NiwgMHgzZDRmLCAweDAwMDAsIDB4M2Q1YSwgMHgzZDYzLAorCTB4M2Q2ZSwgMHgzZDc2LCAweDNkN2UsIDB4M2Q4NiwgMHgzZDhlLCAweDNkOTYsIDB4M2Q5ZSwgMHgzZGE2LAorCS8qIGNoYXIgdmFsdWVzIDB4MWZkXyAqLworCTB4M2RhZSwgMHgzZGI2LCAweDNkYmYsIDB4M2RjYiwgMHgwMDAwLCAweDAwMDAsIDB4M2RkNiwgMHgzZGRmLAorCTB4M2RlYSwgMHgzZGYyLCAweDNkZmEsIDB4M2UwMiwgMHgwMDAwLCAweDNlMGEsIDB4M2UxMiwgMHgzZTFhLAorCS8qIGNoYXIgdmFsdWVzIDB4MWZlXyAqLworCTB4M2UyMiwgMHgzZTJhLCAweDNlMzMsIDB4M2UzZiwgMHgzZTRhLCAweDNlNTIsIDB4M2U1YSwgMHgzZTYzLAorCTB4M2U2ZSwgMHgzZTc2LCAweDNlN2UsIDB4M2U4NiwgMHgzZThlLCAweDNlOTYsIDB4M2U5ZSwgMHgzZWE1LAorCS8qIGNoYXIgdmFsdWVzIDB4MWZmXyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDNlYWIsIDB4M2ViNiwgMHgzZWJmLCAweDAwMDAsIDB4M2VjYSwgMHgzZWQzLAorCTB4M2VkZSwgMHgzZWU2LCAweDNlZWUsIDB4M2VmNiwgMHgzZWZlLCAweDNmMDUsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdGFibGUgMHgzX19fICovCisJMHgwNzAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJLyogY2hhciB0YWJsZSAweDMwX18gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDcxMCwgMHgwNzIwLCAweDA3MzAsIDB4MDc0MCwKKwkweDAwMDAsIDB4MDc1MCwgMHgwNzYwLCAweDA3NzAsIDB4MDc4MCwgMHgwNzkwLCAweDAwMDAsIDB4MDdhMCwKKwkvKiBjaGFyIHZhbHVlcyAweDMwNF8gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4M2YwYSwgMHgwMDAwLCAweDNmMTIsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDMwNV8gKi8KKwkweDNmMWEsIDB4MDAwMCwgMHgzZjIyLCAweDAwMDAsIDB4M2YyYSwgMHgwMDAwLCAweDNmMzIsIDB4MDAwMCwKKwkweDNmM2EsIDB4MDAwMCwgMHgzZjQyLCAweDAwMDAsIDB4M2Y0YSwgMHgwMDAwLCAweDNmNTIsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDMwNl8gKi8KKwkweDNmNWEsIDB4MDAwMCwgMHgzZjYyLCAweDAwMDAsIDB4MDAwMCwgMHgzZjZhLCAweDAwMDAsIDB4M2Y3MiwKKwkweDAwMDAsIDB4M2Y3YSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDMwN18gKi8KKwkweDNmODIsIDB4M2Y4YSwgMHgwMDAwLCAweDNmOTIsIDB4M2Y5YSwgMHgwMDAwLCAweDNmYTIsIDB4M2ZhYSwKKwkweDAwMDAsIDB4M2ZiMiwgMHgzZmJhLCAweDAwMDAsIDB4M2ZjMiwgMHgzZmNhLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDMwOV8gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4M2ZkMiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDNmZGEsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDMwYV8gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4M2ZlMiwgMHgwMDAwLCAweDNmZWEsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDMwYl8gKi8KKwkweDNmZjIsIDB4MDAwMCwgMHgzZmZhLCAweDAwMDAsIDB4NDAwMiwgMHgwMDAwLCAweDQwMGEsIDB4MDAwMCwKKwkweDQwMTIsIDB4MDAwMCwgMHg0MDFhLCAweDAwMDAsIDB4NDAyMiwgMHgwMDAwLCAweDQwMmEsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDMwY18gKi8KKwkweDQwMzIsIDB4MDAwMCwgMHg0MDNhLCAweDAwMDAsIDB4MDAwMCwgMHg0MDQyLCAweDAwMDAsIDB4NDA0YSwKKwkweDAwMDAsIDB4NDA1MiwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDMwZF8gKi8KKwkweDQwNWEsIDB4NDA2MiwgMHgwMDAwLCAweDQwNmEsIDB4NDA3MiwgMHgwMDAwLCAweDQwN2EsIDB4NDA4MiwKKwkweDAwMDAsIDB4NDA4YSwgMHg0MDkyLCAweDAwMDAsIDB4NDA5YSwgMHg0MGEyLCAweDAwMDAsIDB4MDAwMCwKKwkvKiBjaGFyIHZhbHVlcyAweDMwZl8gKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4NDBhYSwgMHgwMDAwLCAweDAwMDAsIDB4NDBiMiwKKwkweDQwYmEsIDB4NDBjMiwgMHg0MGNhLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDQwZDIsIDB4MDAwMCwKKwkvKiBjaGFyIHRhYmxlIDB4Zl9fXyAqLworCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDdjMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIGNoYXIgdGFibGUgMHhmYl9fICovCisJMHgwMDAwLCAweDA3ZDAsIDB4MDdlMCwgMHgwN2YwLCAweDA4MDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJLyogY2hhciB2YWx1ZXMgMHhmYjFfICovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDQwZGEsCisJLyogY2hhciB2YWx1ZXMgMHhmYjJfICovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4NDBlMiwgMHg0MGVhLCAweDQwZjMsIDB4NDBmZiwgMHg0MTBhLCAweDQxMTIsCisJLyogY2hhciB2YWx1ZXMgMHhmYjNfICovCisJMHg0MTFhLCAweDQxMjIsIDB4NDEyYSwgMHg0MTMyLCAweDQxM2EsIDB4NDE0MiwgMHg0MTRhLCAweDAwMDAsCisJMHg0MTUyLCAweDQxNWEsIDB4NDE2MiwgMHg0MTZhLCAweDQxNzIsIDB4MDAwMCwgMHg0MTdhLCAweDAwMDAsCisJLyogY2hhciB2YWx1ZXMgMHhmYjRfICovCisJMHg0MTgyLCAweDQxOGEsIDB4MDAwMCwgMHg0MTkyLCAweDQxOWEsIDB4MDAwMCwgMHg0MWEyLCAweDQxYWEsCisJMHg0MWIyLCAweDQxYmEsIDB4NDFjMiwgMHg0MWNhLCAweDQxZDIsIDB4NDFkYSwgMHg0MWUyLCAweDAwMDAsCisJLyogZGVjb21wb3NlZCBjaGFyYWN0ZXJzICovCisJMHgwMDQxLCAweDAzMDAsIDB4MDA0MSwgMHgwMzAxLCAweDAwNDEsIDB4MDMwMiwgMHgwMDQxLCAweDAzMDMsCisJMHgwMDQxLCAweDAzMDgsIDB4MDA0MSwgMHgwMzBhLCAweDAwNDMsIDB4MDMyNywgMHgwMDQ1LCAweDAzMDAsCisJMHgwMDQ1LCAweDAzMDEsIDB4MDA0NSwgMHgwMzAyLCAweDAwNDUsIDB4MDMwOCwgMHgwMDQ5LCAweDAzMDAsCisJMHgwMDQ5LCAweDAzMDEsIDB4MDA0OSwgMHgwMzAyLCAweDAwNDksIDB4MDMwOCwgMHgwMDRlLCAweDAzMDMsCisJMHgwMDRmLCAweDAzMDAsIDB4MDA0ZiwgMHgwMzAxLCAweDAwNGYsIDB4MDMwMiwgMHgwMDRmLCAweDAzMDMsCisJMHgwMDRmLCAweDAzMDgsIDB4MDA1NSwgMHgwMzAwLCAweDAwNTUsIDB4MDMwMSwgMHgwMDU1LCAweDAzMDIsCisJMHgwMDU1LCAweDAzMDgsIDB4MDA1OSwgMHgwMzAxLCAweDAwNjEsIDB4MDMwMCwgMHgwMDYxLCAweDAzMDEsCisJMHgwMDYxLCAweDAzMDIsIDB4MDA2MSwgMHgwMzAzLCAweDAwNjEsIDB4MDMwOCwgMHgwMDYxLCAweDAzMGEsCisJMHgwMDYzLCAweDAzMjcsIDB4MDA2NSwgMHgwMzAwLCAweDAwNjUsIDB4MDMwMSwgMHgwMDY1LCAweDAzMDIsCisJMHgwMDY1LCAweDAzMDgsIDB4MDA2OSwgMHgwMzAwLCAweDAwNjksIDB4MDMwMSwgMHgwMDY5LCAweDAzMDIsCisJMHgwMDY5LCAweDAzMDgsIDB4MDA2ZSwgMHgwMzAzLCAweDAwNmYsIDB4MDMwMCwgMHgwMDZmLCAweDAzMDEsCisJMHgwMDZmLCAweDAzMDIsIDB4MDA2ZiwgMHgwMzAzLCAweDAwNmYsIDB4MDMwOCwgMHgwMDc1LCAweDAzMDAsCisJMHgwMDc1LCAweDAzMDEsIDB4MDA3NSwgMHgwMzAyLCAweDAwNzUsIDB4MDMwOCwgMHgwMDc5LCAweDAzMDEsCisJMHgwMDc5LCAweDAzMDgsIDB4MDA0MSwgMHgwMzA0LCAweDAwNjEsIDB4MDMwNCwgMHgwMDQxLCAweDAzMDYsCisJMHgwMDYxLCAweDAzMDYsIDB4MDA0MSwgMHgwMzI4LCAweDAwNjEsIDB4MDMyOCwgMHgwMDQzLCAweDAzMDEsCisJMHgwMDYzLCAweDAzMDEsIDB4MDA0MywgMHgwMzAyLCAweDAwNjMsIDB4MDMwMiwgMHgwMDQzLCAweDAzMDcsCisJMHgwMDYzLCAweDAzMDcsIDB4MDA0MywgMHgwMzBjLCAweDAwNjMsIDB4MDMwYywgMHgwMDQ0LCAweDAzMGMsCisJMHgwMDY0LCAweDAzMGMsIDB4MDA0NSwgMHgwMzA0LCAweDAwNjUsIDB4MDMwNCwgMHgwMDQ1LCAweDAzMDYsCisJMHgwMDY1LCAweDAzMDYsIDB4MDA0NSwgMHgwMzA3LCAweDAwNjUsIDB4MDMwNywgMHgwMDQ1LCAweDAzMjgsCisJMHgwMDY1LCAweDAzMjgsIDB4MDA0NSwgMHgwMzBjLCAweDAwNjUsIDB4MDMwYywgMHgwMDQ3LCAweDAzMDIsCisJMHgwMDY3LCAweDAzMDIsIDB4MDA0NywgMHgwMzA2LCAweDAwNjcsIDB4MDMwNiwgMHgwMDQ3LCAweDAzMDcsCisJMHgwMDY3LCAweDAzMDcsIDB4MDA0NywgMHgwMzI3LCAweDAwNjcsIDB4MDMyNywgMHgwMDQ4LCAweDAzMDIsCisJMHgwMDY4LCAweDAzMDIsIDB4MDA0OSwgMHgwMzAzLCAweDAwNjksIDB4MDMwMywgMHgwMDQ5LCAweDAzMDQsCisJMHgwMDY5LCAweDAzMDQsIDB4MDA0OSwgMHgwMzA2LCAweDAwNjksIDB4MDMwNiwgMHgwMDQ5LCAweDAzMjgsCisJMHgwMDY5LCAweDAzMjgsIDB4MDA0OSwgMHgwMzA3LCAweDAwNGEsIDB4MDMwMiwgMHgwMDZhLCAweDAzMDIsCisJMHgwMDRiLCAweDAzMjcsIDB4MDA2YiwgMHgwMzI3LCAweDAwNGMsIDB4MDMwMSwgMHgwMDZjLCAweDAzMDEsCisJMHgwMDRjLCAweDAzMjcsIDB4MDA2YywgMHgwMzI3LCAweDAwNGMsIDB4MDMwYywgMHgwMDZjLCAweDAzMGMsCisJMHgwMDRlLCAweDAzMDEsIDB4MDA2ZSwgMHgwMzAxLCAweDAwNGUsIDB4MDMyNywgMHgwMDZlLCAweDAzMjcsCisJMHgwMDRlLCAweDAzMGMsIDB4MDA2ZSwgMHgwMzBjLCAweDAwNGYsIDB4MDMwNCwgMHgwMDZmLCAweDAzMDQsCisJMHgwMDRmLCAweDAzMDYsIDB4MDA2ZiwgMHgwMzA2LCAweDAwNGYsIDB4MDMwYiwgMHgwMDZmLCAweDAzMGIsCisJMHgwMDUyLCAweDAzMDEsIDB4MDA3MiwgMHgwMzAxLCAweDAwNTIsIDB4MDMyNywgMHgwMDcyLCAweDAzMjcsCisJMHgwMDUyLCAweDAzMGMsIDB4MDA3MiwgMHgwMzBjLCAweDAwNTMsIDB4MDMwMSwgMHgwMDczLCAweDAzMDEsCisJMHgwMDUzLCAweDAzMDIsIDB4MDA3MywgMHgwMzAyLCAweDAwNTMsIDB4MDMyNywgMHgwMDczLCAweDAzMjcsCisJMHgwMDUzLCAweDAzMGMsIDB4MDA3MywgMHgwMzBjLCAweDAwNTQsIDB4MDMyNywgMHgwMDc0LCAweDAzMjcsCisJMHgwMDU0LCAweDAzMGMsIDB4MDA3NCwgMHgwMzBjLCAweDAwNTUsIDB4MDMwMywgMHgwMDc1LCAweDAzMDMsCisJMHgwMDU1LCAweDAzMDQsIDB4MDA3NSwgMHgwMzA0LCAweDAwNTUsIDB4MDMwNiwgMHgwMDc1LCAweDAzMDYsCisJMHgwMDU1LCAweDAzMGEsIDB4MDA3NSwgMHgwMzBhLCAweDAwNTUsIDB4MDMwYiwgMHgwMDc1LCAweDAzMGIsCisJMHgwMDU1LCAweDAzMjgsIDB4MDA3NSwgMHgwMzI4LCAweDAwNTcsIDB4MDMwMiwgMHgwMDc3LCAweDAzMDIsCisJMHgwMDU5LCAweDAzMDIsIDB4MDA3OSwgMHgwMzAyLCAweDAwNTksIDB4MDMwOCwgMHgwMDVhLCAweDAzMDEsCisJMHgwMDdhLCAweDAzMDEsIDB4MDA1YSwgMHgwMzA3LCAweDAwN2EsIDB4MDMwNywgMHgwMDVhLCAweDAzMGMsCisJMHgwMDdhLCAweDAzMGMsIDB4MDA0ZiwgMHgwMzFiLCAweDAwNmYsIDB4MDMxYiwgMHgwMDU1LCAweDAzMWIsCisJMHgwMDc1LCAweDAzMWIsIDB4MDA0MSwgMHgwMzBjLCAweDAwNjEsIDB4MDMwYywgMHgwMDQ5LCAweDAzMGMsCisJMHgwMDY5LCAweDAzMGMsIDB4MDA0ZiwgMHgwMzBjLCAweDAwNmYsIDB4MDMwYywgMHgwMDU1LCAweDAzMGMsCisJMHgwMDc1LCAweDAzMGMsIDB4MDA1NSwgMHgwMzA4LCAweDAzMDQsIDB4MDA3NSwgMHgwMzA4LCAweDAzMDQsCisJMHgwMDU1LCAweDAzMDgsIDB4MDMwMSwgMHgwMDc1LCAweDAzMDgsIDB4MDMwMSwgMHgwMDU1LCAweDAzMDgsCisJMHgwMzBjLCAweDAwNzUsIDB4MDMwOCwgMHgwMzBjLCAweDAwNTUsIDB4MDMwOCwgMHgwMzAwLCAweDAwNzUsCisJMHgwMzA4LCAweDAzMDAsIDB4MDA0MSwgMHgwMzA4LCAweDAzMDQsIDB4MDA2MSwgMHgwMzA4LCAweDAzMDQsCisJMHgwMDQxLCAweDAzMDcsIDB4MDMwNCwgMHgwMDYxLCAweDAzMDcsIDB4MDMwNCwgMHgwMGM2LCAweDAzMDQsCisJMHgwMGU2LCAweDAzMDQsIDB4MDA0NywgMHgwMzBjLCAweDAwNjcsIDB4MDMwYywgMHgwMDRiLCAweDAzMGMsCisJMHgwMDZiLCAweDAzMGMsIDB4MDA0ZiwgMHgwMzI4LCAweDAwNmYsIDB4MDMyOCwgMHgwMDRmLCAweDAzMjgsCisJMHgwMzA0LCAweDAwNmYsIDB4MDMyOCwgMHgwMzA0LCAweDAxYjcsIDB4MDMwYywgMHgwMjkyLCAweDAzMGMsCisJMHgwMDZhLCAweDAzMGMsIDB4MDA0NywgMHgwMzAxLCAweDAwNjcsIDB4MDMwMSwgMHgwMDQxLCAweDAzMGEsCisJMHgwMzAxLCAweDAwNjEsIDB4MDMwYSwgMHgwMzAxLCAweDAwYzYsIDB4MDMwMSwgMHgwMGU2LCAweDAzMDEsCisJMHgwMGQ4LCAweDAzMDEsIDB4MDBmOCwgMHgwMzAxLCAweDAwNDEsIDB4MDMwZiwgMHgwMDYxLCAweDAzMGYsCisJMHgwMDQxLCAweDAzMTEsIDB4MDA2MSwgMHgwMzExLCAweDAwNDUsIDB4MDMwZiwgMHgwMDY1LCAweDAzMGYsCisJMHgwMDQ1LCAweDAzMTEsIDB4MDA2NSwgMHgwMzExLCAweDAwNDksIDB4MDMwZiwgMHgwMDY5LCAweDAzMGYsCisJMHgwMDQ5LCAweDAzMTEsIDB4MDA2OSwgMHgwMzExLCAweDAwNGYsIDB4MDMwZiwgMHgwMDZmLCAweDAzMGYsCisJMHgwMDRmLCAweDAzMTEsIDB4MDA2ZiwgMHgwMzExLCAweDAwNTIsIDB4MDMwZiwgMHgwMDcyLCAweDAzMGYsCisJMHgwMDUyLCAweDAzMTEsIDB4MDA3MiwgMHgwMzExLCAweDAwNTUsIDB4MDMwZiwgMHgwMDc1LCAweDAzMGYsCisJMHgwMDU1LCAweDAzMTEsIDB4MDA3NSwgMHgwMzExLCAweDAzMDYsIDB4MDMwNywgMHgwMzAwLCAweDAzMDEsCisJMHgwMzEzLCAweDAzMDgsIDB4MDMwZCwgMHgwMmI5LCAweDAwM2IsIDB4MDBhOCwgMHgwMzBkLCAweDAzOTEsCisJMHgwMzBkLCAweDAwYjcsIDB4MDM5NSwgMHgwMzBkLCAweDAzOTcsIDB4MDMwZCwgMHgwMzk5LCAweDAzMGQsCisJMHgwMzlmLCAweDAzMGQsIDB4MDNhNSwgMHgwMzBkLCAweDAzYTksIDB4MDMwZCwgMHgwM2I5LCAweDAzMDgsCisJMHgwMzBkLCAweDAzOTksIDB4MDMwOCwgMHgwM2E1LCAweDAzMDgsIDB4MDNiMSwgMHgwMzBkLCAweDAzYjUsCisJMHgwMzBkLCAweDAzYjcsIDB4MDMwZCwgMHgwM2I5LCAweDAzMGQsIDB4MDNjNSwgMHgwMzA4LCAweDAzMGQsCisJMHgwM2I5LCAweDAzMDgsIDB4MDNjNSwgMHgwMzA4LCAweDAzYmYsIDB4MDMwZCwgMHgwM2M1LCAweDAzMGQsCisJMHgwM2M5LCAweDAzMGQsIDB4MDNkMiwgMHgwMzBkLCAweDAzZDIsIDB4MDMwOCwgMHgwNDE1LCAweDAzMDgsCisJMHgwNDEzLCAweDAzMDEsIDB4MDQwNiwgMHgwMzA4LCAweDA0MWEsIDB4MDMwMSwgMHgwNDIzLCAweDAzMDYsCisJMHgwNDE4LCAweDAzMDYsIDB4MDQzOCwgMHgwMzA2LCAweDA0MzUsIDB4MDMwOCwgMHgwNDMzLCAweDAzMDEsCisJMHgwNDU2LCAweDAzMDgsIDB4MDQzYSwgMHgwMzAxLCAweDA0NDMsIDB4MDMwNiwgMHgwNDc0LCAweDAzMGYsCisJMHgwNDc1LCAweDAzMGYsIDB4MDQxNiwgMHgwMzA2LCAweDA0MzYsIDB4MDMwNiwgMHgwNDEwLCAweDAzMDYsCisJMHgwNDMwLCAweDAzMDYsIDB4MDQxMCwgMHgwMzA4LCAweDA0MzAsIDB4MDMwOCwgMHgwMGM2LCAweDAwZTYsCisJMHgwNDE1LCAweDAzMDYsIDB4MDQzNSwgMHgwMzA2LCAweDAxOGYsIDB4MDI1OSwgMHgwMThmLCAweDAzMDgsCisJMHgwMjU5LCAweDAzMDgsIDB4MDQxNiwgMHgwMzA4LCAweDA0MzYsIDB4MDMwOCwgMHgwNDE3LCAweDAzMDgsCisJMHgwNDM3LCAweDAzMDgsIDB4MDFiNywgMHgwMjkyLCAweDA0MTgsIDB4MDMwNCwgMHgwNDM4LCAweDAzMDQsCisJMHgwNDE4LCAweDAzMDgsIDB4MDQzOCwgMHgwMzA4LCAweDA0MWUsIDB4MDMwOCwgMHgwNDNlLCAweDAzMDgsCisJMHgwMTlmLCAweDAyNzUsIDB4MDE5ZiwgMHgwMzA4LCAweDAyNzUsIDB4MDMwOCwgMHgwNDIzLCAweDAzMDQsCisJMHgwNDQzLCAweDAzMDQsIDB4MDQyMywgMHgwMzA4LCAweDA0NDMsIDB4MDMwOCwgMHgwNDIzLCAweDAzMGIsCisJMHgwNDQzLCAweDAzMGIsIDB4MDQyNywgMHgwMzA4LCAweDA0NDcsIDB4MDMwOCwgMHgwNDJiLCAweDAzMDgsCisJMHgwNDRiLCAweDAzMDgsIDB4MDkyOCwgMHgwOTNjLCAweDA5MzAsIDB4MDkzYywgMHgwOTMzLCAweDA5M2MsCisJMHgwOTE1LCAweDA5M2MsIDB4MDkxNiwgMHgwOTNjLCAweDA5MTcsIDB4MDkzYywgMHgwOTFjLCAweDA5M2MsCisJMHgwOTIxLCAweDA5M2MsIDB4MDkyMiwgMHgwOTNjLCAweDA5MmIsIDB4MDkzYywgMHgwOTJmLCAweDA5M2MsCisJMHgwOWFjLCAweDA5YmMsIDB4MDljNywgMHgwOWJlLCAweDA5YzcsIDB4MDlkNywgMHgwOWExLCAweDA5YmMsCisJMHgwOWEyLCAweDA5YmMsIDB4MDlhZiwgMHgwOWJjLCAweDBhMTYsIDB4MGEzYywgMHgwYTE3LCAweDBhM2MsCisJMHgwYTFjLCAweDBhM2MsIDB4MGEyMSwgMHgwYTNjLCAweDBhMmIsIDB4MGEzYywgMHgwYjQ3LCAweDBiNTYsCisJMHgwYjQ3LCAweDBiM2UsIDB4MGI0NywgMHgwYjU3LCAweDBiMjEsIDB4MGIzYywgMHgwYjIyLCAweDBiM2MsCisJMHgwYjJmLCAweDBiM2MsIDB4MGI5MiwgMHgwYmQ3LCAweDBiYzYsIDB4MGJiZSwgMHgwYmM3LCAweDBiYmUsCisJMHgwYmM2LCAweDBiZDcsIDB4MGM0NiwgMHgwYzU2LCAweDBjYmYsIDB4MGNkNSwgMHgwY2M2LCAweDBjZDUsCisJMHgwY2M2LCAweDBjZDYsIDB4MGNjNiwgMHgwY2MyLCAweDBjYzYsIDB4MGNjMiwgMHgwY2Q1LCAweDBkNDYsCisJMHgwZDNlLCAweDBkNDcsIDB4MGQzZSwgMHgwZDQ2LCAweDBkNTcsIDB4MGU0ZCwgMHgwZTMyLCAweDBlY2QsCisJMHgwZWIyLCAweDBmNDIsIDB4MGZiNywgMHgwZjRjLCAweDBmYjcsIDB4MGY1MSwgMHgwZmI3LCAweDBmNTYsCisJMHgwZmI3LCAweDBmNWIsIDB4MGZiNywgMHgwZjQwLCAweDBmYjUsIDB4MGY3MiwgMHgwZjcxLCAweDBmNzQsCisJMHgwZjcxLCAweDBmYjIsIDB4MGY4MCwgMHgwZmIyLCAweDBmODAsIDB4MGY3MSwgMHgwZmIzLCAweDBmODAsCisJMHgwZmIzLCAweDBmODAsIDB4MGY3MSwgMHgwZjgwLCAweDBmNzEsIDB4MGY5MiwgMHgwZmI3LCAweDBmOWMsCisJMHgwZmI3LCAweDBmYTEsIDB4MGZiNywgMHgwZmE2LCAweDBmYjcsIDB4MGZhYiwgMHgwZmI3LCAweDBmOTAsCisJMHgwZmI1LCAweDAwNDEsIDB4MDMyNSwgMHgwMDYxLCAweDAzMjUsIDB4MDA0MiwgMHgwMzA3LCAweDAwNjIsCisJMHgwMzA3LCAweDAwNDIsIDB4MDMyMywgMHgwMDYyLCAweDAzMjMsIDB4MDA0MiwgMHgwMzMxLCAweDAwNjIsCisJMHgwMzMxLCAweDAwNDMsIDB4MDMyNywgMHgwMzAxLCAweDAwNjMsIDB4MDMyNywgMHgwMzAxLCAweDAwNDQsCisJMHgwMzA3LCAweDAwNjQsIDB4MDMwNywgMHgwMDQ0LCAweDAzMjMsIDB4MDA2NCwgMHgwMzIzLCAweDAwNDQsCisJMHgwMzMxLCAweDAwNjQsIDB4MDMzMSwgMHgwMDQ0LCAweDAzMjcsIDB4MDA2NCwgMHgwMzI3LCAweDAwNDQsCisJMHgwMzJkLCAweDAwNjQsIDB4MDMyZCwgMHgwMDQ1LCAweDAzMDQsIDB4MDMwMCwgMHgwMDY1LCAweDAzMDQsCisJMHgwMzAwLCAweDAwNDUsIDB4MDMwNCwgMHgwMzAxLCAweDAwNjUsIDB4MDMwNCwgMHgwMzAxLCAweDAwNDUsCisJMHgwMzJkLCAweDAwNjUsIDB4MDMyZCwgMHgwMDQ1LCAweDAzMzAsIDB4MDA2NSwgMHgwMzMwLCAweDAwNDUsCisJMHgwMzI3LCAweDAzMDYsIDB4MDA2NSwgMHgwMzI3LCAweDAzMDYsIDB4MDA0NiwgMHgwMzA3LCAweDAwNjYsCisJMHgwMzA3LCAweDAwNDcsIDB4MDMwNCwgMHgwMDY3LCAweDAzMDQsIDB4MDA0OCwgMHgwMzA3LCAweDAwNjgsCisJMHgwMzA3LCAweDAwNDgsIDB4MDMyMywgMHgwMDY4LCAweDAzMjMsIDB4MDA0OCwgMHgwMzA4LCAweDAwNjgsCisJMHgwMzA4LCAweDAwNDgsIDB4MDMyNywgMHgwMDY4LCAweDAzMjcsIDB4MDA0OCwgMHgwMzJlLCAweDAwNjgsCisJMHgwMzJlLCAweDAwNDksIDB4MDMzMCwgMHgwMDY5LCAweDAzMzAsIDB4MDA0OSwgMHgwMzA4LCAweDAzMDEsCisJMHgwMDY5LCAweDAzMDgsIDB4MDMwMSwgMHgwMDRiLCAweDAzMDEsIDB4MDA2YiwgMHgwMzAxLCAweDAwNGIsCisJMHgwMzIzLCAweDAwNmIsIDB4MDMyMywgMHgwMDRiLCAweDAzMzEsIDB4MDA2YiwgMHgwMzMxLCAweDAwNGMsCisJMHgwMzIzLCAweDAwNmMsIDB4MDMyMywgMHgwMDRjLCAweDAzMjMsIDB4MDMwNCwgMHgwMDZjLCAweDAzMjMsCisJMHgwMzA0LCAweDAwNGMsIDB4MDMzMSwgMHgwMDZjLCAweDAzMzEsIDB4MDA0YywgMHgwMzJkLCAweDAwNmMsCisJMHgwMzJkLCAweDAwNGQsIDB4MDMwMSwgMHgwMDZkLCAweDAzMDEsIDB4MDA0ZCwgMHgwMzA3LCAweDAwNmQsCisJMHgwMzA3LCAweDAwNGQsIDB4MDMyMywgMHgwMDZkLCAweDAzMjMsIDB4MDA0ZSwgMHgwMzA3LCAweDAwNmUsCisJMHgwMzA3LCAweDAwNGUsIDB4MDMyMywgMHgwMDZlLCAweDAzMjMsIDB4MDA0ZSwgMHgwMzMxLCAweDAwNmUsCisJMHgwMzMxLCAweDAwNGUsIDB4MDMyZCwgMHgwMDZlLCAweDAzMmQsIDB4MDA0ZiwgMHgwMzAzLCAweDAzMDEsCisJMHgwMDZmLCAweDAzMDMsIDB4MDMwMSwgMHgwMDRmLCAweDAzMDMsIDB4MDMwOCwgMHgwMDZmLCAweDAzMDMsCisJMHgwMzA4LCAweDAwNGYsIDB4MDMwNCwgMHgwMzAwLCAweDAwNmYsIDB4MDMwNCwgMHgwMzAwLCAweDAwNGYsCisJMHgwMzA0LCAweDAzMDEsIDB4MDA2ZiwgMHgwMzA0LCAweDAzMDEsIDB4MDA1MCwgMHgwMzAxLCAweDAwNzAsCisJMHgwMzAxLCAweDAwNTAsIDB4MDMwNywgMHgwMDcwLCAweDAzMDcsIDB4MDA1MiwgMHgwMzA3LCAweDAwNzIsCisJMHgwMzA3LCAweDAwNTIsIDB4MDMyMywgMHgwMDcyLCAweDAzMjMsIDB4MDA1MiwgMHgwMzIzLCAweDAzMDQsCisJMHgwMDcyLCAweDAzMjMsIDB4MDMwNCwgMHgwMDUyLCAweDAzMzEsIDB4MDA3MiwgMHgwMzMxLCAweDAwNTMsCisJMHgwMzA3LCAweDAwNzMsIDB4MDMwNywgMHgwMDUzLCAweDAzMjMsIDB4MDA3MywgMHgwMzIzLCAweDAwNTMsCisJMHgwMzAxLCAweDAzMDcsIDB4MDA3MywgMHgwMzAxLCAweDAzMDcsIDB4MDA1MywgMHgwMzBjLCAweDAzMDcsCisJMHgwMDczLCAweDAzMGMsIDB4MDMwNywgMHgwMDUzLCAweDAzMjMsIDB4MDMwNywgMHgwMDczLCAweDAzMjMsCisJMHgwMzA3LCAweDAwNTQsIDB4MDMwNywgMHgwMDc0LCAweDAzMDcsIDB4MDA1NCwgMHgwMzIzLCAweDAwNzQsCisJMHgwMzIzLCAweDAwNTQsIDB4MDMzMSwgMHgwMDc0LCAweDAzMzEsIDB4MDA1NCwgMHgwMzJkLCAweDAwNzQsCisJMHgwMzJkLCAweDAwNTUsIDB4MDMyNCwgMHgwMDc1LCAweDAzMjQsIDB4MDA1NSwgMHgwMzMwLCAweDAwNzUsCisJMHgwMzMwLCAweDAwNTUsIDB4MDMyZCwgMHgwMDc1LCAweDAzMmQsIDB4MDA1NSwgMHgwMzAzLCAweDAzMDEsCisJMHgwMDc1LCAweDAzMDMsIDB4MDMwMSwgMHgwMDU1LCAweDAzMDQsIDB4MDMwOCwgMHgwMDc1LCAweDAzMDQsCisJMHgwMzA4LCAweDAwNTYsIDB4MDMwMywgMHgwMDc2LCAweDAzMDMsIDB4MDA1NiwgMHgwMzIzLCAweDAwNzYsCisJMHgwMzIzLCAweDAwNTcsIDB4MDMwMCwgMHgwMDc3LCAweDAzMDAsIDB4MDA1NywgMHgwMzAxLCAweDAwNzcsCisJMHgwMzAxLCAweDAwNTcsIDB4MDMwOCwgMHgwMDc3LCAweDAzMDgsIDB4MDA1NywgMHgwMzA3LCAweDAwNzcsCisJMHgwMzA3LCAweDAwNTcsIDB4MDMyMywgMHgwMDc3LCAweDAzMjMsIDB4MDA1OCwgMHgwMzA3LCAweDAwNzgsCisJMHgwMzA3LCAweDAwNTgsIDB4MDMwOCwgMHgwMDc4LCAweDAzMDgsIDB4MDA1OSwgMHgwMzA3LCAweDAwNzksCisJMHgwMzA3LCAweDAwNWEsIDB4MDMwMiwgMHgwMDdhLCAweDAzMDIsIDB4MDA1YSwgMHgwMzIzLCAweDAwN2EsCisJMHgwMzIzLCAweDAwNWEsIDB4MDMzMSwgMHgwMDdhLCAweDAzMzEsIDB4MDA2OCwgMHgwMzMxLCAweDAwNzQsCisJMHgwMzA4LCAweDAwNzcsIDB4MDMwYSwgMHgwMDc5LCAweDAzMGEsIDB4MDE3ZiwgMHgwMzA3LCAweDAwNDEsCisJMHgwMzIzLCAweDAwNjEsIDB4MDMyMywgMHgwMDQxLCAweDAzMDksIDB4MDA2MSwgMHgwMzA5LCAweDAwNDEsCisJMHgwMzAyLCAweDAzMDEsIDB4MDA2MSwgMHgwMzAyLCAweDAzMDEsIDB4MDA0MSwgMHgwMzAyLCAweDAzMDAsCisJMHgwMDYxLCAweDAzMDIsIDB4MDMwMCwgMHgwMDQxLCAweDAzMDIsIDB4MDMwOSwgMHgwMDYxLCAweDAzMDIsCisJMHgwMzA5LCAweDAwNDEsIDB4MDMwMiwgMHgwMzAzLCAweDAwNjEsIDB4MDMwMiwgMHgwMzAzLCAweDAwNDEsCisJMHgwMzIzLCAweDAzMDIsIDB4MDA2MSwgMHgwMzIzLCAweDAzMDIsIDB4MDA0MSwgMHgwMzA2LCAweDAzMDEsCisJMHgwMDYxLCAweDAzMDYsIDB4MDMwMSwgMHgwMDQxLCAweDAzMDYsIDB4MDMwMCwgMHgwMDYxLCAweDAzMDYsCisJMHgwMzAwLCAweDAwNDEsIDB4MDMwNiwgMHgwMzA5LCAweDAwNjEsIDB4MDMwNiwgMHgwMzA5LCAweDAwNDEsCisJMHgwMzA2LCAweDAzMDMsIDB4MDA2MSwgMHgwMzA2LCAweDAzMDMsIDB4MDA0MSwgMHgwMzIzLCAweDAzMDYsCisJMHgwMDYxLCAweDAzMjMsIDB4MDMwNiwgMHgwMDQ1LCAweDAzMjMsIDB4MDA2NSwgMHgwMzIzLCAweDAwNDUsCisJMHgwMzA5LCAweDAwNjUsIDB4MDMwOSwgMHgwMDQ1LCAweDAzMDMsIDB4MDA2NSwgMHgwMzAzLCAweDAwNDUsCisJMHgwMzAyLCAweDAzMDEsIDB4MDA2NSwgMHgwMzAyLCAweDAzMDEsIDB4MDA0NSwgMHgwMzAyLCAweDAzMDAsCisJMHgwMDY1LCAweDAzMDIsIDB4MDMwMCwgMHgwMDQ1LCAweDAzMDIsIDB4MDMwOSwgMHgwMDY1LCAweDAzMDIsCisJMHgwMzA5LCAweDAwNDUsIDB4MDMwMiwgMHgwMzAzLCAweDAwNjUsIDB4MDMwMiwgMHgwMzAzLCAweDAwNDUsCisJMHgwMzIzLCAweDAzMDIsIDB4MDA2NSwgMHgwMzIzLCAweDAzMDIsIDB4MDA0OSwgMHgwMzA5LCAweDAwNjksCisJMHgwMzA5LCAweDAwNDksIDB4MDMyMywgMHgwMDY5LCAweDAzMjMsIDB4MDA0ZiwgMHgwMzIzLCAweDAwNmYsCisJMHgwMzIzLCAweDAwNGYsIDB4MDMwOSwgMHgwMDZmLCAweDAzMDksIDB4MDA0ZiwgMHgwMzAyLCAweDAzMDEsCisJMHgwMDZmLCAweDAzMDIsIDB4MDMwMSwgMHgwMDRmLCAweDAzMDIsIDB4MDMwMCwgMHgwMDZmLCAweDAzMDIsCisJMHgwMzAwLCAweDAwNGYsIDB4MDMwMiwgMHgwMzA5LCAweDAwNmYsIDB4MDMwMiwgMHgwMzA5LCAweDAwNGYsCisJMHgwMzAyLCAweDAzMDMsIDB4MDA2ZiwgMHgwMzAyLCAweDAzMDMsIDB4MDA0ZiwgMHgwMzIzLCAweDAzMDIsCisJMHgwMDZmLCAweDAzMjMsIDB4MDMwMiwgMHgwMDRmLCAweDAzMWIsIDB4MDMwMSwgMHgwMDZmLCAweDAzMWIsCisJMHgwMzAxLCAweDAwNGYsIDB4MDMxYiwgMHgwMzAwLCAweDAwNmYsIDB4MDMxYiwgMHgwMzAwLCAweDAwNGYsCisJMHgwMzFiLCAweDAzMDksIDB4MDA2ZiwgMHgwMzFiLCAweDAzMDksIDB4MDA0ZiwgMHgwMzFiLCAweDAzMDMsCisJMHgwMDZmLCAweDAzMWIsIDB4MDMwMywgMHgwMDRmLCAweDAzMWIsIDB4MDMyMywgMHgwMDZmLCAweDAzMWIsCisJMHgwMzIzLCAweDAwNTUsIDB4MDMyMywgMHgwMDc1LCAweDAzMjMsIDB4MDA1NSwgMHgwMzA5LCAweDAwNzUsCisJMHgwMzA5LCAweDAwNTUsIDB4MDMxYiwgMHgwMzAxLCAweDAwNzUsIDB4MDMxYiwgMHgwMzAxLCAweDAwNTUsCisJMHgwMzFiLCAweDAzMDAsIDB4MDA3NSwgMHgwMzFiLCAweDAzMDAsIDB4MDA1NSwgMHgwMzFiLCAweDAzMDksCisJMHgwMDc1LCAweDAzMWIsIDB4MDMwOSwgMHgwMDU1LCAweDAzMWIsIDB4MDMwMywgMHgwMDc1LCAweDAzMWIsCisJMHgwMzAzLCAweDAwNTUsIDB4MDMxYiwgMHgwMzIzLCAweDAwNzUsIDB4MDMxYiwgMHgwMzIzLCAweDAwNTksCisJMHgwMzAwLCAweDAwNzksIDB4MDMwMCwgMHgwMDU5LCAweDAzMjMsIDB4MDA3OSwgMHgwMzIzLCAweDAwNTksCisJMHgwMzA5LCAweDAwNzksIDB4MDMwOSwgMHgwMDU5LCAweDAzMDMsIDB4MDA3OSwgMHgwMzAzLCAweDAzYjEsCisJMHgwMzEzLCAweDAzYjEsIDB4MDMxNCwgMHgwM2IxLCAweDAzMTMsIDB4MDMwMCwgMHgwM2IxLCAweDAzMTQsCisJMHgwMzAwLCAweDAzYjEsIDB4MDMxMywgMHgwMzAxLCAweDAzYjEsIDB4MDMxNCwgMHgwMzAxLCAweDAzYjEsCisJMHgwMzEzLCAweDAzNDIsIDB4MDNiMSwgMHgwMzE0LCAweDAzNDIsIDB4MDM5MSwgMHgwMzEzLCAweDAzOTEsCisJMHgwMzE0LCAweDAzOTEsIDB4MDMxMywgMHgwMzAwLCAweDAzOTEsIDB4MDMxNCwgMHgwMzAwLCAweDAzOTEsCisJMHgwMzEzLCAweDAzMDEsIDB4MDM5MSwgMHgwMzE0LCAweDAzMDEsIDB4MDM5MSwgMHgwMzEzLCAweDAzNDIsCisJMHgwMzkxLCAweDAzMTQsIDB4MDM0MiwgMHgwM2I1LCAweDAzMTMsIDB4MDNiNSwgMHgwMzE0LCAweDAzYjUsCisJMHgwMzEzLCAweDAzMDAsIDB4MDNiNSwgMHgwMzE0LCAweDAzMDAsIDB4MDNiNSwgMHgwMzEzLCAweDAzMDEsCisJMHgwM2I1LCAweDAzMTQsIDB4MDMwMSwgMHgwMzk1LCAweDAzMTMsIDB4MDM5NSwgMHgwMzE0LCAweDAzOTUsCisJMHgwMzEzLCAweDAzMDAsIDB4MDM5NSwgMHgwMzE0LCAweDAzMDAsIDB4MDM5NSwgMHgwMzEzLCAweDAzMDEsCisJMHgwMzk1LCAweDAzMTQsIDB4MDMwMSwgMHgwM2I3LCAweDAzMTMsIDB4MDNiNywgMHgwMzE0LCAweDAzYjcsCisJMHgwMzEzLCAweDAzMDAsIDB4MDNiNywgMHgwMzE0LCAweDAzMDAsIDB4MDNiNywgMHgwMzEzLCAweDAzMDEsCisJMHgwM2I3LCAweDAzMTQsIDB4MDMwMSwgMHgwM2I3LCAweDAzMTMsIDB4MDM0MiwgMHgwM2I3LCAweDAzMTQsCisJMHgwMzQyLCAweDAzOTcsIDB4MDMxMywgMHgwMzk3LCAweDAzMTQsIDB4MDM5NywgMHgwMzEzLCAweDAzMDAsCisJMHgwMzk3LCAweDAzMTQsIDB4MDMwMCwgMHgwMzk3LCAweDAzMTMsIDB4MDMwMSwgMHgwMzk3LCAweDAzMTQsCisJMHgwMzAxLCAweDAzOTcsIDB4MDMxMywgMHgwMzQyLCAweDAzOTcsIDB4MDMxNCwgMHgwMzQyLCAweDAzYjksCisJMHgwMzEzLCAweDAzYjksIDB4MDMxNCwgMHgwM2I5LCAweDAzMTMsIDB4MDMwMCwgMHgwM2I5LCAweDAzMTQsCisJMHgwMzAwLCAweDAzYjksIDB4MDMxMywgMHgwMzAxLCAweDAzYjksIDB4MDMxNCwgMHgwMzAxLCAweDAzYjksCisJMHgwMzEzLCAweDAzNDIsIDB4MDNiOSwgMHgwMzE0LCAweDAzNDIsIDB4MDM5OSwgMHgwMzEzLCAweDAzOTksCisJMHgwMzE0LCAweDAzOTksIDB4MDMxMywgMHgwMzAwLCAweDAzOTksIDB4MDMxNCwgMHgwMzAwLCAweDAzOTksCisJMHgwMzEzLCAweDAzMDEsIDB4MDM5OSwgMHgwMzE0LCAweDAzMDEsIDB4MDM5OSwgMHgwMzEzLCAweDAzNDIsCisJMHgwMzk5LCAweDAzMTQsIDB4MDM0MiwgMHgwM2JmLCAweDAzMTMsIDB4MDNiZiwgMHgwMzE0LCAweDAzYmYsCisJMHgwMzEzLCAweDAzMDAsIDB4MDNiZiwgMHgwMzE0LCAweDAzMDAsIDB4MDNiZiwgMHgwMzEzLCAweDAzMDEsCisJMHgwM2JmLCAweDAzMTQsIDB4MDMwMSwgMHgwMzlmLCAweDAzMTMsIDB4MDM5ZiwgMHgwMzE0LCAweDAzOWYsCisJMHgwMzEzLCAweDAzMDAsIDB4MDM5ZiwgMHgwMzE0LCAweDAzMDAsIDB4MDM5ZiwgMHgwMzEzLCAweDAzMDEsCisJMHgwMzlmLCAweDAzMTQsIDB4MDMwMSwgMHgwM2M1LCAweDAzMTMsIDB4MDNjNSwgMHgwMzE0LCAweDAzYzUsCisJMHgwMzEzLCAweDAzMDAsIDB4MDNjNSwgMHgwMzE0LCAweDAzMDAsIDB4MDNjNSwgMHgwMzEzLCAweDAzMDEsCisJMHgwM2M1LCAweDAzMTQsIDB4MDMwMSwgMHgwM2M1LCAweDAzMTMsIDB4MDM0MiwgMHgwM2M1LCAweDAzMTQsCisJMHgwMzQyLCAweDAzYTUsIDB4MDMxNCwgMHgwM2E1LCAweDAzMTQsIDB4MDMwMCwgMHgwM2E1LCAweDAzMTQsCisJMHgwMzAxLCAweDAzYTUsIDB4MDMxNCwgMHgwMzQyLCAweDAzYzksIDB4MDMxMywgMHgwM2M5LCAweDAzMTQsCisJMHgwM2M5LCAweDAzMTMsIDB4MDMwMCwgMHgwM2M5LCAweDAzMTQsIDB4MDMwMCwgMHgwM2M5LCAweDAzMTMsCisJMHgwMzAxLCAweDAzYzksIDB4MDMxNCwgMHgwMzAxLCAweDAzYzksIDB4MDMxMywgMHgwMzQyLCAweDAzYzksCisJMHgwMzE0LCAweDAzNDIsIDB4MDNhOSwgMHgwMzEzLCAweDAzYTksIDB4MDMxNCwgMHgwM2E5LCAweDAzMTMsCisJMHgwMzAwLCAweDAzYTksIDB4MDMxNCwgMHgwMzAwLCAweDAzYTksIDB4MDMxMywgMHgwMzAxLCAweDAzYTksCisJMHgwMzE0LCAweDAzMDEsIDB4MDNhOSwgMHgwMzEzLCAweDAzNDIsIDB4MDNhOSwgMHgwMzE0LCAweDAzNDIsCisJMHgwM2IxLCAweDAzMDAsIDB4MDNiMSwgMHgwMzAxLCAweDAzYjUsIDB4MDMwMCwgMHgwM2I1LCAweDAzMDEsCisJMHgwM2I3LCAweDAzMDAsIDB4MDNiNywgMHgwMzAxLCAweDAzYjksIDB4MDMwMCwgMHgwM2I5LCAweDAzMDEsCisJMHgwM2JmLCAweDAzMDAsIDB4MDNiZiwgMHgwMzAxLCAweDAzYzUsIDB4MDMwMCwgMHgwM2M1LCAweDAzMDEsCisJMHgwM2M5LCAweDAzMDAsIDB4MDNjOSwgMHgwMzAxLCAweDAzYjEsIDB4MDM0NSwgMHgwMzEzLCAweDAzYjEsCisJMHgwMzQ1LCAweDAzMTQsIDB4MDNiMSwgMHgwMzQ1LCAweDAzMTMsIDB4MDMwMCwgMHgwM2IxLCAweDAzNDUsCisJMHgwMzE0LCAweDAzMDAsIDB4MDNiMSwgMHgwMzQ1LCAweDAzMTMsIDB4MDMwMSwgMHgwM2IxLCAweDAzNDUsCisJMHgwMzE0LCAweDAzMDEsIDB4MDNiMSwgMHgwMzQ1LCAweDAzMTMsIDB4MDM0MiwgMHgwM2IxLCAweDAzNDUsCisJMHgwMzE0LCAweDAzNDIsIDB4MDM5MSwgMHgwMzQ1LCAweDAzMTMsIDB4MDM5MSwgMHgwMzQ1LCAweDAzMTQsCisJMHgwMzkxLCAweDAzNDUsIDB4MDMxMywgMHgwMzAwLCAweDAzOTEsIDB4MDM0NSwgMHgwMzE0LCAweDAzMDAsCisJMHgwMzkxLCAweDAzNDUsIDB4MDMxMywgMHgwMzAxLCAweDAzOTEsIDB4MDM0NSwgMHgwMzE0LCAweDAzMDEsCisJMHgwMzkxLCAweDAzNDUsIDB4MDMxMywgMHgwMzQyLCAweDAzOTEsIDB4MDM0NSwgMHgwMzE0LCAweDAzNDIsCisJMHgwM2I3LCAweDAzNDUsIDB4MDMxMywgMHgwM2I3LCAweDAzNDUsIDB4MDMxNCwgMHgwM2I3LCAweDAzNDUsCisJMHgwMzEzLCAweDAzMDAsIDB4MDNiNywgMHgwMzQ1LCAweDAzMTQsIDB4MDMwMCwgMHgwM2I3LCAweDAzNDUsCisJMHgwMzEzLCAweDAzMDEsIDB4MDNiNywgMHgwMzQ1LCAweDAzMTQsIDB4MDMwMSwgMHgwM2I3LCAweDAzNDUsCisJMHgwMzEzLCAweDAzNDIsIDB4MDNiNywgMHgwMzQ1LCAweDAzMTQsIDB4MDM0MiwgMHgwMzk3LCAweDAzNDUsCisJMHgwMzEzLCAweDAzOTcsIDB4MDM0NSwgMHgwMzE0LCAweDAzOTcsIDB4MDM0NSwgMHgwMzEzLCAweDAzMDAsCisJMHgwMzk3LCAweDAzNDUsIDB4MDMxNCwgMHgwMzAwLCAweDAzOTcsIDB4MDM0NSwgMHgwMzEzLCAweDAzMDEsCisJMHgwMzk3LCAweDAzNDUsIDB4MDMxNCwgMHgwMzAxLCAweDAzOTcsIDB4MDM0NSwgMHgwMzEzLCAweDAzNDIsCisJMHgwMzk3LCAweDAzNDUsIDB4MDMxNCwgMHgwMzQyLCAweDAzYzksIDB4MDM0NSwgMHgwMzEzLCAweDAzYzksCisJMHgwMzQ1LCAweDAzMTQsIDB4MDNjOSwgMHgwMzQ1LCAweDAzMTMsIDB4MDMwMCwgMHgwM2M5LCAweDAzNDUsCisJMHgwMzE0LCAweDAzMDAsIDB4MDNjOSwgMHgwMzQ1LCAweDAzMTMsIDB4MDMwMSwgMHgwM2M5LCAweDAzNDUsCisJMHgwMzE0LCAweDAzMDEsIDB4MDNjOSwgMHgwMzQ1LCAweDAzMTMsIDB4MDM0MiwgMHgwM2M5LCAweDAzNDUsCisJMHgwMzE0LCAweDAzNDIsIDB4MDNhOSwgMHgwMzQ1LCAweDAzMTMsIDB4MDNhOSwgMHgwMzQ1LCAweDAzMTQsCisJMHgwM2E5LCAweDAzNDUsIDB4MDMxMywgMHgwMzAwLCAweDAzYTksIDB4MDM0NSwgMHgwMzE0LCAweDAzMDAsCisJMHgwM2E5LCAweDAzNDUsIDB4MDMxMywgMHgwMzAxLCAweDAzYTksIDB4MDM0NSwgMHgwMzE0LCAweDAzMDEsCisJMHgwM2E5LCAweDAzNDUsIDB4MDMxMywgMHgwMzQyLCAweDAzYTksIDB4MDM0NSwgMHgwMzE0LCAweDAzNDIsCisJMHgwM2IxLCAweDAzMDYsIDB4MDNiMSwgMHgwMzA0LCAweDAzYjEsIDB4MDM0NSwgMHgwMzAwLCAweDAzYjEsCisJMHgwMzQ1LCAweDAzYjEsIDB4MDM0NSwgMHgwMzAxLCAweDAzYjEsIDB4MDM0MiwgMHgwM2IxLCAweDAzNDUsCisJMHgwMzQyLCAweDAzOTEsIDB4MDMwNiwgMHgwMzkxLCAweDAzMDQsIDB4MDM5MSwgMHgwMzAwLCAweDAzOTEsCisJMHgwMzAxLCAweDAzOTEsIDB4MDM0NSwgMHgwM2I5LCAweDAwYTgsIDB4MDM0MiwgMHgwM2I3LCAweDAzNDUsCisJMHgwMzAwLCAweDAzYjcsIDB4MDM0NSwgMHgwM2I3LCAweDAzNDUsIDB4MDMwMSwgMHgwM2I3LCAweDAzNDIsCisJMHgwM2I3LCAweDAzNDUsIDB4MDM0MiwgMHgwMzk1LCAweDAzMDAsIDB4MDM5NSwgMHgwMzAxLCAweDAzOTcsCisJMHgwMzAwLCAweDAzOTcsIDB4MDMwMSwgMHgwMzk3LCAweDAzNDUsIDB4MWZiZiwgMHgwMzAwLCAweDFmYmYsCisJMHgwMzAxLCAweDFmYmYsIDB4MDM0MiwgMHgwM2I5LCAweDAzMDYsIDB4MDNiOSwgMHgwMzA0LCAweDAzYjksCisJMHgwMzA4LCAweDAzMDAsIDB4MDNiOSwgMHgwMzA4LCAweDAzMDEsIDB4MDNiOSwgMHgwMzQyLCAweDAzYjksCisJMHgwMzA4LCAweDAzNDIsIDB4MDM5OSwgMHgwMzA2LCAweDAzOTksIDB4MDMwNCwgMHgwMzk5LCAweDAzMDAsCisJMHgwMzk5LCAweDAzMDEsIDB4MWZmZSwgMHgwMzAwLCAweDFmZmUsIDB4MDMwMSwgMHgxZmZlLCAweDAzNDIsCisJMHgwM2M1LCAweDAzMDYsIDB4MDNjNSwgMHgwMzA0LCAweDAzYzUsIDB4MDMwOCwgMHgwMzAwLCAweDAzYzUsCisJMHgwMzA4LCAweDAzMDEsIDB4MDNjMSwgMHgwMzEzLCAweDAzYzEsIDB4MDMxNCwgMHgwM2M1LCAweDAzNDIsCisJMHgwM2M1LCAweDAzMDgsIDB4MDM0MiwgMHgwM2E1LCAweDAzMDYsIDB4MDNhNSwgMHgwMzA0LCAweDAzYTUsCisJMHgwMzAwLCAweDAzYTUsIDB4MDMwMSwgMHgwM2ExLCAweDAzMTQsIDB4MDBhOCwgMHgwMzAwLCAweDAwYTgsCisJMHgwMzAxLCAweDAwNjAsIDB4MDNjOSwgMHgwMzQ1LCAweDAzMDAsIDB4MDNjOSwgMHgwMzQ1LCAweDAzYmYsCisJMHgwMzQ1LCAweDAzMDEsIDB4MDNjOSwgMHgwMzQyLCAweDAzYzksIDB4MDM0NSwgMHgwMzQyLCAweDAzOWYsCisJMHgwMzAwLCAweDAzOWYsIDB4MDMwMSwgMHgwM2E5LCAweDAzMDAsIDB4MDNhOSwgMHgwMzAxLCAweDAzYTksCisJMHgwMzQ1LCAweDAwYjQsIDB4MzA0YiwgMHgzMDk5LCAweDMwNGQsIDB4MzA5OSwgMHgzMDRmLCAweDMwOTksCisJMHgzMDUxLCAweDMwOTksIDB4MzA1MywgMHgzMDk5LCAweDMwNTUsIDB4MzA5OSwgMHgzMDU3LCAweDMwOTksCisJMHgzMDU5LCAweDMwOTksIDB4MzA1YiwgMHgzMDk5LCAweDMwNWQsIDB4MzA5OSwgMHgzMDVmLCAweDMwOTksCisJMHgzMDYxLCAweDMwOTksIDB4MzA2NCwgMHgzMDk5LCAweDMwNjYsIDB4MzA5OSwgMHgzMDY4LCAweDMwOTksCisJMHgzMDZmLCAweDMwOTksIDB4MzA2ZiwgMHgzMDlhLCAweDMwNzIsIDB4MzA5OSwgMHgzMDcyLCAweDMwOWEsCisJMHgzMDc1LCAweDMwOTksIDB4MzA3NSwgMHgzMDlhLCAweDMwNzgsIDB4MzA5OSwgMHgzMDc4LCAweDMwOWEsCisJMHgzMDdiLCAweDMwOTksIDB4MzA3YiwgMHgzMDlhLCAweDMwNDYsIDB4MzA5OSwgMHgzMDlkLCAweDMwOTksCisJMHgzMGFiLCAweDMwOTksIDB4MzBhZCwgMHgzMDk5LCAweDMwYWYsIDB4MzA5OSwgMHgzMGIxLCAweDMwOTksCisJMHgzMGIzLCAweDMwOTksIDB4MzBiNSwgMHgzMDk5LCAweDMwYjcsIDB4MzA5OSwgMHgzMGI5LCAweDMwOTksCisJMHgzMGJiLCAweDMwOTksIDB4MzBiZCwgMHgzMDk5LCAweDMwYmYsIDB4MzA5OSwgMHgzMGMxLCAweDMwOTksCisJMHgzMGM0LCAweDMwOTksIDB4MzBjNiwgMHgzMDk5LCAweDMwYzgsIDB4MzA5OSwgMHgzMGNmLCAweDMwOTksCisJMHgzMGNmLCAweDMwOWEsIDB4MzBkMiwgMHgzMDk5LCAweDMwZDIsIDB4MzA5YSwgMHgzMGQ1LCAweDMwOTksCisJMHgzMGQ1LCAweDMwOWEsIDB4MzBkOCwgMHgzMDk5LCAweDMwZDgsIDB4MzA5YSwgMHgzMGRiLCAweDMwOTksCisJMHgzMGRiLCAweDMwOWEsIDB4MzBhNiwgMHgzMDk5LCAweDMwZWYsIDB4MzA5OSwgMHgzMGYwLCAweDMwOTksCisJMHgzMGYxLCAweDMwOTksIDB4MzBmMiwgMHgzMDk5LCAweDMwZmQsIDB4MzA5OSwgMHgwNWYyLCAweDA1YjcsCisJMHgwNWU5LCAweDA1YzEsIDB4MDVlOSwgMHgwNWMyLCAweDA1ZTksIDB4MDViYywgMHgwNWMxLCAweDA1ZTksCisJMHgwNWJjLCAweDA1YzIsIDB4MDVkMCwgMHgwNWI3LCAweDA1ZDAsIDB4MDViOCwgMHgwNWQwLCAweDA1YmMsCisJMHgwNWQxLCAweDA1YmMsIDB4MDVkMiwgMHgwNWJjLCAweDA1ZDMsIDB4MDViYywgMHgwNWQ0LCAweDA1YmMsCisJMHgwNWQ1LCAweDA1YmMsIDB4MDVkNiwgMHgwNWJjLCAweDA1ZDgsIDB4MDViYywgMHgwNWQ5LCAweDA1YmMsCisJMHgwNWRhLCAweDA1YmMsIDB4MDVkYiwgMHgwNWJjLCAweDA1ZGMsIDB4MDViYywgMHgwNWRlLCAweDA1YmMsCisJMHgwNWUwLCAweDA1YmMsIDB4MDVlMSwgMHgwNWJjLCAweDA1ZTMsIDB4MDViYywgMHgwNWU0LCAweDA1YmMsCisJMHgwNWU2LCAweDA1YmMsIDB4MDVlNywgMHgwNWJjLCAweDA1ZTgsIDB4MDViYywgMHgwNWU5LCAweDA1YmMsCisJMHgwNWVhLCAweDA1YmMsIDB4MDVkNSwgMHgwNWI5LCAweDA1ZDEsIDB4MDViZiwgMHgwNWRiLCAweDA1YmYsCisJMHgwNWU0LCAweDA1YmYKK307CisKK3UxNiBoZnNwbHVzX2NvbXBvc2VfdGFibGVbXSA9IHsKKwkvKiBiYXNlICovCisJMHgwMDAwLCAweDAwNTAsICAweDAzMDAsIDB4MDBhNCwgIDB4MDMwMSwgMHgwMGU0LCAgMHgwMzAyLCAweDAxNWMsCisJMHgwMzAzLCAweDAxOTIsICAweDAzMDQsIDB4MDFiNCwgIDB4MDMwNiwgMHgwMWU2LCAgMHgwMzA3LCAweDAyMjAsCisJMHgwMzA4LCAweDAyNzAsICAweDAzMDksIDB4MDJkMiwgIDB4MDMwYSwgMHgwMmVjLCAgMHgwMzBiLCAweDAyZmEsCisJMHgwMzBjLCAweDAzMDgsICAweDAzMGQsIDB4MDM0YywgIDB4MDMwZiwgMHgwMzcwLCAgMHgwMzExLCAweDAzOGUsCisJMHgwMzEzLCAweDAzYTgsICAweDAzMTQsIDB4MDNjNiwgIDB4MDMxYiwgMHgwM2U4LCAgMHgwMzIzLCAweDAzZjIsCisJMHgwMzI0LCAweDA0NDAsICAweDAzMjUsIDB4MDQ0NiwgIDB4MDMyNywgMHgwNDRjLCAgMHgwMzI4LCAweDA0N2EsCisJMHgwMzJkLCAweDA0OTAsICAweDAzMmUsIDB4MDRhYSwgIDB4MDMzMCwgMHgwNGIwLCAgMHgwMzMxLCAweDA0YmUsCisJMHgwMzQyLCAweDA0ZTIsICAweDAzNDUsIDB4MDRmNCwgIDB4MDViNywgMHgwNTA0LCAgMHgwNWI4LCAweDA1MGEsCisJMHgwNWI5LCAweDA1MGUsICAweDA1YmMsIDB4MDUxMiwgIDB4MDViZiwgMHgwNTQwLCAgMHgwNWMxLCAweDA1NDgsCisJMHgwNWMyLCAweDA1NGMsICAweDA5M2MsIDB4MDU1MCwgIDB4MDliYywgMHgwNTY4LCAgMHgwOWJlLCAweDA1NzIsCisJMHgwOWQ3LCAweDA1NzYsICAweDBhM2MsIDB4MDU3YSwgIDB4MGIzYywgMHgwNTg2LCAgMHgwYjNlLCAweDA1OGUsCisJMHgwYjU2LCAweDA1OTIsICAweDBiNTcsIDB4MDU5NiwgIDB4MGJiZSwgMHgwNTlhLCAgMHgwYmQ3LCAweDA1YTAsCisJMHgwYzU2LCAweDA1YTYsICAweDBjYzIsIDB4MDVhYSwgIDB4MGNkNSwgMHgwNWFlLCAgMHgwY2Q2LCAweDA1YjQsCisJMHgwZDNlLCAweDA1YjgsICAweDBkNTcsIDB4MDViZSwgIDB4MGUzMiwgMHgwNWMyLCAgMHgwZWIyLCAweDA1YzYsCisJMHgwZjcxLCAweDA1Y2EsICAweDBmODAsIDB4MDVkMiwgIDB4MGZiNSwgMHgwNWQ4LCAgMHgwZmI3LCAweDA1ZGUsCisJMHgxMTAwLCAweDAwYTIsICAweDExMDEsIDB4MDBhMiwgIDB4MTEwMiwgMHgwMGEyLCAgMHgxMTAzLCAweDAwYTIsCisJMHgxMTA0LCAweDAwYTIsICAweDExMDUsIDB4MDBhMiwgIDB4MTEwNiwgMHgwMGEyLCAgMHgxMTA3LCAweDAwYTIsCisJMHgxMTA4LCAweDAwYTIsICAweDExMDksIDB4MDBhMiwgIDB4MTEwYSwgMHgwMGEyLCAgMHgxMTBiLCAweDAwYTIsCisJMHgxMTBjLCAweDAwYTIsICAweDExMGQsIDB4MDBhMiwgIDB4MTEwZSwgMHgwMGEyLCAgMHgxMTBmLCAweDAwYTIsCisJMHgxMTEwLCAweDAwYTIsICAweDExMTEsIDB4MDBhMiwgIDB4MTExMiwgMHgwMGEyLCAgMHgzMDk5LCAweDA1ZjQsCisJMHgzMDlhLCAweDA2NTYsCisJLyogaGFuZ3VsIG1hcmtlciAqLworCTB4ZmZmZiwgMHgwMDAwLAorCS8qIDB4MDMwMCAqLworCTB4MDM0MCwgMHgwMDFmLCAgMHgwMDQxLCAweDA2NmMsICAweDAwNDUsIDB4MDY2ZSwgIDB4MDA0OSwgMHgwNjcwLAorCTB4MDA0ZiwgMHgwNjcyLCAgMHgwMDU1LCAweDA2NzQsICAweDAwNTcsIDB4MDY3NiwgIDB4MDA1OSwgMHgwNjc4LAorCTB4MDA2MSwgMHgwNjdhLCAgMHgwMDY1LCAweDA2N2MsICAweDAwNjksIDB4MDY3ZSwgIDB4MDA2ZiwgMHgwNjgwLAorCTB4MDA3NSwgMHgwNjgyLCAgMHgwMDc3LCAweDA2ODQsICAweDAwNzksIDB4MDY4NiwgIDB4MDBhOCwgMHgwNjg4LAorCTB4MDM5MSwgMHgwNjhhLCAgMHgwMzk1LCAweDA2OGMsICAweDAzOTcsIDB4MDY4ZSwgIDB4MDM5OSwgMHgwNjkwLAorCTB4MDM5ZiwgMHgwNjkyLCAgMHgwM2E1LCAweDA2OTQsICAweDAzYTksIDB4MDY5NiwgIDB4MDNiMSwgMHgwNjk4LAorCTB4MDNiNSwgMHgwNjlhLCAgMHgwM2I3LCAweDA2OWMsICAweDAzYjksIDB4MDY5ZSwgIDB4MDNiZiwgMHgwNmEwLAorCTB4MDNjNSwgMHgwNmEyLCAgMHgwM2M5LCAweDA2YTQsICAweDFmYmYsIDB4MDZhNiwgIDB4MWZmZSwgMHgwNmE4LAorCS8qIDB4MDMwMSAqLworCTB4MDM0MSwgMHgwMDNiLCAgMHgwMDQxLCAweDA2YWEsICAweDAwNDMsIDB4MDZhYywgIDB4MDA0NSwgMHgwNmFlLAorCTB4MDA0NywgMHgwNmIwLCAgMHgwMDQ5LCAweDA2YjIsICAweDAwNGIsIDB4MDZiNCwgIDB4MDA0YywgMHgwNmI2LAorCTB4MDA0ZCwgMHgwNmI4LCAgMHgwMDRlLCAweDA2YmEsICAweDAwNGYsIDB4MDZiYywgIDB4MDA1MCwgMHgwNmJlLAorCTB4MDA1MiwgMHgwNmMwLCAgMHgwMDUzLCAweDA2YzIsICAweDAwNTUsIDB4MDZjNiwgIDB4MDA1NywgMHgwNmM4LAorCTB4MDA1OSwgMHgwNmNhLCAgMHgwMDVhLCAweDA2Y2MsICAweDAwNjEsIDB4MDZjZSwgIDB4MDA2MywgMHgwNmQwLAorCTB4MDA2NSwgMHgwNmQyLCAgMHgwMDY3LCAweDA2ZDQsICAweDAwNjksIDB4MDZkNiwgIDB4MDA2YiwgMHgwNmQ4LAorCTB4MDA2YywgMHgwNmRhLCAgMHgwMDZkLCAweDA2ZGMsICAweDAwNmUsIDB4MDZkZSwgIDB4MDA2ZiwgMHgwNmUwLAorCTB4MDA3MCwgMHgwNmUyLCAgMHgwMDcyLCAweDA2ZTQsICAweDAwNzMsIDB4MDZlNiwgIDB4MDA3NSwgMHgwNmVhLAorCTB4MDA3NywgMHgwNmVjLCAgMHgwMDc5LCAweDA2ZWUsICAweDAwN2EsIDB4MDZmMCwgIDB4MDBhOCwgMHgwNmYyLAorCTB4MDBjNiwgMHgwNmY0LCAgMHgwMGQ4LCAweDA2ZjYsICAweDAwZTYsIDB4MDZmOCwgIDB4MDBmOCwgMHgwNmZhLAorCTB4MDM5MSwgMHgwNmZjLCAgMHgwMzk1LCAweDA2ZmUsICAweDAzOTcsIDB4MDcwMCwgIDB4MDM5OSwgMHgwNzAyLAorCTB4MDM5ZiwgMHgwNzA0LCAgMHgwM2E1LCAweDA3MDYsICAweDAzYTksIDB4MDcwOCwgIDB4MDNiMSwgMHgwNzBhLAorCTB4MDNiNSwgMHgwNzBjLCAgMHgwM2I3LCAweDA3MGUsICAweDAzYjksIDB4MDcxMCwgIDB4MDNiZiwgMHgwNzEyLAorCTB4MDNjNSwgMHgwNzE0LCAgMHgwM2M5LCAweDA3MTYsICAweDA0MTMsIDB4MDcxOCwgIDB4MDQxYSwgMHgwNzFhLAorCTB4MDQzMywgMHgwNzFjLCAgMHgwNDNhLCAweDA3MWUsICAweDFmYmYsIDB4MDcyMCwgIDB4MWZmZSwgMHgwNzIyLAorCS8qIDB4MDMwMiAqLworCTB4MDAwMCwgMHgwMDFhLCAgMHgwMDQxLCAweDA3MjQsICAweDAwNDMsIDB4MDcyZSwgIDB4MDA0NSwgMHgwNzMwLAorCTB4MDA0NywgMHgwNzNhLCAgMHgwMDQ4LCAweDA3M2MsICAweDAwNDksIDB4MDczZSwgIDB4MDA0YSwgMHgwNzQwLAorCTB4MDA0ZiwgMHgwNzQyLCAgMHgwMDUzLCAweDA3NGMsICAweDAwNTUsIDB4MDc0ZSwgIDB4MDA1NywgMHgwNzUwLAorCTB4MDA1OSwgMHgwNzUyLCAgMHgwMDVhLCAweDA3NTQsICAweDAwNjEsIDB4MDc1NiwgIDB4MDA2MywgMHgwNzYwLAorCTB4MDA2NSwgMHgwNzYyLCAgMHgwMDY3LCAweDA3NmMsICAweDAwNjgsIDB4MDc2ZSwgIDB4MDA2OSwgMHgwNzcwLAorCTB4MDA2YSwgMHgwNzcyLCAgMHgwMDZmLCAweDA3NzQsICAweDAwNzMsIDB4MDc3ZSwgIDB4MDA3NSwgMHgwNzgwLAorCTB4MDA3NywgMHgwNzgyLCAgMHgwMDc5LCAweDA3ODQsICAweDAwN2EsIDB4MDc4NiwKKwkvKiAweDAzMDMgKi8KKwkweDAwMDAsIDB4MDAxMCwgIDB4MDA0MSwgMHgwNzg4LCAgMHgwMDQ1LCAweDA3OGEsICAweDAwNDksIDB4MDc4YywKKwkweDAwNGUsIDB4MDc4ZSwgIDB4MDA0ZiwgMHgwNzkwLCAgMHgwMDU1LCAweDA3OTYsICAweDAwNTYsIDB4MDc5YSwKKwkweDAwNTksIDB4MDc5YywgIDB4MDA2MSwgMHgwNzllLCAgMHgwMDY1LCAweDA3YTAsICAweDAwNjksIDB4MDdhMiwKKwkweDAwNmUsIDB4MDdhNCwgIDB4MDA2ZiwgMHgwN2E2LCAgMHgwMDc1LCAweDA3YWMsICAweDAwNzYsIDB4MDdiMCwKKwkweDAwNzksIDB4MDdiMiwKKwkvKiAweDAzMDQgKi8KKwkweDAwMDAsIDB4MDAxOCwgIDB4MDA0MSwgMHgwN2I0LCAgMHgwMDQ1LCAweDA3YjYsICAweDAwNDcsIDB4MDdiYywKKwkweDAwNDksIDB4MDdiZSwgIDB4MDA0ZiwgMHgwN2MwLCAgMHgwMDU1LCAweDA3YzYsICAweDAwNjEsIDB4MDdjYSwKKwkweDAwNjUsIDB4MDdjYywgIDB4MDA2NywgMHgwN2QyLCAgMHgwMDY5LCAweDA3ZDQsICAweDAwNmYsIDB4MDdkNiwKKwkweDAwNzUsIDB4MDdkYywgIDB4MDBjNiwgMHgwN2UwLCAgMHgwMGU2LCAweDA3ZTIsICAweDAzOTEsIDB4MDdlNCwKKwkweDAzOTksIDB4MDdlNiwgIDB4MDNhNSwgMHgwN2U4LCAgMHgwM2IxLCAweDA3ZWEsICAweDAzYjksIDB4MDdlYywKKwkweDAzYzUsIDB4MDdlZSwgIDB4MDQxOCwgMHgwN2YwLCAgMHgwNDIzLCAweDA3ZjIsICAweDA0MzgsIDB4MDdmNCwKKwkweDA0NDMsIDB4MDdmNiwKKwkvKiAweDAzMDYgKi8KKwkweDAwMDAsIDB4MDAxYywgIDB4MDA0MSwgMHgwN2Y4LCAgMHgwMDQ1LCAweDA4MDIsICAweDAwNDcsIDB4MDgwNCwKKwkweDAwNDksIDB4MDgwNiwgIDB4MDA0ZiwgMHgwODA4LCAgMHgwMDU1LCAweDA4MGEsICAweDAwNjEsIDB4MDgwYywKKwkweDAwNjUsIDB4MDgxNiwgIDB4MDA2NywgMHgwODE4LCAgMHgwMDY5LCAweDA4MWEsICAweDAwNmYsIDB4MDgxYywKKwkweDAwNzUsIDB4MDgxZSwgIDB4MDM5MSwgMHgwODIwLCAgMHgwMzk5LCAweDA4MjIsICAweDAzYTUsIDB4MDgyNCwKKwkweDAzYjEsIDB4MDgyNiwgIDB4MDNiOSwgMHgwODI4LCAgMHgwM2M1LCAweDA4MmEsICAweDA0MTAsIDB4MDgyYywKKwkweDA0MTUsIDB4MDgyZSwgIDB4MDQxNiwgMHgwODMwLCAgMHgwNDE4LCAweDA4MzIsICAweDA0MjMsIDB4MDgzNCwKKwkweDA0MzAsIDB4MDgzNiwgIDB4MDQzNSwgMHgwODM4LCAgMHgwNDM2LCAweDA4M2EsICAweDA0MzgsIDB4MDgzYywKKwkweDA0NDMsIDB4MDgzZSwKKwkvKiAweDAzMDcgKi8KKwkweDAwMDAsIDB4MDAyNywgIDB4MDA0MSwgMHgwODQwLCAgMHgwMDQyLCAweDA4NDQsICAweDAwNDMsIDB4MDg0NiwKKwkweDAwNDQsIDB4MDg0OCwgIDB4MDA0NSwgMHgwODRhLCAgMHgwMDQ2LCAweDA4NGMsICAweDAwNDcsIDB4MDg0ZSwKKwkweDAwNDgsIDB4MDg1MCwgIDB4MDA0OSwgMHgwODUyLCAgMHgwMDRkLCAweDA4NTQsICAweDAwNGUsIDB4MDg1NiwKKwkweDAwNTAsIDB4MDg1OCwgIDB4MDA1MiwgMHgwODVhLCAgMHgwMDUzLCAweDA4NWMsICAweDAwNTQsIDB4MDg1ZSwKKwkweDAwNTcsIDB4MDg2MCwgIDB4MDA1OCwgMHgwODYyLCAgMHgwMDU5LCAweDA4NjQsICAweDAwNWEsIDB4MDg2NiwKKwkweDAwNjEsIDB4MDg2OCwgIDB4MDA2MiwgMHgwODZjLCAgMHgwMDYzLCAweDA4NmUsICAweDAwNjQsIDB4MDg3MCwKKwkweDAwNjUsIDB4MDg3MiwgIDB4MDA2NiwgMHgwODc0LCAgMHgwMDY3LCAweDA4NzYsICAweDAwNjgsIDB4MDg3OCwKKwkweDAwNmQsIDB4MDg3YSwgIDB4MDA2ZSwgMHgwODdjLCAgMHgwMDcwLCAweDA4N2UsICAweDAwNzIsIDB4MDg4MCwKKwkweDAwNzMsIDB4MDg4MiwgIDB4MDA3NCwgMHgwODg0LCAgMHgwMDc3LCAweDA4ODYsICAweDAwNzgsIDB4MDg4OCwKKwkweDAwNzksIDB4MDg4YSwgIDB4MDA3YSwgMHgwODhjLCAgMHgwMTdmLCAweDA4OGUsICAweDAzMDYsIDB4MDg5MCwKKwkvKiAweDAzMDggKi8KKwkweDAwMDAsIDB4MDAzMCwgIDB4MDA0MSwgMHgwODkyLCAgMHgwMDQ1LCAweDA4OTYsICAweDAwNDgsIDB4MDg5OCwKKwkweDAwNDksIDB4MDg5YSwgIDB4MDA0ZiwgMHgwODllLCAgMHgwMDU1LCAweDA4YTAsICAweDAwNTcsIDB4MDhhYSwKKwkweDAwNTgsIDB4MDhhYywgIDB4MDA1OSwgMHgwOGFlLCAgMHgwMDYxLCAweDA4YjAsICAweDAwNjUsIDB4MDhiNCwKKwkweDAwNjgsIDB4MDhiNiwgIDB4MDA2OSwgMHgwOGI4LCAgMHgwMDZmLCAweDA4YmMsICAweDAwNzQsIDB4MDhiZSwKKwkweDAwNzUsIDB4MDhjMCwgIDB4MDA3NywgMHgwOGNhLCAgMHgwMDc4LCAweDA4Y2MsICAweDAwNzksIDB4MDhjZSwKKwkweDAxOGYsIDB4MDhkMCwgIDB4MDE5ZiwgMHgwOGQyLCAgMHgwMjU5LCAweDA4ZDQsICAweDAyNzUsIDB4MDhkNiwKKwkweDAzOTksIDB4MDhkOCwgIDB4MDNhNSwgMHgwOGRhLCAgMHgwM2I5LCAweDA4ZGMsICAweDAzYzUsIDB4MDhlNiwKKwkweDAzZDIsIDB4MDhmMCwgIDB4MDQwNiwgMHgwOGYyLCAgMHgwNDEwLCAweDA4ZjQsICAweDA0MTUsIDB4MDhmNiwKKwkweDA0MTYsIDB4MDhmOCwgIDB4MDQxNywgMHgwOGZhLCAgMHgwNDE4LCAweDA4ZmMsICAweDA0MWUsIDB4MDhmZSwKKwkweDA0MjMsIDB4MDkwMCwgIDB4MDQyNywgMHgwOTAyLCAgMHgwNDJiLCAweDA5MDQsICAweDA0MzAsIDB4MDkwNiwKKwkweDA0MzUsIDB4MDkwOCwgIDB4MDQzNiwgMHgwOTBhLCAgMHgwNDM3LCAweDA5MGMsICAweDA0MzgsIDB4MDkwZSwKKwkweDA0M2UsIDB4MDkxMCwgIDB4MDQ0MywgMHgwOTEyLCAgMHgwNDQ3LCAweDA5MTQsICAweDA0NGIsIDB4MDkxNiwKKwkweDA0NTYsIDB4MDkxOCwKKwkvKiAweDAzMDkgKi8KKwkweDAwMDAsIDB4MDAwYywgIDB4MDA0MSwgMHgwOTFhLCAgMHgwMDQ1LCAweDA5MWMsICAweDAwNDksIDB4MDkxZSwKKwkweDAwNGYsIDB4MDkyMCwgIDB4MDA1NSwgMHgwOTIyLCAgMHgwMDU5LCAweDA5MjQsICAweDAwNjEsIDB4MDkyNiwKKwkweDAwNjUsIDB4MDkyOCwgIDB4MDA2OSwgMHgwOTJhLCAgMHgwMDZmLCAweDA5MmMsICAweDAwNzUsIDB4MDkyZSwKKwkweDAwNzksIDB4MDkzMCwKKwkvKiAweDAzMGEgKi8KKwkweDAwMDAsIDB4MDAwNiwgIDB4MDA0MSwgMHgwOTMyLCAgMHgwMDU1LCAweDA5MzYsICAweDAwNjEsIDB4MDkzOCwKKwkweDAwNzUsIDB4MDkzYywgIDB4MDA3NywgMHgwOTNlLCAgMHgwMDc5LCAweDA5NDAsCisJLyogMHgwMzBiICovCisJMHgwMDAwLCAweDAwMDYsICAweDAwNGYsIDB4MDk0MiwgIDB4MDA1NSwgMHgwOTQ0LCAgMHgwMDZmLCAweDA5NDYsCisJMHgwMDc1LCAweDA5NDgsICAweDA0MjMsIDB4MDk0YSwgIDB4MDQ0MywgMHgwOTRjLAorCS8qIDB4MDMwYyAqLworCTB4MDAwMCwgMHgwMDIxLCAgMHgwMDQxLCAweDA5NGUsICAweDAwNDMsIDB4MDk1MCwgIDB4MDA0NCwgMHgwOTUyLAorCTB4MDA0NSwgMHgwOTU0LCAgMHgwMDQ3LCAweDA5NTYsICAweDAwNDksIDB4MDk1OCwgIDB4MDA0YiwgMHgwOTVhLAorCTB4MDA0YywgMHgwOTVjLCAgMHgwMDRlLCAweDA5NWUsICAweDAwNGYsIDB4MDk2MCwgIDB4MDA1MiwgMHgwOTYyLAorCTB4MDA1MywgMHgwOTY0LCAgMHgwMDU0LCAweDA5NjgsICAweDAwNTUsIDB4MDk2YSwgIDB4MDA1YSwgMHgwOTZjLAorCTB4MDA2MSwgMHgwOTZlLCAgMHgwMDYzLCAweDA5NzAsICAweDAwNjQsIDB4MDk3MiwgIDB4MDA2NSwgMHgwOTc0LAorCTB4MDA2NywgMHgwOTc2LCAgMHgwMDY5LCAweDA5NzgsICAweDAwNmEsIDB4MDk3YSwgIDB4MDA2YiwgMHgwOTdjLAorCTB4MDA2YywgMHgwOTdlLCAgMHgwMDZlLCAweDA5ODAsICAweDAwNmYsIDB4MDk4MiwgIDB4MDA3MiwgMHgwOTg0LAorCTB4MDA3MywgMHgwOTg2LCAgMHgwMDc0LCAweDA5OGEsICAweDAwNzUsIDB4MDk4YywgIDB4MDA3YSwgMHgwOThlLAorCTB4MDFiNywgMHgwOTkwLCAgMHgwMjkyLCAweDA5OTIsCisJLyogMHgwMzBkICovCisJMHgwMDAwLCAweDAwMTEsICAweDAwYTgsIDB4MDk5NCwgIDB4MDMwOCwgMHgwOTk2LCAgMHgwMzkxLCAweDA5OTgsCisJMHgwMzk1LCAweDA5OWEsICAweDAzOTcsIDB4MDk5YywgIDB4MDM5OSwgMHgwOTllLCAgMHgwMzlmLCAweDA5YTAsCisJMHgwM2E1LCAweDA5YTIsICAweDAzYTksIDB4MDlhNCwgIDB4MDNiMSwgMHgwOWE2LCAgMHgwM2I1LCAweDA5YTgsCisJMHgwM2I3LCAweDA5YWEsICAweDAzYjksIDB4MDlhYywgIDB4MDNiZiwgMHgwOWFlLCAgMHgwM2M1LCAweDA5YjAsCisJMHgwM2M5LCAweDA5YjIsICAweDAzZDIsIDB4MDliNCwKKwkvKiAweDAzMGYgKi8KKwkweDAwMDAsIDB4MDAwZSwgIDB4MDA0MSwgMHgwOWI2LCAgMHgwMDQ1LCAweDA5YjgsICAweDAwNDksIDB4MDliYSwKKwkweDAwNGYsIDB4MDliYywgIDB4MDA1MiwgMHgwOWJlLCAgMHgwMDU1LCAweDA5YzAsICAweDAwNjEsIDB4MDljMiwKKwkweDAwNjUsIDB4MDljNCwgIDB4MDA2OSwgMHgwOWM2LCAgMHgwMDZmLCAweDA5YzgsICAweDAwNzIsIDB4MDljYSwKKwkweDAwNzUsIDB4MDljYywgIDB4MDQ3NCwgMHgwOWNlLCAgMHgwNDc1LCAweDA5ZDAsCisJLyogMHgwMzExICovCisJMHgwMDAwLCAweDAwMGMsICAweDAwNDEsIDB4MDlkMiwgIDB4MDA0NSwgMHgwOWQ0LCAgMHgwMDQ5LCAweDA5ZDYsCisJMHgwMDRmLCAweDA5ZDgsICAweDAwNTIsIDB4MDlkYSwgIDB4MDA1NSwgMHgwOWRjLCAgMHgwMDYxLCAweDA5ZGUsCisJMHgwMDY1LCAweDA5ZTAsICAweDAwNjksIDB4MDllMiwgIDB4MDA2ZiwgMHgwOWU0LCAgMHgwMDcyLCAweDA5ZTYsCisJMHgwMDc1LCAweDA5ZTgsCisJLyogMHgwMzEzICovCisJMHgwMzQzLCAweDAwMGUsICAweDAzOTEsIDB4MDllYSwgIDB4MDM5NSwgMHgwOWYyLCAgMHgwMzk3LCAweDA5ZjgsCisJMHgwMzk5LCAweDBhMDAsICAweDAzOWYsIDB4MGEwOCwgIDB4MDNhOSwgMHgwYTBlLCAgMHgwM2IxLCAweDBhMTYsCisJMHgwM2I1LCAweDBhMWUsICAweDAzYjcsIDB4MGEyNCwgIDB4MDNiOSwgMHgwYTJjLCAgMHgwM2JmLCAweDBhMzQsCisJMHgwM2MxLCAweDBhM2EsICAweDAzYzUsIDB4MGEzYywgIDB4MDNjOSwgMHgwYTQ0LAorCS8qIDB4MDMxNCAqLworCTB4MDAwMCwgMHgwMDEwLCAgMHgwMzkxLCAweDBhNGMsICAweDAzOTUsIDB4MGE1NCwgIDB4MDM5NywgMHgwYTVhLAorCTB4MDM5OSwgMHgwYTYyLCAgMHgwMzlmLCAweDBhNmEsICAweDAzYTEsIDB4MGE3MCwgIDB4MDNhNSwgMHgwYTcyLAorCTB4MDNhOSwgMHgwYTdhLCAgMHgwM2IxLCAweDBhODIsICAweDAzYjUsIDB4MGE4YSwgIDB4MDNiNywgMHgwYTkwLAorCTB4MDNiOSwgMHgwYTk4LCAgMHgwM2JmLCAweDBhYTAsICAweDAzYzEsIDB4MGFhNiwgIDB4MDNjNSwgMHgwYWE4LAorCTB4MDNjOSwgMHgwYWIwLAorCS8qIDB4MDMxYiAqLworCTB4MDAwMCwgMHgwMDA0LCAgMHgwMDRmLCAweDBhYjgsICAweDAwNTUsIDB4MGFjNCwgIDB4MDA2ZiwgMHgwYWQwLAorCTB4MDA3NSwgMHgwYWRjLAorCS8qIDB4MDMyMyAqLworCTB4MDAwMCwgMHgwMDI2LCAgMHgwMDQxLCAweDBhZTgsICAweDAwNDIsIDB4MGFlZSwgIDB4MDA0NCwgMHgwYWYwLAorCTB4MDA0NSwgMHgwYWYyLCAgMHgwMDQ4LCAweDBhZjYsICAweDAwNDksIDB4MGFmOCwgIDB4MDA0YiwgMHgwYWZhLAorCTB4MDA0YywgMHgwYWZjLCAgMHgwMDRkLCAweDBiMDAsICAweDAwNGUsIDB4MGIwMiwgIDB4MDA0ZiwgMHgwYjA0LAorCTB4MDA1MiwgMHgwYjA4LCAgMHgwMDUzLCAweDBiMGMsICAweDAwNTQsIDB4MGIxMCwgIDB4MDA1NSwgMHgwYjEyLAorCTB4MDA1NiwgMHgwYjE0LCAgMHgwMDU3LCAweDBiMTYsICAweDAwNTksIDB4MGIxOCwgIDB4MDA1YSwgMHgwYjFhLAorCTB4MDA2MSwgMHgwYjFjLCAgMHgwMDYyLCAweDBiMjIsICAweDAwNjQsIDB4MGIyNCwgIDB4MDA2NSwgMHgwYjI2LAorCTB4MDA2OCwgMHgwYjJhLCAgMHgwMDY5LCAweDBiMmMsICAweDAwNmIsIDB4MGIyZSwgIDB4MDA2YywgMHgwYjMwLAorCTB4MDA2ZCwgMHgwYjM0LCAgMHgwMDZlLCAweDBiMzYsICAweDAwNmYsIDB4MGIzOCwgIDB4MDA3MiwgMHgwYjNjLAorCTB4MDA3MywgMHgwYjQwLCAgMHgwMDc0LCAweDBiNDQsICAweDAwNzUsIDB4MGI0NiwgIDB4MDA3NiwgMHgwYjQ4LAorCTB4MDA3NywgMHgwYjRhLCAgMHgwMDc5LCAweDBiNGMsICAweDAwN2EsIDB4MGI0ZSwKKwkvKiAweDAzMjQgKi8KKwkweDAwMDAsIDB4MDAwMiwgIDB4MDA1NSwgMHgwYjUwLCAgMHgwMDc1LCAweDBiNTIsCisJLyogMHgwMzI1ICovCisJMHgwMDAwLCAweDAwMDIsICAweDAwNDEsIDB4MGI1NCwgIDB4MDA2MSwgMHgwYjU2LAorCS8qIDB4MDMyNyAqLworCTB4MDAwMCwgMHgwMDE2LCAgMHgwMDQzLCAweDBiNTgsICAweDAwNDQsIDB4MGI1YywgIDB4MDA0NSwgMHgwYjVlLAorCTB4MDA0NywgMHgwYjYyLCAgMHgwMDQ4LCAweDBiNjQsICAweDAwNGIsIDB4MGI2NiwgIDB4MDA0YywgMHgwYjY4LAorCTB4MDA0ZSwgMHgwYjZhLCAgMHgwMDUyLCAweDBiNmMsICAweDAwNTMsIDB4MGI2ZSwgIDB4MDA1NCwgMHgwYjcwLAorCTB4MDA2MywgMHgwYjcyLCAgMHgwMDY0LCAweDBiNzYsICAweDAwNjUsIDB4MGI3OCwgIDB4MDA2NywgMHgwYjdjLAorCTB4MDA2OCwgMHgwYjdlLCAgMHgwMDZiLCAweDBiODAsICAweDAwNmMsIDB4MGI4MiwgIDB4MDA2ZSwgMHgwYjg0LAorCTB4MDA3MiwgMHgwYjg2LCAgMHgwMDczLCAweDBiODgsICAweDAwNzQsIDB4MGI4YSwKKwkvKiAweDAzMjggKi8KKwkweDAwMDAsIDB4MDAwYSwgIDB4MDA0MSwgMHgwYjhjLCAgMHgwMDQ1LCAweDBiOGUsICAweDAwNDksIDB4MGI5MCwKKwkweDAwNGYsIDB4MGI5MiwgIDB4MDA1NSwgMHgwYjk2LCAgMHgwMDYxLCAweDBiOTgsICAweDAwNjUsIDB4MGI5YSwKKwkweDAwNjksIDB4MGI5YywgIDB4MDA2ZiwgMHgwYjllLCAgMHgwMDc1LCAweDBiYTIsCisJLyogMHgwMzJkICovCisJMHgwMDAwLCAweDAwMGMsICAweDAwNDQsIDB4MGJhNCwgIDB4MDA0NSwgMHgwYmE2LCAgMHgwMDRjLCAweDBiYTgsCisJMHgwMDRlLCAweDBiYWEsICAweDAwNTQsIDB4MGJhYywgIDB4MDA1NSwgMHgwYmFlLCAgMHgwMDY0LCAweDBiYjAsCisJMHgwMDY1LCAweDBiYjIsICAweDAwNmMsIDB4MGJiNCwgIDB4MDA2ZSwgMHgwYmI2LCAgMHgwMDc0LCAweDBiYjgsCisJMHgwMDc1LCAweDBiYmEsCisJLyogMHgwMzJlICovCisJMHgwMDAwLCAweDAwMDIsICAweDAwNDgsIDB4MGJiYywgIDB4MDA2OCwgMHgwYmJlLAorCS8qIDB4MDMzMCAqLworCTB4MDAwMCwgMHgwMDA2LCAgMHgwMDQ1LCAweDBiYzAsICAweDAwNDksIDB4MGJjMiwgIDB4MDA1NSwgMHgwYmM0LAorCTB4MDA2NSwgMHgwYmM2LCAgMHgwMDY5LCAweDBiYzgsICAweDAwNzUsIDB4MGJjYSwKKwkvKiAweDAzMzEgKi8KKwkweDAwMDAsIDB4MDAxMSwgIDB4MDA0MiwgMHgwYmNjLCAgMHgwMDQ0LCAweDBiY2UsICAweDAwNGIsIDB4MGJkMCwKKwkweDAwNGMsIDB4MGJkMiwgIDB4MDA0ZSwgMHgwYmQ0LCAgMHgwMDUyLCAweDBiZDYsICAweDAwNTQsIDB4MGJkOCwKKwkweDAwNWEsIDB4MGJkYSwgIDB4MDA2MiwgMHgwYmRjLCAgMHgwMDY0LCAweDBiZGUsICAweDAwNjgsIDB4MGJlMCwKKwkweDAwNmIsIDB4MGJlMiwgIDB4MDA2YywgMHgwYmU0LCAgMHgwMDZlLCAweDBiZTYsICAweDAwNzIsIDB4MGJlOCwKKwkweDAwNzQsIDB4MGJlYSwgIDB4MDA3YSwgMHgwYmVjLAorCS8qIDB4MDM0MiAqLworCTB4MDAwMCwgMHgwMDA4LCAgMHgwMGE4LCAweDBiZWUsICAweDAzYjEsIDB4MGJmMCwgIDB4MDNiNywgMHgwYmYyLAorCTB4MDNiOSwgMHgwYmY0LCAgMHgwM2M1LCAweDBiZjYsICAweDAzYzksIDB4MGJmOCwgIDB4MWZiZiwgMHgwYmZhLAorCTB4MWZmZSwgMHgwYmZjLAorCS8qIDB4MDM0NSAqLworCTB4MDAwMCwgMHgwMDA3LCAgMHgwMzkxLCAweDBiZmUsICAweDAzOTcsIDB4MGMwNCwgIDB4MDNhOSwgMHgwYzBhLAorCTB4MDNiMSwgMHgwYzEwLCAgMHgwM2I3LCAweDBjMWMsICAweDAzYmYsIDB4MGMyOCwgIDB4MDNjOSwgMHgwYzJjLAorCS8qIDB4MDViNyAqLworCTB4MDAwMCwgMHgwMDAyLCAgMHgwNWQwLCAweDBjMzYsICAweDA1ZjIsIDB4MGMzOCwKKwkvKiAweDA1YjggKi8KKwkweDAwMDAsIDB4MDAwMSwgIDB4MDVkMCwgMHgwYzNhLAorCS8qIDB4MDViOSAqLworCTB4MDAwMCwgMHgwMDAxLCAgMHgwNWQ1LCAweDBjM2MsCisJLyogMHgwNWJjICovCisJMHgwMDAwLCAweDAwMTYsICAweDA1ZDAsIDB4MGMzZSwgIDB4MDVkMSwgMHgwYzQwLCAgMHgwNWQyLCAweDBjNDIsCisJMHgwNWQzLCAweDBjNDQsICAweDA1ZDQsIDB4MGM0NiwgIDB4MDVkNSwgMHgwYzQ4LCAgMHgwNWQ2LCAweDBjNGEsCisJMHgwNWQ4LCAweDBjNGMsICAweDA1ZDksIDB4MGM0ZSwgIDB4MDVkYSwgMHgwYzUwLCAgMHgwNWRiLCAweDBjNTIsCisJMHgwNWRjLCAweDBjNTQsICAweDA1ZGUsIDB4MGM1NiwgIDB4MDVlMCwgMHgwYzU4LCAgMHgwNWUxLCAweDBjNWEsCisJMHgwNWUzLCAweDBjNWMsICAweDA1ZTQsIDB4MGM1ZSwgIDB4MDVlNiwgMHgwYzYwLCAgMHgwNWU3LCAweDBjNjIsCisJMHgwNWU4LCAweDBjNjQsICAweDA1ZTksIDB4MGM2NiwgIDB4MDVlYSwgMHgwYzZjLAorCS8qIDB4MDViZiAqLworCTB4MDAwMCwgMHgwMDAzLCAgMHgwNWQxLCAweDBjNmUsICAweDA1ZGIsIDB4MGM3MCwgIDB4MDVlNCwgMHgwYzcyLAorCS8qIDB4MDVjMSAqLworCTB4MDAwMCwgMHgwMDAxLCAgMHgwNWU5LCAweDBjNzQsCisJLyogMHgwNWMyICovCisJMHgwMDAwLCAweDAwMDEsICAweDA1ZTksIDB4MGM3NiwKKwkvKiAweDA5M2MgKi8KKwkweDAwMDAsIDB4MDAwYiwgIDB4MDkxNSwgMHgwYzc4LCAgMHgwOTE2LCAweDBjN2EsICAweDA5MTcsIDB4MGM3YywKKwkweDA5MWMsIDB4MGM3ZSwgIDB4MDkyMSwgMHgwYzgwLCAgMHgwOTIyLCAweDBjODIsICAweDA5MjgsIDB4MGM4NCwKKwkweDA5MmIsIDB4MGM4NiwgIDB4MDkyZiwgMHgwYzg4LCAgMHgwOTMwLCAweDBjOGEsICAweDA5MzMsIDB4MGM4YywKKwkvKiAweDA5YmMgKi8KKwkweDAwMDAsIDB4MDAwNCwgIDB4MDlhMSwgMHgwYzhlLCAgMHgwOWEyLCAweDBjOTAsICAweDA5YWMsIDB4MGM5MiwKKwkweDA5YWYsIDB4MGM5NCwKKwkvKiAweDA5YmUgKi8KKwkweDAwMDAsIDB4MDAwMSwgIDB4MDljNywgMHgwYzk2LAorCS8qIDB4MDlkNyAqLworCTB4MDAwMCwgMHgwMDAxLCAgMHgwOWM3LCAweDBjOTgsCisJLyogMHgwYTNjICovCisJMHgwMDAwLCAweDAwMDUsICAweDBhMTYsIDB4MGM5YSwgIDB4MGExNywgMHgwYzljLCAgMHgwYTFjLCAweDBjOWUsCisJMHgwYTIxLCAweDBjYTAsICAweDBhMmIsIDB4MGNhMiwKKwkvKiAweDBiM2MgKi8KKwkweDAwMDAsIDB4MDAwMywgIDB4MGIyMSwgMHgwY2E0LCAgMHgwYjIyLCAweDBjYTYsICAweDBiMmYsIDB4MGNhOCwKKwkvKiAweDBiM2UgKi8KKwkweDAwMDAsIDB4MDAwMSwgIDB4MGI0NywgMHgwY2FhLAorCS8qIDB4MGI1NiAqLworCTB4MDAwMCwgMHgwMDAxLCAgMHgwYjQ3LCAweDBjYWMsCisJLyogMHgwYjU3ICovCisJMHgwMDAwLCAweDAwMDEsICAweDBiNDcsIDB4MGNhZSwKKwkvKiAweDBiYmUgKi8KKwkweDAwMDAsIDB4MDAwMiwgIDB4MGJjNiwgMHgwY2IwLCAgMHgwYmM3LCAweDBjYjIsCisJLyogMHgwYmQ3ICovCisJMHgwMDAwLCAweDAwMDIsICAweDBiOTIsIDB4MGNiNCwgIDB4MGJjNiwgMHgwY2I2LAorCS8qIDB4MGM1NiAqLworCTB4MDAwMCwgMHgwMDAxLCAgMHgwYzQ2LCAweDBjYjgsCisJLyogMHgwY2MyICovCisJMHgwMDAwLCAweDAwMDEsICAweDBjYzYsIDB4MGNiYSwKKwkvKiAweDBjZDUgKi8KKwkweDAwMDAsIDB4MDAwMiwgIDB4MGNiZiwgMHgwY2JlLCAgMHgwY2M2LCAweDBjYzAsCisJLyogMHgwY2Q2ICovCisJMHgwMDAwLCAweDAwMDEsICAweDBjYzYsIDB4MGNjMiwKKwkvKiAweDBkM2UgKi8KKwkweDAwMDAsIDB4MDAwMiwgIDB4MGQ0NiwgMHgwY2M0LCAgMHgwZDQ3LCAweDBjYzYsCisJLyogMHgwZDU3ICovCisJMHgwMDAwLCAweDAwMDEsICAweDBkNDYsIDB4MGNjOCwKKwkvKiAweDBlMzIgKi8KKwkweDAwMDAsIDB4MDAwMSwgIDB4MGU0ZCwgMHgwY2NhLAorCS8qIDB4MGViMiAqLworCTB4MDAwMCwgMHgwMDAxLCAgMHgwZWNkLCAweDBjY2MsCisJLyogMHgwZjcxICovCisJMHgwMDAwLCAweDAwMDMsICAweDBmNzIsIDB4MGNjZSwgIDB4MGY3NCwgMHgwY2QwLCAgMHgwZjgwLCAweDBjZDIsCisJLyogMHgwZjgwICovCisJMHgwMDAwLCAweDAwMDIsICAweDBmYjIsIDB4MGNkNCwgIDB4MGZiMywgMHgwY2Q4LAorCS8qIDB4MGZiNSAqLworCTB4MDAwMCwgMHgwMDAyLCAgMHgwZjQwLCAweDBjZGMsICAweDBmOTAsIDB4MGNkZSwKKwkvKiAweDBmYjcgKi8KKwkweDAwMDAsIDB4MDAwYSwgIDB4MGY0MiwgMHgwY2UwLCAgMHgwZjRjLCAweDBjZTIsICAweDBmNTEsIDB4MGNlNCwKKwkweDBmNTYsIDB4MGNlNiwgIDB4MGY1YiwgMHgwY2U4LCAgMHgwZjkyLCAweDBjZWEsICAweDBmOWMsIDB4MGNlYywKKwkweDBmYTEsIDB4MGNlZSwgIDB4MGZhNiwgMHgwY2YwLCAgMHgwZmFiLCAweDBjZjIsCisJLyogMHgzMDk5ICovCisJMHgwMDAwLCAweDAwMzAsICAweDMwNDYsIDB4MGNmNCwgIDB4MzA0YiwgMHgwY2Y2LCAgMHgzMDRkLCAweDBjZjgsCisJMHgzMDRmLCAweDBjZmEsICAweDMwNTEsIDB4MGNmYywgIDB4MzA1MywgMHgwY2ZlLCAgMHgzMDU1LCAweDBkMDAsCisJMHgzMDU3LCAweDBkMDIsICAweDMwNTksIDB4MGQwNCwgIDB4MzA1YiwgMHgwZDA2LCAgMHgzMDVkLCAweDBkMDgsCisJMHgzMDVmLCAweDBkMGEsICAweDMwNjEsIDB4MGQwYywgIDB4MzA2NCwgMHgwZDBlLCAgMHgzMDY2LCAweDBkMTAsCisJMHgzMDY4LCAweDBkMTIsICAweDMwNmYsIDB4MGQxNCwgIDB4MzA3MiwgMHgwZDE2LCAgMHgzMDc1LCAweDBkMTgsCisJMHgzMDc4LCAweDBkMWEsICAweDMwN2IsIDB4MGQxYywgIDB4MzA5ZCwgMHgwZDFlLCAgMHgzMGE2LCAweDBkMjAsCisJMHgzMGFiLCAweDBkMjIsICAweDMwYWQsIDB4MGQyNCwgIDB4MzBhZiwgMHgwZDI2LCAgMHgzMGIxLCAweDBkMjgsCisJMHgzMGIzLCAweDBkMmEsICAweDMwYjUsIDB4MGQyYywgIDB4MzBiNywgMHgwZDJlLCAgMHgzMGI5LCAweDBkMzAsCisJMHgzMGJiLCAweDBkMzIsICAweDMwYmQsIDB4MGQzNCwgIDB4MzBiZiwgMHgwZDM2LCAgMHgzMGMxLCAweDBkMzgsCisJMHgzMGM0LCAweDBkM2EsICAweDMwYzYsIDB4MGQzYywgIDB4MzBjOCwgMHgwZDNlLCAgMHgzMGNmLCAweDBkNDAsCisJMHgzMGQyLCAweDBkNDIsICAweDMwZDUsIDB4MGQ0NCwgIDB4MzBkOCwgMHgwZDQ2LCAgMHgzMGRiLCAweDBkNDgsCisJMHgzMGVmLCAweDBkNGEsICAweDMwZjAsIDB4MGQ0YywgIDB4MzBmMSwgMHgwZDRlLCAgMHgzMGYyLCAweDBkNTAsCisJMHgzMGZkLCAweDBkNTIsCisJLyogMHgzMDlhICovCisJMHgwMDAwLCAweDAwMGEsICAweDMwNmYsIDB4MGQ1NCwgIDB4MzA3MiwgMHgwZDU2LCAgMHgzMDc1LCAweDBkNTgsCisJMHgzMDc4LCAweDBkNWEsICAweDMwN2IsIDB4MGQ1YywgIDB4MzBjZiwgMHgwZDVlLCAgMHgzMGQyLCAweDBkNjAsCisJMHgzMGQ1LCAweDBkNjIsICAweDMwZDgsIDB4MGQ2NCwgIDB4MzBkYiwgMHgwZDY2LAorCS8qIDB4MDA0MSAweDAzMDAgKi8KKwkweDAwYzAsIDB4MDAwMCwKKwkvKiAweDAwNDUgMHgwMzAwICovCisJMHgwMGM4LCAweDAwMDAsCisJLyogMHgwMDQ5IDB4MDMwMCAqLworCTB4MDBjYywgMHgwMDAwLAorCS8qIDB4MDA0ZiAweDAzMDAgKi8KKwkweDAwZDIsIDB4MDAwMCwKKwkvKiAweDAwNTUgMHgwMzAwICovCisJMHgwMGQ5LCAweDAwMDAsCisJLyogMHgwMDU3IDB4MDMwMCAqLworCTB4MWU4MCwgMHgwMDAwLAorCS8qIDB4MDA1OSAweDAzMDAgKi8KKwkweDFlZjIsIDB4MDAwMCwKKwkvKiAweDAwNjEgMHgwMzAwICovCisJMHgwMGUwLCAweDAwMDAsCisJLyogMHgwMDY1IDB4MDMwMCAqLworCTB4MDBlOCwgMHgwMDAwLAorCS8qIDB4MDA2OSAweDAzMDAgKi8KKwkweDAwZWMsIDB4MDAwMCwKKwkvKiAweDAwNmYgMHgwMzAwICovCisJMHgwMGYyLCAweDAwMDAsCisJLyogMHgwMDc1IDB4MDMwMCAqLworCTB4MDBmOSwgMHgwMDAwLAorCS8qIDB4MDA3NyAweDAzMDAgKi8KKwkweDFlODEsIDB4MDAwMCwKKwkvKiAweDAwNzkgMHgwMzAwICovCisJMHgxZWYzLCAweDAwMDAsCisJLyogMHgwMGE4IDB4MDMwMCAqLworCTB4MWZlZCwgMHgwMDAwLAorCS8qIDB4MDM5MSAweDAzMDAgKi8KKwkweDFmYmEsIDB4MDAwMCwKKwkvKiAweDAzOTUgMHgwMzAwICovCisJMHgxZmM4LCAweDAwMDAsCisJLyogMHgwMzk3IDB4MDMwMCAqLworCTB4MWZjYSwgMHgwMDAwLAorCS8qIDB4MDM5OSAweDAzMDAgKi8KKwkweDFmZGEsIDB4MDAwMCwKKwkvKiAweDAzOWYgMHgwMzAwICovCisJMHgxZmY4LCAweDAwMDAsCisJLyogMHgwM2E1IDB4MDMwMCAqLworCTB4MWZlYSwgMHgwMDAwLAorCS8qIDB4MDNhOSAweDAzMDAgKi8KKwkweDFmZmEsIDB4MDAwMCwKKwkvKiAweDAzYjEgMHgwMzAwICovCisJMHgxZjcwLCAweDAwMDAsCisJLyogMHgwM2I1IDB4MDMwMCAqLworCTB4MWY3MiwgMHgwMDAwLAorCS8qIDB4MDNiNyAweDAzMDAgKi8KKwkweDFmNzQsIDB4MDAwMCwKKwkvKiAweDAzYjkgMHgwMzAwICovCisJMHgxZjc2LCAweDAwMDAsCisJLyogMHgwM2JmIDB4MDMwMCAqLworCTB4MWY3OCwgMHgwMDAwLAorCS8qIDB4MDNjNSAweDAzMDAgKi8KKwkweDFmN2EsIDB4MDAwMCwKKwkvKiAweDAzYzkgMHgwMzAwICovCisJMHgxZjdjLCAweDAwMDAsCisJLyogMHgxZmJmIDB4MDMwMCAqLworCTB4MWZjZCwgMHgwMDAwLAorCS8qIDB4MWZmZSAweDAzMDAgKi8KKwkweDFmZGQsIDB4MDAwMCwKKwkvKiAweDAwNDEgMHgwMzAxICovCisJMHgwMGMxLCAweDAwMDAsCisJLyogMHgwMDQzIDB4MDMwMSAqLworCTB4MDEwNiwgMHgwMDAwLAorCS8qIDB4MDA0NSAweDAzMDEgKi8KKwkweDAwYzksIDB4MDAwMCwKKwkvKiAweDAwNDcgMHgwMzAxICovCisJMHgwMWY0LCAweDAwMDAsCisJLyogMHgwMDQ5IDB4MDMwMSAqLworCTB4MDBjZCwgMHgwMDAwLAorCS8qIDB4MDA0YiAweDAzMDEgKi8KKwkweDFlMzAsIDB4MDAwMCwKKwkvKiAweDAwNGMgMHgwMzAxICovCisJMHgwMTM5LCAweDAwMDAsCisJLyogMHgwMDRkIDB4MDMwMSAqLworCTB4MWUzZSwgMHgwMDAwLAorCS8qIDB4MDA0ZSAweDAzMDEgKi8KKwkweDAxNDMsIDB4MDAwMCwKKwkvKiAweDAwNGYgMHgwMzAxICovCisJMHgwMGQzLCAweDAwMDAsCisJLyogMHgwMDUwIDB4MDMwMSAqLworCTB4MWU1NCwgMHgwMDAwLAorCS8qIDB4MDA1MiAweDAzMDEgKi8KKwkweDAxNTQsIDB4MDAwMCwKKwkvKiAweDAwNTMgMHgwMzAxICovCisJMHgwMTVhLCAweDAwMDEsICAweDAzMDcsIDB4MGQ2OCwKKwkvKiAweDAwNTUgMHgwMzAxICovCisJMHgwMGRhLCAweDAwMDAsCisJLyogMHgwMDU3IDB4MDMwMSAqLworCTB4MWU4MiwgMHgwMDAwLAorCS8qIDB4MDA1OSAweDAzMDEgKi8KKwkweDAwZGQsIDB4MDAwMCwKKwkvKiAweDAwNWEgMHgwMzAxICovCisJMHgwMTc5LCAweDAwMDAsCisJLyogMHgwMDYxIDB4MDMwMSAqLworCTB4MDBlMSwgMHgwMDAwLAorCS8qIDB4MDA2MyAweDAzMDEgKi8KKwkweDAxMDcsIDB4MDAwMCwKKwkvKiAweDAwNjUgMHgwMzAxICovCisJMHgwMGU5LCAweDAwMDAsCisJLyogMHgwMDY3IDB4MDMwMSAqLworCTB4MDFmNSwgMHgwMDAwLAorCS8qIDB4MDA2OSAweDAzMDEgKi8KKwkweDAwZWQsIDB4MDAwMCwKKwkvKiAweDAwNmIgMHgwMzAxICovCisJMHgxZTMxLCAweDAwMDAsCisJLyogMHgwMDZjIDB4MDMwMSAqLworCTB4MDEzYSwgMHgwMDAwLAorCS8qIDB4MDA2ZCAweDAzMDEgKi8KKwkweDFlM2YsIDB4MDAwMCwKKwkvKiAweDAwNmUgMHgwMzAxICovCisJMHgwMTQ0LCAweDAwMDAsCisJLyogMHgwMDZmIDB4MDMwMSAqLworCTB4MDBmMywgMHgwMDAwLAorCS8qIDB4MDA3MCAweDAzMDEgKi8KKwkweDFlNTUsIDB4MDAwMCwKKwkvKiAweDAwNzIgMHgwMzAxICovCisJMHgwMTU1LCAweDAwMDAsCisJLyogMHgwMDczIDB4MDMwMSAqLworCTB4MDE1YiwgMHgwMDAxLCAgMHgwMzA3LCAweDBkNmEsCisJLyogMHgwMDc1IDB4MDMwMSAqLworCTB4MDBmYSwgMHgwMDAwLAorCS8qIDB4MDA3NyAweDAzMDEgKi8KKwkweDFlODMsIDB4MDAwMCwKKwkvKiAweDAwNzkgMHgwMzAxICovCisJMHgwMGZkLCAweDAwMDAsCisJLyogMHgwMDdhIDB4MDMwMSAqLworCTB4MDE3YSwgMHgwMDAwLAorCS8qIDB4MDBhOCAweDAzMDEgKi8KKwkweDFmZWUsIDB4MDAwMCwKKwkvKiAweDAwYzYgMHgwMzAxICovCisJMHgwMWZjLCAweDAwMDAsCisJLyogMHgwMGQ4IDB4MDMwMSAqLworCTB4MDFmZSwgMHgwMDAwLAorCS8qIDB4MDBlNiAweDAzMDEgKi8KKwkweDAxZmQsIDB4MDAwMCwKKwkvKiAweDAwZjggMHgwMzAxICovCisJMHgwMWZmLCAweDAwMDAsCisJLyogMHgwMzkxIDB4MDMwMSAqLworCTB4MWZiYiwgMHgwMDAwLAorCS8qIDB4MDM5NSAweDAzMDEgKi8KKwkweDFmYzksIDB4MDAwMCwKKwkvKiAweDAzOTcgMHgwMzAxICovCisJMHgxZmNiLCAweDAwMDAsCisJLyogMHgwMzk5IDB4MDMwMSAqLworCTB4MWZkYiwgMHgwMDAwLAorCS8qIDB4MDM5ZiAweDAzMDEgKi8KKwkweDFmZjksIDB4MDAwMCwKKwkvKiAweDAzYTUgMHgwMzAxICovCisJMHgxZmViLCAweDAwMDAsCisJLyogMHgwM2E5IDB4MDMwMSAqLworCTB4MWZmYiwgMHgwMDAwLAorCS8qIDB4MDNiMSAweDAzMDEgKi8KKwkweDFmNzEsIDB4MDAwMCwKKwkvKiAweDAzYjUgMHgwMzAxICovCisJMHgxZjczLCAweDAwMDAsCisJLyogMHgwM2I3IDB4MDMwMSAqLworCTB4MWY3NSwgMHgwMDAwLAorCS8qIDB4MDNiOSAweDAzMDEgKi8KKwkweDFmNzcsIDB4MDAwMCwKKwkvKiAweDAzYmYgMHgwMzAxICovCisJMHgxZjc5LCAweDAwMDAsCisJLyogMHgwM2M1IDB4MDMwMSAqLworCTB4MWY3YiwgMHgwMDAwLAorCS8qIDB4MDNjOSAweDAzMDEgKi8KKwkweDFmN2QsIDB4MDAwMCwKKwkvKiAweDA0MTMgMHgwMzAxICovCisJMHgwNDAzLCAweDAwMDAsCisJLyogMHgwNDFhIDB4MDMwMSAqLworCTB4MDQwYywgMHgwMDAwLAorCS8qIDB4MDQzMyAweDAzMDEgKi8KKwkweDA0NTMsIDB4MDAwMCwKKwkvKiAweDA0M2EgMHgwMzAxICovCisJMHgwNDVjLCAweDAwMDAsCisJLyogMHgxZmJmIDB4MDMwMSAqLworCTB4MWZjZSwgMHgwMDAwLAorCS8qIDB4MWZmZSAweDAzMDEgKi8KKwkweDFmZGUsIDB4MDAwMCwKKwkvKiAweDAwNDEgMHgwMzAyICovCisJMHgwMGMyLCAweDAwMDQsICAweDAzMDAsIDB4MGQ2YywgIDB4MDMwMSwgMHgwZDZlLCAgMHgwMzAzLCAweDBkNzAsCisJMHgwMzA5LCAweDBkNzIsCisJLyogMHgwMDQzIDB4MDMwMiAqLworCTB4MDEwOCwgMHgwMDAwLAorCS8qIDB4MDA0NSAweDAzMDIgKi8KKwkweDAwY2EsIDB4MDAwNCwgIDB4MDMwMCwgMHgwZDc0LCAgMHgwMzAxLCAweDBkNzYsICAweDAzMDMsIDB4MGQ3OCwKKwkweDAzMDksIDB4MGQ3YSwKKwkvKiAweDAwNDcgMHgwMzAyICovCisJMHgwMTFjLCAweDAwMDAsCisJLyogMHgwMDQ4IDB4MDMwMiAqLworCTB4MDEyNCwgMHgwMDAwLAorCS8qIDB4MDA0OSAweDAzMDIgKi8KKwkweDAwY2UsIDB4MDAwMCwKKwkvKiAweDAwNGEgMHgwMzAyICovCisJMHgwMTM0LCAweDAwMDAsCisJLyogMHgwMDRmIDB4MDMwMiAqLworCTB4MDBkNCwgMHgwMDA0LCAgMHgwMzAwLCAweDBkN2MsICAweDAzMDEsIDB4MGQ3ZSwgIDB4MDMwMywgMHgwZDgwLAorCTB4MDMwOSwgMHgwZDgyLAorCS8qIDB4MDA1MyAweDAzMDIgKi8KKwkweDAxNWMsIDB4MDAwMCwKKwkvKiAweDAwNTUgMHgwMzAyICovCisJMHgwMGRiLCAweDAwMDAsCisJLyogMHgwMDU3IDB4MDMwMiAqLworCTB4MDE3NCwgMHgwMDAwLAorCS8qIDB4MDA1OSAweDAzMDIgKi8KKwkweDAxNzYsIDB4MDAwMCwKKwkvKiAweDAwNWEgMHgwMzAyICovCisJMHgxZTkwLCAweDAwMDAsCisJLyogMHgwMDYxIDB4MDMwMiAqLworCTB4MDBlMiwgMHgwMDA0LCAgMHgwMzAwLCAweDBkODQsICAweDAzMDEsIDB4MGQ4NiwgIDB4MDMwMywgMHgwZDg4LAorCTB4MDMwOSwgMHgwZDhhLAorCS8qIDB4MDA2MyAweDAzMDIgKi8KKwkweDAxMDksIDB4MDAwMCwKKwkvKiAweDAwNjUgMHgwMzAyICovCisJMHgwMGVhLCAweDAwMDQsICAweDAzMDAsIDB4MGQ4YywgIDB4MDMwMSwgMHgwZDhlLCAgMHgwMzAzLCAweDBkOTAsCisJMHgwMzA5LCAweDBkOTIsCisJLyogMHgwMDY3IDB4MDMwMiAqLworCTB4MDExZCwgMHgwMDAwLAorCS8qIDB4MDA2OCAweDAzMDIgKi8KKwkweDAxMjUsIDB4MDAwMCwKKwkvKiAweDAwNjkgMHgwMzAyICovCisJMHgwMGVlLCAweDAwMDAsCisJLyogMHgwMDZhIDB4MDMwMiAqLworCTB4MDEzNSwgMHgwMDAwLAorCS8qIDB4MDA2ZiAweDAzMDIgKi8KKwkweDAwZjQsIDB4MDAwNCwgIDB4MDMwMCwgMHgwZDk0LCAgMHgwMzAxLCAweDBkOTYsICAweDAzMDMsIDB4MGQ5OCwKKwkweDAzMDksIDB4MGQ5YSwKKwkvKiAweDAwNzMgMHgwMzAyICovCisJMHgwMTVkLCAweDAwMDAsCisJLyogMHgwMDc1IDB4MDMwMiAqLworCTB4MDBmYiwgMHgwMDAwLAorCS8qIDB4MDA3NyAweDAzMDIgKi8KKwkweDAxNzUsIDB4MDAwMCwKKwkvKiAweDAwNzkgMHgwMzAyICovCisJMHgwMTc3LCAweDAwMDAsCisJLyogMHgwMDdhIDB4MDMwMiAqLworCTB4MWU5MSwgMHgwMDAwLAorCS8qIDB4MDA0MSAweDAzMDMgKi8KKwkweDAwYzMsIDB4MDAwMCwKKwkvKiAweDAwNDUgMHgwMzAzICovCisJMHgxZWJjLCAweDAwMDAsCisJLyogMHgwMDQ5IDB4MDMwMyAqLworCTB4MDEyOCwgMHgwMDAwLAorCS8qIDB4MDA0ZSAweDAzMDMgKi8KKwkweDAwZDEsIDB4MDAwMCwKKwkvKiAweDAwNGYgMHgwMzAzICovCisJMHgwMGQ1LCAweDAwMDIsICAweDAzMDEsIDB4MGQ5YywgIDB4MDMwOCwgMHgwZDllLAorCS8qIDB4MDA1NSAweDAzMDMgKi8KKwkweDAxNjgsIDB4MDAwMSwgIDB4MDMwMSwgMHgwZGEwLAorCS8qIDB4MDA1NiAweDAzMDMgKi8KKwkweDFlN2MsIDB4MDAwMCwKKwkvKiAweDAwNTkgMHgwMzAzICovCisJMHgxZWY4LCAweDAwMDAsCisJLyogMHgwMDYxIDB4MDMwMyAqLworCTB4MDBlMywgMHgwMDAwLAorCS8qIDB4MDA2NSAweDAzMDMgKi8KKwkweDFlYmQsIDB4MDAwMCwKKwkvKiAweDAwNjkgMHgwMzAzICovCisJMHgwMTI5LCAweDAwMDAsCisJLyogMHgwMDZlIDB4MDMwMyAqLworCTB4MDBmMSwgMHgwMDAwLAorCS8qIDB4MDA2ZiAweDAzMDMgKi8KKwkweDAwZjUsIDB4MDAwMiwgIDB4MDMwMSwgMHgwZGEyLCAgMHgwMzA4LCAweDBkYTQsCisJLyogMHgwMDc1IDB4MDMwMyAqLworCTB4MDE2OSwgMHgwMDAxLCAgMHgwMzAxLCAweDBkYTYsCisJLyogMHgwMDc2IDB4MDMwMyAqLworCTB4MWU3ZCwgMHgwMDAwLAorCS8qIDB4MDA3OSAweDAzMDMgKi8KKwkweDFlZjksIDB4MDAwMCwKKwkvKiAweDAwNDEgMHgwMzA0ICovCisJMHgwMTAwLCAweDAwMDAsCisJLyogMHgwMDQ1IDB4MDMwNCAqLworCTB4MDExMiwgMHgwMDAyLCAgMHgwMzAwLCAweDBkYTgsICAweDAzMDEsIDB4MGRhYSwKKwkvKiAweDAwNDcgMHgwMzA0ICovCisJMHgxZTIwLCAweDAwMDAsCisJLyogMHgwMDQ5IDB4MDMwNCAqLworCTB4MDEyYSwgMHgwMDAwLAorCS8qIDB4MDA0ZiAweDAzMDQgKi8KKwkweDAxNGMsIDB4MDAwMiwgIDB4MDMwMCwgMHgwZGFjLCAgMHgwMzAxLCAweDBkYWUsCisJLyogMHgwMDU1IDB4MDMwNCAqLworCTB4MDE2YSwgMHgwMDAxLCAgMHgwMzA4LCAweDBkYjAsCisJLyogMHgwMDYxIDB4MDMwNCAqLworCTB4MDEwMSwgMHgwMDAwLAorCS8qIDB4MDA2NSAweDAzMDQgKi8KKwkweDAxMTMsIDB4MDAwMiwgIDB4MDMwMCwgMHgwZGIyLCAgMHgwMzAxLCAweDBkYjQsCisJLyogMHgwMDY3IDB4MDMwNCAqLworCTB4MWUyMSwgMHgwMDAwLAorCS8qIDB4MDA2OSAweDAzMDQgKi8KKwkweDAxMmIsIDB4MDAwMCwKKwkvKiAweDAwNmYgMHgwMzA0ICovCisJMHgwMTRkLCAweDAwMDIsICAweDAzMDAsIDB4MGRiNiwgIDB4MDMwMSwgMHgwZGI4LAorCS8qIDB4MDA3NSAweDAzMDQgKi8KKwkweDAxNmIsIDB4MDAwMSwgIDB4MDMwOCwgMHgwZGJhLAorCS8qIDB4MDBjNiAweDAzMDQgKi8KKwkweDAxZTIsIDB4MDAwMCwKKwkvKiAweDAwZTYgMHgwMzA0ICovCisJMHgwMWUzLCAweDAwMDAsCisJLyogMHgwMzkxIDB4MDMwNCAqLworCTB4MWZiOSwgMHgwMDAwLAorCS8qIDB4MDM5OSAweDAzMDQgKi8KKwkweDFmZDksIDB4MDAwMCwKKwkvKiAweDAzYTUgMHgwMzA0ICovCisJMHgxZmU5LCAweDAwMDAsCisJLyogMHgwM2IxIDB4MDMwNCAqLworCTB4MWZiMSwgMHgwMDAwLAorCS8qIDB4MDNiOSAweDAzMDQgKi8KKwkweDFmZDEsIDB4MDAwMCwKKwkvKiAweDAzYzUgMHgwMzA0ICovCisJMHgxZmUxLCAweDAwMDAsCisJLyogMHgwNDE4IDB4MDMwNCAqLworCTB4MDRlMiwgMHgwMDAwLAorCS8qIDB4MDQyMyAweDAzMDQgKi8KKwkweDA0ZWUsIDB4MDAwMCwKKwkvKiAweDA0MzggMHgwMzA0ICovCisJMHgwNGUzLCAweDAwMDAsCisJLyogMHgwNDQzIDB4MDMwNCAqLworCTB4MDRlZiwgMHgwMDAwLAorCS8qIDB4MDA0MSAweDAzMDYgKi8KKwkweDAxMDIsIDB4MDAwNCwgIDB4MDMwMCwgMHgwZGJjLCAgMHgwMzAxLCAweDBkYmUsICAweDAzMDMsIDB4MGRjMCwKKwkweDAzMDksIDB4MGRjMiwKKwkvKiAweDAwNDUgMHgwMzA2ICovCisJMHgwMTE0LCAweDAwMDAsCisJLyogMHgwMDQ3IDB4MDMwNiAqLworCTB4MDExZSwgMHgwMDAwLAorCS8qIDB4MDA0OSAweDAzMDYgKi8KKwkweDAxMmMsIDB4MDAwMCwKKwkvKiAweDAwNGYgMHgwMzA2ICovCisJMHgwMTRlLCAweDAwMDAsCisJLyogMHgwMDU1IDB4MDMwNiAqLworCTB4MDE2YywgMHgwMDAwLAorCS8qIDB4MDA2MSAweDAzMDYgKi8KKwkweDAxMDMsIDB4MDAwNCwgIDB4MDMwMCwgMHgwZGM0LCAgMHgwMzAxLCAweDBkYzYsICAweDAzMDMsIDB4MGRjOCwKKwkweDAzMDksIDB4MGRjYSwKKwkvKiAweDAwNjUgMHgwMzA2ICovCisJMHgwMTE1LCAweDAwMDAsCisJLyogMHgwMDY3IDB4MDMwNiAqLworCTB4MDExZiwgMHgwMDAwLAorCS8qIDB4MDA2OSAweDAzMDYgKi8KKwkweDAxMmQsIDB4MDAwMCwKKwkvKiAweDAwNmYgMHgwMzA2ICovCisJMHgwMTRmLCAweDAwMDAsCisJLyogMHgwMDc1IDB4MDMwNiAqLworCTB4MDE2ZCwgMHgwMDAwLAorCS8qIDB4MDM5MSAweDAzMDYgKi8KKwkweDFmYjgsIDB4MDAwMCwKKwkvKiAweDAzOTkgMHgwMzA2ICovCisJMHgxZmQ4LCAweDAwMDAsCisJLyogMHgwM2E1IDB4MDMwNiAqLworCTB4MWZlOCwgMHgwMDAwLAorCS8qIDB4MDNiMSAweDAzMDYgKi8KKwkweDFmYjAsIDB4MDAwMCwKKwkvKiAweDAzYjkgMHgwMzA2ICovCisJMHgxZmQwLCAweDAwMDAsCisJLyogMHgwM2M1IDB4MDMwNiAqLworCTB4MWZlMCwgMHgwMDAwLAorCS8qIDB4MDQxMCAweDAzMDYgKi8KKwkweDA0ZDAsIDB4MDAwMCwKKwkvKiAweDA0MTUgMHgwMzA2ICovCisJMHgwNGQ2LCAweDAwMDAsCisJLyogMHgwNDE2IDB4MDMwNiAqLworCTB4MDRjMSwgMHgwMDAwLAorCS8qIDB4MDQxOCAweDAzMDYgKi8KKwkweDA0MTksIDB4MDAwMCwKKwkvKiAweDA0MjMgMHgwMzA2ICovCisJMHgwNDBlLCAweDAwMDAsCisJLyogMHgwNDMwIDB4MDMwNiAqLworCTB4MDRkMSwgMHgwMDAwLAorCS8qIDB4MDQzNSAweDAzMDYgKi8KKwkweDA0ZDcsIDB4MDAwMCwKKwkvKiAweDA0MzYgMHgwMzA2ICovCisJMHgwNGMyLCAweDAwMDAsCisJLyogMHgwNDM4IDB4MDMwNiAqLworCTB4MDQzOSwgMHgwMDAwLAorCS8qIDB4MDQ0MyAweDAzMDYgKi8KKwkweDA0NWUsIDB4MDAwMCwKKwkvKiAweDAwNDEgMHgwMzA3ICovCisJMHgwMDAwLCAweDAwMDEsICAweDAzMDQsIDB4MGRjYywKKwkvKiAweDAwNDIgMHgwMzA3ICovCisJMHgxZTAyLCAweDAwMDAsCisJLyogMHgwMDQzIDB4MDMwNyAqLworCTB4MDEwYSwgMHgwMDAwLAorCS8qIDB4MDA0NCAweDAzMDcgKi8KKwkweDFlMGEsIDB4MDAwMCwKKwkvKiAweDAwNDUgMHgwMzA3ICovCisJMHgwMTE2LCAweDAwMDAsCisJLyogMHgwMDQ2IDB4MDMwNyAqLworCTB4MWUxZSwgMHgwMDAwLAorCS8qIDB4MDA0NyAweDAzMDcgKi8KKwkweDAxMjAsIDB4MDAwMCwKKwkvKiAweDAwNDggMHgwMzA3ICovCisJMHgxZTIyLCAweDAwMDAsCisJLyogMHgwMDQ5IDB4MDMwNyAqLworCTB4MDEzMCwgMHgwMDAwLAorCS8qIDB4MDA0ZCAweDAzMDcgKi8KKwkweDFlNDAsIDB4MDAwMCwKKwkvKiAweDAwNGUgMHgwMzA3ICovCisJMHgxZTQ0LCAweDAwMDAsCisJLyogMHgwMDUwIDB4MDMwNyAqLworCTB4MWU1NiwgMHgwMDAwLAorCS8qIDB4MDA1MiAweDAzMDcgKi8KKwkweDFlNTgsIDB4MDAwMCwKKwkvKiAweDAwNTMgMHgwMzA3ICovCisJMHgxZTYwLCAweDAwMDAsCisJLyogMHgwMDU0IDB4MDMwNyAqLworCTB4MWU2YSwgMHgwMDAwLAorCS8qIDB4MDA1NyAweDAzMDcgKi8KKwkweDFlODYsIDB4MDAwMCwKKwkvKiAweDAwNTggMHgwMzA3ICovCisJMHgxZThhLCAweDAwMDAsCisJLyogMHgwMDU5IDB4MDMwNyAqLworCTB4MWU4ZSwgMHgwMDAwLAorCS8qIDB4MDA1YSAweDAzMDcgKi8KKwkweDAxN2IsIDB4MDAwMCwKKwkvKiAweDAwNjEgMHgwMzA3ICovCisJMHgwMDAwLCAweDAwMDEsICAweDAzMDQsIDB4MGRjZSwKKwkvKiAweDAwNjIgMHgwMzA3ICovCisJMHgxZTAzLCAweDAwMDAsCisJLyogMHgwMDYzIDB4MDMwNyAqLworCTB4MDEwYiwgMHgwMDAwLAorCS8qIDB4MDA2NCAweDAzMDcgKi8KKwkweDFlMGIsIDB4MDAwMCwKKwkvKiAweDAwNjUgMHgwMzA3ICovCisJMHgwMTE3LCAweDAwMDAsCisJLyogMHgwMDY2IDB4MDMwNyAqLworCTB4MWUxZiwgMHgwMDAwLAorCS8qIDB4MDA2NyAweDAzMDcgKi8KKwkweDAxMjEsIDB4MDAwMCwKKwkvKiAweDAwNjggMHgwMzA3ICovCisJMHgxZTIzLCAweDAwMDAsCisJLyogMHgwMDZkIDB4MDMwNyAqLworCTB4MWU0MSwgMHgwMDAwLAorCS8qIDB4MDA2ZSAweDAzMDcgKi8KKwkweDFlNDUsIDB4MDAwMCwKKwkvKiAweDAwNzAgMHgwMzA3ICovCisJMHgxZTU3LCAweDAwMDAsCisJLyogMHgwMDcyIDB4MDMwNyAqLworCTB4MWU1OSwgMHgwMDAwLAorCS8qIDB4MDA3MyAweDAzMDcgKi8KKwkweDFlNjEsIDB4MDAwMCwKKwkvKiAweDAwNzQgMHgwMzA3ICovCisJMHgxZTZiLCAweDAwMDAsCisJLyogMHgwMDc3IDB4MDMwNyAqLworCTB4MWU4NywgMHgwMDAwLAorCS8qIDB4MDA3OCAweDAzMDcgKi8KKwkweDFlOGIsIDB4MDAwMCwKKwkvKiAweDAwNzkgMHgwMzA3ICovCisJMHgxZThmLCAweDAwMDAsCisJLyogMHgwMDdhIDB4MDMwNyAqLworCTB4MDE3YywgMHgwMDAwLAorCS8qIDB4MDE3ZiAweDAzMDcgKi8KKwkweDFlOWIsIDB4MDAwMCwKKwkvKiAweDAzMDYgMHgwMzA3ICovCisJMHgwMzEwLCAweDAwMDAsCisJLyogMHgwMDQxIDB4MDMwOCAqLworCTB4MDBjNCwgMHgwMDAxLCAgMHgwMzA0LCAweDBkZDAsCisJLyogMHgwMDQ1IDB4MDMwOCAqLworCTB4MDBjYiwgMHgwMDAwLAorCS8qIDB4MDA0OCAweDAzMDggKi8KKwkweDFlMjYsIDB4MDAwMCwKKwkvKiAweDAwNDkgMHgwMzA4ICovCisJMHgwMGNmLCAweDAwMDEsICAweDAzMDEsIDB4MGRkMiwKKwkvKiAweDAwNGYgMHgwMzA4ICovCisJMHgwMGQ2LCAweDAwMDAsCisJLyogMHgwMDU1IDB4MDMwOCAqLworCTB4MDBkYywgMHgwMDA0LCAgMHgwMzAwLCAweDBkZDQsICAweDAzMDEsIDB4MGRkNiwgIDB4MDMwNCwgMHgwZGQ4LAorCTB4MDMwYywgMHgwZGRhLAorCS8qIDB4MDA1NyAweDAzMDggKi8KKwkweDFlODQsIDB4MDAwMCwKKwkvKiAweDAwNTggMHgwMzA4ICovCisJMHgxZThjLCAweDAwMDAsCisJLyogMHgwMDU5IDB4MDMwOCAqLworCTB4MDE3OCwgMHgwMDAwLAorCS8qIDB4MDA2MSAweDAzMDggKi8KKwkweDAwZTQsIDB4MDAwMSwgIDB4MDMwNCwgMHgwZGRjLAorCS8qIDB4MDA2NSAweDAzMDggKi8KKwkweDAwZWIsIDB4MDAwMCwKKwkvKiAweDAwNjggMHgwMzA4ICovCisJMHgxZTI3LCAweDAwMDAsCisJLyogMHgwMDY5IDB4MDMwOCAqLworCTB4MDBlZiwgMHgwMDAxLCAgMHgwMzAxLCAweDBkZGUsCisJLyogMHgwMDZmIDB4MDMwOCAqLworCTB4MDBmNiwgMHgwMDAwLAorCS8qIDB4MDA3NCAweDAzMDggKi8KKwkweDFlOTcsIDB4MDAwMCwKKwkvKiAweDAwNzUgMHgwMzA4ICovCisJMHgwMGZjLCAweDAwMDQsICAweDAzMDAsIDB4MGRlMCwgIDB4MDMwMSwgMHgwZGUyLCAgMHgwMzA0LCAweDBkZTQsCisJMHgwMzBjLCAweDBkZTYsCisJLyogMHgwMDc3IDB4MDMwOCAqLworCTB4MWU4NSwgMHgwMDAwLAorCS8qIDB4MDA3OCAweDAzMDggKi8KKwkweDFlOGQsIDB4MDAwMCwKKwkvKiAweDAwNzkgMHgwMzA4ICovCisJMHgwMGZmLCAweDAwMDAsCisJLyogMHgwMThmIDB4MDMwOCAqLworCTB4MDRkYSwgMHgwMDAwLAorCS8qIDB4MDE5ZiAweDAzMDggKi8KKwkweDA0ZWEsIDB4MDAwMCwKKwkvKiAweDAyNTkgMHgwMzA4ICovCisJMHgwNGRiLCAweDAwMDAsCisJLyogMHgwMjc1IDB4MDMwOCAqLworCTB4MDRlYiwgMHgwMDAwLAorCS8qIDB4MDM5OSAweDAzMDggKi8KKwkweDAzYWEsIDB4MDAwMCwKKwkvKiAweDAzYTUgMHgwMzA4ICovCisJMHgwM2FiLCAweDAwMDAsCisJLyogMHgwM2I5IDB4MDMwOCAqLworCTB4MDNjYSwgMHgwMDA0LCAgMHgwMzAwLCAweDBkZTgsICAweDAzMDEsIDB4MGRlYSwgIDB4MDMwZCwgMHgwZGVjLAorCTB4MDM0MiwgMHgwZGVlLAorCS8qIDB4MDNjNSAweDAzMDggKi8KKwkweDAzY2IsIDB4MDAwNCwgIDB4MDMwMCwgMHgwZGYwLCAgMHgwMzAxLCAweDBkZjIsICAweDAzMGQsIDB4MGRmNCwKKwkweDAzNDIsIDB4MGRmNiwKKwkvKiAweDAzZDIgMHgwMzA4ICovCisJMHgwM2Q0LCAweDAwMDAsCisJLyogMHgwNDA2IDB4MDMwOCAqLworCTB4MDQwNywgMHgwMDAwLAorCS8qIDB4MDQxMCAweDAzMDggKi8KKwkweDA0ZDIsIDB4MDAwMCwKKwkvKiAweDA0MTUgMHgwMzA4ICovCisJMHgwNDAxLCAweDAwMDAsCisJLyogMHgwNDE2IDB4MDMwOCAqLworCTB4MDRkYywgMHgwMDAwLAorCS8qIDB4MDQxNyAweDAzMDggKi8KKwkweDA0ZGUsIDB4MDAwMCwKKwkvKiAweDA0MTggMHgwMzA4ICovCisJMHgwNGU0LCAweDAwMDAsCisJLyogMHgwNDFlIDB4MDMwOCAqLworCTB4MDRlNiwgMHgwMDAwLAorCS8qIDB4MDQyMyAweDAzMDggKi8KKwkweDA0ZjAsIDB4MDAwMCwKKwkvKiAweDA0MjcgMHgwMzA4ICovCisJMHgwNGY0LCAweDAwMDAsCisJLyogMHgwNDJiIDB4MDMwOCAqLworCTB4MDRmOCwgMHgwMDAwLAorCS8qIDB4MDQzMCAweDAzMDggKi8KKwkweDA0ZDMsIDB4MDAwMCwKKwkvKiAweDA0MzUgMHgwMzA4ICovCisJMHgwNDUxLCAweDAwMDAsCisJLyogMHgwNDM2IDB4MDMwOCAqLworCTB4MDRkZCwgMHgwMDAwLAorCS8qIDB4MDQzNyAweDAzMDggKi8KKwkweDA0ZGYsIDB4MDAwMCwKKwkvKiAweDA0MzggMHgwMzA4ICovCisJMHgwNGU1LCAweDAwMDAsCisJLyogMHgwNDNlIDB4MDMwOCAqLworCTB4MDRlNywgMHgwMDAwLAorCS8qIDB4MDQ0MyAweDAzMDggKi8KKwkweDA0ZjEsIDB4MDAwMCwKKwkvKiAweDA0NDcgMHgwMzA4ICovCisJMHgwNGY1LCAweDAwMDAsCisJLyogMHgwNDRiIDB4MDMwOCAqLworCTB4MDRmOSwgMHgwMDAwLAorCS8qIDB4MDQ1NiAweDAzMDggKi8KKwkweDA0NTcsIDB4MDAwMCwKKwkvKiAweDAwNDEgMHgwMzA5ICovCisJMHgxZWEyLCAweDAwMDAsCisJLyogMHgwMDQ1IDB4MDMwOSAqLworCTB4MWViYSwgMHgwMDAwLAorCS8qIDB4MDA0OSAweDAzMDkgKi8KKwkweDFlYzgsIDB4MDAwMCwKKwkvKiAweDAwNGYgMHgwMzA5ICovCisJMHgxZWNlLCAweDAwMDAsCisJLyogMHgwMDU1IDB4MDMwOSAqLworCTB4MWVlNiwgMHgwMDAwLAorCS8qIDB4MDA1OSAweDAzMDkgKi8KKwkweDFlZjYsIDB4MDAwMCwKKwkvKiAweDAwNjEgMHgwMzA5ICovCisJMHgxZWEzLCAweDAwMDAsCisJLyogMHgwMDY1IDB4MDMwOSAqLworCTB4MWViYiwgMHgwMDAwLAorCS8qIDB4MDA2OSAweDAzMDkgKi8KKwkweDFlYzksIDB4MDAwMCwKKwkvKiAweDAwNmYgMHgwMzA5ICovCisJMHgxZWNmLCAweDAwMDAsCisJLyogMHgwMDc1IDB4MDMwOSAqLworCTB4MWVlNywgMHgwMDAwLAorCS8qIDB4MDA3OSAweDAzMDkgKi8KKwkweDFlZjcsIDB4MDAwMCwKKwkvKiAweDAwNDEgMHgwMzBhICovCisJMHgwMGM1LCAweDAwMDEsICAweDAzMDEsIDB4MGRmOCwKKwkvKiAweDAwNTUgMHgwMzBhICovCisJMHgwMTZlLCAweDAwMDAsCisJLyogMHgwMDYxIDB4MDMwYSAqLworCTB4MDBlNSwgMHgwMDAxLCAgMHgwMzAxLCAweDBkZmEsCisJLyogMHgwMDc1IDB4MDMwYSAqLworCTB4MDE2ZiwgMHgwMDAwLAorCS8qIDB4MDA3NyAweDAzMGEgKi8KKwkweDFlOTgsIDB4MDAwMCwKKwkvKiAweDAwNzkgMHgwMzBhICovCisJMHgxZTk5LCAweDAwMDAsCisJLyogMHgwMDRmIDB4MDMwYiAqLworCTB4MDE1MCwgMHgwMDAwLAorCS8qIDB4MDA1NSAweDAzMGIgKi8KKwkweDAxNzAsIDB4MDAwMCwKKwkvKiAweDAwNmYgMHgwMzBiICovCisJMHgwMTUxLCAweDAwMDAsCisJLyogMHgwMDc1IDB4MDMwYiAqLworCTB4MDE3MSwgMHgwMDAwLAorCS8qIDB4MDQyMyAweDAzMGIgKi8KKwkweDA0ZjIsIDB4MDAwMCwKKwkvKiAweDA0NDMgMHgwMzBiICovCisJMHgwNGYzLCAweDAwMDAsCisJLyogMHgwMDQxIDB4MDMwYyAqLworCTB4MDFjZCwgMHgwMDAwLAorCS8qIDB4MDA0MyAweDAzMGMgKi8KKwkweDAxMGMsIDB4MDAwMCwKKwkvKiAweDAwNDQgMHgwMzBjICovCisJMHgwMTBlLCAweDAwMDAsCisJLyogMHgwMDQ1IDB4MDMwYyAqLworCTB4MDExYSwgMHgwMDAwLAorCS8qIDB4MDA0NyAweDAzMGMgKi8KKwkweDAxZTYsIDB4MDAwMCwKKwkvKiAweDAwNDkgMHgwMzBjICovCisJMHgwMWNmLCAweDAwMDAsCisJLyogMHgwMDRiIDB4MDMwYyAqLworCTB4MDFlOCwgMHgwMDAwLAorCS8qIDB4MDA0YyAweDAzMGMgKi8KKwkweDAxM2QsIDB4MDAwMCwKKwkvKiAweDAwNGUgMHgwMzBjICovCisJMHgwMTQ3LCAweDAwMDAsCisJLyogMHgwMDRmIDB4MDMwYyAqLworCTB4MDFkMSwgMHgwMDAwLAorCS8qIDB4MDA1MiAweDAzMGMgKi8KKwkweDAxNTgsIDB4MDAwMCwKKwkvKiAweDAwNTMgMHgwMzBjICovCisJMHgwMTYwLCAweDAwMDEsICAweDAzMDcsIDB4MGRmYywKKwkvKiAweDAwNTQgMHgwMzBjICovCisJMHgwMTY0LCAweDAwMDAsCisJLyogMHgwMDU1IDB4MDMwYyAqLworCTB4MDFkMywgMHgwMDAwLAorCS8qIDB4MDA1YSAweDAzMGMgKi8KKwkweDAxN2QsIDB4MDAwMCwKKwkvKiAweDAwNjEgMHgwMzBjICovCisJMHgwMWNlLCAweDAwMDAsCisJLyogMHgwMDYzIDB4MDMwYyAqLworCTB4MDEwZCwgMHgwMDAwLAorCS8qIDB4MDA2NCAweDAzMGMgKi8KKwkweDAxMGYsIDB4MDAwMCwKKwkvKiAweDAwNjUgMHgwMzBjICovCisJMHgwMTFiLCAweDAwMDAsCisJLyogMHgwMDY3IDB4MDMwYyAqLworCTB4MDFlNywgMHgwMDAwLAorCS8qIDB4MDA2OSAweDAzMGMgKi8KKwkweDAxZDAsIDB4MDAwMCwKKwkvKiAweDAwNmEgMHgwMzBjICovCisJMHgwMWYwLCAweDAwMDAsCisJLyogMHgwMDZiIDB4MDMwYyAqLworCTB4MDFlOSwgMHgwMDAwLAorCS8qIDB4MDA2YyAweDAzMGMgKi8KKwkweDAxM2UsIDB4MDAwMCwKKwkvKiAweDAwNmUgMHgwMzBjICovCisJMHgwMTQ4LCAweDAwMDAsCisJLyogMHgwMDZmIDB4MDMwYyAqLworCTB4MDFkMiwgMHgwMDAwLAorCS8qIDB4MDA3MiAweDAzMGMgKi8KKwkweDAxNTksIDB4MDAwMCwKKwkvKiAweDAwNzMgMHgwMzBjICovCisJMHgwMTYxLCAweDAwMDEsICAweDAzMDcsIDB4MGRmZSwKKwkvKiAweDAwNzQgMHgwMzBjICovCisJMHgwMTY1LCAweDAwMDAsCisJLyogMHgwMDc1IDB4MDMwYyAqLworCTB4MDFkNCwgMHgwMDAwLAorCS8qIDB4MDA3YSAweDAzMGMgKi8KKwkweDAxN2UsIDB4MDAwMCwKKwkvKiAweDAxYjcgMHgwMzBjICovCisJMHgwMWVlLCAweDAwMDAsCisJLyogMHgwMjkyIDB4MDMwYyAqLworCTB4MDFlZiwgMHgwMDAwLAorCS8qIDB4MDBhOCAweDAzMGQgKi8KKwkweDAzODUsIDB4MDAwMCwKKwkvKiAweDAzMDggMHgwMzBkICovCisJMHgwMzQ0LCAweDAwMDAsCisJLyogMHgwMzkxIDB4MDMwZCAqLworCTB4MDM4NiwgMHgwMDAwLAorCS8qIDB4MDM5NSAweDAzMGQgKi8KKwkweDAzODgsIDB4MDAwMCwKKwkvKiAweDAzOTcgMHgwMzBkICovCisJMHgwMzg5LCAweDAwMDAsCisJLyogMHgwMzk5IDB4MDMwZCAqLworCTB4MDM4YSwgMHgwMDAwLAorCS8qIDB4MDM5ZiAweDAzMGQgKi8KKwkweDAzOGMsIDB4MDAwMCwKKwkvKiAweDAzYTUgMHgwMzBkICovCisJMHgwMzhlLCAweDAwMDAsCisJLyogMHgwM2E5IDB4MDMwZCAqLworCTB4MDM4ZiwgMHgwMDAwLAorCS8qIDB4MDNiMSAweDAzMGQgKi8KKwkweDAzYWMsIDB4MDAwMCwKKwkvKiAweDAzYjUgMHgwMzBkICovCisJMHgwM2FkLCAweDAwMDAsCisJLyogMHgwM2I3IDB4MDMwZCAqLworCTB4MDNhZSwgMHgwMDAwLAorCS8qIDB4MDNiOSAweDAzMGQgKi8KKwkweDAzYWYsIDB4MDAwMCwKKwkvKiAweDAzYmYgMHgwMzBkICovCisJMHgwM2NjLCAweDAwMDAsCisJLyogMHgwM2M1IDB4MDMwZCAqLworCTB4MDNjZCwgMHgwMDAwLAorCS8qIDB4MDNjOSAweDAzMGQgKi8KKwkweDAzY2UsIDB4MDAwMCwKKwkvKiAweDAzZDIgMHgwMzBkICovCisJMHgwM2QzLCAweDAwMDAsCisJLyogMHgwMDQxIDB4MDMwZiAqLworCTB4MDIwMCwgMHgwMDAwLAorCS8qIDB4MDA0NSAweDAzMGYgKi8KKwkweDAyMDQsIDB4MDAwMCwKKwkvKiAweDAwNDkgMHgwMzBmICovCisJMHgwMjA4LCAweDAwMDAsCisJLyogMHgwMDRmIDB4MDMwZiAqLworCTB4MDIwYywgMHgwMDAwLAorCS8qIDB4MDA1MiAweDAzMGYgKi8KKwkweDAyMTAsIDB4MDAwMCwKKwkvKiAweDAwNTUgMHgwMzBmICovCisJMHgwMjE0LCAweDAwMDAsCisJLyogMHgwMDYxIDB4MDMwZiAqLworCTB4MDIwMSwgMHgwMDAwLAorCS8qIDB4MDA2NSAweDAzMGYgKi8KKwkweDAyMDUsIDB4MDAwMCwKKwkvKiAweDAwNjkgMHgwMzBmICovCisJMHgwMjA5LCAweDAwMDAsCisJLyogMHgwMDZmIDB4MDMwZiAqLworCTB4MDIwZCwgMHgwMDAwLAorCS8qIDB4MDA3MiAweDAzMGYgKi8KKwkweDAyMTEsIDB4MDAwMCwKKwkvKiAweDAwNzUgMHgwMzBmICovCisJMHgwMjE1LCAweDAwMDAsCisJLyogMHgwNDc0IDB4MDMwZiAqLworCTB4MDQ3NiwgMHgwMDAwLAorCS8qIDB4MDQ3NSAweDAzMGYgKi8KKwkweDA0NzcsIDB4MDAwMCwKKwkvKiAweDAwNDEgMHgwMzExICovCisJMHgwMjAyLCAweDAwMDAsCisJLyogMHgwMDQ1IDB4MDMxMSAqLworCTB4MDIwNiwgMHgwMDAwLAorCS8qIDB4MDA0OSAweDAzMTEgKi8KKwkweDAyMGEsIDB4MDAwMCwKKwkvKiAweDAwNGYgMHgwMzExICovCisJMHgwMjBlLCAweDAwMDAsCisJLyogMHgwMDUyIDB4MDMxMSAqLworCTB4MDIxMiwgMHgwMDAwLAorCS8qIDB4MDA1NSAweDAzMTEgKi8KKwkweDAyMTYsIDB4MDAwMCwKKwkvKiAweDAwNjEgMHgwMzExICovCisJMHgwMjAzLCAweDAwMDAsCisJLyogMHgwMDY1IDB4MDMxMSAqLworCTB4MDIwNywgMHgwMDAwLAorCS8qIDB4MDA2OSAweDAzMTEgKi8KKwkweDAyMGIsIDB4MDAwMCwKKwkvKiAweDAwNmYgMHgwMzExICovCisJMHgwMjBmLCAweDAwMDAsCisJLyogMHgwMDcyIDB4MDMxMSAqLworCTB4MDIxMywgMHgwMDAwLAorCS8qIDB4MDA3NSAweDAzMTEgKi8KKwkweDAyMTcsIDB4MDAwMCwKKwkvKiAweDAzOTEgMHgwMzEzICovCisJMHgxZjA4LCAweDAwMDMsICAweDAzMDAsIDB4MGUwMCwgIDB4MDMwMSwgMHgwZTAyLCAgMHgwMzQyLCAweDBlMDQsCisJLyogMHgwMzk1IDB4MDMxMyAqLworCTB4MWYxOCwgMHgwMDAyLCAgMHgwMzAwLCAweDBlMDYsICAweDAzMDEsIDB4MGUwOCwKKwkvKiAweDAzOTcgMHgwMzEzICovCisJMHgxZjI4LCAweDAwMDMsICAweDAzMDAsIDB4MGUwYSwgIDB4MDMwMSwgMHgwZTBjLCAgMHgwMzQyLCAweDBlMGUsCisJLyogMHgwMzk5IDB4MDMxMyAqLworCTB4MWYzOCwgMHgwMDAzLCAgMHgwMzAwLCAweDBlMTAsICAweDAzMDEsIDB4MGUxMiwgIDB4MDM0MiwgMHgwZTE0LAorCS8qIDB4MDM5ZiAweDAzMTMgKi8KKwkweDFmNDgsIDB4MDAwMiwgIDB4MDMwMCwgMHgwZTE2LCAgMHgwMzAxLCAweDBlMTgsCisJLyogMHgwM2E5IDB4MDMxMyAqLworCTB4MWY2OCwgMHgwMDAzLCAgMHgwMzAwLCAweDBlMWEsICAweDAzMDEsIDB4MGUxYywgIDB4MDM0MiwgMHgwZTFlLAorCS8qIDB4MDNiMSAweDAzMTMgKi8KKwkweDFmMDAsIDB4MDAwMywgIDB4MDMwMCwgMHgwZTIwLCAgMHgwMzAxLCAweDBlMjIsICAweDAzNDIsIDB4MGUyNCwKKwkvKiAweDAzYjUgMHgwMzEzICovCisJMHgxZjEwLCAweDAwMDIsICAweDAzMDAsIDB4MGUyNiwgIDB4MDMwMSwgMHgwZTI4LAorCS8qIDB4MDNiNyAweDAzMTMgKi8KKwkweDFmMjAsIDB4MDAwMywgIDB4MDMwMCwgMHgwZTJhLCAgMHgwMzAxLCAweDBlMmMsICAweDAzNDIsIDB4MGUyZSwKKwkvKiAweDAzYjkgMHgwMzEzICovCisJMHgxZjMwLCAweDAwMDMsICAweDAzMDAsIDB4MGUzMCwgIDB4MDMwMSwgMHgwZTMyLCAgMHgwMzQyLCAweDBlMzQsCisJLyogMHgwM2JmIDB4MDMxMyAqLworCTB4MWY0MCwgMHgwMDAyLCAgMHgwMzAwLCAweDBlMzYsICAweDAzMDEsIDB4MGUzOCwKKwkvKiAweDAzYzEgMHgwMzEzICovCisJMHgxZmU0LCAweDAwMDAsCisJLyogMHgwM2M1IDB4MDMxMyAqLworCTB4MWY1MCwgMHgwMDAzLCAgMHgwMzAwLCAweDBlM2EsICAweDAzMDEsIDB4MGUzYywgIDB4MDM0MiwgMHgwZTNlLAorCS8qIDB4MDNjOSAweDAzMTMgKi8KKwkweDFmNjAsIDB4MDAwMywgIDB4MDMwMCwgMHgwZTQwLCAgMHgwMzAxLCAweDBlNDIsICAweDAzNDIsIDB4MGU0NCwKKwkvKiAweDAzOTEgMHgwMzE0ICovCisJMHgxZjA5LCAweDAwMDMsICAweDAzMDAsIDB4MGU0NiwgIDB4MDMwMSwgMHgwZTQ4LCAgMHgwMzQyLCAweDBlNGEsCisJLyogMHgwMzk1IDB4MDMxNCAqLworCTB4MWYxOSwgMHgwMDAyLCAgMHgwMzAwLCAweDBlNGMsICAweDAzMDEsIDB4MGU0ZSwKKwkvKiAweDAzOTcgMHgwMzE0ICovCisJMHgxZjI5LCAweDAwMDMsICAweDAzMDAsIDB4MGU1MCwgIDB4MDMwMSwgMHgwZTUyLCAgMHgwMzQyLCAweDBlNTQsCisJLyogMHgwMzk5IDB4MDMxNCAqLworCTB4MWYzOSwgMHgwMDAzLCAgMHgwMzAwLCAweDBlNTYsICAweDAzMDEsIDB4MGU1OCwgIDB4MDM0MiwgMHgwZTVhLAorCS8qIDB4MDM5ZiAweDAzMTQgKi8KKwkweDFmNDksIDB4MDAwMiwgIDB4MDMwMCwgMHgwZTVjLCAgMHgwMzAxLCAweDBlNWUsCisJLyogMHgwM2ExIDB4MDMxNCAqLworCTB4MWZlYywgMHgwMDAwLAorCS8qIDB4MDNhNSAweDAzMTQgKi8KKwkweDFmNTksIDB4MDAwMywgIDB4MDMwMCwgMHgwZTYwLCAgMHgwMzAxLCAweDBlNjIsICAweDAzNDIsIDB4MGU2NCwKKwkvKiAweDAzYTkgMHgwMzE0ICovCisJMHgxZjY5LCAweDAwMDMsICAweDAzMDAsIDB4MGU2NiwgIDB4MDMwMSwgMHgwZTY4LCAgMHgwMzQyLCAweDBlNmEsCisJLyogMHgwM2IxIDB4MDMxNCAqLworCTB4MWYwMSwgMHgwMDAzLCAgMHgwMzAwLCAweDBlNmMsICAweDAzMDEsIDB4MGU2ZSwgIDB4MDM0MiwgMHgwZTcwLAorCS8qIDB4MDNiNSAweDAzMTQgKi8KKwkweDFmMTEsIDB4MDAwMiwgIDB4MDMwMCwgMHgwZTcyLCAgMHgwMzAxLCAweDBlNzQsCisJLyogMHgwM2I3IDB4MDMxNCAqLworCTB4MWYyMSwgMHgwMDAzLCAgMHgwMzAwLCAweDBlNzYsICAweDAzMDEsIDB4MGU3OCwgIDB4MDM0MiwgMHgwZTdhLAorCS8qIDB4MDNiOSAweDAzMTQgKi8KKwkweDFmMzEsIDB4MDAwMywgIDB4MDMwMCwgMHgwZTdjLCAgMHgwMzAxLCAweDBlN2UsICAweDAzNDIsIDB4MGU4MCwKKwkvKiAweDAzYmYgMHgwMzE0ICovCisJMHgxZjQxLCAweDAwMDIsICAweDAzMDAsIDB4MGU4MiwgIDB4MDMwMSwgMHgwZTg0LAorCS8qIDB4MDNjMSAweDAzMTQgKi8KKwkweDFmZTUsIDB4MDAwMCwKKwkvKiAweDAzYzUgMHgwMzE0ICovCisJMHgxZjUxLCAweDAwMDMsICAweDAzMDAsIDB4MGU4NiwgIDB4MDMwMSwgMHgwZTg4LCAgMHgwMzQyLCAweDBlOGEsCisJLyogMHgwM2M5IDB4MDMxNCAqLworCTB4MWY2MSwgMHgwMDAzLCAgMHgwMzAwLCAweDBlOGMsICAweDAzMDEsIDB4MGU4ZSwgIDB4MDM0MiwgMHgwZTkwLAorCS8qIDB4MDA0ZiAweDAzMWIgKi8KKwkweDAxYTAsIDB4MDAwNSwgIDB4MDMwMCwgMHgwZTkyLCAgMHgwMzAxLCAweDBlOTQsICAweDAzMDMsIDB4MGU5NiwKKwkweDAzMDksIDB4MGU5OCwgIDB4MDMyMywgMHgwZTlhLAorCS8qIDB4MDA1NSAweDAzMWIgKi8KKwkweDAxYWYsIDB4MDAwNSwgIDB4MDMwMCwgMHgwZTljLCAgMHgwMzAxLCAweDBlOWUsICAweDAzMDMsIDB4MGVhMCwKKwkweDAzMDksIDB4MGVhMiwgIDB4MDMyMywgMHgwZWE0LAorCS8qIDB4MDA2ZiAweDAzMWIgKi8KKwkweDAxYTEsIDB4MDAwNSwgIDB4MDMwMCwgMHgwZWE2LCAgMHgwMzAxLCAweDBlYTgsICAweDAzMDMsIDB4MGVhYSwKKwkweDAzMDksIDB4MGVhYywgIDB4MDMyMywgMHgwZWFlLAorCS8qIDB4MDA3NSAweDAzMWIgKi8KKwkweDAxYjAsIDB4MDAwNSwgIDB4MDMwMCwgMHgwZWIwLCAgMHgwMzAxLCAweDBlYjIsICAweDAzMDMsIDB4MGViNCwKKwkweDAzMDksIDB4MGViNiwgIDB4MDMyMywgMHgwZWI4LAorCS8qIDB4MDA0MSAweDAzMjMgKi8KKwkweDFlYTAsIDB4MDAwMiwgIDB4MDMwMiwgMHgwZWJhLCAgMHgwMzA2LCAweDBlYmMsCisJLyogMHgwMDQyIDB4MDMyMyAqLworCTB4MWUwNCwgMHgwMDAwLAorCS8qIDB4MDA0NCAweDAzMjMgKi8KKwkweDFlMGMsIDB4MDAwMCwKKwkvKiAweDAwNDUgMHgwMzIzICovCisJMHgxZWI4LCAweDAwMDEsICAweDAzMDIsIDB4MGViZSwKKwkvKiAweDAwNDggMHgwMzIzICovCisJMHgxZTI0LCAweDAwMDAsCisJLyogMHgwMDQ5IDB4MDMyMyAqLworCTB4MWVjYSwgMHgwMDAwLAorCS8qIDB4MDA0YiAweDAzMjMgKi8KKwkweDFlMzIsIDB4MDAwMCwKKwkvKiAweDAwNGMgMHgwMzIzICovCisJMHgxZTM2LCAweDAwMDEsICAweDAzMDQsIDB4MGVjMCwKKwkvKiAweDAwNGQgMHgwMzIzICovCisJMHgxZTQyLCAweDAwMDAsCisJLyogMHgwMDRlIDB4MDMyMyAqLworCTB4MWU0NiwgMHgwMDAwLAorCS8qIDB4MDA0ZiAweDAzMjMgKi8KKwkweDFlY2MsIDB4MDAwMSwgIDB4MDMwMiwgMHgwZWMyLAorCS8qIDB4MDA1MiAweDAzMjMgKi8KKwkweDFlNWEsIDB4MDAwMSwgIDB4MDMwNCwgMHgwZWM0LAorCS8qIDB4MDA1MyAweDAzMjMgKi8KKwkweDFlNjIsIDB4MDAwMSwgIDB4MDMwNywgMHgwZWM2LAorCS8qIDB4MDA1NCAweDAzMjMgKi8KKwkweDFlNmMsIDB4MDAwMCwKKwkvKiAweDAwNTUgMHgwMzIzICovCisJMHgxZWU0LCAweDAwMDAsCisJLyogMHgwMDU2IDB4MDMyMyAqLworCTB4MWU3ZSwgMHgwMDAwLAorCS8qIDB4MDA1NyAweDAzMjMgKi8KKwkweDFlODgsIDB4MDAwMCwKKwkvKiAweDAwNTkgMHgwMzIzICovCisJMHgxZWY0LCAweDAwMDAsCisJLyogMHgwMDVhIDB4MDMyMyAqLworCTB4MWU5MiwgMHgwMDAwLAorCS8qIDB4MDA2MSAweDAzMjMgKi8KKwkweDFlYTEsIDB4MDAwMiwgIDB4MDMwMiwgMHgwZWM4LCAgMHgwMzA2LCAweDBlY2EsCisJLyogMHgwMDYyIDB4MDMyMyAqLworCTB4MWUwNSwgMHgwMDAwLAorCS8qIDB4MDA2NCAweDAzMjMgKi8KKwkweDFlMGQsIDB4MDAwMCwKKwkvKiAweDAwNjUgMHgwMzIzICovCisJMHgxZWI5LCAweDAwMDEsICAweDAzMDIsIDB4MGVjYywKKwkvKiAweDAwNjggMHgwMzIzICovCisJMHgxZTI1LCAweDAwMDAsCisJLyogMHgwMDY5IDB4MDMyMyAqLworCTB4MWVjYiwgMHgwMDAwLAorCS8qIDB4MDA2YiAweDAzMjMgKi8KKwkweDFlMzMsIDB4MDAwMCwKKwkvKiAweDAwNmMgMHgwMzIzICovCisJMHgxZTM3LCAweDAwMDEsICAweDAzMDQsIDB4MGVjZSwKKwkvKiAweDAwNmQgMHgwMzIzICovCisJMHgxZTQzLCAweDAwMDAsCisJLyogMHgwMDZlIDB4MDMyMyAqLworCTB4MWU0NywgMHgwMDAwLAorCS8qIDB4MDA2ZiAweDAzMjMgKi8KKwkweDFlY2QsIDB4MDAwMSwgIDB4MDMwMiwgMHgwZWQwLAorCS8qIDB4MDA3MiAweDAzMjMgKi8KKwkweDFlNWIsIDB4MDAwMSwgIDB4MDMwNCwgMHgwZWQyLAorCS8qIDB4MDA3MyAweDAzMjMgKi8KKwkweDFlNjMsIDB4MDAwMSwgIDB4MDMwNywgMHgwZWQ0LAorCS8qIDB4MDA3NCAweDAzMjMgKi8KKwkweDFlNmQsIDB4MDAwMCwKKwkvKiAweDAwNzUgMHgwMzIzICovCisJMHgxZWU1LCAweDAwMDAsCisJLyogMHgwMDc2IDB4MDMyMyAqLworCTB4MWU3ZiwgMHgwMDAwLAorCS8qIDB4MDA3NyAweDAzMjMgKi8KKwkweDFlODksIDB4MDAwMCwKKwkvKiAweDAwNzkgMHgwMzIzICovCisJMHgxZWY1LCAweDAwMDAsCisJLyogMHgwMDdhIDB4MDMyMyAqLworCTB4MWU5MywgMHgwMDAwLAorCS8qIDB4MDA1NSAweDAzMjQgKi8KKwkweDFlNzIsIDB4MDAwMCwKKwkvKiAweDAwNzUgMHgwMzI0ICovCisJMHgxZTczLCAweDAwMDAsCisJLyogMHgwMDQxIDB4MDMyNSAqLworCTB4MWUwMCwgMHgwMDAwLAorCS8qIDB4MDA2MSAweDAzMjUgKi8KKwkweDFlMDEsIDB4MDAwMCwKKwkvKiAweDAwNDMgMHgwMzI3ICovCisJMHgwMGM3LCAweDAwMDEsICAweDAzMDEsIDB4MGVkNiwKKwkvKiAweDAwNDQgMHgwMzI3ICovCisJMHgxZTEwLCAweDAwMDAsCisJLyogMHgwMDQ1IDB4MDMyNyAqLworCTB4MDAwMCwgMHgwMDAxLCAgMHgwMzA2LCAweDBlZDgsCisJLyogMHgwMDQ3IDB4MDMyNyAqLworCTB4MDEyMiwgMHgwMDAwLAorCS8qIDB4MDA0OCAweDAzMjcgKi8KKwkweDFlMjgsIDB4MDAwMCwKKwkvKiAweDAwNGIgMHgwMzI3ICovCisJMHgwMTM2LCAweDAwMDAsCisJLyogMHgwMDRjIDB4MDMyNyAqLworCTB4MDEzYiwgMHgwMDAwLAorCS8qIDB4MDA0ZSAweDAzMjcgKi8KKwkweDAxNDUsIDB4MDAwMCwKKwkvKiAweDAwNTIgMHgwMzI3ICovCisJMHgwMTU2LCAweDAwMDAsCisJLyogMHgwMDUzIDB4MDMyNyAqLworCTB4MDE1ZSwgMHgwMDAwLAorCS8qIDB4MDA1NCAweDAzMjcgKi8KKwkweDAxNjIsIDB4MDAwMCwKKwkvKiAweDAwNjMgMHgwMzI3ICovCisJMHgwMGU3LCAweDAwMDEsICAweDAzMDEsIDB4MGVkYSwKKwkvKiAweDAwNjQgMHgwMzI3ICovCisJMHgxZTExLCAweDAwMDAsCisJLyogMHgwMDY1IDB4MDMyNyAqLworCTB4MDAwMCwgMHgwMDAxLCAgMHgwMzA2LCAweDBlZGMsCisJLyogMHgwMDY3IDB4MDMyNyAqLworCTB4MDEyMywgMHgwMDAwLAorCS8qIDB4MDA2OCAweDAzMjcgKi8KKwkweDFlMjksIDB4MDAwMCwKKwkvKiAweDAwNmIgMHgwMzI3ICovCisJMHgwMTM3LCAweDAwMDAsCisJLyogMHgwMDZjIDB4MDMyNyAqLworCTB4MDEzYywgMHgwMDAwLAorCS8qIDB4MDA2ZSAweDAzMjcgKi8KKwkweDAxNDYsIDB4MDAwMCwKKwkvKiAweDAwNzIgMHgwMzI3ICovCisJMHgwMTU3LCAweDAwMDAsCisJLyogMHgwMDczIDB4MDMyNyAqLworCTB4MDE1ZiwgMHgwMDAwLAorCS8qIDB4MDA3NCAweDAzMjcgKi8KKwkweDAxNjMsIDB4MDAwMCwKKwkvKiAweDAwNDEgMHgwMzI4ICovCisJMHgwMTA0LCAweDAwMDAsCisJLyogMHgwMDQ1IDB4MDMyOCAqLworCTB4MDExOCwgMHgwMDAwLAorCS8qIDB4MDA0OSAweDAzMjggKi8KKwkweDAxMmUsIDB4MDAwMCwKKwkvKiAweDAwNGYgMHgwMzI4ICovCisJMHgwMWVhLCAweDAwMDEsICAweDAzMDQsIDB4MGVkZSwKKwkvKiAweDAwNTUgMHgwMzI4ICovCisJMHgwMTcyLCAweDAwMDAsCisJLyogMHgwMDYxIDB4MDMyOCAqLworCTB4MDEwNSwgMHgwMDAwLAorCS8qIDB4MDA2NSAweDAzMjggKi8KKwkweDAxMTksIDB4MDAwMCwKKwkvKiAweDAwNjkgMHgwMzI4ICovCisJMHgwMTJmLCAweDAwMDAsCisJLyogMHgwMDZmIDB4MDMyOCAqLworCTB4MDFlYiwgMHgwMDAxLCAgMHgwMzA0LCAweDBlZTAsCisJLyogMHgwMDc1IDB4MDMyOCAqLworCTB4MDE3MywgMHgwMDAwLAorCS8qIDB4MDA0NCAweDAzMmQgKi8KKwkweDFlMTIsIDB4MDAwMCwKKwkvKiAweDAwNDUgMHgwMzJkICovCisJMHgxZTE4LCAweDAwMDAsCisJLyogMHgwMDRjIDB4MDMyZCAqLworCTB4MWUzYywgMHgwMDAwLAorCS8qIDB4MDA0ZSAweDAzMmQgKi8KKwkweDFlNGEsIDB4MDAwMCwKKwkvKiAweDAwNTQgMHgwMzJkICovCisJMHgxZTcwLCAweDAwMDAsCisJLyogMHgwMDU1IDB4MDMyZCAqLworCTB4MWU3NiwgMHgwMDAwLAorCS8qIDB4MDA2NCAweDAzMmQgKi8KKwkweDFlMTMsIDB4MDAwMCwKKwkvKiAweDAwNjUgMHgwMzJkICovCisJMHgxZTE5LCAweDAwMDAsCisJLyogMHgwMDZjIDB4MDMyZCAqLworCTB4MWUzZCwgMHgwMDAwLAorCS8qIDB4MDA2ZSAweDAzMmQgKi8KKwkweDFlNGIsIDB4MDAwMCwKKwkvKiAweDAwNzQgMHgwMzJkICovCisJMHgxZTcxLCAweDAwMDAsCisJLyogMHgwMDc1IDB4MDMyZCAqLworCTB4MWU3NywgMHgwMDAwLAorCS8qIDB4MDA0OCAweDAzMmUgKi8KKwkweDFlMmEsIDB4MDAwMCwKKwkvKiAweDAwNjggMHgwMzJlICovCisJMHgxZTJiLCAweDAwMDAsCisJLyogMHgwMDQ1IDB4MDMzMCAqLworCTB4MWUxYSwgMHgwMDAwLAorCS8qIDB4MDA0OSAweDAzMzAgKi8KKwkweDFlMmMsIDB4MDAwMCwKKwkvKiAweDAwNTUgMHgwMzMwICovCisJMHgxZTc0LCAweDAwMDAsCisJLyogMHgwMDY1IDB4MDMzMCAqLworCTB4MWUxYiwgMHgwMDAwLAorCS8qIDB4MDA2OSAweDAzMzAgKi8KKwkweDFlMmQsIDB4MDAwMCwKKwkvKiAweDAwNzUgMHgwMzMwICovCisJMHgxZTc1LCAweDAwMDAsCisJLyogMHgwMDQyIDB4MDMzMSAqLworCTB4MWUwNiwgMHgwMDAwLAorCS8qIDB4MDA0NCAweDAzMzEgKi8KKwkweDFlMGUsIDB4MDAwMCwKKwkvKiAweDAwNGIgMHgwMzMxICovCisJMHgxZTM0LCAweDAwMDAsCisJLyogMHgwMDRjIDB4MDMzMSAqLworCTB4MWUzYSwgMHgwMDAwLAorCS8qIDB4MDA0ZSAweDAzMzEgKi8KKwkweDFlNDgsIDB4MDAwMCwKKwkvKiAweDAwNTIgMHgwMzMxICovCisJMHgxZTVlLCAweDAwMDAsCisJLyogMHgwMDU0IDB4MDMzMSAqLworCTB4MWU2ZSwgMHgwMDAwLAorCS8qIDB4MDA1YSAweDAzMzEgKi8KKwkweDFlOTQsIDB4MDAwMCwKKwkvKiAweDAwNjIgMHgwMzMxICovCisJMHgxZTA3LCAweDAwMDAsCisJLyogMHgwMDY0IDB4MDMzMSAqLworCTB4MWUwZiwgMHgwMDAwLAorCS8qIDB4MDA2OCAweDAzMzEgKi8KKwkweDFlOTYsIDB4MDAwMCwKKwkvKiAweDAwNmIgMHgwMzMxICovCisJMHgxZTM1LCAweDAwMDAsCisJLyogMHgwMDZjIDB4MDMzMSAqLworCTB4MWUzYiwgMHgwMDAwLAorCS8qIDB4MDA2ZSAweDAzMzEgKi8KKwkweDFlNDksIDB4MDAwMCwKKwkvKiAweDAwNzIgMHgwMzMxICovCisJMHgxZTVmLCAweDAwMDAsCisJLyogMHgwMDc0IDB4MDMzMSAqLworCTB4MWU2ZiwgMHgwMDAwLAorCS8qIDB4MDA3YSAweDAzMzEgKi8KKwkweDFlOTUsIDB4MDAwMCwKKwkvKiAweDAwYTggMHgwMzQyICovCisJMHgxZmMxLCAweDAwMDAsCisJLyogMHgwM2IxIDB4MDM0MiAqLworCTB4MWZiNiwgMHgwMDAwLAorCS8qIDB4MDNiNyAweDAzNDIgKi8KKwkweDFmYzYsIDB4MDAwMCwKKwkvKiAweDAzYjkgMHgwMzQyICovCisJMHgxZmQ2LCAweDAwMDAsCisJLyogMHgwM2M1IDB4MDM0MiAqLworCTB4MWZlNiwgMHgwMDAwLAorCS8qIDB4MDNjOSAweDAzNDIgKi8KKwkweDFmZjYsIDB4MDAwMCwKKwkvKiAweDFmYmYgMHgwMzQyICovCisJMHgxZmNmLCAweDAwMDAsCisJLyogMHgxZmZlIDB4MDM0MiAqLworCTB4MWZkZiwgMHgwMDAwLAorCS8qIDB4MDM5MSAweDAzNDUgKi8KKwkweDFmYmMsIDB4MDAwMiwgIDB4MDMxMywgMHgwZWUyLCAgMHgwMzE0LCAweDBlZWEsCisJLyogMHgwMzk3IDB4MDM0NSAqLworCTB4MWZjYywgMHgwMDAyLCAgMHgwMzEzLCAweDBlZjIsICAweDAzMTQsIDB4MGVmYSwKKwkvKiAweDAzYTkgMHgwMzQ1ICovCisJMHgxZmZjLCAweDAwMDIsICAweDAzMTMsIDB4MGYwMiwgIDB4MDMxNCwgMHgwZjBhLAorCS8qIDB4MDNiMSAweDAzNDUgKi8KKwkweDFmYjMsIDB4MDAwNSwgIDB4MDMwMCwgMHgwZjEyLCAgMHgwMzAxLCAweDBmMTQsICAweDAzMTMsIDB4MGYxNiwKKwkweDAzMTQsIDB4MGYxZSwgIDB4MDM0MiwgMHgwZjI2LAorCS8qIDB4MDNiNyAweDAzNDUgKi8KKwkweDFmYzMsIDB4MDAwNSwgIDB4MDMwMCwgMHgwZjI4LCAgMHgwMzAxLCAweDBmMmEsICAweDAzMTMsIDB4MGYyYywKKwkweDAzMTQsIDB4MGYzNCwgIDB4MDM0MiwgMHgwZjNjLAorCS8qIDB4MDNiZiAweDAzNDUgKi8KKwkweDAwMDAsIDB4MDAwMSwgIDB4MDMwMSwgMHgwZjNlLAorCS8qIDB4MDNjOSAweDAzNDUgKi8KKwkweDFmZjMsIDB4MDAwNCwgIDB4MDMwMCwgMHgwZjQwLCAgMHgwMzEzLCAweDBmNDIsICAweDAzMTQsIDB4MGY0YSwKKwkweDAzNDIsIDB4MGY1MiwKKwkvKiAweDA1ZDAgMHgwNWI3ICovCisJMHhmYjJlLCAweDAwMDAsCisJLyogMHgwNWYyIDB4MDViNyAqLworCTB4ZmIxZiwgMHgwMDAwLAorCS8qIDB4MDVkMCAweDA1YjggKi8KKwkweGZiMmYsIDB4MDAwMCwKKwkvKiAweDA1ZDUgMHgwNWI5ICovCisJMHhmYjRiLCAweDAwMDAsCisJLyogMHgwNWQwIDB4MDViYyAqLworCTB4ZmIzMCwgMHgwMDAwLAorCS8qIDB4MDVkMSAweDA1YmMgKi8KKwkweGZiMzEsIDB4MDAwMCwKKwkvKiAweDA1ZDIgMHgwNWJjICovCisJMHhmYjMyLCAweDAwMDAsCisJLyogMHgwNWQzIDB4MDViYyAqLworCTB4ZmIzMywgMHgwMDAwLAorCS8qIDB4MDVkNCAweDA1YmMgKi8KKwkweGZiMzQsIDB4MDAwMCwKKwkvKiAweDA1ZDUgMHgwNWJjICovCisJMHhmYjM1LCAweDAwMDAsCisJLyogMHgwNWQ2IDB4MDViYyAqLworCTB4ZmIzNiwgMHgwMDAwLAorCS8qIDB4MDVkOCAweDA1YmMgKi8KKwkweGZiMzgsIDB4MDAwMCwKKwkvKiAweDA1ZDkgMHgwNWJjICovCisJMHhmYjM5LCAweDAwMDAsCisJLyogMHgwNWRhIDB4MDViYyAqLworCTB4ZmIzYSwgMHgwMDAwLAorCS8qIDB4MDVkYiAweDA1YmMgKi8KKwkweGZiM2IsIDB4MDAwMCwKKwkvKiAweDA1ZGMgMHgwNWJjICovCisJMHhmYjNjLCAweDAwMDAsCisJLyogMHgwNWRlIDB4MDViYyAqLworCTB4ZmIzZSwgMHgwMDAwLAorCS8qIDB4MDVlMCAweDA1YmMgKi8KKwkweGZiNDAsIDB4MDAwMCwKKwkvKiAweDA1ZTEgMHgwNWJjICovCisJMHhmYjQxLCAweDAwMDAsCisJLyogMHgwNWUzIDB4MDViYyAqLworCTB4ZmI0MywgMHgwMDAwLAorCS8qIDB4MDVlNCAweDA1YmMgKi8KKwkweGZiNDQsIDB4MDAwMCwKKwkvKiAweDA1ZTYgMHgwNWJjICovCisJMHhmYjQ2LCAweDAwMDAsCisJLyogMHgwNWU3IDB4MDViYyAqLworCTB4ZmI0NywgMHgwMDAwLAorCS8qIDB4MDVlOCAweDA1YmMgKi8KKwkweGZiNDgsIDB4MDAwMCwKKwkvKiAweDA1ZTkgMHgwNWJjICovCisJMHhmYjQ5LCAweDAwMDIsICAweDA1YzEsIDB4MGY1NCwgIDB4MDVjMiwgMHgwZjU2LAorCS8qIDB4MDVlYSAweDA1YmMgKi8KKwkweGZiNGEsIDB4MDAwMCwKKwkvKiAweDA1ZDEgMHgwNWJmICovCisJMHhmYjRjLCAweDAwMDAsCisJLyogMHgwNWRiIDB4MDViZiAqLworCTB4ZmI0ZCwgMHgwMDAwLAorCS8qIDB4MDVlNCAweDA1YmYgKi8KKwkweGZiNGUsIDB4MDAwMCwKKwkvKiAweDA1ZTkgMHgwNWMxICovCisJMHhmYjJhLCAweDAwMDAsCisJLyogMHgwNWU5IDB4MDVjMiAqLworCTB4ZmIyYiwgMHgwMDAwLAorCS8qIDB4MDkxNSAweDA5M2MgKi8KKwkweDA5NTgsIDB4MDAwMCwKKwkvKiAweDA5MTYgMHgwOTNjICovCisJMHgwOTU5LCAweDAwMDAsCisJLyogMHgwOTE3IDB4MDkzYyAqLworCTB4MDk1YSwgMHgwMDAwLAorCS8qIDB4MDkxYyAweDA5M2MgKi8KKwkweDA5NWIsIDB4MDAwMCwKKwkvKiAweDA5MjEgMHgwOTNjICovCisJMHgwOTVjLCAweDAwMDAsCisJLyogMHgwOTIyIDB4MDkzYyAqLworCTB4MDk1ZCwgMHgwMDAwLAorCS8qIDB4MDkyOCAweDA5M2MgKi8KKwkweDA5MjksIDB4MDAwMCwKKwkvKiAweDA5MmIgMHgwOTNjICovCisJMHgwOTVlLCAweDAwMDAsCisJLyogMHgwOTJmIDB4MDkzYyAqLworCTB4MDk1ZiwgMHgwMDAwLAorCS8qIDB4MDkzMCAweDA5M2MgKi8KKwkweDA5MzEsIDB4MDAwMCwKKwkvKiAweDA5MzMgMHgwOTNjICovCisJMHgwOTM0LCAweDAwMDAsCisJLyogMHgwOWExIDB4MDliYyAqLworCTB4MDlkYywgMHgwMDAwLAorCS8qIDB4MDlhMiAweDA5YmMgKi8KKwkweDA5ZGQsIDB4MDAwMCwKKwkvKiAweDA5YWMgMHgwOWJjICovCisJMHgwOWIwLCAweDAwMDAsCisJLyogMHgwOWFmIDB4MDliYyAqLworCTB4MDlkZiwgMHgwMDAwLAorCS8qIDB4MDljNyAweDA5YmUgKi8KKwkweDA5Y2IsIDB4MDAwMCwKKwkvKiAweDA5YzcgMHgwOWQ3ICovCisJMHgwOWNjLCAweDAwMDAsCisJLyogMHgwYTE2IDB4MGEzYyAqLworCTB4MGE1OSwgMHgwMDAwLAorCS8qIDB4MGExNyAweDBhM2MgKi8KKwkweDBhNWEsIDB4MDAwMCwKKwkvKiAweDBhMWMgMHgwYTNjICovCisJMHgwYTViLCAweDAwMDAsCisJLyogMHgwYTIxIDB4MGEzYyAqLworCTB4MGE1YywgMHgwMDAwLAorCS8qIDB4MGEyYiAweDBhM2MgKi8KKwkweDBhNWUsIDB4MDAwMCwKKwkvKiAweDBiMjEgMHgwYjNjICovCisJMHgwYjVjLCAweDAwMDAsCisJLyogMHgwYjIyIDB4MGIzYyAqLworCTB4MGI1ZCwgMHgwMDAwLAorCS8qIDB4MGIyZiAweDBiM2MgKi8KKwkweDBiNWYsIDB4MDAwMCwKKwkvKiAweDBiNDcgMHgwYjNlICovCisJMHgwYjRiLCAweDAwMDAsCisJLyogMHgwYjQ3IDB4MGI1NiAqLworCTB4MGI0OCwgMHgwMDAwLAorCS8qIDB4MGI0NyAweDBiNTcgKi8KKwkweDBiNGMsIDB4MDAwMCwKKwkvKiAweDBiYzYgMHgwYmJlICovCisJMHgwYmNhLCAweDAwMDAsCisJLyogMHgwYmM3IDB4MGJiZSAqLworCTB4MGJjYiwgMHgwMDAwLAorCS8qIDB4MGI5MiAweDBiZDcgKi8KKwkweDBiOTQsIDB4MDAwMCwKKwkvKiAweDBiYzYgMHgwYmQ3ICovCisJMHgwYmNjLCAweDAwMDAsCisJLyogMHgwYzQ2IDB4MGM1NiAqLworCTB4MGM0OCwgMHgwMDAwLAorCS8qIDB4MGNjNiAweDBjYzIgKi8KKwkweDBjY2EsIDB4MDAwMSwgIDB4MGNkNSwgMHgwZjU4LAorCS8qIDB4MGNiZiAweDBjZDUgKi8KKwkweDBjYzAsIDB4MDAwMCwKKwkvKiAweDBjYzYgMHgwY2Q1ICovCisJMHgwY2M3LCAweDAwMDAsCisJLyogMHgwY2M2IDB4MGNkNiAqLworCTB4MGNjOCwgMHgwMDAwLAorCS8qIDB4MGQ0NiAweDBkM2UgKi8KKwkweDBkNGEsIDB4MDAwMCwKKwkvKiAweDBkNDcgMHgwZDNlICovCisJMHgwZDRiLCAweDAwMDAsCisJLyogMHgwZDQ2IDB4MGQ1NyAqLworCTB4MGQ0YywgMHgwMDAwLAorCS8qIDB4MGU0ZCAweDBlMzIgKi8KKwkweDBlMzMsIDB4MDAwMCwKKwkvKiAweDBlY2QgMHgwZWIyICovCisJMHgwZWIzLCAweDAwMDAsCisJLyogMHgwZjcyIDB4MGY3MSAqLworCTB4MGY3MywgMHgwMDAwLAorCS8qIDB4MGY3NCAweDBmNzEgKi8KKwkweDBmNzUsIDB4MDAwMCwKKwkvKiAweDBmODAgMHgwZjcxICovCisJMHgwZjgxLCAweDAwMDAsCisJLyogMHgwZmIyIDB4MGY4MCAqLworCTB4MGY3NiwgMHgwMDAxLCAgMHgwZjcxLCAweDBmNWEsCisJLyogMHgwZmIzIDB4MGY4MCAqLworCTB4MGY3OCwgMHgwMDAxLCAgMHgwZjcxLCAweDBmNWMsCisJLyogMHgwZjQwIDB4MGZiNSAqLworCTB4MGY2OSwgMHgwMDAwLAorCS8qIDB4MGY5MCAweDBmYjUgKi8KKwkweDBmYjksIDB4MDAwMCwKKwkvKiAweDBmNDIgMHgwZmI3ICovCisJMHgwZjQzLCAweDAwMDAsCisJLyogMHgwZjRjIDB4MGZiNyAqLworCTB4MGY0ZCwgMHgwMDAwLAorCS8qIDB4MGY1MSAweDBmYjcgKi8KKwkweDBmNTIsIDB4MDAwMCwKKwkvKiAweDBmNTYgMHgwZmI3ICovCisJMHgwZjU3LCAweDAwMDAsCisJLyogMHgwZjViIDB4MGZiNyAqLworCTB4MGY1YywgMHgwMDAwLAorCS8qIDB4MGY5MiAweDBmYjcgKi8KKwkweDBmOTMsIDB4MDAwMCwKKwkvKiAweDBmOWMgMHgwZmI3ICovCisJMHgwZjlkLCAweDAwMDAsCisJLyogMHgwZmExIDB4MGZiNyAqLworCTB4MGZhMiwgMHgwMDAwLAorCS8qIDB4MGZhNiAweDBmYjcgKi8KKwkweDBmYTcsIDB4MDAwMCwKKwkvKiAweDBmYWIgMHgwZmI3ICovCisJMHgwZmFjLCAweDAwMDAsCisJLyogMHgzMDQ2IDB4MzA5OSAqLworCTB4MzA5NCwgMHgwMDAwLAorCS8qIDB4MzA0YiAweDMwOTkgKi8KKwkweDMwNGMsIDB4MDAwMCwKKwkvKiAweDMwNGQgMHgzMDk5ICovCisJMHgzMDRlLCAweDAwMDAsCisJLyogMHgzMDRmIDB4MzA5OSAqLworCTB4MzA1MCwgMHgwMDAwLAorCS8qIDB4MzA1MSAweDMwOTkgKi8KKwkweDMwNTIsIDB4MDAwMCwKKwkvKiAweDMwNTMgMHgzMDk5ICovCisJMHgzMDU0LCAweDAwMDAsCisJLyogMHgzMDU1IDB4MzA5OSAqLworCTB4MzA1NiwgMHgwMDAwLAorCS8qIDB4MzA1NyAweDMwOTkgKi8KKwkweDMwNTgsIDB4MDAwMCwKKwkvKiAweDMwNTkgMHgzMDk5ICovCisJMHgzMDVhLCAweDAwMDAsCisJLyogMHgzMDViIDB4MzA5OSAqLworCTB4MzA1YywgMHgwMDAwLAorCS8qIDB4MzA1ZCAweDMwOTkgKi8KKwkweDMwNWUsIDB4MDAwMCwKKwkvKiAweDMwNWYgMHgzMDk5ICovCisJMHgzMDYwLCAweDAwMDAsCisJLyogMHgzMDYxIDB4MzA5OSAqLworCTB4MzA2MiwgMHgwMDAwLAorCS8qIDB4MzA2NCAweDMwOTkgKi8KKwkweDMwNjUsIDB4MDAwMCwKKwkvKiAweDMwNjYgMHgzMDk5ICovCisJMHgzMDY3LCAweDAwMDAsCisJLyogMHgzMDY4IDB4MzA5OSAqLworCTB4MzA2OSwgMHgwMDAwLAorCS8qIDB4MzA2ZiAweDMwOTkgKi8KKwkweDMwNzAsIDB4MDAwMCwKKwkvKiAweDMwNzIgMHgzMDk5ICovCisJMHgzMDczLCAweDAwMDAsCisJLyogMHgzMDc1IDB4MzA5OSAqLworCTB4MzA3NiwgMHgwMDAwLAorCS8qIDB4MzA3OCAweDMwOTkgKi8KKwkweDMwNzksIDB4MDAwMCwKKwkvKiAweDMwN2IgMHgzMDk5ICovCisJMHgzMDdjLCAweDAwMDAsCisJLyogMHgzMDlkIDB4MzA5OSAqLworCTB4MzA5ZSwgMHgwMDAwLAorCS8qIDB4MzBhNiAweDMwOTkgKi8KKwkweDMwZjQsIDB4MDAwMCwKKwkvKiAweDMwYWIgMHgzMDk5ICovCisJMHgzMGFjLCAweDAwMDAsCisJLyogMHgzMGFkIDB4MzA5OSAqLworCTB4MzBhZSwgMHgwMDAwLAorCS8qIDB4MzBhZiAweDMwOTkgKi8KKwkweDMwYjAsIDB4MDAwMCwKKwkvKiAweDMwYjEgMHgzMDk5ICovCisJMHgzMGIyLCAweDAwMDAsCisJLyogMHgzMGIzIDB4MzA5OSAqLworCTB4MzBiNCwgMHgwMDAwLAorCS8qIDB4MzBiNSAweDMwOTkgKi8KKwkweDMwYjYsIDB4MDAwMCwKKwkvKiAweDMwYjcgMHgzMDk5ICovCisJMHgzMGI4LCAweDAwMDAsCisJLyogMHgzMGI5IDB4MzA5OSAqLworCTB4MzBiYSwgMHgwMDAwLAorCS8qIDB4MzBiYiAweDMwOTkgKi8KKwkweDMwYmMsIDB4MDAwMCwKKwkvKiAweDMwYmQgMHgzMDk5ICovCisJMHgzMGJlLCAweDAwMDAsCisJLyogMHgzMGJmIDB4MzA5OSAqLworCTB4MzBjMCwgMHgwMDAwLAorCS8qIDB4MzBjMSAweDMwOTkgKi8KKwkweDMwYzIsIDB4MDAwMCwKKwkvKiAweDMwYzQgMHgzMDk5ICovCisJMHgzMGM1LCAweDAwMDAsCisJLyogMHgzMGM2IDB4MzA5OSAqLworCTB4MzBjNywgMHgwMDAwLAorCS8qIDB4MzBjOCAweDMwOTkgKi8KKwkweDMwYzksIDB4MDAwMCwKKwkvKiAweDMwY2YgMHgzMDk5ICovCisJMHgzMGQwLCAweDAwMDAsCisJLyogMHgzMGQyIDB4MzA5OSAqLworCTB4MzBkMywgMHgwMDAwLAorCS8qIDB4MzBkNSAweDMwOTkgKi8KKwkweDMwZDYsIDB4MDAwMCwKKwkvKiAweDMwZDggMHgzMDk5ICovCisJMHgzMGQ5LCAweDAwMDAsCisJLyogMHgzMGRiIDB4MzA5OSAqLworCTB4MzBkYywgMHgwMDAwLAorCS8qIDB4MzBlZiAweDMwOTkgKi8KKwkweDMwZjcsIDB4MDAwMCwKKwkvKiAweDMwZjAgMHgzMDk5ICovCisJMHgzMGY4LCAweDAwMDAsCisJLyogMHgzMGYxIDB4MzA5OSAqLworCTB4MzBmOSwgMHgwMDAwLAorCS8qIDB4MzBmMiAweDMwOTkgKi8KKwkweDMwZmEsIDB4MDAwMCwKKwkvKiAweDMwZmQgMHgzMDk5ICovCisJMHgzMGZlLCAweDAwMDAsCisJLyogMHgzMDZmIDB4MzA5YSAqLworCTB4MzA3MSwgMHgwMDAwLAorCS8qIDB4MzA3MiAweDMwOWEgKi8KKwkweDMwNzQsIDB4MDAwMCwKKwkvKiAweDMwNzUgMHgzMDlhICovCisJMHgzMDc3LCAweDAwMDAsCisJLyogMHgzMDc4IDB4MzA5YSAqLworCTB4MzA3YSwgMHgwMDAwLAorCS8qIDB4MzA3YiAweDMwOWEgKi8KKwkweDMwN2QsIDB4MDAwMCwKKwkvKiAweDMwY2YgMHgzMDlhICovCisJMHgzMGQxLCAweDAwMDAsCisJLyogMHgzMGQyIDB4MzA5YSAqLworCTB4MzBkNCwgMHgwMDAwLAorCS8qIDB4MzBkNSAweDMwOWEgKi8KKwkweDMwZDcsIDB4MDAwMCwKKwkvKiAweDMwZDggMHgzMDlhICovCisJMHgzMGRhLCAweDAwMDAsCisJLyogMHgzMGRiIDB4MzA5YSAqLworCTB4MzBkZCwgMHgwMDAwLAorCS8qIDB4MDMwNyAweDAwNTMgMHgwMzAxICovCisJMHgxZTY0LCAweDAwMDAsCisJLyogMHgwMzA3IDB4MDA3MyAweDAzMDEgKi8KKwkweDFlNjUsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMDQxIDB4MDMwMiAqLworCTB4MWVhNiwgMHgwMDAwLAorCS8qIDB4MDMwMSAweDAwNDEgMHgwMzAyICovCisJMHgxZWE0LCAweDAwMDAsCisJLyogMHgwMzAzIDB4MDA0MSAweDAzMDIgKi8KKwkweDFlYWEsIDB4MDAwMCwKKwkvKiAweDAzMDkgMHgwMDQxIDB4MDMwMiAqLworCTB4MWVhOCwgMHgwMDAwLAorCS8qIDB4MDMwMCAweDAwNDUgMHgwMzAyICovCisJMHgxZWMwLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDA0NSAweDAzMDIgKi8KKwkweDFlYmUsIDB4MDAwMCwKKwkvKiAweDAzMDMgMHgwMDQ1IDB4MDMwMiAqLworCTB4MWVjNCwgMHgwMDAwLAorCS8qIDB4MDMwOSAweDAwNDUgMHgwMzAyICovCisJMHgxZWMyLCAweDAwMDAsCisJLyogMHgwMzAwIDB4MDA0ZiAweDAzMDIgKi8KKwkweDFlZDIsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMDRmIDB4MDMwMiAqLworCTB4MWVkMCwgMHgwMDAwLAorCS8qIDB4MDMwMyAweDAwNGYgMHgwMzAyICovCisJMHgxZWQ2LCAweDAwMDAsCisJLyogMHgwMzA5IDB4MDA0ZiAweDAzMDIgKi8KKwkweDFlZDQsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMDYxIDB4MDMwMiAqLworCTB4MWVhNywgMHgwMDAwLAorCS8qIDB4MDMwMSAweDAwNjEgMHgwMzAyICovCisJMHgxZWE1LCAweDAwMDAsCisJLyogMHgwMzAzIDB4MDA2MSAweDAzMDIgKi8KKwkweDFlYWIsIDB4MDAwMCwKKwkvKiAweDAzMDkgMHgwMDYxIDB4MDMwMiAqLworCTB4MWVhOSwgMHgwMDAwLAorCS8qIDB4MDMwMCAweDAwNjUgMHgwMzAyICovCisJMHgxZWMxLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDA2NSAweDAzMDIgKi8KKwkweDFlYmYsIDB4MDAwMCwKKwkvKiAweDAzMDMgMHgwMDY1IDB4MDMwMiAqLworCTB4MWVjNSwgMHgwMDAwLAorCS8qIDB4MDMwOSAweDAwNjUgMHgwMzAyICovCisJMHgxZWMzLCAweDAwMDAsCisJLyogMHgwMzAwIDB4MDA2ZiAweDAzMDIgKi8KKwkweDFlZDMsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMDZmIDB4MDMwMiAqLworCTB4MWVkMSwgMHgwMDAwLAorCS8qIDB4MDMwMyAweDAwNmYgMHgwMzAyICovCisJMHgxZWQ3LCAweDAwMDAsCisJLyogMHgwMzA5IDB4MDA2ZiAweDAzMDIgKi8KKwkweDFlZDUsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMDRmIDB4MDMwMyAqLworCTB4MWU0YywgMHgwMDAwLAorCS8qIDB4MDMwOCAweDAwNGYgMHgwMzAzICovCisJMHgxZTRlLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDA1NSAweDAzMDMgKi8KKwkweDFlNzgsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMDZmIDB4MDMwMyAqLworCTB4MWU0ZCwgMHgwMDAwLAorCS8qIDB4MDMwOCAweDAwNmYgMHgwMzAzICovCisJMHgxZTRmLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDA3NSAweDAzMDMgKi8KKwkweDFlNzksIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMDQ1IDB4MDMwNCAqLworCTB4MWUxNCwgMHgwMDAwLAorCS8qIDB4MDMwMSAweDAwNDUgMHgwMzA0ICovCisJMHgxZTE2LCAweDAwMDAsCisJLyogMHgwMzAwIDB4MDA0ZiAweDAzMDQgKi8KKwkweDFlNTAsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMDRmIDB4MDMwNCAqLworCTB4MWU1MiwgMHgwMDAwLAorCS8qIDB4MDMwOCAweDAwNTUgMHgwMzA0ICovCisJMHgxZTdhLCAweDAwMDAsCisJLyogMHgwMzAwIDB4MDA2NSAweDAzMDQgKi8KKwkweDFlMTUsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMDY1IDB4MDMwNCAqLworCTB4MWUxNywgMHgwMDAwLAorCS8qIDB4MDMwMCAweDAwNmYgMHgwMzA0ICovCisJMHgxZTUxLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDA2ZiAweDAzMDQgKi8KKwkweDFlNTMsIDB4MDAwMCwKKwkvKiAweDAzMDggMHgwMDc1IDB4MDMwNCAqLworCTB4MWU3YiwgMHgwMDAwLAorCS8qIDB4MDMwMCAweDAwNDEgMHgwMzA2ICovCisJMHgxZWIwLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDA0MSAweDAzMDYgKi8KKwkweDFlYWUsIDB4MDAwMCwKKwkvKiAweDAzMDMgMHgwMDQxIDB4MDMwNiAqLworCTB4MWViNCwgMHgwMDAwLAorCS8qIDB4MDMwOSAweDAwNDEgMHgwMzA2ICovCisJMHgxZWIyLCAweDAwMDAsCisJLyogMHgwMzAwIDB4MDA2MSAweDAzMDYgKi8KKwkweDFlYjEsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMDYxIDB4MDMwNiAqLworCTB4MWVhZiwgMHgwMDAwLAorCS8qIDB4MDMwMyAweDAwNjEgMHgwMzA2ICovCisJMHgxZWI1LCAweDAwMDAsCisJLyogMHgwMzA5IDB4MDA2MSAweDAzMDYgKi8KKwkweDFlYjMsIDB4MDAwMCwKKwkvKiAweDAzMDQgMHgwMDQxIDB4MDMwNyAqLworCTB4MDFlMCwgMHgwMDAwLAorCS8qIDB4MDMwNCAweDAwNjEgMHgwMzA3ICovCisJMHgwMWUxLCAweDAwMDAsCisJLyogMHgwMzA0IDB4MDA0MSAweDAzMDggKi8KKwkweDAxZGUsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMDQ5IDB4MDMwOCAqLworCTB4MWUyZSwgMHgwMDAwLAorCS8qIDB4MDMwMCAweDAwNTUgMHgwMzA4ICovCisJMHgwMWRiLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDA1NSAweDAzMDggKi8KKwkweDAxZDcsIDB4MDAwMCwKKwkvKiAweDAzMDQgMHgwMDU1IDB4MDMwOCAqLworCTB4MDFkNSwgMHgwMDAwLAorCS8qIDB4MDMwYyAweDAwNTUgMHgwMzA4ICovCisJMHgwMWQ5LCAweDAwMDAsCisJLyogMHgwMzA0IDB4MDA2MSAweDAzMDggKi8KKwkweDAxZGYsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMDY5IDB4MDMwOCAqLworCTB4MWUyZiwgMHgwMDAwLAorCS8qIDB4MDMwMCAweDAwNzUgMHgwMzA4ICovCisJMHgwMWRjLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDA3NSAweDAzMDggKi8KKwkweDAxZDgsIDB4MDAwMCwKKwkvKiAweDAzMDQgMHgwMDc1IDB4MDMwOCAqLworCTB4MDFkNiwgMHgwMDAwLAorCS8qIDB4MDMwYyAweDAwNzUgMHgwMzA4ICovCisJMHgwMWRhLCAweDAwMDAsCisJLyogMHgwMzAwIDB4MDNiOSAweDAzMDggKi8KKwkweDFmZDIsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwM2I5IDB4MDMwOCAqLworCTB4MWZkMywgMHgwMDAwLAorCS8qIDB4MDMwZCAweDAzYjkgMHgwMzA4ICovCisJMHgwMzkwLCAweDAwMDAsCisJLyogMHgwMzQyIDB4MDNiOSAweDAzMDggKi8KKwkweDFmZDcsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwM2M1IDB4MDMwOCAqLworCTB4MWZlMiwgMHgwMDAwLAorCS8qIDB4MDMwMSAweDAzYzUgMHgwMzA4ICovCisJMHgxZmUzLCAweDAwMDAsCisJLyogMHgwMzBkIDB4MDNjNSAweDAzMDggKi8KKwkweDAzYjAsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwM2M1IDB4MDMwOCAqLworCTB4MWZlNywgMHgwMDAwLAorCS8qIDB4MDMwMSAweDAwNDEgMHgwMzBhICovCisJMHgwMWZhLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDA2MSAweDAzMGEgKi8KKwkweDAxZmIsIDB4MDAwMCwKKwkvKiAweDAzMDcgMHgwMDUzIDB4MDMwYyAqLworCTB4MWU2NiwgMHgwMDAwLAorCS8qIDB4MDMwNyAweDAwNzMgMHgwMzBjICovCisJMHgxZTY3LCAweDAwMDAsCisJLyogMHgwMzAwIDB4MDM5MSAweDAzMTMgKi8KKwkweDFmMGEsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMzkxIDB4MDMxMyAqLworCTB4MWYwYywgMHgwMDAwLAorCS8qIDB4MDM0MiAweDAzOTEgMHgwMzEzICovCisJMHgxZjBlLCAweDAwMDAsCisJLyogMHgwMzAwIDB4MDM5NSAweDAzMTMgKi8KKwkweDFmMWEsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMzk1IDB4MDMxMyAqLworCTB4MWYxYywgMHgwMDAwLAorCS8qIDB4MDMwMCAweDAzOTcgMHgwMzEzICovCisJMHgxZjJhLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDM5NyAweDAzMTMgKi8KKwkweDFmMmMsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwMzk3IDB4MDMxMyAqLworCTB4MWYyZSwgMHgwMDAwLAorCS8qIDB4MDMwMCAweDAzOTkgMHgwMzEzICovCisJMHgxZjNhLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDM5OSAweDAzMTMgKi8KKwkweDFmM2MsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwMzk5IDB4MDMxMyAqLworCTB4MWYzZSwgMHgwMDAwLAorCS8qIDB4MDMwMCAweDAzOWYgMHgwMzEzICovCisJMHgxZjRhLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDM5ZiAweDAzMTMgKi8KKwkweDFmNGMsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwM2E5IDB4MDMxMyAqLworCTB4MWY2YSwgMHgwMDAwLAorCS8qIDB4MDMwMSAweDAzYTkgMHgwMzEzICovCisJMHgxZjZjLCAweDAwMDAsCisJLyogMHgwMzQyIDB4MDNhOSAweDAzMTMgKi8KKwkweDFmNmUsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwM2IxIDB4MDMxMyAqLworCTB4MWYwMiwgMHgwMDAwLAorCS8qIDB4MDMwMSAweDAzYjEgMHgwMzEzICovCisJMHgxZjA0LCAweDAwMDAsCisJLyogMHgwMzQyIDB4MDNiMSAweDAzMTMgKi8KKwkweDFmMDYsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwM2I1IDB4MDMxMyAqLworCTB4MWYxMiwgMHgwMDAwLAorCS8qIDB4MDMwMSAweDAzYjUgMHgwMzEzICovCisJMHgxZjE0LCAweDAwMDAsCisJLyogMHgwMzAwIDB4MDNiNyAweDAzMTMgKi8KKwkweDFmMjIsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwM2I3IDB4MDMxMyAqLworCTB4MWYyNCwgMHgwMDAwLAorCS8qIDB4MDM0MiAweDAzYjcgMHgwMzEzICovCisJMHgxZjI2LCAweDAwMDAsCisJLyogMHgwMzAwIDB4MDNiOSAweDAzMTMgKi8KKwkweDFmMzIsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwM2I5IDB4MDMxMyAqLworCTB4MWYzNCwgMHgwMDAwLAorCS8qIDB4MDM0MiAweDAzYjkgMHgwMzEzICovCisJMHgxZjM2LCAweDAwMDAsCisJLyogMHgwMzAwIDB4MDNiZiAweDAzMTMgKi8KKwkweDFmNDIsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwM2JmIDB4MDMxMyAqLworCTB4MWY0NCwgMHgwMDAwLAorCS8qIDB4MDMwMCAweDAzYzUgMHgwMzEzICovCisJMHgxZjUyLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDNjNSAweDAzMTMgKi8KKwkweDFmNTQsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwM2M1IDB4MDMxMyAqLworCTB4MWY1NiwgMHgwMDAwLAorCS8qIDB4MDMwMCAweDAzYzkgMHgwMzEzICovCisJMHgxZjYyLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDNjOSAweDAzMTMgKi8KKwkweDFmNjQsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwM2M5IDB4MDMxMyAqLworCTB4MWY2NiwgMHgwMDAwLAorCS8qIDB4MDMwMCAweDAzOTEgMHgwMzE0ICovCisJMHgxZjBiLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDM5MSAweDAzMTQgKi8KKwkweDFmMGQsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwMzkxIDB4MDMxNCAqLworCTB4MWYwZiwgMHgwMDAwLAorCS8qIDB4MDMwMCAweDAzOTUgMHgwMzE0ICovCisJMHgxZjFiLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDM5NSAweDAzMTQgKi8KKwkweDFmMWQsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMzk3IDB4MDMxNCAqLworCTB4MWYyYiwgMHgwMDAwLAorCS8qIDB4MDMwMSAweDAzOTcgMHgwMzE0ICovCisJMHgxZjJkLCAweDAwMDAsCisJLyogMHgwMzQyIDB4MDM5NyAweDAzMTQgKi8KKwkweDFmMmYsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMzk5IDB4MDMxNCAqLworCTB4MWYzYiwgMHgwMDAwLAorCS8qIDB4MDMwMSAweDAzOTkgMHgwMzE0ICovCisJMHgxZjNkLCAweDAwMDAsCisJLyogMHgwMzQyIDB4MDM5OSAweDAzMTQgKi8KKwkweDFmM2YsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMzlmIDB4MDMxNCAqLworCTB4MWY0YiwgMHgwMDAwLAorCS8qIDB4MDMwMSAweDAzOWYgMHgwMzE0ICovCisJMHgxZjRkLCAweDAwMDAsCisJLyogMHgwMzAwIDB4MDNhNSAweDAzMTQgKi8KKwkweDFmNWIsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwM2E1IDB4MDMxNCAqLworCTB4MWY1ZCwgMHgwMDAwLAorCS8qIDB4MDM0MiAweDAzYTUgMHgwMzE0ICovCisJMHgxZjVmLCAweDAwMDAsCisJLyogMHgwMzAwIDB4MDNhOSAweDAzMTQgKi8KKwkweDFmNmIsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwM2E5IDB4MDMxNCAqLworCTB4MWY2ZCwgMHgwMDAwLAorCS8qIDB4MDM0MiAweDAzYTkgMHgwMzE0ICovCisJMHgxZjZmLCAweDAwMDAsCisJLyogMHgwMzAwIDB4MDNiMSAweDAzMTQgKi8KKwkweDFmMDMsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwM2IxIDB4MDMxNCAqLworCTB4MWYwNSwgMHgwMDAwLAorCS8qIDB4MDM0MiAweDAzYjEgMHgwMzE0ICovCisJMHgxZjA3LCAweDAwMDAsCisJLyogMHgwMzAwIDB4MDNiNSAweDAzMTQgKi8KKwkweDFmMTMsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwM2I1IDB4MDMxNCAqLworCTB4MWYxNSwgMHgwMDAwLAorCS8qIDB4MDMwMCAweDAzYjcgMHgwMzE0ICovCisJMHgxZjIzLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDNiNyAweDAzMTQgKi8KKwkweDFmMjUsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwM2I3IDB4MDMxNCAqLworCTB4MWYyNywgMHgwMDAwLAorCS8qIDB4MDMwMCAweDAzYjkgMHgwMzE0ICovCisJMHgxZjMzLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDNiOSAweDAzMTQgKi8KKwkweDFmMzUsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwM2I5IDB4MDMxNCAqLworCTB4MWYzNywgMHgwMDAwLAorCS8qIDB4MDMwMCAweDAzYmYgMHgwMzE0ICovCisJMHgxZjQzLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDNiZiAweDAzMTQgKi8KKwkweDFmNDUsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwM2M1IDB4MDMxNCAqLworCTB4MWY1MywgMHgwMDAwLAorCS8qIDB4MDMwMSAweDAzYzUgMHgwMzE0ICovCisJMHgxZjU1LCAweDAwMDAsCisJLyogMHgwMzQyIDB4MDNjNSAweDAzMTQgKi8KKwkweDFmNTcsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwM2M5IDB4MDMxNCAqLworCTB4MWY2MywgMHgwMDAwLAorCS8qIDB4MDMwMSAweDAzYzkgMHgwMzE0ICovCisJMHgxZjY1LCAweDAwMDAsCisJLyogMHgwMzQyIDB4MDNjOSAweDAzMTQgKi8KKwkweDFmNjcsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMDRmIDB4MDMxYiAqLworCTB4MWVkYywgMHgwMDAwLAorCS8qIDB4MDMwMSAweDAwNGYgMHgwMzFiICovCisJMHgxZWRhLCAweDAwMDAsCisJLyogMHgwMzAzIDB4MDA0ZiAweDAzMWIgKi8KKwkweDFlZTAsIDB4MDAwMCwKKwkvKiAweDAzMDkgMHgwMDRmIDB4MDMxYiAqLworCTB4MWVkZSwgMHgwMDAwLAorCS8qIDB4MDMyMyAweDAwNGYgMHgwMzFiICovCisJMHgxZWUyLCAweDAwMDAsCisJLyogMHgwMzAwIDB4MDA1NSAweDAzMWIgKi8KKwkweDFlZWEsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMDU1IDB4MDMxYiAqLworCTB4MWVlOCwgMHgwMDAwLAorCS8qIDB4MDMwMyAweDAwNTUgMHgwMzFiICovCisJMHgxZWVlLCAweDAwMDAsCisJLyogMHgwMzA5IDB4MDA1NSAweDAzMWIgKi8KKwkweDFlZWMsIDB4MDAwMCwKKwkvKiAweDAzMjMgMHgwMDU1IDB4MDMxYiAqLworCTB4MWVmMCwgMHgwMDAwLAorCS8qIDB4MDMwMCAweDAwNmYgMHgwMzFiICovCisJMHgxZWRkLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDA2ZiAweDAzMWIgKi8KKwkweDFlZGIsIDB4MDAwMCwKKwkvKiAweDAzMDMgMHgwMDZmIDB4MDMxYiAqLworCTB4MWVlMSwgMHgwMDAwLAorCS8qIDB4MDMwOSAweDAwNmYgMHgwMzFiICovCisJMHgxZWRmLCAweDAwMDAsCisJLyogMHgwMzIzIDB4MDA2ZiAweDAzMWIgKi8KKwkweDFlZTMsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMDc1IDB4MDMxYiAqLworCTB4MWVlYiwgMHgwMDAwLAorCS8qIDB4MDMwMSAweDAwNzUgMHgwMzFiICovCisJMHgxZWU5LCAweDAwMDAsCisJLyogMHgwMzAzIDB4MDA3NSAweDAzMWIgKi8KKwkweDFlZWYsIDB4MDAwMCwKKwkvKiAweDAzMDkgMHgwMDc1IDB4MDMxYiAqLworCTB4MWVlZCwgMHgwMDAwLAorCS8qIDB4MDMyMyAweDAwNzUgMHgwMzFiICovCisJMHgxZWYxLCAweDAwMDAsCisJLyogMHgwMzAyIDB4MDA0MSAweDAzMjMgKi8KKwkweDFlYWMsIDB4MDAwMCwKKwkvKiAweDAzMDYgMHgwMDQxIDB4MDMyMyAqLworCTB4MWViNiwgMHgwMDAwLAorCS8qIDB4MDMwMiAweDAwNDUgMHgwMzIzICovCisJMHgxZWM2LCAweDAwMDAsCisJLyogMHgwMzA0IDB4MDA0YyAweDAzMjMgKi8KKwkweDFlMzgsIDB4MDAwMCwKKwkvKiAweDAzMDIgMHgwMDRmIDB4MDMyMyAqLworCTB4MWVkOCwgMHgwMDAwLAorCS8qIDB4MDMwNCAweDAwNTIgMHgwMzIzICovCisJMHgxZTVjLCAweDAwMDAsCisJLyogMHgwMzA3IDB4MDA1MyAweDAzMjMgKi8KKwkweDFlNjgsIDB4MDAwMCwKKwkvKiAweDAzMDIgMHgwMDYxIDB4MDMyMyAqLworCTB4MWVhZCwgMHgwMDAwLAorCS8qIDB4MDMwNiAweDAwNjEgMHgwMzIzICovCisJMHgxZWI3LCAweDAwMDAsCisJLyogMHgwMzAyIDB4MDA2NSAweDAzMjMgKi8KKwkweDFlYzcsIDB4MDAwMCwKKwkvKiAweDAzMDQgMHgwMDZjIDB4MDMyMyAqLworCTB4MWUzOSwgMHgwMDAwLAorCS8qIDB4MDMwMiAweDAwNmYgMHgwMzIzICovCisJMHgxZWQ5LCAweDAwMDAsCisJLyogMHgwMzA0IDB4MDA3MiAweDAzMjMgKi8KKwkweDFlNWQsIDB4MDAwMCwKKwkvKiAweDAzMDcgMHgwMDczIDB4MDMyMyAqLworCTB4MWU2OSwgMHgwMDAwLAorCS8qIDB4MDMwMSAweDAwNDMgMHgwMzI3ICovCisJMHgxZTA4LCAweDAwMDAsCisJLyogMHgwMzA2IDB4MDA0NSAweDAzMjcgKi8KKwkweDFlMWMsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMDYzIDB4MDMyNyAqLworCTB4MWUwOSwgMHgwMDAwLAorCS8qIDB4MDMwNiAweDAwNjUgMHgwMzI3ICovCisJMHgxZTFkLCAweDAwMDAsCisJLyogMHgwMzA0IDB4MDA0ZiAweDAzMjggKi8KKwkweDAxZWMsIDB4MDAwMCwKKwkvKiAweDAzMDQgMHgwMDZmIDB4MDMyOCAqLworCTB4MDFlZCwgMHgwMDAwLAorCS8qIDB4MDMxMyAweDAzOTEgMHgwMzQ1ICovCisJMHgxZjg4LCAweDAwMDMsICAweDAzMDAsIDB4MGY1ZSwgIDB4MDMwMSwgMHgwZjYwLCAgMHgwMzQyLCAweDBmNjIsCisJLyogMHgwMzE0IDB4MDM5MSAweDAzNDUgKi8KKwkweDFmODksIDB4MDAwMywgIDB4MDMwMCwgMHgwZjY0LCAgMHgwMzAxLCAweDBmNjYsICAweDAzNDIsIDB4MGY2OCwKKwkvKiAweDAzMTMgMHgwMzk3IDB4MDM0NSAqLworCTB4MWY5OCwgMHgwMDAzLCAgMHgwMzAwLCAweDBmNmEsICAweDAzMDEsIDB4MGY2YywgIDB4MDM0MiwgMHgwZjZlLAorCS8qIDB4MDMxNCAweDAzOTcgMHgwMzQ1ICovCisJMHgxZjk5LCAweDAwMDMsICAweDAzMDAsIDB4MGY3MCwgIDB4MDMwMSwgMHgwZjcyLCAgMHgwMzQyLCAweDBmNzQsCisJLyogMHgwMzEzIDB4MDNhOSAweDAzNDUgKi8KKwkweDFmYTgsIDB4MDAwMywgIDB4MDMwMCwgMHgwZjc2LCAgMHgwMzAxLCAweDBmNzgsICAweDAzNDIsIDB4MGY3YSwKKwkvKiAweDAzMTQgMHgwM2E5IDB4MDM0NSAqLworCTB4MWZhOSwgMHgwMDAzLCAgMHgwMzAwLCAweDBmN2MsICAweDAzMDEsIDB4MGY3ZSwgIDB4MDM0MiwgMHgwZjgwLAorCS8qIDB4MDMwMCAweDAzYjEgMHgwMzQ1ICovCisJMHgxZmIyLCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDNiMSAweDAzNDUgKi8KKwkweDFmYjQsIDB4MDAwMCwKKwkvKiAweDAzMTMgMHgwM2IxIDB4MDM0NSAqLworCTB4MWY4MCwgMHgwMDAzLCAgMHgwMzAwLCAweDBmODIsICAweDAzMDEsIDB4MGY4NCwgIDB4MDM0MiwgMHgwZjg2LAorCS8qIDB4MDMxNCAweDAzYjEgMHgwMzQ1ICovCisJMHgxZjgxLCAweDAwMDMsICAweDAzMDAsIDB4MGY4OCwgIDB4MDMwMSwgMHgwZjhhLCAgMHgwMzQyLCAweDBmOGMsCisJLyogMHgwMzQyIDB4MDNiMSAweDAzNDUgKi8KKwkweDFmYjcsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwM2I3IDB4MDM0NSAqLworCTB4MWZjMiwgMHgwMDAwLAorCS8qIDB4MDMwMSAweDAzYjcgMHgwMzQ1ICovCisJMHgxZmM0LCAweDAwMDAsCisJLyogMHgwMzEzIDB4MDNiNyAweDAzNDUgKi8KKwkweDFmOTAsIDB4MDAwMywgIDB4MDMwMCwgMHgwZjhlLCAgMHgwMzAxLCAweDBmOTAsICAweDAzNDIsIDB4MGY5MiwKKwkvKiAweDAzMTQgMHgwM2I3IDB4MDM0NSAqLworCTB4MWY5MSwgMHgwMDAzLCAgMHgwMzAwLCAweDBmOTQsICAweDAzMDEsIDB4MGY5NiwgIDB4MDM0MiwgMHgwZjk4LAorCS8qIDB4MDM0MiAweDAzYjcgMHgwMzQ1ICovCisJMHgxZmM3LCAweDAwMDAsCisJLyogMHgwMzAxIDB4MDNiZiAweDAzNDUgKi8KKwkweDFmZjQsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwM2M5IDB4MDM0NSAqLworCTB4MWZmMiwgMHgwMDAwLAorCS8qIDB4MDMxMyAweDAzYzkgMHgwMzQ1ICovCisJMHgxZmEwLCAweDAwMDMsICAweDAzMDAsIDB4MGY5YSwgIDB4MDMwMSwgMHgwZjljLCAgMHgwMzQyLCAweDBmOWUsCisJLyogMHgwMzE0IDB4MDNjOSAweDAzNDUgKi8KKwkweDFmYTEsIDB4MDAwMywgIDB4MDMwMCwgMHgwZmEwLCAgMHgwMzAxLCAweDBmYTIsICAweDAzNDIsIDB4MGZhNCwKKwkvKiAweDAzNDIgMHgwM2M5IDB4MDM0NSAqLworCTB4MWZmNywgMHgwMDAwLAorCS8qIDB4MDVjMSAweDA1ZTkgMHgwNWJjICovCisJMHhmYjJjLCAweDAwMDAsCisJLyogMHgwNWMyIDB4MDVlOSAweDA1YmMgKi8KKwkweGZiMmQsIDB4MDAwMCwKKwkvKiAweDBjZDUgMHgwY2M2IDB4MGNjMiAqLworCTB4MGNjYiwgMHgwMDAwLAorCS8qIDB4MGY3MSAweDBmYjIgMHgwZjgwICovCisJMHgwZjc3LCAweDAwMDAsCisJLyogMHgwZjcxIDB4MGZiMyAweDBmODAgKi8KKwkweDBmNzksIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMzEzIDB4MDM5MSAweDAzNDUgKi8KKwkweDFmOGEsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMzEzIDB4MDM5MSAweDAzNDUgKi8KKwkweDFmOGMsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwMzEzIDB4MDM5MSAweDAzNDUgKi8KKwkweDFmOGUsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMzE0IDB4MDM5MSAweDAzNDUgKi8KKwkweDFmOGIsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMzE0IDB4MDM5MSAweDAzNDUgKi8KKwkweDFmOGQsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwMzE0IDB4MDM5MSAweDAzNDUgKi8KKwkweDFmOGYsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMzEzIDB4MDM5NyAweDAzNDUgKi8KKwkweDFmOWEsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMzEzIDB4MDM5NyAweDAzNDUgKi8KKwkweDFmOWMsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwMzEzIDB4MDM5NyAweDAzNDUgKi8KKwkweDFmOWUsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMzE0IDB4MDM5NyAweDAzNDUgKi8KKwkweDFmOWIsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMzE0IDB4MDM5NyAweDAzNDUgKi8KKwkweDFmOWQsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwMzE0IDB4MDM5NyAweDAzNDUgKi8KKwkweDFmOWYsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMzEzIDB4MDNhOSAweDAzNDUgKi8KKwkweDFmYWEsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMzEzIDB4MDNhOSAweDAzNDUgKi8KKwkweDFmYWMsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwMzEzIDB4MDNhOSAweDAzNDUgKi8KKwkweDFmYWUsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMzE0IDB4MDNhOSAweDAzNDUgKi8KKwkweDFmYWIsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMzE0IDB4MDNhOSAweDAzNDUgKi8KKwkweDFmYWQsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwMzE0IDB4MDNhOSAweDAzNDUgKi8KKwkweDFmYWYsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMzEzIDB4MDNiMSAweDAzNDUgKi8KKwkweDFmODIsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMzEzIDB4MDNiMSAweDAzNDUgKi8KKwkweDFmODQsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwMzEzIDB4MDNiMSAweDAzNDUgKi8KKwkweDFmODYsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMzE0IDB4MDNiMSAweDAzNDUgKi8KKwkweDFmODMsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMzE0IDB4MDNiMSAweDAzNDUgKi8KKwkweDFmODUsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwMzE0IDB4MDNiMSAweDAzNDUgKi8KKwkweDFmODcsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMzEzIDB4MDNiNyAweDAzNDUgKi8KKwkweDFmOTIsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMzEzIDB4MDNiNyAweDAzNDUgKi8KKwkweDFmOTQsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwMzEzIDB4MDNiNyAweDAzNDUgKi8KKwkweDFmOTYsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMzE0IDB4MDNiNyAweDAzNDUgKi8KKwkweDFmOTMsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMzE0IDB4MDNiNyAweDAzNDUgKi8KKwkweDFmOTUsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwMzE0IDB4MDNiNyAweDAzNDUgKi8KKwkweDFmOTcsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMzEzIDB4MDNjOSAweDAzNDUgKi8KKwkweDFmYTIsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMzEzIDB4MDNjOSAweDAzNDUgKi8KKwkweDFmYTQsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwMzEzIDB4MDNjOSAweDAzNDUgKi8KKwkweDFmYTYsIDB4MDAwMCwKKwkvKiAweDAzMDAgMHgwMzE0IDB4MDNjOSAweDAzNDUgKi8KKwkweDFmYTMsIDB4MDAwMCwKKwkvKiAweDAzMDEgMHgwMzE0IDB4MDNjOSAweDAzNDUgKi8KKwkweDFmYTUsIDB4MDAwMCwKKwkvKiAweDAzNDIgMHgwMzE0IDB4MDNjOSAweDAzNDUgKi8KKwkweDFmYTcsIDB4MDAwMCwKK307CmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL3VuaWNvZGUuYyBiL2ZzL2hmc3BsdXMvdW5pY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MGM2OTAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9oZnNwbHVzL3VuaWNvZGUuYwpAQCAtMCwwICsxLDI3MSBAQAorLyoKKyAqICBsaW51eC9mcy9oZnNwbHVzL3VuaWNvZGUuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMQorICogQnJhZCBCb3llciAoZmxhckBhbGxhbmRyaWEuY29tKQorICogKEMpIDIwMDMgQXJkaXMgVGVjaG5vbG9naWVzIDxyb21hbkBhcmRpc3RlY2guY29tPgorICoKKyAqIEhhbmRsZXIgcm91dGluZXMgZm9yIHVuaWNvZGUgc3RyaW5ncworICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgImhmc3BsdXNfZnMuaCIKKyNpbmNsdWRlICJoZnNwbHVzX3Jhdy5oIgorCisvKiBGb2xkIHRoZSBjYXNlIG9mIGEgdW5pY29kZSBjaGFyLCBnaXZlbiB0aGUgMTYgYml0IHZhbHVlICovCisvKiBSZXR1cm5zIGZvbGRlZCBjaGFyLCBvciAwIGlmIGlnbm9yYWJsZSAqLworc3RhdGljIGlubGluZSB1MTYgY2FzZV9mb2xkKHUxNiBjKQoreworICAgICAgICB1MTYgdG1wOworCisgICAgICAgIHRtcCA9IGhmc3BsdXNfY2FzZV9mb2xkX3RhYmxlW2MgPj4gOF07CisgICAgICAgIGlmICh0bXApCisgICAgICAgICAgICAgICAgdG1wID0gaGZzcGx1c19jYXNlX2ZvbGRfdGFibGVbdG1wICsgKGMgJiAweGZmKV07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0bXAgPSBjOworICAgICAgICByZXR1cm4gdG1wOworfQorCisvKiBDb21wYXJlIHVuaWNvZGUgc3RyaW5ncywgcmV0dXJuIHZhbHVlcyBsaWtlIG5vcm1hbCBzdHJjbXAgKi8KK2ludCBoZnNwbHVzX3VuaXN0cmNtcChjb25zdCBzdHJ1Y3QgaGZzcGx1c191bmlzdHIgKnMxLCBjb25zdCBzdHJ1Y3QgaGZzcGx1c191bmlzdHIgKnMyKQoreworCXUxNiBsZW4xLCBsZW4yLCBjMSwgYzI7CisJY29uc3QgaGZzcGx1c191bmljaHIgKnAxLCAqcDI7CisKKwlsZW4xID0gYmUxNl90b19jcHUoczEtPmxlbmd0aCk7CisJbGVuMiA9IGJlMTZfdG9fY3B1KHMyLT5sZW5ndGgpOworCXAxID0gczEtPnVuaWNvZGU7CisJcDIgPSBzMi0+dW5pY29kZTsKKworCXdoaWxlICgxKSB7CisJCWMxID0gYzIgPSAwOworCisJCXdoaWxlIChsZW4xICYmICFjMSkgeworCQkJYzEgPSBjYXNlX2ZvbGQoYmUxNl90b19jcHUoKnAxKSk7CisJCQlwMSsrOworCQkJbGVuMS0tOworCQl9CisJCXdoaWxlIChsZW4yICYmICFjMikgeworCQkJYzIgPSBjYXNlX2ZvbGQoYmUxNl90b19jcHUoKnAyKSk7CisJCQlwMisrOworCQkJbGVuMi0tOworCQl9CisKKwkJaWYgKGMxICE9IGMyKQorCQkJcmV0dXJuIChjMSA8IGMyKSA/IC0xIDogMTsKKwkJaWYgKCFjMSAmJiAhYzIpCisJCQlyZXR1cm4gMDsKKwl9Cit9CisKKyNkZWZpbmUgSGFuZ3VsX1NCYXNlCTB4YWMwMAorI2RlZmluZSBIYW5ndWxfTEJhc2UJMHgxMTAwCisjZGVmaW5lIEhhbmd1bF9WQmFzZQkweDExNjEKKyNkZWZpbmUgSGFuZ3VsX1RCYXNlCTB4MTFhNworI2RlZmluZSBIYW5ndWxfU0NvdW50CTExMTcyCisjZGVmaW5lIEhhbmd1bF9MQ291bnQJMTkKKyNkZWZpbmUgSGFuZ3VsX1ZDb3VudAkyMQorI2RlZmluZSBIYW5ndWxfVENvdW50CTI4CisjZGVmaW5lIEhhbmd1bF9OQ291bnQJKEhhbmd1bF9WQ291bnQgKiBIYW5ndWxfVENvdW50KQorCisKK3N0YXRpYyB1MTYgKmhmc3BsdXNfY29tcG9zZV9sb29rdXAodTE2ICpwLCB1MTYgY2MpCit7CisJaW50IGksIHMsIGU7CisKKwlzID0gMTsKKwllID0gcFsxXTsKKwlpZiAoIWUgfHwgY2MgPCBwW3MgKiAyXSB8fCBjYyA+IHBbZSAqIDJdKQorCQlyZXR1cm4gTlVMTDsKKwlkbyB7CisJCWkgPSAocyArIGUpIC8gMjsKKwkJaWYgKGNjID4gcFtpICogMl0pCisJCQlzID0gaSArIDE7CisJCWVsc2UgaWYgKGNjIDwgcFtpICogMl0pCisJCQllID0gaSAtIDE7CisJCWVsc2UKKwkJCXJldHVybiBoZnNwbHVzX2NvbXBvc2VfdGFibGUgKyBwW2kgKiAyICsgMV07CisJfSB3aGlsZSAocyA8PSBlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworaW50IGhmc3BsdXNfdW5pMmFzYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBzdHJ1Y3QgaGZzcGx1c191bmlzdHIgKnVzdHIsIGNoYXIgKmFzdHIsIGludCAqbGVuX3ApCit7CisJY29uc3QgaGZzcGx1c191bmljaHIgKmlwOworCXN0cnVjdCBubHNfdGFibGUgKm5scyA9IEhGU1BMVVNfU0Ioc2IpLm5sczsKKwl1OCAqb3A7CisJdTE2IGNjLCBjMCwgYzE7CisJdTE2ICpjZTEsICpjZTI7CisJaW50IGksIGxlbiwgdXN0cmxlbiwgcmVzLCBjb21wb3NlOworCisJb3AgPSBhc3RyOworCWlwID0gdXN0ci0+dW5pY29kZTsKKwl1c3RybGVuID0gYmUxNl90b19jcHUodXN0ci0+bGVuZ3RoKTsKKwlsZW4gPSAqbGVuX3A7CisJY2UxID0gTlVMTDsKKwljb21wb3NlID0gIShIRlNQTFVTX1NCKHNiKS5mbGFncyAmIEhGU1BMVVNfU0JfTk9ERUNPTVBPU0UpOworCisJd2hpbGUgKHVzdHJsZW4gPiAwKSB7CisJCWMwID0gYmUxNl90b19jcHUoKmlwKyspOworCQl1c3RybGVuLS07CisJCS8qIHNlYXJjaCBmb3Igc2luZ2xlIGRlY29tcG9zZWQgY2hhciAqLworCQlpZiAobGlrZWx5KGNvbXBvc2UpKQorCQkJY2UxID0gaGZzcGx1c19jb21wb3NlX2xvb2t1cChoZnNwbHVzX2NvbXBvc2VfdGFibGUsIGMwKTsKKwkJaWYgKGNlMSAmJiAoY2MgPSBjZTFbMF0pKSB7CisJCQkvKiBzdGFydCBvZiBhIHBvc3NpYmx5IGRlY29tcG9zZWQgSGFuZ3VsIGNoYXIgKi8KKwkJCWlmIChjYyAhPSAweGZmZmYpCisJCQkJZ290byBkb25lOworCQkJaWYgKCF1c3RybGVuKQorCQkJCWdvdG8gc2FtZTsKKwkJCWMxID0gYmUxNl90b19jcHUoKmlwKSAtIEhhbmd1bF9WQmFzZTsKKwkJCWlmIChjMSA8IEhhbmd1bF9WQ291bnQpIHsKKwkJCQkvKiBjb21wb3NlIHRoZSBIYW5ndWwgY2hhciAqLworCQkJCWNjID0gKGMwIC0gSGFuZ3VsX0xCYXNlKSAqIEhhbmd1bF9WQ291bnQ7CisJCQkJY2MgPSAoY2MgKyBjMSkgKiBIYW5ndWxfVENvdW50OworCQkJCWNjICs9IEhhbmd1bF9TQmFzZTsKKwkJCQlpcCsrOworCQkJCXVzdHJsZW4tLTsKKwkJCQlpZiAoIXVzdHJsZW4pCisJCQkJCWdvdG8gZG9uZTsKKwkJCQljMSA9IGJlMTZfdG9fY3B1KCppcCkgLSBIYW5ndWxfVEJhc2U7CisJCQkJaWYgKGMxID4gMCAmJiBjMSA8IEhhbmd1bF9UQ291bnQpIHsKKwkJCQkJY2MgKz0gYzE7CisJCQkJCWlwKys7CisJCQkJCXVzdHJsZW4tLTsKKwkJCQl9CisJCQkJZ290byBkb25lOworCQkJfQorCQl9CisJCXdoaWxlICgxKSB7CisJCQkvKiBtYWluIGxvb3AgZm9yIGNvbW1vbiBjYXNlIG9mIG5vdCBjb21wb3NlZCBjaGFycyAqLworCQkJaWYgKCF1c3RybGVuKQorCQkJCWdvdG8gc2FtZTsKKwkJCWMxID0gYmUxNl90b19jcHUoKmlwKTsKKwkJCWlmIChsaWtlbHkoY29tcG9zZSkpCisJCQkJY2UxID0gaGZzcGx1c19jb21wb3NlX2xvb2t1cChoZnNwbHVzX2NvbXBvc2VfdGFibGUsIGMxKTsKKwkJCWlmIChjZTEpCisJCQkJYnJlYWs7CisJCQlzd2l0Y2ggKGMwKSB7CisJCQljYXNlIDA6CisJCQkJYzAgPSAweDI0MDA7CisJCQkJYnJlYWs7CisJCQljYXNlICcvJzoKKwkJCQljMCA9ICc6JzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXJlcyA9IG5scy0+dW5pMmNoYXIoYzAsIG9wLCBsZW4pOworCQkJaWYgKHJlcyA8IDApIHsKKwkJCQlpZiAocmVzID09IC1FTkFNRVRPT0xPTkcpCisJCQkJCWdvdG8gb3V0OworCQkJCSpvcCA9ICc/JzsKKwkJCQlyZXMgPSAxOworCQkJfQorCQkJb3AgKz0gcmVzOworCQkJbGVuIC09IHJlczsKKwkJCWMwID0gYzE7CisJCQlpcCsrOworCQkJdXN0cmxlbi0tOworCQl9CisJCWNlMiA9IGhmc3BsdXNfY29tcG9zZV9sb29rdXAoY2UxLCBjMCk7CisJCWlmIChjZTIpIHsKKwkJCWkgPSAxOworCQkJd2hpbGUgKGkgPCB1c3RybGVuKSB7CisJCQkJY2UxID0gaGZzcGx1c19jb21wb3NlX2xvb2t1cChjZTIsIGJlMTZfdG9fY3B1KGlwW2ldKSk7CisJCQkJaWYgKCFjZTEpCisJCQkJCWJyZWFrOworCQkJCWkrKzsKKwkJCQljZTIgPSBjZTE7CisJCQl9CisJCQlpZiAoKGNjID0gY2UyWzBdKSkgeworCQkJCWlwICs9IGk7CisJCQkJdXN0cmxlbiAtPSBpOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJfQorCXNhbWU6CisJCXN3aXRjaCAoYzApIHsKKwkJY2FzZSAwOgorCQkJY2MgPSAweDI0MDA7CisJCQlicmVhazsKKwkJY2FzZSAnLyc6CisJCQljYyA9ICc6JzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJY2MgPSBjMDsKKwkJfQorCWRvbmU6CisJCXJlcyA9IG5scy0+dW5pMmNoYXIoY2MsIG9wLCBsZW4pOworCQlpZiAocmVzIDwgMCkgeworCQkJaWYgKHJlcyA9PSAtRU5BTUVUT09MT05HKQorCQkJCWdvdG8gb3V0OworCQkJKm9wID0gJz8nOworCQkJcmVzID0gMTsKKwkJfQorCQlvcCArPSByZXM7CisJCWxlbiAtPSByZXM7CisJfQorCXJlcyA9IDA7CitvdXQ6CisJKmxlbl9wID0gKGNoYXIgKilvcCAtIGFzdHI7CisJcmV0dXJuIHJlczsKK30KKworaW50IGhmc3BsdXNfYXNjMnVuaShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgaGZzcGx1c191bmlzdHIgKnVzdHIsIGNvbnN0IGNoYXIgKmFzdHIsIGludCBsZW4pCit7CisJc3RydWN0IG5sc190YWJsZSAqbmxzID0gSEZTUExVU19TQihzYikubmxzOworCWludCBzaXplLCBvZmYsIGRlY29tcG9zZTsKKwl3Y2hhcl90IGM7CisJdTE2IG91dGxlbiA9IDA7CisKKwlkZWNvbXBvc2UgPSAhKEhGU1BMVVNfU0Ioc2IpLmZsYWdzICYgSEZTUExVU19TQl9OT0RFQ09NUE9TRSk7CisKKwl3aGlsZSAob3V0bGVuIDwgSEZTUExVU19NQVhfU1RSTEVOICYmIGxlbiA+IDApIHsKKwkJc2l6ZSA9IG5scy0+Y2hhcjJ1bmkoYXN0ciwgbGVuLCAmYyk7CisJCWlmIChzaXplIDw9IDApIHsKKwkJCWMgPSAnPyc7CisJCQlzaXplID0gMTsKKwkJfQorCQlhc3RyICs9IHNpemU7CisJCWxlbiAtPSBzaXplOworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAweDI0MDA6CisJCQljID0gMDsKKwkJCWJyZWFrOworCQljYXNlICc6JzoKKwkJCWMgPSAnLyc7CisJCQlicmVhazsKKwkJfQorCQlpZiAoYyA+PSAweGMwICYmIGRlY29tcG9zZSkgeworCQkJb2ZmID0gaGZzcGx1c19kZWNvbXBvc2VfdGFibGVbKGMgPj4gMTIpICYgMHhmXTsKKwkJCWlmICghb2ZmKQorCQkJCWdvdG8gZG9uZTsKKwkJCWlmIChvZmYgPT0gMHhmZmZmKSB7CisJCQkJZ290byBkb25lOworCQkJfQorCQkJb2ZmID0gaGZzcGx1c19kZWNvbXBvc2VfdGFibGVbb2ZmICsgKChjID4+IDgpICYgMHhmKV07CisJCQlpZiAoIW9mZikKKwkJCQlnb3RvIGRvbmU7CisJCQlvZmYgPSBoZnNwbHVzX2RlY29tcG9zZV90YWJsZVtvZmYgKyAoKGMgPj4gNCkgJiAweGYpXTsKKwkJCWlmICghb2ZmKQorCQkJCWdvdG8gZG9uZTsKKwkJCW9mZiA9IGhmc3BsdXNfZGVjb21wb3NlX3RhYmxlW29mZiArIChjICYgMHhmKV07CisJCQlzaXplID0gb2ZmICYgMzsKKwkJCWlmICghc2l6ZSkKKwkJCQlnb3RvIGRvbmU7CisJCQlvZmYgLz0gNDsKKwkJCWlmIChvdXRsZW4gKyBzaXplID4gSEZTUExVU19NQVhfU1RSTEVOKQorCQkJCWJyZWFrOworCQkJZG8geworCQkJCXVzdHItPnVuaWNvZGVbb3V0bGVuKytdID0gY3B1X3RvX2JlMTYoaGZzcGx1c19kZWNvbXBvc2VfdGFibGVbb2ZmKytdKTsKKwkJCX0gd2hpbGUgKC0tc2l6ZSA+IDApOworCQkJY29udGludWU7CisJCX0KKwlkb25lOgorCQl1c3RyLT51bmljb2RlW291dGxlbisrXSA9IGNwdV90b19iZTE2KGMpOworCX0KKwl1c3RyLT5sZW5ndGggPSBjcHVfdG9fYmUxNihvdXRsZW4pOworCWlmIChsZW4gPiAwKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL2hmc3BsdXMvd3JhcHBlci5jIGIvZnMvaGZzcGx1cy93cmFwcGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM1MWQ2MwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hmc3BsdXMvd3JhcHBlci5jCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogIGxpbnV4L2ZzL2hmc3BsdXMvd3JhcHBlci5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxCisgKiBCcmFkIEJveWVyIChmbGFyQGFsbGFuZHJpYS5jb20pCisgKiAoQykgMjAwMyBBcmRpcyBUZWNobm9sb2dpZXMgPHJvbWFuQGFyZGlzdGVjaC5jb20+CisgKgorICogSGFuZGxpbmcgb2YgSEZTIHdyYXBwZXJzIGFyb3VuZCBIRlMrIHZvbHVtZXMKKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9jZHJvbS5oPgorI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKworI2luY2x1ZGUgImhmc3BsdXNfZnMuaCIKKyNpbmNsdWRlICJoZnNwbHVzX3Jhdy5oIgorCitzdHJ1Y3QgaGZzcGx1c193ZCB7CisJdTMyIGFibGtfc2l6ZTsKKwl1MTYgYWJsa19zdGFydDsKKwl1MTYgZW1iZWRfc3RhcnQ7CisJdTE2IGVtYmVkX2NvdW50OworfTsKKworc3RhdGljIGludCBoZnNwbHVzX3JlYWRfbWRiKHZvaWQgKmJ1ZnB0ciwgc3RydWN0IGhmc3BsdXNfd2QgKndkKQoreworCXUzMiBleHRlbnQ7CisJdTE2IGF0dHJpYjsKKworCWlmIChiZTE2X3RvX2NwdSgqKF9fYmUxNiAqKShidWZwdHIgKyBIRlNQX1dSQVBPRkZfRU1CRURTSUcpKSAhPSBIRlNQTFVTX1ZPTEhFQURfU0lHKQorCQlyZXR1cm4gMDsKKworCWF0dHJpYiA9IGJlMTZfdG9fY3B1KCooX19iZTE2ICopKGJ1ZnB0ciArIEhGU1BfV1JBUE9GRl9BVFRSSUIpKTsKKwlpZiAoIShhdHRyaWIgJiBIRlNQX1dSQVBfQVRUUklCX1NMT0NLKSB8fAorCSAgICEoYXR0cmliICYgSEZTUF9XUkFQX0FUVFJJQl9TUEFSRUQpKQorCQlyZXR1cm4gMDsKKworCXdkLT5hYmxrX3NpemUgPSBiZTMyX3RvX2NwdSgqKF9fYmUzMiAqKShidWZwdHIgKyBIRlNQX1dSQVBPRkZfQUJMS1NJWkUpKTsKKwlpZiAod2QtPmFibGtfc2l6ZSA8IEhGU1BMVVNfU0VDVE9SX1NJWkUpCisJCXJldHVybiAwOworCWlmICh3ZC0+YWJsa19zaXplICUgSEZTUExVU19TRUNUT1JfU0laRSkKKwkJcmV0dXJuIDA7CisJd2QtPmFibGtfc3RhcnQgPSBiZTE2X3RvX2NwdSgqKF9fYmUxNiAqKShidWZwdHIgKyBIRlNQX1dSQVBPRkZfQUJMS1NUQVJUKSk7CisKKwlleHRlbnQgPSBiZTMyX3RvX2NwdShnZXRfdW5hbGlnbmVkKChfX2JlMzIgKikoYnVmcHRyICsgSEZTUF9XUkFQT0ZGX0VNQkVERVhUKSkpOworCXdkLT5lbWJlZF9zdGFydCA9IChleHRlbnQgPj4gMTYpICYgMHhGRkZGOworCXdkLT5lbWJlZF9jb3VudCA9IGV4dGVudCAmIDB4RkZGRjsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGhmc3BsdXNfZ2V0X2xhc3Rfc2Vzc2lvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkJCSAgICBzZWN0b3JfdCAqc3RhcnQsIHNlY3Rvcl90ICpzaXplKQoreworCXN0cnVjdCBjZHJvbV9tdWx0aXNlc3Npb24gbXNfaW5mbzsKKwlzdHJ1Y3QgY2Ryb21fdG9jZW50cnkgdGU7CisJaW50IHJlczsKKworCS8qIGRlZmF1bHQgdmFsdWVzICovCisJKnN0YXJ0ID0gMDsKKwkqc2l6ZSA9IHNiLT5zX2JkZXYtPmJkX2lub2RlLT5pX3NpemUgPj4gOTsKKworCWlmIChIRlNQTFVTX1NCKHNiKS5zZXNzaW9uID49IDApIHsKKwkJdGUuY2R0ZV90cmFjayA9IEhGU1BMVVNfU0Ioc2IpLnNlc3Npb247CisJCXRlLmNkdGVfZm9ybWF0ID0gQ0RST01fTEJBOworCQlyZXMgPSBpb2N0bF9ieV9iZGV2KHNiLT5zX2JkZXYsIENEUk9NUkVBRFRPQ0VOVFJZLCAodW5zaWduZWQgbG9uZykmdGUpOworCQlpZiAoIXJlcyAmJiAodGUuY2R0ZV9jdHJsICYgQ0RST01fREFUQV9UUkFDSykgPT0gNCkgeworCQkJKnN0YXJ0ID0gKHNlY3Rvcl90KXRlLmNkdGVfYWRkci5sYmEgPDwgMjsKKwkJCXJldHVybiAwOworCQl9CisJCXByaW50ayhLRVJOX0VSUiAiSEZTOiBJbnZhbGlkIHNlc3Npb24gbnVtYmVyIG9yIHR5cGUgb2YgdHJhY2tcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbXNfaW5mby5hZGRyX2Zvcm1hdCA9IENEUk9NX0xCQTsKKwlyZXMgPSBpb2N0bF9ieV9iZGV2KHNiLT5zX2JkZXYsIENEUk9NTVVMVElTRVNTSU9OLCAodW5zaWduZWQgbG9uZykmbXNfaW5mbyk7CisJaWYgKCFyZXMgJiYgbXNfaW5mby54YV9mbGFnKQorCQkqc3RhcnQgPSAoc2VjdG9yX3QpbXNfaW5mby5hZGRyLmxiYSA8PCAyOworCXJldHVybiAwOworfQorCisvKiBGaW5kIHRoZSB2b2x1bWUgaGVhZGVyIGFuZCBmaWxsIGluIHNvbWUgbWluaW11bSBiaXRzIGluIHN1cGVyYmxvY2sgKi8KKy8qIFRha2VzIGluIHN1cGVyIGJsb2NrLCByZXR1cm5zIHRydWUgaWYgZ29vZCBkYXRhIHJlYWQgKi8KK2ludCBoZnNwbHVzX3JlYWRfd3JhcHBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGhmc3BsdXNfdmggKnZoZHI7CisJc3RydWN0IGhmc3BsdXNfd2Qgd2Q7CisJc2VjdG9yX3QgcGFydF9zdGFydCwgcGFydF9zaXplOworCXUzMiBibG9ja3NpemU7CisKKwlibG9ja3NpemUgPSBzYl9taW5fYmxvY2tzaXplKHNiLCBIRlNQTFVTX1NFQ1RPUl9TSVpFKTsKKwlpZiAoIWJsb2Nrc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoaGZzcGx1c19nZXRfbGFzdF9zZXNzaW9uKHNiLCAmcGFydF9zdGFydCwgJnBhcnRfc2l6ZSkpCisJCXJldHVybiAtRUlOVkFMOworCXdoaWxlICgxKSB7CisJCWJoID0gc2JfYnJlYWQ1MTIoc2IsIHBhcnRfc3RhcnQgKyBIRlNQTFVTX1ZPTEhFQURfU0VDVE9SLCB2aGRyKTsKKwkJaWYgKCFiaCkKKwkJCXJldHVybiAtRUlPOworCisJCWlmICh2aGRyLT5zaWduYXR1cmUgPT0gY3B1X3RvX2JlMTYoSEZTUF9XUkFQX01BR0lDKSkgeworCQkJaWYgKCFoZnNwbHVzX3JlYWRfbWRiKHZoZHIsICZ3ZCkpCisJCQkJZ290byBlcnJvcjsKKwkJCXdkLmFibGtfc2l6ZSA+Pj0gSEZTUExVU19TRUNUT1JfU0hJRlQ7CisJCQlwYXJ0X3N0YXJ0ICs9IHdkLmFibGtfc3RhcnQgKyB3ZC5lbWJlZF9zdGFydCAqIHdkLmFibGtfc2l6ZTsKKwkJCXBhcnRfc2l6ZSA9IHdkLmVtYmVkX2NvdW50ICogd2QuYWJsa19zaXplOworCQkJYnJlbHNlKGJoKTsKKwkJCWJoID0gc2JfYnJlYWQ1MTIoc2IsIHBhcnRfc3RhcnQgKyBIRlNQTFVTX1ZPTEhFQURfU0VDVE9SLCB2aGRyKTsKKwkJCWlmICghYmgpCisJCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJaWYgKHZoZHItPnNpZ25hdHVyZSA9PSBjcHVfdG9fYmUxNihIRlNQTFVTX1ZPTEhFQURfU0lHKSkKKwkJCWJyZWFrOworCQlicmVsc2UoYmgpOworCisJCS8qIGNoZWNrIGZvciBhIHBhcnRpdGlvbiBibG9jaworCQkgKiAoc2hvdWxkIGRvIHRoaXMgb25seSBmb3IgY2Ryb20vbG9vcCB0aG91Z2gpCisJCSAqLworCQlpZiAoaGZzX3BhcnRfZmluZChzYiwgJnBhcnRfc3RhcnQsICZwYXJ0X3NpemUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYmxvY2tzaXplID0gYmUzMl90b19jcHUodmhkci0+YmxvY2tzaXplKTsKKwlicmVsc2UoYmgpOworCisJLyogYmxvY2sgc2l6ZSBtdXN0IGJlIGF0IGxlYXN0IGFzIGxhcmdlIGFzIGEgc2VjdG9yCisJICogYW5kIGEgbXVsdGlwbGUgb2YgMgorCSAqLworCWlmIChibG9ja3NpemUgPCBIRlNQTFVTX1NFQ1RPUl9TSVpFIHx8CisJICAgICgoYmxvY2tzaXplIC0gMSkgJiBibG9ja3NpemUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlIRlNQTFVTX1NCKHNiKS5hbGxvY19ibGtzeiA9IGJsb2Nrc2l6ZTsKKwlIRlNQTFVTX1NCKHNiKS5hbGxvY19ibGtzel9zaGlmdCA9IDA7CisJd2hpbGUgKChibG9ja3NpemUgPj49IDEpICE9IDApCisJCUhGU1BMVVNfU0Ioc2IpLmFsbG9jX2Jsa3N6X3NoaWZ0Kys7CisJYmxvY2tzaXplID0gbWluKEhGU1BMVVNfU0Ioc2IpLmFsbG9jX2Jsa3N6LCAodTMyKVBBR0VfU0laRSk7CisKKwkvKiBhbGlnbiBibG9jayBzaXplIHRvIGJsb2NrIG9mZnNldCAqLworCXdoaWxlIChwYXJ0X3N0YXJ0ICYgKChibG9ja3NpemUgPj4gSEZTUExVU19TRUNUT1JfU0hJRlQpIC0gMSkpCisJCWJsb2Nrc2l6ZSA+Pj0gMTsKKworCWlmIChzYl9zZXRfYmxvY2tzaXplKHNiLCBibG9ja3NpemUpICE9IGJsb2Nrc2l6ZSkgeworCQlwcmludGsoIkhGUys6IHVuYWJsZSB0byBibG9ja3NpemUgdG8gJXUhXG4iLCBibG9ja3NpemUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlIRlNQTFVTX1NCKHNiKS5ibG9ja29mZnNldCA9IHBhcnRfc3RhcnQgPj4KKwkJCShzYi0+c19ibG9ja3NpemVfYml0cyAtIEhGU1BMVVNfU0VDVE9SX1NISUZUKTsKKwlIRlNQTFVTX1NCKHNiKS5zZWN0X2NvdW50ID0gcGFydF9zaXplOworCUhGU1BMVVNfU0Ioc2IpLmZzX3NoaWZ0ID0gSEZTUExVU19TQihzYikuYWxsb2NfYmxrc3pfc2hpZnQgLQorCQkJc2ItPnNfYmxvY2tzaXplX2JpdHM7CisKKwliaCA9IHNiX2JyZWFkNTEyKHNiLCBwYXJ0X3N0YXJ0ICsgSEZTUExVU19WT0xIRUFEX1NFQ1RPUiwgdmhkcik7CisJaWYgKCFiaCkKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBzaG91bGQgc3RpbGwgYmUgdGhlIHNhbWUuLi4gKi8KKwlpZiAoYmUxNl90b19jcHUodmhkci0+c2lnbmF0dXJlKSAhPSBIRlNQTFVTX1ZPTEhFQURfU0lHKQorCQlnb3RvIGVycm9yOworCUhGU1BMVVNfU0Ioc2IpLnNfdmhiaCA9IGJoOworCUhGU1BMVVNfU0Ioc2IpLnNfdmhkciA9IHZoZHI7CisKKwlyZXR1cm4gMDsKKyBlcnJvcjoKKwlicmVsc2UoYmgpOworCXJldHVybiAtRUlOVkFMOworfQpkaWZmIC0tZ2l0IGEvZnMvaG9zdGZzL01ha2VmaWxlIGIvZnMvaG9zdGZzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YmVhZmYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ob3N0ZnMvTWFrZWZpbGUKQEAgLTAsMCArMSwxMSBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMDAgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQorIyBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisjCisKK2hvc3Rmcy1vYmpzIDo9IGhvc3Rmc19rZXJuLm8gaG9zdGZzX3VzZXIubworCitvYmoteSA6PQorb2JqLSQoQ09ORklHX0hPU1RGUykgKz0gaG9zdGZzLm8KKworaW5jbHVkZSBhcmNoL3VtL3NjcmlwdHMvTWFrZWZpbGUucnVsZXMKZGlmZiAtLWdpdCBhL2ZzL2hvc3Rmcy9ob3N0ZnMuaCBiL2ZzL2hvc3Rmcy9ob3N0ZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTUxNmQwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaG9zdGZzL2hvc3Rmcy5oCkBAIC0wLDAgKzEsMTAwIEBACisjaWZuZGVmIF9fVU1fRlNfSE9TVEZTCisjZGVmaW5lIF9fVU1fRlNfSE9TVEZTCisKKyNpbmNsdWRlICJvcy5oIgorCisvKiBUaGVzZSBhcmUgZXhhY3RseSB0aGUgc2FtZSBkZWZpbml0aW9ucyBhcyBpbiBmcy5oLCBidXQgdGhlIG5hbWVzIGFyZQorICogY2hhbmdlZCBzbyB0aGF0IHRoaXMgZmlsZSBjYW4gYmUgaW5jbHVkZWQgaW4gYm90aCBrZXJuZWwgYW5kIHVzZXIgZmlsZXMuCisgKi8KKworI2RlZmluZSBIT1NURlNfQVRUUl9NT0RFCTEKKyNkZWZpbmUgSE9TVEZTX0FUVFJfVUlEIAkyCisjZGVmaW5lIEhPU1RGU19BVFRSX0dJRCAJNAorI2RlZmluZSBIT1NURlNfQVRUUl9TSVpFCTgKKyNkZWZpbmUgSE9TVEZTX0FUVFJfQVRJTUUJMTYKKyNkZWZpbmUgSE9TVEZTX0FUVFJfTVRJTUUJMzIKKyNkZWZpbmUgSE9TVEZTX0FUVFJfQ1RJTUUJNjQKKyNkZWZpbmUgSE9TVEZTX0FUVFJfQVRJTUVfU0VUCTEyOAorI2RlZmluZSBIT1NURlNfQVRUUl9NVElNRV9TRVQJMjU2CisKKy8qIFRoZXNlIHR3byBhcmUgdW51c2VkIGJ5IGhvc3Rmcy4gKi8KKyNkZWZpbmUgSE9TVEZTX0FUVFJfRk9SQ0UJNTEyCS8qIE5vdCBhIGNoYW5nZSwgYnV0IGEgY2hhbmdlIGl0ICovCisjZGVmaW5lIEhPU1RGU19BVFRSX0FUVFJfRkxBRwkxMDI0CisKKy8qIElmIHlvdSBhcmUgdmVyeSBjYXJlZnVsLCB5b3UnbGwgbm90aWNlIHRoYXQgdGhlc2UgdHdvIGFyZSBtaXNzaW5nOgorICoKKyAqICNkZWZpbmUgQVRUUl9LSUxMX1NVSUQJMjA0OAorICogI2RlZmluZSBBVFRSX0tJTExfU0dJRAk0MDk2CisgKgorICogYW5kIHRoaXMgaXMgYmVjYXVzZSB0aGV5IHdlcmUgYWRkZWQgaW4gMi41IGRldmVsb3BtZW50IGluIHRoaXMgcGF0Y2g6CisgKgorICogaHR0cDovL2xpbnV4LmJrYml0cy5uZXQ6ODA4MC9saW51eC0yLjUvCisgKiBjc2V0QDNjYWY0YTEyazRYZ0R6Szd3eUstVEdwU1o5dTJXdz9uYXY9aW5kZXguaHRtbAorICogfHNyYy8ufHNyYy9pbmNsdWRlfHNyYy9pbmNsdWRlL2xpbnV4fHJlbGF0ZWQvaW5jbHVkZS9saW51eC9mcy5oCisgKgorICogQWN0dWFsbHksIHRoZXkgYXJlIG5vdCBuZWVkZWQgYnkgbW9zdCAtPnNldGF0dHIoKSBtZXRob2RzIC0gdGhleSBhcmUgc2V0IGJ5CisgKiBjYWxsZXJzIG9mIG5vdGlmeV9jaGFuZ2UoKSB0byBub3RpZnkgdGhhdCB0aGUgc2V0dWlkL3NldGdpZCBiaXRzIG11c3QgYmUKKyAqIGRyb3BwZWQuCisgKiBub3RpZnlfY2hhbmdlKCkgd2lsbCBkZWxldGUgdGhvc2UgZmxhZ3MsIG1ha2Ugc3VyZSBhdHRyLT5pYV92YWxpZCAmIEFUVFJfTU9ERQorICogaXMgb24sIGFuZCByZW1vdmUgdGhlIGFwcHJvcHJpYXRlIGJpdHMgZnJvbSBhdHRyLT5pYV9tb2RlIChhdHRyIGlzIGEKKyAqICJzdHJ1Y3QgaWF0dHIgKiIpLiAtQmxhaXNvckJsYWRlCisgKi8KKworc3RydWN0IGhvc3Rmc19pYXR0ciB7CisJdW5zaWduZWQgaW50CWlhX3ZhbGlkOworCW1vZGVfdAkJaWFfbW9kZTsKKwl1aWRfdAkJaWFfdWlkOworCWdpZF90CQlpYV9naWQ7CisJbG9mZl90CQlpYV9zaXplOworCXN0cnVjdCB0aW1lc3BlYwlpYV9hdGltZTsKKwlzdHJ1Y3QgdGltZXNwZWMJaWFfbXRpbWU7CisJc3RydWN0IHRpbWVzcGVjCWlhX2N0aW1lOworCXVuc2lnbmVkIGludAlpYV9hdHRyX2ZsYWdzOworfTsKKworZXh0ZXJuIGludCBzdGF0X2ZpbGUoY29uc3QgY2hhciAqcGF0aCwgdW5zaWduZWQgbG9uZyBsb25nICppbm9kZV9vdXQsCisJCSAgICAgaW50ICptb2RlX291dCwgaW50ICpubGlua19vdXQsIGludCAqdWlkX291dCwgaW50ICpnaWRfb3V0LAorCQkgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAqc2l6ZV9vdXQsIHN0cnVjdCB0aW1lc3BlYyAqYXRpbWVfb3V0LAorCQkgICAgIHN0cnVjdCB0aW1lc3BlYyAqbXRpbWVfb3V0LCBzdHJ1Y3QgdGltZXNwZWMgKmN0aW1lX291dCwKKwkJICAgICBpbnQgKmJsa3NpemVfb3V0LCB1bnNpZ25lZCBsb25nIGxvbmcgKmJsb2Nrc19vdXQpOworZXh0ZXJuIGludCBhY2Nlc3NfZmlsZShjaGFyICpwYXRoLCBpbnQgciwgaW50IHcsIGludCB4KTsKK2V4dGVybiBpbnQgb3Blbl9maWxlKGNoYXIgKnBhdGgsIGludCByLCBpbnQgdywgaW50IGFwcGVuZCk7CitleHRlcm4gaW50IGZpbGVfdHlwZShjb25zdCBjaGFyICpwYXRoLCBpbnQgKm1haiwgaW50ICptaW4pOworZXh0ZXJuIHZvaWQgKm9wZW5fZGlyKGNoYXIgKnBhdGgsIGludCAqZXJyX291dCk7CitleHRlcm4gY2hhciAqcmVhZF9kaXIodm9pZCAqc3RyZWFtLCB1bnNpZ25lZCBsb25nIGxvbmcgKnBvcywKKwkJICAgICAgdW5zaWduZWQgbG9uZyBsb25nICppbm9fb3V0LCBpbnQgKmxlbl9vdXQpOworZXh0ZXJuIHZvaWQgY2xvc2VfZmlsZSh2b2lkICpzdHJlYW0pOworZXh0ZXJuIHZvaWQgY2xvc2VfZGlyKHZvaWQgKnN0cmVhbSk7CitleHRlcm4gaW50IHJlYWRfZmlsZShpbnQgZmQsIHVuc2lnbmVkIGxvbmcgbG9uZyAqb2Zmc2V0LCBjaGFyICpidWYsIGludCBsZW4pOworZXh0ZXJuIGludCB3cml0ZV9maWxlKGludCBmZCwgdW5zaWduZWQgbG9uZyBsb25nICpvZmZzZXQsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJICAgICAgaW50IGxlbik7CitleHRlcm4gaW50IGxzZWVrX2ZpbGUoaW50IGZkLCBsb25nIGxvbmcgb2Zmc2V0LCBpbnQgd2hlbmNlKTsKK2V4dGVybiBpbnQgZmlsZV9jcmVhdGUoY2hhciAqbmFtZSwgaW50IHVyLCBpbnQgdXcsIGludCB1eCwgaW50IGdyLAorCQkgICAgICAgaW50IGd3LCBpbnQgZ3gsIGludCBvciwgaW50IG93LCBpbnQgb3gpOworZXh0ZXJuIGludCBzZXRfYXR0cihjb25zdCBjaGFyICpmaWxlLCBzdHJ1Y3QgaG9zdGZzX2lhdHRyICphdHRycyk7CitleHRlcm4gaW50IG1ha2Vfc3ltbGluayhjb25zdCBjaGFyICpmcm9tLCBjb25zdCBjaGFyICp0byk7CitleHRlcm4gaW50IHVubGlua19maWxlKGNvbnN0IGNoYXIgKmZpbGUpOworZXh0ZXJuIGludCBkb19ta2Rpcihjb25zdCBjaGFyICpmaWxlLCBpbnQgbW9kZSk7CitleHRlcm4gaW50IGRvX3JtZGlyKGNvbnN0IGNoYXIgKmZpbGUpOworZXh0ZXJuIGludCBkb19ta25vZChjb25zdCBjaGFyICpmaWxlLCBpbnQgbW9kZSwgaW50IGRldik7CitleHRlcm4gaW50IGxpbmtfZmlsZShjb25zdCBjaGFyICpmcm9tLCBjb25zdCBjaGFyICp0byk7CitleHRlcm4gaW50IGRvX3JlYWRsaW5rKGNoYXIgKmZpbGUsIGNoYXIgKmJ1ZiwgaW50IHNpemUpOworZXh0ZXJuIGludCByZW5hbWVfZmlsZShjaGFyICpmcm9tLCBjaGFyICp0byk7CitleHRlcm4gaW50IGRvX3N0YXRmcyhjaGFyICpyb290LCBsb25nICpic2l6ZV9vdXQsIGxvbmcgbG9uZyAqYmxvY2tzX291dCwKKwkJICAgICBsb25nIGxvbmcgKmJmcmVlX291dCwgbG9uZyBsb25nICpiYXZhaWxfb3V0LAorCQkgICAgIGxvbmcgbG9uZyAqZmlsZXNfb3V0LCBsb25nIGxvbmcgKmZmcmVlX291dCwKKwkJICAgICB2b2lkICpmc2lkX291dCwgaW50IGZzaWRfc2l6ZSwgbG9uZyAqbmFtZWxlbl9vdXQsCisJCSAgICAgbG9uZyAqc3BhcmVfb3V0KTsKKworI2VuZGlmCisKKy8qCisgKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KKyAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQorICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAorICogb2YgdGhlIGZpbGUuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9mcy9ob3N0ZnMvaG9zdGZzX2tlcm4uYyBiL2ZzL2hvc3Rmcy9ob3N0ZnNfa2Vybi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4OGFkMjkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ob3N0ZnMvaG9zdGZzX2tlcm4uYwpAQCAtMCwwICsxLDEwNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEsIDIwMDIgSmVmZiBEaWtlIChqZGlrZUBrYXJheWEuY29tKQorICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICoKKyAqIFBvcnRlZCB0aGUgZmlsZXN5c3RlbSByb3V0aW5lcyB0byAyLjUuCisgKiAyMDAzLTAyLTEwIFBldHIgQmF1ZGlzIDxwYXNreUB1Y3cuY3o+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9yb290X2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXRmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSAiaG9zdGZzLmgiCisjaW5jbHVkZSAia2Vybl91dGlsLmgiCisjaW5jbHVkZSAia2Vybi5oIgorI2luY2x1ZGUgInVzZXJfdXRpbC5oIgorI2luY2x1ZGUgIjJfNWNvbXBhdC5oIgorI2luY2x1ZGUgImluaXQuaCIKKworc3RydWN0IGhvc3Rmc19pbm9kZV9pbmZvIHsKKwljaGFyICpob3N0X2ZpbGVuYW1lOworCWludCBmZDsKKwlpbnQgbW9kZTsKKwlzdHJ1Y3QgaW5vZGUgdmZzX2lub2RlOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaG9zdGZzX2lub2RlX2luZm8gKkhPU1RGU19JKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuKGxpc3RfZW50cnkoaW5vZGUsIHN0cnVjdCBob3N0ZnNfaW5vZGVfaW5mbywgdmZzX2lub2RlKSk7Cit9CisKKyNkZWZpbmUgRklMRV9IT1NURlNfSShmaWxlKSBIT1NURlNfSSgoZmlsZSktPmZfZGVudHJ5LT5kX2lub2RlKQorCitpbnQgaG9zdGZzX2RfZGVsZXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlyZXR1cm4oMSk7Cit9CisKK3N0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBob3N0ZnNfZGVudHJ5X29wcyA9IHsKKwkuZF9kZWxldGUJCT0gaG9zdGZzX2RfZGVsZXRlLAorfTsKKworLyogQ2hhbmdlZCBpbiBob3N0ZnNfYXJncyBiZWZvcmUgdGhlIGtlcm5lbCBzdGFydHMgcnVubmluZyAqLworc3RhdGljIGNoYXIgKnJvb3RfaW5vID0gIi8iOworc3RhdGljIGludCBhcHBlbmQgPSAwOworCisjZGVmaW5lIEhPU1RGU19TVVBFUl9NQUdJQyAweDAwYzBmZmVlCisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBob3N0ZnNfaW9wczsKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBob3N0ZnNfZGlyX2lvcHM7CitzdGF0aWMgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBob3N0ZnNfbGlua19hb3BzOworCisjaWZuZGVmIE1PRFVMRQorc3RhdGljIGludCBfX2luaXQgaG9zdGZzX2FyZ3MoY2hhciAqb3B0aW9ucywgaW50ICphZGQpCit7CisJY2hhciAqcHRyOworCisJcHRyID0gc3RyY2hyKG9wdGlvbnMsICcsJyk7CisJaWYocHRyICE9IE5VTEwpCisJCSpwdHIrKyA9ICdcMCc7CisJaWYoKm9wdGlvbnMgIT0gJ1wwJykKKwkJcm9vdF9pbm8gPSBvcHRpb25zOworCisJb3B0aW9ucyA9IHB0cjsKKwl3aGlsZShvcHRpb25zKXsKKwkJcHRyID0gc3RyY2hyKG9wdGlvbnMsICcsJyk7CisJCWlmKHB0ciAhPSBOVUxMKQorCQkJKnB0cisrID0gJ1wwJzsKKwkJaWYoKm9wdGlvbnMgIT0gJ1wwJyl7CisJCQlpZighc3RyY21wKG9wdGlvbnMsICJhcHBlbmQiKSkKKwkJCQlhcHBlbmQgPSAxOworCQkJZWxzZSBwcmludGYoImhvc3Rmc19hcmdzIC0gdW5zdXBwb3J0ZWQgb3B0aW9uIC0gJXNcbiIsCisJCQkJICAgIG9wdGlvbnMpOworCQl9CisJCW9wdGlvbnMgPSBwdHI7CisJfQorCXJldHVybigwKTsKK30KKworX191bWxfc2V0dXAoImhvc3Rmcz0iLCBob3N0ZnNfYXJncywKKyJob3N0ZnM9PHJvb3QgZGlyPiw8ZmxhZ3M+LC4uLlxuIgorIiAgICBUaGlzIGlzIHVzZWQgdG8gc2V0IGhvc3RmcyBwYXJhbWV0ZXJzLiAgVGhlIHJvb3QgZGlyZWN0b3J5IGFyZ3VtZW50XG4iCisiICAgIGlzIHVzZWQgdG8gY29uZmluZSBhbGwgaG9zdGZzIG1vdW50cyB0byB3aXRoaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnlcbiIKKyIgICAgdHJlZSBvbiB0aGUgaG9zdC4gIElmIHRoaXMgaXNuJ3Qgc3BlY2lmaWVkLCB0aGVuIGEgdXNlciBpbnNpZGUgVU1MIGNhblxuIgorIiAgICBtb3VudCBhbnl0aGluZyBvbiB0aGUgaG9zdCB0aGF0J3MgYWNjZXNzaWJsZSB0byB0aGUgdXNlciB0aGF0J3MgcnVubmluZ1xuIgorIiAgICBpdC5cbiIKKyIgICAgVGhlIG9ubHkgZmxhZyBjdXJyZW50bHkgc3VwcG9ydGVkIGlzICdhcHBlbmQnLCB3aGljaCBzcGVjaWZpZXMgdGhhdCBhbGxcbiIKKyIgICAgZmlsZXMgb3BlbmVkIGJ5IGhvc3RmcyB3aWxsIGJlIG9wZW5lZCBpbiBhcHBlbmQgbW9kZS5cblxuIgorKTsKKyNlbmRpZgorCitzdGF0aWMgY2hhciAqZGVudHJ5X25hbWUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgZXh0cmEpCit7CisJc3RydWN0IGRlbnRyeSAqcGFyZW50OworCWNoYXIgKnJvb3QsICpuYW1lOworCWludCBsZW47CisKKwlsZW4gPSAwOworCXBhcmVudCA9IGRlbnRyeTsKKwl3aGlsZShwYXJlbnQtPmRfcGFyZW50ICE9IHBhcmVudCl7CisJCWxlbiArPSBwYXJlbnQtPmRfbmFtZS5sZW4gKyAxOworCQlwYXJlbnQgPSBwYXJlbnQtPmRfcGFyZW50OworCX0KKworCXJvb3QgPSBIT1NURlNfSShwYXJlbnQtPmRfaW5vZGUpLT5ob3N0X2ZpbGVuYW1lOworCWxlbiArPSBzdHJsZW4ocm9vdCk7CisJbmFtZSA9IGttYWxsb2MobGVuICsgZXh0cmEgKyAxLCBHRlBfS0VSTkVMKTsKKwlpZihuYW1lID09IE5VTEwpIHJldHVybihOVUxMKTsKKworCW5hbWVbbGVuXSA9ICdcMCc7CisJcGFyZW50ID0gZGVudHJ5OworCXdoaWxlKHBhcmVudC0+ZF9wYXJlbnQgIT0gcGFyZW50KXsKKwkJbGVuIC09IHBhcmVudC0+ZF9uYW1lLmxlbiArIDE7CisJCW5hbWVbbGVuXSA9ICcvJzsKKwkJc3RybmNweSgmbmFtZVtsZW4gKyAxXSwgcGFyZW50LT5kX25hbWUubmFtZSwKKwkJCXBhcmVudC0+ZF9uYW1lLmxlbik7CisJCXBhcmVudCA9IHBhcmVudC0+ZF9wYXJlbnQ7CisJfQorCXN0cm5jcHkobmFtZSwgcm9vdCwgc3RybGVuKHJvb3QpKTsKKwlyZXR1cm4obmFtZSk7Cit9CisKK3N0YXRpYyBjaGFyICppbm9kZV9uYW1lKHN0cnVjdCBpbm9kZSAqaW5vLCBpbnQgZXh0cmEpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCisJZGVudHJ5ID0gbGlzdF9lbnRyeShpbm8tPmlfZGVudHJ5Lm5leHQsIHN0cnVjdCBkZW50cnksIGRfYWxpYXMpOworCXJldHVybihkZW50cnlfbmFtZShkZW50cnksIGV4dHJhKSk7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9uYW1lKHN0cnVjdCBpbm9kZSAqaW5vLCBjaGFyICpuYW1lKQoreworCS8qIFRoZSBub24taW50IGlub2RlIGZpZWxkcyBhcmUgY29waWVkIGludG8gaW50cyBieSBzdGF0X2ZpbGUgYW5kCisJICogdGhlbiBjb3BpZWQgaW50byB0aGUgaW5vZGUgYmVjYXVzZSBwYXNzaW5nIHRoZSBhY3R1YWwgcG9pbnRlcnMKKwkgKiBpbiBhbmQgaGF2aW5nIHRoZW0gdHJlYXRlZCBhcyBpbnQgKiBicmVha3Mgb24gYmlnLWVuZGlhbiBtYWNoaW5lcworCSAqLworCWludCBlcnI7CisJaW50IGlfbW9kZSwgaV9ubGluaywgaV9ibGtzaXplOworCXVuc2lnbmVkIGxvbmcgbG9uZyBpX3NpemU7CisJdW5zaWduZWQgbG9uZyBsb25nIGlfaW5vOworCXVuc2lnbmVkIGxvbmcgbG9uZyBpX2Jsb2NrczsKKworCWVyciA9IHN0YXRfZmlsZShuYW1lLCAmaV9pbm8sICZpX21vZGUsICZpX25saW5rLCAmaW5vLT5pX3VpZCwKKwkJCSZpbm8tPmlfZ2lkLCAmaV9zaXplLCAmaW5vLT5pX2F0aW1lLCAmaW5vLT5pX210aW1lLAorCQkJJmluby0+aV9jdGltZSwgJmlfYmxrc2l6ZSwgJmlfYmxvY2tzKTsKKwlpZihlcnIpCisJCXJldHVybihlcnIpOworCisJaW5vLT5pX2lubyA9IGlfaW5vOworCWluby0+aV9tb2RlID0gaV9tb2RlOworCWluby0+aV9ubGluayA9IGlfbmxpbms7CisJaW5vLT5pX3NpemUgPSBpX3NpemU7CisJaW5vLT5pX2Jsa3NpemUgPSBpX2Jsa3NpemU7CisJaW5vLT5pX2Jsb2NrcyA9IGlfYmxvY2tzOworCWlmKChpbm8tPmlfc2ItPnNfZGV2ID09IFJPT1RfREVWKSAmJiAoaW5vLT5pX3VpZCA9PSBnZXR1aWQoKSkpCisJCWluby0+aV91aWQgPSAwOworCXJldHVybigwKTsKK30KKworc3RhdGljIGNoYXIgKmZvbGxvd19saW5rKGNoYXIgKmxpbmspCit7CisJaW50IGxlbiwgbjsKKwljaGFyICpuYW1lLCAqcmVzb2x2ZWQsICplbmQ7CisKKwlsZW4gPSA2NDsKKwl3aGlsZSgxKXsKKwkJbiA9IC1FTk9NRU07CisJCW5hbWUgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJCWlmKG5hbWUgPT0gTlVMTCkKKwkJCWdvdG8gb3V0OworCisJCW4gPSBkb19yZWFkbGluayhsaW5rLCBuYW1lLCBsZW4pOworCQlpZihuIDwgbGVuKQorCQkJYnJlYWs7CisJCWxlbiAqPSAyOworCQlrZnJlZShuYW1lKTsKKwl9CisJaWYobiA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlpZigqbmFtZSA9PSAnLycpCisJCXJldHVybihuYW1lKTsKKworCWVuZCA9IHN0cnJjaHIobGluaywgJy8nKTsKKwlpZihlbmQgPT0gTlVMTCkKKwkJcmV0dXJuKG5hbWUpOworCisJKihlbmQgKyAxKSA9ICdcMCc7CisJbGVuID0gc3RybGVuKGxpbmspICsgc3RybGVuKG5hbWUpICsgMTsKKworCXJlc29sdmVkID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCWlmKHJlc29sdmVkID09IE5VTEwpeworCQluID0gLUVOT01FTTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlzcHJpbnRmKHJlc29sdmVkLCAiJXMlcyIsIGxpbmssIG5hbWUpOworCWtmcmVlKG5hbWUpOworCWtmcmVlKGxpbmspOworCXJldHVybihyZXNvbHZlZCk7CisKKyBvdXRfZnJlZToKKwlrZnJlZShuYW1lKTsKKyBvdXQ6CisJcmV0dXJuKEVSUl9QVFIobikpOworfQorCitzdGF0aWMgaW50IHJlYWRfaW5vZGUoc3RydWN0IGlub2RlICppbm8pCit7CisJY2hhciAqbmFtZTsKKwlpbnQgZXJyID0gMDsKKworCS8qIFVuZm9ydHVuYXRlbHksIHdlIGFyZSBjYWxsZWQgZnJvbSBpZ2V0KCkgd2hlbiB3ZSBkb24ndCBoYXZlIGEgZGVudHJ5CisJICogYWxsb2NhdGVkIHlldC4KKwkgKi8KKwlpZihsaXN0X2VtcHR5KCZpbm8tPmlfZGVudHJ5KSkKKwkJZ290byBvdXQ7CisKKwllcnIgPSAtRU5PTUVNOworCW5hbWUgPSBpbm9kZV9uYW1lKGlubywgMCk7CisJaWYobmFtZSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCWlmKGZpbGVfdHlwZShuYW1lLCBOVUxMLCBOVUxMKSA9PSBPU19UWVBFX1NZTUxJTkspeworCQluYW1lID0gZm9sbG93X2xpbmsobmFtZSk7CisJCWlmKElTX0VSUihuYW1lKSl7CisJCQllcnIgPSBQVFJfRVJSKG5hbWUpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwllcnIgPSByZWFkX25hbWUoaW5vLCBuYW1lKTsKKwlrZnJlZShuYW1lKTsKKyBvdXQ6CisJcmV0dXJuKGVycik7Cit9CisKK2ludCBob3N0ZnNfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICpzZikKK3sKKwkvKiBkb19zdGF0ZnMgdXNlcyBzdHJ1Y3Qgc3RhdGZzNjQgaW50ZXJuYWxseSwgYnV0IHRoZSBsaW51eCBrZXJuZWwKKwkgKiBzdHJ1Y3Qgc3RhdGZzIHN0aWxsIGhhcyAzMi1iaXQgdmVyc2lvbnMgZm9yIG1vc3Qgb2YgdGhlc2UgZmllbGRzLAorCSAqIHNvIHdlIGNvbnZlcnQgdGhlbSBoZXJlCisJICovCisJaW50IGVycjsKKwlsb25nIGxvbmcgZl9ibG9ja3M7CisJbG9uZyBsb25nIGZfYmZyZWU7CisJbG9uZyBsb25nIGZfYmF2YWlsOworCWxvbmcgbG9uZyBmX2ZpbGVzOworCWxvbmcgbG9uZyBmX2ZmcmVlOworCisJZXJyID0gZG9fc3RhdGZzKEhPU1RGU19JKHNiLT5zX3Jvb3QtPmRfaW5vZGUpLT5ob3N0X2ZpbGVuYW1lLAorCQkJJnNmLT5mX2JzaXplLCAmZl9ibG9ja3MsICZmX2JmcmVlLCAmZl9iYXZhaWwsICZmX2ZpbGVzLAorCQkJJmZfZmZyZWUsICZzZi0+Zl9mc2lkLCBzaXplb2Yoc2YtPmZfZnNpZCksCisJCQkmc2YtPmZfbmFtZWxlbiwgc2YtPmZfc3BhcmUpOworCWlmKGVycikgcmV0dXJuKGVycik7CisJc2YtPmZfYmxvY2tzID0gZl9ibG9ja3M7CisJc2YtPmZfYmZyZWUgPSBmX2JmcmVlOworCXNmLT5mX2JhdmFpbCA9IGZfYmF2YWlsOworCXNmLT5mX2ZpbGVzID0gZl9maWxlczsKKwlzZi0+Zl9mZnJlZSA9IGZfZmZyZWU7CisJc2YtPmZfdHlwZSA9IEhPU1RGU19TVVBFUl9NQUdJQzsKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmhvc3Rmc19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBob3N0ZnNfaW5vZGVfaW5mbyAqaGk7CisKKwloaSA9IGttYWxsb2Moc2l6ZW9mKCpoaSksIEdGUF9LRVJORUwpOworCWlmKGhpID09IE5VTEwpCisJCXJldHVybihOVUxMKTsKKworCSpoaSA9ICgoc3RydWN0IGhvc3Rmc19pbm9kZV9pbmZvKSB7IC5ob3N0X2ZpbGVuYW1lCT0gTlVMTCwKKwkJCQkJICAgIC5mZAkJCT0gLTEsCisJCQkJCSAgICAubW9kZQkJPSAwIH0pOworCWlub2RlX2luaXRfb25jZSgmaGktPnZmc19pbm9kZSk7CisJcmV0dXJuKCZoaS0+dmZzX2lub2RlKTsKK30KKworc3RhdGljIHZvaWQgaG9zdGZzX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmKEhPU1RGU19JKGlub2RlKS0+ZmQgIT0gLTEpIHsKKwkJY2xvc2VfZmlsZSgmSE9TVEZTX0koaW5vZGUpLT5mZCk7CisJCUhPU1RGU19JKGlub2RlKS0+ZmQgPSAtMTsKKwl9CisJY2xlYXJfaW5vZGUoaW5vZGUpOworfQorCitzdGF0aWMgdm9pZCBob3N0ZnNfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmKEhPU1RGU19JKGlub2RlKS0+aG9zdF9maWxlbmFtZSkKKwkJa2ZyZWUoSE9TVEZTX0koaW5vZGUpLT5ob3N0X2ZpbGVuYW1lKTsKKworCS8qWFhYOiBUaGlzIHNob3VsZCBub3QgaGFwcGVuLCBwcm9iYWJseS4gVGhlIGNoZWNrIGlzIGhlcmUgZm9yCisJICogYWRkaXRpb25hbCBzYWZldHkuKi8KKwlpZihIT1NURlNfSShpbm9kZSktPmZkICE9IC0xKSB7CisJCWNsb3NlX2ZpbGUoJkhPU1RGU19JKGlub2RlKS0+ZmQpOworCQlwcmludGsoS0VSTl9ERUJVRyAiQ2xvc2luZyBob3N0IGZkIGluIC5kZXN0cm95X2lub2RlXG4iKTsKKwl9CisKKwlrZnJlZShIT1NURlNfSShpbm9kZSkpOworfQorCitzdGF0aWMgdm9pZCBob3N0ZnNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJlYWRfaW5vZGUoaW5vZGUpOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgaG9zdGZzX3Nib3BzID0geworCS5hbGxvY19pbm9kZQk9IGhvc3Rmc19hbGxvY19pbm9kZSwKKwkuZHJvcF9pbm9kZQk9IGdlbmVyaWNfZGVsZXRlX2lub2RlLAorCS5kZWxldGVfaW5vZGUgICA9IGhvc3Rmc19kZWxldGVfaW5vZGUsCisJLmRlc3Ryb3lfaW5vZGUJPSBob3N0ZnNfZGVzdHJveV9pbm9kZSwKKwkucmVhZF9pbm9kZQk9IGhvc3Rmc19yZWFkX2lub2RlLAorCS5zdGF0ZnMJCT0gaG9zdGZzX3N0YXRmcywKK307CisKK2ludCBob3N0ZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwl2b2lkICpkaXI7CisJY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbmV4dCwgaW5vOworCWludCBlcnJvciwgbGVuOworCisJbmFtZSA9IGRlbnRyeV9uYW1lKGZpbGUtPmZfZGVudHJ5LCAwKTsKKwlpZihuYW1lID09IE5VTEwpIHJldHVybigtRU5PTUVNKTsKKwlkaXIgPSBvcGVuX2RpcihuYW1lLCAmZXJyb3IpOworCWtmcmVlKG5hbWUpOworCWlmKGRpciA9PSBOVUxMKSByZXR1cm4oLWVycm9yKTsKKwluZXh0ID0gZmlsZS0+Zl9wb3M7CisJd2hpbGUoKG5hbWUgPSByZWFkX2RpcihkaXIsICZuZXh0LCAmaW5vLCAmbGVuKSkgIT0gTlVMTCl7CisJCWVycm9yID0gKCpmaWxsZGlyKShlbnQsIG5hbWUsIGxlbiwgZmlsZS0+Zl9wb3MsCisJCQkJICAgaW5vLCBEVF9VTktOT1dOKTsKKwkJaWYoZXJyb3IpIGJyZWFrOworCQlmaWxlLT5mX3BvcyA9IG5leHQ7CisJfQorCWNsb3NlX2RpcihkaXIpOworCXJldHVybigwKTsKK30KKworaW50IGhvc3Rmc19maWxlX29wZW4oc3RydWN0IGlub2RlICppbm8sIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWNoYXIgKm5hbWU7CisJaW50IG1vZGUgPSAwLCByID0gMCwgdyA9IDAsIGZkOworCisJbW9kZSA9IGZpbGUtPmZfbW9kZSAmIChGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUpOworCWlmKChtb2RlICYgSE9TVEZTX0koaW5vKS0+bW9kZSkgPT0gbW9kZSkKKwkJcmV0dXJuKDApOworCisJLyogVGhlIGZpbGUgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIG9wZW5lZCwgYnV0IHdpdGggdGhlIHdyb25nIGFjY2VzcywKKwkgKiBzbyB0aGlzIHJlc2V0cyB0aGluZ3MgYW5kIHJlb3BlbnMgdGhlIGZpbGUgd2l0aCB0aGUgbmV3IGFjY2Vzcy4KKwkgKi8KKwlpZihIT1NURlNfSShpbm8pLT5mZCAhPSAtMSl7CisJCWNsb3NlX2ZpbGUoJkhPU1RGU19JKGlubyktPmZkKTsKKwkJSE9TVEZTX0koaW5vKS0+ZmQgPSAtMTsKKwl9CisKKwlIT1NURlNfSShpbm8pLT5tb2RlIHw9IG1vZGU7CisJaWYoSE9TVEZTX0koaW5vKS0+bW9kZSAmIEZNT0RFX1JFQUQpCisJCXIgPSAxOworCWlmKEhPU1RGU19JKGlubyktPm1vZGUgJiBGTU9ERV9XUklURSkKKwkJdyA9IDE7CisJaWYodykKKwkJciA9IDE7CisKKwluYW1lID0gZGVudHJ5X25hbWUoZmlsZS0+Zl9kZW50cnksIDApOworCWlmKG5hbWUgPT0gTlVMTCkKKwkJcmV0dXJuKC1FTk9NRU0pOworCisJZmQgPSBvcGVuX2ZpbGUobmFtZSwgciwgdywgYXBwZW5kKTsKKwlrZnJlZShuYW1lKTsKKwlpZihmZCA8IDApIHJldHVybihmZCk7CisJRklMRV9IT1NURlNfSShmaWxlKS0+ZmQgPSBmZDsKKworCXJldHVybigwKTsKK30KKworaW50IGhvc3Rmc19mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgZGF0YXN5bmMpCit7CisJcmV0dXJuKDApOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBob3N0ZnNfZmlsZV9mb3BzID0geworCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKKwkucmVhZAkJPSBnZW5lcmljX2ZpbGVfcmVhZCwKKwkuc2VuZGZpbGUJPSBnZW5lcmljX2ZpbGVfc2VuZGZpbGUsCisJLmFpb19yZWFkCT0gZ2VuZXJpY19maWxlX2Fpb19yZWFkLAorCS5haW9fd3JpdGUJPSBnZW5lcmljX2ZpbGVfYWlvX3dyaXRlLAorCS5yZWFkdgkJPSBnZW5lcmljX2ZpbGVfcmVhZHYsCisJLndyaXRldgkJPSBnZW5lcmljX2ZpbGVfd3JpdGV2LAorCS53cml0ZQkJPSBnZW5lcmljX2ZpbGVfd3JpdGUsCisJLm1tYXAJCT0gZ2VuZXJpY19maWxlX21tYXAsCisJLm9wZW4JCT0gaG9zdGZzX2ZpbGVfb3BlbiwKKwkucmVsZWFzZQk9IE5VTEwsCisJLmZzeW5jCQk9IGhvc3Rmc19mc3luYywKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGhvc3Rmc19kaXJfZm9wcyA9IHsKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlYWRkaXIJPSBob3N0ZnNfcmVhZGRpciwKKwkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAorfTsKKworaW50IGhvc3Rmc193cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gcGFnZS0+bWFwcGluZzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKKwljaGFyICpidWZmZXI7CisJdW5zaWduZWQgbG9uZyBsb25nIGJhc2U7CisJaW50IGNvdW50ID0gUEFHRV9DQUNIRV9TSVpFOworCWludCBlbmRfaW5kZXggPSBpbm9kZS0+aV9zaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJaW50IGVycjsKKworCWlmIChwYWdlLT5pbmRleCA+PSBlbmRfaW5kZXgpCisJCWNvdW50ID0gaW5vZGUtPmlfc2l6ZSAmIChQQUdFX0NBQ0hFX1NJWkUtMSk7CisKKwlidWZmZXIgPSBrbWFwKHBhZ2UpOworCWJhc2UgPSAoKHVuc2lnbmVkIGxvbmcgbG9uZykgcGFnZS0+aW5kZXgpIDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisKKwllcnIgPSB3cml0ZV9maWxlKEhPU1RGU19JKGlub2RlKS0+ZmQsICZiYXNlLCBidWZmZXIsIGNvdW50KTsKKwlpZihlcnIgIT0gY291bnQpeworCQlDbGVhclBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGJhc2UgPiBpbm9kZS0+aV9zaXplKQorCQlpbm9kZS0+aV9zaXplID0gYmFzZTsKKworCWlmIChQYWdlRXJyb3IocGFnZSkpCisJCUNsZWFyUGFnZUVycm9yKHBhZ2UpOworCWVyciA9IDA7CisKKyBvdXQ6CisJa3VubWFwKHBhZ2UpOworCisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIGVycjsKK30KKworaW50IGhvc3Rmc19yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJY2hhciAqYnVmZmVyOworCWxvbmcgbG9uZyBzdGFydDsKKwlpbnQgZXJyID0gMDsKKworCXN0YXJ0ID0gKGxvbmcgbG9uZykgcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVDsKKwlidWZmZXIgPSBrbWFwKHBhZ2UpOworCWVyciA9IHJlYWRfZmlsZShGSUxFX0hPU1RGU19JKGZpbGUpLT5mZCwgJnN0YXJ0LCBidWZmZXIsCisJCQlQQUdFX0NBQ0hFX1NJWkUpOworCWlmKGVyciA8IDApIGdvdG8gb3V0OworCisJbWVtc2V0KCZidWZmZXJbZXJyXSwgMCwgUEFHRV9DQUNIRV9TSVpFIC0gZXJyKTsKKworCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwlpZiAoUGFnZUVycm9yKHBhZ2UpKSBDbGVhclBhZ2VFcnJvcihwYWdlKTsKKwllcnIgPSAwOworIG91dDoKKwlrdW5tYXAocGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuKGVycik7Cit9CisKK2ludCBob3N0ZnNfcHJlcGFyZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkgdW5zaWduZWQgaW50IGZyb20sIHVuc2lnbmVkIGludCB0bykKK3sKKwljaGFyICpidWZmZXI7CisJbG9uZyBsb25nIHN0YXJ0LCB0bXA7CisJaW50IGVycjsKKworCXN0YXJ0ID0gKGxvbmcgbG9uZykgcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVDsKKwlidWZmZXIgPSBrbWFwKHBhZ2UpOworCWlmKGZyb20gIT0gMCl7CisJCXRtcCA9IHN0YXJ0OworCQllcnIgPSByZWFkX2ZpbGUoRklMRV9IT1NURlNfSShmaWxlKS0+ZmQsICZ0bXAsIGJ1ZmZlciwKKwkJCQlmcm9tKTsKKwkJaWYoZXJyIDwgMCkgZ290byBvdXQ7CisJfQorCWlmKHRvICE9IFBBR0VfQ0FDSEVfU0laRSl7CisJCXN0YXJ0ICs9IHRvOworCQllcnIgPSByZWFkX2ZpbGUoRklMRV9IT1NURlNfSShmaWxlKS0+ZmQsICZzdGFydCwgYnVmZmVyICsgdG8sCisJCQkJUEFHRV9DQUNIRV9TSVpFIC0gdG8pOworCQlpZihlcnIgPCAwKSBnb3RvIG91dDsKKwl9CisJZXJyID0gMDsKKyBvdXQ6CisJa3VubWFwKHBhZ2UpOworCXJldHVybihlcnIpOworfQorCitpbnQgaG9zdGZzX2NvbW1pdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGZyb20sCisJCSB1bnNpZ25lZCB0bykKK3sKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IHBhZ2UtPm1hcHBpbmc7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisJY2hhciAqYnVmZmVyOworCWxvbmcgbG9uZyBzdGFydDsKKwlpbnQgZXJyID0gMDsKKworCXN0YXJ0ID0gKGxvbmcgbG9uZykgKHBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpICsgZnJvbTsKKwlidWZmZXIgPSBrbWFwKHBhZ2UpOworCWVyciA9IHdyaXRlX2ZpbGUoRklMRV9IT1NURlNfSShmaWxlKS0+ZmQsICZzdGFydCwgYnVmZmVyICsgZnJvbSwKKwkJCSB0byAtIGZyb20pOworCWlmKGVyciA+IDApIGVyciA9IDA7CisJaWYoIWVyciAmJiAoc3RhcnQgPiBpbm9kZS0+aV9zaXplKSkKKwkJaW5vZGUtPmlfc2l6ZSA9IHN0YXJ0OworCisJa3VubWFwKHBhZ2UpOworCXJldHVybihlcnIpOworfQorCitzdGF0aWMgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBob3N0ZnNfYW9wcyA9IHsKKwkud3JpdGVwYWdlIAk9IGhvc3Rmc193cml0ZXBhZ2UsCisJLnJlYWRwYWdlCT0gaG9zdGZzX3JlYWRwYWdlLAorLyogCS5zZXRfcGFnZV9kaXJ0eSA9IF9fc2V0X3BhZ2VfZGlydHlfbm9idWZmZXJzLCAqLworCS5wcmVwYXJlX3dyaXRlCT0gaG9zdGZzX3ByZXBhcmVfd3JpdGUsCisJLmNvbW1pdF93cml0ZQk9IGhvc3Rmc19jb21taXRfd3JpdGUKK307CisKK3N0YXRpYyBpbnQgaW5pdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJY2hhciAqbmFtZTsKKwlpbnQgdHlwZSwgZXJyID0gLUVOT01FTTsKKwlpbnQgbWFqLCBtaW47CisJZGV2X3QgcmRldiA9IDA7CisKKwlpZihkZW50cnkpeworCQluYW1lID0gZGVudHJ5X25hbWUoZGVudHJ5LCAwKTsKKwkJaWYobmFtZSA9PSBOVUxMKQorCQkJZ290byBvdXQ7CisJCXR5cGUgPSBmaWxlX3R5cGUobmFtZSwgJm1haiwgJm1pbik7CisJCS8qUmVlbmNvZGUgbWFqIGFuZCBtaW4gd2l0aCB0aGUga2VybmVsIGVuY29kaW5nLiovCisJCXJkZXYgPSBNS0RFVihtYWosIG1pbik7CisJCWtmcmVlKG5hbWUpOworCX0KKwllbHNlIHR5cGUgPSBPU19UWVBFX0RJUjsKKworCWVyciA9IDA7CisJaWYodHlwZSA9PSBPU19UWVBFX1NZTUxJTkspCisJCWlub2RlLT5pX29wID0gJnBhZ2Vfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCWVsc2UgaWYodHlwZSA9PSBPU19UWVBFX0RJUikKKwkJaW5vZGUtPmlfb3AgPSAmaG9zdGZzX2Rpcl9pb3BzOworCWVsc2UgaW5vZGUtPmlfb3AgPSAmaG9zdGZzX2lvcHM7CisKKwlpZih0eXBlID09IE9TX1RZUEVfRElSKSBpbm9kZS0+aV9mb3AgPSAmaG9zdGZzX2Rpcl9mb3BzOworCWVsc2UgaW5vZGUtPmlfZm9wID0gJmhvc3Rmc19maWxlX2ZvcHM7CisKKwlpZih0eXBlID09IE9TX1RZUEVfU1lNTElOSykKKwkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmaG9zdGZzX2xpbmtfYW9wczsKKwllbHNlIGlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmhvc3Rmc19hb3BzOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBPU19UWVBFX0NIQVJERVY6CisJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgU19JRkNIUiwgcmRldik7CisJCWJyZWFrOworCWNhc2UgT1NfVFlQRV9CTE9DS0RFVjoKKwkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBTX0lGQkxLLCByZGV2KTsKKwkJYnJlYWs7CisJY2FzZSBPU19UWVBFX0ZJRk86CisJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgU19JRklGTywgMCk7CisJCWJyZWFrOworCWNhc2UgT1NfVFlQRV9TT0NLOgorCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIFNfSUZTT0NLLCAwKTsKKwkJYnJlYWs7CisJfQorIG91dDoKKwlyZXR1cm4oZXJyKTsKK30KKworaW50IGhvc3Rmc19jcmVhdGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsCisgICAgICAgICAgICAgICAgIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJY2hhciAqbmFtZTsKKwlpbnQgZXJyb3IsIGZkOworCisJZXJyb3IgPSAtRU5PTUVNOworCWlub2RlID0gaWdldChkaXItPmlfc2IsIDApOworCWlmKGlub2RlID09IE5VTEwpIGdvdG8gb3V0OworCisJZXJyb3IgPSBpbml0X2lub2RlKGlub2RlLCBkZW50cnkpOworCWlmKGVycm9yKQorCQlnb3RvIG91dF9wdXQ7CisKKwllcnJvciA9IC1FTk9NRU07CisJbmFtZSA9IGRlbnRyeV9uYW1lKGRlbnRyeSwgMCk7CisJaWYobmFtZSA9PSBOVUxMKQorCQlnb3RvIG91dF9wdXQ7CisKKwlmZCA9IGZpbGVfY3JlYXRlKG5hbWUsCisJCQkgbW9kZSAmIFNfSVJVU1IsIG1vZGUgJiBTX0lXVVNSLCBtb2RlICYgU19JWFVTUiwKKwkJCSBtb2RlICYgU19JUkdSUCwgbW9kZSAmIFNfSVdHUlAsIG1vZGUgJiBTX0lYR1JQLAorCQkJIG1vZGUgJiBTX0lST1RILCBtb2RlICYgU19JV09USCwgbW9kZSAmIFNfSVhPVEgpOworCWlmKGZkIDwgMCkKKwkJZXJyb3IgPSBmZDsKKwllbHNlIGVycm9yID0gcmVhZF9uYW1lKGlub2RlLCBuYW1lKTsKKworCWtmcmVlKG5hbWUpOworCWlmKGVycm9yKQorCQlnb3RvIG91dF9wdXQ7CisKKwlIT1NURlNfSShpbm9kZSktPmZkID0gZmQ7CisJSE9TVEZTX0koaW5vZGUpLT5tb2RlID0gRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFOworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJcmV0dXJuKDApOworCisgb3V0X3B1dDoKKwlpcHV0KGlub2RlKTsKKyBvdXQ6CisJcmV0dXJuKGVycm9yKTsKK30KKworc3RydWN0IGRlbnRyeSAqaG9zdGZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmlubywgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJY2hhciAqbmFtZTsKKwlpbnQgZXJyOworCisJZXJyID0gLUVOT01FTTsKKwlpbm9kZSA9IGlnZXQoaW5vLT5pX3NiLCAwKTsKKwlpZihpbm9kZSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCWVyciA9IGluaXRfaW5vZGUoaW5vZGUsIGRlbnRyeSk7CisJaWYoZXJyKQorCQlnb3RvIG91dF9wdXQ7CisKKwllcnIgPSAtRU5PTUVNOworCW5hbWUgPSBkZW50cnlfbmFtZShkZW50cnksIDApOworCWlmKG5hbWUgPT0gTlVMTCkKKwkJZ290byBvdXRfcHV0OworCisJZXJyID0gcmVhZF9uYW1lKGlub2RlLCBuYW1lKTsKKwlrZnJlZShuYW1lKTsKKwlpZihlcnIgPT0gLUVOT0VOVCl7CisJCWlwdXQoaW5vZGUpOworCQlpbm9kZSA9IE5VTEw7CisJfQorCWVsc2UgaWYoZXJyKQorCQlnb3RvIG91dF9wdXQ7CisKKwlkX2FkZChkZW50cnksIGlub2RlKTsKKwlkZW50cnktPmRfb3AgPSAmaG9zdGZzX2RlbnRyeV9vcHM7CisJcmV0dXJuKE5VTEwpOworCisgb3V0X3B1dDoKKwlpcHV0KGlub2RlKTsKKyBvdXQ6CisJcmV0dXJuKEVSUl9QVFIoZXJyKSk7Cit9CisKK3N0YXRpYyBjaGFyICppbm9kZV9kZW50cnlfbmFtZShzdHJ1Y3QgaW5vZGUgKmlubywgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworICAgICAgICBjaGFyICpmaWxlOworCWludCBsZW47CisKKwlmaWxlID0gaW5vZGVfbmFtZShpbm8sIGRlbnRyeS0+ZF9uYW1lLmxlbiArIDEpOworCWlmKGZpbGUgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOworICAgICAgICBzdHJjYXQoZmlsZSwgIi8iKTsKKwlsZW4gPSBzdHJsZW4oZmlsZSk7CisgICAgICAgIHN0cm5jYXQoZmlsZSwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuKTsKKwlmaWxlW2xlbiArIGRlbnRyeS0+ZF9uYW1lLmxlbl0gPSAnXDAnOworICAgICAgICByZXR1cm4oZmlsZSk7Cit9CisKK2ludCBob3N0ZnNfbGluayhzdHJ1Y3QgZGVudHJ5ICp0bywgc3RydWN0IGlub2RlICppbm8sIHN0cnVjdCBkZW50cnkgKmZyb20pCit7CisgICAgICAgIGNoYXIgKmZyb21fbmFtZSwgKnRvX25hbWU7CisgICAgICAgIGludCBlcnI7CisKKyAgICAgICAgaWYoKGZyb21fbmFtZSA9IGlub2RlX2RlbnRyeV9uYW1lKGlubywgZnJvbSkpID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuKC1FTk9NRU0pOworICAgICAgICB0b19uYW1lID0gZGVudHJ5X25hbWUodG8sIDApOworCWlmKHRvX25hbWUgPT0gTlVMTCl7CisJCWtmcmVlKGZyb21fbmFtZSk7CisJCXJldHVybigtRU5PTUVNKTsKKwl9CisgICAgICAgIGVyciA9IGxpbmtfZmlsZSh0b19uYW1lLCBmcm9tX25hbWUpOworICAgICAgICBrZnJlZShmcm9tX25hbWUpOworICAgICAgICBrZnJlZSh0b19uYW1lKTsKKyAgICAgICAgcmV0dXJuKGVycik7Cit9CisKK2ludCBob3N0ZnNfdW5saW5rKHN0cnVjdCBpbm9kZSAqaW5vLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJY2hhciAqZmlsZTsKKwlpbnQgZXJyOworCisJaWYoKGZpbGUgPSBpbm9kZV9kZW50cnlfbmFtZShpbm8sIGRlbnRyeSkpID09IE5VTEwpIHJldHVybigtRU5PTUVNKTsKKwlpZihhcHBlbmQpCisJCXJldHVybigtRVBFUk0pOworCisJZXJyID0gdW5saW5rX2ZpbGUoZmlsZSk7CisJa2ZyZWUoZmlsZSk7CisJcmV0dXJuKGVycik7Cit9CisKK2ludCBob3N0ZnNfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKmlubywgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICp0bykKK3sKKwljaGFyICpmaWxlOworCWludCBlcnI7CisKKwlpZigoZmlsZSA9IGlub2RlX2RlbnRyeV9uYW1lKGlubywgZGVudHJ5KSkgPT0gTlVMTCkgcmV0dXJuKC1FTk9NRU0pOworCWVyciA9IG1ha2Vfc3ltbGluayhmaWxlLCB0byk7CisJa2ZyZWUoZmlsZSk7CisJcmV0dXJuKGVycik7Cit9CisKK2ludCBob3N0ZnNfbWtkaXIoc3RydWN0IGlub2RlICppbm8sIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpCit7CisJY2hhciAqZmlsZTsKKwlpbnQgZXJyOworCisJaWYoKGZpbGUgPSBpbm9kZV9kZW50cnlfbmFtZShpbm8sIGRlbnRyeSkpID09IE5VTEwpIHJldHVybigtRU5PTUVNKTsKKwllcnIgPSBkb19ta2RpcihmaWxlLCBtb2RlKTsKKwlrZnJlZShmaWxlKTsKKwlyZXR1cm4oZXJyKTsKK30KKworaW50IGhvc3Rmc19ybWRpcihzdHJ1Y3QgaW5vZGUgKmlubywgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWNoYXIgKmZpbGU7CisJaW50IGVycjsKKworCWlmKChmaWxlID0gaW5vZGVfZGVudHJ5X25hbWUoaW5vLCBkZW50cnkpKSA9PSBOVUxMKSByZXR1cm4oLUVOT01FTSk7CisJZXJyID0gZG9fcm1kaXIoZmlsZSk7CisJa2ZyZWUoZmlsZSk7CisJcmV0dXJuKGVycik7Cit9CisKK2ludCBob3N0ZnNfbWtub2Qoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsIGRldl90IGRldikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWNoYXIgKm5hbWU7CisJaW50IGVyciA9IC1FTk9NRU07CisKKwlpbm9kZSA9IGlnZXQoZGlyLT5pX3NiLCAwKTsKKwlpZihpbm9kZSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCWVyciA9IGluaXRfaW5vZGUoaW5vZGUsIGRlbnRyeSk7CisJaWYoZXJyKQorCQlnb3RvIG91dF9wdXQ7CisKKwllcnIgPSAtRU5PTUVNOworCW5hbWUgPSBkZW50cnlfbmFtZShkZW50cnksIDApOworCWlmKG5hbWUgPT0gTlVMTCkKKwkJZ290byBvdXRfcHV0OworCisJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBtb2RlLCBkZXYpOworCWVyciA9IGRvX21rbm9kKG5hbWUsIG1vZGUsIGRldik7CisJaWYoZXJyKQorCQlnb3RvIG91dF9mcmVlOworCisJZXJyID0gcmVhZF9uYW1lKGlub2RlLCBuYW1lKTsKKwlrZnJlZShuYW1lKTsKKwlpZihlcnIpCisJCWdvdG8gb3V0X3B1dDsKKworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJcmV0dXJuKDApOworCisgb3V0X2ZyZWU6CisJa2ZyZWUobmFtZSk7Cisgb3V0X3B1dDoKKwlpcHV0KGlub2RlKTsKKyBvdXQ6CisJcmV0dXJuKGVycik7Cit9CisKK2ludCBob3N0ZnNfcmVuYW1lKHN0cnVjdCBpbm9kZSAqZnJvbV9pbm8sIHN0cnVjdCBkZW50cnkgKmZyb20sCisJCSAgc3RydWN0IGlub2RlICp0b19pbm8sIHN0cnVjdCBkZW50cnkgKnRvKQoreworCWNoYXIgKmZyb21fbmFtZSwgKnRvX25hbWU7CisJaW50IGVycjsKKworCWlmKChmcm9tX25hbWUgPSBpbm9kZV9kZW50cnlfbmFtZShmcm9tX2lubywgZnJvbSkpID09IE5VTEwpCisJCXJldHVybigtRU5PTUVNKTsKKwlpZigodG9fbmFtZSA9IGlub2RlX2RlbnRyeV9uYW1lKHRvX2lubywgdG8pKSA9PSBOVUxMKXsKKwkJa2ZyZWUoZnJvbV9uYW1lKTsKKwkJcmV0dXJuKC1FTk9NRU0pOworCX0KKwllcnIgPSByZW5hbWVfZmlsZShmcm9tX25hbWUsIHRvX25hbWUpOworCWtmcmVlKGZyb21fbmFtZSk7CisJa2ZyZWUodG9fbmFtZSk7CisJcmV0dXJuKGVycik7Cit9CisKK3ZvaWQgaG9zdGZzX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vKQoreworCW5vdF9pbXBsZW1lbnRlZCgpOworfQorCitpbnQgaG9zdGZzX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm8sIGludCBkZXNpcmVkLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwljaGFyICpuYW1lOworCWludCByID0gMCwgdyA9IDAsIHggPSAwLCBlcnI7CisKKwlpZiAoZGVzaXJlZCAmIE1BWV9SRUFEKSByID0gMTsKKwlpZiAoZGVzaXJlZCAmIE1BWV9XUklURSkgdyA9IDE7CisJaWYgKGRlc2lyZWQgJiBNQVlfRVhFQykgeCA9IDE7CisJbmFtZSA9IGlub2RlX25hbWUoaW5vLCAwKTsKKwlpZiAobmFtZSA9PSBOVUxMKSByZXR1cm4oLUVOT01FTSk7CisKKwlpZiAoU19JU0NIUihpbm8tPmlfbW9kZSkgfHwgU19JU0JMSyhpbm8tPmlfbW9kZSkgfHwKKwkJCVNfSVNGSUZPKGluby0+aV9tb2RlKSB8fCBTX0lTU09DSyhpbm8tPmlfbW9kZSkpCisJCWVyciA9IDA7CisJZWxzZQorCQllcnIgPSBhY2Nlc3NfZmlsZShuYW1lLCByLCB3LCB4KTsKKwlrZnJlZShuYW1lKTsKKwlpZighZXJyKQorCQllcnIgPSBnZW5lcmljX3Blcm1pc3Npb24oaW5vLCBkZXNpcmVkLCBOVUxMKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgaG9zdGZzX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmF0dHIpCit7CisJc3RydWN0IGhvc3Rmc19pYXR0ciBhdHRyczsKKwljaGFyICpuYW1lOworCWludCBlcnI7CisKKwllcnIgPSBpbm9kZV9jaGFuZ2Vfb2soZGVudHJ5LT5kX2lub2RlLCBhdHRyKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYoYXBwZW5kKQorCQlhdHRyLT5pYV92YWxpZCAmPSB+QVRUUl9TSVpFOworCisJYXR0cnMuaWFfdmFsaWQgPSAwOworCWlmKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9NT0RFKXsKKwkJYXR0cnMuaWFfdmFsaWQgfD0gSE9TVEZTX0FUVFJfTU9ERTsKKwkJYXR0cnMuaWFfbW9kZSA9IGF0dHItPmlhX21vZGU7CisJfQorCWlmKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9VSUQpeworCQlpZigoZGVudHJ5LT5kX2lub2RlLT5pX3NiLT5zX2RldiA9PSBST09UX0RFVikgJiYKKwkJICAgKGF0dHItPmlhX3VpZCA9PSAwKSkKKwkJCWF0dHItPmlhX3VpZCA9IGdldHVpZCgpOworCQlhdHRycy5pYV92YWxpZCB8PSBIT1NURlNfQVRUUl9VSUQ7CisJCWF0dHJzLmlhX3VpZCA9IGF0dHItPmlhX3VpZDsKKwl9CisJaWYoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0dJRCl7CisJCWlmKChkZW50cnktPmRfaW5vZGUtPmlfc2ItPnNfZGV2ID09IFJPT1RfREVWKSAmJgorCQkgICAoYXR0ci0+aWFfZ2lkID09IDApKQorCQkJYXR0ci0+aWFfZ2lkID0gZ2V0Z2lkKCk7CisJCWF0dHJzLmlhX3ZhbGlkIHw9IEhPU1RGU19BVFRSX0dJRDsKKwkJYXR0cnMuaWFfZ2lkID0gYXR0ci0+aWFfZ2lkOworCX0KKwlpZihhdHRyLT5pYV92YWxpZCAmIEFUVFJfU0laRSl7CisJCWF0dHJzLmlhX3ZhbGlkIHw9IEhPU1RGU19BVFRSX1NJWkU7CisJCWF0dHJzLmlhX3NpemUgPSBhdHRyLT5pYV9zaXplOworCX0KKwlpZihhdHRyLT5pYV92YWxpZCAmIEFUVFJfQVRJTUUpeworCQlhdHRycy5pYV92YWxpZCB8PSBIT1NURlNfQVRUUl9BVElNRTsKKwkJYXR0cnMuaWFfYXRpbWUgPSBhdHRyLT5pYV9hdGltZTsKKwl9CisJaWYoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01USU1FKXsKKwkJYXR0cnMuaWFfdmFsaWQgfD0gSE9TVEZTX0FUVFJfTVRJTUU7CisJCWF0dHJzLmlhX210aW1lID0gYXR0ci0+aWFfbXRpbWU7CisJfQorCWlmKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9DVElNRSl7CisJCWF0dHJzLmlhX3ZhbGlkIHw9IEhPU1RGU19BVFRSX0NUSU1FOworCQlhdHRycy5pYV9jdGltZSA9IGF0dHItPmlhX2N0aW1lOworCX0KKwlpZihhdHRyLT5pYV92YWxpZCAmIEFUVFJfQVRJTUVfU0VUKXsKKwkJYXR0cnMuaWFfdmFsaWQgfD0gSE9TVEZTX0FUVFJfQVRJTUVfU0VUOworCX0KKwlpZihhdHRyLT5pYV92YWxpZCAmIEFUVFJfTVRJTUVfU0VUKXsKKwkJYXR0cnMuaWFfdmFsaWQgfD0gSE9TVEZTX0FUVFJfTVRJTUVfU0VUOworCX0KKwluYW1lID0gZGVudHJ5X25hbWUoZGVudHJ5LCAwKTsKKwlpZihuYW1lID09IE5VTEwpIHJldHVybigtRU5PTUVNKTsKKwllcnIgPSBzZXRfYXR0cihuYW1lLCAmYXR0cnMpOworCWtmcmVlKG5hbWUpOworCWlmKGVycikKKwkJcmV0dXJuKGVycik7CisKKwlyZXR1cm4oaW5vZGVfc2V0YXR0cihkZW50cnktPmRfaW5vZGUsIGF0dHIpKTsKK30KKworaW50IGhvc3Rmc19nZXRhdHRyKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJICAgc3RydWN0IGtzdGF0ICpzdGF0KQoreworCWdlbmVyaWNfZmlsbGF0dHIoZGVudHJ5LT5kX2lub2RlLCBzdGF0KTsKKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBob3N0ZnNfaW9wcyA9IHsKKwkuY3JlYXRlCQk9IGhvc3Rmc19jcmVhdGUsCisJLmxpbmsJCT0gaG9zdGZzX2xpbmssCisJLnVubGluawkJPSBob3N0ZnNfdW5saW5rLAorCS5zeW1saW5rCT0gaG9zdGZzX3N5bWxpbmssCisJLm1rZGlyCQk9IGhvc3Rmc19ta2RpciwKKwkucm1kaXIJCT0gaG9zdGZzX3JtZGlyLAorCS5ta25vZAkJPSBob3N0ZnNfbWtub2QsCisJLnJlbmFtZQkJPSBob3N0ZnNfcmVuYW1lLAorCS50cnVuY2F0ZQk9IGhvc3Rmc190cnVuY2F0ZSwKKwkucGVybWlzc2lvbgk9IGhvc3Rmc19wZXJtaXNzaW9uLAorCS5zZXRhdHRyCT0gaG9zdGZzX3NldGF0dHIsCisJLmdldGF0dHIJPSBob3N0ZnNfZ2V0YXR0ciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBob3N0ZnNfZGlyX2lvcHMgPSB7CisJLmNyZWF0ZQkJPSBob3N0ZnNfY3JlYXRlLAorCS5sb29rdXAJCT0gaG9zdGZzX2xvb2t1cCwKKwkubGluawkJPSBob3N0ZnNfbGluaywKKwkudW5saW5rCQk9IGhvc3Rmc191bmxpbmssCisJLnN5bWxpbmsJPSBob3N0ZnNfc3ltbGluaywKKwkubWtkaXIJCT0gaG9zdGZzX21rZGlyLAorCS5ybWRpcgkJPSBob3N0ZnNfcm1kaXIsCisJLm1rbm9kCQk9IGhvc3Rmc19ta25vZCwKKwkucmVuYW1lCQk9IGhvc3Rmc19yZW5hbWUsCisJLnRydW5jYXRlCT0gaG9zdGZzX3RydW5jYXRlLAorCS5wZXJtaXNzaW9uCT0gaG9zdGZzX3Blcm1pc3Npb24sCisJLnNldGF0dHIJPSBob3N0ZnNfc2V0YXR0ciwKKwkuZ2V0YXR0cgk9IGhvc3Rmc19nZXRhdHRyLAorfTsKKworaW50IGhvc3Rmc19saW5rX3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwljaGFyICpidWZmZXIsICpuYW1lOworCWxvbmcgbG9uZyBzdGFydDsKKwlpbnQgZXJyOworCisJc3RhcnQgPSBwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUOworCWJ1ZmZlciA9IGttYXAocGFnZSk7CisJbmFtZSA9IGlub2RlX25hbWUocGFnZS0+bWFwcGluZy0+aG9zdCwgMCk7CisJaWYobmFtZSA9PSBOVUxMKSByZXR1cm4oLUVOT01FTSk7CisJZXJyID0gZG9fcmVhZGxpbmsobmFtZSwgYnVmZmVyLCBQQUdFX0NBQ0hFX1NJWkUpOworCWtmcmVlKG5hbWUpOworCWlmKGVyciA9PSBQQUdFX0NBQ0hFX1NJWkUpCisJCWVyciA9IC1FMkJJRzsKKwllbHNlIGlmKGVyciA+IDApeworCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCQlpZiAoUGFnZUVycm9yKHBhZ2UpKSBDbGVhclBhZ2VFcnJvcihwYWdlKTsKKwkJZXJyID0gMDsKKwl9CisJa3VubWFwKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCXJldHVybihlcnIpOworfQorCitzdGF0aWMgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBob3N0ZnNfbGlua19hb3BzID0geworCS5yZWFkcGFnZQk9IGhvc3Rmc19saW5rX3JlYWRwYWdlLAorfTsKKworc3RhdGljIGludCBob3N0ZnNfZmlsbF9zYl9jb21tb24oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZCwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKnJvb3RfaW5vZGU7CisJY2hhciAqbmFtZSwgKmRhdGEgPSBkOworCWludCBlcnI7CisKKwlzYi0+c19ibG9ja3NpemUgPSAxMDI0OworCXNiLT5zX2Jsb2Nrc2l6ZV9iaXRzID0gMTA7CisJc2ItPnNfbWFnaWMgPSBIT1NURlNfU1VQRVJfTUFHSUM7CisJc2ItPnNfb3AgPSAmaG9zdGZzX3Nib3BzOworCisJaWYoKGRhdGEgPT0gTlVMTCkgfHwgKCpkYXRhID09ICdcMCcpKQorCQlkYXRhID0gcm9vdF9pbm87CisKKwllcnIgPSAtRU5PTUVNOworCW5hbWUgPSBrbWFsbG9jKHN0cmxlbihkYXRhKSArIDEsIEdGUF9LRVJORUwpOworCWlmKG5hbWUgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlzdHJjcHkobmFtZSwgZGF0YSk7CisKKwlyb290X2lub2RlID0gaWdldChzYiwgMCk7CisJaWYocm9vdF9pbm9kZSA9PSBOVUxMKQorCQlnb3RvIG91dF9mcmVlOworCisJZXJyID0gaW5pdF9pbm9kZShyb290X2lub2RlLCBOVUxMKTsKKwlpZihlcnIpCisJCWdvdG8gb3V0X3B1dDsKKworCUhPU1RGU19JKHJvb3RfaW5vZGUpLT5ob3N0X2ZpbGVuYW1lID0gbmFtZTsKKworCWVyciA9IC1FTk9NRU07CisJc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290X2lub2RlKTsKKwlpZihzYi0+c19yb290ID09IE5VTEwpCisJCWdvdG8gb3V0X3B1dDsKKworCWVyciA9IHJlYWRfaW5vZGUocm9vdF9pbm9kZSk7CisJaWYoZXJyKQorCQlnb3RvIG91dF9wdXQ7CisKKwlyZXR1cm4oMCk7CisKKyBvdXRfcHV0OgorCWlwdXQocm9vdF9pbm9kZSk7Cisgb3V0X2ZyZWU6CisJa2ZyZWUobmFtZSk7Cisgb3V0OgorCXJldHVybihlcnIpOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpob3N0ZnNfcmVhZF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqdHlwZSwKKwkJCQkJICAgICBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkJCQkgICAgIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuKGdldF9zYl9ub2Rldih0eXBlLCBmbGFncywgZGF0YSwgaG9zdGZzX2ZpbGxfc2JfY29tbW9uKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBob3N0ZnNfdHlwZSA9IHsKKwkub3duZXIgCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lIAkJPSAiaG9zdGZzIiwKKwkuZ2V0X3NiIAk9IGhvc3Rmc19yZWFkX3NiLAorCS5raWxsX3NiCT0ga2lsbF9hbm9uX3N1cGVyLAorCS5mc19mbGFncyAJPSAwLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9ob3N0ZnModm9pZCkKK3sKKwlyZXR1cm4ocmVnaXN0ZXJfZmlsZXN5c3RlbSgmaG9zdGZzX3R5cGUpKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfaG9zdGZzKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZob3N0ZnNfdHlwZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfaG9zdGZzKQorbW9kdWxlX2V4aXQoZXhpdF9ob3N0ZnMpCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qCisgKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KKyAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQorICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAorICogb2YgdGhlIGZpbGUuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9mcy9ob3N0ZnMvaG9zdGZzX3VzZXIuYyBiL2ZzL2hvc3Rmcy9ob3N0ZnNfdXNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3OTZlODQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ob3N0ZnMvaG9zdGZzX3VzZXIuYwpAQCAtMCwwICsxLDM2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHV0aW1lLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy92ZnMuaD4KKyNpbmNsdWRlICJob3N0ZnMuaCIKKyNpbmNsdWRlICJrZXJuX3V0aWwuaCIKKyNpbmNsdWRlICJ1c2VyLmgiCisKK2ludCBzdGF0X2ZpbGUoY29uc3QgY2hhciAqcGF0aCwgdW5zaWduZWQgbG9uZyBsb25nICppbm9kZV9vdXQsIGludCAqbW9kZV9vdXQsCisJICAgICAgaW50ICpubGlua19vdXQsIGludCAqdWlkX291dCwgaW50ICpnaWRfb3V0LAorCSAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAqc2l6ZV9vdXQsIHN0cnVjdCB0aW1lc3BlYyAqYXRpbWVfb3V0LAorCSAgICAgIHN0cnVjdCB0aW1lc3BlYyAqbXRpbWVfb3V0LCBzdHJ1Y3QgdGltZXNwZWMgKmN0aW1lX291dCwKKwkgICAgICBpbnQgKmJsa3NpemVfb3V0LCB1bnNpZ25lZCBsb25nIGxvbmcgKmJsb2Nrc19vdXQpCit7CisJc3RydWN0IHN0YXQ2NCBidWY7CisKKwlpZihsc3RhdDY0KHBhdGgsICZidWYpIDwgMCkKKwkJcmV0dXJuKC1lcnJubyk7CisKKwlpZihpbm9kZV9vdXQgIT0gTlVMTCkgKmlub2RlX291dCA9IGJ1Zi5zdF9pbm87CisJaWYobW9kZV9vdXQgIT0gTlVMTCkgKm1vZGVfb3V0ID0gYnVmLnN0X21vZGU7CisJaWYobmxpbmtfb3V0ICE9IE5VTEwpICpubGlua19vdXQgPSBidWYuc3Rfbmxpbms7CisJaWYodWlkX291dCAhPSBOVUxMKSAqdWlkX291dCA9IGJ1Zi5zdF91aWQ7CisJaWYoZ2lkX291dCAhPSBOVUxMKSAqZ2lkX291dCA9IGJ1Zi5zdF9naWQ7CisJaWYoc2l6ZV9vdXQgIT0gTlVMTCkgKnNpemVfb3V0ID0gYnVmLnN0X3NpemU7CisJaWYoYXRpbWVfb3V0ICE9IE5VTEwpIHsKKwkJYXRpbWVfb3V0LT50dl9zZWMgPSBidWYuc3RfYXRpbWU7CisJCWF0aW1lX291dC0+dHZfbnNlYyA9IDA7CisJfQorCWlmKG10aW1lX291dCAhPSBOVUxMKSB7CisJCW10aW1lX291dC0+dHZfc2VjID0gYnVmLnN0X210aW1lOworCQltdGltZV9vdXQtPnR2X25zZWMgPSAwOworCX0KKwlpZihjdGltZV9vdXQgIT0gTlVMTCkgeworCQljdGltZV9vdXQtPnR2X3NlYyA9IGJ1Zi5zdF9jdGltZTsKKwkJY3RpbWVfb3V0LT50dl9uc2VjID0gMDsKKwl9CisJaWYoYmxrc2l6ZV9vdXQgIT0gTlVMTCkgKmJsa3NpemVfb3V0ID0gYnVmLnN0X2Jsa3NpemU7CisJaWYoYmxvY2tzX291dCAhPSBOVUxMKSAqYmxvY2tzX291dCA9IGJ1Zi5zdF9ibG9ja3M7CisJcmV0dXJuKDApOworfQorCitpbnQgZmlsZV90eXBlKGNvbnN0IGNoYXIgKnBhdGgsIGludCAqbWFqLCBpbnQgKm1pbikKK3sKKyAJc3RydWN0IHN0YXQ2NCBidWY7CisKKwlpZihsc3RhdDY0KHBhdGgsICZidWYpIDwgMCkKKwkJcmV0dXJuKC1lcnJubyk7CisJLypXZSBjYW5ub3QgcGFzcyByZGV2IGFzIGlzIGJlY2F1c2UgZ2xpYmMgYW5kIHRoZSBrZXJuZWwgZGlzYWdyZWUKKwkgKmFib3V0IGl0cyBkZWZpbml0aW9uLiovCisJaWYobWFqICE9IE5VTEwpCisJCSptYWogPSBtYWpvcihidWYuc3RfcmRldik7CisJaWYobWluICE9IE5VTEwpCisJCSptaW4gPSBtaW5vcihidWYuc3RfcmRldik7CisKKwlpZihTX0lTRElSKGJ1Zi5zdF9tb2RlKSkgcmV0dXJuKE9TX1RZUEVfRElSKTsKKwllbHNlIGlmKFNfSVNMTksoYnVmLnN0X21vZGUpKSByZXR1cm4oT1NfVFlQRV9TWU1MSU5LKTsKKwllbHNlIGlmKFNfSVNDSFIoYnVmLnN0X21vZGUpKSByZXR1cm4oT1NfVFlQRV9DSEFSREVWKTsKKwllbHNlIGlmKFNfSVNCTEsoYnVmLnN0X21vZGUpKSByZXR1cm4oT1NfVFlQRV9CTE9DS0RFVik7CisJZWxzZSBpZihTX0lTRklGTyhidWYuc3RfbW9kZSkpcmV0dXJuKE9TX1RZUEVfRklGTyk7CisJZWxzZSBpZihTX0lTU09DSyhidWYuc3RfbW9kZSkpcmV0dXJuKE9TX1RZUEVfU09DSyk7CisJZWxzZSByZXR1cm4oT1NfVFlQRV9GSUxFKTsKK30KKworaW50IGFjY2Vzc19maWxlKGNoYXIgKnBhdGgsIGludCByLCBpbnQgdywgaW50IHgpCit7CisJaW50IG1vZGUgPSAwOworCisJaWYocikgbW9kZSA9IFJfT0s7CisJaWYodykgbW9kZSB8PSBXX09LOworCWlmKHgpIG1vZGUgfD0gWF9PSzsKKwlpZihhY2Nlc3MocGF0aCwgbW9kZSkgIT0gMCkgcmV0dXJuKC1lcnJubyk7CisJZWxzZSByZXR1cm4oMCk7Cit9CisKK2ludCBvcGVuX2ZpbGUoY2hhciAqcGF0aCwgaW50IHIsIGludCB3LCBpbnQgYXBwZW5kKQoreworCWludCBtb2RlID0gMCwgZmQ7CisKKwlpZihyICYmICF3KQorCQltb2RlID0gT19SRE9OTFk7CisJZWxzZSBpZighciAmJiB3KQorCQltb2RlID0gT19XUk9OTFk7CisJZWxzZSBpZihyICYmIHcpCisJCW1vZGUgPSBPX1JEV1I7CisJZWxzZSBwYW5pYygiSW1wb3NzaWJsZSBtb2RlIGluIG9wZW5fZmlsZSIpOworCisJaWYoYXBwZW5kKQorCQltb2RlIHw9IE9fQVBQRU5EOworCWZkID0gb3BlbjY0KHBhdGgsIG1vZGUpOworCWlmKGZkIDwgMCkgcmV0dXJuKC1lcnJubyk7CisJZWxzZSByZXR1cm4oZmQpOworfQorCit2b2lkICpvcGVuX2RpcihjaGFyICpwYXRoLCBpbnQgKmVycl9vdXQpCit7CisJRElSICpkaXI7CisKKwlkaXIgPSBvcGVuZGlyKHBhdGgpOworCSplcnJfb3V0ID0gZXJybm87CisJaWYoZGlyID09IE5VTEwpIHJldHVybihOVUxMKTsKKwlyZXR1cm4oZGlyKTsKK30KKworY2hhciAqcmVhZF9kaXIodm9pZCAqc3RyZWFtLCB1bnNpZ25lZCBsb25nIGxvbmcgKnBvcywKKwkgICAgICAgdW5zaWduZWQgbG9uZyBsb25nICppbm9fb3V0LCBpbnQgKmxlbl9vdXQpCit7CisJRElSICpkaXIgPSBzdHJlYW07CisJc3RydWN0IGRpcmVudCAqZW50OworCisJc2Vla2RpcihkaXIsICpwb3MpOworCWVudCA9IHJlYWRkaXIoZGlyKTsKKwlpZihlbnQgPT0gTlVMTCkgcmV0dXJuKE5VTEwpOworCSpsZW5fb3V0ID0gc3RybGVuKGVudC0+ZF9uYW1lKTsKKwkqaW5vX291dCA9IGVudC0+ZF9pbm87CisJKnBvcyA9IHRlbGxkaXIoZGlyKTsKKwlyZXR1cm4oZW50LT5kX25hbWUpOworfQorCitpbnQgcmVhZF9maWxlKGludCBmZCwgdW5zaWduZWQgbG9uZyBsb25nICpvZmZzZXQsIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgbjsKKworCW4gPSBwcmVhZDY0KGZkLCBidWYsIGxlbiwgKm9mZnNldCk7CisJaWYobiA8IDApIHJldHVybigtZXJybm8pOworCSpvZmZzZXQgKz0gbjsKKwlyZXR1cm4obik7Cit9CisKK2ludCB3cml0ZV9maWxlKGludCBmZCwgdW5zaWduZWQgbG9uZyBsb25nICpvZmZzZXQsIGNvbnN0IGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgbjsKKworCW4gPSBwd3JpdGU2NChmZCwgYnVmLCBsZW4sICpvZmZzZXQpOworCWlmKG4gPCAwKSByZXR1cm4oLWVycm5vKTsKKwkqb2Zmc2V0ICs9IG47CisJcmV0dXJuKG4pOworfQorCitpbnQgbHNlZWtfZmlsZShpbnQgZmQsIGxvbmcgbG9uZyBvZmZzZXQsIGludCB3aGVuY2UpCit7CisJaW50IHJldDsKKworCXJldCA9IGxzZWVrNjQoZmQsIG9mZnNldCwgd2hlbmNlKTsKKwlpZihyZXQgPCAwKSByZXR1cm4oLWVycm5vKTsKKwlyZXR1cm4oMCk7Cit9CisKK3ZvaWQgY2xvc2VfZmlsZSh2b2lkICpzdHJlYW0pCit7CisJY2xvc2UoKigoaW50ICopIHN0cmVhbSkpOworfQorCit2b2lkIGNsb3NlX2Rpcih2b2lkICpzdHJlYW0pCit7CisJY2xvc2VkaXIoc3RyZWFtKTsKK30KKworaW50IGZpbGVfY3JlYXRlKGNoYXIgKm5hbWUsIGludCB1ciwgaW50IHV3LCBpbnQgdXgsIGludCBnciwKKwkJaW50IGd3LCBpbnQgZ3gsIGludCBvciwgaW50IG93LCBpbnQgb3gpCit7CisJaW50IG1vZGUsIGZkOworCisJbW9kZSA9IDA7CisJbW9kZSB8PSB1ciA/IFNfSVJVU1IgOiAwOworCW1vZGUgfD0gdXcgPyBTX0lXVVNSIDogMDsKKwltb2RlIHw9IHV4ID8gU19JWFVTUiA6IDA7CisJbW9kZSB8PSBnciA/IFNfSVJHUlAgOiAwOworCW1vZGUgfD0gZ3cgPyBTX0lXR1JQIDogMDsKKwltb2RlIHw9IGd4ID8gU19JWEdSUCA6IDA7CisJbW9kZSB8PSBvciA/IFNfSVJPVEggOiAwOworCW1vZGUgfD0gb3cgPyBTX0lXT1RIIDogMDsKKwltb2RlIHw9IG94ID8gU19JWE9USCA6IDA7CisJZmQgPSBvcGVuNjQobmFtZSwgT19DUkVBVCB8IE9fUkRXUiwgbW9kZSk7CisJaWYoZmQgPCAwKQorCQlyZXR1cm4oLWVycm5vKTsKKwlyZXR1cm4oZmQpOworfQorCitpbnQgc2V0X2F0dHIoY29uc3QgY2hhciAqZmlsZSwgc3RydWN0IGhvc3Rmc19pYXR0ciAqYXR0cnMpCit7CisJc3RydWN0IHV0aW1idWYgYnVmOworCWludCBlcnIsIG1hOworCisJaWYoYXR0cnMtPmlhX3ZhbGlkICYgSE9TVEZTX0FUVFJfTU9ERSl7CisJCWlmKGNobW9kKGZpbGUsIGF0dHJzLT5pYV9tb2RlKSAhPSAwKSByZXR1cm4oLWVycm5vKTsKKwl9CisJaWYoYXR0cnMtPmlhX3ZhbGlkICYgSE9TVEZTX0FUVFJfVUlEKXsKKwkJaWYoY2hvd24oZmlsZSwgYXR0cnMtPmlhX3VpZCwgLTEpKSByZXR1cm4oLWVycm5vKTsKKwl9CisJaWYoYXR0cnMtPmlhX3ZhbGlkICYgSE9TVEZTX0FUVFJfR0lEKXsKKwkJaWYoY2hvd24oZmlsZSwgLTEsIGF0dHJzLT5pYV9naWQpKSByZXR1cm4oLWVycm5vKTsKKwl9CisJaWYoYXR0cnMtPmlhX3ZhbGlkICYgSE9TVEZTX0FUVFJfU0laRSl7CisJCWlmKHRydW5jYXRlKGZpbGUsIGF0dHJzLT5pYV9zaXplKSkgcmV0dXJuKC1lcnJubyk7CisJfQorCW1hID0gSE9TVEZTX0FUVFJfQVRJTUVfU0VUIHwgSE9TVEZTX0FUVFJfTVRJTUVfU0VUOworCWlmKChhdHRycy0+aWFfdmFsaWQgJiBtYSkgPT0gbWEpeworCQlidWYuYWN0aW1lID0gYXR0cnMtPmlhX2F0aW1lLnR2X3NlYzsKKwkJYnVmLm1vZHRpbWUgPSBhdHRycy0+aWFfbXRpbWUudHZfc2VjOworCQlpZih1dGltZShmaWxlLCAmYnVmKSAhPSAwKSByZXR1cm4oLWVycm5vKTsKKwl9CisJZWxzZSB7CisJCXN0cnVjdCB0aW1lc3BlYyB0czsKKworCQlpZihhdHRycy0+aWFfdmFsaWQgJiBIT1NURlNfQVRUUl9BVElNRV9TRVQpeworCQkJZXJyID0gc3RhdF9maWxlKGZpbGUsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisJCQkJCU5VTEwsIE5VTEwsICZ0cywgTlVMTCwgTlVMTCwgTlVMTCk7CisJCQlpZihlcnIgIT0gMCkKKwkJCQlyZXR1cm4oZXJyKTsKKwkJCWJ1Zi5hY3RpbWUgPSBhdHRycy0+aWFfYXRpbWUudHZfc2VjOworCQkJYnVmLm1vZHRpbWUgPSB0cy50dl9zZWM7CisJCQlpZih1dGltZShmaWxlLCAmYnVmKSAhPSAwKQorCQkJCXJldHVybigtZXJybm8pOworCQl9CisJCWlmKGF0dHJzLT5pYV92YWxpZCAmIEhPU1RGU19BVFRSX01USU1FX1NFVCl7CisJCQllcnIgPSBzdGF0X2ZpbGUoZmlsZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJCQkJTlVMTCwgJnRzLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwkJCWlmKGVyciAhPSAwKQorCQkJCXJldHVybihlcnIpOworCQkJYnVmLmFjdGltZSA9IHRzLnR2X3NlYzsKKwkJCWJ1Zi5tb2R0aW1lID0gYXR0cnMtPmlhX210aW1lLnR2X3NlYzsKKwkJCWlmKHV0aW1lKGZpbGUsICZidWYpICE9IDApCisJCQkJcmV0dXJuKC1lcnJubyk7CisJCX0KKwl9CisJaWYoYXR0cnMtPmlhX3ZhbGlkICYgSE9TVEZTX0FUVFJfQ1RJTUUpIDsKKwlpZihhdHRycy0+aWFfdmFsaWQgJiAoSE9TVEZTX0FUVFJfQVRJTUUgfCBIT1NURlNfQVRUUl9NVElNRSkpeworCQllcnIgPSBzdGF0X2ZpbGUoZmlsZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJCQkmYXR0cnMtPmlhX2F0aW1lLCAmYXR0cnMtPmlhX210aW1lLCBOVUxMLAorCQkJCU5VTEwsIE5VTEwpOworCQlpZihlcnIgIT0gMCkgcmV0dXJuKGVycik7CisJfQorCXJldHVybigwKTsKK30KKworaW50IG1ha2Vfc3ltbGluayhjb25zdCBjaGFyICpmcm9tLCBjb25zdCBjaGFyICp0bykKK3sKKwlpbnQgZXJyOworCisJZXJyID0gc3ltbGluayh0bywgZnJvbSk7CisJaWYoZXJyKSByZXR1cm4oLWVycm5vKTsKKwlyZXR1cm4oMCk7Cit9CisKK2ludCB1bmxpbmtfZmlsZShjb25zdCBjaGFyICpmaWxlKQoreworCWludCBlcnI7CisKKwllcnIgPSB1bmxpbmsoZmlsZSk7CisJaWYoZXJyKSByZXR1cm4oLWVycm5vKTsKKwlyZXR1cm4oMCk7Cit9CisKK2ludCBkb19ta2Rpcihjb25zdCBjaGFyICpmaWxlLCBpbnQgbW9kZSkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gbWtkaXIoZmlsZSwgbW9kZSk7CisJaWYoZXJyKSByZXR1cm4oLWVycm5vKTsKKwlyZXR1cm4oMCk7Cit9CisKK2ludCBkb19ybWRpcihjb25zdCBjaGFyICpmaWxlKQoreworCWludCBlcnI7CisKKwllcnIgPSBybWRpcihmaWxlKTsKKwlpZihlcnIpIHJldHVybigtZXJybm8pOworCXJldHVybigwKTsKK30KKworaW50IGRvX21rbm9kKGNvbnN0IGNoYXIgKmZpbGUsIGludCBtb2RlLCBpbnQgZGV2KQoreworCWludCBlcnI7CisKKwllcnIgPSBta25vZChmaWxlLCBtb2RlLCBkZXYpOworCWlmKGVycikgcmV0dXJuKC1lcnJubyk7CisJcmV0dXJuKDApOworfQorCitpbnQgbGlua19maWxlKGNvbnN0IGNoYXIgKnRvLCBjb25zdCBjaGFyICpmcm9tKQoreworCWludCBlcnI7CisKKwllcnIgPSBsaW5rKHRvLCBmcm9tKTsKKwlpZihlcnIpIHJldHVybigtZXJybm8pOworCXJldHVybigwKTsKK30KKworaW50IGRvX3JlYWRsaW5rKGNoYXIgKmZpbGUsIGNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisJaW50IG47CisKKwluID0gcmVhZGxpbmsoZmlsZSwgYnVmLCBzaXplKTsKKwlpZihuIDwgMCkKKwkJcmV0dXJuKC1lcnJubyk7CisJaWYobiA8IHNpemUpCisJCWJ1ZltuXSA9ICdcMCc7CisJcmV0dXJuKG4pOworfQorCitpbnQgcmVuYW1lX2ZpbGUoY2hhciAqZnJvbSwgY2hhciAqdG8pCit7CisJaW50IGVycjsKKworCWVyciA9IHJlbmFtZShmcm9tLCB0byk7CisJaWYoZXJyIDwgMCkgcmV0dXJuKC1lcnJubyk7CisJcmV0dXJuKDApOworfQorCitpbnQgZG9fc3RhdGZzKGNoYXIgKnJvb3QsIGxvbmcgKmJzaXplX291dCwgbG9uZyBsb25nICpibG9ja3Nfb3V0LAorCSAgICAgIGxvbmcgbG9uZyAqYmZyZWVfb3V0LCBsb25nIGxvbmcgKmJhdmFpbF9vdXQsCisJICAgICAgbG9uZyBsb25nICpmaWxlc19vdXQsIGxvbmcgbG9uZyAqZmZyZWVfb3V0LAorCSAgICAgIHZvaWQgKmZzaWRfb3V0LCBpbnQgZnNpZF9zaXplLCBsb25nICpuYW1lbGVuX291dCwKKwkgICAgICBsb25nICpzcGFyZV9vdXQpCit7CisJc3RydWN0IHN0YXRmczY0IGJ1ZjsKKwlpbnQgZXJyOworCisJZXJyID0gc3RhdGZzNjQocm9vdCwgJmJ1Zik7CisJaWYoZXJyIDwgMCkgcmV0dXJuKC1lcnJubyk7CisJKmJzaXplX291dCA9IGJ1Zi5mX2JzaXplOworCSpibG9ja3Nfb3V0ID0gYnVmLmZfYmxvY2tzOworCSpiZnJlZV9vdXQgPSBidWYuZl9iZnJlZTsKKwkqYmF2YWlsX291dCA9IGJ1Zi5mX2JhdmFpbDsKKwkqZmlsZXNfb3V0ID0gYnVmLmZfZmlsZXM7CisJKmZmcmVlX291dCA9IGJ1Zi5mX2ZmcmVlOworCW1lbWNweShmc2lkX291dCwgJmJ1Zi5mX2ZzaWQsCisJICAgICAgIHNpemVvZihidWYuZl9mc2lkKSA+IGZzaWRfc2l6ZSA/IGZzaWRfc2l6ZSA6CisJICAgICAgIHNpemVvZihidWYuZl9mc2lkKSk7CisJKm5hbWVsZW5fb3V0ID0gYnVmLmZfbmFtZWxlbjsKKwlzcGFyZV9vdXRbMF0gPSBidWYuZl9zcGFyZVswXTsKKwlzcGFyZV9vdXRbMV0gPSBidWYuZl9zcGFyZVsxXTsKKwlzcGFyZV9vdXRbMl0gPSBidWYuZl9zcGFyZVsyXTsKKwlzcGFyZV9vdXRbM10gPSBidWYuZl9zcGFyZVszXTsKKwlzcGFyZV9vdXRbNF0gPSBidWYuZl9zcGFyZVs0XTsKKwlzcGFyZV9vdXRbNV0gPSBidWYuZl9zcGFyZVs1XTsKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBPdmVycmlkZXMgZm9yIEVtYWNzIHNvIHRoYXQgd2UgZm9sbG93IExpbnVzJ3MgdGFiYmluZyBzdHlsZS4KKyAqIEVtYWNzIHdpbGwgbm90aWNlIHRoaXMgc3R1ZmYgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgYXV0b21hdGljYWxseQorICogYWRqdXN0IHRoZSBzZXR0aW5ncyBmb3IgdGhpcyBidWZmZXIgb25seS4gIFRoaXMgbXVzdCByZW1haW4gYXQgdGhlIGVuZAorICogb2YgdGhlIGZpbGUuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtZmlsZS1zdHlsZTogImxpbnV4IgorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9mcy9ocGZzL01ha2VmaWxlIGIvZnMvaHBmcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2I3ODZmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaHBmcy9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBocGZzIGZpbGVzeXN0ZW0gcm91dGluZXMuCisjCisKK29iai0kKENPTkZJR19IUEZTX0ZTKSArPSBocGZzLm8KKworaHBmcy1vYmpzIDo9IGFsbG9jLm8gYW5vZGUubyBidWZmZXIubyBkZW50cnkubyBkaXIubyBkbm9kZS5vIGVhLm8gZmlsZS5vIFwKKwkgICAgIGlub2RlLm8gbWFwLm8gbmFtZS5vIG5hbWVpLm8gc3VwZXIubwpkaWZmIC0tZ2l0IGEvZnMvaHBmcy9hbGxvYy5jIGIvZnMvaHBmcy9hbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MDNlMmMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ocGZzL2FsbG9jLmMKQEAgLTAsMCArMSw0NTYgQEAKKy8qCisgKiAgbGludXgvZnMvaHBmcy9hbGxvYy5jCisgKgorICogIE1pa3VsYXMgUGF0b2NrYSAobWlrdWxhc0BhcnRheC5rYXJsaW4ubWZmLmN1bmkuY3opLCAxOTk4LTE5OTkKKyAqCisgKiAgSFBGUyBiaXRtYXAgb3BlcmF0aW9ucworICovCisKKyNpbmNsdWRlICJocGZzX2ZuLmgiCisKK3N0YXRpYyBpbnQgaHBmc19hbGxvY19pZl9wb3NzaWJsZV9ub2xvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzZWNubyBzZWMpOworCisvKgorICogQ2hlY2sgaWYgYSBzZWN0b3IgaXMgYWxsb2NhdGVkIGluIGJpdG1hcAorICogVGhpcyBpcyByZWFsbHkgc2xvdy4gVHVybmVkIG9uIG9ubHkgaWYgY2hrPT0yCisgKi8KKworc3RhdGljIGludCBjaGtfaWZfYWxsb2NhdGVkKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc2Vjbm8gc2VjLCBjaGFyICptc2cpCit7CisJc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgcWJoOworCXVuc2lnbmVkICpibXA7CisJaWYgKCEoYm1wID0gaHBmc19tYXBfYml0bWFwKHMsIHNlYyA+PiAxNCwgJnFiaCwgImNoayIpKSkgZ290byBmYWlsOworCWlmICgoYm1wWyhzZWMgJiAweDNmZmYpID4+IDVdID4+IChzZWMgJiAweDFmKSkgJiAxKSB7CisJCWhwZnNfZXJyb3IocywgInNlY3RvciAnJXMnIC0gJTA4eCBub3QgYWxsb2NhdGVkIGluIGJpdG1hcCIsIG1zZywgc2VjKTsKKwkJZ290byBmYWlsMTsKKwl9CisJaHBmc19icmVsc2U0KCZxYmgpOworCWlmIChzZWMgPj0gaHBmc19zYihzKS0+c2JfZGlyYmFuZF9zdGFydCAmJiBzZWMgPCBocGZzX3NiKHMpLT5zYl9kaXJiYW5kX3N0YXJ0ICsgaHBmc19zYihzKS0+c2JfZGlyYmFuZF9zaXplKSB7CisJCXVuc2lnbmVkIHNzZWMgPSAoc2VjIC0gaHBmc19zYihzKS0+c2JfZGlyYmFuZF9zdGFydCkgLyA0OworCQlpZiAoIShibXAgPSBocGZzX21hcF9kbm9kZV9iaXRtYXAocywgJnFiaCkpKSBnb3RvIGZhaWw7CisJCWlmICgoYm1wW3NzZWMgPj4gNV0gPj4gKHNzZWMgJiAweDFmKSkgJiAxKSB7CisJCQlocGZzX2Vycm9yKHMsICJzZWN0b3IgJyVzJyAtICUwOHggbm90IGFsbG9jYXRlZCBpbiBkaXJlY3RvcnkgYml0bWFwIiwgbXNnLCBzZWMpOworCQkJZ290byBmYWlsMTsKKwkJfQorCQlocGZzX2JyZWxzZTQoJnFiaCk7CisJfQorCXJldHVybiAwOworCWZhaWwxOgorCWhwZnNfYnJlbHNlNCgmcWJoKTsKKwlmYWlsOgorCXJldHVybiAxOworfQorCisvKgorICogQ2hlY2sgaWYgc2VjdG9yKHMpIGhhdmUgcHJvcGVyIG51bWJlciBhbmQgYWRkaXRpb25hbGx5IGNoZWNrIGlmIHRoZXkncmUKKyAqIGFsbG9jYXRlZCBpbiBiaXRtYXAuCisgKi8KKwkKK2ludCBocGZzX2Noa19zZWN0b3JzKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc2Vjbm8gc3RhcnQsIGludCBsZW4sIGNoYXIgKm1zZykKK3sKKwlpZiAoc3RhcnQgKyBsZW4gPCBzdGFydCB8fCBzdGFydCA8IDB4MTIgfHwKKwkgICAgc3RhcnQgKyBsZW4gPiBocGZzX3NiKHMpLT5zYl9mc19zaXplKSB7CisJICAgIAlocGZzX2Vycm9yKHMsICJzZWN0b3IocykgJyVzJyBiYWRseSBwbGFjZWQgYXQgJTA4eCIsIG1zZywgc3RhcnQpOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKGhwZnNfc2IocyktPnNiX2Noaz49MikgeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQkJaWYgKGNoa19pZl9hbGxvY2F0ZWQocywgc3RhcnQgKyBpLCBtc2cpKSByZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzZWNubyBhbGxvY19pbl9ibXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzZWNubyBuZWFyLCB1bnNpZ25lZCBuLCB1bnNpZ25lZCBmb3J3YXJkKQoreworCXN0cnVjdCBxdWFkX2J1ZmZlcl9oZWFkIHFiaDsKKwl1bnNpZ25lZCAqYm1wOworCXVuc2lnbmVkIGJzID0gbmVhciAmIH4weDNmZmY7CisJdW5zaWduZWQgbnIgPSAobmVhciAmIDB4M2ZmZikgJiB+KG4gLSAxKTsKKwkvKnVuc2lnbmVkIG1ucjsqLworCXVuc2lnbmVkIGksIHE7CisJaW50IGEsIGI7CisJc2Vjbm8gcmV0ID0gMDsKKwlpZiAobiAhPSAxICYmIG4gIT0gNCkgeworCQlocGZzX2Vycm9yKHMsICJCYWQgYWxsb2NhdGlvbiBzaXplOiAlZCIsIG4pOworCQlyZXR1cm4gMDsKKwl9CisJbG9ja19zdXBlcihzKTsKKwlpZiAoYnMgIT0gfjB4M2ZmZikgeworCQlpZiAoIShibXAgPSBocGZzX21hcF9iaXRtYXAocywgbmVhciA+PiAxNCwgJnFiaCwgImFpYiIpKSkgZ290byB1bHM7CisJfSBlbHNlIHsKKwkJaWYgKCEoYm1wID0gaHBmc19tYXBfZG5vZGVfYml0bWFwKHMsICZxYmgpKSkgZ290byB1bHM7CisJfQorCWlmICghdHN0Yml0cyhibXAsIG5yLCBuICsgZm9yd2FyZCkpIHsKKwkJcmV0ID0gYnMgKyBucjsKKwkJZ290byBydDsKKwl9CisJLyppZiAoIXRzdGJpdHMoYm1wLCBuciArIG4sIG4gKyBmb3J3YXJkKSkgeworCQlyZXQgPSBicyArIG5yICsgbjsKKwkJZ290byBydDsKKwl9Ki8KKwlxID0gbnIgKyBuOyBiID0gMDsKKwl3aGlsZSAoKGEgPSB0c3RiaXRzKGJtcCwgcSwgbiArIGZvcndhcmQpKSAhPSAwKSB7CisJCXEgKz0gYTsKKwkJaWYgKG4gIT0gMSkgcSA9ICgocS0xKSZ+KG4tMSkpK247CisJCWlmICghYikgeworCQkJaWYgKHE+PjUgIT0gbnI+PjUpIHsKKwkJCQliID0gMTsKKwkJCQlxID0gbnIgJiAweDFmOworCQkJfQorCQl9IGVsc2UgaWYgKHEgPiBucikgYnJlYWs7CisJfQorCWlmICghYSkgeworCQlyZXQgPSBicyArIHE7CisJCWdvdG8gcnQ7CisJfQorCW5yID4+PSA1OworCS8qZm9yIChpID0gbnIgKyAxOyBpICE9IG5yOyBpKyssIGkgJj0gMHgxZmYpIHsqLworCWkgPSBucjsKKwlkbyB7CisJCWlmICghYm1wW2ldKSBnb3RvIGNvbnQ7CisJCWlmIChuICsgZm9yd2FyZCA+PSAweDNmICYmIGJtcFtpXSAhPSAtMSkgZ290byBjb250OworCQlxID0gaTw8NTsKKwkJaWYgKGkgPiAwKSB7CisJCQl1bnNpZ25lZCBrID0gYm1wW2ktMV07CisJCQl3aGlsZSAoayAmIDB4ODAwMDAwMDApIHsKKwkJCQlxLS07IGsgPDw9IDE7CisJCQl9CisJCX0KKwkJaWYgKG4gIT0gMSkgcSA9ICgocS0xKSZ+KG4tMSkpK247CisJCXdoaWxlICgoYSA9IHRzdGJpdHMoYm1wLCBxLCBuICsgZm9yd2FyZCkpICE9IDApIHsKKwkJCXEgKz0gYTsKKwkJCWlmIChuICE9IDEpIHEgPSAoKHEtMSkmfihuLTEpKStuOworCQkJaWYgKHE+PjUgPiBpKSBicmVhazsKKwkJfQorCQlpZiAoIWEpIHsKKwkJCXJldCA9IGJzICsgcTsKKwkJCWdvdG8gcnQ7CisJCX0KKwkJY29udDoKKwkJaSsrLCBpICY9IDB4MWZmOworCX0gd2hpbGUgKGkgIT0gbnIpOworCXJ0OgorCWlmIChyZXQpIHsKKwkJaWYgKGhwZnNfc2IocyktPnNiX2NoayAmJiAoKHJldCA+PiAxNCkgIT0gKGJzID4+IDE0KSB8fCAoYm1wWyhyZXQgJiAweDNmZmYpID4+IDVdIHwgfigoKDEgPDwgbikgLSAxKSA8PCAocmV0ICYgMHgxZikpKSAhPSAweGZmZmZmZmZmKSkgeworCQkJaHBmc19lcnJvcihzLCAiQWxsb2NhdGlvbiBkb2Vzbid0IHdvcmshIFdhbnRlZCAlZCwgYWxsb2NhdGVkIGF0ICUwOHgiLCBuLCByZXQpOworCQkJcmV0ID0gMDsKKwkJCWdvdG8gYjsKKwkJfQorCQlibXBbKHJldCAmIDB4M2ZmZikgPj4gNV0gJj0gfigoKDEgPDwgbikgLSAxKSA8PCAocmV0ICYgMHgxZikpOworCQlocGZzX21hcmtfNGJ1ZmZlcnNfZGlydHkoJnFiaCk7CisJfQorCWI6CisJaHBmc19icmVsc2U0KCZxYmgpOworCXVsczoKKwl1bmxvY2tfc3VwZXIocyk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEFsbG9jYXRpb24gc3RyYXRlZ3k6CTEpIHNlYXJjaCBwbGFjZSBuZWFyIHRoZSBzZWN0b3Igc3BlY2lmaWVkCisgKgkJCTIpIHNlYXJjaCBiaXRtYXAgd2hlcmUgZnJlZSBzZWN0b3JzIGxhc3QgZm91bmQKKyAqCQkJMykgc2VhcmNoIGFsbCBiaXRtYXBzCisgKgkJCTQpIHNlYXJjaCBhbGwgYml0bWFwcyBpZ25vcmluZyBudW1iZXIgb2YgcHJlLWFsbG9jYXRlZAorICoJCQkJc2VjdG9ycworICovCisKK3NlY25vIGhwZnNfYWxsb2Nfc2VjdG9yKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc2Vjbm8gbmVhciwgdW5zaWduZWQgbiwgaW50IGZvcndhcmQsIGludCBsb2NrKQoreworCXNlY25vIHNlYzsKKwlpbnQgaTsKKwl1bnNpZ25lZCBuX2JtcHM7CisJc3RydWN0IGhwZnNfc2JfaW5mbyAqc2JpID0gaHBmc19zYihzKTsKKwlpbnQgZl9wID0gMDsKKwlpbnQgbmVhcl9ibXA7CisJaWYgKGZvcndhcmQgPCAwKSB7CisJCWZvcndhcmQgPSAtZm9yd2FyZDsKKwkJZl9wID0gMTsKKwl9CisJaWYgKGxvY2spIGhwZnNfbG9ja19jcmVhdGlvbihzKTsKKwluX2JtcHMgPSAoc2JpLT5zYl9mc19zaXplICsgMHg0MDAwIC0gMSkgPj4gMTQ7CisJaWYgKG5lYXIgJiYgbmVhciA8IHNiaS0+c2JfZnNfc2l6ZSkgeworCQlpZiAoKHNlYyA9IGFsbG9jX2luX2JtcChzLCBuZWFyLCBuLCBmX3AgPyBmb3J3YXJkIDogZm9yd2FyZC80KSkpIGdvdG8gcmV0OworCQluZWFyX2JtcCA9IG5lYXIgPj4gMTQ7CisJfSBlbHNlIG5lYXJfYm1wID0gbl9ibXBzIC8gMjsKKwkvKgorCWlmIChiICE9IC0xKSB7CisJCWlmICgoc2VjID0gYWxsb2NfaW5fYm1wKHMsIGI8PDE0LCBuLCBmX3AgPyBmb3J3YXJkIDogZm9yd2FyZC8yKSkpIHsKKwkJCWIgJj0gMHgwZmZmZmZmZjsKKwkJCWdvdG8gcmV0OworCQl9CisJCWlmIChiID4gMHgxMDAwMDAwMCkgaWYgKChzZWMgPSBhbGxvY19pbl9ibXAocywgKGImMHhmZmZmZmZmKTw8MTQsIG4sIGZfcCA/IGZvcndhcmQgOiAwKSkpIGdvdG8gcmV0OworCSovCisJaWYgKCFmX3ApIGlmIChmb3J3YXJkID4gc2JpLT5zYl9tYXhfZndkX2FsbG9jKSBmb3J3YXJkID0gc2JpLT5zYl9tYXhfZndkX2FsbG9jOworCWxlc3NfZndkOgorCWZvciAoaSA9IDA7IGkgPCBuX2JtcHM7IGkrKykgeworCQlpZiAobmVhcl9ibXAraSA8IG5fYm1wcyAmJiAoKHNlYyA9IGFsbG9jX2luX2JtcChzLCAobmVhcl9ibXAraSkgPDwgMTQsIG4sIGZvcndhcmQpKSkpIHsKKwkJCXNiaS0+c2JfY19iaXRtYXAgPSBuZWFyX2JtcCtpOworCQkJZ290byByZXQ7CisJCX0JCisJCWlmICghZm9yd2FyZCkgeworCQkJaWYgKG5lYXJfYm1wLWktMSA+PSAwICYmICgoc2VjID0gYWxsb2NfaW5fYm1wKHMsIChuZWFyX2JtcC1pLTEpIDw8IDE0LCBuLCBmb3J3YXJkKSkpKSB7CisJCQkJc2JpLT5zYl9jX2JpdG1hcCA9IG5lYXJfYm1wLWktMTsKKwkJCQlnb3RvIHJldDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChuZWFyX2JtcCtpID49IG5fYm1wcyAmJiAoKHNlYyA9IGFsbG9jX2luX2JtcChzLCAobmVhcl9ibXAraS1uX2JtcHMpIDw8IDE0LCBuLCBmb3J3YXJkKSkpKSB7CisJCQkJc2JpLT5zYl9jX2JpdG1hcCA9IG5lYXJfYm1wK2ktbl9ibXBzOworCQkJCWdvdG8gcmV0OworCQkJfQorCQl9CisJCWlmIChpID09IDEgJiYgc2JpLT5zYl9jX2JpdG1hcCAhPSAtMSAmJiAoKHNlYyA9IGFsbG9jX2luX2JtcChzLCAoc2JpLT5zYl9jX2JpdG1hcCkgPDwgMTQsIG4sIGZvcndhcmQpKSkpIHsKKwkJCWdvdG8gcmV0OworCQl9CisJfQorCWlmICghZl9wKSB7CisJCWlmIChmb3J3YXJkKSB7CisJCQlzYmktPnNiX21heF9md2RfYWxsb2MgPSBmb3J3YXJkICogMyAvIDQ7CisJCQlmb3J3YXJkIC89IDI7CisJCQlnb3RvIGxlc3NfZndkOworCQl9CisJfQorCXNlYyA9IDA7CisJcmV0OgorCWlmIChzZWMgJiYgZl9wKSB7CisJCWZvciAoaSA9IDA7IGkgPCBmb3J3YXJkOyBpKyspIHsKKwkJCWlmICghaHBmc19hbGxvY19pZl9wb3NzaWJsZV9ub2xvY2socywgc2VjICsgaSArIDEpKSB7CisJCQkJaHBmc19lcnJvcihzLCAiUHJlYWxsb2MgZG9lc24ndCB3b3JrISBXYW50ZWQgJWQsIGFsbG9jYXRlZCBhdCAlMDh4LCBjYW4ndCBhbGxvY2F0ZSAlZCIsIGZvcndhcmQsIHNlYywgaSk7CisJCQkJc2VjID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlpZiAobG9jaykgaHBmc191bmxvY2tfY3JlYXRpb24ocyk7CisJcmV0dXJuIHNlYzsKK30KKworc3RhdGljIHNlY25vIGFsbG9jX2luX2RpcmJhbmQoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzZWNubyBuZWFyLCBpbnQgbG9jaykKK3sKKwl1bnNpZ25lZCBuciA9IG5lYXI7CisJc2Vjbm8gc2VjOworCXN0cnVjdCBocGZzX3NiX2luZm8gKnNiaSA9IGhwZnNfc2Iocyk7CisJaWYgKG5yIDwgc2JpLT5zYl9kaXJiYW5kX3N0YXJ0KQorCQluciA9IHNiaS0+c2JfZGlyYmFuZF9zdGFydDsKKwlpZiAobnIgPj0gc2JpLT5zYl9kaXJiYW5kX3N0YXJ0ICsgc2JpLT5zYl9kaXJiYW5kX3NpemUpCisJCW5yID0gc2JpLT5zYl9kaXJiYW5kX3N0YXJ0ICsgc2JpLT5zYl9kaXJiYW5kX3NpemUgLSA0OworCW5yIC09IHNiaS0+c2JfZGlyYmFuZF9zdGFydDsKKwluciA+Pj0gMjsKKwlpZiAobG9jaykgaHBmc19sb2NrX2NyZWF0aW9uKHMpOworCXNlYyA9IGFsbG9jX2luX2JtcChzLCAofjB4M2ZmZikgfCBuciwgMSwgMCk7CisJaWYgKGxvY2spIGhwZnNfdW5sb2NrX2NyZWF0aW9uKHMpOworCWlmICghc2VjKSByZXR1cm4gMDsKKwlyZXR1cm4gKChzZWMgJiAweDNmZmYpIDw8IDIpICsgc2JpLT5zYl9kaXJiYW5kX3N0YXJ0OworfQorCisvKiBBbGxvYyBzZWN0b3IgaWYgaXQncyBmcmVlICovCisKK3N0YXRpYyBpbnQgaHBmc19hbGxvY19pZl9wb3NzaWJsZV9ub2xvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzZWNubyBzZWMpCit7CisJc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgcWJoOworCXVuc2lnbmVkICpibXA7CisJbG9ja19zdXBlcihzKTsKKwlpZiAoIShibXAgPSBocGZzX21hcF9iaXRtYXAocywgc2VjID4+IDE0LCAmcWJoLCAiYWlwIikpKSBnb3RvIGVuZDsKKwlpZiAoYm1wWyhzZWMgJiAweDNmZmYpID4+IDVdICYgKDEgPDwgKHNlYyAmIDB4MWYpKSkgeworCQlibXBbKHNlYyAmIDB4M2ZmZikgPj4gNV0gJj0gfigxIDw8IChzZWMgJiAweDFmKSk7CisJCWhwZnNfbWFya180YnVmZmVyc19kaXJ0eSgmcWJoKTsKKwkJaHBmc19icmVsc2U0KCZxYmgpOworCQl1bmxvY2tfc3VwZXIocyk7CisJCXJldHVybiAxOworCX0KKwlocGZzX2JyZWxzZTQoJnFiaCk7CisJZW5kOgorCXVubG9ja19zdXBlcihzKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGhwZnNfYWxsb2NfaWZfcG9zc2libGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzZWNubyBzZWMpCit7CisJaW50IHI7CisJaHBmc19sb2NrX2NyZWF0aW9uKHMpOworCXIgPSBocGZzX2FsbG9jX2lmX3Bvc3NpYmxlX25vbG9jayhzLCBzZWMpOworCWhwZnNfdW5sb2NrX2NyZWF0aW9uKHMpOworCXJldHVybiByOworfQorCisvKiBGcmVlIHNlY3RvcnMgaW4gYml0bWFwcyAqLworCit2b2lkIGhwZnNfZnJlZV9zZWN0b3JzKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc2Vjbm8gc2VjLCB1bnNpZ25lZCBuKQoreworCXN0cnVjdCBxdWFkX2J1ZmZlcl9oZWFkIHFiaDsKKwl1bnNpZ25lZCAqYm1wOworCXN0cnVjdCBocGZzX3NiX2luZm8gKnNiaSA9IGhwZnNfc2Iocyk7CisJLypwcmludGsoIjIgLSAiKTsqLworCWlmICghbikgcmV0dXJuOworCWlmIChzZWMgPCAweDEyKSB7CisJCWhwZnNfZXJyb3IocywgIlRyeWluZyB0byBmcmVlIHJlc2VydmVkIHNlY3RvciAlMDh4Iiwgc2VjKTsKKwkJcmV0dXJuOworCX0KKwlsb2NrX3N1cGVyKHMpOworCXNiaS0+c2JfbWF4X2Z3ZF9hbGxvYyArPSBuID4gMHhmZmZmID8gMHhmZmZmIDogbjsKKwlpZiAoc2JpLT5zYl9tYXhfZndkX2FsbG9jID4gMHhmZmZmZmYpIHNiaS0+c2JfbWF4X2Z3ZF9hbGxvYyA9IDB4ZmZmZmZmOworCW5ld19tYXA6CisJaWYgKCEoYm1wID0gaHBmc19tYXBfYml0bWFwKHMsIHNlYyA+PiAxNCwgJnFiaCwgImZyZWUiKSkpIHsKKwkJdW5sb2NrX3N1cGVyKHMpOworCQlyZXR1cm47CisJfQkKKwluZXdfdHN0OgorCWlmICgoYm1wWyhzZWMgJiAweDNmZmYpID4+IDVdID4+IChzZWMgJiAweDFmKSAmIDEpKSB7CisJCWhwZnNfZXJyb3IocywgInNlY3RvciAlMDh4IG5vdCBhbGxvY2F0ZWQiLCBzZWMpOworCQlocGZzX2JyZWxzZTQoJnFiaCk7CisJCXVubG9ja19zdXBlcihzKTsKKwkJcmV0dXJuOworCX0KKwlibXBbKHNlYyAmIDB4M2ZmZikgPj4gNV0gfD0gMSA8PCAoc2VjICYgMHgxZik7CisJaWYgKCEtLW4pIHsKKwkJaHBmc19tYXJrXzRidWZmZXJzX2RpcnR5KCZxYmgpOworCQlocGZzX2JyZWxzZTQoJnFiaCk7CisJCXVubG9ja19zdXBlcihzKTsKKwkJcmV0dXJuOworCX0JCisJaWYgKCEoKytzZWMgJiAweDNmZmYpKSB7CisJCWhwZnNfbWFya180YnVmZmVyc19kaXJ0eSgmcWJoKTsKKwkJaHBmc19icmVsc2U0KCZxYmgpOworCQlnb3RvIG5ld19tYXA7CisJfQorCWdvdG8gbmV3X3RzdDsKK30KKworLyoKKyAqIENoZWNrIGlmIHRoZXJlIGFyZSBhdCBsZWFzdCBuIGZyZWUgZG5vZGVzIG9uIHRoZSBmaWxlc3lzdGVtLgorICogQ2FsbGVkIGJlZm9yZSBhZGRpbmcgdG8gZG5vZGUuIElmIHdlIHJ1biBvdXQgb2Ygc3BhY2Ugd2hpbGUKKyAqIHNwbGl0dGluZyBkbm9kZXMsIGl0IHdvdWxkIGNvcnJ1cHQgZG5vZGUgdHJlZS4KKyAqLworCitpbnQgaHBmc19jaGVja19mcmVlX2Rub2RlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCBuKQoreworCWludCBuX2JtcHMgPSAoaHBmc19zYihzKS0+c2JfZnNfc2l6ZSArIDB4NDAwMCAtIDEpID4+IDE0OworCWludCBiID0gaHBmc19zYihzKS0+c2JfY19iaXRtYXAgJiAweDBmZmZmZmZmOworCWludCBpLCBqOworCXVuc2lnbmVkICpibXA7CisJc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgcWJoOworCWlmICgoYm1wID0gaHBmc19tYXBfZG5vZGVfYml0bWFwKHMsICZxYmgpKSkgeworCQlmb3IgKGogPSAwOyBqIDwgNTEyOyBqKyspIHsKKwkJCXVuc2lnbmVkIGs7CisJCQlpZiAoIWJtcFtqXSkgY29udGludWU7CisJCQlmb3IgKGsgPSBibXBbal07IGs7IGsgPj49IDEpIGlmIChrICYgMSkgaWYgKCEtLW4pIHsKKwkJCQlocGZzX2JyZWxzZTQoJnFiaCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisJaHBmc19icmVsc2U0KCZxYmgpOworCWkgPSAwOworCWlmIChocGZzX3NiKHMpLT5zYl9jX2JpdG1hcCAhPSAtMSkgeworCQlibXAgPSBocGZzX21hcF9iaXRtYXAocywgYiwgJnFiaCwgImNoa2RuMSIpOworCQlnb3RvIGNoa19ibXA7CisJfQorCWNoa19uZXh0OgorCWlmIChpID09IGIpIGkrKzsKKwlpZiAoaSA+PSBuX2JtcHMpIHJldHVybiAxOworCWJtcCA9IGhwZnNfbWFwX2JpdG1hcChzLCBpLCAmcWJoLCAiY2hrZG4yIik7CisJY2hrX2JtcDoKKwlpZiAoYm1wKSB7CisJCWZvciAoaiA9IDA7IGogPCA1MTI7IGorKykgeworCQkJdW5zaWduZWQgazsKKwkJCWlmICghYm1wW2pdKSBjb250aW51ZTsKKwkJCWZvciAoayA9IDB4ZjsgazsgayA8PD0gNCkKKwkJCQlpZiAoKGJtcFtqXSAmIGspID09IGspIHsKKwkJCQkJaWYgKCEtLW4pIHsKKwkJCQkJCWhwZnNfYnJlbHNlNCgmcWJoKTsKKwkJCQkJCXJldHVybiAwOworCQkJCQl9CisJCQkJfQorCQl9CisJCWhwZnNfYnJlbHNlNCgmcWJoKTsKKwl9CisJaSsrOworCWdvdG8gY2hrX25leHQ7Cit9CisKK3ZvaWQgaHBmc19mcmVlX2Rub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgZG5vZGVfc2Vjbm8gZG5vKQoreworCWlmIChocGZzX3NiKHMpLT5zYl9jaGspIGlmIChkbm8gJiAzKSB7CisJCWhwZnNfZXJyb3IocywgImhwZnNfZnJlZV9kbm9kZTogZG5vZGUgJTA4eCBub3QgYWxpZ25lZCIsIGRubyk7CisJCXJldHVybjsKKwl9CisJaWYgKGRubyA8IGhwZnNfc2IocyktPnNiX2RpcmJhbmRfc3RhcnQgfHwKKwkgICAgZG5vID49IGhwZnNfc2IocyktPnNiX2RpcmJhbmRfc3RhcnQgKyBocGZzX3NiKHMpLT5zYl9kaXJiYW5kX3NpemUpIHsKKwkJaHBmc19mcmVlX3NlY3RvcnMocywgZG5vLCA0KTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgcXVhZF9idWZmZXJfaGVhZCBxYmg7CisJCXVuc2lnbmVkICpibXA7CisJCXVuc2lnbmVkIHNzZWMgPSAoZG5vIC0gaHBmc19zYihzKS0+c2JfZGlyYmFuZF9zdGFydCkgLyA0OworCQlsb2NrX3N1cGVyKHMpOworCQlpZiAoIShibXAgPSBocGZzX21hcF9kbm9kZV9iaXRtYXAocywgJnFiaCkpKSB7CisJCQl1bmxvY2tfc3VwZXIocyk7CisJCQlyZXR1cm47CisJCX0KKwkJYm1wW3NzZWMgPj4gNV0gfD0gMSA8PCAoc3NlYyAmIDB4MWYpOworCQlocGZzX21hcmtfNGJ1ZmZlcnNfZGlydHkoJnFiaCk7CisJCWhwZnNfYnJlbHNlNCgmcWJoKTsKKwkJdW5sb2NrX3N1cGVyKHMpOworCX0KK30KKworc3RydWN0IGRub2RlICpocGZzX2FsbG9jX2Rub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc2Vjbm8gbmVhciwKKwkJCSBkbm9kZV9zZWNubyAqZG5vLCBzdHJ1Y3QgcXVhZF9idWZmZXJfaGVhZCAqcWJoLAorCQkJIGludCBsb2NrKQoreworCXN0cnVjdCBkbm9kZSAqZDsKKwlpZiAoaHBmc19jb3VudF9vbmVfYml0bWFwKHMsIGhwZnNfc2IocyktPnNiX2RtYXApID4gRlJFRV9ETk9ERVNfQUREKSB7CisJCWlmICghKCpkbm8gPSBhbGxvY19pbl9kaXJiYW5kKHMsIG5lYXIsIGxvY2spKSkKKwkJCWlmICghKCpkbm8gPSBocGZzX2FsbG9jX3NlY3RvcihzLCBuZWFyLCA0LCAwLCBsb2NrKSkpIHJldHVybiBOVUxMOworCX0gZWxzZSB7CisJCWlmICghKCpkbm8gPSBocGZzX2FsbG9jX3NlY3RvcihzLCBuZWFyLCA0LCAwLCBsb2NrKSkpCisJCQlpZiAoISgqZG5vID0gYWxsb2NfaW5fZGlyYmFuZChzLCBuZWFyLCBsb2NrKSkpIHJldHVybiBOVUxMOworCX0KKwlpZiAoIShkID0gaHBmc19nZXRfNHNlY3RvcnMocywgKmRubywgcWJoKSkpIHsKKwkJaHBmc19mcmVlX2Rub2RlKHMsICpkbm8pOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtc2V0KGQsIDAsIDIwNDgpOworCWQtPm1hZ2ljID0gRE5PREVfTUFHSUM7CisJZC0+Zmlyc3RfZnJlZSA9IDUyOworCWQtPmRpcmVudFswXSA9IDMyOworCWQtPmRpcmVudFsyXSA9IDg7CisJZC0+ZGlyZW50WzMwXSA9IDE7CisJZC0+ZGlyZW50WzMxXSA9IDI1NTsKKwlkLT5zZWxmID0gKmRubzsKKwlyZXR1cm4gZDsKK30KKworc3RydWN0IGZub2RlICpocGZzX2FsbG9jX2Zub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc2Vjbm8gbmVhciwgZm5vZGVfc2Vjbm8gKmZubywKKwkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgpCit7CisJc3RydWN0IGZub2RlICpmOworCWlmICghKCpmbm8gPSBocGZzX2FsbG9jX3NlY3RvcihzLCBuZWFyLCAxLCBGTk9ERV9BTExPQ19GV0QsIDEpKSkgcmV0dXJuIE5VTEw7CisJaWYgKCEoZiA9IGhwZnNfZ2V0X3NlY3RvcihzLCAqZm5vLCBiaCkpKSB7CisJCWhwZnNfZnJlZV9zZWN0b3JzKHMsICpmbm8sIDEpOworCQlyZXR1cm4gTlVMTDsKKwl9CQorCW1lbXNldChmLCAwLCA1MTIpOworCWYtPm1hZ2ljID0gRk5PREVfTUFHSUM7CisJZi0+ZWFfb2ZmcyA9IDB4YzQ7CisJZi0+YnRyZWUubl9mcmVlX25vZGVzID0gODsKKwlmLT5idHJlZS5maXJzdF9mcmVlID0gODsKKwlyZXR1cm4gZjsKK30KKworc3RydWN0IGFub2RlICpocGZzX2FsbG9jX2Fub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc2Vjbm8gbmVhciwgYW5vZGVfc2Vjbm8gKmFubywKKwkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgpCit7CisJc3RydWN0IGFub2RlICphOworCWlmICghKCphbm8gPSBocGZzX2FsbG9jX3NlY3RvcihzLCBuZWFyLCAxLCBBTk9ERV9BTExPQ19GV0QsIDEpKSkgcmV0dXJuIE5VTEw7CisJaWYgKCEoYSA9IGhwZnNfZ2V0X3NlY3RvcihzLCAqYW5vLCBiaCkpKSB7CisJCWhwZnNfZnJlZV9zZWN0b3JzKHMsICphbm8sIDEpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtc2V0KGEsIDAsIDUxMik7CisJYS0+bWFnaWMgPSBBTk9ERV9NQUdJQzsKKwlhLT5zZWxmID0gKmFubzsKKwlhLT5idHJlZS5uX2ZyZWVfbm9kZXMgPSA0MDsKKwlhLT5idHJlZS5uX3VzZWRfbm9kZXMgPSAwOworCWEtPmJ0cmVlLmZpcnN0X2ZyZWUgPSA4OworCXJldHVybiBhOworfQpkaWZmIC0tZ2l0IGEvZnMvaHBmcy9hbm9kZS5jIGIvZnMvaHBmcy9hbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYTg4YzQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ocGZzL2Fub2RlLmMKQEAgLTAsMCArMSw0OTEgQEAKKy8qCisgKiAgbGludXgvZnMvaHBmcy9hbm9kZS5jCisgKgorICogIE1pa3VsYXMgUGF0b2NrYSAobWlrdWxhc0BhcnRheC5rYXJsaW4ubWZmLmN1bmkuY3opLCAxOTk4LTE5OTkKKyAqCisgKiAgaGFuZGxpbmcgSFBGUyBhbm9kZSB0cmVlIHRoYXQgY29udGFpbnMgZmlsZSBhbGxvY2F0aW9uIGluZm8KKyAqLworCisjaW5jbHVkZSAiaHBmc19mbi5oIgorCisvKiBGaW5kIGEgc2VjdG9yIGluIGFsbG9jYXRpb24gdHJlZSAqLworCitzZWNubyBocGZzX2JwbHVzX2xvb2t1cChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCSAgIHN0cnVjdCBicGx1c19oZWFkZXIgKmJ0cmVlLCB1bnNpZ25lZCBzZWMsCisJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJYW5vZGVfc2Vjbm8gYSA9IC0xOworCXN0cnVjdCBhbm9kZSAqYW5vZGU7CisJaW50IGk7CisJaW50IGMxLCBjMiA9IDA7CisJZ29fZG93bjoKKwlpZiAoaHBmc19zYihzKS0+c2JfY2hrKSBpZiAoaHBmc19zdG9wX2N5Y2xlcyhzLCBhLCAmYzEsICZjMiwgImhwZnNfYnBsdXNfbG9va3VwIikpIHJldHVybiAtMTsKKwlpZiAoYnRyZWUtPmludGVybmFsKSB7CisJCWZvciAoaSA9IDA7IGkgPCBidHJlZS0+bl91c2VkX25vZGVzOyBpKyspCisJCQlpZiAoYnRyZWUtPnUuaW50ZXJuYWxbaV0uZmlsZV9zZWNubyA+IHNlYykgeworCQkJCWEgPSBidHJlZS0+dS5pbnRlcm5hbFtpXS5kb3duOworCQkJCWJyZWxzZShiaCk7CisJCQkJaWYgKCEoYW5vZGUgPSBocGZzX21hcF9hbm9kZShzLCBhLCAmYmgpKSkgcmV0dXJuIC0xOworCQkJCWJ0cmVlID0gJmFub2RlLT5idHJlZTsKKwkJCQlnb3RvIGdvX2Rvd247CisJCQl9CisJCWhwZnNfZXJyb3IocywgInNlY3RvciAlMDh4IG5vdCBmb3VuZCBpbiBpbnRlcm5hbCBhbm9kZSAlMDh4Iiwgc2VjLCBhKTsKKwkJYnJlbHNlKGJoKTsKKwkJcmV0dXJuIC0xOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgYnRyZWUtPm5fdXNlZF9ub2RlczsgaSsrKQorCQlpZiAoYnRyZWUtPnUuZXh0ZXJuYWxbaV0uZmlsZV9zZWNubyA8PSBzZWMgJiYKKwkJICAgIGJ0cmVlLT51LmV4dGVybmFsW2ldLmZpbGVfc2Vjbm8gKyBidHJlZS0+dS5leHRlcm5hbFtpXS5sZW5ndGggPiBzZWMpIHsKKwkJCWEgPSBidHJlZS0+dS5leHRlcm5hbFtpXS5kaXNrX3NlY25vICsgc2VjIC0gYnRyZWUtPnUuZXh0ZXJuYWxbaV0uZmlsZV9zZWNubzsKKwkJCWlmIChocGZzX3NiKHMpLT5zYl9jaGspIGlmIChocGZzX2Noa19zZWN0b3JzKHMsIGEsIDEsICJkYXRhIikpIHsKKwkJCQlicmVsc2UoYmgpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChpbm9kZSkgeworCQkJCXN0cnVjdCBocGZzX2lub2RlX2luZm8gKmhwZnNfaW5vZGUgPSBocGZzX2koaW5vZGUpOworCQkJCWhwZnNfaW5vZGUtPmlfZmlsZV9zZWMgPSBidHJlZS0+dS5leHRlcm5hbFtpXS5maWxlX3NlY25vOworCQkJCWhwZnNfaW5vZGUtPmlfZGlza19zZWMgPSBidHJlZS0+dS5leHRlcm5hbFtpXS5kaXNrX3NlY25vOworCQkJCWhwZnNfaW5vZGUtPmlfbl9zZWNzID0gYnRyZWUtPnUuZXh0ZXJuYWxbaV0ubGVuZ3RoOworCQkJfQorCQkJYnJlbHNlKGJoKTsKKwkJCXJldHVybiBhOworCQl9CisJaHBmc19lcnJvcihzLCAic2VjdG9yICUwOHggbm90IGZvdW5kIGluIGV4dGVybmFsIGFub2RlICUwOHgiLCBzZWMsIGEpOworCWJyZWxzZShiaCk7CisJcmV0dXJuIC0xOworfQorCisvKiBBZGQgYSBzZWN0b3IgdG8gdHJlZSAqLworCitzZWNubyBocGZzX2FkZF9zZWN0b3JfdG9fYnRyZWUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzZWNubyBub2RlLCBpbnQgZm5vZCwgdW5zaWduZWQgZnNlY25vKQoreworCXN0cnVjdCBicGx1c19oZWFkZXIgKmJ0cmVlOworCXN0cnVjdCBhbm9kZSAqYW5vZGUgPSBOVUxMLCAqcmFub2RlID0gTlVMTDsKKwlzdHJ1Y3QgZm5vZGUgKmZub2RlOworCWFub2RlX3NlY25vIGEsIG5hID0gLTEsIHJhLCB1cCA9IC0xOworCXNlY25vIHNlOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICpiaDEsICpiaDI7CisJaW50IG47CisJdW5zaWduZWQgZnM7CisJaW50IGMxLCBjMiA9IDA7CisJaWYgKGZub2QpIHsKKwkJaWYgKCEoZm5vZGUgPSBocGZzX21hcF9mbm9kZShzLCBub2RlLCAmYmgpKSkgcmV0dXJuIC0xOworCQlidHJlZSA9ICZmbm9kZS0+YnRyZWU7CisJfSBlbHNlIHsKKwkJaWYgKCEoYW5vZGUgPSBocGZzX21hcF9hbm9kZShzLCBub2RlLCAmYmgpKSkgcmV0dXJuIC0xOworCQlidHJlZSA9ICZhbm9kZS0+YnRyZWU7CisJfQorCWEgPSBub2RlOworCWdvX2Rvd246CisJaWYgKChuID0gYnRyZWUtPm5fdXNlZF9ub2RlcyAtIDEpIDwgLSEhZm5vZCkgeworCQlocGZzX2Vycm9yKHMsICJhbm9kZSAlMDh4IGhhcyBubyBlbnRyaWVzIiwgYSk7CisJCWJyZWxzZShiaCk7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKGJ0cmVlLT5pbnRlcm5hbCkgeworCQlhID0gYnRyZWUtPnUuaW50ZXJuYWxbbl0uZG93bjsKKwkJYnRyZWUtPnUuaW50ZXJuYWxbbl0uZmlsZV9zZWNubyA9IC0xOworCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCWJyZWxzZShiaCk7CisJCWlmIChocGZzX3NiKHMpLT5zYl9jaGspCisJCQlpZiAoaHBmc19zdG9wX2N5Y2xlcyhzLCBhLCAmYzEsICZjMiwgImhwZnNfYWRkX3NlY3Rvcl90b19idHJlZSAjMSIpKSByZXR1cm4gLTE7CisJCWlmICghKGFub2RlID0gaHBmc19tYXBfYW5vZGUocywgYSwgJmJoKSkpIHJldHVybiAtMTsKKwkJYnRyZWUgPSAmYW5vZGUtPmJ0cmVlOworCQlnb3RvIGdvX2Rvd247CisJfQorCWlmIChuID49IDApIHsKKwkJaWYgKGJ0cmVlLT51LmV4dGVybmFsW25dLmZpbGVfc2Vjbm8gKyBidHJlZS0+dS5leHRlcm5hbFtuXS5sZW5ndGggIT0gZnNlY25vKSB7CisJCQlocGZzX2Vycm9yKHMsICJhbGxvY2F0ZWQgc2l6ZSAlMDh4LCB0cnlpbmcgdG8gYWRkIHNlY3RvciAlMDh4LCAlY25vZGUgJTA4eCIsCisJCQkJYnRyZWUtPnUuZXh0ZXJuYWxbbl0uZmlsZV9zZWNubyArIGJ0cmVlLT51LmV4dGVybmFsW25dLmxlbmd0aCwgZnNlY25vLAorCQkJCWZub2Q/J2YnOidhJywgbm9kZSk7CisJCQlicmVsc2UoYmgpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmIChocGZzX2FsbG9jX2lmX3Bvc3NpYmxlKHMsIHNlID0gYnRyZWUtPnUuZXh0ZXJuYWxbbl0uZGlza19zZWNubyArIGJ0cmVlLT51LmV4dGVybmFsW25dLmxlbmd0aCkpIHsKKwkJCWJ0cmVlLT51LmV4dGVybmFsW25dLmxlbmd0aCsrOworCQkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQkJYnJlbHNlKGJoKTsKKwkJCXJldHVybiBzZTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChmc2Vjbm8pIHsKKwkJCWhwZnNfZXJyb3IocywgImVtcHR5IGZpbGUgJTA4eCwgdHJ5aW5nIHRvIGFkZCBzZWN0b3IgJTA4eCIsIG5vZGUsIGZzZWNubyk7CisJCQlicmVsc2UoYmgpOworCQkJcmV0dXJuIC0xOworCQl9CisJCXNlID0gIWZub2QgPyBub2RlIDogKG5vZGUgKyAxNjM4NCkgJiB+MTYzODM7CisJfQkKKwlpZiAoIShzZSA9IGhwZnNfYWxsb2Nfc2VjdG9yKHMsIHNlLCAxLCBmc2Vjbm8qQUxMT0NfTT5BTExPQ19GV0RfTUFYID8gQUxMT0NfRldEX01BWCA6IGZzZWNubypBTExPQ19NPEFMTE9DX0ZXRF9NSU4gPyBBTExPQ19GV0RfTUlOIDogZnNlY25vKkFMTE9DX00sIDEpKSkgeworCQlicmVsc2UoYmgpOworCQlyZXR1cm4gLTE7CisJfQorCWZzID0gbiA8IDAgPyAwIDogYnRyZWUtPnUuZXh0ZXJuYWxbbl0uZmlsZV9zZWNubyArIGJ0cmVlLT51LmV4dGVybmFsW25dLmxlbmd0aDsKKwlpZiAoIWJ0cmVlLT5uX2ZyZWVfbm9kZXMpIHsKKwkJdXAgPSBhICE9IG5vZGUgPyBhbm9kZS0+dXAgOiAtMTsKKwkJaWYgKCEoYW5vZGUgPSBocGZzX2FsbG9jX2Fub2RlKHMsIGEsICZuYSwgJmJoMSkpKSB7CisJCQlicmVsc2UoYmgpOworCQkJaHBmc19mcmVlX3NlY3RvcnMocywgc2UsIDEpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmIChhID09IG5vZGUgJiYgZm5vZCkgeworCQkJYW5vZGUtPnVwID0gbm9kZTsKKwkJCWFub2RlLT5idHJlZS5mbm9kZV9wYXJlbnQgPSAxOworCQkJYW5vZGUtPmJ0cmVlLm5fdXNlZF9ub2RlcyA9IGJ0cmVlLT5uX3VzZWRfbm9kZXM7CisJCQlhbm9kZS0+YnRyZWUuZmlyc3RfZnJlZSA9IGJ0cmVlLT5maXJzdF9mcmVlOworCQkJYW5vZGUtPmJ0cmVlLm5fZnJlZV9ub2RlcyA9IDQwIC0gYW5vZGUtPmJ0cmVlLm5fdXNlZF9ub2RlczsKKwkJCW1lbWNweSgmYW5vZGUtPnUsICZidHJlZS0+dSwgYnRyZWUtPm5fdXNlZF9ub2RlcyAqIDEyKTsKKwkJCWJ0cmVlLT5pbnRlcm5hbCA9IDE7CisJCQlidHJlZS0+bl9mcmVlX25vZGVzID0gMTE7CisJCQlidHJlZS0+bl91c2VkX25vZGVzID0gMTsKKwkJCWJ0cmVlLT5maXJzdF9mcmVlID0gKGNoYXIgKikmKGJ0cmVlLT51LmludGVybmFsWzFdKSAtIChjaGFyICopYnRyZWU7CisJCQlidHJlZS0+dS5pbnRlcm5hbFswXS5maWxlX3NlY25vID0gLTE7CisJCQlidHJlZS0+dS5pbnRlcm5hbFswXS5kb3duID0gbmE7CisJCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCX0gZWxzZSBpZiAoIShyYW5vZGUgPSBocGZzX2FsbG9jX2Fub2RlKHMsIC8qYSovMCwgJnJhLCAmYmgyKSkpIHsKKwkJCWJyZWxzZShiaCk7CisJCQlicmVsc2UoYmgxKTsKKwkJCWhwZnNfZnJlZV9zZWN0b3JzKHMsIHNlLCAxKTsKKwkJCWhwZnNfZnJlZV9zZWN0b3JzKHMsIG5hLCAxKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlicmVsc2UoYmgpOworCQliaCA9IGJoMTsKKwkJYnRyZWUgPSAmYW5vZGUtPmJ0cmVlOworCX0KKwlidHJlZS0+bl9mcmVlX25vZGVzLS07IG4gPSBidHJlZS0+bl91c2VkX25vZGVzKys7CisJYnRyZWUtPmZpcnN0X2ZyZWUgKz0gMTI7CisJYnRyZWUtPnUuZXh0ZXJuYWxbbl0uZGlza19zZWNubyA9IHNlOworCWJ0cmVlLT51LmV4dGVybmFsW25dLmZpbGVfc2Vjbm8gPSBmczsKKwlidHJlZS0+dS5leHRlcm5hbFtuXS5sZW5ndGggPSAxOworCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwlicmVsc2UoYmgpOworCWlmICgoYSA9PSBub2RlICYmIGZub2QpIHx8IG5hID09IC0xKSByZXR1cm4gc2U7CisJYzIgPSAwOworCXdoaWxlICh1cCAhPSAtMSkgeworCQlzdHJ1Y3QgYW5vZGUgKm5ld19hbm9kZTsKKwkJaWYgKGhwZnNfc2IocyktPnNiX2NoaykKKwkJCWlmIChocGZzX3N0b3BfY3ljbGVzKHMsIHVwLCAmYzEsICZjMiwgImhwZnNfYWRkX3NlY3Rvcl90b19idHJlZSAjMiIpKSByZXR1cm4gLTE7CisJCWlmICh1cCAhPSBub2RlIHx8ICFmbm9kKSB7CisJCQlpZiAoIShhbm9kZSA9IGhwZnNfbWFwX2Fub2RlKHMsIHVwLCAmYmgpKSkgcmV0dXJuIC0xOworCQkJYnRyZWUgPSAmYW5vZGUtPmJ0cmVlOworCQl9IGVsc2UgeworCQkJaWYgKCEoZm5vZGUgPSBocGZzX21hcF9mbm9kZShzLCB1cCwgJmJoKSkpIHJldHVybiAtMTsKKwkJCWJ0cmVlID0gJmZub2RlLT5idHJlZTsKKwkJfQorCQlpZiAoYnRyZWUtPm5fZnJlZV9ub2RlcykgeworCQkJYnRyZWUtPm5fZnJlZV9ub2Rlcy0tOyBuID0gYnRyZWUtPm5fdXNlZF9ub2RlcysrOworCQkJYnRyZWUtPmZpcnN0X2ZyZWUgKz0gODsKKwkJCWJ0cmVlLT51LmludGVybmFsW25dLmZpbGVfc2Vjbm8gPSAtMTsKKwkJCWJ0cmVlLT51LmludGVybmFsW25dLmRvd24gPSBuYTsKKwkJCWJ0cmVlLT51LmludGVybmFsW24tMV0uZmlsZV9zZWNubyA9IGZzOworCQkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQkJYnJlbHNlKGJoKTsKKwkJCWJyZWxzZShiaDIpOworCQkJaHBmc19mcmVlX3NlY3RvcnMocywgcmEsIDEpOworCQkJaWYgKChhbm9kZSA9IGhwZnNfbWFwX2Fub2RlKHMsIG5hLCAmYmgpKSkgeworCQkJCWFub2RlLT51cCA9IHVwOworCQkJCWFub2RlLT5idHJlZS5mbm9kZV9wYXJlbnQgPSB1cCA9PSBub2RlICYmIGZub2Q7CisJCQkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQkJCWJyZWxzZShiaCk7CisJCQl9CisJCQlyZXR1cm4gc2U7CisJCX0KKwkJdXAgPSB1cCAhPSBub2RlID8gYW5vZGUtPnVwIDogLTE7CisJCWJ0cmVlLT51LmludGVybmFsW2J0cmVlLT5uX3VzZWRfbm9kZXMgLSAxXS5maWxlX3NlY25vID0gLypmcyovLTE7CisJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwkJYnJlbHNlKGJoKTsKKwkJYSA9IG5hOworCQlpZiAoKG5ld19hbm9kZSA9IGhwZnNfYWxsb2NfYW5vZGUocywgYSwgJm5hLCAmYmgpKSkgeworCQkJYW5vZGUgPSBuZXdfYW5vZGU7CisJCQkvKmFub2RlLT51cCA9IHVwICE9IC0xID8gdXAgOiByYTsqLworCQkJYW5vZGUtPmJ0cmVlLmludGVybmFsID0gMTsKKwkJCWFub2RlLT5idHJlZS5uX3VzZWRfbm9kZXMgPSAxOworCQkJYW5vZGUtPmJ0cmVlLm5fZnJlZV9ub2RlcyA9IDU5OworCQkJYW5vZGUtPmJ0cmVlLmZpcnN0X2ZyZWUgPSAxNjsKKwkJCWFub2RlLT5idHJlZS51LmludGVybmFsWzBdLmRvd24gPSBhOworCQkJYW5vZGUtPmJ0cmVlLnUuaW50ZXJuYWxbMF0uZmlsZV9zZWNubyA9IC0xOworCQkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQkJYnJlbHNlKGJoKTsKKwkJCWlmICgoYW5vZGUgPSBocGZzX21hcF9hbm9kZShzLCBhLCAmYmgpKSkgeworCQkJCWFub2RlLT51cCA9IG5hOworCQkJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwkJCQlicmVsc2UoYmgpOworCQkJfQorCQl9IGVsc2UgbmEgPSBhOworCX0KKwlpZiAoKGFub2RlID0gaHBmc19tYXBfYW5vZGUocywgbmEsICZiaCkpKSB7CisJCWFub2RlLT51cCA9IG5vZGU7CisJCWlmIChmbm9kKSBhbm9kZS0+YnRyZWUuZm5vZGVfcGFyZW50ID0gMTsKKwkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQlicmVsc2UoYmgpOworCX0KKwlpZiAoIWZub2QpIHsKKwkJaWYgKCEoYW5vZGUgPSBocGZzX21hcF9hbm9kZShzLCBub2RlLCAmYmgpKSkgeworCQkJYnJlbHNlKGJoMik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJYnRyZWUgPSAmYW5vZGUtPmJ0cmVlOworCX0gZWxzZSB7CisJCWlmICghKGZub2RlID0gaHBmc19tYXBfZm5vZGUocywgbm9kZSwgJmJoKSkpIHsKKwkJCWJyZWxzZShiaDIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWJ0cmVlID0gJmZub2RlLT5idHJlZTsKKwl9CisJcmFub2RlLT51cCA9IG5vZGU7CisJbWVtY3B5KCZyYW5vZGUtPmJ0cmVlLCBidHJlZSwgYnRyZWUtPmZpcnN0X2ZyZWUpOworCWlmIChmbm9kKSByYW5vZGUtPmJ0cmVlLmZub2RlX3BhcmVudCA9IDE7CisJcmFub2RlLT5idHJlZS5uX2ZyZWVfbm9kZXMgPSAocmFub2RlLT5idHJlZS5pbnRlcm5hbCA/IDYwIDogNDApIC0gcmFub2RlLT5idHJlZS5uX3VzZWRfbm9kZXM7CisJaWYgKHJhbm9kZS0+YnRyZWUuaW50ZXJuYWwpIGZvciAobiA9IDA7IG4gPCByYW5vZGUtPmJ0cmVlLm5fdXNlZF9ub2RlczsgbisrKSB7CisJCXN0cnVjdCBhbm9kZSAqdW5vZGU7CisJCWlmICgodW5vZGUgPSBocGZzX21hcF9hbm9kZShzLCByYW5vZGUtPnUuaW50ZXJuYWxbbl0uZG93biwgJmJoMSkpKSB7CisJCQl1bm9kZS0+dXAgPSByYTsKKwkJCXVub2RlLT5idHJlZS5mbm9kZV9wYXJlbnQgPSAwOworCQkJbWFya19idWZmZXJfZGlydHkoYmgxKTsKKwkJCWJyZWxzZShiaDEpOworCQl9CisJfQorCWJ0cmVlLT5pbnRlcm5hbCA9IDE7CisJYnRyZWUtPm5fZnJlZV9ub2RlcyA9IGZub2QgPyAxMCA6IDU4OworCWJ0cmVlLT5uX3VzZWRfbm9kZXMgPSAyOworCWJ0cmVlLT5maXJzdF9mcmVlID0gKGNoYXIgKikmYnRyZWUtPnUuaW50ZXJuYWxbMl0gLSAoY2hhciAqKWJ0cmVlOworCWJ0cmVlLT51LmludGVybmFsWzBdLmZpbGVfc2Vjbm8gPSBmczsKKwlidHJlZS0+dS5pbnRlcm5hbFswXS5kb3duID0gcmE7CisJYnRyZWUtPnUuaW50ZXJuYWxbMV0uZmlsZV9zZWNubyA9IC0xOworCWJ0cmVlLT51LmludGVybmFsWzFdLmRvd24gPSBuYTsKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJYnJlbHNlKGJoKTsKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaDIpOworCWJyZWxzZShiaDIpOworCXJldHVybiBzZTsKK30KKworLyoKKyAqIFJlbW92ZSBhbGxvY2F0aW9uIHRyZWUuIFJlY3Vyc2lvbiB3b3VsZCBsb29rIG11Y2ggbmljZXIgYnV0CisgKiBJIHdhbnQgdG8gYXZvaWQgaXQgYmVjYXVzZSBpdCBjYW4gY2F1c2Ugc3RhY2sgb3ZlcmZsb3cuCisgKi8KKwordm9pZCBocGZzX3JlbW92ZV9idHJlZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHN0cnVjdCBicGx1c19oZWFkZXIgKmJ0cmVlKQoreworCXN0cnVjdCBicGx1c19oZWFkZXIgKmJ0cmVlMSA9IGJ0cmVlOworCXN0cnVjdCBhbm9kZSAqYW5vZGUgPSBOVUxMOworCWFub2RlX3NlY25vIGFubyA9IDAsIG9hbm87CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlpbnQgbGV2ZWwgPSAwOworCWludCBwb3MgPSAwOworCWludCBpOworCWludCBjMSwgYzIgPSAwOworCWludCBkMSwgZDI7CisJZ29fZG93bjoKKwlkMiA9IDA7CisJd2hpbGUgKGJ0cmVlMS0+aW50ZXJuYWwpIHsKKwkJYW5vID0gYnRyZWUxLT51LmludGVybmFsW3Bvc10uZG93bjsKKwkJaWYgKGxldmVsKSBicmVsc2UoYmgpOworCQlpZiAoaHBmc19zYihzKS0+c2JfY2hrKQorCQkJaWYgKGhwZnNfc3RvcF9jeWNsZXMocywgYW5vLCAmZDEsICZkMiwgImhwZnNfcmVtb3ZlX2J0cmVlICMxIikpCisJCQkJcmV0dXJuOworCQlpZiAoIShhbm9kZSA9IGhwZnNfbWFwX2Fub2RlKHMsIGFubywgJmJoKSkpIHJldHVybjsKKwkJYnRyZWUxID0gJmFub2RlLT5idHJlZTsKKwkJbGV2ZWwrKzsKKwkJcG9zID0gMDsKKwl9CisJZm9yIChpID0gMDsgaSA8IGJ0cmVlMS0+bl91c2VkX25vZGVzOyBpKyspCisJCWhwZnNfZnJlZV9zZWN0b3JzKHMsIGJ0cmVlMS0+dS5leHRlcm5hbFtpXS5kaXNrX3NlY25vLCBidHJlZTEtPnUuZXh0ZXJuYWxbaV0ubGVuZ3RoKTsKKwlnb191cDoKKwlpZiAoIWxldmVsKSByZXR1cm47CisJYnJlbHNlKGJoKTsKKwlpZiAoaHBmc19zYihzKS0+c2JfY2hrKQorCQlpZiAoaHBmc19zdG9wX2N5Y2xlcyhzLCBhbm8sICZjMSwgJmMyLCAiaHBmc19yZW1vdmVfYnRyZWUgIzIiKSkgcmV0dXJuOworCWhwZnNfZnJlZV9zZWN0b3JzKHMsIGFubywgMSk7CisJb2FubyA9IGFubzsKKwlhbm8gPSBhbm9kZS0+dXA7CisJaWYgKC0tbGV2ZWwpIHsKKwkJaWYgKCEoYW5vZGUgPSBocGZzX21hcF9hbm9kZShzLCBhbm8sICZiaCkpKSByZXR1cm47CisJCWJ0cmVlMSA9ICZhbm9kZS0+YnRyZWU7CisJfSBlbHNlIGJ0cmVlMSA9IGJ0cmVlOworCWZvciAoaSA9IDA7IGkgPCBidHJlZTEtPm5fdXNlZF9ub2RlczsgaSsrKSB7CisJCWlmIChidHJlZTEtPnUuaW50ZXJuYWxbaV0uZG93biA9PSBvYW5vKSB7CisJCQlpZiAoKHBvcyA9IGkgKyAxKSA8IGJ0cmVlMS0+bl91c2VkX25vZGVzKQorCQkJCWdvdG8gZ29fZG93bjsKKwkJCWVsc2UKKwkJCQlnb3RvIGdvX3VwOworCQl9CisJfQorCWhwZnNfZXJyb3IocywKKwkJICAgInJlZmVyZW5jZSB0byBhbm9kZSAlMDh4IG5vdCBmb3VuZCBpbiBhbm9kZSAlMDh4ICIKKwkJICAgIihwcm9iYWJseSBiYWQgdXAgcG9pbnRlcikiLAorCQkgICBvYW5vLCBsZXZlbCA/IGFubyA6IC0xKTsKKwlpZiAobGV2ZWwpCisJCWJyZWxzZShiaCk7Cit9CisKKy8qIEp1c3QgYSB3cmFwcGVyIGFyb3VuZCBocGZzX2JwbHVzX2xvb2t1cCAuLiB1c2VkIGZvciByZWFkaW5nIGVhcyAqLworCitzdGF0aWMgc2Vjbm8gYW5vZGVfbG9va3VwKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgYW5vZGVfc2Vjbm8gYSwgdW5zaWduZWQgc2VjKQoreworCXN0cnVjdCBhbm9kZSAqYW5vZGU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlpZiAoIShhbm9kZSA9IGhwZnNfbWFwX2Fub2RlKHMsIGEsICZiaCkpKSByZXR1cm4gLTE7CisJcmV0dXJuIGhwZnNfYnBsdXNfbG9va3VwKHMsIE5VTEwsICZhbm9kZS0+YnRyZWUsIHNlYywgYmgpOworfQorCitpbnQgaHBmc19lYV9yZWFkKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc2Vjbm8gYSwgaW50IGFubywgdW5zaWduZWQgcG9zLAorCSAgICB1bnNpZ25lZCBsZW4sIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWNoYXIgKmRhdGE7CisJc2Vjbm8gc2VjOworCXVuc2lnbmVkIGw7CisJd2hpbGUgKGxlbikgeworCQlpZiAoYW5vKSB7CisJCQlpZiAoKHNlYyA9IGFub2RlX2xvb2t1cChzLCBhLCBwb3MgPj4gOSkpID09IC0xKQorCQkJCXJldHVybiAtMTsKKwkJfSBlbHNlIHNlYyA9IGEgKyAocG9zID4+IDkpOworCQlpZiAoaHBmc19zYihzKS0+c2JfY2hrKSBpZiAoaHBmc19jaGtfc2VjdG9ycyhzLCBzZWMsIDEsICJlYSAjMSIpKSByZXR1cm4gLTE7CisJCWlmICghKGRhdGEgPSBocGZzX21hcF9zZWN0b3Iocywgc2VjLCAmYmgsIChsZW4gLSAxKSA+PiA5KSkpCisJCQlyZXR1cm4gLTE7CisJCWwgPSAweDIwMCAtIChwb3MgJiAweDFmZik7IGlmIChsID4gbGVuKSBsID0gbGVuOworCQltZW1jcHkoYnVmLCBkYXRhICsgKHBvcyAmIDB4MWZmKSwgbCk7CisJCWJyZWxzZShiaCk7CisJCWJ1ZiArPSBsOyBwb3MgKz0gbDsgbGVuIC09IGw7CisJfQorCXJldHVybiAwOworfQorCitpbnQgaHBmc19lYV93cml0ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHNlY25vIGEsIGludCBhbm8sIHVuc2lnbmVkIHBvcywKKwkgICAgIHVuc2lnbmVkIGxlbiwgY2hhciAqYnVmKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJY2hhciAqZGF0YTsKKwlzZWNubyBzZWM7CisJdW5zaWduZWQgbDsKKwl3aGlsZSAobGVuKSB7CisJCWlmIChhbm8pIHsKKwkJCWlmICgoc2VjID0gYW5vZGVfbG9va3VwKHMsIGEsIHBvcyA+PiA5KSkgPT0gLTEpCisJCQkJcmV0dXJuIC0xOworCQl9IGVsc2Ugc2VjID0gYSArIChwb3MgPj4gOSk7CisJCWlmIChocGZzX3NiKHMpLT5zYl9jaGspIGlmIChocGZzX2Noa19zZWN0b3JzKHMsIHNlYywgMSwgImVhICMyIikpIHJldHVybiAtMTsKKwkJaWYgKCEoZGF0YSA9IGhwZnNfbWFwX3NlY3RvcihzLCBzZWMsICZiaCwgKGxlbiAtIDEpID4+IDkpKSkKKwkJCXJldHVybiAtMTsKKwkJbCA9IDB4MjAwIC0gKHBvcyAmIDB4MWZmKTsgaWYgKGwgPiBsZW4pIGwgPSBsZW47CisJCW1lbWNweShkYXRhICsgKHBvcyAmIDB4MWZmKSwgYnVmLCBsKTsKKwkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQlicmVsc2UoYmgpOworCQlidWYgKz0gbDsgcG9zICs9IGw7IGxlbiAtPSBsOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBocGZzX2VhX3JlbW92ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHNlY25vIGEsIGludCBhbm8sIHVuc2lnbmVkIGxlbikKK3sKKwlzdHJ1Y3QgYW5vZGUgKmFub2RlOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaWYgKGFubykgeworCQlpZiAoIShhbm9kZSA9IGhwZnNfbWFwX2Fub2RlKHMsIGEsICZiaCkpKSByZXR1cm47CisJCWhwZnNfcmVtb3ZlX2J0cmVlKHMsICZhbm9kZS0+YnRyZWUpOworCQlicmVsc2UoYmgpOworCQlocGZzX2ZyZWVfc2VjdG9ycyhzLCBhLCAxKTsKKwl9IGVsc2UgaHBmc19mcmVlX3NlY3RvcnMocywgYSwgKGxlbiArIDUxMSkgPj4gOSk7Cit9CisKKy8qIFRydW5jYXRlIGFsbG9jYXRpb24gdHJlZS4gRG9lc24ndCBqb2luIGFub2RlcyAtIEkgaG9wZSBpdCBkb2Vzbid0IG1hdHRlciAqLworCit2b2lkIGhwZnNfdHJ1bmNhdGVfYnRyZWUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzZWNubyBmLCBpbnQgZm5vLCB1bnNpZ25lZCBzZWNzKQoreworCXN0cnVjdCBmbm9kZSAqZm5vZGU7CisJc3RydWN0IGFub2RlICphbm9kZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBicGx1c19oZWFkZXIgKmJ0cmVlOworCWFub2RlX3NlY25vIG5vZGUgPSBmOworCWludCBpLCBqLCBub2RlczsKKwlpbnQgYzEsIGMyID0gMDsKKwlpZiAoZm5vKSB7CisJCWlmICghKGZub2RlID0gaHBmc19tYXBfZm5vZGUocywgZiwgJmJoKSkpIHJldHVybjsKKwkJYnRyZWUgPSAmZm5vZGUtPmJ0cmVlOworCX0gZWxzZSB7CisJCWlmICghKGFub2RlID0gaHBmc19tYXBfYW5vZGUocywgZiwgJmJoKSkpIHJldHVybjsKKwkJYnRyZWUgPSAmYW5vZGUtPmJ0cmVlOworCX0KKwlpZiAoIXNlY3MpIHsKKwkJaHBmc19yZW1vdmVfYnRyZWUocywgYnRyZWUpOworCQlpZiAoZm5vKSB7CisJCQlidHJlZS0+bl9mcmVlX25vZGVzID0gODsKKwkJCWJ0cmVlLT5uX3VzZWRfbm9kZXMgPSAwOworCQkJYnRyZWUtPmZpcnN0X2ZyZWUgPSA4OworCQkJYnRyZWUtPmludGVybmFsID0gMDsKKwkJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwkJfSBlbHNlIGhwZnNfZnJlZV9zZWN0b3JzKHMsIGYsIDEpOworCQlicmVsc2UoYmgpOworCQlyZXR1cm47CisJfQorCXdoaWxlIChidHJlZS0+aW50ZXJuYWwpIHsKKwkJbm9kZXMgPSBidHJlZS0+bl91c2VkX25vZGVzICsgYnRyZWUtPm5fZnJlZV9ub2RlczsKKwkJZm9yIChpID0gMDsgaSA8IGJ0cmVlLT5uX3VzZWRfbm9kZXM7IGkrKykKKwkJCWlmIChidHJlZS0+dS5pbnRlcm5hbFtpXS5maWxlX3NlY25vID49IHNlY3MpIGdvdG8gZjsKKwkJYnJlbHNlKGJoKTsKKwkJaHBmc19lcnJvcihzLCAiaW50ZXJuYWwgYnRyZWUgJTA4eCBkb2Vzbid0IGVuZCB3aXRoIC0xIiwgbm9kZSk7CisJCXJldHVybjsKKwkJZjoKKwkJZm9yIChqID0gaSArIDE7IGogPCBidHJlZS0+bl91c2VkX25vZGVzOyBqKyspCisJCQlocGZzX2VhX3JlbW92ZShzLCBidHJlZS0+dS5pbnRlcm5hbFtqXS5kb3duLCAxLCAwKTsKKwkJYnRyZWUtPm5fdXNlZF9ub2RlcyA9IGkgKyAxOworCQlidHJlZS0+bl9mcmVlX25vZGVzID0gbm9kZXMgLSBidHJlZS0+bl91c2VkX25vZGVzOworCQlidHJlZS0+Zmlyc3RfZnJlZSA9IDggKyA4ICogYnRyZWUtPm5fdXNlZF9ub2RlczsKKwkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQlpZiAoYnRyZWUtPnUuaW50ZXJuYWxbaV0uZmlsZV9zZWNubyA9PSBzZWNzKSB7CisJCQlicmVsc2UoYmgpOworCQkJcmV0dXJuOworCQl9CisJCW5vZGUgPSBidHJlZS0+dS5pbnRlcm5hbFtpXS5kb3duOworCQlicmVsc2UoYmgpOworCQlpZiAoaHBmc19zYihzKS0+c2JfY2hrKQorCQkJaWYgKGhwZnNfc3RvcF9jeWNsZXMocywgbm9kZSwgJmMxLCAmYzIsICJocGZzX3RydW5jYXRlX2J0cmVlIikpCisJCQkJcmV0dXJuOworCQlpZiAoIShhbm9kZSA9IGhwZnNfbWFwX2Fub2RlKHMsIG5vZGUsICZiaCkpKSByZXR1cm47CisJCWJ0cmVlID0gJmFub2RlLT5idHJlZTsKKwl9CQorCW5vZGVzID0gYnRyZWUtPm5fdXNlZF9ub2RlcyArIGJ0cmVlLT5uX2ZyZWVfbm9kZXM7CisJZm9yIChpID0gMDsgaSA8IGJ0cmVlLT5uX3VzZWRfbm9kZXM7IGkrKykKKwkJaWYgKGJ0cmVlLT51LmV4dGVybmFsW2ldLmZpbGVfc2Vjbm8gKyBidHJlZS0+dS5leHRlcm5hbFtpXS5sZW5ndGggPj0gc2VjcykgZ290byBmZjsKKwlicmVsc2UoYmgpOworCXJldHVybjsKKwlmZjoKKwlpZiAoc2VjcyA8PSBidHJlZS0+dS5leHRlcm5hbFtpXS5maWxlX3NlY25vKSB7CisJCWhwZnNfZXJyb3IocywgInRoZXJlIGlzIGFuIGFsbG9jYXRpb24gZXJyb3IgaW4gZmlsZSAlMDh4LCBzZWN0b3IgJTA4eCIsIGYsIHNlY3MpOworCQlpZiAoaSkgaS0tOworCX0KKwllbHNlIGlmIChidHJlZS0+dS5leHRlcm5hbFtpXS5maWxlX3NlY25vICsgYnRyZWUtPnUuZXh0ZXJuYWxbaV0ubGVuZ3RoID4gc2VjcykgeworCQlocGZzX2ZyZWVfc2VjdG9ycyhzLCBidHJlZS0+dS5leHRlcm5hbFtpXS5kaXNrX3NlY25vICsgc2VjcyAtCisJCQlidHJlZS0+dS5leHRlcm5hbFtpXS5maWxlX3NlY25vLCBidHJlZS0+dS5leHRlcm5hbFtpXS5sZW5ndGgKKwkJCS0gc2VjcyArIGJ0cmVlLT51LmV4dGVybmFsW2ldLmZpbGVfc2Vjbm8pOyAvKiBJIGhvcGUgZ2NjIG9wdGltaXplcyB0aGlzIDotKSAqLworCQlidHJlZS0+dS5leHRlcm5hbFtpXS5sZW5ndGggPSBzZWNzIC0gYnRyZWUtPnUuZXh0ZXJuYWxbaV0uZmlsZV9zZWNubzsKKwl9CisJZm9yIChqID0gaSArIDE7IGogPCBidHJlZS0+bl91c2VkX25vZGVzOyBqKyspCisJCWhwZnNfZnJlZV9zZWN0b3JzKHMsIGJ0cmVlLT51LmV4dGVybmFsW2pdLmRpc2tfc2Vjbm8sIGJ0cmVlLT51LmV4dGVybmFsW2pdLmxlbmd0aCk7CisJYnRyZWUtPm5fdXNlZF9ub2RlcyA9IGkgKyAxOworCWJ0cmVlLT5uX2ZyZWVfbm9kZXMgPSBub2RlcyAtIGJ0cmVlLT5uX3VzZWRfbm9kZXM7CisJYnRyZWUtPmZpcnN0X2ZyZWUgPSA4ICsgMTIgKiBidHJlZS0+bl91c2VkX25vZGVzOworCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwlicmVsc2UoYmgpOworfQorCisvKiBSZW1vdmUgZmlsZSBvciBkaXJlY3RvcnkgYW5kIGl0J3MgZWFzIC0gbm90ZSB0aGF0IGRpcmVjdG9yeSBtdXN0CisgICBiZSBlbXB0eSB3aGVuIHRoaXMgaXMgY2FsbGVkLiAqLworCit2b2lkIGhwZnNfcmVtb3ZlX2Zub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgZm5vZGVfc2Vjbm8gZm5vKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGZub2RlICpmbm9kZTsKKwlzdHJ1Y3QgZXh0ZW5kZWRfYXR0cmlidXRlICplYTsKKwlzdHJ1Y3QgZXh0ZW5kZWRfYXR0cmlidXRlICplYV9lbmQ7CisJaWYgKCEoZm5vZGUgPSBocGZzX21hcF9mbm9kZShzLCBmbm8sICZiaCkpKSByZXR1cm47CisJaWYgKCFmbm9kZS0+ZGlyZmxhZykgaHBmc19yZW1vdmVfYnRyZWUocywgJmZub2RlLT5idHJlZSk7CisJZWxzZSBocGZzX3JlbW92ZV9kdHJlZShzLCBmbm9kZS0+dS5leHRlcm5hbFswXS5kaXNrX3NlY25vKTsKKwllYV9lbmQgPSBmbm9kZV9lbmRfZWEoZm5vZGUpOworCWZvciAoZWEgPSBmbm9kZV9lYShmbm9kZSk7IGVhIDwgZWFfZW5kOyBlYSA9IG5leHRfZWEoZWEpKQorCQlpZiAoZWEtPmluZGlyZWN0KQorCQkJaHBmc19lYV9yZW1vdmUocywgZWFfc2VjKGVhKSwgZWEtPmFub2RlLCBlYV9sZW4oZWEpKTsKKwlocGZzX2VhX2V4dF9yZW1vdmUocywgZm5vZGUtPmVhX3NlY25vLCBmbm9kZS0+ZWFfYW5vZGUsIGZub2RlLT5lYV9zaXplX2wpOworCWJyZWxzZShiaCk7CisJaHBmc19mcmVlX3NlY3RvcnMocywgZm5vLCAxKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2hwZnMvYnVmZmVyLmMgYi9mcy9ocGZzL2J1ZmZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MDdhYTgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ocGZzL2J1ZmZlci5jCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICogIGxpbnV4L2ZzL2hwZnMvYnVmZmVyLmMKKyAqCisgKiAgTWlrdWxhcyBQYXRvY2thIChtaWt1bGFzQGFydGF4Lmthcmxpbi5tZmYuY3VuaS5jeiksIDE5OTgtMTk5OQorICoKKyAqICBnZW5lcmFsIGJ1ZmZlciBpL28KKyAqLworCisjaW5jbHVkZSAiaHBmc19mbi5oIgorCit2b2lkIGhwZnNfbG9ja19jcmVhdGlvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCit7CisjaWZkZWYgREVCVUdfTE9DS1MKKwlwcmludGsoImxvY2sgY3JlYXRpb25cbiIpOworI2VuZGlmCisJZG93bigmaHBmc19zYihzKS0+aHBmc19jcmVhdGlvbl9kZSk7Cit9CisKK3ZvaWQgaHBmc191bmxvY2tfY3JlYXRpb24oc3RydWN0IHN1cGVyX2Jsb2NrICpzKQoreworI2lmZGVmIERFQlVHX0xPQ0tTCisJcHJpbnRrKCJ1bmxvY2sgY3JlYXRpb25cbiIpOworI2VuZGlmCisJdXAoJmhwZnNfc2IocyktPmhwZnNfY3JlYXRpb25fZGUpOworfQorCisvKiBNYXAgYSBzZWN0b3IgaW50byBhIGJ1ZmZlciBhbmQgcmV0dXJuIHBvaW50ZXJzIHRvIGl0IGFuZCB0byB0aGUgYnVmZmVyLiAqLworCit2b2lkICpocGZzX21hcF9zZWN0b3Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB1bnNpZ25lZCBzZWNubywgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhwLAorCQkgaW50IGFoZWFkKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwljb25kX3Jlc2NoZWQoKTsKKworCSpiaHAgPSBiaCA9IHNiX2JyZWFkKHMsIHNlY25vKTsKKwlpZiAoYmggIT0gTlVMTCkKKwkJcmV0dXJuIGJoLT5iX2RhdGE7CisJZWxzZSB7CisJCXByaW50aygiSFBGUzogaHBmc19tYXBfc2VjdG9yOiByZWFkIGVycm9yXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCisvKiBMaWtlIGhwZnNfbWFwX3NlY3RvciBidXQgZG9uJ3QgcmVhZCBhbnl0aGluZyAqLworCit2b2lkICpocGZzX2dldF9zZWN0b3Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB1bnNpZ25lZCBzZWNubywgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhwKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJLypyZXR1cm4gaHBmc19tYXBfc2VjdG9yKHMsIHNlY25vLCBiaHAsIDApOyovCisKKwljb25kX3Jlc2NoZWQoKTsKKworCWlmICgoKmJocCA9IGJoID0gc2JfZ2V0YmxrKHMsIHNlY25vKSkgIT0gTlVMTCkgeworCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHdhaXRfb25fYnVmZmVyKGJoKTsKKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCXJldHVybiBiaC0+Yl9kYXRhOworCX0gZWxzZSB7CisJCXByaW50aygiSFBGUzogaHBmc19nZXRfc2VjdG9yOiBnZXRibGsgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCisvKiBNYXAgNCBzZWN0b3JzIGludG8gYSA0YnVmZmVyIGFuZCByZXR1cm4gcG9pbnRlcnMgdG8gaXQgYW5kIHRvIHRoZSBidWZmZXIuICovCisKK3ZvaWQgKmhwZnNfbWFwXzRzZWN0b3JzKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdW5zaWduZWQgc2Vjbm8sIHN0cnVjdCBxdWFkX2J1ZmZlcl9oZWFkICpxYmgsCisJCSAgIGludCBhaGVhZCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWNoYXIgKmRhdGE7CisKKwljb25kX3Jlc2NoZWQoKTsKKworCWlmIChzZWNubyAmIDMpIHsKKwkJcHJpbnRrKCJIUEZTOiBocGZzX21hcF80c2VjdG9yczogdW5hbGlnbmVkIHJlYWRcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlxYmgtPmRhdGEgPSBkYXRhID0gKGNoYXIgKilrbWFsbG9jKDIwNDgsIEdGUF9OT0ZTKTsKKwlpZiAoIWRhdGEpIHsKKwkJcHJpbnRrKCJIUEZTOiBocGZzX21hcF80c2VjdG9yczogb3V0IG9mIG1lbW9yeVxuIik7CisJCWdvdG8gYmFpbDsKKwl9CisKKwlxYmgtPmJoWzBdID0gYmggPSBzYl9icmVhZChzLCBzZWNubyk7CisJaWYgKCFiaCkKKwkJZ290byBiYWlsMDsKKwltZW1jcHkoZGF0YSwgYmgtPmJfZGF0YSwgNTEyKTsKKworCXFiaC0+YmhbMV0gPSBiaCA9IHNiX2JyZWFkKHMsIHNlY25vICsgMSk7CisJaWYgKCFiaCkKKwkJZ290byBiYWlsMTsKKwltZW1jcHkoZGF0YSArIDUxMiwgYmgtPmJfZGF0YSwgNTEyKTsKKworCXFiaC0+YmhbMl0gPSBiaCA9IHNiX2JyZWFkKHMsIHNlY25vICsgMik7CisJaWYgKCFiaCkKKwkJZ290byBiYWlsMjsKKwltZW1jcHkoZGF0YSArIDIgKiA1MTIsIGJoLT5iX2RhdGEsIDUxMik7CisKKwlxYmgtPmJoWzNdID0gYmggPSBzYl9icmVhZChzLCBzZWNubyArIDMpOworCWlmICghYmgpCisJCWdvdG8gYmFpbDM7CisJbWVtY3B5KGRhdGEgKyAzICogNTEyLCBiaC0+Yl9kYXRhLCA1MTIpOworCisJcmV0dXJuIGRhdGE7CisKKyBiYWlsMzoKKwlicmVsc2UocWJoLT5iaFsyXSk7CisgYmFpbDI6CisJYnJlbHNlKHFiaC0+YmhbMV0pOworIGJhaWwxOgorCWJyZWxzZShxYmgtPmJoWzBdKTsKKyBiYWlsMDoKKwlrZnJlZShkYXRhKTsKKwlwcmludGsoIkhQRlM6IGhwZnNfbWFwXzRzZWN0b3JzOiByZWFkIGVycm9yXG4iKTsKKyBiYWlsOgorCXJldHVybiBOVUxMOworfQorCisvKiBEb24ndCByZWFkIHNlY3RvcnMgKi8KKwordm9pZCAqaHBmc19nZXRfNHNlY3RvcnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB1bnNpZ25lZCBzZWNubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgKnFiaCkKK3sKKwljb25kX3Jlc2NoZWQoKTsKKworCWlmIChzZWNubyAmIDMpIHsKKwkJcHJpbnRrKCJIUEZTOiBocGZzX2dldF80c2VjdG9yczogdW5hbGlnbmVkIHJlYWRcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKnJldHVybiBocGZzX21hcF80c2VjdG9ycyhzLCBzZWNubywgcWJoLCAwKTsqLworCWlmICghKHFiaC0+ZGF0YSA9IGttYWxsb2MoMjA0OCwgR0ZQX05PRlMpKSkgeworCQlwcmludGsoIkhQRlM6IGhwZnNfZ2V0XzRzZWN0b3JzOiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmICghKGhwZnNfZ2V0X3NlY3RvcihzLCBzZWNubywgJnFiaC0+YmhbMF0pKSkgZ290byBiYWlsMDsKKwlpZiAoIShocGZzX2dldF9zZWN0b3Iocywgc2Vjbm8gKyAxLCAmcWJoLT5iaFsxXSkpKSBnb3RvIGJhaWwxOworCWlmICghKGhwZnNfZ2V0X3NlY3RvcihzLCBzZWNubyArIDIsICZxYmgtPmJoWzJdKSkpIGdvdG8gYmFpbDI7CisJaWYgKCEoaHBmc19nZXRfc2VjdG9yKHMsIHNlY25vICsgMywgJnFiaC0+YmhbM10pKSkgZ290byBiYWlsMzsKKwltZW1jcHkocWJoLT5kYXRhLCBxYmgtPmJoWzBdLT5iX2RhdGEsIDUxMik7CisJbWVtY3B5KHFiaC0+ZGF0YSArIDUxMiwgcWJoLT5iaFsxXS0+Yl9kYXRhLCA1MTIpOworCW1lbWNweShxYmgtPmRhdGEgKyAyKjUxMiwgcWJoLT5iaFsyXS0+Yl9kYXRhLCA1MTIpOworCW1lbWNweShxYmgtPmRhdGEgKyAzKjUxMiwgcWJoLT5iaFszXS0+Yl9kYXRhLCA1MTIpOworCXJldHVybiBxYmgtPmRhdGE7CisKKwliYWlsMzoJYnJlbHNlKHFiaC0+YmhbMl0pOworCWJhaWwyOglicmVsc2UocWJoLT5iaFsxXSk7CisJYmFpbDE6CWJyZWxzZShxYmgtPmJoWzBdKTsKKwliYWlsMDoKKwlyZXR1cm4gTlVMTDsKK30KKwkKKwordm9pZCBocGZzX2JyZWxzZTQoc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgKnFiaCkKK3sKKwlicmVsc2UocWJoLT5iaFszXSk7CisJYnJlbHNlKHFiaC0+YmhbMl0pOworCWJyZWxzZShxYmgtPmJoWzFdKTsKKwlicmVsc2UocWJoLT5iaFswXSk7CisJa2ZyZWUocWJoLT5kYXRhKTsKK30JCisKK3ZvaWQgaHBmc19tYXJrXzRidWZmZXJzX2RpcnR5KHN0cnVjdCBxdWFkX2J1ZmZlcl9oZWFkICpxYmgpCit7CisJUFJJTlRLKCgiaHBmc19tYXJrXzRidWZmZXJzX2RpcnR5XG4iKSk7CisJbWVtY3B5KHFiaC0+YmhbMF0tPmJfZGF0YSwgcWJoLT5kYXRhLCA1MTIpOworCW1lbWNweShxYmgtPmJoWzFdLT5iX2RhdGEsIHFiaC0+ZGF0YSArIDUxMiwgNTEyKTsKKwltZW1jcHkocWJoLT5iaFsyXS0+Yl9kYXRhLCBxYmgtPmRhdGEgKyAyICogNTEyLCA1MTIpOworCW1lbWNweShxYmgtPmJoWzNdLT5iX2RhdGEsIHFiaC0+ZGF0YSArIDMgKiA1MTIsIDUxMik7CisJbWFya19idWZmZXJfZGlydHkocWJoLT5iaFswXSk7CisJbWFya19idWZmZXJfZGlydHkocWJoLT5iaFsxXSk7CisJbWFya19idWZmZXJfZGlydHkocWJoLT5iaFsyXSk7CisJbWFya19idWZmZXJfZGlydHkocWJoLT5iaFszXSk7Cit9CmRpZmYgLS1naXQgYS9mcy9ocGZzL2RlbnRyeS5jIGIvZnMvaHBmcy9kZW50cnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODMxOTEyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaHBmcy9kZW50cnkuYwpAQCAtMCwwICsxLDYwIEBACisvKgorICogIGxpbnV4L2ZzL2hwZnMvZGVudHJ5LmMKKyAqCisgKiAgTWlrdWxhcyBQYXRvY2thIChtaWt1bGFzQGFydGF4Lmthcmxpbi5tZmYuY3VuaS5jeiksIDE5OTgtMTk5OQorICoKKyAqICBkY2FjaGUgb3BlcmF0aW9ucworICovCisKKyNpbmNsdWRlICJocGZzX2ZuLmgiCisKKy8qCisgKiBOb3RlOiB0aGUgZGVudHJ5IGFyZ3VtZW50IGlzIHRoZSBwYXJlbnQgZGVudHJ5LgorICovCisKK3N0YXRpYyBpbnQgaHBmc19oYXNoX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICpxc3RyKQoreworCXVuc2lnbmVkIGxvbmcJIGhhc2g7CisJaW50CQkgaTsKKwl1bnNpZ25lZCBsID0gcXN0ci0+bGVuOworCisJaWYgKGwgPT0gMSkgaWYgKHFzdHItPm5hbWVbMF09PScuJykgZ290byB4OworCWlmIChsID09IDIpIGlmIChxc3RyLT5uYW1lWzBdPT0nLicgfHwgcXN0ci0+bmFtZVsxXT09Jy4nKSBnb3RvIHg7CisJaHBmc19hZGp1c3RfbGVuZ3RoKChjaGFyICopcXN0ci0+bmFtZSwgJmwpOworCS8qaWYgKGhwZnNfY2hrX25hbWUoKGNoYXIgKilxc3RyLT5uYW1lLCZsKSkqLworCQkvKnJldHVybiAtRU5BTUVUT09MT05HOyovCisJCS8qcmV0dXJuIC1FTk9FTlQ7Ki8KKwl4OgorCisJaGFzaCA9IGluaXRfbmFtZV9oYXNoKCk7CisJZm9yIChpID0gMDsgaSA8IGw7IGkrKykKKwkJaGFzaCA9IHBhcnRpYWxfbmFtZV9oYXNoKGhwZnNfdXBjYXNlKGhwZnNfc2IoZGVudHJ5LT5kX3NiKS0+c2JfY3BfdGFibGUscXN0ci0+bmFtZVtpXSksIGhhc2gpOworCXFzdHItPmhhc2ggPSBlbmRfbmFtZV9oYXNoKGhhc2gpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHBmc19jb21wYXJlX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICphLCBzdHJ1Y3QgcXN0ciAqYikKK3sKKwl1bnNpZ25lZCBhbD1hLT5sZW47CisJdW5zaWduZWQgYmw9Yi0+bGVuOworCWhwZnNfYWRqdXN0X2xlbmd0aCgoY2hhciAqKWEtPm5hbWUsICZhbCk7CisJLypocGZzX2FkanVzdF9sZW5ndGgoKGNoYXIgKiliLT5uYW1lLCAmYmwpOyovCisJLyogJ2EnIGlzIHRoZSBxc3RyIG9mIGFuIGFscmVhZHkgZXhpc3RpbmcgZGVudHJ5LCBzbyB0aGUgbmFtZQorCSAqIG11c3QgYmUgdmFsaWQuICdiJyBtdXN0IGJlIHZhbGlkYXRlZCBmaXJzdC4KKwkgKi8KKworCWlmIChocGZzX2Noa19uYW1lKChjaGFyICopYi0+bmFtZSwgJmJsKSkgcmV0dXJuIDE7CisJaWYgKGhwZnNfY29tcGFyZV9uYW1lcyhkZW50cnktPmRfc2IsIChjaGFyICopYS0+bmFtZSwgYWwsIChjaGFyICopYi0+bmFtZSwgYmwsIDApKSByZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBocGZzX2RlbnRyeV9vcGVyYXRpb25zID0geworCS5kX2hhc2gJCT0gaHBmc19oYXNoX2RlbnRyeSwKKwkuZF9jb21wYXJlCT0gaHBmc19jb21wYXJlX2RlbnRyeSwKK307CisKK3ZvaWQgaHBmc19zZXRfZGVudHJ5X29wZXJhdGlvbnMoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWRlbnRyeS0+ZF9vcCA9ICZocGZzX2RlbnRyeV9vcGVyYXRpb25zOworfQpkaWZmIC0tZ2l0IGEvZnMvaHBmcy9kaXIuYyBiL2ZzL2hwZnMvZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIxN2MzYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hwZnMvZGlyLmMKQEAgLTAsMCArMSwzMjAgQEAKKy8qCisgKiAgbGludXgvZnMvaHBmcy9kaXIuYworICoKKyAqICBNaWt1bGFzIFBhdG9ja2EgKG1pa3VsYXNAYXJ0YXgua2FybGluLm1mZi5jdW5pLmN6KSwgMTk5OC0xOTk5CisgKgorICogIGRpcmVjdG9yeSBWRlMgZnVuY3Rpb25zCisgKi8KKworI2luY2x1ZGUgImhwZnNfZm4uaCIKKworc3RhdGljIGludCBocGZzX2Rpcl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWxvY2tfa2VybmVsKCk7CisJaHBmc19kZWxfcG9zKGlub2RlLCAmZmlscC0+Zl9wb3MpOworCS8qaHBmc193cml0ZV9pZl9jaGFuZ2VkKGlub2RlKTsqLworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyBpcyBzbG93LCBidXQgaXQncyBub3QgdXNlZCBvZnRlbiAqLworCitzdGF0aWMgbG9mZl90IGhwZnNfZGlyX2xzZWVrKHN0cnVjdCBmaWxlICpmaWxwLCBsb2ZmX3Qgb2ZmLCBpbnQgd2hlbmNlKQoreworCWxvZmZfdCBuZXdfb2ZmID0gb2ZmICsgKHdoZW5jZSA9PSAxID8gZmlscC0+Zl9wb3MgOiAwKTsKKwlsb2ZmX3QgcG9zOworCXN0cnVjdCBxdWFkX2J1ZmZlcl9oZWFkIHFiaDsKKwlzdHJ1Y3QgaW5vZGUgKmkgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaHBmc19pbm9kZV9pbmZvICpocGZzX2lub2RlID0gaHBmc19pKGkpOworCXN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IGktPmlfc2I7CisKKwlsb2NrX2tlcm5lbCgpOworCisJLypwcmludGsoImRpciBsc2Vla1xuIik7Ki8KKwlpZiAobmV3X29mZiA9PSAwIHx8IG5ld19vZmYgPT0gMSB8fCBuZXdfb2ZmID09IDExIHx8IG5ld19vZmYgPT0gMTIgfHwgbmV3X29mZiA9PSAxMykgZ290byBvazsKKwlkb3duKCZpLT5pX3NlbSk7CisJcG9zID0gKChsb2ZmX3QpIGhwZnNfZGVfYXNfZG93bl9hc19wb3NzaWJsZShzLCBocGZzX2lub2RlLT5pX2RubykgPDwgNCkgKyAxOworCXdoaWxlIChwb3MgIT0gbmV3X29mZikgeworCQlpZiAobWFwX3Bvc19kaXJlbnQoaSwgJnBvcywgJnFiaCkpIGhwZnNfYnJlbHNlNCgmcWJoKTsKKwkJZWxzZSBnb3RvIGZhaWw7CisJCWlmIChwb3MgPT0gMTIpIGdvdG8gZmFpbDsKKwl9CisJdXAoJmktPmlfc2VtKTsKK29rOgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZmlscC0+Zl9wb3MgPSBuZXdfb2ZmOworZmFpbDoKKwl1cCgmaS0+aV9zZW0pOworCS8qcHJpbnRrKCJpbGxlZ2FsIGxzZWVrOiAlMDE2bGx4XG4iLCBuZXdfb2ZmKTsqLworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gLUVTUElQRTsKK30KKworc3RhdGljIGludCBocGZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBocGZzX2lub2RlX2luZm8gKmhwZnNfaW5vZGUgPSBocGZzX2koaW5vZGUpOworCXN0cnVjdCBxdWFkX2J1ZmZlcl9oZWFkIHFiaDsKKwlzdHJ1Y3QgaHBmc19kaXJlbnQgKmRlOworCWludCBsYzsKKwlsb25nIG9sZF9wb3M7CisJY2hhciAqdGVtcG5hbWU7CisJaW50IGMxLCBjMiA9IDA7CisJaW50IHJldCA9IDA7CisKKwlsb2NrX2tlcm5lbCgpOworCisJaWYgKGhwZnNfc2IoaW5vZGUtPmlfc2IpLT5zYl9jaGspIHsKKwkJaWYgKGhwZnNfY2hrX3NlY3RvcnMoaW5vZGUtPmlfc2IsIGlub2RlLT5pX2lubywgMSwgImRpcl9mbm9kZSIpKSB7CisJCQlyZXQgPSAtRUZTRVJST1I7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoaHBmc19jaGtfc2VjdG9ycyhpbm9kZS0+aV9zYiwgaHBmc19pbm9kZS0+aV9kbm8sIDQsICJkaXJfZG5vZGUiKSkgeworCQkJcmV0ID0gLUVGU0VSUk9SOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJaWYgKGhwZnNfc2IoaW5vZGUtPmlfc2IpLT5zYl9jaGsgPj0gMikgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCQlzdHJ1Y3QgZm5vZGUgKmZubzsKKwkJaW50IGUgPSAwOworCQlpZiAoIShmbm8gPSBocGZzX21hcF9mbm9kZShpbm9kZS0+aV9zYiwgaW5vZGUtPmlfaW5vLCAmYmgpKSkgeworCQkJcmV0ID0gLUVJT0VSUk9SOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKCFmbm8tPmRpcmZsYWcpIHsKKwkJCWUgPSAxOworCQkJaHBmc19lcnJvcihpbm9kZS0+aV9zYiwgIm5vdCBhIGRpcmVjdG9yeSwgZm5vZGUgJTA4eCIsaW5vZGUtPmlfaW5vKTsKKwkJfQorCQlpZiAoaHBmc19pbm9kZS0+aV9kbm8gIT0gZm5vLT51LmV4dGVybmFsWzBdLmRpc2tfc2Vjbm8pIHsKKwkJCWUgPSAxOworCQkJaHBmc19lcnJvcihpbm9kZS0+aV9zYiwgImNvcnJ1cHRlZCBpbm9kZTogaV9kbm8gPT0gJTA4eCwgZm5vZGUgLT4gZG5vZGUgPT0gJTA4eCIsIGhwZnNfaW5vZGUtPmlfZG5vLCBmbm8tPnUuZXh0ZXJuYWxbMF0uZGlza19zZWNubyk7CisJCX0KKwkJYnJlbHNlKGJoKTsKKwkJaWYgKGUpIHsKKwkJCXJldCA9IC1FRlNFUlJPUjsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCWxjID0gaHBmc19zYihpbm9kZS0+aV9zYiktPnNiX2xvd2VyY2FzZTsKKwlpZiAoZmlscC0+Zl9wb3MgPT0gMTIpIHsgLyogZGlmZiAtciByZXF1aXJlcyB0aGlzIChub3RlLCB0aGF0IGRpZmYgLXIgKi8KKwkJZmlscC0+Zl9wb3MgPSAxMzsgLyogYWxzbyBmYWlscyBvbiBtc2RvcyBmaWxlc3lzdGVtIGluIDIuMCkgKi8KKwkJZ290byBvdXQ7CisJfQorCWlmIChmaWxwLT5mX3BvcyA9PSAxMykgeworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIG91dDsKKwl9CisJCisJd2hpbGUgKDEpIHsKKwkJYWdhaW46CisJCS8qIFRoaXMgd29uJ3Qgd29yayB3aGVuIGN5Y2xlIGlzIGxvbmdlciB0aGFuIG51bWJlciBvZiBkaXJlbnRzCisJCSAgIGFjY2VwdGVkIGJ5IGZpbGxkaXIsIGJ1dCB3aGF0IGNhbiBJIGRvPworCQkgICBtYXliZSBraWxsYWxsIC05IGxzIGhlbHBzICovCisJCWlmIChocGZzX3NiKGlub2RlLT5pX3NiKS0+c2JfY2hrKQorCQkJaWYgKGhwZnNfc3RvcF9jeWNsZXMoaW5vZGUtPmlfc2IsIGZpbHAtPmZfcG9zLCAmYzEsICZjMiwgImhwZnNfcmVhZGRpciIpKSB7CisJCQkJcmV0ID0gLUVGU0VSUk9SOworCQkJCWdvdG8gb3V0OworCQkJfQorCQlpZiAoZmlscC0+Zl9wb3MgPT0gMTIpCisJCQlnb3RvIG91dDsKKwkJaWYgKGZpbHAtPmZfcG9zID09IDMgfHwgZmlscC0+Zl9wb3MgPT0gNCB8fCBmaWxwLT5mX3BvcyA9PSA1KSB7CisJCQlwcmludGsoIkhQRlM6IHdhcm5pbmc6IHBvcz09JWRcbiIsKGludClmaWxwLT5mX3Bvcyk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAoZmlscC0+Zl9wb3MgPT0gMCkgeworCQkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLiIsIDEsIGZpbHAtPmZfcG9zLCBpbm9kZS0+aV9pbm8sIERUX0RJUikgPCAwKQorCQkJCWdvdG8gb3V0OworCQkJZmlscC0+Zl9wb3MgPSAxMTsKKwkJfQorCQlpZiAoZmlscC0+Zl9wb3MgPT0gMTEpIHsKKwkJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4uIiwgMiwgZmlscC0+Zl9wb3MsIGhwZnNfaW5vZGUtPmlfcGFyZW50X2RpciwgRFRfRElSKSA8IDApCisJCQkJZ290byBvdXQ7CisJCQlmaWxwLT5mX3BvcyA9IDE7CisJCX0KKwkJaWYgKGZpbHAtPmZfcG9zID09IDEpIHsKKwkJCWZpbHAtPmZfcG9zID0gKChsb2ZmX3QpIGhwZnNfZGVfYXNfZG93bl9hc19wb3NzaWJsZShpbm9kZS0+aV9zYiwgaHBmc19pbm9kZS0+aV9kbm8pIDw8IDQpICsgMTsKKwkJCWhwZnNfYWRkX3Bvcyhpbm9kZSwgJmZpbHAtPmZfcG9zKTsKKwkJCWZpbHAtPmZfdmVyc2lvbiA9IGlub2RlLT5pX3ZlcnNpb247CisJCX0KKwkJb2xkX3BvcyA9IGZpbHAtPmZfcG9zOworCQlpZiAoIShkZSA9IG1hcF9wb3NfZGlyZW50KGlub2RlLCAmZmlscC0+Zl9wb3MsICZxYmgpKSkgeworCQkJcmV0ID0gLUVJT0VSUk9SOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKGRlLT5maXJzdCB8fCBkZS0+bGFzdCkgeworCQkJaWYgKGhwZnNfc2IoaW5vZGUtPmlfc2IpLT5zYl9jaGspIHsKKwkJCQlpZiAoZGUtPmZpcnN0ICYmICFkZS0+bGFzdCAmJiAoZGUtPm5hbWVsZW4gIT0gMiB8fCBkZSAtPm5hbWVbMF0gIT0gMSB8fCBkZS0+bmFtZVsxXSAhPSAxKSkgaHBmc19lcnJvcihpbm9kZS0+aV9zYiwgImhwZnNfcmVhZGRpcjogYmFkIF5BXkEgZW50cnk7IHBvcyA9ICUwOHgiLCBvbGRfcG9zKTsKKwkJCQlpZiAoZGUtPmxhc3QgJiYgKGRlLT5uYW1lbGVuICE9IDEgfHwgZGUgLT5uYW1lWzBdICE9IDI1NSkpIGhwZnNfZXJyb3IoaW5vZGUtPmlfc2IsICJocGZzX3JlYWRkaXI6IGJhZCBcXDM3NyBlbnRyeTsgcG9zID0gJTA4eCIsIG9sZF9wb3MpOworCQkJfQorCQkJaHBmc19icmVsc2U0KCZxYmgpOworCQkJZ290byBhZ2FpbjsKKwkJfQorCQl0ZW1wbmFtZSA9IGhwZnNfdHJhbnNsYXRlX25hbWUoaW5vZGUtPmlfc2IsIGRlLT5uYW1lLCBkZS0+bmFtZWxlbiwgbGMsIGRlLT5ub3RfOHgzKTsKKwkJaWYgKGZpbGxkaXIoZGlyZW50LCB0ZW1wbmFtZSwgZGUtPm5hbWVsZW4sIG9sZF9wb3MsIGRlLT5mbm9kZSwgRFRfVU5LTk9XTikgPCAwKSB7CisJCQlmaWxwLT5mX3BvcyA9IG9sZF9wb3M7CisJCQlpZiAodGVtcG5hbWUgIT0gKGNoYXIgKilkZS0+bmFtZSkga2ZyZWUodGVtcG5hbWUpOworCQkJaHBmc19icmVsc2U0KCZxYmgpOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKHRlbXBuYW1lICE9IChjaGFyICopZGUtPm5hbWUpIGtmcmVlKHRlbXBuYW1lKTsKKwkJaHBmc19icmVsc2U0KCZxYmgpOworCX0KK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIGxvb2t1cC4gIFNlYXJjaCB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSBmb3IgdGhlIHNwZWNpZmllZCBuYW1lLCBzZXQKKyAqICpyZXN1bHQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgaW5vZGUuCisgKgorICogbG9va3VwIHVzZXMgdGhlIGlub2RlIG51bWJlciB0byB0ZWxsIHJlYWRfaW5vZGUgd2hldGhlciBpdCBpcyByZWFkaW5nCisgKiB0aGUgaW5vZGUgb2YgYSBkaXJlY3Rvcnkgb3IgYSBmaWxlIC0tIGZpbGUgaW5vJ3MgYXJlIG9kZCwgZGlyZWN0b3J5CisgKiBpbm8ncyBhcmUgZXZlbi4gIHJlYWRfaW5vZGUgYXZvaWRzIGkvbyBmb3IgZmlsZSBpbm9kZXM7IGV2ZXJ5dGhpbmcKKyAqIG5lZWRlZCBpcyB1cCBoZXJlIGluIHRoZSBkaXJlY3RvcnkuICAoQW5kIGZpbGUgZm5vZGVzIGFyZSBvdXQgaW4KKyAqIHRoZSBib29uZG9ja3MuKQorICoKKyAqICAgIC0gTS5QLjogdGhpcyBpcyBvdmVyLCBzb21ldGltZXMgd2UndmUgZ290IHRvIHJlYWQgZmlsZSdzIGZub2RlIGZvciBlYXMKKyAqCSAgICAgIGlub2RlIG51bWJlcnMgYXJlIGp1c3QgZm5vZGUgc2VjdG9yIG51bWJlcnM7IGlnZXQgbG9jayBpcyB1c2VkCisgKgkgICAgICB0byB0ZWxsIHJlYWRfaW5vZGUgdG8gcmVhZCBmbm9kZSBvciBub3QuCisgKi8KKworc3RydWN0IGRlbnRyeSAqaHBmc19sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJY29uc3QgY2hhciAqbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7CisJdW5zaWduZWQgbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCXN0cnVjdCBxdWFkX2J1ZmZlcl9oZWFkIHFiaDsKKwlzdHJ1Y3QgaHBmc19kaXJlbnQgKmRlOworCWlub190IGlubzsKKwlpbnQgZXJyOworCXN0cnVjdCBpbm9kZSAqcmVzdWx0ID0gTlVMTDsKKwlzdHJ1Y3QgaHBmc19pbm9kZV9pbmZvICpocGZzX3Jlc3VsdDsKKworCWxvY2tfa2VybmVsKCk7CisJaWYgKChlcnIgPSBocGZzX2Noa19uYW1lKChjaGFyICopbmFtZSwgJmxlbikpKSB7CisJCWlmIChlcnIgPT0gLUVOQU1FVE9PTE9ORykgeworCQkJdW5sb2NrX2tlcm5lbCgpOworCQkJcmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7CisJCX0KKwkJZ290byBlbmRfYWRkOworCX0KKworCS8qCisJICogJy4nIGFuZCAnLi4nIHdpbGwgbmV2ZXIgYmUgcGFzc2VkIGhlcmUuCisJICovCisKKwlkZSA9IG1hcF9kaXJlbnQoZGlyLCBocGZzX2koZGlyKS0+aV9kbm8sIChjaGFyICopIG5hbWUsIGxlbiwgTlVMTCwgJnFiaCk7CisKKwkvKgorCSAqIFRoaXMgaXMgbm90IHJlYWxseSBhIGJhaWxvdXQsIGp1c3QgbWVhbnMgZmlsZSBub3QgZm91bmQuCisJICovCisKKwlpZiAoIWRlKSBnb3RvIGVuZDsKKworCS8qCisJICogR2V0IGlub2RlIG51bWJlciwgd2hhdCB3ZSdyZSBhZnRlci4KKwkgKi8KKworCWlubyA9IGRlLT5mbm9kZTsKKworCS8qCisJICogR28gZmluZCBvciBtYWtlIGFuIGlub2RlLgorCSAqLworCisJcmVzdWx0ID0gaWdldF9sb2NrZWQoZGlyLT5pX3NiLCBpbm8pOworCWlmICghcmVzdWx0KSB7CisJCWhwZnNfZXJyb3IoZGlyLT5pX3NiLCAiaHBmc19sb29rdXA6IGNhbid0IGdldCBpbm9kZSIpOworCQlnb3RvIGJhaWwxOworCX0KKwlpZiAocmVzdWx0LT5pX3N0YXRlICYgSV9ORVcpIHsKKwkJaHBmc19pbml0X2lub2RlKHJlc3VsdCk7CisJCWlmIChkZS0+ZGlyZWN0b3J5KQorCQkJaHBmc19yZWFkX2lub2RlKHJlc3VsdCk7CisJCWVsc2UgaWYgKGRlLT5lYV9zaXplICYmIGhwZnNfc2IoZGlyLT5pX3NiKS0+c2JfZWFzKQorCQkJaHBmc19yZWFkX2lub2RlKHJlc3VsdCk7CisJCWVsc2UgeworCQkJcmVzdWx0LT5pX21vZGUgfD0gU19JRlJFRzsKKwkJCXJlc3VsdC0+aV9tb2RlICY9IH4wMTExOworCQkJcmVzdWx0LT5pX29wID0gJmhwZnNfZmlsZV9pb3BzOworCQkJcmVzdWx0LT5pX2ZvcCA9ICZocGZzX2ZpbGVfb3BzOworCQkJcmVzdWx0LT5pX25saW5rID0gMTsKKwkJfQorCQl1bmxvY2tfbmV3X2lub2RlKHJlc3VsdCk7CisJfQorCWhwZnNfcmVzdWx0ID0gaHBmc19pKHJlc3VsdCk7CisJaWYgKCFkZS0+ZGlyZWN0b3J5KSBocGZzX3Jlc3VsdC0+aV9wYXJlbnRfZGlyID0gZGlyLT5pX2lubzsKKworCWhwZnNfZGVjaWRlX2NvbnYocmVzdWx0LCAoY2hhciAqKW5hbWUsIGxlbik7CisKKwlpZiAoZGUtPmhhc19hY2wgfHwgZGUtPmhhc194dGRfcGVybSkgaWYgKCEoZGlyLT5pX3NiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQlocGZzX2Vycm9yKHJlc3VsdC0+aV9zYiwgIkFDTHMgb3IgWFBFUk0gZm91bmQuIFRoaXMgaXMgcHJvYmFibHkgSFBGUzM4Ni4gVGhpcyBkcml2ZXIgZG9lc24ndCBzdXBwb3J0IGl0IG5vdy4gU2VuZCBtZSBzb21lIGluZm8gb24gdGhlc2Ugc3RydWN0dXJlcyIpOworCQlnb3RvIGJhaWwxOworCX0KKworCS8qCisJICogRmlsbCBpbiB0aGUgaW5mbyBmcm9tIHRoZSBkaXJlY3RvcnkgaWYgdGhpcyBpcyBhIG5ld2x5IGNyZWF0ZWQKKwkgKiBpbm9kZS4KKwkgKi8KKworCWlmICghcmVzdWx0LT5pX2N0aW1lLnR2X3NlYykgeworCQlpZiAoIShyZXN1bHQtPmlfY3RpbWUudHZfc2VjID0gbG9jYWxfdG9fZ210KGRpci0+aV9zYiwgZGUtPmNyZWF0aW9uX2RhdGUpKSkKKwkJCXJlc3VsdC0+aV9jdGltZS50dl9zZWMgPSAxOworCQlyZXN1bHQtPmlfY3RpbWUudHZfbnNlYyA9IDA7CisJCXJlc3VsdC0+aV9tdGltZS50dl9zZWMgPSBsb2NhbF90b19nbXQoZGlyLT5pX3NiLCBkZS0+d3JpdGVfZGF0ZSk7CisJCXJlc3VsdC0+aV9tdGltZS50dl9uc2VjID0gMDsKKwkJcmVzdWx0LT5pX2F0aW1lLnR2X3NlYyA9IGxvY2FsX3RvX2dtdChkaXItPmlfc2IsIGRlLT5yZWFkX2RhdGUpOworCQlyZXN1bHQtPmlfYXRpbWUudHZfbnNlYyA9IDA7CisJCWhwZnNfcmVzdWx0LT5pX2VhX3NpemUgPSBkZS0+ZWFfc2l6ZTsKKwkJaWYgKCFocGZzX3Jlc3VsdC0+aV9lYV9tb2RlICYmIGRlLT5yZWFkX29ubHkpCisJCQlyZXN1bHQtPmlfbW9kZSAmPSB+MDIyMjsKKwkJaWYgKCFkZS0+ZGlyZWN0b3J5KSB7CisJCQlpZiAocmVzdWx0LT5pX3NpemUgPT0gLTEpIHsKKwkJCQlyZXN1bHQtPmlfc2l6ZSA9IGRlLT5maWxlX3NpemU7CisJCQkJcmVzdWx0LT5pX2RhdGEuYV9vcHMgPSAmaHBmc19hb3BzOworCQkJCWhwZnNfaShyZXN1bHQpLT5tbXVfcHJpdmF0ZSA9IHJlc3VsdC0+aV9zaXplOworCQkJLyoKKwkJCSAqIGlfYmxvY2tzIHNob3VsZCBjb3VudCB0aGUgZm5vZGUgYW5kIGFueSBhbm9kZXMuCisJCQkgKiBXZSBjb3VudCAxIGZvciB0aGUgZm5vZGUgYW5kIGRvbid0IGJvdGhlciBhYm91dAorCQkJICogYW5vZGVzIC0tIHRoZSBkaXNrIGhlYWRzIGFyZSBvbiB0aGUgZGlyZWN0b3J5IGJhbmQKKwkJCSAqIGFuZCB3ZSB3YW50IHRoZW0gdG8gc3RheSB0aGVyZS4KKwkJCSAqLworCQkJCXJlc3VsdC0+aV9ibG9ja3MgPSAxICsgKChyZXN1bHQtPmlfc2l6ZSArIDUxMSkgPj4gOSk7CisJCQl9CisJCX0KKwl9CisKKwlocGZzX2JyZWxzZTQoJnFiaCk7CisKKwkvKgorCSAqIE1hZGUgaXQuCisJICovCisKKwllbmQ6CisJZW5kX2FkZDoKKwlocGZzX3NldF9kZW50cnlfb3BlcmF0aW9ucyhkZW50cnkpOworCXVubG9ja19rZXJuZWwoKTsKKwlkX2FkZChkZW50cnksIHJlc3VsdCk7CisJcmV0dXJuIE5VTEw7CisKKwkvKgorCSAqIERpZG4ndC4KKwkgKi8KKwliYWlsMToKKwkKKwlocGZzX2JyZWxzZTQoJnFiaCk7CisJCisJLypiYWlsOiovCisKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgaHBmc19kaXJfb3BzID0KK3sKKwkubGxzZWVrCQk9IGhwZnNfZGlyX2xzZWVrLAorCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIJPSBocGZzX3JlYWRkaXIsCisJLnJlbGVhc2UJPSBocGZzX2Rpcl9yZWxlYXNlLAorCS5mc3luYwkJPSBocGZzX2ZpbGVfZnN5bmMsCit9OwpkaWZmIC0tZ2l0IGEvZnMvaHBmcy9kbm9kZS5jIGIvZnMvaHBmcy9kbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMjEzMDcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ocGZzL2Rub2RlLmMKQEAgLTAsMCArMSwxMDgwIEBACisvKgorICogIGxpbnV4L2ZzL2hwZnMvZG5vZGUuYworICoKKyAqICBNaWt1bGFzIFBhdG9ja2EgKG1pa3VsYXNAYXJ0YXgua2FybGluLm1mZi5jdW5pLmN6KSwgMTk5OC0xOTk5CisgKgorICogIGhhbmRsaW5nIGRpcmVjdG9yeSBkbm9kZSB0cmVlIC0gYWRkaW5nLCBkZWxldGVpbmcgJiBzZWFyY2hpbmcgZm9yIGRpcmVudHMKKyAqLworCisjaW5jbHVkZSAiaHBmc19mbi5oIgorCitzdGF0aWMgbG9mZl90IGdldF9wb3Moc3RydWN0IGRub2RlICpkLCBzdHJ1Y3QgaHBmc19kaXJlbnQgKmZkZSkKK3sKKwlzdHJ1Y3QgaHBmc19kaXJlbnQgKmRlOworCXN0cnVjdCBocGZzX2RpcmVudCAqZGVfZW5kID0gZG5vZGVfZW5kX2RlKGQpOworCWludCBpID0gMTsKKwlmb3IgKGRlID0gZG5vZGVfZmlyc3RfZGUoZCk7IGRlIDwgZGVfZW5kOyBkZSA9IGRlX25leHRfZGUoZGUpKSB7CisJCWlmIChkZSA9PSBmZGUpIHJldHVybiAoKGxvZmZfdCkgZC0+c2VsZiA8PCA0KSB8IChsb2ZmX3QpaTsKKwkJaSsrOworCX0KKwlwcmludGsoIkhQRlM6IGdldF9wb3M6IG5vdF9mb3VuZFxuIik7CisJcmV0dXJuICgobG9mZl90KWQtPnNlbGYgPDwgNCkgfCAobG9mZl90KTE7Cit9CisKK3ZvaWQgaHBmc19hZGRfcG9zKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBocGZzX2lub2RlX2luZm8gKmhwZnNfaW5vZGUgPSBocGZzX2koaW5vZGUpOworCWludCBpID0gMDsKKwlsb2ZmX3QgKipwcG9zOworCisJaWYgKGhwZnNfaW5vZGUtPmlfcmRkaXJfb2ZmKQorCQlmb3IgKDsgaHBmc19pbm9kZS0+aV9yZGRpcl9vZmZbaV07IGkrKykKKwkJCWlmIChocGZzX2lub2RlLT5pX3JkZGlyX29mZltpXSA9PSBwb3MpIHJldHVybjsKKwlpZiAoIShpJjB4MGYpKSB7CisJCWlmICghKHBwb3MgPSBrbWFsbG9jKChpKzB4MTEpICogc2l6ZW9mKGxvZmZfdCopLCBHRlBfTk9GUykpKSB7CisJCQlwcmludGsoIkhQRlM6IG91dCBvZiBtZW1vcnkgZm9yIHBvc2l0aW9uIGxpc3RcbiIpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChocGZzX2lub2RlLT5pX3JkZGlyX29mZikgeworCQkJbWVtY3B5KHBwb3MsIGhwZnNfaW5vZGUtPmlfcmRkaXJfb2ZmLCBpICogc2l6ZW9mKGxvZmZfdCkpOworCQkJa2ZyZWUoaHBmc19pbm9kZS0+aV9yZGRpcl9vZmYpOworCQl9CisJCWhwZnNfaW5vZGUtPmlfcmRkaXJfb2ZmID0gcHBvczsKKwl9CisJaHBmc19pbm9kZS0+aV9yZGRpcl9vZmZbaV0gPSBwb3M7CisJaHBmc19pbm9kZS0+aV9yZGRpcl9vZmZbaSArIDFdID0gTlVMTDsKK30KKwordm9pZCBocGZzX2RlbF9wb3Moc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGhwZnNfaW5vZGVfaW5mbyAqaHBmc19pbm9kZSA9IGhwZnNfaShpbm9kZSk7CisJbG9mZl90ICoqaSwgKipqOworCisJaWYgKCFocGZzX2lub2RlLT5pX3JkZGlyX29mZikgZ290byBub3RfZjsKKwlmb3IgKGkgPSBocGZzX2lub2RlLT5pX3JkZGlyX29mZjsgKmk7IGkrKykgaWYgKCppID09IHBvcykgZ290byBmbmQ7CisJZ290byBub3RfZjsKKwlmbmQ6CisJZm9yIChqID0gaSArIDE7ICpqOyBqKyspIDsKKwkqaSA9ICooaiAtIDEpOworCSooaiAtIDEpID0gTlVMTDsKKwlpZiAoaiAtIDEgPT0gaHBmc19pbm9kZS0+aV9yZGRpcl9vZmYpIHsKKwkJa2ZyZWUoaHBmc19pbm9kZS0+aV9yZGRpcl9vZmYpOworCQlocGZzX2lub2RlLT5pX3JkZGlyX29mZiA9IE5VTEw7CisJfQorCXJldHVybjsKKwlub3RfZjoKKwkvKnByaW50aygiSFBGUzogd2FybmluZzogcG9zaXRpb24gcG9pbnRlciAlcC0+JTA4eCBub3QgZm91bmRcbiIsIHBvcywgKGludCkqcG9zKTsqLworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgZm9yX2FsbF9wb3NzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHZvaWQgKCpmKShsb2ZmX3QgKiwgbG9mZl90LCBsb2ZmX3QpLAorCQkJIGxvZmZfdCBwMSwgbG9mZl90IHAyKQoreworCXN0cnVjdCBocGZzX2lub2RlX2luZm8gKmhwZnNfaW5vZGUgPSBocGZzX2koaW5vZGUpOworCWxvZmZfdCAqKmk7CisKKwlpZiAoIWhwZnNfaW5vZGUtPmlfcmRkaXJfb2ZmKSByZXR1cm47CisJZm9yIChpID0gaHBmc19pbm9kZS0+aV9yZGRpcl9vZmY7ICppOyBpKyspICgqZikoKmksIHAxLCBwMik7CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBocGZzX3Bvc19zdWJzdChsb2ZmX3QgKnAsIGxvZmZfdCBmLCBsb2ZmX3QgdCkKK3sKKwlpZiAoKnAgPT0gZikgKnAgPSB0OworfQorCisvKnZvaWQgaHBmc19ocGZzX3Bvc19zdWJzdGQobG9mZl90ICpwLCBsb2ZmX3QgZiwgbG9mZl90IHQpCit7CisJaWYgKCgqcCAmIH4weDNmKSA9PSAoZiAmIH4weDNmKSkgKnAgPSAodCAmIH4weDNmKSB8ICgqcCAmIDB4M2YpOworfSovCisKK3N0YXRpYyB2b2lkIGhwZnNfcG9zX2lucyhsb2ZmX3QgKnAsIGxvZmZfdCBkLCBsb2ZmX3QgYykKK3sKKwlpZiAoKCpwICYgfjB4M2YpID09IChkICYgfjB4M2YpICYmICgqcCAmIDB4M2YpID49IChkICYgMHgzZikpIHsKKwkJaW50IG4gPSAoKnAgJiAweDNmKSArIGM7CisJCWlmIChuID4gMHgzZikgcHJpbnRrKCJIUEZTOiBocGZzX3Bvc19pbnM6ICUwOHggKyAlZFxuIiwgKGludCkqcCwgKGludCljID4+IDgpOworCQllbHNlICpwID0gKCpwICYgfjB4M2YpIHwgbjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGhwZnNfcG9zX2RlbChsb2ZmX3QgKnAsIGxvZmZfdCBkLCBsb2ZmX3QgYykKK3sKKwlpZiAoKCpwICYgfjB4M2YpID09IChkICYgfjB4M2YpICYmICgqcCAmIDB4M2YpID49IChkICYgMHgzZikpIHsKKwkJaW50IG4gPSAoKnAgJiAweDNmKSAtIGM7CisJCWlmIChuIDwgMSkgcHJpbnRrKCJIUEZTOiBocGZzX3Bvc19pbnM6ICUwOHggLSAlZFxuIiwgKGludCkqcCwgKGludCljID4+IDgpOworCQllbHNlICpwID0gKCpwICYgfjB4M2YpIHwgbjsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaHBmc19kaXJlbnQgKmRub2RlX3ByZV9sYXN0X2RlKHN0cnVjdCBkbm9kZSAqZCkKK3sKKwlzdHJ1Y3QgaHBmc19kaXJlbnQgKmRlLCAqZGVfZW5kLCAqZGVlID0gTlVMTCwgKmRlZWUgPSBOVUxMOworCWRlX2VuZCA9IGRub2RlX2VuZF9kZShkKTsKKwlmb3IgKGRlID0gZG5vZGVfZmlyc3RfZGUoZCk7IGRlIDwgZGVfZW5kOyBkZSA9IGRlX25leHRfZGUoZGUpKSB7CisJCWRlZWUgPSBkZWU7IGRlZSA9IGRlOworCX0JCisJcmV0dXJuIGRlZWU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaHBmc19kaXJlbnQgKmRub2RlX2xhc3RfZGUoc3RydWN0IGRub2RlICpkKQoreworCXN0cnVjdCBocGZzX2RpcmVudCAqZGUsICpkZV9lbmQsICpkZWUgPSBOVUxMOworCWRlX2VuZCA9IGRub2RlX2VuZF9kZShkKTsKKwlmb3IgKGRlID0gZG5vZGVfZmlyc3RfZGUoZCk7IGRlIDwgZGVfZW5kOyBkZSA9IGRlX25leHRfZGUoZGUpKSB7CisJCWRlZSA9IGRlOworCX0JCisJcmV0dXJuIGRlZTsKK30KKworc3RhdGljIHZvaWQgc2V0X2xhc3RfcG9pbnRlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHN0cnVjdCBkbm9kZSAqZCwgZG5vZGVfc2Vjbm8gcHRyKQoreworCXN0cnVjdCBocGZzX2RpcmVudCAqZGU7CisJaWYgKCEoZGUgPSBkbm9kZV9sYXN0X2RlKGQpKSkgeworCQlocGZzX2Vycm9yKHMsICJzZXRfbGFzdF9wb2ludGVyOiBlbXB0eSBkbm9kZSAlMDh4IiwgZC0+c2VsZik7CisJCXJldHVybjsKKwl9CisJaWYgKGhwZnNfc2IocyktPnNiX2NoaykgeworCQlpZiAoZGUtPmRvd24pIHsKKwkJCWhwZnNfZXJyb3IocywgInNldF9sYXN0X3BvaW50ZXI6IGRub2RlICUwOHggaGFzIGFscmVhZHkgbGFzdCBwb2ludGVyICUwOHgiLAorCQkJCWQtPnNlbGYsIGRlX2Rvd25fcG9pbnRlcihkZSkpOworCQkJcmV0dXJuOworCQl9CisJCWlmIChkZS0+bGVuZ3RoICE9IDMyKSB7CisJCQlocGZzX2Vycm9yKHMsICJzZXRfbGFzdF9wb2ludGVyOiBiYWQgbGFzdCBkaXJlbnQgaW4gZG5vZGUgJTA4eCIsIGQtPnNlbGYpOworCQkJcmV0dXJuOworCQl9CisJfQorCWlmIChwdHIpIHsKKwkJaWYgKChkLT5maXJzdF9mcmVlICs9IDQpID4gMjA0OCkgeworCQkJaHBmc19lcnJvcihzLCJzZXRfbGFzdF9wb2ludGVyOiB0b28gbG9uZyBkbm9kZSAlMDh4IiwgZC0+c2VsZik7CisJCQlkLT5maXJzdF9mcmVlIC09IDQ7CisJCQlyZXR1cm47CisJCX0KKwkJZGUtPmxlbmd0aCA9IDM2OworCQlkZS0+ZG93biA9IDE7CisJCSooZG5vZGVfc2Vjbm8gKikoKGNoYXIgKilkZSArIDMyKSA9IHB0cjsKKwl9Cit9CisKKy8qIEFkZCBhbiBlbnRyeSB0byBkbm9kZSBhbmQgZG9uJ3QgY2FyZSBpZiBpdCBncm93cyBvdmVyIDIwNDggYnl0ZXMgKi8KKworc3RydWN0IGhwZnNfZGlyZW50ICpocGZzX2FkZF9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHN0cnVjdCBkbm9kZSAqZCwgdW5zaWduZWQgY2hhciAqbmFtZSwKKwkJCQl1bnNpZ25lZCBuYW1lbGVuLCBzZWNubyBkb3duX3B0cikKK3sKKwlzdHJ1Y3QgaHBmc19kaXJlbnQgKmRlOworCXN0cnVjdCBocGZzX2RpcmVudCAqZGVfZW5kID0gZG5vZGVfZW5kX2RlKGQpOworCXVuc2lnbmVkIGRfc2l6ZSA9IGRlX3NpemUobmFtZWxlbiwgZG93bl9wdHIpOworCWZvciAoZGUgPSBkbm9kZV9maXJzdF9kZShkKTsgZGUgPCBkZV9lbmQ7IGRlID0gZGVfbmV4dF9kZShkZSkpIHsKKwkJaW50IGMgPSBocGZzX2NvbXBhcmVfbmFtZXMocywgbmFtZSwgbmFtZWxlbiwgZGUtPm5hbWUsIGRlLT5uYW1lbGVuLCBkZS0+bGFzdCk7CisJCWlmICghYykgeworCQkJaHBmc19lcnJvcihzLCAibmFtZSAoJWMsJWQpIGFscmVhZHkgZXhpc3RzIGluIGRub2RlICUwOHgiLCAqbmFtZSwgbmFtZWxlbiwgZC0+c2VsZik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAoYyA8IDApIGJyZWFrOworCX0KKwltZW1tb3ZlKChjaGFyICopZGUgKyBkX3NpemUsIGRlLCAoY2hhciAqKWRlX2VuZCAtIChjaGFyICopZGUpOworCW1lbXNldChkZSwgMCwgZF9zaXplKTsKKwlpZiAoZG93bl9wdHIpIHsKKwkJKihpbnQgKikoKGNoYXIgKilkZSArIGRfc2l6ZSAtIDQpID0gZG93bl9wdHI7CisJCWRlLT5kb3duID0gMTsKKwl9CisJZGUtPmxlbmd0aCA9IGRfc2l6ZTsKKwlpZiAoZG93bl9wdHIpIGRlLT5kb3duID0gMTsKKwlkZS0+bm90Xzh4MyA9IGhwZnNfaXNfbmFtZV9sb25nKG5hbWUsIG5hbWVsZW4pOworCWRlLT5uYW1lbGVuID0gbmFtZWxlbjsKKwltZW1jcHkoZGUtPm5hbWUsIG5hbWUsIG5hbWVsZW4pOworCWQtPmZpcnN0X2ZyZWUgKz0gZF9zaXplOworCXJldHVybiBkZTsKK30KKworLyogRGVsZXRlIGRpcmVudCBhbmQgZG9uJ3QgY2FyZSBhYm91dCBpdHMgc3VidHJlZSAqLworCitzdGF0aWMgdm9pZCBocGZzX2RlbGV0ZV9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHN0cnVjdCBkbm9kZSAqZCwKKwkJCSAgIHN0cnVjdCBocGZzX2RpcmVudCAqZGUpCit7CisJaWYgKGRlLT5sYXN0KSB7CisJCWhwZnNfZXJyb3IocywgImF0dGVtcHQgdG8gZGVsZXRlIGxhc3QgZGlyZW50IGluIGRub2RlICUwOHgiLCBkLT5zZWxmKTsKKwkJcmV0dXJuOworCX0KKwlkLT5maXJzdF9mcmVlIC09IGRlLT5sZW5ndGg7CisJbWVtbW92ZShkZSwgZGVfbmV4dF9kZShkZSksIGQtPmZpcnN0X2ZyZWUgKyAoY2hhciAqKWQgLSAoY2hhciAqKWRlKTsKK30KKworc3RhdGljIHZvaWQgZml4X3VwX3B0cnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzdHJ1Y3QgZG5vZGUgKmQpCit7CisJc3RydWN0IGhwZnNfZGlyZW50ICpkZTsKKwlzdHJ1Y3QgaHBmc19kaXJlbnQgKmRlX2VuZCA9IGRub2RlX2VuZF9kZShkKTsKKwlkbm9kZV9zZWNubyBkbm8gPSBkLT5zZWxmOworCWZvciAoZGUgPSBkbm9kZV9maXJzdF9kZShkKTsgZGUgPCBkZV9lbmQ7IGRlID0gZGVfbmV4dF9kZShkZSkpCisJCWlmIChkZS0+ZG93bikgeworCQkJc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgcWJoOworCQkJc3RydWN0IGRub2RlICpkZDsKKwkJCWlmICgoZGQgPSBocGZzX21hcF9kbm9kZShzLCBkZV9kb3duX3BvaW50ZXIoZGUpLCAmcWJoKSkpIHsKKwkJCQlpZiAoZGQtPnVwICE9IGRubyB8fCBkZC0+cm9vdF9kbm9kZSkgeworCQkJCQlkZC0+dXAgPSBkbm87CisJCQkJCWRkLT5yb290X2Rub2RlID0gMDsKKwkJCQkJaHBmc19tYXJrXzRidWZmZXJzX2RpcnR5KCZxYmgpOworCQkJCX0KKwkJCQlocGZzX2JyZWxzZTQoJnFiaCk7CisJCQl9CisJCX0KK30KKworLyogQWRkIGFuIGVudHJ5IHRvIGRub2RlIGFuZCBkbyBkbm9kZSBzcGxpdHRpbmcgaWYgcmVxdWlyZWQgKi8KKworc3RhdGljIGludCBocGZzX2FkZF90b19kbm9kZShzdHJ1Y3QgaW5vZGUgKmksIGRub2RlX3NlY25vIGRubywKKwkJCSAgICAgdW5zaWduZWQgY2hhciAqbmFtZSwgdW5zaWduZWQgbmFtZWxlbiwKKwkJCSAgICAgc3RydWN0IGhwZnNfZGlyZW50ICpuZXdfZGUsIGRub2RlX3NlY25vIGRvd25fcHRyKQoreworCXN0cnVjdCBxdWFkX2J1ZmZlcl9oZWFkIHFiaCwgcWJoMSwgcWJoMjsKKwlzdHJ1Y3QgZG5vZGUgKmQsICphZCwgKnJkLCAqbmQgPSBOVUxMOworCWRub2RlX3NlY25vIGFkbm8sIHJkbm87CisJc3RydWN0IGhwZnNfZGlyZW50ICpkZTsKKwlzdHJ1Y3QgaHBmc19kaXJlbnQgbmRlOworCWNoYXIgKm5uYW1lOworCWludCBoOworCWludCBwb3M7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgZm5vZGUgKmZub2RlOworCWludCBjMSwgYzIgPSAwOworCWlmICghKG5uYW1lID0ga21hbGxvYygyNTYsIEdGUF9OT0ZTKSkpIHsKKwkJcHJpbnRrKCJIUEZTOiBvdXQgb2YgbWVtb3J5LCBjYW4ndCBhZGQgdG8gZG5vZGVcbiIpOworCQlyZXR1cm4gMTsKKwl9CisJZ29fdXA6CisJaWYgKG5hbWVsZW4gPj0gMjU2KSB7CisJCWhwZnNfZXJyb3IoaS0+aV9zYiwgImhwZnNfYWRkX3RvX2Rub2RlOiBuYW1lbGVuID09ICVkIiwgbmFtZWxlbik7CisJCWlmIChuZCkga2ZyZWUobmQpOworCQlrZnJlZShubmFtZSk7CisJCXJldHVybiAxOworCX0KKwlpZiAoIShkID0gaHBmc19tYXBfZG5vZGUoaS0+aV9zYiwgZG5vLCAmcWJoKSkpIHsKKwkJaWYgKG5kKSBrZnJlZShuZCk7CisJCWtmcmVlKG5uYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCWdvX3VwX2E6CisJaWYgKGhwZnNfc2IoaS0+aV9zYiktPnNiX2NoaykKKwkJaWYgKGhwZnNfc3RvcF9jeWNsZXMoaS0+aV9zYiwgZG5vLCAmYzEsICZjMiwgImhwZnNfYWRkX3RvX2Rub2RlIikpIHsKKwkJCWhwZnNfYnJlbHNlNCgmcWJoKTsKKwkJCWlmIChuZCkga2ZyZWUobmQpOworCQkJa2ZyZWUobm5hbWUpOworCQkJcmV0dXJuIDE7CisJCX0KKwlpZiAoZC0+Zmlyc3RfZnJlZSArIGRlX3NpemUobmFtZWxlbiwgZG93bl9wdHIpIDw9IDIwNDgpIHsKKwkJbG9mZl90IHQ7CisJCWNvcHlfZGUoZGU9aHBmc19hZGRfZGUoaS0+aV9zYiwgZCwgbmFtZSwgbmFtZWxlbiwgZG93bl9wdHIpLCBuZXdfZGUpOworCQl0ID0gZ2V0X3BvcyhkLCBkZSk7CisJCWZvcl9hbGxfcG9zcyhpLCBocGZzX3Bvc19pbnMsIHQsIDEpOworCQlmb3JfYWxsX3Bvc3MoaSwgaHBmc19wb3Nfc3Vic3QsIDQsIHQpOworCQlmb3JfYWxsX3Bvc3MoaSwgaHBmc19wb3Nfc3Vic3QsIDUsIHQgKyAxKTsKKwkJaHBmc19tYXJrXzRidWZmZXJzX2RpcnR5KCZxYmgpOworCQlocGZzX2JyZWxzZTQoJnFiaCk7CisJCWlmIChuZCkga2ZyZWUobmQpOworCQlrZnJlZShubmFtZSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoIW5kKSBpZiAoIShuZCA9IGttYWxsb2MoMHg5MjQsIEdGUF9OT0ZTKSkpIHsKKwkJLyogMHg5MjQgaXMgYSBtYXggc2l6ZSBvZiBkbm9kZSBhZnRlciBhZGRpbmcgYSBkaXJlbnQgd2l0aAorCQkgICBtYXggbmFtZSBsZW5ndGguIFdlIGFsbG9jIHRoaXMgb25seSBvbmNlLiBUaGVyZSBtdXN0CisJCSAgIG5vdCBiZSBhbnkgZXJyb3Igd2hpbGUgc3BsaXR0aW5nIGRub2Rlcywgb3RoZXJ3aXNlIHRoZQorCQkgICB3aG9sZSBkaXJlY3RvcnksIG5vdCBvbmx5IGZpbGUgd2UncmUgYWRkaW5nLCB3b3VsZAorCQkgICBiZSBsb3N0LiAqLworCQlwcmludGsoIkhQRlM6IG91dCBvZiBtZW1vcnkgZm9yIGRub2RlIHNwbGl0dGluZ1xuIik7CisJCWhwZnNfYnJlbHNlNCgmcWJoKTsKKwkJa2ZyZWUobm5hbWUpOworCQlyZXR1cm4gMTsKKwl9CQorCW1lbWNweShuZCwgZCwgZC0+Zmlyc3RfZnJlZSk7CisJY29weV9kZShkZSA9IGhwZnNfYWRkX2RlKGktPmlfc2IsIG5kLCBuYW1lLCBuYW1lbGVuLCBkb3duX3B0ciksIG5ld19kZSk7CisJZm9yX2FsbF9wb3NzKGksIGhwZnNfcG9zX2lucywgZ2V0X3BvcyhuZCwgZGUpLCAxKTsKKwloID0gKChjaGFyICopZG5vZGVfbGFzdF9kZShuZCkgLSAoY2hhciAqKW5kKSAvIDIgKyAxMDsKKwlpZiAoIShhZCA9IGhwZnNfYWxsb2NfZG5vZGUoaS0+aV9zYiwgZC0+dXAsICZhZG5vLCAmcWJoMSwgMCkpKSB7CisJCWhwZnNfZXJyb3IoaS0+aV9zYiwgInVuYWJsZSB0byBhbGxvYyBkbm9kZSAtIGRub2RlIHRyZWUgd2lsbCBiZSBjb3JydXB0ZWQiKTsKKwkJaHBmc19icmVsc2U0KCZxYmgpOworCQlrZnJlZShuZCk7CisJCWtmcmVlKG5uYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCWktPmlfc2l6ZSArPSAyMDQ4OworCWktPmlfYmxvY2tzICs9IDQ7CisJcG9zID0gMTsKKwlmb3IgKGRlID0gZG5vZGVfZmlyc3RfZGUobmQpOyAoY2hhciAqKWRlX25leHRfZGUoZGUpIC0gKGNoYXIgKiluZCA8IGg7IGRlID0gZGVfbmV4dF9kZShkZSkpIHsKKwkJY29weV9kZShocGZzX2FkZF9kZShpLT5pX3NiLCBhZCwgZGUtPm5hbWUsIGRlLT5uYW1lbGVuLCBkZS0+ZG93biA/IGRlX2Rvd25fcG9pbnRlcihkZSkgOiAwKSwgZGUpOworCQlmb3JfYWxsX3Bvc3MoaSwgaHBmc19wb3Nfc3Vic3QsICgobG9mZl90KWRubyA8PCA0KSB8IHBvcywgKChsb2ZmX3QpYWRubyA8PCA0KSB8IHBvcyk7CisJCXBvcysrOworCX0KKwljb3B5X2RlKG5ld19kZSA9ICZuZGUsIGRlKTsKKwltZW1jcHkobmFtZSA9IG5uYW1lLCBkZS0+bmFtZSwgbmFtZWxlbiA9IGRlLT5uYW1lbGVuKTsKKwlmb3JfYWxsX3Bvc3MoaSwgaHBmc19wb3Nfc3Vic3QsICgobG9mZl90KWRubyA8PCA0KSB8IHBvcywgNCk7CisJZG93bl9wdHIgPSBhZG5vOworCXNldF9sYXN0X3BvaW50ZXIoaS0+aV9zYiwgYWQsIGRlLT5kb3duID8gZGVfZG93bl9wb2ludGVyKGRlKSA6IDApOworCWRlID0gZGVfbmV4dF9kZShkZSk7CisJbWVtbW92ZSgoY2hhciAqKW5kICsgMjAsIGRlLCBuZC0+Zmlyc3RfZnJlZSArIChjaGFyICopbmQgLSAoY2hhciAqKWRlKTsKKwluZC0+Zmlyc3RfZnJlZSAtPSAoY2hhciAqKWRlIC0gKGNoYXIgKiluZCAtIDIwOworCW1lbWNweShkLCBuZCwgbmQtPmZpcnN0X2ZyZWUpOworCWZvcl9hbGxfcG9zcyhpLCBocGZzX3Bvc19kZWwsIChsb2ZmX3QpZG5vIDw8IDQsIHBvcyk7CisJZml4X3VwX3B0cnMoaS0+aV9zYiwgYWQpOworCWlmICghZC0+cm9vdF9kbm9kZSkgeworCQlkbm8gPSBhZC0+dXAgPSBkLT51cDsKKwkJaHBmc19tYXJrXzRidWZmZXJzX2RpcnR5KCZxYmgpOworCQlocGZzX2JyZWxzZTQoJnFiaCk7CisJCWhwZnNfbWFya180YnVmZmVyc19kaXJ0eSgmcWJoMSk7CisJCWhwZnNfYnJlbHNlNCgmcWJoMSk7CisJCWdvdG8gZ29fdXA7CisJfQorCWlmICghKHJkID0gaHBmc19hbGxvY19kbm9kZShpLT5pX3NiLCBkLT51cCwgJnJkbm8sICZxYmgyLCAwKSkpIHsKKwkJaHBmc19lcnJvcihpLT5pX3NiLCAidW5hYmxlIHRvIGFsbG9jIGRub2RlIC0gZG5vZGUgdHJlZSB3aWxsIGJlIGNvcnJ1cHRlZCIpOworCQlocGZzX2JyZWxzZTQoJnFiaCk7CisJCWhwZnNfYnJlbHNlNCgmcWJoMSk7CisJCWtmcmVlKG5kKTsKKwkJa2ZyZWUobm5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisJaS0+aV9zaXplICs9IDIwNDg7CisJaS0+aV9ibG9ja3MgKz0gNDsKKwlyZC0+cm9vdF9kbm9kZSA9IDE7CisJcmQtPnVwID0gZC0+dXA7CisJaWYgKCEoZm5vZGUgPSBocGZzX21hcF9mbm9kZShpLT5pX3NiLCBkLT51cCwgJmJoKSkpIHsKKwkJaHBmc19mcmVlX2Rub2RlKGktPmlfc2IsIHJkbm8pOworCQlocGZzX2JyZWxzZTQoJnFiaCk7CisJCWhwZnNfYnJlbHNlNCgmcWJoMSk7CisJCWhwZnNfYnJlbHNlNCgmcWJoMik7CisJCWtmcmVlKG5kKTsKKwkJa2ZyZWUobm5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisJZm5vZGUtPnUuZXh0ZXJuYWxbMF0uZGlza19zZWNubyA9IHJkbm87CisJbWFya19idWZmZXJfZGlydHkoYmgpOworCWJyZWxzZShiaCk7CisJZC0+dXAgPSBhZC0+dXAgPSBocGZzX2koaSktPmlfZG5vID0gcmRubzsKKwlkLT5yb290X2Rub2RlID0gYWQtPnJvb3RfZG5vZGUgPSAwOworCWhwZnNfbWFya180YnVmZmVyc19kaXJ0eSgmcWJoKTsKKwlocGZzX2JyZWxzZTQoJnFiaCk7CisJaHBmc19tYXJrXzRidWZmZXJzX2RpcnR5KCZxYmgxKTsKKwlocGZzX2JyZWxzZTQoJnFiaDEpOworCXFiaCA9IHFiaDI7CisJc2V0X2xhc3RfcG9pbnRlcihpLT5pX3NiLCByZCwgZG5vKTsKKwlkbm8gPSByZG5vOworCWQgPSByZDsKKwlnb3RvIGdvX3VwX2E7Cit9CisKKy8qCisgKiBBZGQgYW4gZW50cnkgdG8gZGlyZWN0b3J5IGJ0cmVlLgorICogSSBoYXRlIHN1Y2ggY3JhenkgZGlyZWN0b3J5IHN0cnVjdHVyZS4KKyAqIEl0J3MgZWFzeSB0byByZWFkIGJ1dCB0ZXJyaWJsZSB0byB3cml0ZS4KKyAqIEkgd3JvdGUgdGhpcyBkaXJlY3RvcnkgY29kZSA0IHRpbWVzLgorICogSSBob3BlLCBub3cgaXQncyBmaW5hbGx5IGJ1Zy1mcmVlLgorICovCisKK2ludCBocGZzX2FkZF9kaXJlbnQoc3RydWN0IGlub2RlICppLCB1bnNpZ25lZCBjaGFyICpuYW1lLCB1bnNpZ25lZCBuYW1lbGVuLAorCQkgICAgc3RydWN0IGhwZnNfZGlyZW50ICpuZXdfZGUsIGludCBjZGVwdGgpCit7CisJc3RydWN0IGhwZnNfaW5vZGVfaW5mbyAqaHBmc19pbm9kZSA9IGhwZnNfaShpKTsKKwlzdHJ1Y3QgZG5vZGUgKmQ7CisJc3RydWN0IGhwZnNfZGlyZW50ICpkZSwgKmRlX2VuZDsKKwlzdHJ1Y3QgcXVhZF9idWZmZXJfaGVhZCBxYmg7CisJZG5vZGVfc2Vjbm8gZG5vOworCWludCBjOworCWludCBjMSwgYzIgPSAwOworCWRubyA9IGhwZnNfaW5vZGUtPmlfZG5vOworCWRvd246CisJaWYgKGhwZnNfc2IoaS0+aV9zYiktPnNiX2NoaykKKwkJaWYgKGhwZnNfc3RvcF9jeWNsZXMoaS0+aV9zYiwgZG5vLCAmYzEsICZjMiwgImhwZnNfYWRkX2RpcmVudCIpKSByZXR1cm4gMTsKKwlpZiAoIShkID0gaHBmc19tYXBfZG5vZGUoaS0+aV9zYiwgZG5vLCAmcWJoKSkpIHJldHVybiAxOworCWRlX2VuZCA9IGRub2RlX2VuZF9kZShkKTsKKwlmb3IgKGRlID0gZG5vZGVfZmlyc3RfZGUoZCk7IGRlIDwgZGVfZW5kOyBkZSA9IGRlX25leHRfZGUoZGUpKSB7CisJCWlmICghKGMgPSBocGZzX2NvbXBhcmVfbmFtZXMoaS0+aV9zYiwgbmFtZSwgbmFtZWxlbiwgZGUtPm5hbWUsIGRlLT5uYW1lbGVuLCBkZS0+bGFzdCkpKSB7CisJCQlocGZzX2JyZWxzZTQoJnFiaCk7CisJCQlyZXR1cm4gLTE7CisJCX0JCisJCWlmIChjIDwgMCkgeworCQkJaWYgKGRlLT5kb3duKSB7CisJCQkJZG5vID0gZGVfZG93bl9wb2ludGVyKGRlKTsKKwkJCQlocGZzX2JyZWxzZTQoJnFiaCk7CisJCQkJZ290byBkb3duOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisJaHBmc19icmVsc2U0KCZxYmgpOworCWlmICghY2RlcHRoKSBocGZzX2xvY2tfY3JlYXRpb24oaS0+aV9zYik7CisJaWYgKGhwZnNfY2hlY2tfZnJlZV9kbm9kZXMoaS0+aV9zYiwgRlJFRV9ETk9ERVNfQUREKSkgeworCQljID0gMTsKKwkJZ290byByZXQ7CisJfQkKKwlpLT5pX3ZlcnNpb24rKzsKKwljID0gaHBmc19hZGRfdG9fZG5vZGUoaSwgZG5vLCBuYW1lLCBuYW1lbGVuLCBuZXdfZGUsIDApOworCXJldDoKKwlpZiAoIWNkZXB0aCkgaHBmc191bmxvY2tfY3JlYXRpb24oaS0+aV9zYik7CisJcmV0dXJuIGM7Cit9CisKKy8qIAorICogRmluZCBkaXJlbnQgd2l0aCBoaWdoZXIgbmFtZSBpbiAnZnJvbScgc3VidHJlZSBhbmQgbW92ZSBpdCB0byAndG8nIGRub2RlLgorICogUmV0dXJuIHRoZSBkbm9kZSB3ZSBtb3ZlZCBmcm9tICh0byBiZSBjaGVja2VkIGxhdGVyIGlmIGl0J3MgZW1wdHkpCisgKi8KKworc3RhdGljIHNlY25vIG1vdmVfdG9fdG9wKHN0cnVjdCBpbm9kZSAqaSwgZG5vZGVfc2Vjbm8gZnJvbSwgZG5vZGVfc2Vjbm8gdG8pCit7CisJZG5vZGVfc2Vjbm8gZG5vLCBkZG5vOworCWRub2RlX3NlY25vIGNoa191cCA9IHRvOworCXN0cnVjdCBkbm9kZSAqZG5vZGU7CisJc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgcWJoOworCXN0cnVjdCBocGZzX2RpcmVudCAqZGUsICpuZGU7CisJaW50IGE7CisJbG9mZl90IHQ7CisJaW50IGMxLCBjMiA9IDA7CisJZG5vID0gZnJvbTsKKwl3aGlsZSAoMSkgeworCQlpZiAoaHBmc19zYihpLT5pX3NiKS0+c2JfY2hrKQorCQkJaWYgKGhwZnNfc3RvcF9jeWNsZXMoaS0+aV9zYiwgZG5vLCAmYzEsICZjMiwgIm1vdmVfdG9fdG9wIikpCisJCQkJcmV0dXJuIDA7CisJCWlmICghKGRub2RlID0gaHBmc19tYXBfZG5vZGUoaS0+aV9zYiwgZG5vLCAmcWJoKSkpIHJldHVybiAwOworCQlpZiAoaHBmc19zYihpLT5pX3NiKS0+c2JfY2hrKSB7CisJCQlpZiAoZG5vZGUtPnVwICE9IGNoa191cCkgeworCQkJCWhwZnNfZXJyb3IoaS0+aV9zYiwgIm1vdmVfdG9fdG9wOiB1cCBwb2ludGVyIGZyb20gJTA4eCBzaG91bGQgYmUgJTA4eCwgaXMgJTA4eCIsCisJCQkJCWRubywgY2hrX3VwLCBkbm9kZS0+dXApOworCQkJCWhwZnNfYnJlbHNlNCgmcWJoKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWNoa191cCA9IGRubzsKKwkJfQorCQlpZiAoIShkZSA9IGRub2RlX2xhc3RfZGUoZG5vZGUpKSkgeworCQkJaHBmc19lcnJvcihpLT5pX3NiLCAibW92ZV90b190b3A6IGRub2RlICUwOHggaGFzIG5vIGxhc3QgZGUiLCBkbm8pOworCQkJaHBmc19icmVsc2U0KCZxYmgpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKCFkZS0+ZG93bikgYnJlYWs7CisJCWRubyA9IGRlX2Rvd25fcG9pbnRlcihkZSk7CisJCWhwZnNfYnJlbHNlNCgmcWJoKTsKKwl9CisJd2hpbGUgKCEoZGUgPSBkbm9kZV9wcmVfbGFzdF9kZShkbm9kZSkpKSB7CisJCWRub2RlX3NlY25vIHVwID0gZG5vZGUtPnVwOworCQlocGZzX2JyZWxzZTQoJnFiaCk7CisJCWhwZnNfZnJlZV9kbm9kZShpLT5pX3NiLCBkbm8pOworCQlpLT5pX3NpemUgLT0gMjA0ODsKKwkJaS0+aV9ibG9ja3MgLT0gNDsKKwkJZm9yX2FsbF9wb3NzKGksIGhwZnNfcG9zX3N1YnN0LCAoKGxvZmZfdClkbm8gPDwgNCkgfCAxLCA1KTsKKwkJaWYgKHVwID09IHRvKSByZXR1cm4gdG87CisJCWlmICghKGRub2RlID0gaHBmc19tYXBfZG5vZGUoaS0+aV9zYiwgdXAsICZxYmgpKSkgcmV0dXJuIDA7CisJCWlmIChkbm9kZS0+cm9vdF9kbm9kZSkgeworCQkJaHBmc19lcnJvcihpLT5pX3NiLCAibW92ZV90b190b3A6IGdvdCB0byByb290X2Rub2RlIHdoaWxlIG1vdmluZyBmcm9tICUwOHggdG8gJTA4eCIsIGZyb20sIHRvKTsKKwkJCWhwZnNfYnJlbHNlNCgmcWJoKTsKKwkJCXJldHVybiAwOworCQl9CisJCWRlID0gZG5vZGVfbGFzdF9kZShkbm9kZSk7CisJCWlmICghZGUgfHwgIWRlLT5kb3duKSB7CisJCQlocGZzX2Vycm9yKGktPmlfc2IsICJtb3ZlX3RvX3RvcDogZG5vZGUgJTA4eCBkb2Vzbid0IHBvaW50IGRvd24gdG8gJTA4eCIsIHVwLCBkbm8pOworCQkJaHBmc19icmVsc2U0KCZxYmgpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJZG5vZGUtPmZpcnN0X2ZyZWUgLT0gNDsKKwkJZGUtPmxlbmd0aCAtPSA0OworCQlkZS0+ZG93biA9IDA7CisJCWhwZnNfbWFya180YnVmZmVyc19kaXJ0eSgmcWJoKTsKKwkJZG5vID0gdXA7CisJfQorCXQgPSBnZXRfcG9zKGRub2RlLCBkZSk7CisJZm9yX2FsbF9wb3NzKGksIGhwZnNfcG9zX3N1YnN0LCB0LCA0KTsKKwlmb3JfYWxsX3Bvc3MoaSwgaHBmc19wb3Nfc3Vic3QsIHQgKyAxLCA1KTsKKwlpZiAoIShuZGUgPSBrbWFsbG9jKGRlLT5sZW5ndGgsIEdGUF9OT0ZTKSkpIHsKKwkJaHBmc19lcnJvcihpLT5pX3NiLCAib3V0IG9mIG1lbW9yeSBmb3IgZGlyZW50IC0gZGlyZWN0b3J5IHdpbGwgYmUgY29ycnVwdGVkIik7CisJCWhwZnNfYnJlbHNlNCgmcWJoKTsKKwkJcmV0dXJuIDA7CisJfQorCW1lbWNweShuZGUsIGRlLCBkZS0+bGVuZ3RoKTsKKwlkZG5vID0gZGUtPmRvd24gPyBkZV9kb3duX3BvaW50ZXIoZGUpIDogMDsKKwlocGZzX2RlbGV0ZV9kZShpLT5pX3NiLCBkbm9kZSwgZGUpOworCXNldF9sYXN0X3BvaW50ZXIoaS0+aV9zYiwgZG5vZGUsIGRkbm8pOworCWhwZnNfbWFya180YnVmZmVyc19kaXJ0eSgmcWJoKTsKKwlocGZzX2JyZWxzZTQoJnFiaCk7CisJYSA9IGhwZnNfYWRkX3RvX2Rub2RlKGksIHRvLCBuZGUtPm5hbWUsIG5kZS0+bmFtZWxlbiwgbmRlLCBmcm9tKTsKKwlrZnJlZShuZGUpOworCWlmIChhKSByZXR1cm4gMDsKKwlyZXR1cm4gZG5vOworfQorCisvKiAKKyAqIENoZWNrIGlmIGEgZG5vZGUgaXMgZW1wdHkgYW5kIGRlbGV0ZSBpdCBmcm9tIHRoZSB0cmVlCisgKiAoY2hrZHNrIGRvZXNuJ3QgbGlrZSBlbXB0eSBkbm9kZXMpCisgKi8KKworc3RhdGljIHZvaWQgZGVsZXRlX2VtcHR5X2Rub2RlKHN0cnVjdCBpbm9kZSAqaSwgZG5vZGVfc2Vjbm8gZG5vKQoreworCXN0cnVjdCBocGZzX2lub2RlX2luZm8gKmhwZnNfaW5vZGUgPSBocGZzX2koaSk7CisJc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgcWJoOworCXN0cnVjdCBkbm9kZSAqZG5vZGU7CisJZG5vZGVfc2Vjbm8gZG93biwgdXAsIG5kb3duOworCWludCBwOworCXN0cnVjdCBocGZzX2RpcmVudCAqZGU7CisJaW50IGMxLCBjMiA9IDA7CisJdHJ5X2l0X2FnYWluOgorCWlmIChocGZzX3N0b3BfY3ljbGVzKGktPmlfc2IsIGRubywgJmMxLCAmYzIsICJkZWxldGVfZW1wdHlfZG5vZGUiKSkgcmV0dXJuOworCWlmICghKGRub2RlID0gaHBmc19tYXBfZG5vZGUoaS0+aV9zYiwgZG5vLCAmcWJoKSkpIHJldHVybjsKKwlpZiAoZG5vZGUtPmZpcnN0X2ZyZWUgPiA1NikgZ290byBlbmQ7CisJaWYgKGRub2RlLT5maXJzdF9mcmVlID09IDUyIHx8IGRub2RlLT5maXJzdF9mcmVlID09IDU2KSB7CisJCXN0cnVjdCBocGZzX2RpcmVudCAqZGVfZW5kOworCQlpbnQgcm9vdCA9IGRub2RlLT5yb290X2Rub2RlOworCQl1cCA9IGRub2RlLT51cDsKKwkJZGUgPSBkbm9kZV9maXJzdF9kZShkbm9kZSk7CisJCWRvd24gPSBkZS0+ZG93biA/IGRlX2Rvd25fcG9pbnRlcihkZSkgOiAwOworCQlpZiAoaHBmc19zYihpLT5pX3NiKS0+c2JfY2hrKSBpZiAocm9vdCAmJiAhZG93bikgeworCQkJaHBmc19lcnJvcihpLT5pX3NiLCAiZGVsZXRlX2VtcHR5X2Rub2RlOiByb290IGRub2RlICUwOHggaXMgZW1wdHkiLCBkbm8pOworCQkJZ290byBlbmQ7CisJCX0KKwkJaHBmc19icmVsc2U0KCZxYmgpOworCQlocGZzX2ZyZWVfZG5vZGUoaS0+aV9zYiwgZG5vKTsKKwkJaS0+aV9zaXplIC09IDIwNDg7CisJCWktPmlfYmxvY2tzIC09IDQ7CisJCWlmIChyb290KSB7CisJCQlzdHJ1Y3QgZm5vZGUgKmZub2RlOworCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwkJCXN0cnVjdCBkbm9kZSAqZDE7CisJCQlzdHJ1Y3QgcXVhZF9idWZmZXJfaGVhZCBxYmgxOworCQkJaWYgKGhwZnNfc2IoaS0+aV9zYiktPnNiX2NoaykgaWYgKHVwICE9IGktPmlfaW5vKSB7CisJCQkJaHBmc19lcnJvcihpLT5pX3NiLCAiYmFkIHBvaW50ZXIgdG8gZm5vZGUsIGRub2RlICUwOHgsIHBvaW50aW5nIHRvICUwOHgsIHNob3VsZCBiZSAlMDh4IiwgZG5vLCB1cCwgaS0+aV9pbm8pOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmICgoZDEgPSBocGZzX21hcF9kbm9kZShpLT5pX3NiLCBkb3duLCAmcWJoMSkpKSB7CisJCQkJZDEtPnVwID0gdXA7CisJCQkJZDEtPnJvb3RfZG5vZGUgPSAxOworCQkJCWhwZnNfbWFya180YnVmZmVyc19kaXJ0eSgmcWJoMSk7CisJCQkJaHBmc19icmVsc2U0KCZxYmgxKTsKKwkJCX0KKwkJCWlmICgoZm5vZGUgPSBocGZzX21hcF9mbm9kZShpLT5pX3NiLCB1cCwgJmJoKSkpIHsKKwkJCQlmbm9kZS0+dS5leHRlcm5hbFswXS5kaXNrX3NlY25vID0gZG93bjsKKwkJCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCQkJYnJlbHNlKGJoKTsKKwkJCX0KKwkJCWhwZnNfaW5vZGUtPmlfZG5vID0gZG93bjsKKwkJCWZvcl9hbGxfcG9zcyhpLCBocGZzX3Bvc19zdWJzdCwgKChsb2ZmX3QpZG5vIDw8IDQpIHwgMSwgKGxvZmZfdCkgMTIpOworCQkJcmV0dXJuOworCQl9CisJCWlmICghKGRub2RlID0gaHBmc19tYXBfZG5vZGUoaS0+aV9zYiwgdXAsICZxYmgpKSkgcmV0dXJuOworCQlwID0gMTsKKwkJZGVfZW5kID0gZG5vZGVfZW5kX2RlKGRub2RlKTsKKwkJZm9yIChkZSA9IGRub2RlX2ZpcnN0X2RlKGRub2RlKTsgZGUgPCBkZV9lbmQ7IGRlID0gZGVfbmV4dF9kZShkZSksIHArKykKKwkJCWlmIChkZS0+ZG93bikgaWYgKGRlX2Rvd25fcG9pbnRlcihkZSkgPT0gZG5vKSBnb3RvIGZuZDsKKwkJaHBmc19lcnJvcihpLT5pX3NiLCAiZGVsZXRlX2VtcHR5X2Rub2RlOiBwb2ludGVyIHRvIGRub2RlICUwOHggbm90IGZvdW5kIGluIGRub2RlICUwOHgiLCBkbm8sIHVwKTsKKwkJZ290byBlbmQ7CisJCWZuZDoKKwkJZm9yX2FsbF9wb3NzKGksIGhwZnNfcG9zX3N1YnN0LCAoKGxvZmZfdClkbm8gPDwgNCkgfCAxLCAoKGxvZmZfdCl1cCA8PCA0KSB8IHApOworCQlpZiAoIWRvd24pIHsKKwkJCWRlLT5kb3duID0gMDsKKwkJCWRlLT5sZW5ndGggLT0gNDsKKwkJCWRub2RlLT5maXJzdF9mcmVlIC09IDQ7CisJCQltZW1tb3ZlKGRlX25leHRfZGUoZGUpLCAoY2hhciAqKWRlX25leHRfZGUoZGUpICsgNCwKKwkJCQkoY2hhciAqKWRub2RlICsgZG5vZGUtPmZpcnN0X2ZyZWUgLSAoY2hhciAqKWRlX25leHRfZGUoZGUpKTsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBkbm9kZSAqZDE7CisJCQlzdHJ1Y3QgcXVhZF9idWZmZXJfaGVhZCBxYmgxOworCQkJKihkbm9kZV9zZWNubyAqKSAoKHZvaWQgKikgZGUgKyBkZS0+bGVuZ3RoIC0gNCkgPSBkb3duOworCQkJaWYgKChkMSA9IGhwZnNfbWFwX2Rub2RlKGktPmlfc2IsIGRvd24sICZxYmgxKSkpIHsKKwkJCQlkMS0+dXAgPSB1cDsKKwkJCQlocGZzX21hcmtfNGJ1ZmZlcnNfZGlydHkoJnFiaDEpOworCQkJCWhwZnNfYnJlbHNlNCgmcWJoMSk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlocGZzX2Vycm9yKGktPmlfc2IsICJkZWxldGVfZW1wdHlfZG5vZGU6IGRub2RlICUwOHgsIGZpcnN0X2ZyZWUgPT0gJTAzeCIsIGRubywgZG5vZGUtPmZpcnN0X2ZyZWUpOworCQlnb3RvIGVuZDsKKwl9CisKKwlpZiAoIWRlLT5sYXN0KSB7CisJCXN0cnVjdCBocGZzX2RpcmVudCAqZGVfbmV4dCA9IGRlX25leHRfZGUoZGUpOworCQlzdHJ1Y3QgaHBmc19kaXJlbnQgKmRlX2NwOworCQlzdHJ1Y3QgZG5vZGUgKmQxOworCQlzdHJ1Y3QgcXVhZF9idWZmZXJfaGVhZCBxYmgxOworCQlpZiAoIWRlX25leHQtPmRvd24pIGdvdG8gZW5kbTsKKwkJbmRvd24gPSBkZV9kb3duX3BvaW50ZXIoZGVfbmV4dCk7CisJCWlmICghKGRlX2NwID0ga21hbGxvYyhkZS0+bGVuZ3RoLCBHRlBfTk9GUykpKSB7CisJCQlwcmludGsoIkhQRlM6IG91dCBvZiBtZW1vcnkgZm9yIGR0cmVlIGJhbGFuY2luZ1xuIik7CisJCQlnb3RvIGVuZG07CisJCX0KKwkJbWVtY3B5KGRlX2NwLCBkZSwgZGUtPmxlbmd0aCk7CisJCWhwZnNfZGVsZXRlX2RlKGktPmlfc2IsIGRub2RlLCBkZSk7CisJCWhwZnNfbWFya180YnVmZmVyc19kaXJ0eSgmcWJoKTsKKwkJaHBmc19icmVsc2U0KCZxYmgpOworCQlmb3JfYWxsX3Bvc3MoaSwgaHBmc19wb3Nfc3Vic3QsICgobG9mZl90KXVwIDw8IDQpIHwgcCwgNCk7CisJCWZvcl9hbGxfcG9zcyhpLCBocGZzX3Bvc19kZWwsICgobG9mZl90KXVwIDw8IDQpIHwgcCwgMSk7CisJCWlmIChkZV9jcC0+ZG93bikgaWYgKChkMSA9IGhwZnNfbWFwX2Rub2RlKGktPmlfc2IsIGRlX2Rvd25fcG9pbnRlcihkZV9jcCksICZxYmgxKSkpIHsKKwkJCWQxLT51cCA9IG5kb3duOworCQkJaHBmc19tYXJrXzRidWZmZXJzX2RpcnR5KCZxYmgxKTsKKwkJCWhwZnNfYnJlbHNlNCgmcWJoMSk7CisJCX0KKwkJaHBmc19hZGRfdG9fZG5vZGUoaSwgbmRvd24sIGRlX2NwLT5uYW1lLCBkZV9jcC0+bmFtZWxlbiwgZGVfY3AsIGRlX2NwLT5kb3duID8gZGVfZG93bl9wb2ludGVyKGRlX2NwKSA6IDApOworCQkvKnByaW50aygiVVAtVE8tRE5PREU6ICUwOHggKG5kb3duID0gJTA4eCwgZG93biA9ICUwOHgsIGRubyA9ICUwOHgpXG4iLCB1cCwgbmRvd24sIGRvd24sIGRubyk7Ki8KKwkJZG5vID0gdXA7CisJCWtmcmVlKGRlX2NwKTsKKwkJZ290byB0cnlfaXRfYWdhaW47CisJfSBlbHNlIHsKKwkJc3RydWN0IGhwZnNfZGlyZW50ICpkZV9wcmV2ID0gZG5vZGVfcHJlX2xhc3RfZGUoZG5vZGUpOworCQlzdHJ1Y3QgaHBmc19kaXJlbnQgKmRlX2NwOworCQlzdHJ1Y3QgZG5vZGUgKmQxOworCQlzdHJ1Y3QgcXVhZF9idWZmZXJfaGVhZCBxYmgxOworCQlkbm9kZV9zZWNubyBkbHA7CisJCWlmICghZGVfcHJldikgeworCQkJaHBmc19lcnJvcihpLT5pX3NiLCAiZGVsZXRlX2VtcHR5X2Rub2RlOiBlbXB0eSBkbm9kZSAlMDh4IiwgdXApOworCQkJaHBmc19tYXJrXzRidWZmZXJzX2RpcnR5KCZxYmgpOworCQkJaHBmc19icmVsc2U0KCZxYmgpOworCQkJZG5vID0gdXA7CisJCQlnb3RvIHRyeV9pdF9hZ2FpbjsKKwkJfQorCQlpZiAoIWRlX3ByZXYtPmRvd24pIGdvdG8gZW5kbTsKKwkJbmRvd24gPSBkZV9kb3duX3BvaW50ZXIoZGVfcHJldik7CisJCWlmICgoZDEgPSBocGZzX21hcF9kbm9kZShpLT5pX3NiLCBuZG93biwgJnFiaDEpKSkgeworCQkJc3RydWN0IGhwZnNfZGlyZW50ICpkZWwgPSBkbm9kZV9sYXN0X2RlKGQxKTsKKwkJCWRscCA9IGRlbC0+ZG93biA/IGRlX2Rvd25fcG9pbnRlcihkZWwpIDogMDsKKwkJCWlmICghZGxwICYmIGRvd24pIHsKKwkJCQlpZiAoZDEtPmZpcnN0X2ZyZWUgPiAyMDQ0KSB7CisJCQkJCWlmIChocGZzX3NiKGktPmlfc2IpLT5zYl9jaGsgPj0gMikgeworCQkJCQkJcHJpbnRrKCJIUEZTOiB3YXJuaW5nOiB1bmJhbGFuY2VkIGRub2RlIHRyZWUsIHNlZSBocGZzLnR4dCA0IG1vcmUgaW5mb1xuIik7CisJCQkJCQlwcmludGsoIkhQRlM6IHdhcm5pbmc6IHRlcm1pbmF0aW5nIGJhbGFuY2luZyBvcGVyYXRpb25cbiIpOworCQkJCQl9CisJCQkJCWhwZnNfYnJlbHNlNCgmcWJoMSk7CisJCQkJCWdvdG8gZW5kbTsKKwkJCQl9CisJCQkJaWYgKGhwZnNfc2IoaS0+aV9zYiktPnNiX2NoayA+PSAyKSB7CisJCQkJCXByaW50aygiSFBGUzogd2FybmluZzogdW5iYWxhbmNlZCBkbm9kZSB0cmVlLCBzZWUgaHBmcy50eHQgNCBtb3JlIGluZm9cbiIpOworCQkJCQlwcmludGsoIkhQRlM6IHdhcm5pbmc6IGdvaW4nb25cbiIpOworCQkJCX0KKwkJCQlkZWwtPmxlbmd0aCArPSA0OworCQkJCWRlbC0+ZG93biA9IDE7CisJCQkJZDEtPmZpcnN0X2ZyZWUgKz0gNDsKKwkJCX0KKwkJCWlmIChkbHAgJiYgIWRvd24pIHsKKwkJCQlkZWwtPmxlbmd0aCAtPSA0OworCQkJCWRlbC0+ZG93biA9IDA7CisJCQkJZDEtPmZpcnN0X2ZyZWUgLT0gNDsKKwkJCX0gZWxzZSBpZiAoZG93bikKKwkJCQkqKGRub2RlX3NlY25vICopICgodm9pZCAqKSBkZWwgKyBkZWwtPmxlbmd0aCAtIDQpID0gZG93bjsKKwkJfSBlbHNlIGdvdG8gZW5kbTsKKwkJaWYgKCEoZGVfY3AgPSBrbWFsbG9jKGRlX3ByZXYtPmxlbmd0aCwgR0ZQX05PRlMpKSkgeworCQkJcHJpbnRrKCJIUEZTOiBvdXQgb2YgbWVtb3J5IGZvciBkdHJlZSBiYWxhbmNpbmdcbiIpOworCQkJaHBmc19icmVsc2U0KCZxYmgxKTsKKwkJCWdvdG8gZW5kbTsKKwkJfQorCQlocGZzX21hcmtfNGJ1ZmZlcnNfZGlydHkoJnFiaDEpOworCQlocGZzX2JyZWxzZTQoJnFiaDEpOworCQltZW1jcHkoZGVfY3AsIGRlX3ByZXYsIGRlX3ByZXYtPmxlbmd0aCk7CisJCWhwZnNfZGVsZXRlX2RlKGktPmlfc2IsIGRub2RlLCBkZV9wcmV2KTsKKwkJaWYgKCFkZV9wcmV2LT5kb3duKSB7CisJCQlkZV9wcmV2LT5sZW5ndGggKz0gNDsKKwkJCWRlX3ByZXYtPmRvd24gPSAxOworCQkJZG5vZGUtPmZpcnN0X2ZyZWUgKz0gNDsKKwkJfQorCQkqKGRub2RlX3NlY25vICopICgodm9pZCAqKSBkZV9wcmV2ICsgZGVfcHJldi0+bGVuZ3RoIC0gNCkgPSBuZG93bjsKKwkJaHBmc19tYXJrXzRidWZmZXJzX2RpcnR5KCZxYmgpOworCQlocGZzX2JyZWxzZTQoJnFiaCk7CisJCWZvcl9hbGxfcG9zcyhpLCBocGZzX3Bvc19zdWJzdCwgKChsb2ZmX3QpdXAgPDwgNCkgfCAocCAtIDEpLCA0KTsKKwkJZm9yX2FsbF9wb3NzKGksIGhwZnNfcG9zX3N1YnN0LCAoKGxvZmZfdCl1cCA8PCA0KSB8IHAsICgobG9mZl90KXVwIDw8IDQpIHwgKHAgLSAxKSk7CisJCWlmIChkb3duKSBpZiAoKGQxID0gaHBmc19tYXBfZG5vZGUoaS0+aV9zYiwgZGVfZG93bl9wb2ludGVyKGRlKSwgJnFiaDEpKSkgeworCQkJZDEtPnVwID0gbmRvd247CisJCQlocGZzX21hcmtfNGJ1ZmZlcnNfZGlydHkoJnFiaDEpOworCQkJaHBmc19icmVsc2U0KCZxYmgxKTsKKwkJfQorCQlocGZzX2FkZF90b19kbm9kZShpLCBuZG93biwgZGVfY3AtPm5hbWUsIGRlX2NwLT5uYW1lbGVuLCBkZV9jcCwgZGxwKTsKKwkJZG5vID0gdXA7CisJCWtmcmVlKGRlX2NwKTsKKwkJZ290byB0cnlfaXRfYWdhaW47CisJfQorCWVuZG06CisJaHBmc19tYXJrXzRidWZmZXJzX2RpcnR5KCZxYmgpOworCWVuZDoKKwlocGZzX2JyZWxzZTQoJnFiaCk7Cit9CisKKworLyogRGVsZXRlIGRpcmVudCBmcm9tIGRpcmVjdG9yeSAqLworCitpbnQgaHBmc19yZW1vdmVfZGlyZW50KHN0cnVjdCBpbm9kZSAqaSwgZG5vZGVfc2Vjbm8gZG5vLCBzdHJ1Y3QgaHBmc19kaXJlbnQgKmRlLAorCQkgICAgICAgc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgKnFiaCwgaW50IGRlcHRoKQoreworCXN0cnVjdCBkbm9kZSAqZG5vZGUgPSBxYmgtPmRhdGE7CisJZG5vZGVfc2Vjbm8gZG93biA9IDA7CisJaW50IGxvY2sgPSAwOworCWxvZmZfdCB0OworCWlmIChkZS0+Zmlyc3QgfHwgZGUtPmxhc3QpIHsKKwkJaHBmc19lcnJvcihpLT5pX3NiLCAiaHBmc19yZW1vdmVfZGlyZW50OiBhdHRlbXB0IHRvIGRlbGV0ZSBmaXJzdCBvciBsYXN0IGRpcmVudCBpbiBkbm9kZSAlMDh4IiwgZG5vKTsKKwkJaHBmc19icmVsc2U0KHFiaCk7CisJCXJldHVybiAxOworCX0KKwlpZiAoZGUtPmRvd24pIGRvd24gPSBkZV9kb3duX3BvaW50ZXIoZGUpOworCWlmIChkZXB0aCAmJiAoZGUtPmRvd24gfHwgKGRlID09IGRub2RlX2ZpcnN0X2RlKGRub2RlKSAmJiBkZV9uZXh0X2RlKGRlKS0+bGFzdCkpKSB7CisJCWxvY2sgPSAxOworCQlocGZzX2xvY2tfY3JlYXRpb24oaS0+aV9zYik7CisJCWlmIChocGZzX2NoZWNrX2ZyZWVfZG5vZGVzKGktPmlfc2IsIEZSRUVfRE5PREVTX0RFTCkpIHsKKwkJCWhwZnNfYnJlbHNlNChxYmgpOworCQkJaHBmc191bmxvY2tfY3JlYXRpb24oaS0+aV9zYik7CisJCQlyZXR1cm4gMjsKKwkJfQorCX0KKwlpLT5pX3ZlcnNpb24rKzsKKwlmb3JfYWxsX3Bvc3MoaSwgaHBmc19wb3NfZGVsLCAodCA9IGdldF9wb3MoZG5vZGUsIGRlKSkgKyAxLCAxKTsKKwlocGZzX2RlbGV0ZV9kZShpLT5pX3NiLCBkbm9kZSwgZGUpOworCWhwZnNfbWFya180YnVmZmVyc19kaXJ0eShxYmgpOworCWhwZnNfYnJlbHNlNChxYmgpOworCWlmIChkb3duKSB7CisJCWRub2RlX3NlY25vIGEgPSBtb3ZlX3RvX3RvcChpLCBkb3duLCBkbm8pOworCQlmb3JfYWxsX3Bvc3MoaSwgaHBmc19wb3Nfc3Vic3QsIDUsIHQpOworCQlpZiAoYSkgZGVsZXRlX2VtcHR5X2Rub2RlKGksIGEpOworCQlpZiAobG9jaykgaHBmc191bmxvY2tfY3JlYXRpb24oaS0+aV9zYik7CisJCXJldHVybiAhYTsKKwl9CisJZGVsZXRlX2VtcHR5X2Rub2RlKGksIGRubyk7CisJaWYgKGxvY2spIGhwZnNfdW5sb2NrX2NyZWF0aW9uKGktPmlfc2IpOworCXJldHVybiAwOworfQorCit2b2lkIGhwZnNfY291bnRfZG5vZGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgZG5vZGVfc2Vjbm8gZG5vLCBpbnQgKm5fZG5vZGVzLAorCQkgICAgICAgaW50ICpuX3N1YmRpcnMsIGludCAqbl9pdGVtcykKK3sKKwlzdHJ1Y3QgZG5vZGUgKmRub2RlOworCXN0cnVjdCBxdWFkX2J1ZmZlcl9oZWFkIHFiaDsKKwlzdHJ1Y3QgaHBmc19kaXJlbnQgKmRlOworCWRub2RlX3NlY25vIHB0ciwgb2RubyA9IDA7CisJaW50IGMxLCBjMiA9IDA7CisJaW50IGQxLCBkMiA9IDA7CisJZ29fZG93bjoKKwlpZiAobl9kbm9kZXMpICgqbl9kbm9kZXMpKys7CisJaWYgKGhwZnNfc2IocyktPnNiX2NoaykKKwkJaWYgKGhwZnNfc3RvcF9jeWNsZXMocywgZG5vLCAmYzEsICZjMiwgImhwZnNfY291bnRfZG5vZGVzICMxIikpIHJldHVybjsKKwlwdHIgPSAwOworCWdvX3VwOgorCWlmICghKGRub2RlID0gaHBmc19tYXBfZG5vZGUocywgZG5vLCAmcWJoKSkpIHJldHVybjsKKwlpZiAoaHBmc19zYihzKS0+c2JfY2hrKSBpZiAob2RubyAmJiBvZG5vICE9IC0xICYmIGRub2RlLT51cCAhPSBvZG5vKQorCQlocGZzX2Vycm9yKHMsICJocGZzX2NvdW50X2Rub2RlczogYmFkIHVwIHBvaW50ZXI7IGRub2RlICUwOHgsIGRvd24gJTA4eCBwb2ludHMgdG8gJTA4eCIsIG9kbm8sIGRubywgZG5vZGUtPnVwKTsKKwlkZSA9IGRub2RlX2ZpcnN0X2RlKGRub2RlKTsKKwlpZiAocHRyKSB3aGlsZSgxKSB7CisJCWlmIChkZS0+ZG93bikgaWYgKGRlX2Rvd25fcG9pbnRlcihkZSkgPT0gcHRyKSBnb3RvIHByb2Nlc3NfZGU7CisJCWlmIChkZS0+bGFzdCkgeworCQkJaHBmc19icmVsc2U0KCZxYmgpOworCQkJaHBmc19lcnJvcihzLCAiaHBmc19jb3VudF9kbm9kZXM6IHBvaW50ZXIgdG8gZG5vZGUgJTA4eCBub3QgZm91bmQgaW4gZG5vZGUgJTA4eCwgZ290IGhlcmUgZnJvbSAlMDh4IiwKKwkJCQlwdHIsIGRubywgb2Rubyk7CisJCQlyZXR1cm47CisJCX0KKwkJZGUgPSBkZV9uZXh0X2RlKGRlKTsKKwl9CisJbmV4dF9kZToKKwlpZiAoZGUtPmRvd24pIHsKKwkJb2RubyA9IGRubzsKKwkJZG5vID0gZGVfZG93bl9wb2ludGVyKGRlKTsKKwkJaHBmc19icmVsc2U0KCZxYmgpOworCQlnb3RvIGdvX2Rvd247CisJfQorCXByb2Nlc3NfZGU6CisJaWYgKCFkZS0+Zmlyc3QgJiYgIWRlLT5sYXN0ICYmIGRlLT5kaXJlY3RvcnkgJiYgbl9zdWJkaXJzKSAoKm5fc3ViZGlycykrKzsKKwlpZiAoIWRlLT5maXJzdCAmJiAhZGUtPmxhc3QgJiYgbl9pdGVtcykgKCpuX2l0ZW1zKSsrOworCWlmICgoZGUgPSBkZV9uZXh0X2RlKGRlKSkgPCBkbm9kZV9lbmRfZGUoZG5vZGUpKSBnb3RvIG5leHRfZGU7CisJcHRyID0gZG5vOworCWRubyA9IGRub2RlLT51cDsKKwlpZiAoZG5vZGUtPnJvb3RfZG5vZGUpIHsKKwkJaHBmc19icmVsc2U0KCZxYmgpOworCQlyZXR1cm47CisJfQorCWhwZnNfYnJlbHNlNCgmcWJoKTsKKwlpZiAoaHBmc19zYihzKS0+c2JfY2hrKQorCQlpZiAoaHBmc19zdG9wX2N5Y2xlcyhzLCBwdHIsICZkMSwgJmQyLCAiaHBmc19jb3VudF9kbm9kZXMgIzIiKSkgcmV0dXJuOworCW9kbm8gPSAtMTsKKwlnb3RvIGdvX3VwOworfQorCitzdGF0aWMgc3RydWN0IGhwZnNfZGlyZW50ICptYXBfbnRoX2RpcmVudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGRub2RlX3NlY25vIGRubywgaW50IG4sCisJCQkJCSAgc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgKnFiaCwgc3RydWN0IGRub2RlICoqZG4pCit7CisJaW50IGk7CisJc3RydWN0IGhwZnNfZGlyZW50ICpkZSwgKmRlX2VuZDsKKwlzdHJ1Y3QgZG5vZGUgKmRub2RlOworCWRub2RlID0gaHBmc19tYXBfZG5vZGUocywgZG5vLCBxYmgpOworCWlmICghZG5vZGUpIHJldHVybiBOVUxMOworCWlmIChkbikgKmRuPWRub2RlOworCWRlID0gZG5vZGVfZmlyc3RfZGUoZG5vZGUpOworCWRlX2VuZCA9IGRub2RlX2VuZF9kZShkbm9kZSk7CisJZm9yIChpID0gMTsgZGUgPCBkZV9lbmQ7IGkrKywgZGUgPSBkZV9uZXh0X2RlKGRlKSkgeworCQlpZiAoaSA9PSBuKSB7CisJCQlyZXR1cm4gZGU7CisJCX0JCisJCWlmIChkZS0+bGFzdCkgYnJlYWs7CisJfQorCWhwZnNfYnJlbHNlNChxYmgpOworCWhwZnNfZXJyb3IocywgIm1hcF9udGhfZGlyZW50OiBuIHRvbyBoaWdoOyBkbm9kZSA9ICUwOHgsIHJlcXVlc3RlZCAlMDh4IiwgZG5vLCBuKTsKKwlyZXR1cm4gTlVMTDsKK30KKworZG5vZGVfc2Vjbm8gaHBmc19kZV9hc19kb3duX2FzX3Bvc3NpYmxlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgZG5vZGVfc2Vjbm8gZG5vKQoreworCXN0cnVjdCBxdWFkX2J1ZmZlcl9oZWFkIHFiaDsKKwlkbm9kZV9zZWNubyBkID0gZG5vOworCWRub2RlX3NlY25vIHVwID0gMDsKKwlzdHJ1Y3QgaHBmc19kaXJlbnQgKmRlOworCWludCBjMSwgYzIgPSAwOworCisJYWdhaW46CisJaWYgKGhwZnNfc2IocyktPnNiX2NoaykKKwkJaWYgKGhwZnNfc3RvcF9jeWNsZXMocywgZCwgJmMxLCAmYzIsICJocGZzX2RlX2FzX2Rvd25fYXNfcG9zc2libGUiKSkKKwkJCXJldHVybiBkOworCWlmICghKGRlID0gbWFwX250aF9kaXJlbnQocywgZCwgMSwgJnFiaCwgTlVMTCkpKSByZXR1cm4gZG5vOworCWlmIChocGZzX3NiKHMpLT5zYl9jaGspCisJCWlmICh1cCAmJiAoKHN0cnVjdCBkbm9kZSAqKXFiaC5kYXRhKS0+dXAgIT0gdXApCisJCQlocGZzX2Vycm9yKHMsICJocGZzX2RlX2FzX2Rvd25fYXNfcG9zc2libGU6IGJhZCB1cCBwb2ludGVyOyBkbm9kZSAlMDh4LCBkb3duICUwOHggcG9pbnRzIHRvICUwOHgiLCB1cCwgZCwgKChzdHJ1Y3QgZG5vZGUgKilxYmguZGF0YSktPnVwKTsKKwlpZiAoIWRlLT5kb3duKSB7CisJCWhwZnNfYnJlbHNlNCgmcWJoKTsKKwkJcmV0dXJuIGQ7CisJfQorCXVwID0gZDsKKwlkID0gZGVfZG93bl9wb2ludGVyKGRlKTsKKwlocGZzX2JyZWxzZTQoJnFiaCk7CisJZ290byBhZ2FpbjsKK30KKworc3RydWN0IGhwZnNfZGlyZW50ICptYXBfcG9zX2RpcmVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgKnBvc3AsCisJCQkJICAgc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgKnFiaCkKK3sKKwlsb2ZmX3QgcG9zOworCXVuc2lnbmVkIGM7CisJZG5vZGVfc2Vjbm8gZG5vOworCXN0cnVjdCBocGZzX2RpcmVudCAqZGUsICpkOworCXN0cnVjdCBocGZzX2RpcmVudCAqdXBfZGU7CisJc3RydWN0IGhwZnNfZGlyZW50ICplbmRfdXBfZGU7CisJc3RydWN0IGRub2RlICpkbm9kZTsKKwlzdHJ1Y3QgZG5vZGUgKnVwX2Rub2RlOworCXN0cnVjdCBxdWFkX2J1ZmZlcl9oZWFkIHFiaDA7CisKKwlwb3MgPSAqcG9zcDsKKwlkbm8gPSBwb3MgPj4gNiA8PCAyOworCXBvcyAmPSAwNzc7CisJaWYgKCEoZGUgPSBtYXBfbnRoX2RpcmVudChpbm9kZS0+aV9zYiwgZG5vLCBwb3MsIHFiaCwgJmRub2RlKSkpCisJCWdvdG8gYmFpbDsKKworCS8qIEdvaW5nIHRvIHRoZSBuZXh0IGRpcmVudCAqLworCWlmICgoZCA9IGRlX25leHRfZGUoZGUpKSA8IGRub2RlX2VuZF9kZShkbm9kZSkpIHsKKwkJaWYgKCEoKysqcG9zcCAmIDA3NykpIHsKKwkJCWhwZnNfZXJyb3IoaW5vZGUtPmlfc2IsICJtYXBfcG9zX2RpcmVudDogcG9zIGNyb3NzZWQgZG5vZGUgYm91bmRhcnk7IHBvcyA9ICUwOHgiLCAqcG9zcCk7CisJCQlnb3RvIGJhaWw7CisJCX0KKwkJLyogV2UncmUgZ29pbmcgZG93biB0aGUgdHJlZSAqLworCQlpZiAoZC0+ZG93bikgeworCQkJKnBvc3AgPSAoKGxvZmZfdCkgaHBmc19kZV9hc19kb3duX2FzX3Bvc3NpYmxlKGlub2RlLT5pX3NiLCBkZV9kb3duX3BvaW50ZXIoZCkpIDw8IDQpICsgMTsKKwkJfQorCQorCQlyZXR1cm4gZGU7CisJfQorCisJLyogR29pbmcgdXAgKi8KKwlpZiAoZG5vZGUtPnJvb3RfZG5vZGUpIGdvdG8gYmFpbDsKKworCWlmICghKHVwX2Rub2RlID0gaHBmc19tYXBfZG5vZGUoaW5vZGUtPmlfc2IsIGRub2RlLT51cCwgJnFiaDApKSkKKwkJZ290byBiYWlsOworCisJZW5kX3VwX2RlID0gZG5vZGVfZW5kX2RlKHVwX2Rub2RlKTsKKwljID0gMDsKKwlmb3IgKHVwX2RlID0gZG5vZGVfZmlyc3RfZGUodXBfZG5vZGUpOyB1cF9kZSA8IGVuZF91cF9kZTsKKwkgICAgIHVwX2RlID0gZGVfbmV4dF9kZSh1cF9kZSkpIHsKKwkJaWYgKCEoKytjICYgMDc3KSkgaHBmc19lcnJvcihpbm9kZS0+aV9zYiwKKwkJCSJtYXBfcG9zX2RpcmVudDogcG9zIGNyb3NzZWQgZG5vZGUgYm91bmRhcnk7IGRub2RlID0gJTA4eCIsIGRub2RlLT51cCk7CisJCWlmICh1cF9kZS0+ZG93biAmJiBkZV9kb3duX3BvaW50ZXIodXBfZGUpID09IGRubykgeworCQkJKnBvc3AgPSAoKGxvZmZfdCkgZG5vZGUtPnVwIDw8IDQpICsgYzsKKwkJCWhwZnNfYnJlbHNlNCgmcWJoMCk7CisJCQlyZXR1cm4gZGU7CisJCX0KKwl9CisJCisJaHBmc19lcnJvcihpbm9kZS0+aV9zYiwgIm1hcF9wb3NfZGlyZW50OiBwb2ludGVyIHRvIGRub2RlICUwOHggbm90IGZvdW5kIGluIHBhcmVudCBkbm9kZSAlMDh4IiwKKwkJZG5vLCBkbm9kZS0+dXApOworCWhwZnNfYnJlbHNlNCgmcWJoMCk7CisJCisJYmFpbDoKKwkqcG9zcCA9IDEyOworCXJldHVybiBkZTsKK30KKworLyogRmluZCBhIGRpcmVudCBpbiB0cmVlICovCisKK3N0cnVjdCBocGZzX2RpcmVudCAqbWFwX2RpcmVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBkbm9kZV9zZWNubyBkbm8sIGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxlbiwKKwkJCSAgICAgICBkbm9kZV9zZWNubyAqZGQsIHN0cnVjdCBxdWFkX2J1ZmZlcl9oZWFkICpxYmgpCit7CisJc3RydWN0IGRub2RlICpkbm9kZTsKKwlzdHJ1Y3QgaHBmc19kaXJlbnQgKmRlOworCXN0cnVjdCBocGZzX2RpcmVudCAqZGVfZW5kOworCWludCBjMSwgYzIgPSAwOworCisJaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpKSBocGZzX2Vycm9yKGlub2RlLT5pX3NiLCAibWFwX2RpcmVudDogbm90IGEgZGlyZWN0b3J5XG4iKTsKKwlhZ2FpbjoKKwlpZiAoaHBmc19zYihpbm9kZS0+aV9zYiktPnNiX2NoaykKKwkJaWYgKGhwZnNfc3RvcF9jeWNsZXMoaW5vZGUtPmlfc2IsIGRubywgJmMxLCAmYzIsICJtYXBfZGlyZW50IikpIHJldHVybiBOVUxMOworCWlmICghKGRub2RlID0gaHBmc19tYXBfZG5vZGUoaW5vZGUtPmlfc2IsIGRubywgcWJoKSkpIHJldHVybiBOVUxMOworCQorCWRlX2VuZCA9IGRub2RlX2VuZF9kZShkbm9kZSk7CisJZm9yIChkZSA9IGRub2RlX2ZpcnN0X2RlKGRub2RlKTsgZGUgPCBkZV9lbmQ7IGRlID0gZGVfbmV4dF9kZShkZSkpIHsKKwkJaW50IHQgPSBocGZzX2NvbXBhcmVfbmFtZXMoaW5vZGUtPmlfc2IsIG5hbWUsIGxlbiwgZGUtPm5hbWUsIGRlLT5uYW1lbGVuLCBkZS0+bGFzdCk7CisJCWlmICghdCkgeworCQkJaWYgKGRkKSAqZGQgPSBkbm87CisJCQlyZXR1cm4gZGU7CisJCX0KKwkJaWYgKHQgPCAwKSB7CisJCQlpZiAoZGUtPmRvd24pIHsKKwkJCQlkbm8gPSBkZV9kb3duX3BvaW50ZXIoZGUpOworCQkJCWhwZnNfYnJlbHNlNChxYmgpOworCQkJCWdvdG8gYWdhaW47CisJCQl9CisJCWJyZWFrOworCQl9CisJfQorCWhwZnNfYnJlbHNlNChxYmgpOworCXJldHVybiBOVUxMOworfQorCisvKgorICogUmVtb3ZlIGVtcHR5IGRpcmVjdG9yeS4gSW4gbm9ybWFsIGNhc2VzIGl0IGlzIG9ubHkgb25lIGRub2RlIHdpdGggdHdvCisgKiBlbnRyaWVzLCBidXQgd2UgbXVzdCBoYW5kbGUgYWxzbyBzdWNoIG9ic2N1cmUgY2FzZXMgd2hlbiBpdCdzIGEgdHJlZQorICogb2YgZW1wdHkgZG5vZGVzLgorICovCisKK3ZvaWQgaHBmc19yZW1vdmVfZHRyZWUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBkbm9kZV9zZWNubyBkbm8pCit7CisJc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgcWJoOworCXN0cnVjdCBkbm9kZSAqZG5vZGU7CisJc3RydWN0IGhwZnNfZGlyZW50ICpkZTsKKwlkbm9kZV9zZWNubyBkMSwgZDIsIHJkbm8gPSBkbm87CisJd2hpbGUgKDEpIHsKKwkJaWYgKCEoZG5vZGUgPSBocGZzX21hcF9kbm9kZShzLCBkbm8sICZxYmgpKSkgcmV0dXJuOworCQlkZSA9IGRub2RlX2ZpcnN0X2RlKGRub2RlKTsKKwkJaWYgKGRlLT5sYXN0KSB7CisJCQlpZiAoZGUtPmRvd24pIGQxID0gZGVfZG93bl9wb2ludGVyKGRlKTsKKwkJCWVsc2UgZ290byBlcnJvcjsKKwkJCWhwZnNfYnJlbHNlNCgmcWJoKTsKKwkJCWhwZnNfZnJlZV9kbm9kZShzLCBkbm8pOworCQkJZG5vID0gZDE7CisJCX0gZWxzZSBicmVhazsKKwl9CisJaWYgKCFkZS0+Zmlyc3QpIGdvdG8gZXJyb3I7CisJZDEgPSBkZS0+ZG93biA/IGRlX2Rvd25fcG9pbnRlcihkZSkgOiAwOworCWRlID0gZGVfbmV4dF9kZShkZSk7CisJaWYgKCFkZS0+bGFzdCkgZ290byBlcnJvcjsKKwlkMiA9IGRlLT5kb3duID8gZGVfZG93bl9wb2ludGVyKGRlKSA6IDA7CisJaHBmc19icmVsc2U0KCZxYmgpOworCWhwZnNfZnJlZV9kbm9kZShzLCBkbm8pOworCWRvIHsKKwkJd2hpbGUgKGQxKSB7CisJCQlpZiAoIShkbm9kZSA9IGhwZnNfbWFwX2Rub2RlKHMsIGRubyA9IGQxLCAmcWJoKSkpIHJldHVybjsKKwkJCWRlID0gZG5vZGVfZmlyc3RfZGUoZG5vZGUpOworCQkJaWYgKCFkZS0+bGFzdCkgZ290byBlcnJvcjsKKwkJCWQxID0gZGUtPmRvd24gPyBkZV9kb3duX3BvaW50ZXIoZGUpIDogMDsKKwkJCWhwZnNfYnJlbHNlNCgmcWJoKTsKKwkJCWhwZnNfZnJlZV9kbm9kZShzLCBkbm8pOworCQl9CisJCWQxID0gZDI7CisJCWQyID0gMDsKKwl9IHdoaWxlIChkMSk7CisJcmV0dXJuOworCWVycm9yOgorCWhwZnNfYnJlbHNlNCgmcWJoKTsKKwlocGZzX2ZyZWVfZG5vZGUocywgZG5vKTsKKwlocGZzX2Vycm9yKHMsICJkaXJlY3RvcnkgJTA4eCBpcyBjb3JydXB0ZWQgb3Igbm90IGVtcHR5IiwgcmRubyk7Cit9CisKKy8qIAorICogRmluZCBkaXJlbnQgZm9yIHNwZWNpZmllZCBmbm9kZS4gVXNlIHRydW5jYXRlZCAxNS1jaGFyIG5hbWUgaW4gZm5vZGUgYXMKKyAqIGEgaGVscCBmb3Igc2VhcmNoaW5nLgorICovCisKK3N0cnVjdCBocGZzX2RpcmVudCAqbWFwX2Zub2RlX2RpcmVudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGZub2RlX3NlY25vIGZubywKKwkJCQkgICAgIHN0cnVjdCBmbm9kZSAqZiwgc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgKnFiaCkKK3sKKwljaGFyICpuYW1lMTsKKwljaGFyICpuYW1lMjsKKwlpbnQgbmFtZTFsZW4sIG5hbWUybGVuOworCXN0cnVjdCBkbm9kZSAqZDsKKwlkbm9kZV9zZWNubyBkbm8sIGRvd25kOworCXN0cnVjdCBmbm9kZSAqdXBmOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGhwZnNfZGlyZW50ICpkZSwgKmRlX2VuZDsKKwlpbnQgYzsKKwlpbnQgYzEsIGMyID0gMDsKKwlpbnQgZDEsIGQyID0gMDsKKwluYW1lMSA9IGYtPm5hbWU7CisJaWYgKCEobmFtZTIgPSBrbWFsbG9jKDI1NiwgR0ZQX05PRlMpKSkgeworCQlwcmludGsoIkhQRlM6IG91dCBvZiBtZW1vcnksIGNhbid0IG1hcCBkaXJlbnRcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKGYtPmxlbiA8PSAxNSkKKwkJbWVtY3B5KG5hbWUyLCBuYW1lMSwgbmFtZTFsZW4gPSBuYW1lMmxlbiA9IGYtPmxlbik7CisJZWxzZSB7CisJCW1lbWNweShuYW1lMiwgbmFtZTEsIDE1KTsKKwkJbWVtc2V0KG5hbWUyICsgMTUsIDB4ZmYsIDI1NiAtIDE1KTsKKwkJLypuYW1lMlsxNV0gPSAweGZmOyovCisJCW5hbWUxbGVuID0gMTU7IG5hbWUybGVuID0gMjU2OworCX0KKwlpZiAoISh1cGYgPSBocGZzX21hcF9mbm9kZShzLCBmLT51cCwgJmJoKSkpIHsKKwkJa2ZyZWUobmFtZTIpOworCQlyZXR1cm4gTlVMTDsKKwl9CQorCWlmICghdXBmLT5kaXJmbGFnKSB7CisJCWJyZWxzZShiaCk7CisJCWhwZnNfZXJyb3IocywgImZub2RlICUwOHggaGFzIG5vbi1kaXJlY3RvcnkgcGFyZW50ICUwOHgiLCBmbm8sIGYtPnVwKTsKKwkJa2ZyZWUobmFtZTIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJZG5vID0gdXBmLT51LmV4dGVybmFsWzBdLmRpc2tfc2Vjbm87CisJYnJlbHNlKGJoKTsKKwlnb19kb3duOgorCWRvd25kID0gMDsKKwlnb191cDoKKwlpZiAoIShkID0gaHBmc19tYXBfZG5vZGUocywgZG5vLCBxYmgpKSkgeworCQlrZnJlZShuYW1lMik7CisJCXJldHVybiBOVUxMOworCX0KKwlkZV9lbmQgPSBkbm9kZV9lbmRfZGUoZCk7CisJZGUgPSBkbm9kZV9maXJzdF9kZShkKTsKKwlpZiAoZG93bmQpIHsKKwkJd2hpbGUgKGRlIDwgZGVfZW5kKSB7CisJCQlpZiAoZGUtPmRvd24pIGlmIChkZV9kb3duX3BvaW50ZXIoZGUpID09IGRvd25kKSBnb3RvIGY7CisJCQlkZSA9IGRlX25leHRfZGUoZGUpOworCQl9CisJCWhwZnNfZXJyb3IocywgInBvaW50ZXIgdG8gZG5vZGUgJTA4eCBub3QgZm91bmQgaW4gZG5vZGUgJTA4eCIsIGRvd25kLCBkbm8pOworCQlocGZzX2JyZWxzZTQocWJoKTsKKwkJa2ZyZWUobmFtZTIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbmV4dF9kZToKKwlpZiAoZGUtPmZub2RlID09IGZubykgeworCQlrZnJlZShuYW1lMik7CisJCXJldHVybiBkZTsKKwl9CisJYyA9IGhwZnNfY29tcGFyZV9uYW1lcyhzLCBuYW1lMSwgbmFtZTFsZW4sIGRlLT5uYW1lLCBkZS0+bmFtZWxlbiwgZGUtPmxhc3QpOworCWlmIChjIDwgMCAmJiBkZS0+ZG93bikgeworCQlkbm8gPSBkZV9kb3duX3BvaW50ZXIoZGUpOworCQlocGZzX2JyZWxzZTQocWJoKTsKKwkJaWYgKGhwZnNfc2IocyktPnNiX2NoaykKKwkJCWlmIChocGZzX3N0b3BfY3ljbGVzKHMsIGRubywgJmMxLCAmYzIsICJtYXBfZm5vZGVfZGlyZW50ICMxIikpIHsKKwkJCWtmcmVlKG5hbWUyKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWdvdG8gZ29fZG93bjsKKwl9CisJZjoKKwlpZiAoZGUtPmZub2RlID09IGZubykgeworCQlrZnJlZShuYW1lMik7CisJCXJldHVybiBkZTsKKwl9CisJYyA9IGhwZnNfY29tcGFyZV9uYW1lcyhzLCBuYW1lMiwgbmFtZTJsZW4sIGRlLT5uYW1lLCBkZS0+bmFtZWxlbiwgZGUtPmxhc3QpOworCWlmIChjIDwgMCAmJiAhZGUtPmxhc3QpIGdvdG8gbm90X2ZvdW5kOworCWlmICgoZGUgPSBkZV9uZXh0X2RlKGRlKSkgPCBkZV9lbmQpIGdvdG8gbmV4dF9kZTsKKwlpZiAoZC0+cm9vdF9kbm9kZSkgZ290byBub3RfZm91bmQ7CisJZG93bmQgPSBkbm87CisJZG5vID0gZC0+dXA7CisJaHBmc19icmVsc2U0KHFiaCk7CisJaWYgKGhwZnNfc2IocyktPnNiX2NoaykKKwkJaWYgKGhwZnNfc3RvcF9jeWNsZXMocywgZG93bmQsICZkMSwgJmQyLCAibWFwX2Zub2RlX2RpcmVudCAjMiIpKSB7CisJCQlrZnJlZShuYW1lMik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCWdvdG8gZ29fdXA7CisJbm90X2ZvdW5kOgorCWhwZnNfYnJlbHNlNChxYmgpOworCWhwZnNfZXJyb3IocywgImRpcmVudCBmb3IgZm5vZGUgJTA4eCBub3QgZm91bmQiLCBmbm8pOworCWtmcmVlKG5hbWUyKTsKKwlyZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2ZzL2hwZnMvZWEuYyBiL2ZzL2hwZnMvZWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjMzOWRjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaHBmcy9lYS5jCkBAIC0wLDAgKzEsMzYzIEBACisvKgorICogIGxpbnV4L2ZzL2hwZnMvZWEuYworICoKKyAqICBNaWt1bGFzIFBhdG9ja2EgKG1pa3VsYXNAYXJ0YXgua2FybGluLm1mZi5jdW5pLmN6KSwgMTk5OC0xOTk5CisgKgorICogIGhhbmRsaW5nIGV4dGVuZGVkIGF0dHJpYnV0ZXMKKyAqLworCisjaW5jbHVkZSAiaHBmc19mbi5oIgorCisvKiBSZW1vdmUgZXh0ZXJuYWwgZXh0ZW5kZWQgYXR0cmlidXRlcy4gYW5vIHNwZWNpZmllcyB3aGV0aGVyIGEgaXMgYSAKKyAgIGRpcmVjdCBzZWN0b3Igd2hlcmUgZWFzIHN0YXJ0cyBvciBhbiBhbm9kZSAqLworCit2b2lkIGhwZnNfZWFfZXh0X3JlbW92ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHNlY25vIGEsIGludCBhbm8sIHVuc2lnbmVkIGxlbikKK3sKKwl1bnNpZ25lZCBwb3MgPSAwOworCXdoaWxlIChwb3MgPCBsZW4pIHsKKwkJY2hhciBleFs0ICsgMjU1ICsgMSArIDhdOworCQlzdHJ1Y3QgZXh0ZW5kZWRfYXR0cmlidXRlICplYSA9IChzdHJ1Y3QgZXh0ZW5kZWRfYXR0cmlidXRlICopZXg7CisJCWlmIChwb3MgKyA0ID4gbGVuKSB7CisJCQlocGZzX2Vycm9yKHMsICJFQXMgZG9uJ3QgZW5kIGNvcnJlY3RseSwgJXMgJTA4eCwgbGVuICUwOHgiLAorCQkJCWFubyA/ICJhbm9kZSIgOiAic2VjdG9ycyIsIGEsIGxlbik7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGhwZnNfZWFfcmVhZChzLCBhLCBhbm8sIHBvcywgNCwgZXgpKSByZXR1cm47CisJCWlmIChlYS0+aW5kaXJlY3QpIHsKKwkJCWlmIChlYS0+dmFsdWVsZW4gIT0gOCkgeworCQkJCWhwZnNfZXJyb3IocywgImVhLT5pbmRpcmVjdCBzZXQgd2hpbGUgZWEtPnZhbHVlbGVuIT04LCAlcyAlMDh4LCBwb3MgJTA4eCIsCisJCQkJCWFubyA/ICJhbm9kZSIgOiAic2VjdG9ycyIsIGEsIHBvcyk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJaWYgKGhwZnNfZWFfcmVhZChzLCBhLCBhbm8sIHBvcyArIDQsIGVhLT5uYW1lbGVuICsgOSwgZXgrNCkpCisJCQkJcmV0dXJuOworCQkJaHBmc19lYV9yZW1vdmUocywgZWFfc2VjKGVhKSwgZWEtPmFub2RlLCBlYV9sZW4oZWEpKTsKKwkJfQorCQlwb3MgKz0gZWEtPm5hbWVsZW4gKyBlYS0+dmFsdWVsZW4gKyA1OworCX0KKwlpZiAoIWFubykgaHBmc19mcmVlX3NlY3RvcnMocywgYSwgKGxlbis1MTEpID4+IDkpOworCWVsc2UgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCQlzdHJ1Y3QgYW5vZGUgKmFub2RlOworCQlpZiAoKGFub2RlID0gaHBmc19tYXBfYW5vZGUocywgYSwgJmJoKSkpIHsKKwkJCWhwZnNfcmVtb3ZlX2J0cmVlKHMsICZhbm9kZS0+YnRyZWUpOworCQkJYnJlbHNlKGJoKTsKKwkJCWhwZnNfZnJlZV9zZWN0b3JzKHMsIGEsIDEpOworCQl9CisJfQorfQorCitzdGF0aWMgY2hhciAqZ2V0X2luZGlyZWN0X2VhKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgaW50IGFubywgc2Vjbm8gYSwgaW50IHNpemUpCit7CisJY2hhciAqcmV0OworCWlmICghKHJldCA9IGttYWxsb2Moc2l6ZSArIDEsIEdGUF9OT0ZTKSkpIHsKKwkJcHJpbnRrKCJIUEZTOiBvdXQgb2YgbWVtb3J5IGZvciBFQVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoaHBmc19lYV9yZWFkKHMsIGEsIGFubywgMCwgc2l6ZSwgcmV0KSkgeworCQlrZnJlZShyZXQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0W3NpemVdID0gMDsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzZXRfaW5kaXJlY3RfZWEoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBpbnQgYW5vLCBzZWNubyBhLCBjaGFyICpkYXRhLAorCQkJICAgIGludCBzaXplKQoreworCWhwZnNfZWFfd3JpdGUocywgYSwgYW5vLCAwLCBzaXplLCBkYXRhKTsKK30KKworLyogUmVhZCBhbiBleHRlbmRlZCBhdHRyaWJ1dGUgbmFtZWQgJ2tleScgaW50byB0aGUgcHJvdmlkZWQgYnVmZmVyICovCisKK2ludCBocGZzX3JlYWRfZWEoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzdHJ1Y3QgZm5vZGUgKmZub2RlLCBjaGFyICprZXksCisJCWNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisJdW5zaWduZWQgcG9zOworCWludCBhbm8sIGxlbjsKKwlzZWNubyBhOworCXN0cnVjdCBleHRlbmRlZF9hdHRyaWJ1dGUgKmVhOworCXN0cnVjdCBleHRlbmRlZF9hdHRyaWJ1dGUgKmVhX2VuZCA9IGZub2RlX2VuZF9lYShmbm9kZSk7CisJZm9yIChlYSA9IGZub2RlX2VhKGZub2RlKTsgZWEgPCBlYV9lbmQ7IGVhID0gbmV4dF9lYShlYSkpCisJCWlmICghc3RyY21wKGVhLT5uYW1lLCBrZXkpKSB7CisJCQlpZiAoZWEtPmluZGlyZWN0KQorCQkJCWdvdG8gaW5kaXJlY3Q7CisJCQlpZiAoZWEtPnZhbHVlbGVuID49IHNpemUpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQltZW1jcHkoYnVmLCBlYV9kYXRhKGVhKSwgZWEtPnZhbHVlbGVuKTsKKwkJCWJ1ZltlYS0+dmFsdWVsZW5dID0gMDsKKwkJCXJldHVybiAwOworCQl9CisJYSA9IGZub2RlLT5lYV9zZWNubzsKKwlsZW4gPSBmbm9kZS0+ZWFfc2l6ZV9sOworCWFubyA9IGZub2RlLT5lYV9hbm9kZTsKKwlwb3MgPSAwOworCXdoaWxlIChwb3MgPCBsZW4pIHsKKwkJY2hhciBleFs0ICsgMjU1ICsgMSArIDhdOworCQllYSA9IChzdHJ1Y3QgZXh0ZW5kZWRfYXR0cmlidXRlICopZXg7CisJCWlmIChwb3MgKyA0ID4gbGVuKSB7CisJCQlocGZzX2Vycm9yKHMsICJFQXMgZG9uJ3QgZW5kIGNvcnJlY3RseSwgJXMgJTA4eCwgbGVuICUwOHgiLAorCQkJCWFubyA/ICJhbm9kZSIgOiAic2VjdG9ycyIsIGEsIGxlbik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlpZiAoaHBmc19lYV9yZWFkKHMsIGEsIGFubywgcG9zLCA0LCBleCkpIHJldHVybiAtRUlPOworCQlpZiAoaHBmc19lYV9yZWFkKHMsIGEsIGFubywgcG9zICsgNCwgZWEtPm5hbWVsZW4gKyAxICsgKGVhLT5pbmRpcmVjdCA/IDggOiAwKSwgZXggKyA0KSkKKwkJCXJldHVybiAtRUlPOworCQlpZiAoIXN0cmNtcChlYS0+bmFtZSwga2V5KSkgeworCQkJaWYgKGVhLT5pbmRpcmVjdCkKKwkJCQlnb3RvIGluZGlyZWN0OworCQkJaWYgKGVhLT52YWx1ZWxlbiA+PSBzaXplKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKGhwZnNfZWFfcmVhZChzLCBhLCBhbm8sIHBvcyArIDQgKyBlYS0+bmFtZWxlbiArIDEsIGVhLT52YWx1ZWxlbiwgYnVmKSkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCWJ1ZltlYS0+dmFsdWVsZW5dID0gMDsKKwkJCXJldHVybiAwOworCQl9CisJCXBvcyArPSBlYS0+bmFtZWxlbiArIGVhLT52YWx1ZWxlbiArIDU7CisJfQorCXJldHVybiAtRU5PRU5UOworaW5kaXJlY3Q6CisJaWYgKGVhX2xlbihlYSkgPj0gc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGhwZnNfZWFfcmVhZChzLCBlYV9zZWMoZWEpLCBlYS0+YW5vZGUsIDAsIGVhX2xlbihlYSksIGJ1ZikpCisJCXJldHVybiAtRUlPOworCWJ1ZltlYV9sZW4oZWEpXSA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qIFJlYWQgYW4gZXh0ZW5kZWQgYXR0cmlidXRlIG5hbWVkICdrZXknICovCitjaGFyICpocGZzX2dldF9lYShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHN0cnVjdCBmbm9kZSAqZm5vZGUsIGNoYXIgKmtleSwgaW50ICpzaXplKQoreworCWNoYXIgKnJldDsKKwl1bnNpZ25lZCBwb3M7CisJaW50IGFubywgbGVuOworCXNlY25vIGE7CisJc3RydWN0IGV4dGVuZGVkX2F0dHJpYnV0ZSAqZWE7CisJc3RydWN0IGV4dGVuZGVkX2F0dHJpYnV0ZSAqZWFfZW5kID0gZm5vZGVfZW5kX2VhKGZub2RlKTsKKwlmb3IgKGVhID0gZm5vZGVfZWEoZm5vZGUpOyBlYSA8IGVhX2VuZDsgZWEgPSBuZXh0X2VhKGVhKSkKKwkJaWYgKCFzdHJjbXAoZWEtPm5hbWUsIGtleSkpIHsKKwkJCWlmIChlYS0+aW5kaXJlY3QpCisJCQkJcmV0dXJuIGdldF9pbmRpcmVjdF9lYShzLCBlYS0+YW5vZGUsIGVhX3NlYyhlYSksICpzaXplID0gZWFfbGVuKGVhKSk7CisJCQlpZiAoIShyZXQgPSBrbWFsbG9jKCgqc2l6ZSA9IGVhLT52YWx1ZWxlbikgKyAxLCBHRlBfTk9GUykpKSB7CisJCQkJcHJpbnRrKCJIUEZTOiBvdXQgb2YgbWVtb3J5IGZvciBFQVxuIik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQltZW1jcHkocmV0LCBlYV9kYXRhKGVhKSwgZWEtPnZhbHVlbGVuKTsKKwkJCXJldFtlYS0+dmFsdWVsZW5dID0gMDsKKwkJCXJldHVybiByZXQ7CisJCX0KKwlhID0gZm5vZGUtPmVhX3NlY25vOworCWxlbiA9IGZub2RlLT5lYV9zaXplX2w7CisJYW5vID0gZm5vZGUtPmVhX2Fub2RlOworCXBvcyA9IDA7CisJd2hpbGUgKHBvcyA8IGxlbikgeworCQljaGFyIGV4WzQgKyAyNTUgKyAxICsgOF07CisJCWVhID0gKHN0cnVjdCBleHRlbmRlZF9hdHRyaWJ1dGUgKilleDsKKwkJaWYgKHBvcyArIDQgPiBsZW4pIHsKKwkJCWhwZnNfZXJyb3IocywgIkVBcyBkb24ndCBlbmQgY29ycmVjdGx5LCAlcyAlMDh4LCBsZW4gJTA4eCIsCisJCQkJYW5vID8gImFub2RlIiA6ICJzZWN0b3JzIiwgYSwgbGVuKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWlmIChocGZzX2VhX3JlYWQocywgYSwgYW5vLCBwb3MsIDQsIGV4KSkgcmV0dXJuIE5VTEw7CisJCWlmIChocGZzX2VhX3JlYWQocywgYSwgYW5vLCBwb3MgKyA0LCBlYS0+bmFtZWxlbiArIDEgKyAoZWEtPmluZGlyZWN0ID8gOCA6IDApLCBleCArIDQpKQorCQkJcmV0dXJuIE5VTEw7CisJCWlmICghc3RyY21wKGVhLT5uYW1lLCBrZXkpKSB7CisJCQlpZiAoZWEtPmluZGlyZWN0KQorCQkJCXJldHVybiBnZXRfaW5kaXJlY3RfZWEocywgZWEtPmFub2RlLCBlYV9zZWMoZWEpLCAqc2l6ZSA9IGVhX2xlbihlYSkpOworCQkJaWYgKCEocmV0ID0ga21hbGxvYygoKnNpemUgPSBlYS0+dmFsdWVsZW4pICsgMSwgR0ZQX05PRlMpKSkgeworCQkJCXByaW50aygiSFBGUzogb3V0IG9mIG1lbW9yeSBmb3IgRUFcbiIpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJaWYgKGhwZnNfZWFfcmVhZChzLCBhLCBhbm8sIHBvcyArIDQgKyBlYS0+bmFtZWxlbiArIDEsIGVhLT52YWx1ZWxlbiwgcmV0KSkgeworCQkJCWtmcmVlKHJldCk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQlyZXRbZWEtPnZhbHVlbGVuXSA9IDA7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXBvcyArPSBlYS0+bmFtZWxlbiArIGVhLT52YWx1ZWxlbiArIDU7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiAKKyAqIFVwZGF0ZSBvciBjcmVhdGUgZXh0ZW5kZWQgYXR0cmlidXRlICdrZXknIHdpdGggdmFsdWUgJ2RhdGEnLiBOb3RlIHRoYXQKKyAqIHdoZW4gdGhpcyBlYSBleGlzdHMsIGl0IE1VU1QgaGF2ZSB0aGUgc2FtZSBzaXplIGFzIHNpemUgb2YgZGF0YS4KKyAqIFRoaXMgZHJpdmVyIGNhbid0IGNoYW5nZSBzaXplcyBvZiBlYXMgKCdjYXVzZSBJIGp1c3QgZG9uJ3QgbmVlZCBpdCkuCisgKi8KKwordm9pZCBocGZzX3NldF9lYShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZm5vZGUgKmZub2RlLCBjaGFyICprZXksIGNoYXIgKmRhdGEsIGludCBzaXplKQoreworCWZub2RlX3NlY25vIGZubyA9IGlub2RlLT5pX2lubzsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSBpbm9kZS0+aV9zYjsKKwl1bnNpZ25lZCBwb3M7CisJaW50IGFubywgbGVuOworCXNlY25vIGE7CisJdW5zaWduZWQgY2hhciBoWzRdOworCXN0cnVjdCBleHRlbmRlZF9hdHRyaWJ1dGUgKmVhOworCXN0cnVjdCBleHRlbmRlZF9hdHRyaWJ1dGUgKmVhX2VuZCA9IGZub2RlX2VuZF9lYShmbm9kZSk7CisJZm9yIChlYSA9IGZub2RlX2VhKGZub2RlKTsgZWEgPCBlYV9lbmQ7IGVhID0gbmV4dF9lYShlYSkpCisJCWlmICghc3RyY21wKGVhLT5uYW1lLCBrZXkpKSB7CisJCQlpZiAoZWEtPmluZGlyZWN0KSB7CisJCQkJaWYgKGVhX2xlbihlYSkgPT0gc2l6ZSkKKwkJCQkJc2V0X2luZGlyZWN0X2VhKHMsIGVhLT5hbm9kZSwgZWFfc2VjKGVhKSwgZGF0YSwgc2l6ZSk7CisJCQl9IGVsc2UgaWYgKGVhLT52YWx1ZWxlbiA9PSBzaXplKSB7CisJCQkJbWVtY3B5KGVhX2RhdGEoZWEpLCBkYXRhLCBzaXplKTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCWEgPSBmbm9kZS0+ZWFfc2Vjbm87CisJbGVuID0gZm5vZGUtPmVhX3NpemVfbDsKKwlhbm8gPSBmbm9kZS0+ZWFfYW5vZGU7CisJcG9zID0gMDsKKwl3aGlsZSAocG9zIDwgbGVuKSB7CisJCWNoYXIgZXhbNCArIDI1NSArIDEgKyA4XTsKKwkJZWEgPSAoc3RydWN0IGV4dGVuZGVkX2F0dHJpYnV0ZSAqKWV4OworCQlpZiAocG9zICsgNCA+IGxlbikgeworCQkJaHBmc19lcnJvcihzLCAiRUFzIGRvbid0IGVuZCBjb3JyZWN0bHksICVzICUwOHgsIGxlbiAlMDh4IiwKKwkJCQlhbm8gPyAiYW5vZGUiIDogInNlY3RvcnMiLCBhLCBsZW4pOworCQkJcmV0dXJuOworCQl9CisJCWlmIChocGZzX2VhX3JlYWQocywgYSwgYW5vLCBwb3MsIDQsIGV4KSkgcmV0dXJuOworCQlpZiAoaHBmc19lYV9yZWFkKHMsIGEsIGFubywgcG9zICsgNCwgZWEtPm5hbWVsZW4gKyAxICsgKGVhLT5pbmRpcmVjdCA/IDggOiAwKSwgZXggKyA0KSkKKwkJCXJldHVybjsKKwkJaWYgKCFzdHJjbXAoZWEtPm5hbWUsIGtleSkpIHsKKwkJCWlmIChlYS0+aW5kaXJlY3QpIHsKKwkJCQlpZiAoZWFfbGVuKGVhKSA9PSBzaXplKQorCQkJCQlzZXRfaW5kaXJlY3RfZWEocywgZWEtPmFub2RlLCBlYV9zZWMoZWEpLCBkYXRhLCBzaXplKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWlmIChlYS0+dmFsdWVsZW4gPT0gc2l6ZSkKKwkJCQkJaHBmc19lYV93cml0ZShzLCBhLCBhbm8sIHBvcyArIDQgKyBlYS0+bmFtZWxlbiArIDEsIHNpemUsIGRhdGEpOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJCXBvcyArPSBlYS0+bmFtZWxlbiArIGVhLT52YWx1ZWxlbiArIDU7CisJfQorCWlmICghZm5vZGUtPmVhX29mZnMpIHsKKwkJLyppZiAoZm5vZGUtPmVhX3NpemVfcykgeworCQkJaHBmc19lcnJvcihzLCAiZm5vZGUgJTA4eDogZWFfc2l6ZV9zID09ICUwM3gsIGVhX29mZnMgPT0gMCIsCisJCQkJaW5vZGUtPmlfaW5vLCBmbm9kZS0+ZWFfc2l6ZV9zKTsKKwkJCXJldHVybjsKKwkJfSovCisJCWZub2RlLT5lYV9vZmZzID0gMHhjNDsKKwl9CisJaWYgKGZub2RlLT5lYV9vZmZzIDwgMHhjNCB8fCBmbm9kZS0+ZWFfb2ZmcyArIGZub2RlLT5hY2xfc2l6ZV9zICsgZm5vZGUtPmVhX3NpemVfcyA+IDB4MjAwKSB7CisJCWhwZnNfZXJyb3IocywgImZub2RlICUwOHg6IGVhX29mZnMgPT0gJTAzeCwgZWFfc2l6ZV9zID09ICUwM3giLAorCQkJaW5vZGUtPmlfaW5vLCBmbm9kZS0+ZWFfb2ZmcywgZm5vZGUtPmVhX3NpemVfcyk7CisJCXJldHVybjsKKwl9CisJaWYgKChmbm9kZS0+ZWFfc2l6ZV9zIHx8ICFmbm9kZS0+ZWFfc2l6ZV9sKSAmJgorCSAgICAgZm5vZGUtPmVhX29mZnMgKyBmbm9kZS0+YWNsX3NpemVfcyArIGZub2RlLT5lYV9zaXplX3MgKyBzdHJsZW4oa2V5KSArIHNpemUgKyA1IDw9IDB4MjAwKSB7CisJCWVhID0gZm5vZGVfZW5kX2VhKGZub2RlKTsKKwkJKihjaGFyICopZWEgPSAwOworCQllYS0+bmFtZWxlbiA9IHN0cmxlbihrZXkpOworCQllYS0+dmFsdWVsZW4gPSBzaXplOworCQlzdHJjcHkoZWEtPm5hbWUsIGtleSk7CisJCW1lbWNweShlYV9kYXRhKGVhKSwgZGF0YSwgc2l6ZSk7CisJCWZub2RlLT5lYV9zaXplX3MgKz0gc3RybGVuKGtleSkgKyBzaXplICsgNTsKKwkJZ290byByZXQ7CisJfQorCS8qIE1vc3QgdGhlIGNvZGUgaGVyZSBpcyA5OS45OTkzNDIyJSB1bnVzZWQuIEkgaG9wZSB0aGVyZSBhcmUgbm8gYnVncy4KKwkgICBCdXQgd2hhdCAuLiBIUEZTLklGUyBoYXMgYWxzbyBidWdzIGluIGVhIG1hbmFnZW1lbnQuICovCisJaWYgKGZub2RlLT5lYV9zaXplX3MgJiYgIWZub2RlLT5lYV9zaXplX2wpIHsKKwkJc2Vjbm8gbjsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwkJY2hhciAqZGF0YTsKKwkJaWYgKCEobiA9IGhwZnNfYWxsb2Nfc2VjdG9yKHMsIGZubywgMSwgMCwgMSkpKSByZXR1cm47CisJCWlmICghKGRhdGEgPSBocGZzX2dldF9zZWN0b3IocywgbiwgJmJoKSkpIHsKKwkJCWhwZnNfZnJlZV9zZWN0b3JzKHMsIG4sIDEpOworCQkJcmV0dXJuOworCQl9CisJCW1lbWNweShkYXRhLCBmbm9kZV9lYShmbm9kZSksIGZub2RlLT5lYV9zaXplX3MpOworCQlmbm9kZS0+ZWFfc2l6ZV9sID0gZm5vZGUtPmVhX3NpemVfczsKKwkJZm5vZGUtPmVhX3NpemVfcyA9IDA7CisJCWZub2RlLT5lYV9zZWNubyA9IG47CisJCWZub2RlLT5lYV9hbm9kZSA9IDA7CisJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwkJYnJlbHNlKGJoKTsKKwl9CisJcG9zID0gZm5vZGUtPmVhX3NpemVfbCArIDUgKyBzdHJsZW4oa2V5KSArIHNpemU7CisJbGVuID0gKGZub2RlLT5lYV9zaXplX2wgKyA1MTEpID4+IDk7CisJaWYgKHBvcyA+PSAzMDAwMCkgZ290byBiYWlsOworCXdoaWxlICgoKHBvcyArIDUxMSkgPj4gOSkgPiBsZW4pIHsKKwkJaWYgKCFsZW4pIHsKKwkJCWlmICghKGZub2RlLT5lYV9zZWNubyA9IGhwZnNfYWxsb2Nfc2VjdG9yKHMsIGZubywgMSwgMCwgMSkpKQorCQkJCWdvdG8gYmFpbDsKKwkJCWZub2RlLT5lYV9hbm9kZSA9IDA7CisJCQlsZW4rKzsKKwkJfSBlbHNlIGlmICghZm5vZGUtPmVhX2Fub2RlKSB7CisJCQlpZiAoaHBmc19hbGxvY19pZl9wb3NzaWJsZShzLCBmbm9kZS0+ZWFfc2Vjbm8gKyBsZW4pKSB7CisJCQkJbGVuKys7CisJCQl9IGVsc2UgeworCQkJCS8qIEFhcmdoLi4uIGRvbid0IGtub3cgaG93IHRvIGNyZWF0ZSBlYSBhbm9kZXMgOi0oICovCisJCQkJLypzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCQkJCXN0cnVjdCBhbm9kZSAqYW5vZGU7CisJCQkJYW5vZGVfc2Vjbm8gYV9zOworCQkJCWlmICghKGFub2RlID0gaHBmc19hbGxvY19hbm9kZShzLCBmbm8sICZhX3MsICZiaCkpKQorCQkJCQlnb3RvIGJhaWw7CisJCQkJYW5vZGUtPnVwID0gZm5vOworCQkJCWFub2RlLT5idHJlZS5mbm9kZV9wYXJlbnQgPSAxOworCQkJCWFub2RlLT5idHJlZS5uX2ZyZWVfbm9kZXMtLTsKKwkJCQlhbm9kZS0+YnRyZWUubl91c2VkX25vZGVzKys7CisJCQkJYW5vZGUtPmJ0cmVlLmZpcnN0X2ZyZWUgKz0gMTI7CisJCQkJYW5vZGUtPnUuZXh0ZXJuYWxbMF0uZGlza19zZWNubyA9IGZub2RlLT5lYV9zZWNubzsKKwkJCQlhbm9kZS0+dS5leHRlcm5hbFswXS5maWxlX3NlY25vID0gMDsKKwkJCQlhbm9kZS0+dS5leHRlcm5hbFswXS5sZW5ndGggPSBsZW47CisJCQkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQkJCWJyZWxzZShiaCk7CisJCQkJZm5vZGUtPmVhX2Fub2RlID0gMTsKKwkJCQlmbm9kZS0+ZWFfc2Vjbm8gPSBhX3M7Ki8KKwkJCQlzZWNubyBuZXdfc2VjOworCQkJCWludCBpOworCQkJCWlmICghKG5ld19zZWMgPSBocGZzX2FsbG9jX3NlY3RvcihzLCBmbm8sIDEsIDEgLSAoKHBvcyArIDUxMSkgPj4gOSksIDEpKSkKKwkJCQkJZ290byBiYWlsOworCQkJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoMSwgKmJoMjsKKwkJCQkJdm9pZCAqYjEsICpiMjsKKwkJCQkJaWYgKCEoYjEgPSBocGZzX21hcF9zZWN0b3IocywgZm5vZGUtPmVhX3NlY25vICsgaSwgJmJoMSwgbGVuIC0gaSAtIDEpKSkgeworCQkJCQkJaHBmc19mcmVlX3NlY3RvcnMocywgbmV3X3NlYywgKHBvcyArIDUxMSkgPj4gOSk7CisJCQkJCQlnb3RvIGJhaWw7CisJCQkJCX0KKwkJCQkJaWYgKCEoYjIgPSBocGZzX2dldF9zZWN0b3IocywgbmV3X3NlYyArIGksICZiaDIpKSkgeworCQkJCQkJYnJlbHNlKGJoMSk7CisJCQkJCQlocGZzX2ZyZWVfc2VjdG9ycyhzLCBuZXdfc2VjLCAocG9zICsgNTExKSA+PiA5KTsKKwkJCQkJCWdvdG8gYmFpbDsKKwkJCQkJfQorCQkJCQltZW1jcHkoYjIsIGIxLCA1MTIpOworCQkJCQlicmVsc2UoYmgxKTsKKwkJCQkJbWFya19idWZmZXJfZGlydHkoYmgyKTsKKwkJCQkJYnJlbHNlKGJoMik7CisJCQkJfQorCQkJCWhwZnNfZnJlZV9zZWN0b3JzKHMsIGZub2RlLT5lYV9zZWNubywgbGVuKTsKKwkJCQlmbm9kZS0+ZWFfc2Vjbm8gPSBuZXdfc2VjOworCQkJCWxlbiA9IChwb3MgKyA1MTEpID4+IDk7CisJCQl9CisJCX0KKwkJaWYgKGZub2RlLT5lYV9hbm9kZSkgeworCQkJaWYgKGhwZnNfYWRkX3NlY3Rvcl90b19idHJlZShzLCBmbm9kZS0+ZWFfc2Vjbm8sCisJCQkJCQkgICAgIDAsIGxlbikgIT0gLTEpIHsKKwkJCQlsZW4rKzsKKwkJCX0gZWxzZSB7CisJCQkJZ290byBiYWlsOworCQkJfQorCQl9CisJfQorCWhbMF0gPSAwOworCWhbMV0gPSBzdHJsZW4oa2V5KTsKKwloWzJdID0gc2l6ZSAmIDB4ZmY7CisJaFszXSA9IHNpemUgPj4gODsKKwlpZiAoaHBmc19lYV93cml0ZShzLCBmbm9kZS0+ZWFfc2Vjbm8sIGZub2RlLT5lYV9hbm9kZSwgZm5vZGUtPmVhX3NpemVfbCwgNCwgaCkpIGdvdG8gYmFpbDsKKwlpZiAoaHBmc19lYV93cml0ZShzLCBmbm9kZS0+ZWFfc2Vjbm8sIGZub2RlLT5lYV9hbm9kZSwgZm5vZGUtPmVhX3NpemVfbCArIDQsIGhbMV0gKyAxLCBrZXkpKSBnb3RvIGJhaWw7CisJaWYgKGhwZnNfZWFfd3JpdGUocywgZm5vZGUtPmVhX3NlY25vLCBmbm9kZS0+ZWFfYW5vZGUsIGZub2RlLT5lYV9zaXplX2wgKyA1ICsgaFsxXSwgc2l6ZSwgZGF0YSkpIGdvdG8gYmFpbDsKKwlmbm9kZS0+ZWFfc2l6ZV9sID0gcG9zOworCXJldDoKKwlocGZzX2koaW5vZGUpLT5pX2VhX3NpemUgKz0gNSArIHN0cmxlbihrZXkpICsgc2l6ZTsKKwlyZXR1cm47CisJYmFpbDoKKwlpZiAoZm5vZGUtPmVhX3NlY25vKQorCQlpZiAoZm5vZGUtPmVhX2Fub2RlKSBocGZzX3RydW5jYXRlX2J0cmVlKHMsIGZub2RlLT5lYV9zZWNubywgMSwgKGZub2RlLT5lYV9zaXplX2wgKyA1MTEpID4+IDkpOworCQllbHNlIGhwZnNfZnJlZV9zZWN0b3JzKHMsIGZub2RlLT5lYV9zZWNubyArICgoZm5vZGUtPmVhX3NpemVfbCArIDUxMSkgPj4gOSksIGxlbiAtICgoZm5vZGUtPmVhX3NpemVfbCArIDUxMSkgPj4gOSkpOworCWVsc2UgZm5vZGUtPmVhX3NlY25vID0gZm5vZGUtPmVhX3NpemVfbCA9IDA7Cit9CisJCmRpZmYgLS1naXQgYS9mcy9ocGZzL2ZpbGUuYyBiL2ZzL2hwZnMvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMTQ0ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ocGZzL2ZpbGUuYwpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqICBsaW51eC9mcy9ocGZzL2ZpbGUuYworICoKKyAqICBNaWt1bGFzIFBhdG9ja2EgKG1pa3VsYXNAYXJ0YXgua2FybGluLm1mZi5jdW5pLmN6KSwgMTk5OC0xOTk5CisgKgorICogIGZpbGUgVkZTIGZ1bmN0aW9ucworICovCisKKyNpbmNsdWRlICJocGZzX2ZuLmgiCisKKyNkZWZpbmUgQkxPQ0tTKHNpemUpICgoKHNpemUpICsgNTExKSA+PiA5KQorCitzdGF0aWMgaW50IGhwZnNfZmlsZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWxvY2tfa2VybmVsKCk7CisJaHBmc193cml0ZV9pZl9jaGFuZ2VkKGlub2RlKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBocGZzX2ZpbGVfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGRhdGFzeW5jKQoreworCS8qcmV0dXJuIGZpbGVfZnN5bmMoZmlsZSwgZGVudHJ5KTsqLworCXJldHVybiAwOyAvKiBEb24ndCBmc3luYyA6LSkgKi8KK30KKworLyoKKyAqIGdlbmVyaWNfZmlsZV9yZWFkIG9mdGVuIGNhbGxzIGJtYXAgd2l0aCBub24tZXhpc3Rpbmcgc2VjdG9yLAorICogc28gd2UgbXVzdCBpZ25vcmUgc3VjaCBlcnJvcnMuCisgKi8KKworc3RhdGljIHNlY25vIGhwZnNfYm1hcChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBmaWxlX3NlY25vKQoreworCXN0cnVjdCBocGZzX2lub2RlX2luZm8gKmhwZnNfaW5vZGUgPSBocGZzX2koaW5vZGUpOworCXVuc2lnbmVkIG4sIGRpc2tfc2Vjbm87CisJc3RydWN0IGZub2RlICpmbm9kZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWlmIChCTE9DS1MoaHBmc19pKGlub2RlKS0+bW11X3ByaXZhdGUpIDw9IGZpbGVfc2Vjbm8pIHJldHVybiAwOworCW4gPSBmaWxlX3NlY25vIC0gaHBmc19pbm9kZS0+aV9maWxlX3NlYzsKKwlpZiAobiA8IGhwZnNfaW5vZGUtPmlfbl9zZWNzKSByZXR1cm4gaHBmc19pbm9kZS0+aV9kaXNrX3NlYyArIG47CisJaWYgKCEoZm5vZGUgPSBocGZzX21hcF9mbm9kZShpbm9kZS0+aV9zYiwgaW5vZGUtPmlfaW5vLCAmYmgpKSkgcmV0dXJuIDA7CisJZGlza19zZWNubyA9IGhwZnNfYnBsdXNfbG9va3VwKGlub2RlLT5pX3NiLCBpbm9kZSwgJmZub2RlLT5idHJlZSwgZmlsZV9zZWNubywgYmgpOworCWlmIChkaXNrX3NlY25vID09IC0xKSByZXR1cm4gMDsKKwlpZiAoaHBmc19jaGtfc2VjdG9ycyhpbm9kZS0+aV9zYiwgZGlza19zZWNubywgMSwgImJtYXAiKSkgcmV0dXJuIDA7CisJcmV0dXJuIGRpc2tfc2Vjbm87Cit9CisKK3N0YXRpYyB2b2lkIGhwZnNfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppKQoreworCWlmIChJU19JTU1VVEFCTEUoaSkpIHJldHVybiAvKi1FUEVSTSovOworCWxvY2tfa2VybmVsKCk7CisJaHBmc19pKGkpLT5pX25fc2VjcyA9IDA7CisJaS0+aV9ibG9ja3MgPSAxICsgKChpLT5pX3NpemUgKyA1MTEpID4+IDkpOworCWhwZnNfaShpKS0+bW11X3ByaXZhdGUgPSBpLT5pX3NpemU7CisJaHBmc190cnVuY2F0ZV9idHJlZShpLT5pX3NiLCBpLT5pX2lubywgMSwgKChpLT5pX3NpemUgKyA1MTEpID4+IDkpKTsKKwlocGZzX3dyaXRlX2lub2RlKGkpOworCWhwZnNfaShpKS0+aV9uX3NlY3MgPSAwOworCXVubG9ja19rZXJuZWwoKTsKK30KKworc3RhdGljIGludCBocGZzX2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBpYmxvY2ssIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LCBpbnQgY3JlYXRlKQoreworCXNlY25vIHM7CisJcyA9IGhwZnNfYm1hcChpbm9kZSwgaWJsb2NrKTsKKwlpZiAocykgeworCQltYXBfYmgoYmhfcmVzdWx0LCBpbm9kZS0+aV9zYiwgcyk7CisJCXJldHVybiAwOworCX0KKwlpZiAoIWNyZWF0ZSkgcmV0dXJuIDA7CisJaWYgKGlibG9jazw8OSAhPSBocGZzX2koaW5vZGUpLT5tbXVfcHJpdmF0ZSkgeworCQlCVUcoKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmICgocyA9IGhwZnNfYWRkX3NlY3Rvcl90b19idHJlZShpbm9kZS0+aV9zYiwgaW5vZGUtPmlfaW5vLCAxLCBpbm9kZS0+aV9ibG9ja3MgLSAxKSkgPT0gLTEpIHsKKwkJaHBmc190cnVuY2F0ZV9idHJlZShpbm9kZS0+aV9zYiwgaW5vZGUtPmlfaW5vLCAxLCBpbm9kZS0+aV9ibG9ja3MgLSAxKTsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCWlub2RlLT5pX2Jsb2NrcysrOworCWhwZnNfaShpbm9kZSktPm1tdV9wcml2YXRlICs9IDUxMjsKKwlzZXRfYnVmZmVyX25ldyhiaF9yZXN1bHQpOworCW1hcF9iaChiaF9yZXN1bHQsIGlub2RlLT5pX3NiLCBzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBocGZzX3dyaXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7CisJcmV0dXJuIGJsb2NrX3dyaXRlX2Z1bGxfcGFnZShwYWdlLGhwZnNfZ2V0X2Jsb2NrLCB3YmMpOworfQorc3RhdGljIGludCBocGZzX3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlyZXR1cm4gYmxvY2tfcmVhZF9mdWxsX3BhZ2UocGFnZSxocGZzX2dldF9ibG9jayk7Cit9CitzdGF0aWMgaW50IGhwZnNfcHJlcGFyZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCXJldHVybiBjb250X3ByZXBhcmVfd3JpdGUocGFnZSxmcm9tLHRvLGhwZnNfZ2V0X2Jsb2NrLAorCQkmaHBmc19pKHBhZ2UtPm1hcHBpbmctPmhvc3QpLT5tbXVfcHJpdmF0ZSk7Cit9CitzdGF0aWMgc2VjdG9yX3QgX2hwZnNfYm1hcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc2VjdG9yX3QgYmxvY2spCit7CisJcmV0dXJuIGdlbmVyaWNfYmxvY2tfYm1hcChtYXBwaW5nLGJsb2NrLGhwZnNfZ2V0X2Jsb2NrKTsKK30KK3N0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgaHBmc19hb3BzID0geworCS5yZWFkcGFnZSA9IGhwZnNfcmVhZHBhZ2UsCisJLndyaXRlcGFnZSA9IGhwZnNfd3JpdGVwYWdlLAorCS5zeW5jX3BhZ2UgPSBibG9ja19zeW5jX3BhZ2UsCisJLnByZXBhcmVfd3JpdGUgPSBocGZzX3ByZXBhcmVfd3JpdGUsCisJLmNvbW1pdF93cml0ZSA9IGdlbmVyaWNfY29tbWl0X3dyaXRlLAorCS5ibWFwID0gX2hwZnNfYm1hcAorfTsKKworc3RhdGljIHNzaXplX3QgaHBmc19maWxlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3NpemVfdCByZXR2YWw7CisKKwlyZXR2YWwgPSBnZW5lcmljX2ZpbGVfd3JpdGUoZmlsZSwgYnVmLCBjb3VudCwgcHBvcyk7CisJaWYgKHJldHZhbCA+IDApIHsKKwkJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCQlpbm9kZS0+aV9tdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJCWhwZnNfaShpbm9kZSktPmlfZGlydHkgPSAxOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGhwZnNfZmlsZV9vcHMgPQoreworCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKKwkucmVhZAkJPSBnZW5lcmljX2ZpbGVfcmVhZCwKKwkud3JpdGUJCT0gaHBmc19maWxlX3dyaXRlLAorCS5tbWFwCQk9IGdlbmVyaWNfZmlsZV9tbWFwLAorCS5yZWxlYXNlCT0gaHBmc19maWxlX3JlbGVhc2UsCisJLmZzeW5jCQk9IGhwZnNfZmlsZV9mc3luYywKKwkuc2VuZGZpbGUJPSBnZW5lcmljX2ZpbGVfc2VuZGZpbGUsCit9OworCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBocGZzX2ZpbGVfaW9wcyA9Cit7CisJLnRydW5jYXRlCT0gaHBmc190cnVuY2F0ZSwKKwkuc2V0YXR0cgk9IGhwZnNfbm90aWZ5X2NoYW5nZSwKK307CmRpZmYgLS1naXQgYS9mcy9ocGZzL2hwZnMuaCBiL2ZzL2hwZnMvaHBmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlODRjNzMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ocGZzL2hwZnMuaApAQCAtMCwwICsxLDQ5MyBAQAorLyoKKyAqICBsaW51eC9mcy9ocGZzL2hwZnMuaAorICoKKyAqICBIUEZTIHN0cnVjdHVyZXMgYnkgQ2hyaXMgU21pdGgsIDE5OTMKKyAqCisgKiAgYSBsaXR0bGUgYml0IG1vZGlmaWVkIGJ5IE1pa3VsYXMgUGF0b2NrYSwgMTk5OC0xOTk5CisgKi8KKworLyogVGhlIHBhcGVyCisKKyAgICAgRHVuY2FuLCBSb3kKKyAgICAgRGVzaWduIGdvYWxzIGFuZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbmV3IEhpZ2ggUGVyZm9ybWFuY2UgRmlsZSBTeXN0ZW0KKyAgICAgTWljcm9zb2Z0IFN5c3RlbXMgSm91cm5hbCAgU2VwdCAxOTg5ICB2NCBuNSBwMSgxMykKKworICAgZGVzY3JpYmVzIHdoYXQgSFBGUyBsb29rZWQgbGlrZSB3aGVuIGl0IHdhcyBuZXcsIGFuZCBpdCBpcyB0aGUgc291cmNlCisgICBvZiBtb3N0IG9mIHRoZSBpbmZvcm1hdGlvbiBnaXZlbiBoZXJlLiAgVGhlIHJlc3QgaXMgY29uamVjdHVyZS4KKworICAgRm9yIGRlZmluaXRpdmUgaW5mb3JtYXRpb24gb24gdGhlIER1bmNhbiBwYXBlciwgc2VlIGl0LCBub3QgdGhpcyBmaWxlLgorICAgRm9yIGRlZmluaXRpdmUgaW5mb3JtYXRpb24gb24gSFBGUywgYXNrIHNvbWVib2R5IGVsc2UgLS0gdGhpcyBpcyBndWVzc3dvcmsuCisgICBUaGVyZSBhcmUgY2VydGFpbiB0byBiZSBtYW55IG1pc3Rha2VzLiAqLworCisvKiBOb3RhdGlvbiAqLworCit0eXBlZGVmIHVuc2lnbmVkIHNlY25vOwkJCS8qIHNlY3RvciBudW1iZXIsIHBhcnRpdGlvbiByZWxhdGl2ZSAqLworCit0eXBlZGVmIHNlY25vIGRub2RlX3NlY25vOwkJLyogc2VjdG9yIG51bWJlciBvZiBhIGRub2RlICovCit0eXBlZGVmIHNlY25vIGZub2RlX3NlY25vOwkJLyogc2VjdG9yIG51bWJlciBvZiBhbiBmbm9kZSAqLwordHlwZWRlZiBzZWNubyBhbm9kZV9zZWNubzsJCS8qIHNlY3RvciBudW1iZXIgb2YgYW4gYW5vZGUgKi8KKwordHlwZWRlZiB1MzIgdGltZTMyX3Q7CQkvKiAzMi1iaXQgdGltZV90IHR5cGUgKi8KKworLyogc2VjdG9yIDAgKi8KKworLyogVGhlIGJvb3QgYmxvY2sgaXMgdmVyeSBsaWtlIGEgRkFUIGJvb3QgYmxvY2ssIGV4Y2VwdCB0aGF0IHRoZQorICAgMjloIHNpZ25hdHVyZSBieXRlIGlzIDI4aCBpbnN0ZWFkLCBhbmQgdGhlIElEIHN0cmluZyBpcyAiSFBGUyIuICovCisKKyNkZWZpbmUgQkJfTUFHSUMgMHhhYTU1CisKK3N0cnVjdCBocGZzX2Jvb3RfYmxvY2sKK3sKKyAgdW5zaWduZWQgY2hhciBqbXBbM107CisgIHVuc2lnbmVkIGNoYXIgb2VtX2lkWzhdOworICB1bnNpZ25lZCBjaGFyIGJ5dGVzX3Blcl9zZWN0b3JbMl07CS8qIDUxMiAqLworICB1bnNpZ25lZCBjaGFyIHNlY3RvcnNfcGVyX2NsdXN0ZXI7CisgIHVuc2lnbmVkIGNoYXIgbl9yZXNlcnZlZF9zZWN0b3JzWzJdOworICB1bnNpZ25lZCBjaGFyIG5fZmF0czsKKyAgdW5zaWduZWQgY2hhciBuX3Jvb3RkaXJfZW50cmllc1syXTsKKyAgdW5zaWduZWQgY2hhciBuX3NlY3RvcnNfc1syXTsKKyAgdW5zaWduZWQgY2hhciBtZWRpYV9ieXRlOworICB1bnNpZ25lZCBzaG9ydCBzZWN0b3JzX3Blcl9mYXQ7CisgIHVuc2lnbmVkIHNob3J0IHNlY3RvcnNfcGVyX3RyYWNrOworICB1bnNpZ25lZCBzaG9ydCBoZWFkc19wZXJfY3lsOworICB1bnNpZ25lZCBpbnQgbl9oaWRkZW5fc2VjdG9yczsKKyAgdW5zaWduZWQgaW50IG5fc2VjdG9yc19sOwkJLyogc2l6ZSBvZiBwYXJ0aXRpb24gKi8KKyAgdW5zaWduZWQgY2hhciBkcml2ZV9udW1iZXI7CisgIHVuc2lnbmVkIGNoYXIgbWJ6OworICB1bnNpZ25lZCBjaGFyIHNpZ18yOGg7CQkvKiAyOGggKi8KKyAgdW5zaWduZWQgY2hhciB2b2xfc2Vybm9bNF07CisgIHVuc2lnbmVkIGNoYXIgdm9sX2xhYmVsWzExXTsKKyAgdW5zaWduZWQgY2hhciBzaWdfaHBmc1s4XTsJCS8qICJIUEZTICAgICIgKi8KKyAgdW5zaWduZWQgY2hhciBwYWRbNDQ4XTsKKyAgdW5zaWduZWQgc2hvcnQgbWFnaWM7CQkJLyogYWE1NSAqLworfTsKKworCisvKiBzZWN0b3IgMTYgKi8KKworLyogVGhlIHN1cGVyIGJsb2NrIGhhcyB0aGUgcG9pbnRlciB0byB0aGUgcm9vdCBkaXJlY3RvcnkuICovCisKKyNkZWZpbmUgU0JfTUFHSUMgMHhmOTk1ZTg0OQorCitzdHJ1Y3QgaHBmc19zdXBlcl9ibG9jaworeworICB1bnNpZ25lZCBtYWdpYzsJCQkvKiBmOTk1IGU4NDkgKi8KKyAgdW5zaWduZWQgbWFnaWMxOwkJCS8qIGZhNTMgZTljNSwgbW9yZSBtYWdpYz8gKi8KKyAgLyp1bnNpZ25lZCBodWgyMDI7Ki8JCQkvKiA/PyAyMDIgPSBOLiBvZiBCLiBpbiAxLjAwMzkwNjI1IFMuKi8KKyAgY2hhciB2ZXJzaW9uOwkJCQkvKiB2ZXJzaW9uIG9mIGEgZmlsZXN5c3RlbSAgdXN1YWxseSAyICovCisgIGNoYXIgZnVuY3ZlcnNpb247CQkJLyogZnVuY3Rpb25hbCB2ZXJzaW9uIC0gb2xkZXN0IHZlcnNpb24KKyAgCQkJCQkgICBvZiBmaWxlc3lzdGVtIHRoYXQgY2FuIHVuZGVyc3RhbmQKKwkJCQkJICAgdGhpcyBkaXNrICovCisgIHVuc2lnbmVkIHNob3J0IGludCB6ZXJvOwkJLyogMCAqLworICBmbm9kZV9zZWNubyByb290OwkJCS8qIGZub2RlIG9mIHJvb3QgZGlyZWN0b3J5ICovCisgIHNlY25vIG5fc2VjdG9yczsJCQkvKiBzaXplIG9mIGZpbGVzeXN0ZW0gKi8KKyAgdW5zaWduZWQgbl9iYWRibG9ja3M7CQkJLyogbnVtYmVyIG9mIGJhZCBibG9ja3MgKi8KKyAgc2Vjbm8gYml0bWFwczsJCQkvKiBwb2ludGVycyB0byBmcmVlIHNwYWNlIGJpdCBtYXBzICovCisgIHVuc2lnbmVkIHplcm8xOwkJCS8qIDAgKi8KKyAgc2Vjbm8gYmFkYmxvY2tzOwkJCS8qIGJhZCBibG9jayBsaXN0ICovCisgIHVuc2lnbmVkIHplcm8zOwkJCS8qIDAgKi8KKyAgdGltZTMyX3QgbGFzdF9jaGtkc2s7CQkJLyogZGF0ZSBsYXN0IGNoZWNrZWQsIDAgaWYgbmV2ZXIgKi8KKyAgLyp1bnNpZ25lZCB6ZXJvNDsqLwkJCS8qIDAgKi8KKyAgdGltZTMyX3QgbGFzdF9vcHRpbWl6ZTsJCQkvKiBkYXRlIGxhc3Qgb3B0aW1pemVkLCAwIGlmIG5ldmVyICovCisgIHNlY25vIG5fZGlyX2JhbmQ7CQkJLyogbnVtYmVyIG9mIHNlY3RvcnMgaW4gZGlyIGJhbmQgKi8KKyAgc2Vjbm8gZGlyX2JhbmRfc3RhcnQ7CQkJLyogZmlyc3Qgc2VjdG9yIGluIGRpciBiYW5kICovCisgIHNlY25vIGRpcl9iYW5kX2VuZDsJCQkvKiBsYXN0IHNlY3RvciBpbiBkaXIgYmFuZCAqLworICBzZWNubyBkaXJfYmFuZF9iaXRtYXA7CQkvKiBmcmVlIHNwYWNlIG1hcCwgMSBkbm9kZSBwZXIgYml0ICovCisgIGNoYXIgdm9sdW1lX25hbWVbMzJdOwkJCS8qIG5vdCB1c2VkICovCisgIHNlY25vIHVzZXJfaWRfdGFibGU7CQkJLyogOCBwcmVhbGxvY2F0ZWQgc2VjdG9ycyAtIHVzZXIgaWQgKi8KKyAgdW5zaWduZWQgemVybzZbMTAzXTsJCQkvKiAwICovCit9OworCisKKy8qIHNlY3RvciAxNyAqLworCisvKiBUaGUgc3BhcmUgYmxvY2sgaGFzIHBvaW50ZXJzIHRvIHNwYXJlIHNlY3RvcnMuICAqLworCisjZGVmaW5lIFNQX01BR0lDIDB4Zjk5MTE4NDkKKworc3RydWN0IGhwZnNfc3BhcmVfYmxvY2sKK3sKKyAgdW5zaWduZWQgbWFnaWM7CQkJLyogZjk5MSAxODQ5ICovCisgIHVuc2lnbmVkIG1hZ2ljMTsJCQkvKiBmYTUyIDI5YzUsIG1vcmUgbWFnaWM/ICovCisKKyAgdW5zaWduZWQgZGlydHk6IDE7CQkJLyogMCBjbGVhbiwgMSAiaW1wcm9wZXJseSBzdG9wcGVkIiAqLworICAvKnVuc2lnbmVkIGZsYWcxMjM0OiA0OyovCQkvKiB1bmtub3duIGZsYWdzICovCisgIHVuc2lnbmVkIHNwYXJlZGlyX3VzZWQ6IDE7CQkvKiBzcGFyZSBkaXJibGtzIHVzZWQgKi8KKyAgdW5zaWduZWQgaG90Zml4ZXNfdXNlZDogMTsJCS8qIGhvdGZpeGVzIHVzZWQgKi8KKyAgdW5zaWduZWQgYmFkX3NlY3RvcjogMTsJCS8qIGJhZCBzZWN0b3IsIGNvcnJ1cHRlZCBkaXNrICg/Pz8pICovCisgIHVuc2lnbmVkIGJhZF9iaXRtYXA6IDE7CQkvKiBiYWQgYml0bWFwICovCisgIHVuc2lnbmVkIGZhc3Q6IDE7CQkJLyogcGFydGl0aW9uIHdhcyBmYXN0IGZvcm1hdHRlZCAqLworICB1bnNpZ25lZCBvbGRfd3JvdGU6IDE7CQkvKiBvbGQgdmVyc2lvbiB3cm90ZSB0byBwYXJ0aW9uICovCisgIHVuc2lnbmVkIG9sZF93cm90ZV8xOiAxOwkJLyogb2xkIHZlcnNpb24gd3JvdGUgdG8gcGFydGlvbiAoPykgKi8KKyAgdW5zaWduZWQgaW5zdGFsbF9kYXNkX2xpbWl0czogMTsJLyogSFBGUzM4NiBmbGFncyAqLworICB1bnNpZ25lZCByZXN5bmNoX2Rhc2RfbGltaXRzOiAxOworICB1bnNpZ25lZCBkYXNkX2xpbWl0c19vcGVyYXRpb25hbDogMTsKKyAgdW5zaWduZWQgbXVsdGltZWRpYV9hY3RpdmU6IDE7CisgIHVuc2lnbmVkIGRjZV9hY2xzX2FjdGl2ZTogMTsKKyAgdW5zaWduZWQgZGFzZF9saW1pdHNfZGlydHk6IDE7CisgIHVuc2lnbmVkIGZsYWc2NzogMjsKKyAgdW5zaWduZWQgY2hhciBtbV9jb250bGd1bHR5OworICB1bnNpZ25lZCBjaGFyIHVudXNlZDsKKworICBzZWNubyBob3RmaXhfbWFwOwkJCS8qIGluZm8gYWJvdXQgcmVtYXBwZWQgYmFkIHNlY3RvcnMgKi8KKyAgdW5zaWduZWQgbl9zcGFyZXNfdXNlZDsJCS8qIG51bWJlciBvZiBob3RmaXhlcyAqLworICB1bnNpZ25lZCBuX3NwYXJlczsJCQkvKiBudW1iZXIgb2Ygc3BhcmVzIGluIGhvdGZpeCBtYXAgKi8KKyAgdW5zaWduZWQgbl9kbm9kZV9zcGFyZXNfZnJlZTsJCS8qIHNwYXJlIGRub2RlcyB1bnVzZWQgKi8KKyAgdW5zaWduZWQgbl9kbm9kZV9zcGFyZXM7CQkvKiBsZW5ndGggb2Ygc3BhcmVfZG5vZGVzW10gbGlzdCwKKwkJCQkJICAgZm9sbG93cyBpbiB0aGlzIGJsb2NrKi8KKyAgc2Vjbm8gY29kZV9wYWdlX2RpcjsJCQkvKiBjb2RlIHBhZ2UgZGlyZWN0b3J5IGJsb2NrICovCisgIHVuc2lnbmVkIG5fY29kZV9wYWdlczsJCS8qIG51bWJlciBvZiBjb2RlIHBhZ2VzICovCisgIC8qdW5zaWduZWQgbGFyZ2VfbnVtYmVyc1syXTsqLwkvKiA/PyAqLworICB1bnNpZ25lZCBzdXBlcl9jcmM7CQkJLyogb24gSFBGUzM4NiBhbmQgTEFOIFNlcnZlciB0aGlzIGlzCisgIAkJCQkJICAgY2hlY2tzdW0gb2Ygc3VwZXJibG9jaywgb24gbm9ybWFsCisJCQkJCSAgIE9TLzIgdW51c2VkICovCisgIHVuc2lnbmVkIHNwYXJlX2NyYzsJCQkvKiBvbiBIUEZTMzg2IGNoZWNrc3VtIG9mIHNwYXJlYmxvY2sgKi8KKyAgdW5zaWduZWQgemVybzFbMTVdOwkJCS8qIHVudXNlZCAqLworICBkbm9kZV9zZWNubyBzcGFyZV9kbm9kZXNbMTAwXTsJLyogZW1lcmdlbmN5IGZyZWUgZG5vZGUgbGlzdCAqLworICB1bnNpZ25lZCB6ZXJvMlsxXTsJCQkvKiByb29tIGZvciBtb3JlPyAqLworfTsKKworLyogVGhlIGJhZCBibG9jayBsaXN0IGlzIDQgc2VjdG9ycyBsb25nLiAgVGhlIGZpcnN0IHdvcmQgbXVzdCBiZSB6ZXJvLAorICAgdGhlIHJlbWFpbmluZyB3b3JkcyBnaXZlIG5fYmFkYmxvY2tzIGJhZCBibG9jayBudW1iZXJzLgorICAgSSBiZXQgeW91IGNhbiBzZWUgaXQgY29taW5nLi4uICovCisKKyNkZWZpbmUgQkFEX01BR0lDIDAKKyAgICAgICAKKy8qIFRoZSBob3RmaXggbWFwIGlzIDQgc2VjdG9ycyBsb25nLiAgSXQgbG9va3MgbGlrZQorCisgICAgICAgc2Vjbm8gZnJvbVtuX3NwYXJlc107CisgICAgICAgc2Vjbm8gdG9bbl9zcGFyZXNdOworCisgICBUaGUgdG9bXSBsaXN0IGlzIGluaXRpYWxpemVkIHRvIHBvaW50IHRvIG5fc3BhcmVzIHByZWFsbG9jYXRlZCBlbXB0eQorICAgc2VjdG9ycy4gIFRoZSBmcm9tW10gbGlzdCBjb250YWlucyB0aGUgc2VjdG9yIG51bWJlcnMgb2YgYmFkIGJsb2NrcworICAgd2hpY2ggaGF2ZSBiZWVuIHJlbWFwcGVkIHRvIGNvcnJlc3BvbmRpbmcgc2VjdG9ycyBpbiB0aGUgdG9bXSBsaXN0LgorICAgbl9zcGFyZXNfdXNlZCBnaXZlcyB0aGUgbGVuZ3RoIG9mIHRoZSBmcm9tW10gbGlzdC4gKi8KKworCisvKiBTZWN0b3JzIDE4IGFuZCAxOSBhcmUgcHJlYWxsb2NhdGVkIGFuZCB1bnVzZWQuCisgICBNYXliZSB0aGV5J3JlIHNwYXJlcyBmb3IgMTYgYW5kIDE3LCBidXQgc2ltcGxlIHN1YnN0aXR1dGlvbiBmYWlscy4gKi8KKworCisvKiBUaGUgY29kZSBwYWdlIGluZm8gcG9pbnRlZCB0byBieSB0aGUgc3BhcmUgYmxvY2sgY29uc2lzdHMgb2YgYW4gaW5kZXgKKyAgIGJsb2NrIGFuZCBibG9ja3MgY29udGFpbmluZyB1cHBlcmNhc2luZyB0YWJsZXMuICBJIGRvbid0IGtub3cgd2hhdAorICAgdGhlc2UgYXJlIGZvciAoQ0hLRFNLLCBtYXliZT8pIC0tIE9TLzIgZG9lcyBub3Qgc2VlbSB0byB1c2UgdGhlbQorICAgaXRzZWxmLiAgTGludXggZG9lc24ndCB1c2UgdGhlbSBlaXRoZXIuICovCisKKy8qIGJsb2NrIHBvaW50ZWQgdG8gYnkgc3BhcmVibG9jay0+Y29kZV9wYWdlX2RpciAqLworCisjZGVmaW5lIENQX0RJUl9NQUdJQyAweDQ5NDUyMWY3CisKK3N0cnVjdCBjb2RlX3BhZ2VfZGlyZWN0b3J5Cit7CisgIHVuc2lnbmVkIG1hZ2ljOwkJCS8qIDQ5NDUgMjFmNyAqLworICB1bnNpZ25lZCBuX2NvZGVfcGFnZXM7CQkvKiBudW1iZXIgb2YgcG9pbnRlcnMgZm9sbG93aW5nICovCisgIHVuc2lnbmVkIHplcm8xWzJdOworICBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIHNob3J0IGl4OwkJCS8qIGluZGV4ICovCisgICAgdW5zaWduZWQgc2hvcnQgY29kZV9wYWdlX251bWJlcjsJLyogY29kZSBwYWdlIG51bWJlciAqLworICAgIHVuc2lnbmVkIGJvdW5kczsJCQkvKiBtYXRjaGVzIGNvcnJlc3BvbmRpbmcgd29yZAorCQkJCQkgICBpbiBkYXRhIGJsb2NrICovCisgICAgc2Vjbm8gY29kZV9wYWdlX2RhdGE7CQkvKiBzZWN0b3IgbnVtYmVyIG9mIGEgY29kZV9wYWdlX2RhdGEKKwkJCQkJICAgY29udGFpbmluZyBjLnAuIGFycmF5ICovCisgICAgdW5zaWduZWQgc2hvcnQgaW5kZXg7CQkvKiBpbmRleCBpbiBjLnAuIGFycmF5IGluIHRoYXQgc2VjdG9yKi8KKyAgICB1bnNpZ25lZCBzaG9ydCB1bmtub3duOwkJLyogc29tZSB1bmtub3duIHZhbHVlOyB1c3VhbGx5IDA7CisgICAgCQkJCQkgICAyIGluIEphcGFuZXNlIHZlcnNpb24gKi8KKyAgfSBhcnJheVszMV07CQkJCS8qIHVua25vd24gbGVuZ3RoICovCit9OworCisvKiBibG9ja3MgcG9pbnRlZCB0byBieSBjb2RlX3BhZ2VfZGlyZWN0b3J5ICovCisKKyNkZWZpbmUgQ1BfREFUQV9NQUdJQyAweDg5NDUyMWY3CisKK3N0cnVjdCBjb2RlX3BhZ2VfZGF0YQoreworICB1bnNpZ25lZCBtYWdpYzsJCQkvKiA4OTQ1IDIxZjcgKi8KKyAgdW5zaWduZWQgbl91c2VkOwkJCS8qICMgZWxlbWVudHMgdXNlZCBpbiBjX3BfZGF0YVtdICovCisgIHVuc2lnbmVkIGJvdW5kc1szXTsJCQkvKiBsb29rcyBhIGJpdCBsaWtlCisJCQkJCSAgICAgKGJlZzEsZW5kMSksIChiZWcyLGVuZDIpCisJCQkJCSAgIG9uZSBieXRlIGVhY2ggKi8KKyAgdW5zaWduZWQgc2hvcnQgb2Zmc1szXTsJCS8qIG9mZnNldHMgZnJvbSBzdGFydCBvZiBzZWN0b3IKKwkJCQkJICAgdG8gc3RhcnQgb2YgY19wX2RhdGFbaXhdICovCisgIHN0cnVjdCB7CisgICAgdW5zaWduZWQgc2hvcnQgaXg7CQkJLyogaW5kZXggKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBjb2RlX3BhZ2VfbnVtYmVyOwkvKiBjb2RlIHBhZ2UgbnVtYmVyICovCisgICAgdW5zaWduZWQgc2hvcnQgdW5rbm93bjsJCS8qIHRoZSBzYW1lIGFzIGluIGNwIGRpcmVjdG9yeSAqLworICAgIHVuc2lnbmVkIGNoYXIgbWFwWzEyOF07CQkvKiB1cGNhc2UgdGFibGUgZm9yIGNoYXJzIDgwLi5mZiAqLworICAgIHVuc2lnbmVkIHNob3J0IHplcm8yOworICB9IGNvZGVfcGFnZVszXTsKKyAgdW5zaWduZWQgY2hhciBpbmNvZ25pdGFbNzhdOworfTsKKworCisvKiBGcmVlIHNwYWNlIGJpdG1hcHMgYXJlIDQgc2VjdG9ycyBsb25nLCB3aGljaCBpcyAxNjM4NCBiaXRzLgorICAgMTYzODQgc2VjdG9ycyBpcyA4IG1lZywgYW5kIGVhY2ggOCBtZWcgYmFuZCBoYXMgYSA0LXNlY3RvciBiaXRtYXAuCisgICBCaXQgb3JkZXIgaW4gdGhlIG1hcHMgaXMgbGl0dGxlLWVuZGlhbi4gIDAgbWVhbnMgdGFrZW4sIDEgbWVhbnMgZnJlZS4KKworICAgQml0IG1hcCBzZWN0b3JzIGFyZSBtYXJrZWQgYWxsb2NhdGVkIGluIHRoZSBiaXQgbWFwcywgYW5kIHNvIGFyZSBzZWN0b3JzIAorICAgb2ZmIHRoZSBlbmQgb2YgdGhlIHBhcnRpdGlvbi4KKworICAgQmFuZCAwIGlzIHNlY3RvcnMgMC0zZmZmLCBpdHMgbWFwIGlzIGluIHNlY3RvcnMgMTgtMWIuCisgICBCYW5kIDEgaXMgNDAwMC03ZmZmLCBpdHMgbWFwIGlzIGluIDdmZmMtN2ZmZi4KKyAgIEJhbmQgMiBpcyA4MDAwLWZmZmYsIGl0cyBtYXAgaXMgaW4gODAwMC04MDAzLgorICAgVGhlIHJlbWFpbmluZyBiYW5kcyBoYXZlIG1hcHMgaW4gdGhlaXIgZmlyc3QgKGV2ZW4pIG9yIGxhc3QgKG9kZCkgNCBzZWN0b3JzCisgICAgIC0tIGlmIHRoZSBsYXN0LCBwYXJ0aWFsLCBiYW5kIGlzIG9kZCBpdHMgbWFwIGlzIGluIGl0cyBsYXN0IDQgc2VjdG9ycy4KKworICAgVGhlIGJpdG1hcCBsb2NhdGlvbnMgYXJlIGdpdmVuIGluIGEgdGFibGUgcG9pbnRlZCB0byBieSB0aGUgc3VwZXIgYmxvY2suCisgICBObyBkb3VidCB0aGV5IGFyZW4ndCBjb25zdHJhaW5lZCB0byBiZSBhdCAxOCwgN2ZmYywgODAwMCwgLi4uOyB0aGF0IGlzCisgICBqdXN0IHdoZXJlIHRoZXkgdXN1YWxseSBhcmUuCisKKyAgIFRoZSAiZGlyZWN0b3J5IGJhbmQiIGlzIGEgYnVuY2ggb2Ygc2VjdG9ycyBwcmVhbGxvY2F0ZWQgZm9yIGRub2Rlcy4KKyAgIEl0IGhhcyBhIDQtc2VjdG9yIGZyZWUgc3BhY2UgYml0bWFwIG9mIGl0cyBvd24uICBFYWNoIGJpdCBpbiB0aGUgbWFwCisgICBjb3JyZXNwb25kcyB0byBvbmUgNC1zZWN0b3IgZG5vZGUsIGJpdCAwIG9mIHRoZSBtYXAgY29ycmVzcG9uZGluZyB0bworICAgdGhlIGZpcnN0IDQgc2VjdG9ycyBvZiB0aGUgZGlyZWN0b3J5IGJhbmQuICBUaGUgZW50aXJlIGJhbmQgaXMgbWFya2VkCisgICBhbGxvY2F0ZWQgaW4gdGhlIG1haW4gYml0bWFwLiAgIFRoZSBzdXBlciBibG9jayBnaXZlcyB0aGUgbG9jYXRpb25zCisgICBvZiB0aGUgZGlyZWN0b3J5IGJhbmQgYW5kIGl0cyBiaXRtYXAuICAoImJhbmQiIGRvZXNuJ3QgbWVhbiBpdCBpcworICAgOCBtZWcgbG9uZzsgaXQgaXNuJ3QuKSAgKi8KKworCisvKiBkbm9kZTogZGlyZWN0b3J5LiAgNCBzZWN0b3JzIGxvbmcgKi8KKworLyogQSBkaXJlY3RvcnkgaXMgYSB0cmVlIG9mIGRub2Rlcy4gIFRoZSBmbm9kZSBmb3IgYSBkaXJlY3RvcnkKKyAgIGNvbnRhaW5zIG9uZSBwb2ludGVyLCB0byB0aGUgcm9vdCBkbm9kZSBvZiB0aGUgdHJlZS4gIFRoZSBmbm9kZQorICAgbmV2ZXIgbW92ZXMsIHRoZSBkbm9kZXMgZG8gdGhlIEItdHJlZSB0aGluZywgc3BsaXR0aW5nIGFuZCBtZXJnaW5nCisgICBhcyBmaWxlcyBhcmUgYWRkZWQgYW5kIHJlbW92ZWQuICAqLworCisjZGVmaW5lIEROT0RFX01BR0lDICAgMHg3N2U0MGFhZQorCitzdHJ1Y3QgZG5vZGUgeworICB1bnNpZ25lZCBtYWdpYzsJCQkvKiA3N2U0IDBhYWUgKi8KKyAgdW5zaWduZWQgZmlyc3RfZnJlZTsJCQkvKiBvZmZzZXQgZnJvbSBzdGFydCBvZiBkbm9kZSB0bworCQkJCQkgICBmaXJzdCBmcmVlIGRpciBlbnRyeSAqLworICB1bnNpZ25lZCByb290X2Rub2RlOjE7CQkvKiBJcyBpdCByb290IGRub2RlPyAqLworICB1bnNpZ25lZCBpbmNyZW1lbnRfbWU6MzE7CQkvKiBzb21lIGtpbmQgb2YgYWN0aXZpdHkgY291bnRlcj8KKwkJCQkJICAgTmVpdGhlciBIUEZTLklGUyBub3IgQ0hLRFNLIGNhcmVzCisJCQkJCSAgIGlmIHlvdSBjaGFuZ2UgdGhpcyB3b3JkICovCisgIHNlY25vIHVwOwkJCQkvKiAocm9vdCBkbm9kZSkgZGlyZWN0b3J5J3MgZm5vZGUKKwkJCQkJICAgKG5vbnJvb3QpIHBhcmVudCBkbm9kZSAqLworICBkbm9kZV9zZWNubyBzZWxmOwkJCS8qIHBvaW50ZXIgdG8gdGhpcyBkbm9kZSAqLworICB1bnNpZ25lZCBjaGFyIGRpcmVudFsyMDI4XTsJCS8qIG9uZSBvciBtb3JlIGRpcmVudHMgKi8KK307CisKK3N0cnVjdCBocGZzX2RpcmVudCB7CisgIHVuc2lnbmVkIHNob3J0IGxlbmd0aDsJCS8qIG9mZnNldCB0byBuZXh0IGRpcmVudCAqLworICB1bnNpZ25lZCBmaXJzdDogMTsJCQkvKiBzZXQgb24gcGhvbnkgXkFeQSAoIi4iKSBlbnRyeSAqLworICB1bnNpZ25lZCBoYXNfYWNsOiAxOworICB1bnNpZ25lZCBkb3duOiAxOwkJCS8qIGRvd24gcG9pbnRlciBwcmVzZW50IChhZnRlciBuYW1lKSAqLworICB1bnNpZ25lZCBsYXN0OiAxOwkJCS8qIHNldCBvbiBwaG9ueSBcMzc3IGVudHJ5ICovCisgIHVuc2lnbmVkIGhhc19lYTogMTsJCQkvKiBlbnRyeSBoYXMgRUEgKi8KKyAgdW5zaWduZWQgaGFzX3h0ZF9wZXJtOiAxOwkJLyogaGFzIGV4dGVuZGVkIHBlcm0gbGlzdCAoPz8/KSAqLworICB1bnNpZ25lZCBoYXNfZXhwbGljaXRfYWNsOiAxOworICB1bnNpZ25lZCBoYXNfbmVlZGVhOiAxOwkJLyogPz8gc29tZSBFQSBoYXMgTkVFREVBIHNldAorCQkJCQkgICBJIGhhdmUgbm8gaWRlYSB3aHkgdGhpcyBpcworCQkJCQkgICBpbnRlcmVzdGluZyBpbiBhIGRpciBlbnRyeSAqLworICB1bnNpZ25lZCByZWFkX29ubHk6IDE7CQkvKiBkb3MgYXR0cmliICovCisgIHVuc2lnbmVkIGhpZGRlbjogMTsJCQkvKiBkb3MgYXR0cmliICovCisgIHVuc2lnbmVkIHN5c3RlbTogMTsJCQkvKiBkb3MgYXR0cmliICovCisgIHVuc2lnbmVkIGZsYWcxMTogMTsJCQkvKiB3b3VsZCBiZSB2b2x1bWUgbGFiZWwgZG9zIGF0dHJpYiAqLworICB1bnNpZ25lZCBkaXJlY3Rvcnk6IDE7CQkvKiBkb3MgYXR0cmliICovCisgIHVuc2lnbmVkIGFyY2hpdmU6IDE7CQkJLyogZG9zIGF0dHJpYiAqLworICB1bnNpZ25lZCBub3RfOHgzOiAxOwkJCS8qIG5hbWUgaXMgbm90IDguMyAqLworICB1bnNpZ25lZCBmbGFnMTU6IDE7CisgIGZub2RlX3NlY25vIGZub2RlOwkJCS8qIGZub2RlIGdpdmluZyBhbGxvY2F0aW9uIGluZm8gKi8KKyAgdGltZTMyX3Qgd3JpdGVfZGF0ZTsJCQkvKiBtdGltZSAqLworICB1bnNpZ25lZCBmaWxlX3NpemU7CQkJLyogZmlsZSBsZW5ndGgsIGJ5dGVzICovCisgIHRpbWUzMl90IHJlYWRfZGF0ZTsJCQkvKiBhdGltZSAqLworICB0aW1lMzJfdCBjcmVhdGlvbl9kYXRlOwkJCS8qIGN0aW1lICovCisgIHVuc2lnbmVkIGVhX3NpemU7CQkJLyogdG90YWwgRUEgbGVuZ3RoLCBieXRlcyAqLworICB1bnNpZ25lZCBjaGFyIG5vX29mX2FjbHMgOiAzOwkJLyogbnVtYmVyIG9mIEFDTCdzICovCisgIHVuc2lnbmVkIGNoYXIgcmVzZXJ2ZXIgOiA1OworICB1bnNpZ25lZCBjaGFyIGl4OwkJCS8qIGNvZGUgcGFnZSBpbmRleCAob2YgZmlsZW5hbWUpLCBzZWUKKwkJCQkJICAgc3RydWN0IGNvZGVfcGFnZV9kYXRhICovCisgIHVuc2lnbmVkIGNoYXIgbmFtZWxlbiwgbmFtZVsxXTsJLyogZmlsZSBuYW1lICovCisgIC8qIGRub2RlX3NlY25vIGRvd247CSAgYnRyZWUgZG93biBwb2ludGVyLCBpZiBwcmVzZW50LAorICAgICAJCQkgIGZvbGxvd3MgbmFtZSBvbiBuZXh0IHdvcmQgYm91bmRhcnksIG9yIG1heWJlIGl0CisJCQkgIHByZWNlZGVzIG5leHQgZGlyZW50LCB3aGljaCBpcyBvbiBhIHdvcmQgYm91bmRhcnkuICovCit9OworCisKKy8qIEIrIHRyZWU6IGFsbG9jYXRpb24gaW5mbyBpbiBmbm9kZXMgYW5kIGFub2RlcyAqLworCisvKiBkbm9kZXMgcG9pbnQgdG8gZm5vZGVzIHdoaWNoIGFyZSByZXNwb25zaWJsZSBmb3IgbGlzdGluZyB0aGUgc2VjdG9ycworICAgYXNzaWduZWQgdG8gdGhlIGZpbGUuICBUaGlzIGlzIGRvbmUgd2l0aCB0cmVlcyBvZiAobGVuZ3RoLGFkZHJlc3MpCisgICBwYWlycy4gIChBY3R1YWxseSB0cmlwbGVzLCBvZiAobGVuZ3RoLCBmaWxlLWFkZHJlc3MsIGRpc2stYWRkcmVzcykKKyAgIHdoaWNoIGNhbiByZXByZXNlbnQgaG9sZXMuICBGaW5kIG91dCBpZiBIUEZTIGRvZXMgdGhhdC4pCisgICBBdCBhbnkgcmF0ZSwgZm5vZGVzIGNvbnRhaW4gYSBzbWFsbCB0cmVlOyBpZiBzdWJ0cmVlcyBhcmUgbmVlZGVkCisgICB0aGV5IG9jY3VweSBlc3NlbnRpYWxseSBhIGZ1bGwgYmxvY2sgaW4gYW5vZGVzLiAgQSBsZWFmLWxldmVsIHRyZWUgbm9kZQorICAgaGFzIDMtd29yZCBlbnRyaWVzIGdpdmluZyBzZWN0b3IgcnVucywgYSBub24tbGVhZiBub2RlIGhhcyAyLXdvcmQKKyAgIGVudHJpZXMgZ2l2aW5nIHN1YnRyZWUgcG9pbnRlcnMuICBBIGZsYWcgaW4gdGhlIGhlYWRlciBzYXlzIHdoaWNoLiAqLworCitzdHJ1Y3QgYnBsdXNfbGVhZl9ub2RlCit7CisgIHVuc2lnbmVkIGZpbGVfc2Vjbm87CQkJLyogZmlyc3QgZmlsZSBzZWN0b3IgaW4gZXh0ZW50ICovCisgIHVuc2lnbmVkIGxlbmd0aDsJCQkvKiBsZW5ndGgsIHNlY3RvcnMgKi8KKyAgc2Vjbm8gZGlza19zZWNubzsJCQkvKiBmaXJzdCBjb3JyZXNwb25kaW5nIGRpc2sgc2VjdG9yICovCit9OworCitzdHJ1Y3QgYnBsdXNfaW50ZXJuYWxfbm9kZQoreworICB1bnNpZ25lZCBmaWxlX3NlY25vOwkJCS8qIHN1YnRyZWUgbWFwcyBzZWN0b3JzIDwgdGhpcyAgKi8KKyAgYW5vZGVfc2Vjbm8gZG93bjsJCQkvKiBwb2ludGVyIHRvIHN1YnRyZWUgKi8KK307CisKK3N0cnVjdCBicGx1c19oZWFkZXIKK3sKKyAgdW5zaWduZWQgaGJmZjogMTsJLyogaGlnaCBiaXQgb2YgZmlyc3QgZnJlZSBlbnRyeSBvZmZzZXQgKi8KKyAgdW5zaWduZWQgZmxhZzE6IDE7CisgIHVuc2lnbmVkIGZsYWcyOiAxOworICB1bnNpZ25lZCBmbGFnMzogMTsKKyAgdW5zaWduZWQgZmxhZzQ6IDE7CisgIHVuc2lnbmVkIGZub2RlX3BhcmVudDogMTsJCS8qID8gd2UncmUgcG9pbnRlZCB0byBieSBhbiBmbm9kZSwKKwkJCQkJICAgdGhlIGRhdGEgYnRyZWUgb3Igc29tZSBlYSBvciB0aGUKKwkJCQkJICAgbWFpbiBlYSBib290YWdlIHBvaW50ZXIgZWFfc2Vjbm8gKi8KKwkJCQkJLyogYWxzbyBjYW4gZ2V0IHNldCBpbiBmbm9kZXMsIHdoaWNoCisJCQkJCSAgIG1heSBiZSBhIGNoa2RzayBnbGl0Y2ggb3IgbWF5IG1lYW4KKwkJCQkJICAgdGhpcyBiaXQgaXMgaXJyZWxldmFudCBpbiBmbm9kZXMsCisJCQkJCSAgIG9yIHRoaXMgaW50ZXJwcmV0YXRpb24gaXMgYWxsIHdldCAqLworICB1bnNpZ25lZCBiaW5hcnlfc2VhcmNoOiAxOwkJLyogc3VnZ2VzdCBiaW5hcnkgc2VhcmNoICh1bnVzZWQpICovCisgIHVuc2lnbmVkIGludGVybmFsOiAxOwkJCS8qIDEgLT4gKGludGVybmFsKSB0cmVlIG9mIGFub2RlcworCQkJCQkgICAwIC0+IChsZWFmKSBsaXN0IG9mIGV4dGVudHMgKi8KKyAgdW5zaWduZWQgY2hhciBmaWxsWzNdOworICB1bnNpZ25lZCBjaGFyIG5fZnJlZV9ub2RlczsJCS8qIGZyZWUgbm9kZXMgaW4gZm9sbG93aW5nIGFycmF5ICovCisgIHVuc2lnbmVkIGNoYXIgbl91c2VkX25vZGVzOwkJLyogdXNlZCBub2RlcyBpbiBmb2xsb3dpbmcgYXJyYXkgKi8KKyAgdW5zaWduZWQgc2hvcnQgZmlyc3RfZnJlZTsJCS8qIG9mZnNldCBmcm9tIHN0YXJ0IG9mIGhlYWRlciB0bworCQkJCQkgICBmaXJzdCBmcmVlIG5vZGUgaW4gYXJyYXkgKi8KKyAgdW5pb24geworICAgIHN0cnVjdCBicGx1c19pbnRlcm5hbF9ub2RlIGludGVybmFsWzBdOyAvKiAoaW50ZXJuYWwpIDItd29yZCBlbnRyaWVzIGdpdmluZworCQkJCQkgICAgICAgc3VidHJlZSBwb2ludGVycyAqLworICAgIHN0cnVjdCBicGx1c19sZWFmX25vZGUgZXh0ZXJuYWxbMF07CSAgICAvKiAoZXh0ZXJuYWwpIDMtd29yZCBlbnRyaWVzIGdpdmluZworCQkJCQkgICAgICAgc2VjdG9yIHJ1bnMgKi8KKyAgfSB1OworfTsKKworLyogZm5vZGU6IHJvb3Qgb2YgYWxsb2NhdGlvbiBiKyB0cmVlLCBhbmQgRUEncyAqLworCisvKiBFdmVyeSBmaWxlIGFuZCBldmVyeSBkaXJlY3RvcnkgaGFzIG9uZSBmbm9kZSwgcG9pbnRlZCB0byBieSB0aGUgZGlyZWN0b3J5CisgICBlbnRyeSBhbmQgcG9pbnRpbmcgdG8gdGhlIGZpbGUncyBzZWN0b3JzIG9yIGRpcmVjdG9yeSdzIHJvb3QgZG5vZGUuICBFQSdzCisgICBhcmUgYWxzbyBzdG9yZWQgaGVyZSwgYW5kIHRoZXJlIGFyZSBzYWlkIHRvIGJlIEFDTCdzIHNvbWV3aGVyZSBoZXJlIHRvby4gKi8KKworI2RlZmluZSBGTk9ERV9NQUdJQyAweGY3ZTQwYWFlCisKK3N0cnVjdCBmbm9kZQoreworICB1bnNpZ25lZCBtYWdpYzsJCQkvKiBmN2U0IDBhYWUgKi8KKyAgdW5zaWduZWQgemVybzFbMl07CQkJLyogcmVhZCBoaXN0b3J5ICovCisgIHVuc2lnbmVkIGNoYXIgbGVuLCBuYW1lWzE1XTsJCS8qIHRydWUgbGVuZ3RoLCB0cnVuY2F0ZWQgbmFtZSAqLworICBmbm9kZV9zZWNubyB1cDsJCQkvKiBwb2ludGVyIHRvIGZpbGUncyBkaXJlY3RvcnkgZm5vZGUgKi8KKyAgLyp1bnNpZ25lZCB6ZXJvMlszXTsqLworICBzZWNubyBhY2xfc2l6ZV9sOworICBzZWNubyBhY2xfc2Vjbm87CisgIHVuc2lnbmVkIHNob3J0IGFjbF9zaXplX3M7CisgIGNoYXIgYWNsX2Fub2RlOworICBjaGFyIHplcm8yOwkJCQkvKiBoaXN0b3J5IGJpdCBjb3VudCAqLworICB1bnNpZ25lZCBlYV9zaXplX2w7CQkJLyogbGVuZ3RoIG9mIGRpc2stcmVzaWRlbnQgZWEncyAqLworICBzZWNubyBlYV9zZWNubzsJCQkvKiBmaXJzdCBzZWN0b3Igb2YgZGlzay1yZXNpZGVudCBlYSdzKi8KKyAgdW5zaWduZWQgc2hvcnQgZWFfc2l6ZV9zOwkJLyogbGVuZ3RoIG9mIGZub2RlLXJlc2lkZW50IGVhJ3MgKi8KKworICB1bnNpZ25lZCBmbGFnMDogMTsKKyAgdW5zaWduZWQgZWFfYW5vZGU6IDE7CQkJLyogMSAtPiBlYV9zZWNubyBpcyBhbiBhbm9kZSAqLworICB1bnNpZ25lZCBmbGFnMjogMTsKKyAgdW5zaWduZWQgZmxhZzM6IDE7CisgIHVuc2lnbmVkIGZsYWc0OiAxOworICB1bnNpZ25lZCBmbGFnNTogMTsKKyAgdW5zaWduZWQgZmxhZzY6IDE7CisgIHVuc2lnbmVkIGZsYWc3OiAxOworICB1bnNpZ25lZCBkaXJmbGFnOiAxOwkJCS8qIDEgLT4gZGlyZWN0b3J5LiAgZmlyc3QgJiBvbmx5IGV4dGVudAorCQkJCQkgICBwb2ludHMgdG8gZG5vZGUuICovCisgIHVuc2lnbmVkIGZsYWc5OiAxOworICB1bnNpZ25lZCBmbGFnMTA6IDE7CisgIHVuc2lnbmVkIGZsYWcxMTogMTsKKyAgdW5zaWduZWQgZmxhZzEyOiAxOworICB1bnNpZ25lZCBmbGFnMTM6IDE7CisgIHVuc2lnbmVkIGZsYWcxNDogMTsKKyAgdW5zaWduZWQgZmxhZzE1OiAxOworCisgIHN0cnVjdCBicGx1c19oZWFkZXIgYnRyZWU7CQkvKiBiKyB0cmVlLCA4IGV4dGVudHMgb3IgMTIgc3VidHJlZXMgKi8KKyAgdW5pb24geworICAgIHN0cnVjdCBicGx1c19sZWFmX25vZGUgZXh0ZXJuYWxbOF07CisgICAgc3RydWN0IGJwbHVzX2ludGVybmFsX25vZGUgaW50ZXJuYWxbMTJdOworICB9IHU7CisKKyAgdW5zaWduZWQgZmlsZV9zaXplOwkJCS8qIGZpbGUgbGVuZ3RoLCBieXRlcyAqLworICB1bnNpZ25lZCBuX25lZWRlYTsJCQkvKiBudW1iZXIgb2YgRUEncyB3aXRoIE5FRURFQSBzZXQgKi8KKyAgY2hhciB1c2VyX2lkWzE2XTsJCQkvKiB1bnVzZWQgKi8KKyAgdW5zaWduZWQgc2hvcnQgZWFfb2ZmczsJCS8qIG9mZnNldCBmcm9tIHN0YXJ0IG9mIGZub2RlCisJCQkJCSAgIHRvIGZpcnN0IGZub2RlLXJlc2lkZW50IGVhICovCisgIGNoYXIgZGFzZF9saW1pdF90cmVzaGhvbGQ7CisgIGNoYXIgZGFzZF9saW1pdF9kZWx0YTsKKyAgdW5zaWduZWQgZGFzZF9saW1pdDsKKyAgdW5zaWduZWQgZGFzZF91c2FnZTsKKyAgLyp1bnNpZ25lZCB6ZXJvNVsyXTsqLworICB1bnNpZ25lZCBjaGFyIGVhWzMxNl07CQkvKiB6ZXJvIG9yIG1vcmUgRUEncywgcGFja2VkIHRvZ2V0aGVyCisJCQkJCSAgIHdpdGggbm8gYWxpZ25tZW50IHBhZGRpbmcuCisJCQkJCSAgIChEbyBub3QgdXNlIHRoaXMgbmFtZSwgZ2V0IGhlcmUKKwkJCQkJICAgdmlhIGZub2RlICsgZWFfb2Zmcy4gSSB0aGluay4pICovCit9OworCisKKy8qIGFub2RlOiA5OS40NCUgcHVyZSBhbGxvY2F0aW9uIHRyZWUgKi8KKworI2RlZmluZSBBTk9ERV9NQUdJQyAweDM3ZTQwYWFlCisKK3N0cnVjdCBhbm9kZQoreworICB1bnNpZ25lZCBtYWdpYzsJCQkvKiAzN2U0IDBhYWUgKi8KKyAgYW5vZGVfc2Vjbm8gc2VsZjsJCQkvKiBwb2ludGVyIHRvIHRoaXMgYW5vZGUgKi8KKyAgc2Vjbm8gdXA7CQkJCS8qIHBhcmVudCBhbm9kZSBvciBmbm9kZSAqLworCisgIHN0cnVjdCBicGx1c19oZWFkZXIgYnRyZWU7CQkvKiBiK3RyZWUsIDQwIGV4dGVudHMgb3IgNjAgc3VidHJlZXMgKi8KKyAgdW5pb24geworICAgIHN0cnVjdCBicGx1c19sZWFmX25vZGUgZXh0ZXJuYWxbNDBdOworICAgIHN0cnVjdCBicGx1c19pbnRlcm5hbF9ub2RlIGludGVybmFsWzYwXTsKKyAgfSB1OworCisgIHVuc2lnbmVkIGZpbGxbM107CQkJLyogdW51c2VkICovCit9OworCisKKy8qIGV4dGVuZGVkIGF0dHJpYnV0ZXMuCisKKyAgIEEgZmlsZSdzIEVBIGluZm8gaXMgc3RvcmVkIGFzIGEgbGlzdCBvZiAobmFtZSx2YWx1ZSkgcGFpcnMuICBJdCBpcworICAgdXN1YWxseSBpbiB0aGUgZm5vZGUsIGJ1dCAoaWYgaXQncyBsYXJnZSkgaXQgaXMgbW92ZWQgdG8gYSBzaW5nbGUKKyAgIHNlY3RvciBydW4gb3V0c2lkZSB0aGUgZm5vZGUsIG9yIHRvIG11bHRpcGxlIHJ1bnMgd2l0aCBhbiBhbm9kZSB0cmVlCisgICB0aGF0IHBvaW50cyB0byB0aGVtLgorCisgICBUaGUgdmFsdWUgb2YgYSBzaW5nbGUgRUEgaXMgc3RvcmVkIGFsb25nIHdpdGggdGhlIG5hbWUsIG9yIChpZiBsYXJnZSkKKyAgIGl0IGlzIG1vdmVkIHRvIGEgc2luZ2xlIHNlY3RvciBydW4sIG9yIG11bHRpcGxlIHJ1bnMgcG9pbnRlZCB0byBieSBhbgorICAgYW5vZGUgdHJlZSwgcG9pbnRlZCB0byBieSB0aGUgdmFsdWUgZmllbGQgb2YgdGhlIChuYW1lLHZhbHVlKSBwYWlyLgorCisgICBGbGFncyBpbiB0aGUgRUEgdGVsbCB3aGV0aGVyIHRoZSB2YWx1ZSBpcyBpbW1lZGlhdGUsIGluIGEgc2luZ2xlIHNlY3RvcgorICAgcnVuLCBvciBpbiBtdWx0aXBsZSBydW5zLiAgRmxhZ3MgaW4gdGhlIGZub2RlIHRlbGwgd2hldGhlciB0aGUgRUEgbGlzdAorICAgaXMgaW1tZWRpYXRlLCBpbiBhIHNpbmdsZSBydW4sIG9yIGluIG11bHRpcGxlIHJ1bnMuICovCisKK3N0cnVjdCBleHRlbmRlZF9hdHRyaWJ1dGUKK3sKKyAgdW5zaWduZWQgaW5kaXJlY3Q6IDE7CQkJLyogMSAtPiB2YWx1ZSBnaXZlcyBzZWN0b3IgbnVtYmVyCisJCQkJCSAgIHdoZXJlIHJlYWwgdmFsdWUgc3RhcnRzICovCisgIHVuc2lnbmVkIGFub2RlOiAxOwkJCS8qIDEgLT4gc2VjdG9yIGlzIGFuIGFub2RlCisJCQkJCSAgIHRoYXQgcG9pbnRzIHRvIGZyYWdtZW50ZWQgdmFsdWUgKi8KKyAgdW5zaWduZWQgZmxhZzI6IDE7CisgIHVuc2lnbmVkIGZsYWczOiAxOworICB1bnNpZ25lZCBmbGFnNDogMTsKKyAgdW5zaWduZWQgZmxhZzU6IDE7CisgIHVuc2lnbmVkIGZsYWc2OiAxOworICB1bnNpZ25lZCBuZWVkZWE6IDE7CQkJLyogcmVxdWlyZWQgZWEgKi8KKyAgdW5zaWduZWQgY2hhciBuYW1lbGVuOwkJLyogbGVuZ3RoIG9mIG5hbWUsIGJ5dGVzICovCisgIHVuc2lnbmVkIHNob3J0IHZhbHVlbGVuOwkJLyogbGVuZ3RoIG9mIHZhbHVlLCBieXRlcyAqLworICB1bnNpZ25lZCBjaGFyIG5hbWVbMF07CisgIC8qCisgICAgdW5zaWduZWQgY2hhciBuYW1lW25hbWVsZW5dOwlhc2NpaSBhdHRyaWIgbmFtZQorICAgIHVuc2lnbmVkIGNoYXIgbnVsOwkJCXRlcm1pbmF0aW5nICdcMCcsIG5vdCBjb3VudGVkCisgICAgdW5zaWduZWQgY2hhciB2YWx1ZVt2YWx1ZWxlbl07CXZhbHVlLCBhcmJpdHJhcnkKKyAgICAgIGlmIHRoaXMuaW5kaXJlY3QsIHZhbHVlbGVuIGlzIDggYW5kIHRoZSB2YWx1ZSBpcworICAgICAgICB1bnNpZ25lZCBsZW5ndGg7CQlyZWFsIGxlbmd0aCBvZiB2YWx1ZSwgYnl0ZXMKKyAgICAgICAgc2Vjbm8gc2Vjbm87CQkJc2VjdG9yIGFkZHJlc3Mgd2hlcmUgaXQgc3RhcnRzCisgICAgICBpZiB0aGlzLmFub2RlLCB0aGUgYWJvdmUgc2VjdG9yIG51bWJlciBpcyB0aGUgcm9vdCBvZiBhbiBhbm9kZSB0cmVlCisgICAgICAgIHdoaWNoIHBvaW50cyB0byB0aGUgdmFsdWUuCisgICovCit9OworCisvKgorICAgTG9jYWwgVmFyaWFibGVzOgorICAgY29tbWVudC1jb2x1bW46IDQwCisgICBFbmQ6CisqLwpkaWZmIC0tZ2l0IGEvZnMvaHBmcy9ocGZzX2ZuLmggYi9mcy9ocGZzL2hwZnNfZm4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjI4YzNiCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaHBmcy9ocGZzX2ZuLmgKQEAgLTAsMCArMSwzMzggQEAKKy8qCisgKiAgbGludXgvZnMvaHBmcy9ocGZzX2ZuLmgKKyAqCisgKiAgTWlrdWxhcyBQYXRvY2thIChtaWt1bGFzQGFydGF4Lmthcmxpbi5tZmYuY3VuaS5jeiksIDE5OTgtMTk5OQorICoKKyAqICBmdW5jdGlvbiBoZWFkZXJzCisgKi8KKworLy8jZGVmaW5lIERCRworLy8jZGVmaW5lIERFQlVHX0xPQ0tTCisKKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9ocGZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisKKyNpbmNsdWRlICJocGZzLmgiCisKKyNkZWZpbmUgRUlPRVJST1IgIEVJTworI2RlZmluZSBFRlNFUlJPUiAgRVBFUk0KKyNkZWZpbmUgRU1FTUVSUk9SIEVOT01FTQorCisjZGVmaW5lIEFOT0RFX0FMTE9DX0ZXRAk1MTIKKyNkZWZpbmUgRk5PREVfQUxMT0NfRldECTAKKyNkZWZpbmUgQUxMT0NfRldEX01JTgkxNgorI2RlZmluZSBBTExPQ19GV0RfTUFYCTEyOAorI2RlZmluZSBBTExPQ19NCQkxCisjZGVmaW5lIEZOT0RFX1JEX0FIRUFECTE2CisjZGVmaW5lIEFOT0RFX1JEX0FIRUFECTE2CisjZGVmaW5lIEROT0RFX1JEX0FIRUFECTQKKworI2RlZmluZSBGUkVFX0ROT0RFU19BREQJNTgKKyNkZWZpbmUgRlJFRV9ETk9ERVNfREVMCTI5CisKKyNkZWZpbmUgQ0hLQ09ORCh4LHkpIGlmICghKHgpKSBwcmludGsgeQorCisjaWZkZWYgREJHCisjZGVmaW5lIFBSSU5USyh4KSBwcmludGsgeAorI2Vsc2UKKyN1bmRlZiBQUklOVEsKKyNkZWZpbmUgUFJJTlRLKHgpCisjZW5kaWYKKworc3RydWN0IGhwZnNfaW5vZGVfaW5mbyB7CisJbG9mZl90IG1tdV9wcml2YXRlOworCWlub190IGlfcGFyZW50X2RpcjsJLyogKGRpcmVjdG9yaWVzKSBnaXZlcyBmbm9kZSBvZiBwYXJlbnQgZGlyICovCisJdW5zaWduZWQgaV9kbm87CQkvKiAoZGlyZWN0b3JpZXMpIHJvb3QgZG5vZGUgKi8KKwl1bnNpZ25lZCBpX2Rwb3M7CS8qIChkaXJlY3RvcmllcykgdGVtcCBmb3IgcmVhZGRpciAqLworCXVuc2lnbmVkIGlfZHN1YmRubzsJLyogKGRpcmVjdG9yaWVzKSB0ZW1wIGZvciByZWFkZGlyICovCisJdW5zaWduZWQgaV9maWxlX3NlYzsJLyogKGZpbGVzKSBtaW5pbWFsaXN0IGNhY2hlIG9mIGFsbG9jIGluZm8gKi8KKwl1bnNpZ25lZCBpX2Rpc2tfc2VjOwkvKiAoZmlsZXMpIG1pbmltYWxpc3QgY2FjaGUgb2YgYWxsb2MgaW5mbyAqLworCXVuc2lnbmVkIGlfbl9zZWNzOwkvKiAoZmlsZXMpIG1pbmltYWxpc3QgY2FjaGUgb2YgYWxsb2MgaW5mbyAqLworCXVuc2lnbmVkIGlfZWFfc2l6ZTsJLyogc2l6ZSBvZiBleHRlbmRlZCBhdHRyaWJ1dGVzICovCisJdW5zaWduZWQgaV9jb252IDogMjsJLyogKGZpbGVzKSBjcmxmLT5uZXdsaW5lIGhhY2tlcnkgKi8KKwl1bnNpZ25lZCBpX2VhX21vZGUgOiAxOwkvKiBmaWxlJ3MgcGVybWlzc2lvbiBpcyBzdG9yZWQgaW4gZWEgKi8KKwl1bnNpZ25lZCBpX2VhX3VpZCA6IDE7CS8qIGZpbGUncyB1aWQgaXMgc3RvcmVkIGluIGVhICovCisJdW5zaWduZWQgaV9lYV9naWQgOiAxOwkvKiBmaWxlJ3MgZ2lkIGlzIHN0b3JlZCBpbiBlYSAqLworCXVuc2lnbmVkIGlfZGlydHkgOiAxOworCXN0cnVjdCBzZW1hcGhvcmUgaV9zZW07CisJc3RydWN0IHNlbWFwaG9yZSBpX3BhcmVudDsKKwlsb2ZmX3QgKippX3JkZGlyX29mZjsKKwlzdHJ1Y3QgaW5vZGUgdmZzX2lub2RlOworfTsKKworc3RydWN0IGhwZnNfc2JfaW5mbyB7CisJaW5vX3Qgc2Jfcm9vdDsJCQkvKiBpbm9kZSBudW1iZXIgb2Ygcm9vdCBkaXIgKi8KKwl1bnNpZ25lZCBzYl9mc19zaXplOwkJLyogZmlsZSBzeXN0ZW0gc2l6ZSwgc2VjdG9ycyAqLworCXVuc2lnbmVkIHNiX2JpdG1hcHM7CQkvKiBzZWN0b3IgbnVtYmVyIG9mIGJpdG1hcCBsaXN0ICovCisJdW5zaWduZWQgc2JfZGlyYmFuZF9zdGFydDsJLyogZGlyZWN0b3J5IGJhbmQgc3RhcnQgc2VjdG9yICovCisJdW5zaWduZWQgc2JfZGlyYmFuZF9zaXplOwkvKiBkaXJlY3RvcnkgYmFuZCBzaXplLCBkbm9kZXMgKi8KKwl1bnNpZ25lZCBzYl9kbWFwOwkJLyogc2VjdG9yIG51bWJlciBvZiBkbm9kZSBiaXQgbWFwICovCisJdW5zaWduZWQgc2Jfbl9mcmVlOwkJLyogZnJlZSBibG9ja3MgZm9yIHN0YXRmcywgb3IgLTEgKi8KKwl1bnNpZ25lZCBzYl9uX2ZyZWVfZG5vZGVzOwkvKiBmcmVlIGRub2RlcyBmb3Igc3RhdGZzLCBvciAtMSAqLworCXVpZF90IHNiX3VpZDsJCQkvKiB1aWQgZnJvbSBtb3VudCBvcHRpb25zICovCisJZ2lkX3Qgc2JfZ2lkOwkJCS8qIGdpZCBmcm9tIG1vdW50IG9wdGlvbnMgKi8KKwl1bW9kZV90IHNiX21vZGU7CQkvKiBtb2RlIGZyb20gbW91bnQgb3B0aW9ucyAqLworCXVuc2lnbmVkIHNiX2NvbnYgOiAyOwkJLyogY3JsZi0+bmV3bGluZSBoYWNrZXJ5ICovCisJdW5zaWduZWQgc2JfZWFzIDogMjsJCS8qIGVhczogMC1pZ25vcmUsIDEtcm8sIDItcncgKi8KKwl1bnNpZ25lZCBzYl9lcnIgOiAyOwkJLyogb24gZXJyczogMC1jb250LCAxLXJvLCAyLXBhbmljICovCisJdW5zaWduZWQgc2JfY2hrIDogMjsJCS8qIGNoZWNrczogMC1ubywgMS1ub3JtYWwsIDItc3RyaWN0ICovCisJdW5zaWduZWQgc2JfbG93ZXJjYXNlIDogMTsJLyogZG93bmNhc2UgZmlsZW5hbWVzIGhhY2tlcnkgKi8KKwl1bnNpZ25lZCBzYl93YXNfZXJyb3IgOiAxOwkvKiB0aGVyZSB3YXMgYW4gZXJyb3IsIHNldCBkaXJ0eSBmbGFnICovCisJdW5zaWduZWQgc2JfY2hrZHNrIDogMjsJCS8qIGNoa2RzazogMC1ubywgMS1vbiBlcnJzLCAyLWFsbHdheXMgKi8KKwl1bnNpZ25lZCBjaGFyICpzYl9jcF90YWJsZTsJLyogY29kZSBwYWdlIHRhYmxlczogKi8KKwkJCQkJLyogCTEyOCBieXRlcyB1cHBlcmNhc2luZyB0YWJsZSAmICovCisJCQkJCS8qCTEyOCBieXRlcyBsb3dlcmNhc2luZyB0YWJsZSAqLworCXVuc2lnbmVkICpzYl9ibXBfZGlyOwkJLyogbWFpbiBiaXRtYXAgZGlyZWN0b3J5ICovCisJdW5zaWduZWQgc2JfY19iaXRtYXA7CQkvKiBjdXJyZW50IGJpdG1hcCAqLworCXVuc2lnbmVkIHNiX21heF9md2RfYWxsb2M7CS8qIG1heCBmb3J3YWQgYWxsb2NhdGlvbiAqLworCXN0cnVjdCBzZW1hcGhvcmUgaHBmc19jcmVhdGlvbl9kZTsgLyogd2hlbiBjcmVhdGluZyBkaXJlbnRzLCBub2JvZHkgZWxzZQorCQkJCQkgICBjYW4gYWxsb2MgYmxvY2tzICovCisJLyp1bnNpZ25lZCBzYl9tb3VudGluZyA6IDE7Ki8KKwlpbnQgc2JfdGltZXNoaWZ0OworfTsKKworLyoKKyAqIGNvbnY9IG9wdGlvbnMKKyAqLworCisjZGVmaW5lIENPTlZfQklOQVJZIDAJCQkvKiBubyBjb252ZXJzaW9uICovCisjZGVmaW5lIENPTlZfVEVYVCAxCQkJLyogY3JsZi0+bmV3bGluZSAqLworI2RlZmluZSBDT05WX0FVVE8gMgkJCS8qIGRlY2lkZSBiYXNlZCBvbiBmaWxlIGNvbnRlbnRzICovCisKKy8qIEZvdXIgNTEyLWJ5dGUgYnVmZmVycyBhbmQgdGhlIDJrIGJsb2NrIG9idGFpbmVkIGJ5IGNvbmNhdGVuYXRpbmcgdGhlbSAqLworCitzdHJ1Y3QgcXVhZF9idWZmZXJfaGVhZCB7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaFs0XTsKKwl2b2lkICpkYXRhOworfTsKKworLyogVGhlIGItdHJlZSBkb3duIHBvaW50ZXIgZnJvbSBhIGRpciBlbnRyeSAqLworCitzdGF0aWMgaW5saW5lIGRub2RlX3NlY25vIGRlX2Rvd25fcG9pbnRlciAoc3RydWN0IGhwZnNfZGlyZW50ICpkZSkKK3sKKyAgQ0hLQ09ORChkZS0+ZG93biwoIkhQRlM6IGRlX2Rvd25fcG9pbnRlcjogIWRlLT5kb3duXG4iKSk7CisgIHJldHVybiAqKGRub2RlX3NlY25vICopICgodm9pZCAqKSBkZSArIGRlLT5sZW5ndGggLSA0KTsKK30KKworLyogVGhlIGZpcnN0IGRpciBlbnRyeSBpbiBhIGRub2RlICovCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGhwZnNfZGlyZW50ICpkbm9kZV9maXJzdF9kZSAoc3RydWN0IGRub2RlICpkbm9kZSkKK3sKKyAgcmV0dXJuICh2b2lkICopIGRub2RlLT5kaXJlbnQ7Cit9CisKKy8qIFRoZSBlbmQrMSBvZiB0aGUgZGlyIGVudHJpZXMgKi8KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaHBmc19kaXJlbnQgKmRub2RlX2VuZF9kZSAoc3RydWN0IGRub2RlICpkbm9kZSkKK3sKKyAgQ0hLQ09ORChkbm9kZS0+Zmlyc3RfZnJlZT49MHgxNCAmJiBkbm9kZS0+Zmlyc3RfZnJlZTw9MHhhMDAsKCJIUEZTOiBkbm9kZV9lbmRfZGU6IGRub2RlLT5maXJzdF9mcmVlID0gJWRcbiIsKGludClkbm9kZS0+Zmlyc3RfZnJlZSkpOworICByZXR1cm4gKHZvaWQgKikgZG5vZGUgKyBkbm9kZS0+Zmlyc3RfZnJlZTsKK30KKworLyogVGhlIGRpciBlbnRyeSBhZnRlciBkaXIgZW50cnkgZGUgKi8KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaHBmc19kaXJlbnQgKmRlX25leHRfZGUgKHN0cnVjdCBocGZzX2RpcmVudCAqZGUpCit7CisgIENIS0NPTkQoZGUtPmxlbmd0aD49MHgyMCAmJiBkZS0+bGVuZ3RoPDB4ODAwLCgiSFBGUzogZGVfbmV4dF9kZTogZGUtPmxlbmd0aCA9ICVkXG4iLChpbnQpZGUtPmxlbmd0aCkpOworICByZXR1cm4gKHZvaWQgKikgZGUgKyBkZS0+bGVuZ3RoOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBleHRlbmRlZF9hdHRyaWJ1dGUgKmZub2RlX2VhKHN0cnVjdCBmbm9kZSAqZm5vZGUpCit7CisJcmV0dXJuIChzdHJ1Y3QgZXh0ZW5kZWRfYXR0cmlidXRlICopKChjaGFyICopZm5vZGUgKyBmbm9kZS0+ZWFfb2ZmcyArIGZub2RlLT5hY2xfc2l6ZV9zKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZXh0ZW5kZWRfYXR0cmlidXRlICpmbm9kZV9lbmRfZWEoc3RydWN0IGZub2RlICpmbm9kZSkKK3sKKwlyZXR1cm4gKHN0cnVjdCBleHRlbmRlZF9hdHRyaWJ1dGUgKikoKGNoYXIgKilmbm9kZSArIGZub2RlLT5lYV9vZmZzICsgZm5vZGUtPmFjbF9zaXplX3MgKyBmbm9kZS0+ZWFfc2l6ZV9zKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZXh0ZW5kZWRfYXR0cmlidXRlICpuZXh0X2VhKHN0cnVjdCBleHRlbmRlZF9hdHRyaWJ1dGUgKmVhKQoreworCXJldHVybiAoc3RydWN0IGV4dGVuZGVkX2F0dHJpYnV0ZSAqKSgoY2hhciAqKWVhICsgNSArIGVhLT5uYW1lbGVuICsgZWEtPnZhbHVlbGVuKTsKK30KKworc3RhdGljIGlubGluZSBzZWNubyBlYV9zZWMoc3RydWN0IGV4dGVuZGVkX2F0dHJpYnV0ZSAqZWEpCit7CisJcmV0dXJuICooc2Vjbm8gKikoKGNoYXIgKillYSArIDkgKyBlYS0+bmFtZWxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc2Vjbm8gZWFfbGVuKHN0cnVjdCBleHRlbmRlZF9hdHRyaWJ1dGUgKmVhKQoreworCXJldHVybiAqKHNlY25vICopKChjaGFyICopZWEgKyA1ICsgZWEtPm5hbWVsZW4pOworfQorCitzdGF0aWMgaW5saW5lIGNoYXIgKmVhX2RhdGEoc3RydWN0IGV4dGVuZGVkX2F0dHJpYnV0ZSAqZWEpCit7CisJcmV0dXJuIChjaGFyICopKChjaGFyICopZWEgKyA1ICsgZWEtPm5hbWVsZW4pOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGRlX3NpemUoaW50IG5hbWVsZW4sIHNlY25vIGRvd25fcHRyKQoreworCXJldHVybiAoKDB4MWYgKyBuYW1lbGVuICsgMykgJiB+MykgKyAoZG93bl9wdHIgPyA0IDogMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X2RlKHN0cnVjdCBocGZzX2RpcmVudCAqZHN0LCBzdHJ1Y3QgaHBmc19kaXJlbnQgKnNyYykKK3sKKwlpbnQgYTsKKwlpbnQgbjsKKwlpZiAoIWRzdCB8fCAhc3JjKSByZXR1cm47CisJYSA9IGRzdC0+ZG93bjsKKwluID0gZHN0LT5ub3RfOHgzOworCW1lbWNweSgoY2hhciAqKWRzdCArIDIsIChjaGFyICopc3JjICsgMiwgMjgpOworCWRzdC0+ZG93biA9IGE7CisJZHN0LT5ub3RfOHgzID0gbjsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCB0c3RiaXRzKHVuc2lnbmVkICpibXAsIHVuc2lnbmVkIGIsIHVuc2lnbmVkIG4pCit7CisJaW50IGk7CisJaWYgKChiID49IDB4NDAwMCkgfHwgKGIgKyBuIC0gMSA+PSAweDQwMDApKSByZXR1cm4gbjsKKwlpZiAoISgoYm1wWyhiICYgMHgzZmZmKSA+PiA1XSA+PiAoYiAmIDB4MWYpKSAmIDEpKSByZXR1cm4gMTsKKwlmb3IgKGkgPSAxOyBpIDwgbjsgaSsrKQorCQlpZiAoLypiK2kgPCAweDQwMDAgJiYqLyAhKChibXBbKChiK2kpICYgMHgzZmZmKSA+PiA1XSA+PiAoKGIraSkgJiAweDFmKSkgJiAxKSkKKwkJCXJldHVybiBpICsgMTsKKwlyZXR1cm4gMDsKK30KKworLyogYWxsb2MuYyAqLworCitpbnQgaHBmc19jaGtfc2VjdG9ycyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc2Vjbm8sIGludCwgY2hhciAqKTsKK3NlY25vIGhwZnNfYWxsb2Nfc2VjdG9yKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzZWNubywgdW5zaWduZWQsIGludCwgaW50KTsKK2ludCBocGZzX2FsbG9jX2lmX3Bvc3NpYmxlKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzZWNubyk7Cit2b2lkIGhwZnNfZnJlZV9zZWN0b3JzKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzZWNubywgdW5zaWduZWQpOworaW50IGhwZnNfY2hlY2tfZnJlZV9kbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCk7Cit2b2lkIGhwZnNfZnJlZV9kbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc2Vjbm8pOworc3RydWN0IGRub2RlICpocGZzX2FsbG9jX2Rub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzZWNubywgZG5vZGVfc2Vjbm8gKiwgc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgKiwgaW50KTsKK3N0cnVjdCBmbm9kZSAqaHBmc19hbGxvY19mbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc2Vjbm8sIGZub2RlX3NlY25vICosIHN0cnVjdCBidWZmZXJfaGVhZCAqKik7CitzdHJ1Y3QgYW5vZGUgKmhwZnNfYWxsb2NfYW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICosIHNlY25vLCBhbm9kZV9zZWNubyAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiopOworCisvKiBhbm9kZS5jICovCisKK3NlY25vIGhwZnNfYnBsdXNfbG9va3VwKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGJwbHVzX2hlYWRlciAqLCB1bnNpZ25lZCwgc3RydWN0IGJ1ZmZlcl9oZWFkICopOworc2Vjbm8gaHBmc19hZGRfc2VjdG9yX3RvX2J0cmVlKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzZWNubywgaW50LCB1bnNpZ25lZCk7Cit2b2lkIGhwZnNfcmVtb3ZlX2J0cmVlKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgYnBsdXNfaGVhZGVyICopOworaW50IGhwZnNfZWFfcmVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc2Vjbm8sIGludCwgdW5zaWduZWQsIHVuc2lnbmVkLCBjaGFyICopOworaW50IGhwZnNfZWFfd3JpdGUoc3RydWN0IHN1cGVyX2Jsb2NrICosIHNlY25vLCBpbnQsIHVuc2lnbmVkLCB1bnNpZ25lZCwgY2hhciAqKTsKK3ZvaWQgaHBmc19lYV9yZW1vdmUoc3RydWN0IHN1cGVyX2Jsb2NrICosIHNlY25vLCBpbnQsIHVuc2lnbmVkKTsKK3ZvaWQgaHBmc190cnVuY2F0ZV9idHJlZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc2Vjbm8sIGludCwgdW5zaWduZWQpOwordm9pZCBocGZzX3JlbW92ZV9mbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgZm5vZGVfc2Vjbm8gZm5vKTsKKworLyogYnVmZmVyLmMgKi8KKwordm9pZCBocGZzX2xvY2tfY3JlYXRpb24oc3RydWN0IHN1cGVyX2Jsb2NrICopOwordm9pZCBocGZzX3VubG9ja19jcmVhdGlvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7Cit2b2lkICpocGZzX21hcF9zZWN0b3Ioc3RydWN0IHN1cGVyX2Jsb2NrICosIHVuc2lnbmVkLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiosIGludCk7Cit2b2lkICpocGZzX2dldF9zZWN0b3Ioc3RydWN0IHN1cGVyX2Jsb2NrICosIHVuc2lnbmVkLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiopOwordm9pZCAqaHBmc19tYXBfNHNlY3RvcnMoc3RydWN0IHN1cGVyX2Jsb2NrICosIHVuc2lnbmVkLCBzdHJ1Y3QgcXVhZF9idWZmZXJfaGVhZCAqLCBpbnQpOwordm9pZCAqaHBmc19nZXRfNHNlY3RvcnMoc3RydWN0IHN1cGVyX2Jsb2NrICosIHVuc2lnbmVkLCBzdHJ1Y3QgcXVhZF9idWZmZXJfaGVhZCAqKTsKK3ZvaWQgaHBmc19icmVsc2U0KHN0cnVjdCBxdWFkX2J1ZmZlcl9oZWFkICopOwordm9pZCBocGZzX21hcmtfNGJ1ZmZlcnNfZGlydHkoc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgKik7CisKKy8qIGRlbnRyeS5jICovCisKK3ZvaWQgaHBmc19zZXRfZGVudHJ5X29wZXJhdGlvbnMoc3RydWN0IGRlbnRyeSAqKTsKKworLyogZGlyLmMgKi8KKworc3RydWN0IGRlbnRyeSAqaHBmc19sb29rdXAoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IG5hbWVpZGF0YSAqKTsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGhwZnNfZGlyX29wczsKKworLyogZG5vZGUuYyAqLworCit2b2lkIGhwZnNfYWRkX3BvcyhzdHJ1Y3QgaW5vZGUgKiwgbG9mZl90ICopOwordm9pZCBocGZzX2RlbF9wb3Moc3RydWN0IGlub2RlICosIGxvZmZfdCAqKTsKK3N0cnVjdCBocGZzX2RpcmVudCAqaHBmc19hZGRfZGUoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBkbm9kZSAqLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkLCBzZWNubyk7CitpbnQgaHBmc19hZGRfZGlyZW50KHN0cnVjdCBpbm9kZSAqLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkLCBzdHJ1Y3QgaHBmc19kaXJlbnQgKiwgaW50KTsKK2ludCBocGZzX3JlbW92ZV9kaXJlbnQoc3RydWN0IGlub2RlICosIGRub2RlX3NlY25vLCBzdHJ1Y3QgaHBmc19kaXJlbnQgKiwgc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgKiwgaW50KTsKK3ZvaWQgaHBmc19jb3VudF9kbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICosIGRub2RlX3NlY25vLCBpbnQgKiwgaW50ICosIGludCAqKTsKK2Rub2RlX3NlY25vIGhwZnNfZGVfYXNfZG93bl9hc19wb3NzaWJsZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgZG5vZGVfc2Vjbm8gZG5vKTsKK3N0cnVjdCBocGZzX2RpcmVudCAqbWFwX3Bvc19kaXJlbnQoc3RydWN0IGlub2RlICosIGxvZmZfdCAqLCBzdHJ1Y3QgcXVhZF9idWZmZXJfaGVhZCAqKTsKK3N0cnVjdCBocGZzX2RpcmVudCAqbWFwX2RpcmVudChzdHJ1Y3QgaW5vZGUgKiwgZG5vZGVfc2Vjbm8sIGNoYXIgKiwgdW5zaWduZWQsIGRub2RlX3NlY25vICosIHN0cnVjdCBxdWFkX2J1ZmZlcl9oZWFkICopOwordm9pZCBocGZzX3JlbW92ZV9kdHJlZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgZG5vZGVfc2Vjbm8pOworc3RydWN0IGhwZnNfZGlyZW50ICptYXBfZm5vZGVfZGlyZW50KHN0cnVjdCBzdXBlcl9ibG9jayAqLCBmbm9kZV9zZWNubywgc3RydWN0IGZub2RlICosIHN0cnVjdCBxdWFkX2J1ZmZlcl9oZWFkICopOworCisvKiBlYS5jICovCisKK3ZvaWQgaHBmc19lYV9leHRfcmVtb3ZlKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzZWNubywgaW50LCB1bnNpZ25lZCk7CitpbnQgaHBmc19yZWFkX2VhKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgZm5vZGUgKiwgY2hhciAqLCBjaGFyICosIGludCk7CitjaGFyICpocGZzX2dldF9lYShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGZub2RlICosIGNoYXIgKiwgaW50ICopOwordm9pZCBocGZzX3NldF9lYShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZub2RlICosIGNoYXIgKiwgY2hhciAqLCBpbnQpOworCisvKiBmaWxlLmMgKi8KKworaW50IGhwZnNfZmlsZV9mc3luYyhzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCk7CitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBocGZzX2ZpbGVfb3BzOworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGhwZnNfZmlsZV9pb3BzOworZXh0ZXJuIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgaHBmc19hb3BzOworCisvKiBpbm9kZS5jICovCisKK3ZvaWQgaHBmc19pbml0X2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKK3ZvaWQgaHBmc19yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKK3ZvaWQgaHBmc193cml0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7Cit2b2lkIGhwZnNfd3JpdGVfaW5vZGVfbm9sb2NrKHN0cnVjdCBpbm9kZSAqKTsKK2ludCBocGZzX25vdGlmeV9jaGFuZ2Uoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgaWF0dHIgKik7Cit2b2lkIGhwZnNfd3JpdGVfaWZfY2hhbmdlZChzdHJ1Y3QgaW5vZGUgKik7Cit2b2lkIGhwZnNfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKKworLyogbWFwLmMgKi8KKwordW5zaWduZWQgKmhwZnNfbWFwX2Rub2RlX2JpdG1hcChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgKik7Cit1bnNpZ25lZCAqaHBmc19tYXBfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1bnNpZ25lZCwgc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgKiwgY2hhciAqKTsKK2NoYXIgKmhwZnNfbG9hZF9jb2RlX3BhZ2Uoc3RydWN0IHN1cGVyX2Jsb2NrICosIHNlY25vKTsKK3NlY25vICpocGZzX2xvYWRfYml0bWFwX2RpcmVjdG9yeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc2Vjbm8gYm1wKTsKK3N0cnVjdCBmbm9kZSAqaHBmc19tYXBfZm5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBpbm9fdCwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqKTsKK3N0cnVjdCBhbm9kZSAqaHBmc19tYXBfYW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBhbm9kZV9zZWNubywgc3RydWN0IGJ1ZmZlcl9oZWFkICoqKTsKK3N0cnVjdCBkbm9kZSAqaHBmc19tYXBfZG5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBkbm9kZV9zZWNubywgc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgKik7Citkbm9kZV9zZWNubyBocGZzX2Zub2RlX2RubyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGlub190IGlubyk7CisKKy8qIG5hbWUuYyAqLworCit1bnNpZ25lZCBjaGFyIGhwZnNfdXBjYXNlKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgY2hhcik7CitpbnQgaHBmc19jaGtfbmFtZSh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkICopOworY2hhciAqaHBmc190cmFuc2xhdGVfbmFtZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCwgaW50LCBpbnQpOworaW50IGhwZnNfY29tcGFyZV9uYW1lcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCwgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCwgaW50KTsKK2ludCBocGZzX2lzX25hbWVfbG9uZyh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkKTsKK3ZvaWQgaHBmc19hZGp1c3RfbGVuZ3RoKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgKik7Cit2b2lkIGhwZnNfZGVjaWRlX2NvbnYoc3RydWN0IGlub2RlICosIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQpOworCisvKiBuYW1laS5jICovCisKK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBocGZzX2Rpcl9pb3BzOworZXh0ZXJuIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgaHBmc19zeW1saW5rX2FvcHM7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGhwZnNfaW5vZGVfaW5mbyAqaHBmc19pKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIGxpc3RfZW50cnkoaW5vZGUsIHN0cnVjdCBocGZzX2lub2RlX2luZm8sIHZmc19pbm9kZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGhwZnNfc2JfaW5mbyAqaHBmc19zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXJldHVybiBzYi0+c19mc19pbmZvOworfQorCisvKiBzdXBlci5jICovCisKK3ZvaWQgaHBmc19lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY2hhciAqLCAuLi4pOworaW50IGhwZnNfc3RvcF9jeWNsZXMoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCwgaW50ICosIGludCAqLCBjaGFyICopOwordW5zaWduZWQgaHBmc19jb3VudF9vbmVfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzZWNubyk7CisKKy8qCisgKiBsb2NhbCB0aW1lIChIUEZTKSB0byBHTVQgKFVuaXgpCisgKi8KKworc3RhdGljIGlubGluZSB0aW1lX3QgbG9jYWxfdG9fZ210KHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdGltZTMyX3QgdCkKK3sKKwlleHRlcm4gc3RydWN0IHRpbWV6b25lIHN5c190ejsKKwlyZXR1cm4gdCArIHN5c190ei50el9taW51dGVzd2VzdCAqIDYwICsgaHBmc19zYihzKS0+c2JfdGltZXNoaWZ0OworfQorCitzdGF0aWMgaW5saW5lIHRpbWUzMl90IGdtdF90b19sb2NhbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHRpbWVfdCB0KQoreworCWV4dGVybiBzdHJ1Y3QgdGltZXpvbmUgc3lzX3R6OworCXJldHVybiB0IC0gc3lzX3R6LnR6X21pbnV0ZXN3ZXN0ICogNjAgLSBocGZzX3NiKHMpLT5zYl90aW1lc2hpZnQ7Cit9CmRpZmYgLS1naXQgYS9mcy9ocGZzL2lub2RlLmMgYi9mcy9ocGZzL2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhiMTc0MQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hwZnMvaW5vZGUuYwpAQCAtMCwwICsxLDI5MSBAQAorLyoKKyAqICBsaW51eC9mcy9ocGZzL2lub2RlLmMKKyAqCisgKiAgTWlrdWxhcyBQYXRvY2thIChtaWt1bGFzQGFydGF4Lmthcmxpbi5tZmYuY3VuaS5jeiksIDE5OTgtMTk5OQorICoKKyAqICBpbm9kZSBWRlMgZnVuY3Rpb25zCisgKi8KKworI2luY2x1ZGUgImhwZnNfZm4uaCIKKwordm9pZCBocGZzX2luaXRfaW5vZGUoc3RydWN0IGlub2RlICppKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpLT5pX3NiOworCXN0cnVjdCBocGZzX2lub2RlX2luZm8gKmhwZnNfaW5vZGUgPSBocGZzX2koaSk7CisKKwlpLT5pX3VpZCA9IGhwZnNfc2Ioc2IpLT5zYl91aWQ7CisJaS0+aV9naWQgPSBocGZzX3NiKHNiKS0+c2JfZ2lkOworCWktPmlfbW9kZSA9IGhwZnNfc2Ioc2IpLT5zYl9tb2RlOworCWhwZnNfaW5vZGUtPmlfY29udiA9IGhwZnNfc2Ioc2IpLT5zYl9jb252OworCWktPmlfYmxrc2l6ZSA9IDUxMjsKKwlpLT5pX3NpemUgPSAtMTsKKwlpLT5pX2Jsb2NrcyA9IC0xOworCQorCWhwZnNfaW5vZGUtPmlfZG5vID0gMDsKKwlocGZzX2lub2RlLT5pX25fc2VjcyA9IDA7CisJaHBmc19pbm9kZS0+aV9maWxlX3NlYyA9IDA7CisJaHBmc19pbm9kZS0+aV9kaXNrX3NlYyA9IDA7CisJaHBmc19pbm9kZS0+aV9kcG9zID0gMDsKKwlocGZzX2lub2RlLT5pX2RzdWJkbm8gPSAwOworCWhwZnNfaW5vZGUtPmlfZWFfbW9kZSA9IDA7CisJaHBmc19pbm9kZS0+aV9lYV91aWQgPSAwOworCWhwZnNfaW5vZGUtPmlfZWFfZ2lkID0gMDsKKwlocGZzX2lub2RlLT5pX2VhX3NpemUgPSAwOworCisJaHBmc19pbm9kZS0+aV9yZGRpcl9vZmYgPSBOVUxMOworCWhwZnNfaW5vZGUtPmlfZGlydHkgPSAwOworCisJaS0+aV9jdGltZS50dl9zZWMgPSBpLT5pX2N0aW1lLnR2X25zZWMgPSAwOworCWktPmlfbXRpbWUudHZfc2VjID0gaS0+aV9tdGltZS50dl9uc2VjID0gMDsKKwlpLT5pX2F0aW1lLnR2X3NlYyA9IGktPmlfYXRpbWUudHZfbnNlYyA9IDA7Cit9CisKK3ZvaWQgaHBmc19yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqaSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBmbm9kZSAqZm5vZGU7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGktPmlfc2I7CisJc3RydWN0IGhwZnNfaW5vZGVfaW5mbyAqaHBmc19pbm9kZSA9IGhwZnNfaShpKTsKKwl1bnNpZ25lZCBjaGFyICplYTsKKwlpbnQgZWFfc2l6ZTsKKworCWlmICghKGZub2RlID0gaHBmc19tYXBfZm5vZGUoc2IsIGktPmlfaW5vLCAmYmgpKSkgeworCQkvKmktPmlfbW9kZSB8PSBTX0lGUkVHOworCQlpLT5pX21vZGUgJj0gfjAxMTE7CisJCWktPmlfb3AgPSAmaHBmc19maWxlX2lvcHM7CisJCWktPmlfZm9wID0gJmhwZnNfZmlsZV9vcHM7CisJCWktPmlfbmxpbmsgPSAwOyovCisJCW1ha2VfYmFkX2lub2RlKGkpOworCQlyZXR1cm47CisJfQorCWlmIChocGZzX3NiKGktPmlfc2IpLT5zYl9lYXMpIHsKKwkJaWYgKChlYSA9IGhwZnNfZ2V0X2VhKGktPmlfc2IsIGZub2RlLCAiVUlEIiwgJmVhX3NpemUpKSkgeworCQkJaWYgKGVhX3NpemUgPT0gMikgeworCQkJCWktPmlfdWlkID0gbGUxNl90b19jcHUoKih1MTYqKWVhKTsKKwkJCQlocGZzX2lub2RlLT5pX2VhX3VpZCA9IDE7CisJCQl9CisJCQlrZnJlZShlYSk7CisJCX0KKwkJaWYgKChlYSA9IGhwZnNfZ2V0X2VhKGktPmlfc2IsIGZub2RlLCAiR0lEIiwgJmVhX3NpemUpKSkgeworCQkJaWYgKGVhX3NpemUgPT0gMikgeworCQkJCWktPmlfZ2lkID0gbGUxNl90b19jcHUoKih1MTYqKWVhKTsKKwkJCQlocGZzX2lub2RlLT5pX2VhX2dpZCA9IDE7CisJCQl9CisJCQlrZnJlZShlYSk7CisJCX0KKwkJaWYgKChlYSA9IGhwZnNfZ2V0X2VhKGktPmlfc2IsIGZub2RlLCAiU1lNTElOSyIsICZlYV9zaXplKSkpIHsKKwkJCWtmcmVlKGVhKTsKKwkJCWktPmlfbW9kZSA9IFNfSUZMTksgfCAwNzc3OworCQkJaS0+aV9vcCA9ICZwYWdlX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWktPmlfZGF0YS5hX29wcyA9ICZocGZzX3N5bWxpbmtfYW9wczsKKwkJCWktPmlfbmxpbmsgPSAxOworCQkJaS0+aV9zaXplID0gZWFfc2l6ZTsKKwkJCWktPmlfYmxvY2tzID0gMTsKKwkJCWJyZWxzZShiaCk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKChlYSA9IGhwZnNfZ2V0X2VhKGktPmlfc2IsIGZub2RlLCAiTU9ERSIsICZlYV9zaXplKSkpIHsKKwkJCWludCByZGV2ID0gMDsKKwkJCXVtb2RlX3QgbW9kZSA9IGhwZnNfc2Ioc2IpLT5zYl9tb2RlOworCQkJaWYgKGVhX3NpemUgPT0gMikgeworCQkJCW1vZGUgPSBsZTE2X3RvX2NwdSgqKHUxNiopZWEpOworCQkJCWhwZnNfaW5vZGUtPmlfZWFfbW9kZSA9IDE7CisJCQl9CisJCQlrZnJlZShlYSk7CisJCQlpLT5pX21vZGUgPSBtb2RlOworCQkJaWYgKFNfSVNCTEsobW9kZSkgfHwgU19JU0NIUihtb2RlKSkgeworCQkJCWlmICgoZWEgPSBocGZzX2dldF9lYShpLT5pX3NiLCBmbm9kZSwgIkRFViIsICZlYV9zaXplKSkpIHsKKwkJCQkJaWYgKGVhX3NpemUgPT0gNCkKKwkJCQkJCXJkZXYgPSBsZTMyX3RvX2NwdSgqKHUzMiopZWEpOworCQkJCQlrZnJlZShlYSk7CisJCQkJfQorCQkJfQorCQkJaWYgKFNfSVNCTEsobW9kZSkgfHwgU19JU0NIUihtb2RlKSB8fCBTX0lTRklGTyhtb2RlKSB8fCBTX0lTU09DSyhtb2RlKSkgeworCQkJCWJyZWxzZShiaCk7CisJCQkJaS0+aV9ubGluayA9IDE7CisJCQkJaS0+aV9zaXplID0gMDsKKwkJCQlpLT5pX2Jsb2NrcyA9IDE7CisJCQkJaW5pdF9zcGVjaWFsX2lub2RlKGksIG1vZGUsCisJCQkJCW5ld19kZWNvZGVfZGV2KHJkZXYpKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9CisJaWYgKGZub2RlLT5kaXJmbGFnKSB7CisJCXVuc2lnbmVkIG5fZG5vZGVzLCBuX3N1YmRpcnM7CisJCWktPmlfbW9kZSB8PSBTX0lGRElSOworCQlpLT5pX29wID0gJmhwZnNfZGlyX2lvcHM7CisJCWktPmlfZm9wID0gJmhwZnNfZGlyX29wczsKKwkJaHBmc19pbm9kZS0+aV9wYXJlbnRfZGlyID0gZm5vZGUtPnVwOworCQlocGZzX2lub2RlLT5pX2RubyA9IGZub2RlLT51LmV4dGVybmFsWzBdLmRpc2tfc2Vjbm87CisJCWlmIChocGZzX3NiKHNiKS0+c2JfY2hrID49IDIpIHsKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgwOworCQkJaWYgKGhwZnNfbWFwX2Zub2RlKHNiLCBocGZzX2lub2RlLT5pX3BhcmVudF9kaXIsICZiaDApKSBicmVsc2UoYmgwKTsKKwkJfQorCQluX2Rub2RlcyA9IDA7IG5fc3ViZGlycyA9IDA7CisJCWhwZnNfY291bnRfZG5vZGVzKGktPmlfc2IsIGhwZnNfaW5vZGUtPmlfZG5vLCAmbl9kbm9kZXMsICZuX3N1YmRpcnMsIE5VTEwpOworCQlpLT5pX2Jsb2NrcyA9IDQgKiBuX2Rub2RlczsKKwkJaS0+aV9zaXplID0gMjA0OCAqIG5fZG5vZGVzOworCQlpLT5pX25saW5rID0gMiArIG5fc3ViZGlyczsKKwl9IGVsc2UgeworCQlpLT5pX21vZGUgfD0gU19JRlJFRzsKKwkJaWYgKCFocGZzX2lub2RlLT5pX2VhX21vZGUpIGktPmlfbW9kZSAmPSB+MDExMTsKKwkJaS0+aV9vcCA9ICZocGZzX2ZpbGVfaW9wczsKKwkJaS0+aV9mb3AgPSAmaHBmc19maWxlX29wczsKKwkJaS0+aV9ubGluayA9IDE7CisJCWktPmlfc2l6ZSA9IGZub2RlLT5maWxlX3NpemU7CisJCWktPmlfYmxvY2tzID0gKChpLT5pX3NpemUgKyA1MTEpID4+IDkpICsgMTsKKwkJaS0+aV9kYXRhLmFfb3BzID0gJmhwZnNfYW9wczsKKwkJaHBmc19pKGkpLT5tbXVfcHJpdmF0ZSA9IGktPmlfc2l6ZTsKKwl9CisJYnJlbHNlKGJoKTsKK30KKworc3RhdGljIHZvaWQgaHBmc193cml0ZV9pbm9kZV9lYShzdHJ1Y3QgaW5vZGUgKmksIHN0cnVjdCBmbm9kZSAqZm5vZGUpCit7CisJc3RydWN0IGhwZnNfaW5vZGVfaW5mbyAqaHBmc19pbm9kZSA9IGhwZnNfaShpKTsKKwkvKmlmIChmbm9kZS0+YWNsX3NpemVfbCB8fCBmbm9kZS0+YWNsX3NpemVfcykgeworCQkgICBTb21lIHVua25vd24gc3RydWN0dXJlcyBsaWtlIEFDTCBtYXkgYmUgaW4gZm5vZGUsCisJCSAgIHdlJ2QgYmV0dGVyIG5vdCBvdmVyd3JpdGUgdGhlbQorCQlocGZzX2Vycm9yKGktPmlfc2IsICJmbm9kZSAlMDh4IGhhcyBzb21lIHVua25vd24gSFBGUzM4NiBzdHVjdHVyZXMiLCBpLT5pX2lubyk7CisJfSBlbHNlKi8gaWYgKGhwZnNfc2IoaS0+aV9zYiktPnNiX2VhcyA+PSAyKSB7CisJCXUzMiBlYTsKKwkJaWYgKChpLT5pX3VpZCAhPSBocGZzX3NiKGktPmlfc2IpLT5zYl91aWQpIHx8IGhwZnNfaW5vZGUtPmlfZWFfdWlkKSB7CisJCQllYSA9IGNwdV90b19sZTMyKGktPmlfdWlkKTsKKwkJCWhwZnNfc2V0X2VhKGksIGZub2RlLCAiVUlEIiwgKGNoYXIqKSZlYSwgMik7CisJCQlocGZzX2lub2RlLT5pX2VhX3VpZCA9IDE7CisJCX0KKwkJaWYgKChpLT5pX2dpZCAhPSBocGZzX3NiKGktPmlfc2IpLT5zYl9naWQpIHx8IGhwZnNfaW5vZGUtPmlfZWFfZ2lkKSB7CisJCQllYSA9IGNwdV90b19sZTMyKGktPmlfZ2lkKTsKKwkJCWhwZnNfc2V0X2VhKGksIGZub2RlLCAiR0lEIiwgKGNoYXIgKikmZWEsIDIpOworCQkJaHBmc19pbm9kZS0+aV9lYV9naWQgPSAxOworCQl9CisJCWlmICghU19JU0xOSyhpLT5pX21vZGUpKQorCQkJaWYgKChpLT5pX21vZGUgIT0gKChocGZzX3NiKGktPmlfc2IpLT5zYl9tb2RlICYgfihTX0lTRElSKGktPmlfbW9kZSkgPyAwIDogMDExMSkpCisJCQkgIHwgKFNfSVNESVIoaS0+aV9tb2RlKSA/IFNfSUZESVIgOiBTX0lGUkVHKSkKKwkJCSAgJiYgaS0+aV9tb2RlICE9ICgoaHBmc19zYihpLT5pX3NiKS0+c2JfbW9kZSAmIH4oU19JU0RJUihpLT5pX21vZGUpID8gMDIyMiA6IDAzMzMpKQorCQkJICB8IChTX0lTRElSKGktPmlfbW9kZSkgPyBTX0lGRElSIDogU19JRlJFRykpKSB8fCBocGZzX2lub2RlLT5pX2VhX21vZGUpIHsKKwkJCQllYSA9IGNwdV90b19sZTMyKGktPmlfbW9kZSk7CisJCQkJaHBmc19zZXRfZWEoaSwgZm5vZGUsICJNT0RFIiwgKGNoYXIgKikmZWEsIDIpOworCQkJCWhwZnNfaW5vZGUtPmlfZWFfbW9kZSA9IDE7CisJCQl9CisJCWlmIChTX0lTQkxLKGktPmlfbW9kZSkgfHwgU19JU0NIUihpLT5pX21vZGUpKSB7CisJCQllYSA9IGNwdV90b19sZTMyKG5ld19lbmNvZGVfZGV2KGktPmlfcmRldikpOworCQkJaHBmc19zZXRfZWEoaSwgZm5vZGUsICJERVYiLCAoY2hhciAqKSZlYSwgNCk7CisJCX0KKwl9Cit9CisKK3ZvaWQgaHBmc193cml0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmkpCit7CisJc3RydWN0IGhwZnNfaW5vZGVfaW5mbyAqaHBmc19pbm9kZSA9IGhwZnNfaShpKTsKKwlzdHJ1Y3QgaW5vZGUgKnBhcmVudDsKKwlpZiAoaS0+aV9pbm8gPT0gaHBmc19zYihpLT5pX3NiKS0+c2Jfcm9vdCkgcmV0dXJuOworCWlmIChocGZzX2lub2RlLT5pX3JkZGlyX29mZiAmJiAhYXRvbWljX3JlYWQoJmktPmlfY291bnQpKSB7CisJCWlmICgqaHBmc19pbm9kZS0+aV9yZGRpcl9vZmYpIHByaW50aygiSFBGUzogd3JpdGVfaW5vZGU6IHNvbWUgcG9zaXRpb24gc3RpbGwgdGhlcmVcbiIpOworCQlrZnJlZShocGZzX2lub2RlLT5pX3JkZGlyX29mZik7CisJCWhwZnNfaW5vZGUtPmlfcmRkaXJfb2ZmID0gTlVMTDsKKwl9CisJZG93bigmaHBmc19pbm9kZS0+aV9wYXJlbnQpOworCWlmICghaS0+aV9ubGluaykgeworCQl1cCgmaHBmc19pbm9kZS0+aV9wYXJlbnQpOworCQlyZXR1cm47CisJfQorCXBhcmVudCA9IGlnZXRfbG9ja2VkKGktPmlfc2IsIGhwZnNfaW5vZGUtPmlfcGFyZW50X2Rpcik7CisJaWYgKHBhcmVudCkgeworCQlocGZzX2lub2RlLT5pX2RpcnR5ID0gMDsKKwkJaWYgKHBhcmVudC0+aV9zdGF0ZSAmIElfTkVXKSB7CisJCQlocGZzX2luaXRfaW5vZGUocGFyZW50KTsKKwkJCWhwZnNfcmVhZF9pbm9kZShwYXJlbnQpOworCQkJdW5sb2NrX25ld19pbm9kZShwYXJlbnQpOworCQl9CisJCWRvd24oJmhwZnNfaW5vZGUtPmlfc2VtKTsKKwkJaHBmc193cml0ZV9pbm9kZV9ub2xvY2soaSk7CisJCXVwKCZocGZzX2lub2RlLT5pX3NlbSk7CisJCWlwdXQocGFyZW50KTsKKwl9IGVsc2UgeworCQltYXJrX2lub2RlX2RpcnR5KGkpOworCX0KKwl1cCgmaHBmc19pbm9kZS0+aV9wYXJlbnQpOworfQorCit2b2lkIGhwZnNfd3JpdGVfaW5vZGVfbm9sb2NrKHN0cnVjdCBpbm9kZSAqaSkKK3sKKwlzdHJ1Y3QgaHBmc19pbm9kZV9pbmZvICpocGZzX2lub2RlID0gaHBmc19pKGkpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGZub2RlICpmbm9kZTsKKwlzdHJ1Y3QgcXVhZF9idWZmZXJfaGVhZCBxYmg7CisJc3RydWN0IGhwZnNfZGlyZW50ICpkZTsKKwlpZiAoaS0+aV9pbm8gPT0gaHBmc19zYihpLT5pX3NiKS0+c2Jfcm9vdCkgcmV0dXJuOworCWlmICghKGZub2RlID0gaHBmc19tYXBfZm5vZGUoaS0+aV9zYiwgaS0+aV9pbm8sICZiaCkpKSByZXR1cm47CisJaWYgKGktPmlfaW5vICE9IGhwZnNfc2IoaS0+aV9zYiktPnNiX3Jvb3QgJiYgaS0+aV9ubGluaykgeworCQlpZiAoIShkZSA9IG1hcF9mbm9kZV9kaXJlbnQoaS0+aV9zYiwgaS0+aV9pbm8sIGZub2RlLCAmcWJoKSkpIHsKKwkJCWJyZWxzZShiaCk7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgZGUgPSBOVUxMOworCWlmIChTX0lTUkVHKGktPmlfbW9kZSkpIHsKKwkJZm5vZGUtPmZpbGVfc2l6ZSA9IGktPmlfc2l6ZTsKKwkJaWYgKGRlKSBkZS0+ZmlsZV9zaXplID0gaS0+aV9zaXplOworCX0gZWxzZSBpZiAoU19JU0RJUihpLT5pX21vZGUpKSB7CisJCWZub2RlLT5maWxlX3NpemUgPSAwOworCQlpZiAoZGUpIGRlLT5maWxlX3NpemUgPSAwOworCX0KKwlocGZzX3dyaXRlX2lub2RlX2VhKGksIGZub2RlKTsKKwlpZiAoZGUpIHsKKwkJZGUtPndyaXRlX2RhdGUgPSBnbXRfdG9fbG9jYWwoaS0+aV9zYiwgaS0+aV9tdGltZS50dl9zZWMpOworCQlkZS0+cmVhZF9kYXRlID0gZ210X3RvX2xvY2FsKGktPmlfc2IsIGktPmlfYXRpbWUudHZfc2VjKTsKKwkJZGUtPmNyZWF0aW9uX2RhdGUgPSBnbXRfdG9fbG9jYWwoaS0+aV9zYiwgaS0+aV9jdGltZS50dl9zZWMpOworCQlkZS0+cmVhZF9vbmx5ID0gIShpLT5pX21vZGUgJiAwMjIyKTsKKwkJZGUtPmVhX3NpemUgPSBocGZzX2lub2RlLT5pX2VhX3NpemU7CisJCWhwZnNfbWFya180YnVmZmVyc19kaXJ0eSgmcWJoKTsKKwkJaHBmc19icmVsc2U0KCZxYmgpOworCX0KKwlpZiAoU19JU0RJUihpLT5pX21vZGUpKSB7CisJCWlmICgoZGUgPSBtYXBfZGlyZW50KGksIGhwZnNfaW5vZGUtPmlfZG5vLCAiXDAwMVwwMDEiLCAyLCBOVUxMLCAmcWJoKSkpIHsKKwkJCWRlLT53cml0ZV9kYXRlID0gZ210X3RvX2xvY2FsKGktPmlfc2IsIGktPmlfbXRpbWUudHZfc2VjKTsKKwkJCWRlLT5yZWFkX2RhdGUgPSBnbXRfdG9fbG9jYWwoaS0+aV9zYiwgaS0+aV9hdGltZS50dl9zZWMpOworCQkJZGUtPmNyZWF0aW9uX2RhdGUgPSBnbXRfdG9fbG9jYWwoaS0+aV9zYiwgaS0+aV9jdGltZS50dl9zZWMpOworCQkJZGUtPnJlYWRfb25seSA9ICEoaS0+aV9tb2RlICYgMDIyMik7CisJCQlkZS0+ZWFfc2l6ZSA9IC8qaHBmc19pbm9kZS0+aV9lYV9zaXplKi8wOworCQkJZGUtPmZpbGVfc2l6ZSA9IDA7CisJCQlocGZzX21hcmtfNGJ1ZmZlcnNfZGlydHkoJnFiaCk7CisJCQlocGZzX2JyZWxzZTQoJnFiaCk7CisJCX0gZWxzZSBocGZzX2Vycm9yKGktPmlfc2IsICJkaXJlY3RvcnkgJTA4eCBkb2Vzbid0IGhhdmUgJy4nIGVudHJ5IiwgaS0+aV9pbm8pOworCX0KKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJYnJlbHNlKGJoKTsKK30KKworaW50IGhwZnNfbm90aWZ5X2NoYW5nZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqYXR0cikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludCBlcnJvcj0wOworCWxvY2tfa2VybmVsKCk7CisJaWYgKCAoKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9TSVpFKSAmJiBhdHRyLT5pYV9zaXplID4gaW5vZGUtPmlfc2l6ZSkgfHwKKwkgICAgIChocGZzX3NiKGlub2RlLT5pX3NiKS0+c2Jfcm9vdCA9PSBpbm9kZS0+aV9pbm8pICkgeworCQllcnJvciA9IC1FSU5WQUw7CisJfSBlbHNlIGlmICgoZXJyb3IgPSBpbm9kZV9jaGFuZ2Vfb2soaW5vZGUsIGF0dHIpKSkgeworCX0gZWxzZSBpZiAoKGVycm9yID0gaW5vZGVfc2V0YXR0cihpbm9kZSwgYXR0cikpKSB7CisJfSBlbHNlIHsKKwkJaHBmc193cml0ZV9pbm9kZShpbm9kZSk7CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3ZvaWQgaHBmc193cml0ZV9pZl9jaGFuZ2VkKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGhwZnNfaW5vZGVfaW5mbyAqaHBmc19pbm9kZSA9IGhwZnNfaShpbm9kZSk7CisKKwlpZiAoaHBmc19pbm9kZS0+aV9kaXJ0eSkKKwkJaHBmc193cml0ZV9pbm9kZShpbm9kZSk7Cit9CisKK3ZvaWQgaHBmc19kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlsb2NrX2tlcm5lbCgpOworCWhwZnNfcmVtb3ZlX2Zub2RlKGlub2RlLT5pX3NiLCBpbm9kZS0+aV9pbm8pOworCXVubG9ja19rZXJuZWwoKTsKKwljbGVhcl9pbm9kZShpbm9kZSk7Cit9CmRpZmYgLS1naXQgYS9mcy9ocGZzL21hcC5jIGIvZnMvaHBmcy9tYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmVjZGFjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaHBmcy9tYXAuYwpAQCAtMCwwICsxLDI3NSBAQAorLyoKKyAqICBsaW51eC9mcy9ocGZzL21hcC5jCisgKgorICogIE1pa3VsYXMgUGF0b2NrYSAobWlrdWxhc0BhcnRheC5rYXJsaW4ubWZmLmN1bmkuY3opLCAxOTk4LTE5OTkKKyAqCisgKiAgbWFwcGluZyBzdHJ1Y3R1cmVzIHRvIG1lbW9yeSB3aXRoIHNvbWUgbWluaW1hbCBjaGVja3MKKyAqLworCisjaW5jbHVkZSAiaHBmc19mbi5oIgorCit1bnNpZ25lZCAqaHBmc19tYXBfZG5vZGVfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgKnFiaCkKK3sKKwlyZXR1cm4gaHBmc19tYXBfNHNlY3RvcnMocywgaHBmc19zYihzKS0+c2JfZG1hcCwgcWJoLCAwKTsKK30KKwordW5zaWduZWQgaW50ICpocGZzX21hcF9iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB1bnNpZ25lZCBibXBfYmxvY2ssCisJCQkgc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgKnFiaCwgY2hhciAqaWQpCit7CisJc2Vjbm8gc2VjOworCWlmIChocGZzX3NiKHMpLT5zYl9jaGspIGlmIChibXBfYmxvY2sgKiAxNjM4NCA+IGhwZnNfc2IocyktPnNiX2ZzX3NpemUpIHsKKwkJaHBmc19lcnJvcihzLCAiaHBmc19tYXBfYml0bWFwIGNhbGxlZCB3aXRoIGJhZCBwYXJhbWV0ZXI6ICUwOHggYXQgJXMiLCBibXBfYmxvY2ssIGlkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXNlYyA9IGhwZnNfc2IocyktPnNiX2JtcF9kaXJbYm1wX2Jsb2NrXTsKKwlpZiAoIXNlYyB8fCBzZWMgPiBocGZzX3NiKHMpLT5zYl9mc19zaXplLTQpIHsKKwkJaHBmc19lcnJvcihzLCAiaW52YWxpZCBiaXRtYXAgYmxvY2sgcG9pbnRlciAlMDh4IC0+ICUwOHggYXQgJXMiLCBibXBfYmxvY2ssIHNlYywgaWQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGhwZnNfbWFwXzRzZWN0b3JzKHMsIHNlYywgcWJoLCA0KTsKK30KKworLyoKKyAqIExvYWQgZmlyc3QgY29kZSBwYWdlIGludG8ga2VybmVsIG1lbW9yeSwgcmV0dXJuIHBvaW50ZXIgdG8gMjU2LWJ5dGUgYXJyYXksCisgKiBmaXJzdCAxMjggYnl0ZXMgYXJlIHVwcGVyY2FzaW5nIHRhYmxlIGZvciBjaGFycyAxMjgtMjU1LCBuZXh0IDEyOCBieXRlcyBhcmUKKyAqIGxvd2VyY2FzaW5nIHRhYmxlCisgKi8KKworY2hhciAqaHBmc19sb2FkX2NvZGVfcGFnZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHNlY25vIGNwcykKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXNlY25vIGNwZHM7CisJdW5zaWduZWQgY3BpOworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKwl1bnNpZ25lZCBjaGFyICpjcF90YWJsZTsKKwlpbnQgaTsKKwlzdHJ1Y3QgY29kZV9wYWdlX2RhdGEgKmNwZDsKKwlzdHJ1Y3QgY29kZV9wYWdlX2RpcmVjdG9yeSAqY3AgPSBocGZzX21hcF9zZWN0b3IocywgY3BzLCAmYmgsIDApOworCWlmICghY3ApIHJldHVybiBOVUxMOworCWlmIChjcC0+bWFnaWMgIT0gQ1BfRElSX01BR0lDKSB7CisJCXByaW50aygiSFBGUzogQ29kZSBwYWdlIGRpcmVjdG9yeSBtYWdpYyBkb2Vzbid0IG1hdGNoIChtYWdpYyA9ICUwOHgpXG4iLCBjcC0+bWFnaWMpOworCQlicmVsc2UoYmgpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKCFjcC0+bl9jb2RlX3BhZ2VzKSB7CisJCXByaW50aygiSFBGUzogbl9jb2RlX3BhZ2VzID09IDBcbiIpOworCQlicmVsc2UoYmgpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJY3BkcyA9IGNwLT5hcnJheVswXS5jb2RlX3BhZ2VfZGF0YTsKKwljcGkgPSBjcC0+YXJyYXlbMF0uaW5kZXg7CisJYnJlbHNlKGJoKTsKKworCWlmIChjcGkgPj0gMykgeworCQlwcmludGsoIkhQRlM6IENvZGUgcGFnZSBpbmRleCBvdXQgb2YgYXJyYXlcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJCisJaWYgKCEoY3BkID0gaHBmc19tYXBfc2VjdG9yKHMsIGNwZHMsICZiaCwgMCkpKSByZXR1cm4gTlVMTDsKKwlpZiAoKHVuc2lnbmVkKWNwZC0+b2Zmc1tjcGldID4gMHgxNzgpIHsKKwkJcHJpbnRrKCJIUEZTOiBDb2RlIHBhZ2UgaW5kZXggb3V0IG9mIHNlY3RvclxuIik7CisJCWJyZWxzZShiaCk7CisJCXJldHVybiBOVUxMOworCX0KKwlwdHIgPSAoY2hhciAqKWNwZCArIGNwZC0+b2Zmc1tjcGldICsgNjsKKwlpZiAoIShjcF90YWJsZSA9IGttYWxsb2MoMjU2LCBHRlBfS0VSTkVMKSkpIHsKKwkJcHJpbnRrKCJIUEZTOiBvdXQgb2YgbWVtb3J5IGZvciBjb2RlIHBhZ2UgdGFibGVcbiIpOworCQlicmVsc2UoYmgpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtY3B5KGNwX3RhYmxlLCBwdHIsIDEyOCk7CisJYnJlbHNlKGJoKTsKKworCS8qIFRyeSB0byBidWlsZCBsb3dlcmNhc2luZyB0YWJsZSBmcm9tIHVwcGVyY2FzaW5nIG9uZSAqLworCisJZm9yIChpPTEyODsgaTwyNTY7IGkrKykgY3BfdGFibGVbaV09aTsKKwlmb3IgKGk9MTI4OyBpPDI1NjsgaSsrKSBpZiAoY3BfdGFibGVbaS0xMjhdIT1pICYmIGNwX3RhYmxlW2ktMTI4XT49MTI4KQorCQljcF90YWJsZVtjcF90YWJsZVtpLTEyOF1dID0gaTsKKwkKKwlyZXR1cm4gY3BfdGFibGU7Cit9CisKK3NlY25vICpocGZzX2xvYWRfYml0bWFwX2RpcmVjdG9yeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHNlY25vIGJtcCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWludCBuID0gKGhwZnNfc2IocyktPnNiX2ZzX3NpemUgKyAweDIwMDAwMCAtIDEpID4+IDIxOworCWludCBpOworCXNlY25vICpiOworCWlmICghKGIgPSBrbWFsbG9jKG4gKiA1MTIsIEdGUF9LRVJORUwpKSkgeworCQlwcmludGsoIkhQRlM6IGNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgYml0bWFwIGRpcmVjdG9yeVxuIik7CisJCXJldHVybiBOVUxMOworCX0JCisJZm9yIChpPTA7aTxuO2krKykgeworCQlzZWNubyAqZCA9IGhwZnNfbWFwX3NlY3RvcihzLCBibXAraSwgJmJoLCBuIC0gaSAtIDEpOworCQlpZiAoIWQpIHsKKwkJCWtmcmVlKGIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJbWVtY3B5KChjaGFyICopYiArIDUxMiAqIGksIGQsIDUxMik7CisJCWJyZWxzZShiaCk7CisJfQorCXJldHVybiBiOworfQorCisvKgorICogTG9hZCBmbm9kZSB0byBtZW1vcnkKKyAqLworCitzdHJ1Y3QgZm5vZGUgKmhwZnNfbWFwX2Zub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgaW5vX3QgaW5vLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaHApCit7CisJc3RydWN0IGZub2RlICpmbm9kZTsKKwlpZiAoaHBmc19zYihzKS0+c2JfY2hrKSBpZiAoaHBmc19jaGtfc2VjdG9ycyhzLCBpbm8sIDEsICJmbm9kZSIpKSB7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoKGZub2RlID0gaHBmc19tYXBfc2VjdG9yKHMsIGlubywgYmhwLCBGTk9ERV9SRF9BSEVBRCkpKSB7CisJCWlmIChocGZzX3NiKHMpLT5zYl9jaGspIHsKKwkJCXN0cnVjdCBleHRlbmRlZF9hdHRyaWJ1dGUgKmVhOworCQkJc3RydWN0IGV4dGVuZGVkX2F0dHJpYnV0ZSAqZWFfZW5kOworCQkJaWYgKGZub2RlLT5tYWdpYyAhPSBGTk9ERV9NQUdJQykgeworCQkJCWhwZnNfZXJyb3IocywgImJhZCBtYWdpYyBvbiBmbm9kZSAlMDh4IiwgaW5vKTsKKwkJCQlnb3RvIGJhaWw7CisJCQl9CisJCQlpZiAoIWZub2RlLT5kaXJmbGFnKSB7CisJCQkJaWYgKCh1bnNpZ25lZClmbm9kZS0+YnRyZWUubl91c2VkX25vZGVzICsgKHVuc2lnbmVkKWZub2RlLT5idHJlZS5uX2ZyZWVfbm9kZXMgIT0KKwkJCQkgICAgKGZub2RlLT5idHJlZS5pbnRlcm5hbCA/IDEyIDogOCkpIHsKKwkJCQkJaHBmc19lcnJvcihzLCAiYmFkIG51bWJlciBvZiBub2RlcyBpbiBmbm9kZSAlMDh4IiwgaW5vKTsKKwkJCQkJZ290byBiYWlsOworCQkJCX0KKwkJCQlpZiAoZm5vZGUtPmJ0cmVlLmZpcnN0X2ZyZWUgIT0KKwkJCQkgICAgOCArIGZub2RlLT5idHJlZS5uX3VzZWRfbm9kZXMgKiAoZm5vZGUtPmJ0cmVlLmludGVybmFsID8gOCA6IDEyKSkgeworCQkJCQlocGZzX2Vycm9yKHMsICJiYWQgZmlyc3RfZnJlZSBwb2ludGVyIGluIGZub2RlICUwOHgiLCBpbm8pOworCQkJCQlnb3RvIGJhaWw7CisJCQkJfQorCQkJfQorCQkJaWYgKGZub2RlLT5lYV9zaXplX3MgJiYgKChzaWduZWQgaW50KWZub2RlLT5lYV9vZmZzIDwgMHhjNCB8fAorCQkJICAgKHNpZ25lZCBpbnQpZm5vZGUtPmVhX29mZnMgKyBmbm9kZS0+YWNsX3NpemVfcyArIGZub2RlLT5lYV9zaXplX3MgPiAweDIwMCkpIHsKKwkJCQlocGZzX2Vycm9yKHMsICJiYWQgRUEgaW5mbyBpbiBmbm9kZSAlMDh4OiBlYV9vZmZzID09ICUwNHggZWFfc2l6ZV9zID09ICUwNHgiLAorCQkJCQlpbm8sIGZub2RlLT5lYV9vZmZzLCBmbm9kZS0+ZWFfc2l6ZV9zKTsKKwkJCQlnb3RvIGJhaWw7CisJCQl9CisJCQllYSA9IGZub2RlX2VhKGZub2RlKTsKKwkJCWVhX2VuZCA9IGZub2RlX2VuZF9lYShmbm9kZSk7CisJCQl3aGlsZSAoZWEgIT0gZWFfZW5kKSB7CisJCQkJaWYgKGVhID4gZWFfZW5kKSB7CisJCQkJCWhwZnNfZXJyb3IocywgImJhZCBFQSBpbiBmbm9kZSAlMDh4IiwgaW5vKTsKKwkJCQkJZ290byBiYWlsOworCQkJCX0KKwkJCQllYSA9IG5leHRfZWEoZWEpOworCQkJfQorCQl9CisJfQorCXJldHVybiBmbm9kZTsKKwliYWlsOgorCWJyZWxzZSgqYmhwKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGFub2RlICpocGZzX21hcF9hbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGFub2RlX3NlY25vIGFubywgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhwKQoreworCXN0cnVjdCBhbm9kZSAqYW5vZGU7CisJaWYgKGhwZnNfc2IocyktPnNiX2NoaykgaWYgKGhwZnNfY2hrX3NlY3RvcnMocywgYW5vLCAxLCAiYW5vZGUiKSkgcmV0dXJuIE5VTEw7CisJaWYgKChhbm9kZSA9IGhwZnNfbWFwX3NlY3RvcihzLCBhbm8sIGJocCwgQU5PREVfUkRfQUhFQUQpKSkKKwkJaWYgKGhwZnNfc2IocyktPnNiX2NoaykgeworCQkJaWYgKGFub2RlLT5tYWdpYyAhPSBBTk9ERV9NQUdJQyB8fCBhbm9kZS0+c2VsZiAhPSBhbm8pIHsKKwkJCQlocGZzX2Vycm9yKHMsICJiYWQgbWFnaWMgb24gYW5vZGUgJTA4eCIsIGFubyk7CisJCQkJZ290byBiYWlsOworCQkJfQorCQkJaWYgKCh1bnNpZ25lZClhbm9kZS0+YnRyZWUubl91c2VkX25vZGVzICsgKHVuc2lnbmVkKWFub2RlLT5idHJlZS5uX2ZyZWVfbm9kZXMgIT0KKwkJCSAgICAoYW5vZGUtPmJ0cmVlLmludGVybmFsID8gNjAgOiA0MCkpIHsKKwkJCQlocGZzX2Vycm9yKHMsICJiYWQgbnVtYmVyIG9mIG5vZGVzIGluIGFub2RlICUwOHgiLCBhbm8pOworCQkJCWdvdG8gYmFpbDsKKwkJCX0KKwkJCWlmIChhbm9kZS0+YnRyZWUuZmlyc3RfZnJlZSAhPQorCQkJICAgIDggKyBhbm9kZS0+YnRyZWUubl91c2VkX25vZGVzICogKGFub2RlLT5idHJlZS5pbnRlcm5hbCA/IDggOiAxMikpIHsKKwkJCQlocGZzX2Vycm9yKHMsICJiYWQgZmlyc3RfZnJlZSBwb2ludGVyIGluIGFub2RlICUwOHgiLCBhbm8pOworCQkJCWdvdG8gYmFpbDsKKwkJCX0KKwkJfQorCXJldHVybiBhbm9kZTsKKwliYWlsOgorCWJyZWxzZSgqYmhwKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIExvYWQgZG5vZGUgdG8gbWVtb3J5IGFuZCBkbyBzb21lIGNoZWNrcworICovCisKK3N0cnVjdCBkbm9kZSAqaHBmc19tYXBfZG5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB1bnNpZ25lZCBzZWNubywKKwkJCSAgICAgc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgKnFiaCkKK3sKKwlzdHJ1Y3QgZG5vZGUgKmRub2RlOworCWlmIChocGZzX3NiKHMpLT5zYl9jaGspIHsKKwkJaWYgKGhwZnNfY2hrX3NlY3RvcnMocywgc2Vjbm8sIDQsICJkbm9kZSIpKSByZXR1cm4gTlVMTDsKKwkJaWYgKHNlY25vICYgMykgeworCQkJaHBmc19lcnJvcihzLCAiZG5vZGUgJTA4eCBub3QgYnl0ZS1hbGlnbmVkIiwgc2Vjbm8pOworCQkJcmV0dXJuIE5VTEw7CisJCX0JCisJfQorCWlmICgoZG5vZGUgPSBocGZzX21hcF80c2VjdG9ycyhzLCBzZWNubywgcWJoLCBETk9ERV9SRF9BSEVBRCkpKQorCQlpZiAoaHBmc19zYihzKS0+c2JfY2hrKSB7CisJCQl1bnNpZ25lZCBwLCBwcCA9IDA7CisJCQl1bnNpZ25lZCBjaGFyICpkID0gKGNoYXIgKilkbm9kZTsKKwkJCWludCBiID0gMDsKKwkJCWlmIChkbm9kZS0+bWFnaWMgIT0gRE5PREVfTUFHSUMpIHsKKwkJCQlocGZzX2Vycm9yKHMsICJiYWQgbWFnaWMgb24gZG5vZGUgJTA4eCIsIHNlY25vKTsKKwkJCQlnb3RvIGJhaWw7CisJCQl9CisJCQlpZiAoZG5vZGUtPnNlbGYgIT0gc2Vjbm8pCisJCQkJaHBmc19lcnJvcihzLCAiYmFkIHNlbGYgcG9pbnRlciBvbiBkbm9kZSAlMDh4IHNlbGYgPSAlMDh4Iiwgc2Vjbm8sIGRub2RlLT5zZWxmKTsKKwkJCS8qIENoZWNrIGRpcmVudHMgLSBiYWQgZGlyZW50cyB3b3VsZCBjYXVzZSBpbmZpbml0ZQorCQkJICAgbG9vcHMgb3Igc2hvb3RpbmcgdG8gbWVtb3J5ICovCisJCQlpZiAoZG5vZGUtPmZpcnN0X2ZyZWUgPiAyMDQ4LyogfHwgZG5vZGUtPmZpcnN0X2ZyZWUgPCA4NCovKSB7CisJCQkJaHBmc19lcnJvcihzLCAiZG5vZGUgJTA4eCBoYXMgZmlyc3RfZnJlZSA9PSAlMDh4Iiwgc2Vjbm8sIGRub2RlLT5maXJzdF9mcmVlKTsKKwkJCQlnb3RvIGJhaWw7CisJCQl9CisJCQlmb3IgKHAgPSAyMDsgcCA8IGRub2RlLT5maXJzdF9mcmVlOyBwICs9IGRbcF0gKyAoZFtwKzFdIDw8IDgpKSB7CisJCQkJc3RydWN0IGhwZnNfZGlyZW50ICpkZSA9IChzdHJ1Y3QgaHBmc19kaXJlbnQgKikoKGNoYXIgKilkbm9kZSArIHApOworCQkJCWlmIChkZS0+bGVuZ3RoID4gMjkyIHx8IChkZS0+bGVuZ3RoIDwgMzIpIHx8IChkZS0+bGVuZ3RoICYgMykgfHwgcCArIGRlLT5sZW5ndGggPiAyMDQ4KSB7CisJCQkJCWhwZnNfZXJyb3IocywgImJhZCBkaXJlbnQgc2l6ZSBpbiBkbm9kZSAlMDh4LCBkaXJlbnQgJTAzeCwgbGFzdCAlMDN4Iiwgc2Vjbm8sIHAsIHBwKTsKKwkJCQkJZ290byBiYWlsOworCQkJCX0KKwkJCQlpZiAoKCgzMSArIGRlLT5uYW1lbGVuICsgZGUtPmRvd24qNCArIDMpICYgfjMpICE9IGRlLT5sZW5ndGgpIHsKKwkJCQkJaWYgKCgoMzEgKyBkZS0+bmFtZWxlbiArIGRlLT5kb3duKjQgKyAzKSAmIH4zKSA8IGRlLT5sZW5ndGggJiYgcy0+c19mbGFncyAmIE1TX1JET05MWSkgZ290byBvazsKKwkJCQkJaHBmc19lcnJvcihzLCAibmFtZWxlbiBkb2VzIG5vdCBtYXRjaCBkaXJlbnQgc2l6ZSBpbiBkbm9kZSAlMDh4LCBkaXJlbnQgJTAzeCwgbGFzdCAlMDN4Iiwgc2Vjbm8sIHAsIHBwKTsKKwkJCQkJZ290byBiYWlsOworCQkJCX0KKwkJCQlvazoKKwkJCQlpZiAoaHBmc19zYihzKS0+c2JfY2hrID49IDIpIGIgfD0gMSA8PCBkZS0+ZG93bjsKKwkJCQlpZiAoZGUtPmRvd24pIGlmIChkZV9kb3duX3BvaW50ZXIoZGUpIDwgMHgxMCkgeworCQkJCQlocGZzX2Vycm9yKHMsICJiYWQgZG93biBwb2ludGVyIGluIGRub2RlICUwOHgsIGRpcmVudCAlMDN4LCBsYXN0ICUwM3giLCBzZWNubywgcCwgcHApOworCQkJCQlnb3RvIGJhaWw7CisJCQkJfQorCQkJCXBwID0gcDsKKwkJCQkKKwkJCX0KKwkJCWlmIChwICE9IGRub2RlLT5maXJzdF9mcmVlKSB7CisJCQkJaHBmc19lcnJvcihzLCAic2l6ZSBvbiBsYXN0IGRpcmVudCBkb2VzIG5vdCBtYXRjaCBmaXJzdF9mcmVlOyBkbm9kZSAlMDh4Iiwgc2Vjbm8pOworCQkJCWdvdG8gYmFpbDsKKwkJCX0KKwkJCWlmIChkW3BwICsgMzBdICE9IDEgfHwgZFtwcCArIDMxXSAhPSAyNTUpIHsKKwkJCQlocGZzX2Vycm9yKHMsICJkbm9kZSAlMDh4IGRvZXMgbm90IGVuZCB3aXRoIFxcMzc3IGVudHJ5Iiwgc2Vjbm8pOworCQkJCWdvdG8gYmFpbDsKKwkJCX0KKwkJCWlmIChiID09IDMpIHByaW50aygiSFBGUzogd2FybmluZzogdW5iYWxhbmNlZCBkbm9kZSB0cmVlLCBkbm9kZSAlMDh4OyBzZWUgaHBmcy50eHQgNCBtb3JlIGluZm9cbiIsIHNlY25vKTsKKwkJfQorCXJldHVybiBkbm9kZTsKKwliYWlsOgorCWhwZnNfYnJlbHNlNChxYmgpOworCXJldHVybiBOVUxMOworfQorCitkbm9kZV9zZWNubyBocGZzX2Zub2RlX2RubyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGlub190IGlubykKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBmbm9kZSAqZm5vZGU7CisJZG5vZGVfc2Vjbm8gZG5vOworCisJZm5vZGUgPSBocGZzX21hcF9mbm9kZShzLCBpbm8sICZiaCk7CisJaWYgKCFmbm9kZSkKKwkJcmV0dXJuIDA7CisKKwlkbm8gPSBmbm9kZS0+dS5leHRlcm5hbFswXS5kaXNrX3NlY25vOworCWJyZWxzZShiaCk7CisJcmV0dXJuIGRubzsKK30KZGlmZiAtLWdpdCBhL2ZzL2hwZnMvbmFtZS5jIGIvZnMvaHBmcy9uYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY0YTk2NAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hwZnMvbmFtZS5jCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogIGxpbnV4L2ZzL2hwZnMvbmFtZS5jCisgKgorICogIE1pa3VsYXMgUGF0b2NrYSAobWlrdWxhc0BhcnRheC5rYXJsaW4ubWZmLmN1bmkuY3opLCAxOTk4LTE5OTkKKyAqCisgKiAgb3BlcmF0aW9ucyB3aXRoIGZpbGVuYW1lcworICovCisKKyNpbmNsdWRlICJocGZzX2ZuLmgiCisKK3N0YXRpYyBjaGFyICp0ZXh0X3Bvc3RmaXhbXT17CisiLkFTTSIsICIuQkFTIiwgIi5CQVQiLCAiLkMiLCAiLkNDIiwgIi5DRkciLCAiLkNNRCIsICIuQ09OIiwgIi5DUFAiLCAiLkRFRiIsCisiLkRPQyIsICIuRFBSIiwgIi5FUlgiLCAiLkgiLCAiLkhQUCIsICIuSFRNIiwgIi5IVE1MIiwgIi5KQVZBIiwgIi5MT0ciLCAiLlBBUyIsCisiLlJDIiwgIi5URVgiLCAiLlRYVCIsICIuWSIsICIifTsKKworc3RhdGljIGNoYXIgKnRleHRfcHJlZml4W109eworIkFVVE9FWEVDLiIsICJDSEFOR0VTIiwgIkNPUFlJTkciLCAiQ09ORklHLiIsICJDUkVESVRTIiwgIkZBUSIsICJGSUxFX0lELkRJWiIsCisiTUFLRUZJTEUiLCAiUkVBRC5NRSIsICJSRUFETUUiLCAiVEVSTUNBUCIsICIifTsKKwordm9pZCBocGZzX2RlY2lkZV9jb252KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxlbikKK3sKKwlzdHJ1Y3QgaHBmc19pbm9kZV9pbmZvICpocGZzX2lub2RlID0gaHBmc19pKGlub2RlKTsKKwlpbnQgaTsKKwlpZiAoaHBmc19pbm9kZS0+aV9jb252ICE9IENPTlZfQVVUTykgcmV0dXJuOworCWZvciAoaSA9IDA7ICp0ZXh0X3Bvc3RmaXhbaV07IGkrKykgeworCQlpbnQgbCA9IHN0cmxlbih0ZXh0X3Bvc3RmaXhbaV0pOworCQlpZiAobCA8PSBsZW4pCisJCQlpZiAoIWhwZnNfY29tcGFyZV9uYW1lcyhpbm9kZS0+aV9zYiwgdGV4dF9wb3N0Zml4W2ldLCBsLCBuYW1lICsgbGVuIC0gbCwgbCwgMCkpCisJCQkJZ290byB0ZXh0OworCX0KKwlmb3IgKGkgPSAwOyAqdGV4dF9wcmVmaXhbaV07IGkrKykgeworCQlpbnQgbCA9IHN0cmxlbih0ZXh0X3ByZWZpeFtpXSk7CisJCWlmIChsIDw9IGxlbikKKwkJCWlmICghaHBmc19jb21wYXJlX25hbWVzKGlub2RlLT5pX3NiLCB0ZXh0X3ByZWZpeFtpXSwgbCwgbmFtZSwgbCwgMCkpCisJCQkJZ290byB0ZXh0OworCX0KKwlocGZzX2lub2RlLT5pX2NvbnYgPSBDT05WX0JJTkFSWTsKKwlyZXR1cm47CisJdGV4dDoKKwlocGZzX2lub2RlLT5pX2NvbnYgPSBDT05WX1RFWFQ7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW5saW5lIGludCBub3RfYWxsb3dlZF9jaGFyKHVuc2lnbmVkIGNoYXIgYykKK3sKKwlyZXR1cm4gYzwnICcgfHwgYz09JyInIHx8IGM9PScqJyB8fCBjPT0nLycgfHwgYz09JzonIHx8IGM9PSc8JyB8fAorCSAgICAgIGM9PSc+JyB8fCBjPT0nPycgfHwgYz09J1xcJyB8fCBjPT0nfCc7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG5vX2Rvc19jaGFyKHVuc2lnbmVkIGNoYXIgYykKK3sJLyogQ2hhcmFjdGVycyB0aGF0IGFyZSBhbGxvd2VkIGluIEhQRlMgYnV0IG5vdCBpbiBET1MgKi8KKwlyZXR1cm4gYz09JysnIHx8IGM9PScsJyB8fCBjPT0nOycgfHwgYz09Jz0nIHx8IGM9PSdbJyB8fCBjPT0nXSc7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciB1cGNhc2UodW5zaWduZWQgY2hhciAqZGlyLCB1bnNpZ25lZCBjaGFyIGEpCit7CisJaWYgKGE8MTI4IHx8IGE9PTI1NSkgcmV0dXJuIGE+PSdhJyAmJiBhPD0neicgPyBhIC0gMHgyMCA6IGE7CisJaWYgKCFkaXIpIHJldHVybiBhOworCXJldHVybiBkaXJbYS0xMjhdOworfQorCit1bnNpZ25lZCBjaGFyIGhwZnNfdXBjYXNlKHVuc2lnbmVkIGNoYXIgKmRpciwgdW5zaWduZWQgY2hhciBhKQoreworCXJldHVybiB1cGNhc2UoZGlyLCBhKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIGxvY2FzZSh1bnNpZ25lZCBjaGFyICpkaXIsIHVuc2lnbmVkIGNoYXIgYSkKK3sKKwlpZiAoYTwxMjggfHwgYT09MjU1KSByZXR1cm4gYT49J0EnICYmIGE8PSdaJyA/IGEgKyAweDIwIDogYTsKKwlpZiAoIWRpcikgcmV0dXJuIGE7CisJcmV0dXJuIGRpclthXTsKK30KKworaW50IGhwZnNfY2hrX25hbWUodW5zaWduZWQgY2hhciAqbmFtZSwgdW5zaWduZWQgKmxlbikKK3sKKwlpbnQgaTsKKwlpZiAoKmxlbiA+IDI1NCkgcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisJaHBmc19hZGp1c3RfbGVuZ3RoKG5hbWUsIGxlbik7CisJaWYgKCEqbGVuKSByZXR1cm4gLUVJTlZBTDsKKwlmb3IgKGkgPSAwOyBpIDwgKmxlbjsgaSsrKSBpZiAobm90X2FsbG93ZWRfY2hhcihuYW1lW2ldKSkgcmV0dXJuIC1FSU5WQUw7CisJaWYgKCpsZW4gPT0gMSkgaWYgKG5hbWVbMF0gPT0gJy4nKSByZXR1cm4gLUVJTlZBTDsKKwlpZiAoKmxlbiA9PSAyKSBpZiAobmFtZVswXSA9PSAnLicgJiYgbmFtZVsxXSA9PSAnLicpIHJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCitjaGFyICpocGZzX3RyYW5zbGF0ZV9uYW1lKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdW5zaWduZWQgY2hhciAqZnJvbSwKKwkJCSAgdW5zaWduZWQgbGVuLCBpbnQgbGMsIGludCBsbmcpCit7CisJY2hhciAqdG87CisJaW50IGk7CisJaWYgKGhwZnNfc2IocyktPnNiX2NoayA+PSAyKSBpZiAoaHBmc19pc19uYW1lX2xvbmcoZnJvbSwgbGVuKSAhPSBsbmcpIHsKKwkJcHJpbnRrKCJIUEZTOiBMb25nIG5hbWUgZmxhZyBtaXNtYXRjaCAtIG5hbWUgIik7CisJCWZvciAoaT0wOyBpPGxlbjsgaSsrKSBwcmludGsoIiVjIiwgZnJvbVtpXSk7CisJCXByaW50aygiIG1pc2lkZW50aWZpZWQgYXMgJXMuXG4iLCBsbmcgPyAic2hvcnQiIDogImxvbmciKTsKKwkJcHJpbnRrKCJIUEZTOiBJdCdzIG5vdGhpbmcgc2VyaW91cy4gSXQgY291bGQgaGFwcGVuIGJlY2F1c2Ugb2YgYnVnIGluIE9TLzIuXG5IUEZTOiBTZXQgY2hlY2tzPW5vcm1hbCB0byBkaXNhYmxlIHRoaXMgbWVzc2FnZS5cbiIpOworCX0KKwlpZiAoIWxjKSByZXR1cm4gZnJvbTsKKwlpZiAoISh0byA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKSkpIHsKKwkJcHJpbnRrKCJIUEZTOiBjYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIG5hbWUgY29udmVyc2lvbiBidWZmZXJcbiIpOworCQlyZXR1cm4gZnJvbTsKKwl9CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB0b1tpXSA9IGxvY2FzZShocGZzX3NiKHMpLT5zYl9jcF90YWJsZSxmcm9tW2ldKTsKKwlyZXR1cm4gdG87Cit9CisKK2ludCBocGZzX2NvbXBhcmVfbmFtZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB1bnNpZ25lZCBjaGFyICpuMSwgdW5zaWduZWQgbDEsCisJCSAgICAgICB1bnNpZ25lZCBjaGFyICpuMiwgdW5zaWduZWQgbDIsIGludCBsYXN0KQoreworCXVuc2lnbmVkIGwgPSBsMSA8IGwyID8gbDEgOiBsMjsKKwl1bnNpZ25lZCBpOworCWlmIChsYXN0KSByZXR1cm4gLTE7CisJZm9yIChpID0gMDsgaSA8IGw7IGkrKykgeworCQl1bnNpZ25lZCBjaGFyIGMxID0gdXBjYXNlKGhwZnNfc2IocyktPnNiX2NwX3RhYmxlLG4xW2ldKTsKKwkJdW5zaWduZWQgY2hhciBjMiA9IHVwY2FzZShocGZzX3NiKHMpLT5zYl9jcF90YWJsZSxuMltpXSk7CisJCWlmIChjMSA8IGMyKSByZXR1cm4gLTE7CisJCWlmIChjMSA+IGMyKSByZXR1cm4gMTsKKwl9CisJaWYgKGwxIDwgbDIpIHJldHVybiAtMTsKKwlpZiAobDEgPiBsMikgcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBocGZzX2lzX25hbWVfbG9uZyh1bnNpZ25lZCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsZW4pCit7CisJaW50IGksajsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuICYmIG5hbWVbaV0gIT0gJy4nOyBpKyspCisJCWlmIChub19kb3NfY2hhcihuYW1lW2ldKSkgcmV0dXJuIDE7CisJaWYgKCFpIHx8IGkgPiA4KSByZXR1cm4gMTsKKwlpZiAoaSA9PSBsZW4pIHJldHVybiAwOworCWZvciAoaiA9IGkgKyAxOyBqIDwgbGVuOyBqKyspCisJCWlmIChuYW1lW2pdID09ICcuJyB8fCBub19kb3NfY2hhcihuYW1lW2ldKSkgcmV0dXJuIDE7CisJcmV0dXJuIGogLSBpID4gNDsKK30KKworLyogT1MvMiBjbGVhcnMgZG90cyBhbmQgc3BhY2VzIGF0IHRoZSBlbmQgb2YgZmlsZSBuYW1lLCBzbyB3ZSBoYXZlIHRvICovCisKK3ZvaWQgaHBmc19hZGp1c3RfbGVuZ3RoKHVuc2lnbmVkIGNoYXIgKm5hbWUsIHVuc2lnbmVkICpsZW4pCit7CisJaWYgKCEqbGVuKSByZXR1cm47CisJaWYgKCpsZW4gPT0gMSAmJiBuYW1lWzBdID09ICcuJykgcmV0dXJuOworCWlmICgqbGVuID09IDIgJiYgbmFtZVswXSA9PSAnLicgJiYgbmFtZVsxXSA9PSAnLicpIHJldHVybjsKKwl3aGlsZSAoKmxlbiAmJiAobmFtZVsqbGVuIC0gMV0gPT0gJy4nIHx8IG5hbWVbKmxlbiAtIDFdID09ICcgJykpCisJCSgqbGVuKS0tOworfQpkaWZmIC0tZ2l0IGEvZnMvaHBmcy9uYW1laS5jIGIvZnMvaHBmcy9uYW1laS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZjhmYzQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ocGZzL25hbWVpLmMKQEAgLTAsMCArMSw2NzMgQEAKKy8qCisgKiAgbGludXgvZnMvaHBmcy9uYW1laS5jCisgKgorICogIE1pa3VsYXMgUGF0b2NrYSAobWlrdWxhc0BhcnRheC5rYXJsaW4ubWZmLmN1bmkuY3opLCAxOTk4LTE5OTkKKyAqCisgKiAgYWRkaW5nICYgcmVtb3ZpbmcgZmlsZXMgJiBkaXJlY3RvcmllcworICovCisKKyNpbmNsdWRlICJocGZzX2ZuLmgiCisKK3N0YXRpYyBpbnQgaHBmc19ta2RpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSkKK3sKKwljb25zdCBjaGFyICpuYW1lID0gZGVudHJ5LT5kX25hbWUubmFtZTsKKwl1bnNpZ25lZCBsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisJc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgcWJoMDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBocGZzX2RpcmVudCAqZGU7CisJc3RydWN0IGZub2RlICpmbm9kZTsKKwlzdHJ1Y3QgZG5vZGUgKmRub2RlOworCXN0cnVjdCBpbm9kZSAqcmVzdWx0OworCWZub2RlX3NlY25vIGZubzsKKwlkbm9kZV9zZWNubyBkbm87CisJaW50IHI7CisJc3RydWN0IGhwZnNfZGlyZW50IGRlZTsKKwlpbnQgZXJyOworCWlmICgoZXJyID0gaHBmc19jaGtfbmFtZSgoY2hhciAqKW5hbWUsICZsZW4pKSkgcmV0dXJuIGVycj09LUVOT0VOVCA/IC1FSU5WQUwgOiBlcnI7CisJbG9ja19rZXJuZWwoKTsKKwllcnIgPSAtRU5PU1BDOworCWZub2RlID0gaHBmc19hbGxvY19mbm9kZShkaXItPmlfc2IsIGhwZnNfaShkaXIpLT5pX2RubywgJmZubywgJmJoKTsKKwlpZiAoIWZub2RlKQorCQlnb3RvIGJhaWw7CisJZG5vZGUgPSBocGZzX2FsbG9jX2Rub2RlKGRpci0+aV9zYiwgZm5vLCAmZG5vLCAmcWJoMCwgMSk7CisJaWYgKCFkbm9kZSkKKwkJZ290byBiYWlsMTsKKwltZW1zZXQoJmRlZSwgMCwgc2l6ZW9mIGRlZSk7CisJZGVlLmRpcmVjdG9yeSA9IDE7CisJaWYgKCEobW9kZSAmIDAyMjIpKSBkZWUucmVhZF9vbmx5ID0gMTsKKwkvKmRlZS5hcmNoaXZlID0gMDsqLworCWRlZS5oaWRkZW4gPSBuYW1lWzBdID09ICcuJzsKKwlkZWUuZm5vZGUgPSBmbm87CisJZGVlLmNyZWF0aW9uX2RhdGUgPSBkZWUud3JpdGVfZGF0ZSA9IGRlZS5yZWFkX2RhdGUgPSBnbXRfdG9fbG9jYWwoZGlyLT5pX3NiLCBnZXRfc2Vjb25kcygpKTsKKwlyZXN1bHQgPSBuZXdfaW5vZGUoZGlyLT5pX3NiKTsKKwlpZiAoIXJlc3VsdCkKKwkJZ290byBiYWlsMjsKKwlocGZzX2luaXRfaW5vZGUocmVzdWx0KTsKKwlyZXN1bHQtPmlfaW5vID0gZm5vOworCWhwZnNfaShyZXN1bHQpLT5pX3BhcmVudF9kaXIgPSBkaXItPmlfaW5vOworCWhwZnNfaShyZXN1bHQpLT5pX2RubyA9IGRubzsKKwlyZXN1bHQtPmlfY3RpbWUudHZfc2VjID0gcmVzdWx0LT5pX210aW1lLnR2X3NlYyA9IHJlc3VsdC0+aV9hdGltZS50dl9zZWMgPSBsb2NhbF90b19nbXQoZGlyLT5pX3NiLCBkZWUuY3JlYXRpb25fZGF0ZSk7CisJcmVzdWx0LT5pX2N0aW1lLnR2X25zZWMgPSAwOyAKKwlyZXN1bHQtPmlfbXRpbWUudHZfbnNlYyA9IDA7IAorCXJlc3VsdC0+aV9hdGltZS50dl9uc2VjID0gMDsgCisJaHBmc19pKHJlc3VsdCktPmlfZWFfc2l6ZSA9IDA7CisJcmVzdWx0LT5pX21vZGUgfD0gU19JRkRJUjsKKwlyZXN1bHQtPmlfb3AgPSAmaHBmc19kaXJfaW9wczsKKwlyZXN1bHQtPmlfZm9wID0gJmhwZnNfZGlyX29wczsKKwlyZXN1bHQtPmlfYmxvY2tzID0gNDsKKwlyZXN1bHQtPmlfc2l6ZSA9IDIwNDg7CisJcmVzdWx0LT5pX25saW5rID0gMjsKKwlpZiAoZGVlLnJlYWRfb25seSkKKwkJcmVzdWx0LT5pX21vZGUgJj0gfjAyMjI7CisKKwlkb3duKCZocGZzX2koZGlyKS0+aV9zZW0pOworCXIgPSBocGZzX2FkZF9kaXJlbnQoZGlyLCAoY2hhciAqKW5hbWUsIGxlbiwgJmRlZSwgMCk7CisJaWYgKHIgPT0gMSkKKwkJZ290byBiYWlsMzsKKwlpZiAociA9PSAtMSkgeworCQllcnIgPSAtRUVYSVNUOworCQlnb3RvIGJhaWwzOworCX0KKwlmbm9kZS0+bGVuID0gbGVuOworCW1lbWNweShmbm9kZS0+bmFtZSwgbmFtZSwgbGVuID4gMTUgPyAxNSA6IGxlbik7CisJZm5vZGUtPnVwID0gZGlyLT5pX2lubzsKKwlmbm9kZS0+ZGlyZmxhZyA9IDE7CisJZm5vZGUtPmJ0cmVlLm5fZnJlZV9ub2RlcyA9IDc7CisJZm5vZGUtPmJ0cmVlLm5fdXNlZF9ub2RlcyA9IDE7CisJZm5vZGUtPmJ0cmVlLmZpcnN0X2ZyZWUgPSAweDE0OworCWZub2RlLT51LmV4dGVybmFsWzBdLmRpc2tfc2Vjbm8gPSBkbm87CisJZm5vZGUtPnUuZXh0ZXJuYWxbMF0uZmlsZV9zZWNubyA9IC0xOworCWRub2RlLT5yb290X2Rub2RlID0gMTsKKwlkbm9kZS0+dXAgPSBmbm87CisJZGUgPSBocGZzX2FkZF9kZShkaXItPmlfc2IsIGRub2RlLCAiXDAwMVwwMDEiLCAyLCAwKTsKKwlkZS0+Y3JlYXRpb25fZGF0ZSA9IGRlLT53cml0ZV9kYXRlID0gZGUtPnJlYWRfZGF0ZSA9IGdtdF90b19sb2NhbChkaXItPmlfc2IsIGdldF9zZWNvbmRzKCkpOworCWlmICghKG1vZGUgJiAwMjIyKSkgZGUtPnJlYWRfb25seSA9IDE7CisJZGUtPmZpcnN0ID0gZGUtPmRpcmVjdG9yeSA9IDE7CisJLypkZS0+aGlkZGVuID0gZGUtPnN5c3RlbSA9IDA7Ki8KKwlkZS0+Zm5vZGUgPSBmbm87CisJbWFya19idWZmZXJfZGlydHkoYmgpOworCWJyZWxzZShiaCk7CisJaHBmc19tYXJrXzRidWZmZXJzX2RpcnR5KCZxYmgwKTsKKwlocGZzX2JyZWxzZTQoJnFiaDApOworCWRpci0+aV9ubGluaysrOworCWluc2VydF9pbm9kZV9oYXNoKHJlc3VsdCk7CisKKwlpZiAocmVzdWx0LT5pX3VpZCAhPSBjdXJyZW50LT5mc3VpZCB8fAorCSAgICByZXN1bHQtPmlfZ2lkICE9IGN1cnJlbnQtPmZzZ2lkIHx8CisJICAgIHJlc3VsdC0+aV9tb2RlICE9IChtb2RlIHwgU19JRkRJUikpIHsKKwkJcmVzdWx0LT5pX3VpZCA9IGN1cnJlbnQtPmZzdWlkOworCQlyZXN1bHQtPmlfZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJCXJlc3VsdC0+aV9tb2RlID0gbW9kZSB8IFNfSUZESVI7CisJCWhwZnNfd3JpdGVfaW5vZGVfbm9sb2NrKHJlc3VsdCk7CisJfQorCWRfaW5zdGFudGlhdGUoZGVudHJ5LCByZXN1bHQpOworCXVwKCZocGZzX2koZGlyKS0+aV9zZW0pOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK2JhaWwzOgorCXVwKCZocGZzX2koZGlyKS0+aV9zZW0pOworCWlwdXQocmVzdWx0KTsKK2JhaWwyOgorCWhwZnNfYnJlbHNlNCgmcWJoMCk7CisJaHBmc19mcmVlX2Rub2RlKGRpci0+aV9zYiwgZG5vKTsKK2JhaWwxOgorCWJyZWxzZShiaCk7CisJaHBmc19mcmVlX3NlY3RvcnMoZGlyLT5pX3NiLCBmbm8sIDEpOworYmFpbDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBocGZzX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJY29uc3QgY2hhciAqbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7CisJdW5zaWduZWQgbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCXN0cnVjdCBpbm9kZSAqcmVzdWx0ID0gTlVMTDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBmbm9kZSAqZm5vZGU7CisJZm5vZGVfc2Vjbm8gZm5vOworCWludCByOworCXN0cnVjdCBocGZzX2RpcmVudCBkZWU7CisJaW50IGVycjsKKwlpZiAoKGVyciA9IGhwZnNfY2hrX25hbWUoKGNoYXIgKiluYW1lLCAmbGVuKSkpCisJCXJldHVybiBlcnI9PS1FTk9FTlQgPyAtRUlOVkFMIDogZXJyOworCWxvY2tfa2VybmVsKCk7CisJZXJyID0gLUVOT1NQQzsKKwlmbm9kZSA9IGhwZnNfYWxsb2NfZm5vZGUoZGlyLT5pX3NiLCBocGZzX2koZGlyKS0+aV9kbm8sICZmbm8sICZiaCk7CisJaWYgKCFmbm9kZSkKKwkJZ290byBiYWlsOworCW1lbXNldCgmZGVlLCAwLCBzaXplb2YgZGVlKTsKKwlpZiAoIShtb2RlICYgMDIyMikpIGRlZS5yZWFkX29ubHkgPSAxOworCWRlZS5hcmNoaXZlID0gMTsKKwlkZWUuaGlkZGVuID0gbmFtZVswXSA9PSAnLic7CisJZGVlLmZub2RlID0gZm5vOworCWRlZS5jcmVhdGlvbl9kYXRlID0gZGVlLndyaXRlX2RhdGUgPSBkZWUucmVhZF9kYXRlID0gZ210X3RvX2xvY2FsKGRpci0+aV9zYiwgZ2V0X3NlY29uZHMoKSk7CisKKwlyZXN1bHQgPSBuZXdfaW5vZGUoZGlyLT5pX3NiKTsKKwlpZiAoIXJlc3VsdCkKKwkJZ290byBiYWlsMTsKKwkKKwlocGZzX2luaXRfaW5vZGUocmVzdWx0KTsKKwlyZXN1bHQtPmlfaW5vID0gZm5vOworCXJlc3VsdC0+aV9tb2RlIHw9IFNfSUZSRUc7CisJcmVzdWx0LT5pX21vZGUgJj0gfjAxMTE7CisJcmVzdWx0LT5pX29wID0gJmhwZnNfZmlsZV9pb3BzOworCXJlc3VsdC0+aV9mb3AgPSAmaHBmc19maWxlX29wczsKKwlyZXN1bHQtPmlfbmxpbmsgPSAxOworCWhwZnNfZGVjaWRlX2NvbnYocmVzdWx0LCAoY2hhciAqKW5hbWUsIGxlbik7CisJaHBmc19pKHJlc3VsdCktPmlfcGFyZW50X2RpciA9IGRpci0+aV9pbm87CisJcmVzdWx0LT5pX2N0aW1lLnR2X3NlYyA9IHJlc3VsdC0+aV9tdGltZS50dl9zZWMgPSByZXN1bHQtPmlfYXRpbWUudHZfc2VjID0gbG9jYWxfdG9fZ210KGRpci0+aV9zYiwgZGVlLmNyZWF0aW9uX2RhdGUpOworCXJlc3VsdC0+aV9jdGltZS50dl9uc2VjID0gMDsKKwlyZXN1bHQtPmlfbXRpbWUudHZfbnNlYyA9IDA7CisJcmVzdWx0LT5pX2F0aW1lLnR2X25zZWMgPSAwOworCWhwZnNfaShyZXN1bHQpLT5pX2VhX3NpemUgPSAwOworCWlmIChkZWUucmVhZF9vbmx5KQorCQlyZXN1bHQtPmlfbW9kZSAmPSB+MDIyMjsKKwlyZXN1bHQtPmlfYmxvY2tzID0gMTsKKwlyZXN1bHQtPmlfc2l6ZSA9IDA7CisJcmVzdWx0LT5pX2RhdGEuYV9vcHMgPSAmaHBmc19hb3BzOworCWhwZnNfaShyZXN1bHQpLT5tbXVfcHJpdmF0ZSA9IDA7CisKKwlkb3duKCZocGZzX2koZGlyKS0+aV9zZW0pOworCXIgPSBocGZzX2FkZF9kaXJlbnQoZGlyLCAoY2hhciAqKW5hbWUsIGxlbiwgJmRlZSwgMCk7CisJaWYgKHIgPT0gMSkKKwkJZ290byBiYWlsMjsKKwlpZiAociA9PSAtMSkgeworCQllcnIgPSAtRUVYSVNUOworCQlnb3RvIGJhaWwyOworCX0KKwlmbm9kZS0+bGVuID0gbGVuOworCW1lbWNweShmbm9kZS0+bmFtZSwgbmFtZSwgbGVuID4gMTUgPyAxNSA6IGxlbik7CisJZm5vZGUtPnVwID0gZGlyLT5pX2lubzsKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJYnJlbHNlKGJoKTsKKworCWluc2VydF9pbm9kZV9oYXNoKHJlc3VsdCk7CisKKwlpZiAocmVzdWx0LT5pX3VpZCAhPSBjdXJyZW50LT5mc3VpZCB8fAorCSAgICByZXN1bHQtPmlfZ2lkICE9IGN1cnJlbnQtPmZzZ2lkIHx8CisJICAgIHJlc3VsdC0+aV9tb2RlICE9IChtb2RlIHwgU19JRlJFRykpIHsKKwkJcmVzdWx0LT5pX3VpZCA9IGN1cnJlbnQtPmZzdWlkOworCQlyZXN1bHQtPmlfZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJCXJlc3VsdC0+aV9tb2RlID0gbW9kZSB8IFNfSUZSRUc7CisJCWhwZnNfd3JpdGVfaW5vZGVfbm9sb2NrKHJlc3VsdCk7CisJfQorCWRfaW5zdGFudGlhdGUoZGVudHJ5LCByZXN1bHQpOworCXVwKCZocGZzX2koZGlyKS0+aV9zZW0pOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKKworYmFpbDI6CisJdXAoJmhwZnNfaShkaXIpLT5pX3NlbSk7CisJaXB1dChyZXN1bHQpOworYmFpbDE6CisJYnJlbHNlKGJoKTsKKwlocGZzX2ZyZWVfc2VjdG9ycyhkaXItPmlfc2IsIGZubywgMSk7CitiYWlsOgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGhwZnNfbWtub2Qoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsIGRldl90IHJkZXYpCit7CisJY29uc3QgY2hhciAqbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7CisJdW5zaWduZWQgbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGZub2RlICpmbm9kZTsKKwlmbm9kZV9zZWNubyBmbm87CisJaW50IHI7CisJc3RydWN0IGhwZnNfZGlyZW50IGRlZTsKKwlzdHJ1Y3QgaW5vZGUgKnJlc3VsdCA9IE5VTEw7CisJaW50IGVycjsKKwlpZiAoKGVyciA9IGhwZnNfY2hrX25hbWUoKGNoYXIgKiluYW1lLCAmbGVuKSkpIHJldHVybiBlcnI9PS1FTk9FTlQgPyAtRUlOVkFMIDogZXJyOworCWlmIChocGZzX3NiKGRpci0+aV9zYiktPnNiX2VhcyA8IDIpIHJldHVybiAtRVBFUk07CisJaWYgKCFuZXdfdmFsaWRfZGV2KHJkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlsb2NrX2tlcm5lbCgpOworCWVyciA9IC1FTk9TUEM7CisJZm5vZGUgPSBocGZzX2FsbG9jX2Zub2RlKGRpci0+aV9zYiwgaHBmc19pKGRpciktPmlfZG5vLCAmZm5vLCAmYmgpOworCWlmICghZm5vZGUpCisJCWdvdG8gYmFpbDsKKwltZW1zZXQoJmRlZSwgMCwgc2l6ZW9mIGRlZSk7CisJaWYgKCEobW9kZSAmIDAyMjIpKSBkZWUucmVhZF9vbmx5ID0gMTsKKwlkZWUuYXJjaGl2ZSA9IDE7CisJZGVlLmhpZGRlbiA9IG5hbWVbMF0gPT0gJy4nOworCWRlZS5mbm9kZSA9IGZubzsKKwlkZWUuY3JlYXRpb25fZGF0ZSA9IGRlZS53cml0ZV9kYXRlID0gZGVlLnJlYWRfZGF0ZSA9IGdtdF90b19sb2NhbChkaXItPmlfc2IsIGdldF9zZWNvbmRzKCkpOworCisJcmVzdWx0ID0gbmV3X2lub2RlKGRpci0+aV9zYik7CisJaWYgKCFyZXN1bHQpCisJCWdvdG8gYmFpbDE7CisKKwlocGZzX2luaXRfaW5vZGUocmVzdWx0KTsKKwlyZXN1bHQtPmlfaW5vID0gZm5vOworCWhwZnNfaShyZXN1bHQpLT5pX3BhcmVudF9kaXIgPSBkaXItPmlfaW5vOworCXJlc3VsdC0+aV9jdGltZS50dl9zZWMgPSByZXN1bHQtPmlfbXRpbWUudHZfc2VjID0gcmVzdWx0LT5pX2F0aW1lLnR2X3NlYyA9IGxvY2FsX3RvX2dtdChkaXItPmlfc2IsIGRlZS5jcmVhdGlvbl9kYXRlKTsKKwlyZXN1bHQtPmlfY3RpbWUudHZfbnNlYyA9IDA7CisJcmVzdWx0LT5pX210aW1lLnR2X25zZWMgPSAwOworCXJlc3VsdC0+aV9hdGltZS50dl9uc2VjID0gMDsKKwlocGZzX2kocmVzdWx0KS0+aV9lYV9zaXplID0gMDsKKwlyZXN1bHQtPmlfdWlkID0gY3VycmVudC0+ZnN1aWQ7CisJcmVzdWx0LT5pX2dpZCA9IGN1cnJlbnQtPmZzZ2lkOworCXJlc3VsdC0+aV9ubGluayA9IDE7CisJcmVzdWx0LT5pX3NpemUgPSAwOworCXJlc3VsdC0+aV9ibG9ja3MgPSAxOworCWluaXRfc3BlY2lhbF9pbm9kZShyZXN1bHQsIG1vZGUsIHJkZXYpOworCisJZG93bigmaHBmc19pKGRpciktPmlfc2VtKTsKKwlyID0gaHBmc19hZGRfZGlyZW50KGRpciwgKGNoYXIgKiluYW1lLCBsZW4sICZkZWUsIDApOworCWlmIChyID09IDEpCisJCWdvdG8gYmFpbDI7CisJaWYgKHIgPT0gLTEpIHsKKwkJZXJyID0gLUVFWElTVDsKKwkJZ290byBiYWlsMjsKKwl9CisJZm5vZGUtPmxlbiA9IGxlbjsKKwltZW1jcHkoZm5vZGUtPm5hbWUsIG5hbWUsIGxlbiA+IDE1ID8gMTUgOiBsZW4pOworCWZub2RlLT51cCA9IGRpci0+aV9pbm87CisJbWFya19idWZmZXJfZGlydHkoYmgpOworCisJaW5zZXJ0X2lub2RlX2hhc2gocmVzdWx0KTsKKworCWhwZnNfd3JpdGVfaW5vZGVfbm9sb2NrKHJlc3VsdCk7CisJZF9pbnN0YW50aWF0ZShkZW50cnksIHJlc3VsdCk7CisJdXAoJmhwZnNfaShkaXIpLT5pX3NlbSk7CisJYnJlbHNlKGJoKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7CitiYWlsMjoKKwl1cCgmaHBmc19pKGRpciktPmlfc2VtKTsKKwlpcHV0KHJlc3VsdCk7CitiYWlsMToKKwlicmVsc2UoYmgpOworCWhwZnNfZnJlZV9zZWN0b3JzKGRpci0+aV9zYiwgZm5vLCAxKTsKK2JhaWw6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaHBmc19zeW1saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKnN5bWxpbmspCit7CisJY29uc3QgY2hhciAqbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7CisJdW5zaWduZWQgbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IGZub2RlICpmbm9kZTsKKwlmbm9kZV9zZWNubyBmbm87CisJaW50IHI7CisJc3RydWN0IGhwZnNfZGlyZW50IGRlZTsKKwlzdHJ1Y3QgaW5vZGUgKnJlc3VsdDsKKwlpbnQgZXJyOworCWlmICgoZXJyID0gaHBmc19jaGtfbmFtZSgoY2hhciAqKW5hbWUsICZsZW4pKSkgcmV0dXJuIGVycj09LUVOT0VOVCA/IC1FSU5WQUwgOiBlcnI7CisJbG9ja19rZXJuZWwoKTsKKwlpZiAoaHBmc19zYihkaXItPmlfc2IpLT5zYl9lYXMgPCAyKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisJZXJyID0gLUVOT1NQQzsKKwlmbm9kZSA9IGhwZnNfYWxsb2NfZm5vZGUoZGlyLT5pX3NiLCBocGZzX2koZGlyKS0+aV9kbm8sICZmbm8sICZiaCk7CisJaWYgKCFmbm9kZSkKKwkJZ290byBiYWlsOworCW1lbXNldCgmZGVlLCAwLCBzaXplb2YgZGVlKTsKKwlkZWUuYXJjaGl2ZSA9IDE7CisJZGVlLmhpZGRlbiA9IG5hbWVbMF0gPT0gJy4nOworCWRlZS5mbm9kZSA9IGZubzsKKwlkZWUuY3JlYXRpb25fZGF0ZSA9IGRlZS53cml0ZV9kYXRlID0gZGVlLnJlYWRfZGF0ZSA9IGdtdF90b19sb2NhbChkaXItPmlfc2IsIGdldF9zZWNvbmRzKCkpOworCisJcmVzdWx0ID0gbmV3X2lub2RlKGRpci0+aV9zYik7CisJaWYgKCFyZXN1bHQpCisJCWdvdG8gYmFpbDE7CisJcmVzdWx0LT5pX2lubyA9IGZubzsKKwlocGZzX2luaXRfaW5vZGUocmVzdWx0KTsKKwlocGZzX2kocmVzdWx0KS0+aV9wYXJlbnRfZGlyID0gZGlyLT5pX2lubzsKKwlyZXN1bHQtPmlfY3RpbWUudHZfc2VjID0gcmVzdWx0LT5pX210aW1lLnR2X3NlYyA9IHJlc3VsdC0+aV9hdGltZS50dl9zZWMgPSBsb2NhbF90b19nbXQoZGlyLT5pX3NiLCBkZWUuY3JlYXRpb25fZGF0ZSk7CisJcmVzdWx0LT5pX2N0aW1lLnR2X25zZWMgPSAwOworCXJlc3VsdC0+aV9tdGltZS50dl9uc2VjID0gMDsKKwlyZXN1bHQtPmlfYXRpbWUudHZfbnNlYyA9IDA7CisJaHBmc19pKHJlc3VsdCktPmlfZWFfc2l6ZSA9IDA7CisJcmVzdWx0LT5pX21vZGUgPSBTX0lGTE5LIHwgMDc3NzsKKwlyZXN1bHQtPmlfdWlkID0gY3VycmVudC0+ZnN1aWQ7CisJcmVzdWx0LT5pX2dpZCA9IGN1cnJlbnQtPmZzZ2lkOworCXJlc3VsdC0+aV9ibG9ja3MgPSAxOworCXJlc3VsdC0+aV9ubGluayA9IDE7CisJcmVzdWx0LT5pX3NpemUgPSBzdHJsZW4oc3ltbGluayk7CisJcmVzdWx0LT5pX29wID0gJnBhZ2Vfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCXJlc3VsdC0+aV9kYXRhLmFfb3BzID0gJmhwZnNfc3ltbGlua19hb3BzOworCisJZG93bigmaHBmc19pKGRpciktPmlfc2VtKTsKKwlyID0gaHBmc19hZGRfZGlyZW50KGRpciwgKGNoYXIgKiluYW1lLCBsZW4sICZkZWUsIDApOworCWlmIChyID09IDEpCisJCWdvdG8gYmFpbDI7CisJaWYgKHIgPT0gLTEpIHsKKwkJZXJyID0gLUVFWElTVDsKKwkJZ290byBiYWlsMjsKKwl9CisJZm5vZGUtPmxlbiA9IGxlbjsKKwltZW1jcHkoZm5vZGUtPm5hbWUsIG5hbWUsIGxlbiA+IDE1ID8gMTUgOiBsZW4pOworCWZub2RlLT51cCA9IGRpci0+aV9pbm87CisJaHBmc19zZXRfZWEocmVzdWx0LCBmbm9kZSwgIlNZTUxJTksiLCAoY2hhciAqKXN5bWxpbmssIHN0cmxlbihzeW1saW5rKSk7CisJbWFya19idWZmZXJfZGlydHkoYmgpOworCWJyZWxzZShiaCk7CisKKwlpbnNlcnRfaW5vZGVfaGFzaChyZXN1bHQpOworCisJaHBmc193cml0ZV9pbm9kZV9ub2xvY2socmVzdWx0KTsKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgcmVzdWx0KTsKKwl1cCgmaHBmc19pKGRpciktPmlfc2VtKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7CitiYWlsMjoKKwl1cCgmaHBmc19pKGRpciktPmlfc2VtKTsKKwlpcHV0KHJlc3VsdCk7CitiYWlsMToKKwlicmVsc2UoYmgpOworCWhwZnNfZnJlZV9zZWN0b3JzKGRpci0+aV9zYiwgZm5vLCAxKTsKK2JhaWw6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaHBmc191bmxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwljb25zdCBjaGFyICpuYW1lID0gZGVudHJ5LT5kX25hbWUubmFtZTsKKwl1bnNpZ25lZCBsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisJc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgcWJoOworCXN0cnVjdCBocGZzX2RpcmVudCAqZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlkbm9kZV9zZWNubyBkbm87CisJZm5vZGVfc2Vjbm8gZm5vOworCWludCByOworCWludCByZXAgPSAwOworCWludCBlcnI7CisKKwlsb2NrX2tlcm5lbCgpOworCWhwZnNfYWRqdXN0X2xlbmd0aCgoY2hhciAqKW5hbWUsICZsZW4pOworYWdhaW46CisJZG93bigmaHBmc19pKGlub2RlKS0+aV9wYXJlbnQpOworCWRvd24oJmhwZnNfaShkaXIpLT5pX3NlbSk7CisJZXJyID0gLUVOT0VOVDsKKwlkZSA9IG1hcF9kaXJlbnQoZGlyLCBocGZzX2koZGlyKS0+aV9kbm8sIChjaGFyICopbmFtZSwgbGVuLCAmZG5vLCAmcWJoKTsKKwlpZiAoIWRlKQorCQlnb3RvIG91dDsKKworCWVyciA9IC1FUEVSTTsKKwlpZiAoZGUtPmZpcnN0KQorCQlnb3RvIG91dDE7CisKKwllcnIgPSAtRUlTRElSOworCWlmIChkZS0+ZGlyZWN0b3J5KQorCQlnb3RvIG91dDE7CisKKwlmbm8gPSBkZS0+Zm5vZGU7CisJciA9IGhwZnNfcmVtb3ZlX2RpcmVudChkaXIsIGRubywgZGUsICZxYmgsIDEpOworCXN3aXRjaCAocikgeworCWNhc2UgMToKKwkJaHBmc19lcnJvcihkaXItPmlfc2IsICJ0aGVyZSB3YXMgZXJyb3Igd2hlbiByZW1vdmluZyBkaXJlbnQiKTsKKwkJZXJyID0gLUVGU0VSUk9SOworCQlicmVhazsKKwljYXNlIDI6CQkvKiBubyBzcGFjZSBmb3IgZGVsZXRpbmcsIHRyeSB0byB0cnVuY2F0ZSBmaWxlICovCisKKwkJZXJyID0gLUVOT1NQQzsKKwkJaWYgKHJlcCsrKQorCQkJYnJlYWs7CisKKwkJdXAoJmhwZnNfaShkaXIpLT5pX3NlbSk7CisJCXVwKCZocGZzX2koaW5vZGUpLT5pX3BhcmVudCk7CisJCWRfZHJvcChkZW50cnkpOworCQlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwkJaWYgKGF0b21pY19yZWFkKCZkZW50cnktPmRfY291bnQpID4gMSB8fAorCQkgICAgcGVybWlzc2lvbihpbm9kZSwgTUFZX1dSSVRFLCBOVUxMKSB8fAorCQkgICAgIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgfHwKKwkJICAgIGdldF93cml0ZV9hY2Nlc3MoaW5vZGUpKSB7CisJCQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCQkJZF9yZWhhc2goZGVudHJ5KTsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBpYXR0ciBuZXdhdHRyczsKKwkJCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CisJCQkvKnByaW50aygiSFBGUzogdHJ1bmNhdGluZyBmaWxlIGJlZm9yZSBkZWxldGUuXG4iKTsqLworCQkJbmV3YXR0cnMuaWFfc2l6ZSA9IDA7CisJCQluZXdhdHRycy5pYV92YWxpZCA9IEFUVFJfU0laRSB8IEFUVFJfQ1RJTUU7CisJCQllcnIgPSBub3RpZnlfY2hhbmdlKGRlbnRyeSwgJm5ld2F0dHJzKTsKKwkJCXB1dF93cml0ZV9hY2Nlc3MoaW5vZGUpOworCQkJaWYgKCFlcnIpCisJCQkJZ290byBhZ2FpbjsKKwkJfQorCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRU5PU1BDOworCWRlZmF1bHQ6CisJCWlub2RlLT5pX25saW5rLS07CisJCWVyciA9IDA7CisJfQorCWdvdG8gb3V0OworCitvdXQxOgorCWhwZnNfYnJlbHNlNCgmcWJoKTsKK291dDoKKwl1cCgmaHBmc19pKGRpciktPmlfc2VtKTsKKwl1cCgmaHBmc19pKGlub2RlKS0+aV9wYXJlbnQpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGhwZnNfcm1kaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwljb25zdCBjaGFyICpuYW1lID0gZGVudHJ5LT5kX25hbWUubmFtZTsKKwl1bnNpZ25lZCBsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisJc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgcWJoOworCXN0cnVjdCBocGZzX2RpcmVudCAqZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlkbm9kZV9zZWNubyBkbm87CisJZm5vZGVfc2Vjbm8gZm5vOworCWludCBuX2l0ZW1zID0gMDsKKwlpbnQgZXJyOworCWludCByOworCisJaHBmc19hZGp1c3RfbGVuZ3RoKChjaGFyICopbmFtZSwgJmxlbik7CisJbG9ja19rZXJuZWwoKTsKKwlkb3duKCZocGZzX2koaW5vZGUpLT5pX3BhcmVudCk7CisJZG93bigmaHBmc19pKGRpciktPmlfc2VtKTsKKwllcnIgPSAtRU5PRU5UOworCWRlID0gbWFwX2RpcmVudChkaXIsIGhwZnNfaShkaXIpLT5pX2RubywgKGNoYXIgKiluYW1lLCBsZW4sICZkbm8sICZxYmgpOworCWlmICghZGUpCisJCWdvdG8gb3V0OworCisJZXJyID0gLUVQRVJNOworCWlmIChkZS0+Zmlyc3QpCisJCWdvdG8gb3V0MTsKKworCWVyciA9IC1FTk9URElSOworCWlmICghZGUtPmRpcmVjdG9yeSkKKwkJZ290byBvdXQxOworCisJaHBmc19jb3VudF9kbm9kZXMoZGlyLT5pX3NiLCBocGZzX2koaW5vZGUpLT5pX2RubywgTlVMTCwgTlVMTCwgJm5faXRlbXMpOworCWVyciA9IC1FTk9URU1QVFk7CisJaWYgKG5faXRlbXMpCisJCWdvdG8gb3V0MTsKKworCWZubyA9IGRlLT5mbm9kZTsKKwlyID0gaHBmc19yZW1vdmVfZGlyZW50KGRpciwgZG5vLCBkZSwgJnFiaCwgMSk7CisJc3dpdGNoIChyKSB7CisJY2FzZSAxOgorCQlocGZzX2Vycm9yKGRpci0+aV9zYiwgInRoZXJlIHdhcyBlcnJvciB3aGVuIHJlbW92aW5nIGRpcmVudCIpOworCQllcnIgPSAtRUZTRVJST1I7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJZXJyID0gLUVOT1NQQzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGlyLT5pX25saW5rLS07CisJCWlub2RlLT5pX25saW5rID0gMDsKKwkJZXJyID0gMDsKKwl9CisJZ290byBvdXQ7CitvdXQxOgorCWhwZnNfYnJlbHNlNCgmcWJoKTsKK291dDoKKwl1cCgmaHBmc19pKGRpciktPmlfc2VtKTsKKwl1cCgmaHBmc19pKGlub2RlKS0+aV9wYXJlbnQpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGhwZnNfc3ltbGlua19yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJY2hhciAqbGluayA9IGttYXAocGFnZSk7CisJc3RydWN0IGlub2RlICppID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3QgZm5vZGUgKmZub2RlOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaW50IGVycjsKKworCWVyciA9IC1FSU87CisJbG9ja19rZXJuZWwoKTsKKwlpZiAoIShmbm9kZSA9IGhwZnNfbWFwX2Zub2RlKGktPmlfc2IsIGktPmlfaW5vLCAmYmgpKSkKKwkJZ290byBmYWlsOworCWVyciA9IGhwZnNfcmVhZF9lYShpLT5pX3NiLCBmbm9kZSwgIlNZTUxJTksiLCBsaW5rLCBQQUdFX1NJWkUpOworCWJyZWxzZShiaCk7CisJaWYgKGVycikKKwkJZ290byBmYWlsOworCXVubG9ja19rZXJuZWwoKTsKKwlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJa3VubWFwKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCXJldHVybiAwOworCitmYWlsOgorCXVubG9ja19rZXJuZWwoKTsKKwlTZXRQYWdlRXJyb3IocGFnZSk7CisJa3VubWFwKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCXJldHVybiBlcnI7Cit9CisKK3N0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgaHBmc19zeW1saW5rX2FvcHMgPSB7CisJLnJlYWRwYWdlCT0gaHBmc19zeW1saW5rX3JlYWRwYWdlCit9OworCQorc3RhdGljIGludCBocGZzX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCisJCXN0cnVjdCBpbm9kZSAqbmV3X2Rpciwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKK3sKKwljaGFyICpvbGRfbmFtZSA9IChjaGFyICopb2xkX2RlbnRyeS0+ZF9uYW1lLm5hbWU7CisJaW50IG9sZF9sZW4gPSBvbGRfZGVudHJ5LT5kX25hbWUubGVuOworCWNoYXIgKm5ld19uYW1lID0gKGNoYXIgKiluZXdfZGVudHJ5LT5kX25hbWUubmFtZTsKKwlpbnQgbmV3X2xlbiA9IG5ld19kZW50cnktPmRfbmFtZS5sZW47CisJc3RydWN0IGlub2RlICppID0gb2xkX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKm5ld19pbm9kZSA9IG5ld19kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgcWJoLCBxYmgxOworCXN0cnVjdCBocGZzX2RpcmVudCAqZGVwLCAqbmRlOworCXN0cnVjdCBocGZzX2RpcmVudCBkZTsKKwlkbm9kZV9zZWNubyBkbm87CisJaW50IHI7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgZm5vZGUgKmZub2RlOworCWludCBlcnI7CisJaWYgKChlcnIgPSBocGZzX2Noa19uYW1lKChjaGFyICopbmV3X25hbWUsICZuZXdfbGVuKSkpIHJldHVybiBlcnI7CisJZXJyID0gMDsKKwlocGZzX2FkanVzdF9sZW5ndGgoKGNoYXIgKilvbGRfbmFtZSwgJm9sZF9sZW4pOworCisJbG9ja19rZXJuZWwoKTsKKwkvKiBvcmRlciBkb2Vzbid0IG1hdHRlciwgZHVlIHRvIFZGUyBleGNsdXNpb24gKi8KKwlkb3duKCZocGZzX2koaSktPmlfcGFyZW50KTsKKwlpZiAobmV3X2lub2RlKQorCQlkb3duKCZocGZzX2kobmV3X2lub2RlKS0+aV9wYXJlbnQpOworCWRvd24oJmhwZnNfaShvbGRfZGlyKS0+aV9zZW0pOworCWlmIChuZXdfZGlyICE9IG9sZF9kaXIpCisJCWRvd24oJmhwZnNfaShuZXdfZGlyKS0+aV9zZW0pOworCQorCS8qIEVybT8gTW92aW5nIG92ZXIgdGhlIGVtcHR5IG5vbi1idXN5IGRpcmVjdG9yeSBpcyBwZXJmZWN0bHkgbGVnYWwgKi8KKwlpZiAobmV3X2lub2RlICYmIFNfSVNESVIobmV3X2lub2RlLT5pX21vZGUpKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZW5kMTsKKwl9CisKKwlpZiAoIShkZXAgPSBtYXBfZGlyZW50KG9sZF9kaXIsIGhwZnNfaShvbGRfZGlyKS0+aV9kbm8sIChjaGFyICopb2xkX25hbWUsIG9sZF9sZW4sICZkbm8sICZxYmgpKSkgeworCQlocGZzX2Vycm9yKGktPmlfc2IsICJsb29rdXAgc3VjY2VlZGVkIGJ1dCBtYXAgZGlyZW50IGZhaWxlZCIpOworCQllcnIgPSAtRU5PRU5UOworCQlnb3RvIGVuZDE7CisJfQorCWNvcHlfZGUoJmRlLCBkZXApOworCWRlLmhpZGRlbiA9IG5ld19uYW1lWzBdID09ICcuJzsKKworCWlmIChuZXdfaW5vZGUpIHsKKwkJaW50IHI7CisJCWlmICgociA9IGhwZnNfcmVtb3ZlX2RpcmVudChvbGRfZGlyLCBkbm8sIGRlcCwgJnFiaCwgMSkpICE9IDIpIHsKKwkJCWlmICgobmRlID0gbWFwX2RpcmVudChuZXdfZGlyLCBocGZzX2kobmV3X2RpciktPmlfZG5vLCAoY2hhciAqKW5ld19uYW1lLCBuZXdfbGVuLCBOVUxMLCAmcWJoMSkpKSB7CisJCQkJbmV3X2lub2RlLT5pX25saW5rID0gMDsKKwkJCQljb3B5X2RlKG5kZSwgJmRlKTsKKwkJCQltZW1jcHkobmRlLT5uYW1lLCBuZXdfbmFtZSwgbmV3X2xlbik7CisJCQkJaHBmc19tYXJrXzRidWZmZXJzX2RpcnR5KCZxYmgxKTsKKwkJCQlocGZzX2JyZWxzZTQoJnFiaDEpOworCQkJCWdvdG8gZW5kOworCQkJfQorCQkJaHBmc19lcnJvcihuZXdfZGlyLT5pX3NiLCAiaHBmc19yZW5hbWU6IGNvdWxkIG5vdCBmaW5kIGRpcmVudCIpOworCQkJZXJyID0gLUVGU0VSUk9SOworCQkJZ290byBlbmQxOworCQl9CisJCWVyciA9IHIgPT0gMiA/IC1FTk9TUEMgOiByID09IDEgPyAtRUZTRVJST1IgOiAwOworCQlnb3RvIGVuZDE7CisJfQorCisJaWYgKG5ld19kaXIgPT0gb2xkX2RpcikgaHBmc19icmVsc2U0KCZxYmgpOworCisJaHBmc19sb2NrX2NyZWF0aW9uKGktPmlfc2IpOworCWlmICgociA9IGhwZnNfYWRkX2RpcmVudChuZXdfZGlyLCBuZXdfbmFtZSwgbmV3X2xlbiwgJmRlLCAxKSkpIHsKKwkJaHBmc191bmxvY2tfY3JlYXRpb24oaS0+aV9zYik7CisJCWlmIChyID09IC0xKSBocGZzX2Vycm9yKG5ld19kaXItPmlfc2IsICJocGZzX3JlbmFtZTogZGlyZW50IGFscmVhZHkgZXhpc3RzISIpOworCQllcnIgPSByID09IDEgPyAtRU5PU1BDIDogLUVGU0VSUk9SOworCQlpZiAobmV3X2RpciAhPSBvbGRfZGlyKSBocGZzX2JyZWxzZTQoJnFiaCk7CisJCWdvdG8gZW5kMTsKKwl9CisJCisJaWYgKG5ld19kaXIgPT0gb2xkX2RpcikKKwkJaWYgKCEoZGVwID0gbWFwX2RpcmVudChvbGRfZGlyLCBocGZzX2kob2xkX2RpciktPmlfZG5vLCAoY2hhciAqKW9sZF9uYW1lLCBvbGRfbGVuLCAmZG5vLCAmcWJoKSkpIHsKKwkJCWhwZnNfdW5sb2NrX2NyZWF0aW9uKGktPmlfc2IpOworCQkJaHBmc19lcnJvcihpLT5pX3NiLCAibG9va3VwIHN1Y2NlZWRlZCBidXQgbWFwIGRpcmVudCBmYWlsZWQgYXQgIzIiKTsKKwkJCWVyciA9IC1FTk9FTlQ7CisJCQlnb3RvIGVuZDE7CisJCX0KKworCWlmICgociA9IGhwZnNfcmVtb3ZlX2RpcmVudChvbGRfZGlyLCBkbm8sIGRlcCwgJnFiaCwgMCkpKSB7CisJCWhwZnNfdW5sb2NrX2NyZWF0aW9uKGktPmlfc2IpOworCQlocGZzX2Vycm9yKGktPmlfc2IsICJocGZzX3JlbmFtZTogY291bGQgbm90IHJlbW92ZSBkaXJlbnQiKTsKKwkJZXJyID0gciA9PSAyID8gLUVOT1NQQyA6IC1FRlNFUlJPUjsKKwkJZ290byBlbmQxOworCX0KKwlocGZzX3VubG9ja19jcmVhdGlvbihpLT5pX3NiKTsKKwkKKwllbmQ6CisJaHBmc19pKGkpLT5pX3BhcmVudF9kaXIgPSBuZXdfZGlyLT5pX2lubzsKKwlpZiAoU19JU0RJUihpLT5pX21vZGUpKSB7CisJCW5ld19kaXItPmlfbmxpbmsrKzsKKwkJb2xkX2Rpci0+aV9ubGluay0tOworCX0KKwlpZiAoKGZub2RlID0gaHBmc19tYXBfZm5vZGUoaS0+aV9zYiwgaS0+aV9pbm8sICZiaCkpKSB7CisJCWZub2RlLT51cCA9IG5ld19kaXItPmlfaW5vOworCQlmbm9kZS0+bGVuID0gbmV3X2xlbjsKKwkJbWVtY3B5KGZub2RlLT5uYW1lLCBuZXdfbmFtZSwgbmV3X2xlbj4xNT8xNTpuZXdfbGVuKTsKKwkJaWYgKG5ld19sZW4gPCAxNSkgbWVtc2V0KCZmbm9kZS0+bmFtZVtuZXdfbGVuXSwgMCwgMTUgLSBuZXdfbGVuKTsKKwkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQlicmVsc2UoYmgpOworCX0KKwlocGZzX2koaSktPmlfY29udiA9IGhwZnNfc2IoaS0+aV9zYiktPnNiX2NvbnY7CisJaHBmc19kZWNpZGVfY29udihpLCAoY2hhciAqKW5ld19uYW1lLCBuZXdfbGVuKTsKK2VuZDE6CisJaWYgKG9sZF9kaXIgIT0gbmV3X2RpcikKKwkJdXAoJmhwZnNfaShuZXdfZGlyKS0+aV9zZW0pOworCXVwKCZocGZzX2kob2xkX2RpciktPmlfc2VtKTsKKwl1cCgmaHBmc19pKGkpLT5pX3BhcmVudCk7CisJaWYgKG5ld19pbm9kZSkKKwkJdXAoJmhwZnNfaShuZXdfaW5vZGUpLT5pX3BhcmVudCk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnI7Cit9CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGhwZnNfZGlyX2lvcHMgPQoreworCS5jcmVhdGUJCT0gaHBmc19jcmVhdGUsCisJLmxvb2t1cAkJPSBocGZzX2xvb2t1cCwKKwkudW5saW5rCQk9IGhwZnNfdW5saW5rLAorCS5zeW1saW5rCT0gaHBmc19zeW1saW5rLAorCS5ta2RpcgkJPSBocGZzX21rZGlyLAorCS5ybWRpcgkJPSBocGZzX3JtZGlyLAorCS5ta25vZAkJPSBocGZzX21rbm9kLAorCS5yZW5hbWUJCT0gaHBmc19yZW5hbWUsCisJLnNldGF0dHIJPSBocGZzX25vdGlmeV9jaGFuZ2UsCit9OwpkaWZmIC0tZ2l0IGEvZnMvaHBmcy9zdXBlci5jIGIvZnMvaHBmcy9zdXBlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZWZhNjMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ocGZzL3N1cGVyLmMKQEAgLTAsMCArMSw3MDEgQEAKKy8qCisgKiAgbGludXgvZnMvaHBmcy9zdXBlci5jCisgKgorICogIE1pa3VsYXMgUGF0b2NrYSAobWlrdWxhc0BhcnRheC5rYXJsaW4ubWZmLmN1bmkuY3opLCAxOTk4LTE5OTkKKyAqCisgKiAgbW91bnRpbmcsIHVubW91bnRpbmcsIGVycm9yIGhhbmRsaW5nCisgKi8KKworI2luY2x1ZGUgImhwZnNfZm4uaCIKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJzZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RhdGZzLmg+CisKKy8qIE1hcmsgdGhlIGZpbGVzeXN0ZW0gZGlydHksIHNvIHRoYXQgY2hrZHNrIGNoZWNrcyBpdCB3aGVuIG9zLzIgYm9vdGVkICovCisKK3N0YXRpYyB2b2lkIG1hcmtfZGlydHkoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQoreworCWlmIChocGZzX3NiKHMpLT5zYl9jaGtkc2sgJiYgIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCQlzdHJ1Y3QgaHBmc19zcGFyZV9ibG9jayAqc2I7CisJCWlmICgoc2IgPSBocGZzX21hcF9zZWN0b3IocywgMTcsICZiaCwgMCkpKSB7CisJCQlzYi0+ZGlydHkgPSAxOworCQkJc2ItPm9sZF93cm90ZSA9IDA7CisJCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCQlicmVsc2UoYmgpOworCQl9CisJfQorfQorCisvKiBNYXJrIHRoZSBmaWxlc3lzdGVtIGNsZWFuIChtYXJrIGl0IGRpcnR5IGZvciBjaGtkc2sgaWYgY2hrZHNrPT0yIG9yIGlmIHRoZXJlCisgICB3ZXJlIGVycm9ycykgKi8KKworc3RhdGljIHZvaWQgdW5tYXJrX2RpcnR5KHN0cnVjdCBzdXBlcl9ibG9jayAqcykKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBocGZzX3NwYXJlX2Jsb2NrICpzYjsKKwlpZiAocy0+c19mbGFncyAmIE1TX1JET05MWSkgcmV0dXJuOworCWlmICgoc2IgPSBocGZzX21hcF9zZWN0b3IocywgMTcsICZiaCwgMCkpKSB7CisJCXNiLT5kaXJ0eSA9IGhwZnNfc2IocyktPnNiX2Noa2RzayA+IDEgLSBocGZzX3NiKHMpLT5zYl93YXNfZXJyb3I7CisJCXNiLT5vbGRfd3JvdGUgPSBocGZzX3NiKHMpLT5zYl9jaGtkc2sgPj0gMiAmJiAhaHBmc19zYihzKS0+c2Jfd2FzX2Vycm9yOworCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCWJyZWxzZShiaCk7CisJfQorfQorCisvKiBGaWxlc3lzdGVtIGVycm9yLi4uICovCisKKyNkZWZpbmUgRVJSX0JVRl9TSVpFIDEwMjQKKwordm9pZCBocGZzX2Vycm9yKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgY2hhciAqbSwuLi4pCit7CisJY2hhciAqYnVmOworCXZhX2xpc3QgbDsKKwl2YV9zdGFydChsLCBtKTsKKwlpZiAoIShidWYgPSBrbWFsbG9jKEVSUl9CVUZfU0laRSwgR0ZQX0tFUk5FTCkpKQorCQlwcmludGsoIkhQRlM6IE5vIG1lbW9yeSBmb3IgZXJyb3IgbWVzc2FnZSAnJXMnXG4iLG0pOworCWVsc2UgaWYgKHZzcHJpbnRmKGJ1ZiwgbSwgbCkgPj0gRVJSX0JVRl9TSVpFKQorCQlwcmludGsoIkhQRlM6IEdycnJyLi4uIEtlcm5lbCBtZW1vcnkgY29ycnVwdGVkIC4uLiBnb2luZyBvbiwgYnV0IGl0J2xsIGNyYXNoIHZlcnkgc29vbiA6LShcbiIpOworCXByaW50aygiSFBGUzogZmlsZXN5c3RlbSBlcnJvcjogIik7CisJaWYgKGJ1ZikgcHJpbnRrKCIlcyIsIGJ1Zik7CisJZWxzZSBwcmludGsoIiVzXG4iLG0pOworCWlmICghaHBmc19zYihzKS0+c2Jfd2FzX2Vycm9yKSB7CisJCWlmIChocGZzX3NiKHMpLT5zYl9lcnIgPT0gMikgeworCQkJcHJpbnRrKCI7IGNyYXNoaW5nIHRoZSBzeXN0ZW0gYmVjYXVzZSB5b3Ugd2FudGVkIGl0XG4iKTsKKwkJCW1hcmtfZGlydHkocyk7CisJCQlwYW5pYygiSFBGUyBwYW5pYyIpOworCQl9IGVsc2UgaWYgKGhwZnNfc2IocyktPnNiX2VyciA9PSAxKSB7CisJCQlpZiAocy0+c19mbGFncyAmIE1TX1JET05MWSkgcHJpbnRrKCI7IGFscmVhZHkgbW91bnRlZCByZWFkLW9ubHlcbiIpOworCQkJZWxzZSB7CisJCQkJcHJpbnRrKCI7IHJlbW91bnRpbmcgcmVhZC1vbmx5XG4iKTsKKwkJCQltYXJrX2RpcnR5KHMpOworCQkJCXMtPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCQkJfQorCQl9IGVsc2UgaWYgKHMtPnNfZmxhZ3MgJiBNU19SRE9OTFkpIHByaW50aygiOyBnb2luZyBvbiAtIGJ1dCBhbnl0aGluZyB3b24ndCBiZSBkZXN0cm95ZWQgYmVjYXVzZSBpdCdzIHJlYWQtb25seVxuIik7CisJCWVsc2UgcHJpbnRrKCI7IGNvcnJ1cHRlZCBmaWxlc3lzdGVtIG1vdW50ZWQgcmVhZC93cml0ZSAtIHlvdXIgY29tcHV0ZXIgd2lsbCBleHBsb2RlIHdpdGhpbiAyMCBzZWNvbmRzIC4uLiBidXQgeW91IHdhbnRlZCBpdCBzbyFcbiIpOworCX0gZWxzZSBwcmludGsoIlxuIik7CisJaWYgKGJ1Zikga2ZyZWUoYnVmKTsKKwlocGZzX3NiKHMpLT5zYl93YXNfZXJyb3IgPSAxOworfQorCisvKiAKKyAqIEEgbGl0dGxlIHRyaWNrIHRvIGRldGVjdCBjeWNsZXMgaW4gbWFueSBocGZzIHN0cnVjdHVyZXMgYW5kIGRvbid0IGxldCB0aGUKKyAqIGtlcm5lbCBjcmFzaCBvbiBjb3JydXB0ZWQgZmlsZXN5c3RlbS4gV2hlbiBmaXJzdCBjYWxsZWQsIHNldCBjMiB0byAwLgorICoKKyAqIEJUVy4gY2hrZHNrIGRvZXNuJ3QgZGV0ZWN0IGN5Y2xlcyBjb3JyZWN0bHkuIFdoZW4gSSBoYWQgMiBsb3N0IGRpcmVjdG9yaWVzCisgKiBuZXN0ZWQgZWFjaCBpbiBvdGhlciwgY2hrZHNrIGxvY2tlZCB1cCBoYXBwaWxseS4KKyAqLworCitpbnQgaHBmc19zdG9wX2N5Y2xlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCBrZXksIGludCAqYzEsIGludCAqYzIsCisJCWNoYXIgKm1zZykKK3sKKwlpZiAoKmMyICYmICpjMSA9PSBrZXkpIHsKKwkJaHBmc19lcnJvcihzLCAiY3ljbGUgZGV0ZWN0ZWQgb24ga2V5ICUwOHggaW4gJXMiLCBrZXksIG1zZyk7CisJCXJldHVybiAxOworCX0KKwkoKmMyKSsrOworCWlmICghKCgqYzIgLSAxKSAmICpjMikpICpjMSA9IGtleTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaHBmc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQoreworCXN0cnVjdCBocGZzX3NiX2luZm8gKnNiaSA9IGhwZnNfc2Iocyk7CisJaWYgKHNiaS0+c2JfY3BfdGFibGUpIGtmcmVlKHNiaS0+c2JfY3BfdGFibGUpOworCWlmIChzYmktPnNiX2JtcF9kaXIpIGtmcmVlKHNiaS0+c2JfYm1wX2Rpcik7CisJdW5tYXJrX2RpcnR5KHMpOworCXMtPnNfZnNfaW5mbyA9IE5VTEw7CisJa2ZyZWUoc2JpKTsKK30KKwordW5zaWduZWQgaHBmc19jb3VudF9vbmVfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc2Vjbm8gc2Vjbm8pCit7CisJc3RydWN0IHF1YWRfYnVmZmVyX2hlYWQgcWJoOworCXVuc2lnbmVkICpiaXRzOworCXVuc2lnbmVkIGksIGNvdW50OworCWlmICghKGJpdHMgPSBocGZzX21hcF80c2VjdG9ycyhzLCBzZWNubywgJnFiaCwgNCkpKSByZXR1cm4gMDsKKwljb3VudCA9IDA7CisJZm9yIChpID0gMDsgaSA8IDIwNDggLyBzaXplb2YodW5zaWduZWQpOyBpKyspIHsKKwkJdW5zaWduZWQgYjsgCisJCWlmICghYml0c1tpXSkgY29udGludWU7CisJCWZvciAoYiA9IGJpdHNbaV07IGI7IGI+Pj0xKSBjb3VudCArPSBiICYgMTsKKwl9CisJaHBmc19icmVsc2U0KCZxYmgpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHVuc2lnbmVkIGNvdW50X2JpdG1hcHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQoreworCXVuc2lnbmVkIG4sIGNvdW50LCBuX2JhbmRzOworCW5fYmFuZHMgPSAoaHBmc19zYihzKS0+c2JfZnNfc2l6ZSArIDB4M2ZmZikgPj4gMTQ7CisJY291bnQgPSAwOworCWZvciAobiA9IDA7IG4gPCBuX2JhbmRzOyBuKyspCisJCWNvdW50ICs9IGhwZnNfY291bnRfb25lX2JpdG1hcChzLCBocGZzX3NiKHMpLT5zYl9ibXBfZGlyW25dKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgaHBmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQoreworCXN0cnVjdCBocGZzX3NiX2luZm8gKnNiaSA9IGhwZnNfc2Iocyk7CisJbG9ja19rZXJuZWwoKTsKKworCS8qaWYgKHNiaS0+c2Jfbl9mcmVlID09IC0xKSB7Ki8KKwkJc2JpLT5zYl9uX2ZyZWUgPSBjb3VudF9iaXRtYXBzKHMpOworCQlzYmktPnNiX25fZnJlZV9kbm9kZXMgPSBocGZzX2NvdW50X29uZV9iaXRtYXAocywgc2JpLT5zYl9kbWFwKTsKKwkvKn0qLworCWJ1Zi0+Zl90eXBlID0gcy0+c19tYWdpYzsKKwlidWYtPmZfYnNpemUgPSA1MTI7CisJYnVmLT5mX2Jsb2NrcyA9IHNiaS0+c2JfZnNfc2l6ZTsKKwlidWYtPmZfYmZyZWUgPSBzYmktPnNiX25fZnJlZTsKKwlidWYtPmZfYmF2YWlsID0gc2JpLT5zYl9uX2ZyZWU7CisJYnVmLT5mX2ZpbGVzID0gc2JpLT5zYl9kaXJiYW5kX3NpemUgLyA0OworCWJ1Zi0+Zl9mZnJlZSA9IHNiaS0+c2Jfbl9mcmVlX2Rub2RlczsKKwlidWYtPmZfbmFtZWxlbiA9IDI1NDsKKworCXVubG9ja19rZXJuZWwoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMga21lbV9jYWNoZV90ICogaHBmc19pbm9kZV9jYWNoZXA7CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmhwZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgaHBmc19pbm9kZV9pbmZvICplaTsKKwllaSA9IChzdHJ1Y3QgaHBmc19pbm9kZV9pbmZvICopa21lbV9jYWNoZV9hbGxvYyhocGZzX2lub2RlX2NhY2hlcCwgU0xBQl9OT0ZTKTsKKwlpZiAoIWVpKQorCQlyZXR1cm4gTlVMTDsKKwllaS0+dmZzX2lub2RlLmlfdmVyc2lvbiA9IDE7CisJcmV0dXJuICZlaS0+dmZzX2lub2RlOworfQorCitzdGF0aWMgdm9pZCBocGZzX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlrbWVtX2NhY2hlX2ZyZWUoaHBmc19pbm9kZV9jYWNoZXAsIGhwZnNfaShpbm9kZSkpOworfQorCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBocGZzX2lub2RlX2luZm8gKmVpID0gKHN0cnVjdCBocGZzX2lub2RlX2luZm8gKikgZm9vOworCisJaWYgKChmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CisJICAgIFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikgeworCQlpbml0X01VVEVYKCZlaS0+aV9zZW0pOworCQlpbml0X01VVEVYKCZlaS0+aV9wYXJlbnQpOworCQlpbm9kZV9pbml0X29uY2UoJmVpLT52ZnNfaW5vZGUpOworCX0KK30KKyAKK3N0YXRpYyBpbnQgaW5pdF9pbm9kZWNhY2hlKHZvaWQpCit7CisJaHBmc19pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiaHBmc19pbm9kZV9jYWNoZSIsCisJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBocGZzX2lub2RlX2luZm8pLAorCQkJCQkgICAgIDAsIFNMQUJfUkVDTEFJTV9BQ0NPVU5ULAorCQkJCQkgICAgIGluaXRfb25jZSwgTlVMTCk7CisJaWYgKGhwZnNfaW5vZGVfY2FjaGVwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X2lub2RlY2FjaGUodm9pZCkKK3sKKwlpZiAoa21lbV9jYWNoZV9kZXN0cm95KGhwZnNfaW5vZGVfY2FjaGVwKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiaHBmc19pbm9kZV9jYWNoZTogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOworfQorCisvKgorICogQSB0aW55IHBhcnNlciBmb3Igb3B0aW9uIHN0cmluZ3MsIHN0b2xlbiBmcm9tIGRvc2ZzLgorICogU3RvbGVuIGFnYWluIGZyb20gcmVhZC1vbmx5IGhwZnMuCisgKiBBbmQgdXBkYXRlZCBmb3IgdGFibGUtZHJpdmVuIG9wdGlvbiBwYXJzaW5nLgorICovCisKK2VudW0geworCU9wdF9oZWxwLCBPcHRfdWlkLCBPcHRfZ2lkLCBPcHRfdW1hc2ssIE9wdF9jYXNlX2xvd2VyLCBPcHRfY2FzZV9hc2lzLAorCU9wdF9jb252X2JpbmFyeSwgT3B0X2NvbnZfdGV4dCwgT3B0X2NvbnZfYXV0bywKKwlPcHRfY2hlY2tfbm9uZSwgT3B0X2NoZWNrX25vcm1hbCwgT3B0X2NoZWNrX3N0cmljdCwKKwlPcHRfZXJyX2NvbnQsIE9wdF9lcnJfcm8sIE9wdF9lcnJfcGFuaWMsCisJT3B0X2Vhc19ubywgT3B0X2Vhc19ybywgT3B0X2Vhc19ydywKKwlPcHRfY2hrZHNrX25vLCBPcHRfY2hrZHNrX2Vycm9ycywgT3B0X2Noa2Rza19hbHdheXMsCisJT3B0X3RpbWVzaGlmdCwgT3B0X2VyciwKK307CisKK3N0YXRpYyBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKKwl7T3B0X2hlbHAsICJoZWxwIn0sCisJe09wdF91aWQsICJ1aWQ9JXUifSwKKwl7T3B0X2dpZCwgImdpZD0ldSJ9LAorCXtPcHRfdW1hc2ssICJ1bWFzaz0lbyJ9LAorCXtPcHRfY2FzZV9sb3dlciwgImNhc2U9bG93ZXIifSwKKwl7T3B0X2Nhc2VfYXNpcywgImNhc2U9YXNpcyJ9LAorCXtPcHRfY29udl9iaW5hcnksICJjb252PWJpbmFyeSJ9LAorCXtPcHRfY29udl90ZXh0LCAiY29udj10ZXh0In0sCisJe09wdF9jb252X2F1dG8sICJjb252PWF1dG8ifSwKKwl7T3B0X2NoZWNrX25vbmUsICJjaGVjaz1ub25lIn0sCisJe09wdF9jaGVja19ub3JtYWwsICJjaGVjaz1ub3JtYWwifSwKKwl7T3B0X2NoZWNrX3N0cmljdCwgImNoZWNrPXN0cmljdCJ9LAorCXtPcHRfZXJyX2NvbnQsICJlcnJvcnM9Y29udGludWUifSwKKwl7T3B0X2Vycl9ybywgImVycm9ycz1yZW1vdW50LXJvIn0sCisJe09wdF9lcnJfcGFuaWMsICJlcnJvcnM9cGFuaWMifSwKKwl7T3B0X2Vhc19ubywgImVhcz1ubyJ9LAorCXtPcHRfZWFzX3JvLCAiZWFzPXJvIn0sCisJe09wdF9lYXNfcncsICJlYXM9cncifSwKKwl7T3B0X2Noa2Rza19ubywgImNoa2Rzaz1ubyJ9LAorCXtPcHRfY2hrZHNrX2Vycm9ycywgImNoa2Rzaz1lcnJvcnMifSwKKwl7T3B0X2Noa2Rza19hbHdheXMsICJjaGtkc2s9YWx3YXlzIn0sCisJe09wdF90aW1lc2hpZnQsICJ0aW1lc2hpZnQ9JWQifSwKKwl7T3B0X2VyciwgTlVMTH0sCit9OworCitzdGF0aWMgaW50IHBhcnNlX29wdHMoY2hhciAqb3B0cywgdWlkX3QgKnVpZCwgZ2lkX3QgKmdpZCwgdW1vZGVfdCAqdW1hc2ssCisJCSAgICAgIGludCAqbG93ZXJjYXNlLCBpbnQgKmNvbnYsIGludCAqZWFzLCBpbnQgKmNoaywgaW50ICplcnJzLAorCQkgICAgICBpbnQgKmNoa2RzaywgaW50ICp0aW1lc2hpZnQpCit7CisJY2hhciAqcDsKKwlpbnQgb3B0aW9uOworCisJaWYgKCFvcHRzKQorCQlyZXR1cm4gMTsKKworCS8qcHJpbnRrKCJQYXJzaW5nIG9wdHM6ICclcydcbiIsb3B0cyk7Ki8KKworCXdoaWxlICgocCA9IHN0cnNlcCgmb3B0cywgIiwiKSkgIT0gTlVMTCkgeworCQlzdWJzdHJpbmdfdCBhcmdzW01BWF9PUFRfQVJHU107CisJCWludCB0b2tlbjsKKwkJaWYgKCEqcCkKKwkJCWNvbnRpbnVlOworCisJCXRva2VuID0gbWF0Y2hfdG9rZW4ocCwgdG9rZW5zLCBhcmdzKTsKKwkJc3dpdGNoICh0b2tlbikgeworCQljYXNlIE9wdF9oZWxwOgorCQkJcmV0dXJuIDI7CisJCWNhc2UgT3B0X3VpZDoKKwkJCWlmIChtYXRjaF9pbnQoYXJncywgJm9wdGlvbikpCisJCQkJcmV0dXJuIDA7CisJCQkqdWlkID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2dpZDoKKwkJCWlmIChtYXRjaF9pbnQoYXJncywgJm9wdGlvbikpCisJCQkJcmV0dXJuIDA7CisJCQkqZ2lkID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3VtYXNrOgorCQkJaWYgKG1hdGNoX29jdGFsKGFyZ3MsICZvcHRpb24pKQorCQkJCXJldHVybiAwOworCQkJKnVtYXNrID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2Nhc2VfbG93ZXI6CisJCQkqbG93ZXJjYXNlID0gMTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9jYXNlX2FzaXM6CisJCQkqbG93ZXJjYXNlID0gMDsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9jb252X2JpbmFyeToKKwkJCSpjb252ID0gQ09OVl9CSU5BUlk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfY29udl90ZXh0OgorCQkJKmNvbnYgPSBDT05WX1RFWFQ7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfY29udl9hdXRvOgorCQkJKmNvbnYgPSBDT05WX0FVVE87CisJCQlicmVhazsKKwkJY2FzZSBPcHRfY2hlY2tfbm9uZToKKwkJCSpjaGsgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2NoZWNrX25vcm1hbDoKKwkJCSpjaGsgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2NoZWNrX3N0cmljdDoKKwkJCSpjaGsgPSAyOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2Vycl9jb250OgorCQkJKmVycnMgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2Vycl9ybzoKKwkJCSplcnJzID0gMTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9lcnJfcGFuaWM6CisJCQkqZXJycyA9IDI7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZWFzX25vOgorCQkJKmVhcyA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZWFzX3JvOgorCQkJKmVhcyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZWFzX3J3OgorCQkJKmVhcyA9IDI7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfY2hrZHNrX25vOgorCQkJKmNoa2RzayA9IDA7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfY2hrZHNrX2Vycm9yczoKKwkJCSpjaGtkc2sgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2Noa2Rza19hbHdheXM6CisJCQkqY2hrZHNrID0gMjsKKwkJCWJyZWFrOworCQljYXNlIE9wdF90aW1lc2hpZnQ6CisJCXsKKwkJCWludCBtID0gMTsKKwkJCWNoYXIgKnJocyA9IGFyZ3NbMF0uZnJvbTsKKwkJCWlmICghcmhzIHx8ICEqcmhzKQorCQkJCXJldHVybiAwOworCQkJaWYgKCpyaHMgPT0gJy0nKSBtID0gLTE7CisJCQlpZiAoKnJocyA9PSAnKycgfHwgKnJocyA9PSAnLScpIHJocysrOworCQkJKnRpbWVzaGlmdCA9IHNpbXBsZV9zdHJ0b3VsKHJocywgJnJocywgMCkgKiBtOworCQkJaWYgKCpyaHMpCisJCQkJcmV0dXJuIDA7CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBocGZzX2hlbHAodm9pZCkKK3sKKwlwcmludGsoIlxuXAorSFBGUyBmaWxlc3lzdGVtIG9wdGlvbnM6XG5cCisgICAgICBoZWxwICAgICAgICAgICAgICBkbyBub3QgbW91bnQgYW5kIGRpc3BsYXkgdGhpcyB0ZXh0XG5cCisgICAgICB1aWQ9eHh4ICAgICAgICAgICBzZXQgdWlkIG9mIGZpbGVzIHRoYXQgZG9uJ3QgaGF2ZSB1aWQgc3BlY2lmaWVkIGluIGVhc1xuXAorICAgICAgZ2lkPXh4eCAgICAgICAgICAgc2V0IGdpZCBvZiBmaWxlcyB0aGF0IGRvbid0IGhhdmUgZ2lkIHNwZWNpZmllZCBpbiBlYXNcblwKKyAgICAgIHVtYXNrPXh4eCAgICAgICAgIHNldCBtb2RlIG9mIGZpbGVzIHRoYXQgZG9uJ3QgaGF2ZSBtb2RlIHNwZWNpZmllZCBpbiBlYXNcblwKKyAgICAgIGNhc2U9bG93ZXIgICAgICAgIGxvd2VyY2FzZSBhbGwgZmlsZXNcblwKKyAgICAgIGNhc2U9YXNpcyAgICAgICAgIGRvIG5vdCBsb3dlcmNhc2UgZmlsZXMgKGRlZmF1bHQpXG5cCisgICAgICBjb252PWJpbmFyeSAgICAgICBkbyBub3QgY29udmVydCBDUi9MRiAtPiBMRiAoZGVmYXVsdClcblwKKyAgICAgIGNvbnY9YXV0byAgICAgICAgIGNvbnZlcnQgb25seSBmaWxlcyB3aXRoIGtub3duIHRleHQgZXh0ZW5zaW9uc1xuXAorICAgICAgY29udj10ZXh0ICAgICAgICAgY29udmVydCBhbGwgZmlsZXNcblwKKyAgICAgIGNoZWNrPW5vbmUgICAgICAgIG5vIGZzIGNoZWNrcyAtIGtlcm5lbCBtYXkgY3Jhc2ggb24gY29ycnVwdGVkIGZpbGVzeXN0ZW1cblwKKyAgICAgIGNoZWNrPW5vcm1hbCAgICAgIGRvIHNvbWUgY2hlY2tzIC0gaXQgc2hvdWxkIG5vdCBjcmFzaCAoZGVmYXVsdClcblwKKyAgICAgIGNoZWNrPXN0cmljdCAgICAgIGRvIGV4dHJhIHRpbWUtY29uc3VtaW5nIGNoZWNrcywgdXNlZCBmb3IgZGVidWdnaW5nXG5cCisgICAgICBlcnJvcnM9Y29udGludWUgICBjb250aW51ZSBvbiBlcnJvcnNcblwKKyAgICAgIGVycm9ycz1yZW1vdW50LXJvIHJlbW91bnQgcmVhZC1vbmx5IGlmIGVycm9ycyBmb3VuZCAoZGVmYXVsdClcblwKKyAgICAgIGVycm9ycz1wYW5pYyAgICAgIHBhbmljIG9uIGVycm9yc1xuXAorICAgICAgY2hrZHNrPW5vICAgICAgICAgZG8gbm90IG1hcmsgZnMgZm9yIGNoa2Rza2luZyBldmVuIGlmIHRoZXJlIHdlcmUgZXJyb3JzXG5cCisgICAgICBjaGtkc2s9ZXJyb3JzICAgICBtYXJrIGZzIGRpcnR5IGlmIGVycm9ycyBmb3VuZCAoZGVmYXVsdClcblwKKyAgICAgIGNoa2Rzaz1hbHdheXMgICAgIGFsd2F5cyBtYXJrIGZzIGRpcnR5IC0gdXNlZCBmb3IgZGVidWdnaW5nXG5cCisgICAgICBlYXM9bm8gICAgICAgICAgICBpZ25vcmUgZXh0ZW5kZWQgYXR0cmlidXRlc1xuXAorICAgICAgZWFzPXJvICAgICAgICAgICAgcmVhZCBidXQgZG8gbm90IHdyaXRlIGV4dGVuZGVkIGF0dHJpYnV0ZXNcblwKKyAgICAgIGVhcz1ydyAgICAgICAgICAgIHIvdyBlYXMgPT4gZW5hYmxlcyBjaG1vZCwgY2hvd24sIG1rbm9kLCBsbiAtcyAoZGVmYXVsdClcblwKKyAgICAgIHRpbWVzaGlmdD1ubm4JYWRkIG5ubiBzZWNvbmRzIHRvIGZpbGUgdGltZXNcblwKK1xuIik7Cit9CisKK3N0YXRpYyBpbnQgaHBmc19yZW1vdW50X2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgaW50ICpmbGFncywgY2hhciAqZGF0YSkKK3sKKwl1aWRfdCB1aWQ7CisJZ2lkX3QgZ2lkOworCXVtb2RlX3QgdW1hc2s7CisJaW50IGxvd2VyY2FzZSwgY29udiwgZWFzLCBjaGssIGVycnMsIGNoa2RzaywgdGltZXNoaWZ0OworCWludCBvOworCXN0cnVjdCBocGZzX3NiX2luZm8gKnNiaSA9IGhwZnNfc2Iocyk7CisJCisJKmZsYWdzIHw9IE1TX05PQVRJTUU7CisJCisJdWlkID0gc2JpLT5zYl91aWQ7IGdpZCA9IHNiaS0+c2JfZ2lkOworCXVtYXNrID0gMDc3NyAmIH5zYmktPnNiX21vZGU7CisJbG93ZXJjYXNlID0gc2JpLT5zYl9sb3dlcmNhc2U7IGNvbnYgPSBzYmktPnNiX2NvbnY7CisJZWFzID0gc2JpLT5zYl9lYXM7IGNoayA9IHNiaS0+c2JfY2hrOyBjaGtkc2sgPSBzYmktPnNiX2Noa2RzazsKKwllcnJzID0gc2JpLT5zYl9lcnI7IHRpbWVzaGlmdCA9IHNiaS0+c2JfdGltZXNoaWZ0OworCisJaWYgKCEobyA9IHBhcnNlX29wdHMoZGF0YSwgJnVpZCwgJmdpZCwgJnVtYXNrLCAmbG93ZXJjYXNlLCAmY29udiwKKwkgICAgJmVhcywgJmNoaywgJmVycnMsICZjaGtkc2ssICZ0aW1lc2hpZnQpKSkgeworCQlwcmludGsoIkhQRlM6IGJhZCBtb3VudCBvcHRpb25zLlxuIik7CisJICAgIAlyZXR1cm4gMTsKKwl9CisJaWYgKG8gPT0gMikgeworCQlocGZzX2hlbHAoKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmICh0aW1lc2hpZnQgIT0gc2JpLT5zYl90aW1lc2hpZnQpIHsKKwkJcHJpbnRrKCJIUEZTOiB0aW1lc2hpZnQgY2FuJ3QgYmUgY2hhbmdlZCB1c2luZyByZW1vdW50LlxuIik7CisJCXJldHVybiAxOworCX0KKworCXVubWFya19kaXJ0eShzKTsKKworCXNiaS0+c2JfdWlkID0gdWlkOyBzYmktPnNiX2dpZCA9IGdpZDsKKwlzYmktPnNiX21vZGUgPSAwNzc3ICYgfnVtYXNrOworCXNiaS0+c2JfbG93ZXJjYXNlID0gbG93ZXJjYXNlOyBzYmktPnNiX2NvbnYgPSBjb252OworCXNiaS0+c2JfZWFzID0gZWFzOyBzYmktPnNiX2NoayA9IGNoazsgc2JpLT5zYl9jaGtkc2sgPSBjaGtkc2s7CisJc2JpLT5zYl9lcnIgPSBlcnJzOyBzYmktPnNiX3RpbWVzaGlmdCA9IHRpbWVzaGlmdDsKKworCWlmICghKCpmbGFncyAmIE1TX1JET05MWSkpIG1hcmtfZGlydHkocyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogU3VwZXIgb3BlcmF0aW9ucyAqLworCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgaHBmc19zb3BzID0KK3sKKwkuYWxsb2NfaW5vZGUJPSBocGZzX2FsbG9jX2lub2RlLAorCS5kZXN0cm95X2lub2RlCT0gaHBmc19kZXN0cm95X2lub2RlLAorCS5kZWxldGVfaW5vZGUJPSBocGZzX2RlbGV0ZV9pbm9kZSwKKwkucHV0X3N1cGVyCT0gaHBmc19wdXRfc3VwZXIsCisJLnN0YXRmcwkJPSBocGZzX3N0YXRmcywKKwkucmVtb3VudF9mcwk9IGhwZnNfcmVtb3VudF9mcywKK307CisKK3N0YXRpYyBpbnQgaHBmc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdm9pZCAqb3B0aW9ucywgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoMCwgKmJoMSwgKmJoMjsKKwlzdHJ1Y3QgaHBmc19ib290X2Jsb2NrICpib290YmxvY2s7CisJc3RydWN0IGhwZnNfc3VwZXJfYmxvY2sgKnN1cGVyYmxvY2s7CisJc3RydWN0IGhwZnNfc3BhcmVfYmxvY2sgKnNwYXJlYmxvY2s7CisJc3RydWN0IGhwZnNfc2JfaW5mbyAqc2JpOworCXN0cnVjdCBpbm9kZSAqcm9vdDsKKworCXVpZF90IHVpZDsKKwlnaWRfdCBnaWQ7CisJdW1vZGVfdCB1bWFzazsKKwlpbnQgbG93ZXJjYXNlLCBjb252LCBlYXMsIGNoaywgZXJycywgY2hrZHNrLCB0aW1lc2hpZnQ7CisKKwlkbm9kZV9zZWNubyByb290X2RubzsKKwlzdHJ1Y3QgaHBmc19kaXJlbnQgKmRlID0gTlVMTDsKKwlzdHJ1Y3QgcXVhZF9idWZmZXJfaGVhZCBxYmg7CisKKwlpbnQgbzsKKworCXNiaSA9IGttYWxsb2Moc2l6ZW9mKCpzYmkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNiaSkKKwkJcmV0dXJuIC1FTk9NRU07CisJcy0+c19mc19pbmZvID0gc2JpOworCW1lbXNldChzYmksIDAsIHNpemVvZigqc2JpKSk7CisKKwlzYmktPnNiX2JtcF9kaXIgPSBOVUxMOworCXNiaS0+c2JfY3BfdGFibGUgPSBOVUxMOworCisJaW5pdF9NVVRFWCgmc2JpLT5ocGZzX2NyZWF0aW9uX2RlKTsKKworCXVpZCA9IGN1cnJlbnQtPnVpZDsKKwlnaWQgPSBjdXJyZW50LT5naWQ7CisJdW1hc2sgPSBjdXJyZW50LT5mcy0+dW1hc2s7CisJbG93ZXJjYXNlID0gMDsKKwljb252ID0gQ09OVl9CSU5BUlk7CisJZWFzID0gMjsKKwljaGsgPSAxOworCWVycnMgPSAxOworCWNoa2RzayA9IDE7CisJdGltZXNoaWZ0ID0gMDsKKworCWlmICghKG8gPSBwYXJzZV9vcHRzKG9wdGlvbnMsICZ1aWQsICZnaWQsICZ1bWFzaywgJmxvd2VyY2FzZSwgJmNvbnYsCisJICAgICZlYXMsICZjaGssICZlcnJzLCAmY2hrZHNrLCAmdGltZXNoaWZ0KSkpIHsKKwkJcHJpbnRrKCJIUEZTOiBiYWQgbW91bnQgb3B0aW9ucy5cbiIpOworCQlnb3RvIGJhaWwwOworCX0KKwlpZiAobz09MikgeworCQlocGZzX2hlbHAoKTsKKwkJZ290byBiYWlsMDsKKwl9CisKKwkvKnNiaS0+c2JfbW91bnRpbmcgPSAxOyovCisJc2Jfc2V0X2Jsb2Nrc2l6ZShzLCA1MTIpOworCXNiaS0+c2JfZnNfc2l6ZSA9IC0xOworCWlmICghKGJvb3RibG9jayA9IGhwZnNfbWFwX3NlY3RvcihzLCAwLCAmYmgwLCAwKSkpIGdvdG8gYmFpbDE7CisJaWYgKCEoc3VwZXJibG9jayA9IGhwZnNfbWFwX3NlY3RvcihzLCAxNiwgJmJoMSwgMSkpKSBnb3RvIGJhaWwyOworCWlmICghKHNwYXJlYmxvY2sgPSBocGZzX21hcF9zZWN0b3IocywgMTcsICZiaDIsIDApKSkgZ290byBiYWlsMzsKKworCS8qIENoZWNrIG1hZ2ljcyAqLworCWlmICgvKmJvb3RibG9jay0+bWFnaWMgIT0gQkJfTUFHSUMKKwkgICAgfHwqLyBzdXBlcmJsb2NrLT5tYWdpYyAhPSBTQl9NQUdJQworCSAgICB8fCBzcGFyZWJsb2NrLT5tYWdpYyAhPSBTUF9NQUdJQykgeworCQlpZiAoIXNpbGVudCkgcHJpbnRrKCJIUEZTOiBCYWQgbWFnaWMgLi4uIHByb2JhYmx5IG5vdCBIUEZTXG4iKTsKKwkJZ290byBiYWlsNDsKKwl9CisKKwkvKiBDaGVjayB2ZXJzaW9uICovCisJaWYgKCEocy0+c19mbGFncyAmIE1TX1JET05MWSkgJiYKKwkgICAgICBzdXBlcmJsb2NrLT5mdW5jdmVyc2lvbiAhPSAyICYmIHN1cGVyYmxvY2stPmZ1bmN2ZXJzaW9uICE9IDMpIHsKKwkJcHJpbnRrKCJIUEZTOiBCYWQgdmVyc2lvbiAlZCwlZC4gTW91bnQgcmVhZG9ubHkgdG8gZ28gYXJvdW5kXG4iLAorCQkJKGludClzdXBlcmJsb2NrLT52ZXJzaW9uLCAoaW50KXN1cGVyYmxvY2stPmZ1bmN2ZXJzaW9uKTsKKwkJcHJpbnRrKCJIUEZTOiBwbGVhc2UgdHJ5IHJlY2VudCB2ZXJzaW9uIG9mIEhQRlMgZHJpdmVyIGF0IGh0dHA6Ly9hcnRheC5rYXJsaW4ubWZmLmN1bmkuY3ovfm1pa3VsYXMvdnlwbG9keS9ocGZzL2luZGV4LWUuY2dpIGFuZCBpZiBpdCBzdGlsbCBjYW4ndCB1bmRlcnN0YW5kIHRoaXMgZm9ybWF0LCBjb250YWN0IGF1dGhvciAtIG1pa3VsYXNAYXJ0YXgua2FybGluLm1mZi5jdW5pLmN6XG4iKTsKKwkJZ290byBiYWlsNDsKKwl9CisKKwlzLT5zX2ZsYWdzIHw9IE1TX05PQVRJTUU7CisKKwkvKiBGaWxsIHN1cGVyYmxvY2sgc3R1ZmYgKi8KKwlzLT5zX21hZ2ljID0gSFBGU19TVVBFUl9NQUdJQzsKKwlzLT5zX29wID0gJmhwZnNfc29wczsKKworCXNiaS0+c2Jfcm9vdCA9IHN1cGVyYmxvY2stPnJvb3Q7CisJc2JpLT5zYl9mc19zaXplID0gc3VwZXJibG9jay0+bl9zZWN0b3JzOworCXNiaS0+c2JfYml0bWFwcyA9IHN1cGVyYmxvY2stPmJpdG1hcHM7CisJc2JpLT5zYl9kaXJiYW5kX3N0YXJ0ID0gc3VwZXJibG9jay0+ZGlyX2JhbmRfc3RhcnQ7CisJc2JpLT5zYl9kaXJiYW5kX3NpemUgPSBzdXBlcmJsb2NrLT5uX2Rpcl9iYW5kOworCXNiaS0+c2JfZG1hcCA9IHN1cGVyYmxvY2stPmRpcl9iYW5kX2JpdG1hcDsKKwlzYmktPnNiX3VpZCA9IHVpZDsKKwlzYmktPnNiX2dpZCA9IGdpZDsKKwlzYmktPnNiX21vZGUgPSAwNzc3ICYgfnVtYXNrOworCXNiaS0+c2Jfbl9mcmVlID0gLTE7CisJc2JpLT5zYl9uX2ZyZWVfZG5vZGVzID0gLTE7CisJc2JpLT5zYl9sb3dlcmNhc2UgPSBsb3dlcmNhc2U7CisJc2JpLT5zYl9jb252ID0gY29udjsKKwlzYmktPnNiX2VhcyA9IGVhczsKKwlzYmktPnNiX2NoayA9IGNoazsKKwlzYmktPnNiX2Noa2RzayA9IGNoa2RzazsKKwlzYmktPnNiX2VyciA9IGVycnM7CisJc2JpLT5zYl90aW1lc2hpZnQgPSB0aW1lc2hpZnQ7CisJc2JpLT5zYl93YXNfZXJyb3IgPSAwOworCXNiaS0+c2JfY3BfdGFibGUgPSBOVUxMOworCXNiaS0+c2JfY19iaXRtYXAgPSAtMTsKKwlzYmktPnNiX21heF9md2RfYWxsb2MgPSAweGZmZmZmZjsKKwkKKwkvKiBMb2FkIGJpdG1hcCBkaXJlY3RvcnkgKi8KKwlpZiAoIShzYmktPnNiX2JtcF9kaXIgPSBocGZzX2xvYWRfYml0bWFwX2RpcmVjdG9yeShzLCBzdXBlcmJsb2NrLT5iaXRtYXBzKSkpCisJCWdvdG8gYmFpbDQ7CisJCisJLyogQ2hlY2sgZm9yIGdlbmVyYWwgZnMgZXJyb3JzKi8KKwlpZiAoc3BhcmVibG9jay0+ZGlydHkgJiYgIXNwYXJlYmxvY2stPm9sZF93cm90ZSkgeworCQlpZiAoZXJycyA9PSAyKSB7CisJCQlwcmludGsoIkhQRlM6IEltcHJvcGVybHkgc3RvcHBlZCwgbm90IG1vdW50ZWRcbiIpOworCQkJZ290byBiYWlsNDsKKwkJfQorCQlocGZzX2Vycm9yKHMsICJpbXByb3Blcmx5IHN0b3BwZWQiKTsKKwl9CisKKwlpZiAoIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQlzcGFyZWJsb2NrLT5kaXJ0eSA9IDE7CisJCXNwYXJlYmxvY2stPm9sZF93cm90ZSA9IDA7CisJCW1hcmtfYnVmZmVyX2RpcnR5KGJoMik7CisJfQorCisJaWYgKHNwYXJlYmxvY2stPmhvdGZpeGVzX3VzZWQgfHwgc3BhcmVibG9jay0+bl9zcGFyZXNfdXNlZCkgeworCQlpZiAoZXJycyA+PSAyKSB7CisJCQlwcmludGsoIkhQRlM6IEhvdGZpeGVzIG5vdCBzdXBwb3J0ZWQgaGVyZSwgdHJ5IGNoa2Rza1xuIik7CisJCQltYXJrX2RpcnR5KHMpOworCQkJZ290byBiYWlsNDsKKwkJfQorCQlocGZzX2Vycm9yKHMsICJob3RmaXhlcyBub3Qgc3VwcG9ydGVkIGhlcmUsIHRyeSBjaGtkc2siKTsKKwkJaWYgKGVycnMgPT0gMCkgcHJpbnRrKCJIUEZTOiBQcm9jZWVkaW5nLCBidXQgeW91ciBmaWxlc3lzdGVtIHdpbGwgYmUgcHJvYmFibHkgY29ycnVwdGVkIGJ5IHRoaXMgZHJpdmVyLi4uXG4iKTsKKwkJZWxzZSBwcmludGsoIkhQRlM6IFRoaXMgZHJpdmVyIG1heSByZWFkIGJhZCBmaWxlcyBvciBjcmFzaCB3aGVuIG9wZXJhdGluZyBvbiBkaXNrIHdpdGggaG90Zml4ZXMuXG4iKTsKKwl9CisJaWYgKHNwYXJlYmxvY2stPm5fZG5vZGVfc3BhcmVzICE9IHNwYXJlYmxvY2stPm5fZG5vZGVfc3BhcmVzX2ZyZWUpIHsKKwkJaWYgKGVycnMgPj0gMikgeworCQkJcHJpbnRrKCJIUEZTOiBTcGFyZSBkbm9kZXMgdXNlZCwgdHJ5IGNoa2Rza1xuIik7CisJCQltYXJrX2RpcnR5KHMpOworCQkJZ290byBiYWlsNDsKKwkJfQorCQlocGZzX2Vycm9yKHMsICJ3YXJuaW5nOiBzcGFyZSBkbm9kZXMgdXNlZCwgdHJ5IGNoa2RzayIpOworCQlpZiAoZXJycyA9PSAwKSBwcmludGsoIkhQRlM6IFByb2NlZWRpbmcsIGJ1dCB5b3VyIGZpbGVzeXN0ZW0gY291bGQgYmUgY29ycnVwdGVkIGlmIHlvdSBkZWxldGUgZmlsZXMgb3IgZGlyZWN0b3JpZXNcbiIpOworCX0KKwlpZiAoY2hrKSB7CisJCXVuc2lnbmVkIGE7CisJCWlmIChzdXBlcmJsb2NrLT5kaXJfYmFuZF9lbmQgLSBzdXBlcmJsb2NrLT5kaXJfYmFuZF9zdGFydCArIDEgIT0gc3VwZXJibG9jay0+bl9kaXJfYmFuZCB8fAorCQkgICAgc3VwZXJibG9jay0+ZGlyX2JhbmRfZW5kIDwgc3VwZXJibG9jay0+ZGlyX2JhbmRfc3RhcnQgfHwgc3VwZXJibG9jay0+bl9kaXJfYmFuZCA+IDB4NDAwMCkgeworCQkJaHBmc19lcnJvcihzLCAiZGlyIGJhbmQgc2l6ZSBtaXNtYXRjaDogZGlyX2JhbmRfc3RhcnQ9PSUwOHgsIGRpcl9iYW5kX2VuZD09JTA4eCwgbl9kaXJfYmFuZD09JTA4eCIsCisJCQkJc3VwZXJibG9jay0+ZGlyX2JhbmRfc3RhcnQsIHN1cGVyYmxvY2stPmRpcl9iYW5kX2VuZCwgc3VwZXJibG9jay0+bl9kaXJfYmFuZCk7CisJCQlnb3RvIGJhaWw0OworCQl9CisJCWEgPSBzYmktPnNiX2RpcmJhbmRfc2l6ZTsKKwkJc2JpLT5zYl9kaXJiYW5kX3NpemUgPSAwOworCQlpZiAoaHBmc19jaGtfc2VjdG9ycyhzLCBzdXBlcmJsb2NrLT5kaXJfYmFuZF9zdGFydCwgc3VwZXJibG9jay0+bl9kaXJfYmFuZCwgImRpcl9iYW5kIikgfHwKKwkJICAgIGhwZnNfY2hrX3NlY3RvcnMocywgc3VwZXJibG9jay0+ZGlyX2JhbmRfYml0bWFwLCA0LCAiZGlyX2JhbmRfYml0bWFwIikgfHwKKwkJICAgIGhwZnNfY2hrX3NlY3RvcnMocywgc3VwZXJibG9jay0+Yml0bWFwcywgNCwgImJpdG1hcHMiKSkgeworCQkJbWFya19kaXJ0eShzKTsKKwkJCWdvdG8gYmFpbDQ7CisJCX0KKwkJc2JpLT5zYl9kaXJiYW5kX3NpemUgPSBhOworCX0gZWxzZSBwcmludGsoIkhQRlM6IFlvdSByZWFsbHkgZG9uJ3Qgd2FudCBhbnkgY2hlY2tzPyBZb3UgYXJlIGNyYXp5Li4uXG4iKTsKKworCS8qIExvYWQgY29kZSBwYWdlIHRhYmxlICovCisJaWYgKHNwYXJlYmxvY2stPm5fY29kZV9wYWdlcykKKwkJaWYgKCEoc2JpLT5zYl9jcF90YWJsZSA9IGhwZnNfbG9hZF9jb2RlX3BhZ2Uocywgc3BhcmVibG9jay0+Y29kZV9wYWdlX2RpcikpKQorCQkJcHJpbnRrKCJIUEZTOiBXYXJuaW5nOiBjb2RlIHBhZ2Ugc3VwcG9ydCBpcyBkaXNhYmxlZFxuIik7CisKKwlicmVsc2UoYmgyKTsKKwlicmVsc2UoYmgxKTsKKwlicmVsc2UoYmgwKTsKKworCXJvb3QgPSBpZ2V0X2xvY2tlZChzLCBzYmktPnNiX3Jvb3QpOworCWlmICghcm9vdCkKKwkJZ290byBiYWlsMDsKKwlocGZzX2luaXRfaW5vZGUocm9vdCk7CisJaHBmc19yZWFkX2lub2RlKHJvb3QpOworCXVubG9ja19uZXdfaW5vZGUocm9vdCk7CisJcy0+c19yb290ID0gZF9hbGxvY19yb290KHJvb3QpOworCWlmICghcy0+c19yb290KSB7CisJCWlwdXQocm9vdCk7CisJCWdvdG8gYmFpbDA7CisJfQorCWhwZnNfc2V0X2RlbnRyeV9vcGVyYXRpb25zKHMtPnNfcm9vdCk7CisKKwkvKgorCSAqIGZpbmQgdGhlIHJvb3QgZGlyZWN0b3J5J3MgLiBwb2ludGVyICYgZmluaXNoIGZpbGxpbmcgaW4gdGhlIGlub2RlCisJICovCisKKwlyb290X2RubyA9IGhwZnNfZm5vZGVfZG5vKHMsIHNiaS0+c2Jfcm9vdCk7CisJaWYgKHJvb3RfZG5vKQorCQlkZSA9IG1hcF9kaXJlbnQocm9vdCwgcm9vdF9kbm8sICJcMDAxXDAwMSIsIDIsIE5VTEwsICZxYmgpOworCWlmICghZGUpCisJCWhwZnNfZXJyb3IocywgInVuYWJsZSB0byBmaW5kIHJvb3QgZGlyIik7CisJZWxzZSB7CisJCXJvb3QtPmlfYXRpbWUudHZfc2VjID0gbG9jYWxfdG9fZ210KHMsIGRlLT5yZWFkX2RhdGUpOworCQlyb290LT5pX2F0aW1lLnR2X25zZWMgPSAwOworCQlyb290LT5pX210aW1lLnR2X3NlYyA9IGxvY2FsX3RvX2dtdChzLCBkZS0+d3JpdGVfZGF0ZSk7CisJCXJvb3QtPmlfbXRpbWUudHZfbnNlYyA9IDA7CisJCXJvb3QtPmlfY3RpbWUudHZfc2VjID0gbG9jYWxfdG9fZ210KHMsIGRlLT5jcmVhdGlvbl9kYXRlKTsKKwkJcm9vdC0+aV9jdGltZS50dl9uc2VjID0gMDsKKwkJaHBmc19pKHJvb3QpLT5pX2VhX3NpemUgPSBkZS0+ZWFfc2l6ZTsKKwkJaHBmc19pKHJvb3QpLT5pX3BhcmVudF9kaXIgPSByb290LT5pX2lubzsKKwkJaWYgKHJvb3QtPmlfc2l6ZSA9PSAtMSkKKwkJCXJvb3QtPmlfc2l6ZSA9IDIwNDg7CisJCWlmIChyb290LT5pX2Jsb2NrcyA9PSAtMSkKKwkJCXJvb3QtPmlfYmxvY2tzID0gNTsKKwkJaHBmc19icmVsc2U0KCZxYmgpOworCX0KKwlyZXR1cm4gMDsKKworYmFpbDQ6CWJyZWxzZShiaDIpOworYmFpbDM6CWJyZWxzZShiaDEpOworYmFpbDI6CWJyZWxzZShiaDApOworYmFpbDE6CitiYWlsMDoKKwlpZiAoc2JpLT5zYl9ibXBfZGlyKSBrZnJlZShzYmktPnNiX2JtcF9kaXIpOworCWlmIChzYmktPnNiX2NwX3RhYmxlKSBrZnJlZShzYmktPnNiX2NwX3RhYmxlKTsKKwlzLT5zX2ZzX2luZm8gPSBOVUxMOworCWtmcmVlKHNiaSk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmhwZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgaHBmc19maWxsX3N1cGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGhwZnNfZnNfdHlwZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gImhwZnMiLAorCS5nZXRfc2IJCT0gaHBmc19nZXRfc2IsCisJLmtpbGxfc2IJPSBraWxsX2Jsb2NrX3N1cGVyLAorCS5mc19mbGFncwk9IEZTX1JFUVVJUkVTX0RFViwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfaHBmc19mcyh2b2lkKQoreworCWludCBlcnIgPSBpbml0X2lub2RlY2FjaGUoKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJZXJyID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmaHBmc19mc190eXBlKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwlyZXR1cm4gMDsKK291dDoKKwlkZXN0cm95X2lub2RlY2FjaGUoKTsKK291dDE6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfaHBmc19mcyh2b2lkKQoreworCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmaHBmc19mc190eXBlKTsKKwlkZXN0cm95X2lub2RlY2FjaGUoKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ocGZzX2ZzKQorbW9kdWxlX2V4aXQoZXhpdF9ocGZzX2ZzKQorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvaHBwZnMvTWFrZWZpbGUgYi9mcy9ocHBmcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODkwNDMzCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaHBwZnMvTWFrZWZpbGUKQEAgLTAsMCArMSw5IEBACisjCisjIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKKyMKKworaHBwZnMtb2JqcyA6PSBocHBmc19rZXJuLm8KKworb2JqLXkgPQorb2JqLSQoQ09ORklHX0hQUEZTKSArPSBocHBmcy5vCmRpZmYgLS1naXQgYS9mcy9ocHBmcy9ocHBmc19rZXJuLmMgYi9mcy9ocHBmcy9ocHBmc19rZXJuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhlMGNiZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2hwcGZzL2hwcGZzX2tlcm4uYwpAQCAtMCwwICsxLDgxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0ZnMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9mY250bC5oPgorI2luY2x1ZGUgIm9zLmgiCisKK3N0YXRpYyBpbnQgaW5pdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOworCitzdHJ1Y3QgaHBwZnNfZGF0YSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCWNoYXIgY29udGVudHNbUEFHRV9TSVpFIC0gc2l6ZW9mKHN0cnVjdCBsaXN0X2hlYWQpXTsKK307CisKK3N0cnVjdCBocHBmc19wcml2YXRlIHsKKwlzdHJ1Y3QgZmlsZSAqcHJvY19maWxlOworCWludCBob3N0X2ZkOworCWxvZmZfdCBsZW47CisJc3RydWN0IGhwcGZzX2RhdGEgKmNvbnRlbnRzOworfTsKKworc3RydWN0IGhwcGZzX2lub2RlX2luZm8geworICAgICAgICBzdHJ1Y3QgZGVudHJ5ICpwcm9jX2RlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgdmZzX2lub2RlOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaHBwZnNfaW5vZGVfaW5mbyAqSFBQRlNfSShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybihsaXN0X2VudHJ5KGlub2RlLCBzdHJ1Y3QgaHBwZnNfaW5vZGVfaW5mbywgdmZzX2lub2RlKSk7Cit9CisKKyNkZWZpbmUgSFBQRlNfU1VQRVJfTUFHSUMgMHhiMDAwMDBlZQorCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgaHBwZnNfc2JvcHM7CisKK3N0YXRpYyBpbnQgaXNfcGlkKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCWludCBpOworCisJc2IgPSBkZW50cnktPmRfc2I7CisJaWYoKHNiLT5zX29wICE9ICZocHBmc19zYm9wcykgfHwgKGRlbnRyeS0+ZF9wYXJlbnQgIT0gc2ItPnNfcm9vdCkpCisJCXJldHVybigwKTsKKworCWZvcihpID0gMDsgaSA8IGRlbnRyeS0+ZF9uYW1lLmxlbjsgaSsrKXsKKwkJaWYoIWlzZGlnaXQoZGVudHJ5LT5kX25hbWUubmFtZVtpXSkpCisJCQlyZXR1cm4oMCk7CisJfQorCXJldHVybigxKTsKK30KKworc3RhdGljIGNoYXIgKmRlbnRyeV9uYW1lKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGV4dHJhKQoreworCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKKwljaGFyICpyb290LCAqbmFtZTsKKwljb25zdCBjaGFyICpzZWdfbmFtZTsKKwlpbnQgbGVuLCBzZWdfbGVuOworCisJbGVuID0gMDsKKwlwYXJlbnQgPSBkZW50cnk7CisJd2hpbGUocGFyZW50LT5kX3BhcmVudCAhPSBwYXJlbnQpeworCQlpZihpc19waWQocGFyZW50KSkKKwkJCWxlbiArPSBzdHJsZW4oInBpZCIpICsgMTsKKwkJZWxzZSBsZW4gKz0gcGFyZW50LT5kX25hbWUubGVuICsgMTsKKwkJcGFyZW50ID0gcGFyZW50LT5kX3BhcmVudDsKKwl9CisKKwlyb290ID0gInByb2MiOworCWxlbiArPSBzdHJsZW4ocm9vdCk7CisJbmFtZSA9IGttYWxsb2MobGVuICsgZXh0cmEgKyAxLCBHRlBfS0VSTkVMKTsKKwlpZihuYW1lID09IE5VTEwpIHJldHVybihOVUxMKTsKKworCW5hbWVbbGVuXSA9ICdcMCc7CisJcGFyZW50ID0gZGVudHJ5OworCXdoaWxlKHBhcmVudC0+ZF9wYXJlbnQgIT0gcGFyZW50KXsKKwkJaWYoaXNfcGlkKHBhcmVudCkpeworCQkJc2VnX25hbWUgPSAicGlkIjsKKwkJCXNlZ19sZW4gPSBzdHJsZW4oInBpZCIpOworCQl9CisJCWVsc2UgeworCQkJc2VnX25hbWUgPSBwYXJlbnQtPmRfbmFtZS5uYW1lOworCQkJc2VnX2xlbiA9IHBhcmVudC0+ZF9uYW1lLmxlbjsKKwkJfQorCisJCWxlbiAtPSBzZWdfbGVuICsgMTsKKwkJbmFtZVtsZW5dID0gJy8nOworCQlzdHJuY3B5KCZuYW1lW2xlbiArIDFdLCBzZWdfbmFtZSwgc2VnX2xlbik7CisJCXBhcmVudCA9IHBhcmVudC0+ZF9wYXJlbnQ7CisJfQorCXN0cm5jcHkobmFtZSwgcm9vdCwgc3RybGVuKHJvb3QpKTsKKwlyZXR1cm4obmFtZSk7Cit9CisKK3N0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBocHBmc19kZW50cnlfb3BzID0geworfTsKKworc3RhdGljIGludCBmaWxlX3JlbW92ZWQoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpmaWxlKQoreworCWNoYXIgKmhvc3RfZmlsZTsKKwlpbnQgZXh0cmEsIGZkOworCisJZXh0cmEgPSAwOworCWlmKGZpbGUgIT0gTlVMTCkgZXh0cmEgKz0gc3RybGVuKGZpbGUpICsgMTsKKworCWhvc3RfZmlsZSA9IGRlbnRyeV9uYW1lKGRlbnRyeSwgZXh0cmEgKyBzdHJsZW4oIi9yZW1vdmUiKSk7CisJaWYoaG9zdF9maWxlID09IE5VTEwpeworCQlwcmludGsoImZpbGVfcmVtb3ZlZCA6IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuKC1FTk9NRU0pOworCX0KKworCWlmKGZpbGUgIT0gTlVMTCl7CisJCXN0cmNhdChob3N0X2ZpbGUsICIvIik7CisJCXN0cmNhdChob3N0X2ZpbGUsIGZpbGUpOworCX0KKwlzdHJjYXQoaG9zdF9maWxlLCAiL3JlbW92ZSIpOworCisJZmQgPSBvc19vcGVuX2ZpbGUoaG9zdF9maWxlLCBvZl9yZWFkKE9QRU5GTEFHUygpKSwgMCk7CisJa2ZyZWUoaG9zdF9maWxlKTsKKwlpZihmZCA+IDApeworCQlvc19jbG9zZV9maWxlKGZkKTsKKwkJcmV0dXJuKDEpOworCX0KKwlyZXR1cm4oMCk7Cit9CisKK3N0YXRpYyB2b2lkIGhwcGZzX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICppbm8pCit7CisJc3RydWN0IGlub2RlICpwcm9jX2lubzsKKworCWlmKEhQUEZTX0koaW5vKS0+cHJvY19kZW50cnkgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJcHJvY19pbm8gPSBIUFBGU19JKGlubyktPnByb2NfZGVudHJ5LT5kX2lub2RlOworCWluby0+aV91aWQgPSBwcm9jX2luby0+aV91aWQ7CisJaW5vLT5pX2dpZCA9IHByb2NfaW5vLT5pX2dpZDsKKwlpbm8tPmlfYXRpbWUgPSBwcm9jX2luby0+aV9hdGltZTsKKwlpbm8tPmlfbXRpbWUgPSBwcm9jX2luby0+aV9tdGltZTsKKwlpbm8tPmlfY3RpbWUgPSBwcm9jX2luby0+aV9jdGltZTsKKwlpbm8tPmlfaW5vID0gcHJvY19pbm8tPmlfaW5vOworCWluby0+aV9tb2RlID0gcHJvY19pbm8tPmlfbW9kZTsKKwlpbm8tPmlfbmxpbmsgPSBwcm9jX2luby0+aV9ubGluazsKKwlpbm8tPmlfc2l6ZSA9IHByb2NfaW5vLT5pX3NpemU7CisJaW5vLT5pX2Jsa3NpemUgPSBwcm9jX2luby0+aV9ibGtzaXplOworCWluby0+aV9ibG9ja3MgPSBwcm9jX2luby0+aV9ibG9ja3M7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpocHBmc19sb29rdXAoc3RydWN0IGlub2RlICppbm8sIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpwcm9jX2RlbnRyeSwgKm5ldywgKnBhcmVudDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWludCBlcnIsIGRlbGV0ZWQ7CisKKwlkZWxldGVkID0gZmlsZV9yZW1vdmVkKGRlbnRyeSwgTlVMTCk7CisJaWYoZGVsZXRlZCA8IDApCisJCXJldHVybihFUlJfUFRSKGRlbGV0ZWQpKTsKKwllbHNlIGlmKGRlbGV0ZWQpCisJCXJldHVybihFUlJfUFRSKC1FTk9FTlQpKTsKKworCWVyciA9IC1FTk9NRU07CisJcGFyZW50ID0gSFBQRlNfSShpbm8pLT5wcm9jX2RlbnRyeTsKKwlkb3duKCZwYXJlbnQtPmRfaW5vZGUtPmlfc2VtKTsKKwlwcm9jX2RlbnRyeSA9IGRfbG9va3VwKHBhcmVudCwgJmRlbnRyeS0+ZF9uYW1lKTsKKwlpZihwcm9jX2RlbnRyeSA9PSBOVUxMKXsKKwkJcHJvY19kZW50cnkgPSBkX2FsbG9jKHBhcmVudCwgJmRlbnRyeS0+ZF9uYW1lKTsKKwkJaWYocHJvY19kZW50cnkgPT0gTlVMTCl7CisJCQl1cCgmcGFyZW50LT5kX2lub2RlLT5pX3NlbSk7CisJCQlnb3RvIG91dDsKKwkJfQorCQluZXcgPSAoKnBhcmVudC0+ZF9pbm9kZS0+aV9vcC0+bG9va3VwKShwYXJlbnQtPmRfaW5vZGUsCisJCQkJCQkgICAgICAgcHJvY19kZW50cnksIE5VTEwpOworCQlpZihuZXcpeworCQkJZHB1dChwcm9jX2RlbnRyeSk7CisJCQlwcm9jX2RlbnRyeSA9IG5ldzsKKwkJfQorCX0KKwl1cCgmcGFyZW50LT5kX2lub2RlLT5pX3NlbSk7CisKKwlpZihJU19FUlIocHJvY19kZW50cnkpKQorCQlyZXR1cm4ocHJvY19kZW50cnkpOworCisJaW5vZGUgPSBpZ2V0KGluby0+aV9zYiwgMCk7CisJaWYoaW5vZGUgPT0gTlVMTCkKKwkJZ290byBvdXRfZHB1dDsKKworCWVyciA9IGluaXRfaW5vZGUoaW5vZGUsIHByb2NfZGVudHJ5KTsKKwlpZihlcnIpCisJCWdvdG8gb3V0X3B1dDsKKworCWhwcGZzX3JlYWRfaW5vZGUoaW5vZGUpOworCisgCWRfYWRkKGRlbnRyeSwgaW5vZGUpOworCWRlbnRyeS0+ZF9vcCA9ICZocHBmc19kZW50cnlfb3BzOworCXJldHVybihOVUxMKTsKKworIG91dF9wdXQ6CisJaXB1dChpbm9kZSk7Cisgb3V0X2RwdXQ6CisJZHB1dChwcm9jX2RlbnRyeSk7Cisgb3V0OgorCXJldHVybihFUlJfUFRSKGVycikpOworfQorCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgaHBwZnNfZmlsZV9pb3BzID0geworfTsKKworc3RhdGljIHNzaXplX3QgcmVhZF9wcm9jKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNzaXplX3QgY291bnQsCisJCQkgbG9mZl90ICpwcG9zLCBpbnQgaXNfdXNlcikKK3sKKwlzc2l6ZV90ICgqcmVhZCkoc3RydWN0IGZpbGUgKiwgY2hhciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKKwlzc2l6ZV90IG47CisKKwlyZWFkID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfZm9wLT5yZWFkOworCisJaWYoIWlzX3VzZXIpCisJCXNldF9mcyhLRVJORUxfRFMpOworCisJbiA9ICgqcmVhZCkoZmlsZSwgYnVmLCBjb3VudCwgJmZpbGUtPmZfcG9zKTsKKworCWlmKCFpc191c2VyKQorCQlzZXRfZnMoVVNFUl9EUyk7CisKKwlpZihwcG9zKSAqcHBvcyA9IGZpbGUtPmZfcG9zOworCXJldHVybihuKTsKK30KKworc3RhdGljIHNzaXplX3QgaHBwZnNfcmVhZF9maWxlKGludCBmZCwgY2hhciAqYnVmLCBzc2l6ZV90IGNvdW50KQoreworCXNzaXplX3QgbjsKKwlpbnQgY3VyLCBlcnI7CisJY2hhciAqbmV3X2J1ZjsKKworCW4gPSAtRU5PTUVNOworCW5ld19idWYgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYobmV3X2J1ZiA9PSBOVUxMKXsKKwkJcHJpbnRrKCJocHBmc19yZWFkX2ZpbGUgOiBrbWFsbG9jIGZhaWxlZFxuIik7CisJCWdvdG8gb3V0OworCX0KKwluID0gMDsKKwl3aGlsZShjb3VudCA+IDApeworCQljdXIgPSBtaW5fdChzc2l6ZV90LCBjb3VudCwgUEFHRV9TSVpFKTsKKwkJZXJyID0gb3NfcmVhZF9maWxlKGZkLCBuZXdfYnVmLCBjdXIpOworCQlpZihlcnIgPCAwKXsKKwkJCXByaW50aygiaHBwZnNfcmVhZCA6IHJlYWQgZmFpbGVkLCBlcnJubyA9ICVkXG4iLAorCQkJICAgICAgIGNvdW50KTsKKwkJCW4gPSBlcnI7CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisJCWVsc2UgaWYoZXJyID09IDApCisJCQlicmVhazsKKworCQlpZihjb3B5X3RvX3VzZXIoYnVmLCBuZXdfYnVmLCBlcnIpKXsKKwkJCW4gPSAtRUZBVUxUOworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCQluICs9IGVycjsKKwkJY291bnQgLT0gZXJyOworCX0KKyBvdXRfZnJlZToKKwlrZnJlZShuZXdfYnVmKTsKKyBvdXQ6CisJcmV0dXJuKG4pOworfQorCitzdGF0aWMgc3NpemVfdCBocHBmc19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwKKwkJCSAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBocHBmc19wcml2YXRlICpocHBmcyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaHBwZnNfZGF0YSAqZGF0YTsKKwlsb2ZmX3Qgb2ZmOworCWludCBlcnI7CisKKwlpZihocHBmcy0+Y29udGVudHMgIT0gTlVMTCl7CisJCWlmKCpwcG9zID49IGhwcGZzLT5sZW4pIHJldHVybigwKTsKKworCQlkYXRhID0gaHBwZnMtPmNvbnRlbnRzOworCQlvZmYgPSAqcHBvczsKKwkJd2hpbGUob2ZmID49IHNpemVvZihkYXRhLT5jb250ZW50cykpeworCQkJZGF0YSA9IGxpc3RfZW50cnkoZGF0YS0+bGlzdC5uZXh0LCBzdHJ1Y3QgaHBwZnNfZGF0YSwKKwkJCQkJICBsaXN0KTsKKwkJCW9mZiAtPSBzaXplb2YoZGF0YS0+Y29udGVudHMpOworCQl9CisKKwkJaWYob2ZmICsgY291bnQgPiBocHBmcy0+bGVuKQorCQkJY291bnQgPSBocHBmcy0+bGVuIC0gb2ZmOworCQljb3B5X3RvX3VzZXIoYnVmLCAmZGF0YS0+Y29udGVudHNbb2ZmXSwgY291bnQpOworCQkqcHBvcyArPSBjb3VudDsKKwl9CisJZWxzZSBpZihocHBmcy0+aG9zdF9mZCAhPSAtMSl7CisJCWVyciA9IG9zX3NlZWtfZmlsZShocHBmcy0+aG9zdF9mZCwgKnBwb3MpOworCQlpZihlcnIpeworCQkJcHJpbnRrKCJocHBmc19yZWFkIDogc2VlayBmYWlsZWQsIGVycm5vID0gJWRcbiIsIGVycik7CisJCQlyZXR1cm4oZXJyKTsKKwkJfQorCQljb3VudCA9IGhwcGZzX3JlYWRfZmlsZShocHBmcy0+aG9zdF9mZCwgYnVmLCBjb3VudCk7CisJCWlmKGNvdW50ID4gMCkKKwkJCSpwcG9zICs9IGNvdW50OworCX0KKwllbHNlIGNvdW50ID0gcmVhZF9wcm9jKGhwcGZzLT5wcm9jX2ZpbGUsIGJ1ZiwgY291bnQsIHBwb3MsIDEpOworCisJcmV0dXJuKGNvdW50KTsKK30KKworc3RhdGljIHNzaXplX3QgaHBwZnNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwKKwkJCSAgIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaHBwZnNfcHJpdmF0ZSAqZGF0YSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZmlsZSAqcHJvY19maWxlID0gZGF0YS0+cHJvY19maWxlOworCXNzaXplX3QgKCp3cml0ZSkoc3RydWN0IGZpbGUgKiwgY29uc3QgY2hhciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKKwlpbnQgZXJyOworCisJd3JpdGUgPSBwcm9jX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX2ZvcC0+d3JpdGU7CisKKwlwcm9jX2ZpbGUtPmZfcG9zID0gZmlsZS0+Zl9wb3M7CisJZXJyID0gKCp3cml0ZSkocHJvY19maWxlLCBidWYsIGxlbiwgJnByb2NfZmlsZS0+Zl9wb3MpOworCWZpbGUtPmZfcG9zID0gcHJvY19maWxlLT5mX3BvczsKKworCXJldHVybihlcnIpOworfQorCitzdGF0aWMgaW50IG9wZW5faG9zdF9zb2NrKGNoYXIgKmhvc3RfZmlsZSwgaW50ICpmaWx0ZXJfb3V0KQoreworCWNoYXIgKmVuZDsKKwlpbnQgZmQ7CisKKwllbmQgPSAmaG9zdF9maWxlW3N0cmxlbihob3N0X2ZpbGUpXTsKKwlzdHJjcHkoZW5kLCAiL3J3Iik7CisJKmZpbHRlcl9vdXQgPSAxOworCWZkID0gb3NfY29ubmVjdF9zb2NrZXQoaG9zdF9maWxlKTsKKwlpZihmZCA+IDApCisJCXJldHVybihmZCk7CisKKwlzdHJjcHkoZW5kLCAiL3IiKTsKKwkqZmlsdGVyX291dCA9IDA7CisJZmQgPSBvc19jb25uZWN0X3NvY2tldChob3N0X2ZpbGUpOworCXJldHVybihmZCk7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfY29udGVudHMoc3RydWN0IGhwcGZzX2RhdGEgKmhlYWQpCit7CisJc3RydWN0IGhwcGZzX2RhdGEgKmRhdGE7CisJc3RydWN0IGxpc3RfaGVhZCAqZWxlLCAqbmV4dDsKKworCWlmKGhlYWQgPT0gTlVMTCkgcmV0dXJuOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKGVsZSwgbmV4dCwgJmhlYWQtPmxpc3QpeworCQlkYXRhID0gbGlzdF9lbnRyeShlbGUsIHN0cnVjdCBocHBmc19kYXRhLCBsaXN0KTsKKwkJa2ZyZWUoZGF0YSk7CisJfQorCWtmcmVlKGhlYWQpOworfQorCitzdGF0aWMgc3RydWN0IGhwcGZzX2RhdGEgKmhwcGZzX2dldF9kYXRhKGludCBmZCwgaW50IGZpbHRlciwKKwkJCQkJIHN0cnVjdCBmaWxlICpwcm9jX2ZpbGUsCisJCQkJCSBzdHJ1Y3QgZmlsZSAqaHBwZnNfZmlsZSwKKwkJCQkJIGxvZmZfdCAqc2l6ZV9vdXQpCit7CisJc3RydWN0IGhwcGZzX2RhdGEgKmRhdGEsICpuZXcsICpoZWFkOworCWludCBuLCBlcnI7CisKKwllcnIgPSAtRU5PTUVNOworCWRhdGEgPSBrbWFsbG9jKHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOworCWlmKGRhdGEgPT0gTlVMTCl7CisJCXByaW50aygiaHBwZnNfZ2V0X2RhdGEgOiBoZWFkIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJSU5JVF9MSVNUX0hFQUQoJmRhdGEtPmxpc3QpOworCisJaGVhZCA9IGRhdGE7CisJKnNpemVfb3V0ID0gMDsKKworCWlmKGZpbHRlcil7CisJCXdoaWxlKChuID0gcmVhZF9wcm9jKHByb2NfZmlsZSwgZGF0YS0+Y29udGVudHMsCisJCQkJICAgICBzaXplb2YoZGF0YS0+Y29udGVudHMpLCBOVUxMLCAwKSkgPiAwKQorCQkJb3Nfd3JpdGVfZmlsZShmZCwgZGF0YS0+Y29udGVudHMsIG4pOworCQllcnIgPSBvc19zaHV0ZG93bl9zb2NrZXQoZmQsIDAsIDEpOworCQlpZihlcnIpeworCQkJcHJpbnRrKCJocHBmc19nZXRfZGF0YSA6IGZhaWxlZCB0byBzaHV0IGRvd24gIgorCQkJICAgICAgICJzb2NrZXRcbiIpOworCQkJZ290byBmYWlsZWRfZnJlZTsKKwkJfQorCX0KKwl3aGlsZSgxKXsKKwkJbiA9IG9zX3JlYWRfZmlsZShmZCwgZGF0YS0+Y29udGVudHMsIHNpemVvZihkYXRhLT5jb250ZW50cykpOworCQlpZihuIDwgMCl7CisJCQllcnIgPSBuOworCQkJcHJpbnRrKCJocHBmc19nZXRfZGF0YSA6IHJlYWQgZmFpbGVkLCBlcnJubyA9ICVkXG4iLAorCQkJICAgICAgIGVycik7CisJCQlnb3RvIGZhaWxlZF9mcmVlOworCQl9CisJCWVsc2UgaWYobiA9PSAwKQorCQkJYnJlYWs7CisKKwkJKnNpemVfb3V0ICs9IG47CisKKwkJaWYobiA8IHNpemVvZihkYXRhLT5jb250ZW50cykpCisJCQlicmVhazsKKworCQluZXcgPSBrbWFsbG9jKHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOworCQlpZihuZXcgPT0gMCl7CisJCQlwcmludGsoImhwcGZzX2dldF9kYXRhIDogZGF0YSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBmYWlsZWRfZnJlZTsKKwkJfQorCisJCUlOSVRfTElTVF9IRUFEKCZuZXctPmxpc3QpOworCQlsaXN0X2FkZCgmbmV3LT5saXN0LCAmZGF0YS0+bGlzdCk7CisJCWRhdGEgPSBuZXc7CisJfQorCXJldHVybihoZWFkKTsKKworIGZhaWxlZF9mcmVlOgorCWZyZWVfY29udGVudHMoaGVhZCk7CisgZmFpbGVkOgorCXJldHVybihFUlJfUFRSKGVycikpOworfQorCitzdGF0aWMgc3RydWN0IGhwcGZzX3ByaXZhdGUgKmhwcGZzX2RhdGEodm9pZCkKK3sKKwlzdHJ1Y3QgaHBwZnNfcHJpdmF0ZSAqZGF0YTsKKworCWRhdGEgPSBrbWFsbG9jKHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOworCWlmKGRhdGEgPT0gTlVMTCkKKwkJcmV0dXJuKGRhdGEpOworCisJKmRhdGEgPSAoKHN0cnVjdCBocHBmc19wcml2YXRlICkgeyAuaG9zdF9mZCAgCQk9IC0xLAorCQkJCQkgICAubGVuICAJCT0gLTEsCisJCQkJCSAgIC5jb250ZW50cyAJCT0gTlVMTCB9ICk7CisJcmV0dXJuKGRhdGEpOworfQorCitzdGF0aWMgaW50IGZpbGVfbW9kZShpbnQgZm1vZGUpCit7CisJaWYoZm1vZGUgPT0gKEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSkpCisJCXJldHVybihPX1JEV1IpOworCWlmKGZtb2RlID09IEZNT0RFX1JFQUQpCisJCXJldHVybihPX1JET05MWSk7CisJaWYoZm1vZGUgPT0gRk1PREVfV1JJVEUpCisJCXJldHVybihPX1dST05MWSk7CisJcmV0dXJuKDApOworfQorCitzdGF0aWMgaW50IGhwcGZzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGhwcGZzX3ByaXZhdGUgKmRhdGE7CisJc3RydWN0IGRlbnRyeSAqcHJvY19kZW50cnk7CisJY2hhciAqaG9zdF9maWxlOworCWludCBlcnIsIGZkLCB0eXBlLCBmaWx0ZXI7CisKKwllcnIgPSAtRU5PTUVNOworCWRhdGEgPSBocHBmc19kYXRhKCk7CisJaWYoZGF0YSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCWhvc3RfZmlsZSA9IGRlbnRyeV9uYW1lKGZpbGUtPmZfZGVudHJ5LCBzdHJsZW4oIi9ydyIpKTsKKwlpZihob3N0X2ZpbGUgPT0gTlVMTCkKKwkJZ290byBvdXRfZnJlZTI7CisKKwlwcm9jX2RlbnRyeSA9IEhQUEZTX0koaW5vZGUpLT5wcm9jX2RlbnRyeTsKKworCS8qIFhYWCBUaGlzIGlzbid0IGNsb3NlZCBhbnl3aGVyZSAqLworCWRhdGEtPnByb2NfZmlsZSA9IGRlbnRyeV9vcGVuKGRnZXQocHJvY19kZW50cnkpLCBOVUxMLAorCQkJCSAgICAgIGZpbGVfbW9kZShmaWxlLT5mX21vZGUpKTsKKwllcnIgPSBQVFJfRVJSKGRhdGEtPnByb2NfZmlsZSk7CisJaWYoSVNfRVJSKGRhdGEtPnByb2NfZmlsZSkpCisJCWdvdG8gb3V0X2ZyZWUxOworCisJdHlwZSA9IG9zX2ZpbGVfdHlwZShob3N0X2ZpbGUpOworCWlmKHR5cGUgPT0gT1NfVFlQRV9GSUxFKXsKKwkJZmQgPSBvc19vcGVuX2ZpbGUoaG9zdF9maWxlLCBvZl9yZWFkKE9QRU5GTEFHUygpKSwgMCk7CisJCWlmKGZkID49IDApCisJCQlkYXRhLT5ob3N0X2ZkID0gZmQ7CisJCWVsc2UgcHJpbnRrKCJocHBmc19vcGVuIDogZmFpbGVkIHRvIG9wZW4gJyVzJywgZXJybm8gPSAlZFxuIiwKKwkJCSAgICBob3N0X2ZpbGUsIC1mZCk7CisKKwkJZGF0YS0+Y29udGVudHMgPSBOVUxMOworCX0KKwllbHNlIGlmKHR5cGUgPT0gT1NfVFlQRV9ESVIpeworCQlmZCA9IG9wZW5faG9zdF9zb2NrKGhvc3RfZmlsZSwgJmZpbHRlcik7CisJCWlmKGZkID4gMCl7CisJCQlkYXRhLT5jb250ZW50cyA9IGhwcGZzX2dldF9kYXRhKGZkLCBmaWx0ZXIsCisJCQkJCQkJJmRhdGEtPnByb2NfZmlsZSwKKwkJCQkJCQlmaWxlLCAmZGF0YS0+bGVuKTsKKwkJCWlmKCFJU19FUlIoZGF0YS0+Y29udGVudHMpKQorCQkJCWRhdGEtPmhvc3RfZmQgPSBmZDsKKwkJfQorCQllbHNlIHByaW50aygiaHBwZnNfb3BlbiA6IGZhaWxlZCB0byBvcGVuIGEgc29ja2V0IGluICIKKwkJCSAgICAiJyVzJywgZXJybm8gPSAlZFxuIiwgaG9zdF9maWxlLCAtZmQpOworCX0KKwlrZnJlZShob3N0X2ZpbGUpOworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZGF0YTsKKwlyZXR1cm4oMCk7CisKKyBvdXRfZnJlZTE6CisJa2ZyZWUoaG9zdF9maWxlKTsKKyBvdXRfZnJlZTI6CisJZnJlZV9jb250ZW50cyhkYXRhLT5jb250ZW50cyk7CisJa2ZyZWUoZGF0YSk7Cisgb3V0OgorCXJldHVybihlcnIpOworfQorCitzdGF0aWMgaW50IGhwcGZzX2Rpcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBocHBmc19wcml2YXRlICpkYXRhOworCXN0cnVjdCBkZW50cnkgKnByb2NfZGVudHJ5OworCWludCBlcnI7CisKKwllcnIgPSAtRU5PTUVNOworCWRhdGEgPSBocHBmc19kYXRhKCk7CisJaWYoZGF0YSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCXByb2NfZGVudHJ5ID0gSFBQRlNfSShpbm9kZSktPnByb2NfZGVudHJ5OworCWRhdGEtPnByb2NfZmlsZSA9IGRlbnRyeV9vcGVuKGRnZXQocHJvY19kZW50cnkpLCBOVUxMLAorCQkJCSAgICAgIGZpbGVfbW9kZShmaWxlLT5mX21vZGUpKTsKKwllcnIgPSBQVFJfRVJSKGRhdGEtPnByb2NfZmlsZSk7CisJaWYoSVNfRVJSKGRhdGEtPnByb2NfZmlsZSkpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBkYXRhOworCXJldHVybigwKTsKKworIG91dF9mcmVlOgorCWtmcmVlKGRhdGEpOworIG91dDoKKwlyZXR1cm4oZXJyKTsKK30KKworc3RhdGljIGxvZmZfdCBocHBmc19sbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmYsIGludCB3aGVyZSkKK3sKKwlzdHJ1Y3QgaHBwZnNfcHJpdmF0ZSAqZGF0YSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZmlsZSAqcHJvY19maWxlID0gJmRhdGEtPnByb2NfZmlsZTsKKwlsb2ZmX3QgKCpsbHNlZWspKHN0cnVjdCBmaWxlICosIGxvZmZfdCwgaW50KTsKKwlsb2ZmX3QgcmV0OworCisJbGxzZWVrID0gcHJvY19maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9mb3AtPmxsc2VlazsKKwlpZihsbHNlZWsgIT0gTlVMTCl7CisJCXJldCA9ICgqbGxzZWVrKShwcm9jX2ZpbGUsIG9mZiwgd2hlcmUpOworCQlpZihyZXQgPCAwKQorCQkJcmV0dXJuKHJldCk7CisJfQorCisJcmV0dXJuKGRlZmF1bHRfbGxzZWVrKGZpbGUsIG9mZiwgd2hlcmUpKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaHBwZnNfZmlsZV9mb3BzID0geworCS5vd25lcgkJPSBOVUxMLAorCS5sbHNlZWsJCT0gaHBwZnNfbGxzZWVrLAorCS5yZWFkCQk9IGhwcGZzX3JlYWQsCisJLndyaXRlCQk9IGhwcGZzX3dyaXRlLAorCS5vcGVuCQk9IGhwcGZzX29wZW4sCit9OworCitzdHJ1Y3QgaHBwZnNfZGlyZW50IHsKKwl2b2lkICp2ZnNfZGlyZW50OworCWZpbGxkaXJfdCBmaWxsZGlyOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKK307CisKK3N0YXRpYyBpbnQgaHBwZnNfZmlsbGRpcih2b2lkICpkLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgc2l6ZSwKKwkJCSBsb2ZmX3Qgb2Zmc2V0LCBpbm9fdCBpbm9kZSwgdW5zaWduZWQgaW50IHR5cGUpCit7CisJc3RydWN0IGhwcGZzX2RpcmVudCAqZGlyZW50ID0gZDsKKworCWlmKGZpbGVfcmVtb3ZlZChkaXJlbnQtPmRlbnRyeSwgbmFtZSkpCisJCXJldHVybigwKTsKKworCXJldHVybigoKmRpcmVudC0+ZmlsbGRpcikoZGlyZW50LT52ZnNfZGlyZW50LCBuYW1lLCBzaXplLCBvZmZzZXQsCisJCQkJICBpbm9kZSwgdHlwZSkpOworfQorCitzdGF0aWMgaW50IGhwcGZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJc3RydWN0IGhwcGZzX3ByaXZhdGUgKmRhdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGZpbGUgKnByb2NfZmlsZSA9ICZkYXRhLT5wcm9jX2ZpbGU7CisJaW50ICgqcmVhZGRpcikoc3RydWN0IGZpbGUgKiwgdm9pZCAqLCBmaWxsZGlyX3QpOworCXN0cnVjdCBocHBmc19kaXJlbnQgZGlyZW50ID0gKChzdHJ1Y3QgaHBwZnNfZGlyZW50KQorCQkgICAgICAgICAgICAgICAgICAgICAgeyAudmZzX2RpcmVudCAgCT0gZW50LAorCQkJCQkuZmlsbGRpciAJPSBmaWxsZGlyLAorCQkJCQkuZGVudHJ5ICAJPSBmaWxlLT5mX2RlbnRyeSB9ICk7CisJaW50IGVycjsKKworCXJlYWRkaXIgPSBwcm9jX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX2ZvcC0+cmVhZGRpcjsKKworCXByb2NfZmlsZS0+Zl9wb3MgPSBmaWxlLT5mX3BvczsKKwllcnIgPSAoKnJlYWRkaXIpKHByb2NfZmlsZSwgJmRpcmVudCwgaHBwZnNfZmlsbGRpcik7CisJZmlsZS0+Zl9wb3MgPSBwcm9jX2ZpbGUtPmZfcG9zOworCisJcmV0dXJuKGVycik7Cit9CisKK3N0YXRpYyBpbnQgaHBwZnNfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGRhdGFzeW5jKQoreworCXJldHVybigwKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaHBwZnNfZGlyX2ZvcHMgPSB7CisJLm93bmVyCQk9IE5VTEwsCisJLnJlYWRkaXIJPSBocHBmc19yZWFkZGlyLAorCS5vcGVuCQk9IGhwcGZzX2Rpcl9vcGVuLAorCS5mc3luYwkJPSBocHBmc19mc3luYywKK307CisKK3N0YXRpYyBpbnQgaHBwZnNfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICpzZikKK3sKKwlzZi0+Zl9ibG9ja3MgPSAwOworCXNmLT5mX2JmcmVlID0gMDsKKwlzZi0+Zl9iYXZhaWwgPSAwOworCXNmLT5mX2ZpbGVzID0gMDsKKwlzZi0+Zl9mZnJlZSA9IDA7CisJc2YtPmZfdHlwZSA9IEhQUEZTX1NVUEVSX01BR0lDOworCXJldHVybigwKTsKK30KKworc3RhdGljIHN0cnVjdCBpbm9kZSAqaHBwZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgaHBwZnNfaW5vZGVfaW5mbyAqaGk7CisKKwloaSA9IGttYWxsb2Moc2l6ZW9mKCpoaSksIEdGUF9LRVJORUwpOworCWlmKGhpID09IE5VTEwpCisJCXJldHVybihOVUxMKTsKKworCSpoaSA9ICgoc3RydWN0IGhwcGZzX2lub2RlX2luZm8pIHsgLnByb2NfZGVudHJ5CT0gTlVMTCB9KTsKKwlpbm9kZV9pbml0X29uY2UoJmhpLT52ZnNfaW5vZGUpOworCXJldHVybigmaGktPnZmc19pbm9kZSk7Cit9CisKK3ZvaWQgaHBwZnNfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vKQoreworCWNsZWFyX2lub2RlKGlubyk7Cit9CisKK3N0YXRpYyB2b2lkIGhwcGZzX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlrZnJlZShIUFBGU19JKGlub2RlKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBocHBmc19zYm9wcyA9IHsKKwkuYWxsb2NfaW5vZGUJPSBocHBmc19hbGxvY19pbm9kZSwKKwkuZGVzdHJveV9pbm9kZQk9IGhwcGZzX2Rlc3Ryb3lfaW5vZGUsCisJLnJlYWRfaW5vZGUJPSBocHBmc19yZWFkX2lub2RlLAorCS5kZWxldGVfaW5vZGUJPSBocHBmc19kZWxldGVfaW5vZGUsCisJLnN0YXRmcwkJPSBocHBmc19zdGF0ZnMsCit9OworCitzdGF0aWMgaW50IGhwcGZzX3JlYWRsaW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciAqYnVmZmVyLCBpbnQgYnVmbGVuKQoreworCXN0cnVjdCBmaWxlICpwcm9jX2ZpbGU7CisJc3RydWN0IGRlbnRyeSAqcHJvY19kZW50cnk7CisJaW50ICgqcmVhZGxpbmspKHN0cnVjdCBkZW50cnkgKiwgY2hhciAqLCBpbnQpOworCWludCBlcnIsIG47CisKKwlwcm9jX2RlbnRyeSA9IEhQUEZTX0koZGVudHJ5LT5kX2lub2RlKS0+cHJvY19kZW50cnk7CisJcHJvY19maWxlID0gZGVudHJ5X29wZW4oZGdldChwcm9jX2RlbnRyeSksIE5VTEwsIE9fUkRPTkxZKTsKKwllcnIgPSBQVFJfRVJSKHByb2NfZGVudHJ5KTsKKwlpZihJU19FUlIocHJvY19kZW50cnkpKQorCQlyZXR1cm4oZXJyKTsKKworCXJlYWRsaW5rID0gcHJvY19kZW50cnktPmRfaW5vZGUtPmlfb3AtPnJlYWRsaW5rOworCW4gPSAoKnJlYWRsaW5rKShwcm9jX2RlbnRyeSwgYnVmZmVyLCBidWZsZW4pOworCisJZnB1dChwcm9jX2ZpbGUpOworCisJcmV0dXJuKG4pOworfQorCitzdGF0aWMgaW50IGhwcGZzX2ZvbGxvd19saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGZpbGUgKnByb2NfZmlsZTsKKwlzdHJ1Y3QgZGVudHJ5ICpwcm9jX2RlbnRyeTsKKwlpbnQgKCpmb2xsb3dfbGluaykoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgbmFtZWlkYXRhICopOworCWludCBlcnIsIG47CisKKwlwcm9jX2RlbnRyeSA9IEhQUEZTX0koZGVudHJ5LT5kX2lub2RlKS0+cHJvY19kZW50cnk7CisJcHJvY19maWxlID0gZGVudHJ5X29wZW4oZGdldChwcm9jX2RlbnRyeSksIE5VTEwsIE9fUkRPTkxZKTsKKwllcnIgPSBQVFJfRVJSKHByb2NfZGVudHJ5KTsKKwlpZihJU19FUlIocHJvY19kZW50cnkpKQorCQlyZXR1cm4oZXJyKTsKKworCWZvbGxvd19saW5rID0gcHJvY19kZW50cnktPmRfaW5vZGUtPmlfb3AtPmZvbGxvd19saW5rOworCW4gPSAoKmZvbGxvd19saW5rKShwcm9jX2RlbnRyeSwgbmQpOworCisJZnB1dChwcm9jX2ZpbGUpOworCisJcmV0dXJuKG4pOworfQorCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgaHBwZnNfZGlyX2lvcHMgPSB7CisJLmxvb2t1cAkJPSBocHBmc19sb29rdXAsCit9OworCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgaHBwZnNfbGlua19pb3BzID0geworCS5yZWFkbGluawk9IGhwcGZzX3JlYWRsaW5rLAorCS5mb2xsb3dfbGluawk9IGhwcGZzX2ZvbGxvd19saW5rLAorfTsKKworc3RhdGljIGludCBpbml0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpZihTX0lTRElSKGRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSl7CisJCWlub2RlLT5pX29wID0gJmhwcGZzX2Rpcl9pb3BzOworCQlpbm9kZS0+aV9mb3AgPSAmaHBwZnNfZGlyX2ZvcHM7CisJfQorCWVsc2UgaWYoU19JU0xOSyhkZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpeworCQlpbm9kZS0+aV9vcCA9ICZocHBmc19saW5rX2lvcHM7CisJCWlub2RlLT5pX2ZvcCA9ICZocHBmc19maWxlX2ZvcHM7CisJfQorCWVsc2UgeworCQlpbm9kZS0+aV9vcCA9ICZocHBmc19maWxlX2lvcHM7CisJCWlub2RlLT5pX2ZvcCA9ICZocHBmc19maWxlX2ZvcHM7CisJfQorCisJSFBQRlNfSShpbm9kZSktPnByb2NfZGVudHJ5ID0gZGVudHJ5OworCisJcmV0dXJuKDApOworfQorCitzdGF0aWMgaW50IGhwcGZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZCwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKnJvb3RfaW5vZGU7CisJc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKnByb2NmczsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnByb2Nfc2I7CisJaW50IGVycjsKKworCWVyciA9IC1FTk9FTlQ7CisJcHJvY2ZzID0gZ2V0X2ZzX3R5cGUoInByb2MiKTsKKwlpZihwcm9jZnMgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlpZihsaXN0X2VtcHR5KCZwcm9jZnMtPmZzX3N1cGVycykpCisJCWdvdG8gb3V0OworCisJcHJvY19zYiA9IGxpc3RfZW50cnkocHJvY2ZzLT5mc19zdXBlcnMubmV4dCwgc3RydWN0IHN1cGVyX2Jsb2NrLAorCQkJICAgICBzX2luc3RhbmNlcyk7CisKKwlzYi0+c19ibG9ja3NpemUgPSAxMDI0OworCXNiLT5zX2Jsb2Nrc2l6ZV9iaXRzID0gMTA7CisJc2ItPnNfbWFnaWMgPSBIUFBGU19TVVBFUl9NQUdJQzsKKwlzYi0+c19vcCA9ICZocHBmc19zYm9wczsKKworCXJvb3RfaW5vZGUgPSBpZ2V0KHNiLCAwKTsKKwlpZihyb290X2lub2RlID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJZXJyID0gaW5pdF9pbm9kZShyb290X2lub2RlLCBwcm9jX3NiLT5zX3Jvb3QpOworCWlmKGVycikKKwkJZ290byBvdXRfcHV0OworCisJZXJyID0gLUVOT01FTTsKKwlzYi0+c19yb290ID0gZF9hbGxvY19yb290KHJvb3RfaW5vZGUpOworCWlmKHNiLT5zX3Jvb3QgPT0gTlVMTCkKKwkJZ290byBvdXRfcHV0OworCisJaHBwZnNfcmVhZF9pbm9kZShyb290X2lub2RlKTsKKworCXJldHVybigwKTsKKworIG91dF9wdXQ6CisJaXB1dChyb290X2lub2RlKTsKKyBvdXQ6CisJcmV0dXJuKGVycik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmhwcGZzX3JlYWRfc3VwZXIoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKnR5cGUsCisJCQkJCSAgICAgaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwKKwkJCQkJICAgICB2b2lkICpkYXRhKQoreworCXJldHVybihnZXRfc2Jfbm9kZXYodHlwZSwgZmxhZ3MsIGRhdGEsIGhwcGZzX2ZpbGxfc3VwZXIpKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIGhwcGZzX3R5cGUgPSB7CisJLm93bmVyIAkJPSBUSElTX01PRFVMRSwKKwkubmFtZSAJCT0gImhwcGZzIiwKKwkuZ2V0X3NiIAk9IGhwcGZzX3JlYWRfc3VwZXIsCisJLmtpbGxfc2IJPSBraWxsX2Fub25fc3VwZXIsCisJLmZzX2ZsYWdzIAk9IDAsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2hwcGZzKHZvaWQpCit7CisJcmV0dXJuKHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmhwcGZzX3R5cGUpKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfaHBwZnModm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmhwcGZzX3R5cGUpOworfQorCittb2R1bGVfaW5pdChpbml0X2hwcGZzKQorbW9kdWxlX2V4aXQoZXhpdF9ocHBmcykKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoKKyAqIE92ZXJyaWRlcyBmb3IgRW1hY3Mgc28gdGhhdCB3ZSBmb2xsb3cgTGludXMncyB0YWJiaW5nIHN0eWxlLgorICogRW1hY3Mgd2lsbCBub3RpY2UgdGhpcyBzdHVmZiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBhdXRvbWF0aWNhbGx5CisgKiBhZGp1c3QgdGhlIHNldHRpbmdzIGZvciB0aGlzIGJ1ZmZlciBvbmx5LiAgVGhpcyBtdXN0IHJlbWFpbiBhdCB0aGUgZW5kCisgKiBvZiB0aGUgZmlsZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1maWxlLXN0eWxlOiAibGludXgiCisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2ZzL2h1Z2V0bGJmcy9NYWtlZmlsZSBiL2ZzL2h1Z2V0bGJmcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWRmODcwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaHVnZXRsYmZzL01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IHJhbWZzIHJvdXRpbmVzLgorIworCitvYmotJChDT05GSUdfSFVHRVRMQkZTKSArPSBodWdldGxiZnMubworCitodWdldGxiZnMtb2JqcyA6PSBpbm9kZS5vCmRpZmYgLS1naXQgYS9mcy9odWdldGxiZnMvaW5vZGUuYyBiL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZjMzMzgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9odWdldGxiZnMvaW5vZGUuYwpAQCAtMCwwICsxLDg1MyBAQAorLyoKKyAqIGh1Z2V0bGJwYWdlLWJhY2tlZCBmaWxlc3lzdGVtLiAgQmFzZWQgb24gcmFtZnMuCisgKgorICogV2lsbGlhbSBJcndpbiwgMjAwMgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBMaW51cyBUb3J2YWxkcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdGhyZWFkX2luZm8uaD4KKyNpbmNsdWRlIDxhc20vY3VycmVudC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CQkvKiByZW1vdmUgQVNBUCAqLworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9odWdldGxiLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZXZlYy5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Rub3RpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0ZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworLyogc29tZSByYW5kb20gbnVtYmVyICovCisjZGVmaW5lIEhVR0VUTEJGU19NQUdJQwkweDk1ODQ1OGY2CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBodWdldGxiZnNfb3BzOworc3RhdGljIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgaHVnZXRsYmZzX2FvcHM7CitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGh1Z2V0bGJmc19maWxlX29wZXJhdGlvbnM7CitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgaHVnZXRsYmZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGh1Z2V0bGJmc19pbm9kZV9vcGVyYXRpb25zOworCitzdGF0aWMgc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gaHVnZXRsYmZzX2JhY2tpbmdfZGV2X2luZm8gPSB7CisJLnJhX3BhZ2VzCT0gMCwJLyogTm8gcmVhZGFoZWFkICovCisJLmNhcGFiaWxpdGllcwk9IEJESV9DQVBfTk9fQUNDVF9ESVJUWSB8IEJESV9DQVBfTk9fV1JJVEVCQUNLLAorfTsKKworaW50IHN5c2N0bF9odWdldGxiX3NobV9ncm91cDsKKworc3RhdGljIGludCBodWdldGxiZnNfZmlsZV9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCWxvZmZfdCBsZW4sIHZtYV9sZW47CisJaW50IHJldDsKKworCWlmICgodm1hLT52bV9mbGFncyAmIChWTV9NQVlTSEFSRSB8IFZNX1dSSVRFKSkgPT0gVk1fV1JJVEUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHZtYS0+dm1fcGdvZmYgJiAoSFBBR0VfU0laRSAvIFBBR0VfU0laRSAtIDEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh2bWEtPnZtX3N0YXJ0ICYgfkhQQUdFX01BU0spCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHZtYS0+dm1fZW5kICYgfkhQQUdFX01BU0spCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCA8IEhQQUdFX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCisJdm1hX2xlbiA9IChsb2ZmX3QpKHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCk7CisKKwlkb3duKCZpbm9kZS0+aV9zZW0pOworCWZpbGVfYWNjZXNzZWQoZmlsZSk7CisJdm1hLT52bV9mbGFncyB8PSBWTV9IVUdFVExCIHwgVk1fUkVTRVJWRUQ7CisJdm1hLT52bV9vcHMgPSAmaHVnZXRsYl92bV9vcHM7CisKKwlyZXQgPSAtRU5PTUVNOworCWxlbiA9IHZtYV9sZW4gKyAoKGxvZmZfdCl2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQpOworCWlmICghKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkgJiYgbGVuID4gaW5vZGUtPmlfc2l6ZSkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBodWdldGxiX3ByZWZhdWx0KG1hcHBpbmcsIHZtYSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlpZiAoaW5vZGUtPmlfc2l6ZSA8IGxlbikKKwkJaW5vZGUtPmlfc2l6ZSA9IGxlbjsKK291dDoKKwl1cCgmaW5vZGUtPmlfc2VtKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBDYWxsZWQgdW5kZXIgZG93bl93cml0ZShtbWFwX3NlbSksIHBhZ2VfdGFibGVfbG9jayBpcyBub3QgaGVsZAorICovCisKKyNpZmRlZiBIQVZFX0FSQ0hfSFVHRVRMQl9VTk1BUFBFRF9BUkVBCit1bnNpZ25lZCBsb25nIGh1Z2V0bGJfZ2V0X3VubWFwcGVkX2FyZWEoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgcGdvZmYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworI2Vsc2UKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitodWdldGxiX2dldF91bm1hcHBlZF9hcmVhKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCXVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIHBnb2ZmLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisJdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyOworCisJaWYgKGxlbiAmIH5IUEFHRV9NQVNLKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAobGVuID4gVEFTS19TSVpFKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChhZGRyKSB7CisJCWFkZHIgPSBBTElHTihhZGRyLCBIUEFHRV9TSVpFKTsKKwkJdm1hID0gZmluZF92bWEobW0sIGFkZHIpOworCQlpZiAoVEFTS19TSVpFIC0gbGVuID49IGFkZHIgJiYKKwkJICAgICghdm1hIHx8IGFkZHIgKyBsZW4gPD0gdm1hLT52bV9zdGFydCkpCisJCQlyZXR1cm4gYWRkcjsKKwl9CisKKwlzdGFydF9hZGRyID0gbW0tPmZyZWVfYXJlYV9jYWNoZTsKKworZnVsbF9zZWFyY2g6CisJYWRkciA9IEFMSUdOKHN0YXJ0X2FkZHIsIEhQQUdFX1NJWkUpOworCisJZm9yICh2bWEgPSBmaW5kX3ZtYShtbSwgYWRkcik7IDsgdm1hID0gdm1hLT52bV9uZXh0KSB7CisJCS8qIEF0IHRoaXMgcG9pbnQ6ICAoIXZtYSB8fCBhZGRyIDwgdm1hLT52bV9lbmQpLiAqLworCQlpZiAoVEFTS19TSVpFIC0gbGVuIDwgYWRkcikgeworCQkJLyoKKwkJCSAqIFN0YXJ0IGEgbmV3IHNlYXJjaCAtIGp1c3QgaW4gY2FzZSB3ZSBtaXNzZWQKKwkJCSAqIHNvbWUgaG9sZXMuCisJCQkgKi8KKwkJCWlmIChzdGFydF9hZGRyICE9IFRBU0tfVU5NQVBQRURfQkFTRSkgeworCQkJCXN0YXJ0X2FkZHIgPSBUQVNLX1VOTUFQUEVEX0JBU0U7CisJCQkJZ290byBmdWxsX3NlYXJjaDsKKwkJCX0KKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJaWYgKCF2bWEgfHwgYWRkciArIGxlbiA8PSB2bWEtPnZtX3N0YXJ0KQorCQkJcmV0dXJuIGFkZHI7CisJCWFkZHIgPSBBTElHTih2bWEtPnZtX2VuZCwgSFBBR0VfU0laRSk7CisJfQorfQorI2VuZGlmCisKKy8qCisgKiBSZWFkIGEgcGFnZS4gQWdhaW4gdHJpdmlhbC4gSWYgaXQgZGlkbid0IGFscmVhZHkgZXhpc3QKKyAqIGluIHRoZSBwYWdlIGNhY2hlLCBpdCBpcyB6ZXJvLWZpbGxlZC4KKyAqLworc3RhdGljIGludCBodWdldGxiZnNfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICogcGFnZSkKK3sKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBodWdldGxiZnNfcHJlcGFyZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCXN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIHRvKQoreworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGh1Z2V0bGJmc19jb21taXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQlzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCB0bykKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQgaHVnZV9wYWdldmVjX3JlbGVhc2Uoc3RydWN0IHBhZ2V2ZWMgKnB2ZWMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXZlY19jb3VudChwdmVjKTsgKytpKQorCQlwdXRfcGFnZShwdmVjLT5wYWdlc1tpXSk7CisKKwlwYWdldmVjX3JlaW5pdChwdmVjKTsKK30KKworc3RhdGljIHZvaWQgdHJ1bmNhdGVfaHVnZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQoreworCWNsZWFyX3BhZ2VfZGlydHkocGFnZSk7CisJQ2xlYXJQYWdlVXB0b2RhdGUocGFnZSk7CisJcmVtb3ZlX2Zyb21fcGFnZV9jYWNoZShwYWdlKTsKKwlwdXRfcGFnZShwYWdlKTsKK30KKworc3RhdGljIHZvaWQgdHJ1bmNhdGVfaHVnZXBhZ2VzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBsb2ZmX3QgbHN0YXJ0KQoreworCWNvbnN0IHBnb2ZmX3Qgc3RhcnQgPSBsc3RhcnQgPj4gSFBBR0VfU0hJRlQ7CisJc3RydWN0IHBhZ2V2ZWMgcHZlYzsKKwlwZ29mZl90IG5leHQ7CisJaW50IGk7CisKKwlwYWdldmVjX2luaXQoJnB2ZWMsIDApOworCW5leHQgPSBzdGFydDsKKwl3aGlsZSAoMSkgeworCQlpZiAoIXBhZ2V2ZWNfbG9va3VwKCZwdmVjLCBtYXBwaW5nLCBuZXh0LCBQQUdFVkVDX1NJWkUpKSB7CisJCQlpZiAobmV4dCA9PSBzdGFydCkKKwkJCQlicmVhazsKKwkJCW5leHQgPSBzdGFydDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IHBhZ2V2ZWNfY291bnQoJnB2ZWMpOyArK2kpIHsKKwkJCXN0cnVjdCBwYWdlICpwYWdlID0gcHZlYy5wYWdlc1tpXTsKKworCQkJbG9ja19wYWdlKHBhZ2UpOworCQkJaWYgKHBhZ2UtPmluZGV4ID4gbmV4dCkKKwkJCQluZXh0ID0gcGFnZS0+aW5kZXg7CisJCQkrK25leHQ7CisJCQl0cnVuY2F0ZV9odWdlX3BhZ2UocGFnZSk7CisJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCWh1Z2V0bGJfcHV0X3F1b3RhKG1hcHBpbmcpOworCQl9CisJCWh1Z2VfcGFnZXZlY19yZWxlYXNlKCZwdmVjKTsKKwl9CisJQlVHX09OKCFsc3RhcnQgJiYgbWFwcGluZy0+bnJwYWdlcyk7Cit9CisKK3N0YXRpYyB2b2lkIGh1Z2V0bGJmc19kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgaHVnZXRsYmZzX3NiX2luZm8gKnNiaW5mbyA9IEhVR0VUTEJGU19TQihpbm9kZS0+aV9zYik7CisKKwlobGlzdF9kZWxfaW5pdCgmaW5vZGUtPmlfaGFzaCk7CisJbGlzdF9kZWxfaW5pdCgmaW5vZGUtPmlfbGlzdCk7CisJbGlzdF9kZWxfaW5pdCgmaW5vZGUtPmlfc2JfbGlzdCk7CisJaW5vZGUtPmlfc3RhdGUgfD0gSV9GUkVFSU5HOworCWlub2Rlc19zdGF0Lm5yX2lub2Rlcy0tOworCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKKworCWlmIChpbm9kZS0+aV9kYXRhLm5ycGFnZXMpCisJCXRydW5jYXRlX2h1Z2VwYWdlcygmaW5vZGUtPmlfZGF0YSwgMCk7CisKKwlzZWN1cml0eV9pbm9kZV9kZWxldGUoaW5vZGUpOworCisJaWYgKHNiaW5mby0+ZnJlZV9pbm9kZXMgPj0gMCkgeworCQlzcGluX2xvY2soJnNiaW5mby0+c3RhdF9sb2NrKTsKKwkJc2JpbmZvLT5mcmVlX2lub2RlcysrOworCQlzcGluX3VubG9jaygmc2JpbmZvLT5zdGF0X2xvY2spOworCX0KKworCWNsZWFyX2lub2RlKGlub2RlKTsKKwlkZXN0cm95X2lub2RlKGlub2RlKTsKK30KKworc3RhdGljIHZvaWQgaHVnZXRsYmZzX2ZvcmdldF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc3VwZXJfYmxvY2sgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgaHVnZXRsYmZzX3NiX2luZm8gKnNiaW5mbyA9IEhVR0VUTEJGU19TQihzdXBlcl9ibG9jayk7CisKKwlpZiAoaGxpc3RfdW5oYXNoZWQoJmlub2RlLT5pX2hhc2gpKQorCQlnb3RvIG91dF90cnVuY2F0ZTsKKworCWlmICghKGlub2RlLT5pX3N0YXRlICYgKElfRElSVFl8SV9MT0NLKSkpIHsKKwkJbGlzdF9kZWwoJmlub2RlLT5pX2xpc3QpOworCQlsaXN0X2FkZCgmaW5vZGUtPmlfbGlzdCwgJmlub2RlX3VudXNlZCk7CisJfQorCWlub2Rlc19zdGF0Lm5yX3VudXNlZCsrOworCWlmICghc3VwZXJfYmxvY2sgfHwgKHN1cGVyX2Jsb2NrLT5zX2ZsYWdzICYgTVNfQUNUSVZFKSkgeworCQlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CisJCXJldHVybjsKKwl9CisKKwkvKiB3cml0ZV9pbm9kZV9ub3coKSA/ICovCisJaW5vZGVzX3N0YXQubnJfdW51c2VkLS07CisJaGxpc3RfZGVsX2luaXQoJmlub2RlLT5pX2hhc2gpOworb3V0X3RydW5jYXRlOgorCWxpc3RfZGVsX2luaXQoJmlub2RlLT5pX2xpc3QpOworCWxpc3RfZGVsX2luaXQoJmlub2RlLT5pX3NiX2xpc3QpOworCWlub2RlLT5pX3N0YXRlIHw9IElfRlJFRUlORzsKKwlpbm9kZXNfc3RhdC5ucl9pbm9kZXMtLTsKKwlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CisJaWYgKGlub2RlLT5pX2RhdGEubnJwYWdlcykKKwkJdHJ1bmNhdGVfaHVnZXBhZ2VzKCZpbm9kZS0+aV9kYXRhLCAwKTsKKworCWlmIChzYmluZm8tPmZyZWVfaW5vZGVzID49IDApIHsKKwkJc3Bpbl9sb2NrKCZzYmluZm8tPnN0YXRfbG9jayk7CisJCXNiaW5mby0+ZnJlZV9pbm9kZXMrKzsKKwkJc3Bpbl91bmxvY2soJnNiaW5mby0+c3RhdF9sb2NrKTsKKwl9CisKKwljbGVhcl9pbm9kZShpbm9kZSk7CisJZGVzdHJveV9pbm9kZShpbm9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIGh1Z2V0bGJmc19kcm9wX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaWYgKCFpbm9kZS0+aV9ubGluaykKKwkJaHVnZXRsYmZzX2RlbGV0ZV9pbm9kZShpbm9kZSk7CisJZWxzZQorCQlodWdldGxiZnNfZm9yZ2V0X2lub2RlKGlub2RlKTsKK30KKworLyoKKyAqIGhfcGdvZmYgaXMgaW4gSFBBR0VfU0laRSB1bml0cy4KKyAqIHZtYS0+dm1fcGdvZmYgaXMgaW4gUEFHRV9TSVpFIHVuaXRzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2h1Z2V0bGJfdm10cnVuY2F0ZV9saXN0KHN0cnVjdCBwcmlvX3RyZWVfcm9vdCAqcm9vdCwgdW5zaWduZWQgbG9uZyBoX3Bnb2ZmKQoreworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCXN0cnVjdCBwcmlvX3RyZWVfaXRlciBpdGVyOworCisJdm1hX3ByaW9fdHJlZV9mb3JlYWNoKHZtYSwgJml0ZXIsIHJvb3QsIGhfcGdvZmYsIFVMT05HX01BWCkgeworCQl1bnNpZ25lZCBsb25nIGhfdm1fcGdvZmY7CisJCXVuc2lnbmVkIGxvbmcgdl9sZW5ndGg7CisJCXVuc2lnbmVkIGxvbmcgdl9vZmZzZXQ7CisKKwkJaF92bV9wZ29mZiA9IHZtYS0+dm1fcGdvZmYgPj4gKEhQQUdFX1NISUZUIC0gUEFHRV9TSElGVCk7CisJCXZfb2Zmc2V0ID0gKGhfcGdvZmYgLSBoX3ZtX3Bnb2ZmKSA8PCBIUEFHRV9TSElGVDsKKwkJLyoKKwkJICogSXMgdGhpcyBWTUEgZnVsbHkgb3V0c2lkZSB0aGUgdHJ1bmNhdGlvbiBwb2ludD8KKwkJICovCisJCWlmIChoX3ZtX3Bnb2ZmID49IGhfcGdvZmYpCisJCQl2X29mZnNldCA9IDA7CisKKwkJdl9sZW5ndGggPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CisKKwkJemFwX2h1Z2VwYWdlX3JhbmdlKHZtYSwKKwkJCQl2bWEtPnZtX3N0YXJ0ICsgdl9vZmZzZXQsCisJCQkJdl9sZW5ndGggLSB2X29mZnNldCk7CisJfQorfQorCisvKgorICogRXhwYW5kaW5nIHRydW5jYXRlcyBhcmUgbm90IGFsbG93ZWQuCisgKi8KK3N0YXRpYyBpbnQgaHVnZXRsYl92bXRydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBvZmZzZXQpCit7CisJdW5zaWduZWQgbG9uZyBwZ29mZjsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisKKwlpZiAob2Zmc2V0ID4gaW5vZGUtPmlfc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlCVUdfT04ob2Zmc2V0ICYgfkhQQUdFX01BU0spOworCXBnb2ZmID0gb2Zmc2V0ID4+IEhQQUdFX1NISUZUOworCisJaW5vZGUtPmlfc2l6ZSA9IG9mZnNldDsKKwlzcGluX2xvY2soJm1hcHBpbmctPmlfbW1hcF9sb2NrKTsKKwlpZiAoIXByaW9fdHJlZV9lbXB0eSgmbWFwcGluZy0+aV9tbWFwKSkKKwkJaHVnZXRsYl92bXRydW5jYXRlX2xpc3QoJm1hcHBpbmctPmlfbW1hcCwgcGdvZmYpOworCXNwaW5fdW5sb2NrKCZtYXBwaW5nLT5pX21tYXBfbG9jayk7CisJdHJ1bmNhdGVfaHVnZXBhZ2VzKG1hcHBpbmcsIG9mZnNldCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHVnZXRsYmZzX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmF0dHIpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgZXJyb3I7CisJdW5zaWduZWQgaW50IGlhX3ZhbGlkID0gYXR0ci0+aWFfdmFsaWQ7CisKKwlCVUdfT04oIWlub2RlKTsKKworCWVycm9yID0gaW5vZGVfY2hhbmdlX29rKGlub2RlLCBhdHRyKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCisJaWYgKGlhX3ZhbGlkICYgQVRUUl9TSVpFKSB7CisJCWVycm9yID0gLUVJTlZBTDsKKwkJaWYgKCEoYXR0ci0+aWFfc2l6ZSAmIH5IUEFHRV9NQVNLKSkKKwkJCWVycm9yID0gaHVnZXRsYl92bXRydW5jYXRlKGlub2RlLCBhdHRyLT5pYV9zaXplKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXQ7CisJCWF0dHItPmlhX3ZhbGlkICY9IH5BVFRSX1NJWkU7CisJfQorCWVycm9yID0gaW5vZGVfc2V0YXR0cihpbm9kZSwgYXR0cik7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgc3RydWN0IGlub2RlICpodWdldGxiZnNfZ2V0X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVpZF90IHVpZCwgCisJCQkJCWdpZF90IGdpZCwgaW50IG1vZGUsIGRldl90IGRldikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBodWdldGxiZnNfc2JfaW5mbyAqc2JpbmZvID0gSFVHRVRMQkZTX1NCKHNiKTsKKworCWlmIChzYmluZm8tPmZyZWVfaW5vZGVzID49IDApIHsKKwkJc3Bpbl9sb2NrKCZzYmluZm8tPnN0YXRfbG9jayk7CisJCWlmICghc2JpbmZvLT5mcmVlX2lub2RlcykgeworCQkJc3Bpbl91bmxvY2soJnNiaW5mby0+c3RhdF9sb2NrKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXNiaW5mby0+ZnJlZV9pbm9kZXMtLTsKKwkJc3Bpbl91bmxvY2soJnNiaW5mby0+c3RhdF9sb2NrKTsKKwl9CisKKwlpbm9kZSA9IG5ld19pbm9kZShzYik7CisJaWYgKGlub2RlKSB7CisJCXN0cnVjdCBodWdldGxiZnNfaW5vZGVfaW5mbyAqaW5mbzsKKwkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisJCWlub2RlLT5pX3VpZCA9IHVpZDsKKwkJaW5vZGUtPmlfZ2lkID0gZ2lkOworCQlpbm9kZS0+aV9ibGtzaXplID0gSFBBR0VfU0laRTsKKwkJaW5vZGUtPmlfYmxvY2tzID0gMDsKKwkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmaHVnZXRsYmZzX2FvcHM7CisJCWlub2RlLT5pX21hcHBpbmctPmJhY2tpbmdfZGV2X2luZm8gPSZodWdldGxiZnNfYmFja2luZ19kZXZfaW5mbzsKKwkJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCQlpbmZvID0gSFVHRVRMQkZTX0koaW5vZGUpOworCQltcG9sX3NoYXJlZF9wb2xpY3lfaW5pdCgmaW5mby0+cG9saWN5KTsKKwkJc3dpdGNoIChtb2RlICYgU19JRk1UKSB7CisJCWRlZmF1bHQ6CisJCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIG1vZGUsIGRldik7CisJCQlicmVhazsKKwkJY2FzZSBTX0lGUkVHOgorCQkJaW5vZGUtPmlfb3AgPSAmaHVnZXRsYmZzX2lub2RlX29wZXJhdGlvbnM7CisJCQlpbm9kZS0+aV9mb3AgPSAmaHVnZXRsYmZzX2ZpbGVfb3BlcmF0aW9uczsKKwkJCWJyZWFrOworCQljYXNlIFNfSUZESVI6CisJCQlpbm9kZS0+aV9vcCA9ICZodWdldGxiZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJCQlpbm9kZS0+aV9mb3AgPSAmc2ltcGxlX2Rpcl9vcGVyYXRpb25zOworCisJCQkvKiBkaXJlY3RvcnkgaW5vZGVzIHN0YXJ0IG9mZiB3aXRoIGlfbmxpbmsgPT0gMiAoZm9yICIuIiBlbnRyeSkgKi8KKwkJCWlub2RlLT5pX25saW5rKys7CisJCQlicmVhazsKKwkJY2FzZSBTX0lGTE5LOgorCQkJaW5vZGUtPmlfb3AgPSAmcGFnZV9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gaW5vZGU7Cit9CisKKy8qCisgKiBGaWxlIGNyZWF0aW9uLiBBbGxvY2F0ZSBhbiBpbm9kZSwgYW5kIHdlJ3JlIGRvbmUuLgorICovCitzdGF0aWMgaW50IGh1Z2V0bGJmc19ta25vZChzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsIGRldl90IGRldikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWludCBlcnJvciA9IC1FTk9TUEM7CisJZ2lkX3QgZ2lkOworCisJaWYgKGRpci0+aV9tb2RlICYgU19JU0dJRCkgeworCQlnaWQgPSBkaXItPmlfZ2lkOworCQlpZiAoU19JU0RJUihtb2RlKSkKKwkJCW1vZGUgfD0gU19JU0dJRDsKKwl9IGVsc2UgeworCQlnaWQgPSBjdXJyZW50LT5mc2dpZDsKKwl9CisJaW5vZGUgPSBodWdldGxiZnNfZ2V0X2lub2RlKGRpci0+aV9zYiwgY3VycmVudC0+ZnN1aWQsIGdpZCwgbW9kZSwgZGV2KTsKKwlpZiAoaW5vZGUpIHsKKwkJZGlyLT5pX2N0aW1lID0gZGlyLT5pX210aW1lID0gQ1VSUkVOVF9USU1FOworCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCQlkZ2V0KGRlbnRyeSk7CS8qIEV4dHJhIGNvdW50IC0gcGluIHRoZSBkZW50cnkgaW4gY29yZSAqLworCQllcnJvciA9IDA7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBodWdldGxiZnNfbWtkaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpCit7CisJaW50IHJldHZhbCA9IGh1Z2V0bGJmc19ta25vZChkaXIsIGRlbnRyeSwgbW9kZSB8IFNfSUZESVIsIDApOworCWlmICghcmV0dmFsKQorCQlkaXItPmlfbmxpbmsrKzsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGh1Z2V0bGJmc19jcmVhdGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXJldHVybiBodWdldGxiZnNfbWtub2QoZGlyLCBkZW50cnksIG1vZGUgfCBTX0lGUkVHLCAwKTsKK30KKworc3RhdGljIGludCBodWdldGxiZnNfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKmRpciwKKwkJCXN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqc3ltbmFtZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWludCBlcnJvciA9IC1FTk9TUEM7CisJZ2lkX3QgZ2lkOworCisJaWYgKGRpci0+aV9tb2RlICYgU19JU0dJRCkKKwkJZ2lkID0gZGlyLT5pX2dpZDsKKwllbHNlCisJCWdpZCA9IGN1cnJlbnQtPmZzZ2lkOworCisJaW5vZGUgPSBodWdldGxiZnNfZ2V0X2lub2RlKGRpci0+aV9zYiwgY3VycmVudC0+ZnN1aWQsCisJCQkJCWdpZCwgU19JRkxOS3xTX0lSV1hVR08sIDApOworCWlmIChpbm9kZSkgeworCQlpbnQgbCA9IHN0cmxlbihzeW1uYW1lKSsxOworCQllcnJvciA9IHBhZ2Vfc3ltbGluayhpbm9kZSwgc3ltbmFtZSwgbCk7CisJCWlmICghZXJyb3IpIHsKKwkJCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJCQlkZ2V0KGRlbnRyeSk7CisJCX0gZWxzZQorCQkJaXB1dChpbm9kZSk7CisJfQorCWRpci0+aV9jdGltZSA9IGRpci0+aV9tdGltZSA9IENVUlJFTlRfVElNRTsKKworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIEZvciBkaXJlY3QtSU8gcmVhZHMgaW50byBodWdldGxiIHBhZ2VzCisgKi8KK3N0YXRpYyBpbnQgaHVnZXRsYmZzX3NldF9wYWdlX2RpcnR5KHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGh1Z2V0bGJmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK3sKKwlzdHJ1Y3QgaHVnZXRsYmZzX3NiX2luZm8gKnNiaW5mbyA9IEhVR0VUTEJGU19TQihzYik7CisKKwlidWYtPmZfdHlwZSA9IEhVR0VUTEJGU19NQUdJQzsKKwlidWYtPmZfYnNpemUgPSBIUEFHRV9TSVpFOworCWlmIChzYmluZm8pIHsKKwkJc3Bpbl9sb2NrKCZzYmluZm8tPnN0YXRfbG9jayk7CisJCWJ1Zi0+Zl9ibG9ja3MgPSBzYmluZm8tPm1heF9ibG9ja3M7CisJCWJ1Zi0+Zl9iYXZhaWwgPSBidWYtPmZfYmZyZWUgPSBzYmluZm8tPmZyZWVfYmxvY2tzOworCQlidWYtPmZfZmlsZXMgPSBzYmluZm8tPm1heF9pbm9kZXM7CisJCWJ1Zi0+Zl9mZnJlZSA9IHNiaW5mby0+ZnJlZV9pbm9kZXM7CisJCXNwaW5fdW5sb2NrKCZzYmluZm8tPnN0YXRfbG9jayk7CisJfQorCWJ1Zi0+Zl9uYW1lbGVuID0gTkFNRV9NQVg7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGh1Z2V0bGJmc19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgaHVnZXRsYmZzX3NiX2luZm8gKnNiaSA9IEhVR0VUTEJGU19TQihzYik7CisKKwlpZiAoc2JpKSB7CisJCXNiLT5zX2ZzX2luZm8gPSBOVUxMOworCQlrZnJlZShzYmkpOworCX0KK30KKworc3RhdGljIGttZW1fY2FjaGVfdCAqaHVnZXRsYmZzX2lub2RlX2NhY2hlcDsKKworc3RhdGljIHN0cnVjdCBpbm9kZSAqaHVnZXRsYmZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGh1Z2V0bGJmc19pbm9kZV9pbmZvICpwOworCisJcCA9IGttZW1fY2FjaGVfYWxsb2MoaHVnZXRsYmZzX2lub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCWlmICghcCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuICZwLT52ZnNfaW5vZGU7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICpmb28sIGttZW1fY2FjaGVfdCAqY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBodWdldGxiZnNfaW5vZGVfaW5mbyAqZWkgPSAoc3RydWN0IGh1Z2V0bGJmc19pbm9kZV9pbmZvICopZm9vOworCisJaWYgKChmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CisJICAgIFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikKKwkJaW5vZGVfaW5pdF9vbmNlKCZlaS0+dmZzX2lub2RlKTsKK30KKworc3RhdGljIHZvaWQgaHVnZXRsYmZzX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwltcG9sX2ZyZWVfc2hhcmVkX3BvbGljeSgmSFVHRVRMQkZTX0koaW5vZGUpLT5wb2xpY3kpOworCWttZW1fY2FjaGVfZnJlZShodWdldGxiZnNfaW5vZGVfY2FjaGVwLCBIVUdFVExCRlNfSShpbm9kZSkpOworfQorCitzdGF0aWMgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBodWdldGxiZnNfYW9wcyA9IHsKKwkucmVhZHBhZ2UJPSBodWdldGxiZnNfcmVhZHBhZ2UsCisJLnByZXBhcmVfd3JpdGUJPSBodWdldGxiZnNfcHJlcGFyZV93cml0ZSwKKwkuY29tbWl0X3dyaXRlCT0gaHVnZXRsYmZzX2NvbW1pdF93cml0ZSwKKwkuc2V0X3BhZ2VfZGlydHkJPSBodWdldGxiZnNfc2V0X3BhZ2VfZGlydHksCit9OworCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGh1Z2V0bGJmc19maWxlX29wZXJhdGlvbnMgPSB7CisJLm1tYXAJCQk9IGh1Z2V0bGJmc19maWxlX21tYXAsCisJLmZzeW5jCQkJPSBzaW1wbGVfc3luY19maWxlLAorCS5nZXRfdW5tYXBwZWRfYXJlYQk9IGh1Z2V0bGJfZ2V0X3VubWFwcGVkX2FyZWEsCit9OworCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgaHVnZXRsYmZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0geworCS5jcmVhdGUJCT0gaHVnZXRsYmZzX2NyZWF0ZSwKKwkubG9va3VwCQk9IHNpbXBsZV9sb29rdXAsCisJLmxpbmsJCT0gc2ltcGxlX2xpbmssCisJLnVubGluawkJPSBzaW1wbGVfdW5saW5rLAorCS5zeW1saW5rCT0gaHVnZXRsYmZzX3N5bWxpbmssCisJLm1rZGlyCQk9IGh1Z2V0bGJmc19ta2RpciwKKwkucm1kaXIJCT0gc2ltcGxlX3JtZGlyLAorCS5ta25vZAkJPSBodWdldGxiZnNfbWtub2QsCisJLnJlbmFtZQkJPSBzaW1wbGVfcmVuYW1lLAorCS5zZXRhdHRyCT0gaHVnZXRsYmZzX3NldGF0dHIsCit9OworCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgaHVnZXRsYmZzX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnNldGF0dHIJPSBodWdldGxiZnNfc2V0YXR0ciwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBodWdldGxiZnNfb3BzID0geworCS5hbGxvY19pbm9kZSAgICA9IGh1Z2V0bGJmc19hbGxvY19pbm9kZSwKKwkuZGVzdHJveV9pbm9kZSAgPSBodWdldGxiZnNfZGVzdHJveV9pbm9kZSwKKwkuc3RhdGZzCQk9IGh1Z2V0bGJmc19zdGF0ZnMsCisJLmRyb3BfaW5vZGUJPSBodWdldGxiZnNfZHJvcF9pbm9kZSwKKwkucHV0X3N1cGVyCT0gaHVnZXRsYmZzX3B1dF9zdXBlciwKK307CisKK3N0YXRpYyBpbnQKK2h1Z2V0bGJmc19wYXJzZV9vcHRpb25zKGNoYXIgKm9wdGlvbnMsIHN0cnVjdCBodWdldGxiZnNfY29uZmlnICpwY29uZmlnKQoreworCWNoYXIgKm9wdCwgKnZhbHVlLCAqcmVzdDsKKworCWlmICghb3B0aW9ucykKKwkJcmV0dXJuIDA7CisJd2hpbGUgKChvcHQgPSBzdHJzZXAoJm9wdGlvbnMsICIsIikpICE9IE5VTEwpIHsKKwkJaWYgKCEqb3B0KQorCQkJY29udGludWU7CisKKwkJdmFsdWUgPSBzdHJjaHIob3B0LCAnPScpOworCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZWxzZQorCQkJKnZhbHVlKysgPSAnXDAnOworCisJCWlmICghc3RyY21wKG9wdCwgInVpZCIpKQorCQkJcGNvbmZpZy0+dWlkID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsICZ2YWx1ZSwgMCk7CisJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAiZ2lkIikpCisJCQlwY29uZmlnLT5naWQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgJnZhbHVlLCAwKTsKKwkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJtb2RlIikpCisJCQlwY29uZmlnLT5tb2RlID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsJnZhbHVlLDApICYgMDc3N1U7CisJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAic2l6ZSIpKSB7CisJCQl1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZSA9IG1lbXBhcnNlKHZhbHVlLCAmcmVzdCk7CisJCQlpZiAoKnJlc3QgPT0gJyUnKSB7CisJCQkJc2l6ZSA8PD0gSFBBR0VfU0hJRlQ7CisJCQkJc2l6ZSAqPSBtYXhfaHVnZV9wYWdlczsKKwkJCQlkb19kaXYoc2l6ZSwgMTAwKTsKKwkJCQlyZXN0Kys7CisJCQl9CisJCQlzaXplICY9IEhQQUdFX01BU0s7CisJCQlwY29uZmlnLT5ucl9ibG9ja3MgPSAoc2l6ZSA+PiBIUEFHRV9TSElGVCk7CisJCQl2YWx1ZSA9IHJlc3Q7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChvcHQsIm5yX2lub2RlcyIpKSB7CisJCQlwY29uZmlnLT5ucl9pbm9kZXMgPSBtZW1wYXJzZSh2YWx1ZSwgJnJlc3QpOworCQkJdmFsdWUgPSByZXN0OworCQl9IGVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmICgqdmFsdWUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2h1Z2V0bGJmc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCit7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJc3RydWN0IGRlbnRyeSAqIHJvb3Q7CisJaW50IHJldDsKKwlzdHJ1Y3QgaHVnZXRsYmZzX2NvbmZpZyBjb25maWc7CisJc3RydWN0IGh1Z2V0bGJmc19zYl9pbmZvICpzYmluZm87CisKKwljb25maWcubnJfYmxvY2tzID0gLTE7IC8qIE5vIGxpbWl0IG9uIHNpemUgYnkgZGVmYXVsdCAqLworCWNvbmZpZy5ucl9pbm9kZXMgPSAtMTsgLyogTm8gbGltaXQgb24gbnVtYmVyIG9mIGlub2RlcyBieSBkZWZhdWx0ICovCisJY29uZmlnLnVpZCA9IGN1cnJlbnQtPmZzdWlkOworCWNvbmZpZy5naWQgPSBjdXJyZW50LT5mc2dpZDsKKwljb25maWcubW9kZSA9IDA3NTU7CisJcmV0ID0gaHVnZXRsYmZzX3BhcnNlX29wdGlvbnMoZGF0YSwgJmNvbmZpZyk7CisKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJc2JpbmZvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGh1Z2V0bGJmc19zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYmluZm8pCisJCXJldHVybiAtRU5PTUVNOworCXNiLT5zX2ZzX2luZm8gPSBzYmluZm87CisJc3Bpbl9sb2NrX2luaXQoJnNiaW5mby0+c3RhdF9sb2NrKTsKKwlzYmluZm8tPm1heF9ibG9ja3MgPSBjb25maWcubnJfYmxvY2tzOworCXNiaW5mby0+ZnJlZV9ibG9ja3MgPSBjb25maWcubnJfYmxvY2tzOworCXNiaW5mby0+bWF4X2lub2RlcyA9IGNvbmZpZy5ucl9pbm9kZXM7CisJc2JpbmZvLT5mcmVlX2lub2RlcyA9IGNvbmZpZy5ucl9pbm9kZXM7CisJc2ItPnNfbWF4Ynl0ZXMgPSBNQVhfTEZTX0ZJTEVTSVpFOworCXNiLT5zX2Jsb2Nrc2l6ZSA9IEhQQUdFX1NJWkU7CisJc2ItPnNfYmxvY2tzaXplX2JpdHMgPSBIUEFHRV9TSElGVDsKKwlzYi0+c19tYWdpYyA9IEhVR0VUTEJGU19NQUdJQzsKKwlzYi0+c19vcCA9ICZodWdldGxiZnNfb3BzOworCXNiLT5zX3RpbWVfZ3JhbiA9IDE7CisJaW5vZGUgPSBodWdldGxiZnNfZ2V0X2lub2RlKHNiLCBjb25maWcudWlkLCBjb25maWcuZ2lkLAorCQkJCQlTX0lGRElSIHwgY29uZmlnLm1vZGUsIDApOworCWlmICghaW5vZGUpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlyb290ID0gZF9hbGxvY19yb290KGlub2RlKTsKKwlpZiAoIXJvb3QpIHsKKwkJaXB1dChpbm9kZSk7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCXNiLT5zX3Jvb3QgPSByb290OworCXJldHVybiAwOworb3V0X2ZyZWU6CisJa2ZyZWUoc2JpbmZvKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworaW50IGh1Z2V0bGJfZ2V0X3F1b3RhKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBodWdldGxiZnNfc2JfaW5mbyAqc2JpbmZvID0gSFVHRVRMQkZTX1NCKG1hcHBpbmctPmhvc3QtPmlfc2IpOworCisJaWYgKHNiaW5mby0+ZnJlZV9ibG9ja3MgPiAtMSkgeworCQlzcGluX2xvY2soJnNiaW5mby0+c3RhdF9sb2NrKTsKKwkJaWYgKHNiaW5mby0+ZnJlZV9ibG9ja3MgPiAwKQorCQkJc2JpbmZvLT5mcmVlX2Jsb2Nrcy0tOworCQllbHNlCisJCQlyZXQgPSAtRU5PTUVNOworCQlzcGluX3VubG9jaygmc2JpbmZvLT5zdGF0X2xvY2spOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgaHVnZXRsYl9wdXRfcXVvdGEoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcpCit7CisJc3RydWN0IGh1Z2V0bGJmc19zYl9pbmZvICpzYmluZm8gPSBIVUdFVExCRlNfU0IobWFwcGluZy0+aG9zdC0+aV9zYik7CisKKwlpZiAoc2JpbmZvLT5mcmVlX2Jsb2NrcyA+IC0xKSB7CisJCXNwaW5fbG9jaygmc2JpbmZvLT5zdGF0X2xvY2spOworCQlzYmluZm8tPmZyZWVfYmxvY2tzKys7CisJCXNwaW5fdW5sb2NrKCZzYmluZm8tPnN0YXRfbG9jayk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpodWdldGxiZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9ub2Rldihmc190eXBlLCBmbGFncywgZGF0YSwgaHVnZXRsYmZzX2ZpbGxfc3VwZXIpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgaHVnZXRsYmZzX2ZzX3R5cGUgPSB7CisJLm5hbWUJCT0gImh1Z2V0bGJmcyIsCisJLmdldF9zYgkJPSBodWdldGxiZnNfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9saXR0ZXJfc3VwZXIsCit9OworCitzdGF0aWMgc3RydWN0IHZmc21vdW50ICpodWdldGxiZnNfdmZzbW91bnQ7CisKKy8qCisgKiBSZXR1cm4gdGhlIG5leHQgaWRlbnRpZmllciBmb3IgYSBzaG0gZmlsZQorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBodWdldGxiZnNfY291bnRlcih2b2lkKQoreworCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG9jayk7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgY291bnRlcjsKKwl1bnNpZ25lZCBsb25nIHJldDsKKworCXNwaW5fbG9jaygmbG9jayk7CisJcmV0ID0gKytjb3VudGVyOworCXNwaW5fdW5sb2NrKCZsb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNhbl9kb19odWdldGxiX3NobSh2b2lkKQoreworCXJldHVybiBsaWtlbHkoY2FwYWJsZShDQVBfSVBDX0xPQ0spIHx8CisJCQlpbl9ncm91cF9wKHN5c2N0bF9odWdldGxiX3NobV9ncm91cCkgfHwKKwkJCWNhbl9kb19tbG9jaygpKTsKK30KKworc3RydWN0IGZpbGUgKmh1Z2V0bGJfemVyb19zZXR1cChzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgZXJyb3IgPSAtRU5PTUVNOworCXN0cnVjdCBmaWxlICpmaWxlOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5LCAqcm9vdDsKKwlzdHJ1Y3QgcXN0ciBxdWlja19zdHJpbmc7CisJY2hhciBidWZbMTZdOworCisJaWYgKCFjYW5fZG9faHVnZXRsYl9zaG0oKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVQRVJNKTsKKworCWlmICghaXNfaHVnZXBhZ2VfbWVtX2Vub3VnaChzaXplKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlpZiAoIXVzZXJfc2htX2xvY2soc2l6ZSwgY3VycmVudC0+dXNlcikpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJcm9vdCA9IGh1Z2V0bGJmc192ZnNtb3VudC0+bW50X3Jvb3Q7CisJc25wcmludGYoYnVmLCAxNiwgIiVsdSIsIGh1Z2V0bGJmc19jb3VudGVyKCkpOworCXF1aWNrX3N0cmluZy5uYW1lID0gYnVmOworCXF1aWNrX3N0cmluZy5sZW4gPSBzdHJsZW4ocXVpY2tfc3RyaW5nLm5hbWUpOworCXF1aWNrX3N0cmluZy5oYXNoID0gMDsKKwlkZW50cnkgPSBkX2FsbG9jKHJvb3QsICZxdWlja19zdHJpbmcpOworCWlmICghZGVudHJ5KQorCQlnb3RvIG91dF9zaG1fdW5sb2NrOworCisJZXJyb3IgPSAtRU5GSUxFOworCWZpbGUgPSBnZXRfZW1wdHlfZmlscCgpOworCWlmICghZmlsZSkKKwkJZ290byBvdXRfZGVudHJ5OworCisJZXJyb3IgPSAtRU5PU1BDOworCWlub2RlID0gaHVnZXRsYmZzX2dldF9pbm9kZShyb290LT5kX3NiLCBjdXJyZW50LT5mc3VpZCwKKwkJCQljdXJyZW50LT5mc2dpZCwgU19JRlJFRyB8IFNfSVJXWFVHTywgMCk7CisJaWYgKCFpbm9kZSkKKwkJZ290byBvdXRfZmlsZTsKKworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJaW5vZGUtPmlfc2l6ZSA9IHNpemU7CisJaW5vZGUtPmlfbmxpbmsgPSAwOworCWZpbGUtPmZfdmZzbW50ID0gbW50Z2V0KGh1Z2V0bGJmc192ZnNtb3VudCk7CisJZmlsZS0+Zl9kZW50cnkgPSBkZW50cnk7CisJZmlsZS0+Zl9tYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKKwlmaWxlLT5mX29wID0gJmh1Z2V0bGJmc19maWxlX29wZXJhdGlvbnM7CisJZmlsZS0+Zl9tb2RlID0gRk1PREVfV1JJVEUgfCBGTU9ERV9SRUFEOworCXJldHVybiBmaWxlOworCitvdXRfZmlsZToKKwlwdXRfZmlscChmaWxlKTsKK291dF9kZW50cnk6CisJZHB1dChkZW50cnkpOworb3V0X3NobV91bmxvY2s6CisJdXNlcl9zaG1fdW5sb2NrKHNpemUsIGN1cnJlbnQtPnVzZXIpOworCXJldHVybiBFUlJfUFRSKGVycm9yKTsKK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdF9odWdldGxiZnNfZnModm9pZCkKK3sKKwlpbnQgZXJyb3I7CisJc3RydWN0IHZmc21vdW50ICp2ZnNtb3VudDsKKworCWh1Z2V0bGJmc19pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiaHVnZXRsYmZzX2lub2RlX2NhY2hlIiwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBodWdldGxiZnNfaW5vZGVfaW5mbyksCisJCQkJCTAsIDAsIGluaXRfb25jZSwgTlVMTCk7CisJaWYgKGh1Z2V0bGJmc19pbm9kZV9jYWNoZXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllcnJvciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmh1Z2V0bGJmc19mc190eXBlKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCisJdmZzbW91bnQgPSBrZXJuX21vdW50KCZodWdldGxiZnNfZnNfdHlwZSk7CisKKwlpZiAoIUlTX0VSUih2ZnNtb3VudCkpIHsKKwkJaHVnZXRsYmZzX3Zmc21vdW50ID0gdmZzbW91bnQ7CisJCXJldHVybiAwOworCX0KKworCWVycm9yID0gUFRSX0VSUih2ZnNtb3VudCk7CisKKyBvdXQ6CisJaWYgKGVycm9yKQorCQlrbWVtX2NhY2hlX2Rlc3Ryb3koaHVnZXRsYmZzX2lub2RlX2NhY2hlcCk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9odWdldGxiZnNfZnModm9pZCkKK3sKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koaHVnZXRsYmZzX2lub2RlX2NhY2hlcCk7CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZodWdldGxiZnNfZnNfdHlwZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfaHVnZXRsYmZzX2ZzKQorbW9kdWxlX2V4aXQoZXhpdF9odWdldGxiZnNfZnMpCisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL2lub2RlLmMgYi9mcy9pbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOGZkNzgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9pbm9kZS5jCkBAIC0wLDAgKzEsMTM3NyBAQAorLyoKKyAqIGxpbnV4L2ZzL2lub2RlLmMKKyAqCisgKiAoQykgMTk5NyBMaW51cyBUb3J2YWxkcworICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvY2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKworLyoKKyAqIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKKyAqICAtIGlub2RlX2hhc19idWZmZXJzCisgKiAgLSBpbnZhbGlkYXRlX2lub2RlX2J1ZmZlcnMKKyAqICAtIGZzeW5jX2JkZXYKKyAqICAtIGludmFsaWRhdGVfYmRldgorICoKKyAqIEZJWE1FOiByZW1vdmUgYWxsIGtub3dsZWRnZSBvZiB0aGUgYnVmZmVyIGxheWVyIGZyb20gdGhpcyBmaWxlCisgKi8KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorCisvKgorICogTmV3IGlub2RlLmMgaW1wbGVtZW50YXRpb24uCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBoYXMgdGhlIGJhc2ljIHByZW1pc2Ugb2YgdHJ5aW5nCisgKiB0byBiZSBleHRyZW1lbHkgbG93LW92ZXJoZWFkIGFuZCBTTVAtc2FmZSwgeWV0IGJlCisgKiBzaW1wbGUgZW5vdWdoIHRvIGJlICJvYnZpb3VzbHkgY29ycmVjdCIuCisgKgorICogRmFtb3VzIGxhc3Qgd29yZHMuCisgKi8KKworLyogaW5vZGUgZHluYW1pYyBhbGxvY2F0aW9uIDE5OTksIEFuZHJlYSBBcmNhbmdlbGkgPGFuZHJlYUBzdXNlLmRlPiAqLworCisvKiAjZGVmaW5lIElOT0RFX1BBUkFOT0lBIDEgKi8KKy8qICNkZWZpbmUgSU5PREVfREVCVUcgMSAqLworCisvKgorICogSW5vZGUgbG9va3VwIGlzIG5vIGxvbmdlciBhcyBjcml0aWNhbCBhcyBpdCB1c2VkIHRvIGJlOgorICogbW9zdCBvZiB0aGUgbG9va3VwcyBhcmUgZ29pbmcgdG8gYmUgdGhyb3VnaCB0aGUgZGNhY2hlLgorICovCisjZGVmaW5lIElfSEFTSEJJVFMJaV9oYXNoX3NoaWZ0CisjZGVmaW5lIElfSEFTSE1BU0sJaV9oYXNoX21hc2sKKworc3RhdGljIHVuc2lnbmVkIGludCBpX2hhc2hfbWFzazsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaV9oYXNoX3NoaWZ0OworCisvKgorICogRWFjaCBpbm9kZSBjYW4gYmUgb24gdHdvIHNlcGFyYXRlIGxpc3RzLiBPbmUgaXMKKyAqIHRoZSBoYXNoIGxpc3Qgb2YgdGhlIGlub2RlLCB1c2VkIGZvciBsb29rdXBzLiBUaGUKKyAqIG90aGVyIGxpbmtlZCBsaXN0IGlzIHRoZSAidHlwZSIgbGlzdDoKKyAqICAiaW5fdXNlIiAtIHZhbGlkIGlub2RlLCBpX2NvdW50ID4gMCwgaV9ubGluayA+IDAKKyAqICAiZGlydHkiICAtIGFzICJpbl91c2UiIGJ1dCBhbHNvIGRpcnR5CisgKiAgInVudXNlZCIgLSB2YWxpZCBpbm9kZSwgaV9jb3VudCA9IDAKKyAqCisgKiBBICJkaXJ0eSIgbGlzdCBpcyBtYWludGFpbmVkIGZvciBlYWNoIHN1cGVyIGJsb2NrLAorICogYWxsb3dpbmcgZm9yIGxvdy1vdmVyaGVhZCBpbm9kZSBzeW5jKCkgb3BlcmF0aW9ucy4KKyAqLworCitMSVNUX0hFQUQoaW5vZGVfaW5fdXNlKTsKK0xJU1RfSEVBRChpbm9kZV91bnVzZWQpOworc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkICppbm9kZV9oYXNodGFibGU7CisKKy8qCisgKiBBIHNpbXBsZSBzcGlubG9jayB0byBwcm90ZWN0IHRoZSBsaXN0IG1hbmlwdWxhdGlvbnMuCisgKgorICogTk9URSEgWW91IGFsc28gaGF2ZSB0byBvd24gdGhlIGxvY2sgaWYgeW91IGNoYW5nZQorICogdGhlIGlfc3RhdGUgb2YgYW4gaW5vZGUgd2hpbGUgaXQgaXMgaW4gdXNlLi4KKyAqLworREVGSU5FX1NQSU5MT0NLKGlub2RlX2xvY2spOworCisvKgorICogaXBydW5lX3NlbSBwcm92aWRlcyBleGNsdXNpb24gYmV0d2VlbiB0aGUga3N3YXBkIG9yIHRyeV90b19mcmVlX3BhZ2VzCisgKiBpY2FjaGUgc2hyaW5raW5nIHBhdGgsIGFuZCB0aGUgdW1vdW50IHBhdGguICBXaXRob3V0IHRoaXMgZXhjbHVzaW9uLAorICogYnkgdGhlIHRpbWUgcHJ1bmVfaWNhY2hlIGNhbGxzIGlwdXQgZm9yIHRoZSBpbm9kZSB3aG9zZSBwYWdlcyBpdCBoYXMKKyAqIGJlZW4gaW52YWxpZGF0aW5nLCBvciBieSB0aGUgdGltZSBpdCBjYWxscyBjbGVhcl9pbm9kZSAmIGRlc3Ryb3lfaW5vZGUKKyAqIGZyb20gaXRzIGZpbmFsIGRpc3Bvc2VfbGlzdCwgdGhlIHN0cnVjdCBzdXBlcl9ibG9jayB0aGV5IHJlZmVyIHRvCisgKiAoZm9yIGlub2RlLT5pX3NiLT5zX29wKSBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gZnJlZWQgYW5kIHJldXNlZC4KKyAqLworREVDTEFSRV9NVVRFWChpcHJ1bmVfc2VtKTsKKworLyoKKyAqIFN0YXRpc3RpY3MgZ2F0aGVyaW5nLi4KKyAqLworc3RydWN0IGlub2Rlc19zdGF0X3QgaW5vZGVzX3N0YXQ7CisKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKiBpbm9kZV9jYWNoZXA7CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmFsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RhdGljIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgZW1wdHlfYW9wczsKKwlzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZW1wdHlfaW9wczsKKwlzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBlbXB0eV9mb3BzOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwlpZiAoc2ItPnNfb3AtPmFsbG9jX2lub2RlKQorCQlpbm9kZSA9IHNiLT5zX29wLT5hbGxvY19pbm9kZShzYik7CisJZWxzZQorCQlpbm9kZSA9IChzdHJ1Y3QgaW5vZGUgKikga21lbV9jYWNoZV9hbGxvYyhpbm9kZV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKworCWlmIChpbm9kZSkgeworCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqIGNvbnN0IG1hcHBpbmcgPSAmaW5vZGUtPmlfZGF0YTsKKworCQlpbm9kZS0+aV9zYiA9IHNiOworCQlpbm9kZS0+aV9ibGtiaXRzID0gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJCWlub2RlLT5pX2ZsYWdzID0gMDsKKwkJYXRvbWljX3NldCgmaW5vZGUtPmlfY291bnQsIDEpOworCQlpbm9kZS0+aV9vcCA9ICZlbXB0eV9pb3BzOworCQlpbm9kZS0+aV9mb3AgPSAmZW1wdHlfZm9wczsKKwkJaW5vZGUtPmlfbmxpbmsgPSAxOworCQlhdG9taWNfc2V0KCZpbm9kZS0+aV93cml0ZWNvdW50LCAwKTsKKwkJaW5vZGUtPmlfc2l6ZSA9IDA7CisJCWlub2RlLT5pX2Jsb2NrcyA9IDA7CisJCWlub2RlLT5pX2J5dGVzID0gMDsKKwkJaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IDA7CisjaWZkZWYgQ09ORklHX1FVT1RBCisJCW1lbXNldCgmaW5vZGUtPmlfZHF1b3QsIDAsIHNpemVvZihpbm9kZS0+aV9kcXVvdCkpOworI2VuZGlmCisJCWlub2RlLT5pX3BpcGUgPSBOVUxMOworCQlpbm9kZS0+aV9iZGV2ID0gTlVMTDsKKwkJaW5vZGUtPmlfY2RldiA9IE5VTEw7CisJCWlub2RlLT5pX3JkZXYgPSAwOworCQlpbm9kZS0+aV9zZWN1cml0eSA9IE5VTEw7CisJCWlub2RlLT5kaXJ0aWVkX3doZW4gPSAwOworCQlpZiAoc2VjdXJpdHlfaW5vZGVfYWxsb2MoaW5vZGUpKSB7CisJCQlpZiAoaW5vZGUtPmlfc2ItPnNfb3AtPmRlc3Ryb3lfaW5vZGUpCisJCQkJaW5vZGUtPmlfc2ItPnNfb3AtPmRlc3Ryb3lfaW5vZGUoaW5vZGUpOworCQkJZWxzZQorCQkJCWttZW1fY2FjaGVfZnJlZShpbm9kZV9jYWNoZXAsIChpbm9kZSkpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQltYXBwaW5nLT5hX29wcyA9ICZlbXB0eV9hb3BzOworIAkJbWFwcGluZy0+aG9zdCA9IGlub2RlOworCQltYXBwaW5nLT5mbGFncyA9IDA7CisJCW1hcHBpbmdfc2V0X2dmcF9tYXNrKG1hcHBpbmcsIEdGUF9ISUdIVVNFUik7CisJCW1hcHBpbmctPmFzc29jX21hcHBpbmcgPSBOVUxMOworCQltYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0gJmRlZmF1bHRfYmFja2luZ19kZXZfaW5mbzsKKworCQkvKgorCQkgKiBJZiB0aGUgYmxvY2tfZGV2aWNlIHByb3ZpZGVzIGEgYmFja2luZ19kZXZfaW5mbyBmb3IgY2xpZW50CisJCSAqIGlub2RlcyB0aGVuIHVzZSB0aGF0LiAgT3RoZXJ3aXNlIHRoZSBpbm9kZSBzaGFyZSB0aGUgYmRldidzCisJCSAqIGJhY2tpbmdfZGV2X2luZm8uCisJCSAqLworCQlpZiAoc2ItPnNfYmRldikgeworCQkJc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaTsKKworCQkJYmRpID0gc2ItPnNfYmRldi0+YmRfaW5vZGVfYmFja2luZ19kZXZfaW5mbzsKKwkJCWlmICghYmRpKQorCQkJCWJkaSA9IHNiLT5zX2JkZXYtPmJkX2lub2RlLT5pX21hcHBpbmctPmJhY2tpbmdfZGV2X2luZm87CisJCQltYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0gYmRpOworCQl9CisJCW1lbXNldCgmaW5vZGUtPnUsIDAsIHNpemVvZihpbm9kZS0+dSkpOworCQlpbm9kZS0+aV9tYXBwaW5nID0gbWFwcGluZzsKKwl9CisJcmV0dXJuIGlub2RlOworfQorCit2b2lkIGRlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkgCit7CisJaWYgKGlub2RlX2hhc19idWZmZXJzKGlub2RlKSkKKwkJQlVHKCk7CisJc2VjdXJpdHlfaW5vZGVfZnJlZShpbm9kZSk7CisJaWYgKGlub2RlLT5pX3NiLT5zX29wLT5kZXN0cm95X2lub2RlKQorCQlpbm9kZS0+aV9zYi0+c19vcC0+ZGVzdHJveV9pbm9kZShpbm9kZSk7CisJZWxzZQorCQlrbWVtX2NhY2hlX2ZyZWUoaW5vZGVfY2FjaGVwLCAoaW5vZGUpKTsKK30KKworCisvKgorICogVGhlc2UgYXJlIGluaXRpYWxpemF0aW9ucyB0aGF0IG9ubHkgbmVlZCB0byBiZSBkb25lCisgKiBvbmNlLCBiZWNhdXNlIHRoZSBmaWVsZHMgYXJlIGlkZW1wb3RlbnQgYWNyb3NzIHVzZQorICogb2YgdGhlIGlub2RlLCBzbyBsZXQgdGhlIHNsYWIgYXdhcmUgb2YgdGhhdC4KKyAqLwordm9pZCBpbm9kZV9pbml0X29uY2Uoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwltZW1zZXQoaW5vZGUsIDAsIHNpemVvZigqaW5vZGUpKTsKKwlJTklUX0hMSVNUX05PREUoJmlub2RlLT5pX2hhc2gpOworCUlOSVRfTElTVF9IRUFEKCZpbm9kZS0+aV9kZW50cnkpOworCUlOSVRfTElTVF9IRUFEKCZpbm9kZS0+aV9kZXZpY2VzKTsKKwlzZW1hX2luaXQoJmlub2RlLT5pX3NlbSwgMSk7CisJaW5pdF9yd3NlbSgmaW5vZGUtPmlfYWxsb2Nfc2VtKTsKKwlJTklUX1JBRElYX1RSRUUoJmlub2RlLT5pX2RhdGEucGFnZV90cmVlLCBHRlBfQVRPTUlDKTsKKwlyd2xvY2tfaW5pdCgmaW5vZGUtPmlfZGF0YS50cmVlX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZpbm9kZS0+aV9kYXRhLmlfbW1hcF9sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmaW5vZGUtPmlfZGF0YS5wcml2YXRlX2xpc3QpOworCXNwaW5fbG9ja19pbml0KCZpbm9kZS0+aV9kYXRhLnByaXZhdGVfbG9jayk7CisJSU5JVF9SQVdfUFJJT19UUkVFX1JPT1QoJmlub2RlLT5pX2RhdGEuaV9tbWFwKTsKKwlJTklUX0xJU1RfSEVBRCgmaW5vZGUtPmlfZGF0YS5pX21tYXBfbm9ubGluZWFyKTsKKwlzcGluX2xvY2tfaW5pdCgmaW5vZGUtPmlfbG9jayk7CisJaV9zaXplX29yZGVyZWRfaW5pdChpbm9kZSk7Cit9CisKK0VYUE9SVF9TWU1CT0woaW5vZGVfaW5pdF9vbmNlKTsKKworc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKiBmb28sIGttZW1fY2FjaGVfdCAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IChzdHJ1Y3QgaW5vZGUgKikgZm9vOworCisJaWYgKChmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CisJICAgIFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikKKwkJaW5vZGVfaW5pdF9vbmNlKGlub2RlKTsKK30KKworLyoKKyAqIGlub2RlX2xvY2sgbXVzdCBiZSBoZWxkCisgKi8KK3ZvaWQgX19pZ2V0KHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCWlmIChhdG9taWNfcmVhZCgmaW5vZGUtPmlfY291bnQpKSB7CisJCWF0b21pY19pbmMoJmlub2RlLT5pX2NvdW50KTsKKwkJcmV0dXJuOworCX0KKwlhdG9taWNfaW5jKCZpbm9kZS0+aV9jb3VudCk7CisJaWYgKCEoaW5vZGUtPmlfc3RhdGUgJiAoSV9ESVJUWXxJX0xPQ0spKSkKKwkJbGlzdF9tb3ZlKCZpbm9kZS0+aV9saXN0LCAmaW5vZGVfaW5fdXNlKTsKKwlpbm9kZXNfc3RhdC5ucl91bnVzZWQtLTsKK30KKworLyoqCisgKiBjbGVhcl9pbm9kZSAtIGNsZWFyIGFuIGlub2RlCisgKiBAaW5vZGU6IGlub2RlIHRvIGNsZWFyCisgKgorICogVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGZpbGVzeXN0ZW0gdG8gdGVsbCB1cworICogdGhhdCB0aGUgaW5vZGUgaXMgbm8gbG9uZ2VyIHVzZWZ1bC4gV2UganVzdAorICogdGVybWluYXRlIGl0IHdpdGggZXh0cmVtZSBwcmVqdWRpY2UuCisgKi8KK3ZvaWQgY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwltaWdodF9zbGVlcCgpOworCWludmFsaWRhdGVfaW5vZGVfYnVmZmVycyhpbm9kZSk7CisgICAgICAgCisJaWYgKGlub2RlLT5pX2RhdGEubnJwYWdlcykKKwkJQlVHKCk7CisJaWYgKCEoaW5vZGUtPmlfc3RhdGUgJiBJX0ZSRUVJTkcpKQorCQlCVUcoKTsKKwlpZiAoaW5vZGUtPmlfc3RhdGUgJiBJX0NMRUFSKQorCQlCVUcoKTsKKwl3YWl0X29uX2lub2RlKGlub2RlKTsKKwlEUVVPVF9EUk9QKGlub2RlKTsKKwlpZiAoaW5vZGUtPmlfc2IgJiYgaW5vZGUtPmlfc2ItPnNfb3AtPmNsZWFyX2lub2RlKQorCQlpbm9kZS0+aV9zYi0+c19vcC0+Y2xlYXJfaW5vZGUoaW5vZGUpOworCWlmIChpbm9kZS0+aV9iZGV2KQorCQliZF9mb3JnZXQoaW5vZGUpOworCWlmIChpbm9kZS0+aV9jZGV2KQorCQljZF9mb3JnZXQoaW5vZGUpOworCWlub2RlLT5pX3N0YXRlID0gSV9DTEVBUjsKK30KKworRVhQT1JUX1NZTUJPTChjbGVhcl9pbm9kZSk7CisKKy8qCisgKiBkaXNwb3NlX2xpc3QgLSBkaXNwb3NlIG9mIHRoZSBjb250ZW50cyBvZiBhIGxvY2FsIGxpc3QKKyAqIEBoZWFkOiB0aGUgaGVhZCBvZiB0aGUgbGlzdCB0byBmcmVlCisgKgorICogRGlzcG9zZS1saXN0IGdldHMgYSBsb2NhbCBsaXN0IHdpdGggbG9jYWwgaW5vZGVzIGluIGl0LCBzbyBpdCBkb2Vzbid0CisgKiBuZWVkIHRvIHdvcnJ5IGFib3V0IGxpc3QgY29ycnVwdGlvbiBhbmQgU01QIGxvY2tzLgorICovCitzdGF0aWMgdm9pZCBkaXNwb3NlX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlpbnQgbnJfZGlzcG9zZWQgPSAwOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KGhlYWQpKSB7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwkJaW5vZGUgPSBsaXN0X2VudHJ5KGhlYWQtPm5leHQsIHN0cnVjdCBpbm9kZSwgaV9saXN0KTsKKwkJbGlzdF9kZWwoJmlub2RlLT5pX2xpc3QpOworCisJCWlmIChpbm9kZS0+aV9kYXRhLm5ycGFnZXMpCisJCQl0cnVuY2F0ZV9pbm9kZV9wYWdlcygmaW5vZGUtPmlfZGF0YSwgMCk7CisJCWNsZWFyX2lub2RlKGlub2RlKTsKKwkJZGVzdHJveV9pbm9kZShpbm9kZSk7CisJCW5yX2Rpc3Bvc2VkKys7CisJfQorCXNwaW5fbG9jaygmaW5vZGVfbG9jayk7CisJaW5vZGVzX3N0YXQubnJfaW5vZGVzIC09IG5yX2Rpc3Bvc2VkOworCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKK30KKworLyoKKyAqIEludmFsaWRhdGUgYWxsIGlub2RlcyBmb3IgYSBkZXZpY2UuCisgKi8KK3N0YXRpYyBpbnQgaW52YWxpZGF0ZV9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHN0cnVjdCBsaXN0X2hlYWQgKmRpc3Bvc2UpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbmV4dDsKKwlpbnQgYnVzeSA9IDAsIGNvdW50ID0gMDsKKworCW5leHQgPSBoZWFkLT5uZXh0OworCWZvciAoOzspIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqIHRtcCA9IG5leHQ7CisJCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCisJCS8qCisJCSAqIFdlIGNhbiByZXNjaGVkdWxlIGhlcmUgd2l0aG91dCB3b3JyeWluZyBhYm91dCB0aGUgbGlzdCdzCisJCSAqIGNvbnNpc3RlbmN5IGJlY2F1c2UgdGhlIHBlci1zYiBsaXN0IG9mIGlub2RlcyBtdXN0IG5vdAorCQkgKiBjaGFuZ2UgZHVyaW5nIHVtb3VudCBhbnltb3JlLCBhbmQgYmVjYXVzZSBpcHJ1bmVfc2VtIGtlZXBzCisJCSAqIHNocmlua19pY2FjaGVfbWVtb3J5KCkgYXdheS4KKwkJICovCisJCWNvbmRfcmVzY2hlZF9sb2NrKCZpbm9kZV9sb2NrKTsKKworCQluZXh0ID0gbmV4dC0+bmV4dDsKKwkJaWYgKHRtcCA9PSBoZWFkKQorCQkJYnJlYWs7CisJCWlub2RlID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBpbm9kZSwgaV9zYl9saXN0KTsKKwkJaW52YWxpZGF0ZV9pbm9kZV9idWZmZXJzKGlub2RlKTsKKwkJaWYgKCFhdG9taWNfcmVhZCgmaW5vZGUtPmlfY291bnQpKSB7CisJCQlobGlzdF9kZWxfaW5pdCgmaW5vZGUtPmlfaGFzaCk7CisJCQlsaXN0X2RlbCgmaW5vZGUtPmlfc2JfbGlzdCk7CisJCQlsaXN0X21vdmUoJmlub2RlLT5pX2xpc3QsIGRpc3Bvc2UpOworCQkJaW5vZGUtPmlfc3RhdGUgfD0gSV9GUkVFSU5HOworCQkJY291bnQrKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWJ1c3kgPSAxOworCX0KKwkvKiBvbmx5IHVudXNlZCBpbm9kZXMgbWF5IGJlIGNhY2hlZCB3aXRoIGlfY291bnQgemVybyAqLworCWlub2Rlc19zdGF0Lm5yX3VudXNlZCAtPSBjb3VudDsKKwlyZXR1cm4gYnVzeTsKK30KKworLyoKKyAqIFRoaXMgaXMgYSB0d28tc3RhZ2UgcHJvY2Vzcy4gRmlyc3Qgd2UgY29sbGVjdCBhbGwKKyAqIG9mZmVuZGluZyBpbm9kZXMgb250byB0aGUgdGhyb3ctYXdheSBsaXN0LCBhbmQgaW4KKyAqIHRoZSBzZWNvbmQgc3RhZ2Ugd2UgYWN0dWFsbHkgZGlzcG9zZSBvZiB0aGVtLiBUaGlzCisgKiBpcyBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gc2xlZXAgd2hpbGUgbWVzc2luZworICogd2l0aCB0aGUgZ2xvYmFsIGxpc3RzLi4KKyAqLworIAorLyoqCisgKglpbnZhbGlkYXRlX2lub2RlcwktIGRpc2NhcmQgdGhlIGlub2RlcyBvbiBhIGRldmljZQorICoJQHNiOiBzdXBlcmJsb2NrCisgKgorICoJRGlzY2FyZCBhbGwgb2YgdGhlIGlub2RlcyBmb3IgYSBnaXZlbiBzdXBlcmJsb2NrLiBJZiB0aGUgZGlzY2FyZAorICoJZmFpbHMgYmVjYXVzZSB0aGVyZSBhcmUgYnVzeSBpbm9kZXMgdGhlbiBhIG5vbiB6ZXJvIHZhbHVlIGlzIHJldHVybmVkLgorICoJSWYgdGhlIGRpc2NhcmQgaXMgc3VjY2Vzc2Z1bCBhbGwgdGhlIGlub2RlcyBoYXZlIGJlZW4gZGlzY2FyZGVkLgorICovCitpbnQgaW52YWxpZGF0ZV9pbm9kZXMoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpCit7CisJaW50IGJ1c3k7CisJTElTVF9IRUFEKHRocm93X2F3YXkpOworCisJZG93bigmaXBydW5lX3NlbSk7CisJc3Bpbl9sb2NrKCZpbm9kZV9sb2NrKTsKKwlidXN5ID0gaW52YWxpZGF0ZV9saXN0KCZzYi0+c19pbm9kZXMsICZ0aHJvd19hd2F5KTsKKwlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CisKKwlkaXNwb3NlX2xpc3QoJnRocm93X2F3YXkpOworCXVwKCZpcHJ1bmVfc2VtKTsKKworCXJldHVybiBidXN5OworfQorCitFWFBPUlRfU1lNQk9MKGludmFsaWRhdGVfaW5vZGVzKTsKKyAKK2ludCBfX2ludmFsaWRhdGVfZGV2aWNlKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGludCBkb19zeW5jKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJaW50IHJlczsKKworCWlmIChkb19zeW5jKQorCQlmc3luY19iZGV2KGJkZXYpOworCisJcmVzID0gMDsKKwlzYiA9IGdldF9zdXBlcihiZGV2KTsKKwlpZiAoc2IpIHsKKwkJLyoKKwkJICogbm8gbmVlZCB0byBsb2NrIHRoZSBzdXBlciwgZ2V0X3N1cGVyIGhvbGRzIHRoZQorCQkgKiByZWFkIHNlbWFwaG9yZSBzbyB0aGUgZmlsZXN5c3RlbSBjYW5ub3QgZ28gYXdheQorCQkgKiB1bmRlciB1cyAoLT5wdXRfc3VwZXIgcnVucyB3aXRoIHRoZSB3cml0ZSBsb2NrCisJCSAqIGhvbGQpLgorCQkgKi8KKwkJc2hyaW5rX2RjYWNoZV9zYihzYik7CisJCXJlcyA9IGludmFsaWRhdGVfaW5vZGVzKHNiKTsKKwkJZHJvcF9zdXBlcihzYik7CisJfQorCWludmFsaWRhdGVfYmRldihiZGV2LCAwKTsKKwlyZXR1cm4gcmVzOworfQorCitFWFBPUlRfU1lNQk9MKF9faW52YWxpZGF0ZV9kZXZpY2UpOworCitzdGF0aWMgaW50IGNhbl91bnVzZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmIChpbm9kZS0+aV9zdGF0ZSkKKwkJcmV0dXJuIDA7CisJaWYgKGlub2RlX2hhc19idWZmZXJzKGlub2RlKSkKKwkJcmV0dXJuIDA7CisJaWYgKGF0b21pY19yZWFkKCZpbm9kZS0+aV9jb3VudCkpCisJCXJldHVybiAwOworCWlmIChpbm9kZS0+aV9kYXRhLm5ycGFnZXMpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKgorICogU2NhbiBgZ29hbCcgaW5vZGVzIG9uIHRoZSB1bnVzZWQgbGlzdCBmb3IgZnJlZWFibGUgb25lcy4gVGhleSBhcmUgbW92ZWQgdG8KKyAqIGEgdGVtcG9yYXJ5IGxpc3QgYW5kIHRoZW4gYXJlIGZyZWVkIG91dHNpZGUgaW5vZGVfbG9jayBieSBkaXNwb3NlX2xpc3QoKS4KKyAqCisgKiBBbnkgaW5vZGVzIHdoaWNoIGFyZSBwaW5uZWQgcHVyZWx5IGJlY2F1c2Ugb2YgYXR0YWNoZWQgcGFnZWNhY2hlIGhhdmUgdGhlaXIKKyAqIHBhZ2VjYWNoZSByZW1vdmVkLiAgV2UgZXhwZWN0IHRoZSBmaW5hbCBpcHV0KCkgb24gdGhhdCBpbm9kZSB0byBhZGQgaXQgdG8KKyAqIHRoZSBmcm9udCBvZiB0aGUgaW5vZGVfdW51c2VkIGxpc3QuICBTbyBsb29rIGZvciBpdCB0aGVyZSBhbmQgaWYgdGhlCisgKiBpbm9kZSBpcyBzdGlsbCBmcmVlYWJsZSwgcHJvY2VlZC4gIFRoZSByaWdodCBpbm9kZSBpcyBmb3VuZCA5OS45JSBvZiB0aGUKKyAqIHRpbWUgaW4gdGVzdGluZyBvbiBhIDQtd2F5LgorICoKKyAqIElmIHRoZSBpbm9kZSBoYXMgbWV0YWRhdGEgYnVmZmVycyBhdHRhY2hlZCB0byBtYXBwaW5nLT5wcml2YXRlX2xpc3QgdGhlbgorICogdHJ5IHRvIHJlbW92ZSB0aGVtLgorICovCitzdGF0aWMgdm9pZCBwcnVuZV9pY2FjaGUoaW50IG5yX3RvX3NjYW4pCit7CisJTElTVF9IRUFEKGZyZWVhYmxlKTsKKwlpbnQgbnJfcHJ1bmVkID0gMDsKKwlpbnQgbnJfc2Nhbm5lZDsKKwl1bnNpZ25lZCBsb25nIHJlYXAgPSAwOworCisJZG93bigmaXBydW5lX3NlbSk7CisJc3Bpbl9sb2NrKCZpbm9kZV9sb2NrKTsKKwlmb3IgKG5yX3NjYW5uZWQgPSAwOyBucl9zY2FubmVkIDwgbnJfdG9fc2NhbjsgbnJfc2Nhbm5lZCsrKSB7CisJCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwkJaWYgKGxpc3RfZW1wdHkoJmlub2RlX3VudXNlZCkpCisJCQlicmVhazsKKworCQlpbm9kZSA9IGxpc3RfZW50cnkoaW5vZGVfdW51c2VkLnByZXYsIHN0cnVjdCBpbm9kZSwgaV9saXN0KTsKKworCQlpZiAoaW5vZGUtPmlfc3RhdGUgfHwgYXRvbWljX3JlYWQoJmlub2RlLT5pX2NvdW50KSkgeworCQkJbGlzdF9tb3ZlKCZpbm9kZS0+aV9saXN0LCAmaW5vZGVfdW51c2VkKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChpbm9kZV9oYXNfYnVmZmVycyhpbm9kZSkgfHwgaW5vZGUtPmlfZGF0YS5ucnBhZ2VzKSB7CisJCQlfX2lnZXQoaW5vZGUpOworCQkJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworCQkJaWYgKHJlbW92ZV9pbm9kZV9idWZmZXJzKGlub2RlKSkKKwkJCQlyZWFwICs9IGludmFsaWRhdGVfaW5vZGVfcGFnZXMoJmlub2RlLT5pX2RhdGEpOworCQkJaXB1dChpbm9kZSk7CisJCQlzcGluX2xvY2soJmlub2RlX2xvY2spOworCisJCQlpZiAoaW5vZGUgIT0gbGlzdF9lbnRyeShpbm9kZV91bnVzZWQubmV4dCwKKwkJCQkJCXN0cnVjdCBpbm9kZSwgaV9saXN0KSkKKwkJCQljb250aW51ZTsJLyogd3JvbmcgaW5vZGUgb3IgbGlzdF9lbXB0eSAqLworCQkJaWYgKCFjYW5fdW51c2UoaW5vZGUpKQorCQkJCWNvbnRpbnVlOworCQl9CisJCWhsaXN0X2RlbF9pbml0KCZpbm9kZS0+aV9oYXNoKTsKKwkJbGlzdF9kZWxfaW5pdCgmaW5vZGUtPmlfc2JfbGlzdCk7CisJCWxpc3RfbW92ZSgmaW5vZGUtPmlfbGlzdCwgJmZyZWVhYmxlKTsKKwkJaW5vZGUtPmlfc3RhdGUgfD0gSV9GUkVFSU5HOworCQlucl9wcnVuZWQrKzsKKwl9CisJaW5vZGVzX3N0YXQubnJfdW51c2VkIC09IG5yX3BydW5lZDsKKwlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CisKKwlkaXNwb3NlX2xpc3QoJmZyZWVhYmxlKTsKKwl1cCgmaXBydW5lX3NlbSk7CisKKwlpZiAoY3VycmVudF9pc19rc3dhcGQoKSkKKwkJbW9kX3BhZ2Vfc3RhdGUoa3N3YXBkX2lub2Rlc3RlYWwsIHJlYXApOworCWVsc2UKKwkJbW9kX3BhZ2Vfc3RhdGUocGdpbm9kZXN0ZWFsLCByZWFwKTsKK30KKworLyoKKyAqIHNocmlua19pY2FjaGVfbWVtb3J5KCkgd2lsbCBhdHRlbXB0IHRvIHJlY2xhaW0gc29tZSB1bnVzZWQgaW5vZGVzLiAgSGVyZSwKKyAqICJ1bnVzZWQiIG1lYW5zIHRoYXQgbm8gZGVudHJpZXMgYXJlIHJlZmVycmluZyB0byB0aGUgaW5vZGVzOiB0aGUgZmlsZXMgYXJlCisgKiBub3Qgb3BlbiBhbmQgdGhlIGRjYWNoZSByZWZlcmVuY2VzIHRvIHRob3NlIGlub2RlcyBoYXZlIGFscmVhZHkgYmVlbgorICogcmVjbGFpbWVkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgcGFzc2VkIHRoZSBudW1iZXIgb2YgaW5vZGVzIHRvIHNjYW4sIGFuZCBpdCByZXR1cm5zIHRoZQorICogdG90YWwgbnVtYmVyIG9mIHJlbWFpbmluZyBwb3NzaWJseS1yZWNsYWltYWJsZSBpbm9kZXMuCisgKi8KK3N0YXRpYyBpbnQgc2hyaW5rX2ljYWNoZV9tZW1vcnkoaW50IG5yLCB1bnNpZ25lZCBpbnQgZ2ZwX21hc2spCit7CisJaWYgKG5yKSB7CisJCS8qCisJCSAqIE5hc3R5IGRlYWRsb2NrIGF2b2lkYW5jZS4gIFdlIG1heSBob2xkIHZhcmlvdXMgRlMgbG9ja3MsCisJCSAqIGFuZCB3ZSBkb24ndCB3YW50IHRvIHJlY3Vyc2UgaW50byB0aGUgRlMgdGhhdCBjYWxsZWQgdXMKKwkJICogaW4gY2xlYXJfaW5vZGUoKSBhbmQgZnJpZW5kcy4uCisJIAkgKi8KKwkJaWYgKCEoZ2ZwX21hc2sgJiBfX0dGUF9GUykpCisJCQlyZXR1cm4gLTE7CisJCXBydW5lX2ljYWNoZShucik7CisJfQorCXJldHVybiAoaW5vZGVzX3N0YXQubnJfdW51c2VkIC8gMTAwKSAqIHN5c2N0bF92ZnNfY2FjaGVfcHJlc3N1cmU7Cit9CisKK3N0YXRpYyB2b2lkIF9fd2FpdF9vbl9mcmVlaW5nX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworLyoKKyAqIENhbGxlZCB3aXRoIHRoZSBpbm9kZSBsb2NrIGhlbGQuCisgKiBOT1RFOiB3ZSBhcmUgbm90IGluY3JlYXNpbmcgdGhlIGlub2RlLXJlZmNvdW50LCB5b3UgbXVzdCBjYWxsIF9faWdldCgpCisgKiBieSBoYW5kIGFmdGVyIGNhbGxpbmcgZmluZF9pbm9kZSBub3chIFRoaXMgc2ltcGxpZmllcyBpdW5pcXVlIGFuZCB3b24ndAorICogYWRkIGFueSBhZGRpdGlvbmFsIGJyYW5jaCBpbiB0aGUgY29tbW9uIGNvZGUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKiBmaW5kX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZCwgaW50ICgqdGVzdCkoc3RydWN0IGlub2RlICosIHZvaWQgKiksIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBOVUxMOworCityZXBlYXQ6CisJaGxpc3RfZm9yX2VhY2ggKG5vZGUsIGhlYWQpIHsgCisJCWlub2RlID0gaGxpc3RfZW50cnkobm9kZSwgc3RydWN0IGlub2RlLCBpX2hhc2gpOworCQlpZiAoaW5vZGUtPmlfc2IgIT0gc2IpCisJCQljb250aW51ZTsKKwkJaWYgKCF0ZXN0KGlub2RlLCBkYXRhKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoaW5vZGUtPmlfc3RhdGUgJiAoSV9GUkVFSU5HfElfQ0xFQVIpKSB7CisJCQlfX3dhaXRfb25fZnJlZWluZ19pbm9kZShpbm9kZSk7CisJCQlnb3RvIHJlcGVhdDsKKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuIG5vZGUgPyBpbm9kZSA6IE5VTEw7Cit9CisKKy8qCisgKiBmaW5kX2lub2RlX2Zhc3QgaXMgdGhlIGZhc3QgcGF0aCB2ZXJzaW9uIG9mIGZpbmRfaW5vZGUsIHNlZSB0aGUgY29tbWVudCBhdAorICogaWdldF9sb2NrZWQgZm9yIGRldGFpbHMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKiBmaW5kX2lub2RlX2Zhc3Qoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIHN0cnVjdCBobGlzdF9oZWFkICpoZWFkLCB1bnNpZ25lZCBsb25nIGlubykKK3sKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IE5VTEw7CisKK3JlcGVhdDoKKwlobGlzdF9mb3JfZWFjaCAobm9kZSwgaGVhZCkgeworCQlpbm9kZSA9IGhsaXN0X2VudHJ5KG5vZGUsIHN0cnVjdCBpbm9kZSwgaV9oYXNoKTsKKwkJaWYgKGlub2RlLT5pX2lubyAhPSBpbm8pCisJCQljb250aW51ZTsKKwkJaWYgKGlub2RlLT5pX3NiICE9IHNiKQorCQkJY29udGludWU7CisJCWlmIChpbm9kZS0+aV9zdGF0ZSAmIChJX0ZSRUVJTkd8SV9DTEVBUikpIHsKKwkJCV9fd2FpdF9vbl9mcmVlaW5nX2lub2RlKGlub2RlKTsKKwkJCWdvdG8gcmVwZWF0OworCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gbm9kZSA/IGlub2RlIDogTlVMTDsKK30KKworLyoqCisgKgluZXdfaW5vZGUgCS0gb2J0YWluIGFuIGlub2RlCisgKglAc2I6IHN1cGVyYmxvY2sKKyAqCisgKglBbGxvY2F0ZXMgYSBuZXcgaW5vZGUgZm9yIGdpdmVuIHN1cGVyYmxvY2suCisgKi8KK3N0cnVjdCBpbm9kZSAqbmV3X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgbGFzdF9pbm87CisJc3RydWN0IGlub2RlICogaW5vZGU7CisKKwlzcGluX2xvY2tfcHJlZmV0Y2goJmlub2RlX2xvY2spOworCQorCWlub2RlID0gYWxsb2NfaW5vZGUoc2IpOworCWlmIChpbm9kZSkgeworCQlzcGluX2xvY2soJmlub2RlX2xvY2spOworCQlpbm9kZXNfc3RhdC5ucl9pbm9kZXMrKzsKKwkJbGlzdF9hZGQoJmlub2RlLT5pX2xpc3QsICZpbm9kZV9pbl91c2UpOworCQlsaXN0X2FkZCgmaW5vZGUtPmlfc2JfbGlzdCwgJnNiLT5zX2lub2Rlcyk7CisJCWlub2RlLT5pX2lubyA9ICsrbGFzdF9pbm87CisJCWlub2RlLT5pX3N0YXRlID0gMDsKKwkJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworCX0KKwlyZXR1cm4gaW5vZGU7Cit9CisKK0VYUE9SVF9TWU1CT0wobmV3X2lub2RlKTsKKwordm9pZCB1bmxvY2tfbmV3X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJLyoKKwkgKiBUaGlzIGlzIHNwZWNpYWwhICBXZSBkbyBub3QgbmVlZCB0aGUgc3BpbmxvY2sKKwkgKiB3aGVuIGNsZWFyaW5nIElfTE9DSywgYmVjYXVzZSB3ZSdyZSBndWFyYW50ZWVkCisJICogdGhhdCBub2JvZHkgZWxzZSB0cmllcyB0byBkbyBhbnl0aGluZyBhYm91dCB0aGUKKwkgKiBzdGF0ZSBvZiB0aGUgaW5vZGUgd2hlbiBpdCBpcyBsb2NrZWQsIGFzIHdlCisJICoganVzdCBjcmVhdGVkIGl0IChzbyB0aGVyZSBjYW4gYmUgbm8gb2xkIGhvbGRlcnMKKwkgKiB0aGF0IGhhdmVuJ3QgdGVzdGVkIElfTE9DSykuCisJICovCisJaW5vZGUtPmlfc3RhdGUgJj0gfihJX0xPQ0t8SV9ORVcpOworCXdha2VfdXBfaW5vZGUoaW5vZGUpOworfQorCitFWFBPUlRfU1lNQk9MKHVubG9ja19uZXdfaW5vZGUpOworCisvKgorICogVGhpcyBpcyBjYWxsZWQgd2l0aG91dCB0aGUgaW5vZGUgbG9jayBoZWxkLi4gQmUgY2FyZWZ1bC4KKyAqCisgKiBXZSBubyBsb25nZXIgY2FjaGUgdGhlIHNiX2ZsYWdzIGluIGlfZmxhZ3MgLSBzZWUgZnMuaAorICoJLS0gcm1rQGFybS51ay5saW51eC5vcmcKKyAqLworc3RhdGljIHN0cnVjdCBpbm9kZSAqIGdldF9uZXdfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQsIGludCAoKnRlc3QpKHN0cnVjdCBpbm9kZSAqLCB2b2lkICopLCBpbnQgKCpzZXQpKHN0cnVjdCBpbm9kZSAqLCB2b2lkICopLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCisJaW5vZGUgPSBhbGxvY19pbm9kZShzYik7CisJaWYgKGlub2RlKSB7CisJCXN0cnVjdCBpbm9kZSAqIG9sZDsKKworCQlzcGluX2xvY2soJmlub2RlX2xvY2spOworCQkvKiBXZSByZWxlYXNlZCB0aGUgbG9jaywgc28uLiAqLworCQlvbGQgPSBmaW5kX2lub2RlKHNiLCBoZWFkLCB0ZXN0LCBkYXRhKTsKKwkJaWYgKCFvbGQpIHsKKwkJCWlmIChzZXQoaW5vZGUsIGRhdGEpKQorCQkJCWdvdG8gc2V0X2ZhaWxlZDsKKworCQkJaW5vZGVzX3N0YXQubnJfaW5vZGVzKys7CisJCQlsaXN0X2FkZCgmaW5vZGUtPmlfbGlzdCwgJmlub2RlX2luX3VzZSk7CisJCQlsaXN0X2FkZCgmaW5vZGUtPmlfc2JfbGlzdCwgJnNiLT5zX2lub2Rlcyk7CisJCQlobGlzdF9hZGRfaGVhZCgmaW5vZGUtPmlfaGFzaCwgaGVhZCk7CisJCQlpbm9kZS0+aV9zdGF0ZSA9IElfTE9DS3xJX05FVzsKKwkJCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKKworCQkJLyogUmV0dXJuIHRoZSBsb2NrZWQgaW5vZGUgd2l0aCBJX05FVyBzZXQsIHRoZQorCQkJICogY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBmaWxsaW5nIGluIHRoZSBjb250ZW50cworCQkJICovCisJCQlyZXR1cm4gaW5vZGU7CisJCX0KKworCQkvKgorCQkgKiBVaGh1aCwgc29tZWJvZHkgZWxzZSBjcmVhdGVkIHRoZSBzYW1lIGlub2RlIHVuZGVyCisJCSAqIHVzLiBVc2UgdGhlIG9sZCBpbm9kZSBpbnN0ZWFkIG9mIHRoZSBvbmUgd2UganVzdAorCQkgKiBhbGxvY2F0ZWQuCisJCSAqLworCQlfX2lnZXQob2xkKTsKKwkJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworCQlkZXN0cm95X2lub2RlKGlub2RlKTsKKwkJaW5vZGUgPSBvbGQ7CisJCXdhaXRfb25faW5vZGUoaW5vZGUpOworCX0KKwlyZXR1cm4gaW5vZGU7CisKK3NldF9mYWlsZWQ6CisJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworCWRlc3Ryb3lfaW5vZGUoaW5vZGUpOworCXJldHVybiBOVUxMOworfQorCisvKgorICogZ2V0X25ld19pbm9kZV9mYXN0IGlzIHRoZSBmYXN0IHBhdGggdmVyc2lvbiBvZiBnZXRfbmV3X2lub2RlLCBzZWUgdGhlCisgKiBjb21tZW50IGF0IGlnZXRfbG9ja2VkIGZvciBkZXRhaWxzLgorICovCitzdGF0aWMgc3RydWN0IGlub2RlICogZ2V0X25ld19pbm9kZV9mYXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBobGlzdF9oZWFkICpoZWFkLCB1bnNpZ25lZCBsb25nIGlubykKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKworCWlub2RlID0gYWxsb2NfaW5vZGUoc2IpOworCWlmIChpbm9kZSkgeworCQlzdHJ1Y3QgaW5vZGUgKiBvbGQ7CisKKwkJc3Bpbl9sb2NrKCZpbm9kZV9sb2NrKTsKKwkJLyogV2UgcmVsZWFzZWQgdGhlIGxvY2ssIHNvLi4gKi8KKwkJb2xkID0gZmluZF9pbm9kZV9mYXN0KHNiLCBoZWFkLCBpbm8pOworCQlpZiAoIW9sZCkgeworCQkJaW5vZGUtPmlfaW5vID0gaW5vOworCQkJaW5vZGVzX3N0YXQubnJfaW5vZGVzKys7CisJCQlsaXN0X2FkZCgmaW5vZGUtPmlfbGlzdCwgJmlub2RlX2luX3VzZSk7CisJCQlsaXN0X2FkZCgmaW5vZGUtPmlfc2JfbGlzdCwgJnNiLT5zX2lub2Rlcyk7CisJCQlobGlzdF9hZGRfaGVhZCgmaW5vZGUtPmlfaGFzaCwgaGVhZCk7CisJCQlpbm9kZS0+aV9zdGF0ZSA9IElfTE9DS3xJX05FVzsKKwkJCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKKworCQkJLyogUmV0dXJuIHRoZSBsb2NrZWQgaW5vZGUgd2l0aCBJX05FVyBzZXQsIHRoZQorCQkJICogY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBmaWxsaW5nIGluIHRoZSBjb250ZW50cworCQkJICovCisJCQlyZXR1cm4gaW5vZGU7CisJCX0KKworCQkvKgorCQkgKiBVaGh1aCwgc29tZWJvZHkgZWxzZSBjcmVhdGVkIHRoZSBzYW1lIGlub2RlIHVuZGVyCisJCSAqIHVzLiBVc2UgdGhlIG9sZCBpbm9kZSBpbnN0ZWFkIG9mIHRoZSBvbmUgd2UganVzdAorCQkgKiBhbGxvY2F0ZWQuCisJCSAqLworCQlfX2lnZXQob2xkKTsKKwkJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworCQlkZXN0cm95X2lub2RlKGlub2RlKTsKKwkJaW5vZGUgPSBvbGQ7CisJCXdhaXRfb25faW5vZGUoaW5vZGUpOworCX0KKwlyZXR1cm4gaW5vZGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBoYXNoKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGxvbmcgaGFzaHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCXRtcCA9IChoYXNodmFsICogKHVuc2lnbmVkIGxvbmcpc2IpIF4gKEdPTERFTl9SQVRJT19QUklNRSArIGhhc2h2YWwpIC8KKwkJCUwxX0NBQ0hFX0JZVEVTOworCXRtcCA9IHRtcCBeICgodG1wIF4gR09MREVOX1JBVElPX1BSSU1FKSA+PiBJX0hBU0hCSVRTKTsKKwlyZXR1cm4gdG1wICYgSV9IQVNITUFTSzsKK30KKworLyoqCisgKglpdW5pcXVlIC0gZ2V0IGEgdW5pcXVlIGlub2RlIG51bWJlcgorICoJQHNiOiBzdXBlcmJsb2NrCisgKglAbWF4X3Jlc2VydmVkOiBoaWdoZXN0IHJlc2VydmVkIGlub2RlIG51bWJlcgorICoKKyAqCU9idGFpbiBhbiBpbm9kZSBudW1iZXIgdGhhdCBpcyB1bmlxdWUgb24gdGhlIHN5c3RlbSBmb3IgYSBnaXZlbgorICoJc3VwZXJibG9jay4gVGhpcyBpcyB1c2VkIGJ5IGZpbGUgc3lzdGVtcyB0aGF0IGhhdmUgbm8gbmF0dXJhbAorICoJcGVybWFuZW50IGlub2RlIG51bWJlcmluZyBzeXN0ZW0uIEFuIGlub2RlIG51bWJlciBpcyByZXR1cm5lZCB0aGF0CisgKglpcyBoaWdoZXIgdGhhbiB0aGUgcmVzZXJ2ZWQgbGltaXQgYnV0IHVuaXF1ZS4KKyAqCisgKglCVUdTOgorICoJV2l0aCBhIGxhcmdlIG51bWJlciBvZiBpbm9kZXMgbGl2ZSBvbiB0aGUgZmlsZSBzeXN0ZW0gdGhpcyBmdW5jdGlvbgorICoJY3VycmVudGx5IGJlY29tZXMgcXVpdGUgc2xvdy4KKyAqLworaW5vX3QgaXVuaXF1ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbm9fdCBtYXhfcmVzZXJ2ZWQpCit7CisJc3RhdGljIGlub190IGNvdW50ZXI7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqIGhlYWQ7CisJaW5vX3QgcmVzOworCXNwaW5fbG9jaygmaW5vZGVfbG9jayk7CityZXRyeToKKwlpZiAoY291bnRlciA+IG1heF9yZXNlcnZlZCkgeworCQloZWFkID0gaW5vZGVfaGFzaHRhYmxlICsgaGFzaChzYixjb3VudGVyKTsKKwkJcmVzID0gY291bnRlcisrOworCQlpbm9kZSA9IGZpbmRfaW5vZGVfZmFzdChzYiwgaGVhZCwgcmVzKTsKKwkJaWYgKCFpbm9kZSkgeworCQkJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworCQkJcmV0dXJuIHJlczsKKwkJfQorCX0gZWxzZSB7CisJCWNvdW50ZXIgPSBtYXhfcmVzZXJ2ZWQgKyAxOworCX0KKwlnb3RvIHJldHJ5OworCQorfQorCitFWFBPUlRfU1lNQk9MKGl1bmlxdWUpOworCitzdHJ1Y3QgaW5vZGUgKmlncmFiKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3Bpbl9sb2NrKCZpbm9kZV9sb2NrKTsKKwlpZiAoIShpbm9kZS0+aV9zdGF0ZSAmIElfRlJFRUlORykpCisJCV9faWdldChpbm9kZSk7CisJZWxzZQorCQkvKgorCQkgKiBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgc19vcC0+Y2xlYXJfaW5vZGUgaXMgbm90IGJlZW4KKwkJICogY2FsbGVkIHlldCwgYW5kIHNvbWVib2R5IGlzIGNhbGxpbmcgaWdyYWIKKwkJICogd2hpbGUgdGhlIGlub2RlIGlzIGdldHRpbmcgZnJlZWQuCisJCSAqLworCQlpbm9kZSA9IE5VTEw7CisJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworCXJldHVybiBpbm9kZTsKK30KKworRVhQT1JUX1NZTUJPTChpZ3JhYik7CisKKy8qKgorICogaWZpbmQgLSBpbnRlcm5hbCBmdW5jdGlvbiwgeW91IHdhbnQgaWxvb2t1cDUoKSBvciBpZ2V0NSgpLgorICogQHNiOgkJc3VwZXIgYmxvY2sgb2YgZmlsZSBzeXN0ZW0gdG8gc2VhcmNoCisgKiBAaGVhZDogICAgICAgdGhlIGhlYWQgb2YgdGhlIGxpc3QgdG8gc2VhcmNoCisgKiBAdGVzdDoJY2FsbGJhY2sgdXNlZCBmb3IgY29tcGFyaXNvbnMgYmV0d2VlbiBpbm9kZXMKKyAqIEBkYXRhOglvcGFxdWUgZGF0YSBwb2ludGVyIHRvIHBhc3MgdG8gQHRlc3QKKyAqCisgKiBpZmluZCgpIHNlYXJjaGVzIGZvciB0aGUgaW5vZGUgc3BlY2lmaWVkIGJ5IEBkYXRhIGluIHRoZSBpbm9kZQorICogY2FjaGUuIFRoaXMgaXMgYSBnZW5lcmFsaXplZCB2ZXJzaW9uIG9mIGlmaW5kX2Zhc3QoKSBmb3IgZmlsZSBzeXN0ZW1zIHdoZXJlCisgKiB0aGUgaW5vZGUgbnVtYmVyIGlzIG5vdCBzdWZmaWNpZW50IGZvciB1bmlxdWUgaWRlbnRpZmljYXRpb24gb2YgYW4gaW5vZGUuCisgKgorICogSWYgdGhlIGlub2RlIGlzIGluIHRoZSBjYWNoZSwgdGhlIGlub2RlIGlzIHJldHVybmVkIHdpdGggYW4gaW5jcmVtZW50ZWQKKyAqIHJlZmVyZW5jZSBjb3VudC4KKyAqCisgKiBPdGhlcndpc2UgTlVMTCBpcyByZXR1cm5lZC4KKyAqCisgKiBOb3RlLCBAdGVzdCBpcyBjYWxsZWQgd2l0aCB0aGUgaW5vZGVfbG9jayBoZWxkLCBzbyBjYW4ndCBzbGVlcC4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW5vZGUgKmlmaW5kKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkLCBpbnQgKCp0ZXN0KShzdHJ1Y3QgaW5vZGUgKiwgdm9pZCAqKSwKKwkJdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJc3Bpbl9sb2NrKCZpbm9kZV9sb2NrKTsKKwlpbm9kZSA9IGZpbmRfaW5vZGUoc2IsIGhlYWQsIHRlc3QsIGRhdGEpOworCWlmIChpbm9kZSkgeworCQlfX2lnZXQoaW5vZGUpOworCQlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CisJCXdhaXRfb25faW5vZGUoaW5vZGUpOworCQlyZXR1cm4gaW5vZGU7CisJfQorCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBpZmluZF9mYXN0IC0gaW50ZXJuYWwgZnVuY3Rpb24sIHlvdSB3YW50IGlsb29rdXAoKSBvciBpZ2V0KCkuCisgKiBAc2I6CQlzdXBlciBibG9jayBvZiBmaWxlIHN5c3RlbSB0byBzZWFyY2gKKyAqIEBoZWFkOiAgICAgICBoZWFkIG9mIHRoZSBsaXN0IHRvIHNlYXJjaAorICogQGlubzoJaW5vZGUgbnVtYmVyIHRvIHNlYXJjaCBmb3IKKyAqCisgKiBpZmluZF9mYXN0KCkgc2VhcmNoZXMgZm9yIHRoZSBpbm9kZSBAaW5vIGluIHRoZSBpbm9kZSBjYWNoZS4gVGhpcyBpcyBmb3IKKyAqIGZpbGUgc3lzdGVtcyB3aGVyZSB0aGUgaW5vZGUgbnVtYmVyIGlzIHN1ZmZpY2llbnQgZm9yIHVuaXF1ZSBpZGVudGlmaWNhdGlvbgorICogb2YgYW4gaW5vZGUuCisgKgorICogSWYgdGhlIGlub2RlIGlzIGluIHRoZSBjYWNoZSwgdGhlIGlub2RlIGlzIHJldHVybmVkIHdpdGggYW4gaW5jcmVtZW50ZWQKKyAqIHJlZmVyZW5jZSBjb3VudC4KKyAqCisgKiBPdGhlcndpc2UgTlVMTCBpcyByZXR1cm5lZC4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW5vZGUgKmlmaW5kX2Zhc3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQsIHVuc2lnbmVkIGxvbmcgaW5vKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwlzcGluX2xvY2soJmlub2RlX2xvY2spOworCWlub2RlID0gZmluZF9pbm9kZV9mYXN0KHNiLCBoZWFkLCBpbm8pOworCWlmIChpbm9kZSkgeworCQlfX2lnZXQoaW5vZGUpOworCQlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CisJCXdhaXRfb25faW5vZGUoaW5vZGUpOworCQlyZXR1cm4gaW5vZGU7CisJfQorCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBpbG9va3VwNSAtIHNlYXJjaCBmb3IgYW4gaW5vZGUgaW4gdGhlIGlub2RlIGNhY2hlCisgKiBAc2I6CQlzdXBlciBibG9jayBvZiBmaWxlIHN5c3RlbSB0byBzZWFyY2gKKyAqIEBoYXNodmFsOgloYXNoIHZhbHVlICh1c3VhbGx5IGlub2RlIG51bWJlcikgdG8gc2VhcmNoIGZvcgorICogQHRlc3Q6CWNhbGxiYWNrIHVzZWQgZm9yIGNvbXBhcmlzb25zIGJldHdlZW4gaW5vZGVzCisgKiBAZGF0YToJb3BhcXVlIGRhdGEgcG9pbnRlciB0byBwYXNzIHRvIEB0ZXN0CisgKgorICogaWxvb2t1cDUoKSB1c2VzIGlmaW5kKCkgdG8gc2VhcmNoIGZvciB0aGUgaW5vZGUgc3BlY2lmaWVkIGJ5IEBoYXNodmFsIGFuZAorICogQGRhdGEgaW4gdGhlIGlub2RlIGNhY2hlLiBUaGlzIGlzIGEgZ2VuZXJhbGl6ZWQgdmVyc2lvbiBvZiBpbG9va3VwKCkgZm9yCisgKiBmaWxlIHN5c3RlbXMgd2hlcmUgdGhlIGlub2RlIG51bWJlciBpcyBub3Qgc3VmZmljaWVudCBmb3IgdW5pcXVlCisgKiBpZGVudGlmaWNhdGlvbiBvZiBhbiBpbm9kZS4KKyAqCisgKiBJZiB0aGUgaW5vZGUgaXMgaW4gdGhlIGNhY2hlLCB0aGUgaW5vZGUgaXMgcmV0dXJuZWQgd2l0aCBhbiBpbmNyZW1lbnRlZAorICogcmVmZXJlbmNlIGNvdW50LgorICoKKyAqIE90aGVyd2lzZSBOVUxMIGlzIHJldHVybmVkLgorICoKKyAqIE5vdGUsIEB0ZXN0IGlzIGNhbGxlZCB3aXRoIHRoZSBpbm9kZV9sb2NrIGhlbGQsIHNvIGNhbid0IHNsZWVwLgorICovCitzdHJ1Y3QgaW5vZGUgKmlsb29rdXA1KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGxvbmcgaGFzaHZhbCwKKwkJaW50ICgqdGVzdCkoc3RydWN0IGlub2RlICosIHZvaWQgKiksIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQgPSBpbm9kZV9oYXNodGFibGUgKyBoYXNoKHNiLCBoYXNodmFsKTsKKworCXJldHVybiBpZmluZChzYiwgaGVhZCwgdGVzdCwgZGF0YSk7Cit9CisKK0VYUE9SVF9TWU1CT0woaWxvb2t1cDUpOworCisvKioKKyAqIGlsb29rdXAgLSBzZWFyY2ggZm9yIGFuIGlub2RlIGluIHRoZSBpbm9kZSBjYWNoZQorICogQHNiOgkJc3VwZXIgYmxvY2sgb2YgZmlsZSBzeXN0ZW0gdG8gc2VhcmNoCisgKiBAaW5vOglpbm9kZSBudW1iZXIgdG8gc2VhcmNoIGZvcgorICoKKyAqIGlsb29rdXAoKSB1c2VzIGlmaW5kX2Zhc3QoKSB0byBzZWFyY2ggZm9yIHRoZSBpbm9kZSBAaW5vIGluIHRoZSBpbm9kZSBjYWNoZS4KKyAqIFRoaXMgaXMgZm9yIGZpbGUgc3lzdGVtcyB3aGVyZSB0aGUgaW5vZGUgbnVtYmVyIGlzIHN1ZmZpY2llbnQgZm9yIHVuaXF1ZQorICogaWRlbnRpZmljYXRpb24gb2YgYW4gaW5vZGUuCisgKgorICogSWYgdGhlIGlub2RlIGlzIGluIHRoZSBjYWNoZSwgdGhlIGlub2RlIGlzIHJldHVybmVkIHdpdGggYW4gaW5jcmVtZW50ZWQKKyAqIHJlZmVyZW5jZSBjb3VudC4KKyAqCisgKiBPdGhlcndpc2UgTlVMTCBpcyByZXR1cm5lZC4KKyAqLworc3RydWN0IGlub2RlICppbG9va3VwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGxvbmcgaW5vKQoreworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkID0gaW5vZGVfaGFzaHRhYmxlICsgaGFzaChzYiwgaW5vKTsKKworCXJldHVybiBpZmluZF9mYXN0KHNiLCBoZWFkLCBpbm8pOworfQorCitFWFBPUlRfU1lNQk9MKGlsb29rdXApOworCisvKioKKyAqIGlnZXQ1X2xvY2tlZCAtIG9idGFpbiBhbiBpbm9kZSBmcm9tIGEgbW91bnRlZCBmaWxlIHN5c3RlbQorICogQHNiOgkJc3VwZXIgYmxvY2sgb2YgZmlsZSBzeXN0ZW0KKyAqIEBoYXNodmFsOgloYXNoIHZhbHVlICh1c3VhbGx5IGlub2RlIG51bWJlcikgdG8gZ2V0CisgKiBAdGVzdDoJY2FsbGJhY2sgdXNlZCBmb3IgY29tcGFyaXNvbnMgYmV0d2VlbiBpbm9kZXMKKyAqIEBzZXQ6CWNhbGxiYWNrIHVzZWQgdG8gaW5pdGlhbGl6ZSBhIG5ldyBzdHJ1Y3QgaW5vZGUKKyAqIEBkYXRhOglvcGFxdWUgZGF0YSBwb2ludGVyIHRvIHBhc3MgdG8gQHRlc3QgYW5kIEBzZXQKKyAqCisgKiBUaGlzIGlzIGlnZXQoKSB3aXRob3V0IHRoZSByZWFkX2lub2RlKCkgcG9ydGlvbiBvZiBnZXRfbmV3X2lub2RlKCkuCisgKgorICogaWdldDVfbG9ja2VkKCkgdXNlcyBpZmluZCgpIHRvIHNlYXJjaCBmb3IgdGhlIGlub2RlIHNwZWNpZmllZCBieSBAaGFzaHZhbAorICogYW5kIEBkYXRhIGluIHRoZSBpbm9kZSBjYWNoZSBhbmQgaWYgcHJlc2VudCBpdCBpcyByZXR1cm5lZCB3aXRoIGFuIGluY3JlYXNlZAorICogcmVmZXJlbmNlIGNvdW50LiBUaGlzIGlzIGEgZ2VuZXJhbGl6ZWQgdmVyc2lvbiBvZiBpZ2V0X2xvY2tlZCgpIGZvciBmaWxlCisgKiBzeXN0ZW1zIHdoZXJlIHRoZSBpbm9kZSBudW1iZXIgaXMgbm90IHN1ZmZpY2llbnQgZm9yIHVuaXF1ZSBpZGVudGlmaWNhdGlvbgorICogb2YgYW4gaW5vZGUuCisgKgorICogSWYgdGhlIGlub2RlIGlzIG5vdCBpbiBjYWNoZSwgZ2V0X25ld19pbm9kZSgpIGlzIGNhbGxlZCB0byBhbGxvY2F0ZSBhIG5ldworICogaW5vZGUgYW5kIHRoaXMgaXMgcmV0dXJuZWQgbG9ja2VkLCBoYXNoZWQsIGFuZCB3aXRoIHRoZSBJX05FVyBmbGFnIHNldC4gVGhlCisgKiBmaWxlIHN5c3RlbSBnZXRzIHRvIGZpbGwgaXQgaW4gYmVmb3JlIHVubG9ja2luZyBpdCB2aWEgdW5sb2NrX25ld19pbm9kZSgpLgorICoKKyAqIE5vdGUgYm90aCBAdGVzdCBhbmQgQHNldCBhcmUgY2FsbGVkIHdpdGggdGhlIGlub2RlX2xvY2sgaGVsZCwgc28gY2FuJ3Qgc2xlZXAuCisgKi8KK3N0cnVjdCBpbm9kZSAqaWdldDVfbG9ja2VkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGxvbmcgaGFzaHZhbCwKKwkJaW50ICgqdGVzdCkoc3RydWN0IGlub2RlICosIHZvaWQgKiksCisJCWludCAoKnNldCkoc3RydWN0IGlub2RlICosIHZvaWQgKiksIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQgPSBpbm9kZV9oYXNodGFibGUgKyBoYXNoKHNiLCBoYXNodmFsKTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJaW5vZGUgPSBpZmluZChzYiwgaGVhZCwgdGVzdCwgZGF0YSk7CisJaWYgKGlub2RlKQorCQlyZXR1cm4gaW5vZGU7CisJLyoKKwkgKiBnZXRfbmV3X2lub2RlKCkgd2lsbCBkbyB0aGUgcmlnaHQgdGhpbmcsIHJlLXRyeWluZyB0aGUgc2VhcmNoCisJICogaW4gY2FzZSBpdCBoYWQgdG8gYmxvY2sgYXQgYW55IHBvaW50LgorCSAqLworCXJldHVybiBnZXRfbmV3X2lub2RlKHNiLCBoZWFkLCB0ZXN0LCBzZXQsIGRhdGEpOworfQorCitFWFBPUlRfU1lNQk9MKGlnZXQ1X2xvY2tlZCk7CisKKy8qKgorICogaWdldF9sb2NrZWQgLSBvYnRhaW4gYW4gaW5vZGUgZnJvbSBhIG1vdW50ZWQgZmlsZSBzeXN0ZW0KKyAqIEBzYjoJCXN1cGVyIGJsb2NrIG9mIGZpbGUgc3lzdGVtCisgKiBAaW5vOglpbm9kZSBudW1iZXIgdG8gZ2V0CisgKgorICogVGhpcyBpcyBpZ2V0KCkgd2l0aG91dCB0aGUgcmVhZF9pbm9kZSgpIHBvcnRpb24gb2YgZ2V0X25ld19pbm9kZV9mYXN0KCkuCisgKgorICogaWdldF9sb2NrZWQoKSB1c2VzIGlmaW5kX2Zhc3QoKSB0byBzZWFyY2ggZm9yIHRoZSBpbm9kZSBzcGVjaWZpZWQgYnkgQGlubyBpbgorICogdGhlIGlub2RlIGNhY2hlIGFuZCBpZiBwcmVzZW50IGl0IGlzIHJldHVybmVkIHdpdGggYW4gaW5jcmVhc2VkIHJlZmVyZW5jZQorICogY291bnQuIFRoaXMgaXMgZm9yIGZpbGUgc3lzdGVtcyB3aGVyZSB0aGUgaW5vZGUgbnVtYmVyIGlzIHN1ZmZpY2llbnQgZm9yCisgKiB1bmlxdWUgaWRlbnRpZmljYXRpb24gb2YgYW4gaW5vZGUuCisgKgorICogSWYgdGhlIGlub2RlIGlzIG5vdCBpbiBjYWNoZSwgZ2V0X25ld19pbm9kZV9mYXN0KCkgaXMgY2FsbGVkIHRvIGFsbG9jYXRlIGEKKyAqIG5ldyBpbm9kZSBhbmQgdGhpcyBpcyByZXR1cm5lZCBsb2NrZWQsIGhhc2hlZCwgYW5kIHdpdGggdGhlIElfTkVXIGZsYWcgc2V0LgorICogVGhlIGZpbGUgc3lzdGVtIGdldHMgdG8gZmlsbCBpdCBpbiBiZWZvcmUgdW5sb2NraW5nIGl0IHZpYQorICogdW5sb2NrX25ld19pbm9kZSgpLgorICovCitzdHJ1Y3QgaW5vZGUgKmlnZXRfbG9ja2VkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVuc2lnbmVkIGxvbmcgaW5vKQoreworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkID0gaW5vZGVfaGFzaHRhYmxlICsgaGFzaChzYiwgaW5vKTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJaW5vZGUgPSBpZmluZF9mYXN0KHNiLCBoZWFkLCBpbm8pOworCWlmIChpbm9kZSkKKwkJcmV0dXJuIGlub2RlOworCS8qCisJICogZ2V0X25ld19pbm9kZV9mYXN0KCkgd2lsbCBkbyB0aGUgcmlnaHQgdGhpbmcsIHJlLXRyeWluZyB0aGUgc2VhcmNoCisJICogaW4gY2FzZSBpdCBoYWQgdG8gYmxvY2sgYXQgYW55IHBvaW50LgorCSAqLworCXJldHVybiBnZXRfbmV3X2lub2RlX2Zhc3Qoc2IsIGhlYWQsIGlubyk7Cit9CisKK0VYUE9SVF9TWU1CT0woaWdldF9sb2NrZWQpOworCisvKioKKyAqCV9faW5zZXJ0X2lub2RlX2hhc2ggLSBoYXNoIGFuIGlub2RlCisgKglAaW5vZGU6IHVuaGFzaGVkIGlub2RlCisgKglAaGFzaHZhbDogdW5zaWduZWQgbG9uZyB2YWx1ZSB1c2VkIHRvIGxvY2F0ZSB0aGlzIG9iamVjdCBpbiB0aGUKKyAqCQlpbm9kZV9oYXNodGFibGUuCisgKgorICoJQWRkIGFuIGlub2RlIHRvIHRoZSBpbm9kZSBoYXNoIGZvciB0aGlzIHN1cGVyYmxvY2suCisgKi8KK3ZvaWQgX19pbnNlcnRfaW5vZGVfaGFzaChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIGhhc2h2YWwpCit7CisJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQgPSBpbm9kZV9oYXNodGFibGUgKyBoYXNoKGlub2RlLT5pX3NiLCBoYXNodmFsKTsKKwlzcGluX2xvY2soJmlub2RlX2xvY2spOworCWhsaXN0X2FkZF9oZWFkKCZpbm9kZS0+aV9oYXNoLCBoZWFkKTsKKwlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7Cit9CisKK0VYUE9SVF9TWU1CT0woX19pbnNlcnRfaW5vZGVfaGFzaCk7CisKKy8qKgorICoJcmVtb3ZlX2lub2RlX2hhc2ggLSByZW1vdmUgYW4gaW5vZGUgZnJvbSB0aGUgaGFzaAorICoJQGlub2RlOiBpbm9kZSB0byB1bmhhc2gKKyAqCisgKglSZW1vdmUgYW4gaW5vZGUgZnJvbSB0aGUgc3VwZXJibG9jay4KKyAqLwordm9pZCByZW1vdmVfaW5vZGVfaGFzaChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXNwaW5fbG9jaygmaW5vZGVfbG9jayk7CisJaGxpc3RfZGVsX2luaXQoJmlub2RlLT5pX2hhc2gpOworCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKK30KKworRVhQT1JUX1NZTUJPTChyZW1vdmVfaW5vZGVfaGFzaCk7CisKKy8qCisgKiBUZWxsIHRoZSBmaWxlc3lzdGVtIHRoYXQgdGhpcyBpbm9kZSBpcyBubyBsb25nZXIgb2YgYW55IGludGVyZXN0IGFuZCBzaG91bGQKKyAqIGJlIGNvbXBsZXRlbHkgZGVzdHJveWVkLgorICoKKyAqIFdlIGxlYXZlIHRoZSBpbm9kZSBpbiB0aGUgaW5vZGUgaGFzaCB0YWJsZSB1bnRpbCAqYWZ0ZXIqIHRoZSBmaWxlc3lzdGVtJ3MKKyAqIC0+ZGVsZXRlX2lub2RlIGNvbXBsZXRlcy4gIFRoaXMgZW5zdXJlcyB0aGF0IGFuIGlnZXQgKHN1Y2ggYXMgbmZzZCBtaWdodAorICogaW5zdGlnYXRlKSB3aWxsIGFsd2F5cyBmaW5kIHVwLXRvLWRhdGUgaW5mb3JtYXRpb24gZWl0aGVyIGluIHRoZSBoYXNoIG9yIG9uCisgKiBkaXNrLgorICoKKyAqIElfRlJFRUlORyBpcyBzZXQgc28gdGhhdCBuby1vbmUgd2lsbCB0YWtlIGEgbmV3IHJlZmVyZW5jZSB0byB0aGUgaW5vZGUgd2hpbGUKKyAqIGl0IGlzIGJlaW5nIGRlbGV0ZWQuCisgKi8KK3ZvaWQgZ2VuZXJpY19kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyAqb3AgPSBpbm9kZS0+aV9zYi0+c19vcDsKKworCWxpc3RfZGVsX2luaXQoJmlub2RlLT5pX2xpc3QpOworCWxpc3RfZGVsX2luaXQoJmlub2RlLT5pX3NiX2xpc3QpOworCWlub2RlLT5pX3N0YXRlfD1JX0ZSRUVJTkc7CisJaW5vZGVzX3N0YXQubnJfaW5vZGVzLS07CisJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworCisJaWYgKGlub2RlLT5pX2RhdGEubnJwYWdlcykKKwkJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoJmlub2RlLT5pX2RhdGEsIDApOworCisJc2VjdXJpdHlfaW5vZGVfZGVsZXRlKGlub2RlKTsKKworCWlmIChvcC0+ZGVsZXRlX2lub2RlKSB7CisJCXZvaWQgKCpkZWxldGUpKHN0cnVjdCBpbm9kZSAqKSA9IG9wLT5kZWxldGVfaW5vZGU7CisJCWlmICghaXNfYmFkX2lub2RlKGlub2RlKSkKKwkJCURRVU9UX0lOSVQoaW5vZGUpOworCQkvKiBzX29wLT5kZWxldGVfaW5vZGUgaW50ZXJuYWxseSByZWNhbGxzIGNsZWFyX2lub2RlKCkgKi8KKwkJZGVsZXRlKGlub2RlKTsKKwl9IGVsc2UKKwkJY2xlYXJfaW5vZGUoaW5vZGUpOworCXNwaW5fbG9jaygmaW5vZGVfbG9jayk7CisJaGxpc3RfZGVsX2luaXQoJmlub2RlLT5pX2hhc2gpOworCXNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKKwl3YWtlX3VwX2lub2RlKGlub2RlKTsKKwlpZiAoaW5vZGUtPmlfc3RhdGUgIT0gSV9DTEVBUikKKwkJQlVHKCk7CisJZGVzdHJveV9pbm9kZShpbm9kZSk7Cit9CisKK0VYUE9SVF9TWU1CT0woZ2VuZXJpY19kZWxldGVfaW5vZGUpOworCitzdGF0aWMgdm9pZCBnZW5lcmljX2ZvcmdldF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKworCWlmICghaGxpc3RfdW5oYXNoZWQoJmlub2RlLT5pX2hhc2gpKSB7CisJCWlmICghKGlub2RlLT5pX3N0YXRlICYgKElfRElSVFl8SV9MT0NLKSkpCisJCQlsaXN0X21vdmUoJmlub2RlLT5pX2xpc3QsICZpbm9kZV91bnVzZWQpOworCQlpbm9kZXNfc3RhdC5ucl91bnVzZWQrKzsKKwkJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworCQlpZiAoIXNiIHx8IChzYi0+c19mbGFncyAmIE1TX0FDVElWRSkpCisJCQlyZXR1cm47CisJCXdyaXRlX2lub2RlX25vdyhpbm9kZSwgMSk7CisJCXNwaW5fbG9jaygmaW5vZGVfbG9jayk7CisJCWlub2Rlc19zdGF0Lm5yX3VudXNlZC0tOworCQlobGlzdF9kZWxfaW5pdCgmaW5vZGUtPmlfaGFzaCk7CisJfQorCWxpc3RfZGVsX2luaXQoJmlub2RlLT5pX2xpc3QpOworCWxpc3RfZGVsX2luaXQoJmlub2RlLT5pX3NiX2xpc3QpOworCWlub2RlLT5pX3N0YXRlfD1JX0ZSRUVJTkc7CisJaW5vZGVzX3N0YXQubnJfaW5vZGVzLS07CisJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworCWlmIChpbm9kZS0+aV9kYXRhLm5ycGFnZXMpCisJCXRydW5jYXRlX2lub2RlX3BhZ2VzKCZpbm9kZS0+aV9kYXRhLCAwKTsKKwljbGVhcl9pbm9kZShpbm9kZSk7CisJZGVzdHJveV9pbm9kZShpbm9kZSk7Cit9CisKKy8qCisgKiBOb3JtYWwgVU5JWCBmaWxlc3lzdGVtIGJlaGF2aW91cjogZGVsZXRlIHRoZQorICogaW5vZGUgd2hlbiB0aGUgdXNhZ2UgY291bnQgZHJvcHMgdG8gemVybywgYW5kCisgKiBpX25saW5rIGlzIHplcm8uCisgKi8KK3N0YXRpYyB2b2lkIGdlbmVyaWNfZHJvcF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmICghaW5vZGUtPmlfbmxpbmspCisJCWdlbmVyaWNfZGVsZXRlX2lub2RlKGlub2RlKTsKKwllbHNlCisJCWdlbmVyaWNfZm9yZ2V0X2lub2RlKGlub2RlKTsKK30KKworLyoKKyAqIENhbGxlZCB3aGVuIHdlJ3JlIGRyb3BwaW5nIHRoZSBsYXN0IHJlZmVyZW5jZQorICogdG8gYW4gaW5vZGUuIAorICoKKyAqIENhbGwgdGhlIEZTICJkcm9wKCkiIGZ1bmN0aW9uLCBkZWZhdWx0aW5nIHRvCisgKiB0aGUgbGVnYWN5IFVOSVggZmlsZXN5c3RlbSBiZWhhdmlvdXIuLgorICoKKyAqIE5PVEUhIE5PVEUhIE5PVEUhIFdlJ3JlIGNhbGxlZCB3aXRoIHRoZSBpbm9kZSBsb2NrCisgKiBoZWxkLCBhbmQgdGhlIGRyb3AgZnVuY3Rpb24gaXMgc3VwcG9zZWQgdG8gcmVsZWFzZQorICogdGhlIGxvY2shCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpcHV0X2ZpbmFsKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgKm9wID0gaW5vZGUtPmlfc2ItPnNfb3A7CisJdm9pZCAoKmRyb3ApKHN0cnVjdCBpbm9kZSAqKSA9IGdlbmVyaWNfZHJvcF9pbm9kZTsKKworCWlmIChvcCAmJiBvcC0+ZHJvcF9pbm9kZSkKKwkJZHJvcCA9IG9wLT5kcm9wX2lub2RlOworCWRyb3AoaW5vZGUpOworfQorCisvKioKKyAqCWlwdXQJLSBwdXQgYW4gaW5vZGUgCisgKglAaW5vZGU6IGlub2RlIHRvIHB1dAorICoKKyAqCVB1dHMgYW4gaW5vZGUsIGRyb3BwaW5nIGl0cyB1c2FnZSBjb3VudC4gSWYgdGhlIGlub2RlIHVzZSBjb3VudCBoaXRzCisgKgl6ZXJvLCB0aGUgaW5vZGUgaXMgdGhlbiBmcmVlZCBhbmQgbWF5IGFsc28gYmUgZGVzdHJveWVkLgorICoKKyAqCUNvbnNlcXVlbnRseSwgaXB1dCgpIGNhbiBzbGVlcC4KKyAqLwordm9pZCBpcHV0KHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaWYgKGlub2RlKSB7CisJCXN0cnVjdCBzdXBlcl9vcGVyYXRpb25zICpvcCA9IGlub2RlLT5pX3NiLT5zX29wOworCisJCUJVR19PTihpbm9kZS0+aV9zdGF0ZSA9PSBJX0NMRUFSKTsKKworCQlpZiAob3AgJiYgb3AtPnB1dF9pbm9kZSkKKwkJCW9wLT5wdXRfaW5vZGUoaW5vZGUpOworCisJCWlmIChhdG9taWNfZGVjX2FuZF9sb2NrKCZpbm9kZS0+aV9jb3VudCwgJmlub2RlX2xvY2spKQorCQkJaXB1dF9maW5hbChpbm9kZSk7CisJfQorfQorCitFWFBPUlRfU1lNQk9MKGlwdXQpOworCisvKioKKyAqCWJtYXAJLSBmaW5kIGEgYmxvY2sgbnVtYmVyIGluIGEgZmlsZQorICoJQGlub2RlOiBpbm9kZSBvZiBmaWxlCisgKglAYmxvY2s6IGJsb2NrIHRvIGZpbmQKKyAqCisgKglSZXR1cm5zIHRoZSBibG9jayBudW1iZXIgb24gdGhlIGRldmljZSBob2xkaW5nIHRoZSBpbm9kZSB0aGF0CisgKglpcyB0aGUgZGlzayBibG9jayBudW1iZXIgZm9yIHRoZSBibG9jayBvZiB0aGUgZmlsZSByZXF1ZXN0ZWQuCisgKglUaGF0IGlzLCBhc2tlZCBmb3IgYmxvY2sgNCBvZiBpbm9kZSAxIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUKKyAqCWRpc2sgYmxvY2sgcmVsYXRpdmUgdG8gdGhlIGRpc2sgc3RhcnQgdGhhdCBob2xkcyB0aGF0IGJsb2NrIG9mIHRoZSAKKyAqCWZpbGUuCisgKi8KK3NlY3Rvcl90IGJtYXAoc3RydWN0IGlub2RlICogaW5vZGUsIHNlY3Rvcl90IGJsb2NrKQoreworCXNlY3Rvcl90IHJlcyA9IDA7CisJaWYgKGlub2RlLT5pX21hcHBpbmctPmFfb3BzLT5ibWFwKQorCQlyZXMgPSBpbm9kZS0+aV9tYXBwaW5nLT5hX29wcy0+Ym1hcChpbm9kZS0+aV9tYXBwaW5nLCBibG9jayk7CisJcmV0dXJuIHJlczsKK30KKworRVhQT1JUX1NZTUJPTChibWFwKTsKKworLyoqCisgKgl1cGRhdGVfYXRpbWUJLQl1cGRhdGUgdGhlIGFjY2VzcyB0aW1lCisgKglAaW5vZGU6IGlub2RlIGFjY2Vzc2VkCisgKgorICoJVXBkYXRlIHRoZSBhY2Nlc3NlZCB0aW1lIG9uIGFuIGlub2RlIGFuZCBtYXJrIGl0IGZvciB3cml0ZWJhY2suCisgKglUaGlzIGZ1bmN0aW9uIGF1dG9tYXRpY2FsbHkgaGFuZGxlcyByZWFkIG9ubHkgZmlsZSBzeXN0ZW1zIGFuZCBtZWRpYSwKKyAqCWFzIHdlbGwgYXMgdGhlICJub2F0aW1lIiBmbGFnIGFuZCBpbm9kZSBzcGVjaWZpYyAibm9hdGltZSIgbWFya2Vycy4KKyAqLwordm9pZCB1cGRhdGVfYXRpbWUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgbm93OworCisJaWYgKElTX05PQVRJTUUoaW5vZGUpKQorCQlyZXR1cm47CisJaWYgKElTX05PRElSQVRJTUUoaW5vZGUpICYmIFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybjsKKwlpZiAoSVNfUkRPTkxZKGlub2RlKSkKKwkJcmV0dXJuOworCisJbm93ID0gY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKKwlpZiAoIXRpbWVzcGVjX2VxdWFsKCZpbm9kZS0+aV9hdGltZSwgJm5vdykpIHsKKwkJaW5vZGUtPmlfYXRpbWUgPSBub3c7CisJCW1hcmtfaW5vZGVfZGlydHlfc3luYyhpbm9kZSk7CisJfSBlbHNlIHsKKwkJaWYgKCF0aW1lc3BlY19lcXVhbCgmaW5vZGUtPmlfYXRpbWUsICZub3cpKQorCQkJaW5vZGUtPmlfYXRpbWUgPSBub3c7CisJfQorfQorCitFWFBPUlRfU1lNQk9MKHVwZGF0ZV9hdGltZSk7CisKKy8qKgorICoJaW5vZGVfdXBkYXRlX3RpbWUJLQl1cGRhdGUgbXRpbWUgYW5kIGN0aW1lIHRpbWUKKyAqCUBpbm9kZTogaW5vZGUgYWNjZXNzZWQKKyAqCUBjdGltZV90b286IHVwZGF0ZSBjdGltZSB0b28KKyAqCisgKglVcGRhdGUgdGhlIG10aW1lIHRpbWUgb24gYW4gaW5vZGUgYW5kIG1hcmsgaXQgZm9yIHdyaXRlYmFjay4KKyAqCVdoZW4gY3RpbWVfdG9vIGlzIHNwZWNpZmllZCB1cGRhdGUgdGhlIGN0aW1lIHRvby4KKyAqLworCit2b2lkIGlub2RlX3VwZGF0ZV90aW1lKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBjdGltZV90b28pCit7CisJc3RydWN0IHRpbWVzcGVjIG5vdzsKKwlpbnQgc3luY19pdCA9IDA7CisKKwlpZiAoSVNfTk9DTVRJTUUoaW5vZGUpKQorCQlyZXR1cm47CisJaWYgKElTX1JET05MWShpbm9kZSkpCisJCXJldHVybjsKKworCW5vdyA9IGN1cnJlbnRfZnNfdGltZShpbm9kZS0+aV9zYik7CisJaWYgKCF0aW1lc3BlY19lcXVhbCgmaW5vZGUtPmlfbXRpbWUsICZub3cpKQorCQlzeW5jX2l0ID0gMTsKKwlpbm9kZS0+aV9tdGltZSA9IG5vdzsKKworCWlmIChjdGltZV90b28pIHsKKwkJaWYgKCF0aW1lc3BlY19lcXVhbCgmaW5vZGUtPmlfY3RpbWUsICZub3cpKQorCQkJc3luY19pdCA9IDE7CisJCWlub2RlLT5pX2N0aW1lID0gbm93OworCX0KKwlpZiAoc3luY19pdCkKKwkJbWFya19pbm9kZV9kaXJ0eV9zeW5jKGlub2RlKTsKK30KKworRVhQT1JUX1NZTUJPTChpbm9kZV91cGRhdGVfdGltZSk7CisKK2ludCBpbm9kZV9uZWVkc19zeW5jKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaWYgKElTX1NZTkMoaW5vZGUpKQorCQlyZXR1cm4gMTsKKwlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSAmJiBJU19ESVJTWU5DKGlub2RlKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woaW5vZGVfbmVlZHNfc3luYyk7CisKKy8qCisgKglRdW90YSBmdW5jdGlvbnMgdGhhdCB3YW50IHRvIHdhbGsgdGhlIGlub2RlIGxpc3RzLi4KKyAqLworI2lmZGVmIENPTkZJR19RVU9UQQorCisvKiBGdW5jdGlvbiBiYWNrIGluIGRxdW90LmMgKi8KK2ludCByZW1vdmVfaW5vZGVfZHF1b3RfcmVmKHN0cnVjdCBpbm9kZSAqLCBpbnQsIHN0cnVjdCBsaXN0X2hlYWQgKik7CisKK3ZvaWQgcmVtb3ZlX2RxdW90X3JlZihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwKKwkJCXN0cnVjdCBsaXN0X2hlYWQgKnRvZnJlZV9oZWFkKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwlpZiAoIXNiLT5kcV9vcCkKKwkJcmV0dXJuOwkvKiBub3RoaW5nIHRvIGRvICovCisJc3Bpbl9sb2NrKCZpbm9kZV9sb2NrKTsJLyogVGhpcyBsb2NrIGlzIGZvciBpbm9kZXMgY29kZSAqLworCisJLyoKKwkgKiBXZSBkb24ndCBoYXZlIHRvIGxvY2sgYWdhaW5zdCBxdW90YSBjb2RlIC0gdGVzdCBJU19RVU9UQUlOSVQgaXMKKwkgKiBqdXN0IGZvciBzcGVlZHVwLi4uCisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShpbm9kZSwgJnNiLT5zX2lub2RlcywgaV9zYl9saXN0KQorCQlpZiAoIUlTX05PUVVPVEEoaW5vZGUpKQorCQkJcmVtb3ZlX2lub2RlX2RxdW90X3JlZihpbm9kZSwgdHlwZSwgdG9mcmVlX2hlYWQpOworCisJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworfQorCisjZW5kaWYKKworaW50IGlub2RlX3dhaXQodm9pZCAqd29yZCkKK3sKKwlzY2hlZHVsZSgpOworCXJldHVybiAwOworfQorCisvKgorICogSWYgd2UgdHJ5IHRvIGZpbmQgYW4gaW5vZGUgaW4gdGhlIGlub2RlIGhhc2ggd2hpbGUgaXQgaXMgYmVpbmcgZGVsZXRlZCwgd2UKKyAqIGhhdmUgdG8gd2FpdCB1bnRpbCB0aGUgZmlsZXN5c3RlbSBjb21wbGV0ZXMgaXRzIGRlbGV0aW9uIGJlZm9yZSByZXBvcnRpbmcKKyAqIHRoYXQgaXQgaXNuJ3QgZm91bmQuICBUaGlzIGlzIGJlY2F1c2UgaWdldCB3aWxsIGltbWVkaWF0ZWx5IGNhbGwKKyAqIC0+cmVhZF9pbm9kZSwgYW5kIHdlIHdhbnQgdG8gYmUgc3VyZSB0aGF0IGV2aWRlbmNlIG9mIHRoZSBkZWxldGlvbiBpcyBmb3VuZAorICogYnkgLT5yZWFkX2lub2RlLgorICogVGhpcyBpcyBjYWxsZWQgd2l0aCBpbm9kZV9sb2NrIGhlbGQuCisgKi8KK3N0YXRpYyB2b2lkIF9fd2FpdF9vbl9mcmVlaW5nX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJd2FpdF9xdWV1ZV9oZWFkX3QgKndxOworCURFRklORV9XQUlUX0JJVCh3YWl0LCAmaW5vZGUtPmlfc3RhdGUsIF9fSV9MT0NLKTsKKworCS8qCisJICogSV9GUkVFSU5HIGFuZCBJX0NMRUFSIGFyZSBjbGVhcmVkIGluIHByb2Nlc3MgY29udGV4dCB1bmRlcgorCSAqIGlub2RlX2xvY2ssIHNvIHdlIGhhdmUgdG8gZ2l2ZSB0aGUgdGFza3Mgd2hvIHdvdWxkIGNsZWFyIHRoZW0KKwkgKiBhIGNoYW5jZSB0byBydW4gYW5kIGFjcXVpcmUgaW5vZGVfbG9jay4KKwkgKi8KKwlpZiAoIShpbm9kZS0+aV9zdGF0ZSAmIElfTE9DSykpIHsKKwkJc3Bpbl91bmxvY2soJmlub2RlX2xvY2spOworCQl5aWVsZCgpOworCQlzcGluX2xvY2soJmlub2RlX2xvY2spOworCQlyZXR1cm47CisJfQorCXdxID0gYml0X3dhaXRxdWV1ZSgmaW5vZGUtPmlfc3RhdGUsIF9fSV9MT0NLKTsKKwlwcmVwYXJlX3RvX3dhaXQod3EsICZ3YWl0LndhaXQsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwlzcGluX3VubG9jaygmaW5vZGVfbG9jayk7CisJc2NoZWR1bGUoKTsKKwlmaW5pc2hfd2FpdCh3cSwgJndhaXQud2FpdCk7CisJc3Bpbl9sb2NrKCZpbm9kZV9sb2NrKTsKK30KKwordm9pZCB3YWtlX3VwX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJLyoKKwkgKiBQcmV2ZW50IHNwZWN1bGF0aXZlIGV4ZWN1dGlvbiB0aHJvdWdoIHNwaW5fdW5sb2NrKCZpbm9kZV9sb2NrKTsKKwkgKi8KKwlzbXBfbWIoKTsKKwl3YWtlX3VwX2JpdCgmaW5vZGUtPmlfc3RhdGUsIF9fSV9MT0NLKTsKK30KKworc3RhdGljIF9faW5pdGRhdGEgdW5zaWduZWQgbG9uZyBpaGFzaF9lbnRyaWVzOworc3RhdGljIGludCBfX2luaXQgc2V0X2loYXNoX2VudHJpZXMoY2hhciAqc3RyKQoreworCWlmICghc3RyKQorCQlyZXR1cm4gMDsKKwlpaGFzaF9lbnRyaWVzID0gc2ltcGxlX3N0cnRvdWwoc3RyLCAmc3RyLCAwKTsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoImloYXNoX2VudHJpZXM9Iiwgc2V0X2loYXNoX2VudHJpZXMpOworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgd2FpdHF1ZXVlcyBhbmQgaW5vZGUgaGFzaCB0YWJsZS4KKyAqLwordm9pZCBfX2luaXQgaW5vZGVfaW5pdF9lYXJseSh2b2lkKQoreworCWludCBsb29wOworCisJLyogSWYgaGFzaGVzIGFyZSBkaXN0cmlidXRlZCBhY3Jvc3MgTlVNQSBub2RlcywgZGVmZXIKKwkgKiBoYXNoIGFsbG9jYXRpb24gdW50aWwgdm1hbGxvYyBzcGFjZSBpcyBhdmFpbGFibGUuCisJICovCisJaWYgKGhhc2hkaXN0KQorCQlyZXR1cm47CisKKwlpbm9kZV9oYXNodGFibGUgPQorCQlhbGxvY19sYXJnZV9zeXN0ZW1faGFzaCgiSW5vZGUtY2FjaGUiLAorCQkJCQlzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQpLAorCQkJCQlpaGFzaF9lbnRyaWVzLAorCQkJCQkxNCwKKwkJCQkJSEFTSF9FQVJMWSwKKwkJCQkJJmlfaGFzaF9zaGlmdCwKKwkJCQkJJmlfaGFzaF9tYXNrLAorCQkJCQkwKTsKKworCWZvciAobG9vcCA9IDA7IGxvb3AgPCAoMSA8PCBpX2hhc2hfc2hpZnQpOyBsb29wKyspCisJCUlOSVRfSExJU1RfSEVBRCgmaW5vZGVfaGFzaHRhYmxlW2xvb3BdKTsKK30KKwordm9pZCBfX2luaXQgaW5vZGVfaW5pdCh1bnNpZ25lZCBsb25nIG1lbXBhZ2VzKQoreworCWludCBsb29wOworCisJLyogaW5vZGUgc2xhYiBjYWNoZSAqLworCWlub2RlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJpbm9kZV9jYWNoZSIsIHNpemVvZihzdHJ1Y3QgaW5vZGUpLAorCQkJCTAsIFNMQUJfUEFOSUMsIGluaXRfb25jZSwgTlVMTCk7CisJc2V0X3Nocmlua2VyKERFRkFVTFRfU0VFS1MsIHNocmlua19pY2FjaGVfbWVtb3J5KTsKKworCS8qIEhhc2ggbWF5IGhhdmUgYmVlbiBzZXQgdXAgaW4gaW5vZGVfaW5pdF9lYXJseSAqLworCWlmICghaGFzaGRpc3QpCisJCXJldHVybjsKKworCWlub2RlX2hhc2h0YWJsZSA9CisJCWFsbG9jX2xhcmdlX3N5c3RlbV9oYXNoKCJJbm9kZS1jYWNoZSIsCisJCQkJCXNpemVvZihzdHJ1Y3QgaGxpc3RfaGVhZCksCisJCQkJCWloYXNoX2VudHJpZXMsCisJCQkJCTE0LAorCQkJCQkwLAorCQkJCQkmaV9oYXNoX3NoaWZ0LAorCQkJCQkmaV9oYXNoX21hc2ssCisJCQkJCTApOworCisJZm9yIChsb29wID0gMDsgbG9vcCA8ICgxIDw8IGlfaGFzaF9zaGlmdCk7IGxvb3ArKykKKwkJSU5JVF9ITElTVF9IRUFEKCZpbm9kZV9oYXNodGFibGVbbG9vcF0pOworfQorCit2b2lkIGluaXRfc3BlY2lhbF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bW9kZV90IG1vZGUsIGRldl90IHJkZXYpCit7CisJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisJaWYgKFNfSVNDSFIobW9kZSkpIHsKKwkJaW5vZGUtPmlfZm9wID0gJmRlZl9jaHJfZm9wczsKKwkJaW5vZGUtPmlfcmRldiA9IHJkZXY7CisJfSBlbHNlIGlmIChTX0lTQkxLKG1vZGUpKSB7CisJCWlub2RlLT5pX2ZvcCA9ICZkZWZfYmxrX2ZvcHM7CisJCWlub2RlLT5pX3JkZXYgPSByZGV2OworCX0gZWxzZSBpZiAoU19JU0ZJRk8obW9kZSkpCisJCWlub2RlLT5pX2ZvcCA9ICZkZWZfZmlmb19mb3BzOworCWVsc2UgaWYgKFNfSVNTT0NLKG1vZGUpKQorCQlpbm9kZS0+aV9mb3AgPSAmYmFkX3NvY2tfZm9wczsKKwllbHNlCisJCXByaW50ayhLRVJOX0RFQlVHICJpbml0X3NwZWNpYWxfaW5vZGU6IGJvZ3VzIGlfbW9kZSAoJW8pXG4iLAorCQkgICAgICAgbW9kZSk7Cit9CitFWFBPUlRfU1lNQk9MKGluaXRfc3BlY2lhbF9pbm9kZSk7CmRpZmYgLS1naXQgYS9mcy9pb2N0bC5jIGIvZnMvaW9jdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjkyMDkxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaW9jdGwuYwpAQCAtMCwwICsxLDE4NiBAQAorLyoKKyAqICBsaW51eC9mcy9pb2N0bC5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgorCitzdGF0aWMgbG9uZyBkb19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKKwkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IGVycm9yID0gLUVOT1RUWTsKKworCWlmICghZmlscC0+Zl9vcCkKKwkJZ290byBvdXQ7CisKKwlpZiAoZmlscC0+Zl9vcC0+dW5sb2NrZWRfaW9jdGwpIHsKKwkJZXJyb3IgPSBmaWxwLT5mX29wLT51bmxvY2tlZF9pb2N0bChmaWxwLCBjbWQsIGFyZyk7CisJCWlmIChlcnJvciA9PSAtRU5PSU9DVExDTUQpCisJCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0gZWxzZSBpZiAoZmlscC0+Zl9vcC0+aW9jdGwpIHsKKwkJbG9ja19rZXJuZWwoKTsKKwkJZXJyb3IgPSBmaWxwLT5mX29wLT5pb2N0bChmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSwKKwkJCQkJICBmaWxwLCBjbWQsIGFyZyk7CisJCXVubG9ja19rZXJuZWwoKTsKKwl9CisKKyBvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IGZpbGVfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBjbWQsCisJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBlcnJvcjsKKwlpbnQgYmxvY2s7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgX191c2VyICpwID0gKGludCBfX3VzZXIgKilhcmc7CisKKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIEZJQk1BUDoKKwkJeworCQkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmaWxwLT5mX21hcHBpbmc7CisJCQlpbnQgcmVzOworCQkJLyogZG8gd2Ugc3VwcG9ydCB0aGlzIG1lc3M/ICovCisJCQlpZiAoIW1hcHBpbmctPmFfb3BzLT5ibWFwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkFXSU8pKQorCQkJCXJldHVybiAtRVBFUk07CisJCQlpZiAoKGVycm9yID0gZ2V0X3VzZXIoYmxvY2ssIHApKSAhPSAwKQorCQkJCXJldHVybiBlcnJvcjsKKworCQkJbG9ja19rZXJuZWwoKTsKKwkJCXJlcyA9IG1hcHBpbmctPmFfb3BzLT5ibWFwKG1hcHBpbmcsIGJsb2NrKTsKKwkJCXVubG9ja19rZXJuZWwoKTsKKwkJCXJldHVybiBwdXRfdXNlcihyZXMsIHApOworCQl9CisJCWNhc2UgRklHRVRCU1o6CisJCQlpZiAoaW5vZGUtPmlfc2IgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVCQURGOworCQkJcmV0dXJuIHB1dF91c2VyKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSwgcCk7CisJCWNhc2UgRklPTlJFQUQ6CisJCQlyZXR1cm4gcHV0X3VzZXIoaV9zaXplX3JlYWQoaW5vZGUpIC0gZmlscC0+Zl9wb3MsIHApOworCX0KKworCXJldHVybiBkb19pb2N0bChmaWxwLCBjbWQsIGFyZyk7Cit9CisKKy8qCisgKiBXaGVuIHlvdSBhZGQgYW55IG5ldyBjb21tb24gaW9jdGxzIHRvIHRoZSBzd2l0Y2hlcyBhYm92ZSBhbmQgYmVsb3cKKyAqIHBsZWFzZSB1cGRhdGUgY29tcGF0X3N5c19pb2N0bCgpIHRvby4KKyAqCisgKiB2ZnNfaW9jdGwoKSBpcyBub3QgZm9yIGRyaXZlcnMgYW5kIG5vdCBpbnRlbmRlZCB0byBiZSBFWFBPUlRfU1lNQk9MKCknZC4KKyAqIEl0J3MganVzdCBhIHNpbXBsZSBoZWxwZXIgZm9yIHN5c19pb2N0bCBhbmQgY29tcGF0X3N5c19pb2N0bC4KKyAqLworaW50IHZmc19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl1bnNpZ25lZCBpbnQgZmxhZzsKKwlpbnQgb24sIGVycm9yID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgRklPQ0xFWDoKKwkJCXNldF9jbG9zZV9vbl9leGVjKGZkLCAxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRklPTkNMRVg6CisJCQlzZXRfY2xvc2Vfb25fZXhlYyhmZCwgMCk7CisJCQlicmVhazsKKworCQljYXNlIEZJT05CSU86CisJCQlpZiAoKGVycm9yID0gZ2V0X3VzZXIob24sIChpbnQgX191c2VyICopYXJnKSkgIT0gMCkKKwkJCQlicmVhazsKKwkJCWZsYWcgPSBPX05PTkJMT0NLOworI2lmZGVmIF9fc3BhcmNfXworCQkJLyogU3VuT1MgY29tcGF0aWJpbGl0eSBpdGVtLiAqLworCQkJaWYoT19OT05CTE9DSyAhPSBPX05ERUxBWSkKKwkJCQlmbGFnIHw9IE9fTkRFTEFZOworI2VuZGlmCisJCQlpZiAob24pCisJCQkJZmlscC0+Zl9mbGFncyB8PSBmbGFnOworCQkJZWxzZQorCQkJCWZpbHAtPmZfZmxhZ3MgJj0gfmZsYWc7CisJCQlicmVhazsKKworCQljYXNlIEZJT0FTWU5DOgorCQkJaWYgKChlcnJvciA9IGdldF91c2VyKG9uLCAoaW50IF9fdXNlciAqKWFyZykpICE9IDApCisJCQkJYnJlYWs7CisJCQlmbGFnID0gb24gPyBGQVNZTkMgOiAwOworCisJCQkvKiBEaWQgRkFTWU5DIHN0YXRlIGNoYW5nZSA/ICovCisJCQlpZiAoKGZsYWcgXiBmaWxwLT5mX2ZsYWdzKSAmIEZBU1lOQykgeworCQkJCWlmIChmaWxwLT5mX29wICYmIGZpbHAtPmZfb3AtPmZhc3luYykgeworCQkJCQlsb2NrX2tlcm5lbCgpOworCQkJCQllcnJvciA9IGZpbHAtPmZfb3AtPmZhc3luYyhmZCwgZmlscCwgb24pOworCQkJCQl1bmxvY2tfa2VybmVsKCk7CisJCQkJfQorCQkJCWVsc2UgZXJyb3IgPSAtRU5PVFRZOworCQkJfQorCQkJaWYgKGVycm9yICE9IDApCisJCQkJYnJlYWs7CisKKwkJCWlmIChvbikKKwkJCQlmaWxwLT5mX2ZsYWdzIHw9IEZBU1lOQzsKKwkJCWVsc2UKKwkJCQlmaWxwLT5mX2ZsYWdzICY9IH5GQVNZTkM7CisJCQlicmVhazsKKworCQljYXNlIEZJT1FTSVpFOgorCQkJaWYgKFNfSVNESVIoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkgfHwKKwkJCSAgICBTX0lTUkVHKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpIHx8CisJCQkgICAgU19JU0xOSyhmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSkgeworCQkJCWxvZmZfdCByZXMgPSBpbm9kZV9nZXRfYnl0ZXMoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpOworCQkJCWVycm9yID0gY29weV90b191c2VyKChsb2ZmX3QgX191c2VyICopYXJnLCAmcmVzLCBzaXplb2YocmVzKSkgPyAtRUZBVUxUIDogMDsKKwkJCX0KKwkJCWVsc2UKKwkJCQllcnJvciA9IC1FTk9UVFk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlmIChTX0lTUkVHKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKQorCQkJCWVycm9yID0gZmlsZV9pb2N0bChmaWxwLCBjbWQsIGFyZyk7CisJCQllbHNlCisJCQkJZXJyb3IgPSBkb19pb2N0bChmaWxwLCBjbWQsIGFyZyk7CisJCQlicmVhazsKKwl9CisJcmV0dXJuIGVycm9yOworfQorCithc21saW5rYWdlIGxvbmcgc3lzX2lvY3RsKHVuc2lnbmVkIGludCBmZCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGZpbGUgKiBmaWxwOworCWludCBlcnJvciA9IC1FQkFERjsKKwlpbnQgZnB1dF9uZWVkZWQ7CisKKwlmaWxwID0gZmdldF9saWdodChmZCwgJmZwdXRfbmVlZGVkKTsKKwlpZiAoIWZpbHApCisJCWdvdG8gb3V0OworCisJZXJyb3IgPSBzZWN1cml0eV9maWxlX2lvY3RsKGZpbHAsIGNtZCwgYXJnKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0X2ZwdXQ7CisKKwllcnJvciA9IHZmc19pb2N0bChmaWxwLCBmZCwgY21kLCBhcmcpOworIG91dF9mcHV0OgorCWZwdXRfbGlnaHQoZmlscCwgZnB1dF9uZWVkZWQpOworIG91dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBQbGF0Zm9ybXMgaW1wbGVtZW50aW5nIDMyIGJpdCBjb21wYXRpYmlsaXR5IGlvY3RsIGhhbmRsZXJzIGluCisgKiBtb2R1bGVzIG5lZWQgdGhpcyBleHBvcnRlZAorICovCisjaWZkZWYgQ09ORklHX0NPTVBBVAorRVhQT1JUX1NZTUJPTChzeXNfaW9jdGwpOworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9pc29mcy9NYWtlZmlsZSBiL2ZzL2lzb2ZzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMTYyZjAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9pc29mcy9NYWtlZmlsZQpAQCAtMCwwICsxLDEwIEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGludXggaXNvZnMgZmlsZXN5c3RlbSByb3V0aW5lcy4KKyMKKworb2JqLSQoQ09ORklHX0lTTzk2NjBfRlMpICs9IGlzb2ZzLm8KKworaXNvZnMtb2Jqcy15IAkJCTo9IG5hbWVpLm8gaW5vZGUubyBkaXIubyB1dGlsLm8gcm9jay5vIGV4cG9ydC5vCitpc29mcy1vYmpzLSQoQ09ORklHX0pPTElFVCkJKz0gam9saWV0Lm8KK2lzb2ZzLW9ianMtJChDT05GSUdfWklTT0ZTKQkrPSBjb21wcmVzcy5vCitpc29mcy1vYmpzCQkJOj0gJChpc29mcy1vYmpzLXkpCmRpZmYgLS1naXQgYS9mcy9pc29mcy9jb21wcmVzcy5jIGIvZnMvaXNvZnMvY29tcHJlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjQyYzNmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvaXNvZnMvY29tcHJlc3MuYwpAQCAtMCwwICsxLDM1OSBAQAorLyogLSotIGxpbnV4LWMgLSotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICogICAKKyAqICAgQ29weXJpZ2h0IDIwMDEgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSBNQSAwMjEzOSwKKyAqICAgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorICogICB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogbGludXgvZnMvaXNvZnMvY29tcHJlc3MuYworICoKKyAqIFRyYW5zcGFyZW50IGRlY29tcHJlc3Npb24gb2YgZmlsZXMgb24gYW4gaXNvOTY2MCBmaWxlc3lzdGVtCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pc29fZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvemxpYi5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKyNpbmNsdWRlICJ6aXNvZnMuaCIKKworLyogVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgZ2xvYmFsLiAqLworc3RhdGljIGNoYXIgemlzb2ZzX3NpbmtfcGFnZVtQQUdFX0NBQ0hFX1NJWkVdOworCisvKgorICogVGhpcyBjb250YWlucyB0aGUgemxpYiBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgdGhlIG11dGV4IGZvciB0aGUKKyAqIGFsbG9jYXRpb247IHRoaXMgYXZvaWRzIGZhaWx1cmVzIGF0IGJsb2NrLWRlY29tcHJlc3Npb24gdGltZS4KKyAqLworc3RhdGljIHZvaWQgKnppc29mc196bGliX3dvcmtzcGFjZTsKK3N0YXRpYyBzdHJ1Y3Qgc2VtYXBob3JlIHppc29mc196bGliX3NlbWFwaG9yZTsKKworLyoKKyAqIFdoZW4gZGVjb21wcmVzc2luZywgd2UgdHlwaWNhbGx5IG9idGFpbiBtb3JlIHRoYW4gb25lIHBhZ2UKKyAqIHBlciByZWZlcmVuY2UuICBXZSBpbmplY3QgdGhlIGFkZGl0aW9uYWwgcGFnZXMgaW50byB0aGUgcGFnZQorICogY2FjaGUgYXMgYSBmb3JtIG9mIHJlYWRhaGVhZC4KKyAqLworc3RhdGljIGludCB6aXNvZnNfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisJdW5zaWduZWQgaW50IG1heHBhZ2UsIHhwYWdlLCBmcGFnZSwgYmxvY2tpbmRleDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwl1bnNpZ25lZCBsb25nIGJsb2NrcHRyLCBibG9ja2VuZHB0ciwgY3N0YXJ0LCBjZW5kLCBjc2l6ZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqcHRyYmhbMl07CisJdW5zaWduZWQgbG9uZyBidWZzaXplID0gSVNPRlNfQlVGRkVSX1NJWkUoaW5vZGUpOworCXVuc2lnbmVkIGludCBidWZzaGlmdCA9IElTT0ZTX0JVRkZFUl9CSVRTKGlub2RlKTsKKwl1bnNpZ25lZCBsb25nIGJ1Zm1hc2sgID0gYnVmc2l6ZSAtIDE7CisJaW50IGVyciA9IC1FSU87CisJaW50IGk7CisJdW5zaWduZWQgaW50IGhlYWRlcl9zaXplID0gSVNPRlNfSShpbm9kZSktPmlfZm9ybWF0X3Bhcm1bMF07CisJdW5zaWduZWQgaW50IHppc29mc19ibG9ja19zaGlmdCA9IElTT0ZTX0koaW5vZGUpLT5pX2Zvcm1hdF9wYXJtWzFdOworCS8qIHVuc2lnbmVkIGxvbmcgemlzb2ZzX2Jsb2NrX3NpemUgPSAxVUwgPDwgemlzb2ZzX2Jsb2NrX3NoaWZ0OyAqLworCXVuc2lnbmVkIGludCB6aXNvZnNfYmxvY2tfcGFnZV9zaGlmdCA9IHppc29mc19ibG9ja19zaGlmdC1QQUdFX0NBQ0hFX1NISUZUOworCXVuc2lnbmVkIGxvbmcgemlzb2ZzX2Jsb2NrX3BhZ2VzID0gMVVMIDw8IHppc29mc19ibG9ja19wYWdlX3NoaWZ0OworCXVuc2lnbmVkIGxvbmcgemlzb2ZzX2Jsb2NrX3BhZ2VfbWFzayA9IHppc29mc19ibG9ja19wYWdlcy0xOworCXN0cnVjdCBwYWdlICpwYWdlc1t6aXNvZnNfYmxvY2tfcGFnZXNdOworCXVuc2lnbmVkIGxvbmcgaW5kZXggPSBwYWdlLT5pbmRleDsKKwlpbnQgaW5kZXhibG9ja3M7CisKKwkvKiBXZSBoYXZlIGFscmVhZHkgYmVlbiBnaXZlbiBvbmUgcGFnZSwgdGhpcyBpcyB0aGUgb25lCisJICAgd2UgbXVzdCBkby4gKi8KKwl4cGFnZSA9IGluZGV4ICYgemlzb2ZzX2Jsb2NrX3BhZ2VfbWFzazsKKwlwYWdlc1t4cGFnZV0gPSBwYWdlOworIAorCS8qIFRoZSByZW1haW5pbmcgcGFnZXMgbmVlZCB0byBiZSBhbGxvY2F0ZWQgYW5kIGluc2VydGVkICovCisJb2Zmc2V0ID0gaW5kZXggJiB+emlzb2ZzX2Jsb2NrX3BhZ2VfbWFzazsKKwlibG9ja2luZGV4ID0gb2Zmc2V0ID4+IHppc29mc19ibG9ja19wYWdlX3NoaWZ0OworCW1heHBhZ2UgPSAoaW5vZGUtPmlfc2l6ZSArIFBBR0VfQ0FDSEVfU0laRSAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJbWF4cGFnZSA9IG1pbih6aXNvZnNfYmxvY2tfcGFnZXMsIG1heHBhZ2Utb2Zmc2V0KTsKKworCWZvciAoIGkgPSAwIDsgaSA8IG1heHBhZ2UgOyBpKyssIG9mZnNldCsrICkgeworCQlpZiAoIGkgIT0geHBhZ2UgKSB7CisJCQlwYWdlc1tpXSA9IGdyYWJfY2FjaGVfcGFnZV9ub3dhaXQobWFwcGluZywgb2Zmc2V0KTsKKwkJfQorCQlwYWdlID0gcGFnZXNbaV07CisJCWlmICggcGFnZSApIHsKKwkJCUNsZWFyUGFnZUVycm9yKHBhZ2UpOworCQkJa21hcChwYWdlKTsKKwkJfQorCX0KKworCS8qIFRoaXMgaXMgdGhlIGxhc3QgcGFnZSBmaWxsZWQsIHBsdXMgb25lOyB1c2VkIGluIGNhc2Ugb2YgYWJvcnQuICovCisJZnBhZ2UgPSAwOworCisJLyogRmluZCB0aGUgcG9pbnRlciB0byB0aGlzIHNwZWNpZmljIGNodW5rICovCisJLyogTm90ZTogd2UncmUgbm90IHVzaW5nIGlzb251bV83MzEoKSBoZXJlIGJlY2F1c2UgdGhlIGRhdGEgaXMga25vd24gYWxpZ25lZCAqLworCS8qIE5vdGU6IGhlYWRlcl9zaXplIGlzIGluIDMyLWJpdCB3b3JkcyAoNCBieXRlcykgKi8KKwlibG9ja3B0ciA9IChoZWFkZXJfc2l6ZSArIGJsb2NraW5kZXgpIDw8IDI7CisJYmxvY2tlbmRwdHIgPSBibG9ja3B0ciArIDQ7CisKKwlpbmRleGJsb2NrcyA9ICgoYmxvY2twdHJeYmxvY2tlbmRwdHIpID4+IGJ1ZnNoaWZ0KSA/IDIgOiAxOworCXB0cmJoWzBdID0gcHRyYmhbMV0gPSBOVUxMOworCisJaWYgKCBpc29mc19nZXRfYmxvY2tzKGlub2RlLCBibG9ja3B0ciA+PiBidWZzaGlmdCwgcHRyYmgsIGluZGV4YmxvY2tzKSAhPSBpbmRleGJsb2NrcyApIHsKKwkJaWYgKCBwdHJiaFswXSApIGJyZWxzZShwdHJiaFswXSk7CisJCXByaW50ayhLRVJOX0RFQlVHICJ6aXNvZnM6IE51bGwgYnVmZmVyIG9uIHJlYWRpbmcgYmxvY2sgdGFibGUsIGlub2RlID0gJWx1LCBibG9jayA9ICVsdVxuIiwKKwkJICAgICAgIGlub2RlLT5pX2lubywgYmxvY2twdHIgPj4gYnVmc2hpZnQpOworCQlnb3RvIGVpbzsKKwl9CisJbGxfcndfYmxvY2soUkVBRCwgaW5kZXhibG9ja3MsIHB0cmJoKTsKKworCWJoID0gcHRyYmhbMF07CisJaWYgKCAhYmggfHwgKHdhaXRfb25fYnVmZmVyKGJoKSwgIWJ1ZmZlcl91cHRvZGF0ZShiaCkpICkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiemlzb2ZzOiBGYWlsZWQgdG8gcmVhZCBibG9jayB0YWJsZSwgaW5vZGUgPSAlbHUsIGJsb2NrID0gJWx1XG4iLAorCQkgICAgICAgaW5vZGUtPmlfaW5vLCBibG9ja3B0ciA+PiBidWZzaGlmdCk7CisJCWlmICggcHRyYmhbMV0gKQorCQkJYnJlbHNlKHB0cmJoWzFdKTsKKwkJZ290byBlaW87CisJfQorCWNzdGFydCA9IGxlMzJfdG9fY3B1KCooX19sZTMyICopKGJoLT5iX2RhdGEgKyAoYmxvY2twdHIgJiBidWZtYXNrKSkpOworCisJaWYgKCBpbmRleGJsb2NrcyA9PSAyICkgeworCQkvKiBXZSBqdXN0IGNyb3NzZWQgYSBibG9jayBib3VuZGFyeS4gIFN3aXRjaCB0byB0aGUgbmV4dCBibG9jayAqLworCQlicmVsc2UoYmgpOworCQliaCA9IHB0cmJoWzFdOworCQlpZiAoICFiaCB8fCAod2FpdF9vbl9idWZmZXIoYmgpLCAhYnVmZmVyX3VwdG9kYXRlKGJoKSkgKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiemlzb2ZzOiBGYWlsZWQgdG8gcmVhZCBibG9jayB0YWJsZSwgaW5vZGUgPSAlbHUsIGJsb2NrID0gJWx1XG4iLAorCQkJICAgICAgIGlub2RlLT5pX2lubywgYmxvY2tlbmRwdHIgPj4gYnVmc2hpZnQpOworCQkJZ290byBlaW87CisJCX0KKwl9CisJY2VuZCA9IGxlMzJfdG9fY3B1KCooX19sZTMyICopKGJoLT5iX2RhdGEgKyAoYmxvY2tlbmRwdHIgJiBidWZtYXNrKSkpOworCWJyZWxzZShiaCk7CisKKwljc2l6ZSA9IGNlbmQtY3N0YXJ0OworCisJLyogTm93IHBhZ2VbXSBjb250YWlucyBhbiBhcnJheSBvZiBwYWdlcywgYW55IG9mIHdoaWNoIGNhbiBiZSBOVUxMLAorCSAgIGFuZCB0aGUgbG9ja3Mgb24gd2hpY2ggd2UgaG9sZC4gIFdlIHNob3VsZCBub3cgcmVhZCB0aGUgZGF0YSBhbmQKKwkgICByZWxlYXNlIHRoZSBwYWdlcy4gIElmIHRoZSBwYWdlcyBhcmUgTlVMTCB0aGUgZGVjb21wcmVzc2VkIGRhdGEKKwkgICBmb3IgdGhhdCBwYXJ0aWN1bGFyIHBhZ2Ugc2hvdWxkIGJlIGRpc2NhcmRlZC4gKi8KKwkKKwlpZiAoIGNzaXplID09IDAgKSB7CisJCS8qIFRoaXMgZGF0YSBibG9jayBpcyBlbXB0eS4gKi8KKworCQlmb3IgKCBmcGFnZSA9IDAgOyBmcGFnZSA8IG1heHBhZ2UgOyBmcGFnZSsrICkgeworCQkJaWYgKCAocGFnZSA9IHBhZ2VzW2ZwYWdlXSkgIT0gTlVMTCApIHsKKwkJCQltZW1zZXQocGFnZV9hZGRyZXNzKHBhZ2UpLCAwLCBQQUdFX0NBQ0hFX1NJWkUpOworCQkJCQorCQkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJCQlrdW5tYXAocGFnZSk7CisJCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQkJaWYgKCBmcGFnZSA9PSB4cGFnZSApCisJCQkJCWVyciA9IDA7IC8qIFRoZSBjcml0aWNhbCBwYWdlICovCisJCQkJZWxzZQorCQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQkvKiBUaGlzIGRhdGEgYmxvY2sgaXMgY29tcHJlc3NlZC4gKi8KKwkJel9zdHJlYW0gc3RyZWFtOworCQlpbnQgYmFpbCA9IDAsIGxlZnRfb3V0ID0gLTE7CisJCWludCB6ZXJyOworCQlpbnQgbmVlZGJsb2NrcyA9IChjc2l6ZSArIChjc3RhcnQgJiBidWZtYXNrKSArIGJ1Zm1hc2spID4+IGJ1ZnNoaWZ0OworCQlpbnQgaGF2ZWJsb2NrczsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaHNbbmVlZGJsb2NrcysxXTsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhwdHI7CisKKwkJLyogQmVjYXVzZSB6bGliIGlzIG5vdCB0aHJlYWQtc2FmZSwgZG8gYWxsIHRoZSBJL08gYXQgdGhlIHRvcC4gKi8KKworCQlibG9ja3B0ciA9IGNzdGFydCA+PiBidWZzaGlmdDsKKwkJbWVtc2V0KGJocywgMCwgKG5lZWRibG9ja3MrMSkqc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSk7CisJCWhhdmVibG9ja3MgPSBpc29mc19nZXRfYmxvY2tzKGlub2RlLCBibG9ja3B0ciwgYmhzLCBuZWVkYmxvY2tzKTsKKwkJbGxfcndfYmxvY2soUkVBRCwgaGF2ZWJsb2NrcywgYmhzKTsKKworCQliaHB0ciA9ICZiaHNbMF07CisJCWJoID0gKmJocHRyKys7CisKKwkJLyogRmlyc3QgYmxvY2sgaXMgc3BlY2lhbCBzaW5jZSBpdCBtYXkgYmUgZnJhY3Rpb25hbC4KKwkJICAgV2UgYWxzbyB3YWl0IGZvciBpdCBiZWZvcmUgZ3JhYmJpbmcgdGhlIHpsaWIKKwkJICAgc2VtYXBob3JlOyBvZGRzIGFyZSB0aGF0IHRoZSBzdWJzZXF1ZW50IGJsb2NrcyBhcmUKKwkJICAgZ29pbmcgdG8gY29tZSBpbiBpbiBzaG9ydCBvcmRlciBzbyB3ZSBkb24ndCBob2xkCisJCSAgIHRoZSB6bGliIHNlbWFwaG9yZSBsb25nZXIgdGhhbiBuZWNlc3NhcnkuICovCisKKwkJaWYgKCAhYmggfHwgKHdhaXRfb25fYnVmZmVyKGJoKSwgIWJ1ZmZlcl91cHRvZGF0ZShiaCkpICkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgInppc29mczogSGl0IG51bGwgYnVmZmVyLCBmcGFnZSA9ICVkLCB4cGFnZSA9ICVkLCBjc2l6ZSA9ICVsZFxuIiwKKwkJCSAgICAgICBmcGFnZSwgeHBhZ2UsIGNzaXplKTsKKwkJCWdvdG8gYl9laW87CisJCX0KKwkJc3RyZWFtLm5leHRfaW4gID0gYmgtPmJfZGF0YSArIChjc3RhcnQgJiBidWZtYXNrKTsKKwkJc3RyZWFtLmF2YWlsX2luID0gbWluKGJ1ZnNpemUtKGNzdGFydCAmIGJ1Zm1hc2spLCBjc2l6ZSk7CisJCWNzaXplIC09IHN0cmVhbS5hdmFpbF9pbjsKKworCQlzdHJlYW0ud29ya3NwYWNlID0gemlzb2ZzX3psaWJfd29ya3NwYWNlOworCQlkb3duKCZ6aXNvZnNfemxpYl9zZW1hcGhvcmUpOworCQkKKwkJemVyciA9IHpsaWJfaW5mbGF0ZUluaXQoJnN0cmVhbSk7CisJCWlmICggemVyciAhPSBaX09LICkgeworCQkJaWYgKCBlcnIgJiYgemVyciA9PSBaX01FTV9FUlJPUiApCisJCQkJZXJyID0gLUVOT01FTTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJ6aXNvZnM6IHppc29mc19pbmZsYXRlSW5pdCByZXR1cm5lZCAlZFxuIiwKKwkJCSAgICAgICB6ZXJyKTsKKwkJCWdvdG8gel9laW87CisJCX0KKworCQl3aGlsZSAoICFiYWlsICYmIGZwYWdlIDwgbWF4cGFnZSApIHsKKwkJCXBhZ2UgPSBwYWdlc1tmcGFnZV07CisJCQlpZiAoIHBhZ2UgKQorCQkJCXN0cmVhbS5uZXh0X291dCA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwkJCWVsc2UKKwkJCQlzdHJlYW0ubmV4dF9vdXQgPSAodm9pZCAqKSZ6aXNvZnNfc2lua19wYWdlOworCQkJc3RyZWFtLmF2YWlsX291dCA9IFBBR0VfQ0FDSEVfU0laRTsKKworCQkJd2hpbGUgKCBzdHJlYW0uYXZhaWxfb3V0ICkgeworCQkJCWludCBhbywgYWk7CisJCQkJaWYgKCBzdHJlYW0uYXZhaWxfaW4gPT0gMCAmJiBsZWZ0X291dCApIHsKKwkJCQkJaWYgKCAhY3NpemUgKSB7CisJCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ6aXNvZnM6IFpGIHJlYWQgYmV5b25kIGVuZCBvZiBpbnB1dFxuIik7CisJCQkJCQliYWlsID0gMTsKKwkJCQkJCWJyZWFrOworCQkJCQl9IGVsc2UgeworCQkJCQkJYmggPSAqYmhwdHIrKzsKKwkJCQkJCWlmICggIWJoIHx8CisJCQkJCQkgICAgICh3YWl0X29uX2J1ZmZlcihiaCksICFidWZmZXJfdXB0b2RhdGUoYmgpKSApIHsKKwkJCQkJCQkvKiBSZWFjaGVkIGFuIEVJTyAqLworIAkJCQkJCQlwcmludGsoS0VSTl9ERUJVRyAiemlzb2ZzOiBIaXQgbnVsbCBidWZmZXIsIGZwYWdlID0gJWQsIHhwYWdlID0gJWQsIGNzaXplID0gJWxkXG4iLAorCQkJCQkJCSAgICAgICBmcGFnZSwgeHBhZ2UsIGNzaXplKTsKKwkJCQkJCQkgICAgICAgCisJCQkJCQkJYmFpbCA9IDE7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlzdHJlYW0ubmV4dF9pbiA9IGJoLT5iX2RhdGE7CisJCQkJCQlzdHJlYW0uYXZhaWxfaW4gPSBtaW4oY3NpemUsYnVmc2l6ZSk7CisJCQkJCQljc2l6ZSAtPSBzdHJlYW0uYXZhaWxfaW47CisJCQkJCX0KKwkJCQl9CisJCQkJYW8gPSBzdHJlYW0uYXZhaWxfb3V0OyAgYWkgPSBzdHJlYW0uYXZhaWxfaW47CisJCQkJemVyciA9IHpsaWJfaW5mbGF0ZSgmc3RyZWFtLCBaX1NZTkNfRkxVU0gpOworCQkJCWxlZnRfb3V0ID0gc3RyZWFtLmF2YWlsX291dDsKKwkJCQlpZiAoIHplcnIgPT0gWl9CVUZfRVJST1IgJiYgc3RyZWFtLmF2YWlsX2luID09IDAgKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoIHplcnIgIT0gWl9PSyApIHsKKwkJCQkJLyogRU9GLCBlcnJvciwgb3IgdHJ5aW5nIHRvIHJlYWQgYmV5b25kIGVuZCBvZiBpbnB1dCAqLworCQkJCQlpZiAoIGVyciAmJiB6ZXJyID09IFpfTUVNX0VSUk9SICkKKwkJCQkJCWVyciA9IC1FTk9NRU07CisJCQkJCWlmICggemVyciAhPSBaX1NUUkVBTV9FTkQgKQorCQkJCQkJcHJpbnRrKEtFUk5fREVCVUcgInppc29mczogemlzb2ZzX2luZmxhdGUgcmV0dXJuZWQgJWQsIGlub2RlID0gJWx1LCBpbmRleCA9ICVsdSwgZnBhZ2UgPSAlZCwgeHBhZ2UgPSAlZCwgYXZhaWxfaW4gPSAlZCwgYXZhaWxfb3V0ID0gJWQsIGFpID0gJWQsIGFvID0gJWRcbiIsCisJCQkJCQkgICAgICAgemVyciwgaW5vZGUtPmlfaW5vLCBpbmRleCwKKwkJCQkJCSAgICAgICBmcGFnZSwgeHBhZ2UsCisJCQkJCQkgICAgICAgc3RyZWFtLmF2YWlsX2luLCBzdHJlYW0uYXZhaWxfb3V0LAorCQkJCQkJICAgICAgIGFpLCBhbyk7CisJCQkJCWJhaWwgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCWlmICggc3RyZWFtLmF2YWlsX291dCAmJiB6ZXJyID09IFpfU1RSRUFNX0VORCApIHsKKwkJCQkvKiBGcmFjdGlvbmFsIHBhZ2Ugd3JpdHRlbiBiZWZvcmUgRU9GLiAgVGhpcyBtYXkKKwkJCQkgICBiZSB0aGUgbGFzdCBwYWdlIGluIHRoZSBmaWxlLiAqLworCQkJCW1lbXNldChzdHJlYW0ubmV4dF9vdXQsIDAsIHN0cmVhbS5hdmFpbF9vdXQpOworCQkJCXN0cmVhbS5hdmFpbF9vdXQgPSAwOworCQkJfQorCisJCQlpZiAoICFzdHJlYW0uYXZhaWxfb3V0ICkgeworCQkJCS8qIFRoaXMgcGFnZSBjb21wbGV0ZWQgKi8KKwkJCQlpZiAoIHBhZ2UgKSB7CisJCQkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQkJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJCQkJCWt1bm1hcChwYWdlKTsKKwkJCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQkJCWlmICggZnBhZ2UgPT0geHBhZ2UgKQorCQkJCQkJZXJyID0gMDsgLyogVGhlIGNyaXRpY2FsIHBhZ2UgKi8KKwkJCQkJZWxzZQorCQkJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJCX0KKwkJCQlmcGFnZSsrOworCQkJfQorCQl9CisJCXpsaWJfaW5mbGF0ZUVuZCgmc3RyZWFtKTsKKworCXpfZWlvOgorCQl1cCgmemlzb2ZzX3psaWJfc2VtYXBob3JlKTsKKworCWJfZWlvOgorCQlmb3IgKCBpID0gMCA7IGkgPCBoYXZlYmxvY2tzIDsgaSsrICkgeworCQkJaWYgKCBiaHNbaV0gKQorCQkJCWJyZWxzZShiaHNbaV0pOworCQl9CisJfQorCitlaW86CisKKwkvKiBSZWxlYXNlIGFueSByZXNpZHVhbCBwYWdlcywgZG8gbm90IFNldFBhZ2VVcHRvZGF0ZSAqLworCXdoaWxlICggZnBhZ2UgPCBtYXhwYWdlICkgeworCQlwYWdlID0gcGFnZXNbZnBhZ2VdOworCQlpZiAoIHBhZ2UgKSB7CisJCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJCWlmICggZnBhZ2UgPT0geHBhZ2UgKQorCQkJCVNldFBhZ2VFcnJvcihwYWdlKTsKKwkJCWt1bm1hcChwYWdlKTsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJaWYgKCBmcGFnZSAhPSB4cGFnZSApCisJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQl9CisJCWZwYWdlKys7CisJfQkJCQorCisJLyogQXQgdGhpcyBwb2ludCwgZXJyIGNvbnRhaW5zIDAgb3IgLUVJTyBkZXBlbmRpbmcgb24gdGhlICJjcml0aWNhbCIgcGFnZSAqLworCXJldHVybiBlcnI7Cit9CisKK3N0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgemlzb2ZzX2FvcHMgPSB7CisJLnJlYWRwYWdlID0gemlzb2ZzX3JlYWRwYWdlLAorCS8qIE5vIHN5bmNfcGFnZSBvcGVyYXRpb24gc3VwcG9ydGVkPyAqLworCS8qIE5vIGJtYXAgb3BlcmF0aW9uIHN1cHBvcnRlZCAqLworfTsKKworc3RhdGljIGludCBpbml0aWFsaXplZDsKKworaW50IF9faW5pdCB6aXNvZnNfaW5pdCh2b2lkKQoreworCWlmICggaW5pdGlhbGl6ZWQgKSB7CisJCXByaW50aygiemlzb2ZzX2luaXQ6IGNhbGxlZCBtb3JlIHRoYW4gb25jZVxuIik7CisJCXJldHVybiAwOworCX0KKworCXppc29mc196bGliX3dvcmtzcGFjZSA9IHZtYWxsb2MoemxpYl9pbmZsYXRlX3dvcmtzcGFjZXNpemUoKSk7CisJaWYgKCAhemlzb2ZzX3psaWJfd29ya3NwYWNlICkKKwkJcmV0dXJuIC1FTk9NRU07CisJaW5pdF9NVVRFWCgmemlzb2ZzX3psaWJfc2VtYXBob3JlKTsKKworCWluaXRpYWxpemVkID0gMTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCB6aXNvZnNfY2xlYW51cCh2b2lkKQoreworCWlmICggIWluaXRpYWxpemVkICkgeworCQlwcmludGsoInppc29mc19jbGVhbnVwOiBjYWxsZWQgd2l0aG91dCBpbml0aWFsaXphdGlvblxuIik7CisJCXJldHVybjsKKwl9CisKKwl2ZnJlZSh6aXNvZnNfemxpYl93b3Jrc3BhY2UpOworCWluaXRpYWxpemVkID0gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL2lzb2ZzL2Rpci5jIGIvZnMvaXNvZnMvZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRkODZkZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2lzb2ZzL2Rpci5jCkBAIC0wLDAgKzEsMjgwIEBACisvKgorICogIGxpbnV4L2ZzL2lzb2ZzL2Rpci5jCisgKgorICogIChDKSAxOTkyLCAxOTkzLCAxOTk0ICBFcmljIFlvdW5nZGFsZSBNb2RpZmllZCBmb3IgSVNPIDk2NjAgZmlsZXN5c3RlbS4KKyAqCisgKiAgKEMpIDE5OTEgIExpbnVzIFRvcnZhbGRzIC0gbWluaXggZmlsZXN5c3RlbQorICoKKyAqICBTdGV2ZSBCZXlub24JCSAgICAgICA6IE1pc3NpbmcgbGFzdCBkaXJlY3RvcnkgZW50cmllcyBmaXhlZAorICogIChzdGVwaGVuQGFza29uZS5kZW1vbi5jby51aykgICAgICA6IDIxc3QgSnVuZSAxOTk2CisgKiAKKyAqICBpc29mcyBkaXJlY3RvcnkgaGFuZGxpbmcgZnVuY3Rpb25zCisgKi8KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaXNvX2ZzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdGF0aWMgaW50IGlzb2ZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKiwgdm9pZCAqLCBmaWxsZGlyX3QpOworCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGlzb2ZzX2Rpcl9vcGVyYXRpb25zID0KK3sKKwkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAorCS5yZWFkZGlyCT0gaXNvZnNfcmVhZGRpciwKK307CisKKy8qCisgKiBkaXJlY3RvcmllcyBjYW4gaGFuZGxlIG1vc3Qgb3BlcmF0aW9ucy4uLgorICovCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBpc29mc19kaXJfaW5vZGVfb3BlcmF0aW9ucyA9Cit7CisJLmxvb2t1cAkJPSBpc29mc19sb29rdXAsCit9OworCitpbnQgaXNvZnNfbmFtZV90cmFuc2xhdGUoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICpkZSwgY2hhciAqbmV3LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWNoYXIgKiBvbGQgPSBkZS0+bmFtZTsKKwlpbnQgbGVuID0gZGUtPm5hbWVfbGVuWzBdOworCWludCBpOworCQkJCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCXVuc2lnbmVkIGNoYXIgYyA9IG9sZFtpXTsKKwkJaWYgKCFjKQorCQkJYnJlYWs7CisKKwkJaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKQorCQkJYyB8PSAweDIwOwkvKiBsb3dlciBjYXNlICovCisKKwkJLyogRHJvcCB0cmFpbGluZyAnLjsxJyAoSVNPIDk2NjA6MTk4OCA3LjUuMSByZXF1aXJlcyBwZXJpb2QpICovCisJCWlmIChjID09ICcuJyAmJiBpID09IGxlbiAtIDMgJiYgb2xkW2kgKyAxXSA9PSAnOycgJiYgb2xkW2kgKyAyXSA9PSAnMScpCisJCQlicmVhazsKKworCQkvKiBEcm9wIHRyYWlsaW5nICc7MScgKi8KKwkJaWYgKGMgPT0gJzsnICYmIGkgPT0gbGVuIC0gMiAmJiBvbGRbaSArIDFdID09ICcxJykKKwkJCWJyZWFrOworCisJCS8qIENvbnZlcnQgcmVtYWluaW5nICc7JyB0byAnLicgKi8KKwkJLyogQWxzbyAnLycgdG8gJy4nIChicm9rZW4gQWNvcm4tZ2VuZXJhdGVkIElTTzk2NjAgaW1hZ2VzKSAqLworCQlpZiAoYyA9PSAnOycgfHwgYyA9PSAnLycpCisJCQljID0gJy4nOworCisJCW5ld1tpXSA9IGM7CisJfQorCXJldHVybiBpOworfQorCisvKiBBY29ybiBleHRlbnNpb25zIHdyaXR0ZW4gYnkgTWF0dGhldyBXaWxjb3ggPHdpbGx5QGJvZmguYWk+IDE5OTggKi8KK2ludCBnZXRfYWNvcm5fZmlsZW5hbWUoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICogZGUsCisJCQkgICAgY2hhciAqIHJldG5hbWUsIHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCWludCBzdGQ7CisJdW5zaWduZWQgY2hhciAqIGNocjsKKwlpbnQgcmV0bmFtbGVuID0gaXNvZnNfbmFtZV90cmFuc2xhdGUoZGUsIHJldG5hbWUsIGlub2RlKTsKKwlpZiAocmV0bmFtbGVuID09IDApIHJldHVybiAwOworCXN0ZCA9IHNpemVvZihzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQpICsgZGUtPm5hbWVfbGVuWzBdOworCWlmIChzdGQgJiAxKSBzdGQrKzsKKwlpZiAoKCooKHVuc2lnbmVkIGNoYXIgKikgZGUpIC0gc3RkKSAhPSAzMikgcmV0dXJuIHJldG5hbWxlbjsKKwljaHIgPSAoKHVuc2lnbmVkIGNoYXIgKikgZGUpICsgc3RkOworCWlmIChzdHJuY21wKGNociwgIkFSQ0hJTUVERVMiLCAxMCkpIHJldHVybiByZXRuYW1sZW47CisJaWYgKCgqcmV0bmFtZSA9PSAnXycpICYmICgoY2hyWzE5XSAmIDEpID09IDEpKSAqcmV0bmFtZSA9ICchJzsKKwlpZiAoKChkZS0+ZmxhZ3NbMF0gJiAyKSA9PSAwKSAmJiAoY2hyWzEzXSA9PSAweGZmKQorCQkmJiAoKGNoclsxMl0gJiAweGYwKSA9PSAweGYwKSkKKwl7CisJCXJldG5hbWVbcmV0bmFtbGVuXSA9ICcsJzsKKwkJc3ByaW50ZihyZXRuYW1lK3JldG5hbWxlbisxLCAiJTMuM3giLAorCQkJKChjaHJbMTJdICYgMHhmKSA8PCA4KSB8IGNoclsxMV0pOworCQlyZXRuYW1sZW4gKz0gNDsKKwl9CisJcmV0dXJuIHJldG5hbWxlbjsKK30KKworLyoKKyAqIFRoaXMgc2hvdWxkIF9yZWFsbHlfIGJlIGNsZWFuZWQgdXAgc29tZSBkYXkuLgorICovCitzdGF0aWMgaW50IGRvX2lzb2ZzX3JlYWRkaXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJCXZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIsCisJCWNoYXIgKiB0bXBuYW1lLCBzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKiB0bXBkZSkKK3sKKwl1bnNpZ25lZCBsb25nIGJ1ZnNpemUgPSBJU09GU19CVUZGRVJfU0laRShpbm9kZSk7CisJdW5zaWduZWQgY2hhciBidWZiaXRzID0gSVNPRlNfQlVGRkVSX0JJVFMoaW5vZGUpOworCXVuc2lnbmVkIGxvbmcgYmxvY2ssIG9mZnNldCwgYmxvY2tfc2F2ZWQsIG9mZnNldF9zYXZlZDsKKwl1bnNpZ25lZCBsb25nIGlub2RlX251bWJlciA9IDA7CS8qIFF1aWV0IEdDQyAqLworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCWludCBsZW47CisJaW50IG1hcDsKKwlpbnQgZmlyc3RfZGUgPSAxOworCWNoYXIgKnAgPSBOVUxMOwkJLyogUXVpZXQgR0NDICovCisJc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICpkZTsKKwlzdHJ1Y3QgaXNvZnNfc2JfaW5mbyAqc2JpID0gSVNPRlNfU0IoaW5vZGUtPmlfc2IpOworCisJb2Zmc2V0ID0gZmlscC0+Zl9wb3MgJiAoYnVmc2l6ZSAtIDEpOworCWJsb2NrID0gZmlscC0+Zl9wb3MgPj4gYnVmYml0czsKKworCXdoaWxlIChmaWxwLT5mX3BvcyA8IGlub2RlLT5pX3NpemUpIHsKKwkJaW50IGRlX2xlbjsKKworCQlpZiAoIWJoKSB7CisJCQliaCA9IGlzb2ZzX2JyZWFkKGlub2RlLCBibG9jayk7CisJCQlpZiAoIWJoKQorCQkJCXJldHVybiAwOworCQl9CisKKwkJZGUgPSAoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICopIChiaC0+Yl9kYXRhICsgb2Zmc2V0KTsKKworCQlkZV9sZW4gPSAqKHVuc2lnbmVkIGNoYXIgKikgZGU7CisKKwkJLyogSWYgdGhlIGxlbmd0aCBieXRlIGlzIHplcm8sIHdlIHNob3VsZCBtb3ZlIG9uIHRvIHRoZSBuZXh0CisJCSAgIENEUk9NIHNlY3Rvci4gIElmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBkaXJlY3RvcnksIHdlCisJCSAgIGtpY2sgb3V0IG9mIHRoZSB3aGlsZSBsb29wLiAqLworCisJCWlmIChkZV9sZW4gPT0gMCkgeworCQkJYnJlbHNlKGJoKTsKKwkJCWJoID0gTlVMTDsKKwkJCWZpbHAtPmZfcG9zID0gKGZpbHAtPmZfcG9zICsgSVNPRlNfQkxPQ0tfU0laRSkgJiB+KElTT0ZTX0JMT0NLX1NJWkUgLSAxKTsKKwkJCWJsb2NrID0gZmlscC0+Zl9wb3MgPj4gYnVmYml0czsKKwkJCW9mZnNldCA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCWJsb2NrX3NhdmVkID0gYmxvY2s7CisJCW9mZnNldF9zYXZlZCA9IG9mZnNldDsKKwkJb2Zmc2V0ICs9IGRlX2xlbjsKKworCQkvKiBNYWtlIHN1cmUgd2UgaGF2ZSBhIGZ1bGwgZGlyZWN0b3J5IGVudHJ5ICovCisJCWlmIChvZmZzZXQgPj0gYnVmc2l6ZSkgeworCQkJaW50IHNsb3AgPSBidWZzaXplIC0gb2Zmc2V0ICsgZGVfbGVuOworCQkJbWVtY3B5KHRtcGRlLCBkZSwgc2xvcCk7CisJCQlvZmZzZXQgJj0gYnVmc2l6ZSAtIDE7CisJCQlibG9jaysrOworCQkJYnJlbHNlKGJoKTsKKwkJCWJoID0gTlVMTDsKKwkJCWlmIChvZmZzZXQpIHsKKwkJCQliaCA9IGlzb2ZzX2JyZWFkKGlub2RlLCBibG9jayk7CisJCQkJaWYgKCFiaCkKKwkJCQkJcmV0dXJuIDA7CisJCQkJbWVtY3B5KCh2b2lkICopIHRtcGRlICsgc2xvcCwgYmgtPmJfZGF0YSwgb2Zmc2V0KTsKKwkJCX0KKwkJCWRlID0gdG1wZGU7CisJCX0KKworCQlpZiAoZmlyc3RfZGUpIHsKKwkJCWlzb2ZzX25vcm1hbGl6ZV9ibG9ja19hbmRfb2Zmc2V0KGRlLAorCQkJCQkJCSAmYmxvY2tfc2F2ZWQsCisJCQkJCQkJICZvZmZzZXRfc2F2ZWQpOworCQkJaW5vZGVfbnVtYmVyID0gaXNvZnNfZ2V0X2lubyhibG9ja19zYXZlZCwKKwkJCQkJCSAgICAgb2Zmc2V0X3NhdmVkLAorCQkJCQkJICAgICBidWZiaXRzKTsKKwkJfQorCisJCWlmIChkZS0+ZmxhZ3NbLXNiaS0+c19oaWdoX3NpZXJyYV0gJiAweDgwKSB7CisJCQlmaXJzdF9kZSA9IDA7CisJCQlmaWxwLT5mX3BvcyArPSBkZV9sZW47CisJCQljb250aW51ZTsKKwkJfQorCQlmaXJzdF9kZSA9IDE7CisKKwkJLyogSGFuZGxlIHRoZSBjYXNlIG9mIHRoZSAnLicgZGlyZWN0b3J5ICovCisJCWlmIChkZS0+bmFtZV9sZW5bMF0gPT0gMSAmJiBkZS0+bmFtZVswXSA9PSAwKSB7CisJCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuIiwgMSwgZmlscC0+Zl9wb3MsIGlub2RlLT5pX2lubywgRFRfRElSKSA8IDApCisJCQkJYnJlYWs7CisJCQlmaWxwLT5mX3BvcyArPSBkZV9sZW47CisJCQljb250aW51ZTsKKwkJfQorCisJCWxlbiA9IDA7CisKKwkJLyogSGFuZGxlIHRoZSBjYXNlIG9mIHRoZSAnLi4nIGRpcmVjdG9yeSAqLworCQlpZiAoZGUtPm5hbWVfbGVuWzBdID09IDEgJiYgZGUtPm5hbWVbMF0gPT0gMSkgeworCQkJaW5vZGVfbnVtYmVyID0gcGFyZW50X2lubyhmaWxwLT5mX2RlbnRyeSk7CisJCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuLiIsIDIsIGZpbHAtPmZfcG9zLCBpbm9kZV9udW1iZXIsIERUX0RJUikgPCAwKQorCQkJCWJyZWFrOworCQkJZmlscC0+Zl9wb3MgKz0gZGVfbGVuOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBIYW5kbGUgZXZlcnl0aGluZyBlbHNlLiAgRG8gbmFtZSB0cmFuc2xhdGlvbiBpZiB0aGVyZQorCQkgICBpcyBubyBSb2NrIFJpZGdlIE5NIGZpZWxkLiAqLworCQlpZiAoc2JpLT5zX3VuaGlkZSA9PSAnbicpIHsKKwkJCS8qIERvIG5vdCByZXBvcnQgaGlkZGVuIG9yIGFzc29jaWF0ZWQgZmlsZXMgKi8KKwkJCWlmIChkZS0+ZmxhZ3NbLXNiaS0+c19oaWdoX3NpZXJyYV0gJiA1KSB7CisJCQkJZmlscC0+Zl9wb3MgKz0gZGVfbGVuOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKwkJbWFwID0gMTsKKwkJaWYgKHNiaS0+c19yb2NrKSB7CisJCQlsZW4gPSBnZXRfcm9ja19yaWRnZV9maWxlbmFtZShkZSwgdG1wbmFtZSwgaW5vZGUpOworCQkJaWYgKGxlbiAhPSAwKSB7CQkvKiBtYXkgYmUgLTEgKi8KKwkJCQlwID0gdG1wbmFtZTsKKwkJCQltYXAgPSAwOworCQkJfQorCQl9CisJCWlmIChtYXApIHsKKyNpZmRlZiBDT05GSUdfSk9MSUVUCisJCQlpZiAoc2JpLT5zX2pvbGlldF9sZXZlbCkgeworCQkJCWxlbiA9IGdldF9qb2xpZXRfZmlsZW5hbWUoZGUsIHRtcG5hbWUsIGlub2RlKTsKKwkJCQlwID0gdG1wbmFtZTsKKwkJCX0gZWxzZQorI2VuZGlmCisJCQlpZiAoc2JpLT5zX21hcHBpbmcgPT0gJ2EnKSB7CisJCQkJbGVuID0gZ2V0X2Fjb3JuX2ZpbGVuYW1lKGRlLCB0bXBuYW1lLCBpbm9kZSk7CisJCQkJcCA9IHRtcG5hbWU7CisJCQl9IGVsc2UKKwkJCWlmIChzYmktPnNfbWFwcGluZyA9PSAnbicpIHsKKwkJCQlsZW4gPSBpc29mc19uYW1lX3RyYW5zbGF0ZShkZSwgdG1wbmFtZSwgaW5vZGUpOworCQkJCXAgPSB0bXBuYW1lOworCQkJfSBlbHNlIHsKKwkJCQlwID0gZGUtPm5hbWU7CisJCQkJbGVuID0gZGUtPm5hbWVfbGVuWzBdOworCQkJfQorCQl9CisJCWlmIChsZW4gPiAwKSB7CisJCQlpZiAoZmlsbGRpcihkaXJlbnQsIHAsIGxlbiwgZmlscC0+Zl9wb3MsIGlub2RlX251bWJlciwgRFRfVU5LTk9XTikgPCAwKQorCQkJCWJyZWFrOworCQl9CisJCWZpbHAtPmZfcG9zICs9IGRlX2xlbjsKKworCQljb250aW51ZTsKKwl9CisJaWYgKGJoKSBicmVsc2UoYmgpOworCXJldHVybiAwOworfQorCisvKgorICogSGFuZGxlIGFsbG9jYXRpb24gb2YgdGVtcG9yYXJ5IHNwYWNlIGZvciBuYW1lIHRyYW5zbGF0aW9uIGFuZAorICogaGFuZGxpbmcgc3BsaXQgZGlyZWN0b3J5IGVudHJpZXMuLiBUaGUgcmVhbCB3b3JrIGlzIGRvbmUgYnkKKyAqICJkb19pc29mc19yZWFkZGlyKCkiLgorICovCitzdGF0aWMgaW50IGlzb2ZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsCisJCXZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJaW50IHJlc3VsdDsKKwljaGFyICogdG1wbmFtZTsKKwlzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKiB0bXBkZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisKKworCXRtcG5hbWUgPSAoY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAodG1wbmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxvY2tfa2VybmVsKCk7CisJdG1wZGUgPSAoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICopICh0bXBuYW1lKzEwMjQpOworCisJcmVzdWx0ID0gZG9faXNvZnNfcmVhZGRpcihpbm9kZSwgZmlscCwgZGlyZW50LCBmaWxsZGlyLCB0bXBuYW1lLCB0bXBkZSk7CisKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIHRtcG5hbWUpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvZnMvaXNvZnMvZXhwb3J0LmMgYi9mcy9pc29mcy9leHBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDI1MmM5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvaXNvZnMvZXhwb3J0LmMKQEAgLTAsMCArMSwyMjggQEAKKy8qCisgKiBmcy9pc29mcy9leHBvcnQuYworICoKKyAqICAoQykgMjAwNCAgUGF1bCBTZXJpY2UgLSBUaGUgbmV3IGlub2RlIHNjaGVtZSByZXF1aXJlcyBzd2l0Y2hpbmcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGlnZXQoKSB0byBpZ2V0NV9sb2NrZWQoKSB3aGljaCBtZWFucworICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBORlMgZXhwb3J0IG9wZXJhdGlvbnMgaGF2ZSB0byBiZSBoYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWQgYmVjYXVzZSB0aGUgZGVmYXVsdCByb3V0aW5lcyByZWx5IG9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaWdldCgpLgorICoKKyAqIFRoZSBmb2xsb3dpbmcgZmlsZXMgYXJlIGhlbHBmdWw6CisgKgorICogICAgIERvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvRXhwb3J0aW5nCisgKiAgICAgZnMvZXhwb3J0ZnMvZXhwZnMuYy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaXNvX2ZzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICoKK2lzb2ZzX2V4cG9ydF9pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCSAgdW5zaWduZWQgbG9uZyBibG9jaywKKwkJICB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJICBfX3UzMiBnZW5lcmF0aW9uKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGRlbnRyeSAqcmVzdWx0OworCWlmIChibG9jayA9PSAwKQorCQlyZXR1cm4gRVJSX1BUUigtRVNUQUxFKTsKKwlpbm9kZSA9IGlzb2ZzX2lnZXQoc2IsIGJsb2NrLCBvZmZzZXQpOworCWlmIChpbm9kZSA9PSBOVUxMKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlpZiAoaXNfYmFkX2lub2RlKGlub2RlKQorCSAgICB8fCAoZ2VuZXJhdGlvbiAmJiBpbm9kZS0+aV9nZW5lcmF0aW9uICE9IGdlbmVyYXRpb24pKQorCXsKKwkJaXB1dChpbm9kZSk7CisJCXJldHVybiBFUlJfUFRSKC1FU1RBTEUpOworCX0KKwlyZXN1bHQgPSBkX2FsbG9jX2Fub24oaW5vZGUpOworCWlmICghcmVzdWx0KSB7CisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKgoraXNvZnNfZXhwb3J0X2dldF9kZW50cnkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqdm9ianApCit7CisJX191MzIgKm9ianAgPSB2b2JqcDsKKwl1bnNpZ25lZCBsb25nIGJsb2NrID0gb2JqcFswXTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IG9ianBbMV07CisJX191MzIgZ2VuZXJhdGlvbiA9IG9ianBbMl07CisJcmV0dXJuIGlzb2ZzX2V4cG9ydF9pZ2V0KHNiLCBibG9jaywgb2Zmc2V0LCBnZW5lcmF0aW9uKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBzdXJwcmlzaW5nbHkgc2ltcGxlLiAgVGhlIHRyaWNrIGlzIHVuZGVyc3RhbmRpbmcKKyAqIHRoYXQgImNoaWxkIiBpcyBhbHdheXMgYSBkaXJlY3RvcnkuIFNvLCB0byBmaW5kIGl0cyBwYXJlbnQsIHlvdQorICogc2ltcGx5IG5lZWQgdG8gZmluZCBpdHMgIi4uIiBlbnRyeSwgbm9ybWFsaXplIGl0cyBibG9jayBhbmQgb2Zmc2V0LAorICogYW5kIHJldHVybiB0aGUgdW5kZXJseWluZyBpbm9kZS4gIFNlZSB0aGUgY29tbWVudHMgZm9yCisgKiBpc29mc19ub3JtYWxpemVfYmxvY2tfYW5kX29mZnNldCgpLiAqLworc3RhdGljIHN0cnVjdCBkZW50cnkgKmlzb2ZzX2V4cG9ydF9nZXRfcGFyZW50KHN0cnVjdCBkZW50cnkgKmNoaWxkKQoreworCXVuc2lnbmVkIGxvbmcgcGFyZW50X2Jsb2NrID0gMDsKKwl1bnNpZ25lZCBsb25nIHBhcmVudF9vZmZzZXQgPSAwOworCXN0cnVjdCBpbm9kZSAqY2hpbGRfaW5vZGUgPSBjaGlsZC0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaXNvX2lub2RlX2luZm8gKmVfY2hpbGRfaW5vZGUgPSBJU09GU19JKGNoaWxkX2lub2RlKTsKKwlzdHJ1Y3QgaW5vZGUgKnBhcmVudF9pbm9kZSA9IE5VTEw7CisJc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICpkZSA9IE5VTEw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmggPSBOVUxMOworCXN0cnVjdCBkZW50cnkgKnJ2ID0gTlVMTDsKKworCS8qICJjaGlsZCIgbXVzdCBhbHdheXMgYmUgYSBkaXJlY3RvcnkuICovCisJaWYgKCFTX0lTRElSKGNoaWxkX2lub2RlLT5pX21vZGUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaXNvZnM6IGlzb2ZzX2V4cG9ydF9nZXRfcGFyZW50KCk6ICIKKwkJICAgICAgICJjaGlsZCBpcyBub3QgYSBkaXJlY3RvcnkhXG4iKTsKKwkJcnYgPSBFUlJfUFRSKC1FQUNDRVMpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBJdCBpcyBhbiBpbnZhcmlhbnQgdGhhdCB0aGUgZGlyZWN0b3J5IG9mZnNldCBpcyB6ZXJvLiAgSWYKKwkgKiBpdCBpcyBub3QgemVybywgaXQgbWVhbnMgdGhlIGRpcmVjdG9yeSBmYWlsZWQgdG8gYmUKKwkgKiBub3JtYWxpemVkIGZvciBzb21lIHJlYXNvbi4gKi8KKwlpZiAoZV9jaGlsZF9pbm9kZS0+aV9pZ2V0NV9vZmZzZXQgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgImlzb2ZzOiBpc29mc19leHBvcnRfZ2V0X3BhcmVudCgpOiAiCisJCSAgICAgICAiY2hpbGQgZGlyZWN0b3J5IG5vdCBub3JtYWxpemVkIVxuIik7CisJCXJ2ID0gRVJSX1BUUigtRUFDQ0VTKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogVGhlIGNoaWxkIGlub2RlIGhhcyBiZWVuIG5vcm1hbGl6ZWQgc3VjaCB0aGF0IGl0cworCSAqIGlfaWdldDVfYmxvY2sgdmFsdWUgcG9pbnRzIHRvIHRoZSAiLiIgZW50cnkuICBGb3J0dW5hdGVseSwKKwkgKiB0aGUgIi4uIiBlbnRyeSBpcyBsb2NhdGVkIGluIHRoZSBzYW1lIGJsb2NrLiAqLworCXBhcmVudF9ibG9jayA9IGVfY2hpbGRfaW5vZGUtPmlfaWdldDVfYmxvY2s7CisKKwkvKiBHZXQgdGhlIGJsb2NrIGluIHF1ZXN0aW9uLiAqLworCWJoID0gc2JfYnJlYWQoY2hpbGRfaW5vZGUtPmlfc2IsIHBhcmVudF9ibG9jayk7CisJaWYgKGJoID09IE5VTEwpIHsKKwkJcnYgPSBFUlJfUFRSKC1FQUNDRVMpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBUaGlzIGlzIHRoZSAiLiIgZW50cnkuICovCisJZGUgPSAoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkKiliaC0+Yl9kYXRhOworCisJLyogVGhlICIuLiIgZW50cnkgaXMgYWx3YXlzIHRoZSBzZWNvbmQgZW50cnkuICovCisJcGFyZW50X29mZnNldCA9ICh1bnNpZ25lZCBsb25nKWlzb251bV83MTEoZGUtPmxlbmd0aCk7CisJZGUgPSAoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkKikoYmgtPmJfZGF0YSArIHBhcmVudF9vZmZzZXQpOworCisJLyogVmVyaWZ5IGl0IGlzIGluIGZhY3QgdGhlICIuLiIgZW50cnkuICovCisJaWYgKChpc29udW1fNzExKGRlLT5uYW1lX2xlbikgIT0gMSkgfHwgKGRlLT5uYW1lWzBdICE9IDEpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaXNvZnM6IFVuYWJsZSB0byBmaW5kIHRoZSBcIi4uXCIgIgorCQkgICAgICAgImRpcmVjdG9yeSBmb3IgTkZTLlxuIik7CisJCXJ2ID0gRVJSX1BUUigtRUFDQ0VTKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogTm9ybWFsaXplICovCisJaXNvZnNfbm9ybWFsaXplX2Jsb2NrX2FuZF9vZmZzZXQoZGUsICZwYXJlbnRfYmxvY2ssICZwYXJlbnRfb2Zmc2V0KTsKKworCS8qIEdldCB0aGUgaW5vZGUuICovCisJcGFyZW50X2lub2RlID0gaXNvZnNfaWdldChjaGlsZF9pbm9kZS0+aV9zYiwKKwkJCQkgIHBhcmVudF9ibG9jaywKKwkJCQkgIHBhcmVudF9vZmZzZXQpOworCWlmIChwYXJlbnRfaW5vZGUgPT0gTlVMTCkgeworCQlydiA9IEVSUl9QVFIoLUVBQ0NFUyk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEFsbG9jYXRlIHRoZSBkZW50cnkuICovCisJcnYgPSBkX2FsbG9jX2Fub24ocGFyZW50X2lub2RlKTsKKwlpZiAocnYgPT0gTlVMTCkgeworCQlydiA9IEVSUl9QVFIoLUVOT01FTSk7CisJCWdvdG8gb3V0OworCX0KKworIG91dDoKKwlpZiAoYmgpIHsKKwkJYnJlbHNlKGJoKTsKKwl9CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgaW50Citpc29mc19leHBvcnRfZW5jb2RlX2ZoKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJICAgICAgIF9fdTMyICpmaDMyLAorCQkgICAgICAgaW50ICptYXhfbGVuLAorCQkgICAgICAgaW50IGNvbm5lY3RhYmxlKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBpc29faW5vZGVfaW5mbyAqIGVpID0gSVNPRlNfSShpbm9kZSk7CisJaW50IGxlbiA9ICptYXhfbGVuOworCWludCB0eXBlID0gMTsKKwlfX3UxNiAqZmgxNiA9IChfX3UxNiopZmgzMjsKKworCS8qCisJICogV0FSTklORzogbWF4X2xlbiBpcyA1IGZvciBORlN2Mi4gIEJlY2F1c2Ugb2YgdGhpcworCSAqIGxpbWl0YXRpb24sIHdlIHVzZSB0aGUgbG93ZXIgMTYgYml0cyBvZiBmaDMyWzFdIHRvIGhvbGQgdGhlCisJICogb2Zmc2V0IG9mIHRoZSBpbm9kZSBhbmQgdGhlIHVwcGVyIDE2IGJpdHMgb2YgZmgzMlsxXSB0bworCSAqIGhvbGQgdGhlIG9mZnNldCBvZiB0aGUgcGFyZW50LgorCSAqLworCisJaWYgKGxlbiA8IDMgfHwgKGNvbm5lY3RhYmxlICYmIGxlbiA8IDUpKQorCQlyZXR1cm4gMjU1OworCisJbGVuID0gMzsKKwlmaDMyWzBdID0gZWktPmlfaWdldDVfYmxvY2s7CisgCWZoMTZbMl0gPSAoX191MTYpZWktPmlfaWdldDVfb2Zmc2V0OyAgLyogZmgxNiBbc2ljXSAqLworCWZoMzJbMl0gPSBpbm9kZS0+aV9nZW5lcmF0aW9uOworCWlmIChjb25uZWN0YWJsZSAmJiAhU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgeworCQlzdHJ1Y3QgaW5vZGUgKnBhcmVudDsKKwkJc3RydWN0IGlzb19pbm9kZV9pbmZvICplcGFyZW50OworCQlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwkJcGFyZW50ID0gZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZTsKKwkJZXBhcmVudCA9IElTT0ZTX0kocGFyZW50KTsKKwkJZmgzMlszXSA9IGVwYXJlbnQtPmlfaWdldDVfYmxvY2s7CisJCWZoMTZbM10gPSAoX191MTYpZXBhcmVudC0+aV9pZ2V0NV9vZmZzZXQ7ICAvKiBmaDE2IFtzaWNdICovCisJCWZoMzJbNF0gPSBwYXJlbnQtPmlfZ2VuZXJhdGlvbjsKKwkJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwkJbGVuID0gNTsKKwkJdHlwZSA9IDI7CisJfQorCSptYXhfbGVuID0gbGVuOworCXJldHVybiB0eXBlOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICoKK2lzb2ZzX2V4cG9ydF9kZWNvZGVfZmgoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJICAgICAgIF9fdTMyICpmaDMyLAorCQkgICAgICAgaW50IGZoX2xlbiwKKwkJICAgICAgIGludCBmaWxlaWRfdHlwZSwKKwkJICAgICAgIGludCAoKmFjY2VwdGFibGUpKHZvaWQgKmNvbnRleHQsIHN0cnVjdCBkZW50cnkgKmRlKSwKKwkJICAgICAgIHZvaWQgKmNvbnRleHQpCit7CisJX191MTYgKmZoMTYgPSAoX191MTYqKWZoMzI7CisJX191MzIgY2hpbGRbM107ICAgLyogVGhlIGNoaWxkIGlzIHdoYXQgdHJpZ2dlcmVkIGFsbCB0aGlzLiAqLworCV9fdTMyIHBhcmVudFszXTsgIC8qIFRoZSBwYXJlbnQgaXMganVzdCBhbG9uZyBmb3IgdGhlIHJpZGUuICovCisKKwlpZiAoZmhfbGVuIDwgMyB8fCBmaWxlaWRfdHlwZSA+IDIpCisJCXJldHVybiBOVUxMOworCisJY2hpbGRbMF0gPSBmaDMyWzBdOworCWNoaWxkWzFdID0gZmgxNlsyXTsgIC8qIGZoMTYgW3NpY10gKi8KKwljaGlsZFsyXSA9IGZoMzJbMl07CisKKwlwYXJlbnRbMF0gPSAwOworCXBhcmVudFsxXSA9IDA7CisJcGFyZW50WzJdID0gMDsKKwlpZiAoZmlsZWlkX3R5cGUgPT0gMikgeworCQlpZiAoZmhfbGVuID4gMikgcGFyZW50WzBdID0gZmgzMlszXTsKKwkJcGFyZW50WzFdID0gZmgxNlszXTsgIC8qIGZoMTYgW3NpY10gKi8KKwkJaWYgKGZoX2xlbiA+IDQpIHBhcmVudFsyXSA9IGZoMzJbNF07CisJfQorCisJcmV0dXJuIHNiLT5zX2V4cG9ydF9vcC0+ZmluZF9leHBvcnRlZF9kZW50cnkoc2IsIGNoaWxkLCBwYXJlbnQsCisJCQkJCQkgICAgIGFjY2VwdGFibGUsIGNvbnRleHQpOworfQorCisKK3N0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyBpc29mc19leHBvcnRfb3BzID0geworCS5kZWNvZGVfZmgJPSBpc29mc19leHBvcnRfZGVjb2RlX2ZoLAorCS5lbmNvZGVfZmgJPSBpc29mc19leHBvcnRfZW5jb2RlX2ZoLAorCS5nZXRfZGVudHJ5CT0gaXNvZnNfZXhwb3J0X2dldF9kZW50cnksCisJLmdldF9wYXJlbnQgICAgID0gaXNvZnNfZXhwb3J0X2dldF9wYXJlbnQsCit9OwpkaWZmIC0tZ2l0IGEvZnMvaXNvZnMvaW5vZGUuYyBiL2ZzL2lzb2ZzL2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkyNTZlNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2lzb2ZzL2lub2RlLmMKQEAgLTAsMCArMSwxNTAzIEBACisvKgorICogIGxpbnV4L2ZzL2lzb2ZzL2lub2RlLmMKKyAqCisgKiAgKEMpIDE5OTEgIExpbnVzIFRvcnZhbGRzIC0gbWluaXggZmlsZXN5c3RlbQorICogICAgICAxOTkyLCAxOTkzLCAxOTk0ICBFcmljIFlvdW5nZGFsZSBNb2RpZmllZCBmb3IgSVNPIDk2NjAgZmlsZXN5c3RlbS4KKyAqICAgICAgMTk5NCAgRWJlcmhhcmQgTW9lbmtlYmVyZyAtIG11bHRpIHNlc3Npb24gaGFuZGxpbmcuCisgKiAgICAgIDE5OTUgIE1hcmsgRG9iaWUgLSBhbGxvdyBtb3VudGluZyBvZiBzb21lIHdlaXJkIFZpZGVvQ0RzIGFuZCBQaG90b0NEcy4KKyAqCTE5OTcgIEdvcmRvbiBDaGFmZmVlIC0gSm9saWV0IENEcworICoJMTk5OCAgRXJpYyBMYW1tZXJ0cyAtIElTTyA5NjYwIExldmVsIDMKKyAqCTIwMDQgIFBhdWwgU2VyaWNlIC0gSW5vZGUgU3VwcG9ydCBwdXNoZWQgb3V0IGZyb20gNEdCIHRvIDEyOEdCCisgKgkyMDA0ICBQYXVsIFNlcmljZSAtIE5GUyBFeHBvcnQgT3BlcmF0aW9ucworICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvaXNvX2ZzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2Nkcm9tLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiemlzb2ZzLmgiCisKKyNkZWZpbmUgQkVRVUlFVAorCisjaWZkZWYgTEVBS19DSEVDSworc3RhdGljIGludCBjaGVja19tYWxsb2M7CitzdGF0aWMgaW50IGNoZWNrX2JyZWFkOworI2VuZGlmCisKK3N0YXRpYyBpbnQgaXNvZnNfaGFzaGkoc3RydWN0IGRlbnRyeSAqcGFyZW50LCBzdHJ1Y3QgcXN0ciAqcXN0cik7CitzdGF0aWMgaW50IGlzb2ZzX2hhc2goc3RydWN0IGRlbnRyeSAqcGFyZW50LCBzdHJ1Y3QgcXN0ciAqcXN0cik7CitzdGF0aWMgaW50IGlzb2ZzX2RlbnRyeV9jbXBpKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHFzdHIgKmEsIHN0cnVjdCBxc3RyICpiKTsKK3N0YXRpYyBpbnQgaXNvZnNfZGVudHJ5X2NtcChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICphLCBzdHJ1Y3QgcXN0ciAqYik7CisKKyNpZmRlZiBDT05GSUdfSk9MSUVUCitzdGF0aWMgaW50IGlzb2ZzX2hhc2hpX21zKHN0cnVjdCBkZW50cnkgKnBhcmVudCwgc3RydWN0IHFzdHIgKnFzdHIpOworc3RhdGljIGludCBpc29mc19oYXNoX21zKHN0cnVjdCBkZW50cnkgKnBhcmVudCwgc3RydWN0IHFzdHIgKnFzdHIpOworc3RhdGljIGludCBpc29mc19kZW50cnlfY21waV9tcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICphLCBzdHJ1Y3QgcXN0ciAqYik7CitzdGF0aWMgaW50IGlzb2ZzX2RlbnRyeV9jbXBfbXMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqYSwgc3RydWN0IHFzdHIgKmIpOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIGlzb2ZzX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBpc29mc19zYl9pbmZvICpzYmkgPSBJU09GU19TQihzYik7CisjaWZkZWYgQ09ORklHX0pPTElFVAorCWlmIChzYmktPnNfbmxzX2lvY2hhcnNldCkgeworCQl1bmxvYWRfbmxzKHNiaS0+c19ubHNfaW9jaGFyc2V0KTsKKwkJc2JpLT5zX25sc19pb2NoYXJzZXQgPSBOVUxMOworCX0KKyNlbmRpZgorCisjaWZkZWYgTEVBS19DSEVDSworCXByaW50aygiT3V0c3RhbmRpbmcgbWFsbG9jczolZCwgb3V0c3RhbmRpbmcgYnVmZmVyczogJWRcbiIsCisJICAgICAgIGNoZWNrX21hbGxvYywgY2hlY2tfYnJlYWQpOworI2VuZGlmCisKKwlrZnJlZShzYmkpOworCXNiLT5zX2ZzX2luZm8gPSBOVUxMOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgaXNvZnNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CitzdGF0aWMgaW50IGlzb2ZzX3N0YXRmcyAoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBrc3RhdGZzICopOworCitzdGF0aWMga21lbV9jYWNoZV90ICppc29mc19pbm9kZV9jYWNoZXA7CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmlzb2ZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGlzb19pbm9kZV9pbmZvICplaTsKKwllaSA9IChzdHJ1Y3QgaXNvX2lub2RlX2luZm8gKilrbWVtX2NhY2hlX2FsbG9jKGlzb2ZzX2lub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCWlmICghZWkpCisJCXJldHVybiBOVUxMOworCXJldHVybiAmZWktPnZmc19pbm9kZTsKK30KKworc3RhdGljIHZvaWQgaXNvZnNfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWttZW1fY2FjaGVfZnJlZShpc29mc19pbm9kZV9jYWNoZXAsIElTT0ZTX0koaW5vZGUpKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKiBmb28sIGttZW1fY2FjaGVfdCAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgaXNvX2lub2RlX2luZm8gKmVpID0gKHN0cnVjdCBpc29faW5vZGVfaW5mbyAqKSBmb287CisKKwlpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRll8U0xBQl9DVE9SX0NPTlNUUlVDVE9SKSkgPT0KKwkgICAgU0xBQl9DVE9SX0NPTlNUUlVDVE9SKQorCQlpbm9kZV9pbml0X29uY2UoJmVpLT52ZnNfaW5vZGUpOworfQorIAorc3RhdGljIGludCBpbml0X2lub2RlY2FjaGUodm9pZCkKK3sKKwlpc29mc19pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiaXNvZnNfaW5vZGVfY2FjaGUiLAorCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgaXNvX2lub2RlX2luZm8pLAorCQkJCQkgICAgIDAsIFNMQUJfUkVDTEFJTV9BQ0NPVU5ULAorCQkJCQkgICAgIGluaXRfb25jZSwgTlVMTCk7CisJaWYgKGlzb2ZzX2lub2RlX2NhY2hlcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGVzdHJveV9pbm9kZWNhY2hlKHZvaWQpCit7CisJaWYgKGttZW1fY2FjaGVfZGVzdHJveShpc29mc19pbm9kZV9jYWNoZXApKQorCQlwcmludGsoS0VSTl9JTkZPICJpc29faW5vZGVfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKK30KKworc3RhdGljIGludCBpc29mc19yZW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpCit7CisJLyogd2UgcHJvYmFibHkgd2FudCBhIGxvdCBtb3JlIGhlcmUgKi8KKwkqZmxhZ3MgfD0gTVNfUkRPTkxZOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgaXNvZnNfc29wcyA9IHsKKwkuYWxsb2NfaW5vZGUJPSBpc29mc19hbGxvY19pbm9kZSwKKwkuZGVzdHJveV9pbm9kZQk9IGlzb2ZzX2Rlc3Ryb3lfaW5vZGUsCisJLnJlYWRfaW5vZGUJPSBpc29mc19yZWFkX2lub2RlLAorCS5wdXRfc3VwZXIJPSBpc29mc19wdXRfc3VwZXIsCisJLnN0YXRmcwkJPSBpc29mc19zdGF0ZnMsCisJLnJlbW91bnRfZnMJPSBpc29mc19yZW1vdW50LAorfTsKKworCitzdGF0aWMgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGlzb2ZzX2RlbnRyeV9vcHNbXSA9IHsKKwl7CisJCS5kX2hhc2gJCT0gaXNvZnNfaGFzaCwKKwkJLmRfY29tcGFyZQk9IGlzb2ZzX2RlbnRyeV9jbXAsCisJfSwKKwl7CisJCS5kX2hhc2gJCT0gaXNvZnNfaGFzaGksCisJCS5kX2NvbXBhcmUJPSBpc29mc19kZW50cnlfY21waSwKKwl9LAorI2lmZGVmIENPTkZJR19KT0xJRVQKKwl7CisJCS5kX2hhc2gJCT0gaXNvZnNfaGFzaF9tcywKKwkJLmRfY29tcGFyZQk9IGlzb2ZzX2RlbnRyeV9jbXBfbXMsCisJfSwKKwl7CisJCS5kX2hhc2gJCT0gaXNvZnNfaGFzaGlfbXMsCisJCS5kX2NvbXBhcmUJPSBpc29mc19kZW50cnlfY21waV9tcywKKwl9CisjZW5kaWYKK307CisKK3N0cnVjdCBpc285NjYwX29wdGlvbnN7CisJY2hhciBtYXA7CisJY2hhciByb2NrOworCWNoYXIgam9saWV0OworCWNoYXIgY3J1ZnQ7CisJY2hhciB1bmhpZGU7CisJY2hhciBub2NvbXByZXNzOworCXVuc2lnbmVkIGNoYXIgY2hlY2s7CisJdW5zaWduZWQgaW50IGJsb2Nrc2l6ZTsKKwltb2RlX3QgbW9kZTsKKwlnaWRfdCBnaWQ7CisJdWlkX3QgdWlkOworCWNoYXIgKmlvY2hhcnNldDsKKwl1bnNpZ25lZCBjaGFyIHV0Zjg7CisgICAgICAgIC8qIExWRSAqLworICAgICAgICBzMzIgc2Vzc2lvbjsKKyAgICAgICAgczMyIHNic2VjdG9yOworfTsKKworLyoKKyAqIENvbXB1dGUgdGhlIGhhc2ggZm9yIHRoZSBpc29mcyBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRlbnRyeS4KKyAqLworc3RhdGljIGludAoraXNvZnNfaGFzaF9jb21tb24oc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqcXN0ciwgaW50IG1zKQoreworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IGxlbjsKKworCWxlbiA9IHFzdHItPmxlbjsKKwluYW1lID0gcXN0ci0+bmFtZTsKKwlpZiAobXMpIHsKKwkJd2hpbGUgKGxlbiAmJiBuYW1lW2xlbi0xXSA9PSAnLicpCisJCQlsZW4tLTsKKwl9CisKKwlxc3RyLT5oYXNoID0gZnVsbF9uYW1lX2hhc2gobmFtZSwgbGVuKTsKKworCXJldHVybiAwOworfQorCisvKgorICogQ29tcHV0ZSB0aGUgaGFzaCBmb3IgdGhlIGlzb2ZzIG5hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgZGVudHJ5LgorICovCitzdGF0aWMgaW50Citpc29mc19oYXNoaV9jb21tb24oc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqcXN0ciwgaW50IG1zKQoreworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IGxlbjsKKwljaGFyIGM7CisJdW5zaWduZWQgbG9uZyBoYXNoOworCisJbGVuID0gcXN0ci0+bGVuOworCW5hbWUgPSBxc3RyLT5uYW1lOworCWlmIChtcykgeworCQl3aGlsZSAobGVuICYmIG5hbWVbbGVuLTFdID09ICcuJykKKwkJCWxlbi0tOworCX0KKworCWhhc2ggPSBpbml0X25hbWVfaGFzaCgpOworCXdoaWxlIChsZW4tLSkgeworCQljID0gdG9sb3dlcigqbmFtZSsrKTsKKwkJaGFzaCA9IHBhcnRpYWxfbmFtZV9oYXNoKHRvbG93ZXIoYyksIGhhc2gpOworCX0KKwlxc3RyLT5oYXNoID0gZW5kX25hbWVfaGFzaChoYXNoKTsKKworCXJldHVybiAwOworfQorCisvKgorICogQ2FzZSBpbnNlbnNpdGl2ZSBjb21wYXJlIG9mIHR3byBpc29mcyBuYW1lcy4KKyAqLworc3RhdGljIGludAoraXNvZnNfZGVudHJ5X2NtcGlfY29tbW9uKHN0cnVjdCBkZW50cnkgKmRlbnRyeSxzdHJ1Y3QgcXN0ciAqYSxzdHJ1Y3QgcXN0ciAqYixpbnQgbXMpCit7CisJaW50IGFsZW4sIGJsZW47CisKKwkvKiBBIGZpbGVuYW1lIGNhbm5vdCBlbmQgaW4gJy4nIG9yIHdlIHRyZWF0IGl0IGxpa2UgaXQgaGFzIG5vbmUgKi8KKwlhbGVuID0gYS0+bGVuOworCWJsZW4gPSBiLT5sZW47CisJaWYgKG1zKSB7CisJCXdoaWxlIChhbGVuICYmIGEtPm5hbWVbYWxlbi0xXSA9PSAnLicpCisJCQlhbGVuLS07CisJCXdoaWxlIChibGVuICYmIGItPm5hbWVbYmxlbi0xXSA9PSAnLicpCisJCQlibGVuLS07CisJfQorCWlmIChhbGVuID09IGJsZW4pIHsKKwkJaWYgKHN0cm5pY21wKGEtPm5hbWUsIGItPm5hbWUsIGFsZW4pID09IDApCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBDYXNlIHNlbnNpdGl2ZSBjb21wYXJlIG9mIHR3byBpc29mcyBuYW1lcy4KKyAqLworc3RhdGljIGludAoraXNvZnNfZGVudHJ5X2NtcF9jb21tb24oc3RydWN0IGRlbnRyeSAqZGVudHJ5LHN0cnVjdCBxc3RyICphLHN0cnVjdCBxc3RyICpiLGludCBtcykKK3sKKwlpbnQgYWxlbiwgYmxlbjsKKworCS8qIEEgZmlsZW5hbWUgY2Fubm90IGVuZCBpbiAnLicgb3Igd2UgdHJlYXQgaXQgbGlrZSBpdCBoYXMgbm9uZSAqLworCWFsZW4gPSBhLT5sZW47CisJYmxlbiA9IGItPmxlbjsKKwlpZiAobXMpIHsKKwkJd2hpbGUgKGFsZW4gJiYgYS0+bmFtZVthbGVuLTFdID09ICcuJykKKwkJCWFsZW4tLTsKKwkJd2hpbGUgKGJsZW4gJiYgYi0+bmFtZVtibGVuLTFdID09ICcuJykKKwkJCWJsZW4tLTsKKwl9CisJaWYgKGFsZW4gPT0gYmxlbikgeworCQlpZiAoc3RybmNtcChhLT5uYW1lLCBiLT5uYW1lLCBhbGVuKSA9PSAwKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50Citpc29mc19oYXNoKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHFzdHIgKnFzdHIpCit7CisJcmV0dXJuIGlzb2ZzX2hhc2hfY29tbW9uKGRlbnRyeSwgcXN0ciwgMCk7Cit9CisKK3N0YXRpYyBpbnQKK2lzb2ZzX2hhc2hpKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHFzdHIgKnFzdHIpCit7CisJcmV0dXJuIGlzb2ZzX2hhc2hpX2NvbW1vbihkZW50cnksIHFzdHIsIDApOworfQorCitzdGF0aWMgaW50Citpc29mc19kZW50cnlfY21wKHN0cnVjdCBkZW50cnkgKmRlbnRyeSxzdHJ1Y3QgcXN0ciAqYSxzdHJ1Y3QgcXN0ciAqYikKK3sKKwlyZXR1cm4gaXNvZnNfZGVudHJ5X2NtcF9jb21tb24oZGVudHJ5LCBhLCBiLCAwKTsKK30KKworc3RhdGljIGludAoraXNvZnNfZGVudHJ5X2NtcGkoc3RydWN0IGRlbnRyeSAqZGVudHJ5LHN0cnVjdCBxc3RyICphLHN0cnVjdCBxc3RyICpiKQoreworCXJldHVybiBpc29mc19kZW50cnlfY21waV9jb21tb24oZGVudHJ5LCBhLCBiLCAwKTsKK30KKworI2lmZGVmIENPTkZJR19KT0xJRVQKK3N0YXRpYyBpbnQKK2lzb2ZzX2hhc2hfbXMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqcXN0cikKK3sKKwlyZXR1cm4gaXNvZnNfaGFzaF9jb21tb24oZGVudHJ5LCBxc3RyLCAxKTsKK30KKworc3RhdGljIGludAoraXNvZnNfaGFzaGlfbXMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqcXN0cikKK3sKKwlyZXR1cm4gaXNvZnNfaGFzaGlfY29tbW9uKGRlbnRyeSwgcXN0ciwgMSk7Cit9CisKK3N0YXRpYyBpbnQKK2lzb2ZzX2RlbnRyeV9jbXBfbXMoc3RydWN0IGRlbnRyeSAqZGVudHJ5LHN0cnVjdCBxc3RyICphLHN0cnVjdCBxc3RyICpiKQoreworCXJldHVybiBpc29mc19kZW50cnlfY21wX2NvbW1vbihkZW50cnksIGEsIGIsIDEpOworfQorCitzdGF0aWMgaW50Citpc29mc19kZW50cnlfY21waV9tcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksc3RydWN0IHFzdHIgKmEsc3RydWN0IHFzdHIgKmIpCit7CisJcmV0dXJuIGlzb2ZzX2RlbnRyeV9jbXBpX2NvbW1vbihkZW50cnksIGEsIGIsIDEpOworfQorI2VuZGlmCisKK2VudW0geworCU9wdF9ibG9jaywgT3B0X2NoZWNrX3IsIE9wdF9jaGVja19zLCBPcHRfY3J1ZnQsIE9wdF9naWQsIE9wdF9pZ25vcmUsCisJT3B0X2lvY2hhcnNldCwgT3B0X21hcF9hLCBPcHRfbWFwX24sIE9wdF9tYXBfbywgT3B0X21vZGUsIE9wdF9ub2pvbGlldCwKKwlPcHRfbm9yb2NrLCBPcHRfc2IsIE9wdF9zZXNzaW9uLCBPcHRfdWlkLCBPcHRfdW5oaWRlLCBPcHRfdXRmOCwgT3B0X2VyciwKKwlPcHRfbm9jb21wcmVzcywKK307CisKK3N0YXRpYyBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKKwl7T3B0X25vcm9jaywgIm5vcm9jayJ9LAorCXtPcHRfbm9qb2xpZXQsICJub2pvbGlldCJ9LAorCXtPcHRfdW5oaWRlLCAidW5oaWRlIn0sCisJe09wdF9jcnVmdCwgImNydWZ0In0sCisJe09wdF91dGY4LCAidXRmOCJ9LAorCXtPcHRfaW9jaGFyc2V0LCAiaW9jaGFyc2V0PSVzIn0sCisJe09wdF9tYXBfYSwgIm1hcD1hY29ybiJ9LAorCXtPcHRfbWFwX2EsICJtYXA9YSJ9LAorCXtPcHRfbWFwX24sICJtYXA9bm9ybWFsIn0sCisJe09wdF9tYXBfbiwgIm1hcD1uIn0sCisJe09wdF9tYXBfbywgIm1hcD1vZmYifSwKKwl7T3B0X21hcF9vLCAibWFwPW8ifSwKKwl7T3B0X3Nlc3Npb24sICJzZXNzaW9uPSV1In0sCisJe09wdF9zYiwgInNic2VjdG9yPSV1In0sCisJe09wdF9jaGVja19yLCAiY2hlY2s9cmVsYXhlZCJ9LAorCXtPcHRfY2hlY2tfciwgImNoZWNrPXIifSwKKwl7T3B0X2NoZWNrX3MsICJjaGVjaz1zdHJpY3QifSwKKwl7T3B0X2NoZWNrX3MsICJjaGVjaz1zIn0sCisJe09wdF91aWQsICJ1aWQ9JXUifSwKKwl7T3B0X2dpZCwgImdpZD0ldSJ9LAorCXtPcHRfbW9kZSwgIm1vZGU9JXUifSwKKwl7T3B0X2Jsb2NrLCAiYmxvY2s9JXUifSwKKwl7T3B0X2lnbm9yZSwgImNvbnY9YmluYXJ5In0sCisJe09wdF9pZ25vcmUsICJjb252PWIifSwKKwl7T3B0X2lnbm9yZSwgImNvbnY9dGV4dCJ9LAorCXtPcHRfaWdub3JlLCAiY29udj10In0sCisJe09wdF9pZ25vcmUsICJjb252PW10ZXh0In0sCisJe09wdF9pZ25vcmUsICJjb252PW0ifSwKKwl7T3B0X2lnbm9yZSwgImNvbnY9YXV0byJ9LAorCXtPcHRfaWdub3JlLCAiY29udj1hIn0sCisJe09wdF9ub2NvbXByZXNzLCAibm9jb21wcmVzcyJ9LAorCXtPcHRfZXJyLCBOVUxMfQorfTsKKworc3RhdGljIGludCBwYXJzZV9vcHRpb25zKGNoYXIgKm9wdGlvbnMsIHN0cnVjdCBpc285NjYwX29wdGlvbnMgKiBwb3B0KQoreworCWNoYXIgKnA7CisJaW50IG9wdGlvbjsKKworCXBvcHQtPm1hcCA9ICduJzsKKwlwb3B0LT5yb2NrID0gJ3knOworCXBvcHQtPmpvbGlldCA9ICd5JzsKKwlwb3B0LT5jcnVmdCA9ICduJzsKKwlwb3B0LT51bmhpZGUgPSAnbic7CisJcG9wdC0+Y2hlY2sgPSAndSc7CQkvKiB1bnNldCAqLworCXBvcHQtPm5vY29tcHJlc3MgPSAwOworCXBvcHQtPmJsb2Nrc2l6ZSA9IDEwMjQ7CisJcG9wdC0+bW9kZSA9IFNfSVJVR08gfCBTX0lYVUdPOyAvKiByLXggZm9yIGFsbC4gIFRoZSBkaXNjIGNvdWxkCisJCQkJCSAgIGJlIHNoYXJlZCB3aXRoIERPUyBtYWNoaW5lcyBzbworCQkJCQkgICB2aXJ0dWFsbHkgYW55dGhpbmcgY291bGQgYmUKKwkJCQkJICAgYSB2YWxpZCBleGVjdXRhYmxlLiAqLworCXBvcHQtPmdpZCA9IDA7CisJcG9wdC0+dWlkID0gMDsKKwlwb3B0LT5pb2NoYXJzZXQgPSBOVUxMOworCXBvcHQtPnV0ZjggPSAwOworCXBvcHQtPnNlc3Npb249LTE7CisJcG9wdC0+c2JzZWN0b3I9LTE7CisJaWYgKCFvcHRpb25zKQorCQlyZXR1cm4gMTsKKworCXdoaWxlICgocCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgeworCQlpbnQgdG9rZW47CisJCXN1YnN0cmluZ190IGFyZ3NbTUFYX09QVF9BUkdTXTsKKwkJdW5zaWduZWQgbjsKKworCQlpZiAoISpwKQorCQkJY29udGludWU7CisKKwkJdG9rZW4gPSBtYXRjaF90b2tlbihwLCB0b2tlbnMsIGFyZ3MpOworCQlzd2l0Y2ggKHRva2VuKSB7CisJCWNhc2UgT3B0X25vcm9jazoKKwkJCXBvcHQtPnJvY2sgPSAnbic7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm9qb2xpZXQ6CisJCQlwb3B0LT5qb2xpZXQgPSAnbic7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfdW5oaWRlOgorCQkJcG9wdC0+dW5oaWRlID0gJ3knOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2NydWZ0OgorCQkJcG9wdC0+Y3J1ZnQgPSAneSc7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfdXRmODoKKwkJCXBvcHQtPnV0ZjggPSAxOworCQkJYnJlYWs7CisjaWZkZWYgQ09ORklHX0pPTElFVAorCQljYXNlIE9wdF9pb2NoYXJzZXQ6CisJCQlwb3B0LT5pb2NoYXJzZXQgPSBtYXRjaF9zdHJkdXAoJmFyZ3NbMF0pOworCQkJYnJlYWs7CisjZW5kaWYKKwkJY2FzZSBPcHRfbWFwX2E6CisJCQlwb3B0LT5tYXAgPSAnYSc7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbWFwX286CisJCQlwb3B0LT5tYXAgPSAnbyc7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbWFwX246CisJCQlwb3B0LT5tYXAgPSAnbic7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfc2Vzc2lvbjoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAwOworCQkJbiA9IG9wdGlvbjsKKwkJCWlmIChuID4gOTkpCisJCQkJcmV0dXJuIDA7CisJCQlwb3B0LT5zZXNzaW9uID0gbiArIDE7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfc2I6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMDsKKwkJCXBvcHQtPnNic2VjdG9yID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2NoZWNrX3I6CisJCQlwb3B0LT5jaGVjayA9ICdyJzsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9jaGVja19zOgorCQkJcG9wdC0+Y2hlY2sgPSAncyc7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfaWdub3JlOgorCQkJYnJlYWs7CisJCWNhc2UgT3B0X3VpZDoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAwOworCQkJcG9wdC0+dWlkID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2dpZDoKKwkJCWlmIChtYXRjaF9pbnQoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAwOworCQkJcG9wdC0+Z2lkID0gb3B0aW9uOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X21vZGU6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMDsKKwkJCXBvcHQtPm1vZGUgPSBvcHRpb247CisJCQlicmVhazsKKwkJY2FzZSBPcHRfYmxvY2s6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gMDsKKwkJCW4gPSBvcHRpb247CisJCQlpZiAobiAhPSA1MTIgJiYgbiAhPSAxMDI0ICYmIG4gIT0gMjA0OCkKKwkJCQlyZXR1cm4gMDsKKwkJCXBvcHQtPmJsb2Nrc2l6ZSA9IG47CisJCQlicmVhazsKKwkJY2FzZSBPcHRfbm9jb21wcmVzczoKKwkJCXBvcHQtPm5vY29tcHJlc3MgPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIGxvb2sgaWYgdGhlIGRyaXZlciBjYW4gdGVsbCB0aGUgbXVsdGkgc2Vzc2lvbiByZWRpcmVjdGlvbiB2YWx1ZQorICoKKyAqIGRvbid0IGNoYW5nZSB0aGlzIGlmIHlvdSBkb24ndCBrbm93IHdoYXQgeW91IGRvLCBwbGVhc2UhCisgKiBNdWx0aXNlc3Npb24gaXMgbGVnYWwgb25seSB3aXRoIFhBIGRpc2tzLgorICogQSBub24tWEEgZGlzayB3aXRoIG1vcmUgdGhhbiBvbmUgdm9sdW1lIGRlc2NyaXB0b3IgbWF5IGRvIGl0IHJpZ2h0LCBidXQKKyAqIHVzdWFsbHkgaXMgd3JpdHRlbiBpbiBhIG5vd2hlcmUgc3RhbmRhcmRpemVkICJtdWx0aS1wYXJ0aXRpb24iIG1hbm5lci4KKyAqIE11bHRpc2Vzc2lvbiB1c2VzIGFic29sdXRlIGFkZHJlc3NpbmcgKHNvbGVseSB0aGUgZmlyc3QgZnJhbWUgb2YgdGhlIHdob2xlCisgKiB0cmFjayBpcyAjMCksIG11bHRpLXBhcnRpdGlvbiB1c2VzIHJlbGF0aXZlIGFkZHJlc3NpbmcgKGVhY2ggZmlyc3QgZnJhbWUgb2YKKyAqIGVhY2ggdHJhY2sgaXMgIzApLCBhbmQgYSB0cmFjayBpcyBub3QgYSBzZXNzaW9uLgorICoKKyAqIEEgYnJva2VuIENEd3JpdGVyIHNvZnR3YXJlIG9yIGRyaXZlIGZpcm13YXJlIGRvZXMgbm90IHNldCBuZXcgc3RhbmRhcmRzLAorICogYXQgbGVhc3Qgbm90IGlmIGNvbmZsaWN0aW5nIHdpdGggdGhlIGV4aXN0aW5nIG9uZXMuCisgKgorICogZW1vZW5rZUBnd2RnLmRlCisgKi8KKyNkZWZpbmUgV0VfT0JFWV9USEVfV1JJVFRFTl9TVEFOREFSRFMgMQorCitzdGF0aWMgdW5zaWduZWQgaW50IGlzb2ZzX2dldF9sYXN0X3Nlc3Npb24oc3RydWN0IHN1cGVyX2Jsb2NrICpzYixzMzIgc2Vzc2lvbiApCit7CisJc3RydWN0IGNkcm9tX211bHRpc2Vzc2lvbiBtc19pbmZvOworCXVuc2lnbmVkIGludCB2b2xfZGVzY19zdGFydDsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gc2ItPnNfYmRldjsKKwlpbnQgaTsKKworCXZvbF9kZXNjX3N0YXJ0PTA7CisJbXNfaW5mby5hZGRyX2Zvcm1hdD1DRFJPTV9MQkE7CisJaWYoc2Vzc2lvbiA+PSAwICYmIHNlc3Npb24gPD0gOTkpIHsKKwkJc3RydWN0IGNkcm9tX3RvY2VudHJ5IFRlOworCQlUZS5jZHRlX3RyYWNrPXNlc3Npb247CisJCVRlLmNkdGVfZm9ybWF0PUNEUk9NX0xCQTsKKwkJaSA9IGlvY3RsX2J5X2JkZXYoYmRldiwgQ0RST01SRUFEVE9DRU5UUlksICh1bnNpZ25lZCBsb25nKSAmVGUpOworCQlpZiAoIWkpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJTZXNzaW9uICVkIHN0YXJ0ICVkIHR5cGUgJWRcbiIsCisJCQkgICAgICAgc2Vzc2lvbiwgVGUuY2R0ZV9hZGRyLmxiYSwKKwkJCSAgICAgICBUZS5jZHRlX2N0cmwmQ0RST01fREFUQV9UUkFDSyk7CisJCQlpZiAoKFRlLmNkdGVfY3RybCZDRFJPTV9EQVRBX1RSQUNLKSA9PSA0KQorCQkJCXJldHVybiBUZS5jZHRlX2FkZHIubGJhOworCQl9CisJCQkKKwkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIHNlc3Npb24gbnVtYmVyIG9yIHR5cGUgb2YgdHJhY2tcbiIpOworCX0KKwlpID0gaW9jdGxfYnlfYmRldihiZGV2LCBDRFJPTU1VTFRJU0VTU0lPTiwgKHVuc2lnbmVkIGxvbmcpICZtc19pbmZvKTsKKwlpZihzZXNzaW9uID4gMCkgcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIHNlc3Npb24gbnVtYmVyXG4iKTsKKyNpZiAwCisJcHJpbnRrKCJpc29mcy5pbm9kZTogQ0RST01NVUxUSVNFU1NJT046IHJjPSVkXG4iLGkpOworCWlmIChpPT0wKSB7CisJCXByaW50aygiaXNvZnMuaW5vZGU6IFhBIGRpc2s6ICVzXG4iLG1zX2luZm8ueGFfZmxhZz8ieWVzIjoibm8iKTsKKwkJcHJpbnRrKCJpc29mcy5pbm9kZTogdm9sX2Rlc2Nfc3RhcnQgPSAlZFxuIiwgbXNfaW5mby5hZGRyLmxiYSk7CisJfQorI2VuZGlmCisJaWYgKGk9PTApCisjaWYgV0VfT0JFWV9USEVfV1JJVFRFTl9TVEFOREFSRFMKKyAgICAgICAgaWYgKG1zX2luZm8ueGFfZmxhZykgLyogbmVjZXNzYXJ5IGZvciBhIHZhbGlkIG1zX2luZm8uYWRkciAqLworI2VuZGlmCisJCXZvbF9kZXNjX3N0YXJ0PW1zX2luZm8uYWRkci5sYmE7CisJcmV0dXJuIHZvbF9kZXNjX3N0YXJ0OworfQorCisvKgorICogSW5pdGlhbGl6ZSB0aGUgc3VwZXJibG9jayBhbmQgcmVhZCB0aGUgcm9vdCBpbm9kZS4KKyAqCisgKiBOb3RlOiBhIGNoZWNrX2Rpc2tfY2hhbmdlKCkgaGFzIGJlZW4gZG9uZSBpbW1lZGlhdGVseSBwcmlvcgorICogdG8gdGhpcyBjYWxsLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGNoZWNrIGFnYWluLgorICovCitzdGF0aWMgaW50IGlzb2ZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQoreworCXN0cnVjdCBidWZmZXJfaGVhZAkgICAgICAqIGJoID0gTlVMTCwgKnByaV9iaCA9IE5VTEw7CisJc3RydWN0IGhzX3ByaW1hcnlfZGVzY3JpcHRvciAgKiBoX3ByaSA9IE5VTEw7CisJc3RydWN0IGlzb19wcmltYXJ5X2Rlc2NyaXB0b3IgKiBwcmkgPSBOVUxMOworCXN0cnVjdCBpc29fc3VwcGxlbWVudGFyeV9kZXNjcmlwdG9yICpzZWMgPSBOVUxMOworCXN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAgICogcm9vdHA7CisJaW50CQkJCWpvbGlldF9sZXZlbCA9IDA7CisJaW50CQkJCWlzb19ibGtudW0sIGJsb2NrOworCWludAkJCQlvcmlnX3pvbmVzaXplOworCWludAkJCQl0YWJsZTsKKwl1bnNpZ25lZCBpbnQJCQl2b2xfZGVzY19zdGFydDsKKwl1bnNpZ25lZCBsb25nCQkJZmlyc3RfZGF0YV96b25lOworCXN0cnVjdCBpbm9kZQkJICAgICAgKiBpbm9kZTsKKwlzdHJ1Y3QgaXNvOTY2MF9vcHRpb25zCQlvcHQ7CisJc3RydWN0IGlzb2ZzX3NiX2luZm8JICAgICAgKiBzYmk7CisKKwlzYmkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaXNvZnNfc2JfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghc2JpKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzLT5zX2ZzX2luZm8gPSBzYmk7CisJbWVtc2V0KHNiaSwgMCwgc2l6ZW9mKHN0cnVjdCBpc29mc19zYl9pbmZvKSk7CisKKwlpZiAoIXBhcnNlX29wdGlvbnMoKGNoYXIgKikgZGF0YSwgJm9wdCkpCisJCWdvdG8gb3V0X2ZyZWVzYmk7CisKKwkvKgorCSAqIEZpcnN0IG9mIGFsbCwgZ2V0IHRoZSBoYXJkd2FyZSBibG9ja3NpemUgZm9yIHRoaXMgZGV2aWNlLgorCSAqIElmIHdlIGRvbid0IGtub3cgd2hhdCBpdCBpcywgb3IgdGhlIGhhcmR3YXJlIGJsb2Nrc2l6ZSBpcworCSAqIGxhcmdlciB0aGFuIHRoZSBibG9ja3NpemUgdGhlIHVzZXIgc3BlY2lmaWVkLCB0aGVuIHVzZQorCSAqIHRoYXQgdmFsdWUuCisJICovCisJLyoKKwkgKiBXaGF0IGlmIGJ1Z2dlciB0ZWxscyB1cyB0byBnbyBiZXlvbmQgcGFnZSBzaXplPworCSAqLworCW9wdC5ibG9ja3NpemUgPSBzYl9taW5fYmxvY2tzaXplKHMsIG9wdC5ibG9ja3NpemUpOworCisJc2JpLT5zX2hpZ2hfc2llcnJhID0gMDsgLyogZGVmYXVsdCBpcyBpc285NjYwICovCisKKwl2b2xfZGVzY19zdGFydCA9IChvcHQuc2JzZWN0b3IgIT0gLTEpID8KKwkJb3B0LnNic2VjdG9yIDogaXNvZnNfZ2V0X2xhc3Rfc2Vzc2lvbihzLG9wdC5zZXNzaW9uKTsKKworICAJZm9yIChpc29fYmxrbnVtID0gdm9sX2Rlc2Nfc3RhcnQrMTY7CisgICAgICAgICAgICAgaXNvX2Jsa251bSA8IHZvbF9kZXNjX3N0YXJ0KzEwMDsgaXNvX2Jsa251bSsrKQorCXsKKwkgICAgc3RydWN0IGhzX3ZvbHVtZV9kZXNjcmlwdG9yICAgKiBoZHA7CisJICAgIHN0cnVjdCBpc29fdm9sdW1lX2Rlc2NyaXB0b3IgICogdmRwOworCisJICAgIGJsb2NrID0gaXNvX2Jsa251bSA8PCAoSVNPRlNfQkxPQ0tfQklUUyAtIHMtPnNfYmxvY2tzaXplX2JpdHMpOworCSAgICBpZiAoIShiaCA9IHNiX2JyZWFkKHMsIGJsb2NrKSkpCisJCWdvdG8gb3V0X25vX3JlYWQ7CisKKwkgICAgdmRwID0gKHN0cnVjdCBpc29fdm9sdW1lX2Rlc2NyaXB0b3IgKiliaC0+Yl9kYXRhOworCSAgICBoZHAgPSAoc3RydWN0IGhzX3ZvbHVtZV9kZXNjcmlwdG9yICopYmgtPmJfZGF0YTsKKwkgICAgCisJICAgIC8qIER1ZSB0byB0aGUgb3ZlcmxhcHBpbmcgcGh5c2ljYWwgbG9jYXRpb24gb2YgdGhlIGRlc2NyaXB0b3JzLCAKKwkgICAgICogSVNPIENEcyBjYW4gbWF0Y2ggaGRwLT5pZD09SFNfU1RBTkRBUkRfSUQgYXMgd2VsbC4gVG8gZW5zdXJlIAorCSAgICAgKiBwcm9wZXIgaWRlbnRpZmljYXRpb24gaW4gdGhpcyBjYXNlLCB3ZSBmaXJzdCBjaGVjayBmb3IgSVNPLgorCSAgICAgKi8KKwkgICAgaWYgKHN0cm5jbXAgKHZkcC0+aWQsIElTT19TVEFOREFSRF9JRCwgc2l6ZW9mIHZkcC0+aWQpID09IDApIHsKKwkJaWYgKGlzb251bV83MTEgKHZkcC0+dHlwZSkgPT0gSVNPX1ZEX0VORCkKKwkJICAgIGJyZWFrOworCQlpZiAoaXNvbnVtXzcxMSAodmRwLT50eXBlKSA9PSBJU09fVkRfUFJJTUFSWSkgeworCQkgICAgaWYgKHByaSA9PSBOVUxMKSB7CisJCQlwcmkgPSAoc3RydWN0IGlzb19wcmltYXJ5X2Rlc2NyaXB0b3IgKil2ZHA7CisJCQkvKiBTYXZlIHRoZSBidWZmZXIgaW4gY2FzZSB3ZSBuZWVkIGl0IC4uLiAqLworCQkJcHJpX2JoID0gYmg7CisJCQliaCA9IE5VTEw7CisJCSAgICB9CisJCX0KKyNpZmRlZiBDT05GSUdfSk9MSUVUCisJCWVsc2UgaWYgKGlzb251bV83MTEgKHZkcC0+dHlwZSkgPT0gSVNPX1ZEX1NVUFBMRU1FTlRBUlkpIHsKKwkJICAgIHNlYyA9IChzdHJ1Y3QgaXNvX3N1cHBsZW1lbnRhcnlfZGVzY3JpcHRvciAqKXZkcDsKKwkJICAgIGlmIChzZWMtPmVzY2FwZVswXSA9PSAweDI1ICYmIHNlYy0+ZXNjYXBlWzFdID09IDB4MmYpIHsKKwkJCWlmIChvcHQuam9saWV0ID09ICd5JykgeworCQkJICAgIGlmIChzZWMtPmVzY2FwZVsyXSA9PSAweDQwKSB7CisJCQkJam9saWV0X2xldmVsID0gMTsKKwkJCSAgICB9IGVsc2UgaWYgKHNlYy0+ZXNjYXBlWzJdID09IDB4NDMpIHsKKwkJCQlqb2xpZXRfbGV2ZWwgPSAyOworCQkJICAgIH0gZWxzZSBpZiAoc2VjLT5lc2NhcGVbMl0gPT0gMHg0NSkgeworCQkJCWpvbGlldF9sZXZlbCA9IDM7CisJCQkgICAgfQorCQkJICAgIHByaW50ayhLRVJOX0RFQlVHIklTTyA5NjYwIEV4dGVuc2lvbnM6IE1pY3Jvc29mdCBKb2xpZXQgTGV2ZWwgJWRcbiIsCisJCQkJICAgam9saWV0X2xldmVsKTsKKwkJCX0KKwkJCWdvdG8gcm9vdF9mb3VuZDsKKwkJICAgIH0gZWxzZSB7CisJCQkvKiBVbmtub3duIHN1cHBsZW1lbnRhcnkgdm9sdW1lIGRlc2NyaXB0b3IgKi8KKwkJCXNlYyA9IE5VTEw7CisJCSAgICB9CisJCX0KKyNlbmRpZgorCSAgICB9IGVsc2UgeworCSAgICAgICAgaWYgKHN0cm5jbXAgKGhkcC0+aWQsIEhTX1NUQU5EQVJEX0lELCBzaXplb2YgaGRwLT5pZCkgPT0gMCkgeworCQkgICAgaWYgKGlzb251bV83MTEgKGhkcC0+dHlwZSkgIT0gSVNPX1ZEX1BSSU1BUlkpCisJCSAgICAgICAgZ290byBvdXRfZnJlZWJoOworCQkKKwkJICAgIHNiaS0+c19oaWdoX3NpZXJyYSA9IDE7CisJCSAgICBvcHQucm9jayA9ICduJzsKKwkJICAgIGhfcHJpID0gKHN0cnVjdCBoc19wcmltYXJ5X2Rlc2NyaXB0b3IgKil2ZHA7CisJCSAgICBnb3RvIHJvb3RfZm91bmQ7CisJCX0KKwkgICAgfQorCisgICAgICAgICAgICAvKiBKdXN0IHNraXAgYW55IHZvbHVtZSBkZXNjcmlwdG9ycyB3ZSBkb24ndCByZWNvZ25pemUgKi8KKworCSAgICBicmVsc2UoYmgpOworCSAgICBiaCA9IE5VTEw7CisJfQorCS8qCisJICogSWYgd2UgZmFsbCB0aHJvdWdoLCBlaXRoZXIgbm8gdm9sdW1lIGRlc2NyaXB0b3Igd2FzIGZvdW5kLAorCSAqIG9yIGVsc2Ugd2UgcGFzc2VkIGEgcHJpbWFyeSBkZXNjcmlwdG9yIGxvb2tpbmcgZm9yIG90aGVycy4KKwkgKi8KKwlpZiAoIXByaSkKKwkJZ290byBvdXRfdW5rbm93bl9mb3JtYXQ7CisJYnJlbHNlKGJoKTsKKwliaCA9IHByaV9iaDsKKwlwcmlfYmggPSBOVUxMOworCityb290X2ZvdW5kOgorCisJaWYgKGpvbGlldF9sZXZlbCAmJiAocHJpID09IE5VTEwgfHwgb3B0LnJvY2sgPT0gJ24nKSkgeworCSAgICAvKiBUaGlzIGlzIHRoZSBjYXNlIG9mIEpvbGlldCB3aXRoIHRoZSBub3JvY2sgbW91bnQgZmxhZy4KKwkgICAgICogQSBkaXNjIHdpdGggYm90aCBKb2xpZXQgYW5kIFJvY2sgUmlkZ2UgaXMgaGFuZGxlZCBsYXRlcgorCSAgICAgKi8KKwkgICAgcHJpID0gKHN0cnVjdCBpc29fcHJpbWFyeV9kZXNjcmlwdG9yICopIHNlYzsKKwl9CisKKwlpZihzYmktPnNfaGlnaF9zaWVycmEpeworCSAgcm9vdHAgPSAoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICopIGhfcHJpLT5yb290X2RpcmVjdG9yeV9yZWNvcmQ7CisJICBzYmktPnNfbnpvbmVzID0gaXNvbnVtXzczMyAoaF9wcmktPnZvbHVtZV9zcGFjZV9zaXplKTsKKwkgIHNiaS0+c19sb2dfem9uZV9zaXplID0gaXNvbnVtXzcyMyAoaF9wcmktPmxvZ2ljYWxfYmxvY2tfc2l6ZSk7CisJICBzYmktPnNfbWF4X3NpemUgPSBpc29udW1fNzMzKGhfcHJpLT52b2x1bWVfc3BhY2Vfc2l6ZSk7CisJfSBlbHNlIHsKKwkgIGlmICghcHJpKQorCSAgICBnb3RvIG91dF9mcmVlYmg7CisJICByb290cCA9IChzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKikgcHJpLT5yb290X2RpcmVjdG9yeV9yZWNvcmQ7CisJICBzYmktPnNfbnpvbmVzID0gaXNvbnVtXzczMyAocHJpLT52b2x1bWVfc3BhY2Vfc2l6ZSk7CisJICBzYmktPnNfbG9nX3pvbmVfc2l6ZSA9IGlzb251bV83MjMgKHByaS0+bG9naWNhbF9ibG9ja19zaXplKTsKKwkgIHNiaS0+c19tYXhfc2l6ZSA9IGlzb251bV83MzMocHJpLT52b2x1bWVfc3BhY2Vfc2l6ZSk7CisJfQorCisJc2JpLT5zX25pbm9kZXMgPSAwOyAvKiBObyB3YXkgdG8gZmlndXJlIHRoaXMgb3V0IGVhc2lseSAqLworCisJb3JpZ196b25lc2l6ZSA9IHNiaS0+c19sb2dfem9uZV9zaXplOworCS8qCisJICogSWYgdGhlIHpvbmUgc2l6ZSBpcyBzbWFsbGVyIHRoYW4gdGhlIGhhcmR3YXJlIHNlY3RvciBzaXplLAorCSAqIHRoaXMgaXMgYSBmYXRhbCBlcnJvci4gIFRoaXMgd291bGQgb2NjdXIgaWYgdGhlIGRpc2MgZHJpdmUKKwkgKiBoYWQgc2VjdG9ycyB0aGF0IHdlcmUgMjA0OCBieXRlcywgYnV0IHRoZSBmaWxlc3lzdGVtIGhhZAorCSAqIGJsb2NrcyB0aGF0IHdlcmUgNTEyIGJ5dGVzICh3aGljaCBzaG91bGQgb25seSB2ZXJ5IHJhcmVseQorCSAqIGhhcHBlbi4pCisJICovCisJaWYob3JpZ196b25lc2l6ZSA8IG9wdC5ibG9ja3NpemUpCisJCWdvdG8gb3V0X2JhZF9zaXplOworCisJLyogUkRFOiBjb252ZXJ0IGxvZyB6b25lIHNpemUgdG8gYml0IHNoaWZ0ICovCisJc3dpdGNoIChzYmktPnNfbG9nX3pvbmVfc2l6ZSkKKwkgIHsgY2FzZSAgNTEyOiBzYmktPnNfbG9nX3pvbmVfc2l6ZSA9ICA5OyBicmVhazsKKwkgICAgY2FzZSAxMDI0OiBzYmktPnNfbG9nX3pvbmVfc2l6ZSA9IDEwOyBicmVhazsKKwkgICAgY2FzZSAyMDQ4OiBzYmktPnNfbG9nX3pvbmVfc2l6ZSA9IDExOyBicmVhazsKKworCSAgICBkZWZhdWx0OgorCQlnb3RvIG91dF9iYWRfem9uZV9zaXplOworCSAgfQorCisJcy0+c19tYWdpYyA9IElTT0ZTX1NVUEVSX01BR0lDOworCXMtPnNfbWF4Ynl0ZXMgPSAweGZmZmZmZmZmOyAvKiBXZSBjYW4gaGFuZGxlIGZpbGVzIHVwIHRvIDQgR0IgKi8KKworCS8qIFRoZSBDRFJPTSBpcyByZWFkLW9ubHksIGhhcyBubyBub2RlcyAoZGV2aWNlcykgb24gaXQsIGFuZCBzaW5jZQorCSAgIGFsbCBvZiB0aGUgZmlsZXMgYXBwZWFyIHRvIGJlIG93bmVkIGJ5IHJvb3QsIHdlIHJlYWxseSBkbyBub3Qgd2FudAorCSAgIHRvIGFsbG93IHN1aWQuICAoc3VpZCBvciBkZXZpY2VzIHdpbGwgbm90IHNob3cgdXAgdW5sZXNzIHdlIGhhdmUKKwkgICBSb2NrIFJpZGdlIGV4dGVuc2lvbnMpICovCisKKwlzLT5zX2ZsYWdzIHw9IE1TX1JET05MWSAvKiB8IE1TX05PREVWIHwgTVNfTk9TVUlEICovOworCisJLyogU2V0IHRoaXMgZm9yIHJlZmVyZW5jZS4gSXRzIG5vdCBjdXJyZW50bHkgdXNlZCBleGNlcHQgb24gd3JpdGUKKwkgICB3aGljaCB3ZSBkb24ndCBoYXZlIC4uICovCisJICAgCisJZmlyc3RfZGF0YV96b25lID0gaXNvbnVtXzczMyAocm9vdHAtPmV4dGVudCkgKworCQkJICBpc29udW1fNzExIChyb290cC0+ZXh0X2F0dHJfbGVuZ3RoKTsKKwlzYmktPnNfZmlyc3RkYXRhem9uZSA9IGZpcnN0X2RhdGFfem9uZTsKKyNpZm5kZWYgQkVRVUlFVAorCXByaW50ayhLRVJOX0RFQlVHICJNYXggc2l6ZTolbGQgICBMb2cgem9uZSBzaXplOiVsZFxuIiwKKwkgICAgICAgc2JpLT5zX21heF9zaXplLAorCSAgICAgICAxVUwgPDwgc2JpLT5zX2xvZ196b25lX3NpemUpOworCXByaW50ayhLRVJOX0RFQlVHICJGaXJzdCBkYXRhem9uZTolbGRcbiIsIHNiaS0+c19maXJzdGRhdGF6b25lKTsKKwlpZihzYmktPnNfaGlnaF9zaWVycmEpCisJCXByaW50ayhLRVJOX0RFQlVHICJEaXNjIGluIEhpZ2ggU2llcnJhIGZvcm1hdC5cbiIpOworI2VuZGlmCisKKwkvKgorCSAqIElmIHRoZSBKb2xpZXQgbGV2ZWwgaXMgc2V0LCB3ZSBfbWF5XyBkZWNpZGUgdG8gdXNlIHRoZQorCSAqIHNlY29uZGFyeSBkZXNjcmlwdG9yLCBidXQgY2FuJ3QgYmUgc3VyZSB1bnRpbCBhZnRlciB3ZQorCSAqIHJlYWQgdGhlIHJvb3QgaW5vZGUuIEJ1dCBiZWZvcmUgcmVhZGluZyB0aGUgcm9vdCBpbm9kZQorCSAqIHdlIG1heSBuZWVkIHRvIGNoYW5nZSB0aGUgZGV2aWNlIGJsb2Nrc2l6ZSwgYW5kIHdvdWxkCisJICogcmF0aGVyIHJlbGVhc2UgdGhlIG9sZCBidWZmZXIgZmlyc3QuIFNvLCB3ZSBjYWNoZSB0aGUKKwkgKiBmaXJzdF9kYXRhX3pvbmUgdmFsdWUgZnJvbSB0aGUgc2Vjb25kYXJ5IGRlc2NyaXB0b3IuCisJICovCisJaWYgKGpvbGlldF9sZXZlbCkgeworCQlwcmkgPSAoc3RydWN0IGlzb19wcmltYXJ5X2Rlc2NyaXB0b3IgKikgc2VjOworCQlyb290cCA9IChzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKikKKwkJCXByaS0+cm9vdF9kaXJlY3RvcnlfcmVjb3JkOworCQlmaXJzdF9kYXRhX3pvbmUgPSBpc29udW1fNzMzIChyb290cC0+ZXh0ZW50KSArCisJCQkgIAlpc29udW1fNzExIChyb290cC0+ZXh0X2F0dHJfbGVuZ3RoKTsKKwl9CisKKwkvKgorCSAqIFdlJ3JlIGFsbCBkb25lIHVzaW5nIHRoZSB2b2x1bWUgZGVzY3JpcHRvciwgYW5kIG1heSBuZWVkCisJICogdG8gY2hhbmdlIHRoZSBkZXZpY2UgYmxvY2tzaXplLCBzbyByZWxlYXNlIHRoZSBidWZmZXIgbm93LgorCSAqLworCWJyZWxzZShwcmlfYmgpOworCWJyZWxzZShiaCk7CisKKwkvKgorCSAqIEZvcmNlIHRoZSBibG9ja3NpemUgdG8gNTEyIGZvciA1MTIgYnl0ZSBzZWN0b3JzLiAgVGhlIGZpbGUKKwkgKiByZWFkIHByaW1pdGl2ZXMgcmVhbGx5IGdldCBpdCB3cm9uZyBpbiBhIGJhZCB3YXkgaWYgd2UgZG9uJ3QKKwkgKiBkbyB0aGlzLgorCSAqCisJICogTm90ZSAtIHdlIHNob3VsZCBuZXZlciBiZSBzZXR0aW5nIHRoZSBibG9ja3NpemUgdG8gc29tZXRoaW5nCisJICogbGVzcyB0aGFuIHRoZSBoYXJkd2FyZSBzZWN0b3Igc2l6ZSBmb3IgdGhlIGRldmljZS4gIElmIHdlCisJICogZG8sIHdlIHdvdWxkIGVuZCB1cCBoYXZpbmcgdG8gcmVhZCBsYXJnZXIgYnVmZmVycyBhbmQgc3BsaXQKKwkgKiBvdXQgcG9ydGlvbnMgdG8gc2F0aXNmeSByZXF1ZXN0cy4KKwkgKgorCSAqIE5vdGUyLSB0aGUgaWRlYSBoZXJlIGlzIHRoYXQgd2Ugd2FudCB0byBkZWFsIHdpdGggdGhlIG9wdGltYWwKKwkgKiB6b25lc2l6ZSBpbiB0aGUgZmlsZXN5c3RlbS4gIElmIHdlIGhhdmUgaXQgc2V0IHRvIHNvbWV0aGluZyBsZXNzLAorCSAqIHRoZW4gd2UgaGF2ZSBob3JyaWJsZSBwcm9ibGVtcyB3aXRoIHRyeWluZyB0byBwaWVjZSB0b2dldGhlcgorCSAqIGJpdHMgb2YgYWRqYWNlbnQgYmxvY2tzIGluIG9yZGVyIHRvIHByb3Blcmx5IHJlYWQgZGlyZWN0b3J5CisJICogZW50cmllcy4gIEJ5IGZvcmNpbmcgdGhlIGJsb2Nrc2l6ZSBpbiB0aGlzIHdheSwgd2UgZW5zdXJlCisJICogdGhhdCB3ZSB3aWxsIG5ldmVyIGJlIHJlcXVpcmVkIHRvIGRvIHRoaXMuCisJICovCisJc2Jfc2V0X2Jsb2Nrc2l6ZShzLCBvcmlnX3pvbmVzaXplKTsKKworCXNiaS0+c19ubHNfaW9jaGFyc2V0ID0gTlVMTDsKKworI2lmZGVmIENPTkZJR19KT0xJRVQKKwlpZiAoam9saWV0X2xldmVsICYmIG9wdC51dGY4ID09IDApIHsKKwkJY2hhciAqIHAgPSBvcHQuaW9jaGFyc2V0ID8gb3B0LmlvY2hhcnNldCA6IENPTkZJR19OTFNfREVGQVVMVDsKKwkJc2JpLT5zX25sc19pb2NoYXJzZXQgPSBsb2FkX25scyhwKTsKKwkJaWYgKCEgc2JpLT5zX25sc19pb2NoYXJzZXQpIHsKKwkJCS8qIEZhaWwgb25seSBpZiBleHBsaWNpdCBjaGFyc2V0IHNwZWNpZmllZCAqLworCQkJaWYgKG9wdC5pb2NoYXJzZXQpCisJCQkJZ290byBvdXRfZnJlZXNiaTsKKwkJCXNiaS0+c19ubHNfaW9jaGFyc2V0ID0gbG9hZF9ubHNfZGVmYXVsdCgpOworCQl9CisJfQorI2VuZGlmCisJcy0+c19vcCA9ICZpc29mc19zb3BzOworCXMtPnNfZXhwb3J0X29wID0gJmlzb2ZzX2V4cG9ydF9vcHM7CisJc2JpLT5zX21hcHBpbmcgPSBvcHQubWFwOworCXNiaS0+c19yb2NrID0gKG9wdC5yb2NrID09ICd5JyA/IDIgOiAwKTsKKwlzYmktPnNfcm9ja19vZmZzZXQgPSAtMTsgLyogaW5pdGlhbCBvZmZzZXQsIHdpbGwgZ3Vlc3MgdW50aWwgU1AgaXMgZm91bmQqLworCXNiaS0+c19jcnVmdCA9IG9wdC5jcnVmdDsKKwlzYmktPnNfdW5oaWRlID0gb3B0LnVuaGlkZTsKKwlzYmktPnNfdWlkID0gb3B0LnVpZDsKKwlzYmktPnNfZ2lkID0gb3B0LmdpZDsKKwlzYmktPnNfdXRmOCA9IG9wdC51dGY4OworCXNiaS0+c19ub2NvbXByZXNzID0gb3B0Lm5vY29tcHJlc3M7CisJLyoKKwkgKiBJdCB3b3VsZCBiZSBpbmNyZWRpYmx5IHN0dXBpZCB0byBhbGxvdyBwZW9wbGUgdG8gbWFyayBldmVyeSBmaWxlCisJICogb24gdGhlIGRpc2sgYXMgc3VpZCwgc28gd2UgbWVyZWx5IGFsbG93IHRoZW0gdG8gc2V0IHRoZSBkZWZhdWx0CisJICogcGVybWlzc2lvbnMuCisJICovCisJc2JpLT5zX21vZGUgPSBvcHQubW9kZSAmIDA3Nzc7CisKKwkvKgorCSAqIFJlYWQgdGhlIHJvb3QgaW5vZGUsIHdoaWNoIF9tYXlfIHJlc3VsdCBpbiBjaGFuZ2luZworCSAqIHRoZSBzX3JvY2sgZmxhZy4gT25jZSB3ZSBoYXZlIHRoZSBmaW5hbCBzX3JvY2sgdmFsdWUsCisJICogd2UgdGhlbiBkZWNpZGUgd2hldGhlciB0byB1c2UgdGhlIEpvbGlldCBkZXNjcmlwdG9yLgorCSAqLworCWlub2RlID0gaXNvZnNfaWdldChzLCBzYmktPnNfZmlyc3RkYXRhem9uZSwgMCk7CisKKwkvKgorCSAqIElmIHRoaXMgZGlzayBoYXMgYm90aCBSb2NrIFJpZGdlIGFuZCBKb2xpZXQgb24gaXQsIHRoZW4gd2UKKwkgKiB3YW50IHRvIHVzZSBSb2NrIFJpZGdlIGJ5IGRlZmF1bHQuICBUaGlzIGNhbiBiZSBvdmVycmlkZGVuCisJICogYnkgdXNpbmcgdGhlIG5vcm9jayBtb3VudCBvcHRpb24uICBUaGVyZSBpcyBzdGlsbCBvbmUgb3RoZXIKKwkgKiBwb3NzaWJpbGl0eSB0aGF0IGlzIG5vdCB0YWtlbiBpbnRvIGFjY291bnQ6IGEgUm9jayBSaWRnZQorCSAqIENEIHdpdGggVW5pY29kZSBuYW1lcy4gIFVudGlsIHNvbWVvbmUgc2VlcyBzdWNoIGEgYmVhc3QsIGl0CisJICogd2lsbCBub3QgYmUgc3VwcG9ydGVkLgorCSAqLworCWlmIChzYmktPnNfcm9jayA9PSAxKSB7CisJCWpvbGlldF9sZXZlbCA9IDA7CisJfSBlbHNlIGlmIChqb2xpZXRfbGV2ZWwpIHsKKwkJc2JpLT5zX3JvY2sgPSAwOworCQlpZiAoc2JpLT5zX2ZpcnN0ZGF0YXpvbmUgIT0gZmlyc3RfZGF0YV96b25lKSB7CisJCQlzYmktPnNfZmlyc3RkYXRhem9uZSA9IGZpcnN0X2RhdGFfem9uZTsKKwkJCXByaW50ayhLRVJOX0RFQlVHIAorCQkJCSJJU09GUzogY2hhbmdpbmcgdG8gc2Vjb25kYXJ5IHJvb3RcbiIpOworCQkJaXB1dChpbm9kZSk7CisJCQlpbm9kZSA9IGlzb2ZzX2lnZXQocywgc2JpLT5zX2ZpcnN0ZGF0YXpvbmUsIDApOworCQl9CisJfQorCisJaWYgKG9wdC5jaGVjayA9PSAndScpIHsKKwkJLyogT25seSBKb2xpZXQgaXMgY2FzZSBpbnNlbnNpdGl2ZSBieSBkZWZhdWx0ICovCisJCWlmIChqb2xpZXRfbGV2ZWwpIG9wdC5jaGVjayA9ICdyJzsKKwkJZWxzZSBvcHQuY2hlY2sgPSAncyc7CisJfQorCXNiaS0+c19qb2xpZXRfbGV2ZWwgPSBqb2xpZXRfbGV2ZWw7CisKKwkvKiBjaGVjayB0aGUgcm9vdCBpbm9kZSAqLworCWlmICghaW5vZGUpCisJCWdvdG8gb3V0X25vX3Jvb3Q7CisJaWYgKCFpbm9kZS0+aV9vcCkKKwkJZ290byBvdXRfYmFkX3Jvb3Q7CisJLyogZ2V0IHRoZSByb290IGRlbnRyeSAqLworCXMtPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChpbm9kZSk7CisJaWYgKCEocy0+c19yb290KSkKKwkJZ290byBvdXRfbm9fcm9vdDsKKworCXRhYmxlID0gMDsKKwlpZiAoam9saWV0X2xldmVsKSB0YWJsZSArPSAyOworCWlmIChvcHQuY2hlY2sgPT0gJ3InKSB0YWJsZSsrOworCXMtPnNfcm9vdC0+ZF9vcCA9ICZpc29mc19kZW50cnlfb3BzW3RhYmxlXTsKKworCWlmIChvcHQuaW9jaGFyc2V0KQorCQlrZnJlZShvcHQuaW9jaGFyc2V0KTsKKworCXJldHVybiAwOworCisJLyoKKwkgKiBEaXNwbGF5IGVycm9yIG1lc3NhZ2VzIGFuZCBmcmVlIHJlc291cmNlcy4KKwkgKi8KK291dF9iYWRfcm9vdDoKKwlwcmludGsoS0VSTl9XQVJOSU5HICJpc29mc19maWxsX3N1cGVyOiByb290IGlub2RlIG5vdCBpbml0aWFsaXplZFxuIik7CisJZ290byBvdXRfaXB1dDsKK291dF9ub19yb290OgorCXByaW50ayhLRVJOX1dBUk5JTkcgImlzb2ZzX2ZpbGxfc3VwZXI6IGdldCByb290IGlub2RlIGZhaWxlZFxuIik7CitvdXRfaXB1dDoKKwlpcHV0KGlub2RlKTsKKyNpZmRlZiBDT05GSUdfSk9MSUVUCisJaWYgKHNiaS0+c19ubHNfaW9jaGFyc2V0KQorCQl1bmxvYWRfbmxzKHNiaS0+c19ubHNfaW9jaGFyc2V0KTsKKyNlbmRpZgorCWdvdG8gb3V0X2ZyZWVzYmk7CitvdXRfbm9fcmVhZDoKKwlwcmludGsoS0VSTl9XQVJOSU5HICJpc29mc19maWxsX3N1cGVyOiAiCisJCSJicmVhZCBmYWlsZWQsIGRldj0lcywgaXNvX2Jsa251bT0lZCwgYmxvY2s9JWRcbiIsCisJCXMtPnNfaWQsIGlzb19ibGtudW0sIGJsb2NrKTsKKwlnb3RvIG91dF9mcmVlc2JpOworb3V0X2JhZF96b25lX3NpemU6CisJcHJpbnRrKEtFUk5fV0FSTklORyAiQmFkIGxvZ2ljYWwgem9uZSBzaXplICVsZFxuIiwKKwkJc2JpLT5zX2xvZ196b25lX3NpemUpOworCWdvdG8gb3V0X2ZyZWViaDsKK291dF9iYWRfc2l6ZToKKwlwcmludGsoS0VSTl9XQVJOSU5HICJMb2dpY2FsIHpvbmUgc2l6ZSglZCkgPCBoYXJkd2FyZSBibG9ja3NpemUoJXUpXG4iLAorCQlvcmlnX3pvbmVzaXplLCBvcHQuYmxvY2tzaXplKTsKKwlnb3RvIG91dF9mcmVlYmg7CitvdXRfdW5rbm93bl9mb3JtYXQ6CisJaWYgKCFzaWxlbnQpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVuYWJsZSB0byBpZGVudGlmeSBDRC1ST00gZm9ybWF0LlxuIik7CisKK291dF9mcmVlYmg6CisJYnJlbHNlKGJoKTsKK291dF9mcmVlc2JpOgorCWlmIChvcHQuaW9jaGFyc2V0KQorCQlrZnJlZShvcHQuaW9jaGFyc2V0KTsKKwlrZnJlZShzYmkpOworCXMtPnNfZnNfaW5mbyA9IE5VTEw7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgaXNvZnNfc3RhdGZzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQoreworCWJ1Zi0+Zl90eXBlID0gSVNPRlNfU1VQRVJfTUFHSUM7CisJYnVmLT5mX2JzaXplID0gc2ItPnNfYmxvY2tzaXplOworCWJ1Zi0+Zl9ibG9ja3MgPSAoSVNPRlNfU0Ioc2IpLT5zX256b25lcworICAgICAgICAgICAgICAgICAgPDwgKElTT0ZTX1NCKHNiKS0+c19sb2dfem9uZV9zaXplIC0gc2ItPnNfYmxvY2tzaXplX2JpdHMpKTsKKwlidWYtPmZfYmZyZWUgPSAwOworCWJ1Zi0+Zl9iYXZhaWwgPSAwOworCWJ1Zi0+Zl9maWxlcyA9IElTT0ZTX1NCKHNiKS0+c19uaW5vZGVzOworCWJ1Zi0+Zl9mZnJlZSA9IDA7CisJYnVmLT5mX25hbWVsZW4gPSBOQU1FX01BWDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEdldCBhIHNldCBvZiBibG9ja3M7IGZpbGxpbmcgaW4gYnVmZmVyX2hlYWRzIGlmIGFscmVhZHkgYWxsb2NhdGVkCisgKiBvciBnZXRibGsoKSBpZiB0aGV5IGFyZSBub3QuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYmxvY2tzIGluc2VydGVkCisgKiAoMCA9PSBlcnJvci4pCisgKi8KK2ludCBpc29mc19nZXRfYmxvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGlibG9ja19zLAorCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJoLCB1bnNpZ25lZCBsb25nIG5ibG9ja3MpCit7CisJdW5zaWduZWQgbG9uZyBiX29mZjsKKwl1bnNpZ25lZCBvZmZzZXQsIHNlY3Rfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgZmlyc3RleHQ7CisJdW5zaWduZWQgbG9uZyBuZXh0YmxrLCBuZXh0b2ZmOworCWxvbmcgaWJsb2NrID0gKGxvbmcpaWJsb2NrX3M7CisJaW50IHNlY3Rpb24sIHJ2OworCXN0cnVjdCBpc29faW5vZGVfaW5mbyAqZWkgPSBJU09GU19JKGlub2RlKTsKKworCWxvY2tfa2VybmVsKCk7CisKKwlydiA9IDA7CisJaWYgKGlibG9jayA8IDAgfHwgaWJsb2NrICE9IGlibG9ja19zKSB7CisJCXByaW50aygiaXNvZnNfZ2V0X2Jsb2NrczogYmxvY2sgbnVtYmVyIHRvbyBsYXJnZVxuIik7CisJCWdvdG8gYWJvcnQ7CisJfQorCisJYl9vZmYgPSBpYmxvY2s7CisJCisJb2Zmc2V0ICAgID0gMDsKKwlmaXJzdGV4dCAgPSBlaS0+aV9maXJzdF9leHRlbnQ7CisJc2VjdF9zaXplID0gZWktPmlfc2VjdGlvbl9zaXplID4+IElTT0ZTX0JVRkZFUl9CSVRTKGlub2RlKTsKKwluZXh0YmxrICAgPSBlaS0+aV9uZXh0X3NlY3Rpb25fYmxvY2s7CisJbmV4dG9mZiAgID0gZWktPmlfbmV4dF9zZWN0aW9uX29mZnNldDsKKwlzZWN0aW9uICAgPSAwOworCisJd2hpbGUgKCBuYmxvY2tzICkgeworCQkvKiBJZiB3ZSBhcmUgKndheSogYmV5b25kIHRoZSBlbmQgb2YgdGhlIGZpbGUsIHByaW50IGEgbWVzc2FnZS4KKwkJICogQWNjZXNzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBmaWxlIHVwIHRvIHRoZSBuZXh0IHBhZ2UgYm91bmRhcnkKKwkJICogaXMgbm9ybWFsLCBob3dldmVyIGJlY2F1c2Ugb2YgdGhlIHdheSB0aGUgcGFnZSBjYWNoZSB3b3Jrcy4KKwkJICogSW4gdGhpcyBjYXNlLCB3ZSBqdXN0IHJldHVybiAwIHNvIHRoYXQgd2UgY2FuIHByb3Blcmx5IGZpbGwKKwkJICogdGhlIHBhZ2Ugd2l0aCB1c2VsZXNzIGluZm9ybWF0aW9uIHdpdGhvdXQgZ2VuZXJhdGluZyBhbnkKKwkJICogSS9PIGVycm9ycy4KKwkJICovCisJCWlmIChiX29mZiA+ICgoaW5vZGUtPmlfc2l6ZSArIFBBR0VfQ0FDSEVfU0laRSAtIDEpID4+IElTT0ZTX0JVRkZFUl9CSVRTKGlub2RlKSkpIHsKKwkJCXByaW50aygiaXNvZnNfZ2V0X2Jsb2NrczogYmxvY2sgPj0gRU9GICglbGQsICVsZClcbiIsCisJCQkgICAgICAgaWJsb2NrLCAodW5zaWduZWQgbG9uZykgaW5vZGUtPmlfc2l6ZSk7CisJCQlnb3RvIGFib3J0OworCQl9CisJCQorCQlpZiAobmV4dGJsaykgeworCQkJd2hpbGUgKGJfb2ZmID49IChvZmZzZXQgKyBzZWN0X3NpemUpKSB7CisJCQkJc3RydWN0IGlub2RlICpuaW5vZGU7CisJCQkJCisJCQkJb2Zmc2V0ICs9IHNlY3Rfc2l6ZTsKKwkJCQlpZiAobmV4dGJsayA9PSAwKQorCQkJCQlnb3RvIGFib3J0OworCQkJCW5pbm9kZSA9IGlzb2ZzX2lnZXQoaW5vZGUtPmlfc2IsIG5leHRibGssIG5leHRvZmYpOworCQkJCWlmICghbmlub2RlKQorCQkJCQlnb3RvIGFib3J0OworCQkJCWZpcnN0ZXh0ICA9IElTT0ZTX0kobmlub2RlKS0+aV9maXJzdF9leHRlbnQ7CisJCQkJc2VjdF9zaXplID0gSVNPRlNfSShuaW5vZGUpLT5pX3NlY3Rpb25fc2l6ZSA+PiBJU09GU19CVUZGRVJfQklUUyhuaW5vZGUpOworCQkJCW5leHRibGsgICA9IElTT0ZTX0kobmlub2RlKS0+aV9uZXh0X3NlY3Rpb25fYmxvY2s7CisJCQkJbmV4dG9mZiAgID0gSVNPRlNfSShuaW5vZGUpLT5pX25leHRfc2VjdGlvbl9vZmZzZXQ7CisJCQkJaXB1dChuaW5vZGUpOworCQkJCQorCQkJCWlmICgrK3NlY3Rpb24gPiAxMDApIHsKKwkJCQkJcHJpbnRrKCJpc29mc19nZXRfYmxvY2tzOiBNb3JlIHRoYW4gMTAwIGZpbGUgc2VjdGlvbnMgPyE/LCBhYm9ydGluZy4uLlxuIik7CisJCQkJCXByaW50aygiaXNvZnNfZ2V0X2Jsb2NrczogYmxvY2s9JWxkIGZpcnN0ZXh0PSV1IHNlY3Rfc2l6ZT0ldSAiCisJCQkJCSAgICAgICAibmV4dGJsaz0lbHUgbmV4dG9mZj0lbHVcbiIsCisJCQkJCSAgICAgICBpYmxvY2ssIGZpcnN0ZXh0LCAodW5zaWduZWQpIHNlY3Rfc2l6ZSwKKwkJCQkJICAgICAgIG5leHRibGssIG5leHRvZmYpOworCQkJCQlnb3RvIGFib3J0OworCQkJCX0KKwkJCX0KKwkJfQorCQkKKwkJaWYgKCAqYmggKSB7CisJCQltYXBfYmgoKmJoLCBpbm9kZS0+aV9zYiwgZmlyc3RleHQgKyBiX29mZiAtIG9mZnNldCk7CisJCX0gZWxzZSB7CisJCQkqYmggPSBzYl9nZXRibGsoaW5vZGUtPmlfc2IsIGZpcnN0ZXh0K2Jfb2ZmLW9mZnNldCk7CisJCQlpZiAoICEqYmggKQorCQkJCWdvdG8gYWJvcnQ7CisJCX0KKwkJYmgrKzsJLyogTmV4dCBidWZmZXIgaGVhZCAqLworCQliX29mZisrOwkvKiBOZXh0IGJ1ZmZlciBvZmZzZXQgKi8KKwkJbmJsb2Nrcy0tOworCQlydisrOworCX0KKworCithYm9ydDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJ2OworfQorCisvKgorICogVXNlZCBieSB0aGUgc3RhbmRhcmQgaW50ZXJmYWNlcy4KKyAqLworc3RhdGljIGludCBpc29mc19nZXRfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgaWJsb2NrLAorCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpCit7CisJaWYgKCBjcmVhdGUgKSB7CisJCXByaW50aygiaXNvZnNfZ2V0X2Jsb2NrOiBLZXJuZWwgdHJpZXMgdG8gYWxsb2NhdGUgYSBibG9ja1xuIik7CisJCXJldHVybiAtRVJPRlM7CisJfQorCisJcmV0dXJuIGlzb2ZzX2dldF9ibG9ja3MoaW5vZGUsIGlibG9jaywgJmJoX3Jlc3VsdCwgMSkgPyAwIDogLUVJTzsKK30KKworc3RhdGljIGludCBpc29mc19ibWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGJsb2NrKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCBkdW1teTsKKwlpbnQgZXJyb3I7CisKKwlkdW1teS5iX3N0YXRlID0gMDsKKwlkdW1teS5iX2Jsb2NrbnIgPSAtMTAwMDsKKwllcnJvciA9IGlzb2ZzX2dldF9ibG9jayhpbm9kZSwgYmxvY2ssICZkdW1teSwgMCk7CisJaWYgKCFlcnJvcikKKwkJcmV0dXJuIGR1bW15LmJfYmxvY2tucjsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGJ1ZmZlcl9oZWFkICppc29mc19icmVhZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBibG9jaykKK3sKKwlzZWN0b3JfdCBibGtuciA9IGlzb2ZzX2JtYXAoaW5vZGUsIGJsb2NrKTsKKwlpZiAoIWJsa25yKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIGJsa25yKTsKK30KKworc3RhdGljIGludCBpc29mc19yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJuIGJsb2NrX3JlYWRfZnVsbF9wYWdlKHBhZ2UsaXNvZnNfZ2V0X2Jsb2NrKTsKK30KKworc3RhdGljIHNlY3Rvcl90IF9pc29mc19ibWFwKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzZWN0b3JfdCBibG9jaykKK3sKKwlyZXR1cm4gZ2VuZXJpY19ibG9ja19ibWFwKG1hcHBpbmcsYmxvY2ssaXNvZnNfZ2V0X2Jsb2NrKTsKK30KKworc3RhdGljIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgaXNvZnNfYW9wcyA9IHsKKwkucmVhZHBhZ2UgPSBpc29mc19yZWFkcGFnZSwKKwkuc3luY19wYWdlID0gYmxvY2tfc3luY19wYWdlLAorCS5ibWFwID0gX2lzb2ZzX2JtYXAKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0ZXN0X2FuZF9zZXRfdWlkKHVpZF90ICpwLCB1aWRfdCB2YWx1ZSkKK3sKKwlpZih2YWx1ZSkgeworCQkqcCA9IHZhbHVlOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHRlc3RfYW5kX3NldF9naWQoZ2lkX3QgKnAsIGdpZF90IHZhbHVlKQoreworICAgICAgICBpZih2YWx1ZSkgeworICAgICAgICAgICAgICAgICpwID0gdmFsdWU7CisgICAgICAgIH0KK30KKworc3RhdGljIGludCBpc29mc19yZWFkX2xldmVsM19zaXplKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCXVuc2lnbmVkIGxvbmcgYnVmc2l6ZSA9IElTT0ZTX0JVRkZFUl9TSVpFKGlub2RlKTsKKwlpbnQgaGlnaF9zaWVycmEgPSBJU09GU19TQihpbm9kZS0+aV9zYiktPnNfaGlnaF9zaWVycmE7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmggPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgYmxvY2ssIG9mZnNldCwgYmxvY2tfc2F2ZWQsIG9mZnNldF9zYXZlZDsKKwlpbnQgaSA9IDA7CisJaW50IG1vcmVfZW50cmllcyA9IDA7CisJc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICogdG1wZGUgPSBOVUxMOworCXN0cnVjdCBpc29faW5vZGVfaW5mbyAqZWkgPSBJU09GU19JKGlub2RlKTsKKworCWlub2RlLT5pX3NpemUgPSAwOworCisJLyogVGhlIGZpcnN0IDE2IGJsb2NrcyBhcmUgcmVzZXJ2ZWQgYXMgdGhlIFN5c3RlbSBBcmVhLiAgVGh1cywKKwkgKiBubyBpbm9kZXMgY2FuIGFwcGVhciBpbiBibG9jayAwLiAgV2UgdXNlIHRoaXMgdG8gZmxhZyB0aGF0CisJICogdGhpcyBpcyB0aGUgbGFzdCBzZWN0aW9uLiAqLworCWVpLT5pX25leHRfc2VjdGlvbl9ibG9jayA9IDA7CisJZWktPmlfbmV4dF9zZWN0aW9uX29mZnNldCA9IDA7CisKKwlibG9jayA9IGVpLT5pX2lnZXQ1X2Jsb2NrOworCW9mZnNldCA9IGVpLT5pX2lnZXQ1X29mZnNldDsKKworCWRvIHsKKwkJc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICogZGU7CisJCXVuc2lnbmVkIGludCBkZV9sZW47CisKKwkJaWYgKCFiaCkgeworCQkJYmggPSBzYl9icmVhZChpbm9kZS0+aV9zYiwgYmxvY2spOworCQkJaWYgKCFiaCkKKwkJCQlnb3RvIG91dF9ub3JlYWQ7CisJCX0KKwkJZGUgPSAoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICopIChiaC0+Yl9kYXRhICsgb2Zmc2V0KTsKKwkJZGVfbGVuID0gKih1bnNpZ25lZCBjaGFyICopIGRlOworCisJCWlmIChkZV9sZW4gPT0gMCkgeworCQkJYnJlbHNlKGJoKTsKKwkJCWJoID0gTlVMTDsKKwkJCSsrYmxvY2s7CisJCQlvZmZzZXQgPSAwOworCQkJY29udGludWU7CisJCX0KKworCQlibG9ja19zYXZlZCA9IGJsb2NrOworCQlvZmZzZXRfc2F2ZWQgPSBvZmZzZXQ7CisJCW9mZnNldCArPSBkZV9sZW47CisKKwkJLyogTWFrZSBzdXJlIHdlIGhhdmUgYSBmdWxsIGRpcmVjdG9yeSBlbnRyeSAqLworCQlpZiAob2Zmc2V0ID49IGJ1ZnNpemUpIHsKKwkJCWludCBzbG9wID0gYnVmc2l6ZSAtIG9mZnNldCArIGRlX2xlbjsKKwkJCWlmICghdG1wZGUpIHsKKwkJCQl0bXBkZSA9IGttYWxsb2MoMjU2LCBHRlBfS0VSTkVMKTsKKwkJCQlpZiAoIXRtcGRlKQorCQkJCQlnb3RvIG91dF9ub21lbTsKKwkJCX0KKwkJCW1lbWNweSh0bXBkZSwgZGUsIHNsb3ApOworCQkJb2Zmc2V0ICY9IGJ1ZnNpemUgLSAxOworCQkJYmxvY2srKzsKKwkJCWJyZWxzZShiaCk7CisJCQliaCA9IE5VTEw7CisJCQlpZiAob2Zmc2V0KSB7CisJCQkJYmggPSBzYl9icmVhZChpbm9kZS0+aV9zYiwgYmxvY2spOworCQkJCWlmICghYmgpCisJCQkJCWdvdG8gb3V0X25vcmVhZDsKKwkJCQltZW1jcHkoKHZvaWQgKikgdG1wZGUgKyBzbG9wLCBiaC0+Yl9kYXRhLCBvZmZzZXQpOworCQkJfQorCQkJZGUgPSB0bXBkZTsKKwkJfQorCisJCWlub2RlLT5pX3NpemUgKz0gaXNvbnVtXzczMyhkZS0+c2l6ZSk7CisJCWlmIChpID09IDEpIHsKKwkJCWVpLT5pX25leHRfc2VjdGlvbl9ibG9jayA9IGJsb2NrX3NhdmVkOworCQkJZWktPmlfbmV4dF9zZWN0aW9uX29mZnNldCA9IG9mZnNldF9zYXZlZDsKKwkJfQorCisJCW1vcmVfZW50cmllcyA9IGRlLT5mbGFnc1staGlnaF9zaWVycmFdICYgMHg4MDsKKworCQlpKys7CisJCWlmKGkgPiAxMDApCisJCQlnb3RvIG91dF90b29tYW55OworCX0gd2hpbGUobW9yZV9lbnRyaWVzKTsKK291dDoKKwlpZiAodG1wZGUpCisJCWtmcmVlKHRtcGRlKTsKKwlpZiAoYmgpCisJCWJyZWxzZShiaCk7CisJcmV0dXJuIDA7CisKK291dF9ub21lbToKKwlpZiAoYmgpCisJCWJyZWxzZShiaCk7CisJcmV0dXJuIC1FTk9NRU07CisKK291dF9ub3JlYWQ6CisJcHJpbnRrKEtFUk5fSU5GTyAiSVNPRlM6IHVuYWJsZSB0byByZWFkIGktbm9kZSBibG9jayAlbHVcbiIsIGJsb2NrKTsKKwlpZiAodG1wZGUpCisJCWtmcmVlKHRtcGRlKTsKKwlyZXR1cm4gLUVJTzsKKworb3V0X3Rvb21hbnk6CisJcHJpbnRrKEtFUk5fSU5GTyAiaXNvZnNfcmVhZF9sZXZlbDNfc2l6ZTogIgorCQkiTW9yZSB0aGFuIDEwMCBmaWxlIHNlY3Rpb25zID8hPywgYWJvcnRpbmcuLi5cbiIKKwkgIAkiaXNvZnNfcmVhZF9sZXZlbDNfc2l6ZTogaW5vZGU9JWx1XG4iLAorCQlpbm9kZS0+aV9pbm8pOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgdm9pZCBpc29mc19yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgaXNvZnNfc2JfaW5mbyAqc2JpID0gSVNPRlNfU0Ioc2IpOworCXVuc2lnbmVkIGxvbmcgYnVmc2l6ZSA9IElTT0ZTX0JVRkZFUl9TSVpFKGlub2RlKTsKKwl1bnNpZ25lZCBsb25nIGJsb2NrOworCWludCBoaWdoX3NpZXJyYSA9IHNiaS0+c19oaWdoX3NpZXJyYTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCA9IE5VTEw7CisJc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICogZGU7CisJc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICogdG1wZGUgPSBOVUxMOworCXVuc2lnbmVkIGludCBkZV9sZW47CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJc3RydWN0IGlzb19pbm9kZV9pbmZvICplaSA9IElTT0ZTX0koaW5vZGUpOworCisJYmxvY2sgPSBlaS0+aV9pZ2V0NV9ibG9jazsKKwliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCBibG9jayk7CisJaWYgKCFiaCkKKwkJZ290byBvdXRfYmFkcmVhZDsKKworCW9mZnNldCA9IGVpLT5pX2lnZXQ1X29mZnNldDsKKworCWRlID0gKHN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqKSAoYmgtPmJfZGF0YSArIG9mZnNldCk7CisJZGVfbGVuID0gKih1bnNpZ25lZCBjaGFyICopIGRlOworCisJaWYgKG9mZnNldCArIGRlX2xlbiA+IGJ1ZnNpemUpIHsKKwkJaW50IGZyYWcxID0gYnVmc2l6ZSAtIG9mZnNldDsKKworCQl0bXBkZSA9IGttYWxsb2MoZGVfbGVuLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHRtcGRlID09IE5VTEwpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImlzb2ZzX3JlYWRfaW5vZGU6IG91dCBvZiBtZW1vcnlcbiIpOworCQkJZ290byBmYWlsOworCQl9CisJCW1lbWNweSh0bXBkZSwgYmgtPmJfZGF0YSArIG9mZnNldCwgZnJhZzEpOworCQlicmVsc2UoYmgpOworCQliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCArK2Jsb2NrKTsKKwkJaWYgKCFiaCkKKwkJCWdvdG8gb3V0X2JhZHJlYWQ7CisJCW1lbWNweSgoY2hhciAqKXRtcGRlK2ZyYWcxLCBiaC0+Yl9kYXRhLCBkZV9sZW4gLSBmcmFnMSk7CisJCWRlID0gdG1wZGU7CisJfQorCisJaW5vZGUtPmlfaW5vID0gaXNvZnNfZ2V0X2lubyhlaS0+aV9pZ2V0NV9ibG9jaywKKwkJCQkgICAgIGVpLT5pX2lnZXQ1X29mZnNldCwKKwkJCQkgICAgIElTT0ZTX0JVRkZFUl9CSVRTKGlub2RlKSk7CisKKwkvKiBBc3N1bWUgaXQgaXMgYSBub3JtYWwtZm9ybWF0IGZpbGUgdW5sZXNzIHRvbGQgb3RoZXJ3aXNlICovCisJZWktPmlfZmlsZV9mb3JtYXQgPSBpc29mc19maWxlX25vcm1hbDsKKworCWlmIChkZS0+ZmxhZ3NbLWhpZ2hfc2llcnJhXSAmIDIpIHsKKwkJaW5vZGUtPmlfbW9kZSA9IFNfSVJVR08gfCBTX0lYVUdPIHwgU19JRkRJUjsKKwkJaW5vZGUtPmlfbmxpbmsgPSAxOyAvKiBTZXQgdG8gMS4gIFdlIGtub3cgdGhlcmUgYXJlIDIsIGJ1dAorCQkJCSAgICAgICB0aGUgZmluZCB1dGlsaXR5IHRyaWVzIHRvIG9wdGltaXplCisJCQkJICAgICAgIGlmIGl0IGlzIDIsIGFuZCBpdCBzY3Jld3MgdXAuICBJdCBpcworCQkJCSAgICAgICBlYXNpZXIgdG8gZ2l2ZSAxIHdoaWNoIHRlbGxzIGZpbmQgdG8KKwkJCQkgICAgICAgZG8gaXQgdGhlIGhhcmQgd2F5LiAqLworCX0gZWxzZSB7CisgCQkvKiBFdmVyeWJvZHkgZ2V0cyB0byByZWFkIHRoZSBmaWxlLiAqLworCQlpbm9kZS0+aV9tb2RlID0gc2JpLT5zX21vZGU7CisJCWlub2RlLT5pX25saW5rID0gMTsKKwkgICAgICAgIGlub2RlLT5pX21vZGUgfD0gU19JRlJFRzsKKwl9CisJaW5vZGUtPmlfdWlkID0gc2JpLT5zX3VpZDsKKwlpbm9kZS0+aV9naWQgPSBzYmktPnNfZ2lkOworCWlub2RlLT5pX2Jsb2NrcyA9IGlub2RlLT5pX2Jsa3NpemUgPSAwOworCisJZWktPmlfZm9ybWF0X3Bhcm1bMF0gPSAwOworCWVpLT5pX2Zvcm1hdF9wYXJtWzFdID0gMDsKKwllaS0+aV9mb3JtYXRfcGFybVsyXSA9IDA7CisKKwllaS0+aV9zZWN0aW9uX3NpemUgPSBpc29udW1fNzMzIChkZS0+c2l6ZSk7CisJaWYoZGUtPmZsYWdzWy1oaWdoX3NpZXJyYV0gJiAweDgwKSB7CisJCWlmKGlzb2ZzX3JlYWRfbGV2ZWwzX3NpemUoaW5vZGUpKSBnb3RvIGZhaWw7CisJfSBlbHNlIHsKKwkJZWktPmlfbmV4dF9zZWN0aW9uX2Jsb2NrID0gMDsKKwkJZWktPmlfbmV4dF9zZWN0aW9uX29mZnNldCA9IDA7CisJCWlub2RlLT5pX3NpemUgPSBpc29udW1fNzMzIChkZS0+c2l6ZSk7CisJfQorCisJLyoKKwkgKiBTb21lIGRpcHNoaXQgZGVjaWRlZCB0byBzdG9yZSBzb21lIG90aGVyIGJpdCBvZiBpbmZvcm1hdGlvbgorCSAqIGluIHRoZSBoaWdoIGJ5dGUgb2YgdGhlIGZpbGUgbGVuZ3RoLiAgVHJ1bmNhdGUgc2l6ZSBpbiBjYXNlCisJICogdGhpcyBDRFJPTSB3YXMgbW91bnRlZCB3aXRoIHRoZSBjcnVmdCBvcHRpb24uCisJICovCisKKwlpZiAoc2JpLT5zX2NydWZ0ID09ICd5JykKKwkJaW5vZGUtPmlfc2l6ZSAmPSAweDAwZmZmZmZmOworCisJaWYgKGRlLT5pbnRlcmxlYXZlWzBdKSB7CisJCXByaW50aygiSW50ZXJsZWF2ZWQgZmlsZXMgbm90ICh5ZXQpIHN1cHBvcnRlZC5cbiIpOworCQlpbm9kZS0+aV9zaXplID0gMDsKKwl9CisKKwkvKiBJIGhhdmUgbm8gaWRlYSB3aGF0IGZpbGVfdW5pdF9zaXplIGlzIHVzZWQgZm9yLCBzbworCSAgIHdlIHdpbGwgZmxhZyBpdCBmb3Igbm93ICovCisJaWYgKGRlLT5maWxlX3VuaXRfc2l6ZVswXSAhPSAwKSB7CisJCXByaW50aygiRmlsZSB1bml0IHNpemUgIT0gMCBmb3IgSVNPIGZpbGUgKCVsZCkuXG4iLAorCQkgICAgICAgaW5vZGUtPmlfaW5vKTsKKwl9CisKKwkvKiBJIGhhdmUgbm8gaWRlYSB3aGF0IG90aGVyIGZsYWcgYml0cyBhcmUgdXNlZCBmb3IsIHNvCisJICAgd2Ugd2lsbCBmbGFnIGl0IGZvciBub3cgKi8KKyNpZmRlZiBERUJVRworCWlmKChkZS0+ZmxhZ3NbLWhpZ2hfc2llcnJhXSAmIH4yKSE9IDApeworCQlwcmludGsoIlVudXN1YWwgZmxhZyBzZXR0aW5ncyBmb3IgSVNPIGZpbGUgKCVsZCAleCkuXG4iLAorCQkgICAgICAgaW5vZGUtPmlfaW5vLCBkZS0+ZmxhZ3NbLWhpZ2hfc2llcnJhXSk7CisJfQorI2VuZGlmCisKKwlpbm9kZS0+aV9tdGltZS50dl9zZWMgPQorCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9CisJaW5vZGUtPmlfY3RpbWUudHZfc2VjID0gaXNvX2RhdGUoZGUtPmRhdGUsIGhpZ2hfc2llcnJhKTsKKwlpbm9kZS0+aV9tdGltZS50dl9uc2VjID0KKwlpbm9kZS0+aV9hdGltZS50dl9uc2VjID0KKwlpbm9kZS0+aV9jdGltZS50dl9uc2VjID0gMDsKKworCWVpLT5pX2ZpcnN0X2V4dGVudCA9IChpc29udW1fNzMzIChkZS0+ZXh0ZW50KSArCisJCQkgICAgICBpc29udW1fNzExIChkZS0+ZXh0X2F0dHJfbGVuZ3RoKSk7CisKKwkvKiBTZXQgdGhlIG51bWJlciBvZiBibG9ja3MgZm9yIHN0YXQoKSAtIHNob3VsZCBiZSBkb25lIGJlZm9yZSBSUiAqLworCWlub2RlLT5pX2Jsa3NpemUgPSBQQUdFX0NBQ0hFX1NJWkU7IC8qIEZvciBzdGF0KCkgb25seSAqLworCWlub2RlLT5pX2Jsb2NrcyAgPSAoaW5vZGUtPmlfc2l6ZSArIDUxMSkgPj4gOTsKKworCS8qCisJICogTm93IHRlc3QgZm9yIHBvc3NpYmxlIFJvY2sgUmlkZ2UgZXh0ZW5zaW9ucyB3aGljaCB3aWxsIG92ZXJyaWRlCisJICogc29tZSBvZiB0aGVzZSBudW1iZXJzIGluIHRoZSBpbm9kZSBzdHJ1Y3R1cmUuCisJICovCisKKwlpZiAoIWhpZ2hfc2llcnJhKSB7CisJCXBhcnNlX3JvY2tfcmlkZ2VfaW5vZGUoZGUsIGlub2RlKTsKKwkJLyogaWYgd2Ugd2FudCB1aWQvZ2lkIHNldCwgb3ZlcnJpZGUgdGhlIHJvY2sgcmlkZ2Ugc2V0dGluZyAqLworCQl0ZXN0X2FuZF9zZXRfdWlkKCZpbm9kZS0+aV91aWQsIHNiaS0+c191aWQpOworCQl0ZXN0X2FuZF9zZXRfZ2lkKCZpbm9kZS0+aV9naWQsIHNiaS0+c19naWQpOworCX0KKworCS8qIEluc3RhbGwgdGhlIGlub2RlIG9wZXJhdGlvbnMgdmVjdG9yICovCisJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaW5vZGUtPmlfZm9wID0gJmdlbmVyaWNfcm9fZm9wczsKKwkJc3dpdGNoICggZWktPmlfZmlsZV9mb3JtYXQgKSB7CisjaWZkZWYgQ09ORklHX1pJU09GUworCQljYXNlIGlzb2ZzX2ZpbGVfY29tcHJlc3NlZDoKKwkJCWlub2RlLT5pX2RhdGEuYV9vcHMgPSAmemlzb2ZzX2FvcHM7CisJCQlicmVhazsKKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJaW5vZGUtPmlfZGF0YS5hX29wcyA9ICZpc29mc19hb3BzOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaW5vZGUtPmlfb3AgPSAmaXNvZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZpc29mc19kaXJfb3BlcmF0aW9uczsKKwl9IGVsc2UgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaW5vZGUtPmlfb3AgPSAmcGFnZV9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2RhdGEuYV9vcHMgPSAmaXNvZnNfc3ltbGlua19hb3BzOworCX0gZWxzZQorCQkvKiBYWFggLSBwYXJzZV9yb2NrX3JpZGdlX2lub2RlKCkgaGFkIGFscmVhZHkgc2V0IGlfcmRldi4gKi8KKwkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLCBpbm9kZS0+aV9yZGV2KTsKKworIG91dDoKKwlpZiAodG1wZGUpCisJCWtmcmVlKHRtcGRlKTsKKwlpZiAoYmgpCisJCWJyZWxzZShiaCk7CisJcmV0dXJuOworCisgb3V0X2JhZHJlYWQ6CisJcHJpbnRrKEtFUk5fV0FSTklORyAiSVNPRlM6IHVuYWJsZSB0byByZWFkIGktbm9kZSBibG9ja1xuIik7CisgZmFpbDoKKwltYWtlX2JhZF9pbm9kZShpbm9kZSk7CisJZ290byBvdXQ7Cit9CisKK3N0cnVjdCBpc29mc19pZ2V0NV9jYWxsYmFja19kYXRhIHsKKwl1bnNpZ25lZCBsb25nIGJsb2NrOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworfTsKKworc3RhdGljIGludCBpc29mc19pZ2V0NV90ZXN0KHN0cnVjdCBpbm9kZSAqaW5vLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBpc29faW5vZGVfaW5mbyAqaSA9IElTT0ZTX0koaW5vKTsKKwlzdHJ1Y3QgaXNvZnNfaWdldDVfY2FsbGJhY2tfZGF0YSAqZCA9CisJCShzdHJ1Y3QgaXNvZnNfaWdldDVfY2FsbGJhY2tfZGF0YSopZGF0YTsKKwlyZXR1cm4gKGktPmlfaWdldDVfYmxvY2sgPT0gZC0+YmxvY2spCisJICAgICAgICYmIChpLT5pX2lnZXQ1X29mZnNldCA9PSBkLT5vZmZzZXQpOworfQorCitzdGF0aWMgaW50IGlzb2ZzX2lnZXQ1X3NldChzdHJ1Y3QgaW5vZGUgKmlubywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXNvX2lub2RlX2luZm8gKmkgPSBJU09GU19JKGlubyk7CisJc3RydWN0IGlzb2ZzX2lnZXQ1X2NhbGxiYWNrX2RhdGEgKmQgPQorCQkoc3RydWN0IGlzb2ZzX2lnZXQ1X2NhbGxiYWNrX2RhdGEqKWRhdGE7CisJaS0+aV9pZ2V0NV9ibG9jayA9IGQtPmJsb2NrOworCWktPmlfaWdldDVfb2Zmc2V0ID0gZC0+b2Zmc2V0OworCXJldHVybiAwOworfQorCisvKiBTdG9yZSwgaW4gdGhlIGlub2RlJ3MgY29udGFpbmluZyBzdHJ1Y3R1cmUsIHRoZSBibG9jayBhbmQgYmxvY2sKKyAqIG9mZnNldCB0aGF0IHBvaW50IHRvIHRoZSB1bmRlcmx5aW5nIG1ldGEtZGF0YSBmb3IgdGhlIGlub2RlLiAgVGhlCisgKiBjb2RlIGJlbG93IGlzIG90aGVyd2lzZSBzaW1pbGFyIHRvIHRoZSBpZ2V0KCkgY29kZSBpbgorICogaW5jbHVkZS9saW51eC9mcy5oICovCitzdHJ1Y3QgaW5vZGUgKmlzb2ZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCSB1bnNpZ25lZCBsb25nIGJsb2NrLAorCQkJIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCXVuc2lnbmVkIGxvbmcgaGFzaHZhbDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBpc29mc19pZ2V0NV9jYWxsYmFja19kYXRhIGRhdGE7CisKKwlpZiAob2Zmc2V0ID49IDF1bCA8PCBzYi0+c19ibG9ja3NpemVfYml0cykKKwkJcmV0dXJuIE5VTEw7CisKKwlkYXRhLmJsb2NrID0gYmxvY2s7CisJZGF0YS5vZmZzZXQgPSBvZmZzZXQ7CisKKwloYXNodmFsID0gKGJsb2NrIDw8IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSB8IG9mZnNldDsKKworCWlub2RlID0gaWdldDVfbG9ja2VkKHNiLAorCQkJICAgICBoYXNodmFsLAorCQkJICAgICAmaXNvZnNfaWdldDVfdGVzdCwKKwkJCSAgICAgJmlzb2ZzX2lnZXQ1X3NldCwKKwkJCSAgICAgJmRhdGEpOworCisJaWYgKGlub2RlICYmIChpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSkgeworCQlzYi0+c19vcC0+cmVhZF9pbm9kZShpbm9kZSk7CisJCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOworCX0KKworCXJldHVybiBpbm9kZTsKK30KKworI2lmZGVmIExFQUtfQ0hFQ0sKKyN1bmRlZiBtYWxsb2MKKyN1bmRlZiBmcmVlX3MKKyN1bmRlZiBzYl9icmVhZAorI3VuZGVmIGJyZWxzZQorCit2b2lkICogbGVha19jaGVja19tYWxsb2ModW5zaWduZWQgaW50IHNpemUpeworICB2b2lkICogdG1wOworICBjaGVja19tYWxsb2MrKzsKKyAgdG1wID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKyAgcmV0dXJuIHRtcDsKK30KKwordm9pZCBsZWFrX2NoZWNrX2ZyZWVfcyh2b2lkICogb2JqLCBpbnQgc2l6ZSl7CisgIGNoZWNrX21hbGxvYy0tOworICByZXR1cm4ga2ZyZWUob2JqKTsKK30KKworc3RydWN0IGJ1ZmZlcl9oZWFkICogbGVha19jaGVja19icmVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgYmxvY2speworICBjaGVja19icmVhZCsrOworICByZXR1cm4gc2JfYnJlYWQoc2IsIGJsb2NrKTsKK30KKwordm9pZCBsZWFrX2NoZWNrX2JyZWxzZShzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCl7CisgIGNoZWNrX2JyZWFkLS07CisgIHJldHVybiBicmVsc2UoYmgpOworfQorCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqaXNvZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgaXNvZnNfZmlsbF9zdXBlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBpc285NjYwX2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJpc285NjYwIiwKKwkuZ2V0X3NiCQk9IGlzb2ZzX2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfYmxvY2tfc3VwZXIsCisJLmZzX2ZsYWdzCT0gRlNfUkVRVUlSRVNfREVWLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9pc285NjYwX2ZzKHZvaWQpCit7CisJaW50IGVyciA9IGluaXRfaW5vZGVjYWNoZSgpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworI2lmZGVmIENPTkZJR19aSVNPRlMKKwllcnIgPSB6aXNvZnNfaW5pdCgpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MTsKKyNlbmRpZgorCWVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmlzbzk2NjBfZnNfdHlwZSk7CisJaWYgKGVycikKKwkJZ290byBvdXQyOworCXJldHVybiAwOworb3V0MjoKKyNpZmRlZiBDT05GSUdfWklTT0ZTCisJemlzb2ZzX2NsZWFudXAoKTsKK291dDE6CisjZW5kaWYKKwlkZXN0cm95X2lub2RlY2FjaGUoKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9pc285NjYwX2ZzKHZvaWQpCit7CisgICAgICAgIHVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmaXNvOTY2MF9mc190eXBlKTsKKyNpZmRlZiBDT05GSUdfWklTT0ZTCisJemlzb2ZzX2NsZWFudXAoKTsKKyNlbmRpZgorCWRlc3Ryb3lfaW5vZGVjYWNoZSgpOworfQorCittb2R1bGVfaW5pdChpbml0X2lzbzk2NjBfZnMpCittb2R1bGVfZXhpdChleGl0X2lzbzk2NjBfZnMpCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisvKiBBY3R1YWwgZmlsZXN5c3RlbSBuYW1lIGlzIGlzbzk2NjAsIGFzIHJlcXVlc3RlZCBpbiBmaWxlc3lzdGVtcy5jICovCitNT0RVTEVfQUxJQVMoImlzbzk2NjAiKTsKZGlmZiAtLWdpdCBhL2ZzL2lzb2ZzL2pvbGlldC5jIGIvZnMvaXNvZnMvam9saWV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZjNTBlMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2lzb2ZzL2pvbGlldC5jCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogIGxpbnV4L2ZzL2lzb2ZzL2pvbGlldC5jCisgKgorICogIChDKSAxOTk2IEdvcmRvbiBDaGFmZmVlCisgKgorICogIEpvbGlldDogTWljcm9zb2Z0J3MgVW5pY29kZSBleHRlbnNpb25zIHRvIGlzbzk2NjAKKyAqLworCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pc29fZnMuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKKy8qCisgKiBDb252ZXJ0IFVuaWNvZGUgMTYgdG8gVVRGOCBvciBBU0NJSS4KKyAqLworc3RhdGljIGludAordW5pMTZfdG9feDgodW5zaWduZWQgY2hhciAqYXNjaWksIHUxNiAqdW5pLCBpbnQgbGVuLCBzdHJ1Y3QgbmxzX3RhYmxlICpubHMpCit7CisJd2NoYXJfdCAqaXAsIGNoOworCXVuc2lnbmVkIGNoYXIgKm9wOworCisJaXAgPSB1bmk7CisJb3AgPSBhc2NpaTsKKworCXdoaWxlICgoY2ggPSBnZXRfdW5hbGlnbmVkKGlwKSkgJiYgbGVuKSB7CisJCWludCBsbGVuOworCQljaCA9IGJlMTZfdG9fY3B1KGNoKTsKKwkJaWYgKChsbGVuID0gbmxzLT51bmkyY2hhcihjaCwgb3AsIE5MU19NQVhfQ0hBUlNFVF9TSVpFKSkgPiAwKQorCQkJb3AgKz0gbGxlbjsKKwkJZWxzZQorCQkJKm9wKysgPSAnPyc7CisJCWlwKys7CisKKwkJbGVuLS07CisJfQorCSpvcCA9IDA7CisJcmV0dXJuIChvcCAtIGFzY2lpKTsKK30KKworLyogQ29udmVydCBiaWcgZW5kaWFuIHdpZGUgY2hhcmFjdGVyIHN0cmluZyB0byB1dGY4ICovCitzdGF0aWMgaW50Cit3Y3NudG9tYnNfYmUoX191OCAqcywgY29uc3QgX191OCAqcHdjcywgaW50IGlubGVuLCBpbnQgbWF4bGVuKQoreworCWNvbnN0IF9fdTggKmlwOworCV9fdTggKm9wOworCWludCBzaXplOworCV9fdTE2IGM7CisKKwlvcCA9IHM7CisJaXAgPSBwd2NzOworCXdoaWxlICgoKmlwIHx8IGlwWzFdKSAmJiAobWF4bGVuID4gMCkgJiYgKGlubGVuID4gMCkpIHsKKwkJYyA9ICgqaXAgPDwgOCkgfCBpcFsxXTsKKwkJaWYgKGMgPiAweDdmKSB7CisJCQlzaXplID0gdXRmOF93Y3RvbWIob3AsIGMsIG1heGxlbik7CisJCQlpZiAoc2l6ZSA9PSAtMSkgeworCQkJCS8qIElnbm9yZSBjaGFyYWN0ZXIgYW5kIG1vdmUgb24gKi8KKwkJCQltYXhsZW4tLTsKKwkJCX0gZWxzZSB7CisJCQkJb3AgKz0gc2l6ZTsKKwkJCQltYXhsZW4gLT0gc2l6ZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCSpvcCsrID0gKF9fdTgpIGM7CisJCX0KKwkJaXAgKz0gMjsKKwkJaW5sZW4tLTsKKwl9CisJcmV0dXJuIChvcCAtIHMpOworfQorCitpbnQKK2dldF9qb2xpZXRfZmlsZW5hbWUoc3RydWN0IGlzb19kaXJlY3RvcnlfcmVjb3JkICogZGUsIHVuc2lnbmVkIGNoYXIgKm91dG5hbWUsIHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCXVuc2lnbmVkIGNoYXIgdXRmODsKKwlzdHJ1Y3QgbmxzX3RhYmxlICpubHM7CisJdW5zaWduZWQgY2hhciBsZW4gPSAwOworCisJdXRmOCA9IElTT0ZTX1NCKGlub2RlLT5pX3NiKS0+c191dGY4OworCW5scyA9IElTT0ZTX1NCKGlub2RlLT5pX3NiKS0+c19ubHNfaW9jaGFyc2V0OworCisJaWYgKHV0ZjgpIHsKKwkJbGVuID0gd2NzbnRvbWJzX2JlKG91dG5hbWUsIGRlLT5uYW1lLAorCQkJCSAgIGRlLT5uYW1lX2xlblswXSA+PiAxLCBQQUdFX1NJWkUpOworCX0gZWxzZSB7CisJCWxlbiA9IHVuaTE2X3RvX3g4KG91dG5hbWUsICh1MTYgKikgZGUtPm5hbWUsCisJCQkJICBkZS0+bmFtZV9sZW5bMF0gPj4gMSwgbmxzKTsKKwl9CisJaWYgKChsZW4gPiAyKSAmJiAob3V0bmFtZVtsZW4tMl0gPT0gJzsnKSAmJiAob3V0bmFtZVtsZW4tMV0gPT0gJzEnKSkgeworCQlsZW4gLT0gMjsKKwl9CisKKwkvKgorCSAqIFdpbmRvd3MgZG9lc24ndCBsaWtlIHBlcmlvZHMgYXQgdGhlIGVuZCBvZiBhIG5hbWUsCisJICogc28gbmVpdGhlciBkbyB3ZQorCSAqLworCXdoaWxlIChsZW4gPj0gMiAmJiAob3V0bmFtZVtsZW4tMV0gPT0gJy4nKSkgeworCQlsZW4tLTsKKwl9CisKKwlyZXR1cm4gbGVuOworfQpkaWZmIC0tZ2l0IGEvZnMvaXNvZnMvbmFtZWkuYyBiL2ZzL2lzb2ZzL25hbWVpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU2OWZjNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2lzb2ZzL25hbWVpLmMKQEAgLTAsMCArMSwyMDEgQEAKKy8qCisgKiAgbGludXgvZnMvaXNvZnMvbmFtZWkuYworICoKKyAqICAoQykgMTk5MiAgRXJpYyBZb3VuZ2RhbGUgTW9kaWZpZWQgZm9yIElTTyA5NjYwIGZpbGVzeXN0ZW0uCisgKgorICogIChDKSAxOTkxICBMaW51cyBUb3J2YWxkcyAtIG1pbml4IGZpbGVzeXN0ZW0KKyAqLworCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lzb19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4JLyogSm9saWV0PyAqLworI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kY2FjaGUuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKy8qCisgKiBvaywgd2UgY2Fubm90IHVzZSBzdHJuY21wLCBhcyB0aGUgbmFtZSBpcyBub3QgaW4gb3VyIGRhdGEgc3BhY2UuCisgKiBUaHVzIHdlJ2xsIGhhdmUgdG8gdXNlIGlzb2ZzX21hdGNoLiBObyBiaWcgcHJvYmxlbS4gTWF0Y2ggYWxzbyBtYWtlcworICogc29tZSBzYW5pdHkgdGVzdHMuCisgKi8KK3N0YXRpYyBpbnQKK2lzb2ZzX2NtcChzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBjb25zdCBjaGFyICogY29tcGFyZSwgaW50IGRsZW4pCit7CisJc3RydWN0IHFzdHIgcXN0cjsKKworCWlmICghY29tcGFyZSkKKwkJcmV0dXJuIDE7CisKKwkvKiBjaGVjayBzcGVjaWFsICIuIiBhbmQgIi4uIiBmaWxlcyAqLworCWlmIChkbGVuID09IDEpIHsKKwkJLyogIi4iICovCisJCWlmIChjb21wYXJlWzBdID09IDApIHsKKwkJCWlmICghZGVudHJ5LT5kX25hbWUubGVuKQorCQkJCXJldHVybiAwOworCQkJY29tcGFyZSA9ICIuIjsKKwkJfSBlbHNlIGlmIChjb21wYXJlWzBdID09IDEpIHsKKwkJCWNvbXBhcmUgPSAiLi4iOworCQkJZGxlbiA9IDI7CisJCX0KKwl9CisKKwlxc3RyLm5hbWUgPSBjb21wYXJlOworCXFzdHIubGVuID0gZGxlbjsKKwlyZXR1cm4gZGVudHJ5LT5kX29wLT5kX2NvbXBhcmUoZGVudHJ5LCAmZGVudHJ5LT5kX25hbWUsICZxc3RyKTsKK30KKworLyoKKyAqCWlzb2ZzX2ZpbmRfZW50cnkoKQorICoKKyAqIGZpbmRzIGFuIGVudHJ5IGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IHdpdGggdGhlIHdhbnRlZCBuYW1lLiBJdAorICogcmV0dXJucyB0aGUgaW5vZGUgbnVtYmVyIG9mIHRoZSBmb3VuZCBlbnRyeSwgb3IgMCBvbiBlcnJvci4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcKK2lzb2ZzX2ZpbmRfZW50cnkoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwl1bnNpZ25lZCBsb25nICpibG9ja19ydiwgdW5zaWduZWQgbG9uZyogb2Zmc2V0X3J2LAorCWNoYXIgKiB0bXBuYW1lLCBzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKiB0bXBkZSkKK3sKKwl1bnNpZ25lZCBsb25nIGJ1ZnNpemUgPSBJU09GU19CVUZGRVJfU0laRShkaXIpOworCXVuc2lnbmVkIGNoYXIgYnVmYml0cyA9IElTT0ZTX0JVRkZFUl9CSVRTKGRpcik7CisJdW5zaWduZWQgbG9uZyBibG9jaywgZl9wb3MsIG9mZnNldCwgYmxvY2tfc2F2ZWQsIG9mZnNldF9zYXZlZDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCA9IE5VTEw7CisJc3RydWN0IGlzb2ZzX3NiX2luZm8gKnNiaSA9IElTT0ZTX1NCKGRpci0+aV9zYik7CisKKwlpZiAoIUlTT0ZTX0koZGlyKS0+aV9maXJzdF9leHRlbnQpCisJCXJldHVybiAwOworICAKKwlmX3BvcyA9IDA7CisJb2Zmc2V0ID0gMDsKKwlibG9jayA9IDA7CisKKwl3aGlsZSAoZl9wb3MgPCBkaXItPmlfc2l6ZSkgeworCQlzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKiBkZTsKKwkJaW50IGRlX2xlbiwgbWF0Y2gsIGksIGRsZW47CisJCWNoYXIgKmRwbnQ7CisKKwkJaWYgKCFiaCkgeworCQkJYmggPSBpc29mc19icmVhZChkaXIsIGJsb2NrKTsKKwkJCWlmICghYmgpCisJCQkJcmV0dXJuIDA7CisJCX0KKworCQlkZSA9IChzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKikgKGJoLT5iX2RhdGEgKyBvZmZzZXQpOworCisJCWRlX2xlbiA9ICoodW5zaWduZWQgY2hhciAqKSBkZTsKKwkJaWYgKCFkZV9sZW4pIHsKKwkJCWJyZWxzZShiaCk7CisJCQliaCA9IE5VTEw7CisJCQlmX3BvcyA9IChmX3BvcyArIElTT0ZTX0JMT0NLX1NJWkUpICYgfihJU09GU19CTE9DS19TSVpFIC0gMSk7CisJCQlibG9jayA9IGZfcG9zID4+IGJ1ZmJpdHM7CisJCQlvZmZzZXQgPSAwOworCQkJY29udGludWU7CisJCX0KKworCQlibG9ja19zYXZlZCA9IGJoLT5iX2Jsb2NrbnI7CisJCW9mZnNldF9zYXZlZCA9IG9mZnNldDsKKwkJb2Zmc2V0ICs9IGRlX2xlbjsKKwkJZl9wb3MgKz0gZGVfbGVuOworCisJCS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgZnVsbCBkaXJlY3RvcnkgZW50cnkgKi8KKwkJaWYgKG9mZnNldCA+PSBidWZzaXplKSB7CisJCQlpbnQgc2xvcCA9IGJ1ZnNpemUgLSBvZmZzZXQgKyBkZV9sZW47CisJCQltZW1jcHkodG1wZGUsIGRlLCBzbG9wKTsKKwkJCW9mZnNldCAmPSBidWZzaXplIC0gMTsKKwkJCWJsb2NrKys7CisJCQlicmVsc2UoYmgpOworCQkJYmggPSBOVUxMOworCQkJaWYgKG9mZnNldCkgeworCQkJCWJoID0gaXNvZnNfYnJlYWQoZGlyLCBibG9jayk7CisJCQkJaWYgKCFiaCkKKwkJCQkJcmV0dXJuIDA7CisJCQkJbWVtY3B5KCh2b2lkICopIHRtcGRlICsgc2xvcCwgYmgtPmJfZGF0YSwgb2Zmc2V0KTsKKwkJCX0KKwkJCWRlID0gdG1wZGU7CisJCX0KKworCQlkbGVuID0gZGUtPm5hbWVfbGVuWzBdOworCQlkcG50ID0gZGUtPm5hbWU7CisKKwkJaWYgKHNiaS0+c19yb2NrICYmCisJCSAgICAoKGkgPSBnZXRfcm9ja19yaWRnZV9maWxlbmFtZShkZSwgdG1wbmFtZSwgZGlyKSkpKSB7CisJCQlkbGVuID0gaTsgCS8qIHBvc3NpYmx5IC0xICovCisJCQlkcG50ID0gdG1wbmFtZTsKKyNpZmRlZiBDT05GSUdfSk9MSUVUCisJCX0gZWxzZSBpZiAoc2JpLT5zX2pvbGlldF9sZXZlbCkgeworCQkJZGxlbiA9IGdldF9qb2xpZXRfZmlsZW5hbWUoZGUsIHRtcG5hbWUsIGRpcik7CisJCQlkcG50ID0gdG1wbmFtZTsKKyNlbmRpZgorCQl9IGVsc2UgaWYgKHNiaS0+c19tYXBwaW5nID09ICdhJykgeworCQkJZGxlbiA9IGdldF9hY29ybl9maWxlbmFtZShkZSwgdG1wbmFtZSwgZGlyKTsKKwkJCWRwbnQgPSB0bXBuYW1lOworCQl9IGVsc2UgaWYgKHNiaS0+c19tYXBwaW5nID09ICduJykgeworCQkJZGxlbiA9IGlzb2ZzX25hbWVfdHJhbnNsYXRlKGRlLCB0bXBuYW1lLCBkaXIpOworCQkJZHBudCA9IHRtcG5hbWU7CisJCX0KKworCQkvKgorCQkgKiBTa2lwIGhpZGRlbiBvciBhc3NvY2lhdGVkIGZpbGVzIHVubGVzcyB1bmhpZGUgaXMgc2V0IAorCQkgKi8KKwkJbWF0Y2ggPSAwOworCQlpZiAoZGxlbiA+IDAgJiYKKwkJICAgICghKGRlLT5mbGFnc1stc2JpLT5zX2hpZ2hfc2llcnJhXSAmIDUpCisJCSAgICAgfHwgc2JpLT5zX3VuaGlkZSA9PSAneScpKQorCQl7CisJCQltYXRjaCA9IChpc29mc19jbXAoZGVudHJ5LGRwbnQsZGxlbikgPT0gMCk7CisJCX0KKwkJaWYgKG1hdGNoKSB7CisJCQlpc29mc19ub3JtYWxpemVfYmxvY2tfYW5kX29mZnNldChkZSwKKwkJCQkJCQkgJmJsb2NrX3NhdmVkLAorCQkJCQkJCSAmb2Zmc2V0X3NhdmVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpibG9ja19ydiA9IGJsb2NrX3NhdmVkOworICAgICAgICAgICAgICAgICAgICAgICAgKm9mZnNldF9ydiA9IG9mZnNldF9zYXZlZDsKKwkJCWlmIChiaCkgYnJlbHNlKGJoKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCWlmIChiaCkgYnJlbHNlKGJoKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGRlbnRyeSAqaXNvZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaW50IGZvdW5kOworCXVuc2lnbmVkIGxvbmcgYmxvY2ssIG9mZnNldDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBwYWdlICpwYWdlOworCisJZGVudHJ5LT5kX29wID0gZGlyLT5pX3NiLT5zX3Jvb3QtPmRfb3A7CisKKwlwYWdlID0gYWxsb2NfcGFnZShHRlBfVVNFUik7CisJaWYgKCFwYWdlKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWxvY2tfa2VybmVsKCk7CisJZm91bmQgPSBpc29mc19maW5kX2VudHJ5KGRpciwgZGVudHJ5LAorCQkJCSAmYmxvY2ssICZvZmZzZXQsCisJCQkJIHBhZ2VfYWRkcmVzcyhwYWdlKSwKKwkJCQkgMTAyNCArIHBhZ2VfYWRkcmVzcyhwYWdlKSk7CisJX19mcmVlX3BhZ2UocGFnZSk7CisKKwlpbm9kZSA9IE5VTEw7CisJaWYgKGZvdW5kKSB7CisJCWlub2RlID0gaXNvZnNfaWdldChkaXItPmlfc2IsIGJsb2NrLCBvZmZzZXQpOworCQlpZiAoIWlub2RlKSB7CisJCQl1bmxvY2tfa2VybmVsKCk7CisJCQlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKKwkJfQorCX0KKwl1bmxvY2tfa2VybmVsKCk7CisJaWYgKGlub2RlKQorCQlyZXR1cm4gZF9zcGxpY2VfYWxpYXMoaW5vZGUsIGRlbnRyeSk7CisJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9mcy9pc29mcy9yb2NrLmMgYi9mcy9pc29mcy9yb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJkZDNlNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2lzb2ZzL3JvY2suYwpAQCAtMCwwICsxLDU2NSBAQAorLyoKKyAqICBsaW51eC9mcy9pc29mcy9yb2NrLmMKKyAqCisgKiAgKEMpIDE5OTIsIDE5OTMgIEVyaWMgWW91bmdkYWxlCisgKgorICogIFJvY2sgUmlkZ2UgRXh0ZW5zaW9ucyB0byBpc285NjYwCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvaXNvX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCisjaW5jbHVkZSAicm9jay5oIgorCisvKiBUaGVzZSBmdW5jdGlvbnMgYXJlIGRlc2lnbmVkIHRvIHJlYWQgdGhlIHN5c3RlbSBhcmVhcyBvZiBhIGRpcmVjdG9yeSByZWNvcmQKKyAqIGFuZCBleHRyYWN0IHJlbGV2YW50IGluZm9ybWF0aW9uLiAgVGhlcmUgYXJlIGRpZmZlcmVudCBmdW5jdGlvbnMgcHJvdmlkZWQKKyAqIGRlcGVuZGluZyB1cG9uIHdoYXQgaW5mb3JtYXRpb24gd2UgbmVlZCBhdCB0aGUgdGltZS4gIE9uZSBmdW5jdGlvbiBmaWxscworICogb3V0IGFuIGlub2RlIHN0cnVjdHVyZSwgYSBzZWNvbmQgb25lIGV4dHJhY3RzIGEgZmlsZW5hbWUsIGEgdGhpcmQgb25lCisgKiByZXR1cm5zIGEgc3ltYm9saWMgbGluayBuYW1lLCBhbmQgYSBmb3VydGggb25lIHJldHVybnMgdGhlIGV4dGVudCBudW1iZXIKKyAqIGZvciB0aGUgZmlsZS4gKi8KKworI2RlZmluZSBTSUcoQSxCKSAoKEEpIHwgKChCKSA8PCA4KSkgLyogaXNvbnVtXzcyMSgpICovCisKKworLyogVGhpcyBpcyBhIHdheSBvZiBlbnN1cmluZyB0aGF0IHdlIGhhdmUgc29tZXRoaW5nIGluIHRoZSBzeXN0ZW0KKyAgIHVzZSBmaWVsZHMgdGhhdCBpcyBjb21wYXRpYmxlIHdpdGggUm9jayBSaWRnZSAqLworI2RlZmluZSBDSEVDS19TUChGQUlMKQkgICAgICAgCQkJXAorICAgICAgaWYocnItPnUuU1AubWFnaWNbMF0gIT0gMHhiZSkgRkFJTDsJXAorICAgICAgaWYocnItPnUuU1AubWFnaWNbMV0gIT0gMHhlZikgRkFJTDsgICAgICAgXAorICAgICAgSVNPRlNfU0IoaW5vZGUtPmlfc2IpLT5zX3JvY2tfb2Zmc2V0PXJyLT51LlNQLnNraXA7CisvKiBXZSBkZWZpbmUgYSBzZXJpZXMgb2YgbWFjcm9zIGJlY2F1c2UgZWFjaCBmdW5jdGlvbiBtdXN0IGRvIGV4YWN0bHkgdGhlCisgICBzYW1lIHRoaW5nIGluIGNlcnRhaW4gcGxhY2VzLiAgV2UgdXNlIHRoZSBtYWNyb3MgdG8gZW5zdXJlIHRoYXQgZXZlcnl0aGluZworICAgaXMgZG9uZSBjb3JyZWN0bHkgKi8KKworI2RlZmluZSBDT05USU5VRV9ERUNMUyBcCisgIGludCBjb250X2V4dGVudCA9IDAsIGNvbnRfb2Zmc2V0ID0gMCwgY29udF9zaXplID0gMDsgICBcCisgIHZvaWQgKmJ1ZmZlciA9IE5VTEwKKworI2RlZmluZSBDSEVDS19DRQkgICAgICAgCQkJXAorICAgICAge2NvbnRfZXh0ZW50ID0gaXNvbnVtXzczMyhyci0+dS5DRS5leHRlbnQpOyBcCisgICAgICBjb250X29mZnNldCA9IGlzb251bV83MzMocnItPnUuQ0Uub2Zmc2V0KTsgXAorICAgICAgY29udF9zaXplID0gaXNvbnVtXzczMyhyci0+dS5DRS5zaXplKTt9CisKKyNkZWZpbmUgU0VUVVBfUk9DS19SSURHRShERSxDSFIsTEVOKQkgICAgICAJCSAgICAgIAlcCisgIHtMRU49IHNpemVvZihzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQpICsgREUtPm5hbWVfbGVuWzBdOwlcCisgIGlmKExFTiAmIDEpIExFTisrOwkJCQkJCVwKKyAgQ0hSID0gKCh1bnNpZ25lZCBjaGFyICopIERFKSArIExFTjsJCQkJXAorICBMRU4gPSAqKCh1bnNpZ25lZCBjaGFyICopIERFKSAtIExFTjsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKExFTjwwKSBMRU49MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChJU09GU19TQihpbm9kZS0+aV9zYiktPnNfcm9ja19vZmZzZXQhPS0xKSAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBMRU4tPUlTT0ZTX1NCKGlub2RlLT5pX3NiKS0+c19yb2NrX29mZnNldDsgICAgICAgICAgICAgICAgXAorICAgICBDSFIrPUlTT0ZTX1NCKGlub2RlLT5pX3NiKS0+c19yb2NrX29mZnNldDsgICAgICAgICAgICAgICAgXAorICAgICBpZiAoTEVOPDApIExFTj0wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisjZGVmaW5lIE1BWUJFX0NPTlRJTlVFKExBQkVMLERFVikgXAorICB7aWYgKGJ1ZmZlcikgeyBrZnJlZShidWZmZXIpOyBidWZmZXIgPSBOVUxMOyB9IFwKKyAgaWYgKGNvbnRfZXh0ZW50KXsgXAorICAgIGludCBibG9jaywgb2Zmc2V0LCBvZmZzZXQxOyBcCisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogcGJoOyBcCisgICAgYnVmZmVyID0ga21hbGxvYyhjb250X3NpemUsR0ZQX0tFUk5FTCk7IFwKKyAgICBpZiAoIWJ1ZmZlcikgZ290byBvdXQ7IFwKKyAgICBibG9jayA9IGNvbnRfZXh0ZW50OyBcCisgICAgb2Zmc2V0ID0gY29udF9vZmZzZXQ7IFwKKyAgICBvZmZzZXQxID0gMDsgXAorICAgIHBiaCA9IHNiX2JyZWFkKERFVi0+aV9zYiwgYmxvY2spOyBcCisgICAgaWYocGJoKXsgICAgICAgXAorICAgICAgaWYgKG9mZnNldCA+IHBiaC0+Yl9zaXplIHx8IG9mZnNldCArIGNvbnRfc2l6ZSA+IHBiaC0+Yl9zaXplKXsJXAorCWJyZWxzZShwYmgpOyBcCisJZ290byBvdXQ7IFwKKyAgICAgIH0gXAorICAgICAgbWVtY3B5KGJ1ZmZlciArIG9mZnNldDEsIHBiaC0+Yl9kYXRhICsgb2Zmc2V0LCBjb250X3NpemUgLSBvZmZzZXQxKTsgXAorICAgICAgYnJlbHNlKHBiaCk7IFwKKyAgICAgIGNociA9ICh1bnNpZ25lZCBjaGFyICopIGJ1ZmZlcjsgXAorICAgICAgbGVuID0gY29udF9zaXplOyBcCisgICAgICBjb250X2V4dGVudCA9IDA7IFwKKyAgICAgIGNvbnRfc2l6ZSA9IDA7IFwKKyAgICAgIGNvbnRfb2Zmc2V0ID0gMDsgXAorICAgICAgZ290byBMQUJFTDsgXAorICAgIH0gICAgXAorICAgIHByaW50aygiVW5hYmxlIHRvIHJlYWQgcm9jay1yaWRnZSBhdHRyaWJ1dGVzXG4iKTsgICAgXAorICB9fQorCisvKiByZXR1cm4gbGVuZ3RoIG9mIG5hbWUgZmllbGQ7IDA6IG5vdCBmb3VuZCwgLTE6IHRvIGJlIGlnbm9yZWQgKi8KK2ludCBnZXRfcm9ja19yaWRnZV9maWxlbmFtZShzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKiBkZSwKKwkJCSAgICBjaGFyICogcmV0bmFtZSwgc3RydWN0IGlub2RlICogaW5vZGUpCit7CisgIGludCBsZW47CisgIHVuc2lnbmVkIGNoYXIgKiBjaHI7CisgIENPTlRJTlVFX0RFQ0xTOworICBpbnQgcmV0bmFtbGVuID0gMCwgdHJ1bmNhdGU9MDsKKyAKKyAgaWYgKCFJU09GU19TQihpbm9kZS0+aV9zYiktPnNfcm9jaykgcmV0dXJuIDA7CisgICpyZXRuYW1lID0gMDsKKworICBTRVRVUF9ST0NLX1JJREdFKGRlLCBjaHIsIGxlbik7CisgcmVwZWF0OgorICB7CisgICAgc3RydWN0IHJvY2tfcmlkZ2UgKiBycjsKKyAgICBpbnQgc2lnOworICAgIAorICAgIHdoaWxlIChsZW4gPiAyKXsgLyogVGhlcmUgbWF5IGJlIG9uZSBieXRlIGZvciBwYWRkaW5nIHNvbWV3aGVyZSAqLworICAgICAgcnIgPSAoc3RydWN0IHJvY2tfcmlkZ2UgKikgY2hyOworICAgICAgaWYgKHJyLT5sZW4gPCAzKSBnb3RvIG91dDsgLyogU29tZXRoaW5nIGdvdCBzY3Jld2VkIHVwIGhlcmUgKi8KKyAgICAgIHNpZyA9IGlzb251bV83MjEoY2hyKTsKKyAgICAgIGNociArPSByci0+bGVuOyAKKyAgICAgIGxlbiAtPSByci0+bGVuOworICAgICAgaWYgKGxlbiA8IDApIGdvdG8gb3V0OwkvKiBjb3JydXB0ZWQgaXNvZnMgKi8KKworICAgICAgc3dpdGNoKHNpZyl7CisgICAgICBjYXNlIFNJRygnUicsJ1InKToKKwlpZigocnItPnUuUlIuZmxhZ3NbMF0gJiBSUl9OTSkgPT0gMCkgZ290byBvdXQ7CisJYnJlYWs7CisgICAgICBjYXNlIFNJRygnUycsJ1AnKToKKwlDSEVDS19TUChnb3RvIG91dCk7CisJYnJlYWs7CisgICAgICBjYXNlIFNJRygnQycsJ0UnKToKKwlDSEVDS19DRTsKKwlicmVhazsKKyAgICAgIGNhc2UgU0lHKCdOJywnTScpOgorCWlmICh0cnVuY2F0ZSkgYnJlYWs7CisJaWYgKHJyLT5sZW4gPCA1KSBicmVhazsKKyAgICAgICAgLyoKKwkgKiBJZiB0aGUgZmxhZ3MgYXJlIDIgb3IgNCwgdGhpcyBpbmRpY2F0ZXMgJy4nIG9yICcuLicuCisJICogV2UgZG9uJ3Qgd2FudCB0byBkbyBhbnl0aGluZyB3aXRoIHRoaXMsIGJlY2F1c2UgaXQKKwkgKiBzY3Jld3MgdXAgdGhlIGNvZGUgdGhhdCBjYWxscyB1cy4gIFdlIGRvbid0IHJlYWxseQorCSAqIGNhcmUgYW55d2F5cywgc2luY2Ugd2UgY2FuIGp1c3QgdXNlIHRoZSBub24tUlIKKwkgKiBuYW1lLgorCSAqLworCWlmIChyci0+dS5OTS5mbGFncyAmIDYpIHsKKwkgIGJyZWFrOworCX0KKworCWlmIChyci0+dS5OTS5mbGFncyAmIH4xKSB7CisJICBwcmludGsoIlVuc3VwcG9ydGVkIE5NIGZsYWcgc2V0dGluZ3MgKCVkKVxuIixyci0+dS5OTS5mbGFncyk7CisJICBicmVhazsKKwl9CisJaWYoKHN0cmxlbihyZXRuYW1lKSArIHJyLT5sZW4gLSA1KSA+PSAyNTQpIHsKKwkgIHRydW5jYXRlID0gMTsKKwkgIGJyZWFrOworCX0KKwlzdHJuY2F0KHJldG5hbWUsIHJyLT51Lk5NLm5hbWUsIHJyLT5sZW4gLSA1KTsKKwlyZXRuYW1sZW4gKz0gcnItPmxlbiAtIDU7CisJYnJlYWs7CisgICAgICBjYXNlIFNJRygnUicsJ0UnKToKKwlpZiAoYnVmZmVyKSBrZnJlZShidWZmZXIpOworCXJldHVybiAtMTsKKyAgICAgIGRlZmF1bHQ6CisJYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIE1BWUJFX0NPTlRJTlVFKHJlcGVhdCxpbm9kZSk7CisgIGlmIChidWZmZXIpIGtmcmVlKGJ1ZmZlcik7CisgIHJldHVybiByZXRuYW1sZW47IC8qIElmIDAsIHRoaXMgZmlsZSBkaWQgbm90IGhhdmUgYSBOTSBmaWVsZCAqLworIG91dDoKKyAgaWYoYnVmZmVyKSBrZnJlZShidWZmZXIpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcGFyc2Vfcm9ja19yaWRnZV9pbm9kZV9pbnRlcm5hbChzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKmRlLAorCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCByZWdhcmRfeGEpCit7CisgIGludCBsZW47CisgIHVuc2lnbmVkIGNoYXIgKiBjaHI7CisgIGludCBzeW1saW5rX2xlbiA9IDA7CisgIENPTlRJTlVFX0RFQ0xTOworCisgIGlmICghSVNPRlNfU0IoaW5vZGUtPmlfc2IpLT5zX3JvY2spIHJldHVybiAwOworCisgIFNFVFVQX1JPQ0tfUklER0UoZGUsIGNociwgbGVuKTsKKyAgaWYgKHJlZ2FyZF94YSkKKyAgIHsKKyAgICAgY2hyKz0xNDsKKyAgICAgbGVuLT0xNDsKKyAgICAgaWYgKGxlbjwwKSBsZW49MDsKKyAgIH0KKyAgIAorIHJlcGVhdDoKKyAgeworICAgIGludCBjbnQsIHNpZzsKKyAgICBzdHJ1Y3QgaW5vZGUgKiByZWxvYzsKKyAgICBzdHJ1Y3Qgcm9ja19yaWRnZSAqIHJyOworICAgIGludCByb290ZmxhZzsKKyAgICAKKyAgICB3aGlsZSAobGVuID4gMil7IC8qIFRoZXJlIG1heSBiZSBvbmUgYnl0ZSBmb3IgcGFkZGluZyBzb21ld2hlcmUgKi8KKyAgICAgIHJyID0gKHN0cnVjdCByb2NrX3JpZGdlICopIGNocjsKKyAgICAgIGlmIChyci0+bGVuIDwgMykgZ290byBvdXQ7IC8qIFNvbWV0aGluZyBnb3Qgc2NyZXdlZCB1cCBoZXJlICovCisgICAgICBzaWcgPSBpc29udW1fNzIxKGNocik7CisgICAgICBjaHIgKz0gcnItPmxlbjsgCisgICAgICBsZW4gLT0gcnItPmxlbjsKKyAgICAgIGlmIChsZW4gPCAwKSBnb3RvIG91dDsJLyogY29ycnVwdGVkIGlzb2ZzICovCisgICAgICAKKyAgICAgIHN3aXRjaChzaWcpeworI2lmbmRlZiBDT05GSUdfWklTT0ZTCQkvKiBObyBmbGFnIGZvciBTRiBvciBaRiAqLworICAgICAgY2FzZSBTSUcoJ1InLCdSJyk6CisJaWYoKHJyLT51LlJSLmZsYWdzWzBdICYgCisgCSAgICAoUlJfUFggfCBSUl9URiB8IFJSX1NMIHwgUlJfQ0wpKSA9PSAwKSBnb3RvIG91dDsKKwlicmVhazsKKyNlbmRpZgorICAgICAgY2FzZSBTSUcoJ1MnLCdQJyk6CisJQ0hFQ0tfU1AoZ290byBvdXQpOworCWJyZWFrOworICAgICAgY2FzZSBTSUcoJ0MnLCdFJyk6CisJQ0hFQ0tfQ0U7CisJYnJlYWs7CisgICAgICBjYXNlIFNJRygnRScsJ1InKToKKwlJU09GU19TQihpbm9kZS0+aV9zYiktPnNfcm9jayA9IDE7CisJcHJpbnRrKEtFUk5fREVCVUcgIklTTyA5NjYwIEV4dGVuc2lvbnM6ICIpOworCXsgaW50IHA7CisJICBmb3IocD0wO3A8cnItPnUuRVIubGVuX2lkO3ArKykgcHJpbnRrKCIlYyIscnItPnUuRVIuZGF0YVtwXSk7CisJfQorCSAgcHJpbnRrKCJcbiIpOworCWJyZWFrOworICAgICAgY2FzZSBTSUcoJ1AnLCdYJyk6CisJaW5vZGUtPmlfbW9kZSAgPSBpc29udW1fNzMzKHJyLT51LlBYLm1vZGUpOworCWlub2RlLT5pX25saW5rID0gaXNvbnVtXzczMyhyci0+dS5QWC5uX2xpbmtzKTsKKwlpbm9kZS0+aV91aWQgICA9IGlzb251bV83MzMocnItPnUuUFgudWlkKTsKKwlpbm9kZS0+aV9naWQgICA9IGlzb251bV83MzMocnItPnUuUFguZ2lkKTsKKwlicmVhazsKKyAgICAgIGNhc2UgU0lHKCdQJywnTicpOgorCXsgaW50IGhpZ2gsIGxvdzsKKwkgIGhpZ2ggPSBpc29udW1fNzMzKHJyLT51LlBOLmRldl9oaWdoKTsKKwkgIGxvdyA9IGlzb251bV83MzMocnItPnUuUE4uZGV2X2xvdyk7CisJICAvKgorCSAgICogVGhlIFJvY2sgUmlkZ2Ugc3RhbmRhcmQgc3BlY2lmaWVzIHRoYXQgaWYgc2l6ZW9mKGRldl90KSA8PSA0LAorCSAgICogdGhlbiB0aGUgaGlnaCBmaWVsZCBpcyB1bnVzZWQsIGFuZCB0aGUgZGV2aWNlIG51bWJlciBpcyBjb21wbGV0ZWx5CisJICAgKiBzdG9yZWQgaW4gdGhlIGxvdyBmaWVsZC4gIFNvbWUgd3JpdGVycyBtYXkgaWdub3JlIHRoaXMgc3VidGxldHksCisJICAgKiBhbmQgYXMgYSByZXN1bHQgd2UgdGVzdCB0byBzZWUgaWYgdGhlIGVudGlyZSBkZXZpY2UgbnVtYmVyIGlzCisJICAgKiBzdG9yZWQgaW4gdGhlIGxvdyBmaWVsZCwgYW5kIHVzZSB0aGF0LgorCSAgICovCisJICBpZigobG93ICYgfjB4ZmYpICYmIGhpZ2ggPT0gMCkgeworCSAgICBpbm9kZS0+aV9yZGV2ID0gTUtERVYobG93ID4+IDgsIGxvdyAmIDB4ZmYpOworCSAgfSBlbHNlIHsKKwkgICAgaW5vZGUtPmlfcmRldiA9IE1LREVWKGhpZ2gsIGxvdyk7CisJICB9CisJfQorCWJyZWFrOworICAgICAgY2FzZSBTSUcoJ1QnLCdGJyk6CisJLyogU29tZSBSUklQIHdyaXRlcnMgaW5jb3JyZWN0bHkgcGxhY2UgY3RpbWUgaW4gdGhlIFRGX0NSRUFURSBmaWVsZC4KKwkgICBUcnkgdG8gaGFuZGxlIHRoaXMgY29ycmVjdGx5IGZvciBlaXRoZXIgY2FzZS4gKi8KKwljbnQgPSAwOyAvKiBSb2NrIHJpZGdlIG5ldmVyIGFwcGVhcnMgb24gYSBIaWdoIFNpZXJyYSBkaXNrICovCisJaWYocnItPnUuVEYuZmxhZ3MgJiBURl9DUkVBVEUpIHsgCisJICBpbm9kZS0+aV9jdGltZS50dl9zZWMgPSBpc29fZGF0ZShyci0+dS5URi50aW1lc1tjbnQrK10udGltZSwgMCk7CisJICBpbm9kZS0+aV9jdGltZS50dl9uc2VjID0gMDsKKwl9CisJaWYocnItPnUuVEYuZmxhZ3MgJiBURl9NT0RJRlkpIHsKKwkgIGlub2RlLT5pX210aW1lLnR2X3NlYyA9IGlzb19kYXRlKHJyLT51LlRGLnRpbWVzW2NudCsrXS50aW1lLCAwKTsKKwkgIGlub2RlLT5pX210aW1lLnR2X25zZWMgPSAwOworCX0KKwlpZihyci0+dS5URi5mbGFncyAmIFRGX0FDQ0VTUykgeworCSAgaW5vZGUtPmlfYXRpbWUudHZfc2VjID0gaXNvX2RhdGUocnItPnUuVEYudGltZXNbY250KytdLnRpbWUsIDApOworCSAgaW5vZGUtPmlfYXRpbWUudHZfbnNlYyA9IDA7CisJfQorCWlmKHJyLT51LlRGLmZsYWdzICYgVEZfQVRUUklCVVRFUykgeyAKKwkgIGlub2RlLT5pX2N0aW1lLnR2X3NlYyA9IGlzb19kYXRlKHJyLT51LlRGLnRpbWVzW2NudCsrXS50aW1lLCAwKTsKKwkgIGlub2RlLT5pX2N0aW1lLnR2X25zZWMgPSAwOworCX0gCisJYnJlYWs7CisgICAgICBjYXNlIFNJRygnUycsJ0wnKToKKwl7aW50IHNsZW47CisJIHN0cnVjdCBTTF9jb21wb25lbnQgKiBzbHA7CisJIHN0cnVjdCBTTF9jb21wb25lbnQgKiBvbGRzbHA7CisJIHNsZW4gPSByci0+bGVuIC0gNTsKKwkgc2xwID0gJnJyLT51LlNMLmxpbms7CisJIGlub2RlLT5pX3NpemUgPSBzeW1saW5rX2xlbjsKKwkgd2hpbGUgKHNsZW4gPiAxKXsKKwkgICByb290ZmxhZyA9IDA7CisJICAgc3dpdGNoKHNscC0+ZmxhZ3MgJn4xKXsKKwkgICBjYXNlIDA6CisJICAgICBpbm9kZS0+aV9zaXplICs9IHNscC0+bGVuOworCSAgICAgYnJlYWs7CisJICAgY2FzZSAyOgorCSAgICAgaW5vZGUtPmlfc2l6ZSArPSAxOworCSAgICAgYnJlYWs7CisJICAgY2FzZSA0OgorCSAgICAgaW5vZGUtPmlfc2l6ZSArPSAyOworCSAgICAgYnJlYWs7CisJICAgY2FzZSA4OgorCSAgICAgcm9vdGZsYWcgPSAxOworCSAgICAgaW5vZGUtPmlfc2l6ZSArPSAxOworCSAgICAgYnJlYWs7CisJICAgZGVmYXVsdDoKKwkgICAgIHByaW50aygiU3ltbGluayBjb21wb25lbnQgZmxhZyBub3QgaW1wbGVtZW50ZWRcbiIpOworCSAgIH0KKwkgICBzbGVuIC09IHNscC0+bGVuICsgMjsKKwkgICBvbGRzbHAgPSBzbHA7CisJICAgc2xwID0gKHN0cnVjdCBTTF9jb21wb25lbnQgKikgKCgoY2hhciAqKSBzbHApICsgc2xwLT5sZW4gKyAyKTsKKworCSAgIGlmKHNsZW4gPCAyKSB7CisJICAgICBpZiggICAgKChyci0+dS5TTC5mbGFncyAmIDEpICE9IDApIAorCQkgICAgJiYgKChvbGRzbHAtPmZsYWdzICYgMSkgPT0gMCkgKSBpbm9kZS0+aV9zaXplICs9IDE7CisJICAgICBicmVhazsKKwkgICB9CisKKwkgICAvKgorCSAgICAqIElmIHRoaXMgY29tcG9uZW50IHJlY29yZCBpc24ndCBjb250aW51ZWQsIHRoZW4gYXBwZW5kIGEgJy8nLgorCSAgICAqLworCSAgIGlmICghcm9vdGZsYWcgJiYgKG9sZHNscC0+ZmxhZ3MgJiAxKSA9PSAwKQorCQkgICBpbm9kZS0+aV9zaXplICs9IDE7CisJIH0KKwl9CisJc3ltbGlua19sZW4gPSBpbm9kZS0+aV9zaXplOworCWJyZWFrOworICAgICAgY2FzZSBTSUcoJ1InLCdFJyk6CisJcHJpbnRrKEtFUk5fV0FSTklORyAiQXR0ZW1wdCB0byByZWFkIGlub2RlIGZvciByZWxvY2F0ZWQgZGlyZWN0b3J5XG4iKTsKKwlnb3RvIG91dDsKKyAgICAgIGNhc2UgU0lHKCdDJywnTCcpOgorCUlTT0ZTX0koaW5vZGUpLT5pX2ZpcnN0X2V4dGVudCA9IGlzb251bV83MzMocnItPnUuQ0wubG9jYXRpb24pOworCXJlbG9jID0gaXNvZnNfaWdldChpbm9kZS0+aV9zYiwgSVNPRlNfSShpbm9kZSktPmlfZmlyc3RfZXh0ZW50LCAwKTsKKwlpZiAoIXJlbG9jKQorCQlnb3RvIG91dDsKKwlpbm9kZS0+aV9tb2RlID0gcmVsb2MtPmlfbW9kZTsKKwlpbm9kZS0+aV9ubGluayA9IHJlbG9jLT5pX25saW5rOworCWlub2RlLT5pX3VpZCA9IHJlbG9jLT5pX3VpZDsKKwlpbm9kZS0+aV9naWQgPSByZWxvYy0+aV9naWQ7CisJaW5vZGUtPmlfcmRldiA9IHJlbG9jLT5pX3JkZXY7CisJaW5vZGUtPmlfc2l6ZSA9IHJlbG9jLT5pX3NpemU7CisJaW5vZGUtPmlfYmxvY2tzID0gcmVsb2MtPmlfYmxvY2tzOworCWlub2RlLT5pX2F0aW1lID0gcmVsb2MtPmlfYXRpbWU7CisJaW5vZGUtPmlfY3RpbWUgPSByZWxvYy0+aV9jdGltZTsKKwlpbm9kZS0+aV9tdGltZSA9IHJlbG9jLT5pX210aW1lOworCWlwdXQocmVsb2MpOworCWJyZWFrOworI2lmZGVmIENPTkZJR19aSVNPRlMKKyAgICAgIGNhc2UgU0lHKCdaJywnRicpOgorCSAgICAgIGlmICggIUlTT0ZTX1NCKGlub2RlLT5pX3NiKS0+c19ub2NvbXByZXNzICkgeworCQkgICAgICBpbnQgYWxnbzsKKwkJICAgICAgYWxnbyA9IGlzb251bV83MjEocnItPnUuWkYuYWxnb3JpdGhtKTsKKwkJICAgICAgaWYgKCBhbGdvID09IFNJRygncCcsJ3onKSApIHsKKwkJCSAgICAgIGludCBibG9ja19zaGlmdCA9IGlzb251bV83MTEoJnJyLT51LlpGLnBhcm1zWzFdKTsKKwkJCSAgICAgIGlmICggYmxvY2tfc2hpZnQgPCBQQUdFX0NBQ0hFX1NISUZUIHx8IGJsb2NrX3NoaWZ0ID4gMTcgKSB7CisJCQkJICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiaXNvZnM6IENhbid0IGhhbmRsZSBaRiBibG9jayBzaXplIG9mIDJeJWRcbiIsIGJsb2NrX3NoaWZ0KTsKKwkJCSAgICAgIH0gZWxzZSB7CisJCQkJLyogTm90ZTogd2UgZG9uJ3QgY2hhbmdlIGlfYmxvY2tzIGhlcmUgKi8KKwkJCQkgICAgICBJU09GU19JKGlub2RlKS0+aV9maWxlX2Zvcm1hdCA9IGlzb2ZzX2ZpbGVfY29tcHJlc3NlZDsKKwkJCQkvKiBQYXJhbWV0ZXJzIHRvIGNvbXByZXNzaW9uIGFsZ29yaXRobSAoaGVhZGVyIHNpemUsIGJsb2NrIHNpemUpICovCisJCQkJICAgICAgSVNPRlNfSShpbm9kZSktPmlfZm9ybWF0X3Bhcm1bMF0gPSBpc29udW1fNzExKCZyci0+dS5aRi5wYXJtc1swXSk7CisJCQkJICAgICAgSVNPRlNfSShpbm9kZSktPmlfZm9ybWF0X3Bhcm1bMV0gPSBpc29udW1fNzExKCZyci0+dS5aRi5wYXJtc1sxXSk7CisJCQkJICAgICAgaW5vZGUtPmlfc2l6ZSA9IGlzb251bV83MzMocnItPnUuWkYucmVhbF9zaXplKTsKKwkJCSAgICAgIH0KKwkJICAgICAgfSBlbHNlIHsKKwkJCSAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgImlzb2ZzOiBVbmtub3duIFpGIGNvbXByZXNzaW9uIGFsZ29yaXRobTogJWMlY1xuIiwKKwkJCQkgICAgIHJyLT51LlpGLmFsZ29yaXRobVswXSwgcnItPnUuWkYuYWxnb3JpdGhtWzFdKTsKKwkJICAgICAgfQorCSAgICAgIH0KKwkgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgZGVmYXVsdDoKKwlicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgTUFZQkVfQ09OVElOVUUocmVwZWF0LGlub2RlKTsKKyBvdXQ6CisgIGlmKGJ1ZmZlcikga2ZyZWUoYnVmZmVyKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjaGFyICpnZXRfc3ltbGlua19jaHVuayhjaGFyICpycG50LCBzdHJ1Y3Qgcm9ja19yaWRnZSAqcnIsIGNoYXIgKnBsaW1pdCkKK3sKKwlpbnQgc2xlbjsKKwlpbnQgcm9vdGZsYWc7CisJc3RydWN0IFNMX2NvbXBvbmVudCAqb2xkc2xwOworCXN0cnVjdCBTTF9jb21wb25lbnQgKnNscDsKKwlzbGVuID0gcnItPmxlbiAtIDU7CisJc2xwID0gJnJyLT51LlNMLmxpbms7CisJd2hpbGUgKHNsZW4gPiAxKSB7CisJCXJvb3RmbGFnID0gMDsKKwkJc3dpdGNoIChzbHAtPmZsYWdzICYgfjEpIHsKKwkJY2FzZSAwOgorCQkJaWYgKHNscC0+bGVuID4gcGxpbWl0IC0gcnBudCkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCW1lbWNweShycG50LCBzbHAtPnRleHQsIHNscC0+bGVuKTsKKwkJCXJwbnQrPXNscC0+bGVuOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWlmIChycG50ID49IHBsaW1pdCkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCSpycG50Kys9Jy4nOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCWlmICgyID4gcGxpbWl0IC0gcnBudCkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCSpycG50Kys9Jy4nOworCQkJKnJwbnQrKz0nLic7CisJCQlicmVhazsKKwkJY2FzZSA4OgorCQkJaWYgKHJwbnQgPj0gcGxpbWl0KQorCQkJCXJldHVybiBOVUxMOworCQkJcm9vdGZsYWcgPSAxOworCQkJKnJwbnQrKz0nLyc7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50aygiU3ltbGluayBjb21wb25lbnQgZmxhZyBub3QgaW1wbGVtZW50ZWQgKCVkKVxuIiwKKwkJCSAgICAgc2xwLT5mbGFncyk7CisJCX0KKwkJc2xlbiAtPSBzbHAtPmxlbiArIDI7CisJCW9sZHNscCA9IHNscDsKKwkJc2xwID0gKHN0cnVjdCBTTF9jb21wb25lbnQgKikgKChjaGFyICopIHNscCArIHNscC0+bGVuICsgMik7CisKKwkJaWYgKHNsZW4gPCAyKSB7CisJCQkvKgorCQkJICogSWYgdGhlcmUgaXMgYW5vdGhlciBTTCByZWNvcmQsIGFuZCB0aGlzIGNvbXBvbmVudAorCQkJICogcmVjb3JkIGlzbid0IGNvbnRpbnVlZCwgdGhlbiBhZGQgYSBzbGFzaC4KKwkJCSAqLworCQkJaWYgKCghcm9vdGZsYWcpICYmIChyci0+dS5TTC5mbGFncyAmIDEpICYmCisJCQkgICAgIShvbGRzbHAtPmZsYWdzICYgMSkpIHsKKwkJCQlpZiAocnBudCA+PSBwbGltaXQpCisJCQkJCXJldHVybiBOVUxMOworCQkJCSpycG50Kys9Jy8nOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBJZiB0aGlzIGNvbXBvbmVudCByZWNvcmQgaXNuJ3QgY29udGludWVkLCB0aGVuIGFwcGVuZCBhICcvJy4KKwkJICovCisJCWlmICghcm9vdGZsYWcgJiYgIShvbGRzbHAtPmZsYWdzICYgMSkpIHsKKwkJCWlmIChycG50ID49IHBsaW1pdCkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCSpycG50Kys9Jy8nOworCQl9CisJfQorCXJldHVybiBycG50OworfQorCitpbnQgcGFyc2Vfcm9ja19yaWRnZV9pbm9kZShzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKiBkZSwKKwkJCSAgIHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworICAgaW50IHJlc3VsdD1wYXJzZV9yb2NrX3JpZGdlX2lub2RlX2ludGVybmFsKGRlLGlub2RlLDApOworICAgLyogaWYgcm9ja3JpZGdlIGZsYWcgd2FzIHJlc2V0IGFuZCB3ZSBkaWRuJ3QgbG9vayBmb3IgYXR0cmlidXRlcworICAgICogYmVoaW5kIGV2ZW50dWFsIFhBIGF0dHJpYnV0ZXMsIGhhdmUgYSBsb29rIHRoZXJlICovCisgICBpZiAoKElTT0ZTX1NCKGlub2RlLT5pX3NiKS0+c19yb2NrX29mZnNldD09LTEpCisgICAgICAgJiYoSVNPRlNfU0IoaW5vZGUtPmlfc2IpLT5zX3JvY2s9PTIpKQorICAgICB7CisJcmVzdWx0PXBhcnNlX3JvY2tfcmlkZ2VfaW5vZGVfaW50ZXJuYWwoZGUsaW5vZGUsMTQpOworICAgICB9CisgICByZXR1cm4gcmVzdWx0OworfQorCisvKiByZWFkcGFnZSgpIGZvciBzeW1saW5rczogcmVhZHMgc3ltbGluayBjb250ZW50cyBpbnRvIHRoZSBwYWdlIGFuZCBlaXRoZXIKKyAgIG1ha2VzIGl0IHVwdG9kYXRlIGFuZCByZXR1cm5zIDAgb3IgcmV0dXJucyBlcnJvciAoLUVJTykgKi8KKworc3RhdGljIGludCByb2NrX3JpZGdlX3N5bWxpbmtfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworICAgICAgICBzdHJ1Y3QgaXNvX2lub2RlX2luZm8gKmVpID0gSVNPRlNfSShpbm9kZSk7CisJY2hhciAqbGluayA9IGttYXAocGFnZSk7CisJdW5zaWduZWQgbG9uZyBidWZzaXplID0gSVNPRlNfQlVGRkVSX1NJWkUoaW5vZGUpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJY2hhciAqcnBudCA9IGxpbms7CisJdW5zaWduZWQgY2hhciAqcG50OworCXN0cnVjdCBpc29fZGlyZWN0b3J5X3JlY29yZCAqcmF3X2lub2RlOworCUNPTlRJTlVFX0RFQ0xTOworCXVuc2lnbmVkIGxvbmcgYmxvY2ssIG9mZnNldDsKKwlpbnQgc2lnOworCWludCBsZW47CisJdW5zaWduZWQgY2hhciAqY2hyOworCXN0cnVjdCByb2NrX3JpZGdlICpycjsKKworCWlmICghSVNPRlNfU0IoaW5vZGUtPmlfc2IpLT5zX3JvY2spCisJCWdvdG8gZXJyb3I7CisKKwlibG9jayA9IGVpLT5pX2lnZXQ1X2Jsb2NrOworCWxvY2tfa2VybmVsKCk7CisJYmggPSBzYl9icmVhZChpbm9kZS0+aV9zYiwgYmxvY2spOworCWlmICghYmgpCisJCWdvdG8gb3V0X25vcmVhZDsKKworICAgICAgICBvZmZzZXQgPSBlaS0+aV9pZ2V0NV9vZmZzZXQ7CisJcG50ID0gKHVuc2lnbmVkIGNoYXIgKikgYmgtPmJfZGF0YSArIG9mZnNldDsKKworCXJhd19pbm9kZSA9IChzdHJ1Y3QgaXNvX2RpcmVjdG9yeV9yZWNvcmQgKikgcG50OworCisJLyoKKwkgKiBJZiB3ZSBnbyBwYXN0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciwgdGhlcmUgaXMgc29tZSBzb3J0IG9mIGVycm9yLgorCSAqLworCWlmIChvZmZzZXQgKyAqcG50ID4gYnVmc2l6ZSkKKwkJZ290byBvdXRfYmFkX3NwYW47CisKKwkvKiBOb3cgdGVzdCBmb3IgcG9zc2libGUgUm9jayBSaWRnZSBleHRlbnNpb25zIHdoaWNoIHdpbGwgb3ZlcnJpZGUKKwkgICBzb21lIG9mIHRoZXNlIG51bWJlcnMgaW4gdGhlIGlub2RlIHN0cnVjdHVyZS4gKi8KKworCVNFVFVQX1JPQ0tfUklER0UocmF3X2lub2RlLCBjaHIsIGxlbik7CisKKyAgICAgIHJlcGVhdDoKKwl3aGlsZSAobGVuID4gMikgeyAvKiBUaGVyZSBtYXkgYmUgb25lIGJ5dGUgZm9yIHBhZGRpbmcgc29tZXdoZXJlICovCisJCXJyID0gKHN0cnVjdCByb2NrX3JpZGdlICopIGNocjsKKwkJaWYgKHJyLT5sZW4gPCAzKQorCQkJZ290byBvdXQ7CS8qIFNvbWV0aGluZyBnb3Qgc2NyZXdlZCB1cCBoZXJlICovCisJCXNpZyA9IGlzb251bV83MjEoY2hyKTsKKwkJY2hyICs9IHJyLT5sZW47CisJCWxlbiAtPSByci0+bGVuOworCQlpZiAobGVuIDwgMCkKKwkJCWdvdG8gb3V0OwkvKiBjb3JydXB0ZWQgaXNvZnMgKi8KKworCQlzd2l0Y2ggKHNpZykgeworCQljYXNlIFNJRygnUicsICdSJyk6CisJCQlpZiAoKHJyLT51LlJSLmZsYWdzWzBdICYgUlJfU0wpID09IDApCisJCQkJZ290byBvdXQ7CisJCQlicmVhazsKKwkJY2FzZSBTSUcoJ1MnLCAnUCcpOgorCQkJQ0hFQ0tfU1AoZ290byBvdXQpOworCQkJYnJlYWs7CisJCWNhc2UgU0lHKCdTJywgJ0wnKToKKwkJCXJwbnQgPSBnZXRfc3ltbGlua19jaHVuayhycG50LCByciwKKwkJCQkJCSBsaW5rICsgKFBBR0VfU0laRSAtIDEpKTsKKwkJCWlmIChycG50ID09IE5VTEwpCisJCQkJZ290byBvdXQ7CisJCQlicmVhazsKKwkJY2FzZSBTSUcoJ0MnLCAnRScpOgorCQkJLyogVGhpcyB0ZWxscyBpcyBpZiB0aGVyZSBpcyBhIGNvbnRpbnVhdGlvbiByZWNvcmQgKi8KKwkJCUNIRUNLX0NFOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisJTUFZQkVfQ09OVElOVUUocmVwZWF0LCBpbm9kZSk7CisJaWYgKGJ1ZmZlcikKKwkJa2ZyZWUoYnVmZmVyKTsKKworCWlmIChycG50ID09IGxpbmspCisJCWdvdG8gZmFpbDsKKwlicmVsc2UoYmgpOworCSpycG50ID0gJ1wwJzsKKwl1bmxvY2tfa2VybmVsKCk7CisJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCWt1bm1hcChwYWdlKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXR1cm4gMDsKKworCS8qIGVycm9yIGV4aXQgZnJvbSBtYWNybyAqLworICAgICAgb3V0OgorCWlmIChidWZmZXIpCisJCWtmcmVlKGJ1ZmZlcik7CisJZ290byBmYWlsOworICAgICAgb3V0X25vcmVhZDoKKwlwcmludGsoInVuYWJsZSB0byByZWFkIGktbm9kZSBibG9jayIpOworCWdvdG8gZmFpbDsKKyAgICAgIG91dF9iYWRfc3BhbjoKKwlwcmludGsoInN5bWxpbmsgc3BhbnMgaXNvOTY2MCBibG9ja3NcbiIpOworICAgICAgZmFpbDoKKwlicmVsc2UoYmgpOworCXVubG9ja19rZXJuZWwoKTsKKyAgICAgIGVycm9yOgorCVNldFBhZ2VFcnJvcihwYWdlKTsKKwlrdW5tYXAocGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIC1FSU87Cit9CisKK3N0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgaXNvZnNfc3ltbGlua19hb3BzID0geworCS5yZWFkcGFnZQk9IHJvY2tfcmlkZ2Vfc3ltbGlua19yZWFkcGFnZQorfTsKZGlmZiAtLWdpdCBhL2ZzL2lzb2ZzL3JvY2suaCBiL2ZzL2lzb2ZzL3JvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWFmNWM4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvaXNvZnMvcm9jay5oCkBAIC0wLDAgKzEsMTE5IEBACisvKiBUaGVzZSBzdHJ1Y3RzIGFyZSB1c2VkIGJ5IHRoZSBzeXN0ZW0tdXNlLXNoYXJpbmcgcHJvdG9jb2wsIGluIHdoaWNoIHRoZQorICAgUm9jayBSaWRnZSBleHRlbnNpb25zIGFyZSBlbWJlZGRlZC4gIEl0IGlzIHF1aXRlIHBvc3NpYmxlIHRoYXQgb3RoZXIKKyAgIGV4dGVuc2lvbnMgYXJlIHByZXNlbnQgb24gdGhlIGRpc2ssIGFuZCB0aGlzIGlzIGZpbmUgYXMgbG9uZyBhcyB0aGV5CisgICBhbGwgdXNlIFNVU1AgKi8KKworc3RydWN0IFNVX1NQeworICB1bnNpZ25lZCBjaGFyIG1hZ2ljWzJdOworICB1bnNpZ25lZCBjaGFyIHNraXA7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgU1VfQ0V7CisgIGNoYXIgZXh0ZW50WzhdOworICBjaGFyIG9mZnNldFs4XTsKKyAgY2hhciBzaXplWzhdOworfTsKKworc3RydWN0IFNVX0VSeworICB1bnNpZ25lZCBjaGFyIGxlbl9pZDsKKyAgdW5zaWduZWQgY2hhciBsZW5fZGVzOworICB1bnNpZ25lZCBjaGFyIGxlbl9zcmM7CisgIHVuc2lnbmVkIGNoYXIgZXh0X3ZlcjsKKyAgY2hhciBkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IFJSX1JSeworICBjaGFyIGZsYWdzWzFdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IFJSX1BYeworICBjaGFyIG1vZGVbOF07CisgIGNoYXIgbl9saW5rc1s4XTsKKyAgY2hhciB1aWRbOF07CisgIGNoYXIgZ2lkWzhdOworfTsKKworc3RydWN0IFJSX1BOeworICBjaGFyIGRldl9oaWdoWzhdOworICBjaGFyIGRldl9sb3dbOF07Cit9OworCisKK3N0cnVjdCBTTF9jb21wb25lbnR7CisgIHVuc2lnbmVkIGNoYXIgZmxhZ3M7CisgIHVuc2lnbmVkIGNoYXIgbGVuOworICBjaGFyIHRleHRbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgUlJfU0x7CisgIHVuc2lnbmVkIGNoYXIgZmxhZ3M7CisgIHN0cnVjdCBTTF9jb21wb25lbnQgbGluazsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBSUl9OTXsKKyAgdW5zaWduZWQgY2hhciBmbGFnczsKKyAgY2hhciBuYW1lWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IFJSX0NMeworICBjaGFyIGxvY2F0aW9uWzhdOworfTsKKworc3RydWN0IFJSX1BMeworICBjaGFyIGxvY2F0aW9uWzhdOworfTsKKworc3RydWN0IHN0YW1weworICBjaGFyIHRpbWVbN107Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgUlJfVEZ7CisgIGNoYXIgZmxhZ3M7CisgIHN0cnVjdCBzdGFtcCB0aW1lc1swXTsgIC8qIFZhcmlhYmxlIG51bWJlciBvZiB0aGVzZSBiZWFzdHMgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIExpbnV4LXNwZWNpZmljIGV4dGVuc2lvbiBmb3IgdHJhbnNwYXJlbnQgZGVjb21wcmVzc2lvbiAqLworc3RydWN0IFJSX1pGeworICBjaGFyIGFsZ29yaXRobVsyXTsKKyAgY2hhciBwYXJtc1syXTsKKyAgY2hhciByZWFsX3NpemVbOF07Cit9OworCisvKiBUaGVzZSBhcmUgdGhlIGJpdHMgYW5kIHRoZWlyIG1lYW5pbmdzIGZvciBmbGFncyBpbiB0aGUgVEYgc3RydWN0dXJlLiAqLworI2RlZmluZSBURl9DUkVBVEUgMQorI2RlZmluZSBURl9NT0RJRlkgMgorI2RlZmluZSBURl9BQ0NFU1MgNAorI2RlZmluZSBURl9BVFRSSUJVVEVTIDgKKyNkZWZpbmUgVEZfQkFDS1VQIDE2CisjZGVmaW5lIFRGX0VYUElSQVRJT04gMzIKKyNkZWZpbmUgVEZfRUZGRUNUSVZFIDY0CisjZGVmaW5lIFRGX0xPTkdfRk9STSAxMjgKKworc3RydWN0IHJvY2tfcmlkZ2V7CisgIGNoYXIgc2lnbmF0dXJlWzJdOworICB1bnNpZ25lZCBjaGFyIGxlbjsKKyAgdW5zaWduZWQgY2hhciB2ZXJzaW9uOworICB1bmlvbnsKKyAgICBzdHJ1Y3QgU1VfU1AgU1A7CisgICAgc3RydWN0IFNVX0NFIENFOworICAgIHN0cnVjdCBTVV9FUiBFUjsKKyAgICBzdHJ1Y3QgUlJfUlIgUlI7CisgICAgc3RydWN0IFJSX1BYIFBYOworICAgIHN0cnVjdCBSUl9QTiBQTjsKKyAgICBzdHJ1Y3QgUlJfU0wgU0w7CisgICAgc3RydWN0IFJSX05NIE5NOworICAgIHN0cnVjdCBSUl9DTCBDTDsKKyAgICBzdHJ1Y3QgUlJfUEwgUEw7CisgICAgc3RydWN0IFJSX1RGIFRGOworICAgIHN0cnVjdCBSUl9aRiBaRjsKKyAgfSB1OworfTsKKworI2RlZmluZSBSUl9QWCAxICAgLyogUE9TSVggYXR0cmlidXRlcyAqLworI2RlZmluZSBSUl9QTiAyICAgLyogUE9TSVggZGV2aWNlcyAqLworI2RlZmluZSBSUl9TTCA0ICAgLyogU3ltYm9saWMgbGluayAqLworI2RlZmluZSBSUl9OTSA4ICAgLyogQWx0ZXJuYXRlIE5hbWUgKi8KKyNkZWZpbmUgUlJfQ0wgMTYgIC8qIENoaWxkIGxpbmsgKi8KKyNkZWZpbmUgUlJfUEwgMzIgIC8qIFBhcmVudCBsaW5rICovCisjZGVmaW5lIFJSX1JFIDY0ICAvKiBSZWxvY2F0aW9uIGRpcmVjdG9yeSAqLworI2RlZmluZSBSUl9URiAxMjggLyogVGltZXN0YW1wcyAqLwpkaWZmIC0tZ2l0IGEvZnMvaXNvZnMvdXRpbC5jIGIvZnMvaXNvZnMvdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNmQ5YzEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9pc29mcy91dGlsLmMKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqICBsaW51eC9mcy9pc29mcy91dGlsLmMKKyAqLworCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaXNvX2ZzLmg+CisKKy8qIAorICogV2UgaGF2ZSB0byBjb252ZXJ0IGZyb20gYSBNTS9ERC9ZWSBmb3JtYXQgdG8gdGhlIFVuaXggY3RpbWUgZm9ybWF0LgorICogV2UgaGF2ZSB0byB0YWtlIGludG8gYWNjb3VudCBsZWFwIHllYXJzIGFuZCBhbGwgb2YgdGhhdCBnb29kIHN0dWZmLgorICogVW5mb3J0dW5hdGVseSwgdGhlIGtlcm5lbCBkb2VzIG5vdCBoYXZlIHRoZSBpbmZvcm1hdGlvbiBvbiBoYW5kIHRvCisgKiB0YWtlIGludG8gYWNjb3VudCBkYXlsaWdodCBzYXZpbmdzIHRpbWUsIGJ1dCBpdCBzaG91bGRuJ3QgbWF0dGVyLgorICogVGhlIHRpbWUgc3RvcmVkIHNob3VsZCBiZSBsb2NhbHRpbWUgKHdpdGggb3Igd2l0aG91dCBEU1QgaW4gZWZmZWN0KSwKKyAqIGFuZCB0aGUgdGltZXpvbmUgb2Zmc2V0IHNob3VsZCBob2xkIHRoZSBvZmZzZXQgcmVxdWlyZWQgdG8gZ2V0IGJhY2sKKyAqIHRvIEdNVC4gIFRodXMgIHdlIHNob3VsZCBhbHdheXMgYmUgY29ycmVjdC4KKyAqLworCitpbnQgaXNvX2RhdGUoY2hhciAqIHAsIGludCBmbGFnKQoreworCWludCB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgdHo7CisJaW50IGNydGltZSwgZGF5cywgaTsKKworCXllYXIgPSBwWzBdIC0gNzA7CisJbW9udGggPSBwWzFdOworCWRheSA9IHBbMl07CisJaG91ciA9IHBbM107CisJbWludXRlID0gcFs0XTsKKwlzZWNvbmQgPSBwWzVdOworCWlmIChmbGFnID09IDApIHR6ID0gcFs2XTsgLyogSGlnaCBzaWVycmEgaGFzIG5vIHRpbWUgem9uZSAqLworCWVsc2UgdHogPSAwOworCQorCWlmICh5ZWFyIDwgMCkgeworCQljcnRpbWUgPSAwOworCX0gZWxzZSB7CisJCWludCBtb25sZW5bMTJdID0gezMxLDI4LDMxLDMwLDMxLDMwLDMxLDMxLDMwLDMxLDMwLDMxfTsKKworCQlkYXlzID0geWVhciAqIDM2NTsKKwkJaWYgKHllYXIgPiAyKQorCQkJZGF5cyArPSAoeWVhcisxKSAvIDQ7CisJCWZvciAoaSA9IDE7IGkgPCBtb250aDsgaSsrKQorCQkJZGF5cyArPSBtb25sZW5baS0xXTsKKwkJaWYgKCgoeWVhcisyKSAlIDQpID09IDAgJiYgbW9udGggPiAyKQorCQkJZGF5cysrOworCQlkYXlzICs9IGRheSAtIDE7CisJCWNydGltZSA9ICgoKChkYXlzICogMjQpICsgaG91cikgKiA2MCArIG1pbnV0ZSkgKiA2MCkKKwkJCSsgc2Vjb25kOworCisJCS8qIHNpZ24gZXh0ZW5kICovCisJCWlmICh0eiAmIDB4ODApCisJCQl0eiB8PSAoLTEgPDwgOCk7CisJCQorCQkvKiAKKwkJICogVGhlIHRpbWV6b25lIG9mZnNldCBpcyB1bnJlbGlhYmxlIG9uIHNvbWUgZGlza3MsCisJCSAqIHNvIHdlIG1ha2UgYSBzYW5pdHkgY2hlY2suICBJbiBubyBjYXNlIGlzIGl0IGV2ZXIKKwkJICogbW9yZSB0aGFuIDEzIGhvdXJzIGZyb20gR01ULCB3aGljaCBpcyA1MioxNW1pbi4KKwkJICogVGhlIHRpbWUgaXMgYWx3YXlzIHN0b3JlZCBpbiBsb2NhbHRpbWUgd2l0aCB0aGUKKwkJICogdGltZXpvbmUgb2Zmc2V0IGJlaW5nIHdoYXQgZ2V0IGFkZGVkIHRvIEdNVCB0bworCQkgKiBnZXQgdG8gbG9jYWx0aW1lLiAgVGh1cyB3ZSBuZWVkIHRvIHN1YnRyYWN0IHRoZSBvZmZzZXQKKwkJICogdG8gZ2V0IHRvIHRydWUgR01ULCB3aGljaCBpcyB3aGF0IHdlIHN0b3JlIHRoZSB0aW1lCisJCSAqIGFzIGludGVybmFsbHkuICBPbiB0aGUgbG9jYWwgc3lzdGVtLCB0aGUgdXNlciBtYXkgc2V0CisJCSAqIHRoZWlyIHRpbWV6b25lIGFueSB3YXkgdGhleSB3aXNoLCBvZiBjb3Vyc2UsIHNvIEdNVAorCQkgKiBnZXRzIGNvbnZlcnRlZCBiYWNrIHRvIGxvY2FsdGltZSBvbiB0aGUgcmVjZWl2aW5nCisJCSAqIHN5c3RlbS4KKwkJICoKKwkJICogTk9URTogbWtpc29mcyBpbiB2ZXJzaW9ucyBwcmlvciB0byBta2lzb2ZzLTEuMTAgaGFkCisJCSAqIHRoZSBzaWduIHdyb25nIG9uIHRoZSB0aW1lem9uZSBvZmZzZXQuICBUaGlzIGhhcyBub3cKKwkJICogYmVlbiBjb3JyZWN0ZWQgdGhlcmUgdG9vLCBidXQgaWYgeW91IGFyZSBnZXR0aW5nIHNjcmV3eQorCQkgKiByZXN1bHRzIHRoaXMgbWF5IGJlIHRoZSBleHBsYW5hdGlvbi4gIElmIGVub3VnaCBwZW9wbGUKKwkJICogY29tcGxhaW4sIGEgdXNlciBjb25maWd1cmF0aW9uIG9wdGlvbiBjb3VsZCBiZSBhZGRlZAorCQkgKiB0byBhZGQgdGhlIHRpbWV6b25lIG9mZnNldCBpbiB3aXRoIHRoZSB3cm9uZyBzaWduCisJCSAqIGZvciAnY29tcGF0aWJpbGl0eScgd2l0aCBvbGRlciBkaXNjcywgYnV0IEkgY2Fubm90IHNlZSBob3cKKwkJICogaXQgd2lsbCBtYXR0ZXIgdGhhdCBtdWNoLgorCQkgKgorCQkgKiBUaGFua3MgdG8ga3VobG1hdkBlbGVjLmNhbnRlcmJ1cnkuYWMubnogKFZvbGtlciBLdWhsbWFubikKKwkJICogZm9yIHBvaW50aW5nIG91dCB0aGUgc2lnbiBlcnJvci4KKwkJICovCisJCWlmICgtNTIgPD0gdHogJiYgdHogPD0gNTIpCisJCQljcnRpbWUgLT0gdHogKiAxNSAqIDYwOworCX0KKwlyZXR1cm4gY3J0aW1lOworfQkJCisJCmRpZmYgLS1naXQgYS9mcy9pc29mcy96aXNvZnMuaCBiL2ZzL2lzb2ZzL3ppc29mcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ODQ4NWQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9pc29mcy96aXNvZnMuaApAQCAtMCwwICsxLDIxIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKiAgIAorICogICBDb3B5cmlnaHQgMjAwMSBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlIE1BIDAyMTM5LAorICogICBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisgKiAgIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBQcm90b3R5cGVzIGZvciBmdW5jdGlvbnMgZXhwb3J0ZWQgZnJvbSB0aGUgY29tcHJlc3NlZCBpc29mcyBzdWJzeXN0ZW0KKyAqLworCisjaWZkZWYgQ09ORklHX1pJU09GUworZXh0ZXJuIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgemlzb2ZzX2FvcHM7CitleHRlcm4gaW50IF9faW5pdCB6aXNvZnNfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIHppc29mc19jbGVhbnVwKHZvaWQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9qYmQvTWFrZWZpbGUgYi9mcy9qYmQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRhY2E0OAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2piZC9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBqb3VybmFsaW5nIHJvdXRpbmVzLgorIworCitvYmotJChDT05GSUdfSkJEKSArPSBqYmQubworCitqYmQtb2JqcyA6PSB0cmFuc2FjdGlvbi5vIGNvbW1pdC5vIHJlY292ZXJ5Lm8gY2hlY2twb2ludC5vIHJldm9rZS5vIGpvdXJuYWwubwpkaWZmIC0tZ2l0IGEvZnMvamJkL2NoZWNrcG9pbnQuYyBiL2ZzL2piZC9jaGVja3BvaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThkODMwNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2piZC9jaGVja3BvaW50LmMKQEAgLTAsMCArMSw2MzYgQEAKKy8qCisgKiBsaW51eC9mcy9jaGVja3BvaW50LmMKKyAqIAorICogV3JpdHRlbiBieSBTdGVwaGVuIEMuIFR3ZWVkaWUgPHNjdEByZWRoYXQuY29tPiwgMTk5OQorICoKKyAqIENvcHlyaWdodCAxOTk5IFJlZCBIYXQgU29mdHdhcmUgLS0tIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBvciBhdCB5b3VyCisgKiBvcHRpb24sIGFueSBsYXRlciB2ZXJzaW9uLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiBDaGVja3BvaW50IHJvdXRpbmVzIGZvciB0aGUgZ2VuZXJpYyBmaWxlc3lzdGVtIGpvdXJuYWxpbmcgY29kZS4gIAorICogUGFydCBvZiB0aGUgZXh0MmZzIGpvdXJuYWxpbmcgc3lzdGVtLiAgCisgKgorICogQ2hlY2twb2ludGluZyBpcyB0aGUgcHJvY2VzcyBvZiBlbnN1cmluZyB0aGF0IGEgc2VjdGlvbiBvZiB0aGUgbG9nIGlzCisgKiBjb21taXR0ZWQgZnVsbHkgdG8gZGlzaywgc28gdGhhdCB0aGF0IHBvcnRpb24gb2YgdGhlIGxvZyBjYW4gYmUKKyAqIHJldXNlZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvamJkLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKy8qCisgKiBVbmxpbmsgYSBidWZmZXIgZnJvbSBhIHRyYW5zYWN0aW9uLiAKKyAqCisgKiBDYWxsZWQgd2l0aCBqX2xpc3RfbG9jayBoZWxkLgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2J1ZmZlcl91bmxpbmsoc3RydWN0IGpvdXJuYWxfaGVhZCAqamgpCit7CisJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb247CisKKwl0cmFuc2FjdGlvbiA9IGpoLT5iX2NwX3RyYW5zYWN0aW9uOworCWpoLT5iX2NwX3RyYW5zYWN0aW9uID0gTlVMTDsKKworCWpoLT5iX2NwbmV4dC0+Yl9jcHByZXYgPSBqaC0+Yl9jcHByZXY7CisJamgtPmJfY3BwcmV2LT5iX2NwbmV4dCA9IGpoLT5iX2NwbmV4dDsKKwlpZiAodHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9saXN0ID09IGpoKQorCQl0cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2xpc3QgPSBqaC0+Yl9jcG5leHQ7CisJaWYgKHRyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdCA9PSBqaCkKKwkJdHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9saXN0ID0gTlVMTDsKK30KKworLyoKKyAqIFRyeSB0byByZWxlYXNlIGEgY2hlY2twb2ludGVkIGJ1ZmZlciBmcm9tIGl0cyB0cmFuc2FjdGlvbi4KKyAqIFJldHVybnMgMSBpZiB3ZSByZWxlYXNlZCBpdC4KKyAqIFJlcXVpcmVzIGpfbGlzdF9sb2NrCisgKiBDYWxsZWQgdW5kZXIgamJkX2xvY2tfYmhfc3RhdGUoamgyYmgoamgpKSwgYW5kIGRyb3BzIGl0CisgKi8KK3N0YXRpYyBpbnQgX190cnlfdG9fZnJlZV9jcF9idWYoc3RydWN0IGpvdXJuYWxfaGVhZCAqamgpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGpoMmJoKGpoKTsKKworCWlmIChqaC0+Yl9qbGlzdCA9PSBCSl9Ob25lICYmICFidWZmZXJfbG9ja2VkKGJoKSAmJiAhYnVmZmVyX2RpcnR5KGJoKSkgeworCQlKQlVGRkVSX1RSQUNFKGpoLCAicmVtb3ZlIGZyb20gY2hlY2twb2ludCBsaXN0Iik7CisJCV9fam91cm5hbF9yZW1vdmVfY2hlY2twb2ludChqaCk7CisJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQlqb3VybmFsX3JlbW92ZV9qb3VybmFsX2hlYWQoYmgpOworCQlCVUZGRVJfVFJBQ0UoYmgsICJyZWxlYXNlIik7CisJCV9fYnJlbHNlKGJoKTsKKwkJcmV0ID0gMTsKKwl9IGVsc2UgeworCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIF9fbG9nX3dhaXRfZm9yX3NwYWNlOiB3YWl0IHVudGlsIHRoZXJlIGlzIHNwYWNlIGluIHRoZSBqb3VybmFsLgorICoKKyAqIENhbGxlZCB1bmRlciBqLXN0YXRlX2xvY2sgKm9ubHkqLiAgSXQgd2lsbCBiZSB1bmxvY2tlZCBpZiB3ZSBoYXZlIHRvIHdhaXQKKyAqIGZvciBhIGNoZWNrcG9pbnQgdG8gZnJlZSB1cCBzb21lIHNwYWNlIGluIHRoZSBsb2cuCisgKi8KK3ZvaWQgX19sb2dfd2FpdF9mb3Jfc3BhY2Uoam91cm5hbF90ICpqb3VybmFsKQoreworCWludCBuYmxvY2tzOworCWFzc2VydF9zcGluX2xvY2tlZCgmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKworCW5ibG9ja3MgPSBqYmRfc3BhY2VfbmVlZGVkKGpvdXJuYWwpOworCXdoaWxlIChfX2xvZ19zcGFjZV9sZWZ0KGpvdXJuYWwpIDwgbmJsb2NrcykgeworCQlpZiAoam91cm5hbC0+al9mbGFncyAmIEpGU19BQk9SVCkKKwkJCXJldHVybjsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJCWRvd24oJmpvdXJuYWwtPmpfY2hlY2twb2ludF9zZW0pOworCisJCS8qCisJCSAqIFRlc3QgYWdhaW4sIGFub3RoZXIgcHJvY2VzcyBtYXkgaGF2ZSBjaGVja3BvaW50ZWQgd2hpbGUgd2UKKwkJICogd2VyZSB3YWl0aW5nIGZvciB0aGUgY2hlY2twb2ludCBsb2NrCisJCSAqLworCQlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJCW5ibG9ja3MgPSBqYmRfc3BhY2VfbmVlZGVkKGpvdXJuYWwpOworCQlpZiAoX19sb2dfc3BhY2VfbGVmdChqb3VybmFsKSA8IG5ibG9ja3MpIHsKKwkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCQkJbG9nX2RvX2NoZWNrcG9pbnQoam91cm5hbCk7CisJCQlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJCX0KKwkJdXAoJmpvdXJuYWwtPmpfY2hlY2twb2ludF9zZW0pOworCX0KK30KKworLyoKKyAqIFdlIHdlcmUgdW5hYmxlIHRvIHBlcmZvcm0gamJkX3RyeWxvY2tfYmhfc3RhdGUoKSBpbnNpZGUgal9saXN0X2xvY2suCisgKiBUaGUgY2FsbGVyIG11c3QgcmVzdGFydCBhIGxpc3Qgd2Fsay4gIFdhaXQgZm9yIHNvbWVvbmUgZWxzZSB0byBydW4KKyAqIGpiZF91bmxvY2tfYmhfc3RhdGUoKS4KKyAqLworc3RhdGljIHZvaWQgamJkX3N5bmNfYmgoam91cm5hbF90ICpqb3VybmFsLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWdldF9iaChiaCk7CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwlqYmRfbG9ja19iaF9zdGF0ZShiaCk7CisJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisJcHV0X2JoKGJoKTsKK30KKworLyoKKyAqIENsZWFuIHVwIGEgdHJhbnNhY3Rpb24ncyBjaGVja3BvaW50IGxpc3QuICAKKyAqCisgKiBXZSB3YWl0IGZvciBhbnkgcGVuZGluZyBJTyB0byBjb21wbGV0ZSBhbmQgbWFrZSBzdXJlIGFueSBjbGVhbgorICogYnVmZmVycyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSB0cmFuc2FjdGlvbi4gCisgKgorICogUmV0dXJuIDEgaWYgd2UgcGVyZm9ybWVkIGFueSBhY3Rpb25zIHdoaWNoIG1pZ2h0IGhhdmUgZGVzdHJveWVkIHRoZQorICogY2hlY2twb2ludC4gIChqb3VybmFsX3JlbW92ZV9jaGVja3BvaW50KCkgZGVsZXRlcyB0aGUgdHJhbnNhY3Rpb24gd2hlbgorICogdGhlIGxhc3QgY2hlY2twb2ludCBidWZmZXIgaXMgY2xlYW5zZWQpCisgKgorICogQ2FsbGVkIHdpdGggal9saXN0X2xvY2sgaGVsZC4KKyAqLworc3RhdGljIGludCBfX2NsZWFudXBfdHJhbnNhY3Rpb24oam91cm5hbF90ICpqb3VybmFsLCB0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbikKK3sKKwlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCwgKm5leHRfamgsICpsYXN0X2poOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaW50IHJldCA9IDA7CisKKwlhc3NlcnRfc3Bpbl9sb2NrZWQoJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwlqaCA9IHRyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdDsKKwlpZiAoIWpoKQorCQlyZXR1cm4gMDsKKworCWxhc3RfamggPSBqaC0+Yl9jcHByZXY7CisJbmV4dF9qaCA9IGpoOworCWRvIHsKKwkJamggPSBuZXh0X2poOworCQliaCA9IGpoMmJoKGpoKTsKKwkJaWYgKGJ1ZmZlcl9sb2NrZWQoYmgpKSB7CisJCQlhdG9taWNfaW5jKCZiaC0+Yl9jb3VudCk7CisJCQlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCQkJd2FpdF9vbl9idWZmZXIoYmgpOworCQkJLyogdGhlIGpvdXJuYWxfaGVhZCBtYXkgaGF2ZSBnb25lIGJ5IG5vdyAqLworCQkJQlVGRkVSX1RSQUNFKGJoLCAiYnJlbHNlIik7CisJCQlfX2JyZWxzZShiaCk7CisJCQlnb3RvIG91dF9yZXR1cm5fMTsKKwkJfQorCisJCS8qCisJCSAqIFRoaXMgaXMgZm91bAorCQkgKi8KKwkJaWYgKCFqYmRfdHJ5bG9ja19iaF9zdGF0ZShiaCkpIHsKKwkJCWpiZF9zeW5jX2JoKGpvdXJuYWwsIGJoKTsKKwkJCWdvdG8gb3V0X3JldHVybl8xOworCQl9CisKKwkJaWYgKGpoLT5iX3RyYW5zYWN0aW9uICE9IE5VTEwpIHsKKwkJCXRyYW5zYWN0aW9uX3QgKnQgPSBqaC0+Yl90cmFuc2FjdGlvbjsKKwkJCXRpZF90IHRpZCA9IHQtPnRfdGlkOworCisJCQlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCQkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisJCQlsb2dfc3RhcnRfY29tbWl0KGpvdXJuYWwsIHRpZCk7CisJCQlsb2dfd2FpdF9jb21taXQoam91cm5hbCwgdGlkKTsKKwkJCWdvdG8gb3V0X3JldHVybl8xOworCQl9CisKKwkJLyoKKwkJICogQUtQTTogSSB0aGluayB0aGUgYnVmZmVyX2piZGRpcnR5IHRlc3QgaXMgcmVkdW5kYW50IC0gaXQKKwkJICogc2hvdWxkbid0IGhhdmUgTlVMTCBiX3RyYW5zYWN0aW9uPworCQkgKi8KKwkJbmV4dF9qaCA9IGpoLT5iX2NwbmV4dDsKKwkJaWYgKCFidWZmZXJfZGlydHkoYmgpICYmICFidWZmZXJfamJkZGlydHkoYmgpKSB7CisJCQlCVUZGRVJfVFJBQ0UoYmgsICJyZW1vdmUgZnJvbSBjaGVja3BvaW50Iik7CisJCQlfX2pvdXJuYWxfcmVtb3ZlX2NoZWNrcG9pbnQoamgpOworCQkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisJCQlqb3VybmFsX3JlbW92ZV9qb3VybmFsX2hlYWQoYmgpOworCQkJX19icmVsc2UoYmgpOworCQkJcmV0ID0gMTsKKwkJfSBlbHNlIHsKKwkJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQl9CisJCWpoID0gbmV4dF9qaDsKKwl9IHdoaWxlIChqaCAhPSBsYXN0X2poKTsKKworCXJldHVybiByZXQ7CitvdXRfcmV0dXJuXzE6CisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJcmV0dXJuIDE7Cit9CisKKyNkZWZpbmUgTlJfQkFUQ0gJNjQKKworc3RhdGljIHZvaWQKK19fZmx1c2hfYmF0Y2goam91cm5hbF90ICpqb3VybmFsLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaHMsIGludCAqYmF0Y2hfY291bnQpCit7CisJaW50IGk7CisKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCWxsX3J3X2Jsb2NrKFdSSVRFLCAqYmF0Y2hfY291bnQsIGJocyk7CisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJZm9yIChpID0gMDsgaSA8ICpiYXRjaF9jb3VudDsgaSsrKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBiaHNbaV07CisJCWNsZWFyX2J1ZmZlcl9qd3JpdGUoYmgpOworCQlCVUZGRVJfVFJBQ0UoYmgsICJicmVsc2UiKTsKKwkJX19icmVsc2UoYmgpOworCX0KKwkqYmF0Y2hfY291bnQgPSAwOworfQorCisvKgorICogVHJ5IHRvIGZsdXNoIG9uZSBidWZmZXIgZnJvbSB0aGUgY2hlY2twb2ludCBsaXN0IHRvIGRpc2suCisgKgorICogUmV0dXJuIDEgaWYgc29tZXRoaW5nIGhhcHBlbmVkIHdoaWNoIHJlcXVpcmVzIHVzIHRvIGFib3J0IHRoZSBjdXJyZW50CisgKiBzY2FuIG9mIHRoZSBjaGVja3BvaW50IGxpc3QuICAKKyAqCisgKiBDYWxsZWQgd2l0aCBqX2xpc3RfbG9jayBoZWxkLgorICogQ2FsbGVkIHVuZGVyIGpiZF9sb2NrX2JoX3N0YXRlKGpoMmJoKGpoKSksIGFuZCBkcm9wcyBpdAorICovCitzdGF0aWMgaW50IF9fZmx1c2hfYnVmZmVyKGpvdXJuYWxfdCAqam91cm5hbCwgc3RydWN0IGpvdXJuYWxfaGVhZCAqamgsCisJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaHMsIGludCAqYmF0Y2hfY291bnQsCisJCQlpbnQgKmRyb3BfY291bnQpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGpoMmJoKGpoKTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChidWZmZXJfZGlydHkoYmgpICYmICFidWZmZXJfbG9ja2VkKGJoKSAmJiBqaC0+Yl9qbGlzdCA9PSBCSl9Ob25lKSB7CisJCUpfQVNTRVJUX0pIKGpoLCBqaC0+Yl90cmFuc2FjdGlvbiA9PSBOVUxMKTsKKworCQkvKgorCQkgKiBJbXBvcnRhbnQ6IHdlIGFyZSBhYm91dCB0byB3cml0ZSB0aGUgYnVmZmVyLCBhbmQKKwkJICogcG9zc2libHkgYmxvY2ssIHdoaWxlIHN0aWxsIGhvbGRpbmcgdGhlIGpvdXJuYWwgbG9jay4KKwkJICogV2UgY2Fubm90IGFmZm9yZCB0byBsZXQgdGhlIHRyYW5zYWN0aW9uIGxvZ2ljIHN0YXJ0CisJCSAqIG1lc3NpbmcgYXJvdW5kIHdpdGggdGhpcyBidWZmZXIgYmVmb3JlIHdlIHdyaXRlIGl0IHRvCisJCSAqIGRpc2ssIGFzIHRoYXQgd291bGQgYnJlYWsgcmVjb3ZlcmFiaWxpdHkuICAKKwkJICovCisJCUJVRkZFUl9UUkFDRShiaCwgInF1ZXVlIik7CisJCWdldF9iaChiaCk7CisJCUpfQVNTRVJUX0JIKGJoLCAhYnVmZmVyX2p3cml0ZShiaCkpOworCQlzZXRfYnVmZmVyX2p3cml0ZShiaCk7CisJCWJoc1sqYmF0Y2hfY291bnRdID0gYmg7CisJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQkoKmJhdGNoX2NvdW50KSsrOworCQlpZiAoKmJhdGNoX2NvdW50ID09IE5SX0JBVENIKSB7CisJCQlfX2ZsdXNoX2JhdGNoKGpvdXJuYWwsIGJocywgYmF0Y2hfY291bnQpOworCQkJcmV0ID0gMTsKKwkJfQorCX0gZWxzZSB7CisJCWludCBsYXN0X2J1ZmZlciA9IDA7CisJCWlmIChqaC0+Yl9jcG5leHQgPT0gamgpIHsKKwkJCS8qIFdlIG1heSBiZSBhYm91dCB0byBkcm9wIHRoZSB0cmFuc2FjdGlvbi4gIFRlbGwgdGhlCisJCQkgKiBjYWxsZXIgdGhhdCB0aGUgbGlzdHMgaGF2ZSBjaGFuZ2VkLgorCQkJICovCisJCQlsYXN0X2J1ZmZlciA9IDE7CisJCX0KKwkJaWYgKF9fdHJ5X3RvX2ZyZWVfY3BfYnVmKGpoKSkgeworCQkJKCpkcm9wX2NvdW50KSsrOworCQkJcmV0ID0gbGFzdF9idWZmZXI7CisJCX0KKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFBlcmZvcm0gYW4gYWN0dWFsIGNoZWNrcG9pbnQuICBXZSBkb24ndCB3cml0ZSBvdXQgb25seSBlbm91Z2ggdG8KKyAqIHNhdGlzZnkgdGhlIGN1cnJlbnQgYmxvY2tlZCByZXF1ZXN0czogcmF0aGVyIHdlIHN1Ym1pdCBhIHJlYXNvbmFibHkKKyAqIHNpemVkIGNodW5rIG9mIHRoZSBvdXRzdGFuZGluZyBkYXRhIHRvIGRpc2sgYXQgb25jZSBmb3IKKyAqIGVmZmljaWVuY3kuICBfX2xvZ193YWl0X2Zvcl9zcGFjZSgpIHdpbGwgcmV0cnkgaWYgd2UgZGlkbid0IGZyZWUgZW5vdWdoLgorICogCisgKiBIb3dldmVyLCB3ZSBfZG9fIHRha2UgaW50byBhY2NvdW50IHRoZSBhbW91bnQgcmVxdWVzdGVkIHNvIHRoYXQgb25jZQorICogdGhlIElPIGhhcyBiZWVuIHF1ZXVlZCwgd2UgY2FuIHJldHVybiBhcyBzb29uIGFzIGVub3VnaCBvZiBpdCBoYXMKKyAqIGNvbXBsZXRlZCB0byBkaXNrLiAgCisgKgorICogVGhlIGpvdXJuYWwgc2hvdWxkIGJlIGxvY2tlZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICovCitpbnQgbG9nX2RvX2NoZWNrcG9pbnQoam91cm5hbF90ICpqb3VybmFsKQoreworCWludCByZXN1bHQ7CisJaW50IGJhdGNoX2NvdW50ID0gMDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoc1tOUl9CQVRDSF07CisKKwlqYmRfZGVidWcoMSwgIlN0YXJ0IGNoZWNrcG9pbnRcbiIpOworCisJLyogCisJICogRmlyc3QgdGhpbmc6IGlmIHRoZXJlIGFyZSBhbnkgdHJhbnNhY3Rpb25zIGluIHRoZSBsb2cgd2hpY2gKKwkgKiBkb24ndCBuZWVkIGNoZWNrcG9pbnRpbmcsIGp1c3QgZWxpbWluYXRlIHRoZW0gZnJvbSB0aGUKKwkgKiBqb3VybmFsIHN0cmFpZ2h0IGF3YXkuICAKKwkgKi8KKwlyZXN1bHQgPSBjbGVhbnVwX2pvdXJuYWxfdGFpbChqb3VybmFsKTsKKwlqYmRfZGVidWcoMSwgImNsZWFudXBfam91cm5hbF90YWlsIHJldHVybmVkICVkXG4iLCByZXN1bHQpOworCWlmIChyZXN1bHQgPD0gMCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCS8qCisJICogT0ssIHdlIG5lZWQgdG8gc3RhcnQgd3JpdGluZyBkaXNrIGJsb2Nrcy4gIFRyeSB0byBmcmVlIHVwIGEKKwkgKiBxdWFydGVyIG9mIHRoZSBsb2cgaW4gYSBzaW5nbGUgY2hlY2twb2ludCBpZiB3ZSBjYW4uCisJICovCisJLyoKKwkgKiBBS1BNOiBjaGVjayB0aGlzIGNvZGUuICBJIGhhZCBhIGZlZWxpbmcgYSB3aGlsZSBiYWNrIHRoYXQgaXQKKwkgKiBkZWdlbmVyYXRlcyBpbnRvIGEgYnVzeSBsb29wIGF0IHVubW91bnQgdGltZS4KKwkgKi8KKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwl3aGlsZSAoam91cm5hbC0+al9jaGVja3BvaW50X3RyYW5zYWN0aW9ucykgeworCQl0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbjsKKwkJc3RydWN0IGpvdXJuYWxfaGVhZCAqamgsICpsYXN0X2poLCAqbmV4dF9qaDsKKwkJaW50IGRyb3BfY291bnQgPSAwOworCQlpbnQgY2xlYW51cF9yZXQsIHJldHJ5ID0gMDsKKwkJdGlkX3QgdGhpc190aWQ7CisKKwkJdHJhbnNhY3Rpb24gPSBqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zOworCQl0aGlzX3RpZCA9IHRyYW5zYWN0aW9uLT50X3RpZDsKKwkJamggPSB0cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2xpc3Q7CisJCWxhc3RfamggPSBqaC0+Yl9jcHByZXY7CisJCW5leHRfamggPSBqaDsKKwkJZG8geworCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCQkJamggPSBuZXh0X2poOworCQkJbmV4dF9qaCA9IGpoLT5iX2NwbmV4dDsKKwkJCWJoID0gamgyYmgoamgpOworCQkJaWYgKCFqYmRfdHJ5bG9ja19iaF9zdGF0ZShiaCkpIHsKKwkJCQlqYmRfc3luY19iaChqb3VybmFsLCBiaCk7CisJCQkJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJCQkJcmV0cnkgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQkJcmV0cnkgPSBfX2ZsdXNoX2J1ZmZlcihqb3VybmFsLCBqaCwgYmhzLCAmYmF0Y2hfY291bnQsICZkcm9wX2NvdW50KTsKKwkJCWlmIChjb25kX3Jlc2NoZWRfbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spKSB7CisJCQkJcmV0cnkgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9IHdoaWxlIChqaCAhPSBsYXN0X2poICYmICFyZXRyeSk7CisKKwkJaWYgKGJhdGNoX2NvdW50KQorCQkJX19mbHVzaF9iYXRjaChqb3VybmFsLCBiaHMsICZiYXRjaF9jb3VudCk7CisKKwkJLyoKKwkJICogSWYgc29tZW9uZSBjbGVhbmVkIHVwIHRoaXMgdHJhbnNhY3Rpb24gd2hpbGUgd2Ugc2xlcHQsIHdlJ3JlCisJCSAqIGRvbmUKKwkJICovCisJCWlmIChqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zICE9IHRyYW5zYWN0aW9uKQorCQkJYnJlYWs7CisJCWlmIChyZXRyeSkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBNYXliZSBpdCdzIGEgbmV3IHRyYW5zYWN0aW9uLCBidXQgaXQgZmVsbCBhdCB0aGUgc2FtZQorCQkgKiBhZGRyZXNzCisJCSAqLworCQlpZiAodHJhbnNhY3Rpb24tPnRfdGlkICE9IHRoaXNfdGlkKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIFdlIGhhdmUgd2Fsa2VkIHRoZSB3aG9sZSB0cmFuc2FjdGlvbiBsaXN0IHdpdGhvdXQKKwkJICogZmluZGluZyBhbnl0aGluZyB0byB3cml0ZSB0byBkaXNrLiAgV2UgaGFkIGJldHRlciBiZQorCQkgKiBhYmxlIHRvIG1ha2Ugc29tZSBwcm9ncmVzcyBvciB3ZSBhcmUgaW4gdHJvdWJsZS4gCisJCSAqLworCQljbGVhbnVwX3JldCA9IF9fY2xlYW51cF90cmFuc2FjdGlvbihqb3VybmFsLCB0cmFuc2FjdGlvbik7CisJCUpfQVNTRVJUKGRyb3BfY291bnQgIT0gMCB8fCBjbGVhbnVwX3JldCAhPSAwKTsKKwkJaWYgKGpvdXJuYWwtPmpfY2hlY2twb2ludF90cmFuc2FjdGlvbnMgIT0gdHJhbnNhY3Rpb24pCisJCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwlyZXN1bHQgPSBjbGVhbnVwX2pvdXJuYWxfdGFpbChqb3VybmFsKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCXJldHVybiAwOworfQorCisvKgorICogQ2hlY2sgdGhlIGxpc3Qgb2YgY2hlY2twb2ludCB0cmFuc2FjdGlvbnMgZm9yIHRoZSBqb3VybmFsIHRvIHNlZSBpZgorICogd2UgaGF2ZSBhbHJlYWR5IGdvdCByaWQgb2YgYW55IHNpbmNlIHRoZSBsYXN0IHVwZGF0ZSBvZiB0aGUgbG9nIHRhaWwKKyAqIGluIHRoZSBqb3VybmFsIHN1cGVyYmxvY2suICBJZiBzbywgd2UgY2FuIGluc3RhbnRseSByb2xsIHRoZQorICogc3VwZXJibG9jayBmb3J3YXJkIHRvIHJlbW92ZSB0aG9zZSB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgbG9nLgorICogCisgKiBSZXR1cm4gPDAgb24gZXJyb3IsIDAgb24gc3VjY2VzcywgMSBpZiB0aGVyZSB3YXMgbm90aGluZyB0byBjbGVhbiB1cC4KKyAqIAorICogQ2FsbGVkIHdpdGggdGhlIGpvdXJuYWwgbG9jayBoZWxkLgorICoKKyAqIFRoaXMgaXMgdGhlIG9ubHkgcGFydCBvZiB0aGUgam91cm5hbGluZyBjb2RlIHdoaWNoIHJlYWxseSBuZWVkcyB0byBiZQorICogYXdhcmUgb2YgdHJhbnNhY3Rpb24gYWJvcnRzLiAgQ2hlY2twb2ludGluZyBpbnZvbHZlcyB3cml0aW5nIHRvIHRoZQorICogbWFpbiBmaWxlc3lzdGVtIGFyZWEgcmF0aGVyIHRoYW4gdG8gdGhlIGpvdXJuYWwsIHNvIGl0IGNhbiBwcm9jZWVkCisgKiBldmVuIGluIGFib3J0IHN0YXRlLCBidXQgd2UgbXVzdCBub3QgdXBkYXRlIHRoZSBqb3VybmFsIHN1cGVyYmxvY2sgaWYKKyAqIHdlIGhhdmUgYW4gYWJvcnQgZXJyb3Igb3V0c3RhbmRpbmcuCisgKi8KKworaW50IGNsZWFudXBfam91cm5hbF90YWlsKGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwl0cmFuc2FjdGlvbl90ICogdHJhbnNhY3Rpb247CisJdGlkX3QJCWZpcnN0X3RpZDsKKwl1bnNpZ25lZCBsb25nCWJsb2NrbnIsIGZyZWVkOworCisJLyogT0ssIHdvcmsgb3V0IHRoZSBvbGRlc3QgdHJhbnNhY3Rpb24gcmVtYWluaW5nIGluIHRoZSBsb2csIGFuZAorCSAqIHRoZSBsb2cgYmxvY2sgaXQgc3RhcnRzIGF0LiAKKwkgKiAKKwkgKiBJZiB0aGUgbG9nIGlzIG5vdyBlbXB0eSwgd2UgbmVlZCB0byB3b3JrIG91dCB3aGljaCBpcyB0aGUKKwkgKiBuZXh0IHRyYW5zYWN0aW9uIElEIHdlIHdpbGwgd3JpdGUsIGFuZCB3aGVyZSBpdCB3aWxsCisJICogc3RhcnQuICovCisKKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJdHJhbnNhY3Rpb24gPSBqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zOworCWlmICh0cmFuc2FjdGlvbikgeworCQlmaXJzdF90aWQgPSB0cmFuc2FjdGlvbi0+dF90aWQ7CisJCWJsb2NrbnIgPSB0cmFuc2FjdGlvbi0+dF9sb2dfc3RhcnQ7CisJfSBlbHNlIGlmICgodHJhbnNhY3Rpb24gPSBqb3VybmFsLT5qX2NvbW1pdHRpbmdfdHJhbnNhY3Rpb24pICE9IE5VTEwpIHsKKwkJZmlyc3RfdGlkID0gdHJhbnNhY3Rpb24tPnRfdGlkOworCQlibG9ja25yID0gdHJhbnNhY3Rpb24tPnRfbG9nX3N0YXJ0OworCX0gZWxzZSBpZiAoKHRyYW5zYWN0aW9uID0gam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uKSAhPSBOVUxMKSB7CisJCWZpcnN0X3RpZCA9IHRyYW5zYWN0aW9uLT50X3RpZDsKKwkJYmxvY2tuciA9IGpvdXJuYWwtPmpfaGVhZDsKKwl9IGVsc2UgeworCQlmaXJzdF90aWQgPSBqb3VybmFsLT5qX3RyYW5zYWN0aW9uX3NlcXVlbmNlOworCQlibG9ja25yID0gam91cm5hbC0+al9oZWFkOworCX0KKwlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCUpfQVNTRVJUKGJsb2NrbnIgIT0gMCk7CisKKwkvKiBJZiB0aGUgb2xkZXN0IHBpbm5lZCB0cmFuc2FjdGlvbiBpcyBhdCB0aGUgdGFpbCBvZiB0aGUgbG9nCisgICAgICAgICAgIGFscmVhZHkgdGhlbiB0aGVyZSdzIG5vdCBtdWNoIHdlIGNhbiBkbyByaWdodCBub3cuICovCisJaWYgKGpvdXJuYWwtPmpfdGFpbF9zZXF1ZW5jZSA9PSBmaXJzdF90aWQpIHsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJCXJldHVybiAxOworCX0KKworCS8qIE9LLCB1cGRhdGUgdGhlIHN1cGVyYmxvY2sgdG8gcmVjb3ZlciB0aGUgZnJlZWQgc3BhY2UuCisJICogUGh5c2ljYWwgYmxvY2tzIGNvbWUgZmlyc3Q6IGhhdmUgd2Ugd3JhcHBlZCBiZXlvbmQgdGhlIGVuZCBvZgorCSAqIHRoZSBsb2c/ICAqLworCWZyZWVkID0gYmxvY2tuciAtIGpvdXJuYWwtPmpfdGFpbDsKKwlpZiAoYmxvY2tuciA8IGpvdXJuYWwtPmpfdGFpbCkKKwkJZnJlZWQgPSBmcmVlZCArIGpvdXJuYWwtPmpfbGFzdCAtIGpvdXJuYWwtPmpfZmlyc3Q7CisKKwlqYmRfZGVidWcoMSwKKwkJICAiQ2xlYW5pbmcgam91cm5hbCB0YWlsIGZyb20gJWQgdG8gJWQgKG9mZnNldCAlbHUpLCAiCisJCSAgImZyZWVpbmcgJWx1XG4iLAorCQkgIGpvdXJuYWwtPmpfdGFpbF9zZXF1ZW5jZSwgZmlyc3RfdGlkLCBibG9ja25yLCBmcmVlZCk7CisKKwlqb3VybmFsLT5qX2ZyZWUgKz0gZnJlZWQ7CisJam91cm5hbC0+al90YWlsX3NlcXVlbmNlID0gZmlyc3RfdGlkOworCWpvdXJuYWwtPmpfdGFpbCA9IGJsb2NrbnI7CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJaWYgKCEoam91cm5hbC0+al9mbGFncyAmIEpGU19BQk9SVCkpCisJCWpvdXJuYWxfdXBkYXRlX3N1cGVyYmxvY2soam91cm5hbCwgMSk7CisJcmV0dXJuIDA7Cit9CisKKworLyogQ2hlY2twb2ludCBsaXN0IG1hbmFnZW1lbnQgKi8KKworLyoKKyAqIGpvdXJuYWxfY2xlYW5fY2hlY2twb2ludF9saXN0CisgKgorICogRmluZCBhbGwgdGhlIHdyaXR0ZW4tYmFjayBjaGVja3BvaW50IGJ1ZmZlcnMgaW4gdGhlIGpvdXJuYWwgYW5kIHJlbGVhc2UgdGhlbS4KKyAqCisgKiBDYWxsZWQgd2l0aCB0aGUgam91cm5hbCBsb2NrZWQuCisgKiBDYWxsZWQgd2l0aCBqX2xpc3RfbG9jayBoZWxkLgorICogUmV0dXJucyBudW1iZXIgb2YgYnVmZXJzIHJlYXBlZCAoZm9yIGRlYnVnKQorICovCisKK2ludCBfX2pvdXJuYWxfY2xlYW5fY2hlY2twb2ludF9saXN0KGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwl0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbiwgKmxhc3RfdHJhbnNhY3Rpb24sICpuZXh0X3RyYW5zYWN0aW9uOworCWludCByZXQgPSAwOworCisJdHJhbnNhY3Rpb24gPSBqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zOworCWlmICh0cmFuc2FjdGlvbiA9PSAwKQorCQlnb3RvIG91dDsKKworCWxhc3RfdHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbi0+dF9jcHByZXY7CisJbmV4dF90cmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uOworCWRvIHsKKwkJc3RydWN0IGpvdXJuYWxfaGVhZCAqamg7CisKKwkJdHJhbnNhY3Rpb24gPSBuZXh0X3RyYW5zYWN0aW9uOworCQluZXh0X3RyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb24tPnRfY3BuZXh0OworCQlqaCA9IHRyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdDsKKwkJaWYgKGpoKSB7CisJCQlzdHJ1Y3Qgam91cm5hbF9oZWFkICpsYXN0X2poID0gamgtPmJfY3BwcmV2OworCQkJc3RydWN0IGpvdXJuYWxfaGVhZCAqbmV4dF9qaCA9IGpoOworCisJCQlkbyB7CisJCQkJamggPSBuZXh0X2poOworCQkJCW5leHRfamggPSBqaC0+Yl9jcG5leHQ7CisJCQkJLyogVXNlIHRyeWxvY2sgYmVjYXVzZSBvZiB0aGUgcmFua25pZyAqLworCQkJCWlmIChqYmRfdHJ5bG9ja19iaF9zdGF0ZShqaDJiaChqaCkpKQorCQkJCQlyZXQgKz0gX190cnlfdG9fZnJlZV9jcF9idWYoamgpOworCQkJCS8qCisJCQkJICogVGhpcyBmdW5jdGlvbiBvbmx5IGZyZWVzIHVwIHNvbWUgbWVtb3J5CisJCQkJICogaWYgcG9zc2libGUgc28gd2UgZG9udCBoYXZlIGFuIG9ibGlnYXRpb24KKwkJCQkgKiB0byBmaW5pc2ggcHJvY2Vzc2luZy4gQmFpbCBvdXQgaWYgcHJlZW1wdGlvbgorCQkJCSAqIHJlcXVlc3RlZDoKKwkJCQkgKi8KKwkJCQlpZiAobmVlZF9yZXNjaGVkKCkpCisJCQkJCWdvdG8gb3V0OworCQkJfSB3aGlsZSAoamggIT0gbGFzdF9qaCk7CisJCX0KKwl9IHdoaWxlICh0cmFuc2FjdGlvbiAhPSBsYXN0X3RyYW5zYWN0aW9uKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKiAKKyAqIGpvdXJuYWxfcmVtb3ZlX2NoZWNrcG9pbnQ6IGNhbGxlZCBhZnRlciBhIGJ1ZmZlciBoYXMgYmVlbiBjb21taXR0ZWQKKyAqIHRvIGRpc2sgKGVpdGhlciBieSBiZWluZyB3cml0ZS1iYWNrIGZsdXNoZWQgdG8gZGlzaywgb3IgYmVpbmcKKyAqIGNvbW1pdHRlZCB0byB0aGUgbG9nKS4KKyAqCisgKiBXZSBjYW5ub3Qgc2FmZWx5IGNsZWFuIGEgdHJhbnNhY3Rpb24gb3V0IG9mIHRoZSBsb2cgdW50aWwgYWxsIG9mIHRoZQorICogYnVmZmVyIHVwZGF0ZXMgY29tbWl0dGVkIGluIHRoYXQgdHJhbnNhY3Rpb24gaGF2ZSBzYWZlbHkgYmVlbiBzdG9yZWQKKyAqIGVsc2V3aGVyZSBvbiBkaXNrLiAgVG8gYWNoaWV2ZSB0aGlzLCBhbGwgb2YgdGhlIGJ1ZmZlcnMgaW4gYQorICogdHJhbnNhY3Rpb24gbmVlZCB0byBiZSBtYWludGFpbmVkIG9uIHRoZSB0cmFuc2FjdGlvbidzIGNoZWNrcG9pbnQKKyAqIGxpc3QgdW50aWwgdGhleSBoYXZlIGJlZW4gcmV3cml0dGVuLCBhdCB3aGljaCBwb2ludCB0aGlzIGZ1bmN0aW9uIGlzCisgKiBjYWxsZWQgdG8gcmVtb3ZlIHRoZSBidWZmZXIgZnJvbSB0aGUgZXhpc3RpbmcgdHJhbnNhY3Rpb24ncworICogY2hlY2twb2ludCBsaXN0LiAgCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgam91cm5hbCBsb2NrZWQuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGpfbGlzdF9sb2NrIGhlbGQuCisgKi8KKwordm9pZCBfX2pvdXJuYWxfcmVtb3ZlX2NoZWNrcG9pbnQoc3RydWN0IGpvdXJuYWxfaGVhZCAqamgpCit7CisJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb247CisJam91cm5hbF90ICpqb3VybmFsOworCisJSkJVRkZFUl9UUkFDRShqaCwgImVudHJ5Iik7CisKKwlpZiAoKHRyYW5zYWN0aW9uID0gamgtPmJfY3BfdHJhbnNhY3Rpb24pID09IE5VTEwpIHsKKwkJSkJVRkZFUl9UUkFDRShqaCwgIm5vdCBvbiB0cmFuc2FjdGlvbiIpOworCQlnb3RvIG91dDsKKwl9CisJam91cm5hbCA9IHRyYW5zYWN0aW9uLT50X2pvdXJuYWw7CisKKwlfX2J1ZmZlcl91bmxpbmsoamgpOworCisJaWYgKHRyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdCAhPSBOVUxMKQorCQlnb3RvIG91dDsKKwlKQlVGRkVSX1RSQUNFKGpoLCAidHJhbnNhY3Rpb24gaGFzIG5vIG1vcmUgYnVmZmVycyIpOworCisJLyoKKwkgKiBUaGVyZSBpcyBvbmUgc3BlY2lhbCBjYXNlIHRvIHdvcnJ5IGFib3V0OiBpZiB3ZSBoYXZlIGp1c3QgcHVsbGVkIHRoZQorCSAqIGJ1ZmZlciBvZmYgYSBjb21taXR0aW5nIHRyYW5zYWN0aW9uJ3MgZm9yZ2V0IGxpc3QsIHRoZW4gZXZlbiBpZiB0aGUKKwkgKiBjaGVja3BvaW50IGxpc3QgaXMgZW1wdHksIHRoZSB0cmFuc2FjdGlvbiBvYnZpb3VzbHkgY2Fubm90IGJlCisJICogZHJvcHBlZCEKKwkgKgorCSAqIFRoZSBsb2NraW5nIGhlcmUgYXJvdW5kIGpfY29tbWl0dGluZ190cmFuc2FjdGlvbiBpcyBhIGJpdCBzbGVhenkuCisJICogU2VlIHRoZSBjb21tZW50IGF0IHRoZSBlbmQgb2Ygam91cm5hbF9jb21taXRfdHJhbnNhY3Rpb24oKS4KKwkgKi8KKwlpZiAodHJhbnNhY3Rpb24gPT0gam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uKSB7CisJCUpCVUZGRVJfVFJBQ0UoamgsICJiZWxvbmdzIHRvIGNvbW1pdHRpbmcgdHJhbnNhY3Rpb24iKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogT0ssIHRoYXQgd2FzIHRoZSBsYXN0IGJ1ZmZlciBmb3IgdGhlIHRyYW5zYWN0aW9uOiB3ZSBjYW4gbm93CisJICAgc2FmZWx5IHJlbW92ZSB0aGlzIHRyYW5zYWN0aW9uIGZyb20gdGhlIGxvZyAqLworCisJX19qb3VybmFsX2Ryb3BfdHJhbnNhY3Rpb24oam91cm5hbCwgdHJhbnNhY3Rpb24pOworCisJLyogSnVzdCBpbiBjYXNlIGFueWJvZHkgd2FzIHdhaXRpbmcgZm9yIG1vcmUgdHJhbnNhY3Rpb25zIHRvIGJlCisgICAgICAgICAgIGNoZWNrcG9pbnRlZC4uLiAqLworCXdha2VfdXAoJmpvdXJuYWwtPmpfd2FpdF9sb2dzcGFjZSk7CitvdXQ6CisJSkJVRkZFUl9UUkFDRShqaCwgImV4aXQiKTsKK30KKworLyoKKyAqIGpvdXJuYWxfaW5zZXJ0X2NoZWNrcG9pbnQ6IHB1dCBhIGNvbW1pdHRlZCBidWZmZXIgb250byBhIGNoZWNrcG9pbnQKKyAqIGxpc3Qgc28gdGhhdCB3ZSBrbm93IHdoZW4gaXQgaXMgc2FmZSB0byBjbGVhbiB0aGUgdHJhbnNhY3Rpb24gb3V0IG9mCisgKiB0aGUgbG9nLgorICoKKyAqIENhbGxlZCB3aXRoIHRoZSBqb3VybmFsIGxvY2tlZC4KKyAqIENhbGxlZCB3aXRoIGpfbGlzdF9sb2NrIGhlbGQuCisgKi8KK3ZvaWQgX19qb3VybmFsX2luc2VydF9jaGVja3BvaW50KHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoLCAKKwkJCSAgICAgICB0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbikKK3sKKwlKQlVGRkVSX1RSQUNFKGpoLCAiZW50cnkiKTsKKwlKX0FTU0VSVF9KSChqaCwgYnVmZmVyX2RpcnR5KGpoMmJoKGpoKSkgfHwgYnVmZmVyX2piZGRpcnR5KGpoMmJoKGpoKSkpOworCUpfQVNTRVJUX0pIKGpoLCBqaC0+Yl9jcF90cmFuc2FjdGlvbiA9PSBOVUxMKTsKKworCWpoLT5iX2NwX3RyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247CisKKwlpZiAoIXRyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdCkgeworCQlqaC0+Yl9jcG5leHQgPSBqaC0+Yl9jcHByZXYgPSBqaDsKKwl9IGVsc2UgeworCQlqaC0+Yl9jcG5leHQgPSB0cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2xpc3Q7CisJCWpoLT5iX2NwcHJldiA9IHRyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdC0+Yl9jcHByZXY7CisJCWpoLT5iX2NwcHJldi0+Yl9jcG5leHQgPSBqaDsKKwkJamgtPmJfY3BuZXh0LT5iX2NwcHJldiA9IGpoOworCX0KKwl0cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2xpc3QgPSBqaDsKK30KKworLyoKKyAqIFdlJ3ZlIGZpbmlzaGVkIHdpdGggdGhpcyB0cmFuc2FjdGlvbiBzdHJ1Y3R1cmU6IGFkaW9zLi4uCisgKiAKKyAqIFRoZSB0cmFuc2FjdGlvbiBtdXN0IGhhdmUgbm8gbGlua3MgZXhjZXB0IGZvciB0aGUgY2hlY2twb2ludCBieSB0aGlzCisgKiBwb2ludC4KKyAqCisgKiBDYWxsZWQgd2l0aCB0aGUgam91cm5hbCBsb2NrZWQuCisgKiBDYWxsZWQgd2l0aCBqX2xpc3RfbG9jayBoZWxkLgorICovCisKK3ZvaWQgX19qb3VybmFsX2Ryb3BfdHJhbnNhY3Rpb24oam91cm5hbF90ICpqb3VybmFsLCB0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbikKK3sKKwlhc3NlcnRfc3Bpbl9sb2NrZWQoJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwlpZiAodHJhbnNhY3Rpb24tPnRfY3BuZXh0KSB7CisJCXRyYW5zYWN0aW9uLT50X2NwbmV4dC0+dF9jcHByZXYgPSB0cmFuc2FjdGlvbi0+dF9jcHByZXY7CisJCXRyYW5zYWN0aW9uLT50X2NwcHJldi0+dF9jcG5leHQgPSB0cmFuc2FjdGlvbi0+dF9jcG5leHQ7CisJCWlmIChqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zID09IHRyYW5zYWN0aW9uKQorCQkJam91cm5hbC0+al9jaGVja3BvaW50X3RyYW5zYWN0aW9ucyA9CisJCQkJdHJhbnNhY3Rpb24tPnRfY3BuZXh0OworCQlpZiAoam91cm5hbC0+al9jaGVja3BvaW50X3RyYW5zYWN0aW9ucyA9PSB0cmFuc2FjdGlvbikKKwkJCWpvdXJuYWwtPmpfY2hlY2twb2ludF90cmFuc2FjdGlvbnMgPSBOVUxMOworCX0KKworCUpfQVNTRVJUKHRyYW5zYWN0aW9uLT50X3N0YXRlID09IFRfRklOSVNIRUQpOworCUpfQVNTRVJUKHRyYW5zYWN0aW9uLT50X2J1ZmZlcnMgPT0gTlVMTCk7CisJSl9BU1NFUlQodHJhbnNhY3Rpb24tPnRfc3luY19kYXRhbGlzdCA9PSBOVUxMKTsKKwlKX0FTU0VSVCh0cmFuc2FjdGlvbi0+dF9mb3JnZXQgPT0gTlVMTCk7CisJSl9BU1NFUlQodHJhbnNhY3Rpb24tPnRfaW9idWZfbGlzdCA9PSBOVUxMKTsKKwlKX0FTU0VSVCh0cmFuc2FjdGlvbi0+dF9zaGFkb3dfbGlzdCA9PSBOVUxMKTsKKwlKX0FTU0VSVCh0cmFuc2FjdGlvbi0+dF9sb2dfbGlzdCA9PSBOVUxMKTsKKwlKX0FTU0VSVCh0cmFuc2FjdGlvbi0+dF9jaGVja3BvaW50X2xpc3QgPT0gTlVMTCk7CisJSl9BU1NFUlQodHJhbnNhY3Rpb24tPnRfdXBkYXRlcyA9PSAwKTsKKwlKX0FTU0VSVChqb3VybmFsLT5qX2NvbW1pdHRpbmdfdHJhbnNhY3Rpb24gIT0gdHJhbnNhY3Rpb24pOworCUpfQVNTRVJUKGpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbiAhPSB0cmFuc2FjdGlvbik7CisKKwlqYmRfZGVidWcoMSwgIkRyb3BwaW5nIHRyYW5zYWN0aW9uICVkLCBhbGwgZG9uZVxuIiwgdHJhbnNhY3Rpb24tPnRfdGlkKTsKKwlrZnJlZSh0cmFuc2FjdGlvbik7Cit9CmRpZmYgLS1naXQgYS9mcy9qYmQvY29tbWl0LmMgYi9mcy9qYmQvY29tbWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFjNzIwYwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2piZC9jb21taXQuYwpAQCAtMCwwICsxLDg0NCBAQAorLyoKKyAqIGxpbnV4L2ZzL2NvbW1pdC5jCisgKgorICogV3JpdHRlbiBieSBTdGVwaGVuIEMuIFR3ZWVkaWUgPHNjdEByZWRoYXQuY29tPiwgMTk5OAorICoKKyAqIENvcHlyaWdodCAxOTk4IFJlZCBIYXQgY29ycCAtLS0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIG9yIGF0IHlvdXIKKyAqIG9wdGlvbiwgYW55IGxhdGVyIHZlcnNpb24sIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIEpvdXJuYWwgY29tbWl0IHJvdXRpbmVzIGZvciB0aGUgZ2VuZXJpYyBmaWxlc3lzdGVtIGpvdXJuYWxpbmcgY29kZTsKKyAqIHBhcnQgb2YgdGhlIGV4dDJmcyBqb3VybmFsaW5nIHN5c3RlbS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvamJkLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKworLyoKKyAqIERlZmF1bHQgSU8gZW5kIGhhbmRsZXIgZm9yIHRlbXBvcmFyeSBCSl9JTyBidWZmZXJfaGVhZHMuCisgKi8KK3N0YXRpYyB2b2lkIGpvdXJuYWxfZW5kX2J1ZmZlcl9pb19zeW5jKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB1cHRvZGF0ZSkKK3sKKwlCVUZGRVJfVFJBQ0UoYmgsICIiKTsKKwlpZiAodXB0b2RhdGUpCisJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCWVsc2UKKwkJY2xlYXJfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwl1bmxvY2tfYnVmZmVyKGJoKTsKK30KKworLyoKKyAqIFdoZW4gYW4gZXh0My1vcmRlcmVkIGZpbGUgaXMgdHJ1bmNhdGVkLCBpdCBpcyBwb3NzaWJsZSB0aGF0IG1hbnkgcGFnZXMgYXJlCisgKiBub3Qgc3VjZXNzZnVsbHkgZnJlZWQsIGJlY2F1c2UgdGhleSBhcmUgYXR0YWNoZWQgdG8gYSBjb21taXR0aW5nIHRyYW5zYWN0aW9uLgorICogQWZ0ZXIgdGhlIHRyYW5zYWN0aW9uIGNvbW1pdHMsIHRoZXNlIHBhZ2VzIGFyZSBsZWZ0IG9uIHRoZSBMUlUsIHdpdGggbm8KKyAqIC0+bWFwcGluZywgYW5kIHdpdGggYXR0YWNoZWQgYnVmZmVycy4gIFRoZXNlIHBhZ2VzIGFyZSB0cml2aWFsbHkgcmVjbGFpbWFibGUKKyAqIGJ5IHRoZSBWTSwgYnV0IHRoZWlyIGFwcGFyZW50IGFic2VuY2UgdXBzZXRzIHRoZSBWTSBhY2NvdW50aW5nLCBhbmQgaXQgbWFrZXMKKyAqIHRoZSBudW1iZXJzIGluIC9wcm9jL21lbWluZm8gbG9vayBvZGQuCisgKgorICogU28gaGVyZSwgd2UgaGF2ZSBhIGJ1ZmZlciB3aGljaCBoYXMganVzdCBjb21lIG9mZiB0aGUgZm9yZ2V0IGxpc3QuICBMb29rIHRvCisgKiBzZWUgaWYgd2UgY2FuIHN0cmlwIGFsbCBidWZmZXJzIGZyb20gdGhlIGJhY2tpbmcgcGFnZS4KKyAqCisgKiBDYWxsZWQgdW5kZXIgbG9ja19qb3VybmFsKCksIGFuZCBwb3NzaWJseSB1bmRlciBqb3VybmFsX2RhdGFsaXN0X2xvY2suICBUaGUKKyAqIGNhbGxlciBwcm92aWRlZCB1cyB3aXRoIGEgcmVmIGFnYWluc3QgdGhlIGJ1ZmZlciwgYW5kIHdlIGRyb3AgdGhhdCBoZXJlLgorICovCitzdGF0aWMgdm9pZCByZWxlYXNlX2J1ZmZlcl9wYWdlKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlpZiAoYnVmZmVyX2RpcnR5KGJoKSkKKwkJZ290byBub3BlOworCWlmIChhdG9taWNfcmVhZCgmYmgtPmJfY291bnQpICE9IDEpCisJCWdvdG8gbm9wZTsKKwlwYWdlID0gYmgtPmJfcGFnZTsKKwlpZiAoIXBhZ2UpCisJCWdvdG8gbm9wZTsKKwlpZiAocGFnZS0+bWFwcGluZykKKwkJZ290byBub3BlOworCisJLyogT0ssIGl0J3MgYSB0cnVuY2F0ZWQgcGFnZSAqLworCWlmIChUZXN0U2V0UGFnZUxvY2tlZChwYWdlKSkKKwkJZ290byBub3BlOworCisJcGFnZV9jYWNoZV9nZXQocGFnZSk7CisJX19icmVsc2UoYmgpOworCXRyeV90b19mcmVlX2J1ZmZlcnMocGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCXJldHVybjsKKworbm9wZToKKwlfX2JyZWxzZShiaCk7Cit9CisKKy8qCisgKiBUcnkgdG8gYWNxdWlyZSBqYmRfbG9ja19iaF9zdGF0ZSgpIGFnYWluc3QgdGhlIGJ1ZmZlciwgd2hlbiBqX2xpc3RfbG9jayBpcworICogaGVsZC4gIEZvciByYW5raW5nIHJlYXNvbnMgd2UgbXVzdCB0cnlsb2NrLiAgSWYgd2UgbG9zZSwgc2NoZWR1bGUgYXdheSBhbmQKKyAqIHJldHVybiAwLiAgal9saXN0X2xvY2sgaXMgZHJvcHBlZCBpbiB0aGlzIGNhc2UuCisgKi8KK3N0YXRpYyBpbnQgaW52ZXJ0ZWRfbG9jayhqb3VybmFsX3QgKmpvdXJuYWwsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaWYgKCFqYmRfdHJ5bG9ja19iaF9zdGF0ZShiaCkpIHsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJc2NoZWR1bGUoKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCisvKiBEb25lIGl0IGFsbDogbm93IHdyaXRlIHRoZSBjb21taXQgcmVjb3JkLiAgV2Ugc2hvdWxkIGhhdmUKKyAqIGNsZWFuZWQgdXAgb3VyIHByZXZpb3VzIGJ1ZmZlcnMgYnkgbm93LCBzbyBpZiB3ZSBhcmUgaW4gYWJvcnQKKyAqIG1vZGUgd2UgY2FuIG5vdyBqdXN0IHNraXAgdGhlIHJlc3Qgb2YgdGhlIGpvdXJuYWwgd3JpdGUKKyAqIGVudGlyZWx5LgorICoKKyAqIFJldHVybnMgMSBpZiB0aGUgam91cm5hbCBuZWVkcyB0byBiZSBhYm9ydGVkIG9yIDAgb24gc3VjY2VzcworICovCitzdGF0aWMgaW50IGpvdXJuYWxfd3JpdGVfY29tbWl0X3JlY29yZChqb3VybmFsX3QgKmpvdXJuYWwsCisJCQkJCXRyYW5zYWN0aW9uX3QgKmNvbW1pdF90cmFuc2FjdGlvbikKK3sKKwlzdHJ1Y3Qgam91cm5hbF9oZWFkICpkZXNjcmlwdG9yOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaW50IGksIHJldDsKKwlpbnQgYmFycmllcl9kb25lID0gMDsKKworCWlmIChpc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkpCisJCXJldHVybiAwOworCisJZGVzY3JpcHRvciA9IGpvdXJuYWxfZ2V0X2Rlc2NyaXB0b3JfYnVmZmVyKGpvdXJuYWwpOworCWlmICghZGVzY3JpcHRvcikKKwkJcmV0dXJuIDE7CisKKwliaCA9IGpoMmJoKGRlc2NyaXB0b3IpOworCisJLyogQUtQTTogYnVnbGV0IC0gYWRkIGBpJyB0byB0bXAhICovCisJZm9yIChpID0gMDsgaSA8IGJoLT5iX3NpemU7IGkgKz0gNTEyKSB7CisJCWpvdXJuYWxfaGVhZGVyX3QgKnRtcCA9IChqb3VybmFsX2hlYWRlcl90KiliaC0+Yl9kYXRhOworCQl0bXAtPmhfbWFnaWMgPSBjcHVfdG9fYmUzMihKRlNfTUFHSUNfTlVNQkVSKTsKKwkJdG1wLT5oX2Jsb2NrdHlwZSA9IGNwdV90b19iZTMyKEpGU19DT01NSVRfQkxPQ0spOworCQl0bXAtPmhfc2VxdWVuY2UgPSBjcHVfdG9fYmUzMihjb21taXRfdHJhbnNhY3Rpb24tPnRfdGlkKTsKKwl9CisKKwlKQlVGRkVSX1RSQUNFKGRlc2NyaXB0b3IsICJ3cml0ZSBjb21taXQgYmxvY2siKTsKKwlzZXRfYnVmZmVyX2RpcnR5KGJoKTsKKwlpZiAoam91cm5hbC0+al9mbGFncyAmIEpGU19CQVJSSUVSKSB7CisJCXNldF9idWZmZXJfb3JkZXJlZChiaCk7CisJCWJhcnJpZXJfZG9uZSA9IDE7CisJfQorCXJldCA9IHN5bmNfZGlydHlfYnVmZmVyKGJoKTsKKwkvKiBpcyBpdCBwb3NzaWJsZSBmb3IgYW5vdGhlciBjb21taXQgdG8gZmFpbCBhdCByb3VnaGx5CisJICogdGhlIHNhbWUgdGltZSBhcyB0aGlzIG9uZT8gIElmIHNvLCB3ZSBkb24ndCB3YW50IHRvCisJICogdHJ1c3QgdGhlIGJhcnJpZXIgZmxhZyBpbiB0aGUgc3VwZXIsIGJ1dCBpbnN0ZWFkIHdhbnQKKwkgKiB0byByZW1lbWJlciBpZiB3ZSBzZW50IGEgYmFycmllciByZXF1ZXN0CisJICovCisJaWYgKHJldCA9PSAtRU9QTk9UU1VQUCAmJiBiYXJyaWVyX2RvbmUpIHsKKwkJY2hhciBiW0JERVZOQU1FX1NJWkVdOworCisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSJKQkQ6IGJhcnJpZXItYmFzZWQgc3luYyBmYWlsZWQgb24gJXMgLSAiCisJCQkiZGlzYWJsaW5nIGJhcnJpZXJzXG4iLAorCQkJYmRldm5hbWUoam91cm5hbC0+al9kZXYsIGIpKTsKKwkJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCQlqb3VybmFsLT5qX2ZsYWdzICY9IH5KRlNfQkFSUklFUjsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisKKwkJLyogQW5kIHRyeSBhZ2Fpbiwgd2l0aG91dCB0aGUgYmFycmllciAqLworCQljbGVhcl9idWZmZXJfb3JkZXJlZChiaCk7CisJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQlzZXRfYnVmZmVyX2RpcnR5KGJoKTsKKwkJcmV0ID0gc3luY19kaXJ0eV9idWZmZXIoYmgpOworCX0KKwlwdXRfYmgoYmgpOwkJLyogT25lIGZvciBnZXRibGsoKSAqLworCWpvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZChkZXNjcmlwdG9yKTsKKworCXJldHVybiAocmV0ID09IC1FSU8pOworfQorCisvKgorICogam91cm5hbF9jb21taXRfdHJhbnNhY3Rpb24KKyAqCisgKiBUaGUgcHJpbWFyeSBmdW5jdGlvbiBmb3IgY29tbWl0dGluZyBhIHRyYW5zYWN0aW9uIHRvIHRoZSBsb2cuICBUaGlzCisgKiBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGpvdXJuYWwgdGhyZWFkIHRvIGJlZ2luIGEgY29tcGxldGUgY29tbWl0LgorICovCit2b2lkIGpvdXJuYWxfY29tbWl0X3RyYW5zYWN0aW9uKGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwl0cmFuc2FjdGlvbl90ICpjb21taXRfdHJhbnNhY3Rpb247CisJc3RydWN0IGpvdXJuYWxfaGVhZCAqamgsICpuZXdfamgsICpkZXNjcmlwdG9yOworCXN0cnVjdCBidWZmZXJfaGVhZCAqKndidWYgPSBqb3VybmFsLT5qX3didWY7CisJaW50IGJ1ZnM7CisJaW50IGZsYWdzOworCWludCBlcnI7CisJdW5zaWduZWQgbG9uZyBibG9ja25yOworCWNoYXIgKnRhZ3AgPSBOVUxMOworCWpvdXJuYWxfaGVhZGVyX3QgKmhlYWRlcjsKKwlqb3VybmFsX2Jsb2NrX3RhZ190ICp0YWcgPSBOVUxMOworCWludCBzcGFjZV9sZWZ0ID0gMDsKKwlpbnQgZmlyc3RfdGFnID0gMDsKKwlpbnQgdGFnX2ZsYWc7CisJaW50IGk7CisKKwkvKgorCSAqIEZpcnN0IGpvYjogbG9jayBkb3duIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGFuZCB3YWl0IGZvcgorCSAqIGFsbCBvdXRzdGFuZGluZyB1cGRhdGVzIHRvIGNvbXBsZXRlLgorCSAqLworCisjaWZkZWYgQ09NTUlUX1NUQVRTCisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJc3VtbWFyaXNlX2pvdXJuYWxfdXNhZ2Uoam91cm5hbCk7CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKyNlbmRpZgorCisJLyogRG8gd2UgbmVlZCB0byBlcmFzZSB0aGUgZWZmZWN0cyBvZiBhIHByaW9yIGpvdXJuYWxfZmx1c2g/ICovCisJaWYgKGpvdXJuYWwtPmpfZmxhZ3MgJiBKRlNfRkxVU0hFRCkgeworCQlqYmRfZGVidWcoMywgInN1cGVyIGJsb2NrIHVwZGF0ZWRcbiIpOworCQlqb3VybmFsX3VwZGF0ZV9zdXBlcmJsb2NrKGpvdXJuYWwsIDEpOworCX0gZWxzZSB7CisJCWpiZF9kZWJ1ZygzLCAic3VwZXJibG9jayBub3QgdXBkYXRlZFxuIik7CisJfQorCisJSl9BU1NFUlQoam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uICE9IE5VTEwpOworCUpfQVNTRVJUKGpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbiA9PSBOVUxMKTsKKworCWNvbW1pdF90cmFuc2FjdGlvbiA9IGpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbjsKKwlKX0FTU0VSVChjb21taXRfdHJhbnNhY3Rpb24tPnRfc3RhdGUgPT0gVF9SVU5OSU5HKTsKKworCWpiZF9kZWJ1ZygxLCAiSkJEOiBzdGFydGluZyBjb21taXQgb2YgdHJhbnNhY3Rpb24gJWRcbiIsCisJCQljb21taXRfdHJhbnNhY3Rpb24tPnRfdGlkKTsKKworCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwljb21taXRfdHJhbnNhY3Rpb24tPnRfc3RhdGUgPSBUX0xPQ0tFRDsKKworCXNwaW5fbG9jaygmY29tbWl0X3RyYW5zYWN0aW9uLT50X2hhbmRsZV9sb2NrKTsKKwl3aGlsZSAoY29tbWl0X3RyYW5zYWN0aW9uLT50X3VwZGF0ZXMpIHsKKwkJREVGSU5FX1dBSVQod2FpdCk7CisKKwkJcHJlcGFyZV90b193YWl0KCZqb3VybmFsLT5qX3dhaXRfdXBkYXRlcywgJndhaXQsCisJCQkJCVRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKGNvbW1pdF90cmFuc2FjdGlvbi0+dF91cGRhdGVzKSB7CisJCQlzcGluX3VubG9jaygmY29tbWl0X3RyYW5zYWN0aW9uLT50X2hhbmRsZV9sb2NrKTsKKwkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCQkJc2NoZWR1bGUoKTsKKwkJCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJCXNwaW5fbG9jaygmY29tbWl0X3RyYW5zYWN0aW9uLT50X2hhbmRsZV9sb2NrKTsKKwkJfQorCQlmaW5pc2hfd2FpdCgmam91cm5hbC0+al93YWl0X3VwZGF0ZXMsICZ3YWl0KTsKKwl9CisJc3Bpbl91bmxvY2soJmNvbW1pdF90cmFuc2FjdGlvbi0+dF9oYW5kbGVfbG9jayk7CisKKwlKX0FTU0VSVCAoY29tbWl0X3RyYW5zYWN0aW9uLT50X291dHN0YW5kaW5nX2NyZWRpdHMgPD0KKwkJCWpvdXJuYWwtPmpfbWF4X3RyYW5zYWN0aW9uX2J1ZmZlcnMpOworCisJLyoKKwkgKiBGaXJzdCB0aGluZyB3ZSBhcmUgYWxsb3dlZCB0byBkbyBpcyB0byBkaXNjYXJkIGFueSByZW1haW5pbmcKKwkgKiBCSl9SZXNlcnZlZCBidWZmZXJzLiAgTm90ZSwgaXQgaXMgX25vdF8gcGVybWlzc2libGUgdG8gYXNzdW1lCisJICogdGhhdCB0aGVyZSBhcmUgbm8gc3VjaCBidWZmZXJzOiBpZiBhIGxhcmdlIGZpbGVzeXN0ZW0KKwkgKiBvcGVyYXRpb24gbGlrZSBhIHRydW5jYXRlIG5lZWRzIHRvIHNwbGl0IGl0c2VsZiBvdmVyIG11bHRpcGxlCisJICogdHJhbnNhY3Rpb25zLCB0aGVuIGl0IG1heSB0cnkgdG8gZG8gYSBqb3VybmFsX3Jlc3RhcnQoKSB3aGlsZQorCSAqIHRoZXJlIGFyZSBzdGlsbCBCSl9SZXNlcnZlZCBidWZmZXJzIG91dHN0YW5kaW5nLiAgVGhlc2UgbXVzdAorCSAqIGJlIHJlbGVhc2VkIGNsZWFubHkgZnJvbSB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4KKwkgKgorCSAqIEluIHRoaXMgY2FzZSwgdGhlIGZpbGVzeXN0ZW0gbXVzdCBzdGlsbCByZXNlcnZlIHdyaXRlIGFjY2VzcworCSAqIGFnYWluIGJlZm9yZSBtb2RpZnlpbmcgdGhlIGJ1ZmZlciBpbiB0aGUgbmV3IHRyYW5zYWN0aW9uLCBidXQKKwkgKiB3ZSBkbyBub3QgcmVxdWlyZSBpdCB0byByZW1lbWJlciBleGFjdGx5IHdoaWNoIG9sZCBidWZmZXJzIGl0CisJICogaGFzIHJlc2VydmVkLiAgVGhpcyBpcyBjb25zaXN0ZW50IHdpdGggdGhlIGV4aXN0aW5nIGJlaGF2aW91cgorCSAqIHRoYXQgbXVsdGlwbGUgam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKCkgY2FsbHMgdG8gdGhlIHNhbWUKKwkgKiBidWZmZXIgYXJlIHBlcmZlY3RseSBwZXJtaXNzYWJsZS4KKwkgKi8KKwl3aGlsZSAoY29tbWl0X3RyYW5zYWN0aW9uLT50X3Jlc2VydmVkX2xpc3QpIHsKKwkJamggPSBjb21taXRfdHJhbnNhY3Rpb24tPnRfcmVzZXJ2ZWRfbGlzdDsKKwkJSkJVRkZFUl9UUkFDRShqaCwgInJlc2VydmVkLCB1bnVzZWQ6IHJlZmlsZSIpOworCQkvKgorCQkgKiBBIGpvdXJuYWxfZ2V0X3VuZG9fYWNjZXNzKCkram91cm5hbF9yZWxlYXNlX2J1ZmZlcigpIG1heQorCQkgKiBsZWF2ZSB1bmRvLWNvbW1pdHRlZCBkYXRhLgorCQkgKi8KKwkJaWYgKGpoLT5iX2NvbW1pdHRlZF9kYXRhKSB7CisJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gamgyYmgoamgpOworCisJCQlqYmRfbG9ja19iaF9zdGF0ZShiaCk7CisJCQlpZiAoamgtPmJfY29tbWl0dGVkX2RhdGEpIHsKKwkJCQlrZnJlZShqaC0+Yl9jb21taXR0ZWRfZGF0YSk7CisJCQkJamgtPmJfY29tbWl0dGVkX2RhdGEgPSBOVUxMOworCQkJfQorCQkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisJCX0KKwkJam91cm5hbF9yZWZpbGVfYnVmZmVyKGpvdXJuYWwsIGpoKTsKKwl9CisKKwkvKgorCSAqIE5vdyB0cnkgdG8gZHJvcCBhbnkgd3JpdHRlbi1iYWNrIGJ1ZmZlcnMgZnJvbSB0aGUgam91cm5hbCdzCisJICogY2hlY2twb2ludCBsaXN0cy4gIFdlIGRvIHRoaXMgKmJlZm9yZSogY29tbWl0IGJlY2F1c2UgaXQgcG90ZW50aWFsbHkKKwkgKiBmcmVlcyBzb21lIG1lbW9yeQorCSAqLworCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCV9fam91cm5hbF9jbGVhbl9jaGVja3BvaW50X2xpc3Qoam91cm5hbCk7CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKworCWpiZF9kZWJ1ZyAoMywgIkpCRDogY29tbWl0IHBoYXNlIDFcbiIpOworCisJLyoKKwkgKiBTd2l0Y2ggdG8gYSBuZXcgcmV2b2tlIHRhYmxlLgorCSAqLworCWpvdXJuYWxfc3dpdGNoX3Jldm9rZV90YWJsZShqb3VybmFsKTsKKworCWNvbW1pdF90cmFuc2FjdGlvbi0+dF9zdGF0ZSA9IFRfRkxVU0g7CisJam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uID0gY29tbWl0X3RyYW5zYWN0aW9uOworCWpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbiA9IE5VTEw7CisJY29tbWl0X3RyYW5zYWN0aW9uLT50X2xvZ19zdGFydCA9IGpvdXJuYWwtPmpfaGVhZDsKKwl3YWtlX3VwKCZqb3VybmFsLT5qX3dhaXRfdHJhbnNhY3Rpb25fbG9ja2VkKTsKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKworCWpiZF9kZWJ1ZyAoMywgIkpCRDogY29tbWl0IHBoYXNlIDJcbiIpOworCisJLyoKKwkgKiBGaXJzdCwgZHJvcCBtb2RpZmllZCBmbGFnOiBhbGwgYWNjZXNzZXMgdG8gdGhlIGJ1ZmZlcnMKKwkgKiB3aWxsIGJlIHRyYWNrZWQgZm9yIGEgbmV3IHRyYXNhY3Rpb24gb25seSAtYnp6egorCSAqLworCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCWlmIChjb21taXRfdHJhbnNhY3Rpb24tPnRfYnVmZmVycykgeworCQluZXdfamggPSBqaCA9IGNvbW1pdF90cmFuc2FjdGlvbi0+dF9idWZmZXJzLT5iX3RuZXh0OworCQlkbyB7CisJCQlKX0FTU0VSVF9KSChuZXdfamgsIG5ld19qaC0+Yl9tb2RpZmllZCA9PSAxIHx8CisJCQkJCW5ld19qaC0+Yl9tb2RpZmllZCA9PSAwKTsKKwkJCW5ld19qaC0+Yl9tb2RpZmllZCA9IDA7CisJCQluZXdfamggPSBuZXdfamgtPmJfdG5leHQ7CisJCX0gd2hpbGUgKG5ld19qaCAhPSBqaCk7CisJfQorCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisKKwkvKgorCSAqIE5vdyBzdGFydCBmbHVzaGluZyB0aGluZ3MgdG8gZGlzaywgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyCisJICogb24gdGhlIHRyYW5zYWN0aW9uIGxpc3RzLiAgRGF0YSBibG9ja3MgZ28gZmlyc3QuCisJICovCisKKwllcnIgPSAwOworCS8qCisJICogV2hlbmV2ZXIgd2UgdW5sb2NrIHRoZSBqb3VybmFsIGFuZCBzbGVlcCwgdGhpbmdzIGNhbiBnZXQgYWRkZWQKKwkgKiBvbnRvIC0+dF9zeW5jX2RhdGFsaXN0LCBzbyB3ZSBoYXZlIHRvIGtlZXAgbG9vcGluZyBiYWNrIHRvCisJICogd3JpdGVfb3V0X2RhdGEgdW50aWwgd2UgKmtub3cqIHRoYXQgdGhlIGxpc3QgaXMgZW1wdHkuCisJICovCisJYnVmcyA9IDA7CisJLyoKKwkgKiBDbGVhbnVwIGFueSBmbHVzaGVkIGRhdGEgYnVmZmVycyBmcm9tIHRoZSBkYXRhIGxpc3QuICBFdmVuIGluCisJICogYWJvcnQgbW9kZSwgd2Ugd2FudCB0byBmbHVzaCB0aGlzIG91dCBhcyBzb29uIGFzIHBvc3NpYmxlLgorCSAqLword3JpdGVfb3V0X2RhdGE6CisJY29uZF9yZXNjaGVkKCk7CisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisKKwl3aGlsZSAoY29tbWl0X3RyYW5zYWN0aW9uLT50X3N5bmNfZGF0YWxpc3QpIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCQlqaCA9IGNvbW1pdF90cmFuc2FjdGlvbi0+dF9zeW5jX2RhdGFsaXN0OworCQljb21taXRfdHJhbnNhY3Rpb24tPnRfc3luY19kYXRhbGlzdCA9IGpoLT5iX3RuZXh0OworCQliaCA9IGpoMmJoKGpoKTsKKwkJaWYgKGJ1ZmZlcl9sb2NrZWQoYmgpKSB7CisJCQlCVUZGRVJfVFJBQ0UoYmgsICJsb2NrZWQiKTsKKwkJCWlmICghaW52ZXJ0ZWRfbG9jayhqb3VybmFsLCBiaCkpCisJCQkJZ290byB3cml0ZV9vdXRfZGF0YTsKKwkJCV9fam91cm5hbF90ZW1wX3VubGlua19idWZmZXIoamgpOworCQkJX19qb3VybmFsX2ZpbGVfYnVmZmVyKGpoLCBjb21taXRfdHJhbnNhY3Rpb24sCisJCQkJCQlCSl9Mb2NrZWQpOworCQkJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisJCQlpZiAobG9ja19uZWVkX3Jlc2NoZWQoJmpvdXJuYWwtPmpfbGlzdF9sb2NrKSkgeworCQkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJCQkJZ290byB3cml0ZV9vdXRfZGF0YTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChidWZmZXJfZGlydHkoYmgpKSB7CisJCQkJQlVGRkVSX1RSQUNFKGJoLCAic3RhcnQgam91cm5hbCB3cml0ZW91dCIpOworCQkJCWdldF9iaChiaCk7CisJCQkJd2J1ZltidWZzKytdID0gYmg7CisJCQkJaWYgKGJ1ZnMgPT0gam91cm5hbC0+al93YnVmc2l6ZSkgeworCQkJCQlqYmRfZGVidWcoMiwgInN1Ym1pdCAlZCB3cml0ZXNcbiIsCisJCQkJCQkJYnVmcyk7CisJCQkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJCQkJCWxsX3J3X2Jsb2NrKFdSSVRFLCBidWZzLCB3YnVmKTsKKwkJCQkJam91cm5hbF9icmVsc2VfYXJyYXkod2J1ZiwgYnVmcyk7CisJCQkJCWJ1ZnMgPSAwOworCQkJCQlnb3RvIHdyaXRlX291dF9kYXRhOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJQlVGRkVSX1RSQUNFKGJoLCAid3JpdGVvdXQgY29tcGxldGU6IHVuZmlsZSIpOworCQkJCWlmICghaW52ZXJ0ZWRfbG9jayhqb3VybmFsLCBiaCkpCisJCQkJCWdvdG8gd3JpdGVfb3V0X2RhdGE7CisJCQkJX19qb3VybmFsX3VuZmlsZV9idWZmZXIoamgpOworCQkJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQkJCWpvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZChiaCk7CisJCQkJcHV0X2JoKGJoKTsKKwkJCQlpZiAobG9ja19uZWVkX3Jlc2NoZWQoJmpvdXJuYWwtPmpfbGlzdF9sb2NrKSkgeworCQkJCQlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCQkJCQlnb3RvIHdyaXRlX291dF9kYXRhOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmIChidWZzKSB7CisJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJCWxsX3J3X2Jsb2NrKFdSSVRFLCBidWZzLCB3YnVmKTsKKwkJam91cm5hbF9icmVsc2VfYXJyYXkod2J1ZiwgYnVmcyk7CisJCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCX0KKworCS8qCisJICogV2FpdCBmb3IgYWxsIHByZXZpb3VzbHkgc3VibWl0dGVkIElPIHRvIGNvbXBsZXRlLgorCSAqLworCXdoaWxlIChjb21taXRfdHJhbnNhY3Rpb24tPnRfbG9ja2VkX2xpc3QpIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCQlqaCA9IGNvbW1pdF90cmFuc2FjdGlvbi0+dF9sb2NrZWRfbGlzdC0+Yl90cHJldjsKKwkJYmggPSBqaDJiaChqaCk7CisJCWdldF9iaChiaCk7CisJCWlmIChidWZmZXJfbG9ja2VkKGJoKSkgeworCQkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJCXdhaXRfb25fYnVmZmVyKGJoKTsKKwkJCWlmICh1bmxpa2VseSghYnVmZmVyX3VwdG9kYXRlKGJoKSkpCisJCQkJZXJyID0gLUVJTzsKKwkJCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCQl9CisJCWlmICghaW52ZXJ0ZWRfbG9jayhqb3VybmFsLCBiaCkpIHsKKwkJCXB1dF9iaChiaCk7CisJCQlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChidWZmZXJfamJkKGJoKSAmJiBqaC0+Yl9qbGlzdCA9PSBCSl9Mb2NrZWQpIHsKKwkJCV9fam91cm5hbF91bmZpbGVfYnVmZmVyKGpoKTsKKwkJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQkJam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKGJoKTsKKwkJCXB1dF9iaChiaCk7CisJCX0gZWxzZSB7CisJCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKwkJfQorCQlwdXRfYmgoYmgpOworCQljb25kX3Jlc2NoZWRfbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCX0KKwlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCisJaWYgKGVycikKKwkJX19qb3VybmFsX2Fib3J0X2hhcmQoam91cm5hbCk7CisKKwlqb3VybmFsX3dyaXRlX3Jldm9rZV9yZWNvcmRzKGpvdXJuYWwsIGNvbW1pdF90cmFuc2FjdGlvbik7CisKKwlqYmRfZGVidWcoMywgIkpCRDogY29tbWl0IHBoYXNlIDJcbiIpOworCisJLyoKKwkgKiBJZiB3ZSBmb3VuZCBhbnkgZGlydHkgb3IgbG9ja2VkIGJ1ZmZlcnMsIHRoZW4gd2Ugc2hvdWxkIGhhdmUKKwkgKiBsb29wZWQgYmFjayB1cCB0byB0aGUgd3JpdGVfb3V0X2RhdGEgbGFiZWwuICBJZiB0aGVyZSB3ZXJlbid0CisJICogYW55IHRoZW4gam91cm5hbF9jbGVhbl9kYXRhX2xpc3Qgc2hvdWxkIGhhdmUgd2lwZWQgdGhlIGxpc3QKKwkgKiBjbGVhbiBieSBub3csIHNvIGNoZWNrIHRoYXQgaXQgaXMgaW4gZmFjdCBlbXB0eS4KKwkgKi8KKwlKX0FTU0VSVCAoY29tbWl0X3RyYW5zYWN0aW9uLT50X3N5bmNfZGF0YWxpc3QgPT0gTlVMTCk7CisKKwlqYmRfZGVidWcgKDMsICJKQkQ6IGNvbW1pdCBwaGFzZSAzXG4iKTsKKworCS8qCisJICogV2F5IHRvIGdvOiB3ZSBoYXZlIG5vdyB3cml0dGVuIG91dCBhbGwgb2YgdGhlIGRhdGEgZm9yIGEKKwkgKiB0cmFuc2FjdGlvbiEgIE5vdyBjb21lcyB0aGUgdHJpY2t5IHBhcnQ6IHdlIG5lZWQgdG8gd3JpdGUgb3V0CisJICogbWV0YWRhdGEuICBMb29wIG92ZXIgdGhlIHRyYW5zYWN0aW9uJ3MgZW50aXJlIGJ1ZmZlciBsaXN0OgorCSAqLworCWNvbW1pdF90cmFuc2FjdGlvbi0+dF9zdGF0ZSA9IFRfQ09NTUlUOworCisJZGVzY3JpcHRvciA9IE5VTEw7CisJYnVmcyA9IDA7CisJd2hpbGUgKGNvbW1pdF90cmFuc2FjdGlvbi0+dF9idWZmZXJzKSB7CisKKwkJLyogRmluZCB0aGUgbmV4dCBidWZmZXIgdG8gYmUgam91cm5hbGVkLi4uICovCisKKwkJamggPSBjb21taXRfdHJhbnNhY3Rpb24tPnRfYnVmZmVyczsKKworCQkvKiBJZiB3ZSdyZSBpbiBhYm9ydCBtb2RlLCB3ZSBqdXN0IHVuLWpvdXJuYWwgdGhlIGJ1ZmZlciBhbmQKKwkJICAgcmVsZWFzZSBpdCBmb3IgYmFja2dyb3VuZCB3cml0aW5nLiAqLworCisJCWlmIChpc19qb3VybmFsX2Fib3J0ZWQoam91cm5hbCkpIHsKKwkJCUpCVUZGRVJfVFJBQ0UoamgsICJqb3VybmFsIGlzIGFib3J0aW5nOiByZWZpbGUiKTsKKwkJCWpvdXJuYWxfcmVmaWxlX2J1ZmZlcihqb3VybmFsLCBqaCk7CisJCQkvKiBJZiB0aGF0IHdhcyB0aGUgbGFzdCBvbmUsIHdlIG5lZWQgdG8gY2xlYW4gdXAKKwkJCSAqIGFueSBkZXNjcmlwdG9yIGJ1ZmZlcnMgd2hpY2ggbWF5IGhhdmUgYmVlbgorCQkJICogYWxyZWFkeSBhbGxvY2F0ZWQsIGV2ZW4gaWYgd2UgYXJlIG5vdworCQkJICogYWJvcnRpbmcuICovCisJCQlpZiAoIWNvbW1pdF90cmFuc2FjdGlvbi0+dF9idWZmZXJzKQorCQkJCWdvdG8gc3RhcnRfam91cm5hbF9pbzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogTWFrZSBzdXJlIHdlIGhhdmUgYSBkZXNjcmlwdG9yIGJsb2NrIGluIHdoaWNoIHRvCisJCSAgIHJlY29yZCB0aGUgbWV0YWRhdGEgYnVmZmVyLiAqLworCisJCWlmICghZGVzY3JpcHRvcikgeworCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCQkJSl9BU1NFUlQgKGJ1ZnMgPT0gMCk7CisKKwkJCWpiZF9kZWJ1Zyg0LCAiSkJEOiBnZXQgZGVzY3JpcHRvclxuIik7CisKKwkJCWRlc2NyaXB0b3IgPSBqb3VybmFsX2dldF9kZXNjcmlwdG9yX2J1ZmZlcihqb3VybmFsKTsKKwkJCWlmICghZGVzY3JpcHRvcikgeworCQkJCV9fam91cm5hbF9hYm9ydF9oYXJkKGpvdXJuYWwpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQliaCA9IGpoMmJoKGRlc2NyaXB0b3IpOworCQkJamJkX2RlYnVnKDQsICJKQkQ6IGdvdCBidWZmZXIgJWxsdSAoJXApXG4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tuciwgYmgtPmJfZGF0YSk7CisJCQloZWFkZXIgPSAoam91cm5hbF9oZWFkZXJfdCAqKSZiaC0+Yl9kYXRhWzBdOworCQkJaGVhZGVyLT5oX21hZ2ljICAgICA9IGNwdV90b19iZTMyKEpGU19NQUdJQ19OVU1CRVIpOworCQkJaGVhZGVyLT5oX2Jsb2NrdHlwZSA9IGNwdV90b19iZTMyKEpGU19ERVNDUklQVE9SX0JMT0NLKTsKKwkJCWhlYWRlci0+aF9zZXF1ZW5jZSAgPSBjcHVfdG9fYmUzMihjb21taXRfdHJhbnNhY3Rpb24tPnRfdGlkKTsKKworCQkJdGFncCA9ICZiaC0+Yl9kYXRhW3NpemVvZihqb3VybmFsX2hlYWRlcl90KV07CisJCQlzcGFjZV9sZWZ0ID0gYmgtPmJfc2l6ZSAtIHNpemVvZihqb3VybmFsX2hlYWRlcl90KTsKKwkJCWZpcnN0X3RhZyA9IDE7CisJCQlzZXRfYnVmZmVyX2p3cml0ZShiaCk7CisJCQlzZXRfYnVmZmVyX2RpcnR5KGJoKTsKKwkJCXdidWZbYnVmcysrXSA9IGJoOworCisJCQkvKiBSZWNvcmQgaXQgc28gdGhhdCB3ZSBjYW4gd2FpdCBmb3IgSU8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb24gbGF0ZXIgKi8KKwkJCUJVRkZFUl9UUkFDRShiaCwgInBoMzogZmlsZSBhcyBkZXNjcmlwdG9yIik7CisJCQlqb3VybmFsX2ZpbGVfYnVmZmVyKGRlc2NyaXB0b3IsIGNvbW1pdF90cmFuc2FjdGlvbiwKKwkJCQkJQkpfTG9nQ3RsKTsKKwkJfQorCisJCS8qIFdoZXJlIGlzIHRoZSBidWZmZXIgdG8gYmUgd3JpdHRlbj8gKi8KKworCQllcnIgPSBqb3VybmFsX25leHRfbG9nX2Jsb2NrKGpvdXJuYWwsICZibG9ja25yKTsKKwkJLyogSWYgdGhlIGJsb2NrIG1hcHBpbmcgZmFpbGVkLCBqdXN0IGFiYW5kb24gdGhlIGJ1ZmZlcgorCQkgICBhbmQgcmVwZWF0IHRoaXMgbG9vcDogd2UnbGwgZmFsbCBpbnRvIHRoZQorCQkgICByZWZpbGUtb24tYWJvcnQgY29uZGl0aW9uIGFib3ZlLiAqLworCQlpZiAoZXJyKSB7CisJCQlfX2pvdXJuYWxfYWJvcnRfaGFyZChqb3VybmFsKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogc3RhcnRfdGhpc19oYW5kbGUoKSB1c2VzIHRfb3V0c3RhbmRpbmdfY3JlZGl0cyB0byBkZXRlcm1pbmUKKwkJICogdGhlIGZyZWUgc3BhY2UgaW4gdGhlIGxvZywgYnV0IHRoaXMgY291bnRlciBpcyBjaGFuZ2VkCisJCSAqIGJ5IGpvdXJuYWxfbmV4dF9sb2dfYmxvY2soKSBhbHNvLgorCQkgKi8KKwkJY29tbWl0X3RyYW5zYWN0aW9uLT50X291dHN0YW5kaW5nX2NyZWRpdHMtLTsKKworCQkvKiBCdW1wIGJfY291bnQgdG8gcHJldmVudCB0cnVuY2F0ZSBmcm9tIHN0dW1ibGluZyBvdmVyCisgICAgICAgICAgICAgICAgICAgdGhlIHNoYWRvd2VkIGJ1ZmZlciEgIEBAQCBUaGlzIGNhbiBnbyBpZiB3ZSBldmVyIGdldAorICAgICAgICAgICAgICAgICAgIHJpZCBvZiB0aGUgQkpfSU8vQkpfU2hhZG93IHBhaXJpbmcgb2YgYnVmZmVycy4gKi8KKwkJYXRvbWljX2luYygmamgyYmgoamgpLT5iX2NvdW50KTsKKworCQkvKiBNYWtlIGEgdGVtcG9yYXJ5IElPIGJ1ZmZlciB3aXRoIHdoaWNoIHRvIHdyaXRlIGl0IG91dAorICAgICAgICAgICAgICAgICAgICh0aGlzIHdpbGwgcmVxdWV1ZSBib3RoIHRoZSBtZXRhZGF0YSBidWZmZXIgYW5kIHRoZQorICAgICAgICAgICAgICAgICAgIHRlbXBvcmFyeSBJTyBidWZmZXIpLiBuZXdfYmggZ29lcyBvbiBCSl9JTyovCisKKwkJc2V0X2JpdChCSF9KV3JpdGUsICZqaDJiaChqaCktPmJfc3RhdGUpOworCQkvKgorCQkgKiBha3BtOiBqb3VybmFsX3dyaXRlX21ldGFkYXRhX2J1ZmZlcigpIHNldHMKKwkJICogbmV3X2JoLT5iX3RyYW5zYWN0aW9uIHRvIGNvbW1pdF90cmFuc2FjdGlvbi4KKwkJICogV2UgbmVlZCB0byBjbGVhbiB0aGlzIHVwIGJlZm9yZSB3ZSByZWxlYXNlIG5ld19iaAorCQkgKiAod2hpY2ggaXMgb2YgdHlwZSBCSl9JTykKKwkJICovCisJCUpCVUZGRVJfVFJBQ0UoamgsICJwaDM6IHdyaXRlIG1ldGFkYXRhIik7CisJCWZsYWdzID0gam91cm5hbF93cml0ZV9tZXRhZGF0YV9idWZmZXIoY29tbWl0X3RyYW5zYWN0aW9uLAorCQkJCQkJICAgICAgamgsICZuZXdfamgsIGJsb2NrbnIpOworCQlzZXRfYml0KEJIX0pXcml0ZSwgJmpoMmJoKG5ld19qaCktPmJfc3RhdGUpOworCQl3YnVmW2J1ZnMrK10gPSBqaDJiaChuZXdfamgpOworCisJCS8qIFJlY29yZCB0aGUgbmV3IGJsb2NrJ3MgdGFnIGluIHRoZSBjdXJyZW50IGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICBidWZmZXIgKi8KKworCQl0YWdfZmxhZyA9IDA7CisJCWlmIChmbGFncyAmIDEpCisJCQl0YWdfZmxhZyB8PSBKRlNfRkxBR19FU0NBUEU7CisJCWlmICghZmlyc3RfdGFnKQorCQkJdGFnX2ZsYWcgfD0gSkZTX0ZMQUdfU0FNRV9VVUlEOworCisJCXRhZyA9IChqb3VybmFsX2Jsb2NrX3RhZ190ICopIHRhZ3A7CisJCXRhZy0+dF9ibG9ja25yID0gY3B1X3RvX2JlMzIoamgyYmgoamgpLT5iX2Jsb2NrbnIpOworCQl0YWctPnRfZmxhZ3MgPSBjcHVfdG9fYmUzMih0YWdfZmxhZyk7CisJCXRhZ3AgKz0gc2l6ZW9mKGpvdXJuYWxfYmxvY2tfdGFnX3QpOworCQlzcGFjZV9sZWZ0IC09IHNpemVvZihqb3VybmFsX2Jsb2NrX3RhZ190KTsKKworCQlpZiAoZmlyc3RfdGFnKSB7CisJCQltZW1jcHkgKHRhZ3AsIGpvdXJuYWwtPmpfdXVpZCwgMTYpOworCQkJdGFncCArPSAxNjsKKwkJCXNwYWNlX2xlZnQgLT0gMTY7CisJCQlmaXJzdF90YWcgPSAwOworCQl9CisKKwkJLyogSWYgdGhlcmUncyBubyBtb3JlIHRvIGRvLCBvciBpZiB0aGUgZGVzY3JpcHRvciBpcyBmdWxsLAorCQkgICBsZXQgdGhlIElPIHJpcCEgKi8KKworCQlpZiAoYnVmcyA9PSBqb3VybmFsLT5qX3didWZzaXplIHx8CisJCSAgICBjb21taXRfdHJhbnNhY3Rpb24tPnRfYnVmZmVycyA9PSBOVUxMIHx8CisJCSAgICBzcGFjZV9sZWZ0IDwgc2l6ZW9mKGpvdXJuYWxfYmxvY2tfdGFnX3QpICsgMTYpIHsKKworCQkJamJkX2RlYnVnKDQsICJKQkQ6IFN1Ym1pdCAlZCBJT3NcbiIsIGJ1ZnMpOworCisJCQkvKiBXcml0ZSBhbiBlbmQtb2YtZGVzY3JpcHRvciBtYXJrZXIgYmVmb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXR0aW5nIHRoZSBJT3MuICAidGFnIiBzdGlsbCBwb2ludHMgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsYXN0IHRhZyB3ZSBzZXQgdXAuICovCisKKwkJCXRhZy0+dF9mbGFncyB8PSBjcHVfdG9fYmUzMihKRlNfRkxBR19MQVNUX1RBRyk7CisKK3N0YXJ0X2pvdXJuYWxfaW86CisJCQlmb3IgKGkgPSAwOyBpIDwgYnVmczsgaSsrKSB7CisJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IHdidWZbaV07CisJCQkJbG9ja19idWZmZXIoYmgpOworCQkJCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisJCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCQkJYmgtPmJfZW5kX2lvID0gam91cm5hbF9lbmRfYnVmZmVyX2lvX3N5bmM7CisJCQkJc3VibWl0X2JoKFdSSVRFLCBiaCk7CisJCQl9CisJCQljb25kX3Jlc2NoZWQoKTsKKworCQkJLyogRm9yY2UgYSBuZXcgZGVzY3JpcHRvciB0byBiZSBnZW5lcmF0ZWQgbmV4dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSByb3VuZCB0aGUgbG9vcC4gKi8KKwkJCWRlc2NyaXB0b3IgPSBOVUxMOworCQkJYnVmcyA9IDA7CisJCX0KKwl9CisKKwkvKiBMbyBhbmQgYmVob2xkOiB3ZSBoYXZlIGp1c3QgbWFuYWdlZCB0byBzZW5kIGEgdHJhbnNhY3Rpb24gdG8KKyAgICAgICAgICAgdGhlIGxvZy4gIEJlZm9yZSB3ZSBjYW4gY29tbWl0IGl0LCB3YWl0IGZvciB0aGUgSU8gc28gZmFyIHRvCisgICAgICAgICAgIGNvbXBsZXRlLiAgQ29udHJvbCBidWZmZXJzIGJlaW5nIHdyaXR0ZW4gYXJlIG9uIHRoZQorICAgICAgICAgICB0cmFuc2FjdGlvbidzIHRfbG9nX2xpc3QgcXVldWUsIGFuZCBtZXRhZGF0YSBidWZmZXJzIGFyZSBvbgorICAgICAgICAgICB0aGUgdF9pb2J1Zl9saXN0IHF1ZXVlLgorCisJICAgV2FpdCBmb3IgdGhlIGJ1ZmZlcnMgaW4gcmV2ZXJzZSBvcmRlci4gIFRoYXQgd2F5IHdlIGFyZQorCSAgIGxlc3MgbGlrZWx5IHRvIGJlIHdva2VuIHVwIHVudGlsIGFsbCBJT3MgaGF2ZSBjb21wbGV0ZWQsIGFuZAorCSAgIHNvIHdlIGluY3VyIGxlc3Mgc2NoZWR1bGluZyBsb2FkLgorCSovCisKKwlqYmRfZGVidWcoMywgIkpCRDogY29tbWl0IHBoYXNlIDRcbiIpOworCisJLyoKKwkgKiBha3BtOiB0aGVzZSBhcmUgQkpfSU8sIGFuZCBqX2xpc3RfbG9jayBpcyBub3QgbmVlZGVkLgorCSAqIFNlZSBfX2pvdXJuYWxfdHJ5X3RvX2ZyZWVfYnVmZmVyLgorCSAqLword2FpdF9mb3JfaW9idWY6CisJd2hpbGUgKGNvbW1pdF90cmFuc2FjdGlvbi0+dF9pb2J1Zl9saXN0ICE9IE5VTEwpIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCQlqaCA9IGNvbW1pdF90cmFuc2FjdGlvbi0+dF9pb2J1Zl9saXN0LT5iX3RwcmV2OworCQliaCA9IGpoMmJoKGpoKTsKKwkJaWYgKGJ1ZmZlcl9sb2NrZWQoYmgpKSB7CisJCQl3YWl0X29uX2J1ZmZlcihiaCk7CisJCQlnb3RvIHdhaXRfZm9yX2lvYnVmOworCQl9CisJCWlmIChjb25kX3Jlc2NoZWQoKSkKKwkJCWdvdG8gd2FpdF9mb3JfaW9idWY7CisKKwkJaWYgKHVubGlrZWx5KCFidWZmZXJfdXB0b2RhdGUoYmgpKSkKKwkJCWVyciA9IC1FSU87CisKKwkJY2xlYXJfYnVmZmVyX2p3cml0ZShiaCk7CisKKwkJSkJVRkZFUl9UUkFDRShqaCwgInBoNDogdW5maWxlIGFmdGVyIGpvdXJuYWwgd3JpdGUiKTsKKwkJam91cm5hbF91bmZpbGVfYnVmZmVyKGpvdXJuYWwsIGpoKTsKKworCQkvKgorCQkgKiAtPnRfaW9idWZfbGlzdCBzaG91bGQgY29udGFpbiBvbmx5IGR1bW15IGJ1ZmZlcl9oZWFkcworCQkgKiB3aGljaCB3ZXJlIGNyZWF0ZWQgYnkgam91cm5hbF93cml0ZV9tZXRhZGF0YV9idWZmZXIoKS4KKwkJICovCisJCUJVRkZFUl9UUkFDRShiaCwgImR1bXBpbmcgdGVtcG9yYXJ5IGJoIik7CisJCWpvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZChqaCk7CisJCV9fYnJlbHNlKGJoKTsKKwkJSl9BU1NFUlRfQkgoYmgsIGF0b21pY19yZWFkKCZiaC0+Yl9jb3VudCkgPT0gMCk7CisJCWZyZWVfYnVmZmVyX2hlYWQoYmgpOworCisJCS8qIFdlIGFsc28gaGF2ZSB0byB1bmxvY2sgYW5kIGZyZWUgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICAgICAgICAgICBzaGFkb3dlZCBidWZmZXIgKi8KKwkJamggPSBjb21taXRfdHJhbnNhY3Rpb24tPnRfc2hhZG93X2xpc3QtPmJfdHByZXY7CisJCWJoID0gamgyYmgoamgpOworCQljbGVhcl9iaXQoQkhfSldyaXRlLCAmYmgtPmJfc3RhdGUpOworCQlKX0FTU0VSVF9CSChiaCwgYnVmZmVyX2piZGRpcnR5KGJoKSk7CisKKwkJLyogVGhlIG1ldGFkYXRhIGlzIG5vdyByZWxlYXNlZCBmb3IgcmV1c2UsIGJ1dCB3ZSBuZWVkCisgICAgICAgICAgICAgICAgICAgdG8gcmVtZW1iZXIgaXQgYWdhaW5zdCB0aGlzIHRyYW5zYWN0aW9uIHNvIHRoYXQgd2hlbgorICAgICAgICAgICAgICAgICAgIHdlIGZpbmFsbHkgY29tbWl0LCB3ZSBjYW4gZG8gYW55IGNoZWNrcG9pbnRpbmcKKyAgICAgICAgICAgICAgICAgICByZXF1aXJlZC4gKi8KKwkJSkJVRkZFUl9UUkFDRShqaCwgImZpbGUgYXMgQkpfRm9yZ2V0Iik7CisJCWpvdXJuYWxfZmlsZV9idWZmZXIoamgsIGNvbW1pdF90cmFuc2FjdGlvbiwgQkpfRm9yZ2V0KTsKKwkJLyogV2FrZSB1cCBhbnkgdHJhbnNhY3Rpb25zIHdoaWNoIHdlcmUgd2FpdGluZyBmb3IgdGhpcworCQkgICBJTyB0byBjb21wbGV0ZSAqLworCQl3YWtlX3VwX2JpdCgmYmgtPmJfc3RhdGUsIEJIX1Vuc2hhZG93KTsKKwkJSkJVRkZFUl9UUkFDRShqaCwgImJyZWxzZSBzaGFkb3dlZCBidWZmZXIiKTsKKwkJX19icmVsc2UoYmgpOworCX0KKworCUpfQVNTRVJUIChjb21taXRfdHJhbnNhY3Rpb24tPnRfc2hhZG93X2xpc3QgPT0gTlVMTCk7CisKKwlqYmRfZGVidWcoMywgIkpCRDogY29tbWl0IHBoYXNlIDVcbiIpOworCisJLyogSGVyZSB3ZSB3YWl0IGZvciB0aGUgcmV2b2tlIHJlY29yZCBhbmQgZGVzY3JpcHRvciByZWNvcmQgYnVmZmVycyAqLworIHdhaXRfZm9yX2N0bGJ1ZjoKKwl3aGlsZSAoY29tbWl0X3RyYW5zYWN0aW9uLT50X2xvZ19saXN0ICE9IE5VTEwpIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCQlqaCA9IGNvbW1pdF90cmFuc2FjdGlvbi0+dF9sb2dfbGlzdC0+Yl90cHJldjsKKwkJYmggPSBqaDJiaChqaCk7CisJCWlmIChidWZmZXJfbG9ja2VkKGJoKSkgeworCQkJd2FpdF9vbl9idWZmZXIoYmgpOworCQkJZ290byB3YWl0X2Zvcl9jdGxidWY7CisJCX0KKwkJaWYgKGNvbmRfcmVzY2hlZCgpKQorCQkJZ290byB3YWl0X2Zvcl9jdGxidWY7CisKKwkJaWYgKHVubGlrZWx5KCFidWZmZXJfdXB0b2RhdGUoYmgpKSkKKwkJCWVyciA9IC1FSU87CisKKwkJQlVGRkVSX1RSQUNFKGJoLCAicGg1OiBjb250cm9sIGJ1ZmZlciB3cml0ZW91dCBkb25lOiB1bmZpbGUiKTsKKwkJY2xlYXJfYnVmZmVyX2p3cml0ZShiaCk7CisJCWpvdXJuYWxfdW5maWxlX2J1ZmZlcihqb3VybmFsLCBqaCk7CisJCWpvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZChqaCk7CisJCV9fYnJlbHNlKGJoKTsJCS8qIE9uZSBmb3IgZ2V0YmxrICovCisJCS8qIEFLUE06IGJmb3JnZXQgaGVyZSAqLworCX0KKworCWpiZF9kZWJ1ZygzLCAiSkJEOiBjb21taXQgcGhhc2UgNlxuIik7CisKKwlpZiAoam91cm5hbF93cml0ZV9jb21taXRfcmVjb3JkKGpvdXJuYWwsIGNvbW1pdF90cmFuc2FjdGlvbikpCisJCWVyciA9IC1FSU87CisKKwlpZiAoZXJyKQorCQlfX2pvdXJuYWxfYWJvcnRfaGFyZChqb3VybmFsKTsKKworCS8qIEVuZCBvZiBhIHRyYW5zYWN0aW9uISAgRmluYWxseSwgd2UgY2FuIGRvIGNoZWNrcG9pbnQKKyAgICAgICAgICAgcHJvY2Vzc2luZzogYW55IGJ1ZmZlcnMgY29tbWl0dGVkIGFzIGEgcmVzdWx0IG9mIHRoaXMKKyAgICAgICAgICAgdHJhbnNhY3Rpb24gY2FuIGJlIHJlbW92ZWQgZnJvbSBhbnkgY2hlY2twb2ludCBsaXN0IGl0IHdhcyBvbgorICAgICAgICAgICBiZWZvcmUuICovCisKKwlqYmRfZGVidWcoMywgIkpCRDogY29tbWl0IHBoYXNlIDdcbiIpOworCisJSl9BU1NFUlQoY29tbWl0X3RyYW5zYWN0aW9uLT50X3N5bmNfZGF0YWxpc3QgPT0gTlVMTCk7CisJSl9BU1NFUlQoY29tbWl0X3RyYW5zYWN0aW9uLT50X2J1ZmZlcnMgPT0gTlVMTCk7CisJSl9BU1NFUlQoY29tbWl0X3RyYW5zYWN0aW9uLT50X2NoZWNrcG9pbnRfbGlzdCA9PSBOVUxMKTsKKwlKX0FTU0VSVChjb21taXRfdHJhbnNhY3Rpb24tPnRfaW9idWZfbGlzdCA9PSBOVUxMKTsKKwlKX0FTU0VSVChjb21taXRfdHJhbnNhY3Rpb24tPnRfc2hhZG93X2xpc3QgPT0gTlVMTCk7CisJSl9BU1NFUlQoY29tbWl0X3RyYW5zYWN0aW9uLT50X2xvZ19saXN0ID09IE5VTEwpOworCityZXN0YXJ0X2xvb3A6CisJd2hpbGUgKGNvbW1pdF90cmFuc2FjdGlvbi0+dF9mb3JnZXQpIHsKKwkJdHJhbnNhY3Rpb25fdCAqY3BfdHJhbnNhY3Rpb247CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwkJamggPSBjb21taXRfdHJhbnNhY3Rpb24tPnRfZm9yZ2V0OworCQliaCA9IGpoMmJoKGpoKTsKKwkJamJkX2xvY2tfYmhfc3RhdGUoYmgpOworCQlKX0FTU0VSVF9KSChqaCwJamgtPmJfdHJhbnNhY3Rpb24gPT0gY29tbWl0X3RyYW5zYWN0aW9uIHx8CisJCQlqaC0+Yl90cmFuc2FjdGlvbiA9PSBqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb24pOworCisJCS8qCisJCSAqIElmIHRoZXJlIGlzIHVuZG8tcHJvdGVjdGVkIGNvbW1pdHRlZCBkYXRhIGFnYWluc3QKKwkJICogdGhpcyBidWZmZXIsIHRoZW4gd2UgY2FuIHJlbW92ZSBpdCBub3cuICBJZiBpdCBpcyBhCisJCSAqIGJ1ZmZlciBuZWVkaW5nIHN1Y2ggcHJvdGVjdGlvbiwgdGhlIG9sZCBmcm96ZW5fZGF0YQorCQkgKiBmaWVsZCBub3cgcG9pbnRzIHRvIGEgY29tbWl0dGVkIHZlcnNpb24gb2YgdGhlCisJCSAqIGJ1ZmZlciwgc28gcm90YXRlIHRoYXQgZmllbGQgdG8gdGhlIG5ldyBjb21taXR0ZWQKKwkJICogZGF0YS4KKwkJICoKKwkJICogT3RoZXJ3aXNlLCB3ZSBjYW4ganVzdCB0aHJvdyBhd2F5IHRoZSBmcm96ZW4gZGF0YSBub3cuCisJCSAqLworCQlpZiAoamgtPmJfY29tbWl0dGVkX2RhdGEpIHsKKwkJCWtmcmVlKGpoLT5iX2NvbW1pdHRlZF9kYXRhKTsKKwkJCWpoLT5iX2NvbW1pdHRlZF9kYXRhID0gTlVMTDsKKwkJCWlmIChqaC0+Yl9mcm96ZW5fZGF0YSkgeworCQkJCWpoLT5iX2NvbW1pdHRlZF9kYXRhID0gamgtPmJfZnJvemVuX2RhdGE7CisJCQkJamgtPmJfZnJvemVuX2RhdGEgPSBOVUxMOworCQkJfQorCQl9IGVsc2UgaWYgKGpoLT5iX2Zyb3plbl9kYXRhKSB7CisJCQlrZnJlZShqaC0+Yl9mcm96ZW5fZGF0YSk7CisJCQlqaC0+Yl9mcm96ZW5fZGF0YSA9IE5VTEw7CisJCX0KKworCQlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJY3BfdHJhbnNhY3Rpb24gPSBqaC0+Yl9jcF90cmFuc2FjdGlvbjsKKwkJaWYgKGNwX3RyYW5zYWN0aW9uKSB7CisJCQlKQlVGRkVSX1RSQUNFKGpoLCAicmVtb3ZlIGZyb20gb2xkIGNwIHRyYW5zYWN0aW9uIik7CisJCQlfX2pvdXJuYWxfcmVtb3ZlX2NoZWNrcG9pbnQoamgpOworCQl9CisKKwkJLyogT25seSByZS1jaGVja3BvaW50IHRoZSBidWZmZXJfaGVhZCBpZiBpdCBpcyBtYXJrZWQKKwkJICogZGlydHkuICBJZiB0aGUgYnVmZmVyIHdhcyBhZGRlZCB0byB0aGUgQkpfRm9yZ2V0IGxpc3QKKwkJICogYnkgam91cm5hbF9mb3JnZXQsIGl0IG1heSBubyBsb25nZXIgYmUgZGlydHkgYW5kCisJCSAqIHRoZXJlJ3Mgbm8gcG9pbnQgaW4ga2VlcGluZyBhIGNoZWNrcG9pbnQgcmVjb3JkIGZvcgorCQkgKiBpdC4gKi8KKworCQkvKiBBIGJ1ZmZlciB3aGljaCBoYXMgYmVlbiBmcmVlZCB3aGlsZSBzdGlsbCBiZWluZworCQkgKiBqb3VybmFsZWQgYnkgYSBwcmV2aW91cyB0cmFuc2FjdGlvbiBtYXkgZW5kIHVwIHN0aWxsCisJCSAqIGJlaW5nIGRpcnR5IGhlcmUsIGJ1dCB3ZSB3YW50IHRvIGF2b2lkIHdyaXRpbmcgYmFjaworCQkgKiB0aGF0IGJ1ZmZlciBpbiB0aGUgZnV0dXJlIG5vdyB0aGF0IHRoZSBsYXN0IHVzZSBoYXMKKwkJICogYmVlbiBjb21taXR0ZWQuICBUaGF0J3Mgbm90IG9ubHkgYSBwZXJmb3JtYW5jZSBnYWluLAorCQkgKiBpdCBhbHNvIHN0b3BzIGFsaWFzaW5nIHByb2JsZW1zIGlmIHRoZSBidWZmZXIgaXMgbGVmdAorCQkgKiBiZWhpbmQgZm9yIHdyaXRlYmFjayBhbmQgZ2V0cyByZWFsbG9jYXRlZCBmb3IgYW5vdGhlcgorCQkgKiB1c2UgaW4gYSBkaWZmZXJlbnQgcGFnZS4gKi8KKwkJaWYgKGJ1ZmZlcl9mcmVlZChiaCkpIHsKKwkJCWNsZWFyX2J1ZmZlcl9mcmVlZChiaCk7CisJCQljbGVhcl9idWZmZXJfamJkZGlydHkoYmgpOworCQl9CisKKwkJaWYgKGJ1ZmZlcl9qYmRkaXJ0eShiaCkpIHsKKwkJCUpCVUZGRVJfVFJBQ0UoamgsICJhZGQgdG8gbmV3IGNoZWNrcG9pbnRpbmcgdHJhbnMiKTsKKwkJCV9fam91cm5hbF9pbnNlcnRfY2hlY2twb2ludChqaCwgY29tbWl0X3RyYW5zYWN0aW9uKTsKKwkJCUpCVUZGRVJfVFJBQ0UoamgsICJyZWZpbGUgZm9yIGNoZWNrcG9pbnQgd3JpdGViYWNrIik7CisJCQlfX2pvdXJuYWxfcmVmaWxlX2J1ZmZlcihqaCk7CisJCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKwkJfSBlbHNlIHsKKwkJCUpfQVNTRVJUX0JIKGJoLCAhYnVmZmVyX2RpcnR5KGJoKSk7CisJCQlKX0FTU0VSVF9KSChqaCwgamgtPmJfbmV4dF90cmFuc2FjdGlvbiA9PSBOVUxMKTsKKwkJCV9fam91cm5hbF91bmZpbGVfYnVmZmVyKGpoKTsKKwkJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQkJam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKGJoKTsgIC8qIG5lZWRzIGEgYnJlbHNlICovCisJCQlyZWxlYXNlX2J1ZmZlcl9wYWdlKGJoKTsKKwkJfQorCQlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCQlpZiAoY29uZF9yZXNjaGVkKCkpCisJCQlnb3RvIHJlc3RhcnRfbG9vcDsKKwl9CisKKwkvKiBEb25lIHdpdGggdGhpcyB0cmFuc2FjdGlvbiEgKi8KKworCWpiZF9kZWJ1ZygzLCAiSkJEOiBjb21taXQgcGhhc2UgOFxuIik7CisKKwlKX0FTU0VSVChjb21taXRfdHJhbnNhY3Rpb24tPnRfc3RhdGUgPT0gVF9DT01NSVQpOworCisJLyoKKwkgKiBUaGlzIGlzIGEgYml0IHNsZWF6eS4gIFdlIGJvcnJvdyBqX2xpc3RfbG9jayB0byBwcm90ZWN0CisJICogam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uIGluIF9fam91cm5hbF9yZW1vdmVfY2hlY2twb2ludC4KKwkgKiBSZWFsbHksIF9fam9ybmFsX3JlbW92ZV9jaGVja3BvaW50IHNob3VsZCBiZSB1c2luZyBqX3N0YXRlX2xvY2sgYnV0CisJICogaXQncyBhIGJpdCBoYXNzbGUgdG8gaG9sZCB0aGF0IGFjcm9zcyBfX2pvdXJuYWxfcmVtb3ZlX2NoZWNrcG9pbnQKKwkgKi8KKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJY29tbWl0X3RyYW5zYWN0aW9uLT50X3N0YXRlID0gVF9GSU5JU0hFRDsKKwlKX0FTU0VSVChjb21taXRfdHJhbnNhY3Rpb24gPT0gam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uKTsKKwlqb3VybmFsLT5qX2NvbW1pdF9zZXF1ZW5jZSA9IGNvbW1pdF90cmFuc2FjdGlvbi0+dF90aWQ7CisJam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uID0gTlVMTDsKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKworCWlmIChjb21taXRfdHJhbnNhY3Rpb24tPnRfY2hlY2twb2ludF9saXN0ID09IE5VTEwpIHsKKwkJX19qb3VybmFsX2Ryb3BfdHJhbnNhY3Rpb24oam91cm5hbCwgY29tbWl0X3RyYW5zYWN0aW9uKTsKKwl9IGVsc2UgeworCQlpZiAoam91cm5hbC0+al9jaGVja3BvaW50X3RyYW5zYWN0aW9ucyA9PSBOVUxMKSB7CisJCQlqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zID0gY29tbWl0X3RyYW5zYWN0aW9uOworCQkJY29tbWl0X3RyYW5zYWN0aW9uLT50X2NwbmV4dCA9IGNvbW1pdF90cmFuc2FjdGlvbjsKKwkJCWNvbW1pdF90cmFuc2FjdGlvbi0+dF9jcHByZXYgPSBjb21taXRfdHJhbnNhY3Rpb247CisJCX0gZWxzZSB7CisJCQljb21taXRfdHJhbnNhY3Rpb24tPnRfY3BuZXh0ID0KKwkJCQlqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zOworCQkJY29tbWl0X3RyYW5zYWN0aW9uLT50X2NwcHJldiA9CisJCQkJY29tbWl0X3RyYW5zYWN0aW9uLT50X2NwbmV4dC0+dF9jcHByZXY7CisJCQljb21taXRfdHJhbnNhY3Rpb24tPnRfY3BuZXh0LT50X2NwcHJldiA9CisJCQkJY29tbWl0X3RyYW5zYWN0aW9uOworCQkJY29tbWl0X3RyYW5zYWN0aW9uLT50X2NwcHJldi0+dF9jcG5leHQgPQorCQkJCWNvbW1pdF90cmFuc2FjdGlvbjsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCisJamJkX2RlYnVnKDEsICJKQkQ6IGNvbW1pdCAlZCBjb21wbGV0ZSwgaGVhZCAlZFxuIiwKKwkJICBqb3VybmFsLT5qX2NvbW1pdF9zZXF1ZW5jZSwgam91cm5hbC0+al90YWlsX3NlcXVlbmNlKTsKKworCXdha2VfdXAoJmpvdXJuYWwtPmpfd2FpdF9kb25lX2NvbW1pdCk7Cit9CmRpZmYgLS1naXQgYS9mcy9qYmQvam91cm5hbC5jIGIvZnMvamJkL2pvdXJuYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTZmMmUyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamJkL2pvdXJuYWwuYwpAQCAtMCwwICsxLDIwMDMgQEAKKy8qCisgKiBsaW51eC9mcy9qb3VybmFsLmMKKyAqCisgKiBXcml0dGVuIGJ5IFN0ZXBoZW4gQy4gVHdlZWRpZSA8c2N0QHJlZGhhdC5jb20+LCAxOTk4CisgKgorICogQ29weXJpZ2h0IDE5OTggUmVkIEhhdCBjb3JwIC0tLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCBhbmQgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgb3IgYXQgeW91cgorICogb3B0aW9uLCBhbnkgbGF0ZXIgdmVyc2lvbiwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogR2VuZXJpYyBmaWxlc3lzdGVtIGpvdXJuYWwtd3JpdGluZyBjb2RlOyBwYXJ0IG9mIHRoZSBleHQyZnMKKyAqIGpvdXJuYWxpbmcgc3lzdGVtLgorICoKKyAqIFRoaXMgZmlsZSBtYW5hZ2VzIGpvdXJuYWxzOiBhcmVhcyBvZiBkaXNrIHJlc2VydmVkIGZvciBsb2dnaW5nCisgKiB0cmFuc2FjdGlvbmFsIHVwZGF0ZXMuICBUaGlzIGluY2x1ZGVzIHRoZSBrZXJuZWwgam91cm5hbGluZyB0aHJlYWQKKyAqIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciBzY2hlZHVsaW5nIHVwZGF0ZXMgdG8gdGhlIGxvZy4KKyAqCisgKiBXZSBkbyBub3QgYWN0dWFsbHkgbWFuYWdlIHRoZSBwaHlzaWNhbCBzdG9yYWdlIG9mIHRoZSBqb3VybmFsIGluIHRoaXMKKyAqIGZpbGU6IHRoYXQgaXMgbGVmdCB0byBhIHBlci1qb3VybmFsIHBvbGljeSBmdW5jdGlvbiwgd2hpY2ggYWxsb3dzIHVzCisgKiB0byBzdG9yZSB0aGUgam91cm5hbCB3aXRoaW4gYSBmaWxlc3lzdGVtLXNwZWNpZmllZCBhcmVhIGZvciBleHQyCisgKiBqb3VybmFsaW5nIChleHQyIGNhbiB1c2UgYSByZXNlcnZlZCBpbm9kZSBmb3Igc3RvcmluZyB0aGUgbG9nKS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvamJkLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisKK0VYUE9SVF9TWU1CT0woam91cm5hbF9zdGFydCk7CitFWFBPUlRfU1lNQk9MKGpvdXJuYWxfcmVzdGFydCk7CitFWFBPUlRfU1lNQk9MKGpvdXJuYWxfZXh0ZW5kKTsKK0VYUE9SVF9TWU1CT0woam91cm5hbF9zdG9wKTsKK0VYUE9SVF9TWU1CT0woam91cm5hbF9sb2NrX3VwZGF0ZXMpOworRVhQT1JUX1NZTUJPTChqb3VybmFsX3VubG9ja191cGRhdGVzKTsKK0VYUE9SVF9TWU1CT0woam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKTsKK0VYUE9SVF9TWU1CT0woam91cm5hbF9nZXRfY3JlYXRlX2FjY2Vzcyk7CitFWFBPUlRfU1lNQk9MKGpvdXJuYWxfZ2V0X3VuZG9fYWNjZXNzKTsKK0VYUE9SVF9TWU1CT0woam91cm5hbF9kaXJ0eV9kYXRhKTsKK0VYUE9SVF9TWU1CT0woam91cm5hbF9kaXJ0eV9tZXRhZGF0YSk7CitFWFBPUlRfU1lNQk9MKGpvdXJuYWxfcmVsZWFzZV9idWZmZXIpOworRVhQT1JUX1NZTUJPTChqb3VybmFsX2ZvcmdldCk7CisjaWYgMAorRVhQT1JUX1NZTUJPTChqb3VybmFsX3N5bmNfYnVmZmVyKTsKKyNlbmRpZgorRVhQT1JUX1NZTUJPTChqb3VybmFsX2ZsdXNoKTsKK0VYUE9SVF9TWU1CT0woam91cm5hbF9yZXZva2UpOworCitFWFBPUlRfU1lNQk9MKGpvdXJuYWxfaW5pdF9kZXYpOworRVhQT1JUX1NZTUJPTChqb3VybmFsX2luaXRfaW5vZGUpOworRVhQT1JUX1NZTUJPTChqb3VybmFsX3VwZGF0ZV9mb3JtYXQpOworRVhQT1JUX1NZTUJPTChqb3VybmFsX2NoZWNrX3VzZWRfZmVhdHVyZXMpOworRVhQT1JUX1NZTUJPTChqb3VybmFsX2NoZWNrX2F2YWlsYWJsZV9mZWF0dXJlcyk7CitFWFBPUlRfU1lNQk9MKGpvdXJuYWxfc2V0X2ZlYXR1cmVzKTsKK0VYUE9SVF9TWU1CT0woam91cm5hbF9jcmVhdGUpOworRVhQT1JUX1NZTUJPTChqb3VybmFsX2xvYWQpOworRVhQT1JUX1NZTUJPTChqb3VybmFsX2Rlc3Ryb3kpOworRVhQT1JUX1NZTUJPTChqb3VybmFsX3JlY292ZXIpOworRVhQT1JUX1NZTUJPTChqb3VybmFsX3VwZGF0ZV9zdXBlcmJsb2NrKTsKK0VYUE9SVF9TWU1CT0woam91cm5hbF9hYm9ydCk7CitFWFBPUlRfU1lNQk9MKGpvdXJuYWxfZXJybm8pOworRVhQT1JUX1NZTUJPTChqb3VybmFsX2Fja19lcnIpOworRVhQT1JUX1NZTUJPTChqb3VybmFsX2NsZWFyX2Vycik7CitFWFBPUlRfU1lNQk9MKGxvZ193YWl0X2NvbW1pdCk7CitFWFBPUlRfU1lNQk9MKGpvdXJuYWxfc3RhcnRfY29tbWl0KTsKK0VYUE9SVF9TWU1CT0woam91cm5hbF9mb3JjZV9jb21taXRfbmVzdGVkKTsKK0VYUE9SVF9TWU1CT0woam91cm5hbF93aXBlKTsKK0VYUE9SVF9TWU1CT0woam91cm5hbF9ibG9ja3NfcGVyX3BhZ2UpOworRVhQT1JUX1NZTUJPTChqb3VybmFsX2ludmFsaWRhdGVwYWdlKTsKK0VYUE9SVF9TWU1CT0woam91cm5hbF90cnlfdG9fZnJlZV9idWZmZXJzKTsKK0VYUE9SVF9TWU1CT0woam91cm5hbF9mb3JjZV9jb21taXQpOworCitzdGF0aWMgaW50IGpvdXJuYWxfY29udmVydF9zdXBlcmJsb2NrX3YxKGpvdXJuYWxfdCAqLCBqb3VybmFsX3N1cGVyYmxvY2tfdCAqKTsKKworLyoKKyAqIEhlbHBlciBmdW5jdGlvbiB1c2VkIHRvIG1hbmFnZSBjb21taXQgdGltZW91dHMKKyAqLworCitzdGF0aWMgdm9pZCBjb21taXRfdGltZW91dCh1bnNpZ25lZCBsb25nIF9fZGF0YSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKiBwID0gKHN0cnVjdCB0YXNrX3N0cnVjdCAqKSBfX2RhdGE7CisKKwl3YWtlX3VwX3Byb2Nlc3MocCk7Cit9CisKKy8qIFN0YXRpYyBjaGVjayBmb3IgZGF0YSBzdHJ1Y3R1cmUgY29uc2lzdGVuY3kuICBUaGVyZSdzIG5vIGNvZGUKKyAqIGludm9rZWQgLS0tIHdlJ2xsIGp1c3QgZ2V0IGEgbGlua2VyIGZhaWx1cmUgaWYgdGhpbmdzIGFyZW4ndCByaWdodC4KKyAqLwordm9pZCBfX2pvdXJuYWxfaW50ZXJuYWxfY2hlY2sodm9pZCkKK3sKKwlleHRlcm4gdm9pZCBqb3VybmFsX2JhZF9zdXBlcmJsb2NrX3NpemUodm9pZCk7CisJaWYgKHNpemVvZihzdHJ1Y3Qgam91cm5hbF9zdXBlcmJsb2NrX3MpICE9IDEwMjQpCisJCWpvdXJuYWxfYmFkX3N1cGVyYmxvY2tfc2l6ZSgpOworfQorCisvKgorICoga2pvdXJuYWxkOiBUaGUgbWFpbiB0aHJlYWQgZnVuY3Rpb24gdXNlZCB0byBtYW5hZ2UgYSBsb2dnaW5nIGRldmljZQorICogam91cm5hbC4KKyAqCisgKiBUaGlzIGtlcm5lbCB0aHJlYWQgaXMgcmVzcG9uc2libGUgZm9yIHR3byB0aGluZ3M6CisgKgorICogMSkgQ09NTUlUOiAgRXZlcnkgc28gb2Z0ZW4gd2UgbmVlZCB0byBjb21taXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlCisgKiAgICBmaWxlc3lzdGVtIHRvIGRpc2suICBUaGUgam91cm5hbCB0aHJlYWQgaXMgcmVzcG9uc2libGUgZm9yIHdyaXRpbmcKKyAqICAgIGFsbCBvZiB0aGUgbWV0YWRhdGEgYnVmZmVycyB0byBkaXNrLgorICoKKyAqIDIpIENIRUNLUE9JTlQ6IFdlIGNhbm5vdCByZXVzZSBhIHVzZWQgc2VjdGlvbiBvZiB0aGUgbG9nIGZpbGUgdW50aWwgYWxsCisgKiAgICBvZiB0aGUgZGF0YSBpbiB0aGF0IHBhcnQgb2YgdGhlIGxvZyBoYXMgYmVlbiByZXdyaXR0ZW4gZWxzZXdoZXJlIG9uCisgKiAgICB0aGUgZGlzay4gIEZsdXNoaW5nIHRoZXNlIG9sZCBidWZmZXJzIHRvIHJlY2xhaW0gc3BhY2UgaW4gdGhlIGxvZyBpcworICogICAga25vd24gYXMgY2hlY2twb2ludGluZywgYW5kIHRoaXMgdGhyZWFkIGlzIHJlc3BvbnNpYmxlIGZvciB0aGF0IGpvYi4KKyAqLworCitqb3VybmFsX3QgKmN1cnJlbnRfam91cm5hbDsJCS8vIEFLUE06IGRlYnVnCisKK2ludCBram91cm5hbGQodm9pZCAqYXJnKQoreworCWpvdXJuYWxfdCAqam91cm5hbCA9IChqb3VybmFsX3QgKikgYXJnOworCXRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCisJY3VycmVudF9qb3VybmFsID0gam91cm5hbDsKKworCWRhZW1vbml6ZSgia2pvdXJuYWxkIik7CisKKwkvKiBTZXQgdXAgYW4gaW50ZXJ2YWwgdGltZXIgd2hpY2ggY2FuIGJlIHVzZWQgdG8gdHJpZ2dlciBhCisgICAgICAgICAgIGNvbW1pdCB3YWtldXAgYWZ0ZXIgdGhlIGNvbW1pdCBpbnRlcnZhbCBleHBpcmVzICovCisJaW5pdF90aW1lcigmdGltZXIpOworCXRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgY3VycmVudDsKKwl0aW1lci5mdW5jdGlvbiA9IGNvbW1pdF90aW1lb3V0OworCWpvdXJuYWwtPmpfY29tbWl0X3RpbWVyID0gJnRpbWVyOworCisJLyogUmVjb3JkIHRoYXQgdGhlIGpvdXJuYWwgdGhyZWFkIGlzIHJ1bm5pbmcgKi8KKwlqb3VybmFsLT5qX3Rhc2sgPSBjdXJyZW50OworCXdha2VfdXAoJmpvdXJuYWwtPmpfd2FpdF9kb25lX2NvbW1pdCk7CisKKwlwcmludGsoS0VSTl9JTkZPICJram91cm5hbGQgc3RhcnRpbmcuICBDb21taXQgaW50ZXJ2YWwgJWxkIHNlY29uZHNcbiIsCisJCQlqb3VybmFsLT5qX2NvbW1pdF9pbnRlcnZhbCAvIEhaKTsKKworCS8qCisJICogQW5kIG5vdywgd2FpdCBmb3JldmVyIGZvciBjb21taXQgd2FrZXVwIGV2ZW50cy4KKwkgKi8KKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisKK2xvb3A6CisJaWYgKGpvdXJuYWwtPmpfZmxhZ3MgJiBKRlNfVU5NT1VOVCkKKwkJZ290byBlbmRfbG9vcDsKKworCWpiZF9kZWJ1ZygxLCAiY29tbWl0X3NlcXVlbmNlPSVkLCBjb21taXRfcmVxdWVzdD0lZFxuIiwKKwkJam91cm5hbC0+al9jb21taXRfc2VxdWVuY2UsIGpvdXJuYWwtPmpfY29tbWl0X3JlcXVlc3QpOworCisJaWYgKGpvdXJuYWwtPmpfY29tbWl0X3NlcXVlbmNlICE9IGpvdXJuYWwtPmpfY29tbWl0X3JlcXVlc3QpIHsKKwkJamJkX2RlYnVnKDEsICJPSywgcmVxdWVzdHMgZGlmZmVyXG4iKTsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJCWRlbF90aW1lcl9zeW5jKGpvdXJuYWwtPmpfY29tbWl0X3RpbWVyKTsKKwkJam91cm5hbF9jb21taXRfdHJhbnNhY3Rpb24oam91cm5hbCk7CisJCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJZ290byBsb29wOworCX0KKworCXdha2VfdXAoJmpvdXJuYWwtPmpfd2FpdF9kb25lX2NvbW1pdCk7CisJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfRlJFRVpFKSB7CisJCS8qCisJCSAqIFRoZSBzaW1wbGVyIHRoZSBiZXR0ZXIuIEZsdXNoaW5nIGpvdXJuYWwgaXNuJ3QgYQorCQkgKiBnb29kIGlkZWEsIGJlY2F1c2UgdGhhdCBkZXBlbmRzIG9uIHRocmVhZHMgdGhhdCBtYXkKKwkJICogYmUgYWxyZWFkeSBzdG9wcGVkLgorCQkgKi8KKwkJamJkX2RlYnVnKDEsICJOb3cgc3VzcGVuZGluZyBram91cm5hbGRcbiIpOworCQlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJcmVmcmlnZXJhdG9yKFBGX0ZSRUVaRSk7CisJCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBXZSBhc3N1bWUgb24gcmVzdW1lIHRoYXQgY29tbWl0cyBhcmUgYWxyZWFkeSB0aGVyZSwKKwkJICogc28gd2UgZG9uJ3Qgc2xlZXAKKwkJICovCisJCURFRklORV9XQUlUKHdhaXQpOworCQlpbnQgc2hvdWxkX3NsZWVwID0gMTsKKworCQlwcmVwYXJlX3RvX3dhaXQoJmpvdXJuYWwtPmpfd2FpdF9jb21taXQsICZ3YWl0LAorCQkJCVRBU0tfSU5URVJSVVBUSUJMRSk7CisJCWlmIChqb3VybmFsLT5qX2NvbW1pdF9zZXF1ZW5jZSAhPSBqb3VybmFsLT5qX2NvbW1pdF9yZXF1ZXN0KQorCQkJc2hvdWxkX3NsZWVwID0gMDsKKwkJdHJhbnNhY3Rpb24gPSBqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb247CisJCWlmICh0cmFuc2FjdGlvbiAmJiB0aW1lX2FmdGVyX2VxKGppZmZpZXMsCisJCQkJCQl0cmFuc2FjdGlvbi0+dF9leHBpcmVzKSkKKwkJCXNob3VsZF9zbGVlcCA9IDA7CisJCWlmIChzaG91bGRfc2xlZXApIHsKKwkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCQkJc2NoZWR1bGUoKTsKKwkJCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJfQorCQlmaW5pc2hfd2FpdCgmam91cm5hbC0+al93YWl0X2NvbW1pdCwgJndhaXQpOworCX0KKworCWpiZF9kZWJ1ZygxLCAia2pvdXJuYWxkIHdha2VzXG4iKTsKKworCS8qCisJICogV2VyZSB3ZSB3b2tlbiB1cCBieSBhIGNvbW1pdCB3YWtldXAgZXZlbnQ/CisJICovCisJdHJhbnNhY3Rpb24gPSBqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb247CisJaWYgKHRyYW5zYWN0aW9uICYmIHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgdHJhbnNhY3Rpb24tPnRfZXhwaXJlcykpIHsKKwkJam91cm5hbC0+al9jb21taXRfcmVxdWVzdCA9IHRyYW5zYWN0aW9uLT50X3RpZDsKKwkJamJkX2RlYnVnKDEsICJ3b2tlIGJlY2F1c2Ugb2YgdGltZW91dFxuIik7CisJfQorCWdvdG8gbG9vcDsKKworZW5kX2xvb3A6CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJZGVsX3RpbWVyX3N5bmMoam91cm5hbC0+al9jb21taXRfdGltZXIpOworCWpvdXJuYWwtPmpfdGFzayA9IE5VTEw7CisJd2FrZV91cCgmam91cm5hbC0+al93YWl0X2RvbmVfY29tbWl0KTsKKwlqYmRfZGVidWcoMSwgIkpvdXJuYWwgdGhyZWFkIGV4aXRpbmcuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgam91cm5hbF9zdGFydF90aHJlYWQoam91cm5hbF90ICpqb3VybmFsKQoreworCWtlcm5lbF90aHJlYWQoa2pvdXJuYWxkLCBqb3VybmFsLCBDTE9ORV9WTXxDTE9ORV9GU3xDTE9ORV9GSUxFUyk7CisJd2FpdF9ldmVudChqb3VybmFsLT5qX3dhaXRfZG9uZV9jb21taXQsIGpvdXJuYWwtPmpfdGFzayAhPSAwKTsKK30KKworc3RhdGljIHZvaWQgam91cm5hbF9raWxsX3RocmVhZChqb3VybmFsX3QgKmpvdXJuYWwpCit7CisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCWpvdXJuYWwtPmpfZmxhZ3MgfD0gSkZTX1VOTU9VTlQ7CisKKwl3aGlsZSAoam91cm5hbC0+al90YXNrKSB7CisJCXdha2VfdXAoJmpvdXJuYWwtPmpfd2FpdF9jb21taXQpOworCQlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJd2FpdF9ldmVudChqb3VybmFsLT5qX3dhaXRfZG9uZV9jb21taXQsIGpvdXJuYWwtPmpfdGFzayA9PSAwKTsKKwkJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCX0KKwlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKK30KKworLyoKKyAqIGpvdXJuYWxfd3JpdGVfbWV0YWRhdGFfYnVmZmVyOiB3cml0ZSBhIG1ldGFkYXRhIGJ1ZmZlciB0byB0aGUgam91cm5hbC4KKyAqCisgKiBXcml0ZXMgYSBtZXRhZGF0YSBidWZmZXIgdG8gYSBnaXZlbiBkaXNrIGJsb2NrLiAgVGhlIGFjdHVhbCBJTyBpcyBub3QKKyAqIHBlcmZvcm1lZCBidXQgYSBuZXcgYnVmZmVyX2hlYWQgaXMgY29uc3RydWN0ZWQgd2hpY2ggbGFiZWxzIHRoZSBkYXRhCisgKiB0byBiZSB3cml0dGVuIHdpdGggdGhlIGNvcnJlY3QgZGVzdGluYXRpb24gZGlzayBibG9jay4KKyAqCisgKiBBbnkgbWFnaWMtbnVtYmVyIGVzY2FwaW5nIHdoaWNoIG5lZWRzIHRvIGJlIGRvbmUgd2lsbCBjYXVzZSBhCisgKiBjb3B5LW91dCBoZXJlLiAgSWYgdGhlIGJ1ZmZlciBoYXBwZW5zIHRvIHN0YXJ0IHdpdGggdGhlCisgKiBKRlNfTUFHSUNfTlVNQkVSLCB0aGVuIHdlIGNhbid0IHdyaXRlIGl0IHRvIHRoZSBsb2cgZGlyZWN0bHk6IHRoZQorICogbWFnaWMgbnVtYmVyIGlzIG9ubHkgd3JpdHRlbiB0byB0aGUgbG9nIGZvciBkZXNjcmlwdGVyIGJsb2Nrcy4gIEluCisgKiB0aGlzIGNhc2UsIHdlIGNvcHkgdGhlIGRhdGEgYW5kIHJlcGxhY2UgdGhlIGZpcnN0IHdvcmQgd2l0aCAwLCBhbmQgd2UKKyAqIHJldHVybiBhIHJlc3VsdCBjb2RlIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoaXMgYnVmZmVyIG5lZWRzIHRvIGJlCisgKiBtYXJrZWQgYXMgYW4gZXNjYXBlZCBidWZmZXIgaW4gdGhlIGNvcnJlc3BvbmRpbmcgbG9nIGRlc2NyaXB0b3IKKyAqIGJsb2NrLiAgVGhlIG1pc3Npbmcgd29yZCBjYW4gdGhlbiBiZSByZXN0b3JlZCB3aGVuIHRoZSBibG9jayBpcyByZWFkCisgKiBkdXJpbmcgcmVjb3ZlcnkuCisgKgorICogSWYgdGhlIHNvdXJjZSBidWZmZXIgaGFzIGFscmVhZHkgYmVlbiBtb2RpZmllZCBieSBhIG5ldyB0cmFuc2FjdGlvbgorICogc2luY2Ugd2UgdG9vayB0aGUgbGFzdCBjb21taXQgc25hcHNob3QsIHdlIHVzZSB0aGUgZnJvemVuIGNvcHkgb2YKKyAqIHRoYXQgZGF0YSBmb3IgSU8uICBJZiB3ZSBlbmQgdXAgdXNpbmcgdGhlIGV4aXN0aW5nIGJ1ZmZlcl9oZWFkJ3MgZGF0YQorICogZm9yIHRoZSB3cml0ZSwgdGhlbiB3ZSAqaGF2ZSogdG8gbG9jayB0aGUgYnVmZmVyIHRvIHByZXZlbnQgYW55b25lCisgKiBlbHNlIGZyb20gdXNpbmcgYW5kIHBvc3NpYmx5IG1vZGlmeWluZyBpdCB3aGlsZSB0aGUgSU8gaXMgaW4KKyAqIHByb2dyZXNzLgorICoKKyAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYnVmZmVyX2hlYWRzIHRvIGJlIHVzZWQgZm9yIElPLgorICoKKyAqIFdlIGFzc3VtZSB0aGF0IHRoZSBqb3VybmFsIGhhcyBhbHJlYWR5IGJlZW4gbG9ja2VkIGluIHRoaXMgZnVuY3Rpb24uCisgKgorICogUmV0dXJuIHZhbHVlOgorICogIDwwOiBFcnJvcgorICogPj0wOiBGaW5pc2hlZCBPSworICoKKyAqIE9uIHN1Y2Nlc3M6CisgKiBCaXQgMCBzZXQgPT0gZXNjYXBlIHBlcmZvcm1lZCBvbiB0aGUgZGF0YQorICogQml0IDEgc2V0ID09IGJ1ZmZlciBjb3B5LW91dCBwZXJmb3JtZWQgKGtmcmVlIHRoZSBkYXRhIGFmdGVyIElPKQorICovCisKK2ludCBqb3VybmFsX3dyaXRlX21ldGFkYXRhX2J1ZmZlcih0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbiwKKwkJCQkgIHN0cnVjdCBqb3VybmFsX2hlYWQgICpqaF9pbiwKKwkJCQkgIHN0cnVjdCBqb3VybmFsX2hlYWQgKipqaF9vdXQsCisJCQkJICBpbnQgYmxvY2tucikKK3sKKwlpbnQgbmVlZF9jb3B5X291dCA9IDA7CisJaW50IGRvbmVfY29weV9vdXQgPSAwOworCWludCBkb19lc2NhcGUgPSAwOworCWNoYXIgKm1hcHBlZF9kYXRhOworCXN0cnVjdCBidWZmZXJfaGVhZCAqbmV3X2JoOworCXN0cnVjdCBqb3VybmFsX2hlYWQgKm5ld19qaDsKKwlzdHJ1Y3QgcGFnZSAqbmV3X3BhZ2U7CisJdW5zaWduZWQgaW50IG5ld19vZmZzZXQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9pbiA9IGpoMmJoKGpoX2luKTsKKworCS8qCisJICogVGhlIGJ1ZmZlciByZWFsbHkgc2hvdWxkbid0IGJlIGxvY2tlZDogb25seSB0aGUgY3VycmVudCBjb21taXR0aW5nCisJICogdHJhbnNhY3Rpb24gaXMgYWxsb3dlZCB0byB3cml0ZSBpdCwgc28gbm9ib2R5IGVsc2UgaXMgYWxsb3dlZAorCSAqIHRvIGRvIGFueSBJTy4KKwkgKgorCSAqIGFrcG06IGV4Y2VwdCBpZiB3ZSdyZSBqb3VybmFsbGluZyBkYXRhLCBhbmQgd3JpdGUoKSBvdXRwdXQgaXMKKwkgKiBhbHNvIHBhcnQgb2YgYSBzaGFyZWQgbWFwcGluZywgYW5kIGFub3RoZXIgdGhyZWFkIGhhcworCSAqIGRlY2lkZWQgdG8gbGF1bmNoIGEgd3JpdGVwYWdlKCkgYWdhaW5zdCB0aGlzIGJ1ZmZlci4KKwkgKi8KKwlKX0FTU0VSVF9CSChiaF9pbiwgYnVmZmVyX2piZGRpcnR5KGJoX2luKSk7CisKKwluZXdfYmggPSBhbGxvY19idWZmZXJfaGVhZChHRlBfTk9GU3xfX0dGUF9OT0ZBSUwpOworCisJLyoKKwkgKiBJZiBhIG5ldyB0cmFuc2FjdGlvbiBoYXMgYWxyZWFkeSBkb25lIGEgYnVmZmVyIGNvcHktb3V0LCB0aGVuCisJICogd2UgdXNlIHRoYXQgdmVyc2lvbiBvZiB0aGUgZGF0YSBmb3IgdGhlIGNvbW1pdC4KKwkgKi8KKwlqYmRfbG9ja19iaF9zdGF0ZShiaF9pbik7CityZXBlYXQ6CisJaWYgKGpoX2luLT5iX2Zyb3plbl9kYXRhKSB7CisJCWRvbmVfY29weV9vdXQgPSAxOworCQluZXdfcGFnZSA9IHZpcnRfdG9fcGFnZShqaF9pbi0+Yl9mcm96ZW5fZGF0YSk7CisJCW5ld19vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZShqaF9pbi0+Yl9mcm96ZW5fZGF0YSk7CisJfSBlbHNlIHsKKwkJbmV3X3BhZ2UgPSBqaDJiaChqaF9pbiktPmJfcGFnZTsKKwkJbmV3X29mZnNldCA9IG9mZnNldF9pbl9wYWdlKGpoMmJoKGpoX2luKS0+Yl9kYXRhKTsKKwl9CisKKwltYXBwZWRfZGF0YSA9IGttYXBfYXRvbWljKG5ld19wYWdlLCBLTV9VU0VSMCk7CisJLyoKKwkgKiBDaGVjayBmb3IgZXNjYXBpbmcKKwkgKi8KKwlpZiAoKigoX19iZTMyICopKG1hcHBlZF9kYXRhICsgbmV3X29mZnNldCkpID09CisJCQkJY3B1X3RvX2JlMzIoSkZTX01BR0lDX05VTUJFUikpIHsKKwkJbmVlZF9jb3B5X291dCA9IDE7CisJCWRvX2VzY2FwZSA9IDE7CisJfQorCWt1bm1hcF9hdG9taWMobWFwcGVkX2RhdGEsIEtNX1VTRVIwKTsKKworCS8qCisJICogRG8gd2UgbmVlZCB0byBkbyBhIGRhdGEgY29weT8KKwkgKi8KKwlpZiAobmVlZF9jb3B5X291dCAmJiAhZG9uZV9jb3B5X291dCkgeworCQljaGFyICp0bXA7CisKKwkJamJkX3VubG9ja19iaF9zdGF0ZShiaF9pbik7CisJCXRtcCA9IGpiZF9yZXBfa21hbGxvYyhiaF9pbi0+Yl9zaXplLCBHRlBfTk9GUyk7CisJCWpiZF9sb2NrX2JoX3N0YXRlKGJoX2luKTsKKwkJaWYgKGpoX2luLT5iX2Zyb3plbl9kYXRhKSB7CisJCQlrZnJlZSh0bXApOworCQkJZ290byByZXBlYXQ7CisJCX0KKworCQlqaF9pbi0+Yl9mcm96ZW5fZGF0YSA9IHRtcDsKKwkJbWFwcGVkX2RhdGEgPSBrbWFwX2F0b21pYyhuZXdfcGFnZSwgS01fVVNFUjApOworCQltZW1jcHkodG1wLCBtYXBwZWRfZGF0YSArIG5ld19vZmZzZXQsIGpoMmJoKGpoX2luKS0+Yl9zaXplKTsKKwkJa3VubWFwX2F0b21pYyhtYXBwZWRfZGF0YSwgS01fVVNFUjApOworCisJCW5ld19wYWdlID0gdmlydF90b19wYWdlKHRtcCk7CisJCW5ld19vZmZzZXQgPSBvZmZzZXRfaW5fcGFnZSh0bXApOworCQlkb25lX2NvcHlfb3V0ID0gMTsKKwl9CisKKwkvKgorCSAqIERpZCB3ZSBuZWVkIHRvIGRvIGFuIGVzY2FwaW5nPyAgTm93IHdlJ3ZlIGRvbmUgYWxsIHRoZQorCSAqIGNvcHlpbmcsIHdlIGNhbiBmaW5hbGx5IGRvIHNvLgorCSAqLworCWlmIChkb19lc2NhcGUpIHsKKwkJbWFwcGVkX2RhdGEgPSBrbWFwX2F0b21pYyhuZXdfcGFnZSwgS01fVVNFUjApOworCQkqKCh1bnNpZ25lZCBpbnQgKikobWFwcGVkX2RhdGEgKyBuZXdfb2Zmc2V0KSkgPSAwOworCQlrdW5tYXBfYXRvbWljKG1hcHBlZF9kYXRhLCBLTV9VU0VSMCk7CisJfQorCisJLyoga2VlcCBzdWJzZXF1ZW50IGFzc2VydGlvbnMgc2FuZSAqLworCW5ld19iaC0+Yl9zdGF0ZSA9IDA7CisJaW5pdF9idWZmZXIobmV3X2JoLCBOVUxMLCBOVUxMKTsKKwlhdG9taWNfc2V0KCZuZXdfYmgtPmJfY291bnQsIDEpOworCWpiZF91bmxvY2tfYmhfc3RhdGUoYmhfaW4pOworCisJbmV3X2poID0gam91cm5hbF9hZGRfam91cm5hbF9oZWFkKG5ld19iaCk7CS8qIFRoaXMgc2xlZXBzICovCisKKwlzZXRfYmhfcGFnZShuZXdfYmgsIG5ld19wYWdlLCBuZXdfb2Zmc2V0KTsKKwluZXdfamgtPmJfdHJhbnNhY3Rpb24gPSBOVUxMOworCW5ld19iaC0+Yl9zaXplID0gamgyYmgoamhfaW4pLT5iX3NpemU7CisJbmV3X2JoLT5iX2JkZXYgPSB0cmFuc2FjdGlvbi0+dF9qb3VybmFsLT5qX2RldjsKKwluZXdfYmgtPmJfYmxvY2tuciA9IGJsb2NrbnI7CisJc2V0X2J1ZmZlcl9tYXBwZWQobmV3X2JoKTsKKwlzZXRfYnVmZmVyX2RpcnR5KG5ld19iaCk7CisKKwkqamhfb3V0ID0gbmV3X2poOworCisJLyoKKwkgKiBUaGUgdG8tYmUtd3JpdHRlbiBidWZmZXIgbmVlZHMgdG8gZ2V0IG1vdmVkIHRvIHRoZSBpbyBxdWV1ZSwKKwkgKiBhbmQgdGhlIG9yaWdpbmFsIGJ1ZmZlciB3aG9zZSBjb250ZW50cyB3ZSBhcmUgc2hhZG93aW5nIG9yCisJICogY29weWluZyBpcyBtb3ZlZCB0byB0aGUgdHJhbnNhY3Rpb24ncyBzaGFkb3cgcXVldWUuCisJICovCisJSkJVRkZFUl9UUkFDRShqaF9pbiwgImZpbGUgYXMgQkpfU2hhZG93Iik7CisJam91cm5hbF9maWxlX2J1ZmZlcihqaF9pbiwgdHJhbnNhY3Rpb24sIEJKX1NoYWRvdyk7CisJSkJVRkZFUl9UUkFDRShuZXdfamgsICJmaWxlIGFzIEJKX0lPIik7CisJam91cm5hbF9maWxlX2J1ZmZlcihuZXdfamgsIHRyYW5zYWN0aW9uLCBCSl9JTyk7CisKKwlyZXR1cm4gZG9fZXNjYXBlIHwgKGRvbmVfY29weV9vdXQgPDwgMSk7Cit9CisKKy8qCisgKiBBbGxvY2F0aW9uIGNvZGUgZm9yIHRoZSBqb3VybmFsIGZpbGUuICBNYW5hZ2UgdGhlIHNwYWNlIGxlZnQgaW4gdGhlCisgKiBqb3VybmFsLCBzbyB0aGF0IHdlIGNhbiBiZWdpbiBjaGVja3BvaW50aW5nIHdoZW4gYXBwcm9wcmlhdGUuCisgKi8KKworLyoKKyAqIF9fbG9nX3NwYWNlX2xlZnQ6IFJldHVybiB0aGUgbnVtYmVyIG9mIGZyZWUgYmxvY2tzIGxlZnQgaW4gdGhlIGpvdXJuYWwuCisgKgorICogQ2FsbGVkIHdpdGggdGhlIGpvdXJuYWwgYWxyZWFkeSBsb2NrZWQuCisgKgorICogQ2FsbGVkIHVuZGVyIGpfc3RhdGVfbG9jaworICovCisKK2ludCBfX2xvZ19zcGFjZV9sZWZ0KGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwlpbnQgbGVmdCA9IGpvdXJuYWwtPmpfZnJlZTsKKworCWFzc2VydF9zcGluX2xvY2tlZCgmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKworCS8qCisJICogQmUgcGVzc2ltaXN0aWMgaGVyZSBhYm91dCB0aGUgbnVtYmVyIG9mIHRob3NlIGZyZWUgYmxvY2tzIHdoaWNoCisJICogbWlnaHQgYmUgcmVxdWlyZWQgZm9yIGxvZyBkZXNjcmlwdG9yIGNvbnRyb2wgYmxvY2tzLgorCSAqLworCisjZGVmaW5lIE1JTl9MT0dfUkVTRVJWRURfQkxPQ0tTIDMyIC8qIEFsbG93IGZvciByb3VuZGluZyBlcnJvcnMgKi8KKworCWxlZnQgLT0gTUlOX0xPR19SRVNFUlZFRF9CTE9DS1M7CisKKwlpZiAobGVmdCA8PSAwKQorCQlyZXR1cm4gMDsKKwlsZWZ0IC09IChsZWZ0ID4+IDMpOworCXJldHVybiBsZWZ0OworfQorCisvKgorICogQ2FsbGVkIHVuZGVyIGpfc3RhdGVfbG9jay4gIFJldHVybnMgdHJ1ZSBpZiBhIHRyYW5zYWN0aW9uIHdhcyBzdGFydGVkLgorICovCitpbnQgX19sb2dfc3RhcnRfY29tbWl0KGpvdXJuYWxfdCAqam91cm5hbCwgdGlkX3QgdGFyZ2V0KQoreworCS8qCisJICogQXJlIHdlIGFscmVhZHkgZG9pbmcgYSByZWNlbnQgZW5vdWdoIGNvbW1pdD8KKwkgKi8KKwlpZiAoIXRpZF9nZXEoam91cm5hbC0+al9jb21taXRfcmVxdWVzdCwgdGFyZ2V0KSkgeworCQkvKgorCQkgKiBXZSB3YW50IGEgbmV3IGNvbW1pdDogT0ssIG1hcmsgdGhlIHJlcXVlc3QgYW5kIHdha3VwIHRoZQorCQkgKiBjb21taXQgdGhyZWFkLiAgV2UgZG8gX25vdF8gZG8gdGhlIGNvbW1pdCBvdXJzZWx2ZXMuCisJCSAqLworCisJCWpvdXJuYWwtPmpfY29tbWl0X3JlcXVlc3QgPSB0YXJnZXQ7CisJCWpiZF9kZWJ1ZygxLCAiSkJEOiByZXF1ZXN0aW5nIGNvbW1pdCAlZC8lZFxuIiwKKwkJCSAgam91cm5hbC0+al9jb21taXRfcmVxdWVzdCwKKwkJCSAgam91cm5hbC0+al9jb21taXRfc2VxdWVuY2UpOworCQl3YWtlX3VwKCZqb3VybmFsLT5qX3dhaXRfY29tbWl0KTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitpbnQgbG9nX3N0YXJ0X2NvbW1pdChqb3VybmFsX3QgKmpvdXJuYWwsIHRpZF90IHRpZCkKK3sKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCXJldCA9IF9fbG9nX3N0YXJ0X2NvbW1pdChqb3VybmFsLCB0aWQpOworCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBGb3JjZSBhbmQgd2FpdCB1cG9uIGEgY29tbWl0IGlmIHRoZSBjYWxsaW5nIHByb2Nlc3MgaXMgbm90IHdpdGhpbgorICogdHJhbnNhY3Rpb24uICBUaGlzIGlzIHVzZWQgZm9yIGZvcmNpbmcgb3V0IHVuZG8tcHJvdGVjdGVkIGRhdGEgd2hpY2ggY29udGFpbnMKKyAqIGJpdG1hcHMsIHdoZW4gdGhlIGZzIGlzIHJ1bm5pbmcgb3V0IG9mIHNwYWNlLgorICoKKyAqIFdlIGNhbiBvbmx5IGZvcmNlIHRoZSBydW5uaW5nIHRyYW5zYWN0aW9uIGlmIHdlIGRvbid0IGhhdmUgYW4gYWN0aXZlIGhhbmRsZTsKKyAqIG90aGVyd2lzZSwgd2Ugd2lsbCBkZWFkbG9jay4KKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgYSB0cmFuc2FjdGlvbiB3YXMgc3RhcnRlZC4KKyAqLworaW50IGpvdXJuYWxfZm9yY2VfY29tbWl0X25lc3RlZChqb3VybmFsX3QgKmpvdXJuYWwpCit7CisJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24gPSBOVUxMOworCXRpZF90IHRpZDsKKworCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwlpZiAoam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uICYmICFjdXJyZW50LT5qb3VybmFsX2luZm8pIHsKKwkJdHJhbnNhY3Rpb24gPSBqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb247CisJCV9fbG9nX3N0YXJ0X2NvbW1pdChqb3VybmFsLCB0cmFuc2FjdGlvbi0+dF90aWQpOworCX0gZWxzZSBpZiAoam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uKQorCQl0cmFuc2FjdGlvbiA9IGpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbjsKKworCWlmICghdHJhbnNhY3Rpb24pIHsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJCXJldHVybiAwOwkvKiBOb3RoaW5nIHRvIHJldHJ5ICovCisJfQorCisJdGlkID0gdHJhbnNhY3Rpb24tPnRfdGlkOworCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCWxvZ193YWl0X2NvbW1pdChqb3VybmFsLCB0aWQpOworCXJldHVybiAxOworfQorCisvKgorICogU3RhcnQgYSBjb21taXQgb2YgdGhlIGN1cnJlbnQgcnVubmluZyB0cmFuc2FjdGlvbiAoaWYgYW55KS4gIFJldHVybnMgdHJ1ZQorICogaWYgYSB0cmFuc2FjdGlvbiB3YXMgc3RhcnRlZCwgYW5kIGZpbGxzIGl0cyB0aWQgaW4gYXQgKnB0aWQKKyAqLworaW50IGpvdXJuYWxfc3RhcnRfY29tbWl0KGpvdXJuYWxfdCAqam91cm5hbCwgdGlkX3QgKnB0aWQpCit7CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJaWYgKGpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbikgeworCQl0aWRfdCB0aWQgPSBqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb24tPnRfdGlkOworCisJCXJldCA9IF9fbG9nX3N0YXJ0X2NvbW1pdChqb3VybmFsLCB0aWQpOworCQlpZiAocmV0ICYmIHB0aWQpCisJCQkqcHRpZCA9IHRpZDsKKwl9IGVsc2UgaWYgKGpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbiAmJiBwdGlkKSB7CisJCS8qCisJCSAqIElmIGV4dDNfd3JpdGVfc3VwZXIoKSByZWNlbnRseSBzdGFydGVkIGEgY29tbWl0LCB0aGVuIHdlCisJCSAqIGhhdmUgdG8gd2FpdCBmb3IgY29tcGxldGlvbiBvZiB0aGF0IHRyYW5zYWN0aW9uCisJCSAqLworCQkqcHRpZCA9IGpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbi0+dF90aWQ7CisJCXJldCA9IDE7CisJfQorCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBXYWl0IGZvciBhIHNwZWNpZmllZCBjb21taXQgdG8gY29tcGxldGUuCisgKiBUaGUgY2FsbGVyIG1heSBub3QgaG9sZCB0aGUgam91cm5hbCBsb2NrLgorICovCitpbnQgbG9nX3dhaXRfY29tbWl0KGpvdXJuYWxfdCAqam91cm5hbCwgdGlkX3QgdGlkKQoreworCWludCBlcnIgPSAwOworCisjaWZkZWYgQ09ORklHX0pCRF9ERUJVRworCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwlpZiAoIXRpZF9nZXEoam91cm5hbC0+al9jb21taXRfcmVxdWVzdCwgdGlkKSkgeworCQlwcmludGsoS0VSTl9FTUVSRworCQkgICAgICAgIiVzOiBlcnJvcjogal9jb21taXRfcmVxdWVzdD0lZCwgdGlkPSVkXG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fLCBqb3VybmFsLT5qX2NvbW1pdF9yZXF1ZXN0LCB0aWQpOworCX0KKwlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKyNlbmRpZgorCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwl3aGlsZSAodGlkX2d0KHRpZCwgam91cm5hbC0+al9jb21taXRfc2VxdWVuY2UpKSB7CisJCWpiZF9kZWJ1ZygxLCAiSkJEOiB3YW50ICVkLCBqX2NvbW1pdF9zZXF1ZW5jZT0lZFxuIiwKKwkJCQkgIHRpZCwgam91cm5hbC0+al9jb21taXRfc2VxdWVuY2UpOworCQl3YWtlX3VwKCZqb3VybmFsLT5qX3dhaXRfY29tbWl0KTsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJCXdhaXRfZXZlbnQoam91cm5hbC0+al93YWl0X2RvbmVfY29tbWl0LAorCQkJCSF0aWRfZ3QodGlkLCBqb3VybmFsLT5qX2NvbW1pdF9zZXF1ZW5jZSkpOworCQlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJfQorCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCisJaWYgKHVubGlrZWx5KGlzX2pvdXJuYWxfYWJvcnRlZChqb3VybmFsKSkpIHsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgImpvdXJuYWwgY29tbWl0IEkvTyBlcnJvclxuIik7CisJCWVyciA9IC1FSU87CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBMb2cgYnVmZmVyIGFsbG9jYXRpb24gcm91dGluZXM6CisgKi8KKworaW50IGpvdXJuYWxfbmV4dF9sb2dfYmxvY2soam91cm5hbF90ICpqb3VybmFsLCB1bnNpZ25lZCBsb25nICpyZXRwKQoreworCXVuc2lnbmVkIGxvbmcgYmxvY2tucjsKKworCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwlKX0FTU0VSVChqb3VybmFsLT5qX2ZyZWUgPiAxKTsKKworCWJsb2NrbnIgPSBqb3VybmFsLT5qX2hlYWQ7CisJam91cm5hbC0+al9oZWFkKys7CisJam91cm5hbC0+al9mcmVlLS07CisJaWYgKGpvdXJuYWwtPmpfaGVhZCA9PSBqb3VybmFsLT5qX2xhc3QpCisJCWpvdXJuYWwtPmpfaGVhZCA9IGpvdXJuYWwtPmpfZmlyc3Q7CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJcmV0dXJuIGpvdXJuYWxfYm1hcChqb3VybmFsLCBibG9ja25yLCByZXRwKTsKK30KKworLyoKKyAqIENvbnZlcnNpb24gb2YgbG9naWNhbCB0byBwaHlzaWNhbCBibG9jayBudW1iZXJzIGZvciB0aGUgam91cm5hbAorICoKKyAqIE9uIGV4dGVybmFsIGpvdXJuYWxzIHRoZSBqb3VybmFsIGJsb2NrcyBhcmUgaWRlbnRpdHktbWFwcGVkLCBzbworICogdGhpcyBpcyBhIG5vLW9wLiAgSWYgbmVlZGVkLCB3ZSBjYW4gdXNlIGpfYmxrX29mZnNldCAtIGV2ZXJ5dGhpbmcgaXMKKyAqIHJlYWR5LgorICovCitpbnQgam91cm5hbF9ibWFwKGpvdXJuYWxfdCAqam91cm5hbCwgdW5zaWduZWQgbG9uZyBibG9ja25yLCAKKwkJIHVuc2lnbmVkIGxvbmcgKnJldHApCit7CisJaW50IGVyciA9IDA7CisJdW5zaWduZWQgbG9uZyByZXQ7CisKKwlpZiAoam91cm5hbC0+al9pbm9kZSkgeworCQlyZXQgPSBibWFwKGpvdXJuYWwtPmpfaW5vZGUsIGJsb2NrbnIpOworCQlpZiAocmV0KQorCQkJKnJldHAgPSByZXQ7CisJCWVsc2UgeworCQkJY2hhciBiW0JERVZOQU1FX1NJWkVdOworCisJCQlwcmludGsoS0VSTl9BTEVSVCAiJXM6IGpvdXJuYWwgYmxvY2sgbm90IGZvdW5kICIKKwkJCQkJImF0IG9mZnNldCAlbHUgb24gJXNcbiIsCisJCQkJX19GVU5DVElPTl9fLAorCQkJCWJsb2NrbnIsCisJCQkJYmRldm5hbWUoam91cm5hbC0+al9kZXYsIGIpKTsKKwkJCWVyciA9IC1FSU87CisJCQlfX2pvdXJuYWxfYWJvcnRfc29mdChqb3VybmFsLCBlcnIpOworCQl9CisJfSBlbHNlIHsKKwkJKnJldHAgPSBibG9ja25yOyAvKiAram91cm5hbC0+al9ibGtfb2Zmc2V0ICovCisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBXZSBwbGF5IGJ1ZmZlcl9oZWFkIGFsaWFzaW5nIHRyaWNrcyB0byB3cml0ZSBkYXRhL21ldGFkYXRhIGJsb2NrcyB0bworICogdGhlIGpvdXJuYWwgd2l0aG91dCBjb3B5aW5nIHRoZWlyIGNvbnRlbnRzLCBidXQgZm9yIGpvdXJuYWwKKyAqIGRlc2NyaXB0b3IgYmxvY2tzIHdlIGRvIG5lZWQgdG8gZ2VuZXJhdGUgYm9uYSBmaWRlIGJ1ZmZlcnMuCisgKgorICogQWZ0ZXIgdGhlIGNhbGxlciBvZiBqb3VybmFsX2dldF9kZXNjcmlwdG9yX2J1ZmZlcigpIGhhcyBmaW5pc2hlZCBtb2RpZnlpbmcKKyAqIHRoZSBidWZmZXIncyBjb250ZW50cyB0aGV5IHJlYWxseSBzaG91bGQgcnVuIGZsdXNoX2RjYWNoZV9wYWdlKGJoLT5iX3BhZ2UpLgorICogQnV0IHdlIGRvbid0IGJvdGhlciBkb2luZyB0aGF0LCBzbyB0aGVyZSB3aWxsIGJlIGNvaGVyZW5jeSBwcm9ibGVtcyB3aXRoCisgKiBtbWFwcyBvZiBibG9ja2RldnMgd2hpY2ggaG9sZCBsaXZlIEpCRC1jb250cm9sbGVkIGZpbGVzeXN0ZW1zLgorICovCitzdHJ1Y3Qgam91cm5hbF9oZWFkICpqb3VybmFsX2dldF9kZXNjcmlwdG9yX2J1ZmZlcihqb3VybmFsX3QgKmpvdXJuYWwpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwl1bnNpZ25lZCBsb25nIGJsb2NrbnI7CisJaW50IGVycjsKKworCWVyciA9IGpvdXJuYWxfbmV4dF9sb2dfYmxvY2soam91cm5hbCwgJmJsb2NrbnIpOworCisJaWYgKGVycikKKwkJcmV0dXJuIE5VTEw7CisKKwliaCA9IF9fZ2V0YmxrKGpvdXJuYWwtPmpfZGV2LCBibG9ja25yLCBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSk7CisJbG9ja19idWZmZXIoYmgpOworCW1lbXNldChiaC0+Yl9kYXRhLCAwLCBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSk7CisJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJdW5sb2NrX2J1ZmZlcihiaCk7CisJQlVGRkVSX1RSQUNFKGJoLCAicmV0dXJuIHRoaXMgYnVmZmVyIik7CisJcmV0dXJuIGpvdXJuYWxfYWRkX2pvdXJuYWxfaGVhZChiaCk7Cit9CisKKy8qCisgKiBNYW5hZ2VtZW50IGZvciBqb3VybmFsIGNvbnRyb2wgYmxvY2tzOiBmdW5jdGlvbnMgdG8gY3JlYXRlIGFuZAorICogZGVzdHJveSBqb3VybmFsX3Qgc3RydWN0dXJlcywgYW5kIHRvIGluaXRpYWxpc2UgYW5kIHJlYWQgZXhpc3RpbmcKKyAqIGpvdXJuYWwgYmxvY2tzIGZyb20gZGlzay4gICovCisKKy8qIEZpcnN0OiBjcmVhdGUgYW5kIHNldHVwIGEgam91cm5hbF90IG9iamVjdCBpbiBtZW1vcnkuICBXZSBpbml0aWFsaXNlCisgKiB2ZXJ5IGZldyBmaWVsZHMgeWV0OiB0aGF0IGhhcyB0byB3YWl0IHVudGlsIHdlIGhhdmUgY3JlYXRlZCB0aGUKKyAqIGpvdXJuYWwgc3RydWN0dXJlcyBmcm9tIGZyb20gc2NyYXRjaCwgb3IgbG9hZGVkIHRoZW0gZnJvbSBkaXNrLiAqLworCitzdGF0aWMgam91cm5hbF90ICogam91cm5hbF9pbml0X2NvbW1vbiAodm9pZCkKK3sKKwlqb3VybmFsX3QgKmpvdXJuYWw7CisJaW50IGVycjsKKworCWpvdXJuYWwgPSBqYmRfa21hbGxvYyhzaXplb2YoKmpvdXJuYWwpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWpvdXJuYWwpCisJCWdvdG8gZmFpbDsKKwltZW1zZXQoam91cm5hbCwgMCwgc2l6ZW9mKCpqb3VybmFsKSk7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZqb3VybmFsLT5qX3dhaXRfdHJhbnNhY3Rpb25fbG9ja2VkKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZqb3VybmFsLT5qX3dhaXRfbG9nc3BhY2UpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmpvdXJuYWwtPmpfd2FpdF9kb25lX2NvbW1pdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmam91cm5hbC0+al93YWl0X2NoZWNrcG9pbnQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmpvdXJuYWwtPmpfd2FpdF9jb21taXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmpvdXJuYWwtPmpfd2FpdF91cGRhdGVzKTsKKwlpbml0X01VVEVYKCZqb3VybmFsLT5qX2JhcnJpZXIpOworCWluaXRfTVVURVgoJmpvdXJuYWwtPmpfY2hlY2twb2ludF9zZW0pOworCXNwaW5fbG9ja19pbml0KCZqb3VybmFsLT5qX3Jldm9rZV9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmam91cm5hbC0+al9saXN0X2xvY2spOworCXNwaW5fbG9ja19pbml0KCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCisJam91cm5hbC0+al9jb21taXRfaW50ZXJ2YWwgPSAoSFogKiBKQkRfREVGQVVMVF9NQVhfQ09NTUlUX0FHRSk7CisKKwkvKiBUaGUgam91cm5hbCBpcyBtYXJrZWQgZm9yIGVycm9yIHVudGlsIHdlIHN1Y2NlZWQgd2l0aCByZWNvdmVyeSEgKi8KKwlqb3VybmFsLT5qX2ZsYWdzID0gSkZTX0FCT1JUOworCisJLyogU2V0IHVwIGEgZGVmYXVsdC1zaXplZCByZXZva2UgdGFibGUgZm9yIHRoZSBuZXcgbW91bnQuICovCisJZXJyID0gam91cm5hbF9pbml0X3Jldm9rZShqb3VybmFsLCBKT1VSTkFMX1JFVk9LRV9ERUZBVUxUX0hBU0gpOworCWlmIChlcnIpIHsKKwkJa2ZyZWUoam91cm5hbCk7CisJCWdvdG8gZmFpbDsKKwl9CisJcmV0dXJuIGpvdXJuYWw7CitmYWlsOgorCXJldHVybiBOVUxMOworfQorCisvKiBqb3VybmFsX2luaXRfZGV2IGFuZCBqb3VybmFsX2luaXRfaW5vZGU6CisgKgorICogQ3JlYXRlIGEgam91cm5hbCBzdHJ1Y3R1cmUgYXNzaWduZWQgc29tZSBmaXhlZCBzZXQgb2YgZGlzayBibG9ja3MgdG8KKyAqIHRoZSBqb3VybmFsLiAgV2UgZG9uJ3QgYWN0dWFsbHkgdG91Y2ggdGhvc2UgZGlzayBibG9ja3MgeWV0LCBidXQgd2UKKyAqIG5lZWQgdG8gc2V0IHVwIGFsbCBvZiB0aGUgbWFwcGluZyBpbmZvcm1hdGlvbiB0byB0ZWxsIHRoZSBqb3VybmFsaW5nCisgKiBzeXN0ZW0gd2hlcmUgdGhlIGpvdXJuYWwgYmxvY2tzIGFyZS4KKyAqCisgKi8KKworLyoqCisgKiAgam91cm5hbF90ICogam91cm5hbF9pbml0X2RldigpIC0gY3JlYXRlcyBhbiBpbml0aWFsaXNlcyBhIGpvdXJuYWwgc3RydWN0dXJlCisgKiAgQGJkZXY6IEJsb2NrIGRldmljZSBvbiB3aGljaCB0byBjcmVhdGUgdGhlIGpvdXJuYWwKKyAqICBAZnNfZGV2OiBEZXZpY2Ugd2hpY2ggaG9sZCBqb3VybmFsbGVkIGZpbGVzeXN0ZW0gZm9yIHRoaXMgam91cm5hbC4KKyAqICBAc3RhcnQ6IEJsb2NrIG5yIFN0YXJ0IG9mIGpvdXJuYWwuCisgKiAgQGxlbjogIExlbmdodCBvZiB0aGUgam91cm5hbCBpbiBibG9ja3MuCisgKiAgQGJsb2Nrc2l6ZTogYmxvY2tzaXplIG9mIGpvdXJuYWxsaW5nIGRldmljZQorICogIEByZXR1cm5zOiBhIG5ld2x5IGNyZWF0ZWQgam91cm5hbF90ICoKKyAqICAKKyAqICBqb3VybmFsX2luaXRfZGV2IGNyZWF0ZXMgYSBqb3VybmFsIHdoaWNoIG1hcHMgYSBmaXhlZCBjb250aWd1b3VzCisgKiAgcmFuZ2Ugb2YgYmxvY2tzIG9uIGFuIGFyYml0cmFyeSBibG9jayBkZXZpY2UuCisgKiAKKyAqLworam91cm5hbF90ICogam91cm5hbF9pbml0X2RldihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQkJc3RydWN0IGJsb2NrX2RldmljZSAqZnNfZGV2LAorCQkJaW50IHN0YXJ0LCBpbnQgbGVuLCBpbnQgYmxvY2tzaXplKQoreworCWpvdXJuYWxfdCAqam91cm5hbCA9IGpvdXJuYWxfaW5pdF9jb21tb24oKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWludCBuOworCisJaWYgKCFqb3VybmFsKQorCQlyZXR1cm4gTlVMTDsKKworCWpvdXJuYWwtPmpfZGV2ID0gYmRldjsKKwlqb3VybmFsLT5qX2ZzX2RldiA9IGZzX2RldjsKKwlqb3VybmFsLT5qX2Jsa19vZmZzZXQgPSBzdGFydDsKKwlqb3VybmFsLT5qX21heGxlbiA9IGxlbjsKKwlqb3VybmFsLT5qX2Jsb2Nrc2l6ZSA9IGJsb2Nrc2l6ZTsKKworCWJoID0gX19nZXRibGsoam91cm5hbC0+al9kZXYsIHN0YXJ0LCBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSk7CisJSl9BU1NFUlQoYmggIT0gTlVMTCk7CisJam91cm5hbC0+al9zYl9idWZmZXIgPSBiaDsKKwlqb3VybmFsLT5qX3N1cGVyYmxvY2sgPSAoam91cm5hbF9zdXBlcmJsb2NrX3QgKiliaC0+Yl9kYXRhOworCisJLyogam91cm5hbCBkZXNjcmlwdG9yIGNhbiBzdG9yZSB1cCB0byBuIGJsb2NrcyAtYnp6eiAqLworCW4gPSBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSAvIHNpemVvZihqb3VybmFsX2Jsb2NrX3RhZ190KTsKKwlqb3VybmFsLT5qX3didWZzaXplID0gbjsKKwlqb3VybmFsLT5qX3didWYgPSBrbWFsbG9jKG4gKiBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkKiksIEdGUF9LRVJORUwpOworCWlmICgham91cm5hbC0+al93YnVmKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IENhbnQgYWxsb2NhdGUgYmhzIGZvciBjb21taXQgdGhyZWFkXG4iLAorCQkJX19GVU5DVElPTl9fKTsKKwkJa2ZyZWUoam91cm5hbCk7CisJCWpvdXJuYWwgPSBOVUxMOworCX0KKworCXJldHVybiBqb3VybmFsOworfQorIAorLyoqIAorICogIGpvdXJuYWxfdCAqIGpvdXJuYWxfaW5pdF9pbm9kZSAoKSAtIGNyZWF0ZXMgYSBqb3VybmFsIHdoaWNoIG1hcHMgdG8gYSBpbm9kZS4KKyAqICBAaW5vZGU6IEFuIGlub2RlIHRvIGNyZWF0ZSB0aGUgam91cm5hbCBpbgorICogIAorICogam91cm5hbF9pbml0X2lub2RlIGNyZWF0ZXMgYSBqb3VybmFsIHdoaWNoIG1hcHMgYW4gb24tZGlzayBpbm9kZSBhcworICogdGhlIGpvdXJuYWwuICBUaGUgaW5vZGUgbXVzdCBleGlzdCBhbHJlYWR5LCBtdXN0IHN1cHBvcnQgYm1hcCgpIGFuZAorICogbXVzdCBoYXZlIGFsbCBkYXRhIGJsb2NrcyBwcmVhbGxvY2F0ZWQuCisgKi8KK2pvdXJuYWxfdCAqIGpvdXJuYWxfaW5pdF9pbm9kZSAoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWpvdXJuYWxfdCAqam91cm5hbCA9IGpvdXJuYWxfaW5pdF9jb21tb24oKTsKKwlpbnQgZXJyOworCWludCBuOworCXVuc2lnbmVkIGxvbmcgYmxvY2tucjsKKworCWlmICgham91cm5hbCkKKwkJcmV0dXJuIE5VTEw7CisKKwlqb3VybmFsLT5qX2RldiA9IGpvdXJuYWwtPmpfZnNfZGV2ID0gaW5vZGUtPmlfc2ItPnNfYmRldjsKKwlqb3VybmFsLT5qX2lub2RlID0gaW5vZGU7CisJamJkX2RlYnVnKDEsCisJCSAgImpvdXJuYWwgJXA6IGlub2RlICVzLyVsZCwgc2l6ZSAlTGQsIGJpdHMgJWQsIGJsa3NpemUgJWxkXG4iLAorCQkgIGpvdXJuYWwsIGlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8sIAorCQkgIChsb25nIGxvbmcpIGlub2RlLT5pX3NpemUsCisJCSAgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CisKKwlqb3VybmFsLT5qX21heGxlbiA9IGlub2RlLT5pX3NpemUgPj4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJam91cm5hbC0+al9ibG9ja3NpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemU7CisKKwkvKiBqb3VybmFsIGRlc2NyaXB0b3IgY2FuIHN0b3JlIHVwIHRvIG4gYmxvY2tzIC1ienp6ICovCisJbiA9IGpvdXJuYWwtPmpfYmxvY2tzaXplIC8gc2l6ZW9mKGpvdXJuYWxfYmxvY2tfdGFnX3QpOworCWpvdXJuYWwtPmpfd2J1ZnNpemUgPSBuOworCWpvdXJuYWwtPmpfd2J1ZiA9IGttYWxsb2MobiAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQqKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFqb3VybmFsLT5qX3didWYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2FudCBhbGxvY2F0ZSBiaHMgZm9yIGNvbW1pdCB0aHJlYWRcbiIsCisJCQlfX0ZVTkNUSU9OX18pOworCQlrZnJlZShqb3VybmFsKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZXJyID0gam91cm5hbF9ibWFwKGpvdXJuYWwsIDAsICZibG9ja25yKTsKKwkvKiBJZiB0aGF0IGZhaWxlZCwgZ2l2ZSB1cCAqLworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogQ2Fubm5vdCBsb2NhdGUgam91cm5hbCBzdXBlcmJsb2NrXG4iLAorCQkgICAgICAgX19GVU5DVElPTl9fKTsKKwkJa2ZyZWUoam91cm5hbCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWJoID0gX19nZXRibGsoam91cm5hbC0+al9kZXYsIGJsb2NrbnIsIGpvdXJuYWwtPmpfYmxvY2tzaXplKTsKKwlKX0FTU0VSVChiaCAhPSBOVUxMKTsKKwlqb3VybmFsLT5qX3NiX2J1ZmZlciA9IGJoOworCWpvdXJuYWwtPmpfc3VwZXJibG9jayA9IChqb3VybmFsX3N1cGVyYmxvY2tfdCAqKWJoLT5iX2RhdGE7CisKKwlyZXR1cm4gam91cm5hbDsKK30KKworLyogCisgKiBJZiB0aGUgam91cm5hbCBpbml0IG9yIGNyZWF0ZSBhYm9ydHMsIHdlIG5lZWQgdG8gbWFyayB0aGUgam91cm5hbAorICogc3VwZXJibG9jayBhcyBiZWluZyBOVUxMIHRvIHByZXZlbnQgdGhlIGpvdXJuYWwgZGVzdHJveSBmcm9tIHdyaXRpbmcKKyAqIGJhY2sgYSBib2d1cyBzdXBlcmJsb2NrLiAKKyAqLworc3RhdGljIHZvaWQgam91cm5hbF9mYWlsX3N1cGVyYmxvY2sgKGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gam91cm5hbC0+al9zYl9idWZmZXI7CisJYnJlbHNlKGJoKTsKKwlqb3VybmFsLT5qX3NiX2J1ZmZlciA9IE5VTEw7Cit9CisKKy8qCisgKiBHaXZlbiBhIGpvdXJuYWxfdCBzdHJ1Y3R1cmUsIGluaXRpYWxpc2UgdGhlIHZhcmlvdXMgZmllbGRzIGZvcgorICogc3RhcnR1cCBvZiBhIG5ldyBqb3VybmFsaW5nIHNlc3Npb24uICBXZSB1c2UgdGhpcyBib3RoIHdoZW4gY3JlYXRpbmcKKyAqIGEgam91cm5hbCwgYW5kIGFmdGVyIHJlY292ZXJpbmcgYW4gb2xkIGpvdXJuYWwgdG8gcmVzZXQgaXQgZm9yCisgKiBzdWJzZXF1ZW50IHVzZS4KKyAqLworCitzdGF0aWMgaW50IGpvdXJuYWxfcmVzZXQoam91cm5hbF90ICpqb3VybmFsKQoreworCWpvdXJuYWxfc3VwZXJibG9ja190ICpzYiA9IGpvdXJuYWwtPmpfc3VwZXJibG9jazsKKwl1bnNpZ25lZCBpbnQgZmlyc3QsIGxhc3Q7CisKKwlmaXJzdCA9IGJlMzJfdG9fY3B1KHNiLT5zX2ZpcnN0KTsKKwlsYXN0ID0gYmUzMl90b19jcHUoc2ItPnNfbWF4bGVuKTsKKworCWpvdXJuYWwtPmpfZmlyc3QgPSBmaXJzdDsKKwlqb3VybmFsLT5qX2xhc3QgPSBsYXN0OworCisJam91cm5hbC0+al9oZWFkID0gZmlyc3Q7CisJam91cm5hbC0+al90YWlsID0gZmlyc3Q7CisJam91cm5hbC0+al9mcmVlID0gbGFzdCAtIGZpcnN0OworCisJam91cm5hbC0+al90YWlsX3NlcXVlbmNlID0gam91cm5hbC0+al90cmFuc2FjdGlvbl9zZXF1ZW5jZTsKKwlqb3VybmFsLT5qX2NvbW1pdF9zZXF1ZW5jZSA9IGpvdXJuYWwtPmpfdHJhbnNhY3Rpb25fc2VxdWVuY2UgLSAxOworCWpvdXJuYWwtPmpfY29tbWl0X3JlcXVlc3QgPSBqb3VybmFsLT5qX2NvbW1pdF9zZXF1ZW5jZTsKKworCWpvdXJuYWwtPmpfbWF4X3RyYW5zYWN0aW9uX2J1ZmZlcnMgPSBqb3VybmFsLT5qX21heGxlbiAvIDQ7CisKKwkvKiBBZGQgdGhlIGR5bmFtaWMgZmllbGRzIGFuZCB3cml0ZSBpdCB0byBkaXNrLiAqLworCWpvdXJuYWxfdXBkYXRlX3N1cGVyYmxvY2soam91cm5hbCwgMSk7CisJam91cm5hbF9zdGFydF90aHJlYWQoam91cm5hbCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKiAKKyAqIGludCBqb3VybmFsX2NyZWF0ZSgpIC0gSW5pdGlhbGlzZSB0aGUgbmV3IGpvdXJuYWwgZmlsZQorICogQGpvdXJuYWw6IEpvdXJuYWwgdG8gY3JlYXRlLiBUaGlzIHN0cnVjdHVyZSBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXNlZAorICogCisgKiBHaXZlbiBhIGpvdXJuYWxfdCBzdHJ1Y3R1cmUgd2hpY2ggdGVsbHMgdXMgd2hpY2ggZGlzayBibG9ja3Mgd2UgY2FuCisgKiB1c2UsIGNyZWF0ZSBhIG5ldyBqb3VybmFsIHN1cGVyYmxvY2sgYW5kIGluaXRpYWxpc2UgYWxsIG9mIHRoZQorICogam91cm5hbCBmaWVsZHMgZnJvbSBzY3JhdGNoLiAgCisgKiovCitpbnQgam91cm5hbF9jcmVhdGUoam91cm5hbF90ICpqb3VybmFsKQoreworCXVuc2lnbmVkIGxvbmcgYmxvY2tucjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWpvdXJuYWxfc3VwZXJibG9ja190ICpzYjsKKwlpbnQgaSwgZXJyOworCisJaWYgKGpvdXJuYWwtPmpfbWF4bGVuIDwgSkZTX01JTl9KT1VSTkFMX0JMT0NLUykgeworCQlwcmludGsgKEtFUk5fRVJSICJKb3VybmFsIGxlbmd0aCAoJWQgYmxvY2tzKSB0b28gc2hvcnQuXG4iLAorCQkJam91cm5hbC0+al9tYXhsZW4pOworCQlqb3VybmFsX2ZhaWxfc3VwZXJibG9jayhqb3VybmFsKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGpvdXJuYWwtPmpfaW5vZGUgPT0gTlVMTCkgeworCQkvKgorCQkgKiBXZSBkb24ndCBrbm93IHdoYXQgYmxvY2sgdG8gc3RhcnQgYXQhCisJCSAqLworCQlwcmludGsoS0VSTl9FTUVSRworCQkgICAgICAgIiVzOiBjcmVhdGlvbiBvZiBqb3VybmFsIG9uIGV4dGVybmFsIGRldmljZSFcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCQlCVUcoKTsKKwl9CisKKwkvKiBaZXJvIG91dCB0aGUgZW50aXJlIGpvdXJuYWwgb24gZGlzay4gIFdlIGNhbm5vdCBhZmZvcmQgdG8KKwkgICBoYXZlIGFueSBibG9ja3Mgb24gZGlzayBiZWdpbm5pbmcgd2l0aCBKRlNfTUFHSUNfTlVNQkVSLiAqLworCWpiZF9kZWJ1ZygxLCAiSkJEOiBaZXJvaW5nIG91dCBqb3VybmFsIGJsb2Nrcy4uLlxuIik7CisJZm9yIChpID0gMDsgaSA8IGpvdXJuYWwtPmpfbWF4bGVuOyBpKyspIHsKKwkJZXJyID0gam91cm5hbF9ibWFwKGpvdXJuYWwsIGksICZibG9ja25yKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCWJoID0gX19nZXRibGsoam91cm5hbC0+al9kZXYsIGJsb2NrbnIsIGpvdXJuYWwtPmpfYmxvY2tzaXplKTsKKwkJbG9ja19idWZmZXIoYmgpOworCQltZW1zZXQgKGJoLT5iX2RhdGEsIDAsIGpvdXJuYWwtPmpfYmxvY2tzaXplKTsKKwkJQlVGRkVSX1RSQUNFKGJoLCAibWFya2luZyBkaXJ0eSIpOworCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCUJVRkZFUl9UUkFDRShiaCwgIm1hcmtpbmcgdXB0b2RhdGUiKTsKKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCXVubG9ja19idWZmZXIoYmgpOworCQlfX2JyZWxzZShiaCk7CisJfQorCisJc3luY19ibG9ja2Rldihqb3VybmFsLT5qX2Rldik7CisJamJkX2RlYnVnKDEsICJKQkQ6IGpvdXJuYWwgY2xlYXJlZC5cbiIpOworCisJLyogT0ssIGZpbGwgaW4gdGhlIGluaXRpYWwgc3RhdGljIGZpZWxkcyBpbiB0aGUgbmV3IHN1cGVyYmxvY2sgKi8KKwlzYiA9IGpvdXJuYWwtPmpfc3VwZXJibG9jazsKKworCXNiLT5zX2hlYWRlci5oX21hZ2ljCSA9IGNwdV90b19iZTMyKEpGU19NQUdJQ19OVU1CRVIpOworCXNiLT5zX2hlYWRlci5oX2Jsb2NrdHlwZSA9IGNwdV90b19iZTMyKEpGU19TVVBFUkJMT0NLX1YyKTsKKworCXNiLT5zX2Jsb2Nrc2l6ZQk9IGNwdV90b19iZTMyKGpvdXJuYWwtPmpfYmxvY2tzaXplKTsKKwlzYi0+c19tYXhsZW4JPSBjcHVfdG9fYmUzMihqb3VybmFsLT5qX21heGxlbik7CisJc2ItPnNfZmlyc3QJPSBjcHVfdG9fYmUzMigxKTsKKworCWpvdXJuYWwtPmpfdHJhbnNhY3Rpb25fc2VxdWVuY2UgPSAxOworCisJam91cm5hbC0+al9mbGFncyAmPSB+SkZTX0FCT1JUOworCWpvdXJuYWwtPmpfZm9ybWF0X3ZlcnNpb24gPSAyOworCisJcmV0dXJuIGpvdXJuYWxfcmVzZXQoam91cm5hbCk7Cit9CisKKy8qKiAKKyAqIHZvaWQgam91cm5hbF91cGRhdGVfc3VwZXJibG9jaygpIC0gVXBkYXRlIGpvdXJuYWwgc2Igb24gZGlzay4KKyAqIEBqb3VybmFsOiBUaGUgam91cm5hbCB0byB1cGRhdGUuCisgKiBAd2FpdDogU2V0IHRvICcwJyBpZiB5b3UgZG9uJ3Qgd2FudCB0byB3YWl0IGZvciBJTyBjb21wbGV0aW9uLgorICoKKyAqIFVwZGF0ZSBhIGpvdXJuYWwncyBkeW5hbWljIHN1cGVyYmxvY2sgZmllbGRzIGFuZCB3cml0ZSBpdCB0byBkaXNrLAorICogb3B0aW9uYWxseSB3YWl0aW5nIGZvciB0aGUgSU8gdG8gY29tcGxldGUuCisgKi8KK3ZvaWQgam91cm5hbF91cGRhdGVfc3VwZXJibG9jayhqb3VybmFsX3QgKmpvdXJuYWwsIGludCB3YWl0KQoreworCWpvdXJuYWxfc3VwZXJibG9ja190ICpzYiA9IGpvdXJuYWwtPmpfc3VwZXJibG9jazsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gam91cm5hbC0+al9zYl9idWZmZXI7CisKKwkvKgorCSAqIEFzIGEgc3BlY2lhbCBjYXNlLCBpZiB0aGUgb24tZGlzayBjb3B5IGlzIGFscmVhZHkgbWFya2VkIGFzIG5lZWRpbmcKKwkgKiBubyByZWNvdmVyeSAoc19zdGFydCA9PSAwKSBhbmQgdGhlcmUgYXJlIG5vIG91dHN0YW5kaW5nIHRyYW5zYWN0aW9ucworCSAqIGluIHRoZSBmaWxlc3lzdGVtLCB0aGVuIHdlIGNhbiBzYWZlbHkgZGVmZXIgdGhlIHN1cGVyYmxvY2sgdXBkYXRlCisJICogdW50aWwgdGhlIG5leHQgY29tbWl0IGJ5IHNldHRpbmcgSkZTX0ZMVVNIRUQuICBUaGlzIGF2b2lkcworCSAqIGF0dGVtcHRpbmcgYSB3cml0ZSB0byBhIHBvdGVudGlhbC1yZWFkb25seSBkZXZpY2UuCisJICovCisJaWYgKHNiLT5zX3N0YXJ0ID09IDAgJiYgam91cm5hbC0+al90YWlsX3NlcXVlbmNlID09CisJCQkJam91cm5hbC0+al90cmFuc2FjdGlvbl9zZXF1ZW5jZSkgeworCQlqYmRfZGVidWcoMSwiSkJEOiBTa2lwcGluZyBzdXBlcmJsb2NrIHVwZGF0ZSBvbiByZWNvdmVyZWQgc2IgIgorCQkJIihzdGFydCAlbGQsIHNlcSAlZCwgZXJybm8gJWQpXG4iLAorCQkJam91cm5hbC0+al90YWlsLCBqb3VybmFsLT5qX3RhaWxfc2VxdWVuY2UsIAorCQkJam91cm5hbC0+al9lcnJubyk7CisJCWdvdG8gb3V0OworCX0KKworCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwlqYmRfZGVidWcoMSwiSkJEOiB1cGRhdGluZyBzdXBlcmJsb2NrIChzdGFydCAlbGQsIHNlcSAlZCwgZXJybm8gJWQpXG4iLAorCQkgIGpvdXJuYWwtPmpfdGFpbCwgam91cm5hbC0+al90YWlsX3NlcXVlbmNlLCBqb3VybmFsLT5qX2Vycm5vKTsKKworCXNiLT5zX3NlcXVlbmNlID0gY3B1X3RvX2JlMzIoam91cm5hbC0+al90YWlsX3NlcXVlbmNlKTsKKwlzYi0+c19zdGFydCAgICA9IGNwdV90b19iZTMyKGpvdXJuYWwtPmpfdGFpbCk7CisJc2ItPnNfZXJybm8gICAgPSBjcHVfdG9fYmUzMihqb3VybmFsLT5qX2Vycm5vKTsKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKworCUJVRkZFUl9UUkFDRShiaCwgIm1hcmtpbmcgZGlydHkiKTsKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJaWYgKHdhaXQpCisJCXN5bmNfZGlydHlfYnVmZmVyKGJoKTsKKwllbHNlCisJCWxsX3J3X2Jsb2NrKFdSSVRFLCAxLCAmYmgpOworCitvdXQ6CisJLyogSWYgd2UgaGF2ZSBqdXN0IGZsdXNoZWQgdGhlIGxvZyAoYnkgbWFya2luZyBzX3N0YXJ0PT0wKSwgdGhlbgorCSAqIGFueSBmdXR1cmUgY29tbWl0IHdpbGwgaGF2ZSB0byBiZSBjYXJlZnVsIHRvIHVwZGF0ZSB0aGUKKwkgKiBzdXBlcmJsb2NrIGFnYWluIHRvIHJlLXJlY29yZCB0aGUgdHJ1ZSBzdGFydCBvZiB0aGUgbG9nLiAqLworCisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCWlmIChzYi0+c19zdGFydCkKKwkJam91cm5hbC0+al9mbGFncyAmPSB+SkZTX0ZMVVNIRUQ7CisJZWxzZQorCQlqb3VybmFsLT5qX2ZsYWdzIHw9IEpGU19GTFVTSEVEOworCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworfQorCisvKgorICogUmVhZCB0aGUgc3VwZXJibG9jayBmb3IgYSBnaXZlbiBqb3VybmFsLCBwZXJmb3JtaW5nIGluaXRpYWwKKyAqIHZhbGlkYXRpb24gb2YgdGhlIGZvcm1hdC4KKyAqLworCitzdGF0aWMgaW50IGpvdXJuYWxfZ2V0X3N1cGVyYmxvY2soam91cm5hbF90ICpqb3VybmFsKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJam91cm5hbF9zdXBlcmJsb2NrX3QgKnNiOworCWludCBlcnIgPSAtRUlPOworCisJYmggPSBqb3VybmFsLT5qX3NiX2J1ZmZlcjsKKworCUpfQVNTRVJUKGJoICE9IE5VTEwpOworCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQlsbF9yd19ibG9jayhSRUFELCAxLCAmYmgpOworCQl3YWl0X29uX2J1ZmZlcihiaCk7CisJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQkJcHJpbnRrIChLRVJOX0VSUgorCQkJCSJKQkQ6IElPIGVycm9yIHJlYWRpbmcgam91cm5hbCBzdXBlcmJsb2NrXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJc2IgPSBqb3VybmFsLT5qX3N1cGVyYmxvY2s7CisKKwllcnIgPSAtRUlOVkFMOworCisJaWYgKHNiLT5zX2hlYWRlci5oX21hZ2ljICE9IGNwdV90b19iZTMyKEpGU19NQUdJQ19OVU1CRVIpIHx8CisJICAgIHNiLT5zX2Jsb2Nrc2l6ZSAhPSBjcHVfdG9fYmUzMihqb3VybmFsLT5qX2Jsb2Nrc2l6ZSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSkJEOiBubyB2YWxpZCBqb3VybmFsIHN1cGVyYmxvY2sgZm91bmRcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlzd2l0Y2goYmUzMl90b19jcHUoc2ItPnNfaGVhZGVyLmhfYmxvY2t0eXBlKSkgeworCWNhc2UgSkZTX1NVUEVSQkxPQ0tfVjE6CisJCWpvdXJuYWwtPmpfZm9ybWF0X3ZlcnNpb24gPSAxOworCQlicmVhazsKKwljYXNlIEpGU19TVVBFUkJMT0NLX1YyOgorCQlqb3VybmFsLT5qX2Zvcm1hdF92ZXJzaW9uID0gMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSkJEOiB1bnJlY29nbmlzZWQgc3VwZXJibG9jayBmb3JtYXQgSURcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoYmUzMl90b19jcHUoc2ItPnNfbWF4bGVuKSA8IGpvdXJuYWwtPmpfbWF4bGVuKQorCQlqb3VybmFsLT5qX21heGxlbiA9IGJlMzJfdG9fY3B1KHNiLT5zX21heGxlbik7CisJZWxzZSBpZiAoYmUzMl90b19jcHUoc2ItPnNfbWF4bGVuKSA+IGpvdXJuYWwtPmpfbWF4bGVuKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICJKQkQ6IGpvdXJuYWwgZmlsZSB0b28gc2hvcnRcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXR1cm4gMDsKKworb3V0OgorCWpvdXJuYWxfZmFpbF9zdXBlcmJsb2NrKGpvdXJuYWwpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBMb2FkIHRoZSBvbi1kaXNrIGpvdXJuYWwgc3VwZXJibG9jayBhbmQgcmVhZCB0aGUga2V5IGZpZWxkcyBpbnRvIHRoZQorICogam91cm5hbF90LgorICovCisKK3N0YXRpYyBpbnQgbG9hZF9zdXBlcmJsb2NrKGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwlpbnQgZXJyOworCWpvdXJuYWxfc3VwZXJibG9ja190ICpzYjsKKworCWVyciA9IGpvdXJuYWxfZ2V0X3N1cGVyYmxvY2soam91cm5hbCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXNiID0gam91cm5hbC0+al9zdXBlcmJsb2NrOworCisJam91cm5hbC0+al90YWlsX3NlcXVlbmNlID0gYmUzMl90b19jcHUoc2ItPnNfc2VxdWVuY2UpOworCWpvdXJuYWwtPmpfdGFpbCA9IGJlMzJfdG9fY3B1KHNiLT5zX3N0YXJ0KTsKKwlqb3VybmFsLT5qX2ZpcnN0ID0gYmUzMl90b19jcHUoc2ItPnNfZmlyc3QpOworCWpvdXJuYWwtPmpfbGFzdCA9IGJlMzJfdG9fY3B1KHNiLT5zX21heGxlbik7CisJam91cm5hbC0+al9lcnJubyA9IGJlMzJfdG9fY3B1KHNiLT5zX2Vycm5vKTsKKworCXJldHVybiAwOworfQorCisKKy8qKgorICogaW50IGpvdXJuYWxfbG9hZCgpIC0gUmVhZCBqb3VybmFsIGZyb20gZGlzay4KKyAqIEBqb3VybmFsOiBKb3VybmFsIHRvIGFjdCBvbi4KKyAqIAorICogR2l2ZW4gYSBqb3VybmFsX3Qgc3RydWN0dXJlIHdoaWNoIHRlbGxzIHVzIHdoaWNoIGRpc2sgYmxvY2tzIGNvbnRhaW4KKyAqIGEgam91cm5hbCwgcmVhZCB0aGUgam91cm5hbCBmcm9tIGRpc2sgdG8gaW5pdGlhbGlzZSB0aGUgaW4tbWVtb3J5CisgKiBzdHJ1Y3R1cmVzLgorICovCitpbnQgam91cm5hbF9sb2FkKGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gbG9hZF9zdXBlcmJsb2NrKGpvdXJuYWwpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBJZiB0aGlzIGlzIGEgVjIgc3VwZXJibG9jaywgdGhlbiB3ZSBoYXZlIHRvIGNoZWNrIHRoZQorCSAqIGZlYXR1cmVzIGZsYWdzIG9uIGl0LiAqLworCisJaWYgKGpvdXJuYWwtPmpfZm9ybWF0X3ZlcnNpb24gPj0gMikgeworCQlqb3VybmFsX3N1cGVyYmxvY2tfdCAqc2IgPSBqb3VybmFsLT5qX3N1cGVyYmxvY2s7CisKKwkJaWYgKChzYi0+c19mZWF0dXJlX3JvX2NvbXBhdCAmCisJCSAgICAgfmNwdV90b19iZTMyKEpGU19LTk9XTl9ST0NPTVBBVF9GRUFUVVJFUykpIHx8CisJCSAgICAoc2ItPnNfZmVhdHVyZV9pbmNvbXBhdCAmCisJCSAgICAgfmNwdV90b19iZTMyKEpGU19LTk9XTl9JTkNPTVBBVF9GRUFUVVJFUykpKSB7CisJCQlwcmludGsgKEtFUk5fV0FSTklORworCQkJCSJKQkQ6IFVucmVjb2duaXNlZCBmZWF0dXJlcyBvbiBqb3VybmFsXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJLyogTGV0IHRoZSByZWNvdmVyeSBjb2RlIGNoZWNrIHdoZXRoZXIgaXQgbmVlZHMgdG8gcmVjb3ZlciBhbnkKKwkgKiBkYXRhIGZyb20gdGhlIGpvdXJuYWwuICovCisJaWYgKGpvdXJuYWxfcmVjb3Zlcihqb3VybmFsKSkKKwkJZ290byByZWNvdmVyeV9lcnJvcjsKKworCS8qIE9LLCB3ZSd2ZSBmaW5pc2hlZCB3aXRoIHRoZSBkeW5hbWljIGpvdXJuYWwgYml0czoKKwkgKiByZWluaXRpYWxpc2UgdGhlIGR5bmFtaWMgY29udGVudHMgb2YgdGhlIHN1cGVyYmxvY2sgaW4gbWVtb3J5CisJICogYW5kIHJlc2V0IHRoZW0gb24gZGlzay4gKi8KKwlpZiAoam91cm5hbF9yZXNldChqb3VybmFsKSkKKwkJZ290byByZWNvdmVyeV9lcnJvcjsKKworCWpvdXJuYWwtPmpfZmxhZ3MgJj0gfkpGU19BQk9SVDsKKwlqb3VybmFsLT5qX2ZsYWdzIHw9IEpGU19MT0FERUQ7CisJcmV0dXJuIDA7CisKK3JlY292ZXJ5X2Vycm9yOgorCXByaW50ayAoS0VSTl9XQVJOSU5HICJKQkQ6IHJlY292ZXJ5IGZhaWxlZFxuIik7CisJcmV0dXJuIC1FSU87Cit9CisKKy8qKgorICogdm9pZCBqb3VybmFsX2Rlc3Ryb3koKSAtIFJlbGVhc2UgYSBqb3VybmFsX3Qgc3RydWN0dXJlLgorICogQGpvdXJuYWw6IEpvdXJuYWwgdG8gYWN0IG9uLgorICoKKyAqIFJlbGVhc2UgYSBqb3VybmFsX3Qgc3RydWN0dXJlIG9uY2UgaXQgaXMgbm8gbG9uZ2VyIGluIHVzZSBieSB0aGUKKyAqIGpvdXJuYWxlZCBvYmplY3QuCisgKi8KK3ZvaWQgam91cm5hbF9kZXN0cm95KGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwkvKiBXYWl0IGZvciB0aGUgY29tbWl0IHRocmVhZCB0byB3YWtlIHVwIGFuZCBkaWUuICovCisJam91cm5hbF9raWxsX3RocmVhZChqb3VybmFsKTsKKworCS8qIEZvcmNlIGEgZmluYWwgbG9nIGNvbW1pdCAqLworCWlmIChqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb24pCisJCWpvdXJuYWxfY29tbWl0X3RyYW5zYWN0aW9uKGpvdXJuYWwpOworCisJLyogRm9yY2UgYW55IG9sZCB0cmFuc2FjdGlvbnMgdG8gZGlzayAqLworCisJLyogVG90YWxseSBhbmFsIGxvY2tpbmcgaGVyZS4uLiAqLworCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCXdoaWxlIChqb3VybmFsLT5qX2NoZWNrcG9pbnRfdHJhbnNhY3Rpb25zICE9IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJbG9nX2RvX2NoZWNrcG9pbnQoam91cm5hbCk7CisJCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCX0KKworCUpfQVNTRVJUKGpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbiA9PSBOVUxMKTsKKwlKX0FTU0VSVChqb3VybmFsLT5qX2NvbW1pdHRpbmdfdHJhbnNhY3Rpb24gPT0gTlVMTCk7CisJSl9BU1NFUlQoam91cm5hbC0+al9jaGVja3BvaW50X3RyYW5zYWN0aW9ucyA9PSBOVUxMKTsKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCisJLyogV2UgY2FuIG5vdyBtYXJrIHRoZSBqb3VybmFsIGFzIGVtcHR5LiAqLworCWpvdXJuYWwtPmpfdGFpbCA9IDA7CisJam91cm5hbC0+al90YWlsX3NlcXVlbmNlID0gKytqb3VybmFsLT5qX3RyYW5zYWN0aW9uX3NlcXVlbmNlOworCWlmIChqb3VybmFsLT5qX3NiX2J1ZmZlcikgeworCQlqb3VybmFsX3VwZGF0ZV9zdXBlcmJsb2NrKGpvdXJuYWwsIDEpOworCQlicmVsc2Uoam91cm5hbC0+al9zYl9idWZmZXIpOworCX0KKworCWlmIChqb3VybmFsLT5qX2lub2RlKQorCQlpcHV0KGpvdXJuYWwtPmpfaW5vZGUpOworCWlmIChqb3VybmFsLT5qX3Jldm9rZSkKKwkJam91cm5hbF9kZXN0cm95X3Jldm9rZShqb3VybmFsKTsKKwlrZnJlZShqb3VybmFsLT5qX3didWYpOworCWtmcmVlKGpvdXJuYWwpOworfQorCisKKy8qKgorICppbnQgam91cm5hbF9jaGVja191c2VkX2ZlYXR1cmVzICgpIC0gQ2hlY2sgaWYgZmVhdHVyZXMgc3BlY2lmaWVkIGFyZSB1c2VkLgorICogQGpvdXJuYWw6IEpvdXJuYWwgdG8gY2hlY2suCisgKiBAY29tcGF0OiBiaXRtYXNrIG9mIGNvbXBhdGlibGUgZmVhdHVyZXMKKyAqIEBybzogYml0bWFzayBvZiBmZWF0dXJlcyB0aGF0IGZvcmNlIHJlYWQtb25seSBtb3VudAorICogQGluY29tcGF0OiBiaXRtYXNrIG9mIGluY29tcGF0aWJsZSBmZWF0dXJlcworICogCisgKiBDaGVjayB3aGV0aGVyIHRoZSBqb3VybmFsIHVzZXMgYWxsIG9mIGEgZ2l2ZW4gc2V0IG9mCisgKiBmZWF0dXJlcy4gIFJldHVybiB0cnVlIChub24temVybykgaWYgaXQgZG9lcy4gCisgKiovCisKK2ludCBqb3VybmFsX2NoZWNrX3VzZWRfZmVhdHVyZXMgKGpvdXJuYWxfdCAqam91cm5hbCwgdW5zaWduZWQgbG9uZyBjb21wYXQsCisJCQkJIHVuc2lnbmVkIGxvbmcgcm8sIHVuc2lnbmVkIGxvbmcgaW5jb21wYXQpCit7CisJam91cm5hbF9zdXBlcmJsb2NrX3QgKnNiOworCisJaWYgKCFjb21wYXQgJiYgIXJvICYmICFpbmNvbXBhdCkKKwkJcmV0dXJuIDE7CisJaWYgKGpvdXJuYWwtPmpfZm9ybWF0X3ZlcnNpb24gPT0gMSkKKwkJcmV0dXJuIDA7CisKKwlzYiA9IGpvdXJuYWwtPmpfc3VwZXJibG9jazsKKworCWlmICgoKGJlMzJfdG9fY3B1KHNiLT5zX2ZlYXR1cmVfY29tcGF0KSAmIGNvbXBhdCkgPT0gY29tcGF0KSAmJgorCSAgICAoKGJlMzJfdG9fY3B1KHNiLT5zX2ZlYXR1cmVfcm9fY29tcGF0KSAmIHJvKSA9PSBybykgJiYKKwkgICAgKChiZTMyX3RvX2NwdShzYi0+c19mZWF0dXJlX2luY29tcGF0KSAmIGluY29tcGF0KSA9PSBpbmNvbXBhdCkpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaW50IGpvdXJuYWxfY2hlY2tfYXZhaWxhYmxlX2ZlYXR1cmVzKCkgLSBDaGVjayBmZWF0dXJlIHNldCBpbiBqb3VybmFsbGluZyBsYXllcgorICogQGpvdXJuYWw6IEpvdXJuYWwgdG8gY2hlY2suCisgKiBAY29tcGF0OiBiaXRtYXNrIG9mIGNvbXBhdGlibGUgZmVhdHVyZXMKKyAqIEBybzogYml0bWFzayBvZiBmZWF0dXJlcyB0aGF0IGZvcmNlIHJlYWQtb25seSBtb3VudAorICogQGluY29tcGF0OiBiaXRtYXNrIG9mIGluY29tcGF0aWJsZSBmZWF0dXJlcworICogCisgKiBDaGVjayB3aGV0aGVyIHRoZSBqb3VybmFsaW5nIGNvZGUgc3VwcG9ydHMgdGhlIHVzZSBvZgorICogYWxsIG9mIGEgZ2l2ZW4gc2V0IG9mIGZlYXR1cmVzIG9uIHRoaXMgam91cm5hbC4gIFJldHVybiB0cnVlCisgKiAobm9uLXplcm8pIGlmIGl0IGNhbi4gKi8KKworaW50IGpvdXJuYWxfY2hlY2tfYXZhaWxhYmxlX2ZlYXR1cmVzIChqb3VybmFsX3QgKmpvdXJuYWwsIHVuc2lnbmVkIGxvbmcgY29tcGF0LAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgcm8sIHVuc2lnbmVkIGxvbmcgaW5jb21wYXQpCit7CisJam91cm5hbF9zdXBlcmJsb2NrX3QgKnNiOworCisJaWYgKCFjb21wYXQgJiYgIXJvICYmICFpbmNvbXBhdCkKKwkJcmV0dXJuIDE7CisKKwlzYiA9IGpvdXJuYWwtPmpfc3VwZXJibG9jazsKKworCS8qIFdlIGNhbiBzdXBwb3J0IGFueSBrbm93biByZXF1ZXN0ZWQgZmVhdHVyZXMgaWZmIHRoZQorCSAqIHN1cGVyYmxvY2sgaXMgaW4gdmVyc2lvbiAyLiAgT3RoZXJ3aXNlIHdlIGZhaWwgdG8gc3VwcG9ydCBhbnkKKwkgKiBleHRlbmRlZCBzYiBmZWF0dXJlcy4gKi8KKworCWlmIChqb3VybmFsLT5qX2Zvcm1hdF92ZXJzaW9uICE9IDIpCisJCXJldHVybiAwOworCisJaWYgKChjb21wYXQgICAmIEpGU19LTk9XTl9DT01QQVRfRkVBVFVSRVMpID09IGNvbXBhdCAmJgorCSAgICAocm8gICAgICAgJiBKRlNfS05PV05fUk9DT01QQVRfRkVBVFVSRVMpID09IHJvICYmCisJICAgIChpbmNvbXBhdCAmIEpGU19LTk9XTl9JTkNPTVBBVF9GRUFUVVJFUykgPT0gaW5jb21wYXQpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaW50IGpvdXJuYWxfc2V0X2ZlYXR1cmVzICgpIC0gTWFyayBhIGdpdmVuIGpvdXJuYWwgZmVhdHVyZSBpbiB0aGUgc3VwZXJibG9jaworICogQGpvdXJuYWw6IEpvdXJuYWwgdG8gYWN0IG9uLgorICogQGNvbXBhdDogYml0bWFzayBvZiBjb21wYXRpYmxlIGZlYXR1cmVzCisgKiBAcm86IGJpdG1hc2sgb2YgZmVhdHVyZXMgdGhhdCBmb3JjZSByZWFkLW9ubHkgbW91bnQKKyAqIEBpbmNvbXBhdDogYml0bWFzayBvZiBpbmNvbXBhdGlibGUgZmVhdHVyZXMKKyAqCisgKiBNYXJrIGEgZ2l2ZW4gam91cm5hbCBmZWF0dXJlIGFzIHByZXNlbnQgb24gdGhlCisgKiBzdXBlcmJsb2NrLiAgUmV0dXJucyB0cnVlIGlmIHRoZSByZXF1ZXN0ZWQgZmVhdHVyZXMgY291bGQgYmUgc2V0LiAKKyAqCisgKi8KKworaW50IGpvdXJuYWxfc2V0X2ZlYXR1cmVzIChqb3VybmFsX3QgKmpvdXJuYWwsIHVuc2lnbmVkIGxvbmcgY29tcGF0LAorCQkJICB1bnNpZ25lZCBsb25nIHJvLCB1bnNpZ25lZCBsb25nIGluY29tcGF0KQoreworCWpvdXJuYWxfc3VwZXJibG9ja190ICpzYjsKKworCWlmIChqb3VybmFsX2NoZWNrX3VzZWRfZmVhdHVyZXMoam91cm5hbCwgY29tcGF0LCBybywgaW5jb21wYXQpKQorCQlyZXR1cm4gMTsKKworCWlmICgham91cm5hbF9jaGVja19hdmFpbGFibGVfZmVhdHVyZXMoam91cm5hbCwgY29tcGF0LCBybywgaW5jb21wYXQpKQorCQlyZXR1cm4gMDsKKworCWpiZF9kZWJ1ZygxLCAiU2V0dGluZyBuZXcgZmVhdHVyZXMgMHglbHgvMHglbHgvMHglbHhcbiIsCisJCSAgY29tcGF0LCBybywgaW5jb21wYXQpOworCisJc2IgPSBqb3VybmFsLT5qX3N1cGVyYmxvY2s7CisKKwlzYi0+c19mZWF0dXJlX2NvbXBhdCAgICB8PSBjcHVfdG9fYmUzMihjb21wYXQpOworCXNiLT5zX2ZlYXR1cmVfcm9fY29tcGF0IHw9IGNwdV90b19iZTMyKHJvKTsKKwlzYi0+c19mZWF0dXJlX2luY29tcGF0ICB8PSBjcHVfdG9fYmUzMihpbmNvbXBhdCk7CisKKwlyZXR1cm4gMTsKK30KKworCisvKioKKyAqIGludCBqb3VybmFsX3VwZGF0ZV9mb3JtYXQgKCkgLSBVcGRhdGUgb24tZGlzayBqb3VybmFsIHN0cnVjdHVyZS4KKyAqIEBqb3VybmFsOiBKb3VybmFsIHRvIGFjdCBvbi4KKyAqCisgKiBHaXZlbiBhbiBpbml0aWFsaXNlZCBidXQgdW5sb2FkZWQgam91cm5hbCBzdHJ1Y3QsIHBva2UgYWJvdXQgaW4gdGhlCisgKiBvbi1kaXNrIHN0cnVjdHVyZSB0byB1cGRhdGUgaXQgdG8gdGhlIG1vc3QgcmVjZW50IHN1cHBvcnRlZCB2ZXJzaW9uLgorICovCitpbnQgam91cm5hbF91cGRhdGVfZm9ybWF0IChqb3VybmFsX3QgKmpvdXJuYWwpCit7CisJam91cm5hbF9zdXBlcmJsb2NrX3QgKnNiOworCWludCBlcnI7CisKKwllcnIgPSBqb3VybmFsX2dldF9zdXBlcmJsb2NrKGpvdXJuYWwpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlzYiA9IGpvdXJuYWwtPmpfc3VwZXJibG9jazsKKworCXN3aXRjaCAoYmUzMl90b19jcHUoc2ItPnNfaGVhZGVyLmhfYmxvY2t0eXBlKSkgeworCWNhc2UgSkZTX1NVUEVSQkxPQ0tfVjI6CisJCXJldHVybiAwOworCWNhc2UgSkZTX1NVUEVSQkxPQ0tfVjE6CisJCXJldHVybiBqb3VybmFsX2NvbnZlcnRfc3VwZXJibG9ja192MShqb3VybmFsLCBzYik7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGpvdXJuYWxfY29udmVydF9zdXBlcmJsb2NrX3YxKGpvdXJuYWxfdCAqam91cm5hbCwKKwkJCQkJIGpvdXJuYWxfc3VwZXJibG9ja190ICpzYikKK3sKKwlpbnQgb2Zmc2V0LCBibG9ja3NpemU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJIkpCRDogQ29udmVydGluZyBzdXBlcmJsb2NrIGZyb20gdmVyc2lvbiAxIHRvIDIuXG4iKTsKKworCS8qIFByZS1pbml0aWFsaXNlIG5ldyBmaWVsZHMgdG8gemVybyAqLworCW9mZnNldCA9ICgoY2hhciAqKSAmKHNiLT5zX2ZlYXR1cmVfY29tcGF0KSkgLSAoKGNoYXIgKikgc2IpOworCWJsb2Nrc2l6ZSA9IGJlMzJfdG9fY3B1KHNiLT5zX2Jsb2Nrc2l6ZSk7CisJbWVtc2V0KCZzYi0+c19mZWF0dXJlX2NvbXBhdCwgMCwgYmxvY2tzaXplLW9mZnNldCk7CisKKwlzYi0+c19ucl91c2VycyA9IGNwdV90b19iZTMyKDEpOworCXNiLT5zX2hlYWRlci5oX2Jsb2NrdHlwZSA9IGNwdV90b19iZTMyKEpGU19TVVBFUkJMT0NLX1YyKTsKKwlqb3VybmFsLT5qX2Zvcm1hdF92ZXJzaW9uID0gMjsKKworCWJoID0gam91cm5hbC0+al9zYl9idWZmZXI7CisJQlVGRkVSX1RSQUNFKGJoLCAibWFya2luZyBkaXJ0eSIpOworCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwlzeW5jX2RpcnR5X2J1ZmZlcihiaCk7CisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBpbnQgam91cm5hbF9mbHVzaCAoKSAtIEZsdXNoIGpvdXJuYWwKKyAqIEBqb3VybmFsOiBKb3VybmFsIHRvIGFjdCBvbi4KKyAqIAorICogRmx1c2ggYWxsIGRhdGEgZm9yIGEgZ2l2ZW4gam91cm5hbCB0byBkaXNrIGFuZCBlbXB0eSB0aGUgam91cm5hbC4KKyAqIEZpbGVzeXN0ZW1zIGNhbiB1c2UgdGhpcyB3aGVuIHJlbW91bnRpbmcgcmVhZG9ubHkgdG8gZW5zdXJlIHRoYXQKKyAqIHJlY292ZXJ5IGRvZXMgbm90IG5lZWQgdG8gaGFwcGVuIG9uIHJlbW91bnQuCisgKi8KKworaW50IGpvdXJuYWxfZmx1c2goam91cm5hbF90ICpqb3VybmFsKQoreworCWludCBlcnIgPSAwOworCXRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIG9sZF90YWlsOworCisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCisJLyogRm9yY2UgZXZlcnl0aGluZyBidWZmZXJlZCB0byB0aGUgbG9nLi4uICovCisJaWYgKGpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbikgeworCQl0cmFuc2FjdGlvbiA9IGpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbjsKKwkJX19sb2dfc3RhcnRfY29tbWl0KGpvdXJuYWwsIHRyYW5zYWN0aW9uLT50X3RpZCk7CisJfSBlbHNlIGlmIChqb3VybmFsLT5qX2NvbW1pdHRpbmdfdHJhbnNhY3Rpb24pCisJCXRyYW5zYWN0aW9uID0gam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uOworCisJLyogV2FpdCBmb3IgdGhlIGxvZyBjb21taXQgdG8gY29tcGxldGUuLi4gKi8KKwlpZiAodHJhbnNhY3Rpb24pIHsKKwkJdGlkX3QgdGlkID0gdHJhbnNhY3Rpb24tPnRfdGlkOworCisJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCQlsb2dfd2FpdF9jb21taXQoam91cm5hbCwgdGlkKTsKKwl9IGVsc2UgeworCQlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwl9CisKKwkvKiAuLi5hbmQgZmx1c2ggZXZlcnl0aGluZyBpbiB0aGUgbG9nIG91dCB0byBkaXNrLiAqLworCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCXdoaWxlICghZXJyICYmIGpvdXJuYWwtPmpfY2hlY2twb2ludF90cmFuc2FjdGlvbnMgIT0gTlVMTCkgeworCQlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCQllcnIgPSBsb2dfZG9fY2hlY2twb2ludChqb3VybmFsKTsKKwkJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJfQorCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJY2xlYW51cF9qb3VybmFsX3RhaWwoam91cm5hbCk7CisKKwkvKiBGaW5hbGx5LCBtYXJrIHRoZSBqb3VybmFsIGFzIHJlYWxseSBuZWVkaW5nIG5vIHJlY292ZXJ5LgorCSAqIFRoaXMgc2V0cyBzX3N0YXJ0PT0wIGluIHRoZSB1bmRlcmx5aW5nIHN1cGVyYmxvY2ssIHdoaWNoIGlzCisJICogdGhlIG1hZ2ljIGNvZGUgZm9yIGEgZnVsbHktcmVjb3ZlcmVkIHN1cGVyYmxvY2suICBBbnkgZnV0dXJlCisJICogY29tbWl0cyBvZiBkYXRhIHRvIHRoZSBqb3VybmFsIHdpbGwgcmVzdG9yZSB0aGUgY3VycmVudAorCSAqIHNfc3RhcnQgdmFsdWUuICovCisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCW9sZF90YWlsID0gam91cm5hbC0+al90YWlsOworCWpvdXJuYWwtPmpfdGFpbCA9IDA7CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJam91cm5hbF91cGRhdGVfc3VwZXJibG9jayhqb3VybmFsLCAxKTsKKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJam91cm5hbC0+al90YWlsID0gb2xkX3RhaWw7CisKKwlKX0FTU0VSVCgham91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uKTsKKwlKX0FTU0VSVCgham91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uKTsKKwlKX0FTU0VSVCgham91cm5hbC0+al9jaGVja3BvaW50X3RyYW5zYWN0aW9ucyk7CisJSl9BU1NFUlQoam91cm5hbC0+al9oZWFkID09IGpvdXJuYWwtPmpfdGFpbCk7CisJSl9BU1NFUlQoam91cm5hbC0+al90YWlsX3NlcXVlbmNlID09IGpvdXJuYWwtPmpfdHJhbnNhY3Rpb25fc2VxdWVuY2UpOworCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogaW50IGpvdXJuYWxfd2lwZSgpIC0gV2lwZSBqb3VybmFsIGNvbnRlbnRzCisgKiBAam91cm5hbDogSm91cm5hbCB0byBhY3Qgb24uCisgKiBAd3JpdGU6IGZsYWcgKHNlZSBiZWxvdykKKyAqIAorICogV2lwZSBvdXQgYWxsIG9mIHRoZSBjb250ZW50cyBvZiBhIGpvdXJuYWwsIHNhZmVseS4gIFRoaXMgd2lsbCBwcm9kdWNlCisgKiBhIHdhcm5pbmcgaWYgdGhlIGpvdXJuYWwgY29udGFpbnMgYW55IHZhbGlkIHJlY292ZXJ5IGluZm9ybWF0aW9uLgorICogTXVzdCBiZSBjYWxsZWQgYmV0d2VlbiBqb3VybmFsX2luaXRfKigpIGFuZCBqb3VybmFsX2xvYWQoKS4KKyAqCisgKiBJZiAnd3JpdGUnIGlzIG5vbi16ZXJvLCB0aGVuIHdlIHdpcGUgb3V0IHRoZSBqb3VybmFsIG9uIGRpc2s7IG90aGVyd2lzZQorICogd2UgbWVyZWx5IHN1cHByZXNzIHJlY292ZXJ5LgorICovCisKK2ludCBqb3VybmFsX3dpcGUoam91cm5hbF90ICpqb3VybmFsLCBpbnQgd3JpdGUpCit7CisJam91cm5hbF9zdXBlcmJsb2NrX3QgKnNiOworCWludCBlcnIgPSAwOworCisJSl9BU1NFUlQgKCEoam91cm5hbC0+al9mbGFncyAmIEpGU19MT0FERUQpKTsKKworCWVyciA9IGxvYWRfc3VwZXJibG9jayhqb3VybmFsKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJc2IgPSBqb3VybmFsLT5qX3N1cGVyYmxvY2s7CisKKwlpZiAoIWpvdXJuYWwtPmpfdGFpbCkKKwkJZ290byBub19yZWNvdmVyeTsKKworCXByaW50ayAoS0VSTl9XQVJOSU5HICJKQkQ6ICVzIHJlY292ZXJ5IGluZm9ybWF0aW9uIG9uIGpvdXJuYWxcbiIsCisJCXdyaXRlID8gIkNsZWFyaW5nIiA6ICJJZ25vcmluZyIpOworCisJZXJyID0gam91cm5hbF9za2lwX3JlY292ZXJ5KGpvdXJuYWwpOworCWlmICh3cml0ZSkKKwkJam91cm5hbF91cGRhdGVfc3VwZXJibG9jayhqb3VybmFsLCAxKTsKKworIG5vX3JlY292ZXJ5OgorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBqb3VybmFsX2Rldl9uYW1lOiBmb3JtYXQgYSBjaGFyYWN0ZXIgc3RyaW5nIHRvIGRlc2NyaWJlIG9uIHdoYXQKKyAqIGRldmljZSB0aGlzIGpvdXJuYWwgaXMgcHJlc2VudC4KKyAqLworCitjb25zdCBjaGFyICpqb3VybmFsX2Rldl9uYW1lKGpvdXJuYWxfdCAqam91cm5hbCwgY2hhciAqYnVmZmVyKQoreworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CisKKwlpZiAoam91cm5hbC0+al9pbm9kZSkKKwkJYmRldiA9IGpvdXJuYWwtPmpfaW5vZGUtPmlfc2ItPnNfYmRldjsKKwllbHNlCisJCWJkZXYgPSBqb3VybmFsLT5qX2RldjsKKworCXJldHVybiBiZGV2bmFtZShiZGV2LCBidWZmZXIpOworfQorCisvKgorICogSm91cm5hbCBhYm9ydCBoYXMgdmVyeSBzcGVjaWZpYyBzZW1hbnRpY3MsIHdoaWNoIHdlIGRlc2NyaWJlCisgKiBmb3Igam91cm5hbCBhYm9ydC4gCisgKgorICogVHdvIGludGVybmFsIGZ1bmN0aW9uLCB3aGljaCBwcm92aWRlIGFib3J0IHRvIHRlIGpiZCBsYXllcgorICogaXRzZWxmIGFyZSBoZXJlLgorICovCisKKy8qCisgKiBRdWljayB2ZXJzaW9uIGZvciBpbnRlcm5hbCBqb3VybmFsIHVzZSAoZG9lc24ndCBsb2NrIHRoZSBqb3VybmFsKS4KKyAqIEFib3J0cyBoYXJkIC0tLSB3ZSBtYXJrIHRoZSBhYm9ydCBhcyBvY2N1cnJlZCwgYnV0IGRvIF9ub3RoaW5nXyBlbHNlLAorICogYW5kIGRvbid0IGF0dGVtcHQgdG8gbWFrZSBhbnkgb3RoZXIgam91cm5hbCB1cGRhdGVzLgorICovCit2b2lkIF9fam91cm5hbF9hYm9ydF9oYXJkKGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwl0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbjsKKwljaGFyIGJbQkRFVk5BTUVfU0laRV07CisKKwlpZiAoam91cm5hbC0+al9mbGFncyAmIEpGU19BQk9SVCkKKwkJcmV0dXJuOworCisJcHJpbnRrKEtFUk5fRVJSICJBYm9ydGluZyBqb3VybmFsIG9uIGRldmljZSAlcy5cbiIsCisJCWpvdXJuYWxfZGV2X25hbWUoam91cm5hbCwgYikpOworCisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCWpvdXJuYWwtPmpfZmxhZ3MgfD0gSkZTX0FCT1JUOworCXRyYW5zYWN0aW9uID0gam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uOworCWlmICh0cmFuc2FjdGlvbikKKwkJX19sb2dfc3RhcnRfY29tbWl0KGpvdXJuYWwsIHRyYW5zYWN0aW9uLT50X3RpZCk7CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7Cit9CisKKy8qIFNvZnQgYWJvcnQ6IHJlY29yZCB0aGUgYWJvcnQgZXJyb3Igc3RhdHVzIGluIHRoZSBqb3VybmFsIHN1cGVyYmxvY2ssCisgKiBidXQgZG9uJ3QgZG8gYW55IG90aGVyIElPLiAqLwordm9pZCBfX2pvdXJuYWxfYWJvcnRfc29mdCAoam91cm5hbF90ICpqb3VybmFsLCBpbnQgZXJybm8pCit7CisJaWYgKGpvdXJuYWwtPmpfZmxhZ3MgJiBKRlNfQUJPUlQpCisJCXJldHVybjsKKworCWlmICgham91cm5hbC0+al9lcnJubykKKwkJam91cm5hbC0+al9lcnJubyA9IGVycm5vOworCisJX19qb3VybmFsX2Fib3J0X2hhcmQoam91cm5hbCk7CisKKwlpZiAoZXJybm8pCisJCWpvdXJuYWxfdXBkYXRlX3N1cGVyYmxvY2soam91cm5hbCwgMSk7Cit9CisKKy8qKgorICogdm9pZCBqb3VybmFsX2Fib3J0ICgpIC0gU2h1dGRvd24gdGhlIGpvdXJuYWwgaW1tZWRpYXRlbHkuCisgKiBAam91cm5hbDogdGhlIGpvdXJuYWwgdG8gc2h1dGRvd24uCisgKiBAZXJybm86ICAgYW4gZXJyb3IgbnVtYmVyIHRvIHJlY29yZCBpbiB0aGUgam91cm5hbCBpbmRpY2F0aW5nCisgKiAgICAgICAgICAgdGhlIHJlYXNvbiBmb3IgdGhlIHNodXRkb3duLgorICoKKyAqIFBlcmZvcm0gYSBjb21wbGV0ZSwgaW1tZWRpYXRlIHNodXRkb3duIG9mIHRoZSBFTlRJUkUKKyAqIGpvdXJuYWwgKG5vdCBvZiBhIHNpbmdsZSB0cmFuc2FjdGlvbikuICBUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUKKyAqIHVuZG9uZSB3aXRob3V0IGNsb3NpbmcgYW5kIHJlb3BlbmluZyB0aGUgam91cm5hbC4KKyAqICAgICAgICAgICAKKyAqIFRoZSBqb3VybmFsX2Fib3J0IGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIHN1cHBvcnQgaGlnaGVyIGxldmVsIGVycm9yCisgKiByZWNvdmVyeSBtZWNoYW5pc21zIHN1Y2ggYXMgdGhlIGV4dDIvZXh0MyByZW1vdW50LXJlYWRvbmx5IGVycm9yCisgKiBtb2RlLgorICoKKyAqIEpvdXJuYWwgYWJvcnQgaGFzIHZlcnkgc3BlY2lmaWMgc2VtYW50aWNzLiAgQW55IGV4aXN0aW5nIGRpcnR5LAorICogdW5qb3VybmFsZWQgYnVmZmVycyBpbiB0aGUgbWFpbiBmaWxlc3lzdGVtIHdpbGwgc3RpbGwgYmUgd3JpdHRlbiB0bworICogZGlzayBieSBiZGZsdXNoLCBidXQgdGhlIGpvdXJuYWxpbmcgbWVjaGFuaXNtIHdpbGwgYmUgc3VzcGVuZGVkCisgKiBpbW1lZGlhdGVseSBhbmQgbm8gZnVydGhlciB0cmFuc2FjdGlvbiBjb21taXRzIHdpbGwgYmUgaG9ub3VyZWQuCisgKgorICogQW55IGRpcnR5LCBqb3VybmFsZWQgYnVmZmVycyB3aWxsIGJlIHdyaXR0ZW4gYmFjayB0byBkaXNrIHdpdGhvdXQKKyAqIGhpdHRpbmcgdGhlIGpvdXJuYWwuICBBdG9taWNpdHkgY2Fubm90IGJlIGd1YXJhbnRlZWQgb24gYW4gYWJvcnRlZAorICogZmlsZXN5c3RlbSwgYnV0IHdlIF9kb18gYXR0ZW1wdCB0byBsZWF2ZSBhcyBtdWNoIGRhdGEgYXMgcG9zc2libGUKKyAqIGJlaGluZCBmb3IgZnNjayB0byB1c2UgZm9yIGNsZWFudXAuCisgKgorICogQW55IGF0dGVtcHQgdG8gZ2V0IGEgbmV3IHRyYW5zYWN0aW9uIGhhbmRsZSBvbiBhIGpvdXJuYWwgd2hpY2ggaXMgaW4KKyAqIEFCT1JUIHN0YXRlIHdpbGwganVzdCByZXN1bHQgaW4gYW4gLUVST0ZTIGVycm9yIHJldHVybi4gIEEKKyAqIGpvdXJuYWxfc3RvcCBvbiBhbiBleGlzdGluZyBoYW5kbGUgd2lsbCByZXR1cm4gLUVJTyBpZiB3ZSBoYXZlCisgKiBlbnRlcmVkIGFib3J0IHN0YXRlIGR1cmluZyB0aGUgdXBkYXRlLgorICoKKyAqIFJlY3Vyc2l2ZSB0cmFuc2FjdGlvbnMgYXJlIG5vdCBkaXN0dXJiZWQgYnkgam91cm5hbCBhYm9ydCB1bnRpbCB0aGUKKyAqIGZpbmFsIGpvdXJuYWxfc3RvcCwgd2hpY2ggd2lsbCByZWNlaXZlIHRoZSAtRUlPIGVycm9yLgorICoKKyAqIEZpbmFsbHksIHRoZSBqb3VybmFsX2Fib3J0IGNhbGwgYWxsb3dzIHRoZSBjYWxsZXIgdG8gc3VwcGx5IGFuIGVycm5vCisgKiB3aGljaCB3aWxsIGJlIHJlY29yZGVkIChpZiBwb3NzaWJsZSkgaW4gdGhlIGpvdXJuYWwgc3VwZXJibG9jay4gIFRoaXMKKyAqIGFsbG93cyBhIGNsaWVudCB0byByZWNvcmQgZmFpbHVyZSBjb25kaXRpb25zIGluIHRoZSBtaWRkbGUgb2YgYQorICogdHJhbnNhY3Rpb24gd2l0aG91dCBoYXZpbmcgdG8gY29tcGxldGUgdGhlIHRyYW5zYWN0aW9uIHRvIHJlY29yZCB0aGUKKyAqIGZhaWx1cmUgdG8gZGlzay4gIGV4dDNfZXJyb3IsIGZvciBleGFtcGxlLCBub3cgdXNlcyB0aGlzCisgKiBmdW5jdGlvbmFsaXR5LgorICoKKyAqIEVycm9ycyB3aGljaCBvcmlnaW5hdGUgZnJvbSB3aXRoaW4gdGhlIGpvdXJuYWxpbmcgbGF5ZXIgd2lsbCBOT1QKKyAqIHN1cHBseSBhbiBlcnJubzsgYSBudWxsIGVycm5vIGltcGxpZXMgdGhhdCBhYnNvbHV0ZWx5IG5vIGZ1cnRoZXIKKyAqIHdyaXRlcyBhcmUgZG9uZSB0byB0aGUgam91cm5hbCAodW5sZXNzIHRoZXJlIGFyZSBhbnkgYWxyZWFkeSBpbgorICogcHJvZ3Jlc3MpLgorICogCisgKi8KKwordm9pZCBqb3VybmFsX2Fib3J0KGpvdXJuYWxfdCAqam91cm5hbCwgaW50IGVycm5vKQoreworCV9fam91cm5hbF9hYm9ydF9zb2Z0KGpvdXJuYWwsIGVycm5vKTsKK30KKworLyoqIAorICogaW50IGpvdXJuYWxfZXJybm8gKCkgLSByZXR1cm5zIHRoZSBqb3VybmFsJ3MgZXJyb3Igc3RhdGUuCisgKiBAam91cm5hbDogam91cm5hbCB0byBleGFtaW5lLgorICoKKyAqIFRoaXMgaXMgdGhlIGVycm5vIG51bWJldCBzZXQgd2l0aCBqb3VybmFsX2Fib3J0KCksIHRoZSBsYXN0CisgKiB0aW1lIHRoZSBqb3VybmFsIHdhcyBtb3VudGVkIC0gaWYgdGhlIGpvdXJuYWwgd2FzIHN0b3BwZWQKKyAqIHdpdGhvdXQgY2FsbGluZyBhYm9ydCB0aGlzIHdpbGwgYmUgMC4KKyAqCisgKiBJZiB0aGUgam91cm5hbCBoYXMgYmVlbiBhYm9ydGVkIG9uIHRoaXMgbW91bnQgdGltZSAtRVJPRlMgd2lsbAorICogYmUgcmV0dXJuZWQuCisgKi8KK2ludCBqb3VybmFsX2Vycm5vKGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwlpbnQgZXJyOworCisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCWlmIChqb3VybmFsLT5qX2ZsYWdzICYgSkZTX0FCT1JUKQorCQllcnIgPSAtRVJPRlM7CisJZWxzZQorCQllcnIgPSBqb3VybmFsLT5qX2Vycm5vOworCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCXJldHVybiBlcnI7Cit9CisKKy8qKiAKKyAqIGludCBqb3VybmFsX2NsZWFyX2VyciAoKSAtIGNsZWFycyB0aGUgam91cm5hbCdzIGVycm9yIHN0YXRlCisgKiBAam91cm5hbDogam91cm5hbCB0byBhY3Qgb24uCisgKgorICogQW4gZXJyb3IgbXVzdCBiZSBjbGVhcmVkIG9yIEFja2VkIHRvIHRha2UgYSBGUyBvdXQgb2YgcmVhZG9ubHkKKyAqIG1vZGUuCisgKi8KK2ludCBqb3VybmFsX2NsZWFyX2Vycihqb3VybmFsX3QgKmpvdXJuYWwpCit7CisJaW50IGVyciA9IDA7CisKKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJaWYgKGpvdXJuYWwtPmpfZmxhZ3MgJiBKRlNfQUJPUlQpCisJCWVyciA9IC1FUk9GUzsKKwllbHNlCisJCWpvdXJuYWwtPmpfZXJybm8gPSAwOworCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCXJldHVybiBlcnI7Cit9CisKKy8qKiAKKyAqIHZvaWQgam91cm5hbF9hY2tfZXJyKCkgLSBBY2sgam91cm5hbCBlcnIuCisgKiBAam91cm5hbDogam91cm5hbCB0byBhY3Qgb24uCisgKgorICogQW4gZXJyb3IgbXVzdCBiZSBjbGVhcmVkIG9yIEFja2VkIHRvIHRha2UgYSBGUyBvdXQgb2YgcmVhZG9ubHkKKyAqIG1vZGUuCisgKi8KK3ZvaWQgam91cm5hbF9hY2tfZXJyKGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJaWYgKGpvdXJuYWwtPmpfZXJybm8pCisJCWpvdXJuYWwtPmpfZmxhZ3MgfD0gSkZTX0FDS19FUlI7CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7Cit9CisKK2ludCBqb3VybmFsX2Jsb2Nrc19wZXJfcGFnZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiAxIDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpOworfQorCisvKgorICogU2ltcGxlIHN1cHBvcnQgZm9yIHJldHJ5aW5nIG1lbW9yeSBhbGxvY2F0aW9ucy4gIEludHJvZHVjZWQgdG8gaGVscCB0bworICogZGVidWcgZGlmZmVyZW50IFZNIGRlYWRsb2NrIGF2b2lkYW5jZSBzdHJhdGVnaWVzLiAKKyAqLwordm9pZCAqIF9famJkX2ttYWxsb2MgKGNvbnN0IGNoYXIgKndoZXJlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzLCBpbnQgcmV0cnkpCit7CisJcmV0dXJuIGttYWxsb2Moc2l6ZSwgZmxhZ3MgfCAocmV0cnkgPyBfX0dGUF9OT0ZBSUwgOiAwKSk7Cit9CisKKy8qCisgKiBKb3VybmFsX2hlYWQgc3RvcmFnZSBtYW5hZ2VtZW50CisgKi8KK3N0YXRpYyBrbWVtX2NhY2hlX3QgKmpvdXJuYWxfaGVhZF9jYWNoZTsKKyNpZmRlZiBDT05GSUdfSkJEX0RFQlVHCitzdGF0aWMgYXRvbWljX3QgbnJfam91cm5hbF9oZWFkcyA9IEFUT01JQ19JTklUKDApOworI2VuZGlmCisKK3N0YXRpYyBpbnQgam91cm5hbF9pbml0X2pvdXJuYWxfaGVhZF9jYWNoZSh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlKX0FTU0VSVChqb3VybmFsX2hlYWRfY2FjaGUgPT0gMCk7CisJam91cm5hbF9oZWFkX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImpvdXJuYWxfaGVhZCIsCisJCQkJc2l6ZW9mKHN0cnVjdCBqb3VybmFsX2hlYWQpLAorCQkJCTAsCQkvKiBvZmZzZXQgKi8KKwkJCQkwLAkJLyogZmxhZ3MgKi8KKwkJCQlOVUxMLAkJLyogY3RvciAqLworCQkJCU5VTEwpOwkJLyogZHRvciAqLworCXJldHZhbCA9IDA7CisJaWYgKGpvdXJuYWxfaGVhZF9jYWNoZSA9PSAwKSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCXByaW50ayhLRVJOX0VNRVJHICJKQkQ6IG5vIG1lbW9yeSBmb3Igam91cm5hbF9oZWFkIGNhY2hlXG4iKTsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgam91cm5hbF9kZXN0cm95X2pvdXJuYWxfaGVhZF9jYWNoZSh2b2lkKQoreworCUpfQVNTRVJUKGpvdXJuYWxfaGVhZF9jYWNoZSAhPSBOVUxMKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koam91cm5hbF9oZWFkX2NhY2hlKTsKKwlqb3VybmFsX2hlYWRfY2FjaGUgPSBOVUxMOworfQorCisvKgorICogam91cm5hbF9oZWFkIHNwbGljaW5nIGFuZCBkaWNpbmcKKyAqLworc3RhdGljIHN0cnVjdCBqb3VybmFsX2hlYWQgKmpvdXJuYWxfYWxsb2Nfam91cm5hbF9oZWFkKHZvaWQpCit7CisJc3RydWN0IGpvdXJuYWxfaGVhZCAqcmV0OworCXN0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3Rfd2FybmluZzsKKworI2lmZGVmIENPTkZJR19KQkRfREVCVUcKKwlhdG9taWNfaW5jKCZucl9qb3VybmFsX2hlYWRzKTsKKyNlbmRpZgorCXJldCA9IGttZW1fY2FjaGVfYWxsb2Moam91cm5hbF9oZWFkX2NhY2hlLCBHRlBfTk9GUyk7CisJaWYgKHJldCA9PSAwKSB7CisJCWpiZF9kZWJ1ZygxLCAib3V0IG9mIG1lbW9yeSBmb3Igam91cm5hbF9oZWFkXG4iKTsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgbGFzdF93YXJuaW5nICsgNSpIWikpIHsKKwkJCXByaW50ayhLRVJOX05PVElDRSAiRU5PTUVNIGluICVzLCByZXRyeWluZy5cbiIsCisJCQkgICAgICAgX19GVU5DVElPTl9fKTsKKwkJCWxhc3Rfd2FybmluZyA9IGppZmZpZXM7CisJCX0KKwkJd2hpbGUgKHJldCA9PSAwKSB7CisJCQl5aWVsZCgpOworCQkJcmV0ID0ga21lbV9jYWNoZV9hbGxvYyhqb3VybmFsX2hlYWRfY2FjaGUsIEdGUF9OT0ZTKTsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBqb3VybmFsX2ZyZWVfam91cm5hbF9oZWFkKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKQoreworI2lmZGVmIENPTkZJR19KQkRfREVCVUcKKwlhdG9taWNfZGVjKCZucl9qb3VybmFsX2hlYWRzKTsKKwltZW1zZXQoamgsIDB4NWIsIHNpemVvZigqamgpKTsKKyNlbmRpZgorCWttZW1fY2FjaGVfZnJlZShqb3VybmFsX2hlYWRfY2FjaGUsIGpoKTsKK30KKworLyoKKyAqIEEgam91cm5hbF9oZWFkIGlzIGF0dGFjaGVkIHRvIGEgYnVmZmVyX2hlYWQgd2hlbmV2ZXIgSkJEIGhhcyBhbgorICogaW50ZXJlc3QgaW4gdGhlIGJ1ZmZlci4KKyAqCisgKiBXaGVuZXZlciBhIGJ1ZmZlciBoYXMgYW4gYXR0YWNoZWQgam91cm5hbF9oZWFkLCBpdHMgLT5iX3N0YXRlOkJIX0pCRCBiaXQKKyAqIGlzIHNldC4gIFRoaXMgYml0IGlzIHRlc3RlZCBpbiBjb3JlIGtlcm5lbCBjb2RlIHdoZXJlIHdlIG5lZWQgdG8gdGFrZQorICogSkJELXNwZWNpZmljIGFjdGlvbnMuICBUZXN0aW5nIHRoZSB6ZXJvbmVzcyBvZiAtPmJfcHJpdmF0ZSBpcyBub3QgcmVsaWFibGUKKyAqIHRoZXJlLgorICoKKyAqIFdoZW4gYSBidWZmZXIgaGFzIGl0cyBCSF9KQkQgYml0IHNldCwgaXRzIC0+Yl9jb3VudCBpcyBlbGV2YXRlZCBieSBvbmUuCisgKgorICogV2hlbiBhIGJ1ZmZlciBoYXMgaXRzIEJIX0pCRCBiaXQgc2V0IGl0IGlzIGltbXVuZSBmcm9tIGJlaW5nIHJlbGVhc2VkIGJ5CisgKiBjb3JlIGtlcm5lbCBjb2RlLCBtYWlubHkgdmlhIC0+Yl9jb3VudC4KKyAqCisgKiBBIGpvdXJuYWxfaGVhZCBtYXkgYmUgZGV0YWNoZWQgZnJvbSBpdHMgYnVmZmVyX2hlYWQgd2hlbiB0aGUgam91cm5hbF9oZWFkJ3MKKyAqIGJfdHJhbnNhY3Rpb24sIGJfY3BfdHJhbnNhY3Rpb24gYW5kIGJfbmV4dF90cmFuc2FjdGlvbiBwb2ludGVycyBhcmUgTlVMTC4KKyAqIFZhcmlvdXMgcGxhY2VzIGluIEpCRCBjYWxsIGpvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZCgpIHRvIGluZGljYXRlIHRoYXQgdGhlCisgKiBqb3VybmFsX2hlYWQgY2FuIGJlIGRyb3BwZWQgaWYgbmVlZGVkLgorICoKKyAqIFZhcmlvdXMgcGxhY2VzIGluIHRoZSBrZXJuZWwgd2FudCB0byBhdHRhY2ggYSBqb3VybmFsX2hlYWQgdG8gYSBidWZmZXJfaGVhZAorICogX2JlZm9yZV8gYXR0YWNoaW5nIHRoZSBqb3VybmFsX2hlYWQgdG8gYSB0cmFuc2FjdGlvbi4gIFRvIHByb3RlY3QgdGhlCisgKiBqb3VybmFsX2hlYWQgaW4gdGhpcyBzaXR1YXRpb24sIGpvdXJuYWxfYWRkX2pvdXJuYWxfaGVhZCBlbGV2YXRlcyB0aGUKKyAqIGpvdXJuYWxfaGVhZCdzIGJfamNvdW50IHJlZmNvdW50IGJ5IG9uZS4gIFRoZSBjYWxsZXIgbXVzdCBjYWxsCisgKiBqb3VybmFsX3B1dF9qb3VybmFsX2hlYWQoKSB0byB1bmRvIHRoaXMuCisgKgorICogU28gdGhlIHR5cGljYWwgdXNhZ2Ugd291bGQgYmU6CisgKgorICoJKEF0dGFjaCBhIGpvdXJuYWxfaGVhZCBpZiBuZWVkZWQuICBJbmNyZW1lbnRzIGJfamNvdW50KQorICoJc3RydWN0IGpvdXJuYWxfaGVhZCAqamggPSBqb3VybmFsX2FkZF9qb3VybmFsX2hlYWQoYmgpOworICoJLi4uCisgKglqaC0+Yl90cmFuc2FjdGlvbiA9IHh4eDsKKyAqCWpvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZChqaCk7CisgKgorICogTm93LCB0aGUgam91cm5hbF9oZWFkJ3MgYl9qY291bnQgaXMgemVybywgYnV0IGl0IGlzIHNhZmUgZnJvbSBiZWluZyByZWxlYXNlZAorICogYmVjYXVzZSBpdCBoYXMgYSBub24temVybyBiX3RyYW5zYWN0aW9uLgorICovCisKKy8qCisgKiBHaXZlIGEgYnVmZmVyX2hlYWQgYSBqb3VybmFsX2hlYWQuCisgKgorICogRG9lc24ndCBuZWVkIHRoZSBqb3VybmFsIGxvY2suCisgKiBNYXkgc2xlZXAuCisgKi8KK3N0cnVjdCBqb3VybmFsX2hlYWQgKmpvdXJuYWxfYWRkX2pvdXJuYWxfaGVhZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXN0cnVjdCBqb3VybmFsX2hlYWQgKmpoOworCXN0cnVjdCBqb3VybmFsX2hlYWQgKm5ld19qaCA9IE5VTEw7CisKK3JlcGVhdDoKKwlpZiAoIWJ1ZmZlcl9qYmQoYmgpKSB7CisJCW5ld19qaCA9IGpvdXJuYWxfYWxsb2Nfam91cm5hbF9oZWFkKCk7CisJCW1lbXNldChuZXdfamgsIDAsIHNpemVvZigqbmV3X2poKSk7CisJfQorCisJamJkX2xvY2tfYmhfam91cm5hbF9oZWFkKGJoKTsKKwlpZiAoYnVmZmVyX2piZChiaCkpIHsKKwkJamggPSBiaDJqaChiaCk7CisJfSBlbHNlIHsKKwkJSl9BU1NFUlRfQkgoYmgsCisJCQkoYXRvbWljX3JlYWQoJmJoLT5iX2NvdW50KSA+IDApIHx8CisJCQkoYmgtPmJfcGFnZSAmJiBiaC0+Yl9wYWdlLT5tYXBwaW5nKSk7CisKKwkJaWYgKCFuZXdfamgpIHsKKwkJCWpiZF91bmxvY2tfYmhfam91cm5hbF9oZWFkKGJoKTsKKwkJCWdvdG8gcmVwZWF0OworCQl9CisKKwkJamggPSBuZXdfamg7CisJCW5ld19qaCA9IE5VTEw7CQkvKiBXZSBjb25zdW1lZCBpdCAqLworCQlzZXRfYnVmZmVyX2piZChiaCk7CisJCWJoLT5iX3ByaXZhdGUgPSBqaDsKKwkJamgtPmJfYmggPSBiaDsKKwkJZ2V0X2JoKGJoKTsKKwkJQlVGRkVSX1RSQUNFKGJoLCAiYWRkZWQgam91cm5hbF9oZWFkIik7CisJfQorCWpoLT5iX2pjb3VudCsrOworCWpiZF91bmxvY2tfYmhfam91cm5hbF9oZWFkKGJoKTsKKwlpZiAobmV3X2poKQorCQlqb3VybmFsX2ZyZWVfam91cm5hbF9oZWFkKG5ld19qaCk7CisJcmV0dXJuIGJoLT5iX3ByaXZhdGU7Cit9CisKKy8qCisgKiBHcmFiIGEgcmVmIGFnYWluc3QgdGhpcyBidWZmZXJfaGVhZCdzIGpvdXJuYWxfaGVhZC4gIElmIGl0IGVuZGVkIHVwIG5vdAorICogaGF2aW5nIGEgam91cm5hbF9oZWFkLCByZXR1cm4gTlVMTAorICovCitzdHJ1Y3Qgam91cm5hbF9oZWFkICpqb3VybmFsX2dyYWJfam91cm5hbF9oZWFkKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJc3RydWN0IGpvdXJuYWxfaGVhZCAqamggPSBOVUxMOworCisJamJkX2xvY2tfYmhfam91cm5hbF9oZWFkKGJoKTsKKwlpZiAoYnVmZmVyX2piZChiaCkpIHsKKwkJamggPSBiaDJqaChiaCk7CisJCWpoLT5iX2pjb3VudCsrOworCX0KKwlqYmRfdW5sb2NrX2JoX2pvdXJuYWxfaGVhZChiaCk7CisJcmV0dXJuIGpoOworfQorCitzdGF0aWMgdm9pZCBfX2pvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXN0cnVjdCBqb3VybmFsX2hlYWQgKmpoID0gYmgyamgoYmgpOworCisJSl9BU1NFUlRfSkgoamgsIGpoLT5iX2pjb3VudCA+PSAwKTsKKworCWdldF9iaChiaCk7CisJaWYgKGpoLT5iX2pjb3VudCA9PSAwKSB7CisJCWlmIChqaC0+Yl90cmFuc2FjdGlvbiA9PSBOVUxMICYmCisJCQkJamgtPmJfbmV4dF90cmFuc2FjdGlvbiA9PSBOVUxMICYmCisJCQkJamgtPmJfY3BfdHJhbnNhY3Rpb24gPT0gTlVMTCkgeworCQkJSl9BU1NFUlRfSkgoamgsIGpoLT5iX2psaXN0ID09IEJKX05vbmUpOworCQkJSl9BU1NFUlRfQkgoYmgsIGJ1ZmZlcl9qYmQoYmgpKTsKKwkJCUpfQVNTRVJUX0JIKGJoLCBqaDJiaChqaCkgPT0gYmgpOworCQkJQlVGRkVSX1RSQUNFKGJoLCAicmVtb3ZlIGpvdXJuYWxfaGVhZCIpOworCQkJaWYgKGpoLT5iX2Zyb3plbl9kYXRhKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGZyZWVpbmcgIgorCQkJCQkJImJfZnJvemVuX2RhdGFcbiIsCisJCQkJCQlfX0ZVTkNUSU9OX18pOworCQkJCWtmcmVlKGpoLT5iX2Zyb3plbl9kYXRhKTsKKwkJCX0KKwkJCWlmIChqaC0+Yl9jb21taXR0ZWRfZGF0YSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBmcmVlaW5nICIKKwkJCQkJCSJiX2NvbW1pdHRlZF9kYXRhXG4iLAorCQkJCQkJX19GVU5DVElPTl9fKTsKKwkJCQlrZnJlZShqaC0+Yl9jb21taXR0ZWRfZGF0YSk7CisJCQl9CisJCQliaC0+Yl9wcml2YXRlID0gTlVMTDsKKwkJCWpoLT5iX2JoID0gTlVMTDsJLyogZGVidWcsIHJlYWxseSAqLworCQkJY2xlYXJfYnVmZmVyX2piZChiaCk7CisJCQlfX2JyZWxzZShiaCk7CisJCQlqb3VybmFsX2ZyZWVfam91cm5hbF9oZWFkKGpoKTsKKwkJfSBlbHNlIHsKKwkJCUJVRkZFUl9UUkFDRShiaCwgImpvdXJuYWxfaGVhZCB3YXMgbG9ja2VkIik7CisJCX0KKwl9Cit9CisKKy8qCisgKiBqb3VybmFsX3JlbW92ZV9qb3VybmFsX2hlYWQoKTogaWYgdGhlIGJ1ZmZlciBpc24ndCBhdHRhY2hlZCB0byBhIHRyYW5zYWN0aW9uCisgKiBhbmQgaGFzIGEgemVybyBiX2pjb3VudCB0aGVuIHJlbW92ZSBhbmQgcmVsZWFzZSBpdHMgam91cm5hbF9oZWFkLiAgIElmIHdlIGRpZAorICogc2VlIHRoYXQgdGhlIGJ1ZmZlciBpcyBub3QgdXNlZCBieSBhbnkgdHJhbnNhY3Rpb24gd2UgYWxzbyAibG9naWNhbGx5IgorICogZGVjcmVtZW50IC0+Yl9jb3VudC4KKyAqCisgKiBXZSBpbiBmYWN0IHRha2UgYW4gYWRkaXRpb25hbCBpbmNyZW1lbnQgb24gLT5iX2NvdW50IGFzIGEgY29udmVuaWVuY2UsCisgKiBiZWNhdXNlIHRoZSBjYWxsZXIgdXN1YWxseSB3YW50cyB0byBkbyBhZGRpdGlvbmFsIHRoaW5ncyB3aXRoIHRoZSBiaAorICogYWZ0ZXIgY2FsbGluZyBoZXJlLgorICogVGhlIGNhbGxlciBvZiBqb3VybmFsX3JlbW92ZV9qb3VybmFsX2hlYWQoKSAqbXVzdCogcnVuIF9fYnJlbHNlKGJoKSBhdCBzb21lCisgKiB0aW1lLiAgT25jZSB0aGUgY2FsbGVyIGhhcyBydW4gX19icmVsc2UoKSwgdGhlIGJ1ZmZlciBpcyBlbGlnaWJsZSBmb3IKKyAqIHJlYXBpbmcgYnkgdHJ5X3RvX2ZyZWVfYnVmZmVycygpLgorICovCit2b2lkIGpvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWpiZF9sb2NrX2JoX2pvdXJuYWxfaGVhZChiaCk7CisJX19qb3VybmFsX3JlbW92ZV9qb3VybmFsX2hlYWQoYmgpOworCWpiZF91bmxvY2tfYmhfam91cm5hbF9oZWFkKGJoKTsKK30KKworLyoKKyAqIERyb3AgYSByZWZlcmVuY2Ugb24gdGhlIHBhc3NlZCBqb3VybmFsX2hlYWQuICBJZiBpdCBmZWxsIHRvIHplcm8gdGhlbiB0cnkgdG8KKyAqIHJlbGVhc2UgdGhlIGpvdXJuYWxfaGVhZCBmcm9tIHRoZSBidWZmZXJfaGVhZC4KKyAqLwordm9pZCBqb3VybmFsX3B1dF9qb3VybmFsX2hlYWQoc3RydWN0IGpvdXJuYWxfaGVhZCAqamgpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGpoMmJoKGpoKTsKKworCWpiZF9sb2NrX2JoX2pvdXJuYWxfaGVhZChiaCk7CisJSl9BU1NFUlRfSkgoamgsIGpoLT5iX2pjb3VudCA+IDApOworCS0tamgtPmJfamNvdW50OworCWlmICghamgtPmJfamNvdW50ICYmICFqaC0+Yl90cmFuc2FjdGlvbikgeworCQlfX2pvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZChiaCk7CisJCV9fYnJlbHNlKGJoKTsKKwl9CisJamJkX3VubG9ja19iaF9qb3VybmFsX2hlYWQoYmgpOworfQorCisvKgorICogL3Byb2MgdHVuYWJsZXMKKyAqLworI2lmIGRlZmluZWQoQ09ORklHX0pCRF9ERUJVRykKK2ludCBqb3VybmFsX2VuYWJsZV9kZWJ1ZzsKK0VYUE9SVF9TWU1CT0woam91cm5hbF9lbmFibGVfZGVidWcpOworI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19KQkRfREVCVUcpICYmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpCisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfamJkX2RlYnVnOworCitpbnQgcmVhZF9qYmRfZGVidWcoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCQkgIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaW50IHJldDsKKworCXJldCA9IHNwcmludGYocGFnZSArIG9mZiwgIiVkXG4iLCBqb3VybmFsX2VuYWJsZV9kZWJ1Zyk7CisJKmVvZiA9IDE7CisJcmV0dXJuIHJldDsKK30KKworaW50IHdyaXRlX2piZF9kZWJ1ZyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCit7CisJY2hhciBidWZbMzJdOworCisJaWYgKGNvdW50ID4gQVJSQVlfU0laRShidWYpIC0gMSkKKwkJY291bnQgPSBBUlJBWV9TSVpFKGJ1ZikgLSAxOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlidWZbQVJSQVlfU0laRShidWYpIC0gMV0gPSAnXDAnOworCWpvdXJuYWxfZW5hYmxlX2RlYnVnID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJcmV0dXJuIGNvdW50OworfQorCisjZGVmaW5lIEpCRF9QUk9DX05BTUUgInN5cy9mcy9qYmQtZGVidWciCisKK3N0YXRpYyB2b2lkIF9faW5pdCBjcmVhdGVfamJkX3Byb2NfZW50cnkodm9pZCkKK3sKKwlwcm9jX2piZF9kZWJ1ZyA9IGNyZWF0ZV9wcm9jX2VudHJ5KEpCRF9QUk9DX05BTUUsIDA2NDQsIE5VTEwpOworCWlmIChwcm9jX2piZF9kZWJ1ZykgeworCQkvKiBXaHkgaXMgdGhpcyBzbyBoYXJkPyAqLworCQlwcm9jX2piZF9kZWJ1Zy0+cmVhZF9wcm9jID0gcmVhZF9qYmRfZGVidWc7CisJCXByb2NfamJkX2RlYnVnLT53cml0ZV9wcm9jID0gd3JpdGVfamJkX2RlYnVnOworCX0KK30KKworc3RhdGljIHZvaWQgX19leGl0IHJlbW92ZV9qYmRfcHJvY19lbnRyeSh2b2lkKQoreworCWlmIChwcm9jX2piZF9kZWJ1ZykKKwkJcmVtb3ZlX3Byb2NfZW50cnkoSkJEX1BST0NfTkFNRSwgTlVMTCk7Cit9CisKKyNlbHNlCisKKyNkZWZpbmUgY3JlYXRlX2piZF9wcm9jX2VudHJ5KCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIHJlbW92ZV9qYmRfcHJvY19lbnRyeSgpIGRvIHt9IHdoaWxlICgwKQorCisjZW5kaWYKKwora21lbV9jYWNoZV90ICpqYmRfaGFuZGxlX2NhY2hlOworCitzdGF0aWMgaW50IF9faW5pdCBqb3VybmFsX2luaXRfaGFuZGxlX2NhY2hlKHZvaWQpCit7CisJamJkX2hhbmRsZV9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJqb3VybmFsX2hhbmRsZSIsCisJCQkJc2l6ZW9mKGhhbmRsZV90KSwKKwkJCQkwLAkJLyogb2Zmc2V0ICovCisJCQkJMCwJCS8qIGZsYWdzICovCisJCQkJTlVMTCwJCS8qIGN0b3IgKi8KKwkJCQlOVUxMKTsJCS8qIGR0b3IgKi8KKwlpZiAoamJkX2hhbmRsZV9jYWNoZSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VNRVJHICJKQkQ6IGZhaWxlZCB0byBjcmVhdGUgaGFuZGxlIGNhY2hlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBqb3VybmFsX2Rlc3Ryb3lfaGFuZGxlX2NhY2hlKHZvaWQpCit7CisJaWYgKGpiZF9oYW5kbGVfY2FjaGUpCisJCWttZW1fY2FjaGVfZGVzdHJveShqYmRfaGFuZGxlX2NhY2hlKTsKK30KKworLyoKKyAqIE1vZHVsZSBzdGFydHVwIGFuZCBzaHV0ZG93bgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IGpvdXJuYWxfaW5pdF9jYWNoZXModm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gam91cm5hbF9pbml0X3Jldm9rZV9jYWNoZXMoKTsKKwlpZiAocmV0ID09IDApCisJCXJldCA9IGpvdXJuYWxfaW5pdF9qb3VybmFsX2hlYWRfY2FjaGUoKTsKKwlpZiAocmV0ID09IDApCisJCXJldCA9IGpvdXJuYWxfaW5pdF9oYW5kbGVfY2FjaGUoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBqb3VybmFsX2Rlc3Ryb3lfY2FjaGVzKHZvaWQpCit7CisJam91cm5hbF9kZXN0cm95X3Jldm9rZV9jYWNoZXMoKTsKKwlqb3VybmFsX2Rlc3Ryb3lfam91cm5hbF9oZWFkX2NhY2hlKCk7CisJam91cm5hbF9kZXN0cm95X2hhbmRsZV9jYWNoZSgpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBqb3VybmFsX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gam91cm5hbF9pbml0X2NhY2hlcygpOworCWlmIChyZXQgIT0gMCkKKwkJam91cm5hbF9kZXN0cm95X2NhY2hlcygpOworCWNyZWF0ZV9qYmRfcHJvY19lbnRyeSgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBqb3VybmFsX2V4aXQodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfSkJEX0RFQlVHCisJaW50IG4gPSBhdG9taWNfcmVhZCgmbnJfam91cm5hbF9oZWFkcyk7CisJaWYgKG4pCisJCXByaW50ayhLRVJOX0VNRVJHICJKQkQ6IGxlYWtlZCAlZCBqb3VybmFsX2hlYWRzIVxuIiwgbik7CisjZW5kaWYKKwlyZW1vdmVfamJkX3Byb2NfZW50cnkoKTsKKwlqb3VybmFsX2Rlc3Ryb3lfY2FjaGVzKCk7Cit9CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK21vZHVsZV9pbml0KGpvdXJuYWxfaW5pdCk7Cittb2R1bGVfZXhpdChqb3VybmFsX2V4aXQpOworCmRpZmYgLS1naXQgYS9mcy9qYmQvcmVjb3ZlcnkuYyBiL2ZzL2piZC9yZWNvdmVyeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwM2MzNGUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qYmQvcmVjb3ZlcnkuYwpAQCAtMCwwICsxLDU5MSBAQAorLyoKKyAqIGxpbnV4L2ZzL3JlY292ZXJ5LmMKKyAqIAorICogV3JpdHRlbiBieSBTdGVwaGVuIEMuIFR3ZWVkaWUgPHNjdEByZWRoYXQuY29tPiwgMTk5OQorICoKKyAqIENvcHlyaWdodCAxOTk5LTIwMDAgUmVkIEhhdCBTb2Z0d2FyZSAtLS0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIG9yIGF0IHlvdXIKKyAqIG9wdGlvbiwgYW55IGxhdGVyIHZlcnNpb24sIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIEpvdXJuYWwgcmVjb3Zlcnkgcm91dGluZXMgZm9yIHRoZSBnZW5lcmljIGZpbGVzeXN0ZW0gam91cm5hbGluZyBjb2RlOworICogcGFydCBvZiB0aGUgZXh0MmZzIGpvdXJuYWxpbmcgc3lzdGVtLiAgCisgKi8KKworI2lmbmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSAiamZzX3VzZXIuaCIKKyNlbHNlCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvamJkLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjZW5kaWYKKworLyoKKyAqIE1haW50YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9ncmVzcyBvZiB0aGUgcmVjb3Zlcnkgam9iLCBzbyB0aGF0CisgKiB0aGUgZGlmZmVyZW50IHBhc3NlcyBjYW4gY2FycnkgaW5mb3JtYXRpb24gYmV0d2VlbiB0aGVtLiAKKyAqLworc3RydWN0IHJlY292ZXJ5X2luZm8gCit7CisJdGlkX3QJCXN0YXJ0X3RyYW5zYWN0aW9uOworCXRpZF90CQllbmRfdHJhbnNhY3Rpb247CisKKwlpbnQJCW5yX3JlcGxheXM7CisJaW50CQlucl9yZXZva2VzOworCWludAkJbnJfcmV2b2tlX2hpdHM7Cit9OworCitlbnVtIHBhc3N0eXBlIHtQQVNTX1NDQU4sIFBBU1NfUkVWT0tFLCBQQVNTX1JFUExBWX07CitzdGF0aWMgaW50IGRvX29uZV9wYXNzKGpvdXJuYWxfdCAqam91cm5hbCwKKwkJCQlzdHJ1Y3QgcmVjb3ZlcnlfaW5mbyAqaW5mbywgZW51bSBwYXNzdHlwZSBwYXNzKTsKK3N0YXRpYyBpbnQgc2Nhbl9yZXZva2VfcmVjb3Jkcyhqb3VybmFsX3QgKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICosCisJCQkJdGlkX3QsIHN0cnVjdCByZWNvdmVyeV9pbmZvICopOworCisjaWZkZWYgX19LRVJORUxfXworCisvKiBSZWxlYXNlIHJlYWRhaGVhZCBidWZmZXJzIGFmdGVyIHVzZSAqLwordm9pZCBqb3VybmFsX2JyZWxzZV9hcnJheShzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJbXSwgaW50IG4pCit7CisJd2hpbGUgKC0tbiA+PSAwKQorCQlicmVsc2UgKGJbbl0pOworfQorCisKKy8qCisgKiBXaGVuIHJlYWRpbmcgZnJvbSB0aGUgam91cm5hbCwgd2UgYXJlIGdvaW5nIHRocm91Z2ggdGhlIGJsb2NrIGRldmljZQorICogbGF5ZXIgZGlyZWN0bHkgYW5kIHNvIHRoZXJlIGlzIG5vIHJlYWRhaGVhZCBiZWluZyBkb25lIGZvciB1cy4gIFdlCisgKiBuZWVkIHRvIGltcGxlbWVudCBhbnkgcmVhZGFoZWFkIG91cnNlbHZlcyBpZiB3ZSB3YW50IGl0IHRvIGhhcHBlbiBhdAorICogYWxsLiAgUmVjb3ZlcnkgaXMgYmFzaWNhbGx5IG9uZSBsb25nIHNlcXVlbnRpYWwgcmVhZCwgc28gbWFrZSBzdXJlIHdlCisgKiBkbyB0aGUgSU8gaW4gcmVhc29uYWJseSBsYXJnZSBjaHVua3MuCisgKgorICogVGhpcyBpcyBub3Qgc28gY3JpdGljYWwgdGhhdCB3ZSBuZWVkIHRvIGJlIGVub3Jtb3VzbHkgY2xldmVyIGFib3V0CisgKiB0aGUgcmVhZGFoZWFkIHNpemUsIHRob3VnaC4gIDEyOEsgaXMgYSBwdXJlbHkgYXJiaXRyYXJ5LCBnb29kLWVub3VnaAorICogZml4ZWQgdmFsdWUuCisgKi8KKworI2RlZmluZSBNQVhCVUYgOAorc3RhdGljIGludCBkb19yZWFkYWhlYWQoam91cm5hbF90ICpqb3VybmFsLCB1bnNpZ25lZCBpbnQgc3RhcnQpCit7CisJaW50IGVycjsKKwl1bnNpZ25lZCBpbnQgbWF4LCBuYnVmcywgbmV4dDsKKwl1bnNpZ25lZCBsb25nIGJsb2NrbnI7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJ1ZnNbTUFYQlVGXTsKKworCS8qIERvIHVwIHRvIDEyOEsgb2YgcmVhZGFoZWFkICovCisJbWF4ID0gc3RhcnQgKyAoMTI4ICogMTAyNCAvIGpvdXJuYWwtPmpfYmxvY2tzaXplKTsKKwlpZiAobWF4ID4gam91cm5hbC0+al9tYXhsZW4pCisJCW1heCA9IGpvdXJuYWwtPmpfbWF4bGVuOworCisJLyogRG8gdGhlIHJlYWRhaGVhZCBpdHNlbGYuICBXZSdsbCBzdWJtaXQgTUFYQlVGIGJ1ZmZlcl9oZWFkcyBhdAorCSAqIGEgdGltZSB0byB0aGUgYmxvY2sgZGV2aWNlIElPIGxheWVyLiAqLworCisJbmJ1ZnMgPSAwOworCisJZm9yIChuZXh0ID0gc3RhcnQ7IG5leHQgPCBtYXg7IG5leHQrKykgeworCQllcnIgPSBqb3VybmFsX2JtYXAoam91cm5hbCwgbmV4dCwgJmJsb2NrbnIpOworCisJCWlmIChlcnIpIHsKKwkJCXByaW50ayAoS0VSTl9FUlIgIkpCRDogYmFkIGJsb2NrIGF0IG9mZnNldCAldVxuIiwKKwkJCQluZXh0KTsKKwkJCWdvdG8gZmFpbGVkOworCQl9CisKKwkJYmggPSBfX2dldGJsayhqb3VybmFsLT5qX2RldiwgYmxvY2tuciwgam91cm5hbC0+al9ibG9ja3NpemUpOworCQlpZiAoIWJoKSB7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBmYWlsZWQ7CisJCX0KKworCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkgJiYgIWJ1ZmZlcl9sb2NrZWQoYmgpKSB7CisJCQlidWZzW25idWZzKytdID0gYmg7CisJCQlpZiAobmJ1ZnMgPT0gTUFYQlVGKSB7CisJCQkJbGxfcndfYmxvY2soUkVBRCwgbmJ1ZnMsIGJ1ZnMpOworCQkJCWpvdXJuYWxfYnJlbHNlX2FycmF5KGJ1ZnMsIG5idWZzKTsKKwkJCQluYnVmcyA9IDA7CisJCQl9CisJCX0gZWxzZQorCQkJYnJlbHNlKGJoKTsKKwl9CisKKwlpZiAobmJ1ZnMpCisJCWxsX3J3X2Jsb2NrKFJFQUQsIG5idWZzLCBidWZzKTsKKwllcnIgPSAwOworCitmYWlsZWQ6CisJaWYgKG5idWZzKSAKKwkJam91cm5hbF9icmVsc2VfYXJyYXkoYnVmcywgbmJ1ZnMpOworCXJldHVybiBlcnI7Cit9CisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKworLyoKKyAqIFJlYWQgYSBibG9jayBmcm9tIHRoZSBqb3VybmFsCisgKi8KKworc3RhdGljIGludCBqcmVhZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaHAsIGpvdXJuYWxfdCAqam91cm5hbCwgCisJCSB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCWludCBlcnI7CisJdW5zaWduZWQgbG9uZyBibG9ja25yOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwkqYmhwID0gTlVMTDsKKworCWlmIChvZmZzZXQgPj0gam91cm5hbC0+al9tYXhsZW4pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJKQkQ6IGNvcnJ1cHRlZCBqb3VybmFsIHN1cGVyYmxvY2tcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwllcnIgPSBqb3VybmFsX2JtYXAoam91cm5hbCwgb2Zmc2V0LCAmYmxvY2tucik7CisKKwlpZiAoZXJyKSB7CisJCXByaW50ayAoS0VSTl9FUlIgIkpCRDogYmFkIGJsb2NrIGF0IG9mZnNldCAldVxuIiwKKwkJCW9mZnNldCk7CisJCXJldHVybiBlcnI7CisJfQorCisJYmggPSBfX2dldGJsayhqb3VybmFsLT5qX2RldiwgYmxvY2tuciwgam91cm5hbC0+al9ibG9ja3NpemUpOworCWlmICghYmgpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKSB7CisJCS8qIElmIHRoaXMgaXMgYSBicmFuZCBuZXcgYnVmZmVyLCBzdGFydCByZWFkYWhlYWQuCisgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB3ZSBhc3N1bWUgd2UgYXJlIGFscmVhZHkgcmVhZGluZyBpdC4gICovCisJCWlmICghYnVmZmVyX3JlcShiaCkpCisJCQlkb19yZWFkYWhlYWQoam91cm5hbCwgb2Zmc2V0KTsKKwkJd2FpdF9vbl9idWZmZXIoYmgpOworCX0KKworCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQlwcmludGsgKEtFUk5fRVJSICJKQkQ6IEZhaWxlZCB0byByZWFkIGJsb2NrIGF0IG9mZnNldCAldVxuIiwKKwkJCW9mZnNldCk7CisJCWJyZWxzZShiaCk7CisJCXJldHVybiAtRUlPOworCX0KKworCSpiaHAgPSBiaDsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogQ291bnQgdGhlIG51bWJlciBvZiBpbi11c2UgdGFncyBpbiBhIGpvdXJuYWwgZGVzY3JpcHRvciBibG9jay4KKyAqLworCitzdGF0aWMgaW50IGNvdW50X3RhZ3Moc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHNpemUpCit7CisJY2hhciAqCQkJdGFncDsKKwlqb3VybmFsX2Jsb2NrX3RhZ190ICoJdGFnOworCWludAkJCW5yID0gMDsKKworCXRhZ3AgPSAmYmgtPmJfZGF0YVtzaXplb2Yoam91cm5hbF9oZWFkZXJfdCldOworCisJd2hpbGUgKCh0YWdwIC0gYmgtPmJfZGF0YSArIHNpemVvZihqb3VybmFsX2Jsb2NrX3RhZ190KSkgPD0gc2l6ZSkgeworCQl0YWcgPSAoam91cm5hbF9ibG9ja190YWdfdCAqKSB0YWdwOworCisJCW5yKys7CisJCXRhZ3AgKz0gc2l6ZW9mKGpvdXJuYWxfYmxvY2tfdGFnX3QpOworCQlpZiAoISh0YWctPnRfZmxhZ3MgJiBjcHVfdG9fYmUzMihKRlNfRkxBR19TQU1FX1VVSUQpKSkKKwkJCXRhZ3AgKz0gMTY7CisKKwkJaWYgKHRhZy0+dF9mbGFncyAmIGNwdV90b19iZTMyKEpGU19GTEFHX0xBU1RfVEFHKSkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBucjsKK30KKworCisvKiBNYWtlIHN1cmUgd2Ugd3JhcCBhcm91bmQgdGhlIGxvZyBjb3JyZWN0bHkhICovCisjZGVmaW5lIHdyYXAoam91cm5hbCwgdmFyKQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJaWYgKHZhciA+PSAoam91cm5hbCktPmpfbGFzdCkJCQkJCVwKKwkJdmFyIC09ICgoam91cm5hbCktPmpfbGFzdCAtIChqb3VybmFsKS0+al9maXJzdCk7CVwKK30gd2hpbGUgKDApCisKKy8qKgorICogaW50IGpvdXJuYWxfcmVjb3Zlcihqb3VybmFsX3QgKmpvdXJuYWwpIC0gcmVjb3ZlcnMgYSBvbi1kaXNrIGpvdXJuYWwKKyAqIEBqb3VybmFsOiB0aGUgam91cm5hbCB0byByZWNvdmVyCisgKiAKKyAqIFRoZSBwcmltYXJ5IGZ1bmN0aW9uIGZvciByZWNvdmVyaW5nIHRoZSBsb2cgY29udGVudHMgd2hlbiBtb3VudGluZyBhCisgKiBqb3VybmFsZWQgZGV2aWNlLiAgCisgKgorICogUmVjb3ZlcnkgaXMgZG9uZSBpbiB0aHJlZSBwYXNzZXMuICBJbiB0aGUgZmlyc3QgcGFzcywgd2UgbG9vayBmb3IgdGhlCisgKiBlbmQgb2YgdGhlIGxvZy4gIEluIHRoZSBzZWNvbmQsIHdlIGFzc2VtYmxlIHRoZSBsaXN0IG9mIHJldm9rZQorICogYmxvY2tzLiAgSW4gdGhlIHRoaXJkIGFuZCBmaW5hbCBwYXNzLCB3ZSByZXBsYXkgYW55IHVuLXJldm9rZWQgYmxvY2tzCisgKiBpbiB0aGUgbG9nLiAgCisgKi8KK2ludCBqb3VybmFsX3JlY292ZXIoam91cm5hbF90ICpqb3VybmFsKQoreworCWludAkJCWVycjsKKwlqb3VybmFsX3N1cGVyYmxvY2tfdCAqCXNiOworCisJc3RydWN0IHJlY292ZXJ5X2luZm8JaW5mbzsKKworCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKKwlzYiA9IGpvdXJuYWwtPmpfc3VwZXJibG9jazsKKworCS8qIAorCSAqIFRoZSBqb3VybmFsIHN1cGVyYmxvY2sncyBzX3N0YXJ0IGZpZWxkICh0aGUgY3VycmVudCBsb2cgaGVhZCkKKwkgKiBpcyBhbHdheXMgemVybyBpZiwgYW5kIG9ubHkgaWYsIHRoZSBqb3VybmFsIHdhcyBjbGVhbmx5CisJICogdW5tb3VudGVkLiAgCisJICovCisKKwlpZiAoIXNiLT5zX3N0YXJ0KSB7CisJCWpiZF9kZWJ1ZygxLCAiTm8gcmVjb3ZlcnkgcmVxdWlyZWQsIGxhc3QgdHJhbnNhY3Rpb24gJWRcbiIsCisJCQkgIGJlMzJfdG9fY3B1KHNiLT5zX3NlcXVlbmNlKSk7CisJCWpvdXJuYWwtPmpfdHJhbnNhY3Rpb25fc2VxdWVuY2UgPSBiZTMyX3RvX2NwdShzYi0+c19zZXF1ZW5jZSkgKyAxOworCQlyZXR1cm4gMDsKKwl9CisKKwllcnIgPSBkb19vbmVfcGFzcyhqb3VybmFsLCAmaW5mbywgUEFTU19TQ0FOKTsKKwlpZiAoIWVycikKKwkJZXJyID0gZG9fb25lX3Bhc3Moam91cm5hbCwgJmluZm8sIFBBU1NfUkVWT0tFKTsKKwlpZiAoIWVycikKKwkJZXJyID0gZG9fb25lX3Bhc3Moam91cm5hbCwgJmluZm8sIFBBU1NfUkVQTEFZKTsKKworCWpiZF9kZWJ1ZygwLCAiSkJEOiByZWNvdmVyeSwgZXhpdCBzdGF0dXMgJWQsICIKKwkJICAicmVjb3ZlcmVkIHRyYW5zYWN0aW9ucyAldSB0byAldVxuIiwKKwkJICBlcnIsIGluZm8uc3RhcnRfdHJhbnNhY3Rpb24sIGluZm8uZW5kX3RyYW5zYWN0aW9uKTsKKwlqYmRfZGVidWcoMCwgIkpCRDogUmVwbGF5ZWQgJWQgYW5kIHJldm9rZWQgJWQvJWQgYmxvY2tzXG4iLCAKKwkJICBpbmZvLm5yX3JlcGxheXMsIGluZm8ubnJfcmV2b2tlX2hpdHMsIGluZm8ubnJfcmV2b2tlcyk7CisKKwkvKiBSZXN0YXJ0IHRoZSBsb2cgYXQgdGhlIG5leHQgdHJhbnNhY3Rpb24gSUQsIHRodXMgaW52YWxpZGF0aW5nCisJICogYW55IGV4aXN0aW5nIGNvbW1pdCByZWNvcmRzIGluIHRoZSBsb2cuICovCisJam91cm5hbC0+al90cmFuc2FjdGlvbl9zZXF1ZW5jZSA9ICsraW5mby5lbmRfdHJhbnNhY3Rpb247CisKKwlqb3VybmFsX2NsZWFyX3Jldm9rZShqb3VybmFsKTsKKwlzeW5jX2Jsb2NrZGV2KGpvdXJuYWwtPmpfZnNfZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIGludCBqb3VybmFsX3NraXBfcmVjb3ZlcnkoKSAtIFN0YXJ0IGpvdXJuYWwgYW5kIHdpcGUgZXhpdGluZyByZWNvcmRzIAorICogQGpvdXJuYWw6IGpvdXJuYWwgdG8gc3RhcnR1cAorICogCisgKiBMb2NhdGUgYW55IHZhbGlkIHJlY292ZXJ5IGluZm9ybWF0aW9uIGZyb20gdGhlIGpvdXJuYWwgYW5kIHNldCB1cCB0aGUKKyAqIGpvdXJuYWwgc3RydWN0dXJlcyBpbiBtZW1vcnkgdG8gaWdub3JlIGl0IChwcmVzdW1hYmx5IGJlY2F1c2UgdGhlCisgKiBjYWxsZXIgaGFzIGV2aWRlbmNlIHRoYXQgaXQgaXMgb3V0IG9mIGRhdGUpLiAgCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMnbnQgYXBwZWFyIHRvIGJlIGV4b3J0ZWQuLgorICoKKyAqIFdlIHBlcmZvcm0gb25lIHBhc3Mgb3ZlciB0aGUgam91cm5hbCB0byBhbGxvdyB1cyB0byB0ZWxsIHRoZSB1c2VyIGhvdworICogbXVjaCByZWNvdmVyeSBpbmZvcm1hdGlvbiBpcyBiZWluZyBlcmFzZWQsIGFuZCB0byBsZXQgdXMgaW5pdGlhbGlzZQorICogdGhlIGpvdXJuYWwgdHJhbnNhY3Rpb24gc2VxdWVuY2UgbnVtYmVycyB0byB0aGUgbmV4dCB1bnVzZWQgSUQuIAorICovCitpbnQgam91cm5hbF9za2lwX3JlY292ZXJ5KGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwlpbnQJCQllcnI7CisJam91cm5hbF9zdXBlcmJsb2NrX3QgKglzYjsKKworCXN0cnVjdCByZWNvdmVyeV9pbmZvCWluZm87CisKKwltZW1zZXQgKCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworCXNiID0gam91cm5hbC0+al9zdXBlcmJsb2NrOworCisJZXJyID0gZG9fb25lX3Bhc3Moam91cm5hbCwgJmluZm8sIFBBU1NfU0NBTik7CisKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSkJEOiBlcnJvciAlZCBzY2FubmluZyBqb3VybmFsXG4iLCBlcnIpOworCQkrK2pvdXJuYWwtPmpfdHJhbnNhY3Rpb25fc2VxdWVuY2U7CisJfSBlbHNlIHsKKyNpZmRlZiBDT05GSUdfSkJEX0RFQlVHCisJCWludCBkcm9wcGVkID0gaW5mby5lbmRfdHJhbnNhY3Rpb24gLSBiZTMyX3RvX2NwdShzYi0+c19zZXF1ZW5jZSk7CisjZW5kaWYKKwkJamJkX2RlYnVnKDAsIAorCQkJICAiSkJEOiBpZ25vcmluZyAlZCB0cmFuc2FjdGlvbiVzIGZyb20gdGhlIGpvdXJuYWwuXG4iLAorCQkJICBkcm9wcGVkLCAoZHJvcHBlZCA9PSAxKSA/ICIiIDogInMiKTsKKwkJam91cm5hbC0+al90cmFuc2FjdGlvbl9zZXF1ZW5jZSA9ICsraW5mby5lbmRfdHJhbnNhY3Rpb247CisJfQorCisJam91cm5hbC0+al90YWlsID0gMDsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGRvX29uZV9wYXNzKGpvdXJuYWxfdCAqam91cm5hbCwKKwkJCXN0cnVjdCByZWNvdmVyeV9pbmZvICppbmZvLCBlbnVtIHBhc3N0eXBlIHBhc3MpCit7CisJdW5zaWduZWQgaW50CQlmaXJzdF9jb21taXRfSUQsIG5leHRfY29tbWl0X0lEOworCXVuc2lnbmVkIGxvbmcJCW5leHRfbG9nX2Jsb2NrOworCWludAkJCWVyciwgc3VjY2VzcyA9IDA7CisJam91cm5hbF9zdXBlcmJsb2NrX3QgKglzYjsKKwlqb3VybmFsX2hlYWRlcl90ICogCXRtcDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKgliaDsKKwl1bnNpZ25lZCBpbnQJCXNlcXVlbmNlOworCWludAkJCWJsb2NrdHlwZTsKKworCS8qIFByZWNvbXB1dGUgdGhlIG1heGltdW0gbWV0YWRhdGEgZGVzY3JpcHRvcnMgaW4gYSBkZXNjcmlwdG9yIGJsb2NrICovCisJaW50CQkJTUFYX0JMT0NLU19QRVJfREVTQzsKKwlNQVhfQkxPQ0tTX1BFUl9ERVNDID0gKChqb3VybmFsLT5qX2Jsb2Nrc2l6ZS1zaXplb2Yoam91cm5hbF9oZWFkZXJfdCkpCisJCQkgICAgICAgLyBzaXplb2Yoam91cm5hbF9ibG9ja190YWdfdCkpOworCisJLyogCisJICogRmlyc3QgdGhpbmcgaXMgdG8gZXN0YWJsaXNoIHdoYXQgd2UgZXhwZWN0IHRvIGZpbmQgaW4gdGhlIGxvZworCSAqIChpbiB0ZXJtcyBvZiB0cmFuc2FjdGlvbiBJRHMpLCBhbmQgd2hlcmUgKGluIHRlcm1zIG9mIGxvZworCSAqIGJsb2NrIG9mZnNldHMpOiBxdWVyeSB0aGUgc3VwZXJibG9jay4gIAorCSAqLworCisJc2IgPSBqb3VybmFsLT5qX3N1cGVyYmxvY2s7CisJbmV4dF9jb21taXRfSUQgPSBiZTMyX3RvX2NwdShzYi0+c19zZXF1ZW5jZSk7CisJbmV4dF9sb2dfYmxvY2sgPSBiZTMyX3RvX2NwdShzYi0+c19zdGFydCk7CisKKwlmaXJzdF9jb21taXRfSUQgPSBuZXh0X2NvbW1pdF9JRDsKKwlpZiAocGFzcyA9PSBQQVNTX1NDQU4pCisJCWluZm8tPnN0YXJ0X3RyYW5zYWN0aW9uID0gZmlyc3RfY29tbWl0X0lEOworCisJamJkX2RlYnVnKDEsICJTdGFydGluZyByZWNvdmVyeSBwYXNzICVkXG4iLCBwYXNzKTsKKworCS8qCisJICogTm93IHdlIHdhbGsgdGhyb3VnaCB0aGUgbG9nLCB0cmFuc2FjdGlvbiBieSB0cmFuc2FjdGlvbiwKKwkgKiBtYWtpbmcgc3VyZSB0aGF0IGVhY2ggdHJhbnNhY3Rpb24gaGFzIGEgY29tbWl0IGJsb2NrIGluIHRoZQorCSAqIGV4cGVjdGVkIHBsYWNlLiAgRWFjaCBjb21wbGV0ZSB0cmFuc2FjdGlvbiBnZXRzIHJlcGxheWVkIGJhY2sKKwkgKiBpbnRvIHRoZSBtYWluIGZpbGVzeXN0ZW0uIAorCSAqLworCisJd2hpbGUgKDEpIHsKKwkJaW50CQkJZmxhZ3M7CisJCWNoYXIgKgkJCXRhZ3A7CisJCWpvdXJuYWxfYmxvY2tfdGFnX3QgKgl0YWc7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqCW9iaDsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICoJbmJoOworCisJCWNvbmRfcmVzY2hlZCgpOwkJLyogV2UncmUgdW5kZXIgbG9ja19rZXJuZWwoKSAqLworCisJCS8qIElmIHdlIGFscmVhZHkga25vdyB3aGVyZSB0byBzdG9wIHRoZSBsb2cgdHJhdmVyc2FsLAorCQkgKiBjaGVjayByaWdodCBub3cgdGhhdCB3ZSBoYXZlbid0IGdvbmUgcGFzdCB0aGUgZW5kIG9mCisJCSAqIHRoZSBsb2cuICovCisKKwkJaWYgKHBhc3MgIT0gUEFTU19TQ0FOKQorCQkJaWYgKHRpZF9nZXEobmV4dF9jb21taXRfSUQsIGluZm8tPmVuZF90cmFuc2FjdGlvbikpCisJCQkJYnJlYWs7CisKKwkJamJkX2RlYnVnKDIsICJTY2FubmluZyBmb3Igc2VxdWVuY2UgSUQgJXUgYXQgJWx1LyVsdVxuIiwKKwkJCSAgbmV4dF9jb21taXRfSUQsIG5leHRfbG9nX2Jsb2NrLCBqb3VybmFsLT5qX2xhc3QpOworCisJCS8qIFNraXAgb3ZlciBlYWNoIGNodW5rIG9mIHRoZSB0cmFuc2FjdGlvbiBsb29raW5nCisJCSAqIGVpdGhlciB0aGUgbmV4dCBkZXNjcmlwdG9yIGJsb2NrIG9yIHRoZSBmaW5hbCBjb21taXQKKwkJICogcmVjb3JkLiAqLworCisJCWpiZF9kZWJ1ZygzLCAiSkJEOiBjaGVja2luZyBibG9jayAlbGRcbiIsIG5leHRfbG9nX2Jsb2NrKTsKKwkJZXJyID0ganJlYWQoJmJoLCBqb3VybmFsLCBuZXh0X2xvZ19ibG9jayk7CisJCWlmIChlcnIpCisJCQlnb3RvIGZhaWxlZDsKKworCQluZXh0X2xvZ19ibG9jaysrOworCQl3cmFwKGpvdXJuYWwsIG5leHRfbG9nX2Jsb2NrKTsKKworCQkvKiBXaGF0IGtpbmQgb2YgYnVmZmVyIGlzIGl0PyAKKwkJICogCisJCSAqIElmIGl0IGlzIGEgZGVzY3JpcHRvciBibG9jaywgY2hlY2sgdGhhdCBpdCBoYXMgdGhlCisJCSAqIGV4cGVjdGVkIHNlcXVlbmNlIG51bWJlci4gIE90aGVyd2lzZSwgd2UncmUgYWxsIGRvbmUKKwkJICogaGVyZS4gKi8KKworCQl0bXAgPSAoam91cm5hbF9oZWFkZXJfdCAqKWJoLT5iX2RhdGE7CisKKwkJaWYgKHRtcC0+aF9tYWdpYyAhPSBjcHVfdG9fYmUzMihKRlNfTUFHSUNfTlVNQkVSKSkgeworCQkJYnJlbHNlKGJoKTsKKwkJCWJyZWFrOworCQl9CisKKwkJYmxvY2t0eXBlID0gYmUzMl90b19jcHUodG1wLT5oX2Jsb2NrdHlwZSk7CisJCXNlcXVlbmNlID0gYmUzMl90b19jcHUodG1wLT5oX3NlcXVlbmNlKTsKKwkJamJkX2RlYnVnKDMsICJGb3VuZCBtYWdpYyAlZCwgc2VxdWVuY2UgJWRcbiIsIAorCQkJICBibG9ja3R5cGUsIHNlcXVlbmNlKTsKKworCQlpZiAoc2VxdWVuY2UgIT0gbmV4dF9jb21taXRfSUQpIHsKKwkJCWJyZWxzZShiaCk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIE9LLCB3ZSBoYXZlIGEgdmFsaWQgZGVzY3JpcHRvciBibG9jayB3aGljaCBtYXRjaGVzCisJCSAqIGFsbCBvZiB0aGUgc2VxdWVuY2UgbnVtYmVyIGNoZWNrcy4gIFdoYXQgYXJlIHdlIGdvaW5nCisJCSAqIHRvIGRvIHdpdGggaXQ/ICBUaGF0IGRlcGVuZHMgb24gdGhlIHBhc3MuLi4gKi8KKworCQlzd2l0Y2goYmxvY2t0eXBlKSB7CisJCWNhc2UgSkZTX0RFU0NSSVBUT1JfQkxPQ0s6CisJCQkvKiBJZiBpdCBpcyBhIHZhbGlkIGRlc2NyaXB0b3IgYmxvY2ssIHJlcGxheSBpdAorCQkJICogaW4gcGFzcyBSRVBMQVk7IG90aGVyd2lzZSwganVzdCBza2lwIG92ZXIgdGhlCisJCQkgKiBibG9ja3MgaXQgZGVzY3JpYmVzLiAqLworCQkJaWYgKHBhc3MgIT0gUEFTU19SRVBMQVkpIHsKKwkJCQluZXh0X2xvZ19ibG9jayArPQorCQkJCQljb3VudF90YWdzKGJoLCBqb3VybmFsLT5qX2Jsb2Nrc2l6ZSk7CisJCQkJd3JhcChqb3VybmFsLCBuZXh0X2xvZ19ibG9jayk7CisJCQkJYnJlbHNlKGJoKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogQSBkZXNjcmlwdG9yIGJsb2NrOiB3ZSBjYW4gbm93IHdyaXRlIGFsbCBvZgorCQkJICogdGhlIGRhdGEgYmxvY2tzLiAgWWF5LCB1c2VmdWwgd29yayBpcyBmaW5hbGx5CisJCQkgKiBnZXR0aW5nIGRvbmUgaGVyZSEgKi8KKworCQkJdGFncCA9ICZiaC0+Yl9kYXRhW3NpemVvZihqb3VybmFsX2hlYWRlcl90KV07CisJCQl3aGlsZSAoKHRhZ3AgLSBiaC0+Yl9kYXRhICtzaXplb2Yoam91cm5hbF9ibG9ja190YWdfdCkpCisJCQkgICAgICAgPD0gam91cm5hbC0+al9ibG9ja3NpemUpIHsKKwkJCQl1bnNpZ25lZCBsb25nIGlvX2Jsb2NrOworCisJCQkJdGFnID0gKGpvdXJuYWxfYmxvY2tfdGFnX3QgKikgdGFncDsKKwkJCQlmbGFncyA9IGJlMzJfdG9fY3B1KHRhZy0+dF9mbGFncyk7CisKKwkJCQlpb19ibG9jayA9IG5leHRfbG9nX2Jsb2NrKys7CisJCQkJd3JhcChqb3VybmFsLCBuZXh0X2xvZ19ibG9jayk7CisJCQkJZXJyID0ganJlYWQoJm9iaCwgam91cm5hbCwgaW9fYmxvY2spOworCQkJCWlmIChlcnIpIHsKKwkJCQkJLyogUmVjb3ZlciB3aGF0IHdlIGNhbiwgYnV0CisJCQkJCSAqIHJlcG9ydCBmYWlsdXJlIGF0IHRoZSBlbmQuICovCisJCQkJCXN1Y2Nlc3MgPSBlcnI7CisJCQkJCXByaW50ayAoS0VSTl9FUlIgCisJCQkJCQkiSkJEOiBJTyBlcnJvciAlZCByZWNvdmVyaW5nICIKKwkJCQkJCSJibG9jayAlbGQgaW4gbG9nXG4iLAorCQkJCQkJZXJyLCBpb19ibG9jayk7CisJCQkJfSBlbHNlIHsKKwkJCQkJdW5zaWduZWQgbG9uZyBibG9ja25yOworCisJCQkJCUpfQVNTRVJUKG9iaCAhPSBOVUxMKTsKKwkJCQkJYmxvY2tuciA9IGJlMzJfdG9fY3B1KHRhZy0+dF9ibG9ja25yKTsKKworCQkJCQkvKiBJZiB0aGUgYmxvY2sgaGFzIGJlZW4KKwkJCQkJICogcmV2b2tlZCwgdGhlbiB3ZSdyZSBhbGwgZG9uZQorCQkJCQkgKiBoZXJlLiAqLworCQkJCQlpZiAoam91cm5hbF90ZXN0X3Jldm9rZQorCQkJCQkgICAgKGpvdXJuYWwsIGJsb2NrbnIsIAorCQkJCQkgICAgIG5leHRfY29tbWl0X0lEKSkgeworCQkJCQkJYnJlbHNlKG9iaCk7CisJCQkJCQkrK2luZm8tPm5yX3Jldm9rZV9oaXRzOworCQkJCQkJZ290byBza2lwX3dyaXRlOworCQkJCQl9CisKKwkJCQkJLyogRmluZCBhIGJ1ZmZlciBmb3IgdGhlIG5ldworCQkJCQkgKiBkYXRhIGJlaW5nIHJlc3RvcmVkICovCisJCQkJCW5iaCA9IF9fZ2V0YmxrKGpvdXJuYWwtPmpfZnNfZGV2LAorCQkJCQkJCWJsb2NrbnIsCisJCQkJCQkJam91cm5hbC0+al9ibG9ja3NpemUpOworCQkJCQlpZiAobmJoID09IE5VTEwpIHsKKwkJCQkJCXByaW50ayhLRVJOX0VSUiAKKwkJCQkJCSAgICAgICAiSkJEOiBPdXQgb2YgbWVtb3J5ICIKKwkJCQkJCSAgICAgICAiZHVyaW5nIHJlY292ZXJ5LlxuIik7CisJCQkJCQllcnIgPSAtRU5PTUVNOworCQkJCQkJYnJlbHNlKGJoKTsKKwkJCQkJCWJyZWxzZShvYmgpOworCQkJCQkJZ290byBmYWlsZWQ7CisJCQkJCX0KKworCQkJCQlsb2NrX2J1ZmZlcihuYmgpOworCQkJCQltZW1jcHkobmJoLT5iX2RhdGEsIG9iaC0+Yl9kYXRhLAorCQkJCQkJCWpvdXJuYWwtPmpfYmxvY2tzaXplKTsKKwkJCQkJaWYgKGZsYWdzICYgSkZTX0ZMQUdfRVNDQVBFKSB7CisJCQkJCQkqKChfX2JlMzIgKiliaC0+Yl9kYXRhKSA9CisJCQkJCQljcHVfdG9fYmUzMihKRlNfTUFHSUNfTlVNQkVSKTsKKwkJCQkJfQorCisJCQkJCUJVRkZFUl9UUkFDRShuYmgsICJtYXJraW5nIGRpcnR5Iik7CisJCQkJCXNldF9idWZmZXJfdXB0b2RhdGUobmJoKTsKKwkJCQkJbWFya19idWZmZXJfZGlydHkobmJoKTsKKwkJCQkJQlVGRkVSX1RSQUNFKG5iaCwgIm1hcmtpbmcgdXB0b2RhdGUiKTsKKwkJCQkJKytpbmZvLT5ucl9yZXBsYXlzOworCQkJCQkvKiBsbF9yd19ibG9jayhXUklURSwgMSwgJm5iaCk7ICovCisJCQkJCXVubG9ja19idWZmZXIobmJoKTsKKwkJCQkJYnJlbHNlKG9iaCk7CisJCQkJCWJyZWxzZShuYmgpOworCQkJCX0KKworCQkJc2tpcF93cml0ZToKKwkJCQl0YWdwICs9IHNpemVvZihqb3VybmFsX2Jsb2NrX3RhZ190KTsKKwkJCQlpZiAoIShmbGFncyAmIEpGU19GTEFHX1NBTUVfVVVJRCkpCisJCQkJCXRhZ3AgKz0gMTY7CisKKwkJCQlpZiAoZmxhZ3MgJiBKRlNfRkxBR19MQVNUX1RBRykKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCWJyZWxzZShiaCk7CisJCQljb250aW51ZTsKKworCQljYXNlIEpGU19DT01NSVRfQkxPQ0s6CisJCQkvKiBGb3VuZCBhbiBleHBlY3RlZCBjb21taXQgYmxvY2s6IG5vdCBtdWNoIHRvCisJCQkgKiBkbyBvdGhlciB0aGFuIG1vdmUgb24gdG8gdGhlIG5leHQgc2VxdWVuY2UKKwkJCSAqIG51bWJlci4gKi8KKwkJCWJyZWxzZShiaCk7CisJCQluZXh0X2NvbW1pdF9JRCsrOworCQkJY29udGludWU7CisKKwkJY2FzZSBKRlNfUkVWT0tFX0JMT0NLOgorCQkJLyogSWYgd2UgYXJlbid0IGluIHRoZSBSRVZPS0UgcGFzcywgdGhlbiB3ZSBjYW4KKwkJCSAqIGp1c3Qgc2tpcCBvdmVyIHRoaXMgYmxvY2suICovCisJCQlpZiAocGFzcyAhPSBQQVNTX1JFVk9LRSkgeworCQkJCWJyZWxzZShiaCk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWVyciA9IHNjYW5fcmV2b2tlX3JlY29yZHMoam91cm5hbCwgYmgsCisJCQkJCQkgIG5leHRfY29tbWl0X0lELCBpbmZvKTsKKwkJCWJyZWxzZShiaCk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gZmFpbGVkOworCQkJY29udGludWU7CisKKwkJZGVmYXVsdDoKKwkJCWpiZF9kZWJ1ZygzLCAiVW5yZWNvZ25pc2VkIG1hZ2ljICVkLCBlbmQgb2Ygc2Nhbi5cbiIsCisJCQkJICBibG9ja3R5cGUpOworCQkJZ290byBkb25lOworCQl9CisJfQorCisgZG9uZToKKwkvKiAKKwkgKiBXZSBicm9rZSBvdXQgb2YgdGhlIGxvZyBzY2FuIGxvb3A6IGVpdGhlciB3ZSBjYW1lIHRvIHRoZQorCSAqIGtub3duIGVuZCBvZiB0aGUgbG9nIG9yIHdlIGZvdW5kIGFuIHVuZXhwZWN0ZWQgYmxvY2sgaW4gdGhlCisJICogbG9nLiAgSWYgdGhlIGxhdHRlciBoYXBwZW5lZCwgdGhlbiB3ZSBrbm93IHRoYXQgdGhlICJjdXJyZW50IgorCSAqIHRyYW5zYWN0aW9uIG1hcmtzIHRoZSBlbmQgb2YgdGhlIHZhbGlkIGxvZy4KKwkgKi8KKworCWlmIChwYXNzID09IFBBU1NfU0NBTikKKwkJaW5mby0+ZW5kX3RyYW5zYWN0aW9uID0gbmV4dF9jb21taXRfSUQ7CisJZWxzZSB7CisJCS8qIEl0J3MgcmVhbGx5IGJhZCBuZXdzIGlmIGRpZmZlcmVudCBwYXNzZXMgZW5kIHVwIGF0CisJCSAqIGRpZmZlcmVudCBwbGFjZXMgKGJ1dCBwb3NzaWJsZSBkdWUgdG8gSU8gZXJyb3JzKS4gKi8KKwkJaWYgKGluZm8tPmVuZF90cmFuc2FjdGlvbiAhPSBuZXh0X2NvbW1pdF9JRCkgeworCQkJcHJpbnRrIChLRVJOX0VSUiAiSkJEOiByZWNvdmVyeSBwYXNzICVkIGVuZGVkIGF0ICIKKwkJCQkidHJhbnNhY3Rpb24gJXUsIGV4cGVjdGVkICV1XG4iLAorCQkJCXBhc3MsIG5leHRfY29tbWl0X0lELCBpbmZvLT5lbmRfdHJhbnNhY3Rpb24pOworCQkJaWYgKCFzdWNjZXNzKQorCQkJCXN1Y2Nlc3MgPSAtRUlPOworCQl9CisJfQorCisJcmV0dXJuIHN1Y2Nlc3M7CisKKyBmYWlsZWQ6CisJcmV0dXJuIGVycjsKK30KKworCisvKiBTY2FuIGEgcmV2b2tlIHJlY29yZCwgbWFya2luZyBhbGwgYmxvY2tzIG1lbnRpb25lZCBhcyByZXZva2VkLiAqLworCitzdGF0aWMgaW50IHNjYW5fcmV2b2tlX3JlY29yZHMoam91cm5hbF90ICpqb3VybmFsLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAKKwkJCSAgICAgICB0aWRfdCBzZXF1ZW5jZSwgc3RydWN0IHJlY292ZXJ5X2luZm8gKmluZm8pCit7CisJam91cm5hbF9yZXZva2VfaGVhZGVyX3QgKmhlYWRlcjsKKwlpbnQgb2Zmc2V0LCBtYXg7CisKKwloZWFkZXIgPSAoam91cm5hbF9yZXZva2VfaGVhZGVyX3QgKikgYmgtPmJfZGF0YTsKKwlvZmZzZXQgPSBzaXplb2Yoam91cm5hbF9yZXZva2VfaGVhZGVyX3QpOworCW1heCA9IGJlMzJfdG9fY3B1KGhlYWRlci0+cl9jb3VudCk7CisKKwl3aGlsZSAob2Zmc2V0IDwgbWF4KSB7CisJCXVuc2lnbmVkIGxvbmcgYmxvY2tucjsKKwkJaW50IGVycjsKKworCQlibG9ja25yID0gYmUzMl90b19jcHUoKiAoKF9fYmUzMiAqKSAoYmgtPmJfZGF0YStvZmZzZXQpKSk7CisJCW9mZnNldCArPSA0OworCQllcnIgPSBqb3VybmFsX3NldF9yZXZva2Uoam91cm5hbCwgYmxvY2tuciwgc2VxdWVuY2UpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJKytpbmZvLT5ucl9yZXZva2VzOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL2piZC9yZXZva2UuYyBiL2ZzL2piZC9yZXZva2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzI3YTU5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvamJkL3Jldm9rZS5jCkBAIC0wLDAgKzEsNzAyIEBACisvKgorICogbGludXgvZnMvcmV2b2tlLmMKKyAqIAorICogV3JpdHRlbiBieSBTdGVwaGVuIEMuIFR3ZWVkaWUgPHNjdEByZWRoYXQuY29tPiwgMjAwMAorICoKKyAqIENvcHlyaWdodCAyMDAwIFJlZCBIYXQgY29ycCAtLS0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIG9yIGF0IHlvdXIKKyAqIG9wdGlvbiwgYW55IGxhdGVyIHZlcnNpb24sIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIEpvdXJuYWwgcmV2b2tlIHJvdXRpbmVzIGZvciB0aGUgZ2VuZXJpYyBmaWxlc3lzdGVtIGpvdXJuYWxpbmcgY29kZTsKKyAqIHBhcnQgb2YgdGhlIGV4dDJmcyBqb3VybmFsaW5nIHN5c3RlbS4KKyAqCisgKiBSZXZva2UgaXMgdGhlIG1lY2hhbmlzbSB1c2VkIHRvIHByZXZlbnQgb2xkIGxvZyByZWNvcmRzIGZvciBkZWxldGVkCisgKiBtZXRhZGF0YSBmcm9tIGJlaW5nIHJlcGxheWVkIG9uIHRvcCBvZiBuZXdlciBkYXRhIHVzaW5nIHRoZSBzYW1lCisgKiBibG9ja3MuICBUaGUgcmV2b2tlIG1lY2hhbmlzbSBpcyB1c2VkIGluIHR3byBzZXBhcmF0ZSBwbGFjZXM6CisgKiAKKyAqICsgQ29tbWl0OiBkdXJpbmcgY29tbWl0IHdlIHdyaXRlIHRoZSBlbnRpcmUgbGlzdCBvZiB0aGUgY3VycmVudAorICogICB0cmFuc2FjdGlvbidzIHJldm9rZWQgYmxvY2tzIHRvIHRoZSBqb3VybmFsCisgKiAKKyAqICsgUmVjb3Zlcnk6IGR1cmluZyByZWNvdmVyeSB3ZSByZWNvcmQgdGhlIHRyYW5zYWN0aW9uIElEIG9mIGFsbAorICogICByZXZva2VkIGJsb2Nrcy4gIElmIHRoZXJlIGFyZSBtdWx0aXBsZSByZXZva2UgcmVjb3JkcyBpbiB0aGUgbG9nCisgKiAgIGZvciBhIHNpbmdsZSBibG9jaywgb25seSB0aGUgbGFzdCBvbmUgY291bnRzLCBhbmQgaWYgdGhlcmUgaXMgYSBsb2cKKyAqICAgZW50cnkgZm9yIGEgYmxvY2sgYmV5b25kIHRoZSBsYXN0IHJldm9rZSwgdGhlbiB0aGF0IGxvZyBlbnRyeSBzdGlsbAorICogICBnZXRzIHJlcGxheWVkLgorICoKKyAqIFdlIGNhbiBnZXQgaW50ZXJhY3Rpb25zIGJldHdlZW4gcmV2b2tlcyBhbmQgbmV3IGxvZyBkYXRhIHdpdGhpbiBhCisgKiBzaW5nbGUgdHJhbnNhY3Rpb246CisgKgorICogQmxvY2sgaXMgcmV2b2tlZCBhbmQgdGhlbiBqb3VybmFsZWQ6CisgKiAgIFRoZSBkZXNpcmVkIGVuZCByZXN1bHQgaXMgdGhlIGpvdXJuYWxpbmcgb2YgdGhlIG5ldyBibG9jaywgc28gd2UgCisgKiAgIGNhbmNlbCB0aGUgcmV2b2tlIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gY29tbWl0cy4KKyAqCisgKiBCbG9jayBpcyBqb3VybmFsZWQgYW5kIHRoZW4gcmV2b2tlZDoKKyAqICAgVGhlIHJldm9rZSBtdXN0IHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZSB3cml0ZSBvZiB0aGUgYmxvY2ssIHNvIHdlCisgKiAgIG5lZWQgZWl0aGVyIHRvIGNhbmNlbCB0aGUgam91cm5hbCBlbnRyeSBvciB0byB3cml0ZSB0aGUgcmV2b2tlCisgKiAgIGxhdGVyIGluIHRoZSBsb2cgdGhhbiB0aGUgbG9nIGJsb2NrLiAgSW4gdGhpcyBjYXNlLCB3ZSBjaG9vc2UgdGhlCisgKiAgIGxhdHRlcjogam91cm5hbGluZyBhIGJsb2NrIGNhbmNlbHMgYW55IHJldm9rZSByZWNvcmQgZm9yIHRoYXQgYmxvY2sKKyAqICAgaW4gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24sIHNvIGFueSByZXZva2UgZm9yIHRoYXQgYmxvY2sgaW4gdGhlCisgKiAgIHRyYW5zYWN0aW9uIG11c3QgaGF2ZSBoYXBwZW5lZCBhZnRlciB0aGUgYmxvY2sgd2FzIGpvdXJuYWxlZCBhbmQgc28KKyAqICAgdGhlIHJldm9rZSBtdXN0IHRha2UgcHJlY2VkZW5jZS4KKyAqCisgKiBCbG9jayBpcyByZXZva2VkIGFuZCB0aGVuIHdyaXR0ZW4gYXMgZGF0YTogCisgKiAgIFRoZSBkYXRhIHdyaXRlIGlzIGFsbG93ZWQgdG8gc3VjY2VlZCwgYnV0IHRoZSByZXZva2UgaXMgX25vdF8KKyAqICAgY2FuY2VsbGVkLiAgV2Ugc3RpbGwgbmVlZCB0byBwcmV2ZW50IG9sZCBsb2cgcmVjb3JkcyBmcm9tCisgKiAgIG92ZXJ3cml0aW5nIHRoZSBuZXcgZGF0YS4gIFdlIGRvbid0IGV2ZW4gbmVlZCB0byBjbGVhciB0aGUgcmV2b2tlCisgKiAgIGJpdCBoZXJlLgorICoKKyAqIFJldm9rZSBpbmZvcm1hdGlvbiBvbiBidWZmZXJzIGlzIGEgdHJpLXN0YXRlIHZhbHVlOgorICoKKyAqIFJldm9rZVZhbGlkIGNsZWFyOglubyBjYWNoZWQgcmV2b2tlIHN0YXR1cywgbmVlZCB0byBsb29rIGl0IHVwCisgKiBSZXZva2VWYWxpZCBzZXQsIFJldm9rZWQgY2xlYXI6CisgKgkJCWJ1ZmZlciBoYXMgbm90IGJlZW4gcmV2b2tlZCwgYW5kIGNhbmNlbF9yZXZva2UKKyAqCQkJbmVlZCBkbyBub3RoaW5nLgorICogUmV2b2tlVmFsaWQgc2V0LCBSZXZva2VkIHNldDoKKyAqCQkJYnVmZmVyIGhhcyBiZWVuIHJldm9rZWQuICAKKyAqLworCisjaWZuZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlICJqZnNfdXNlci5oIgorI2Vsc2UKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9qYmQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjZW5kaWYKKworc3RhdGljIGttZW1fY2FjaGVfdCAqcmV2b2tlX3JlY29yZF9jYWNoZTsKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKnJldm9rZV90YWJsZV9jYWNoZTsKKworLyogRWFjaCByZXZva2UgcmVjb3JkIHJlcHJlc2VudHMgb25lIHNpbmdsZSByZXZva2VkIGJsb2NrLiAgRHVyaW5nCisgICBqb3VybmFsIHJlcGxheSwgdGhpcyBpbnZvbHZlcyByZWNvcmRpbmcgdGhlIHRyYW5zYWN0aW9uIElEIG9mIHRoZQorICAgbGFzdCB0cmFuc2FjdGlvbiB0byByZXZva2UgdGhpcyBibG9jay4gKi8KKworc3RydWN0IGpiZF9yZXZva2VfcmVjb3JkX3MgCit7CisJc3RydWN0IGxpc3RfaGVhZCAgaGFzaDsKKwl0aWRfdAkJICBzZXF1ZW5jZTsJLyogVXNlZCBmb3IgcmVjb3Zlcnkgb25seSAqLworCXVuc2lnbmVkIGxvbmcJICBibG9ja25yOworfTsKKworCisvKiBUaGUgcmV2b2tlIHRhYmxlIGlzIGp1c3QgYSBzaW1wbGUgaGFzaCB0YWJsZSBvZiByZXZva2UgcmVjb3Jkcy4gKi8KK3N0cnVjdCBqYmRfcmV2b2tlX3RhYmxlX3MKK3sKKwkvKiBJdCBpcyBjb25jZWl2YWJsZSB0aGF0IHdlIG1pZ2h0IHdhbnQgYSBsYXJnZXIgaGFzaCB0YWJsZQorCSAqIGZvciByZWNvdmVyeS4gIE11c3QgYmUgYSBwb3dlciBvZiB0d28uICovCisJaW50CQkgIGhhc2hfc2l6ZTsgCisJaW50CQkgIGhhc2hfc2hpZnQ7IAorCXN0cnVjdCBsaXN0X2hlYWQgKmhhc2hfdGFibGU7Cit9OworCisKKyNpZmRlZiBfX0tFUk5FTF9fCitzdGF0aWMgdm9pZCB3cml0ZV9vbmVfcmV2b2tlX3JlY29yZChqb3VybmFsX3QgKiwgdHJhbnNhY3Rpb25fdCAqLAorCQkJCSAgICBzdHJ1Y3Qgam91cm5hbF9oZWFkICoqLCBpbnQgKiwKKwkJCQkgICAgc3RydWN0IGpiZF9yZXZva2VfcmVjb3JkX3MgKik7CitzdGF0aWMgdm9pZCBmbHVzaF9kZXNjcmlwdG9yKGpvdXJuYWxfdCAqLCBzdHJ1Y3Qgam91cm5hbF9oZWFkICosIGludCk7CisjZW5kaWYKKworLyogVXRpbGl0eSBmdW5jdGlvbnMgdG8gbWFpbnRhaW4gdGhlIHJldm9rZSB0YWJsZSAqLworCisvKiBCb3Jyb3dlZCBmcm9tIGJ1ZmZlci5jOiB0aGlzIGlzIGEgdHJpZWQgYW5kIHRlc3RlZCBibG9jayBoYXNoIGZ1bmN0aW9uICovCitzdGF0aWMgaW5saW5lIGludCBoYXNoKGpvdXJuYWxfdCAqam91cm5hbCwgdW5zaWduZWQgbG9uZyBibG9jaykKK3sKKwlzdHJ1Y3QgamJkX3Jldm9rZV90YWJsZV9zICp0YWJsZSA9IGpvdXJuYWwtPmpfcmV2b2tlOworCWludCBoYXNoX3NoaWZ0ID0gdGFibGUtPmhhc2hfc2hpZnQ7CisKKwlyZXR1cm4gKChibG9jayA8PCAoaGFzaF9zaGlmdCAtIDYpKSBeCisJCShibG9jayA+PiAxMykgXgorCQkoYmxvY2sgPDwgKGhhc2hfc2hpZnQgLSAxMikpKSAmICh0YWJsZS0+aGFzaF9zaXplIC0gMSk7Cit9CisKK2ludCBpbnNlcnRfcmV2b2tlX2hhc2goam91cm5hbF90ICpqb3VybmFsLCB1bnNpZ25lZCBsb25nIGJsb2NrbnIsIHRpZF90IHNlcSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoYXNoX2xpc3Q7CisJc3RydWN0IGpiZF9yZXZva2VfcmVjb3JkX3MgKnJlY29yZDsKKworcmVwZWF0OgorCXJlY29yZCA9IGttZW1fY2FjaGVfYWxsb2MocmV2b2tlX3JlY29yZF9jYWNoZSwgR0ZQX05PRlMpOworCWlmICghcmVjb3JkKQorCQlnb3RvIG9vbTsKKworCXJlY29yZC0+c2VxdWVuY2UgPSBzZXE7CisJcmVjb3JkLT5ibG9ja25yID0gYmxvY2tucjsKKwloYXNoX2xpc3QgPSAmam91cm5hbC0+al9yZXZva2UtPmhhc2hfdGFibGVbaGFzaChqb3VybmFsLCBibG9ja25yKV07CisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3Jldm9rZV9sb2NrKTsKKwlsaXN0X2FkZCgmcmVjb3JkLT5oYXNoLCBoYXNoX2xpc3QpOworCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3Jldm9rZV9sb2NrKTsKKwlyZXR1cm4gMDsKKworb29tOgorCWlmICgham91cm5hbF9vb21fcmV0cnkpCisJCXJldHVybiAtRU5PTUVNOworCWpiZF9kZWJ1ZygxLCAiRU5PTUVNIGluICVzLCByZXRyeWluZ1xuIiwgX19GVU5DVElPTl9fKTsKKwl5aWVsZCgpOworCWdvdG8gcmVwZWF0OworfQorCisvKiBGaW5kIGEgcmV2b2tlIHJlY29yZCBpbiB0aGUgam91cm5hbCdzIGhhc2ggdGFibGUuICovCisKK3N0YXRpYyBzdHJ1Y3QgamJkX3Jldm9rZV9yZWNvcmRfcyAqZmluZF9yZXZva2VfcmVjb3JkKGpvdXJuYWxfdCAqam91cm5hbCwKKwkJCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYmxvY2tucikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoYXNoX2xpc3Q7CisJc3RydWN0IGpiZF9yZXZva2VfcmVjb3JkX3MgKnJlY29yZDsKKworCWhhc2hfbGlzdCA9ICZqb3VybmFsLT5qX3Jldm9rZS0+aGFzaF90YWJsZVtoYXNoKGpvdXJuYWwsIGJsb2NrbnIpXTsKKworCXNwaW5fbG9jaygmam91cm5hbC0+al9yZXZva2VfbG9jayk7CisJcmVjb3JkID0gKHN0cnVjdCBqYmRfcmV2b2tlX3JlY29yZF9zICopIGhhc2hfbGlzdC0+bmV4dDsKKwl3aGlsZSAoJihyZWNvcmQtPmhhc2gpICE9IGhhc2hfbGlzdCkgeworCQlpZiAocmVjb3JkLT5ibG9ja25yID09IGJsb2NrbnIpIHsKKwkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3Jldm9rZV9sb2NrKTsKKwkJCXJldHVybiByZWNvcmQ7CisJCX0KKwkJcmVjb3JkID0gKHN0cnVjdCBqYmRfcmV2b2tlX3JlY29yZF9zICopIHJlY29yZC0+aGFzaC5uZXh0OworCX0KKwlzcGluX3VubG9jaygmam91cm5hbC0+al9yZXZva2VfbG9jayk7CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBfX2luaXQgam91cm5hbF9pbml0X3Jldm9rZV9jYWNoZXModm9pZCkKK3sKKwlyZXZva2VfcmVjb3JkX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoInJldm9rZV9yZWNvcmQiLAorCQkJCQkgICBzaXplb2Yoc3RydWN0IGpiZF9yZXZva2VfcmVjb3JkX3MpLAorCQkJCQkgICAwLCBTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwsIE5VTEwpOworCWlmIChyZXZva2VfcmVjb3JkX2NhY2hlID09IDApCisJCXJldHVybiAtRU5PTUVNOworCisJcmV2b2tlX3RhYmxlX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoInJldm9rZV90YWJsZSIsCisJCQkJCSAgIHNpemVvZihzdHJ1Y3QgamJkX3Jldm9rZV90YWJsZV9zKSwKKwkJCQkJICAgMCwgMCwgTlVMTCwgTlVMTCk7CisJaWYgKHJldm9rZV90YWJsZV9jYWNoZSA9PSAwKSB7CisJCWttZW1fY2FjaGVfZGVzdHJveShyZXZva2VfcmVjb3JkX2NhY2hlKTsKKwkJcmV2b2tlX3JlY29yZF9jYWNoZSA9IE5VTEw7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBqb3VybmFsX2Rlc3Ryb3lfcmV2b2tlX2NhY2hlcyh2b2lkKQoreworCWttZW1fY2FjaGVfZGVzdHJveShyZXZva2VfcmVjb3JkX2NhY2hlKTsKKwlyZXZva2VfcmVjb3JkX2NhY2hlID0gTlVMTDsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3kocmV2b2tlX3RhYmxlX2NhY2hlKTsKKwlyZXZva2VfdGFibGVfY2FjaGUgPSBOVUxMOworfQorCisvKiBJbml0aWFsaXNlIHRoZSByZXZva2UgdGFibGUgZm9yIGEgZ2l2ZW4gam91cm5hbCB0byBhIGdpdmVuIHNpemUuICovCisKK2ludCBqb3VybmFsX2luaXRfcmV2b2tlKGpvdXJuYWxfdCAqam91cm5hbCwgaW50IGhhc2hfc2l6ZSkKK3sKKwlpbnQgc2hpZnQsIHRtcDsKKworCUpfQVNTRVJUIChqb3VybmFsLT5qX3Jldm9rZV90YWJsZVswXSA9PSBOVUxMKTsKKworCXNoaWZ0ID0gMDsKKwl0bXAgPSBoYXNoX3NpemU7CisJd2hpbGUoKHRtcCA+Pj0gMVVMKSAhPSAwVUwpCisJCXNoaWZ0Kys7CisKKwlqb3VybmFsLT5qX3Jldm9rZV90YWJsZVswXSA9IGttZW1fY2FjaGVfYWxsb2MocmV2b2tlX3RhYmxlX2NhY2hlLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWpvdXJuYWwtPmpfcmV2b2tlX3RhYmxlWzBdKQorCQlyZXR1cm4gLUVOT01FTTsKKwlqb3VybmFsLT5qX3Jldm9rZSA9IGpvdXJuYWwtPmpfcmV2b2tlX3RhYmxlWzBdOworCisJLyogQ2hlY2sgdGhhdCB0aGUgaGFzaF9zaXplIGlzIGEgcG93ZXIgb2YgdHdvICovCisJSl9BU1NFUlQgKChoYXNoX3NpemUgJiAoaGFzaF9zaXplLTEpKSA9PSAwKTsKKworCWpvdXJuYWwtPmpfcmV2b2tlLT5oYXNoX3NpemUgPSBoYXNoX3NpemU7CisKKwlqb3VybmFsLT5qX3Jldm9rZS0+aGFzaF9zaGlmdCA9IHNoaWZ0OworCisJam91cm5hbC0+al9yZXZva2UtPmhhc2hfdGFibGUgPQorCQlrbWFsbG9jKGhhc2hfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFqb3VybmFsLT5qX3Jldm9rZS0+aGFzaF90YWJsZSkgeworCQlrbWVtX2NhY2hlX2ZyZWUocmV2b2tlX3RhYmxlX2NhY2hlLCBqb3VybmFsLT5qX3Jldm9rZV90YWJsZVswXSk7CisJCWpvdXJuYWwtPmpfcmV2b2tlID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZm9yICh0bXAgPSAwOyB0bXAgPCBoYXNoX3NpemU7IHRtcCsrKQorCQlJTklUX0xJU1RfSEVBRCgmam91cm5hbC0+al9yZXZva2UtPmhhc2hfdGFibGVbdG1wXSk7CisKKwlqb3VybmFsLT5qX3Jldm9rZV90YWJsZVsxXSA9IGttZW1fY2FjaGVfYWxsb2MocmV2b2tlX3RhYmxlX2NhY2hlLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWpvdXJuYWwtPmpfcmV2b2tlX3RhYmxlWzFdKSB7CisJCWtmcmVlKGpvdXJuYWwtPmpfcmV2b2tlX3RhYmxlWzBdLT5oYXNoX3RhYmxlKTsKKwkJa21lbV9jYWNoZV9mcmVlKHJldm9rZV90YWJsZV9jYWNoZSwgam91cm5hbC0+al9yZXZva2VfdGFibGVbMF0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlqb3VybmFsLT5qX3Jldm9rZSA9IGpvdXJuYWwtPmpfcmV2b2tlX3RhYmxlWzFdOworCisJLyogQ2hlY2sgdGhhdCB0aGUgaGFzaF9zaXplIGlzIGEgcG93ZXIgb2YgdHdvICovCisJSl9BU1NFUlQgKChoYXNoX3NpemUgJiAoaGFzaF9zaXplLTEpKSA9PSAwKTsKKworCWpvdXJuYWwtPmpfcmV2b2tlLT5oYXNoX3NpemUgPSBoYXNoX3NpemU7CisKKwlqb3VybmFsLT5qX3Jldm9rZS0+aGFzaF9zaGlmdCA9IHNoaWZ0OworCisJam91cm5hbC0+al9yZXZva2UtPmhhc2hfdGFibGUgPQorCQlrbWFsbG9jKGhhc2hfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFqb3VybmFsLT5qX3Jldm9rZS0+aGFzaF90YWJsZSkgeworCQlrZnJlZShqb3VybmFsLT5qX3Jldm9rZV90YWJsZVswXS0+aGFzaF90YWJsZSk7CisJCWttZW1fY2FjaGVfZnJlZShyZXZva2VfdGFibGVfY2FjaGUsIGpvdXJuYWwtPmpfcmV2b2tlX3RhYmxlWzBdKTsKKwkJa21lbV9jYWNoZV9mcmVlKHJldm9rZV90YWJsZV9jYWNoZSwgam91cm5hbC0+al9yZXZva2VfdGFibGVbMV0pOworCQlqb3VybmFsLT5qX3Jldm9rZSA9IE5VTEw7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWZvciAodG1wID0gMDsgdG1wIDwgaGFzaF9zaXplOyB0bXArKykKKwkJSU5JVF9MSVNUX0hFQUQoJmpvdXJuYWwtPmpfcmV2b2tlLT5oYXNoX3RhYmxlW3RtcF0pOworCisJc3Bpbl9sb2NrX2luaXQoJmpvdXJuYWwtPmpfcmV2b2tlX2xvY2spOworCisJcmV0dXJuIDA7Cit9CisKKy8qIERlc3RveSBhIGpvdXJuYWwncyByZXZva2UgdGFibGUuICBUaGUgdGFibGUgbXVzdCBhbHJlYWR5IGJlIGVtcHR5ISAqLworCit2b2lkIGpvdXJuYWxfZGVzdHJveV9yZXZva2Uoam91cm5hbF90ICpqb3VybmFsKQoreworCXN0cnVjdCBqYmRfcmV2b2tlX3RhYmxlX3MgKnRhYmxlOworCXN0cnVjdCBsaXN0X2hlYWQgKmhhc2hfbGlzdDsKKwlpbnQgaTsKKworCXRhYmxlID0gam91cm5hbC0+al9yZXZva2VfdGFibGVbMF07CisJaWYgKCF0YWJsZSkKKwkJcmV0dXJuOworCisJZm9yIChpPTA7IGk8dGFibGUtPmhhc2hfc2l6ZTsgaSsrKSB7CisJCWhhc2hfbGlzdCA9ICZ0YWJsZS0+aGFzaF90YWJsZVtpXTsKKwkJSl9BU1NFUlQgKGxpc3RfZW1wdHkoaGFzaF9saXN0KSk7CisJfQorCisJa2ZyZWUodGFibGUtPmhhc2hfdGFibGUpOworCWttZW1fY2FjaGVfZnJlZShyZXZva2VfdGFibGVfY2FjaGUsIHRhYmxlKTsKKwlqb3VybmFsLT5qX3Jldm9rZSA9IE5VTEw7CisKKwl0YWJsZSA9IGpvdXJuYWwtPmpfcmV2b2tlX3RhYmxlWzFdOworCWlmICghdGFibGUpCisJCXJldHVybjsKKworCWZvciAoaT0wOyBpPHRhYmxlLT5oYXNoX3NpemU7IGkrKykgeworCQloYXNoX2xpc3QgPSAmdGFibGUtPmhhc2hfdGFibGVbaV07CisJCUpfQVNTRVJUIChsaXN0X2VtcHR5KGhhc2hfbGlzdCkpOworCX0KKworCWtmcmVlKHRhYmxlLT5oYXNoX3RhYmxlKTsKKwlrbWVtX2NhY2hlX2ZyZWUocmV2b2tlX3RhYmxlX2NhY2hlLCB0YWJsZSk7CisJam91cm5hbC0+al9yZXZva2UgPSBOVUxMOworfQorCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qIAorICogam91cm5hbF9yZXZva2U6IHJldm9rZSBhIGdpdmVuIGJ1ZmZlcl9oZWFkIGZyb20gdGhlIGpvdXJuYWwuICBUaGlzCisgKiBwcmV2ZW50cyB0aGUgYmxvY2sgZnJvbSBiZWluZyByZXBsYXllZCBkdXJpbmcgcmVjb3ZlcnkgaWYgd2UgdGFrZSBhCisgKiBjcmFzaCBhZnRlciB0aGlzIGN1cnJlbnQgdHJhbnNhY3Rpb24gY29tbWl0cy4gIEFueSBzdWJzZXF1ZW50CisgKiBtZXRhZGF0YSB3cml0ZXMgb2YgdGhlIGJ1ZmZlciBpbiB0aGlzIHRyYW5zYWN0aW9uIGNhbmNlbCB0aGUKKyAqIHJldm9rZS4gIAorICoKKyAqIE5vdGUgdGhhdCB0aGlzIGNhbGwgbWF5IGJsb2NrIC0tLSBpdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIG1ha2UKKyAqIHN1cmUgdGhhdCB0aGVyZSBhcmUgbm8gZnVydGhlciBjYWxscyB0byBqb3VybmFsX3dyaXRlX21ldGFkYXRhCisgKiBiZWZvcmUgdGhlIHJldm9rZSBpcyBjb21wbGV0ZS4gIEluIGV4dDMsIHRoaXMgaW1wbGllcyBjYWxsaW5nIHRoZQorICogcmV2b2tlIGJlZm9yZSBjbGVhcmluZyB0aGUgYmxvY2sgYml0bWFwIHdoZW4gd2UgYXJlIGRlbGV0aW5nCisgKiBtZXRhZGF0YS4gCisgKgorICogUmV2b2tlIHBlcmZvcm1zIGEgam91cm5hbF9mb3JnZXQgb24gYW55IGJ1ZmZlcl9oZWFkIHBhc3NlZCBpbiBhcyBhCisgKiBwYXJhbWV0ZXIsIGJ1dCBkb2VzIF9ub3RfIGZvcmdldCB0aGUgYnVmZmVyX2hlYWQgaWYgdGhlIGJoIHdhcyBvbmx5CisgKiBmb3VuZCBpbXBsaWNpdGx5LiAKKyAqCisgKiBiaF9pbiBtYXkgbm90IGJlIGEgam91cm5hbGxlZCBidWZmZXIgLSBpdCBtYXkgaGF2ZSBjb21lIG9mZgorICogdGhlIGhhc2ggdGFibGVzIHdpdGhvdXQgYW4gYXR0YWNoZWQgam91cm5hbF9oZWFkLgorICoKKyAqIElmIGJoX2luIGlzIG5vbi16ZXJvLCBqb3VybmFsX3Jldm9rZSgpIHdpbGwgZGVjcmVtZW50IGl0cyBiX2NvdW50CisgKiBieSBvbmUuCisgKi8KKworaW50IGpvdXJuYWxfcmV2b2tlKGhhbmRsZV90ICpoYW5kbGUsIHVuc2lnbmVkIGxvbmcgYmxvY2tuciwgCisJCSAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfaW4pCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJam91cm5hbF90ICpqb3VybmFsOworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CisJaW50IGVycjsKKworCW1pZ2h0X3NsZWVwKCk7CisJaWYgKGJoX2luKQorCQlCVUZGRVJfVFJBQ0UoYmhfaW4sICJlbnRlciIpOworCisJam91cm5hbCA9IGhhbmRsZS0+aF90cmFuc2FjdGlvbi0+dF9qb3VybmFsOworCWlmICgham91cm5hbF9zZXRfZmVhdHVyZXMoam91cm5hbCwgMCwgMCwgSkZTX0ZFQVRVUkVfSU5DT01QQVRfUkVWT0tFKSl7CisJCUpfQVNTRVJUICghIkNhbm5vdCBzZXQgcmV2b2tlIGZlYXR1cmUhIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWJkZXYgPSBqb3VybmFsLT5qX2ZzX2RldjsKKwliaCA9IGJoX2luOworCisJaWYgKCFiaCkgeworCQliaCA9IF9fZmluZF9nZXRfYmxvY2soYmRldiwgYmxvY2tuciwgam91cm5hbC0+al9ibG9ja3NpemUpOworCQlpZiAoYmgpCisJCQlCVUZGRVJfVFJBQ0UoYmgsICJmb3VuZCBvbiBoYXNoIik7CisJfQorI2lmZGVmIEpCRF9FWFBFTlNJVkVfQ0hFQ0tJTkcKKwllbHNlIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDI7CisKKwkJLyogSWYgdGhlcmUgaXMgYSBkaWZmZXJlbnQgYnVmZmVyX2hlYWQgbHlpbmcgYXJvdW5kIGluCisJCSAqIG1lbW9yeSBhbnl3aGVyZS4uLiAqLworCQliaDIgPSBfX2ZpbmRfZ2V0X2Jsb2NrKGJkZXYsIGJsb2NrbnIsIGpvdXJuYWwtPmpfYmxvY2tzaXplKTsKKwkJaWYgKGJoMikgeworCQkJLyogLi4uIGFuZCBpdCBoYXMgUmV2b2tlVmFsaWQgc3RhdHVzLi4uICovCisJCQlpZiAoYmgyICE9IGJoICYmIGJ1ZmZlcl9yZXZva2V2YWxpZChiaDIpKQorCQkJCS8qIC4uLnRoZW4gaXQgYmV0dGVyIGJlIHJldm9rZWQgdG9vLAorCQkJCSAqIHNpbmNlIGl0J3MgaWxsZWdhbCB0byBjcmVhdGUgYSByZXZva2UKKwkJCQkgKiByZWNvcmQgYWdhaW5zdCBhIGJ1ZmZlcl9oZWFkIHdoaWNoIGlzCisJCQkJICogbm90IG1hcmtlZCByZXZva2VkIC0tLSB0aGF0IHdvdWxkCisJCQkJICogcmlzayBtaXNzaW5nIGEgc3Vic2VxdWVudCByZXZva2UKKwkJCQkgKiBjYW5jZWwuICovCisJCQkJSl9BU1NFUlRfQkgoYmgyLCBidWZmZXJfcmV2b2tlZChiaDIpKTsKKwkJCXB1dF9iaChiaDIpOworCQl9CisJfQorI2VuZGlmCisKKwkvKiBXZSByZWFsbHkgb3VnaHQgbm90IGV2ZXIgdG8gcmV2b2tlIHR3aWNlIGluIGEgcm93IHdpdGhvdXQKKyAgICAgICAgICAgZmlyc3QgaGF2aW5nIHRoZSByZXZva2UgY2FuY2VsbGVkOiBpdCdzIGlsbGVnYWwgdG8gZnJlZSBhCisgICAgICAgICAgIGJsb2NrIHR3aWNlIHdpdGhvdXQgYWxsb2NhdGluZyBpdCBpbiBiZXR3ZWVuISAqLworCWlmIChiaCkgeworCQlpZiAoIUpfRVhQRUNUX0JIKGJoLCAhYnVmZmVyX3Jldm9rZWQoYmgpLAorCQkJCSAiaW5jb25zaXN0ZW50IGRhdGEgb24gZGlzayIpKSB7CisJCQlpZiAoIWJoX2luKQorCQkJCWJyZWxzZShiaCk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlzZXRfYnVmZmVyX3Jldm9rZWQoYmgpOworCQlzZXRfYnVmZmVyX3Jldm9rZXZhbGlkKGJoKTsKKwkJaWYgKGJoX2luKSB7CisJCQlCVUZGRVJfVFJBQ0UoYmhfaW4sICJjYWxsIGpvdXJuYWxfZm9yZ2V0Iik7CisJCQlqb3VybmFsX2ZvcmdldChoYW5kbGUsIGJoX2luKTsKKwkJfSBlbHNlIHsKKwkJCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgYnJlbHNlIik7CisJCQlfX2JyZWxzZShiaCk7CisJCX0KKwl9CisKKwlqYmRfZGVidWcoMiwgImluc2VydCByZXZva2UgZm9yIGJsb2NrICVsdSwgYmhfaW49JXBcbiIsIGJsb2NrbnIsIGJoX2luKTsKKwllcnIgPSBpbnNlcnRfcmV2b2tlX2hhc2goam91cm5hbCwgYmxvY2tuciwKKwkJCQloYW5kbGUtPmhfdHJhbnNhY3Rpb24tPnRfdGlkKTsKKwlCVUZGRVJfVFJBQ0UoYmhfaW4sICJleGl0Iik7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIENhbmNlbCBhbiBvdXRzdGFuZGluZyByZXZva2UuICBGb3IgdXNlIG9ubHkgaW50ZXJuYWxseSBieSB0aGUKKyAqIGpvdXJuYWxpbmcgY29kZSAoY2FsbGVkIGZyb20gam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKS4KKyAqCisgKiBXZSB0cnVzdCBidWZmZXJfcmV2b2tlZCgpIG9uIHRoZSBidWZmZXIgaWYgdGhlIGJ1ZmZlciBpcyBhbHJlYWR5CisgKiBiZWluZyBqb3VybmFsZWQ6IGlmIHRoZXJlIGlzIG5vIHJldm9rZSBwZW5kaW5nIG9uIHRoZSBidWZmZXIsIHRoZW4gd2UKKyAqIGRvbid0IGRvIGFueXRoaW5nIGhlcmUuCisgKgorICogVGhpcyB3b3VsZCBicmVhayBpZiBpdCB3ZXJlIHBvc3NpYmxlIGZvciBhIGJ1ZmZlciB0byBiZSByZXZva2VkIGFuZAorICogZGlzY2FyZGVkLCBhbmQgdGhlbiByZWFsbG9jYXRlZCB3aXRoaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb24uICBJbiBzdWNoCisgKiBhIGNhc2Ugd2Ugd291bGQgaGF2ZSBsb3N0IHRoZSByZXZva2VkIGJpdCwgYnV0IHdoZW4gd2UgYXJyaXZlZCBoZXJlCisgKiB0aGUgc2Vjb25kIHRpbWUgd2Ugd291bGQgc3RpbGwgaGF2ZSBhIHBlbmRpbmcgcmV2b2tlIHRvIGNhbmNlbC4gIFNvLAorICogZG8gbm90IHRydXN0IHRoZSBSZXZva2VkIGJpdCBvbiBidWZmZXJzIHVubGVzcyBSZXZva2VWYWxpZCBpcyBhbHNvCisgKiBzZXQuCisgKgorICogVGhlIGNhbGxlciBtdXN0IGhhdmUgdGhlIGpvdXJuYWwgbG9ja2VkLgorICovCitpbnQgam91cm5hbF9jYW5jZWxfcmV2b2tlKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKQoreworCXN0cnVjdCBqYmRfcmV2b2tlX3JlY29yZF9zICpyZWNvcmQ7CisJam91cm5hbF90ICpqb3VybmFsID0gaGFuZGxlLT5oX3RyYW5zYWN0aW9uLT50X2pvdXJuYWw7CisJaW50IG5lZWRfY2FuY2VsOworCWludCBkaWRfcmV2b2tlID0gMDsJLyogYWtwbTogZGVidWcgKi8KKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gamgyYmgoamgpOworCisJamJkX2RlYnVnKDQsICJqb3VybmFsX2hlYWQgJXAsIGNhbmNlbGxpbmcgcmV2b2tlXG4iLCBqaCk7CisKKwkvKiBJcyB0aGUgZXhpc3RpbmcgUmV2b2tlIGJpdCB2YWxpZD8gIElmIHNvLCB3ZSB0cnVzdCBpdCwgYW5kCisJICogb25seSBwZXJmb3JtIHRoZSBmdWxsIGNhbmNlbCBpZiB0aGUgcmV2b2tlIGJpdCBpcyBzZXQuICBJZgorCSAqIG5vdCwgd2UgY2FuJ3QgdHJ1c3QgdGhlIHJldm9rZSBiaXQsIGFuZCB3ZSBuZWVkIHRvIGRvIHRoZQorCSAqIGZ1bGwgc2VhcmNoIGZvciBhIHJldm9rZSByZWNvcmQuICovCisJaWYgKHRlc3Rfc2V0X2J1ZmZlcl9yZXZva2V2YWxpZChiaCkpIHsKKwkJbmVlZF9jYW5jZWwgPSB0ZXN0X2NsZWFyX2J1ZmZlcl9yZXZva2VkKGJoKTsKKwl9IGVsc2UgeworCQluZWVkX2NhbmNlbCA9IDE7CisJCWNsZWFyX2J1ZmZlcl9yZXZva2VkKGJoKTsKKwl9CisKKwlpZiAobmVlZF9jYW5jZWwpIHsKKwkJcmVjb3JkID0gZmluZF9yZXZva2VfcmVjb3JkKGpvdXJuYWwsIGJoLT5iX2Jsb2NrbnIpOworCQlpZiAocmVjb3JkKSB7CisJCQlqYmRfZGVidWcoNCwgImNhbmNlbGxlZCBleGlzdGluZyByZXZva2Ugb24gIgorCQkJCSAgImJsb2NrbnIgJWxsdVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yKTsKKwkJCXNwaW5fbG9jaygmam91cm5hbC0+al9yZXZva2VfbG9jayk7CisJCQlsaXN0X2RlbCgmcmVjb3JkLT5oYXNoKTsKKwkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3Jldm9rZV9sb2NrKTsKKwkJCWttZW1fY2FjaGVfZnJlZShyZXZva2VfcmVjb3JkX2NhY2hlLCByZWNvcmQpOworCQkJZGlkX3Jldm9rZSA9IDE7CisJCX0KKwl9CisKKyNpZmRlZiBKQkRfRVhQRU5TSVZFX0NIRUNLSU5HCisJLyogVGhlcmUgYmV0dGVyIG5vdCBiZSBvbmUgbGVmdCBiZWhpbmQgYnkgbm93ISAqLworCXJlY29yZCA9IGZpbmRfcmV2b2tlX3JlY29yZChqb3VybmFsLCBiaC0+Yl9ibG9ja25yKTsKKwlKX0FTU0VSVF9KSChqaCwgcmVjb3JkID09IE5VTEwpOworI2VuZGlmCisKKwkvKiBGaW5hbGx5LCBoYXZlIHdlIGp1c3QgY2xlYXJlZCByZXZva2Ugb24gYW4gdW5oYXNoZWQKKwkgKiBidWZmZXJfaGVhZD8gIElmIHNvLCB3ZSdkIGJldHRlciBtYWtlIHN1cmUgd2UgY2xlYXIgdGhlCisJICogcmV2b2tlZCBzdGF0dXMgb24gYW55IGhhc2hlZCBhbGlhcyB0b28sIG90aGVyd2lzZSB0aGUgcmV2b2tlCisJICogc3RhdGUgbWFjaGluZSB3aWxsIGdldCB2ZXJ5IHVwc2V0IGxhdGVyIG9uLiAqLworCWlmIChuZWVkX2NhbmNlbCkgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoMjsKKwkJYmgyID0gX19maW5kX2dldF9ibG9jayhiaC0+Yl9iZGV2LCBiaC0+Yl9ibG9ja25yLCBiaC0+Yl9zaXplKTsKKwkJaWYgKGJoMikgeworCQkJaWYgKGJoMiAhPSBiaCkKKwkJCQljbGVhcl9idWZmZXJfcmV2b2tlZChiaDIpOworCQkJX19icmVsc2UoYmgyKTsKKwkJfQorCX0KKwlyZXR1cm4gZGlkX3Jldm9rZTsKK30KKworLyogam91cm5hbF9zd2l0Y2hfcmV2b2tlIHRhYmxlIHNlbGVjdCBqX3Jldm9rZSBmb3IgbmV4dCB0cmFuc2FjdGlvbgorICogd2UgZG8gbm90IHdhbnQgdG8gc3VzcGVuZCBhbnkgcHJvY2Vzc2luZyB1bnRpbCBhbGwgcmV2b2tlcyBhcmUKKyAqIHdyaXR0ZW4gLWJ6enoKKyAqLwordm9pZCBqb3VybmFsX3N3aXRjaF9yZXZva2VfdGFibGUoam91cm5hbF90ICpqb3VybmFsKQoreworCWludCBpOworCisJaWYgKGpvdXJuYWwtPmpfcmV2b2tlID09IGpvdXJuYWwtPmpfcmV2b2tlX3RhYmxlWzBdKQorCQlqb3VybmFsLT5qX3Jldm9rZSA9IGpvdXJuYWwtPmpfcmV2b2tlX3RhYmxlWzFdOworCWVsc2UKKwkJam91cm5hbC0+al9yZXZva2UgPSBqb3VybmFsLT5qX3Jldm9rZV90YWJsZVswXTsKKworCWZvciAoaSA9IDA7IGkgPCBqb3VybmFsLT5qX3Jldm9rZS0+aGFzaF9zaXplOyBpKyspIAorCQlJTklUX0xJU1RfSEVBRCgmam91cm5hbC0+al9yZXZva2UtPmhhc2hfdGFibGVbaV0pOworfQorCisvKgorICogV3JpdGUgcmV2b2tlIHJlY29yZHMgdG8gdGhlIGpvdXJuYWwgZm9yIGFsbCBlbnRyaWVzIGluIHRoZSBjdXJyZW50CisgKiByZXZva2UgaGFzaCwgZGVsZXRpbmcgdGhlIGVudHJpZXMgYXMgd2UgZ28uCisgKgorICogQ2FsbGVkIHdpdGggdGhlIGpvdXJuYWwgbG9jayBoZWxkLgorICovCisKK3ZvaWQgam91cm5hbF93cml0ZV9yZXZva2VfcmVjb3Jkcyhqb3VybmFsX3QgKmpvdXJuYWwsIAorCQkJCSAgdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24pCit7CisJc3RydWN0IGpvdXJuYWxfaGVhZCAqZGVzY3JpcHRvcjsKKwlzdHJ1Y3QgamJkX3Jldm9rZV9yZWNvcmRfcyAqcmVjb3JkOworCXN0cnVjdCBqYmRfcmV2b2tlX3RhYmxlX3MgKnJldm9rZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoYXNoX2xpc3Q7CisJaW50IGksIG9mZnNldCwgY291bnQ7CisKKwlkZXNjcmlwdG9yID0gTlVMTDsgCisJb2Zmc2V0ID0gMDsKKwljb3VudCA9IDA7CisKKwkvKiBzZWxlY3QgcmV2b2tlIHRhYmxlIGZvciBjb21taXR0aW5nIHRyYW5zYWN0aW9uICovCisJcmV2b2tlID0gam91cm5hbC0+al9yZXZva2UgPT0gam91cm5hbC0+al9yZXZva2VfdGFibGVbMF0gPworCQlqb3VybmFsLT5qX3Jldm9rZV90YWJsZVsxXSA6IGpvdXJuYWwtPmpfcmV2b2tlX3RhYmxlWzBdOworCisJZm9yIChpID0gMDsgaSA8IHJldm9rZS0+aGFzaF9zaXplOyBpKyspIHsKKwkJaGFzaF9saXN0ID0gJnJldm9rZS0+aGFzaF90YWJsZVtpXTsKKworCQl3aGlsZSAoIWxpc3RfZW1wdHkoaGFzaF9saXN0KSkgeworCQkJcmVjb3JkID0gKHN0cnVjdCBqYmRfcmV2b2tlX3JlY29yZF9zICopIAorCQkJCWhhc2hfbGlzdC0+bmV4dDsKKwkJCXdyaXRlX29uZV9yZXZva2VfcmVjb3JkKGpvdXJuYWwsIHRyYW5zYWN0aW9uLAorCQkJCQkJJmRlc2NyaXB0b3IsICZvZmZzZXQsIAorCQkJCQkJcmVjb3JkKTsKKwkJCWNvdW50Kys7CisJCQlsaXN0X2RlbCgmcmVjb3JkLT5oYXNoKTsKKwkJCWttZW1fY2FjaGVfZnJlZShyZXZva2VfcmVjb3JkX2NhY2hlLCByZWNvcmQpOworCQl9CisJfQorCWlmIChkZXNjcmlwdG9yKQorCQlmbHVzaF9kZXNjcmlwdG9yKGpvdXJuYWwsIGRlc2NyaXB0b3IsIG9mZnNldCk7CisJamJkX2RlYnVnKDEsICJXcm90ZSAlZCByZXZva2UgcmVjb3Jkc1xuIiwgY291bnQpOworfQorCisvKiAKKyAqIFdyaXRlIG91dCBvbmUgcmV2b2tlIHJlY29yZC4gIFdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGRlc2NyaXB0b3IKKyAqIGJsb2NrIGlmIHRoZSBvbGQgb25lIGlzIGZ1bGwgb3IgaWYgd2UgaGF2ZSBub3QgYWxyZWFkeSBjcmVhdGVkIG9uZS4gIAorICovCisKK3N0YXRpYyB2b2lkIHdyaXRlX29uZV9yZXZva2VfcmVjb3JkKGpvdXJuYWxfdCAqam91cm5hbCwgCisJCQkJICAgIHRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uLAorCQkJCSAgICBzdHJ1Y3Qgam91cm5hbF9oZWFkICoqZGVzY3JpcHRvcnAsIAorCQkJCSAgICBpbnQgKm9mZnNldHAsCisJCQkJICAgIHN0cnVjdCBqYmRfcmV2b2tlX3JlY29yZF9zICpyZWNvcmQpCit7CisJc3RydWN0IGpvdXJuYWxfaGVhZCAqZGVzY3JpcHRvcjsKKwlpbnQgb2Zmc2V0OworCWpvdXJuYWxfaGVhZGVyX3QgKmhlYWRlcjsKKworCS8qIElmIHdlIGFyZSBhbHJlYWR5IGFib3J0aW5nLCB0aGlzIGFsbCBiZWNvbWVzIGEgbm9vcC4gIFdlCisgICAgICAgICAgIHN0aWxsIG5lZWQgdG8gZ28gcm91bmQgdGhlIGxvb3AgaW4KKyAgICAgICAgICAgam91cm5hbF93cml0ZV9yZXZva2VfcmVjb3JkcyBpbiBvcmRlciB0byBmcmVlIGFsbCBvZiB0aGUKKyAgICAgICAgICAgcmV2b2tlIHJlY29yZHM6IG9ubHkgdGhlIElPIHRvIHRoZSBqb3VybmFsIGlzIG9taXR0ZWQuICovCisJaWYgKGlzX2pvdXJuYWxfYWJvcnRlZChqb3VybmFsKSkKKwkJcmV0dXJuOworCisJZGVzY3JpcHRvciA9ICpkZXNjcmlwdG9ycDsKKwlvZmZzZXQgPSAqb2Zmc2V0cDsKKworCS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgZGVzY3JpcHRvciB3aXRoIHNwYWNlIGxlZnQgZm9yIHRoZSByZWNvcmQgKi8KKwlpZiAoZGVzY3JpcHRvcikgeworCQlpZiAob2Zmc2V0ID09IGpvdXJuYWwtPmpfYmxvY2tzaXplKSB7CisJCQlmbHVzaF9kZXNjcmlwdG9yKGpvdXJuYWwsIGRlc2NyaXB0b3IsIG9mZnNldCk7CisJCQlkZXNjcmlwdG9yID0gTlVMTDsKKwkJfQorCX0KKworCWlmICghZGVzY3JpcHRvcikgeworCQlkZXNjcmlwdG9yID0gam91cm5hbF9nZXRfZGVzY3JpcHRvcl9idWZmZXIoam91cm5hbCk7CisJCWlmICghZGVzY3JpcHRvcikKKwkJCXJldHVybjsKKwkJaGVhZGVyID0gKGpvdXJuYWxfaGVhZGVyX3QgKikgJmpoMmJoKGRlc2NyaXB0b3IpLT5iX2RhdGFbMF07CisJCWhlYWRlci0+aF9tYWdpYyAgICAgPSBjcHVfdG9fYmUzMihKRlNfTUFHSUNfTlVNQkVSKTsKKwkJaGVhZGVyLT5oX2Jsb2NrdHlwZSA9IGNwdV90b19iZTMyKEpGU19SRVZPS0VfQkxPQ0spOworCQloZWFkZXItPmhfc2VxdWVuY2UgID0gY3B1X3RvX2JlMzIodHJhbnNhY3Rpb24tPnRfdGlkKTsKKworCQkvKiBSZWNvcmQgaXQgc28gdGhhdCB3ZSBjYW4gd2FpdCBmb3IgSU8gY29tcGxldGlvbiBsYXRlciAqLworCQlKQlVGRkVSX1RSQUNFKGRlc2NyaXB0b3IsICJmaWxlIGFzIEJKX0xvZ0N0bCIpOworCQlqb3VybmFsX2ZpbGVfYnVmZmVyKGRlc2NyaXB0b3IsIHRyYW5zYWN0aW9uLCBCSl9Mb2dDdGwpOworCisJCW9mZnNldCA9IHNpemVvZihqb3VybmFsX3Jldm9rZV9oZWFkZXJfdCk7CisJCSpkZXNjcmlwdG9ycCA9IGRlc2NyaXB0b3I7CisJfQorCisJKiAoKF9fYmUzMiAqKSgmamgyYmgoZGVzY3JpcHRvciktPmJfZGF0YVtvZmZzZXRdKSkgPSAKKwkJY3B1X3RvX2JlMzIocmVjb3JkLT5ibG9ja25yKTsKKwlvZmZzZXQgKz0gNDsKKwkqb2Zmc2V0cCA9IG9mZnNldDsKK30KKworLyogCisgKiBGbHVzaCBhIHJldm9rZSBkZXNjcmlwdG9yIG91dCB0byB0aGUgam91cm5hbC4gIElmIHdlIGFyZSBhYm9ydGluZywKKyAqIHRoaXMgaXMgYSBub29wOyBvdGhlcndpc2Ugd2UgYXJlIGdlbmVyYXRpbmcgYSBidWZmZXIgd2hpY2ggbmVlZHMgdG8KKyAqIGJlIHdhaXRlZCBmb3IgZHVyaW5nIGNvbW1pdCwgc28gaXQgaGFzIHRvIGdvIG9udG8gdGhlIGFwcHJvcHJpYXRlCisgKiBqb3VybmFsIGJ1ZmZlciBsaXN0LgorICovCisKK3N0YXRpYyB2b2lkIGZsdXNoX2Rlc2NyaXB0b3Ioam91cm5hbF90ICpqb3VybmFsLCAKKwkJCSAgICAgc3RydWN0IGpvdXJuYWxfaGVhZCAqZGVzY3JpcHRvciwgCisJCQkgICAgIGludCBvZmZzZXQpCit7CisJam91cm5hbF9yZXZva2VfaGVhZGVyX3QgKmhlYWRlcjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gamgyYmgoZGVzY3JpcHRvcik7CisKKwlpZiAoaXNfam91cm5hbF9hYm9ydGVkKGpvdXJuYWwpKSB7CisJCXB1dF9iaChiaCk7CisJCXJldHVybjsKKwl9CisKKwloZWFkZXIgPSAoam91cm5hbF9yZXZva2VfaGVhZGVyX3QgKikgamgyYmgoZGVzY3JpcHRvciktPmJfZGF0YTsKKwloZWFkZXItPnJfY291bnQgPSBjcHVfdG9fYmUzMihvZmZzZXQpOworCXNldF9idWZmZXJfandyaXRlKGJoKTsKKwlCVUZGRVJfVFJBQ0UoYmgsICJ3cml0ZSIpOworCXNldF9idWZmZXJfZGlydHkoYmgpOworCWxsX3J3X2Jsb2NrKFdSSVRFLCAxLCAmYmgpOworfQorI2VuZGlmCisKKy8qIAorICogUmV2b2tlIHN1cHBvcnQgZm9yIHJlY292ZXJ5LgorICoKKyAqIFJlY292ZXJ5IG5lZWRzIHRvIGJlIGFibGUgdG86CisgKgorICogIHJlY29yZCBhbGwgcmV2b2tlIHJlY29yZHMsIGluY2x1ZGluZyB0aGUgdGlkIG9mIHRoZSBsYXRlc3QgaW5zdGFuY2UKKyAqICBvZiBlYWNoIHJldm9rZSBpbiB0aGUgam91cm5hbAorICoKKyAqICBjaGVjayB3aGV0aGVyIGEgZ2l2ZW4gYmxvY2sgaW4gYSBnaXZlbiB0cmFuc2FjdGlvbiBzaG91bGQgYmUgcmVwbGF5ZWQKKyAqICAoaWUuIGhhcyBub3QgYmVlbiByZXZva2VkIGJ5IGEgcmV2b2tlIHJlY29yZCBpbiB0aGF0IG9yIGEgc3Vic2VxdWVudAorICogIHRyYW5zYWN0aW9uKQorICogCisgKiAgZW1wdHkgdGhlIHJldm9rZSB0YWJsZSBhZnRlciByZWNvdmVyeS4KKyAqLworCisvKgorICogRmlyc3QsIHNldHRpbmcgcmV2b2tlIHJlY29yZHMuICBXZSBjcmVhdGUgYSBuZXcgcmV2b2tlIHJlY29yZCBmb3IKKyAqIGV2ZXJ5IGJsb2NrIGV2ZXIgcmV2b2tlZCBpbiB0aGUgbG9nIGFzIHdlIHNjYW4gaXQgZm9yIHJlY292ZXJ5LCBhbmQKKyAqIHdlIHVwZGF0ZSB0aGUgZXhpc3RpbmcgcmVjb3JkcyBpZiB3ZSBmaW5kIG11bHRpcGxlIHJldm9rZXMgZm9yIGEKKyAqIHNpbmdsZSBibG9jay4gCisgKi8KKworaW50IGpvdXJuYWxfc2V0X3Jldm9rZShqb3VybmFsX3QgKmpvdXJuYWwsIAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBibG9ja25yLCAKKwkJICAgICAgIHRpZF90IHNlcXVlbmNlKQoreworCXN0cnVjdCBqYmRfcmV2b2tlX3JlY29yZF9zICpyZWNvcmQ7CisKKwlyZWNvcmQgPSBmaW5kX3Jldm9rZV9yZWNvcmQoam91cm5hbCwgYmxvY2tucik7CisJaWYgKHJlY29yZCkgeworCQkvKiBJZiB3ZSBoYXZlIG11bHRpcGxlIG9jY3VycmVuY2VzLCBvbmx5IHJlY29yZCB0aGUKKwkJICogbGF0ZXN0IHNlcXVlbmNlIG51bWJlciBpbiB0aGUgaGFzaGVkIHJlY29yZCAqLworCQlpZiAodGlkX2d0KHNlcXVlbmNlLCByZWNvcmQtPnNlcXVlbmNlKSkKKwkJCXJlY29yZC0+c2VxdWVuY2UgPSBzZXF1ZW5jZTsKKwkJcmV0dXJuIDA7CisJfSAKKwlyZXR1cm4gaW5zZXJ0X3Jldm9rZV9oYXNoKGpvdXJuYWwsIGJsb2NrbnIsIHNlcXVlbmNlKTsKK30KKworLyogCisgKiBUZXN0IHJldm9rZSByZWNvcmRzLiAgRm9yIGEgZ2l2ZW4gYmxvY2sgcmVmZXJlbmNlZCBpbiB0aGUgbG9nLCBoYXMKKyAqIHRoYXQgYmxvY2sgYmVlbiByZXZva2VkPyAgQSByZXZva2UgcmVjb3JkIHdpdGggYSBnaXZlbiB0cmFuc2FjdGlvbgorICogc2VxdWVuY2UgbnVtYmVyIHJldm9rZXMgYWxsIGJsb2NrcyBpbiB0aGF0IHRyYW5zYWN0aW9uIGFuZCBlYXJsaWVyCisgKiBvbmVzLCBidXQgbGF0ZXIgdHJhbnNhY3Rpb25zIHN0aWxsIG5lZWQgcmVwbGF5ZWQuCisgKi8KKworaW50IGpvdXJuYWxfdGVzdF9yZXZva2Uoam91cm5hbF90ICpqb3VybmFsLCAKKwkJCXVuc2lnbmVkIGxvbmcgYmxvY2tuciwKKwkJCXRpZF90IHNlcXVlbmNlKQoreworCXN0cnVjdCBqYmRfcmV2b2tlX3JlY29yZF9zICpyZWNvcmQ7CisKKwlyZWNvcmQgPSBmaW5kX3Jldm9rZV9yZWNvcmQoam91cm5hbCwgYmxvY2tucik7CisJaWYgKCFyZWNvcmQpCisJCXJldHVybiAwOworCWlmICh0aWRfZ3Qoc2VxdWVuY2UsIHJlY29yZC0+c2VxdWVuY2UpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEZpbmFsbHksIG9uY2UgcmVjb3ZlcnkgaXMgb3Zlciwgd2UgbmVlZCB0byBjbGVhciB0aGUgcmV2b2tlIHRhYmxlIHNvCisgKiB0aGF0IGl0IGNhbiBiZSByZXVzZWQgYnkgdGhlIHJ1bm5pbmcgZmlsZXN5c3RlbS4KKyAqLworCit2b2lkIGpvdXJuYWxfY2xlYXJfcmV2b2tlKGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoYXNoX2xpc3Q7CisJc3RydWN0IGpiZF9yZXZva2VfcmVjb3JkX3MgKnJlY29yZDsKKwlzdHJ1Y3QgamJkX3Jldm9rZV90YWJsZV9zICpyZXZva2U7CisKKwlyZXZva2UgPSBqb3VybmFsLT5qX3Jldm9rZTsKKworCWZvciAoaSA9IDA7IGkgPCByZXZva2UtPmhhc2hfc2l6ZTsgaSsrKSB7CisJCWhhc2hfbGlzdCA9ICZyZXZva2UtPmhhc2hfdGFibGVbaV07CisJCXdoaWxlICghbGlzdF9lbXB0eShoYXNoX2xpc3QpKSB7CisJCQlyZWNvcmQgPSAoc3RydWN0IGpiZF9yZXZva2VfcmVjb3JkX3MqKSBoYXNoX2xpc3QtPm5leHQ7CisJCQlsaXN0X2RlbCgmcmVjb3JkLT5oYXNoKTsKKwkJCWttZW1fY2FjaGVfZnJlZShyZXZva2VfcmVjb3JkX2NhY2hlLCByZWNvcmQpOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvZnMvamJkL3RyYW5zYWN0aW9uLmMgYi9mcy9qYmQvdHJhbnNhY3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzJlN2MxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamJkL3RyYW5zYWN0aW9uLmMKQEAgLTAsMCArMSwyMDYyIEBACisvKgorICogbGludXgvZnMvdHJhbnNhY3Rpb24uYworICogCisgKiBXcml0dGVuIGJ5IFN0ZXBoZW4gQy4gVHdlZWRpZSA8c2N0QHJlZGhhdC5jb20+LCAxOTk4CisgKgorICogQ29weXJpZ2h0IDE5OTggUmVkIEhhdCBjb3JwIC0tLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCBhbmQgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgb3IgYXQgeW91cgorICogb3B0aW9uLCBhbnkgbGF0ZXIgdmVyc2lvbiwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogR2VuZXJpYyBmaWxlc3lzdGVtIHRyYW5zYWN0aW9uIGhhbmRsaW5nIGNvZGU7IHBhcnQgb2YgdGhlIGV4dDJmcworICogam91cm5hbGluZyBzeXN0ZW0uICAKKyAqCisgKiBUaGlzIGZpbGUgbWFuYWdlcyB0cmFuc2FjdGlvbnMgKGNvbXBvdW5kIGNvbW1pdHMgbWFuYWdlZCBieSB0aGUKKyAqIGpvdXJuYWxpbmcgY29kZSkgYW5kIGhhbmRsZXMgKGluZGl2aWR1YWwgYXRvbWljIG9wZXJhdGlvbnMgYnkgdGhlCisgKiBmaWxlc3lzdGVtKS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvamJkLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorCisvKgorICogZ2V0X3RyYW5zYWN0aW9uOiBvYnRhaW4gYSBuZXcgdHJhbnNhY3Rpb25fdCBvYmplY3QuCisgKgorICogU2ltcGx5IGFsbG9jYXRlIGFuZCBpbml0aWFsaXNlIGEgbmV3IHRyYW5zYWN0aW9uLiAgQ3JlYXRlIGl0IGluCisgKiBSVU5OSU5HIHN0YXRlIGFuZCBhZGQgaXQgdG8gdGhlIGN1cnJlbnQgam91cm5hbCAod2hpY2ggc2hvdWxkIG5vdAorICogaGF2ZSBhbiBleGlzdGluZyBydW5uaW5nIHRyYW5zYWN0aW9uOiB3ZSBvbmx5IG1ha2UgYSBuZXcgdHJhbnNhY3Rpb24KKyAqIG9uY2Ugd2UgaGF2ZSBzdGFydGVkIHRvIGNvbW1pdCB0aGUgb2xkIG9uZSkuCisgKgorICogUHJlY29uZGl0aW9uczoKKyAqCVRoZSBqb3VybmFsIE1VU1QgYmUgbG9ja2VkLiAgV2UgZG9uJ3QgcGVyZm9ybSBhdG9taWMgbWFsbG9jcyBvbiB0aGUKKyAqCW5ldyB0cmFuc2FjdGlvbglhbmQgd2UgY2FuJ3QgYmxvY2sgd2l0aG91dCBwcm90ZWN0aW5nIGFnYWluc3Qgb3RoZXIKKyAqCXByb2Nlc3NlcyB0cnlpbmcgdG8gdG91Y2ggdGhlIGpvdXJuYWwgd2hpbGUgaXQgaXMgaW4gdHJhbnNpdGlvbi4KKyAqCisgKiBDYWxsZWQgdW5kZXIgal9zdGF0ZV9sb2NrCisgKi8KKworc3RhdGljIHRyYW5zYWN0aW9uX3QgKgorZ2V0X3RyYW5zYWN0aW9uKGpvdXJuYWxfdCAqam91cm5hbCwgdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24pCit7CisJdHJhbnNhY3Rpb24tPnRfam91cm5hbCA9IGpvdXJuYWw7CisJdHJhbnNhY3Rpb24tPnRfc3RhdGUgPSBUX1JVTk5JTkc7CisJdHJhbnNhY3Rpb24tPnRfdGlkID0gam91cm5hbC0+al90cmFuc2FjdGlvbl9zZXF1ZW5jZSsrOworCXRyYW5zYWN0aW9uLT50X2V4cGlyZXMgPSBqaWZmaWVzICsgam91cm5hbC0+al9jb21taXRfaW50ZXJ2YWw7CisJc3Bpbl9sb2NrX2luaXQoJnRyYW5zYWN0aW9uLT50X2hhbmRsZV9sb2NrKTsKKworCS8qIFNldCB1cCB0aGUgY29tbWl0IHRpbWVyIGZvciB0aGUgbmV3IHRyYW5zYWN0aW9uLiAqLworCWpvdXJuYWwtPmpfY29tbWl0X3RpbWVyLT5leHBpcmVzID0gdHJhbnNhY3Rpb24tPnRfZXhwaXJlczsKKwlhZGRfdGltZXIoam91cm5hbC0+al9jb21taXRfdGltZXIpOworCisJSl9BU1NFUlQoam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uID09IE5VTEwpOworCWpvdXJuYWwtPmpfcnVubmluZ190cmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uOworCisJcmV0dXJuIHRyYW5zYWN0aW9uOworfQorCisvKgorICogSGFuZGxlIG1hbmFnZW1lbnQuCisgKgorICogQSBoYW5kbGVfdCBpcyBhbiBvYmplY3Qgd2hpY2ggcmVwcmVzZW50cyBhIHNpbmdsZSBhdG9taWMgdXBkYXRlIHRvIGEKKyAqIGZpbGVzeXN0ZW0sIGFuZCB3aGljaCB0cmFja3MgYWxsIG9mIHRoZSBtb2RpZmljYXRpb25zIHdoaWNoIGZvcm0gcGFydAorICogb2YgdGhhdCBvbmUgdXBkYXRlLgorICovCisKKy8qCisgKiBzdGFydF90aGlzX2hhbmRsZTogR2l2ZW4gYSBoYW5kbGUsIGRlYWwgd2l0aCBhbnkgbG9ja2luZyBvciBzdGFsbGluZworICogbmVlZGVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXJlIGlzIGVub3VnaCBqb3VybmFsIHNwYWNlIGZvciB0aGUgaGFuZGxlCisgKiB0byBiZWdpbi4gIEF0dGFjaCB0aGUgaGFuZGxlIHRvIGEgdHJhbnNhY3Rpb24gYW5kIHNldCB1cCB0aGUKKyAqIHRyYW5zYWN0aW9uJ3MgYnVmZmVyIGNyZWRpdHMuICAKKyAqLworCitzdGF0aWMgaW50IHN0YXJ0X3RoaXNfaGFuZGxlKGpvdXJuYWxfdCAqam91cm5hbCwgaGFuZGxlX3QgKmhhbmRsZSkKK3sKKwl0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbjsKKwlpbnQgbmVlZGVkOworCWludCBuYmxvY2tzID0gaGFuZGxlLT5oX2J1ZmZlcl9jcmVkaXRzOworCXRyYW5zYWN0aW9uX3QgKm5ld190cmFuc2FjdGlvbiA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwlpZiAobmJsb2NrcyA+IGpvdXJuYWwtPmpfbWF4X3RyYW5zYWN0aW9uX2J1ZmZlcnMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJKQkQ6ICVzIHdhbnRzIHRvbyBtYW55IGNyZWRpdHMgKCVkID4gJWQpXG4iLAorCQkgICAgICAgY3VycmVudC0+Y29tbSwgbmJsb2NrcywKKwkJICAgICAgIGpvdXJuYWwtPmpfbWF4X3RyYW5zYWN0aW9uX2J1ZmZlcnMpOworCQlyZXQgPSAtRU5PU1BDOworCQlnb3RvIG91dDsKKwl9CisKK2FsbG9jX3RyYW5zYWN0aW9uOgorCWlmICgham91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uKSB7CisJCW5ld190cmFuc2FjdGlvbiA9IGpiZF9rbWFsbG9jKHNpemVvZigqbmV3X3RyYW5zYWN0aW9uKSwKKwkJCQkJCUdGUF9OT0ZTKTsKKwkJaWYgKCFuZXdfdHJhbnNhY3Rpb24pIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCQltZW1zZXQobmV3X3RyYW5zYWN0aW9uLCAwLCBzaXplb2YoKm5ld190cmFuc2FjdGlvbikpOworCX0KKworCWpiZF9kZWJ1ZygzLCAiTmV3IGhhbmRsZSAlcCBnb2luZyBsaXZlLlxuIiwgaGFuZGxlKTsKKworcmVwZWF0OgorCisJLyoKKwkgKiBXZSBuZWVkIHRvIGhvbGQgal9zdGF0ZV9sb2NrIHVudGlsIHRfdXBkYXRlcyBoYXMgYmVlbiBpbmNyZW1lbnRlZCwKKwkgKiBmb3IgcHJvcGVyIGpvdXJuYWwgYmFycmllciBoYW5kbGluZworCSAqLworCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKK3JlcGVhdF9sb2NrZWQ6CisJaWYgKGlzX2pvdXJuYWxfYWJvcnRlZChqb3VybmFsKSB8fAorCSAgICAoam91cm5hbC0+al9lcnJubyAhPSAwICYmICEoam91cm5hbC0+al9mbGFncyAmIEpGU19BQ0tfRVJSKSkpIHsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJCXJldCA9IC1FUk9GUzsgCisJCWdvdG8gb3V0OworCX0KKworCS8qIFdhaXQgb24gdGhlIGpvdXJuYWwncyB0cmFuc2FjdGlvbiBiYXJyaWVyIGlmIG5lY2Vzc2FyeSAqLworCWlmIChqb3VybmFsLT5qX2JhcnJpZXJfY291bnQpIHsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJCXdhaXRfZXZlbnQoam91cm5hbC0+al93YWl0X3RyYW5zYWN0aW9uX2xvY2tlZCwKKwkJCQlqb3VybmFsLT5qX2JhcnJpZXJfY291bnQgPT0gMCk7CisJCWdvdG8gcmVwZWF0OworCX0KKworCWlmICgham91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uKSB7CisJCWlmICghbmV3X3RyYW5zYWN0aW9uKSB7CisJCQlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJCWdvdG8gYWxsb2NfdHJhbnNhY3Rpb247CisJCX0KKwkJZ2V0X3RyYW5zYWN0aW9uKGpvdXJuYWwsIG5ld190cmFuc2FjdGlvbik7CisJCW5ld190cmFuc2FjdGlvbiA9IE5VTEw7CisJfQorCisJdHJhbnNhY3Rpb24gPSBqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb247CisKKwkvKgorCSAqIElmIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGlzIGxvY2tlZCBkb3duIGZvciBjb21taXQsIHdhaXQgZm9yIHRoZQorCSAqIGxvY2sgdG8gYmUgcmVsZWFzZWQuCisJICovCisJaWYgKHRyYW5zYWN0aW9uLT50X3N0YXRlID09IFRfTE9DS0VEKSB7CisJCURFRklORV9XQUlUKHdhaXQpOworCisJCXByZXBhcmVfdG9fd2FpdCgmam91cm5hbC0+al93YWl0X3RyYW5zYWN0aW9uX2xvY2tlZCwKKwkJCQkJJndhaXQsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJCXNjaGVkdWxlKCk7CisJCWZpbmlzaF93YWl0KCZqb3VybmFsLT5qX3dhaXRfdHJhbnNhY3Rpb25fbG9ja2VkLCAmd2FpdCk7CisJCWdvdG8gcmVwZWF0OworCX0KKworCS8qCisJICogSWYgdGhlcmUgaXMgbm90IGVub3VnaCBzcGFjZSBsZWZ0IGluIHRoZSBsb2cgdG8gd3JpdGUgYWxsIHBvdGVudGlhbAorCSAqIGJ1ZmZlcnMgcmVxdWVzdGVkIGJ5IHRoaXMgb3BlcmF0aW9uLCB3ZSBuZWVkIHRvIHN0YWxsIHBlbmRpbmcgYSBsb2cKKwkgKiBjaGVja3BvaW50IHRvIGZyZWUgc29tZSBtb3JlIGxvZyBzcGFjZS4KKwkgKi8KKwlzcGluX2xvY2soJnRyYW5zYWN0aW9uLT50X2hhbmRsZV9sb2NrKTsKKwluZWVkZWQgPSB0cmFuc2FjdGlvbi0+dF9vdXRzdGFuZGluZ19jcmVkaXRzICsgbmJsb2NrczsKKworCWlmIChuZWVkZWQgPiBqb3VybmFsLT5qX21heF90cmFuc2FjdGlvbl9idWZmZXJzKSB7CisJCS8qCisJCSAqIElmIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGlzIGFscmVhZHkgdG9vIGxhcmdlLCB0aGVuIHN0YXJ0CisJCSAqIHRvIGNvbW1pdCBpdDogd2UgY2FuIHRoZW4gZ28gYmFjayBhbmQgYXR0YWNoIHRoaXMgaGFuZGxlIHRvCisJCSAqIGEgbmV3IHRyYW5zYWN0aW9uLgorCQkgKi8KKwkJREVGSU5FX1dBSVQod2FpdCk7CisKKwkJamJkX2RlYnVnKDIsICJIYW5kbGUgJXAgc3RhcnRpbmcgbmV3IGNvbW1pdC4uLlxuIiwgaGFuZGxlKTsKKwkJc3Bpbl91bmxvY2soJnRyYW5zYWN0aW9uLT50X2hhbmRsZV9sb2NrKTsKKwkJcHJlcGFyZV90b193YWl0KCZqb3VybmFsLT5qX3dhaXRfdHJhbnNhY3Rpb25fbG9ja2VkLCAmd2FpdCwKKwkJCQlUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCV9fbG9nX3N0YXJ0X2NvbW1pdChqb3VybmFsLCB0cmFuc2FjdGlvbi0+dF90aWQpOworCQlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJc2NoZWR1bGUoKTsKKwkJZmluaXNoX3dhaXQoJmpvdXJuYWwtPmpfd2FpdF90cmFuc2FjdGlvbl9sb2NrZWQsICZ3YWl0KTsKKwkJZ290byByZXBlYXQ7CisJfQorCisJLyogCisJICogVGhlIGNvbW1pdCBjb2RlIGFzc3VtZXMgdGhhdCBpdCBjYW4gZ2V0IGVub3VnaCBsb2cgc3BhY2UKKwkgKiB3aXRob3V0IGZvcmNpbmcgYSBjaGVja3BvaW50LiAgVGhpcyBpcyAqY3JpdGljYWwqIGZvcgorCSAqIGNvcnJlY3RuZXNzOiBhIGNoZWNrcG9pbnQgb2YgYSBidWZmZXIgd2hpY2ggaXMgYWxzbworCSAqIGFzc29jaWF0ZWQgd2l0aCBhIGNvbW1pdHRpbmcgdHJhbnNhY3Rpb24gY3JlYXRlcyBhIGRlYWRsb2NrLAorCSAqIHNvIGNvbW1pdCBzaW1wbHkgY2Fubm90IGZvcmNlIHRocm91Z2ggY2hlY2twb2ludHMuCisJICoKKwkgKiBXZSBtdXN0IHRoZXJlZm9yZSBlbnN1cmUgdGhlIG5lY2Vzc2FyeSBzcGFjZSBpbiB0aGUgam91cm5hbAorCSAqICpiZWZvcmUqIHN0YXJ0aW5nIHRvIGRpcnR5IHBvdGVudGlhbGx5IGNoZWNrcG9pbnRlZCBidWZmZXJzCisJICogaW4gdGhlIG5ldyB0cmFuc2FjdGlvbi4gCisJICoKKwkgKiBUaGUgd29yc3QgcGFydCBpcywgYW55IHRyYW5zYWN0aW9uIGN1cnJlbnRseSBjb21taXR0aW5nIGNhbgorCSAqIHJlZHVjZSB0aGUgZnJlZSBzcGFjZSBhcmJpdHJhcmlseS4gIEJlIGNhcmVmdWwgdG8gYWNjb3VudCBmb3IKKwkgKiB0aG9zZSBidWZmZXJzIHdoZW4gY2hlY2twb2ludGluZy4KKwkgKi8KKworCS8qCisJICogQEBAIEFLUE06IFRoaXMgc2VlbXMgcmF0aGVyIG92ZXItZGVmZW5zaXZlLiAgV2UncmUgZ2l2aW5nIGNvbW1pdAorCSAqIGEgX2xvdF8gb2YgaGVhZHJvb206IDEvNCBvZiB0aGUgam91cm5hbCBwbHVzIHRoZSBzaXplIG9mCisJICogdGhlIGNvbW1pdHRpbmcgdHJhbnNhY3Rpb24uICBSZWFsbHksIHdlIG9ubHkgbmVlZCB0byBnaXZlIGl0CisJICogY29tbWl0dGluZ190cmFuc2FjdGlvbi0+dF9vdXRzdGFuZGluZ19jcmVkaXRzIHBsdXMgImVub3VnaCIgZm9yCisJICogdGhlIGxvZyBjb250cm9sIGJsb2Nrcy4KKwkgKiBBbHNvLCB0aGlzIHRlc3QgaXMgaW5jb25zaXRlbnQgd2l0aCB0aGUgbWF0Y2hpbmcgb25lIGluCisJICogam91cm5hbF9leHRlbmQoKS4KKwkgKi8KKwlpZiAoX19sb2dfc3BhY2VfbGVmdChqb3VybmFsKSA8IGpiZF9zcGFjZV9uZWVkZWQoam91cm5hbCkpIHsKKwkJamJkX2RlYnVnKDIsICJIYW5kbGUgJXAgd2FpdGluZyBmb3IgY2hlY2twb2ludC4uLlxuIiwgaGFuZGxlKTsKKwkJc3Bpbl91bmxvY2soJnRyYW5zYWN0aW9uLT50X2hhbmRsZV9sb2NrKTsKKwkJX19sb2dfd2FpdF9mb3Jfc3BhY2Uoam91cm5hbCk7CisJCWdvdG8gcmVwZWF0X2xvY2tlZDsKKwl9CisKKwkvKiBPSywgYWNjb3VudCBmb3IgdGhlIGJ1ZmZlcnMgdGhhdCB0aGlzIG9wZXJhdGlvbiBleHBlY3RzIHRvCisJICogdXNlIGFuZCBhZGQgdGhlIGhhbmRsZSB0byB0aGUgcnVubmluZyB0cmFuc2FjdGlvbi4gKi8KKworCWhhbmRsZS0+aF90cmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uOworCXRyYW5zYWN0aW9uLT50X291dHN0YW5kaW5nX2NyZWRpdHMgKz0gbmJsb2NrczsKKwl0cmFuc2FjdGlvbi0+dF91cGRhdGVzKys7CisJdHJhbnNhY3Rpb24tPnRfaGFuZGxlX2NvdW50Kys7CisJamJkX2RlYnVnKDQsICJIYW5kbGUgJXAgZ2l2ZW4gJWQgY3JlZGl0cyAodG90YWwgJWQsIGZyZWUgJWQpXG4iLAorCQkgIGhhbmRsZSwgbmJsb2NrcywgdHJhbnNhY3Rpb24tPnRfb3V0c3RhbmRpbmdfY3JlZGl0cywKKwkJICBfX2xvZ19zcGFjZV9sZWZ0KGpvdXJuYWwpKTsKKwlzcGluX3VubG9jaygmdHJhbnNhY3Rpb24tPnRfaGFuZGxlX2xvY2spOworCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworb3V0OgorCWlmIChuZXdfdHJhbnNhY3Rpb24pCisJCWtmcmVlKG5ld190cmFuc2FjdGlvbik7CisJcmV0dXJuIHJldDsKK30KKworLyogQWxsb2NhdGUgYSBuZXcgaGFuZGxlLiAgVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgaW4gYSBzbGFiLi4uICovCitzdGF0aWMgaGFuZGxlX3QgKm5ld19oYW5kbGUoaW50IG5ibG9ja3MpCit7CisJaGFuZGxlX3QgKmhhbmRsZSA9IGpiZF9hbGxvY19oYW5kbGUoR0ZQX05PRlMpOworCWlmICghaGFuZGxlKQorCQlyZXR1cm4gTlVMTDsKKwltZW1zZXQoaGFuZGxlLCAwLCBzaXplb2YoKmhhbmRsZSkpOworCWhhbmRsZS0+aF9idWZmZXJfY3JlZGl0cyA9IG5ibG9ja3M7CisJaGFuZGxlLT5oX3JlZiA9IDE7CisKKwlyZXR1cm4gaGFuZGxlOworfQorCisvKioKKyAqIGhhbmRsZV90ICpqb3VybmFsX3N0YXJ0KCkgLSBPYnRhaW4gYSBuZXcgaGFuZGxlLiAgCisgKiBAam91cm5hbDogSm91cm5hbCB0byBzdGFydCB0cmFuc2FjdGlvbiBvbi4KKyAqIEBuYmxvY2tzOiBudW1iZXIgb2YgYmxvY2sgYnVmZmVyIHdlIG1pZ2h0IG1vZGlmeQorICoKKyAqIFdlIG1ha2Ugc3VyZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBjYW4gZ3VhcmFudGVlIGF0IGxlYXN0IG5ibG9ja3Mgb2YKKyAqIG1vZGlmaWVkIGJ1ZmZlcnMgaW4gdGhlIGxvZy4gIFdlIGJsb2NrIHVudGlsIHRoZSBsb2cgY2FuIGd1YXJhbnRlZQorICogdGhhdCBtdWNoIHNwYWNlLiAgCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB2aXNpYmxlIHRvIGpvdXJuYWwgdXNlcnMgKGxpa2UgZXh0M2ZzKSwgc28gaXMgbm90CisgKiBjYWxsZWQgd2l0aCB0aGUgam91cm5hbCBhbHJlYWR5IGxvY2tlZC4KKyAqCisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIGEgbmV3bHkgYWxsb2NhdGVkIGhhbmRsZSwgb3IgTlVMTCBvbiBmYWlsdXJlCisgKi8KK2hhbmRsZV90ICpqb3VybmFsX3N0YXJ0KGpvdXJuYWxfdCAqam91cm5hbCwgaW50IG5ibG9ja3MpCit7CisJaGFuZGxlX3QgKmhhbmRsZSA9IGpvdXJuYWxfY3VycmVudF9oYW5kbGUoKTsKKwlpbnQgZXJyOworCisJaWYgKCFqb3VybmFsKQorCQlyZXR1cm4gRVJSX1BUUigtRVJPRlMpOworCisJaWYgKGhhbmRsZSkgeworCQlKX0FTU0VSVChoYW5kbGUtPmhfdHJhbnNhY3Rpb24tPnRfam91cm5hbCA9PSBqb3VybmFsKTsKKwkJaGFuZGxlLT5oX3JlZisrOworCQlyZXR1cm4gaGFuZGxlOworCX0KKworCWhhbmRsZSA9IG5ld19oYW5kbGUobmJsb2Nrcyk7CisJaWYgKCFoYW5kbGUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJY3VycmVudC0+am91cm5hbF9pbmZvID0gaGFuZGxlOworCisJZXJyID0gc3RhcnRfdGhpc19oYW5kbGUoam91cm5hbCwgaGFuZGxlKTsKKwlpZiAoZXJyIDwgMCkgeworCQlqYmRfZnJlZV9oYW5kbGUoaGFuZGxlKTsKKwkJY3VycmVudC0+am91cm5hbF9pbmZvID0gTlVMTDsKKwkJaGFuZGxlID0gRVJSX1BUUihlcnIpOworCX0KKwlyZXR1cm4gaGFuZGxlOworfQorCisvKioKKyAqIGludCBqb3VybmFsX2V4dGVuZCgpIC0gZXh0ZW5kIGJ1ZmZlciBjcmVkaXRzLgorICogQGhhbmRsZTogIGhhbmRsZSB0byAnZXh0ZW5kJworICogQG5ibG9ja3M6IG5yIGJsb2NrcyB0byB0cnkgdG8gZXh0ZW5kIGJ5LgorICogCisgKiBTb21lIHRyYW5zYWN0aW9ucywgc3VjaCBhcyBsYXJnZSBleHRlbmRzIGFuZCB0cnVuY2F0ZXMsIGNhbiBiZSBkb25lCisgKiBhdG9taWNhbGx5IGFsbCBhdCBvbmNlIG9yIGluIHNldmVyYWwgc3RhZ2VzLiAgVGhlIG9wZXJhdGlvbiByZXF1ZXN0cworICogYSBjcmVkaXQgZm9yIGEgbnVtYmVyIG9mIGJ1ZmZlciBtb2RpY2F0aW9ucyBpbiBhZHZhbmNlLCBidXQgY2FuCisgKiBleHRlbmQgaXRzIGNyZWRpdCBpZiBpdCBuZWVkcyBtb3JlLiAgCisgKgorICogam91cm5hbF9leHRlbmQgdHJpZXMgdG8gZ2l2ZSB0aGUgcnVubmluZyBoYW5kbGUgbW9yZSBidWZmZXIgY3JlZGl0cy4KKyAqIEl0IGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0IGFsbG9jYXRpb24gLSB0aGlzIGlzIGEgYmVzdC1lZmZvcnQgb25seS4KKyAqIFRoZSBjYWxsaW5nIHByb2Nlc3MgTVVTVCBiZSBhYmxlIHRvIGRlYWwgY2xlYW5seSB3aXRoIGEgZmFpbHVyZSB0bworICogZXh0ZW5kIGhlcmUuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2Vzcywgbm9uLXplcm8gb24gZmFpbHVyZS4KKyAqCisgKiByZXR1cm4gY29kZSA8IDAgaW1wbGllcyBhbiBlcnJvcgorICogcmV0dXJuIGNvZGUgPiAwIGltcGxpZXMgbm9ybWFsIHRyYW5zYWN0aW9uLWZ1bGwgc3RhdHVzLgorICovCitpbnQgam91cm5hbF9leHRlbmQoaGFuZGxlX3QgKmhhbmRsZSwgaW50IG5ibG9ja3MpCit7CisJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24gPSBoYW5kbGUtPmhfdHJhbnNhY3Rpb247CisJam91cm5hbF90ICpqb3VybmFsID0gdHJhbnNhY3Rpb24tPnRfam91cm5hbDsKKwlpbnQgcmVzdWx0OworCWludCB3YW50ZWQ7CisKKwlyZXN1bHQgPSAtRUlPOworCWlmIChpc19oYW5kbGVfYWJvcnRlZChoYW5kbGUpKQorCQlnb3RvIG91dDsKKworCXJlc3VsdCA9IDE7CisKKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisKKwkvKiBEb24ndCBleHRlbmQgYSBsb2NrZWQtZG93biB0cmFuc2FjdGlvbiEgKi8KKwlpZiAoaGFuZGxlLT5oX3RyYW5zYWN0aW9uLT50X3N0YXRlICE9IFRfUlVOTklORykgeworCQlqYmRfZGVidWcoMywgImRlbmllZCBoYW5kbGUgJXAgJWQgYmxvY2tzOiAiCisJCQkgICJ0cmFuc2FjdGlvbiBub3QgcnVubmluZ1xuIiwgaGFuZGxlLCBuYmxvY2tzKTsKKwkJZ290byBlcnJvcl9vdXQ7CisJfQorCisJc3Bpbl9sb2NrKCZ0cmFuc2FjdGlvbi0+dF9oYW5kbGVfbG9jayk7CisJd2FudGVkID0gdHJhbnNhY3Rpb24tPnRfb3V0c3RhbmRpbmdfY3JlZGl0cyArIG5ibG9ja3M7CisKKwlpZiAod2FudGVkID4gam91cm5hbC0+al9tYXhfdHJhbnNhY3Rpb25fYnVmZmVycykgeworCQlqYmRfZGVidWcoMywgImRlbmllZCBoYW5kbGUgJXAgJWQgYmxvY2tzOiAiCisJCQkgICJ0cmFuc2FjdGlvbiB0b28gbGFyZ2VcbiIsIGhhbmRsZSwgbmJsb2Nrcyk7CisJCWdvdG8gdW5sb2NrOworCX0KKworCWlmICh3YW50ZWQgPiBfX2xvZ19zcGFjZV9sZWZ0KGpvdXJuYWwpKSB7CisJCWpiZF9kZWJ1ZygzLCAiZGVuaWVkIGhhbmRsZSAlcCAlZCBibG9ja3M6ICIKKwkJCSAgImluc3VmZmljaWVudCBsb2cgc3BhY2VcbiIsIGhhbmRsZSwgbmJsb2Nrcyk7CisJCWdvdG8gdW5sb2NrOworCX0KKworCWhhbmRsZS0+aF9idWZmZXJfY3JlZGl0cyArPSBuYmxvY2tzOworCXRyYW5zYWN0aW9uLT50X291dHN0YW5kaW5nX2NyZWRpdHMgKz0gbmJsb2NrczsKKwlyZXN1bHQgPSAwOworCisJamJkX2RlYnVnKDMsICJleHRlbmRlZCBoYW5kbGUgJXAgYnkgJWRcbiIsIGhhbmRsZSwgbmJsb2Nrcyk7Cit1bmxvY2s6CisJc3Bpbl91bmxvY2soJnRyYW5zYWN0aW9uLT50X2hhbmRsZV9sb2NrKTsKK2Vycm9yX291dDoKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qKgorICogaW50IGpvdXJuYWxfcmVzdGFydCgpIC0gcmVzdGFydCBhIGhhbmRsZSAuCisgKiBAaGFuZGxlOiAgaGFuZGxlIHRvIHJlc3RhcnQKKyAqIEBuYmxvY2tzOiBuciBjcmVkaXRzIHJlcXVlc3RlZAorICogCisgKiBSZXN0YXJ0IGEgaGFuZGxlIGZvciBhIG11bHRpLXRyYW5zYWN0aW9uIGZpbGVzeXN0ZW0KKyAqIG9wZXJhdGlvbi4KKyAqCisgKiBJZiB0aGUgam91cm5hbF9leHRlbmQoKSBjYWxsIGFib3ZlIGZhaWxzIHRvIGdyYW50IG5ldyBidWZmZXIgY3JlZGl0cworICogdG8gYSBydW5uaW5nIGhhbmRsZSwgYSBjYWxsIHRvIGpvdXJuYWxfcmVzdGFydCB3aWxsIGNvbW1pdCB0aGUKKyAqIGhhbmRsZSdzIHRyYW5zYWN0aW9uIHNvIGZhciBhbmQgcmVhdHRhY2ggdGhlIGhhbmRsZSB0byBhIG5ldworICogdHJhbnNhY3Rpb24gY2FwYWJhYmxlIG9mIGd1YXJhbnRlZWluZyB0aGUgcmVxdWVzdGVkIG51bWJlciBvZgorICogY3JlZGl0cy4KKyAqLworCitpbnQgam91cm5hbF9yZXN0YXJ0KGhhbmRsZV90ICpoYW5kbGUsIGludCBuYmxvY2tzKQoreworCXRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uID0gaGFuZGxlLT5oX3RyYW5zYWN0aW9uOworCWpvdXJuYWxfdCAqam91cm5hbCA9IHRyYW5zYWN0aW9uLT50X2pvdXJuYWw7CisJaW50IHJldDsKKworCS8qIElmIHdlJ3ZlIGhhZCBhbiBhYm9ydCBvZiBhbnkgdHlwZSwgZG9uJ3QgZXZlbiB0aGluayBhYm91dAorCSAqIGFjdHVhbGx5IGRvaW5nIHRoZSByZXN0YXJ0ISAqLworCWlmIChpc19oYW5kbGVfYWJvcnRlZChoYW5kbGUpKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogRmlyc3QgdW5saW5rIHRoZSBoYW5kbGUgZnJvbSBpdHMgY3VycmVudCB0cmFuc2FjdGlvbiwgYW5kIHN0YXJ0IHRoZQorCSAqIGNvbW1pdCBvbiB0aGF0LgorCSAqLworCUpfQVNTRVJUKHRyYW5zYWN0aW9uLT50X3VwZGF0ZXMgPiAwKTsKKwlKX0FTU0VSVChqb3VybmFsX2N1cnJlbnRfaGFuZGxlKCkgPT0gaGFuZGxlKTsKKworCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwlzcGluX2xvY2soJnRyYW5zYWN0aW9uLT50X2hhbmRsZV9sb2NrKTsKKwl0cmFuc2FjdGlvbi0+dF9vdXRzdGFuZGluZ19jcmVkaXRzIC09IGhhbmRsZS0+aF9idWZmZXJfY3JlZGl0czsKKwl0cmFuc2FjdGlvbi0+dF91cGRhdGVzLS07CisKKwlpZiAoIXRyYW5zYWN0aW9uLT50X3VwZGF0ZXMpCisJCXdha2VfdXAoJmpvdXJuYWwtPmpfd2FpdF91cGRhdGVzKTsKKwlzcGluX3VubG9jaygmdHJhbnNhY3Rpb24tPnRfaGFuZGxlX2xvY2spOworCisJamJkX2RlYnVnKDIsICJyZXN0YXJ0aW5nIGhhbmRsZSAlcFxuIiwgaGFuZGxlKTsKKwlfX2xvZ19zdGFydF9jb21taXQoam91cm5hbCwgdHJhbnNhY3Rpb24tPnRfdGlkKTsKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKworCWhhbmRsZS0+aF9idWZmZXJfY3JlZGl0cyA9IG5ibG9ja3M7CisJcmV0ID0gc3RhcnRfdGhpc19oYW5kbGUoam91cm5hbCwgaGFuZGxlKTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qKgorICogdm9pZCBqb3VybmFsX2xvY2tfdXBkYXRlcyAoKSAtIGVzdGFibGlzaCBhIHRyYW5zYWN0aW9uIGJhcnJpZXIuCisgKiBAam91cm5hbDogIEpvdXJuYWwgdG8gZXN0YWJsaXNoIGEgYmFycmllciBvbi4KKyAqCisgKiBUaGlzIGxvY2tzIG91dCBhbnkgZnVydGhlciB1cGRhdGVzIGZyb20gYmVpbmcgc3RhcnRlZCwgYW5kIGJsb2NrcworICogdW50aWwgYWxsIGV4aXN0aW5nIHVwZGF0ZXMgaGF2ZSBjb21wbGV0ZWQsIHJldHVybmluZyBvbmx5IG9uY2UgdGhlCisgKiBqb3VybmFsIGlzIGluIGEgcXVpZXNjZW50IHN0YXRlIHdpdGggbm8gdXBkYXRlcyBydW5uaW5nLgorICoKKyAqIFRoZSBqb3VybmFsIGxvY2sgc2hvdWxkIG5vdCBiZSBoZWxkIG9uIGVudHJ5LgorICovCit2b2lkIGpvdXJuYWxfbG9ja191cGRhdGVzKGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwlERUZJTkVfV0FJVCh3YWl0KTsKKworCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkrK2pvdXJuYWwtPmpfYmFycmllcl9jb3VudDsKKworCS8qIFdhaXQgdW50aWwgdGhlcmUgYXJlIG5vIHJ1bm5pbmcgdXBkYXRlcyAqLworCXdoaWxlICgxKSB7CisJCXRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uID0gam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uOworCisJCWlmICghdHJhbnNhY3Rpb24pCisJCQlicmVhazsKKworCQlzcGluX2xvY2soJnRyYW5zYWN0aW9uLT50X2hhbmRsZV9sb2NrKTsKKwkJaWYgKCF0cmFuc2FjdGlvbi0+dF91cGRhdGVzKSB7CisJCQlzcGluX3VubG9jaygmdHJhbnNhY3Rpb24tPnRfaGFuZGxlX2xvY2spOworCQkJYnJlYWs7CisJCX0KKwkJcHJlcGFyZV90b193YWl0KCZqb3VybmFsLT5qX3dhaXRfdXBkYXRlcywgJndhaXQsCisJCQkJVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzcGluX3VubG9jaygmdHJhbnNhY3Rpb24tPnRfaGFuZGxlX2xvY2spOworCQlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJc2NoZWR1bGUoKTsKKwkJZmluaXNoX3dhaXQoJmpvdXJuYWwtPmpfd2FpdF91cGRhdGVzLCAmd2FpdCk7CisJCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisKKwkvKgorCSAqIFdlIGhhdmUgbm93IGVzdGFibGlzaGVkIGEgYmFycmllciBhZ2FpbnN0IG90aGVyIG5vcm1hbCB1cGRhdGVzLCBidXQKKwkgKiB3ZSBhbHNvIG5lZWQgdG8gYmFycmllciBhZ2FpbnN0IG90aGVyIGpvdXJuYWxfbG9ja191cGRhdGVzKCkgY2FsbHMKKwkgKiB0byBtYWtlIHN1cmUgdGhhdCB3ZSBzZXJpYWxpc2Ugc3BlY2lhbCBqb3VybmFsLWxvY2tlZCBvcGVyYXRpb25zCisJICogdG9vLgorCSAqLworCWRvd24oJmpvdXJuYWwtPmpfYmFycmllcik7Cit9CisKKy8qKgorICogdm9pZCBqb3VybmFsX3VubG9ja191cGRhdGVzIChqb3VybmFsX3QqIGpvdXJuYWwpIC0gcmVsZWFzZSBiYXJyaWVyCisgKiBAam91cm5hbDogIEpvdXJuYWwgdG8gcmVsZWFzZSB0aGUgYmFycmllciBvbi4KKyAqIAorICogUmVsZWFzZSBhIHRyYW5zYWN0aW9uIGJhcnJpZXIgb2J0YWluZWQgd2l0aCBqb3VybmFsX2xvY2tfdXBkYXRlcygpLgorICoKKyAqIFNob3VsZCBiZSBjYWxsZWQgd2l0aG91dCB0aGUgam91cm5hbCBsb2NrIGhlbGQuCisgKi8KK3ZvaWQgam91cm5hbF91bmxvY2tfdXBkYXRlcyAoam91cm5hbF90ICpqb3VybmFsKQoreworCUpfQVNTRVJUKGpvdXJuYWwtPmpfYmFycmllcl9jb3VudCAhPSAwKTsKKworCXVwKCZqb3VybmFsLT5qX2JhcnJpZXIpOworCXNwaW5fbG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwktLWpvdXJuYWwtPmpfYmFycmllcl9jb3VudDsKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwl3YWtlX3VwKCZqb3VybmFsLT5qX3dhaXRfdHJhbnNhY3Rpb25fbG9ja2VkKTsKK30KKworLyoKKyAqIFJlcG9ydCBhbnkgdW5leHBlY3RlZCBkaXJ0eSBidWZmZXJzIHdoaWNoIHR1cm4gdXAuICBOb3JtYWxseSB0aG9zZQorICogaW5kaWNhdGUgYW4gZXJyb3IsIGJ1dCB0aGV5IGNhbiBvY2N1ciBpZiB0aGUgdXNlciBpcyBydW5uaW5nIChzYXkpCisgKiB0dW5lMmZzIHRvIG1vZGlmeSB0aGUgbGl2ZSBmaWxlc3lzdGVtLCBzbyB3ZSBuZWVkIHRoZSBvcHRpb24gb2YKKyAqIGNvbnRpbnVpbmcgYXMgZ3JhY2VmdWxseSBhcyBwb3NzaWJsZS4gICMKKyAqCisgKiBUaGUgY2FsbGVyIHNob3VsZCBhbHJlYWR5IGhvbGQgdGhlIGpvdXJuYWwgbG9jayBhbmQKKyAqIGpfbGlzdF9sb2NrIHNwaW5sb2NrOiBtb3N0IGNhbGxlcnMgd2lsbCBuZWVkIHRob3NlIGFueXdheQorICogaW4gb3JkZXIgdG8gcHJvYmUgdGhlIGJ1ZmZlcidzIGpvdXJuYWxpbmcgc3RhdGUgc2FmZWx5LgorICovCitzdGF0aWMgdm9pZCBqYmRfdW5leHBlY3RlZF9kaXJ0eV9idWZmZXIoc3RydWN0IGpvdXJuYWxfaGVhZCAqamgpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGpoMmJoKGpoKTsKKwlpbnQgamxpc3Q7CisKKwlpZiAoYnVmZmVyX2RpcnR5KGJoKSkgeworCQkvKiBJZiB0aGlzIGJ1ZmZlciBpcyBvbmUgd2hpY2ggbWlnaHQgcmVhc29uYWJseSBiZSBkaXJ0eQorCQkgKiAtLS0gaWUuIGRhdGEsIG9yIG5vdCBwYXJ0IG9mIHRoaXMgam91cm5hbCAtLS0gdGhlbgorCQkgKiB3ZSdyZSBPSyB0byBsZWF2ZSBpdCBhbG9uZSwgYnV0IG90aGVyd2lzZSB3ZSBuZWVkIHRvCisJCSAqIG1vdmUgdGhlIGRpcnR5IGJpdCB0byB0aGUgam91cm5hbCdzIG93biBpbnRlcm5hbAorCQkgKiBKQkREaXJ0eSBiaXQuICovCisJCWpsaXN0ID0gamgtPmJfamxpc3Q7CisKKwkJaWYgKGpsaXN0ID09IEJKX01ldGFkYXRhIHx8IGpsaXN0ID09IEJKX1Jlc2VydmVkIHx8IAorCQkgICAgamxpc3QgPT0gQkpfU2hhZG93IHx8IGpsaXN0ID09IEJKX0ZvcmdldCkgeworCQkJaWYgKHRlc3RfY2xlYXJfYnVmZmVyX2RpcnR5KGpoMmJoKGpoKSkpIHsKKwkJCQlzZXRfYml0KEJIX0pCRERpcnR5LCAmamgyYmgoamgpLT5iX3N0YXRlKTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoKKyAqIElmIHRoZSBidWZmZXIgaXMgYWxyZWFkeSBwYXJ0IG9mIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLCB0aGVuIHRoZXJlCisgKiBpcyBub3RoaW5nIHdlIG5lZWQgdG8gZG8uICBJZiBpdCBpcyBhbHJlYWR5IHBhcnQgb2YgYSBwcmlvcgorICogdHJhbnNhY3Rpb24gd2hpY2ggd2UgYXJlIHN0aWxsIGNvbW1pdHRpbmcgdG8gZGlzaywgdGhlbiB3ZSBuZWVkIHRvCisgKiBtYWtlIHN1cmUgdGhhdCB3ZSBkbyBub3Qgb3ZlcndyaXRlIHRoZSBvbGQgY29weTogd2UgZG8gY29weS1vdXQgdG8KKyAqIHByZXNlcnZlIHRoZSBjb3B5IGdvaW5nIHRvIGRpc2suICBXZSBhbHNvIGFjY291bnQgdGhlIGJ1ZmZlciBhZ2FpbnN0CisgKiB0aGUgaGFuZGxlJ3MgbWV0YWRhdGEgYnVmZmVyIGNyZWRpdHMgKHVubGVzcyB0aGUgYnVmZmVyIGlzIGFscmVhZHkKKyAqIHBhcnQgb2YgdGhlIHRyYW5zYWN0aW9uLCB0aGF0IGlzKS4KKyAqCisgKi8KK3N0YXRpYyBpbnQKK2RvX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGpvdXJuYWxfaGVhZCAqamgsCisJCQlpbnQgZm9yY2VfY29weSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXRyYW5zYWN0aW9uX3QgKnRyYW5zYWN0aW9uOworCWpvdXJuYWxfdCAqam91cm5hbDsKKwlpbnQgZXJyb3I7CisJY2hhciAqZnJvemVuX2J1ZmZlciA9IE5VTEw7CisJaW50IG5lZWRfY29weSA9IDA7CisKKwlpZiAoaXNfaGFuZGxlX2Fib3J0ZWQoaGFuZGxlKSkKKwkJcmV0dXJuIC1FUk9GUzsKKworCXRyYW5zYWN0aW9uID0gaGFuZGxlLT5oX3RyYW5zYWN0aW9uOworCWpvdXJuYWwgPSB0cmFuc2FjdGlvbi0+dF9qb3VybmFsOworCisJamJkX2RlYnVnKDUsICJidWZmZXJfaGVhZCAlcCwgZm9yY2VfY29weSAlZFxuIiwgamgsIGZvcmNlX2NvcHkpOworCisJSkJVRkZFUl9UUkFDRShqaCwgImVudHJ5Iik7CityZXBlYXQ6CisJYmggPSBqaDJiaChqaCk7CisKKwkvKiBAQEAgTmVlZCB0byBjaGVjayBmb3IgZXJyb3JzIGhlcmUgYXQgc29tZSBwb2ludC4gKi8KKworCWxvY2tfYnVmZmVyKGJoKTsKKwlqYmRfbG9ja19iaF9zdGF0ZShiaCk7CisKKwkvKiBXZSBub3cgaG9sZCB0aGUgYnVmZmVyIGxvY2sgc28gaXQgaXMgc2FmZSB0byBxdWVyeSB0aGUgYnVmZmVyCisJICogc3RhdGUuICBJcyB0aGUgYnVmZmVyIGRpcnR5PyAKKwkgKiAKKwkgKiBJZiBzbywgdGhlcmUgYXJlIHR3byBwb3NzaWJpbGl0aWVzLiAgVGhlIGJ1ZmZlciBtYXkgYmUKKwkgKiBub24tam91cm5hbGVkLCBhbmQgdW5kZXJnb2luZyBhIHF1aXRlIGxlZ2l0aW1hdGUgd3JpdGViYWNrLgorCSAqIE90aGVyd2lzZSwgaXQgaXMgam91cm5hbGVkLCBhbmQgd2UgZG9uJ3QgZXhwZWN0IGRpcnR5IGJ1ZmZlcnMKKwkgKiBpbiB0aGF0IHN0YXRlICh0aGUgYnVmZmVycyBzaG91bGQgYmUgbWFya2VkIEpCRF9EaXJ0eQorCSAqIGluc3RlYWQuKSAgU28gZWl0aGVyIHRoZSBJTyBpcyBiZWluZyBkb25lIHVuZGVyIG91ciBvd24KKwkgKiBjb250cm9sIGFuZCB0aGlzIGlzIGEgYnVnLCBvciBpdCdzIGEgdGhpcmQgcGFydHkgSU8gc3VjaCBhcworCSAqIGR1bXAoOCkgKHdoaWNoIG1heSBsZWF2ZSB0aGUgYnVmZmVyIHNjaGVkdWxlZCBmb3IgcmVhZCAtLS0KKwkgKiBpZS4gbG9ja2VkIGJ1dCBub3QgZGlydHkpIG9yIHR1bmUyZnMgKHdoaWNoIG1heSBhY3R1YWxseSBoYXZlCisJICogdGhlIGJ1ZmZlciBkaXJ0aWVkLCB1Z2guKSAgKi8KKworCWlmIChidWZmZXJfZGlydHkoYmgpKSB7CisJCS8qCisJCSAqIEZpcnN0IHF1ZXN0aW9uOiBpcyB0aGlzIGJ1ZmZlciBhbHJlYWR5IHBhcnQgb2YgdGhlIGN1cnJlbnQKKwkJICogdHJhbnNhY3Rpb24gb3IgdGhlIGV4aXN0aW5nIGNvbW1pdHRpbmcgdHJhbnNhY3Rpb24/CisJCSAqLworCQlpZiAoamgtPmJfdHJhbnNhY3Rpb24pIHsKKwkJCUpfQVNTRVJUX0pIKGpoLAorCQkJCWpoLT5iX3RyYW5zYWN0aW9uID09IHRyYW5zYWN0aW9uIHx8IAorCQkJCWpoLT5iX3RyYW5zYWN0aW9uID09CisJCQkJCWpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbik7CisJCQlpZiAoamgtPmJfbmV4dF90cmFuc2FjdGlvbikKKwkJCQlKX0FTU0VSVF9KSChqaCwgamgtPmJfbmV4dF90cmFuc2FjdGlvbiA9PQorCQkJCQkJCXRyYW5zYWN0aW9uKTsKKwkJCUpCVUZGRVJfVFJBQ0UoamgsICJVbmV4cGVjdGVkIGRpcnR5IGJ1ZmZlciIpOworCQkJamJkX3VuZXhwZWN0ZWRfZGlydHlfYnVmZmVyKGpoKTsKKyAJCX0KKyAJfQorCisJdW5sb2NrX2J1ZmZlcihiaCk7CisKKwllcnJvciA9IC1FUk9GUzsKKwlpZiAoaXNfaGFuZGxlX2Fib3J0ZWQoaGFuZGxlKSkgeworCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKwkJZ290byBvdXQ7CisJfQorCWVycm9yID0gMDsKKworCS8qCisJICogVGhlIGJ1ZmZlciBpcyBhbHJlYWR5IHBhcnQgb2YgdGhpcyB0cmFuc2FjdGlvbiBpZiBiX3RyYW5zYWN0aW9uIG9yCisJICogYl9uZXh0X3RyYW5zYWN0aW9uIHBvaW50cyB0byBpdAorCSAqLworCWlmIChqaC0+Yl90cmFuc2FjdGlvbiA9PSB0cmFuc2FjdGlvbiB8fAorCSAgICBqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uID09IHRyYW5zYWN0aW9uKQorCQlnb3RvIGRvbmU7CisKKwkvKgorCSAqIElmIHRoZXJlIGlzIGFscmVhZHkgYSBjb3B5LW91dCB2ZXJzaW9uIG9mIHRoaXMgYnVmZmVyLCB0aGVuIHdlIGRvbid0CisJICogbmVlZCB0byBtYWtlIGFub3RoZXIgb25lCisJICovCisJaWYgKGpoLT5iX2Zyb3plbl9kYXRhKSB7CisJCUpCVUZGRVJfVFJBQ0UoamgsICJoYXMgZnJvemVuIGRhdGEiKTsKKwkJSl9BU1NFUlRfSkgoamgsIGpoLT5iX25leHRfdHJhbnNhY3Rpb24gPT0gTlVMTCk7CisJCWpoLT5iX25leHRfdHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbjsKKwkJZ290byBkb25lOworCX0KKworCS8qIElzIHRoZXJlIGRhdGEgaGVyZSB3ZSBuZWVkIHRvIHByZXNlcnZlPyAqLworCisJaWYgKGpoLT5iX3RyYW5zYWN0aW9uICYmIGpoLT5iX3RyYW5zYWN0aW9uICE9IHRyYW5zYWN0aW9uKSB7CisJCUpCVUZGRVJfVFJBQ0UoamgsICJvd25lZCBieSBvbGRlciB0cmFuc2FjdGlvbiIpOworCQlKX0FTU0VSVF9KSChqaCwgamgtPmJfbmV4dF90cmFuc2FjdGlvbiA9PSBOVUxMKTsKKwkJSl9BU1NFUlRfSkgoamgsIGpoLT5iX3RyYW5zYWN0aW9uID09CisJCQkJCWpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbik7CisKKwkJLyogVGhlcmUgaXMgb25lIGNhc2Ugd2UgaGF2ZSB0byBiZSB2ZXJ5IGNhcmVmdWwgYWJvdXQuCisJCSAqIElmIHRoZSBjb21taXR0aW5nIHRyYW5zYWN0aW9uIGlzIGN1cnJlbnRseSB3cml0aW5nCisJCSAqIHRoaXMgYnVmZmVyIG91dCB0byBkaXNrIGFuZCBoYXMgTk9UIG1hZGUgYSBjb3B5LW91dCwKKwkJICogdGhlbiB3ZSBjYW5ub3QgbW9kaWZ5IHRoZSBidWZmZXIgY29udGVudHMgYXQgYWxsCisJCSAqIHJpZ2h0IG5vdy4gIFRoZSBlc3NlbmNlIG9mIGNvcHktb3V0IGlzIHRoYXQgaXQgaXMgdGhlCisJCSAqIGV4dHJhIGNvcHksIG5vdCB0aGUgcHJpbWFyeSBjb3B5LCB3aGljaCBnZXRzCisJCSAqIGpvdXJuYWxlZC4gIElmIHRoZSBwcmltYXJ5IGNvcHkgaXMgYWxyZWFkeSBnb2luZyB0bworCQkgKiBkaXNrIHRoZW4gd2UgY2Fubm90IGRvIGNvcHktb3V0IGhlcmUuICovCisKKwkJaWYgKGpoLT5iX2psaXN0ID09IEJKX1NoYWRvdykgeworCQkJREVGSU5FX1dBSVRfQklUKHdhaXQsICZiaC0+Yl9zdGF0ZSwgQkhfVW5zaGFkb3cpOworCQkJd2FpdF9xdWV1ZV9oZWFkX3QgKndxaDsKKworCQkJd3FoID0gYml0X3dhaXRxdWV1ZSgmYmgtPmJfc3RhdGUsIEJIX1Vuc2hhZG93KTsKKworCQkJSkJVRkZFUl9UUkFDRShqaCwgIm9uIHNoYWRvdzogc2xlZXAiKTsKKwkJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQkJLyogY29tbWl0IHdha2VzIHVwIGFsbCBzaGFkb3cgYnVmZmVycyBhZnRlciBJTyAqLworCQkJZm9yICggOyA7ICkgeworCQkJCXByZXBhcmVfdG9fd2FpdCh3cWgsICZ3YWl0LndhaXQsCisJCQkJCQlUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQkJaWYgKGpoLT5iX2psaXN0ICE9IEJKX1NoYWRvdykKKwkJCQkJYnJlYWs7CisJCQkJc2NoZWR1bGUoKTsKKwkJCX0KKwkJCWZpbmlzaF93YWl0KHdxaCwgJndhaXQud2FpdCk7CisJCQlnb3RvIHJlcGVhdDsKKwkJfQorCisJCS8qIE9ubHkgZG8gdGhlIGNvcHkgaWYgdGhlIGN1cnJlbnRseS1vd25pbmcgdHJhbnNhY3Rpb24KKwkJICogc3RpbGwgbmVlZHMgaXQuICBJZiBpdCBpcyBvbiB0aGUgRm9yZ2V0IGxpc3QsIHRoZQorCQkgKiBjb21taXR0aW5nIHRyYW5zYWN0aW9uIGlzIHBhc3QgdGhhdCBzdGFnZS4gIFRoZQorCQkgKiBidWZmZXIgaGFkIGJldHRlciByZW1haW4gbG9ja2VkIGR1cmluZyB0aGUga21hbGxvYywKKwkJICogYnV0IHRoYXQgc2hvdWxkIGJlIHRydWUgLS0tIHdlIGhvbGQgdGhlIGpvdXJuYWwgbG9jaworCQkgKiBzdGlsbCBhbmQgdGhlIGJ1ZmZlciBpcyBhbHJlYWR5IG9uIHRoZSBCVUZfSk9VUk5BTAorCQkgKiBsaXN0IHNvIHdvbid0IGJlIGZsdXNoZWQuIAorCQkgKgorCQkgKiBTdWJ0bGUgcG9pbnQsIHRob3VnaDogaWYgdGhpcyBpcyBhIGdldF91bmRvX2FjY2VzcywKKwkJICogdGhlbiB3ZSB3aWxsIGJlIHJlbHlpbmcgb24gdGhlIGZyb3plbl9kYXRhIHRvIGNvbnRhaW4KKwkJICogdGhlIG5ldyB2YWx1ZSBvZiB0aGUgY29tbWl0dGVkX2RhdGEgcmVjb3JkIGFmdGVyIHRoZQorCQkgKiB0cmFuc2FjdGlvbiwgc28gd2UgSEFWRSB0byBmb3JjZSB0aGUgZnJvemVuX2RhdGEgY29weQorCQkgKiBpbiB0aGF0IGNhc2UuICovCisKKwkJaWYgKGpoLT5iX2psaXN0ICE9IEJKX0ZvcmdldCB8fCBmb3JjZV9jb3B5KSB7CisJCQlKQlVGRkVSX1RSQUNFKGpoLCAiZ2VuZXJhdGUgZnJvemVuIGRhdGEiKTsKKwkJCWlmICghZnJvemVuX2J1ZmZlcikgeworCQkJCUpCVUZGRVJfVFJBQ0UoamgsICJhbGxvY2F0ZSBtZW1vcnkgZm9yIGJ1ZmZlciIpOworCQkJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQkJCWZyb3plbl9idWZmZXIgPSBqYmRfa21hbGxvYyhqaDJiaChqaCktPmJfc2l6ZSwKKwkJCQkJCQkgICAgR0ZQX05PRlMpOworCQkJCWlmICghZnJvemVuX2J1ZmZlcikgeworCQkJCQlwcmludGsoS0VSTl9FTUVSRworCQkJCQkgICAgICAgIiVzOiBPT00gZm9yIGZyb3plbl9idWZmZXJcbiIsCisJCQkJCSAgICAgICBfX0ZVTkNUSU9OX18pOworCQkJCQlKQlVGRkVSX1RSQUNFKGpoLCAib29tISIpOworCQkJCQllcnJvciA9IC1FTk9NRU07CisJCQkJCWpiZF9sb2NrX2JoX3N0YXRlKGJoKTsKKwkJCQkJZ290byBkb25lOworCQkJCX0KKwkJCQlnb3RvIHJlcGVhdDsKKwkJCX0KKwkJCWpoLT5iX2Zyb3plbl9kYXRhID0gZnJvemVuX2J1ZmZlcjsKKwkJCWZyb3plbl9idWZmZXIgPSBOVUxMOworCQkJbmVlZF9jb3B5ID0gMTsKKwkJfQorCQlqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247CisJfQorCisKKwkvKgorCSAqIEZpbmFsbHksIGlmIHRoZSBidWZmZXIgaXMgbm90IGpvdXJuYWxlZCByaWdodCBub3csIHdlIG5lZWQgdG8gbWFrZQorCSAqIHN1cmUgaXQgZG9lc24ndCBnZXQgd3JpdHRlbiB0byBkaXNrIGJlZm9yZSB0aGUgY2FsbGVyIGFjdHVhbGx5CisJICogY29tbWl0cyB0aGUgbmV3IGRhdGEKKwkgKi8KKwlpZiAoIWpoLT5iX3RyYW5zYWN0aW9uKSB7CisJCUpCVUZGRVJfVFJBQ0UoamgsICJubyB0cmFuc2FjdGlvbiIpOworCQlKX0FTU0VSVF9KSChqaCwgIWpoLT5iX25leHRfdHJhbnNhY3Rpb24pOworCQlqaC0+Yl90cmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uOworCQlKQlVGRkVSX1RSQUNFKGpoLCAiZmlsZSBhcyBCSl9SZXNlcnZlZCIpOworCQlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJX19qb3VybmFsX2ZpbGVfYnVmZmVyKGpoLCB0cmFuc2FjdGlvbiwgQkpfUmVzZXJ2ZWQpOworCQlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCX0KKworZG9uZToKKwlpZiAobmVlZF9jb3B5KSB7CisJCXN0cnVjdCBwYWdlICpwYWdlOworCQlpbnQgb2Zmc2V0OworCQljaGFyICpzb3VyY2U7CisKKwkJSl9FWFBFQ1RfSkgoamgsIGJ1ZmZlcl91cHRvZGF0ZShqaDJiaChqaCkpLAorCQkJICAgICJQb3NzaWJsZSBJTyBmYWlsdXJlLlxuIik7CisJCXBhZ2UgPSBqaDJiaChqaCktPmJfcGFnZTsKKwkJb2Zmc2V0ID0gKCh1bnNpZ25lZCBsb25nKSBqaDJiaChqaCktPmJfZGF0YSkgJiB+UEFHRV9NQVNLOworCQlzb3VyY2UgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCW1lbWNweShqaC0+Yl9mcm96ZW5fZGF0YSwgc291cmNlK29mZnNldCwgamgyYmgoamgpLT5iX3NpemUpOworCQlrdW5tYXBfYXRvbWljKHNvdXJjZSwgS01fVVNFUjApOworCX0KKwlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKworCS8qCisJICogSWYgd2UgYXJlIGFib3V0IHRvIGpvdXJuYWwgYSBidWZmZXIsIHRoZW4gYW55IHJldm9rZSBwZW5kaW5nIG9uIGl0IGlzCisJICogbm8gbG9uZ2VyIHZhbGlkCisJICovCisJam91cm5hbF9jYW5jZWxfcmV2b2tlKGhhbmRsZSwgamgpOworCitvdXQ6CisJaWYgKGZyb3plbl9idWZmZXIpCisJCWtmcmVlKGZyb3plbl9idWZmZXIpOworCisJSkJVRkZFUl9UUkFDRShqaCwgImV4aXQiKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICogaW50IGpvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcygpIC0gbm90aWZ5IGludGVudCB0byBtb2RpZnkgYSBidWZmZXIgZm9yIG1ldGFkYXRhIChub3QgZGF0YSkgdXBkYXRlLgorICogQGhhbmRsZTogdHJhbnNhY3Rpb24gdG8gYWRkIGJ1ZmZlciBtb2RpZmljYXRpb25zIHRvCisgKiBAYmg6ICAgICBiaCB0byBiZSB1c2VkIGZvciBtZXRhZGF0YSB3cml0ZXMKKyAqIEBjcmVkaXRzOiB2YXJpYWJsZSB0aGF0IHdpbGwgcmVjZWl2ZSBjcmVkaXRzIGZvciB0aGUgYnVmZmVyCisgKgorICogUmV0dXJucyBhbiBlcnJvciBjb2RlIG9yIDAgb24gc3VjY2Vzcy4KKyAqCisgKiBJbiBmdWxsIGRhdGEgam91cm5hbGxpbmcgbW9kZSB0aGUgYnVmZmVyIG1heSBiZSBvZiB0eXBlIEJKX0FzeW5jRGF0YSwKKyAqIGJlY2F1c2Ugd2UncmUgd3JpdGUoKWluZyBhIGJ1ZmZlciB3aGljaCBpcyBhbHNvIHBhcnQgb2YgYSBzaGFyZWQgbWFwcGluZy4KKyAqLworCitpbnQgam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJc3RydWN0IGpvdXJuYWxfaGVhZCAqamggPSBqb3VybmFsX2FkZF9qb3VybmFsX2hlYWQoYmgpOworCWludCByYzsKKworCS8qIFdlIGRvIG5vdCB3YW50IHRvIGdldCBjYXVnaHQgcGxheWluZyB3aXRoIGZpZWxkcyB3aGljaCB0aGUKKwkgKiBsb2cgdGhyZWFkIGFsc28gbWFuaXB1bGF0ZXMuICBNYWtlIHN1cmUgdGhhdCB0aGUgYnVmZmVyCisJICogY29tcGxldGVzIGFueSBvdXRzdGFuZGluZyBJTyBiZWZvcmUgcHJvY2VlZGluZy4gKi8KKwlyYyA9IGRvX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBqaCwgMCk7CisJam91cm5hbF9wdXRfam91cm5hbF9oZWFkKGpoKTsKKwlyZXR1cm4gcmM7Cit9CisKKworLyoKKyAqIFdoZW4gdGhlIHVzZXIgd2FudHMgdG8gam91cm5hbCBhIG5ld2x5IGNyZWF0ZWQgYnVmZmVyX2hlYWQKKyAqIChpZS4gZ2V0YmxrKCkgcmV0dXJuZWQgYSBuZXcgYnVmZmVyIGFuZCB3ZSBhcmUgZ29pbmcgdG8gcG9wdWxhdGUgaXQKKyAqIG1hbnVhbGx5IHJhdGhlciB0aGFuIHJlYWRpbmcgb2ZmIGRpc2spLCB0aGVuIHdlIG5lZWQgdG8ga2VlcCB0aGUKKyAqIGJ1ZmZlcl9oZWFkIGxvY2tlZCB1bnRpbCBpdCBoYXMgYmVlbiBjb21wbGV0ZWx5IGZpbGxlZCB3aXRoIG5ldworICogZGF0YS4gIEluIHRoaXMgY2FzZSwgd2Ugc2hvdWxkIGJlIGFibGUgdG8gbWFrZSB0aGUgYXNzZXJ0aW9uIHRoYXQKKyAqIHRoZSBiaCBpcyBub3QgYWxyZWFkeSBwYXJ0IG9mIGFuIGV4aXN0aW5nIHRyYW5zYWN0aW9uLiAgCisgKiAKKyAqIFRoZSBidWZmZXIgc2hvdWxkIGFscmVhZHkgYmUgbG9ja2VkIGJ5IHRoZSBjYWxsZXIgYnkgdGhpcyBwb2ludC4KKyAqIFRoZXJlIGlzIG5vIGxvY2sgcmFua2luZyB2aW9sYXRpb246IGl0IHdhcyBhIG5ld2x5IGNyZWF0ZWQsCisgKiB1bmxvY2tlZCBidWZmZXIgYmVmb3JlaGFuZC4gKi8KKworLyoqCisgKiBpbnQgam91cm5hbF9nZXRfY3JlYXRlX2FjY2VzcyAoKSAtIG5vdGlmeSBpbnRlbnQgdG8gdXNlIG5ld2x5IGNyZWF0ZWQgYmgKKyAqIEBoYW5kbGU6IHRyYW5zYWN0aW9uIHRvIG5ldyBidWZmZXIgdG8KKyAqIEBiaDogbmV3IGJ1ZmZlci4KKyAqCisgKiBDYWxsIHRoaXMgaWYgeW91IGNyZWF0ZSBhIG5ldyBiaC4KKyAqLworaW50IGpvdXJuYWxfZ2V0X2NyZWF0ZV9hY2Nlc3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkgCit7CisJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24gPSBoYW5kbGUtPmhfdHJhbnNhY3Rpb247CisJam91cm5hbF90ICpqb3VybmFsID0gdHJhbnNhY3Rpb24tPnRfam91cm5hbDsKKwlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCA9IGpvdXJuYWxfYWRkX2pvdXJuYWxfaGVhZChiaCk7CisJaW50IGVycjsKKworCWpiZF9kZWJ1Zyg1LCAiam91cm5hbF9oZWFkICVwXG4iLCBqaCk7CisJZXJyID0gLUVST0ZTOworCWlmIChpc19oYW5kbGVfYWJvcnRlZChoYW5kbGUpKQorCQlnb3RvIG91dDsKKwllcnIgPSAwOworCisJSkJVRkZFUl9UUkFDRShqaCwgImVudHJ5Iik7CisJLyoKKwkgKiBUaGUgYnVmZmVyIG1heSBhbHJlYWR5IGJlbG9uZyB0byB0aGlzIHRyYW5zYWN0aW9uIGR1ZSB0byBwcmUtemVyb2luZworCSAqIGluIHRoZSBmaWxlc3lzdGVtJ3MgbmV3X2Jsb2NrIGNvZGUuICBJdCBtYXkgYWxzbyBiZSBvbiB0aGUgcHJldmlvdXMsCisJICogY29tbWl0dGluZyB0cmFuc2FjdGlvbidzIGxpc3RzLCBidXQgaXQgSEFTIHRvIGJlIGluIEZvcmdldCBzdGF0ZSBpbgorCSAqIHRoYXQgY2FzZTogdGhlIHRyYW5zYWN0aW9uIG11c3QgaGF2ZSBkZWxldGVkIHRoZSBidWZmZXIgZm9yIGl0IHRvIGJlCisJICogcmV1c2VkIGhlcmUuCisJICovCisJamJkX2xvY2tfYmhfc3RhdGUoYmgpOworCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCUpfQVNTRVJUX0pIKGpoLCAoamgtPmJfdHJhbnNhY3Rpb24gPT0gdHJhbnNhY3Rpb24gfHwKKwkJamgtPmJfdHJhbnNhY3Rpb24gPT0gTlVMTCB8fAorCQkoamgtPmJfdHJhbnNhY3Rpb24gPT0gam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uICYmCisJCQkgIGpoLT5iX2psaXN0ID09IEJKX0ZvcmdldCkpKTsKKworCUpfQVNTRVJUX0pIKGpoLCBqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uID09IE5VTEwpOworCUpfQVNTRVJUX0pIKGpoLCBidWZmZXJfbG9ja2VkKGpoMmJoKGpoKSkpOworCisJaWYgKGpoLT5iX3RyYW5zYWN0aW9uID09IE5VTEwpIHsKKwkJamgtPmJfdHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbjsKKwkJSkJVRkZFUl9UUkFDRShqaCwgImZpbGUgYXMgQkpfUmVzZXJ2ZWQiKTsKKwkJX19qb3VybmFsX2ZpbGVfYnVmZmVyKGpoLCB0cmFuc2FjdGlvbiwgQkpfUmVzZXJ2ZWQpOworCX0gZWxzZSBpZiAoamgtPmJfdHJhbnNhY3Rpb24gPT0gam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uKSB7CisJCUpCVUZGRVJfVFJBQ0UoamgsICJzZXQgbmV4dCB0cmFuc2FjdGlvbiIpOworCQlqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb247CisJfQorCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisKKwkvKgorCSAqIGFrcG06IEkgYWRkZWQgdGhpcy4gIGV4dDNfYWxsb2NfYnJhbmNoIGNhbiBwaWNrIHVwIG5ldyBpbmRpcmVjdAorCSAqIGJsb2NrcyB3aGljaCBjb250YWluIGZyZWVkIGJ1dCB0aGVuIHJldm9rZWQgbWV0YWRhdGEuICBXZSBuZWVkCisJICogdG8gY2FuY2VsIHRoZSByZXZva2UgaW4gY2FzZSB3ZSBlbmQgdXAgZnJlZWluZyBpdCB5ZXQgYWdhaW4KKwkgKiBhbmQgdGhlIHJlYWxsb2NhdGluZyBhcyBkYXRhIC0gdGhpcyB3b3VsZCBjYXVzZSBhIHNlY29uZCByZXZva2UsCisJICogd2hpY2ggaGl0cyBhbiBhc3NlcnRpb24gZXJyb3IuCisJICovCisJSkJVRkZFUl9UUkFDRShqaCwgImNhbmNlbGxpbmcgcmV2b2tlIik7CisJam91cm5hbF9jYW5jZWxfcmV2b2tlKGhhbmRsZSwgamgpOworCWpvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZChqaCk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBpbnQgam91cm5hbF9nZXRfdW5kb19hY2Nlc3MoKSAtICBOb3RpZnkgaW50ZW50IHRvIG1vZGlmeSBtZXRhZGF0YSB3aXRoCisgKiAgICAgbm9uLXJld2luZGFibGUgY29uc2VxdWVuY2VzCisgKiBAaGFuZGxlOiB0cmFuc2FjdGlvbgorICogQGJoOiBidWZmZXIgdG8gdW5kbworICogQGNyZWRpdHM6IHN0b3JlIHRoZSBudW1iZXIgb2YgdGFrZW4gY3JlZGl0cyBoZXJlIChpZiBub3QgTlVMTCkKKyAqCisgKiBTb21ldGltZXMgdGhlcmUgaXMgYSBuZWVkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gbWV0YWRhdGEgd2hpY2ggaGFzCisgKiBiZWVuIGNvbW1pdHRlZCB0byBkaXNrIGFuZCB0aGF0IHdoaWNoIGhhcyBub3QuICBUaGUgZXh0M2ZzIGNvZGUgdXNlcworICogdGhpcyBmb3IgZnJlZWluZyBhbmQgYWxsb2NhdGluZyBzcGFjZSwgd2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCB3ZQorICogZG8gbm90IHJldXNlIGZyZWVkIHNwYWNlIHVudGlsIHRoZSBkZWFsbG9jYXRpb24gaGFzIGJlZW4gY29tbWl0dGVkLAorICogc2luY2UgaWYgd2Ugb3Zlcndyb3RlIHRoYXQgc3BhY2Ugd2Ugd291bGQgbWFrZSB0aGUgZGVsZXRlCisgKiB1bi1yZXdpbmRhYmxlIGluIGNhc2Ugb2YgYSBjcmFzaC4KKyAqIAorICogVG8gZGVhbCB3aXRoIHRoYXQsIGpvdXJuYWxfZ2V0X3VuZG9fYWNjZXNzIHJlcXVlc3RzIHdyaXRlIGFjY2VzcyB0byBhCisgKiBidWZmZXIgZm9yIHBhcnRzIG9mIG5vbi1yZXdpbmRhYmxlIG9wZXJhdGlvbnMgc3VjaCBhcyBkZWxldGUKKyAqIG9wZXJhdGlvbnMgb24gdGhlIGJpdG1hcHMuICBUaGUgam91cm5hbGluZyBjb2RlIG11c3Qga2VlcCBhIGNvcHkgb2YKKyAqIHRoZSBidWZmZXIncyBjb250ZW50cyBwcmlvciB0byB0aGUgdW5kb19hY2Nlc3MgY2FsbCB1bnRpbCBzdWNoIHRpbWUKKyAqIGFzIHdlIGtub3cgdGhhdCB0aGUgYnVmZmVyIGhhcyBkZWZpbml0ZWx5IGJlZW4gY29tbWl0dGVkIHRvIGRpc2suCisgKiAKKyAqIFdlIG5ldmVyIG5lZWQgdG8ga25vdyB3aGljaCB0cmFuc2FjdGlvbiB0aGUgY29tbWl0dGVkIGRhdGEgaXMgcGFydAorICogb2YsIGJ1ZmZlcnMgdG91Y2hlZCBoZXJlIGFyZSBndWFyYW50ZWVkIHRvIGJlIGRpcnRpZWQgbGF0ZXIgYW5kIHNvCisgKiB3aWxsIGJlIGNvbW1pdHRlZCB0byBhIG5ldyB0cmFuc2FjdGlvbiBpbiBkdWUgY291cnNlLCBhdCB3aGljaCBwb2ludAorICogd2UgY2FuIGRpc2NhcmQgdGhlIG9sZCBjb21taXR0ZWQgZGF0YSBwb2ludGVyLgorICoKKyAqIFJldHVybnMgZXJyb3IgbnVtYmVyIG9yIDAgb24gc3VjY2Vzcy4KKyAqLworaW50IGpvdXJuYWxfZ2V0X3VuZG9fYWNjZXNzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaW50IGVycjsKKwlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCA9IGpvdXJuYWxfYWRkX2pvdXJuYWxfaGVhZChiaCk7CisJY2hhciAqY29tbWl0dGVkX2RhdGEgPSBOVUxMOworCisJSkJVRkZFUl9UUkFDRShqaCwgImVudHJ5Iik7CisKKwkvKgorCSAqIERvIHRoaXMgZmlyc3QgLS0tIGl0IGNhbiBkcm9wIHRoZSBqb3VybmFsIGxvY2ssIHNvIHdlIHdhbnQgdG8KKwkgKiBtYWtlIHN1cmUgdGhhdCBvYnRhaW5pbmcgdGhlIGNvbW1pdHRlZF9kYXRhIGlzIGRvbmUKKwkgKiBhdG9taWNhbGx5IHdydC4gY29tcGxldGlvbiBvZiBhbnkgb3V0c3RhbmRpbmcgY29tbWl0cy4KKwkgKi8KKwllcnIgPSBkb19nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgamgsIDEpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCityZXBlYXQ6CisJaWYgKCFqaC0+Yl9jb21taXR0ZWRfZGF0YSkgeworCQljb21taXR0ZWRfZGF0YSA9IGpiZF9rbWFsbG9jKGpoMmJoKGpoKS0+Yl9zaXplLCBHRlBfTk9GUyk7CisJCWlmICghY29tbWl0dGVkX2RhdGEpIHsKKwkJCXByaW50ayhLRVJOX0VNRVJHICIlczogTm8gbWVtb3J5IGZvciBjb21taXR0ZWQgZGF0YVxuIiwKKwkJCQlfX0ZVTkNUSU9OX18pOworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJamJkX2xvY2tfYmhfc3RhdGUoYmgpOworCWlmICghamgtPmJfY29tbWl0dGVkX2RhdGEpIHsKKwkJLyogQ29weSBvdXQgdGhlIGN1cnJlbnQgYnVmZmVyIGNvbnRlbnRzIGludG8gdGhlCisJCSAqIHByZXNlcnZlZCwgY29tbWl0dGVkIGNvcHkuICovCisJCUpCVUZGRVJfVFJBQ0UoamgsICJnZW5lcmF0ZSBiX2NvbW1pdHRlZCBkYXRhIik7CisJCWlmICghY29tbWl0dGVkX2RhdGEpIHsKKwkJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQkJZ290byByZXBlYXQ7CisJCX0KKworCQlqaC0+Yl9jb21taXR0ZWRfZGF0YSA9IGNvbW1pdHRlZF9kYXRhOworCQljb21taXR0ZWRfZGF0YSA9IE5VTEw7CisJCW1lbWNweShqaC0+Yl9jb21taXR0ZWRfZGF0YSwgYmgtPmJfZGF0YSwgYmgtPmJfc2l6ZSk7CisJfQorCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworb3V0OgorCWpvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZChqaCk7CisJaWYgKGNvbW1pdHRlZF9kYXRhKQorCQlrZnJlZShjb21taXR0ZWRfZGF0YSk7CisJcmV0dXJuIGVycjsKK30KKworLyoqIAorICogaW50IGpvdXJuYWxfZGlydHlfZGF0YSgpIC0gIG1hcmsgYSBidWZmZXIgYXMgY29udGFpbmluZyBkaXJ0eSBkYXRhIHdoaWNoCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZHMgdG8gYmUgZmx1c2hlZCBiZWZvcmUgd2UgY2FuIGNvbW1pdCB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50IHRyYW5zYWN0aW9uLiAgCisgKiBAaGFuZGxlOiB0cmFuc2FjdGlvbgorICogQGJoOiBidWZmZXJoZWFkIHRvIG1hcmsKKyAqIAorICogVGhlIGJ1ZmZlciBpcyBwbGFjZWQgb24gdGhlIHRyYW5zYWN0aW9uJ3MgZGF0YSBsaXN0IGFuZCBpcyBtYXJrZWQgYXMKKyAqIGJlbG9uZ2luZyB0byB0aGUgdHJhbnNhY3Rpb24uCisgKgorICogUmV0dXJucyBlcnJvciBudW1iZXIgb3IgMCBvbiBzdWNjZXNzLgorICoKKyAqIGpvdXJuYWxfZGlydHlfZGF0YSgpIGNhbiBiZSBjYWxsZWQgdmlhIHBhZ2VfbGF1bmRlci0+ZXh0M193cml0ZXBhZ2UKKyAqIGJ5IGtzd2FwZC4KKyAqLworaW50IGpvdXJuYWxfZGlydHlfZGF0YShoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWpvdXJuYWxfdCAqam91cm5hbCA9IGhhbmRsZS0+aF90cmFuc2FjdGlvbi0+dF9qb3VybmFsOworCWludCBuZWVkX2JyZWxzZSA9IDA7CisJc3RydWN0IGpvdXJuYWxfaGVhZCAqamg7CisKKwlpZiAoaXNfaGFuZGxlX2Fib3J0ZWQoaGFuZGxlKSkKKwkJcmV0dXJuIDA7CisKKwlqaCA9IGpvdXJuYWxfYWRkX2pvdXJuYWxfaGVhZChiaCk7CisJSkJVRkZFUl9UUkFDRShqaCwgImVudHJ5Iik7CisKKwkvKgorCSAqIFRoZSBidWZmZXIgY291bGQgKmFscmVhZHkqIGJlIGRpcnR5LiAgV3JpdGVvdXQgY2FuIHN0YXJ0CisJICogYXQgYW55IHRpbWUuCisJICovCisJamJkX2RlYnVnKDQsICJqaDogJXAsIHRpZDolZFxuIiwgamgsIGhhbmRsZS0+aF90cmFuc2FjdGlvbi0+dF90aWQpOworCisJLyoKKwkgKiBXaGF0IGlmIHRoZSBidWZmZXIgaXMgYWxyZWFkeSBwYXJ0IG9mIGEgcnVubmluZyB0cmFuc2FjdGlvbj8KKwkgKiAKKwkgKiBUaGVyZSBhcmUgdHdvIGNhc2VzOgorCSAqIDEpIEl0IGlzIHBhcnQgb2YgdGhlIGN1cnJlbnQgcnVubmluZyB0cmFuc2FjdGlvbi4gIFJlZmlsZSBpdCwKKwkgKiAgICBqdXN0IGluIGNhc2Ugd2UgaGF2ZSBhbGxvY2F0ZWQgaXQgYXMgbWV0YWRhdGEsIGRlYWxsb2NhdGVkCisJICogICAgaXQsIHRoZW4gcmVhbGxvY2F0ZWQgaXQgYXMgZGF0YS4gCisJICogMikgSXQgaXMgcGFydCBvZiB0aGUgcHJldmlvdXMsIHN0aWxsLWNvbW1pdHRpbmcgdHJhbnNhY3Rpb24uCisJICogICAgSWYgYWxsIHdlIHdhbnQgdG8gZG8gaXMgdG8gZ3VhcmFudGVlIHRoYXQgdGhlIGJ1ZmZlciB3aWxsIGJlCisJICogICAgd3JpdHRlbiB0byBkaXNrIGJlZm9yZSB0aGlzIG5ldyB0cmFuc2FjdGlvbiBjb21taXRzLCB0aGVuCisJICogICAgYmVpbmcgc3VyZSB0aGF0IHRoZSAqcHJldmlvdXMqIHRyYW5zYWN0aW9uIGhhcyB0aGlzIHNhbWUgCisJICogICAgcHJvcGVydHkgaXMgc3VmZmljaWVudCBmb3IgdXMhICBKdXN0IGxlYXZlIGl0IG9uIGl0cyBvbGQKKwkgKiAgICB0cmFuc2FjdGlvbi4KKwkgKgorCSAqIEluIGNhc2UgKDIpLCB0aGUgYnVmZmVyIG11c3Qgbm90IGFscmVhZHkgZXhpc3QgYXMgbWV0YWRhdGEKKwkgKiAtLS0gdGhhdCB3b3VsZCB2aW9sYXRlIHdyaXRlIG9yZGVyaW5nIChhIHRyYW5zYWN0aW9uIGlzIGZyZWUKKwkgKiB0byB3cml0ZSBpdHMgZGF0YSBhdCBhbnkgcG9pbnQsIGV2ZW4gYmVmb3JlIHRoZSBwcmV2aW91cworCSAqIGNvbW1pdHRpbmcgdHJhbnNhY3Rpb24gaGFzIGNvbW1pdHRlZCkuICBUaGUgY2FsbGVyIG11c3QKKwkgKiBuZXZlciwgZXZlciBhbGxvdyB0aGlzIHRvIGhhcHBlbjogdGhlcmUncyBub3RoaW5nIHdlIGNhbiBkbworCSAqIGFib3V0IGl0IGluIHRoaXMgbGF5ZXIuCisJICovCisJamJkX2xvY2tfYmhfc3RhdGUoYmgpOworCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCWlmIChqaC0+Yl90cmFuc2FjdGlvbikgeworCQlKQlVGRkVSX1RSQUNFKGpoLCAiaGFzIHRyYW5zYWN0aW9uIik7CisJCWlmIChqaC0+Yl90cmFuc2FjdGlvbiAhPSBoYW5kbGUtPmhfdHJhbnNhY3Rpb24pIHsKKwkJCUpCVUZGRVJfVFJBQ0UoamgsICJiZWxvbmdzIHRvIG9sZGVyIHRyYW5zYWN0aW9uIik7CisJCQlKX0FTU0VSVF9KSChqaCwgamgtPmJfdHJhbnNhY3Rpb24gPT0KKwkJCQkJam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uKTsKKworCQkJLyogQEBAIElTIFRISVMgVFJVRSAgPyAqLworCQkJLyoKKwkJCSAqIE5vdCBhbnkgbW9yZS4gIFNjZW5hcmlvOiBzb21lb25lIGRvZXMgYSB3cml0ZSgpCisJCQkgKiBpbiBkYXRhPWpvdXJuYWwgbW9kZS4gIFRoZSBidWZmZXIncyB0cmFuc2FjdGlvbiBoYXMKKwkJCSAqIG1vdmVkIGludG8gY29tbWl0LiAgVGhlbiBzb21lb25lIGRvZXMgYW5vdGhlcgorCQkJICogd3JpdGUoKSB0byB0aGUgZmlsZS4gIFdlIGRvIHRoZSBmcm96ZW4gZGF0YSBjb3B5b3V0CisJCQkgKiBhbmQgc2V0IGJfbmV4dF90cmFuc2FjdGlvbiB0byBwb2ludCB0byBqX3J1bm5pbmdfdC4KKwkJCSAqIEFuZCB3aGlsZSB3ZSdyZSBpbiB0aGF0IHN0YXRlLCBzb21lb25lIGRvZXMgYQorCQkJICogd3JpdGVwYWdlKCkgaW4gYW4gYXR0ZW1wdCB0byBwYWdlb3V0IHRoZSBzYW1lIGFyZWEKKwkJCSAqIG9mIHRoZSBmaWxlIHZpYSBhIHNoYXJlZCBtYXBwaW5nLiAgQXQgcHJlc2VudCB0aGF0CisJCQkgKiBjYWxscyBqb3VybmFsX2RpcnR5X2RhdGEoKSwgYW5kIHdlIGdldCByaWdodCBoZXJlLgorCQkJICogSXQgbWF5IGJlIHRvbyBsYXRlIHRvIGpvdXJuYWwgdGhlIGRhdGEuICBTaW1wbHkKKwkJCSAqIGZhbGxpbmcgdGhyb3VnaCB0byB0aGUgbmV4dCB0ZXN0IHdpbGwgc3VmZmljZTogdGhlCisJCQkgKiBkYXRhIHdpbGwgYmUgZGlydHkgYW5kIHdpbCBiZSBjaGVja3BvaW50ZWQuICBUaGUKKwkJCSAqIG9yZGVyaW5nIGNvbW1lbnRzIGluIHRoZSBuZXh0IGNvbW1lbnQgYmxvY2sgc3RpbGwKKwkJCSAqIGFwcGx5LgorCQkJICovCisJCQkvL0pfQVNTRVJUX0pIKGpoLCBqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uID09IE5VTEwpOworCisJCQkvKgorCQkJICogSWYgd2UncmUgam91cm5hbGxpbmcgZGF0YSwgYW5kIHRoaXMgYnVmZmVyIHdhcworCQkJICogc3ViamVjdCB0byBhIHdyaXRlKCksIGl0IGNvdWxkIGJlIG1ldGFkYXRhLCBmb3JnZXQKKwkJCSAqIG9yIHNoYWRvdyBhZ2FpbnN0IHRoZSBjb21taXR0aW5nIHRyYW5zYWN0aW9uLiAgTm93LAorCQkJICogc29tZW9uZSBoYXMgZGlydGllZCB0aGUgc2FtZSBkYXJuIHBhZ2UgdmlhIGEgbWFwcGluZworCQkJICogYW5kIGl0IGlzIGJlaW5nIHdyaXRlcGFnZSgpJ2QuCisJCQkgKiBXZSAqY291bGQqIGp1c3Qgc3RlYWwgdGhlIHBhZ2UgZnJvbSBjb21taXQsIHdpdGggc29tZQorCQkJICogZmFuY3kgbG9ja2luZyB0aGVyZS4gIEluc3RlYWQsIHdlIGp1c3Qgc2tpcCBpdCAtCisJCQkgKiBkb24ndCB0aWUgdGhlIHBhZ2UncyBidWZmZXJzIHRvIHRoZSBuZXcgdHJhbnNhY3Rpb24KKwkJCSAqIGF0IGFsbC4KKwkJCSAqIEltcGxpY2F0aW9uOiBpZiB3ZSBjcmFzaCBiZWZvcmUgdGhlIHdyaXRlcGFnZSgpIGRhdGEKKwkJCSAqIGlzIHdyaXR0ZW4gaW50byB0aGUgZmlsZXN5c3RlbSwgcmVjb3Zlcnkgd2lsbCByZXBsYXkKKwkJCSAqIHRoZSB3cml0ZSgpIGRhdGEuCisJCQkgKi8KKwkJCWlmIChqaC0+Yl9qbGlzdCAhPSBCSl9Ob25lICYmCisJCQkJCWpoLT5iX2psaXN0ICE9IEJKX1N5bmNEYXRhICYmCisJCQkJCWpoLT5iX2psaXN0ICE9IEJKX0xvY2tlZCkgeworCQkJCUpCVUZGRVJfVFJBQ0UoamgsICJOb3Qgc3RlYWxpbmciKTsKKwkJCQlnb3RvIG5vX2pvdXJuYWw7CisJCQl9CisKKwkJCS8qCisJCQkgKiBUaGlzIGJ1ZmZlciBtYXkgYmUgdW5kZXJnb2luZyB3cml0ZW91dCBpbiBjb21taXQuICBXZQorCQkJICogY2FuJ3QgcmV0dXJuIGZyb20gaGVyZSBhbmQgbGV0IHRoZSBjYWxsZXIgZGlydHkgaXQKKwkJCSAqIGFnYWluIGJlY2F1c2UgdGhhdCBjYW4gY2F1c2UgdGhlIHdyaXRlLW91dCBsb29wIGluCisJCQkgKiBjb21taXQgdG8gbmV2ZXIgdGVybWluYXRlLgorCQkJICovCisJCQlpZiAoYnVmZmVyX2RpcnR5KGJoKSkgeworCQkJCWdldF9iaChiaCk7CisJCQkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKwkJCQluZWVkX2JyZWxzZSA9IDE7CisJCQkJc3luY19kaXJ0eV9idWZmZXIoYmgpOworCQkJCWpiZF9sb2NrX2JoX3N0YXRlKGJoKTsKKwkJCQlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJCQkvKiBUaGUgYnVmZmVyIG1heSBiZWNvbWUgbG9ja2VkIGFnYWluIGF0IGFueQorCQkJCSAgIHRpbWUgaWYgaXQgaXMgcmVkaXJ0aWVkICovCisJCQl9CisKKwkJCS8qIGpvdXJuYWxfY2xlYW5fZGF0YV9saXN0KCkgbWF5IGhhdmUgZ290IHRoZXJlIGZpcnN0ICovCisJCQlpZiAoamgtPmJfdHJhbnNhY3Rpb24gIT0gTlVMTCkgeworCQkJCUpCVUZGRVJfVFJBQ0UoamgsICJ1bmZpbGUgZnJvbSBjb21taXQiKTsKKwkJCQlfX2pvdXJuYWxfdGVtcF91bmxpbmtfYnVmZmVyKGpoKTsKKwkJCQkvKiBJdCBzdGlsbCBwb2ludHMgdG8gdGhlIGNvbW1pdHRpbmcKKwkJCQkgKiB0cmFuc2FjdGlvbjsgbW92ZSBpdCB0byB0aGlzIG9uZSBzbworCQkJCSAqIHRoYXQgdGhlIHJlZmlsZSBhc3NlcnQgY2hlY2tzIGFyZQorCQkJCSAqIGhhcHB5LiAqLworCQkJCWpoLT5iX3RyYW5zYWN0aW9uID0gaGFuZGxlLT5oX3RyYW5zYWN0aW9uOworCQkJfQorCQkJLyogVGhlIGJ1ZmZlciB3aWxsIGJlIHJlZmlsZWQgYmVsb3cgKi8KKworCQl9CisJCS8qCisJCSAqIFNwZWNpYWwgY2FzZSAtLS0gdGhlIGJ1ZmZlciBtaWdodCBhY3R1YWxseSBoYXZlIGJlZW4KKwkJICogYWxsb2NhdGVkIGFuZCB0aGVuIGltbWVkaWF0ZWx5IGRlYWxsb2NhdGVkIGluIHRoZSBwcmV2aW91cywKKwkJICogY29tbWl0dGluZyB0cmFuc2FjdGlvbiwgc28gbWlnaHQgc3RpbGwgYmUgbGVmdCBvbiB0aGF0CisJCSAqIHRyYW5zYWN0aW9uJ3MgbWV0YWRhdGEgbGlzdHMuCisJCSAqLworCQlpZiAoamgtPmJfamxpc3QgIT0gQkpfU3luY0RhdGEgJiYgamgtPmJfamxpc3QgIT0gQkpfTG9ja2VkKSB7CisJCQlKQlVGRkVSX1RSQUNFKGpoLCAibm90IG9uIGNvcnJlY3QgZGF0YSBsaXN0OiB1bmZpbGUiKTsKKwkJCUpfQVNTRVJUX0pIKGpoLCBqaC0+Yl9qbGlzdCAhPSBCSl9TaGFkb3cpOworCQkJX19qb3VybmFsX3RlbXBfdW5saW5rX2J1ZmZlcihqaCk7CisJCQlqaC0+Yl90cmFuc2FjdGlvbiA9IGhhbmRsZS0+aF90cmFuc2FjdGlvbjsKKwkJCUpCVUZGRVJfVFJBQ0UoamgsICJmaWxlIGFzIGRhdGEiKTsKKwkJCV9fam91cm5hbF9maWxlX2J1ZmZlcihqaCwgaGFuZGxlLT5oX3RyYW5zYWN0aW9uLAorCQkJCQkJQkpfU3luY0RhdGEpOworCQl9CisJfSBlbHNlIHsKKwkJSkJVRkZFUl9UUkFDRShqaCwgIm5vdCBvbiBhIHRyYW5zYWN0aW9uIik7CisJCV9fam91cm5hbF9maWxlX2J1ZmZlcihqaCwgaGFuZGxlLT5oX3RyYW5zYWN0aW9uLCBCSl9TeW5jRGF0YSk7CisJfQorbm9fam91cm5hbDoKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCWlmIChuZWVkX2JyZWxzZSkgeworCQlCVUZGRVJfVFJBQ0UoYmgsICJicmVsc2UiKTsKKwkJX19icmVsc2UoYmgpOworCX0KKwlKQlVGRkVSX1RSQUNFKGpoLCAiZXhpdCIpOworCWpvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZChqaCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKiAKKyAqIGludCBqb3VybmFsX2RpcnR5X21ldGFkYXRhKCkgLSAgbWFyayBhIGJ1ZmZlciBhcyBjb250YWluaW5nIGRpcnR5IG1ldGFkYXRhCisgKiBAaGFuZGxlOiB0cmFuc2FjdGlvbiB0byBhZGQgYnVmZmVyIHRvLgorICogQGJoOiBidWZmZXIgdG8gbWFyayAKKyAqIAorICogbWFyayBkaXJ0eSBtZXRhZGF0YSB3aGljaCBuZWVkcyB0byBiZSBqb3VybmFsZWQgYXMgcGFydCBvZiB0aGUgY3VycmVudAorICogdHJhbnNhY3Rpb24uCisgKgorICogVGhlIGJ1ZmZlciBpcyBwbGFjZWQgb24gdGhlIHRyYW5zYWN0aW9uJ3MgbWV0YWRhdGEgbGlzdCBhbmQgaXMgbWFya2VkCisgKiBhcyBiZWxvbmdpbmcgdG8gdGhlIHRyYW5zYWN0aW9uLiAgCisgKgorICogUmV0dXJucyBlcnJvciBudW1iZXIgb3IgMCBvbiBzdWNjZXNzLiAgCisgKgorICogU3BlY2lhbCBjYXJlIG5lZWRzIHRvIGJlIHRha2VuIGlmIHRoZSBidWZmZXIgYWxyZWFkeSBiZWxvbmdzIHRvIHRoZQorICogY3VycmVudCBjb21taXR0aW5nIHRyYW5zYWN0aW9uIChpbiB3aGljaCBjYXNlIHdlIHNob3VsZCBoYXZlIGZyb3plbgorICogZGF0YSBwcmVzZW50IGZvciB0aGF0IGNvbW1pdCkuICBJbiB0aGF0IGNhc2UsIHdlIGRvbid0IHJlbGluayB0aGUKKyAqIGJ1ZmZlcjogdGhhdCBvbmx5IGdldHMgZG9uZSB3aGVuIHRoZSBvbGQgdHJhbnNhY3Rpb24gZmluYWxseQorICogY29tcGxldGVzIGl0cyBjb21taXQuCisgKi8KK2ludCBqb3VybmFsX2RpcnR5X21ldGFkYXRhKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24gPSBoYW5kbGUtPmhfdHJhbnNhY3Rpb247CisJam91cm5hbF90ICpqb3VybmFsID0gdHJhbnNhY3Rpb24tPnRfam91cm5hbDsKKwlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCA9IGJoMmpoKGJoKTsKKworCWpiZF9kZWJ1Zyg1LCAiam91cm5hbF9oZWFkICVwXG4iLCBqaCk7CisJSkJVRkZFUl9UUkFDRShqaCwgImVudHJ5Iik7CisJaWYgKGlzX2hhbmRsZV9hYm9ydGVkKGhhbmRsZSkpCisJCWdvdG8gb3V0OworCisJamJkX2xvY2tfYmhfc3RhdGUoYmgpOworCisJaWYgKGpoLT5iX21vZGlmaWVkID09IDApIHsKKwkJLyoKKwkJICogVGhpcyBidWZmZXIncyBnb3QgbW9kaWZpZWQgYW5kIGJlY29taW5nIHBhcnQKKwkJICogb2YgdGhlIHRyYW5zYWN0aW9uLiBUaGlzIG5lZWRzIHRvIGJlIGRvbmUKKwkJICogb25jZSBhIHRyYW5zYWN0aW9uIC1ienp6CisJCSAqLworCQlqaC0+Yl9tb2RpZmllZCA9IDE7CisJCUpfQVNTRVJUX0pIKGpoLCBoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHMgPiAwKTsKKwkJaGFuZGxlLT5oX2J1ZmZlcl9jcmVkaXRzLS07CisJfQorCisJLyoKKwkgKiBmYXN0cGF0aCwgdG8gYXZvaWQgZXhwZW5zaXZlIGxvY2tpbmcuICBJZiB0aGlzIGJ1ZmZlciBpcyBhbHJlYWR5CisJICogb24gdGhlIHJ1bm5pbmcgdHJhbnNhY3Rpb24ncyBtZXRhZGF0YSBsaXN0IHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uCisJICogTm9ib2R5IGNhbiB0YWtlIGl0IG9mZiBhZ2FpbiBiZWNhdXNlIHRoZXJlIGlzIGEgaGFuZGxlIG9wZW4uCisJICogSSBfdGhpbmtfIHdlJ3JlIE9LIGhlcmUgd2l0aCBTTVAgYmFycmllcnMgLSBhIG1pc3Rha2VuIGRlY2lzaW9uIHdpbGwKKwkgKiByZXN1bHQgaW4gdGhpcyB0ZXN0IGJlaW5nIGZhbHNlLCBzbyB3ZSBnbyBpbiBhbmQgdGFrZSB0aGUgbG9ja3MuCisJICovCisJaWYgKGpoLT5iX3RyYW5zYWN0aW9uID09IHRyYW5zYWN0aW9uICYmIGpoLT5iX2psaXN0ID09IEJKX01ldGFkYXRhKSB7CisJCUpCVUZGRVJfVFJBQ0UoamgsICJmYXN0cGF0aCIpOworCQlKX0FTU0VSVF9KSChqaCwgamgtPmJfdHJhbnNhY3Rpb24gPT0KKwkJCQkJam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uKTsKKwkJZ290byBvdXRfdW5sb2NrX2JoOworCX0KKworCXNldF9idWZmZXJfamJkZGlydHkoYmgpOworCisJLyogCisJICogTWV0YWRhdGEgYWxyZWFkeSBvbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBsaXN0IGRvZXNuJ3QKKwkgKiBuZWVkIHRvIGJlIGZpbGVkLiAgTWV0YWRhdGEgb24gYW5vdGhlciB0cmFuc2FjdGlvbidzIGxpc3QgbXVzdAorCSAqIGJlIGNvbW1pdHRpbmcsIGFuZCB3aWxsIGJlIHJlZmlsZWQgb25jZSB0aGUgY29tbWl0IGNvbXBsZXRlczoKKwkgKiBsZWF2ZSBpdCBhbG9uZSBmb3Igbm93LiAKKwkgKi8KKwlpZiAoamgtPmJfdHJhbnNhY3Rpb24gIT0gdHJhbnNhY3Rpb24pIHsKKwkJSkJVRkZFUl9UUkFDRShqaCwgImFscmVhZHkgb24gb3RoZXIgdHJhbnNhY3Rpb24iKTsKKwkJSl9BU1NFUlRfSkgoamgsIGpoLT5iX3RyYW5zYWN0aW9uID09CisJCQkJCWpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbik7CisJCUpfQVNTRVJUX0pIKGpoLCBqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uID09IHRyYW5zYWN0aW9uKTsKKwkJLyogQW5kIHRoaXMgY2FzZSBpcyBpbGxlZ2FsOiB3ZSBjYW4ndCByZXVzZSBhbm90aGVyCisJCSAqIHRyYW5zYWN0aW9uJ3MgZGF0YSBidWZmZXIsIGV2ZXIuICovCisJCWdvdG8gb3V0X3VubG9ja19iaDsKKwl9CisKKwkvKiBUaGF0IHRlc3Qgc2hvdWxkIGhhdmUgZWxpbWluYXRlZCB0aGUgZm9sbG93aW5nIGNhc2U6ICovCisJSl9BU1NFUlRfSkgoamgsIGpoLT5iX2Zyb3plbl9kYXRhID09IDApOworCisJSkJVRkZFUl9UUkFDRShqaCwgImZpbGUgYXMgQkpfTWV0YWRhdGEiKTsKKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwlfX2pvdXJuYWxfZmlsZV9idWZmZXIoamgsIGhhbmRsZS0+aF90cmFuc2FjdGlvbiwgQkpfTWV0YWRhdGEpOworCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CitvdXRfdW5sb2NrX2JoOgorCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworb3V0OgorCUpCVUZGRVJfVFJBQ0UoamgsICJleGl0Iik7CisJcmV0dXJuIDA7Cit9CisKKy8qIAorICogam91cm5hbF9yZWxlYXNlX2J1ZmZlcjogdW5kbyBhIGdldF93cml0ZV9hY2Nlc3Mgd2l0aG91dCBhbnkgYnVmZmVyCisgKiB1cGRhdGVzLCBpZiB0aGUgdXBkYXRlIGRlY2lkZWQgaW4gdGhlIGVuZCB0aGF0IGl0IGRpZG4ndCBuZWVkIGFjY2Vzcy4KKyAqCisgKi8KK3ZvaWQKK2pvdXJuYWxfcmVsZWFzZV9idWZmZXIoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlCVUZGRVJfVFJBQ0UoYmgsICJlbnRyeSIpOworfQorCisvKiogCisgKiB2b2lkIGpvdXJuYWxfZm9yZ2V0KCkgLSBiZm9yZ2V0KCkgZm9yIHBvdGVudGlhbGx5LWpvdXJuYWxlZCBidWZmZXJzLgorICogQGhhbmRsZTogdHJhbnNhY3Rpb24gaGFuZGxlCisgKiBAYmg6ICAgICBiaCB0byAnZm9yZ2V0JworICoKKyAqIFdlIGNhbiBvbmx5IGRvIHRoZSBiZm9yZ2V0IGlmIHRoZXJlIGFyZSBubyBjb21taXRzIHBlbmRpbmcgYWdhaW5zdCB0aGUKKyAqIGJ1ZmZlci4gIElmIHRoZSBidWZmZXIgaXMgZGlydHkgaW4gdGhlIGN1cnJlbnQgcnVubmluZyB0cmFuc2FjdGlvbiB3ZQorICogY2FuIHNhZmVseSB1bmxpbmsgaXQuIAorICoKKyAqIGJoIG1heSBub3QgYmUgYSBqb3VybmFsbGVkIGJ1ZmZlciBhdCBhbGwgLSBpdCBtYXkgYmUgYSBub24tSkJECisgKiBidWZmZXIgd2hpY2ggY2FtZSBvZmYgdGhlIGhhc2h0YWJsZS4gIENoZWNrIGZvciB0aGlzLgorICoKKyAqIERlY3JlbWVudHMgYmgtPmJfY291bnQgYnkgb25lLgorICogCisgKiBBbGxvdyB0aGlzIGNhbGwgZXZlbiBpZiB0aGUgaGFuZGxlIGhhcyBhYm9ydGVkIC0tLSBpdCBtYXkgYmUgcGFydCBvZgorICogdGhlIGNhbGxlcidzIGNsZWFudXAgYWZ0ZXIgYW4gYWJvcnQuCisgKi8KK2ludCBqb3VybmFsX2ZvcmdldCAoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwl0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbiA9IGhhbmRsZS0+aF90cmFuc2FjdGlvbjsKKwlqb3VybmFsX3QgKmpvdXJuYWwgPSB0cmFuc2FjdGlvbi0+dF9qb3VybmFsOworCXN0cnVjdCBqb3VybmFsX2hlYWQgKmpoOworCWludCBkcm9wX3Jlc2VydmUgPSAwOworCWludCBlcnIgPSAwOworCisJQlVGRkVSX1RSQUNFKGJoLCAiZW50cnkiKTsKKworCWpiZF9sb2NrX2JoX3N0YXRlKGJoKTsKKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKworCWlmICghYnVmZmVyX2piZChiaCkpCisJCWdvdG8gbm90X2piZDsKKwlqaCA9IGJoMmpoKGJoKTsKKworCS8qIENyaXRpY2FsIGVycm9yOiBhdHRlbXB0aW5nIHRvIGRlbGV0ZSBhIGJpdG1hcCBidWZmZXIsIG1heWJlPworCSAqIERvbid0IGRvIGFueSBqYmQgb3BlcmF0aW9ucywgYW5kIHJldHVybiBhbiBlcnJvci4gKi8KKwlpZiAoIUpfRVhQRUNUX0pIKGpoLCAhamgtPmJfY29tbWl0dGVkX2RhdGEsCisJCQkgImluY29uc2lzdGVudCBkYXRhIG9uIGRpc2siKSkgeworCQllcnIgPSAtRUlPOworCQlnb3RvIG5vdF9qYmQ7CisJfQorCisJLyoKKwkgKiBUaGUgYnVmZmVyJ3MgZ29pbmcgZnJvbSB0aGUgdHJhbnNhY3Rpb24sIHdlIG11c3QgZHJvcAorCSAqIGFsbCByZWZlcmVuY2VzIC1ienp6CisJICovCisJamgtPmJfbW9kaWZpZWQgPSAwOworCisJaWYgKGpoLT5iX3RyYW5zYWN0aW9uID09IGhhbmRsZS0+aF90cmFuc2FjdGlvbikgeworCQlKX0FTU0VSVF9KSChqaCwgIWpoLT5iX2Zyb3plbl9kYXRhKTsKKworCQkvKiBJZiB3ZSBhcmUgZm9yZ2V0dGluZyBhIGJ1ZmZlciB3aGljaCBpcyBhbHJlYWR5IHBhcnQKKwkJICogb2YgdGhpcyB0cmFuc2FjdGlvbiwgdGhlbiB3ZSBjYW4ganVzdCBkcm9wIGl0IGZyb20KKwkJICogdGhlIHRyYW5zYWN0aW9uIGltbWVkaWF0ZWx5LiAqLworCQljbGVhcl9idWZmZXJfZGlydHkoYmgpOworCQljbGVhcl9idWZmZXJfamJkZGlydHkoYmgpOworCisJCUpCVUZGRVJfVFJBQ0UoamgsICJiZWxvbmdzIHRvIGN1cnJlbnQgdHJhbnNhY3Rpb246IHVuZmlsZSIpOworCisJCWRyb3BfcmVzZXJ2ZSA9IDE7CisKKwkJLyogCisJCSAqIFdlIGFyZSBubyBsb25nZXIgZ29pbmcgdG8gam91cm5hbCB0aGlzIGJ1ZmZlci4KKwkJICogSG93ZXZlciwgdGhlIGNvbW1pdCBvZiB0aGlzIHRyYW5zYWN0aW9uIGlzIHN0aWxsCisJCSAqIGltcG9ydGFudCB0byB0aGUgYnVmZmVyOiB0aGUgZGVsZXRlIHRoYXQgd2UgYXJlIG5vdworCQkgKiBwcm9jZXNzaW5nIG1pZ2h0IG9ic29sZXRlIGFuIG9sZCBsb2cgZW50cnksIHNvIGJ5CisJCSAqIGNvbW1pdHRpbmcsIHdlIGNhbiBzYXRpc2Z5IHRoZSBidWZmZXIncyBjaGVja3BvaW50LgorCQkgKgorCQkgKiBTbywgaWYgd2UgaGF2ZSBhIGNoZWNrcG9pbnQgb24gdGhlIGJ1ZmZlciwgd2Ugc2hvdWxkCisJCSAqIG5vdyByZWZpbGUgdGhlIGJ1ZmZlciBvbiBvdXIgQkpfRm9yZ2V0IGxpc3Qgc28gdGhhdAorCQkgKiB3ZSBrbm93IHRvIHJlbW92ZSB0aGUgY2hlY2twb2ludCBhZnRlciB3ZSBjb21taXQuIAorCQkgKi8KKworCQlpZiAoamgtPmJfY3BfdHJhbnNhY3Rpb24pIHsKKwkJCV9fam91cm5hbF90ZW1wX3VubGlua19idWZmZXIoamgpOworCQkJX19qb3VybmFsX2ZpbGVfYnVmZmVyKGpoLCB0cmFuc2FjdGlvbiwgQkpfRm9yZ2V0KTsKKwkJfSBlbHNlIHsKKwkJCV9fam91cm5hbF91bmZpbGVfYnVmZmVyKGpoKTsKKwkJCWpvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZChiaCk7CisJCQlfX2JyZWxzZShiaCk7CisJCQlpZiAoIWJ1ZmZlcl9qYmQoYmgpKSB7CisJCQkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKwkJCQlfX2Jmb3JnZXQoYmgpOworCQkJCWdvdG8gZHJvcDsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoamgtPmJfdHJhbnNhY3Rpb24pIHsKKwkJSl9BU1NFUlRfSkgoamgsIChqaC0+Yl90cmFuc2FjdGlvbiA9PSAKKwkJCQkgam91cm5hbC0+al9jb21taXR0aW5nX3RyYW5zYWN0aW9uKSk7CisJCS8qIEhvd2V2ZXIsIGlmIHRoZSBidWZmZXIgaXMgc3RpbGwgb3duZWQgYnkgYSBwcmlvcgorCQkgKiAoY29tbWl0dGluZykgdHJhbnNhY3Rpb24sIHdlIGNhbid0IGRyb3AgaXQgeWV0Li4uICovCisJCUpCVUZGRVJfVFJBQ0UoamgsICJiZWxvbmdzIHRvIG9sZGVyIHRyYW5zYWN0aW9uIik7CisJCS8qIC4uLiBidXQgd2UgQ0FOIGRyb3AgaXQgZnJvbSB0aGUgbmV3IHRyYW5zYWN0aW9uIGlmIHdlCisJCSAqIGhhdmUgYWxzbyBtb2RpZmllZCBpdCBzaW5jZSB0aGUgb3JpZ2luYWwgY29tbWl0LiAqLworCisJCWlmIChqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uKSB7CisJCQlKX0FTU0VSVChqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uID09IHRyYW5zYWN0aW9uKTsKKwkJCWpoLT5iX25leHRfdHJhbnNhY3Rpb24gPSBOVUxMOworCQkJZHJvcF9yZXNlcnZlID0gMTsKKwkJfQorCX0KKworbm90X2piZDoKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCV9fYnJlbHNlKGJoKTsKK2Ryb3A6CisJaWYgKGRyb3BfcmVzZXJ2ZSkgeworCQkvKiBubyBuZWVkIHRvIHJlc2VydmUgbG9nIHNwYWNlIGZvciB0aGlzIGJsb2NrIC1ienp6ICovCisJCWhhbmRsZS0+aF9idWZmZXJfY3JlZGl0cysrOworCX0KKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIGludCBqb3VybmFsX3N0b3AoKSAtIGNvbXBsZXRlIGEgdHJhbnNhY3Rpb24KKyAqIEBoYW5kbGU6IHRyYW5hY3Rpb24gdG8gY29tcGxldGUuCisgKiAKKyAqIEFsbCBkb25lIGZvciBhIHBhcnRpY3VsYXIgaGFuZGxlLgorICoKKyAqIFRoZXJlIGlzIG5vdCBtdWNoIGFjdGlvbiBuZWVkZWQgaGVyZS4gIFdlIGp1c3QgcmV0dXJuIGFueSByZW1haW5pbmcKKyAqIGJ1ZmZlciBjcmVkaXRzIHRvIHRoZSB0cmFuc2FjdGlvbiBhbmQgcmVtb3ZlIHRoZSBoYW5kbGUuICBUaGUgb25seQorICogY29tcGxpY2F0aW9uIGlzIHRoYXQgd2UgbmVlZCB0byBzdGFydCBhIGNvbW1pdCBvcGVyYXRpb24gaWYgdGhlCisgKiBmaWxlc3lzdGVtIGlzIG1hcmtlZCBmb3Igc3luY2hyb25vdXMgdXBkYXRlLgorICoKKyAqIGpvdXJuYWxfc3RvcCBpdHNlbGYgd2lsbCBub3QgdXN1YWxseSByZXR1cm4gYW4gZXJyb3IsIGJ1dCBpdCBtYXkKKyAqIGRvIHNvIGluIHVudXN1YWwgY2lyY3Vtc3RhbmNlcy4gIEluIHBhcnRpY3VsYXIsIGV4cGVjdCBpdCB0byAKKyAqIHJldHVybiAtRUlPIGlmIGEgam91cm5hbF9hYm9ydCBoYXMgYmVlbiBleGVjdXRlZCBzaW5jZSB0aGUKKyAqIHRyYW5zYWN0aW9uIGJlZ2FuLgorICovCitpbnQgam91cm5hbF9zdG9wKGhhbmRsZV90ICpoYW5kbGUpCit7CisJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24gPSBoYW5kbGUtPmhfdHJhbnNhY3Rpb247CisJam91cm5hbF90ICpqb3VybmFsID0gdHJhbnNhY3Rpb24tPnRfam91cm5hbDsKKwlpbnQgb2xkX2hhbmRsZV9jb3VudCwgZXJyOworCisJSl9BU1NFUlQodHJhbnNhY3Rpb24tPnRfdXBkYXRlcyA+IDApOworCUpfQVNTRVJUKGpvdXJuYWxfY3VycmVudF9oYW5kbGUoKSA9PSBoYW5kbGUpOworCisJaWYgKGlzX2hhbmRsZV9hYm9ydGVkKGhhbmRsZSkpCisJCWVyciA9IC1FSU87CisJZWxzZQorCQllcnIgPSAwOworCisJaWYgKC0taGFuZGxlLT5oX3JlZiA+IDApIHsKKwkJamJkX2RlYnVnKDQsICJoX3JlZiAlZCAtPiAlZFxuIiwgaGFuZGxlLT5oX3JlZiArIDEsCisJCQkgIGhhbmRsZS0+aF9yZWYpOworCQlyZXR1cm4gZXJyOworCX0KKworCWpiZF9kZWJ1Zyg0LCAiSGFuZGxlICVwIGdvaW5nIGRvd25cbiIsIGhhbmRsZSk7CisKKwkvKgorCSAqIEltcGxlbWVudCBzeW5jaHJvbm91cyB0cmFuc2FjdGlvbiBiYXRjaGluZy4gIElmIHRoZSBoYW5kbGUKKwkgKiB3YXMgc3luY2hyb25vdXMsIGRvbid0IGZvcmNlIGEgY29tbWl0IGltbWVkaWF0ZWx5LiAgTGV0J3MKKwkgKiB5aWVsZCBhbmQgbGV0IGFub3RoZXIgdGhyZWFkIHBpZ2d5YmFjayBvbnRvIHRoaXMgdHJhbnNhY3Rpb24uCisJICogS2VlcCBkb2luZyB0aGF0IHdoaWxlIG5ldyB0aHJlYWRzIGNvbnRpbnVlIHRvIGFycml2ZS4KKwkgKiBJdCBkb2Vzbid0IGNvc3QgbXVjaCAtIHdlJ3JlIGFib3V0IHRvIHJ1biBhIGNvbW1pdCBhbmQgc2xlZXAKKwkgKiBvbiBJTyBhbnl3YXkuICBTcGVlZHMgdXAgbWFueS10aHJlYWRlZCwgbWFueS1kaXIgb3BlcmF0aW9ucworCSAqIGJ5IDMweCBvciBtb3JlLi4uCisJICovCisJaWYgKGhhbmRsZS0+aF9zeW5jKSB7CisJCWRvIHsKKwkJCW9sZF9oYW5kbGVfY291bnQgPSB0cmFuc2FjdGlvbi0+dF9oYW5kbGVfY291bnQ7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCQl9IHdoaWxlIChvbGRfaGFuZGxlX2NvdW50ICE9IHRyYW5zYWN0aW9uLT50X2hhbmRsZV9jb3VudCk7CisJfQorCisJY3VycmVudC0+am91cm5hbF9pbmZvID0gTlVMTDsKKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7CisJc3Bpbl9sb2NrKCZ0cmFuc2FjdGlvbi0+dF9oYW5kbGVfbG9jayk7CisJdHJhbnNhY3Rpb24tPnRfb3V0c3RhbmRpbmdfY3JlZGl0cyAtPSBoYW5kbGUtPmhfYnVmZmVyX2NyZWRpdHM7CisJdHJhbnNhY3Rpb24tPnRfdXBkYXRlcy0tOworCWlmICghdHJhbnNhY3Rpb24tPnRfdXBkYXRlcykgeworCQl3YWtlX3VwKCZqb3VybmFsLT5qX3dhaXRfdXBkYXRlcyk7CisJCWlmIChqb3VybmFsLT5qX2JhcnJpZXJfY291bnQpCisJCQl3YWtlX3VwKCZqb3VybmFsLT5qX3dhaXRfdHJhbnNhY3Rpb25fbG9ja2VkKTsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBoYW5kbGUgaXMgbWFya2VkIFNZTkMsIHdlIG5lZWQgdG8gc2V0IGFub3RoZXIgY29tbWl0CisJICogZ29pbmchICBXZSBhbHNvIHdhbnQgdG8gZm9yY2UgYSBjb21taXQgaWYgdGhlIGN1cnJlbnQKKwkgKiB0cmFuc2FjdGlvbiBpcyBvY2N1cHlpbmcgdG9vIG11Y2ggb2YgdGhlIGxvZywgb3IgaWYgdGhlCisJICogdHJhbnNhY3Rpb24gaXMgdG9vIG9sZCBub3cuCisJICovCisJaWYgKGhhbmRsZS0+aF9zeW5jIHx8CisJCQl0cmFuc2FjdGlvbi0+dF9vdXRzdGFuZGluZ19jcmVkaXRzID4KKwkJCQlqb3VybmFsLT5qX21heF90cmFuc2FjdGlvbl9idWZmZXJzIHx8CisJICAgIAkJdGltZV9hZnRlcl9lcShqaWZmaWVzLCB0cmFuc2FjdGlvbi0+dF9leHBpcmVzKSkgeworCQkvKiBEbyB0aGlzIGV2ZW4gZm9yIGFib3J0ZWQgam91cm5hbHM6IGFuIGFib3J0IHN0aWxsCisJCSAqIGNvbXBsZXRlcyB0aGUgY29tbWl0IHRocmVhZCwgaXQganVzdCBkb2Vzbid0IHdyaXRlCisJCSAqIGFueXRoaW5nIHRvIGRpc2suICovCisJCXRpZF90IHRpZCA9IHRyYW5zYWN0aW9uLT50X3RpZDsKKworCQlzcGluX3VubG9jaygmdHJhbnNhY3Rpb24tPnRfaGFuZGxlX2xvY2spOworCQlqYmRfZGVidWcoMiwgInRyYW5zYWN0aW9uIHRvbyBvbGQsIHJlcXVlc3RpbmcgY29tbWl0IGZvciAiCisJCQkJCSJoYW5kbGUgJXBcbiIsIGhhbmRsZSk7CisJCS8qIFRoaXMgaXMgbm9uLWJsb2NraW5nICovCisJCV9fbG9nX3N0YXJ0X2NvbW1pdChqb3VybmFsLCB0cmFuc2FjdGlvbi0+dF90aWQpOworCQlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKworCQkvKgorCQkgKiBTcGVjaWFsIGNhc2U6IEpGU19TWU5DIHN5bmNocm9ub3VzIHVwZGF0ZXMgcmVxdWlyZSB1cworCQkgKiB0byB3YWl0IGZvciB0aGUgY29tbWl0IHRvIGNvbXBsZXRlLiAgCisJCSAqLworCQlpZiAoaGFuZGxlLT5oX3N5bmMgJiYgIShjdXJyZW50LT5mbGFncyAmIFBGX01FTUFMTE9DKSkKKwkJCWVyciA9IGxvZ193YWl0X2NvbW1pdChqb3VybmFsLCB0aWQpOworCX0gZWxzZSB7CisJCXNwaW5fdW5sb2NrKCZ0cmFuc2FjdGlvbi0+dF9oYW5kbGVfbG9jayk7CisJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCX0KKworCWpiZF9mcmVlX2hhbmRsZShoYW5kbGUpOworCXJldHVybiBlcnI7Cit9CisKKy8qKmludCBqb3VybmFsX2ZvcmNlX2NvbW1pdCgpIC0gZm9yY2UgYW55IHVuY29tbWl0dGVkIHRyYW5zYWN0aW9ucworICogQGpvdXJuYWw6IGpvdXJuYWwgdG8gZm9yY2UKKyAqCisgKiBGb3Igc3luY2hyb25vdXMgb3BlcmF0aW9uczogZm9yY2UgYW55IHVuY29tbWl0dGVkIHRyYW5zYWN0aW9ucworICogdG8gZGlzay4gIE1heSBzZWVtIGtsdWRneSwgYnV0IGl0IHJldXNlcyBhbGwgdGhlIGhhbmRsZSBiYXRjaGluZworICogY29kZSBpbiBhIHZlcnkgc2ltcGxlIG1hbm5lci4KKyAqLworaW50IGpvdXJuYWxfZm9yY2VfY29tbWl0KGpvdXJuYWxfdCAqam91cm5hbCkKK3sKKwloYW5kbGVfdCAqaGFuZGxlOworCWludCByZXQ7CisKKwloYW5kbGUgPSBqb3VybmFsX3N0YXJ0KGpvdXJuYWwsIDEpOworCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7CisJfSBlbHNlIHsKKwkJaGFuZGxlLT5oX3N5bmMgPSAxOworCQlyZXQgPSBqb3VybmFsX3N0b3AoaGFuZGxlKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqCisgKiBMaXN0IG1hbmFnZW1lbnQgY29kZSBzbmlwcGV0czogdmFyaW91cyBmdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZyB0aGUKKyAqIHRyYW5zYWN0aW9uIGJ1ZmZlciBsaXN0cy4KKyAqCisgKi8KKworLyoKKyAqIEFwcGVuZCBhIGJ1ZmZlciB0byBhIHRyYW5zYWN0aW9uIGxpc3QsIGdpdmVuIHRoZSB0cmFuc2FjdGlvbidzIGxpc3QgaGVhZAorICogcG9pbnRlci4KKyAqCisgKiBqX2xpc3RfbG9jayBpcyBoZWxkLgorICoKKyAqIGpiZF9sb2NrX2JoX3N0YXRlKGpoMmJoKGpoKSkgaXMgaGVsZC4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgCitfX2JsaXN0X2FkZF9idWZmZXIoc3RydWN0IGpvdXJuYWxfaGVhZCAqKmxpc3QsIHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKQoreworCWlmICghKmxpc3QpIHsKKwkJamgtPmJfdG5leHQgPSBqaC0+Yl90cHJldiA9IGpoOworCQkqbGlzdCA9IGpoOworCX0gZWxzZSB7CisJCS8qIEluc2VydCBhdCB0aGUgdGFpbCBvZiB0aGUgbGlzdCB0byBwcmVzZXJ2ZSBvcmRlciAqLworCQlzdHJ1Y3Qgam91cm5hbF9oZWFkICpmaXJzdCA9ICpsaXN0LCAqbGFzdCA9IGZpcnN0LT5iX3RwcmV2OworCQlqaC0+Yl90cHJldiA9IGxhc3Q7CisJCWpoLT5iX3RuZXh0ID0gZmlyc3Q7CisJCWxhc3QtPmJfdG5leHQgPSBmaXJzdC0+Yl90cHJldiA9IGpoOworCX0KK30KKworLyogCisgKiBSZW1vdmUgYSBidWZmZXIgZnJvbSBhIHRyYW5zYWN0aW9uIGxpc3QsIGdpdmVuIHRoZSB0cmFuc2FjdGlvbidzIGxpc3QKKyAqIGhlYWQgcG9pbnRlci4KKyAqCisgKiBDYWxsZWQgd2l0aCBqX2xpc3RfbG9jayBoZWxkLCBhbmQgdGhlIGpvdXJuYWwgbWF5IG5vdCBiZSBsb2NrZWQuCisgKgorICogamJkX2xvY2tfYmhfc3RhdGUoamgyYmgoamgpKSBpcyBoZWxkLgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19ibGlzdF9kZWxfYnVmZmVyKHN0cnVjdCBqb3VybmFsX2hlYWQgKipsaXN0LCBzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCkKK3sKKwlpZiAoKmxpc3QgPT0gamgpIHsKKwkJKmxpc3QgPSBqaC0+Yl90bmV4dDsKKwkJaWYgKCpsaXN0ID09IGpoKQorCQkJKmxpc3QgPSBOVUxMOworCX0KKwlqaC0+Yl90cHJldi0+Yl90bmV4dCA9IGpoLT5iX3RuZXh0OworCWpoLT5iX3RuZXh0LT5iX3RwcmV2ID0gamgtPmJfdHByZXY7Cit9CisKKy8qIAorICogUmVtb3ZlIGEgYnVmZmVyIGZyb20gdGhlIGFwcHJvcHJpYXRlIHRyYW5zYWN0aW9uIGxpc3QuCisgKgorICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gY2FuICpjaGFuZ2UqIHRoZSB2YWx1ZSBvZgorICogYmgtPmJfdHJhbnNhY3Rpb24tPnRfc3luY19kYXRhbGlzdCwgdF9idWZmZXJzLCB0X2ZvcmdldCwKKyAqIHRfaW9idWZfbGlzdCwgdF9zaGFkb3dfbGlzdCwgdF9sb2dfbGlzdCBvciB0X3Jlc2VydmVkX2xpc3QuICBJZiB0aGUgY2FsbGVyCisgKiBpcyBob2xkaW5nIG9udG8gYSBjb3B5IG9mIG9uZSBvZiB0aGVlIHBvaW50ZXJzLCBpdCBjb3VsZCBnbyBiYWQuCisgKiBHZW5lcmFsbHkgdGhlIGNhbGxlciBuZWVkcyB0byByZS1yZWFkIHRoZSBwb2ludGVyIGZyb20gdGhlIHRyYW5zYWN0aW9uX3QuCisgKgorICogQ2FsbGVkIHVuZGVyIGpfbGlzdF9sb2NrLiAgVGhlIGpvdXJuYWwgbWF5IG5vdCBiZSBsb2NrZWQuCisgKi8KK3ZvaWQgX19qb3VybmFsX3RlbXBfdW5saW5rX2J1ZmZlcihzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCkKK3sKKwlzdHJ1Y3Qgam91cm5hbF9oZWFkICoqbGlzdCA9IE5VTEw7CisJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb247CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGpoMmJoKGpoKTsKKworCUpfQVNTRVJUX0pIKGpoLCBqYmRfaXNfbG9ja2VkX2JoX3N0YXRlKGJoKSk7CisJdHJhbnNhY3Rpb24gPSBqaC0+Yl90cmFuc2FjdGlvbjsKKwlpZiAodHJhbnNhY3Rpb24pCisJCWFzc2VydF9zcGluX2xvY2tlZCgmdHJhbnNhY3Rpb24tPnRfam91cm5hbC0+al9saXN0X2xvY2spOworCisJSl9BU1NFUlRfSkgoamgsIGpoLT5iX2psaXN0IDwgQkpfVHlwZXMpOworCWlmIChqaC0+Yl9qbGlzdCAhPSBCSl9Ob25lKQorCQlKX0FTU0VSVF9KSChqaCwgdHJhbnNhY3Rpb24gIT0gMCk7CisKKwlzd2l0Y2ggKGpoLT5iX2psaXN0KSB7CisJY2FzZSBCSl9Ob25lOgorCQlyZXR1cm47CisJY2FzZSBCSl9TeW5jRGF0YToKKwkJbGlzdCA9ICZ0cmFuc2FjdGlvbi0+dF9zeW5jX2RhdGFsaXN0OworCQlicmVhazsKKwljYXNlIEJKX01ldGFkYXRhOgorCQl0cmFuc2FjdGlvbi0+dF9ucl9idWZmZXJzLS07CisJCUpfQVNTRVJUX0pIKGpoLCB0cmFuc2FjdGlvbi0+dF9ucl9idWZmZXJzID49IDApOworCQlsaXN0ID0gJnRyYW5zYWN0aW9uLT50X2J1ZmZlcnM7CisJCWJyZWFrOworCWNhc2UgQkpfRm9yZ2V0OgorCQlsaXN0ID0gJnRyYW5zYWN0aW9uLT50X2ZvcmdldDsKKwkJYnJlYWs7CisJY2FzZSBCSl9JTzoKKwkJbGlzdCA9ICZ0cmFuc2FjdGlvbi0+dF9pb2J1Zl9saXN0OworCQlicmVhazsKKwljYXNlIEJKX1NoYWRvdzoKKwkJbGlzdCA9ICZ0cmFuc2FjdGlvbi0+dF9zaGFkb3dfbGlzdDsKKwkJYnJlYWs7CisJY2FzZSBCSl9Mb2dDdGw6CisJCWxpc3QgPSAmdHJhbnNhY3Rpb24tPnRfbG9nX2xpc3Q7CisJCWJyZWFrOworCWNhc2UgQkpfUmVzZXJ2ZWQ6CisJCWxpc3QgPSAmdHJhbnNhY3Rpb24tPnRfcmVzZXJ2ZWRfbGlzdDsKKwkJYnJlYWs7CisJY2FzZSBCSl9Mb2NrZWQ6CisJCWxpc3QgPSAmdHJhbnNhY3Rpb24tPnRfbG9ja2VkX2xpc3Q7CisJCWJyZWFrOworCX0KKworCV9fYmxpc3RfZGVsX2J1ZmZlcihsaXN0LCBqaCk7CisJamgtPmJfamxpc3QgPSBCSl9Ob25lOworCWlmICh0ZXN0X2NsZWFyX2J1ZmZlcl9qYmRkaXJ0eShiaCkpCisJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsJLyogRXhwb3NlIGl0IHRvIHRoZSBWTSAqLworfQorCit2b2lkIF9fam91cm5hbF91bmZpbGVfYnVmZmVyKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoKQoreworCV9fam91cm5hbF90ZW1wX3VubGlua19idWZmZXIoamgpOworCWpoLT5iX3RyYW5zYWN0aW9uID0gTlVMTDsKK30KKwordm9pZCBqb3VybmFsX3VuZmlsZV9idWZmZXIoam91cm5hbF90ICpqb3VybmFsLCBzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCkKK3sKKwlqYmRfbG9ja19iaF9zdGF0ZShqaDJiaChqaCkpOworCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCV9fam91cm5hbF91bmZpbGVfYnVmZmVyKGpoKTsKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCWpiZF91bmxvY2tfYmhfc3RhdGUoamgyYmgoamgpKTsKK30KKworLyoKKyAqIENhbGxlZCBmcm9tIGpvdXJuYWxfdHJ5X3RvX2ZyZWVfYnVmZmVycygpLgorICoKKyAqIENhbGxlZCB1bmRlciBqYmRfbG9ja19iaF9zdGF0ZShiaCkKKyAqLworc3RhdGljIHZvaWQKK19fam91cm5hbF90cnlfdG9fZnJlZV9idWZmZXIoam91cm5hbF90ICpqb3VybmFsLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXN0cnVjdCBqb3VybmFsX2hlYWQgKmpoOworCisJamggPSBiaDJqaChiaCk7CisKKwlpZiAoYnVmZmVyX2xvY2tlZChiaCkgfHwgYnVmZmVyX2RpcnR5KGJoKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoamgtPmJfbmV4dF90cmFuc2FjdGlvbiAhPSAwKQorCQlnb3RvIG91dDsKKworCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCWlmIChqaC0+Yl90cmFuc2FjdGlvbiAhPSAwICYmIGpoLT5iX2NwX3RyYW5zYWN0aW9uID09IDApIHsKKwkJaWYgKGpoLT5iX2psaXN0ID09IEJKX1N5bmNEYXRhIHx8IGpoLT5iX2psaXN0ID09IEJKX0xvY2tlZCkgeworCQkJLyogQSB3cml0dGVuLWJhY2sgb3JkZXJlZCBkYXRhIGJ1ZmZlciAqLworCQkJSkJVRkZFUl9UUkFDRShqaCwgInJlbGVhc2UgZGF0YSIpOworCQkJX19qb3VybmFsX3VuZmlsZV9idWZmZXIoamgpOworCQkJam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKGJoKTsKKwkJCV9fYnJlbHNlKGJoKTsKKwkJfQorCX0gZWxzZSBpZiAoamgtPmJfY3BfdHJhbnNhY3Rpb24gIT0gMCAmJiBqaC0+Yl90cmFuc2FjdGlvbiA9PSAwKSB7CisJCS8qIHdyaXR0ZW4tYmFjayBjaGVja3BvaW50ZWQgbWV0YWRhdGEgYnVmZmVyICovCisJCWlmIChqaC0+Yl9qbGlzdCA9PSBCSl9Ob25lKSB7CisJCQlKQlVGRkVSX1RSQUNFKGpoLCAicmVtb3ZlIGZyb20gY2hlY2twb2ludCBsaXN0Iik7CisJCQlfX2pvdXJuYWxfcmVtb3ZlX2NoZWNrcG9pbnQoamgpOworCQkJam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKGJoKTsKKwkJCV9fYnJlbHNlKGJoKTsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworb3V0OgorCXJldHVybjsKK30KKworCisvKiogCisgKiBpbnQgam91cm5hbF90cnlfdG9fZnJlZV9idWZmZXJzKCkgLSB0cnkgdG8gZnJlZSBwYWdlIGJ1ZmZlcnMuCisgKiBAam91cm5hbDogam91cm5hbCBmb3Igb3BlcmF0aW9uCisgKiBAcGFnZTogdG8gdHJ5IGFuZCBmcmVlCisgKiBAdW51c2VkX2dmcF9tYXNrOiB1bnVzZWQKKyAqCisgKiAKKyAqIEZvciBhbGwgdGhlIGJ1ZmZlcnMgb24gdGhpcyBwYWdlLAorICogaWYgdGhleSBhcmUgZnVsbHkgd3JpdHRlbiBvdXQgb3JkZXJlZCBkYXRhLCBtb3ZlIHRoZW0gb250byBCVUZfQ0xFQU4KKyAqIHNvIHRyeV90b19mcmVlX2J1ZmZlcnMoKSBjYW4gcmVhcCB0aGVtLgorICogCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8gaWYgd2Ugd2lzaCB0cnlfdG9fZnJlZV9idWZmZXJzKCkKKyAqIHRvIGJlIGNhbGxlZC4gV2UgZG8gdGhpcyBpZiB0aGUgcGFnZSBpcyByZWxlYXNhYmxlIGJ5IHRyeV90b19mcmVlX2J1ZmZlcnMoKS4KKyAqIFdlIGFsc28gZG8gaXQgaWYgdGhlIHBhZ2UgaGFzIGxvY2tlZCBvciBkaXJ0eSBidWZmZXJzIGFuZCB0aGUgY2FsbGVyIHdhbnRzCisgKiB1cyB0byBwZXJmb3JtIHN5bmMgb3IgYXN5bmMgd3JpdGVvdXQuCisgKgorICogVGhpcyBjb21wbGljYXRlcyBKQkQgbG9ja2luZyBzb21ld2hhdC4gIFdlIGFyZW4ndCBwcm90ZWN0ZWQgYnkgdGhlCisgKiBCS0wgaGVyZS4gIFdlIHdpc2ggdG8gcmVtb3ZlIHRoZSBidWZmZXIgZnJvbSBpdHMgY29tbWl0dGluZyBvcgorICogcnVubmluZyB0cmFuc2FjdGlvbidzIC0+dF9kYXRhbGlzdCB2aWEgX19qb3VybmFsX3VuZmlsZV9idWZmZXIuCisgKgorICogVGhpcyBtYXkgKmNoYW5nZSogdGhlIHZhbHVlIG9mIHRyYW5zYWN0aW9uX3QtPnRfZGF0YWxpc3QsIHNvIGFueW9uZQorICogd2hvIGxvb2tzIGF0IHRfZGF0YWxpc3QgbmVlZHMgdG8gbG9jayBhZ2FpbnN0IHRoaXMgZnVuY3Rpb24uCisgKgorICogRXZlbiB3b3JzZSwgc29tZW9uZSBtYXkgYmUgZG9pbmcgYSBqb3VybmFsX2RpcnR5X2RhdGEgb24gdGhpcworICogYnVmZmVyLiAgU28gd2UgbmVlZCB0byBsb2NrIGFnYWluc3QgdGhhdC4gIGpvdXJuYWxfZGlydHlfZGF0YSgpCisgKiB3aWxsIGNvbWUgb3V0IG9mIHRoZSBsb2NrIHdpdGggdGhlIGJ1ZmZlciBkaXJ0eSwgd2hpY2ggbWFrZXMgaXQKKyAqIGluZWxpZ2libGUgZm9yIHJlbGVhc2UgaGVyZS4KKyAqCisgKiBXaG8gZWxzZSBpcyBhZmZlY3RlZCBieSB0aGlzPyAgaG1tLi4uICBSZWFsbHkgdGhlIG9ubHkgY29udGVuZGVyCisgKiBpcyBkb19nZXRfd3JpdGVfYWNjZXNzKCkgLSBpdCBjb3VsZCBiZSBsb29raW5nIGF0IHRoZSBidWZmZXIgd2hpbGUKKyAqIGpvdXJuYWxfdHJ5X3RvX2ZyZWVfYnVmZmVyKCkgaXMgY2hhbmdpbmcgaXRzIHN0YXRlLiAgQnV0IHRoYXQKKyAqIGNhbm5vdCBoYXBwZW4gYmVjYXVzZSB3ZSBuZXZlciByZWFsbG9jYXRlIGZyZWVkIGRhdGEgYXMgbWV0YWRhdGEKKyAqIHdoaWxlIHRoZSBkYXRhIGlzIHBhcnQgb2YgYSB0cmFuc2FjdGlvbi4gIFllcz8KKyAqLworaW50IGpvdXJuYWxfdHJ5X3RvX2ZyZWVfYnVmZmVycyhqb3VybmFsX3QgKmpvdXJuYWwsIAorCQkJCXN0cnVjdCBwYWdlICpwYWdlLCBpbnQgdW51c2VkX2dmcF9tYXNrKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWludCByZXQgPSAwOworCisJSl9BU1NFUlQoUGFnZUxvY2tlZChwYWdlKSk7CisKKwloZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCWJoID0gaGVhZDsKKwlkbyB7CisJCXN0cnVjdCBqb3VybmFsX2hlYWQgKmpoOworCisJCS8qCisJCSAqIFdlIHRha2Ugb3VyIG93biByZWYgYWdhaW5zdCB0aGUgam91cm5hbF9oZWFkIGhlcmUgdG8gYXZvaWQKKwkJICogaGF2aW5nIHRvIGFkZCB0b25zIG9mIGxvY2tpbmcgYXJvdW5kIGVhY2ggaW5zdGFuY2Ugb2YKKwkJICogam91cm5hbF9yZW1vdmVfam91cm5hbF9oZWFkKCkgYW5kIGpvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZCgpLgorCQkgKi8KKwkJamggPSBqb3VybmFsX2dyYWJfam91cm5hbF9oZWFkKGJoKTsKKwkJaWYgKCFqaCkKKwkJCWNvbnRpbnVlOworCisJCWpiZF9sb2NrX2JoX3N0YXRlKGJoKTsKKwkJX19qb3VybmFsX3RyeV90b19mcmVlX2J1ZmZlcihqb3VybmFsLCBiaCk7CisJCWpvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZChqaCk7CisJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQlpZiAoYnVmZmVyX2piZChiaCkpCisJCQlnb3RvIGJ1c3k7CisJfSB3aGlsZSAoKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKKwlyZXQgPSB0cnlfdG9fZnJlZV9idWZmZXJzKHBhZ2UpOworYnVzeToKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogVGhpcyBidWZmZXIgaXMgbm8gbG9uZ2VyIG5lZWRlZC4gIElmIGl0IGlzIG9uIGFuIG9sZGVyIHRyYW5zYWN0aW9uJ3MKKyAqIGNoZWNrcG9pbnQgbGlzdCB3ZSBuZWVkIHRvIHJlY29yZCBpdCBvbiB0aGlzIHRyYW5zYWN0aW9uJ3MgZm9yZ2V0IGxpc3QKKyAqIHRvIHBpbiB0aGlzIGJ1ZmZlciAoYW5kIGhlbmNlIGl0cyBjaGVja3BvaW50aW5nIHRyYW5zYWN0aW9uKSBkb3duIHVudGlsCisgKiB0aGlzIHRyYW5zYWN0aW9uIGNvbW1pdHMuICBJZiB0aGUgYnVmZmVyIGlzbid0IG9uIGEgY2hlY2twb2ludCBsaXN0LCB3ZQorICogcmVsZWFzZSBpdC4KKyAqIFJldHVybnMgbm9uLXplcm8gaWYgSkJEIG5vIGxvbmdlciBoYXMgYW4gaW50ZXJlc3QgaW4gdGhlIGJ1ZmZlci4KKyAqCisgKiBDYWxsZWQgdW5kZXIgal9saXN0X2xvY2suCisgKgorICogQ2FsbGVkIHVuZGVyIGpiZF9sb2NrX2JoX3N0YXRlKGJoKS4KKyAqLworc3RhdGljIGludCBfX2Rpc3Bvc2VfYnVmZmVyKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoLCB0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbikKK3sKKwlpbnQgbWF5X2ZyZWUgPSAxOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBqaDJiaChqaCk7CisKKwlfX2pvdXJuYWxfdW5maWxlX2J1ZmZlcihqaCk7CisKKwlpZiAoamgtPmJfY3BfdHJhbnNhY3Rpb24pIHsKKwkJSkJVRkZFUl9UUkFDRShqaCwgIm9uIHJ1bm5pbmcrY3AgdHJhbnNhY3Rpb24iKTsKKwkJX19qb3VybmFsX2ZpbGVfYnVmZmVyKGpoLCB0cmFuc2FjdGlvbiwgQkpfRm9yZ2V0KTsKKwkJY2xlYXJfYnVmZmVyX2piZGRpcnR5KGJoKTsKKwkJbWF5X2ZyZWUgPSAwOworCX0gZWxzZSB7CisJCUpCVUZGRVJfVFJBQ0UoamgsICJvbiBydW5uaW5nIHRyYW5zYWN0aW9uIik7CisJCWpvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZChiaCk7CisJCV9fYnJlbHNlKGJoKTsKKwl9CisJcmV0dXJuIG1heV9mcmVlOworfQorCisvKgorICogam91cm5hbF9pbnZhbGlkYXRlcGFnZSAKKyAqCisgKiBUaGlzIGNvZGUgaXMgdHJpY2t5LiAgSXQgaGFzIGEgbnVtYmVyIG9mIGNhc2VzIHRvIGRlYWwgd2l0aC4KKyAqCisgKiBUaGVyZSBhcmUgdHdvIGludmFyaWFudHMgd2hpY2ggdGhpcyBjb2RlIHJlbGllcyBvbjoKKyAqCisgKiBpX3NpemUgbXVzdCBiZSB1cGRhdGVkIG9uIGRpc2sgYmVmb3JlIHdlIHN0YXJ0IGNhbGxpbmcgaW52YWxpZGF0ZXBhZ2Ugb24gdGhlCisgKiBkYXRhLgorICogCisgKiAgVGhpcyBpcyBkb25lIGluIGV4dDMgYnkgZGVmaW5pbmcgYW4gZXh0M19zZXRhdHRyIG1ldGhvZCB3aGljaAorICogIHVwZGF0ZXMgaV9zaXplIGJlZm9yZSB0cnVuY2F0ZSBnZXRzIGdvaW5nLiAgQnkgbWFpbnRhaW5pbmcgdGhpcworICogIGludmFyaWFudCwgd2UgY2FuIGJlIHN1cmUgdGhhdCBpdCBpcyBzYWZlIHRvIHRocm93IGF3YXkgYW55IGJ1ZmZlcnMKKyAqICBhdHRhY2hlZCB0byB0aGUgY3VycmVudCB0cmFuc2FjdGlvbjogb25jZSB0aGUgdHJhbnNhY3Rpb24gY29tbWl0cywKKyAqICB3ZSBrbm93IHRoYXQgdGhlIGRhdGEgd2lsbCBub3QgYmUgbmVlZGVkLgorICogCisgKiAgTm90ZSBob3dldmVyIHRoYXQgd2UgY2FuICpub3QqIHRocm93IGF3YXkgZGF0YSBiZWxvbmdpbmcgdG8gdGhlCisgKiAgcHJldmlvdXMsIGNvbW1pdHRpbmcgdHJhbnNhY3Rpb24hICAKKyAqCisgKiBBbnkgZGlzayBibG9ja3Mgd2hpY2ggKmFyZSogcGFydCBvZiB0aGUgcHJldmlvdXMsIGNvbW1pdHRpbmcKKyAqIHRyYW5zYWN0aW9uIChhbmQgd2hpY2ggdGhlcmVmb3JlIGNhbm5vdCBiZSBkaXNjYXJkZWQgaW1tZWRpYXRlbHkpIGFyZQorICogbm90IGdvaW5nIHRvIGJlIHJldXNlZCBpbiB0aGUgbmV3IHJ1bm5pbmcgdHJhbnNhY3Rpb24KKyAqCisgKiAgVGhlIGJpdG1hcCBjb21taXR0ZWRfZGF0YSBpbWFnZXMgZ3VhcmFudGVlIHRoaXM6IGFueSBibG9jayB3aGljaCBpcworICogIGFsbG9jYXRlZCBpbiBvbmUgdHJhbnNhY3Rpb24gYW5kIHJlbW92ZWQgaW4gdGhlIG5leHQgd2lsbCBiZSBtYXJrZWQKKyAqICBhcyBpbi11c2UgaW4gdGhlIGNvbW1pdHRlZF9kYXRhIGJpdG1hcCwgc28gY2Fubm90IGJlIHJldXNlZCB1bnRpbAorICogIHRoZSBuZXh0IHRyYW5zYWN0aW9uIHRvIGRlbGV0ZSB0aGUgYmxvY2sgY29tbWl0cy4gIFRoaXMgbWVhbnMgdGhhdAorICogIGxlYXZpbmcgY29tbWl0dGluZyBidWZmZXJzIGRpcnR5IGlzIHF1aXRlIHNhZmU6IHRoZSBkaXNrIGJsb2NrcworICogIGNhbm5vdCBiZSByZWFsbG9jYXRlZCB0byBhIGRpZmZlcmVudCBmaWxlIGFuZCBzbyBidWZmZXIgYWxpYXNpbmcgaXMKKyAqICBub3QgcG9zc2libGUuCisgKgorICoKKyAqIFRoZSBhYm92ZSBhcHBsaWVzIG1haW5seSB0byBvcmRlcmVkIGRhdGEgbW9kZS4gIEluIHdyaXRlYmFjayBtb2RlIHdlCisgKiBkb24ndCBtYWtlIGd1YXJhbnRlZXMgYWJvdXQgdGhlIG9yZGVyIGluIHdoaWNoIGRhdGEgaGl0cyBkaXNrIC0tLSBpbgorICogcGFydGljdWxhciB3ZSBkb24ndCBndWFyYW50ZWUgdGhhdCBuZXcgZGlydHkgZGF0YSBpcyBmbHVzaGVkIGJlZm9yZQorICogdHJhbnNhY3Rpb24gY29tbWl0IC0tLSBzbyBpdCBpcyBhbHdheXMgc2FmZSBqdXN0IHRvIGRpc2NhcmQgZGF0YQorICogaW1tZWRpYXRlbHkgaW4gdGhhdCBtb2RlLiAgLS1zY3QgCisgKi8KKworLyoKKyAqIFRoZSBqb3VybmFsX3VubWFwX2J1ZmZlciBoZWxwZXIgZnVuY3Rpb24gcmV0dXJucyB6ZXJvIGlmIHRoZSBidWZmZXIKKyAqIGNvbmNlcm5lZCByZW1haW5zIHBpbm5lZCBhcyBhbiBhbm9ueW1vdXMgYnVmZmVyIGJlbG9uZ2luZyB0byBhbiBvbGRlcgorICogdHJhbnNhY3Rpb24uCisgKgorICogV2UncmUgb3V0c2lkZS10cmFuc2FjdGlvbiBoZXJlLiAgRWl0aGVyIG9yIGJvdGggb2Ygal9ydW5uaW5nX3RyYW5zYWN0aW9uCisgKiBhbmQgal9jb21taXR0aW5nX3RyYW5zYWN0aW9uIG1heSBiZSBOVUxMLgorICovCitzdGF0aWMgaW50IGpvdXJuYWxfdW5tYXBfYnVmZmVyKGpvdXJuYWxfdCAqam91cm5hbCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwl0cmFuc2FjdGlvbl90ICp0cmFuc2FjdGlvbjsKKwlzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaDsKKwlpbnQgbWF5X2ZyZWUgPSAxOworCWludCByZXQ7CisKKwlCVUZGRVJfVFJBQ0UoYmgsICJlbnRyeSIpOworCisJLyoKKwkgKiBJdCBpcyBzYWZlIHRvIHByb2NlZWQgaGVyZSB3aXRob3V0IHRoZSBqX2xpc3RfbG9jayBiZWNhdXNlIHRoZQorCSAqIGJ1ZmZlcnMgY2Fubm90IGJlIHN0b2xlbiBieSB0cnlfdG9fZnJlZV9idWZmZXJzIGFzIGxvbmcgYXMgd2UgYXJlCisJICogaG9sZGluZyB0aGUgcGFnZSBsb2NrLiAtLXNjdAorCSAqLworCisJaWYgKCFidWZmZXJfamJkKGJoKSkKKwkJZ290byB6YXBfYnVmZmVyX3VubG9ja2VkOworCisJc3Bpbl9sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCWpiZF9sb2NrX2JoX3N0YXRlKGJoKTsKKwlzcGluX2xvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKworCWpoID0gam91cm5hbF9ncmFiX2pvdXJuYWxfaGVhZChiaCk7CisJaWYgKCFqaCkKKwkJZ290byB6YXBfYnVmZmVyX25vX2poOworCisJdHJhbnNhY3Rpb24gPSBqaC0+Yl90cmFuc2FjdGlvbjsKKwlpZiAodHJhbnNhY3Rpb24gPT0gTlVMTCkgeworCQkvKiBGaXJzdCBjYXNlOiBub3Qgb24gYW55IHRyYW5zYWN0aW9uLiAgSWYgaXQKKwkJICogaGFzIG5vIGNoZWNrcG9pbnQgbGluaywgdGhlbiB3ZSBjYW4gemFwIGl0OgorCQkgKiBpdCdzIGEgd3JpdGViYWNrLW1vZGUgYnVmZmVyIHNvIHdlIGRvbid0IGNhcmUKKwkJICogaWYgaXQgaGl0cyBkaXNrIHNhZmVseS4gKi8KKwkJaWYgKCFqaC0+Yl9jcF90cmFuc2FjdGlvbikgeworCQkJSkJVRkZFUl9UUkFDRShqaCwgIm5vdCBvbiBhbnkgdHJhbnNhY3Rpb246IHphcCIpOworCQkJZ290byB6YXBfYnVmZmVyOworCQl9CisKKwkJaWYgKCFidWZmZXJfZGlydHkoYmgpKSB7CisJCQkvKiBiZGZsdXNoIGhhcyB3cml0dGVuIGl0LiAgV2UgY2FuIGRyb3AgaXQgbm93ICovCisJCQlnb3RvIHphcF9idWZmZXI7CisJCX0KKworCQkvKiBPSywgaXQgbXVzdCBiZSBpbiB0aGUgam91cm5hbCBidXQgc3RpbGwgbm90CisJCSAqIHdyaXR0ZW4gZnVsbHkgdG8gZGlzazogaXQncyBtZXRhZGF0YSBvcgorCQkgKiBqb3VybmFsZWQgZGF0YS4uLiAqLworCisJCWlmIChqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb24pIHsKKwkJCS8qIC4uLiBhbmQgb25jZSB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBoYXMKKwkJCSAqIGNvbW1pdHRlZCwgdGhlIGJ1ZmZlciB3b24ndCBiZSBuZWVkZWQgYW55CisJCQkgKiBsb25nZXIuICovCisJCQlKQlVGRkVSX1RSQUNFKGpoLCAiY2hlY2twb2ludGVkOiBhZGQgdG8gQkpfRm9yZ2V0Iik7CisJCQlyZXQgPSBfX2Rpc3Bvc2VfYnVmZmVyKGpoLAorCQkJCQlqb3VybmFsLT5qX3J1bm5pbmdfdHJhbnNhY3Rpb24pOworCQkJam91cm5hbF9wdXRfam91cm5hbF9oZWFkKGpoKTsKKwkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKwkJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX3N0YXRlX2xvY2spOworCQkJcmV0dXJuIHJldDsKKwkJfSBlbHNlIHsKKwkJCS8qIFRoZXJlIGlzIG5vIGN1cnJlbnRseS1ydW5uaW5nIHRyYW5zYWN0aW9uLiBTbyB0aGUKKwkJCSAqIG9ycGhhbiByZWNvcmQgd2hpY2ggd2Ugd3JvdGUgZm9yIHRoaXMgZmlsZSBtdXN0IGhhdmUKKwkJCSAqIHBhc3NlZCBpbnRvIGNvbW1pdC4gIFdlIG11c3QgYXR0YWNoIHRoaXMgYnVmZmVyIHRvCisJCQkgKiB0aGUgY29tbWl0dGluZyB0cmFuc2FjdGlvbiwgaWYgaXQgZXhpc3RzLiAqLworCQkJaWYgKGpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbikgeworCQkJCUpCVUZGRVJfVFJBQ0UoamgsICJnaXZlIHRvIGNvbW1pdHRpbmcgdHJhbnMiKTsKKwkJCQlyZXQgPSBfX2Rpc3Bvc2VfYnVmZmVyKGpoLAorCQkJCQlqb3VybmFsLT5qX2NvbW1pdHRpbmdfdHJhbnNhY3Rpb24pOworCQkJCWpvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZChqaCk7CisJCQkJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfbGlzdF9sb2NrKTsKKwkJCQlqYmRfdW5sb2NrX2JoX3N0YXRlKGJoKTsKKwkJCQlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfSBlbHNlIHsKKwkJCQkvKiBUaGUgb3JwaGFuIHJlY29yZCdzIHRyYW5zYWN0aW9uIGhhcworCQkJCSAqIGNvbW1pdHRlZC4gIFdlIGNhbiBjbGVhbnNlIHRoaXMgYnVmZmVyICovCisJCQkJY2xlYXJfYnVmZmVyX2piZGRpcnR5KGJoKTsKKwkJCQlnb3RvIHphcF9idWZmZXI7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKHRyYW5zYWN0aW9uID09IGpvdXJuYWwtPmpfY29tbWl0dGluZ190cmFuc2FjdGlvbikgeworCQkvKiBJZiBpdCBpcyBjb21taXR0aW5nLCB3ZSBzaW1wbHkgY2Fubm90IHRvdWNoIGl0LiAgV2UKKwkJICogY2FuIHJlbW92ZSBpdCdzIG5leHRfdHJhbnNhY3Rpb24gcG9pbnRlciBmcm9tIHRoZQorCQkgKiBydW5uaW5nIHRyYW5zYWN0aW9uIGlmIHRoYXQgaXMgc2V0LCBidXQgbm90aGluZworCQkgKiBlbHNlLiAqLworCQlKQlVGRkVSX1RSQUNFKGpoLCAib24gY29tbWl0dGluZyB0cmFuc2FjdGlvbiIpOworCQlzZXRfYnVmZmVyX2ZyZWVkKGJoKTsKKwkJaWYgKGpoLT5iX25leHRfdHJhbnNhY3Rpb24pIHsKKwkJCUpfQVNTRVJUKGpoLT5iX25leHRfdHJhbnNhY3Rpb24gPT0KKwkJCQkJam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uKTsKKwkJCWpoLT5iX25leHRfdHJhbnNhY3Rpb24gPSBOVUxMOworCQl9CisJCWpvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZChqaCk7CisJCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCQlzcGluX3VubG9jaygmam91cm5hbC0+al9zdGF0ZV9sb2NrKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJLyogR29vZCwgdGhlIGJ1ZmZlciBiZWxvbmdzIHRvIHRoZSBydW5uaW5nIHRyYW5zYWN0aW9uLgorCQkgKiBXZSBhcmUgd3JpdGluZyBvdXIgb3duIHRyYW5zYWN0aW9uJ3MgZGF0YSwgbm90IGFueQorCQkgKiBwcmV2aW91cyBvbmUncywgc28gaXQgaXMgc2FmZSB0byB0aHJvdyBpdCBhd2F5CisJCSAqIChyZW1lbWJlciB0aGF0IHdlIGV4cGVjdCB0aGUgZmlsZXN5c3RlbSB0byBoYXZlIHNldAorCQkgKiBpX3NpemUgYWxyZWFkeSBmb3IgdGhpcyB0cnVuY2F0ZSBzbyByZWNvdmVyeSB3aWxsIG5vdAorCQkgKiBleHBvc2UgdGhlIGRpc2sgYmxvY2tzIHdlIGFyZSBkaXNjYXJkaW5nIGhlcmUuKSAqLworCQlKX0FTU0VSVF9KSChqaCwgdHJhbnNhY3Rpb24gPT0gam91cm5hbC0+al9ydW5uaW5nX3RyYW5zYWN0aW9uKTsKKwkJbWF5X2ZyZWUgPSBfX2Rpc3Bvc2VfYnVmZmVyKGpoLCB0cmFuc2FjdGlvbik7CisJfQorCit6YXBfYnVmZmVyOgorCWpvdXJuYWxfcHV0X2pvdXJuYWxfaGVhZChqaCk7Cit6YXBfYnVmZmVyX25vX2poOgorCXNwaW5fdW5sb2NrKCZqb3VybmFsLT5qX2xpc3RfbG9jayk7CisJamJkX3VubG9ja19iaF9zdGF0ZShiaCk7CisJc3Bpbl91bmxvY2soJmpvdXJuYWwtPmpfc3RhdGVfbG9jayk7Cit6YXBfYnVmZmVyX3VubG9ja2VkOgorCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisJSl9BU1NFUlRfQkgoYmgsICFidWZmZXJfamJkZGlydHkoYmgpKTsKKwljbGVhcl9idWZmZXJfbWFwcGVkKGJoKTsKKwljbGVhcl9idWZmZXJfcmVxKGJoKTsKKwljbGVhcl9idWZmZXJfbmV3KGJoKTsKKwliaC0+Yl9iZGV2ID0gTlVMTDsKKwlyZXR1cm4gbWF5X2ZyZWU7Cit9CisKKy8qKiAKKyAqIGludCBqb3VybmFsX2ludmFsaWRhdGVwYWdlKCkgCisgKiBAam91cm5hbDogam91cm5hbCB0byB1c2UgZm9yIGZsdXNoLi4uIAorICogQHBhZ2U6ICAgIHBhZ2UgdG8gZmx1c2gKKyAqIEBvZmZzZXQ6ICBsZW5ndGggb2YgcGFnZSB0byBpbnZhbGlkYXRlLgorICoKKyAqIFJlYXAgcGFnZSBidWZmZXJzIGNvbnRhaW5pbmcgZGF0YSBhZnRlciBvZmZzZXQgaW4gcGFnZS4KKyAqCisgKiBSZXR1cm4gbm9uLXplcm8gaWYgdGhlIHBhZ2UncyBidWZmZXJzIHdlcmUgc3VjY2Vzc2Z1bGx5IHJlYXBlZC4KKyAqLworaW50IGpvdXJuYWxfaW52YWxpZGF0ZXBhZ2Uoam91cm5hbF90ICpqb3VybmFsLCAKKwkJICAgICAgc3RydWN0IHBhZ2UgKnBhZ2UsIAorCQkgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQsICpiaCwgKm5leHQ7CisJdW5zaWduZWQgaW50IGN1cnJfb2ZmID0gMDsKKwlpbnQgbWF5X2ZyZWUgPSAxOworCisJaWYgKCFQYWdlTG9ja2VkKHBhZ2UpKQorCQlCVUcoKTsKKwlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpCisJCXJldHVybiAxOworCisJLyogV2Ugd2lsbCBwb3RlbnRpYWxseSBiZSBwbGF5aW5nIHdpdGggbGlzdHMgb3RoZXIgdGhhbiBqdXN0IHRoZQorCSAqIGRhdGEgbGlzdHMgKGVzcGVjaWFsbHkgZm9yIGpvdXJuYWxlZCBkYXRhIG1vZGUpLCBzbyBiZQorCSAqIGNhdXRpb3VzIGluIG91ciBsb2NraW5nLiAqLworCisJaGVhZCA9IGJoID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCWRvIHsKKwkJdW5zaWduZWQgaW50IG5leHRfb2ZmID0gY3Vycl9vZmYgKyBiaC0+Yl9zaXplOworCQluZXh0ID0gYmgtPmJfdGhpc19wYWdlOworCisJCS8qIEFLUE06IGRvaW5nIGxvY2tfYnVmZmVyIGhlcmUgbWF5IGJlIG92ZXJseSBwYXJhbm9pZCAqLworCQlpZiAob2Zmc2V0IDw9IGN1cnJfb2ZmKSB7CisJCSAJLyogVGhpcyBibG9jayBpcyB3aG9sbHkgb3V0c2lkZSB0aGUgdHJ1bmNhdGlvbiBwb2ludCAqLworCQkJbG9ja19idWZmZXIoYmgpOworCQkJbWF5X2ZyZWUgJj0gam91cm5hbF91bm1hcF9idWZmZXIoam91cm5hbCwgYmgpOworCQkJdW5sb2NrX2J1ZmZlcihiaCk7CisJCX0KKwkJY3Vycl9vZmYgPSBuZXh0X29mZjsKKwkJYmggPSBuZXh0OworCisJfSB3aGlsZSAoYmggIT0gaGVhZCk7CisKKwlpZiAoIW9mZnNldCkgeworCQlpZiAoIW1heV9mcmVlIHx8ICF0cnlfdG9fZnJlZV9idWZmZXJzKHBhZ2UpKQorCQkJcmV0dXJuIDA7CisJCUpfQVNTRVJUKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qIAorICogRmlsZSBhIGJ1ZmZlciBvbiB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24gbGlzdC4gCisgKi8KK3ZvaWQgX19qb3VybmFsX2ZpbGVfYnVmZmVyKHN0cnVjdCBqb3VybmFsX2hlYWQgKmpoLAorCQkJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24sIGludCBqbGlzdCkKK3sKKwlzdHJ1Y3Qgam91cm5hbF9oZWFkICoqbGlzdCA9IE5VTEw7CisJaW50IHdhc19kaXJ0eSA9IDA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGpoMmJoKGpoKTsKKworCUpfQVNTRVJUX0pIKGpoLCBqYmRfaXNfbG9ja2VkX2JoX3N0YXRlKGJoKSk7CisJYXNzZXJ0X3NwaW5fbG9ja2VkKCZ0cmFuc2FjdGlvbi0+dF9qb3VybmFsLT5qX2xpc3RfbG9jayk7CisKKwlKX0FTU0VSVF9KSChqaCwgamgtPmJfamxpc3QgPCBCSl9UeXBlcyk7CisJSl9BU1NFUlRfSkgoamgsIGpoLT5iX3RyYW5zYWN0aW9uID09IHRyYW5zYWN0aW9uIHx8CisJCQkJamgtPmJfdHJhbnNhY3Rpb24gPT0gMCk7CisKKwlpZiAoamgtPmJfdHJhbnNhY3Rpb24gJiYgamgtPmJfamxpc3QgPT0gamxpc3QpCisJCXJldHVybjsKKworCS8qIFRoZSBmb2xsb3dpbmcgbGlzdCBvZiBidWZmZXIgc3RhdGVzIG5lZWRzIHRvIGJlIGNvbnNpc3RlbnQKKwkgKiB3aXRoIF9famJkX3VuZXhwZWN0ZWRfZGlydHlfYnVmZmVyKCkncyBoYW5kbGluZyBvZiBkaXJ0eQorCSAqIHN0YXRlLiAqLworCisJaWYgKGpsaXN0ID09IEJKX01ldGFkYXRhIHx8IGpsaXN0ID09IEJKX1Jlc2VydmVkIHx8IAorCSAgICBqbGlzdCA9PSBCSl9TaGFkb3cgfHwgamxpc3QgPT0gQkpfRm9yZ2V0KSB7CisJCWlmICh0ZXN0X2NsZWFyX2J1ZmZlcl9kaXJ0eShiaCkgfHwKKwkJICAgIHRlc3RfY2xlYXJfYnVmZmVyX2piZGRpcnR5KGJoKSkKKwkJCXdhc19kaXJ0eSA9IDE7CisJfQorCisJaWYgKGpoLT5iX3RyYW5zYWN0aW9uKQorCQlfX2pvdXJuYWxfdGVtcF91bmxpbmtfYnVmZmVyKGpoKTsKKwlqaC0+Yl90cmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uOworCisJc3dpdGNoIChqbGlzdCkgeworCWNhc2UgQkpfTm9uZToKKwkJSl9BU1NFUlRfSkgoamgsICFqaC0+Yl9jb21taXR0ZWRfZGF0YSk7CisJCUpfQVNTRVJUX0pIKGpoLCAhamgtPmJfZnJvemVuX2RhdGEpOworCQlyZXR1cm47CisJY2FzZSBCSl9TeW5jRGF0YToKKwkJbGlzdCA9ICZ0cmFuc2FjdGlvbi0+dF9zeW5jX2RhdGFsaXN0OworCQlicmVhazsKKwljYXNlIEJKX01ldGFkYXRhOgorCQl0cmFuc2FjdGlvbi0+dF9ucl9idWZmZXJzKys7CisJCWxpc3QgPSAmdHJhbnNhY3Rpb24tPnRfYnVmZmVyczsKKwkJYnJlYWs7CisJY2FzZSBCSl9Gb3JnZXQ6CisJCWxpc3QgPSAmdHJhbnNhY3Rpb24tPnRfZm9yZ2V0OworCQlicmVhazsKKwljYXNlIEJKX0lPOgorCQlsaXN0ID0gJnRyYW5zYWN0aW9uLT50X2lvYnVmX2xpc3Q7CisJCWJyZWFrOworCWNhc2UgQkpfU2hhZG93OgorCQlsaXN0ID0gJnRyYW5zYWN0aW9uLT50X3NoYWRvd19saXN0OworCQlicmVhazsKKwljYXNlIEJKX0xvZ0N0bDoKKwkJbGlzdCA9ICZ0cmFuc2FjdGlvbi0+dF9sb2dfbGlzdDsKKwkJYnJlYWs7CisJY2FzZSBCSl9SZXNlcnZlZDoKKwkJbGlzdCA9ICZ0cmFuc2FjdGlvbi0+dF9yZXNlcnZlZF9saXN0OworCQlicmVhazsKKwljYXNlIEJKX0xvY2tlZDoKKwkJbGlzdCA9ICAmdHJhbnNhY3Rpb24tPnRfbG9ja2VkX2xpc3Q7CisJCWJyZWFrOworCX0KKworCV9fYmxpc3RfYWRkX2J1ZmZlcihsaXN0LCBqaCk7CisJamgtPmJfamxpc3QgPSBqbGlzdDsKKworCWlmICh3YXNfZGlydHkpCisJCXNldF9idWZmZXJfamJkZGlydHkoYmgpOworfQorCit2b2lkIGpvdXJuYWxfZmlsZV9idWZmZXIoc3RydWN0IGpvdXJuYWxfaGVhZCAqamgsCisJCQkJdHJhbnNhY3Rpb25fdCAqdHJhbnNhY3Rpb24sIGludCBqbGlzdCkKK3sKKwlqYmRfbG9ja19iaF9zdGF0ZShqaDJiaChqaCkpOworCXNwaW5fbG9jaygmdHJhbnNhY3Rpb24tPnRfam91cm5hbC0+al9saXN0X2xvY2spOworCV9fam91cm5hbF9maWxlX2J1ZmZlcihqaCwgdHJhbnNhY3Rpb24sIGpsaXN0KTsKKwlzcGluX3VubG9jaygmdHJhbnNhY3Rpb24tPnRfam91cm5hbC0+al9saXN0X2xvY2spOworCWpiZF91bmxvY2tfYmhfc3RhdGUoamgyYmgoamgpKTsKK30KKworLyogCisgKiBSZW1vdmUgYSBidWZmZXIgZnJvbSBpdHMgY3VycmVudCBidWZmZXIgbGlzdCBpbiBwcmVwYXJhdGlvbiBmb3IKKyAqIGRyb3BwaW5nIGl0IGZyb20gaXRzIGN1cnJlbnQgdHJhbnNhY3Rpb24gZW50aXJlbHkuICBJZiB0aGUgYnVmZmVyIGhhcworICogYWxyZWFkeSBzdGFydGVkIHRvIGJlIHVzZWQgYnkgYSBzdWJzZXF1ZW50IHRyYW5zYWN0aW9uLCByZWZpbGUgdGhlCisgKiBidWZmZXIgb24gdGhhdCB0cmFuc2FjdGlvbidzIG1ldGFkYXRhIGxpc3QuCisgKgorICogQ2FsbGVkIHVuZGVyIGpvdXJuYWwtPmpfbGlzdF9sb2NrCisgKgorICogQ2FsbGVkIHVuZGVyIGpiZF9sb2NrX2JoX3N0YXRlKGpoMmJoKGpoKSkKKyAqLwordm9pZCBfX2pvdXJuYWxfcmVmaWxlX2J1ZmZlcihzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCkKK3sKKwlpbnQgd2FzX2RpcnR5OworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBqaDJiaChqaCk7CisKKwlKX0FTU0VSVF9KSChqaCwgamJkX2lzX2xvY2tlZF9iaF9zdGF0ZShiaCkpOworCWlmIChqaC0+Yl90cmFuc2FjdGlvbikKKwkJYXNzZXJ0X3NwaW5fbG9ja2VkKCZqaC0+Yl90cmFuc2FjdGlvbi0+dF9qb3VybmFsLT5qX2xpc3RfbG9jayk7CisKKwkvKiBJZiB0aGUgYnVmZmVyIGlzIG5vdyB1bnVzZWQsIGp1c3QgZHJvcCBpdC4gKi8KKwlpZiAoamgtPmJfbmV4dF90cmFuc2FjdGlvbiA9PSBOVUxMKSB7CisJCV9fam91cm5hbF91bmZpbGVfYnVmZmVyKGpoKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogSXQgaGFzIGJlZW4gbW9kaWZpZWQgYnkgYSBsYXRlciB0cmFuc2FjdGlvbjogYWRkIGl0IHRvIHRoZSBuZXcKKwkgKiB0cmFuc2FjdGlvbidzIG1ldGFkYXRhIGxpc3QuCisJICovCisKKwl3YXNfZGlydHkgPSB0ZXN0X2NsZWFyX2J1ZmZlcl9qYmRkaXJ0eShiaCk7CisJX19qb3VybmFsX3RlbXBfdW5saW5rX2J1ZmZlcihqaCk7CisJamgtPmJfdHJhbnNhY3Rpb24gPSBqaC0+Yl9uZXh0X3RyYW5zYWN0aW9uOworCWpoLT5iX25leHRfdHJhbnNhY3Rpb24gPSBOVUxMOworCV9fam91cm5hbF9maWxlX2J1ZmZlcihqaCwgamgtPmJfdHJhbnNhY3Rpb24sIEJKX01ldGFkYXRhKTsKKwlKX0FTU0VSVF9KSChqaCwgamgtPmJfdHJhbnNhY3Rpb24tPnRfc3RhdGUgPT0gVF9SVU5OSU5HKTsKKworCWlmICh3YXNfZGlydHkpCisJCXNldF9idWZmZXJfamJkZGlydHkoYmgpOworfQorCisvKgorICogRm9yIHRoZSB1bmxvY2tlZCB2ZXJzaW9uIG9mIHRoaXMgY2FsbCwgYWxzbyBtYWtlIHN1cmUgdGhhdCBhbnkKKyAqIGhhbmdpbmcgam91cm5hbF9oZWFkIGlzIGNsZWFuZWQgdXAgaWYgbmVjZXNzYXJ5LgorICoKKyAqIF9fam91cm5hbF9yZWZpbGVfYnVmZmVyIGlzIHVzdWFsbHkgY2FsbGVkIGFzIHBhcnQgb2YgYSBzaW5nbGUgbG9ja2VkCisgKiBvcGVyYXRpb24gb24gYSBidWZmZXJfaGVhZCwgaW4gd2hpY2ggdGhlIGNhbGxlciBpcyBwcm9iYWJseSBnb2luZyB0bworICogYmUgaG9va2luZyB0aGUgam91cm5hbF9oZWFkIG9udG8gb3RoZXIgbGlzdHMuICBJbiB0aGF0IGNhc2UgaXQgaXMgdXAKKyAqIHRvIHRoZSBjYWxsZXIgdG8gcmVtb3ZlIHRoZSBqb3VybmFsX2hlYWQgaWYgbmVjZXNzYXJ5LiAgRm9yIHRoZQorICogdW5sb2NrZWQgam91cm5hbF9yZWZpbGVfYnVmZmVyIGNhbGwsIHRoZSBjYWxsZXIgaXNuJ3QgZ29pbmcgdG8gYmUKKyAqIGRvaW5nIGFueXRoaW5nIGVsc2UgdG8gdGhlIGJ1ZmZlciBzbyB3ZSBuZWVkIHRvIGRvIHRoZSBjbGVhbnVwCisgKiBvdXJzZWx2ZXMgdG8gYXZvaWQgYSBqaCBsZWFrLiAKKyAqCisgKiAqKiogVGhlIGpvdXJuYWxfaGVhZCBtYXkgYmUgZnJlZWQgYnkgdGhpcyBjYWxsISAqKioKKyAqLwordm9pZCBqb3VybmFsX3JlZmlsZV9idWZmZXIoam91cm5hbF90ICpqb3VybmFsLCBzdHJ1Y3Qgam91cm5hbF9oZWFkICpqaCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gamgyYmgoamgpOworCisJamJkX2xvY2tfYmhfc3RhdGUoYmgpOworCXNwaW5fbG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCisJX19qb3VybmFsX3JlZmlsZV9idWZmZXIoamgpOworCWpiZF91bmxvY2tfYmhfc3RhdGUoYmgpOworCWpvdXJuYWxfcmVtb3ZlX2pvdXJuYWxfaGVhZChiaCk7CisKKwlzcGluX3VubG9jaygmam91cm5hbC0+al9saXN0X2xvY2spOworCV9fYnJlbHNlKGJoKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2pmZnMvTWFrZWZpbGUgYi9mcy9qZmZzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMWMwYmIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZmZzL01ha2VmaWxlCkBAIC0wLDAgKzEsMTEgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBKb3VybmFsbGluZyBGbGFzaCBGaWxlU3lzdGVtIChKRkZTKSByb3V0aW5lcy4KKyMKKyMgJElkOiBNYWtlZmlsZSx2IDEuMTEgMjAwMS8wOS8yNSAyMDo1OTo0MSBkd213MiBFeHAgJAorIworCitvYmotJChDT05GSUdfSkZGU19GUykgKz0gamZmcy5vCisKK2pmZnMteSAJCQkJOj0gamZmc19mbS5vIGludHJlcC5vIGlub2RlLXYyMy5vCitqZmZzLSQoQ09ORklHX0pGRlNfUFJPQ19GUykJKz0gamZmc19wcm9jLm8KK2pmZnMtb2JqcwkJCTo9ICQoamZmcy15KQpkaWZmIC0tZ2l0IGEvZnMvamZmcy9pbm9kZS12MjMuYyBiL2ZzL2pmZnMvaW5vZGUtdjIzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZiZWI0YwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMvaW5vZGUtdjIzLmMKQEAgLTAsMCArMSwxODQ3IEBACisvKgorICogSkZGUyAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgTGludXggaW1wbGVtZW50YXRpb24uCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwICBBeGlzIENvbW11bmljYXRpb25zIEFCLgorICoKKyAqIENyZWF0ZWQgYnkgRmlubiBIYWthbnNzb24gPGZpbm5AYXhpcy5jb20+LgorICoKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICRJZDogaW5vZGUtdjIzLmMsdiAxLjcwIDIwMDEvMTAvMDIgMDk6MTY6MDIgZHdtdzIgRXhwICQKKyAqCisgKiBQb3J0ZWQgdG8gTGludXggMi4zLnggYW5kIE1URDoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAgQWxleGFuZGVyIExhcnNzb24gKGFsZXhAY2VuZGlvLnNlKSwgQ2VuZGlvIFN5c3RlbXMgQUIKKyAqCisgKiBDb3B5cmlnaHQgMjAwMCwgMjAwMSAgUmVkIEhhdCwgSW5jLgorICovCisKKy8qIGlub2RlLmMgLS0gQ29udGFpbnMgdGhlIGNvZGUgdGhhdCBpcyBjYWxsZWQgZnJvbSB0aGUgVkZTLiAgKi8KKworLyogVE9ETy1BTEVYOgorICogdWlkIGFuZCBnaWQgYXJlIGp1c3QgMTYgYml0LgorICogamZmc19maWxlX3dyaXRlIHJlYWRzIGZyb20gdXNlci1zcGFjZSBwb2ludGVycyB3aXRob3V0IHh4X2Zyb21fdXNlcgorICogbWF5YmUgb3RoZXIgc3R1ZmYgZG8gdG8uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2pmZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiamZmc19mbS5oIgorI2luY2x1ZGUgImludHJlcC5oIgorI2lmZGVmIENPTkZJR19KRkZTX1BST0NfRlMKKyNpbmNsdWRlICJqZmZzX3Byb2MuaCIKKyNlbmRpZgorCitzdGF0aWMgaW50IGpmZnNfcmVtb3ZlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCB0eXBlKTsKKworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGpmZnNfb3BzOworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgamZmc19maWxlX29wZXJhdGlvbnM7CitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgamZmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBqZmZzX2Rpcl9vcGVyYXRpb25zOworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGpmZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CitzdGF0aWMgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBqZmZzX2FkZHJlc3Nfb3BlcmF0aW9uczsKKwora21lbV9jYWNoZV90ICAgICAqbm9kZV9jYWNoZSA9IE5VTEw7CitrbWVtX2NhY2hlX3QgICAgICpmbV9jYWNoZSA9IE5VTEw7CisKKy8qIENhbGxlZCBieSB0aGUgVkZTIGF0IG1vdW50IHRpbWUgdG8gaW5pdGlhbGl6ZSB0aGUgd2hvbGUgZmlsZSBzeXN0ZW0uICAqLworc3RhdGljIGludCBqZmZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKnJvb3RfaW5vZGU7CisJc3RydWN0IGpmZnNfY29udHJvbCAqYzsKKworCXNiLT5zX2ZsYWdzIHw9IE1TX05PRElSQVRJTUU7CisKKwlEMShwcmludGsoS0VSTl9OT1RJQ0UgIkpGRlM6IFRyeWluZyB0byBtb3VudCBkZXZpY2UgJXMuXG4iLAorCQkgIHNiLT5zX2lkKSk7CisKKwlpZiAoTUFKT1Ioc2ItPnNfZGV2KSAhPSBNVERfQkxPQ0tfTUFKT1IpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSkZGUzogVHJ5aW5nIHRvIG1vdW50IGEgIgorCQkgICAgICAgIm5vbi1tdGQgZGV2aWNlLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNiLT5zX2Jsb2Nrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKKwlzYi0+c19ibG9ja3NpemVfYml0cyA9IFBBR0VfQ0FDSEVfU0hJRlQ7CisJc2ItPnNfZnNfaW5mbyA9ICh2b2lkICopIDA7CisJc2ItPnNfbWF4Ynl0ZXMgPSAweEZGRkZGRkZGOworCisJLyogQnVpbGQgdGhlIGZpbGUgc3lzdGVtLiAgKi8KKwlpZiAoamZmc19idWlsZF9mcyhzYikgPCAwKSB7CisJCWdvdG8gamZmc19zYl9lcnIxOworCX0KKworCS8qCisJICogc2V0IHVwIGVub3VnaCBzbyB0aGF0IHdlIGNhbiByZWFkIGFuIGlub2RlCisJICovCisJc2ItPnNfbWFnaWMgPSBKRkZTX01BR0lDX1NCX0JJVE1BU0s7CisJc2ItPnNfb3AgPSAmamZmc19vcHM7CisKKwlyb290X2lub2RlID0gaWdldChzYiwgSkZGU19NSU5fSU5PKTsKKwlpZiAoIXJvb3RfaW5vZGUpCisJICAgICAgICBnb3RvIGpmZnNfc2JfZXJyMjsKKworCS8qIEdldCB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBmaWxlIHN5c3RlbS4gICovCisJaWYgKCEoc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290X2lub2RlKSkpIHsKKwkJZ290byBqZmZzX3NiX2VycjM7CisJfQorCisJYyA9IChzdHJ1Y3QgamZmc19jb250cm9sICopIHNiLT5zX2ZzX2luZm87CisKKyNpZmRlZiBDT05GSUdfSkZGU19QUk9DX0ZTCisJLyogU2V0IHVwIHRoZSBqZmZzIHByb2MgZmlsZSBzeXN0ZW0uICAqLworCWlmIChqZmZzX3JlZ2lzdGVyX2pmZnNfcHJvY19kaXIoTUlOT1Ioc2ItPnNfZGV2KSwgYykgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkpGRlM6IEZhaWxlZCB0byBpbml0aWFsaXplIHRoZSBKRkZTICIKKwkJCSJwcm9jIGZpbGUgc3lzdGVtIGZvciBkZXZpY2UgJXMuXG4iLAorCQkJc2ItPnNfaWQpOworCX0KKyNlbmRpZgorCisJLyogU2V0IHRoZSBHYXJiYWdlIENvbGxlY3Rpb24gdGhyZXNob2xkcyAqLworCisJLyogR0MgaWYgZnJlZSBzcGFjZSBnb2VzIGJlbG93IDUlIG9mIHRoZSB0b3RhbCBzaXplICovCisJYy0+Z2NfbWluZnJlZV90aHJlc2hvbGQgPSBjLT5mbWMtPmZsYXNoX3NpemUgLyAyMDsKKworCWlmIChjLT5nY19taW5mcmVlX3RocmVzaG9sZCA8IGMtPmZtYy0+c2VjdG9yX3NpemUpCisJCWMtPmdjX21pbmZyZWVfdGhyZXNob2xkID0gYy0+Zm1jLT5zZWN0b3Jfc2l6ZTsKKworCS8qIEdDIGlmIGRpcnR5IHNwYWNlIGV4Y2VlZHMgMzMlIG9mIHRoZSB0b3RhbCBzaXplLiAqLworCWMtPmdjX21heGRpcnR5X3RocmVzaG9sZCA9IGMtPmZtYy0+Zmxhc2hfc2l6ZSAvIDM7CisKKwlpZiAoYy0+Z2NfbWF4ZGlydHlfdGhyZXNob2xkIDwgYy0+Zm1jLT5zZWN0b3Jfc2l6ZSkKKwkJYy0+Z2NfbWF4ZGlydHlfdGhyZXNob2xkID0gYy0+Zm1jLT5zZWN0b3Jfc2l6ZTsKKworCisJYy0+dGhyZWFkX3BpZCA9IGtlcm5lbF90aHJlYWQgKGpmZnNfZ2FyYmFnZV9jb2xsZWN0X3RocmVhZCwgCisJCQkJICAgICAgICAodm9pZCAqKSBjLCAKKwkJCQkgICAgICAgIENMT05FX0tFUk5FTCk7CisJRDEocHJpbnRrKEtFUk5fTk9USUNFICJKRkZTOiBHQyB0aHJlYWQgcGlkPSVkLlxuIiwgKGludCkgYy0+dGhyZWFkX3BpZCkpOworCisJRDEocHJpbnRrKEtFUk5fTk9USUNFICJKRkZTOiBTdWNjZXNzZnVsbHkgbW91bnRlZCBkZXZpY2UgJXMuXG4iLAorCSAgICAgICBzYi0+c19pZCkpOworCXJldHVybiAwOworCitqZmZzX3NiX2VycjM6CisJaXB1dChyb290X2lub2RlKTsKK2pmZnNfc2JfZXJyMjoKKwlqZmZzX2NsZWFudXBfY29udHJvbCgoc3RydWN0IGpmZnNfY29udHJvbCAqKXNiLT5zX2ZzX2luZm8pOworamZmc19zYl9lcnIxOgorCXByaW50ayhLRVJOX1dBUk5JTkcgIkpGRlM6IEZhaWxlZCB0byBtb3VudCBkZXZpY2UgJXMuXG4iLAorCSAgICAgICBzYi0+c19pZCk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKworLyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgZmlsZSBzeXN0ZW0gaXMgdW1vdW50ZWQuICAqLworc3RhdGljIHZvaWQKK2pmZnNfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGpmZnNfY29udHJvbCAqYyA9IChzdHJ1Y3QgamZmc19jb250cm9sICopIHNiLT5zX2ZzX2luZm87CisKKwlEMihwcmludGsoImpmZnNfcHV0X3N1cGVyKClcbiIpKTsKKworI2lmZGVmIENPTkZJR19KRkZTX1BST0NfRlMKKwlqZmZzX3VucmVnaXN0ZXJfamZmc19wcm9jX2RpcihjKTsKKyNlbmRpZgorCisJaWYgKGMtPmdjX3Rhc2spIHsKKwkJRDEocHJpbnRrIChLRVJOX05PVElDRSAiamZmc19wdXRfc3VwZXIoKTogVGVsbGluZyBnYyB0aHJlYWQgdG8gZGllLlxuIikpOworCQlzZW5kX3NpZyhTSUdLSUxMLCBjLT5nY190YXNrLCAxKTsKKwl9CisJd2FpdF9mb3JfY29tcGxldGlvbigmYy0+Z2NfdGhyZWFkX2NvbXApOworCisJRDEocHJpbnRrIChLRVJOX05PVElDRSAiamZmc19wdXRfc3VwZXIoKTogU3VjY2Vzc2Z1bGx5IHdhaXRlZCBvbiB0aHJlYWQuXG4iKSk7CisKKwlqZmZzX2NsZWFudXBfY29udHJvbCgoc3RydWN0IGpmZnNfY29udHJvbCAqKXNiLT5zX2ZzX2luZm8pOworCUQxKHByaW50ayhLRVJOX05PVElDRSAiSkZGUzogU3VjY2Vzc2Z1bGx5IHVubW91bnRlZCBkZXZpY2UgJXMuXG4iLAorCSAgICAgICBzYi0+c19pZCkpOworfQorCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gdXNlciBjb21tYW5kcyBsaWtlIGNobW9kLCBjaGdycCBhbmQKKyAgIGNob3duIGFyZSBleGVjdXRlZC4gU3lzdGVtIGNhbGxzIGxpa2UgdHJ1bmMoKSByZXN1bHRzIGluIGEgY2FsbAorICAgdG8gdGhpcyBmdW5jdGlvbi4gICovCitzdGF0aWMgaW50CitqZmZzX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmlhdHRyKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGpmZnNfcmF3X2lub2RlIHJhd19pbm9kZTsKKwlzdHJ1Y3QgamZmc19jb250cm9sICpjOworCXN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jOworCXN0cnVjdCBqZmZzX2ZpbGUgKmY7CisJc3RydWN0IGpmZnNfbm9kZSAqbmV3X25vZGU7CisJaW50IHVwZGF0ZV9hbGw7CisJaW50IHJlcyA9IDA7CisJaW50IHJlY292ZXJhYmxlID0gMDsKKworCWxvY2tfa2VybmVsKCk7CisKKwlpZiAoKHJlcyA9IGlub2RlX2NoYW5nZV9vayhpbm9kZSwgaWF0dHIpKSkgCisJCWdvdG8gb3V0OworCisJYyA9IChzdHJ1Y3QgamZmc19jb250cm9sICopaW5vZGUtPmlfc2ItPnNfZnNfaW5mbzsKKwlmbWMgPSBjLT5mbWM7CisKKwlEMyhwcmludGsgKEtFUk5fTk9USUNFICJub3RpZnlfY2hhbmdlKCk6IGRvd24gYmlnbG9ja1xuIikpOworCWRvd24oJmZtYy0+YmlnbG9jayk7CisKKwlmID0gamZmc19maW5kX2ZpbGUoYywgaW5vZGUtPmlfaW5vKTsKKworCUFTU0VSVChpZiAoIWYpIHsKKwkJcHJpbnRrKCJqZmZzX3NldGF0dHIoKTogSW52YWxpZCBpbm9kZSBudW1iZXI6ICVsdVxuIiwKKwkJICAgICAgIGlub2RlLT5pX2lubyk7CisJCUQzKHByaW50ayAoS0VSTl9OT1RJQ0UgIm5vdGlmeV9jaGFuZ2UoKTogdXAgYmlnbG9ja1xuIikpOworCQl1cCgmZm1jLT5iaWdsb2NrKTsKKwkJcmVzID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfSk7CisKKwlEMShwcmludGsoIioqKmpmZnNfc2V0YXR0cigpOiBmaWxlOiBcIiVzXCIsIGlubzogJXVcbiIsCisJCSAgZi0+bmFtZSwgZi0+aW5vKSk7CisKKwl1cGRhdGVfYWxsID0gaWF0dHItPmlhX3ZhbGlkICYgQVRUUl9GT1JDRTsKKworCWlmICggKHVwZGF0ZV9hbGwgfHwgaWF0dHItPmlhX3ZhbGlkICYgQVRUUl9TSVpFKQorCSAgICAgJiYgKGlhdHRyLT5pYV9zaXplICsgMTI4IDwgZi0+c2l6ZSkgKSB7CisJCS8qIFdlJ3JlIHNocmlua2luZyB0aGUgZmlsZSBieSBtb3JlIHRoYW4gMTI4IGJ5dGVzLgorCQkgICBXZSdsbCBiZSBhYmxlIHRvIEdDIGFuZCByZWNvdmVyIHRoaXMgc3BhY2UsIHNvCisJCSAgIGFsbG93IGl0IHRvIGdvIGludG8gdGhlIHJlc2VydmVkIHNwYWNlLiAqLworCQlyZWNvdmVyYWJsZSA9IDE7CisgICAgICAgIH0KKworCWlmICghKG5ld19ub2RlID0gamZmc19hbGxvY19ub2RlKCkpKSB7CisJCUQocHJpbnRrKCJqZmZzX3NldGF0dHIoKTogQWxsb2NhdGlvbiBmYWlsZWQhXG4iKSk7CisJCUQzKHByaW50ayAoS0VSTl9OT1RJQ0UgIm5vdGlmeV9jaGFuZ2UoKTogdXAgYmlnbG9ja1xuIikpOworCQl1cCgmZm1jLT5iaWdsb2NrKTsKKwkJcmVzID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJbmV3X25vZGUtPmRhdGFfb2Zmc2V0ID0gMDsKKwluZXdfbm9kZS0+cmVtb3ZlZF9zaXplID0gMDsKKwlyYXdfaW5vZGUubWFnaWMgPSBKRkZTX01BR0lDX0JJVE1BU0s7CisJcmF3X2lub2RlLmlubyA9IGYtPmlubzsKKwlyYXdfaW5vZGUucGlubyA9IGYtPnBpbm87CisJcmF3X2lub2RlLm1vZGUgPSBmLT5tb2RlOworCXJhd19pbm9kZS51aWQgPSBmLT51aWQ7CisJcmF3X2lub2RlLmdpZCA9IGYtPmdpZDsKKwlyYXdfaW5vZGUuYXRpbWUgPSBmLT5hdGltZTsKKwlyYXdfaW5vZGUubXRpbWUgPSBmLT5tdGltZTsKKwlyYXdfaW5vZGUuY3RpbWUgPSBmLT5jdGltZTsKKwlyYXdfaW5vZGUuZHNpemUgPSAwOworCXJhd19pbm9kZS5vZmZzZXQgPSAwOworCXJhd19pbm9kZS5yc2l6ZSA9IDA7CisJcmF3X2lub2RlLmRzaXplID0gMDsKKwlyYXdfaW5vZGUubnNpemUgPSBmLT5uc2l6ZTsKKwlyYXdfaW5vZGUubmxpbmsgPSBmLT5ubGluazsKKwlyYXdfaW5vZGUuc3BhcmUgPSAwOworCXJhd19pbm9kZS5yZW5hbWUgPSAwOworCXJhd19pbm9kZS5kZWxldGVkID0gMDsKKworCWlmICh1cGRhdGVfYWxsIHx8IGlhdHRyLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkgeworCQlyYXdfaW5vZGUubW9kZSA9IGlhdHRyLT5pYV9tb2RlOworCQlpbm9kZS0+aV9tb2RlID0gaWF0dHItPmlhX21vZGU7CisJfQorCWlmICh1cGRhdGVfYWxsIHx8IGlhdHRyLT5pYV92YWxpZCAmIEFUVFJfVUlEKSB7CisJCXJhd19pbm9kZS51aWQgPSBpYXR0ci0+aWFfdWlkOworCQlpbm9kZS0+aV91aWQgPSBpYXR0ci0+aWFfdWlkOworCX0KKwlpZiAodXBkYXRlX2FsbCB8fCBpYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0dJRCkgeworCQlyYXdfaW5vZGUuZ2lkID0gaWF0dHItPmlhX2dpZDsKKwkJaW5vZGUtPmlfZ2lkID0gaWF0dHItPmlhX2dpZDsKKwl9CisJaWYgKHVwZGF0ZV9hbGwgfHwgaWF0dHItPmlhX3ZhbGlkICYgQVRUUl9TSVpFKSB7CisJCWludCBsZW47CisJCUQxKHByaW50aygiamZmc19ub3RpZnlfY2hhbmdlKCk6IENoYW5naW5nIHNpemUgIgorCQkJICAidG8gJWx1IGJ5dGVzIVxuIiwgKGxvbmcpaWF0dHItPmlhX3NpemUpKTsKKwkJcmF3X2lub2RlLm9mZnNldCA9IGlhdHRyLT5pYV9zaXplOworCisJCS8qIENhbGN1bGF0ZSBob3cgbWFueSBieXRlcyBuZWVkIHRvIGJlIHJlbW92ZWQgZnJvbQorCQkgICB0aGUgZW5kLiAgKi8KKwkJaWYgKGYtPnNpemUgPCBpYXR0ci0+aWFfc2l6ZSkgeworCQkJbGVuID0gMDsKKwkJfQorCQllbHNlIHsKKwkJCWxlbiA9IGYtPnNpemUgLSBpYXR0ci0+aWFfc2l6ZTsKKwkJfQorCisJCXJhd19pbm9kZS5yc2l6ZSA9IGxlbjsKKworCQkvKiBUaGUgdXBkYXRlZCBub2RlIHdpbGwgYmUgYSByZW1vdmFsIG5vZGUsIHdpdGgKKwkJICAgYmFzZSBhdCB0aGUgbmV3IHNpemUgYW5kIHNpemUgb2YgdGhlIG5iciBvZiBieXRlcworCQkgICB0byBiZSByZW1vdmVkLiAgKi8KKwkJbmV3X25vZGUtPmRhdGFfb2Zmc2V0ID0gaWF0dHItPmlhX3NpemU7CisJCW5ld19ub2RlLT5yZW1vdmVkX3NpemUgPSBsZW47CisJCWlub2RlLT5pX3NpemUgPSBpYXR0ci0+aWFfc2l6ZTsKKwkJaW5vZGUtPmlfYmxvY2tzID0gKGlub2RlLT5pX3NpemUgKyA1MTEpID4+IDk7CisKKwkJaWYgKGxlbikgeworCQkJaW52YWxpZGF0ZV9pbm9kZV9wYWdlcyhpbm9kZS0+aV9tYXBwaW5nKTsKKwkJfQorCQlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWU7CisJfQorCWlmICh1cGRhdGVfYWxsIHx8IGlhdHRyLT5pYV92YWxpZCAmIEFUVFJfQVRJTUUpIHsKKwkJcmF3X2lub2RlLmF0aW1lID0gaWF0dHItPmlhX2F0aW1lLnR2X3NlYzsKKwkJaW5vZGUtPmlfYXRpbWUgPSBpYXR0ci0+aWFfYXRpbWU7CisJfQorCWlmICh1cGRhdGVfYWxsIHx8IGlhdHRyLT5pYV92YWxpZCAmIEFUVFJfTVRJTUUpIHsKKwkJcmF3X2lub2RlLm10aW1lID0gaWF0dHItPmlhX210aW1lLnR2X3NlYzsKKwkJaW5vZGUtPmlfbXRpbWUgPSBpYXR0ci0+aWFfbXRpbWU7CisJfQorCWlmICh1cGRhdGVfYWxsIHx8IGlhdHRyLT5pYV92YWxpZCAmIEFUVFJfQ1RJTUUpIHsKKwkJcmF3X2lub2RlLmN0aW1lID0gaWF0dHItPmlhX2N0aW1lLnR2X3NlYzsKKwkJaW5vZGUtPmlfY3RpbWUgPSBpYXR0ci0+aWFfY3RpbWU7CisJfQorCisJLyogV3JpdGUgdGhpcyBub2RlIHRvIHRoZSBmbGFzaC4gICovCisJaWYgKChyZXMgPSBqZmZzX3dyaXRlX25vZGUoYywgbmV3X25vZGUsICZyYXdfaW5vZGUsIGYtPm5hbWUsIE5VTEwsIHJlY292ZXJhYmxlLCBmKSkgPCAwKSB7CisJCUQocHJpbnRrKCJqZmZzX25vdGlmeV9jaGFuZ2UoKTogVGhlIHdyaXRlIGZhaWxlZCFcbiIpKTsKKwkJamZmc19mcmVlX25vZGUobmV3X25vZGUpOworCQlEMyhwcmludGsgKEtFUk5fTk9USUNFICJuX2MoKTogdXAgYmlnbG9ja1xuIikpOworCQl1cCgmYy0+Zm1jLT5iaWdsb2NrKTsKKwkJZ290byBvdXQ7CisJfQorCisJamZmc19pbnNlcnRfbm9kZShjLCBmLCAmcmF3X2lub2RlLCBOVUxMLCBuZXdfbm9kZSk7CisKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwlEMyhwcmludGsgKEtFUk5fTk9USUNFICJuX2MoKTogdXAgYmlnbG9ja1xuIikpOworCXVwKCZjLT5mbWMtPmJpZ2xvY2spOworb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmVzOworfSAvKiBqZmZzX25vdGlmeV9jaGFuZ2UoKSAgKi8KKworCitzdGF0aWMgc3RydWN0IGlub2RlICoKK2pmZnNfbmV3X2lub2RlKGNvbnN0IHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGpmZnNfcmF3X2lub2RlICpyYXdfaW5vZGUsCisJICAgICAgIGludCAqIGVycikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKwlzdHJ1Y3QgamZmc19jb250cm9sICpjOworCXN0cnVjdCBqZmZzX2ZpbGUgKmY7CisKKwlzYiA9IGRpci0+aV9zYjsKKwlpbm9kZSA9IG5ld19pbm9kZShzYik7CisJaWYgKCFpbm9kZSkgeworCQkqZXJyID0gLUVOT01FTTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJYyA9IChzdHJ1Y3QgamZmc19jb250cm9sICopc2ItPnNfZnNfaW5mbzsKKworCWlub2RlLT5pX2lubyA9IHJhd19pbm9kZS0+aW5vOworCWlub2RlLT5pX21vZGUgPSByYXdfaW5vZGUtPm1vZGU7CisJaW5vZGUtPmlfbmxpbmsgPSByYXdfaW5vZGUtPm5saW5rOworCWlub2RlLT5pX3VpZCA9IHJhd19pbm9kZS0+dWlkOworCWlub2RlLT5pX2dpZCA9IHJhd19pbm9kZS0+Z2lkOworCWlub2RlLT5pX3NpemUgPSByYXdfaW5vZGUtPmRzaXplOworCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IHJhd19pbm9kZS0+YXRpbWU7CisJaW5vZGUtPmlfbXRpbWUudHZfc2VjID0gcmF3X2lub2RlLT5tdGltZTsKKwlpbm9kZS0+aV9jdGltZS50dl9zZWMgPSByYXdfaW5vZGUtPmN0aW1lOworCWlub2RlLT5pX2N0aW1lLnR2X25zZWMgPSAwOworCWlub2RlLT5pX210aW1lLnR2X25zZWMgPSAwOworCWlub2RlLT5pX2F0aW1lLnR2X25zZWMgPSAwOworCWlub2RlLT5pX2Jsa3NpemUgPSBQQUdFX1NJWkU7CisJaW5vZGUtPmlfYmxvY2tzID0gKGlub2RlLT5pX3NpemUgKyA1MTEpID4+IDk7CisKKwlmID0gamZmc19maW5kX2ZpbGUoYywgcmF3X2lub2RlLT5pbm8pOworCisJaW5vZGUtPnUuZ2VuZXJpY19pcCA9ICh2b2lkICopZjsKKwlpbnNlcnRfaW5vZGVfaGFzaChpbm9kZSk7CisKKwlyZXR1cm4gaW5vZGU7Cit9CisKKy8qIEdldCBzdGF0aXN0aWNzIG9mIHRoZSBmaWxlIHN5c3RlbS4gICovCitzdGF0aWMgaW50CitqZmZzX3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQoreworCXN0cnVjdCBqZmZzX2NvbnRyb2wgKmMgPSAoc3RydWN0IGpmZnNfY29udHJvbCAqKSBzYi0+c19mc19pbmZvOworCXN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jOworCisJbG9ja19rZXJuZWwoKTsKKworCWZtYyA9IGMtPmZtYzsKKworCUQyKHByaW50aygiamZmc19zdGF0ZnMoKVxuIikpOworCisJYnVmLT5mX3R5cGUgPSBKRkZTX01BR0lDX1NCX0JJVE1BU0s7CisJYnVmLT5mX2JzaXplID0gUEFHRV9DQUNIRV9TSVpFOworCWJ1Zi0+Zl9ibG9ja3MgPSAoZm1jLT5mbGFzaF9zaXplIC8gUEFHRV9DQUNIRV9TSVpFKQorCQkgICAgICAgLSAoZm1jLT5taW5fZnJlZV9zaXplIC8gUEFHRV9DQUNIRV9TSVpFKTsKKwlidWYtPmZfYmZyZWUgPSAoamZmc19mcmVlX3NpemUxKGZtYykgKyBqZmZzX2ZyZWVfc2l6ZTIoZm1jKSArCisJCSAgICAgICBmbWMtPmRpcnR5X3NpemUgLSBmbWMtPm1pbl9mcmVlX3NpemUpCisJCQkgICAgICAgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlidWYtPmZfYmF2YWlsID0gYnVmLT5mX2JmcmVlOworCisJLyogRmluZCBvdXQgaG93IG1hbnkgZmlsZXMgdGhlcmUgYXJlIGluIHRoZSBmaWxlc3lzdGVtLiAgKi8KKwlidWYtPmZfZmlsZXMgPSBqZmZzX2ZvcmVhY2hfZmlsZShjLCBqZmZzX2ZpbGVfY291bnQpOworCWJ1Zi0+Zl9mZnJlZSA9IGJ1Zi0+Zl9iZnJlZTsKKwkvKiBidWYtPmZfZnNpZCA9IDA7ICovCisJYnVmLT5mX25hbWVsZW4gPSBKRkZTX01BWF9OQU1FX0xFTjsKKworCXVubG9ja19rZXJuZWwoKTsKKworCXJldHVybiAwOworfQorCisKKy8qIFJlbmFtZSBhIGZpbGUuICAqLworc3RhdGljIGludAoramZmc19yZW5hbWUoc3RydWN0IGlub2RlICpvbGRfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAorCSAgICBzdHJ1Y3QgaW5vZGUgKm5ld19kaXIsIHN0cnVjdCBkZW50cnkgKm5ld19kZW50cnkpCit7CisJc3RydWN0IGpmZnNfcmF3X2lub2RlIHJhd19pbm9kZTsKKwlzdHJ1Y3QgamZmc19jb250cm9sICpjOworCXN0cnVjdCBqZmZzX2ZpbGUgKm9sZF9kaXJfZjsKKwlzdHJ1Y3QgamZmc19maWxlICpuZXdfZGlyX2Y7CisJc3RydWN0IGpmZnNfZmlsZSAqZGVsX2Y7CisJc3RydWN0IGpmZnNfZmlsZSAqZjsKKwlzdHJ1Y3QgamZmc19ub2RlICpub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IHJlc3VsdCA9IDA7CisJX191MzIgcmVuYW1lX2RhdGEgPSAwOworCisJRDIocHJpbnRrKCIqKipqZmZzX3JlbmFtZSgpXG4iKSk7CisKKwlEKHByaW50aygiamZmc19yZW5hbWUoKTogb2xkX2RpcjogMHglcCwgb2xkIG5hbWU6IDB4JXAsICIKKwkJICJuZXdfZGlyOiAweCVwLCBuZXcgbmFtZTogMHglcFxuIiwKKwkJIG9sZF9kaXIsIG9sZF9kZW50cnktPmRfbmFtZS5uYW1lLAorCQkgbmV3X2RpciwgbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUpKTsKKworCWxvY2tfa2VybmVsKCk7CisJYyA9IChzdHJ1Y3QgamZmc19jb250cm9sICopb2xkX2Rpci0+aV9zYi0+c19mc19pbmZvOworCUFTU0VSVChpZiAoIWMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJqZmZzX3JlbmFtZSgpOiBUaGUgb2xkX2RpciBpbm9kZSAiCisJCSAgICAgICAiZGlkbid0IGhhdmUgYSByZWZlcmVuY2UgdG8gYSBqZmZzX2ZpbGUgc3RydWN0XG4iKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVJTzsKKwl9KTsKKworCXJlc3VsdCA9IC1FTk9URElSOworCWlmICghKG9sZF9kaXJfZiA9IChzdHJ1Y3QgamZmc19maWxlICopb2xkX2Rpci0+dS5nZW5lcmljX2lwKSkgeworCQlEKHByaW50aygiamZmc19yZW5hbWUoKTogT2xkIGRpciBpbnZhbGlkLlxuIikpOworCQlnb3RvIGpmZnNfcmVuYW1lX2VuZDsKKwl9CisKKwkvKiBUcnkgdG8gZmluZCB0aGUgZmlsZSB0byBtb3ZlLiAgKi8KKwlyZXN1bHQgPSAtRU5PRU5UOworCWlmICghKGYgPSBqZmZzX2ZpbmRfY2hpbGQob2xkX2Rpcl9mLCBvbGRfZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCQkgIG9sZF9kZW50cnktPmRfbmFtZS5sZW4pKSkgeworCQlnb3RvIGpmZnNfcmVuYW1lX2VuZDsKKwl9CisKKwkvKiBGaW5kIHRoZSBuZXcgZGlyZWN0b3J5LiAgKi8KKwlyZXN1bHQgPSAtRU5PVERJUjsKKwlpZiAoIShuZXdfZGlyX2YgPSAoc3RydWN0IGpmZnNfZmlsZSAqKW5ld19kaXItPnUuZ2VuZXJpY19pcCkpIHsKKwkJRChwcmludGsoImpmZnNfcmVuYW1lKCk6IE5ldyBkaXIgaW52YWxpZC5cbiIpKTsKKwkJZ290byBqZmZzX3JlbmFtZV9lbmQ7CisJfQorCUQzKHByaW50ayAoS0VSTl9OT1RJQ0UgInJlbmFtZSgpOiBkb3duIGJpZ2xvY2tcbiIpKTsKKwlkb3duKCZjLT5mbWMtPmJpZ2xvY2spOworCS8qIENyZWF0ZSBhIG5vZGUgYW5kIGluaXRpYWxpemUgYXMgbXVjaCBhcyBuZWVkZWQuICAqLworCXJlc3VsdCA9IC1FTk9NRU07CisJaWYgKCEobm9kZSA9IGpmZnNfYWxsb2Nfbm9kZSgpKSkgeworCQlEKHByaW50aygiamZmc19yZW5hbWUoKTogQWxsb2NhdGlvbiBmYWlsZWQ6IG5vZGUgPT0gMFxuIikpOworCQlnb3RvIGpmZnNfcmVuYW1lX2VuZDsKKwl9CisJbm9kZS0+ZGF0YV9vZmZzZXQgPSAwOworCW5vZGUtPnJlbW92ZWRfc2l6ZSA9IDA7CisKKwkvKiBJbml0aWFsaXplIHRoZSByYXcgaW5vZGUuICAqLworCXJhd19pbm9kZS5tYWdpYyA9IEpGRlNfTUFHSUNfQklUTUFTSzsKKwlyYXdfaW5vZGUuaW5vID0gZi0+aW5vOworCXJhd19pbm9kZS5waW5vID0gbmV3X2Rpcl9mLT5pbm87CisvKiAgCXJhd19pbm9kZS52ZXJzaW9uID0gZi0+aGlnaGVzdF92ZXJzaW9uICsgMTsgKi8KKwlyYXdfaW5vZGUubW9kZSA9IGYtPm1vZGU7CisJcmF3X2lub2RlLnVpZCA9IGN1cnJlbnQtPmZzdWlkOworCXJhd19pbm9kZS5naWQgPSBjdXJyZW50LT5mc2dpZDsKKyNpZiAwCisJcmF3X2lub2RlLnVpZCA9IGYtPnVpZDsKKwlyYXdfaW5vZGUuZ2lkID0gZi0+Z2lkOworI2VuZGlmCisJcmF3X2lub2RlLmF0aW1lID0gZ2V0X3NlY29uZHMoKTsKKwlyYXdfaW5vZGUubXRpbWUgPSByYXdfaW5vZGUuYXRpbWU7CisJcmF3X2lub2RlLmN0aW1lID0gZi0+Y3RpbWU7CisJcmF3X2lub2RlLm9mZnNldCA9IDA7CisJcmF3X2lub2RlLmRzaXplID0gMDsKKwlyYXdfaW5vZGUucnNpemUgPSAwOworCXJhd19pbm9kZS5uc2l6ZSA9IG5ld19kZW50cnktPmRfbmFtZS5sZW47CisJcmF3X2lub2RlLm5saW5rID0gZi0+bmxpbms7CisJcmF3X2lub2RlLnNwYXJlID0gMDsKKwlyYXdfaW5vZGUucmVuYW1lID0gMDsKKwlyYXdfaW5vZGUuZGVsZXRlZCA9IDA7CisKKwkvKiBTZWUgaWYgdGhlcmUgYWxyZWFkeSBleGlzdHMgYSBmaWxlIHdpdGggdGhlIHNhbWUgbmFtZSBhcworCSAgIG5ld19uYW1lLiAgKi8KKwlpZiAoKGRlbF9mID0gamZmc19maW5kX2NoaWxkKG5ld19kaXJfZiwgbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkJICAgICBuZXdfZGVudHJ5LT5kX25hbWUubGVuKSkpIHsKKwkJcmF3X2lub2RlLnJlbmFtZSA9IDE7CisJCXJhd19pbm9kZS5kc2l6ZSA9IHNpemVvZihfX3UzMik7CisJCXJlbmFtZV9kYXRhID0gZGVsX2YtPmlubzsKKwl9CisKKwkvKiBXcml0ZSB0aGUgbmV3IG5vZGUgdG8gdGhlIGZsYXNoIG1lbW9yeS4gICovCisJaWYgKChyZXN1bHQgPSBqZmZzX3dyaXRlX25vZGUoYywgbm9kZSwgJnJhd19pbm9kZSwKKwkJCQkgICAgICBuZXdfZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCQkgICAgICAodW5zaWduZWQgY2hhciopJnJlbmFtZV9kYXRhLCAwLCBmKSkgPCAwKSB7CisJCUQocHJpbnRrKCJqZmZzX3JlbmFtZSgpOiBGYWlsZWQgdG8gd3JpdGUgbm9kZSB0byBmbGFzaC5cbiIpKTsKKwkJamZmc19mcmVlX25vZGUobm9kZSk7CisJCWdvdG8gamZmc19yZW5hbWVfZW5kOworCX0KKwlyYXdfaW5vZGUuZHNpemUgPSAwOworCisJaWYgKHJhd19pbm9kZS5yZW5hbWUpIHsKKwkJLyogVGhlIGZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lIG11c3QgYmUgZGVsZXRlZC4gICovCisJCS8vRklYTUUgZGVhZGxvY2sJICAgICAgICBkb3duKCZjLT5mbWMtPmdjbG9jayk7CisJCWlmICgocmVzdWx0ID0gamZmc19yZW1vdmUobmV3X2RpciwgbmV3X2RlbnRyeSwKKwkJCQkJICBkZWxfZi0+bW9kZSkpIDwgMCkgeworCQkJLyogVGhpcyBpcyByZWFsbHkgYmFkLiAgKi8KKwkJCXByaW50ayhLRVJOX0VSUiAiSkZGUzogQW4gZXJyb3Igb2NjdXJyZWQgaW4gIgorCQkJICAgICAgICJyZW5hbWUoKS5cbiIpOworCQl9CisJCS8vCQl1cCgmYy0+Zm1jLT5nY2xvY2spOworCX0KKworCWlmIChvbGRfZGlyX2YgIT0gbmV3X2Rpcl9mKSB7CisJCS8qIFJlbW92ZSB0aGUgZmlsZSBmcm9tIGl0cyBvbGQgcG9zaXRpb24gaW4gdGhlCisJCSAgIGZpbGVzeXN0ZW0gdHJlZS4gICovCisJCWpmZnNfdW5saW5rX2ZpbGVfZnJvbV90cmVlKGYpOworCX0KKworCS8qIEluc2VydCB0aGUgbmV3IG5vZGUgaW50byB0aGUgZmlsZSBzeXN0ZW0uICAqLworCWlmICgocmVzdWx0ID0gamZmc19pbnNlcnRfbm9kZShjLCBmLCAmcmF3X2lub2RlLAorCQkJCSAgICAgICBuZXdfZGVudHJ5LT5kX25hbWUubmFtZSwgbm9kZSkpIDwgMCkgeworCQlEKHByaW50ayhLRVJOX0VSUiAiamZmc19yZW5hbWUoKTogamZmc19pbnNlcnRfbm9kZSgpICIKKwkJCSAiZmFpbGVkIVxuIikpOworCX0KKworCWlmIChvbGRfZGlyX2YgIT0gbmV3X2Rpcl9mKSB7CisJCS8qIEluc2VydCB0aGUgZmlsZSB0byBpdHMgbmV3IHBvc2l0aW9uIGluIHRoZQorCQkgICBmaWxlIHN5c3RlbS4gICovCisJCWpmZnNfaW5zZXJ0X2ZpbGVfaW50b190cmVlKGYpOworCX0KKworCS8qIFRoaXMgaXMgYSBraW5kIG9mIHVwZGF0ZSBvZiB0aGUgaW5vZGUgd2UncmUgYWJvdXQgdG8gbWFrZQorCSAgIGhlcmUuICBUaGlzIGlzIHdoYXQgdGhleSBkbyBpbiBleHQyZnMuICBLaW5kIG9mLiAgKi8KKwlpZiAoKGlub2RlID0gaWdldChuZXdfZGlyLT5pX3NiLCBmLT5pbm8pKSkgeworCQlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQlpcHV0KGlub2RlKTsKKwl9CisKK2pmZnNfcmVuYW1lX2VuZDoKKwlEMyhwcmludGsgKEtFUk5fTk9USUNFICJyZW5hbWUoKTogdXAgYmlnbG9ja1xuIikpOworCXVwKCZjLT5mbWMtPmJpZ2xvY2spOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmVzdWx0OworfSAvKiBqZmZzX3JlbmFtZSgpICAqLworCisKKy8qIFJlYWQgdGhlIGNvbnRlbnRzIG9mIGEgZGlyZWN0b3J5LiAgVXNlZCBieSBwcm9ncmFtcyBsaWtlIGBscycKKyAgIGZvciBpbnN0YW5jZS4gICovCitzdGF0aWMgaW50CitqZmZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJc3RydWN0IGpmZnNfZmlsZSAqZjsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxwLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBqZmZzX2NvbnRyb2wgKmMgPSAoc3RydWN0IGpmZnNfY29udHJvbCAqKWlub2RlLT5pX3NiLT5zX2ZzX2luZm87CisJaW50IGo7CisJaW50IGRkaW5vOworCWxvY2tfa2VybmVsKCk7CisJRDMocHJpbnRrIChLRVJOX05PVElDRSAicmVhZGRpcigpOiBkb3duIGJpZ2xvY2tcbiIpKTsKKwlkb3duKCZjLT5mbWMtPmJpZ2xvY2spOworCisJRDIocHJpbnRrKCJqZmZzX3JlYWRkaXIoKTogaW5vZGU6IDB4JXAsIGZpbHA6IDB4JXBcbiIsIGlub2RlLCBmaWxwKSk7CisJaWYgKGZpbHAtPmZfcG9zID09IDApIHsKKwkJRDMocHJpbnRrKCJqZmZzX3JlYWRkaXIoKTogXCIuXCIgJWx1XG4iLCBpbm9kZS0+aV9pbm8pKTsKKwkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLiIsIDEsIGZpbHAtPmZfcG9zLCBpbm9kZS0+aV9pbm8sIERUX0RJUikgPCAwKSB7CisJCQlEMyhwcmludGsgKEtFUk5fTk9USUNFICJyZWFkZGlyKCk6IHVwIGJpZ2xvY2tcbiIpKTsKKwkJCXVwKCZjLT5mbWMtPmJpZ2xvY2spOworCQkJdW5sb2NrX2tlcm5lbCgpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJZmlscC0+Zl9wb3MgPSAxOworCX0KKwlpZiAoZmlscC0+Zl9wb3MgPT0gMSkgeworCQlpZiAoaW5vZGUtPmlfaW5vID09IEpGRlNfTUlOX0lOTykgeworCQkJZGRpbm8gPSBKRkZTX01JTl9JTk87CisJCX0KKwkJZWxzZSB7CisJCQlkZGlubyA9ICgoc3RydWN0IGpmZnNfZmlsZSAqKQorCQkJCSBpbm9kZS0+dS5nZW5lcmljX2lwKS0+cGlubzsKKwkJfQorCQlEMyhwcmludGsoImpmZnNfcmVhZGRpcigpOiBcIi4uXCIgJXVcbiIsIGRkaW5vKSk7CisJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4uIiwgMiwgZmlscC0+Zl9wb3MsIGRkaW5vLCBEVF9ESVIpIDwgMCkgeworCQkJRDMocHJpbnRrIChLRVJOX05PVElDRSAicmVhZGRpcigpOiB1cCBiaWdsb2NrXG4iKSk7CisJCQl1cCgmYy0+Zm1jLT5iaWdsb2NrKTsKKwkJCXVubG9ja19rZXJuZWwoKTsKKwkJCXJldHVybiAwOworCQl9CisJCWZpbHAtPmZfcG9zKys7CisJfQorCWYgPSAoKHN0cnVjdCBqZmZzX2ZpbGUgKilpbm9kZS0+dS5nZW5lcmljX2lwKS0+Y2hpbGRyZW47CisKKwlqID0gMjsKKwl3aGlsZShmICYmIChmLT5kZWxldGVkIHx8IGorKyA8IGZpbHAtPmZfcG9zICkpIHsKKwkJZiA9IGYtPnNpYmxpbmdfbmV4dDsKKwl9CisKKwl3aGlsZSAoZikgeworCQlEMyhwcmludGsoImpmZnNfcmVhZGRpcigpOiBcIiVzXCIgaW5vOiAldVxuIiwKKwkJCSAgKGYtPm5hbWUgPyBmLT5uYW1lIDogIiIpLCBmLT5pbm8pKTsKKwkJaWYgKGZpbGxkaXIoZGlyZW50LCBmLT5uYW1lLCBmLT5uc2l6ZSwKKwkJCSAgICBmaWxwLT5mX3BvcyAsIGYtPmlubywgRFRfVU5LTk9XTikgPCAwKSB7CisJCSAgICAgICAgRDMocHJpbnRrIChLRVJOX05PVElDRSAicmVhZGRpcigpOiB1cCBiaWdsb2NrXG4iKSk7CisJCQl1cCgmYy0+Zm1jLT5iaWdsb2NrKTsKKwkJCXVubG9ja19rZXJuZWwoKTsKKwkJCXJldHVybiAwOworCQl9CisJCWZpbHAtPmZfcG9zKys7CisJCWRvIHsKKwkJCWYgPSBmLT5zaWJsaW5nX25leHQ7CisJCX0gd2hpbGUoZiAmJiBmLT5kZWxldGVkKTsKKwl9CisJRDMocHJpbnRrIChLRVJOX05PVElDRSAicmVhZGRpcigpOiB1cCBiaWdsb2NrXG4iKSk7CisJdXAoJmMtPmZtYy0+YmlnbG9jayk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBmaWxwLT5mX3BvczsKK30gLyogamZmc19yZWFkZGlyKCkgICovCisKKworLyogRmluZCBhIGZpbGUgaW4gYSBkaXJlY3RvcnkuIElmIHRoZSBmaWxlIGV4aXN0cywgcmV0dXJuIGl0cworICAgY29ycmVzcG9uZGluZyBkZW50cnkuICAqLworc3RhdGljIHN0cnVjdCBkZW50cnkgKgoramZmc19sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGpmZnNfZmlsZSAqZDsKKwlzdHJ1Y3QgamZmc19maWxlICpmOworCXN0cnVjdCBqZmZzX2NvbnRyb2wgKmMgPSAoc3RydWN0IGpmZnNfY29udHJvbCAqKWRpci0+aV9zYi0+c19mc19pbmZvOworCWludCBsZW47CisJaW50IHIgPSAwOworCWNvbnN0IGNoYXIgKm5hbWU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CisKKwlsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisJbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7CisKKwlsb2NrX2tlcm5lbCgpOworCisJRDMoeworCQljaGFyICpzID0gKGNoYXIgKilrbWFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOworCQltZW1jcHkocywgbmFtZSwgbGVuKTsKKwkJc1tsZW5dID0gJ1wwJzsKKwkJcHJpbnRrKCJqZmZzX2xvb2t1cCgpOiBkaXI6IDB4JXAsIG5hbWU6IFwiJXNcIlxuIiwgZGlyLCBzKTsKKwkJa2ZyZWUocyk7CisJfSk7CisKKwlEMyhwcmludGsgKEtFUk5fTk9USUNFICJsb29rdXAoKTogZG93biBiaWdsb2NrXG4iKSk7CisJZG93bigmYy0+Zm1jLT5iaWdsb2NrKTsKKworCXIgPSAtRU5BTUVUT09MT05HOworCWlmIChsZW4gPiBKRkZTX01BWF9OQU1FX0xFTikgeworCQlnb3RvIGpmZnNfbG9va3VwX2VuZDsKKwl9CisKKwlyID0gLUVBQ0NFUzsKKwlpZiAoIShkID0gKHN0cnVjdCBqZmZzX2ZpbGUgKilkaXItPnUuZ2VuZXJpY19pcCkpIHsKKwkJRChwcmludGsoImpmZnNfbG9va3VwKCk6IE5vIHN1Y2ggaW5vZGUhICglbHUpXG4iLAorCQkJIGRpci0+aV9pbm8pKTsKKwkJZ290byBqZmZzX2xvb2t1cF9lbmQ7CisJfQorCisJLyogR2V0IHRoZSBjb3JyZXNwb25kaW5nIGlub2RlIHRvIHRoZSBmaWxlLiAgKi8KKworCS8qIGlnZXQgY2FsbHMgamZmc19yZWFkX2lub2RlLCBzbyB3ZSBuZWVkIHRvIGRyb3AgdGhlIGJpZ2xvY2sKKyAgICAgICAgICAgYmVmb3JlIGNhbGxpbmcgaWdldC4gIFVuZm9ydHVuYXRlbHksIHRoZSBHQyBoYXMgYSB0ZW5kZW5jeQorICAgICAgICAgICB0byBzbmVhayBpbiBoZXJlLCBiZWNhdXNlIGlnZXQgc29tZXRpbWVzIGNhbGxzIHNjaGVkdWxlICgpLgorCSovCisKKwlpZiAoKGxlbiA9PSAxKSAmJiAobmFtZVswXSA9PSAnLicpKSB7CisJCUQzKHByaW50ayAoS0VSTl9OT1RJQ0UgImxvb2t1cCgpOiB1cCBiaWdsb2NrXG4iKSk7CisJCXVwKCZjLT5mbWMtPmJpZ2xvY2spOworCQlpZiAoIShpbm9kZSA9IGlnZXQoZGlyLT5pX3NiLCBkLT5pbm8pKSkgeworCQkJRChwcmludGsoImpmZnNfbG9va3VwKCk6IC4gaWdldCgpID09PiBOVUxMXG4iKSk7CisJCQlnb3RvIGpmZnNfbG9va3VwX2VuZF9ub19iaWdsb2NrOworCQl9CisJCUQzKHByaW50ayAoS0VSTl9OT1RJQ0UgImxvb2t1cCgpOiBkb3duIGJpZ2xvY2tcbiIpKTsKKwkJZG93bigmYy0+Zm1jLT5iaWdsb2NrKTsKKwl9IGVsc2UgaWYgKChsZW4gPT0gMikgJiYgKG5hbWVbMF0gPT0gJy4nKSAmJiAobmFtZVsxXSA9PSAnLicpKSB7CisJICAgICAgICBEMyhwcmludGsgKEtFUk5fTk9USUNFICJsb29rdXAoKTogdXAgYmlnbG9ja1xuIikpOworCQl1cCgmYy0+Zm1jLT5iaWdsb2NrKTsKKyAJCWlmICghKGlub2RlID0gaWdldChkaXItPmlfc2IsIGQtPnBpbm8pKSkgeworCQkJRChwcmludGsoImpmZnNfbG9va3VwKCk6IC4uIGlnZXQoKSA9PT4gTlVMTFxuIikpOworCQkJZ290byBqZmZzX2xvb2t1cF9lbmRfbm9fYmlnbG9jazsKKwkJfQorCQlEMyhwcmludGsgKEtFUk5fTk9USUNFICJsb29rdXAoKTogZG93biBiaWdsb2NrXG4iKSk7CisJCWRvd24oJmMtPmZtYy0+YmlnbG9jayk7CisJfSBlbHNlIGlmICgoZiA9IGpmZnNfZmluZF9jaGlsZChkLCBuYW1lLCBsZW4pKSkgeworCSAgICAgICAgRDMocHJpbnRrIChLRVJOX05PVElDRSAibG9va3VwKCk6IHVwIGJpZ2xvY2tcbiIpKTsKKwkJdXAoJmMtPmZtYy0+YmlnbG9jayk7CisJCWlmICghKGlub2RlID0gaWdldChkaXItPmlfc2IsIGYtPmlubykpKSB7CisJCQlEKHByaW50aygiamZmc19sb29rdXAoKTogaWdldCgpID09PiBOVUxMXG4iKSk7CisJCQlnb3RvIGpmZnNfbG9va3VwX2VuZF9ub19iaWdsb2NrOworCQl9CisJCUQzKHByaW50ayAoS0VSTl9OT1RJQ0UgImxvb2t1cCgpOiBkb3duIGJpZ2xvY2tcbiIpKTsKKwkJZG93bigmYy0+Zm1jLT5iaWdsb2NrKTsKKwl9IGVsc2UgeworCQlEMyhwcmludGsoImpmZnNfbG9va3VwKCk6IENvdWxkbid0IGZpbmQgdGhlIGZpbGUuICIKKwkJCSAgImYgPSAweCVwLCBuYW1lID0gXCIlc1wiLCBkID0gMHglcCwgZC0+aW5vID0gJXVcbiIsCisJCQkgIGYsIG5hbWUsIGQsIGQtPmlubykpOworCQlpbm9kZSA9IE5VTEw7CisJfQorCisJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CisJRDMocHJpbnRrIChLRVJOX05PVElDRSAibG9va3VwKCk6IHVwIGJpZ2xvY2tcbiIpKTsKKwl1cCgmYy0+Zm1jLT5iaWdsb2NrKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIE5VTEw7CisKK2pmZnNfbG9va3VwX2VuZDoKKwlEMyhwcmludGsgKEtFUk5fTk9USUNFICJsb29rdXAoKTogdXAgYmlnbG9ja1xuIikpOworCXVwKCZjLT5mbWMtPmJpZ2xvY2spOworCitqZmZzX2xvb2t1cF9lbmRfbm9fYmlnbG9jazoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIEVSUl9QVFIocik7Cit9IC8qIGpmZnNfbG9va3VwKCkgICovCisKKworLyogVHJ5IHRvIHJlYWQgYSBwYWdlIG9mIGRhdGEgZnJvbSBhIGZpbGUuICAqLworc3RhdGljIGludAoramZmc19kb19yZWFkcGFnZV9ub2xvY2soc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXZvaWQgKmJ1ZjsKKwl1bnNpZ25lZCBsb25nIHJlYWRfbGVuOworCWludCByZXN1bHQ7CisJc3RydWN0IGlub2RlICppbm9kZSA9IChzdHJ1Y3QgaW5vZGUqKXBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJc3RydWN0IGpmZnNfZmlsZSAqZiA9IChzdHJ1Y3QgamZmc19maWxlICopaW5vZGUtPnUuZ2VuZXJpY19pcDsKKwlzdHJ1Y3QgamZmc19jb250cm9sICpjID0gKHN0cnVjdCBqZmZzX2NvbnRyb2wgKilpbm9kZS0+aV9zYi0+c19mc19pbmZvOworCWludCByOworCWxvZmZfdCBvZmZzZXQ7CisKKwlEMihwcmludGsoIioqKmpmZnNfcmVhZHBhZ2UoKTogZmlsZSA9IFwiJXNcIiwgcGFnZS0+aW5kZXggPSAlbHVcbiIsCisJCSAgKGYtPm5hbWUgPyBmLT5uYW1lIDogIiIpLCAobG9uZylwYWdlLT5pbmRleCkpOworCisJZ2V0X3BhZ2UocGFnZSk7CisJLyogRG9uJ3QgU2V0UGFnZUxvY2tlZChwYWdlKSwgc2hvdWxkIGJlIGxvY2tlZCBhbHJlYWR5ICovCisJQ2xlYXJQYWdlVXB0b2RhdGUocGFnZSk7CisJQ2xlYXJQYWdlRXJyb3IocGFnZSk7CisKKwlEMyhwcmludGsgKEtFUk5fTk9USUNFICJyZWFkcGFnZSgpOiBkb3duIGJpZ2xvY2tcbiIpKTsKKwlkb3duKCZjLT5mbWMtPmJpZ2xvY2spOworCisJcmVhZF9sZW4gPSAwOworCXJlc3VsdCA9IDA7CisJb2Zmc2V0ID0gcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVDsKKworCWttYXAocGFnZSk7CisJYnVmID0gcGFnZV9hZGRyZXNzKHBhZ2UpOworCWlmIChvZmZzZXQgPCBpbm9kZS0+aV9zaXplKSB7CisJCXJlYWRfbGVuID0gbWluX3QobG9uZywgaW5vZGUtPmlfc2l6ZSAtIG9mZnNldCwgUEFHRV9TSVpFKTsKKwkJciA9IGpmZnNfcmVhZF9kYXRhKGYsIGJ1Ziwgb2Zmc2V0LCByZWFkX2xlbik7CisJCWlmIChyICE9IHJlYWRfbGVuKSB7CisJCQlyZXN1bHQgPSAtRUlPOworCQkJRCgKKwkJCSAgICAgICAgcHJpbnRrKCIqKipqZmZzX3JlYWRwYWdlKCk6IFJlYWQgZXJyb3IhICIKKwkJCQkgICAgICAgIldhbnRlZCB0byByZWFkICVsdSBieXRlcyBidXQgb25seSAiCisJCQkJICAgICAgICJyZWFkICVkIGJ5dGVzLlxuIiwgcmVhZF9sZW4sIHIpOworCQkJICApOworCQl9CisKKwl9CisKKwkvKiBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugb2YgcGFydGlhbCBvciBubyByZWFkIGluIGFib3ZlICovCisJaWYocmVhZF9sZW4gPCBQQUdFX1NJWkUpCisJICAgICAgICBtZW1zZXQoYnVmICsgcmVhZF9sZW4sIDAsIFBBR0VfU0laRSAtIHJlYWRfbGVuKTsKKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwlrdW5tYXAocGFnZSk7CisKKwlEMyhwcmludGsgKEtFUk5fTk9USUNFICJyZWFkcGFnZSgpOiB1cCBiaWdsb2NrXG4iKSk7CisJdXAoJmMtPmZtYy0+YmlnbG9jayk7CisKKwlpZiAocmVzdWx0KSB7CisJICAgICAgICBTZXRQYWdlRXJyb3IocGFnZSk7CisJfWVsc2UgeworCSAgICAgICAgU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOwkgICAgICAgIAorCX0KKworCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKworCUQzKHByaW50aygiamZmc19yZWFkcGFnZSgpOiBMZWF2aW5nLi4uXG4iKSk7CisKKwlyZXR1cm4gcmVzdWx0OworfSAvKiBqZmZzX2RvX3JlYWRwYWdlX25vbG9jaygpICAqLworCitzdGF0aWMgaW50IGpmZnNfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCWludCByZXQgPSBqZmZzX2RvX3JlYWRwYWdlX25vbG9jayhmaWxlLCBwYWdlKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBDcmVhdGUgYSBuZXcgZGlyZWN0b3J5LiAgKi8KK3N0YXRpYyBpbnQKK2pmZnNfbWtkaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpCit7CisJc3RydWN0IGpmZnNfcmF3X2lub2RlIHJhd19pbm9kZTsKKwlzdHJ1Y3QgamZmc19jb250cm9sICpjOworCXN0cnVjdCBqZmZzX25vZGUgKm5vZGU7CisJc3RydWN0IGpmZnNfZmlsZSAqZGlyX2Y7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgZGlyX21vZGU7CisJaW50IHJlc3VsdCA9IDA7CisJaW50IGVycjsKKworCUQxKHsKKwkgICAgICAgIGludCBsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisJCWNoYXIgKl9uYW1lID0gKGNoYXIgKikga21hbGxvYyhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwkJbWVtY3B5KF9uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lLCBsZW4pOworCQlfbmFtZVtsZW5dID0gJ1wwJzsKKwkJcHJpbnRrKCIqKipqZmZzX21rZGlyKCk6IGRpciA9IDB4JXAsIG5hbWUgPSBcIiVzXCIsICIKKwkJICAgICAgICJsZW4gPSAlZCwgbW9kZSA9IDB4JTA4eFxuIiwgZGlyLCBfbmFtZSwgbGVuLCBtb2RlKTsKKwkJa2ZyZWUoX25hbWUpOworCX0pOworCisJbG9ja19rZXJuZWwoKTsKKwlkaXJfZiA9IChzdHJ1Y3QgamZmc19maWxlICopZGlyLT51LmdlbmVyaWNfaXA7CisKKwlBU1NFUlQoaWYgKCFkaXJfZikgeworCQlwcmludGsoS0VSTl9FUlIgImpmZnNfbWtkaXIoKTogTm8gcmVmZXJlbmNlIHRvIGEgIgorCQkgICAgICAgImpmZnNfZmlsZSBzdHJ1Y3QgaW4gaW5vZGUuXG4iKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVJTzsKKwl9KTsKKworCWMgPSBkaXJfZi0+YzsKKwlEMyhwcmludGsgKEtFUk5fTk9USUNFICJta2RpcigpOiBkb3duIGJpZ2xvY2tcbiIpKTsKKwlkb3duKCZjLT5mbWMtPmJpZ2xvY2spOworCisJZGlyX21vZGUgPSBTX0lGRElSIHwgKG1vZGUgJiAoU19JUldYVUdPfFNfSVNWVFgpCisJCQkgICAgICAmIH5jdXJyZW50LT5mcy0+dW1hc2spOworCWlmIChkaXItPmlfbW9kZSAmIFNfSVNHSUQpIHsKKwkJZGlyX21vZGUgfD0gU19JU0dJRDsKKwl9CisKKwkvKiBDcmVhdGUgYSBub2RlIGFuZCBpbml0aWFsaXplIGl0IGFzIG11Y2ggYXMgbmVlZGVkLiAgKi8KKwlpZiAoIShub2RlID0gamZmc19hbGxvY19ub2RlKCkpKSB7CisJCUQocHJpbnRrKCJqZmZzX21rZGlyKCk6IEFsbG9jYXRpb24gZmFpbGVkOiBub2RlID09IDBcbiIpKTsKKwkJcmVzdWx0ID0gLUVOT01FTTsKKwkJZ290byBqZmZzX21rZGlyX2VuZDsKKwl9CisJbm9kZS0+ZGF0YV9vZmZzZXQgPSAwOworCW5vZGUtPnJlbW92ZWRfc2l6ZSA9IDA7CisKKwkvKiBJbml0aWFsaXplIHRoZSByYXcgaW5vZGUuICAqLworCXJhd19pbm9kZS5tYWdpYyA9IEpGRlNfTUFHSUNfQklUTUFTSzsKKwlyYXdfaW5vZGUuaW5vID0gYy0+bmV4dF9pbm8rKzsKKwlyYXdfaW5vZGUucGlubyA9IGRpcl9mLT5pbm87CisJcmF3X2lub2RlLnZlcnNpb24gPSAxOworCXJhd19pbm9kZS5tb2RlID0gZGlyX21vZGU7CisJcmF3X2lub2RlLnVpZCA9IGN1cnJlbnQtPmZzdWlkOworCXJhd19pbm9kZS5naWQgPSAoZGlyLT5pX21vZGUgJiBTX0lTR0lEKSA/IGRpci0+aV9naWQgOiBjdXJyZW50LT5mc2dpZDsKKwkvKglyYXdfaW5vZGUuZ2lkID0gY3VycmVudC0+ZnNnaWQ7ICovCisJcmF3X2lub2RlLmF0aW1lID0gZ2V0X3NlY29uZHMoKTsKKwlyYXdfaW5vZGUubXRpbWUgPSByYXdfaW5vZGUuYXRpbWU7CisJcmF3X2lub2RlLmN0aW1lID0gcmF3X2lub2RlLmF0aW1lOworCXJhd19pbm9kZS5vZmZzZXQgPSAwOworCXJhd19pbm9kZS5kc2l6ZSA9IDA7CisJcmF3X2lub2RlLnJzaXplID0gMDsKKwlyYXdfaW5vZGUubnNpemUgPSBkZW50cnktPmRfbmFtZS5sZW47CisJcmF3X2lub2RlLm5saW5rID0gMTsKKwlyYXdfaW5vZGUuc3BhcmUgPSAwOworCXJhd19pbm9kZS5yZW5hbWUgPSAwOworCXJhd19pbm9kZS5kZWxldGVkID0gMDsKKworCS8qIFdyaXRlIHRoZSBuZXcgbm9kZSB0byB0aGUgZmxhc2guICAqLworCWlmICgocmVzdWx0ID0gamZmc193cml0ZV9ub2RlKGMsIG5vZGUsICZyYXdfaW5vZGUsCisJCQkJICAgICBkZW50cnktPmRfbmFtZS5uYW1lLCBOVUxMLCAwLCBOVUxMKSkgPCAwKSB7CisJCUQocHJpbnRrKCJqZmZzX21rZGlyKCk6IGpmZnNfd3JpdGVfbm9kZSgpIGZhaWxlZC5cbiIpKTsKKwkJamZmc19mcmVlX25vZGUobm9kZSk7CisJCWdvdG8gamZmc19ta2Rpcl9lbmQ7CisJfQorCisJLyogSW5zZXJ0IHRoZSBuZXcgbm9kZSBpbnRvIHRoZSBmaWxlIHN5c3RlbS4gICovCisJaWYgKChyZXN1bHQgPSBqZmZzX2luc2VydF9ub2RlKGMsIE5VTEwsICZyYXdfaW5vZGUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkJICAgICAgIG5vZGUpKSA8IDApIHsKKwkJZ290byBqZmZzX21rZGlyX2VuZDsKKwl9CisKKwlpbm9kZSA9IGpmZnNfbmV3X2lub2RlKGRpciwgJnJhd19pbm9kZSwgJmVycik7CisJaWYgKGlub2RlID09IE5VTEwpIHsKKwkJcmVzdWx0ID0gZXJyOworCQlnb3RvIGpmZnNfbWtkaXJfZW5kOworCX0KKworCWlub2RlLT5pX29wID0gJmpmZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfZm9wID0gJmpmZnNfZGlyX29wZXJhdGlvbnM7CisKKwltYXJrX2lub2RlX2RpcnR5KGRpcik7CisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKworCXJlc3VsdCA9IDA7CitqZmZzX21rZGlyX2VuZDoKKwlEMyhwcmludGsgKEtFUk5fTk9USUNFICJta2RpcigpOiB1cCBiaWdsb2NrXG4iKSk7CisJdXAoJmMtPmZtYy0+YmlnbG9jayk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXN1bHQ7Cit9IC8qIGpmZnNfbWtkaXIoKSAgKi8KKworCisvKiBSZW1vdmUgYSBkaXJlY3RvcnkuICAqLworc3RhdGljIGludAoramZmc19ybWRpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBqZmZzX2NvbnRyb2wgKmMgPSAoc3RydWN0IGpmZnNfY29udHJvbCAqKWRpci0+aV9zYi0+c19mc19pbmZvOworCWludCByZXQ7CisJRDMocHJpbnRrKCIqKipqZmZzX3JtZGlyKClcbiIpKTsKKwlEMyhwcmludGsgKEtFUk5fTk9USUNFICJybWRpcigpOiBkb3duIGJpZ2xvY2tcbiIpKTsKKwlsb2NrX2tlcm5lbCgpOworCWRvd24oJmMtPmZtYy0+YmlnbG9jayk7CisJcmV0ID0gamZmc19yZW1vdmUoZGlyLCBkZW50cnksIFNfSUZESVIpOworCUQzKHByaW50ayAoS0VSTl9OT1RJQ0UgInJtZGlyKCk6IHVwIGJpZ2xvY2tcbiIpKTsKKwl1cCgmYy0+Zm1jLT5iaWdsb2NrKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJldDsKK30KKworCisvKiBSZW1vdmUgYW55IGtpbmQgb2YgZmlsZSBleGNlcHQgZm9yIGRpcmVjdG9yaWVzLiAgKi8KK3N0YXRpYyBpbnQKK2pmZnNfdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGpmZnNfY29udHJvbCAqYyA9IChzdHJ1Y3QgamZmc19jb250cm9sICopZGlyLT5pX3NiLT5zX2ZzX2luZm87CisJaW50IHJldDsgCisKKwlsb2NrX2tlcm5lbCgpOworCUQzKHByaW50aygiKioqamZmc191bmxpbmsoKVxuIikpOworCUQzKHByaW50ayAoS0VSTl9OT1RJQ0UgInVubGluaygpOiBkb3duIGJpZ2xvY2tcbiIpKTsKKwlkb3duKCZjLT5mbWMtPmJpZ2xvY2spOworCXJldCA9IGpmZnNfcmVtb3ZlKGRpciwgZGVudHJ5LCAwKTsKKwlEMyhwcmludGsgKEtFUk5fTk9USUNFICJ1bmxpbmsoKTogdXAgYmlnbG9ja1xuIikpOworCXVwKCZjLT5mbWMtPmJpZ2xvY2spOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qIFJlbW92ZSBhIEpGRlMgZW50cnksIGkuZS4gcGxhaW4gZmlsZXMsIGRpcmVjdG9yaWVzLCBldGMuICBIZXJlIHdlCisgICBzaG91bGRuJ3QgdGVzdCBmb3IgZnJlZSBzcGFjZSBvbiB0aGUgZGV2aWNlLiAgKi8KK3N0YXRpYyBpbnQKK2pmZnNfcmVtb3ZlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCB0eXBlKQoreworCXN0cnVjdCBqZmZzX3Jhd19pbm9kZSByYXdfaW5vZGU7CisJc3RydWN0IGpmZnNfY29udHJvbCAqYzsKKwlzdHJ1Y3QgamZmc19maWxlICpkaXJfZjsgLyogVGhlIGZpbGUtdG8tcmVtb3ZlJ3MgcGFyZW50LiAgKi8KKwlzdHJ1Y3QgamZmc19maWxlICpkZWxfZjsgLyogVGhlIGZpbGUgdG8gcmVtb3ZlLiAgKi8KKwlzdHJ1Y3QgamZmc19ub2RlICpkZWxfbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKKwlpbnQgcmVzdWx0ID0gMDsKKworCUQxKHsKKwkJaW50IGxlbiA9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKKwkJY29uc3QgY2hhciAqbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7CisJCWNoYXIgKl9uYW1lID0gKGNoYXIgKikga21hbGxvYyhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwkJbWVtY3B5KF9uYW1lLCBuYW1lLCBsZW4pOworCQlfbmFtZVtsZW5dID0gJ1wwJzsKKwkJcHJpbnRrKCIqKipqZmZzX3JlbW92ZSgpOiBmaWxlID0gXCIlc1wiLCBpbm8gPSAlbGRcbiIsIF9uYW1lLCBkZW50cnktPmRfaW5vZGUtPmlfaW5vKTsKKwkJa2ZyZWUoX25hbWUpOworCX0pOworCisJZGlyX2YgPSAoc3RydWN0IGpmZnNfZmlsZSAqKSBkaXItPnUuZ2VuZXJpY19pcDsKKwljID0gZGlyX2YtPmM7CisKKwlyZXN1bHQgPSAtRU5PRU5UOworCWlmICghKGRlbF9mID0gamZmc19maW5kX2NoaWxkKGRpcl9mLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkJCSAgICAgIGRlbnRyeS0+ZF9uYW1lLmxlbikpKSB7CisJCUQocHJpbnRrKCJqZmZzX3JlbW92ZSgpOiBqZmZzX2ZpbmRfY2hpbGQoKSBmYWlsZWQuXG4iKSk7CisJCWdvdG8gamZmc19yZW1vdmVfZW5kOworCX0KKworCWlmIChTX0lTRElSKHR5cGUpKSB7CisJCXN0cnVjdCBqZmZzX2ZpbGUgKmNoaWxkID0gZGVsX2YtPmNoaWxkcmVuOworCQl3aGlsZShjaGlsZCkgeworCQkJaWYoICFjaGlsZC0+ZGVsZXRlZCApIHsKKwkJCQlyZXN1bHQgPSAtRU5PVEVNUFRZOworCQkJCWdvdG8gamZmc19yZW1vdmVfZW5kOworCQkJfQorCQkJY2hpbGQgPSBjaGlsZC0+c2libGluZ19uZXh0OworCQl9CisJfSAgICAgICAgICAgIAorCWVsc2UgaWYgKFNfSVNESVIoZGVsX2YtPm1vZGUpKSB7CisJCUQocHJpbnRrKCJqZmZzX3JlbW92ZSgpOiBub2RlIGlzIGEgZGlyZWN0b3J5ICIKKwkJCSAiYnV0IGl0IHNob3VsZG4ndCBiZS5cbiIpKTsKKwkJcmVzdWx0ID0gLUVQRVJNOworCQlnb3RvIGpmZnNfcmVtb3ZlX2VuZDsKKwl9CisKKwlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKworCXJlc3VsdCA9IC1FSU87CisJaWYgKGRlbF9mLT5pbm8gIT0gaW5vZGUtPmlfaW5vKQorCQlnb3RvIGpmZnNfcmVtb3ZlX2VuZDsKKworCWlmICghaW5vZGUtPmlfbmxpbmspIHsKKwkJcHJpbnRrKCJEZWxldGluZyBub25leGlzdGVudCBmaWxlIGlub2RlOiAlbHUsIG5saW5rOiAlZFxuIiwKKwkJICAgICAgIGlub2RlLT5pX2lubywgaW5vZGUtPmlfbmxpbmspOworCQlpbm9kZS0+aV9ubGluaz0xOworCX0KKworCS8qIENyZWF0ZSBhIG5vZGUgZm9yIHRoZSBkZWxldGlvbi4gICovCisJcmVzdWx0ID0gLUVOT01FTTsKKwlpZiAoIShkZWxfbm9kZSA9IGpmZnNfYWxsb2Nfbm9kZSgpKSkgeworCQlEKHByaW50aygiamZmc19yZW1vdmUoKTogQWxsb2NhdGlvbiBmYWlsZWQhXG4iKSk7CisJCWdvdG8gamZmc19yZW1vdmVfZW5kOworCX0KKwlkZWxfbm9kZS0+ZGF0YV9vZmZzZXQgPSAwOworCWRlbF9ub2RlLT5yZW1vdmVkX3NpemUgPSAwOworCisJLyogSW5pdGlhbGl6ZSB0aGUgcmF3IGlub2RlLiAgKi8KKwlyYXdfaW5vZGUubWFnaWMgPSBKRkZTX01BR0lDX0JJVE1BU0s7CisJcmF3X2lub2RlLmlubyA9IGRlbF9mLT5pbm87CisJcmF3X2lub2RlLnBpbm8gPSBkZWxfZi0+cGlubzsKKy8qICAJcmF3X2lub2RlLnZlcnNpb24gPSBkZWxfZi0+aGlnaGVzdF92ZXJzaW9uICsgMTsgKi8KKwlyYXdfaW5vZGUubW9kZSA9IGRlbF9mLT5tb2RlOworCXJhd19pbm9kZS51aWQgPSBjdXJyZW50LT5mc3VpZDsKKwlyYXdfaW5vZGUuZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJcmF3X2lub2RlLmF0aW1lID0gZ2V0X3NlY29uZHMoKTsKKwlyYXdfaW5vZGUubXRpbWUgPSBkZWxfZi0+bXRpbWU7CisJcmF3X2lub2RlLmN0aW1lID0gcmF3X2lub2RlLmF0aW1lOworCXJhd19pbm9kZS5vZmZzZXQgPSAwOworCXJhd19pbm9kZS5kc2l6ZSA9IDA7CisJcmF3X2lub2RlLnJzaXplID0gMDsKKwlyYXdfaW5vZGUubnNpemUgPSAwOworCXJhd19pbm9kZS5ubGluayA9IGRlbF9mLT5ubGluazsKKwlyYXdfaW5vZGUuc3BhcmUgPSAwOworCXJhd19pbm9kZS5yZW5hbWUgPSAwOworCXJhd19pbm9kZS5kZWxldGVkID0gMTsKKworCS8qIFdyaXRlIHRoZSBuZXcgbm9kZSB0byB0aGUgZmxhc2ggbWVtb3J5LiAgKi8KKwlpZiAoamZmc193cml0ZV9ub2RlKGMsIGRlbF9ub2RlLCAmcmF3X2lub2RlLCBOVUxMLCBOVUxMLCAxLCBkZWxfZikgPCAwKSB7CisJCWpmZnNfZnJlZV9ub2RlKGRlbF9ub2RlKTsKKwkJcmVzdWx0ID0gLUVJTzsKKwkJZ290byBqZmZzX3JlbW92ZV9lbmQ7CisJfQorCisJLyogVXBkYXRlIHRoZSBmaWxlLiAgVGhpcyBvcGVyYXRpb24gd2lsbCBtYWtlIHRoZSBmaWxlIGRpc2FwcGVhcgorCSAgIGZyb20gdGhlIGluLW1lbW9yeSBmaWxlIHN5c3RlbSBzdHJ1Y3R1cmVzLiAgKi8KKwlqZmZzX2luc2VydF9ub2RlKGMsIGRlbF9mLCAmcmF3X2lub2RlLCBOVUxMLCBkZWxfbm9kZSk7CisKKwlkaXItPmlfY3RpbWUgPSBkaXItPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCW1hcmtfaW5vZGVfZGlydHkoZGlyKTsKKwlpbm9kZS0+aV9ubGluay0tOworCWlub2RlLT5pX2N0aW1lID0gZGlyLT5pX2N0aW1lOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCisJZF9kZWxldGUoZGVudHJ5KTsJLyogVGhpcyBhbHNvIGZyZWVzIHRoZSBpbm9kZSAqLworCisJcmVzdWx0ID0gMDsKK2pmZnNfcmVtb3ZlX2VuZDoKKwlyZXR1cm4gcmVzdWx0OworfSAvKiBqZmZzX3JlbW92ZSgpICAqLworCisKK3N0YXRpYyBpbnQKK2pmZnNfbWtub2Qoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsIGRldl90IHJkZXYpCit7CisJc3RydWN0IGpmZnNfcmF3X2lub2RlIHJhd19pbm9kZTsKKwlzdHJ1Y3QgamZmc19maWxlICpkaXJfZjsKKwlzdHJ1Y3QgamZmc19ub2RlICpub2RlID0gTlVMTDsKKwlzdHJ1Y3QgamZmc19jb250cm9sICpjOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IHJlc3VsdCA9IDA7CisJdTE2IGRhdGEgPSBvbGRfZW5jb2RlX2RldihyZGV2KTsKKwlpbnQgZXJyOworCisJRDEocHJpbnRrKCIqKipqZmZzX21rbm9kKClcbiIpKTsKKworCWlmICghb2xkX3ZhbGlkX2RldihyZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbG9ja19rZXJuZWwoKTsKKwlkaXJfZiA9IChzdHJ1Y3QgamZmc19maWxlICopZGlyLT51LmdlbmVyaWNfaXA7CisJYyA9IGRpcl9mLT5jOworCisJRDMocHJpbnRrIChLRVJOX05PVElDRSAibWtub2QoKTogZG93biBiaWdsb2NrXG4iKSk7CisJZG93bigmYy0+Zm1jLT5iaWdsb2NrKTsKKworCS8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBub2RlLiAgKi8KKwlpZiAoIShub2RlID0gamZmc19hbGxvY19ub2RlKCkpKSB7CisJCUQocHJpbnRrKCJqZmZzX21rbm9kKCk6IEFsbG9jYXRpb24gZmFpbGVkIVxuIikpOworCQlyZXN1bHQgPSAtRU5PTUVNOworCQlnb3RvIGpmZnNfbWtub2RfZXJyOworCX0KKwlub2RlLT5kYXRhX29mZnNldCA9IDA7CisJbm9kZS0+cmVtb3ZlZF9zaXplID0gMDsKKworCS8qIEluaXRpYWxpemUgdGhlIHJhdyBpbm9kZS4gICovCisJcmF3X2lub2RlLm1hZ2ljID0gSkZGU19NQUdJQ19CSVRNQVNLOworCXJhd19pbm9kZS5pbm8gPSBjLT5uZXh0X2lubysrOworCXJhd19pbm9kZS5waW5vID0gZGlyX2YtPmlubzsKKwlyYXdfaW5vZGUudmVyc2lvbiA9IDE7CisJcmF3X2lub2RlLm1vZGUgPSBtb2RlOworCXJhd19pbm9kZS51aWQgPSBjdXJyZW50LT5mc3VpZDsKKwlyYXdfaW5vZGUuZ2lkID0gKGRpci0+aV9tb2RlICYgU19JU0dJRCkgPyBkaXItPmlfZ2lkIDogY3VycmVudC0+ZnNnaWQ7CisJLyoJcmF3X2lub2RlLmdpZCA9IGN1cnJlbnQtPmZzZ2lkOyAqLworCXJhd19pbm9kZS5hdGltZSA9IGdldF9zZWNvbmRzKCk7CisJcmF3X2lub2RlLm10aW1lID0gcmF3X2lub2RlLmF0aW1lOworCXJhd19pbm9kZS5jdGltZSA9IHJhd19pbm9kZS5hdGltZTsKKwlyYXdfaW5vZGUub2Zmc2V0ID0gMDsKKwlyYXdfaW5vZGUuZHNpemUgPSAyOworCXJhd19pbm9kZS5yc2l6ZSA9IDA7CisJcmF3X2lub2RlLm5zaXplID0gZGVudHJ5LT5kX25hbWUubGVuOworCXJhd19pbm9kZS5ubGluayA9IDE7CisJcmF3X2lub2RlLnNwYXJlID0gMDsKKwlyYXdfaW5vZGUucmVuYW1lID0gMDsKKwlyYXdfaW5vZGUuZGVsZXRlZCA9IDA7CisKKwkvKiBXcml0ZSB0aGUgbmV3IG5vZGUgdG8gdGhlIGZsYXNoLiAgKi8KKwlpZiAoKGVyciA9IGpmZnNfd3JpdGVfbm9kZShjLCBub2RlLCAmcmF3X2lub2RlLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkJCSAgICh1bnNpZ25lZCBjaGFyICopJmRhdGEsIDAsIE5VTEwpKSA8IDApIHsKKwkJRChwcmludGsoImpmZnNfbWtub2QoKTogamZmc193cml0ZV9ub2RlKCkgZmFpbGVkLlxuIikpOworCQlyZXN1bHQgPSBlcnI7CisJCWdvdG8gamZmc19ta25vZF9lcnI7CisJfQorCisJLyogSW5zZXJ0IHRoZSBuZXcgbm9kZSBpbnRvIHRoZSBmaWxlIHN5c3RlbS4gICovCisJaWYgKChlcnIgPSBqZmZzX2luc2VydF9ub2RlKGMsIE5VTEwsICZyYXdfaW5vZGUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkJICAgIG5vZGUpKSA8IDApIHsKKwkJcmVzdWx0ID0gZXJyOworCQlnb3RvIGpmZnNfbWtub2RfZW5kOworCX0KKworCWlub2RlID0gamZmc19uZXdfaW5vZGUoZGlyLCAmcmF3X2lub2RlLCAmZXJyKTsKKwlpZiAoaW5vZGUgPT0gTlVMTCkgeworCQlyZXN1bHQgPSBlcnI7CisJCWdvdG8gamZmc19ta25vZF9lbmQ7CisJfQorCisJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBtb2RlLCByZGV2KTsKKworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisKKwlnb3RvIGpmZnNfbWtub2RfZW5kOworCitqZmZzX21rbm9kX2VycjoKKwlpZiAobm9kZSkgeworCQlqZmZzX2ZyZWVfbm9kZShub2RlKTsKKwl9CisKK2pmZnNfbWtub2RfZW5kOgorCUQzKHByaW50ayAoS0VSTl9OT1RJQ0UgIm1rbm9kKCk6IHVwIGJpZ2xvY2tcbiIpKTsKKwl1cCgmYy0+Zm1jLT5iaWdsb2NrKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJlc3VsdDsKK30gLyogamZmc19ta25vZCgpICAqLworCisKK3N0YXRpYyBpbnQKK2pmZnNfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpzeW1uYW1lKQoreworCXN0cnVjdCBqZmZzX3Jhd19pbm9kZSByYXdfaW5vZGU7CisJc3RydWN0IGpmZnNfY29udHJvbCAqYzsKKwlzdHJ1Y3QgamZmc19maWxlICpkaXJfZjsKKwlzdHJ1Y3QgamZmc19ub2RlICpub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwlpbnQgc3ltbmFtZV9sZW4gPSBzdHJsZW4oc3ltbmFtZSk7CisJaW50IGVycjsKKworCWxvY2tfa2VybmVsKCk7CisJRDEoeworCQlpbnQgbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOyAKKwkJY2hhciAqX25hbWUgPSAoY2hhciAqKWttYWxsb2MobGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJCWNoYXIgKl9zeW1uYW1lID0gKGNoYXIgKilrbWFsbG9jKHN5bW5hbWVfbGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJCW1lbWNweShfbmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSwgbGVuKTsKKwkJX25hbWVbbGVuXSA9ICdcMCc7CisJCW1lbWNweShfc3ltbmFtZSwgc3ltbmFtZSwgc3ltbmFtZV9sZW4pOworCQlfc3ltbmFtZVtzeW1uYW1lX2xlbl0gPSAnXDAnOworCQlwcmludGsoIioqKmpmZnNfc3ltbGluaygpOiBkaXIgPSAweCVwLCAiCisJCSAgICAgICAiZGVudHJ5LT5kbmFtZS5uYW1lID0gXCIlc1wiLCAiCisJCSAgICAgICAic3ltbmFtZSA9IFwiJXNcIlxuIiwgZGlyLCBfbmFtZSwgX3N5bW5hbWUpOworCQlrZnJlZShfbmFtZSk7CisJCWtmcmVlKF9zeW1uYW1lKTsKKwl9KTsKKworCWRpcl9mID0gKHN0cnVjdCBqZmZzX2ZpbGUgKilkaXItPnUuZ2VuZXJpY19pcDsKKwlBU1NFUlQoaWYgKCFkaXJfZikgeworCQlwcmludGsoS0VSTl9FUlIgImpmZnNfc3ltbGluaygpOiBObyByZWZlcmVuY2UgdG8gYSAiCisJCSAgICAgICAiamZmc19maWxlIHN0cnVjdCBpbiBpbm9kZS5cbiIpOworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRUlPOworCX0pOworCisJYyA9IGRpcl9mLT5jOworCisJLyogQ3JlYXRlIGEgbm9kZSBhbmQgaW5pdGlhbGl6ZSBpdCBhcyBtdWNoIGFzIG5lZWRlZC4gICovCisJaWYgKCEobm9kZSA9IGpmZnNfYWxsb2Nfbm9kZSgpKSkgeworCQlEKHByaW50aygiamZmc19zeW1saW5rKCk6IEFsbG9jYXRpb24gZmFpbGVkOiBub2RlID0gTlVMTFxuIikpOworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlEMyhwcmludGsgKEtFUk5fTk9USUNFICJzeW1saW5rKCk6IGRvd24gYmlnbG9ja1xuIikpOworCWRvd24oJmMtPmZtYy0+YmlnbG9jayk7CisKKwlub2RlLT5kYXRhX29mZnNldCA9IDA7CisJbm9kZS0+cmVtb3ZlZF9zaXplID0gMDsKKworCS8qIEluaXRpYWxpemUgdGhlIHJhdyBpbm9kZS4gICovCisJcmF3X2lub2RlLm1hZ2ljID0gSkZGU19NQUdJQ19CSVRNQVNLOworCXJhd19pbm9kZS5pbm8gPSBjLT5uZXh0X2lubysrOworCXJhd19pbm9kZS5waW5vID0gZGlyX2YtPmlubzsKKwlyYXdfaW5vZGUudmVyc2lvbiA9IDE7CisJcmF3X2lub2RlLm1vZGUgPSBTX0lGTE5LIHwgU19JUldYVUdPOworCXJhd19pbm9kZS51aWQgPSBjdXJyZW50LT5mc3VpZDsKKwlyYXdfaW5vZGUuZ2lkID0gKGRpci0+aV9tb2RlICYgU19JU0dJRCkgPyBkaXItPmlfZ2lkIDogY3VycmVudC0+ZnNnaWQ7CisJcmF3X2lub2RlLmF0aW1lID0gZ2V0X3NlY29uZHMoKTsKKwlyYXdfaW5vZGUubXRpbWUgPSByYXdfaW5vZGUuYXRpbWU7CisJcmF3X2lub2RlLmN0aW1lID0gcmF3X2lub2RlLmF0aW1lOworCXJhd19pbm9kZS5vZmZzZXQgPSAwOworCXJhd19pbm9kZS5kc2l6ZSA9IHN5bW5hbWVfbGVuOworCXJhd19pbm9kZS5yc2l6ZSA9IDA7CisJcmF3X2lub2RlLm5zaXplID0gZGVudHJ5LT5kX25hbWUubGVuOworCXJhd19pbm9kZS5ubGluayA9IDE7CisJcmF3X2lub2RlLnNwYXJlID0gMDsKKwlyYXdfaW5vZGUucmVuYW1lID0gMDsKKwlyYXdfaW5vZGUuZGVsZXRlZCA9IDA7CisKKwkvKiBXcml0ZSB0aGUgbmV3IG5vZGUgdG8gdGhlIGZsYXNoLiAgKi8KKwlpZiAoKGVyciA9IGpmZnNfd3JpdGVfbm9kZShjLCBub2RlLCAmcmF3X2lub2RlLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkJCSAgIChjb25zdCB1bnNpZ25lZCBjaGFyICopc3ltbmFtZSwgMCwgTlVMTCkpIDwgMCkgeworCQlEKHByaW50aygiamZmc19zeW1saW5rKCk6IGpmZnNfd3JpdGVfbm9kZSgpIGZhaWxlZC5cbiIpKTsKKwkJamZmc19mcmVlX25vZGUobm9kZSk7CisJCWdvdG8gamZmc19zeW1saW5rX2VuZDsKKwl9CisKKwkvKiBJbnNlcnQgdGhlIG5ldyBub2RlIGludG8gdGhlIGZpbGUgc3lzdGVtLiAgKi8KKwlpZiAoKGVyciA9IGpmZnNfaW5zZXJ0X25vZGUoYywgTlVMTCwgJnJhd19pbm9kZSwgZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCQkgICAgbm9kZSkpIDwgMCkgeworCQlnb3RvIGpmZnNfc3ltbGlua19lbmQ7CisJfQorCisJaW5vZGUgPSBqZmZzX25ld19pbm9kZShkaXIsICZyYXdfaW5vZGUsICZlcnIpOworCWlmIChpbm9kZSA9PSBOVUxMKSB7CisJCWdvdG8gamZmc19zeW1saW5rX2VuZDsKKwl9CisJZXJyID0gMDsKKwlpbm9kZS0+aV9vcCA9ICZwYWdlX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZqZmZzX2FkZHJlc3Nfb3BlcmF0aW9uczsKKworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisgamZmc19zeW1saW5rX2VuZDoKKwlEMyhwcmludGsgKEtFUk5fTk9USUNFICJzeW1saW5rKCk6IHVwIGJpZ2xvY2tcbiIpKTsKKwl1cCgmYy0+Zm1jLT5iaWdsb2NrKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycjsKK30gLyogamZmc19zeW1saW5rKCkgICovCisKKworLyogQ3JlYXRlIGFuIGlub2RlIGluc2lkZSBhIEpGRlMgZGlyZWN0b3J5IChkaXIpIGFuZCByZXR1cm4gaXQuCisgKgorICogQnkgdGhlIHRpbWUgdGhpcyBpcyBjYWxsZWQsIHdlIGFscmVhZHkgaGF2ZSBjcmVhdGVkCisgKiB0aGUgZGlyZWN0b3J5IGNhY2hlIGVudHJ5IGZvciB0aGUgbmV3IGZpbGUsIGJ1dCBpdAorICogaXMgc28gZmFyIG5lZ2F0aXZlIC0gaXQgaGFzIG5vIGlub2RlLgorICoKKyAqIElmIHRoZSBjcmVhdGUgc3VjY2VlZHMsIHdlIGZpbGwgaW4gdGhlIGlub2RlIGluZm9ybWF0aW9uCisgKiB3aXRoIGRfaW5zdGFudGlhdGUoKS4KKyAqLworc3RhdGljIGludAoramZmc19jcmVhdGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsCisJCXN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBqZmZzX3Jhd19pbm9kZSByYXdfaW5vZGU7CisJc3RydWN0IGpmZnNfY29udHJvbCAqYzsKKwlzdHJ1Y3QgamZmc19ub2RlICpub2RlOworCXN0cnVjdCBqZmZzX2ZpbGUgKmRpcl9mOyAvKiBKRkZTIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkaXJlY3RvcnkuICAqLworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IGVycjsKKworCWxvY2tfa2VybmVsKCk7CisJRDEoeworCQlpbnQgbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCQljaGFyICpzID0gKGNoYXIgKilrbWFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOworCQltZW1jcHkocywgZGVudHJ5LT5kX25hbWUubmFtZSwgbGVuKTsKKwkJc1tsZW5dID0gJ1wwJzsKKwkJcHJpbnRrKCJqZmZzX2NyZWF0ZSgpOiBkaXI6IDB4JXAsIG5hbWU6IFwiJXNcIlxuIiwgZGlyLCBzKTsKKwkJa2ZyZWUocyk7CisJfSk7CisKKwlkaXJfZiA9IChzdHJ1Y3QgamZmc19maWxlICopZGlyLT51LmdlbmVyaWNfaXA7CisJQVNTRVJUKGlmICghZGlyX2YpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJqZmZzX2NyZWF0ZSgpOiBObyByZWZlcmVuY2UgdG8gYSAiCisJCSAgICAgICAiamZmc19maWxlIHN0cnVjdCBpbiBpbm9kZS5cbiIpOworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRUlPOworCX0pOworCisJYyA9IGRpcl9mLT5jOworCisJLyogQ3JlYXRlIGEgbm9kZSBhbmQgaW5pdGlhbGl6ZSBhcyBtdWNoIGFzIG5lZWRlZC4gICovCisJaWYgKCEobm9kZSA9IGpmZnNfYWxsb2Nfbm9kZSgpKSkgeworCQlEKHByaW50aygiamZmc19jcmVhdGUoKTogQWxsb2NhdGlvbiBmYWlsZWQ6IG5vZGUgPT0gMFxuIikpOworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlEMyhwcmludGsgKEtFUk5fTk9USUNFICJjcmVhdGUoKTogZG93biBiaWdsb2NrXG4iKSk7CisJZG93bigmYy0+Zm1jLT5iaWdsb2NrKTsKKworCW5vZGUtPmRhdGFfb2Zmc2V0ID0gMDsKKwlub2RlLT5yZW1vdmVkX3NpemUgPSAwOworCisJLyogSW5pdGlhbGl6ZSB0aGUgcmF3IGlub2RlLiAgKi8KKwlyYXdfaW5vZGUubWFnaWMgPSBKRkZTX01BR0lDX0JJVE1BU0s7CisJcmF3X2lub2RlLmlubyA9IGMtPm5leHRfaW5vKys7CisJcmF3X2lub2RlLnBpbm8gPSBkaXJfZi0+aW5vOworCXJhd19pbm9kZS52ZXJzaW9uID0gMTsKKwlyYXdfaW5vZGUubW9kZSA9IG1vZGU7CisJcmF3X2lub2RlLnVpZCA9IGN1cnJlbnQtPmZzdWlkOworCXJhd19pbm9kZS5naWQgPSAoZGlyLT5pX21vZGUgJiBTX0lTR0lEKSA/IGRpci0+aV9naWQgOiBjdXJyZW50LT5mc2dpZDsKKwlyYXdfaW5vZGUuYXRpbWUgPSBnZXRfc2Vjb25kcygpOworCXJhd19pbm9kZS5tdGltZSA9IHJhd19pbm9kZS5hdGltZTsKKwlyYXdfaW5vZGUuY3RpbWUgPSByYXdfaW5vZGUuYXRpbWU7CisJcmF3X2lub2RlLm9mZnNldCA9IDA7CisJcmF3X2lub2RlLmRzaXplID0gMDsKKwlyYXdfaW5vZGUucnNpemUgPSAwOworCXJhd19pbm9kZS5uc2l6ZSA9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKKwlyYXdfaW5vZGUubmxpbmsgPSAxOworCXJhd19pbm9kZS5zcGFyZSA9IDA7CisJcmF3X2lub2RlLnJlbmFtZSA9IDA7CisJcmF3X2lub2RlLmRlbGV0ZWQgPSAwOworCisJLyogV3JpdGUgdGhlIG5ldyBub2RlIHRvIHRoZSBmbGFzaC4gICovCisJaWYgKChlcnIgPSBqZmZzX3dyaXRlX25vZGUoYywgbm9kZSwgJnJhd19pbm9kZSwKKwkJCQkgICBkZW50cnktPmRfbmFtZS5uYW1lLCBOVUxMLCAwLCBOVUxMKSkgPCAwKSB7CisJCUQocHJpbnRrKCJqZmZzX2NyZWF0ZSgpOiBqZmZzX3dyaXRlX25vZGUoKSBmYWlsZWQuXG4iKSk7CisJCWpmZnNfZnJlZV9ub2RlKG5vZGUpOworCQlnb3RvIGpmZnNfY3JlYXRlX2VuZDsKKwl9CisKKwkvKiBJbnNlcnQgdGhlIG5ldyBub2RlIGludG8gdGhlIGZpbGUgc3lzdGVtLiAgKi8KKwlpZiAoKGVyciA9IGpmZnNfaW5zZXJ0X25vZGUoYywgTlVMTCwgJnJhd19pbm9kZSwgZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCQkgICAgbm9kZSkpIDwgMCkgeworCQlnb3RvIGpmZnNfY3JlYXRlX2VuZDsKKwl9CisKKwkvKiBJbml0aWFsaXplIGFuIGlub2RlLiAgKi8KKwlpbm9kZSA9IGpmZnNfbmV3X2lub2RlKGRpciwgJnJhd19pbm9kZSwgJmVycik7CisJaWYgKGlub2RlID09IE5VTEwpIHsKKwkJZ290byBqZmZzX2NyZWF0ZV9lbmQ7CisJfQorCWVyciA9IDA7CisJaW5vZGUtPmlfb3AgPSAmamZmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfZm9wID0gJmpmZnNfZmlsZV9vcGVyYXRpb25zOworCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmpmZnNfYWRkcmVzc19vcGVyYXRpb25zOworCWlub2RlLT5pX21hcHBpbmctPm5ycGFnZXMgPSAwOworCisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKyBqZmZzX2NyZWF0ZV9lbmQ6CisJRDMocHJpbnRrIChLRVJOX05PVElDRSAiY3JlYXRlKCk6IHVwIGJpZ2xvY2tcbiIpKTsKKwl1cCgmYy0+Zm1jLT5iaWdsb2NrKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycjsKK30gLyogamZmc19jcmVhdGUoKSAgKi8KKworCisvKiBXcml0ZSwgYXBwZW5kIG9yIHJld3JpdGUgZGF0YSB0byBhbiBleGlzdGluZyBmaWxlLiAgKi8KK3N0YXRpYyBzc2l6ZV90CitqZmZzX2ZpbGVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAorCQlsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGpmZnNfcmF3X2lub2RlIHJhd19pbm9kZTsKKwlzdHJ1Y3QgamZmc19jb250cm9sICpjOworCXN0cnVjdCBqZmZzX2ZpbGUgKmY7CisJc3RydWN0IGpmZnNfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxwLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludCByZWNvdmVyYWJsZSA9IDA7CisJc2l6ZV90IHdyaXR0ZW4gPSAwOworCV9fdTMyIHRoaXNjb3VudCA9IGNvdW50OworCWxvZmZfdCBwb3MgPSAqcHBvczsKKwlpbnQgZXJyOworCisJaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKworCUQyKHByaW50aygiKioqamZmc19maWxlX3dyaXRlKCk6IGlub2RlOiAweCVwIChpbm86ICVsdSksICIKKwkJICAiZmlscDogMHglcCwgYnVmOiAweCVwLCBjb3VudDogJWRcbiIsCisJCSAgaW5vZGUsIGlub2RlLT5pX2lubywgZmlscCwgYnVmLCBjb3VudCkpOworCisjaWYgMAorCWlmIChpbm9kZS0+aV9zYi0+c19mbGFncyAmIE1TX1JET05MWSkgeworCQlEKHByaW50aygiamZmc19maWxlX3dyaXRlKCk6IE1TX1JET05MWVxuIikpOworCQllcnIgPSAtRVJPRlM7CisJCWdvdG8gb3V0X2lzZW07CisJfQorI2VuZGlmCQorCWVyciA9IC1FSU5WQUw7CisKKwlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwkJRChwcmludGsoImpmZnNfZmlsZV93cml0ZSgpOiBpbm9kZS0+aV9tb2RlID09IDB4JTA4eFxuIiwKKwkJCQlpbm9kZS0+aV9tb2RlKSk7CisJCWdvdG8gb3V0X2lzZW07CisJfQorCisJaWYgKCEoZiA9IChzdHJ1Y3QgamZmc19maWxlICopaW5vZGUtPnUuZ2VuZXJpY19pcCkpIHsKKwkJRChwcmludGsoImpmZnNfZmlsZV93cml0ZSgpOiBpbm9kZS0+dS5nZW5lcmljX2lwID0gMHglcFxuIiwKKwkJCQlpbm9kZS0+dS5nZW5lcmljX2lwKSk7CisJCWdvdG8gb3V0X2lzZW07CisJfQorCisJYyA9IGYtPmM7CisKKwkvKgorCSAqIFRoaXMgd2lsbCBuZXZlciB0cmlnZ2VyIHdpdGggc2FuZSBwYWdlIHNpemVzLiAgbGVhdmUgaXQgaW4KKwkgKiBhbnl3YXksIHNpbmNlIEknbSB0aGlua2luZyBhYm91dCBob3cgdG8gbWVyZ2UgbGFyZ2VyIHdyaXRlcworCSAqICh0aGUgY3VycmVudCBpZGVhIGlzIHRvIHBva2UgYSB0aHJlYWQgdGhhdCBkb2VzIHRoZSBhY3R1YWwKKwkgKiBJL08gYW5kIHN0YXJ0cyBieSBkb2luZyBhIGRvd24oJmlub2RlLT5pX3NlbSkuICB0aGVuIHdlCisJICogd291bGQgbmVlZCB0byBnZXQgdGhlIHBhZ2UgY2FjaGUgcGFnZXMgYW5kIGhhdmUgYSBsaXN0IG9mCisJICogSS9PIHJlcXVlc3RzIGFuZCBkbyB3cml0ZS1tZXJnaW5nIGhlcmUuCisJICogLS0gcHJ1bXBmCisJICovCisJdGhpc2NvdW50ID0gbWluKGMtPmZtYy0+bWF4X2NodW5rX3NpemUgLSBzaXplb2Yoc3RydWN0IGpmZnNfcmF3X2lub2RlKSwgY291bnQpOworCisJRDMocHJpbnRrIChLRVJOX05PVElDRSAiZmlsZV93cml0ZSgpOiBkb3duIGJpZ2xvY2tcbiIpKTsKKwlkb3duKCZjLT5mbWMtPmJpZ2xvY2spOworCisJLyogVXJnaC4gUE9TSVggc2F5cyB3ZSBjYW4gZG8gc2hvcnQgd3JpdGVzIGlmIHdlIGZlZWwgbGlrZSBpdC4gCisJICogSW4gcHJhY3RpY2UsIHdlIGNhbid0LiBOb3RoaW5nIHdpbGwgY29wZS4gU28gd2UgbG9vcCB1bnRpbAorCSAqIHdlJ3JlIGRvbmUuCisJICoKKwkgKiA8X0FuYXJjaHlfPiBwb3NpeCBhbmQgcmVhbGl0eSBhcmUgbm90IGludGVyY29ubmVjdGVkIG9uIHRoaXMgaXNzdWUKKwkgKi8KKwl3aGlsZSAoY291bnQpIHsKKwkJLyogVGhpbmdzIGFyZSBnb2luZyB0byBiZSB3cml0dGVuIHNvIHdlIGNvdWxkIGFsbG9jYXRlIGFuZAorCQkgICBpbml0aWFsaXplIHRoZSBuZWNlc3NhcnkgZGF0YSBzdHJ1Y3R1cmVzIG5vdy4gICovCisJCWlmICghKG5vZGUgPSBqZmZzX2FsbG9jX25vZGUoKSkpIHsKKwkJCUQocHJpbnRrKCJqZmZzX2ZpbGVfd3JpdGUoKTogbm9kZSA9PSAwXG4iKSk7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKworCQlub2RlLT5kYXRhX29mZnNldCA9IHBvczsKKwkJbm9kZS0+cmVtb3ZlZF9zaXplID0gMDsKKworCQkvKiBJbml0aWFsaXplIHRoZSByYXcgaW5vZGUuICAqLworCQlyYXdfaW5vZGUubWFnaWMgPSBKRkZTX01BR0lDX0JJVE1BU0s7CisJCXJhd19pbm9kZS5pbm8gPSBmLT5pbm87CisJCXJhd19pbm9kZS5waW5vID0gZi0+cGlubzsKKworCQlyYXdfaW5vZGUubW9kZSA9IGYtPm1vZGU7CisKKwkJcmF3X2lub2RlLnVpZCA9IGYtPnVpZDsKKwkJcmF3X2lub2RlLmdpZCA9IGYtPmdpZDsKKwkJcmF3X2lub2RlLmF0aW1lID0gZ2V0X3NlY29uZHMoKTsKKwkJcmF3X2lub2RlLm10aW1lID0gcmF3X2lub2RlLmF0aW1lOworCQlyYXdfaW5vZGUuY3RpbWUgPSBmLT5jdGltZTsKKwkJcmF3X2lub2RlLm9mZnNldCA9IHBvczsKKwkJcmF3X2lub2RlLmRzaXplID0gdGhpc2NvdW50OworCQlyYXdfaW5vZGUucnNpemUgPSAwOworCQlyYXdfaW5vZGUubnNpemUgPSBmLT5uc2l6ZTsKKwkJcmF3X2lub2RlLm5saW5rID0gZi0+bmxpbms7CisJCXJhd19pbm9kZS5zcGFyZSA9IDA7CisJCXJhd19pbm9kZS5yZW5hbWUgPSAwOworCQlyYXdfaW5vZGUuZGVsZXRlZCA9IDA7CisKKwkJaWYgKHBvcyA8IGYtPnNpemUpIHsKKwkJCW5vZGUtPnJlbW92ZWRfc2l6ZSA9IHJhd19pbm9kZS5yc2l6ZSA9IG1pbih0aGlzY291bnQsIChfX3UzMikoZi0+c2l6ZSAtIHBvcykpOworCisJCQkvKiBJZiB0aGlzIG5vZGUgaXMgZ29pbmcgZW50aXJlbHkgb3ZlciB0aGUgdG9wIG9mIG9sZCBkYXRhLAorCQkJICAgd2UgY2FuIGFsbG93IGl0IHRvIGdvIGludG8gdGhlIHJlc2VydmVkIHNwYWNlLCBiZWNhdXNlCisJCQkgICB3ZSBrbm93IHRoYXQgR0MgY2FuIHJlY2xhaW0gdGhlIHNwYWNlIGxhdGVyLgorCQkJKi8KKwkJCWlmIChwb3MgKyB0aGlzY291bnQgPCBmLT5zaXplKSB7CisJCQkJLyogSWYgYWxsIHRoZSBkYXRhIHdlJ3JlIG92ZXJ3cml0aW5nIGFyZSBfcmVhbF8sCisJCQkJICAgbm90IGp1c3QgaG9sZXMsIHRoZW46CisJCQkJICAgcmVjb3ZlcmFibGUgPSAxOworCQkJCSovCisJCQl9CisJCX0KKworCQkvKiBXcml0ZSB0aGUgbmV3IG5vZGUgdG8gdGhlIGZsYXNoLiAgKi8KKwkJLyogTk9URTogV2Ugd291bGQgYmUgcXVpdGUgaGFwcHkgaWYgamZmc193cml0ZV9ub2RlKCkgd3JvdGUgYQorCQkgICBzbWFsbGVyIG5vZGUgdGhhbiB3ZSB3ZXJlIGV4cGVjdGluZy4gVGhlcmUncyBubyBuZWVkIGZvciBpdAorCQkgICB0byB3YXN0ZSB0aGUgc3BhY2UgYXQgdGhlIGVuZCBvZiB0aGUgZmxhc2gganVzdCBiZWNhdXNlIGl0J3MKKwkJICAgYSBsaXR0bGUgc21hbGxlciB0aGFuIHdoYXQgd2UgYXNrZWQgZm9yLiBCdXQgdGhhdCdzIGEgd2hvbGUKKwkJICAgbmV3IGNhbiBvZiB3b3JtcyB3aGljaCBJJ20gbm90IGdvaW5nIHRvIG9wZW4gdGhpcyB3ZWVrLiAKKwkJICAgLS0gZHdtdzIuCisJCSovCisJCWlmICgoZXJyID0gamZmc193cml0ZV9ub2RlKGMsIG5vZGUsICZyYXdfaW5vZGUsIGYtPm5hbWUsCisJCQkJCSAgIChjb25zdCB1bnNpZ25lZCBjaGFyICopYnVmLAorCQkJCQkgICByZWNvdmVyYWJsZSwgZikpIDwgMCkgeworCQkJRChwcmludGsoImpmZnNfZmlsZV93cml0ZSgpOiBqZmZzX3dyaXRlX25vZGUoKSBmYWlsZWQuXG4iKSk7CisJCQlqZmZzX2ZyZWVfbm9kZShub2RlKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJd3JpdHRlbiArPSBlcnI7CisJCWJ1ZiArPSBlcnI7CisJCWNvdW50IC09IGVycjsKKwkJcG9zICs9IGVycjsKKworCQkvKiBJbnNlcnQgdGhlIG5ldyBub2RlIGludG8gdGhlIGZpbGUgc3lzdGVtLiAgKi8KKwkJaWYgKChlcnIgPSBqZmZzX2luc2VydF9ub2RlKGMsIGYsICZyYXdfaW5vZGUsIE5VTEwsIG5vZGUpKSA8IDApIHsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJRDMocHJpbnRrKCJqZmZzX2ZpbGVfd3JpdGUoKTogbmV3IGZfcG9zICVsZC5cbiIsIChsb25nKXBvcykpOworCisJCXRoaXNjb3VudCA9IG1pbihjLT5mbWMtPm1heF9jaHVua19zaXplIC0gc2l6ZW9mKHN0cnVjdCBqZmZzX3Jhd19pbm9kZSksIGNvdW50KTsKKwl9Cisgb3V0OgorCUQzKHByaW50ayAoS0VSTl9OT1RJQ0UgImZpbGVfd3JpdGUoKTogdXAgYmlnbG9ja1xuIikpOworCXVwKCZjLT5mbWMtPmJpZ2xvY2spOworCisJLyogRml4IHRoaW5ncyBpbiB0aGUgcmVhbCBpbm9kZS4gICovCisJaWYgKHBvcyA+IGlub2RlLT5pX3NpemUpIHsKKwkJaW5vZGUtPmlfc2l6ZSA9IHBvczsKKwkJaW5vZGUtPmlfYmxvY2tzID0gKGlub2RlLT5pX3NpemUgKyA1MTEpID4+IDk7CisJfQorCWlub2RlLT5pX2N0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCWludmFsaWRhdGVfaW5vZGVfcGFnZXMoaW5vZGUtPmlfbWFwcGluZyk7CisKKyBvdXRfaXNlbToKKwlyZXR1cm4gZXJyOworfSAvKiBqZmZzX2ZpbGVfd3JpdGUoKSAgKi8KKworc3RhdGljIGludAoramZmc19wcmVwYXJlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCS8qIEZJWE1FOiB3ZSBzaG91bGQgZGV0ZWN0IHNvbWUgZXJyb3IgY29uZGl0aW9ucyBoZXJlICovCisKKwkvKiBCdWdnZXIgdGhhdC4gV2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGUgcGFnZSBpcyB1cHRvZGF0ZSAqLworCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpICYmIChmcm9tIHx8IHRvIDwgUEFHRV9DQUNIRV9TSVpFKSkKKwkJcmV0dXJuIGpmZnNfZG9fcmVhZHBhZ2Vfbm9sb2NrKGZpbHAsIHBhZ2UpOworCisJcmV0dXJuIDA7Cit9IC8qIGpmZnNfcHJlcGFyZV93cml0ZSgpICovCisKK3N0YXRpYyBpbnQKK2pmZnNfY29tbWl0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKyAgICAgICAgICAgICAgICAgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCit7CisgICAgICAgdm9pZCAqYWRkciA9IHBhZ2VfYWRkcmVzcyhwYWdlKSArIGZyb207CisgICAgICAgLyogWFhYOiBQQUdFX0NBQ0hFX1NISUZUIG9yIFBBR0VfU0hJRlQgKi8KKyAgICAgICBsb2ZmX3QgcG9zID0gKHBhZ2UtPmluZGV4PDxQQUdFX0NBQ0hFX1NISUZUKSArIGZyb207CisKKyAgICAgICByZXR1cm4gamZmc19maWxlX3dyaXRlKGZpbHAsIGFkZHIsIHRvLWZyb20sICZwb3MpOworfSAvKiBqZmZzX2NvbW1pdF93cml0ZSgpICovCisKKy8qIFRoaXMgaXMgb3VyIGlvY3RsKCkgcm91dGluZS4gICovCitzdGF0aWMgaW50CitqZmZzX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLAorCSAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBqZmZzX2NvbnRyb2wgKmM7CisJaW50IHJldCA9IDA7CisKKwlEMihwcmludGsoIioqKmpmZnNfaW9jdGwoKTogY21kID0gMHglMDh4LCBhcmcgPSAweCUwOGx4XG4iLAorCQkgIGNtZCwgYXJnKSk7CisKKwlpZiAoIShjID0gKHN0cnVjdCBqZmZzX2NvbnRyb2wgKilpbm9kZS0+aV9zYi0+c19mc19pbmZvKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkpGRlM6IEJhZCBpbm9kZSBpbiBpb2N0bCgpIGNhbGwuICIKKwkJICAgICAgICIoY21kID0gMHglMDh4KVxuIiwgY21kKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCUQzKHByaW50ayAoS0VSTl9OT1RJQ0UgImlvY3RsKCk6IGRvd24gYmlnbG9ja1xuIikpOworCWRvd24oJmMtPmZtYy0+YmlnbG9jayk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgSkZGU19QUklOVF9IQVNIOgorCQlqZmZzX3ByaW50X2hhc2hfdGFibGUoYyk7CisJCWJyZWFrOworCWNhc2UgSkZGU19QUklOVF9UUkVFOgorCQlqZmZzX3ByaW50X3RyZWUoYy0+cm9vdCwgMCk7CisJCWJyZWFrOworCWNhc2UgSkZGU19HRVRfU1RBVFVTOgorCQl7CisJCQlzdHJ1Y3QgamZmc19mbGFzaF9zdGF0dXMgZnN0OworCQkJc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMgPSBjLT5mbWM7CisJCQlwcmludGsoIkZsYXNoIHN0YXR1cyAtLSAiKTsKKwkJCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwKKwkJCQkgICAgICAgKHN0cnVjdCBqZmZzX2ZsYXNoX3N0YXR1cyBfX3VzZXIgKilhcmcsCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgamZmc19mbGFzaF9zdGF0dXMpKSkgeworCQkJCUQocHJpbnRrKCJqZmZzX2lvY3RsKCk6IEJhZCBhcmcgaW4gIgorCQkJCQkgIkpGRlNfR0VUX1NUQVRVUyBpb2N0bCFcbiIpKTsKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQorCQkJZnN0LnNpemUgPSBmbWMtPmZsYXNoX3NpemU7CisJCQlmc3QudXNlZCA9IGZtYy0+dXNlZF9zaXplOworCQkJZnN0LmRpcnR5ID0gZm1jLT5kaXJ0eV9zaXplOworCQkJZnN0LmJlZ2luID0gZm1jLT5oZWFkLT5vZmZzZXQ7CisJCQlmc3QuZW5kID0gZm1jLT50YWlsLT5vZmZzZXQgKyBmbWMtPnRhaWwtPnNpemU7CisJCQlwcmludGsoInNpemU6ICVkLCB1c2VkOiAlZCwgZGlydHk6ICVkLCAiCisJCQkgICAgICAgImJlZ2luOiAlZCwgZW5kOiAlZFxuIiwKKwkJCSAgICAgICBmc3Quc2l6ZSwgZnN0LnVzZWQsIGZzdC5kaXJ0eSwKKwkJCSAgICAgICBmc3QuYmVnaW4sIGZzdC5lbmQpOworCQkJaWYgKGNvcHlfdG9fdXNlcigoc3RydWN0IGpmZnNfZmxhc2hfc3RhdHVzIF9fdXNlciAqKWFyZywKKwkJCQkJICZmc3QsCisJCQkJCSBzaXplb2Yoc3RydWN0IGpmZnNfZmxhc2hfc3RhdHVzKSkpIHsKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJfQorCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9UVFk7CisJfQorCUQzKHByaW50ayAoS0VSTl9OT1RJQ0UgImlvY3RsKCk6IHVwIGJpZ2xvY2tcbiIpKTsKKwl1cCgmYy0+Zm1jLT5iaWdsb2NrKTsKKwlyZXR1cm4gcmV0OworfSAvKiBqZmZzX2lvY3RsKCkgICovCisKKworc3RhdGljIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgamZmc19hZGRyZXNzX29wZXJhdGlvbnMgPSB7CisJLnJlYWRwYWdlCT0gamZmc19yZWFkcGFnZSwKKwkucHJlcGFyZV93cml0ZQk9IGpmZnNfcHJlcGFyZV93cml0ZSwKKwkuY29tbWl0X3dyaXRlCT0gamZmc19jb21taXRfd3JpdGUsCit9OworCitzdGF0aWMgaW50IGpmZnNfZnN5bmMoc3RydWN0IGZpbGUgKmYsIHN0cnVjdCBkZW50cnkgKmQsIGludCBkYXRhc3luYykKK3sKKwkvKiBXZSBjdXJyZW50bHkgaGF2ZSBPX1NZTkMgb3BlcmF0aW9ucyBhdCBhbGwgdGltZXMuCisJICAgRG8gbm90aGluZy4KKwkqLworCXJldHVybiAwOworfQorCisKK2V4dGVybiBpbnQgZ2VuZXJpY19maWxlX29wZW4oc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopIF9fYXR0cmlidXRlX18oKHdlYWspKTsKK2V4dGVybiBsb2ZmX3QgZ2VuZXJpY19maWxlX2xsc2VlayhzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QsIGludCkgX19hdHRyaWJ1dGVfXygod2VhaykpOworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBqZmZzX2ZpbGVfb3BlcmF0aW9ucyA9Cit7CisJLm9wZW4JCT0gZ2VuZXJpY19maWxlX29wZW4sCisJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAorCS5yZWFkCQk9IGdlbmVyaWNfZmlsZV9yZWFkLAorCS53cml0ZQkJPSBnZW5lcmljX2ZpbGVfd3JpdGUsCisJLmlvY3RsCQk9IGpmZnNfaW9jdGwsCisJLm1tYXAJCT0gZ2VuZXJpY19maWxlX3JlYWRvbmx5X21tYXAsCisJLmZzeW5jCQk9IGpmZnNfZnN5bmMsCisJLnNlbmRmaWxlCT0gZ2VuZXJpY19maWxlX3NlbmRmaWxlLAorfTsKKworCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgamZmc19maWxlX2lub2RlX29wZXJhdGlvbnMgPQoreworCS5sb29rdXAJCT0gamZmc19sb29rdXAsICAgICAgICAgIC8qIGxvb2t1cCAqLworCS5zZXRhdHRyCT0gamZmc19zZXRhdHRyLAorfTsKKworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBqZmZzX2Rpcl9vcGVyYXRpb25zID0KK3sKKwkucmVhZGRpcgk9IGpmZnNfcmVhZGRpciwKK307CisKKworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGpmZnNfZGlyX2lub2RlX29wZXJhdGlvbnMgPQoreworCS5jcmVhdGUJCT0gamZmc19jcmVhdGUsCisJLmxvb2t1cAkJPSBqZmZzX2xvb2t1cCwKKwkudW5saW5rCQk9IGpmZnNfdW5saW5rLAorCS5zeW1saW5rCT0gamZmc19zeW1saW5rLAorCS5ta2RpcgkJPSBqZmZzX21rZGlyLAorCS5ybWRpcgkJPSBqZmZzX3JtZGlyLAorCS5ta25vZAkJPSBqZmZzX21rbm9kLAorCS5yZW5hbWUJCT0gamZmc19yZW5hbWUsCisJLnNldGF0dHIJPSBqZmZzX3NldGF0dHIsCit9OworCisKKy8qIEluaXRpYWxpemUgYW4gaW5vZGUgZm9yIHRoZSBWRlMuICAqLworc3RhdGljIHZvaWQKK2pmZnNfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBqZmZzX2ZpbGUgKmY7CisJc3RydWN0IGpmZnNfY29udHJvbCAqYzsKKworCUQzKHByaW50aygiamZmc19yZWFkX2lub2RlKCk6IGlub2RlLT5pX2lubyA9PSAlbHVcbiIsIGlub2RlLT5pX2lubykpOworCisJaWYgKCFpbm9kZS0+aV9zYikgeworCQlEKHByaW50aygiamZmc19yZWFkX2lub2RlKCk6ICFpbm9kZS0+aV9zYiA9PT4gIgorCQkJICJObyBzdXBlciBibG9jayFcbiIpKTsKKwkJcmV0dXJuOworCX0KKwljID0gKHN0cnVjdCBqZmZzX2NvbnRyb2wgKilpbm9kZS0+aV9zYi0+c19mc19pbmZvOworCUQzKHByaW50ayAoS0VSTl9OT1RJQ0UgInJlYWRfaW5vZGUoKTogZG93biBiaWdsb2NrXG4iKSk7CisJZG93bigmYy0+Zm1jLT5iaWdsb2NrKTsKKwlpZiAoIShmID0gamZmc19maW5kX2ZpbGUoYywgaW5vZGUtPmlfaW5vKSkpIHsKKwkJRChwcmludGsoImpmZnNfcmVhZF9pbm9kZSgpOiBObyBzdWNoIGlub2RlICglbHUpLlxuIiwKKwkJCSBpbm9kZS0+aV9pbm8pKTsKKwkJRDMocHJpbnRrIChLRVJOX05PVElDRSAicmVhZF9pbm9kZSgpOiB1cCBiaWdsb2NrXG4iKSk7CisJCXVwKCZjLT5mbWMtPmJpZ2xvY2spOworCQlyZXR1cm47CisJfQorCWlub2RlLT51LmdlbmVyaWNfaXAgPSAodm9pZCAqKWY7CisJaW5vZGUtPmlfbW9kZSA9IGYtPm1vZGU7CisJaW5vZGUtPmlfbmxpbmsgPSBmLT5ubGluazsKKwlpbm9kZS0+aV91aWQgPSBmLT51aWQ7CisJaW5vZGUtPmlfZ2lkID0gZi0+Z2lkOworCWlub2RlLT5pX3NpemUgPSBmLT5zaXplOworCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IGYtPmF0aW1lOworCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IGYtPm10aW1lOworCWlub2RlLT5pX2N0aW1lLnR2X3NlYyA9IGYtPmN0aW1lOworCWlub2RlLT5pX2F0aW1lLnR2X25zZWMgPSAKKwlpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gCisJaW5vZGUtPmlfY3RpbWUudHZfbnNlYyA9IDA7CisKKwlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9TSVpFOworCWlub2RlLT5pX2Jsb2NrcyA9IChpbm9kZS0+aV9zaXplICsgNTExKSA+PiA5OworCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisJCWlub2RlLT5pX29wID0gJmpmZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9mb3AgPSAmamZmc19maWxlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmpmZnNfYWRkcmVzc19vcGVyYXRpb25zOworCX0KKwllbHNlIGlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCWlub2RlLT5pX29wID0gJmpmZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZqZmZzX2Rpcl9vcGVyYXRpb25zOworCX0KKwllbHNlIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKSB7CisJCWlub2RlLT5pX29wID0gJnBhZ2Vfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZqZmZzX2FkZHJlc3Nfb3BlcmF0aW9uczsKKwl9CisJZWxzZSB7CisJCS8qIElmIHRoZSBub2RlIGlzIGEgZGV2aWNlIG9mIHNvbWUgc29ydCwgdGhlbiB0aGUgbnVtYmVyIG9mCisJCSAgIHRoZSBkZXZpY2Ugc2hvdWxkIGJlIHJlYWQgZnJvbSB0aGUgZmxhc2ggbWVtb3J5IGFuZCB0aGVuCisJCSAgIGFkZGVkIHRvIHRoZSBpbm9kZSdzIGlfcmRldiBtZW1iZXIuICAqLworCQl1MTYgdmFsOworCQlqZmZzX3JlYWRfZGF0YShmLCAoY2hhciAqKSZ2YWwsIDAsIDIpOworCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsCisJCQlvbGRfZGVjb2RlX2Rldih2YWwpKTsKKwl9CisKKwlEMyhwcmludGsgKEtFUk5fTk9USUNFICJyZWFkX2lub2RlKCk6IHVwIGJpZ2xvY2tcbiIpKTsKKwl1cCgmYy0+Zm1jLT5iaWdsb2NrKTsKK30KKworCitzdGF0aWMgdm9pZAoramZmc19kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgamZmc19maWxlICpmOworCXN0cnVjdCBqZmZzX2NvbnRyb2wgKmM7CisJRDMocHJpbnRrKCJqZmZzX2RlbGV0ZV9pbm9kZSgpOiBpbm9kZS0+aV9pbm8gPT0gJWx1XG4iLAorCQkgIGlub2RlLT5pX2lubykpOworCisJbG9ja19rZXJuZWwoKTsKKwlpbm9kZS0+aV9zaXplID0gMDsKKwlpbm9kZS0+aV9ibG9ja3MgPSAwOworCWlub2RlLT51LmdlbmVyaWNfaXAgPSBOVUxMOworCWNsZWFyX2lub2RlKGlub2RlKTsKKwlpZiAoaW5vZGUtPmlfbmxpbmsgPT0gMCkgeworCQljID0gKHN0cnVjdCBqZmZzX2NvbnRyb2wgKikgaW5vZGUtPmlfc2ItPnNfZnNfaW5mbzsKKwkJZiA9IChzdHJ1Y3QgamZmc19maWxlICopIGpmZnNfZmluZF9maWxlIChjLCBpbm9kZS0+aV9pbm8pOworCQlqZmZzX3Bvc3NpYmx5X2RlbGV0ZV9maWxlKGYpOworCX0KKworCXVubG9ja19rZXJuZWwoKTsKK30KKworCitzdGF0aWMgdm9pZAoramZmc193cml0ZV9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBqZmZzX2NvbnRyb2wgKmMgPSAoc3RydWN0IGpmZnNfY29udHJvbCAqKXNiLT5zX2ZzX2luZm87CisJbG9ja19rZXJuZWwoKTsKKwlqZmZzX2dhcmJhZ2VfY29sbGVjdF90cmlnZ2VyKGMpOworCXVubG9ja19rZXJuZWwoKTsKK30KKworc3RhdGljIGludCBqZmZzX3JlbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50ICpmbGFncywgY2hhciAqZGF0YSkKK3sKKwkqZmxhZ3MgfD0gTVNfTk9ESVJBVElNRTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGpmZnNfb3BzID0KK3sKKwkucmVhZF9pbm9kZQk9IGpmZnNfcmVhZF9pbm9kZSwKKwkuZGVsZXRlX2lub2RlIAk9IGpmZnNfZGVsZXRlX2lub2RlLAorCS5wdXRfc3VwZXIJPSBqZmZzX3B1dF9zdXBlciwKKwkud3JpdGVfc3VwZXIJPSBqZmZzX3dyaXRlX3N1cGVyLAorCS5zdGF0ZnMJCT0gamZmc19zdGF0ZnMsCisJLnJlbW91bnRfZnMJPSBqZmZzX3JlbW91bnQsCit9OworCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpqZmZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoreworCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIGpmZnNfZmlsbF9zdXBlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBqZmZzX2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJqZmZzIiwKKwkuZ2V0X3NiCQk9IGpmZnNfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9ibG9ja19zdXBlciwKKwkuZnNfZmxhZ3MJPSBGU19SRVFVSVJFU19ERVYsCit9OworCitzdGF0aWMgaW50IF9faW5pdAoraW5pdF9qZmZzX2ZzKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiSkZGUyB2ZXJzaW9uICIgSkZGU19WRVJTSU9OX1NUUklORworCQkiLCAoQykgMTk5OSwgMjAwMCAgQXhpcyBDb21tdW5pY2F0aW9ucyBBQlxuIik7CisJCisjaWZkZWYgQ09ORklHX0pGRlNfUFJPQ19GUworCWpmZnNfcHJvY19yb290ID0gcHJvY19ta2RpcigiamZmcyIsIHByb2Nfcm9vdF9mcyk7CisJaWYgKCFqZmZzX3Byb2Nfcm9vdCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJjYW5ub3QgY3JlYXRlIC9wcm9jL2pmZnMgZW50cnlcbiIpOworCX0KKyNlbmRpZgorCWZtX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImpmZnNfZm0iLCBzaXplb2Yoc3RydWN0IGpmZnNfZm0pLAorCQkJCSAgICAgMCwgU0xBQl9IV0NBQ0hFX0FMSUdOfFNMQUJfUkVDTEFJTV9BQ0NPVU5ULCAKKwkJCQkgICAgIE5VTEwsIE5VTEwpOworCWlmICghZm1fY2FjaGUpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJbm9kZV9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJqZmZzX25vZGUiLHNpemVvZihzdHJ1Y3QgamZmc19ub2RlKSwKKwkJCQkgICAgICAgMCwgU0xBQl9IV0NBQ0hFX0FMSUdOfFNMQUJfUkVDTEFJTV9BQ0NPVU5ULCAKKwkJCQkgICAgICAgTlVMTCwgTlVMTCk7CisJaWYgKCFub2RlX2NhY2hlKSB7CisJCWttZW1fY2FjaGVfZGVzdHJveShmbV9jYWNoZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiByZWdpc3Rlcl9maWxlc3lzdGVtKCZqZmZzX2ZzX3R5cGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2V4aXRfamZmc19mcyh2b2lkKQoreworCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmamZmc19mc190eXBlKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koZm1fY2FjaGUpOworCWttZW1fY2FjaGVfZGVzdHJveShub2RlX2NhY2hlKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9qZmZzX2ZzKQorbW9kdWxlX2V4aXQoZXhpdF9qZmZzX2ZzKQorCitNT0RVTEVfREVTQ1JJUFRJT04oIlRoZSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSIpOworTU9EVUxFX0FVVEhPUigiQXhpcyBDb21tdW5pY2F0aW9ucyBBQi4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL2pmZnMvaW50cmVwLmMgYi9mcy9qZmZzL2ludHJlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYzY4OTMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZmZzL2ludHJlcC5jCkBAIC0wLDAgKzEsMzQ1NyBAQAorLyoKKyAqIEpGRlMgLS0gSm91cm5hbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgTGludXggaW1wbGVtZW50YXRpb24uCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwICBBeGlzIENvbW11bmljYXRpb25zLCBJbmMuCisgKgorICogQ3JlYXRlZCBieSBGaW5uIEhha2Fuc3NvbiA8ZmlubkBheGlzLmNvbT4uCisgKgorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogJElkOiBpbnRyZXAuYyx2IDEuMTAyIDIwMDEvMDkvMjMgMjM6Mjg6MzYgZHdtdzIgRXhwICQKKyAqCisgKiBQb3J0ZWQgdG8gTGludXggMi4zLnggYW5kIE1URDoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAgQWxleGFuZGVyIExhcnNzb24gKGFsZXhAY2VuZGlvLnNlKSwgQ2VuZGlvIFN5c3RlbXMgQUIKKyAqCisgKi8KKworLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb2RlIGZvciB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIG9mIHRoZQorICAgSm91cm5hbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgSkZGUy4gICovCisKKy8qCisgKiBUb2RvIGxpc3Q6CisgKgorICogbWVtY3B5X3RvX2ZsYXNoKCkgYW5kIG1lbWNweV9mcm9tX2ZsYXNoKCkgZnVuY3Rpb25zLgorICoKKyAqIEltcGxlbWVudGF0aW9uIG9mIGhhcmQgbGlua3MuCisgKgorICogT3JnYW5pemUgdGhlIHNvdXJjZSBjb2RlIGluIGEgYmV0dGVyIHdheS4gQWdhaW5zdCB0aGUgVkZTIHdlIGNvdWxkCisgKiBoYXZlIGpmZnNfZXh0LmMsIGFuZCBhZ2FpbnN0IHRoZSBibG9jayBkZXZpY2UgamZmc19pbnQuYy4KKyAqIEEgYmV0dGVyIGZpbGUtaW50ZXJuYWwgb3JnYW5pemF0aW9uIHRvby4KKyAqCisgKiBBIGJldHRlciBjaGVja3N1bSBhbGdvcml0aG0uCisgKgorICogQ29uc2lkZXIgZW5kaWFubmVzcyBzdHVmZi4gbnRvaGwoKSBldGMuCisgKgorICogQXJlIHdlIGhhbmRsaW5nIHRoZSBhdGltZSwgbXRpbWUsIGN0aW1lIG1lbWJlcnMgb2YgdGhlIGlub2RlIHJpZ2h0PworICoKKyAqIFJlbW92ZSBzb21lIGR1cGxpY2F0ZWQgY29kZS4gVGFrZSBhIGxvb2sgYXQgamZmc193cml0ZV9ub2RlKCkgYW5kCisgKiBqZmZzX3Jld3JpdGVfZGF0YSgpIGZvciBpbnN0YW5jZS4KKyAqCisgKiBJbXBsZW1lbnQgbW9yZSBtZWFuaW5nIG9mIHRoZSBubGluayBtZW1iZXIgaW4gdmFyaW91cyBkYXRhIHN0cnVjdHVyZXMuCisgKiBubGluayBjb3VsZCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggaGFyZCBsaW5rcyBmb3IgaW5zdGFuY2UuCisgKgorICogQmV0dGVyIG1lbW9yeSBtYW5hZ2VtZW50LiBBbGxvY2F0ZSBkYXRhIHN0cnVjdHVyZXMgaW4gbGFyZ2VyIGNodW5rcworICogaWYgcG9zc2libGUuCisgKgorICogSWYgdG9vIG11Y2ggbWV0YSBkYXRhIGlzIHN0b3JlZCwgYSBnYXJiYWdlIGNvbGxlY3Qgc2hvdWxkIGJlIGlzc3VlZC4KKyAqIFdlIGhhdmUgZXhwZXJpZW5jZWQgcHJvYmxlbXMgd2l0aCB0b28gbXVjaCBtZXRhIGRhdGEgd2l0aCBmb3IgaW5zdGFuY2UKKyAqIGxvZyBmaWxlcy4KKyAqCisgKiBJbXByb3ZlIHRoZSBjYWxscyB0byBqZmZzX2lvY3RsKCkuIFdlIHdvdWxkIGxpa2UgdG8gcmV0cmlldmUgbW9yZQorICogaW5mb3JtYXRpb24gdG8gYmUgYWJsZSB0byBkZWJ1ZyAob3IgdG8gc3VwZXJ2aXNlKSBKRkZTIGR1cmluZyBydW4tdGltZS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2pmZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorCisjaW5jbHVkZSAiaW50cmVwLmgiCisjaW5jbHVkZSAiamZmc19mbS5oIgorCitsb25nIG5vX2pmZnNfbm9kZSA9IDA7CitzdGF0aWMgbG9uZyBub19qZmZzX2ZpbGUgPSAwOworI2lmIGRlZmluZWQoSkZGU19NRU1PUllfREVCVUcpICYmIEpGRlNfTUVNT1JZX0RFQlVHCitsb25nIG5vX2pmZnNfY29udHJvbCA9IDA7Citsb25nIG5vX2pmZnNfcmF3X2lub2RlID0gMDsKK2xvbmcgbm9famZmc19ub2RlX3JlZiA9IDA7Citsb25nIG5vX2pmZnNfZm0gPSAwOworbG9uZyBub19qZmZzX2ZtY29udHJvbCA9IDA7Citsb25nIG5vX2hhc2ggPSAwOworbG9uZyBub19uYW1lID0gMDsKKyNlbmRpZgorCitzdGF0aWMgaW50IGpmZnNfc2Nhbl9mbGFzaChzdHJ1Y3QgamZmc19jb250cm9sICpjKTsKK3N0YXRpYyBpbnQgamZmc191cGRhdGVfZmlsZShzdHJ1Y3QgamZmc19maWxlICpmLCBzdHJ1Y3QgamZmc19ub2RlICpub2RlKTsKK3N0YXRpYyBpbnQgamZmc19idWlsZF9maWxlKHN0cnVjdCBqZmZzX2ZpbGUgKmYpOworc3RhdGljIGludCBqZmZzX2ZyZWVfZmlsZShzdHJ1Y3QgamZmc19maWxlICpmKTsKK3N0YXRpYyBpbnQgamZmc19mcmVlX25vZGVfbGlzdChzdHJ1Y3QgamZmc19maWxlICpmKTsKK3N0YXRpYyBpbnQgamZmc19nYXJiYWdlX2NvbGxlY3Rfbm93KHN0cnVjdCBqZmZzX2NvbnRyb2wgKmMpOworc3RhdGljIGludCBqZmZzX2luc2VydF9maWxlX2ludG9faGFzaChzdHJ1Y3QgamZmc19maWxlICpmKTsKK3N0YXRpYyBpbnQgamZmc19yZW1vdmVfcmVkdW5kYW50X25vZGVzKHN0cnVjdCBqZmZzX2ZpbGUgKmYpOworCisvKiBJcyB0aGVyZSBlbm91Z2ggc3BhY2Ugb24gdGhlIGZsYXNoPyAgKi8KK3N0YXRpYyBpbmxpbmUgaW50IEpGRlNfRU5PVUdIX1NQQUNFKHN0cnVjdCBqZmZzX2NvbnRyb2wgKmMsIF9fdTMyIHNwYWNlKQoreworCXN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jID0gYy0+Zm1jOworCisJd2hpbGUgKDEpIHsKKwkJaWYgKChmbWMtPmZsYXNoX3NpemUgLSAoZm1jLT51c2VkX3NpemUgKyBmbWMtPmRpcnR5X3NpemUpKQorCQkJPj0gZm1jLT5taW5fZnJlZV9zaXplICsgc3BhY2UpIHsKKwkJCXJldHVybiAxOworCQl9CisJCWlmIChmbWMtPmRpcnR5X3NpemUgPCBmbWMtPnNlY3Rvcl9zaXplKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKGpmZnNfZ2FyYmFnZV9jb2xsZWN0X25vdyhjKSkgeworCQkgIEQxKHByaW50aygiSkZGU19FTk9VR0hfU1BBQ0U6IGpmZnNfZ2FyYmFnZV9jb2xsZWN0X25vdygpIGZhaWxlZC5cbiIpKTsKKwkJICByZXR1cm4gMDsKKwkJfQorCX0KK30KKworI2lmIENPTkZJR19KRkZTX0ZTX1ZFUkJPU0UgPiAwCitzdGF0aWMgX191OAorZmxhc2hfcmVhZF91OChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20pCit7CisJc2l6ZV90IHJldGxlbjsKKwlfX3U4IHJldDsKKwlpbnQgcmVzOworCisJcmVzID0gTVREX1JFQUQobXRkLCBmcm9tLCAxLCAmcmV0bGVuLCAmcmV0KTsKKwlpZiAocmV0bGVuICE9IDEpIHsKKwkJcHJpbnRrKCJEaWRuJ3QgcmVhZCBhIGJ5dGUgaW4gZmxhc2hfcmVhZF91OCgpLiBSZXR1cm5lZCAlZFxuIiwgcmVzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2pmZnNfaGV4ZHVtcChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IHBvcywgaW50IHNpemUpCit7CisJY2hhciBsaW5lWzE2XTsKKwlpbnQgaiA9IDA7CisKKwl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJaW50IGk7CisKKwkJcHJpbnRrKCIlbGQ6IiwgKGxvbmcpIHBvcyk7CisJCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKSB7CisJCQlsaW5lW2pdID0gZmxhc2hfcmVhZF91OChtdGQsIHBvcysrKTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSB7CisJCQlpZiAoIShpICYgMSkpIHsKKwkJCQlwcmludGsoIiAlLjJ4IiwgbGluZVtpXSAmIDB4ZmYpOworCQkJfQorCQkJZWxzZSB7CisJCQkJcHJpbnRrKCIlLjJ4IiwgbGluZVtpXSAmIDB4ZmYpOworCQkJfQorCQl9CisKKwkJLyogUHJpbnQgZW1wdHkgc3BhY2UgKi8KKwkJZm9yICg7IGkgPCAxNjsgaSsrKSB7CisJCQlpZiAoIShpICYgMSkpIHsKKwkJCQlwcmludGsoIiAgICIpOworCQkJfQorCQkJZWxzZSB7CisJCQkJcHJpbnRrKCIgICIpOworCQkJfQorCQl9CisJCXByaW50aygiICAiKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSB7CisJCQlpZiAoaXNncmFwaChsaW5lW2ldKSkgeworCQkJCXByaW50aygiJWMiLCBsaW5lW2ldKTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCXByaW50aygiLiIpOworCQkJfQorCQl9CisJCXByaW50aygiXG4iKTsKKwkJc2l6ZSAtPSAxNjsKKwl9Cit9CisKKyNlbmRpZgorCisjZGVmaW5lIGZsYXNoX3NhZmVfYWNxdWlyZShhcmcpCisjZGVmaW5lIGZsYXNoX3NhZmVfcmVsZWFzZShhcmcpCisKKworc3RhdGljIGludAorZmxhc2hfc2FmZV9yZWFkKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3QgZnJvbSwKKwkJdV9jaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzaXplX3QgcmV0bGVuOworCWludCByZXM7CisKKwlEMyhwcmludGsoS0VSTl9OT1RJQ0UgImZsYXNoX3NhZmVfcmVhZCglcCwgJTA4eCwgJXAsICUwOHgpXG4iLAorCQkgIG10ZCwgKHVuc2lnbmVkIGludCkgZnJvbSwgYnVmLCBjb3VudCkpOworCisJcmVzID0gTVREX1JFQUQobXRkLCBmcm9tLCBjb3VudCwgJnJldGxlbiwgYnVmKTsKKwlpZiAocmV0bGVuICE9IGNvdW50KSB7CisJCXBhbmljKCJEaWRuJ3QgcmVhZCBhbGwgYnl0ZXMgaW4gZmxhc2hfc2FmZV9yZWFkKCkuIFJldHVybmVkICVkXG4iLCByZXMpOworCX0KKwlyZXR1cm4gcmVzP3JlczpyZXRsZW47Cit9CisKKworc3RhdGljIF9fdTMyCitmbGFzaF9yZWFkX3UzMihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IGZyb20pCit7CisJc2l6ZV90IHJldGxlbjsKKwlfX3UzMiByZXQ7CisJaW50IHJlczsKKworCXJlcyA9IE1URF9SRUFEKG10ZCwgZnJvbSwgNCwgJnJldGxlbiwgKHVuc2lnbmVkIGNoYXIgKikmcmV0KTsKKwlpZiAocmV0bGVuICE9IDQpIHsKKwkJcHJpbnRrKCJEaWRuJ3QgcmVhZCBhbGwgYnl0ZXMgaW4gZmxhc2hfcmVhZF91MzIoKS4gUmV0dXJuZWQgJWRcbiIsIHJlcyk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludAorZmxhc2hfc2FmZV93cml0ZShzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IHRvLAorCQkgY29uc3QgdV9jaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzaXplX3QgcmV0bGVuOworCWludCByZXM7CisKKwlEMyhwcmludGsoS0VSTl9OT1RJQ0UgImZsYXNoX3NhZmVfd3JpdGUoJXAsICUwOHgsICVwLCAlMDh4KVxuIiwKKwkJICBtdGQsICh1bnNpZ25lZCBpbnQpIHRvLCBidWYsIGNvdW50KSk7CisKKwlyZXMgPSBNVERfV1JJVEUobXRkLCB0bywgY291bnQsICZyZXRsZW4sIGJ1Zik7CisJaWYgKHJldGxlbiAhPSBjb3VudCkgeworCQlwcmludGsoIkRpZG4ndCB3cml0ZSBhbGwgYnl0ZXMgaW4gZmxhc2hfc2FmZV93cml0ZSgpLiBSZXR1cm5lZCAlZFxuIiwgcmVzKTsKKwl9CisJcmV0dXJuIHJlcz9yZXM6cmV0bGVuOworfQorCisKK3N0YXRpYyBpbnQKK2ZsYXNoX3NhZmVfd3JpdGV2KHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBjb25zdCBzdHJ1Y3Qga3ZlYyAqdmVjcywKKwkJCXVuc2lnbmVkIGxvbmcgaW92ZWNfY250LCBsb2ZmX3QgdG8pCit7CisJc2l6ZV90IHJldGxlbiwgcmV0bGVuX2E7CisJaW50IGk7CisJaW50IHJlczsKKworCUQzKHByaW50ayhLRVJOX05PVElDRSAiZmxhc2hfc2FmZV93cml0ZXYoJXAsICUwOHgsICVwKVxuIiwKKwkJICBtdGQsICh1bnNpZ25lZCBpbnQpIHRvLCB2ZWNzKSk7CisJCisJaWYgKG10ZC0+d3JpdGV2KSB7CisJCXJlcyA9IE1URF9XUklURVYobXRkLCB2ZWNzLCBpb3ZlY19jbnQsIHRvLCAmcmV0bGVuKTsKKwkJcmV0dXJuIHJlcyA/IHJlcyA6IHJldGxlbjsKKwl9CisJLyogTm90IGltcGxlbWVudGVkIHdyaXRldi4gUmVwZWF0ZWRseSB1c2Ugd3JpdGUgLSBvbiB0aGUgbm90IHNvCisJICAgdW5yZWFzb25hYmxlIGFzc3VtcHRpb24gdGhhdCB0aGUgbXRkIGRyaXZlciBkb2Vzbid0IGNhcmUgaG93CisJICAgbWFueSB3cml0ZSBjeWNsZXMgd2UgdXNlLiAqLworCXJlcz0wOworCXJldGxlbj0wOworCisJZm9yIChpPTA7ICFyZXMgJiYgaTxpb3ZlY19jbnQ7IGkrKykgeworCQlyZXMgPSBNVERfV1JJVEUobXRkLCB0bywgdmVjc1tpXS5pb3ZfbGVuLCAmcmV0bGVuX2EsIHZlY3NbaV0uaW92X2Jhc2UpOworCQlpZiAocmV0bGVuX2EgIT0gdmVjc1tpXS5pb3ZfbGVuKSB7CisJCQlwcmludGsoIkRpZG4ndCB3cml0ZSBhbGwgYnl0ZXMgaW4gZmxhc2hfc2FmZV93cml0ZXYoKS4gUmV0dXJuZWQgJWRcbiIsIHJlcyk7CisJCQlpZiAoaSAhPSBpb3ZlY19jbnQtMSkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQkvKiBJZiByZXMgaXMgbm9uLXplcm8sIHJldGxlbl9hIGlzIHVuZGVmaW5lZCwgYnV0IHdlIGRvbid0CisJCSAgIGNhcmUgYmVjYXVzZSBpbiB0aGF0IGNhc2UgaXQncyBub3QgZ29pbmcgdG8gYmUgCisJCSAgIHJldHVybmVkIGFueXdheS4KKwkJKi8KKwkJdG8gKz0gcmV0bGVuX2E7CisJCXJldGxlbiArPSByZXRsZW5fYTsKKwl9CisJcmV0dXJuIHJlcz9yZXM6cmV0bGVuOworfQorCisKK3N0YXRpYyBpbnQKK2ZsYXNoX21lbXNldChzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgbG9mZl90IHRvLAorCSAgICAgY29uc3QgdV9jaGFyIGMsIHNpemVfdCBzaXplKQoreworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHBhdHRlcm5bNjRdOworCWludCBpOworCisJLyogZmlsbCB1cCBwYXR0ZXJuICovCisKKwlmb3IoaSA9IDA7IGkgPCA2NDsgaSsrKQorCQlwYXR0ZXJuW2ldID0gYzsKKworCS8qIHdyaXRlIGFzIG1hbnkgNjQtYnl0ZSBjaHVua3MgYXMgd2UgY2FuICovCisKKwl3aGlsZSAoc2l6ZSA+PSA2NCkgeworCQlmbGFzaF9zYWZlX3dyaXRlKG10ZCwgdG8sIHBhdHRlcm4sIDY0KTsKKwkJc2l6ZSAtPSA2NDsKKwkJdG8gKz0gNjQ7CisJfQorCisJLyogYW5kIHRoZSByZXN0ICovCisKKwlpZihzaXplKQorCQlmbGFzaF9zYWZlX3dyaXRlKG10ZCwgdG8sIHBhdHRlcm4sIHNpemUpOworCisJcmV0dXJuIHNpemU7Cit9CisKKworc3RhdGljIHZvaWQKK2ludHJlcF9lcmFzZV9jYWxsYmFjayhzdHJ1Y3QgZXJhc2VfaW5mbyAqZG9uZSkKK3sKKwl3YWl0X3F1ZXVlX2hlYWRfdCAqd2FpdF9xOworCisJd2FpdF9xID0gKHdhaXRfcXVldWVfaGVhZF90ICopZG9uZS0+cHJpdjsKKworCXdha2VfdXAod2FpdF9xKTsKK30KKworCitzdGF0aWMgaW50CitmbGFzaF9lcmFzZV9yZWdpb24oc3RydWN0IG10ZF9pbmZvICptdGQsIGxvZmZfdCBzdGFydCwKKwkJICAgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGVyYXNlX2luZm8gKmVyYXNlOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfcTsKKworCWVyYXNlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGVyYXNlX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVyYXNlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJndhaXRfcSk7CisKKwllcmFzZS0+bXRkID0gbXRkOworCWVyYXNlLT5jYWxsYmFjayA9IGludHJlcF9lcmFzZV9jYWxsYmFjazsKKwllcmFzZS0+YWRkciA9IHN0YXJ0OworCWVyYXNlLT5sZW4gPSBzaXplOworCWVyYXNlLT5wcml2ID0gKHVfbG9uZykmd2FpdF9xOworCisJLyogRklYTUU6IFVzZSBUQVNLX0lOVEVSUlVQVElCTEUgYW5kIGRlYWwgd2l0aCBiZWluZyBpbnRlcnJ1cHRlZCAqLworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwlhZGRfd2FpdF9xdWV1ZSgmd2FpdF9xLCAmd2FpdCk7CisKKwlpZiAoTVREX0VSQVNFKG10ZCwgZXJhc2UpIDwgMCkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQlyZW1vdmVfd2FpdF9xdWV1ZSgmd2FpdF9xLCAmd2FpdCk7CisJCWtmcmVlKGVyYXNlKTsKKworCQlwcmludGsoS0VSTl9XQVJOSU5HICJmbGFzaDogZXJhc2Ugb2YgcmVnaW9uIFsweCVseCwgMHglbHhdICIKKwkJICAgICAgICJ0b3RhbGx5IGZhaWxlZFxuIiwgKGxvbmcpc3RhcnQsIChsb25nKXN0YXJ0ICsgc2l6ZSk7CisKKwkJcmV0dXJuIC0xOworCX0KKworCXNjaGVkdWxlKCk7IC8qIFdhaXQgZm9yIGZsYXNoIHRvIGZpbmlzaC4gKi8KKwlyZW1vdmVfd2FpdF9xdWV1ZSgmd2FpdF9xLCAmd2FpdCk7CisKKwlrZnJlZShlcmFzZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogVGhpcyByb3V0aW5lIGNhbGN1bGF0ZXMgY2hlY2tzdW1zIGluIEpGRlMuICAqLworc3RhdGljIF9fdTMyCitqZmZzX2NoZWNrc3VtKGNvbnN0IHZvaWQgKmRhdGEsIGludCBzaXplKQoreworCV9fdTMyIHN1bSA9IDA7CisJX191OCAqcHRyID0gKF9fdTggKilkYXRhOworCXdoaWxlIChzaXplLS0gPiAwKSB7CisJCXN1bSArPSAqcHRyKys7CisJfQorCUQzKHByaW50aygiLCByZXN1bHQ6IDB4JTA4eFxuIiwgc3VtKSk7CisJcmV0dXJuIHN1bTsKK30KKworCitzdGF0aWMgaW50CitqZmZzX2NoZWNrc3VtX2ZsYXNoKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBsb2ZmX3Qgc3RhcnQsIGludCBzaXplLCBfX3UzMiAqcmVzdWx0KQoreworCV9fdTMyIHN1bSA9IDA7CisJbG9mZl90IHB0ciA9IHN0YXJ0OworCV9fdTggKnJlYWRfYnVmOworCWludCBpLCBsZW5ndGg7CisKKwkvKiBBbGxvY2F0ZSByZWFkIGJ1ZmZlciAqLworCXJlYWRfYnVmID0gKF9fdTggKikga21hbGxvYyAoc2l6ZW9mKF9fdTgpICogNDA5NiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZWFkX2J1ZikgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgImttYWxsb2MgZmFpbGVkIGluIGpmZnNfY2hlY2tzdW1fZmxhc2goKVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkvKiBMb29wIHVudGlsIGNoZWNrc3VtIGRvbmUgKi8KKwl3aGlsZSAoc2l6ZSkgeworCQkvKiBHZXQgYW1vdW50IG9mIGRhdGEgdG8gcmVhZCAqLworCQlpZiAoc2l6ZSA8IDQwOTYpCisJCQlsZW5ndGggPSBzaXplOworCQllbHNlCisJCQlsZW5ndGggPSA0MDk2OworCisJCS8qIFBlcmZvcm0gZmxhc2ggcmVhZCAqLworCQlEMyhwcmludGsoS0VSTl9OT1RJQ0UgImpmZnNfY2hlY2tzdW1fZmxhc2hcbiIpKTsKKwkJZmxhc2hfc2FmZV9yZWFkKG10ZCwgcHRyLCAmcmVhZF9idWZbMF0sIGxlbmd0aCk7CisKKwkJLyogQ29tcHV0ZSBjaGVja3N1bSAqLworCQlmb3IgKGk9MDsgaSA8IGxlbmd0aCA7IGkrKykKKwkJCXN1bSArPSByZWFkX2J1ZltpXTsKKworCQkvKiBVcGRhdGUgcG9pbnRlciBhbmQgc2l6ZSAqLworCQlzaXplIC09IGxlbmd0aDsKKwkJcHRyICs9IGxlbmd0aDsKKwl9CisKKwkvKiBGcmVlIHJlYWQgYnVmZmVyICovCisJa2ZyZWUgKHJlYWRfYnVmKTsKKworCS8qIFJldHVybiByZXN1bHQgKi8KKwlEMyhwcmludGsoImNoZWNrc3VtIHJlc3VsdDogMHglMDh4XG4iLCBzdW0pKTsKKwkqcmVzdWx0ID0gc3VtOworCXJldHVybiAwOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGpmZnNfZm1fd3JpdGVfbG9jayhzdHJ1Y3QgamZmc19mbWNvbnRyb2wgKmZtYykKK3sKKyAgLy8JZG93bigmZm1jLT53bG9jayk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgamZmc19mbV93cml0ZV91bmxvY2soc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMpCit7CisgIC8vCXVwKCZmbWMtPndsb2NrKTsKK30KKworCisvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgYSBuZXcgc3RydWN0IGpmZnNfZmlsZS4gICovCitzdGF0aWMgc3RydWN0IGpmZnNfZmlsZSAqCitqZmZzX2NyZWF0ZV9maWxlKHN0cnVjdCBqZmZzX2NvbnRyb2wgKmMsCisJCSBjb25zdCBzdHJ1Y3QgamZmc19yYXdfaW5vZGUgKnJhd19pbm9kZSkKK3sKKwlzdHJ1Y3QgamZmc19maWxlICpmOworCisJaWYgKCEoZiA9IChzdHJ1Y3QgamZmc19maWxlICopa21hbGxvYyhzaXplb2Yoc3RydWN0IGpmZnNfZmlsZSksCisJCQkJCSAgICAgIEdGUF9LRVJORUwpKSkgeworCQlEKHByaW50aygiamZmc19jcmVhdGVfZmlsZSgpOiBGYWlsZWQhXG4iKSk7CisJCXJldHVybiBOVUxMOworCX0KKwlub19qZmZzX2ZpbGUrKzsKKwltZW1zZXQoZiwgMCwgc2l6ZW9mKHN0cnVjdCBqZmZzX2ZpbGUpKTsKKwlmLT5pbm8gPSByYXdfaW5vZGUtPmlubzsKKwlmLT5waW5vID0gcmF3X2lub2RlLT5waW5vOworCWYtPm5saW5rID0gcmF3X2lub2RlLT5ubGluazsKKwlmLT5kZWxldGVkID0gcmF3X2lub2RlLT5kZWxldGVkOworCWYtPmMgPSBjOworCisJcmV0dXJuIGY7Cit9CisKKworLyogQnVpbGQgYSBjb250cm9sIGJsb2NrIGZvciB0aGUgZmlsZSBzeXN0ZW0uICAqLworc3RhdGljIHN0cnVjdCBqZmZzX2NvbnRyb2wgKgoramZmc19jcmVhdGVfY29udHJvbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBqZmZzX2NvbnRyb2wgKmM7CisJcmVnaXN0ZXIgaW50IHMgPSBzaXplb2Yoc3RydWN0IGpmZnNfY29udHJvbCk7CisJaW50IGk7CisJRChjaGFyICp0ID0gMCk7CisKKwlEMihwcmludGsoImpmZnNfY3JlYXRlX2NvbnRyb2woKVxuIikpOworCisJaWYgKCEoYyA9IChzdHJ1Y3QgamZmc19jb250cm9sICopa21hbGxvYyhzLCBHRlBfS0VSTkVMKSkpIHsKKwkJZ290byBmYWlsX2NvbnRyb2w7CisJfQorCURKTShub19qZmZzX2NvbnRyb2wrKyk7CisJYy0+cm9vdCA9IE5VTEw7CisJYy0+Z2NfdGFzayA9IE5VTEw7CisJYy0+aGFzaF9sZW4gPSBKRkZTX0hBU0hfU0laRTsKKwlzID0gc2l6ZW9mKHN0cnVjdCBsaXN0X2hlYWQpICogYy0+aGFzaF9sZW47CisJaWYgKCEoYy0+aGFzaCA9IChzdHJ1Y3QgbGlzdF9oZWFkICopa21hbGxvYyhzLCBHRlBfS0VSTkVMKSkpIHsKKwkJZ290byBmYWlsX2hhc2g7CisJfQorCURKTShub19oYXNoKyspOworCWZvciAoaSA9IDA7IGkgPCBjLT5oYXNoX2xlbjsgaSsrKQorCQlJTklUX0xJU1RfSEVBRCgmYy0+aGFzaFtpXSk7CisJaWYgKCEoYy0+Zm1jID0gamZmc19idWlsZF9iZWdpbihjLCBNSU5PUihzYi0+c19kZXYpKSkpIHsKKwkJZ290byBmYWlsX2ZtaW5pdDsKKwl9CisJYy0+bmV4dF9pbm8gPSBKRkZTX01JTl9JTk8gKyAxOworCWMtPmRlbGV0ZV9saXN0ID0gKHN0cnVjdCBqZmZzX2RlbGV0ZV9saXN0ICopIDA7CisJcmV0dXJuIGM7CisKK2ZhaWxfZm1pbml0OgorCUQodCA9ICJjLT5mbWMiKTsKK2ZhaWxfaGFzaDoKKwlrZnJlZShjKTsKKwlESk0obm9famZmc19jb250cm9sLS0pOworCUQodCA9IHQgPyB0IDogImMtPmhhc2giKTsKK2ZhaWxfY29udHJvbDoKKwlEKHQgPSB0ID8gdCA6ICJjb250cm9sIik7CisJRChwcmludGsoImpmZnNfY3JlYXRlX2NvbnRyb2woKTogQWxsb2NhdGlvbiBmYWlsZWQ6ICglcylcbiIsIHQpKTsKKwlyZXR1cm4gKHN0cnVjdCBqZmZzX2NvbnRyb2wgKikwOworfQorCisKKy8qIENsZWFuIHVwIGFsbCBkYXRhIHN0cnVjdHVyZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWxlIHN5c3RlbS4gICovCit2b2lkCitqZmZzX2NsZWFudXBfY29udHJvbChzdHJ1Y3QgamZmc19jb250cm9sICpjKQoreworCUQyKHByaW50aygiamZmc19jbGVhbnVwX2NvbnRyb2woKVxuIikpOworCisJaWYgKCFjKSB7CisJCUQocHJpbnRrKCJqZmZzX2NsZWFudXBfY29udHJvbCgpOiBjID09IE5VTEwgISEhXG4iKSk7CisJCXJldHVybjsKKwl9CisKKwl3aGlsZSAoYy0+ZGVsZXRlX2xpc3QpIHsKKwkJc3RydWN0IGpmZnNfZGVsZXRlX2xpc3QgKmRlbGV0ZV9saXN0X2VsZW1lbnQ7CisJCWRlbGV0ZV9saXN0X2VsZW1lbnQgPSBjLT5kZWxldGVfbGlzdDsKKwkJYy0+ZGVsZXRlX2xpc3QgPSBjLT5kZWxldGVfbGlzdC0+bmV4dDsKKwkJa2ZyZWUoZGVsZXRlX2xpc3RfZWxlbWVudCk7CisJfQorCisJLyogRnJlZSBhbGwgZmlsZXMgYW5kIG5vZGVzLiAgKi8KKwlpZiAoYy0+aGFzaCkgeworCQlqZmZzX2ZvcmVhY2hfZmlsZShjLCBqZmZzX2ZyZWVfbm9kZV9saXN0KTsKKwkJamZmc19mb3JlYWNoX2ZpbGUoYywgamZmc19mcmVlX2ZpbGUpOworCQlrZnJlZShjLT5oYXNoKTsKKwkJREpNKG5vX2hhc2gtLSk7CisJfQorCWpmZnNfY2xlYW51cF9mbWNvbnRyb2woYy0+Zm1jKTsKKwlrZnJlZShjKTsKKwlESk0obm9famZmc19jb250cm9sLS0pOworCUQzKHByaW50aygiamZmc19jbGVhbnVwX2NvbnRyb2woKTogTGVhdmluZy4uLlxuIikpOworfQorCisKKy8qIFRoaXMgZnVuY3Rpb24gYWRkcyBhIHZpcnR1YWwgcm9vdCBub2RlIHRvIHRoZSBpbi1SQU0gcmVwcmVzZW50YXRpb24uCisgICBDYWxsZWQgYnkgamZmc19idWlsZF9mcygpLiAgKi8KK3N0YXRpYyBpbnQKK2pmZnNfYWRkX3ZpcnR1YWxfcm9vdChzdHJ1Y3QgamZmc19jb250cm9sICpjKQoreworCXN0cnVjdCBqZmZzX2ZpbGUgKnJvb3Q7CisJc3RydWN0IGpmZnNfbm9kZSAqbm9kZTsKKworCUQyKHByaW50aygiamZmc19hZGRfdmlydHVhbF9yb290KCk6ICIKKwkJICAiQ3JlYXRpbmcgYSB2aXJ0dWFsIHJvb3QgZGlyZWN0b3J5LlxuIikpOworCisJaWYgKCEocm9vdCA9IChzdHJ1Y3QgamZmc19maWxlICopa21hbGxvYyhzaXplb2Yoc3RydWN0IGpmZnNfZmlsZSksCisJCQkJCQkgR0ZQX0tFUk5FTCkpKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlub19qZmZzX2ZpbGUrKzsKKwlpZiAoIShub2RlID0gamZmc19hbGxvY19ub2RlKCkpKSB7CisJCWtmcmVlKHJvb3QpOworCQlub19qZmZzX2ZpbGUtLTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCURKTShub19qZmZzX25vZGUrKyk7CisJbWVtc2V0KG5vZGUsIDAsIHNpemVvZihzdHJ1Y3QgamZmc19ub2RlKSk7CisJbm9kZS0+aW5vID0gSkZGU19NSU5fSU5POworCW1lbXNldChyb290LCAwLCBzaXplb2Yoc3RydWN0IGpmZnNfZmlsZSkpOworCXJvb3QtPmlubyA9IEpGRlNfTUlOX0lOTzsKKwlyb290LT5tb2RlID0gU19JRkRJUiB8IFNfSVJXWFUgfCBTX0lSR1JQCisJCSAgICAgfCBTX0lYR1JQIHwgU19JUk9USCB8IFNfSVhPVEg7CisJcm9vdC0+YXRpbWUgPSByb290LT5tdGltZSA9IHJvb3QtPmN0aW1lID0gZ2V0X3NlY29uZHMoKTsKKwlyb290LT5ubGluayA9IDE7CisJcm9vdC0+YyA9IGM7CisJcm9vdC0+dmVyc2lvbl9oZWFkID0gcm9vdC0+dmVyc2lvbl90YWlsID0gbm9kZTsKKwlqZmZzX2luc2VydF9maWxlX2ludG9faGFzaChyb290KTsKKwlyZXR1cm4gMDsKK30KKworCisvKiBUaGlzIGlzIHdoZXJlIHRoZSBmaWxlIHN5c3RlbSBpcyBidWlsdCBhbmQgaW5pdGlhbGl6ZWQuICAqLworaW50CitqZmZzX2J1aWxkX2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGpmZnNfY29udHJvbCAqYzsKKwlpbnQgZXJyID0gMDsKKworCUQyKHByaW50aygiamZmc19idWlsZF9mcygpXG4iKSk7CisKKwlpZiAoIShjID0gamZmc19jcmVhdGVfY29udHJvbChzYikpKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwljLT5idWlsZGluZ19mcyA9IDE7CisJYy0+c2IgPSBzYjsKKwlpZiAoKGVyciA9IGpmZnNfc2Nhbl9mbGFzaChjKSkgPCAwKSB7CisJCWlmKGVyciA9PSAtRUFHQUlOKXsKKwkJCS8qIHNjYW5fZmxhc2goKSB3YW50cyB1cyB0byB0cnkgb25jZSBtb3JlLiBBIGZsaXBwaW5nIAorCQkJICAgYml0cyBzZWN0b3Igd2FzIGRldGVjdCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBzY2FuIGZsYXNoLgorCQkJICAgQ2xlYW4gdXAgb2xkIGFsbG9jYXRlZCBtZW1vcnkgYmVmb3JlIGdvaW5nIGluLgorCQkJKi8KKwkJCUQxKHByaW50aygiamZmc19idWlsZF9mczogQ2xlYW5pbmcgdXAgYWxsIGNvbnRyb2wgc3RydWN0dXJlcywiCisJCQkJICAiIHJlYWxsb2NhdGluZyB0aGVtIGFuZCB0cnlpbmcgbW91bnQgYWdhaW4uXG4iKSk7CisJCQlqZmZzX2NsZWFudXBfY29udHJvbChjKTsKKwkJCWlmICghKGMgPSBqZmZzX2NyZWF0ZV9jb250cm9sKHNiKSkpIHsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJCWMtPmJ1aWxkaW5nX2ZzID0gMTsKKwkJCWMtPnNiID0gc2I7CisKKwkJCWlmICgoZXJyID0gamZmc19zY2FuX2ZsYXNoKGMpKSA8IDApIHsKKwkJCQlnb3RvIGpmZnNfYnVpbGRfZnNfZmFpbDsKKwkJCX0JCQkKKwkJfWVsc2V7CisJCQlnb3RvIGpmZnNfYnVpbGRfZnNfZmFpbDsKKwkJfQorCX0KKworCS8qIEFkZCBhIHZpcnR1YWwgcm9vdCBub2RlIGlmIG5vIG9uZSBleGlzdHMuICAqLworCWlmICghamZmc19maW5kX2ZpbGUoYywgSkZGU19NSU5fSU5PKSkgeworCQlpZiAoKGVyciA9IGpmZnNfYWRkX3ZpcnR1YWxfcm9vdChjKSkgPCAwKSB7CisJCQlnb3RvIGpmZnNfYnVpbGRfZnNfZmFpbDsKKwkJfQorCX0KKworCXdoaWxlIChjLT5kZWxldGVfbGlzdCkgeworCQlzdHJ1Y3QgamZmc19maWxlICpmOworCQlzdHJ1Y3QgamZmc19kZWxldGVfbGlzdCAqZGVsZXRlX2xpc3RfZWxlbWVudDsKKworCQlpZiAoKGYgPSBqZmZzX2ZpbmRfZmlsZShjLCBjLT5kZWxldGVfbGlzdC0+aW5vKSkpIHsKKwkJCWYtPmRlbGV0ZWQgPSAxOworCQl9CisJCWRlbGV0ZV9saXN0X2VsZW1lbnQgPSBjLT5kZWxldGVfbGlzdDsKKwkJYy0+ZGVsZXRlX2xpc3QgPSBjLT5kZWxldGVfbGlzdC0+bmV4dDsKKwkJa2ZyZWUoZGVsZXRlX2xpc3RfZWxlbWVudCk7CisJfQorCisJLyogUmVtb3ZlIGRlbGV0ZWQgbm9kZXMuICAqLworCWlmICgoZXJyID0gamZmc19mb3JlYWNoX2ZpbGUoYywgamZmc19wb3NzaWJseV9kZWxldGVfZmlsZSkpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIkpGRlM6IEZhaWxlZCB0byByZW1vdmUgZGVsZXRlZCBub2Rlcy5cbiIpOworCQlnb3RvIGpmZnNfYnVpbGRfZnNfZmFpbDsKKwl9CisJLyogUmVtb3ZlIHJlZHVuZGFudCBub2Rlcy4gIChXZSBhcmUgbm90IGludGVyZXN0ZWQgaW4gdGhlCisJICAgcmV0dXJuIHZhbHVlIGluIHRoaXMgY2FzZS4pICAqLworCWpmZnNfZm9yZWFjaF9maWxlKGMsIGpmZnNfcmVtb3ZlX3JlZHVuZGFudF9ub2Rlcyk7CisJLyogVHJ5IHRvIGJ1aWxkIGEgdHJlZSBmcm9tIGFsbCB0aGUgbm9kZXMuICAqLworCWlmICgoZXJyID0gamZmc19mb3JlYWNoX2ZpbGUoYywgamZmc19pbnNlcnRfZmlsZV9pbnRvX3RyZWUpKSA8IDApIHsKKwkJcHJpbnRrKCJKRkZTOiBGYWlsZWQgdG8gYnVpbGQgdHJlZS5cbiIpOworCQlnb3RvIGpmZnNfYnVpbGRfZnNfZmFpbDsKKwl9CisJLyogQ29tcHV0ZSB0aGUgc2l6ZXMgb2YgYWxsIGZpbGVzIGluIHRoZSBmaWxlc3lzdGVtLiAgQWRqdXN0IGlmCisJICAgbmVjZXNzYXJ5LiAgKi8KKwlpZiAoKGVyciA9IGpmZnNfZm9yZWFjaF9maWxlKGMsIGpmZnNfYnVpbGRfZmlsZSkpIDwgMCkgeworCQlwcmludGsoIkpGRlM6IEZhaWxlZCB0byBidWlsZCBmaWxlIHN5c3RlbS5cbiIpOworCQlnb3RvIGpmZnNfYnVpbGRfZnNfZmFpbDsKKwl9CisJc2ItPnNfZnNfaW5mbyA9ICh2b2lkICopYzsKKwljLT5idWlsZGluZ19mcyA9IDA7CisKKwlEMShqZmZzX3ByaW50X2hhc2hfdGFibGUoYykpOworCUQxKGpmZnNfcHJpbnRfdHJlZShjLT5yb290LCAwKSk7CisKKwlyZXR1cm4gMDsKKworamZmc19idWlsZF9mc19mYWlsOgorCWpmZnNfY2xlYW51cF9jb250cm9sKGMpOworCXJldHVybiBlcnI7Cit9IC8qIGpmZnNfYnVpbGRfZnMoKSAgKi8KKworCisvKgorICBUaGlzIGNoZWNrcyBmb3Igc2VjdG9ycyB0aGF0IHdlcmUgYmVpbmcgZXJhc2VkIGluIHRoZWlyIHByZXZpb3VzIAorICBsaWZldGltZXMgYW5kIGZvciBzb21lIHJlYXNvbiBvciB0aGUgb3RoZXIgKHBvd2VyIGZhaWwgZXRjLiksIAorICB0aGUgZXJhc2UgY3ljbGVzIG5ldmVyIGNvbXBsZXRlZC4KKyAgQXMgdGhlIGZsYXNoIGFycmF5IHdvdWxkIGhhdmUgcmV2ZXJ0ZWQgYmFjayB0byByZWFkIHN0YXR1cywgCisgIHRoZXNlIHNlY3RvcnMgYXJlIGRldGVjdGVkIGJ5IHRoZSBzeW1wdG9tIG9mIHRoZSAiZmxpcHBpbmcgYml0cyIsCisgIGkuZS4gYml0cyBiZWluZyByZWFkIGJhY2sgZGlmZmVyZW50bHkgZnJvbSB0aGUgc2FtZSBsb2NhdGlvbiBpbgorICBmbGFzaCBpZiByZWFkIG11bHRpcGxlIHRpbWVzLgorICBUaGUgb25seSBzb2x1dGlvbiB0byB0aGlzIGlzIHRvIHJlLWVyYXNlIHRoZSBlbnRpcmUKKyAgc2VjdG9yLgorICBVbmZvcnR1bmF0ZWx5IGRldGVjdGluZyAiZmxpcHBpbmcgYml0cyIgaXMgbm90IGEgc2ltcGxlIGV4ZXJjaXNlCisgIGFzIGEgYml0IG1heSBiZSByZWFkIGJhY2sgYXQgMSBvciAwIGRlcGVuZGluZyBvbiB0aGUgYWxpZ25tZW50IAorICBvZiB0aGUgc3RhcnMgaW4gdGhlIHVuaXZlcnNlLgorICBUaGUgbGV2ZWwgb2YgY29uZmlkZW5jZSBpcyBpbiBkaXJlY3QgcHJvcG9ydGlvbiB0byB0aGUgbnVtYmVyIG9mIAorICBzY2FucyBkb25lLiBCeSBwb3dlciBmYWlsIHRlc3RpbmcgSSAoVmlwaW4pIGhhdmUgYmVlbiBhYmxlIHRvIAorICBwcm9vdmUgdGhhdCByZWFkaW5nIHR3aWNlIGlzIG5vdCBlbm91Z2guCisgIE1heWJlIDQgdGltZXM/IENoYW5nZSBOVU1fUkVSRUFEUyB0byBhIGhpZ2hlciBudW1iZXIgaWYgeW91IHdhbnQKKyAgYSAoZXZlbikgaGlnaGVyIGRlZ3JlZSBvZiBjb25maWRlbmNlIGluIHlvdXIgbW91bnQgcHJvY2Vzcy4gCisgIEEgaGlnaGVyIG51bWJlciB3b3VsZCBvZiBjb3Vyc2Ugc2xvdyBkb3duIHlvdXIgbW91bnQuCisqLworc3RhdGljIGludCBjaGVja19wYXJ0bHlfZXJhc2VkX3NlY3RvcnMoc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMpeworCisjZGVmaW5lIE5VTV9SRVJFQURTICAgICAgICAgICAgIDQgLyogc2VlIG5vdGUgYWJvdmUgKi8KKyNkZWZpbmUgUkVBRF9BSEVBRF9CWVRFUyAgICAgICAgNDA5NiAvKiBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCwgCisJCQkJCXVzdWFsbHkgc2V0IHRvIGtlcm5lbCBwYWdlIHNpemUgKi8KKworCV9fdTggKnJlYWRfYnVmMTsKKwlfX3U4ICpyZWFkX2J1ZjI7CisKKwlpbnQgZXJyID0gMDsKKwlpbnQgcmV0bGVuOworCWludCBpOworCWludCBjbnQ7CisJX191MzIgb2Zmc2V0OworCWxvZmZfdCBwb3MgPSAwOworCWxvZmZfdCBlbmQgPSBmbWMtPmZsYXNoX3NpemU7CisKKworCS8qIEFsbG9jYXRlIHJlYWQgYnVmZmVycyAqLworCXJlYWRfYnVmMSA9IChfX3U4ICopIGttYWxsb2MgKHNpemVvZihfX3U4KSAqIFJFQURfQUhFQURfQllURVMsIEdGUF9LRVJORUwpOworCWlmICghcmVhZF9idWYxKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlYWRfYnVmMiA9IChfX3U4ICopIGttYWxsb2MgKHNpemVvZihfX3U4KSAqIFJFQURfQUhFQURfQllURVMsIEdGUF9LRVJORUwpOworCWlmICghcmVhZF9idWYyKSB7CisJCWtmcmVlKHJlYWRfYnVmMSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworIENIRUNLX05FWFQ6CisJd2hpbGUocG9zIDwgZW5kKXsKKwkJCisJCUQxKHByaW50aygiY2hlY2tfcGFydGx5X2VyYXNlZF9zZWN0b3IoKTpjaGVja2luZyBzZWN0b3Igd2hpY2ggY29udGFpbnMiCisJCQkgICIgb2Zmc2V0IDB4JXggZm9yIGZsaXBwaW5nIGJpdHMuLlxuIiwgKF9fdTMyKXBvcykpOworCQkKKwkJcmV0bGVuID0gZmxhc2hfc2FmZV9yZWFkKGZtYy0+bXRkLCBwb3MsCisJCQkJCSAmcmVhZF9idWYxWzBdLCBSRUFEX0FIRUFEX0JZVEVTKTsKKwkJcmV0bGVuICY9IH4zOworCQkKKwkJZm9yKGNudCA9IDA7IGNudCA8IE5VTV9SRVJFQURTOyBjbnQrKyl7CisJCQkodm9pZClmbGFzaF9zYWZlX3JlYWQoZm1jLT5tdGQsIHBvcywKKwkJCQkJICAgICAgJnJlYWRfYnVmMlswXSwgUkVBRF9BSEVBRF9CWVRFUyk7CisJCQkKKwkJCWZvciAoaT0wIDsgaSA8IHJldGxlbiA7IGkrPTQpIHsKKwkJCQkvKiBidWZmZXJzIE1VU1QgbWF0Y2gsIGRvdWJsZSB3b3JkIGZvciB3b3JkISAqLworCQkJCWlmKCooKF9fdTMyICopICZyZWFkX2J1ZjFbaV0pICE9CisJCQkJICAgKigoX191MzIgKikgJnJlYWRfYnVmMltpXSkKKwkJCQkgICApeworCQkJCSAgICAgICAgLyogZmxpcHBpbmcgYml0cyBkZXRlY3RlZCwgdGltZSB0byBlcmFzZSBzZWN0b3IgKi8KKwkJCQkJLyogVGhpcyB3aWxsIGhlbHAgdXMgbG9nIHNvbWUgc3RhdGlzdGljcyBldGMuICovCisJCQkJCUQxKHByaW50aygiRmxpcHBpbmcgYml0cyBkZXRlY3RlZCBpbiByZS1yZWFkIHJvdW5kOiVpIG9mICVpXG4iLAorCQkJCQkgICAgICAgY250LCBOVU1fUkVSRUFEUykpOworCQkJCQlEMShwcmludGsoImNoZWNrX3BhcnRseV9lcmFzZWRfc2VjdG9yczpmbGlwcGluZyBiaXRzIGRldGVjdGVkIgorCQkJCQkJICAiIEBvZmZzZXQ6MHgleCgweCV4IT0weCV4KVxuIiwKKwkJCQkJCSAgKF9fdTMyKXBvcytpLCAqKChfX3UzMiAqKSAmcmVhZF9idWYxW2ldKSwgCisJCQkJCQkgICooKF9fdTMyICopICZyZWFkX2J1ZjJbaV0pKSk7CisJCQkJCQorCQkJCSAgICAgICAgLyogY2FsY3VsYXRlIHN0YXJ0IG9mIHByZXNlbnQgc2VjdG9yICovCisJCQkJCW9mZnNldCA9ICgoKF9fdTMyKXBvcytpKS8oX191MzIpZm1jLT5zZWN0b3Jfc2l6ZSkgKiAoX191MzIpZm1jLT5zZWN0b3Jfc2l6ZTsKKwkJCQkJCisJCQkJCUQxKHByaW50aygiY2hlY2tfcGFydGx5X2VyYXNlZF9zZWN0b3IoKTplcmFzaW5nIHNlY3RvciBzdGFydGluZyAweCV4LlxuIiwKKwkJCQkJCSAgb2Zmc2V0KSk7CisJCQkJCQorCQkJCQlpZiAoZmxhc2hfZXJhc2VfcmVnaW9uKGZtYy0+bXRkLAorCQkJCQkJCSAgICAgICBvZmZzZXQsIGZtYy0+c2VjdG9yX3NpemUpIDwgMCkgeworCQkJCQkJcHJpbnRrKEtFUk5fRVJSICJKRkZTOiBFcmFzZSBvZiBmbGFzaCBmYWlsZWQuICIKKwkJCQkJCSAgICAgICAib2Zmc2V0ID0gJXUsIGVyYXNlX3NpemUgPSAlZFxuIiwKKwkJCQkJCSAgICAgICBvZmZzZXQgLCBmbWMtPnNlY3Rvcl9zaXplKTsKKwkJCQkJCQorCQkJCQkJZXJyID0gLUVJTzsKKwkJCQkJCWdvdG8gcmV0dXJuQmFjazsKKworCQkJCQl9ZWxzZXsKKwkJCQkJCUQxKHByaW50aygiSkZGUzogRXJhc2Ugb2YgZmxhc2ggc2VjdG9yIEAweCV4IHN1Y2Nlc3NmdWwuXG4iLAorCQkJCQkJICAgICAgIG9mZnNldCkpOworCQkJCQkJLyogc2tpcCBhaGVhZCB0byB0aGUgbmV4dCBzZWN0b3IgKi8KKwkJCQkJCXBvcyA9ICgoKF9fdTMyKXBvcytpKS8oX191MzIpZm1jLT5zZWN0b3Jfc2l6ZSkgKiAoX191MzIpZm1jLT5zZWN0b3Jfc2l6ZTsKKwkJCQkJCXBvcyArPSBmbWMtPnNlY3Rvcl9zaXplOworCQkJCQkJZ290byBDSEVDS19ORVhUOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXBvcyArPSBSRUFEX0FIRUFEX0JZVEVTOworCX0KKworIHJldHVybkJhY2s6CisJa2ZyZWUocmVhZF9idWYxKTsKKwlrZnJlZShyZWFkX2J1ZjIpOworCisJRDIocHJpbnRrKCJjaGVja19wYXJ0bHlfZXJhc2VkX3NlY3RvcigpOkRvbmUgY2hlY2tpbmcgYWxsIHNlY3RvcnMgdGlsbCBvZmZzZXQgMHgleCBmb3IgZmxpcHBpbmcgYml0cy5cbiIsCisJCSAgKF9fdTMyKXBvcykpOworCisJcmV0dXJuIGVycjsKKworfS8qIGVuZCBjaGVja19wYXJ0bHlfZXJhc2VkX3NlY3RvcnMoKSAqLworCisKKworLyogU2NhbiB0aGUgd2hvbGUgZmxhc2ggbWVtb3J5IGluIG9yZGVyIHRvIGZpbmQgYWxsIG5vZGVzIGluIHRoZQorICAgZmlsZSBzeXN0ZW1zLiAgKi8KK3N0YXRpYyBpbnQKK2pmZnNfc2Nhbl9mbGFzaChzdHJ1Y3QgamZmc19jb250cm9sICpjKQoreworCWNoYXIgbmFtZVtKRkZTX01BWF9OQU1FX0xFTiArIDJdOworCXN0cnVjdCBqZmZzX3Jhd19pbm9kZSByYXdfaW5vZGU7CisJc3RydWN0IGpmZnNfbm9kZSAqbm9kZSA9IE5VTEw7CisJc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMgPSBjLT5mbWM7CisJX191MzIgY2hlY2tzdW07CisJX191OCB0bXBfYWNjdXJhdGU7CisJX191MTYgdG1wX2Noa3N1bTsKKwlfX3UzMiBkZWxldGVkX2ZpbGU7CisJbG9mZl90IHBvcyA9IDA7CisJbG9mZl90IHN0YXJ0OworCWxvZmZfdCB0ZXN0X3N0YXJ0OworCWxvZmZfdCBlbmQgPSBmbWMtPmZsYXNoX3NpemU7CisJX191OCAqcmVhZF9idWY7CisJaW50IGksIGxlbiwgcmV0bGVuOworCV9fdTMyIG9mZnNldDsKKworCV9fdTMyIGZyZWVfY2h1bmtfc2l6ZTE7CisJX191MzIgZnJlZV9jaHVua19zaXplMjsKKworCQorI2RlZmluZSBOVU1GUkVFQUxMT1dFRCAgICAgMiAgICAgICAgLyogMiBjaHVua3Mgb2YgYXQgbGVhc3QgZXJhc2Ugc2l6ZSBzcGFjZSBhbGxvd2VkICovCisJaW50IG51bV9mcmVlX3NwYWNlID0gMDsgICAgICAgLyogRmxhZyBlcnIgaWYgbW9yZSB0aGFuIFRXTworCQkJCSAgICAgICBmcmVlIGJsb2NrcyBmb3VuZC4gVGhpcyBpcyBOT1QgYWxsb3dlZAorCQkJCSAgICAgICBieSB0aGUgY3VycmVudCBqZmZzIGRlc2lnbi4KKwkJCQkgICAgKi8KKwlpbnQgbnVtX2ZyZWVfc3BjX25vdF9hY2NwID0gMDsgLyogRm9yIGRlYnVnZ2luZyBwdXJwb3NlZCBrZWVwIGNvdW50IAorCQkJCQlvZiBob3cgbXVjaCBmcmVlIHNwYWNlIHdhcyByZWplY3RlZCBhbmQKKwkJCQkJbWFya2VkIGRpcnR5CisJCQkJICAgICAqLworCisJRDEocHJpbnRrKCJqZmZzX3NjYW5fZmxhc2goKTogc3RhcnQgcG9zID0gMHglbHgsIGVuZCA9IDB4JWx4XG4iLAorCQkgIChsb25nKXBvcywgKGxvbmcpZW5kKSk7CisKKwlmbGFzaF9zYWZlX2FjcXVpcmUoZm1jLT5tdGQpOworCisJLyoKKwkgIGNoZWNrIGFuZCBtYWtlIHN1cmUgdGhhdCBhbnkgc2VjdG9yIGRvZXMgbm90IHN1ZmZlcgorCSAgZnJvbSB0aGUgInBhcnRseSBlcmFzZWQsIGJpdCBmbGlwcGluZyBzeW5kcm9tZSIgKFRNIFZpcGluIDopCisJICBJZiBzbywgb2ZmZW5kaW5nIHNlY3RvcnMgd2lsbCBiZSBlcmFzZWQuCisJKi8KKwlpZihjaGVja19wYXJ0bHlfZXJhc2VkX3NlY3RvcnMoZm1jKSA8IDApeworCisJCWZsYXNoX3NhZmVfcmVsZWFzZShmbWMtPm10ZCk7CisJCXJldHVybiAtRUlPOyAvKiBiYWQsIGJhZCwgYmFkIGVycm9yLiBDYW5ub3QgY29udGludWUuKi8KKwl9CisKKwkvKiBBbGxvY2F0ZSByZWFkIGJ1ZmZlciAqLworCXJlYWRfYnVmID0gKF9fdTggKikga21hbGxvYyAoc2l6ZW9mKF9fdTgpICogNDA5NiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZWFkX2J1ZikgeworCQlmbGFzaF9zYWZlX3JlbGVhc2UoZm1jLT5tdGQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJCQkgICAgICAKKwkvKiBTdGFydCB0aGUgc2Nhbi4gICovCisJd2hpbGUgKHBvcyA8IGVuZCkgeworCQlkZWxldGVkX2ZpbGUgPSAwOworCisJCS8qIFJlbWVtYmVyIHRoZSBwb3NpdGlvbiBmcm9tIHdoZXJlIHdlIHN0YXJ0ZWQgdGhpcyBzY2FuLiAgKi8KKwkJc3RhcnQgPSBwb3M7CisKKwkJc3dpdGNoIChmbGFzaF9yZWFkX3UzMihmbWMtPm10ZCwgcG9zKSkgeworCQljYXNlIEpGRlNfRU1QVFlfQklUTUFTSzoKKwkJCS8qIFdlIGhhdmUgZm91bmQgMHhmZmZmZmZmZiBhdCB0aGlzIHBvc2l0aW9uLiAgV2UgaGF2ZSB0bworCQkJICAgc2NhbiB0aGUgcmVzdCBvZiB0aGUgZmxhc2ggdGlsbCB0aGUgZW5kIG9yIHRpbGwKKwkJCSAgIHNvbWV0aGluZyBlbHNlIHRoYW4gMHhmZmZmZmZmZiBpcyBmb3VuZC4KKwkJICAgICAgICAgICBLZWVwIGdvaW5nIHRpbGwgd2UgZG8gbm90IGZpbmQgSkZGU19FTVBUWV9CSVRNQVNLIAorCQkJICAgYW55bW9yZSAqLworCisJCQlEMShwcmludGsoImpmZnNfc2Nhbl9mbGFzaCgpOiAweGZmZmZmZmZmIGF0IHBvcyAweCVseC5cbiIsCisJCQkJICAobG9uZylwb3MpKTsKKworCQkgICAgICAgIHdoaWxlKHBvcyA8IGVuZCl7CisKKwkJCSAgICAgIGxlbiA9IGVuZCAtIHBvcyA8IDQwOTYgPyBlbmQgLSBwb3MgOiA0MDk2OworCQkJICAgICAgCisJCQkgICAgICByZXRsZW4gPSBmbGFzaF9zYWZlX3JlYWQoZm1jLT5tdGQsIHBvcywKKwkJCQkJCSAmcmVhZF9idWZbMF0sIGxlbik7CisKKwkJCSAgICAgIHJldGxlbiAmPSB+MzsKKwkJCSAgICAgIAorCQkJICAgICAgZm9yIChpPTAgOyBpIDwgcmV0bGVuIDsgaSs9NCwgcG9zICs9IDQpIHsKKwkJCQkgICAgICBpZigqKChfX3UzMiAqKSAmcmVhZF9idWZbaV0pICE9CisJCQkJCSBKRkZTX0VNUFRZX0JJVE1BU0spCisJCQkJCWJyZWFrOworCQkJICAgICAgfQorCQkJICAgICAgaWYgKGkgPT0gcmV0bGVuKQorCQkJCSAgICBjb250aW51ZTsKKwkJCSAgICAgIGVsc2UKKwkJCQkgICAgYnJlYWs7CisJCQl9CisKKwkJCUQxKHByaW50aygiamZmc19zY2FuX2ZsYXNoKCk6MHhmZmZmZmZmZiBlbmRlZCBhdCBwb3MgMHglbHguXG4iLAorCQkJCSAgKGxvbmcpcG9zKSk7CisJCQkKKwkJCS8qIElmIHNvbWUgZnJlZSBzcGFjZSBlbmRzIGluIHRoZSBtaWRkbGUgb2YgYSBzZWN0b3IsCisJCQkgICB0cmVhdCBpdCBhcyBkaXJ0eSByYXRoZXIgdGhhbiBjbGVhbi4KKwkJCSAgIFRoaXMgaXMgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIG9uZSB0aHJlYWQgCisJCQkgICBhbGxvY2F0ZWQgc3BhY2UgZm9yIGEgbm9kZSwgYnV0IGRpZG4ndCBnZXQgdG8KKwkJCSAgIGFjdHVhbGx5IF93cml0ZV8gaXQgYmVmb3JlIHBvd2VyIHdhcyBsb3N0LCBsZWF2aW5nCisJCQkgICBhIGdhcCBpbiB0aGUgbG9nLiBTaGlmdGluZyBhbGwgbm9kZSB3cml0ZXMgaW50bworCQkJICAgYSBzaW5nbGUga2VybmVsIHRocmVhZCB3aWxsIGZpeCB0aGUgb3JpZ2luYWwgcHJvYmxlbS4KKwkJCSovCisJCQlpZiAoKF9fdTMyKSBwb3MgJSBmbWMtPnNlY3Rvcl9zaXplKSB7CisJCQkJLyogSWYgdGhlcmUgd2FzIGZyZWUgc3BhY2UgaW4gcHJldmlvdXMgCisJCQkJICAgc2VjdG9ycywgZG9uJ3QgbWFyayB0aGF0IGRpcnR5IHRvbyAtIAorCQkJCSAgIG9ubHkgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgc2VjdG9yCisJCQkJICAgKG9yIGZyb20gc3RhcnQpIAorCQkJCSovCisKKwkJCSAgICAgICAgdGVzdF9zdGFydCA9IHBvcyAmIH4oZm1jLT5zZWN0b3Jfc2l6ZS0xKTsgLyogZW5kIG9mIGxhc3Qgc2VjdG9yICovCisKKwkJCQlpZiAoc3RhcnQgPCB0ZXN0X3N0YXJ0KSB7CisKKwkJCQkgICAgICAgIC8qIGZyZWUgc3BhY2Ugc3RhcnRlZCBpbiB0aGUgcHJldmlvdXMgc2VjdG9yISAqLworCisJCQkJCWlmKChudW1fZnJlZV9zcGFjZSA8IE5VTUZSRUVBTExPV0VEKSAmJiAKKwkJCQkJICAgKCh1bnNpZ25lZCBpbnQpKHRlc3Rfc3RhcnQgLSBzdGFydCkgPj0gZm1jLT5zZWN0b3Jfc2l6ZSkpeworCisJCQkJICAgICAgICAgICAgICAgIC8qCisJCQkJCQkgIENvdW50IGl0IGluIGlmIHdlIGFyZSBzdGlsbCB1bmRlciBOVU1GUkVFQUxMT1dFRCAqYW5kKiBpdCBpcyAKKwkJCQkJCSAgYXQgbGVhc3QgMSBlcmFzZSBzZWN0b3IgaW4gbGVuZ3RoLiBUaGlzIHdpbGwga2VlcCB1cyBmcm9tIAorCQkJCQkJICBwaWNraW5nIGFueSBsaXR0bGUgb2xlJyBzcGFjZSBhcyAiZnJlZSIuCisJCQkJCQkqLworCQkJCQkgIAorCQkJCQkgICAgICAgIEQxKHByaW50aygiUmVkdWNpbmcgZW5kIG9mIGZyZWUgc3BhY2UgdG8gMHgleCBmcm9tIDB4JXhcbiIsCisJCQkJCQkJICAodW5zaWduZWQgaW50KXRlc3Rfc3RhcnQsICh1bnNpZ25lZCBpbnQpcG9zKSk7CisKKwkJCQkJCUQxKHByaW50aygiRnJlZSBzcGFjZSBhY2NlcHRlZDogU3RhcnRpbmcgMHgleCBmb3IgMHgleCBieXRlc1xuIiwKKwkJCQkJCQkgICh1bnNpZ25lZCBpbnQpIHN0YXJ0LAorCQkJCQkJCSAgKHVuc2lnbmVkIGludCkodGVzdF9zdGFydCAtIHN0YXJ0KSkpOworCisJCQkJCQkvKiBiZWxvdywgc3BhY2UgZnJvbSAic3RhcnQiIHRvICJwb3MiIHdpbGwgYmUgbWFya2VkIGRpcnR5LiAqLworCQkJCQkJc3RhcnQgPSB0ZXN0X3N0YXJ0OyAKKwkJCQkJCQorCQkJCQkJLyogQmVpbmcgaW4gaGVyZSBtZWFucyB0aGF0IHdlIGhhdmUgZm91bmQgYXQgbGVhc3QgYW4gZW50aXJlIAorCQkJCQkJICAgZXJhc2Ugc2VjdG9yIHNpemUgb2YgZnJlZSBzcGFjZSBlbmRpbmcgb24gYSBzZWN0b3IgYm91bmRhcnkuCisJCQkJCQkgICBLZWVwIHRyYWNrIG9mIGZyZWUgc3BhY2VzIGFjY2VwdGVkLgorCQkJCQkJKi8KKwkJCQkJCW51bV9mcmVlX3NwYWNlKys7CisJCQkJCX1lbHNleworCQkJCQkgICAgICAgIG51bV9mcmVlX3NwY19ub3RfYWNjcCsrOworCQkJCQkgICAgICAgIEQxKHByaW50aygiRnJlZSBzcGFjZSAoIyVpKSBmb3VuZCBidXQgKk5vdCogYWNjZXB0ZWQ6IFN0YXJ0aW5nIgorCQkJCQkJCSAgIiAweCV4IGZvciAweCV4IGJ5dGVzXG4iLAorCQkJCQkJCSAgbnVtX2ZyZWVfc3BjX25vdF9hY2NwLCAodW5zaWduZWQgaW50KXN0YXJ0LCAKKwkJCQkJCQkgICh1bnNpZ25lZCBpbnQpKCh1bnNpZ25lZCBpbnQpKHBvcyAmIH4oZm1jLT5zZWN0b3Jfc2l6ZS0xKSkgLSAodW5zaWduZWQgaW50KXN0YXJ0KSkpOworCQkJCQkgICAgICAgIAorCQkJCQl9CisJCQkJCQorCQkJCX0KKwkJCQlpZigoKChfX3UzMikocG9zIC0gc3RhcnQpKSAhPSAwKSl7CisKKwkJCQkgICAgICAgIEQxKHByaW50aygiRGlydHkgc3BhY2U6IFN0YXJ0aW5nIDB4JXggZm9yIDB4JXggYnl0ZXNcbiIsCisJCQkJCQkgICh1bnNpZ25lZCBpbnQpIHN0YXJ0LCAodW5zaWduZWQgaW50KSAocG9zIC0gc3RhcnQpKSk7CisJCQkJCWpmZnNfZm1hbGxvY2VkKGZtYywgKF9fdTMyKSBzdGFydCwKKwkJCQkJCSAgICAgICAoX191MzIpIChwb3MgLSBzdGFydCksIE5VTEwpOworCQkJCX1lbHNleworCQkJCQkvKiAiRmxpcHBpbmcgYml0cyIgZGV0ZWN0ZWQuIFRoaXMgbWVhbnMgdGhhdCBvdXIgc2NhbiBmb3IgdGhlbQorCQkJCQkgICBkaWQgbm90IGNhdGNoIHRoaXMgb2Zmc2V0LiBTZWUgY2hlY2tfcGFydGx5X2VyYXNlZF9zZWN0b3JzKCkgZm9yCisJCQkJCSAgIG1vcmUgaW5mby4KKwkJCQkJKi8KKwkJCQkgICAgICAgIAorCQkJCQlEMShwcmludGsoImpmZnNfc2Nhbl9mbGFzaCgpOndhbnRzIHRvIGFsbG9jYXRlIGRpcnR5IGZsYXNoICIKKwkJCQkJCSAgInNwYWNlIGZvciAwIGJ5dGVzLlxuIikpOworCQkJCQlEMShwcmludGsoImpmZnNfc2Nhbl9mbGFzaCgpOiBGbGlwcGluZyBiaXRzISBXZSB3aWxsIGZyZWUgIgorCQkJCQkJICAiYWxsIGFsbG9jYXRlZCBtZW1vcnksIGVyYXNlIHRoaXMgc2VjdG9yIGFuZCByZW1vdW50XG4iKSk7CisKKwkJCQkJLyogY2FsY3VsYXRlIHN0YXJ0IG9mIHByZXNlbnQgc2VjdG9yICovCisJCQkJCW9mZnNldCA9ICgoKF9fdTMyKXBvcykvKF9fdTMyKWZtYy0+c2VjdG9yX3NpemUpICogKF9fdTMyKWZtYy0+c2VjdG9yX3NpemU7CisJCQkJCQorCQkJCQlEMShwcmludGsoImpmZnNfc2Nhbl9mbGFzaCgpOmVyYXNpbmcgc2VjdG9yIHN0YXJ0aW5nIDB4JXguXG4iLAorCQkJCQkJICBvZmZzZXQpKTsKKwkJCQkJCisJCQkJCWlmIChmbGFzaF9lcmFzZV9yZWdpb24oZm1jLT5tdGQsCisJCQkJCQkJICAgICAgIG9mZnNldCwgZm1jLT5zZWN0b3Jfc2l6ZSkgPCAwKSB7CisJCQkJCQlwcmludGsoS0VSTl9FUlIgIkpGRlM6IEVyYXNlIG9mIGZsYXNoIGZhaWxlZC4gIgorCQkJCQkJICAgICAgICJvZmZzZXQgPSAldSwgZXJhc2Vfc2l6ZSA9ICVkXG4iLAorCQkJCQkJICAgICAgIG9mZnNldCAsIGZtYy0+c2VjdG9yX3NpemUpOworCisJCQkJCQlmbGFzaF9zYWZlX3JlbGVhc2UoZm1jLT5tdGQpOworCQkJCQkJa2ZyZWUgKHJlYWRfYnVmKTsKKwkJCQkJCXJldHVybiAtMTsgLyogYmFkLCBiYWQsIGJhZCEgKi8KKworCQkJCQl9CisJCQkJCWZsYXNoX3NhZmVfcmVsZWFzZShmbWMtPm10ZCk7CisJCQkJCWtmcmVlIChyZWFkX2J1Zik7CisKKwkJCQkJcmV0dXJuIC1FQUdBSU47IC8qIGVyYXNlZCBvZmZlbmRpbmcgc2VjdG9yLiBUcnkgbW91bnQgb25lIG1vcmUgdGltZSBwbGVhc2UuICovCisJCQkJfQorCQkJfWVsc2V7CisJCQkgICAgICAgIC8qIEJlaW5nIGluIGhlcmUgbWVhbnMgdGhhdCB3ZSBoYXZlIGZvdW5kIGZyZWUgc3BhY2UgdGhhdCBlbmRzIG9uIGFuIGVyYXNlIHNlY3RvcgorCQkJCSAgIGJvdW5kYXJ5LgorCQkJCSAgIENvdW50IGl0IGluIGlmIHdlIGFyZSBzdGlsbCB1bmRlciBOVU1GUkVFQUxMT1dFRCAqYW5kKiBpdCBpcyBhdCBsZWFzdCAxIGVyYXNlIAorCQkJCSAgIHNlY3RvciBpbiBsZW5ndGguIFRoaXMgd2lsbCBrZWVwIHVzIGZyb20gcGlja2luZyBhbnkgbGl0dGxlIG9sZScgc3BhY2UgYXMgImZyZWUiLgorCQkJCSAqLworCQkJICAgICAgICAgaWYoKG51bV9mcmVlX3NwYWNlIDwgTlVNRlJFRUFMTE9XRUQpICYmIAorCQkJCSAgICAoKHVuc2lnbmVkIGludCkocG9zIC0gc3RhcnQpID49IGZtYy0+c2VjdG9yX3NpemUpKXsKKwkJCQkgICAgICAgICAgIC8qIFdlIHJlYWxseSBkb24ndCBkbyBhbnl0aGluZyB0byBtYXJrIHNwYWNlIGFzIGZyZWUsIGV4Y2VwdCAqbm90KiAKKwkJCQkJICAgICAgbWFyayBpdCBkaXJ0eSBhbmQganVzdCBhZHZhbmNlIHRoZSAicG9zIiBsb2NhdGlvbiBwb2ludGVyLiAKKwkJCQkJICAgICAgSXQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHBpY2tlZCB1cCBhcyBmcmVlIHNwYWNlLgorCQkJCQkgICAgKi8gCisJCQkJICAgICAgICAgICBudW1fZnJlZV9zcGFjZSsrOworCQkJCSAgICAgICAgICAgRDEocHJpbnRrKCJGcmVlIHNwYWNlIGFjY2VwdGVkOiBTdGFydGluZyAweCV4IGZvciAweCV4IGJ5dGVzXG4iLAorCQkJCQkJICAgICAodW5zaWduZWQgaW50KSBzdGFydCwgKHVuc2lnbmVkIGludCkgKHBvcyAtIHN0YXJ0KSkpOworCQkJCSB9ZWxzZXsKKwkJCQkgICAgICAgICBudW1fZnJlZV9zcGNfbm90X2FjY3ArKzsKKwkJCQkJIEQxKHByaW50aygiRnJlZSBzcGFjZSAoIyVpKSBmb3VuZCBidXQgKk5vdCogYWNjZXB0ZWQ6IFN0YXJ0aW5nICIKKwkJCQkJCSAgICIweCV4IGZvciAweCV4IGJ5dGVzXG4iLCBudW1fZnJlZV9zcGNfbm90X2FjY3AsIAorCQkJCQkJICAgKHVuc2lnbmVkIGludCkgc3RhcnQsIAorCQkJCQkJICAgKHVuc2lnbmVkIGludCkgKHBvcyAtIHN0YXJ0KSkpOworCQkJCQkgCisJCQkJCSAvKiBNYXJrIHRoaXMgc3BhY2UgYXMgZGlydHkuIFdlIGFscmVhZHkgaGF2ZSBvdXIgZnJlZSBzcGFjZS4gKi8KKwkJCQkJIEQxKHByaW50aygiRGlydHkgc3BhY2U6IFN0YXJ0aW5nIDB4JXggZm9yIDB4JXggYnl0ZXNcbiIsCisJCQkJCQkgICAodW5zaWduZWQgaW50KSBzdGFydCwgKHVuc2lnbmVkIGludCkgKHBvcyAtIHN0YXJ0KSkpOworCQkJCQkgamZmc19mbWFsbG9jZWQoZm1jLCAoX191MzIpIHN0YXJ0LAorCQkJCQkJCShfX3UzMikgKHBvcyAtIHN0YXJ0KSwgTlVMTCk7CQkJCSAgICAgICAgICAgCisJCQkJIH0KKwkJCQkgCisJCQl9CisJCQlpZihudW1fZnJlZV9zcGFjZSA+IE5VTUZSRUVBTExPV0VEKXsKKwkJCSAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgImpmZnNfc2Nhbl9mbGFzaCgpOiBGb3VuZCBmcmVlIHNwYWNlICIKKwkJCQkJIm51bWJlciAlaS4gT25seSAlaSBmcmVlIHNwYWNlIGlzIGFsbG93ZWQuXG4iLAorCQkJCQludW1fZnJlZV9zcGFjZSwgTlVNRlJFRUFMTE9XRUQpOwkJCSAgICAgIAorCQkJfQorCQkJY29udGludWU7CisKKwkJY2FzZSBKRkZTX0RJUlRZX0JJVE1BU0s6CisJCQkvKiBXZSBoYXZlIGZvdW5kIDB4MDAwMDAwMDAgYXQgdGhpcyBwb3NpdGlvbi4gIFNjYW4gYXMgZmFyCisJCQkgICBhcyBwb3NzaWJsZSB0byBmaW5kIG91dCBob3cgbXVjaCBpcyBkaXJ0eS4gICovCisJCQlEMShwcmludGsoImpmZnNfc2Nhbl9mbGFzaCgpOiAweDAwMDAwMDAwIGF0IHBvcyAweCVseC5cbiIsCisJCQkJICAobG9uZylwb3MpKTsKKwkJCWZvciAoOyBwb3MgPCBlbmQKKwkJCSAgICAgICAmJiBKRkZTX0RJUlRZX0JJVE1BU0sgPT0gZmxhc2hfcmVhZF91MzIoZm1jLT5tdGQsIHBvcyk7CisJCQkgICAgIHBvcyArPSA0KTsKKwkJCUQxKHByaW50aygiamZmc19zY2FuX2ZsYXNoKCk6IDB4MDAgZW5kZWQgYXQgIgorCQkJCSAgInBvcyAweCVseC5cbiIsIChsb25nKXBvcykpOworCQkJamZmc19mbWFsbG9jZWQoZm1jLCAoX191MzIpIHN0YXJ0LAorCQkJCSAgICAgICAoX191MzIpIChwb3MgLSBzdGFydCksIE5VTEwpOworCQkJY29udGludWU7CisKKwkJY2FzZSBKRkZTX01BR0lDX0JJVE1BU0s6CisJCQkvKiBXZSBoYXZlIHByb2JhYmx5IGZvdW5kIGEgbmV3IHJhdyBpbm9kZS4gICovCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQliYWRfaW5vZGU6CisJCQkvKiBXZSdyZSBmKmNrZWQuICBUaGlzIGlzIG5vdCBzb2x2ZWQgeWV0LiAgV2UgaGF2ZQorCQkJICAgdG8gc2NhbiBmb3IgdGhlIG1hZ2ljIHBhdHRlcm4uICAqLworCQkJRDEocHJpbnRrKCIqKioqKioqKioqKioqKiogRGlydHkgZmxhc2ggbWVtb3J5IG9yICIKKwkJCQkgICJiYWQgaW5vZGU6ICIKKwkJCQkgICJoZXhkdW1wKHBvcyA9IDB4JWx4LCBsZW4gPSAxMjgpOlxuIiwKKwkJCQkgIChsb25nKXBvcykpOworCQkJRDEoamZmc19oZXhkdW1wKGZtYy0+bXRkLCBwb3MsIDEyOCkpOworCisJCQlmb3IgKHBvcyArPSA0OyBwb3MgPCBlbmQ7IHBvcyArPSA0KSB7CisJCQkJc3dpdGNoIChmbGFzaF9yZWFkX3UzMihmbWMtPm10ZCwgcG9zKSkgeworCQkJCWNhc2UgSkZGU19NQUdJQ19CSVRNQVNLOgorCQkJCWNhc2UgSkZGU19FTVBUWV9CSVRNQVNLOgorCQkJCQkvKiBoYW5kbGUgdGhlc2UgaW4gdGhlIG1haW4gc3dpdGNoKCkgbG9vcCAqLworCQkJCQlnb3RvIGNvbnRfc2NhbjsKKworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJY29udF9zY2FuOgorCQkJLyogRmlyc3QsIG1hcmsgYXMgZGlydHkgdGhlIHJlZ2lvbgorCQkJICAgd2hpY2ggcmVhbGx5IGRvZXMgY29udGFpbiBjcmFwLiAqLworCQkJamZmc19mbWFsbG9jZWQoZm1jLCAoX191MzIpIHN0YXJ0LAorCQkJCSAgICAgICAoX191MzIpIChwb3MgLSBzdGFydCksCisJCQkJICAgICAgIE5VTEwpOworCQkJCisJCQljb250aW51ZTsKKwkJfS8qIHN3aXRjaCAqLworCisJCS8qIFdlIGhhdmUgZm91bmQgdGhlIGJlZ2lubmluZyBvZiBhbiBpbm9kZS4gIENyZWF0ZSBhCisJCSAgIG5vZGUgZm9yIGl0IHVubGVzcyB0aGVyZSBhbHJlYWR5IGlzIG9uZSBhdmFpbGFibGUuICAqLworCQlpZiAoIW5vZGUpIHsKKwkJCWlmICghKG5vZGUgPSBqZmZzX2FsbG9jX25vZGUoKSkpIHsKKwkJCQkvKiBGcmVlIHJlYWQgYnVmZmVyICovCisJCQkJa2ZyZWUgKHJlYWRfYnVmKTsKKworCQkJCS8qIFJlbGVhc2UgdGhlIGZsYXNoIGRldmljZSAqLworCQkJCWZsYXNoX3NhZmVfcmVsZWFzZShmbWMtPm10ZCk7CisJCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlESk0obm9famZmc19ub2RlKyspOworCQl9CisKKwkJLyogUmVhZCB0aGUgbmV4dCByYXcgaW5vZGUuICAqLworCisJCWZsYXNoX3NhZmVfcmVhZChmbWMtPm10ZCwgcG9zLCAodV9jaGFyICopICZyYXdfaW5vZGUsCisJCQkJc2l6ZW9mKHN0cnVjdCBqZmZzX3Jhd19pbm9kZSkpOworCisJCS8qIFdoZW4gd2UgY29tcHV0ZSB0aGUgY2hlY2tzdW0gZm9yIHRoZSBpbm9kZSwgd2UgbmV2ZXIKKwkJICAgY291bnQgdGhlICdhY2N1cmF0ZScgb3IgdGhlICdjaGVja3N1bScgZmllbGRzLiAgKi8KKwkJdG1wX2FjY3VyYXRlID0gcmF3X2lub2RlLmFjY3VyYXRlOworCQl0bXBfY2hrc3VtID0gcmF3X2lub2RlLmNoa3N1bTsKKwkJcmF3X2lub2RlLmFjY3VyYXRlID0gMDsKKwkJcmF3X2lub2RlLmNoa3N1bSA9IDA7CisJCWNoZWNrc3VtID0gamZmc19jaGVja3N1bSgmcmF3X2lub2RlLAorCQkJCQkgc2l6ZW9mKHN0cnVjdCBqZmZzX3Jhd19pbm9kZSkpOworCQlyYXdfaW5vZGUuYWNjdXJhdGUgPSB0bXBfYWNjdXJhdGU7CisJCXJhd19pbm9kZS5jaGtzdW0gPSB0bXBfY2hrc3VtOworCisJCUQzKHByaW50aygiKioqIFdlIGhhdmUgZm91bmQgdGhpcyByYXcgaW5vZGUgYXQgcG9zIDB4JWx4ICIKKwkJCSAgIm9uIHRoZSBmbGFzaDpcbiIsIChsb25nKXBvcykpOworCQlEMyhqZmZzX3ByaW50X3Jhd19pbm9kZSgmcmF3X2lub2RlKSk7CisKKwkJaWYgKGNoZWNrc3VtICE9IHJhd19pbm9kZS5jaGtzdW0pIHsKKwkJCUQxKHByaW50aygiamZmc19zY2FuX2ZsYXNoKCk6IEJhZCBjaGVja3N1bTogIgorCQkJCSAgImNoZWNrc3VtID0gJXUsICIKKwkJCQkgICJyYXdfaW5vZGUuY2hrc3VtID0gJXVcbiIsCisJCQkJICBjaGVja3N1bSwgcmF3X2lub2RlLmNoa3N1bSkpOworCQkJcG9zICs9IHNpemVvZihzdHJ1Y3QgamZmc19yYXdfaW5vZGUpOworCQkJamZmc19mbWFsbG9jZWQoZm1jLCAoX191MzIpIHN0YXJ0LAorCQkJCSAgICAgICAoX191MzIpIChwb3MgLSBzdGFydCksIE5VTEwpOworCQkJLyogUmV1c2UgdGhpcyB1bnVzZWQgc3RydWN0IGpmZnNfbm9kZS4gICovCisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIENoZWNrIHRoZSByYXcgaW5vZGUgcmVhZCBzbyBmYXIuICBTdGFydCB3aXRoIHRoZQorCQkgICBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgZmlsZW5hbWUuICAqLworCQlpZiAocmF3X2lub2RlLm5zaXplID4gSkZGU19NQVhfTkFNRV9MRU4pIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImpmZnNfc2Nhbl9mbGFzaDogRm91bmQgYSAiCisJCQkgICAgICAgIkpGRlMgbm9kZSB3aXRoIG5hbWUgdG9vIGxhcmdlXG4iKTsKKwkJCWdvdG8gYmFkX2lub2RlOworCQl9CisKKwkJaWYgKHJhd19pbm9kZS5yZW5hbWUgJiYgcmF3X2lub2RlLmRzaXplICE9IHNpemVvZihfX3UzMikpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImpmZnNfc2Nhbl9mbGFzaDogRm91bmQgYSAiCisJCQkgICAgICAgInJlbmFtZSBub2RlIHdpdGggZHNpemUgJXUuXG4iLAorCQkJICAgICAgIHJhd19pbm9kZS5kc2l6ZSk7CisJCQlqZmZzX3ByaW50X3Jhd19pbm9kZSgmcmF3X2lub2RlKTsKKwkJCWdvdG8gYmFkX2lub2RlOworCQl9CisKKwkJLyogVGhlIG5vZGUncyBkYXRhIHNlZ21lbnQgc2hvdWxkIG5vdCBleGNlZWQgYQorCQkgICBjZXJ0YWluIGxlbmd0aC4gICovCisJCWlmIChyYXdfaW5vZGUuZHNpemUgPiBmbWMtPm1heF9jaHVua19zaXplKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJqZmZzX3NjYW5fZmxhc2g6IEZvdW5kIGEgIgorCQkJICAgICAgICJKRkZTIG5vZGUgd2l0aCBkc2l6ZSAoMHgleCkgPiBtYXhfY2h1bmtfc2l6ZSAoMHgleClcbiIsCisJCQkgICAgICAgcmF3X2lub2RlLmRzaXplLCBmbWMtPm1heF9jaHVua19zaXplKTsKKwkJCWdvdG8gYmFkX2lub2RlOworCQl9CisKKwkJcG9zICs9IHNpemVvZihzdHJ1Y3QgamZmc19yYXdfaW5vZGUpOworCisJCS8qIFRoaXMgc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSBiZWNhdXNlIGEgbm9kZSB0aGF0CisJCSAgIHZpb2xhdGVzIHRoZSBmbGFzaCBib3VuZGFyaWVzIHNob3VsZG4ndCBiZSB3cml0dGVuCisJCSAgIGluIHRoZSBmaXJzdCBwbGFjZS4gKi8KKwkJaWYgKHBvcyA+PSBlbmQpIHsKKwkJCWdvdG8gY2hlY2tfbm9kZTsKKwkJfQorCisJCS8qIFJlYWQgdGhlIG5hbWUuICAqLworCQkqbmFtZSA9IDA7CisJCWlmIChyYXdfaW5vZGUubnNpemUpIHsKKwkJICAgICAgICBmbGFzaF9zYWZlX3JlYWQoZm1jLT5tdGQsIHBvcywgbmFtZSwgcmF3X2lub2RlLm5zaXplKTsKKwkJCW5hbWVbcmF3X2lub2RlLm5zaXplXSA9ICdcMCc7CisJCQlwb3MgKz0gcmF3X2lub2RlLm5zaXplCisJCQkgICAgICAgKyBKRkZTX0dFVF9QQURfQllURVMocmF3X2lub2RlLm5zaXplKTsKKwkJCUQzKHByaW50aygibmFtZSA9PSBcIiVzXCJcbiIsIG5hbWUpKTsKKwkJCWNoZWNrc3VtID0gamZmc19jaGVja3N1bShuYW1lLCByYXdfaW5vZGUubnNpemUpOworCQkJaWYgKGNoZWNrc3VtICE9IHJhd19pbm9kZS5uY2hrc3VtKSB7CisJCQkJRDEocHJpbnRrKCJqZmZzX3NjYW5fZmxhc2goKTogQmFkIGNoZWNrc3VtOiAiCisJCQkJCSAgImNoZWNrc3VtID0gJXUsICIKKwkJCQkJICAicmF3X2lub2RlLm5jaGtzdW0gPSAldVxuIiwKKwkJCQkJICBjaGVja3N1bSwgcmF3X2lub2RlLm5jaGtzdW0pKTsKKwkJCQlqZmZzX2ZtYWxsb2NlZChmbWMsIChfX3UzMikgc3RhcnQsCisJCQkJCSAgICAgICAoX191MzIpIChwb3MgLSBzdGFydCksIE5VTEwpOworCQkJCS8qIFJldXNlIHRoaXMgdW51c2VkIHN0cnVjdCBqZmZzX25vZGUuICAqLworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKHBvcyA+PSBlbmQpIHsKKwkJCQlnb3RvIGNoZWNrX25vZGU7CisJCQl9CisJCX0KKworCQkvKiBSZWFkIHRoZSBkYXRhLCBpZiBpdCBleGlzdHMsIGluIG9yZGVyIHRvIGJlIHN1cmUgaXQKKwkJICAgbWF0Y2hlcyB0aGUgY2hlY2tzdW0uICAqLworCQlpZiAocmF3X2lub2RlLmRzaXplKSB7CisJCQlpZiAocmF3X2lub2RlLnJlbmFtZSkgeworCQkJCWRlbGV0ZWRfZmlsZSA9IGZsYXNoX3JlYWRfdTMyKGZtYy0+bXRkLCBwb3MpOworCQkJfQorCQkJaWYgKGpmZnNfY2hlY2tzdW1fZmxhc2goZm1jLT5tdGQsIHBvcywgcmF3X2lub2RlLmRzaXplLCAmY2hlY2tzdW0pKSB7CisJCQkJcHJpbnRrKCJqZmZzX2NoZWNrc3VtX2ZsYXNoKCkgZmFpbGVkIHRvIGNhbGN1bGF0ZSBhIGNoZWNrc3VtXG4iKTsKKwkJCQlqZmZzX2ZtYWxsb2NlZChmbWMsIChfX3UzMikgc3RhcnQsCisJCQkJCSAgICAgICAoX191MzIpIChwb3MgLSBzdGFydCksIE5VTEwpOworCQkJCS8qIFJldXNlIHRoaXMgdW51c2VkIHN0cnVjdCBqZmZzX25vZGUuICAqLworCQkJCWNvbnRpbnVlOworCQkJfQkJCQkKKwkJCXBvcyArPSByYXdfaW5vZGUuZHNpemUKKwkJCSAgICAgICArIEpGRlNfR0VUX1BBRF9CWVRFUyhyYXdfaW5vZGUuZHNpemUpOworCisJCQlpZiAoY2hlY2tzdW0gIT0gcmF3X2lub2RlLmRjaGtzdW0pIHsKKwkJCQlEMShwcmludGsoImpmZnNfc2Nhbl9mbGFzaCgpOiBCYWQgY2hlY2tzdW06ICIKKwkJCQkJICAiY2hlY2tzdW0gPSAldSwgIgorCQkJCQkgICJyYXdfaW5vZGUuZGNoa3N1bSA9ICV1XG4iLAorCQkJCQkgIGNoZWNrc3VtLCByYXdfaW5vZGUuZGNoa3N1bSkpOworCQkJCWpmZnNfZm1hbGxvY2VkKGZtYywgKF9fdTMyKSBzdGFydCwKKwkJCQkJICAgICAgIChfX3UzMikgKHBvcyAtIHN0YXJ0KSwgTlVMTCk7CisJCQkJLyogUmV1c2UgdGhpcyB1bnVzZWQgc3RydWN0IGpmZnNfbm9kZS4gICovCisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQljaGVja19ub2RlOgorCisJCS8qIFJlbWVtYmVyIHRoZSBoaWdoZXN0IGlub2RlIG51bWJlciBpbiB0aGUgd2hvbGUgZmlsZQorCQkgICBzeXN0ZW0uICBUaGlzIGluZm9ybWF0aW9uIHdpbGwgYmUgdXNlZCB3aGVuIGFzc2lnbmluZworCQkgICBuZXcgZmlsZXMgbmV3IGlub2RlIG51bWJlcnMuICAqLworCQlpZiAoYy0+bmV4dF9pbm8gPD0gcmF3X2lub2RlLmlubykgeworCQkJYy0+bmV4dF9pbm8gPSByYXdfaW5vZGUuaW5vICsgMTsKKwkJfQorCisJCWlmIChyYXdfaW5vZGUuYWNjdXJhdGUpIHsKKwkJCWludCBlcnI7CisJCQlub2RlLT5kYXRhX29mZnNldCA9IHJhd19pbm9kZS5vZmZzZXQ7CisJCQlub2RlLT5kYXRhX3NpemUgPSByYXdfaW5vZGUuZHNpemU7CisJCQlub2RlLT5yZW1vdmVkX3NpemUgPSByYXdfaW5vZGUucnNpemU7CisJCQkvKiBDb21wdXRlIHRoZSBvZmZzZXQgdG8gdGhlIGFjdHVhbCBkYXRhIGluIHRoZQorCQkJICAgb24tZmxhc2ggbm9kZS4gICovCisJCQlub2RlLT5mbV9vZmZzZXQKKwkJCT0gc2l6ZW9mKHN0cnVjdCBqZmZzX3Jhd19pbm9kZSkKKwkJCSAgKyByYXdfaW5vZGUubnNpemUKKwkJCSAgKyBKRkZTX0dFVF9QQURfQllURVMocmF3X2lub2RlLm5zaXplKTsKKwkJCW5vZGUtPmZtID0gamZmc19mbWFsbG9jZWQoZm1jLCAoX191MzIpIHN0YXJ0LAorCQkJCQkJICAoX191MzIpIChwb3MgLSBzdGFydCksCisJCQkJCQkgIG5vZGUpOworCQkJaWYgKCFub2RlLT5mbSkgeworCQkJCUQocHJpbnRrKCJqZmZzX3NjYW5fZmxhc2goKTogIW5vZGUtPmZtXG4iKSk7CisJCQkJamZmc19mcmVlX25vZGUobm9kZSk7CisJCQkJREpNKG5vX2pmZnNfbm9kZS0tKTsKKworCQkJCS8qIEZyZWUgcmVhZCBidWZmZXIgKi8KKwkJCQlrZnJlZSAocmVhZF9idWYpOworCisJCQkJLyogUmVsZWFzZSB0aGUgZmxhc2ggZGV2aWNlICovCisJCQkJZmxhc2hfc2FmZV9yZWxlYXNlKGZtYy0+bXRkKTsKKworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJaWYgKChlcnIgPSBqZmZzX2luc2VydF9ub2RlKGMsIE5VTEwsICZyYXdfaW5vZGUsCisJCQkJCQkgICAgbmFtZSwgbm9kZSkpIDwgMCkgeworCQkJCXByaW50aygiSkZGUzogRmFpbGVkIHRvIGhhbmRsZSByYXcgaW5vZGUuICIKKwkJCQkgICAgICAgIihlcnIgPSAlZClcbiIsIGVycik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAocmF3X2lub2RlLnJlbmFtZSkgeworCQkJCXN0cnVjdCBqZmZzX2RlbGV0ZV9saXN0ICpkbAorCQkJCT0gKHN0cnVjdCBqZmZzX2RlbGV0ZV9saXN0ICopCisJCQkJICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgamZmc19kZWxldGVfbGlzdCksCisJCQkJCSAgR0ZQX0tFUk5FTCk7CisJCQkJaWYgKCFkbCkgeworCQkJCQlEKHByaW50aygiamZmc19zY2FuX2ZsYXNoOiAhZGxcbiIpKTsKKwkJCQkJamZmc19mcmVlX25vZGUobm9kZSk7CisJCQkJCURKTShub19qZmZzX25vZGUtLSk7CisKKwkJCQkJLyogUmVsZWFzZSB0aGUgZmxhc2ggZGV2aWNlICovCisJCQkJCWZsYXNoX3NhZmVfcmVsZWFzZShmbWMtPmZsYXNoX3BhcnQpOworCisJCQkJCS8qIEZyZWUgcmVhZCBidWZmZXIgKi8KKwkJCQkJa2ZyZWUgKHJlYWRfYnVmKTsKKworCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQl9CisJCQkJZGwtPmlubyA9IGRlbGV0ZWRfZmlsZTsKKwkJCQlkbC0+bmV4dCA9IGMtPmRlbGV0ZV9saXN0OworCQkJCWMtPmRlbGV0ZV9saXN0ID0gZGw7CisJCQkJbm9kZS0+ZGF0YV9zaXplID0gMDsKKwkJCX0KKwkJCUQzKGpmZnNfcHJpbnRfbm9kZShub2RlKSk7CisJCQlub2RlID0gTlVMTDsgLyogRG9uJ3QgZnJlZSB0aGUgbm9kZSEgICovCisJCX0KKwkJZWxzZSB7CisJCQlqZmZzX2ZtYWxsb2NlZChmbWMsIChfX3UzMikgc3RhcnQsCisJCQkJICAgICAgIChfX3UzMikgKHBvcyAtIHN0YXJ0KSwgTlVMTCk7CisJCQlEMyhwcmludGsoImpmZnNfc2Nhbl9mbGFzaCgpOiBKdXN0IGZvdW5kIGFuIG9ic29sZXRlICIKKwkJCQkgICJyYXdfaW5vZGUuIENvbnRpbnVpbmcgdGhlIHNjYW4uLi5cbiIpKTsKKwkJCS8qIFJldXNlIHRoaXMgdW51c2VkIHN0cnVjdCBqZmZzX25vZGUuICAqLworCQl9CisJfQorCisJaWYgKG5vZGUpIHsKKwkJamZmc19mcmVlX25vZGUobm9kZSk7CisJCURKTShub19qZmZzX25vZGUtLSk7CisJfQorCWpmZnNfYnVpbGRfZW5kKGZtYyk7CisKKwkvKiBGcmVlIHJlYWQgYnVmZmVyICovCisJa2ZyZWUgKHJlYWRfYnVmKTsKKworCWlmKCFudW1fZnJlZV9zcGFjZSl7CisJICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJqZmZzX3NjYW5fZmxhc2goKTogRGlkIG5vdCBmaW5kIGV2ZW4gYSBzaW5nbGUgIgorCQkgICAgICAgImNodW5rIG9mIGZyZWUgc3BhY2UuIFRoaXMgaXMgQkFEIVxuIik7CisJfQorCisJLyogUmV0dXJuIGhhcHB5ICovCisJRDMocHJpbnRrKCJqZmZzX3NjYW5fZmxhc2goKTogTGVhdmluZy4uLlxuIikpOworCWZsYXNoX3NhZmVfcmVsZWFzZShmbWMtPm10ZCk7CisKKwkvKiBUaGlzIGlzIHRvIHRyYXAgdGhlICJmcmVlIHNpemUgYWNjb3VudGluZyBzY3Jld2VkIGVycm9yLiAqLworCWZyZWVfY2h1bmtfc2l6ZTEgPSBqZmZzX2ZyZWVfc2l6ZTEoZm1jKTsKKwlmcmVlX2NodW5rX3NpemUyID0gamZmc19mcmVlX3NpemUyKGZtYyk7CisKKwlpZiAoZnJlZV9jaHVua19zaXplMSArIGZyZWVfY2h1bmtfc2l6ZTIgIT0gZm1jLT5mcmVlX3NpemUpIHsKKworCQlwcmludGsoS0VSTl9XQVJOSU5HICJqZmZzX3NjYW5fZmFsc2goKTpGcmVlIHNpemUgYWNjb3VudGluZyBzY3Jld2VkXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiamZmZnNfc2Nhbl9mbGFzaCgpOmZyZWVfY2h1bmtfc2l6ZTEgPT0gMHgleCwgIgorCQkgICAgICAgImZyZWVfY2h1bmtfc2l6ZTIgPT0gMHgleCwgZm1jLT5mcmVlX3NpemUgPT0gMHgleFxuIiwgCisJCSAgICAgICBmcmVlX2NodW5rX3NpemUxLCBmcmVlX2NodW5rX3NpemUyLCBmbWMtPmZyZWVfc2l6ZSk7CisKKwkJcmV0dXJuIC0xOyAvKiBEbyBOT1QgbW91bnQgZi9zIHNvIHRoYXQgd2UgY2FuIGluc3BlY3Qgd2hhdCBoYXBwZW5lZC4KKwkJCSAgICAgIE1vdW50aW5nIHRoaXMgIHNjcmV3ZWQgdXAgZi9zIHdpbGwgc2NyZXcgdXMgdXAgYW55d2F5LgorCQkJICAgICovCisJfQkKKworCXJldHVybiAwOyAvKiBhcyBmYXIgYXMgd2UgYXJlIGNvbmNlcm5lZCwgd2UgYXJlIGhhcHB5ISAqLworfSAvKiBqZmZzX3NjYW5fZmxhc2goKSAgKi8KKworCisvKiBJbnNlcnQgYW55IGtpbmQgb2Ygbm9kZSBpbnRvIHRoZSBmaWxlIHN5c3RlbS4gIFRha2UgY2FyZSBvZiBkYXRhCisgICBpbnNlcnRpb25zIGFuZCBkZWxldGlvbnMuICBBbHNvIHJlbW92ZSByZWR1bmRhbnQgaW5mb3JtYXRpb24uIFRoZQorICAgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIGBuYW1lJyBpcyByZWdhcmRlZCBhcyAiZ2l2ZW4gYXdheSIgaW4gdGhlCisgICBjYWxsZXIncyBwZXJzcGVjdGl2ZS4gICovCitpbnQKK2pmZnNfaW5zZXJ0X25vZGUoc3RydWN0IGpmZnNfY29udHJvbCAqYywgc3RydWN0IGpmZnNfZmlsZSAqZiwKKwkJIGNvbnN0IHN0cnVjdCBqZmZzX3Jhd19pbm9kZSAqcmF3X2lub2RlLAorCQkgY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGpmZnNfbm9kZSAqbm9kZSkKK3sKKwlpbnQgdXBkYXRlX25hbWUgPSAwOworCWludCBpbnNlcnRfaW50b190cmVlID0gMDsKKworCUQyKHByaW50aygiamZmc19pbnNlcnRfbm9kZSgpOiBpbm8gPSAldSwgdmVyc2lvbiA9ICV1LCAiCisJCSAgIm5hbWUgPSBcIiVzXCIsIGRlbGV0ZWQgPSAlZFxuIiwKKwkJICByYXdfaW5vZGUtPmlubywgcmF3X2lub2RlLT52ZXJzaW9uLAorCQkgICgobmFtZSAmJiAqbmFtZSkgPyBuYW1lIDogIiIpLCByYXdfaW5vZGUtPmRlbGV0ZWQpKTsKKworCS8qIElmIHRoZXJlIGRvZXNuJ3QgZXhpc3QgYW4gYXNzb2NpYXRlZCBqZmZzX2ZpbGUsIHRoZW4KKwkgICBjcmVhdGUsIGluaXRpYWxpemUgYW5kIGluc2VydCBvbmUgaW50byB0aGUgZmlsZSBzeXN0ZW0uICAqLworCWlmICghZiAmJiAhKGYgPSBqZmZzX2ZpbmRfZmlsZShjLCByYXdfaW5vZGUtPmlubykpKSB7CisJCWlmICghKGYgPSBqZmZzX2NyZWF0ZV9maWxlKGMsIHJhd19pbm9kZSkpKSB7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlqZmZzX2luc2VydF9maWxlX2ludG9faGFzaChmKTsKKwkJaW5zZXJ0X2ludG9fdHJlZSA9IDE7CisJfQorCW5vZGUtPmlubyA9IHJhd19pbm9kZS0+aW5vOworCW5vZGUtPnZlcnNpb24gPSByYXdfaW5vZGUtPnZlcnNpb247CisJbm9kZS0+ZGF0YV9zaXplID0gcmF3X2lub2RlLT5kc2l6ZTsKKwlub2RlLT5mbV9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IGpmZnNfcmF3X2lub2RlKSArIHJhd19pbm9kZS0+bnNpemUKKwkJCSAgKyBKRkZTX0dFVF9QQURfQllURVMocmF3X2lub2RlLT5uc2l6ZSk7CisJbm9kZS0+bmFtZV9zaXplID0gcmF3X2lub2RlLT5uc2l6ZTsKKworCS8qIE5vdyBpbnNlcnQgdGhlIG5vZGUgYXQgdGhlIGNvcnJlY3QgcG9zaXRpb24gaW50byB0aGUgZmlsZSdzCisJICAgdmVyc2lvbiBsaXN0LiAgKi8KKwlpZiAoIWYtPnZlcnNpb25faGVhZCkgeworCQkvKiBUaGlzIGlzIHRoZSBmaXJzdCBub2RlLiAgKi8KKwkJZi0+dmVyc2lvbl9oZWFkID0gbm9kZTsKKwkJZi0+dmVyc2lvbl90YWlsID0gbm9kZTsKKwkJbm9kZS0+dmVyc2lvbl9wcmV2ID0gTlVMTDsKKwkJbm9kZS0+dmVyc2lvbl9uZXh0ID0gTlVMTDsKKwkJZi0+aGlnaGVzdF92ZXJzaW9uID0gbm9kZS0+dmVyc2lvbjsKKwkJdXBkYXRlX25hbWUgPSAxOworCQlmLT5tb2RlID0gcmF3X2lub2RlLT5tb2RlOworCQlmLT51aWQgPSByYXdfaW5vZGUtPnVpZDsKKwkJZi0+Z2lkID0gcmF3X2lub2RlLT5naWQ7CisJCWYtPmF0aW1lID0gcmF3X2lub2RlLT5hdGltZTsKKwkJZi0+bXRpbWUgPSByYXdfaW5vZGUtPm10aW1lOworCQlmLT5jdGltZSA9IHJhd19pbm9kZS0+Y3RpbWU7CisJfQorCWVsc2UgaWYgKChmLT5oaWdoZXN0X3ZlcnNpb24gPCBub2RlLT52ZXJzaW9uKQorCQkgfHwgKG5vZGUtPnZlcnNpb24gPT0gMCkpIHsKKwkJLyogSW5zZXJ0IGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QuICBJLmUuIHRoaXMgbm9kZSBpcyB0aGUKKwkJICAgbmV3ZXN0IG9uZSBzbyBmYXIuICAqLworCQlub2RlLT52ZXJzaW9uX3ByZXYgPSBmLT52ZXJzaW9uX3RhaWw7CisJCW5vZGUtPnZlcnNpb25fbmV4dCA9IE5VTEw7CisJCWYtPnZlcnNpb25fdGFpbC0+dmVyc2lvbl9uZXh0ID0gbm9kZTsKKwkJZi0+dmVyc2lvbl90YWlsID0gbm9kZTsKKwkJZi0+aGlnaGVzdF92ZXJzaW9uID0gbm9kZS0+dmVyc2lvbjsKKwkJdXBkYXRlX25hbWUgPSAxOworCQlmLT5waW5vID0gcmF3X2lub2RlLT5waW5vOworCQlmLT5tb2RlID0gcmF3X2lub2RlLT5tb2RlOworCQlmLT51aWQgPSByYXdfaW5vZGUtPnVpZDsKKwkJZi0+Z2lkID0gcmF3X2lub2RlLT5naWQ7CisJCWYtPmF0aW1lID0gcmF3X2lub2RlLT5hdGltZTsKKwkJZi0+bXRpbWUgPSByYXdfaW5vZGUtPm10aW1lOworCQlmLT5jdGltZSA9IHJhd19pbm9kZS0+Y3RpbWU7CisJfQorCWVsc2UgaWYgKGYtPnZlcnNpb25faGVhZC0+dmVyc2lvbiA+IG5vZGUtPnZlcnNpb24pIHsKKwkJLyogSW5zZXJ0IGF0IHRoZSBib3R0b20gb2YgdGhlIGxpc3QuICAqLworCQlub2RlLT52ZXJzaW9uX3ByZXYgPSBOVUxMOworCQlub2RlLT52ZXJzaW9uX25leHQgPSBmLT52ZXJzaW9uX2hlYWQ7CisJCWYtPnZlcnNpb25faGVhZC0+dmVyc2lvbl9wcmV2ID0gbm9kZTsKKwkJZi0+dmVyc2lvbl9oZWFkID0gbm9kZTsKKwkJaWYgKCFmLT5uYW1lKSB7CisJCQl1cGRhdGVfbmFtZSA9IDE7CisJCX0KKwl9CisJZWxzZSB7CisJCXN0cnVjdCBqZmZzX25vZGUgKm47CisJCWludCBuZXdlcl9uYW1lID0gMDsKKwkJLyogU2VhcmNoIGZvciB0aGUgaW5zZXJ0aW9uIHBvc2l0aW9uIHN0YXJ0aW5nIGZyb20KKwkJICAgdGhlIHRhaWwgKG5ld2VzdCBub2RlKS4gICovCisJCWZvciAobiA9IGYtPnZlcnNpb25fdGFpbDsgbjsgbiA9IG4tPnZlcnNpb25fcHJldikgeworCQkJaWYgKG4tPnZlcnNpb24gPCBub2RlLT52ZXJzaW9uKSB7CisJCQkJbm9kZS0+dmVyc2lvbl9wcmV2ID0gbjsKKwkJCQlub2RlLT52ZXJzaW9uX25leHQgPSBuLT52ZXJzaW9uX25leHQ7CisJCQkJbm9kZS0+dmVyc2lvbl9uZXh0LT52ZXJzaW9uX3ByZXYgPSBub2RlOworCQkJCW4tPnZlcnNpb25fbmV4dCA9IG5vZGU7CisJCQkJaWYgKCFuZXdlcl9uYW1lKSB7CisJCQkJCXVwZGF0ZV9uYW1lID0gMTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAobi0+bmFtZV9zaXplKSB7CisJCQkJbmV3ZXJfbmFtZSA9IDE7CisJCQl9CisJCX0KKwl9CisKKwkvKiBEZWxldGlvbiBpcyBpcnJldmVyc2libGUuIElmIGFueSAnZGVsZXRlZCcgbm9kZSBpcyBldmVyCisJICAgd3JpdHRlbiwgdGhlIGZpbGUgaXMgZGVsZXRlZCAqLworCWlmIChyYXdfaW5vZGUtPmRlbGV0ZWQpCisJCWYtPmRlbGV0ZWQgPSByYXdfaW5vZGUtPmRlbGV0ZWQ7CisKKwkvKiBQZXJoYXBzIHVwZGF0ZSB0aGUgbmFtZS4gICovCisJaWYgKHJhd19pbm9kZS0+bnNpemUgJiYgdXBkYXRlX25hbWUgJiYgbmFtZSAmJiAqbmFtZSAmJiAobmFtZSAhPSBmLT5uYW1lKSkgeworCQlpZiAoZi0+bmFtZSkgeworCQkJa2ZyZWUoZi0+bmFtZSk7CisJCQlESk0obm9fbmFtZS0tKTsKKwkJfQorCQlpZiAoIShmLT5uYW1lID0gKGNoYXIgKikga21hbGxvYyhyYXdfaW5vZGUtPm5zaXplICsgMSwKKwkJCQkJCSBHRlBfS0VSTkVMKSkpIHsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCURKTShub19uYW1lKyspOworCQltZW1jcHkoZi0+bmFtZSwgbmFtZSwgcmF3X2lub2RlLT5uc2l6ZSk7CisJCWYtPm5hbWVbcmF3X2lub2RlLT5uc2l6ZV0gPSAnXDAnOworCQlmLT5uc2l6ZSA9IHJhd19pbm9kZS0+bnNpemU7CisJCUQzKHByaW50aygiamZmc19pbnNlcnRfbm9kZSgpOiBVcGRhdGVkIHRoZSBuYW1lIG9mICIKKwkJCSAgInRoZSBmaWxlIHRvIFwiJXNcIi5cbiIsIG5hbWUpKTsKKwl9CisKKwlpZiAoIWMtPmJ1aWxkaW5nX2ZzKSB7CisJCUQzKHByaW50aygiamZmc19pbnNlcnRfbm9kZSgpOiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisJCQkgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDFcbiIpKTsKKwkJaWYgKGluc2VydF9pbnRvX3RyZWUpIHsKKwkJCWpmZnNfaW5zZXJ0X2ZpbGVfaW50b190cmVlKGYpOworCQl9CisJCS8qIE9uY2UgdXBvbiBhIHRpbWUsIHdlIHdvdWxkIGNhbGwgamZmc19wb3NzaWJseV9kZWxldGVfZmlsZSgpCisJCSAgIGhlcmUuIFRoYXQgY2F1c2VzIGFuIG9vcHMgaWYgc29tZW9uZSdzIHN0aWxsIGdvdCB0aGUgZmlsZQorCQkgICBvcGVuLCBzbyBub3cgd2Ugb25seSBkbyBpdCBpbiBqZmZzX2RlbGV0ZV9pbm9kZSgpCisJCSAgIC0tIGR3bXcyCisJCSovCisJCWlmIChub2RlLT5kYXRhX3NpemUgfHwgbm9kZS0+cmVtb3ZlZF9zaXplKSB7CisJCQlqZmZzX3VwZGF0ZV9maWxlKGYsIG5vZGUpOworCQl9CisJCWpmZnNfcmVtb3ZlX3JlZHVuZGFudF9ub2RlcyhmKTsKKworCQlqZmZzX2dhcmJhZ2VfY29sbGVjdF90cmlnZ2VyKGMpOworCisJCUQzKHByaW50aygiamZmc19pbnNlcnRfbm9kZSgpOiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCisJCQkgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIDJcbiIpKTsKKwl9CisKKwlyZXR1cm4gMDsKK30gLyogamZmc19pbnNlcnRfbm9kZSgpICAqLworCisKKy8qIFVubGluayBhIGpmZnNfbm9kZSBmcm9tIHRoZSB2ZXJzaW9uIGxpc3QgaXQgaXMgaW4uICAqLworc3RhdGljIGlubGluZSB2b2lkCitqZmZzX3VubGlua19ub2RlX2Zyb21fdmVyc2lvbl9saXN0KHN0cnVjdCBqZmZzX2ZpbGUgKmYsCisJCQkJICAgc3RydWN0IGpmZnNfbm9kZSAqbm9kZSkKK3sKKwlpZiAobm9kZS0+dmVyc2lvbl9wcmV2KSB7CisJCW5vZGUtPnZlcnNpb25fcHJldi0+dmVyc2lvbl9uZXh0ID0gbm9kZS0+dmVyc2lvbl9uZXh0OworCX0gZWxzZSB7CisJCWYtPnZlcnNpb25faGVhZCA9IG5vZGUtPnZlcnNpb25fbmV4dDsKKwl9CisJaWYgKG5vZGUtPnZlcnNpb25fbmV4dCkgeworCQlub2RlLT52ZXJzaW9uX25leHQtPnZlcnNpb25fcHJldiA9IG5vZGUtPnZlcnNpb25fcHJldjsKKwl9IGVsc2UgeworCQlmLT52ZXJzaW9uX3RhaWwgPSBub2RlLT52ZXJzaW9uX3ByZXY7CisJfQorfQorCisKKy8qIFVubGluayBhIGpmZnNfbm9kZSBmcm9tIHRoZSByYW5nZSBsaXN0IGl0IGlzIGluLiAgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAoramZmc191bmxpbmtfbm9kZV9mcm9tX3JhbmdlX2xpc3Qoc3RydWN0IGpmZnNfZmlsZSAqZiwgc3RydWN0IGpmZnNfbm9kZSAqbm9kZSkKK3sKKwlpZiAobm9kZS0+cmFuZ2VfcHJldikgeworCQlub2RlLT5yYW5nZV9wcmV2LT5yYW5nZV9uZXh0ID0gbm9kZS0+cmFuZ2VfbmV4dDsKKwl9CisJZWxzZSB7CisJCWYtPnJhbmdlX2hlYWQgPSBub2RlLT5yYW5nZV9uZXh0OworCX0KKwlpZiAobm9kZS0+cmFuZ2VfbmV4dCkgeworCQlub2RlLT5yYW5nZV9uZXh0LT5yYW5nZV9wcmV2ID0gbm9kZS0+cmFuZ2VfcHJldjsKKwl9CisJZWxzZSB7CisJCWYtPnJhbmdlX3RhaWwgPSBub2RlLT5yYW5nZV9wcmV2OworCX0KK30KKworCisvKiBGdW5jdGlvbiB1c2VkIGJ5IGpmZnNfcmVtb3ZlX3JlZHVuZGFudF9ub2RlcygpIGJlbG93LiAgVGhpcyBmdW5jdGlvbgorICAgY2xhc3NpZmllcyB3aGF0IGtpbmQgb2YgaW5mb3JtYXRpb24gYSBub2RlIGFkZHMgdG8gYSBmaWxlLiAgKi8KK3N0YXRpYyBpbmxpbmUgX191OAoramZmc19jbGFzc2lmeV9ub2RlKHN0cnVjdCBqZmZzX25vZGUgKm5vZGUpCit7CisJX191OCBtb2RfdHlwZSA9IEpGRlNfTU9ESUZZX0lOT0RFOworCisJaWYgKG5vZGUtPm5hbWVfc2l6ZSkgeworCQltb2RfdHlwZSB8PSBKRkZTX01PRElGWV9OQU1FOworCX0KKwlpZiAobm9kZS0+ZGF0YV9zaXplIHx8IG5vZGUtPnJlbW92ZWRfc2l6ZSkgeworCQltb2RfdHlwZSB8PSBKRkZTX01PRElGWV9EQVRBOworCX0KKwlyZXR1cm4gbW9kX3R5cGU7Cit9CisKKworLyogUmVtb3ZlIHJlZHVuZGFudCBub2RlcyBmcm9tIGEgZmlsZS4gIE1hcmsgdGhlIG9uLWZsYXNoIG1lbW9yeQorICAgYXMgZGlydHkuICAqLworc3RhdGljIGludAoramZmc19yZW1vdmVfcmVkdW5kYW50X25vZGVzKHN0cnVjdCBqZmZzX2ZpbGUgKmYpCit7CisJc3RydWN0IGpmZnNfbm9kZSAqbmV3ZXN0X25vZGU7CisJc3RydWN0IGpmZnNfbm9kZSAqY3VyOworCXN0cnVjdCBqZmZzX25vZGUgKnByZXY7CisJX191OCBuZXdlc3RfdHlwZTsKKwlfX3U4IG1vZF90eXBlOworCV9fdTggbm9kZV93aXRoX25hbWVfbGF0ZXIgPSAwOworCisJaWYgKCEobmV3ZXN0X25vZGUgPSBmLT52ZXJzaW9uX3RhaWwpKSB7CisJCXJldHVybiAwOworCX0KKworCS8qIFdoYXQgZG9lcyB0aGUgYG5ld2VzdF9ub2RlJyBtb2RpZnk/ICAqLworCW5ld2VzdF90eXBlID0gamZmc19jbGFzc2lmeV9ub2RlKG5ld2VzdF9ub2RlKTsKKwlub2RlX3dpdGhfbmFtZV9sYXRlciA9IG5ld2VzdF90eXBlICYgSkZGU19NT0RJRllfTkFNRTsKKworCUQzKHByaW50aygiamZmc19yZW1vdmVfcmVkdW5kYW50X25vZGVzKCk6IGlubzogJXUsIG5hbWU6IFwiJXNcIiwgIgorCQkgICJuZXdlc3RfdHlwZTogJXVcbiIsIGYtPmlubywgKGYtPm5hbWUgPyBmLT5uYW1lIDogIiIpLAorCQkgIG5ld2VzdF90eXBlKSk7CisKKwkvKiBUcmF2ZXJzZSB0aGUgZmlsZSdzIG5vZGVzIGFuZCBkZXRlcm1pbmUgd2hpY2ggb2YgdGhlbSB0aGF0IGFyZQorCSAgIHN1cGVyZmx1b3VzLiAgWWVhaCwgdGhpcyBtaWdodCBsb29rIHZlcnkgY29tcGxleCBhdCBmaXJzdAorCSAgIGdsYW5jZSBidXQgaXQgaXMgYWN0dWFsbHkgdmVyeSBzaW1wbGUuICAqLworCWZvciAoY3VyID0gbmV3ZXN0X25vZGUtPnZlcnNpb25fcHJldjsgY3VyOyBjdXIgPSBwcmV2KSB7CisJCXByZXYgPSBjdXItPnZlcnNpb25fcHJldjsKKwkJbW9kX3R5cGUgPSBqZmZzX2NsYXNzaWZ5X25vZGUoY3VyKTsKKwkJaWYgKChtb2RfdHlwZSA8PSBKRkZTX01PRElGWV9JTk9ERSkKKwkJICAgIHx8ICgobmV3ZXN0X3R5cGUgJiBKRkZTX01PRElGWV9OQU1FKQorCQkJJiYgKG1vZF90eXBlCisJCQkgICAgPD0gKEpGRlNfTU9ESUZZX0lOT0RFICsgSkZGU19NT0RJRllfTkFNRSkpKQorCQkgICAgfHwgKGN1ci0+ZGF0YV9zaXplID09IDAgJiYgY3VyLT5yZW1vdmVkX3NpemUKKwkJCSYmICFjdXItPnZlcnNpb25fcHJldiAmJiBub2RlX3dpdGhfbmFtZV9sYXRlcikpIHsKKwkJCS8qIFllcywgdGhpcyBub2RlIGlzIHJlZHVuZGFudC4gUmVtb3ZlIGl0LiAgKi8KKwkJCUQyKHByaW50aygiamZmc19yZW1vdmVfcmVkdW5kYW50X25vZGVzKCk6ICIKKwkJCQkgICJSZW1vdmluZyBub2RlOiBpbm86ICV1LCB2ZXJzaW9uOiAldSwgIgorCQkJCSAgIm1vZF90eXBlOiAldVxuIiwgY3VyLT5pbm8sIGN1ci0+dmVyc2lvbiwKKwkJCQkgIG1vZF90eXBlKSk7CisJCQlqZmZzX3VubGlua19ub2RlX2Zyb21fdmVyc2lvbl9saXN0KGYsIGN1cik7CisJCQlqZmZzX2ZtZnJlZShmLT5jLT5mbWMsIGN1ci0+Zm0sIGN1cik7CisJCQlqZmZzX2ZyZWVfbm9kZShjdXIpOworCQkJREpNKG5vX2pmZnNfbm9kZS0tKTsKKwkJfQorCQllbHNlIHsKKwkJCW5vZGVfd2l0aF9uYW1lX2xhdGVyIHw9IChtb2RfdHlwZSAmIEpGRlNfTU9ESUZZX05BTUUpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyogSW5zZXJ0IGEgZmlsZSBpbnRvIHRoZSBoYXNoIHRhYmxlLiAgKi8KK3N0YXRpYyBpbnQKK2pmZnNfaW5zZXJ0X2ZpbGVfaW50b19oYXNoKHN0cnVjdCBqZmZzX2ZpbGUgKmYpCit7CisJaW50IGkgPSBmLT5pbm8gJSBmLT5jLT5oYXNoX2xlbjsKKworCUQzKHByaW50aygiamZmc19pbnNlcnRfZmlsZV9pbnRvX2hhc2goKTogZi0+aW5vOiAldVxuIiwgZi0+aW5vKSk7CisKKwlsaXN0X2FkZCgmZi0+aGFzaCwgJmYtPmMtPmhhc2hbaV0pOworCXJldHVybiAwOworfQorCisKKy8qIEluc2VydCBhIGZpbGUgaW50byB0aGUgZmlsZSBzeXN0ZW0gdHJlZS4gICovCitpbnQKK2pmZnNfaW5zZXJ0X2ZpbGVfaW50b190cmVlKHN0cnVjdCBqZmZzX2ZpbGUgKmYpCit7CisJc3RydWN0IGpmZnNfZmlsZSAqcGFyZW50OworCisJRDMocHJpbnRrKCJqZmZzX2luc2VydF9maWxlX2ludG9fdHJlZSgpOiBuYW1lOiBcIiVzXCJcbiIsCisJCSAgKGYtPm5hbWUgPyBmLT5uYW1lIDogIiIpKSk7CisKKwlpZiAoIShwYXJlbnQgPSBqZmZzX2ZpbmRfZmlsZShmLT5jLCBmLT5waW5vKSkpIHsKKwkJaWYgKGYtPnBpbm8gPT0gMCkgeworCQkJZi0+Yy0+cm9vdCA9IGY7CisJCQlmLT5wYXJlbnQgPSBOVUxMOworCQkJZi0+c2libGluZ19wcmV2ID0gTlVMTDsKKwkJCWYtPnNpYmxpbmdfbmV4dCA9IE5VTEw7CisJCQlyZXR1cm4gMDsKKwkJfQorCQllbHNlIHsKKwkJCUQxKHByaW50aygiamZmc19pbnNlcnRfZmlsZV9pbnRvX3RyZWUoKTogRm91bmQgIgorCQkJCSAgImlub2RlIHdpdGggbm8gcGFyZW50IGFuZCBwaW5vID09ICV1XG4iLAorCQkJCSAgZi0+cGlubykpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCWYtPnBhcmVudCA9IHBhcmVudDsKKwlmLT5zaWJsaW5nX25leHQgPSBwYXJlbnQtPmNoaWxkcmVuOworCWlmIChmLT5zaWJsaW5nX25leHQpIHsKKwkJZi0+c2libGluZ19uZXh0LT5zaWJsaW5nX3ByZXYgPSBmOworCX0KKwlmLT5zaWJsaW5nX3ByZXYgPSBOVUxMOworCXBhcmVudC0+Y2hpbGRyZW4gPSBmOworCXJldHVybiAwOworfQorCisKKy8qIFJlbW92ZSBhIGZpbGUgZnJvbSB0aGUgaGFzaCB0YWJsZS4gICovCitzdGF0aWMgaW50CitqZmZzX3VubGlua19maWxlX2Zyb21faGFzaChzdHJ1Y3QgamZmc19maWxlICpmKQoreworCUQzKHByaW50aygiamZmc191bmxpbmtfZmlsZV9mcm9tX2hhc2goKTogZjogMHglcCwgIgorCQkgICJpbm8gJXVcbiIsIGYsIGYtPmlubykpOworCisJbGlzdF9kZWwoJmYtPmhhc2gpOworCXJldHVybiAwOworfQorCisKKy8qIEp1c3QgcmVtb3ZlIHRoZSBmaWxlIGZyb20gdGhlIHBhcmVudCdzIGNoaWxkcmVuLiAgRG9uJ3QgZnJlZQorICAgYW55IG1lbW9yeS4gICovCitpbnQKK2pmZnNfdW5saW5rX2ZpbGVfZnJvbV90cmVlKHN0cnVjdCBqZmZzX2ZpbGUgKmYpCit7CisJRDMocHJpbnRrKCJqZmZzX3VubGlua19maWxlX2Zyb21fdHJlZSgpOiBpbm86ICVkLCBwaW5vOiAlZCwgbmFtZTogIgorCQkgICJcIiVzXCJcbiIsIGYtPmlubywgZi0+cGlubywgKGYtPm5hbWUgPyBmLT5uYW1lIDogIiIpKSk7CisKKwlpZiAoZi0+c2libGluZ19wcmV2KSB7CisJCWYtPnNpYmxpbmdfcHJldi0+c2libGluZ19uZXh0ID0gZi0+c2libGluZ19uZXh0OworCX0KKwllbHNlIGlmIChmLT5wYXJlbnQpIHsKKwkgICAgICAgIEQzKHByaW50aygiZi0+cGFyZW50PSVwXG4iLCBmLT5wYXJlbnQpKTsKKwkJZi0+cGFyZW50LT5jaGlsZHJlbiA9IGYtPnNpYmxpbmdfbmV4dDsKKwl9CisJaWYgKGYtPnNpYmxpbmdfbmV4dCkgeworCQlmLT5zaWJsaW5nX25leHQtPnNpYmxpbmdfcHJldiA9IGYtPnNpYmxpbmdfcHJldjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyogRmluZCBhIGZpbGUgd2l0aCBpdHMgaW5vZGUgbnVtYmVyLiAgKi8KK3N0cnVjdCBqZmZzX2ZpbGUgKgoramZmc19maW5kX2ZpbGUoc3RydWN0IGpmZnNfY29udHJvbCAqYywgX191MzIgaW5vKQoreworCXN0cnVjdCBqZmZzX2ZpbGUgKmY7CisJaW50IGkgPSBpbm8gJSBjLT5oYXNoX2xlbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisKKwlEMyhwcmludGsoImpmZnNfZmluZF9maWxlKCk6IGlubzogJXVcbiIsIGlubykpOworCisJZm9yICh0bXAgPSBjLT5oYXNoW2ldLm5leHQ7IHRtcCAhPSAmYy0+aGFzaFtpXTsgdG1wID0gdG1wLT5uZXh0KSB7CisJCWYgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGpmZnNfZmlsZSwgaGFzaCk7CisJCWlmIChpbm8gIT0gZi0+aW5vKQorCQkJY29udGludWU7CisJCUQzKHByaW50aygiamZmc19maW5kX2ZpbGUoKTogRm91bmQgZmlsZSB3aXRoIGlubyAiCisJCQkgICAgICAgIiV1LiAobmFtZTogXCIlc1wiKVxuIiwKKwkJCSAgICAgICBpbm8sIChmLT5uYW1lID8gZi0+bmFtZSA6ICIiKSk7CisJCSk7CisJCXJldHVybiBmOworCX0KKwlEMyhwcmludGsoImpmZnNfZmluZF9maWxlKCk6IERpZG4ndCBmaW5kIGZpbGUgIgorCQkJICJ3aXRoIGlubyAldS5cbiIsIGlubyk7CisJKTsKKwlyZXR1cm4gTlVMTDsKK30KKworCisvKiBGaW5kIGEgZmlsZSBpbiBhIGRpcmVjdG9yeS4gIFdlIGFyZSBjb21wYXJpbmcgdGhlIG5hbWVzLiAgKi8KK3N0cnVjdCBqZmZzX2ZpbGUgKgoramZmc19maW5kX2NoaWxkKHN0cnVjdCBqZmZzX2ZpbGUgKmRpciwgY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgamZmc19maWxlICpmOworCisJRDMocHJpbnRrKCJqZmZzX2ZpbmRfY2hpbGQoKVxuIikpOworCisJZm9yIChmID0gZGlyLT5jaGlsZHJlbjsgZjsgZiA9IGYtPnNpYmxpbmdfbmV4dCkgeworCQlpZiAoIWYtPmRlbGV0ZWQgJiYgZi0+bmFtZQorCQkgICAgJiYgIXN0cm5jbXAoZi0+bmFtZSwgbmFtZSwgbGVuKQorCQkgICAgJiYgZi0+bmFtZVtsZW5dID09ICdcMCcpIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJRDMoaWYgKGYpIHsKKwkJcHJpbnRrKCJqZmZzX2ZpbmRfY2hpbGQoKTogRm91bmQgXCIlc1wiLlxuIiwgZi0+bmFtZSk7CisJfQorCWVsc2UgeworCQljaGFyICpjb3B5ID0gKGNoYXIgKikga21hbGxvYyhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGNvcHkpIHsKKwkJCW1lbWNweShjb3B5LCBuYW1lLCBsZW4pOworCQkJY29weVtsZW5dID0gJ1wwJzsKKwkJfQorCQlwcmludGsoImpmZnNfZmluZF9jaGlsZCgpOiBEaWRuJ3QgZmluZCB0aGUgZmlsZSBcIiVzXCIuXG4iLAorCQkgICAgICAgKGNvcHkgPyBjb3B5IDogIiIpKTsKKwkJaWYgKGNvcHkpIHsKKwkJCWtmcmVlKGNvcHkpOworCQl9CisJfSk7CisKKwlyZXR1cm4gZjsKK30KKworCisvKiBXcml0ZSBhIHJhdyBpbm9kZSB0aGF0IHRha2VzIHVwIGEgY2VydGFpbiBhbW91bnQgb2Ygc3BhY2UgaW4gdGhlIGZsYXNoCisgICBtZW1vcnkuICBBdCB0aGUgZW5kIG9mIHRoZSBmbGFzaCBkZXZpY2UsIHRoZXJlIGlzIG9mdGVuIHNwYWNlIHRoYXQgaXMKKyAgIGltcG9zc2libGUgdG8gdXNlLiAgQXQgdGhlc2UgdGltZXMgd2Ugd2FudCB0byBtYXJrIHRoaXMgc3BhY2UgYXMgbm90CisgICB1c2VkLiAgSW4gdGhlIGNhc2VzIHdoZW4gdGhlIGFtb3VudCBvZiBzcGFjZSBpcyBncmVhdGVyIG9yIGVxdWFsIHRoYW4KKyAgIGEgc3RydWN0IGpmZnNfcmF3X2lub2RlLCB3ZSB3cml0ZSBhICJkdW1teSBub2RlIiB0aGF0IHRha2VzIHVwIHRoaXMKKyAgIHNwYWNlLiAgVGhlIHNwYWNlIGFmdGVyIHRoZSByYXcgaW5vZGUsIGlmIGl0IGV4aXN0cywgaXMgbGVmdCBhcyBpdCBpcy4KKyAgIFNpbmNlIHRoaXMgc3BhY2UgYWZ0ZXIgdGhlIHJhdyBpbm9kZSBjb250YWlucyBKRkZTX0VNUFRZX0JJVE1BU0sgYnl0ZXMsCisgICB3ZSBjYW4gY29tcHV0ZSB0aGUgY2hlY2tzdW0gb2YgaXQ7IHdlIGRvbid0IGhhdmUgdG8gbWFuaXB1bGF0ZSBpdCBhbnkKKyAgIGZ1cnRoZXIuCisKKyAgIElmIHRoZSBzcGFjZSBsZWZ0IG9uIHRoZSBkZXZpY2UgaXMgbGVzcyB0aGFuIHRoZSBzaXplIG9mIGEgc3RydWN0CisgICBqZmZzX3Jhd19pbm9kZSwgdGhpcyBzcGFjZSBpcyBmaWxsZWQgd2l0aCBKRkZTX0RJUlRZX0JJVE1BU0sgYnl0ZXMuCisgICBObyByYXcgaW5vZGUgaXMgd3JpdHRlbiB0aGlzIHRpbWUuICAqLworc3RhdGljIGludAoramZmc193cml0ZV9kdW1teV9ub2RlKHN0cnVjdCBqZmZzX2NvbnRyb2wgKmMsIHN0cnVjdCBqZmZzX2ZtICpkaXJ0eV9mbSkKK3sKKwlzdHJ1Y3QgamZmc19mbWNvbnRyb2wgKmZtYyA9IGMtPmZtYzsKKwlpbnQgZXJyOworCisJRDEocHJpbnRrKCJqZmZzX3dyaXRlX2R1bW15X25vZGUoKTogZGlydHlfZm0tPm9mZnNldCA9IDB4JTA4eCwgIgorCQkgICJkaXJ0eV9mbS0+c2l6ZSA9ICV1XG4iLAorCQkgIGRpcnR5X2ZtLT5vZmZzZXQsIGRpcnR5X2ZtLT5zaXplKSk7CisKKwlpZiAoZGlydHlfZm0tPnNpemUgPj0gc2l6ZW9mKHN0cnVjdCBqZmZzX3Jhd19pbm9kZSkpIHsKKwkJc3RydWN0IGpmZnNfcmF3X2lub2RlIHJhd19pbm9kZTsKKwkJbWVtc2V0KCZyYXdfaW5vZGUsIDAsIHNpemVvZihzdHJ1Y3QgamZmc19yYXdfaW5vZGUpKTsKKwkJcmF3X2lub2RlLm1hZ2ljID0gSkZGU19NQUdJQ19CSVRNQVNLOworCQlyYXdfaW5vZGUuZHNpemUgPSBkaXJ0eV9mbS0+c2l6ZQorCQkJCSAgLSBzaXplb2Yoc3RydWN0IGpmZnNfcmF3X2lub2RlKTsKKwkJcmF3X2lub2RlLmRjaGtzdW0gPSByYXdfaW5vZGUuZHNpemUgKiAweGZmOworCQlyYXdfaW5vZGUuY2hrc3VtCisJCT0gamZmc19jaGVja3N1bSgmcmF3X2lub2RlLCBzaXplb2Yoc3RydWN0IGpmZnNfcmF3X2lub2RlKSk7CisKKwkJaWYgKChlcnIgPSBmbGFzaF9zYWZlX3dyaXRlKGZtYy0+bXRkLAorCQkJCQkgICAgZGlydHlfZm0tPm9mZnNldCwKKwkJCQkJICAgICh1X2NoYXIgKikmcmF3X2lub2RlLAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBqZmZzX3Jhd19pbm9kZSkpKQorCQkgICAgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkpGRlM6IGpmZnNfd3JpdGVfZHVtbXlfbm9kZTogIgorCQkJICAgICAgICJmbGFzaF9zYWZlX3dyaXRlIGZhaWxlZCFcbiIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKwllbHNlIHsKKwkJZmxhc2hfc2FmZV9hY3F1aXJlKGZtYy0+bXRkKTsKKwkJZmxhc2hfbWVtc2V0KGZtYy0+bXRkLCBkaXJ0eV9mbS0+b2Zmc2V0LCAwLCBkaXJ0eV9mbS0+c2l6ZSk7CisJCWZsYXNoX3NhZmVfcmVsZWFzZShmbWMtPm10ZCk7CisJfQorCisJRDMocHJpbnRrKCJqZmZzX3dyaXRlX2R1bW15X25vZGUoKTogTGVhdmluZy4uLlxuIikpOworCXJldHVybiAwOworfQorCisKKy8qIFdyaXRlIGEgcmF3IGlub2RlLCBwb3NzaWJseSBpdHMgbmFtZSBhbmQgcG9zc2libHkgc29tZSBkYXRhLiAgKi8KK2ludAoramZmc193cml0ZV9ub2RlKHN0cnVjdCBqZmZzX2NvbnRyb2wgKmMsIHN0cnVjdCBqZmZzX25vZGUgKm5vZGUsCisJCXN0cnVjdCBqZmZzX3Jhd19pbm9kZSAqcmF3X2lub2RlLAorCQljb25zdCBjaGFyICpuYW1lLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLAorCQlpbnQgcmVjb3ZlcmFibGUsCisJCXN0cnVjdCBqZmZzX2ZpbGUgKmYpCit7CisJc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMgPSBjLT5mbWM7CisJc3RydWN0IGpmZnNfZm0gKmZtOworCXN0cnVjdCBrdmVjIG5vZGVfaW92ZWNbNF07CisJdW5zaWduZWQgbG9uZyBpb3ZlY19jbnQ7CisKKwlfX3UzMiBwb3M7CisJaW50IGVycjsKKwlfX3UzMiBzbGFjayA9IDA7CisKKwlfX3UzMiB0b3RhbF9uYW1lX3NpemUgPSByYXdfaW5vZGUtPm5zaXplCisJCQkJKyBKRkZTX0dFVF9QQURfQllURVMocmF3X2lub2RlLT5uc2l6ZSk7CisJX191MzIgdG90YWxfZGF0YV9zaXplID0gcmF3X2lub2RlLT5kc2l6ZQorCQkJCSsgSkZGU19HRVRfUEFEX0JZVEVTKHJhd19pbm9kZS0+ZHNpemUpOworCV9fdTMyIHRvdGFsX3NpemUgPSBzaXplb2Yoc3RydWN0IGpmZnNfcmF3X2lub2RlKQorCQkJICAgKyB0b3RhbF9uYW1lX3NpemUgKyB0b3RhbF9kYXRhX3NpemU7CisJCisJLyogSWYgdGhpcyBub2RlIGlzbid0IHNvbWV0aGluZyB0aGF0IHdpbGwgZXZlbnR1YWxseSBsZXQKKwkgICBHQyBmcmVlIGV2ZW4gbW9yZSBzcGFjZSwgdGhlbiBkb24ndCBhbGxvdyBpdCB1bmxlc3MKKwkgICB0aGVyZSdzIGF0IGxlYXN0IG1heF9jaHVua19zaXplIHNwYWNlIHN0aWxsIGF2YWlsYWJsZQorCSovCisJaWYgKCFyZWNvdmVyYWJsZSkKKwkJc2xhY2sgPSBmbWMtPm1heF9jaHVua19zaXplOworCQkKKworCS8qIEZpcmUgdGhlIHJldHJvcm9ja2V0cyBhbmQgc2hvb3QgdGhlIGZydWl0b24gdG9ycGVkb2VzLCBzaXIhICAqLworCisJQVNTRVJUKGlmICghbm9kZSkgeworCQlwcmludGsoImpmZnNfd3JpdGVfbm9kZSgpOiBub2RlID09IE5VTExcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9KTsKKwlBU1NFUlQoaWYgKHJhd19pbm9kZSAmJiByYXdfaW5vZGUtPm5zaXplICYmICFuYW1lKSB7CisJCXByaW50aygiKioqIGpmZnNfd3JpdGVfbm9kZSgpOiBuc2l6ZSA9ICV1IGJ1dCBuYW1lID09IE5VTExcbiIsCisJCSAgICAgICByYXdfaW5vZGUtPm5zaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSk7CisKKwlEMShwcmludGsoImpmZnNfd3JpdGVfbm9kZSgpOiBmaWxlbmFtZSA9IFwiJXNcIiwgaW5vID0gJXUsICIKKwkJICAidG90YWxfc2l6ZSA9ICV1XG4iLAorCQkgIChuYW1lID8gbmFtZSA6ICIiKSwgcmF3X2lub2RlLT5pbm8sCisJCSAgdG90YWxfc2l6ZSkpOworCisJamZmc19mbV93cml0ZV9sb2NrKGZtYyk7CisKK3JldHJ5OgorCWZtID0gTlVMTDsKKwllcnIgPSAwOworCXdoaWxlICghZm0pIHsKKworCQkvKiBEZWFkbG9ja3Mgc3Vjay4gKi8KKwkJd2hpbGUoZm1jLT5mcmVlX3NpemUgPCBmbWMtPm1pbl9mcmVlX3NpemUgKyB0b3RhbF9zaXplICsgc2xhY2spIHsKKwkJCWpmZnNfZm1fd3JpdGVfdW5sb2NrKGZtYyk7CisJCQlpZiAoIUpGRlNfRU5PVUdIX1NQQUNFKGMsIHRvdGFsX3NpemUgKyBzbGFjaykpCisJCQkJcmV0dXJuIC1FTk9TUEM7CisJCQlqZmZzX2ZtX3dyaXRlX2xvY2soZm1jKTsKKwkJfQorCisJCS8qIEZpcnN0IHRyeSB0byBhbGxvY2F0ZSBzb21lIGZsYXNoIG1lbW9yeS4gICovCisJCWVyciA9IGpmZnNfZm1hbGxvYyhmbWMsIHRvdGFsX3NpemUsIG5vZGUsICZmbSk7CisJCQorCQlpZiAoZXJyID09IC1FTk9TUEMpIHsKKwkJCS8qIEp1c3Qgb3V0IG9mIHNwYWNlLiBHQyBhbmQgdHJ5IGFnYWluICovCisJCQlpZiAoZm1jLT5kaXJ0eV9zaXplIDwgZm1jLT5zZWN0b3Jfc2l6ZSkgeworCQkJCUQocHJpbnRrKCJqZmZzX3dyaXRlX25vZGUoKTogamZmc19mbWFsbG9jKDB4JXAsICV1KSAiCisJCQkJCSAiZmFpbGVkLCBubyBkaXJ0eSBzcGFjZSB0byBHQ1xuIiwgZm1jLAorCQkJCQkgdG90YWxfc2l6ZSkpOworCQkJCXJldHVybiBlcnI7CisJCQl9CisJCQkKKwkJCUQxKHByaW50ayhLRVJOX0lORk8gImpmZnNfd3JpdGVfbm9kZSgpOiBDYWxsaW5nIGpmZnNfZ2FyYmFnZV9jb2xsZWN0X25vdygpXG4iKSk7CisJCQlqZmZzX2ZtX3dyaXRlX3VubG9jayhmbWMpOworCQkJaWYgKChlcnIgPSBqZmZzX2dhcmJhZ2VfY29sbGVjdF9ub3coYykpKSB7CisJCQkJRChwcmludGsoImpmZnNfd3JpdGVfbm9kZSgpOiBqZmZzX2dhcmJhZ2VfY29sbGVjdF9ub3coKSBmYWlsZWRcbiIpKTsKKwkJCQlyZXR1cm4gZXJyOworCQkJfQorCQkJamZmc19mbV93cml0ZV9sb2NrKGZtYyk7CisJCQljb250aW51ZTsKKwkJfSAKKworCQlpZiAoZXJyIDwgMCkgeworCQkJamZmc19mbV93cml0ZV91bmxvY2soZm1jKTsKKworCQkJRChwcmludGsoImpmZnNfd3JpdGVfbm9kZSgpOiBqZmZzX2ZtYWxsb2MoMHglcCwgJXUpICIKKwkJCQkgImZhaWxlZCFcbiIsIGZtYywgdG90YWxfc2l6ZSkpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCWlmICghZm0tPm5vZGVzKSB7CisJCQkvKiBUaGUgamZmc19mbSBzdHJ1Y3QgdGhhdCB3ZSBnb3QgaXMgbm90IGdvb2QgZW5vdWdoLgorCQkJICAgTWFrZSB0aGF0IHNwYWNlIGRpcnR5IGFuZCB0cnkgYWdhaW4gICovCisJCQlpZiAoKGVyciA9IGpmZnNfd3JpdGVfZHVtbXlfbm9kZShjLCBmbSkpIDwgMCkgeworCQkJCWtmcmVlKGZtKTsKKwkJCQlESk0obm9famZmc19mbS0tKTsKKwkJCQlqZmZzX2ZtX3dyaXRlX3VubG9jayhmbWMpOworCQkJCUQocHJpbnRrKCJqZmZzX3dyaXRlX25vZGUoKTogIgorCQkJCQkgImpmZnNfd3JpdGVfZHVtbXlfbm9kZSgpOiBGYWlsZWQhXG4iKSk7CisJCQkJcmV0dXJuIGVycjsKKwkJCX0KKwkJCWZtID0gTlVMTDsKKwkJfQorCX0gLyogd2hpbGUoIWZtKSAqLworCW5vZGUtPmZtID0gZm07CisKKwlBU1NFUlQoaWYgKGZtLT5ub2RlcyA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiamZmc193cml0ZV9ub2RlKCk6IGZtLT5ub2RlcyA9PSAwXG4iKTsKKwl9KTsKKworCXBvcyA9IG5vZGUtPmZtLT5vZmZzZXQ7CisKKwkvKiBJbmNyZW1lbnQgdGhlIHZlcnNpb24gbnVtYmVyIGhlcmUuIFdlIGNhbid0IGxldCB0aGUgY2FsbGVyCisJICAgc2V0IGl0IGJlZm9yZWhhbmQsIGJlY2F1c2Ugd2UgbWlnaHQgaGF2ZSBoYWQgdG8gZG8gR0Mgb24gYSBub2RlCisJICAgb2YgdGhpcyBmaWxlIC0gYW5kIHdlJ2QgZW5kIHVwIHJldXNpbmcgdmVyc2lvbiBudW1iZXJzLgorCSovCisJaWYgKGYpIHsKKwkJcmF3X2lub2RlLT52ZXJzaW9uID0gZi0+aGlnaGVzdF92ZXJzaW9uICsgMTsKKwkJRDEocHJpbnRrIChLRVJOX05PVElDRSAiamZmc193cml0ZV9ub2RlKCk6IHNldHRpbmcgdmVyc2lvbiBvZiAlcyB0byAlZFxuIiwgZi0+bmFtZSwgcmF3X2lub2RlLT52ZXJzaW9uKSk7CisKKwkJLyogaWYgdGhlIGZpbGUgd2FzIGRlbGV0ZWQsIHNldCB0aGUgZGVsZXRlZCBiaXQgaW4gdGhlIHJhdyBpbm9kZSAqLworCQlpZiAoZi0+ZGVsZXRlZCkKKwkJCXJhd19pbm9kZS0+ZGVsZXRlZCA9IDE7CisJfQorCisJLyogQ29tcHV0ZSB0aGUgY2hlY2tzdW0gZm9yIHRoZSBkYXRhIGFuZCBuYW1lIGNodW5rcy4gICovCisJcmF3X2lub2RlLT5kY2hrc3VtID0gamZmc19jaGVja3N1bShkYXRhLCByYXdfaW5vZGUtPmRzaXplKTsKKwlyYXdfaW5vZGUtPm5jaGtzdW0gPSBqZmZzX2NoZWNrc3VtKG5hbWUsIHJhd19pbm9kZS0+bnNpemUpOworCisJLyogVGhlIGNoZWNrc3VtIGlzIGNhbGN1bGF0ZWQgd2l0aG91dCB0aGUgY2hrc3VtIGFuZCBhY2N1cmF0ZQorCSAgIGZpZWxkcyBzbyBzZXQgdGhlbSB0byB6ZXJvIGZpcnN0LiAgKi8KKwlyYXdfaW5vZGUtPmFjY3VyYXRlID0gMDsKKwlyYXdfaW5vZGUtPmNoa3N1bSA9IDA7CisJcmF3X2lub2RlLT5jaGtzdW0gPSBqZmZzX2NoZWNrc3VtKHJhd19pbm9kZSwKKwkJCQkJICBzaXplb2Yoc3RydWN0IGpmZnNfcmF3X2lub2RlKSk7CisJcmF3X2lub2RlLT5hY2N1cmF0ZSA9IDB4ZmY7CisKKwlEMyhwcmludGsoImpmZnNfd3JpdGVfbm9kZSgpOiBBYm91dCB0byB3cml0ZSB0aGlzIHJhdyBpbm9kZSB0byB0aGUgIgorCQkgICJmbGFzaCBhdCBwb3MgMHglbHg6XG4iLCAobG9uZylwb3MpKTsKKwlEMyhqZmZzX3ByaW50X3Jhd19pbm9kZShyYXdfaW5vZGUpKTsKKworCS8qIFRoZSBhY3R1YWwgcmF3IEpGRlMgbm9kZSAqLworCW5vZGVfaW92ZWNbMF0uaW92X2Jhc2UgPSAodm9pZCAqKSByYXdfaW5vZGU7CisJbm9kZV9pb3ZlY1swXS5pb3ZfbGVuID0gKHNpemVfdCkgc2l6ZW9mKHN0cnVjdCBqZmZzX3Jhd19pbm9kZSk7CisJaW92ZWNfY250ID0gMTsKKworCS8qIEdldCBuYW1lIGFuZCBzaXplIGlmIHRoZXJlIGlzIG9uZSAqLworCWlmIChyYXdfaW5vZGUtPm5zaXplKSB7CisJCW5vZGVfaW92ZWNbaW92ZWNfY250XS5pb3ZfYmFzZSA9ICh2b2lkICopIG5hbWU7CisJCW5vZGVfaW92ZWNbaW92ZWNfY250XS5pb3ZfbGVuID0gKHNpemVfdCkgcmF3X2lub2RlLT5uc2l6ZTsKKwkJaW92ZWNfY250Kys7CisKKwkJaWYgKEpGRlNfR0VUX1BBRF9CWVRFUyhyYXdfaW5vZGUtPm5zaXplKSkgeworCQkJc3RhdGljIGNoYXIgYWxsZmZbM109ezI1NSwyNTUsMjU1fTsKKwkJCS8qIEFkZCBzb21lIGV4dHJhIHBhZGRpbmcgaWYgbmVjZXNzYXJ5ICovCisJCQlub2RlX2lvdmVjW2lvdmVjX2NudF0uaW92X2Jhc2UgPSBhbGxmZjsKKwkJCW5vZGVfaW92ZWNbaW92ZWNfY250XS5pb3ZfbGVuID0KKwkJCQlKRkZTX0dFVF9QQURfQllURVMocmF3X2lub2RlLT5uc2l6ZSk7CisJCQlpb3ZlY19jbnQrKzsKKwkJfQorCX0KKworCS8qIEdldCBkYXRhIGFuZCBzaXplIGlmIHRoZXJlIGlzIGFueSAqLworCWlmIChyYXdfaW5vZGUtPmRzaXplKSB7CisJCW5vZGVfaW92ZWNbaW92ZWNfY250XS5pb3ZfYmFzZSA9ICh2b2lkICopIGRhdGE7CisJCW5vZGVfaW92ZWNbaW92ZWNfY250XS5pb3ZfbGVuID0gKHNpemVfdCkgcmF3X2lub2RlLT5kc2l6ZTsKKwkJaW92ZWNfY250Kys7CisJCS8qIE5vIG5lZWQgdG8gcGFkIHRoaXMgYmVjYXVzZSB3ZSdyZSBub3QgYWN0dWFsbHkgcHV0dGluZworCQkgICBhbnl0aGluZyBhZnRlciBpdC4KKwkJKi8KKwl9CisKKwlpZiAoKGVyciA9IGZsYXNoX3NhZmVfd3JpdGV2KGZtYy0+bXRkLCBub2RlX2lvdmVjLCBpb3ZlY19jbnQsCisJCQkJICAgIHBvcykpIDwgMCkgeworCQlqZmZzX2ZtZnJlZV9wYXJ0bHkoZm1jLCBmbSwgMCk7CisJCWpmZnNfZm1fd3JpdGVfdW5sb2NrKGZtYyk7CisJCXByaW50ayhLRVJOX0VSUiAiSkZGUzogamZmc193cml0ZV9ub2RlOiBGYWlsZWQgdG8gd3JpdGUsICIKKwkJICAgICAgICJyZXF1ZXN0ZWQgJWksIHdyb3RlICVpXG4iLCB0b3RhbF9zaXplLCBlcnIpOworCQlnb3RvIHJldHJ5OworCX0KKwlpZiAocmF3X2lub2RlLT5kZWxldGVkKQorCQlmLT5kZWxldGVkID0gMTsKKworCWpmZnNfZm1fd3JpdGVfdW5sb2NrKGZtYyk7CisJRDMocHJpbnRrKCJqZmZzX3dyaXRlX25vZGUoKTogTGVhdmluZy4uLlxuIikpOworCXJldHVybiByYXdfaW5vZGUtPmRzaXplOworfSAvKiBqZmZzX3dyaXRlX25vZGUoKSAgKi8KKworCisvKiBSZWFkIGRhdGEgZnJvbSB0aGUgbm9kZSBhbmQgd3JpdGUgaXQgdG8gdGhlIGJ1ZmZlci4gICdub2RlX29mZnNldCcKKyAgIGlzIGhvdyBtdWNoIHdlIGhhdmUgcmVhZCBmcm9tIHRoaXMgcGFydGljdWxhciBub2RlIGJlZm9yZSBhbmQgd2hpY2gKKyAgIHNob3VsZG4ndCBiZSByZWFkIGFnYWluLiAgJ21heF9zaXplJyBpcyBob3cgbXVjaCBzcGFjZSB0aGVyZSBpcyBpbgorICAgdGhlIGJ1ZmZlci4gICovCitzdGF0aWMgaW50CitqZmZzX2dldF9ub2RlX2RhdGEoc3RydWN0IGpmZnNfZmlsZSAqZiwgc3RydWN0IGpmZnNfbm9kZSAqbm9kZSwgCisJCSAgIHVuc2lnbmVkIGNoYXIgKmJ1ZixfX3UzMiBub2RlX29mZnNldCwgX191MzIgbWF4X3NpemUpCit7CisJc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMgPSBmLT5jLT5mbWM7CisJX191MzIgcG9zID0gbm9kZS0+Zm0tPm9mZnNldCArIG5vZGUtPmZtX29mZnNldCArIG5vZGVfb2Zmc2V0OworCV9fdTMyIGF2YWlsID0gbm9kZS0+ZGF0YV9zaXplIC0gbm9kZV9vZmZzZXQ7CisJX191MzIgcjsKKworCUQyKHByaW50aygiICBqZmZzX2dldF9ub2RlX2RhdGEoKTogZmlsZTogXCIlc1wiLCBpbm86ICV1LCAiCisJCSAgInZlcnNpb246ICV1LCBub2RlX29mZnNldDogJXVcbiIsCisJCSAgZi0+bmFtZSwgbm9kZS0+aW5vLCBub2RlLT52ZXJzaW9uLCBub2RlX29mZnNldCkpOworCisJciA9IG1pbihhdmFpbCwgbWF4X3NpemUpOworCUQzKHByaW50ayhLRVJOX05PVElDRSAiamZmc19nZXRfbm9kZV9kYXRhXG4iKSk7CisJZmxhc2hfc2FmZV9yZWFkKGZtYy0+bXRkLCBwb3MsIGJ1Ziwgcik7CisKKwlEMyhwcmludGsoIiAgamZmc19nZXRfbm9kZV9kYXRhKCk6IFJlYWQgJXUgYnl0ZSVzLlxuIiwKKwkJICByLCAociA9PSAxID8gIiIgOiAicyIpKSk7CisKKwlyZXR1cm4gcjsKK30KKworCisvKiBSZWFkIGRhdGEgZnJvbSB0aGUgZmlsZSdzIG5vZGVzLiAgV3JpdGUgdGhlIGRhdGEgdG8gdGhlIGJ1ZmZlcgorICAgJ2J1ZicuICAncmVhZF9vZmZzZXQnIHRlbGxzIGhvdyBtdWNoIGRhdGEgd2Ugc2hvdWxkIHNraXAuICAqLworaW50CitqZmZzX3JlYWRfZGF0YShzdHJ1Y3QgamZmc19maWxlICpmLCB1bnNpZ25lZCBjaGFyICpidWYsIF9fdTMyIHJlYWRfb2Zmc2V0LAorCSAgICAgICBfX3UzMiBzaXplKQoreworCXN0cnVjdCBqZmZzX25vZGUgKm5vZGU7CisJX191MzIgcmVhZF9kYXRhID0gMDsgLyogVG90YWwgYW1vdW50IG9mIHJlYWQgZGF0YS4gICovCisJX191MzIgbm9kZV9vZmZzZXQgPSAwOworCV9fdTMyIHBvcyA9IDA7IC8qIE51bWJlciBvZiBieXRlcyB0cmF2ZXJzZWQuICAqLworCisJRDIocHJpbnRrKCJqZmZzX3JlYWRfZGF0YSgpOiBmaWxlID0gXCIlc1wiLCByZWFkX29mZnNldCA9ICVkLCAiCisJCSAgInNpemUgPSAldVxuIiwKKwkJICAoZi0+bmFtZSA/IGYtPm5hbWUgOiAiIiksIHJlYWRfb2Zmc2V0LCBzaXplKSk7CisKKwlpZiAocmVhZF9vZmZzZXQgPj0gZi0+c2l6ZSkgeworCQlEKHByaW50aygiICBmLT5zaXplOiAlZFxuIiwgZi0+c2l6ZSkpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBGaXJzdCBmaW5kIHRoZSBub2RlIHRvIHJlYWQgZGF0YSBmcm9tLiAgKi8KKwlub2RlID0gZi0+cmFuZ2VfaGVhZDsKKwl3aGlsZSAocG9zIDw9IHJlYWRfb2Zmc2V0KSB7CisJCW5vZGVfb2Zmc2V0ID0gcmVhZF9vZmZzZXQgLSBwb3M7CisJCWlmIChub2RlX29mZnNldCA+PSBub2RlLT5kYXRhX3NpemUpIHsKKwkJCXBvcyArPSBub2RlLT5kYXRhX3NpemU7CisJCQlub2RlID0gbm9kZS0+cmFuZ2VfbmV4dDsKKwkJfQorCQllbHNlIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogIkNhdHMgYXJlIGxpdmluZyBwcm9vZiB0aGF0IG5vdCBldmVyeXRoaW5nIGluIG5hdHVyZQorCSAgIGhhcyB0byBiZSB1c2VmdWwuIgorCSAgIC0gR2Fycmlzb24gS2VpbG9yICgnOTcpICAqLworCisJLyogRmlsbCB0aGUgYnVmZmVyLiAgKi8KKwl3aGlsZSAobm9kZSAmJiAocmVhZF9kYXRhIDwgc2l6ZSkpIHsKKwkJaW50IHI7CisJCWlmICghbm9kZS0+Zm0pIHsKKwkJCS8qIFRoaXMgbm9kZSBkb2VzIG5vdCByZWZlciB0byByZWFsIGRhdGEuICAqLworCQkJciA9IG1pbihzaXplIC0gcmVhZF9kYXRhLAorCQkJCSAgICAgbm9kZS0+ZGF0YV9zaXplIC0gbm9kZV9vZmZzZXQpOworCQkJbWVtc2V0KCZidWZbcmVhZF9kYXRhXSwgMCwgcik7CisJCX0KKwkJZWxzZSBpZiAoKHIgPSBqZmZzX2dldF9ub2RlX2RhdGEoZiwgbm9kZSwgJmJ1ZltyZWFkX2RhdGFdLAorCQkJCQkJIG5vZGVfb2Zmc2V0LAorCQkJCQkJIHNpemUgLSByZWFkX2RhdGEpKSA8IDApIHsKKwkJCXJldHVybiByOworCQl9CisJCXJlYWRfZGF0YSArPSByOworCQlub2RlX29mZnNldCA9IDA7CisJCW5vZGUgPSBub2RlLT5yYW5nZV9uZXh0OworCX0KKwlEMyhwcmludGsoIiAgamZmc19yZWFkX2RhdGEoKTogUmVhZCAldSBieXRlcy5cbiIsIHJlYWRfZGF0YSkpOworCXJldHVybiByZWFkX2RhdGE7Cit9CisKKworLyogVXNlZCBmb3IgdHJhdmVyc2luZyBhbGwgbm9kZXMgaW4gdGhlIGhhc2ggdGFibGUuICAqLworaW50CitqZmZzX2ZvcmVhY2hfZmlsZShzdHJ1Y3QgamZmc19jb250cm9sICpjLCBpbnQgKCpmdW5jKShzdHJ1Y3QgamZmc19maWxlICopKQoreworCWludCBwb3M7CisJaW50IHI7CisJaW50IHJlc3VsdCA9IDA7CisKKwlmb3IgKHBvcyA9IDA7IHBvcyA8IGMtPmhhc2hfbGVuOyBwb3MrKykgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqbmV4dDsKKwkJZm9yIChwID0gYy0+aGFzaFtwb3NdLm5leHQ7IHAgIT0gJmMtPmhhc2hbcG9zXTsgcCA9IG5leHQpIHsKKwkJCS8qIFdlIG5lZWQgYSByZWZlcmVuY2UgdG8gdGhlIG5leHQgZmlsZSBpbiB0aGUKKwkJCSAgIGxpc3QgYmVjYXVzZSBgZnVuYycgbWlnaHQgcmVtb3ZlIHRoZSBjdXJyZW50CisJCQkgICBmaWxlIGBmJy4gICovCisJCQluZXh0ID0gcC0+bmV4dDsKKwkJCXIgPSBmdW5jKGxpc3RfZW50cnkocCwgc3RydWN0IGpmZnNfZmlsZSwgaGFzaCkpOworCQkJaWYgKHIgPCAwKQorCQkJCXJldHVybiByOworCQkJcmVzdWx0ICs9IHI7CisJCX0KKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qIEZyZWUgYWxsIG5vZGVzIGFzc29jaWF0ZWQgd2l0aCBhIGZpbGUuICAqLworc3RhdGljIGludAoramZmc19mcmVlX25vZGVfbGlzdChzdHJ1Y3QgamZmc19maWxlICpmKQoreworCXN0cnVjdCBqZmZzX25vZGUgKm5vZGU7CisJc3RydWN0IGpmZnNfbm9kZSAqcDsKKworCUQzKHByaW50aygiamZmc19mcmVlX25vZGVfbGlzdCgpOiBmICMldSwgXCIlc1wiXG4iLAorCQkgIGYtPmlubywgKGYtPm5hbWUgPyBmLT5uYW1lIDogIiIpKSk7CisJbm9kZSA9IGYtPnZlcnNpb25faGVhZDsKKwl3aGlsZSAobm9kZSkgeworCQlwID0gbm9kZTsKKwkJbm9kZSA9IG5vZGUtPnZlcnNpb25fbmV4dDsKKwkJamZmc19mcmVlX25vZGUocCk7CisJCURKTShub19qZmZzX25vZGUtLSk7CisJfQorCXJldHVybiAwOworfQorCisKKy8qIEZyZWUgYSBmaWxlIGFuZCBpdHMgbmFtZS4gICovCitzdGF0aWMgaW50CitqZmZzX2ZyZWVfZmlsZShzdHJ1Y3QgamZmc19maWxlICpmKQoreworCUQzKHByaW50aygiamZmc19mcmVlX2ZpbGU6IGYgIyV1LCBcIiVzXCJcbiIsCisJCSAgZi0+aW5vLCAoZi0+bmFtZSA/IGYtPm5hbWUgOiAiIikpKTsKKworCWlmIChmLT5uYW1lKSB7CisJCWtmcmVlKGYtPm5hbWUpOworCQlESk0obm9fbmFtZS0tKTsKKwl9CisJa2ZyZWUoZik7CisJbm9famZmc19maWxlLS07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBsb25nCitqZmZzX2dldF9maWxlX2NvdW50KHZvaWQpCit7CisJcmV0dXJuIG5vX2pmZnNfZmlsZTsKK30KKworLyogU2VlIGlmIGEgZmlsZSBpcyBkZWxldGVkLiBJZiBzbywgbWFyayB0aGF0IGZpbGUncyBub2RlcyBhcyBvYnNvbGV0ZS4gICovCitpbnQKK2pmZnNfcG9zc2libHlfZGVsZXRlX2ZpbGUoc3RydWN0IGpmZnNfZmlsZSAqZikKK3sKKwlzdHJ1Y3QgamZmc19ub2RlICpuOworCisJRDMocHJpbnRrKCJqZmZzX3Bvc3NpYmx5X2RlbGV0ZV9maWxlKCk6IGlubzogJXVcbiIsCisJCSAgZi0+aW5vKSk7CisKKwlBU1NFUlQoaWYgKCFmKSB7CisJCXByaW50ayhLRVJOX0VSUiAiamZmc19wb3NzaWJseV9kZWxldGVfZmlsZSgpOiBmID09IE5VTExcbiIpOworCQlyZXR1cm4gLTE7CisJfSk7CisKKwlpZiAoZi0+ZGVsZXRlZCkgeworCQkvKiBGaXJzdCB0cnkgdG8gcmVtb3ZlIGFsbCBvbGRlciB2ZXJzaW9ucy4gIENvbW1lbmNlIHdpdGgKKwkJICAgdGhlIG9sZGVzdCBub2RlLiAgKi8KKwkJZm9yIChuID0gZi0+dmVyc2lvbl9oZWFkOyBuOyBuID0gbi0+dmVyc2lvbl9uZXh0KSB7CisJCQlpZiAoIW4tPmZtKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoamZmc19mbWZyZWUoZi0+Yy0+Zm1jLCBuLT5mbSwgbikgPCAwKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJLyogVW5saW5rIHRoZSBmaWxlIGZyb20gdGhlIGZpbGVzeXN0ZW0uICAqLworCQlpZiAoIWYtPmMtPmJ1aWxkaW5nX2ZzKSB7CisJCQlqZmZzX3VubGlua19maWxlX2Zyb21fdHJlZShmKTsKKwkJfQorCQlqZmZzX3VubGlua19maWxlX2Zyb21faGFzaChmKTsKKwkJamZmc19mcmVlX25vZGVfbGlzdChmKTsKKwkJamZmc19mcmVlX2ZpbGUoZik7CisJfQorCXJldHVybiAwOworfQorCisKKy8qIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBqZmZzX2ZvcmVhY2hfZmlsZSgpIHRvIGNvdW50IHRoZSBudW1iZXIKKyAgIG9mIGZpbGVzIGluIHRoZSBmaWxlIHN5c3RlbS4gICovCitpbnQKK2pmZnNfZmlsZV9jb3VudChzdHJ1Y3QgamZmc19maWxlICpmKQoreworCXJldHVybiAxOworfQorCisKKy8qIEJ1aWxkIHVwIGEgZmlsZSdzIHJhbmdlIGxpc3QgZnJvbSBzY3JhdGNoIGJ5IGdvaW5nIHRocm91Z2ggdGhlCisgICB2ZXJzaW9uIGxpc3QuICAqLworc3RhdGljIGludAoramZmc19idWlsZF9maWxlKHN0cnVjdCBqZmZzX2ZpbGUgKmYpCit7CisJc3RydWN0IGpmZnNfbm9kZSAqbjsKKworCUQzKHByaW50aygiamZmc19idWlsZF9maWxlKCk6IGlubzogJXUsIG5hbWU6IFwiJXNcIlxuIiwKKwkJICBmLT5pbm8sIChmLT5uYW1lID8gZi0+bmFtZSA6ICIiKSkpOworCisJZm9yIChuID0gZi0+dmVyc2lvbl9oZWFkOyBuOyBuID0gbi0+dmVyc2lvbl9uZXh0KSB7CisJCWpmZnNfdXBkYXRlX2ZpbGUoZiwgbik7CisJfQorCXJldHVybiAwOworfQorCisKKy8qIFJlbW92ZSBhbiBhbW91bnQgb2YgZGF0YSBmcm9tIGEgZmlsZS4gSWYgdGhpcyBhbW91bnQgb2YgZGF0YSBpcworICAgemVybywgdGhhdCBjb3VsZCBtZWFuIHRoYXQgYSBub2RlIHNob3VsZCBiZSBzcGxpdCBpbiB0d28gcGFydHMuCisgICBXZSByZW1vdmUgb3IgY2hhbmdlIHRoZSBhcHByb3ByaWF0ZSBub2RlcyBpbiB0aGUgbGlzdHMuCisKKyAgIFN0YXJ0aW5nIG9mZnNldCBvZiBhcmVhIHRvIGJlIHJlbW92ZWQgaXMgbm9kZS0+ZGF0YV9vZmZzZXQsCisgICBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgYXJlYSBpcyBpbiBub2RlLT5yZW1vdmVkX3NpemUuICAgKi8KK3N0YXRpYyBpbnQKK2pmZnNfZGVsZXRlX2RhdGEoc3RydWN0IGpmZnNfZmlsZSAqZiwgc3RydWN0IGpmZnNfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgamZmc19ub2RlICpuOworCV9fdTMyIG9mZnNldCA9IG5vZGUtPmRhdGFfb2Zmc2V0OworCV9fdTMyIHJlbW92ZV9zaXplID0gbm9kZS0+cmVtb3ZlZF9zaXplOworCisJRDMocHJpbnRrKCJqZmZzX2RlbGV0ZV9kYXRhKCk6IG9mZnNldCA9ICV1LCByZW1vdmVfc2l6ZSA9ICV1XG4iLAorCQkgIG9mZnNldCwgcmVtb3ZlX3NpemUpKTsKKworCWlmIChyZW1vdmVfc2l6ZSA9PSAwCisJICAgICYmIGYtPnJhbmdlX3RhaWwKKwkgICAgJiYgZi0+cmFuZ2VfdGFpbC0+ZGF0YV9vZmZzZXQgKyBmLT5yYW5nZV90YWlsLT5kYXRhX3NpemUKKwkgICAgICAgPT0gb2Zmc2V0KSB7CisJCS8qIEEgc2ltcGxlIGFwcGVuZDsgbm90aGluZyB0byByZW1vdmUgb3Igbm8gbm9kZSB0byBzcGxpdC4gICovCisJCXJldHVybiAwOworCX0KKworCS8qIEZpbmQgdGhlIG5vZGUgd2hlcmUgd2Ugc2hvdWxkIGJlZ2luIHRoZSByZW1vdmFsLiAgKi8KKwlmb3IgKG4gPSBmLT5yYW5nZV9oZWFkOyBuOyBuID0gbi0+cmFuZ2VfbmV4dCkgeworCQlpZiAobi0+ZGF0YV9vZmZzZXQgKyBuLT5kYXRhX3NpemUgPiBvZmZzZXQpIHsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmICghbikgeworCQkvKiBJZiB0aGVyZSdzIG5vIGRhdGEgaW4gdGhlIGZpbGUgdGhlcmUncyBubyBkYXRhIHRvCisJCSAgIHJlbW92ZSBlaXRoZXIuICAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobi0+ZGF0YV9vZmZzZXQgPiBvZmZzZXQpIHsKKwkJLyogWFhYOiBOb3QgaW1wbGVtZW50ZWQgeWV0LiAgKi8KKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSkZGUzogQW4gdW5leHBlY3RlZCBzaXR1YXRpb24gIgorCQkgICAgICAgIm9jY3VycmVkIGluIGpmZnNfZGVsZXRlX2RhdGEuXG4iKTsKKwl9CisJZWxzZSBpZiAobi0+ZGF0YV9vZmZzZXQgPCBvZmZzZXQpIHsKKwkJLyogU2VlIGlmIHRoZSBub2RlIGhhcyB0byBiZSBzcGxpdCBpbnRvIHR3byBwYXJ0cy4gICovCisJCWlmIChuLT5kYXRhX29mZnNldCArIG4tPmRhdGFfc2l6ZSA+IG9mZnNldCArIHJlbW92ZV9zaXplKSB7CisJCQkvKiBEbyB0aGUgc3BsaXQuICAqLworCQkJc3RydWN0IGpmZnNfbm9kZSAqbmV3X25vZGU7CisJCQlEMyhwcmludGsoImpmZnNfZGVsZXRlX2RhdGEoKTogU3BsaXQgbm9kZSB3aXRoICIKKwkJCQkgICJ2ZXJzaW9uIG51bWJlciAldS5cbiIsIG4tPnZlcnNpb24pKTsKKworCQkJaWYgKCEobmV3X25vZGUgPSBqZmZzX2FsbG9jX25vZGUoKSkpIHsKKwkJCQlEKHByaW50aygiamZmc19kZWxldGVfZGF0YSgpOiAtRU5PTUVNXG4iKSk7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlESk0obm9famZmc19ub2RlKyspOworCisJCQluZXdfbm9kZS0+aW5vID0gbi0+aW5vOworCQkJbmV3X25vZGUtPnZlcnNpb24gPSBuLT52ZXJzaW9uOworCQkJbmV3X25vZGUtPmRhdGFfb2Zmc2V0ID0gb2Zmc2V0OworCQkJbmV3X25vZGUtPmRhdGFfc2l6ZSA9IG4tPmRhdGFfc2l6ZSAtIChyZW1vdmVfc2l6ZSArIChvZmZzZXQgLSBuLT5kYXRhX29mZnNldCkpOworCQkJbmV3X25vZGUtPmZtX29mZnNldCA9IG4tPmZtX29mZnNldCArIChyZW1vdmVfc2l6ZSArIChvZmZzZXQgLSBuLT5kYXRhX29mZnNldCkpOworCQkJbmV3X25vZGUtPm5hbWVfc2l6ZSA9IG4tPm5hbWVfc2l6ZTsKKwkJCW5ld19ub2RlLT5mbSA9IG4tPmZtOworCQkJbmV3X25vZGUtPnZlcnNpb25fcHJldiA9IG47CisJCQluZXdfbm9kZS0+dmVyc2lvbl9uZXh0ID0gbi0+dmVyc2lvbl9uZXh0OworCQkJaWYgKG5ld19ub2RlLT52ZXJzaW9uX25leHQpIHsKKwkJCQluZXdfbm9kZS0+dmVyc2lvbl9uZXh0LT52ZXJzaW9uX3ByZXYKKwkJCQk9IG5ld19ub2RlOworCQkJfQorCQkJZWxzZSB7CisJCQkJZi0+dmVyc2lvbl90YWlsID0gbmV3X25vZGU7CisJCQl9CisJCQluLT52ZXJzaW9uX25leHQgPSBuZXdfbm9kZTsKKwkJCW5ld19ub2RlLT5yYW5nZV9wcmV2ID0gbjsKKwkJCW5ld19ub2RlLT5yYW5nZV9uZXh0ID0gbi0+cmFuZ2VfbmV4dDsKKwkJCWlmIChuZXdfbm9kZS0+cmFuZ2VfbmV4dCkgeworCQkJCW5ld19ub2RlLT5yYW5nZV9uZXh0LT5yYW5nZV9wcmV2ID0gbmV3X25vZGU7CisJCQl9CisJCQllbHNlIHsKKwkJCQlmLT5yYW5nZV90YWlsID0gbmV3X25vZGU7CisJCQl9CisJCQkvKiBBIHZlcnkgaW50ZXJlc3RpbmcgY2FuIG9mIHdvcm1zLiAgKi8KKwkJCW4tPnJhbmdlX25leHQgPSBuZXdfbm9kZTsKKwkJCW4tPmRhdGFfc2l6ZSA9IG9mZnNldCAtIG4tPmRhdGFfb2Zmc2V0OworCQkJaWYgKG5ld19ub2RlLT5mbSkKKwkJCQlqZmZzX2FkZF9ub2RlKG5ld19ub2RlKTsKKwkJCWVsc2UgeworCQkJCUQxKHByaW50ayhLRVJOX1dBUk5JTkcgImpmZnNfZGVsZXRlX2RhdGEoKTogU3BsaXR0aW5nIGFuIGVtcHR5IG5vZGUgKGZpbGUgaG9sZCkuXG4hIikpOworCQkJCUQxKHByaW50ayhLRVJOX1dBUk5JTkcgIkZJWE1FOiBEaWQgZHdtdzIgZG8gdGhlIHJpZ2h0IHRoaW5nIGhlcmU/XG4iKSk7CisJCQl9CisJCQluID0gbmV3X25vZGUtPnJhbmdlX25leHQ7CisJCQlyZW1vdmVfc2l6ZSA9IDA7CisJCX0KKwkJZWxzZSB7CisJCQkvKiBOby4gIE5vIG5lZWQgdG8gc3BsaXQgdGhlIG5vZGUuICBKdXN0IHJlbW92ZQorCQkJICAgdGhlIGVuZCBvZiB0aGUgbm9kZS4gICovCisJCQlpbnQgciA9IG1pbihuLT5kYXRhX29mZnNldCArIG4tPmRhdGFfc2l6ZQorCQkJCQkgLSBvZmZzZXQsIHJlbW92ZV9zaXplKTsKKwkJCW4tPmRhdGFfc2l6ZSAtPSByOworCQkJcmVtb3ZlX3NpemUgLT0gcjsKKwkJCW4gPSBuLT5yYW5nZV9uZXh0OworCQl9CisJfQorCisJLyogUmVtb3ZlIGFzIG1hbnkgbm9kZXMgYXMgbmVjZXNzYXJ5LiAgKi8KKwl3aGlsZSAobiAmJiByZW1vdmVfc2l6ZSkgeworCQlpZiAobi0+ZGF0YV9zaXplIDw9IHJlbW92ZV9zaXplKSB7CisJCQlzdHJ1Y3QgamZmc19ub2RlICpwID0gbjsKKwkJCXJlbW92ZV9zaXplIC09IG4tPmRhdGFfc2l6ZTsKKwkJCW4gPSBuLT5yYW5nZV9uZXh0OworCQkJRDMocHJpbnRrKCJqZmZzX2RlbGV0ZV9kYXRhKCk6IFJlbW92aW5nIG5vZGU6ICIKKwkJCQkgICJpbm86ICV1LCB2ZXJzaW9uOiAldSVzXG4iLAorCQkJCSAgcC0+aW5vLCBwLT52ZXJzaW9uLAorCQkJCSAgKHAtPmZtID8gIiIgOiAiICh2aXJ0dWFsKSIpKSk7CisJCQlpZiAocC0+Zm0pIHsKKwkJCQlqZmZzX2ZtZnJlZShmLT5jLT5mbWMsIHAtPmZtLCBwKTsKKwkJCX0KKwkJCWpmZnNfdW5saW5rX25vZGVfZnJvbV9yYW5nZV9saXN0KGYsIHApOworCQkJamZmc191bmxpbmtfbm9kZV9mcm9tX3ZlcnNpb25fbGlzdChmLCBwKTsKKwkJCWpmZnNfZnJlZV9ub2RlKHApOworCQkJREpNKG5vX2pmZnNfbm9kZS0tKTsKKwkJfQorCQllbHNlIHsKKwkJCW4tPmRhdGFfc2l6ZSAtPSByZW1vdmVfc2l6ZTsKKwkJCW4tPmZtX29mZnNldCArPSByZW1vdmVfc2l6ZTsKKwkJCW4tPmRhdGFfb2Zmc2V0IC09IChub2RlLT5yZW1vdmVkX3NpemUgLSByZW1vdmVfc2l6ZSk7CisJCQluID0gbi0+cmFuZ2VfbmV4dDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogQWRqdXN0IHRoZSBmb2xsb3dpbmcgbm9kZXMnIGluZm9ybWF0aW9uIGFib3V0IG9mZnNldHMgZXRjLiAgKi8KKwl3aGlsZSAobiAmJiBub2RlLT5yZW1vdmVkX3NpemUpIHsKKwkJbi0+ZGF0YV9vZmZzZXQgLT0gbm9kZS0+cmVtb3ZlZF9zaXplOworCQluID0gbi0+cmFuZ2VfbmV4dDsKKwl9CisKKwlpZiAobm9kZS0+cmVtb3ZlZF9zaXplID4gKGYtPnNpemUgLSBub2RlLT5kYXRhX29mZnNldCkpIHsKKwkJLyogSXQncyBwb3NzaWJsZSB0aGF0IHRoZSByZW1vdmVkX3NpemUgaXMgaW4gZmFjdAorCQkgKiBncmVhdGVyIHRoYW4gdGhlIGFtb3VudCBvZiBkYXRhIHdlIGFjdHVhbGx5IHRob3VnaHQKKwkJICogd2VyZSBwcmVzZW50IGluIHRoZSBmaXJzdCBwbGFjZSAtIHNvbWUgb2YgdGhlIG5vZGVzIAorCQkgKiB3aGljaCB0aGlzIG5vZGUgb3JpZ2luYWxseSBvYnNvbGV0ZWQgbWF5IGFscmVhZHkgaGF2ZQorCQkgKiBiZWVuIGRlbGV0ZWQgZnJvbSB0aGUgZmxhc2ggYnkgc3Vic2VxdWVudCBnYXJiYWdlIAorCQkgKiBjb2xsZWN0aW9uLgorCQkgKgorCQkgKiBJZiB0aGlzIGlzIHRoZSBjYXNlLCBkb24ndCBsZXQgZi0+c2l6ZSBnbyBuZWdhdGl2ZS4KKwkJICogQmFkIHRoaW5ncyB3b3VsZCBoYXBwZW4gOikKKwkJICovCisJCWYtPnNpemUgPSBub2RlLT5kYXRhX29mZnNldDsKKwl9IGVsc2UgeworCQlmLT5zaXplIC09IG5vZGUtPnJlbW92ZWRfc2l6ZTsKKwl9CisJRDMocHJpbnRrKCJqZmZzX2RlbGV0ZV9kYXRhKCk6IGYtPnNpemUgPSAlZFxuIiwgZi0+c2l6ZSkpOworCXJldHVybiAwOworfSAvKiBqZmZzX2RlbGV0ZV9kYXRhKCkgICovCisKKworLyogSW5zZXJ0IHNvbWUgZGF0YSBpbnRvIGEgZmlsZS4gIFByaW9yIHRvIHRoZSBjYWxsIHRvIHRoaXMgZnVuY3Rpb24sCisgICBqZmZzX2RlbGV0ZV9kYXRhIHNob3VsZCBiZSBjYWxsZWQuICAqLworc3RhdGljIGludAoramZmc19pbnNlcnRfZGF0YShzdHJ1Y3QgamZmc19maWxlICpmLCBzdHJ1Y3QgamZmc19ub2RlICpub2RlKQoreworCUQzKHByaW50aygiamZmc19pbnNlcnRfZGF0YSgpOiBub2RlLT5kYXRhX29mZnNldCA9ICV1LCAiCisJCSAgIm5vZGUtPmRhdGFfc2l6ZSA9ICV1LCBmLT5zaXplID0gJXVcbiIsCisJCSAgbm9kZS0+ZGF0YV9vZmZzZXQsIG5vZGUtPmRhdGFfc2l6ZSwgZi0+c2l6ZSkpOworCisJLyogRmluZCB0aGUgcG9zaXRpb24gd2hlcmUgd2Ugc2hvdWxkIGluc2VydCBkYXRhLiAgKi8KKwlyZXRyeToKKwlpZiAobm9kZS0+ZGF0YV9vZmZzZXQgPT0gZi0+c2l6ZSkgeworCQkvKiBBIHNpbXBsZSBhcHBlbmQuICBUaGlzIGlzIHRoZSBtb3N0IGNvbW1vbiBvcGVyYXRpb24uICAqLworCQlub2RlLT5yYW5nZV9uZXh0ID0gTlVMTDsKKwkJbm9kZS0+cmFuZ2VfcHJldiA9IGYtPnJhbmdlX3RhaWw7CisJCWlmIChub2RlLT5yYW5nZV9wcmV2KSB7CisJCQlub2RlLT5yYW5nZV9wcmV2LT5yYW5nZV9uZXh0ID0gbm9kZTsKKwkJfQorCQlmLT5yYW5nZV90YWlsID0gbm9kZTsKKwkJZi0+c2l6ZSArPSBub2RlLT5kYXRhX3NpemU7CisJCWlmICghZi0+cmFuZ2VfaGVhZCkgeworCQkJZi0+cmFuZ2VfaGVhZCA9IG5vZGU7CisJCX0KKwl9CisJZWxzZSBpZiAobm9kZS0+ZGF0YV9vZmZzZXQgPCBmLT5zaXplKSB7CisJCS8qIFRyeWluZyB0byBpbnNlcnQgZGF0YSBpbnRvIHRoZSBtaWRkbGUgb2YgdGhlIGZpbGUuICBUaGlzCisJCSAgIG1lYW5zIG5vIHByb2JsZW0gYmVjYXVzZSBqZmZzX2RlbGV0ZV9kYXRhKCkgaGFzIGFscmVhZHkKKwkJICAgcHJlcGFyZWQgdGhlIHJhbmdlIGxpc3QgZm9yIHVzLiAgKi8KKwkJc3RydWN0IGpmZnNfbm9kZSAqbjsKKworCQkvKiBGaW5kIHRoZSBjb3JyZWN0IHBsYWNlIGZvciB0aGUgaW5zZXJ0aW9uIGFuZCB0aGVuIGluc2VydAorCQkgICB0aGUgbm9kZS4gICovCisJCWZvciAobiA9IGYtPnJhbmdlX2hlYWQ7IG47IG4gPSBuLT5yYW5nZV9uZXh0KSB7CisJCQlEMihwcmludGsoIkNvb2wgc3R1ZmYncyBoYXBwZW5pbmchXG4iKSk7CisKKwkJCWlmIChuLT5kYXRhX29mZnNldCA9PSBub2RlLT5kYXRhX29mZnNldCkgeworCQkJCW5vZGUtPnJhbmdlX3ByZXYgPSBuLT5yYW5nZV9wcmV2OworCQkJCWlmIChub2RlLT5yYW5nZV9wcmV2KSB7CisJCQkJCW5vZGUtPnJhbmdlX3ByZXYtPnJhbmdlX25leHQgPSBub2RlOworCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJZi0+cmFuZ2VfaGVhZCA9IG5vZGU7CisJCQkJfQorCQkJCW5vZGUtPnJhbmdlX25leHQgPSBuOworCQkJCW4tPnJhbmdlX3ByZXYgPSBub2RlOworCQkJCWJyZWFrOworCQkJfQorCQkJQVNTRVJUKGVsc2UgaWYgKG4tPmRhdGFfb2Zmc2V0ICsgbi0+ZGF0YV9zaXplID4KKwkJCQkJbm9kZS0+ZGF0YV9vZmZzZXQpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgImpmZnNfaW5zZXJ0X2RhdGEoKTogIgorCQkJCSAgICAgICAiQ291bGRuJ3QgZmluZCBhIHBsYWNlIHRvIGluc2VydCAiCisJCQkJICAgICAgICJ0aGUgZGF0YSFcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0pOworCQl9CisKKwkJLyogQWRqdXN0IGxhdGVyIG5vZGVzJyBvZmZzZXRzIGV0Yy4gICovCisJCW4gPSBub2RlLT5yYW5nZV9uZXh0OworCQl3aGlsZSAobikgeworCQkJbi0+ZGF0YV9vZmZzZXQgKz0gbm9kZS0+ZGF0YV9zaXplOworCQkJbiA9IG4tPnJhbmdlX25leHQ7CisJCX0KKwkJZi0+c2l6ZSArPSBub2RlLT5kYXRhX3NpemU7CisJfQorCWVsc2UgaWYgKG5vZGUtPmRhdGFfb2Zmc2V0ID4gZi0+c2l6ZSkgeworCQkvKiBPa2F5LiAgVGhpcyBpcyB0cmlja3kuICBUaGlzIG1lYW5zIHRoYXQgd2Ugd2FudCB0byBpbnNlcnQKKwkJICAgZGF0YSBhdCBhIHBsYWNlIHRoYXQgaXMgYmV5b25kIHRoZSBsaW1pdHMgb2YgdGhlIGZpbGUgYXMKKwkJICAgaXQgaXMgY29uc3RydWN0ZWQgcmlnaHQgbm93LiAgVGhpcyBpcyBhY3R1YWxseSBhIGNvbW1vbgorCQkgICBldmVudCB0aGF0IGZvciBpbnN0YW5jZSBjb3VsZCBvY2N1ciBkdXJpbmcgdGhlIG1vdW50aW5nCisJCSAgIG9mIHRoZSBmaWxlIHN5c3RlbSBpZiBhIGxhcmdlIGZpbGUgaGF2ZSBiZWVuIHRydW5jYXRlZCwKKwkJICAgcmV3cml0dGVuIGFuZCB0aGVuIG9ubHkgcGFydGlhbGx5IGdhcmJhZ2UgY29sbGVjdGVkLiAgKi8KKworCQlzdHJ1Y3QgamZmc19ub2RlICpuOworCisJCS8qIFdlIG5lZWQgYSBwbGFjZSBob2xkZXIgZm9yIHRoZSBkYXRhIHRoYXQgaXMgbWlzc2luZyBpbgorCQkgICBmcm9udCBvZiB0aGlzIGluc2VydGlvbi4gIFRoaXMgInZpcnR1YWwgbm9kZSIgd2lsbCBub3QKKwkJICAgYmUgYXNzb2NpYXRlZCB3aXRoIGFueSBzcGFjZSBvbiB0aGUgZmxhc2ggZGV2aWNlLiAgKi8KKwkJc3RydWN0IGpmZnNfbm9kZSAqdmlydHVhbF9ub2RlOworCQlpZiAoISh2aXJ0dWFsX25vZGUgPSBqZmZzX2FsbG9jX25vZGUoKSkpIHsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJRChwcmludGsoImpmZnNfaW5zZXJ0X2RhdGE6IEluc2VydGluZyBhIHZpcnR1YWwgbm9kZS5cbiIpKTsKKwkJRChwcmludGsoIiAgbm9kZS0+ZGF0YV9vZmZzZXQgPSAldVxuIiwgbm9kZS0+ZGF0YV9vZmZzZXQpKTsKKwkJRChwcmludGsoIiAgZi0+c2l6ZSA9ICV1XG4iLCBmLT5zaXplKSk7CisKKwkJdmlydHVhbF9ub2RlLT5pbm8gPSBub2RlLT5pbm87CisJCXZpcnR1YWxfbm9kZS0+dmVyc2lvbiA9IG5vZGUtPnZlcnNpb247CisJCXZpcnR1YWxfbm9kZS0+cmVtb3ZlZF9zaXplID0gMDsKKwkJdmlydHVhbF9ub2RlLT5mbV9vZmZzZXQgPSAwOworCQl2aXJ0dWFsX25vZGUtPm5hbWVfc2l6ZSA9IDA7CisJCXZpcnR1YWxfbm9kZS0+Zm0gPSBOVUxMOyAvKiBUaGlzIGlzIGEgdmlydHVhbCBkYXRhIGhvbGRlci4gICovCisJCXZpcnR1YWxfbm9kZS0+dmVyc2lvbl9wcmV2ID0gTlVMTDsKKwkJdmlydHVhbF9ub2RlLT52ZXJzaW9uX25leHQgPSBOVUxMOworCQl2aXJ0dWFsX25vZGUtPnJhbmdlX25leHQgPSBOVUxMOworCisJCS8qIEFyZSB0aGVyZSBhbnkgZGF0YSBhdCBhbGwgaW4gdGhlIGZpbGUgeWV0PyAgKi8KKwkJaWYgKGYtPnJhbmdlX2hlYWQpIHsKKwkJCXZpcnR1YWxfbm9kZS0+ZGF0YV9vZmZzZXQKKwkJCT0gZi0+cmFuZ2VfdGFpbC0+ZGF0YV9vZmZzZXQKKwkJCSAgKyBmLT5yYW5nZV90YWlsLT5kYXRhX3NpemU7CisJCQl2aXJ0dWFsX25vZGUtPmRhdGFfc2l6ZQorCQkJPSBub2RlLT5kYXRhX29mZnNldCAtIHZpcnR1YWxfbm9kZS0+ZGF0YV9vZmZzZXQ7CisJCQl2aXJ0dWFsX25vZGUtPnJhbmdlX3ByZXYgPSBmLT5yYW5nZV90YWlsOworCQkJZi0+cmFuZ2VfdGFpbC0+cmFuZ2VfbmV4dCA9IHZpcnR1YWxfbm9kZTsKKwkJfQorCQllbHNlIHsKKwkJCXZpcnR1YWxfbm9kZS0+ZGF0YV9vZmZzZXQgPSAwOworCQkJdmlydHVhbF9ub2RlLT5kYXRhX3NpemUgPSBub2RlLT5kYXRhX29mZnNldDsKKwkJCXZpcnR1YWxfbm9kZS0+cmFuZ2VfcHJldiA9IE5VTEw7CisJCQlmLT5yYW5nZV9oZWFkID0gdmlydHVhbF9ub2RlOworCQl9CisKKwkJZi0+cmFuZ2VfdGFpbCA9IHZpcnR1YWxfbm9kZTsKKwkJZi0+c2l6ZSArPSB2aXJ0dWFsX25vZGUtPmRhdGFfc2l6ZTsKKworCQkvKiBJbnNlcnQgdGhpcyB2aXJ0dWFsIG5vZGUgaW4gdGhlIHZlcnNpb24gbGlzdCBhcyB3ZWxsLiAgKi8KKwkJZm9yIChuID0gZi0+dmVyc2lvbl9oZWFkOyBuIDsgbiA9IG4tPnZlcnNpb25fbmV4dCkgeworCQkJaWYgKG4tPnZlcnNpb24gPT0gdmlydHVhbF9ub2RlLT52ZXJzaW9uKSB7CisJCQkJdmlydHVhbF9ub2RlLT52ZXJzaW9uX3ByZXYgPSBuLT52ZXJzaW9uX3ByZXY7CisJCQkJbi0+dmVyc2lvbl9wcmV2ID0gdmlydHVhbF9ub2RlOworCQkJCWlmICh2aXJ0dWFsX25vZGUtPnZlcnNpb25fcHJldikgeworCQkJCQl2aXJ0dWFsX25vZGUtPnZlcnNpb25fcHJldgorCQkJCQktPnZlcnNpb25fbmV4dCA9IHZpcnR1YWxfbm9kZTsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCWYtPnZlcnNpb25faGVhZCA9IHZpcnR1YWxfbm9kZTsKKwkJCQl9CisJCQkJdmlydHVhbF9ub2RlLT52ZXJzaW9uX25leHQgPSBuOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJRChqZmZzX3ByaW50X25vZGUodmlydHVhbF9ub2RlKSk7CisKKwkJLyogTWFrZSBhIG5ldyB0cnkgdG8gaW5zZXJ0IHRoZSBub2RlLiAgKi8KKwkJZ290byByZXRyeTsKKwl9CisKKwlEMyhwcmludGsoImpmZnNfaW5zZXJ0X2RhdGEoKTogZi0+c2l6ZSA9ICVkXG4iLCBmLT5zaXplKSk7CisJcmV0dXJuIDA7Cit9CisKKworLyogQSBuZXcgbm9kZSAod2l0aCBkYXRhKSBoYXMgYmVlbiBhZGRlZCB0byB0aGUgZmlsZSBhbmQgbm93IHRoZSByYW5nZQorICAgbGlzdCBoYXMgdG8gYmUgbW9kaWZpZWQuICAqLworc3RhdGljIGludAoramZmc191cGRhdGVfZmlsZShzdHJ1Y3QgamZmc19maWxlICpmLCBzdHJ1Y3QgamZmc19ub2RlICpub2RlKQoreworCWludCBlcnI7CisKKwlEMyhwcmludGsoImpmZnNfdXBkYXRlX2ZpbGUoKTogaW5vOiAldSwgdmVyc2lvbjogJXVcbiIsCisJCSAgZi0+aW5vLCBub2RlLT52ZXJzaW9uKSk7CisKKwlpZiAobm9kZS0+ZGF0YV9zaXplID09IDApIHsKKwkJaWYgKG5vZGUtPnJlbW92ZWRfc2l6ZSA9PSAwKSB7CisJCQkvKiBkYXRhX29mZnNldCA9PSBYICAqLworCQkJLyogZGF0YV9zaXplID09IDAgICovCisJCQkvKiByZW1vdmVfc2l6ZSA9PSAwICAqLworCQl9CisJCWVsc2UgeworCQkJLyogZGF0YV9vZmZzZXQgPT0gWCAgKi8KKwkJCS8qIGRhdGFfc2l6ZSA9PSAwICAqLworCQkJLyogcmVtb3ZlX3NpemUgIT0gMCAgKi8KKwkJCWlmICgoZXJyID0gamZmc19kZWxldGVfZGF0YShmLCBub2RlKSkgPCAwKSB7CisJCQkJcmV0dXJuIGVycjsKKwkJCX0KKwkJfQorCX0KKwllbHNlIHsKKwkJLyogZGF0YV9vZmZzZXQgPT0gWCAgKi8KKwkJLyogZGF0YV9zaXplICE9IDAgICovCisJCS8qIHJlbW92ZV9zaXplID09IFkgICovCisJCWlmICgoZXJyID0gamZmc19kZWxldGVfZGF0YShmLCBub2RlKSkgPCAwKSB7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCWlmICgoZXJyID0gamZmc19pbnNlcnRfZGF0YShmLCBub2RlKSkgPCAwKSB7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKiBQcmludCB0aGUgY29udGVudHMgb2YgYSBub2RlLiAgKi8KK3ZvaWQKK2pmZnNfcHJpbnRfbm9kZShzdHJ1Y3QgamZmc19ub2RlICpuKQoreworCUQocHJpbnRrKCJqZmZzX25vZGU6IDB4JXBcbiIsIG4pKTsKKwlEKHByaW50aygie1xuIikpOworCUQocHJpbnRrKCIgICAgICAgIDB4JTA4eCwgLyogdmVyc2lvbiAgKi9cbiIsIG4tPnZlcnNpb24pKTsKKwlEKHByaW50aygiICAgICAgICAweCUwOHgsIC8qIGRhdGFfb2Zmc2V0ICAqL1xuIiwgbi0+ZGF0YV9vZmZzZXQpKTsKKwlEKHByaW50aygiICAgICAgICAweCUwOHgsIC8qIGRhdGFfc2l6ZSAgKi9cbiIsIG4tPmRhdGFfc2l6ZSkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JTA4eCwgLyogcmVtb3ZlZF9zaXplICAqL1xuIiwgbi0+cmVtb3ZlZF9zaXplKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDh4LCAvKiBmbV9vZmZzZXQgICovXG4iLCBuLT5mbV9vZmZzZXQpKTsKKwlEKHByaW50aygiICAgICAgICAweCUwMngsICAgICAgIC8qIG5hbWVfc2l6ZSAgKi9cbiIsIG4tPm5hbWVfc2l6ZSkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIGZtLCAgZm0tPm9mZnNldDogJXUgICovXG4iLAorCQkgbi0+Zm0sIChuLT5mbSA/IG4tPmZtLT5vZmZzZXQgOiAwKSkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIHZlcnNpb25fcHJldiAgKi9cbiIsIG4tPnZlcnNpb25fcHJldikpOworCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIHZlcnNpb25fbmV4dCAgKi9cbiIsIG4tPnZlcnNpb25fbmV4dCkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIHJhbmdlX3ByZXYgICovXG4iLCBuLT5yYW5nZV9wcmV2KSk7CisJRChwcmludGsoIiAgICAgICAgMHglcCwgLyogcmFuZ2VfbmV4dCAgKi9cbiIsIG4tPnJhbmdlX25leHQpKTsKKwlEKHByaW50aygifVxuIikpOworfQorCisKKy8qIFByaW50IHRoZSBjb250ZW50cyBvZiBhIHJhdyBpbm9kZS4gICovCit2b2lkCitqZmZzX3ByaW50X3Jhd19pbm9kZShzdHJ1Y3QgamZmc19yYXdfaW5vZGUgKnJhd19pbm9kZSkKK3sKKwlEKHByaW50aygiamZmc19yYXdfaW5vZGU6IGlub2RlIG51bWJlcjogJXVcbiIsIHJhd19pbm9kZS0+aW5vKSk7CisJRChwcmludGsoIntcbiIpKTsKKwlEKHByaW50aygiICAgICAgICAweCUwOHgsIC8qIG1hZ2ljICAqL1xuIiwgcmF3X2lub2RlLT5tYWdpYykpOworCUQocHJpbnRrKCIgICAgICAgIDB4JTA4eCwgLyogaW5vICAqL1xuIiwgcmF3X2lub2RlLT5pbm8pKTsKKwlEKHByaW50aygiICAgICAgICAweCUwOHgsIC8qIHBpbm8gICovXG4iLCByYXdfaW5vZGUtPnBpbm8pKTsKKwlEKHByaW50aygiICAgICAgICAweCUwOHgsIC8qIHZlcnNpb24gICovXG4iLCByYXdfaW5vZGUtPnZlcnNpb24pKTsKKwlEKHByaW50aygiICAgICAgICAweCUwOHgsIC8qIG1vZGUgICovXG4iLCByYXdfaW5vZGUtPm1vZGUpKTsKKwlEKHByaW50aygiICAgICAgICAweCUwNHgsICAgICAvKiB1aWQgICovXG4iLCByYXdfaW5vZGUtPnVpZCkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JTA0eCwgICAgIC8qIGdpZCAgKi9cbiIsIHJhd19pbm9kZS0+Z2lkKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDh4LCAvKiBhdGltZSAgKi9cbiIsIHJhd19pbm9kZS0+YXRpbWUpKTsKKwlEKHByaW50aygiICAgICAgICAweCUwOHgsIC8qIG10aW1lICAqL1xuIiwgcmF3X2lub2RlLT5tdGltZSkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JTA4eCwgLyogY3RpbWUgICovXG4iLCByYXdfaW5vZGUtPmN0aW1lKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDh4LCAvKiBvZmZzZXQgICovXG4iLCByYXdfaW5vZGUtPm9mZnNldCkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JTA4eCwgLyogZHNpemUgICovXG4iLCByYXdfaW5vZGUtPmRzaXplKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDh4LCAvKiByc2l6ZSAgKi9cbiIsIHJhd19pbm9kZS0+cnNpemUpKTsKKwlEKHByaW50aygiICAgICAgICAweCUwMngsICAgICAgIC8qIG5zaXplICAqL1xuIiwgcmF3X2lub2RlLT5uc2l6ZSkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JTAyeCwgICAgICAgLyogbmxpbmsgICovXG4iLCByYXdfaW5vZGUtPm5saW5rKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDJ4LCAgICAgICAvKiBzcGFyZSAgKi9cbiIsCisJCSByYXdfaW5vZGUtPnNwYXJlKSk7CisJRChwcmludGsoIiAgICAgICAgJXUsICAgICAgICAgIC8qIHJlbmFtZSAgKi9cbiIsCisJCSByYXdfaW5vZGUtPnJlbmFtZSkpOworCUQocHJpbnRrKCIgICAgICAgICV1LCAgICAgICAgICAvKiBkZWxldGVkICAqL1xuIiwKKwkJIHJhd19pbm9kZS0+ZGVsZXRlZCkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JTAyeCwgICAgICAgLyogYWNjdXJhdGUgICovXG4iLAorCQkgcmF3X2lub2RlLT5hY2N1cmF0ZSkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JTA4eCwgLyogZGNoa3N1bSAgKi9cbiIsIHJhd19pbm9kZS0+ZGNoa3N1bSkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JTA0eCwgICAgIC8qIG5jaGtzdW0gICovXG4iLCByYXdfaW5vZGUtPm5jaGtzdW0pKTsKKwlEKHByaW50aygiICAgICAgICAweCUwNHgsICAgICAvKiBjaGtzdW0gICovXG4iLCByYXdfaW5vZGUtPmNoa3N1bSkpOworCUQocHJpbnRrKCJ9XG4iKSk7Cit9CisKKworLyogUHJpbnQgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZS4gICovCisjaWYgMAoraW50CitqZmZzX3ByaW50X2ZpbGUoc3RydWN0IGpmZnNfZmlsZSAqZikKK3sKKwlEKGludCBpKTsKKwlEKHByaW50aygiamZmc19maWxlOiAweCVwXG4iLCBmKSk7CisJRChwcmludGsoIntcbiIpKTsKKwlEKHByaW50aygiICAgICAgICAweCUwOHgsIC8qIGlubyAgKi9cbiIsIGYtPmlubykpOworCUQocHJpbnRrKCIgICAgICAgIDB4JTA4eCwgLyogcGlubyAgKi9cbiIsIGYtPnBpbm8pKTsKKwlEKHByaW50aygiICAgICAgICAweCUwOHgsIC8qIG1vZGUgICovXG4iLCBmLT5tb2RlKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDR4LCAgICAgLyogdWlkICAqL1xuIiwgZi0+dWlkKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDR4LCAgICAgLyogZ2lkICAqL1xuIiwgZi0+Z2lkKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDh4LCAvKiBhdGltZSAgKi9cbiIsIGYtPmF0aW1lKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDh4LCAvKiBtdGltZSAgKi9cbiIsIGYtPm10aW1lKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDh4LCAvKiBjdGltZSAgKi9cbiIsIGYtPmN0aW1lKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDJ4LCAgICAgICAvKiBuc2l6ZSAgKi9cbiIsIGYtPm5zaXplKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDJ4LCAgICAgICAvKiBubGluayAgKi9cbiIsIGYtPm5saW5rKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDJ4LCAgICAgICAvKiBkZWxldGVkICAqL1xuIiwgZi0+ZGVsZXRlZCkpOworCUQocHJpbnRrKCIgICAgICAgIFwiJXNcIiwgIiwgKGYtPm5hbWUgPyBmLT5uYW1lIDogIiIpKSk7CisJRChmb3IgKGkgPSBzdHJsZW4oZi0+bmFtZSA/IGYtPm5hbWUgOiAiIik7IGkgPCA4OyArK2kpIHsKKwkJcHJpbnRrKCIgIik7CisJfSk7CisJRChwcmludGsoIi8qIG5hbWUgICovXG4iKSk7CisJRChwcmludGsoIiAgICAgICAgMHglMDh4LCAvKiBzaXplICAqL1xuIiwgZi0+c2l6ZSkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JTA4eCwgLyogaGlnaGVzdF92ZXJzaW9uICAqL1xuIiwKKwkJIGYtPmhpZ2hlc3RfdmVyc2lvbikpOworCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIGMgICovXG4iLCBmLT5jKSk7CisJRChwcmludGsoIiAgICAgICAgMHglcCwgLyogcGFyZW50ICAqL1xuIiwgZi0+cGFyZW50KSk7CisJRChwcmludGsoIiAgICAgICAgMHglcCwgLyogY2hpbGRyZW4gICovXG4iLCBmLT5jaGlsZHJlbikpOworCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIHNpYmxpbmdfcHJldiAgKi9cbiIsIGYtPnNpYmxpbmdfcHJldikpOworCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIHNpYmxpbmdfbmV4dCAgKi9cbiIsIGYtPnNpYmxpbmdfbmV4dCkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIGhhc2hfcHJldiAgKi9cbiIsIGYtPmhhc2gucHJldikpOworCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIGhhc2hfbmV4dCAgKi9cbiIsIGYtPmhhc2gubmV4dCkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIHJhbmdlX2hlYWQgICovXG4iLCBmLT5yYW5nZV9oZWFkKSk7CisJRChwcmludGsoIiAgICAgICAgMHglcCwgLyogcmFuZ2VfdGFpbCAgKi9cbiIsIGYtPnJhbmdlX3RhaWwpKTsKKwlEKHByaW50aygiICAgICAgICAweCVwLCAvKiB2ZXJzaW9uX2hlYWQgICovXG4iLCBmLT52ZXJzaW9uX2hlYWQpKTsKKwlEKHByaW50aygiICAgICAgICAweCVwLCAvKiB2ZXJzaW9uX3RhaWwgICovXG4iLCBmLT52ZXJzaW9uX3RhaWwpKTsKKwlEKHByaW50aygifVxuIikpOworCXJldHVybiAwOworfQorI2VuZGlmICAvKiAgMCAgKi8KKwordm9pZAoramZmc19wcmludF9oYXNoX3RhYmxlKHN0cnVjdCBqZmZzX2NvbnRyb2wgKmMpCit7CisJaW50IGk7CisKKwlwcmludGsoIkpGRlM6IER1bXBpbmcgdGhlIGZpbGUgc3lzdGVtJ3MgaGFzaCB0YWJsZS4uLlxuIik7CisJZm9yIChpID0gMDsgaSA8IGMtPmhhc2hfbGVuOyBpKyspIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwkJZm9yIChwID0gYy0+aGFzaFtpXS5uZXh0OyBwICE9ICZjLT5oYXNoW2ldOyBwID0gcC0+bmV4dCkgeworCQkJc3RydWN0IGpmZnNfZmlsZSAqZj1saXN0X2VudHJ5KHAsc3RydWN0IGpmZnNfZmlsZSxoYXNoKTsKKwkJCXByaW50aygiKioqIGMtPmhhc2hbJXVdOiBcIiVzXCIgIgorCQkJICAgICAgICIoaW5vOiAldSwgcGlubzogJXUpXG4iLAorCQkJICAgICAgIGksIChmLT5uYW1lID8gZi0+bmFtZSA6ICIiKSwKKwkJCSAgICAgICBmLT5pbm8sIGYtPnBpbm8pOworCQl9CisJfQorfQorCisKK3ZvaWQKK2pmZnNfcHJpbnRfdHJlZShzdHJ1Y3QgamZmc19maWxlICpmaXJzdF9maWxlLCBpbnQgaW5kZW50KQoreworCXN0cnVjdCBqZmZzX2ZpbGUgKmY7CisJY2hhciAqc3BhY2U7CisJaW50IGRpcjsKKworCWlmICghZmlyc3RfZmlsZSkgeworCQlyZXR1cm47CisJfQorCisJaWYgKCEoc3BhY2UgPSAoY2hhciAqKSBrbWFsbG9jKGluZGVudCArIDEsIEdGUF9LRVJORUwpKSkgeworCQlwcmludGsoImpmZnNfcHJpbnRfdHJlZSgpOiBPdXQgb2YgbWVtb3J5IVxuIik7CisJCXJldHVybjsKKwl9CisKKwltZW1zZXQoc3BhY2UsICcgJywgaW5kZW50KTsKKwlzcGFjZVtpbmRlbnRdID0gJ1wwJzsKKworCWZvciAoZiA9IGZpcnN0X2ZpbGU7IGY7IGYgPSBmLT5zaWJsaW5nX25leHQpIHsKKwkJZGlyID0gU19JU0RJUihmLT5tb2RlKTsKKwkJcHJpbnRrKCIlcyVzJXMgKGlubzogJXUsIGhpZ2hlc3RfdmVyc2lvbjogJXUsIHNpemU6ICV1KVxuIiwKKwkJICAgICAgIHNwYWNlLCAoZi0+bmFtZSA/IGYtPm5hbWUgOiAiIiksIChkaXIgPyAiLyIgOiAiIiksCisJCSAgICAgICBmLT5pbm8sIGYtPmhpZ2hlc3RfdmVyc2lvbiwgZi0+c2l6ZSk7CisJCWlmIChkaXIpIHsKKwkJCWpmZnNfcHJpbnRfdHJlZShmLT5jaGlsZHJlbiwgaW5kZW50ICsgMik7CisJCX0KKwl9CisKKwlrZnJlZShzcGFjZSk7Cit9CisKKworI2lmIGRlZmluZWQoSkZGU19NRU1PUllfREVCVUcpICYmIEpGRlNfTUVNT1JZX0RFQlVHCit2b2lkCitqZmZzX3ByaW50X21lbW9yeV9hbGxvY2F0aW9uX3N0YXRpc3RpY3Modm9pZCkKK3sKKwlzdGF0aWMgbG9uZyBwcmludG91dDsKKwlwcmludGsoIl9fX19fX19fIE1lbW9yeSBwcmludG91dCAjJWxkIF9fX19fX19fXG4iLCArK3ByaW50b3V0KTsKKwlwcmludGsoIm5vX2pmZnNfZmlsZSA9ICVsZFxuIiwgbm9famZmc19maWxlKTsKKwlwcmludGsoIm5vX2pmZnNfbm9kZSA9ICVsZFxuIiwgbm9famZmc19ub2RlKTsKKwlwcmludGsoIm5vX2pmZnNfY29udHJvbCA9ICVsZFxuIiwgbm9famZmc19jb250cm9sKTsKKwlwcmludGsoIm5vX2pmZnNfcmF3X2lub2RlID0gJWxkXG4iLCBub19qZmZzX3Jhd19pbm9kZSk7CisJcHJpbnRrKCJub19qZmZzX25vZGVfcmVmID0gJWxkXG4iLCBub19qZmZzX25vZGVfcmVmKTsKKwlwcmludGsoIm5vX2pmZnNfZm0gPSAlbGRcbiIsIG5vX2pmZnNfZm0pOworCXByaW50aygibm9famZmc19mbWNvbnRyb2wgPSAlbGRcbiIsIG5vX2pmZnNfZm1jb250cm9sKTsKKwlwcmludGsoIm5vX2hhc2ggPSAlbGRcbiIsIG5vX2hhc2gpOworCXByaW50aygibm9fbmFtZSA9ICVsZFxuIiwgbm9fbmFtZSk7CisJcHJpbnRrKCJcbiIpOworfQorI2VuZGlmCisKKworLyogUmV3cml0ZSBgc2l6ZScgYnl0ZXMsIGFuZCBiZWdpbiBhdCBgbm9kZScuICAqLworc3RhdGljIGludAoramZmc19yZXdyaXRlX2RhdGEoc3RydWN0IGpmZnNfZmlsZSAqZiwgc3RydWN0IGpmZnNfbm9kZSAqbm9kZSwgX191MzIgc2l6ZSkKK3sKKwlzdHJ1Y3QgamZmc19jb250cm9sICpjID0gZi0+YzsKKwlzdHJ1Y3QgamZmc19mbWNvbnRyb2wgKmZtYyA9IGMtPmZtYzsKKwlzdHJ1Y3QgamZmc19yYXdfaW5vZGUgcmF3X2lub2RlOworCXN0cnVjdCBqZmZzX25vZGUgKm5ld19ub2RlOworCXN0cnVjdCBqZmZzX2ZtICpmbTsKKwlfX3UzMiBwb3M7CisJX191MzIgcG9zX2RjaGtzdW07CisJX191MzIgdG90YWxfbmFtZV9zaXplOworCV9fdTMyIHRvdGFsX2RhdGFfc2l6ZTsKKwlfX3UzMiB0b3RhbF9zaXplOworCWludCBlcnI7CisKKwlEMShwcmludGsoIioqKmpmZnNfcmV3cml0ZV9kYXRhKCk6IG5vZGU6ICV1LCBuYW1lOiBcIiVzXCIsIHNpemU6ICV1XG4iLAorCQkgIGYtPmlubywgKGYtPm5hbWUgPyBmLT5uYW1lIDogIihudWxsKSIpLCBzaXplKSk7CisKKwkvKiBDcmVhdGUgYW5kIGluaXRpYWxpemUgdGhlIG5ldyBub2RlLiAgKi8KKwlpZiAoIShuZXdfbm9kZSA9IGpmZnNfYWxsb2Nfbm9kZSgpKSkgeworCQlEKHByaW50aygiamZmc19yZXdyaXRlX2RhdGEoKTogIgorCQkJICJGYWlsZWQgdG8gYWxsb2NhdGUgbm9kZS5cbiIpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCURKTShub19qZmZzX25vZGUrKyk7CisJbmV3X25vZGUtPmRhdGFfb2Zmc2V0ID0gbm9kZS0+ZGF0YV9vZmZzZXQ7CisJbmV3X25vZGUtPnJlbW92ZWRfc2l6ZSA9IHNpemU7CisJdG90YWxfbmFtZV9zaXplID0gSkZGU19QQUQoZi0+bnNpemUpOworCXRvdGFsX2RhdGFfc2l6ZSA9IEpGRlNfUEFEKHNpemUpOworCXRvdGFsX3NpemUgPSBzaXplb2Yoc3RydWN0IGpmZnNfcmF3X2lub2RlKQorCQkgICAgICsgdG90YWxfbmFtZV9zaXplICsgdG90YWxfZGF0YV9zaXplOworCW5ld19ub2RlLT5mbV9vZmZzZXQgPSBzaXplb2Yoc3RydWN0IGpmZnNfcmF3X2lub2RlKQorCQkJICAgICAgKyB0b3RhbF9uYW1lX3NpemU7CisKK3JldHJ5OgorCWpmZnNfZm1fd3JpdGVfbG9jayhmbWMpOworCWVyciA9IDA7CisKKwlpZiAoKGVyciA9IGpmZnNfZm1hbGxvYyhmbWMsIHRvdGFsX3NpemUsIG5ld19ub2RlLCAmZm0pKSA8IDApIHsKKwkJREpNKG5vX2pmZnNfbm9kZS0tKTsKKwkJamZmc19mbV93cml0ZV91bmxvY2soZm1jKTsKKwkJRChwcmludGsoImpmZnNfcmV3cml0ZV9kYXRhKCk6IEZhaWxlZCB0byBhbGxvY2F0ZSBmbS5cbiIpKTsKKwkJamZmc19mcmVlX25vZGUobmV3X25vZGUpOworCQlyZXR1cm4gZXJyOworCX0KKwllbHNlIGlmICghZm0tPm5vZGVzKSB7CisJCS8qIFRoZSBqZmZzX2ZtIHN0cnVjdCB0aGF0IHdlIGdvdCBpcyBub3QgYmlnIGVub3VnaC4gICovCisJCS8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiwgYmVjYXVzZSB3ZSBkZWFsIHdpdGggdGhpcyBjYXNlCisJCSAgIGluIGpmZnNfZ2FyYmFnZV9jb2xsZWN0X25leHQoKS4qLworCQlwcmludGsoS0VSTl9XQVJOSU5HICJqZmZzX3Jld3JpdGVfZGF0YSgpOiBBbGxvY2F0ZWQgbm9kZSBpcyB0b28gc21hbGwgKCVkIGJ5dGVzIG9mICVkKVxuIiwgZm0tPnNpemUsIHRvdGFsX3NpemUpOworCQlpZiAoKGVyciA9IGpmZnNfd3JpdGVfZHVtbXlfbm9kZShjLCBmbSkpIDwgMCkgeworCQkJRChwcmludGsoImpmZnNfcmV3cml0ZV9kYXRhKCk6ICIKKwkJCQkgImpmZnNfd3JpdGVfZHVtbXlfbm9kZSgpIEZhaWxlZCFcbiIpKTsKKwkJfSBlbHNlIHsKKwkJCWVyciA9IC1FTk9TUEM7CisJCX0KKwkJREpNKG5vX2pmZnNfZm0tLSk7CisJCWpmZnNfZm1fd3JpdGVfdW5sb2NrKGZtYyk7CisJCWtmcmVlKGZtKTsKKwkJCisJCXJldHVybiBlcnI7CisJfQorCW5ld19ub2RlLT5mbSA9IGZtOworCisJLyogSW5pdGlhbGl6ZSB0aGUgcmF3IGlub2RlLiAgKi8KKwlyYXdfaW5vZGUubWFnaWMgPSBKRkZTX01BR0lDX0JJVE1BU0s7CisJcmF3X2lub2RlLmlubyA9IGYtPmlubzsKKwlyYXdfaW5vZGUucGlubyA9IGYtPnBpbm87CisJcmF3X2lub2RlLnZlcnNpb24gPSBmLT5oaWdoZXN0X3ZlcnNpb24gKyAxOworCXJhd19pbm9kZS5tb2RlID0gZi0+bW9kZTsKKwlyYXdfaW5vZGUudWlkID0gZi0+dWlkOworCXJhd19pbm9kZS5naWQgPSBmLT5naWQ7CisJcmF3X2lub2RlLmF0aW1lID0gZi0+YXRpbWU7CisJcmF3X2lub2RlLm10aW1lID0gZi0+bXRpbWU7CisJcmF3X2lub2RlLmN0aW1lID0gZi0+Y3RpbWU7CisJcmF3X2lub2RlLm9mZnNldCA9IG5vZGUtPmRhdGFfb2Zmc2V0OworCXJhd19pbm9kZS5kc2l6ZSA9IHNpemU7CisJcmF3X2lub2RlLnJzaXplID0gc2l6ZTsKKwlyYXdfaW5vZGUubnNpemUgPSBmLT5uc2l6ZTsKKwlyYXdfaW5vZGUubmxpbmsgPSBmLT5ubGluazsKKwlyYXdfaW5vZGUuc3BhcmUgPSAwOworCXJhd19pbm9kZS5yZW5hbWUgPSAwOworCXJhd19pbm9kZS5kZWxldGVkID0gZi0+ZGVsZXRlZDsKKwlyYXdfaW5vZGUuYWNjdXJhdGUgPSAweGZmOworCXJhd19pbm9kZS5kY2hrc3VtID0gMDsKKwlyYXdfaW5vZGUubmNoa3N1bSA9IDA7CisKKwlwb3MgPSBuZXdfbm9kZS0+Zm0tPm9mZnNldDsKKwlwb3NfZGNoa3N1bSA9IHBvcyArSkZGU19SQVdfSU5PREVfRENIS1NVTV9PRkZTRVQ7CisKKwlEMyhwcmludGsoImpmZnNfcmV3cml0ZV9kYXRhKCk6IFdyaXRpbmcgdGhpcyByYXcgaW5vZGUgIgorCQkgICJ0byBwb3MgMHgldWwuXG4iLCBwb3MpKTsKKwlEMyhqZmZzX3ByaW50X3Jhd19pbm9kZSgmcmF3X2lub2RlKSk7CisKKwlpZiAoKGVyciA9IGZsYXNoX3NhZmVfd3JpdGUoZm1jLT5tdGQsIHBvcywKKwkJCQkgICAgKHVfY2hhciAqKSAmcmF3X2lub2RlLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IGpmZnNfcmF3X2lub2RlKQorCQkJCSAgICAtIHNpemVvZihfX3UzMikKKwkJCQkgICAgLSBzaXplb2YoX191MTYpIC0gc2l6ZW9mKF9fdTE2KSkpIDwgMCkgeworCQlqZmZzX2ZtZnJlZV9wYXJ0bHkoZm1jLCBmbSwKKwkJCQkgICB0b3RhbF9uYW1lX3NpemUgKyB0b3RhbF9kYXRhX3NpemUpOworCQlqZmZzX2ZtX3dyaXRlX3VubG9jayhmbWMpOworCQlwcmludGsoS0VSTl9FUlIgIkpGRlM6IGpmZnNfcmV3cml0ZV9kYXRhOiBXcml0ZSBlcnJvciBkdXJpbmcgIgorCQkJInJld3JpdGUuIChyYXcgaW5vZGUpXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJKRkZTOiBqZmZzX3Jld3JpdGVfZGF0YTogTm93IHJldHJ5aW5nICIKKwkJCSJyZXdyaXRlLiAocmF3IGlub2RlKVxuIik7CisJCWdvdG8gcmV0cnk7CisJfQorCXBvcyArPSBzaXplb2Yoc3RydWN0IGpmZnNfcmF3X2lub2RlKTsKKworCS8qIFdyaXRlIHRoZSBuYW1lIHRvIHRoZSBmbGFzaCBtZW1vcnkuICAqLworCWlmIChmLT5uc2l6ZSkgeworCQlEMyhwcmludGsoImpmZnNfcmV3cml0ZV9kYXRhKCk6IFdyaXRpbmcgbmFtZSBcIiVzXCIgdG8gIgorCQkJICAicG9zIDB4JXVsLlxuIiwgZi0+bmFtZSwgKHVuc2lnbmVkIGludCkgcG9zKSk7CisJCWlmICgoZXJyID0gZmxhc2hfc2FmZV93cml0ZShmbWMtPm10ZCwgcG9zLAorCQkJCQkgICAgKHVfY2hhciAqKWYtPm5hbWUsCisJCQkJCSAgICBmLT5uc2l6ZSkpIDwgMCkgeworCQkJamZmc19mbWZyZWVfcGFydGx5KGZtYywgZm0sIHRvdGFsX2RhdGFfc2l6ZSk7CisJCQlqZmZzX2ZtX3dyaXRlX3VubG9jayhmbWMpOworCQkJcHJpbnRrKEtFUk5fRVJSICJKRkZTOiBqZmZzX3Jld3JpdGVfZGF0YTogV3JpdGUgIgorCQkJCSJlcnJvciBkdXJpbmcgcmV3cml0ZS4gKG5hbWUpXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiSkZGUzogamZmc19yZXdyaXRlX2RhdGE6IE5vdyByZXRyeWluZyAiCisJCQkJInJld3JpdGUuIChuYW1lKVxuIik7CisJCQlnb3RvIHJldHJ5OworCQl9CisJCXBvcyArPSB0b3RhbF9uYW1lX3NpemU7CisJCXJhd19pbm9kZS5uY2hrc3VtID0gamZmc19jaGVja3N1bShmLT5uYW1lLCBmLT5uc2l6ZSk7CisJfQorCisJLyogV3JpdGUgdGhlIGRhdGEuICAqLworCWlmIChzaXplKSB7CisJCWludCByOworCQl1bnNpZ25lZCBjaGFyICpwYWdlOworCQlfX3UzMiBvZmZzZXQgPSBub2RlLT5kYXRhX29mZnNldDsKKworCQlpZiAoIShwYWdlID0gKHVuc2lnbmVkIGNoYXIgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCkpKSB7CisJCQlqZmZzX2ZtZnJlZV9wYXJ0bHkoZm1jLCBmbSwgMCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQl3aGlsZSAoc2l6ZSkgeworCQkJX191MzIgcyA9IG1pbihzaXplLCAoX191MzIpUEFHRV9TSVpFKTsKKwkJCWlmICgociA9IGpmZnNfcmVhZF9kYXRhKGYsIChjaGFyICopcGFnZSwKKwkJCQkJCW9mZnNldCwgcykpIDwgcykgeworCQkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwYWdlKTsKKwkJCQlqZmZzX2ZtZnJlZV9wYXJ0bHkoZm1jLCBmbSwgMCk7CisJCQkJamZmc19mbV93cml0ZV91bmxvY2soZm1jKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgIkpGRlM6IGpmZnNfcmV3cml0ZV9kYXRhOiAiCisJCQkJCSAiamZmc19yZWFkX2RhdGEoKSAiCisJCQkJCSAiZmFpbGVkISAociA9ICVkKVxuIiwgcik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKChlcnIgPSBmbGFzaF9zYWZlX3dyaXRlKGZtYy0+bXRkLAorCQkJCQkJICAgIHBvcywgcGFnZSwgcikpIDwgMCkgeworCQkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwYWdlKTsKKwkJCQlqZmZzX2ZtZnJlZV9wYXJ0bHkoZm1jLCBmbSwgMCk7CisJCQkJamZmc19mbV93cml0ZV91bmxvY2soZm1jKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgIkpGRlM6IGpmZnNfcmV3cml0ZV9kYXRhOiAiCisJCQkJICAgICAgICJXcml0ZSBlcnJvciBkdXJpbmcgcmV3cml0ZS4gIgorCQkJCSAgICAgICAiKGRhdGEpXG4iKTsKKwkJCQlnb3RvIHJldHJ5OworCQkJfQorCQkJcG9zICs9IHI7CisJCQlzaXplIC09IHI7CisJCQlvZmZzZXQgKz0gcjsKKwkJCXJhd19pbm9kZS5kY2hrc3VtICs9IGpmZnNfY2hlY2tzdW0ocGFnZSwgcik7CisJCX0KKworCSAgICAgICAgZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBhZ2UpOworCX0KKworCXJhd19pbm9kZS5hY2N1cmF0ZSA9IDA7CisJcmF3X2lub2RlLmNoa3N1bSA9IGpmZnNfY2hlY2tzdW0oJnJhd19pbm9kZSwKKwkJCQkJIHNpemVvZihzdHJ1Y3QgamZmc19yYXdfaW5vZGUpCisJCQkJCSAtIHNpemVvZihfX3UxNikpOworCisJLyogQWRkIHRoZSBjaGVja3N1bS4gICovCisJaWYgKChlcnIKKwkgICAgID0gZmxhc2hfc2FmZV93cml0ZShmbWMtPm10ZCwgcG9zX2RjaGtzdW0sCisJCQkJJigodV9jaGFyICopCisJCQkJJnJhd19pbm9kZSlbSkZGU19SQVdfSU5PREVfRENIS1NVTV9PRkZTRVRdLAorCQkJCXNpemVvZihfX3UzMikgKyBzaXplb2YoX191MTYpCisJCQkJKyBzaXplb2YoX191MTYpKSkgPCAwKSB7CisJCWpmZnNfZm1mcmVlX3BhcnRseShmbWMsIGZtLCAwKTsKKwkJamZmc19mbV93cml0ZV91bmxvY2soZm1jKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJKRkZTOiBqZmZzX3Jld3JpdGVfZGF0YTogV3JpdGUgZXJyb3IgZHVyaW5nICIKKwkJICAgICAgICJyZXdyaXRlLiAoY2hlY2tzdW0pXG4iKTsKKwkJZ290byByZXRyeTsKKwl9CisKKwkvKiBOb3cgbWFrZSB0aGUgZmlsZSBzeXN0ZW0gYXdhcmUgb2YgdGhlIG5ld2x5IHdyaXR0ZW4gbm9kZS4gICovCisJamZmc19pbnNlcnRfbm9kZShjLCBmLCAmcmF3X2lub2RlLCBmLT5uYW1lLCBuZXdfbm9kZSk7CisJamZmc19mbV93cml0ZV91bmxvY2soZm1jKTsKKworCUQzKHByaW50aygiamZmc19yZXdyaXRlX2RhdGEoKTogTGVhdmluZy4uLlxuIikpOworCXJldHVybiAwOworfSAvKiBqZmZzX3Jld3JpdGVfZGF0YSgpICAqLworCisKKy8qIGpmZnNfZ2FyYmFnZV9jb2xsZWN0X25leHQgaW1wbGVtZW50cyBvbmUgc3RlcCBpbiB0aGUgZ2FyYmFnZSBjb2xsZWN0CisgICBwcm9jZXNzIGFuZCBpcyBvZnRlbiBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYXQgZWFjaCBvY2Nhc2lvbiBvZiBhCisgICBnYXJiYWdlIGNvbGxlY3QuICAqLworCitzdGF0aWMgaW50CitqZmZzX2dhcmJhZ2VfY29sbGVjdF9uZXh0KHN0cnVjdCBqZmZzX2NvbnRyb2wgKmMpCit7CisJc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMgPSBjLT5mbWM7CisJc3RydWN0IGpmZnNfbm9kZSAqbm9kZTsKKwlzdHJ1Y3QgamZmc19maWxlICpmOworCWludCBlcnIgPSAwOworCV9fdTMyIHNpemU7CisJX191MzIgZGF0YV9zaXplOworCV9fdTMyIHRvdGFsX25hbWVfc2l6ZTsKKwlfX3UzMiBleHRyYV9hdmFpbGFibGU7CisJX191MzIgc3BhY2VfbmVlZGVkOworCV9fdTMyIGZyZWVfY2h1bmtfc2l6ZTEgPSBqZmZzX2ZyZWVfc2l6ZTEoZm1jKTsKKwlEMihfX3UzMiBmcmVlX2NodW5rX3NpemUyID0gamZmc19mcmVlX3NpemUyKGZtYykpOworCisJLyogR2V0IHRoZSBvbGRlc3Qgbm9kZSBpbiB0aGUgZmxhc2guICAqLworCW5vZGUgPSBqZmZzX2dldF9vbGRlc3Rfbm9kZShmbWMpOworCUFTU0VSVChpZiAoIW5vZGUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJKRkZTOiBqZmZzX2dhcmJhZ2VfY29sbGVjdF9uZXh0OiAiCisJCSAgICAgICAiTm8gb2xkZXN0IG5vZGUgZm91bmQhXG4iKTsKKyAgICAgICAgICAgICAgICBlcnIgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIGpmZnNfZ2FyYmFnZV9jb2xsZWN0X25leHRfZW5kOworCQkKKworCX0pOworCisJLyogRmluZCBpdHMgY29ycmVzcG9uZGluZyBmaWxlIHRvby4gICovCisJZiA9IGpmZnNfZmluZF9maWxlKGMsIG5vZGUtPmlubyk7CisKKwlpZiAoIWYpIHsKKwkgIHByaW50ayAoS0VSTl9FUlIgIkpGRlM6IGpmZnNfZ2FyYmFnZV9jb2xsZWN0X25leHQ6ICIKKyAgICAgICAgICAgICAgICAgICJObyBmaWxlIHRvIGdhcmJhZ2UgY29sbGVjdCEgIgorCQkgICIoaW5vID0gMHglMDh4KVxuIiwgbm9kZS0+aW5vKTsKKyAgICAgICAgICAvKiBGSVhNRTogRnJlZSB0aGUgb2ZmZW5kaW5nIG5vZGUgYW5kIHJlY292ZXIuICovCisgICAgICAgICAgZXJyID0gLTE7CisgICAgICAgICAgZ290byBqZmZzX2dhcmJhZ2VfY29sbGVjdF9uZXh0X2VuZDsKKwl9CisKKwkvKiBXZSBhbHdheXMgd3JpdGUgb3V0IHRoZSBuYW1lLiBUaGVvcmV0aWNhbGx5LCB3ZSBkb24ndCBuZWVkCisJICAgdG8sIGJ1dCBmb3Igbm93IGl0J3MgZWFzaWVyIC0gYmVjYXVzZSBvdGhlcndpc2Ugd2UnZCBoYXZlCisJICAgdG8ga2VlcCB0cmFjayBvZiBob3cgbWFueSB0aW1lcyB0aGUgY3VycmVudCBuYW1lIGV4aXN0cyBvbgorCSAgIHRoZSBmbGFzaCBhbmQgbWFrZSBzdXJlIGl0IG5ldmVyIHJlYWNoZXMgemVyby4KKworCSAgIFRoZSBjdXJyZW50IGFwcHJvYWNoIG1lYW5zIHRoYXQgd291bGQgYmUgcG9zc2libGUgdG8gY2F1c2UKKwkgICB0aGUgR0MgdG8gZW5kIHVwIGVhdGluZyBpdHMgdGFpbCBieSB3cml0aW5nIGxvdHMgb2Ygbm9kZXMKKwkgICB3aXRoIG5vIG5hbWUgZm9yIGl0IHRvIGdhcmJhZ2UtY29sbGVjdC4gSGVuY2UgdGhlIGNoYW5nZSBpbgorCSAgIGlub2RlLmMgdG8gd3JpdGUgbmFtZXMgd2l0aCBfZXZlcnlfIG5vZGUuCisKKwkgICBJdCBzdWNrcywgYnV0IGl0IF9zaG91bGRfIHdvcmsuCisJKi8KKwl0b3RhbF9uYW1lX3NpemUgPSBKRkZTX1BBRChmLT5uc2l6ZSk7CisKKwlEMShwcmludGsoImpmZnNfZ2FyYmFnZV9jb2xsZWN0X25leHQoKTogXCIlc1wiLCAiCisJCSAgImlubzogJXUsIHZlcnNpb246ICV1LCBsb2NhdGlvbiAweCV4LCBkc2l6ZSAldVxuIiwKKwkJICAoZi0+bmFtZSA/IGYtPm5hbWUgOiAiIiksIG5vZGUtPmlubywgbm9kZS0+dmVyc2lvbiwgCisJCSAgbm9kZS0+Zm0tPm9mZnNldCwgbm9kZS0+ZGF0YV9zaXplKSk7CisKKwkvKiBDb21wdXRlIGhvdyBtYW55IGRhdGEgaXQncyBwb3NzaWJsZSB0byByZXdyaXRlIGF0IHRoZSBtb21lbnQuICAqLworCWRhdGFfc2l6ZSA9IGYtPnNpemUgLSBub2RlLT5kYXRhX29mZnNldDsKKworCS8qIEFuZCBmcm9tIHRoYXQsIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBjaHVuayB3ZSB3YW50IHRvIHdyaXRlICovCisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgamZmc19yYXdfaW5vZGUpICsgdG90YWxfbmFtZV9zaXplCisJICAgICAgICsgZGF0YV9zaXplICsgSkZGU19HRVRfUEFEX0JZVEVTKGRhdGFfc2l6ZSk7CisKKwkvKiBJZiB0aGF0J3MgbW9yZSB0aGFuIG1heF9jaHVua19zaXplLCByZWR1Y2UgaXQgYWNjb3JkaW5nbHkgKi8KKwlpZiAoc2l6ZSA+IGZtYy0+bWF4X2NodW5rX3NpemUpIHsKKwkJc2l6ZSA9IGZtYy0+bWF4X2NodW5rX3NpemU7CisJCWRhdGFfc2l6ZSA9IHNpemUgLSBzaXplb2Yoc3RydWN0IGpmZnNfcmF3X2lub2RlKQorCQkJICAgIC0gdG90YWxfbmFtZV9zaXplOworCX0KKworCS8qIElmIHdlJ3JlIGFza2luZyB0byB0YWtlIHVwIG1vcmUgc3BhY2UgdGhhbiBmcmVlX2NodW5rX3NpemUxCisJICAgYnV0IHdlIF9jb3VsZF8gZml0IGluIGl0LCBzaHJpbmsgYWNjb3JkaW5nbHkuCisJKi8KKwlpZiAoc2l6ZSA+IGZyZWVfY2h1bmtfc2l6ZTEpIHsKKworCQlpZiAoZnJlZV9jaHVua19zaXplMSA8CisJCSAgICAoc2l6ZW9mKHN0cnVjdCBqZmZzX3Jhd19pbm9kZSkgKyB0b3RhbF9uYW1lX3NpemUgKyBCTE9DS19TSVpFKSl7CisJCQkvKiBUaGUgc3BhY2UgbGVmdCBpcyB0b28gc21hbGwgdG8gYmUgb2YgYW55CisJCQkgICB1c2UgcmVhbGx5LiAgKi8KKwkJCXN0cnVjdCBqZmZzX2ZtICpkaXJ0eV9mbQorCQkJPSBqZmZzX2ZtYWxsb2NlZChmbWMsCisJCQkJCSBmbWMtPnRhaWwtPm9mZnNldCArIGZtYy0+dGFpbC0+c2l6ZSwKKwkJCQkJIGZyZWVfY2h1bmtfc2l6ZTEsIE5VTEwpOworCQkJaWYgKCFkaXJ0eV9mbSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiSkZGUzogIgorCQkJCSAgICAgICAiamZmc19nYXJiYWdlX2NvbGxlY3RfbmV4dDogIgorCQkJCSAgICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIGBkaXJ0eScgIgorCQkJCSAgICAgICAiZmxhc2ggbWVtb3J5IVxuIik7CisJCQkJZXJyID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gamZmc19nYXJiYWdlX2NvbGxlY3RfbmV4dF9lbmQ7CisJCQl9CisJCQlEMShwcmludGsoIkRpcnR5aW5nIGVuZCBvZiBmbGFzaCAtIHRvbyBzbWFsbFxuIikpOworCQkJamZmc193cml0ZV9kdW1teV9ub2RlKGMsIGRpcnR5X2ZtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IDA7CisJCQlnb3RvIGpmZnNfZ2FyYmFnZV9jb2xsZWN0X25leHRfZW5kOworCQl9CisJCUQxKHByaW50aygiUmVkdWNpbmcgc2l6ZSBvZiBuZXcgbm9kZSBmcm9tICVkIHRvICVkIHRvIGF2b2lkICIKKwkJCSAgIiBleGNlZWRpbmcgZnJlZV9jaHVua19zaXplMVxuIiwKKwkJCSAgc2l6ZSwgZnJlZV9jaHVua19zaXplMSkpOworCisJCXNpemUgPSBmcmVlX2NodW5rX3NpemUxOworCQlkYXRhX3NpemUgPSBzaXplIC0gc2l6ZW9mKHN0cnVjdCBqZmZzX3Jhd19pbm9kZSkKKwkJCSAgICAtIHRvdGFsX25hbWVfc2l6ZTsKKwl9CisKKworCS8qIENhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIHNwYWNlIG5lZWRlZCB0byBob2xkIHRoZSBub2RlcworCSAgIHdoaWNoIGFyZSByZW1haW5pbmcgaW4gdGhlIHRhaWwgKi8KKwlzcGFjZV9uZWVkZWQgPSBmbWMtPm1pbl9mcmVlX3NpemUgLSAobm9kZS0+Zm0tPm9mZnNldCAlIGZtYy0+c2VjdG9yX3NpemUpOworCisJLyogRnJvbSB0aGF0LCBjYWxjdWxhdGUgaG93IG11Y2ggJ2V4dHJhJyBzcGFjZSB3ZSBjYW4gdXNlIHRvCisJICAgaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIG5vZGUgd2UncmUgd3JpdGluZyBmcm9tIHRoZSBzaXplCisJICAgb2YgdGhlIG5vZGUgd2UncmUgb2Jzb2xldGluZworCSovCisJaWYgKHNwYWNlX25lZWRlZCA+IGZtYy0+ZnJlZV9zaXplKSB7CisJCS8qIElmIHdlJ3ZlIGdvbmUgYmVsb3cgbWluX2ZyZWVfc2l6ZSBmb3Igc29tZSByZWFzb24sCisJCSAgIGRvbid0IGZ1Y2sgdXAuIFRoaXMgaXMgd2h5IHdlIGhhdmUgCisJCSAgIG1pbl9mcmVlX3NpemUgPiBzZWN0b3Jfc2l6ZS4gV2hpbmdlIGFib3V0IGl0IHRob3VnaCwKKwkJICAganVzdCBzbyBJIGNhbiBjb252aW5jZSBteXNlbGYgbXkgbWF0aHMgaXMgcmlnaHQuCisJCSovCisJCUQxKHByaW50ayhLRVJOX1dBUk5JTkcgImpmZnNfZ2FyYmFnZV9jb2xsZWN0X25leHQoKTogIgorCQkJICAic3BhY2VfbmVlZGVkICVkIGV4Y2VlZGVkIGZyZWVfc2l6ZSAlZFxuIiwKKwkJCSAgc3BhY2VfbmVlZGVkLCBmbWMtPmZyZWVfc2l6ZSkpOworCQlleHRyYV9hdmFpbGFibGUgPSAwOworCX0gZWxzZSB7CisJCWV4dHJhX2F2YWlsYWJsZSA9IGZtYy0+ZnJlZV9zaXplIC0gc3BhY2VfbmVlZGVkOworCX0KKworCS8qIENoZWNrIHRoYXQgd2UgZG9uJ3QgdXNlIHVwIGFueSBtb3JlICdleHRyYScgc3BhY2UgdGhhbgorCSAgIHdoYXQncyBhdmFpbGFibGUgKi8KKwlpZiAoc2l6ZSA+IEpGRlNfUEFEKG5vZGUtPmRhdGFfc2l6ZSkgKyB0b3RhbF9uYW1lX3NpemUgKyAKKwkgICAgc2l6ZW9mKHN0cnVjdCBqZmZzX3Jhd19pbm9kZSkgKyBleHRyYV9hdmFpbGFibGUpIHsKKwkJRDEocHJpbnRrKCJSZWR1Y2luZyBzaXplIG9mIG5ldyBub2RlIGZyb20gJWQgdG8gJWxkIHRvIGF2b2lkICIKKwkJICAgICAgICJjYXRjaGluZyBvdXIgdGFpbFxuIiwgc2l6ZSwgCisJCQkgIChsb25nKSAoSkZGU19QQUQobm9kZS0+ZGF0YV9zaXplKSArIEpGRlNfUEFEKG5vZGUtPm5hbWVfc2l6ZSkgKyAKKwkJCSAgc2l6ZW9mKHN0cnVjdCBqZmZzX3Jhd19pbm9kZSkgKyBleHRyYV9hdmFpbGFibGUpKSk7CisJCUQxKHByaW50aygic3BhY2VfbmVlZGVkID0gJWQsIGV4dHJhX2F2YWlsYWJsZSA9ICVkXG4iLCAKKwkJCSAgc3BhY2VfbmVlZGVkLCBleHRyYV9hdmFpbGFibGUpKTsKKworCQlzaXplID0gSkZGU19QQUQobm9kZS0+ZGF0YV9zaXplKSArIHRvdGFsX25hbWVfc2l6ZSArIAorCQkgIHNpemVvZihzdHJ1Y3QgamZmc19yYXdfaW5vZGUpICsgZXh0cmFfYXZhaWxhYmxlOworCQlkYXRhX3NpemUgPSBzaXplIC0gc2l6ZW9mKHN0cnVjdCBqZmZzX3Jhd19pbm9kZSkKKwkJCS0gdG90YWxfbmFtZV9zaXplOworCX07CisKKwlEMihwcmludGsoIiAgdG90YWxfbmFtZV9zaXplOiAldVxuIiwgdG90YWxfbmFtZV9zaXplKSk7CisJRDIocHJpbnRrKCIgIGRhdGFfc2l6ZTogJXVcbiIsIGRhdGFfc2l6ZSkpOworCUQyKHByaW50aygiICBzaXplOiAldVxuIiwgc2l6ZSkpOworCUQyKHByaW50aygiICBmLT5uc2l6ZTogJXVcbiIsIGYtPm5zaXplKSk7CisJRDIocHJpbnRrKCIgIGYtPnNpemU6ICV1XG4iLCBmLT5zaXplKSk7CisJRDIocHJpbnRrKCIgIG5vZGUtPmRhdGFfb2Zmc2V0OiAldVxuIiwgbm9kZS0+ZGF0YV9vZmZzZXQpKTsKKwlEMihwcmludGsoIiAgZnJlZV9jaHVua19zaXplMTogJXVcbiIsIGZyZWVfY2h1bmtfc2l6ZTEpKTsKKwlEMihwcmludGsoIiAgZnJlZV9jaHVua19zaXplMjogJXVcbiIsIGZyZWVfY2h1bmtfc2l6ZTIpKTsKKwlEMihwcmludGsoIiAgbm9kZS0+Zm0tPm9mZnNldDogMHglMDh4XG4iLCBub2RlLT5mbS0+b2Zmc2V0KSk7CisKKwlpZiAoKGVyciA9IGpmZnNfcmV3cml0ZV9kYXRhKGYsIG5vZGUsIGRhdGFfc2l6ZSkpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImpmZnNfcmV3cml0ZV9kYXRhKCkgZmFpbGVkOiAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJICAKK2pmZnNfZ2FyYmFnZV9jb2xsZWN0X25leHRfZW5kOgorCUQzKHByaW50aygiamZmc19nYXJiYWdlX2NvbGxlY3RfbmV4dDogTGVhdmluZy4uLlxuIikpOworCXJldHVybiBlcnI7Cit9IC8qIGpmZnNfZ2FyYmFnZV9jb2xsZWN0X25leHQgKi8KKworCisvKiBJZiBhbiBvYnNvbGV0ZSBub2RlIGlzIHBhcnRseSBnb2luZyB0byBiZSBlcmFzZWQgZHVlIHRvIGdhcmJhZ2UKKyAgIGNvbGxlY3Rpb24sIHRoZSBwYXJ0IHRoYXQgaXNuJ3QgZ29pbmcgdG8gYmUgZXJhc2VkIG11c3QgYmUgZmlsbGVkCisgICB3aXRoIHplcm9lcyBzbyB0aGF0IHRoZSBzY2FuIG9mIHRoZSBmbGFzaCB3aWxsIHdvcmsgc21vb3RobHkgbmV4dAorICAgdGltZS4gIChUaGUgZGF0YSBpbiB0aGUgZmlsZSBjb3VsZCBmb3IgaW5zdGFuY2UgYmUgYSBKRkZTIGltYWdlCisgICB3aGljaCBjb3VsZCBjYXVzZSBlbm9ybW91cyBjb25mdXNpb24gZHVyaW5nIGEgc2NhbiBvZiB0aGUgZmxhc2gKKyAgIGRldmljZSBpZiB3ZSBkaWRuJ3QgZG8gdGhpcy4pCisgICAgIFRoZXJlIGFyZSB0d28gcGhhc2VzIGluIHRoaXMgcHJvY2VkdXJlOiBGaXJzdCwgdGhlIGNsZWFyaW5nIG9mCisgICB0aGUgbmFtZSBhbmQgZGF0YSBwYXJ0cyBvZiB0aGUgbm9kZS4gU2Vjb25kLCBwb3NzaWJseSBhbHNvIGNsZWFyaW5nCisgICBhIHBhcnQgb2YgdGhlIHJhdyBpbm9kZSBhcyB3ZWxsLiAgSWYgdGhlIGJveCBpcyBwb3dlciBjeWNsZWQgZHVyaW5nCisgICB0aGUgZmlyc3QgcGhhc2UsIG9ubHkgdGhlIGNoZWNrc3VtIG9mIHRoaXMgbm9kZS10by1iZS1jbGVhcmVkLWF0LQorICAgdGhlLWVuZCB3aWxsIGJlIHdyb25nLiAgSWYgdGhlIGJveCBpcyBwb3dlciBjeWNsZWQgZHVyaW5nLCBvciBhZnRlciwKKyAgIHRoZSBjbGVhcmluZyBvZiB0aGUgcmF3IGlub2RlLCB0aGUgaW5mb3JtYXRpb24gbGlrZSB0aGUgbGVuZ3RoIG9mCisgICB0aGUgbmFtZSBhbmQgZGF0YSBwYXJ0cyBhcmUgemVyb2VkLiAgVGhlIG5leHQgdGltZSB0aGUgYm94IGlzCisgICBwb3dlcmVkIHVwLCB0aGUgc2Nhbm5pbmcgYWxnb3JpdGhtIG1hbmFnZXMgdGhpcyBmYXVsdHkgZGF0YSB0b28KKyAgIGJlY2F1c2U6CisKKyAgIC0gVGhlIGNoZWNrc3VtIGlzIGludmFsaWQgYW5kIHRodXMgdGhlIHJhdyBpbm9kZSBtdXN0IGJlIGRpc2NhcmRlZAorICAgICBpbiBhbnkgY2FzZS4KKyAgIC0gSWYgdGhlIGxlbmd0aHMgb2YgdGhlIGRhdGEgcGFydCBvciB0aGUgbmFtZSBwYXJ0IGFyZSB6ZXJvZWQsIHRoZQorICAgICBzY2FubmluZyBqdXN0IGNvbnRpbnVlcyBhZnRlciB0aGUgcmF3IGlub2RlLiAgQnV0IGFmdGVyIHRoZSBpbm9kZQorICAgICB0aGUgc2Nhbm5pbmcgcHJvY2VkdXJlIGp1c3QgZmluZHMgemVyb2VzIHdoaWNoIGlzIHRoZSBzYW1lIGFzCisgICAgIGRpcnQuCisKKyAgIFNvLCBpbiB0aGUgZW5kLCB0aGlzIGNvdWxkIG5ldmVyIGZhaWwuIDotKSAgRXZlbiBpZiBpdCBkb2VzIGZhaWwsCisgICB0aGUgc2Nhbm5pbmcgYWxnb3JpdGhtIHNob3VsZCBtYW5hZ2UgdGhhdCB0b28uICAqLworCitzdGF0aWMgaW50CitqZmZzX2NsZWFyX2VuZF9vZl9ub2RlKHN0cnVjdCBqZmZzX2NvbnRyb2wgKmMsIF9fdTMyIGVyYXNlX3NpemUpCit7CisJc3RydWN0IGpmZnNfZm0gKmZtOworCXN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jID0gYy0+Zm1jOworCV9fdTMyIHplcm9fb2Zmc2V0OworCV9fdTMyIHplcm9fc2l6ZTsKKwlfX3UzMiB6ZXJvX29mZnNldF9kYXRhOworCV9fdTMyIHplcm9fc2l6ZV9kYXRhOworCV9fdTMyIGN1dHRpbmdfcmF3X2lub2RlID0gMDsKKworCWlmICghKGZtID0gamZmc19jdXRfbm9kZShmbWMsIGVyYXNlX3NpemUpKSkgeworCQlEMyhwcmludGsoImpmZnNfY2xlYXJfZW5kX29mX25vZGUoKTogZm0gPT0gTlVMTFxuIikpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBXaGVyZSBhbmQgaG93IG11Y2ggc2hhbGwgd2UgY2xlYXI/ICAqLworCXplcm9fb2Zmc2V0ID0gZm1jLT5oZWFkLT5vZmZzZXQgKyBlcmFzZV9zaXplOworCXplcm9fc2l6ZSA9IGZtLT5vZmZzZXQgKyBmbS0+c2l6ZSAtIHplcm9fb2Zmc2V0OworCisJLyogRG8gd2UgaGF2ZSB0byBjbGVhciB0aGUgcmF3X2lub2RlIGV4cGxpY2l0bHk/ICAqLworCWlmIChmbS0+c2l6ZSAtIHplcm9fc2l6ZSA8IHNpemVvZihzdHJ1Y3QgamZmc19yYXdfaW5vZGUpKSB7CisJCWN1dHRpbmdfcmF3X2lub2RlID0gc2l6ZW9mKHN0cnVjdCBqZmZzX3Jhd19pbm9kZSkKKwkJCQkgICAgLSAoZm0tPnNpemUgLSB6ZXJvX3NpemUpOworCX0KKworCS8qIEZpcnN0LCBjbGVhciB0aGUgbmFtZSBhbmQgZGF0YSBmaWVsZHMuICAqLworCXplcm9fb2Zmc2V0X2RhdGEgPSB6ZXJvX29mZnNldCArIGN1dHRpbmdfcmF3X2lub2RlOworCXplcm9fc2l6ZV9kYXRhID0gemVyb19zaXplIC0gY3V0dGluZ19yYXdfaW5vZGU7CisJZmxhc2hfc2FmZV9hY3F1aXJlKGZtYy0+bXRkKTsKKwlmbGFzaF9tZW1zZXQoZm1jLT5tdGQsIHplcm9fb2Zmc2V0X2RhdGEsIDAsIHplcm9fc2l6ZV9kYXRhKTsKKwlmbGFzaF9zYWZlX3JlbGVhc2UoZm1jLT5tdGQpOworCisJLyogU2hvdWxkIHdlIGNsZWFyIGEgcGFydCBvZiB0aGUgcmF3IGlub2RlPyAgKi8KKwlpZiAoY3V0dGluZ19yYXdfaW5vZGUpIHsKKwkJLyogSSBndWVzcyBpdCBpcyBvayB0byBjbGVhciB0aGUgcmF3IGlub2RlIGluIHRoaXMgb3JkZXIuICAqLworCQlmbGFzaF9zYWZlX2FjcXVpcmUoZm1jLT5tdGQpOworCQlmbGFzaF9tZW1zZXQoZm1jLT5tdGQsIHplcm9fb2Zmc2V0LCAwLAorCQkJICAgICBjdXR0aW5nX3Jhd19pbm9kZSk7CisJCWZsYXNoX3NhZmVfcmVsZWFzZShmbWMtPm10ZCk7CisJfQorCisJcmV0dXJuIDA7Cit9IC8qIGpmZnNfY2xlYXJfZW5kX29mX25vZGUoKSAgKi8KKworLyogVHJ5IHRvIGVyYXNlIGFzIG11Y2ggYXMgcG9zc2libGUgb2YgdGhlIGRpcnQgaW4gdGhlIGZsYXNoIG1lbW9yeS4gICovCitzdGF0aWMgbG9uZworamZmc190cnlfdG9fZXJhc2Uoc3RydWN0IGpmZnNfY29udHJvbCAqYykKK3sKKwlzdHJ1Y3QgamZmc19mbWNvbnRyb2wgKmZtYyA9IGMtPmZtYzsKKwlsb25nIGVyYXNlX3NpemU7CisJaW50IGVycjsKKwlfX3UzMiBvZmZzZXQ7CisKKwlEMyhwcmludGsoImpmZnNfdHJ5X3RvX2VyYXNlKClcbiIpKTsKKworCWVyYXNlX3NpemUgPSBqZmZzX2VyYXNhYmxlX3NpemUoZm1jKTsKKworCUQyKHByaW50aygiamZmc190cnlfdG9fZXJhc2UoKTogZXJhc2Vfc2l6ZSA9ICVsZFxuIiwgZXJhc2Vfc2l6ZSkpOworCisJaWYgKGVyYXNlX3NpemUgPT0gMCkgeworCQlyZXR1cm4gMDsKKwl9CisJZWxzZSBpZiAoZXJhc2Vfc2l6ZSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJKRkZTOiBqZmZzX3RyeV90b19lcmFzZTogIgorCQkgICAgICAgImpmZnNfZXJhc2FibGVfc2l6ZSByZXR1cm5lZCAlbGQuXG4iLCBlcmFzZV9zaXplKTsKKwkJcmV0dXJuIGVyYXNlX3NpemU7CisJfQorCisJaWYgKChlcnIgPSBqZmZzX2NsZWFyX2VuZF9vZl9ub2RlKGMsIGVyYXNlX3NpemUpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJKRkZTOiBqZmZzX3RyeV90b19lcmFzZTogIgorCQkgICAgICAgIkNsZWFyaW5nIG9mIG5vZGUgZmFpbGVkLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJb2Zmc2V0ID0gZm1jLT5oZWFkLT5vZmZzZXQ7CisKKwkvKiBOb3csIGxldCdzIHRyeSB0byBkbyB0aGUgZXJhc2UuICAqLworCWlmICgoZXJyID0gZmxhc2hfZXJhc2VfcmVnaW9uKGZtYy0+bXRkLAorCQkJCSAgICAgIG9mZnNldCwgZXJhc2Vfc2l6ZSkpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIkpGRlM6IEVyYXNlIG9mIGZsYXNoIGZhaWxlZC4gIgorCQkgICAgICAgIm9mZnNldCA9ICV1LCBlcmFzZV9zaXplID0gJWxkXG4iLAorCQkgICAgICAgb2Zmc2V0LCBlcmFzZV9zaXplKTsKKwkJLyogWFhYOiBIZXJlIHdlIHNob3VsZCBhbGxvY2F0ZSB0aGlzIGFyZWEgYXMgZGlydHkKKwkJICAgd2l0aCBqZmZzX2ZtYWxsb2NlZCBvciBzb21ldGhpbmcgc2ltaWxhci4gIE5vdworCQkgICB3ZSBqdXN0IHJlcG9ydCB0aGUgZXJyb3IuICAqLworCQlyZXR1cm4gZXJyOworCX0KKworI2lmIDAKKwkvKiBDaGVjayBpZiB0aGUgZXJhc2VkIHNlY3RvcnMgcmVhbGx5IGdvdCBlcmFzZWQuICAqLworCXsKKwkJX191MzIgcG9zOworCQlfX3UzMiBlbmQ7CisKKwkJcG9zID0gKF9fdTMyKWZsYXNoX2dldF9kaXJlY3RfcG9pbnRlcih0b19rZGV2X3QoYy0+c2ItPnNfZGV2KSwgb2Zmc2V0KTsKKwkJZW5kID0gcG9zICsgZXJhc2Vfc2l6ZTsKKworCQlEMihwcmludGsoIkpGRlM6IENoZWNraW5nIGVyYXNlZCBzZWN0b3IocykuLi5cbiIpKTsKKworCQlmbGFzaF9zYWZlX2FjcXVpcmUoZm1jLT5tdGQpOworCisJCWZvciAoOyBwb3MgPCBlbmQ7IHBvcyArPSA0KSB7CisJCQlpZiAoKihfX3UzMiAqKXBvcyAhPSBKRkZTX0VNUFRZX0JJVE1BU0spIHsKKwkJCQlwcmludGsoIkpGRlM6IEVyYXNlIGZhaWxlZCEgcG9zID0gMHglbHhcbiIsCisJCQkJICAgICAgIChsb25nKXBvcyk7CisJCQkJamZmc19oZXhkdW1wKGZtYy0+bXRkLCBwb3MsCisJCQkJCSAgICAgamZmc19taW4oMjU2LCBlbmQgLSBwb3MpKTsKKwkJCQllcnIgPSAtMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWZsYXNoX3NhZmVfcmVsZWFzZShmbWMtPm10ZCk7CisKKwkJaWYgKCFlcnIpIHsKKwkJCUQyKHByaW50aygiSkZGUzogRXJhc2Ugc3VjY2VlZGVkLlxuIikpOworCQl9CisJCWVsc2UgeworCQkJLyogWFhYOiBIZXJlIHdlIHNob3VsZCBhbGxvY2F0ZSB0aGUgbWVtb3J5CisJCQkgICB3aXRoIGpmZnNfZm1hbGxvY2VkKCkgaW4gb3JkZXIgdG8gcHJldmVudAorCQkJICAgSkZGUyBmcm9tIHVzaW5nIHRoaXMgYXJlYSBhY2NpZGVudGFsbHkuICAqLworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKyNlbmRpZgorCisJLyogVXBkYXRlIHRoZSBmbGFzaCBtZW1vcnkgZGF0YSBzdHJ1Y3R1cmVzLiAgKi8KKwlqZmZzX3N5bmNfZXJhc2UoZm1jLCBlcmFzZV9zaXplKTsKKworCXJldHVybiBlcmFzZV9zaXplOworfQorCisKKy8qIFRoZXJlIGFyZSBkaWZmZXJlbnQgY3JpdGVyaWEgdGhhdCBzaG91bGQgdHJpZ2dlciBhIGdhcmJhZ2UgY29sbGVjdDoKKworICAgMS4gVGhlcmUgaXMgdG9vIG11Y2ggZGlydCBpbiB0aGUgbWVtb3J5LgorICAgMi4gVGhlIGZyZWUgc3BhY2UgaXMgYmVjb21pbmcgc21hbGwuCisgICAzLiBUaGVyZSBhcmUgbWFueSB2ZXJzaW9ucyBvZiBhIG5vZGUuCisKKyAgIFRoZSBnYXJiYWdlIGNvbGxlY3Qgc2hvdWxkIGFsd2F5cyBiZSBkb25lIGluIGEgbWFubmVyIHRoYXQgZ3VhcmFudGVlcworICAgdGhhdCBmdXR1cmUgZ2FyYmFnZSBjb2xsZWN0cyBjYW5ub3QgYmUgbG9ja2VkLiAgRS5nLiBSZXdyaXR0ZW4gY2h1bmtzCisgICBzaG91bGQgbm90IGJlIHRvbyBsYXJnZSAoc3BhbiBtb3JlIHRoYW4gb25lIHNlY3RvciBpbiB0aGUgZmxhc2ggbWVtb3J5CisgICBmb3IgZXhlbXBsZSkuICBPZiBjb3Vyc2UgdGhlcmUgaXMgYSBsaW1pdCBvbiBob3cgaW50ZWxsaWdlbnQgdGhpcyBnYXJiYWdlCisgICBjb2xsZWN0aW9uIGNhbiBiZS4gICovCisKKworc3RhdGljIGludAoramZmc19nYXJiYWdlX2NvbGxlY3Rfbm93KHN0cnVjdCBqZmZzX2NvbnRyb2wgKmMpCit7CisJc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMgPSBjLT5mbWM7CisJbG9uZyBlcmFzZWQgPSAwOworCWludCByZXN1bHQgPSAwOworCUQxKGludCBpID0gMSk7CisJRDIocHJpbnRrKCIqKipqZmZzX2dhcmJhZ2VfY29sbGVjdF9ub3coKTogZm1jLT5kaXJ0eV9zaXplID0gJXUsIGZtYy0+ZnJlZV9zaXplID0gMHgleFxuLCBmY3MxPTB4JXgsIGZjczI9MHgleCIsCisJCSAgZm1jLT5kaXJ0eV9zaXplLCBmbWMtPmZyZWVfc2l6ZSwgamZmc19mcmVlX3NpemUxKGZtYyksIGpmZnNfZnJlZV9zaXplMihmbWMpKSk7CisJRDIoamZmc19wcmludF9mbWNvbnRyb2woZm1jKSk7CisKKwkvLwlkb3duKCZmbWMtPmdjbG9jayk7CisKKwkvKiBJZiBpdCBpcyBwb3NzaWJsZSB0byBnYXJiYWdlIGNvbGxlY3QsIGRvIHNvLiAgKi8KKwkKKwl3aGlsZSAoZXJhc2VkID09IDApIHsKKwkJRDEocHJpbnRrKCIqKipqZmZzX2dhcmJhZ2VfY29sbGVjdF9ub3coKTogcm91bmQgIyV1LCAiCisJCQkgICJmbWMtPmRpcnR5X3NpemUgPSAldVxuIiwgaSsrLCBmbWMtPmRpcnR5X3NpemUpKTsKKwkJRDIoamZmc19wcmludF9mbWNvbnRyb2woZm1jKSk7CisKKwkJaWYgKChlcmFzZWQgPSBqZmZzX3RyeV90b19lcmFzZShjKSkgPCAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJKRkZTOiBFcnJvciBpbiAiCisJCQkgICAgICAgImdhcmJhZ2UgY29sbGVjdG9yLlxuIik7CisJCQlyZXN1bHQgPSBlcmFzZWQ7CisJCQlnb3RvIGdjX2VuZDsKKwkJfQorCQlpZiAoZXJhc2VkKQorCQkJYnJlYWs7CisJCQorCQlpZiAoZm1jLT5mcmVlX3NpemUgPT0gMCkgeworCQkJLyogQXJnaCAqLworCQkJcHJpbnRrKEtFUk5fRVJSICJqZmZzX2dhcmJhZ2VfY29sbGVjdF9ub3coKTogZnJlZV9zaXplID09IDAuIFRoaXMgaXMgQkFELlxuIik7CisJCQlyZXN1bHQgPSAtRU5PU1BDOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZm1jLT5kaXJ0eV9zaXplIDwgZm1jLT5zZWN0b3Jfc2l6ZSkgeworCQkJLyogQWN0dWFsbHksIHdlIF9tYXlfIGhhdmUgYmVlbiBhYmxlIHRvIGZyZWUgc29tZSwgCisJCQkgKiBpZiB0aGVyZSBhcmUgbWFueSBvdmVybGFwcGluZyBub2RlcyB3aGljaCBhcmVuJ3QKKwkJCSAqIGFjdHVhbGx5IG1hcmtlZCBkaXJ0eSBiZWNhdXNlIHRoZXkgc3RpbGwgaGF2ZQorCQkJICogc29tZSB2YWxpZCBkYXRhIGluIGVhY2guCisJCQkgKi8KKwkJCXJlc3VsdCA9IC1FTk9TUEM7CisJCQlicmVhazsKKwkJfQorCisJCS8qIExldCdzIGRhcmUgdG8gbWFrZSBhIGdhcmJhZ2UgY29sbGVjdC4gICovCisJCWlmICgocmVzdWx0ID0gamZmc19nYXJiYWdlX2NvbGxlY3RfbmV4dChjKSkgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIkpGRlM6IFNvbWV0aGluZyAiCisJCQkgICAgICAgImhhcyBnb25lIHNlcmlvdXNseSB3cm9uZyAiCisJCQkgICAgICAgIndpdGggYSBnYXJiYWdlIGNvbGxlY3QuXG4iKTsKKwkJCWdvdG8gZ2NfZW5kOworCQl9CisKKwkJRDEocHJpbnRrKCIgICBqZmZzX2dhcmJhZ2VfY29sbGVjdF9ub3coKTogZXJhc2VkOiAlbGRcbiIsIGVyYXNlZCkpOworCQlESk0oamZmc19wcmludF9tZW1vcnlfYWxsb2NhdGlvbl9zdGF0aXN0aWNzKCkpOworCX0KKwkKK2djX2VuZDoKKwkvLwl1cCgmZm1jLT5nY2xvY2spOworCisJRDMocHJpbnRrKCIgICBqZmZzX2dhcmJhZ2VfY29sbGVjdF9ub3coKTogTGVhdmluZy4uLlxuIikpOworCUQxKGlmIChlcmFzZWQpIHsKKwkJcHJpbnRrKCJqZmZzX2dfY19ub3coKTogZXJhc2VkID0gJWxkXG4iLCBlcmFzZWQpOworCQlqZmZzX3ByaW50X2ZtY29udHJvbChmbWMpOworCX0pOworCisJaWYgKCFlcmFzZWQgJiYgIXJlc3VsdCkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlyZXR1cm4gcmVzdWx0OworfSAvKiBqZmZzX2dhcmJhZ2VfY29sbGVjdF9ub3coKSAqLworCisKKy8qIERldGVybWluZSBpZiBpdCBpcyByZWFzb25hYmxlIHRvIHN0YXJ0IGdhcmJhZ2UgY29sbGVjdGlvbi4KKyAgIFdlIHN0YXJ0IGEgZ2MgcGFzcyBpZiBlaXRoZXI6CisgICAtIFRoZSBudW1iZXIgb2YgZnJlZSBieXRlcyA8IE1JTl9GUkVFX0JZVEVTICYmIGF0IGxlYXN0IG9uZQorICAgICBibG9jayBpcyBkaXJ0eSwgT1IKKyAgIC0gVGhlIG51bWJlciBvZiBkaXJ0eSBieXRlcyA+IE1BWF9ESVJUWV9CWVRFUworKi8KK3N0YXRpYyBpbmxpbmUgaW50IHRocmVhZF9zaG91bGRfd2FrZSAoc3RydWN0IGpmZnNfY29udHJvbCAqYykKK3sKKwlEMShwcmludGsgKEtFUk5fTk9USUNFICJ0aHJlYWRfc2hvdWxkX3dha2UoKTogZnJlZT0lZCwgZGlydHk9JWQsIGJsb2Nrc2l6ZT0lZC5cbiIsCisJCSAgIGMtPmZtYy0+ZnJlZV9zaXplLCBjLT5mbWMtPmRpcnR5X3NpemUsIGMtPmZtYy0+c2VjdG9yX3NpemUpKTsKKworCS8qIElmIHRoZXJlJ3Mgbm90IGVub3VnaCBkaXJ0eSBzcGFjZSB0byBmcmVlIGEgYmxvY2ssIHRoZXJlJ3Mgbm8gcG9pbnQuICovCisJaWYgKGMtPmZtYy0+ZGlydHlfc2l6ZSA8IGMtPmZtYy0+c2VjdG9yX3NpemUpIHsKKwkJRDIocHJpbnRrKEtFUk5fTk9USUNFICJ0aHJlYWRfc2hvdWxkX3dha2UoKTogTm90IHdha2luZy4gSW5zdWZmaWNpZW50IGRpcnR5IHNwYWNlXG4iKSk7CisJCXJldHVybiAwOworCX0KKyNpZiAxCisJLyogSWYgdGhlcmUgaXMgdG9vIG11Y2ggUkFNIHVzZWQgYnkgdGhlIHZhcmlvdXMgc3RydWN0dXJlcywgR0MgKi8KKwlpZiAoamZmc19nZXRfbm9kZV9pbnVzZSgpID4gKGMtPmZtYy0+dXNlZF9zaXplL2MtPmZtYy0+bWF4X2NodW5rX3NpemUgKiA1ICsgamZmc19nZXRfZmlsZV9jb3VudCgpICogMiArIDUwKSkgeworCQkvKiBGSVhNRTogUHJvdmlkZSBwcm9vZiB0aGF0IHRoaXMgdGVzdCBjYW4gYmUgc2F0aXNmaWVkLiBXZQorCQkgICBkb24ndCB3YW50IGEgZmlsZXN5c3RlbSBkb2luZyBlbmRsZXNzIEdDIGp1c3QgYmVjYXVzZSB0aGlzCisJCSAgIGNvbmRpdGlvbiBjYW5ub3QgZXZlciBiZSBmYWxzZS4KKwkJKi8KKwkJRDIocHJpbnRrKEtFUk5fTk9USUNFICJ0aHJlYWRfc2hvdWxkX3dha2UoKTogV2FraW5nIGR1ZSB0byBudW1iZXIgb2Ygbm9kZXNcbiIpKTsKKwkJcmV0dXJuIDE7CisJfQorI2VuZGlmCisJLyogSWYgdGhlcmUgYXJlIGZld2VyIGZyZWUgYnl0ZXMgdGhhbiB0aGUgdGhyZXNob2xkLCBHQyAqLworCWlmIChjLT5mbWMtPmZyZWVfc2l6ZSA8IGMtPmdjX21pbmZyZWVfdGhyZXNob2xkKSB7CisJCUQyKHByaW50ayhLRVJOX05PVElDRSAidGhyZWFkX3Nob3VsZF93YWtlKCk6IFdha2luZyBkdWUgdG8gaW5zdWZmaWNlbnQgZnJlZSBzcGFjZVxuIikpOworCQlyZXR1cm4gMTsKKwl9CisJLyogSWYgdGhlcmUgYXJlIG1vcmUgZGlydHkgYnl0ZXMgdGhhbiB0aGUgdGhyZXNob2xkLCBHQyAqLworCWlmIChjLT5mbWMtPmRpcnR5X3NpemUgPiBjLT5nY19tYXhkaXJ0eV90aHJlc2hvbGQpIHsKKwkJRDIocHJpbnRrKEtFUk5fTk9USUNFICJ0aHJlYWRfc2hvdWxkX3dha2UoKTogV2FraW5nIGR1ZSB0byBleGNlc3NpdmUgZGlydHkgc3BhY2VcbiIpKTsKKwkJcmV0dXJuIDE7CisJfQkKKwkvKiBGSVhNRTogV2hhdCBhYm91dCB0aGUgIlRoZXJlIGFyZSBtYW55IHZlcnNpb25zIG9mIGEgbm9kZSIgY29uZGl0aW9uPyAqLworCisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBqZmZzX2dhcmJhZ2VfY29sbGVjdF90cmlnZ2VyKHN0cnVjdCBqZmZzX2NvbnRyb2wgKmMpCit7CisJLyogTk9URTogV2UgcmVseSBvbiB0aGUgZmFjdCB0aGF0IHdlIGhhdmUgdGhlIEJLTCBoZXJlLgorCSAqIE90aGVyd2lzZSwgdGhlIGdjX3Rhc2sgY291bGQgZ28gYXdheSBiZXR3ZWVuIHRoZSBjaGVjaworCSAqIGFuZCB0aGUgd2FrZV91cF9wcm9jZXNzKCkKKwkgKi8KKwlpZiAoYy0+Z2NfdGFzayAmJiB0aHJlYWRfc2hvdWxkX3dha2UoYykpCisJCXNlbmRfc2lnKFNJR0hVUCwgYy0+Z2NfdGFzaywgMSk7Cit9CisgIAorCisvKiBLZXJuZWwgdGhyZWFkcyAgdGFrZSAodm9pZCAqKSBhcyBhcmd1bWVudHMuICAgVGh1cyB3ZSBwYXNzCisgICB0aGUgamZmc19jb250cm9sIGRhdGEgYXMgYSAodm9pZCAqKSBhbmQgdGhlbiBjYXN0IGl0LiAqLworaW50CitqZmZzX2dhcmJhZ2VfY29sbGVjdF90aHJlYWQodm9pZCAqcHRyKQoreworICAgICAgICBzdHJ1Y3QgamZmc19jb250cm9sICpjID0gKHN0cnVjdCBqZmZzX2NvbnRyb2wgKikgcHRyOworCXN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jID0gYy0+Zm1jOworCWxvbmcgZXJhc2VkOworCWludCByZXN1bHQgPSAwOworCUQxKGludCBpID0gMSk7CisKKwlkYWVtb25pemUoImpmZnNfZ2NkIik7CisKKwljLT5nY190YXNrID0gY3VycmVudDsKKworCWxvY2tfa2VybmVsKCk7CisJaW5pdF9jb21wbGV0aW9uKCZjLT5nY190aHJlYWRfY29tcCk7IC8qIGJhcnJpZXIgKi8gCisJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJc2lnaW5pdHNldGludiAoJmN1cnJlbnQtPmJsb2NrZWQsIHNpZ21hc2soU0lHSFVQKSB8IHNpZ21hc2soU0lHS0lMTCkgfCBzaWdtYXNrKFNJR1NUT1ApIHwgc2lnbWFzayhTSUdDT05UKSk7CisJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCisJRDEocHJpbnRrIChLRVJOX05PVElDRSAiamZmc19nYXJiYWdlX2NvbGxlY3RfdGhyZWFkKCk6IFN0YXJ0aW5nIGluZmluaXRlIGxvb3AuXG4iKSk7CisKKwlmb3IgKDs7KSB7CisKKwkJLyogU2VlIGlmIHdlIG5lZWQgdG8gc3RhcnQgZ2MuICBJZiB3ZSBkb24ndCwgZ28gdG8gc2xlZXAuCisJCSAgIAorCQkgICBDdXJyZW50IGltcGxlbWVudGF0aW9uIGlzIGEgQkFEIFRISU5HKHRtKS4gIElmIHdlIHRyeSAKKwkJICAgdG8gdW5tb3VudCB0aGUgRlMsIHRoZSB1bm1vdW50IG9wZXJhdGlvbiB3aWxsIHNsZWVwIHdhaXRpbmcKKwkJICAgZm9yIHRoaXMgdGhyZWFkIHRvIGV4aXQuICBXZSBuZWVkIHRvIGFycmFuZ2UgdG8gc2VuZCBpdCBhCisJCSAgIHNpZyBiZWZvcmUgdGhlIHVtb3VudCBwcm9jZXNzIHNsZWVwcy4KKwkJKi8KKworCQlpZiAoIXRocmVhZF9zaG91bGRfd2FrZShjKSkKKwkJCXNldF9jdXJyZW50X3N0YXRlIChUQVNLX0lOVEVSUlVQVElCTEUpOworCQkKKwkJc2NoZWR1bGUoKTsgLyogWWVzLCB3ZSBkbyB0aGlzIGV2ZW4gaWYgd2Ugd2FudCB0byBnbworCQkJCSAgICAgICBvbiBpbW1lZGlhdGVseSAtIHdlJ3JlIGEgbG93IHByaW9yaXR5IAorCQkJCSAgICAgICBiYWNrZ3JvdW5kIHRhc2suICovCisKKwkJLyogUHV0X3N1cGVyIHdpbGwgc2VuZCBhIFNJR0tJTEwgYW5kIHRoZW4gd2FpdCBvbiB0aGUgc2VtLiAKKwkJICovCisJCXdoaWxlIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJc2lnaW5mb190IGluZm87CisJCQl1bnNpZ25lZCBsb25nIHNpZ25yID0gMDsKKworCQkJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CisJCQlzaWduciA9IGRlcXVldWVfc2lnbmFsKGN1cnJlbnQsICZjdXJyZW50LT5ibG9ja2VkLCAmaW5mbyk7CisJCQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCisJCQlzd2l0Y2goc2lnbnIpIHsKKwkJCWNhc2UgU0lHU1RPUDoKKwkJCQlEMShwcmludGsoImpmZnNfZ2FyYmFnZV9jb2xsZWN0X3RocmVhZCgpOiBTSUdTVE9QIHJlY2VpdmVkLlxuIikpOworCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfU1RPUFBFRCk7CisJCQkJc2NoZWR1bGUoKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTSUdLSUxMOgorCQkJCUQxKHByaW50aygiamZmc19nYXJiYWdlX2NvbGxlY3RfdGhyZWFkKCk6IFNJR0tJTEwgcmVjZWl2ZWQuXG4iKSk7CisJCQkJYy0+Z2NfdGFzayA9IE5VTEw7CisJCQkJY29tcGxldGVfYW5kX2V4aXQoJmMtPmdjX3RocmVhZF9jb21wLCAwKTsKKwkJCX0KKwkJfQorCisKKwkJRDEocHJpbnRrIChLRVJOX05PVElDRSAiamZmc19nYXJiYWdlX2NvbGxlY3RfdGhyZWFkKCk6IGNvbGxlY3RpbmcuXG4iKSk7CisKKwkJRDMocHJpbnRrIChLRVJOX05PVElDRSAiZ19jX3RocmVhZCgpOiBkb3duIGJpZ2xvY2tcbiIpKTsKKwkJZG93bigmZm1jLT5iaWdsb2NrKTsKKwkJCisJCUQxKHByaW50aygiKioqamZmc19nYXJiYWdlX2NvbGxlY3RfdGhyZWFkKCk6IHJvdW5kICMldSwgIgorCQkJICAiZm1jLT5kaXJ0eV9zaXplID0gJXVcbiIsIGkrKywgZm1jLT5kaXJ0eV9zaXplKSk7CisJCUQyKGpmZnNfcHJpbnRfZm1jb250cm9sKGZtYykpOworCisJCWlmICgoZXJhc2VkID0gamZmc190cnlfdG9fZXJhc2UoYykpIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSkZGUzogRXJyb3IgaW4gIgorCQkJICAgICAgICJnYXJiYWdlIGNvbGxlY3RvcjogJWxkLlxuIiwgZXJhc2VkKTsKKwkJfQorCisJCWlmIChlcmFzZWQpCisJCQlnb3RvIGdjX2VuZDsKKworCQlpZiAoZm1jLT5mcmVlX3NpemUgPT0gMCkgeworCQkJLyogQXJnaC4gTWlnaHQgYXMgd2VsbCBjb21taXQgc3VpY2lkZS4gKi8KKwkJCXByaW50ayhLRVJOX0VSUiAiamZmc19nYXJiYWdlX2NvbGxlY3RfdGhyZWFkKCk6IGZyZWVfc2l6ZSA9PSAwLiBUaGlzIGlzIEJBRC5cbiIpOworCQkJc2VuZF9zaWcoU0lHUVVJVCwgYy0+Z2NfdGFzaywgMSk7CisJCQkvLyBwYW5pYygpCisJCQlnb3RvIGdjX2VuZDsKKwkJfQorCQkKKwkJLyogTGV0J3MgZGFyZSB0byBtYWtlIGEgZ2FyYmFnZSBjb2xsZWN0LiAgKi8KKwkJaWYgKChyZXN1bHQgPSBqZmZzX2dhcmJhZ2VfY29sbGVjdF9uZXh0KGMpKSA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiSkZGUzogU29tZXRoaW5nICIKKwkJCSAgICAgICAiaGFzIGdvbmUgc2VyaW91c2x5IHdyb25nICIKKwkJCSAgICAgICAid2l0aCBhIGdhcmJhZ2UgY29sbGVjdDogJWRcbiIsIHJlc3VsdCk7CisJCX0KKwkJCisJZ2NfZW5kOgorCQlEMyhwcmludGsgKEtFUk5fTk9USUNFICJnX2NfdGhyZWFkKCk6IHVwIGJpZ2xvY2tcbiIpKTsKKwkJdXAoJmZtYy0+YmlnbG9jayk7CisJfSAvKiBmb3IgKDs7KSAqLworfSAvKiBqZmZzX2dhcmJhZ2VfY29sbGVjdF90aHJlYWQoKSAqLwpkaWZmIC0tZ2l0IGEvZnMvamZmcy9pbnRyZXAuaCBiL2ZzL2pmZnMvaW50cmVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFlOTdiMQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMvaW50cmVwLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIEpGRlMgLS0gSm91cm5hbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgTGludXggaW1wbGVtZW50YXRpb24uCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwICBBeGlzIENvbW11bmljYXRpb25zIEFCLgorICoKKyAqIENyZWF0ZWQgYnkgRmlubiBIYWthbnNzb24gPGZpbm5AYXhpcy5jb20+LgorICoKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICRJZDogaW50cmVwLmgsdiAxLjE0IDIwMDEvMDkvMjMgMjM6Mjg6MzcgZHdtdzIgRXhwICQKKyAqCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX0pGRlNfSU5UUkVQX0hfXworI2RlZmluZSBfX0xJTlVYX0pGRlNfSU5UUkVQX0hfXworI2luY2x1ZGUgImpmZnNfZm0uaCIKK3N0cnVjdCBqZmZzX25vZGUgKmpmZnNfYWxsb2Nfbm9kZSh2b2lkKTsKK3ZvaWQgamZmc19mcmVlX25vZGUoc3RydWN0IGpmZnNfbm9kZSAqbik7CitpbnQgamZmc19nZXRfbm9kZV9pbnVzZSh2b2lkKTsKKwordm9pZCBqZmZzX2NsZWFudXBfY29udHJvbChzdHJ1Y3QgamZmc19jb250cm9sICpjKTsKK2ludCBqZmZzX2J1aWxkX2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworCitpbnQgamZmc19pbnNlcnRfbm9kZShzdHJ1Y3QgamZmc19jb250cm9sICpjLCBzdHJ1Y3QgamZmc19maWxlICpmLAorCQkgICAgIGNvbnN0IHN0cnVjdCBqZmZzX3Jhd19pbm9kZSAqcmF3X2lub2RlLAorCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBqZmZzX25vZGUgKm5vZGUpOworc3RydWN0IGpmZnNfZmlsZSAqamZmc19maW5kX2ZpbGUoc3RydWN0IGpmZnNfY29udHJvbCAqYywgX191MzIgaW5vKTsKK3N0cnVjdCBqZmZzX2ZpbGUgKmpmZnNfZmluZF9jaGlsZChzdHJ1Y3QgamZmc19maWxlICpkaXIsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4pOworCit2b2lkIGpmZnNfZnJlZV9ub2RlKHN0cnVjdCBqZmZzX25vZGUgKm5vZGUpOworCitpbnQgamZmc19mb3JlYWNoX2ZpbGUoc3RydWN0IGpmZnNfY29udHJvbCAqYywgaW50ICgqZnVuYykoc3RydWN0IGpmZnNfZmlsZSAqKSk7CitpbnQgamZmc19wb3NzaWJseV9kZWxldGVfZmlsZShzdHJ1Y3QgamZmc19maWxlICpmKTsKK2ludCBqZmZzX2luc2VydF9maWxlX2ludG9fdHJlZShzdHJ1Y3QgamZmc19maWxlICpmKTsKK2ludCBqZmZzX3VubGlua19maWxlX2Zyb21fdHJlZShzdHJ1Y3QgamZmc19maWxlICpmKTsKK2ludCBqZmZzX2ZpbGVfY291bnQoc3RydWN0IGpmZnNfZmlsZSAqZik7CisKK2ludCBqZmZzX3dyaXRlX25vZGUoc3RydWN0IGpmZnNfY29udHJvbCAqYywgc3RydWN0IGpmZnNfbm9kZSAqbm9kZSwKKwkJICAgIHN0cnVjdCBqZmZzX3Jhd19pbm9kZSAqcmF3X2lub2RlLAorCQkgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLAorCQkgICAgaW50IHJlY292ZXJhYmxlLCBzdHJ1Y3QgamZmc19maWxlICpmKTsKK2ludCBqZmZzX3JlYWRfZGF0YShzdHJ1Y3QgamZmc19maWxlICpmLCB1bnNpZ25lZCBjaGFyICpidWYsIF9fdTMyIHJlYWRfb2Zmc2V0LCBfX3UzMiBzaXplKTsKKworLyogR2FyYmFnZSBjb2xsZWN0aW9uIHN0dWZmLiAgKi8KK2ludCBqZmZzX2dhcmJhZ2VfY29sbGVjdF90aHJlYWQodm9pZCAqYyk7Cit2b2lkIGpmZnNfZ2FyYmFnZV9jb2xsZWN0X3RyaWdnZXIoc3RydWN0IGpmZnNfY29udHJvbCAqYyk7CisKKy8qIEZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuICAqLwordm9pZCBqZmZzX3ByaW50X25vZGUoc3RydWN0IGpmZnNfbm9kZSAqbik7Cit2b2lkIGpmZnNfcHJpbnRfcmF3X2lub2RlKHN0cnVjdCBqZmZzX3Jhd19pbm9kZSAqcmF3X2lub2RlKTsKKyNpZiAwCitpbnQgamZmc19wcmludF9maWxlKHN0cnVjdCBqZmZzX2ZpbGUgKmYpOworI2VuZGlmICAvKiAgMCAgKi8KK3ZvaWQgamZmc19wcmludF9oYXNoX3RhYmxlKHN0cnVjdCBqZmZzX2NvbnRyb2wgKmMpOwordm9pZCBqZmZzX3ByaW50X3RyZWUoc3RydWN0IGpmZnNfZmlsZSAqZmlyc3RfZmlsZSwgaW50IGluZGVudCk7CisKKyNlbmRpZiAvKiBfX0xJTlVYX0pGRlNfSU5UUkVQX0hfXyAgKi8KZGlmZiAtLWdpdCBhL2ZzL2pmZnMvamZmc19mbS5jIGIvZnMvamZmcy9qZmZzX2ZtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNhYjhkYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMvamZmc19mbS5jCkBAIC0wLDAgKzEsNzk1IEBACisvKgorICogSkZGUyAtLSBKb3VybmFsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBMaW51eCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksIDIwMDAgIEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIuCisgKgorICogQ3JlYXRlZCBieSBGaW5uIEhha2Fuc3NvbiA8ZmlubkBheGlzLmNvbT4uCisgKgorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogJElkOiBqZmZzX2ZtLmMsdiAxLjI3IDIwMDEvMDkvMjAgMTI6Mjk6NDcgZHdtdzIgRXhwICQKKyAqCisgKiBQb3J0ZWQgdG8gTGludXggMi4zLnggYW5kIE1URDoKKyAqIENvcHlyaWdodCAoQykgMjAwMCAgQWxleGFuZGVyIExhcnNzb24gKGFsZXhAY2VuZGlvLnNlKSwgQ2VuZGlvIFN5c3RlbXMgQUIKKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvamZmcy5oPgorI2luY2x1ZGUgImpmZnNfZm0uaCIKKworI2lmIGRlZmluZWQoSkZGU19NQVJLX09CU09MRVRFKSAmJiBKRkZTX01BUktfT0JTT0xFVEUKK3N0YXRpYyBpbnQgamZmc19tYXJrX29ic29sZXRlKHN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jLCBfX3UzMiBmbV9vZmZzZXQpOworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgamZmc19mbSAqamZmc19hbGxvY19mbSh2b2lkKTsKK3N0YXRpYyB2b2lkIGpmZnNfZnJlZV9mbShzdHJ1Y3QgamZmc19mbSAqbik7CisKK2V4dGVybiBrbWVtX2NhY2hlX3QgICAgICpmbV9jYWNoZTsKK2V4dGVybiBrbWVtX2NhY2hlX3QgICAgICpub2RlX2NhY2hlOworCisvKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBuZXcgc2hpbnkgZmxhc2ggbWVtb3J5IGNvbnRyb2wgc3RydWN0dXJlLiAgKi8KK3N0cnVjdCBqZmZzX2ZtY29udHJvbCAqCitqZmZzX2J1aWxkX2JlZ2luKHN0cnVjdCBqZmZzX2NvbnRyb2wgKmMsIGludCB1bml0KQoreworCXN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jOworCXN0cnVjdCBtdGRfaW5mbyAqbXRkOworCQorCUQzKHByaW50aygiamZmc19idWlsZF9iZWdpbigpXG4iKSk7CisJZm1jID0gKHN0cnVjdCBqZmZzX2ZtY29udHJvbCAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBqZmZzX2ZtY29udHJvbCksCisJCQkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWZtYykgeworCQlEKHByaW50aygiamZmc19idWlsZF9iZWdpbigpOiBBbGxvY2F0aW9uIG9mICIKKwkJCSAic3RydWN0IGpmZnNfZm1jb250cm9sIGZhaWxlZCFcbiIpKTsKKwkJcmV0dXJuIChzdHJ1Y3QgamZmc19mbWNvbnRyb2wgKikwOworCX0KKwlESk0obm9famZmc19mbWNvbnRyb2wrKyk7CisKKwltdGQgPSBnZXRfbXRkX2RldmljZShOVUxMLCB1bml0KTsKKworCWlmICghbXRkKSB7CisJCWtmcmVlKGZtYyk7CisJCURKTShub19qZmZzX2ZtY29udHJvbC0tKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCQorCS8qIFJldHJpZXZlIHRoZSBzaXplIG9mIHRoZSBmbGFzaCBtZW1vcnkuICAqLworCWZtYy0+Zmxhc2hfc2l6ZSA9IG10ZC0+c2l6ZTsKKwlEMyhwcmludGsoIiAgZm1jLT5mbGFzaF9zaXplID0gJWQgYnl0ZXNcbiIsIGZtYy0+Zmxhc2hfc2l6ZSkpOworCisJZm1jLT51c2VkX3NpemUgPSAwOworCWZtYy0+ZGlydHlfc2l6ZSA9IDA7CisJZm1jLT5mcmVlX3NpemUgPSBtdGQtPnNpemU7CisJZm1jLT5zZWN0b3Jfc2l6ZSA9IG10ZC0+ZXJhc2VzaXplOworCWZtYy0+bWF4X2NodW5rX3NpemUgPSBmbWMtPnNlY3Rvcl9zaXplID4+IDE7CisJLyogbWluX2ZyZWVfc2l6ZToKKwkgICAxIHNlY3Rvciwgb2J2aW91c2x5LgorCSAgICsgMSB4IG1heF9jaHVua19zaXplLCBmb3Igd2hlbiBhIG5vZGVzIG92ZXJsYXBzIHRoZSBlbmQgb2YgYSBzZWN0b3IKKwkgICArIDEgeCBtYXhfY2h1bmtfc2l6ZSBhZ2Fpbiwgd2hpY2ggb3VnaHQgdG8gYmUgZW5vdWdoIHRvIGhhbmRsZSAKKwkJICAgdGhlIGNhc2Ugd2hlcmUgYSByZW5hbWUgY2F1c2VzIGEgbmFtZSB0byBncm93LCBhbmQgR0MgaGFzCisJCSAgIHRvIHdyaXRlIG91dCBsYXJnZXIgbm9kZXMgdGhhbiB0aGUgb25lcyBpdCdzIG9ic29sZXRpbmcuCisJCSAgIFdlIHNob3VsZCBmaXggaXQgc28gaXQgZG9lc24ndCBoYXZlIHRvIHdyaXRlIHRoZSBuYW1lCisJCSAgIF9ldmVyeV8gdGltZS4gTGF0ZXIuCisJICAgKyBhbm90aGVyIDIgc2VjdG9ycyBiZWNhdXNlIHBlb3BsZSBrZWVwIGdldHRpbmcgR0Mgc3R1Y2sgYW5kCisJICAgICAgICAgICB3ZSBkb24ndCBrbm93IHdoeS4gVGhpcyBzY2FyZXMgbWUgLSBJIHdhbnQgZm9ybWFsIHByb29mCisJCSAgIG9mIGNvcnJlY3RuZXNzIG9mIHdoYXRldmVyIG51bWJlciB3ZSBwdXQgaGVyZS4gZHdtdzIuCisJKi8KKwlmbWMtPm1pbl9mcmVlX3NpemUgPSBmbWMtPnNlY3Rvcl9zaXplIDw8IDI7CisJZm1jLT5tdGQgPSBtdGQ7CisJZm1jLT5jID0gYzsKKwlmbWMtPmhlYWQgPSBOVUxMOworCWZtYy0+dGFpbCA9IE5VTEw7CisJZm1jLT5oZWFkX2V4dHJhID0gTlVMTDsKKwlmbWMtPnRhaWxfZXh0cmEgPSBOVUxMOworCWluaXRfTVVURVgoJmZtYy0+YmlnbG9jayk7CisJcmV0dXJuIGZtYzsKK30KKworCisvKiBXaGVuIHRoZSBmbGFzaCBtZW1vcnkgc2NhbiBoYXMgY29tcGxldGVkLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQKKyAgIGJlZm9yZSB1c2Ugb2YgdGhlIGNvbnRyb2wgc3RydWN0dXJlLiAgKi8KK3ZvaWQKK2pmZnNfYnVpbGRfZW5kKHN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jKQoreworCUQzKHByaW50aygiamZmc19idWlsZF9lbmQoKVxuIikpOworCisJaWYgKCFmbWMtPmhlYWQpIHsKKwkJZm1jLT5oZWFkID0gZm1jLT5oZWFkX2V4dHJhOworCQlmbWMtPnRhaWwgPSBmbWMtPnRhaWxfZXh0cmE7CisJfQorCWVsc2UgaWYgKGZtYy0+aGVhZF9leHRyYSkgeworCQlmbWMtPnRhaWxfZXh0cmEtPm5leHQgPSBmbWMtPmhlYWQ7CisJCWZtYy0+aGVhZC0+cHJldiA9IGZtYy0+dGFpbF9leHRyYTsKKwkJZm1jLT5oZWFkID0gZm1jLT5oZWFkX2V4dHJhOworCX0KKwlmbWMtPmhlYWRfZXh0cmEgPSBOVUxMOyAvKiBUaGVzZSB0d28gaW5zdHJ1Y3Rpb25zIHNob3VsZCBiZSBvbWl0dGVkLiAgKi8KKwlmbWMtPnRhaWxfZXh0cmEgPSBOVUxMOworCUQzKGpmZnNfcHJpbnRfZm1jb250cm9sKGZtYykpOworfQorCisKKy8qIENhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHRoZSBmaWxlIHN5c3RlbSBpcyB1bm1vdW50ZWQuICBUaGlzIGZ1bmN0aW9uCisgICBmcmVlcyBhbGwgbWVtb3J5IHVzZWQgYnkgdGhpcyBtb2R1bGUuICAqLwordm9pZAoramZmc19jbGVhbnVwX2ZtY29udHJvbChzdHJ1Y3QgamZmc19mbWNvbnRyb2wgKmZtYykKK3sKKwlpZiAoZm1jKSB7CisJCXN0cnVjdCBqZmZzX2ZtICpuZXh0ID0gZm1jLT5oZWFkOworCQl3aGlsZSAobmV4dCkgeworCQkJc3RydWN0IGpmZnNfZm0gKmN1ciA9IG5leHQ7CisJCQluZXh0ID0gbmV4dC0+bmV4dDsKKwkJCWpmZnNfZnJlZV9mbShjdXIpOworCQl9CisJCXB1dF9tdGRfZGV2aWNlKGZtYy0+bXRkKTsKKwkJa2ZyZWUoZm1jKTsKKwkJREpNKG5vX2pmZnNfZm1jb250cm9sLS0pOworCX0KK30KKworCisvKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGZpcnN0IGNodW5rIG9mIGZyZWUgc3BhY2Ugb24gdGhlCisgICBmbGFzaCBtZW1vcnkuICBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHNvbWV0aGluZyBub256ZXJvIGlmIHRoZSBmbGFzaAorICAgbWVtb3J5IGNvbnRhaW5zIGFueSBmcmVlIHNwYWNlLiAgKi8KK19fdTMyCitqZmZzX2ZyZWVfc2l6ZTEoc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMpCit7CisJX191MzIgaGVhZDsKKwlfX3UzMiB0YWlsOworCV9fdTMyIGVuZCA9IGZtYy0+Zmxhc2hfc2l6ZTsKKworCWlmICghZm1jLT5oZWFkKSB7CisJCS8qIFRoZXJlIGlzIG5vdGhpbmcgb24gdGhlIGZsYXNoLiAgKi8KKwkJcmV0dXJuIGZtYy0+Zmxhc2hfc2l6ZTsKKwl9CisKKwkvKiBDb21wdXRlIHRoZSBiZWdpbm5pbmcgYW5kIGVuZGluZyBvZiB0aGUgY29udGVudHMgb2YgdGhlIGZsYXNoLiAgKi8KKwloZWFkID0gZm1jLT5oZWFkLT5vZmZzZXQ7CisJdGFpbCA9IGZtYy0+dGFpbC0+b2Zmc2V0ICsgZm1jLT50YWlsLT5zaXplOworCWlmICh0YWlsID09IGVuZCkgeworCQl0YWlsID0gMDsKKwl9CisJQVNTRVJUKGVsc2UgaWYgKHRhaWwgPiBlbmQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiamZmc19mcmVlX3NpemUxKCk6IHRhaWwgPiBlbmRcbiIpOworCQl0YWlsID0gMDsKKwl9KTsKKworCWlmIChoZWFkIDw9IHRhaWwpIHsKKwkJcmV0dXJuIGVuZCAtIHRhaWw7CisJfQorCWVsc2UgeworCQlyZXR1cm4gaGVhZCAtIHRhaWw7CisJfQorfQorCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHNvbWV0aGluZyBub256ZXJvIGluIGNhc2UgdGhlcmUgYXJlIHR3byBmcmVlCisgICBhcmVhcyBvbiB0aGUgZmxhc2guICBMaWtlIHRoaXM6CisKKyAgICAgKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisgICAgIHwgICAgIEZSRUUgMSAgICAgfCAgIFVTRUQgLyBESVJUWSAgIHwgICAgIEZSRUUgMiAgICAgfAorICAgICArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICBmbWMtPmhlYWQgLS0tLS1eCisgICAgICAgZm1jLT50YWlsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLV4KKworICAgVGhlIHZhbHVlIHJldHVybmVkLCB3aWxsIGJlIHRoZSBzaXplIG9mIHRoZSBmaXJzdCBlbXB0eSBhcmVhIG9uIHRoZQorICAgZmxhc2gsIGluIHRoaXMgY2FzZSBtYXJrZWQgIkZSRUUgMSIuICAqLworX191MzIKK2pmZnNfZnJlZV9zaXplMihzdHJ1Y3QgamZmc19mbWNvbnRyb2wgKmZtYykKK3sKKwlpZiAoZm1jLT5oZWFkKSB7CisJCV9fdTMyIGhlYWQgPSBmbWMtPmhlYWQtPm9mZnNldDsKKwkJX191MzIgdGFpbCA9IGZtYy0+dGFpbC0+b2Zmc2V0ICsgZm1jLT50YWlsLT5zaXplOworCQlpZiAodGFpbCA9PSBmbWMtPmZsYXNoX3NpemUpIHsKKwkJCXRhaWwgPSAwOworCQl9CisKKwkJaWYgKHRhaWwgPj0gaGVhZCkgeworCQkJcmV0dXJuIGhlYWQ7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyogQWxsb2NhdGUgYSBjaHVuayBvZiBmbGFzaCBtZW1vcnkuICBJZiB0aGVyZSBpcyBlbm91Z2ggc3BhY2Ugb24gdGhlCisgICBkZXZpY2UsIGEgcmVmZXJlbmNlIHRvIHRoZSBhc3NvY2lhdGVkIG5vZGUgaXMgc3RvcmVkIGluIHRoZSBqZmZzX2ZtCisgICBzdHJ1Y3QuICAqLworaW50CitqZmZzX2ZtYWxsb2Moc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMsIF9fdTMyIHNpemUsIHN0cnVjdCBqZmZzX25vZGUgKm5vZGUsCisJICAgICBzdHJ1Y3QgamZmc19mbSAqKnJlc3VsdCkKK3sKKwlzdHJ1Y3QgamZmc19mbSAqZm07CisJX191MzIgZnJlZV9jaHVua19zaXplMTsKKwlfX3UzMiBmcmVlX2NodW5rX3NpemUyOworCisJRDIocHJpbnRrKCJqZmZzX2ZtYWxsb2MoKTogZm1jID0gMHglcCwgc2l6ZSA9ICVkLCAiCisJCSAgIm5vZGUgPSAweCVwXG4iLCBmbWMsIHNpemUsIG5vZGUpKTsKKworCSpyZXN1bHQgPSBOVUxMOworCisJaWYgKCEoZm0gPSBqZmZzX2FsbG9jX2ZtKCkpKSB7CisJCUQocHJpbnRrKCJqZmZzX2ZtYWxsb2MoKToga21hbGxvYygpIGZhaWxlZCEgKGZtKVxuIikpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmcmVlX2NodW5rX3NpemUxID0gamZmc19mcmVlX3NpemUxKGZtYyk7CisJZnJlZV9jaHVua19zaXplMiA9IGpmZnNfZnJlZV9zaXplMihmbWMpOworCWlmIChmcmVlX2NodW5rX3NpemUxICsgZnJlZV9jaHVua19zaXplMiAhPSBmbWMtPmZyZWVfc2l6ZSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJGcmVlIHNpemUgYWNjb3VudGluZyBzY3Jld2VkXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiZnJlZV9jaHVua19zaXplMSA9PSAweCV4LCBmcmVlX2NodW5rX3NpemUyID09IDB4JXgsIGZtYy0+ZnJlZV9zaXplID09IDB4JXhcbiIsIGZyZWVfY2h1bmtfc2l6ZTEsIGZyZWVfY2h1bmtfc2l6ZTIsIGZtYy0+ZnJlZV9zaXplKTsKKwl9CisKKwlEMyhwcmludGsoImpmZnNfZm1hbGxvYygpOiBmcmVlX2NodW5rX3NpemUxID0gJXUsICIKKwkJICAiZnJlZV9jaHVua19zaXplMiA9ICV1XG4iLAorCQkgIGZyZWVfY2h1bmtfc2l6ZTEsIGZyZWVfY2h1bmtfc2l6ZTIpKTsKKworCWlmIChzaXplIDw9IGZyZWVfY2h1bmtfc2l6ZTEpIHsKKwkJaWYgKCEoZm0tPm5vZGVzID0gKHN0cnVjdCBqZmZzX25vZGVfcmVmICopCisJCQkJICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgamZmc19ub2RlX3JlZiksCisJCQkJCSAgR0ZQX0tFUk5FTCkpKSB7CisJCQlEKHByaW50aygiamZmc19mbWFsbG9jKCk6IGttYWxsb2MoKSBmYWlsZWQhICIKKwkJCQkgIihub2RlX3JlZilcbiIpKTsKKwkJCWpmZnNfZnJlZV9mbShmbSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlESk0obm9famZmc19ub2RlX3JlZisrKTsKKwkJZm0tPm5vZGVzLT5ub2RlID0gbm9kZTsKKwkJZm0tPm5vZGVzLT5uZXh0ID0gTlVMTDsKKwkJaWYgKGZtYy0+dGFpbCkgeworCQkJZm0tPm9mZnNldCA9IGZtYy0+dGFpbC0+b2Zmc2V0ICsgZm1jLT50YWlsLT5zaXplOworCQkJaWYgKGZtLT5vZmZzZXQgPT0gZm1jLT5mbGFzaF9zaXplKSB7CisJCQkJZm0tPm9mZnNldCA9IDA7CisJCQl9CisJCQlBU1NFUlQoZWxzZSBpZiAoZm0tPm9mZnNldCA+IGZtYy0+Zmxhc2hfc2l6ZSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImpmZnNfZm1hbGxvYygpOiAiCisJCQkJICAgICAgICJvZmZzZXQgPiBmbGFzaF9lbmRcbiIpOworCQkJCWZtLT5vZmZzZXQgPSAwOworCQkJfSk7CisJCX0KKwkJZWxzZSB7CisJCQkvKiBUaGVyZSBkb24ndCBoYXZlIHRvIGJlIGZpbGVzIGluIHRoZSBmaWxlCisJCQkgICBzeXN0ZW0geWV0LiAgKi8KKwkJCWZtLT5vZmZzZXQgPSAwOworCQl9CisJCWZtLT5zaXplID0gc2l6ZTsKKwkJZm1jLT5mcmVlX3NpemUgLT0gc2l6ZTsKKwkJZm1jLT51c2VkX3NpemUgKz0gc2l6ZTsKKwl9CisJZWxzZSBpZiAoc2l6ZSA+IGZyZWVfY2h1bmtfc2l6ZTIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSkZGUzogVHJpZWQgdG8gYWxsb2NhdGUgYSB0b28gIgorCQkgICAgICAgImxhcmdlIGZsYXNoIG1lbW9yeSBjaHVuay4gKHNpemUgPSAldSlcbiIsIHNpemUpOworCQlqZmZzX2ZyZWVfZm0oZm0pOworCQlyZXR1cm4gLUVOT1NQQzsKKwl9CisJZWxzZSB7CisJCWZtLT5vZmZzZXQgPSBmbWMtPnRhaWwtPm9mZnNldCArIGZtYy0+dGFpbC0+c2l6ZTsKKwkJZm0tPnNpemUgPSBmcmVlX2NodW5rX3NpemUxOworCQlmbS0+bm9kZXMgPSBOVUxMOworCQlmbWMtPmZyZWVfc2l6ZSAtPSBmbS0+c2l6ZTsKKwkJZm1jLT5kaXJ0eV9zaXplICs9IGZtLT5zaXplOyAvKiBDaGFuZ2VkIGJ5IHNpbW9uay4gVGhpcyBzZWVtaW5nbHkgZml4ZXMgYSAKKwkJCQkJCWJ1ZyB0aGF0IGNhdXNlZCBpbmZpbml0ZSBnYXJiYWdlIGNvbGxlY3Rpb24uCisJCQkJCQlJdCBwcmV2aW91c2x5IHNldCBmbWMtPmRpcnR5X3NpemUgdG8gc2l6ZSAod2hpY2ggaXMgdGhlCisJCQkJCQlzaXplIG9mIHRoZSByZXF1ZXN0ZWQgY2h1bmspLgorCQkJCQkgICAgICovCisJfQorCisJZm0tPm5leHQgPSBOVUxMOworCWlmICghZm1jLT5oZWFkKSB7CisJCWZtLT5wcmV2ID0gTlVMTDsKKwkJZm1jLT5oZWFkID0gZm07CisJCWZtYy0+dGFpbCA9IGZtOworCX0KKwllbHNlIHsKKwkJZm0tPnByZXYgPSBmbWMtPnRhaWw7CisJCWZtYy0+dGFpbC0+bmV4dCA9IGZtOworCQlmbWMtPnRhaWwgPSBmbTsKKwl9CisKKwlEMyhqZmZzX3ByaW50X2ZtY29udHJvbChmbWMpKTsKKwlEMyhqZmZzX3ByaW50X2ZtKGZtKSk7CisJKnJlc3VsdCA9IGZtOworCXJldHVybiAwOworfQorCisKKy8qIFRoZSBvbi1mbGFzaCBzcGFjZSBpcyBub3QgbmVlZGVkIGFueW1vcmUgYnkgdGhlIHBhc3NlZCBub2RlLiAgUmVtb3ZlCisgICB0aGUgcmVmZXJlbmNlIHRvIHRoZSBub2RlIGZyb20gdGhlIG5vZGUgbGlzdC4gIElmIHRoZSBkYXRhIGNodW5rIGluCisgICB0aGUgZmxhc2ggbWVtb3J5IGlzbid0IHVzZWQgYnkgYW55IG1vcmUgbm9kZXMgYW55bW9yZSAoZm0tPm5vZGVzID09IDApLAorICAgdGhlbiBtYXJrIHRoYXQgY2h1bmsgYXMgZGlydHkuICAqLworaW50CitqZmZzX2ZtZnJlZShzdHJ1Y3QgamZmc19mbWNvbnRyb2wgKmZtYywgc3RydWN0IGpmZnNfZm0gKmZtLCBzdHJ1Y3QgamZmc19ub2RlICpub2RlKQoreworCXN0cnVjdCBqZmZzX25vZGVfcmVmICpyZWY7CisJc3RydWN0IGpmZnNfbm9kZV9yZWYgKnByZXY7CisJQVNTRVJUKGludCBkZWwgPSAwKTsKKworCUQyKHByaW50aygiamZmc19mbWZyZWUoKTogbm9kZS0+aW5vID0gJXUsIG5vZGUtPnZlcnNpb24gPSAldVxuIiwKKwkJIG5vZGUtPmlubywgbm9kZS0+dmVyc2lvbikpOworCisJQVNTRVJUKGlmICghZm1jIHx8ICFmbSB8fCAhZm0tPm5vZGVzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiamZmc19mbWZyZWUoKTogZm1jOiAweCVwLCBmbTogMHglcCwgIgorCQkgICAgICAgImZtLT5ub2RlczogMHglcFxuIiwKKwkJICAgICAgIGZtYywgZm0sIChmbSA/IGZtLT5ub2RlcyA6IE5VTEwpKTsKKwkJcmV0dXJuIC0xOworCX0pOworCisJLyogRmluZCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBub2RlIHRoYXQgaXMgZ29pbmcgdG8gYmUgcmVtb3ZlZAorCSAgIGFuZCByZW1vdmUgaXQuICAqLworCWZvciAocmVmID0gZm0tPm5vZGVzLCBwcmV2ID0gTlVMTDsgcmVmOyByZWYgPSByZWYtPm5leHQpIHsKKwkJaWYgKHJlZi0+bm9kZSA9PSBub2RlKSB7CisJCQlpZiAocHJldikgeworCQkJCXByZXYtPm5leHQgPSByZWYtPm5leHQ7CisJCQl9CisJCQllbHNlIHsKKwkJCQlmbS0+bm9kZXMgPSByZWYtPm5leHQ7CisJCQl9CisJCQlrZnJlZShyZWYpOworCQkJREpNKG5vX2pmZnNfbm9kZV9yZWYtLSk7CisJCQlBU1NFUlQoZGVsID0gMSk7CisJCQlicmVhazsKKwkJfQorCQlwcmV2ID0gcmVmOworCX0KKworCS8qIElmIHRoZSBkYXRhIGNodW5rIGluIHRoZSBmbGFzaCBtZW1vcnkgaXNuJ3QgdXNlZCBhbnltb3JlCisJICAganVzdCBtYXJrIGl0IGFzIG9ic29sZXRlLiAgKi8KKwlpZiAoIWZtLT5ub2RlcykgeworCQkvKiBObyBub2RlIHVzZXMgdGhpcyBjaHVuayBzbyBsZXQncyByZW1vdmUgaXQuICAqLworCQlmbWMtPnVzZWRfc2l6ZSAtPSBmbS0+c2l6ZTsKKwkJZm1jLT5kaXJ0eV9zaXplICs9IGZtLT5zaXplOworI2lmIGRlZmluZWQoSkZGU19NQVJLX09CU09MRVRFKSAmJiBKRkZTX01BUktfT0JTT0xFVEUKKwkJaWYgKGpmZnNfbWFya19vYnNvbGV0ZShmbWMsIGZtLT5vZmZzZXQpIDwgMCkgeworCQkJRDEocHJpbnRrKCJqZmZzX2ZtZnJlZSgpOiBGYWlsZWQgdG8gbWFyayBhbiBvbi1mbGFzaCAiCisJCQkJICAibm9kZSBvYnNvbGV0ZSFcbiIpKTsKKwkJCXJldHVybiAtMTsKKwkJfQorI2VuZGlmCisJfQorCisJQVNTRVJUKGlmICghZGVsKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIioqKmpmZnNfZm1mcmVlKCk6ICIKKwkJICAgICAgICJEaWRuJ3QgZGVsZXRlIGFueSBub2RlIHJlZmVyZW5jZSFcbiIpOworCX0pOworCisJcmV0dXJuIDA7Cit9CisKKworLyogVGhpcyBhbGxvY2F0aW9uIGZ1bmN0aW9uIGlzIHVzZWQgZHVyaW5nIHRoZSBpbml0aWFsaXphdGlvbiBvZgorICAgdGhlIGZpbGUgc3lzdGVtLiAgKi8KK3N0cnVjdCBqZmZzX2ZtICoKK2pmZnNfZm1hbGxvY2VkKHN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jLCBfX3UzMiBvZmZzZXQsIF9fdTMyIHNpemUsCisJICAgICAgIHN0cnVjdCBqZmZzX25vZGUgKm5vZGUpCit7CisJc3RydWN0IGpmZnNfZm0gKmZtOworCisJRDMocHJpbnRrKCJqZmZzX2ZtYWxsb2NlZCgpXG4iKSk7CisKKwlpZiAoIShmbSA9IGpmZnNfYWxsb2NfZm0oKSkpIHsKKwkJRChwcmludGsoImpmZnNfZm1hbGxvY2VkKDB4JXAsICV1LCAldSwgMHglcCk6IGZhaWxlZCFcbiIsCisJCQkgZm1jLCBvZmZzZXQsIHNpemUsIG5vZGUpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWZtLT5vZmZzZXQgPSBvZmZzZXQ7CisJZm0tPnNpemUgPSBzaXplOworCWZtLT5wcmV2ID0gTlVMTDsKKwlmbS0+bmV4dCA9IE5VTEw7CisJZm0tPm5vZGVzID0gTlVMTDsKKwlpZiAobm9kZSkgeworCQkvKiBgbm9kZScgZXhpc3RzIGFuZCBpdCBzaG91bGQgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZQorCQkgICAgamZmc19mbSBzdHJ1Y3R1cmUgYGZtJy4gICovCisJCWlmICghKGZtLT5ub2RlcyA9IChzdHJ1Y3QgamZmc19ub2RlX3JlZiAqKQorCQkJCSAga21hbGxvYyhzaXplb2Yoc3RydWN0IGpmZnNfbm9kZV9yZWYpLAorCQkJCQkgIEdGUF9LRVJORUwpKSkgeworCQkJRChwcmludGsoImpmZnNfZm1hbGxvY2VkKCk6ICFmbS0+bm9kZXNcbiIpKTsKKwkJCWpmZnNfZnJlZV9mbShmbSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlESk0obm9famZmc19ub2RlX3JlZisrKTsKKwkJZm0tPm5vZGVzLT5ub2RlID0gbm9kZTsKKwkJZm0tPm5vZGVzLT5uZXh0ID0gTlVMTDsKKwkJZm1jLT51c2VkX3NpemUgKz0gc2l6ZTsKKwkJZm1jLT5mcmVlX3NpemUgLT0gc2l6ZTsKKwl9CisJZWxzZSB7CisJCS8qIElmIHRoZXJlIGlzIG5vIG5vZGUsIHRoZW4gdGhpcyBpcyBqdXN0IGEgY2h1bmsgb2YgZGlydC4gICovCisJCWZtYy0+ZGlydHlfc2l6ZSArPSBzaXplOworCQlmbWMtPmZyZWVfc2l6ZSAtPSBzaXplOworCX0KKworCWlmIChmbWMtPmhlYWRfZXh0cmEpIHsKKwkJZm0tPnByZXYgPSBmbWMtPnRhaWxfZXh0cmE7CisJCWZtYy0+dGFpbF9leHRyYS0+bmV4dCA9IGZtOworCQlmbWMtPnRhaWxfZXh0cmEgPSBmbTsKKwl9CisJZWxzZSBpZiAoIWZtYy0+aGVhZCkgeworCQlmbWMtPmhlYWQgPSBmbTsKKwkJZm1jLT50YWlsID0gZm07CisJfQorCWVsc2UgaWYgKGZtYy0+dGFpbC0+b2Zmc2V0ICsgZm1jLT50YWlsLT5zaXplIDwgb2Zmc2V0KSB7CisJCWZtYy0+aGVhZF9leHRyYSA9IGZtOworCQlmbWMtPnRhaWxfZXh0cmEgPSBmbTsKKwl9CisJZWxzZSB7CisJCWZtLT5wcmV2ID0gZm1jLT50YWlsOworCQlmbWMtPnRhaWwtPm5leHQgPSBmbTsKKwkJZm1jLT50YWlsID0gZm07CisJfQorCUQzKGpmZnNfcHJpbnRfZm1jb250cm9sKGZtYykpOworCUQzKGpmZnNfcHJpbnRfZm0oZm0pKTsKKwlyZXR1cm4gZm07Cit9CisKKworLyogQWRkIGEgbmV3IG5vZGUgdG8gYW4gYWxyZWFkeSBleGlzdGluZyBqZmZzX2ZtIHN0cnVjdC4gICovCitpbnQKK2pmZnNfYWRkX25vZGUoc3RydWN0IGpmZnNfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgamZmc19ub2RlX3JlZiAqcmVmOworCisJRDMocHJpbnRrKCJqZmZzX2FkZF9ub2RlKCk6IGlubyA9ICV1XG4iLCBub2RlLT5pbm8pKTsKKworCXJlZiA9IChzdHJ1Y3QgamZmc19ub2RlX3JlZiAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBqZmZzX25vZGVfcmVmKSwKKwkJCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZWYpCisJCXJldHVybiAtRU5PTUVNOworCisJREpNKG5vX2pmZnNfbm9kZV9yZWYrKyk7CisJcmVmLT5ub2RlID0gbm9kZTsKKwlyZWYtPm5leHQgPSBub2RlLT5mbS0+bm9kZXM7CisJbm9kZS0+Zm0tPm5vZGVzID0gcmVmOworCXJldHVybiAwOworfQorCisKKy8qIEZyZWUgYSBwYXJ0IG9mIHNvbWUgYWxsb2NhdGVkIHNwYWNlLiAgKi8KK3ZvaWQKK2pmZnNfZm1mcmVlX3BhcnRseShzdHJ1Y3QgamZmc19mbWNvbnRyb2wgKmZtYywgc3RydWN0IGpmZnNfZm0gKmZtLCBfX3UzMiBzaXplKQoreworCUQxKHByaW50aygiKioqamZmc19mbWZyZWVfcGFydGx5KCk6IGZtID0gMHglcCwgZm0tPm5vZGVzID0gMHglcCwgIgorCQkgICJmbS0+bm9kZXMtPm5vZGUtPmlubyA9ICV1LCBzaXplID0gJXVcbiIsCisJCSAgZm0sIChmbSA/IGZtLT5ub2RlcyA6IDApLAorCQkgICghZm0gPyAwIDogKCFmbS0+bm9kZXMgPyAwIDogZm0tPm5vZGVzLT5ub2RlLT5pbm8pKSwgc2l6ZSkpOworCisJaWYgKGZtLT5ub2RlcykgeworCQlrZnJlZShmbS0+bm9kZXMpOworCQlESk0obm9famZmc19ub2RlX3JlZi0tKTsKKwkJZm0tPm5vZGVzID0gTlVMTDsKKwl9CisJZm1jLT51c2VkX3NpemUgLT0gZm0tPnNpemU7CisJaWYgKGZtID09IGZtYy0+dGFpbCkgeworCQlmbS0+c2l6ZSAtPSBzaXplOworCQlmbWMtPmZyZWVfc2l6ZSArPSBzaXplOworCX0KKwlmbWMtPmRpcnR5X3NpemUgKz0gZm0tPnNpemU7Cit9CisKKworLyogRmluZCB0aGUgamZmc19mbSBzdHJ1Y3QgdGhhdCBjb250YWlucyB0aGUgZW5kIG9mIHRoZSBkYXRhIGNodW5rIHRoYXQKKyAgIGJlZ2lucyBhdCB0aGUgbG9naWNhbCBiZWdpbm5pbmcgb2YgdGhlIGZsYXNoIG1lbW9yeSBhbmQgc3BhbnMgYHNpemUnCisgICBieXRlcy4gIElmIHdlIHdhbnQgdG8gZXJhc2UgYSBzZWN0b3Igb2YgdGhlIGZsYXNoIG1lbW9yeSwgd2UgdXNlIHRoaXMKKyAgIGZ1bmN0aW9uIHRvIGZpbmQgd2hlcmUgdGhlIHNlY3RvciBsaW1pdCBjdXRzIGEgY2h1bmsgb2YgZGF0YS4gICovCitzdHJ1Y3QgamZmc19mbSAqCitqZmZzX2N1dF9ub2RlKHN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jLCBfX3UzMiBzaXplKQoreworCXN0cnVjdCBqZmZzX2ZtICpmbTsKKwlfX3UzMiBwb3MgPSAwOworCisJaWYgKHNpemUgPT0gMCkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlBU1NFUlQoaWYgKCFmbWMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJqZmZzX2N1dF9ub2RlKCk6IGZtYyA9PSBOVUxMXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfSk7CisKKwlmbSA9IGZtYy0+aGVhZDsKKworCXdoaWxlIChmbSkgeworCQlwb3MgKz0gZm0tPnNpemU7CisJCWlmIChwb3MgPCBzaXplKSB7CisJCQlmbSA9IGZtLT5uZXh0OworCQl9CisJCWVsc2UgaWYgKHBvcyA+IHNpemUpIHsKKwkJCWJyZWFrOworCQl9CisJCWVsc2UgeworCQkJZm0gPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gZm07Cit9CisKKworLyogTW92ZSB0aGUgaGVhZCBvZiB0aGUgZm1jIHN0cnVjdHVyZXMgYW5kIGRlbGV0ZSB0aGUgb2Jzb2xldGUgcGFydHMuICAqLwordm9pZAoramZmc19zeW5jX2VyYXNlKHN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jLCBpbnQgZXJhc2VkX3NpemUpCit7CisJc3RydWN0IGpmZnNfZm0gKmZtOworCXN0cnVjdCBqZmZzX2ZtICpkZWw7CisKKwlBU1NFUlQoaWYgKCFmbWMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJqZmZzX3N5bmNfZXJhc2UoKTogZm1jID09IE5VTExcbiIpOworCQlyZXR1cm47CisJfSk7CisKKwlmbWMtPmRpcnR5X3NpemUgLT0gZXJhc2VkX3NpemU7CisJZm1jLT5mcmVlX3NpemUgKz0gZXJhc2VkX3NpemU7CisKKwlmb3IgKGZtID0gZm1jLT5oZWFkOyBmbSAmJiAoZXJhc2VkX3NpemUgPiAwKTspIHsKKwkJaWYgKGVyYXNlZF9zaXplID49IGZtLT5zaXplKSB7CisJCQllcmFzZWRfc2l6ZSAtPSBmbS0+c2l6ZTsKKwkJCWRlbCA9IGZtOworCQkJZm0gPSBmbS0+bmV4dDsKKwkJCWZtLT5wcmV2ID0gTlVMTDsKKwkJCWZtYy0+aGVhZCA9IGZtOworCQkJamZmc19mcmVlX2ZtKGRlbCk7CisJCX0KKwkJZWxzZSB7CisJCQlmbS0+c2l6ZSAtPSBlcmFzZWRfc2l6ZTsKKwkJCWZtLT5vZmZzZXQgKz0gZXJhc2VkX3NpemU7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworCisvKiBSZXR1cm4gdGhlIG9sZGVzdCB1c2VkIG5vZGUgaW4gdGhlIGZsYXNoIG1lbW9yeS4gICovCitzdHJ1Y3QgamZmc19ub2RlICoKK2pmZnNfZ2V0X29sZGVzdF9ub2RlKHN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jKQoreworCXN0cnVjdCBqZmZzX2ZtICpmbTsKKwlzdHJ1Y3QgamZmc19ub2RlX3JlZiAqbnJlZjsKKwlzdHJ1Y3QgamZmc19ub2RlICpub2RlID0gTlVMTDsKKworCUFTU0VSVChpZiAoIWZtYykgeworCQlwcmludGsoS0VSTl9FUlIgImpmZnNfZ2V0X29sZGVzdF9ub2RlKCk6IGZtYyA9PSBOVUxMXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfSk7CisKKwlmb3IgKGZtID0gZm1jLT5oZWFkOyBmbSAmJiAhZm0tPm5vZGVzOyBmbSA9IGZtLT5uZXh0KTsKKworCWlmICghZm0pIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogVGhlIG9sZGVzdCBub2RlIGlzIHRoZSBsYXN0IG9uZSBpbiB0aGUgcmVmZXJlbmNlIGxpc3QuICBUaGlzIGxpc3QKKwkgICBzaG91bGRuJ3QgYmUgdG9vIGxvbmc7IGp1c3Qgb25lIG9yIHBlcmhhcHMgdHdvIGVsZW1lbnRzLiAgKi8KKwlmb3IgKG5yZWYgPSBmbS0+bm9kZXM7IG5yZWY7IG5yZWYgPSBucmVmLT5uZXh0KSB7CisJCW5vZGUgPSBucmVmLT5ub2RlOworCX0KKworCUQyKHByaW50aygiamZmc19nZXRfb2xkZXN0X25vZGUoKTogaW5vID0gJXUsIHZlcnNpb24gPSAldVxuIiwKKwkJICAobm9kZSA/IG5vZGUtPmlubyA6IDApLCAobm9kZSA/IG5vZGUtPnZlcnNpb24gOiAwKSkpOworCisJcmV0dXJuIG5vZGU7Cit9CisKKworI2lmIGRlZmluZWQoSkZGU19NQVJLX09CU09MRVRFKSAmJiBKRkZTX01BUktfT0JTT0xFVEUKKworLyogTWFyayBhbiBvbi1mbGFzaCBub2RlIGFzIG9ic29sZXRlLgorCisgICBOb3RlIHRoYXQgdGhpcyBpcyBqdXN0IGFuIG9wdGltaXphdGlvbiB0aGF0IGlzbid0IG5lY2Vzc2FyeSBmb3IgdGhlCisgICBmaWxlc3lzdGVtIHRvIHdvcmsuICAqLworCitzdGF0aWMgaW50CitqZmZzX21hcmtfb2Jzb2xldGUoc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMsIF9fdTMyIGZtX29mZnNldCkKK3sKKwkvKiBUaGUgYGFjY3VyYXRlX3BvcycgaG9sZHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBhY2N1cmF0ZSBieXRlCisJICAgaW4gdGhlIGpmZnNfcmF3X2lub2RlIHN0cnVjdHVyZSB0aGF0IHdlIGFyZSBnb2luZyB0byBtYXJrCisJICAgYXMgb2Jzb2xldGUuICAqLworCV9fdTMyIGFjY3VyYXRlX3BvcyA9IGZtX29mZnNldCArIEpGRlNfUkFXX0lOT0RFX0FDQ1VSQVRFX09GRlNFVDsKKwl1bnNpZ25lZCBjaGFyIHplcm8gPSAweDAwOworCXNpemVfdCBsZW47CisKKwlEMyhwcmludGsoImpmZnNfbWFya19vYnNvbGV0ZSgpOiBhY2N1cmF0ZV9wb3MgPSAldVxuIiwgYWNjdXJhdGVfcG9zKSk7CisJQVNTRVJUKGlmICghZm1jKSB7CisJCXByaW50ayhLRVJOX0VSUiAiamZmc19tYXJrX29ic29sZXRlKCk6IGZtYyA9PSBOVUxMXG4iKTsKKwkJcmV0dXJuIC0xOworCX0pOworCisJLyogV3JpdGUgMHgwMCB0byB0aGUgcmF3IGlub2RlJ3MgYWNjdXJhdGUgbWVtYmVyLiAgRG9uJ3QgY2FyZQorCSAgIGFib3V0IHRoZSByZXR1cm4gdmFsdWUuICAqLworCU1URF9XUklURShmbWMtPm10ZCwgYWNjdXJhdGVfcG9zLCAxLCAmbGVuLCAmemVybyk7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBKRkZTX01BUktfT0JTT0xFVEUgICovCisKKy8qIGNoZWNrIGlmIGl0J3MgcG9zc2libGUgdG8gZXJhc2UgdGhlIHdhbnRlZCByYW5nZSwgYW5kIGlmIG5vdCwgcmV0dXJuCisgKiB0aGUgcmFuZ2UgdGhhdCBJUyBlcmFzYWJsZSwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitzdGF0aWMgbG9uZworamZmc19mbGFzaF9lcmFzYWJsZV9zaXplKHN0cnVjdCBtdGRfaW5mbyAqbXRkLCBfX3UzMiBvZmZzZXQsIF9fdTMyIHNpemUpCit7CisgICAgICAgICB1X2xvbmcgc3NpemU7CisKKwkvKiBhc3N1bWUgdGhhdCBzZWN0b3Igc2l6ZSBmb3IgYSBwYXJ0aXRpb24gaXMgY29uc3RhbnQgZXZlbgorCSAqIGlmIGl0IHNwYW5zIG1vcmUgdGhhbiBvbmUgY2hpcCAoeW91IHVzdWFsbHkgcHV0IHRoZSBzYW1lCisJICogdHlwZSBvZiBjaGlwcyBpbiBhIHN5c3RlbSkKKwkgKi8KKworICAgICAgICBzc2l6ZSA9IG10ZC0+ZXJhc2VzaXplOworCisJaWYgKG9mZnNldCAlIHNzaXplKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImpmZnNfZmxhc2hfZXJhc2FibGVfc2l6ZSgpIGdpdmVuIG5vbi1hbGlnbmVkIG9mZnNldCAleCAoZXJhc2VzaXplICVseClcbiIsIG9mZnNldCwgc3NpemUpOworCQkvKiBUaGUgb2Zmc2V0IGlzIG5vdCBzZWN0b3Igc2l6ZSBhbGlnbmVkLiAgKi8KKwkJcmV0dXJuIC0xOworCX0KKwllbHNlIGlmIChvZmZzZXQgPiBtdGQtPnNpemUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiamZmc19mbGFzaF9lcmFzYWJsZV9zaXplIGdpdmVuIG9mZnNldCBvZmYgdGhlIGVuZCBvZiBkZXZpY2UgKCV4ID4gJXgpXG4iLCBvZmZzZXQsIG10ZC0+c2l6ZSk7CisJCXJldHVybiAtMjsKKwl9CisJZWxzZSBpZiAob2Zmc2V0ICsgc2l6ZSA+IG10ZC0+c2l6ZSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJqZmZzX2ZsYXNoX2VyYXNhYmxlX3NpemUoKSBnaXZlbiBsZW5ndGggd2hpY2ggcnVucyBvZmYgdGhlIGVuZCBvZiBkZXZpY2UgKG9mcyAleCArIGxlbiAleCA9ICV4LCA+ICV4KVxuIiwgb2Zmc2V0LHNpemUsIG9mZnNldCtzaXplLCBtdGQtPnNpemUpOworCQlyZXR1cm4gLTM7CisJfQorCisJcmV0dXJuIChzaXplIC8gc3NpemUpICogc3NpemU7Cit9CisKKworLyogSG93IG11Y2ggZGlydHkgZmxhc2ggbWVtb3J5IGlzIHBvc3NpYmxlIHRvIGVyYXNlIGF0IHRoZSBtb21lbnQ/ICAqLworbG9uZworamZmc19lcmFzYWJsZV9zaXplKHN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jKQoreworCXN0cnVjdCBqZmZzX2ZtICpmbTsKKwlfX3UzMiBzaXplID0gMDsKKwlsb25nIHJldDsKKworCUFTU0VSVChpZiAoIWZtYykgeworCQlwcmludGsoS0VSTl9FUlIgImpmZnNfZXJhc2FibGVfc2l6ZSgpOiBmbWMgPSBOVUxMXG4iKTsKKwkJcmV0dXJuIC0xOworCX0pOworCisJaWYgKCFmbWMtPmhlYWQpIHsKKwkJLyogVGhlIGZsYXNoIG1lbW9yeSBpcyB0b3RhbGx5IGVtcHR5LiBObyBub2Rlcy4gTm8gZGlydC4KKwkJICAgSnVzdCByZXR1cm4uICAqLworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDYWxjdWxhdGUgaG93IG11Y2ggc3BhY2UgdGhhdCBpcyBkaXJ0eS4gICovCisJZm9yIChmbSA9IGZtYy0+aGVhZDsgZm0gJiYgIWZtLT5ub2RlczsgZm0gPSBmbS0+bmV4dCkgeworCQlpZiAoc2l6ZSAmJiBmbS0+b2Zmc2V0ID09IDApIHsKKwkJCS8qIFdlIGhhdmUgcmVhY2hlZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmbGFzaC4gICovCisJCQlicmVhazsKKwkJfQorCQlzaXplICs9IGZtLT5zaXplOworCX0KKworCS8qIFNvbWVvbmUncyBzaWduYXR1cmUgY29udGFpbmVkIHRoaXM6CisJICAgVGhlcmUncyBhIGZpbmUgbGluZSBiZXR3ZWVuIGZpc2hpbmcgYW5kIGp1c3Qgc3RhbmRpbmcgb24KKwkgICB0aGUgc2hvcmUgbGlrZSBhbiBpZGlvdC4uLiAgKi8KKwlyZXQgPSBqZmZzX2ZsYXNoX2VyYXNhYmxlX3NpemUoZm1jLT5tdGQsIGZtYy0+aGVhZC0+b2Zmc2V0LCBzaXplKTsKKworCUFTU0VSVChpZiAocmV0IDwgMCkgeworCQlwcmludGsoImpmZnNfZXJhc2FibGVfc2l6ZTogZmxhc2hfZXJhc2FibGVfc2l6ZSgpICIKKwkJICAgICAgICJyZXR1cm5lZCBzb21ldGhpbmcgbGVzcyB0aGFuIHplcm8gKCVsZCkuXG4iLCByZXQpOworCQlwcmludGsoImpmZnNfZXJhc2FibGVfc2l6ZTogb2Zmc2V0ID0gMHglMDh4XG4iLAorCQkgICAgICAgZm1jLT5oZWFkLT5vZmZzZXQpOworCX0pOworCisJLyogSWYgdGhlcmUgaXMgZGlydCBvbiB0aGUgZmxhc2ggKHdoaWNoIGlzIHRoZSByZWFzb24gdG8gd2h5CisJICAgdGhpcyBmdW5jdGlvbiB3YXMgY2FsbGVkIGluIHRoZSBmaXJzdCBwbGFjZSkgYnV0IG5vIHNwYWNlIGlzCisJICAgcG9zc2libGUgdG8gZXJhc2UgcmlnaHQgbm93LCB0aGUgaW5pdGlhbCBwYXJ0IG9mIHRoZSBsaXN0IG9mCisJICAgamZmc19mbSBzdHJ1Y3RzLCB0aGF0IGhvbGQgcGxhY2UgZm9yIGRpcnR5IHNwYWNlLCBjb3VsZCBwZXJoYXBzCisJICAgYmUgc2hvcnRlbmVkLiAgVGhlIGxpc3QncyBpbml0aWFsICJkaXJ0eSIgZWxlbWVudHMgYXJlIG1lcmdlZAorCSAgIGludG8ganVzdCBvbmUgbGFyZ2UgZGlydHkgamZmc19mbSBzdHJ1Y3QuICBUaGlzIG9wZXJhdGlvbiBtdXN0CisJICAgb25seSBiZSBwZXJmb3JtZWQgaWYgbm90aGluZyBpcyBwb3NzaWJsZSB0byBlcmFzZS4gIE90aGVyd2lzZSwKKwkgICBqZmZzX2NsZWFyX2VuZF9vZl9ub2RlKCkgd29uJ3Qgd29yayBhcyBleHBlY3RlZC4gICovCisJaWYgKHJldCA9PSAwKSB7CisJCXN0cnVjdCBqZmZzX2ZtICpoZWFkID0gZm1jLT5oZWFkOworCQlzdHJ1Y3QgamZmc19mbSAqZGVsOworCQkvKiBXaGlsZSB0aGVyZSBhcmUgdHdvIGRpcnR5IG5vZGVzIGJlc2lkZSBlYWNoIG90aGVyLiovCisJCXdoaWxlIChoZWFkLT5ub2RlcyA9PSAwCisJCSAgICAgICAmJiBoZWFkLT5uZXh0CisJCSAgICAgICAmJiBoZWFkLT5uZXh0LT5ub2RlcyA9PSAwKSB7CisJCQlkZWwgPSBoZWFkLT5uZXh0OworCQkJaGVhZC0+c2l6ZSArPSBkZWwtPnNpemU7CisJCQloZWFkLT5uZXh0ID0gZGVsLT5uZXh0OworCQkJaWYgKGRlbC0+bmV4dCkgeworCQkJCWRlbC0+bmV4dC0+cHJldiA9IGhlYWQ7CisJCQl9CisJCQlqZmZzX2ZyZWVfZm0oZGVsKTsKKwkJfQorCX0KKworCXJldHVybiAocmV0ID49IDAgPyByZXQgOiAwKTsKK30KKworc3RhdGljIHN0cnVjdCBqZmZzX2ZtICpqZmZzX2FsbG9jX2ZtKHZvaWQpCit7CisJc3RydWN0IGpmZnNfZm0gKmZtOworCisJZm0gPSBrbWVtX2NhY2hlX2FsbG9jKGZtX2NhY2hlLEdGUF9LRVJORUwpOworCURKTShpZiAoZm0pIG5vX2pmZnNfZm0rKzspOworCQorCXJldHVybiBmbTsKK30KKworc3RhdGljIHZvaWQgamZmc19mcmVlX2ZtKHN0cnVjdCBqZmZzX2ZtICpuKQoreworCWttZW1fY2FjaGVfZnJlZShmbV9jYWNoZSxuKTsKKwlESk0obm9famZmc19mbS0tKTsKK30KKworCisKK3N0cnVjdCBqZmZzX25vZGUgKmpmZnNfYWxsb2Nfbm9kZSh2b2lkKQoreworCXN0cnVjdCBqZmZzX25vZGUgKm47CisKKwluID0gKHN0cnVjdCBqZmZzX25vZGUgKilrbWVtX2NhY2hlX2FsbG9jKG5vZGVfY2FjaGUsR0ZQX0tFUk5FTCk7CisJaWYobiAhPSBOVUxMKQorCQlub19qZmZzX25vZGUrKzsKKwlyZXR1cm4gbjsKK30KKwordm9pZCBqZmZzX2ZyZWVfbm9kZShzdHJ1Y3QgamZmc19ub2RlICpuKQoreworCWttZW1fY2FjaGVfZnJlZShub2RlX2NhY2hlLG4pOworCW5vX2pmZnNfbm9kZS0tOworfQorCisKK2ludCBqZmZzX2dldF9ub2RlX2ludXNlKHZvaWQpCit7CisJcmV0dXJuIG5vX2pmZnNfbm9kZTsKK30KKwordm9pZAoramZmc19wcmludF9mbWNvbnRyb2woc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMpCit7CisJRChwcmludGsoInN0cnVjdCBqZmZzX2ZtY29udHJvbDogMHglcFxuIiwgZm1jKSk7CisJRChwcmludGsoIntcbiIpKTsKKwlEKHByaW50aygiICAgICAgICAldSwgLyogZmxhc2hfc2l6ZSAgKi9cbiIsIGZtYy0+Zmxhc2hfc2l6ZSkpOworCUQocHJpbnRrKCIgICAgICAgICV1LCAvKiB1c2VkX3NpemUgICovXG4iLCBmbWMtPnVzZWRfc2l6ZSkpOworCUQocHJpbnRrKCIgICAgICAgICV1LCAvKiBkaXJ0eV9zaXplICAqL1xuIiwgZm1jLT5kaXJ0eV9zaXplKSk7CisJRChwcmludGsoIiAgICAgICAgJXUsIC8qIGZyZWVfc2l6ZSAgKi9cbiIsIGZtYy0+ZnJlZV9zaXplKSk7CisJRChwcmludGsoIiAgICAgICAgJXUsIC8qIHNlY3Rvcl9zaXplICAqL1xuIiwgZm1jLT5zZWN0b3Jfc2l6ZSkpOworCUQocHJpbnRrKCIgICAgICAgICV1LCAvKiBtaW5fZnJlZV9zaXplICAqL1xuIiwgZm1jLT5taW5fZnJlZV9zaXplKSk7CisJRChwcmludGsoIiAgICAgICAgJXUsIC8qIG1heF9jaHVua19zaXplICAqL1xuIiwgZm1jLT5tYXhfY2h1bmtfc2l6ZSkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIG10ZCAgKi9cbiIsIGZtYy0+bXRkKSk7CisJRChwcmludGsoIiAgICAgICAgMHglcCwgLyogaGVhZCAgKi8gICAgIgorCQkgIihoZWFkLT5vZmZzZXQgPSAweCUwOHgpXG4iLAorCQkgZm1jLT5oZWFkLCAoZm1jLT5oZWFkID8gZm1jLT5oZWFkLT5vZmZzZXQgOiAwKSkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIHRhaWwgICovICAgICIKKwkJICIodGFpbC0+b2Zmc2V0ICsgdGFpbC0+c2l6ZSA9IDB4JTA4eClcbiIsCisJCSBmbWMtPnRhaWwsCisJCSAoZm1jLT50YWlsID8gZm1jLT50YWlsLT5vZmZzZXQgKyBmbWMtPnRhaWwtPnNpemUgOiAwKSkpOworCUQocHJpbnRrKCIgICAgICAgIDB4JXAsIC8qIGhlYWRfZXh0cmEgICovXG4iLCBmbWMtPmhlYWRfZXh0cmEpKTsKKwlEKHByaW50aygiICAgICAgICAweCVwLCAvKiB0YWlsX2V4dHJhICAqL1xuIiwgZm1jLT50YWlsX2V4dHJhKSk7CisJRChwcmludGsoIn1cbiIpKTsKK30KKwordm9pZAoramZmc19wcmludF9mbShzdHJ1Y3QgamZmc19mbSAqZm0pCit7CisJRChwcmludGsoInN0cnVjdCBqZmZzX2ZtOiAweCVwXG4iLCBmbSkpOworCUQocHJpbnRrKCJ7XG4iKSk7CisJRChwcmludGsoIiAgICAgICAweCUwOHgsIC8qIG9mZnNldCAgKi9cbiIsIGZtLT5vZmZzZXQpKTsKKwlEKHByaW50aygiICAgICAgICV1LCAvKiBzaXplICAqL1xuIiwgZm0tPnNpemUpKTsKKwlEKHByaW50aygiICAgICAgIDB4JXAsIC8qIHByZXYgICovXG4iLCBmbS0+cHJldikpOworCUQocHJpbnRrKCIgICAgICAgMHglcCwgLyogbmV4dCAgKi9cbiIsIGZtLT5uZXh0KSk7CisJRChwcmludGsoIiAgICAgICAweCVwLCAvKiBub2RlcyAgKi9cbiIsIGZtLT5ub2RlcykpOworCUQocHJpbnRrKCJ9XG4iKSk7Cit9CisKKyNpZiAwCit2b2lkCitqZmZzX3ByaW50X25vZGVfcmVmKHN0cnVjdCBqZmZzX25vZGVfcmVmICpyZWYpCit7CisJRChwcmludGsoInN0cnVjdCBqZmZzX25vZGVfcmVmOiAweCVwXG4iLCByZWYpKTsKKwlEKHByaW50aygie1xuIikpOworCUQocHJpbnRrKCIgICAgICAgMHglcCwgLyogbm9kZSAgKi9cbiIsIHJlZi0+bm9kZSkpOworCUQocHJpbnRrKCIgICAgICAgMHglcCwgLyogbmV4dCAgKi9cbiIsIHJlZi0+bmV4dCkpOworCUQocHJpbnRrKCJ9XG4iKSk7Cit9CisjZW5kaWYgIC8qICAwICAqLworCmRpZmYgLS1naXQgYS9mcy9qZmZzL2pmZnNfZm0uaCBiL2ZzL2pmZnMvamZmc19mbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMjkxYzQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZmZzL2pmZnNfZm0uaApAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIEpGRlMgLS0gSm91cm5hbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgTGludXggaW1wbGVtZW50YXRpb24uCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwICBBeGlzIENvbW11bmljYXRpb25zIEFCLgorICoKKyAqIENyZWF0ZWQgYnkgRmlubiBIYWthbnNzb24gPGZpbm5AYXhpcy5jb20+LgorICoKKyAqIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICRJZDogamZmc19mbS5oLHYgMS4xMyAyMDAxLzAxLzExIDEyOjAzOjI1IGR3bXcyIEV4cCAkCisgKgorICogUG9ydGVkIHRvIExpbnV4IDIuMy54IGFuZCBNVEQ6CisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgIEFsZXhhbmRlciBMYXJzc29uIChhbGV4QGNlbmRpby5zZSksIENlbmRpbyBTeXN0ZW1zIEFCCisgKgorICovCisKKyNpZm5kZWYgX19MSU5VWF9KRkZTX0ZNX0hfXworI2RlZmluZSBfX0xJTlVYX0pGRlNfRk1fSF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2pmZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKy8qIFRoZSBhbGlnbm1lbnQgYmV0d2VlbiB0d28gbm9kZXMgaW4gdGhlIGZsYXNoIG1lbW9yeS4gICovCisjZGVmaW5lIEpGRlNfQUxJR05fU0laRSA0CisKKy8qIE1hcmsgdGhlIG9uLWZsYXNoIHNwYWNlIGFzIG9ic29sZXRlIHdoZW4gYXBwcm9wcmlhdGUuICAqLworI2RlZmluZSBKRkZTX01BUktfT0JTT0xFVEUgMAorCisjaWZuZGVmIENPTkZJR19KRkZTX0ZTX1ZFUkJPU0UKKyNkZWZpbmUgQ09ORklHX0pGRlNfRlNfVkVSQk9TRSAxCisjZW5kaWYKKworI2lmIENPTkZJR19KRkZTX0ZTX1ZFUkJPU0UgPiAwCisjZGVmaW5lIEQoeCkgeAorI2RlZmluZSBEMSh4KSBEKHgpCisjZWxzZQorI2RlZmluZSBEKHgpCisjZGVmaW5lIEQxKHgpCisjZW5kaWYKKworI2lmIENPTkZJR19KRkZTX0ZTX1ZFUkJPU0UgPiAxCisjZGVmaW5lIEQyKHgpIEQoeCkKKyNlbHNlCisjZGVmaW5lIEQyKHgpCisjZW5kaWYKKworI2lmIENPTkZJR19KRkZTX0ZTX1ZFUkJPU0UgPiAyCisjZGVmaW5lIEQzKHgpIEQoeCkKKyNlbHNlCisjZGVmaW5lIEQzKHgpCisjZW5kaWYKKworI2RlZmluZSBBU1NFUlQoeCkgeAorCisvKiBIb3cgbWFueSBwYWRkaW5nIGJ5dGVzIHNob3VsZCBiZSBpbnNlcnRlZCBiZXR3ZWVuIHR3byBjaHVua3Mgb2YgZGF0YQorICAgb24gdGhlIGZsYXNoPyAgKi8KKyNkZWZpbmUgSkZGU19HRVRfUEFEX0JZVEVTKHNpemUpICggKEpGRlNfQUxJR05fU0laRS0xKSAmIC0oX191MzIpKHNpemUpICkKKyNkZWZpbmUgSkZGU19QQUQoc2l6ZSkgKCAoc2l6ZSArIChKRkZTX0FMSUdOX1NJWkUtMSkpICYgfihKRkZTX0FMSUdOX1NJWkUtMSkgKQorCisKKworc3RydWN0IGpmZnNfbm9kZV9yZWYKK3sKKwlzdHJ1Y3QgamZmc19ub2RlICpub2RlOworCXN0cnVjdCBqZmZzX25vZGVfcmVmICpuZXh0OworfTsKKworCisvKiBUaGUgc3RydWN0IGpmZnNfZm0gcmVwcmVzZW50cyBhIGNodW5rIG9mIGRhdGEgaW4gdGhlIGZsYXNoIG1lbW9yeS4gICovCitzdHJ1Y3QgamZmc19mbQoreworCV9fdTMyIG9mZnNldDsKKwlfX3UzMiBzaXplOworCXN0cnVjdCBqZmZzX2ZtICpwcmV2OworCXN0cnVjdCBqZmZzX2ZtICpuZXh0OworCXN0cnVjdCBqZmZzX25vZGVfcmVmICpub2RlczsgLyogVVNFRCBpZiAhPSAwLiAgKi8KK307CisKK3N0cnVjdCBqZmZzX2ZtY29udHJvbAoreworCV9fdTMyIGZsYXNoX3NpemU7CisJX191MzIgdXNlZF9zaXplOworCV9fdTMyIGRpcnR5X3NpemU7CisJX191MzIgZnJlZV9zaXplOworCV9fdTMyIHNlY3Rvcl9zaXplOworCV9fdTMyIG1pbl9mcmVlX3NpemU7ICAvKiBUaGUgbWluaW11bSBmcmVlIHNwYWNlIG5lZWRlZCB0byBiZSBhYmxlCisJCQkJIHRvIHBlcmZvcm0gZ2FyYmFnZSBjb2xsZWN0aW9ucy4gICovCisJX191MzIgbWF4X2NodW5rX3NpemU7IC8qIFRoZSBtYXhpbXVtIHNpemUgb2YgYSBjaHVuayBvZiBkYXRhLiAgKi8KKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZDsKKwlzdHJ1Y3QgamZmc19jb250cm9sICpjOworCXN0cnVjdCBqZmZzX2ZtICpoZWFkOworCXN0cnVjdCBqZmZzX2ZtICp0YWlsOworCXN0cnVjdCBqZmZzX2ZtICpoZWFkX2V4dHJhOworCXN0cnVjdCBqZmZzX2ZtICp0YWlsX2V4dHJhOworCXN0cnVjdCBzZW1hcGhvcmUgYmlnbG9jazsKK307CisKKy8qIE5vdGljZSB0aGUgdHdvIG1lbWJlcnMgaGVhZF9leHRyYSBhbmQgdGFpbF9leHRyYSBpbiB0aGUgamZmc19jb250cm9sCisgICBzdHJ1Y3R1cmUgYWJvdmUuIFRob3NlIGFyZSBvbmx5IHVzZWQgZHVyaW5nIHRoZSBzY2FubmluZyBvZiB0aGUgZmxhc2gKKyAgIG1lbW9yeTsgd2hpbGUgdGhlIGZpbGUgc3lzdGVtIGlzIGJlaW5nIGJ1aWx0LiBJZiB0aGUgZGF0YSBpbiB0aGUgZmxhc2gKKyAgIG1lbW9yeSBpcyBvcmdhbml6ZWQgbGlrZQorCisgICAgICArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgIHwgIFVTRUQgLyBESVJUWSAgfCAgICAgICBGUkVFICAgICAgIHwgIFVTRUQgLyBESVJUWSAgfAorICAgICAgKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rCisKKyAgIHRoZW4gdGhlIHNjYW4gaXMgc3BsaXQgaW4gdHdvIHBhcnRzLiBUaGUgZmlyc3Qgc2Nhbm5lZCBwYXJ0IG9mIHRoZQorICAgZmxhc2ggbWVtb3J5IGlzIG9yZ2FuaXplZCB0aHJvdWdoIHRoZSBtZW1iZXJzIGhlYWQgYW5kIHRhaWwuIFRoZQorICAgc2Vjb25kIHNjYW5uZWQgcGFydCBpcyBvcmdhbml6ZWQgd2l0aCBoZWFkX2V4dHJhIGFuZCB0YWlsX2V4dHJhLiBXaGVuCisgICB0aGUgc2NhbiBpcyBjb21wbGV0ZWQsIHRoZSB0d28gbGlzdHMgYXJlIG1lcmdlZCB0b2dldGhlci4gVGhlIGpmZnNfZm0KKyAgIHN0cnVjdCB0aGF0IGhlYWRfZXh0cmEgcmVmZXJlbmNlcyBpcyB0aGUgbG9naWNhbCBiZWdpbm5pbmcgb2YgdGhlCisgICBmbGFzaCBtZW1vcnkgc28gaXQgd2lsbCBiZSByZWZlcmVuY2VkIGJ5IHRoZSBoZWFkIG1lbWJlci4gICovCisKKworCitzdHJ1Y3QgamZmc19mbWNvbnRyb2wgKmpmZnNfYnVpbGRfYmVnaW4oc3RydWN0IGpmZnNfY29udHJvbCAqYywgaW50IHVuaXQpOwordm9pZCBqZmZzX2J1aWxkX2VuZChzdHJ1Y3QgamZmc19mbWNvbnRyb2wgKmZtYyk7Cit2b2lkIGpmZnNfY2xlYW51cF9mbWNvbnRyb2woc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMpOworCitpbnQgamZmc19mbWFsbG9jKHN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jLCBfX3UzMiBzaXplLAorCQkgc3RydWN0IGpmZnNfbm9kZSAqbm9kZSwgc3RydWN0IGpmZnNfZm0gKipyZXN1bHQpOworaW50IGpmZnNfZm1mcmVlKHN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jLCBzdHJ1Y3QgamZmc19mbSAqZm0sCisJCXN0cnVjdCBqZmZzX25vZGUgKm5vZGUpOworCitfX3UzMiBqZmZzX2ZyZWVfc2l6ZTEoc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMpOworX191MzIgamZmc19mcmVlX3NpemUyKHN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jKTsKK3ZvaWQgamZmc19zeW5jX2VyYXNlKHN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jLCBpbnQgZXJhc2VkX3NpemUpOworc3RydWN0IGpmZnNfZm0gKmpmZnNfY3V0X25vZGUoc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMsIF9fdTMyIHNpemUpOworc3RydWN0IGpmZnNfbm9kZSAqamZmc19nZXRfb2xkZXN0X25vZGUoc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMpOworbG9uZyBqZmZzX2VyYXNhYmxlX3NpemUoc3RydWN0IGpmZnNfZm1jb250cm9sICpmbWMpOworc3RydWN0IGpmZnNfZm0gKmpmZnNfZm1hbGxvY2VkKHN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jLCBfX3UzMiBvZmZzZXQsCisJCQkgICAgICAgX191MzIgc2l6ZSwgc3RydWN0IGpmZnNfbm9kZSAqbm9kZSk7CitpbnQgamZmc19hZGRfbm9kZShzdHJ1Y3QgamZmc19ub2RlICpub2RlKTsKK3ZvaWQgamZmc19mbWZyZWVfcGFydGx5KHN0cnVjdCBqZmZzX2ZtY29udHJvbCAqZm1jLCBzdHJ1Y3QgamZmc19mbSAqZm0sCisJCQlfX3UzMiBzaXplKTsKKwordm9pZCBqZmZzX3ByaW50X2ZtY29udHJvbChzdHJ1Y3QgamZmc19mbWNvbnRyb2wgKmZtYyk7Cit2b2lkIGpmZnNfcHJpbnRfZm0oc3RydWN0IGpmZnNfZm0gKmZtKTsKKyNpZiAwCit2b2lkIGpmZnNfcHJpbnRfbm9kZV9yZWYoc3RydWN0IGpmZnNfbm9kZV9yZWYgKnJlZik7CisjZW5kaWYgIC8qICAwICAqLworCisjZW5kaWYgLyogX19MSU5VWF9KRkZTX0ZNX0hfXyAgKi8KZGlmZiAtLWdpdCBhL2ZzL2pmZnMvamZmc19wcm9jLmMgYi9mcy9qZmZzL2pmZnNfcHJvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZGQ5OWEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZmZzL2pmZnNfcHJvYy5jCkBAIC0wLDAgKzEsMjYxIEBACisvKgorICogSkZGUyAtLSBKb3VybmFsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBMaW51eCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgIEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIuCisgKgorICogQ3JlYXRlZCBieSBTaW1vbiBLYWdzdHJvbSA8c2ltb25rQGF4aXMuY29tPi4KKyAqCisgKiAkSWQ6IGpmZnNfcHJvYy5jLHYgMS41IDIwMDEvMDYvMDIgMTQ6MzQ6NTUgZHdtdzIgRXhwICQKKyAqCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgT3ZlcnZpZXc6CisgKiAgIFRoaXMgZmlsZSBkZWZpbmVzIEpGRlMgcGFydGl0aW9uIGVudHJpZXMgaW4gdGhlIHByb2MgZmlsZSBzeXN0ZW0uCisgKgorICogIFRPRE86CisgKiAgIENyZWF0ZSBzb21lIG1vcmUgcHJvYyBmaWxlcyBmb3IgZGlmZmVyZW50IGtpbmRzIG9mIGluZm8sIGkuZS4gc3RhdGlzdGljcworICogICBhYm91dCB3cml0dGVuIGFuZCByZWFkIGJ5dGVzLCBudW1iZXIgb2YgY2FsbHMgdG8gZGlmZmVyZW50IHJvdXRpbmVzLAorICogICByZXBvcnRzIGFib3V0IGZhaWx1cmVzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvamZmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSAiamZmc19mbS5oIgorI2luY2x1ZGUgImpmZnNfcHJvYy5oIgorCisvKgorICogU3RydWN0dXJlIGZvciBhIEpGRlMgcGFydGl0aW9uIGluIHRoZSBzeXN0ZW0KKyAqLworc3RydWN0IGpmZnNfcGFydGl0aW9uX2RpciB7CisJc3RydWN0IGpmZnNfY29udHJvbCAqYzsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBhcnRfcm9vdDsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBhcnRfaW5mbzsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBhcnRfbGF5b3V0OworCXN0cnVjdCBqZmZzX3BhcnRpdGlvbl9kaXIgKm5leHQ7Cit9OworCisvKgorICogU3RydWN0dXJlIGZvciB0b3AtbGV2ZWwgZW50cnkgaW4gJy9wcm9jL2ZzJyBkaXJlY3RvcnkKKyAqLworc3RydWN0IHByb2NfZGlyX2VudHJ5ICpqZmZzX3Byb2Nfcm9vdDsKKworLyoKKyAqIExpbmtlZCBsaXN0IG9mICdqZmZzX3BhcnRpdGlvbl9kaXJzJyB0byBoZWxwIHVzIHRyYWNrCisgKiB0aGUgbW91bnRlZCBKRkZTIHBhcnRpdGlvbnMgaW4gdGhlIHN5c3RlbQorICovCitzdGF0aWMgc3RydWN0IGpmZnNfcGFydGl0aW9uX2RpciAqamZmc19wYXJ0X2RpcnM7CisKKy8qCisgKiBSZWFkIGZ1bmN0aW9ucyBmb3IgZW50cmllcworICovCitzdGF0aWMgaW50IGpmZnNfcHJvY19pbmZvX3JlYWQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCWludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpOworc3RhdGljIGludCBqZmZzX3Byb2NfbGF5b3V0X3JlYWQgKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQlpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKTsKKworCisvKgorICogUmVnaXN0ZXIgYSBKRkZTIHBhcnRpdGlvbiBkaXJlY3RvcnkgKGNhbGxlZCB1cG9uIG1vdW50KQorICovCitpbnQgamZmc19yZWdpc3Rlcl9qZmZzX3Byb2NfZGlyKGludCBtdGQsIHN0cnVjdCBqZmZzX2NvbnRyb2wgKmMpCit7CisJc3RydWN0IGpmZnNfcGFydGl0aW9uX2RpciAqcGFydF9kaXI7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwYXJ0X2luZm8gPSBOVUxMOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGFydF9sYXlvdXQgPSBOVUxMOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGFydF9yb290ID0gTlVMTDsKKwljaGFyIG5hbWVbMTBdOworCisJc3ByaW50ZihuYW1lLCAiJWQiLCBtdGQpOworCS8qIEFsbG9jYXRlIHN0cnVjdHVyZSBmb3IgbG9jYWwgSkZGUyBwYXJ0aXRpb24gdGFibGUgKi8KKwlwYXJ0X2RpciA9IChzdHJ1Y3QgamZmc19wYXJ0aXRpb25fZGlyICopCisJCWttYWxsb2Moc2l6ZW9mIChzdHJ1Y3QgamZmc19wYXJ0aXRpb25fZGlyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwYXJ0X2RpcikKKwkJZ290byBvdXQ7CisKKwkvKiBDcmVhdGUgZW50cnkgZm9yIHRoaXMgcGFydGl0aW9uICovCisJcGFydF9yb290ID0gcHJvY19ta2RpcihuYW1lLCBqZmZzX3Byb2Nfcm9vdCk7CisJaWYgKCFwYXJ0X3Jvb3QpCisJCWdvdG8gb3V0MTsKKworCS8qIENyZWF0ZSBlbnRyeSBmb3IgJ2luZm8nIGZpbGUgKi8KKwlwYXJ0X2luZm8gPSBjcmVhdGVfcHJvY19lbnRyeSAoImluZm8iLCAwLCBwYXJ0X3Jvb3QpOworCWlmICghcGFydF9pbmZvKQorCQlnb3RvIG91dDI7CisJcGFydF9pbmZvLT5yZWFkX3Byb2MgPSBqZmZzX3Byb2NfaW5mb19yZWFkOworCXBhcnRfaW5mby0+ZGF0YSA9ICh2b2lkICopIGM7CisKKwkvKiBDcmVhdGUgZW50cnkgZm9yICdsYXlvdXQnIGZpbGUgKi8KKwlwYXJ0X2xheW91dCA9IGNyZWF0ZV9wcm9jX2VudHJ5ICgibGF5b3V0IiwgMCwgcGFydF9yb290KTsKKwlpZiAoIXBhcnRfbGF5b3V0KQorCQlnb3RvIG91dDM7CisJcGFydF9sYXlvdXQtPnJlYWRfcHJvYyA9IGpmZnNfcHJvY19sYXlvdXRfcmVhZDsKKwlwYXJ0X2xheW91dC0+ZGF0YSA9ICh2b2lkICopIGM7CisKKwkvKiBGaWxsIGluIHN0cnVjdHVyZSBmb3IgdGFibGUgYW5kIGluc2VydCBpbiB0aGUgbGlzdCAqLworCXBhcnRfZGlyLT5jID0gYzsKKwlwYXJ0X2Rpci0+cGFydF9yb290ID0gcGFydF9yb290OworCXBhcnRfZGlyLT5wYXJ0X2luZm8gPSBwYXJ0X2luZm87CisJcGFydF9kaXItPnBhcnRfbGF5b3V0ID0gcGFydF9sYXlvdXQ7CisJcGFydF9kaXItPm5leHQgPSBqZmZzX3BhcnRfZGlyczsKKwlqZmZzX3BhcnRfZGlycyA9IHBhcnRfZGlyOworCisJLyogUmV0dXJuIGhhcHB5ICovCisJcmV0dXJuIDA7CisKK291dDM6CisJcmVtb3ZlX3Byb2NfZW50cnkoImluZm8iLCBwYXJ0X3Jvb3QpOworb3V0MjoKKwlyZW1vdmVfcHJvY19lbnRyeShuYW1lLCBqZmZzX3Byb2Nfcm9vdCk7CitvdXQxOgorCWtmcmVlKHBhcnRfZGlyKTsKK291dDoKKwlyZXR1cm4gLUVOT01FTTsKK30KKworCisvKgorICogVW5yZWdpc3RlciBhIEpGRlMgcGFydGl0aW9uIGRpcmVjdG9yeSAoY2FsbGVkIGF0IHVtb3VudCkKKyAqLworaW50IGpmZnNfdW5yZWdpc3Rlcl9qZmZzX3Byb2NfZGlyKHN0cnVjdCBqZmZzX2NvbnRyb2wgKmMpCit7CisJc3RydWN0IGpmZnNfcGFydGl0aW9uX2RpciAqcGFydF9kaXIgPSBqZmZzX3BhcnRfZGlyczsKKwlzdHJ1Y3QgamZmc19wYXJ0aXRpb25fZGlyICpwcmV2X3BhcnRfZGlyID0gTlVMTDsKKworCXdoaWxlIChwYXJ0X2RpcikgeworCQlpZiAocGFydF9kaXItPmMgPT0gYykgeworCQkJLyogUmVtb3ZlIGVudHJpZXMgZm9yIHBhcnRpdGlvbiAqLworCQkJcmVtb3ZlX3Byb2NfZW50cnkgKHBhcnRfZGlyLT5wYXJ0X2luZm8tPm5hbWUsCisJCQkJcGFydF9kaXItPnBhcnRfcm9vdCk7CisJCQlyZW1vdmVfcHJvY19lbnRyeSAocGFydF9kaXItPnBhcnRfbGF5b3V0LT5uYW1lLAorCQkJCXBhcnRfZGlyLT5wYXJ0X3Jvb3QpOworCQkJcmVtb3ZlX3Byb2NfZW50cnkgKHBhcnRfZGlyLT5wYXJ0X3Jvb3QtPm5hbWUsCisJCQkJamZmc19wcm9jX3Jvb3QpOworCisJCQkvKiBSZW1vdmUgZW50cnkgZnJvbSBsaXN0ICovCisJCQlpZiAocHJldl9wYXJ0X2RpcikKKwkJCQlwcmV2X3BhcnRfZGlyLT5uZXh0ID0gcGFydF9kaXItPm5leHQ7CisJCQllbHNlCisJCQkJamZmc19wYXJ0X2RpcnMgPSBwYXJ0X2Rpci0+bmV4dDsKKworCQkJLyoKKwkJCSAqIENoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIHRoZSBsYXN0IG9uZQorCQkJICogYW5kIHJlbW92ZSB0aGUgZW50cnkgZnJvbSAnL3Byb2MvZnMnCisJCQkgKiBpZiBpdCBpcy4KKwkJCSAqLworCQkJaWYgKGpmZnNfcGFydF9kaXJzID09IHBhcnRfZGlyLT5uZXh0KQorCQkJCXJlbW92ZV9wcm9jX2VudHJ5ICgiamZmcyIsIHByb2Nfcm9vdF9mcyk7CisKKwkJCS8qIEZyZWUgbWVtb3J5IGZvciBlbnRyeSAqLworCQkJa2ZyZWUocGFydF9kaXIpOworCisJCQkvKiBSZXR1cm4gaGFwcHkgKi8KKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogTW92ZSB0byBuZXh0IGVudHJ5ICovCisJCXByZXZfcGFydF9kaXIgPSBwYXJ0X2RpcjsKKwkJcGFydF9kaXIgPSBwYXJ0X2Rpci0+bmV4dDsKKwl9CisKKwkvKiBSZXR1cm4gdW5oYXBweSAqLworCXJldHVybiAtMTsKK30KKworCisvKgorICogUmVhZCBhIEpGRlMgcGFydGl0aW9uJ3MgYGluZm8nIGZpbGUKKyAqLworc3RhdGljIGludCBqZmZzX3Byb2NfaW5mb19yZWFkIChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKwkJaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgamZmc19jb250cm9sICpjID0gKHN0cnVjdCBqZmZzX2NvbnRyb2wgKikgZGF0YTsKKwlpbnQgbGVuID0gMDsKKworCS8qIEdldCBpbmZvcm1hdGlvbiBvbiB0aGUgcGFyaXRpb24gKi8KKwlsZW4gKz0gc3ByaW50ZiAocGFnZSwKKwkJInBhcnRpdGlvbiBzaXplOiAgICAgJTA4bFggKCV1KVxuIgorCQkic2VjdG9yIHNpemU6ICAgICAgICAlMDhsWCAoJXUpXG4iCisJCSJ1c2VkIHNpemU6ICAgICAgICAgICUwOGxYICgldSlcbiIKKwkJImRpcnR5IHNpemU6ICAgICAgICAgJTA4bFggKCV1KVxuIgorCQkiZnJlZSBzaXplOiAgICAgICAgICAlMDhsWCAoJXUpXG5cbiIsCisJCSh1bnNpZ25lZCBsb25nKSBjLT5mbWMtPmZsYXNoX3NpemUsIGMtPmZtYy0+Zmxhc2hfc2l6ZSwKKwkJKHVuc2lnbmVkIGxvbmcpIGMtPmZtYy0+c2VjdG9yX3NpemUsIGMtPmZtYy0+c2VjdG9yX3NpemUsCisJCSh1bnNpZ25lZCBsb25nKSBjLT5mbWMtPnVzZWRfc2l6ZSwgYy0+Zm1jLT51c2VkX3NpemUsCisJCSh1bnNpZ25lZCBsb25nKSBjLT5mbWMtPmRpcnR5X3NpemUsIGMtPmZtYy0+ZGlydHlfc2l6ZSwKKwkJKHVuc2lnbmVkIGxvbmcpIChjLT5mbWMtPmZsYXNoX3NpemUgLQorCQkJKGMtPmZtYy0+dXNlZF9zaXplICsgYy0+Zm1jLT5kaXJ0eV9zaXplKSksCisJCWMtPmZtYy0+Zmxhc2hfc2l6ZSAtIChjLT5mbWMtPnVzZWRfc2l6ZSArIGMtPmZtYy0+ZGlydHlfc2l6ZSkpOworCisJLyogV2UncmUgZG9uZSAqLworCSplb2YgPSAxOworCisJLyogUmV0dXJuIGxlbmd0aCAqLworCXJldHVybiBsZW47Cit9CisKKworLyoKKyAqIFJlYWQgYSBKRkZTIHBhcnRpdGlvbidzIGBsYXlvdXQnIGZpbGUKKyAqLworc3RhdGljIGludCBqZmZzX3Byb2NfbGF5b3V0X3JlYWQgKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQlpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBqZmZzX2NvbnRyb2wgKmMgPSAoc3RydWN0IGpmZnNfY29udHJvbCAqKSBkYXRhOworCXN0cnVjdCBqZmZzX2ZtICpmbSA9IE5VTEw7CisJc3RydWN0IGpmZnNfZm0gKmxhc3RfZm0gPSBOVUxMOworCWludCBsZW4gPSAwOworCisJLyogR2V0IHRoZSBmaXJzdCBpdGVtIGluIHRoZSBsaXN0ICovCisgCWZtID0gYy0+Zm1jLT5oZWFkOworCisJLyogUHJpbnQgZnJlZSBzcGFjZSAqLworCWlmIChmbSAmJiBmbS0+b2Zmc2V0KSB7CisJCWxlbiArPSBzcHJpbnRmIChwYWdlLCAiMDAwMDAwMDAgJTA4bFggZnJlZVxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKSBmbS0+b2Zmc2V0KTsKKwl9CisKKwkvKiBMb29wIHRocm91Z2ggYWxsIG9mIHRoZSBmbGFzaCBjb250cm9sIHN0cnVjdHVyZXMgKi8KKwl3aGlsZSAoZm0gJiYgKGxlbiA8IChvZmYgKyBjb3VudCkpKSB7CisJCWlmIChmbS0+bm9kZXMpIHsKKwkJCWxlbiArPSBzcHJpbnRmIChwYWdlICsgbGVuLAorCQkJCSIlMDhsWCAlMDhsWCBpbm89JTA4bFgsIHZlcj0lMDhsWFxuIiwKKwkJCQkodW5zaWduZWQgbG9uZykgZm0tPm9mZnNldCwKKwkJCQkodW5zaWduZWQgbG9uZykgZm0tPnNpemUsCisJCQkJKHVuc2lnbmVkIGxvbmcpIGZtLT5ub2Rlcy0+bm9kZS0+aW5vLAorCQkJCSh1bnNpZ25lZCBsb25nKSBmbS0+bm9kZXMtPm5vZGUtPnZlcnNpb24pOworCQl9CisJCWVsc2UgeworCQkJbGVuICs9IHNwcmludGYgKHBhZ2UgKyBsZW4sCisJCQkJIiUwOGxYICUwOGxYIGRpcnR5XG4iLAorCQkJCSh1bnNpZ25lZCBsb25nKSBmbS0+b2Zmc2V0LAorCQkJCSh1bnNpZ25lZCBsb25nKSBmbS0+c2l6ZSk7CisJCX0KKwkJbGFzdF9mbSA9IGZtOworCQlmbSA9IGZtLT5uZXh0OworCX0KKworCS8qIFByaW50IGZyZWUgc3BhY2UgKi8KKwlpZiAoKGxlbiA8IChvZmYgKyBjb3VudCkpICYmIGxhc3RfZm0KKwkgICAgJiYgKGxhc3RfZm0tPm9mZnNldCA8IGMtPmZtYy0+Zmxhc2hfc2l6ZSkpIHsKKwkJbGVuICs9IHNwcmludGYgKHBhZ2UgKyBsZW4sCisJCQkgICAgICAgIiUwOGxYICUwOGxYIGZyZWVcbiIsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIGxhc3RfZm0tPm9mZnNldCArIAorCQkJCWxhc3RfZm0tPnNpemUsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIChjLT5mbWMtPmZsYXNoX3NpemUgLQorCQkJCQkJICAgIChsYXN0X2ZtLT5vZmZzZXQgKyBsYXN0X2ZtLT5zaXplKSkpOworCX0KKworCS8qIFdlJ3JlIGRvbmUgKi8KKwkqZW9mID0gMTsKKworCS8qIFJldHVybiBsZW5ndGggKi8KKwlyZXR1cm4gbGVuOworfQpkaWZmIC0tZ2l0IGEvZnMvamZmcy9qZmZzX3Byb2MuaCBiL2ZzL2pmZnMvamZmc19wcm9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlhMWM1ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMvamZmc19wcm9jLmgKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIEpGRlMgLS0gSm91cm5hbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgTGludXggaW1wbGVtZW50YXRpb24uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwICBBeGlzIENvbW11bmljYXRpb25zIEFCLgorICoKKyAqIENyZWF0ZWQgYnkgU2ltb24gS2Fnc3Ryb20gPHNpbW9ua0BheGlzLmNvbT4uCisgKgorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogJElkOiBqZmZzX3Byb2MuaCx2IDEuMiAyMDAwLzExLzE1IDIyOjA0OjEyIHNqaGlsbCBFeHAgJAorICovCisKKy8qIGpmZnNfcHJvYy5oIGRlZmluZXMgYSBzdHJ1Y3R1cmUgZm9yIGluY2x1c2lvbiBpbiB0aGUgcHJvYy1maWxlIHN5c3RlbS4gICovCisjaWZuZGVmIF9fTElOVVhfSkZGU19QUk9DX0hfXworI2RlZmluZSBfX0xJTlVYX0pGRlNfUFJPQ19IX18KKworI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKworLyogVGhlIHByb2NfZGlyX2VudHJ5IGZvciBqZmZzIChkZWZpbmVkIGluIGpmZnNfcHJvYy5jKS4gICovCitleHRlcm4gc3RydWN0IHByb2NfZGlyX2VudHJ5ICpqZmZzX3Byb2Nfcm9vdDsKKworaW50IGpmZnNfcmVnaXN0ZXJfamZmc19wcm9jX2RpcihpbnQgbXRkLCBzdHJ1Y3QgamZmc19jb250cm9sICpjKTsKK2ludCBqZmZzX3VucmVnaXN0ZXJfamZmc19wcm9jX2RpcihzdHJ1Y3QgamZmc19jb250cm9sICpjKTsKKworI2VuZGlmIC8qIF9fTElOVVhfSkZGU19QUk9DX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvTElDRU5DRSBiL2ZzL2pmZnMyL0xJQ0VOQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q4MWQ4MwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMyL0xJQ0VOQ0UKQEAgLTAsMCArMSwzNSBAQAorVGhlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IGFuZCBlbHNld2hlcmUgd2hpY2ggcmVmZXIgdG8gdGhpcyBMSUNFTkNFCitmaWxlIGFyZSBwYXJ0IG9mIEpGRlMyLCB0aGUgSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0gdjIuCisKKwlDb3B5cmlnaHQgKEMpIDIwMDEsIDIwMDIgUmVkIEhhdCwgSW5jLgorCitKRkZTMiBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCit0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciAKK3ZlcnNpb24uCisKK0pGRlMyIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCitBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorZm9yIG1vcmUgZGV0YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKK3dpdGggSkZGUzI7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKzU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgorCitBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBpZiBvdGhlciBmaWxlcyBpbnN0YW50aWF0ZSB0ZW1wbGF0ZXMgb3IgdXNlCittYWNyb3Mgb3IgaW5saW5lIGZ1bmN0aW9ucyBmcm9tIHRoZXNlIGZpbGVzLCBvciB5b3UgY29tcGlsZSB0aGVzZQorZmlsZXMgYW5kIGxpbmsgdGhlbSB3aXRoIG90aGVyIHdvcmtzIHRvIHByb2R1Y2UgYSB3b3JrIGJhc2VkIG9uIHRoZXNlCitmaWxlcywgdGhlc2UgZmlsZXMgZG8gbm90IGJ5IHRoZW1zZWx2ZXMgY2F1c2UgdGhlIHJlc3VsdGluZyB3b3JrIHRvIGJlCitjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gSG93ZXZlciB0aGUgc291cmNlIGNvZGUgZm9yCit0aGVzZSBmaWxlcyBtdXN0IHN0aWxsIGJlIG1hZGUgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCBzZWN0aW9uICgzKQorb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorCitUaGlzIGV4Y2VwdGlvbiBkb2VzIG5vdCBpbnZhbGlkYXRlIGFueSBvdGhlciByZWFzb25zIHdoeSBhIHdvcmsgYmFzZWQgb24KK3RoaXMgZmlsZSBtaWdodCBiZSBjb3ZlcmVkIGJ5IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKworRm9yIGluZm9ybWF0aW9uIG9uIG9idGFpbmluZyBhbHRlcm5hdGl2ZSBsaWNlbmNlcyBmb3IgSkZGUzIsIHNlZSAKK2h0dHA6Ly9zb3VyY2VzLnJlZGhhdC5jb20vamZmczIvamZmczItbGljZW5jZS5odG1sCisKKworCSRJZDogTElDRU5DRSx2IDEuMSAyMDAyLzA1LzIwIDE0OjU2OjM3IGR3bXcyIEV4cCAkCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9NYWtlZmlsZSBiL2ZzL2pmZnMyL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYzM4Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZmZzMi9NYWtlZmlsZQpAQCAtMCwwICsxLDE4IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGludXggSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0gdjIgKEpGRlMyKQorIworIyAkSWQ6IE1ha2VmaWxlLmNvbW1vbix2IDEuNyAyMDA0LzExLzAzIDEyOjU3OjM4IGp3Ym95ZXIgRXhwICQKKyMKKworb2JqLSQoQ09ORklHX0pGRlMyX0ZTKSArPSBqZmZzMi5vCisKK2pmZnMyLXkJOj0gY29tcHIubyBkaXIubyBmaWxlLm8gaW9jdGwubyBub2RlbGlzdC5vIG1hbGxvYy5vCitqZmZzMi15CSs9IHJlYWQubyBub2RlbWdtdC5vIHJlYWRpbm9kZS5vIHdyaXRlLm8gc2Nhbi5vIGdjLm8KK2pmZnMyLXkJKz0gc3ltbGluay5vIGJ1aWxkLm8gZXJhc2UubyBiYWNrZ3JvdW5kLm8gZnMubyB3cml0ZXYubworamZmczIteQkrPSBzdXBlci5vCisKK2pmZnMyLSQoQ09ORklHX0pGRlMyX0ZTX05BTkQpCSs9IHdidWYubworamZmczItJChDT05GSUdfSkZGUzJfRlNfTk9SX0VDQykgKz0gd2J1Zi5vCitqZmZzMi0kKENPTkZJR19KRkZTMl9SVUJJTikJKz0gY29tcHJfcnViaW4ubworamZmczItJChDT05GSUdfSkZGUzJfUlRJTUUpCSs9IGNvbXByX3J0aW1lLm8KK2pmZnMyLSQoQ09ORklHX0pGRlMyX1pMSUIpCSs9IGNvbXByX3psaWIubwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvUkVBRE1FLkxvY2tpbmcgYi9mcy9qZmZzMi9SRUFETUUuTG9ja2luZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTc3MWNmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZmczIvUkVBRE1FLkxvY2tpbmcKQEAgLTAsMCArMSwxNDggQEAKKwkkSWQ6IFJFQURNRS5Mb2NraW5nLHYgMS45IDIwMDQvMTEvMjAgMTA6MzU6NDAgZHdtdzIgRXhwICQKKworCUpGRlMyIExPQ0tJTkcgRE9DVU1FTlRBVElPTgorCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBdCBsZWFzdCB0aGVvcmV0aWNhbGx5LCBKRkZTMiBkb2VzIG5vdCByZXF1aXJlIHRoZSBCaWcgS2VybmVsIExvY2sKKyhCS0wpLCB3aGljaCB3YXMgYWx3YXlzIGhlbHBmdWxseSBvYnRhaW5lZCBmb3IgaXQgYnkgTGludXggMi40IFZGUworY29kZS4gSXQgaGFzIGl0cyBvd24gbG9ja2luZywgYXMgZGVzY3JpYmVkIGJlbG93LgorCitUaGlzIGRvY3VtZW50IGF0dGVtcHRzIHRvIGRlc2NyaWJlIHRoZSBleGlzdGluZyBsb2NraW5nIHJ1bGVzIGZvcgorSkZGUzIuIEl0IGlzIG5vdCBleHBlY3RlZCB0byByZW1haW4gcGVyZmVjdGx5IHVwIHRvIGRhdGUsIGJ1dCBvdWdodCB0bworYmUgZmFpcmx5IGNsb3NlLgorCisKKwlhbGxvY19zZW0KKwktLS0tLS0tLS0KKworVGhlIGFsbG9jX3NlbSBpcyBhIHBlci1maWxlc3lzdGVtIHNlbWFwaG9yZSwgdXNlZCBwcmltYXJpbHkgdG8gZW5zdXJlCitjb250aWd1b3VzIGFsbG9jYXRpb24gb2Ygc3BhY2Ugb24gdGhlIG1lZGl1bS4gSXQgaXMgYXV0b21hdGljYWxseQorb2J0YWluZWQgZHVyaW5nIHNwYWNlIGFsbG9jYXRpb25zIChqZmZzMl9yZXNlcnZlX3NwYWNlKCkpIGFuZCBmcmVlZAordXBvbiB3cml0ZSBjb21wbGV0aW9uIChqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbigpKS4gTm90ZSB0aGF0Cit0aGUgZ2FyYmFnZSBjb2xsZWN0b3Igd2lsbCBvYnRhaW4gdGhpcyByaWdodCBhdCB0aGUgYmVnaW5uaW5nIG9mCitqZmZzMl9nYXJiYWdlX2NvbGxlY3RfcGFzcygpIGFuZCByZWxlYXNlIGl0IGF0IHRoZSBlbmQsIHRoZXJlYnkKK3ByZXZlbnRpbmcgYW55IG90aGVyIHdyaXRlIGFjdGl2aXR5IG9uIHRoZSBmaWxlIHN5c3RlbSBkdXJpbmcgYQorZ2FyYmFnZSBjb2xsZWN0IHBhc3MuCisKK1doZW4gd3JpdGluZyBuZXcgbm9kZXMsIHRoZSBhbGxvY19zZW0gbXVzdCBiZSBoZWxkIHVudGlsIHRoZSBuZXcgbm9kZXMKK2hhdmUgYmVlbiBwcm9wZXJseSBsaW5rZWQgaW50byB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGUgaW5vZGUgdG8KK3doaWNoIHRoZXkgYmVsb25nLiBUaGlzIGlzIGZvciB0aGUgYmVuZWZpdCBvZiBOQU5EIGZsYXNoIC0gYWRkaW5nIG5ldworbm9kZXMgdG8gYW4gaW5vZGUgbWF5IG9ic29sZXRlIG9sZCBvbmVzLCBhbmQgYnkgaG9sZGluZyB0aGUgYWxsb2Nfc2VtCit1bnRpbCB0aGlzIGhhcHBlbnMgd2UgZW5zdXJlIHRoYXQgYW55IGRhdGEgaW4gdGhlIHdyaXRlLWJ1ZmZlciBhdCB0aGUKK3RpbWUgdGhpcyBoYXBwZW5zIGFyZSBwYXJ0IG9mIHRoZSBuZXcgbm9kZSwgbm90IGp1c3Qgc29tZXRoaW5nIHRoYXQKK3dhcyB3cml0dGVuIGFmdGVyd2FyZHMuIEhlbmNlLCB3ZSBjYW4gZW5zdXJlIHRoZSBuZXdseS1vYnNvbGV0ZWQgbm9kZXMKK2Rvbid0IGFjdHVhbGx5IGdldCBlcmFzZWQgdW50aWwgdGhlIHdyaXRlLWJ1ZmZlciBoYXMgYmVlbiBmbHVzaGVkIHRvCit0aGUgbWVkaXVtLgorCitXaXRoIHRoZSBpbnRyb2R1Y3Rpb24gb2YgTkFORCBmbGFzaCBzdXBwb3J0IGFuZCB0aGUgd3JpdGUtYnVmZmVyLCAKK3RoZSBhbGxvY19zZW0gaXMgYWxzbyB1c2VkIHRvIHByb3RlY3QgdGhlIHdidWYtcmVsYXRlZCBtZW1iZXJzIG9mIHRoZQoramZmczJfc2JfaW5mbyBzdHJ1Y3R1cmUuIEF0b21pY2FsbHkgcmVhZGluZyB0aGUgd2J1Zl9sZW4gbWVtYmVyIHRvIHNlZQoraWYgdGhlIHdidWYgaXMgY3VycmVudGx5IGhvbGRpbmcgYW55IGRhdGEgaXMgcGVybWl0dGVkLCB0aG91Z2guCisKK09yZGVyaW5nIGNvbnN0cmFpbnRzOiBTZWUgZi0+c2VtLgorCisKKwlGaWxlIFNlbWFwaG9yZSBmLT5zZW0KKwktLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBpcyB0aGUgSkZGUzItaW50ZXJuYWwgZXF1aXZhbGVudCBvZiB0aGUgaW5vZGUgc2VtYXBob3JlIGktPmlfc2VtLgorSXQgcHJvdGVjdHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBqZmZzMl9pbm9kZV9pbmZvIHByaXZhdGUgaW5vZGUgZGF0YSwKK2luY2x1ZGluZyB0aGUgbGlua2VkIGxpc3Qgb2Ygbm9kZSBmcmFnbWVudHMgKGJ1dCBzZWUgdGhlIG5vdGVzIGJlbG93IG9uCitlcmFzZV9jb21wbGV0aW9uX2xvY2spLCBldGMuCisKK1RoZSByZWFzb24gdGhhdCB0aGUgaV9zZW0gaXRzZWxmIGlzbid0IHVzZWQgZm9yIHRoaXMgcHVycG9zZSBpcyB0bworYXZvaWQgZGVhZGxvY2tzIHdpdGggZ2FyYmFnZSBjb2xsZWN0aW9uIC0tIHRoZSBWRlMgd2lsbCBsb2NrIHRoZSBpX3NlbQorYmVmb3JlIGNhbGxpbmcgYSBmdW5jdGlvbiB3aGljaCBtYXkgbmVlZCB0byBhbGxvY2F0ZSBzcGFjZS4gVGhlCithbGxvY2F0aW9uIG1heSB0cmlnZ2VyIGdhcmJhZ2UtY29sbGVjdGlvbiwgd2hpY2ggbWF5IG5lZWQgdG8gbW92ZSBhCitub2RlIGJlbG9uZ2luZyB0byB0aGUgaW5vZGUgd2hpY2ggd2FzIGxvY2tlZCBpbiB0aGUgZmlyc3QgcGxhY2UgYnkgdGhlCitWRlMuIElmIHRoZSBnYXJiYWdlIGNvbGxlY3Rpb24gY29kZSB3ZXJlIHRvIGF0dGVtcHQgdG8gbG9jayB0aGUgaV9zZW0KK29mIHRoZSBpbm9kZSBmcm9tIHdoaWNoIGl0J3MgZ2FyYmFnZS1jb2xsZWN0aW5nIGEgcGh5c2ljYWwgbm9kZSwgdGhpcworbGVhZCB0byBkZWFkbG9jaywgdW5sZXNzIHdlIHBsYXllZCBnYW1lcyB3aXRoIHVubG9ja2luZyB0aGUgaV9zZW0KK2JlZm9yZSBjYWxsaW5nIHRoZSBzcGFjZSBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4KKworSW5zdGVhZCBvZiBwbGF5aW5nIHN1Y2ggZ2FtZXMsIHdlIGp1c3QgaGF2ZSBhbiBleHRyYSBpbnRlcm5hbAorc2VtYXBob3JlLCB3aGljaCBpcyBvYnRhaW5lZCBieSB0aGUgZ2FyYmFnZSBjb2xsZWN0aW9uIGNvZGUgYW5kIGFsc28KK2J5IHRoZSBub3JtYWwgZmlsZSBzeXN0ZW0gY29kZSBfYWZ0ZXJfIGFsbG9jYXRpb24gb2Ygc3BhY2UuCisKK09yZGVyaW5nIGNvbnN0cmFpbnRzOiAKKworCTEuIE5ldmVyIGF0dGVtcHQgdG8gYWxsb2NhdGUgc3BhY2Ugb3IgbG9jayBhbGxvY19zZW0gd2l0aCAKKwkgICBhbnkgZi0+c2VtIGhlbGQuCisJMi4gTmV2ZXIgYXR0ZW1wdCB0byBsb2NrIHR3byBmaWxlIHNlbWFwaG9yZXMgaW4gb25lIHRocmVhZC4KKwkgICBObyBvcmRlcmluZyBydWxlcyBoYXZlIGJlZW4gbWFkZSBmb3IgZG9pbmcgc28uCisKKworCWVyYXNlX2NvbXBsZXRpb25fbG9jayBzcGlubG9jaworCS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIGlzIHVzZWQgdG8gc2VyaWFsaXNlIGFjY2VzcyB0byB0aGUgZXJhc2VibG9jayBsaXN0cywgdG8gdGhlCitwZXItZXJhc2VibG9jayBsaXN0cyBvZiBwaHlzaWNhbCBqZmZzMl9yYXdfbm9kZV9yZWYgc3RydWN0dXJlcywgYW5kCisoTkIpIHRoZSBwZXItaW5vZGUgbGlzdCBvZiBwaHlzaWNhbCBub2Rlcy4gVGhlIGxhdHRlciBpcyBhIHNwZWNpYWwKK2Nhc2UgLSBzZWUgYmVsb3cuCisKK0FzIHRoZSBNVEQgQVBJIG5vIGxvbmdlciBwZXJtaXRzIGVyYXNlLWNvbXBsZXRpb24gY2FsbGJhY2sgZnVuY3Rpb25zCit0byBiZSBjYWxsZWQgZnJvbSBib3R0b20taGFsZiAodGltZXIpIGNvbnRleHQgKG9uIHRoZSBiYXNpcyB0aGF0IG5vYm9keQorZXZlciBhY3R1YWxseSBpbXBsZW1lbnRlZCBzdWNoIGEgdGhpbmcpLCBpdCdzIG5vdyBzdWZmaWNpZW50IHRvIHVzZQorYSBzaW1wbGUgc3Bpbl9sb2NrKCkgcmF0aGVyIHRoYW4gc3Bpbl9sb2NrX2JoKCkuCisKK05vdGUgdGhhdCB0aGUgcGVyLWlub2RlIGxpc3Qgb2YgcGh5c2ljYWwgbm9kZXMgKGYtPm5vZGVzKSBpcyBhIHNwZWNpYWwKK2Nhc2UuIEFueSBjaGFuZ2VzIHRvIF92YWxpZF8gbm9kZXMgKGkuZS4gLT5mbGFzaF9vZmZzZXQgJiAxID09IDApIGluCit0aGUgbGlzdCBhcmUgcHJvdGVjdGVkIGJ5IHRoZSBmaWxlIHNlbWFwaG9yZSBmLT5zZW0uIEJ1dCB0aGUgZXJhc2UKK2NvZGUgbWF5IHJlbW92ZSBfb2Jzb2xldGVfIG5vZGVzIGZyb20gdGhlIGxpc3Qgd2hpbGUgaG9sZGluZyBvbmx5IHRoZQorZXJhc2VfY29tcGxldGlvbl9sb2NrLiBTbyB5b3UgY2FuIHdhbGsgdGhlIGxpc3Qgb25seSB3aGlsZSBob2xkaW5nIHRoZQorZXJhc2VfY29tcGxldGlvbl9sb2NrLCBhbmQgY2FuIGRyb3AgdGhlIGxvY2sgdGVtcG9yYXJpbHkgbWlkLXdhbGsgYXMKK2xvbmcgYXMgdGhlIHBvaW50ZXIgeW91J3JlIGhvbGRpbmcgaXMgdG8gYSBfdmFsaWRfIG5vZGUsIG5vdCBhbgorb2Jzb2xldGUgb25lLgorCitUaGUgZXJhc2VfY29tcGxldGlvbl9sb2NrIGlzIGFsc28gdXNlZCB0byBwcm90ZWN0IHRoZSBjLT5nY190YXNrCitwb2ludGVyIHdoZW4gdGhlIGdhcmJhZ2UgY29sbGVjdGlvbiB0aHJlYWQgZXhpdHMuIFRoZSBjb2RlIHRvIGtpbGwgdGhlCitHQyB0aHJlYWQgbG9ja3MgaXQsIHNlbmRzIHRoZSBzaWduYWwsIHRoZW4gdW5sb2NrcyBpdCAtIHdoaWxlIHRoZSBHQwordGhyZWFkIGl0c2VsZiBsb2NrcyBpdCwgemVyb2VzIGMtPmdjX3Rhc2ssIHRoZW4gdW5sb2NrcyBvbiB0aGUgZXhpdCBwYXRoLgorCisKKwlpbm9jYWNoZV9sb2NrIHNwaW5sb2NrCisJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIHNwaW5sb2NrIHByb3RlY3RzIHRoZSBoYXNoZWQgbGlzdCAoYy0+aW5vY2FjaGVfbGlzdCkgb2YgdGhlCitpbi1jb3JlIGpmZnMyX2lub2RlX2NhY2hlIG9iamVjdHMgKGVhY2ggaW5vZGUgaW4gSkZGUzIgaGFzIHRoZQorY29ycmVzcG9uZGVudCBqZmZzMl9pbm9kZV9jYWNoZSBvYmplY3QpLiBTbywgdGhlIGlub2NhY2hlX2xvY2sKK2hhcyB0byBiZSBsb2NrZWQgd2hpbGUgd2Fsa2luZyB0aGUgYy0+aW5vY2FjaGVfbGlzdCBoYXNoIGJ1Y2tldHMuCisKK05vdGUsIHRoZSBmLT5zZW0gZ3VhcmFudGVlcyB0aGF0IHRoZSBjb3JyZXNwb25kZW50IGpmZnMyX2lub2RlX2NhY2hlCit3aWxsIG5vdCBiZSByZW1vdmVkLiBTbywgaXQgaXMgYWxsb3dlZCB0byBhY2Nlc3MgaXQgd2l0aG91dCBsb2NraW5nCit0aGUgaW5vY2FjaGVfbG9jayBzcGlubG9jay4gCisKK09yZGVyaW5nIGNvbnN0cmFpbnRzOiAKKworCUlmIGJvdGggZXJhc2VfY29tcGxldGlvbl9sb2NrIGFuZCBpbm9jYWNoZV9sb2NrIGFyZSBuZWVkZWQsIHRoZQorCWMtPmVyYXNlX2NvbXBsZXRpb24gaGFzIHRvIGJlIGFjcXVpcmVkIGZpcnN0LgorCisKKwllcmFzZV9mcmVlX3NlbQorCS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgc2VtYXBob3JlIGlzIG9ubHkgdXNlZCBieSB0aGUgZXJhc2UgY29kZSB3aGljaCBmcmVlcyBvYnNvbGV0ZQorbm9kZSByZWZlcmVuY2VzIGFuZCB0aGUgamZmczJfZ2FyYmFnZV9jb2xsZWN0X2RlbGV0aW9uX2RpcmVudCgpCitmdW5jdGlvbi4gVGhlIGxhdHRlciBmdW5jdGlvbiBvbiBOQU5EIGZsYXNoIG11c3QgcmVhZCBfb2Jzb2xldGVfIG5vZGVzCit0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgJ2RlbGV0aW9uIGRpcmVudCcgdW5kZXIgY29uc2lkZXJhdGlvbiBjYW4gYmUKK2Rpc2NhcmRlZCBvciB3aGV0aGVyIGl0IGlzIHN0aWxsIHJlcXVpcmVkIHRvIHNob3cgdGhhdCBhbiBpbm9kZSBoYXMKK2JlZW4gdW5saW5rZWQuIEJlY2F1c2UgcmVhZGluZyBmcm9tIHRoZSBmbGFzaCBtYXkgc2xlZXAsIHRoZQorZXJhc2VfY29tcGxldGlvbl9sb2NrIGNhbm5vdCBiZSBoZWxkLCBzbyBhbiBhbHRlcm5hdGl2ZSwgbW9yZQoraGVhdnl3ZWlnaHQgbG9jayB3YXMgcmVxdWlyZWQgdG8gcHJldmVudCB0aGUgZXJhc2UgY29kZSBmcm9tIGZyZWVpbmcKK3RoZSBqZmZzMl9yYXdfbm9kZV9yZWYgc3RydWN0dXJlcyBpbiBxdWVzdGlvbiB3aGlsZSB0aGUgZ2FyYmFnZQorY29sbGVjdGlvbiBjb2RlIGlzIGxvb2tpbmcgYXQgdGhlbS4KKworU3VnZ2VzdGlvbnMgZm9yIGFsdGVybmF0aXZlIHNvbHV0aW9ucyB0byB0aGlzIHByb2JsZW0gd291bGQgYmUgd2VsY29tZWQuCisKKworCXdidWZfc2VtCisJLS0tLS0tLS0KKworVGhpcyByZWFkL3dyaXRlIHNlbWFwaG9yZSBwcm90ZWN0cyBhZ2FpbnN0IGNvbmN1cnJlbnQgYWNjZXNzIHRvIHRoZQord3JpdGUtYmVoaW5kIGJ1ZmZlciAoJ3didWYnKSB1c2VkIGZvciBmbGFzaCBjaGlwcyB3aGVyZSB3ZSBtdXN0IHdyaXRlCitpbiBibG9ja3MuIEl0IHByb3RlY3RzIGJvdGggdGhlIGNvbnRlbnRzIG9mIHRoZSB3YnVmIGFuZCB0aGUgbWV0YWRhdGEKK3doaWNoIGluZGljYXRlcyB3aGljaCBmbGFzaCByZWdpb24gKGlmIGFueSkgaXMgY3VycmVudGx5IGNvdmVyZWQgYnkgCit0aGUgYnVmZmVyLgorCitPcmRlcmluZyBjb25zdHJhaW50czoKKwlMb2NrIHdidWZfc2VtIGxhc3QsIGFmdGVyIHRoZSBhbGxvY19zZW0gb3IgYW5kIGYtPnNlbS4KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL1RPRE8gYi9mcy9qZmZzMi9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZmY4MmYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZmZzMi9UT0RPCkBAIC0wLDAgKzEsNDAgQEAKKyRJZDogVE9ETyx2IDEuMTAgMjAwMi8wOS8wOSAxNjozMToyMSBkd213MiBFeHAgJAorCisgLSBkaXNhYmxlIGNvbXByZXNzaW9uIGluIGNvbW1pdF93cml0ZSgpPworIC0gZmluZS10dW5lIHRoZSBhbGxvY2F0aW9uIC8gR0MgdGhyZXNob2xkcworIC0gY2hhdHRyIHN1cHBvcnQgLSB0dXJuaW5nIG9uL29mZiBhbmQgdHVuaW5nIGNvbXByZXNzaW9uIHBlci1pbm9kZQorIC0gY2hlY2twb2ludGluZyAoZG8gd2UgbmVlZCB0aGlzPyBzY2FuIGlzIHF1aXRlIGZhc3QpCisgLSBtYWtlIHRoZSBzY2FuIGNvZGUgcG9wdWxhdGUgcmVhbCBpbm9kZXMgc28gcmVhZF9pbm9kZSBqdXN0IGFmdGVyIAorCW1vdW50IGRvZXNuJ3QgaGF2ZSB0byByZWFkIHRoZSBmbGFzaCB0d2ljZSBmb3IgbGFyZ2UgZmlsZXMuCisJTWFrZSB0aGlzIGEgcGVyLWlub2RlIG9wdGlvbiwgY2hhbmdhYmxlIHdpdGggY2hhdHRyLCBzbyB5b3UgY2FuCisJZGVjaWRlIHdoaWNoIGlub2RlcyBzaG91bGQgYmUgaW4tY29yZSBpbW1lZGlhdGVseSBhZnRlciBtb3VudC4KKyAtIHRlc3QsIHRlc3QsIHRlc3QKKworIC0gTkFORCBmbGFzaCBzdXBwb3J0OgorCS0gZmx1c2hfd2J1ZiB1c2luZyBHQyB0byBmaWxsIGl0LCBkb24ndCBqdXN0IHBhZC4KKwktIERlYWwgd2l0aCB3cml0ZSBlcnJvcnMuIERhdGEgZG9uJ3QgZ2V0IGxvc3QgLSB3ZSBqdXN0IGhhdmUgdG8gd3JpdGUgCisJICB0aGUgYWZmZWN0ZWQgbm9kZShzKSBvdXQgYWdhaW4gc29tZXdoZXJlIGVsc2UuCisJLSBtYWtlIGZzeW5jIGZsdXNoIG9ubHkgaWYgYWN0dWFsbHkgcmVxdWlyZWQKKwktIG1ha2Ugc3lzX3N5bmMoKSB3b3JrLgorCS0gcmVib290IG5vdGlmaWVyCisJLSB0aW1lZCBmbHVzaCBvZiBvbGQgd2J1ZgorCS0gZml4IG1hZ2ljYWwgc2Vjb25kIGFyZyBvZiBqZmZzMl9mbHVzaF93YnVmKCkuIFNwbGl0IGludG8gdHdvIG9yIG1vcmUgZnVuY3Rpb25zIGluc3RlYWQuCisKKworIC0gT3B0aW1pc2F0aW9uczoKKyAgIC0gU3RvcCBHQyBmcm9tIGRlY29tcHJlc3NpbmcgYW5kIGltbWVkaWF0ZWx5IHJlY29tcHJlc3Npbmcgbm9kZXMgd2hpY2ggY291bGQKKyAgICAganVzdCBiZSBjb3BpZWQgaW50YWN0LiAoV2Ugbm93IGtlZXAgdHJhY2sgb2YgUkVGX1BSSVNUSU5FIGZsYWcuIEVhc3kgbm93LikKKyAgIC0gRnVydGhlcm1vcmUsIGluIHRoZSBjYXNlIHdoZXJlIGl0IGNvdWxkIGJlIGNvcGllZCBpbnRhY3Qgd2UgZG9uJ3QgZXZlbiBuZWVkCisgICAgIHRvIGNhbGwgaWdldCgpIGZvciBpdCAtLSBpZiB3ZSB1c2UgKHJhd19ub2RlX3Jhdy0+Zmxhc2hfb2Zmc2V0ICYgMikgYXMgYSBmbGFnCisgICAgIHRvIHNob3cgYSBub2RlIGNhbiBiZSBjb3BpZWQgaW50YWN0IGFuZCBpdCdzIF9ub3RfIGluIGljYWNoZSwgd2UgY291bGQganVzdCBkbworICAgICBpdCwgZml4IHVwIHRoZSBuZXh0X2luX2lubyBsaXN0IGFuZCBtb3ZlIG9uLiBXZSB3b3VsZCBuZWVkIGEgd2F5IHRvIGZpbmQgb3V0CisgICAgIF93aGV0aGVyXyBpdCdzIGluIGljYWNoZSB0aG91Z2ggLS0gaWYgaXQncyBpbiBpY2FjaGUgd2UgYWxzbyBuZWVkIHRvIGRvIHRoZSAKKyAgICAgZnJhZ21lbnQgbGlzdHMsIGV0Yy4gUCdyYXBzIGEgZmxhZyBvciBwb2ludGVyIGluIHRoZSBqZmZzMl9pbm9kZV9jYWNoZSBjb3VsZAorICAgICBoZWxwLiAoV2UgaGF2ZSBoYWxmIG9mIHRoaXMgbm93LikKKyAgIC0gU3RvcCBrZWVwaW5nIG5hbWUgaW4tY29yZSB3aXRoIHN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudC4gSWYgd2Uga2VlcCB0aGUgaGFzaCBpbiAKKyAgICAgdGhlIGZ1bGwgZGlyZW50LCB3ZSBvbmx5IG5lZWQgdG8gZ28gdG8gdGhlIGZsYXNoIGluIGxvb2t1cCgpIHdoZW4gd2UgdGhpbmsgd2UndmUKKyAgICAgZ290IGEgbWF0Y2gsIGFuZCBpbiByZWFkZGlyKCkuIAorICAgLSBEb3VibHktbGlua2VkIG5leHRfaW5faW5vIGxpc3QgdG8gYWxsb3cgdXMgdG8gZnJlZSBvYnNvbGV0ZWQgcmF3X25vZGVfcmVmcyBpbW1lZGlhdGVseT8KKyAgIC0gUmVtb3ZlIHRvdGxlbiBmcm9tIGpmZnMyX3Jhd19ub2RlX3JlZj8gTmVlZCB0byBoYXZlIHRvdGxlbiBwYXNzZWQgaW50bworCWpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZSgpLiBDYW4gYWxsIGNhbGxlcnMgd29yayBpdCBvdXQ/CisgICAtIFJlbW92ZSBzaXplIGZyb20gamZmczJfcmF3X25vZGVfZnJhZy4gCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9iYWNrZ3JvdW5kLmMgYi9mcy9qZmZzMi9iYWNrZ3JvdW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJlNmRlMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMyL2JhY2tncm91bmQuYwpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIEpGRlMyIC0tIEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBWZXJzaW9uIDIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIENyZWF0ZWQgYnkgRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPgorICoKKyAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCisgKgorICogJElkOiBiYWNrZ3JvdW5kLmMsdiAxLjUwIDIwMDQvMTEvMTYgMjA6MzY6MTAgZHdtdzIgRXhwICQKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2pmZnMyLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlICJub2RlbGlzdC5oIgorCisKK3N0YXRpYyBpbnQgamZmczJfZ2FyYmFnZV9jb2xsZWN0X3RocmVhZCh2b2lkICopOworCit2b2lkIGpmZnMyX2dhcmJhZ2VfY29sbGVjdF90cmlnZ2VyKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKQoreworCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKyAgICAgICAgaWYgKGMtPmdjX3Rhc2sgJiYgamZmczJfdGhyZWFkX3Nob3VsZF93YWtlKGMpKQorICAgICAgICAgICAgICAgIHNlbmRfc2lnKFNJR0hVUCwgYy0+Z2NfdGFzaywgMSk7CisJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7Cit9CisKKy8qIFRoaXMgbXVzdCBvbmx5IGV2ZXIgYmUgY2FsbGVkIHdoZW4gbm8gR0MgdGhyZWFkIGlzIGN1cnJlbnRseSBydW5uaW5nICovCitpbnQgamZmczJfc3RhcnRfZ2FyYmFnZV9jb2xsZWN0X3RocmVhZChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYykKK3sKKwlwaWRfdCBwaWQ7CisJaW50IHJldCA9IDA7CisKKwlpZiAoYy0+Z2NfdGFzaykKKwkJQlVHKCk7CisKKwlpbml0X01VVEVYX0xPQ0tFRCgmYy0+Z2NfdGhyZWFkX3N0YXJ0KTsKKwlpbml0X2NvbXBsZXRpb24oJmMtPmdjX3RocmVhZF9leGl0KTsKKworCXBpZCA9IGtlcm5lbF90aHJlYWQoamZmczJfZ2FyYmFnZV9jb2xsZWN0X3RocmVhZCwgYywgQ0xPTkVfRlN8Q0xPTkVfRklMRVMpOworCWlmIChwaWQgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImZvcmsgZmFpbGVkIGZvciBKRkZTMiBnYXJiYWdlIGNvbGxlY3QgdGhyZWFkOiAlZFxuIiwgLXBpZCk7CisJCWNvbXBsZXRlKCZjLT5nY190aHJlYWRfZXhpdCk7CisJCXJldCA9IHBpZDsKKwl9IGVsc2UgeworCQkvKiBXYWl0IGZvciBpdC4uLiAqLworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiSkZGUzI6IEdhcmJhZ2UgY29sbGVjdCB0aHJlYWQgaXMgcGlkICVkXG4iLCBwaWQpKTsKKwkJZG93bigmYy0+Z2NfdGhyZWFkX3N0YXJ0KTsKKwl9CisgCisJcmV0dXJuIHJldDsKK30KKwordm9pZCBqZmZzMl9zdG9wX2dhcmJhZ2VfY29sbGVjdF90aHJlYWQoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpCit7CisJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCWlmIChjLT5nY190YXNrKSB7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMjogS2lsbGluZyBHQyB0YXNrICVkXG4iLCBjLT5nY190YXNrLT5waWQpKTsKKwkJc2VuZF9zaWcoU0lHS0lMTCwgYy0+Z2NfdGFzaywgMSk7CisJfQorCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmMtPmdjX3RocmVhZF9leGl0KTsKK30KKworc3RhdGljIGludCBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfdGhyZWFkKHZvaWQgKl9jKQoreworCXN0cnVjdCBqZmZzMl9zYl9pbmZvICpjID0gX2M7CisKKwlkYWVtb25pemUoImpmZnMyX2djZF9tdGQlZCIsIGMtPm10ZC0+aW5kZXgpOworCWFsbG93X3NpZ25hbChTSUdLSUxMKTsKKwlhbGxvd19zaWduYWwoU0lHU1RPUCk7CisJYWxsb3dfc2lnbmFsKFNJR0NPTlQpOworCisJYy0+Z2NfdGFzayA9IGN1cnJlbnQ7CisJdXAoJmMtPmdjX3RocmVhZF9zdGFydCk7CisKKwlzZXRfdXNlcl9uaWNlKGN1cnJlbnQsIDEwKTsKKworCWZvciAoOzspIHsKKwkJYWxsb3dfc2lnbmFsKFNJR0hVUCk7CisKKwkJaWYgKCFqZmZzMl90aHJlYWRfc2hvdWxkX3dha2UoYykpIHsKKwkJCXNldF9jdXJyZW50X3N0YXRlIChUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2dhcmJhZ2VfY29sbGVjdF90aHJlYWQgc2xlZXBpbmcuLi5cbiIpKTsKKwkJCS8qIFllcywgdGhlcmUncyBhIHJhY2UgaGVyZTsgd2UgY2hlY2tlZCBqZmZzMl90aHJlYWRfc2hvdWxkX3dha2UoKQorCQkJICAgYmVmb3JlIHNldHRpbmcgY3VycmVudC0+c3RhdGUgdG8gVEFTS19JTlRFUlJVUFRJQkxFLiBCdXQgaXQgZG9lc24ndAorCQkJICAgbWF0dGVyIC0gV2UgZG9uJ3QgY2FyZSBpZiB3ZSBtaXNzIGEgd2FrZXVwLCBiZWNhdXNlIHRoZSBHQyB0aHJlYWQKKwkJCSAgIGlzIG9ubHkgYW4gb3B0aW1pc2F0aW9uIGFueXdheS4gKi8KKwkJCXNjaGVkdWxlKCk7CisJCX0KKworCQlpZiAodHJ5X3RvX2ZyZWV6ZSgwKSkKKwkJCWNvbnRpbnVlOworCisJCWNvbmRfcmVzY2hlZCgpOworCisJCS8qIFB1dF9zdXBlciB3aWxsIHNlbmQgYSBTSUdLSUxMIGFuZCB0aGVuIHdhaXQgb24gdGhlIHNlbS4gCisJCSAqLworCQl3aGlsZSAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXNpZ2luZm9fdCBpbmZvOworCQkJdW5zaWduZWQgbG9uZyBzaWducjsKKworCQkJc2lnbnIgPSBkZXF1ZXVlX3NpZ25hbF9sb2NrKGN1cnJlbnQsICZjdXJyZW50LT5ibG9ja2VkLCAmaW5mbyk7CisKKwkJCXN3aXRjaChzaWducikgeworCQkJY2FzZSBTSUdTVE9QOgorCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9nYXJiYWdlX2NvbGxlY3RfdGhyZWFkKCk6IFNJR1NUT1AgcmVjZWl2ZWQuXG4iKSk7CisJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19TVE9QUEVEKTsKKwkJCQlzY2hlZHVsZSgpOworCQkJCWJyZWFrOworCisJCQljYXNlIFNJR0tJTEw6CisJCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2dhcmJhZ2VfY29sbGVjdF90aHJlYWQoKTogU0lHS0lMTCByZWNlaXZlZC5cbiIpKTsKKwkJCQlnb3RvIGRpZTsKKworCQkJY2FzZSBTSUdIVVA6CisJCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2dhcmJhZ2VfY29sbGVjdF90aHJlYWQoKTogU0lHSFVQIHJlY2VpdmVkLlxuIikpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZ2FyYmFnZV9jb2xsZWN0X3RocmVhZCgpOiBzaWduYWwgJWxkIHJlY2VpdmVkXG4iLCBzaWducikpOworCQkJfQorCQl9CisJCS8qIFdlIGRvbid0IHdhbnQgU0lHSFVQIHRvIGludGVycnVwdCB1cy4gU1RPUCBhbmQgS0lMTCBhcmUgT0sgdGhvdWdoLiAqLworCQlkaXNhbGxvd19zaWduYWwoU0lHSFVQKTsKKworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZ2FyYmFnZV9jb2xsZWN0X3RocmVhZCgpOiBwYXNzXG4iKSk7CisJCWlmIChqZmZzMl9nYXJiYWdlX2NvbGxlY3RfcGFzcyhjKSA9PSAtRU5PU1BDKSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIk5vIHNwYWNlIGZvciBnYXJiYWdlIGNvbGxlY3Rpb24uIEFib3J0aW5nIEdDIHRocmVhZFxuIik7CisJCQlnb3RvIGRpZTsKKwkJfQorCX0KKyBkaWU6CisJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCWMtPmdjX3Rhc2sgPSBOVUxMOworCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCWNvbXBsZXRlX2FuZF9leGl0KCZjLT5nY190aHJlYWRfZXhpdCwgMCk7Cit9CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9idWlsZC5jIGIvZnMvamZmczIvYnVpbGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDFkZDVmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZmczIvYnVpbGQuYwpAQCAtMCwwICsxLDM3MSBAQAorLyoKKyAqIEpGRlMyIC0tIEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBWZXJzaW9uIDIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIENyZWF0ZWQgYnkgRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPgorICoKKyAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCisgKgorICogJElkOiBidWlsZC5jLHYgMS42OSAyMDA0LzEyLzE2IDIwOjIyOjE4IGRtYXJsaW4gRXhwICQKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSAibm9kZWxpc3QuaCIKKworc3RhdGljIHZvaWQgamZmczJfYnVpbGRfcmVtb3ZlX3VubGlua2VkX2lub2RlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICosIHN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqLCBzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKiopOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqCitmaXJzdF9pbm9kZV9jaGFpbihpbnQgKmksIHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKQoreworCWZvciAoOyAqaSA8IElOT0NBQ0hFX0hBU0hTSVpFOyAoKmkpKyspIHsKKwkJaWYgKGMtPmlub2NhY2hlX2xpc3RbKmldKQorCQkJcmV0dXJuIGMtPmlub2NhY2hlX2xpc3RbKmldOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgamZmczJfaW5vZGVfY2FjaGUgKgorbmV4dF9pbm9kZShpbnQgKmksIHN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqaWMsIHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKQoreworCS8qIE1vcmUgaW4gdGhpcyBjaGFpbj8gKi8KKwlpZiAoaWMtPm5leHQpCisJCXJldHVybiBpYy0+bmV4dDsKKwkoKmkpKys7CisJcmV0dXJuIGZpcnN0X2lub2RlX2NoYWluKGksIGMpOworfQorCisjZGVmaW5lIGZvcl9lYWNoX2lub2RlKGksIGMsIGljKQkJCVwKKwlmb3IgKGkgPSAwLCBpYyA9IGZpcnN0X2lub2RlX2NoYWluKCZpLCAoYykpOwlcCisJICAgICBpYzsJCQkJCVwKKwkgICAgIGljID0gbmV4dF9pbm9kZSgmaSwgaWMsIChjKSkpCisKKworc3RhdGljIGlubGluZSB2b2lkIGpmZnMyX2J1aWxkX2lub2RlX3Bhc3MxKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfY2FjaGUgKmljKQoreworCXN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqZmQ7CisKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfYnVpbGRfaW5vZGUgYnVpbGRpbmcgZGlyZWN0b3J5IGlub2RlICMldVxuIiwgaWMtPmlubykpOworCisJLyogRm9yIGVhY2ggY2hpbGQsIGluY3JlYXNlIG5saW5rICovCisJZm9yKGZkID0gaWMtPnNjYW5fZGVudHM7IGZkOyBmZCA9IGZkLT5uZXh0KSB7CisJCXN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqY2hpbGRfaWM7CisJCWlmICghZmQtPmlubykKKwkJCWNvbnRpbnVlOworCisJCS8qIFhYWDogQ2FuIGdldCBoaWdoIGxhdGVuY3kgaGVyZSB3aXRoIGh1Z2UgZGlyZWN0b3JpZXMgKi8KKworCQljaGlsZF9pYyA9IGpmZnMyX2dldF9pbm9fY2FjaGUoYywgZmQtPmlubyk7CisJCWlmICghY2hpbGRfaWMpIHsKKwkJCXByaW50ayhLRVJOX05PVElDRSAiRWVwLiBDaGlsZCBcIiVzXCIgKGlubyAjJXUpIG9mIGRpciBpbm8gIyV1IGRvZXNuJ3QgZXhpc3QhXG4iLAorCQkJCSAgZmQtPm5hbWUsIGZkLT5pbm8sIGljLT5pbm8pOworCQkJamZmczJfbWFya19ub2RlX29ic29sZXRlKGMsIGZkLT5yYXcpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoY2hpbGRfaWMtPm5saW5rKysgJiYgZmQtPnR5cGUgPT0gRFRfRElSKSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIkNoaWxkIGRpciBcIiVzXCIgKGlubyAjJXUpIG9mIGRpciBpbm8gIyV1IGFwcGVhcnMgdG8gYmUgYSBoYXJkIGxpbmtcbiIsIGZkLT5uYW1lLCBmZC0+aW5vLCBpYy0+aW5vKTsKKwkJCWlmIChmZC0+aW5vID09IDEgJiYgaWMtPmlubyA9PSAxKSB7CisJCQkJcHJpbnRrKEtFUk5fTk9USUNFICJUaGlzIGlzIG1vc3RseSBoYXJtbGVzcywgYW5kIHByb2JhYmx5IGNhdXNlZCBieSBjcmVhdGluZyBhIEpGRlMyIGltYWdlXG4iKTsKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgInVzaW5nIGEgYnVnZ3kgdmVyc2lvbiBvZiBta2ZzLmpmZnMyLiBVc2UgYXQgbGVhc3QgdjEuMTcuXG4iKTsKKwkJCX0KKwkJCS8qIFdoYXQgZG8gd2UgZG8gYWJvdXQgaXQ/ICovCisJCX0KKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkluY3JlYXNlZCBubGluayBmb3IgY2hpbGQgXCIlc1wiIChpbm8gIyV1KVxuIiwgZmQtPm5hbWUsIGZkLT5pbm8pKTsKKwkJLyogQ2FuJ3QgZnJlZSB0aGVtLiBXZSBtaWdodCBuZWVkIHRoZW0gaW4gcGFzcyAyICovCisJfQorfQorCisvKiBTY2FuIHBsYW46CisgLSBTY2FuIHBoeXNpY2FsIG5vZGVzLiBCdWlsZCBtYXAgb2YgaW5vZGVzL2RpcmVudHMuIEFsbG9jYXRlIGlub2NhY2hlcyBhcyB3ZSBnbworIC0gU2NhbiBkaXJlY3RvcnkgdHJlZSBmcm9tIHRvcCBkb3duLCBzZXR0aW5nIG5saW5rIGluIGlub2NhY2hlcworIC0gU2NhbiBpbm9jYWNoZXMgZm9yIGlub2RlcyB3aXRoIG5saW5rPT0wCisqLworc3RhdGljIGludCBqZmZzMl9idWlsZF9maWxlc3lzdGVtKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKQoreworCWludCByZXQ7CisJaW50IGk7CisJc3RydWN0IGpmZnMyX2lub2RlX2NhY2hlICppYzsKKwlzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKmZkOworCXN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqZGVhZF9mZHMgPSBOVUxMOworCisJLyogRmlyc3QsIHNjYW4gdGhlIG1lZGl1bSBhbmQgYnVpbGQgYWxsIHRoZSBpbm9kZSBjYWNoZXMgd2l0aAorCSAgIGxpc3RzIG9mIHBoeXNpY2FsIG5vZGVzICovCisKKwljLT5mbGFncyB8PSBKRkZTMl9TQl9GTEFHX01PVU5USU5HOworCXJldCA9IGpmZnMyX3NjYW5fbWVkaXVtKGMpOworCWlmIChyZXQpCisJCWdvdG8gZXhpdDsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJTY2FubmVkIGZsYXNoIGNvbXBsZXRlbHlcbiIpKTsKKwlEMihqZmZzMl9kdW1wX2Jsb2NrX2xpc3RzKGMpKTsKKworCS8qIE5vdyBzY2FuIHRoZSBkaXJlY3RvcnkgdHJlZSwgaW5jcmVhc2luZyBubGluayBhY2NvcmRpbmcgdG8gZXZlcnkgZGlyZW50IGZvdW5kLiAqLworCWZvcl9lYWNoX2lub2RlKGksIGMsIGljKSB7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJQYXNzIDE6IGlubyAjJXVcbiIsIGljLT5pbm8pKTsKKworCQlEMShCVUdfT04oaWMtPmlubyA+IGMtPmhpZ2hlc3RfaW5vKSk7CisKKwkJaWYgKGljLT5zY2FuX2RlbnRzKSB7CisJCQlqZmZzMl9idWlsZF9pbm9kZV9wYXNzMShjLCBpYyk7CisJCQljb25kX3Jlc2NoZWQoKTsKKwkJfQorCX0KKwljLT5mbGFncyAmPSB+SkZGUzJfU0JfRkxBR19NT1VOVElORzsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJQYXNzIDEgY29tcGxldGVcbiIpKTsKKworCS8qIE5leHQsIHNjYW4gZm9yIGlub2RlcyB3aXRoIG5saW5rID09IDAgYW5kIHJlbW92ZSB0aGVtLiBJZgorCSAgIHRoZXkgd2VyZSBkaXJlY3RvcmllcywgdGhlbiBkZWNyZW1lbnQgdGhlIG5saW5rIG9mIHRoZWlyCisJICAgY2hpbGRyZW4gdG9vLCBhbmQgcmVwZWF0IHRoZSBzY2FuLiBBcyB0aGF0J3MgZ29pbmcgdG8gYmUKKwkgICBhIGZhaXJseSB1bmNvbW1vbiBvY2N1cnJlbmNlLCBpdCdzIG5vdCBzbyBldmlsIHRvIGRvIGl0IHRoaXMKKwkgICB3YXkuIFJlY3Vyc2lvbiBiYWQuICovCisJRDEocHJpbnRrKEtFUk5fREVCVUcgIlBhc3MgMiBzdGFydGluZ1xuIikpOworCisJZm9yX2VhY2hfaW5vZGUoaSwgYywgaWMpIHsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIlBhc3MgMjogaW5vICMldSwgbmxpbmsgJWQsIGljICVwLCBub2RlcyAlcFxuIiwgaWMtPmlubywgaWMtPm5saW5rLCBpYywgaWMtPm5vZGVzKSk7CisJCWlmIChpYy0+bmxpbmspCisJCQljb250aW51ZTsKKwkJCQorCQlqZmZzMl9idWlsZF9yZW1vdmVfdW5saW5rZWRfaW5vZGUoYywgaWMsICZkZWFkX2Zkcyk7CisJCWNvbmRfcmVzY2hlZCgpOworCX0gCisKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiUGFzcyAyYSBzdGFydGluZ1xuIikpOworCisJd2hpbGUgKGRlYWRfZmRzKSB7CisJCWZkID0gZGVhZF9mZHM7CisJCWRlYWRfZmRzID0gZmQtPm5leHQ7CisKKwkJaWMgPSBqZmZzMl9nZXRfaW5vX2NhY2hlKGMsIGZkLT5pbm8pOworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiUmVtb3ZpbmcgZGVhZF9mZCBpbm8gIyV1IChcIiVzXCIpLCBpYyBhdCAlcFxuIiwgZmQtPmlubywgZmQtPm5hbWUsIGljKSk7CisKKwkJaWYgKGljKQorCQkJamZmczJfYnVpbGRfcmVtb3ZlX3VubGlua2VkX2lub2RlKGMsIGljLCAmZGVhZF9mZHMpOworCQlqZmZzMl9mcmVlX2Z1bGxfZGlyZW50KGZkKTsKKwl9CisKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiUGFzcyAyIGNvbXBsZXRlXG4iKSk7CisJCisJLyogRmluYWxseSwgd2UgY2FuIHNjYW4gYWdhaW4gYW5kIGZyZWUgdGhlIGRpcmVudCBzdHJ1Y3RzICovCisJZm9yX2VhY2hfaW5vZGUoaSwgYywgaWMpIHsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIlBhc3MgMzogaW5vICMldSwgaWMgJXAsIG5vZGVzICVwXG4iLCBpYy0+aW5vLCBpYywgaWMtPm5vZGVzKSk7CisKKwkJd2hpbGUoaWMtPnNjYW5fZGVudHMpIHsKKwkJCWZkID0gaWMtPnNjYW5fZGVudHM7CisJCQlpYy0+c2Nhbl9kZW50cyA9IGZkLT5uZXh0OworCQkJamZmczJfZnJlZV9mdWxsX2RpcmVudChmZCk7CisJCX0KKwkJaWMtPnNjYW5fZGVudHMgPSBOVUxMOworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisJRDEocHJpbnRrKEtFUk5fREVCVUcgIlBhc3MgMyBjb21wbGV0ZVxuIikpOworCUQyKGpmZnMyX2R1bXBfYmxvY2tfbGlzdHMoYykpOworCisJLyogUm90YXRlIHRoZSBsaXN0cyBieSBzb21lIG51bWJlciB0byBlbnN1cmUgd2VhciBsZXZlbGxpbmcgKi8KKwlqZmZzMl9yb3RhdGVfbGlzdHMoYyk7CisKKwlyZXQgPSAwOworCitleGl0OgorCWlmIChyZXQpIHsKKwkJZm9yX2VhY2hfaW5vZGUoaSwgYywgaWMpIHsKKwkJCXdoaWxlKGljLT5zY2FuX2RlbnRzKSB7CisJCQkJZmQgPSBpYy0+c2Nhbl9kZW50czsKKwkJCQlpYy0+c2Nhbl9kZW50cyA9IGZkLT5uZXh0OworCQkJCWpmZnMyX2ZyZWVfZnVsbF9kaXJlbnQoZmQpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgamZmczJfYnVpbGRfcmVtb3ZlX3VubGlua2VkX2lub2RlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfY2FjaGUgKmljLCBzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKipkZWFkX2ZkcykKK3sKKwlzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICpyYXc7CisJc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICpmZDsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJKRkZTMjogUmVtb3ZpbmcgaW5vICMldSB3aXRoIG5saW5rID09IHplcm8uXG4iLCBpYy0+aW5vKSk7CisJCisJcmF3ID0gaWMtPm5vZGVzOworCXdoaWxlIChyYXcgIT0gKHZvaWQgKilpYykgeworCQlzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICpuZXh0ID0gcmF3LT5uZXh0X2luX2lubzsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIm9ic29sZXRpbmcgbm9kZSBhdCAweCUwOHhcbiIsIHJlZl9vZmZzZXQocmF3KSkpOworCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgcmF3KTsKKwkJcmF3ID0gbmV4dDsKKwl9CisKKwlpZiAoaWMtPnNjYW5fZGVudHMpIHsKKwkJaW50IHdoaW5nZWQgPSAwOworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiSW5vZGUgIyV1IHdhcyBhIGRpcmVjdG9yeSB3aGljaCBtYXkgaGF2ZSBjaGlsZHJlbi4uLlxuIiwgaWMtPmlubykpOworCisJCXdoaWxlKGljLT5zY2FuX2RlbnRzKSB7CisJCQlzdHJ1Y3QgamZmczJfaW5vZGVfY2FjaGUgKmNoaWxkX2ljOworCisJCQlmZCA9IGljLT5zY2FuX2RlbnRzOworCQkJaWMtPnNjYW5fZGVudHMgPSBmZC0+bmV4dDsKKworCQkJaWYgKCFmZC0+aW5vKSB7CisJCQkJLyogSXQncyBhIGRlbGV0aW9uIGRpcmVudC4gSWdub3JlIGl0ICovCisJCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkNoaWxkIFwiJXNcIiBpcyBhIGRlbGV0aW9uIGRpcmVudCwgc2tpcHBpbmcuLi5cbiIsIGZkLT5uYW1lKSk7CisJCQkJamZmczJfZnJlZV9mdWxsX2RpcmVudChmZCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXdoaW5nZWQpIHsKKwkJCQl3aGluZ2VkID0gMTsKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIklub2RlICMldSB3YXMgYSBkaXJlY3Rvcnkgd2l0aCBjaGlsZHJlbiAtIHJlbW92aW5nIHRob3NlIHRvby4uLlxuIiwgaWMtPmlubyk7CisJCQl9CisKKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJSZW1vdmluZyBjaGlsZCBcIiVzXCIsIGlubyAjJXVcbiIsCisJCQkJICBmZC0+bmFtZSwgZmQtPmlubykpOworCQkJCisJCQljaGlsZF9pYyA9IGpmZnMyX2dldF9pbm9fY2FjaGUoYywgZmQtPmlubyk7CisJCQlpZiAoIWNoaWxkX2ljKSB7CisJCQkJcHJpbnRrKEtFUk5fTk9USUNFICJDYW5ub3QgcmVtb3ZlIGNoaWxkIFwiJXNcIiwgaW5vICMldSwgYmVjYXVzZSBpdCBkb2Vzbid0IGV4aXN0XG4iLCBmZC0+bmFtZSwgZmQtPmlubyk7CisJCQkJamZmczJfZnJlZV9mdWxsX2RpcmVudChmZCk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qIFJlZHVjZSBubGluayBvZiB0aGUgY2hpbGQuIElmIGl0J3Mgbm93IHplcm8sIHN0aWNrIGl0IG9uIHRoZSAKKwkJCSAgIGRlYWRfZmRzIGxpc3QgdG8gYmUgY2xlYW5lZCB1cCBsYXRlci4gRWxzZSBqdXN0IGZyZWUgdGhlIGZkICovCisKKwkJCWNoaWxkX2ljLT5ubGluay0tOworCQkJCisJCQlpZiAoIWNoaWxkX2ljLT5ubGluaykgeworCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJJbm9kZSAjJXUgKFwiJXNcIikgaGFzIG5vdyBnb3QgemVybyBubGluay4gQWRkaW5nIHRvIGRlYWRfZmRzIGxpc3QuXG4iLAorCQkJCQkgIGZkLT5pbm8sIGZkLT5uYW1lKSk7CisJCQkJZmQtPm5leHQgPSAqZGVhZF9mZHM7CisJCQkJKmRlYWRfZmRzID0gZmQ7CisJCQl9IGVsc2UgeworCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJJbm9kZSAjJXUgKFwiJXNcIikgaGFzIG5vdyBnb3QgbmxpbmsgJWQuIElnbm9yaW5nLlxuIiwKKwkJCQkJICBmZC0+aW5vLCBmZC0+bmFtZSwgY2hpbGRfaWMtPm5saW5rKSk7CisJCQkJamZmczJfZnJlZV9mdWxsX2RpcmVudChmZCk7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAgIFdlIGRvbid0IGRlbGV0ZSB0aGUgaW5vY2FjaGUgZnJvbSB0aGUgaGFzaCBsaXN0IGFuZCBmcmVlIGl0IHlldC4gCisJICAgVGhlIGVyYXNlIGNvZGUgd2lsbCBkbyB0aGF0LCB3aGVuIGFsbCB0aGUgbm9kZXMgYXJlIGNvbXBsZXRlbHkgZ29uZS4KKwkqLworfQorCitzdGF0aWMgdm9pZCBqZmZzMl9jYWxjX3RyaWdnZXJfbGV2ZWxzKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKQoreworCXVpbnQzMl90IHNpemU7CisKKwkvKiBEZWxldGlvbiBzaG91bGQgYWxtb3N0IF9hbHdheXNfIGJlIGFsbG93ZWQuIFdlJ3JlIGZhaXJseQorCSAgIGJ1Z2dlcmVkIG9uY2Ugd2Ugc3RvcCBhbGxvd2luZyBwZW9wbGUgdG8gZGVsZXRlIHN0dWZmCisJICAgYmVjYXVzZSB0aGVyZSdzIG5vdCBlbm91Z2ggZnJlZSBzcGFjZS4uLiAqLworCWMtPnJlc3ZfYmxvY2tzX2RlbGV0aW9uID0gMjsKKworCS8qIEJlIGNvbnNlcnZhdGl2ZSBhYm91dCBob3cgbXVjaCBzcGFjZSB3ZSBuZWVkIGJlZm9yZSB3ZSBhbGxvdyB3cml0ZXMuIAorCSAgIE9uIHRvcCBvZiB0aGF0IHdoaWNoIGlzIHJlcXVpcmVkIGZvciBkZWxldGlhLCByZXF1aXJlIGFuIGV4dHJhIDIlCisJICAgb2YgdGhlIG1lZGl1bSB0byBiZSBhdmFpbGFibGUsIGZvciBvdmVyaGVhZCBjYXVzZWQgYnkgbm9kZXMgYmVpbmcKKwkgICBzcGxpdCBhY3Jvc3MgYmxvY2tzLCBldGMuICovCisKKwlzaXplID0gYy0+Zmxhc2hfc2l6ZSAvIDUwOyAvKiAyJSBvZiBmbGFzaCBzaXplICovCisJc2l6ZSArPSBjLT5ucl9ibG9ja3MgKiAxMDA7IC8qIEFuZCAxMDAgYnl0ZXMgcGVyIGVyYXNlYmxvY2sgKi8KKwlzaXplICs9IGMtPnNlY3Rvcl9zaXplIC0gMTsgLyogLi4uIGFuZCByb3VuZCB1cCAqLworCisJYy0+cmVzdl9ibG9ja3Nfd3JpdGUgPSBjLT5yZXN2X2Jsb2Nrc19kZWxldGlvbiArIChzaXplIC8gYy0+c2VjdG9yX3NpemUpOworCisJLyogV2hlbiBkbyB3ZSBsZXQgdGhlIEdDIHRocmVhZCBydW4gaW4gdGhlIGJhY2tncm91bmQgKi8KKworCWMtPnJlc3ZfYmxvY2tzX2djdHJpZ2dlciA9IGMtPnJlc3ZfYmxvY2tzX3dyaXRlICsgMTsKKworCS8qIFdoZW4gZG8gd2UgYWxsb3cgZ2FyYmFnZSBjb2xsZWN0aW9uIHRvIG1lcmdlIG5vZGVzIHRvIG1ha2UgCisJICAgbG9uZy10ZXJtIHByb2dyZXNzIGF0IHRoZSBleHBlbnNlIG9mIHNob3J0LXRlcm0gc3BhY2UgZXhoYXVzdGlvbj8gKi8KKwljLT5yZXN2X2Jsb2Nrc19nY21lcmdlID0gYy0+cmVzdl9ibG9ja3NfZGVsZXRpb24gKyAxOworCisJLyogV2hlbiBkbyB3ZSBhbGxvdyBnYXJiYWdlIGNvbGxlY3Rpb24gdG8gZWF0IGZyb20gYmFkIGJsb2NrcyByYXRoZXIKKwkgICB0aGFuIGFjdHVhbGx5IG1ha2luZyBwcm9ncmVzcz8gKi8KKwljLT5yZXN2X2Jsb2Nrc19nY2JhZCA9IDA7Ly9jLT5yZXN2X2Jsb2Nrc19kZWxldGlvbiArIDI7CisKKwkvKiBJZiB0aGVyZSdzIGxlc3MgdGhhbiB0aGlzIGFtb3VudCBvZiBkaXJ0eSBzcGFjZSwgZG9uJ3QgYm90aGVyCisJICAgdHJ5aW5nIHRvIEdDIHRvIG1ha2UgbW9yZSBzcGFjZS4gSXQnbGwgYmUgYSBmcnVpdGxlc3MgdGFzayAqLworCWMtPm5vc3BjX2RpcnR5X3NpemUgPSBjLT5zZWN0b3Jfc2l6ZSArIChjLT5mbGFzaF9zaXplIC8gMTAwKTsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJKRkZTMiB0cmlnZ2VyIGxldmVscyAoc2l6ZSAlZCBLaUIsIGJsb2NrIHNpemUgJWQgS2lCLCAlZCBibG9ja3MpXG4iLAorCQkgIGMtPmZsYXNoX3NpemUgLyAxMDI0LCBjLT5zZWN0b3Jfc2l6ZSAvIDEwMjQsIGMtPm5yX2Jsb2NrcykpOworCUQxKHByaW50ayhLRVJOX0RFQlVHICJCbG9ja3MgcmVxdWlyZWQgdG8gYWxsb3cgZGVsZXRpb246ICAgICVkICglZCBLaUIpXG4iLAorCQkgIGMtPnJlc3ZfYmxvY2tzX2RlbGV0aW9uLCBjLT5yZXN2X2Jsb2Nrc19kZWxldGlvbipjLT5zZWN0b3Jfc2l6ZS8xMDI0KSk7CisJRDEocHJpbnRrKEtFUk5fREVCVUcgIkJsb2NrcyByZXF1aXJlZCB0byBhbGxvdyB3cml0ZXM6ICAgICAgJWQgKCVkIEtpQilcbiIsCisJCSAgYy0+cmVzdl9ibG9ja3Nfd3JpdGUsIGMtPnJlc3ZfYmxvY2tzX3dyaXRlKmMtPnNlY3Rvcl9zaXplLzEwMjQpKTsKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiQmxvY2tzIHJlcXVpcmVkIHRvIHF1aWVzY2UgR0MgdGhyZWFkOiAlZCAoJWQgS2lCKVxuIiwKKwkJICBjLT5yZXN2X2Jsb2Nrc19nY3RyaWdnZXIsIGMtPnJlc3ZfYmxvY2tzX2djdHJpZ2dlcipjLT5zZWN0b3Jfc2l6ZS8xMDI0KSk7CisJRDEocHJpbnRrKEtFUk5fREVCVUcgIkJsb2NrcyByZXF1aXJlZCB0byBhbGxvdyBHQyBtZXJnZXM6ICAgJWQgKCVkIEtpQilcbiIsCisJCSAgYy0+cmVzdl9ibG9ja3NfZ2NtZXJnZSwgYy0+cmVzdl9ibG9ja3NfZ2NtZXJnZSpjLT5zZWN0b3Jfc2l6ZS8xMDI0KSk7CisJRDEocHJpbnRrKEtFUk5fREVCVUcgIkJsb2NrcyByZXF1aXJlZCB0byBHQyBiYWQgYmxvY2tzOiAgICAgJWQgKCVkIEtpQilcbiIsCisJCSAgYy0+cmVzdl9ibG9ja3NfZ2NiYWQsIGMtPnJlc3ZfYmxvY2tzX2djYmFkKmMtPnNlY3Rvcl9zaXplLzEwMjQpKTsKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiQW1vdW50IG9mIGRpcnR5IHNwYWNlIHJlcXVpcmVkIHRvIEdDOiAlZCBieXRlc1xuIiwKKwkJICBjLT5ub3NwY19kaXJ0eV9zaXplKSk7Cit9IAorCitpbnQgamZmczJfZG9fbW91bnRfZnMoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpCit7CisJaW50IGk7CisKKwljLT5mcmVlX3NpemUgPSBjLT5mbGFzaF9zaXplOworCWMtPm5yX2Jsb2NrcyA9IGMtPmZsYXNoX3NpemUgLyBjLT5zZWN0b3Jfc2l6ZTsKKyAJaWYgKGMtPm10ZC0+ZmxhZ3MgJiBNVERfTk9fVklSVEJMT0NLUykKKwkJYy0+YmxvY2tzID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IGpmZnMyX2VyYXNlYmxvY2spICogYy0+bnJfYmxvY2tzKTsKKwllbHNlCisJCWMtPmJsb2NrcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrKSAqIGMtPm5yX2Jsb2NrcywgR0ZQX0tFUk5FTCk7CisJaWYgKCFjLT5ibG9ja3MpCisJCXJldHVybiAtRU5PTUVNOworCWZvciAoaT0wOyBpPGMtPm5yX2Jsb2NrczsgaSsrKSB7CisJCUlOSVRfTElTVF9IRUFEKCZjLT5ibG9ja3NbaV0ubGlzdCk7CisJCWMtPmJsb2Nrc1tpXS5vZmZzZXQgPSBpICogYy0+c2VjdG9yX3NpemU7CisJCWMtPmJsb2Nrc1tpXS5mcmVlX3NpemUgPSBjLT5zZWN0b3Jfc2l6ZTsKKwkJYy0+YmxvY2tzW2ldLmRpcnR5X3NpemUgPSAwOworCQljLT5ibG9ja3NbaV0ud2FzdGVkX3NpemUgPSAwOworCQljLT5ibG9ja3NbaV0udW5jaGVja2VkX3NpemUgPSAwOworCQljLT5ibG9ja3NbaV0udXNlZF9zaXplID0gMDsKKwkJYy0+YmxvY2tzW2ldLmZpcnN0X25vZGUgPSBOVUxMOworCQljLT5ibG9ja3NbaV0ubGFzdF9ub2RlID0gTlVMTDsKKwkJYy0+YmxvY2tzW2ldLmJhZF9jb3VudCA9IDA7CisJfQorCisJaW5pdF9NVVRFWCgmYy0+YWxsb2Nfc2VtKTsKKwlpbml0X01VVEVYKCZjLT5lcmFzZV9mcmVlX3NlbSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmYy0+ZXJhc2Vfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmYy0+aW5vY2FjaGVfd3EpOworCXNwaW5fbG9ja19pbml0KCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZjLT5pbm9jYWNoZV9sb2NrKTsKKworCUlOSVRfTElTVF9IRUFEKCZjLT5jbGVhbl9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmYy0+dmVyeV9kaXJ0eV9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmYy0+ZGlydHlfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmMtPmVyYXNhYmxlX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZjLT5lcmFzaW5nX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZjLT5lcmFzZV9wZW5kaW5nX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZjLT5lcmFzYWJsZV9wZW5kaW5nX3didWZfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmMtPmVyYXNlX2NvbXBsZXRlX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZjLT5mcmVlX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZjLT5iYWRfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmMtPmJhZF91c2VkX2xpc3QpOworCWMtPmhpZ2hlc3RfaW5vID0gMTsKKworCWlmIChqZmZzMl9idWlsZF9maWxlc3lzdGVtKGMpKSB7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJidWlsZF9mcyBmYWlsZWRcbiIpKTsKKwkJamZmczJfZnJlZV9pbm9fY2FjaGVzKGMpOworCQlqZmZzMl9mcmVlX3Jhd19ub2RlX3JlZnMoYyk7CisJCWlmIChjLT5tdGQtPmZsYWdzICYgTVREX05PX1ZJUlRCTE9DS1MpIHsKKwkJCXZmcmVlKGMtPmJsb2Nrcyk7CisJCX0gZWxzZSB7CisJCQlrZnJlZShjLT5ibG9ja3MpOworCQl9CisJCXJldHVybiAtRUlPOworCX0KKworCWpmZnMyX2NhbGNfdHJpZ2dlcl9sZXZlbHMoYyk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2NvbXByLmMgYi9mcy9qZmZzMi9jb21wci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmOTIyYTkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZmZzMi9jb21wci5jCkBAIC0wLDAgKzEsNDY5IEBACisvKgorICogSkZGUzIgLS0gSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0sIFZlcnNpb24gMi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBSZWQgSGF0LCBJbmMuCisgKiBDcmVhdGVkIGJ5IEFyamFuIHZhbiBkZSBWZW4gPGFyamFudkByZWRoYXQuY29tPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBGZXJlbmMgSGF2YXNpIDxoYXZhc2lAaW5mLnUtc3plZ2VkLmh1PiwKKyAqICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IG9mIFN6ZWdlZCwgSHVuZ2FyeQorICoKKyAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCisgKgorICogJElkOiBjb21wci5jLHYgMS40MiAyMDA0LzA4LzA3IDIxOjU2OjA4IGR3bXcyIEV4cCAkCisgKgorICovCisKKyNpbmNsdWRlICJjb21wci5oIgorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGpmZnMyX2NvbXByZXNzb3JfbGlzdF9sb2NrKTsKKworLyogQXZhaWxhYmxlIGNvbXByZXNzb3JzIGFyZSBvbiB0aGlzIGxpc3QgKi8KK3N0YXRpYyBMSVNUX0hFQUQoamZmczJfY29tcHJlc3Nvcl9saXN0KTsKKworLyogQWN0dWFsIGNvbXByZXNzaW9uIG1vZGUgKi8KK3N0YXRpYyBpbnQgamZmczJfY29tcHJlc3Npb25fbW9kZSA9IEpGRlMyX0NPTVBSX01PREVfUFJJT1JJVFk7CisKKy8qIFN0YXRpc3RpY3MgZm9yIGJsb2NrcyBzdG9yZWQgd2l0aG91dCBjb21wcmVzc2lvbiAqLworc3RhdGljIHVpbnQzMl90IG5vbmVfc3RhdF9jb21wcl9ibG9ja3M9MCxub25lX3N0YXRfZGVjb21wcl9ibG9ja3M9MCxub25lX3N0YXRfY29tcHJfc2l6ZT0wOworCisvKiBqZmZzMl9jb21wcmVzczoKKyAqIEBkYXRhOiBQb2ludGVyIHRvIHVuY29tcHJlc3NlZCBkYXRhCisgKiBAY2RhdGE6IFBvaW50ZXIgdG8gcmV0dXJuZWQgcG9pbnRlciB0byBidWZmZXIgZm9yIGNvbXByZXNzZWQgZGF0YQorICogQGRhdGFsZW46IE9uIGVudHJ5LCBob2xkcyB0aGUgYW1vdW50IG9mIGRhdGEgYXZhaWxhYmxlIGZvciBjb21wcmVzc2lvbi4KKyAqCU9uIGV4aXQsIGV4cGVjdGVkIHRvIGhvbGQgdGhlIGFtb3VudCBvZiBkYXRhIGFjdHVhbGx5IGNvbXByZXNzZWQuCisgKiBAY2RhdGFsZW46IE9uIGVudHJ5LCBob2xkcyB0aGUgYW1vdW50IG9mIHNwYWNlIGF2YWlsYWJsZSBmb3IgY29tcHJlc3NlZAorICoJZGF0YS4gT24gZXhpdCwgZXhwZWN0ZWQgdG8gaG9sZCB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIGNvbXByZXNzZWQKKyAqCWRhdGEuCisgKgorICogUmV0dXJuczogTG93ZXIgYnl0ZSB0byBiZSBzdG9yZWQgd2l0aCBkYXRhIGluZGljYXRpbmcgY29tcHJlc3Npb24gdHlwZSB1c2VkLgorICogWmVybyBpcyB1c2VkIHRvIHNob3cgdGhhdCB0aGUgZGF0YSBjb3VsZCBub3QgYmUgY29tcHJlc3NlZCAtIHRoZSAKKyAqIGNvbXByZXNzZWQgdmVyc2lvbiB3YXMgYWN0dWFsbHkgbGFyZ2VyIHRoYW4gdGhlIG9yaWdpbmFsLgorICogVXBwZXIgYnl0ZSB3aWxsIGJlIHVzZWQgbGF0ZXIuIChzb29uKQorICoKKyAqIElmIHRoZSBjZGF0YSBidWZmZXIgaXNuJ3QgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYWxsIHRoZSB1bmNvbXByZXNzZWQgZGF0YSwKKyAqIGpmZnMyX2NvbXByZXNzIHNob3VsZCBjb21wcmVzcyBhcyBtdWNoIGFzIHdpbGwgZml0LCBhbmQgc2hvdWxkIHNldCAKKyAqICpkYXRhbGVuIGFjY29yZGluZ2x5IHRvIHNob3cgdGhlIGFtb3VudCBvZiBkYXRhIHdoaWNoIHdlcmUgY29tcHJlc3NlZC4KKyAqLwordWludDE2X3QgamZmczJfY29tcHJlc3Moc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLAorCQkJICAgICB1bnNpZ25lZCBjaGFyICpkYXRhX2luLCB1bnNpZ25lZCBjaGFyICoqY3BhZ2Vfb3V0LCAKKwkJCSAgICAgdWludDMyX3QgKmRhdGFsZW4sIHVpbnQzMl90ICpjZGF0YWxlbikKK3sKKwlpbnQgcmV0ID0gSkZGUzJfQ09NUFJfTk9ORTsKKyAgICAgICAgaW50IGNvbXByX3JldDsKKyAgICAgICAgc3RydWN0IGpmZnMyX2NvbXByZXNzb3IgKnRoaXMsICpiZXN0PU5VTEw7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKm91dHB1dF9idWYgPSBOVUxMLCAqdG1wX2J1ZjsKKyAgICAgICAgdWludDMyX3Qgb3JpZ19zbGVuLCBvcmlnX2RsZW47CisgICAgICAgIHVpbnQzMl90IGJlc3Rfc2xlbj0wLCBiZXN0X2RsZW49MDsKKworICAgICAgICBzd2l0Y2ggKGpmZnMyX2NvbXByZXNzaW9uX21vZGUpIHsKKyAgICAgICAgY2FzZSBKRkZTMl9DT01QUl9NT0RFX05PTkU6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSkZGUzJfQ09NUFJfTU9ERV9QUklPUklUWToKKyAgICAgICAgICAgICAgICBvdXRwdXRfYnVmID0ga21hbGxvYygqY2RhdGFsZW4sR0ZQX0tFUk5FTCk7CisgICAgICAgICAgICAgICAgaWYgKCFvdXRwdXRfYnVmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJKRkZTMjogTm8gbWVtb3J5IGZvciBjb21wcmVzc29yIGFsbG9jYXRpb24uIENvbXByZXNzaW9uIGZhaWxlZC5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9yaWdfc2xlbiA9ICpkYXRhbGVuOworICAgICAgICAgICAgICAgIG9yaWdfZGxlbiA9ICpjZGF0YWxlbjsKKyAgICAgICAgICAgICAgICBzcGluX2xvY2soJmpmZnMyX2NvbXByZXNzb3JfbGlzdF9sb2NrKTsKKyAgICAgICAgICAgICAgICBsaXN0X2Zvcl9lYWNoX2VudHJ5KHRoaXMsICZqZmZzMl9jb21wcmVzc29yX2xpc3QsIGxpc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNraXAgZGVjb21wcmVzcy1vbmx5IGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IGFuZCBkaXNhYmxlZCBtb2R1bGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCF0aGlzLT5jb21wcmVzcyl8fCh0aGlzLT5kaXNhYmxlZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51c2Vjb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2soJmpmZnMyX2NvbXByZXNzb3JfbGlzdF9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhbGVuICA9IG9yaWdfc2xlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICpjZGF0YWxlbiA9IG9yaWdfZGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByX3JldCA9IHRoaXMtPmNvbXByZXNzKGRhdGFfaW4sIG91dHB1dF9idWYsIGRhdGFsZW4sIGNkYXRhbGVuLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fbG9jaygmamZmczJfY29tcHJlc3Nvcl9saXN0X2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+dXNlY291bnQtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29tcHJfcmV0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHRoaXMtPmNvbXByOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5zdGF0X2NvbXByX2Jsb2NrcysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5zdGF0X2NvbXByX29yaWdfc2l6ZSArPSAqZGF0YWxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+c3RhdF9jb21wcl9uZXdfc2l6ZSAgKz0gKmNkYXRhbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2soJmpmZnMyX2NvbXByZXNzb3JfbGlzdF9sb2NrKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ID09IEpGRlMyX0NPTVBSX05PTkUpIGtmcmVlKG91dHB1dF9idWYpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEpGRlMyX0NPTVBSX01PREVfU0laRToKKyAgICAgICAgICAgICAgICBvcmlnX3NsZW4gPSAqZGF0YWxlbjsKKyAgICAgICAgICAgICAgICBvcmlnX2RsZW4gPSAqY2RhdGFsZW47CisgICAgICAgICAgICAgICAgc3Bpbl9sb2NrKCZqZmZzMl9jb21wcmVzc29yX2xpc3RfbG9jayk7CisgICAgICAgICAgICAgICAgbGlzdF9mb3JfZWFjaF9lbnRyeSh0aGlzLCAmamZmczJfY29tcHJlc3Nvcl9saXN0LCBsaXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBTa2lwIGRlY29tcHJlc3Mtb25seSBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBhbmQgZGlzYWJsZWQgbW9kdWxlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCghdGhpcy0+Y29tcHJlc3MpfHwodGhpcy0+ZGlzYWJsZWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRpbmcgbWVtb3J5IGZvciBvdXRwdXQgYnVmZmVyIGlmIG5lY2Vzc2FyeSAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzLT5jb21wcl9idWZfc2l6ZTxvcmlnX2RsZW4pJiYodGhpcy0+Y29tcHJfYnVmKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9jaygmamZmczJfY29tcHJlc3Nvcl9saXN0X2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZnJlZSh0aGlzLT5jb21wcl9idWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGluX2xvY2soJmpmZnMyX2NvbXByZXNzb3JfbGlzdF9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+Y29tcHJfYnVmX3NpemU9MDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+Y29tcHJfYnVmPU5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMtPmNvbXByX2J1ZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9jaygmamZmczJfY29tcHJlc3Nvcl9saXN0X2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBfYnVmID0ga21hbGxvYyhvcmlnX2RsZW4sR0ZQX0tFUk5FTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fbG9jaygmamZmczJfY29tcHJlc3Nvcl9saXN0X2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRtcF9idWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJKRkZTMjogTm8gbWVtb3J5IGZvciBjb21wcmVzc29yIGFsbG9jYXRpb24uICglZCBieXRlcylcbiIsb3JpZ19kbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5jb21wcl9idWYgPSB0bXBfYnVmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmNvbXByX2J1Zl9zaXplID0gb3JpZ19kbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51c2Vjb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2soJmpmZnMyX2NvbXByZXNzb3JfbGlzdF9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhbGVuICA9IG9yaWdfc2xlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICpjZGF0YWxlbiA9IG9yaWdfZGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByX3JldCA9IHRoaXMtPmNvbXByZXNzKGRhdGFfaW4sIHRoaXMtPmNvbXByX2J1ZiwgZGF0YWxlbiwgY2RhdGFsZW4sIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl9sb2NrKCZqZmZzMl9jb21wcmVzc29yX2xpc3RfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51c2Vjb3VudC0tOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb21wcl9yZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCghYmVzdF9kbGVuKXx8KGJlc3RfZGxlbj4qY2RhdGFsZW4pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9kbGVuID0gKmNkYXRhbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3Rfc2xlbiA9ICpkYXRhbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3QgPSB0aGlzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChiZXN0X2RsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpjZGF0YWxlbiA9IGJlc3RfZGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkYXRhbGVuICA9IGJlc3Rfc2xlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9idWYgPSBiZXN0LT5jb21wcl9idWY7CisgICAgICAgICAgICAgICAgICAgICAgICBiZXN0LT5jb21wcl9idWYgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgYmVzdC0+Y29tcHJfYnVmX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgYmVzdC0+c3RhdF9jb21wcl9ibG9ja3MrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlc3QtPnN0YXRfY29tcHJfb3JpZ19zaXplICs9IGJlc3Rfc2xlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlc3QtPnN0YXRfY29tcHJfbmV3X3NpemUgICs9IGJlc3RfZGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGJlc3QtPmNvbXByOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzcGluX3VubG9jaygmamZmczJfY29tcHJlc3Nvcl9saXN0X2xvY2spOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiSkZGUzI6IHVua25vdyBjb21wcmVzc2lvbiBtb2RlLlxuIik7CisgICAgICAgIH0KKyBvdXQ6CisgICAgICAgIGlmIChyZXQgPT0gSkZGUzJfQ09NUFJfTk9ORSkgeworCSAgICAgICAgKmNwYWdlX291dCA9IGRhdGFfaW47CisJICAgICAgICAqZGF0YWxlbiA9ICpjZGF0YWxlbjsKKyAgICAgICAgICAgICAgICBub25lX3N0YXRfY29tcHJfYmxvY2tzKys7CisgICAgICAgICAgICAgICAgbm9uZV9zdGF0X2NvbXByX3NpemUgKz0gKmRhdGFsZW47CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgKmNwYWdlX291dCA9IG91dHB1dF9idWY7CisgICAgICAgIH0KKwlyZXR1cm4gcmV0OworfQorCitpbnQgamZmczJfZGVjb21wcmVzcyhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsCisJCSAgICAgdWludDE2X3QgY29tcHJ0eXBlLCB1bnNpZ25lZCBjaGFyICpjZGF0YV9pbiwgCisJCSAgICAgdW5zaWduZWQgY2hhciAqZGF0YV9vdXQsIHVpbnQzMl90IGNkYXRhbGVuLCB1aW50MzJfdCBkYXRhbGVuKQoreworICAgICAgICBzdHJ1Y3QgamZmczJfY29tcHJlc3NvciAqdGhpczsKKyAgICAgICAgaW50IHJldDsKKworCS8qIE9sZGVyIGNvZGUgaGFkIGEgYnVnIHdoZXJlIGl0IHdvdWxkIHdyaXRlIG5vbi16ZXJvICd1c2VyY29tcHInCisJICAgZmllbGRzLiBEZWFsIHdpdGggaXQuICovCisJaWYgKChjb21wcnR5cGUgJiAweGZmKSA8PSBKRkZTMl9DT01QUl9aTElCKQorCQljb21wcnR5cGUgJj0gMHhmZjsKKworCXN3aXRjaCAoY29tcHJ0eXBlICYgMHhmZikgeworCWNhc2UgSkZGUzJfQ09NUFJfTk9ORToKKwkJLyogVGhpcyBzaG91bGQgYmUgc3BlY2lhbC1jYXNlZCBlbHNld2hlcmUsIGJ1dCB3ZSBtaWdodCBhcyB3ZWxsIGRlYWwgd2l0aCBpdCAqLworCQltZW1jcHkoZGF0YV9vdXQsIGNkYXRhX2luLCBkYXRhbGVuKTsKKyAgICAgICAgICAgICAgICBub25lX3N0YXRfZGVjb21wcl9ibG9ja3MrKzsKKwkJYnJlYWs7CisJY2FzZSBKRkZTMl9DT01QUl9aRVJPOgorCQltZW1zZXQoZGF0YV9vdXQsIDAsIGRhdGFsZW4pOworCQlicmVhazsKKwlkZWZhdWx0OgorICAgICAgICAgICAgICAgIHNwaW5fbG9jaygmamZmczJfY29tcHJlc3Nvcl9saXN0X2xvY2spOworICAgICAgICAgICAgICAgIGxpc3RfZm9yX2VhY2hfZW50cnkodGhpcywgJmpmZnMyX2NvbXByZXNzb3JfbGlzdCwgbGlzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBydHlwZSA9PSB0aGlzLT5jb21wcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT51c2Vjb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9jaygmamZmczJfY29tcHJlc3Nvcl9saXN0X2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSB0aGlzLT5kZWNvbXByZXNzKGNkYXRhX2luLCBkYXRhX291dCwgY2RhdGFsZW4sIGRhdGFsZW4sIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGluX2xvY2soJmpmZnMyX2NvbXByZXNzb3JfbGlzdF9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIkRlY29tcHJlc3NvciBcIiVzXCIgcmV0dXJuZWQgJWRcbiIsIHRoaXMtPm5hbWUsIHJldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+c3RhdF9kZWNvbXByX2Jsb2NrcysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnVzZWNvdW50LS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrKCZqZmZzMl9jb21wcmVzc29yX2xpc3RfbG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJKRkZTMiBjb21wcmVzc2lvbiB0eXBlIDB4JTAyeCBub3QgYXZhaWxhYmxlLlxuIiwgY29tcHJ0eXBlKTsKKyAgICAgICAgICAgICAgICBzcGluX3VubG9jaygmamZmczJfY29tcHJlc3Nvcl9saXN0X2xvY2spOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBqZmZzMl9yZWdpc3Rlcl9jb21wcmVzc29yKHN0cnVjdCBqZmZzMl9jb21wcmVzc29yICpjb21wKQoreworICAgICAgICBzdHJ1Y3QgamZmczJfY29tcHJlc3NvciAqdGhpczsKKworICAgICAgICBpZiAoIWNvbXAtPm5hbWUpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJOVUxMIGNvbXByZXNzb3IgbmFtZSBhdCByZWdpc3RlcmluZyBKRkZTMiBjb21wcmVzc29yLiBGYWlsZWQuXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgY29tcC0+Y29tcHJfYnVmX3NpemU9MDsKKyAgICAgICAgY29tcC0+Y29tcHJfYnVmPU5VTEw7CisgICAgICAgIGNvbXAtPnVzZWNvdW50PTA7CisgICAgICAgIGNvbXAtPnN0YXRfY29tcHJfb3JpZ19zaXplPTA7CisgICAgICAgIGNvbXAtPnN0YXRfY29tcHJfbmV3X3NpemU9MDsKKyAgICAgICAgY29tcC0+c3RhdF9jb21wcl9ibG9ja3M9MDsKKyAgICAgICAgY29tcC0+c3RhdF9kZWNvbXByX2Jsb2Nrcz0wOworICAgICAgICBEMShwcmludGsoS0VSTl9ERUJVRyAiUmVnaXN0ZXJpbmcgSkZGUzIgY29tcHJlc3NvciBcIiVzXCJcbiIsIGNvbXAtPm5hbWUpKTsKKworICAgICAgICBzcGluX2xvY2soJmpmZnMyX2NvbXByZXNzb3JfbGlzdF9sb2NrKTsKKworICAgICAgICBsaXN0X2Zvcl9lYWNoX2VudHJ5KHRoaXMsICZqZmZzMl9jb21wcmVzc29yX2xpc3QsIGxpc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+cHJpb3JpdHkgPCBjb21wLT5wcmlvcml0eSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9hZGQoJmNvbXAtPmxpc3QsIHRoaXMtPmxpc3QucHJldik7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbGlzdF9hZGRfdGFpbCgmY29tcC0+bGlzdCwgJmpmZnMyX2NvbXByZXNzb3JfbGlzdCk7CitvdXQ6CisgICAgICAgIEQyKGxpc3RfZm9yX2VhY2hfZW50cnkodGhpcywgJmpmZnMyX2NvbXByZXNzb3JfbGlzdCwgbGlzdCkgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJDb21wcmVzc29yIFwiJXNcIiwgcHJpbyAlZFxuIiwgdGhpcy0+bmFtZSwgdGhpcy0+cHJpb3JpdHkpOworICAgICAgICB9KQorCisgICAgICAgIHNwaW5fdW5sb2NrKCZqZmZzMl9jb21wcmVzc29yX2xpc3RfbG9jayk7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK2ludCBqZmZzMl91bnJlZ2lzdGVyX2NvbXByZXNzb3Ioc3RydWN0IGpmZnMyX2NvbXByZXNzb3IgKmNvbXApCit7CisgICAgICAgIEQyKHN0cnVjdCBqZmZzMl9jb21wcmVzc29yICp0aGlzOykKKworICAgICAgICBEMShwcmludGsoS0VSTl9ERUJVRyAiVW5yZWdpc3RlcmluZyBKRkZTMiBjb21wcmVzc29yIFwiJXNcIlxuIiwgY29tcC0+bmFtZSkpOworCisgICAgICAgIHNwaW5fbG9jaygmamZmczJfY29tcHJlc3Nvcl9saXN0X2xvY2spOworCisgICAgICAgIGlmIChjb21wLT51c2Vjb3VudCkgeworICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrKCZqZmZzMl9jb21wcmVzc29yX2xpc3RfbG9jayk7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiSkZGUzI6IENvbXByZXNzb3IgbW9kdWwgaXMgaW4gdXNlLiBVbnJlZ2lzdGVyIGZhaWxlZC5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBsaXN0X2RlbCgmY29tcC0+bGlzdCk7CisKKyAgICAgICAgRDIobGlzdF9mb3JfZWFjaF9lbnRyeSh0aGlzLCAmamZmczJfY29tcHJlc3Nvcl9saXN0LCBsaXN0KSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIkNvbXByZXNzb3IgXCIlc1wiLCBwcmlvICVkXG4iLCB0aGlzLT5uYW1lLCB0aGlzLT5wcmlvcml0eSk7CisgICAgICAgIH0pCisgICAgICAgIHNwaW5fdW5sb2NrKCZqZmZzMl9jb21wcmVzc29yX2xpc3RfbG9jayk7CisgICAgICAgIHJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX0pGRlMyX1BST0MKKworI2RlZmluZSBKRkZTMl9TVEFUX0JVRl9TSVpFIDE2MDAwCisKK2NoYXIgKmpmZnMyX2xpc3RfY29tcHJlc3NvcnModm9pZCkKK3sKKyAgICAgICAgc3RydWN0IGpmZnMyX2NvbXByZXNzb3IgKnRoaXM7CisgICAgICAgIGNoYXIgKmJ1ZiwgKmFjdF9idWY7CisKKyAgICAgICAgYWN0X2J1ZiA9IGJ1ZiA9IGttYWxsb2MoSkZGUzJfU1RBVF9CVUZfU0laRSxHRlBfS0VSTkVMKTsKKyAgICAgICAgbGlzdF9mb3JfZWFjaF9lbnRyeSh0aGlzLCAmamZmczJfY29tcHJlc3Nvcl9saXN0LCBsaXN0KSB7CisgICAgICAgICAgICAgICAgYWN0X2J1ZiArPSBzcHJpbnRmKGFjdF9idWYsICIlMTBzIHByaW9yaXR5OiVkICIsIHRoaXMtPm5hbWUsIHRoaXMtPnByaW9yaXR5KTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPmRpc2FibGVkKXx8KCF0aGlzLT5jb21wcmVzcykpCisgICAgICAgICAgICAgICAgICAgICAgICBhY3RfYnVmICs9IHNwcmludGYoYWN0X2J1ZiwiZGlzYWJsZWQiKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBhY3RfYnVmICs9IHNwcmludGYoYWN0X2J1ZiwiZW5hYmxlZCIpOworICAgICAgICAgICAgICAgIGFjdF9idWYgKz0gc3ByaW50ZihhY3RfYnVmLCJcbiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWY7Cit9CisKK2NoYXIgKmpmZnMyX3N0YXRzKHZvaWQpCit7CisgICAgICAgIHN0cnVjdCBqZmZzMl9jb21wcmVzc29yICp0aGlzOworICAgICAgICBjaGFyICpidWYsICphY3RfYnVmOworCisgICAgICAgIGFjdF9idWYgPSBidWYgPSBrbWFsbG9jKEpGRlMyX1NUQVRfQlVGX1NJWkUsR0ZQX0tFUk5FTCk7CisKKyAgICAgICAgYWN0X2J1ZiArPSBzcHJpbnRmKGFjdF9idWYsIkpGRlMyIGNvbXByZXNzb3Igc3RhdGlzdGljczpcbiIpOworICAgICAgICBhY3RfYnVmICs9IHNwcmludGYoYWN0X2J1ZiwiJTEwcyAgICIsIm5vbmUiKTsKKyAgICAgICAgYWN0X2J1ZiArPSBzcHJpbnRmKGFjdF9idWYsImNvbXByOiAlZCBibG9ja3MgKCVkKSAgZGVjb21wcjogJWQgYmxvY2tzXG4iLCBub25lX3N0YXRfY29tcHJfYmxvY2tzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbmVfc3RhdF9jb21wcl9zaXplLCBub25lX3N0YXRfZGVjb21wcl9ibG9ja3MpOworICAgICAgICBzcGluX2xvY2soJmpmZnMyX2NvbXByZXNzb3JfbGlzdF9sb2NrKTsKKyAgICAgICAgbGlzdF9mb3JfZWFjaF9lbnRyeSh0aGlzLCAmamZmczJfY29tcHJlc3Nvcl9saXN0LCBsaXN0KSB7CisgICAgICAgICAgICAgICAgYWN0X2J1ZiArPSBzcHJpbnRmKGFjdF9idWYsIiUxMHMgIix0aGlzLT5uYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoKHRoaXMtPmRpc2FibGVkKXx8KCF0aGlzLT5jb21wcmVzcykpCisgICAgICAgICAgICAgICAgICAgICAgICBhY3RfYnVmICs9IHNwcmludGYoYWN0X2J1ZiwiLSAiKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBhY3RfYnVmICs9IHNwcmludGYoYWN0X2J1ZiwiKyAiKTsKKyAgICAgICAgICAgICAgICBhY3RfYnVmICs9IHNwcmludGYoYWN0X2J1ZiwiY29tcHI6ICVkIGJsb2NrcyAoJWQvJWQpICBkZWNvbXByOiAlZCBibG9ja3MgIiwgdGhpcy0+c3RhdF9jb21wcl9ibG9ja3MsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5zdGF0X2NvbXByX25ld19zaXplLCB0aGlzLT5zdGF0X2NvbXByX29yaWdfc2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPnN0YXRfZGVjb21wcl9ibG9ja3MpOworICAgICAgICAgICAgICAgIGFjdF9idWYgKz0gc3ByaW50ZihhY3RfYnVmLCJcbiIpOworICAgICAgICB9CisgICAgICAgIHNwaW5fdW5sb2NrKCZqZmZzMl9jb21wcmVzc29yX2xpc3RfbG9jayk7CisKKyAgICAgICAgcmV0dXJuIGJ1ZjsKK30KKworY2hhciAqamZmczJfZ2V0X2NvbXByZXNzaW9uX21vZGVfbmFtZSh2b2lkKSAKK3sKKyAgICAgICAgc3dpdGNoIChqZmZzMl9jb21wcmVzc2lvbl9tb2RlKSB7CisgICAgICAgIGNhc2UgSkZGUzJfQ09NUFJfTU9ERV9OT05FOgorICAgICAgICAgICAgICAgIHJldHVybiAibm9uZSI7CisgICAgICAgIGNhc2UgSkZGUzJfQ09NUFJfTU9ERV9QUklPUklUWToKKyAgICAgICAgICAgICAgICByZXR1cm4gInByaW9yaXR5IjsKKyAgICAgICAgY2FzZSBKRkZTMl9DT01QUl9NT0RFX1NJWkU6CisgICAgICAgICAgICAgICAgcmV0dXJuICJzaXplIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gInVua293biI7Cit9CisKK2ludCBqZmZzMl9zZXRfY29tcHJlc3Npb25fbW9kZV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpIAoreworICAgICAgICBpZiAoIXN0cmNtcCgibm9uZSIsbmFtZSkpIHsKKyAgICAgICAgICAgICAgICBqZmZzMl9jb21wcmVzc2lvbl9tb2RlID0gSkZGUzJfQ09NUFJfTU9ERV9OT05FOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGlmICghc3RyY21wKCJwcmlvcml0eSIsbmFtZSkpIHsKKyAgICAgICAgICAgICAgICBqZmZzMl9jb21wcmVzc2lvbl9tb2RlID0gSkZGUzJfQ09NUFJfTU9ERV9QUklPUklUWTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXN0cmNtcCgic2l6ZSIsbmFtZSkpIHsKKyAgICAgICAgICAgICAgICBqZmZzMl9jb21wcmVzc2lvbl9tb2RlID0gSkZGUzJfQ09NUFJfTU9ERV9TSVpFOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGpmZnMyX2NvbXByZXNzb3JfWGFibGUoY29uc3QgY2hhciAqbmFtZSwgaW50IGRpc2FibGVkKQoreworICAgICAgICBzdHJ1Y3QgamZmczJfY29tcHJlc3NvciAqdGhpczsKKyAgICAgICAgc3Bpbl9sb2NrKCZqZmZzMl9jb21wcmVzc29yX2xpc3RfbG9jayk7CisgICAgICAgIGxpc3RfZm9yX2VhY2hfZW50cnkodGhpcywgJmpmZnMyX2NvbXByZXNzb3JfbGlzdCwgbGlzdCkgeworICAgICAgICAgICAgICAgIGlmICghc3RyY21wKHRoaXMtPm5hbWUsIG5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5kaXNhYmxlZCA9IGRpc2FibGVkOworICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2soJmpmZnMyX2NvbXByZXNzb3JfbGlzdF9sb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzcGluX3VubG9jaygmamZmczJfY29tcHJlc3Nvcl9saXN0X2xvY2spOworICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJKRkZTMjogY29tcHJlc3NvciAlcyBub3QgZm91bmQuXG4iLG5hbWUpOworICAgICAgICByZXR1cm4gMTsKK30KKworaW50IGpmZnMyX2VuYWJsZV9jb21wcmVzc29yX25hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICAgICAgcmV0dXJuIGpmZnMyX2NvbXByZXNzb3JfWGFibGUobmFtZSwgMCk7Cit9CisKK2ludCBqZmZzMl9kaXNhYmxlX2NvbXByZXNzb3JfbmFtZShjb25zdCBjaGFyICpuYW1lKQoreworICAgICAgICByZXR1cm4gamZmczJfY29tcHJlc3Nvcl9YYWJsZShuYW1lLCAxKTsKK30KKworaW50IGpmZnMyX3NldF9jb21wcmVzc29yX3ByaW9yaXR5KGNvbnN0IGNoYXIgKm5hbWUsIGludCBwcmlvcml0eSkKK3sKKyAgICAgICAgc3RydWN0IGpmZnMyX2NvbXByZXNzb3IgKnRoaXMsKmNvbXA7CisgICAgICAgIHNwaW5fbG9jaygmamZmczJfY29tcHJlc3Nvcl9saXN0X2xvY2spOworICAgICAgICBsaXN0X2Zvcl9lYWNoX2VudHJ5KHRoaXMsICZqZmZzMl9jb21wcmVzc29yX2xpc3QsIGxpc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcCh0aGlzLT5uYW1lLCBuYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+cHJpb3JpdHkgPSBwcmlvcml0eTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAgPSB0aGlzOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZWluc2VydDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3Bpbl91bmxvY2soJmpmZnMyX2NvbXByZXNzb3JfbGlzdF9sb2NrKTsKKyAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiSkZGUzI6IGNvbXByZXNzb3IgJXMgbm90IGZvdW5kLlxuIixuYW1lKTsgICAgICAgIAorICAgICAgICByZXR1cm4gMTsKK3JlaW5zZXJ0OgorICAgICAgICAvKiBsaXN0IGlzIHNvcnRlZCBpbiB0aGUgb3JkZXIgb2YgcHJpb3JpdHksIHNvIGlmCisgICAgICAgICAgIHdlIGNoYW5nZSBpdCB3ZSBoYXZlIHRvIHJlaW5zZXJ0IGl0IGludG8gdGhlCisgICAgICAgICAgIGdvb2QgcGxhY2UgKi8KKyAgICAgICAgbGlzdF9kZWwoJmNvbXAtPmxpc3QpOworICAgICAgICBsaXN0X2Zvcl9lYWNoX2VudHJ5KHRoaXMsICZqZmZzMl9jb21wcmVzc29yX2xpc3QsIGxpc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAodGhpcy0+cHJpb3JpdHkgPCBjb21wLT5wcmlvcml0eSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9hZGQoJmNvbXAtPmxpc3QsIHRoaXMtPmxpc3QucHJldik7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9jaygmamZmczJfY29tcHJlc3Nvcl9saXN0X2xvY2spOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxpc3RfYWRkX3RhaWwoJmNvbXAtPmxpc3QsICZqZmZzMl9jb21wcmVzc29yX2xpc3QpOworICAgICAgICBzcGluX3VubG9jaygmamZmczJfY29tcHJlc3Nvcl9saXN0X2xvY2spOworICAgICAgICByZXR1cm4gMDsKK30KKworI2VuZGlmCisKK3ZvaWQgamZmczJfZnJlZV9jb21wcmJ1Zih1bnNpZ25lZCBjaGFyICpjb21wcmJ1ZiwgdW5zaWduZWQgY2hhciAqb3JpZykKK3sKKyAgICAgICAgaWYgKG9yaWcgIT0gY29tcHJidWYpCisgICAgICAgICAgICAgICAga2ZyZWUoY29tcHJidWYpOworfQorCitpbnQgamZmczJfY29tcHJlc3NvcnNfaW5pdCh2b2lkKSAKK3sKKy8qIFJlZ2lzdGVyaW5nIGNvbXByZXNzb3JzICovCisjaWZkZWYgQ09ORklHX0pGRlMyX1pMSUIKKyAgICAgICAgamZmczJfemxpYl9pbml0KCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSkZGUzJfUlRJTUUKKyAgICAgICAgamZmczJfcnRpbWVfaW5pdCgpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0pGRlMyX1JVQklOCisgICAgICAgIGpmZnMyX3J1YmlubWlwc19pbml0KCk7CisgICAgICAgIGpmZnMyX2R5bnJ1YmluX2luaXQoKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19KRkZTMl9MWkFSSQorICAgICAgICBqZmZzMl9semFyaV9pbml0KCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSkZGUzJfTFpPCisgICAgICAgIGpmZnMyX2x6b19pbml0KCk7CisjZW5kaWYKKy8qIFNldHRpbmcgZGVmYXVsdCBjb21wcmVzc2lvbiBtb2RlICovCisjaWZkZWYgQ09ORklHX0pGRlMyX0NNT0RFX05PTkUKKyAgICAgICAgamZmczJfY29tcHJlc3Npb25fbW9kZSA9IEpGRlMyX0NPTVBSX01PREVfTk9ORTsKKyAgICAgICAgRDEocHJpbnRrKEtFUk5fSU5GTyAiSkZGUzI6IGRlZmF1bHQgY29tcHJlc3Npb24gbW9kZTogbm9uZVxuIik7KQorI2Vsc2UKKyNpZmRlZiBDT05GSUdfSkZGUzJfQ01PREVfU0laRQorICAgICAgICBqZmZzMl9jb21wcmVzc2lvbl9tb2RlID0gSkZGUzJfQ09NUFJfTU9ERV9TSVpFOworICAgICAgICBEMShwcmludGsoS0VSTl9JTkZPICJKRkZTMjogZGVmYXVsdCBjb21wcmVzc2lvbiBtb2RlOiBzaXplXG4iKTspCisjZWxzZQorICAgICAgICBEMShwcmludGsoS0VSTl9JTkZPICJKRkZTMjogZGVmYXVsdCBjb21wcmVzc2lvbiBtb2RlOiBwcmlvcml0eVxuIik7KQorI2VuZGlmCisjZW5kaWYKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK2ludCBqZmZzMl9jb21wcmVzc29yc19leGl0KHZvaWQpIAoreworLyogVW5yZWdpc3RlcmluZyBjb21wcmVzc29ycyAqLworI2lmZGVmIENPTkZJR19KRkZTMl9MWk8KKyAgICAgICAgamZmczJfbHpvX2V4aXQoKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19KRkZTMl9MWkFSSQorICAgICAgICBqZmZzMl9semFyaV9leGl0KCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSkZGUzJfUlVCSU4KKyAgICAgICAgamZmczJfZHlucnViaW5fZXhpdCgpOworICAgICAgICBqZmZzMl9ydWJpbm1pcHNfZXhpdCgpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0pGRlMyX1JUSU1FCisgICAgICAgIGpmZnMyX3J0aW1lX2V4aXQoKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19KRkZTMl9aTElCCisgICAgICAgIGpmZnMyX3psaWJfZXhpdCgpOworI2VuZGlmCisgICAgICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMvamZmczIvY29tcHIuaCBiL2ZzL2pmZnMyL2NvbXByLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODljZWVlZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMyL2NvbXByLmgKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBKRkZTMiAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgVmVyc2lvbiAyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBGZXJlbmMgSGF2YXNpIDxoYXZhc2lAaW5mLnUtc3plZ2VkLmh1PiwKKyAqICAgICAgICAgICAgICAgICAgICBVbml2ZXJzaXR5IG9mIFN6ZWdlZCwgSHVuZ2FyeQorICoKKyAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhlIAorICogamZmczIgZGlyZWN0b3J5LgorICoKKyAqICRJZDogY29tcHIuaCx2IDEuNiAyMDA0LzA3LzE2IDE1OjE3OjU3IGR3bXcyIEV4cCAkCisgKgorICovCisKKyNpZm5kZWYgX19KRkZTMl9DT01QUl9IX18KKyNkZWZpbmUgX19KRkZTMl9DT01QUl9IX18KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2pmZnMyLmg+CisjaW5jbHVkZSA8bGludXgvamZmczJfZnNfaS5oPgorI2luY2x1ZGUgPGxpbnV4L2pmZnMyX2ZzX3NiLmg+CisjaW5jbHVkZSAibm9kZWxpc3QuaCIKKworI2RlZmluZSBKRkZTMl9SVUJJTk1JUFNfUFJJT1JJVFkgMTAKKyNkZWZpbmUgSkZGUzJfRFlOUlVCSU5fUFJJT1JJVFkgIDIwCisjZGVmaW5lIEpGRlMyX0xaQVJJX1BSSU9SSVRZICAgICAzMAorI2RlZmluZSBKRkZTMl9MWk9fUFJJT1JJVFkgICAgICAgNDAKKyNkZWZpbmUgSkZGUzJfUlRJTUVfUFJJT1JJVFkgICAgIDUwCisjZGVmaW5lIEpGRlMyX1pMSUJfUFJJT1JJVFkgICAgICA2MAorCisjZGVmaW5lIEpGRlMyX1JVQklOTUlQU19ESVNBQkxFRCAvKiBSVUJJTnMgd2lsbCBiZSB1c2VkIG9ubHkgKi8KKyNkZWZpbmUgSkZGUzJfRFlOUlVCSU5fRElTQUJMRUQgIC8qICAgICAgICBmb3IgZGVjb21wcmVzc2lvbiAqLworCisjZGVmaW5lIEpGRlMyX0NPTVBSX01PREVfTk9ORSAgICAgICAwCisjZGVmaW5lIEpGRlMyX0NPTVBSX01PREVfUFJJT1JJVFkgICAxCisjZGVmaW5lIEpGRlMyX0NPTVBSX01PREVfU0laRSAgICAgICAyCisKK3N0cnVjdCBqZmZzMl9jb21wcmVzc29yIHsKKyAgICAgICAgc3RydWN0IGxpc3RfaGVhZCBsaXN0OworICAgICAgICBpbnQgcHJpb3JpdHk7ICAgICAgICAgICAgICAvKiB1c2VkIGJ5IHByaXJvcml0eSBjb21yLiBtb2RlICovCisgICAgICAgIGNoYXIgKm5hbWU7CisgICAgICAgIGNoYXIgY29tcHI7ICAgICAgICAgICAgICAgIC8qIEpGRlMyX0NPTVBSX1hYWCAqLworICAgICAgICBpbnQgKCpjb21wcmVzcykodW5zaWduZWQgY2hhciAqZGF0YV9pbiwgdW5zaWduZWQgY2hhciAqY3BhZ2Vfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnNyY2xlbiwgdWludDMyX3QgKmRlc3RsZW4sIHZvaWQgKm1vZGVsKTsKKyAgICAgICAgaW50ICgqZGVjb21wcmVzcykodW5zaWduZWQgY2hhciAqY2RhdGFfaW4sIHVuc2lnbmVkIGNoYXIgKmRhdGFfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2RhdGFsZW4sIHVpbnQzMl90IGRhdGFsZW4sIHZvaWQgKm1vZGVsKTsKKyAgICAgICAgaW50IHVzZWNvdW50OworICAgICAgICBpbnQgZGlzYWJsZWQ7ICAgICAgICAgICAgICAvKiBpZiBzZXRlZCB0aGUgY29tcHJlc3NvciB3b24ndCBjb21wcmVzcyAqLworICAgICAgICB1bnNpZ25lZCBjaGFyICpjb21wcl9idWY7ICAvKiB1c2VkIGJ5IHNpemUgY29tcHIuIG1vZGUgKi8KKyAgICAgICAgdWludDMyX3QgY29tcHJfYnVmX3NpemU7ICAgLyogdXNlZCBieSBzaXplIGNvbXByLiBtb2RlICovCisgICAgICAgIHVpbnQzMl90IHN0YXRfY29tcHJfb3JpZ19zaXplOworICAgICAgICB1aW50MzJfdCBzdGF0X2NvbXByX25ld19zaXplOworICAgICAgICB1aW50MzJfdCBzdGF0X2NvbXByX2Jsb2NrczsKKyAgICAgICAgdWludDMyX3Qgc3RhdF9kZWNvbXByX2Jsb2NrczsKK307CisKK2ludCBqZmZzMl9yZWdpc3Rlcl9jb21wcmVzc29yKHN0cnVjdCBqZmZzMl9jb21wcmVzc29yICpjb21wKTsKK2ludCBqZmZzMl91bnJlZ2lzdGVyX2NvbXByZXNzb3Ioc3RydWN0IGpmZnMyX2NvbXByZXNzb3IgKmNvbXApOworCitpbnQgamZmczJfY29tcHJlc3NvcnNfaW5pdCh2b2lkKTsKK2ludCBqZmZzMl9jb21wcmVzc29yc19leGl0KHZvaWQpOworCit1aW50MTZfdCBqZmZzMl9jb21wcmVzcyhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGFfaW4sIHVuc2lnbmVkIGNoYXIgKipjcGFnZV9vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpkYXRhbGVuLCB1aW50MzJfdCAqY2RhdGFsZW4pOworCitpbnQgamZmczJfZGVjb21wcmVzcyhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsCisgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb21wcnR5cGUsIHVuc2lnbmVkIGNoYXIgKmNkYXRhX2luLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqZGF0YV9vdXQsIHVpbnQzMl90IGNkYXRhbGVuLCB1aW50MzJfdCBkYXRhbGVuKTsKKwordm9pZCBqZmZzMl9mcmVlX2NvbXByYnVmKHVuc2lnbmVkIGNoYXIgKmNvbXByYnVmLCB1bnNpZ25lZCBjaGFyICpvcmlnKTsKKworI2lmZGVmIENPTkZJR19KRkZTMl9QUk9DCitpbnQgamZmczJfZW5hYmxlX2NvbXByZXNzb3JfbmFtZShjb25zdCBjaGFyICpuYW1lKTsKK2ludCBqZmZzMl9kaXNhYmxlX2NvbXByZXNzb3JfbmFtZShjb25zdCBjaGFyICpuYW1lKTsKK2ludCBqZmZzMl9zZXRfY29tcHJlc3Npb25fbW9kZV9uYW1lKGNvbnN0IGNoYXIgKm1vZGVfbmFtZSk7CitjaGFyICpqZmZzMl9nZXRfY29tcHJlc3Npb25fbW9kZV9uYW1lKHZvaWQpOworaW50IGpmZnMyX3NldF9jb21wcmVzc29yX3ByaW9yaXR5KGNvbnN0IGNoYXIgKm1vZGVfbmFtZSwgaW50IHByaW9yaXR5KTsKK2NoYXIgKmpmZnMyX2xpc3RfY29tcHJlc3NvcnModm9pZCk7CitjaGFyICpqZmZzMl9zdGF0cyh2b2lkKTsKKyNlbmRpZgorCisvKiBDb21wcmVzc29yIG1vZHVsZXMgKi8KKy8qIFRoZXNlIGZ1bmN0aW9ucyB3aWxsIGJlIGNhbGxlZCBieSBqZmZzMl9jb21wcmVzc29yc19pbml0L2V4aXQgKi8KKworI2lmZGVmIENPTkZJR19KRkZTMl9SVUJJTgoraW50IGpmZnMyX3J1YmlubWlwc19pbml0KHZvaWQpOwordm9pZCBqZmZzMl9ydWJpbm1pcHNfZXhpdCh2b2lkKTsKK2ludCBqZmZzMl9keW5ydWJpbl9pbml0KHZvaWQpOwordm9pZCBqZmZzMl9keW5ydWJpbl9leGl0KHZvaWQpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0pGRlMyX1JUSU1FCitpbnQgamZmczJfcnRpbWVfaW5pdCh2b2lkKTsKK3ZvaWQgamZmczJfcnRpbWVfZXhpdCh2b2lkKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19KRkZTMl9aTElCCitpbnQgamZmczJfemxpYl9pbml0KHZvaWQpOwordm9pZCBqZmZzMl96bGliX2V4aXQodm9pZCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfSkZGUzJfTFpBUkkKK2ludCBqZmZzMl9semFyaV9pbml0KHZvaWQpOwordm9pZCBqZmZzMl9semFyaV9leGl0KHZvaWQpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0pGRlMyX0xaTworaW50IGpmZnMyX2x6b19pbml0KHZvaWQpOwordm9pZCBqZmZzMl9sem9fZXhpdCh2b2lkKTsKKyNlbmRpZgorCisjZW5kaWYgLyogX19KRkZTMl9DT01QUl9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2NvbXByX3J0aW1lLmMgYi9mcy9qZmZzMi9jb21wcl9ydGltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MzEyOTQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZmZzMi9jb21wcl9ydGltZS5jCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogSkZGUzIgLS0gSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0sIFZlcnNpb24gMi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogQ3JlYXRlZCBieSBBcmphbiB2YW4gZGUgVmVuIDxhcmphbnZAcmVkaGF0LmNvbT4KKyAqCisgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgorICoKKyAqICRJZDogY29tcHJfcnRpbWUuYyx2IDEuMTQgMjAwNC8wNi8yMyAxNjozNDo0MCBoYXZhc2kgRXhwICQKKyAqCisgKgorICogVmVyeSBzaW1wbGUgbHo3Ny1pc2ggZW5jb2Rlci4KKyAqCisgKiBUaGVvcnkgb2Ygb3BlcmF0aW9uOiBCb3RoIGVuY29kZXIgYW5kIGRlY29kZXIgaGF2ZSBhIGxpc3Qgb2YgImxhc3QKKyAqIG9jY3VycmVuY2VzIiBmb3IgZXZlcnkgcG9zc2libGUgc291cmNlLXZhbHVlOyBhZnRlciBzZW5kaW5nIHRoZQorICogZmlyc3Qgc291cmNlLWJ5dGUsIHRoZSBzZWNvbmQgYnl0ZSBpbmRpY2F0ZWQgdGhlICJydW4iIGxlbmd0aCBvZgorICogbWF0Y2hlcworICoKKyAqIFRoZSBhbGdvcml0aG0gaXMgaW50ZW5kZWQgdG8gb25seSBzZW5kICJ3aG9sZSBieXRlcyIsIG5vIGJpdC1tZXNzaW5nLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPiAKKyNpbmNsdWRlIDxsaW51eC9qZmZzMi5oPiAKKyNpbmNsdWRlICJjb21wci5oIgorCisvKiBfY29tcHJlc3MgcmV0dXJucyB0aGUgY29tcHJlc3NlZCBzaXplLCAtMSBpZiBiaWdnZXIgKi8KK3N0YXRpYyBpbnQgamZmczJfcnRpbWVfY29tcHJlc3ModW5zaWduZWQgY2hhciAqZGF0YV9pbiwKKwkJCQl1bnNpZ25lZCBjaGFyICpjcGFnZV9vdXQsCisJCQkJdWludDMyX3QgKnNvdXJjZWxlbiwgdWludDMyX3QgKmRzdGxlbiwKKwkJCQl2b2lkICptb2RlbCkKK3sKKwlzaG9ydCBwb3NpdGlvbnNbMjU2XTsKKwlpbnQgb3V0cG9zID0gMDsKKwlpbnQgcG9zPTA7CisKKwltZW1zZXQocG9zaXRpb25zLDAsc2l6ZW9mKHBvc2l0aW9ucykpOyAKKwkKKwl3aGlsZSAocG9zIDwgKCpzb3VyY2VsZW4pICYmIG91dHBvcyA8PSAoKmRzdGxlbiktMikgeworCQlpbnQgYmFja3BvcywgcnVubGVuPTA7CisJCXVuc2lnbmVkIGNoYXIgdmFsdWU7CisJCQorCQl2YWx1ZSA9IGRhdGFfaW5bcG9zXTsKKworCQljcGFnZV9vdXRbb3V0cG9zKytdID0gZGF0YV9pbltwb3MrK107CisJCQorCQliYWNrcG9zID0gcG9zaXRpb25zW3ZhbHVlXTsKKwkJcG9zaXRpb25zW3ZhbHVlXT1wb3M7CisJCQorCQl3aGlsZSAoKGJhY2twb3MgPCBwb3MpICYmIChwb3MgPCAoKnNvdXJjZWxlbikpICYmCisJCSAgICAgICAoZGF0YV9pbltwb3NdPT1kYXRhX2luW2JhY2twb3MrK10pICYmIChydW5sZW48MjU1KSkgeworCQkJcG9zKys7CisJCQlydW5sZW4rKzsKKwkJfQorCQljcGFnZV9vdXRbb3V0cG9zKytdID0gcnVubGVuOworCX0KKworCWlmIChvdXRwb3MgPj0gcG9zKSB7CisJCS8qIFdlIGZhaWxlZCAqLworCQlyZXR1cm4gLTE7CisJfQorCQorCS8qIFRlbGwgdGhlIGNhbGxlciBob3cgbXVjaCB3ZSBtYW5hZ2VkIHRvIGNvbXByZXNzLCBhbmQgaG93IG11Y2ggc3BhY2UgaXQgdG9vayAqLworCSpzb3VyY2VsZW4gPSBwb3M7CisJKmRzdGxlbiA9IG91dHBvczsKKwlyZXR1cm4gMDsKK30JCSAgIAorCisKK3N0YXRpYyBpbnQgamZmczJfcnRpbWVfZGVjb21wcmVzcyh1bnNpZ25lZCBjaGFyICpkYXRhX2luLAorCQkJCSAgdW5zaWduZWQgY2hhciAqY3BhZ2Vfb3V0LAorCQkJCSAgdWludDMyX3Qgc3JjbGVuLCB1aW50MzJfdCBkZXN0bGVuLAorCQkJCSAgdm9pZCAqbW9kZWwpCit7CisJc2hvcnQgcG9zaXRpb25zWzI1Nl07CisJaW50IG91dHBvcyA9IDA7CisJaW50IHBvcz0wOworCQorCW1lbXNldChwb3NpdGlvbnMsMCxzaXplb2YocG9zaXRpb25zKSk7IAorCQorCXdoaWxlIChvdXRwb3M8ZGVzdGxlbikgeworCQl1bnNpZ25lZCBjaGFyIHZhbHVlOworCQlpbnQgYmFja29mZnM7CisJCWludCByZXBlYXQ7CisJCQorCQl2YWx1ZSA9IGRhdGFfaW5bcG9zKytdOworCQljcGFnZV9vdXRbb3V0cG9zKytdID0gdmFsdWU7IC8qIGZpcnN0IHRoZSB2ZXJiYXRpbSBjb3BpZWQgYnl0ZSAqLworCQlyZXBlYXQgPSBkYXRhX2luW3BvcysrXTsKKwkJYmFja29mZnMgPSBwb3NpdGlvbnNbdmFsdWVdOworCQkKKwkJcG9zaXRpb25zW3ZhbHVlXT1vdXRwb3M7CisJCWlmIChyZXBlYXQpIHsKKwkJCWlmIChiYWNrb2ZmcyArIHJlcGVhdCA+PSBvdXRwb3MpIHsKKwkJCQl3aGlsZShyZXBlYXQpIHsKKwkJCQkJY3BhZ2Vfb3V0W291dHBvcysrXSA9IGNwYWdlX291dFtiYWNrb2ZmcysrXTsKKwkJCQkJcmVwZWF0LS07CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQltZW1jcHkoJmNwYWdlX291dFtvdXRwb3NdLCZjcGFnZV9vdXRbYmFja29mZnNdLHJlcGVhdCk7CisJCQkJb3V0cG9zKz1yZXBlYXQ7CQkKKwkJCX0KKwkJfQorCX0KKyAgICAgICAgcmV0dXJuIDA7Cit9CQkgICAKKworc3RhdGljIHN0cnVjdCBqZmZzMl9jb21wcmVzc29yIGpmZnMyX3J0aW1lX2NvbXAgPSB7CisgICAgLnByaW9yaXR5ID0gSkZGUzJfUlRJTUVfUFJJT1JJVFksCisgICAgLm5hbWUgPSAicnRpbWUiLAorICAgIC5jb21wciA9IEpGRlMyX0NPTVBSX1JUSU1FLAorICAgIC5jb21wcmVzcyA9ICZqZmZzMl9ydGltZV9jb21wcmVzcywKKyAgICAuZGVjb21wcmVzcyA9ICZqZmZzMl9ydGltZV9kZWNvbXByZXNzLAorI2lmZGVmIEpGRlMyX1JUSU1FX0RJU0FCTEVECisgICAgLmRpc2FibGVkID0gMSwKKyNlbHNlCisgICAgLmRpc2FibGVkID0gMCwKKyNlbmRpZgorfTsKKworaW50IGpmZnMyX3J0aW1lX2luaXQodm9pZCkKK3sKKyAgICByZXR1cm4gamZmczJfcmVnaXN0ZXJfY29tcHJlc3NvcigmamZmczJfcnRpbWVfY29tcCk7Cit9CisKK3ZvaWQgamZmczJfcnRpbWVfZXhpdCh2b2lkKQoreworICAgIGpmZnMyX3VucmVnaXN0ZXJfY29tcHJlc3NvcigmamZmczJfcnRpbWVfY29tcCk7Cit9CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9jb21wcl9ydWJpbi5jIGIvZnMvamZmczIvY29tcHJfcnViaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTBkNjYyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZmczIvY29tcHJfcnViaW4uYwpAQCAtMCwwICsxLDM3MyBAQAorLyoKKyAqIEpGRlMyIC0tIEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBWZXJzaW9uIDIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIFJlZCBIYXQsIEluYy4KKyAqCisgKiBDcmVhdGVkIGJ5IEFyamFuIHZhbiBkZSBWZW4gPGFyamFudkByZWRoYXQuY29tPgorICoKKyAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCisgKgorICogJElkOiBjb21wcl9ydWJpbi5jLHYgMS4yMCAyMDA0LzA2LzIzIDE2OjM0OjQwIGhhdmFzaSBFeHAgJAorICoKKyAqLworCisgCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9qZmZzMi5oPgorI2luY2x1ZGUgImNvbXByX3J1YmluLmgiCisjaW5jbHVkZSAiaGlzdG9fbWlwcy5oIgorI2luY2x1ZGUgImNvbXByLmgiCisKK3N0YXRpYyB2b2lkIGluaXRfcnViaW4oc3RydWN0IHJ1YmluX3N0YXRlICpycywgaW50IGRpdiwgaW50ICpiaXRzKQorewkKKwlpbnQgYzsKKworCXJzLT5xID0gMDsKKwlycy0+cCA9IChsb25nKSAoMiAqIFVQUEVSX0JJVF9SVUJJTik7CisJcnMtPmJpdF9udW1iZXIgPSAobG9uZykgMDsKKwlycy0+Yml0X2RpdmlkZXIgPSBkaXY7CisJZm9yIChjPTA7IGM8ODsgYysrKQorCQlycy0+Yml0c1tjXSA9IGJpdHNbY107Cit9CisKKworc3RhdGljIGludCBlbmNvZGUoc3RydWN0IHJ1YmluX3N0YXRlICpycywgbG9uZyBBLCBsb25nIEIsIGludCBzeW1ib2wpCit7CisKKwlsb25nIGkwLCBpMTsKKwlpbnQgcmV0OworCisJd2hpbGUgKChycy0+cSA+PSBVUFBFUl9CSVRfUlVCSU4pIHx8ICgocnMtPnAgKyBycy0+cSkgPD0gVVBQRVJfQklUX1JVQklOKSkgeworCQlycy0+Yml0X251bWJlcisrOworCQkKKwkJcmV0ID0gcHVzaGJpdCgmcnMtPnBwLCAocnMtPnEgJiBVUFBFUl9CSVRfUlVCSU4pID8gMSA6IDAsIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJcnMtPnEgJj0gTE9XRVJfQklUU19SVUJJTjsKKwkJcnMtPnEgPDw9IDE7CisJCXJzLT5wIDw8PSAxOworCX0KKwlpMCA9IEEgKiBycy0+cCAvIChBICsgQik7CisJaWYgKGkwIDw9IDApIHsKKwkJaTAgPSAxOworCX0KKwlpZiAoaTAgPj0gcnMtPnApIHsKKwkJaTAgPSBycy0+cCAtIDE7CisJfQorCWkxID0gcnMtPnAgLSBpMDsKKworCWlmIChzeW1ib2wgPT0gMCkKKwkJcnMtPnAgPSBpMDsKKwllbHNlIHsKKwkJcnMtPnAgPSBpMTsKKwkJcnMtPnEgKz0gaTA7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGVuZF9ydWJpbihzdHJ1Y3QgcnViaW5fc3RhdGUgKnJzKQorewkJCQkKKworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFJVQklOX1JFR19TSVpFOyBpKyspIHsKKwkJcHVzaGJpdCgmcnMtPnBwLCAoVVBQRVJfQklUX1JVQklOICYgcnMtPnEpID8gMSA6IDAsIDEpOworCQlycy0+cSAmPSBMT1dFUl9CSVRTX1JVQklOOworCQlycy0+cSA8PD0gMTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgaW5pdF9kZWNvZGUoc3RydWN0IHJ1YmluX3N0YXRlICpycywgaW50IGRpdiwgaW50ICpiaXRzKQoreworCWluaXRfcnViaW4ocnMsIGRpdiwgYml0cyk7CQkKKworCS8qIGJlaGFsdmUgbG93ZXIgKi8KKwlycy0+cmVjX3EgPSAwOworCisJZm9yIChycy0+Yml0X251bWJlciA9IDA7IHJzLT5iaXRfbnVtYmVyKysgPCBSVUJJTl9SRUdfU0laRTsgcnMtPnJlY19xID0gcnMtPnJlY19xICogMiArIChsb25nKSAocHVsbGJpdCgmcnMtPnBwKSkpCisJCTsKK30KKworc3RhdGljIHZvaWQgX19kb19kZWNvZGUoc3RydWN0IHJ1YmluX3N0YXRlICpycywgdW5zaWduZWQgbG9uZyBwLCB1bnNpZ25lZCBsb25nIHEpCit7CisJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyBsb3dlcl9iaXRzX3J1YmluID0gTE9XRVJfQklUU19SVUJJTjsKKwl1bnNpZ25lZCBsb25nIHJlY19xOworCWludCBjLCBiaXRzID0gMDsKKworCS8qCisJICogRmlyc3QsIHdvcmsgb3V0IGhvdyBtYW55IGJpdHMgd2UgbmVlZCBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uCisJICogTm90ZSB0aGF0IHdlIGhhdmUgYWxyZWFkeSBkb25lIHRoZSBpbml0aWFsIGNoZWNrIG9uIHRoaXMKKwkgKiBsb29wIHByaW9yIHRvIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKwkgKi8KKwlkbyB7CisJCWJpdHMrKzsKKwkJcSAmPSBsb3dlcl9iaXRzX3J1YmluOworCQlxIDw8PSAxOworCQlwIDw8PSAxOworCX0gd2hpbGUgKChxID49IFVQUEVSX0JJVF9SVUJJTikgfHwgKChwICsgcSkgPD0gVVBQRVJfQklUX1JVQklOKSk7CisKKwlycy0+cCA9IHA7CisJcnMtPnEgPSBxOworCisJcnMtPmJpdF9udW1iZXIgKz0gYml0czsKKworCS8qCisJICogTm93IGdldCB0aGUgYml0cy4gIFdlIHJlYWxseSB3YW50IHRoaXMgdG8gYmUgImdldCBuIGJpdHMiLgorCSAqLworCXJlY19xID0gcnMtPnJlY19xOworCWRvIHsKKwkJYyA9IHB1bGxiaXQoJnJzLT5wcCk7CisJCXJlY19xICY9IGxvd2VyX2JpdHNfcnViaW47CisJCXJlY19xIDw8PSAxOworCQlyZWNfcSArPSBjOworCX0gd2hpbGUgKC0tYml0cyk7CisJcnMtPnJlY19xID0gcmVjX3E7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlKHN0cnVjdCBydWJpbl9zdGF0ZSAqcnMsIGxvbmcgQSwgbG9uZyBCKQoreworCXVuc2lnbmVkIGxvbmcgcCA9IHJzLT5wLCBxID0gcnMtPnE7CisJbG9uZyBpMCwgdGhyZXNob2xkOworCWludCBzeW1ib2w7CisKKwlpZiAocSA+PSBVUFBFUl9CSVRfUlVCSU4gfHwgKChwICsgcSkgPD0gVVBQRVJfQklUX1JVQklOKSkKKwkJX19kb19kZWNvZGUocnMsIHAsIHEpOworCisJaTAgPSBBICogcnMtPnAgLyAoQSArIEIpOworCWlmIChpMCA8PSAwKSB7CisJCWkwID0gMTsKKwl9CisJaWYgKGkwID49IHJzLT5wKSB7CisJCWkwID0gcnMtPnAgLSAxOworCX0KKworCXRocmVzaG9sZCA9IHJzLT5xICsgaTA7CisJc3ltYm9sID0gcnMtPnJlY19xID49IHRocmVzaG9sZDsKKwlpZiAocnMtPnJlY19xID49IHRocmVzaG9sZCkgeworCQlycy0+cSArPSBpMDsKKwkJaTAgPSBycy0+cCAtIGkwOworCX0KKworCXJzLT5wID0gaTA7CisKKwlyZXR1cm4gc3ltYm9sOworfQorCisKKworc3RhdGljIGludCBvdXRfYnl0ZShzdHJ1Y3QgcnViaW5fc3RhdGUgKnJzLCB1bnNpZ25lZCBjaGFyIGJ5dGUpCit7CisJaW50IGksIHJldDsKKwlzdHJ1Y3QgcnViaW5fc3RhdGUgcnNfY29weTsKKwlyc19jb3B5ID0gKnJzOworCisJZm9yIChpPTA7aTw4O2krKykgeworCQlyZXQgPSBlbmNvZGUocnMsIHJzLT5iaXRfZGl2aWRlci1ycy0+Yml0c1tpXSxycy0+Yml0c1tpXSxieXRlJjEpOworCQlpZiAocmV0KSB7CisJCQkvKiBGYWlsZWQuIFJlc3RvcmUgb2xkIHN0YXRlICovCisJCQkqcnMgPSByc19jb3B5OworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlieXRlPWJ5dGU+PjE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGluX2J5dGUoc3RydWN0IHJ1YmluX3N0YXRlICpycykKK3sKKwlpbnQgaSwgcmVzdWx0ID0gMCwgYml0X2RpdmlkZXIgPSBycy0+Yml0X2RpdmlkZXI7CisKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlyZXN1bHQgfD0gZGVjb2RlKHJzLCBiaXRfZGl2aWRlciAtIHJzLT5iaXRzW2ldLCBycy0+Yml0c1tpXSkgPDwgaTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKworCitzdGF0aWMgaW50IHJ1YmluX2RvX2NvbXByZXNzKGludCBiaXRfZGl2aWRlciwgaW50ICpiaXRzLCB1bnNpZ25lZCBjaGFyICpkYXRhX2luLCAKKwkJICAgICAgdW5zaWduZWQgY2hhciAqY3BhZ2Vfb3V0LCB1aW50MzJfdCAqc291cmNlbGVuLCB1aW50MzJfdCAqZHN0bGVuKQorCXsKKwlpbnQgb3V0cG9zID0gMDsKKwlpbnQgcG9zPTA7CisJc3RydWN0IHJ1YmluX3N0YXRlIHJzOworCisJaW5pdF9wdXNocHVsbCgmcnMucHAsIGNwYWdlX291dCwgKmRzdGxlbiAqIDgsIDAsIDMyKTsKKworCWluaXRfcnViaW4oJnJzLCBiaXRfZGl2aWRlciwgYml0cyk7CisJCisJd2hpbGUgKHBvcyA8ICgqc291cmNlbGVuKSAmJiAhb3V0X2J5dGUoJnJzLCBkYXRhX2luW3Bvc10pKQorCQlwb3MrKzsKKwkKKwllbmRfcnViaW4oJnJzKTsKKworCWlmIChvdXRwb3MgPiBwb3MpIHsKKwkJLyogV2UgZmFpbGVkICovCisJCXJldHVybiAtMTsKKwl9CisJCisJLyogVGVsbCB0aGUgY2FsbGVyIGhvdyBtdWNoIHdlIG1hbmFnZWQgdG8gY29tcHJlc3MsIAorCSAqIGFuZCBob3cgbXVjaCBzcGFjZSBpdCB0b29rICovCisJCisJb3V0cG9zID0gKHB1c2hlZGJpdHMoJnJzLnBwKSs3KS84OworCQorCWlmIChvdXRwb3MgPj0gcG9zKQorCQlyZXR1cm4gLTE7IC8qIFdlIGRpZG4ndCBhY3R1YWxseSBjb21wcmVzcyAqLworCSpzb3VyY2VsZW4gPSBwb3M7CisJKmRzdGxlbiA9IG91dHBvczsKKwlyZXR1cm4gMDsKK30JCSAgIAorI2lmIDAKKy8qIF9jb21wcmVzcyByZXR1cm5zIHRoZSBjb21wcmVzc2VkIHNpemUsIC0xIGlmIGJpZ2dlciAqLworaW50IGpmZnMyX3J1YmlubWlwc19jb21wcmVzcyh1bnNpZ25lZCBjaGFyICpkYXRhX2luLCB1bnNpZ25lZCBjaGFyICpjcGFnZV9vdXQsIAorCQkgICB1aW50MzJfdCAqc291cmNlbGVuLCB1aW50MzJfdCAqZHN0bGVuLCB2b2lkICptb2RlbCkKK3sKKwlyZXR1cm4gcnViaW5fZG9fY29tcHJlc3MoQklUX0RJVklERVJfTUlQUywgYml0c19taXBzLCBkYXRhX2luLCBjcGFnZV9vdXQsIHNvdXJjZWxlbiwgZHN0bGVuKTsKK30KKyNlbmRpZgoraW50IGpmZnMyX2R5bnJ1YmluX2NvbXByZXNzKHVuc2lnbmVkIGNoYXIgKmRhdGFfaW4sIHVuc2lnbmVkIGNoYXIgKmNwYWdlX291dCwgCisJCSAgIHVpbnQzMl90ICpzb3VyY2VsZW4sIHVpbnQzMl90ICpkc3RsZW4sIHZvaWQgKm1vZGVsKQoreworCWludCBiaXRzWzhdOworCXVuc2lnbmVkIGNoYXIgaGlzdG9bMjU2XTsKKwlpbnQgaTsKKwlpbnQgcmV0OworCXVpbnQzMl90IG15c3JjbGVuLCBteWRzdGxlbjsKKworCW15c3JjbGVuID0gKnNvdXJjZWxlbjsKKwlteWRzdGxlbiA9ICpkc3RsZW4gLSA4OworCisJaWYgKCpkc3RsZW4gPD0gMTIpCisJCXJldHVybiAtMTsKKworCW1lbXNldChoaXN0bywgMCwgMjU2KTsKKwlmb3IgKGk9MDsgaTxteXNyY2xlbjsgaSsrKSB7CisJCWhpc3RvW2RhdGFfaW5baV1dKys7CisJfQorCW1lbXNldChiaXRzLCAwLCBzaXplb2YoaW50KSo4KTsKKwlmb3IgKGk9MDsgaTwyNTY7IGkrKykgeworCQlpZiAoaSYxMjgpCisJCQliaXRzWzddICs9IGhpc3RvW2ldOworCQlpZiAoaSY2NCkKKwkJCWJpdHNbNl0gKz0gaGlzdG9baV07CisJCWlmIChpJjMyKQorCQkJYml0c1s1XSArPSBoaXN0b1tpXTsKKwkJaWYgKGkmMTYpCisJCQliaXRzWzRdICs9IGhpc3RvW2ldOworCQlpZiAoaSY4KQorCQkJYml0c1szXSArPSBoaXN0b1tpXTsKKwkJaWYgKGkmNCkKKwkJCWJpdHNbMl0gKz0gaGlzdG9baV07CisJCWlmIChpJjIpCisJCQliaXRzWzFdICs9IGhpc3RvW2ldOworCQlpZiAoaSYxKQorCQkJYml0c1swXSArPSBoaXN0b1tpXTsKKwl9CisKKwlmb3IgKGk9MDsgaTw4OyBpKyspIHsKKwkJYml0c1tpXSA9IChiaXRzW2ldICogMjU2KSAvIG15c3JjbGVuOworCQlpZiAoIWJpdHNbaV0pIGJpdHNbaV0gPSAxOworCQlpZiAoYml0c1tpXSA+IDI1NSkgYml0c1tpXSA9IDI1NTsKKwkJY3BhZ2Vfb3V0W2ldID0gYml0c1tpXTsKKwl9CisKKwlyZXQgPSBydWJpbl9kb19jb21wcmVzcygyNTYsIGJpdHMsIGRhdGFfaW4sIGNwYWdlX291dCs4LCAmbXlzcmNsZW4sICZteWRzdGxlbik7CisJaWYgKHJldCkgCisJCXJldHVybiByZXQ7CisKKwkvKiBBZGQgYmFjayB0aGUgOCBieXRlcyB3ZSB0b29rIGZvciB0aGUgcHJvYmFiaWxpdGllcyAqLworCW15ZHN0bGVuICs9IDg7CisKKwlpZiAobXlzcmNsZW4gPD0gbXlkc3RsZW4pIHsKKwkJLyogV2UgY29tcHJlc3NlZCAqLworCQlyZXR1cm4gLTE7CisJfQorCisJKnNvdXJjZWxlbiA9IG15c3JjbGVuOworCSpkc3RsZW4gPSBteWRzdGxlbjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcnViaW5fZG9fZGVjb21wcmVzcyhpbnQgYml0X2RpdmlkZXIsIGludCAqYml0cywgdW5zaWduZWQgY2hhciAqY2RhdGFfaW4sIAorCQkJIHVuc2lnbmVkIGNoYXIgKnBhZ2Vfb3V0LCB1aW50MzJfdCBzcmNsZW4sIHVpbnQzMl90IGRlc3RsZW4pCit7CisJaW50IG91dHBvcyA9IDA7CisJc3RydWN0IHJ1YmluX3N0YXRlIHJzOworCQorCWluaXRfcHVzaHB1bGwoJnJzLnBwLCBjZGF0YV9pbiwgc3JjbGVuLCAwLCAwKTsKKwlpbml0X2RlY29kZSgmcnMsIGJpdF9kaXZpZGVyLCBiaXRzKTsKKwkKKwl3aGlsZSAob3V0cG9zIDwgZGVzdGxlbikgeworCQlwYWdlX291dFtvdXRwb3MrK10gPSBpbl9ieXRlKCZycyk7CisJfQorfQkJICAgCisKKworaW50IGpmZnMyX3J1YmlubWlwc19kZWNvbXByZXNzKHVuc2lnbmVkIGNoYXIgKmRhdGFfaW4sIHVuc2lnbmVkIGNoYXIgKmNwYWdlX291dCwgCisJCSAgIHVpbnQzMl90IHNvdXJjZWxlbiwgdWludDMyX3QgZHN0bGVuLCB2b2lkICptb2RlbCkKK3sKKwlydWJpbl9kb19kZWNvbXByZXNzKEJJVF9ESVZJREVSX01JUFMsIGJpdHNfbWlwcywgZGF0YV9pbiwgY3BhZ2Vfb3V0LCBzb3VyY2VsZW4sIGRzdGxlbik7CisgICAgICAgIHJldHVybiAwOworfQorCitpbnQgamZmczJfZHlucnViaW5fZGVjb21wcmVzcyh1bnNpZ25lZCBjaGFyICpkYXRhX2luLCB1bnNpZ25lZCBjaGFyICpjcGFnZV9vdXQsIAorCQkgICB1aW50MzJfdCBzb3VyY2VsZW4sIHVpbnQzMl90IGRzdGxlbiwgdm9pZCAqbW9kZWwpCit7CisJaW50IGJpdHNbOF07CisJaW50IGM7CisKKwlmb3IgKGM9MDsgYzw4OyBjKyspCisJCWJpdHNbY10gPSBkYXRhX2luW2NdOworCisJcnViaW5fZG9fZGVjb21wcmVzcygyNTYsIGJpdHMsIGRhdGFfaW4rOCwgY3BhZ2Vfb3V0LCBzb3VyY2VsZW4tOCwgZHN0bGVuKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgamZmczJfY29tcHJlc3NvciBqZmZzMl9ydWJpbm1pcHNfY29tcCA9IHsKKyAgICAucHJpb3JpdHkgPSBKRkZTMl9SVUJJTk1JUFNfUFJJT1JJVFksCisgICAgLm5hbWUgPSAicnViaW5taXBzIiwKKyAgICAuY29tcHIgPSBKRkZTMl9DT01QUl9EWU5SVUJJTiwKKyAgICAuY29tcHJlc3MgPSBOVUxMLCAvKiZqZmZzMl9ydWJpbm1pcHNfY29tcHJlc3MsKi8KKyAgICAuZGVjb21wcmVzcyA9ICZqZmZzMl9ydWJpbm1pcHNfZGVjb21wcmVzcywKKyNpZmRlZiBKRkZTMl9SVUJJTk1JUFNfRElTQUJMRUQKKyAgICAuZGlzYWJsZWQgPSAxLAorI2Vsc2UKKyAgICAuZGlzYWJsZWQgPSAwLAorI2VuZGlmCit9OworCitpbnQgamZmczJfcnViaW5taXBzX2luaXQodm9pZCkKK3sKKyAgICByZXR1cm4gamZmczJfcmVnaXN0ZXJfY29tcHJlc3NvcigmamZmczJfcnViaW5taXBzX2NvbXApOworfQorCit2b2lkIGpmZnMyX3J1YmlubWlwc19leGl0KHZvaWQpCit7CisgICAgamZmczJfdW5yZWdpc3Rlcl9jb21wcmVzc29yKCZqZmZzMl9ydWJpbm1pcHNfY29tcCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgamZmczJfY29tcHJlc3NvciBqZmZzMl9keW5ydWJpbl9jb21wID0geworICAgIC5wcmlvcml0eSA9IEpGRlMyX0RZTlJVQklOX1BSSU9SSVRZLAorICAgIC5uYW1lID0gImR5bnJ1YmluIiwKKyAgICAuY29tcHIgPSBKRkZTMl9DT01QUl9SVUJJTk1JUFMsCisgICAgLmNvbXByZXNzID0gamZmczJfZHlucnViaW5fY29tcHJlc3MsCisgICAgLmRlY29tcHJlc3MgPSAmamZmczJfZHlucnViaW5fZGVjb21wcmVzcywKKyNpZmRlZiBKRkZTMl9EWU5SVUJJTl9ESVNBQkxFRAorICAgIC5kaXNhYmxlZCA9IDEsCisjZWxzZQorICAgIC5kaXNhYmxlZCA9IDAsCisjZW5kaWYKK307CisKK2ludCBqZmZzMl9keW5ydWJpbl9pbml0KHZvaWQpCit7CisgICAgcmV0dXJuIGpmZnMyX3JlZ2lzdGVyX2NvbXByZXNzb3IoJmpmZnMyX2R5bnJ1YmluX2NvbXApOworfQorCit2b2lkIGpmZnMyX2R5bnJ1YmluX2V4aXQodm9pZCkKK3sKKyAgICBqZmZzMl91bnJlZ2lzdGVyX2NvbXByZXNzb3IoJmpmZnMyX2R5bnJ1YmluX2NvbXApOworfQpkaWZmIC0tZ2l0IGEvZnMvamZmczIvY29tcHJfcnViaW4uaCBiL2ZzL2pmZnMyL2NvbXByX3J1YmluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y1MWUzNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMyL2NvbXByX3J1YmluLmgKQEAgLTAsMCArMSwyMSBAQAorLyogUnViaW4gZW5jb2Rlci9kZWNvZGVyIGhlYWRlciAgICAgICAqLworLyogd29yayBzdGFydGVkIGF0ICAgOiBhdWcgICAzLCAxOTk0ICAqLworLyogbGFzdCBtb2RpZmljYXRpb24gOiBhdWcgIDE1LCAxOTk0ICAqLworLyogJElkOiBjb21wcl9ydWJpbi5oLHYgMS42IDIwMDIvMDEvMjUgMDE6NDk6MjYgZHdtdzIgRXhwICQgKi8KKworI2luY2x1ZGUgInB1c2hwdWxsLmgiCisKKyNkZWZpbmUgUlVCSU5fUkVHX1NJWkUgICAxNgorI2RlZmluZSBVUFBFUl9CSVRfUlVCSU4gICAgKCgobG9uZykgMSk8PChSVUJJTl9SRUdfU0laRS0xKSkKKyNkZWZpbmUgTE9XRVJfQklUU19SVUJJTiAgICgoKChsb25nKSAxKTw8KFJVQklOX1JFR19TSVpFLTEpKS0xKQorCisKK3N0cnVjdCBydWJpbl9zdGF0ZSB7CisJdW5zaWduZWQgbG9uZyBwOwkJCisJdW5zaWduZWQgbG9uZyBxOwkKKwl1bnNpZ25lZCBsb25nIHJlY19xOworCWxvbmcgYml0X251bWJlcjsKKwlzdHJ1Y3QgcHVzaHB1bGwgcHA7CisJaW50IGJpdF9kaXZpZGVyOworCWludCBiaXRzWzhdOworfTsKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2NvbXByX3psaWIuYyBiL2ZzL2pmZnMyL2NvbXByX3psaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Zjk5MzJjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZmczIvY29tcHJfemxpYi5jCkBAIC0wLDAgKzEsMjE4IEBACisvKgorICogSkZGUzIgLS0gSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0sIFZlcnNpb24gMi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CisgKgorICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KKyAqCisgKiAkSWQ6IGNvbXByX3psaWIuYyx2IDEuMjkgMjAwNC8xMS8xNiAyMDozNjoxMSBkd213MiBFeHAgJAorICoKKyAqLworCisjaWYgIWRlZmluZWQoX19LRVJORUxfXykgJiYgIWRlZmluZWQoX19FQ09TKQorI2Vycm9yICJUaGUgdXNlcnNwYWNlIHN1cHBvcnQgZ290IHRvbyBtZXNzeSBhbmQgd2FzIHJlbW92ZWQuIFVwZGF0ZSB5b3VyIG1rZnMuamZmczIiCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC96bGliLmg+CisjaW5jbHVkZSA8bGludXgvenV0aWwuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSAibm9kZWxpc3QuaCIKKyNpbmNsdWRlICJjb21wci5oIgorCisJLyogUGxhbjogY2FsbCBkZWZsYXRlKCkgd2l0aCBhdmFpbF9pbiA9PSAqc291cmNlbGVuLCAKKwkJYXZhaWxfb3V0ID0gKmRzdGxlbiAtIDEyIGFuZCBmbHVzaCA9PSBaX0ZJTklTSC4gCisJCUlmIGl0IGRvZXNuJ3QgbWFuYWdlIHRvIGZpbmlzaCwJY2FsbCBpdCBhZ2FpbiB3aXRoCisJCWF2YWlsX2luID09IDAgYW5kIGF2YWlsX291dCBzZXQgdG8gdGhlIHJlbWFpbmluZyAxMgorCQlieXRlcyBmb3IgaXQgdG8gY2xlYW4gdXAuIAorCSAgIFE6IElzIDEyIGJ5dGVzIHN1ZmZpY2llbnQ/CisJKi8KKyNkZWZpbmUgU1RSRUFNX0VORF9TUEFDRSAxMgorCitzdGF0aWMgREVDTEFSRV9NVVRFWChkZWZsYXRlX3NlbSk7CitzdGF0aWMgREVDTEFSRV9NVVRFWChpbmZsYXRlX3NlbSk7CitzdGF0aWMgel9zdHJlYW0gaW5mX3N0cm0sIGRlZl9zdHJtOworCisjaWZkZWYgX19LRVJORUxfXyAvKiBMaW51eC1vbmx5ICovCisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworc3RhdGljIGludCBfX2luaXQgYWxsb2Nfd29ya3NwYWNlcyh2b2lkKQoreworCWRlZl9zdHJtLndvcmtzcGFjZSA9IHZtYWxsb2MoemxpYl9kZWZsYXRlX3dvcmtzcGFjZXNpemUoKSk7CisJaWYgKCFkZWZfc3RybS53b3Jrc3BhY2UpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRmFpbGVkIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZvciBkZWZsYXRlIHdvcmtzcGFjZVxuIiwgemxpYl9kZWZsYXRlX3dvcmtzcGFjZXNpemUoKSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlEMShwcmludGsoS0VSTl9ERUJVRyAiQWxsb2NhdGVkICVkIGJ5dGVzIGZvciBkZWZsYXRlIHdvcmtzcGFjZVxuIiwgemxpYl9kZWZsYXRlX3dvcmtzcGFjZXNpemUoKSkpOworCWluZl9zdHJtLndvcmtzcGFjZSA9IHZtYWxsb2MoemxpYl9pbmZsYXRlX3dvcmtzcGFjZXNpemUoKSk7CisJaWYgKCFpbmZfc3RybS53b3Jrc3BhY2UpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRmFpbGVkIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZvciBpbmZsYXRlIHdvcmtzcGFjZVxuIiwgemxpYl9pbmZsYXRlX3dvcmtzcGFjZXNpemUoKSk7CisJCXZmcmVlKGRlZl9zdHJtLndvcmtzcGFjZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlEMShwcmludGsoS0VSTl9ERUJVRyAiQWxsb2NhdGVkICVkIGJ5dGVzIGZvciBpbmZsYXRlIHdvcmtzcGFjZVxuIiwgemxpYl9pbmZsYXRlX3dvcmtzcGFjZXNpemUoKSkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3dvcmtzcGFjZXModm9pZCkKK3sKKwl2ZnJlZShkZWZfc3RybS53b3Jrc3BhY2UpOworCXZmcmVlKGluZl9zdHJtLndvcmtzcGFjZSk7Cit9CisjZWxzZQorI2RlZmluZSBhbGxvY193b3Jrc3BhY2VzKCkgKDApCisjZGVmaW5lIGZyZWVfd29ya3NwYWNlcygpIGRvIHsgfSB3aGlsZSgwKQorI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworaW50IGpmZnMyX3psaWJfY29tcHJlc3ModW5zaWduZWQgY2hhciAqZGF0YV9pbiwgdW5zaWduZWQgY2hhciAqY3BhZ2Vfb3V0LCAKKwkJICAgdWludDMyX3QgKnNvdXJjZWxlbiwgdWludDMyX3QgKmRzdGxlbiwgdm9pZCAqbW9kZWwpCit7CisJaW50IHJldDsKKworCWlmICgqZHN0bGVuIDw9IFNUUkVBTV9FTkRfU1BBQ0UpCisJCXJldHVybiAtMTsKKworCWRvd24oJmRlZmxhdGVfc2VtKTsKKworCWlmIChaX09LICE9IHpsaWJfZGVmbGF0ZUluaXQoJmRlZl9zdHJtLCAzKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJkZWZsYXRlSW5pdCBmYWlsZWRcbiIpOworCQl1cCgmZGVmbGF0ZV9zZW0pOworCQlyZXR1cm4gLTE7CisJfQorCisJZGVmX3N0cm0ubmV4dF9pbiA9IGRhdGFfaW47CisJZGVmX3N0cm0udG90YWxfaW4gPSAwOworCQorCWRlZl9zdHJtLm5leHRfb3V0ID0gY3BhZ2Vfb3V0OworCWRlZl9zdHJtLnRvdGFsX291dCA9IDA7CisKKwl3aGlsZSAoZGVmX3N0cm0udG90YWxfb3V0IDwgKmRzdGxlbiAtIFNUUkVBTV9FTkRfU1BBQ0UgJiYgZGVmX3N0cm0udG90YWxfaW4gPCAqc291cmNlbGVuKSB7CisJCWRlZl9zdHJtLmF2YWlsX291dCA9ICpkc3RsZW4gLSAoZGVmX3N0cm0udG90YWxfb3V0ICsgU1RSRUFNX0VORF9TUEFDRSk7CisJCWRlZl9zdHJtLmF2YWlsX2luID0gbWluKCh1bnNpZ25lZCkoKnNvdXJjZWxlbi1kZWZfc3RybS50b3RhbF9pbiksIGRlZl9zdHJtLmF2YWlsX291dCk7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJjYWxsaW5nIGRlZmxhdGUgd2l0aCBhdmFpbF9pbiAlZCwgYXZhaWxfb3V0ICVkXG4iLAorCQkJICBkZWZfc3RybS5hdmFpbF9pbiwgZGVmX3N0cm0uYXZhaWxfb3V0KSk7CisJCXJldCA9IHpsaWJfZGVmbGF0ZSgmZGVmX3N0cm0sIFpfUEFSVElBTF9GTFVTSCk7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJkZWZsYXRlIHJldHVybmVkIHdpdGggYXZhaWxfaW4gJWQsIGF2YWlsX291dCAlZCwgdG90YWxfaW4gJWxkLCB0b3RhbF9vdXQgJWxkXG4iLCAKKwkJCSAgZGVmX3N0cm0uYXZhaWxfaW4sIGRlZl9zdHJtLmF2YWlsX291dCwgZGVmX3N0cm0udG90YWxfaW4sIGRlZl9zdHJtLnRvdGFsX291dCkpOworCQlpZiAocmV0ICE9IFpfT0spIHsKKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJkZWZsYXRlIGluIGxvb3AgcmV0dXJuZWQgJWRcbiIsIHJldCkpOworCQkJemxpYl9kZWZsYXRlRW5kKCZkZWZfc3RybSk7CisJCQl1cCgmZGVmbGF0ZV9zZW0pOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCWRlZl9zdHJtLmF2YWlsX291dCArPSBTVFJFQU1fRU5EX1NQQUNFOworCWRlZl9zdHJtLmF2YWlsX2luID0gMDsKKwlyZXQgPSB6bGliX2RlZmxhdGUoJmRlZl9zdHJtLCBaX0ZJTklTSCk7CisJemxpYl9kZWZsYXRlRW5kKCZkZWZfc3RybSk7CisKKwlpZiAocmV0ICE9IFpfU1RSRUFNX0VORCkgeworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiZmluYWwgZGVmbGF0ZSByZXR1cm5lZCAlZFxuIiwgcmV0KSk7CisJCXJldCA9IC0xOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoZGVmX3N0cm0udG90YWxfb3V0ID49IGRlZl9zdHJtLnRvdGFsX2luKSB7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJ6bGliIGNvbXByZXNzZWQgJWxkIGJ5dGVzIGludG8gJWxkOyBmYWlsaW5nXG4iLAorCQkJICBkZWZfc3RybS50b3RhbF9pbiwgZGVmX3N0cm0udG90YWxfb3V0KSk7CisJCXJldCA9IC0xOworCQlnb3RvIG91dDsKKwl9CisKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiemxpYiBjb21wcmVzc2VkICVsZCBieXRlcyBpbnRvICVsZFxuIiwKKwkJICBkZWZfc3RybS50b3RhbF9pbiwgZGVmX3N0cm0udG90YWxfb3V0KSk7CisKKwkqZHN0bGVuID0gZGVmX3N0cm0udG90YWxfb3V0OworCSpzb3VyY2VsZW4gPSBkZWZfc3RybS50b3RhbF9pbjsKKwlyZXQgPSAwOworIG91dDoKKwl1cCgmZGVmbGF0ZV9zZW0pOworCXJldHVybiByZXQ7Cit9CisKK2ludCBqZmZzMl96bGliX2RlY29tcHJlc3ModW5zaWduZWQgY2hhciAqZGF0YV9pbiwgdW5zaWduZWQgY2hhciAqY3BhZ2Vfb3V0LAorCQkgICAgICB1aW50MzJfdCBzcmNsZW4sIHVpbnQzMl90IGRlc3RsZW4sIHZvaWQgKm1vZGVsKQoreworCWludCByZXQ7CisJaW50IHdiaXRzID0gTUFYX1dCSVRTOworCisJZG93bigmaW5mbGF0ZV9zZW0pOworCisJaW5mX3N0cm0ubmV4dF9pbiA9IGRhdGFfaW47CisJaW5mX3N0cm0uYXZhaWxfaW4gPSBzcmNsZW47CisJaW5mX3N0cm0udG90YWxfaW4gPSAwOworCQorCWluZl9zdHJtLm5leHRfb3V0ID0gY3BhZ2Vfb3V0OworCWluZl9zdHJtLmF2YWlsX291dCA9IGRlc3RsZW47CisJaW5mX3N0cm0udG90YWxfb3V0ID0gMDsKKworCS8qIElmIGl0J3MgZGVmbGF0ZSwgYW5kIGl0J3MgZ290IG5vIHByZXNldCBkaWN0aW9uYXJ5LCB0aGVuCisJICAgd2UgY2FuIHRlbGwgemxpYiB0byBza2lwIHRoZSBhZGxlcjMyIGNoZWNrLiAqLworCWlmIChzcmNsZW4gPiAyICYmICEoZGF0YV9pblsxXSAmIFBSRVNFVF9ESUNUKSAmJgorCSAgICAoKGRhdGFfaW5bMF0gJiAweDBmKSA9PSBaX0RFRkxBVEVEKSAmJgorCSAgICAhKCgoZGF0YV9pblswXTw8OCkgKyBkYXRhX2luWzFdKSAlIDMxKSkgeworCisJCUQyKHByaW50ayhLRVJOX0RFQlVHICJpbmZsYXRlIHNraXBwaW5nIGFkbGVyMzJcbiIpKTsKKwkJd2JpdHMgPSAtKChkYXRhX2luWzBdID4+IDQpICsgOCk7CisJCWluZl9zdHJtLm5leHRfaW4gKz0gMjsKKwkJaW5mX3N0cm0uYXZhaWxfaW4gLT0gMjsKKwl9IGVsc2UgeworCQkvKiBMZXQgdGhpcyByZW1haW4gRDEgZm9yIG5vdyAtLSBpdCBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJpbmZsYXRlIG5vdCBza2lwcGluZyBhZGxlcjMyXG4iKSk7CisJfQorCisKKwlpZiAoWl9PSyAhPSB6bGliX2luZmxhdGVJbml0MigmaW5mX3N0cm0sIHdiaXRzKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJpbmZsYXRlSW5pdCBmYWlsZWRcbiIpOworCQl1cCgmaW5mbGF0ZV9zZW0pOworCQlyZXR1cm4gMTsKKwl9CisKKwl3aGlsZSgocmV0ID0gemxpYl9pbmZsYXRlKCZpbmZfc3RybSwgWl9GSU5JU0gpKSA9PSBaX09LKQorCQk7CisJaWYgKHJldCAhPSBaX1NUUkVBTV9FTkQpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJpbmZsYXRlIHJldHVybmVkICVkXG4iLCByZXQpOworCX0KKwl6bGliX2luZmxhdGVFbmQoJmluZl9zdHJtKTsKKwl1cCgmaW5mbGF0ZV9zZW0pOworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBqZmZzMl9jb21wcmVzc29yIGpmZnMyX3psaWJfY29tcCA9IHsKKyAgICAucHJpb3JpdHkgPSBKRkZTMl9aTElCX1BSSU9SSVRZLAorICAgIC5uYW1lID0gInpsaWIiLAorICAgIC5jb21wciA9IEpGRlMyX0NPTVBSX1pMSUIsCisgICAgLmNvbXByZXNzID0gJmpmZnMyX3psaWJfY29tcHJlc3MsCisgICAgLmRlY29tcHJlc3MgPSAmamZmczJfemxpYl9kZWNvbXByZXNzLAorI2lmZGVmIEpGRlMyX1pMSUJfRElTQUJMRUQKKyAgICAuZGlzYWJsZWQgPSAxLAorI2Vsc2UKKyAgICAuZGlzYWJsZWQgPSAwLAorI2VuZGlmCit9OworCitpbnQgX19pbml0IGpmZnMyX3psaWJfaW5pdCh2b2lkKQoreworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBhbGxvY193b3Jrc3BhY2VzKCk7CisgICAgaWYgKHJldCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldCA9IGpmZnMyX3JlZ2lzdGVyX2NvbXByZXNzb3IoJmpmZnMyX3psaWJfY29tcCk7CisgICAgaWYgKHJldCkKKyAgICAgICAgZnJlZV93b3Jrc3BhY2VzKCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIGpmZnMyX3psaWJfZXhpdCh2b2lkKQoreworICAgIGpmZnMyX3VucmVnaXN0ZXJfY29tcHJlc3NvcigmamZmczJfemxpYl9jb21wKTsKKyAgICBmcmVlX3dvcmtzcGFjZXMoKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2NvbXBydGVzdC5jIGIvZnMvamZmczIvY29tcHJ0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y1MWYwOQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMyL2NvbXBydGVzdC5jCkBAIC0wLDAgKzEsMzA3IEBACisvKiAkSWQ6IGNvbXBydGVzdC5jLHYgMS41IDIwMDIvMDEvMDMgMTU6MjA6NDQgZHdtdzIgRXhwICQgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2lmIDAKKyNkZWZpbmUgVEVTVERBVEFfTEVOIDUxMgorc3RhdGljIHVuc2lnbmVkIGNoYXIgdGVzdGRhdGFbVEVTVERBVEFfTEVOXSA9IHsKKyAweDdmLCAweDQ1LCAweDRjLCAweDQ2LCAweDAxLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDIsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NjAsIDB4ODMsIDB4MDQsIDB4MDgsIDB4MzQsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHhiMCwgMHgyOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzNCwgMHgwMCwgMHgyMCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgyOCwgMHgwMCwKKyAweDFlLCAweDAwLCAweDFiLCAweDAwLCAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDM0LCAweDAwLCAweDAwLCAweDAwLCAweDM0LCAweDgwLCAweDA0LCAweDA4LAorIDB4MzQsIDB4ODAsIDB4MDQsIDB4MDgsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHhmNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmNCwgMHg4MCwgMHgwNCwgMHgwOCwKKyAweGY0LCAweDgwLCAweDA0LCAweDA4LCAweDEzLCAweDAwLCAweDAwLCAweDAwLCAweDEzLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLAorIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDQsIDB4MDgsCisgMHgwMCwgMHg4MCwgMHgwNCwgMHgwOCwgMHgwZCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwZCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDA1LCAweDAwLCAweDAwLCAweDEwLCAweDk1LCAweDA0LCAweDA4LAorIDB4MTAsIDB4OTUsIDB4MDQsIDB4MDgsIDB4ZTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1OCwgMHgwNSwgMHgwMCwgMHgwMCwgMHg1OCwgMHg5NSwgMHgwNCwgMHgwOCwKKyAweDU4LCAweDk1LCAweDA0LCAweDA4LCAweGEwLCAweDAwLCAweDAwLCAweDAwLCAweGEwLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDAwLCAweDAwLCAweDAwLAorIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDgsIDB4ODEsIDB4MDQsIDB4MDgsCisgMHgwOCwgMHg4MSwgMHgwNCwgMHgwOCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDJmLCAweDZjLCAweDY5LCAweDYyLCAweDJmLCAweDZjLCAweDY0LCAweDJkLCAweDZjLCAweDY5LCAweDZlLCAweDc1LAorIDB4NzgsIDB4MmUsIDB4NzMsIDB4NmYsIDB4MmUsIDB4MzIsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NywgMHg0ZSwgMHg1NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweDAwLCAweDAwLAorIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NjksIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwYywgMHg4MywgMHgwNCwgMHgwOCwgMHg4MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDFjLCAweDgzLCAweDA0LCAweDA4LCAweGFjLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDU3LCAweDAwLCAweDAwLCAweDAwLAorIDB4MmMsIDB4ODMsIDB4MDQsIDB4MDgsIDB4ZGQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MWEsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgzYywgMHg4MywgMHgwNCwgMHgwOCwgMHgyZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMSwgMHgwMCwgMHgwMCwgMHgwMCwKKyAweDRjLCAweDgzLCAweDA0LCAweDA4LCAweDdkLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDQ4LCAweDAwLCAweDAwLCAweDAwLAorIDB4MDAsIDB4ODUsIDB4MDQsIDB4MDgsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MDAsIDB4MGUsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCisgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1ZiwgMHg1ZiwgMHg2NywKKyAweDZkLCAweDZmLCAweDZlLCAweDVmLCAweDczLCAweDc0LCAweDYxLCAweDcyLCAweDc0LCAweDVmLCAweDVmLCAweDAwLCAweDZjLCAweDY5LCAweDYyLCAweDYzLAorIDB4MmUsIDB4NzMsIDB4NmYsIDB4MmUsIDB4MzYsIDB4MDAsIDB4NzAsIDB4NzIsIDB4NjksIDB4NmUsIDB4NzQsIDB4NjYsIDB4MDAsIDB4NWYsIDB4NWYsIDB4NjN9OworI2Vsc2UKKyNkZWZpbmUgVEVTVERBVEFfTEVOIDM0ODEKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHRlc3RkYXRhW1RFU1REQVRBX0xFTl0gPSB7CisgMHgyMywgMHg2OSwgMHg2ZSwgMHg2MywgMHg2YywgMHg3NSwgMHg2NCwgMHg2NSwgMHgyMCwgMHgyMiwgMHg2NCwgMHg2MiwgMHg2NSwgMHg2ZSwgMHg2MywgMHg2OCwKKyAweDJlLCAweDY4LCAweDIyLCAweDBhLCAweDBhLCAweDIzLCAweDY0LCAweDY1LCAweDY2LCAweDY5LCAweDZlLCAweDY1LCAweDIwLCAweDRkLCAweDQxLCAweDU4LAorIDB4NWYsIDB4NDYsIDB4NDksIDB4NGMsIDB4NDUsIDB4NTMsIDB4MjAsIDB4MzEsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MGEsIDB4MGEsIDB4NzMsIDB4NzQsIDB4NjEsCisgMHg3NCwgMHg2OSwgMHg2MywgMHgyMCwgMHg2MywgMHg2OCwgMHg2MSwgMHg3MiwgMHgyMCwgMHg2MiwgMHg3NSwgMHg2NiwgMHg1YiwgMHgzNywgMHgzMCwgMHgzMCwKKyAweDMwLCAweDMwLCAweDVkLCAweDNiLCAweDBhLCAweDY1LCAweDc4LCAweDc0LCAweDY1LCAweDcyLCAweDZlLCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDIwLAorIDB4NmMsIDB4NjksIDB4NmUsIDB4NjUsIDB4NWYsIDB4NjMsIDB4NmYsIDB4NzUsIDB4NmUsIDB4NzQsIDB4M2IsIDB4MGEsIDB4MGEsIDB4NzMsIDB4NzQsIDB4NjEsCisgMHg3NCwgMHg2OSwgMHg2MywgMHgyMCwgMHg3MywgMHg3NCwgMHg3MiwgMHg3NSwgMHg2MywgMHg3NCwgMHgyMCwgMHg3YiwgMHgwYSwgMHgwOSwgMHg2OSwgMHg2ZSwKKyAweDc0LCAweDIwLCAweDY2LCAweDY0LCAweDNiLCAweDBhLCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY4LCAweDYxLCAweDZlLCAweDY0LCAweDZjLAorIDB4NjUsIDB4M2IsIDB4MGEsIDB4N2QsIDB4MjAsIDB4NjYsIDB4NzQsIDB4NjEsIDB4NjIsIDB4NmMsIDB4NjUsIDB4NWIsIDB4NGQsIDB4NDEsIDB4NTgsIDB4NWYsCisgMHg0NiwgMHg0OSwgMHg0YywgMHg0NSwgMHg1MywgMHg1ZCwgMHgzYiwgMHgwYSwgMHgwYSwgMHg3NiwgMHg2ZiwgMHg2OSwgMHg2NCwgMHgyMCwgMHg2NCwgMHg2ZiwKKyAweDVmLCAweDc1LCAweDZlLCAweDZjLCAweDY5LCAweDZlLCAweDZiLCAweDI4LCAweDYzLCAweDY4LCAweDYxLCAweDcyLCAweDIwLCAweDJhLCAweDY2LCAweDZlLAorIDB4NjEsIDB4NmQsIDB4NjUsIDB4MjksIDB4MGEsIDB4N2IsIDB4MGEsIDB4MDksIDB4NzMsIDB4NzQsIDB4NzIsIDB4NzUsIDB4NzAsIDB4NzAsIDB4NjUsIDB4NzIsCisgMHgyOCwgMHg2NiwgMHg2ZSwgMHg2MSwgMHg2ZCwgMHg2NSwgMHgyOSwgMHgzYiwgMHgwYSwgMHgwYSwgMHgwOSwgMHg2OSwgMHg2NiwgMHgyMCwgMHgyOCwgMHg3NSwKKyAweDZlLCAweDZjLCAweDY5LCAweDZlLCAweDZiLCAweDI4LCAweDY2LCAweDZlLCAweDYxLCAweDZkLCAweDY1LCAweDI5LCAweDIwLCAweDIxLCAweDNkLCAweDIwLAorIDB4MzAsIDB4MjksIDB4MjAsIDB4N2IsIDB4MGEsIDB4MDksIDB4MDksIDB4NzAsIDB4NzIsIDB4NjksIDB4NmUsIDB4NzQsIDB4NjYsIDB4MjgsIDB4MjIsIDB4MjgsCisgMHgyNSwgMHg2NCwgMHgyOSwgMHgyMCwgMHg3NSwgMHg2ZSwgMHg2YywgMHg2OSwgMHg2ZSwgMHg2YiwgMHgyMCwgMHgyNSwgMHg3MywgMHgyMCwgMHg2NiwgMHg2MSwKKyAweDY5LCAweDZjLCAweDY1LCAweDY0LCAweDIwLCAweDI4LCAweDI1LCAweDczLCAweDI5LCAweDVjLCAweDZlLCAweDIyLCAweDJjLCAweDIwLCAweDBhLCAweDA5LAorIDB4MDksIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4NmMsIDB4NjksIDB4NmUsIDB4NjUsIDB4NWYsIDB4NjMsIDB4NmYsIDB4NzUsCisgMHg2ZSwgMHg3NCwgMHgyYywgMHgyMCwgMHg2NiwgMHg2ZSwgMHg2MSwgMHg2ZCwgMHg2NSwgMHgyYywgMHgyMCwgMHg3MywgMHg3NCwgMHg3MiwgMHg2NSwgMHg3MiwKKyAweDcyLCAweDZmLCAweDcyLCAweDI4LCAweDY1LCAweDcyLCAweDcyLCAweDZlLCAweDZmLCAweDI5LCAweDI5LCAweDNiLCAweDBhLCAweDA5LCAweDdkLCAweDBhLAorIDB4N2QsIDB4MGEsIDB4MGEsIDB4NzYsIDB4NmYsIDB4NjksIDB4NjQsIDB4MjAsIDB4NjUsIDB4NzgsIDB4NzAsIDB4NjEsIDB4NmUsIDB4NjQsIDB4NWYsIDB4NjYsCisgMHg2OSwgMHg2YywgMHg2NSwgMHgyOCwgMHg2OSwgMHg2ZSwgMHg3NCwgMHgyMCwgMHg2NiwgMHg2NCwgMHgyYywgMHgyMCwgMHg2OSwgMHg2ZSwgMHg3NCwgMHgyMCwKKyAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDI5LCAweDBhLCAweDdiLCAweDBhLCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDczLCAweDNiLCAweDBhLAorIDB4MDksIDB4NzcsIDB4NjgsIDB4NjksIDB4NmMsIDB4NjUsIDB4MjAsIDB4MjgsIDB4NzMsIDB4NjksIDB4N2EsIDB4NjUsIDB4MjksIDB4MjAsIDB4N2IsIDB4MGEsCisgMHgwOSwgMHgwOSwgMHg3MywgMHgyMCwgMHgzZCwgMHgyMCwgMHg0ZCwgMHg0OSwgMHg0ZSwgMHgyOCwgMHg3MywgMHg2OSwgMHg3YSwgMHg2NSwgMHg2ZiwgMHg2NiwKKyAweDI4LCAweDYyLCAweDc1LCAweDY2LCAweDI5LCAweDJjLCAweDIwLCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDI5LCAweDNiLCAweDBhLCAweDA5LCAweDA5LAorIDB4NzcsIDB4NzIsIDB4NjksIDB4NzQsIDB4NjUsIDB4MjgsIDB4NjYsIDB4NjQsIDB4MmMsIDB4MjAsIDB4NjIsIDB4NzUsIDB4NjYsIDB4MmMsIDB4MjAsIDB4NzMsCisgMHgyOSwgMHgzYiwgMHgwYSwgMHgwOSwgMHgwOSwgMHg3MywgMHg2OSwgMHg3YSwgMHg2NSwgMHgyMCwgMHgyZCwgMHgzZCwgMHgyMCwgMHg3MywgMHgzYiwgMHgwYSwKKyAweDA5LCAweDdkLCAweDBhLCAweDdkLCAweDBhLCAweDBhLCAweDc2LCAweDZmLCAweDY5LCAweDY0LCAweDIwLCAweDY0LCAweDZmLCAweDVmLCAweDZmLCAweDcwLAorIDB4NjUsIDB4NmUsIDB4MjgsIDB4NjMsIDB4NjgsIDB4NjEsIDB4NzIsIDB4MjAsIDB4MmEsIDB4NjYsIDB4NmUsIDB4NjEsIDB4NmQsIDB4NjUsIDB4MmMsIDB4MjAsCisgMHg2OSwgMHg2ZSwgMHg3NCwgMHgyMCwgMHg2OCwgMHg2MSwgMHg2ZSwgMHg2NCwgMHg2YywgMHg2NSwgMHgyYywgMHgyMCwgMHg2OSwgMHg2ZSwgMHg3NCwgMHgyMCwKKyAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDI5LCAweDBhLCAweDdiLCAweDBhLCAweDA5LCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDY2LCAweDY0LCAweDJjLAorIDB4MjAsIDB4NjksIDB4M2IsIDB4MGEsIDB4MDksIDB4NjksIDB4NmUsIDB4NzQsIDB4MjAsIDB4NjYsIDB4NmMsIDB4NjEsIDB4NjcsIDB4NzMsIDB4MjAsIDB4M2QsCisgMHgyMCwgMHg0ZiwgMHg1ZiwgMHg1MiwgMHg0NCwgMHg1NywgMHg1MiwgMHg3YywgMHg0ZiwgMHg1ZiwgMHg0MywgMHg1MiwgMHg0NSwgMHg0MSwgMHg1NCwgMHgzYiwKKyAweDBhLCAweDA5LCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LCAweDIwLCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDIwLCAweDczLCAweDc0LAorIDB4M2IsIDB4MGEsIDB4MDksIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4NjksIDB4NjMsIDB4MjAsIDB4NjksIDB4NmUsIDB4NzQsIDB4MjAsIDB4NjMsIDB4NmYsCisgMHg3NSwgMHg2ZSwgMHg3NCwgMHgzYiwgMHgwYSwgMHgwYSwgMHgwOSwgMHg3MywgMHg3NCwgMHg3MiwgMHg3NSwgMHg3MCwgMHg3MCwgMHg2NSwgMHg3MiwgMHgyOCwKKyAweDY2LCAweDZlLCAweDYxLCAweDZkLCAweDY1LCAweDI5LCAweDNiLCAweDBhLCAweDBhLCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDczLCAweDY5LAorIDB4N2EsIDB4NjUsIDB4MjAsIDB4M2QsIDB4M2QsIDB4MjAsIDB4MzAsIDB4MjksIDB4MjAsIDB4NjYsIDB4NmMsIDB4NjEsIDB4NjcsIDB4NzMsIDB4MjAsIDB4N2MsCisgMHgzZCwgMHgyMCwgMHg0ZiwgMHg1ZiwgMHg1NCwgMHg1MiwgMHg1NSwgMHg0ZSwgMHg0MywgMHgzYiwgMHgwYSwgMHgwYSwgMHgwOSwgMHg2NiwgMHg2NCwgMHgyMCwKKyAweDNkLCAweDIwLCAweDZmLCAweDcwLCAweDY1LCAweDZlLCAweDI4LCAweDY2LCAweDZlLCAweDYxLCAweDZkLCAweDY1LCAweDJjLCAweDIwLCAweDY2LCAweDZjLAorIDB4NjEsIDB4NjcsIDB4NzMsIDB4MmMsIDB4MjAsIDB4MzAsIDB4MzYsIDB4MzAsIDB4MzAsIDB4MjksIDB4M2IsIDB4MGEsIDB4MDksIDB4NjksIDB4NjYsIDB4MjAsCisgMHgyOCwgMHg2NiwgMHg2NCwgMHgyMCwgMHgzZCwgMHgzZCwgMHgyMCwgMHgyZCwgMHgzMSwgMHgyOSwgMHgyMCwgMHg3YiwgMHgwYSwgMHgwOSwgMHgwOSwgMHg3MCwKKyAweDcyLCAweDY5LCAweDZlLCAweDc0LCAweDY2LCAweDI4LCAweDIyLCAweDI4LCAweDI1LCAweDY0LCAweDI5LCAweDIwLCAweDZmLCAweDcwLCAweDY1LCAweDZlLAorIDB4MjAsIDB4MjUsIDB4NzMsIDB4MjAsIDB4NjYsIDB4NjEsIDB4NjksIDB4NmMsIDB4NjUsIDB4NjQsIDB4MjAsIDB4NjYsIDB4NmYsIDB4NzIsIDB4MjAsIDB4NjgsCisgMHg2MSwgMHg2ZSwgMHg2NCwgMHg2YywgMHg2NSwgMHgyMCwgMHgyNSwgMHg2NCwgMHgyMCwgMHgyOCwgMHgyNSwgMHg3MywgMHgyOSwgMHg1YywgMHg2ZSwgMHgyMiwKKyAweDJjLCAweDIwLCAweDBhLCAweDA5LCAweDA5LCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDZjLCAweDY5LCAweDZlLCAweDY1LAorIDB4NWYsIDB4NjMsIDB4NmYsIDB4NzUsIDB4NmUsIDB4NzQsIDB4MmMsIDB4MjAsIDB4NjYsIDB4NmUsIDB4NjEsIDB4NmQsIDB4NjUsIDB4MmMsIDB4MjAsIDB4NjgsCisgMHg2MSwgMHg2ZSwgMHg2NCwgMHg2YywgMHg2NSwgMHgyYywgMHgyMCwgMHg3MywgMHg3NCwgMHg3MiwgMHg2NSwgMHg3MiwgMHg3MiwgMHg2ZiwgMHg3MiwgMHgyOCwKKyAweDY1LCAweDcyLCAweDcyLCAweDZlLCAweDZmLCAweDI5LCAweDI5LCAweDNiLCAweDBhLCAweDA5LCAweDA5LCAweDcyLCAweDY1LCAweDc0LCAweDc1LCAweDcyLAorIDB4NmUsIDB4M2IsIDB4MGEsIDB4MDksIDB4N2QsIDB4MGEsIDB4MDksIDB4NjYsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4MjgsIDB4NjYsIDB4NjQsIDB4MmMsCisgMHgyMCwgMHgyNiwgMHg3MywgMHg3NCwgMHgyOSwgMHgzYiwgMHgwYSwgMHgwOSwgMHg2OSwgMHg2NiwgMHgyMCwgMHgyOCwgMHg3MywgMHg2OSwgMHg3YSwgMHg2NSwKKyAweDIwLCAweDNlLCAweDIwLCAweDczLCAweDc0LCAweDJlLCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDI5LCAweDIwLCAweDdiLAorIDB4MGEsIDB4MjMsIDB4NjksIDB4NjYsIDB4MjAsIDB4NDQsIDB4NDUsIDB4NDIsIDB4NTUsIDB4NDcsIDB4MGEsIDB4MDksIDB4MDksIDB4NzAsIDB4NzIsIDB4NjksCisgMHg2ZSwgMHg3NCwgMHg2NiwgMHgyOCwgMHgyMiwgMHgyOCwgMHgyNSwgMHg2NCwgMHgyOSwgMHgyMCwgMHg2NSwgMHg3OCwgMHg3MCwgMHg2MSwgMHg2ZSwgMHg2NCwKKyAweDY5LCAweDZlLCAweDY3LCAweDIwLCAweDI1LCAweDczLCAweDIwLCAweDc0LCAweDZmLCAweDIwLCAweDI1LCAweDY0LCAweDIwLCAweDY2LCAweDcyLCAweDZmLAorIDB4NmQsIDB4MjAsIDB4MjUsIDB4NjQsIDB4NWMsIDB4NmUsIDB4MjIsIDB4MmMsIDB4MjAsIDB4MGEsIDB4MDksIDB4MDksIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisgMHgyMCwgMHgyMCwgMHgyMCwgMHg2YywgMHg2OSwgMHg2ZSwgMHg2NSwgMHg1ZiwgMHg2MywgMHg2ZiwgMHg3NSwgMHg2ZSwgMHg3NCwgMHgyYywgMHgyMCwgMHg2NiwKKyAweDZlLCAweDYxLCAweDZkLCAweDY1LCAweDJjLCAweDIwLCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDJjLCAweDIwLCAweDI4LCAweDY5LCAweDZlLCAweDc0LAorIDB4MjksIDB4NzMsIDB4NzQsIDB4MmUsIDB4NzMsIDB4NzQsIDB4NWYsIDB4NzMsIDB4NjksIDB4N2EsIDB4NjUsIDB4MjksIDB4M2IsIDB4MGEsIDB4MjMsIDB4NjUsCisgMHg2ZSwgMHg2NCwgMHg2OSwgMHg2NiwgMHgwYSwgMHgwOSwgMHgwOSwgMHg2NSwgMHg3OCwgMHg3MCwgMHg2MSwgMHg2ZSwgMHg2NCwgMHg1ZiwgMHg2NiwgMHg2OSwKKyAweDZjLCAweDY1LCAweDI4LCAweDY2LCAweDY0LCAweDJjLCAweDIwLCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDIwLCAweDJkLCAweDIwLCAweDczLCAweDc0LAorIDB4MmUsIDB4NzMsIDB4NzQsIDB4NWYsIDB4NzMsIDB4NjksIDB4N2EsIDB4NjUsIDB4MjksIDB4M2IsIDB4MGEsIDB4MDksIDB4N2QsIDB4MjAsIDB4NjUsIDB4NmMsCisgMHg3MywgMHg2NSwgMHgyMCwgMHg2OSwgMHg2NiwgMHgyMCwgMHgyOCwgMHg3MywgMHg2OSwgMHg3YSwgMHg2NSwgMHgyMCwgMHgzYywgMHgyMCwgMHg3MywgMHg3NCwKKyAweDJlLCAweDczLCAweDc0LCAweDVmLCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDI5LCAweDIwLCAweDdiLCAweDBhLCAweDA5LCAweDA5LCAweDcwLCAweDcyLAorIDB4NjksIDB4NmUsIDB4NzQsIDB4NjYsIDB4MjgsIDB4MjIsIDB4NzQsIDB4NzIsIDB4NzUsIDB4NmUsIDB4NjMsIDB4NjEsIDB4NzQsIDB4NjksIDB4NmUsIDB4NjcsCisgMHgyMCwgMHgyNSwgMHg3MywgMHgyMCwgMHg3NCwgMHg2ZiwgMHgyMCwgMHgyNSwgMHg2NCwgMHgyMCwgMHg2NiwgMHg3MiwgMHg2ZiwgMHg2ZCwgMHgyMCwgMHgyNSwKKyAweDY0LCAweDVjLCAweDZlLCAweDIyLCAweDJjLCAweDIwLCAweDBhLCAweDA5LCAweDA5LCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorIDB4NjYsIDB4NmUsIDB4NjEsIDB4NmQsIDB4NjUsIDB4MmMsIDB4MjAsIDB4NzMsIDB4NjksIDB4N2EsIDB4NjUsIDB4MmMsIDB4MjAsIDB4MjgsIDB4NjksIDB4NmUsCisgMHg3NCwgMHgyOSwgMHg3MywgMHg3NCwgMHgyZSwgMHg3MywgMHg3NCwgMHg1ZiwgMHg3MywgMHg2OSwgMHg3YSwgMHg2NSwgMHgyOSwgMHgzYiwgMHgwYSwgMHgwOSwKKyAweDA5LCAweDY2LCAweDc0LCAweDcyLCAweDc1LCAweDZlLCAweDYzLCAweDYxLCAweDc0LCAweDY1LCAweDI4LCAweDY2LCAweDY0LCAweDJjLCAweDIwLCAweDczLAorIDB4NjksIDB4N2EsIDB4NjUsIDB4MjksIDB4M2IsIDB4MGEsIDB4MDksIDB4N2QsIDB4MGEsIDB4MDksIDB4NjYsIDB4NmYsIDB4NzIsIDB4MjAsIDB4MjgsIDB4NjksCisgMHgzZCwgMHgzMCwgMHgzYiwgMHg2OSwgMHgzYywgMHg0ZCwgMHg0MSwgMHg1OCwgMHg1ZiwgMHg0NiwgMHg0OSwgMHg0YywgMHg0NSwgMHg1MywgMHgzYiwgMHg2OSwKKyAweDJiLCAweDJiLCAweDI5LCAweDIwLCAweDdiLCAweDBhLCAweDA5LCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDY2LCAweDc0LCAweDYxLCAweDYyLAorIDB4NmMsIDB4NjUsIDB4NWIsIDB4NjksIDB4NWQsIDB4MmUsIDB4NjgsIDB4NjEsIDB4NmUsIDB4NjQsIDB4NmMsIDB4NjUsIDB4MjAsIDB4M2QsIDB4M2QsIDB4MjAsCisgMHgzMCwgMHgyOSwgMHgyMCwgMHg2MiwgMHg3MiwgMHg2NSwgMHg2MSwgMHg2YiwgMHgzYiwgMHgwYSwgMHgwOSwgMHg3ZCwgMHgwYSwgMHgwOSwgMHg2OSwgMHg2NiwKKyAweDIwLCAweDI4LCAweDY5LCAweDIwLCAweDNkLCAweDNkLCAweDIwLCAweDRkLCAweDQxLCAweDU4LCAweDVmLCAweDQ2LCAweDQ5LCAweDRjLCAweDQ1LCAweDUzLAorIDB4MjksIDB4MjAsIDB4N2IsIDB4MGEsIDB4MDksIDB4MDksIDB4NzAsIDB4NzIsIDB4NjksIDB4NmUsIDB4NzQsIDB4NjYsIDB4MjgsIDB4MjIsIDB4NjYsIDB4NjksCisgMHg2YywgMHg2NSwgMHgyMCwgMHg3NCwgMHg2MSwgMHg2MiwgMHg2YywgMHg2NSwgMHgyMCwgMHg2NiwgMHg3NSwgMHg2YywgMHg2YywgMHgyMCwgMHg2NiwgMHg2ZiwKKyAweDcyLCAweDIwLCAweDI1LCAweDczLCAweDVjLCAweDZlLCAweDIyLCAweDJjLCAweDIwLCAweDY2LCAweDZlLCAweDYxLCAweDZkLCAweDY1LCAweDI5LCAweDNiLAorIDB4MGEsIDB4MDksIDB4MDksIDB4NjUsIDB4NzgsIDB4NjksIDB4NzQsIDB4MjgsIDB4MzEsIDB4MjksIDB4M2IsIDB4MGEsIDB4MDksIDB4N2QsIDB4MGEsIDB4MDksCisgMHg2NiwgMHg3NCwgMHg2MSwgMHg2MiwgMHg2YywgMHg2NSwgMHg1YiwgMHg2OSwgMHg1ZCwgMHgyZSwgMHg2OCwgMHg2MSwgMHg2ZSwgMHg2NCwgMHg2YywgMHg2NSwKKyAweDIwLCAweDNkLCAweDIwLCAweDY4LCAweDYxLCAweDZlLCAweDY0LCAweDZjLCAweDY1LCAweDNiLCAweDBhLCAweDA5LCAweDY2LCAweDc0LCAweDYxLCAweDYyLAorIDB4NmMsIDB4NjUsIDB4NWIsIDB4NjksIDB4NWQsIDB4MmUsIDB4NjYsIDB4NjQsIDB4MjAsIDB4M2QsIDB4MjAsIDB4NjYsIDB4NjQsIDB4M2IsIDB4MGEsIDB4MDksCisgMHg2OSwgMHg2NiwgMHgyMCwgMHgyOCwgMHg2MywgMHg2ZiwgMHg3NSwgMHg2ZSwgMHg3NCwgMHgyYiwgMHgyYiwgMHgyMCwgMHgyNSwgMHgyMCwgMHgzMSwgMHgzMCwKKyAweDMwLCAweDIwLCAweDNkLCAweDNkLCAweDIwLCAweDMwLCAweDI5LCAweDIwLCAweDdiLCAweDBhLCAweDA5LCAweDA5LCAweDcwLCAweDcyLCAweDY5LCAweDZlLAorIDB4NzQsIDB4NjYsIDB4MjgsIDB4MjIsIDB4MmUsIDB4MjIsIDB4MjksIDB4M2IsIDB4MGEsIDB4MDksIDB4N2QsIDB4MGEsIDB4N2QsIDB4MGEsIDB4MGEsIDB4NzYsCisgMHg2ZiwgMHg2OSwgMHg2NCwgMHgyMCwgMHg2NCwgMHg2ZiwgMHg1ZiwgMHg3NywgMHg3MiwgMHg2OSwgMHg3NCwgMHg2NSwgMHgyOCwgMHg2OSwgMHg2ZSwgMHg3NCwKKyAweDIwLCAweDY4LCAweDYxLCAweDZlLCAweDY0LCAweDZjLCAweDY1LCAweDJjLCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDczLCAweDY5LCAweDdhLAorIDB4NjUsIDB4MmMsIDB4MjAsIDB4NjksIDB4NmUsIDB4NzQsIDB4MjAsIDB4NmYsIDB4NjYsIDB4NjYsIDB4NzMsIDB4NjUsIDB4NzQsIDB4MjksIDB4MGEsIDB4N2IsCisgMHgwYSwgMHgwOSwgMHg2OSwgMHg2ZSwgMHg3NCwgMHgyMCwgMHg2OSwgMHgzYiwgMHgwYSwgMHgwYSwgMHgwOSwgMHg2OSwgMHg2NiwgMHgyMCwgMHgyOCwgMHg2MiwKKyAweDc1LCAweDY2LCAweDViLCAweDMwLCAweDVkLCAweDIwLCAweDNkLCAweDNkLCAweDIwLCAweDMwLCAweDI5LCAweDIwLCAweDZkLCAweDY1LCAweDZkLCAweDczLAorIDB4NjUsIDB4NzQsIDB4MjgsIDB4NjIsIDB4NzUsIDB4NjYsIDB4MmMsIDB4MjAsIDB4MzEsIDB4MmMsIDB4MjAsIDB4NzMsIDB4NjksIDB4N2EsIDB4NjUsIDB4NmYsCisgMHg2NiwgMHgyOCwgMHg2MiwgMHg3NSwgMHg2NiwgMHgyOSwgMHgyOSwgMHgzYiwgMHgwYSwgMHgwYSwgMHgwOSwgMHg2NiwgMHg2ZiwgMHg3MiwgMHgyMCwgMHgyOCwKKyAweDY5LCAweDNkLCAweDMwLCAweDNiLCAweDY5LCAweDNjLCAweDRkLCAweDQxLCAweDU4LCAweDVmLCAweDQ2LCAweDQ5LCAweDRjLCAweDQ1LCAweDUzLCAweDNiLAorIDB4NjksIDB4MmIsIDB4MmIsIDB4MjksIDB4MjAsIDB4N2IsIDB4MGEsIDB4MDksIDB4MDksIDB4NjksIDB4NjYsIDB4MjAsIDB4MjgsIDB4NjYsIDB4NzQsIDB4NjEsCisgMHg2MiwgMHg2YywgMHg2NSwgMHg1YiwgMHg2OSwgMHg1ZCwgMHgyZSwgMHg2OCwgMHg2MSwgMHg2ZSwgMHg2NCwgMHg2YywgMHg2NSwgMHgyMCwgMHgzZCwgMHgzZCwKKyAweDIwLCAweDY4LCAweDYxLCAweDZlLCAweDY0LCAweDZjLCAweDY1LCAweDI5LCAweDIwLCAweDYyLCAweDcyLCAweDY1LCAweDYxLCAweDZiLCAweDNiLCAweDBhLAorIDB4MDksIDB4N2QsIDB4MGEsIDB4MDksIDB4NjksIDB4NjYsIDB4MjAsIDB4MjgsIDB4NjksIDB4MjAsIDB4M2QsIDB4M2QsIDB4MjAsIDB4NGQsIDB4NDEsIDB4NTgsCisgMHg1ZiwgMHg0NiwgMHg0OSwgMHg0YywgMHg0NSwgMHg1MywgMHgyOSwgMHgyMCwgMHg3YiwgMHgwYSwgMHgyMywgMHg2OSwgMHg2NiwgMHgyMCwgMHgzMSwgMHgwYSwKKyAweDA5LCAweDA5LCAweDcwLCAweDcyLCAweDY5LCAweDZlLCAweDc0LCAweDY2LCAweDI4LCAweDIyLCAweDI4LCAweDI1LCAweDY0LCAweDI5LCAweDIwLCAweDY0LAorIDB4NmYsIDB4NWYsIDB4NzcsIDB4NzIsIDB4NjksIDB4NzQsIDB4NjUsIDB4M2EsIDB4MjAsIDB4NjgsIDB4NjEsIDB4NmUsIDB4NjQsIDB4NmMsIDB4NjUsIDB4MjAsCisgMHgyNSwgMHg2NCwgMHgyMCwgMHg3NywgMHg2MSwgMHg3MywgMHgyMCwgMHg2ZSwgMHg2ZiwgMHg3NCwgMHgyMCwgMHg2ZiwgMHg3MCwgMHg2NSwgMHg2ZSwgMHgyMCwKKyAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDNkLCAweDI1LCAweDY0LCAweDIwLCAweDZmLCAweDY2LCAweDczLCAweDNkLCAweDI1LCAweDY0LCAweDVjLCAweDZlLAorIDB4MjIsIDB4MmMsIDB4MjAsIDB4MGEsIDB4MDksIDB4MDksIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4NmMsIDB4NjksIDB4NmUsCisgMHg2NSwgMHg1ZiwgMHg2MywgMHg2ZiwgMHg3NSwgMHg2ZSwgMHg3NCwgMHgyYywgMHgyMCwgMHg2OCwgMHg2MSwgMHg2ZSwgMHg2NCwgMHg2YywgMHg2NSwgMHgyYywKKyAweDIwLCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDJjLCAweDIwLCAweDZmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDI5LCAweDNiLCAweDBhLAorIDB4MjMsIDB4NjUsIDB4NmUsIDB4NjQsIDB4NjksIDB4NjYsIDB4MGEsIDB4MDksIDB4MDksIDB4NzIsIDB4NjUsIDB4NzQsIDB4NzUsIDB4NzIsIDB4NmUsIDB4M2IsCisgMHgwYSwgMHgwOSwgMHg3ZCwgMHgwYSwgMHgwOSwgMHg2YywgMHg3MywgMHg2NSwgMHg2NSwgMHg2YiwgMHgyOCwgMHg2NiwgMHg3NCwgMHg2MSwgMHg2MiwgMHg2YywKKyAweDY1LCAweDViLCAweDY5LCAweDVkLCAweDJlLCAweDY2LCAweDY0LCAweDJjLCAweDIwLCAweDZmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDJjLAorIDB4MjAsIDB4NTMsIDB4NDUsIDB4NDUsIDB4NGIsIDB4NWYsIDB4NTMsIDB4NDUsIDB4NTQsIDB4MjksIDB4M2IsIDB4MGEsIDB4MDksIDB4NjksIDB4NjYsIDB4MjAsCisgMHgyOCwgMHg3NywgMHg3MiwgMHg2OSwgMHg3NCwgMHg2NSwgMHgyOCwgMHg2NiwgMHg3NCwgMHg2MSwgMHg2MiwgMHg2YywgMHg2NSwgMHg1YiwgMHg2OSwgMHg1ZCwKKyAweDJlLCAweDY2LCAweDY0LCAweDJjLCAweDIwLCAweDYyLCAweDc1LCAweDY2LCAweDJjLCAweDIwLCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDI5LCAweDIwLAorIDB4MjEsIDB4M2QsIDB4MjAsIDB4NzMsIDB4NjksIDB4N2EsIDB4NjUsIDB4MjksIDB4MjAsIDB4N2IsIDB4MGEsIDB4MDksIDB4MDksIDB4NzAsIDB4NzIsIDB4NjksCisgMHg2ZSwgMHg3NCwgMHg2NiwgMHgyOCwgMHgyMiwgMHg3NywgMHg3MiwgMHg2OSwgMHg3NCwgMHg2NSwgMHgyMCwgMHg2NiwgMHg2MSwgMHg2OSwgMHg2YywgMHg2NSwKKyAweDY0LCAweDIwLCAweDZmLCAweDZlLCAweDIwLCAweDY4LCAweDYxLCAweDZlLCAweDY0LCAweDZjLCAweDY1LCAweDIwLCAweDI1LCAweDY0LCAweDVjLCAweDZlLAorIDB4MjIsIDB4MmMsIDB4MjAsIDB4NjgsIDB4NjEsIDB4NmUsIDB4NjQsIDB4NmMsIDB4NjUsIDB4MjksIDB4M2IsIDB4MGEsIDB4MDksIDB4N2QsIDB4MGEsIDB4N2QsCisgMHgwYSwgMHgwYSwgMHg3NiwgMHg2ZiwgMHg2OSwgMHg2NCwgMHgyMCwgMHg2NCwgMHg2ZiwgMHg1ZiwgMHg3MiwgMHg2NSwgMHg2MSwgMHg2NCwgMHgyOCwgMHg2OSwKKyAweDZlLCAweDc0LCAweDIwLCAweDY4LCAweDYxLCAweDZlLCAweDY0LCAweDZjLCAweDY1LCAweDJjLCAweDIwLCAweDY5LCAweDZlLCAweDc0LCAweDIwLCAweDczLAorIDB4NjksIDB4N2EsIDB4NjUsIDB4MmMsIDB4MjAsIDB4NjksIDB4NmUsIDB4NzQsIDB4MjAsIDB4NmYsIDB4NjYsIDB4NjYsIDB4NzMsIDB4NjUsIDB4NzQsIDB4MjksCisgMHgwYSwgMHg3YiwgMHgwYSwgMHgwOSwgMHg2OSwgMHg2ZSwgMHg3NCwgMHgyMCwgMHg2OSwgMHgzYiwgMHgwYSwgMHgwOSwgMHg2NiwgMHg2ZiwgMHg3MiwgMHgyMCwKKyAweDI4LCAweDY5LCAweDNkLCAweDMwLCAweDNiLCAweDY5LCAweDNjLCAweDRkLCAweDQxLCAweDU4LCAweDVmLCAweDQ2LCAweDQ5LCAweDRjLCAweDQ1LCAweDUzLAorIDB4M2IsIDB4NjksIDB4MmIsIDB4MmIsIDB4MjksIDB4MjAsIDB4N2IsIDB4MGEsIDB4MDksIDB4MDksIDB4NjksIDB4NjYsIDB4MjAsIDB4MjgsIDB4NjYsIDB4NzQsCisgMHg2MSwgMHg2MiwgMHg2YywgMHg2NSwgMHg1YiwgMHg2OSwgMHg1ZCwgMHgyZSwgMHg2OCwgMHg2MSwgMHg2ZSwgMHg2NCwgMHg2YywgMHg2NSwgMHgyMCwgMHgzZCwKKyAweDNkLCAweDIwLCAweDY4LCAweDYxLCAweDZlLCAweDY0LCAweDZjLCAweDY1LCAweDI5LCAweDIwLCAweDYyLCAweDcyLCAweDY1LCAweDYxLCAweDZiLCAweDNiLAorIDB4MGEsIDB4MDksIDB4N2QsIDB4MGEsIDB4MDksIDB4NjksIDB4NjYsIDB4MjAsIDB4MjgsIDB4NjksIDB4MjAsIDB4M2QsIDB4M2QsIDB4MjAsIDB4NGQsIDB4NDEsCisgMHg1OCwgMHg1ZiwgMHg0NiwgMHg0OSwgMHg0YywgMHg0NSwgMHg1MywgMHgyOSwgMHgyMCwgMHg3YiwgMHgwYSwgMHgwOSwgMHgwOSwgMHg3MCwgMHg3MiwgMHg2OSwKKyAweDZlLCAweDc0LCAweDY2LCAweDI4LCAweDIyLCAweDI4LCAweDI1LCAweDY0LCAweDI5LCAweDIwLCAweDY0LCAweDZmLCAweDVmLCAweDcyLCAweDY1LCAweDYxLAorIDB4NjQsIDB4M2EsIDB4MjAsIDB4NjgsIDB4NjEsIDB4NmUsIDB4NjQsIDB4NmMsIDB4NjUsIDB4MjAsIDB4MjUsIDB4NjQsIDB4MjAsIDB4NzcsIDB4NjEsIDB4NzMsCisgMHgyMCwgMHg2ZSwgMHg2ZiwgMHg3NCwgMHgyMCwgMHg2ZiwgMHg3MCwgMHg2NSwgMHg2ZSwgMHgyMCwgMHg3MywgMHg2OSwgMHg3YSwgMHg2NSwgMHgzZCwgMHgyNSwKKyAweDY0LCAweDIwLCAweDZmLCAweDY2LCAweDczLCAweDNkLCAweDI1LCAweDY0LCAweDVjLCAweDZlLCAweDIyLCAweDJjLCAweDIwLCAweDBhLCAweDA5LCAweDA5LAorIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4NmMsIDB4NjksIDB4NmUsIDB4NjUsIDB4NWYsIDB4NjMsIDB4NmYsIDB4NzUsIDB4NmUsCisgMHg3NCwgMHgyYywgMHgyMCwgMHg2OCwgMHg2MSwgMHg2ZSwgMHg2NCwgMHg2YywgMHg2NSwgMHgyYywgMHgyMCwgMHg3MywgMHg2OSwgMHg3YSwgMHg2NSwgMHgyYywKKyAweDIwLCAweDZmLCAweDY2LCAweDY2LCAweDczLCAweDY1LCAweDc0LCAweDI5LCAweDNiLCAweDBhLCAweDA5LCAweDA5LCAweDcyLCAweDY1LCAweDc0LCAweDc1LAorIDB4NzIsIDB4NmUsIDB4M2IsIDB4MGEsIDB4MDksIDB4N2QsIDB4MGEsIDB4MDksIDB4NmMsIDB4NzMsIDB4NjUsIDB4NjUsIDB4NmIsIDB4MjgsIDB4NjYsIDB4NzQsCisgMHg2MSwgMHg2MiwgMHg2YywgMHg2NSwgMHg1YiwgMHg2OSwgMHg1ZCwgMHgyZSwgMHg2NiwgMHg2NCwgMHgyYywgMHgyMCwgMHg2ZiwgMHg2NiwgMHg2NiwgMHg3MywKKyAweDY1LCAweDc0LCAweDJjLCAweDIwLCAweDUzLCAweDQ1LCAweDQ1LCAweDRiLCAweDVmLCAweDUzLCAweDQ1LCAweDU0LCAweDI5LCAweDNiLCAweDBhLCAweDA5LAorIDB4NzIsIDB4NjUsIDB4NjEsIDB4NjQsIDB4MjgsIDB4NjYsIDB4NzQsIDB4NjEsIDB4NjIsIDB4NmMsIDB4NjUsIDB4NWIsIDB4NjksIDB4NWQsIDB4MmUsIDB4NjYsCisgMHg2NCwgMHgyYywgMHgyMCwgMHg2MiwgMHg3NSwgMHg2NiwgMHgyYywgMHgyMCwgMHg3MywgMHg2OSwgMHg3YSwgMHg2NSwgMHgyOSwgMHgzYiwgMHgwYSwgMHg3ZCwKKyAweDBhLCAweDBhLCAweDc2LCAweDZmLCAweDY5LCAweDY0LCAweDIwLCAweDY0LCAweDZmLCAweDVmLCAweDYzLCAweDZjLCAweDZmLCAweDczLCAweDY1LCAweDI4LAorIDB4NjksIDB4NmUsIDB4NzQsIDB4MjAsIDB4NjgsIDB4NjEsIDB4NmUsIDB4NjQsIDB4NmMsIDB4NjUsIDB4MjksIDB4MGEsIDB4N2IsIDB4MGEsIDB4MDksIDB4NjksCisgMHg2ZSwgMHg3NCwgMHgyMCwgMHg2OSwgMHgzYiwgMHgwYSwgMHgwOSwgMHg2NiwgMHg2ZiwgMHg3MiwgMHgyMCwgMHgyOCwgMHg2OSwgMHgzZCwgMHgzMCwgMHgzYiwKKyAweDY5LCAweDNjLCAweDRkLCAweDQxLCAweDU4LCAweDVmLCAweDQ2LCAweDQ5LCAweDRjLCAweDQ1LCAweDUzLCAweDNiLCAweDY5LCAweDJiLCAweDJiLCAweDI5LAorIDB4MjAsIDB4N2IsIDB4MGEsIDB4MDksIDB4MDksIDB4NjksIDB4NjYsIDB4MjAsIDB4MjgsIDB4NjYsIDB4NzQsIDB4NjEsIDB4NjIsIDB4NmMsIDB4NjUsIDB4NWIsCisgMHg2OSwgMHg1ZCwgMHgyZSwgMHg2OCwgMHg2MSwgMHg2ZSwgMHg2NCwgMHg2YywgMHg2NSwgMHgyMCwgMHgzZCwgMHgzZCwgMHgyMCwgMHg2OCwgMHg2MSwgMHg2ZSwKKyAweDY0LCAweDZjLCAweDY1LCAweDI5LCAweDIwLCAweDYyLCAweDcyLCAweDY1LCAweDYxLCAweDZiLCAweDNiLCAweDBhLCAweDA5LCAweDdkLCAweDBhLCAweDA5LAorIDB4NjksIDB4NjYsIDB4MjAsIDB4MjgsIDB4NjksIDB4MjAsIDB4M2QsIDB4M2QsIDB4MjAsIDB4NGQsIDB4NDEsIDB4NTgsIDB4NWYsIDB4NDYsIDB4NDksIDB4NGMsCisgMHg0NSwgMHg1MywgMHgyOSwgMHgyMCwgMHg3YiwgMHgwYSwgMHgwOSwgMHgwOSwgMHg3MCwgMHg3MiwgMHg2OSwgMHg2ZSwgMHg3NCwgMHg2NiwgMHgyOCwgMHgyMiwKKyAweDI4LCAweDI1LCAweDY0LCAweDI5LCAweDIwLCAweDY0LCAweDZmLCAweDVmLCAweDYzLCAweDZjLCAweDZmLCAweDczLCAweDY1LCAweDNhLCAweDIwLCAweDY4LAorIDB4NjEsIDB4NmUsIDB4NjQsIDB4NmMsIDB4NjUsIDB4MjAsIDB4MjUsIDB4NjQsIDB4MjAsIDB4NzcsIDB4NjEsIDB4NzMsIDB4MjAsIDB4NmUsIDB4NmYsIDB4NzQsCisgMHgyMCwgMHg2ZiwgMHg3MCwgMHg2NSwgMHg2ZSwgMHg1YywgMHg2ZSwgMHgyMiwgMHgyYywgMHgyMCwgMHgwYSwgMHgwOSwgMHgwOSwgMHgyMCwgMHgyMCwgMHgyMCwKKyAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDZjLCAweDY5LCAweDZlLCAweDY1LCAweDVmLCAweDYzLCAweDZmLCAweDc1LCAweDZlLCAweDc0LCAweDJjLCAweDIwLAorIDB4NjgsIDB4NjEsIDB4NmUsIDB4NjQsIDB4NmMsIDB4NjUsIDB4MjksIDB4M2IsIDB4MGEsIDB4MDksIDB4MDksIDB4NzIsIDB4NjUsIDB4NzQsIDB4NzUsIDB4NzIsCisgMHg2ZSwgMHgzYiwgMHgwYSwgMHgwOSwgMHg3ZCwgMHgwYSwgMHgwOSwgMHg2MywgMHg2YywgMHg2ZiwgMHg3MywgMHg2NSwgMHgyOCwgMHg2NiwgMHg3NCwgMHg2MSwKKyAweDYyLCAweDZjLCAweDY1LCAweDViLCAweDY5LCAweDVkLCAweDJlLCAweDY2LCAweDY0LCAweDI5LCAweDNiLCAweDBhLCAweDA5LCAweDY2LCAweDc0LCAweDYxLAorIDB4NjIsIDB4NmMsIDB4NjUsIDB4NWIsIDB4NjksIDB4NWQsIDB4MmUsIDB4NjgsIDB4NjEsIDB4NmUsIDB4NjQsIDB4NmMsIDB4NjUsIDB4MjAsIDB4M2QsIDB4MjAsCisgMHgzMCwgMHgzYiwgMHgwYSwgMHg3ZCwgMHgwYSwgMHgwYSwgMHg3NiwgMHg2ZiwgMHg2OSwgMHg2NCwgMHgyMCwgMHg2NCwgMHg2ZiwgMHg1ZiwgMHg2ZCwgMHg2YiwKKyAweDY0LCAweDY5LCAweDcyLCAweDI4LCAweDYzLCAweDY4LCAweDYxLCAweDcyLCAweDIwLCAweDJhLCAweDY2LCAweDZlLCAweDYxLCAweDZkLCAweDY1LCAweDI5LAorIDB4MGEsIDB4N2IsIDB4MGEsIDB4MDksIDB4NzMsIDB4NzQsIDB4NzIsIDB4NzUsIDB4NzAsIDB4NzAsIDB4NjUsIDB4NzIsIDB4MjgsIDB4NjYsIDB4NmUsIDB4NjEsCisgMHg2ZCwgMHg2NSwgMHgyOSwgMHgzYiwgMHgwYSwgMHgwYSwgMHgwOSwgMHg2OSwgMHg2NiwgMHgyMCwgMHgyOCwgMHg2ZCwgMHg2YiwgMHg2NCwgMHg2OSwgMHg3MiwKKyAweDI4LCAweDY2LCAweDZlLCAweDYxLCAweDZkLCAweDY1LCAweDJjLCAweDIwLCAweDMwLCAweDM3LCAweDMwLCAweDMwLCAweDI5LCAweDIwLCAweDIxLCAweDNkLAorIDB4MjAsIDB4MzAsIDB4MjksIDB4MjAsIDB4N2IsIDB4MGEsIDB4MjMsIDB4NjksIDB4NjYsIDB4MjAsIDB4NDQsIDB4NDUsIDB4NDIsIDB4NTUsIDB4NDcsIDB4MGEsCisgMHgwOSwgMHgwOSwgMHg3MCwgMHg3MiwgMHg2OSwgMHg2ZSwgMHg3NCwgMHg2NiwgMHgyOCwgMHgyMiwgMHg2ZCwgMHg2YiwgMHg2NCwgMHg2OSwgMHg3MiwgMHgyMCwKKyAweDI1LCAweDczLCAweDIwLCAweDY2LCAweDYxLCAweDY5LCAweDZjLCAweDY1LCAweDY0LCAweDIwLCAweDI4LCAweDI1LCAweDczLCAweDI5LCAweDVjLCAweDZlLAorIDB4MjIsIDB4MmMsIDB4MjAsIDB4MGEsIDB4MDksIDB4MDksIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4NjYsIDB4NmUsIDB4NjEsCisgMHg2ZCwgMHg2NSwgMHgyYywgMHgyMCwgMHg3MywgMHg3NCwgMHg3MiwgMHg2NSwgMHg3MiwgMHg3MiwgMHg2ZiwgMHg3MiwgMHgyOCwgMHg2NSwgMHg3MiwgMHg3MiwKKyAweDZlLCAweDZmLCAweDI5LCAweDI5LCAweDNiLCAweDBhLCAweDIzLCAweDY1LCAweDZlLCAweDY0LCAweDY5LCAweDY2LCAweDBhLCAweDA5LCAweDdkLCAweDBhLAorIDB4N2QsIDB4MGEsIDB4MGEsIDB4NzYsIDB4NmYsIDB4NjksIDB4NjQsIDB4MjAsIDB4NjQsIDB4NmYsIDB4NWYsIDB4NzIsIDB4NmQsIDB4NjQsIDB4NjksIDB4NzIsCisgMHgyOCwgMHg2MywgMHg2OCwgMHg2MSwgMHg3MiwgMHgyMCwgMHgyYSwgMHg2NiwgMHg2ZSwgMHg2MSwgMHg2ZCwgMHg2NSwgMHgyOSwgMHgwYSwgMHg3YiwgMHgwYSwKKyAweDA5LCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDcwLCAweDcwLCAweDY1LCAweDcyLCAweDI4LCAweDY2LCAweDZlLCAweDYxLCAweDZkLCAweDY1LCAweDI5LAorIDB4M2IsIDB4MGEsIDB4MGEsIDB4MDksIDB4NjksIDB4NjYsIDB4MjAsIDB4MjgsIDB4NzIsIDB4NmQsIDB4NjQsIDB4NjksIDB4NzIsIDB4MjgsIDB4NjYsIDB4NmUsCisgMHg2MSwgMHg2ZCwgMHg2NSwgMHgyOSwgMHgyMCwgMHgyMSwgMHgzZCwgMHgyMCwgMHgzMCwgMHgyOSwgMHgyMCwgMHg3YiwgMHgwYSwgMHgwOSwgMHgwOSwgMHg3MCwKKyAweDcyLCAweDY5LCAweDZlLCAweDc0LCAweDY2LCAweDI4LCAweDIyLCAweDcyLCAweDZkLCAweDY0LCAweDY5LCAweDcyLCAweDIwLCAweDI1LCAweDczLCAweDIwLAorIDB4NjYsIDB4NjEsIDB4NjksIDB4NmMsIDB4NjUsIDB4NjQsIDB4MjAsIDB4MjgsIDB4MjUsIDB4NzMsIDB4MjksIDB4NWMsIDB4NmUsIDB4MjIsIDB4MmMsIDB4MjAsCisgMHgwYSwgMHgwOSwgMHgwOSwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHgyMCwgMHg2NiwgMHg2ZSwgMHg2MSwgMHg2ZCwgMHg2NSwgMHgyYywKKyAweDIwLCAweDczLCAweDc0LCAweDcyLCAweDY1LCAweDcyLCAweDcyLCAweDZmLCAweDcyLCAweDI4LCAweDY1LCAweDcyLCAweDcyLCAweDZlLCAweDZmLCAweDI5LAorIDB4MjksIDB4M2IsIDB4MGEsIDB4MDksIDB4N2QsIDB4MGEsIDB4N2QsIDB4MGEsIDB4MGEsIDB4NzYsIDB4NmYsIDB4NjksIDB4NjQsIDB4MjAsIDB4NjQsIDB4NmYsCisgMHg1ZiwgMHg3MiwgMHg2NSwgMHg2ZSwgMHg2MSwgMHg2ZCwgMHg2NSwgMHgyOCwgMHg2MywgMHg2OCwgMHg2MSwgMHg3MiwgMHgyMCwgMHgyYSwgMHg2ZiwgMHg2YywKKyAweDY0LCAweDJjLCAweDIwLCAweDYzLCAweDY4LCAweDYxLCAweDcyLCAweDIwLCAweDJhLCAweDZlLCAweDY1LCAweDc3LCAweDI5LCAweDBhLCAweDdiLCAweDBhLAorIDB4MDksIDB4NzMsIDB4NzQsIDB4NzIsIDB4NzUsIDB4NzAsIDB4NzAsIDB4NjUsIDB4NzIsIDB4MjgsIDB4NmYsIDB4NmMsIDB4NjQsIDB4MjksIDB4M2IsIDB4MGEsCisgMHgwOSwgMHg3MywgMHg3NCwgMHg3MiwgMHg3NSwgMHg3MCwgMHg3MCwgMHg2NSwgMHg3MiwgMHgyOCwgMHg2ZSwgMHg2NSwgMHg3NywgMHgyOSwgMHgzYiwgMHgwYSwKKyAweDBhLCAweDA5LCAweDY5LCAweDY2LCAweDIwLCAweDI4LCAweDcyLCAweDY1LCAweDZlLCAweDYxLCAweDZkLCAweDY1LCAweDI4LCAweDZmLCAweDZjLCAweDY0LAorIDB4MmMsIDB4MjAsIDB4NmUsIDB4NjUsIDB4NzcsIDB4MjksIDB4MjAsIDB4MjEsIDB4M2QsIDB4MjAsIDB4MzAsIDB4MjksIDB4MjAsIDB4N2IsIDB4MGEsIDB4MDksCisgMHgwOSwgMHg3MCwgMHg3MiwgMHg2OSwgMHg2ZSwgMHg3NCwgMHg2NiwgMHgyOCwgMHgyMiwgMHg3MiwgMHg2NSwgMHg2ZSwgMHg2MSwgMHg2ZCwgMHg2NSwgMHgyMCwKKyAweDI1LCAweDczLCAweDIwLCAweDI1LCAweDczLCAweDIwLCAweDY2LCAweDYxLCAweDY5LCAweDZjLCAweDY1LCAweDY0LCAweDIwLCAweDI4LCAweDI1LCAweDczLAorIDB4MjksIDB4NWMsIDB4NmUsIDB4MjIsIDB4MmMsIDB4MjAsIDB4MGEsIDB4MDksIDB4MDksIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisgMHg2ZiwgMHg2YywgMHg2NCwgMHgyYywgMHgyMCwgMHg2ZSwgMHg2NSwgMHg3NywgMHgyYywgMHgyMCwgMHg3MywgMHg3NCwgMHg3MiwgMHg2NSwgMHg3MiwgMHg3MiwKKyAweDZmLCAweDcyLCAweDI4LCAweDY1LCAweDcyLCAweDcyLCAweDZlLCAweDZmLCAweDI5LCAweDI5LCAweDNiLCAweDBhLCAweDA5LCAweDdkLCAweDBhLCAweDdkLAorIDB4MGEsIDB4MGEsIDB4MGEsIDB4NzYsIDB4NmYsIDB4NjksIDB4NjQsIDB4MjAsIDB4NjQsIDB4NmYsIDB4NWYsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4MjgsCisgMHg2MywgMHg2OCwgMHg2MSwgMHg3MiwgMHgyMCwgMHgyYSwgMHg2NiwgMHg2ZSwgMHg2MSwgMHg2ZCwgMHg2NSwgMHgyYywgMHgyMCwgMHg2OSwgMHg2ZSwgMHg3NCwKKyAweDIwLCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDI5LCAweDBhLCAweDdiLCAweDBhLCAweDA5LCAweDczLCAweDc0LCAweDcyLCAweDc1LCAweDYzLCAweDc0LAorIDB4MjAsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4MjAsIDB4NzMsIDB4NzQsIDB4M2IsIDB4MGEsIDB4MGEsIDB4MDksIDB4NzMsIDB4NzQsIDB4NzIsIDB4NzUsCisgMHg3MCwgMHg3MCwgMHg2NSwgMHg3MiwgMHgyOCwgMHg2NiwgMHg2ZSwgMHg2MSwgMHg2ZCwgMHg2NSwgMHgyOSwgMHgzYiwgMHgwYSwgMHgwYSwgMHgwOSwgMHg2OSwKKyAweDY2LCAweDIwLCAweDI4LCAweDczLCAweDc0LCAweDYxLCAweDc0LCAweDI4LCAweDY2LCAweDZlLCAweDYxLCAweDZkLCAweDY1LCAweDJjLCAweDIwLCAweDI2LAorIDB4NzMsIDB4NzQsIDB4MjksIDB4MjAsIDB4MjEsIDB4M2QsIDB4MjAsIDB4MzAsIDB4MjksIDB4MjAsIDB4N2IsIDB4MGEsIDB4MDksIDB4MDksIDB4NzAsIDB4NzIsCisgMHg2OSwgMHg2ZSwgMHg3NCwgMHg2NiwgMHgyOCwgMHgyMiwgMHgyOCwgMHgyNSwgMHg2NCwgMHgyOSwgMHgyMCwgMHg2NCwgMHg2ZiwgMHg1ZiwgMHg3MywgMHg3NCwKKyAweDYxLCAweDc0LCAweDNhLCAweDIwLCAweDI1LCAweDczLCAweDIwLCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDNkLCAweDI1LCAweDY0LCAweDIwLCAweDI1LAorIDB4NzMsIDB4NWMsIDB4NmUsIDB4MjIsIDB4MmMsIDB4MjAsIDB4MGEsIDB4MDksIDB4MDksIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsCisgMHg2YywgMHg2OSwgMHg2ZSwgMHg2NSwgMHg1ZiwgMHg2MywgMHg2ZiwgMHg3NSwgMHg2ZSwgMHg3NCwgMHgyYywgMHgyMCwgMHg2NiwgMHg2ZSwgMHg2MSwgMHg2ZCwKKyAweDY1LCAweDJjLCAweDIwLCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDJjLCAweDIwLCAweDczLCAweDc0LCAweDcyLCAweDY1LCAweDcyLCAweDcyLCAweDZmLAorIDB4NzIsIDB4MjgsIDB4NjUsIDB4NzIsIDB4NzIsIDB4NmUsIDB4NmYsIDB4MjksIDB4MjksIDB4M2IsIDB4MGEsIDB4MDksIDB4MDksIDB4NzIsIDB4NjUsIDB4NzQsCisgMHg3NSwgMHg3MiwgMHg2ZSwgMHgzYiwgMHgwYSwgMHgwOSwgMHg3ZCwgMHgwYSwgMHgwOSwgMHg2OSwgMHg2NiwgMHgyMCwgMHgyOCwgMHg1MywgMHg1ZiwgMHg0OSwKKyAweDUzLCAweDQ0LCAweDQ5LCAweDUyLCAweDI4LCAweDczLCAweDc0LCAweDJlLCAweDczLCAweDc0LCAweDVmLCAweDZkLCAweDZmLCAweDY0LCAweDY1LCAweDI5LAorIDB4MjksIDB4MjAsIDB4NzIsIDB4NjUsIDB4NzQsIDB4NzUsIDB4NzIsIDB4NmUsIDB4M2IsIDB4MGEsIDB4MGEsIDB4MDksIDB4NjksIDB4NjYsIDB4MjAsIDB4MjgsCisgMHg3MywgMHg3NCwgMHgyZSwgMHg3MywgMHg3NCwgMHg1ZiwgMHg3MywgMHg2OSwgMHg3YSwgMHg2NSwgMHgyMCwgMHgyMSwgMHgzZCwgMHgyMCwgMHg3MywgMHg2OSwKKyAweDdhLCAweDY1LCAweDI5LCAweDIwLCAweDdiLCAweDBhLCAweDA5LCAweDA5LCAweDcwLCAweDcyLCAweDY5LCAweDZlLCAweDc0LCAweDY2LCAweDI4LCAweDIyLAorIDB4MjgsIDB4MjUsIDB4NjQsIDB4MjksIDB4MjAsIDB4NjQsIDB4NmYsIDB4NWYsIDB4NzMsIDB4NzQsIDB4NjEsIDB4NzQsIDB4M2EsIDB4MjAsIDB4MjUsIDB4NzMsCisgMHgyMCwgMHg3NywgMHg3MiwgMHg2ZiwgMHg2ZSwgMHg2NywgMHgyMCwgMHg3MywgMHg2OSwgMHg3YSwgMHg2NSwgMHgyMCwgMHgyNSwgMHg2NCwgMHgyMCwgMHgyNSwKKyAweDY0LCAweDVjLCAweDZlLCAweDIyLCAweDJjLCAweDIwLCAweDBhLCAweDA5LCAweDA5LCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorIDB4NmMsIDB4NjksIDB4NmUsIDB4NjUsIDB4NWYsIDB4NjMsIDB4NmYsIDB4NzUsIDB4NmUsIDB4NzQsIDB4MmMsIDB4MjAsIDB4NjYsIDB4NmUsIDB4NjEsIDB4NmQsCisgMHg2NSwgMHgyYywgMHgyMCwgMHgyOCwgMHg2OSwgMHg2ZSwgMHg3NCwgMHgyOSwgMHg3MywgMHg3NCwgMHgyZSwgMHg3MywgMHg3NCwgMHg1ZiwgMHg3MywgMHg2OSwKKyAweDdhLCAweDY1LCAweDJjLCAweDIwLCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDI5LCAweDNiLCAweDBhLCAweDA5LCAweDdkLCAweDBhLCAweDdkLCAweDBhLAorIDB4MGEsIDB4NzYsIDB4NmYsIDB4NjksIDB4NjQsIDB4MjAsIDB4NjQsIDB4NmYsIDB4NWYsIDB4NjMsIDB4NzIsIDB4NjUsIDB4NjEsIDB4NzQsIDB4NjUsIDB4MjgsCisgMHg2MywgMHg2OCwgMHg2MSwgMHg3MiwgMHgyMCwgMHgyYSwgMHg2NiwgMHg2ZSwgMHg2MSwgMHg2ZCwgMHg2NSwgMHgyYywgMHgyMCwgMHg2OSwgMHg2ZSwgMHg3NCwKKyAweDIwLCAweDczLCAweDY5LCAweDdhLCAweDY1LCAweDI5LCAweDBhLCAweDdiLCAweDBhLCAweDA5LCAweDY0LCAweDZmLCAweDVmLCAweDZmLCAweDcwLCAweDY1LAorIDB4NmUsIDB4MjgsIDB4NjYsIDB4NmUsIDB4NjEsIDB4NmQsIDB4NjUsIDB4MmMsIDB4MjAsIDB4MzUsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MmMsIDB4MjAsIDB4NzMsCisgMHg2OSwgMHg3YSwgMHg2NSwgMHgyOSwgMHgzYiwgMHgwYSwgMHgwOSwgMHg2NCwgMHg2ZiwgMHg1ZiwgMHg2MywgMHg2YywgMHg2ZiwgMHg3MywgMHg2NSwgMHgyOCwKKyAweDM1LCAweDMwLCAweDMwLCAweDMwLCAweDI5LCAweDNiLCAweDBhLCAweDdkLCAweDBhCit9OworI2VuZGlmCitzdGF0aWMgdW5zaWduZWQgY2hhciBjb21wcmJ1ZltURVNUREFUQV9MRU5dOworc3RhdGljIHVuc2lnbmVkIGNoYXIgZGVjb21wcmJ1ZltURVNUREFUQV9MRU5dOworCitpbnQgamZmczJfZGVjb21wcmVzcyh1bnNpZ25lZCBjaGFyIGNvbXBydHlwZSwgdW5zaWduZWQgY2hhciAqY2RhdGFfaW4sIAorCQkgICAgIHVuc2lnbmVkIGNoYXIgKmRhdGFfb3V0LCB1aW50MzJfdCBjZGF0YWxlbiwgdWludDMyX3QgZGF0YWxlbik7Cit1bnNpZ25lZCBjaGFyIGpmZnMyX2NvbXByZXNzKHVuc2lnbmVkIGNoYXIgKmRhdGFfaW4sIHVuc2lnbmVkIGNoYXIgKmNwYWdlX291dCwgCisJCQkgICAgIHVpbnQzMl90ICpkYXRhbGVuLCB1aW50MzJfdCAqY2RhdGFsZW4pOworCitpbnQgaW5pdF9tb2R1bGUodm9pZCApIHsKKwl1bnNpZ25lZCBjaGFyIGNvbXBydHlwZTsKKwl1aW50MzJfdCBjLCBkOworCWludCByZXQ7CisKKwlwcmludGsoIk9yaWdpbmFsIGRhdGE6ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJICAgICAgIHRlc3RkYXRhWzBdLHRlc3RkYXRhWzFdLHRlc3RkYXRhWzJdLHRlc3RkYXRhWzNdLCAKKwkgICAgICAgdGVzdGRhdGFbNF0sdGVzdGRhdGFbNV0sdGVzdGRhdGFbNl0sdGVzdGRhdGFbN10sIAorCSAgICAgICB0ZXN0ZGF0YVs4XSx0ZXN0ZGF0YVs5XSx0ZXN0ZGF0YVsxMF0sdGVzdGRhdGFbMTFdLCAKKwkgICAgICAgdGVzdGRhdGFbMTJdLHRlc3RkYXRhWzEzXSx0ZXN0ZGF0YVsxNF0sdGVzdGRhdGFbMTVdKTsgCisJZCA9IFRFU1REQVRBX0xFTjsKKwljID0gVEVTVERBVEFfTEVOOworCWNvbXBydHlwZSA9IGpmZnMyX2NvbXByZXNzKHRlc3RkYXRhLCBjb21wcmJ1ZiwgJmQsICZjKTsKKworCXByaW50aygiamZmczJfY29tcHJlc3MgdXNlZCBjb21wcmVzc2lvbiB0eXBlICVkLiBDb21wcmVzc2VkIHNpemUgJWQsIHVuY29tcHJlc3NlZCBzaXplICVkXG4iLAorCSAgICAgICBjb21wcnR5cGUsIGMsIGQpOworCXByaW50aygiQ29tcHJlc3NlZCBkYXRhOiAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLAorCSAgICAgICBjb21wcmJ1ZlswXSxjb21wcmJ1ZlsxXSxjb21wcmJ1ZlsyXSxjb21wcmJ1ZlszXSwgCisJICAgICAgIGNvbXByYnVmWzRdLGNvbXByYnVmWzVdLGNvbXByYnVmWzZdLGNvbXByYnVmWzddLCAKKwkgICAgICAgY29tcHJidWZbOF0sY29tcHJidWZbOV0sY29tcHJidWZbMTBdLGNvbXByYnVmWzExXSwgCisJICAgICAgIGNvbXByYnVmWzEyXSxjb21wcmJ1ZlsxM10sY29tcHJidWZbMTRdLGNvbXByYnVmWzE1XSk7IAorCisJcmV0ID0gamZmczJfZGVjb21wcmVzcyhjb21wcnR5cGUsIGNvbXByYnVmLCBkZWNvbXByYnVmLCBjLCBkKTsKKwlwcmludGsoImpmZnMyX2RlY29tcHJlc3MgcmV0dXJuZWQgJWRcbiIsIHJldCk7CisJcHJpbnRrKCJEZWNvbXByZXNzZWQgZGF0YTogICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJICAgICAgIGRlY29tcHJidWZbMF0sZGVjb21wcmJ1ZlsxXSxkZWNvbXByYnVmWzJdLGRlY29tcHJidWZbM10sIAorCSAgICAgICBkZWNvbXByYnVmWzRdLGRlY29tcHJidWZbNV0sZGVjb21wcmJ1Zls2XSxkZWNvbXByYnVmWzddLCAKKwkgICAgICAgZGVjb21wcmJ1Zls4XSxkZWNvbXByYnVmWzldLGRlY29tcHJidWZbMTBdLGRlY29tcHJidWZbMTFdLCAKKwkgICAgICAgZGVjb21wcmJ1ZlsxMl0sZGVjb21wcmJ1ZlsxM10sZGVjb21wcmJ1ZlsxNF0sZGVjb21wcmJ1ZlsxNV0pOyAKKwlpZiAobWVtY21wKGRlY29tcHJidWYsIHRlc3RkYXRhLCBkKSkKKwkJcHJpbnRrKCJDb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiBjb3JydXB0ZWQgZGF0YVxuIik7CisJZWxzZQorCQlwcmludGsoIkNvbXByZXNzaW9uIGdvb2QgZm9yICVkIGJ5dGVzXG4iLCBkKTsKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2Rpci5jIGIvZnMvamZmczIvZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU3MzA2ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMyL2Rpci5jCkBAIC0wLDAgKzEsNzk5IEBACisvKgorICogSkZGUzIgLS0gSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0sIFZlcnNpb24gMi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CisgKgorICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KKyAqCisgKiAkSWQ6IGRpci5jLHYgMS44NCAyMDA0LzExLzE2IDIwOjM2OjExIGR3bXcyIEV4cCAkCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvamZmczIuaD4KKyNpbmNsdWRlIDxsaW51eC9qZmZzMl9mc19pLmg+CisjaW5jbHVkZSA8bGludXgvamZmczJfZnNfc2IuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSAibm9kZWxpc3QuaCIKKworLyogVXJnaC4gUGxlYXNlIHRlbGwgbWUgdGhlcmUncyBhIG5pY2VyIHdheSBvZiBkb2luZyB0aGVzZS4gKi8KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDQ4KQordHlwZWRlZiBpbnQgbWtub2RfYXJnX3Q7CisjZGVmaW5lIE5BTUVJX0NPTVBBVCh4KSAoKHZvaWQgKil4KQorI2Vsc2UKK3R5cGVkZWYgZGV2X3QgbWtub2RfYXJnX3Q7CisjZGVmaW5lIE5BTUVJX0NPTVBBVCh4KSAoeCkKKyNlbmRpZgorCitzdGF0aWMgaW50IGpmZnMyX3JlYWRkaXIgKHN0cnVjdCBmaWxlICosIHZvaWQgKiwgZmlsbGRpcl90KTsKKworc3RhdGljIGludCBqZmZzMl9jcmVhdGUgKHN0cnVjdCBpbm9kZSAqLHN0cnVjdCBkZW50cnkgKixpbnQsCisJCQkgc3RydWN0IG5hbWVpZGF0YSAqKTsKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpqZmZzMl9sb29rdXAgKHN0cnVjdCBpbm9kZSAqLHN0cnVjdCBkZW50cnkgKiwKKwkJCQkgICAgc3RydWN0IG5hbWVpZGF0YSAqKTsKK3N0YXRpYyBpbnQgamZmczJfbGluayAoc3RydWN0IGRlbnRyeSAqLHN0cnVjdCBpbm9kZSAqLHN0cnVjdCBkZW50cnkgKik7CitzdGF0aWMgaW50IGpmZnMyX3VubGluayAoc3RydWN0IGlub2RlICosc3RydWN0IGRlbnRyeSAqKTsKK3N0YXRpYyBpbnQgamZmczJfc3ltbGluayAoc3RydWN0IGlub2RlICosc3RydWN0IGRlbnRyeSAqLGNvbnN0IGNoYXIgKik7CitzdGF0aWMgaW50IGpmZnMyX21rZGlyIChzdHJ1Y3QgaW5vZGUgKixzdHJ1Y3QgZGVudHJ5ICosaW50KTsKK3N0YXRpYyBpbnQgamZmczJfcm1kaXIgKHN0cnVjdCBpbm9kZSAqLHN0cnVjdCBkZW50cnkgKik7CitzdGF0aWMgaW50IGpmZnMyX21rbm9kIChzdHJ1Y3QgaW5vZGUgKixzdHJ1Y3QgZGVudHJ5ICosaW50LG1rbm9kX2FyZ190KTsKK3N0YXRpYyBpbnQgamZmczJfcmVuYW1lIChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKik7CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgamZmczJfZGlyX29wZXJhdGlvbnMgPQoreworCS5yZWFkID0JCWdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIgPQlqZmZzMl9yZWFkZGlyLAorCS5pb2N0bCA9CWpmZnMyX2lvY3RsLAorCS5mc3luYyA9CWpmZnMyX2ZzeW5jCit9OworCisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGpmZnMyX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0KK3sKKwkuY3JlYXRlID0JTkFNRUlfQ09NUEFUKGpmZnMyX2NyZWF0ZSksCisJLmxvb2t1cCA9CU5BTUVJX0NPTVBBVChqZmZzMl9sb29rdXApLAorCS5saW5rID0JCWpmZnMyX2xpbmssCisJLnVubGluayA9CWpmZnMyX3VubGluaywKKwkuc3ltbGluayA9CWpmZnMyX3N5bWxpbmssCisJLm1rZGlyID0JamZmczJfbWtkaXIsCisJLnJtZGlyID0JamZmczJfcm1kaXIsCisJLm1rbm9kID0JamZmczJfbWtub2QsCisJLnJlbmFtZSA9CWpmZnMyX3JlbmFtZSwKKwkuc2V0YXR0ciA9CWpmZnMyX3NldGF0dHIsCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyogV2Uga2VlcCB0aGUgZGlyZW50IGxpc3Qgc29ydGVkIGluIGluY3JlYXNpbmcgb3JkZXIgb2YgbmFtZSBoYXNoLAorICAgYW5kIHdlIHVzZSB0aGUgc2FtZSBoYXNoIGZ1bmN0aW9uIGFzIHRoZSBkZW50cmllcy4gTWFrZXMgdGhpcyAKKyAgIG5pY2UgYW5kIHNpbXBsZQorKi8KK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpqZmZzMl9sb29rdXAoc3RydWN0IGlub2RlICpkaXJfaSwgc3RydWN0IGRlbnRyeSAqdGFyZ2V0LAorCQkJCSAgIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpkaXJfZjsKKwlzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYzsKKwlzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKmZkID0gTlVMTCwgKmZkX2xpc3Q7CisJdWludDMyX3QgaW5vID0gMDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9sb29rdXAoKVxuIikpOworCisJZGlyX2YgPSBKRkZTMl9JTk9ERV9JTkZPKGRpcl9pKTsKKwljID0gSkZGUzJfU0JfSU5GTyhkaXJfaS0+aV9zYik7CisKKwlkb3duKCZkaXJfZi0+c2VtKTsKKworCS8qIE5COiBUaGUgMi4yIGJhY2twb3J0IHdpbGwgbmVlZCB0byBleHBsaWNpdGx5IGNoZWNrIGZvciAnLicgYW5kICcuLicgaGVyZSAqLworCWZvciAoZmRfbGlzdCA9IGRpcl9mLT5kZW50czsgZmRfbGlzdCAmJiBmZF9saXN0LT5uaGFzaCA8PSB0YXJnZXQtPmRfbmFtZS5oYXNoOyBmZF9saXN0ID0gZmRfbGlzdC0+bmV4dCkgeworCQlpZiAoZmRfbGlzdC0+bmhhc2ggPT0gdGFyZ2V0LT5kX25hbWUuaGFzaCAmJiAKKwkJICAgICghZmQgfHwgZmRfbGlzdC0+dmVyc2lvbiA+IGZkLT52ZXJzaW9uKSAmJgorCQkgICAgc3RybGVuKGZkX2xpc3QtPm5hbWUpID09IHRhcmdldC0+ZF9uYW1lLmxlbiAmJgorCQkgICAgIXN0cm5jbXAoZmRfbGlzdC0+bmFtZSwgdGFyZ2V0LT5kX25hbWUubmFtZSwgdGFyZ2V0LT5kX25hbWUubGVuKSkgeworCQkJZmQgPSBmZF9saXN0OworCQl9CisJfQorCWlmIChmZCkKKwkJaW5vID0gZmQtPmlubzsKKwl1cCgmZGlyX2YtPnNlbSk7CisJaWYgKGlubykgeworCQlpbm9kZSA9IGlnZXQoZGlyX2ktPmlfc2IsIGlubyk7CisJCWlmICghaW5vZGUpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImlnZXQoKSBmYWlsZWQgZm9yIGlubyAjJXVcbiIsIGlubyk7CisJCQlyZXR1cm4gKEVSUl9QVFIoLUVJTykpOworCQl9CisJfQorCisJZF9hZGQodGFyZ2V0LCBpbm9kZSk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0YXRpYyBpbnQgamZmczJfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwlzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZjsKKwlzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICpmZDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCwgY3Vyb2ZzOworCisJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX3JlYWRkaXIoKSBmb3IgZGlyX2kgIyVsdVxuIiwgZmlscC0+Zl9kZW50cnktPmRfaW5vZGUtPmlfaW5vKSk7CisKKwlmID0gSkZGUzJfSU5PREVfSU5GTyhpbm9kZSk7CisJYyA9IEpGRlMyX1NCX0lORk8oaW5vZGUtPmlfc2IpOworCisJb2Zmc2V0ID0gZmlscC0+Zl9wb3M7CisKKwlpZiAob2Zmc2V0ID09IDApIHsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkRpcmVudCAwOiBcIi5cIiwgaW5vICMlbHVcbiIsIGlub2RlLT5pX2lubykpOworCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuIiwgMSwgMCwgaW5vZGUtPmlfaW5vLCBEVF9ESVIpIDwgMCkKKwkJCWdvdG8gb3V0OworCQlvZmZzZXQrKzsKKwl9CisJaWYgKG9mZnNldCA9PSAxKSB7CisJCXVuc2lnbmVkIGxvbmcgcGlubyA9IHBhcmVudF9pbm8oZmlscC0+Zl9kZW50cnkpOworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRGlyZW50IDE6IFwiLi5cIiwgaW5vICMlbHVcbiIsIHBpbm8pKTsKKwkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLi4iLCAyLCAxLCBwaW5vLCBEVF9ESVIpIDwgMCkKKwkJCWdvdG8gb3V0OworCQlvZmZzZXQrKzsKKwl9CisKKwljdXJvZnM9MTsKKwlkb3duKCZmLT5zZW0pOworCWZvciAoZmQgPSBmLT5kZW50czsgZmQ7IGZkID0gZmQtPm5leHQpIHsKKworCQljdXJvZnMrKzsKKwkJLyogRmlyc3QgbG9vcDogY3Vyb2ZzID0gMjsgb2Zmc2V0ID0gMiAqLworCQlpZiAoY3Vyb2ZzIDwgb2Zmc2V0KSB7CisJCQlEMihwcmludGsoS0VSTl9ERUJVRyAiU2tpcHBpbmcgZGlyZW50OiBcIiVzXCIsIGlubyAjJXUsIHR5cGUgJWQsIGJlY2F1c2UgY3Vyb2ZzICVsZCA8IG9mZnNldCAlbGRcbiIsIAorCQkJCSAgZmQtPm5hbWUsIGZkLT5pbm8sIGZkLT50eXBlLCBjdXJvZnMsIG9mZnNldCkpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFmZC0+aW5vKSB7CisJCQlEMihwcmludGsoS0VSTl9ERUJVRyAiU2tpcHBpbmcgZGVsZXRpb24gZGlyZW50IFwiJXNcIlxuIiwgZmQtPm5hbWUpKTsKKwkJCW9mZnNldCsrOworCQkJY29udGludWU7CisJCX0KKwkJRDIocHJpbnRrKEtFUk5fREVCVUcgIkRpcmVudCAlbGQ6IFwiJXNcIiwgaW5vICMldSwgdHlwZSAlZFxuIiwgb2Zmc2V0LCBmZC0+bmFtZSwgZmQtPmlubywgZmQtPnR5cGUpKTsKKwkJaWYgKGZpbGxkaXIoZGlyZW50LCBmZC0+bmFtZSwgc3RybGVuKGZkLT5uYW1lKSwgb2Zmc2V0LCBmZC0+aW5vLCBmZC0+dHlwZSkgPCAwKQorCQkJYnJlYWs7CisJCW9mZnNldCsrOworCX0KKwl1cCgmZi0+c2VtKTsKKyBvdXQ6CisJZmlscC0+Zl9wb3MgPSBvZmZzZXQ7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitzdGF0aWMgaW50IGpmZnMyX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpcl9pLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLAorCQkJc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGpmZnMyX3Jhd19pbm9kZSAqcmk7CisJc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsICpkaXJfZjsKKwlzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWludCByZXQ7CisKKwlyaSA9IGpmZnMyX2FsbG9jX3Jhd19pbm9kZSgpOworCWlmICghcmkpCisJCXJldHVybiAtRU5PTUVNOworCQorCWMgPSBKRkZTMl9TQl9JTkZPKGRpcl9pLT5pX3NiKTsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9jcmVhdGUoKVxuIikpOworCisJaW5vZGUgPSBqZmZzMl9uZXdfaW5vZGUoZGlyX2ksIG1vZGUsIHJpKTsKKworCWlmIChJU19FUlIoaW5vZGUpKSB7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9uZXdfaW5vZGUoKSBmYWlsZWRcbiIpKTsKKwkJamZmczJfZnJlZV9yYXdfaW5vZGUocmkpOworCQlyZXR1cm4gUFRSX0VSUihpbm9kZSk7CisJfQorCisJaW5vZGUtPmlfb3AgPSAmamZmczJfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCWlub2RlLT5pX2ZvcCA9ICZqZmZzMl9maWxlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmamZmczJfZmlsZV9hZGRyZXNzX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfbWFwcGluZy0+bnJwYWdlcyA9IDA7CisKKwlmID0gSkZGUzJfSU5PREVfSU5GTyhpbm9kZSk7CisJZGlyX2YgPSBKRkZTMl9JTk9ERV9JTkZPKGRpcl9pKTsKKworCXJldCA9IGpmZnMyX2RvX2NyZWF0ZShjLCBkaXJfZiwgZiwgcmksIAorCQkJICAgICAgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuKTsKKworCWlmIChyZXQpIHsKKwkJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCQlpcHV0KGlub2RlKTsKKwkJamZmczJfZnJlZV9yYXdfaW5vZGUocmkpOworCQlyZXR1cm4gcmV0OworCX0KKworCWRpcl9pLT5pX210aW1lID0gZGlyX2ktPmlfY3RpbWUgPSBJVElNRShqZTMyX3RvX2NwdShyaS0+Y3RpbWUpKTsKKworCWpmZnMyX2ZyZWVfcmF3X2lub2RlKHJpKTsKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCisJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2NyZWF0ZTogQ3JlYXRlZCBpbm8gIyVsdSB3aXRoIG1vZGUgJW8sIG5saW5rICVkKCVkKS4gbnJwYWdlcyAlbGRcbiIsCisJCSAgaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV9tb2RlLCBpbm9kZS0+aV9ubGluaywgZi0+aW5vY2FjaGUtPm5saW5rLCBpbm9kZS0+aV9tYXBwaW5nLT5ucnBhZ2VzKSk7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitzdGF0aWMgaW50IGpmZnMyX3VubGluayhzdHJ1Y3QgaW5vZGUgKmRpcl9pLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGpmZnMyX3NiX2luZm8gKmMgPSBKRkZTMl9TQl9JTkZPKGRpcl9pLT5pX3NiKTsKKwlzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZGlyX2YgPSBKRkZTMl9JTk9ERV9JTkZPKGRpcl9pKTsKKwlzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZGVhZF9mID0gSkZGUzJfSU5PREVfSU5GTyhkZW50cnktPmRfaW5vZGUpOworCWludCByZXQ7CisKKwlyZXQgPSBqZmZzMl9kb191bmxpbmsoYywgZGlyX2YsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIAorCQkJICAgICAgIGRlbnRyeS0+ZF9uYW1lLmxlbiwgZGVhZF9mKTsKKwlpZiAoZGVhZF9mLT5pbm9jYWNoZSkKKwkJZGVudHJ5LT5kX2lub2RlLT5pX25saW5rID0gZGVhZF9mLT5pbm9jYWNoZS0+bmxpbms7CisJcmV0dXJuIHJldDsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitzdGF0aWMgaW50IGpmZnMyX2xpbmsgKHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksIHN0cnVjdCBpbm9kZSAqZGlyX2ksIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyA9IEpGRlMyX1NCX0lORk8ob2xkX2RlbnRyeS0+ZF9pbm9kZS0+aV9zYik7CisJc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYgPSBKRkZTMl9JTk9ERV9JTkZPKG9sZF9kZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpkaXJfZiA9IEpGRlMyX0lOT0RFX0lORk8oZGlyX2kpOworCWludCByZXQ7CisJdWludDhfdCB0eXBlOworCisJLyogRG9uJ3QgbGV0IHBlb3BsZSBtYWtlIGhhcmQgbGlua3MgdG8gYmFkIGlub2Rlcy4gKi8KKwlpZiAoIWYtPmlub2NhY2hlKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChTX0lTRElSKG9sZF9kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiAtRVBFUk07CisKKwkvKiBYWFg6IFRoaXMgaXMgdWdseSAqLworCXR5cGUgPSAob2xkX2RlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlICYgU19JRk1UKSA+PiAxMjsKKwlpZiAoIXR5cGUpIHR5cGUgPSBEVF9SRUc7CisKKwlyZXQgPSBqZmZzMl9kb19saW5rKGMsIGRpcl9mLCBmLT5pbm9jYWNoZS0+aW5vLCB0eXBlLCBkZW50cnktPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5sZW4pOworCisJaWYgKCFyZXQpIHsKKwkJZG93bigmZi0+c2VtKTsKKwkJb2xkX2RlbnRyeS0+ZF9pbm9kZS0+aV9ubGluayA9ICsrZi0+aW5vY2FjaGUtPm5saW5rOworCQl1cCgmZi0+c2VtKTsKKwkJZF9pbnN0YW50aWF0ZShkZW50cnksIG9sZF9kZW50cnktPmRfaW5vZGUpOworCQlhdG9taWNfaW5jKCZvbGRfZGVudHJ5LT5kX2lub2RlLT5pX2NvdW50KTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IGpmZnMyX3N5bWxpbmsgKHN0cnVjdCBpbm9kZSAqZGlyX2ksIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqdGFyZ2V0KQoreworCXN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLCAqZGlyX2Y7CisJc3RydWN0IGpmZnMyX3NiX2luZm8gKmM7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgamZmczJfcmF3X2lub2RlICpyaTsKKwlzdHJ1Y3QgamZmczJfcmF3X2RpcmVudCAqcmQ7CisJc3RydWN0IGpmZnMyX2Z1bGxfZG5vZGUgKmZuOworCXN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqZmQ7CisJaW50IG5hbWVsZW47CisJdWludDMyX3QgYWxsb2NsZW4sIHBoeXNfb2ZzOworCWludCByZXQ7CisKKwkvKiBGSVhNRTogSWYgeW91IGNhcmUuIFdlJ2QgbmVlZCB0byB1c2UgZnJhZ3MgZm9yIHRoZSB0YXJnZXQKKwkgICBpZiBpdCBncm93cyBtdWNoIG1vcmUgdGhhbiB0aGlzICovCisJaWYgKHN0cmxlbih0YXJnZXQpID4gMjU0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJpID0gamZmczJfYWxsb2NfcmF3X2lub2RlKCk7CisKKwlpZiAoIXJpKQorCQlyZXR1cm4gLUVOT01FTTsKKwkKKwljID0gSkZGUzJfU0JfSU5GTyhkaXJfaS0+aV9zYik7CisJCisJLyogVHJ5IHRvIHJlc2VydmUgZW5vdWdoIHNwYWNlIGZvciBib3RoIG5vZGUgYW5kIGRpcmVudC4gCisJICogSnVzdCB0aGUgbm9kZSB3aWxsIGRvIGZvciBub3csIHRob3VnaCAKKwkgKi8KKwluYW1lbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCXJldCA9IGpmZnMyX3Jlc2VydmVfc3BhY2UoYywgc2l6ZW9mKCpyaSkgKyBzdHJsZW4odGFyZ2V0KSwgJnBoeXNfb2ZzLCAmYWxsb2NsZW4sIEFMTE9DX05PUk1BTCk7CisKKwlpZiAocmV0KSB7CisJCWpmZnMyX2ZyZWVfcmF3X2lub2RlKHJpKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpbm9kZSA9IGpmZnMyX25ld19pbm9kZShkaXJfaSwgU19JRkxOSyB8IFNfSVJXWFVHTywgcmkpOworCisJaWYgKElTX0VSUihpbm9kZSkpIHsKKwkJamZmczJfZnJlZV9yYXdfaW5vZGUocmkpOworCQlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKwkJcmV0dXJuIFBUUl9FUlIoaW5vZGUpOworCX0KKworCWlub2RlLT5pX29wID0gJmpmZnMyX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKworCWYgPSBKRkZTMl9JTk9ERV9JTkZPKGlub2RlKTsKKworCWlub2RlLT5pX3NpemUgPSBzdHJsZW4odGFyZ2V0KTsKKwlyaS0+aXNpemUgPSByaS0+ZHNpemUgPSByaS0+Y3NpemUgPSBjcHVfdG9famUzMihpbm9kZS0+aV9zaXplKTsKKwlyaS0+dG90bGVuID0gY3B1X3RvX2plMzIoc2l6ZW9mKCpyaSkgKyBpbm9kZS0+aV9zaXplKTsKKwlyaS0+aGRyX2NyYyA9IGNwdV90b19qZTMyKGNyYzMyKDAsIHJpLCBzaXplb2Yoc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSktNCkpOworCisJcmktPmNvbXByID0gSkZGUzJfQ09NUFJfTk9ORTsKKwlyaS0+ZGF0YV9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCB0YXJnZXQsIHN0cmxlbih0YXJnZXQpKSk7CisJcmktPm5vZGVfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgcmksIHNpemVvZigqcmkpLTgpKTsKKwkKKwlmbiA9IGpmZnMyX3dyaXRlX2Rub2RlKGMsIGYsIHJpLCB0YXJnZXQsIHN0cmxlbih0YXJnZXQpLCBwaHlzX29mcywgQUxMT0NfTk9STUFMKTsKKworCWpmZnMyX2ZyZWVfcmF3X2lub2RlKHJpKTsKKworCWlmIChJU19FUlIoZm4pKSB7CisJCS8qIEVlZWsuIFdhdmUgYnllIGJ5ZSAqLworCQl1cCgmZi0+c2VtKTsKKwkJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7CisJCWpmZnMyX2NsZWFyX2lub2RlKGlub2RlKTsKKwkJcmV0dXJuIFBUUl9FUlIoZm4pOworCX0KKwkvKiBObyBkYXRhIGhlcmUuIE9ubHkgYSBtZXRhZGF0YSBub2RlLCB3aGljaCB3aWxsIGJlIAorCSAgIG9ic29sZXRlZCBieSB0aGUgZmlyc3QgZGF0YSB3cml0ZQorCSovCisJZi0+bWV0YWRhdGEgPSBmbjsKKwl1cCgmZi0+c2VtKTsKKworCWpmZnMyX2NvbXBsZXRlX3Jlc2VydmF0aW9uKGMpOworCXJldCA9IGpmZnMyX3Jlc2VydmVfc3BhY2UoYywgc2l6ZW9mKCpyZCkrbmFtZWxlbiwgJnBoeXNfb2ZzLCAmYWxsb2NsZW4sIEFMTE9DX05PUk1BTCk7CisJaWYgKHJldCkgeworCQkvKiBFZXAuICovCisJCWpmZnMyX2NsZWFyX2lub2RlKGlub2RlKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZCA9IGpmZnMyX2FsbG9jX3Jhd19kaXJlbnQoKTsKKwlpZiAoIXJkKSB7CisJCS8qIEFyZ2guIE5vdyB3ZSB0cmVhdCBpdCBsaWtlIGEgbm9ybWFsIGRlbGV0ZSAqLworCQlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKwkJamZmczJfY2xlYXJfaW5vZGUoaW5vZGUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkaXJfZiA9IEpGRlMyX0lOT0RFX0lORk8oZGlyX2kpOworCWRvd24oJmRpcl9mLT5zZW0pOworCisJcmQtPm1hZ2ljID0gY3B1X3RvX2plMTYoSkZGUzJfTUFHSUNfQklUTUFTSyk7CisJcmQtPm5vZGV0eXBlID0gY3B1X3RvX2plMTYoSkZGUzJfTk9ERVRZUEVfRElSRU5UKTsKKwlyZC0+dG90bGVuID0gY3B1X3RvX2plMzIoc2l6ZW9mKCpyZCkgKyBuYW1lbGVuKTsKKwlyZC0+aGRyX2NyYyA9IGNwdV90b19qZTMyKGNyYzMyKDAsIHJkLCBzaXplb2Yoc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSktNCkpOworCisJcmQtPnBpbm8gPSBjcHVfdG9famUzMihkaXJfaS0+aV9pbm8pOworCXJkLT52ZXJzaW9uID0gY3B1X3RvX2plMzIoKytkaXJfZi0+aGlnaGVzdF92ZXJzaW9uKTsKKwlyZC0+aW5vID0gY3B1X3RvX2plMzIoaW5vZGUtPmlfaW5vKTsKKwlyZC0+bWN0aW1lID0gY3B1X3RvX2plMzIoZ2V0X3NlY29uZHMoKSk7CisJcmQtPm5zaXplID0gbmFtZWxlbjsKKwlyZC0+dHlwZSA9IERUX0xOSzsKKwlyZC0+bm9kZV9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCByZCwgc2l6ZW9mKCpyZCktOCkpOworCXJkLT5uYW1lX2NyYyA9IGNwdV90b19qZTMyKGNyYzMyKDAsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIG5hbWVsZW4pKTsKKworCWZkID0gamZmczJfd3JpdGVfZGlyZW50KGMsIGRpcl9mLCByZCwgZGVudHJ5LT5kX25hbWUubmFtZSwgbmFtZWxlbiwgcGh5c19vZnMsIEFMTE9DX05PUk1BTCk7CisKKwlpZiAoSVNfRVJSKGZkKSkgeworCQkvKiBkaXJlbnQgZmFpbGVkIHRvIHdyaXRlLiBEZWxldGUgdGhlIGlub2RlIG5vcm1hbGx5IAorCQkgICBhcyBpZiBpdCB3ZXJlIHRoZSBmaW5hbCB1bmxpbmsoKSAqLworCQlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKwkJamZmczJfZnJlZV9yYXdfZGlyZW50KHJkKTsKKwkJdXAoJmRpcl9mLT5zZW0pOworCQlqZmZzMl9jbGVhcl9pbm9kZShpbm9kZSk7CisJCXJldHVybiBQVFJfRVJSKGZkKTsKKwl9CisKKwlkaXJfaS0+aV9tdGltZSA9IGRpcl9pLT5pX2N0aW1lID0gSVRJTUUoamUzMl90b19jcHUocmQtPm1jdGltZSkpOworCisJamZmczJfZnJlZV9yYXdfZGlyZW50KHJkKTsKKworCS8qIExpbmsgdGhlIGZkIGludG8gdGhlIGlub2RlJ3MgbGlzdCwgb2Jzb2xldGluZyBhbiBvbGQKKwkgICBvbmUgaWYgbmVjZXNzYXJ5LiAqLworCWpmZnMyX2FkZF9mZF90b19saXN0KGMsIGZkLCAmZGlyX2YtPmRlbnRzKTsKKworCXVwKCZkaXJfZi0+c2VtKTsKKwlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBqZmZzMl9ta2RpciAoc3RydWN0IGlub2RlICpkaXJfaSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiwgKmRpcl9mOworCXN0cnVjdCBqZmZzMl9zYl9pbmZvICpjOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGpmZnMyX3Jhd19pbm9kZSAqcmk7CisJc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQgKnJkOworCXN0cnVjdCBqZmZzMl9mdWxsX2Rub2RlICpmbjsKKwlzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKmZkOworCWludCBuYW1lbGVuOworCXVpbnQzMl90IGFsbG9jbGVuLCBwaHlzX29mczsKKwlpbnQgcmV0OworCisJbW9kZSB8PSBTX0lGRElSOworCisJcmkgPSBqZmZzMl9hbGxvY19yYXdfaW5vZGUoKTsKKwlpZiAoIXJpKQorCQlyZXR1cm4gLUVOT01FTTsKKwkKKwljID0gSkZGUzJfU0JfSU5GTyhkaXJfaS0+aV9zYik7CisKKwkvKiBUcnkgdG8gcmVzZXJ2ZSBlbm91Z2ggc3BhY2UgZm9yIGJvdGggbm9kZSBhbmQgZGlyZW50LiAKKwkgKiBKdXN0IHRoZSBub2RlIHdpbGwgZG8gZm9yIG5vdywgdGhvdWdoIAorCSAqLworCW5hbWVsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisJcmV0ID0gamZmczJfcmVzZXJ2ZV9zcGFjZShjLCBzaXplb2YoKnJpKSwgJnBoeXNfb2ZzLCAmYWxsb2NsZW4sIEFMTE9DX05PUk1BTCk7CisKKwlpZiAocmV0KSB7CisJCWpmZnMyX2ZyZWVfcmF3X2lub2RlKHJpKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpbm9kZSA9IGpmZnMyX25ld19pbm9kZShkaXJfaSwgbW9kZSwgcmkpOworCisJaWYgKElTX0VSUihpbm9kZSkpIHsKKwkJamZmczJfZnJlZV9yYXdfaW5vZGUocmkpOworCQlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKwkJcmV0dXJuIFBUUl9FUlIoaW5vZGUpOworCX0KKworCWlub2RlLT5pX29wID0gJmpmZnMyX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCWlub2RlLT5pX2ZvcCA9ICZqZmZzMl9kaXJfb3BlcmF0aW9uczsKKwkvKiBEaXJlY3RvcmllcyBnZXQgbmxpbmsgMiBhdCBzdGFydCAqLworCWlub2RlLT5pX25saW5rID0gMjsKKworCWYgPSBKRkZTMl9JTk9ERV9JTkZPKGlub2RlKTsKKworCXJpLT5kYXRhX2NyYyA9IGNwdV90b19qZTMyKDApOworCXJpLT5ub2RlX2NyYyA9IGNwdV90b19qZTMyKGNyYzMyKDAsIHJpLCBzaXplb2YoKnJpKS04KSk7CisJCisJZm4gPSBqZmZzMl93cml0ZV9kbm9kZShjLCBmLCByaSwgTlVMTCwgMCwgcGh5c19vZnMsIEFMTE9DX05PUk1BTCk7CisKKwlqZmZzMl9mcmVlX3Jhd19pbm9kZShyaSk7CisKKwlpZiAoSVNfRVJSKGZuKSkgeworCQkvKiBFZWVrLiBXYXZlIGJ5ZSBieWUgKi8KKwkJdXAoJmYtPnNlbSk7CisJCWpmZnMyX2NvbXBsZXRlX3Jlc2VydmF0aW9uKGMpOworCQlqZmZzMl9jbGVhcl9pbm9kZShpbm9kZSk7CisJCXJldHVybiBQVFJfRVJSKGZuKTsKKwl9CisJLyogTm8gZGF0YSBoZXJlLiBPbmx5IGEgbWV0YWRhdGEgbm9kZSwgd2hpY2ggd2lsbCBiZSAKKwkgICBvYnNvbGV0ZWQgYnkgdGhlIGZpcnN0IGRhdGEgd3JpdGUKKwkqLworCWYtPm1ldGFkYXRhID0gZm47CisJdXAoJmYtPnNlbSk7CisKKwlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKwlyZXQgPSBqZmZzMl9yZXNlcnZlX3NwYWNlKGMsIHNpemVvZigqcmQpK25hbWVsZW4sICZwaHlzX29mcywgJmFsbG9jbGVuLCBBTExPQ19OT1JNQUwpOworCWlmIChyZXQpIHsKKwkJLyogRWVwLiAqLworCQlqZmZzMl9jbGVhcl9pbm9kZShpbm9kZSk7CisJCXJldHVybiByZXQ7CisJfQorCQorCXJkID0gamZmczJfYWxsb2NfcmF3X2RpcmVudCgpOworCWlmICghcmQpIHsKKwkJLyogQXJnaC4gTm93IHdlIHRyZWF0IGl0IGxpa2UgYSBub3JtYWwgZGVsZXRlICovCisJCWpmZnMyX2NvbXBsZXRlX3Jlc2VydmF0aW9uKGMpOworCQlqZmZzMl9jbGVhcl9pbm9kZShpbm9kZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWRpcl9mID0gSkZGUzJfSU5PREVfSU5GTyhkaXJfaSk7CisJZG93bigmZGlyX2YtPnNlbSk7CisKKwlyZC0+bWFnaWMgPSBjcHVfdG9famUxNihKRkZTMl9NQUdJQ19CSVRNQVNLKTsKKwlyZC0+bm9kZXR5cGUgPSBjcHVfdG9famUxNihKRkZTMl9OT0RFVFlQRV9ESVJFTlQpOworCXJkLT50b3RsZW4gPSBjcHVfdG9famUzMihzaXplb2YoKnJkKSArIG5hbWVsZW4pOworCXJkLT5oZHJfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgcmQsIHNpemVvZihzdHJ1Y3QgamZmczJfdW5rbm93bl9ub2RlKS00KSk7CisKKwlyZC0+cGlubyA9IGNwdV90b19qZTMyKGRpcl9pLT5pX2lubyk7CisJcmQtPnZlcnNpb24gPSBjcHVfdG9famUzMigrK2Rpcl9mLT5oaWdoZXN0X3ZlcnNpb24pOworCXJkLT5pbm8gPSBjcHVfdG9famUzMihpbm9kZS0+aV9pbm8pOworCXJkLT5tY3RpbWUgPSBjcHVfdG9famUzMihnZXRfc2Vjb25kcygpKTsKKwlyZC0+bnNpemUgPSBuYW1lbGVuOworCXJkLT50eXBlID0gRFRfRElSOworCXJkLT5ub2RlX2NyYyA9IGNwdV90b19qZTMyKGNyYzMyKDAsIHJkLCBzaXplb2YoKnJkKS04KSk7CisJcmQtPm5hbWVfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgZGVudHJ5LT5kX25hbWUubmFtZSwgbmFtZWxlbikpOworCisJZmQgPSBqZmZzMl93cml0ZV9kaXJlbnQoYywgZGlyX2YsIHJkLCBkZW50cnktPmRfbmFtZS5uYW1lLCBuYW1lbGVuLCBwaHlzX29mcywgQUxMT0NfTk9STUFMKTsKKwkKKwlpZiAoSVNfRVJSKGZkKSkgeworCQkvKiBkaXJlbnQgZmFpbGVkIHRvIHdyaXRlLiBEZWxldGUgdGhlIGlub2RlIG5vcm1hbGx5IAorCQkgICBhcyBpZiBpdCB3ZXJlIHRoZSBmaW5hbCB1bmxpbmsoKSAqLworCQlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKwkJamZmczJfZnJlZV9yYXdfZGlyZW50KHJkKTsKKwkJdXAoJmRpcl9mLT5zZW0pOworCQlqZmZzMl9jbGVhcl9pbm9kZShpbm9kZSk7CisJCXJldHVybiBQVFJfRVJSKGZkKTsKKwl9CisKKwlkaXJfaS0+aV9tdGltZSA9IGRpcl9pLT5pX2N0aW1lID0gSVRJTUUoamUzMl90b19jcHUocmQtPm1jdGltZSkpOworCWRpcl9pLT5pX25saW5rKys7CisKKwlqZmZzMl9mcmVlX3Jhd19kaXJlbnQocmQpOworCisJLyogTGluayB0aGUgZmQgaW50byB0aGUgaW5vZGUncyBsaXN0LCBvYnNvbGV0aW5nIGFuIG9sZAorCSAgIG9uZSBpZiBuZWNlc3NhcnkuICovCisJamZmczJfYWRkX2ZkX3RvX2xpc3QoYywgZmQsICZkaXJfZi0+ZGVudHMpOworCisJdXAoJmRpcl9mLT5zZW0pOworCWpmZnMyX2NvbXBsZXRlX3Jlc2VydmF0aW9uKGMpOworCisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBqZmZzMl9ybWRpciAoc3RydWN0IGlub2RlICpkaXJfaSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmID0gSkZGUzJfSU5PREVfSU5GTyhkZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqZmQ7CisJaW50IHJldDsKKworCWZvciAoZmQgPSBmLT5kZW50cyA7IGZkOyBmZCA9IGZkLT5uZXh0KSB7CisJCWlmIChmZC0+aW5vKQorCQkJcmV0dXJuIC1FTk9URU1QVFk7CisJfQorCXJldCA9IGpmZnMyX3VubGluayhkaXJfaSwgZGVudHJ5KTsKKwlpZiAoIXJldCkKKwkJZGlyX2ktPmlfbmxpbmstLTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGpmZnMyX21rbm9kIChzdHJ1Y3QgaW5vZGUgKmRpcl9pLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLCBta25vZF9hcmdfdCByZGV2KQoreworCXN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLCAqZGlyX2Y7CisJc3RydWN0IGpmZnMyX3NiX2luZm8gKmM7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgamZmczJfcmF3X2lub2RlICpyaTsKKwlzdHJ1Y3QgamZmczJfcmF3X2RpcmVudCAqcmQ7CisJc3RydWN0IGpmZnMyX2Z1bGxfZG5vZGUgKmZuOworCXN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqZmQ7CisJaW50IG5hbWVsZW47CisJamludDE2X3QgZGV2OworCWludCBkZXZsZW4gPSAwOworCXVpbnQzMl90IGFsbG9jbGVuLCBwaHlzX29mczsKKwlpbnQgcmV0OworCisJaWYgKCFvbGRfdmFsaWRfZGV2KHJkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJpID0gamZmczJfYWxsb2NfcmF3X2lub2RlKCk7CisJaWYgKCFyaSkKKwkJcmV0dXJuIC1FTk9NRU07CisJCisJYyA9IEpGRlMyX1NCX0lORk8oZGlyX2ktPmlfc2IpOworCQorCWlmIChTX0lTQkxLKG1vZGUpIHx8IFNfSVNDSFIobW9kZSkpIHsKKwkJZGV2ID0gY3B1X3RvX2plMTYob2xkX2VuY29kZV9kZXYocmRldikpOworCQlkZXZsZW4gPSBzaXplb2YoZGV2KTsKKwl9CisJCisJLyogVHJ5IHRvIHJlc2VydmUgZW5vdWdoIHNwYWNlIGZvciBib3RoIG5vZGUgYW5kIGRpcmVudC4gCisJICogSnVzdCB0aGUgbm9kZSB3aWxsIGRvIGZvciBub3csIHRob3VnaCAKKwkgKi8KKwluYW1lbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCXJldCA9IGpmZnMyX3Jlc2VydmVfc3BhY2UoYywgc2l6ZW9mKCpyaSkgKyBkZXZsZW4sICZwaHlzX29mcywgJmFsbG9jbGVuLCBBTExPQ19OT1JNQUwpOworCisJaWYgKHJldCkgeworCQlqZmZzMl9mcmVlX3Jhd19pbm9kZShyaSk7CisJCXJldHVybiByZXQ7CisJfQorCisJaW5vZGUgPSBqZmZzMl9uZXdfaW5vZGUoZGlyX2ksIG1vZGUsIHJpKTsKKworCWlmIChJU19FUlIoaW5vZGUpKSB7CisJCWpmZnMyX2ZyZWVfcmF3X2lub2RlKHJpKTsKKwkJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7CisJCXJldHVybiBQVFJfRVJSKGlub2RlKTsKKwl9CisJaW5vZGUtPmlfb3AgPSAmamZmczJfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwgcmRldik7CisKKwlmID0gSkZGUzJfSU5PREVfSU5GTyhpbm9kZSk7CisKKwlyaS0+ZHNpemUgPSByaS0+Y3NpemUgPSBjcHVfdG9famUzMihkZXZsZW4pOworCXJpLT50b3RsZW4gPSBjcHVfdG9famUzMihzaXplb2YoKnJpKSArIGRldmxlbik7CisJcmktPmhkcl9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCByaSwgc2l6ZW9mKHN0cnVjdCBqZmZzMl91bmtub3duX25vZGUpLTQpKTsKKworCXJpLT5jb21wciA9IEpGRlMyX0NPTVBSX05PTkU7CisJcmktPmRhdGFfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgJmRldiwgZGV2bGVuKSk7CisJcmktPm5vZGVfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgcmksIHNpemVvZigqcmkpLTgpKTsKKwkKKwlmbiA9IGpmZnMyX3dyaXRlX2Rub2RlKGMsIGYsIHJpLCAoY2hhciAqKSZkZXYsIGRldmxlbiwgcGh5c19vZnMsIEFMTE9DX05PUk1BTCk7CisKKwlqZmZzMl9mcmVlX3Jhd19pbm9kZShyaSk7CisKKwlpZiAoSVNfRVJSKGZuKSkgeworCQkvKiBFZWVrLiBXYXZlIGJ5ZSBieWUgKi8KKwkJdXAoJmYtPnNlbSk7CisJCWpmZnMyX2NvbXBsZXRlX3Jlc2VydmF0aW9uKGMpOworCQlqZmZzMl9jbGVhcl9pbm9kZShpbm9kZSk7CisJCXJldHVybiBQVFJfRVJSKGZuKTsKKwl9CisJLyogTm8gZGF0YSBoZXJlLiBPbmx5IGEgbWV0YWRhdGEgbm9kZSwgd2hpY2ggd2lsbCBiZSAKKwkgICBvYnNvbGV0ZWQgYnkgdGhlIGZpcnN0IGRhdGEgd3JpdGUKKwkqLworCWYtPm1ldGFkYXRhID0gZm47CisJdXAoJmYtPnNlbSk7CisKKwlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKwlyZXQgPSBqZmZzMl9yZXNlcnZlX3NwYWNlKGMsIHNpemVvZigqcmQpK25hbWVsZW4sICZwaHlzX29mcywgJmFsbG9jbGVuLCBBTExPQ19OT1JNQUwpOworCWlmIChyZXQpIHsKKwkJLyogRWVwLiAqLworCQlqZmZzMl9jbGVhcl9pbm9kZShpbm9kZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmQgPSBqZmZzMl9hbGxvY19yYXdfZGlyZW50KCk7CisJaWYgKCFyZCkgeworCQkvKiBBcmdoLiBOb3cgd2UgdHJlYXQgaXQgbGlrZSBhIG5vcm1hbCBkZWxldGUgKi8KKwkJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7CisJCWpmZnMyX2NsZWFyX2lub2RlKGlub2RlKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZGlyX2YgPSBKRkZTMl9JTk9ERV9JTkZPKGRpcl9pKTsKKwlkb3duKCZkaXJfZi0+c2VtKTsKKworCXJkLT5tYWdpYyA9IGNwdV90b19qZTE2KEpGRlMyX01BR0lDX0JJVE1BU0spOworCXJkLT5ub2RldHlwZSA9IGNwdV90b19qZTE2KEpGRlMyX05PREVUWVBFX0RJUkVOVCk7CisJcmQtPnRvdGxlbiA9IGNwdV90b19qZTMyKHNpemVvZigqcmQpICsgbmFtZWxlbik7CisJcmQtPmhkcl9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCByZCwgc2l6ZW9mKHN0cnVjdCBqZmZzMl91bmtub3duX25vZGUpLTQpKTsKKworCXJkLT5waW5vID0gY3B1X3RvX2plMzIoZGlyX2ktPmlfaW5vKTsKKwlyZC0+dmVyc2lvbiA9IGNwdV90b19qZTMyKCsrZGlyX2YtPmhpZ2hlc3RfdmVyc2lvbik7CisJcmQtPmlubyA9IGNwdV90b19qZTMyKGlub2RlLT5pX2lubyk7CisJcmQtPm1jdGltZSA9IGNwdV90b19qZTMyKGdldF9zZWNvbmRzKCkpOworCXJkLT5uc2l6ZSA9IG5hbWVsZW47CisKKwkvKiBYWFg6IFRoaXMgaXMgdWdseS4gKi8KKwlyZC0+dHlwZSA9IChtb2RlICYgU19JRk1UKSA+PiAxMjsKKworCXJkLT5ub2RlX2NyYyA9IGNwdV90b19qZTMyKGNyYzMyKDAsIHJkLCBzaXplb2YoKnJkKS04KSk7CisJcmQtPm5hbWVfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgZGVudHJ5LT5kX25hbWUubmFtZSwgbmFtZWxlbikpOworCisJZmQgPSBqZmZzMl93cml0ZV9kaXJlbnQoYywgZGlyX2YsIHJkLCBkZW50cnktPmRfbmFtZS5uYW1lLCBuYW1lbGVuLCBwaHlzX29mcywgQUxMT0NfTk9STUFMKTsKKwkKKwlpZiAoSVNfRVJSKGZkKSkgeworCQkvKiBkaXJlbnQgZmFpbGVkIHRvIHdyaXRlLiBEZWxldGUgdGhlIGlub2RlIG5vcm1hbGx5IAorCQkgICBhcyBpZiBpdCB3ZXJlIHRoZSBmaW5hbCB1bmxpbmsoKSAqLworCQlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKwkJamZmczJfZnJlZV9yYXdfZGlyZW50KHJkKTsKKwkJdXAoJmRpcl9mLT5zZW0pOworCQlqZmZzMl9jbGVhcl9pbm9kZShpbm9kZSk7CisJCXJldHVybiBQVFJfRVJSKGZkKTsKKwl9CisKKwlkaXJfaS0+aV9tdGltZSA9IGRpcl9pLT5pX2N0aW1lID0gSVRJTUUoamUzMl90b19jcHUocmQtPm1jdGltZSkpOworCisJamZmczJfZnJlZV9yYXdfZGlyZW50KHJkKTsKKworCS8qIExpbmsgdGhlIGZkIGludG8gdGhlIGlub2RlJ3MgbGlzdCwgb2Jzb2xldGluZyBhbiBvbGQKKwkgICBvbmUgaWYgbmVjZXNzYXJ5LiAqLworCWpmZnMyX2FkZF9mZF90b19saXN0KGMsIGZkLCAmZGlyX2YtPmRlbnRzKTsKKworCXVwKCZkaXJfZi0+c2VtKTsKKwlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBqZmZzMl9yZW5hbWUgKHN0cnVjdCBpbm9kZSAqb2xkX2Rpcl9pLCBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlub2RlICpuZXdfZGlyX2ksIHN0cnVjdCBkZW50cnkgKm5ld19kZW50cnkpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyA9IEpGRlMyX1NCX0lORk8ob2xkX2Rpcl9pLT5pX3NiKTsKKwlzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqdmljdGltX2YgPSBOVUxMOworCXVpbnQ4X3QgdHlwZTsKKworCS8qIFRoZSBWRlMgd2lsbCBjaGVjayBmb3IgdXMgYW5kIHByZXZlbnQgdHJ5aW5nIHRvIHJlbmFtZSBhIAorCSAqIGZpbGUgb3ZlciBhIGRpcmVjdG9yeSBhbmQgdmljZSB2ZXJzYSwgYnV0IGlmIGl0J3MgYSBkaXJlY3RvcnksCisJICogdGhlIFZGUyBjYW4ndCBjaGVjayB3aGV0aGVyIHRoZSB2aWN0aW0gaXMgZW1wdHkuIFRoZSBmaWxlc3lzdGVtCisJICogbmVlZHMgdG8gZG8gdGhhdCBmb3IgaXRzZWxmLgorCSAqLworCWlmIChuZXdfZGVudHJ5LT5kX2lub2RlKSB7CisJCXZpY3RpbV9mID0gSkZGUzJfSU5PREVfSU5GTyhuZXdfZGVudHJ5LT5kX2lub2RlKTsKKwkJaWYgKFNfSVNESVIobmV3X2RlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSkgeworCQkJc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICpmZDsKKworCQkJZG93bigmdmljdGltX2YtPnNlbSk7CisJCQlmb3IgKGZkID0gdmljdGltX2YtPmRlbnRzOyBmZDsgZmQgPSBmZC0+bmV4dCkgeworCQkJCWlmIChmZC0+aW5vKSB7CisJCQkJCXVwKCZ2aWN0aW1fZi0+c2VtKTsKKwkJCQkJcmV0dXJuIC1FTk9URU1QVFk7CisJCQkJfQorCQkJfQorCQkJdXAoJnZpY3RpbV9mLT5zZW0pOworCQl9CisJfQorCisJLyogWFhYOiBXZSBwcm9iYWJseSBvdWdodCB0byBhbGxvYyBlbm91Z2ggc3BhY2UgZm9yCisJICAgYm90aCBub2RlcyBhdCB0aGUgc2FtZSB0aW1lLiBXcml0aW5nIHRoZSBuZXcgbGluaywgCisJICAgdGhlbiBnZXR0aW5nIC1FTk9TUEMsIGlzIHF1aXRlIGJhZCA6KQorCSovCisKKwkvKiBNYWtlIGEgaGFyZCBsaW5rICovCisJCisJLyogWFhYOiBUaGlzIGlzIHVnbHkgKi8KKwl0eXBlID0gKG9sZF9kZW50cnktPmRfaW5vZGUtPmlfbW9kZSAmIFNfSUZNVCkgPj4gMTI7CisJaWYgKCF0eXBlKSB0eXBlID0gRFRfUkVHOworCisJcmV0ID0gamZmczJfZG9fbGluayhjLCBKRkZTMl9JTk9ERV9JTkZPKG5ld19kaXJfaSksIAorCQkJICAgIG9sZF9kZW50cnktPmRfaW5vZGUtPmlfaW5vLCB0eXBlLAorCQkJICAgIG5ld19kZW50cnktPmRfbmFtZS5uYW1lLCBuZXdfZGVudHJ5LT5kX25hbWUubGVuKTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAodmljdGltX2YpIHsKKwkJLyogVGhlcmUgd2FzIGEgdmljdGltLiBLaWxsIGl0IG9mZiBuaWNlbHkgKi8KKwkJbmV3X2RlbnRyeS0+ZF9pbm9kZS0+aV9ubGluay0tOworCQkvKiBEb24ndCBvb3BzIGlmIHRoZSB2aWN0aW0gd2FzIGEgZGlyZW50IHBvaW50aW5nIHRvIGFuCisJCSAgIGlub2RlIHdoaWNoIGRpZG4ndCBleGlzdC4gKi8KKwkJaWYgKHZpY3RpbV9mLT5pbm9jYWNoZSkgeworCQkJZG93bigmdmljdGltX2YtPnNlbSk7CisJCQl2aWN0aW1fZi0+aW5vY2FjaGUtPm5saW5rLS07CisJCQl1cCgmdmljdGltX2YtPnNlbSk7CisJCX0KKwl9CisKKwkvKiBJZiBpdCB3YXMgYSBkaXJlY3Rvcnkgd2UgbW92ZWQsIGFuZCB0aGVyZSB3YXMgbm8gdmljdGltLCAKKwkgICBpbmNyZWFzZSBpX25saW5rIG9uIGl0cyBuZXcgcGFyZW50ICovCisJaWYgKFNfSVNESVIob2xkX2RlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSAmJiAhdmljdGltX2YpCisJCW5ld19kaXJfaS0+aV9ubGluaysrOworCisJLyogVW5saW5rIHRoZSBvcmlnaW5hbCAqLworCXJldCA9IGpmZnMyX2RvX3VubGluayhjLCBKRkZTMl9JTk9ERV9JTkZPKG9sZF9kaXJfaSksIAorCQkgICAgICBvbGRfZGVudHJ5LT5kX25hbWUubmFtZSwgb2xkX2RlbnRyeS0+ZF9uYW1lLmxlbiwgTlVMTCk7CisKKwkvKiBXZSBkb24ndCB0b3VjaCBpbm9kZS0+aV9ubGluayAqLworCisJaWYgKHJldCkgeworCQkvKiBPaCBzaGl0LiBXZSByZWFsbHkgb3VnaHQgdG8gbWFrZSBhIHNpbmdsZSBub2RlIHdoaWNoIGNhbiBkbyBib3RoIGF0b21pY2FsbHkgKi8KKwkJc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYgPSBKRkZTMl9JTk9ERV9JTkZPKG9sZF9kZW50cnktPmRfaW5vZGUpOworCQlkb3duKCZmLT5zZW0pOworCQlvbGRfZGVudHJ5LT5kX2lub2RlLT5pX25saW5rKys7CisJCWlmIChmLT5pbm9jYWNoZSkKKwkJCWYtPmlub2NhY2hlLT5ubGluaysrOworCQl1cCgmZi0+c2VtKTsKKworCQlwcmludGsoS0VSTl9OT1RJQ0UgImpmZnMyX3JlbmFtZSgpOiBMaW5rIHN1Y2NlZWRlZCwgdW5saW5rIGZhaWxlZCAoZXJyICVkKS4gWW91IG5vdyBoYXZlIGEgaGFyZCBsaW5rXG4iLCByZXQpOworCQkvKiBNaWdodCBhcyB3ZWxsIGxldCB0aGUgVkZTIGtub3cgKi8KKwkJZF9pbnN0YW50aWF0ZShuZXdfZGVudHJ5LCBvbGRfZGVudHJ5LT5kX2lub2RlKTsKKwkJYXRvbWljX2luYygmb2xkX2RlbnRyeS0+ZF9pbm9kZS0+aV9jb3VudCk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKFNfSVNESVIob2xkX2RlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSkKKwkJb2xkX2Rpcl9pLT5pX25saW5rLS07CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvZXJhc2UuYyBiL2ZzL2pmZnMyL2VyYXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE0NTFlOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMyL2VyYXNlLmMKQEAgLTAsMCArMSw0NDIgQEAKKy8qCisgKiBKRkZTMiAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgVmVyc2lvbiAyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBDcmVhdGVkIGJ5IERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4KKyAqCisgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgorICoKKyAqICRJZDogZXJhc2UuYyx2IDEuNjYgMjAwNC8xMS8xNiAyMDozNjoxMSBkd213MiBFeHAgJAorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSAibm9kZWxpc3QuaCIKKworc3RydWN0IGVyYXNlX3ByaXZfc3RydWN0IHsKKwlzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViOworCXN0cnVjdCBqZmZzMl9zYl9pbmZvICpjOworfTsKKyAgICAgIAorI2lmbmRlZiBfX0VDT1MKK3N0YXRpYyB2b2lkIGpmZnMyX2VyYXNlX2NhbGxiYWNrKHN0cnVjdCBlcmFzZV9pbmZvICopOworI2VuZGlmCitzdGF0aWMgdm9pZCBqZmZzMl9lcmFzZV9mYWlsZWQoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWIsIHVpbnQzMl90IGJhZF9vZmZzZXQpOworc3RhdGljIHZvaWQgamZmczJfZXJhc2Vfc3VjY2VlZGVkKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViKTsKK3N0YXRpYyB2b2lkIGpmZnMyX2ZyZWVfYWxsX25vZGVfcmVmcyhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYik7CitzdGF0aWMgdm9pZCBqZmZzMl9tYXJrX2VyYXNlZF9ibG9jayhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYik7CisKK3N0YXRpYyB2b2lkIGpmZnMyX2VyYXNlX2Jsb2NrKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLAorCQkJICAgICAgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYikKK3sKKwlpbnQgcmV0OworCXVpbnQzMl90IGJhZF9vZmZzZXQ7CisjaWZkZWYgX19FQ09TCisgICAgICAgcmV0ID0gamZmczJfZmxhc2hfZXJhc2UoYywgamViKTsKKyAgICAgICBpZiAoIXJldCkgeworICAgICAgICAgICAgICAgamZmczJfZXJhc2Vfc3VjY2VlZGVkKGMsIGplYik7CisgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgfQorICAgICAgIGJhZF9vZmZzZXQgPSBqZWItPm9mZnNldDsKKyNlbHNlIC8qIExpbnV4ICovCisJc3RydWN0IGVyYXNlX2luZm8gKmluc3RyOworCisJaW5zdHIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZXJhc2VfaW5mbykgKyBzaXplb2Yoc3RydWN0IGVyYXNlX3ByaXZfc3RydWN0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbnN0cikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJrbWFsbG9jIGZvciBzdHJ1Y3QgZXJhc2VfaW5mbyBpbiBqZmZzMl9lcmFzZV9ibG9jayBmYWlsZWQuIFJlZmlsaW5nIGJsb2NrIGZvciBsYXRlclxuIik7CisJCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJbGlzdF9kZWwoJmplYi0+bGlzdCk7CisJCWxpc3RfYWRkKCZqZWItPmxpc3QsICZjLT5lcmFzZV9wZW5kaW5nX2xpc3QpOworCQljLT5lcmFzaW5nX3NpemUgLT0gYy0+c2VjdG9yX3NpemU7CisJCWMtPmRpcnR5X3NpemUgKz0gYy0+c2VjdG9yX3NpemU7CisJCWplYi0+ZGlydHlfc2l6ZSA9IGMtPnNlY3Rvcl9zaXplOworCQlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCW1lbXNldChpbnN0ciwgMCwgc2l6ZW9mKCppbnN0cikpOworCisJaW5zdHItPm10ZCA9IGMtPm10ZDsKKwlpbnN0ci0+YWRkciA9IGplYi0+b2Zmc2V0OworCWluc3RyLT5sZW4gPSBjLT5zZWN0b3Jfc2l6ZTsKKwlpbnN0ci0+Y2FsbGJhY2sgPSBqZmZzMl9lcmFzZV9jYWxsYmFjazsKKwlpbnN0ci0+cHJpdiA9ICh1bnNpZ25lZCBsb25nKSgmaW5zdHJbMV0pOworCWluc3RyLT5mYWlsX2FkZHIgPSAweGZmZmZmZmZmOworCQorCSgoc3RydWN0IGVyYXNlX3ByaXZfc3RydWN0ICopaW5zdHItPnByaXYpLT5qZWIgPSBqZWI7CisJKChzdHJ1Y3QgZXJhc2VfcHJpdl9zdHJ1Y3QgKilpbnN0ci0+cHJpdiktPmMgPSBjOworCisJcmV0ID0gYy0+bXRkLT5lcmFzZShjLT5tdGQsIGluc3RyKTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuOworCisJYmFkX29mZnNldCA9IGluc3RyLT5mYWlsX2FkZHI7CisJa2ZyZWUoaW5zdHIpOworI2VuZGlmIC8qIF9fRUNPUyAqLworCisJaWYgKHJldCA9PSAtRU5PTUVNIHx8IHJldCA9PSAtRUFHQUlOKSB7CisJCS8qIEVyYXNlIGZhaWxlZCBpbW1lZGlhdGVseS4gUmVmaWxlIGl0IG9uIHRoZSBsaXN0ICovCisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJFcmFzZSBhdCAweCUwOHggZmFpbGVkOiAlZC4gUmVmaWxpbmcgb24gZXJhc2VfcGVuZGluZ19saXN0XG4iLCBqZWItPm9mZnNldCwgcmV0KSk7CisJCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJbGlzdF9kZWwoJmplYi0+bGlzdCk7CisJCWxpc3RfYWRkKCZqZWItPmxpc3QsICZjLT5lcmFzZV9wZW5kaW5nX2xpc3QpOworCQljLT5lcmFzaW5nX3NpemUgLT0gYy0+c2VjdG9yX3NpemU7CisJCWMtPmRpcnR5X3NpemUgKz0gYy0+c2VjdG9yX3NpemU7CisJCWplYi0+ZGlydHlfc2l6ZSA9IGMtPnNlY3Rvcl9zaXplOworCQlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChyZXQgPT0gLUVST0ZTKSAKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRXJhc2UgYXQgMHglMDh4IGZhaWxlZCBpbW1lZGlhdGVseTogLUVST0ZTLiBJcyB0aGUgc2VjdG9yIGxvY2tlZD9cbiIsIGplYi0+b2Zmc2V0KTsKKwllbHNlCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVyYXNlIGF0IDB4JTA4eCBmYWlsZWQgaW1tZWRpYXRlbHk6IGVycm5vICVkXG4iLCBqZWItPm9mZnNldCwgcmV0KTsKKworCWpmZnMyX2VyYXNlX2ZhaWxlZChjLCBqZWIsIGJhZF9vZmZzZXQpOworfQorCit2b2lkIGpmZnMyX2VyYXNlX3BlbmRpbmdfYmxvY2tzKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBpbnQgY291bnQpCit7CisJc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYjsKKworCWRvd24oJmMtPmVyYXNlX2ZyZWVfc2VtKTsKKworCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmYy0+ZXJhc2VfY29tcGxldGVfbGlzdCkgfHwKKwkgICAgICAgIWxpc3RfZW1wdHkoJmMtPmVyYXNlX3BlbmRpbmdfbGlzdCkpIHsKKworCQlpZiAoIWxpc3RfZW1wdHkoJmMtPmVyYXNlX2NvbXBsZXRlX2xpc3QpKSB7CisJCQlqZWIgPSBsaXN0X2VudHJ5KGMtPmVyYXNlX2NvbXBsZXRlX2xpc3QubmV4dCwgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2ssIGxpc3QpOworCQkJbGlzdF9kZWwoJmplYi0+bGlzdCk7CisJCQlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJCWpmZnMyX21hcmtfZXJhc2VkX2Jsb2NrKGMsIGplYik7CisKKwkJCWlmICghLS1jb3VudCkgeworCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJDb3VudCByZWFjaGVkLiBqZmZzMl9lcmFzZV9wZW5kaW5nX2Jsb2NrcyBsZWF2aW5nXG4iKSk7CisJCQkJZ290byBkb25lOworCQkJfQorCisJCX0gZWxzZSBpZiAoIWxpc3RfZW1wdHkoJmMtPmVyYXNlX3BlbmRpbmdfbGlzdCkpIHsKKwkJCWplYiA9IGxpc3RfZW50cnkoYy0+ZXJhc2VfcGVuZGluZ19saXN0Lm5leHQsIHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrLCBsaXN0KTsKKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJTdGFydGluZyBlcmFzZSBvZiBwZW5kaW5nIGJsb2NrIDB4JTA4eFxuIiwgamViLT5vZmZzZXQpKTsKKwkJCWxpc3RfZGVsKCZqZWItPmxpc3QpOworCQkJYy0+ZXJhc2luZ19zaXplICs9IGMtPnNlY3Rvcl9zaXplOworCQkJYy0+d2FzdGVkX3NpemUgLT0gamViLT53YXN0ZWRfc2l6ZTsKKwkJCWMtPmZyZWVfc2l6ZSAtPSBqZWItPmZyZWVfc2l6ZTsKKwkJCWMtPnVzZWRfc2l6ZSAtPSBqZWItPnVzZWRfc2l6ZTsKKwkJCWMtPmRpcnR5X3NpemUgLT0gamViLT5kaXJ0eV9zaXplOworCQkJamViLT53YXN0ZWRfc2l6ZSA9IGplYi0+dXNlZF9zaXplID0gamViLT5kaXJ0eV9zaXplID0gamViLT5mcmVlX3NpemUgPSAwOworCQkJamZmczJfZnJlZV9hbGxfbm9kZV9yZWZzKGMsIGplYik7CisJCQlsaXN0X2FkZCgmamViLT5saXN0LCAmYy0+ZXJhc2luZ19saXN0KTsKKwkJCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCisJCQlqZmZzMl9lcmFzZV9ibG9jayhjLCBqZWIpOworCisJCX0gZWxzZSB7CisJCQlCVUcoKTsKKwkJfQorCisJCS8qIEJlIG5pY2UgKi8KKwkJY29uZF9yZXNjaGVkKCk7CisJCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwl9CisKKwlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKyBkb25lOgorCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9lcmFzZV9wZW5kaW5nX2Jsb2NrcyBjb21wbGV0ZWRcbiIpKTsKKworCXVwKCZjLT5lcmFzZV9mcmVlX3NlbSk7Cit9CisKK3N0YXRpYyB2b2lkIGpmZnMyX2VyYXNlX3N1Y2NlZWRlZChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYikKK3sKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiRXJhc2UgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBhdCAweCUwOHhcbiIsIGplYi0+b2Zmc2V0KSk7CisJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCWxpc3RfZGVsKCZqZWItPmxpc3QpOworCWxpc3RfYWRkX3RhaWwoJmplYi0+bGlzdCwgJmMtPmVyYXNlX2NvbXBsZXRlX2xpc3QpOworCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCS8qIEVuc3VyZSB0aGF0IGt1cGRhdGVkIGNhbGxzIHVzIGFnYWluIHRvIG1hcmsgdGhlbSBjbGVhbiAqLworCWpmZnMyX2VyYXNlX3BlbmRpbmdfdHJpZ2dlcihjKTsKK30KKworc3RhdGljIHZvaWQgamZmczJfZXJhc2VfZmFpbGVkKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViLCB1aW50MzJfdCBiYWRfb2Zmc2V0KQoreworCS8qIEZvciBOQU5ELCBpZiB0aGUgZmFpbHVyZSBkaWQgbm90IG9jY3VyIGF0IHRoZSBkZXZpY2UgbGV2ZWwgZm9yIGEKKwkgICBzcGVjaWZpYyBwaHlzaWNhbCBwYWdlLCBkb24ndCBib3RoZXIgdXBkYXRpbmcgdGhlIGJhZCBibG9jayB0YWJsZS4gKi8KKwlpZiAoamZmczJfY2xlYW5tYXJrZXJfb29iKGMpICYmIChiYWRfb2Zmc2V0ICE9IDB4ZmZmZmZmZmYpKSB7CisJCS8qIFdlIGhhZCBhIGRldmljZS1sZXZlbCBmYWlsdXJlIHRvIGVyYXNlLiAgTGV0J3Mgc2VlIGlmIHdlJ3ZlCisJCSAgIGZhaWxlZCB0b28gbWFueSB0aW1lcy4gKi8KKwkJaWYgKCFqZmZzMl93cml0ZV9uYW5kX2JhZGJsb2NrKGMsIGplYiwgYmFkX29mZnNldCkpIHsKKwkJCS8qIFdlJ2QgbGlrZSB0byBnaXZlIHRoaXMgYmxvY2sgYW5vdGhlciB0cnkuICovCisJCQlzcGluX2xvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisJCQlsaXN0X2RlbCgmamViLT5saXN0KTsKKwkJCWxpc3RfYWRkKCZqZWItPmxpc3QsICZjLT5lcmFzZV9wZW5kaW5nX2xpc3QpOworCQkJYy0+ZXJhc2luZ19zaXplIC09IGMtPnNlY3Rvcl9zaXplOworCQkJYy0+ZGlydHlfc2l6ZSArPSBjLT5zZWN0b3Jfc2l6ZTsKKwkJCWplYi0+ZGlydHlfc2l6ZSA9IGMtPnNlY3Rvcl9zaXplOworCQkJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlzcGluX2xvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisJYy0+ZXJhc2luZ19zaXplIC09IGMtPnNlY3Rvcl9zaXplOworCWMtPmJhZF9zaXplICs9IGMtPnNlY3Rvcl9zaXplOworCWxpc3RfZGVsKCZqZWItPmxpc3QpOworCWxpc3RfYWRkKCZqZWItPmxpc3QsICZjLT5iYWRfbGlzdCk7CisJYy0+bnJfZXJhc2luZ19ibG9ja3MtLTsKKwlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwl3YWtlX3VwKCZjLT5lcmFzZV93YWl0KTsKK30JIAorCisjaWZuZGVmIF9fRUNPUworc3RhdGljIHZvaWQgamZmczJfZXJhc2VfY2FsbGJhY2soc3RydWN0IGVyYXNlX2luZm8gKmluc3RyKQoreworCXN0cnVjdCBlcmFzZV9wcml2X3N0cnVjdCAqcHJpdiA9ICh2b2lkICopaW5zdHItPnByaXY7CisKKwlpZihpbnN0ci0+c3RhdGUgIT0gTVREX0VSQVNFX0RPTkUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRXJhc2UgYXQgMHglMDh4IGZpbmlzaGVkLCBidXQgc3RhdGUgIT0gTVREX0VSQVNFX0RPTkUuIFN0YXRlIGlzIDB4JXggaW5zdGVhZC5cbiIsIGluc3RyLT5hZGRyLCBpbnN0ci0+c3RhdGUpOworCQlqZmZzMl9lcmFzZV9mYWlsZWQocHJpdi0+YywgcHJpdi0+amViLCBpbnN0ci0+ZmFpbF9hZGRyKTsKKwl9IGVsc2UgeworCQlqZmZzMl9lcmFzZV9zdWNjZWVkZWQocHJpdi0+YywgcHJpdi0+amViKTsKKwl9CQorCWtmcmVlKGluc3RyKTsKK30KKyNlbmRpZiAvKiAhX19FQ09TICovCisKKy8qIEhtbW0uIE1heWJlIHdlIHNob3VsZCBhY2NlcHQgdGhlIGV4dHJhIHNwYWNlIGl0IHRha2VzIGFuZCBtYWtlCisgICB0aGlzIGEgc3RhbmRhcmQgZG91Ymx5LWxpbmtlZCBsaXN0PyAqLworc3RhdGljIGlubGluZSB2b2lkIGpmZnMyX3JlbW92ZV9ub2RlX3JlZnNfZnJvbV9pbm9fbGlzdChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywKKwkJCXN0cnVjdCBqZmZzMl9yYXdfbm9kZV9yZWYgKnJlZiwgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYikKK3sKKwlzdHJ1Y3QgamZmczJfaW5vZGVfY2FjaGUgKmljID0gTlVMTDsKKwlzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICoqcHJldjsKKworCXByZXYgPSAmcmVmLT5uZXh0X2luX2lubzsKKworCS8qIFdhbGsgdGhlIGlub2RlJ3MgbGlzdCBvbmNlLCByZW1vdmluZyBhbnkgbm9kZXMgZnJvbSB0aGlzIGVyYXNlYmxvY2sgKi8KKwl3aGlsZSAoMSkgeworCQlpZiAoISgqcHJldiktPm5leHRfaW5faW5vKSB7CisJCQkvKiBXZSdyZSBsb29raW5nIGF0IHRoZSBqZmZzMl9pbm9kZV9jYWNoZSwgd2hpY2ggaXMgCisJCQkgICBhdCB0aGUgZW5kIG9mIHRoZSBsaW5rZWQgbGlzdC4gU3Rhc2ggaXQgYW5kIGNvbnRpbnVlCisJCQkgICBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QgKi8KKwkJCWljID0gKHN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqKSgqcHJldik7CisJCQlwcmV2ID0gJmljLT5ub2RlczsKKwkJCWNvbnRpbnVlOworCQl9IAorCisJCWlmICgoKCpwcmV2KS0+Zmxhc2hfb2Zmc2V0ICYgfihjLT5zZWN0b3Jfc2l6ZSAtMSkpID09IGplYi0+b2Zmc2V0KSB7CisJCQkvKiBJdCdzIGluIHRoZSBibG9jayB3ZSdyZSBlcmFzaW5nICovCisJCQlzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICp0aGlzOworCisJCQl0aGlzID0gKnByZXY7CisJCQkqcHJldiA9IHRoaXMtPm5leHRfaW5faW5vOworCQkJdGhpcy0+bmV4dF9pbl9pbm8gPSBOVUxMOworCisJCQlpZiAodGhpcyA9PSByZWYpCisJCQkJYnJlYWs7CisKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIE5vdCB0byBiZSBkZWxldGVkLiBTa2lwICovCisJCXByZXYgPSAmKCgqcHJldiktPm5leHRfaW5faW5vKTsKKwl9CisKKwkvKiBQQVJBTk9JQSAqLworCWlmICghaWMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiaW5vZGVfY2FjaGUgbm90IGZvdW5kIGluIHJlbW92ZV9ub2RlX3JlZnMoKSEhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJSZW1vdmVkIG5vZGVzIGluIHJhbmdlIDB4JTA4eC0weCUwOHggZnJvbSBpbm8gIyV1XG4iLAorCQkgIGplYi0+b2Zmc2V0LCBqZWItPm9mZnNldCArIGMtPnNlY3Rvcl9zaXplLCBpYy0+aW5vKSk7CisKKwlEMih7CisJCWludCBpPTA7CisJCXN0cnVjdCBqZmZzMl9yYXdfbm9kZV9yZWYgKnRoaXM7CisJCXByaW50ayhLRVJOX0RFQlVHICJBZnRlciByZW1vdmVfbm9kZV9yZWZzX2Zyb21faW5vX2xpc3Q6IFxuIiBLRVJOX0RFQlVHKTsKKworCQl0aGlzID0gaWMtPm5vZGVzOworCSAgIAorCQl3aGlsZSh0aGlzKSB7CisJCQlwcmludGsoICIweCUwOHgoJWQpLT4iLCByZWZfb2Zmc2V0KHRoaXMpLCByZWZfZmxhZ3ModGhpcykpOworCQkJaWYgKCsraSA9PSA1KSB7CisJCQkJcHJpbnRrKCJcbiIgS0VSTl9ERUJVRyk7CisJCQkJaT0wOworCQkJfQorCQkJdGhpcyA9IHRoaXMtPm5leHRfaW5faW5vOworCQl9CisJCXByaW50aygiXG4iKTsKKwl9KTsKKworCWlmIChpYy0+bm9kZXMgPT0gKHZvaWQgKilpYykgeworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiaW5vY2FjaGUgZm9yIGlubyAjJXUgaXMgYWxsIGdvbmUgbm93LiBGcmVlaW5nXG4iLCBpYy0+aW5vKSk7CisJCWpmZnMyX2RlbF9pbm9fY2FjaGUoYywgaWMpOworCQlqZmZzMl9mcmVlX2lub2RlX2NhY2hlKGljKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGpmZnMyX2ZyZWVfYWxsX25vZGVfcmVmcyhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYikKK3sKKwlzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICpyZWY7CisJRDEocHJpbnRrKEtFUk5fREVCVUcgIkZyZWVpbmcgYWxsIG5vZGUgcmVmcyBmb3IgZXJhc2VibG9jayBvZmZzZXQgMHglMDh4XG4iLCBqZWItPm9mZnNldCkpOworCXdoaWxlKGplYi0+Zmlyc3Rfbm9kZSkgeworCQlyZWYgPSBqZWItPmZpcnN0X25vZGU7CisJCWplYi0+Zmlyc3Rfbm9kZSA9IHJlZi0+bmV4dF9waHlzOworCQkKKwkJLyogUmVtb3ZlIGZyb20gdGhlIGlub2RlLWxpc3QgKi8KKwkJaWYgKHJlZi0+bmV4dF9pbl9pbm8pCisJCQlqZmZzMl9yZW1vdmVfbm9kZV9yZWZzX2Zyb21faW5vX2xpc3QoYywgcmVmLCBqZWIpOworCQkvKiBlbHNlIGl0IHdhcyBhIG5vbi1pbm9kZSBub2RlIG9yIGFscmVhZHkgcmVtb3ZlZCwgc28gZG9uJ3QgYm90aGVyICovCisKKwkJamZmczJfZnJlZV9yYXdfbm9kZV9yZWYocmVmKTsKKwl9CisJamViLT5sYXN0X25vZGUgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBqZmZzMl9tYXJrX2VyYXNlZF9ibG9jayhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYikKK3sKKwlzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICptYXJrZXJfcmVmID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyICplYnVmOworCXNpemVfdCByZXRsZW47CisJaW50IHJldDsKKwl1aW50MzJfdCBiYWRfb2Zmc2V0OworCisJaWYgKCFqZmZzMl9jbGVhbm1hcmtlcl9vb2IoYykpIHsKKwkJbWFya2VyX3JlZiA9IGpmZnMyX2FsbG9jX3Jhd19ub2RlX3JlZigpOworCQlpZiAoIW1hcmtlcl9yZWYpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkZhaWxlZCB0byBhbGxvY2F0ZSByYXcgbm9kZSByZWYgZm9yIGNsZWFuIG1hcmtlclxuIik7CisJCQkvKiBTdGljayBpdCBiYWNrIG9uIHRoZSBsaXN0IGZyb20gd2hlbmNlIGl0IGNhbWUgYW5kIGNvbWUgYmFjayBsYXRlciAqLworCQkJamZmczJfZXJhc2VfcGVuZGluZ190cmlnZ2VyKGMpOworCQkJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCQkJbGlzdF9hZGQoJmplYi0+bGlzdCwgJmMtPmVyYXNlX2NvbXBsZXRlX2xpc3QpOworCQkJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJZWJ1ZiA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVidWYpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRmFpbGVkIHRvIGFsbG9jYXRlIHBhZ2UgYnVmZmVyIGZvciB2ZXJpZnlpbmcgZXJhc2UgYXQgMHglMDh4LiBBc3N1bWluZyBpdCB3b3JrZWRcbiIsIGplYi0+b2Zmc2V0KTsKKwl9IGVsc2UgeworCQl1aW50MzJfdCBvZnMgPSBqZWItPm9mZnNldDsKKworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiVmVyaWZ5aW5nIGVyYXNlIGF0IDB4JTA4eFxuIiwgamViLT5vZmZzZXQpKTsKKwkJd2hpbGUob2ZzIDwgamViLT5vZmZzZXQgKyBjLT5zZWN0b3Jfc2l6ZSkgeworCQkJdWludDMyX3QgcmVhZGxlbiA9IG1pbigodWludDMyX3QpUEFHRV9TSVpFLCBqZWItPm9mZnNldCArIGMtPnNlY3Rvcl9zaXplIC0gb2ZzKTsKKwkJCWludCBpOworCisJCQliYWRfb2Zmc2V0ID0gb2ZzOworCisJCQlyZXQgPSBqZmZzMl9mbGFzaF9yZWFkKGMsIG9mcywgcmVhZGxlbiwgJnJldGxlbiwgZWJ1Zik7CisJCQlpZiAocmV0KSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUmVhZCBvZiBuZXdseS1lcmFzZWQgYmxvY2sgYXQgMHglMDh4IGZhaWxlZDogJWQuIFB1dHRpbmcgb24gYmFkX2xpc3RcbiIsIG9mcywgcmV0KTsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCWlmIChyZXRsZW4gIT0gcmVhZGxlbikgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNob3J0IHJlYWQgZnJvbSBuZXdseS1lcmFzZWQgYmxvY2sgYXQgMHglMDh4LiBXYW50ZWQgJWQsIGdvdCAlemRcbiIsIG9mcywgcmVhZGxlbiwgcmV0bGVuKTsKKwkJCQlnb3RvIGJhZDsKKwkJCX0KKwkJCWZvciAoaT0wOyBpPHJlYWRsZW47IGkgKz0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSB7CisJCQkJLyogSXQncyBPSy4gV2Uga25vdyBpdCdzIHByb3Blcmx5IGFsaWduZWQgKi8KKwkJCQl1bnNpZ25lZCBsb25nIGRhdHVtID0gKih1bnNpZ25lZCBsb25nICopKCZlYnVmW2ldKTsKKwkJCQlpZiAoZGF0dW0gKyAxKSB7CisJCQkJCWJhZF9vZmZzZXQgKz0gaTsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTmV3bHktZXJhc2VkIGJsb2NrIGNvbnRhaW5lZCB3b3JkIDB4JWx4IGF0IG9mZnNldCAweCUwOHhcbiIsIGRhdHVtLCBiYWRfb2Zmc2V0KTsKKwkJCQliYWQ6IAorCQkJCQlpZiAoIWpmZnMyX2NsZWFubWFya2VyX29vYihjKSkKKwkJCQkJCWpmZnMyX2ZyZWVfcmF3X25vZGVfcmVmKG1hcmtlcl9yZWYpOworCQkJCQlrZnJlZShlYnVmKTsKKwkJCQliYWQyOgorCQkJCQlzcGluX2xvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisJCQkJCS8qIFN0aWNrIGl0IG9uIGEgbGlzdCAoYW55IGxpc3QpIHNvCisJCQkJCSAgIGVyYXNlX2ZhaWxlZCBjYW4gdGFrZSBpdCByaWdodCBvZmYKKwkJCQkJICAgYWdhaW4uICBTaWxseSwgYnV0IHNob3VsZG4ndCBoYXBwZW4KKwkJCQkJICAgb2Z0ZW4uICovCisJCQkJCWxpc3RfYWRkKCZqZWItPmxpc3QsICZjLT5lcmFzaW5nX2xpc3QpOworCQkJCQlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJCQkJamZmczJfZXJhc2VfZmFpbGVkKGMsIGplYiwgYmFkX29mZnNldCk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCQlvZnMgKz0gcmVhZGxlbjsKKwkJCWNvbmRfcmVzY2hlZCgpOworCQl9CisJCWtmcmVlKGVidWYpOworCX0KKworCWJhZF9vZmZzZXQgPSBqZWItPm9mZnNldDsKKworCS8qIFdyaXRlIHRoZSBlcmFzZSBjb21wbGV0ZSBtYXJrZXIgKi8JCisJRDEocHJpbnRrKEtFUk5fREVCVUcgIldyaXRpbmcgZXJhc2VkIG1hcmtlciB0byBibG9jayBhdCAweCUwOHhcbiIsIGplYi0+b2Zmc2V0KSk7CisJaWYgKGpmZnMyX2NsZWFubWFya2VyX29vYihjKSkgeworCisJCWlmIChqZmZzMl93cml0ZV9uYW5kX2NsZWFubWFya2VyKGMsIGplYikpCisJCQlnb3RvIGJhZDI7CisJCQkKKwkJamViLT5maXJzdF9ub2RlID0gamViLT5sYXN0X25vZGUgPSBOVUxMOworCisJCWplYi0+ZnJlZV9zaXplID0gYy0+c2VjdG9yX3NpemU7CisJCWplYi0+dXNlZF9zaXplID0gMDsKKwkJamViLT5kaXJ0eV9zaXplID0gMDsKKwkJamViLT53YXN0ZWRfc2l6ZSA9IDA7CisJfSBlbHNlIHsKKwkJc3RydWN0IGt2ZWMgdmVjc1sxXTsKKwkJc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSBtYXJrZXIgPSB7CisJCQkubWFnaWMgPQljcHVfdG9famUxNihKRkZTMl9NQUdJQ19CSVRNQVNLKSwKKwkJCS5ub2RldHlwZSA9CWNwdV90b19qZTE2KEpGRlMyX05PREVUWVBFX0NMRUFOTUFSS0VSKSwKKwkJCS50b3RsZW4gPQljcHVfdG9famUzMihjLT5jbGVhbm1hcmtlcl9zaXplKQorCQl9OworCisJCW1hcmtlci5oZHJfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgJm1hcmtlciwgc2l6ZW9mKHN0cnVjdCBqZmZzMl91bmtub3duX25vZGUpLTQpKTsKKworCQl2ZWNzWzBdLmlvdl9iYXNlID0gKHVuc2lnbmVkIGNoYXIgKikgJm1hcmtlcjsKKwkJdmVjc1swXS5pb3ZfbGVuID0gc2l6ZW9mKG1hcmtlcik7CisJCXJldCA9IGpmZnMyX2ZsYXNoX2RpcmVjdF93cml0ZXYoYywgdmVjcywgMSwgamViLT5vZmZzZXQsICZyZXRsZW4pOworCQkKKwkJaWYgKHJldCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiV3JpdGUgY2xlYW4gbWFya2VyIHRvIGJsb2NrIGF0IDB4JTA4eCBmYWlsZWQ6ICVkXG4iLAorCQkJICAgICAgIGplYi0+b2Zmc2V0LCByZXQpOworCQkJZ290byBiYWQyOworCQl9CisJCWlmIChyZXRsZW4gIT0gc2l6ZW9mKG1hcmtlcikpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNob3J0IHdyaXRlIHRvIG5ld2x5LWVyYXNlZCBibG9jayBhdCAweCUwOHg6IFdhbnRlZCAlemQsIGdvdCAlemRcbiIsCisJCQkgICAgICAgamViLT5vZmZzZXQsIHNpemVvZihtYXJrZXIpLCByZXRsZW4pOworCQkJZ290byBiYWQyOworCQl9CisKKwkJbWFya2VyX3JlZi0+bmV4dF9pbl9pbm8gPSBOVUxMOworCQltYXJrZXJfcmVmLT5uZXh0X3BoeXMgPSBOVUxMOworCQltYXJrZXJfcmVmLT5mbGFzaF9vZmZzZXQgPSBqZWItPm9mZnNldCB8IFJFRl9OT1JNQUw7CisJCW1hcmtlcl9yZWYtPl9fdG90bGVuID0gYy0+Y2xlYW5tYXJrZXJfc2l6ZTsKKwkJCQorCQlqZWItPmZpcnN0X25vZGUgPSBqZWItPmxhc3Rfbm9kZSA9IG1hcmtlcl9yZWY7CisJCQkKKwkJamViLT5mcmVlX3NpemUgPSBjLT5zZWN0b3Jfc2l6ZSAtIGMtPmNsZWFubWFya2VyX3NpemU7CisJCWplYi0+dXNlZF9zaXplID0gYy0+Y2xlYW5tYXJrZXJfc2l6ZTsKKwkJamViLT5kaXJ0eV9zaXplID0gMDsKKwkJamViLT53YXN0ZWRfc2l6ZSA9IDA7CisJfQorCisJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCWMtPmVyYXNpbmdfc2l6ZSAtPSBjLT5zZWN0b3Jfc2l6ZTsKKwljLT5mcmVlX3NpemUgKz0gamViLT5mcmVlX3NpemU7CisJYy0+dXNlZF9zaXplICs9IGplYi0+dXNlZF9zaXplOworCisJQUNDVF9TQU5JVFlfQ0hFQ0soYyxqZWIpOworCUQxKEFDQ1RfUEFSQU5PSUFfQ0hFQ0soamViKSk7CisKKwlsaXN0X2FkZF90YWlsKCZqZWItPmxpc3QsICZjLT5mcmVlX2xpc3QpOworCWMtPm5yX2VyYXNpbmdfYmxvY2tzLS07CisJYy0+bnJfZnJlZV9ibG9ja3MrKzsKKwlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwl3YWtlX3VwKCZjLT5lcmFzZV93YWl0KTsKK30KKwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvZmlsZS5jIGIvZnMvamZmczIvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNjA3YzEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZmZzMi9maWxlLmMKQEAgLTAsMCArMSwyOTAgQEAKKy8qCisgKiBKRkZTMiAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgVmVyc2lvbiAyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBDcmVhdGVkIGJ5IERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4KKyAqCisgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgorICoKKyAqICRJZDogZmlsZS5jLHYgMS45OSAyMDA0LzExLzE2IDIwOjM2OjExIGR3bXcyIEV4cCAkCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9qZmZzMi5oPgorI2luY2x1ZGUgIm5vZGVsaXN0LmgiCisKK2V4dGVybiBpbnQgZ2VuZXJpY19maWxlX29wZW4oc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopIF9fYXR0cmlidXRlX18oKHdlYWspKTsKK2V4dGVybiBsb2ZmX3QgZ2VuZXJpY19maWxlX2xsc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWdpbikgX19hdHRyaWJ1dGVfXygod2VhaykpOworCitzdGF0aWMgaW50IGpmZnMyX2NvbW1pdF93cml0ZSAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBwYWdlICpwZywKKwkJCSAgICAgICB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgZW5kKTsKK3N0YXRpYyBpbnQgamZmczJfcHJlcGFyZV93cml0ZSAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBwYWdlICpwZywKKwkJCQl1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgZW5kKTsKK3N0YXRpYyBpbnQgamZmczJfcmVhZHBhZ2UgKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgcGFnZSAqcGcpOworCitpbnQgamZmczJfZnN5bmMoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGRhdGFzeW5jKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGpmZnMyX3NiX2luZm8gKmMgPSBKRkZTMl9TQl9JTkZPKGlub2RlLT5pX3NiKTsKKworCS8qIFRyaWdnZXIgR0MgdG8gZmx1c2ggYW55IHBlbmRpbmcgd3JpdGVzIGZvciB0aGlzIGlub2RlICovCisJamZmczJfZmx1c2hfd2J1Zl9nYyhjLCBpbm9kZS0+aV9pbm8pOworCQkJCisJcmV0dXJuIDA7CQorfQorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGpmZnMyX2ZpbGVfb3BlcmF0aW9ucyA9Cit7CisJLmxsc2VlayA9CWdlbmVyaWNfZmlsZV9sbHNlZWssCisJLm9wZW4gPQkJZ2VuZXJpY19maWxlX29wZW4sCisJLnJlYWQgPQkJZ2VuZXJpY19maWxlX3JlYWQsCisJLndyaXRlID0JZ2VuZXJpY19maWxlX3dyaXRlLAorCS5pb2N0bCA9CWpmZnMyX2lvY3RsLAorCS5tbWFwID0JCWdlbmVyaWNfZmlsZV9yZWFkb25seV9tbWFwLAorCS5mc3luYyA9CWpmZnMyX2ZzeW5jLAorI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDUsMjkpCisJLnNlbmRmaWxlID0JZ2VuZXJpY19maWxlX3NlbmRmaWxlCisjZW5kaWYKK307CisKKy8qIGpmZnMyX2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyAqLworCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBqZmZzMl9maWxlX2lub2RlX29wZXJhdGlvbnMgPQoreworCS5zZXRhdHRyID0JamZmczJfc2V0YXR0cgorfTsKKworc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBqZmZzMl9maWxlX2FkZHJlc3Nfb3BlcmF0aW9ucyA9Cit7CisJLnJlYWRwYWdlID0JamZmczJfcmVhZHBhZ2UsCisJLnByZXBhcmVfd3JpdGUgPWpmZnMyX3ByZXBhcmVfd3JpdGUsCisJLmNvbW1pdF93cml0ZSA9CWpmZnMyX2NvbW1pdF93cml0ZQorfTsKKworc3RhdGljIGludCBqZmZzMl9kb19yZWFkcGFnZV9ub2xvY2sgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlICpwZykKK3sKKwlzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiA9IEpGRlMyX0lOT0RFX0lORk8oaW5vZGUpOworCXN0cnVjdCBqZmZzMl9zYl9pbmZvICpjID0gSkZGUzJfU0JfSU5GTyhpbm9kZS0+aV9zYik7CisJdW5zaWduZWQgY2hhciAqcGdfYnVmOworCWludCByZXQ7CisKKwlEMihwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZG9fcmVhZHBhZ2Vfbm9sb2NrKCk6IGlubyAjJWx1LCBwYWdlIGF0IG9mZnNldCAweCVseFxuIiwgaW5vZGUtPmlfaW5vLCBwZy0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkpOworCisJaWYgKCFQYWdlTG9ja2VkKHBnKSkKKyAgICAgICAgICAgICAgICBQQUdFX0JVRyhwZyk7CisKKwlwZ19idWYgPSBrbWFwKHBnKTsKKwkvKiBGSVhNRTogQ2FuIGttYXAgZmFpbD8gKi8KKworCXJldCA9IGpmZnMyX3JlYWRfaW5vZGVfcmFuZ2UoYywgZiwgcGdfYnVmLCBwZy0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCwgUEFHRV9DQUNIRV9TSVpFKTsKKworCWlmIChyZXQpIHsKKwkJQ2xlYXJQYWdlVXB0b2RhdGUocGcpOworCQlTZXRQYWdlRXJyb3IocGcpOworCX0gZWxzZSB7CisJCVNldFBhZ2VVcHRvZGF0ZShwZyk7CisJCUNsZWFyUGFnZUVycm9yKHBnKTsKKwl9CisKKwlmbHVzaF9kY2FjaGVfcGFnZShwZyk7CisJa3VubWFwKHBnKTsKKworCUQyKHByaW50ayhLRVJOX0RFQlVHICJyZWFkcGFnZSBmaW5pc2hlZFxuIikpOworCXJldHVybiAwOworfQorCitpbnQgamZmczJfZG9fcmVhZHBhZ2VfdW5sb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlICpwZykKK3sKKwlpbnQgcmV0ID0gamZmczJfZG9fcmVhZHBhZ2Vfbm9sb2NrKGlub2RlLCBwZyk7CisJdW5sb2NrX3BhZ2UocGcpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBqZmZzMl9yZWFkcGFnZSAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBwYWdlICpwZykKK3sKKwlzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiA9IEpGRlMyX0lOT0RFX0lORk8ocGctPm1hcHBpbmctPmhvc3QpOworCWludCByZXQ7CisJCisJZG93bigmZi0+c2VtKTsKKwlyZXQgPSBqZmZzMl9kb19yZWFkcGFnZV91bmxvY2socGctPm1hcHBpbmctPmhvc3QsIHBnKTsKKwl1cCgmZi0+c2VtKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGpmZnMyX3ByZXBhcmVfd3JpdGUgKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgcGFnZSAqcGcsCisJCQkJdW5zaWduZWQgc3RhcnQsIHVuc2lnbmVkIGVuZCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGctPm1hcHBpbmctPmhvc3Q7CisJc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYgPSBKRkZTMl9JTk9ERV9JTkZPKGlub2RlKTsKKwl1aW50MzJfdCBwYWdlb2ZzID0gcGctPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisJaW50IHJldCA9IDA7CisKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfcHJlcGFyZV93cml0ZSgpXG4iKSk7CisKKwlpZiAocGFnZW9mcyA+IGlub2RlLT5pX3NpemUpIHsKKwkJLyogTWFrZSBuZXcgaG9sZSBmcmFnIGZyb20gb2xkIEVPRiB0byBuZXcgcGFnZSAqLworCQlzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyA9IEpGRlMyX1NCX0lORk8oaW5vZGUtPmlfc2IpOworCQlzdHJ1Y3QgamZmczJfcmF3X2lub2RlIHJpOworCQlzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZSAqZm47CisJCXVpbnQzMl90IHBoeXNfb2ZzLCBhbGxvY19sZW47CisJCQorCQlEMShwcmludGsoS0VSTl9ERUJVRyAiV3JpdGluZyBuZXcgaG9sZSBmcmFnIDB4JXgtMHgleCBiZXR3ZWVuIGN1cnJlbnQgRU9GIGFuZCBuZXcgcGFnZVxuIiwKKwkJCSAgKHVuc2lnbmVkIGludClpbm9kZS0+aV9zaXplLCBwYWdlb2ZzKSk7CisKKwkJcmV0ID0gamZmczJfcmVzZXJ2ZV9zcGFjZShjLCBzaXplb2YocmkpLCAmcGh5c19vZnMsICZhbGxvY19sZW4sIEFMTE9DX05PUk1BTCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCWRvd24oJmYtPnNlbSk7CisJCW1lbXNldCgmcmksIDAsIHNpemVvZihyaSkpOworCisJCXJpLm1hZ2ljID0gY3B1X3RvX2plMTYoSkZGUzJfTUFHSUNfQklUTUFTSyk7CisJCXJpLm5vZGV0eXBlID0gY3B1X3RvX2plMTYoSkZGUzJfTk9ERVRZUEVfSU5PREUpOworCQlyaS50b3RsZW4gPSBjcHVfdG9famUzMihzaXplb2YocmkpKTsKKwkJcmkuaGRyX2NyYyA9IGNwdV90b19qZTMyKGNyYzMyKDAsICZyaSwgc2l6ZW9mKHN0cnVjdCBqZmZzMl91bmtub3duX25vZGUpLTQpKTsKKworCQlyaS5pbm8gPSBjcHVfdG9famUzMihmLT5pbm9jYWNoZS0+aW5vKTsKKwkJcmkudmVyc2lvbiA9IGNwdV90b19qZTMyKCsrZi0+aGlnaGVzdF92ZXJzaW9uKTsKKwkJcmkubW9kZSA9IGNwdV90b19qZW1vZGUoaW5vZGUtPmlfbW9kZSk7CisJCXJpLnVpZCA9IGNwdV90b19qZTE2KGlub2RlLT5pX3VpZCk7CisJCXJpLmdpZCA9IGNwdV90b19qZTE2KGlub2RlLT5pX2dpZCk7CisJCXJpLmlzaXplID0gY3B1X3RvX2plMzIobWF4KCh1aW50MzJfdClpbm9kZS0+aV9zaXplLCBwYWdlb2ZzKSk7CisJCXJpLmF0aW1lID0gcmkuY3RpbWUgPSByaS5tdGltZSA9IGNwdV90b19qZTMyKGdldF9zZWNvbmRzKCkpOworCQlyaS5vZmZzZXQgPSBjcHVfdG9famUzMihpbm9kZS0+aV9zaXplKTsKKwkJcmkuZHNpemUgPSBjcHVfdG9famUzMihwYWdlb2ZzIC0gaW5vZGUtPmlfc2l6ZSk7CisJCXJpLmNzaXplID0gY3B1X3RvX2plMzIoMCk7CisJCXJpLmNvbXByID0gSkZGUzJfQ09NUFJfWkVSTzsKKwkJcmkubm9kZV9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCAmcmksIHNpemVvZihyaSktOCkpOworCQlyaS5kYXRhX2NyYyA9IGNwdV90b19qZTMyKDApOworCQkKKwkJZm4gPSBqZmZzMl93cml0ZV9kbm9kZShjLCBmLCAmcmksIE5VTEwsIDAsIHBoeXNfb2ZzLCBBTExPQ19OT1JNQUwpOworCisJCWlmIChJU19FUlIoZm4pKSB7CisJCQlyZXQgPSBQVFJfRVJSKGZuKTsKKwkJCWpmZnMyX2NvbXBsZXRlX3Jlc2VydmF0aW9uKGMpOworCQkJdXAoJmYtPnNlbSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCXJldCA9IGpmZnMyX2FkZF9mdWxsX2Rub2RlX3RvX2lub2RlKGMsIGYsIGZuKTsKKwkJaWYgKGYtPm1ldGFkYXRhKSB7CisJCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgZi0+bWV0YWRhdGEtPnJhdyk7CisJCQlqZmZzMl9mcmVlX2Z1bGxfZG5vZGUoZi0+bWV0YWRhdGEpOworCQkJZi0+bWV0YWRhdGEgPSBOVUxMOworCQl9CisJCWlmIChyZXQpIHsKKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJFZXAuIGFkZF9mdWxsX2Rub2RlX3RvX2lub2RlKCkgZmFpbGVkIGluIHByZXBhcmVfd3JpdGUsIHJldHVybmVkICVkXG4iLCByZXQpKTsKKwkJCWpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZShjLCBmbi0+cmF3KTsKKwkJCWpmZnMyX2ZyZWVfZnVsbF9kbm9kZShmbik7CisJCQlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKwkJCXVwKCZmLT5zZW0pOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKwkJaW5vZGUtPmlfc2l6ZSA9IHBhZ2VvZnM7CisJCXVwKCZmLT5zZW0pOworCX0KKwkKKwkvKiBSZWFkIGluIHRoZSBwYWdlIGlmIGl0IHdhc24ndCBhbHJlYWR5IHByZXNlbnQsIHVubGVzcyBpdCdzIGEgd2hvbGUgcGFnZSAqLworCWlmICghUGFnZVVwdG9kYXRlKHBnKSAmJiAoc3RhcnQgfHwgZW5kIDwgUEFHRV9DQUNIRV9TSVpFKSkgeworCQlkb3duKCZmLT5zZW0pOworCQlyZXQgPSBqZmZzMl9kb19yZWFkcGFnZV9ub2xvY2soaW5vZGUsIHBnKTsKKwkJdXAoJmYtPnNlbSk7CisJfQorCUQxKHByaW50ayhLRVJOX0RFQlVHICJlbmQgcHJlcGFyZV93cml0ZSgpLiBwZy0+ZmxhZ3MgJWx4XG4iLCBwZy0+ZmxhZ3MpKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGpmZnMyX2NvbW1pdF93cml0ZSAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBwYWdlICpwZywKKwkJCSAgICAgICB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgZW5kKQoreworCS8qIEFjdHVhbGx5IGNvbW1pdCB0aGUgd3JpdGUgZnJvbSB0aGUgcGFnZSBjYWNoZSBwYWdlIHdlJ3JlIGxvb2tpbmcgYXQuCisJICogRm9yIG5vdywgd2Ugd3JpdGUgdGhlIGZ1bGwgcGFnZSBvdXQgZWFjaCB0aW1lLiBJdCBzdWNrcywgYnV0IGl0J3Mgc2ltcGxlCisJICovCisJc3RydWN0IGlub2RlICppbm9kZSA9IHBnLT5tYXBwaW5nLT5ob3N0OworCXN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmID0gSkZGUzJfSU5PREVfSU5GTyhpbm9kZSk7CisJc3RydWN0IGpmZnMyX3NiX2luZm8gKmMgPSBKRkZTMl9TQl9JTkZPKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3QgamZmczJfcmF3X2lub2RlICpyaTsKKwl1bnNpZ25lZCBhbGlnbmVkX3N0YXJ0ID0gc3RhcnQgJiB+MzsKKwlpbnQgcmV0ID0gMDsKKwl1aW50MzJfdCB3cml0dGVubGVuID0gMDsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9jb21taXRfd3JpdGUoKTogaW5vICMlbHUsIHBhZ2UgYXQgMHglbHgsIHJhbmdlICVkLSVkLCBmbGFncyAlbHhcbiIsCisJCSAgaW5vZGUtPmlfaW5vLCBwZy0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCwgc3RhcnQsIGVuZCwgcGctPmZsYWdzKSk7CisKKwlpZiAoIXN0YXJ0ICYmIGVuZCA9PSBQQUdFX0NBQ0hFX1NJWkUpIHsKKwkJLyogV2UgbmVlZCB0byBhdm9pZCBkZWFkbG9jayB3aXRoIHBhZ2VfY2FjaGVfcmVhZCgpIGluCisJCSAgIGpmZnMyX2dhcmJhZ2VfY29sbGVjdF9wYXNzKCkuIFNvIHdlIGhhdmUgdG8gbWFyayB0aGUKKwkJICAgcGFnZSB1cCB0byBkYXRlLCB0byBwcmV2ZW50IHBhZ2VfY2FjaGVfcmVhZCgpIGZyb20gCisJCSAgIHRyeWluZyB0byByZS1sb2NrIGl0LiAqLworCQlTZXRQYWdlVXB0b2RhdGUocGcpOworCX0KKworCXJpID0gamZmczJfYWxsb2NfcmF3X2lub2RlKCk7CisKKwlpZiAoIXJpKSB7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9jb21taXRfd3JpdGUoKTogQWxsb2NhdGlvbiBvZiByYXcgaW5vZGUgZmFpbGVkXG4iKSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIFNldCB0aGUgZmllbGRzIHRoYXQgdGhlIGdlbmVyaWMgamZmczJfd3JpdGVfaW5vZGVfcmFuZ2UoKSBjb2RlIGNhbid0IGZpbmQgKi8KKwlyaS0+aW5vID0gY3B1X3RvX2plMzIoaW5vZGUtPmlfaW5vKTsKKwlyaS0+bW9kZSA9IGNwdV90b19qZW1vZGUoaW5vZGUtPmlfbW9kZSk7CisJcmktPnVpZCA9IGNwdV90b19qZTE2KGlub2RlLT5pX3VpZCk7CisJcmktPmdpZCA9IGNwdV90b19qZTE2KGlub2RlLT5pX2dpZCk7CisJcmktPmlzaXplID0gY3B1X3RvX2plMzIoKHVpbnQzMl90KWlub2RlLT5pX3NpemUpOworCXJpLT5hdGltZSA9IHJpLT5jdGltZSA9IHJpLT5tdGltZSA9IGNwdV90b19qZTMyKGdldF9zZWNvbmRzKCkpOworCisJLyogSW4gMi40LCBpdCB3YXMgYWxyZWFkeSBrbWFwcGVkIGJ5IGdlbmVyaWNfZmlsZV93cml0ZSgpLiBEb2Vzbid0CisJICAgaHVydCB0byBkbyBpdCBhZ2Fpbi4gVGhlIGFsdGVybmF0aXZlIGlzIGlmZGVmcywgd2hpY2ggYXJlIHVnbHkuICovCisJa21hcChwZyk7CisKKwlyZXQgPSBqZmZzMl93cml0ZV9pbm9kZV9yYW5nZShjLCBmLCByaSwgcGFnZV9hZGRyZXNzKHBnKSArIGFsaWduZWRfc3RhcnQsCisJCQkJICAgICAgKHBnLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKSArIGFsaWduZWRfc3RhcnQsCisJCQkJICAgICAgZW5kIC0gYWxpZ25lZF9zdGFydCwgJndyaXR0ZW5sZW4pOworCisJa3VubWFwKHBnKTsKKworCWlmIChyZXQpIHsKKwkJLyogVGhlcmUgd2FzIGFuIGVycm9yIHdyaXRpbmcuICovCisJCVNldFBhZ2VFcnJvcihwZyk7CisJfQorCQorCS8qIEFkanVzdCB3cml0dGVubGVuIGZvciB0aGUgcGFkZGluZyB3ZSBkaWQsIHNvIHdlIGRvbid0IGNvbmZ1c2Ugb3VyIGNhbGxlciAqLworCWlmICh3cml0dGVubGVuIDwgKHN0YXJ0JjMpKQorCQl3cml0dGVubGVuID0gMDsKKwllbHNlCisJCXdyaXR0ZW5sZW4gLT0gKHN0YXJ0JjMpOworCisJaWYgKHdyaXR0ZW5sZW4pIHsKKwkJaWYgKGlub2RlLT5pX3NpemUgPCAocGctPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpICsgc3RhcnQgKyB3cml0dGVubGVuKSB7CisJCQlpbm9kZS0+aV9zaXplID0gKHBnLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKSArIHN0YXJ0ICsgd3JpdHRlbmxlbjsKKwkJCWlub2RlLT5pX2Jsb2NrcyA9IChpbm9kZS0+aV9zaXplICsgNTExKSA+PiA5OworCQkJCisJCQlpbm9kZS0+aV9jdGltZSA9IGlub2RlLT5pX210aW1lID0gSVRJTUUoamUzMl90b19jcHUocmktPmN0aW1lKSk7CisJCX0KKwl9CisKKwlqZmZzMl9mcmVlX3Jhd19pbm9kZShyaSk7CisKKwlpZiAoc3RhcnQrd3JpdHRlbmxlbiA8IGVuZCkgeworCQkvKiBnZW5lcmljX2ZpbGVfd3JpdGUgaGFzIHdyaXR0ZW4gbW9yZSB0byB0aGUgcGFnZSBjYWNoZSB0aGFuIHdlJ3ZlCisJCSAgIGFjdHVhbGx5IHdyaXR0ZW4gdG8gdGhlIG1lZGl1bS4gTWFyayB0aGUgcGFnZSAhVXB0b2RhdGUgc28gdGhhdCAKKwkJICAgaXQgZ2V0cyByZXJlYWQgKi8KKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2NvbW1pdF93cml0ZSgpOiBOb3QgYWxsIGJ5dGVzIHdyaXR0ZW4uIE1hcmtpbmcgcGFnZSAhdXB0b2RhdGVcbiIpKTsKKwkJU2V0UGFnZUVycm9yKHBnKTsKKwkJQ2xlYXJQYWdlVXB0b2RhdGUocGcpOworCX0KKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9jb21taXRfd3JpdGUoKSByZXR1cm5pbmcgJWRcbiIsd3JpdHRlbmxlbj93cml0dGVubGVuOnJldCkpOworCXJldHVybiB3cml0dGVubGVuP3dyaXR0ZW5sZW46cmV0OworfQpkaWZmIC0tZ2l0IGEvZnMvamZmczIvZnMuYyBiL2ZzL2pmZnMyL2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBhYjIzMwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMyL2ZzLmMKQEAgLTAsMCArMSw2NzcgQEAKKy8qCisgKiBKRkZTMiAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgVmVyc2lvbiAyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBDcmVhdGVkIGJ5IERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4KKyAqCisgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgorICoKKyAqICRJZDogZnMuYyx2IDEuNTEgMjAwNC8xMS8yOCAxMjoxOTozNyBkZWRla2luZCBFeHAgJAorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSAibm9kZWxpc3QuaCIKKworc3RhdGljIGludCBqZmZzMl9mbGFzaF9zZXR1cChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyk7CisKK3N0YXRpYyBpbnQgamZmczJfZG9fc2V0YXR0ciAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlhdHRyICppYXR0cikKK3sKKwlzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZSAqb2xkX21ldGFkYXRhLCAqbmV3X21ldGFkYXRhOworCXN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmID0gSkZGUzJfSU5PREVfSU5GTyhpbm9kZSk7CisJc3RydWN0IGpmZnMyX3NiX2luZm8gKmMgPSBKRkZTMl9TQl9JTkZPKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3QgamZmczJfcmF3X2lub2RlICpyaTsKKwl1bnNpZ25lZCBzaG9ydCBkZXY7CisJdW5zaWduZWQgY2hhciAqbWRhdGEgPSBOVUxMOworCWludCBtZGF0YWxlbiA9IDA7CisJdW5zaWduZWQgaW50IGl2YWxpZDsKKwl1aW50MzJfdCBwaHlzX29mcywgYWxsb2NsZW47CisJaW50IHJldDsKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfc2V0YXR0cigpOiBpbm8gIyVsdVxuIiwgaW5vZGUtPmlfaW5vKSk7CisJcmV0ID0gaW5vZGVfY2hhbmdlX29rKGlub2RlLCBpYXR0cik7CisJaWYgKHJldCkgCisJCXJldHVybiByZXQ7CisKKwkvKiBTcGVjaWFsIGNhc2VzIC0gd2UgZG9uJ3Qgd2FudCBtb3JlIHRoYW4gb25lIGRhdGEgbm9kZQorCSAgIGZvciB0aGVzZSB0eXBlcyBvbiB0aGUgbWVkaXVtIGF0IGFueSB0aW1lLiBTbyBzZXRhdHRyCisJICAgbXVzdCByZWFkIHRoZSBvcmlnaW5hbCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgbm9kZQorCSAgIChpLmUuIHRoZSBkZXZpY2UgbnVtYmVycyBvciB0aGUgdGFyZ2V0IG5hbWUpIGFuZCB3cml0ZQorCSAgIGl0IG91dCBhZ2FpbiB3aXRoIHRoZSBhcHByb3ByaWF0ZSBkYXRhIGF0dGFjaGVkICovCisJaWYgKFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0NIUihpbm9kZS0+aV9tb2RlKSkgeworCQkvKiBGb3IgdGhlc2UsIHdlIGRvbid0IGFjdHVhbGx5IG5lZWQgdG8gcmVhZCB0aGUgb2xkIG5vZGUgKi8KKwkJZGV2ID0gb2xkX2VuY29kZV9kZXYoaW5vZGUtPmlfcmRldik7CisJCW1kYXRhID0gKGNoYXIgKikmZGV2OworCQltZGF0YWxlbiA9IHNpemVvZihkZXYpOworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfc2V0YXR0cigpOiBXcml0aW5nICVkIGJ5dGVzIG9mIGtkZXZfdFxuIiwgbWRhdGFsZW4pKTsKKwl9IGVsc2UgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpIHsKKwkJbWRhdGFsZW4gPSBmLT5tZXRhZGF0YS0+c2l6ZTsKKwkJbWRhdGEgPSBrbWFsbG9jKGYtPm1ldGFkYXRhLT5zaXplLCBHRlBfVVNFUik7CisJCWlmICghbWRhdGEpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJcmV0ID0gamZmczJfcmVhZF9kbm9kZShjLCBmLCBmLT5tZXRhZGF0YSwgbWRhdGEsIDAsIG1kYXRhbGVuKTsKKwkJaWYgKHJldCkgeworCQkJa2ZyZWUobWRhdGEpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfc2V0YXR0cigpOiBXcml0aW5nICVkIGJ5dGVzIG9mIHN5bWxpbmsgdGFyZ2V0XG4iLCBtZGF0YWxlbikpOworCX0KKworCXJpID0gamZmczJfYWxsb2NfcmF3X2lub2RlKCk7CisJaWYgKCFyaSkgeworCQlpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKKwkJCWtmcmVlKG1kYXRhKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCQkKKwlyZXQgPSBqZmZzMl9yZXNlcnZlX3NwYWNlKGMsIHNpemVvZigqcmkpICsgbWRhdGFsZW4sICZwaHlzX29mcywgJmFsbG9jbGVuLCBBTExPQ19OT1JNQUwpOworCWlmIChyZXQpIHsKKwkJamZmczJfZnJlZV9yYXdfaW5vZGUocmkpOworCQlpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlICYgU19JRk1UKSkKKwkJCSBrZnJlZShtZGF0YSk7CisJCXJldHVybiByZXQ7CisJfQorCWRvd24oJmYtPnNlbSk7CisJaXZhbGlkID0gaWF0dHItPmlhX3ZhbGlkOworCQorCXJpLT5tYWdpYyA9IGNwdV90b19qZTE2KEpGRlMyX01BR0lDX0JJVE1BU0spOworCXJpLT5ub2RldHlwZSA9IGNwdV90b19qZTE2KEpGRlMyX05PREVUWVBFX0lOT0RFKTsKKwlyaS0+dG90bGVuID0gY3B1X3RvX2plMzIoc2l6ZW9mKCpyaSkgKyBtZGF0YWxlbik7CisJcmktPmhkcl9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCByaSwgc2l6ZW9mKHN0cnVjdCBqZmZzMl91bmtub3duX25vZGUpLTQpKTsKKworCXJpLT5pbm8gPSBjcHVfdG9famUzMihpbm9kZS0+aV9pbm8pOworCXJpLT52ZXJzaW9uID0gY3B1X3RvX2plMzIoKytmLT5oaWdoZXN0X3ZlcnNpb24pOworCisJcmktPnVpZCA9IGNwdV90b19qZTE2KChpdmFsaWQgJiBBVFRSX1VJRCk/aWF0dHItPmlhX3VpZDppbm9kZS0+aV91aWQpOworCXJpLT5naWQgPSBjcHVfdG9famUxNigoaXZhbGlkICYgQVRUUl9HSUQpP2lhdHRyLT5pYV9naWQ6aW5vZGUtPmlfZ2lkKTsKKworCWlmIChpdmFsaWQgJiBBVFRSX01PREUpCisJCWlmIChpYXR0ci0+aWFfbW9kZSAmIFNfSVNHSUQgJiYKKwkJICAgICFpbl9ncm91cF9wKGplMTZfdG9fY3B1KHJpLT5naWQpKSAmJiAhY2FwYWJsZShDQVBfRlNFVElEKSkKKwkJCXJpLT5tb2RlID0gY3B1X3RvX2plbW9kZShpYXR0ci0+aWFfbW9kZSAmIH5TX0lTR0lEKTsKKwkJZWxzZSAKKwkJCXJpLT5tb2RlID0gY3B1X3RvX2plbW9kZShpYXR0ci0+aWFfbW9kZSk7CisJZWxzZQorCQlyaS0+bW9kZSA9IGNwdV90b19qZW1vZGUoaW5vZGUtPmlfbW9kZSk7CisKKworCXJpLT5pc2l6ZSA9IGNwdV90b19qZTMyKChpdmFsaWQgJiBBVFRSX1NJWkUpP2lhdHRyLT5pYV9zaXplOmlub2RlLT5pX3NpemUpOworCXJpLT5hdGltZSA9IGNwdV90b19qZTMyKElfU0VDKChpdmFsaWQgJiBBVFRSX0FUSU1FKT9pYXR0ci0+aWFfYXRpbWU6aW5vZGUtPmlfYXRpbWUpKTsKKwlyaS0+bXRpbWUgPSBjcHVfdG9famUzMihJX1NFQygoaXZhbGlkICYgQVRUUl9NVElNRSk/aWF0dHItPmlhX210aW1lOmlub2RlLT5pX210aW1lKSk7CisJcmktPmN0aW1lID0gY3B1X3RvX2plMzIoSV9TRUMoKGl2YWxpZCAmIEFUVFJfQ1RJTUUpP2lhdHRyLT5pYV9jdGltZTppbm9kZS0+aV9jdGltZSkpOworCisJcmktPm9mZnNldCA9IGNwdV90b19qZTMyKDApOworCXJpLT5jc2l6ZSA9IHJpLT5kc2l6ZSA9IGNwdV90b19qZTMyKG1kYXRhbGVuKTsKKwlyaS0+Y29tcHIgPSBKRkZTMl9DT01QUl9OT05FOworCWlmIChpdmFsaWQgJiBBVFRSX1NJWkUgJiYgaW5vZGUtPmlfc2l6ZSA8IGlhdHRyLT5pYV9zaXplKSB7CisJCS8qIEl0J3MgYW4gZXh0ZW5zaW9uLiBNYWtlIGl0IGEgaG9sZSBub2RlICovCisJCXJpLT5jb21wciA9IEpGRlMyX0NPTVBSX1pFUk87CisJCXJpLT5kc2l6ZSA9IGNwdV90b19qZTMyKGlhdHRyLT5pYV9zaXplIC0gaW5vZGUtPmlfc2l6ZSk7CisJCXJpLT5vZmZzZXQgPSBjcHVfdG9famUzMihpbm9kZS0+aV9zaXplKTsKKwl9CisJcmktPm5vZGVfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgcmksIHNpemVvZigqcmkpLTgpKTsKKwlpZiAobWRhdGFsZW4pCisJCXJpLT5kYXRhX2NyYyA9IGNwdV90b19qZTMyKGNyYzMyKDAsIG1kYXRhLCBtZGF0YWxlbikpOworCWVsc2UKKwkJcmktPmRhdGFfY3JjID0gY3B1X3RvX2plMzIoMCk7CisKKwluZXdfbWV0YWRhdGEgPSBqZmZzMl93cml0ZV9kbm9kZShjLCBmLCByaSwgbWRhdGEsIG1kYXRhbGVuLCBwaHlzX29mcywgQUxMT0NfTk9STUFMKTsKKwlpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKKwkJa2ZyZWUobWRhdGEpOworCQorCWlmIChJU19FUlIobmV3X21ldGFkYXRhKSkgeworCQlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKwkJamZmczJfZnJlZV9yYXdfaW5vZGUocmkpOworCQl1cCgmZi0+c2VtKTsKKwkJcmV0dXJuIFBUUl9FUlIobmV3X21ldGFkYXRhKTsKKwl9CisJLyogSXQgd29ya2VkLiBVcGRhdGUgdGhlIGlub2RlICovCisJaW5vZGUtPmlfYXRpbWUgPSBJVElNRShqZTMyX3RvX2NwdShyaS0+YXRpbWUpKTsKKwlpbm9kZS0+aV9jdGltZSA9IElUSU1FKGplMzJfdG9fY3B1KHJpLT5jdGltZSkpOworCWlub2RlLT5pX210aW1lID0gSVRJTUUoamUzMl90b19jcHUocmktPm10aW1lKSk7CisJaW5vZGUtPmlfbW9kZSA9IGplbW9kZV90b19jcHUocmktPm1vZGUpOworCWlub2RlLT5pX3VpZCA9IGplMTZfdG9fY3B1KHJpLT51aWQpOworCWlub2RlLT5pX2dpZCA9IGplMTZfdG9fY3B1KHJpLT5naWQpOworCisKKwlvbGRfbWV0YWRhdGEgPSBmLT5tZXRhZGF0YTsKKworCWlmIChpdmFsaWQgJiBBVFRSX1NJWkUgJiYgaW5vZGUtPmlfc2l6ZSA+IGlhdHRyLT5pYV9zaXplKQorCQlqZmZzMl90cnVuY2F0ZV9mcmFnbGlzdCAoYywgJmYtPmZyYWd0cmVlLCBpYXR0ci0+aWFfc2l6ZSk7CisKKwlpZiAoaXZhbGlkICYgQVRUUl9TSVpFICYmIGlub2RlLT5pX3NpemUgPCBpYXR0ci0+aWFfc2l6ZSkgeworCQlqZmZzMl9hZGRfZnVsbF9kbm9kZV90b19pbm9kZShjLCBmLCBuZXdfbWV0YWRhdGEpOworCQlpbm9kZS0+aV9zaXplID0gaWF0dHItPmlhX3NpemU7CisJCWYtPm1ldGFkYXRhID0gTlVMTDsKKwl9IGVsc2UgeworCQlmLT5tZXRhZGF0YSA9IG5ld19tZXRhZGF0YTsKKwl9CisJaWYgKG9sZF9tZXRhZGF0YSkgeworCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgb2xkX21ldGFkYXRhLT5yYXcpOworCQlqZmZzMl9mcmVlX2Z1bGxfZG5vZGUob2xkX21ldGFkYXRhKTsKKwl9CisJamZmczJfZnJlZV9yYXdfaW5vZGUocmkpOworCisJdXAoJmYtPnNlbSk7CisJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7CisKKwkvKiBXZSBoYXZlIHRvIGRvIHRoZSB2bXRydW5jYXRlKCkgd2l0aG91dCBmLT5zZW0gaGVsZCwgc2luY2UKKwkgICBzb21lIHBhZ2VzIG1heSBiZSBsb2NrZWQgYW5kIHdhaXRpbmcgZm9yIGl0IGluIHJlYWRwYWdlKCkuIAorCSAgIFdlIGFyZSBwcm90ZWN0ZWQgZnJvbSBhIHNpbXVsdGFuZW91cyB3cml0ZSgpIGV4dGVuZGluZyBpX3NpemUKKwkgICBiYWNrIHBhc3QgaWF0dHItPmlhX3NpemUsIGJlY2F1c2UgZG9fdHJ1bmNhdGUoKSBob2xkcyB0aGUKKwkgICBnZW5lcmljIGlub2RlIHNlbWFwaG9yZS4gKi8KKwlpZiAoaXZhbGlkICYgQVRUUl9TSVpFICYmIGlub2RlLT5pX3NpemUgPiBpYXR0ci0+aWFfc2l6ZSkKKwkJdm10cnVuY2F0ZShpbm9kZSwgaWF0dHItPmlhX3NpemUpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBqZmZzMl9zZXRhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICppYXR0cikKK3sKKwlyZXR1cm4gamZmczJfZG9fc2V0YXR0cihkZW50cnktPmRfaW5vZGUsIGlhdHRyKTsKK30KKworaW50IGpmZnMyX3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQoreworCXN0cnVjdCBqZmZzMl9zYl9pbmZvICpjID0gSkZGUzJfU0JfSU5GTyhzYik7CisJdW5zaWduZWQgbG9uZyBhdmFpbDsKKworCWJ1Zi0+Zl90eXBlID0gSkZGUzJfU1VQRVJfTUFHSUM7CisJYnVmLT5mX2JzaXplID0gMSA8PCBQQUdFX1NISUZUOworCWJ1Zi0+Zl9ibG9ja3MgPSBjLT5mbGFzaF9zaXplID4+IFBBR0VfU0hJRlQ7CisJYnVmLT5mX2ZpbGVzID0gMDsKKwlidWYtPmZfZmZyZWUgPSAwOworCWJ1Zi0+Zl9uYW1lbGVuID0gSkZGUzJfTUFYX05BTUVfTEVOOworCisJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCisJYXZhaWwgPSBjLT5kaXJ0eV9zaXplICsgYy0+ZnJlZV9zaXplOworCWlmIChhdmFpbCA+IGMtPnNlY3Rvcl9zaXplICogYy0+cmVzdl9ibG9ja3Nfd3JpdGUpCisJCWF2YWlsIC09IGMtPnNlY3Rvcl9zaXplICogYy0+cmVzdl9ibG9ja3Nfd3JpdGU7CisJZWxzZQorCQlhdmFpbCA9IDA7CisKKwlidWYtPmZfYmF2YWlsID0gYnVmLT5mX2JmcmVlID0gYXZhaWwgPj4gUEFHRV9TSElGVDsKKworCUQyKGpmZnMyX2R1bXBfYmxvY2tfbGlzdHMoYykpOworCisJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIGpmZnMyX2NsZWFyX2lub2RlIChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCS8qIFdlIGNhbiBmb3JnZXQgYWJvdXQgdGhpcyBpbm9kZSBmb3Igbm93IC0gZHJvcCBhbGwgCisJICogIHRoZSBub2RlbGlzdHMgYXNzb2NpYXRlZCB3aXRoIGl0LCBldGMuCisJICovCisJc3RydWN0IGpmZnMyX3NiX2luZm8gKmMgPSBKRkZTMl9TQl9JTkZPKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiA9IEpGRlMyX0lOT0RFX0lORk8oaW5vZGUpOworCQorCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9jbGVhcl9pbm9kZSgpOiBpbm8gIyVsdSBtb2RlICVvXG4iLCBpbm9kZS0+aV9pbm8sIGlub2RlLT5pX21vZGUpKTsKKworCWpmZnMyX2RvX2NsZWFyX2lub2RlKGMsIGYpOworfQorCit2b2lkIGpmZnMyX3JlYWRfaW5vZGUgKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmY7CisJc3RydWN0IGpmZnMyX3NiX2luZm8gKmM7CisJc3RydWN0IGpmZnMyX3Jhd19pbm9kZSBsYXRlc3Rfbm9kZTsKKwlpbnQgcmV0OworCisJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX3JlYWRfaW5vZGUoKTogaW5vZGUtPmlfaW5vID09ICVsdVxuIiwgaW5vZGUtPmlfaW5vKSk7CisKKwlmID0gSkZGUzJfSU5PREVfSU5GTyhpbm9kZSk7CisJYyA9IEpGRlMyX1NCX0lORk8oaW5vZGUtPmlfc2IpOworCisJamZmczJfaW5pdF9pbm9kZV9pbmZvKGYpOworCQorCXJldCA9IGpmZnMyX2RvX3JlYWRfaW5vZGUoYywgZiwgaW5vZGUtPmlfaW5vLCAmbGF0ZXN0X25vZGUpOworCisJaWYgKHJldCkgeworCQltYWtlX2JhZF9pbm9kZShpbm9kZSk7CisJCXVwKCZmLT5zZW0pOworCQlyZXR1cm47CisJfQorCWlub2RlLT5pX21vZGUgPSBqZW1vZGVfdG9fY3B1KGxhdGVzdF9ub2RlLm1vZGUpOworCWlub2RlLT5pX3VpZCA9IGplMTZfdG9fY3B1KGxhdGVzdF9ub2RlLnVpZCk7CisJaW5vZGUtPmlfZ2lkID0gamUxNl90b19jcHUobGF0ZXN0X25vZGUuZ2lkKTsKKwlpbm9kZS0+aV9zaXplID0gamUzMl90b19jcHUobGF0ZXN0X25vZGUuaXNpemUpOworCWlub2RlLT5pX2F0aW1lID0gSVRJTUUoamUzMl90b19jcHUobGF0ZXN0X25vZGUuYXRpbWUpKTsKKwlpbm9kZS0+aV9tdGltZSA9IElUSU1FKGplMzJfdG9fY3B1KGxhdGVzdF9ub2RlLm10aW1lKSk7CisJaW5vZGUtPmlfY3RpbWUgPSBJVElNRShqZTMyX3RvX2NwdShsYXRlc3Rfbm9kZS5jdGltZSkpOworCisJaW5vZGUtPmlfbmxpbmsgPSBmLT5pbm9jYWNoZS0+bmxpbms7CisKKwlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9TSVpFOworCWlub2RlLT5pX2Jsb2NrcyA9IChpbm9kZS0+aV9zaXplICsgNTExKSA+PiA5OworCQorCXN3aXRjaCAoaW5vZGUtPmlfbW9kZSAmIFNfSUZNVCkgeworCQlqaW50MTZfdCByZGV2OworCisJY2FzZSBTX0lGTE5LOgorCQlpbm9kZS0+aV9vcCA9ICZqZmZzMl9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJCWJyZWFrOworCQkKKwljYXNlIFNfSUZESVI6CisJeworCQlzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKmZkOworCisJCWZvciAoZmQ9Zi0+ZGVudHM7IGZkOyBmZCA9IGZkLT5uZXh0KSB7CisJCQlpZiAoZmQtPnR5cGUgPT0gRFRfRElSICYmIGZkLT5pbm8pCisJCQkJaW5vZGUtPmlfbmxpbmsrKzsKKwkJfQorCQkvKiBhbmQgJy4uJyAqLworCQlpbm9kZS0+aV9ubGluaysrOworCQkvKiBSb290IGRpciBnZXRzIGlfbmxpbmsgMyBmb3Igc29tZSByZWFzb24gKi8KKwkJaWYgKGlub2RlLT5pX2lubyA9PSAxKQorCQkJaW5vZGUtPmlfbmxpbmsrKzsKKworCQlpbm9kZS0+aV9vcCA9ICZqZmZzMl9kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJmpmZnMyX2Rpcl9vcGVyYXRpb25zOworCQlicmVhazsKKwl9CisJY2FzZSBTX0lGUkVHOgorCQlpbm9kZS0+aV9vcCA9ICZqZmZzMl9maWxlX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZqZmZzMl9maWxlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmpmZnMyX2ZpbGVfYWRkcmVzc19vcGVyYXRpb25zOworCQlpbm9kZS0+aV9tYXBwaW5nLT5ucnBhZ2VzID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFNfSUZCTEs6CisJY2FzZSBTX0lGQ0hSOgorCQkvKiBSZWFkIHRoZSBkZXZpY2UgbnVtYmVycyBmcm9tIHRoZSBtZWRpYSAqLworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiUmVhZGluZyBkZXZpY2UgbnVtYmVycyBmcm9tIGZsYXNoXG4iKSk7CisJCWlmIChqZmZzMl9yZWFkX2Rub2RlKGMsIGYsIGYtPm1ldGFkYXRhLCAoY2hhciAqKSZyZGV2LCAwLCBzaXplb2YocmRldikpIDwgMCkgeworCQkJLyogRWVwICovCisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIlJlYWQgZGV2aWNlIG51bWJlcnMgZm9yIGlub2RlICVsdSBmYWlsZWRcbiIsICh1bnNpZ25lZCBsb25nKWlub2RlLT5pX2lubyk7CisJCQl1cCgmZi0+c2VtKTsKKwkJCWpmZnMyX2RvX2NsZWFyX2lub2RlKGMsIGYpOworCQkJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCQkJcmV0dXJuOworCQl9CQkJCisKKwljYXNlIFNfSUZTT0NLOgorCWNhc2UgU19JRklGTzoKKwkJaW5vZGUtPmlfb3AgPSAmamZmczJfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsCisJCQkJICAgb2xkX2RlY29kZV9kZXYoKGplMTZfdG9fY3B1KHJkZXYpKSkpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImpmZnMyX3JlYWRfaW5vZGUoKTogQm9ndXMgaW1vZGUgJW8gZm9yIGlubyAlbHVcbiIsIGlub2RlLT5pX21vZGUsICh1bnNpZ25lZCBsb25nKWlub2RlLT5pX2lubyk7CisJfQorCisJdXAoJmYtPnNlbSk7CisKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfcmVhZF9pbm9kZSgpIHJldHVybmluZ1xuIikpOworfQorCit2b2lkIGpmZnMyX2RpcnR5X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGlhdHRyIGlhdHRyOworCisJaWYgKCEoaW5vZGUtPmlfc3RhdGUgJiBJX0RJUlRZX0RBVEFTWU5DKSkgeworCQlEMihwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZGlydHlfaW5vZGUoKSBub3QgY2FsbGluZyBzZXRhdHRyKCkgZm9yIGlubyAjJWx1XG4iLCBpbm9kZS0+aV9pbm8pKTsKKwkJcmV0dXJuOworCX0KKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9kaXJ0eV9pbm9kZSgpIGNhbGxpbmcgc2V0YXR0cigpIGZvciBpbm8gIyVsdVxuIiwgaW5vZGUtPmlfaW5vKSk7CisKKwlpYXR0ci5pYV92YWxpZCA9IEFUVFJfTU9ERXxBVFRSX1VJRHxBVFRSX0dJRHxBVFRSX0FUSU1FfEFUVFJfTVRJTUV8QVRUUl9DVElNRTsKKwlpYXR0ci5pYV9tb2RlID0gaW5vZGUtPmlfbW9kZTsKKwlpYXR0ci5pYV91aWQgPSBpbm9kZS0+aV91aWQ7CisJaWF0dHIuaWFfZ2lkID0gaW5vZGUtPmlfZ2lkOworCWlhdHRyLmlhX2F0aW1lID0gaW5vZGUtPmlfYXRpbWU7CisJaWF0dHIuaWFfbXRpbWUgPSBpbm9kZS0+aV9tdGltZTsKKwlpYXR0ci5pYV9jdGltZSA9IGlub2RlLT5pX2N0aW1lOworCisJamZmczJfZG9fc2V0YXR0cihpbm9kZSwgJmlhdHRyKTsKK30KKworaW50IGpmZnMyX3JlbW91bnRfZnMgKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpCit7CisJc3RydWN0IGpmZnMyX3NiX2luZm8gKmMgPSBKRkZTMl9TQl9JTkZPKHNiKTsKKworCWlmIChjLT5mbGFncyAmIEpGRlMyX1NCX0ZMQUdfUk8gJiYgIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpCisJCXJldHVybiAtRVJPRlM7CisKKwkvKiBXZSBzdG9wIGlmIGl0IHdhcyBydW5uaW5nLCB0aGVuIHJlc3RhcnQgaWYgaXQgbmVlZHMgdG8uCisJICAgVGhpcyBhbHNvIGNhdGNoZXMgdGhlIGNhc2Ugd2hlcmUgaXQgd2FzIHN0b3BwZWQgYW5kIHRoaXMKKwkgICBpcyBqdXN0IGEgcmVtb3VudCB0byByZXN0YXJ0IGl0LgorCSAgIEZsdXNoIHRoZSB3cml0ZWJ1ZmZlciwgaWYgbmVjY2VjYXJ5LCBlbHNlIHdlIGxvb3NlIGl0ICovCisJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCWpmZnMyX3N0b3BfZ2FyYmFnZV9jb2xsZWN0X3RocmVhZChjKTsKKwkJZG93bigmYy0+YWxsb2Nfc2VtKTsKKwkJamZmczJfZmx1c2hfd2J1Zl9wYWQoYyk7CisJCXVwKCZjLT5hbGxvY19zZW0pOworCX0JCisKKwlpZiAoISgqZmxhZ3MgJiBNU19SRE9OTFkpKQorCQlqZmZzMl9zdGFydF9nYXJiYWdlX2NvbGxlY3RfdGhyZWFkKGMpOworCQorCSpmbGFncyB8PSBNU19OT0FUSU1FOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgamZmczJfd3JpdGVfc3VwZXIgKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGpmZnMyX3NiX2luZm8gKmMgPSBKRkZTMl9TQl9JTkZPKHNiKTsKKwlzYi0+c19kaXJ0ID0gMDsKKworCWlmIChzYi0+c19mbGFncyAmIE1TX1JET05MWSkKKwkJcmV0dXJuOworCisJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX3dyaXRlX3N1cGVyKClcbiIpKTsKKwlqZmZzMl9nYXJiYWdlX2NvbGxlY3RfdHJpZ2dlcihjKTsKKwlqZmZzMl9lcmFzZV9wZW5kaW5nX2Jsb2NrcyhjLCAwKTsKKwlqZmZzMl9mbHVzaF93YnVmX2djKGMsIDApOworfQorCisKKy8qIGpmZnMyX25ld19pbm9kZTogYWxsb2NhdGUgYSBuZXcgaW5vZGUgYW5kIGlub2NhY2hlLCBhZGQgaXQgdG8gdGhlIGhhc2gsCisgICBmaWxsIGluIHRoZSByYXdfaW5vZGUgd2hpbGUgeW91J3JlIGF0IGl0LiAqLworc3RydWN0IGlub2RlICpqZmZzMl9uZXdfaW5vZGUgKHN0cnVjdCBpbm9kZSAqZGlyX2ksIGludCBtb2RlLCBzdHJ1Y3QgamZmczJfcmF3X2lub2RlICpyaSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXJfaS0+aV9zYjsKKwlzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYzsKKwlzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZjsKKwlpbnQgcmV0OworCisJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX25ld19pbm9kZSgpOiBkaXJfaSAlbGQsIG1vZGUgMHgleFxuIiwgZGlyX2ktPmlfaW5vLCBtb2RlKSk7CisKKwljID0gSkZGUzJfU0JfSU5GTyhzYik7CisJCisJaW5vZGUgPSBuZXdfaW5vZGUoc2IpOworCQorCWlmICghaW5vZGUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJZiA9IEpGRlMyX0lOT0RFX0lORk8oaW5vZGUpOworCWpmZnMyX2luaXRfaW5vZGVfaW5mbyhmKTsKKworCW1lbXNldChyaSwgMCwgc2l6ZW9mKCpyaSkpOworCS8qIFNldCBPUy1zcGVjaWZpYyBkZWZhdWx0cyBmb3IgbmV3IGlub2RlcyAqLworCXJpLT51aWQgPSBjcHVfdG9famUxNihjdXJyZW50LT5mc3VpZCk7CisKKwlpZiAoZGlyX2ktPmlfbW9kZSAmIFNfSVNHSUQpIHsKKwkJcmktPmdpZCA9IGNwdV90b19qZTE2KGRpcl9pLT5pX2dpZCk7CisJCWlmIChTX0lTRElSKG1vZGUpKQorCQkJbW9kZSB8PSBTX0lTR0lEOworCX0gZWxzZSB7CisJCXJpLT5naWQgPSBjcHVfdG9famUxNihjdXJyZW50LT5mc2dpZCk7CisJfQorCXJpLT5tb2RlID0gIGNwdV90b19qZW1vZGUobW9kZSk7CisJcmV0ID0gamZmczJfZG9fbmV3X2lub2RlIChjLCBmLCBtb2RlLCByaSk7CisJaWYgKHJldCkgeworCQltYWtlX2JhZF9pbm9kZShpbm9kZSk7CisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCX0KKwlpbm9kZS0+aV9ubGluayA9IDE7CisJaW5vZGUtPmlfaW5vID0gamUzMl90b19jcHUocmktPmlubyk7CisJaW5vZGUtPmlfbW9kZSA9IGplbW9kZV90b19jcHUocmktPm1vZGUpOworCWlub2RlLT5pX2dpZCA9IGplMTZfdG9fY3B1KHJpLT5naWQpOworCWlub2RlLT5pX3VpZCA9IGplMTZfdG9fY3B1KHJpLT51aWQpOworCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBpbm9kZS0+aV9tdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJcmktPmF0aW1lID0gcmktPm10aW1lID0gcmktPmN0aW1lID0gY3B1X3RvX2plMzIoSV9TRUMoaW5vZGUtPmlfbXRpbWUpKTsKKworCWlub2RlLT5pX2Jsa3NpemUgPSBQQUdFX1NJWkU7CisJaW5vZGUtPmlfYmxvY2tzID0gMDsKKwlpbm9kZS0+aV9zaXplID0gMDsKKworCWluc2VydF9pbm9kZV9oYXNoKGlub2RlKTsKKworCXJldHVybiBpbm9kZTsKK30KKworCitpbnQgamZmczJfZG9fZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQoreworCXN0cnVjdCBqZmZzMl9zYl9pbmZvICpjOworCXN0cnVjdCBpbm9kZSAqcm9vdF9pOworCWludCByZXQ7CisJc2l6ZV90IGJsb2NrczsKKworCWMgPSBKRkZTMl9TQl9JTkZPKHNiKTsKKworI2lmbmRlZiBDT05GSUdfSkZGUzJfRlNfTkFORAorCWlmIChjLT5tdGQtPnR5cGUgPT0gTVREX05BTkRGTEFTSCkgeworCQlwcmludGsoS0VSTl9FUlIgImpmZnMyOiBDYW5ub3Qgb3BlcmF0ZSBvbiBOQU5EIGZsYXNoIHVubGVzcyBqZmZzMiBOQU5EIHN1cHBvcnQgaXMgY29tcGlsZWQgaW4uXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorI2VuZGlmCisKKwljLT5mbGFzaF9zaXplID0gYy0+bXRkLT5zaXplOworCisJLyogCisJICogQ2hlY2ssIGlmIHdlIGhhdmUgdG8gY29uY2F0ZW5hdGUgcGh5c2ljYWwgYmxvY2tzIHRvIGxhcmdlciB2aXJ0dWFsIGJsb2NrcworCSAqIHRvIHJlZHVjZSB0aGUgbWVtb3J5c2l6ZSBmb3IgYy0+YmxvY2tzLiAoa21hbGxvYyBhbGxvd3MgbWF4LiAxMjhLIGFsbG9jYXRpb24pCisJICovCisJYy0+c2VjdG9yX3NpemUgPSBjLT5tdGQtPmVyYXNlc2l6ZTsgCisJYmxvY2tzID0gYy0+Zmxhc2hfc2l6ZSAvIGMtPnNlY3Rvcl9zaXplOworCWlmICghKGMtPm10ZC0+ZmxhZ3MgJiBNVERfTk9fVklSVEJMT0NLUykpIHsKKwkJd2hpbGUgKChibG9ja3MgKiBzaXplb2YgKHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrKSkgPiAoMTI4ICogMTAyNCkpIHsKKwkJCWJsb2NrcyA+Pj0gMTsKKwkJCWMtPnNlY3Rvcl9zaXplIDw8PSAxOworCQl9CQorCX0KKworCS8qCisJICogU2l6ZSBhbGlnbm1lbnQgY2hlY2sKKwkgKi8KKwlpZiAoKGMtPnNlY3Rvcl9zaXplICogYmxvY2tzKSAhPSBjLT5mbGFzaF9zaXplKSB7CisJCWMtPmZsYXNoX3NpemUgPSBjLT5zZWN0b3Jfc2l6ZSAqIGJsb2NrczsJCQorCQlwcmludGsoS0VSTl9JTkZPICJqZmZzMjogRmxhc2ggc2l6ZSBub3QgYWxpZ25lZCB0byBlcmFzZXNpemUsIHJlZHVjaW5nIHRvICVkS2lCXG4iLAorCQkJYy0+Zmxhc2hfc2l6ZSAvIDEwMjQpOworCX0KKworCWlmIChjLT5zZWN0b3Jfc2l6ZSAhPSBjLT5tdGQtPmVyYXNlc2l6ZSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAiamZmczI6IEVyYXNlIGJsb2NrIHNpemUgdG9vIHNtYWxsICglZEtpQikuIFVzaW5nIHZpcnR1YWwgYmxvY2tzIHNpemUgKCVkS2lCKSBpbnN0ZWFkXG4iLCAKKwkJCWMtPm10ZC0+ZXJhc2VzaXplIC8gMTAyNCwgYy0+c2VjdG9yX3NpemUgLyAxMDI0KTsKKworCWlmIChjLT5mbGFzaF9zaXplIDwgNSpjLT5zZWN0b3Jfc2l6ZSkgeworCQlwcmludGsoS0VSTl9FUlIgImpmZnMyOiBUb28gZmV3IGVyYXNlIGJsb2NrcyAoJWQpXG4iLCBjLT5mbGFzaF9zaXplIC8gYy0+c2VjdG9yX3NpemUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljLT5jbGVhbm1hcmtlcl9zaXplID0gc2l6ZW9mKHN0cnVjdCBqZmZzMl91bmtub3duX25vZGUpOworCS8qIEpvZXJuIC0tIHN0aWNrIGFsaWdubWVudCBmb3Igd2VpcmQgOC1ieXRlLXBhZ2UgZmxhc2ggaGVyZSAqLworCisJLyogTkFORCAob3Igb3RoZXIgYml6YXJyZSkgZmxhc2guLi4gZG8gc2V0dXAgYWNjb3JkaW5nbHkgKi8KKwlyZXQgPSBqZmZzMl9mbGFzaF9zZXR1cChjKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJYy0+aW5vY2FjaGVfbGlzdCA9IGttYWxsb2MoSU5PQ0FDSEVfSEFTSFNJWkUgKiBzaXplb2Yoc3RydWN0IGpmZnMyX2lub2RlX2NhY2hlICopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWMtPmlub2NhY2hlX2xpc3QpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfd2J1ZjsKKwl9CisJbWVtc2V0KGMtPmlub2NhY2hlX2xpc3QsIDAsIElOT0NBQ0hFX0hBU0hTSVpFICogc2l6ZW9mKHN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqKSk7CisKKwlpZiAoKHJldCA9IGpmZnMyX2RvX21vdW50X2ZzKGMpKSkKKwkJZ290byBvdXRfaW5vaGFzaDsKKworCXJldCA9IC1FSU5WQUw7CisKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZG9fZmlsbF9zdXBlcigpOiBHZXR0aW5nIHJvb3QgaW5vZGVcbiIpKTsKKwlyb290X2kgPSBpZ2V0KHNiLCAxKTsKKwlpZiAoaXNfYmFkX2lub2RlKHJvb3RfaSkpIHsKKwkJRDEocHJpbnRrKEtFUk5fV0FSTklORyAiZ2V0IHJvb3QgaW5vZGUgZmFpbGVkXG4iKSk7CisJCWdvdG8gb3V0X25vZGVzOworCX0KKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9kb19maWxsX3N1cGVyKCk6IGRfYWxsb2Nfcm9vdCgpXG4iKSk7CisJc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290X2kpOworCWlmICghc2ItPnNfcm9vdCkKKwkJZ290byBvdXRfcm9vdF9pOworCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IDB4MjA0MDMKKwlzYi0+c19tYXhieXRlcyA9IDB4RkZGRkZGRkY7CisjZW5kaWYKKwlzYi0+c19ibG9ja3NpemUgPSBQQUdFX0NBQ0hFX1NJWkU7CisJc2ItPnNfYmxvY2tzaXplX2JpdHMgPSBQQUdFX0NBQ0hFX1NISUZUOworCXNiLT5zX21hZ2ljID0gSkZGUzJfU1VQRVJfTUFHSUM7CisJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKQorCQlqZmZzMl9zdGFydF9nYXJiYWdlX2NvbGxlY3RfdGhyZWFkKGMpOworCXJldHVybiAwOworCisgb3V0X3Jvb3RfaToKKwlpcHV0KHJvb3RfaSk7Cisgb3V0X25vZGVzOgorCWpmZnMyX2ZyZWVfaW5vX2NhY2hlcyhjKTsKKwlqZmZzMl9mcmVlX3Jhd19ub2RlX3JlZnMoYyk7CisJaWYgKGMtPm10ZC0+ZmxhZ3MgJiBNVERfTk9fVklSVEJMT0NLUykKKwkJdmZyZWUoYy0+YmxvY2tzKTsKKwllbHNlCisJCWtmcmVlKGMtPmJsb2Nrcyk7Cisgb3V0X2lub2hhc2g6CisJa2ZyZWUoYy0+aW5vY2FjaGVfbGlzdCk7Cisgb3V0X3didWY6CisJamZmczJfZmxhc2hfY2xlYW51cChjKTsKKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgamZmczJfZ2NfcmVsZWFzZV9pbm9kZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywKKwkJCQkgICBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZikKK3sKKwlpcHV0KE9GTklfRURPTklfMlNGRkooZikpOworfQorCitzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqamZmczJfZ2NfZmV0Y2hfaW5vZGUoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsCisJCQkJCQkgICAgIGludCBpbnVtLCBpbnQgbmxpbmspCit7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgamZmczJfaW5vZGVfY2FjaGUgKmljOworCWlmICghbmxpbmspIHsKKwkJLyogVGhlIGlub2RlIGhhcyB6ZXJvIG5saW5rIGJ1dCBpdHMgbm9kZXMgd2VyZW4ndCB5ZXQgbWFya2VkCisJCSAgIG9ic29sZXRlLiBUaGlzIGhhcyB0byBiZSBiZWNhdXNlIHdlJ3JlIHN0aWxsIHdhaXRpbmcgZm9yIAorCQkgICB0aGUgZmluYWwgKGNsb3NlKCkgYW5kKSBpcHV0KCkgdG8gaGFwcGVuLgorCisJCSAgIFRoZXJlJ3MgYSBwb3NzaWJpbGl0eSB0aGF0IHRoZSBmaW5hbCBpcHV0KCkgY291bGQgaGF2ZSAKKwkJICAgaGFwcGVuZWQgd2hpbGUgd2Ugd2VyZSBjb250ZW1wbGF0aW5nLiBJbiBvcmRlciB0byBlbnN1cmUKKwkJICAgdGhhdCB3ZSBkb24ndCBjYXVzZSBhIG5ldyByZWFkX2lub2RlKCkgKHdoaWNoIHdvdWxkIGZhaWwpCisJCSAgIGZvciB0aGUgaW5vZGUgaW4gcXVlc3Rpb24sIHdlIHVzZSBpbG9va3VwKCkgaW4gdGhpcyBjYXNlCisJCSAgIGluc3RlYWQgb2YgaWdldCgpLgorCisJCSAgIFRoZSBubGluayBjYW4ndCBfYmVjb21lXyB6ZXJvIGF0IHRoaXMgcG9pbnQgYmVjYXVzZSB3ZSdyZSAKKwkJICAgaG9sZGluZyB0aGUgYWxsb2Nfc2VtLCBhbmQgamZmczJfZG9fdW5saW5rKCkgd291bGQgYWxzbworCQkgICBuZWVkIHRoYXQgd2hpbGUgZGVjcmVtZW50aW5nIG5saW5rIG9uIGFueSBpbm9kZS4KKwkJKi8KKwkJaW5vZGUgPSBpbG9va3VwKE9GTklfQlNfMlNGRkooYyksIGludW0pOworCQlpZiAoIWlub2RlKSB7CisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiaWxvb2t1cCgpIGZhaWxlZCBmb3IgaW5vICMldTsgaW5vZGUgaXMgcHJvYmFibHkgZGVsZXRlZC5cbiIsCisJCQkJICBpbnVtKSk7CisKKwkJCXNwaW5fbG9jaygmYy0+aW5vY2FjaGVfbG9jayk7CisJCQlpYyA9IGpmZnMyX2dldF9pbm9fY2FjaGUoYywgaW51bSk7CisJCQlpZiAoIWljKSB7CisJCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIklub2RlIGNhY2hlIGZvciBpbm8gIyV1IGlzIGdvbmUuXG4iLCBpbnVtKSk7CisJCQkJc3Bpbl91bmxvY2soJmMtPmlub2NhY2hlX2xvY2spOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJaWYgKGljLT5zdGF0ZSAhPSBJTk9fU1RBVEVfQ0hFQ0tFREFCU0VOVCkgeworCQkJCS8qIFdhaXQgZm9yIHByb2dyZXNzLiBEb24ndCBqdXN0IGxvb3AgKi8KKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiV2FpdGluZyBmb3IgaW5vICMldSBpbiBzdGF0ZSAlZFxuIiwKKwkJCQkJICBpYy0+aW5vLCBpYy0+c3RhdGUpKTsKKwkJCQlzbGVlcF9vbl9zcGludW5sb2NrKCZjLT5pbm9jYWNoZV93cSwgJmMtPmlub2NhY2hlX2xvY2spOworCQkJfSBlbHNlIHsKKwkJCQlzcGluX3VubG9jaygmYy0+aW5vY2FjaGVfbG9jayk7CisJCQl9CisKKwkJCXJldHVybiBOVUxMOworCQl9CisJfSBlbHNlIHsKKwkJLyogSW5vZGUgaGFzIGxpbmtzIHRvIGl0IHN0aWxsOyB0aGV5J3JlIG5vdCBnb2luZyBhd2F5IGJlY2F1c2UKKwkJICAgamZmczJfZG9fdW5saW5rKCkgd291bGQgbmVlZCB0aGUgYWxsb2Nfc2VtIGFuZCB3ZSBoYXZlIGl0LgorCQkgICBKdXN0IGlnZXQoKSBpdCwgYW5kIGlmIHJlYWRfaW5vZGUoKSBpcyBuZWNlc3NhcnkgdGhhdCdzIE9LLgorCQkqLworCQlpbm9kZSA9IGlnZXQoT0ZOSV9CU18yU0ZGSihjKSwgaW51bSk7CisJCWlmICghaW5vZGUpCisJCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJFZXAuIHJlYWRfaW5vZGUoKSBmYWlsZWQgZm9yIGlubyAjJXUuIG5saW5rICVkXG4iLAorCQkgICAgICAgaW51bSwgbmxpbmspOworCQkvKiBOQi4gVGhpcyB3aWxsIGhhcHBlbiBhZ2Fpbi4gV2UgbmVlZCB0byBkbyBzb21ldGhpbmcgYXBwcm9wcmlhdGUgaGVyZS4gKi8KKwkJaXB1dChpbm9kZSk7CisJCXJldHVybiBFUlJfUFRSKC1FSU8pOworCX0KKworCXJldHVybiBKRkZTMl9JTk9ERV9JTkZPKGlub2RlKTsKK30KKwordW5zaWduZWQgY2hhciAqamZmczJfZ2NfZmV0Y2hfcGFnZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgCisJCQkJICAgc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsIAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgKnByaXYpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IE9GTklfRURPTklfMlNGRkooZik7CisJc3RydWN0IHBhZ2UgKnBnOworCisJcGcgPSByZWFkX2NhY2hlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgb2Zmc2V0ID4+IFBBR0VfQ0FDSEVfU0hJRlQsIAorCQkJICAgICAodm9pZCAqKWpmZnMyX2RvX3JlYWRwYWdlX3VubG9jaywgaW5vZGUpOworCWlmIChJU19FUlIocGcpKQorCQlyZXR1cm4gKHZvaWQgKilwZzsKKwkKKwkqcHJpdiA9ICh1bnNpZ25lZCBsb25nKXBnOworCXJldHVybiBrbWFwKHBnKTsKK30KKwordm9pZCBqZmZzMl9nY19yZWxlYXNlX3BhZ2Uoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsCisJCQkgICB1bnNpZ25lZCBjaGFyICpwdHIsCisJCQkgICB1bnNpZ25lZCBsb25nICpwcml2KQoreworCXN0cnVjdCBwYWdlICpwZyA9ICh2b2lkICopKnByaXY7CisKKwlrdW5tYXAocGcpOworCXBhZ2VfY2FjaGVfcmVsZWFzZShwZyk7Cit9CisKK3N0YXRpYyBpbnQgamZmczJfZmxhc2hfc2V0dXAoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpIHsKKwlpbnQgcmV0ID0gMDsKKwkKKwlpZiAoamZmczJfY2xlYW5tYXJrZXJfb29iKGMpKSB7CisJCS8qIE5BTkQgZmxhc2guLi4gZG8gc2V0dXAgYWNjb3JkaW5nbHkgKi8KKwkJcmV0ID0gamZmczJfbmFuZF9mbGFzaF9zZXR1cChjKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJLyogYWRkIHNldHVwcyBmb3Igb3RoZXIgYml6YXJyZSBmbGFzaGVzIGhlcmUuLi4gKi8KKwlpZiAoamZmczJfbm9yX2VjYyhjKSkgeworCQlyZXQgPSBqZmZzMl9ub3JfZWNjX2ZsYXNoX3NldHVwKGMpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBqZmZzMl9mbGFzaF9jbGVhbnVwKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKSB7CisKKwlpZiAoamZmczJfY2xlYW5tYXJrZXJfb29iKGMpKSB7CisJCWpmZnMyX25hbmRfZmxhc2hfY2xlYW51cChjKTsKKwl9CisKKwkvKiBhZGQgY2xlYW51cHMgZm9yIG90aGVyIGJpemFycmUgZmxhc2hlcyBoZXJlLi4uICovCisJaWYgKGpmZnMyX25vcl9lY2MoYykpIHsKKwkJamZmczJfbm9yX2VjY19mbGFzaF9jbGVhbnVwKGMpOworCX0KK30KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2djLmMgYi9mcy9qZmZzMi9nYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZWM3NGYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZmZzMi9nYy5jCkBAIC0wLDAgKzEsMTI0NiBAQAorLyoKKyAqIEpGRlMyIC0tIEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBWZXJzaW9uIDIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIENyZWF0ZWQgYnkgRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPgorICoKKyAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCisgKgorICogJElkOiBnYy5jLHYgMS4xNDQgMjAwNC8xMi8yMSAxMToxODo1MCBkd213MiBFeHAgJAorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlICJub2RlbGlzdC5oIgorI2luY2x1ZGUgImNvbXByLmgiCisKK3N0YXRpYyBpbnQgamZmczJfZ2FyYmFnZV9jb2xsZWN0X3ByaXN0aW5lKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCAKKwkJCQkJICBzdHJ1Y3QgamZmczJfaW5vZGVfY2FjaGUgKmljLAorCQkJCQkgIHN0cnVjdCBqZmZzMl9yYXdfbm9kZV9yZWYgKnJhdyk7CitzdGF0aWMgaW50IGpmZnMyX2dhcmJhZ2VfY29sbGVjdF9tZXRhZGF0YShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiwgCisJCQkJCXN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLCBzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZSAqZmQpOworc3RhdGljIGludCBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfZGlyZW50KHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViLCAKKwkJCQkJc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsIHN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqZmQpOworc3RhdGljIGludCBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfZGVsZXRpb25fZGlyZW50KHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViLCAKKwkJCQkJc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsIHN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqZmQpOworc3RhdGljIGludCBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfaG9sZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiwKKwkJCQkgICAgICBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiwgc3RydWN0IGpmZnMyX2Z1bGxfZG5vZGUgKmZuLAorCQkJCSAgICAgIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBlbmQpOworc3RhdGljIGludCBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfZG5vZGUoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWIsCisJCQkJICAgICAgIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLCBzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZSAqZm4sCisJCQkJICAgICAgIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBlbmQpOworc3RhdGljIGludCBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfbGl2ZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgIHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWIsCisJCQkgICAgICAgc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqcmF3LCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZik7CisKKy8qIENhbGxlZCB3aXRoIGVyYXNlX2NvbXBsZXRpb25fbG9jayBoZWxkICovCitzdGF0aWMgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmpmZnMyX2ZpbmRfZ2NfYmxvY2soc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpCit7CisJc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKnJldDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0bGlzdCA9IE5VTEw7CisJaW50IG4gPSBqaWZmaWVzICUgMTI4OworCisJLyogUGljayBhbiBlcmFzZWJsb2NrIHRvIGdhcmJhZ2UgY29sbGVjdCBuZXh0LiBUaGlzIGlzIHdoZXJlIHdlJ2xsCisJICAgcHV0IHRoZSBjbGV2ZXIgd2Vhci1sZXZlbGxpbmcgYWxnb3JpdGhtcy4gRXZlbnR1YWxseS4gICovCisJLyogV2UgcG9zc2libHkgd2FudCB0byBmYXZvdXIgdGhlIGRpcnRpZXIgYmxvY2tzIG1vcmUgd2hlbiB0aGUKKwkgICBudW1iZXIgb2YgZnJlZSBibG9ja3MgaXMgbG93LiAqLworCWlmICghbGlzdF9lbXB0eSgmYy0+YmFkX3VzZWRfbGlzdCkgJiYgYy0+bnJfZnJlZV9ibG9ja3MgPiBjLT5yZXN2X2Jsb2Nrc19nY2JhZCkgeworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiUGlja2luZyBibG9jayBmcm9tIGJhZF91c2VkX2xpc3QgdG8gR0MgbmV4dFxuIikpOworCQluZXh0bGlzdCA9ICZjLT5iYWRfdXNlZF9saXN0OworCX0gZWxzZSBpZiAobiA8IDUwICYmICFsaXN0X2VtcHR5KCZjLT5lcmFzYWJsZV9saXN0KSkgeworCQkvKiBOb3RlIHRoYXQgbW9zdCBvZiB0aGVtIHdpbGwgaGF2ZSBnb25lIGRpcmVjdGx5IHRvIGJlIGVyYXNlZC4gCisJCSAgIFNvIGRvbid0IGZhdm91ciB0aGUgZXJhc2FibGVfbGlzdCBfdG9vXyBtdWNoLiAqLworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiUGlja2luZyBibG9jayBmcm9tIGVyYXNhYmxlX2xpc3QgdG8gR0MgbmV4dFxuIikpOworCQluZXh0bGlzdCA9ICZjLT5lcmFzYWJsZV9saXN0OworCX0gZWxzZSBpZiAobiA8IDExMCAmJiAhbGlzdF9lbXB0eSgmYy0+dmVyeV9kaXJ0eV9saXN0KSkgeworCQkvKiBNb3N0IG9mIHRoZSB0aW1lLCBwaWNrIG9uZSBvZmYgdGhlIHZlcnlfZGlydHkgbGlzdCAqLworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiUGlja2luZyBibG9jayBmcm9tIHZlcnlfZGlydHlfbGlzdCB0byBHQyBuZXh0XG4iKSk7CisJCW5leHRsaXN0ID0gJmMtPnZlcnlfZGlydHlfbGlzdDsKKwl9IGVsc2UgaWYgKG4gPCAxMjYgJiYgIWxpc3RfZW1wdHkoJmMtPmRpcnR5X2xpc3QpKSB7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJQaWNraW5nIGJsb2NrIGZyb20gZGlydHlfbGlzdCB0byBHQyBuZXh0XG4iKSk7CisJCW5leHRsaXN0ID0gJmMtPmRpcnR5X2xpc3Q7CisJfSBlbHNlIGlmICghbGlzdF9lbXB0eSgmYy0+Y2xlYW5fbGlzdCkpIHsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIlBpY2tpbmcgYmxvY2sgZnJvbSBjbGVhbl9saXN0IHRvIEdDIG5leHRcbiIpKTsKKwkJbmV4dGxpc3QgPSAmYy0+Y2xlYW5fbGlzdDsKKwl9IGVsc2UgaWYgKCFsaXN0X2VtcHR5KCZjLT5kaXJ0eV9saXN0KSkgeworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiUGlja2luZyBibG9jayBmcm9tIGRpcnR5X2xpc3QgdG8gR0MgbmV4dCAoY2xlYW5fbGlzdCB3YXMgZW1wdHkpXG4iKSk7CisKKwkJbmV4dGxpc3QgPSAmYy0+ZGlydHlfbGlzdDsKKwl9IGVsc2UgaWYgKCFsaXN0X2VtcHR5KCZjLT52ZXJ5X2RpcnR5X2xpc3QpKSB7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJQaWNraW5nIGJsb2NrIGZyb20gdmVyeV9kaXJ0eV9saXN0IHRvIEdDIG5leHQgKGNsZWFuX2xpc3QgYW5kIGRpcnR5X2xpc3Qgd2VyZSBlbXB0eSlcbiIpKTsKKwkJbmV4dGxpc3QgPSAmYy0+dmVyeV9kaXJ0eV9saXN0OworCX0gZWxzZSBpZiAoIWxpc3RfZW1wdHkoJmMtPmVyYXNhYmxlX2xpc3QpKSB7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJQaWNraW5nIGJsb2NrIGZyb20gZXJhc2FibGVfbGlzdCB0byBHQyBuZXh0IChjbGVhbl9saXN0IGFuZCB7dmVyeV8sfWRpcnR5X2xpc3Qgd2VyZSBlbXB0eSlcbiIpKTsKKworCQluZXh0bGlzdCA9ICZjLT5lcmFzYWJsZV9saXN0OworCX0gZWxzZSB7CisJCS8qIEVlcC4gQWxsIHdlcmUgZW1wdHkgKi8KKwkJRDEocHJpbnRrKEtFUk5fTk9USUNFICJqZmZzMjogTm8gY2xlYW4sIGRpcnR5IF9vcl8gZXJhc2FibGUgYmxvY2tzIHRvIEdDIGZyb20hIFdoZXJlIGFyZSB0aGV5IGFsbD9cbiIpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0ID0gbGlzdF9lbnRyeShuZXh0bGlzdC0+bmV4dCwgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2ssIGxpc3QpOworCWxpc3RfZGVsKCZyZXQtPmxpc3QpOworCWMtPmdjYmxvY2sgPSByZXQ7CisJcmV0LT5nY19ub2RlID0gcmV0LT5maXJzdF9ub2RlOworCWlmICghcmV0LT5nY19ub2RlKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVlcC4gcmV0LT5nY19ub2RlIGZvciBibG9jayBhdCAweCUwOHggaXMgTlVMTFxuIiwgcmV0LT5vZmZzZXQpOworCQlCVUcoKTsKKwl9CisJCisJLyogSGF2ZSB3ZSBhY2NpZGVudGFsbHkgcGlja2VkIGEgY2xlYW4gYmxvY2sgd2l0aCB3YXN0ZWQgc3BhY2UgPyAqLworCWlmIChyZXQtPndhc3RlZF9zaXplKSB7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJDb252ZXJ0aW5nIHdhc3RlZF9zaXplICUwOHggdG8gZGlydHlfc2l6ZVxuIiwgcmV0LT53YXN0ZWRfc2l6ZSkpOworCQlyZXQtPmRpcnR5X3NpemUgKz0gcmV0LT53YXN0ZWRfc2l6ZTsKKwkJYy0+d2FzdGVkX3NpemUgLT0gcmV0LT53YXN0ZWRfc2l6ZTsKKwkJYy0+ZGlydHlfc2l6ZSArPSByZXQtPndhc3RlZF9zaXplOworCQlyZXQtPndhc3RlZF9zaXplID0gMDsKKwl9CisKKwlEMihqZmZzMl9kdW1wX2Jsb2NrX2xpc3RzKGMpKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfcGFzcworICogTWFrZSBhIHNpbmdsZSBhdHRlbXB0IHRvIHByb2dyZXNzIEdDLiBNb3ZlIG9uZSBub2RlLCBhbmQgcG9zc2libHkKKyAqIHN0YXJ0IGVyYXNpbmcgb25lIGVyYXNlYmxvY2suCisgKi8KK2ludCBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfcGFzcyhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYykKK3sKKwlzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZjsKKwlzdHJ1Y3QgamZmczJfaW5vZGVfY2FjaGUgKmljOworCXN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWI7CisJc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqcmF3OworCWludCByZXQgPSAwLCBpbnVtLCBubGluazsKKworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmMtPmFsbG9jX3NlbSkpCisJCXJldHVybiAtRUlOVFI7CisKKwlmb3IgKDs7KSB7CisJCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJaWYgKCFjLT51bmNoZWNrZWRfc2l6ZSkKKwkJCWJyZWFrOworCisJCS8qIFdlIGNhbid0IHN0YXJ0IGRvaW5nIEdDIHlldC4gV2UgaGF2ZW4ndCBmaW5pc2hlZCBjaGVja2luZworCQkgICB0aGUgbm9kZSBDUkNzIGV0Yy4gRG8gaXQgbm93LiAqLworCQkKKwkJLyogY2hlY2tlZF9pbm8gaXMgcHJvdGVjdGVkIGJ5IHRoZSBhbGxvY19zZW0gKi8KKwkJaWYgKGMtPmNoZWNrZWRfaW5vID4gYy0+aGlnaGVzdF9pbm8pIHsKKwkJCXByaW50ayhLRVJOX0NSSVQgIkNoZWNrZWQgYWxsIGlub2RlcyBidXQgc3RpbGwgMHgleCBieXRlcyBvZiB1bmNoZWNrZWQgc3BhY2U/XG4iLAorCQkJICAgICAgIGMtPnVuY2hlY2tlZF9zaXplKTsKKwkJCUQyKGpmZnMyX2R1bXBfYmxvY2tfbGlzdHMoYykpOworCQkJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisJCQlCVUcoKTsKKwkJfQorCisJCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCisJCXNwaW5fbG9jaygmYy0+aW5vY2FjaGVfbG9jayk7CisKKwkJaWMgPSBqZmZzMl9nZXRfaW5vX2NhY2hlKGMsIGMtPmNoZWNrZWRfaW5vKyspOworCisJCWlmICghaWMpIHsKKwkJCXNwaW5fdW5sb2NrKCZjLT5pbm9jYWNoZV9sb2NrKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFpYy0+bmxpbmspIHsKKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJTa2lwcGluZyBjaGVjayBvZiBpbm8gIyVkIHdpdGggbmxpbmsgemVyb1xuIiwKKwkJCQkgIGljLT5pbm8pKTsKKwkJCXNwaW5fdW5sb2NrKCZjLT5pbm9jYWNoZV9sb2NrKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXN3aXRjaChpYy0+c3RhdGUpIHsKKwkJY2FzZSBJTk9fU1RBVEVfQ0hFQ0tFREFCU0VOVDoKKwkJY2FzZSBJTk9fU1RBVEVfUFJFU0VOVDoKKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJTa2lwcGluZyBpbm8gIyV1IGFscmVhZHkgY2hlY2tlZFxuIiwgaWMtPmlubykpOworCQkJc3Bpbl91bmxvY2soJmMtPmlub2NhY2hlX2xvY2spOworCQkJY29udGludWU7CisKKwkJY2FzZSBJTk9fU1RBVEVfR0M6CisJCWNhc2UgSU5PX1NUQVRFX0NIRUNLSU5HOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiSW5vZGUgIyV1IGlzIGluIHN0YXRlICVkIGR1cmluZyBDUkMgY2hlY2sgcGhhc2UhXG4iLCBpYy0+aW5vLCBpYy0+c3RhdGUpOworCQkJc3Bpbl91bmxvY2soJmMtPmlub2NhY2hlX2xvY2spOworCQkJQlVHKCk7CisKKwkJY2FzZSBJTk9fU1RBVEVfUkVBRElORzoKKwkJCS8qIFdlIG5lZWQgdG8gd2FpdCBmb3IgaXQgdG8gZmluaXNoLCBsZXN0IHdlIG1vdmUgb24KKwkJCSAgIGFuZCB0cmlnZ2VyIHRoZSBCVUcoKSBhYm92ZSB3aGlsZSB3ZSBoYXZlbid0IHlldCAKKwkJCSAgIGZpbmlzaGVkIGNoZWNraW5nIGFsbCBpdHMgbm9kZXMgKi8KKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJXYWl0aW5nIGZvciBpbm8gIyV1IHRvIGZpbmlzaCByZWFkaW5nXG4iLCBpYy0+aW5vKSk7CisJCQl1cCgmYy0+YWxsb2Nfc2VtKTsKKwkJCXNsZWVwX29uX3NwaW51bmxvY2soJmMtPmlub2NhY2hlX3dxLCAmYy0+aW5vY2FjaGVfbG9jayk7CisJCQlyZXR1cm4gMDsKKworCQlkZWZhdWx0OgorCQkJQlVHKCk7CisKKwkJY2FzZSBJTk9fU1RBVEVfVU5DSEVDS0VEOgorCQkJOworCQl9CisJCWljLT5zdGF0ZSA9IElOT19TVEFURV9DSEVDS0lORzsKKwkJc3Bpbl91bmxvY2soJmMtPmlub2NhY2hlX2xvY2spOworCisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9nYXJiYWdlX2NvbGxlY3RfcGFzcygpIHRyaWdnZXJpbmcgaW5vZGUgc2NhbiBvZiBpbm8jJXVcbiIsIGljLT5pbm8pKTsKKworCQlyZXQgPSBqZmZzMl9kb19jcmNjaGVja19pbm9kZShjLCBpYyk7CisJCWlmIChyZXQpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJSZXR1cm5lZCBlcnJvciBmb3IgY3JjY2hlY2sgb2YgaW5vICMldS4gRXhwZWN0IGJhZG5lc3MuLi5cbiIsIGljLT5pbm8pOworCisJCWpmZnMyX3NldF9pbm9jYWNoZV9zdGF0ZShjLCBpYywgSU5PX1NUQVRFX0NIRUNLRURBQlNFTlQpOworCQl1cCgmYy0+YWxsb2Nfc2VtKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBGaXJzdCwgd29yayBvdXQgd2hpY2ggYmxvY2sgd2UncmUgZ2FyYmFnZS1jb2xsZWN0aW5nICovCisJamViID0gYy0+Z2NibG9jazsKKworCWlmICghamViKQorCQlqZWIgPSBqZmZzMl9maW5kX2djX2Jsb2NrKGMpOworCisJaWYgKCFqZWIpIHsKKwkJRDEgKHByaW50ayhLRVJOX05PVElDRSAiamZmczI6IENvdWxkbid0IGZpbmQgZXJhc2UgYmxvY2sgdG8gZ2FyYmFnZSBjb2xsZWN0IVxuIikpOworCQlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJdXAoJmMtPmFsbG9jX3NlbSk7CisJCXJldHVybiAtRUlPOworCX0KKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJHQyBmcm9tIGJsb2NrICUwOHgsIHVzZWRfc2l6ZSAlMDh4LCBkaXJ0eV9zaXplICUwOHgsIGZyZWVfc2l6ZSAlMDh4XG4iLCBqZWItPm9mZnNldCwgamViLT51c2VkX3NpemUsIGplYi0+ZGlydHlfc2l6ZSwgamViLT5mcmVlX3NpemUpKTsKKwlEMShpZiAoYy0+bmV4dGJsb2NrKQorCSAgIHByaW50ayhLRVJOX0RFQlVHICJOZXh0YmxvY2sgYXQgICUwOHgsIHVzZWRfc2l6ZSAlMDh4LCBkaXJ0eV9zaXplICUwOHgsIHdhc3RlZF9zaXplICUwOHgsIGZyZWVfc2l6ZSAlMDh4XG4iLCBjLT5uZXh0YmxvY2stPm9mZnNldCwgYy0+bmV4dGJsb2NrLT51c2VkX3NpemUsIGMtPm5leHRibG9jay0+ZGlydHlfc2l6ZSwgYy0+bmV4dGJsb2NrLT53YXN0ZWRfc2l6ZSwgYy0+bmV4dGJsb2NrLT5mcmVlX3NpemUpKTsKKworCWlmICghamViLT51c2VkX3NpemUpIHsKKwkJdXAoJmMtPmFsbG9jX3NlbSk7CisJCWdvdG8gZXJhc2VpdDsKKwl9CisKKwlyYXcgPSBqZWItPmdjX25vZGU7CisJCQkKKwl3aGlsZShyZWZfb2Jzb2xldGUocmF3KSkgeworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiTm9kZSBhdCAweCUwOHggaXMgb2Jzb2xldGUuLi4gc2tpcHBpbmdcbiIsIHJlZl9vZmZzZXQocmF3KSkpOworCQlyYXcgPSByYXctPm5leHRfcGh5czsKKwkJaWYgKHVubGlrZWx5KCFyYXcpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJlZXAuIEVuZCBvZiByYXcgbGlzdCB3aGlsZSBzdGlsbCBzdXBwb3NlZGx5IG5vZGVzIHRvIEdDXG4iKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImVyYXNlIGJsb2NrIGF0IDB4JTA4eC4gZnJlZV9zaXplIDB4JTA4eCwgZGlydHlfc2l6ZSAweCUwOHgsIHVzZWRfc2l6ZSAweCUwOHhcbiIsIAorCQkJICAgICAgIGplYi0+b2Zmc2V0LCBqZWItPmZyZWVfc2l6ZSwgamViLT5kaXJ0eV9zaXplLCBqZWItPnVzZWRfc2l6ZSk7CisJCQlqZWItPmdjX25vZGUgPSByYXc7CisJCQlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJCXVwKCZjLT5hbGxvY19zZW0pOworCQkJQlVHKCk7CisJCX0KKwl9CisJamViLT5nY19ub2RlID0gcmF3OworCisJRDEocHJpbnRrKEtFUk5fREVCVUcgIkdvaW5nIHRvIGdhcmJhZ2UgY29sbGVjdCBub2RlIGF0IDB4JTA4eFxuIiwgcmVmX29mZnNldChyYXcpKSk7CisKKwlpZiAoIXJhdy0+bmV4dF9pbl9pbm8pIHsKKwkJLyogSW5vZGUtbGVzcyBub2RlLiBDbGVhbiBtYXJrZXIsIHNuYXBzaG90IG9yIHNvbWV0aGluZyBsaWtlIHRoYXQgKi8KKwkJLyogRklYTUU6IElmIGl0J3Mgc29tZXRoaW5nIHRoYXQgbmVlZHMgdG8gYmUgY29waWVkLCBpbmNsdWRpbmcgc29tZXRoaW5nCisJCSAgIHdlIGRvbid0IGdyb2sgdGhhdCBoYXMgSkZGUzJfTk9ERVRZUEVfUldDT01QQVRfQ09QWSwgd2Ugc2hvdWxkIGRvIHNvICovCisJCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgcmF3KTsKKwkJdXAoJmMtPmFsbG9jX3NlbSk7CisJCWdvdG8gZXJhc2VpdF9sb2NrOworCX0KKworCWljID0gamZmczJfcmF3X3JlZl90b19pYyhyYXcpOworCisJLyogV2UgbmVlZCB0byBob2xkIHRoZSBpbm9jYWNoZS4gRWl0aGVyIHRoZSBlcmFzZV9jb21wbGV0aW9uX2xvY2sgb3IKKwkgICB0aGUgaW5vY2FjaGVfbG9jayBhcmUgc3VmZmljaWVudDsgd2UgdHJhZGUgZG93biBzaW5jZSB0aGUgaW5vY2FjaGVfbG9jayAKKwkgICBjYXVzZXMgbGVzcyBjb250ZW50aW9uLiAqLworCXNwaW5fbG9jaygmYy0+aW5vY2FjaGVfbG9jayk7CisKKwlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9nYXJiYWdlX2NvbGxlY3RfcGFzcyBjb2xsZWN0aW5nIGZyb20gYmxvY2sgQDB4JTA4eC4gTm9kZSBAMHglMDh4KCVkKSwgaW5vICMldVxuIiwgamViLT5vZmZzZXQsIHJlZl9vZmZzZXQocmF3KSwgcmVmX2ZsYWdzKHJhdyksIGljLT5pbm8pKTsKKworCS8qIFRocmVlIHBvc3NpYmlsaXRpZXM6CisJICAgMS4gSW5vZGUgaXMgYWxyZWFkeSBpbi1jb3JlLiBXZSBtdXN0IGlnZXQgaXQgYW5kIGRvIHByb3BlcgorCSAgICAgIHVwZGF0aW5nIHRvIGl0cyBmcmFndHJlZSwgZXRjLgorCSAgIDIuIElub2RlIGlzIG5vdCBpbi1jb3JlLCBub2RlIGlzIFJFRl9QUklTVElORS4gV2UgbG9jayB0aGUKKwkgICAgICBpbm9jYWNoZSB0byBwcmV2ZW50IGEgcmVhZF9pbm9kZSgpLCBjb3B5IHRoZSBub2RlIGludGFjdC4KKwkgICAzLiBJbm9kZSBpcyBub3QgaW4tY29yZSwgbm9kZSBpcyBub3QgcHJpc3RpbmUuIFdlIG11c3QgaWdldCgpCisJICAgICAgYW5kIHRha2UgdGhlIHNsb3cgcGF0aC4KKwkqLworCisJc3dpdGNoKGljLT5zdGF0ZSkgeworCWNhc2UgSU5PX1NUQVRFX0NIRUNLRURBQlNFTlQ6CisJCS8qIEl0J3MgYmVlbiBjaGVja2VkLCBidXQgaXQncyBub3QgY3VycmVudGx5IGluLWNvcmUuIAorCQkgICBXZSBjYW4ganVzdCBjb3B5IGFueSBwcmlzdGluZSBub2RlcywgYnV0IGhhdmUKKwkJICAgdG8gcHJldmVudCBhbnlvbmUgZWxzZSBmcm9tIGRvaW5nIHJlYWRfaW5vZGUoKSB3aGlsZQorCQkgICB3ZSdyZSBhdCBpdCwgc28gd2Ugc2V0IHRoZSBzdGF0ZSBhY2NvcmRpbmdseSAqLworCQlpZiAocmVmX2ZsYWdzKHJhdykgPT0gUkVGX1BSSVNUSU5FKQorCQkJaWMtPnN0YXRlID0gSU5PX1NUQVRFX0dDOworCQllbHNlIHsKKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJJbm8gIyV1IGlzIGFic2VudCBidXQgbm9kZSBub3QgUkVGX1BSSVNUSU5FLiBSZWFkaW5nLlxuIiwgCisJCQkJICBpYy0+aW5vKSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIElOT19TVEFURV9QUkVTRU5UOgorCQkvKiBJdCdzIGluLWNvcmUuIEdDIG11c3QgaWdldCgpIGl0LiAqLworCQlicmVhazsKKworCWNhc2UgSU5PX1NUQVRFX1VOQ0hFQ0tFRDoKKwljYXNlIElOT19TVEFURV9DSEVDS0lORzoKKwljYXNlIElOT19TVEFURV9HQzoKKwkJLyogU2hvdWxkIG5ldmVyIGhhcHBlbi4gV2Ugc2hvdWxkIGhhdmUgZmluaXNoZWQgY2hlY2tpbmcKKwkJICAgYnkgdGhlIHRpbWUgd2UgYWN0dWFsbHkgc3RhcnQgZG9pbmcgYW55IEdDLCBhbmQgc2luY2UgCisJCSAgIHdlJ3JlIGhvbGRpbmcgdGhlIGFsbG9jX3NlbSwgbm8gb3RoZXIgZ2FyYmFnZSBjb2xsZWN0aW9uIAorCQkgICBjYW4gaGFwcGVuLgorCQkqLworCQlwcmludGsoS0VSTl9DUklUICJJbm9kZSAjJXUgYWxyZWFkeSBpbiBzdGF0ZSAlZCBpbiBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfcGFzcygpIVxuIiwKKwkJICAgICAgIGljLT5pbm8sIGljLT5zdGF0ZSk7CisJCXVwKCZjLT5hbGxvY19zZW0pOworCQlzcGluX3VubG9jaygmYy0+aW5vY2FjaGVfbG9jayk7CisJCUJVRygpOworCisJY2FzZSBJTk9fU1RBVEVfUkVBRElORzoKKwkJLyogU29tZW9uZSdzIGN1cnJlbnRseSB0cnlpbmcgdG8gcmVhZCBpdC4gV2UgbXVzdCB3YWl0IGZvcgorCQkgICB0aGVtIHRvIGZpbmlzaCBhbmQgdGhlbiBnbyB0aHJvdWdoIHRoZSBmdWxsIGlnZXQoKSByb3V0ZQorCQkgICB0byBkbyB0aGUgR0MuIEhvd2V2ZXIsIHNvbWV0aW1lcyByZWFkX2lub2RlKCkgbmVlZHMgdG8gZ2V0CisJCSAgIHRoZSBhbGxvY19zZW0oKSAoZm9yIG1hcmtpbmcgbm9kZXMgaW52YWxpZCkgc28gd2UgbXVzdAorCQkgICBkcm9wIHRoZSBhbGxvY19zZW0gYmVmb3JlIHNsZWVwaW5nLiAqLworCisJCXVwKCZjLT5hbGxvY19zZW0pOworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZ2FyYmFnZV9jb2xsZWN0X3Bhc3MoKSB3YWl0aW5nIGZvciBpbm8gIyV1IGluIHN0YXRlICVkXG4iLAorCQkJICBpYy0+aW5vLCBpYy0+c3RhdGUpKTsKKwkJc2xlZXBfb25fc3BpbnVubG9jaygmYy0+aW5vY2FjaGVfd3EsICZjLT5pbm9jYWNoZV9sb2NrKTsKKwkJLyogQW5kIGJlY2F1c2Ugd2UgZHJvcHBlZCB0aGUgYWxsb2Nfc2VtIHdlIG11c3Qgc3RhcnQgYWdhaW4gZnJvbSB0aGUgCisJCSAgIGJlZ2lubmluZy4gUG9uZGVyIGNoYW5jZSBvZiBsaXZlbG9jayBoZXJlIC0tIHdlJ3JlIHJldHVybmluZyBzdWNjZXNzCisJCSAgIHdpdGhvdXQgYWN0dWFsbHkgbWFraW5nIGFueSBwcm9ncmVzcy4KKworCQkgICBROiBXaGF0IGFyZSB0aGUgY2hhbmNlcyB0aGF0IHRoZSBpbm9kZSBpcyBiYWNrIGluIElOT19TVEFURV9SRUFESU5HIAorCQkgICBhZ2FpbiBieSB0aGUgdGltZSB3ZSBuZXh0IGVudGVyIHRoaXMgZnVuY3Rpb24/IEFuZCB0aGF0IHRoaXMgaGFwcGVucworCQkgICBlbm91Z2ggdGltZXMgdG8gY2F1c2UgYSByZWFsIGRlbGF5PworCisJCSAgIEE6IFNtYWxsIGVub3VnaCB0aGF0IEkgZG9uJ3QgY2FyZSA6KSAKKwkJKi8KKwkJcmV0dXJuIDA7CisJfQorCisJLyogT0suIE5vdyBpZiB0aGUgaW5vZGUgaXMgaW4gc3RhdGUgSU5PX1NUQVRFX0dDLCB3ZSBhcmUgZ29pbmcgdG8gY29weSB0aGUKKwkgICBub2RlIGludGFjdCwgYW5kIHdlIGRvbid0IGhhdmUgdG8gbXVjayBhYm91dCB3aXRoIHRoZSBmcmFndHJlZSBldGMuIAorCSAgIGJlY2F1c2Ugd2Uga25vdyBpdCdzIG5vdCBpbi1jb3JlLiBJZiBpdCBfd2FzXyBpbi1jb3JlLCB3ZSBnbyB0aHJvdWdoCisJICAgYWxsIHRoZSBpZ2V0KCkgY3JhcCBhbnl3YXkgKi8KKworCWlmIChpYy0+c3RhdGUgPT0gSU5PX1NUQVRFX0dDKSB7CisJCXNwaW5fdW5sb2NrKCZjLT5pbm9jYWNoZV9sb2NrKTsKKworCQlyZXQgPSBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfcHJpc3RpbmUoYywgaWMsIHJhdyk7CisKKwkJc3Bpbl9sb2NrKCZjLT5pbm9jYWNoZV9sb2NrKTsKKwkJaWMtPnN0YXRlID0gSU5PX1NUQVRFX0NIRUNLRURBQlNFTlQ7CisJCXdha2VfdXAoJmMtPmlub2NhY2hlX3dxKTsKKworCQlpZiAocmV0ICE9IC1FQkFERkQpIHsKKwkJCXNwaW5fdW5sb2NrKCZjLT5pbm9jYWNoZV9sb2NrKTsKKwkJCWdvdG8gcmVsZWFzZV9zZW07CisJCX0KKworCQkvKiBGYWxsIHRocm91Z2ggaWYgaXQgd2FudGVkIHVzIHRvLCB3aXRoIGlub2NhY2hlX2xvY2sgaGVsZCAqLworCX0KKworCS8qIFByZXZlbnQgdGhlIGZhaXJseSB1bmxpa2VseSByYWNlIHdoZXJlIHRoZSBnY2Jsb2NrIGlzCisJICAgZW50aXJlbHkgb2Jzb2xldGVkIGJ5IHRoZSBmaW5hbCBjbG9zZSBvZiBhIGZpbGUgd2hpY2ggaGFkCisJICAgdGhlIG9ubHkgdmFsaWQgbm9kZXMgaW4gdGhlIGJsb2NrLCBmb2xsb3dlZCBieSBlcmFzdXJlLAorCSAgIGZvbGxvd2VkIGJ5IGZyZWVpbmcgb2YgdGhlIGljIGJlY2F1c2UgdGhlIGVyYXNlZCBibG9jayhzKQorCSAgIGhlbGQgX2FsbF8gdGhlIG5vZGVzIG9mIHRoYXQgaW5vZGUuLi4uIG5ldmVyIGJlZW4gc2VlbiBidXQKKwkgICBpdCdzIHZhZ3VlbHkgcG9zc2libGUuICovCisKKwlpbnVtID0gaWMtPmlubzsKKwlubGluayA9IGljLT5ubGluazsKKwlzcGluX3VubG9jaygmYy0+aW5vY2FjaGVfbG9jayk7CisKKwlmID0gamZmczJfZ2NfZmV0Y2hfaW5vZGUoYywgaW51bSwgbmxpbmspOworCWlmIChJU19FUlIoZikpIHsKKwkJcmV0ID0gUFRSX0VSUihmKTsKKwkJZ290byByZWxlYXNlX3NlbTsKKwl9CisJaWYgKCFmKSB7CisJCXJldCA9IDA7CisJCWdvdG8gcmVsZWFzZV9zZW07CisJfQorCisJcmV0ID0gamZmczJfZ2FyYmFnZV9jb2xsZWN0X2xpdmUoYywgamViLCByYXcsIGYpOworCisJamZmczJfZ2NfcmVsZWFzZV9pbm9kZShjLCBmKTsKKworIHJlbGVhc2Vfc2VtOgorCXVwKCZjLT5hbGxvY19zZW0pOworCisgZXJhc2VpdF9sb2NrOgorCS8qIElmIHdlJ3ZlIGZpbmlzaGVkIHRoaXMgYmxvY2ssIHN0YXJ0IGl0IGVyYXNpbmcgKi8KKwlzcGluX2xvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisKKyBlcmFzZWl0OgorCWlmIChjLT5nY2Jsb2NrICYmICFjLT5nY2Jsb2NrLT51c2VkX3NpemUpIHsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkJsb2NrIGF0IDB4JTA4eCBjb21wbGV0ZWx5IG9ic29sZXRlZCBieSBHQy4gTW92aW5nIHRvIGVyYXNlX3BlbmRpbmdfbGlzdFxuIiwgYy0+Z2NibG9jay0+b2Zmc2V0KSk7CisJCS8qIFdlJ3JlIEdDJ2luZyBhbiBlbXB0eSBibG9jaz8gKi8KKwkJbGlzdF9hZGRfdGFpbCgmYy0+Z2NibG9jay0+bGlzdCwgJmMtPmVyYXNlX3BlbmRpbmdfbGlzdCk7CisJCWMtPmdjYmxvY2sgPSBOVUxMOworCQljLT5ucl9lcmFzaW5nX2Jsb2NrcysrOworCQlqZmZzMl9lcmFzZV9wZW5kaW5nX3RyaWdnZXIoYyk7CisJfQorCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfbGl2ZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgIHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWIsCisJCQkJICAgICAgc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqcmF3LCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZikKK3sKKwlzdHJ1Y3QgamZmczJfbm9kZV9mcmFnICpmcmFnOworCXN0cnVjdCBqZmZzMl9mdWxsX2Rub2RlICpmbiA9IE5VTEw7CisJc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICpmZDsKKwl1aW50MzJfdCBzdGFydCA9IDAsIGVuZCA9IDAsIG5yZnJhZ3MgPSAwOworCWludCByZXQgPSAwOworCisJZG93bigmZi0+c2VtKTsKKworCS8qIE5vdyB3ZSBoYXZlIHRoZSBsb2NrIGZvciB0aGlzIGlub2RlLiBDaGVjayB0aGF0IGl0J3Mgc3RpbGwgdGhlIG9uZSBhdCB0aGUgaGVhZAorCSAgIG9mIHRoZSBsaXN0LiAqLworCisJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCisJaWYgKGMtPmdjYmxvY2sgIT0gamViKSB7CisJCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiR0MgYmxvY2sgaXMgbm8gbG9uZ2VyIGdjYmxvY2suIFJlc3RhcnRcbiIpKTsKKwkJZ290byB1cG5vdXQ7CisJfQorCWlmIChyZWZfb2Jzb2xldGUocmF3KSkgeworCQlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIm5vZGUgdG8gYmUgR0MnZCB3YXMgb2Jzb2xldGVkIGluIHRoZSBtZWFudGltZS5cbiIpKTsKKwkJLyogVGhleSdsbCBjYWxsIGFnYWluICovCisJCWdvdG8gdXBub3V0OworCX0KKwlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKworCS8qIE9LLiBMb29rcyBzYWZlLiBBbmQgbm9ib2R5IGNhbiBnZXQgdXMgbm93IGJlY2F1c2Ugd2UgaGF2ZSB0aGUgc2VtYXBob3JlLiBNb3ZlIHRoZSBibG9jayAqLworCWlmIChmLT5tZXRhZGF0YSAmJiBmLT5tZXRhZGF0YS0+cmF3ID09IHJhdykgeworCQlmbiA9IGYtPm1ldGFkYXRhOworCQlyZXQgPSBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfbWV0YWRhdGEoYywgamViLCBmLCBmbik7CisJCWdvdG8gdXBub3V0OworCX0KKworCS8qIEZJWE1FLiBSZWFkIG5vZGUgYW5kIGRvIGxvb2t1cD8gKi8KKwlmb3IgKGZyYWcgPSBmcmFnX2ZpcnN0KCZmLT5mcmFndHJlZSk7IGZyYWc7IGZyYWcgPSBmcmFnX25leHQoZnJhZykpIHsKKwkJaWYgKGZyYWctPm5vZGUgJiYgZnJhZy0+bm9kZS0+cmF3ID09IHJhdykgeworCQkJZm4gPSBmcmFnLT5ub2RlOworCQkJZW5kID0gZnJhZy0+b2ZzICsgZnJhZy0+c2l6ZTsKKwkJCWlmICghbnJmcmFncysrKQorCQkJCXN0YXJ0ID0gZnJhZy0+b2ZzOworCQkJaWYgKG5yZnJhZ3MgPT0gZnJhZy0+bm9kZS0+ZnJhZ3MpCisJCQkJYnJlYWs7IC8qIFdlJ3ZlIGZvdW5kIHRoZW0gYWxsICovCisJCX0KKwl9CisJaWYgKGZuKSB7CisJCWlmIChyZWZfZmxhZ3MocmF3KSA9PSBSRUZfUFJJU1RJTkUpIHsKKwkJCXJldCA9IGpmZnMyX2dhcmJhZ2VfY29sbGVjdF9wcmlzdGluZShjLCBmLT5pbm9jYWNoZSwgcmF3KTsKKwkJCWlmICghcmV0KSB7CisJCQkJLyogVXJnaC4gUmV0dXJuIGl0IHNlbnNpYmx5LiAqLworCQkJCWZyYWctPm5vZGUtPnJhdyA9IGYtPmlub2NhY2hlLT5ub2RlczsKKwkJCX0JCisJCQlpZiAocmV0ICE9IC1FQkFERkQpCisJCQkJZ290byB1cG5vdXQ7CisJCX0KKwkJLyogV2UgZm91bmQgYSBkYXRhbm9kZS4gRG8gdGhlIEdDICovCisJCWlmKChzdGFydCA+PiBQQUdFX0NBQ0hFX1NISUZUKSA8ICgoZW5kLTEpID4+IFBBR0VfQ0FDSEVfU0hJRlQpKSB7CisJCQkvKiBJdCBjcm9zc2VzIGEgcGFnZSBib3VuZGFyeS4gVGhlcmVmb3JlLCBpdCBtdXN0IGJlIGEgaG9sZS4gKi8KKwkJCXJldCA9IGpmZnMyX2dhcmJhZ2VfY29sbGVjdF9ob2xlKGMsIGplYiwgZiwgZm4sIHN0YXJ0LCBlbmQpOworCQl9IGVsc2UgeworCQkJLyogSXQgY291bGQgc3RpbGwgYmUgYSBob2xlLiBCdXQgd2UgR0MgdGhlIHBhZ2UgdGhpcyB3YXkgYW55d2F5ICovCisJCQlyZXQgPSBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfZG5vZGUoYywgamViLCBmLCBmbiwgc3RhcnQsIGVuZCk7CisJCX0KKwkJZ290byB1cG5vdXQ7CisJfQorCQorCS8qIFdhc24ndCBhIGRub2RlLiBUcnkgZGlyZW50ICovCisJZm9yIChmZCA9IGYtPmRlbnRzOyBmZDsgZmQ9ZmQtPm5leHQpIHsKKwkJaWYgKGZkLT5yYXcgPT0gcmF3KQorCQkJYnJlYWs7CisJfQorCisJaWYgKGZkICYmIGZkLT5pbm8pIHsKKwkJcmV0ID0gamZmczJfZ2FyYmFnZV9jb2xsZWN0X2RpcmVudChjLCBqZWIsIGYsIGZkKTsKKwl9IGVsc2UgaWYgKGZkKSB7CisJCXJldCA9IGpmZnMyX2dhcmJhZ2VfY29sbGVjdF9kZWxldGlvbl9kaXJlbnQoYywgamViLCBmLCBmZCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiUmF3IG5vZGUgYXQgMHglMDh4IHdhc24ndCBpbiBub2RlIGxpc3RzIGZvciBpbm8gIyV1XG4iLAorCQkgICAgICAgcmVmX29mZnNldChyYXcpLCBmLT5pbm9jYWNoZS0+aW5vKTsKKwkJaWYgKHJlZl9vYnNvbGV0ZShyYXcpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJCdXQgaXQncyBvYnNvbGV0ZSBzbyB3ZSBkb24ndCBtaW5kIHRvbyBtdWNoXG4iKTsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IC1FSU87CisJCX0KKwl9CisgdXBub3V0OgorCXVwKCZmLT5zZW0pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfcHJpc3RpbmUoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIAorCQkJCQkgIHN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqaWMsCisJCQkJCSAgc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqcmF3KQoreworCXVuaW9uIGpmZnMyX25vZGVfdW5pb24gKm5vZGU7CisJc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqbnJhdzsKKwlzaXplX3QgcmV0bGVuOworCWludCByZXQ7CisJdWludDMyX3QgcGh5c19vZnMsIGFsbG9jbGVuOworCXVpbnQzMl90IGNyYywgcmF3bGVuOworCWludCByZXRyaWVkID0gMDsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJHb2luZyB0byBHQyBSRUZfUFJJU1RJTkUgbm9kZSBhdCAweCUwOHhcbiIsIHJlZl9vZmZzZXQocmF3KSkpOworCisJcmF3bGVuID0gcmVmX3RvdGxlbihjLCBjLT5nY2Jsb2NrLCByYXcpOworCisJLyogQXNrIGZvciBhIHNtYWxsIGFtb3VudCBvZiBzcGFjZSAob3IgdGhlIHRvdGxlbiBpZiBzbWFsbGVyKSBiZWNhdXNlIHdlCisJICAgZG9uJ3Qgd2FudCB0byBmb3JjZSB3YXN0YWdlIG9mIHRoZSBlbmQgb2YgYSBibG9jayBpZiBzcGxpdHRpbmcgd291bGQKKwkgICB3b3JrLiAqLworCXJldCA9IGpmZnMyX3Jlc2VydmVfc3BhY2VfZ2MoYywgbWluX3QodWludDMyX3QsIHNpemVvZihzdHJ1Y3QgamZmczJfcmF3X2lub2RlKSArIEpGRlMyX01JTl9EQVRBX0xFTiwgCisJCQkJCSAgICAgIHJhd2xlbiksICZwaHlzX29mcywgJmFsbG9jbGVuKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKGFsbG9jbGVuIDwgcmF3bGVuKSB7CisJCS8qIERvZXNuJ3QgZml0IHVudG91Y2hlZC4gV2UnbGwgZ28gdGhlIG9sZCByb3V0ZSBhbmQgc3BsaXQgaXQgKi8KKwkJcmV0dXJuIC1FQkFERkQ7CisJfQorCisJbm9kZSA9IGttYWxsb2MocmF3bGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5vZGUpCisgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKworCXJldCA9IGpmZnMyX2ZsYXNoX3JlYWQoYywgcmVmX29mZnNldChyYXcpLCByYXdsZW4sICZyZXRsZW4sIChjaGFyICopbm9kZSk7CisJaWYgKCFyZXQgJiYgcmV0bGVuICE9IHJhd2xlbikKKwkJcmV0ID0gLUVJTzsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9ub2RlOworCisJY3JjID0gY3JjMzIoMCwgbm9kZSwgc2l6ZW9mKHN0cnVjdCBqZmZzMl91bmtub3duX25vZGUpLTQpOworCWlmIChqZTMyX3RvX2NwdShub2RlLT51Lmhkcl9jcmMpICE9IGNyYykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJIZWFkZXIgQ1JDIGZhaWxlZCBvbiBSRUZfUFJJU1RJTkUgbm9kZSBhdCAweCUwOHg6IFJlYWQgMHglMDh4LCBjYWxjdWxhdGVkIDB4JTA4eFxuIiwKKwkJICAgICAgIHJlZl9vZmZzZXQocmF3KSwgamUzMl90b19jcHUobm9kZS0+dS5oZHJfY3JjKSwgY3JjKTsKKwkJZ290byBiYWlsOworCX0KKworCXN3aXRjaChqZTE2X3RvX2NwdShub2RlLT51Lm5vZGV0eXBlKSkgeworCWNhc2UgSkZGUzJfTk9ERVRZUEVfSU5PREU6CisJCWNyYyA9IGNyYzMyKDAsIG5vZGUsIHNpemVvZihub2RlLT5pKS04KTsKKwkJaWYgKGplMzJfdG9fY3B1KG5vZGUtPmkubm9kZV9jcmMpICE9IGNyYykgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTm9kZSBDUkMgZmFpbGVkIG9uIFJFRl9QUklTVElORSBkYXRhIG5vZGUgYXQgMHglMDh4OiBSZWFkIDB4JTA4eCwgY2FsY3VsYXRlZCAweCUwOHhcbiIsCisJCQkgICAgICAgcmVmX29mZnNldChyYXcpLCBqZTMyX3RvX2NwdShub2RlLT5pLm5vZGVfY3JjKSwgY3JjKTsKKwkJCWdvdG8gYmFpbDsKKwkJfQorCisJCWlmIChqZTMyX3RvX2NwdShub2RlLT5pLmRzaXplKSkgeworCQkJY3JjID0gY3JjMzIoMCwgbm9kZS0+aS5kYXRhLCBqZTMyX3RvX2NwdShub2RlLT5pLmNzaXplKSk7CisJCQlpZiAoamUzMl90b19jcHUobm9kZS0+aS5kYXRhX2NyYykgIT0gY3JjKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRGF0YSBDUkMgZmFpbGVkIG9uIFJFRl9QUklTVElORSBkYXRhIG5vZGUgYXQgMHglMDh4OiBSZWFkIDB4JTA4eCwgY2FsY3VsYXRlZCAweCUwOHhcbiIsCisJCQkJICAgICAgIHJlZl9vZmZzZXQocmF3KSwgamUzMl90b19jcHUobm9kZS0+aS5kYXRhX2NyYyksIGNyYyk7CisJCQkJZ290byBiYWlsOworCQkJfQorCQl9CisJCWJyZWFrOworCisJY2FzZSBKRkZTMl9OT0RFVFlQRV9ESVJFTlQ6CisJCWNyYyA9IGNyYzMyKDAsIG5vZGUsIHNpemVvZihub2RlLT5kKS04KTsKKwkJaWYgKGplMzJfdG9fY3B1KG5vZGUtPmQubm9kZV9jcmMpICE9IGNyYykgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTm9kZSBDUkMgZmFpbGVkIG9uIFJFRl9QUklTVElORSBkaXJlbnQgbm9kZSBhdCAweCUwOHg6IFJlYWQgMHglMDh4LCBjYWxjdWxhdGVkIDB4JTA4eFxuIiwKKwkJCSAgICAgICByZWZfb2Zmc2V0KHJhdyksIGplMzJfdG9fY3B1KG5vZGUtPmQubm9kZV9jcmMpLCBjcmMpOworCQkJZ290byBiYWlsOworCQl9CisKKwkJaWYgKG5vZGUtPmQubnNpemUpIHsKKwkJCWNyYyA9IGNyYzMyKDAsIG5vZGUtPmQubmFtZSwgbm9kZS0+ZC5uc2l6ZSk7CisJCQlpZiAoamUzMl90b19jcHUobm9kZS0+ZC5uYW1lX2NyYykgIT0gY3JjKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTmFtZSBDUkMgZmFpbGVkIG9uIFJFRl9QUklTVElORSBkaXJlbnQgb2RlIGF0IDB4JTA4eDogUmVhZCAweCUwOHgsIGNhbGN1bGF0ZWQgMHglMDh4XG4iLAorCQkJCSAgICAgICByZWZfb2Zmc2V0KHJhdyksIGplMzJfdG9fY3B1KG5vZGUtPmQubmFtZV9jcmMpLCBjcmMpOworCQkJCWdvdG8gYmFpbDsKKwkJCX0KKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9XQVJOSU5HICJVbmtub3duIG5vZGUgdHlwZSBmb3IgUkVGX1BSSVNUSU5FIG5vZGUgYXQgMHglMDh4OiAweCUwNHhcbiIsIAorCQkgICAgICAgcmVmX29mZnNldChyYXcpLCBqZTE2X3RvX2NwdShub2RlLT51Lm5vZGV0eXBlKSk7CisJCWdvdG8gYmFpbDsKKwl9CisKKwlucmF3ID0gamZmczJfYWxsb2NfcmF3X25vZGVfcmVmKCk7CisJaWYgKCFucmF3KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X25vZGU7CisJfQorCisJLyogT0ssIGFsbCB0aGUgQ1JDcyBhcmUgZ29vZDsgdGhpcyBub2RlIGNhbiBqdXN0IGJlIGNvcGllZCBhcy1pcy4gKi8KKyByZXRyeToKKwlucmF3LT5mbGFzaF9vZmZzZXQgPSBwaHlzX29mczsKKwlucmF3LT5fX3RvdGxlbiA9IHJhd2xlbjsKKwlucmF3LT5uZXh0X3BoeXMgPSBOVUxMOworCisJcmV0ID0gamZmczJfZmxhc2hfd3JpdGUoYywgcGh5c19vZnMsIHJhd2xlbiwgJnJldGxlbiwgKGNoYXIgKilub2RlKTsKKworCWlmIChyZXQgfHwgKHJldGxlbiAhPSByYXdsZW4pKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiV3JpdGUgb2YgJWQgYnl0ZXMgYXQgMHglMDh4IGZhaWxlZC4gcmV0dXJuZWQgJWQsIHJldGxlbiAlemRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHJhd2xlbiwgcGh5c19vZnMsIHJldCwgcmV0bGVuKTsKKwkJaWYgKHJldGxlbikgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogRG9lc24ndCBiZWxvbmcgdG8gYW55IGlub2RlICovCisJCQlucmF3LT5uZXh0X2luX2lubyA9IE5VTEw7CisKKwkJCW5yYXctPmZsYXNoX29mZnNldCB8PSBSRUZfT0JTT0xFVEU7CisJCQlqZmZzMl9hZGRfcGh5c2ljYWxfbm9kZV9yZWYoYywgbnJhdyk7CisJCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgbnJhdyk7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIk5vdCBtYXJraW5nIHRoZSBzcGFjZSBhdCAweCUwOHggYXMgZGlydHkgYmVjYXVzZSB0aGUgZmxhc2ggZHJpdmVyIHJldHVybmVkIHJldGxlbiB6ZXJvXG4iLCBucmF3LT5mbGFzaF9vZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgamZmczJfZnJlZV9yYXdfbm9kZV9yZWYobnJhdyk7CisJCX0KKwkJaWYgKCFyZXRyaWVkICYmIChucmF3ID0gamZmczJfYWxsb2NfcmF3X25vZGVfcmVmKCkpKSB7CisJCQkvKiBUcnkgdG8gcmVhbGxvY2F0ZSBzcGFjZSBhbmQgcmV0cnkgKi8KKwkJCXVpbnQzMl90IGR1bW15OworCQkJc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiA9ICZjLT5ibG9ja3NbcGh5c19vZnMgLyBjLT5zZWN0b3Jfc2l6ZV07CisKKwkJCXJldHJpZWQgPSAxOworCisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiUmV0cnlpbmcgZmFpbGVkIHdyaXRlIG9mIFJFRl9QUklTVElORSBub2RlLlxuIikpOworCQkJCisJCQlBQ0NUX1NBTklUWV9DSEVDSyhjLGplYik7CisJCQlEMShBQ0NUX1BBUkFOT0lBX0NIRUNLKGplYikpOworCisJCQlyZXQgPSBqZmZzMl9yZXNlcnZlX3NwYWNlX2djKGMsIHJhd2xlbiwgJnBoeXNfb2ZzLCAmZHVtbXkpOworCisJCQlpZiAoIXJldCkgeworCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJBbGxvY2F0ZWQgc3BhY2UgYXQgMHglMDh4IHRvIHJldHJ5IGZhaWxlZCB3cml0ZS5cbiIsIHBoeXNfb2ZzKSk7CisKKwkJCQlBQ0NUX1NBTklUWV9DSEVDSyhjLGplYik7CisJCQkJRDEoQUNDVF9QQVJBTk9JQV9DSEVDSyhqZWIpKTsKKworCQkJCWdvdG8gcmV0cnk7CisJCQl9CisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRmFpbGVkIHRvIGFsbG9jYXRlIHNwYWNlIHRvIHJldHJ5IGZhaWxlZCB3cml0ZTogJWQhXG4iLCByZXQpKTsKKwkJCWpmZnMyX2ZyZWVfcmF3X25vZGVfcmVmKG5yYXcpOworCQl9CisKKwkJamZmczJfZnJlZV9yYXdfbm9kZV9yZWYobnJhdyk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXRfbm9kZTsKKwl9CisJbnJhdy0+Zmxhc2hfb2Zmc2V0IHw9IFJFRl9QUklTVElORTsKKwlqZmZzMl9hZGRfcGh5c2ljYWxfbm9kZV9yZWYoYywgbnJhdyk7CisKKwkvKiBMaW5rIGludG8gcGVyLWlub2RlIGxpc3QuIFRoaXMgaXMgc2FmZSBiZWNhdXNlIG9mIHRoZSBpYworCSAgIHN0YXRlIGJlaW5nIElOT19TVEFURV9HQy4gTm90ZSB0aGF0IGlmIHdlJ3JlIGRvaW5nIHRoaXMKKwkgICBmb3IgYW4gaW5vZGUgd2hpY2ggaXMgaW4tY29yZSwgdGhlICducmF3JyBwb2ludGVyIGlzIHRoZW4KKwkgICBnb2luZyB0byBiZSBmZXRjaGVkIGZyb20gaWMtPm5vZGVzIGJ5IG91ciBjYWxsZXIuICovCisJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworICAgICAgICBucmF3LT5uZXh0X2luX2lubyA9IGljLT5ub2RlczsKKyAgICAgICAgaWMtPm5vZGVzID0gbnJhdzsKKwlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKworCWpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZShjLCByYXcpOworCUQxKHByaW50ayhLRVJOX0RFQlVHICJXSEVFRSEgR0MgUkVGX1BSSVNUSU5FIG5vZGUgYXQgMHglMDh4IHN1Y2NlZWRlZFxuIiwgcmVmX29mZnNldChyYXcpKSk7CisKKyBvdXRfbm9kZToKKwlrZnJlZShub2RlKTsKKwlyZXR1cm4gcmV0OworIGJhaWw6CisJcmV0ID0gLUVCQURGRDsKKwlnb3RvIG91dF9ub2RlOworfQorCitzdGF0aWMgaW50IGpmZnMyX2dhcmJhZ2VfY29sbGVjdF9tZXRhZGF0YShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiwgCisJCQkJCXN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLCBzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZSAqZm4pCit7CisJc3RydWN0IGpmZnMyX2Z1bGxfZG5vZGUgKm5ld19mbjsKKwlzdHJ1Y3QgamZmczJfcmF3X2lub2RlIHJpOworCWppbnQxNl90IGRldjsKKwljaGFyICptZGF0YSA9IE5VTEwsIG1kYXRhbGVuID0gMDsKKwl1aW50MzJfdCBhbGxvY2xlbiwgcGh5c19vZnM7CisJaW50IHJldDsKKworCWlmIChTX0lTQkxLKEpGRlMyX0ZfSV9NT0RFKGYpKSB8fAorCSAgICBTX0lTQ0hSKEpGRlMyX0ZfSV9NT0RFKGYpKSApIHsKKwkJLyogRm9yIHRoZXNlLCB3ZSBkb24ndCBhY3R1YWxseSBuZWVkIHRvIHJlYWQgdGhlIG9sZCBub2RlICovCisJCS8qIEZJWE1FOiBmb3IgbWlub3Igb3IgbWFqb3IgPiAyNTUuICovCisJCWRldiA9IGNwdV90b19qZTE2KCgoSkZGUzJfRl9JX1JERVZfTUFKKGYpIDw8IDgpIHwgCisJCQlKRkZTMl9GX0lfUkRFVl9NSU4oZikpKTsKKwkJbWRhdGEgPSAoY2hhciAqKSZkZXY7CisJCW1kYXRhbGVuID0gc2l6ZW9mKGRldik7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9nYXJiYWdlX2NvbGxlY3RfbWV0YWRhdGEoKTogV3JpdGluZyAlZCBieXRlcyBvZiBrZGV2X3RcbiIsIG1kYXRhbGVuKSk7CisJfSBlbHNlIGlmIChTX0lTTE5LKEpGRlMyX0ZfSV9NT0RFKGYpKSkgeworCQltZGF0YWxlbiA9IGZuLT5zaXplOworCQltZGF0YSA9IGttYWxsb2MoZm4tPnNpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIW1kYXRhKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJrbWFsbG9jIG9mIG1kYXRhIGZhaWxlZCBpbiBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfbWV0YWRhdGEoKVxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlyZXQgPSBqZmZzMl9yZWFkX2Rub2RlKGMsIGYsIGZuLCBtZGF0YSwgMCwgbWRhdGFsZW4pOworCQlpZiAocmV0KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJyZWFkIG9mIG9sZCBtZXRhZGF0YSBmYWlsZWQgaW4gamZmczJfZ2FyYmFnZV9jb2xsZWN0X21ldGFkYXRhKCk6ICVkXG4iLCByZXQpOworCQkJa2ZyZWUobWRhdGEpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZ2FyYmFnZV9jb2xsZWN0X21ldGFkYXRhKCk6IFdyaXRpbmcgJWQgYml0ZXMgb2Ygc3ltbGluayB0YXJnZXRcbiIsIG1kYXRhbGVuKSk7CisKKwl9CisJCisJcmV0ID0gamZmczJfcmVzZXJ2ZV9zcGFjZV9nYyhjLCBzaXplb2YocmkpICsgbWRhdGFsZW4sICZwaHlzX29mcywgJmFsbG9jbGVuKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImpmZnMyX3Jlc2VydmVfc3BhY2VfZ2Mgb2YgJXpkIGJ5dGVzIGZvciBnYXJiYWdlX2NvbGxlY3RfbWV0YWRhdGEgZmFpbGVkOiAlZFxuIiwKKwkJICAgICAgIHNpemVvZihyaSkrIG1kYXRhbGVuLCByZXQpOworCQlnb3RvIG91dDsKKwl9CisJCisJbWVtc2V0KCZyaSwgMCwgc2l6ZW9mKHJpKSk7CisJcmkubWFnaWMgPSBjcHVfdG9famUxNihKRkZTMl9NQUdJQ19CSVRNQVNLKTsKKwlyaS5ub2RldHlwZSA9IGNwdV90b19qZTE2KEpGRlMyX05PREVUWVBFX0lOT0RFKTsKKwlyaS50b3RsZW4gPSBjcHVfdG9famUzMihzaXplb2YocmkpICsgbWRhdGFsZW4pOworCXJpLmhkcl9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCAmcmksIHNpemVvZihzdHJ1Y3QgamZmczJfdW5rbm93bl9ub2RlKS00KSk7CisKKwlyaS5pbm8gPSBjcHVfdG9famUzMihmLT5pbm9jYWNoZS0+aW5vKTsKKwlyaS52ZXJzaW9uID0gY3B1X3RvX2plMzIoKytmLT5oaWdoZXN0X3ZlcnNpb24pOworCXJpLm1vZGUgPSBjcHVfdG9famVtb2RlKEpGRlMyX0ZfSV9NT0RFKGYpKTsKKwlyaS51aWQgPSBjcHVfdG9famUxNihKRkZTMl9GX0lfVUlEKGYpKTsKKwlyaS5naWQgPSBjcHVfdG9famUxNihKRkZTMl9GX0lfR0lEKGYpKTsKKwlyaS5pc2l6ZSA9IGNwdV90b19qZTMyKEpGRlMyX0ZfSV9TSVpFKGYpKTsKKwlyaS5hdGltZSA9IGNwdV90b19qZTMyKEpGRlMyX0ZfSV9BVElNRShmKSk7CisJcmkuY3RpbWUgPSBjcHVfdG9famUzMihKRkZTMl9GX0lfQ1RJTUUoZikpOworCXJpLm10aW1lID0gY3B1X3RvX2plMzIoSkZGUzJfRl9JX01USU1FKGYpKTsKKwlyaS5vZmZzZXQgPSBjcHVfdG9famUzMigwKTsKKwlyaS5jc2l6ZSA9IGNwdV90b19qZTMyKG1kYXRhbGVuKTsKKwlyaS5kc2l6ZSA9IGNwdV90b19qZTMyKG1kYXRhbGVuKTsKKwlyaS5jb21wciA9IEpGRlMyX0NPTVBSX05PTkU7CisJcmkubm9kZV9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCAmcmksIHNpemVvZihyaSktOCkpOworCXJpLmRhdGFfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgbWRhdGEsIG1kYXRhbGVuKSk7CisKKwluZXdfZm4gPSBqZmZzMl93cml0ZV9kbm9kZShjLCBmLCAmcmksIG1kYXRhLCBtZGF0YWxlbiwgcGh5c19vZnMsIEFMTE9DX0dDKTsKKworCWlmIChJU19FUlIobmV3X2ZuKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJFcnJvciB3cml0aW5nIG5ldyBkbm9kZTogJWxkXG4iLCBQVFJfRVJSKG5ld19mbikpOworCQlyZXQgPSBQVFJfRVJSKG5ld19mbik7CisJCWdvdG8gb3V0OworCX0KKwlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgZm4tPnJhdyk7CisJamZmczJfZnJlZV9mdWxsX2Rub2RlKGZuKTsKKwlmLT5tZXRhZGF0YSA9IG5ld19mbjsKKyBvdXQ6CisJaWYgKFNfSVNMTksoSkZGUzJfRl9JX01PREUoZikpKQorCQlrZnJlZShtZGF0YSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfZGlyZW50KHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViLCAKKwkJCQkJc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsIHN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqZmQpCit7CisJc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICpuZXdfZmQ7CisJc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQgcmQ7CisJdWludDMyX3QgYWxsb2NsZW4sIHBoeXNfb2ZzOworCWludCByZXQ7CisKKwlyZC5tYWdpYyA9IGNwdV90b19qZTE2KEpGRlMyX01BR0lDX0JJVE1BU0spOworCXJkLm5vZGV0eXBlID0gY3B1X3RvX2plMTYoSkZGUzJfTk9ERVRZUEVfRElSRU5UKTsKKwlyZC5uc2l6ZSA9IHN0cmxlbihmZC0+bmFtZSk7CisJcmQudG90bGVuID0gY3B1X3RvX2plMzIoc2l6ZW9mKHJkKSArIHJkLm5zaXplKTsKKwlyZC5oZHJfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgJnJkLCBzaXplb2Yoc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSktNCkpOworCisJcmQucGlubyA9IGNwdV90b19qZTMyKGYtPmlub2NhY2hlLT5pbm8pOworCXJkLnZlcnNpb24gPSBjcHVfdG9famUzMigrK2YtPmhpZ2hlc3RfdmVyc2lvbik7CisJcmQuaW5vID0gY3B1X3RvX2plMzIoZmQtPmlubyk7CisJcmQubWN0aW1lID0gY3B1X3RvX2plMzIobWF4KEpGRlMyX0ZfSV9NVElNRShmKSwgSkZGUzJfRl9JX0NUSU1FKGYpKSk7CisJcmQudHlwZSA9IGZkLT50eXBlOworCXJkLm5vZGVfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgJnJkLCBzaXplb2YocmQpLTgpKTsKKwlyZC5uYW1lX2NyYyA9IGNwdV90b19qZTMyKGNyYzMyKDAsIGZkLT5uYW1lLCByZC5uc2l6ZSkpOworCQorCXJldCA9IGpmZnMyX3Jlc2VydmVfc3BhY2VfZ2MoYywgc2l6ZW9mKHJkKStyZC5uc2l6ZSwgJnBoeXNfb2ZzLCAmYWxsb2NsZW4pOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiamZmczJfcmVzZXJ2ZV9zcGFjZV9nYyBvZiAlemQgYnl0ZXMgZm9yIGdhcmJhZ2VfY29sbGVjdF9kaXJlbnQgZmFpbGVkOiAlZFxuIiwKKwkJICAgICAgIHNpemVvZihyZCkrcmQubnNpemUsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCW5ld19mZCA9IGpmZnMyX3dyaXRlX2RpcmVudChjLCBmLCAmcmQsIGZkLT5uYW1lLCByZC5uc2l6ZSwgcGh5c19vZnMsIEFMTE9DX0dDKTsKKworCWlmIChJU19FUlIobmV3X2ZkKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJqZmZzMl93cml0ZV9kaXJlbnQgaW4gZ2FyYmFnZV9jb2xsZWN0X2RpcmVudCBmYWlsZWQ6ICVsZFxuIiwgUFRSX0VSUihuZXdfZmQpKTsKKwkJcmV0dXJuIFBUUl9FUlIobmV3X2ZkKTsKKwl9CisJamZmczJfYWRkX2ZkX3RvX2xpc3QoYywgbmV3X2ZkLCAmZi0+ZGVudHMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGpmZnMyX2dhcmJhZ2VfY29sbGVjdF9kZWxldGlvbl9kaXJlbnQoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWIsIAorCQkJCQlzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiwgc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICpmZCkKK3sKKwlzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKipmZHAgPSAmZi0+ZGVudHM7CisJaW50IGZvdW5kID0gMDsKKworCS8qIE9uIGEgbWVkaXVtIHdoZXJlIHdlIGNhbid0IGFjdHVhbGx5IG1hcmsgbm9kZXMgb2Jzb2xldGUKKwkgICBwZXJuYW1lbnRseSwgc3VjaCBhcyBOQU5EIGZsYXNoLCB3ZSBuZWVkIHRvIHdvcmsgb3V0CisJICAgd2hldGhlciB0aGlzIGRlbGV0aW9uIGRpcmVudCBpcyBzdGlsbCBuZWVkZWQgdG8gYWN0aXZlbHkKKwkgICBkZWxldGUgYSAncmVhbCcgZGlyZW50IHdpdGggdGhlIHNhbWUgbmFtZSB0aGF0J3Mgc3RpbGwKKwkgICBzb21ld2hlcmUgZWxzZSBvbiB0aGUgZmxhc2guICovCisJaWYgKCFqZmZzMl9jYW5fbWFya19vYnNvbGV0ZShjKSkgeworCQlzdHJ1Y3QgamZmczJfcmF3X2RpcmVudCAqcmQ7CisJCXN0cnVjdCBqZmZzMl9yYXdfbm9kZV9yZWYgKnJhdzsKKwkJaW50IHJldDsKKwkJc2l6ZV90IHJldGxlbjsKKwkJaW50IG5hbWVfbGVuID0gc3RybGVuKGZkLT5uYW1lKTsKKwkJdWludDMyX3QgbmFtZV9jcmMgPSBjcmMzMigwLCBmZC0+bmFtZSwgbmFtZV9sZW4pOworCQl1aW50MzJfdCByYXdsZW4gPSByZWZfdG90bGVuKGMsIGplYiwgZmQtPnJhdyk7CisKKwkJcmQgPSBrbWFsbG9jKHJhd2xlbiwgR0ZQX0tFUk5FTCk7CisJCWlmICghcmQpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQkvKiBQcmV2ZW50IHRoZSBlcmFzZSBjb2RlIGZyb20gbmlja2luZyB0aGUgb2Jzb2xldGUgbm9kZSByZWZzIHdoaWxlCisJCSAgIHdlJ3JlIGxvb2tpbmcgYXQgdGhlbS4gSSByZWFsbHkgZG9uJ3QgbGlrZSB0aGlzIGV4dHJhIGxvY2sgYnV0CisJCSAgIGNhbid0IHNlZSBhbnkgYWx0ZXJuYXRpdmUuIFN1Z2dlc3Rpb25zIG9uIGEgcG9zdGNhcmQgdG8uLi4gKi8KKwkJZG93bigmYy0+ZXJhc2VfZnJlZV9zZW0pOworCisJCWZvciAocmF3ID0gZi0+aW5vY2FjaGUtPm5vZGVzOyByYXcgIT0gKHZvaWQgKilmLT5pbm9jYWNoZTsgcmF3ID0gcmF3LT5uZXh0X2luX2lubykgeworCisJCQkvKiBXZSBvbmx5IGNhcmUgYWJvdXQgb2Jzb2xldGUgb25lcyAqLworCQkJaWYgKCEocmVmX29ic29sZXRlKHJhdykpKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBBbnkgZGlyZW50IHdpdGggdGhlIHNhbWUgbmFtZSBpcyBnb2luZyB0byBoYXZlIHRoZSBzYW1lIGxlbmd0aC4uLiAqLworCQkJaWYgKHJlZl90b3RsZW4oYywgTlVMTCwgcmF3KSAhPSByYXdsZW4pCisJCQkJY29udGludWU7CisKKwkJCS8qIERvZXNuJ3QgbWF0dGVyIGlmIHRoZXJlJ3Mgb25lIGluIHRoZSBzYW1lIGVyYXNlIGJsb2NrLiBXZSdyZSBnb2luZyB0byAKKwkJCSAgIGRlbGV0ZSBpdCB0b28gYXQgdGhlIHNhbWUgdGltZS4gKi8KKwkJCWlmICgocmF3LT5mbGFzaF9vZmZzZXQgJiB+KGMtPnNlY3Rvcl9zaXplLTEpKSA9PQorCQkJICAgIChmZC0+cmF3LT5mbGFzaF9vZmZzZXQgJiB+KGMtPnNlY3Rvcl9zaXplLTEpKSkKKwkJCQljb250aW51ZTsKKworCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkNoZWNrIHBvdGVudGlhbCBkZWxldGlvbiBkaXJlbnQgYXQgJTA4eFxuIiwgcmVmX29mZnNldChyYXcpKSk7CisKKwkJCS8qIFRoaXMgaXMgYW4gb2Jzb2xldGUgbm9kZSBiZWxvbmdpbmcgdG8gdGhlIHNhbWUgZGlyZWN0b3J5LCBhbmQgaXQncyBvZiB0aGUgcmlnaHQKKwkJCSAgIGxlbmd0aC4gV2UgbmVlZCB0byB0YWtlIGEgY2xvc2VyIGxvb2suLi4qLworCQkJcmV0ID0gamZmczJfZmxhc2hfcmVhZChjLCByZWZfb2Zmc2V0KHJhdyksIHJhd2xlbiwgJnJldGxlbiwgKGNoYXIgKilyZCk7CisJCQlpZiAocmV0KSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiamZmczJfZ19jX2RlbGV0aW9uX2RpcmVudCgpOiBSZWFkIGVycm9yICglZCkgcmVhZGluZyBvYnNvbGV0ZSBub2RlIGF0ICUwOHhcbiIsIHJldCwgcmVmX29mZnNldChyYXcpKTsKKwkJCQkvKiBJZiB3ZSBjYW4ndCByZWFkIGl0LCB3ZSBkb24ndCBuZWVkIHRvIGNvbnRpbnVlIHRvIG9ic29sZXRlIGl0LiBDb250aW51ZSAqLworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKHJldGxlbiAhPSByYXdsZW4pIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJqZmZzMl9nX2NfZGVsZXRpb25fZGlyZW50KCk6IFNob3J0IHJlYWQgKCV6ZCBub3QgJXUpIHJlYWRpbmcgaGVhZGVyIGZyb20gb2Jzb2xldGUgbm9kZSBhdCAlMDh4XG4iLAorCQkJCSAgICAgICByZXRsZW4sIHJhd2xlbiwgcmVmX29mZnNldChyYXcpKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKGplMTZfdG9fY3B1KHJkLT5ub2RldHlwZSkgIT0gSkZGUzJfTk9ERVRZUEVfRElSRU5UKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBJZiB0aGUgbmFtZSBDUkMgZG9lc24ndCBtYXRjaCwgc2tpcCAqLworCQkJaWYgKGplMzJfdG9fY3B1KHJkLT5uYW1lX2NyYykgIT0gbmFtZV9jcmMpCisJCQkJY29udGludWU7CisKKwkJCS8qIElmIHRoZSBuYW1lIGxlbmd0aCBkb2Vzbid0IG1hdGNoLCBvciBpdCdzIGFub3RoZXIgZGVsZXRpb24gZGlyZW50LCBza2lwICovCisJCQlpZiAocmQtPm5zaXplICE9IG5hbWVfbGVuIHx8ICFqZTMyX3RvX2NwdShyZC0+aW5vKSkKKwkJCQljb250aW51ZTsKKworCQkJLyogT0ssIGNoZWNrIHRoZSBhY3R1YWwgbmFtZSBub3cgKi8KKwkJCWlmIChtZW1jbXAocmQtPm5hbWUsIGZkLT5uYW1lLCBuYW1lX2xlbikpCisJCQkJY29udGludWU7CisKKwkJCS8qIE9LLiBUaGUgbmFtZSByZWFsbHkgZG9lcyBtYXRjaC4gVGhlcmUgcmVhbGx5IGlzIHN0aWxsIGFuIG9sZGVyIG5vZGUgb24KKwkJCSAgIHRoZSBmbGFzaCB3aGljaCBvdXIgZGVsZXRpb24gZGlyZW50IG9ic29sZXRlcy4gU28gd2UgaGF2ZSB0byB3cml0ZSBvdXQKKwkJCSAgIGEgbmV3IGRlbGV0aW9uIGRpcmVudCB0byByZXBsYWNlIGl0ICovCisJCQl1cCgmYy0+ZXJhc2VfZnJlZV9zZW0pOworCisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRGVsZXRpb24gZGlyZW50IGF0ICUwOHggc3RpbGwgb2Jzb2xldGVzIHJlYWwgZGlyZW50IFwiJXNcIiBhdCAlMDh4IGZvciBpbm8gIyV1XG4iLAorCQkJCSAgcmVmX29mZnNldChmZC0+cmF3KSwgZmQtPm5hbWUsIHJlZl9vZmZzZXQocmF3KSwgamUzMl90b19jcHUocmQtPmlubykpKTsKKwkJCWtmcmVlKHJkKTsKKworCQkJcmV0dXJuIGpmZnMyX2dhcmJhZ2VfY29sbGVjdF9kaXJlbnQoYywgamViLCBmLCBmZCk7CisJCX0KKworCQl1cCgmYy0+ZXJhc2VfZnJlZV9zZW0pOworCQlrZnJlZShyZCk7CisJfQorCisJLyogTm8gbmVlZCBmb3IgaXQgYW55IG1vcmUuIEp1c3QgbWFyayBpdCBvYnNvbGV0ZSBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGxpc3QgKi8KKwl3aGlsZSAoKmZkcCkgeworCQlpZiAoKCpmZHApID09IGZkKSB7CisJCQlmb3VuZCA9IDE7CisJCQkqZmRwID0gZmQtPm5leHQ7CisJCQlicmVhazsKKwkJfQorCQlmZHAgPSAmKCpmZHApLT5uZXh0OworCX0KKwlpZiAoIWZvdW5kKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkRlbGV0aW9uIGRpcmVudCBcIiVzXCIgbm90IGZvdW5kIGluIGxpc3QgZm9yIGlubyAjJXVcbiIsIGZkLT5uYW1lLCBmLT5pbm9jYWNoZS0+aW5vKTsKKwl9CisJamZmczJfbWFya19ub2RlX29ic29sZXRlKGMsIGZkLT5yYXcpOworCWpmZnMyX2ZyZWVfZnVsbF9kaXJlbnQoZmQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGpmZnMyX2dhcmJhZ2VfY29sbGVjdF9ob2xlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViLAorCQkJCSAgICAgIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLCBzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZSAqZm4sCisJCQkJICAgICAgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGVuZCkKK3sKKwlzdHJ1Y3QgamZmczJfcmF3X2lub2RlIHJpOworCXN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKmZyYWc7CisJc3RydWN0IGpmZnMyX2Z1bGxfZG5vZGUgKm5ld19mbjsKKwl1aW50MzJfdCBhbGxvY2xlbiwgcGh5c19vZnM7CisJaW50IHJldDsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJXcml0aW5nIHJlcGxhY2VtZW50IGhvbGUgbm9kZSBmb3IgaW5vICMldSBmcm9tIG9mZnNldCAweCV4IHRvIDB4JXhcbiIsCisJCSAgZi0+aW5vY2FjaGUtPmlubywgc3RhcnQsIGVuZCkpOworCQorCW1lbXNldCgmcmksIDAsIHNpemVvZihyaSkpOworCisJaWYoZm4tPmZyYWdzID4gMSkgeworCQlzaXplX3QgcmVhZGxlbjsKKwkJdWludDMyX3QgY3JjOworCQkvKiBJdCdzIHBhcnRpYWxseSBvYnNvbGV0ZWQgYnkgYSBsYXRlciB3cml0ZS4gU28gd2UgaGF2ZSB0byAKKwkJICAgd3JpdGUgaXQgb3V0IGFnYWluIHdpdGggdGhlIF9zYW1lXyB2ZXJzaW9uIGFzIGJlZm9yZSAqLworCQlyZXQgPSBqZmZzMl9mbGFzaF9yZWFkKGMsIHJlZl9vZmZzZXQoZm4tPnJhdyksIHNpemVvZihyaSksICZyZWFkbGVuLCAoY2hhciAqKSZyaSk7CisJCWlmIChyZWFkbGVuICE9IHNpemVvZihyaSkgfHwgcmV0KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJOb2RlIHJlYWQgZmFpbGVkIGluIGpmZnMyX2dhcmJhZ2VfY29sbGVjdF9ob2xlLiBSZXQgJWQsIHJldGxlbiAlemQuIERhdGEgd2lsbCBiZSBsb3N0IGJ5IHdyaXRpbmcgbmV3IGhvbGUgbm9kZVxuIiwgcmV0LCByZWFkbGVuKTsKKwkJCWdvdG8gZmlsbDsKKwkJfQorCQlpZiAoamUxNl90b19jcHUocmkubm9kZXR5cGUpICE9IEpGRlMyX05PREVUWVBFX0lOT0RFKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJqZmZzMl9nYXJiYWdlX2NvbGxlY3RfaG9sZTogTm9kZSBhdCAweCUwOHggaGFkIG5vZGUgdHlwZSAweCUwNHggaW5zdGVhZCBvZiBKRkZTMl9OT0RFVFlQRV9JTk9ERSgweCUwNHgpXG4iLAorCQkJICAgICAgIHJlZl9vZmZzZXQoZm4tPnJhdyksCisJCQkgICAgICAgamUxNl90b19jcHUocmkubm9kZXR5cGUpLCBKRkZTMl9OT0RFVFlQRV9JTk9ERSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlpZiAoamUzMl90b19jcHUocmkudG90bGVuKSAhPSBzaXplb2YocmkpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJqZmZzMl9nYXJiYWdlX2NvbGxlY3RfaG9sZTogTm9kZSBhdCAweCUwOHggaGFkIHRvdGxlbiAweCV4IGluc3RlYWQgb2YgZXhwZWN0ZWQgMHglenhcbiIsCisJCQkgICAgICAgcmVmX29mZnNldChmbi0+cmF3KSwKKwkJCSAgICAgICBqZTMyX3RvX2NwdShyaS50b3RsZW4pLCBzaXplb2YocmkpKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCWNyYyA9IGNyYzMyKDAsICZyaSwgc2l6ZW9mKHJpKS04KTsKKwkJaWYgKGNyYyAhPSBqZTMyX3RvX2NwdShyaS5ub2RlX2NyYykpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImpmZnMyX2dhcmJhZ2VfY29sbGVjdF9ob2xlOiBOb2RlIGF0IDB4JTA4eCBoYWQgQ1JDIDB4JTA4eCB3aGljaCBkb2Vzbid0IG1hdGNoIGNhbGN1bGF0ZWQgQ1JDIDB4JTA4eFxuIiwKKwkJCSAgICAgICByZWZfb2Zmc2V0KGZuLT5yYXcpLCAKKwkJCSAgICAgICBqZTMyX3RvX2NwdShyaS5ub2RlX2NyYyksIGNyYyk7CisJCQkvKiBGSVhNRTogV2UgY291bGQgcG9zc2libHkgZGVhbCB3aXRoIHRoaXMgYnkgd3JpdGluZyBuZXcgaG9sZXMgZm9yIGVhY2ggZnJhZyAqLworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRGF0YSBpbiB0aGUgcmFuZ2UgMHglMDh4IHRvIDB4JTA4eCBvZiBpbm9kZSAjJXUgd2lsbCBiZSBsb3N0XG4iLCAKKwkJCSAgICAgICBzdGFydCwgZW5kLCBmLT5pbm9jYWNoZS0+aW5vKTsKKwkJCWdvdG8gZmlsbDsKKwkJfQorCQlpZiAocmkuY29tcHIgIT0gSkZGUzJfQ09NUFJfWkVSTykgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiamZmczJfZ2FyYmFnZV9jb2xsZWN0X2hvbGU6IE5vZGUgMHglMDh4IHdhc24ndCBhIGhvbGUgbm9kZSFcbiIsIHJlZl9vZmZzZXQoZm4tPnJhdykpOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRGF0YSBpbiB0aGUgcmFuZ2UgMHglMDh4IHRvIDB4JTA4eCBvZiBpbm9kZSAjJXUgd2lsbCBiZSBsb3N0XG4iLCAKKwkJCSAgICAgICBzdGFydCwgZW5kLCBmLT5pbm9jYWNoZS0+aW5vKTsKKwkJCWdvdG8gZmlsbDsKKwkJfQorCX0gZWxzZSB7CisJZmlsbDoKKwkJcmkubWFnaWMgPSBjcHVfdG9famUxNihKRkZTMl9NQUdJQ19CSVRNQVNLKTsKKwkJcmkubm9kZXR5cGUgPSBjcHVfdG9famUxNihKRkZTMl9OT0RFVFlQRV9JTk9ERSk7CisJCXJpLnRvdGxlbiA9IGNwdV90b19qZTMyKHNpemVvZihyaSkpOworCQlyaS5oZHJfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgJnJpLCBzaXplb2Yoc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSktNCkpOworCisJCXJpLmlubyA9IGNwdV90b19qZTMyKGYtPmlub2NhY2hlLT5pbm8pOworCQlyaS52ZXJzaW9uID0gY3B1X3RvX2plMzIoKytmLT5oaWdoZXN0X3ZlcnNpb24pOworCQlyaS5vZmZzZXQgPSBjcHVfdG9famUzMihzdGFydCk7CisJCXJpLmRzaXplID0gY3B1X3RvX2plMzIoZW5kIC0gc3RhcnQpOworCQlyaS5jc2l6ZSA9IGNwdV90b19qZTMyKDApOworCQlyaS5jb21wciA9IEpGRlMyX0NPTVBSX1pFUk87CisJfQorCXJpLm1vZGUgPSBjcHVfdG9famVtb2RlKEpGRlMyX0ZfSV9NT0RFKGYpKTsKKwlyaS51aWQgPSBjcHVfdG9famUxNihKRkZTMl9GX0lfVUlEKGYpKTsKKwlyaS5naWQgPSBjcHVfdG9famUxNihKRkZTMl9GX0lfR0lEKGYpKTsKKwlyaS5pc2l6ZSA9IGNwdV90b19qZTMyKEpGRlMyX0ZfSV9TSVpFKGYpKTsKKwlyaS5hdGltZSA9IGNwdV90b19qZTMyKEpGRlMyX0ZfSV9BVElNRShmKSk7CisJcmkuY3RpbWUgPSBjcHVfdG9famUzMihKRkZTMl9GX0lfQ1RJTUUoZikpOworCXJpLm10aW1lID0gY3B1X3RvX2plMzIoSkZGUzJfRl9JX01USU1FKGYpKTsKKwlyaS5kYXRhX2NyYyA9IGNwdV90b19qZTMyKDApOworCXJpLm5vZGVfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgJnJpLCBzaXplb2YocmkpLTgpKTsKKworCXJldCA9IGpmZnMyX3Jlc2VydmVfc3BhY2VfZ2MoYywgc2l6ZW9mKHJpKSwgJnBoeXNfb2ZzLCAmYWxsb2NsZW4pOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiamZmczJfcmVzZXJ2ZV9zcGFjZV9nYyBvZiAlemQgYnl0ZXMgZm9yIGdhcmJhZ2VfY29sbGVjdF9ob2xlIGZhaWxlZDogJWRcbiIsCisJCSAgICAgICBzaXplb2YocmkpLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwluZXdfZm4gPSBqZmZzMl93cml0ZV9kbm9kZShjLCBmLCAmcmksIE5VTEwsIDAsIHBoeXNfb2ZzLCBBTExPQ19HQyk7CisKKwlpZiAoSVNfRVJSKG5ld19mbikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRXJyb3Igd3JpdGluZyBuZXcgaG9sZSBub2RlOiAlbGRcbiIsIFBUUl9FUlIobmV3X2ZuKSk7CisJCXJldHVybiBQVFJfRVJSKG5ld19mbik7CisJfQorCWlmIChqZTMyX3RvX2NwdShyaS52ZXJzaW9uKSA9PSBmLT5oaWdoZXN0X3ZlcnNpb24pIHsKKwkJamZmczJfYWRkX2Z1bGxfZG5vZGVfdG9faW5vZGUoYywgZiwgbmV3X2ZuKTsKKwkJaWYgKGYtPm1ldGFkYXRhKSB7CisJCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgZi0+bWV0YWRhdGEtPnJhdyk7CisJCQlqZmZzMl9mcmVlX2Z1bGxfZG5vZGUoZi0+bWV0YWRhdGEpOworCQkJZi0+bWV0YWRhdGEgPSBOVUxMOworCQl9CisJCXJldHVybiAwOworCX0KKworCS8qIAorCSAqIFdlIHNob3VsZCBvbmx5IGdldCBoZXJlIGluIHRoZSBjYXNlIHdoZXJlIHRoZSBub2RlIHdlIGFyZQorCSAqIHJlcGxhY2luZyBoYWQgbW9yZSB0aGFuIG9uZSBmcmFnLCBzbyB3ZSBrZXB0IHRoZSBzYW1lIHZlcnNpb24KKwkgKiBudW1iZXIgYXMgYmVmb3JlLiAoRXhjZXB0IGluIGNhc2Ugb2YgZXJyb3IgLS0gc2VlICdnb3RvIGZpbGw7JyAKKwkgKiBhYm92ZS4pCisJICovCisJRDEoaWYodW5saWtlbHkoZm4tPmZyYWdzIDw9IDEpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImpmZnMyX2dhcmJhZ2VfY29sbGVjdF9ob2xlOiBSZXBsYWNpbmcgZm4gd2l0aCAlZCBmcmFnKHMpIGJ1dCBuZXcgdmVyICVkICE9IGhpZ2hlc3RfdmVyc2lvbiAlZCBvZiBpbm8gIyVkXG4iLAorCQkgICAgICAgZm4tPmZyYWdzLCBqZTMyX3RvX2NwdShyaS52ZXJzaW9uKSwgZi0+aGlnaGVzdF92ZXJzaW9uLAorCQkgICAgICAgamUzMl90b19jcHUocmkuaW5vKSk7CisJfSk7CisKKwkvKiBUaGlzIGlzIGEgcGFydGlhbGx5LW92ZXJsYXBwZWQgaG9sZSBub2RlLiBNYXJrIGl0IFJFRl9OT1JNQUwgbm90IFJFRl9QUklTVElORSAqLworCW1hcmtfcmVmX25vcm1hbChuZXdfZm4tPnJhdyk7CisKKwlmb3IgKGZyYWcgPSBqZmZzMl9sb29rdXBfbm9kZV9mcmFnKCZmLT5mcmFndHJlZSwgZm4tPm9mcyk7IAorCSAgICAgZnJhZzsgZnJhZyA9IGZyYWdfbmV4dChmcmFnKSkgeworCQlpZiAoZnJhZy0+b2ZzID4gZm4tPnNpemUgKyBmbi0+b2ZzKQorCQkJYnJlYWs7CisJCWlmIChmcmFnLT5ub2RlID09IGZuKSB7CisJCQlmcmFnLT5ub2RlID0gbmV3X2ZuOworCQkJbmV3X2ZuLT5mcmFncysrOworCQkJZm4tPmZyYWdzLS07CisJCX0KKwl9CisJaWYgKGZuLT5mcmFncykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJqZmZzMl9nYXJiYWdlX2NvbGxlY3RfaG9sZTogT2xkIG5vZGUgc3RpbGwgaGFzIGZyYWdzIVxuIik7CisJCUJVRygpOworCX0KKwlpZiAoIW5ld19mbi0+ZnJhZ3MpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiamZmczJfZ2FyYmFnZV9jb2xsZWN0X2hvbGU6IE5ldyBub2RlIGhhcyBubyBmcmFncyFcbiIpOworCQlCVUcoKTsKKwl9CisJCQorCWpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZShjLCBmbi0+cmF3KTsKKwlqZmZzMl9mcmVlX2Z1bGxfZG5vZGUoZm4pOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGpmZnMyX2dhcmJhZ2VfY29sbGVjdF9kbm9kZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiwKKwkJCQkgICAgICAgc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsIHN0cnVjdCBqZmZzMl9mdWxsX2Rub2RlICpmbiwKKwkJCQkgICAgICAgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGVuZCkKK3sKKwlzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZSAqbmV3X2ZuOworCXN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgcmk7CisJdWludDMyX3QgYWxsb2NsZW4sIHBoeXNfb2ZzLCBvZmZzZXQsIG9yaWdfZW5kLCBvcmlnX3N0YXJ0OwkKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBjaGFyICpjb21wcmJ1ZiA9IE5VTEwsICp3cml0ZWJ1ZjsKKwl1bnNpZ25lZCBsb25nIHBnOworCXVuc2lnbmVkIGNoYXIgKnBnX3B0cjsKKyAKKwltZW1zZXQoJnJpLCAwLCBzaXplb2YocmkpKTsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJXcml0aW5nIHJlcGxhY2VtZW50IGRub2RlIGZvciBpbm8gIyV1IGZyb20gb2Zmc2V0IDB4JXggdG8gMHgleFxuIiwKKwkJICBmLT5pbm9jYWNoZS0+aW5vLCBzdGFydCwgZW5kKSk7CisKKwlvcmlnX2VuZCA9IGVuZDsKKwlvcmlnX3N0YXJ0ID0gc3RhcnQ7CisKKwlpZiAoYy0+bnJfZnJlZV9ibG9ja3MgKyBjLT5ucl9lcmFzaW5nX2Jsb2NrcyA+IGMtPnJlc3ZfYmxvY2tzX2djbWVyZ2UpIHsKKwkJLyogQXR0ZW1wdCB0byBkbyBzb21lIG1lcmdpbmcuIEJ1dCBvbmx5IGV4cGFuZCB0byBjb3ZlciBsb2dpY2FsbHkKKwkJICAgYWRqYWNlbnQgZnJhZ3MgaWYgdGhlIGJsb2NrIGNvbnRhaW5pbmcgdGhlbSBpcyBhbHJlYWR5IGNvbnNpZGVyZWQKKwkJICAgdG8gYmUgZGlydHkuIE90aGVyd2lzZSB3ZSBlbmQgdXAgd2l0aCBHQyBqdXN0IGdvaW5nIHJvdW5kIGluIAorCQkgICBjaXJjbGVzIGRpcnR5aW5nIHRoZSBub2RlcyBpdCBhbHJlYWR5IHdyb3RlIG91dCwgZXNwZWNpYWxseSAKKwkJICAgb24gTkFORCB3aGVyZSB3ZSBoYXZlIHNtYWxsIGVyYXNlYmxvY2tzIGFuZCBoZW5jZSBhIG11Y2ggaGlnaGVyCisJCSAgIGNoYW5jZSBvZiBub2RlcyBoYXZpbmcgdG8gYmUgc3BsaXQgdG8gY3Jvc3MgYm91bmRhcmllcy4gKi8KKworCQlzdHJ1Y3QgamZmczJfbm9kZV9mcmFnICpmcmFnOworCQl1aW50MzJfdCBtaW4sIG1heDsKKworCQltaW4gPSBzdGFydCAmIH4oUEFHRV9DQUNIRV9TSVpFLTEpOworCQltYXggPSBtaW4gKyBQQUdFX0NBQ0hFX1NJWkU7CisKKwkJZnJhZyA9IGpmZnMyX2xvb2t1cF9ub2RlX2ZyYWcoJmYtPmZyYWd0cmVlLCBzdGFydCk7CisKKwkJLyogQlVHX09OKCFmcmFnKSBidXQgdGhhdCdsbCBoYXBwZW4gYW55d2F5Li4uICovCisKKwkJQlVHX09OKGZyYWctPm9mcyAhPSBzdGFydCk7CisKKwkJLyogRmlyc3QgZ3JvdyBkb3duLi4uICovCisJCXdoaWxlKChmcmFnID0gZnJhZ19wcmV2KGZyYWcpKSAmJiBmcmFnLT5vZnMgPj0gbWluKSB7CisKKwkJCS8qIElmIHRoZSBwcmV2aW91cyBmcmFnIGRvZXNuJ3QgZXZlbiByZWFjaCB0aGUgYmVnaW5uaW5nLCB0aGVyZSdzCisJCQkgICBleGNlc3NpdmUgZnJhZ21lbnRhdGlvbi4gSnVzdCBtZXJnZS4gKi8KKwkJCWlmIChmcmFnLT5vZnMgPiBtaW4pIHsKKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRXhwYW5kaW5nIGRvd24gdG8gY292ZXIgcGFydGlhbCBmcmFnICgweCV4LTB4JXgpXG4iLAorCQkJCQkgIGZyYWctPm9mcywgZnJhZy0+b2ZzK2ZyYWctPnNpemUpKTsKKwkJCQlzdGFydCA9IGZyYWctPm9mczsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qIE9LLiBUaGlzIGZyYWcgaG9sZHMgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHBhZ2UuICovCisJCQlpZiAoIWZyYWctPm5vZGUgfHwgIWZyYWctPm5vZGUtPnJhdykgeworCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJGaXJzdCBmcmFnIGluIHBhZ2UgaXMgaG9sZSAoMHgleC0weCV4KS4gTm90IGV4cGFuZGluZyBkb3duLlxuIiwKKwkJCQkJICBmcmFnLT5vZnMsIGZyYWctPm9mcytmcmFnLT5zaXplKSk7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCisJCQkJLyogT0ssIGl0J3MgYSBmcmFnIHdoaWNoIGV4dGVuZHMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgcGFnZS4gRG9lcyBpdCBsaXZlIAorCQkJCSAgIGluIGEgYmxvY2sgd2hpY2ggaXMgc3RpbGwgY29uc2lkZXJlZCBjbGVhbj8gSWYgc28sIGRvbid0IG9ic29sZXRlIGl0LgorCQkJCSAgIElmIG5vdCwgY292ZXIgaXQgYW55d2F5LiAqLworCisJCQkJc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqcmF3ID0gZnJhZy0+bm9kZS0+cmF3OworCQkJCXN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWI7CisKKwkJCQlqZWIgPSAmYy0+YmxvY2tzW3Jhdy0+Zmxhc2hfb2Zmc2V0IC8gYy0+c2VjdG9yX3NpemVdOworCisJCQkJaWYgKGplYiA9PSBjLT5nY2Jsb2NrKSB7CisJCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJFeHBhbmRpbmcgZG93biB0byBjb3ZlciBmcmFnICgweCV4LTB4JXgpIGluIGdjYmxvY2sgYXQgJTA4eFxuIiwKKwkJCQkJCSAgZnJhZy0+b2ZzLCBmcmFnLT5vZnMrZnJhZy0+c2l6ZSwgcmVmX29mZnNldChyYXcpKSk7CisJCQkJCXN0YXJ0ID0gZnJhZy0+b2ZzOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKCFJU0RJUlRZKGplYi0+ZGlydHlfc2l6ZSArIGplYi0+d2FzdGVkX3NpemUpKSB7CisJCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJOb3QgZXhwYW5kaW5nIGRvd24gdG8gY292ZXIgZnJhZyAoMHgleC0weCV4KSBpbiBjbGVhbiBibG9jayAlMDh4XG4iLAorCQkJCQkJICBmcmFnLT5vZnMsIGZyYWctPm9mcytmcmFnLT5zaXplLCBqZWItPm9mZnNldCkpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRXhwYW5kaW5nIGRvd24gdG8gY292ZXIgZnJhZyAoMHgleC0weCV4KSBpbiBkaXJ0eSBibG9jayAlMDh4XG4iLAorCQkJCQkJICBmcmFnLT5vZnMsIGZyYWctPm9mcytmcmFnLT5zaXplLCBqZWItPm9mZnNldCkpOworCQkJCXN0YXJ0ID0gZnJhZy0+b2ZzOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyogLi4uIHRoZW4gdXAgKi8KKworCQkvKiBGaW5kIGxhc3QgZnJhZyB3aGljaCBpcyBhY3R1YWxseSBwYXJ0IG9mIHRoZSBub2RlIHdlJ3JlIHRvIEdDLiAqLworCQlmcmFnID0gamZmczJfbG9va3VwX25vZGVfZnJhZygmZi0+ZnJhZ3RyZWUsIGVuZC0xKTsKKworCQl3aGlsZSgoZnJhZyA9IGZyYWdfbmV4dChmcmFnKSkgJiYgZnJhZy0+b2ZzK2ZyYWctPnNpemUgPD0gbWF4KSB7CisKKwkJCS8qIElmIHRoZSBwcmV2aW91cyBmcmFnIGRvZXNuJ3QgZXZlbiByZWFjaCB0aGUgYmVnaW5uaW5nLCB0aGVyZSdzIGxvdHMKKwkJCSAgIG9mIGZyYWdtZW50YXRpb24uIEp1c3QgbWVyZ2UuICovCisJCQlpZiAoZnJhZy0+b2ZzK2ZyYWctPnNpemUgPCBtYXgpIHsKKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRXhwYW5kaW5nIHVwIHRvIGNvdmVyIHBhcnRpYWwgZnJhZyAoMHgleC0weCV4KVxuIiwKKwkJCQkJICBmcmFnLT5vZnMsIGZyYWctPm9mcytmcmFnLT5zaXplKSk7CisJCQkJZW5kID0gZnJhZy0+b2ZzICsgZnJhZy0+c2l6ZTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKCFmcmFnLT5ub2RlIHx8ICFmcmFnLT5ub2RlLT5yYXcpIHsKKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiTGFzdCBmcmFnIGluIHBhZ2UgaXMgaG9sZSAoMHgleC0weCV4KS4gTm90IGV4cGFuZGluZyB1cC5cbiIsCisJCQkJCSAgZnJhZy0+b2ZzLCBmcmFnLT5vZnMrZnJhZy0+c2l6ZSkpOworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKworCQkJCS8qIE9LLCBpdCdzIGEgZnJhZyB3aGljaCBleHRlbmRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhZ2UuIERvZXMgaXQgbGl2ZSAKKwkJCQkgICBpbiBhIGJsb2NrIHdoaWNoIGlzIHN0aWxsIGNvbnNpZGVyZWQgY2xlYW4/IElmIHNvLCBkb24ndCBvYnNvbGV0ZSBpdC4KKwkJCQkgICBJZiBub3QsIGNvdmVyIGl0IGFueXdheS4gKi8KKworCQkJCXN0cnVjdCBqZmZzMl9yYXdfbm9kZV9yZWYgKnJhdyA9IGZyYWctPm5vZGUtPnJhdzsKKwkJCQlzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViOworCisJCQkJamViID0gJmMtPmJsb2Nrc1tyYXctPmZsYXNoX29mZnNldCAvIGMtPnNlY3Rvcl9zaXplXTsKKworCQkJCWlmIChqZWIgPT0gYy0+Z2NibG9jaykgeworCQkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRXhwYW5kaW5nIHVwIHRvIGNvdmVyIGZyYWcgKDB4JXgtMHgleCkgaW4gZ2NibG9jayBhdCAlMDh4XG4iLAorCQkJCQkJICBmcmFnLT5vZnMsIGZyYWctPm9mcytmcmFnLT5zaXplLCByZWZfb2Zmc2V0KHJhdykpKTsKKwkJCQkJZW5kID0gZnJhZy0+b2ZzICsgZnJhZy0+c2l6ZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmICghSVNESVJUWShqZWItPmRpcnR5X3NpemUgKyBqZWItPndhc3RlZF9zaXplKSkgeworCQkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiTm90IGV4cGFuZGluZyB1cCB0byBjb3ZlciBmcmFnICgweCV4LTB4JXgpIGluIGNsZWFuIGJsb2NrICUwOHhcbiIsCisJCQkJCQkgIGZyYWctPm9mcywgZnJhZy0+b2ZzK2ZyYWctPnNpemUsIGplYi0+b2Zmc2V0KSk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJFeHBhbmRpbmcgdXAgdG8gY292ZXIgZnJhZyAoMHgleC0weCV4KSBpbiBkaXJ0eSBibG9jayAlMDh4XG4iLAorCQkJCQkJICBmcmFnLT5vZnMsIGZyYWctPm9mcytmcmFnLT5zaXplLCBqZWItPm9mZnNldCkpOworCQkJCWVuZCA9IGZyYWctPm9mcyArIGZyYWctPnNpemU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkV4cGFuZGVkIGRub2RlIHRvIHdyaXRlIGZyb20gKDB4JXgtMHgleCkgdG8gKDB4JXgtMHgleClcbiIsIAorCQkJICBvcmlnX3N0YXJ0LCBvcmlnX2VuZCwgc3RhcnQsIGVuZCkpOworCisJCUJVR19PTihlbmQgPiBKRkZTMl9GX0lfU0laRShmKSk7CisJCUJVR19PTihlbmQgPCBvcmlnX2VuZCk7CisJCUJVR19PTihzdGFydCA+IG9yaWdfc3RhcnQpOworCX0KKwkKKwkvKiBGaXJzdCwgdXNlIHJlYWRwYWdlKCkgdG8gcmVhZCB0aGUgYXBwcm9wcmlhdGUgcGFnZSBpbnRvIHRoZSBwYWdlIGNhY2hlICovCisJLyogUTogV2hhdCBoYXBwZW5zIGlmIHdlIGFjdHVhbGx5IHRyeSB0byBHQyB0aGUgX3NhbWVfIHBhZ2UgZm9yIHdoaWNoIGNvbW1pdF93cml0ZSgpCisJICogICAgdHJpZ2dlcmVkIGdhcmJhZ2UgY29sbGVjdGlvbiBpbiB0aGUgZmlyc3QgcGxhY2U/CisJICogQTogSSBfdGhpbmtfIGl0J3MgT0suIHJlYWRfY2FjaGVfcGFnZSBzaG91bGRuJ3QgZGVhZGxvY2ssIHdlJ2xsIHdyaXRlIG91dCB0aGUKKwkgKiAgICBwYWdlIE9LLiBXZSdsbCBhY3R1YWxseSB3cml0ZSBpdCBvdXQgYWdhaW4gaW4gY29tbWl0X3dyaXRlLCB3aGljaCBpcyBhIGxpdHRsZQorCSAqICAgIHN1Ym9wdGltYWwsIGJ1dCBhdCBsZWFzdCB3ZSdyZSBjb3JyZWN0LgorCSAqLworCXBnX3B0ciA9IGpmZnMyX2djX2ZldGNoX3BhZ2UoYywgZiwgc3RhcnQsICZwZyk7CisKKwlpZiAoSVNfRVJSKHBnX3B0cikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAicmVhZF9jYWNoZV9wYWdlKCkgcmV0dXJuZWQgZXJyb3I6ICVsZFxuIiwgUFRSX0VSUihwZ19wdHIpKTsKKwkJcmV0dXJuIFBUUl9FUlIocGdfcHRyKTsKKwl9CisKKwlvZmZzZXQgPSBzdGFydDsKKwl3aGlsZShvZmZzZXQgPCBvcmlnX2VuZCkgeworCQl1aW50MzJfdCBkYXRhbGVuOworCQl1aW50MzJfdCBjZGF0YWxlbjsKKwkJdWludDE2X3QgY29tcHJ0eXBlID0gSkZGUzJfQ09NUFJfTk9ORTsKKworCQlyZXQgPSBqZmZzMl9yZXNlcnZlX3NwYWNlX2djKGMsIHNpemVvZihyaSkgKyBKRkZTMl9NSU5fREFUQV9MRU4sICZwaHlzX29mcywgJmFsbG9jbGVuKTsKKworCQlpZiAocmV0KSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJqZmZzMl9yZXNlcnZlX3NwYWNlX2djIG9mICV6ZCBieXRlcyBmb3IgZ2FyYmFnZV9jb2xsZWN0X2Rub2RlIGZhaWxlZDogJWRcbiIsCisJCQkgICAgICAgc2l6ZW9mKHJpKSsgSkZGUzJfTUlOX0RBVEFfTEVOLCByZXQpOworCQkJYnJlYWs7CisJCX0KKwkJY2RhdGFsZW4gPSBtaW5fdCh1aW50MzJfdCwgYWxsb2NsZW4gLSBzaXplb2YocmkpLCBlbmQgLSBvZmZzZXQpOworCQlkYXRhbGVuID0gZW5kIC0gb2Zmc2V0OworCisJCXdyaXRlYnVmID0gcGdfcHRyICsgKG9mZnNldCAmIChQQUdFX0NBQ0hFX1NJWkUgLTEpKTsKKworCQljb21wcnR5cGUgPSBqZmZzMl9jb21wcmVzcyhjLCBmLCB3cml0ZWJ1ZiwgJmNvbXByYnVmLCAmZGF0YWxlbiwgJmNkYXRhbGVuKTsKKworCQlyaS5tYWdpYyA9IGNwdV90b19qZTE2KEpGRlMyX01BR0lDX0JJVE1BU0spOworCQlyaS5ub2RldHlwZSA9IGNwdV90b19qZTE2KEpGRlMyX05PREVUWVBFX0lOT0RFKTsKKwkJcmkudG90bGVuID0gY3B1X3RvX2plMzIoc2l6ZW9mKHJpKSArIGNkYXRhbGVuKTsKKwkJcmkuaGRyX2NyYyA9IGNwdV90b19qZTMyKGNyYzMyKDAsICZyaSwgc2l6ZW9mKHN0cnVjdCBqZmZzMl91bmtub3duX25vZGUpLTQpKTsKKworCQlyaS5pbm8gPSBjcHVfdG9famUzMihmLT5pbm9jYWNoZS0+aW5vKTsKKwkJcmkudmVyc2lvbiA9IGNwdV90b19qZTMyKCsrZi0+aGlnaGVzdF92ZXJzaW9uKTsKKwkJcmkubW9kZSA9IGNwdV90b19qZW1vZGUoSkZGUzJfRl9JX01PREUoZikpOworCQlyaS51aWQgPSBjcHVfdG9famUxNihKRkZTMl9GX0lfVUlEKGYpKTsKKwkJcmkuZ2lkID0gY3B1X3RvX2plMTYoSkZGUzJfRl9JX0dJRChmKSk7CisJCXJpLmlzaXplID0gY3B1X3RvX2plMzIoSkZGUzJfRl9JX1NJWkUoZikpOworCQlyaS5hdGltZSA9IGNwdV90b19qZTMyKEpGRlMyX0ZfSV9BVElNRShmKSk7CisJCXJpLmN0aW1lID0gY3B1X3RvX2plMzIoSkZGUzJfRl9JX0NUSU1FKGYpKTsKKwkJcmkubXRpbWUgPSBjcHVfdG9famUzMihKRkZTMl9GX0lfTVRJTUUoZikpOworCQlyaS5vZmZzZXQgPSBjcHVfdG9famUzMihvZmZzZXQpOworCQlyaS5jc2l6ZSA9IGNwdV90b19qZTMyKGNkYXRhbGVuKTsKKwkJcmkuZHNpemUgPSBjcHVfdG9famUzMihkYXRhbGVuKTsKKwkJcmkuY29tcHIgPSBjb21wcnR5cGUgJiAweGZmOworCQlyaS51c2VyY29tcHIgPSAoY29tcHJ0eXBlID4+IDgpICYgMHhmZjsKKwkJcmkubm9kZV9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCAmcmksIHNpemVvZihyaSktOCkpOworCQlyaS5kYXRhX2NyYyA9IGNwdV90b19qZTMyKGNyYzMyKDAsIGNvbXByYnVmLCBjZGF0YWxlbikpOworCQorCQluZXdfZm4gPSBqZmZzMl93cml0ZV9kbm9kZShjLCBmLCAmcmksIGNvbXByYnVmLCBjZGF0YWxlbiwgcGh5c19vZnMsIEFMTE9DX0dDKTsKKworCQlqZmZzMl9mcmVlX2NvbXByYnVmKGNvbXByYnVmLCB3cml0ZWJ1Zik7CisKKwkJaWYgKElTX0VSUihuZXdfZm4pKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJFcnJvciB3cml0aW5nIG5ldyBkbm9kZTogJWxkXG4iLCBQVFJfRVJSKG5ld19mbikpOworCQkJcmV0ID0gUFRSX0VSUihuZXdfZm4pOworCQkJYnJlYWs7CisJCX0KKwkJcmV0ID0gamZmczJfYWRkX2Z1bGxfZG5vZGVfdG9faW5vZGUoYywgZiwgbmV3X2ZuKTsKKwkJb2Zmc2V0ICs9IGRhdGFsZW47CisJCWlmIChmLT5tZXRhZGF0YSkgeworCQkJamZmczJfbWFya19ub2RlX29ic29sZXRlKGMsIGYtPm1ldGFkYXRhLT5yYXcpOworCQkJamZmczJfZnJlZV9mdWxsX2Rub2RlKGYtPm1ldGFkYXRhKTsKKwkJCWYtPm1ldGFkYXRhID0gTlVMTDsKKwkJfQorCX0KKworCWpmZnMyX2djX3JlbGVhc2VfcGFnZShjLCBwZ19wdHIsICZwZyk7CisJcmV0dXJuIHJldDsKK30KKwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvaGlzdG8uaCBiL2ZzL2pmZnMyL2hpc3RvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRmMTg0ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMyL2hpc3RvLmgKQEAgLTAsMCArMSwzIEBACisvKiBUaGlzIGZpbGUgcHJvdmlkZXMgdGhlIGJpdC1wcm9iYWJpbGl0aWVzIGZvciB0aGUgaW5wdXQgZmlsZSAqLworI2RlZmluZSBCSVRfRElWSURFUiA2MjkgCitzdGF0aWMgaW50IGJpdHNbOV0gPSB7IDE3OSwxNjcsMTgzLDE2NSwxNTksMTk4LDE3OCwxMTksfTsgLyogaWEzMiAuc28gZmlsZXMgKi8KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2hpc3RvX21pcHMuaCBiL2ZzL2pmZnMyL2hpc3RvX21pcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTQ0MzI2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvamZmczIvaGlzdG9fbWlwcy5oCkBAIC0wLDAgKzEsMiBAQAorI2RlZmluZSBCSVRfRElWSURFUl9NSVBTIDEwNDMgCitzdGF0aWMgaW50IGJpdHNfbWlwc1s4XSA9IHsgMjc3LDI0OSwyOTAsMjY3LDIyOSwzNDEsMjEyLDI0MX07IC8qIG1pcHMzMiAqLwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvaW9jdGwuYyBiL2ZzL2pmZnMyL2lvY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM4Yzc5OQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMyL2lvY3RsLmMKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIEpGRlMyIC0tIEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBWZXJzaW9uIDIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIENyZWF0ZWQgYnkgRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPgorICoKKyAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCisgKgorICogJElkOiBpb2N0bC5jLHYgMS45IDIwMDQvMTEvMTYgMjA6MzY6MTEgZHdtdzIgRXhwICQKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisKK2ludCBqZmZzMl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgCisJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCS8qIExhdGVyLCB0aGlzIHdpbGwgcHJvdmlkZSBmb3IgbHNhdHRyLmpmZnMyIGFuZCBjaGF0dHIuamZmczIsIHdoaWNoCisJICAgd2lsbCBpbmNsdWRlIGNvbXByZXNzaW9uIHN1cHBvcnQgZXRjLiAqLworCXJldHVybiAtRU5PVFRZOworfQorCQpkaWZmIC0tZ2l0IGEvZnMvamZmczIvbWFsbG9jLmMgYi9mcy9qZmZzMi9tYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWJiNDMxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZmczIvbWFsbG9jLmMKQEAgLTAsMCArMSwyMDUgQEAKKy8qCisgKiBKRkZTMiAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgVmVyc2lvbiAyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBDcmVhdGVkIGJ5IERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4KKyAqCisgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgorICoKKyAqICRJZDogbWFsbG9jLmMsdiAxLjI4IDIwMDQvMTEvMTYgMjA6MzY6MTEgZHdtdzIgRXhwICQKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvamZmczIuaD4KKyNpbmNsdWRlICJub2RlbGlzdC5oIgorCisjaWYgMAorI2RlZmluZSBKRkZTMl9TTEFCX1BPSVNPTiBTTEFCX1BPSVNPTgorI2Vsc2UKKyNkZWZpbmUgSkZGUzJfU0xBQl9QT0lTT04gMAorI2VuZGlmCisKKy8vIHJlcGxhY2UgdGhpcyBieSAjZGVmaW5lIEQzICh4KSB4IGZvciBjYWNoZSBkZWJ1Z2dpbmcKKyNkZWZpbmUgRDMoeCkKKworLyogVGhlc2UgYXJlIGluaXRpYWxpc2VkIHRvIE5VTEwgaW4gdGhlIGtlcm5lbCBzdGFydHVwIGNvZGUuCisgICBJZiB5b3UncmUgcG9ydGluZyB0byBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcywgYmV3YXJlICovCitzdGF0aWMga21lbV9jYWNoZV90ICpmdWxsX2Rub2RlX3NsYWI7CitzdGF0aWMga21lbV9jYWNoZV90ICpyYXdfZGlyZW50X3NsYWI7CitzdGF0aWMga21lbV9jYWNoZV90ICpyYXdfaW5vZGVfc2xhYjsKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKnRtcF9kbm9kZV9pbmZvX3NsYWI7CitzdGF0aWMga21lbV9jYWNoZV90ICpyYXdfbm9kZV9yZWZfc2xhYjsKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKm5vZGVfZnJhZ19zbGFiOworc3RhdGljIGttZW1fY2FjaGVfdCAqaW5vZGVfY2FjaGVfc2xhYjsKKworaW50IF9faW5pdCBqZmZzMl9jcmVhdGVfc2xhYl9jYWNoZXModm9pZCkKK3sKKwlmdWxsX2Rub2RlX3NsYWIgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiamZmczJfZnVsbF9kbm9kZSIsIAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBqZmZzMl9mdWxsX2Rub2RlKSwKKwkJCQkJICAgIDAsIEpGRlMyX1NMQUJfUE9JU09OLCBOVUxMLCBOVUxMKTsKKwlpZiAoIWZ1bGxfZG5vZGVfc2xhYikKKwkJZ290byBlcnI7CisKKwlyYXdfZGlyZW50X3NsYWIgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiamZmczJfcmF3X2RpcmVudCIsCisJCQkJCSAgICBzaXplb2Yoc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQpLAorCQkJCQkgICAgMCwgSkZGUzJfU0xBQl9QT0lTT04sIE5VTEwsIE5VTEwpOworCWlmICghcmF3X2RpcmVudF9zbGFiKQorCQlnb3RvIGVycjsKKworCXJhd19pbm9kZV9zbGFiID0ga21lbV9jYWNoZV9jcmVhdGUoImpmZnMyX3Jhd19pbm9kZSIsCisJCQkJCSAgIHNpemVvZihzdHJ1Y3QgamZmczJfcmF3X2lub2RlKSwKKwkJCQkJICAgMCwgSkZGUzJfU0xBQl9QT0lTT04sIE5VTEwsIE5VTEwpOworCWlmICghcmF3X2lub2RlX3NsYWIpCisJCWdvdG8gZXJyOworCisJdG1wX2Rub2RlX2luZm9fc2xhYiA9IGttZW1fY2FjaGVfY3JlYXRlKCJqZmZzMl90bXBfZG5vZGUiLAorCQkJCQkJc2l6ZW9mKHN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbyksCisJCQkJCQkwLCBKRkZTMl9TTEFCX1BPSVNPTiwgTlVMTCwgTlVMTCk7CisJaWYgKCF0bXBfZG5vZGVfaW5mb19zbGFiKQorCQlnb3RvIGVycjsKKworCXJhd19ub2RlX3JlZl9zbGFiID0ga21lbV9jYWNoZV9jcmVhdGUoImpmZnMyX3Jhd19ub2RlX3JlZiIsCisJCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmKSwKKwkJCQkJICAgICAgMCwgSkZGUzJfU0xBQl9QT0lTT04sIE5VTEwsIE5VTEwpOworCWlmICghcmF3X25vZGVfcmVmX3NsYWIpCisJCWdvdG8gZXJyOworCisJbm9kZV9mcmFnX3NsYWIgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiamZmczJfbm9kZV9mcmFnIiwKKwkJCQkJICAgc2l6ZW9mKHN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcpLAorCQkJCQkgICAwLCBKRkZTMl9TTEFCX1BPSVNPTiwgTlVMTCwgTlVMTCk7CisJaWYgKCFub2RlX2ZyYWdfc2xhYikKKwkJZ290byBlcnI7CisKKwlpbm9kZV9jYWNoZV9zbGFiID0ga21lbV9jYWNoZV9jcmVhdGUoImpmZnMyX2lub2RlX2NhY2hlIiwKKwkJCQkJICAgICBzaXplb2Yoc3RydWN0IGpmZnMyX2lub2RlX2NhY2hlKSwKKwkJCQkJICAgICAwLCBKRkZTMl9TTEFCX1BPSVNPTiwgTlVMTCwgTlVMTCk7CisJaWYgKGlub2RlX2NhY2hlX3NsYWIpCisJCXJldHVybiAwOworIGVycjoKKwlqZmZzMl9kZXN0cm95X3NsYWJfY2FjaGVzKCk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3ZvaWQgamZmczJfZGVzdHJveV9zbGFiX2NhY2hlcyh2b2lkKQoreworCWlmKGZ1bGxfZG5vZGVfc2xhYikKKwkJa21lbV9jYWNoZV9kZXN0cm95KGZ1bGxfZG5vZGVfc2xhYik7CisJaWYocmF3X2RpcmVudF9zbGFiKQorCQlrbWVtX2NhY2hlX2Rlc3Ryb3kocmF3X2RpcmVudF9zbGFiKTsKKwlpZihyYXdfaW5vZGVfc2xhYikKKwkJa21lbV9jYWNoZV9kZXN0cm95KHJhd19pbm9kZV9zbGFiKTsKKwlpZih0bXBfZG5vZGVfaW5mb19zbGFiKQorCQlrbWVtX2NhY2hlX2Rlc3Ryb3kodG1wX2Rub2RlX2luZm9fc2xhYik7CisJaWYocmF3X25vZGVfcmVmX3NsYWIpCisJCWttZW1fY2FjaGVfZGVzdHJveShyYXdfbm9kZV9yZWZfc2xhYik7CisJaWYobm9kZV9mcmFnX3NsYWIpCisJCWttZW1fY2FjaGVfZGVzdHJveShub2RlX2ZyYWdfc2xhYik7CisJaWYoaW5vZGVfY2FjaGVfc2xhYikKKwkJa21lbV9jYWNoZV9kZXN0cm95KGlub2RlX2NhY2hlX3NsYWIpOworfQorCitzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKmpmZnMyX2FsbG9jX2Z1bGxfZGlyZW50KGludCBuYW1lc2l6ZSkKK3sKKwlyZXR1cm4ga21hbGxvYyhzaXplb2Yoc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50KSArIG5hbWVzaXplLCBHRlBfS0VSTkVMKTsKK30KKwordm9pZCBqZmZzMl9mcmVlX2Z1bGxfZGlyZW50KHN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqeCkKK3sKKwlrZnJlZSh4KTsKK30KKworc3RydWN0IGpmZnMyX2Z1bGxfZG5vZGUgKmpmZnMyX2FsbG9jX2Z1bGxfZG5vZGUodm9pZCkKK3sKKwlzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZSAqcmV0ID0ga21lbV9jYWNoZV9hbGxvYyhmdWxsX2Rub2RlX3NsYWIsIEdGUF9LRVJORUwpOworCUQzIChwcmludGsgKEtFUk5fREVCVUcgImFsbG9jX2Z1bGxfZG5vZGUgYXQgJXBcbiIsIHJldCkpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgamZmczJfZnJlZV9mdWxsX2Rub2RlKHN0cnVjdCBqZmZzMl9mdWxsX2Rub2RlICp4KQoreworCUQzIChwcmludGsgKEtFUk5fREVCVUcgImZyZWUgZnVsbF9kbm9kZSBhdCAlcFxuIiwgeCkpOworCWttZW1fY2FjaGVfZnJlZShmdWxsX2Rub2RlX3NsYWIsIHgpOworfQorCitzdHJ1Y3QgamZmczJfcmF3X2RpcmVudCAqamZmczJfYWxsb2NfcmF3X2RpcmVudCh2b2lkKQoreworCXN0cnVjdCBqZmZzMl9yYXdfZGlyZW50ICpyZXQgPSBrbWVtX2NhY2hlX2FsbG9jKHJhd19kaXJlbnRfc2xhYiwgR0ZQX0tFUk5FTCk7CisJRDMgKHByaW50ayAoS0VSTl9ERUJVRyAiYWxsb2NfcmF3X2RpcmVudFxuIiwgcmV0KSk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBqZmZzMl9mcmVlX3Jhd19kaXJlbnQoc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQgKngpCit7CisJRDMgKHByaW50ayAoS0VSTl9ERUJVRyAiZnJlZV9yYXdfZGlyZW50IGF0ICVwXG4iLCB4KSk7CisJa21lbV9jYWNoZV9mcmVlKHJhd19kaXJlbnRfc2xhYiwgeCk7Cit9CisKK3N0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKmpmZnMyX2FsbG9jX3Jhd19pbm9kZSh2b2lkKQoreworCXN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKnJldCA9IGttZW1fY2FjaGVfYWxsb2MocmF3X2lub2RlX3NsYWIsIEdGUF9LRVJORUwpOworCUQzIChwcmludGsgKEtFUk5fREVCVUcgImFsbG9jX3Jhd19pbm9kZSBhdCAlcFxuIiwgcmV0KSk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBqZmZzMl9mcmVlX3Jhd19pbm9kZShzdHJ1Y3QgamZmczJfcmF3X2lub2RlICp4KQoreworCUQzIChwcmludGsgKEtFUk5fREVCVUcgImZyZWVfcmF3X2lub2RlIGF0ICVwXG4iLCB4KSk7CisJa21lbV9jYWNoZV9mcmVlKHJhd19pbm9kZV9zbGFiLCB4KTsKK30KKworc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvICpqZmZzMl9hbGxvY190bXBfZG5vZGVfaW5mbyh2b2lkKQoreworCXN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbyAqcmV0ID0ga21lbV9jYWNoZV9hbGxvYyh0bXBfZG5vZGVfaW5mb19zbGFiLCBHRlBfS0VSTkVMKTsKKwlEMyAocHJpbnRrIChLRVJOX0RFQlVHICJhbGxvY190bXBfZG5vZGVfaW5mbyBhdCAlcFxuIiwgcmV0KSk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBqZmZzMl9mcmVlX3RtcF9kbm9kZV9pbmZvKHN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbyAqeCkKK3sKKwlEMyAocHJpbnRrIChLRVJOX0RFQlVHICJmcmVlX3RtcF9kbm9kZV9pbmZvIGF0ICVwXG4iLCB4KSk7CisJa21lbV9jYWNoZV9mcmVlKHRtcF9kbm9kZV9pbmZvX3NsYWIsIHgpOworfQorCitzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICpqZmZzMl9hbGxvY19yYXdfbm9kZV9yZWYodm9pZCkKK3sKKwlzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICpyZXQgPSBrbWVtX2NhY2hlX2FsbG9jKHJhd19ub2RlX3JlZl9zbGFiLCBHRlBfS0VSTkVMKTsKKwlEMyAocHJpbnRrIChLRVJOX0RFQlVHICJhbGxvY19yYXdfbm9kZV9yZWYgYXQgJXBcbiIsIHJldCkpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgamZmczJfZnJlZV9yYXdfbm9kZV9yZWYoc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqeCkKK3sKKwlEMyAocHJpbnRrIChLRVJOX0RFQlVHICJmcmVlX3Jhd19ub2RlX3JlZiBhdCAlcFxuIiwgeCkpOworCWttZW1fY2FjaGVfZnJlZShyYXdfbm9kZV9yZWZfc2xhYiwgeCk7Cit9CisKK3N0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKmpmZnMyX2FsbG9jX25vZGVfZnJhZyh2b2lkKQoreworCXN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKnJldCA9IGttZW1fY2FjaGVfYWxsb2Mobm9kZV9mcmFnX3NsYWIsIEdGUF9LRVJORUwpOworCUQzIChwcmludGsgKEtFUk5fREVCVUcgImFsbG9jX25vZGVfZnJhZyBhdCAlcFxuIiwgcmV0KSk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBqZmZzMl9mcmVlX25vZGVfZnJhZyhzdHJ1Y3QgamZmczJfbm9kZV9mcmFnICp4KQoreworCUQzIChwcmludGsgKEtFUk5fREVCVUcgImZyZWVfbm9kZV9mcmFnIGF0ICVwXG4iLCB4KSk7CisJa21lbV9jYWNoZV9mcmVlKG5vZGVfZnJhZ19zbGFiLCB4KTsKK30KKworc3RydWN0IGpmZnMyX2lub2RlX2NhY2hlICpqZmZzMl9hbGxvY19pbm9kZV9jYWNoZSh2b2lkKQoreworCXN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqcmV0ID0ga21lbV9jYWNoZV9hbGxvYyhpbm9kZV9jYWNoZV9zbGFiLCBHRlBfS0VSTkVMKTsKKwlEMyAocHJpbnRrKEtFUk5fREVCVUcgIkFsbG9jYXRlZCBpbm9jYWNoZSBhdCAlcFxuIiwgcmV0KSk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBqZmZzMl9mcmVlX2lub2RlX2NhY2hlKHN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqeCkKK3sKKwlEMyAocHJpbnRrKEtFUk5fREVCVUcgIkZyZWVpbmcgaW5vY2FjaGUgYXQgJXBcbiIsIHgpKTsKKwlrbWVtX2NhY2hlX2ZyZWUoaW5vZGVfY2FjaGVfc2xhYiwgeCk7Cit9CisKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL25vZGVsaXN0LmMgYi9mcy9qZmZzMi9ub2RlbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNmE4YmQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZmZzMi9ub2RlbGlzdC5jCkBAIC0wLDAgKzEsNjgxIEBACisvKgorICogSkZGUzIgLS0gSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0sIFZlcnNpb24gMi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CisgKgorICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KKyAqCisgKiAkSWQ6IG5vZGVsaXN0LmMsdiAxLjkwIDIwMDQvMTIvMDggMTc6NTk6MjAgZHdtdzIgRXhwICQKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgIm5vZGVsaXN0LmgiCisKK3ZvaWQgamZmczJfYWRkX2ZkX3RvX2xpc3Qoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqbmV3LCBzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKipsaXN0KQoreworCXN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqKnByZXYgPSBsaXN0OworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9hZGRfZmRfdG9fbGlzdCggJXAsICVwICgtPiVwKSlcbiIsIG5ldywgbGlzdCwgKmxpc3QpKTsKKworCXdoaWxlICgoKnByZXYpICYmICgqcHJldiktPm5oYXNoIDw9IG5ldy0+bmhhc2gpIHsKKwkJaWYgKCgqcHJldiktPm5oYXNoID09IG5ldy0+bmhhc2ggJiYgIXN0cmNtcCgoKnByZXYpLT5uYW1lLCBuZXctPm5hbWUpKSB7CisJCQkvKiBEdXBsaWNhdGUuIEZyZWUgb25lICovCisJCQlpZiAobmV3LT52ZXJzaW9uIDwgKCpwcmV2KS0+dmVyc2lvbikgeworCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJFZXAhIE1hcmtpbmcgbmV3IGRpcmVudCBub2RlIG9ic29sZXRlXG4iKSk7CisJCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIk5ldyBkaXJlbnQgaXMgXCIlc1wiLT5pbm8gIyV1LiBPbGQgaXMgXCIlc1wiLT5pbm8gIyV1XG4iLCBuZXctPm5hbWUsIG5ldy0+aW5vLCAoKnByZXYpLT5uYW1lLCAoKnByZXYpLT5pbm8pKTsKKwkJCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgbmV3LT5yYXcpOworCQkJCWpmZnMyX2ZyZWVfZnVsbF9kaXJlbnQobmV3KTsKKwkJCX0gZWxzZSB7CisJCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIk1hcmtpbmcgb2xkIGRpcmVudCBub2RlIChpbm8gIyV1KSBvYnNvbGV0ZVxuIiwgKCpwcmV2KS0+aW5vKSk7CisJCQkJbmV3LT5uZXh0ID0gKCpwcmV2KS0+bmV4dDsKKwkJCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgKCgqcHJldiktPnJhdykpOworCQkJCWpmZnMyX2ZyZWVfZnVsbF9kaXJlbnQoKnByZXYpOworCQkJCSpwcmV2ID0gbmV3OworCQkJfQorCQkJZ290byBvdXQ7CisJCX0KKwkJcHJldiA9ICYoKCpwcmV2KS0+bmV4dCk7CisJfQorCW5ldy0+bmV4dCA9ICpwcmV2OworCSpwcmV2ID0gbmV3OworCisgb3V0OgorCUQyKHdoaWxlKCpsaXN0KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJEaXJlbnQgXCIlc1wiIChoYXNoIDB4JTA4eCwgaW5vICMldVxuIiwgKCpsaXN0KS0+bmFtZSwgKCpsaXN0KS0+bmhhc2gsICgqbGlzdCktPmlubyk7CisJCWxpc3QgPSAmKCpsaXN0KS0+bmV4dDsKKwl9KTsKK30KKworLyogUHV0IGEgbmV3IHRtcF9kbm9kZV9pbmZvIGludG8gdGhlIGxpc3QsIGtlZXBpbmcgdGhlIGxpc3QgaW4gCisgICBvcmRlciBvZiBpbmNyZWFzaW5nIHZlcnNpb24KKyovCitzdGF0aWMgdm9pZCBqZmZzMl9hZGRfdG5fdG9fbGlzdChzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKnRuLCBzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKipsaXN0KQoreworCXN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbyAqKnByZXYgPSBsaXN0OworCQorCXdoaWxlICgoKnByZXYpICYmICgqcHJldiktPnZlcnNpb24gPCB0bi0+dmVyc2lvbikgeworCQlwcmV2ID0gJigoKnByZXYpLT5uZXh0KTsKKwl9CisJdG4tPm5leHQgPSAoKnByZXYpOworICAgICAgICAqcHJldiA9IHRuOworfQorCitzdGF0aWMgdm9pZCBqZmZzMl9mcmVlX3RtcF9kbm9kZV9pbmZvX2xpc3Qoc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvICp0bikKK3sKKwlzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKm5leHQ7CisKKwl3aGlsZSAodG4pIHsKKwkJbmV4dCA9IHRuOworCQl0biA9IHRuLT5uZXh0OworCQlqZmZzMl9mcmVlX2Z1bGxfZG5vZGUobmV4dC0+Zm4pOworCQlqZmZzMl9mcmVlX3RtcF9kbm9kZV9pbmZvKG5leHQpOworCX0KK30KKworc3RhdGljIHZvaWQgamZmczJfZnJlZV9mdWxsX2RpcmVudF9saXN0KHN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqZmQpCit7CisJc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICpuZXh0OworCisJd2hpbGUgKGZkKSB7CisJCW5leHQgPSBmZC0+bmV4dDsKKwkJamZmczJfZnJlZV9mdWxsX2RpcmVudChmZCk7CisJCWZkID0gbmV4dDsKKwl9Cit9CisKKy8qIFJldHVybnMgZmlyc3QgdmFsaWQgbm9kZSBhZnRlciAncmVmJy4gTWF5IHJldHVybiAncmVmJyAqLworc3RhdGljIHN0cnVjdCBqZmZzMl9yYXdfbm9kZV9yZWYgKmpmZnMyX2ZpcnN0X3ZhbGlkX25vZGUoc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqcmVmKQoreworCXdoaWxlIChyZWYgJiYgcmVmLT5uZXh0X2luX2lubykgeworCQlpZiAoIXJlZl9vYnNvbGV0ZShyZWYpKQorCQkJcmV0dXJuIHJlZjsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIm5vZGUgYXQgMHglMDh4IGlzIG9ic29sZXRlZC4gSWdub3JpbmcuXG4iLCByZWZfb2Zmc2V0KHJlZikpKTsKKwkJcmVmID0gcmVmLT5uZXh0X2luX2lubzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIEdldCB0bXBfZG5vZGVfaW5mbyBhbmQgZnVsbF9kaXJlbnQgZm9yIGFsbCBub24tb2Jzb2xldGUgbm9kZXMgYXNzb2NpYXRlZAorICAgd2l0aCB0aGlzIGlubywgcmV0dXJuaW5nIHRoZSBmb3JtZXIgaW4gb3JkZXIgb2YgdmVyc2lvbiAqLworCitpbnQgamZmczJfZ2V0X2lub2RlX25vZGVzKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiwKKwkJCSAgc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvICoqdG5wLCBzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKipmZHAsCisJCQkgIHVpbnQzMl90ICpoaWdoZXN0X3ZlcnNpb24sIHVpbnQzMl90ICpsYXRlc3RfbWN0aW1lLAorCQkJICB1aW50MzJfdCAqbWN0aW1lX3ZlcikKK3sKKwlzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICpyZWYsICp2YWxpZF9yZWY7CisJc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvICp0biwgKnJldF90biA9IE5VTEw7CisJc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICpmZCwgKnJldF9mZCA9IE5VTEw7CisJdW5pb24gamZmczJfbm9kZV91bmlvbiBub2RlOworCXNpemVfdCByZXRsZW47CisJaW50IGVycjsKKworCSptY3RpbWVfdmVyID0gMDsKKwkKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZ2V0X2lub2RlX25vZGVzKCk6IGlubyAjJXVcbiIsIGYtPmlub2NhY2hlLT5pbm8pKTsKKworCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKworCXZhbGlkX3JlZiA9IGpmZnMyX2ZpcnN0X3ZhbGlkX25vZGUoZi0+aW5vY2FjaGUtPm5vZGVzKTsKKworCWlmICghdmFsaWRfcmVmKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJFZXAuIE5vIHZhbGlkIG5vZGVzIGZvciBpbm8gIyV1XG4iLCBmLT5pbm9jYWNoZS0+aW5vKTsKKworCXdoaWxlICh2YWxpZF9yZWYpIHsKKwkJLyogV2UgY2FuIGhvbGQgYSBwb2ludGVyIHRvIGEgbm9uLW9ic29sZXRlIG5vZGUgd2l0aG91dCB0aGUgc3BpbmxvY2ssCisJCSAgIGJ1dCBfb2Jzb2xldGVfIG5vZGVzIG1heSBkaXNhcHBlYXIgYXQgYW55IHRpbWUsIGlmIHRoZSBibG9jaworCQkgICB0aGV5J3JlIGluIGdldHMgZXJhc2VkLiBTbyBpZiB3ZSBtYXJrICdyZWYnIG9ic29sZXRlIHdoaWxlIHdlJ3JlCisJCSAgIG5vdCBob2xkaW5nIHRoZSBsb2NrLCBpdCBjYW4gZ28gYXdheSBpbW1lZGlhdGVseS4gRm9yIHRoYXQgcmVhc29uLAorCQkgICB3ZSBmaW5kIHRoZSBuZXh0IHZhbGlkIG5vZGUgZmlyc3QsIGJlZm9yZSBwcm9jZXNzaW5nICdyZWYnLgorCQkqLworCQlyZWYgPSB2YWxpZF9yZWY7CisJCXZhbGlkX3JlZiA9IGpmZnMyX2ZpcnN0X3ZhbGlkX25vZGUocmVmLT5uZXh0X2luX2lubyk7CisJCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCisJCWNvbmRfcmVzY2hlZCgpOworCisJCS8qIEZJWE1FOiBwb2ludCgpICovCisJCWVyciA9IGpmZnMyX2ZsYXNoX3JlYWQoYywgKHJlZl9vZmZzZXQocmVmKSksIAorCQkJCSAgICAgICBtaW5fdCh1aW50MzJfdCwgcmVmX3RvdGxlbihjLCBOVUxMLCByZWYpLCBzaXplb2Yobm9kZSkpLAorCQkJCSAgICAgICAmcmV0bGVuLCAodm9pZCAqKSZub2RlKTsKKwkJaWYgKGVycikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiZXJyb3IgJWQgcmVhZGluZyBub2RlIGF0IDB4JTA4eCBpbiBnZXRfaW5vZGVfbm9kZXMoKVxuIiwgZXJyLCByZWZfb2Zmc2V0KHJlZikpOworCQkJZ290byBmcmVlX291dDsKKwkJfQorCQkJCisKKwkJCS8qIENoZWNrIHdlJ3ZlIG1hbmFnZWQgdG8gcmVhZCBhdCBsZWFzdCB0aGUgY29tbW9uIG5vZGUgaGVhZGVyICovCisJCWlmIChyZXRsZW4gPCBtaW5fdCh1aW50MzJfdCwgcmVmX3RvdGxlbihjLCBOVUxMLCByZWYpLCBzaXplb2Yobm9kZS51KSkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgInNob3J0IHJlYWQgaW4gZ2V0X2lub2RlX25vZGVzKClcbiIpOworCQkJZXJyID0gLUVJTzsKKwkJCWdvdG8gZnJlZV9vdXQ7CisJCX0KKwkJCQorCQlzd2l0Y2ggKGplMTZfdG9fY3B1KG5vZGUudS5ub2RldHlwZSkpIHsKKwkJY2FzZSBKRkZTMl9OT0RFVFlQRV9ESVJFTlQ6CisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiTm9kZSBhdCAlMDh4ICglZCkgaXMgYSBkaXJlbnQgbm9kZVxuIiwgcmVmX29mZnNldChyZWYpLCByZWZfZmxhZ3MocmVmKSkpOworCQkJaWYgKHJlZl9mbGFncyhyZWYpID09IFJFRl9VTkNIRUNLRUQpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJCVUc6IERpcmVudCBub2RlIGF0IDB4JTA4eCBuZXZlciBnb3QgY2hlY2tlZD8gSG93P1xuIiwgcmVmX29mZnNldChyZWYpKTsKKwkJCQlCVUcoKTsKKwkJCX0KKwkJCWlmIChyZXRsZW4gPCBzaXplb2Yobm9kZS5kKSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInNob3J0IHJlYWQgaW4gZ2V0X2lub2RlX25vZGVzKClcbiIpOworCQkJCWVyciA9IC1FSU87CisJCQkJZ290byBmcmVlX291dDsKKwkJCX0KKwkJCS8qIHNhbml0eSBjaGVjayAqLworCQkJaWYgKFBBRCgobm9kZS5kLm5zaXplICsgc2l6ZW9mIChub2RlLmQpKSkgIT0gUEFEKGplMzJfdG9fY3B1IChub2RlLmQudG90bGVuKSkpIHsKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgImpmZnMyX2dldF9pbm9kZV9ub2RlcygpOiBJbGxlZ2FsIG5zaXplIGluIG5vZGUgYXQgMHglMDh4OiBuc2l6ZSAweCUwMngsIHRvdGxlbiAlMDR4XG4iLAorCQkJCSAgICAgICByZWZfb2Zmc2V0KHJlZiksIG5vZGUuZC5uc2l6ZSwgamUzMl90b19jcHUobm9kZS5kLnRvdGxlbikpOworCQkJCWpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZShjLCByZWYpOworCQkJCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChqZTMyX3RvX2NwdShub2RlLmQudmVyc2lvbikgPiAqaGlnaGVzdF92ZXJzaW9uKQorCQkJCSpoaWdoZXN0X3ZlcnNpb24gPSBqZTMyX3RvX2NwdShub2RlLmQudmVyc2lvbik7CisJCQlpZiAocmVmX29ic29sZXRlKHJlZikpIHsKKwkJCQkvKiBPYnNvbGV0ZWQuIFRoaXMgY2Fubm90IGhhcHBlbiwgc3VyZWx5PyBkd213MiAyMDAyMDMwOCAqLworCQkJCXByaW50ayhLRVJOX0VSUiAiRGlyZW50IG5vZGUgYXQgMHglMDh4IGJlY2FtZSBvYnNvbGV0ZSB3aGlsZSB3ZSB3ZXJlbid0IGxvb2tpbmdcbiIsCisJCQkJICAgICAgIHJlZl9vZmZzZXQocmVmKSk7CisJCQkJQlVHKCk7CisJCQl9CisJCQkKKwkJCWZkID0gamZmczJfYWxsb2NfZnVsbF9kaXJlbnQobm9kZS5kLm5zaXplKzEpOworCQkJaWYgKCFmZCkgeworCQkJCWVyciA9IC1FTk9NRU07CisJCQkJZ290byBmcmVlX291dDsKKwkJCX0KKwkJCWZkLT5yYXcgPSByZWY7CisJCQlmZC0+dmVyc2lvbiA9IGplMzJfdG9fY3B1KG5vZGUuZC52ZXJzaW9uKTsKKwkJCWZkLT5pbm8gPSBqZTMyX3RvX2NwdShub2RlLmQuaW5vKTsKKwkJCWZkLT50eXBlID0gbm9kZS5kLnR5cGU7CisKKwkJCS8qIFBpY2sgb3V0IHRoZSBtY3RpbWUgb2YgdGhlIGxhdGVzdCBkaXJlbnQgKi8KKwkJCWlmKGZkLT52ZXJzaW9uID4gKm1jdGltZV92ZXIpIHsKKwkJCQkqbWN0aW1lX3ZlciA9IGZkLT52ZXJzaW9uOworCQkJCSpsYXRlc3RfbWN0aW1lID0gamUzMl90b19jcHUobm9kZS5kLm1jdGltZSk7CisJCQl9CisKKwkJCS8qIG1lbWNweSBhcyBtdWNoIG9mIHRoZSBuYW1lIGFzIHBvc3NpYmxlIGZyb20gdGhlIHJhdworCQkJICAgZGlyZW50IHdlJ3ZlIGFscmVhZHkgcmVhZCBmcm9tIHRoZSBmbGFzaAorCQkJKi8KKwkJCWlmIChyZXRsZW4gPiBzaXplb2Yoc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQpKQorCQkJCW1lbWNweSgmZmQtPm5hbWVbMF0sICZub2RlLmQubmFtZVswXSwgbWluX3QodWludDMyX3QsIG5vZGUuZC5uc2l6ZSwgKHJldGxlbi1zaXplb2Yoc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQpKSkpOworCQkJCQorCQkJLyogRG8gd2UgbmVlZCB0byBjb3B5IGFueSBtb3JlIG9mIHRoZSBuYW1lIGRpcmVjdGx5CisJCQkgICBmcm9tIHRoZSBmbGFzaD8KKwkJCSovCisJCQlpZiAobm9kZS5kLm5zaXplICsgc2l6ZW9mKHN0cnVjdCBqZmZzMl9yYXdfZGlyZW50KSA+IHJldGxlbikgeworCQkJCS8qIEZJWE1FOiBwb2ludCgpICovCisJCQkJaW50IGFscmVhZHkgPSByZXRsZW4gLSBzaXplb2Yoc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQpOworCQkJCQkKKwkJCQllcnIgPSBqZmZzMl9mbGFzaF9yZWFkKGMsIChyZWZfb2Zmc2V0KHJlZikpICsgcmV0bGVuLCAKKwkJCQkJCSAgIG5vZGUuZC5uc2l6ZSAtIGFscmVhZHksICZyZXRsZW4sICZmZC0+bmFtZVthbHJlYWR5XSk7CisJCQkJaWYgKCFlcnIgJiYgcmV0bGVuICE9IG5vZGUuZC5uc2l6ZSAtIGFscmVhZHkpCisJCQkJCWVyciA9IC1FSU87CisJCQkJCQorCQkJCWlmIChlcnIpIHsKKwkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUmVhZCByZW1haW5kZXIgb2YgbmFtZSBpbiBqZmZzMl9nZXRfaW5vZGVfbm9kZXMoKTogZXJyb3IgJWRcbiIsIGVycik7CisJCQkJCWpmZnMyX2ZyZWVfZnVsbF9kaXJlbnQoZmQpOworCQkJCQlnb3RvIGZyZWVfb3V0OworCQkJCX0KKwkJCX0KKwkJCWZkLT5uaGFzaCA9IGZ1bGxfbmFtZV9oYXNoKGZkLT5uYW1lLCBub2RlLmQubnNpemUpOworCQkJZmQtPm5leHQgPSBOVUxMOworCQkJZmQtPm5hbWVbbm9kZS5kLm5zaXplXSA9ICdcMCc7CisJCQkJLyogV2hlZWUuIFdlIG5vdyBoYXZlIGEgY29tcGxldGUgamZmczJfZnVsbF9kaXJlbnQgc3RydWN0dXJlLCB3aXRoCisJCQkJICAgdGhlIG5hbWUgaW4gaXQgYW5kIGV2ZXJ5dGhpbmcuIExpbmsgaXQgaW50byB0aGUgbGlzdCAKKwkJCQkqLworCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkFkZGluZyBmZCBcIiVzXCIsIGlubyAjJXVcbiIsIGZkLT5uYW1lLCBmZC0+aW5vKSk7CisJCQlqZmZzMl9hZGRfZmRfdG9fbGlzdChjLCBmZCwgJnJldF9mZCk7CisJCQlicmVhazsKKworCQljYXNlIEpGRlMyX05PREVUWVBFX0lOT0RFOgorCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIk5vZGUgYXQgJTA4eCAoJWQpIGlzIGEgZGF0YSBub2RlXG4iLCByZWZfb2Zmc2V0KHJlZiksIHJlZl9mbGFncyhyZWYpKSk7CisJCQlpZiAocmV0bGVuIDwgc2l6ZW9mKG5vZGUuaSkpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJyZWFkIHRvbyBzaG9ydCBmb3IgZG5vZGVcbiIpOworCQkJCWVyciA9IC1FSU87CisJCQkJZ290byBmcmVlX291dDsKKwkJCX0KKwkJCWlmIChqZTMyX3RvX2NwdShub2RlLmkudmVyc2lvbikgPiAqaGlnaGVzdF92ZXJzaW9uKQorCQkJCSpoaWdoZXN0X3ZlcnNpb24gPSBqZTMyX3RvX2NwdShub2RlLmkudmVyc2lvbik7CisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAidmVyc2lvbiAlZCwgaGlnaGVzdF92ZXJzaW9uIG5vdyAlZFxuIiwgamUzMl90b19jcHUobm9kZS5pLnZlcnNpb24pLCAqaGlnaGVzdF92ZXJzaW9uKSk7CisKKwkJCWlmIChyZWZfb2Jzb2xldGUocmVmKSkgeworCQkJCS8qIE9ic29sZXRlZC4gVGhpcyBjYW5ub3QgaGFwcGVuLCBzdXJlbHk/IGR3bXcyIDIwMDIwMzA4ICovCisJCQkJcHJpbnRrKEtFUk5fRVJSICJJbm9kZSBub2RlIGF0IDB4JTA4eCBiZWNhbWUgb2Jzb2xldGUgd2hpbGUgd2Ugd2VyZW4ndCBsb29raW5nXG4iLAorCQkJCSAgICAgICByZWZfb2Zmc2V0KHJlZikpOworCQkJCUJVRygpOworCQkJfQorCisJCQkvKiBJZiB3ZSd2ZSBuZXZlciBjaGVja2VkIHRoZSBDUkNzIG9uIHRoaXMgbm9kZSwgY2hlY2sgdGhlbSBub3cuICovCisJCQlpZiAocmVmX2ZsYWdzKHJlZikgPT0gUkVGX1VOQ0hFQ0tFRCkgeworCQkJCXVpbnQzMl90IGNyYywgbGVuOworCQkJCXN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWI7CisKKwkJCQljcmMgPSBjcmMzMigwLCAmbm9kZSwgc2l6ZW9mKG5vZGUuaSktOCk7CisJCQkJaWYgKGNyYyAhPSBqZTMyX3RvX2NwdShub2RlLmkubm9kZV9jcmMpKSB7CisJCQkJCXByaW50ayhLRVJOX05PVElDRSAiamZmczJfZ2V0X2lub2RlX25vZGVzKCk6IENSQyBmYWlsZWQgb24gbm9kZSBhdCAweCUwOHg6IFJlYWQgMHglMDh4LCBjYWxjdWxhdGVkIDB4JTA4eFxuIiwKKwkJCQkJICAgICAgIHJlZl9vZmZzZXQocmVmKSwgamUzMl90b19jcHUobm9kZS5pLm5vZGVfY3JjKSwgY3JjKTsKKwkJCQkJamZmczJfbWFya19ub2RlX29ic29sZXRlKGMsIHJlZik7CisJCQkJCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCQorCQkJCS8qIHNhbml0eSBjaGVja3MgKi8KKwkJCQlpZiAoIGplMzJfdG9fY3B1KG5vZGUuaS5vZmZzZXQpID4gamUzMl90b19jcHUobm9kZS5pLmlzaXplKSB8fAorCQkJCSAgICAgUEFEKGplMzJfdG9fY3B1KG5vZGUuaS5jc2l6ZSkgKyBzaXplb2YgKG5vZGUuaSkpICE9IFBBRChqZTMyX3RvX2NwdShub2RlLmkudG90bGVuKSkpIHsKKwkJCQkJcHJpbnRrKEtFUk5fTk9USUNFICJqZmZzMl9nZXRfaW5vZGVfbm9kZXMoKTogSW5vZGUgY29ycnVwdGVkIGF0IDB4JTA4eCwgdG90bGVuICVkLCAjaW5vICAlZCwgdmVyc2lvbiAlZCwgaXNpemUgJWQsIGNzaXplICVkLCBkc2l6ZSAlZCBcbiIsCisJCQkJCQlyZWZfb2Zmc2V0KHJlZiksICBqZTMyX3RvX2NwdShub2RlLmkudG90bGVuKSwgIGplMzJfdG9fY3B1KG5vZGUuaS5pbm8pLAorCQkJCQkJamUzMl90b19jcHUobm9kZS5pLnZlcnNpb24pLCAgamUzMl90b19jcHUobm9kZS5pLmlzaXplKSwgCisJCQkJCQlqZTMyX3RvX2NwdShub2RlLmkuY3NpemUpLCBqZTMyX3RvX2NwdShub2RlLmkuZHNpemUpKTsKKwkJCQkJamZmczJfbWFya19ub2RlX29ic29sZXRlKGMsIHJlZik7CisJCQkJCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJaWYgKG5vZGUuaS5jb21wciAhPSBKRkZTMl9DT01QUl9aRVJPICYmIGplMzJfdG9fY3B1KG5vZGUuaS5jc2l6ZSkpIHsKKwkJCQkJdW5zaWduZWQgY2hhciAqYnVmPU5VTEw7CisJCQkJCXVpbnQzMl90IHBvaW50ZWQgPSAwOworI2lmbmRlZiBfX0VDT1MKKwkJCQkJaWYgKGMtPm10ZC0+cG9pbnQpIHsKKwkJCQkJCWVyciA9IGMtPm10ZC0+cG9pbnQgKGMtPm10ZCwgcmVmX29mZnNldChyZWYpICsgc2l6ZW9mKG5vZGUuaSksIGplMzJfdG9fY3B1KG5vZGUuaS5jc2l6ZSksCisJCQkJCQkJCSAgICAgJnJldGxlbiwgJmJ1Zik7CisJCQkJCQlpZiAoIWVyciAmJiByZXRsZW4gPCBqZTMyX3RvX2NwdShub2RlLmkuY3NpemUpKSB7CisJCQkJCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIk1URCBwb2ludCByZXR1cm5lZCBsZW4gdG9vIHNob3J0OiAweCV6eFxuIiwgcmV0bGVuKSk7CisJCQkJCQkJYy0+bXRkLT51bnBvaW50KGMtPm10ZCwgYnVmLCByZWZfb2Zmc2V0KHJlZikgKyBzaXplb2Yobm9kZS5pKSwgamUzMl90b19jcHUobm9kZS5pLmNzaXplKSk7CisJCQkJCQl9IGVsc2UgaWYgKGVycil7CisJCQkJCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIk1URCBwb2ludCBmYWlsZWQgJWRcbiIsIGVycikpOworCQkJCQkJfSBlbHNlCisJCQkJCQkJcG9pbnRlZCA9IDE7IC8qIHN1Y2NlZnVsbHkgcG9pbnRlZCB0byBkZXZpY2UgKi8KKwkJCQkJfQorI2VuZGlmCQkJCQkKKwkJCQkJaWYoIXBvaW50ZWQpeworCQkJCQkJYnVmID0ga21hbGxvYyhqZTMyX3RvX2NwdShub2RlLmkuY3NpemUpLCBHRlBfS0VSTkVMKTsKKwkJCQkJCWlmICghYnVmKQorCQkJCQkJCXJldHVybiAtRU5PTUVNOworCQkJCQkJCisJCQkJCQllcnIgPSBqZmZzMl9mbGFzaF9yZWFkKGMsIHJlZl9vZmZzZXQocmVmKSArIHNpemVvZihub2RlLmkpLCBqZTMyX3RvX2NwdShub2RlLmkuY3NpemUpLAorCQkJCQkJCQkgICAgICAgJnJldGxlbiwgYnVmKTsKKwkJCQkJCWlmICghZXJyICYmIHJldGxlbiAhPSBqZTMyX3RvX2NwdShub2RlLmkuY3NpemUpKQorCQkJCQkJCWVyciA9IC1FSU87CisJCQkJCQlpZiAoZXJyKSB7CisJCQkJCQkJa2ZyZWUoYnVmKTsKKwkJCQkJCQlyZXR1cm4gZXJyOworCQkJCQkJfQorCQkJCQl9CisJCQkJCWNyYyA9IGNyYzMyKDAsIGJ1ZiwgamUzMl90b19jcHUobm9kZS5pLmNzaXplKSk7CisJCQkJCWlmKCFwb2ludGVkKQorCQkJCQkJa2ZyZWUoYnVmKTsKKyNpZm5kZWYgX19FQ09TCisJCQkJCWVsc2UKKwkJCQkJCWMtPm10ZC0+dW5wb2ludChjLT5tdGQsIGJ1ZiwgcmVmX29mZnNldChyZWYpICsgc2l6ZW9mKG5vZGUuaSksIGplMzJfdG9fY3B1KG5vZGUuaS5jc2l6ZSkpOworI2VuZGlmCisKKwkJCQkJaWYgKGNyYyAhPSBqZTMyX3RvX2NwdShub2RlLmkuZGF0YV9jcmMpKSB7CisJCQkJCQlwcmludGsoS0VSTl9OT1RJQ0UgImpmZnMyX2dldF9pbm9kZV9ub2RlcygpOiBEYXRhIENSQyBmYWlsZWQgb24gbm9kZSBhdCAweCUwOHg6IFJlYWQgMHglMDh4LCBjYWxjdWxhdGVkIDB4JTA4eFxuIiwKKwkJCQkJCSAgICAgICByZWZfb2Zmc2V0KHJlZiksIGplMzJfdG9fY3B1KG5vZGUuaS5kYXRhX2NyYyksIGNyYyk7CisJCQkJCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgcmVmKTsKKwkJCQkJCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCQorCQkJCX0KKworCQkJCS8qIE1hcmsgdGhlIG5vZGUgYXMgaGF2aW5nIGJlZW4gY2hlY2tlZCBhbmQgZml4IHRoZSBhY2NvdW50aW5nIGFjY29yZGluZ2x5ICovCisJCQkJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCQkJCWplYiA9ICZjLT5ibG9ja3NbcmVmLT5mbGFzaF9vZmZzZXQgLyBjLT5zZWN0b3Jfc2l6ZV07CisJCQkJbGVuID0gcmVmX3RvdGxlbihjLCBqZWIsIHJlZik7CisKKwkJCQlqZWItPnVzZWRfc2l6ZSArPSBsZW47CisJCQkJamViLT51bmNoZWNrZWRfc2l6ZSAtPSBsZW47CisJCQkJYy0+dXNlZF9zaXplICs9IGxlbjsKKwkJCQljLT51bmNoZWNrZWRfc2l6ZSAtPSBsZW47CisKKwkJCQkvKiBJZiBub2RlIGNvdmVycyBhdCBsZWFzdCBhIHdob2xlIHBhZ2UsIG9yIGlmIGl0IHN0YXJ0cyBhdCB0aGUgCisJCQkJICAgYmVnaW5uaW5nIG9mIGEgcGFnZSBhbmQgcnVucyB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLCBvciBpZiAKKwkJCQkgICBpdCdzIGEgaG9sZSBub2RlLCBtYXJrIGl0IFJFRl9QUklTVElORSwgZWxzZSBSRUZfTk9STUFMLiAKKworCQkJCSAgIElmIGl0J3MgYWN0dWFsbHkgb3ZlcmxhcHBlZCwgaXQnbGwgZ2V0IG1hZGUgTk9STUFMIChvciBPQlNPTEVURSkgCisJCQkJICAgd2hlbiB0aGUgb3ZlcmxhcHBpbmcgbm9kZShzKSBnZXQgYWRkZWQgdG8gdGhlIHRyZWUgYW55d2F5LiAKKwkJCQkqLworCQkJCWlmICgoamUzMl90b19jcHUobm9kZS5pLmRzaXplKSA+PSBQQUdFX0NBQ0hFX1NJWkUpIHx8CisJCQkJICAgICggKChqZTMyX3RvX2NwdShub2RlLmkub2Zmc2V0KSYoUEFHRV9DQUNIRV9TSVpFLTEpKT09MCkgJiYKKwkJCQkgICAgICAoamUzMl90b19jcHUobm9kZS5pLmRzaXplKStqZTMyX3RvX2NwdShub2RlLmkub2Zmc2V0KSA9PSAgamUzMl90b19jcHUobm9kZS5pLmlzaXplKSkpKSB7CisJCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJNYXJraW5nIG5vZGUgYXQgMHglMDh4IFJFRl9QUklTVElORVxuIiwgcmVmX29mZnNldChyZWYpKSk7CisJCQkJCXJlZi0+Zmxhc2hfb2Zmc2V0ID0gcmVmX29mZnNldChyZWYpIHwgUkVGX1BSSVNUSU5FOworCQkJCX0gZWxzZSB7CisJCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJNYXJraW5nIG5vZGUgYXQgMHglMDh4IFJFRl9OT1JNQUxcbiIsIHJlZl9vZmZzZXQocmVmKSkpOworCQkJCQlyZWYtPmZsYXNoX29mZnNldCA9IHJlZl9vZmZzZXQocmVmKSB8IFJFRl9OT1JNQUw7CisJCQkJfQorCQkJCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCQkJfQorCisJCQl0biA9IGpmZnMyX2FsbG9jX3RtcF9kbm9kZV9pbmZvKCk7CisJCQlpZiAoIXRuKSB7CisJCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgImFsbG9jIHRuIGZhaWxlZFxuIikpOworCQkJCWVyciA9IC1FTk9NRU07CisJCQkJZ290byBmcmVlX291dDsKKwkJCX0KKworCQkJdG4tPmZuID0gamZmczJfYWxsb2NfZnVsbF9kbm9kZSgpOworCQkJaWYgKCF0bi0+Zm4pIHsKKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiYWxsb2MgZm4gZmFpbGVkXG4iKSk7CisJCQkJZXJyID0gLUVOT01FTTsKKwkJCQlqZmZzMl9mcmVlX3RtcF9kbm9kZV9pbmZvKHRuKTsKKwkJCQlnb3RvIGZyZWVfb3V0OworCQkJfQorCQkJdG4tPnZlcnNpb24gPSBqZTMyX3RvX2NwdShub2RlLmkudmVyc2lvbik7CisJCQl0bi0+Zm4tPm9mcyA9IGplMzJfdG9fY3B1KG5vZGUuaS5vZmZzZXQpOworCQkJLyogVGhlcmUgd2FzIGEgYnVnIHdoZXJlIHdlIHdyb3RlIGhvbGUgbm9kZXMgb3V0IHdpdGgKKwkJCSAgIGNzaXplL2RzaXplIHN3YXBwZWQuIERlYWwgd2l0aCBpdCAqLworCQkJaWYgKG5vZGUuaS5jb21wciA9PSBKRkZTMl9DT01QUl9aRVJPICYmICFqZTMyX3RvX2NwdShub2RlLmkuZHNpemUpICYmIGplMzJfdG9fY3B1KG5vZGUuaS5jc2l6ZSkpCisJCQkJdG4tPmZuLT5zaXplID0gamUzMl90b19jcHUobm9kZS5pLmNzaXplKTsKKwkJCWVsc2UgLy8gbm9ybWFsIGNhc2UuLi4KKwkJCQl0bi0+Zm4tPnNpemUgPSBqZTMyX3RvX2NwdShub2RlLmkuZHNpemUpOworCQkJdG4tPmZuLT5yYXcgPSByZWY7CisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiZG5vZGUgQCUwOHg6IHZlciAldSwgb2Zmc2V0ICUwNHgsIGRzaXplICUwNHhcbiIsCisJCQkJICByZWZfb2Zmc2V0KHJlZiksIGplMzJfdG9fY3B1KG5vZGUuaS52ZXJzaW9uKSwKKwkJCQkgIGplMzJfdG9fY3B1KG5vZGUuaS5vZmZzZXQpLCBqZTMyX3RvX2NwdShub2RlLmkuZHNpemUpKSk7CisJCQlqZmZzMl9hZGRfdG5fdG9fbGlzdCh0biwgJnJldF90bik7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJaWYgKHJlZl9mbGFncyhyZWYpID09IFJFRl9VTkNIRUNLRUQpIHsKKwkJCQlzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViOworCQkJCXVpbnQzMl90IGxlbjsKKworCQkJCXByaW50ayhLRVJOX0VSUiAiRWVwLiBVbmtub3duIG5vZGUgdHlwZSAlMDR4IGF0ICUwOHggd2FzIG1hcmtlZCBSRUZfVU5DSEVDS0VEXG4iLAorCQkJCSAgICAgICBqZTE2X3RvX2NwdShub2RlLnUubm9kZXR5cGUpLCByZWZfb2Zmc2V0KHJlZikpOworCisJCQkJLyogTWFyayB0aGUgbm9kZSBhcyBoYXZpbmcgYmVlbiBjaGVja2VkIGFuZCBmaXggdGhlIGFjY291bnRpbmcgYWNjb3JkaW5nbHkgKi8KKwkJCQlzcGluX2xvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisJCQkJamViID0gJmMtPmJsb2Nrc1tyZWYtPmZsYXNoX29mZnNldCAvIGMtPnNlY3Rvcl9zaXplXTsKKwkJCQlsZW4gPSByZWZfdG90bGVuKGMsIGplYiwgcmVmKTsKKworCQkJCWplYi0+dXNlZF9zaXplICs9IGxlbjsKKwkJCQlqZWItPnVuY2hlY2tlZF9zaXplIC09IGxlbjsKKwkJCQljLT51c2VkX3NpemUgKz0gbGVuOworCQkJCWMtPnVuY2hlY2tlZF9zaXplIC09IGxlbjsKKworCQkJCW1hcmtfcmVmX25vcm1hbChyZWYpOworCQkJCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCQkJfQorCQkJbm9kZS51Lm5vZGV0eXBlID0gY3B1X3RvX2plMTYoSkZGUzJfTk9ERV9BQ0NVUkFURSB8IGplMTZfdG9fY3B1KG5vZGUudS5ub2RldHlwZSkpOworCQkJaWYgKGNyYzMyKDAsICZub2RlLCBzaXplb2Yoc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSktNCkgIT0gamUzMl90b19jcHUobm9kZS51Lmhkcl9jcmMpKSB7CisJCQkJLyogSG1tbS4gVGhpcyBzaG91bGQgaGF2ZSBiZWVuIGNhdWdodCBhdCBzY2FuIHRpbWUuICovCisJCQkJcHJpbnRrKEtFUk5fRVJSICJOb2RlIGhlYWRlciBDUkMgZmFpbGVkIGF0ICUwOHguIEJ1dCBpdCBtdXN0IGhhdmUgYmVlbiBPSyBlYXJsaWVyLlxuIiwKKwkJCQkgICAgICAgcmVmX29mZnNldChyZWYpKTsKKwkJCQlwcmludGsoS0VSTl9FUlIgIk5vZGUgd2FzOiB7ICUwNHgsICUwNHgsICUwOHgsICUwOHggfVxuIiwgCisJCQkJICAgICAgIGplMTZfdG9fY3B1KG5vZGUudS5tYWdpYyksIGplMTZfdG9fY3B1KG5vZGUudS5ub2RldHlwZSksIGplMzJfdG9fY3B1KG5vZGUudS50b3RsZW4pLAorCQkJCSAgICAgICBqZTMyX3RvX2NwdShub2RlLnUuaGRyX2NyYykpOworCQkJCWpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZShjLCByZWYpOworCQkJfSBlbHNlIHN3aXRjaChqZTE2X3RvX2NwdShub2RlLnUubm9kZXR5cGUpICYgSkZGUzJfQ09NUEFUX01BU0spIHsKKwkJCWNhc2UgSkZGUzJfRkVBVFVSRV9JTkNPTVBBVDoKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIlVua25vd24gSU5DT01QQVQgbm9kZXR5cGUgJTA0WCBhdCAlMDh4XG4iLCBqZTE2X3RvX2NwdShub2RlLnUubm9kZXR5cGUpLCByZWZfb2Zmc2V0KHJlZikpOworCQkJCS8qIEVFUCAqLworCQkJCUJVRygpOworCQkJCWJyZWFrOworCQkJY2FzZSBKRkZTMl9GRUFUVVJFX1JPQ09NUEFUOgorCQkJCXByaW50ayhLRVJOX05PVElDRSAiVW5rbm93biBST0NPTVBBVCBub2RldHlwZSAlMDRYIGF0ICUwOHhcbiIsIGplMTZfdG9fY3B1KG5vZGUudS5ub2RldHlwZSksIHJlZl9vZmZzZXQocmVmKSk7CisJCQkJaWYgKCEoYy0+ZmxhZ3MgJiBKRkZTMl9TQl9GTEFHX1JPKSkKKwkJCQkJQlVHKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEpGRlMyX0ZFQVRVUkVfUldDT01QQVRfQ09QWToKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIlVua25vd24gUldDT01QQVRfQ09QWSBub2RldHlwZSAlMDRYIGF0ICUwOHhcbiIsIGplMTZfdG9fY3B1KG5vZGUudS5ub2RldHlwZSksIHJlZl9vZmZzZXQocmVmKSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEpGRlMyX0ZFQVRVUkVfUldDT01QQVRfREVMRVRFOgorCQkJCXByaW50ayhLRVJOX05PVElDRSAiVW5rbm93biBSV0NPTVBBVF9ERUxFVEUgbm9kZXR5cGUgJTA0WCBhdCAlMDh4XG4iLCBqZTE2X3RvX2NwdShub2RlLnUubm9kZXR5cGUpLCByZWZfb2Zmc2V0KHJlZikpOworCQkJCWpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZShjLCByZWYpOworCQkJCWJyZWFrOworCQkJfQorCisJCX0KKwkJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCisJfQorCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCSp0bnAgPSByZXRfdG47CisJKmZkcCA9IHJldF9mZDsKKworCXJldHVybiAwOworCisgZnJlZV9vdXQ6CisJamZmczJfZnJlZV90bXBfZG5vZGVfaW5mb19saXN0KHJldF90bik7CisJamZmczJfZnJlZV9mdWxsX2RpcmVudF9saXN0KHJldF9mZCk7CisJcmV0dXJuIGVycjsKK30KKwordm9pZCBqZmZzMl9zZXRfaW5vY2FjaGVfc3RhdGUoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqaWMsIGludCBzdGF0ZSkKK3sKKwlzcGluX2xvY2soJmMtPmlub2NhY2hlX2xvY2spOworCWljLT5zdGF0ZSA9IHN0YXRlOworCXdha2VfdXAoJmMtPmlub2NhY2hlX3dxKTsKKwlzcGluX3VubG9jaygmYy0+aW5vY2FjaGVfbG9jayk7Cit9CisKKy8qIER1cmluZyBtb3VudCwgdGhpcyBuZWVkcyBubyBsb2NraW5nLiBEdXJpbmcgbm9ybWFsIG9wZXJhdGlvbiwgaXRzCisgICBjYWxsZXJzIHdhbnQgdG8gZG8gb3RoZXIgc3R1ZmYgd2hpbGUgc3RpbGwgaG9sZGluZyB0aGUgaW5vY2FjaGVfbG9jay4KKyAgIFJhdGhlciB0aGFuIGludHJvZHVjaW5nIHNwZWNpYWwgY2FzZSBnZXRfaW5vX2NhY2hlIGZ1bmN0aW9ucyBvciAKKyAgIGNhbGxiYWNrcywgd2UganVzdCBsZXQgdGhlIGNhbGxlciBkbyB0aGUgbG9ja2luZyBpdHNlbGYuICovCisgICAKK3N0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqamZmczJfZ2V0X2lub19jYWNoZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgdWludDMyX3QgaW5vKQoreworCXN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqcmV0OworCisJRDIocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2dldF9pbm9fY2FjaGUoKTogaW5vICV1XG4iLCBpbm8pKTsKKworCXJldCA9IGMtPmlub2NhY2hlX2xpc3RbaW5vICUgSU5PQ0FDSEVfSEFTSFNJWkVdOworCXdoaWxlIChyZXQgJiYgcmV0LT5pbm8gPCBpbm8pIHsKKwkJcmV0ID0gcmV0LT5uZXh0OworCX0KKwkKKwlpZiAocmV0ICYmIHJldC0+aW5vICE9IGlubykKKwkJcmV0ID0gTlVMTDsKKworCUQyKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9nZXRfaW5vX2NhY2hlIGZvdW5kICVwIGZvciBpbm8gJXVcbiIsIHJldCwgaW5vKSk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBqZmZzMl9hZGRfaW5vX2NhY2hlIChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2NhY2hlICpuZXcpCit7CisJc3RydWN0IGpmZnMyX2lub2RlX2NhY2hlICoqcHJldjsKKwlEMihwcmludGsoS0VSTl9ERUJVRyAiamZmczJfYWRkX2lub19jYWNoZTogQWRkICVwIChpbm8gIyV1KVxuIiwgbmV3LCBuZXctPmlubykpOworCXNwaW5fbG9jaygmYy0+aW5vY2FjaGVfbG9jayk7CisJCisJcHJldiA9ICZjLT5pbm9jYWNoZV9saXN0W25ldy0+aW5vICUgSU5PQ0FDSEVfSEFTSFNJWkVdOworCisJd2hpbGUgKCgqcHJldikgJiYgKCpwcmV2KS0+aW5vIDwgbmV3LT5pbm8pIHsKKwkJcHJldiA9ICYoKnByZXYpLT5uZXh0OworCX0KKwluZXctPm5leHQgPSAqcHJldjsKKwkqcHJldiA9IG5ldzsKKworCXNwaW5fdW5sb2NrKCZjLT5pbm9jYWNoZV9sb2NrKTsKK30KKwordm9pZCBqZmZzMl9kZWxfaW5vX2NhY2hlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfY2FjaGUgKm9sZCkKK3sKKwlzdHJ1Y3QgamZmczJfaW5vZGVfY2FjaGUgKipwcmV2OworCUQyKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9kZWxfaW5vX2NhY2hlOiBEZWwgJXAgKGlubyAjJXUpXG4iLCBvbGQsIG9sZC0+aW5vKSk7CisJc3Bpbl9sb2NrKCZjLT5pbm9jYWNoZV9sb2NrKTsKKwkKKwlwcmV2ID0gJmMtPmlub2NhY2hlX2xpc3Rbb2xkLT5pbm8gJSBJTk9DQUNIRV9IQVNIU0laRV07CisJCisJd2hpbGUgKCgqcHJldikgJiYgKCpwcmV2KS0+aW5vIDwgb2xkLT5pbm8pIHsKKwkJcHJldiA9ICYoKnByZXYpLT5uZXh0OworCX0KKwlpZiAoKCpwcmV2KSA9PSBvbGQpIHsKKwkJKnByZXYgPSBvbGQtPm5leHQ7CisJfQorCisJc3Bpbl91bmxvY2soJmMtPmlub2NhY2hlX2xvY2spOworfQorCit2b2lkIGpmZnMyX2ZyZWVfaW5vX2NhY2hlcyhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgamZmczJfaW5vZGVfY2FjaGUgKnRoaXMsICpuZXh0OworCQorCWZvciAoaT0wOyBpPElOT0NBQ0hFX0hBU0hTSVpFOyBpKyspIHsKKwkJdGhpcyA9IGMtPmlub2NhY2hlX2xpc3RbaV07CisJCXdoaWxlICh0aGlzKSB7CisJCQluZXh0ID0gdGhpcy0+bmV4dDsKKwkJCUQyKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9mcmVlX2lub19jYWNoZXM6IEZyZWVpbmcgaW5vICMldSBhdCAlcFxuIiwgdGhpcy0+aW5vLCB0aGlzKSk7CisJCQlqZmZzMl9mcmVlX2lub2RlX2NhY2hlKHRoaXMpOworCQkJdGhpcyA9IG5leHQ7CisJCX0KKwkJYy0+aW5vY2FjaGVfbGlzdFtpXSA9IE5VTEw7CisJfQorfQorCit2b2lkIGpmZnMyX2ZyZWVfcmF3X25vZGVfcmVmcyhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICp0aGlzLCAqbmV4dDsKKworCWZvciAoaT0wOyBpPGMtPm5yX2Jsb2NrczsgaSsrKSB7CisJCXRoaXMgPSBjLT5ibG9ja3NbaV0uZmlyc3Rfbm9kZTsKKwkJd2hpbGUodGhpcykgeworCQkJbmV4dCA9IHRoaXMtPm5leHRfcGh5czsKKwkJCWpmZnMyX2ZyZWVfcmF3X25vZGVfcmVmKHRoaXMpOworCQkJdGhpcyA9IG5leHQ7CisJCX0KKwkJYy0+YmxvY2tzW2ldLmZpcnN0X25vZGUgPSBjLT5ibG9ja3NbaV0ubGFzdF9ub2RlID0gTlVMTDsKKwl9Cit9CisJCitzdHJ1Y3QgamZmczJfbm9kZV9mcmFnICpqZmZzMl9sb29rdXBfbm9kZV9mcmFnKHN0cnVjdCByYl9yb290ICpmcmFndHJlZSwgdWludDMyX3Qgb2Zmc2V0KQoreworCS8qIFRoZSBjb21tb24gY2FzZSBpbiBsb29rdXAgaXMgdGhhdCB0aGVyZSB3aWxsIGJlIGEgbm9kZSAKKwkgICB3aGljaCBwcmVjaXNlbHkgbWF0Y2hlcy4gU28gd2UgZ28gbG9va2luZyBmb3IgdGhhdCBmaXJzdCAqLworCXN0cnVjdCByYl9ub2RlICpuZXh0OworCXN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKnByZXYgPSBOVUxMOworCXN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKmZyYWcgPSBOVUxMOworCisJRDIocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2xvb2t1cF9ub2RlX2ZyYWcoJXAsICVkKVxuIiwgZnJhZ3RyZWUsIG9mZnNldCkpOworCisJbmV4dCA9IGZyYWd0cmVlLT5yYl9ub2RlOworCisJd2hpbGUobmV4dCkgeworCQlmcmFnID0gcmJfZW50cnkobmV4dCwgc3RydWN0IGpmZnMyX25vZGVfZnJhZywgcmIpOworCisJCUQyKHByaW50ayhLRVJOX0RFQlVHICJDb25zaWRlcmluZyBmcmFnICVkLSVkICglcCkuIGxlZnQgJXAsIHJpZ2h0ICVwXG4iLAorCQkJICBmcmFnLT5vZnMsIGZyYWctPm9mcytmcmFnLT5zaXplLCBmcmFnLCBmcmFnLT5yYi5yYl9sZWZ0LCBmcmFnLT5yYi5yYl9yaWdodCkpOworCQlpZiAoZnJhZy0+b2ZzICsgZnJhZy0+c2l6ZSA8PSBvZmZzZXQpIHsKKwkJCUQyKHByaW50ayhLRVJOX0RFQlVHICJHb2luZyByaWdodCBmcm9tIGZyYWcgJWQtJWQsIGJlZm9yZSB0aGUgcmVnaW9uIHdlIGNhcmUgYWJvdXRcbiIsCisJCQkJICBmcmFnLT5vZnMsIGZyYWctPm9mcytmcmFnLT5zaXplKSk7CisJCQkvKiBSZW1lbWJlciB0aGUgY2xvc2VzdCBzbWFsbGVyIG1hdGNoIG9uIHRoZSB3YXkgZG93biAqLworCQkJaWYgKCFwcmV2IHx8IGZyYWctPm9mcyA+IHByZXYtPm9mcykKKwkJCQlwcmV2ID0gZnJhZzsKKwkJCW5leHQgPSBmcmFnLT5yYi5yYl9yaWdodDsKKwkJfSBlbHNlIGlmIChmcmFnLT5vZnMgPiBvZmZzZXQpIHsKKwkJCUQyKHByaW50ayhLRVJOX0RFQlVHICJHb2luZyBsZWZ0IGZyb20gZnJhZyAlZC0lZCwgYWZ0ZXIgdGhlIHJlZ2lvbiB3ZSBjYXJlIGFib3V0XG4iLAorCQkJCSAgZnJhZy0+b2ZzLCBmcmFnLT5vZnMrZnJhZy0+c2l6ZSkpOworCQkJbmV4dCA9IGZyYWctPnJiLnJiX2xlZnQ7CisJCX0gZWxzZSB7CisJCQlEMihwcmludGsoS0VSTl9ERUJVRyAiUmV0dXJuaW5nIGZyYWcgJWQsJWQsIG1hdGNoZWRcbiIsCisJCQkJICBmcmFnLT5vZnMsIGZyYWctPm9mcytmcmFnLT5zaXplKSk7CisJCQlyZXR1cm4gZnJhZzsKKwkJfQorCX0KKworCS8qIEV4YWN0IG1hdGNoIG5vdCBmb3VuZC4gR28gYmFjayB1cCBsb29raW5nIGF0IGVhY2ggcGFyZW50LAorCSAgIGFuZCByZXR1cm4gdGhlIGNsb3Nlc3Qgc21hbGxlciBvbmUgKi8KKworCWlmIChwcmV2KQorCQlEMihwcmludGsoS0VSTl9ERUJVRyAiTm8gbWF0Y2guIFJldHVybmluZyBmcmFnICVkLCVkLCBjbG9zZXN0IHByZXZpb3VzXG4iLAorCQkJICBwcmV2LT5vZnMsIHByZXYtPm9mcytwcmV2LT5zaXplKSk7CisJZWxzZSAKKwkJRDIocHJpbnRrKEtFUk5fREVCVUcgIlJldHVybmluZyBOVUxMLCBlbXB0eSBmcmFndHJlZVxuIikpOworCQorCXJldHVybiBwcmV2OworfQorCisvKiBQYXNzICdjJyBhcmd1bWVudCB0byBpbmRpY2F0ZSB0aGF0IG5vZGVzIHNob3VsZCBiZSBtYXJrZWQgb2Jzb2xldGUgYXMKKyAgIHRoZXkncmUga2lsbGVkLiAqLwordm9pZCBqZmZzMl9raWxsX2ZyYWd0cmVlKHN0cnVjdCByYl9yb290ICpyb290LCBzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYykKK3sKKwlzdHJ1Y3QgamZmczJfbm9kZV9mcmFnICpmcmFnOworCXN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKnBhcmVudDsKKworCWlmICghcm9vdC0+cmJfbm9kZSkKKwkJcmV0dXJuOworCisJZnJhZyA9IChyYl9lbnRyeShyb290LT5yYl9ub2RlLCBzdHJ1Y3QgamZmczJfbm9kZV9mcmFnLCByYikpOworCisJd2hpbGUoZnJhZykgeworCQlpZiAoZnJhZy0+cmIucmJfbGVmdCkgeworCQkJRDIocHJpbnRrKEtFUk5fREVCVUcgIkdvaW5nIGxlZnQgZnJvbSBmcmFnICglcCkgJWQtJWRcbiIsIAorCQkJCSAgZnJhZywgZnJhZy0+b2ZzLCBmcmFnLT5vZnMrZnJhZy0+c2l6ZSkpOworCQkJZnJhZyA9IGZyYWdfbGVmdChmcmFnKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChmcmFnLT5yYi5yYl9yaWdodCkgeworCQkJRDIocHJpbnRrKEtFUk5fREVCVUcgIkdvaW5nIHJpZ2h0IGZyb20gZnJhZyAoJXApICVkLSVkXG4iLCAKKwkJCQkgIGZyYWcsIGZyYWctPm9mcywgZnJhZy0+b2ZzK2ZyYWctPnNpemUpKTsKKwkJCWZyYWcgPSBmcmFnX3JpZ2h0KGZyYWcpOworCQkJY29udGludWU7CisJCX0KKworCQlEMihwcmludGsoS0VSTl9ERUJVRyAiamZmczJfa2lsbF9mcmFndHJlZTogZnJhZyBhdCAweCV4LTB4JXg6IG5vZGUgJXAsIGZyYWdzICVkLS1cbiIsCisJCQkgIGZyYWctPm9mcywgZnJhZy0+b2ZzK2ZyYWctPnNpemUsIGZyYWctPm5vZGUsCisJCQkgIGZyYWctPm5vZGU/ZnJhZy0+bm9kZS0+ZnJhZ3M6MCkpOworCQkJCisJCWlmIChmcmFnLT5ub2RlICYmICEoLS1mcmFnLT5ub2RlLT5mcmFncykpIHsKKwkJCS8qIE5vdCBhIGhvbGUsIGFuZCBpdCdzIHRoZSBmaW5hbCByZW1haW5pbmcgZnJhZyAKKwkJCSAgIG9mIHRoaXMgbm9kZS4gRnJlZSB0aGUgbm9kZSAqLworCQkJaWYgKGMpCisJCQkJamZmczJfbWFya19ub2RlX29ic29sZXRlKGMsIGZyYWctPm5vZGUtPnJhdyk7CisJCQkKKwkJCWpmZnMyX2ZyZWVfZnVsbF9kbm9kZShmcmFnLT5ub2RlKTsKKwkJfQorCQlwYXJlbnQgPSBmcmFnX3BhcmVudChmcmFnKTsKKwkJaWYgKHBhcmVudCkgeworCQkJaWYgKGZyYWdfbGVmdChwYXJlbnQpID09IGZyYWcpCisJCQkJcGFyZW50LT5yYi5yYl9sZWZ0ID0gTlVMTDsKKwkJCWVsc2UgCisJCQkJcGFyZW50LT5yYi5yYl9yaWdodCA9IE5VTEw7CisJCX0KKworCQlqZmZzMl9mcmVlX25vZGVfZnJhZyhmcmFnKTsKKwkJZnJhZyA9IHBhcmVudDsKKworCQljb25kX3Jlc2NoZWQoKTsKKwl9Cit9CisKK3ZvaWQgamZmczJfZnJhZ3RyZWVfaW5zZXJ0KHN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKm5ld2ZyYWcsIHN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKmJhc2UpCit7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9ICZiYXNlLT5yYjsKKwlzdHJ1Y3QgcmJfbm9kZSAqKmxpbmsgPSAmcGFyZW50OworCisJRDIocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2ZyYWd0cmVlX2luc2VydCglcDsgJWQtJWQsICVwKVxuIiwgbmV3ZnJhZywgCisJCSAgbmV3ZnJhZy0+b2ZzLCBuZXdmcmFnLT5vZnMrbmV3ZnJhZy0+c2l6ZSwgYmFzZSkpOworCisJd2hpbGUgKCpsaW5rKSB7CisJCXBhcmVudCA9ICpsaW5rOworCQliYXNlID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgamZmczJfbm9kZV9mcmFnLCByYik7CisJCisJCUQyKHByaW50ayhLRVJOX0RFQlVHICJmcmFndHJlZV9pbnNlcnQgY29uc2lkZXJpbmcgZnJhZyBhdCAweCV4XG4iLCBiYXNlLT5vZnMpKTsKKwkJaWYgKG5ld2ZyYWctPm9mcyA+IGJhc2UtPm9mcykKKwkJCWxpbmsgPSAmYmFzZS0+cmIucmJfcmlnaHQ7CisJCWVsc2UgaWYgKG5ld2ZyYWctPm9mcyA8IGJhc2UtPm9mcykKKwkJCWxpbmsgPSAmYmFzZS0+cmIucmJfbGVmdDsKKwkJZWxzZSB7CisJCQlwcmludGsoS0VSTl9DUklUICJEdXBsaWNhdGUgZnJhZyBhdCAlMDh4ICglcCwlcClcbiIsIG5ld2ZyYWctPm9mcywgbmV3ZnJhZywgYmFzZSk7CisJCQlCVUcoKTsKKwkJfQorCX0KKworCXJiX2xpbmtfbm9kZSgmbmV3ZnJhZy0+cmIsICZiYXNlLT5yYiwgbGluayk7Cit9CmRpZmYgLS1naXQgYS9mcy9qZmZzMi9ub2RlbGlzdC5oIGIvZnMvamZmczIvbm9kZWxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDg2NGQwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZmczIvbm9kZWxpc3QuaApAQCAtMCwwICsxLDQ3MyBAQAorLyoKKyAqIEpGRlMyIC0tIEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBWZXJzaW9uIDIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIENyZWF0ZWQgYnkgRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPgorICoKKyAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCisgKgorICogJElkOiBub2RlbGlzdC5oLHYgMS4xMjYgMjAwNC8xMS8xOSAxNTowNjoyOSBkZWRla2luZCBFeHAgJAorICoKKyAqLworCisjaWZuZGVmIF9fSkZGUzJfTk9ERUxJU1RfSF9fCisjZGVmaW5lIF9fSkZGUzJfTk9ERUxJU1RfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvamZmczIuaD4KKyNpbmNsdWRlIDxsaW51eC9qZmZzMl9mc19zYi5oPgorI2luY2x1ZGUgPGxpbnV4L2pmZnMyX2ZzX2kuaD4KKworI2lmZGVmIF9fRUNPUworI2luY2x1ZGUgIm9zLWVjb3MuaCIKKyNlbHNlCisjaW5jbHVkZSA8bGludXgvbXRkL2NvbXBhdG1hYy5oPiAvKiBGb3IgbWluL21heCBpbiBvbGRlciBrZXJuZWxzICovCisjaW5jbHVkZSAib3MtbGludXguaCIKKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19KRkZTMl9GU19ERUJVRworI2RlZmluZSBDT05GSUdfSkZGUzJfRlNfREVCVUcgMQorI2VuZGlmCisKKyNpZiBDT05GSUdfSkZGUzJfRlNfREVCVUcgPiAwCisjZGVmaW5lIEQxKHgpIHgKKyNlbHNlCisjZGVmaW5lIEQxKHgpCisjZW5kaWYKKworI2lmIENPTkZJR19KRkZTMl9GU19ERUJVRyA+IDEKKyNkZWZpbmUgRDIoeCkgeAorI2Vsc2UKKyNkZWZpbmUgRDIoeCkKKyNlbmRpZgorCisjZGVmaW5lIEpGRlMyX05BVElWRV9FTkRJQU4KKworLyogTm90ZSB3ZSBoYW5kbGUgbW9kZSBiaXRzIGNvbnZlcnNpb24gZnJvbSBKRkZTMiAoaS5lLiBMaW51eCkgdG8vZnJvbQorICAgd2hhdGV2ZXIgT1Mgd2UncmUgYWN0dWFsbHkgcnVubmluZyBvbiBoZXJlIHRvby4gKi8KKworI2lmIGRlZmluZWQoSkZGUzJfTkFUSVZFX0VORElBTikKKyNkZWZpbmUgY3B1X3RvX2plMTYoeCkgKChqaW50MTZfdCl7eH0pCisjZGVmaW5lIGNwdV90b19qZTMyKHgpICgoamludDMyX3Qpe3h9KQorI2RlZmluZSBjcHVfdG9famVtb2RlKHgpICgoam1vZGVfdCl7b3NfdG9famZmczJfbW9kZSh4KX0pCisKKyNkZWZpbmUgamUxNl90b19jcHUoeCkgKCh4KS52MTYpCisjZGVmaW5lIGplMzJfdG9fY3B1KHgpICgoeCkudjMyKQorI2RlZmluZSBqZW1vZGVfdG9fY3B1KHgpIChqZmZzMl90b19vc19tb2RlKCh4KS5tKSkKKyNlbGlmIGRlZmluZWQoSkZGUzJfQklHX0VORElBTikKKyNkZWZpbmUgY3B1X3RvX2plMTYoeCkgKChqaW50MTZfdCl7Y3B1X3RvX2JlMTYoeCl9KQorI2RlZmluZSBjcHVfdG9famUzMih4KSAoKGppbnQzMl90KXtjcHVfdG9fYmUzMih4KX0pCisjZGVmaW5lIGNwdV90b19qZW1vZGUoeCkgKChqbW9kZV90KXtjcHVfdG9fYmUzMihvc190b19qZmZzMl9tb2RlKHgpKX0pCisKKyNkZWZpbmUgamUxNl90b19jcHUoeCkgKGJlMTZfdG9fY3B1KHgudjE2KSkKKyNkZWZpbmUgamUzMl90b19jcHUoeCkgKGJlMzJfdG9fY3B1KHgudjMyKSkKKyNkZWZpbmUgamVtb2RlX3RvX2NwdSh4KSAoYmUzMl90b19jcHUoamZmczJfdG9fb3NfbW9kZSgoeCkubSkpKQorI2VsaWYgZGVmaW5lZChKRkZTMl9MSVRUTEVfRU5ESUFOKQorI2RlZmluZSBjcHVfdG9famUxNih4KSAoKGppbnQxNl90KXtjcHVfdG9fbGUxNih4KX0pCisjZGVmaW5lIGNwdV90b19qZTMyKHgpICgoamludDMyX3Qpe2NwdV90b19sZTMyKHgpfSkKKyNkZWZpbmUgY3B1X3RvX2plbW9kZSh4KSAoKGptb2RlX3Qpe2NwdV90b19sZTMyKG9zX3RvX2pmZnMyX21vZGUoeCkpfSkKKworI2RlZmluZSBqZTE2X3RvX2NwdSh4KSAobGUxNl90b19jcHUoeC52MTYpKQorI2RlZmluZSBqZTMyX3RvX2NwdSh4KSAobGUzMl90b19jcHUoeC52MzIpKQorI2RlZmluZSBqZW1vZGVfdG9fY3B1KHgpIChsZTMyX3RvX2NwdShqZmZzMl90b19vc19tb2RlKCh4KS5tKSkpCisjZWxzZSAKKyNlcnJvciB3aWJibGUKKyNlbmRpZgorCisvKgorICBUaGlzIGlzIGFsbCB3ZSBuZWVkIHRvIGtlZXAgaW4tY29yZSBmb3IgZWFjaCByYXcgbm9kZSBkdXJpbmcgbm9ybWFsCisgIG9wZXJhdGlvbi4gQXMgYW5kIHdoZW4gd2UgZG8gcmVhZF9pbm9kZSBvbiBhIHBhcnRpY3VsYXIgaW5vZGUsIHdlIGNhbgorICBzY2FuIHRoZSBub2RlcyB3aGljaCBhcmUgbGlzdGVkIGZvciBpdCBhbmQgYnVpbGQgdXAgYSBwcm9wZXIgbWFwIG9mIAorICB3aGljaCBub2RlcyBhcmUgY3VycmVudGx5IHZhbGlkLiBKRkZTdjEgYWx3YXlzIHVzZWQgdG8ga2VlcCB0aGF0IHdob2xlCisgIG1hcCBpbiBjb3JlIGZvciBlYWNoIGlub2RlLgorKi8KK3N0cnVjdCBqZmZzMl9yYXdfbm9kZV9yZWYKK3sKKwlzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICpuZXh0X2luX2lubzsgLyogUG9pbnRzIHRvIHRoZSBuZXh0IHJhd19ub2RlX3JlZgorCQlmb3IgdGhpcyBpbm9kZS4gSWYgdGhpcyBpcyB0aGUgbGFzdCwgaXQgcG9pbnRzIHRvIHRoZSBpbm9kZV9jYWNoZQorCQlmb3IgdGhpcyBpbm9kZSBpbnN0ZWFkLiBUaGUgaW5vZGVfY2FjaGUgd2lsbCBoYXZlIE5VTEwgaW4gdGhlIGZpcnN0CisJCXdvcmQgc28geW91IGtub3cgd2hlbiB5b3UndmUgZ290IHRoZXJlIDopICovCisJc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqbmV4dF9waHlzOworCXVpbnQzMl90IGZsYXNoX29mZnNldDsKKwl1aW50MzJfdCBfX3RvdGxlbjsgLyogVGhpcyBtYXkgZGllOyB1c2UgcmVmX3RvdGxlbihjLCBqZWIsICkgYmVsb3cgKi8KK307CisKKyAgICAgICAgLyogZmxhc2hfb2Zmc2V0ICYgMyBhbHdheXMgaGFzIHRvIGJlIHplcm8sIGJlY2F1c2Ugbm9kZXMgYXJlCisJICAgYWx3YXlzIGFsaWduZWQgYXQgNCBieXRlcy4gU28gd2UgaGF2ZSBhIGNvdXBsZSBvZiBleHRyYSBiaXRzCisJICAgdG8gcGxheSB3aXRoLCB3aGljaCBpbmRpY2F0ZSB0aGUgbm9kZSdzIHN0YXR1czsgc2VlIGJlbG93OiAqLyAKKyNkZWZpbmUgUkVGX1VOQ0hFQ0tFRAkwCS8qIFdlIGhhdmVuJ3QgeWV0IGNoZWNrZWQgdGhlIENSQyBvciBidWlsdCBpdHMgaW5vZGUgKi8KKyNkZWZpbmUgUkVGX09CU09MRVRFCTEJLyogT2Jzb2xldGUsIGNhbiBiZSBjb21wbGV0ZWx5IGlnbm9yZWQgKi8KKyNkZWZpbmUgUkVGX1BSSVNUSU5FCTIJLyogQ29tcGxldGVseSBjbGVhbi4gR0Mgd2l0aG91dCBsb29raW5nICovCisjZGVmaW5lIFJFRl9OT1JNQUwJMwkvKiBQb3NzaWJseSBvdmVybGFwcGVkLiBSZWFkIHRoZSBwYWdlIGFuZCB3cml0ZSBhZ2FpbiBvbiBHQyAqLworI2RlZmluZSByZWZfZmxhZ3MocmVmKQkJKChyZWYpLT5mbGFzaF9vZmZzZXQgJiAzKQorI2RlZmluZSByZWZfb2Zmc2V0KHJlZikJCSgocmVmKS0+Zmxhc2hfb2Zmc2V0ICYgfjMpCisjZGVmaW5lIHJlZl9vYnNvbGV0ZShyZWYpCSgoKHJlZiktPmZsYXNoX29mZnNldCAmIDMpID09IFJFRl9PQlNPTEVURSkKKyNkZWZpbmUgbWFya19yZWZfbm9ybWFsKHJlZikgICAgZG8geyAocmVmKS0+Zmxhc2hfb2Zmc2V0ID0gcmVmX29mZnNldChyZWYpIHwgUkVGX05PUk1BTDsgfSB3aGlsZSgwKQorCisvKiBGb3IgZWFjaCBpbm9kZSBpbiB0aGUgZmlsZXN5c3RlbSwgd2UgbmVlZCB0byBrZWVwIGEgcmVjb3JkIG9mCisgICBubGluaywgYmVjYXVzZSBpdCB3b3VsZCBiZSBhIFBJVEEgdG8gc2NhbiB0aGUgd2hvbGUgZGlyZWN0b3J5IHRyZWUKKyAgIGF0IHJlYWRfaW5vZGUoKSB0aW1lIHRvIGNhbGN1bGF0ZSBpdCwgYW5kIHRvIGtlZXAgc3VmZmljaWVudCBpbmZvcm1hdGlvbgorICAgaW4gdGhlIHJhd19ub2RlX3JlZiAoYmFzaWNhbGx5IGJvdGggcGFyZW50IGFuZCBjaGlsZCBpbm9kZSBudW1iZXIgZm9yIAorICAgZGlyZW50IG5vZGVzKSB3b3VsZCB0YWtlIG1vcmUgc3BhY2UgdGhhbiB0aGlzIGRvZXMuIFdlIGFsc28ga2VlcAorICAgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBwaHlzaWNhbCBub2RlIHdoaWNoIGlzIHBhcnQgb2YgdGhpcyBpbm9kZSwgdG9vLgorKi8KK3N0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSB7CisJc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICpzY2FuX2RlbnRzOyAvKiBVc2VkIGR1cmluZyBzY2FuIHRvIGhvbGQKKwkJdGVtcG9yYXJ5IGxpc3RzIG9mIGRpcmVudHMsIGFuZCBsYXRlciBtdXN0IGJlIHNldCB0bworCQlOVUxMIHRvIG1hcmsgdGhlIGVuZCBvZiB0aGUgcmF3X25vZGVfcmVmLT5uZXh0X2luX2lubworCQljaGFpbi4gKi8KKwlzdHJ1Y3QgamZmczJfaW5vZGVfY2FjaGUgKm5leHQ7CisJc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqbm9kZXM7CisJdWludDMyX3QgaW5vOworCWludCBubGluazsKKwlpbnQgc3RhdGU7Cit9OworCisvKiBJbm9kZSBzdGF0ZXMgZm9yICdzdGF0ZScgYWJvdmUuIFdlIG5lZWQgdGhlICdHQycgc3RhdGUgdG8gcHJldmVudAorICAgc29tZW9uZSBmcm9tIGRvaW5nIGEgcmVhZF9pbm9kZSgpIHdoaWxlIHdlJ3JlIG1vdmluZyBhICdSRUZfUFJJU1RJTkUnCisgICBub2RlIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCBhbGwgdGhlIGlnZXQoKSBub25zZW5zZSAqLworI2RlZmluZSBJTk9fU1RBVEVfVU5DSEVDS0VECTAJLyogQ1JDIGNoZWNrcyBub3QgeWV0IGRvbmUgKi8KKyNkZWZpbmUgSU5PX1NUQVRFX0NIRUNLSU5HCTEJLyogQ1JDIGNoZWNrcyBpbiBwcm9ncmVzcyAqLworI2RlZmluZSBJTk9fU1RBVEVfUFJFU0VOVAkyCS8qIEluIGNvcmUgKi8KKyNkZWZpbmUgSU5PX1NUQVRFX0NIRUNLRURBQlNFTlQJMwkvKiBDaGVja2VkLCBjbGVhcmVkIGFnYWluICovCisjZGVmaW5lIElOT19TVEFURV9HQwkJNAkvKiBHQ2luZyBhICdwcmlzdGluZScgbm9kZSAqLworI2RlZmluZSBJTk9fU1RBVEVfUkVBRElORwk1CS8qIEluIHJlYWRfaW5vZGUoKSAqLworCisjZGVmaW5lIElOT0NBQ0hFX0hBU0hTSVpFIDEyOAorCisvKgorICBMYXJnZXIgcmVwcmVzZW50YXRpb24gb2YgYSByYXcgbm9kZSwga2VwdCBpbi1jb3JlIG9ubHkgd2hlbiB0aGUgCisgIHN0cnVjdCBpbm9kZSBmb3IgdGhpcyBwYXJ0aWN1bGFyIGlubyBpcyBpbnN0YW50aWF0ZWQuCisqLworCitzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZQoreworCXN0cnVjdCBqZmZzMl9yYXdfbm9kZV9yZWYgKnJhdzsKKwl1aW50MzJfdCBvZnM7IC8qIFRoZSBvZmZzZXQgdG8gd2hpY2ggdGhlIGRhdGEgb2YgdGhpcyBub2RlIGJlbG9uZ3MgKi8KKwl1aW50MzJfdCBzaXplOworCXVpbnQzMl90IGZyYWdzOyAvKiBOdW1iZXIgb2YgZnJhZ21lbnRzIHdoaWNoIGN1cnJlbnRseSByZWZlcgorCQkJdG8gdGhpcyBub2RlLiBXaGVuIHRoaXMgcmVhY2hlcyB6ZXJvLCAKKwkJCXRoZSBub2RlIGlzIG9ic29sZXRlLiAgKi8KK307CisKKy8qIAorICAgRXZlbiBsYXJnZXIgcmVwcmVzZW50YXRpb24gb2YgYSByYXcgbm9kZSwga2VwdCBpbi1jb3JlIG9ubHkgd2hpbGUKKyAgIHdlJ3JlIGFjdHVhbGx5IGJ1aWxkaW5nIHVwIHRoZSBvcmlnaW5hbCBtYXAgb2Ygd2hpY2ggbm9kZXMgZ28gd2hlcmUsCisgICBpbiByZWFkX2lub2RlKCkKKyovCitzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8KK3sKKwlzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKm5leHQ7CisJc3RydWN0IGpmZnMyX2Z1bGxfZG5vZGUgKmZuOworCXVpbnQzMl90IHZlcnNpb247Cit9OyAgICAgICAKKworc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50Cit7CisJc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqcmF3OworCXN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqbmV4dDsKKwl1aW50MzJfdCB2ZXJzaW9uOworCXVpbnQzMl90IGlubzsgLyogPT0gemVybyBmb3IgdW5saW5rICovCisJdW5zaWduZWQgaW50IG5oYXNoOworCXVuc2lnbmVkIGNoYXIgdHlwZTsKKwl1bnNpZ25lZCBjaGFyIG5hbWVbMF07Cit9OworCisvKgorICBGcmFnbWVudHMgLSB1c2VkIHRvIGJ1aWxkIGEgbWFwIG9mIHdoaWNoIHJhdyBub2RlIHRvIG9idGFpbiAKKyAgZGF0YSBmcm9tIGZvciBlYWNoIHBhcnQgb2YgdGhlIGlubworKi8KK3N0cnVjdCBqZmZzMl9ub2RlX2ZyYWcKK3sKKwlzdHJ1Y3QgcmJfbm9kZSByYjsKKwlzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZSAqbm9kZTsgLyogTlVMTCBmb3IgaG9sZXMgKi8KKwl1aW50MzJfdCBzaXplOworCXVpbnQzMl90IG9mczsgLyogVGhlIG9mZnNldCB0byB3aGljaCB0aGlzIGZyYWdtZW50IGJlbG9uZ3MgKi8KK307CisKK3N0cnVjdCBqZmZzMl9lcmFzZWJsb2NrCit7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCWludCBiYWRfY291bnQ7CisJdWludDMyX3Qgb2Zmc2V0OwkJLyogb2YgdGhpcyBibG9jayBpbiB0aGUgTVREICovCisKKwl1aW50MzJfdCB1bmNoZWNrZWRfc2l6ZTsKKwl1aW50MzJfdCB1c2VkX3NpemU7CisJdWludDMyX3QgZGlydHlfc2l6ZTsKKwl1aW50MzJfdCB3YXN0ZWRfc2l6ZTsKKwl1aW50MzJfdCBmcmVlX3NpemU7CS8qIE5vdGUgdGhhdCBzZWN0b3Jfc2l6ZSAtIGZyZWVfc2l6ZQorCQkJCSAgIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBmcmVlIHNwYWNlICovCisJc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqZmlyc3Rfbm9kZTsKKwlzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICpsYXN0X25vZGU7CisKKwlzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICpnY19ub2RlOwkvKiBOZXh0IG5vZGUgdG8gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQgKi8KK307CisKKyNkZWZpbmUgQUNDVF9TQU5JVFlfQ0hFQ0soYywgamViKSBkbyB7IFwKKwkJc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKl9fX2ogPSBqZWI7IFwKKwkJaWYgKChfX19qKSAmJiBfX19qLT51c2VkX3NpemUgKyBfX19qLT5kaXJ0eV9zaXplICsgX19fai0+ZnJlZV9zaXplICsgX19fai0+d2FzdGVkX3NpemUgKyBfX19qLT51bmNoZWNrZWRfc2l6ZSAhPSBjLT5zZWN0b3Jfc2l6ZSkgeyBcCisJCXByaW50ayhLRVJOX05PVElDRSAiRWVlcC4gU3BhY2UgYWNjb3VudGluZyBmb3IgYmxvY2sgYXQgMHglMDh4IGlzIHNjcmV3ZWRcbiIsIF9fX2otPm9mZnNldCk7IFwKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJmcmVlIDB4JTA4eCArIGRpcnR5IDB4JTA4eCArIHVzZWQgJTA4eCArIHdhc3RlZCAlMDh4ICsgdW5jaGVja2VkICUwOHggIT0gdG90YWwgJTA4eFxuIiwgXAorCQlfX19qLT5mcmVlX3NpemUsIF9fX2otPmRpcnR5X3NpemUsIF9fX2otPnVzZWRfc2l6ZSwgX19fai0+d2FzdGVkX3NpemUsIF9fX2otPnVuY2hlY2tlZF9zaXplLCBjLT5zZWN0b3Jfc2l6ZSk7IFwKKwkJQlVHKCk7IFwKKwl9IFwKKwlpZiAoYy0+dXNlZF9zaXplICsgYy0+ZGlydHlfc2l6ZSArIGMtPmZyZWVfc2l6ZSArIGMtPmVyYXNpbmdfc2l6ZSArIGMtPmJhZF9zaXplICsgYy0+d2FzdGVkX3NpemUgKyBjLT51bmNoZWNrZWRfc2l6ZSAhPSBjLT5mbGFzaF9zaXplKSB7IFwKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJFZWVwLiBTcGFjZSBhY2NvdW50aW5nIHN1cGVyYmxvY2sgaW5mbyBpcyBzY3Jld2VkXG4iKTsgXAorCQlwcmludGsoS0VSTl9OT1RJQ0UgImZyZWUgMHglMDh4ICsgZGlydHkgMHglMDh4ICsgdXNlZCAlMDh4ICsgZXJhc2luZyAlMDh4ICsgYmFkICUwOHggKyB3YXN0ZWQgJTA4eCArIHVuY2hlY2tlZCAlMDh4ICE9IHRvdGFsICUwOHhcbiIsIFwKKwkJYy0+ZnJlZV9zaXplLCBjLT5kaXJ0eV9zaXplLCBjLT51c2VkX3NpemUsIGMtPmVyYXNpbmdfc2l6ZSwgYy0+YmFkX3NpemUsIGMtPndhc3RlZF9zaXplLCBjLT51bmNoZWNrZWRfc2l6ZSwgYy0+Zmxhc2hfc2l6ZSk7IFwKKwkJQlVHKCk7IFwKKwl9IFwKK30gd2hpbGUoMCkKKworc3RhdGljIGlubGluZSB2b2lkIHBhcmFub2lhX2ZhaWxlZF9kdW1wKHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWIpCit7CisJc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqcmVmOworCWludCBpPTA7CisKKwlwcmludGsoS0VSTl9OT1RJQ0UpOworCWZvciAocmVmID0gamViLT5maXJzdF9ub2RlOyByZWY7IHJlZiA9IHJlZi0+bmV4dF9waHlzKSB7CisJCXByaW50aygiJTA4eC0+IiwgcmVmX29mZnNldChyZWYpKTsKKwkJaWYgKCsraSA9PSA4KSB7CisJCQlpID0gMDsKKwkJCXByaW50aygiXG4iIEtFUk5fTk9USUNFKTsKKwkJfQorCX0KKwlwcmludGsoIlxuIik7Cit9CisKKworI2RlZmluZSBBQ0NUX1BBUkFOT0lBX0NIRUNLKGplYikgZG8geyBcCisJCXVpbnQzMl90IG15X3VzZWRfc2l6ZSA9IDA7IFwKKwkJdWludDMyX3QgbXlfdW5jaGVja2VkX3NpemUgPSAwOyBcCisJCXN0cnVjdCBqZmZzMl9yYXdfbm9kZV9yZWYgKnJlZjIgPSBqZWItPmZpcnN0X25vZGU7IFwKKwkJd2hpbGUgKHJlZjIpIHsgXAorCQkJaWYgKHVubGlrZWx5KHJlZjItPmZsYXNoX29mZnNldCA8IGplYi0+b2Zmc2V0IHx8IFwKKwkJCQkgICAgIHJlZjItPmZsYXNoX29mZnNldCA+IGplYi0+b2Zmc2V0ICsgYy0+c2VjdG9yX3NpemUpKSB7IFwKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIk5vZGUgJTA4eCBzaG91bGRuJ3QgYmUgaW4gYmxvY2sgYXQgJTA4eCFcbiIsIFwKKwkJCQkgICAgICAgcmVmX29mZnNldChyZWYyKSwgamViLT5vZmZzZXQpOyBcCisJCQkJcGFyYW5vaWFfZmFpbGVkX2R1bXAoamViKTsgXAorCQkJCUJVRygpOyBcCisJCQl9IFwKKwkJCWlmIChyZWZfZmxhZ3MocmVmMikgPT0gUkVGX1VOQ0hFQ0tFRCkgXAorCQkJCW15X3VuY2hlY2tlZF9zaXplICs9IHJlZl90b3RsZW4oYywgamViLCByZWYyKTsgXAorCQkJZWxzZSBpZiAoIXJlZl9vYnNvbGV0ZShyZWYyKSkgXAorCQkJCW15X3VzZWRfc2l6ZSArPSByZWZfdG90bGVuKGMsIGplYiwgcmVmMik7IFwKKwkJCWlmICh1bmxpa2VseSgoIXJlZjItPm5leHRfcGh5cykgIT0gKHJlZjIgPT0gamViLT5sYXN0X25vZGUpKSkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVmMi0+bmV4dF9waHlzKSBcCisJCQkJICAgICAgIHByaW50aygicmVmIGZvciBub2RlIGF0ICVwIChwaHlzICUwOHgpIGhhcyBuZXh0X3BoeXMtPiVwICgtLS0tKSwgbGFzdF9ub2RlLT4lcCAocGh5cyAlMDh4KVxuIiwgXAorCQkJCSAgICAgICAgICAgICByZWYyLCByZWZfb2Zmc2V0KHJlZjIpLCByZWYyLT5uZXh0X3BoeXMsIFwKKwkJCQkgICAgICAgICAgICAgamViLT5sYXN0X25vZGUsIHJlZl9vZmZzZXQoamViLT5sYXN0X25vZGUpKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygicmVmIGZvciBub2RlIGF0ICVwIChwaHlzICUwOHgpIGhhcyBuZXh0X3BoeXMtPiVwICglMDh4KSwgbGFzdF9ub2RlLT4lcCAocGh5cyAlMDh4KVxuIiwgXAorCQkJCSAgICAgICAgICAgICByZWYyLCByZWZfb2Zmc2V0KHJlZjIpLCByZWYyLT5uZXh0X3BoeXMsIHJlZl9vZmZzZXQocmVmMi0+bmV4dF9waHlzKSwgXAorCQkJCSAgICAgICAgICAgICBqZWItPmxhc3Rfbm9kZSwgcmVmX29mZnNldChqZWItPmxhc3Rfbm9kZSkpOyBcCisJCQkJcGFyYW5vaWFfZmFpbGVkX2R1bXAoamViKTsgXAorCQkJCUJVRygpOyBcCisJCQl9IFwKKwkJCXJlZjIgPSByZWYyLT5uZXh0X3BoeXM7IFwKKwkJfSBcCisJCWlmIChteV91c2VkX3NpemUgIT0gamViLT51c2VkX3NpemUpIHsgXAorCQkJcHJpbnRrKEtFUk5fTk9USUNFICJDYWxjdWxhdGVkIHVzZWQgc2l6ZSAlMDh4ICE9IHN0b3JlZCB1c2VkIHNpemUgJTA4eFxuIiwgbXlfdXNlZF9zaXplLCBqZWItPnVzZWRfc2l6ZSk7IFwKKwkJCUJVRygpOyBcCisJCX0gXAorCQlpZiAobXlfdW5jaGVja2VkX3NpemUgIT0gamViLT51bmNoZWNrZWRfc2l6ZSkgeyBcCisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIkNhbGN1bGF0ZWQgdW5jaGVja2VkIHNpemUgJTA4eCAhPSBzdG9yZWQgdW5jaGVja2VkIHNpemUgJTA4eFxuIiwgbXlfdW5jaGVja2VkX3NpemUsIGplYi0+dW5jaGVja2VkX3NpemUpOyBcCisJCQlCVUcoKTsgXAorCQl9IFwKKwl9IHdoaWxlKDApCisKKy8qIENhbGN1bGF0ZSB0b3RsZW4gZnJvbSBzdXJyb3VuZGluZyBub2RlcyBvciBlcmFzZWJsb2NrICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IF9fcmVmX3RvdGxlbihzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywKKwkJCQkgICAgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiwKKwkJCQkgICAgc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqcmVmKQoreworCXVpbnQzMl90IHJlZl9lbmQ7CisJCisJaWYgKHJlZi0+bmV4dF9waHlzKQorCQlyZWZfZW5kID0gcmVmX29mZnNldChyZWYtPm5leHRfcGh5cyk7CisJZWxzZSB7CisJCWlmICghamViKQorCQkJamViID0gJmMtPmJsb2Nrc1tyZWYtPmZsYXNoX29mZnNldCAvIGMtPnNlY3Rvcl9zaXplXTsKKworCQkvKiBMYXN0IG5vZGUgaW4gYmxvY2suIFVzZSBmcmVlX3NwYWNlICovCisJCUJVR19PTihyZWYgIT0gamViLT5sYXN0X25vZGUpOworCQlyZWZfZW5kID0gamViLT5vZmZzZXQgKyBjLT5zZWN0b3Jfc2l6ZSAtIGplYi0+ZnJlZV9zaXplOworCX0KKwlyZXR1cm4gcmVmX2VuZCAtIHJlZl9vZmZzZXQocmVmKTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCByZWZfdG90bGVuKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLAorCQkJCSAgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiwKKwkJCQkgIHN0cnVjdCBqZmZzMl9yYXdfbm9kZV9yZWYgKnJlZikKK3sKKwl1aW50MzJfdCByZXQ7CisKKwlEMShpZiAoamViICYmIGplYiAhPSAmYy0+YmxvY2tzW3JlZi0+Zmxhc2hfb2Zmc2V0IC8gYy0+c2VjdG9yX3NpemVdKSB7CisJCXByaW50ayhLRVJOX0NSSVQgInJlZl90b3RsZW4gY2FsbGVkIHdpdGggd3JvbmcgYmxvY2sgLS0gYXQgMHglMDh4IGluc3RlYWQgb2YgMHglMDh4OyByZWYgMHglMDh4XG4iLAorCQkgICAgICAgamViLT5vZmZzZXQsIGMtPmJsb2Nrc1tyZWYtPmZsYXNoX29mZnNldCAvIGMtPnNlY3Rvcl9zaXplXS5vZmZzZXQsIHJlZl9vZmZzZXQocmVmKSk7CisJCUJVRygpOworCX0pCisKKyNpZiAxCisJcmV0ID0gcmVmLT5fX3RvdGxlbjsKKyNlbHNlCisJLyogVGhpcyBkb2Vzbid0IGFjdHVhbGx5IHdvcmsgeWV0ICovCisJcmV0ID0gX19yZWZfdG90bGVuKGMsIGplYiwgcmVmKTsKKwlpZiAocmV0ICE9IHJlZi0+X190b3RsZW4pIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiVG90bGVuIGZvciByZWYgYXQgJXAgKDB4JTA4eC0weCUwOHgpIG1pc2NhbGN1bGF0ZWQgYXMgMHgleCBpbnN0ZWFkIG9mICV4XG4iLAorCQkgICAgICAgcmVmLCByZWZfb2Zmc2V0KHJlZiksIHJlZl9vZmZzZXQocmVmKStyZWYtPl9fdG90bGVuLAorCQkgICAgICAgcmV0LCByZWYtPl9fdG90bGVuKTsKKwkJaWYgKCFqZWIpCisJCQlqZWIgPSAmYy0+YmxvY2tzW3JlZi0+Zmxhc2hfb2Zmc2V0IC8gYy0+c2VjdG9yX3NpemVdOworCQlwYXJhbm9pYV9mYWlsZWRfZHVtcChqZWIpOworCQlCVUcoKTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gcmV0OworfQorCisKKyNkZWZpbmUgQUxMT0NfTk9STUFMCTAJLyogTm9ybWFsIGFsbG9jYXRpb24gKi8KKyNkZWZpbmUgQUxMT0NfREVMRVRJT04JMQkvKiBEZWxldGlvbiBub2RlLiBCZXN0IHRvIGFsbG93IGl0ICovCisjZGVmaW5lIEFMTE9DX0dDCTIJLyogU3BhY2UgcmVxdWVzdGVkIGZvciBHQy4gR2l2ZSBpdCBvciBkaWUgKi8KKyNkZWZpbmUgQUxMT0NfTk9SRVRSWQkzCS8qIEZvciBqZmZzMl93cml0ZV9kbm9kZTogT24gZmFpbHVyZSwgcmV0dXJuIC1FQUdBSU4gaW5zdGVhZCBvZiByZXRyeWluZyAqLworCisvKiBIb3cgbXVjaCBkaXJ0eSBzcGFjZSBiZWZvcmUgaXQgZ29lcyBvbiB0aGUgdmVyeV9kaXJ0eV9saXN0ICovCisjZGVmaW5lIFZFUllESVJUWShjLCBzaXplKSAoKHNpemUpID49ICgoYyktPnNlY3Rvcl9zaXplIC8gMikpCisKKy8qIGNoZWNrIGlmIGRpcnR5IHNwYWNlIGlzIG1vcmUgdGhhbiAyNTUgQnl0ZSAqLworI2RlZmluZSBJU0RJUlRZKHNpemUpICgoc2l6ZSkgPiAgc2l6ZW9mIChzdHJ1Y3QgamZmczJfcmF3X2lub2RlKSArIEpGRlMyX01JTl9EQVRBX0xFTikgCisKKyNkZWZpbmUgUEFEKHgpICgoKHgpKzMpJn4zKQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqamZmczJfcmF3X3JlZl90b19pYyhzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICpyYXcpCit7CisJd2hpbGUocmF3LT5uZXh0X2luX2lubykgeworCQlyYXcgPSByYXctPm5leHRfaW5faW5vOworCX0KKworCXJldHVybiAoKHN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqKXJhdyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGpmZnMyX25vZGVfZnJhZyAqZnJhZ19maXJzdChzdHJ1Y3QgcmJfcm9vdCAqcm9vdCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbm9kZSA9IHJvb3QtPnJiX25vZGU7CisKKwlpZiAoIW5vZGUpCisJCXJldHVybiBOVUxMOworCXdoaWxlKG5vZGUtPnJiX2xlZnQpCisJCW5vZGUgPSBub2RlLT5yYl9sZWZ0OworCXJldHVybiByYl9lbnRyeShub2RlLCBzdHJ1Y3QgamZmczJfbm9kZV9mcmFnLCByYik7Cit9CisjZGVmaW5lIHJiX3BhcmVudChyYikgKChyYiktPnJiX3BhcmVudCkKKyNkZWZpbmUgZnJhZ19uZXh0KGZyYWcpIHJiX2VudHJ5KHJiX25leHQoJihmcmFnKS0+cmIpLCBzdHJ1Y3QgamZmczJfbm9kZV9mcmFnLCByYikKKyNkZWZpbmUgZnJhZ19wcmV2KGZyYWcpIHJiX2VudHJ5KHJiX3ByZXYoJihmcmFnKS0+cmIpLCBzdHJ1Y3QgamZmczJfbm9kZV9mcmFnLCByYikKKyNkZWZpbmUgZnJhZ19wYXJlbnQoZnJhZykgcmJfZW50cnkocmJfcGFyZW50KCYoZnJhZyktPnJiKSwgc3RydWN0IGpmZnMyX25vZGVfZnJhZywgcmIpCisjZGVmaW5lIGZyYWdfbGVmdChmcmFnKSByYl9lbnRyeSgoZnJhZyktPnJiLnJiX2xlZnQsIHN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcsIHJiKQorI2RlZmluZSBmcmFnX3JpZ2h0KGZyYWcpIHJiX2VudHJ5KChmcmFnKS0+cmIucmJfcmlnaHQsIHN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcsIHJiKQorI2RlZmluZSBmcmFnX2VyYXNlKGZyYWcsIGxpc3QpIHJiX2VyYXNlKCZmcmFnLT5yYiwgbGlzdCk7CisKKy8qIG5vZGVsaXN0LmMgKi8KK0QyKHZvaWQgamZmczJfcHJpbnRfZnJhZ19saXN0KHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmKSk7Cit2b2lkIGpmZnMyX2FkZF9mZF90b19saXN0KHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKm5ldywgc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICoqbGlzdCk7CitpbnQgamZmczJfZ2V0X2lub2RlX25vZGVzKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiwKKwkJCSAgc3RydWN0IGpmZnMyX3RtcF9kbm9kZV9pbmZvICoqdG5wLCBzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKipmZHAsCisJCQkgIHVpbnQzMl90ICpoaWdoZXN0X3ZlcnNpb24sIHVpbnQzMl90ICpsYXRlc3RfbWN0aW1lLAorCQkJICB1aW50MzJfdCAqbWN0aW1lX3Zlcik7Cit2b2lkIGpmZnMyX3NldF9pbm9jYWNoZV9zdGF0ZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2NhY2hlICppYywgaW50IHN0YXRlKTsKK3N0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqamZmczJfZ2V0X2lub19jYWNoZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgdWludDMyX3QgaW5vKTsKK3ZvaWQgamZmczJfYWRkX2lub19jYWNoZSAoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqbmV3KTsKK3ZvaWQgamZmczJfZGVsX2lub19jYWNoZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2NhY2hlICpvbGQpOwordm9pZCBqZmZzMl9mcmVlX2lub19jYWNoZXMoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpOwordm9pZCBqZmZzMl9mcmVlX3Jhd19ub2RlX3JlZnMoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpOworc3RydWN0IGpmZnMyX25vZGVfZnJhZyAqamZmczJfbG9va3VwX25vZGVfZnJhZyhzdHJ1Y3QgcmJfcm9vdCAqZnJhZ3RyZWUsIHVpbnQzMl90IG9mZnNldCk7Cit2b2lkIGpmZnMyX2tpbGxfZnJhZ3RyZWUoc3RydWN0IHJiX3Jvb3QgKnJvb3QsIHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjX2RlbGV0ZSk7Cit2b2lkIGpmZnMyX2ZyYWd0cmVlX2luc2VydChzdHJ1Y3QgamZmczJfbm9kZV9mcmFnICpuZXdmcmFnLCBzdHJ1Y3QgamZmczJfbm9kZV9mcmFnICpiYXNlKTsKK3N0cnVjdCByYl9ub2RlICpyYl9uZXh0KHN0cnVjdCByYl9ub2RlICopOworc3RydWN0IHJiX25vZGUgKnJiX3ByZXYoc3RydWN0IHJiX25vZGUgKik7Cit2b2lkIHJiX3JlcGxhY2Vfbm9kZShzdHJ1Y3QgcmJfbm9kZSAqdmljdGltLCBzdHJ1Y3QgcmJfbm9kZSAqbmV3LCBzdHJ1Y3QgcmJfcm9vdCAqcm9vdCk7CisKKy8qIG5vZGVtZ210LmMgKi8KK2ludCBqZmZzMl90aHJlYWRfc2hvdWxkX3dha2Uoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpOworaW50IGpmZnMyX3Jlc2VydmVfc3BhY2Uoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHVpbnQzMl90IG1pbnNpemUsIHVpbnQzMl90ICpvZnMsIHVpbnQzMl90ICpsZW4sIGludCBwcmlvKTsKK2ludCBqZmZzMl9yZXNlcnZlX3NwYWNlX2djKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCB1aW50MzJfdCBtaW5zaXplLCB1aW50MzJfdCAqb2ZzLCB1aW50MzJfdCAqbGVuKTsKK2ludCBqZmZzMl9hZGRfcGh5c2ljYWxfbm9kZV9yZWYoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9yYXdfbm9kZV9yZWYgKm5ldyk7Cit2b2lkIGpmZnMyX2NvbXBsZXRlX3Jlc2VydmF0aW9uKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKTsKK3ZvaWQgamZmczJfbWFya19ub2RlX29ic29sZXRlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICpyYXcpOwordm9pZCBqZmZzMl9kdW1wX2Jsb2NrX2xpc3RzKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKTsKKworLyogd3JpdGUuYyAqLworaW50IGpmZnMyX2RvX25ld19pbm9kZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsIHVpbnQzMl90IG1vZGUsIHN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKnJpKTsKKworc3RydWN0IGpmZnMyX2Z1bGxfZG5vZGUgKmpmZnMyX3dyaXRlX2Rub2RlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiwgc3RydWN0IGpmZnMyX3Jhd19pbm9kZSAqcmksIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVpbnQzMl90IGRhdGFsZW4sIHVpbnQzMl90IGZsYXNoX29mcywgaW50IGFsbG9jX21vZGUpOworc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICpqZmZzMl93cml0ZV9kaXJlbnQoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLCBzdHJ1Y3QgamZmczJfcmF3X2RpcmVudCAqcmQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5hbWUsIHVpbnQzMl90IG5hbWVsZW4sIHVpbnQzMl90IGZsYXNoX29mcywgaW50IGFsbG9jX21vZGUpOworaW50IGpmZnMyX3dyaXRlX2lub2RlX3JhbmdlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiwKKwkJCSAgICBzdHJ1Y3QgamZmczJfcmF3X2lub2RlICpyaSwgdW5zaWduZWQgY2hhciAqYnVmLCAKKwkJCSAgICB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IHdyaXRlbGVuLCB1aW50MzJfdCAqcmV0bGVuKTsKK2ludCBqZmZzMl9kb19jcmVhdGUoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpkaXJfZiwgc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsIHN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKnJpLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbik7CitpbnQgamZmczJfZG9fdW5saW5rKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZGlyX2YsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZGVhZF9mKTsKK2ludCBqZmZzMl9kb19saW5rIChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmRpcl9mLCB1aW50MzJfdCBpbm8sIHVpbnQ4X3QgdHlwZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pOworCisKKy8qIHJlYWRpbm9kZS5jICovCit2b2lkIGpmZnMyX3RydW5jYXRlX2ZyYWdsaXN0IChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IHJiX3Jvb3QgKmxpc3QsIHVpbnQzMl90IHNpemUpOworaW50IGpmZnMyX2FkZF9mdWxsX2Rub2RlX3RvX2lub2RlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiwgc3RydWN0IGpmZnMyX2Z1bGxfZG5vZGUgKmZuKTsKK2ludCBqZmZzMl9kb19yZWFkX2lub2RlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiwgCisJCQl1aW50MzJfdCBpbm8sIHN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKmxhdGVzdF9ub2RlKTsKK2ludCBqZmZzMl9kb19jcmNjaGVja19pbm9kZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2NhY2hlICppYyk7Cit2b2lkIGpmZnMyX2RvX2NsZWFyX2lub2RlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZik7CisKKy8qIG1hbGxvYy5jICovCitpbnQgamZmczJfY3JlYXRlX3NsYWJfY2FjaGVzKHZvaWQpOwordm9pZCBqZmZzMl9kZXN0cm95X3NsYWJfY2FjaGVzKHZvaWQpOworCitzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKmpmZnMyX2FsbG9jX2Z1bGxfZGlyZW50KGludCBuYW1lc2l6ZSk7Cit2b2lkIGpmZnMyX2ZyZWVfZnVsbF9kaXJlbnQoc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICopOworc3RydWN0IGpmZnMyX2Z1bGxfZG5vZGUgKmpmZnMyX2FsbG9jX2Z1bGxfZG5vZGUodm9pZCk7Cit2b2lkIGpmZnMyX2ZyZWVfZnVsbF9kbm9kZShzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZSAqKTsKK3N0cnVjdCBqZmZzMl9yYXdfZGlyZW50ICpqZmZzMl9hbGxvY19yYXdfZGlyZW50KHZvaWQpOwordm9pZCBqZmZzMl9mcmVlX3Jhd19kaXJlbnQoc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQgKik7CitzdHJ1Y3QgamZmczJfcmF3X2lub2RlICpqZmZzMl9hbGxvY19yYXdfaW5vZGUodm9pZCk7Cit2b2lkIGpmZnMyX2ZyZWVfcmF3X2lub2RlKHN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKik7CitzdHJ1Y3QgamZmczJfdG1wX2Rub2RlX2luZm8gKmpmZnMyX2FsbG9jX3RtcF9kbm9kZV9pbmZvKHZvaWQpOwordm9pZCBqZmZzMl9mcmVlX3RtcF9kbm9kZV9pbmZvKHN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbyAqKTsKK3N0cnVjdCBqZmZzMl9yYXdfbm9kZV9yZWYgKmpmZnMyX2FsbG9jX3Jhd19ub2RlX3JlZih2b2lkKTsKK3ZvaWQgamZmczJfZnJlZV9yYXdfbm9kZV9yZWYoc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqKTsKK3N0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKmpmZnMyX2FsbG9jX25vZGVfZnJhZyh2b2lkKTsKK3ZvaWQgamZmczJfZnJlZV9ub2RlX2ZyYWcoc3RydWN0IGpmZnMyX25vZGVfZnJhZyAqKTsKK3N0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqamZmczJfYWxsb2NfaW5vZGVfY2FjaGUodm9pZCk7Cit2b2lkIGpmZnMyX2ZyZWVfaW5vZGVfY2FjaGUoc3RydWN0IGpmZnMyX2lub2RlX2NhY2hlICopOworCisvKiBnYy5jICovCitpbnQgamZmczJfZ2FyYmFnZV9jb2xsZWN0X3Bhc3Moc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpOworCisvKiByZWFkLmMgKi8KK2ludCBqZmZzMl9yZWFkX2Rub2RlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiwKKwkJICAgICBzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZSAqZmQsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJICAgICBpbnQgb2ZzLCBpbnQgbGVuKTsKK2ludCBqZmZzMl9yZWFkX2lub2RlX3JhbmdlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZiwKKwkJCSAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBsZW4pOworY2hhciAqamZmczJfZ2V0bGluayhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYpOworCisvKiBzY2FuLmMgKi8KK2ludCBqZmZzMl9zY2FuX21lZGl1bShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyk7Cit2b2lkIGpmZnMyX3JvdGF0ZV9saXN0cyhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyk7CisKKy8qIGJ1aWxkLmMgKi8KK2ludCBqZmZzMl9kb19tb3VudF9mcyhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyk7CisKKy8qIGVyYXNlLmMgKi8KK3ZvaWQgamZmczJfZXJhc2VfcGVuZGluZ19ibG9ja3Moc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIGludCBjb3VudCk7CisKKyNpZmRlZiBDT05GSUdfSkZGUzJfRlNfTkFORAorLyogd2J1Zi5jICovCitpbnQgamZmczJfZmx1c2hfd2J1Zl9nYyhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgdWludDMyX3QgaW5vKTsKK2ludCBqZmZzMl9mbHVzaF93YnVmX3BhZChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyk7CitpbnQgamZmczJfY2hlY2tfbmFuZF9jbGVhbm1hcmtlcihzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYik7CitpbnQgamZmczJfd3JpdGVfbmFuZF9jbGVhbm1hcmtlcihzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYik7CisjZW5kaWYKKworI2VuZGlmIC8qIF9fSkZGUzJfTk9ERUxJU1RfSF9fICovCmRpZmYgLS1naXQgYS9mcy9qZmZzMi9ub2RlbWdtdC5jIGIvZnMvamZmczIvbm9kZW1nbXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjUxMTM1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvamZmczIvbm9kZW1nbXQuYwpAQCAtMCwwICsxLDgzOCBAQAorLyoKKyAqIEpGRlMyIC0tIEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCBWZXJzaW9uIDIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLTIwMDMgUmVkIEhhdCwgSW5jLgorICoKKyAqIENyZWF0ZWQgYnkgRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPgorICoKKyAqIEZvciBsaWNlbnNpbmcgaW5mb3JtYXRpb24sIHNlZSB0aGUgZmlsZSAnTElDRU5DRScgaW4gdGhpcyBkaXJlY3RvcnkuCisgKgorICogJElkOiBub2RlbWdtdC5jLHYgMS4xMTUgMjAwNC8xMS8yMiAxMTowNzoyMSBkd213MiBFeHAgJAorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+IC8qIEZvciBjb25kX3Jlc2NoZWQoKSAqLworI2luY2x1ZGUgIm5vZGVsaXN0LmgiCisKKy8qKgorICoJamZmczJfcmVzZXJ2ZV9zcGFjZSAtIHJlcXVlc3QgcGh5c2ljYWwgc3BhY2UgdG8gd3JpdGUgbm9kZXMgdG8gZmxhc2gKKyAqCUBjOiBzdXBlcmJsb2NrIGluZm8KKyAqCUBtaW5zaXplOiBNaW5pbXVtIGFjY2VwdGFibGUgc2l6ZSBvZiBhbGxvY2F0aW9uCisgKglAb2ZzOiBSZXR1cm5lZCB2YWx1ZSBvZiBub2RlIG9mZnNldAorICoJQGxlbjogUmV0dXJuZWQgdmFsdWUgb2YgYWxsb2NhdGlvbiBsZW5ndGgKKyAqCUBwcmlvOiBBbGxvY2F0aW9uIHR5cGUgLSBBTExPQ197Tk9STUFMLERFTEVUSU9OfQorICoKKyAqCVJlcXVlc3RzIGEgYmxvY2sgb2YgcGh5c2ljYWwgc3BhY2Ugb24gdGhlIGZsYXNoLiBSZXR1cm5zIHplcm8gZm9yIHN1Y2Nlc3MKKyAqCWFuZCBwdXRzICdvZnMnIGFuZCAnbGVuJyBpbnRvIHRoZSBhcHByaW9wcmlhdGUgcGxhY2UsIG9yIHJldHVybnMgLUVOT1NQQworICoJb3Igb3RoZXIgZXJyb3IgaWYgYXBwcm9wcmlhdGUuCisgKgorICoJSWYgaXQgcmV0dXJucyB6ZXJvLCBqZmZzMl9yZXNlcnZlX3NwYWNlKCkgYWxzbyBkb3ducyB0aGUgcGVyLWZpbGVzeXN0ZW0KKyAqCWFsbG9jYXRpb24gc2VtYXBob3JlLCB0byBwcmV2ZW50IG1vcmUgdGhhbiBvbmUgYWxsb2NhdGlvbiBmcm9tIGJlaW5nCisgKglhY3RpdmUgYXQgYW55IHRpbWUuIFRoZSBzZW1hcGhvcmUgaXMgbGF0ZXIgcmVsZWFzZWQgYnkgamZmczJfY29tbWl0X2FsbG9jYXRpb24oKQorICoKKyAqCWpmZnMyX3Jlc2VydmVfc3BhY2UoKSBtYXkgdHJpZ2dlciBnYXJiYWdlIGNvbGxlY3Rpb24gaW4gb3JkZXIgdG8gbWFrZSByb29tCisgKglmb3IgdGhlIHJlcXVlc3RlZCBhbGxvY2F0aW9uLgorICovCisKK3N0YXRpYyBpbnQgamZmczJfZG9fcmVzZXJ2ZV9zcGFjZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgIHVpbnQzMl90IG1pbnNpemUsIHVpbnQzMl90ICpvZnMsIHVpbnQzMl90ICpsZW4pOworCitpbnQgamZmczJfcmVzZXJ2ZV9zcGFjZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgdWludDMyX3QgbWluc2l6ZSwgdWludDMyX3QgKm9mcywgdWludDMyX3QgKmxlbiwgaW50IHByaW8pCit7CisJaW50IHJldCA9IC1FQUdBSU47CisJaW50IGJsb2Nrc25lZWRlZCA9IGMtPnJlc3ZfYmxvY2tzX3dyaXRlOworCS8qIGFsaWduIGl0ICovCisJbWluc2l6ZSA9IFBBRChtaW5zaXplKTsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9yZXNlcnZlX3NwYWNlKCk6IFJlcXVlc3RlZCAweCV4IGJ5dGVzXG4iLCBtaW5zaXplKSk7CisJZG93bigmYy0+YWxsb2Nfc2VtKTsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9yZXNlcnZlX3NwYWNlKCk6IGFsbG9jIHNlbSBnb3RcbiIpKTsKKworCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKworCS8qIHRoaXMgbmVlZHMgYSBsaXR0bGUgbW9yZSB0aG91Z2h0ICh0cnVlIDx0Z2x4PiA6KSkgKi8KKwl3aGlsZShyZXQgPT0gLUVBR0FJTikgeworCQl3aGlsZShjLT5ucl9mcmVlX2Jsb2NrcyArIGMtPm5yX2VyYXNpbmdfYmxvY2tzIDwgYmxvY2tzbmVlZGVkKSB7CisJCQlpbnQgcmV0OworCQkJdWludDMyX3QgZGlydHksIGF2YWlsOworCisJCQkvKiBjYWxjdWxhdGUgcmVhbCBkaXJ0eSBzaXplCisJCQkgKiBkaXJ0eV9zaXplIGNvbnRhaW5zIGJsb2NrcyBvbiBlcmFzZV9wZW5kaW5nX2xpc3QKKwkJCSAqIHRob3NlIGJsb2NrcyBhcmUgY291bnRlZCBpbiBjLT5ucl9lcmFzaW5nX2Jsb2Nrcy4KKwkJCSAqIElmIG9uZSBibG9jayBpcyBhY3R1YWxseSBlcmFzZWQsIGl0IGlzIG5vdCBsb25nZXIgY291bnRlZCBhcyBkaXJ0eV9zcGFjZQorCQkJICogYnV0IGl0IGlzIGNvdW50ZWQgaW4gYy0+bnJfZXJhc2luZ19ibG9ja3MsIHNvIHdlIGFkZCBpdCBhbmQgc3VidHJhY3QgaXQKKwkJCSAqIHdpdGggYy0+bnJfZXJhc2luZ19ibG9ja3MgKiBjLT5zZWN0b3Jfc2l6ZSBhZ2Fpbi4KKwkJCSAqIEJsb2NrcyBvbiBlcmFzYWJsZV9saXN0IGFyZSBjb3VudGVkIGFzIGRpcnR5X3NpemUsIGJ1dCBub3QgaW4gYy0+bnJfZXJhc2luZ19ibG9ja3MKKwkJCSAqIFRoaXMgaGVscHMgdXMgdG8gZm9yY2UgZ2MgYW5kIHBpY2sgZXZlbnR1YWxseSBhIGNsZWFuIGJsb2NrIHRvIHNwcmVhZCB0aGUgbG9hZC4KKwkJCSAqIFdlIGFkZCB1bmNoZWNrZWRfc2l6ZSBoZXJlLCBhcyB3ZSBob3BlZnVsbHkgd2lsbCBmaW5kIHNvbWUgc3BhY2UgdG8gdXNlLgorCQkJICogVGhpcyB3aWxsIGFmZmVjdCB0aGUgc3VtIG9ubHkgb25jZSwgYXMgZ2MgZmlyc3QgZmluaXNoZXMgY2hlY2tpbmcKKwkJCSAqIG9mIG5vZGVzLgorCQkJICovCisJCQlkaXJ0eSA9IGMtPmRpcnR5X3NpemUgKyBjLT5lcmFzaW5nX3NpemUgLSBjLT5ucl9lcmFzaW5nX2Jsb2NrcyAqIGMtPnNlY3Rvcl9zaXplICsgYy0+dW5jaGVja2VkX3NpemU7CisJCQlpZiAoZGlydHkgPCBjLT5ub3NwY19kaXJ0eV9zaXplKSB7CisJCQkJaWYgKHByaW8gPT0gQUxMT0NfREVMRVRJT04gJiYgYy0+bnJfZnJlZV9ibG9ja3MgKyBjLT5ucl9lcmFzaW5nX2Jsb2NrcyA+PSBjLT5yZXN2X2Jsb2Nrc19kZWxldGlvbikgeworCQkJCQlwcmludGsoS0VSTl9OT1RJQ0UgImpmZnMyX3Jlc2VydmVfc3BhY2UoKTogTG93IG9uIGRpcnR5IHNwYWNlIHRvIEdDLCBidXQgaXQncyBhIGRlbGV0aW9uLiBBbGxvd2luZy4uLlxuIik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiZGlydHkgc2l6ZSAweCUwOHggKyB1bmNoZWNrZWRfc2l6ZSAweCUwOHggPCBub3NwY19kaXJ0eV9zaXplIDB4JTA4eCwgcmV0dXJuaW5nIC1FTk9TUENcbiIsCisJCQkJCSAgZGlydHksIGMtPnVuY2hlY2tlZF9zaXplLCBjLT5zZWN0b3Jfc2l6ZSkpOworCisJCQkJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisJCQkJdXAoJmMtPmFsbG9jX3NlbSk7CisJCQkJcmV0dXJuIC1FTk9TUEM7CisJCQl9CisJCQkKKwkJCS8qIENhbGMgcG9zc2libHkgYXZhaWxhYmxlIHNwYWNlLiBQb3NzaWJseSBhdmFpbGFibGUgbWVhbnMgdGhhdCB3ZQorCQkJICogZG9uJ3Qga25vdywgaWYgdW5jaGVja2VkIHNpemUgY29udGFpbnMgb2Jzb2xldGVkIG5vZGVzLCB3aGljaCBjb3VsZCBnaXZlIHVzIHNvbWUKKwkJCSAqIG1vcmUgdXNhYmxlIHNwYWNlLiBUaGlzIHdpbGwgYWZmZWN0IHRoZSBzdW0gb25seSBvbmNlLCBhcyBnYyBmaXJzdCBmaW5pc2hlcyBjaGVja2luZworCQkJICogb2Ygbm9kZXMuCisJCQkgKyBSZXR1cm4gLUVOT1NQQywgaWYgdGhlIG1heGltdW0gcG9zc2libHkgYXZhaWxhYmxlIHNwYWNlIGlzIGxlc3Mgb3IgZXF1YWwgdGhhbiAKKwkJCSAqIGJsb2Nrc25lZWRlZCAqIHNlY3Rvcl9zaXplLgorCQkJICogVGhpcyBibG9ja3MgZW5kbGVzcyBnYyBsb29waW5nIG9uIGEgZmlsZXN5c3RlbSwgd2hpY2ggaXMgbmVhcmx5IGZ1bGwsIGV2ZW4gaWYKKwkJCSAqIHRoZSBjaGVjayBhYm92ZSBwYXNzZXMuCisJCQkgKi8KKwkJCWF2YWlsID0gYy0+ZnJlZV9zaXplICsgYy0+ZGlydHlfc2l6ZSArIGMtPmVyYXNpbmdfc2l6ZSArIGMtPnVuY2hlY2tlZF9zaXplOworCQkJaWYgKCAoYXZhaWwgLyBjLT5zZWN0b3Jfc2l6ZSkgPD0gYmxvY2tzbmVlZGVkKSB7CisJCQkJaWYgKHByaW8gPT0gQUxMT0NfREVMRVRJT04gJiYgYy0+bnJfZnJlZV9ibG9ja3MgKyBjLT5ucl9lcmFzaW5nX2Jsb2NrcyA+PSBjLT5yZXN2X2Jsb2Nrc19kZWxldGlvbikgeworCQkJCQlwcmludGsoS0VSTl9OT1RJQ0UgImpmZnMyX3Jlc2VydmVfc3BhY2UoKTogTG93IG9uIHBvc3NpYmx5IGF2YWlsYWJsZSBzcGFjZSwgYnV0IGl0J3MgYSBkZWxldGlvbi4gQWxsb3dpbmcuLi5cbiIpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAibWF4LiBhdmFpbGFibGUgc2l6ZSAweCUwOHggIDwgYmxvY2tzbmVlZGVkICogc2VjdG9yX3NpemUgMHglMDh4LCByZXR1cm5pbmcgLUVOT1NQQ1xuIiwKKwkJCQkJICBhdmFpbCwgYmxvY2tzbmVlZGVkICogYy0+c2VjdG9yX3NpemUpKTsKKwkJCQlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJCQl1cCgmYy0+YWxsb2Nfc2VtKTsKKwkJCQlyZXR1cm4gLUVOT1NQQzsKKwkJCX0KKworCQkJdXAoJmMtPmFsbG9jX3NlbSk7CisKKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJUcmlnZ2VyaW5nIEdDIHBhc3MuIG5yX2ZyZWVfYmxvY2tzICVkLCBucl9lcmFzaW5nX2Jsb2NrcyAlZCwgZnJlZV9zaXplIDB4JTA4eCwgZGlydHlfc2l6ZSAweCUwOHgsIHdhc3RlZF9zaXplIDB4JTA4eCwgdXNlZF9zaXplIDB4JTA4eCwgZXJhc2luZ19zaXplIDB4JTA4eCwgYmFkX3NpemUgMHglMDh4ICh0b3RhbCAweCUwOHggb2YgMHglMDh4KVxuIiwKKwkJCQkgIGMtPm5yX2ZyZWVfYmxvY2tzLCBjLT5ucl9lcmFzaW5nX2Jsb2NrcywgYy0+ZnJlZV9zaXplLCBjLT5kaXJ0eV9zaXplLCBjLT53YXN0ZWRfc2l6ZSwgYy0+dXNlZF9zaXplLCBjLT5lcmFzaW5nX3NpemUsIGMtPmJhZF9zaXplLAorCQkJCSAgYy0+ZnJlZV9zaXplICsgYy0+ZGlydHlfc2l6ZSArIGMtPndhc3RlZF9zaXplICsgYy0+dXNlZF9zaXplICsgYy0+ZXJhc2luZ19zaXplICsgYy0+YmFkX3NpemUsIGMtPmZsYXNoX3NpemUpKTsKKwkJCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCQkJCisJCQlyZXQgPSBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfcGFzcyhjKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKworCQkJY29uZF9yZXNjaGVkKCk7CisKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQlyZXR1cm4gLUVJTlRSOworCisJCQlkb3duKCZjLT5hbGxvY19zZW0pOworCQkJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCQl9CisKKwkJcmV0ID0gamZmczJfZG9fcmVzZXJ2ZV9zcGFjZShjLCBtaW5zaXplLCBvZnMsIGxlbik7CisJCWlmIChyZXQpIHsKKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9yZXNlcnZlX3NwYWNlOiByZXQgaXMgJWRcbiIsIHJldCkpOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCWlmIChyZXQpCisJCXVwKCZjLT5hbGxvY19zZW0pOworCXJldHVybiByZXQ7Cit9CisKK2ludCBqZmZzMl9yZXNlcnZlX3NwYWNlX2djKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCB1aW50MzJfdCBtaW5zaXplLCB1aW50MzJfdCAqb2ZzLCB1aW50MzJfdCAqbGVuKQoreworCWludCByZXQgPSAtRUFHQUlOOworCW1pbnNpemUgPSBQQUQobWluc2l6ZSk7CisKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfcmVzZXJ2ZV9zcGFjZV9nYygpOiBSZXF1ZXN0ZWQgMHgleCBieXRlc1xuIiwgbWluc2l6ZSkpOworCisJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCXdoaWxlKHJldCA9PSAtRUFHQUlOKSB7CisJCXJldCA9IGpmZnMyX2RvX3Jlc2VydmVfc3BhY2UoYywgbWluc2l6ZSwgb2ZzLCBsZW4pOworCQlpZiAocmV0KSB7CisJCSAgICAgICAgRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX3Jlc2VydmVfc3BhY2VfZ2M6IGxvb3BpbmcsIHJldCBpcyAlZFxuIiwgcmV0KSk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworLyogQ2FsbGVkIHdpdGggYWxsb2Mgc2VtIF9hbmRfIGVyYXNlX2NvbXBsZXRpb25fbG9jayAqLworc3RhdGljIGludCBqZmZzMl9kb19yZXNlcnZlX3NwYWNlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCAgdWludDMyX3QgbWluc2l6ZSwgdWludDMyX3QgKm9mcywgdWludDMyX3QgKmxlbikKK3sKKwlzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViID0gYy0+bmV4dGJsb2NrOworCQorIHJlc3RhcnQ6CisJaWYgKGplYiAmJiBtaW5zaXplID4gamViLT5mcmVlX3NpemUpIHsKKwkJLyogU2tpcCB0aGUgZW5kIG9mIHRoaXMgYmxvY2sgYW5kIGZpbGUgaXQgYXMgaGF2aW5nIHNvbWUgZGlydHkgc3BhY2UgKi8KKwkJLyogSWYgdGhlcmUncyBhIHBlbmRpbmcgd3JpdGUgdG8gaXQsIGZsdXNoIG5vdyAqLworCQlpZiAoamZmczJfd2J1Zl9kaXJ0eShjKSkgeworCQkJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZG9fcmVzZXJ2ZV9zcGFjZTogRmx1c2hpbmcgd3JpdGUgYnVmZmVyXG4iKSk7CQkJICAgIAorCQkJamZmczJfZmx1c2hfd2J1Zl9wYWQoYyk7CisJCQlzcGluX2xvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisJCQlqZWIgPSBjLT5uZXh0YmxvY2s7CisJCQlnb3RvIHJlc3RhcnQ7CisJCX0KKwkJYy0+d2FzdGVkX3NpemUgKz0gamViLT5mcmVlX3NpemU7CisJCWMtPmZyZWVfc2l6ZSAtPSBqZWItPmZyZWVfc2l6ZTsKKwkJamViLT53YXN0ZWRfc2l6ZSArPSBqZWItPmZyZWVfc2l6ZTsKKwkJamViLT5mcmVlX3NpemUgPSAwOworCQkKKwkJLyogQ2hlY2ssIGlmIHdlIGhhdmUgYSBkaXJ0eSBibG9jayBub3csIG9yIGlmIGl0IHdhcyBkaXJ0eSBhbHJlYWR5ICovCisJCWlmIChJU0RJUlRZIChqZWItPndhc3RlZF9zaXplICsgamViLT5kaXJ0eV9zaXplKSkgeworCQkJYy0+ZGlydHlfc2l6ZSArPSBqZWItPndhc3RlZF9zaXplOworCQkJYy0+d2FzdGVkX3NpemUgLT0gamViLT53YXN0ZWRfc2l6ZTsKKwkJCWplYi0+ZGlydHlfc2l6ZSArPSBqZWItPndhc3RlZF9zaXplOworCQkJamViLT53YXN0ZWRfc2l6ZSA9IDA7CisJCQlpZiAoVkVSWURJUlRZKGMsIGplYi0+ZGlydHlfc2l6ZSkpIHsKKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiQWRkaW5nIGZ1bGwgZXJhc2UgYmxvY2sgYXQgMHglMDh4IHRvIHZlcnlfZGlydHlfbGlzdCAoZnJlZSAweCUwOHgsIGRpcnR5IDB4JTA4eCwgdXNlZCAweCUwOHhcbiIsCisJCQkJICBqZWItPm9mZnNldCwgamViLT5mcmVlX3NpemUsIGplYi0+ZGlydHlfc2l6ZSwgamViLT51c2VkX3NpemUpKTsKKwkJCQlsaXN0X2FkZF90YWlsKCZqZWItPmxpc3QsICZjLT52ZXJ5X2RpcnR5X2xpc3QpOworCQkJfSBlbHNlIHsKKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiQWRkaW5nIGZ1bGwgZXJhc2UgYmxvY2sgYXQgMHglMDh4IHRvIGRpcnR5X2xpc3QgKGZyZWUgMHglMDh4LCBkaXJ0eSAweCUwOHgsIHVzZWQgMHglMDh4XG4iLAorCQkJCSAgamViLT5vZmZzZXQsIGplYi0+ZnJlZV9zaXplLCBqZWItPmRpcnR5X3NpemUsIGplYi0+dXNlZF9zaXplKSk7CisJCQkJbGlzdF9hZGRfdGFpbCgmamViLT5saXN0LCAmYy0+ZGlydHlfbGlzdCk7CisJCQl9CisJCX0gZWxzZSB7IAorCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkFkZGluZyBmdWxsIGVyYXNlIGJsb2NrIGF0IDB4JTA4eCB0byBjbGVhbl9saXN0IChmcmVlIDB4JTA4eCwgZGlydHkgMHglMDh4LCB1c2VkIDB4JTA4eFxuIiwKKwkJCSAgamViLT5vZmZzZXQsIGplYi0+ZnJlZV9zaXplLCBqZWItPmRpcnR5X3NpemUsIGplYi0+dXNlZF9zaXplKSk7CisJCQlsaXN0X2FkZF90YWlsKCZqZWItPmxpc3QsICZjLT5jbGVhbl9saXN0KTsKKwkJfQorCQljLT5uZXh0YmxvY2sgPSBqZWIgPSBOVUxMOworCX0KKwkKKwlpZiAoIWplYikgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0OworCQkvKiBUYWtlIHRoZSBuZXh0IGJsb2NrIG9mZiB0aGUgJ2ZyZWUnIGxpc3QgKi8KKworCQlpZiAobGlzdF9lbXB0eSgmYy0+ZnJlZV9saXN0KSkgeworCisJCQlpZiAoIWMtPm5yX2VyYXNpbmdfYmxvY2tzICYmIAorCQkJICAgICFsaXN0X2VtcHR5KCZjLT5lcmFzYWJsZV9saXN0KSkgeworCQkJCXN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICplamViOworCisJCQkJZWplYiA9IGxpc3RfZW50cnkoYy0+ZXJhc2FibGVfbGlzdC5uZXh0LCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jaywgbGlzdCk7CisJCQkJbGlzdF9kZWwoJmVqZWItPmxpc3QpOworCQkJCWxpc3RfYWRkX3RhaWwoJmVqZWItPmxpc3QsICZjLT5lcmFzZV9wZW5kaW5nX2xpc3QpOworCQkJCWMtPm5yX2VyYXNpbmdfYmxvY2tzKys7CisJCQkJamZmczJfZXJhc2VfcGVuZGluZ190cmlnZ2VyKGMpOworCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9kb19yZXNlcnZlX3NwYWNlOiBUcmlnZ2VyaW5nIGVyYXNlIG9mIGVyYXNhYmxlIGJsb2NrIGF0IDB4JTA4eFxuIiwKKwkJCQkJICBlamViLT5vZmZzZXQpKTsKKwkJCX0KKworCQkJaWYgKCFjLT5ucl9lcmFzaW5nX2Jsb2NrcyAmJiAKKwkJCSAgICAhbGlzdF9lbXB0eSgmYy0+ZXJhc2FibGVfcGVuZGluZ193YnVmX2xpc3QpKSB7CisJCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2RvX3Jlc2VydmVfc3BhY2U6IEZsdXNoaW5nIHdyaXRlIGJ1ZmZlclxuIikpOworCQkJCS8qIGMtPm5leHRibG9jayBpcyBOVUxMLCBubyB1cGRhdGUgdG8gYy0+bmV4dGJsb2NrIGFsbG93ZWQgKi8JCQkgICAgCisJCQkJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisJCQkJamZmczJfZmx1c2hfd2J1Zl9wYWQoYyk7CisJCQkJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCQkJCS8qIEhhdmUgYW5vdGhlciBnby4gSXQnbGwgYmUgb24gdGhlIGVyYXNhYmxlX2xpc3Qgbm93ICovCisJCQkJcmV0dXJuIC1FQUdBSU47CisJCQl9CisKKwkJCWlmICghYy0+bnJfZXJhc2luZ19ibG9ja3MpIHsKKwkJCQkvKiBPdWNoLiBXZSdyZSBpbiBHQywgb3Igd2Ugd291bGRuJ3QgaGF2ZSBnb3QgaGVyZS4KKwkJCQkgICBBbmQgdGhlcmUncyBubyBzcGFjZSBsZWZ0LiBBdCBhbGwuICovCisJCQkJcHJpbnRrKEtFUk5fQ1JJVCAiQXJnaC4gTm8gZnJlZSBzcGFjZSBsZWZ0IGZvciBHQy4gbnJfZXJhc2luZ19ibG9ja3MgaXMgJWQuIG5yX2ZyZWVfYmxvY2tzIGlzICVkLiAoZXJhc2FibGVlbXB0eTogJXMsIGVyYXNpbmdlbXB0eTogJXMsIGVyYXNlcGVuZGluZ2VtcHR5OiAlcylcbiIsIAorCQkJCSAgICAgICBjLT5ucl9lcmFzaW5nX2Jsb2NrcywgYy0+bnJfZnJlZV9ibG9ja3MsIGxpc3RfZW1wdHkoJmMtPmVyYXNhYmxlX2xpc3QpPyJ5ZXMiOiJubyIsIAorCQkJCSAgICAgICBsaXN0X2VtcHR5KCZjLT5lcmFzaW5nX2xpc3QpPyJ5ZXMiOiJubyIsIGxpc3RfZW1wdHkoJmMtPmVyYXNlX3BlbmRpbmdfbGlzdCk/InllcyI6Im5vIik7CisJCQkJcmV0dXJuIC1FTk9TUEM7CisJCQl9CisKKwkJCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCQkJLyogRG9uJ3Qgd2FpdCBmb3IgaXQ7IGp1c3QgZXJhc2Ugb25lIHJpZ2h0IG5vdyAqLworCQkJamZmczJfZXJhc2VfcGVuZGluZ19ibG9ja3MoYywgMSk7CisJCQlzcGluX2xvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisKKwkJCS8qIEFuIGVyYXNlIG1heSBoYXZlIGZhaWxlZCwgZGVjcmVhc2luZyB0aGUKKwkJCSAgIGFtb3VudCBvZiBmcmVlIHNwYWNlIGF2YWlsYWJsZS4gU28gd2UgbXVzdAorCQkJICAgcmVzdGFydCBmcm9tIHRoZSBiZWdpbm5pbmcgKi8KKwkJCXJldHVybiAtRUFHQUlOOworCQl9CisKKwkJbmV4dCA9IGMtPmZyZWVfbGlzdC5uZXh0OworCQlsaXN0X2RlbChuZXh0KTsKKwkJYy0+bmV4dGJsb2NrID0gamViID0gbGlzdF9lbnRyeShuZXh0LCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jaywgbGlzdCk7CisJCWMtPm5yX2ZyZWVfYmxvY2tzLS07CisKKwkJaWYgKGplYi0+ZnJlZV9zaXplICE9IGMtPnNlY3Rvcl9zaXplIC0gYy0+Y2xlYW5tYXJrZXJfc2l6ZSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRWVwLiBCbG9jayAweCUwOHggdGFrZW4gZnJvbSBmcmVlX2xpc3QgaGFkIGZyZWVfc2l6ZSBvZiAweCUwOHghIVxuIiwgamViLT5vZmZzZXQsIGplYi0+ZnJlZV9zaXplKTsKKwkJCWdvdG8gcmVzdGFydDsKKwkJfQorCX0KKwkvKiBPSywgamViICg9PWMtPm5leHRibG9jaykgaXMgbm93IHBvaW50aW5nIGF0IGEgYmxvY2sgd2hpY2ggZGVmaW5pdGVseSBoYXMKKwkgICBlbm91Z2ggc3BhY2UgKi8KKwkqb2ZzID0gamViLT5vZmZzZXQgKyAoYy0+c2VjdG9yX3NpemUgLSBqZWItPmZyZWVfc2l6ZSk7CisJKmxlbiA9IGplYi0+ZnJlZV9zaXplOworCisJaWYgKGMtPmNsZWFubWFya2VyX3NpemUgJiYgamViLT51c2VkX3NpemUgPT0gYy0+Y2xlYW5tYXJrZXJfc2l6ZSAmJgorCSAgICAhamViLT5maXJzdF9ub2RlLT5uZXh0X2luX2lubykgeworCQkvKiBPbmx5IG5vZGUgaW4gaXQgYmVmb3JlaGFuZCB3YXMgYSBDTEVBTk1BUktFUiBub2RlICh3ZSB0aGluaykuIAorCQkgICBTbyBtYXJrIGl0IG9ic29sZXRlIG5vdyB0aGF0IHRoZXJlJ3MgZ29pbmcgdG8gYmUgYW5vdGhlciBub2RlCisJCSAgIGluIHRoZSBibG9jay4gVGhpcyB3aWxsIHJlZHVjZSB1c2VkX3NpemUgdG8gemVybyBidXQgV2UndmUgCisJCSAgIGFscmVhZHkgc2V0IGMtPm5leHRibG9jayBzbyB0aGF0IGpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZSgpCisJCSAgIHdvbid0IHRyeSB0byByZWZpbGUgaXQgdG8gdGhlIGRpcnR5X2xpc3QuCisJCSovCisJCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgamViLT5maXJzdF9ub2RlKTsKKwkJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCX0KKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9kb19yZXNlcnZlX3NwYWNlKCk6IEdpdmluZyAweCV4IGJ5dGVzIGF0IDB4JXhcbiIsICpsZW4sICpvZnMpKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglqZmZzMl9hZGRfcGh5c2ljYWxfbm9kZV9yZWYgLSBhZGQgYSBwaHlzaWNhbCBub2RlIHJlZmVyZW5jZSB0byB0aGUgbGlzdAorICoJQGM6IHN1cGVyYmxvY2sgaW5mbworICoJQG5ldzogbmV3IG5vZGUgcmVmZXJlbmNlIHRvIGFkZAorICoJQGxlbjogbGVuZ3RoIG9mIHRoaXMgcGh5c2ljYWwgbm9kZQorICoJQGRpcnR5OiBkaXJ0eSBmbGFnIGZvciBuZXcgbm9kZQorICoKKyAqCVNob3VsZCBvbmx5IGJlIHVzZWQgdG8gcmVwb3J0IG5vZGVzIGZvciB3aGljaCBzcGFjZSBoYXMgYmVlbiBhbGxvY2F0ZWQgCisgKglieSBqZmZzMl9yZXNlcnZlX3NwYWNlLgorICoKKyAqCU11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGFsbG9jX3NlbSBoZWxkLgorICovCisgCitpbnQgamZmczJfYWRkX3BoeXNpY2FsX25vZGVfcmVmKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICpuZXcpCit7CisJc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYjsKKwl1aW50MzJfdCBsZW47CisKKwlqZWIgPSAmYy0+YmxvY2tzW25ldy0+Zmxhc2hfb2Zmc2V0IC8gYy0+c2VjdG9yX3NpemVdOworCWxlbiA9IHJlZl90b3RsZW4oYywgamViLCBuZXcpOworCisJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2FkZF9waHlzaWNhbF9ub2RlX3JlZigpOiBOb2RlIGF0IDB4JXgoJWQpLCBzaXplIDB4JXhcbiIsIHJlZl9vZmZzZXQobmV3KSwgcmVmX2ZsYWdzKG5ldyksIGxlbikpOworI2lmIDEKKwlpZiAoamViICE9IGMtPm5leHRibG9jayB8fCAocmVmX29mZnNldChuZXcpKSAhPSBqZWItPm9mZnNldCArIChjLT5zZWN0b3Jfc2l6ZSAtIGplYi0+ZnJlZV9zaXplKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJhcmdoLiBub2RlIGFkZGVkIGluIHdyb25nIHBsYWNlXG4iKTsKKwkJamZmczJfZnJlZV9yYXdfbm9kZV9yZWYobmV3KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorI2VuZGlmCisJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCisJaWYgKCFqZWItPmZpcnN0X25vZGUpCisJCWplYi0+Zmlyc3Rfbm9kZSA9IG5ldzsKKwlpZiAoamViLT5sYXN0X25vZGUpCisJCWplYi0+bGFzdF9ub2RlLT5uZXh0X3BoeXMgPSBuZXc7CisJamViLT5sYXN0X25vZGUgPSBuZXc7CisKKwlqZWItPmZyZWVfc2l6ZSAtPSBsZW47CisJYy0+ZnJlZV9zaXplIC09IGxlbjsKKwlpZiAocmVmX29ic29sZXRlKG5ldykpIHsKKwkJamViLT5kaXJ0eV9zaXplICs9IGxlbjsKKwkJYy0+ZGlydHlfc2l6ZSArPSBsZW47CisJfSBlbHNlIHsKKwkJamViLT51c2VkX3NpemUgKz0gbGVuOworCQljLT51c2VkX3NpemUgKz0gbGVuOworCX0KKworCWlmICghamViLT5mcmVlX3NpemUgJiYgIWplYi0+ZGlydHlfc2l6ZSkgeworCQkvKiBJZiBpdCBsaXZlcyBvbiB0aGUgZGlydHlfbGlzdCwgamZmczJfcmVzZXJ2ZV9zcGFjZSB3aWxsIHB1dCBpdCB0aGVyZSAqLworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiQWRkaW5nIGZ1bGwgZXJhc2UgYmxvY2sgYXQgMHglMDh4IHRvIGNsZWFuX2xpc3QgKGZyZWUgMHglMDh4LCBkaXJ0eSAweCUwOHgsIHVzZWQgMHglMDh4XG4iLAorCQkJICBqZWItPm9mZnNldCwgamViLT5mcmVlX3NpemUsIGplYi0+ZGlydHlfc2l6ZSwgamViLT51c2VkX3NpemUpKTsKKwkJaWYgKGpmZnMyX3didWZfZGlydHkoYykpIHsKKwkJCS8qIEZsdXNoIHRoZSBsYXN0IHdyaXRlIGluIHRoZSBibG9jayBpZiBpdCdzIG91dHN0YW5kaW5nICovCisJCQlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJCWpmZnMyX2ZsdXNoX3didWZfcGFkKGMpOworCQkJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCQl9CisKKwkJbGlzdF9hZGRfdGFpbCgmamViLT5saXN0LCAmYy0+Y2xlYW5fbGlzdCk7CisJCWMtPm5leHRibG9jayA9IE5VTEw7CisJfQorCUFDQ1RfU0FOSVRZX0NIRUNLKGMsamViKTsKKwlEMShBQ0NUX1BBUkFOT0lBX0NIRUNLKGplYikpOworCisJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIGpmZnMyX2NvbXBsZXRlX3Jlc2VydmF0aW9uKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKQoreworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbigpXG4iKSk7CisJamZmczJfZ2FyYmFnZV9jb2xsZWN0X3RyaWdnZXIoYyk7CisJdXAoJmMtPmFsbG9jX3NlbSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG9uX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqb2JqLCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnRoaXM7CisKKwlsaXN0X2Zvcl9lYWNoKHRoaXMsIGhlYWQpIHsKKwkJaWYgKHRoaXMgPT0gb2JqKSB7CisJCQlEMShwcmludGsoIiVwIGlzIG9uIGxpc3QgYXQgJXBcbiIsIG9iaiwgaGVhZCkpOworCQkJcmV0dXJuIDE7CisKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9yYXdfbm9kZV9yZWYgKnJlZikKK3sKKwlzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViOworCWludCBibG9ja25yOworCXN0cnVjdCBqZmZzMl91bmtub3duX25vZGUgbjsKKwlpbnQgcmV0LCBhZGRlZHNpemU7CisJc2l6ZV90IHJldGxlbjsKKworCWlmKCFyZWYpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJFRUVFRUsuIGpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZSBjYWxsZWQgd2l0aCBOVUxMIG5vZGVcbiIpOworCQlyZXR1cm47CisJfQorCWlmIChyZWZfb2Jzb2xldGUocmVmKSkgeworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfbWFya19ub2RlX29ic29sZXRlIGNhbGxlZCB3aXRoIGFscmVhZHkgb2Jzb2xldGUgbm9kZSBhdCAweCUwOHhcbiIsIHJlZl9vZmZzZXQocmVmKSkpOworCQlyZXR1cm47CisJfQorCWJsb2NrbnIgPSByZWYtPmZsYXNoX29mZnNldCAvIGMtPnNlY3Rvcl9zaXplOworCWlmIChibG9ja25yID49IGMtPm5yX2Jsb2NrcykgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgInJhdyBub2RlIGF0IDB4JTA4eCBpcyBvZmYgdGhlIGVuZCBvZiBkZXZpY2UhXG4iLCByZWYtPmZsYXNoX29mZnNldCk7CisJCUJVRygpOworCX0KKwlqZWIgPSAmYy0+YmxvY2tzW2Jsb2NrbnJdOworCisJaWYgKGpmZnMyX2Nhbl9tYXJrX29ic29sZXRlKGMpICYmICFqZmZzMl9pc19yZWFkb25seShjKSAmJgorCSAgICAhKGMtPmZsYWdzICYgSkZGUzJfU0JfRkxBR19NT1VOVElORykpIHsKKwkJLyogSG0uIFRoaXMgbWF5IGNvbmZ1c2Ugc3RhdGljIGxvY2sgYW5hbHlzaXMuIElmIGFueSBvZiB0aGUgYWJvdmUgCisJCSAgIHRocmVlIGNvbmRpdGlvbnMgaXMgZmFsc2UsIHdlJ3JlIGdvaW5nIHRvIHJldHVybiBmcm9tIHRoaXMgCisJCSAgIGZ1bmN0aW9uIHdpdGhvdXQgYWN0dWFsbHkgb2JsaXRlcmF0aW5nIGFueSBub2RlcyBvciBmcmVlaW5nCisJCSAgIGFueSBqZmZzMl9yYXdfbm9kZV9yZWZzLiBTbyB3ZSBkb24ndCBuZWVkIHRvIHN0b3AgZXJhc2VzIGZyb20KKwkJICAgaGFwcGVuaW5nLCBvciBwcm90ZWN0IGFnYWluc3QgcGVvcGxlIGhvbGRpbmcgYW4gb2Jzb2xldGUKKwkJICAgamZmczJfcmF3X25vZGVfcmVmIHdpdGhvdXQgdGhlIGVyYXNlX2NvbXBsZXRpb25fbG9jay4gKi8KKwkJZG93bigmYy0+ZXJhc2VfZnJlZV9zZW0pOworCX0KKworCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKworCWlmIChyZWZfZmxhZ3MocmVmKSA9PSBSRUZfVU5DSEVDS0VEKSB7CisJCUQxKGlmICh1bmxpa2VseShqZWItPnVuY2hlY2tlZF9zaXplIDwgcmVmX3RvdGxlbihjLCBqZWIsIHJlZikpKSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgInJhdyB1bmNoZWNrZWQgbm9kZSBvZiBzaXplIDB4JTA4eCBmcmVlZCBmcm9tIGVyYXNlIGJsb2NrICVkIGF0IDB4JTA4eCwgYnV0IHVuY2hlY2tlZF9zaXplIHdhcyBhbHJlYWR5IDB4JTA4eFxuIiwKKwkJCSAgICAgICByZWZfdG90bGVuKGMsIGplYiwgcmVmKSwgYmxvY2tuciwgcmVmLT5mbGFzaF9vZmZzZXQsIGplYi0+dXNlZF9zaXplKTsKKwkJCUJVRygpOworCQl9KQorCQlEMShwcmludGsoS0VSTl9ERUJVRyAiT2Jzb2xldGluZyBwcmV2aW91c2x5IHVuY2hlY2tlZCBub2RlIGF0IDB4JTA4eCBvZiBsZW4gJXg6ICIsIHJlZl9vZmZzZXQocmVmKSwgcmVmX3RvdGxlbihjLCBqZWIsIHJlZikpKTsKKwkJamViLT51bmNoZWNrZWRfc2l6ZSAtPSByZWZfdG90bGVuKGMsIGplYiwgcmVmKTsKKwkJYy0+dW5jaGVja2VkX3NpemUgLT0gcmVmX3RvdGxlbihjLCBqZWIsIHJlZik7CisJfSBlbHNlIHsKKwkJRDEoaWYgKHVubGlrZWx5KGplYi0+dXNlZF9zaXplIDwgcmVmX3RvdGxlbihjLCBqZWIsIHJlZikpKSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgInJhdyBub2RlIG9mIHNpemUgMHglMDh4IGZyZWVkIGZyb20gZXJhc2UgYmxvY2sgJWQgYXQgMHglMDh4LCBidXQgdXNlZF9zaXplIHdhcyBhbHJlYWR5IDB4JTA4eFxuIiwKKwkJCSAgICAgICByZWZfdG90bGVuKGMsIGplYiwgcmVmKSwgYmxvY2tuciwgcmVmLT5mbGFzaF9vZmZzZXQsIGplYi0+dXNlZF9zaXplKTsKKwkJCUJVRygpOworCQl9KQorCQlEMShwcmludGsoS0VSTl9ERUJVRyAiT2Jzb2xldGluZyBub2RlIGF0IDB4JTA4eCBvZiBsZW4gJXg6ICIsIHJlZl9vZmZzZXQocmVmKSwgcmVmX3RvdGxlbihjLCBqZWIsIHJlZikpKTsKKwkJamViLT51c2VkX3NpemUgLT0gcmVmX3RvdGxlbihjLCBqZWIsIHJlZik7CisJCWMtPnVzZWRfc2l6ZSAtPSByZWZfdG90bGVuKGMsIGplYiwgcmVmKTsKKwl9CisKKwkvLyBUYWtlIGNhcmUsIHRoYXQgd2FzdGVkIHNpemUgaXMgdGFrZW4gaW50byBjb25jZXJuCisJaWYgKChqZWItPmRpcnR5X3NpemUgfHwgSVNESVJUWShqZWItPndhc3RlZF9zaXplICsgcmVmX3RvdGxlbihjLCBqZWIsIHJlZikpKSAmJiBqZWIgIT0gYy0+bmV4dGJsb2NrKSB7CisJCUQxKHByaW50aygiRGlydHlpbmdcbiIpKTsKKwkJYWRkZWRzaXplID0gcmVmX3RvdGxlbihjLCBqZWIsIHJlZik7CisJCWplYi0+ZGlydHlfc2l6ZSArPSByZWZfdG90bGVuKGMsIGplYiwgcmVmKTsKKwkJYy0+ZGlydHlfc2l6ZSArPSByZWZfdG90bGVuKGMsIGplYiwgcmVmKTsKKworCQkvKiBDb252ZXJ0IHdhc3RlZCBzcGFjZSB0byBkaXJ0eSwgaWYgbm90IGEgYmFkIGJsb2NrICovCisJCWlmIChqZWItPndhc3RlZF9zaXplKSB7CisJCQlpZiAob25fbGlzdCgmamViLT5saXN0LCAmYy0+YmFkX3VzZWRfbGlzdCkpIHsKKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiTGVhdmluZyBibG9jayBhdCAlMDh4IG9uIHRoZSBiYWRfdXNlZF9saXN0XG4iLAorCQkJCQkgIGplYi0+b2Zmc2V0KSk7CisJCQkJYWRkZWRzaXplID0gMDsgLyogVG8gZm9vbCB0aGUgcmVmaWxpbmcgY29kZSBsYXRlciAqLworCQkJfSBlbHNlIHsKKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiQ29udmVydGluZyAlZCBieXRlcyBvZiB3YXN0ZWQgc3BhY2UgdG8gZGlydHkgaW4gYmxvY2sgYXQgJTA4eFxuIiwKKwkJCQkJICBqZWItPndhc3RlZF9zaXplLCBqZWItPm9mZnNldCkpOworCQkJCWFkZGVkc2l6ZSArPSBqZWItPndhc3RlZF9zaXplOworCQkJCWplYi0+ZGlydHlfc2l6ZSArPSBqZWItPndhc3RlZF9zaXplOworCQkJCWMtPmRpcnR5X3NpemUgKz0gamViLT53YXN0ZWRfc2l6ZTsKKwkJCQljLT53YXN0ZWRfc2l6ZSAtPSBqZWItPndhc3RlZF9zaXplOworCQkJCWplYi0+d2FzdGVkX3NpemUgPSAwOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJRDEocHJpbnRrKCJXYXN0aW5nXG4iKSk7CisJCWFkZGVkc2l6ZSA9IDA7CisJCWplYi0+d2FzdGVkX3NpemUgKz0gcmVmX3RvdGxlbihjLCBqZWIsIHJlZik7CisJCWMtPndhc3RlZF9zaXplICs9IHJlZl90b3RsZW4oYywgamViLCByZWYpOwkKKwl9CisJcmVmLT5mbGFzaF9vZmZzZXQgPSByZWZfb2Zmc2V0KHJlZikgfCBSRUZfT0JTT0xFVEU7CisJCisJQUNDVF9TQU5JVFlfQ0hFQ0soYywgamViKTsKKworCUQxKEFDQ1RfUEFSQU5PSUFfQ0hFQ0soamViKSk7CisKKwlpZiAoYy0+ZmxhZ3MgJiBKRkZTMl9TQl9GTEFHX01PVU5USU5HKSB7CisJCS8qIE1vdW50IGluIHByb2dyZXNzLiBEb24ndCBtdWNrIGFib3V0IHdpdGggdGhlIGJsb2NrCisJCSAgIGxpc3RzIGJlY2F1c2UgdGhleSdyZSBub3QgcmVhZHkgeWV0LCBhbmQgZG9uJ3QgYWN0dWFsbHkKKwkJICAgb2JsaXRlcmF0ZSBub2RlcyB0aGF0IGxvb2sgb2Jzb2xldGUuIElmIHRoZXkgd2VyZW4ndCAKKwkJICAgbWFya2VkIG9ic29sZXRlIG9uIHRoZSBmbGFzaCBhdCB0aGUgdGltZSB0aGV5IF9iZWNhbWVfCisJCSAgIG9ic29sZXRlLCB0aGVyZSB3YXMgcHJvYmFibHkgYSByZWFzb24gZm9yIHRoYXQuICovCisJCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCQkvKiBXZSBkaWRuJ3QgbG9jayB0aGUgZXJhc2VfZnJlZV9zZW0gKi8KKwkJcmV0dXJuOworCX0KKworCWlmIChqZWIgPT0gYy0+bmV4dGJsb2NrKSB7CisJCUQyKHByaW50ayhLRVJOX0RFQlVHICJOb3QgbW92aW5nIG5leHRibG9jayAweCUwOHggdG8gZGlydHkvZXJhc2VfcGVuZGluZyBsaXN0XG4iLCBqZWItPm9mZnNldCkpOworCX0gZWxzZSBpZiAoIWplYi0+dXNlZF9zaXplICYmICFqZWItPnVuY2hlY2tlZF9zaXplKSB7CisJCWlmIChqZWIgPT0gYy0+Z2NibG9jaykgeworCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgImdjYmxvY2sgYXQgMHglMDh4IGNvbXBsZXRlbHkgZGlydGllZC4gQ2xlYXJpbmcgZ2NibG9jay4uLlxuIiwgamViLT5vZmZzZXQpKTsKKwkJCWMtPmdjYmxvY2sgPSBOVUxMOworCQl9IGVsc2UgeworCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkVyYXNlYmxvY2sgYXQgMHglMDh4IGNvbXBsZXRlbHkgZGlydGllZC4gUmVtb3ZpbmcgZnJvbSAoZGlydHk/KSBsaXN0Li4uXG4iLCBqZWItPm9mZnNldCkpOworCQkJbGlzdF9kZWwoJmplYi0+bGlzdCk7CisJCX0KKwkJaWYgKGpmZnMyX3didWZfZGlydHkoYykpIHsKKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICIuLi5hbmQgYWRkaW5nIHRvIGVyYXNhYmxlX3BlbmRpbmdfd2J1Zl9saXN0XG4iKSk7CisJCQlsaXN0X2FkZF90YWlsKCZqZWItPmxpc3QsICZjLT5lcmFzYWJsZV9wZW5kaW5nX3didWZfbGlzdCk7CisJCX0gZWxzZSB7CisJCQlpZiAoamlmZmllcyAmIDEyNykgeworCQkJCS8qIE1vc3Qgb2YgdGhlIHRpbWUsIHdlIGp1c3QgZXJhc2UgaXQgaW1tZWRpYXRlbHkuIE90aGVyd2lzZSB3ZQorCQkJCSAgIHNwZW5kIGFnZXMgc2Nhbm5pbmcgaXQgb24gbW91bnQsIGV0Yy4gKi8KKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiLi4uYW5kIGFkZGluZyB0byBlcmFzZV9wZW5kaW5nX2xpc3RcbiIpKTsKKwkJCQlsaXN0X2FkZF90YWlsKCZqZWItPmxpc3QsICZjLT5lcmFzZV9wZW5kaW5nX2xpc3QpOworCQkJCWMtPm5yX2VyYXNpbmdfYmxvY2tzKys7CisJCQkJamZmczJfZXJhc2VfcGVuZGluZ190cmlnZ2VyKGMpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBTb21ldGltZXMsIGhvd2V2ZXIsIHdlIGxlYXZlIGl0IGVsc2V3aGVyZSBzbyBpdCBkb2Vzbid0IGdldAorCQkJCSAgIGltbWVkaWF0ZWx5IHJldXNlZCwgYW5kIHdlIHNwcmVhZCB0aGUgbG9hZCBhIGJpdC4gKi8KKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiLi4uYW5kIGFkZGluZyB0byBlcmFzYWJsZV9saXN0XG4iKSk7CisJCQkJbGlzdF9hZGRfdGFpbCgmamViLT5saXN0LCAmYy0+ZXJhc2FibGVfbGlzdCk7CisJCQl9CQkJCQorCQl9CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJEb25lIE9LXG4iKSk7CisJfSBlbHNlIGlmIChqZWIgPT0gYy0+Z2NibG9jaykgeworCQlEMihwcmludGsoS0VSTl9ERUJVRyAiTm90IG1vdmluZyBnY2Jsb2NrIDB4JTA4eCB0byBkaXJ0eV9saXN0XG4iLCBqZWItPm9mZnNldCkpOworCX0gZWxzZSBpZiAoSVNESVJUWShqZWItPmRpcnR5X3NpemUpICYmICFJU0RJUlRZKGplYi0+ZGlydHlfc2l6ZSAtIGFkZGVkc2l6ZSkpIHsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkVyYXNlYmxvY2sgYXQgMHglMDh4IGlzIGZyZXNobHkgZGlydGllZC4gUmVtb3ZpbmcgZnJvbSBjbGVhbiBsaXN0Li4uXG4iLCBqZWItPm9mZnNldCkpOworCQlsaXN0X2RlbCgmamViLT5saXN0KTsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIi4uLmFuZCBhZGRpbmcgdG8gZGlydHlfbGlzdFxuIikpOworCQlsaXN0X2FkZF90YWlsKCZqZWItPmxpc3QsICZjLT5kaXJ0eV9saXN0KTsKKwl9IGVsc2UgaWYgKFZFUllESVJUWShjLCBqZWItPmRpcnR5X3NpemUpICYmCisJCSAgICFWRVJZRElSVFkoYywgamViLT5kaXJ0eV9zaXplIC0gYWRkZWRzaXplKSkgeworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRXJhc2VibG9jayBhdCAweCUwOHggaXMgbm93IHZlcnkgZGlydHkuIFJlbW92aW5nIGZyb20gZGlydHkgbGlzdC4uLlxuIiwgamViLT5vZmZzZXQpKTsKKwkJbGlzdF9kZWwoJmplYi0+bGlzdCk7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICIuLi5hbmQgYWRkaW5nIHRvIHZlcnlfZGlydHlfbGlzdFxuIikpOworCQlsaXN0X2FkZF90YWlsKCZqZWItPmxpc3QsICZjLT52ZXJ5X2RpcnR5X2xpc3QpOworCX0gZWxzZSB7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJFcmFzZWJsb2NrIGF0IDB4JTA4eCBub3QgbW92ZWQgYW55d2hlcmUuIChmcmVlIDB4JTA4eCwgZGlydHkgMHglMDh4LCB1c2VkIDB4JTA4eClcbiIsCisJCQkgIGplYi0+b2Zmc2V0LCBqZWItPmZyZWVfc2l6ZSwgamViLT5kaXJ0eV9zaXplLCBqZWItPnVzZWRfc2l6ZSkpOyAKKwl9CQkJICAJCisKKwlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKworCWlmICghamZmczJfY2FuX21hcmtfb2Jzb2xldGUoYykgfHwgamZmczJfaXNfcmVhZG9ubHkoYykpIHsKKwkJLyogV2UgZGlkbid0IGxvY2sgdGhlIGVyYXNlX2ZyZWVfc2VtICovCisJCXJldHVybjsKKwl9CisKKwkvKiBUaGUgZXJhc2VfZnJlZV9zZW0gaXMgbG9ja2VkLCBhbmQgaGFzIGJlZW4gc2luY2UgYmVmb3JlIHdlIG1hcmtlZCB0aGUgbm9kZSBvYnNvbGV0ZQorCSAgIGFuZCBwb3RlbnRpYWxseSBwdXQgaXRzIGVyYXNlYmxvY2sgb250byB0aGUgZXJhc2VfcGVuZGluZ19saXN0LiBUaHVzLCB3ZSBrbm93IHRoYXQKKwkgICB0aGUgYmxvY2sgaGFzbid0IF9hbHJlYWR5XyBiZWVuIGVyYXNlZCwgYW5kIHRoYXQgJ3JlZicgaXRzZWxmIGhhc24ndCBiZWVuIGZyZWVkIHlldAorCSAgIGJ5IGpmZnMyX2ZyZWVfYWxsX25vZGVfcmVmcygpIGluIGVyYXNlLmMuIFdoaWNoIGlzIG5pY2UuICovCisKKwlEMShwcmludGsoS0VSTl9ERUJVRyAib2JsaXRlcmF0aW5nIG9ic29sZXRlZCBub2RlIGF0IDB4JTA4eFxuIiwgcmVmX29mZnNldChyZWYpKSk7CisJcmV0ID0gamZmczJfZmxhc2hfcmVhZChjLCByZWZfb2Zmc2V0KHJlZiksIHNpemVvZihuKSwgJnJldGxlbiwgKGNoYXIgKikmbik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJSZWFkIGVycm9yIHJlYWRpbmcgZnJvbSBvYnNvbGV0ZWQgbm9kZSBhdCAweCUwOHg6ICVkXG4iLCByZWZfb2Zmc2V0KHJlZiksIHJldCk7CisJCWdvdG8gb3V0X2VyYXNlX3NlbTsKKwl9CisJaWYgKHJldGxlbiAhPSBzaXplb2YobikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiU2hvcnQgcmVhZCBmcm9tIG9ic29sZXRlZCBub2RlIGF0IDB4JTA4eDogJXpkXG4iLCByZWZfb2Zmc2V0KHJlZiksIHJldGxlbik7CisJCWdvdG8gb3V0X2VyYXNlX3NlbTsKKwl9CisJaWYgKFBBRChqZTMyX3RvX2NwdShuLnRvdGxlbikpICE9IFBBRChyZWZfdG90bGVuKGMsIGplYiwgcmVmKSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTm9kZSB0b3RsZW4gb24gZmxhc2ggKDB4JTA4eCkgIT0gdG90bGVuIGZyb20gbm9kZSByZWYgKDB4JTA4eClcbiIsIGplMzJfdG9fY3B1KG4udG90bGVuKSwgcmVmX3RvdGxlbihjLCBqZWIsIHJlZikpOworCQlnb3RvIG91dF9lcmFzZV9zZW07CisJfQorCWlmICghKGplMTZfdG9fY3B1KG4ubm9kZXR5cGUpICYgSkZGUzJfTk9ERV9BQ0NVUkFURSkpIHsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIk5vZGUgYXQgMHglMDh4IHdhcyBhbHJlYWR5IG1hcmtlZCBvYnNvbGV0ZSAobm9kZXR5cGUgMHglMDR4KVxuIiwgcmVmX29mZnNldChyZWYpLCBqZTE2X3RvX2NwdShuLm5vZGV0eXBlKSkpOworCQlnb3RvIG91dF9lcmFzZV9zZW07CisJfQorCS8qIFhYWCBGSVhNRTogVGhpcyBpcyB1Z2x5IG5vdyAqLworCW4ubm9kZXR5cGUgPSBjcHVfdG9famUxNihqZTE2X3RvX2NwdShuLm5vZGV0eXBlKSAmIH5KRkZTMl9OT0RFX0FDQ1VSQVRFKTsKKwlyZXQgPSBqZmZzMl9mbGFzaF93cml0ZShjLCByZWZfb2Zmc2V0KHJlZiksIHNpemVvZihuKSwgJnJldGxlbiwgKGNoYXIgKikmbik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJXcml0ZSBlcnJvciBpbiBvYmxpdGVyYXRpbmcgb2Jzb2xldGVkIG5vZGUgYXQgMHglMDh4OiAlZFxuIiwgcmVmX29mZnNldChyZWYpLCByZXQpOworCQlnb3RvIG91dF9lcmFzZV9zZW07CisJfQorCWlmIChyZXRsZW4gIT0gc2l6ZW9mKG4pKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNob3J0IHdyaXRlIGluIG9ibGl0ZXJhdGluZyBvYnNvbGV0ZWQgbm9kZSBhdCAweCUwOHg6ICV6ZFxuIiwgcmVmX29mZnNldChyZWYpLCByZXRsZW4pOworCQlnb3RvIG91dF9lcmFzZV9zZW07CisJfQorCisJLyogTm9kZXMgd2hpY2ggaGF2ZSBiZWVuIG1hcmtlZCBvYnNvbGV0ZSBubyBsb25nZXIgbmVlZCB0byBiZQorCSAgIGFzc29jaWF0ZWQgd2l0aCBhbnkgaW5vZGUuIFJlbW92ZSB0aGVtIGZyb20gdGhlIHBlci1pbm9kZSBsaXN0LgorCSAgIAorCSAgIE5vdGUgd2UgY2FuJ3QgZG8gdGhpcyBmb3IgTkFORCBhdCB0aGUgbW9tZW50IGJlY2F1c2Ugd2UgbmVlZCAKKwkgICBvYnNvbGV0ZSBkaXJlbnQgbm9kZXMgdG8gc3RheSBvbiB0aGUgbGlzdHMsIGJlY2F1c2Ugb2YgdGhlCisJICAgaG9ycmlkbmVzcyBpbiBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfZGVsZXRpb25fZGlyZW50KCkuIEFsc28KKwkgICBiZWNhdXNlIHdlIGRlbGV0ZSB0aGUgaW5vY2FjaGUsIGFuZCBvbiBOQU5EIHdlIG5lZWQgdGhhdCB0byAKKwkgICBzdGF5IGFyb3VuZCB1bnRpbCBhbGwgdGhlIG5vZGVzIGFyZSBhY3R1YWxseSBlcmFzZWQsIGluIG9yZGVyCisJICAgdG8gc3RvcCB1cyBmcm9tIGdpdmluZyB0aGUgc2FtZSBpbm9kZSBudW1iZXIgdG8gYW5vdGhlciBuZXdseQorCSAgIGNyZWF0ZWQgaW5vZGUuICovCisJaWYgKHJlZi0+bmV4dF9pbl9pbm8pIHsKKwkJc3RydWN0IGpmZnMyX2lub2RlX2NhY2hlICppYzsKKwkJc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqKnA7CisKKwkJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCisJCWljID0gamZmczJfcmF3X3JlZl90b19pYyhyZWYpOworCQlmb3IgKHAgPSAmaWMtPm5vZGVzOyAoKnApICE9IHJlZjsgcCA9ICYoKCpwKS0+bmV4dF9pbl9pbm8pKQorCQkJOworCisJCSpwID0gcmVmLT5uZXh0X2luX2lubzsKKwkJcmVmLT5uZXh0X2luX2lubyA9IE5VTEw7CisKKwkJaWYgKGljLT5ub2RlcyA9PSAodm9pZCAqKWljKSB7CisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiaW5vY2FjaGUgZm9yIGlubyAjJXUgaXMgYWxsIGdvbmUgbm93LiBGcmVlaW5nXG4iLCBpYy0+aW5vKSk7CisJCQlqZmZzMl9kZWxfaW5vX2NhY2hlKGMsIGljKTsKKwkJCWpmZnMyX2ZyZWVfaW5vZGVfY2FjaGUoaWMpOworCQl9CisKKwkJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisJfQorCisKKwkvKiBNZXJnZSB3aXRoIHRoZSBuZXh0IG5vZGUgaW4gdGhlIHBoeXNpY2FsIGxpc3QsIGlmIHRoZXJlIGlzIG9uZQorCSAgIGFuZCBpZiBpdCdzIGFsc28gb2Jzb2xldGUgYW5kIGlmIGl0IGRvZXNuJ3QgYmVsb25nIHRvIGFueSBpbm9kZSAqLworCWlmIChyZWYtPm5leHRfcGh5cyAmJiByZWZfb2Jzb2xldGUocmVmLT5uZXh0X3BoeXMpICYmCisJICAgICFyZWYtPm5leHRfcGh5cy0+bmV4dF9pbl9pbm8pIHsKKwkJc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqbiA9IHJlZi0+bmV4dF9waHlzOworCQkKKwkJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCisJCXJlZi0+X190b3RsZW4gKz0gbi0+X190b3RsZW47CisJCXJlZi0+bmV4dF9waHlzID0gbi0+bmV4dF9waHlzOworICAgICAgICAgICAgICAgIGlmIChqZWItPmxhc3Rfbm9kZSA9PSBuKSBqZWItPmxhc3Rfbm9kZSA9IHJlZjsKKwkJaWYgKGplYi0+Z2Nfbm9kZSA9PSBuKSB7CisJCQkvKiBnYyB3aWxsIGJlIGhhcHB5IGNvbnRpbnVpbmcgZ2Mgb24gdGhpcyBub2RlICovCisJCQlqZWItPmdjX25vZGU9cmVmOworCQl9CisJCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCisJCWpmZnMyX2ZyZWVfcmF3X25vZGVfcmVmKG4pOworCX0KKwkKKwkvKiBBbHNvIG1lcmdlIHdpdGggdGhlIHByZXZpb3VzIG5vZGUgaW4gdGhlIGxpc3QsIGlmIHRoZXJlIGlzIG9uZQorCSAgIGFuZCB0aGF0IG9uZSBpcyBvYnNvbGV0ZSAqLworCWlmIChyZWYgIT0gamViLT5maXJzdF9ub2RlICkgeworCQlzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICpwID0gamViLT5maXJzdF9ub2RlOworCisJCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKworCQl3aGlsZSAocC0+bmV4dF9waHlzICE9IHJlZikKKwkJCXAgPSBwLT5uZXh0X3BoeXM7CisJCQorCQlpZiAocmVmX29ic29sZXRlKHApICYmICFyZWYtPm5leHRfaW5faW5vKSB7CisJCQlwLT5fX3RvdGxlbiArPSByZWYtPl9fdG90bGVuOworCQkJaWYgKGplYi0+bGFzdF9ub2RlID09IHJlZikgeworCQkJCWplYi0+bGFzdF9ub2RlID0gcDsKKwkJCX0KKwkJCWlmIChqZWItPmdjX25vZGUgPT0gcmVmKSB7CisJCQkJLyogZ2Mgd2lsbCBiZSBoYXBweSBjb250aW51aW5nIGdjIG9uIHRoaXMgbm9kZSAqLworCQkJCWplYi0+Z2Nfbm9kZT1wOworCQkJfQorCQkJcC0+bmV4dF9waHlzID0gcmVmLT5uZXh0X3BoeXM7CisJCQlqZmZzMl9mcmVlX3Jhd19ub2RlX3JlZihyZWYpOworCQl9CisJCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCX0KKyBvdXRfZXJhc2Vfc2VtOgorCXVwKCZjLT5lcmFzZV9mcmVlX3NlbSk7Cit9CisKKyNpZiBDT05GSUdfSkZGUzJfRlNfREVCVUcgPj0gMgordm9pZCBqZmZzMl9kdW1wX2Jsb2NrX2xpc3RzKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKQoreworCisKKwlwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZHVtcF9ibG9ja19saXN0czpcbiIpOworCXByaW50ayhLRVJOX0RFQlVHICJmbGFzaF9zaXplOiAlMDh4XG4iLCBjLT5mbGFzaF9zaXplKTsKKwlwcmludGsoS0VSTl9ERUJVRyAidXNlZF9zaXplOiAlMDh4XG4iLCBjLT51c2VkX3NpemUpOworCXByaW50ayhLRVJOX0RFQlVHICJkaXJ0eV9zaXplOiAlMDh4XG4iLCBjLT5kaXJ0eV9zaXplKTsKKwlwcmludGsoS0VSTl9ERUJVRyAid2FzdGVkX3NpemU6ICUwOHhcbiIsIGMtPndhc3RlZF9zaXplKTsKKwlwcmludGsoS0VSTl9ERUJVRyAidW5jaGVja2VkX3NpemU6ICUwOHhcbiIsIGMtPnVuY2hlY2tlZF9zaXplKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiZnJlZV9zaXplOiAlMDh4XG4iLCBjLT5mcmVlX3NpemUpOworCXByaW50ayhLRVJOX0RFQlVHICJlcmFzaW5nX3NpemU6ICUwOHhcbiIsIGMtPmVyYXNpbmdfc2l6ZSk7CisJcHJpbnRrKEtFUk5fREVCVUcgImJhZF9zaXplOiAlMDh4XG4iLCBjLT5iYWRfc2l6ZSk7CisJcHJpbnRrKEtFUk5fREVCVUcgInNlY3Rvcl9zaXplOiAlMDh4XG4iLCBjLT5zZWN0b3Jfc2l6ZSk7CisJcHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX3Jlc2VydmVkX2Jsb2NrcyBzaXplOiAlMDh4XG4iLGMtPnNlY3Rvcl9zaXplICogYy0+cmVzdl9ibG9ja3Nfd3JpdGUpOworCisJaWYgKGMtPm5leHRibG9jaykgeworCQlwcmludGsoS0VSTl9ERUJVRyAibmV4dGJsb2NrOiAlMDh4ICh1c2VkICUwOHgsIGRpcnR5ICUwOHgsIHdhc3RlZCAlMDh4LCB1bmNoZWNrZWQgJTA4eCwgZnJlZSAlMDh4KVxuIiwKKwkJICAgICAgIGMtPm5leHRibG9jay0+b2Zmc2V0LCBjLT5uZXh0YmxvY2stPnVzZWRfc2l6ZSwgYy0+bmV4dGJsb2NrLT5kaXJ0eV9zaXplLCBjLT5uZXh0YmxvY2stPndhc3RlZF9zaXplLCBjLT5uZXh0YmxvY2stPnVuY2hlY2tlZF9zaXplLCBjLT5uZXh0YmxvY2stPmZyZWVfc2l6ZSk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIm5leHRibG9jazogTlVMTFxuIik7CisJfQorCWlmIChjLT5nY2Jsb2NrKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJnY2Jsb2NrOiAlMDh4ICh1c2VkICUwOHgsIGRpcnR5ICUwOHgsIHdhc3RlZCAlMDh4LCB1bmNoZWNrZWQgJTA4eCwgZnJlZSAlMDh4KVxuIiwKKwkJICAgICAgIGMtPmdjYmxvY2stPm9mZnNldCwgYy0+Z2NibG9jay0+dXNlZF9zaXplLCBjLT5nY2Jsb2NrLT5kaXJ0eV9zaXplLCBjLT5nY2Jsb2NrLT53YXN0ZWRfc2l6ZSwgYy0+Z2NibG9jay0+dW5jaGVja2VkX3NpemUsIGMtPmdjYmxvY2stPmZyZWVfc2l6ZSk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImdjYmxvY2s6IE5VTExcbiIpOworCX0KKwlpZiAobGlzdF9lbXB0eSgmYy0+Y2xlYW5fbGlzdCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImNsZWFuX2xpc3Q6IGVtcHR5XG4iKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICp0aGlzOworCQlpbnQJbnVtYmxvY2tzID0gMDsKKwkJdWludDMyX3QgZGlydHkgPSAwOworCisJCWxpc3RfZm9yX2VhY2godGhpcywgJmMtPmNsZWFuX2xpc3QpIHsKKwkJCXN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWIgPSBsaXN0X2VudHJ5KHRoaXMsIHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrLCBsaXN0KTsKKwkJCW51bWJsb2NrcyArKzsKKwkJCWRpcnR5ICs9IGplYi0+d2FzdGVkX3NpemU7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiY2xlYW5fbGlzdDogJTA4eCAodXNlZCAlMDh4LCBkaXJ0eSAlMDh4LCB3YXN0ZWQgJTA4eCwgdW5jaGVja2VkICUwOHgsIGZyZWUgJTA4eClcbiIsIGplYi0+b2Zmc2V0LCBqZWItPnVzZWRfc2l6ZSwgamViLT5kaXJ0eV9zaXplLCBqZWItPndhc3RlZF9zaXplLCBqZWItPnVuY2hlY2tlZF9zaXplLCBqZWItPmZyZWVfc2l6ZSk7CisJCX0KKwkJcHJpbnRrIChLRVJOX0RFQlVHICJDb250YWlucyAlZCBibG9ja3Mgd2l0aCB0b3RhbCB3YXN0ZWQgc2l6ZSAldSwgYXZlcmFnZSB3YXN0ZWQgc2l6ZTogJXVcbiIsIG51bWJsb2NrcywgZGlydHksIGRpcnR5IC8gbnVtYmxvY2tzKTsKKwl9CisJaWYgKGxpc3RfZW1wdHkoJmMtPnZlcnlfZGlydHlfbGlzdCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInZlcnlfZGlydHlfbGlzdDogZW1wdHlcbiIpOworCX0gZWxzZSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgKnRoaXM7CisJCWludAludW1ibG9ja3MgPSAwOworCQl1aW50MzJfdCBkaXJ0eSA9IDA7CisKKwkJbGlzdF9mb3JfZWFjaCh0aGlzLCAmYy0+dmVyeV9kaXJ0eV9saXN0KSB7CisJCQlzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViID0gbGlzdF9lbnRyeSh0aGlzLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jaywgbGlzdCk7CisJCQludW1ibG9ja3MgKys7CisJCQlkaXJ0eSArPSBqZWItPmRpcnR5X3NpemU7CisJCQlwcmludGsoS0VSTl9ERUJVRyAidmVyeV9kaXJ0eV9saXN0OiAlMDh4ICh1c2VkICUwOHgsIGRpcnR5ICUwOHgsIHdhc3RlZCAlMDh4LCB1bmNoZWNrZWQgJTA4eCwgZnJlZSAlMDh4KVxuIiwKKwkJCSAgICAgICBqZWItPm9mZnNldCwgamViLT51c2VkX3NpemUsIGplYi0+ZGlydHlfc2l6ZSwgamViLT53YXN0ZWRfc2l6ZSwgamViLT51bmNoZWNrZWRfc2l6ZSwgamViLT5mcmVlX3NpemUpOworCQl9CisJCXByaW50ayAoS0VSTl9ERUJVRyAiQ29udGFpbnMgJWQgYmxvY2tzIHdpdGggdG90YWwgZGlydHkgc2l6ZSAldSwgYXZlcmFnZSBkaXJ0eSBzaXplOiAldVxuIiwKKwkJCW51bWJsb2NrcywgZGlydHksIGRpcnR5IC8gbnVtYmxvY2tzKTsKKwl9CisJaWYgKGxpc3RfZW1wdHkoJmMtPmRpcnR5X2xpc3QpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJkaXJ0eV9saXN0OiBlbXB0eVxuIik7CisJfSBlbHNlIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqdGhpczsKKwkJaW50CW51bWJsb2NrcyA9IDA7CisJCXVpbnQzMl90IGRpcnR5ID0gMDsKKworCQlsaXN0X2Zvcl9lYWNoKHRoaXMsICZjLT5kaXJ0eV9saXN0KSB7CisJCQlzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViID0gbGlzdF9lbnRyeSh0aGlzLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jaywgbGlzdCk7CisJCQludW1ibG9ja3MgKys7CisJCQlkaXJ0eSArPSBqZWItPmRpcnR5X3NpemU7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiZGlydHlfbGlzdDogJTA4eCAodXNlZCAlMDh4LCBkaXJ0eSAlMDh4LCB3YXN0ZWQgJTA4eCwgdW5jaGVja2VkICUwOHgsIGZyZWUgJTA4eClcbiIsCisJCQkgICAgICAgamViLT5vZmZzZXQsIGplYi0+dXNlZF9zaXplLCBqZWItPmRpcnR5X3NpemUsIGplYi0+d2FzdGVkX3NpemUsIGplYi0+dW5jaGVja2VkX3NpemUsIGplYi0+ZnJlZV9zaXplKTsKKwkJfQorCQlwcmludGsgKEtFUk5fREVCVUcgIkNvbnRhaW5zICVkIGJsb2NrcyB3aXRoIHRvdGFsIGRpcnR5IHNpemUgJXUsIGF2ZXJhZ2UgZGlydHkgc2l6ZTogJXVcbiIsCisJCQludW1ibG9ja3MsIGRpcnR5LCBkaXJ0eSAvIG51bWJsb2Nrcyk7CisJfQorCWlmIChsaXN0X2VtcHR5KCZjLT5lcmFzYWJsZV9saXN0KSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiZXJhc2FibGVfbGlzdDogZW1wdHlcbiIpOworCX0gZWxzZSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgKnRoaXM7CisKKwkJbGlzdF9mb3JfZWFjaCh0aGlzLCAmYy0+ZXJhc2FibGVfbGlzdCkgeworCQkJc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiA9IGxpc3RfZW50cnkodGhpcywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2ssIGxpc3QpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgImVyYXNhYmxlX2xpc3Q6ICUwOHggKHVzZWQgJTA4eCwgZGlydHkgJTA4eCwgd2FzdGVkICUwOHgsIHVuY2hlY2tlZCAlMDh4LCBmcmVlICUwOHgpXG4iLAorCQkJICAgICAgIGplYi0+b2Zmc2V0LCBqZWItPnVzZWRfc2l6ZSwgamViLT5kaXJ0eV9zaXplLCBqZWItPndhc3RlZF9zaXplLCBqZWItPnVuY2hlY2tlZF9zaXplLCBqZWItPmZyZWVfc2l6ZSk7CisJCX0KKwl9CisJaWYgKGxpc3RfZW1wdHkoJmMtPmVyYXNpbmdfbGlzdCkpIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgImVyYXNpbmdfbGlzdDogZW1wdHlcbiIpOworCX0gZWxzZSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgKnRoaXM7CisKKwkJbGlzdF9mb3JfZWFjaCh0aGlzLCAmYy0+ZXJhc2luZ19saXN0KSB7CisJCQlzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViID0gbGlzdF9lbnRyeSh0aGlzLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jaywgbGlzdCk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiZXJhc2luZ19saXN0OiAlMDh4ICh1c2VkICUwOHgsIGRpcnR5ICUwOHgsIHdhc3RlZCAlMDh4LCB1bmNoZWNrZWQgJTA4eCwgZnJlZSAlMDh4KVxuIiwKKwkJCSAgICAgICBqZWItPm9mZnNldCwgamViLT51c2VkX3NpemUsIGplYi0+ZGlydHlfc2l6ZSwgamViLT53YXN0ZWRfc2l6ZSwgamViLT51bmNoZWNrZWRfc2l6ZSwgamViLT5mcmVlX3NpemUpOworCQl9CisJfQorCWlmIChsaXN0X2VtcHR5KCZjLT5lcmFzZV9wZW5kaW5nX2xpc3QpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJlcmFzZV9wZW5kaW5nX2xpc3Q6IGVtcHR5XG4iKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICp0aGlzOworCisJCWxpc3RfZm9yX2VhY2godGhpcywgJmMtPmVyYXNlX3BlbmRpbmdfbGlzdCkgeworCQkJc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiA9IGxpc3RfZW50cnkodGhpcywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2ssIGxpc3QpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgImVyYXNlX3BlbmRpbmdfbGlzdDogJTA4eCAodXNlZCAlMDh4LCBkaXJ0eSAlMDh4LCB3YXN0ZWQgJTA4eCwgdW5jaGVja2VkICUwOHgsIGZyZWUgJTA4eClcbiIsCisJCQkgICAgICAgamViLT5vZmZzZXQsIGplYi0+dXNlZF9zaXplLCBqZWItPmRpcnR5X3NpemUsIGplYi0+d2FzdGVkX3NpemUsIGplYi0+dW5jaGVja2VkX3NpemUsIGplYi0+ZnJlZV9zaXplKTsKKwkJfQorCX0KKwlpZiAobGlzdF9lbXB0eSgmYy0+ZXJhc2FibGVfcGVuZGluZ193YnVmX2xpc3QpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJlcmFzYWJsZV9wZW5kaW5nX3didWZfbGlzdDogZW1wdHlcbiIpOworCX0gZWxzZSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgKnRoaXM7CisKKwkJbGlzdF9mb3JfZWFjaCh0aGlzLCAmYy0+ZXJhc2FibGVfcGVuZGluZ193YnVmX2xpc3QpIHsKKwkJCXN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWIgPSBsaXN0X2VudHJ5KHRoaXMsIHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrLCBsaXN0KTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJlcmFzYWJsZV9wZW5kaW5nX3didWZfbGlzdDogJTA4eCAodXNlZCAlMDh4LCBkaXJ0eSAlMDh4LCB3YXN0ZWQgJTA4eCwgdW5jaGVja2VkICUwOHgsIGZyZWUgJTA4eClcbiIsCisJCQkgICAgICAgamViLT5vZmZzZXQsIGplYi0+dXNlZF9zaXplLCBqZWItPmRpcnR5X3NpemUsIGplYi0+d2FzdGVkX3NpemUsIGplYi0+dW5jaGVja2VkX3NpemUsIGplYi0+ZnJlZV9zaXplKTsKKwkJfQorCX0KKwlpZiAobGlzdF9lbXB0eSgmYy0+ZnJlZV9saXN0KSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiZnJlZV9saXN0OiBlbXB0eVxuIik7CisJfSBlbHNlIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqdGhpczsKKworCQlsaXN0X2Zvcl9lYWNoKHRoaXMsICZjLT5mcmVlX2xpc3QpIHsKKwkJCXN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWIgPSBsaXN0X2VudHJ5KHRoaXMsIHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrLCBsaXN0KTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJmcmVlX2xpc3Q6ICUwOHggKHVzZWQgJTA4eCwgZGlydHkgJTA4eCwgd2FzdGVkICUwOHgsIHVuY2hlY2tlZCAlMDh4LCBmcmVlICUwOHgpXG4iLAorCQkJICAgICAgIGplYi0+b2Zmc2V0LCBqZWItPnVzZWRfc2l6ZSwgamViLT5kaXJ0eV9zaXplLCBqZWItPndhc3RlZF9zaXplLCBqZWItPnVuY2hlY2tlZF9zaXplLCBqZWItPmZyZWVfc2l6ZSk7CisJCX0KKwl9CisJaWYgKGxpc3RfZW1wdHkoJmMtPmJhZF9saXN0KSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAiYmFkX2xpc3Q6IGVtcHR5XG4iKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICp0aGlzOworCisJCWxpc3RfZm9yX2VhY2godGhpcywgJmMtPmJhZF9saXN0KSB7CisJCQlzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViID0gbGlzdF9lbnRyeSh0aGlzLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jaywgbGlzdCk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiYmFkX2xpc3Q6ICUwOHggKHVzZWQgJTA4eCwgZGlydHkgJTA4eCwgd2FzdGVkICUwOHgsIHVuY2hlY2tlZCAlMDh4LCBmcmVlICUwOHgpXG4iLAorCQkJICAgICAgIGplYi0+b2Zmc2V0LCBqZWItPnVzZWRfc2l6ZSwgamViLT5kaXJ0eV9zaXplLCBqZWItPndhc3RlZF9zaXplLCBqZWItPnVuY2hlY2tlZF9zaXplLCBqZWItPmZyZWVfc2l6ZSk7CisJCX0KKwl9CisJaWYgKGxpc3RfZW1wdHkoJmMtPmJhZF91c2VkX2xpc3QpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJiYWRfdXNlZF9saXN0OiBlbXB0eVxuIik7CisJfSBlbHNlIHsKKwkJc3RydWN0IGxpc3RfaGVhZCAqdGhpczsKKworCQlsaXN0X2Zvcl9lYWNoKHRoaXMsICZjLT5iYWRfdXNlZF9saXN0KSB7CisJCQlzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViID0gbGlzdF9lbnRyeSh0aGlzLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jaywgbGlzdCk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiYmFkX3VzZWRfbGlzdDogJTA4eCAodXNlZCAlMDh4LCBkaXJ0eSAlMDh4LCB3YXN0ZWQgJTA4eCwgdW5jaGVja2VkICUwOHgsIGZyZWUgJTA4eClcbiIsCisJCQkgICAgICAgamViLT5vZmZzZXQsIGplYi0+dXNlZF9zaXplLCBqZWItPmRpcnR5X3NpemUsIGplYi0+d2FzdGVkX3NpemUsIGplYi0+dW5jaGVja2VkX3NpemUsIGplYi0+ZnJlZV9zaXplKTsKKwkJfQorCX0KK30KKyNlbmRpZiAvKiBDT05GSUdfSkZGUzJfRlNfREVCVUcgKi8KKworaW50IGpmZnMyX3RocmVhZF9zaG91bGRfd2FrZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYykKK3sKKwlpbnQgcmV0ID0gMDsKKwl1aW50MzJfdCBkaXJ0eTsKKworCWlmIChjLT51bmNoZWNrZWRfc2l6ZSkgeworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfdGhyZWFkX3Nob3VsZF93YWtlKCk6IHVuY2hlY2tlZF9zaXplICVkLCBjaGVja2VkX2lubyAjJWRcbiIsCisJCQkgIGMtPnVuY2hlY2tlZF9zaXplLCBjLT5jaGVja2VkX2lubykpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBkaXJ0eV9zaXplIGNvbnRhaW5zIGJsb2NrcyBvbiBlcmFzZV9wZW5kaW5nX2xpc3QKKwkgKiB0aG9zZSBibG9ja3MgYXJlIGNvdW50ZWQgaW4gYy0+bnJfZXJhc2luZ19ibG9ja3MuCisJICogSWYgb25lIGJsb2NrIGlzIGFjdHVhbGx5IGVyYXNlZCwgaXQgaXMgbm90IGxvbmdlciBjb3VudGVkIGFzIGRpcnR5X3NwYWNlCisJICogYnV0IGl0IGlzIGNvdW50ZWQgaW4gYy0+bnJfZXJhc2luZ19ibG9ja3MsIHNvIHdlIGFkZCBpdCBhbmQgc3VidHJhY3QgaXQKKwkgKiB3aXRoIGMtPm5yX2VyYXNpbmdfYmxvY2tzICogYy0+c2VjdG9yX3NpemUgYWdhaW4uCisJICogQmxvY2tzIG9uIGVyYXNhYmxlX2xpc3QgYXJlIGNvdW50ZWQgYXMgZGlydHlfc2l6ZSwgYnV0IG5vdCBpbiBjLT5ucl9lcmFzaW5nX2Jsb2NrcworCSAqIFRoaXMgaGVscHMgdXMgdG8gZm9yY2UgZ2MgYW5kIHBpY2sgZXZlbnR1YWxseSBhIGNsZWFuIGJsb2NrIHRvIHNwcmVhZCB0aGUgbG9hZC4KKwkgKi8KKwlkaXJ0eSA9IGMtPmRpcnR5X3NpemUgKyBjLT5lcmFzaW5nX3NpemUgLSBjLT5ucl9lcmFzaW5nX2Jsb2NrcyAqIGMtPnNlY3Rvcl9zaXplOworCisJaWYgKGMtPm5yX2ZyZWVfYmxvY2tzICsgYy0+bnJfZXJhc2luZ19ibG9ja3MgPCBjLT5yZXN2X2Jsb2Nrc19nY3RyaWdnZXIgJiYgCisJCQkoZGlydHkgPiBjLT5ub3NwY19kaXJ0eV9zaXplKSkgCisJCXJldCA9IDE7CisKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfdGhyZWFkX3Nob3VsZF93YWtlKCk6IG5yX2ZyZWVfYmxvY2tzICVkLCBucl9lcmFzaW5nX2Jsb2NrcyAlZCwgZGlydHlfc2l6ZSAweCV4OiAlc1xuIiwgCisJCSAgYy0+bnJfZnJlZV9ibG9ja3MsIGMtPm5yX2VyYXNpbmdfYmxvY2tzLCBjLT5kaXJ0eV9zaXplLCByZXQ/InllcyI6Im5vIikpOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL29zLWxpbnV4LmggYi9mcy9qZmZzMi9vcy1saW51eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYjBhY2MKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZmZzMi9vcy1saW51eC5oCkBAIC0wLDAgKzEsMjE3IEBACisvKgorICogSkZGUzIgLS0gSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0sIFZlcnNpb24gMi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CisgKgorICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KKyAqCisgKiAkSWQ6IG9zLWxpbnV4LmgsdiAxLjUxIDIwMDQvMTEvMTYgMjA6MzY6MTEgZHdtdzIgRXhwICQKKyAqCisgKi8KKworI2lmbmRlZiBfX0pGRlMyX09TX0xJTlVYX0hfXworI2RlZmluZSBfX0pGRlMyX09TX0xJTlVYX0hfXworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworLyogSkZGUzIgdXNlcyBMaW51eCBtb2RlIGJpdHMgbmF0aXZlbHkgLS0gbm8gbmVlZCBmb3IgY29udmVyc2lvbiAqLworI2RlZmluZSBvc190b19qZmZzMl9tb2RlKHgpICh4KQorI2RlZmluZSBqZmZzMl90b19vc19tb2RlKHgpICh4KQorCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw1LDczKQorI2RlZmluZSBrc3RhdGZzIHN0YXRmcworI2VuZGlmCisKK3N0cnVjdCBrc3RhdGZzOworc3RydWN0IGt2ZWM7CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMikKKyNkZWZpbmUgSkZGUzJfSU5PREVfSU5GTyhpKSAobGlzdF9lbnRyeShpLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbywgdmZzX2lub2RlKSkKKyNkZWZpbmUgT0ZOSV9FRE9OSV8yU0ZGSihmKSAgKCYoZiktPnZmc19pbm9kZSkKKyNkZWZpbmUgSkZGUzJfU0JfSU5GTyhzYikgKHNiLT5zX2ZzX2luZm8pCisjZGVmaW5lIE9GTklfQlNfMlNGRkooYykgICgoc3RydWN0IHN1cGVyX2Jsb2NrICopYy0+b3NfcHJpdikKKyNlbGlmIGRlZmluZWQoSkZGUzJfT1VUX09GX0tFUk5FTCkKKyNkZWZpbmUgSkZGUzJfSU5PREVfSU5GTyhpKSAoKHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICopICYoaSktPnUpCisjZGVmaW5lIE9GTklfRURPTklfMlNGRkooZikgICgoc3RydWN0IGlub2RlICopICggKChjaGFyICopZikgLSAoKGNoYXIgKikoJigoc3RydWN0IGlub2RlICopTlVMTCktPnUpKSApICkKKyNkZWZpbmUgSkZGUzJfU0JfSU5GTyhzYikgKChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqKSAmKHNiKS0+dSkKKyNkZWZpbmUgT0ZOSV9CU18yU0ZGSihjKSAgKChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKikgKCAoKGNoYXIgKiljKSAtICgoY2hhciAqKSgmKChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKilOVUxMKS0+dSkpICkgKQorI2Vsc2UKKyNkZWZpbmUgSkZGUzJfSU5PREVfSU5GTyhpKSAoJmktPnUuamZmczJfaSkKKyNkZWZpbmUgT0ZOSV9FRE9OSV8yU0ZGSihmKSAgKChzdHJ1Y3QgaW5vZGUgKikgKCAoKGNoYXIgKilmKSAtICgoY2hhciAqKSgmKChzdHJ1Y3QgaW5vZGUgKilOVUxMKS0+dSkpICkgKQorI2RlZmluZSBKRkZTMl9TQl9JTkZPKHNiKSAoJnNiLT51LmpmZnMyX3NiKQorI2RlZmluZSBPRk5JX0JTXzJTRkZKKGMpICAoKHN0cnVjdCBzdXBlcl9ibG9jayAqKSAoICgoY2hhciAqKWMpIC0gKChjaGFyICopKCYoKHN0cnVjdCBzdXBlcl9ibG9jayAqKU5VTEwpLT51KSkgKSApCisjZW5kaWYKKworCisjZGVmaW5lIEpGRlMyX0ZfSV9TSVpFKGYpIChPRk5JX0VET05JXzJTRkZKKGYpLT5pX3NpemUpCisjZGVmaW5lIEpGRlMyX0ZfSV9NT0RFKGYpIChPRk5JX0VET05JXzJTRkZKKGYpLT5pX21vZGUpCisjZGVmaW5lIEpGRlMyX0ZfSV9VSUQoZikgKE9GTklfRURPTklfMlNGRkooZiktPmlfdWlkKQorI2RlZmluZSBKRkZTMl9GX0lfR0lEKGYpIChPRk5JX0VET05JXzJTRkZKKGYpLT5pX2dpZCkKKworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSwxKQorI2RlZmluZSBKRkZTMl9GX0lfUkRFVl9NSU4oZikgKGltaW5vcihPRk5JX0VET05JXzJTRkZKKGYpKSkKKyNkZWZpbmUgSkZGUzJfRl9JX1JERVZfTUFKKGYpIChpbWFqb3IoT0ZOSV9FRE9OSV8yU0ZGSihmKSkpCisjZWxzZQorI2RlZmluZSBKRkZTMl9GX0lfUkRFVl9NSU4oZikgKE1JTk9SKHRvX2tkZXZfdChPRk5JX0VET05JXzJTRkZKKGYpLT5pX3JkZXYpKSkKKyNkZWZpbmUgSkZGUzJfRl9JX1JERVZfTUFKKGYpIChNQUpPUih0b19rZGV2X3QoT0ZOSV9FRE9OSV8yU0ZGSihmKS0+aV9yZGV2KSkpCisjZW5kaWYKKworLyogVXJnaC4gVGhlIHRoaW5ncyB3ZSBkbyB0byBrZWVwIHRoZSAyLjQgYnVpbGQgd29ya2luZyAqLworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+IEtFUk5FTF9WRVJTSU9OKDIsNSw0NykKKyNkZWZpbmUgSVRJTUUoc2VjKSAoKHN0cnVjdCB0aW1lc3BlYyl7c2VjLCAwfSkKKyNkZWZpbmUgSV9TRUModHYpICgodHYpLnR2X3NlYykKKyNkZWZpbmUgSkZGUzJfRl9JX0NUSU1FKGYpIChPRk5JX0VET05JXzJTRkZKKGYpLT5pX2N0aW1lLnR2X3NlYykKKyNkZWZpbmUgSkZGUzJfRl9JX01USU1FKGYpIChPRk5JX0VET05JXzJTRkZKKGYpLT5pX210aW1lLnR2X3NlYykKKyNkZWZpbmUgSkZGUzJfRl9JX0FUSU1FKGYpIChPRk5JX0VET05JXzJTRkZKKGYpLT5pX2F0aW1lLnR2X3NlYykKKyNlbHNlCisjZGVmaW5lIElUSU1FKHgpICh4KQorI2RlZmluZSBJX1NFQyh4KSAoeCkKKyNkZWZpbmUgSkZGUzJfRl9JX0NUSU1FKGYpIChPRk5JX0VET05JXzJTRkZKKGYpLT5pX2N0aW1lKQorI2RlZmluZSBKRkZTMl9GX0lfTVRJTUUoZikgKE9GTklfRURPTklfMlNGRkooZiktPmlfbXRpbWUpCisjZGVmaW5lIEpGRlMyX0ZfSV9BVElNRShmKSAoT0ZOSV9FRE9OSV8yU0ZGSihmKS0+aV9hdGltZSkKKyNlbmRpZgorCisjZGVmaW5lIHNsZWVwX29uX3NwaW51bmxvY2sod3EsIHMpCQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJREVDTEFSRV9XQUlUUVVFVUUoX193YWl0LCBjdXJyZW50KTsJCVwKKwkJYWRkX3dhaXRfcXVldWUoKHdxKSwgJl9fd2FpdCk7CQkJXAorCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CVwKKwkJc3Bpbl91bmxvY2socyk7CQkJCQlcCisJCXNjaGVkdWxlKCk7CQkJCQlcCisJCXJlbW92ZV93YWl0X3F1ZXVlKCh3cSksICZfX3dhaXQpOwkJXAorCX0gd2hpbGUoMCkKKworc3RhdGljIGlubGluZSB2b2lkIGpmZnMyX2luaXRfaW5vZGVfaW5mbyhzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZikKK3sKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPiBLRVJORUxfVkVSU0lPTigyLDUsMikKKwlmLT5oaWdoZXN0X3ZlcnNpb24gPSAwOworCWYtPmZyYWd0cmVlID0gUkJfUk9PVDsKKwlmLT5tZXRhZGF0YSA9IE5VTEw7CisJZi0+ZGVudHMgPSBOVUxMOworCWYtPmZsYWdzID0gMDsKKwlmLT51c2VyY29tcHIgPSAwOworI2Vsc2UKKwltZW1zZXQoZiwgMCwgc2l6ZW9mKCpmKSk7CisJaW5pdF9NVVRFWF9MT0NLRUQoJmYtPnNlbSk7CisjZW5kaWYKK30KKworI2RlZmluZSBqZmZzMl9pc19yZWFkb25seShjKSAoT0ZOSV9CU18yU0ZGSihjKS0+c19mbGFncyAmIE1TX1JET05MWSkKKworI2lmICghZGVmaW5lZCBDT05GSUdfSkZGUzJfRlNfTkFORCAmJiAhZGVmaW5lZCBDT05GSUdfSkZGUzJfRlNfTk9SX0VDQykKKyNkZWZpbmUgamZmczJfY2FuX21hcmtfb2Jzb2xldGUoYykgKDEpCisjZGVmaW5lIGpmZnMyX2NsZWFubWFya2VyX29vYihjKSAoMCkKKyNkZWZpbmUgamZmczJfd3JpdGVfbmFuZF9jbGVhbm1hcmtlcihjLGplYikgKC1FSU8pCisKKyNkZWZpbmUgamZmczJfZmxhc2hfd3JpdGUoYywgb2ZzLCBsZW4sIHJldGxlbiwgYnVmKSAoKGMpLT5tdGQtPndyaXRlKChjKS0+bXRkLCBvZnMsIGxlbiwgcmV0bGVuLCBidWYpKQorI2RlZmluZSBqZmZzMl9mbGFzaF9yZWFkKGMsIG9mcywgbGVuLCByZXRsZW4sIGJ1ZikgKChjKS0+bXRkLT5yZWFkKChjKS0+bXRkLCBvZnMsIGxlbiwgcmV0bGVuLCBidWYpKQorI2RlZmluZSBqZmZzMl9mbHVzaF93YnVmX3BhZChjKSAoeyAodm9pZCkoYyksIDA7IH0pCisjZGVmaW5lIGpmZnMyX2ZsdXNoX3didWZfZ2MoYywgaSkgKHsgKHZvaWQpKGMpLCAodm9pZCkgaSwgMDsgfSkKKyNkZWZpbmUgamZmczJfd3JpdGVfbmFuZF9iYWRibG9jayhjLGplYixiYWRfb2Zmc2V0KSAoMSkKKyNkZWZpbmUgamZmczJfbmFuZF9mbGFzaF9zZXR1cChjKSAoMCkKKyNkZWZpbmUgamZmczJfbmFuZF9mbGFzaF9jbGVhbnVwKGMpIGRvIHt9IHdoaWxlKDApCisjZGVmaW5lIGpmZnMyX3didWZfZGlydHkoYykgKDApCisjZGVmaW5lIGpmZnMyX2ZsYXNoX3dyaXRldihhLGIsYyxkLGUsZikgamZmczJfZmxhc2hfZGlyZWN0X3dyaXRldihhLGIsYyxkLGUpCisjZGVmaW5lIGpmZnMyX3didWZfdGltZW91dCBOVUxMCisjZGVmaW5lIGpmZnMyX3didWZfcHJvY2VzcyBOVUxMCisjZGVmaW5lIGpmZnMyX25vcl9lY2MoYykgKDApCisjZGVmaW5lIGpmZnMyX25vcl9lY2NfZmxhc2hfc2V0dXAoYykgKDApCisjZGVmaW5lIGpmZnMyX25vcl9lY2NfZmxhc2hfY2xlYW51cChjKSBkbyB7fSB3aGlsZSAoMCkKKworI2Vsc2UgLyogTkFORCBhbmQvb3IgRUNDJ2QgTk9SIHN1cHBvcnQgcHJlc2VudCAqLworCisjZGVmaW5lIGpmZnMyX2Nhbl9tYXJrX29ic29sZXRlKGMpICgoYy0+bXRkLT50eXBlID09IE1URF9OT1JGTEFTSCAmJiAhKGMtPm10ZC0+ZmxhZ3MgJiBNVERfRUNDKSkgfHwgYy0+bXRkLT50eXBlID09IE1URF9SQU0pCisjZGVmaW5lIGpmZnMyX2NsZWFubWFya2VyX29vYihjKSAoYy0+bXRkLT50eXBlID09IE1URF9OQU5ERkxBU0gpCisKKyNkZWZpbmUgamZmczJfZmxhc2hfd3JpdGVfb29iKGMsIG9mcywgbGVuLCByZXRsZW4sIGJ1ZikgKChjKS0+bXRkLT53cml0ZV9vb2IoKGMpLT5tdGQsIG9mcywgbGVuLCByZXRsZW4sIGJ1ZikpCisjZGVmaW5lIGpmZnMyX2ZsYXNoX3JlYWRfb29iKGMsIG9mcywgbGVuLCByZXRsZW4sIGJ1ZikgKChjKS0+bXRkLT5yZWFkX29vYigoYyktPm10ZCwgb2ZzLCBsZW4sIHJldGxlbiwgYnVmKSkKKyNkZWZpbmUgamZmczJfd2J1Zl9kaXJ0eShjKSAoISEoYyktPndidWZfbGVuKQorCisvKiB3YnVmLmMgKi8KK2ludCBqZmZzMl9mbGFzaF93cml0ZXYoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIGNvbnN0IHN0cnVjdCBrdmVjICp2ZWNzLCB1bnNpZ25lZCBsb25nIGNvdW50LCBsb2ZmX3QgdG8sIHNpemVfdCAqcmV0bGVuLCB1aW50MzJfdCBpbm8pOworaW50IGpmZnMyX2ZsYXNoX3dyaXRlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBsb2ZmX3Qgb2ZzLCBzaXplX3QgbGVuLCBzaXplX3QgKnJldGxlbiwgY29uc3QgdV9jaGFyICpidWYpOworaW50IGpmZnMyX2ZsYXNoX3JlYWQoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIGxvZmZfdCBvZnMsIHNpemVfdCBsZW4sIHNpemVfdCAqcmV0bGVuLCB1X2NoYXIgKmJ1Zik7CitpbnQgamZmczJfY2hlY2tfb29iX2VtcHR5KHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViLGludCBtb2RlKTsKK2ludCBqZmZzMl9jaGVja19uYW5kX2NsZWFubWFya2VyKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViKTsKK2ludCBqZmZzMl93cml0ZV9uYW5kX2NsZWFubWFya2VyKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViKTsKK2ludCBqZmZzMl93cml0ZV9uYW5kX2JhZGJsb2NrKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViLCB1aW50MzJfdCBiYWRfb2Zmc2V0KTsKK3ZvaWQgamZmczJfd2J1Zl90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSk7Cit2b2lkIGpmZnMyX3didWZfcHJvY2Vzcyh2b2lkICpkYXRhKTsKK2ludCBqZmZzMl9mbHVzaF93YnVmX2djKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCB1aW50MzJfdCBpbm8pOworaW50IGpmZnMyX2ZsdXNoX3didWZfcGFkKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKTsKK2ludCBqZmZzMl9uYW5kX2ZsYXNoX3NldHVwKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKTsKK3ZvaWQgamZmczJfbmFuZF9mbGFzaF9jbGVhbnVwKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKTsKKyNpZmRlZiBDT05GSUdfSkZGUzJfRlNfTk9SX0VDQworI2RlZmluZSBqZmZzMl9ub3JfZWNjKGMpIChjLT5tdGQtPnR5cGUgPT0gTVREX05PUkZMQVNIICYmIChjLT5tdGQtPmZsYWdzICYgTVREX0VDQykpCitpbnQgamZmczJfbm9yX2VjY19mbGFzaF9zZXR1cChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyk7Cit2b2lkIGpmZnMyX25vcl9lY2NfZmxhc2hfY2xlYW51cChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyk7CisjZWxzZQorI2RlZmluZSBqZmZzMl9ub3JfZWNjKGMpICgwKQorI2RlZmluZSBqZmZzMl9ub3JfZWNjX2ZsYXNoX3NldHVwKGMpICgwKQorI2RlZmluZSBqZmZzMl9ub3JfZWNjX2ZsYXNoX2NsZWFudXAoYykgZG8ge30gd2hpbGUgKDApCisjZW5kaWYgLyogTk9SIEVDQyAqLworI2VuZGlmIC8qIE5BTkQgKi8KKworLyogZXJhc2UuYyAqLworc3RhdGljIGlubGluZSB2b2lkIGpmZnMyX2VyYXNlX3BlbmRpbmdfdHJpZ2dlcihzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYykKK3sKKwlPRk5JX0JTXzJTRkZKKGMpLT5zX2RpcnQgPSAxOworfQorCisvKiBiYWNrZ3JvdW5kLmMgKi8KK2ludCBqZmZzMl9zdGFydF9nYXJiYWdlX2NvbGxlY3RfdGhyZWFkKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKTsKK3ZvaWQgamZmczJfc3RvcF9nYXJiYWdlX2NvbGxlY3RfdGhyZWFkKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKTsKK3ZvaWQgamZmczJfZ2FyYmFnZV9jb2xsZWN0X3RyaWdnZXIoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpOworCisvKiBkaXIuYyAqLworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgamZmczJfZGlyX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgamZmczJfZGlyX2lub2RlX29wZXJhdGlvbnM7CisKKy8qIGZpbGUuYyAqLworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgamZmczJfZmlsZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGpmZnMyX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGpmZnMyX2ZpbGVfYWRkcmVzc19vcGVyYXRpb25zOworaW50IGpmZnMyX2ZzeW5jKHN0cnVjdCBmaWxlICosIHN0cnVjdCBkZW50cnkgKiwgaW50KTsKK2ludCBqZmZzMl9kb19yZWFkcGFnZV91bmxvY2sgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlICpwZyk7CisKKy8qIGlvY3RsLmMgKi8KK2ludCBqZmZzMl9pb2N0bChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKKworLyogc3ltbGluay5jICovCitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgamZmczJfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCisvKiBmcy5jICovCitpbnQgamZmczJfc2V0YXR0ciAoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgaWF0dHIgKik7Cit2b2lkIGpmZnMyX3JlYWRfaW5vZGUgKHN0cnVjdCBpbm9kZSAqKTsKK3ZvaWQgamZmczJfY2xlYXJfaW5vZGUgKHN0cnVjdCBpbm9kZSAqKTsKK3ZvaWQgamZmczJfZGlydHlfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CitzdHJ1Y3QgaW5vZGUgKmpmZnMyX25ld19pbm9kZSAoc3RydWN0IGlub2RlICpkaXJfaSwgaW50IG1vZGUsCisJCQkgICAgICAgc3RydWN0IGpmZnMyX3Jhd19pbm9kZSAqcmkpOworaW50IGpmZnMyX3N0YXRmcyAoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBrc3RhdGZzICopOwordm9pZCBqZmZzMl93cml0ZV9zdXBlciAoc3RydWN0IHN1cGVyX2Jsb2NrICopOworaW50IGpmZnMyX3JlbW91bnRfZnMgKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbnQgKiwgY2hhciAqKTsKK2ludCBqZmZzMl9kb19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpOwordm9pZCBqZmZzMl9nY19yZWxlYXNlX2lub2RlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLAorCQkJICAgIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmKTsKK3N0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpqZmZzMl9nY19mZXRjaF9pbm9kZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywKKwkJCQkJICAgICAgaW50IGludW0sIGludCBubGluayk7CisKK3Vuc2lnbmVkIGNoYXIgKmpmZnMyX2djX2ZldGNoX3BhZ2Uoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIAorCQkJCSAgIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLCAKKwkJCQkgICB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQkgICB1bnNpZ25lZCBsb25nICpwcml2KTsKK3ZvaWQgamZmczJfZ2NfcmVsZWFzZV9wYWdlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLAorCQkJICAgdW5zaWduZWQgY2hhciAqcGcsCisJCQkgICB1bnNpZ25lZCBsb25nICpwcml2KTsKK3ZvaWQgamZmczJfZmxhc2hfY2xlYW51cChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyk7CisgICAgIAorCisvKiB3cml0ZXYuYyAqLworaW50IGpmZnMyX2ZsYXNoX2RpcmVjdF93cml0ZXYoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIGNvbnN0IHN0cnVjdCBrdmVjICp2ZWNzLCAKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIGxvZmZfdCB0bywgc2l6ZV90ICpyZXRsZW4pOworCisKKyNlbmRpZiAvKiBfX0pGRlMyX09TX0xJTlVYX0hfXyAqLworCisKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL3B1c2hwdWxsLmggYi9mcy9qZmZzMi9wdXNocHVsbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYzJhOTEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZmZzMi9wdXNocHVsbC5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBKRkZTMiAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgVmVyc2lvbiAyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgKgorICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CisgKgorICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KKyAqCisgKiAkSWQ6IHB1c2hwdWxsLmgsdiAxLjEwIDIwMDQvMTEvMTYgMjA6MzY6MTEgZHdtdzIgRXhwICQKKyAqCisgKi8KKworI2lmbmRlZiBfX1BVU0hQVUxMX0hfXworI2RlZmluZSBfX1BVU0hQVUxMX0hfXworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworc3RydWN0IHB1c2hwdWxsIHsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJdW5zaWduZWQgaW50IGJ1ZmxlbjsKKwl1bnNpZ25lZCBpbnQgb2ZzOworCXVuc2lnbmVkIGludCByZXNlcnZlOworfTsKKworCitzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9wdXNocHVsbChzdHJ1Y3QgcHVzaHB1bGwgKnBwLCBjaGFyICpidWYsIHVuc2lnbmVkIGJ1ZmxlbiwgdW5zaWduZWQgb2ZzLCB1bnNpZ25lZCByZXNlcnZlKQoreworCXBwLT5idWYgPSBidWY7CisJcHAtPmJ1ZmxlbiA9IGJ1ZmxlbjsKKwlwcC0+b2ZzID0gb2ZzOworCXBwLT5yZXNlcnZlID0gcmVzZXJ2ZTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHVzaGJpdChzdHJ1Y3QgcHVzaHB1bGwgKnBwLCBpbnQgYml0LCBpbnQgdXNlX3Jlc2VydmVkKQoreworCWlmIChwcC0+b2ZzID49IHBwLT5idWZsZW4gLSAodXNlX3Jlc2VydmVkPzA6cHAtPnJlc2VydmUpKSB7CisJCXJldHVybiAtRU5PU1BDOworCX0KKworCWlmIChiaXQpIHsKKwkJcHAtPmJ1ZltwcC0+b2ZzID4+IDNdIHw9ICgxPDwoNy0ocHAtPm9mcyAmNykpKTsKKwl9CisJZWxzZSB7CisJCXBwLT5idWZbcHAtPm9mcyA+PiAzXSAmPSB+KDE8PCg3LShwcC0+b2ZzICY3KSkpOworCX0KKwlwcC0+b2ZzKys7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHVzaGVkYml0cyhzdHJ1Y3QgcHVzaHB1bGwgKnBwKQoreworCXJldHVybiBwcC0+b2ZzOworfQorCitzdGF0aWMgaW5saW5lIGludCBwdWxsYml0KHN0cnVjdCBwdXNocHVsbCAqcHApCit7CisJaW50IGJpdDsKKworCWJpdCA9IChwcC0+YnVmW3BwLT5vZnMgPj4gM10gPj4gKDctKHBwLT5vZnMgJiA3KSkpICYgMTsKKworCXBwLT5vZnMrKzsKKwlyZXR1cm4gYml0OworfQorCitzdGF0aWMgaW5saW5lIGludCBwdWxsZWRiaXRzKHN0cnVjdCBwdXNocHVsbCAqcHApCit7CisJcmV0dXJuIHBwLT5vZnM7Cit9CisKKyNlbmRpZiAvKiBfX1BVU0hQVUxMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvcmVhZC5jIGIvZnMvamZmczIvcmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNDkzZGMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZmZzMi9yZWFkLmMKQEAgLTAsMCArMSwyNDYgQEAKKy8qCisgKiBKRkZTMiAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgVmVyc2lvbiAyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBDcmVhdGVkIGJ5IERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4KKyAqCisgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgorICoKKyAqICRJZDogcmVhZC5jLHYgMS4zOCAyMDA0LzExLzE2IDIwOjM2OjEyIGR3bXcyIEV4cCAkCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSAibm9kZWxpc3QuaCIKKyNpbmNsdWRlICJjb21wci5oIgorCitpbnQgamZmczJfcmVhZF9kbm9kZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsCisJCSAgICAgc3RydWN0IGpmZnMyX2Z1bGxfZG5vZGUgKmZkLCB1bnNpZ25lZCBjaGFyICpidWYsCisJCSAgICAgaW50IG9mcywgaW50IGxlbikKK3sKKwlzdHJ1Y3QgamZmczJfcmF3X2lub2RlICpyaTsKKwlzaXplX3QgcmVhZGxlbjsKKwl1aW50MzJfdCBjcmM7CisJdW5zaWduZWQgY2hhciAqZGVjb21wcmJ1ZiA9IE5VTEw7CisJdW5zaWduZWQgY2hhciAqcmVhZGJ1ZiA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwlyaSA9IGpmZnMyX2FsbG9jX3Jhd19pbm9kZSgpOworCWlmICghcmkpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gamZmczJfZmxhc2hfcmVhZChjLCByZWZfb2Zmc2V0KGZkLT5yYXcpLCBzaXplb2YoKnJpKSwgJnJlYWRsZW4sIChjaGFyICopcmkpOworCWlmIChyZXQpIHsKKwkJamZmczJfZnJlZV9yYXdfaW5vZGUocmkpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJFcnJvciByZWFkaW5nIG5vZGUgZnJvbSAweCUwOHg6ICVkXG4iLCByZWZfb2Zmc2V0KGZkLT5yYXcpLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlpZiAocmVhZGxlbiAhPSBzaXplb2YoKnJpKSkgeworCQlqZmZzMl9mcmVlX3Jhd19pbm9kZShyaSk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNob3J0IHJlYWQgZnJvbSAweCUwOHg6IHdhbnRlZCAweCV6eCBieXRlcywgZ290IDB4JXp4XG4iLCAKKwkJICAgICAgIHJlZl9vZmZzZXQoZmQtPnJhdyksIHNpemVvZigqcmkpLCByZWFkbGVuKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWNyYyA9IGNyYzMyKDAsIHJpLCBzaXplb2YoKnJpKS04KTsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJOb2RlIHJlYWQgZnJvbSAlMDh4OiBub2RlX2NyYyAlMDh4LCBjYWxjdWxhdGVkIENSQyAlMDh4LiBkc2l6ZSAleCwgY3NpemUgJXgsIG9mZnNldCAleCwgYnVmICVwXG4iLAorCQkgIHJlZl9vZmZzZXQoZmQtPnJhdyksIGplMzJfdG9fY3B1KHJpLT5ub2RlX2NyYyksCisJCSAgY3JjLCBqZTMyX3RvX2NwdShyaS0+ZHNpemUpLCBqZTMyX3RvX2NwdShyaS0+Y3NpemUpLAorCQkgIGplMzJfdG9fY3B1KHJpLT5vZmZzZXQpLCBidWYpKTsKKwlpZiAoY3JjICE9IGplMzJfdG9fY3B1KHJpLT5ub2RlX2NyYykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTm9kZSBDUkMgJTA4eCAhPSBjYWxjdWxhdGVkIENSQyAlMDh4IGZvciBub2RlIGF0ICUwOHhcbiIsCisJCSAgICAgICBqZTMyX3RvX2NwdShyaS0+bm9kZV9jcmMpLCBjcmMsIHJlZl9vZmZzZXQoZmQtPnJhdykpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIG91dF9yaTsKKwl9CisJLyogVGhlcmUgd2FzIGEgYnVnIHdoZXJlIHdlIHdyb3RlIGhvbGUgbm9kZXMgb3V0IHdpdGggY3NpemUvZHNpemUKKwkgICBzd2FwcGVkLiBEZWFsIHdpdGggaXQgKi8KKwlpZiAocmktPmNvbXByID09IEpGRlMyX0NPTVBSX1pFUk8gJiYgIWplMzJfdG9fY3B1KHJpLT5kc2l6ZSkgJiYgCisJICAgIGplMzJfdG9fY3B1KHJpLT5jc2l6ZSkpIHsKKwkJcmktPmRzaXplID0gcmktPmNzaXplOworCQlyaS0+Y3NpemUgPSBjcHVfdG9famUzMigwKTsKKwl9CisKKwlEMShpZihvZnMgKyBsZW4gPiBqZTMyX3RvX2NwdShyaS0+ZHNpemUpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImpmZnMyX3JlYWRfZG5vZGUoKSBhc2tlZCBmb3IgJWQgYnl0ZXMgYXQgJWQgZnJvbSAlZC1ieXRlIG5vZGVcbiIsCisJCSAgICAgICBsZW4sIG9mcywgamUzMl90b19jcHUocmktPmRzaXplKSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X3JpOworCX0pOworCisJCisJaWYgKHJpLT5jb21wciA9PSBKRkZTMl9DT01QUl9aRVJPKSB7CisJCW1lbXNldChidWYsIDAsIGxlbik7CisJCWdvdG8gb3V0X3JpOworCX0KKworCS8qIENhc2VzOgorCSAgIFJlYWRpbmcgd2hvbGUgbm9kZSBhbmQgaXQncyB1bmNvbXByZXNzZWQgLSByZWFkIGRpcmVjdGx5IHRvIGJ1ZmZlciBwcm92aWRlZCwgY2hlY2sgQ1JDLgorCSAgIFJlYWRpbmcgd2hvbGUgbm9kZSBhbmQgaXQncyBjb21wcmVzc2VkIC0gcmVhZCBpbnRvIGNvbXByYnVmLCBjaGVjayBDUkMgYW5kIGRlY29tcHJlc3MgdG8gYnVmZmVyIHByb3ZpZGVkIAorCSAgIFJlYWRpbmcgcGFydGlhbCBub2RlIGFuZCBpdCdzIHVuY29tcHJlc3NlZCAtIHJlYWQgaW50byByZWFkYnVmLCBjaGVjayBDUkMsIGFuZCBjb3B5IAorCSAgIFJlYWRpbmcgcGFydGlhbCBub2RlIGFuZCBpdCdzIGNvbXByZXNzZWQgLSByZWFkIGludG8gcmVhZGJ1ZiwgY2hlY2sgY2hlY2tzdW0sIGRlY29tcHJlc3MgdG8gZGVjb21wcmJ1ZiBhbmQgY29weQorCSovCisJaWYgKHJpLT5jb21wciA9PSBKRkZTMl9DT01QUl9OT05FICYmIGxlbiA9PSBqZTMyX3RvX2NwdShyaS0+ZHNpemUpKSB7CisJCXJlYWRidWYgPSBidWY7CisJfSBlbHNlIHsKKwkJcmVhZGJ1ZiA9IGttYWxsb2MoamUzMl90b19jcHUocmktPmNzaXplKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcmVhZGJ1ZikgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0X3JpOworCQl9CisJfQorCWlmIChyaS0+Y29tcHIgIT0gSkZGUzJfQ09NUFJfTk9ORSkgeworCQlpZiAobGVuIDwgamUzMl90b19jcHUocmktPmRzaXplKSkgeworCQkJZGVjb21wcmJ1ZiA9IGttYWxsb2MoamUzMl90b19jcHUocmktPmRzaXplKSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWRlY29tcHJidWYpIHsKKwkJCQlyZXQgPSAtRU5PTUVNOworCQkJCWdvdG8gb3V0X3JlYWRidWY7CisJCQl9CisJCX0gZWxzZSB7CisJCQlkZWNvbXByYnVmID0gYnVmOworCQl9CisJfSBlbHNlIHsKKwkJZGVjb21wcmJ1ZiA9IHJlYWRidWY7CisJfQorCisJRDIocHJpbnRrKEtFUk5fREVCVUcgIlJlYWQgJWQgYnl0ZXMgdG8gJXBcbiIsIGplMzJfdG9fY3B1KHJpLT5jc2l6ZSksCisJCSAgcmVhZGJ1ZikpOworCXJldCA9IGpmZnMyX2ZsYXNoX3JlYWQoYywgKHJlZl9vZmZzZXQoZmQtPnJhdykpICsgc2l6ZW9mKCpyaSksCisJCQkgICAgICAgamUzMl90b19jcHUocmktPmNzaXplKSwgJnJlYWRsZW4sIHJlYWRidWYpOworCisJaWYgKCFyZXQgJiYgcmVhZGxlbiAhPSBqZTMyX3RvX2NwdShyaS0+Y3NpemUpKQorCQlyZXQgPSAtRUlPOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2RlY29tcHJidWY7CisKKwljcmMgPSBjcmMzMigwLCByZWFkYnVmLCBqZTMyX3RvX2NwdShyaS0+Y3NpemUpKTsKKwlpZiAoY3JjICE9IGplMzJfdG9fY3B1KHJpLT5kYXRhX2NyYykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRGF0YSBDUkMgJTA4eCAhPSBjYWxjdWxhdGVkIENSQyAlMDh4IGZvciBub2RlIGF0ICUwOHhcbiIsCisJCSAgICAgICBqZTMyX3RvX2NwdShyaS0+ZGF0YV9jcmMpLCBjcmMsIHJlZl9vZmZzZXQoZmQtPnJhdykpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIG91dF9kZWNvbXByYnVmOworCX0KKwlEMihwcmludGsoS0VSTl9ERUJVRyAiRGF0YSBDUkMgbWF0Y2hlcyBjYWxjdWxhdGVkIENSQyAlMDh4XG4iLCBjcmMpKTsKKwlpZiAocmktPmNvbXByICE9IEpGRlMyX0NPTVBSX05PTkUpIHsKKwkJRDIocHJpbnRrKEtFUk5fREVCVUcgIkRlY29tcHJlc3MgJWQgYnl0ZXMgZnJvbSAlcCB0byAlZCBieXRlcyBhdCAlcFxuIiwKKwkJCSAgamUzMl90b19jcHUocmktPmNzaXplKSwgcmVhZGJ1ZiwgamUzMl90b19jcHUocmktPmRzaXplKSwgZGVjb21wcmJ1ZikpOyAKKwkJcmV0ID0gamZmczJfZGVjb21wcmVzcyhjLCBmLCByaS0+Y29tcHIgfCAocmktPnVzZXJjb21wciA8PCA4KSwgcmVhZGJ1ZiwgZGVjb21wcmJ1ZiwgamUzMl90b19jcHUocmktPmNzaXplKSwgamUzMl90b19jcHUocmktPmRzaXplKSk7CisJCWlmIChyZXQpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVycm9yOiBqZmZzMl9kZWNvbXByZXNzIHJldHVybmVkICVkXG4iLCByZXQpOworCQkJZ290byBvdXRfZGVjb21wcmJ1ZjsKKwkJfQorCX0KKworCWlmIChsZW4gPCBqZTMyX3RvX2NwdShyaS0+ZHNpemUpKSB7CisJCW1lbWNweShidWYsIGRlY29tcHJidWYrb2ZzLCBsZW4pOworCX0KKyBvdXRfZGVjb21wcmJ1ZjoKKwlpZihkZWNvbXByYnVmICE9IGJ1ZiAmJiBkZWNvbXByYnVmICE9IHJlYWRidWYpCisJCWtmcmVlKGRlY29tcHJidWYpOworIG91dF9yZWFkYnVmOgorCWlmKHJlYWRidWYgIT0gYnVmKQorCQlrZnJlZShyZWFkYnVmKTsKKyBvdXRfcmk6CisJamZmczJfZnJlZV9yYXdfaW5vZGUocmkpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IGpmZnMyX3JlYWRfaW5vZGVfcmFuZ2Uoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLAorCQkJICAgdW5zaWduZWQgY2hhciAqYnVmLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IGxlbikKK3sKKwl1aW50MzJfdCBlbmQgPSBvZmZzZXQgKyBsZW47CisJc3RydWN0IGpmZnMyX25vZGVfZnJhZyAqZnJhZzsKKwlpbnQgcmV0OworCisJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX3JlYWRfaW5vZGVfcmFuZ2U6IGlubyAjJXUsIHJhbmdlIDB4JTA4eC0weCUwOHhcbiIsCisJCSAgZi0+aW5vY2FjaGUtPmlubywgb2Zmc2V0LCBvZmZzZXQrbGVuKSk7CisKKwlmcmFnID0gamZmczJfbG9va3VwX25vZGVfZnJhZygmZi0+ZnJhZ3RyZWUsIG9mZnNldCk7CisKKwkvKiBYWFggRklYTUU6IFdoZXJlIGEgc2luZ2xlIHBoeXNpY2FsIG5vZGUgYWN0dWFsbHkgc2hvd3MgdXAgaW4gdHdvCisJICAgZnJhZ3MsIHdlIHJlYWQgaXQgdHdpY2UuIERvbid0IGRvIHRoYXQuICovCisJLyogTm93IHdlJ3JlIHBvaW50aW5nIGF0IHRoZSBmaXJzdCBmcmFnIHdoaWNoIG92ZXJsYXBzIG91ciBwYWdlICovCisJd2hpbGUob2Zmc2V0IDwgZW5kKSB7CisJCUQyKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9yZWFkX2lub2RlX3JhbmdlOiBvZmZzZXQgJWQsIGVuZCAlZFxuIiwgb2Zmc2V0LCBlbmQpKTsKKwkJaWYgKHVubGlrZWx5KCFmcmFnIHx8IGZyYWctPm9mcyA+IG9mZnNldCkpIHsKKwkJCXVpbnQzMl90IGhvbGVzaXplID0gZW5kIC0gb2Zmc2V0OworCQkJaWYgKGZyYWcpIHsKKwkJCQlEMShwcmludGsoS0VSTl9OT1RJQ0UgIkVlcC4gSG9sZSBpbiBpbm8gIyV1IGZyYWdsaXN0LiBmcmFnLT5vZnMgPSAweCUwOHgsIG9mZnNldCA9IDB4JTA4eFxuIiwgZi0+aW5vY2FjaGUtPmlubywgZnJhZy0+b2ZzLCBvZmZzZXQpKTsKKwkJCQlob2xlc2l6ZSA9IG1pbihob2xlc2l6ZSwgZnJhZy0+b2ZzIC0gb2Zmc2V0KTsKKwkJCQlEMihqZmZzMl9wcmludF9mcmFnX2xpc3QoZikpOworCQkJfQorCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkZpbGxpbmcgbm9uLWZyYWcgaG9sZSBmcm9tICVkLSVkXG4iLCBvZmZzZXQsIG9mZnNldCtob2xlc2l6ZSkpOworCQkJbWVtc2V0KGJ1ZiwgMCwgaG9sZXNpemUpOworCQkJYnVmICs9IGhvbGVzaXplOworCQkJb2Zmc2V0ICs9IGhvbGVzaXplOworCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAodW5saWtlbHkoIWZyYWctPm5vZGUpKSB7CisJCQl1aW50MzJfdCBob2xlZW5kID0gbWluKGVuZCwgZnJhZy0+b2ZzICsgZnJhZy0+c2l6ZSk7CisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRmlsbGluZyBmcmFnIGhvbGUgZnJvbSAlZC0lZCAoZnJhZyAweCV4IDB4JXgpXG4iLCBvZmZzZXQsIGhvbGVlbmQsIGZyYWctPm9mcywgZnJhZy0+b2ZzICsgZnJhZy0+c2l6ZSkpOworCQkJbWVtc2V0KGJ1ZiwgMCwgaG9sZWVuZCAtIG9mZnNldCk7CisJCQlidWYgKz0gaG9sZWVuZCAtIG9mZnNldDsKKwkJCW9mZnNldCA9IGhvbGVlbmQ7CisJCQlmcmFnID0gZnJhZ19uZXh0KGZyYWcpOworCQkJY29udGludWU7CisJCX0gZWxzZSB7CisJCQl1aW50MzJfdCByZWFkbGVuOworCQkJdWludDMyX3QgZnJhZ29mczsgLyogb2Zmc2V0IHdpdGhpbiB0aGUgZnJhZyB0byBzdGFydCByZWFkaW5nICovCisJCQkKKwkJCWZyYWdvZnMgPSBvZmZzZXQgLSBmcmFnLT5vZnM7CisJCQlyZWFkbGVuID0gbWluKGZyYWctPnNpemUgLSBmcmFnb2ZzLCBlbmQgLSBvZmZzZXQpOworCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIlJlYWRpbmcgJWQtJWQgZnJvbSBub2RlIGF0IDB4JTA4eCAoJWQpXG4iLAorCQkJCSAgZnJhZy0+b2ZzK2ZyYWdvZnMsIGZyYWctPm9mcytmcmFnb2ZzK3JlYWRsZW4sCisJCQkJICByZWZfb2Zmc2V0KGZyYWctPm5vZGUtPnJhdyksIHJlZl9mbGFncyhmcmFnLT5ub2RlLT5yYXcpKSk7CisJCQlyZXQgPSBqZmZzMl9yZWFkX2Rub2RlKGMsIGYsIGZyYWctPm5vZGUsIGJ1ZiwgZnJhZ29mcyArIGZyYWctPm9mcyAtIGZyYWctPm5vZGUtPm9mcywgcmVhZGxlbik7CisJCQlEMihwcmludGsoS0VSTl9ERUJVRyAibm9kZSByZWFkIGRvbmVcbiIpKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyJqZmZzMl9yZWFkX2lub2RlX3JhbmdlIGVycm9yICVkXG4iLHJldCkpOworCQkJCW1lbXNldChidWYsIDAsIHJlYWRsZW4pOworCQkJCXJldHVybiByZXQ7CisJCQl9CisJCQlidWYgKz0gcmVhZGxlbjsKKwkJCW9mZnNldCArPSByZWFkbGVuOworCQkJZnJhZyA9IGZyYWdfbmV4dChmcmFnKTsKKwkJCUQyKHByaW50ayhLRVJOX0RFQlVHICJub2RlIHJlYWQgd2FzIE9LLiBMb29waW5nXG4iKSk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIENvcmUgZnVuY3Rpb24gdG8gcmVhZCBzeW1saW5rIHRhcmdldC4gKi8KK2NoYXIgKmpmZnMyX2dldGxpbmsoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmKQoreworCWNoYXIgKmJ1ZjsKKwlpbnQgcmV0OworCisJZG93bigmZi0+c2VtKTsKKworCWlmICghZi0+bWV0YWRhdGEpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJObyBtZXRhZGF0YSBmb3Igc3ltbGluayBpbm9kZSAjJXVcbiIsIGYtPmlub2NhY2hlLT5pbm8pOworCQl1cCgmZi0+c2VtKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCWJ1ZiA9IGttYWxsb2MoZi0+bWV0YWRhdGEtPnNpemUrMSwgR0ZQX1VTRVIpOworCWlmICghYnVmKSB7CisJCXVwKCZmLT5zZW0pOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisJYnVmW2YtPm1ldGFkYXRhLT5zaXplXT0wOworCisJcmV0ID0gamZmczJfcmVhZF9kbm9kZShjLCBmLCBmLT5tZXRhZGF0YSwgYnVmLCAwLCBmLT5tZXRhZGF0YS0+c2l6ZSk7CisKKwl1cCgmZi0+c2VtKTsKKworCWlmIChyZXQpIHsKKwkJa2ZyZWUoYnVmKTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwl9CisJcmV0dXJuIGJ1ZjsKK30KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL3JlYWRpbm9kZS5jIGIvZnMvamZmczIvcmVhZGlub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNhNGEwYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMyL3JlYWRpbm9kZS5jCkBAIC0wLDAgKzEsNjk1IEBACisvKgorICogSkZGUzIgLS0gSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0sIFZlcnNpb24gMi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CisgKgorICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KKyAqCisgKiAkSWQ6IHJlYWRpbm9kZS5jLHYgMS4xMTcgMjAwNC8xMS8yMCAxODowNjo1NCBkd213MiBFeHAgJAorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSAibm9kZWxpc3QuaCIKKworc3RhdGljIGludCBqZmZzMl9hZGRfZnJhZ190b19mcmFndHJlZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IHJiX3Jvb3QgKmxpc3QsIHN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKm5ld2ZyYWcpOworCisjaWYgQ09ORklHX0pGRlMyX0ZTX0RFQlVHID49IDIKK3N0YXRpYyB2b2lkIGpmZnMyX3ByaW50X2ZyYWd0cmVlKHN0cnVjdCByYl9yb290ICpsaXN0LCBpbnQgcGVybWl0YnVnKQoreworCXN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKnRoaXMgPSBmcmFnX2ZpcnN0KGxpc3QpOworCXVpbnQzMl90IGxhc3RvZnMgPSAwOworCWludCBidWdneSA9IDA7CisKKwl3aGlsZSh0aGlzKSB7CisJCWlmICh0aGlzLT5ub2RlKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImZyYWcgJTA0eC0lMDR4OiAweCUwOHgoJWQpIG9uIGZsYXNoICgqJXApLiBsZWZ0ICglcCksIHJpZ2h0ICglcCksIHBhcmVudCAoJXApXG4iLAorCQkJICAgICAgIHRoaXMtPm9mcywgdGhpcy0+b2ZzK3RoaXMtPnNpemUsIHJlZl9vZmZzZXQodGhpcy0+bm9kZS0+cmF3KSwgcmVmX2ZsYWdzKHRoaXMtPm5vZGUtPnJhdyksCisJCQkgICAgICAgdGhpcywgZnJhZ19sZWZ0KHRoaXMpLCBmcmFnX3JpZ2h0KHRoaXMpLCBmcmFnX3BhcmVudCh0aGlzKSk7CisJCWVsc2UgCisJCQlwcmludGsoS0VSTl9ERUJVRyAiZnJhZyAlMDR4LSUwNHg6IGhvbGUgKColcCkuIGxlZnQgKCVwfSByaWdodCAoJXApLCBwYXJlbnQgKCVwKVxuIiwgdGhpcy0+b2ZzLCAKKwkJCSAgICAgICB0aGlzLT5vZnMrdGhpcy0+c2l6ZSwgdGhpcywgZnJhZ19sZWZ0KHRoaXMpLCBmcmFnX3JpZ2h0KHRoaXMpLCBmcmFnX3BhcmVudCh0aGlzKSk7CisJCWlmICh0aGlzLT5vZnMgIT0gbGFzdG9mcykKKwkJCWJ1Z2d5ID0gMTsKKwkJbGFzdG9mcyA9IHRoaXMtPm9mcyt0aGlzLT5zaXplOworCQl0aGlzID0gZnJhZ19uZXh0KHRoaXMpOworCX0KKwlpZiAoYnVnZ3kgJiYgIXBlcm1pdGJ1ZykgeworCQlwcmludGsoS0VSTl9DUklUICJGcmFnIHRyZWUgZ290IGEgaG9sZSBpbiBpdFxuIik7CisJCUJVRygpOworCX0KK30KKwordm9pZCBqZmZzMl9wcmludF9mcmFnX2xpc3Qoc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYpCit7CisJamZmczJfcHJpbnRfZnJhZ3RyZWUoJmYtPmZyYWd0cmVlLCAwKTsKKworCWlmIChmLT5tZXRhZGF0YSkgeworCQlwcmludGsoS0VSTl9ERUJVRyAibWV0YWRhdGEgYXQgMHglMDh4XG4iLCByZWZfb2Zmc2V0KGYtPm1ldGFkYXRhLT5yYXcpKTsKKwl9Cit9CisjZW5kaWYKKworI2lmIENPTkZJR19KRkZTMl9GU19ERUJVRyA+PSAxCitzdGF0aWMgaW50IGpmZnMyX3Nhbml0eWNoZWNrX2ZyYWd0cmVlKHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmKQoreworCXN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKmZyYWc7CisJaW50IGJpdGNoZWQgPSAwOworCisJZm9yIChmcmFnID0gZnJhZ19maXJzdCgmZi0+ZnJhZ3RyZWUpOyBmcmFnOyBmcmFnID0gZnJhZ19uZXh0KGZyYWcpKSB7CisKKwkJc3RydWN0IGpmZnMyX2Z1bGxfZG5vZGUgKmZuID0gZnJhZy0+bm9kZTsKKwkJaWYgKCFmbiB8fCAhZm4tPnJhdykKKwkJCWNvbnRpbnVlOworCisJCWlmIChyZWZfZmxhZ3MoZm4tPnJhdykgPT0gUkVGX1BSSVNUSU5FKSB7CisKKwkJCWlmIChmbi0+ZnJhZ3MgPiAxKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUkVGX1BSSVNUSU5FIG5vZGUgYXQgMHglMDh4IGhhZCAlZCBmcmFncy4gVGVsbCBkd213MlxuIiwgcmVmX29mZnNldChmbi0+cmF3KSwgZm4tPmZyYWdzKTsKKwkJCQliaXRjaGVkID0gMTsKKwkJCX0KKwkJCS8qIEEgaG9sZSBub2RlIHdoaWNoIGlzbid0IG11bHRpLXBhZ2Ugc2hvdWxkIGJlIGdhcmJhZ2UtY29sbGVjdGVkCisJCQkgICBhbmQgbWVyZ2VkIGFueXdheSwgc28gd2UganVzdCBjaGVjayBmb3IgdGhlIGZyYWcgc2l6ZSBoZXJlLAorCQkJICAgcmF0aGVyIHRoYW4gbXVja2luZyBhcm91bmQgd2l0aCBhY3R1YWxseSByZWFkaW5nIHRoZSBub2RlCisJCQkgICBhbmQgY2hlY2tpbmcgdGhlIGNvbXByZXNzaW9uIHR5cGUsIHdoaWNoIGlzIHRoZSByZWFsIHdheQorCQkJICAgdG8gdGVsbCBhIGhvbGUgbm9kZS4gKi8KKwkJCWlmIChmcmFnLT5vZnMgJiAoUEFHRV9DQUNIRV9TSVpFLTEpICYmIGZyYWdfcHJldihmcmFnKSAmJiBmcmFnX3ByZXYoZnJhZyktPnNpemUgPCBQQUdFX0NBQ0hFX1NJWkUgJiYgZnJhZ19wcmV2KGZyYWcpLT5ub2RlKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUkVGX1BSSVNUSU5FIG5vZGUgYXQgMHglMDh4IGhhZCBhIHByZXZpb3VzIG5vbi1ob2xlIGZyYWcgaW4gdGhlIHNhbWUgcGFnZS4gVGVsbCBkd213MlxuIiwKKwkJCQkgICAgICAgcmVmX29mZnNldChmbi0+cmF3KSk7CisJCQkJYml0Y2hlZCA9IDE7CisJCQl9CisKKwkJCWlmICgoZnJhZy0+b2ZzK2ZyYWctPnNpemUpICYgKFBBR0VfQ0FDSEVfU0laRS0xKSAmJiBmcmFnX25leHQoZnJhZykgJiYgZnJhZ19uZXh0KGZyYWcpLT5zaXplIDwgUEFHRV9DQUNIRV9TSVpFICYmIGZyYWdfbmV4dChmcmFnKS0+bm9kZSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlJFRl9QUklTVElORSBub2RlIGF0IDB4JTA4eCAoJTA4eC0lMDh4KSBoYWQgYSBmb2xsb3dpbmcgbm9uLWhvbGUgZnJhZyBpbiB0aGUgc2FtZSBwYWdlLiBUZWxsIGR3bXcyXG4iLAorCQkJCSAgICAgICByZWZfb2Zmc2V0KGZuLT5yYXcpLCBmcmFnLT5vZnMsIGZyYWctPm9mcytmcmFnLT5zaXplKTsKKwkJCQliaXRjaGVkID0gMTsKKwkJCX0KKwkJfQorCX0KKwkKKwlpZiAoYml0Y2hlZCkgeworCQlzdHJ1Y3QgamZmczJfbm9kZV9mcmFnICp0aGlzZnJhZzsKKworCQlwcmludGsoS0VSTl9XQVJOSU5HICJJbm9kZSBpcyAjJXVcbiIsIGYtPmlub2NhY2hlLT5pbm8pOworCQl0aGlzZnJhZyA9IGZyYWdfZmlyc3QoJmYtPmZyYWd0cmVlKTsKKwkJd2hpbGUgKHRoaXNmcmFnKSB7CisJCQlpZiAoIXRoaXNmcmFnLT5ub2RlKSB7CisJCQkJcHJpbnRrKCJGcmFnIEAweCV4LTB4JXg7IG5vZGUtbGVzcyBob2xlXG4iLAorCQkJCSAgICAgICB0aGlzZnJhZy0+b2ZzLCB0aGlzZnJhZy0+c2l6ZSArIHRoaXNmcmFnLT5vZnMpOworCQkJfSBlbHNlIGlmICghdGhpc2ZyYWctPm5vZGUtPnJhdykgeworCQkJCXByaW50aygiRnJhZyBAMHgleC0weCV4OyByYXctbGVzcyBob2xlXG4iLAorCQkJCSAgICAgICB0aGlzZnJhZy0+b2ZzLCB0aGlzZnJhZy0+c2l6ZSArIHRoaXNmcmFnLT5vZnMpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoIkZyYWcgQDB4JXgtMHgleDsgcmF3IGF0IDB4JTA4eCglZCkgKDB4JXgtMHgleClcbiIsCisJCQkJICAgICAgIHRoaXNmcmFnLT5vZnMsIHRoaXNmcmFnLT5zaXplICsgdGhpc2ZyYWctPm9mcywKKwkJCQkgICAgICAgcmVmX29mZnNldCh0aGlzZnJhZy0+bm9kZS0+cmF3KSwgcmVmX2ZsYWdzKHRoaXNmcmFnLT5ub2RlLT5yYXcpLAorCQkJCSAgICAgICB0aGlzZnJhZy0+bm9kZS0+b2ZzLCB0aGlzZnJhZy0+bm9kZS0+b2ZzK3RoaXNmcmFnLT5ub2RlLT5zaXplKTsKKwkJCX0KKwkJCXRoaXNmcmFnID0gZnJhZ19uZXh0KHRoaXNmcmFnKTsKKwkJfQorCX0KKwlyZXR1cm4gYml0Y2hlZDsKK30KKyNlbmRpZiAvKiBEMSAqLworCitzdGF0aWMgdm9pZCBqZmZzMl9vYnNvbGV0ZV9ub2RlX2ZyYWcoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKnRoaXMpCit7CisJaWYgKHRoaXMtPm5vZGUpIHsKKwkJdGhpcy0+bm9kZS0+ZnJhZ3MtLTsKKwkJaWYgKCF0aGlzLT5ub2RlLT5mcmFncykgeworCQkJLyogVGhlIG5vZGUgaGFzIG5vIHZhbGlkIGZyYWdzIGxlZnQuIEl0J3MgdG90YWxseSBvYnNvbGV0ZWQgKi8KKwkJCUQyKHByaW50ayhLRVJOX0RFQlVHICJNYXJraW5nIG9sZCBub2RlIEAweCUwOHggKDB4JTA0eC0weCUwNHgpIG9ic29sZXRlXG4iLAorCQkJCSAgcmVmX29mZnNldCh0aGlzLT5ub2RlLT5yYXcpLCB0aGlzLT5ub2RlLT5vZnMsIHRoaXMtPm5vZGUtPm9mcyt0aGlzLT5ub2RlLT5zaXplKSk7CisJCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgdGhpcy0+bm9kZS0+cmF3KTsKKwkJCWpmZnMyX2ZyZWVfZnVsbF9kbm9kZSh0aGlzLT5ub2RlKTsKKwkJfSBlbHNlIHsKKwkJCUQyKHByaW50ayhLRVJOX0RFQlVHICJNYXJraW5nIG9sZCBub2RlIEAweCUwOHggKDB4JTA0eC0weCUwNHgpIFJFRl9OT1JNQUwuIGZyYWdzIGlzICVkXG4iLAorCQkJCSAgcmVmX29mZnNldCh0aGlzLT5ub2RlLT5yYXcpLCB0aGlzLT5ub2RlLT5vZnMsIHRoaXMtPm5vZGUtPm9mcyt0aGlzLT5ub2RlLT5zaXplLAorCQkJCSAgdGhpcy0+bm9kZS0+ZnJhZ3MpKTsKKwkJCW1hcmtfcmVmX25vcm1hbCh0aGlzLT5ub2RlLT5yYXcpOworCQl9CisJCQorCX0KKwlqZmZzMl9mcmVlX25vZGVfZnJhZyh0aGlzKTsKK30KKworLyogR2l2ZW4gYW4gaW5vZGUsIHByb2JhYmx5IHdpdGggZXhpc3RpbmcgbGlzdCBvZiBmcmFnbWVudHMsIGFkZCB0aGUgbmV3IG5vZGUKKyAqIHRvIHRoZSBmcmFnbWVudCBsaXN0LgorICovCitpbnQgamZmczJfYWRkX2Z1bGxfZG5vZGVfdG9faW5vZGUoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLCBzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZSAqZm4pCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgamZmczJfbm9kZV9mcmFnICpuZXdmcmFnOworCisJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2FkZF9mdWxsX2Rub2RlX3RvX2lub2RlKGlubyAjJXUsIGYgJXAsIGZuICVwKVxuIiwgZi0+aW5vY2FjaGUtPmlubywgZiwgZm4pKTsKKworCW5ld2ZyYWcgPSBqZmZzMl9hbGxvY19ub2RlX2ZyYWcoKTsKKwlpZiAodW5saWtlbHkoIW5ld2ZyYWcpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCUQyKHByaW50ayhLRVJOX0RFQlVHICJhZGRpbmcgbm9kZSAlMDR4LSUwNHggQDB4JTA4eCBvbiBmbGFzaCwgbmV3ZnJhZyAqJXBcbiIsCisJCSAgZm4tPm9mcywgZm4tPm9mcytmbi0+c2l6ZSwgcmVmX29mZnNldChmbi0+cmF3KSwgbmV3ZnJhZykpOworCQorCWlmICh1bmxpa2VseSghZm4tPnNpemUpKSB7CisJCWpmZnMyX2ZyZWVfbm9kZV9mcmFnKG5ld2ZyYWcpOworCQlyZXR1cm4gMDsKKwl9CisKKwluZXdmcmFnLT5vZnMgPSBmbi0+b2ZzOworCW5ld2ZyYWctPnNpemUgPSBmbi0+c2l6ZTsKKwluZXdmcmFnLT5ub2RlID0gZm47CisJbmV3ZnJhZy0+bm9kZS0+ZnJhZ3MgPSAxOworCisJcmV0ID0gamZmczJfYWRkX2ZyYWdfdG9fZnJhZ3RyZWUoYywgJmYtPmZyYWd0cmVlLCBuZXdmcmFnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogSWYgd2Ugbm93IHNoYXJlIGEgcGFnZSB3aXRoIG90aGVyIG5vZGVzLCBtYXJrIGVpdGhlciBwcmV2aW91cworCSAgIG9yIG5leHQgbm9kZSBSRUZfTk9STUFMLCBhcyBhcHByb3ByaWF0ZS4gICovCisJaWYgKG5ld2ZyYWctPm9mcyAmIChQQUdFX0NBQ0hFX1NJWkUtMSkpIHsKKwkJc3RydWN0IGpmZnMyX25vZGVfZnJhZyAqcHJldiA9IGZyYWdfcHJldihuZXdmcmFnKTsKKworCQltYXJrX3JlZl9ub3JtYWwoZm4tPnJhdyk7CisJCS8qIElmIHdlIGRvbid0IHN0YXJ0IGF0IHplcm8gdGhlcmUncyBfYWx3YXlzXyBhIHByZXZpb3VzICovCQorCQlpZiAocHJldi0+bm9kZSkKKwkJCW1hcmtfcmVmX25vcm1hbChwcmV2LT5ub2RlLT5yYXcpOworCX0KKworCWlmICgobmV3ZnJhZy0+b2ZzK25ld2ZyYWctPnNpemUpICYgKFBBR0VfQ0FDSEVfU0laRS0xKSkgeworCQlzdHJ1Y3QgamZmczJfbm9kZV9mcmFnICpuZXh0ID0gZnJhZ19uZXh0KG5ld2ZyYWcpOworCQkKKwkJaWYgKG5leHQpIHsKKwkJCW1hcmtfcmVmX25vcm1hbChmbi0+cmF3KTsKKwkJCWlmIChuZXh0LT5ub2RlKQorCQkJCW1hcmtfcmVmX25vcm1hbChuZXh0LT5ub2RlLT5yYXcpOworCQl9CisJfQorCUQyKGlmIChqZmZzMl9zYW5pdHljaGVja19mcmFndHJlZShmKSkgeworCQkgICBwcmludGsoS0VSTl9XQVJOSU5HICJKdXN0IGFkZGVkIG5vZGUgJTA0eC0lMDR4IEAweCUwOHggb24gZmxhc2gsIG5ld2ZyYWcgKiVwXG4iLAorCQkJICBmbi0+b2ZzLCBmbi0+b2ZzK2ZuLT5zaXplLCByZWZfb2Zmc2V0KGZuLT5yYXcpLCBuZXdmcmFnKTsKKwkJICAgcmV0dXJuIDA7CisJICAgfSkKKwlEMihqZmZzMl9wcmludF9mcmFnX2xpc3QoZikpOworCXJldHVybiAwOworfQorCisvKiBEb2Vzbid0IHNldCBpbm9kZS0+aV9zaXplICovCitzdGF0aWMgaW50IGpmZnMyX2FkZF9mcmFnX3RvX2ZyYWd0cmVlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgcmJfcm9vdCAqbGlzdCwgc3RydWN0IGpmZnMyX25vZGVfZnJhZyAqbmV3ZnJhZykKK3sKKwlzdHJ1Y3QgamZmczJfbm9kZV9mcmFnICp0aGlzOworCXVpbnQzMl90IGxhc3RlbmQ7CisKKwkvKiBTa2lwIGFsbCB0aGUgbm9kZXMgd2hpY2ggYXJlIGNvbXBsZXRlZCBiZWZvcmUgdGhpcyBvbmUgc3RhcnRzICovCisJdGhpcyA9IGpmZnMyX2xvb2t1cF9ub2RlX2ZyYWcobGlzdCwgbmV3ZnJhZy0+bm9kZS0+b2ZzKTsKKworCWlmICh0aGlzKSB7CisJCUQyKHByaW50ayhLRVJOX0RFQlVHICJqX2FfZl9kX3RfZjogTG9va3VwIGdhdmUgZnJhZyAweCUwNHgtMHglMDR4OyBwaHlzIDB4JTA4eCAoKiVwKVxuIiwKKwkJCSAgdGhpcy0+b2ZzLCB0aGlzLT5vZnMrdGhpcy0+c2l6ZSwgdGhpcy0+bm9kZT8ocmVmX29mZnNldCh0aGlzLT5ub2RlLT5yYXcpKToweGZmZmZmZmZmLCB0aGlzKSk7CisJCWxhc3RlbmQgPSB0aGlzLT5vZnMgKyB0aGlzLT5zaXplOworCX0gZWxzZSB7CisJCUQyKHByaW50ayhLRVJOX0RFQlVHICJqX2FfZl9kX3RfZjogTG9va3VwIGdhdmUgbm8gZnJhZ1xuIikpOworCQlsYXN0ZW5kID0gMDsKKwl9CisJCQkgIAorCS8qIFNlZSBpZiB3ZSByYW4gb2ZmIHRoZSBlbmQgb2YgdGhlIGxpc3QgKi8KKwlpZiAobGFzdGVuZCA8PSBuZXdmcmFnLT5vZnMpIHsKKwkJLyogV2UgZGlkICovCisKKwkJLyogQ2hlY2sgaWYgJ3RoaXMnIG5vZGUgd2FzIG9uIHRoZSBzYW1lIHBhZ2UgYXMgdGhlIG5ldyBub2RlLgorCQkgICBJZiBzbywgYm90aCAndGhpcycgYW5kIHRoZSBuZXcgbm9kZSBnZXQgbWFya2VkIFJFRl9OT1JNQUwgc28KKwkJICAgdGhlIEdDIGNhbiB0YWtlIGEgbG9vay4KKwkJKi8KKwkJaWYgKGxhc3RlbmQgJiYgKGxhc3RlbmQtMSkgPj4gUEFHRV9DQUNIRV9TSElGVCA9PSBuZXdmcmFnLT5vZnMgPj4gUEFHRV9DQUNIRV9TSElGVCkgeworCQkJaWYgKHRoaXMtPm5vZGUpCisJCQkJbWFya19yZWZfbm9ybWFsKHRoaXMtPm5vZGUtPnJhdyk7CisJCQltYXJrX3JlZl9ub3JtYWwobmV3ZnJhZy0+bm9kZS0+cmF3KTsKKwkJfQorCisJCWlmIChsYXN0ZW5kIDwgbmV3ZnJhZy0+bm9kZS0+b2ZzKSB7CisJCQkvKiAuLi4gYW5kIHdlIG5lZWQgdG8gcHV0IGEgaG9sZSBpbiBiZWZvcmUgdGhlIG5ldyBub2RlICovCisJCQlzdHJ1Y3QgamZmczJfbm9kZV9mcmFnICpob2xlZnJhZyA9IGpmZnMyX2FsbG9jX25vZGVfZnJhZygpOworCQkJaWYgKCFob2xlZnJhZykgeworCQkJCWpmZnMyX2ZyZWVfbm9kZV9mcmFnKG5ld2ZyYWcpOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJaG9sZWZyYWctPm9mcyA9IGxhc3RlbmQ7CisJCQlob2xlZnJhZy0+c2l6ZSA9IG5ld2ZyYWctPm5vZGUtPm9mcyAtIGxhc3RlbmQ7CisJCQlob2xlZnJhZy0+bm9kZSA9IE5VTEw7CisJCQlpZiAodGhpcykgeworCQkJCS8qIEJ5IGRlZmluaXRpb24sIHRoZSAndGhpcycgbm9kZSBoYXMgbm8gcmlnaHQtaGFuZCBjaGlsZCwgCisJCQkJICAgYmVjYXVzZSB0aGVyZSBhcmUgbm8gZnJhZ3Mgd2l0aCBvZmZzZXQgZ3JlYXRlciB0aGFuIGl0LgorCQkJCSAgIFNvIHRoYXQncyB3aGVyZSB3ZSB3YW50IHRvIHB1dCB0aGUgaG9sZSAqLworCQkJCUQyKHByaW50ayhLRVJOX0RFQlVHICJBZGRpbmcgaG9sZSBmcmFnICglcCkgb24gcmlnaHQgb2Ygbm9kZSBhdCAoJXApXG4iLCBob2xlZnJhZywgdGhpcykpOworCQkJCXJiX2xpbmtfbm9kZSgmaG9sZWZyYWctPnJiLCAmdGhpcy0+cmIsICZ0aGlzLT5yYi5yYl9yaWdodCk7CisJCQl9IGVsc2UgeworCQkJCUQyKHByaW50ayhLRVJOX0RFQlVHICJBZGRpbmcgaG9sZSBmcmFnICglcCkgYXQgcm9vdCBvZiB0cmVlXG4iLCBob2xlZnJhZykpOworCQkJCXJiX2xpbmtfbm9kZSgmaG9sZWZyYWctPnJiLCBOVUxMLCAmbGlzdC0+cmJfbm9kZSk7CisJCQl9CisJCQlyYl9pbnNlcnRfY29sb3IoJmhvbGVmcmFnLT5yYiwgbGlzdCk7CisJCQl0aGlzID0gaG9sZWZyYWc7CisJCX0KKwkJaWYgKHRoaXMpIHsKKwkJCS8qIEJ5IGRlZmluaXRpb24sIHRoZSAndGhpcycgbm9kZSBoYXMgbm8gcmlnaHQtaGFuZCBjaGlsZCwgCisJCQkgICBiZWNhdXNlIHRoZXJlIGFyZSBubyBmcmFncyB3aXRoIG9mZnNldCBncmVhdGVyIHRoYW4gaXQuCisJCQkgICBTbyB0aGF0J3Mgd2hlcmUgd2Ugd2FudCB0byBwdXQgdGhlIGhvbGUgKi8KKwkJCUQyKHByaW50ayhLRVJOX0RFQlVHICJBZGRpbmcgbmV3IGZyYWcgKCVwKSBvbiByaWdodCBvZiBub2RlIGF0ICglcClcbiIsIG5ld2ZyYWcsIHRoaXMpKTsKKwkJCXJiX2xpbmtfbm9kZSgmbmV3ZnJhZy0+cmIsICZ0aGlzLT5yYiwgJnRoaXMtPnJiLnJiX3JpZ2h0KTsJCQkKKwkJfSBlbHNlIHsKKwkJCUQyKHByaW50ayhLRVJOX0RFQlVHICJBZGRpbmcgbmV3IGZyYWcgKCVwKSBhdCByb290IG9mIHRyZWVcbiIsIG5ld2ZyYWcpKTsKKwkJCXJiX2xpbmtfbm9kZSgmbmV3ZnJhZy0+cmIsIE5VTEwsICZsaXN0LT5yYl9ub2RlKTsKKwkJfQorCQlyYl9pbnNlcnRfY29sb3IoJm5ld2ZyYWctPnJiLCBsaXN0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJRDIocHJpbnRrKEtFUk5fREVCVUcgImpfYV9mX2RfdF9mOiBkZWFsaW5nIHdpdGggZnJhZyAweCUwNHgtMHglMDR4OyBwaHlzIDB4JTA4eCAoKiVwKVxuIiwgCisJCSAgdGhpcy0+b2ZzLCB0aGlzLT5vZnMrdGhpcy0+c2l6ZSwgdGhpcy0+bm9kZT8ocmVmX29mZnNldCh0aGlzLT5ub2RlLT5yYXcpKToweGZmZmZmZmZmLCB0aGlzKSk7CisKKwkvKiBPSy4gJ3RoaXMnIGlzIHBvaW50aW5nIGF0IHRoZSBmaXJzdCBmcmFnIHRoYXQgbmV3ZnJhZy0+b2ZzIGF0IGxlYXN0IHBhcnRpYWxseSBvYnNvbGV0ZXMsCisJICogLSBpLmUuIG5ld2ZyYWctPm9mcyA8IHRoaXMtPm9mcyt0aGlzLT5zaXplICYmIG5ld2ZyYWctPm9mcyA+PSB0aGlzLT5vZnMgIAorCSAqLworCWlmIChuZXdmcmFnLT5vZnMgPiB0aGlzLT5vZnMpIHsKKwkJLyogVGhpcyBub2RlIGlzbid0IGNvbXBsZXRlbHkgb2Jzb2xldGVkLiBUaGUgc3RhcnQgb2YgaXQgcmVtYWlucyB2YWxpZCAqLworCisJCS8qIE1hcmsgdGhlIG5ldyBub2RlIGFuZCB0aGUgcGFydGlhbGx5IGNvdmVyZWQgbm9kZSBSRUZfTk9STUFMIC0tIGxldAorCQkgICB0aGUgR0MgdGFrZSBhIGxvb2sgYXQgdGhlbSAqLworCQltYXJrX3JlZl9ub3JtYWwobmV3ZnJhZy0+bm9kZS0+cmF3KTsKKwkJaWYgKHRoaXMtPm5vZGUpCisJCQltYXJrX3JlZl9ub3JtYWwodGhpcy0+bm9kZS0+cmF3KTsKKworCQlpZiAodGhpcy0+b2ZzICsgdGhpcy0+c2l6ZSA+IG5ld2ZyYWctPm9mcyArIG5ld2ZyYWctPnNpemUpIHsKKwkJCS8qIFRoZSBuZXcgbm9kZSBzcGxpdHMgJ3RoaXMnIGZyYWcgaW50byB0d28gKi8KKwkJCXN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKm5ld2ZyYWcyID0gamZmczJfYWxsb2Nfbm9kZV9mcmFnKCk7CisJCQlpZiAoIW5ld2ZyYWcyKSB7CisJCQkJamZmczJfZnJlZV9ub2RlX2ZyYWcobmV3ZnJhZyk7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQlEMihwcmludGsoS0VSTl9ERUJVRyAic3BsaXQgb2xkIGZyYWcgMHglMDR4LTB4JTA0eCAtLT4iLCB0aGlzLT5vZnMsIHRoaXMtPm9mcyt0aGlzLT5zaXplKTsKKwkJCWlmICh0aGlzLT5ub2RlKQorCQkJCXByaW50aygicGh5cyAweCUwOHhcbiIsIHJlZl9vZmZzZXQodGhpcy0+bm9kZS0+cmF3KSk7CisJCQllbHNlIAorCQkJCXByaW50aygiaG9sZVxuIik7CisJCQkgICApCisJCQkKKwkJCS8qIE5ldyBzZWNvbmQgZnJhZyBwb2ludGluZyB0byB0aGlzJ3Mgbm9kZSAqLworCQkJbmV3ZnJhZzItPm9mcyA9IG5ld2ZyYWctPm9mcyArIG5ld2ZyYWctPnNpemU7CisJCQluZXdmcmFnMi0+c2l6ZSA9ICh0aGlzLT5vZnMrdGhpcy0+c2l6ZSkgLSBuZXdmcmFnMi0+b2ZzOworCQkJbmV3ZnJhZzItPm5vZGUgPSB0aGlzLT5ub2RlOworCQkJaWYgKHRoaXMtPm5vZGUpCisJCQkJdGhpcy0+bm9kZS0+ZnJhZ3MrKzsKKworCQkJLyogQWRqdXN0IHNpemUgb2Ygb3JpZ2luYWwgJ3RoaXMnICovCisJCQl0aGlzLT5zaXplID0gbmV3ZnJhZy0+b2ZzIC0gdGhpcy0+b2ZzOworCisJCQkvKiBOb3csIHdlIGtub3cgdGhlcmUncyBubyBub2RlIHdpdGggb2Zmc2V0CisJCQkgICBncmVhdGVyIHRoYW4gdGhpcy0+b2ZzIGJ1dCBzbWFsbGVyIHRoYW4KKwkJCSAgIG5ld2ZyYWcyLT5vZnMgb3IgbmV3ZnJhZy0+b2ZzLCBmb3Igb2J2aW91cworCQkJICAgcmVhc29ucy4gU28gd2UgY2FuIGRvIGEgdHJlZSBpbnNlcnQgZnJvbQorCQkJICAgJ3RoaXMnIHRvIGluc2VydCBuZXdmcmFnLCBhbmQgYSB0cmVlIGluc2VydAorCQkJICAgZnJvbSBuZXdmcmFnIHRvIGluc2VydCBuZXdmcmFnMi4gKi8KKwkJCWpmZnMyX2ZyYWd0cmVlX2luc2VydChuZXdmcmFnLCB0aGlzKTsKKwkJCXJiX2luc2VydF9jb2xvcigmbmV3ZnJhZy0+cmIsIGxpc3QpOworCQkJCisJCQlqZmZzMl9mcmFndHJlZV9pbnNlcnQobmV3ZnJhZzIsIG5ld2ZyYWcpOworCQkJcmJfaW5zZXJ0X2NvbG9yKCZuZXdmcmFnMi0+cmIsIGxpc3QpOworCQkJCisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKiBOZXcgbm9kZSBqdXN0IHJlZHVjZXMgJ3RoaXMnIGZyYWcgaW4gc2l6ZSwgZG9lc24ndCBzcGxpdCBpdCAqLworCQl0aGlzLT5zaXplID0gbmV3ZnJhZy0+b2ZzIC0gdGhpcy0+b2ZzOworCisJCS8qIEFnYWluLCB3ZSBrbm93IGl0IGxpdmVzIGRvd24gaGVyZSBpbiB0aGUgdHJlZSAqLworCQlqZmZzMl9mcmFndHJlZV9pbnNlcnQobmV3ZnJhZywgdGhpcyk7CisJCXJiX2luc2VydF9jb2xvcigmbmV3ZnJhZy0+cmIsIGxpc3QpOworCX0gZWxzZSB7CisJCS8qIE5ldyBmcmFnIHN0YXJ0cyBhdCB0aGUgc2FtZSBwb2ludCBhcyAndGhpcycgdXNlZCB0by4gUmVwbGFjZSAKKwkJICAgaXQgaW4gdGhlIHRyZWUgd2l0aG91dCBkb2luZyBhIGRlbGV0ZSBhbmQgaW5zZXJ0aW9uICovCisJCUQyKHByaW50ayhLRVJOX0RFQlVHICJJbnNlcnRpbmcgbmV3ZnJhZyAoKiVwKSwlZC0lZCBpbiBiZWZvcmUgJ3RoaXMnICgqJXApLCVkLSVkXG4iLAorCQkJICBuZXdmcmFnLCBuZXdmcmFnLT5vZnMsIG5ld2ZyYWctPm9mcytuZXdmcmFnLT5zaXplLAorCQkJICB0aGlzLCB0aGlzLT5vZnMsIHRoaXMtPm9mcyt0aGlzLT5zaXplKSk7CisJCisJCXJiX3JlcGxhY2Vfbm9kZSgmdGhpcy0+cmIsICZuZXdmcmFnLT5yYiwgbGlzdCk7CisJCQorCQlpZiAobmV3ZnJhZy0+b2ZzICsgbmV3ZnJhZy0+c2l6ZSA+PSB0aGlzLT5vZnMrdGhpcy0+c2l6ZSkgeworCQkJRDIocHJpbnRrKEtFUk5fREVCVUcgIk9ic29sZXRpbmcgbm9kZSBmcmFnICVwICgleC0leClcbiIsIHRoaXMsIHRoaXMtPm9mcywgdGhpcy0+b2ZzK3RoaXMtPnNpemUpKTsKKwkJCWpmZnMyX29ic29sZXRlX25vZGVfZnJhZyhjLCB0aGlzKTsKKwkJfSBlbHNlIHsKKwkJCXRoaXMtPm9mcyArPSBuZXdmcmFnLT5zaXplOworCQkJdGhpcy0+c2l6ZSAtPSBuZXdmcmFnLT5zaXplOworCisJCQlqZmZzMl9mcmFndHJlZV9pbnNlcnQodGhpcywgbmV3ZnJhZyk7CisJCQlyYl9pbnNlcnRfY29sb3IoJnRoaXMtPnJiLCBsaXN0KTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCS8qIE9LLCBub3cgd2UgaGF2ZSBuZXdmcmFnIGFkZGVkIGluIHRoZSBjb3JyZWN0IHBsYWNlIGluIHRoZSB0cmVlLCBidXQKKwkgICBmcmFnX25leHQobmV3ZnJhZykgbWF5IGJlIGEgZnJhZ21lbnQgd2hpY2ggaXMgb3ZlcmxhcHBlZCBieSBpdCAKKwkqLworCXdoaWxlICgodGhpcyA9IGZyYWdfbmV4dChuZXdmcmFnKSkgJiYgbmV3ZnJhZy0+b2ZzICsgbmV3ZnJhZy0+c2l6ZSA+PSB0aGlzLT5vZnMgKyB0aGlzLT5zaXplKSB7CisJCS8qICd0aGlzJyBmcmFnIGlzIG9ic29sZXRlZCBjb21wbGV0ZWx5LiAqLworCQlEMihwcmludGsoS0VSTl9ERUJVRyAiT2Jzb2xldGluZyBub2RlIGZyYWcgJXAgKCV4LSV4KSBhbmQgcmVtb3ZpbmcgZnJvbSB0cmVlXG4iLCB0aGlzLCB0aGlzLT5vZnMsIHRoaXMtPm9mcyt0aGlzLT5zaXplKSk7CisJCXJiX2VyYXNlKCZ0aGlzLT5yYiwgbGlzdCk7CisJCWpmZnMyX29ic29sZXRlX25vZGVfZnJhZyhjLCB0aGlzKTsKKwl9CisJLyogTm93IHdlJ3JlIHBvaW50aW5nIGF0IHRoZSBmaXJzdCBmcmFnIHdoaWNoIGlzbid0IHRvdGFsbHkgb2Jzb2xldGVkIGJ5IAorCSAgIHRoZSBuZXcgZnJhZyAqLworCisJaWYgKCF0aGlzIHx8IG5ld2ZyYWctPm9mcyArIG5ld2ZyYWctPnNpemUgPT0gdGhpcy0+b2ZzKSB7CisJCXJldHVybiAwOworCX0KKwkvKiBTdGlsbCBzb21lIG92ZXJsYXAgYnV0IHdlIGRvbid0IG5lZWQgdG8gbW92ZSBpdCBpbiB0aGUgdHJlZSAqLworCXRoaXMtPnNpemUgPSAodGhpcy0+b2ZzICsgdGhpcy0+c2l6ZSkgLSAobmV3ZnJhZy0+b2ZzICsgbmV3ZnJhZy0+c2l6ZSk7CisJdGhpcy0+b2ZzID0gbmV3ZnJhZy0+b2ZzICsgbmV3ZnJhZy0+c2l6ZTsKKworCS8qIEFuZCBtYXJrIHRoZW0gUkVGX05PUk1BTCBzbyB0aGUgR0MgdGFrZXMgYSBsb29rIGF0IHRoZW0gKi8KKwlpZiAodGhpcy0+bm9kZSkKKwkJbWFya19yZWZfbm9ybWFsKHRoaXMtPm5vZGUtPnJhdyk7CisJbWFya19yZWZfbm9ybWFsKG5ld2ZyYWctPm5vZGUtPnJhdyk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBqZmZzMl90cnVuY2F0ZV9mcmFnbGlzdCAoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCByYl9yb290ICpsaXN0LCB1aW50MzJfdCBzaXplKQoreworCXN0cnVjdCBqZmZzMl9ub2RlX2ZyYWcgKmZyYWcgPSBqZmZzMl9sb29rdXBfbm9kZV9mcmFnKGxpc3QsIHNpemUpOworCisJRDEocHJpbnRrKEtFUk5fREVCVUcgIlRydW5jYXRpbmcgZnJhZ2xpc3QgdG8gMHglMDh4IGJ5dGVzXG4iLCBzaXplKSk7CisKKwkvKiBXZSBrbm93IGZyYWctPm9mcyA8PSBzaXplLiBUaGF0J3Mgd2hhdCBsb29rdXAgZG9lcyBmb3IgdXMgKi8KKwlpZiAoZnJhZyAmJiBmcmFnLT5vZnMgIT0gc2l6ZSkgeworCQlpZiAoZnJhZy0+b2ZzK2ZyYWctPnNpemUgPj0gc2l6ZSkgeworCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIlRydW5jYXRpbmcgZnJhZyAweCUwOHgtMHglMDh4XG4iLCBmcmFnLT5vZnMsIGZyYWctPm9mcytmcmFnLT5zaXplKSk7CisJCQlmcmFnLT5zaXplID0gc2l6ZSAtIGZyYWctPm9mczsKKwkJfQorCQlmcmFnID0gZnJhZ19uZXh0KGZyYWcpOworCX0KKwl3aGlsZSAoZnJhZyAmJiBmcmFnLT5vZnMgPj0gc2l6ZSkgeworCQlzdHJ1Y3QgamZmczJfbm9kZV9mcmFnICpuZXh0ID0gZnJhZ19uZXh0KGZyYWcpOworCisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJSZW1vdmluZyBmcmFnIDB4JTA4eC0weCUwOHhcbiIsIGZyYWctPm9mcywgZnJhZy0+b2ZzK2ZyYWctPnNpemUpKTsKKwkJZnJhZ19lcmFzZShmcmFnLCBsaXN0KTsKKwkJamZmczJfb2Jzb2xldGVfbm9kZV9mcmFnKGMsIGZyYWcpOworCQlmcmFnID0gbmV4dDsKKwl9Cit9CisKKy8qIFNjYW4gdGhlIGxpc3Qgb2YgYWxsIG5vZGVzIHByZXNlbnQgZm9yIHRoaXMgaW5vLCBidWlsZCBtYXAgb2YgdmVyc2lvbnMsIGV0Yy4gKi8KKworc3RhdGljIGludCBqZmZzMl9kb19yZWFkX2lub2RlX2ludGVybmFsKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCAKKwkJCQkJc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsCisJCQkJCXN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKmxhdGVzdF9ub2RlKTsKKworaW50IGpmZnMyX2RvX3JlYWRfaW5vZGUoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLCAKKwkJCXVpbnQzMl90IGlubywgc3RydWN0IGpmZnMyX3Jhd19pbm9kZSAqbGF0ZXN0X25vZGUpCit7CisJRDIocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2RvX3JlYWRfaW5vZGUoKTogZ2V0dGluZyBpbm9jYWNoZVxuIikpOworCisgcmV0cnlfaW5vY2FjaGU6CisJc3Bpbl9sb2NrKCZjLT5pbm9jYWNoZV9sb2NrKTsKKwlmLT5pbm9jYWNoZSA9IGpmZnMyX2dldF9pbm9fY2FjaGUoYywgaW5vKTsKKworCUQyKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9kb19yZWFkX2lub2RlKCk6IEdvdCBpbm9jYWNoZSBhdCAlcFxuIiwgZi0+aW5vY2FjaGUpKTsKKworCWlmIChmLT5pbm9jYWNoZSkgeworCQkvKiBDaGVjayBpdHMgc3RhdGUuIFdlIG1heSBuZWVkIHRvIHdhaXQgYmVmb3JlIHdlIGNhbiB1c2UgaXQgKi8KKwkJc3dpdGNoKGYtPmlub2NhY2hlLT5zdGF0ZSkgeworCQljYXNlIElOT19TVEFURV9VTkNIRUNLRUQ6CisJCWNhc2UgSU5PX1NUQVRFX0NIRUNLRURBQlNFTlQ6CisJCQlmLT5pbm9jYWNoZS0+c3RhdGUgPSBJTk9fU1RBVEVfUkVBRElORzsKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgSU5PX1NUQVRFX0NIRUNLSU5HOgorCQljYXNlIElOT19TVEFURV9HQzoKKwkJCS8qIElmIGl0J3MgaW4gZWl0aGVyIG9mIHRoZXNlIHN0YXRlcywgd2UgbmVlZAorCQkJICAgdG8gd2FpdCBmb3Igd2hvZXZlcidzIGdvdCBpdCB0byBmaW5pc2ggYW5kCisJCQkgICBwdXQgaXQgYmFjay4gKi8KKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9nZXRfaW5vX2NhY2hlX3JlYWQgd2FpdGluZyBmb3IgaW5vICMldSBpbiBzdGF0ZSAlZFxuIiwKKwkJCQkgIGlubywgZi0+aW5vY2FjaGUtPnN0YXRlKSk7CisJCQlzbGVlcF9vbl9zcGludW5sb2NrKCZjLT5pbm9jYWNoZV93cSwgJmMtPmlub2NhY2hlX2xvY2spOworCQkJZ290byByZXRyeV9pbm9jYWNoZTsKKworCQljYXNlIElOT19TVEFURV9SRUFESU5HOgorCQljYXNlIElOT19TVEFURV9QUkVTRU5UOgorCQkJLyogRWVwLiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uIEl0IGNhbgorCQkJaGFwcGVuIGlmIExpbnV4IGNhbGxzIHJlYWRfaW5vZGUoKSBhZ2FpbgorCQkJYmVmb3JlIGNsZWFyX2lub2RlKCkgaGFzIGZpbmlzaGVkIHRob3VnaC4gKi8KKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVlcC4gVHJ5aW5nIHRvIHJlYWRfaW5vZGUgIyV1IHdoZW4gaXQncyBhbHJlYWR5IGluIHN0YXRlICVkIVxuIiwgaW5vLCBmLT5pbm9jYWNoZS0+c3RhdGUpOworCQkJLyogRmFpbC4gVGhhdCdzIHByb2JhYmx5IGJldHRlciB0aGFuIGFsbG93aW5nIGl0IHRvIHN1Y2NlZWQgKi8KKwkJCWYtPmlub2NhY2hlID0gTlVMTDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlCVUcoKTsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmYy0+aW5vY2FjaGVfbG9jayk7CisKKwlpZiAoIWYtPmlub2NhY2hlICYmIGlubyA9PSAxKSB7CisJCS8qIFNwZWNpYWwgY2FzZSAtIG5vIHJvb3QgaW5vZGUgb24gbWVkaXVtICovCisJCWYtPmlub2NhY2hlID0gamZmczJfYWxsb2NfaW5vZGVfY2FjaGUoKTsKKwkJaWYgKCFmLT5pbm9jYWNoZSkgeworCQkJcHJpbnRrKEtFUk5fQ1JJVCAiamZmczJfZG9fcmVhZF9pbm9kZSgpOiBDYW5ub3QgYWxsb2NhdGUgaW5vY2FjaGUgZm9yIHJvb3QgaW5vZGVcbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2RvX3JlYWRfaW5vZGUoKTogQ3JlYXRpbmcgaW5vY2FjaGUgZm9yIHJvb3QgaW5vZGVcbiIpKTsKKwkJbWVtc2V0KGYtPmlub2NhY2hlLCAwLCBzaXplb2Yoc3RydWN0IGpmZnMyX2lub2RlX2NhY2hlKSk7CisJCWYtPmlub2NhY2hlLT5pbm8gPSBmLT5pbm9jYWNoZS0+bmxpbmsgPSAxOworCQlmLT5pbm9jYWNoZS0+bm9kZXMgPSAoc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqKWYtPmlub2NhY2hlOworCQlmLT5pbm9jYWNoZS0+c3RhdGUgPSBJTk9fU1RBVEVfUkVBRElORzsKKwkJamZmczJfYWRkX2lub19jYWNoZShjLCBmLT5pbm9jYWNoZSk7CisJfQorCWlmICghZi0+aW5vY2FjaGUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiamZmczJfZG9fcmVhZF9pbm9kZSgpIG9uIG5vbmV4aXN0ZW50IGlubyAldVxuIiwgaW5vKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJcmV0dXJuIGpmZnMyX2RvX3JlYWRfaW5vZGVfaW50ZXJuYWwoYywgZiwgbGF0ZXN0X25vZGUpOworfQorCitpbnQgamZmczJfZG9fY3JjY2hlY2tfaW5vZGUoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqaWMpCit7CisJc3RydWN0IGpmZnMyX3Jhd19pbm9kZSBuOworCXN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmID0ga21hbGxvYyhzaXplb2YoKmYpLCBHRlBfS0VSTkVMKTsKKwlpbnQgcmV0OworCisJaWYgKCFmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChmLCAwLCBzaXplb2YoKmYpKTsKKwlpbml0X01VVEVYX0xPQ0tFRCgmZi0+c2VtKTsKKwlmLT5pbm9jYWNoZSA9IGljOworCisJcmV0ID0gamZmczJfZG9fcmVhZF9pbm9kZV9pbnRlcm5hbChjLCBmLCAmbik7CisJaWYgKCFyZXQpIHsKKwkJdXAoJmYtPnNlbSk7CisJCWpmZnMyX2RvX2NsZWFyX2lub2RlKGMsIGYpOworCX0KKwlrZnJlZSAoZik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBqZmZzMl9kb19yZWFkX2lub2RlX2ludGVybmFsKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCAKKwkJCQkJc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsCisJCQkJCXN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKmxhdGVzdF9ub2RlKQoreworCXN0cnVjdCBqZmZzMl90bXBfZG5vZGVfaW5mbyAqdG5fbGlzdCwgKnRuOworCXN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqZmRfbGlzdDsKKwlzdHJ1Y3QgamZmczJfZnVsbF9kbm9kZSAqZm4gPSBOVUxMOworCXVpbnQzMl90IGNyYzsKKwl1aW50MzJfdCBsYXRlc3RfbWN0aW1lLCBtY3RpbWVfdmVyOworCXVpbnQzMl90IG1kYXRhX3ZlciA9IDA7CisJc2l6ZV90IHJldGxlbjsKKwlpbnQgcmV0OworCisJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2RvX3JlYWRfaW5vZGVfaW50ZXJuYWwoKTogaW5vICMldSBubGluayBpcyAlZFxuIiwgZi0+aW5vY2FjaGUtPmlubywgZi0+aW5vY2FjaGUtPm5saW5rKSk7CisKKwkvKiBHcmFiIGFsbCBub2RlcyByZWxldmFudCB0byB0aGlzIGlubyAqLworCXJldCA9IGpmZnMyX2dldF9pbm9kZV9ub2RlcyhjLCBmLCAmdG5fbGlzdCwgJmZkX2xpc3QsICZmLT5oaWdoZXN0X3ZlcnNpb24sICZsYXRlc3RfbWN0aW1lLCAmbWN0aW1lX3Zlcik7CisKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0NSSVQgImpmZnMyX2dldF9pbm9kZV9ub2RlcygpIGZvciBpbm8gJXUgcmV0dXJuZWQgJWRcbiIsIGYtPmlub2NhY2hlLT5pbm8sIHJldCk7CisJCWlmIChmLT5pbm9jYWNoZS0+c3RhdGUgPT0gSU5PX1NUQVRFX1JFQURJTkcpCisJCQlqZmZzMl9zZXRfaW5vY2FjaGVfc3RhdGUoYywgZi0+aW5vY2FjaGUsIElOT19TVEFURV9DSEVDS0VEQUJTRU5UKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJZi0+ZGVudHMgPSBmZF9saXN0OworCisJd2hpbGUgKHRuX2xpc3QpIHsKKwkJdG4gPSB0bl9saXN0OworCisJCWZuID0gdG4tPmZuOworCisJCWlmIChmLT5tZXRhZGF0YSkgeworCQkJaWYgKGxpa2VseSh0bi0+dmVyc2lvbiA+PSBtZGF0YV92ZXIpKSB7CisJCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIk9ic29sZXRpbmcgb2xkIG1ldGFkYXRhIGF0IDB4JTA4eFxuIiwgcmVmX29mZnNldChmLT5tZXRhZGF0YS0+cmF3KSkpOworCQkJCWpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZShjLCBmLT5tZXRhZGF0YS0+cmF3KTsKKwkJCQlqZmZzMl9mcmVlX2Z1bGxfZG5vZGUoZi0+bWV0YWRhdGEpOworCQkJCWYtPm1ldGFkYXRhID0gTlVMTDsKKwkJCQkKKwkJCQltZGF0YV92ZXIgPSAwOworCQkJfSBlbHNlIHsKKwkJCQkvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4uICovCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRXIuIE5ldyBtZXRhZGF0YSBhdCAweCUwOHggd2l0aCB2ZXIgJWQgaXMgYWN0dWFsbHkgb2xkZXIgdGhhbiBwcmV2aW91cyB2ZXIgJWQgYXQgMHglMDh4XG4iLAorCQkJCQkgIHJlZl9vZmZzZXQoZm4tPnJhdyksIHRuLT52ZXJzaW9uLCBtZGF0YV92ZXIsIHJlZl9vZmZzZXQoZi0+bWV0YWRhdGEtPnJhdykpOworCQkJCWpmZnMyX21hcmtfbm9kZV9vYnNvbGV0ZShjLCBmbi0+cmF3KTsKKwkJCQlqZmZzMl9mcmVlX2Z1bGxfZG5vZGUoZm4pOworCQkJCS8qIEZpbGwgaW4gbGF0ZXN0X25vZGUgZnJvbSB0aGUgbWV0YWRhdGEsIG5vdCB0aGlzIG9uZSB3ZSdyZSBhYm91dCB0byBmcmVlLi4uICovCisJCQkJZm4gPSBmLT5tZXRhZGF0YTsKKwkJCQlnb3RvIG5leHRfdG47CisJCQl9CisJCX0KKworCQlpZiAoZm4tPnNpemUpIHsKKwkJCWpmZnMyX2FkZF9mdWxsX2Rub2RlX3RvX2lub2RlKGMsIGYsIGZuKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFplcm8tc2l6ZWQgbm9kZSBhdCBlbmQgb2YgdmVyc2lvbiBsaXN0LiBKdXN0IGEgbWV0YWRhdGEgdXBkYXRlICovCisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAibWV0YWRhdGEgQCUwOHg6IHZlciAlZFxuIiwgcmVmX29mZnNldChmbi0+cmF3KSwgdG4tPnZlcnNpb24pKTsKKwkJCWYtPm1ldGFkYXRhID0gZm47CisJCQltZGF0YV92ZXIgPSB0bi0+dmVyc2lvbjsKKwkJfQorCW5leHRfdG46CisJCXRuX2xpc3QgPSB0bi0+bmV4dDsKKwkJamZmczJfZnJlZV90bXBfZG5vZGVfaW5mbyh0bik7CisJfQorCUQxKGpmZnMyX3Nhbml0eWNoZWNrX2ZyYWd0cmVlKGYpKTsKKworCWlmICghZm4pIHsKKwkJLyogTm8gZGF0YSBub2RlcyBmb3IgdGhpcyBpbm9kZS4gKi8KKwkJaWYgKGYtPmlub2NhY2hlLT5pbm8gIT0gMSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiamZmczJfZG9fcmVhZF9pbm9kZSgpOiBObyBkYXRhIG5vZGVzIGZvdW5kIGZvciBpbm8gIyV1XG4iLCBmLT5pbm9jYWNoZS0+aW5vKTsKKwkJCWlmICghZmRfbGlzdCkgeworCQkJCWlmIChmLT5pbm9jYWNoZS0+c3RhdGUgPT0gSU5PX1NUQVRFX1JFQURJTkcpCisJCQkJCWpmZnMyX3NldF9pbm9jYWNoZV9zdGF0ZShjLCBmLT5pbm9jYWNoZSwgSU5PX1NUQVRFX0NIRUNLRURBQlNFTlQpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiamZmczJfZG9fcmVhZF9pbm9kZSgpOiBCdXQgaXQgaGFzIGNoaWxkcmVuIHNvIHdlIGZha2Ugc29tZSBtb2RlcyBmb3IgaXRcbiIpOworCQl9CisJCWxhdGVzdF9ub2RlLT5tb2RlID0gY3B1X3RvX2plbW9kZShTX0lGRElSfFNfSVJVR098U19JV1VTUnxTX0lYVUdPKTsKKwkJbGF0ZXN0X25vZGUtPnZlcnNpb24gPSBjcHVfdG9famUzMigwKTsKKwkJbGF0ZXN0X25vZGUtPmF0aW1lID0gbGF0ZXN0X25vZGUtPmN0aW1lID0gbGF0ZXN0X25vZGUtPm10aW1lID0gY3B1X3RvX2plMzIoMCk7CisJCWxhdGVzdF9ub2RlLT5pc2l6ZSA9IGNwdV90b19qZTMyKDApOworCQlsYXRlc3Rfbm9kZS0+Z2lkID0gY3B1X3RvX2plMTYoMCk7CisJCWxhdGVzdF9ub2RlLT51aWQgPSBjcHVfdG9famUxNigwKTsKKwkJaWYgKGYtPmlub2NhY2hlLT5zdGF0ZSA9PSBJTk9fU1RBVEVfUkVBRElORykKKwkJCWpmZnMyX3NldF9pbm9jYWNoZV9zdGF0ZShjLCBmLT5pbm9jYWNoZSwgSU5PX1NUQVRFX1BSRVNFTlQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXQgPSBqZmZzMl9mbGFzaF9yZWFkKGMsIHJlZl9vZmZzZXQoZm4tPnJhdyksIHNpemVvZigqbGF0ZXN0X25vZGUpLCAmcmV0bGVuLCAodm9pZCAqKWxhdGVzdF9ub2RlKTsKKwlpZiAocmV0IHx8IHJldGxlbiAhPSBzaXplb2YoKmxhdGVzdF9ub2RlKSkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIk1URCByZWFkIGluIGpmZnMyX2RvX3JlYWRfaW5vZGUoKSBmYWlsZWQ6IFJldHVybmVkICVkLCAlemQgb2YgJXpkIGJ5dGVzIHJlYWRcbiIsCisJCSAgICAgICByZXQsIHJldGxlbiwgc2l6ZW9mKCpsYXRlc3Rfbm9kZSkpOworCQkvKiBGSVhNRTogSWYgdGhpcyBmYWlscywgdGhlcmUgc2VlbXMgdG8gYmUgYSBtZW1vcnkgbGVhay4gRmluZCBpdC4gKi8KKwkJdXAoJmYtPnNlbSk7CisJCWpmZnMyX2RvX2NsZWFyX2lub2RlKGMsIGYpOworCQlyZXR1cm4gcmV0P3JldDotRUlPOworCX0KKworCWNyYyA9IGNyYzMyKDAsIGxhdGVzdF9ub2RlLCBzaXplb2YoKmxhdGVzdF9ub2RlKS04KTsKKwlpZiAoY3JjICE9IGplMzJfdG9fY3B1KGxhdGVzdF9ub2RlLT5ub2RlX2NyYykpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJDUkMgZmFpbGVkIGZvciByZWFkX2lub2RlIG9mIGlub2RlICV1IGF0IHBoeXNpY2FsIGxvY2F0aW9uIDB4JXhcbiIsIGYtPmlub2NhY2hlLT5pbm8sIHJlZl9vZmZzZXQoZm4tPnJhdykpOworCQl1cCgmZi0+c2VtKTsKKwkJamZmczJfZG9fY2xlYXJfaW5vZGUoYywgZik7CisJCXJldHVybiAtRUlPOworCX0KKworCXN3aXRjaChqZW1vZGVfdG9fY3B1KGxhdGVzdF9ub2RlLT5tb2RlKSAmIFNfSUZNVCkgeworCWNhc2UgU19JRkRJUjoKKwkJaWYgKG1jdGltZV92ZXIgPiBqZTMyX3RvX2NwdShsYXRlc3Rfbm9kZS0+dmVyc2lvbikpIHsKKwkJCS8qIFRoZSB0aW1lcyBpbiB0aGUgbGF0ZXN0X25vZGUgYXJlIGFjdHVhbGx5IG9sZGVyIHRoYW4KKwkJCSAgIG1jdGltZSBpbiB0aGUgbGF0ZXN0IGRpcmVudC4gQ2hlYXQuICovCisJCQlsYXRlc3Rfbm9kZS0+Y3RpbWUgPSBsYXRlc3Rfbm9kZS0+bXRpbWUgPSBjcHVfdG9famUzMihsYXRlc3RfbWN0aW1lKTsKKwkJfQorCQlicmVhazsKKworCQkJCisJY2FzZSBTX0lGUkVHOgorCQkvKiBJZiBpdCB3YXMgYSByZWd1bGFyIGZpbGUsIHRydW5jYXRlIGl0IHRvIHRoZSBsYXRlc3Qgbm9kZSdzIGlzaXplICovCisJCWpmZnMyX3RydW5jYXRlX2ZyYWdsaXN0KGMsICZmLT5mcmFndHJlZSwgamUzMl90b19jcHUobGF0ZXN0X25vZGUtPmlzaXplKSk7CisJCWJyZWFrOworCisJY2FzZSBTX0lGTE5LOgorCQkvKiBIYWNrIHRvIHdvcmsgYXJvdW5kIGJyb2tlbiBpc2l6ZSBpbiBvbGQgc3ltbGluayBjb2RlLgorCQkgICBSZW1vdmUgdGhpcyB3aGVuIGR3bXcyIGNvbWVzIHRvIGhpcyBzZW5zZXMgYW5kIHN0b3BzCisJCSAgIHN5bWxpbmtzIGZyb20gYmVpbmcgYW4gZW50aXJlbHkgZ3JhdHVpdG91cyBzcGVjaWFsCisJCSAgIGNhc2UuICovCisJCWlmICghamUzMl90b19jcHUobGF0ZXN0X25vZGUtPmlzaXplKSkKKwkJCWxhdGVzdF9ub2RlLT5pc2l6ZSA9IGxhdGVzdF9ub2RlLT5kc2l6ZTsKKwkJLyogZmFsbCB0aHJvdWdoLi4uICovCisKKwljYXNlIFNfSUZCTEs6CisJY2FzZSBTX0lGQ0hSOgorCQkvKiBDZXJ0YWluIGlub2RlIHR5cGVzIHNob3VsZCBoYXZlIG9ubHkgb25lIGRhdGEgbm9kZSwgYW5kIGl0J3MKKwkJICAga2VwdCBhcyB0aGUgbWV0YWRhdGEgbm9kZSAqLworCQlpZiAoZi0+bWV0YWRhdGEpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFyZ2guIFNwZWNpYWwgaW5vZGUgIyV1IHdpdGggbW9kZSAwJW8gaGFkIG1ldGFkYXRhIG5vZGVcbiIsCisJCQkgICAgICAgZi0+aW5vY2FjaGUtPmlubywgamVtb2RlX3RvX2NwdShsYXRlc3Rfbm9kZS0+bW9kZSkpOworCQkJdXAoJmYtPnNlbSk7CisJCQlqZmZzMl9kb19jbGVhcl9pbm9kZShjLCBmKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCWlmICghZnJhZ19maXJzdCgmZi0+ZnJhZ3RyZWUpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJBcmdoLiBTcGVjaWFsIGlub2RlICMldSB3aXRoIG1vZGUgMCVvIGhhcyBubyBmcmFnbWVudHNcbiIsCisJCQkgICAgICAgZi0+aW5vY2FjaGUtPmlubywgamVtb2RlX3RvX2NwdShsYXRlc3Rfbm9kZS0+bW9kZSkpOworCQkJdXAoJmYtPnNlbSk7CisJCQlqZmZzMl9kb19jbGVhcl9pbm9kZShjLCBmKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCS8qIEFTU0VSVDogZi0+ZnJhZ2xpc3QgIT0gTlVMTCAqLworCQlpZiAoZnJhZ19uZXh0KGZyYWdfZmlyc3QoJmYtPmZyYWd0cmVlKSkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFyZ2guIFNwZWNpYWwgaW5vZGUgIyV1IHdpdGggbW9kZSAweCV4IGhhZCBtb3JlIHRoYW4gb25lIG5vZGVcbiIsCisJCQkgICAgICAgZi0+aW5vY2FjaGUtPmlubywgamVtb2RlX3RvX2NwdShsYXRlc3Rfbm9kZS0+bW9kZSkpOworCQkJLyogRklYTUU6IERlYWwgd2l0aCBpdCAtIGNoZWNrIGNyYzMyLCBjaGVjayBmb3IgZHVwbGljYXRlIG5vZGUsIGNoZWNrIHRpbWVzIGFuZCBkaXNjYXJkIHRoZSBvbGRlciBvbmUgKi8KKwkJCXVwKCZmLT5zZW0pOworCQkJamZmczJfZG9fY2xlYXJfaW5vZGUoYywgZik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQkvKiBPSy4gV2UncmUgaGFwcHkgKi8KKwkJZi0+bWV0YWRhdGEgPSBmcmFnX2ZpcnN0KCZmLT5mcmFndHJlZSktPm5vZGU7CisJCWpmZnMyX2ZyZWVfbm9kZV9mcmFnKGZyYWdfZmlyc3QoJmYtPmZyYWd0cmVlKSk7CisJCWYtPmZyYWd0cmVlID0gUkJfUk9PVDsKKwkJYnJlYWs7CisJfQorCWlmIChmLT5pbm9jYWNoZS0+c3RhdGUgPT0gSU5PX1NUQVRFX1JFQURJTkcpCisJCWpmZnMyX3NldF9pbm9jYWNoZV9zdGF0ZShjLCBmLT5pbm9jYWNoZSwgSU5PX1NUQVRFX1BSRVNFTlQpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgamZmczJfZG9fY2xlYXJfaW5vZGUoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmKQoreworCXN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqZmQsICpmZHM7CisJaW50IGRlbGV0ZWQ7CisKKwlkb3duKCZmLT5zZW0pOworCWRlbGV0ZWQgPSBmLT5pbm9jYWNoZSAmJiAhZi0+aW5vY2FjaGUtPm5saW5rOworCisJaWYgKGYtPm1ldGFkYXRhKSB7CisJCWlmIChkZWxldGVkKQorCQkJamZmczJfbWFya19ub2RlX29ic29sZXRlKGMsIGYtPm1ldGFkYXRhLT5yYXcpOworCQlqZmZzMl9mcmVlX2Z1bGxfZG5vZGUoZi0+bWV0YWRhdGEpOworCX0KKworCWpmZnMyX2tpbGxfZnJhZ3RyZWUoJmYtPmZyYWd0cmVlLCBkZWxldGVkP2M6TlVMTCk7CisKKwlmZHMgPSBmLT5kZW50czsKKworCXdoaWxlKGZkcykgeworCQlmZCA9IGZkczsKKwkJZmRzID0gZmQtPm5leHQ7CisJCWpmZnMyX2ZyZWVfZnVsbF9kaXJlbnQoZmQpOworCX0KKworCWlmIChmLT5pbm9jYWNoZSAmJiBmLT5pbm9jYWNoZS0+c3RhdGUgIT0gSU5PX1NUQVRFX0NIRUNLSU5HKQorCQlqZmZzMl9zZXRfaW5vY2FjaGVfc3RhdGUoYywgZi0+aW5vY2FjaGUsIElOT19TVEFURV9DSEVDS0VEQUJTRU5UKTsKKworCXVwKCZmLT5zZW0pOworfQpkaWZmIC0tZ2l0IGEvZnMvamZmczIvc2Nhbi5jIGIvZnMvamZmczIvc2Nhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZDUzNTgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZmZzMi9zY2FuLmMKQEAgLTAsMCArMSw5MTYgQEAKKy8qCisgKiBKRkZTMiAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgVmVyc2lvbiAyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBDcmVhdGVkIGJ5IERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4KKyAqCisgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgorICoKKyAqICRJZDogc2Nhbi5jLHYgMS4xMTUgMjAwNC8xMS8xNyAxMjo1OTowOCBkZWRla2luZCBFeHAgJAorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgIm5vZGVsaXN0LmgiCisKKyNkZWZpbmUgRU1QVFlfU0NBTl9TSVpFIDEwMjQKKworI2RlZmluZSBESVJUWV9TUEFDRSh4KSBkbyB7IHR5cGVvZih4KSBfeCA9ICh4KTsgXAorCQljLT5mcmVlX3NpemUgLT0gX3g7IGMtPmRpcnR5X3NpemUgKz0gX3g7IFwKKwkJamViLT5mcmVlX3NpemUgLT0gX3ggOyBqZWItPmRpcnR5X3NpemUgKz0gX3g7IFwKKwkJfXdoaWxlKDApCisjZGVmaW5lIFVTRURfU1BBQ0UoeCkgZG8geyB0eXBlb2YoeCkgX3ggPSAoeCk7IFwKKwkJYy0+ZnJlZV9zaXplIC09IF94OyBjLT51c2VkX3NpemUgKz0gX3g7IFwKKwkJamViLT5mcmVlX3NpemUgLT0gX3ggOyBqZWItPnVzZWRfc2l6ZSArPSBfeDsgXAorCQl9d2hpbGUoMCkKKyNkZWZpbmUgVU5DSEVDS0VEX1NQQUNFKHgpIGRvIHsgdHlwZW9mKHgpIF94ID0gKHgpOyBcCisJCWMtPmZyZWVfc2l6ZSAtPSBfeDsgYy0+dW5jaGVja2VkX3NpemUgKz0gX3g7IFwKKwkJamViLT5mcmVlX3NpemUgLT0gX3ggOyBqZWItPnVuY2hlY2tlZF9zaXplICs9IF94OyBcCisJCX13aGlsZSgwKQorCisjZGVmaW5lIG5vaXN5X3ByaW50ayhub2lzZSwgYXJncy4uLikgZG8geyBcCisJaWYgKCoobm9pc2UpKSB7IFwKKwkJcHJpbnRrKEtFUk5fTk9USUNFIGFyZ3MpOyBcCisJCSAoKihub2lzZSkpLS07IFwKKwkJIGlmICghKCoobm9pc2UpKSkgeyBcCisJCQkgcHJpbnRrKEtFUk5fTk9USUNFICJGdXJ0aGVyIHN1Y2ggZXZlbnRzIGZvciB0aGlzIGVyYXNlIGJsb2NrIHdpbGwgbm90IGJlIHByaW50ZWRcbiIpOyBcCisJCSB9IFwKKwl9IFwKK30gd2hpbGUoMCkKKworc3RhdGljIHVpbnQzMl90IHBzZXVkb19yYW5kb207CisKK3N0YXRpYyBpbnQgamZmczJfc2Nhbl9lcmFzZWJsb2NrIChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiwKKwkJCQkgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdWludDMyX3QgYnVmX3NpemUpOworCisvKiBUaGVzZSBoZWxwZXIgZnVuY3Rpb25zIF9tdXN0XyBpbmNyZWFzZSBvZnMgYW5kIGFsc28gZG8gdGhlIGRpcnR5L3VzZWQgc3BhY2UgYWNjb3VudGluZy4gCisgKiBSZXR1cm5pbmcgYW4gZXJyb3Igd2lsbCBhYm9ydCB0aGUgbW91bnQgLSBiYWQgY2hlY2tzdW1zIGV0Yy4gc2hvdWxkIGp1c3QgbWFyayB0aGUgc3BhY2UKKyAqIGFzIGRpcnR5LgorICovCitzdGF0aWMgaW50IGpmZnMyX3NjYW5faW5vZGVfbm9kZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiwgCisJCQkJIHN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKnJpLCB1aW50MzJfdCBvZnMpOworc3RhdGljIGludCBqZmZzMl9zY2FuX2RpcmVudF9ub2RlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViLAorCQkJCSBzdHJ1Y3QgamZmczJfcmF3X2RpcmVudCAqcmQsIHVpbnQzMl90IG9mcyk7CisKKyNkZWZpbmUgQkxLX1NUQVRFX0FMTEZGCQkwCisjZGVmaW5lIEJMS19TVEFURV9DTEVBTgkJMQorI2RlZmluZSBCTEtfU1RBVEVfUEFSVERJUlRZCTIKKyNkZWZpbmUgQkxLX1NUQVRFX0NMRUFOTUFSS0VSCTMKKyNkZWZpbmUgQkxLX1NUQVRFX0FMTERJUlRZCTQKKyNkZWZpbmUgQkxLX1NUQVRFX0JBREJMT0NLCTUKKworc3RhdGljIGlubGluZSBpbnQgbWluX2ZyZWUoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpCit7CisJdWludDMyX3QgbWluID0gMiAqIHNpemVvZihzdHJ1Y3QgamZmczJfcmF3X2lub2RlKTsKKyNpZiBkZWZpbmVkIENPTkZJR19KRkZTMl9GU19OQU5EIHx8IGRlZmluZWQgQ09ORklHX0pGRlMyX0ZTX05PUl9FQ0MKKwlpZiAoIWpmZnMyX2Nhbl9tYXJrX29ic29sZXRlKGMpICYmIG1pbiA8IGMtPndidWZfcGFnZXNpemUpCisJCXJldHVybiBjLT53YnVmX3BhZ2VzaXplOworI2VuZGlmCisJcmV0dXJuIG1pbjsKKworfQoraW50IGpmZnMyX3NjYW5fbWVkaXVtKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKQoreworCWludCBpLCByZXQ7CisJdWludDMyX3QgZW1wdHlfYmxvY2tzID0gMCwgYmFkX2Jsb2NrcyA9IDA7CisJdW5zaWduZWQgY2hhciAqZmxhc2hidWYgPSBOVUxMOworCXVpbnQzMl90IGJ1Zl9zaXplID0gMDsKKyNpZm5kZWYgX19FQ09TCisJc2l6ZV90IHBvaW50bGVuOworCisJaWYgKGMtPm10ZC0+cG9pbnQpIHsKKwkJcmV0ID0gYy0+bXRkLT5wb2ludCAoYy0+bXRkLCAwLCBjLT5tdGQtPnNpemUsICZwb2ludGxlbiwgJmZsYXNoYnVmKTsKKwkJaWYgKCFyZXQgJiYgcG9pbnRsZW4gPCBjLT5tdGQtPnNpemUpIHsKKwkJCS8qIERvbid0IG11Y2sgYWJvdXQgaWYgaXQgd29uJ3QgbGV0IHVzIHBvaW50IHRvIHRoZSB3aG9sZSBmbGFzaCAqLworCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIk1URCBwb2ludCByZXR1cm5lZCBsZW4gdG9vIHNob3J0OiAweCV6eFxuIiwgcG9pbnRsZW4pKTsKKwkJCWMtPm10ZC0+dW5wb2ludChjLT5tdGQsIGZsYXNoYnVmLCAwLCBjLT5tdGQtPnNpemUpOworCQkJZmxhc2hidWYgPSBOVUxMOworCQl9CisJCWlmIChyZXQpCisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiTVREIHBvaW50IGZhaWxlZCAlZFxuIiwgcmV0KSk7CisJfQorI2VuZGlmCisJaWYgKCFmbGFzaGJ1ZikgeworCQkvKiBGb3IgTkFORCBpdCdzIHF1aWNrZXIgdG8gcmVhZCBhIHdob2xlIGVyYXNlYmxvY2sgYXQgYSB0aW1lLAorCQkgICBhcHBhcmVudGx5ICovCisJCWlmIChqZmZzMl9jbGVhbm1hcmtlcl9vb2IoYykpCisJCQlidWZfc2l6ZSA9IGMtPnNlY3Rvcl9zaXplOworCQllbHNlCisJCQlidWZfc2l6ZSA9IFBBR0VfU0laRTsKKworCQkvKiBSZXNwZWN0IGttYWxsb2MgbGltaXRhdGlvbnMgKi8KKwkJaWYgKGJ1Zl9zaXplID4gMTI4KjEwMjQpCisJCQlidWZfc2l6ZSA9IDEyOCoxMDI0OworCisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJBbGxvY2F0aW5nIHJlYWRidWYgb2YgJWQgYnl0ZXNcbiIsIGJ1Zl9zaXplKSk7CisJCWZsYXNoYnVmID0ga21hbGxvYyhidWZfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghZmxhc2hidWYpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmb3IgKGk9MDsgaTxjLT5ucl9ibG9ja3M7IGkrKykgeworCQlzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViID0gJmMtPmJsb2Nrc1tpXTsKKworCQlyZXQgPSBqZmZzMl9zY2FuX2VyYXNlYmxvY2soYywgamViLCBidWZfc2l6ZT9mbGFzaGJ1ZjooZmxhc2hidWYramViLT5vZmZzZXQpLCBidWZfc2l6ZSk7CisKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKworCQlBQ0NUX1BBUkFOT0lBX0NIRUNLKGplYik7CisKKwkJLyogTm93IGRlY2lkZSB3aGljaCBsaXN0IHRvIHB1dCBpdCBvbiAqLworCQlzd2l0Y2gocmV0KSB7CisJCWNhc2UgQkxLX1NUQVRFX0FMTEZGOgorCQkJLyogCisJCQkgKiBFbXB0eSBibG9jay4gICBTaW5jZSB3ZSBjYW4ndCBiZSBzdXJlIGl0IAorCQkJICogd2FzIGVudGlyZWx5IGVyYXNlZCwgd2UganVzdCBxdWV1ZSBpdCBmb3IgZXJhc2UKKwkJCSAqIGFnYWluLiAgSXQgd2lsbCBiZSBtYXJrZWQgYXMgc3VjaCB3aGVuIHRoZSBlcmFzZQorCQkJICogaXMgY29tcGxldGUuICBNZWFud2hpbGUgd2Ugc3RpbGwgY291bnQgaXQgYXMgZW1wdHkKKwkJCSAqIGZvciBsYXRlciBjaGVja3MuCisJCQkgKi8KKwkJCWVtcHR5X2Jsb2NrcysrOworCQkJbGlzdF9hZGQoJmplYi0+bGlzdCwgJmMtPmVyYXNlX3BlbmRpbmdfbGlzdCk7CisJCQljLT5ucl9lcmFzaW5nX2Jsb2NrcysrOworCQkJYnJlYWs7CisKKwkJY2FzZSBCTEtfU1RBVEVfQ0xFQU5NQVJLRVI6CisJCQkvKiBPbmx5IGEgQ0xFQU5NQVJLRVIgbm9kZSBpcyB2YWxpZCAqLworCQkJaWYgKCFqZWItPmRpcnR5X3NpemUpIHsKKwkJCQkvKiBJdCdzIGFjdHVhbGx5IGZyZWUgKi8KKwkJCQlsaXN0X2FkZCgmamViLT5saXN0LCAmYy0+ZnJlZV9saXN0KTsKKwkJCQljLT5ucl9mcmVlX2Jsb2NrcysrOworCQkJfSBlbHNlIHsKKwkJCQkvKiBEaXJ0ICovCisJCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkFkZGluZyBhbGwtZGlydHkgYmxvY2sgYXQgMHglMDh4IHRvIGVyYXNlX3BlbmRpbmdfbGlzdFxuIiwgamViLT5vZmZzZXQpKTsKKwkJCQlsaXN0X2FkZCgmamViLT5saXN0LCAmYy0+ZXJhc2VfcGVuZGluZ19saXN0KTsKKwkJCQljLT5ucl9lcmFzaW5nX2Jsb2NrcysrOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBCTEtfU1RBVEVfQ0xFQU46CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBGdWxsIChvciBhbG1vc3QgZnVsbCkgb2YgY2xlYW4gZGF0YS4gQ2xlYW4gbGlzdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9hZGQoJmplYi0+bGlzdCwgJmMtPmNsZWFuX2xpc3QpOworCQkJYnJlYWs7CisKKwkJY2FzZSBCTEtfU1RBVEVfUEFSVERJUlRZOgorICAgICAgICAgICAgICAgICAgICAgICAgLyogU29tZSBkYXRhLCBidXQgbm90IGZ1bGwuIERpcnR5IGxpc3QuICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBXZSB3YW50IHRvIHJlbWVtYmVyIHRoZSBibG9jayB3aXRoIG1vc3QgZnJlZSBzcGFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHN0aWNrIGl0IGluIHRoZSAnbmV4dGJsb2NrJyBwb3NpdGlvbiB0byBzdGFydCB3cml0aW5nIHRvIGl0LiAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGplYi0+ZnJlZV9zaXplID4gbWluX2ZyZWUoYykgJiYgCisJCQkgICAgKCFjLT5uZXh0YmxvY2sgfHwgYy0+bmV4dGJsb2NrLT5mcmVlX3NpemUgPCBqZWItPmZyZWVfc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQmV0dGVyIGNhbmRpZGF0ZSBmb3IgdGhlIG5leHQgd3JpdGVzIHRvIGdvIHRvICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjLT5uZXh0YmxvY2spIHsKKwkJCQkJYy0+bmV4dGJsb2NrLT5kaXJ0eV9zaXplICs9IGMtPm5leHRibG9jay0+ZnJlZV9zaXplICsgYy0+bmV4dGJsb2NrLT53YXN0ZWRfc2l6ZTsKKwkJCQkJYy0+ZGlydHlfc2l6ZSArPSBjLT5uZXh0YmxvY2stPmZyZWVfc2l6ZSArIGMtPm5leHRibG9jay0+d2FzdGVkX3NpemU7CisJCQkJCWMtPmZyZWVfc2l6ZSAtPSBjLT5uZXh0YmxvY2stPmZyZWVfc2l6ZTsKKwkJCQkJYy0+d2FzdGVkX3NpemUgLT0gYy0+bmV4dGJsb2NrLT53YXN0ZWRfc2l6ZTsKKwkJCQkJYy0+bmV4dGJsb2NrLT5mcmVlX3NpemUgPSBjLT5uZXh0YmxvY2stPndhc3RlZF9zaXplID0gMDsKKwkJCQkJaWYgKFZFUllESVJUWShjLCBjLT5uZXh0YmxvY2stPmRpcnR5X3NpemUpKSB7CisJCQkJCQlsaXN0X2FkZCgmYy0+bmV4dGJsb2NrLT5saXN0LCAmYy0+dmVyeV9kaXJ0eV9saXN0KTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWxpc3RfYWRkKCZjLT5uZXh0YmxvY2stPmxpc3QsICZjLT5kaXJ0eV9saXN0KTsKKwkJCQkJfQorCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+bmV4dGJsb2NrID0gamViOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKwkJCQlqZWItPmRpcnR5X3NpemUgKz0gamViLT5mcmVlX3NpemUgKyBqZWItPndhc3RlZF9zaXplOworCQkJCWMtPmRpcnR5X3NpemUgKz0gamViLT5mcmVlX3NpemUgKyBqZWItPndhc3RlZF9zaXplOworCQkJCWMtPmZyZWVfc2l6ZSAtPSBqZWItPmZyZWVfc2l6ZTsKKwkJCQljLT53YXN0ZWRfc2l6ZSAtPSBqZWItPndhc3RlZF9zaXplOworCQkJCWplYi0+ZnJlZV9zaXplID0gamViLT53YXN0ZWRfc2l6ZSA9IDA7CisJCQkJaWYgKFZFUllESVJUWShjLCBqZWItPmRpcnR5X3NpemUpKSB7CisJCQkJCWxpc3RfYWRkKCZqZWItPmxpc3QsICZjLT52ZXJ5X2RpcnR5X2xpc3QpOworCQkJCX0gZWxzZSB7CisJCQkJCWxpc3RfYWRkKCZqZWItPmxpc3QsICZjLT5kaXJ0eV9saXN0KTsKKwkJCQl9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCQlicmVhazsKKworCQljYXNlIEJMS19TVEFURV9BTExESVJUWToKKwkJCS8qIE5vdGhpbmcgdmFsaWQgLSBub3QgZXZlbiBhIGNsZWFuIG1hcmtlci4gTmVlZHMgZXJhc2luZy4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBub3cgd2UganVzdCBwdXQgaXQgb24gdGhlIGVyYXNpbmcgbGlzdC4gV2UnbGwgc3RhcnQgdGhlIGVyYXNlcyBsYXRlciAqLworCQkJRDEocHJpbnRrKEtFUk5fTk9USUNFICJKRkZTMjogRXJhc2UgYmxvY2sgYXQgMHglMDh4IGlzIG5vdCBmb3JtYXR0ZWQuIEl0IHdpbGwgYmUgZXJhc2VkXG4iLCBqZWItPm9mZnNldCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9hZGQoJmplYi0+bGlzdCwgJmMtPmVyYXNlX3BlbmRpbmdfbGlzdCk7CisJCQljLT5ucl9lcmFzaW5nX2Jsb2NrcysrOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBCTEtfU1RBVEVfQkFEQkxPQ0s6CisJCQlEMShwcmludGsoS0VSTl9OT1RJQ0UgIkpGRlMyOiBCbG9jayBhdCAweCUwOHggaXMgYmFkXG4iLCBqZWItPm9mZnNldCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdF9hZGQoJmplYi0+bGlzdCwgJmMtPmJhZF9saXN0KTsKKwkJCWMtPmJhZF9zaXplICs9IGMtPnNlY3Rvcl9zaXplOworCQkJYy0+ZnJlZV9zaXplIC09IGMtPnNlY3Rvcl9zaXplOworCQkJYmFkX2Jsb2NrcysrOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJqZmZzMl9zY2FuX21lZGl1bSgpOiB1bmtub3duIGJsb2NrIHN0YXRlXG4iKTsKKwkJCUJVRygpOwkKKwkJfQorCX0KKwkKKwkvKiBOZXh0YmxvY2sgZGlydHkgaXMgYWx3YXlzIHNlZW4gYXMgd2FzdGVkLCBiZWNhdXNlIHdlIGNhbm5vdCByZWN5Y2xlIGl0IG5vdyAqLworCWlmIChjLT5uZXh0YmxvY2sgJiYgKGMtPm5leHRibG9jay0+ZGlydHlfc2l6ZSkpIHsKKwkJYy0+bmV4dGJsb2NrLT53YXN0ZWRfc2l6ZSArPSBjLT5uZXh0YmxvY2stPmRpcnR5X3NpemU7CisJCWMtPndhc3RlZF9zaXplICs9IGMtPm5leHRibG9jay0+ZGlydHlfc2l6ZTsKKwkJYy0+ZGlydHlfc2l6ZSAtPSBjLT5uZXh0YmxvY2stPmRpcnR5X3NpemU7CisJCWMtPm5leHRibG9jay0+ZGlydHlfc2l6ZSA9IDA7CisJfQorI2lmIGRlZmluZWQgQ09ORklHX0pGRlMyX0ZTX05BTkQgfHwgZGVmaW5lZCBDT05GSUdfSkZGUzJfRlNfTk9SX0VDQworCWlmICghamZmczJfY2FuX21hcmtfb2Jzb2xldGUoYykgJiYgYy0+bmV4dGJsb2NrICYmIChjLT5uZXh0YmxvY2stPmZyZWVfc2l6ZSAmIChjLT53YnVmX3BhZ2VzaXplLTEpKSkgeworCQkvKiBJZiB3ZSdyZSBnb2luZyB0byBzdGFydCB3cml0aW5nIGludG8gYSBibG9jayB3aGljaCBhbHJlYWR5IAorCQkgICBjb250YWlucyBkYXRhLCBhbmQgdGhlIGVuZCBvZiB0aGUgZGF0YSBpc24ndCBwYWdlLWFsaWduZWQsCisJCSAgIHNraXAgYSBsaXR0bGUgYW5kIGFsaWduIGl0LiAqLworCisJCXVpbnQzMl90IHNraXAgPSBjLT5uZXh0YmxvY2stPmZyZWVfc2l6ZSAmIChjLT53YnVmX3BhZ2VzaXplLTEpOworCisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9zY2FuX21lZGl1bSgpOiBTa2lwcGluZyAlZCBieXRlcyBpbiBuZXh0YmxvY2sgdG8gZW5zdXJlIHBhZ2UgYWxpZ25tZW50XG4iLAorCQkJICBza2lwKSk7CisJCWMtPm5leHRibG9jay0+d2FzdGVkX3NpemUgKz0gc2tpcDsKKwkJYy0+d2FzdGVkX3NpemUgKz0gc2tpcDsKKworCQljLT5uZXh0YmxvY2stPmZyZWVfc2l6ZSAtPSBza2lwOworCQljLT5mcmVlX3NpemUgLT0gc2tpcDsKKwl9CisjZW5kaWYKKwlpZiAoYy0+bnJfZXJhc2luZ19ibG9ja3MpIHsKKwkJaWYgKCAhYy0+dXNlZF9zaXplICYmICgoYy0+bnJfZnJlZV9ibG9ja3MrZW1wdHlfYmxvY2tzK2JhZF9ibG9ja3MpIT0gYy0+bnJfYmxvY2tzIHx8IGJhZF9ibG9ja3MgPT0gYy0+bnJfYmxvY2tzKSApIHsgCisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIkNvd2FyZGx5IHJlZnVzaW5nIHRvIGVyYXNlIGJsb2NrcyBvbiBmaWxlc3lzdGVtIHdpdGggbm8gdmFsaWQgSkZGUzIgbm9kZXNcbiIpOworCQkJcHJpbnRrKEtFUk5fTk9USUNFICJlbXB0eV9ibG9ja3MgJWQsIGJhZF9ibG9ja3MgJWQsIGMtPm5yX2Jsb2NrcyAlZFxuIixlbXB0eV9ibG9ja3MsYmFkX2Jsb2NrcyxjLT5ucl9ibG9ja3MpOworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisJCWpmZnMyX2VyYXNlX3BlbmRpbmdfdHJpZ2dlcihjKTsKKwl9CisJcmV0ID0gMDsKKyBvdXQ6CisJaWYgKGJ1Zl9zaXplKQorCQlrZnJlZShmbGFzaGJ1Zik7CisjaWZuZGVmIF9fRUNPUworCWVsc2UgCisJCWMtPm10ZC0+dW5wb2ludChjLT5tdGQsIGZsYXNoYnVmLCAwLCBjLT5tdGQtPnNpemUpOworI2VuZGlmCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBqZmZzMl9maWxsX3NjYW5fYnVmIChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgdW5zaWduZWQgY2hhciAqYnVmLAorCQkJCXVpbnQzMl90IG9mcywgdWludDMyX3QgbGVuKQoreworCWludCByZXQ7CisJc2l6ZV90IHJldGxlbjsKKworCXJldCA9IGpmZnMyX2ZsYXNoX3JlYWQoYywgb2ZzLCBsZW4sICZyZXRsZW4sIGJ1Zik7CisJaWYgKHJldCkgeworCQlEMShwcmludGsoS0VSTl9XQVJOSU5HICJtdGQtPnJlYWQoMHgleCBieXRlcyBmcm9tIDB4JXgpIHJldHVybmVkICVkXG4iLCBsZW4sIG9mcywgcmV0KSk7CisJCXJldHVybiByZXQ7CisJfQorCWlmIChyZXRsZW4gPCBsZW4pIHsKKwkJRDEocHJpbnRrKEtFUk5fV0FSTklORyAiUmVhZCBhdCAweCV4IGdhdmUgb25seSAweCV6eCBieXRlc1xuIiwgb2ZzLCByZXRsZW4pKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCUQyKHByaW50ayhLRVJOX0RFQlVHICJSZWFkIDB4JXggYnl0ZXMgZnJvbSAweCUwOHggaW50byBidWZcbiIsIGxlbiwgb2ZzKSk7CisJRDIocHJpbnRrKEtFUk5fREVCVUcgIjAwMDogJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJICBidWZbMF0sIGJ1ZlsxXSwgYnVmWzJdLCBidWZbM10sIGJ1Zls0XSwgYnVmWzVdLCBidWZbNl0sIGJ1Zls3XSwgYnVmWzhdLCBidWZbOV0sIGJ1ZlsxMF0sIGJ1ZlsxMV0sIGJ1ZlsxMl0sIGJ1ZlsxM10sIGJ1ZlsxNF0sIGJ1ZlsxNV0pKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBqZmZzMl9zY2FuX2VyYXNlYmxvY2sgKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViLAorCQkJCSAgdW5zaWduZWQgY2hhciAqYnVmLCB1aW50MzJfdCBidWZfc2l6ZSkgeworCXN0cnVjdCBqZmZzMl91bmtub3duX25vZGUgKm5vZGU7CisJc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSBjcmNub2RlOworCXVpbnQzMl90IG9mcywgcHJldm9mczsKKwl1aW50MzJfdCBoZHJfY3JjLCBidWZfb2ZzLCBidWZfbGVuOworCWludCBlcnI7CisJaW50IG5vaXNlID0gMDsKKyNpZmRlZiBDT05GSUdfSkZGUzJfRlNfTkFORAorCWludCBjbGVhbm1hcmtlcmZvdW5kID0gMDsKKyNlbmRpZgorCisJb2ZzID0gamViLT5vZmZzZXQ7CisJcHJldm9mcyA9IGplYi0+b2Zmc2V0IC0gMTsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9zY2FuX2VyYXNlYmxvY2soKTogU2Nhbm5pbmcgYmxvY2sgYXQgMHgleFxuIiwgb2ZzKSk7CisKKyNpZmRlZiBDT05GSUdfSkZGUzJfRlNfTkFORAorCWlmIChqZmZzMl9jbGVhbm1hcmtlcl9vb2IoYykpIHsKKwkJaW50IHJldCA9IGpmZnMyX2NoZWNrX25hbmRfY2xlYW5tYXJrZXIoYywgamViKTsKKwkJRDIocHJpbnRrKEtFUk5fTk9USUNFICJqZmZzX2NoZWNrX25hbmRfY2xlYW5tYXJrZXIgcmV0dXJuZWQgJWRcbiIscmV0KSk7CisJCS8qIEV2ZW4gaWYgaXQncyBub3QgZm91bmQsIHdlIHN0aWxsIHNjYW4gdG8gc2VlCisJCSAgIGlmIHRoZSBibG9jayBpcyBlbXB0eS4gV2UgdXNlIHRoaXMgaW5mb3JtYXRpb24KKwkJICAgdG8gZGVjaWRlIHdoZXRoZXIgdG8gZXJhc2UgaXQgb3Igbm90LiAqLworCQlzd2l0Y2ggKHJldCkgeworCQljYXNlIDA6CQljbGVhbm1hcmtlcmZvdW5kID0gMTsgYnJlYWs7CisJCWNhc2UgMTogCWJyZWFrOworCQljYXNlIDI6IAlyZXR1cm4gQkxLX1NUQVRFX0JBREJMT0NLOworCQljYXNlIDM6CQlyZXR1cm4gQkxLX1NUQVRFX0FMTERJUlRZOyAvKiBCbG9jayBoYXMgZmFpbGVkIHRvIGVyYXNlIG1pbi4gb25jZSAqLworCQlkZWZhdWx0OiAJcmV0dXJuIHJldDsKKwkJfQorCX0KKyNlbmRpZgorCWJ1Zl9vZnMgPSBqZWItPm9mZnNldDsKKworCWlmICghYnVmX3NpemUpIHsKKwkJYnVmX2xlbiA9IGMtPnNlY3Rvcl9zaXplOworCX0gZWxzZSB7CisJCWJ1Zl9sZW4gPSBFTVBUWV9TQ0FOX1NJWkU7CisJCWVyciA9IGpmZnMyX2ZpbGxfc2Nhbl9idWYoYywgYnVmLCBidWZfb2ZzLCBidWZfbGVuKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCQorCS8qIFdlIHRlbXBvcmFyaWx5IHVzZSAnb2ZzJyBhcyBhIHBvaW50ZXIgaW50byB0aGUgYnVmZmVyL2plYiAqLworCW9mcyA9IDA7CisKKwkvKiBTY2FuIG9ubHkgNEtpQiBvZiAweEZGIGJlZm9yZSBkZWNsYXJpbmcgaXQncyBlbXB0eSAqLworCXdoaWxlKG9mcyA8IEVNUFRZX1NDQU5fU0laRSAmJiAqKHVpbnQzMl90ICopKCZidWZbb2ZzXSkgPT0gMHhGRkZGRkZGRikKKwkJb2ZzICs9IDQ7CisKKwlpZiAob2ZzID09IEVNUFRZX1NDQU5fU0laRSkgeworI2lmZGVmIENPTkZJR19KRkZTMl9GU19OQU5ECisJCWlmIChqZmZzMl9jbGVhbm1hcmtlcl9vb2IoYykpIHsKKwkJCS8qIHNjYW4gb29iLCB0YWtlIGNhcmUgb2YgY2xlYW5tYXJrZXIgKi8KKwkJCWludCByZXQgPSBqZmZzMl9jaGVja19vb2JfZW1wdHkoYywgamViLCBjbGVhbm1hcmtlcmZvdW5kKTsKKwkJCUQyKHByaW50ayhLRVJOX05PVElDRSAiamZmczJfY2hlY2tfb29iX2VtcHR5IHJldHVybmVkICVkXG4iLHJldCkpOworCQkJc3dpdGNoIChyZXQpIHsKKwkJCWNhc2UgMDoJCXJldHVybiBjbGVhbm1hcmtlcmZvdW5kID8gQkxLX1NUQVRFX0NMRUFOTUFSS0VSIDogQkxLX1NUQVRFX0FMTEZGOworCQkJY2FzZSAxOiAJcmV0dXJuIEJMS19TVEFURV9BTExESVJUWTsKKwkJCWRlZmF1bHQ6IAlyZXR1cm4gcmV0OworCQkJfQorCQl9CisjZW5kaWYKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkJsb2NrIGF0IDB4JTA4eCBpcyBlbXB0eSAoZXJhc2VkKVxuIiwgamViLT5vZmZzZXQpKTsKKwkJcmV0dXJuIEJMS19TVEFURV9BTExGRjsJLyogT0sgdG8gZXJhc2UgaWYgYWxsIGJsb2NrcyBhcmUgbGlrZSB0aGlzICovCisJfQorCWlmIChvZnMpIHsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkZyZWUgc3BhY2UgYXQgJTA4eCBlbmRzIGF0ICUwOHhcbiIsIGplYi0+b2Zmc2V0LAorCQkJICBqZWItPm9mZnNldCArIG9mcykpOworCQlESVJUWV9TUEFDRShvZnMpOworCX0KKworCS8qIE5vdyBvZnMgaXMgYSBjb21wbGV0ZSBwaHlzaWNhbCBmbGFzaCBvZmZzZXQgYXMgaXQgYWx3YXlzIHdhcy4uLiAqLworCW9mcyArPSBqZWItPm9mZnNldDsKKworCW5vaXNlID0gMTA7CisKK3NjYW5fbW9yZToJCisJd2hpbGUob2ZzIDwgamViLT5vZmZzZXQgKyBjLT5zZWN0b3Jfc2l6ZSkgeworCisJCUQxKEFDQ1RfUEFSQU5PSUFfQ0hFQ0soamViKSk7CisKKwkJY29uZF9yZXNjaGVkKCk7CisKKwkJaWYgKG9mcyAmIDMpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkVlcC4gb2ZzIDB4JTA4eCBub3Qgd29yZC1hbGlnbmVkIVxuIiwgb2ZzKTsKKwkJCW9mcyA9IFBBRChvZnMpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKG9mcyA9PSBwcmV2b2ZzKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJvZnMgMHglMDh4IGhhcyBhbHJlYWR5IGJlZW4gc2Vlbi4gU2tpcHBpbmdcbiIsIG9mcyk7CisJCQlESVJUWV9TUEFDRSg0KTsKKwkJCW9mcyArPSA0OworCQkJY29udGludWU7CisJCX0KKwkJcHJldm9mcyA9IG9mczsKKworCQlpZiAoamViLT5vZmZzZXQgKyBjLT5zZWN0b3Jfc2l6ZSA8IG9mcyArIHNpemVvZigqbm9kZSkpIHsKKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJGZXdlciB0aGFuICV6ZCBieXRlcyBsZWZ0IHRvIGVuZCBvZiBibG9jay4gKCV4KyV4PCV4KyV6eCkgTm90IHJlYWRpbmdcbiIsIHNpemVvZihzdHJ1Y3QgamZmczJfdW5rbm93bl9ub2RlKSwKKwkJCQkgIGplYi0+b2Zmc2V0LCBjLT5zZWN0b3Jfc2l6ZSwgb2ZzLCBzaXplb2YoKm5vZGUpKSk7CisJCQlESVJUWV9TUEFDRSgoamViLT5vZmZzZXQgKyBjLT5zZWN0b3Jfc2l6ZSktb2ZzKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGJ1Zl9vZnMgKyBidWZfbGVuIDwgb2ZzICsgc2l6ZW9mKCpub2RlKSkgeworCQkJYnVmX2xlbiA9IG1pbl90KHVpbnQzMl90LCBidWZfc2l6ZSwgamViLT5vZmZzZXQgKyBjLT5zZWN0b3Jfc2l6ZSAtIG9mcyk7CisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRmV3ZXIgdGhhbiAlemQgYnl0ZXMgKG5vZGUgaGVhZGVyKSBsZWZ0IHRvIGVuZCBvZiBidWYuIFJlYWRpbmcgMHgleCBhdCAweCUwOHhcbiIsCisJCQkJICBzaXplb2Yoc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSksIGJ1Zl9sZW4sIG9mcykpOworCQkJZXJyID0gamZmczJfZmlsbF9zY2FuX2J1ZihjLCBidWYsIG9mcywgYnVmX2xlbik7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisJCQlidWZfb2ZzID0gb2ZzOworCQl9CisKKwkJbm9kZSA9IChzdHJ1Y3QgamZmczJfdW5rbm93bl9ub2RlICopJmJ1ZltvZnMtYnVmX29mc107CisKKwkJaWYgKCoodWludDMyX3QgKikoJmJ1ZltvZnMtYnVmX29mc10pID09IDB4ZmZmZmZmZmYpIHsKKwkJCXVpbnQzMl90IGluYnVmX29mczsKKwkJCXVpbnQzMl90IGVtcHR5X3N0YXJ0OworCisJCQllbXB0eV9zdGFydCA9IG9mczsKKwkJCW9mcyArPSA0OworCisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRm91bmQgZW1wdHkgZmxhc2ggYXQgMHglMDh4XG4iLCBvZnMpKTsKKwkJbW9yZV9lbXB0eToKKwkJCWluYnVmX29mcyA9IG9mcyAtIGJ1Zl9vZnM7CisJCQl3aGlsZSAoaW5idWZfb2ZzIDwgYnVmX2xlbikgeworCQkJCWlmICgqKHVpbnQzMl90ICopKCZidWZbaW5idWZfb2ZzXSkgIT0gMHhmZmZmZmZmZikgeworCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJFbXB0eSBmbGFzaCBhdCAweCUwOHggZW5kcyBhdCAweCUwOHhcbiIsCisJCQkJCSAgICAgICBlbXB0eV9zdGFydCwgb2ZzKTsKKwkJCQkJRElSVFlfU1BBQ0Uob2ZzLWVtcHR5X3N0YXJ0KTsKKwkJCQkJZ290byBzY2FuX21vcmU7CisJCQkJfQorCisJCQkJaW5idWZfb2ZzKz00OworCQkJCW9mcyArPSA0OworCQkJfQorCQkJLyogUmFuIG9mZiBlbmQuICovCisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRW1wdHkgZmxhc2ggdG8gZW5kIG9mIGJ1ZmZlciBhdCAweCUwOHhcbiIsIG9mcykpOworCisJCQkvKiBJZiB3ZSdyZSBvbmx5IGNoZWNraW5nIHRoZSBiZWdpbm5pbmcgb2YgYSBibG9jayB3aXRoIGEgY2xlYW5tYXJrZXIsCisJCQkgICBiYWlsIG5vdyAqLworCQkJaWYgKGJ1Zl9vZnMgPT0gamViLT5vZmZzZXQgJiYgamViLT51c2VkX3NpemUgPT0gUEFEKGMtPmNsZWFubWFya2VyX3NpemUpICYmIAorCQkJICAgIGMtPmNsZWFubWFya2VyX3NpemUgJiYgIWplYi0+ZGlydHlfc2l6ZSAmJiAhamViLT5maXJzdF9ub2RlLT5uZXh0X2luX2lubykgeworCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICIlZCBieXRlcyBhdCBzdGFydCBvZiBibG9jayBzZWVtcyBjbGVhbi4uLiBhc3N1bWluZyBhbGwgY2xlYW5cbiIsIEVNUFRZX1NDQU5fU0laRSkpOworCQkJCXJldHVybiBCTEtfU1RBVEVfQ0xFQU5NQVJLRVI7CisJCQl9CisKKwkJCS8qIFNlZSBob3cgbXVjaCBtb3JlIHRoZXJlIGlzIHRvIHJlYWQgaW4gdGhpcyBlcmFzZWJsb2NrLi4uICovCisJCQlidWZfbGVuID0gbWluX3QodWludDMyX3QsIGJ1Zl9zaXplLCBqZWItPm9mZnNldCArIGMtPnNlY3Rvcl9zaXplIC0gb2ZzKTsKKwkJCWlmICghYnVmX2xlbikgeworCQkJCS8qIE5vIG1vcmUgdG8gcmVhZC4gQnJlYWsgb3V0IG9mIG1haW4gbG9vcCB3aXRob3V0IG1hcmtpbmcgCisJCQkJICAgdGhpcyByYW5nZSBvZiBlbXB0eSBzcGFjZSBhcyBkaXJ0eSAoYmVjYXVzZSBpdCdzIG5vdCkgKi8KKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRW1wdHkgZmxhc2ggYXQgJTA4eCBydW5zIHRvIGVuZCBvZiBibG9jay4gVHJlYXRpbmcgYXMgZnJlZV9zcGFjZVxuIiwKKwkJCQkJICBlbXB0eV9zdGFydCkpOworCQkJCWJyZWFrOworCQkJfQorCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIlJlYWRpbmcgYW5vdGhlciAweCV4IGF0IDB4JTA4eFxuIiwgYnVmX2xlbiwgb2ZzKSk7CisJCQllcnIgPSBqZmZzMl9maWxsX3NjYW5fYnVmKGMsIGJ1Ziwgb2ZzLCBidWZfbGVuKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwkJCWJ1Zl9vZnMgPSBvZnM7CisJCQlnb3RvIG1vcmVfZW1wdHk7CisJCX0KKworCQlpZiAob2ZzID09IGplYi0+b2Zmc2V0ICYmIGplMTZfdG9fY3B1KG5vZGUtPm1hZ2ljKSA9PSBLU0FNVElCX0NJR0FNXzJTRkZKKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJNYWdpYyBiaXRtYXNrIGlzIGJhY2t3YXJkcyBhdCBvZmZzZXQgMHglMDh4LiBXcm9uZyBlbmRpYW4gZmlsZXN5c3RlbT9cbiIsIG9mcyk7CisJCQlESVJUWV9TUEFDRSg0KTsKKwkJCW9mcyArPSA0OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGplMTZfdG9fY3B1KG5vZGUtPm1hZ2ljKSA9PSBKRkZTMl9ESVJUWV9CSVRNQVNLKSB7CisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRGlydHkgYml0bWFzayBhdCAweCUwOHhcbiIsIG9mcykpOworCQkJRElSVFlfU1BBQ0UoNCk7CisJCQlvZnMgKz0gNDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChqZTE2X3RvX2NwdShub2RlLT5tYWdpYykgPT0gSkZGUzJfT0xEX01BR0lDX0JJVE1BU0spIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk9sZCBKRkZTMiBiaXRtYXNrIGZvdW5kIGF0IDB4JTA4eFxuIiwgb2ZzKTsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIllvdSBjYW5ub3QgdXNlIG9sZGVyIEpGRlMyIGZpbGVzeXN0ZW1zIHdpdGggbmV3ZXIga2VybmVsc1xuIik7CisJCQlESVJUWV9TUEFDRSg0KTsKKwkJCW9mcyArPSA0OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGplMTZfdG9fY3B1KG5vZGUtPm1hZ2ljKSAhPSBKRkZTMl9NQUdJQ19CSVRNQVNLKSB7CisJCQkvKiBPSy4gV2UncmUgb3V0IG9mIHBvc3NpYmlsaXRpZXMuIFdoaW5nZSBhbmQgbW92ZSBvbiAqLworCQkJbm9pc3lfcHJpbnRrKCZub2lzZSwgImpmZnMyX3NjYW5fZXJhc2VibG9jaygpOiBNYWdpYyBiaXRtYXNrIDB4JTA0eCBub3QgZm91bmQgYXQgMHglMDh4OiAweCUwNHggaW5zdGVhZFxuIiwgCisJCQkJICAgICBKRkZTMl9NQUdJQ19CSVRNQVNLLCBvZnMsIAorCQkJCSAgICAgamUxNl90b19jcHUobm9kZS0+bWFnaWMpKTsKKwkJCURJUlRZX1NQQUNFKDQpOworCQkJb2ZzICs9IDQ7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBXZSBzZWVtIHRvIGhhdmUgYSBub2RlIG9mIHNvcnRzLiBDaGVjayB0aGUgQ1JDICovCisJCWNyY25vZGUubWFnaWMgPSBub2RlLT5tYWdpYzsKKwkJY3Jjbm9kZS5ub2RldHlwZSA9IGNwdV90b19qZTE2KCBqZTE2X3RvX2NwdShub2RlLT5ub2RldHlwZSkgfCBKRkZTMl9OT0RFX0FDQ1VSQVRFKTsKKwkJY3Jjbm9kZS50b3RsZW4gPSBub2RlLT50b3RsZW47CisJCWhkcl9jcmMgPSBjcmMzMigwLCAmY3Jjbm9kZSwgc2l6ZW9mKGNyY25vZGUpLTQpOworCisJCWlmIChoZHJfY3JjICE9IGplMzJfdG9fY3B1KG5vZGUtPmhkcl9jcmMpKSB7CisJCQlub2lzeV9wcmludGsoJm5vaXNlLCAiamZmczJfc2Nhbl9lcmFzZWJsb2NrKCk6IE5vZGUgYXQgMHglMDh4IHsweCUwNHgsIDB4JTA0eCwgMHglMDh4KSBoYXMgaW52YWxpZCBDUkMgMHglMDh4IChjYWxjdWxhdGVkIDB4JTA4eClcbiIsCisJCQkJICAgICBvZnMsIGplMTZfdG9fY3B1KG5vZGUtPm1hZ2ljKSwKKwkJCQkgICAgIGplMTZfdG9fY3B1KG5vZGUtPm5vZGV0eXBlKSwgCisJCQkJICAgICBqZTMyX3RvX2NwdShub2RlLT50b3RsZW4pLAorCQkJCSAgICAgamUzMl90b19jcHUobm9kZS0+aGRyX2NyYyksCisJCQkJICAgICBoZHJfY3JjKTsKKwkJCURJUlRZX1NQQUNFKDQpOworCQkJb2ZzICs9IDQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChvZnMgKyBqZTMyX3RvX2NwdShub2RlLT50b3RsZW4pID4gCisJCSAgICBqZWItPm9mZnNldCArIGMtPnNlY3Rvcl9zaXplKSB7CisJCQkvKiBFZXAuIE5vZGUgZ29lcyBvdmVyIHRoZSBlbmQgb2YgdGhlIGVyYXNlIGJsb2NrLiAqLworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTm9kZSBhdCAweCUwOHggd2l0aCBsZW5ndGggMHglMDh4IHdvdWxkIHJ1biBvdmVyIHRoZSBlbmQgb2YgdGhlIGVyYXNlIGJsb2NrXG4iLAorCQkJICAgICAgIG9mcywgamUzMl90b19jcHUobm9kZS0+dG90bGVuKSk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJQZXJoYXBzIHRoZSBmaWxlIHN5c3RlbSB3YXMgY3JlYXRlZCB3aXRoIHRoZSB3cm9uZyBlcmFzZSBzaXplP1xuIik7CisJCQlESVJUWV9TUEFDRSg0KTsKKwkJCW9mcyArPSA0OworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIShqZTE2X3RvX2NwdShub2RlLT5ub2RldHlwZSkgJiBKRkZTMl9OT0RFX0FDQ1VSQVRFKSkgeworCQkJLyogV2hlZWUuIFRoaXMgaXMgYW4gb2Jzb2xldGVkIG5vZGUgKi8KKwkJCUQyKHByaW50ayhLRVJOX0RFQlVHICJOb2RlIGF0IDB4JTA4eCBpcyBvYnNvbGV0ZS4gU2tpcHBpbmdcbiIsIG9mcykpOworCQkJRElSVFlfU1BBQ0UoUEFEKGplMzJfdG9fY3B1KG5vZGUtPnRvdGxlbikpKTsKKwkJCW9mcyArPSBQQUQoamUzMl90b19jcHUobm9kZS0+dG90bGVuKSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXN3aXRjaChqZTE2X3RvX2NwdShub2RlLT5ub2RldHlwZSkpIHsKKwkJY2FzZSBKRkZTMl9OT0RFVFlQRV9JTk9ERToKKwkJCWlmIChidWZfb2ZzICsgYnVmX2xlbiA8IG9mcyArIHNpemVvZihzdHJ1Y3QgamZmczJfcmF3X2lub2RlKSkgeworCQkJCWJ1Zl9sZW4gPSBtaW5fdCh1aW50MzJfdCwgYnVmX3NpemUsIGplYi0+b2Zmc2V0ICsgYy0+c2VjdG9yX3NpemUgLSBvZnMpOworCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJGZXdlciB0aGFuICV6ZCBieXRlcyAoaW5vZGUgbm9kZSkgbGVmdCB0byBlbmQgb2YgYnVmLiBSZWFkaW5nIDB4JXggYXQgMHglMDh4XG4iLAorCQkJCQkgIHNpemVvZihzdHJ1Y3QgamZmczJfcmF3X2lub2RlKSwgYnVmX2xlbiwgb2ZzKSk7CisJCQkJZXJyID0gamZmczJfZmlsbF9zY2FuX2J1ZihjLCBidWYsIG9mcywgYnVmX2xlbik7CisJCQkJaWYgKGVycikKKwkJCQkJcmV0dXJuIGVycjsKKwkJCQlidWZfb2ZzID0gb2ZzOworCQkJCW5vZGUgPSAodm9pZCAqKWJ1ZjsKKwkJCX0KKwkJCWVyciA9IGpmZnMyX3NjYW5faW5vZGVfbm9kZShjLCBqZWIsICh2b2lkICopbm9kZSwgb2ZzKTsKKwkJCWlmIChlcnIpIHJldHVybiBlcnI7CisJCQlvZnMgKz0gUEFEKGplMzJfdG9fY3B1KG5vZGUtPnRvdGxlbikpOworCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBKRkZTMl9OT0RFVFlQRV9ESVJFTlQ6CisJCQlpZiAoYnVmX29mcyArIGJ1Zl9sZW4gPCBvZnMgKyBqZTMyX3RvX2NwdShub2RlLT50b3RsZW4pKSB7CisJCQkJYnVmX2xlbiA9IG1pbl90KHVpbnQzMl90LCBidWZfc2l6ZSwgamViLT5vZmZzZXQgKyBjLT5zZWN0b3Jfc2l6ZSAtIG9mcyk7CisJCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkZld2VyIHRoYW4gJWQgYnl0ZXMgKGRpcmVudCBub2RlKSBsZWZ0IHRvIGVuZCBvZiBidWYuIFJlYWRpbmcgMHgleCBhdCAweCUwOHhcbiIsCisJCQkJCSAgamUzMl90b19jcHUobm9kZS0+dG90bGVuKSwgYnVmX2xlbiwgb2ZzKSk7CisJCQkJZXJyID0gamZmczJfZmlsbF9zY2FuX2J1ZihjLCBidWYsIG9mcywgYnVmX2xlbik7CisJCQkJaWYgKGVycikKKwkJCQkJcmV0dXJuIGVycjsKKwkJCQlidWZfb2ZzID0gb2ZzOworCQkJCW5vZGUgPSAodm9pZCAqKWJ1ZjsKKwkJCX0KKwkJCWVyciA9IGpmZnMyX3NjYW5fZGlyZW50X25vZGUoYywgamViLCAodm9pZCAqKW5vZGUsIG9mcyk7CisJCQlpZiAoZXJyKSByZXR1cm4gZXJyOworCQkJb2ZzICs9IFBBRChqZTMyX3RvX2NwdShub2RlLT50b3RsZW4pKTsKKwkJCWJyZWFrOworCisJCWNhc2UgSkZGUzJfTk9ERVRZUEVfQ0xFQU5NQVJLRVI6CisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiQ0xFQU5NQVJLRVIgbm9kZSBmb3VuZCBhdCAweCUwOHhcbiIsIG9mcykpOworCQkJaWYgKGplMzJfdG9fY3B1KG5vZGUtPnRvdGxlbikgIT0gYy0+Y2xlYW5tYXJrZXJfc2l6ZSkgeworCQkJCXByaW50ayhLRVJOX05PVElDRSAiQ0xFQU5NQVJLRVIgbm9kZSBmb3VuZCBhdCAweCUwOHggaGFzIHRvdGxlbiAweCV4ICE9IG5vcm1hbCAweCV4XG4iLCAKKwkJCQkgICAgICAgb2ZzLCBqZTMyX3RvX2NwdShub2RlLT50b3RsZW4pLCBjLT5jbGVhbm1hcmtlcl9zaXplKTsKKwkJCQlESVJUWV9TUEFDRShQQUQoc2l6ZW9mKHN0cnVjdCBqZmZzMl91bmtub3duX25vZGUpKSk7CisJCQkJb2ZzICs9IFBBRChzaXplb2Yoc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSkpOworCQkJfSBlbHNlIGlmIChqZWItPmZpcnN0X25vZGUpIHsKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIkNMRUFOTUFSS0VSIG5vZGUgZm91bmQgYXQgMHglMDh4LCBub3QgZmlyc3Qgbm9kZSBpbiBibG9jayAoMHglMDh4KVxuIiwgb2ZzLCBqZWItPm9mZnNldCk7CisJCQkJRElSVFlfU1BBQ0UoUEFEKHNpemVvZihzdHJ1Y3QgamZmczJfdW5rbm93bl9ub2RlKSkpOworCQkJCW9mcyArPSBQQUQoc2l6ZW9mKHN0cnVjdCBqZmZzMl91bmtub3duX25vZGUpKTsKKwkJCX0gZWxzZSB7CisJCQkJc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqbWFya2VyX3JlZiA9IGpmZnMyX2FsbG9jX3Jhd19ub2RlX3JlZigpOworCQkJCWlmICghbWFya2VyX3JlZikgeworCQkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIkZhaWxlZCB0byBhbGxvY2F0ZSBub2RlIHJlZiBmb3IgY2xlYW4gbWFya2VyXG4iKTsKKwkJCQkJcmV0dXJuIC1FTk9NRU07CisJCQkJfQorCQkJCW1hcmtlcl9yZWYtPm5leHRfaW5faW5vID0gTlVMTDsKKwkJCQltYXJrZXJfcmVmLT5uZXh0X3BoeXMgPSBOVUxMOworCQkJCW1hcmtlcl9yZWYtPmZsYXNoX29mZnNldCA9IG9mcyB8IFJFRl9OT1JNQUw7CisJCQkJbWFya2VyX3JlZi0+X190b3RsZW4gPSBjLT5jbGVhbm1hcmtlcl9zaXplOworCQkJCWplYi0+Zmlyc3Rfbm9kZSA9IGplYi0+bGFzdF9ub2RlID0gbWFya2VyX3JlZjsKKwkJCSAgICAgCisJCQkJVVNFRF9TUEFDRShQQUQoYy0+Y2xlYW5tYXJrZXJfc2l6ZSkpOworCQkJCW9mcyArPSBQQUQoYy0+Y2xlYW5tYXJrZXJfc2l6ZSk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIEpGRlMyX05PREVUWVBFX1BBRERJTkc6CisJCQlESVJUWV9TUEFDRShQQUQoamUzMl90b19jcHUobm9kZS0+dG90bGVuKSkpOworCQkJb2ZzICs9IFBBRChqZTMyX3RvX2NwdShub2RlLT50b3RsZW4pKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlzd2l0Y2ggKGplMTZfdG9fY3B1KG5vZGUtPm5vZGV0eXBlKSAmIEpGRlMyX0NPTVBBVF9NQVNLKSB7CisJCQljYXNlIEpGRlMyX0ZFQVRVUkVfUk9DT01QQVQ6CisJCQkJcHJpbnRrKEtFUk5fTk9USUNFICJSZWFkLW9ubHkgY29tcGF0aWJsZSBmZWF0dXJlIG5vZGUgKDB4JTA0eCkgZm91bmQgYXQgb2Zmc2V0IDB4JTA4eFxuIiwgamUxNl90b19jcHUobm9kZS0+bm9kZXR5cGUpLCBvZnMpOworCQkJICAgICAgICBjLT5mbGFncyB8PSBKRkZTMl9TQl9GTEFHX1JPOworCQkJCWlmICghKGpmZnMyX2lzX3JlYWRvbmx5KGMpKSkKKwkJCQkJcmV0dXJuIC1FUk9GUzsKKwkJCQlESVJUWV9TUEFDRShQQUQoamUzMl90b19jcHUobm9kZS0+dG90bGVuKSkpOworCQkJCW9mcyArPSBQQUQoamUzMl90b19jcHUobm9kZS0+dG90bGVuKSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSkZGUzJfRkVBVFVSRV9JTkNPTVBBVDoKKwkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIkluY29tcGF0aWJsZSBmZWF0dXJlIG5vZGUgKDB4JTA0eCkgZm91bmQgYXQgb2Zmc2V0IDB4JTA4eFxuIiwgamUxNl90b19jcHUobm9kZS0+bm9kZXR5cGUpLCBvZnMpOworCQkJCXJldHVybiAtRUlOVkFMOworCisJCQljYXNlIEpGRlMyX0ZFQVRVUkVfUldDT01QQVRfREVMRVRFOgorCQkJCUQxKHByaW50ayhLRVJOX05PVElDRSAiVW5rbm93biBidXQgY29tcGF0aWJsZSBmZWF0dXJlIG5vZGUgKDB4JTA0eCkgZm91bmQgYXQgb2Zmc2V0IDB4JTA4eFxuIiwgamUxNl90b19jcHUobm9kZS0+bm9kZXR5cGUpLCBvZnMpKTsKKwkJCQlESVJUWV9TUEFDRShQQUQoamUzMl90b19jcHUobm9kZS0+dG90bGVuKSkpOworCQkJCW9mcyArPSBQQUQoamUzMl90b19jcHUobm9kZS0+dG90bGVuKSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSkZGUzJfRkVBVFVSRV9SV0NPTVBBVF9DT1BZOgorCQkJCUQxKHByaW50ayhLRVJOX05PVElDRSAiVW5rbm93biBidXQgY29tcGF0aWJsZSBmZWF0dXJlIG5vZGUgKDB4JTA0eCkgZm91bmQgYXQgb2Zmc2V0IDB4JTA4eFxuIiwgamUxNl90b19jcHUobm9kZS0+bm9kZXR5cGUpLCBvZnMpKTsKKwkJCQlVU0VEX1NQQUNFKFBBRChqZTMyX3RvX2NwdShub2RlLT50b3RsZW4pKSk7CisJCQkJb2ZzICs9IFBBRChqZTMyX3RvX2NwdShub2RlLT50b3RsZW4pKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCisJRDEocHJpbnRrKEtFUk5fREVCVUcgIkJsb2NrIGF0IDB4JTA4eDogZnJlZSAweCUwOHgsIGRpcnR5IDB4JTA4eCwgdW5jaGVja2VkIDB4JTA4eCwgdXNlZCAweCUwOHhcbiIsIGplYi0+b2Zmc2V0LCAKKwkJICBqZWItPmZyZWVfc2l6ZSwgamViLT5kaXJ0eV9zaXplLCBqZWItPnVuY2hlY2tlZF9zaXplLCBqZWItPnVzZWRfc2l6ZSkpOworCisJLyogbWFya19ub2RlX29ic29sZXRlIGNhbiBhZGQgdG8gd2FzdGVkICEhICovCisJaWYgKGplYi0+d2FzdGVkX3NpemUpIHsKKwkJamViLT5kaXJ0eV9zaXplICs9IGplYi0+d2FzdGVkX3NpemU7CisJCWMtPmRpcnR5X3NpemUgKz0gamViLT53YXN0ZWRfc2l6ZTsKKwkJYy0+d2FzdGVkX3NpemUgLT0gamViLT53YXN0ZWRfc2l6ZTsKKwkJamViLT53YXN0ZWRfc2l6ZSA9IDA7CisJfQorCisJaWYgKChqZWItPnVzZWRfc2l6ZSArIGplYi0+dW5jaGVja2VkX3NpemUpID09IFBBRChjLT5jbGVhbm1hcmtlcl9zaXplKSAmJiAhamViLT5kaXJ0eV9zaXplIAorCQkmJiAoIWplYi0+Zmlyc3Rfbm9kZSB8fCAhamViLT5maXJzdF9ub2RlLT5uZXh0X2luX2lubykgKQorCQlyZXR1cm4gQkxLX1NUQVRFX0NMRUFOTUFSS0VSOworCQkKKwkvKiBtb3ZlIGJsb2NrcyB3aXRoIG1heCA0IGJ5dGUgZGlydHkgc3BhY2UgdG8gY2xlYW5saXN0ICovCQorCWVsc2UgaWYgKCFJU0RJUlRZKGMtPnNlY3Rvcl9zaXplIC0gKGplYi0+dXNlZF9zaXplICsgamViLT51bmNoZWNrZWRfc2l6ZSkpKSB7CisJCWMtPmRpcnR5X3NpemUgLT0gamViLT5kaXJ0eV9zaXplOworCQljLT53YXN0ZWRfc2l6ZSArPSBqZWItPmRpcnR5X3NpemU7IAorCQlqZWItPndhc3RlZF9zaXplICs9IGplYi0+ZGlydHlfc2l6ZTsKKwkJamViLT5kaXJ0eV9zaXplID0gMDsKKwkJcmV0dXJuIEJMS19TVEFURV9DTEVBTjsKKwl9IGVsc2UgaWYgKGplYi0+dXNlZF9zaXplIHx8IGplYi0+dW5jaGVja2VkX3NpemUpCisJCXJldHVybiBCTEtfU1RBVEVfUEFSVERJUlRZOworCWVsc2UKKwkJcmV0dXJuIEJMS19TVEFURV9BTExESVJUWTsKK30KKworc3RhdGljIHN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqamZmczJfc2Nhbl9tYWtlX2lub19jYWNoZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgdWludDMyX3QgaW5vKQoreworCXN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqaWM7CisKKwlpYyA9IGpmZnMyX2dldF9pbm9fY2FjaGUoYywgaW5vKTsKKwlpZiAoaWMpCisJCXJldHVybiBpYzsKKworCWlmIChpbm8gPiBjLT5oaWdoZXN0X2lubykKKwkJYy0+aGlnaGVzdF9pbm8gPSBpbm87CisKKwlpYyA9IGpmZnMyX2FsbG9jX2lub2RlX2NhY2hlKCk7CisJaWYgKCFpYykgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgImpmZnMyX3NjYW5fbWFrZV9pbm9kZV9jYWNoZSgpOiBhbGxvY2F0aW9uIG9mIGlub2RlIGNhY2hlIGZhaWxlZFxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwltZW1zZXQoaWMsIDAsIHNpemVvZigqaWMpKTsKKworCWljLT5pbm8gPSBpbm87CisJaWMtPm5vZGVzID0gKHZvaWQgKilpYzsKKwlqZmZzMl9hZGRfaW5vX2NhY2hlKGMsIGljKTsKKwlpZiAoaW5vID09IDEpCisJCWljLT5ubGluayA9IDE7CisJcmV0dXJuIGljOworfQorCitzdGF0aWMgaW50IGpmZnMyX3NjYW5faW5vZGVfbm9kZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiwgCisJCQkJIHN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKnJpLCB1aW50MzJfdCBvZnMpCit7CisJc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqcmF3OworCXN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqaWM7CisJdWludDMyX3QgaW5vID0gamUzMl90b19jcHUocmktPmlubyk7CisKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfc2Nhbl9pbm9kZV9ub2RlKCk6IE5vZGUgYXQgMHglMDh4XG4iLCBvZnMpKTsKKworCS8qIFdlIGRvIHZlcnkgbGl0dGxlIGhlcmUgbm93LiBKdXN0IGNoZWNrIHRoZSBpbm8jIHRvIHdoaWNoIHdlIHNob3VsZCBhdHRyaWJ1dGUKKwkgICB0aGlzIG5vZGU7IHdlIGNhbiBkbyBhbGwgdGhlIENSQyBjaGVja2luZyBldGMuIGxhdGVyLiBUaGVyZSdzIGEgdHJhZGVvZmYgaGVyZSAtLSAKKwkgICB3ZSB1c2VkIHRvIHNjYW4gdGhlIGZsYXNoIG9uY2Ugb25seSwgcmVhZGluZyBldmVyeXRoaW5nIHdlIHdhbnQgZnJvbSBpdCBpbnRvCisJICAgbWVtb3J5LCB0aGVuIGJ1aWxkaW5nIGFsbCBvdXIgaW4tY29yZSBkYXRhIHN0cnVjdHVyZXMgYW5kIGZyZWVpbmcgdGhlIGV4dHJhCisJICAgaW5mb3JtYXRpb24uIE5vdyB3ZSBhbGxvdyB0aGUgZmlyc3QgcGFydCBvZiB0aGUgbW91bnQgdG8gY29tcGxldGUgYSBsb3QgcXVpY2tlciwKKwkgICBidXQgd2UgaGF2ZSB0byBnbyBfYmFja18gdG8gdGhlIGZsYXNoIGluIG9yZGVyIHRvIGZpbmlzaCB0aGUgQ1JDIGNoZWNraW5nLCBldGMuIAorCSAgIFdoaWNoIG1lYW5zIHRoYXQgdGhlIF9mdWxsXyBhbW91bnQgb2YgdGltZSB0byBnZXQgdG8gcHJvcGVyIHdyaXRlIG1vZGUgd2l0aCBHQworCSAgIG9wZXJhdGlvbmFsIG1heSBhY3R1YWxseSBiZSBfbG9uZ2VyXyB0aGFuIGJlZm9yZS4gU3Vja3MgdG8gYmUgbWUuICovCisKKwlyYXcgPSBqZmZzMl9hbGxvY19yYXdfbm9kZV9yZWYoKTsKKwlpZiAoIXJhdykgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgImpmZnMyX3NjYW5faW5vZGVfbm9kZSgpOiBhbGxvY2F0aW9uIG9mIG5vZGUgcmVmZXJlbmNlIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWljID0gamZmczJfZ2V0X2lub19jYWNoZShjLCBpbm8pOworCWlmICghaWMpIHsKKwkJLyogSW5vY2FjaGUgZ2V0IGZhaWxlZC4gRWl0aGVyIHdlIHJlYWQgYSBib2d1cyBpbm8jIG9yIGl0J3MganVzdCBnZW51aW5lbHkgdGhlCisJCSAgIGZpcnN0IG5vZGUgd2UgZm91bmQgZm9yIHRoaXMgaW5vZGUuIERvIGEgQ1JDIGNoZWNrIHRvIHByb3RlY3QgYWdhaW5zdCB0aGUgZm9ybWVyCisJCSAgIGNhc2UgKi8KKwkJdWludDMyX3QgY3JjID0gY3JjMzIoMCwgcmksIHNpemVvZigqcmkpLTgpOworCisJCWlmIChjcmMgIT0gamUzMl90b19jcHUocmktPm5vZGVfY3JjKSkgeworCQkJcHJpbnRrKEtFUk5fTk9USUNFICJqZmZzMl9zY2FuX2lub2RlX25vZGUoKTogQ1JDIGZhaWxlZCBvbiBub2RlIGF0IDB4JTA4eDogUmVhZCAweCUwOHgsIGNhbGN1bGF0ZWQgMHglMDh4XG4iLAorCQkJICAgICAgIG9mcywgamUzMl90b19jcHUocmktPm5vZGVfY3JjKSwgY3JjKTsKKwkJCS8qIFdlIGJlbGlldmUgdG90bGVuIGJlY2F1c2UgdGhlIENSQyBvbiB0aGUgbm9kZSBfaGVhZGVyXyB3YXMgT0ssIGp1c3QgdGhlIG5vZGUgaXRzZWxmIGZhaWxlZC4gKi8KKwkJCURJUlRZX1NQQUNFKFBBRChqZTMyX3RvX2NwdShyaS0+dG90bGVuKSkpOworCQkJamZmczJfZnJlZV9yYXdfbm9kZV9yZWYocmF3KTsKKwkJCXJldHVybiAwOworCQl9CisJCWljID0gamZmczJfc2Nhbl9tYWtlX2lub19jYWNoZShjLCBpbm8pOworCQlpZiAoIWljKSB7CisJCQlqZmZzMl9mcmVlX3Jhd19ub2RlX3JlZihyYXcpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisKKwkvKiBXaGVlZS4gSXQgd29ya2VkICovCisKKwlyYXctPmZsYXNoX29mZnNldCA9IG9mcyB8IFJFRl9VTkNIRUNLRUQ7CisJcmF3LT5fX3RvdGxlbiA9IFBBRChqZTMyX3RvX2NwdShyaS0+dG90bGVuKSk7CisJcmF3LT5uZXh0X3BoeXMgPSBOVUxMOworCXJhdy0+bmV4dF9pbl9pbm8gPSBpYy0+bm9kZXM7CisKKwlpYy0+bm9kZXMgPSByYXc7CisJaWYgKCFqZWItPmZpcnN0X25vZGUpCisJCWplYi0+Zmlyc3Rfbm9kZSA9IHJhdzsKKwlpZiAoamViLT5sYXN0X25vZGUpCisJCWplYi0+bGFzdF9ub2RlLT5uZXh0X3BoeXMgPSByYXc7CisJamViLT5sYXN0X25vZGUgPSByYXc7CisKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiTm9kZSBpcyBpbm8gIyV1LCB2ZXJzaW9uICVkLiBSYW5nZSAweCV4LTB4JXhcbiIsIAorCQkgIGplMzJfdG9fY3B1KHJpLT5pbm8pLCBqZTMyX3RvX2NwdShyaS0+dmVyc2lvbiksCisJCSAgamUzMl90b19jcHUocmktPm9mZnNldCksCisJCSAgamUzMl90b19jcHUocmktPm9mZnNldCkramUzMl90b19jcHUocmktPmRzaXplKSkpOworCisJcHNldWRvX3JhbmRvbSArPSBqZTMyX3RvX2NwdShyaS0+dmVyc2lvbik7CisKKwlVTkNIRUNLRURfU1BBQ0UoUEFEKGplMzJfdG9fY3B1KHJpLT50b3RsZW4pKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgamZmczJfc2Nhbl9kaXJlbnRfbm9kZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiwgCisJCQkJICBzdHJ1Y3QgamZmczJfcmF3X2RpcmVudCAqcmQsIHVpbnQzMl90IG9mcykKK3sKKwlzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICpyYXc7CisJc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICpmZDsKKwlzdHJ1Y3QgamZmczJfaW5vZGVfY2FjaGUgKmljOworCXVpbnQzMl90IGNyYzsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9zY2FuX2RpcmVudF9ub2RlKCk6IE5vZGUgYXQgMHglMDh4XG4iLCBvZnMpKTsKKworCS8qIFdlIGRvbid0IGdldCBoZXJlIHVubGVzcyB0aGUgbm9kZSBpcyBzdGlsbCB2YWxpZCwgc28gd2UgZG9uJ3QgaGF2ZSB0bworCSAgIG1hc2sgaW4gdGhlIEFDQ1VSQVRFIGJpdCBhbnkgbW9yZS4gKi8KKwljcmMgPSBjcmMzMigwLCByZCwgc2l6ZW9mKCpyZCktOCk7CisKKwlpZiAoY3JjICE9IGplMzJfdG9fY3B1KHJkLT5ub2RlX2NyYykpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJqZmZzMl9zY2FuX2RpcmVudF9ub2RlKCk6IE5vZGUgQ1JDIGZhaWxlZCBvbiBub2RlIGF0IDB4JTA4eDogUmVhZCAweCUwOHgsIGNhbGN1bGF0ZWQgMHglMDh4XG4iLAorCQkgICAgICAgb2ZzLCBqZTMyX3RvX2NwdShyZC0+bm9kZV9jcmMpLCBjcmMpOworCQkvKiBXZSBiZWxpZXZlIHRvdGxlbiBiZWNhdXNlIHRoZSBDUkMgb24gdGhlIG5vZGUgX2hlYWRlcl8gd2FzIE9LLCBqdXN0IHRoZSBub2RlIGl0c2VsZiBmYWlsZWQuICovCisJCURJUlRZX1NQQUNFKFBBRChqZTMyX3RvX2NwdShyZC0+dG90bGVuKSkpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwc2V1ZG9fcmFuZG9tICs9IGplMzJfdG9fY3B1KHJkLT52ZXJzaW9uKTsKKworCWZkID0gamZmczJfYWxsb2NfZnVsbF9kaXJlbnQocmQtPm5zaXplKzEpOworCWlmICghZmQpIHsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbWNweSgmZmQtPm5hbWUsIHJkLT5uYW1lLCByZC0+bnNpemUpOworCWZkLT5uYW1lW3JkLT5uc2l6ZV0gPSAwOworCisJY3JjID0gY3JjMzIoMCwgZmQtPm5hbWUsIHJkLT5uc2l6ZSk7CisJaWYgKGNyYyAhPSBqZTMyX3RvX2NwdShyZC0+bmFtZV9jcmMpKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiamZmczJfc2Nhbl9kaXJlbnRfbm9kZSgpOiBOYW1lIENSQyBmYWlsZWQgb24gbm9kZSBhdCAweCUwOHg6IFJlYWQgMHglMDh4LCBjYWxjdWxhdGVkIDB4JTA4eFxuIiwKKwkJICAgICAgIG9mcywgamUzMl90b19jcHUocmQtPm5hbWVfY3JjKSwgY3JjKTsJCisJCUQxKHByaW50ayhLRVJOX05PVElDRSAiTmFtZSBmb3Igd2hpY2ggQ1JDIGZhaWxlZCBpcyAobm93KSAnJXMnLCBpbm8gIyVkXG4iLCBmZC0+bmFtZSwgamUzMl90b19jcHUocmQtPmlubykpKTsKKwkJamZmczJfZnJlZV9mdWxsX2RpcmVudChmZCk7CisJCS8qIEZJWE1FOiBXaHkgZG8gd2UgYmVsaWV2ZSB0b3RsZW4/ICovCisJCS8qIFdlIGJlbGlldmUgdG90bGVuIGJlY2F1c2UgdGhlIENSQyBvbiB0aGUgbm9kZSBfaGVhZGVyXyB3YXMgT0ssIGp1c3QgdGhlIG5hbWUgZmFpbGVkLiAqLworCQlESVJUWV9TUEFDRShQQUQoamUzMl90b19jcHUocmQtPnRvdGxlbikpKTsKKwkJcmV0dXJuIDA7CisJfQorCXJhdyA9IGpmZnMyX2FsbG9jX3Jhd19ub2RlX3JlZigpOworCWlmICghcmF3KSB7CisJCWpmZnMyX2ZyZWVfZnVsbF9kaXJlbnQoZmQpOworCQlwcmludGsoS0VSTl9OT1RJQ0UgImpmZnMyX3NjYW5fZGlyZW50X25vZGUoKTogYWxsb2NhdGlvbiBvZiBub2RlIHJlZmVyZW5jZSBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaWMgPSBqZmZzMl9zY2FuX21ha2VfaW5vX2NhY2hlKGMsIGplMzJfdG9fY3B1KHJkLT5waW5vKSk7CisJaWYgKCFpYykgeworCQlqZmZzMl9mcmVlX2Z1bGxfZGlyZW50KGZkKTsKKwkJamZmczJfZnJlZV9yYXdfbm9kZV9yZWYocmF3KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCQorCXJhdy0+X190b3RsZW4gPSBQQUQoamUzMl90b19jcHUocmQtPnRvdGxlbikpOworCXJhdy0+Zmxhc2hfb2Zmc2V0ID0gb2ZzIHwgUkVGX1BSSVNUSU5FOworCXJhdy0+bmV4dF9waHlzID0gTlVMTDsKKwlyYXctPm5leHRfaW5faW5vID0gaWMtPm5vZGVzOworCWljLT5ub2RlcyA9IHJhdzsKKwlpZiAoIWplYi0+Zmlyc3Rfbm9kZSkKKwkJamViLT5maXJzdF9ub2RlID0gcmF3OworCWlmIChqZWItPmxhc3Rfbm9kZSkKKwkJamViLT5sYXN0X25vZGUtPm5leHRfcGh5cyA9IHJhdzsKKwlqZWItPmxhc3Rfbm9kZSA9IHJhdzsKKworCWZkLT5yYXcgPSByYXc7CisJZmQtPm5leHQgPSBOVUxMOworCWZkLT52ZXJzaW9uID0gamUzMl90b19jcHUocmQtPnZlcnNpb24pOworCWZkLT5pbm8gPSBqZTMyX3RvX2NwdShyZC0+aW5vKTsKKwlmZC0+bmhhc2ggPSBmdWxsX25hbWVfaGFzaChmZC0+bmFtZSwgcmQtPm5zaXplKTsKKwlmZC0+dHlwZSA9IHJkLT50eXBlOworCVVTRURfU1BBQ0UoUEFEKGplMzJfdG9fY3B1KHJkLT50b3RsZW4pKSk7CisJamZmczJfYWRkX2ZkX3RvX2xpc3QoYywgZmQsICZpYy0+c2Nhbl9kZW50cyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb3VudF9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmwpCit7CisJdWludDMyX3QgY291bnQgPSAwOworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKKworCWxpc3RfZm9yX2VhY2godG1wLCBsKSB7CisJCWNvdW50Kys7CisJfQorCXJldHVybiBjb3VudDsKK30KKworLyogTm90ZTogVGhpcyBicmVha3MgaWYgbGlzdF9lbXB0eShoZWFkKS4gSSBkb24ndCBjYXJlLiBZb3UKKyAgIG1pZ2h0LCBpZiB5b3UgY29weSB0aGlzIGNvZGUgYW5kIHVzZSBpdCBlbHNld2hlcmUgOikgKi8KK3N0YXRpYyB2b2lkIHJvdGF0ZV9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHVpbnQzMl90IGNvdW50KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKm4gPSBoZWFkLT5uZXh0OworCisJbGlzdF9kZWwoaGVhZCk7CisJd2hpbGUoY291bnQtLSkgeworCQluID0gbi0+bmV4dDsKKwl9CisJbGlzdF9hZGQoaGVhZCwgbik7Cit9CisKK3ZvaWQgamZmczJfcm90YXRlX2xpc3RzKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKQoreworCXVpbnQzMl90IHg7CisJdWludDMyX3Qgcm90YXRlYnk7CisKKwl4ID0gY291bnRfbGlzdCgmYy0+Y2xlYW5fbGlzdCk7CisJaWYgKHgpIHsKKwkJcm90YXRlYnkgPSBwc2V1ZG9fcmFuZG9tICUgeDsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIlJvdGF0aW5nIGNsZWFuX2xpc3QgYnkgJWRcbiIsIHJvdGF0ZWJ5KSk7CisKKwkJcm90YXRlX2xpc3QoKCZjLT5jbGVhbl9saXN0KSwgcm90YXRlYnkpOworCisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJFcmFzZSBibG9jayBhdCBmcm9udCBvZiBjbGVhbl9saXN0IGlzIGF0ICUwOHhcbiIsCisJCQkgIGxpc3RfZW50cnkoYy0+Y2xlYW5fbGlzdC5uZXh0LCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jaywgbGlzdCktPm9mZnNldCkpOworCX0gZWxzZSB7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJOb3Qgcm90YXRpbmcgZW1wdHkgY2xlYW5fbGlzdFxuIikpOworCX0KKworCXggPSBjb3VudF9saXN0KCZjLT52ZXJ5X2RpcnR5X2xpc3QpOworCWlmICh4KSB7CisJCXJvdGF0ZWJ5ID0gcHNldWRvX3JhbmRvbSAlIHg7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJSb3RhdGluZyB2ZXJ5X2RpcnR5X2xpc3QgYnkgJWRcbiIsIHJvdGF0ZWJ5KSk7CisKKwkJcm90YXRlX2xpc3QoKCZjLT52ZXJ5X2RpcnR5X2xpc3QpLCByb3RhdGVieSk7CisKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkVyYXNlIGJsb2NrIGF0IGZyb250IG9mIHZlcnlfZGlydHlfbGlzdCBpcyBhdCAlMDh4XG4iLAorCQkJICBsaXN0X2VudHJ5KGMtPnZlcnlfZGlydHlfbGlzdC5uZXh0LCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jaywgbGlzdCktPm9mZnNldCkpOworCX0gZWxzZSB7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJOb3Qgcm90YXRpbmcgZW1wdHkgdmVyeV9kaXJ0eV9saXN0XG4iKSk7CisJfQorCisJeCA9IGNvdW50X2xpc3QoJmMtPmRpcnR5X2xpc3QpOworCWlmICh4KSB7CisJCXJvdGF0ZWJ5ID0gcHNldWRvX3JhbmRvbSAlIHg7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJSb3RhdGluZyBkaXJ0eV9saXN0IGJ5ICVkXG4iLCByb3RhdGVieSkpOworCisJCXJvdGF0ZV9saXN0KCgmYy0+ZGlydHlfbGlzdCksIHJvdGF0ZWJ5KTsKKworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRXJhc2UgYmxvY2sgYXQgZnJvbnQgb2YgZGlydHlfbGlzdCBpcyBhdCAlMDh4XG4iLAorCQkJICBsaXN0X2VudHJ5KGMtPmRpcnR5X2xpc3QubmV4dCwgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2ssIGxpc3QpLT5vZmZzZXQpKTsKKwl9IGVsc2UgeworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiTm90IHJvdGF0aW5nIGVtcHR5IGRpcnR5X2xpc3RcbiIpKTsKKwl9CisKKwl4ID0gY291bnRfbGlzdCgmYy0+ZXJhc2FibGVfbGlzdCk7CisJaWYgKHgpIHsKKwkJcm90YXRlYnkgPSBwc2V1ZG9fcmFuZG9tICUgeDsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIlJvdGF0aW5nIGVyYXNhYmxlX2xpc3QgYnkgJWRcbiIsIHJvdGF0ZWJ5KSk7CisKKwkJcm90YXRlX2xpc3QoKCZjLT5lcmFzYWJsZV9saXN0KSwgcm90YXRlYnkpOworCisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJFcmFzZSBibG9jayBhdCBmcm9udCBvZiBlcmFzYWJsZV9saXN0IGlzIGF0ICUwOHhcbiIsCisJCQkgIGxpc3RfZW50cnkoYy0+ZXJhc2FibGVfbGlzdC5uZXh0LCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jaywgbGlzdCktPm9mZnNldCkpOworCX0gZWxzZSB7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJOb3Qgcm90YXRpbmcgZW1wdHkgZXJhc2FibGVfbGlzdFxuIikpOworCX0KKworCWlmIChjLT5ucl9lcmFzaW5nX2Jsb2NrcykgeworCQlyb3RhdGVieSA9IHBzZXVkb19yYW5kb20gJSBjLT5ucl9lcmFzaW5nX2Jsb2NrczsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIlJvdGF0aW5nIGVyYXNlX3BlbmRpbmdfbGlzdCBieSAlZFxuIiwgcm90YXRlYnkpKTsKKworCQlyb3RhdGVfbGlzdCgoJmMtPmVyYXNlX3BlbmRpbmdfbGlzdCksIHJvdGF0ZWJ5KTsKKworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRXJhc2UgYmxvY2sgYXQgZnJvbnQgb2YgZXJhc2VfcGVuZGluZ19saXN0IGlzIGF0ICUwOHhcbiIsCisJCQkgIGxpc3RfZW50cnkoYy0+ZXJhc2VfcGVuZGluZ19saXN0Lm5leHQsIHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrLCBsaXN0KS0+b2Zmc2V0KSk7CisJfSBlbHNlIHsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIk5vdCByb3RhdGluZyBlbXB0eSBlcmFzZV9wZW5kaW5nX2xpc3RcbiIpKTsKKwl9CisKKwlpZiAoYy0+bnJfZnJlZV9ibG9ja3MpIHsKKwkJcm90YXRlYnkgPSBwc2V1ZG9fcmFuZG9tICUgYy0+bnJfZnJlZV9ibG9ja3M7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJSb3RhdGluZyBmcmVlX2xpc3QgYnkgJWRcbiIsIHJvdGF0ZWJ5KSk7CisKKwkJcm90YXRlX2xpc3QoKCZjLT5mcmVlX2xpc3QpLCByb3RhdGVieSk7CisKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkVyYXNlIGJsb2NrIGF0IGZyb250IG9mIGZyZWVfbGlzdCBpcyBhdCAlMDh4XG4iLAorCQkJICBsaXN0X2VudHJ5KGMtPmZyZWVfbGlzdC5uZXh0LCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jaywgbGlzdCktPm9mZnNldCkpOworCX0gZWxzZSB7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJOb3Qgcm90YXRpbmcgZW1wdHkgZnJlZV9saXN0XG4iKSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZnMvamZmczIvc3VwZXIuYyBiL2ZzL2pmZnMyL3N1cGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIyYTQ0MQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMyL3N1cGVyLmMKQEAgLTAsMCArMSwzNjUgQEAKKy8qCisgKiBKRkZTMiAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgVmVyc2lvbiAyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIFJlZCBIYXQsIEluYy4KKyAqCisgKiBDcmVhdGVkIGJ5IERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4KKyAqCisgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgorICoKKyAqICRJZDogc3VwZXIuYyx2IDEuMTA0IDIwMDQvMTEvMjMgMTU6Mzc6MzEgZ2xlaXhuZXIgRXhwICQKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9qZmZzMi5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tdGQvbXRkLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgImNvbXByLmgiCisjaW5jbHVkZSAibm9kZWxpc3QuaCIKKworc3RhdGljIHZvaWQgamZmczJfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKKworc3RhdGljIGttZW1fY2FjaGVfdCAqamZmczJfaW5vZGVfY2FjaGVwOworCitzdGF0aWMgc3RydWN0IGlub2RlICpqZmZzMl9hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICplaTsKKwllaSA9IChzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqKWttZW1fY2FjaGVfYWxsb2MoamZmczJfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJaWYgKCFlaSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuICZlaS0+dmZzX2lub2RlOworfQorCitzdGF0aWMgdm9pZCBqZmZzMl9kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJa21lbV9jYWNoZV9mcmVlKGpmZnMyX2lub2RlX2NhY2hlcCwgSkZGUzJfSU5PREVfSU5GTyhpbm9kZSkpOworfQorCitzdGF0aWMgdm9pZCBqZmZzMl9pX2luaXRfb25jZSh2b2lkICogZm9vLCBrbWVtX2NhY2hlX3QgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmVpID0gKHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICopIGZvbzsKKworCWlmICgoZmxhZ3MgJiAoU0xBQl9DVE9SX1ZFUklGWXxTTEFCX0NUT1JfQ09OU1RSVUNUT1IpKSA9PQorCSAgICBTTEFCX0NUT1JfQ09OU1RSVUNUT1IpIHsKKwkJaW5pdF9NVVRFWF9MT0NLRUQoJmVpLT5zZW0pOworCQlpbm9kZV9pbml0X29uY2UoJmVpLT52ZnNfaW5vZGUpOworCX0KK30KKworc3RhdGljIGludCBqZmZzMl9zeW5jX2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB3YWl0KQoreworCXN0cnVjdCBqZmZzMl9zYl9pbmZvICpjID0gSkZGUzJfU0JfSU5GTyhzYik7CisKKwlkb3duKCZjLT5hbGxvY19zZW0pOworCWpmZnMyX2ZsdXNoX3didWZfcGFkKGMpOworCXVwKCZjLT5hbGxvY19zZW0pOwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGpmZnMyX3N1cGVyX29wZXJhdGlvbnMgPQoreworCS5hbGxvY19pbm9kZSA9CWpmZnMyX2FsbG9jX2lub2RlLAorCS5kZXN0cm95X2lub2RlID1qZmZzMl9kZXN0cm95X2lub2RlLAorCS5yZWFkX2lub2RlID0JamZmczJfcmVhZF9pbm9kZSwKKwkucHV0X3N1cGVyID0JamZmczJfcHV0X3N1cGVyLAorCS53cml0ZV9zdXBlciA9CWpmZnMyX3dyaXRlX3N1cGVyLAorCS5zdGF0ZnMgPQlqZmZzMl9zdGF0ZnMsCisJLnJlbW91bnRfZnMgPQlqZmZzMl9yZW1vdW50X2ZzLAorCS5jbGVhcl9pbm9kZSA9CWpmZnMyX2NsZWFyX2lub2RlLAorCS5kaXJ0eV9pbm9kZSA9CWpmZnMyX2RpcnR5X2lub2RlLAorCS5zeW5jX2ZzID0JamZmczJfc3luY19mcywKK307CisKK3N0YXRpYyBpbnQgamZmczJfc2JfY29tcGFyZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBqZmZzMl9zYl9pbmZvICpwID0gZGF0YTsKKwlzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyA9IEpGRlMyX1NCX0lORk8oc2IpOworCisJLyogVGhlIHN1cGVyYmxvY2tzIGFyZSBjb25zaWRlcmVkIHRvIGJlIGVxdWl2YWxlbnQgaWYgdGhlIHVuZGVybHlpbmcgTVRECisJICAgZGV2aWNlIGlzIHRoZSBzYW1lIG9uZSAqLworCWlmIChjLT5tdGQgPT0gcC0+bXRkKSB7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9zYl9jb21wYXJlOiBtYXRjaCBvbiBkZXZpY2UgJWQgKFwiJXNcIilcbiIsIHAtPm10ZC0+aW5kZXgsIHAtPm10ZC0+bmFtZSkpOworCQlyZXR1cm4gMTsKKwl9IGVsc2UgeworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfc2JfY29tcGFyZTogTm8gbWF0Y2gsIGRldmljZSAlZCAoXCIlc1wiKSwgZGV2aWNlICVkIChcIiVzXCIpXG4iLAorCQkJICBjLT5tdGQtPmluZGV4LCBjLT5tdGQtPm5hbWUsIHAtPm10ZC0+aW5kZXgsIHAtPm10ZC0+bmFtZSkpOworCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgamZmczJfc2Jfc2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGpmZnMyX3NiX2luZm8gKnAgPSBkYXRhOworCisJLyogRm9yIHBlcnNpc3RlbmNlIG9mIE5GUyBleHBvcnRzIGV0Yy4gd2UgdXNlIHRoZSBzYW1lIHNfZGV2CisJICAgZWFjaCB0aW1lIHdlIG1vdW50IHRoZSBkZXZpY2UsIGRvbid0IGp1c3QgdXNlIGFuIGFub255bW91cworCSAgIGRldmljZSAqLworCXNiLT5zX2ZzX2luZm8gPSBwOworCXAtPm9zX3ByaXYgPSBzYjsKKwlzYi0+c19kZXYgPSBNS0RFVihNVERfQkxPQ0tfTUFKT1IsIHAtPm10ZC0+aW5kZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmpmZnMyX2dldF9zYl9tdGQoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCQkJCSAgICAgIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIAorCQkJCQkgICAgICB2b2lkICpkYXRhLCBzdHJ1Y3QgbXRkX2luZm8gKm10ZCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXN0cnVjdCBqZmZzMl9zYl9pbmZvICpjOworCWludCByZXQ7CisKKwljID0ga21hbGxvYyhzaXplb2YoKmMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWMpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCW1lbXNldChjLCAwLCBzaXplb2YoKmMpKTsKKwljLT5tdGQgPSBtdGQ7CisKKwlzYiA9IHNnZXQoZnNfdHlwZSwgamZmczJfc2JfY29tcGFyZSwgamZmczJfc2Jfc2V0LCBjKTsKKworCWlmIChJU19FUlIoc2IpKQorCQlnb3RvIG91dF9wdXQ7CisKKwlpZiAoc2ItPnNfcm9vdCkgeworCQkvKiBOZXcgbW91bnRwb2ludCBmb3IgSkZGUzIgd2hpY2ggaXMgYWxyZWFkeSBtb3VudGVkICovCisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9nZXRfc2JfbXRkKCk6IERldmljZSAlZCAoXCIlc1wiKSBpcyBhbHJlYWR5IG1vdW50ZWRcbiIsCisJCQkgIG10ZC0+aW5kZXgsIG10ZC0+bmFtZSkpOworCQlnb3RvIG91dF9wdXQ7CisJfQorCisJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2dldF9zYl9tdGQoKTogTmV3IHN1cGVyYmxvY2sgZm9yIGRldmljZSAlZCAoXCIlc1wiKVxuIiwKKwkJICBtdGQtPmluZGV4LCBtdGQtPm5hbWUpKTsKKworCXNiLT5zX29wID0gJmpmZnMyX3N1cGVyX29wZXJhdGlvbnM7CisJc2ItPnNfZmxhZ3MgPSBmbGFncyB8IE1TX05PQVRJTUU7CisKKwlyZXQgPSBqZmZzMl9kb19maWxsX3N1cGVyKHNiLCBkYXRhLCAoZmxhZ3MmTVNfVkVSQk9TRSk/MTowKTsKKworCWlmIChyZXQpIHsKKwkJLyogRmFpbHVyZSBjYXNlLi4uICovCisJCXVwX3dyaXRlKCZzYi0+c191bW91bnQpOworCQlkZWFjdGl2YXRlX3N1cGVyKHNiKTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwl9CisKKwlzYi0+c19mbGFncyB8PSBNU19BQ1RJVkU7CisJcmV0dXJuIHNiOworCisgb3V0X3B1dDoKKwlrZnJlZShjKTsKKwlwdXRfbXRkX2RldmljZShtdGQpOworCisJcmV0dXJuIHNiOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpqZmZzMl9nZXRfc2JfbXRkbnIoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCQkJCSAgICAgIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIAorCQkJCQkgICAgICB2b2lkICpkYXRhLCBpbnQgbXRkbnIpCit7CisJc3RydWN0IG10ZF9pbmZvICptdGQ7CisKKwltdGQgPSBnZXRfbXRkX2RldmljZShOVUxMLCBtdGRucik7CisJaWYgKCFtdGQpIHsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyOiBNVEQgZGV2aWNlICMldSBkb2Vzbid0IGFwcGVhciB0byBleGlzdFxuIiwgbXRkbnIpKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJcmV0dXJuIGpmZnMyX2dldF9zYl9tdGQoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBtdGQpOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpqZmZzMl9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCQkJCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsCisJCQkJCXZvaWQgKmRhdGEpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCWludCBtdGRucjsKKworCWlmICghZGV2X25hbWUpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2dldF9zYigpOiBkZXZfbmFtZSBcIiVzXCJcbiIsIGRldl9uYW1lKSk7CisKKwkvKiBUaGUgcHJlZmVycmVkIHdheSBvZiBtb3VudGluZyBpbiBmdXR1cmU7IGVzcGVjaWFsbHkgd2hlbgorCSAgIENPTkZJR19CTEtfREVWIGlzIGltcGxlbWVudGVkIC0gd2Ugc3BlY2lmeSB0aGUgdW5kZXJseWluZworCSAgIE1URCBkZXZpY2UgYnkgbnVtYmVyIG9yIGJ5IG5hbWUsIHNvIHRoYXQgd2UgZG9uJ3QgcmVxdWlyZSAKKwkgICBibG9jayBkZXZpY2Ugc3VwcG9ydCB0byBiZSBwcmVzZW50IGluIHRoZSBrZXJuZWwuICovCisKKwkvKiBGSVhNRTogSG93IHRvIGRvIHRoZSByb290IGZzIHRoaXMgd2F5PyAqLworCisJaWYgKGRldl9uYW1lWzBdID09ICdtJyAmJiBkZXZfbmFtZVsxXSA9PSAndCcgJiYgZGV2X25hbWVbMl0gPT0gJ2QnKSB7CisJCS8qIFByb2JhYmx5IG1vdW50aW5nIHdpdGhvdXQgdGhlIGJsa2RldiBjcmFwICovCisJCWlmIChkZXZfbmFtZVszXSA9PSAnOicpIHsKKwkJCXN0cnVjdCBtdGRfaW5mbyAqbXRkOworCisJCQkvKiBNb3VudCBieSBNVEQgZGV2aWNlIG5hbWUgKi8KKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9nZXRfc2IoKTogbXRkOiUlcywgbmFtZSBcIiVzXCJcbiIsIGRldl9uYW1lKzQpKTsKKwkJCWZvciAobXRkbnIgPSAwOyBtdGRuciA8IE1BWF9NVERfREVWSUNFUzsgbXRkbnIrKykgeworCQkJCW10ZCA9IGdldF9tdGRfZGV2aWNlKE5VTEwsIG10ZG5yKTsKKwkJCQlpZiAobXRkKSB7CisJCQkJCWlmICghc3RyY21wKG10ZC0+bmFtZSwgZGV2X25hbWUrNCkpCisJCQkJCQlyZXR1cm4gamZmczJfZ2V0X3NiX210ZChmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIG10ZCk7CisJCQkJCXB1dF9tdGRfZGV2aWNlKG10ZCk7CisJCQkJfQorCQkJfQorCQkJcHJpbnRrKEtFUk5fTk9USUNFICJqZmZzMl9nZXRfc2IoKTogTVREIGRldmljZSB3aXRoIG5hbWUgXCIlc1wiIG5vdCBmb3VuZC5cbiIsIGRldl9uYW1lKzQpOworCQl9IGVsc2UgaWYgKGlzZGlnaXQoZGV2X25hbWVbM10pKSB7CisJCQkvKiBNb3VudCBieSBNVEQgZGV2aWNlIG51bWJlciBuYW1lICovCisJCQljaGFyICplbmRwdHI7CisJCQkKKwkJCW10ZG5yID0gc2ltcGxlX3N0cnRvdWwoZGV2X25hbWUrMywgJmVuZHB0ciwgMCk7CisJCQlpZiAoISplbmRwdHIpIHsKKwkJCQkvKiBJdCB3YXMgYSB2YWxpZCBudW1iZXIgKi8KKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZ2V0X3NiKCk6IG10ZCUlZCwgbXRkbnIgJWRcbiIsIG10ZG5yKSk7CisJCQkJcmV0dXJuIGpmZnMyX2dldF9zYl9tdGRucihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIG10ZG5yKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIFRyeSB0aGUgb2xkIHdheSAtIHRoZSBoYWNrIHdoZXJlIHdlIGFsbG93ZWQgdXNlcnMgdG8gbW91bnQgCisJICAgL2Rldi9tdGRibG9jayQobikgYnV0IGRpZG4ndCBhY3R1YWxseSBfdXNlXyB0aGUgYmxrZGV2ICovCisKKwllcnIgPSBwYXRoX2xvb2t1cChkZXZfbmFtZSwgTE9PS1VQX0ZPTExPVywgJm5kKTsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9nZXRfc2IoKTogcGF0aF9sb29rdXAoKSByZXR1cm5lZCAlZCwgaW5vZGUgJXBcbiIsCisJCSAgZXJyLCBuZC5kZW50cnktPmRfaW5vZGUpKTsKKworCWlmIChlcnIpCisJCXJldHVybiBFUlJfUFRSKGVycik7CisKKwllcnIgPSAtRUlOVkFMOworCisJaWYgKCFTX0lTQkxLKG5kLmRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSkKKwkJZ290byBvdXQ7CisKKwlpZiAobmQubW50LT5tbnRfZmxhZ3MgJiBNTlRfTk9ERVYpIHsKKwkJZXJyID0gLUVBQ0NFUzsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGltYWpvcihuZC5kZW50cnktPmRfaW5vZGUpICE9IE1URF9CTE9DS19NQUpPUikgeworCQlpZiAoIShmbGFncyAmIE1TX1ZFUkJPU0UpKSAvKiBZZXMgSSBtZWFuIHRoaXMuIFN0cmFuZ2VseSAqLworCQkJcHJpbnRrKEtFUk5fTk9USUNFICJBdHRlbXB0IHRvIG1vdW50IG5vbi1NVEQgZGV2aWNlIFwiJXNcIiBhcyBKRkZTMlxuIiwKKwkJCSAgICAgICBkZXZfbmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCW10ZG5yID0gaW1pbm9yKG5kLmRlbnRyeS0+ZF9pbm9kZSk7CisJcGF0aF9yZWxlYXNlKCZuZCk7CisKKwlyZXR1cm4gamZmczJfZ2V0X3NiX210ZG5yKGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgbXRkbnIpOworCitvdXQ6CisJcGF0aF9yZWxlYXNlKCZuZCk7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworc3RhdGljIHZvaWQgamZmczJfcHV0X3N1cGVyIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBqZmZzMl9zYl9pbmZvICpjID0gSkZGUzJfU0JfSU5GTyhzYik7CisKKwlEMihwcmludGsoS0VSTl9ERUJVRyAiamZmczI6IGpmZnMyX3B1dF9zdXBlcigpXG4iKSk7CisKKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpCisJCWpmZnMyX3N0b3BfZ2FyYmFnZV9jb2xsZWN0X3RocmVhZChjKTsKKwlkb3duKCZjLT5hbGxvY19zZW0pOworCWpmZnMyX2ZsdXNoX3didWZfcGFkKGMpOworCXVwKCZjLT5hbGxvY19zZW0pOworCWpmZnMyX2ZyZWVfaW5vX2NhY2hlcyhjKTsKKwlqZmZzMl9mcmVlX3Jhd19ub2RlX3JlZnMoYyk7CisJaWYgKGMtPm10ZC0+ZmxhZ3MgJiBNVERfTk9fVklSVEJMT0NLUykKKwkJdmZyZWUoYy0+YmxvY2tzKTsKKwllbHNlCisJCWtmcmVlKGMtPmJsb2Nrcyk7CisJamZmczJfZmxhc2hfY2xlYW51cChjKTsKKwlrZnJlZShjLT5pbm9jYWNoZV9saXN0KTsKKwlpZiAoYy0+bXRkLT5zeW5jKQorCQljLT5tdGQtPnN5bmMoYy0+bXRkKTsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9wdXRfc3VwZXIgcmV0dXJuaW5nXG4iKSk7Cit9CisKK3N0YXRpYyB2b2lkIGpmZnMyX2tpbGxfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYyA9IEpGRlMyX1NCX0lORk8oc2IpOworCWdlbmVyaWNfc2h1dGRvd25fc3VwZXIoc2IpOworCXB1dF9tdGRfZGV2aWNlKGMtPm10ZCk7CisJa2ZyZWUoYyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBqZmZzMl9mc190eXBlID0geworCS5vd25lciA9CVRISVNfTU9EVUxFLAorCS5uYW1lID0JCSJqZmZzMiIsCisJLmdldF9zYiA9CWpmZnMyX2dldF9zYiwKKwkua2lsbF9zYiA9CWpmZnMyX2tpbGxfc2IsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2pmZnMyX2ZzKHZvaWQpCit7CisJaW50IHJldDsKKworCXByaW50ayhLRVJOX0lORk8gIkpGRlMyIHZlcnNpb24gMi4yLiIKKyNpZmRlZiBDT05GSUdfSkZGUzJfRlNfTkFORAorCSAgICAgICAiIChOQU5EKSIKKyNlbmRpZgorCSAgICAgICAiIChDKSAyMDAxLTIwMDMgUmVkIEhhdCwgSW5jLlxuIik7CisKKwlqZmZzMl9pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiamZmczJfaSIsCisJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvKSwKKwkJCQkJICAgICAwLCBTTEFCX1JFQ0xBSU1fQUNDT1VOVCwKKwkJCQkJICAgICBqZmZzMl9pX2luaXRfb25jZSwgTlVMTCk7CisJaWYgKCFqZmZzMl9pbm9kZV9jYWNoZXApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJKRkZTMiBlcnJvcjogRmFpbGVkIHRvIGluaXRpYWxpc2UgaW5vZGUgY2FjaGVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmV0ID0gamZmczJfY29tcHJlc3NvcnNfaW5pdCgpOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJKRkZTMiBlcnJvcjogRmFpbGVkIHRvIGluaXRpYWxpc2UgY29tcHJlc3NvcnNcbiIpOworCQlnb3RvIG91dDsKKwl9CisJcmV0ID0gamZmczJfY3JlYXRlX3NsYWJfY2FjaGVzKCk7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgIkpGRlMyIGVycm9yOiBGYWlsZWQgdG8gaW5pdGlhbGlzZSBzbGFiIGNhY2hlc1xuIik7CisJCWdvdG8gb3V0X2NvbXByZXNzb3JzOworCX0KKwlyZXQgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZqZmZzMl9mc190eXBlKTsKKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiSkZGUzIgZXJyb3I6IEZhaWxlZCB0byByZWdpc3RlciBmaWxlc3lzdGVtXG4iKTsKKwkJZ290byBvdXRfc2xhYjsKKwl9CisJcmV0dXJuIDA7CisKKyBvdXRfc2xhYjoKKwlqZmZzMl9kZXN0cm95X3NsYWJfY2FjaGVzKCk7Cisgb3V0X2NvbXByZXNzb3JzOgorCWpmZnMyX2NvbXByZXNzb3JzX2V4aXQoKTsKKyBvdXQ6CisJa21lbV9jYWNoZV9kZXN0cm95KGpmZnMyX2lub2RlX2NhY2hlcCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfamZmczJfZnModm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmpmZnMyX2ZzX3R5cGUpOworCWpmZnMyX2Rlc3Ryb3lfc2xhYl9jYWNoZXMoKTsKKwlqZmZzMl9jb21wcmVzc29yc19leGl0KCk7CisJa21lbV9jYWNoZV9kZXN0cm95KGpmZnMyX2lub2RlX2NhY2hlcCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfamZmczJfZnMpOworbW9kdWxlX2V4aXQoZXhpdF9qZmZzMl9mcyk7CisKK01PRFVMRV9ERVNDUklQVElPTigiVGhlIEpvdXJuYWxsaW5nIEZsYXNoIEZpbGUgU3lzdGVtLCB2MiIpOworTU9EVUxFX0FVVEhPUigiUmVkIEhhdCwgSW5jLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOyAvLyBBY3R1YWxseSBkdWFsLWxpY2Vuc2VkLCBidXQgaXQgZG9lc24ndCBtYXR0ZXIgZm9yIAorCQkgICAgICAgLy8gdGhlIHNha2Ugb2YgdGhpcyB0YWcuIEl0J3MgRnJlZSBTb2Z0d2FyZS4KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL3N5bWxpbmsuYyBiL2ZzL2pmZnMyL3N5bWxpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjE4MjBkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZmczIvc3ltbGluay5jCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBKRkZTMiAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgVmVyc2lvbiAyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgKgorICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CisgKgorICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KKyAqCisgKiAkSWQ6IHN5bWxpbmsuYyx2IDEuMTQgMjAwNC8xMS8xNiAyMDozNjoxMiBkd213MiBFeHAgJAorICoKKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgIm5vZGVsaXN0LmgiCisKK3N0YXRpYyBpbnQgamZmczJfZm9sbG93X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCk7CitzdGF0aWMgdm9pZCBqZmZzMl9wdXRfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKTsKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgamZmczJfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zID0KK3sJCisJLnJlYWRsaW5rID0JZ2VuZXJpY19yZWFkbGluaywKKwkuZm9sbG93X2xpbmsgPQlqZmZzMl9mb2xsb3dfbGluaywKKwkucHV0X2xpbmsgPQlqZmZzMl9wdXRfbGluaywKKwkuc2V0YXR0ciA9CWpmZnMyX3NldGF0dHIKK307CisKK3N0YXRpYyBpbnQgamZmczJfZm9sbG93X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJYnVmID0gamZmczJfZ2V0bGluayhKRkZTMl9TQl9JTkZPKGRlbnRyeS0+ZF9pbm9kZS0+aV9zYiksIEpGRlMyX0lOT0RFX0lORk8oZGVudHJ5LT5kX2lub2RlKSk7CisJbmRfc2V0X2xpbmsobmQsIGJ1Zik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGpmZnMyX3B1dF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJY2hhciAqcyA9IG5kX2dldF9saW5rKG5kKTsKKwlpZiAoIUlTX0VSUihzKSkKKwkJa2ZyZWUocyk7Cit9CmRpZmYgLS1naXQgYS9mcy9qZmZzMi93YnVmLmMgYi9mcy9qZmZzMi93YnVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgxMjgwNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMyL3didWYuYwpAQCAtMCwwICsxLDExODQgQEAKKy8qCisgKiBKRkZTMiAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgVmVyc2lvbiAyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMS0yMDAzIFJlZCBIYXQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAwNCBUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KKyAqCisgKiBDcmVhdGVkIGJ5IERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4KKyAqIE1vZGlmaWVkIGRlYnVnZ2VkIGFuZCBlbmhhbmNlZCBieSBUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KKyAqCisgKiBGb3IgbGljZW5zaW5nIGluZm9ybWF0aW9uLCBzZWUgdGhlIGZpbGUgJ0xJQ0VOQ0UnIGluIHRoaXMgZGlyZWN0b3J5LgorICoKKyAqICRJZDogd2J1Zi5jLHYgMS44MiAyMDA0LzExLzIwIDIyOjA4OjMxIGR3bXcyIEV4cCAkCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL210ZC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvbXRkL25hbmQuaD4KKyNpbmNsdWRlICJub2RlbGlzdC5oIgorCisvKiBGb3IgdGVzdGluZyB3cml0ZSBmYWlsdXJlcyAqLworI3VuZGVmIEJSRUFLTUUKKyN1bmRlZiBCUkVBS01FSEVBREVSCisKKyNpZmRlZiBCUkVBS01FCitzdGF0aWMgdW5zaWduZWQgY2hhciAqYnJva2VuYnVmOworI2VuZGlmCisKKy8qIG1heC4gZXJhc2UgZmFpbHVyZXMgYmVmb3JlIHdlIG1hcmsgYSBibG9jayBiYWQgKi8KKyNkZWZpbmUgTUFYX0VSQVNFX0ZBSUxVUkVTIAkyCisKKy8qIHR3byBzZWNvbmRzIHRpbWVvdXQgZm9yIHRpbWVkIHdidWYtZmx1c2hpbmcgKi8KKyNkZWZpbmUgV0JVRl9GTFVTSF9USU1FT1VUCTIgKiBIWgorCitzdHJ1Y3QgamZmczJfaW5vZGlydHkgeworCXVpbnQzMl90IGlubzsKKwlzdHJ1Y3QgamZmczJfaW5vZGlydHkgKm5leHQ7Cit9OworCitzdGF0aWMgc3RydWN0IGpmZnMyX2lub2RpcnR5IGlub2RpcnR5X25vbWVtOworCitzdGF0aWMgaW50IGpmZnMyX3didWZfcGVuZGluZ19mb3JfaW5vKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCB1aW50MzJfdCBpbm8pCit7CisJc3RydWN0IGpmZnMyX2lub2RpcnR5ICp0aGlzID0gYy0+d2J1Zl9pbm9kZXM7CisKKwkvKiBJZiBhIG1hbGxvYyBmYWlsZWQsIGNvbnNpZGVyIF9ldmVyeXRoaW5nXyBkaXJ0eSAqLworCWlmICh0aGlzID09ICZpbm9kaXJ0eV9ub21lbSkKKwkJcmV0dXJuIDE7CisKKwkvKiBJZiBpbm8gPT0gMCwgX2FueV8gbm9uLUdDIHdyaXRlcyBtZWFuICd5ZXMnICovCisJaWYgKHRoaXMgJiYgIWlubykKKwkJcmV0dXJuIDE7CisKKwkvKiBMb29rIHRvIHNlZSBpZiB0aGUgaW5vZGUgaW4gcXVlc3Rpb24gaXMgcGVuZGluZyBpbiB0aGUgd2J1ZiAqLworCXdoaWxlICh0aGlzKSB7CisJCWlmICh0aGlzLT5pbm8gPT0gaW5vKQorCQkJcmV0dXJuIDE7CisJCXRoaXMgPSB0aGlzLT5uZXh0OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgamZmczJfY2xlYXJfd2J1Zl9pbm9fbGlzdChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYykKK3sKKwlzdHJ1Y3QgamZmczJfaW5vZGlydHkgKnRoaXM7CisKKwl0aGlzID0gYy0+d2J1Zl9pbm9kZXM7CisKKwlpZiAodGhpcyAhPSAmaW5vZGlydHlfbm9tZW0pIHsKKwkJd2hpbGUgKHRoaXMpIHsKKwkJCXN0cnVjdCBqZmZzMl9pbm9kaXJ0eSAqbmV4dCA9IHRoaXMtPm5leHQ7CisJCQlrZnJlZSh0aGlzKTsKKwkJCXRoaXMgPSBuZXh0OworCQl9CisJfQorCWMtPndidWZfaW5vZGVzID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgamZmczJfd2J1Zl9kaXJ0aWVzX2lub2RlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCB1aW50MzJfdCBpbm8pCit7CisJc3RydWN0IGpmZnMyX2lub2RpcnR5ICpuZXc7CisKKwkvKiBNYXJrIHRoZSBzdXBlcmJsb2NrIGRpcnR5IHNvIHRoYXQga3VwZGF0ZWQgd2lsbCBmbHVzaC4uLiAqLworCU9GTklfQlNfMlNGRkooYyktPnNfZGlydCA9IDE7CisKKwlpZiAoamZmczJfd2J1Zl9wZW5kaW5nX2Zvcl9pbm8oYywgaW5vKSkKKwkJcmV0dXJuOworCisJbmV3ID0ga21hbGxvYyhzaXplb2YoKm5ldyksIEdGUF9LRVJORUwpOworCWlmICghbmV3KSB7CisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJObyBtZW1vcnkgdG8gYWxsb2NhdGUgaW5vZGlydHkuIEZhbGxiYWNrIHRvIGFsbCBjb25zaWRlcmVkIGRpcnR5XG4iKSk7CisJCWpmZnMyX2NsZWFyX3didWZfaW5vX2xpc3QoYyk7CisJCWMtPndidWZfaW5vZGVzID0gJmlub2RpcnR5X25vbWVtOworCQlyZXR1cm47CisJfQorCW5ldy0+aW5vID0gaW5vOworCW5ldy0+bmV4dCA9IGMtPndidWZfaW5vZGVzOworCWMtPndidWZfaW5vZGVzID0gbmV3OworCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGpmZnMyX3JlZmlsZV93YnVmX2Jsb2NrcyhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0aGlzLCAqbmV4dDsKKwlzdGF0aWMgaW50IG47CisKKwlpZiAobGlzdF9lbXB0eSgmYy0+ZXJhc2FibGVfcGVuZGluZ193YnVmX2xpc3QpKQorCQlyZXR1cm47CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUodGhpcywgbmV4dCwgJmMtPmVyYXNhYmxlX3BlbmRpbmdfd2J1Zl9saXN0KSB7CisJCXN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWIgPSBsaXN0X2VudHJ5KHRoaXMsIHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrLCBsaXN0KTsKKworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiUmVtb3ZpbmcgZXJhc2VibG9jayBhdCAweCUwOHggZnJvbSBlcmFzYWJsZV9wZW5kaW5nX3didWZfbGlzdC4uLlxuIiwgamViLT5vZmZzZXQpKTsKKwkJbGlzdF9kZWwodGhpcyk7CisJCWlmICgoamlmZmllcyArIChuKyspKSAmIDEyNykgeworCQkJLyogTW9zdCBvZiB0aGUgdGltZSwgd2UganVzdCBlcmFzZSBpdCBpbW1lZGlhdGVseS4gT3RoZXJ3aXNlIHdlCisJCQkgICBzcGVuZCBhZ2VzIHNjYW5uaW5nIGl0IG9uIG1vdW50LCBldGMuICovCisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiLi4uYW5kIGFkZGluZyB0byBlcmFzZV9wZW5kaW5nX2xpc3RcbiIpKTsKKwkJCWxpc3RfYWRkX3RhaWwoJmplYi0+bGlzdCwgJmMtPmVyYXNlX3BlbmRpbmdfbGlzdCk7CisJCQljLT5ucl9lcmFzaW5nX2Jsb2NrcysrOworCQkJamZmczJfZXJhc2VfcGVuZGluZ190cmlnZ2VyKGMpOworCQl9IGVsc2UgeworCQkJLyogU29tZXRpbWVzLCBob3dldmVyLCB3ZSBsZWF2ZSBpdCBlbHNld2hlcmUgc28gaXQgZG9lc24ndCBnZXQKKwkJCSAgIGltbWVkaWF0ZWx5IHJldXNlZCwgYW5kIHdlIHNwcmVhZCB0aGUgbG9hZCBhIGJpdC4gKi8KKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICIuLi5hbmQgYWRkaW5nIHRvIGVyYXNhYmxlX2xpc3RcbiIpKTsKKwkJCWxpc3RfYWRkX3RhaWwoJmplYi0+bGlzdCwgJmMtPmVyYXNhYmxlX2xpc3QpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBqZmZzMl9ibG9ja19yZWZpbGUoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWIpCit7CisJRDEocHJpbnRrKCJBYm91dCB0byByZWZpbGUgYmFkIGJsb2NrIGF0ICUwOHhcbiIsIGplYi0+b2Zmc2V0KSk7CisKKwlEMihqZmZzMl9kdW1wX2Jsb2NrX2xpc3RzKGMpKTsKKwkvKiBGaWxlIHRoZSBleGlzdGluZyBibG9jayBvbiB0aGUgYmFkX3VzZWRfbGlzdC4uLi4gKi8KKwlpZiAoYy0+bmV4dGJsb2NrID09IGplYikKKwkJYy0+bmV4dGJsb2NrID0gTlVMTDsKKwllbHNlIC8qIE5vdCBzdXJlIHRoaXMgc2hvdWxkIGV2ZXIgaGFwcGVuLi4uIG5lZWQgbW9yZSBjb2ZmZWUgKi8KKwkJbGlzdF9kZWwoJmplYi0+bGlzdCk7CisJaWYgKGplYi0+Zmlyc3Rfbm9kZSkgeworCQlEMShwcmludGsoIlJlZmlsaW5nIGJsb2NrIGF0ICUwOHggdG8gYmFkX3VzZWRfbGlzdFxuIiwgamViLT5vZmZzZXQpKTsKKwkJbGlzdF9hZGQoJmplYi0+bGlzdCwgJmMtPmJhZF91c2VkX2xpc3QpOworCX0gZWxzZSB7CisJCUJVRygpOworCQkvKiBJdCBoYXMgdG8gaGF2ZSBoYWQgc29tZSBub2RlcyBvciB3ZSBjb3VsZG4ndCBiZSBoZXJlICovCisJCUQxKHByaW50aygiUmVmaWxpbmcgYmxvY2sgYXQgJTA4eCB0byBlcmFzZV9wZW5kaW5nX2xpc3RcbiIsIGplYi0+b2Zmc2V0KSk7CisJCWxpc3RfYWRkKCZqZWItPmxpc3QsICZjLT5lcmFzZV9wZW5kaW5nX2xpc3QpOworCQljLT5ucl9lcmFzaW5nX2Jsb2NrcysrOworCQlqZmZzMl9lcmFzZV9wZW5kaW5nX3RyaWdnZXIoYyk7CisJfQorCUQyKGpmZnMyX2R1bXBfYmxvY2tfbGlzdHMoYykpOworCisJLyogQWRqdXN0IGl0cyBzaXplIGNvdW50cyBhY2NvcmRpbmdseSAqLworCWMtPndhc3RlZF9zaXplICs9IGplYi0+ZnJlZV9zaXplOworCWMtPmZyZWVfc2l6ZSAtPSBqZWItPmZyZWVfc2l6ZTsKKwlqZWItPndhc3RlZF9zaXplICs9IGplYi0+ZnJlZV9zaXplOworCWplYi0+ZnJlZV9zaXplID0gMDsKKworCUFDQ1RfU0FOSVRZX0NIRUNLKGMsamViKTsKKwlEMShBQ0NUX1BBUkFOT0lBX0NIRUNLKGplYikpOworfQorCisvKiBSZWNvdmVyIGZyb20gZmFpbHVyZSB0byB3cml0ZSB3YnVmLiBSZWNvdmVyIHRoZSBub2RlcyB1cCB0byB0aGUKKyAqIHdidWYsIG5vdCB0aGUgb25lIHdoaWNoIHdlIHdlcmUgc3RhcnRpbmcgdG8gdHJ5IHRvIHdyaXRlLiAqLworCitzdGF0aWMgdm9pZCBqZmZzMl93YnVmX3JlY292ZXIoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMpCit7CisJc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiwgKm5ld19qZWI7CisJc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqKmZpcnN0X3JhdywgKipyYXc7CisJc2l6ZV90IHJldGxlbjsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwl1aW50MzJfdCBzdGFydCwgZW5kLCBvZnMsIGxlbjsKKworCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKworCWplYiA9ICZjLT5ibG9ja3NbYy0+d2J1Zl9vZnMgLyBjLT5zZWN0b3Jfc2l6ZV07CisKKwlqZmZzMl9ibG9ja19yZWZpbGUoYywgamViKTsKKworCS8qIEZpbmQgdGhlIGZpcnN0IG5vZGUgdG8gYmUgcmVjb3ZlcmVkLCBieSBza2lwcGluZyBvdmVyIGV2ZXJ5CisJICAgbm9kZSB3aGljaCBlbmRzIGJlZm9yZSB0aGUgd2J1ZiBzdGFydHMsIG9yIHdoaWNoIGlzIG9ic29sZXRlLiAqLworCWZpcnN0X3JhdyA9ICZqZWItPmZpcnN0X25vZGU7CisJd2hpbGUgKCpmaXJzdF9yYXcgJiYgCisJICAgICAgIChyZWZfb2Jzb2xldGUoKmZpcnN0X3JhdykgfHwKKwkJKHJlZl9vZmZzZXQoKmZpcnN0X3JhdykrcmVmX3RvdGxlbihjLCBqZWIsICpmaXJzdF9yYXcpKSA8IGMtPndidWZfb2ZzKSkgeworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiU2tpcHBpbmcgbm9kZSBhdCAweCUwOHgoJWQpLTB4JTA4eCB3aGljaCBpcyBlaXRoZXIgYmVmb3JlIDB4JTA4eCBvciBvYnNvbGV0ZVxuIiwKKwkJCSAgcmVmX29mZnNldCgqZmlyc3RfcmF3KSwgcmVmX2ZsYWdzKCpmaXJzdF9yYXcpLAorCQkJICAocmVmX29mZnNldCgqZmlyc3RfcmF3KSArIHJlZl90b3RsZW4oYywgamViLCAqZmlyc3RfcmF3KSksCisJCQkgIGMtPndidWZfb2ZzKSk7CisJCWZpcnN0X3JhdyA9ICYoKmZpcnN0X3JhdyktPm5leHRfcGh5czsKKwl9CisKKwlpZiAoISpmaXJzdF9yYXcpIHsKKwkJLyogQWxsIG5vZGVzIHdlcmUgb2Jzb2xldGUuIE5vdGhpbmcgdG8gcmVjb3Zlci4gKi8KKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIk5vIG5vbi1vYnNvbGV0ZSBub2RlcyB0byBiZSByZWNvdmVyZWQuIEp1c3QgZmlsaW5nIGJsb2NrIGJhZFxuIikpOworCQlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCXN0YXJ0ID0gcmVmX29mZnNldCgqZmlyc3RfcmF3KTsKKwllbmQgPSByZWZfb2Zmc2V0KCpmaXJzdF9yYXcpICsgcmVmX3RvdGxlbihjLCBqZWIsICpmaXJzdF9yYXcpOworCisJLyogRmluZCB0aGUgbGFzdCBub2RlIHRvIGJlIHJlY292ZXJlZCAqLworCXJhdyA9IGZpcnN0X3JhdzsKKwl3aGlsZSAoKCpyYXcpKSB7CisJCWlmICghcmVmX29ic29sZXRlKCpyYXcpKQorCQkJZW5kID0gcmVmX29mZnNldCgqcmF3KSArIHJlZl90b3RsZW4oYywgamViLCAqcmF3KTsKKworCQlyYXcgPSAmKCpyYXcpLT5uZXh0X3BoeXM7CisJfQorCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCisJRDEocHJpbnRrKEtFUk5fREVCVUcgIndidWYgcmVjb3ZlciAlMDh4LSUwOHhcbiIsIHN0YXJ0LCBlbmQpKTsKKworCWJ1ZiA9IE5VTEw7CisJaWYgKHN0YXJ0IDwgYy0+d2J1Zl9vZnMpIHsKKwkJLyogRmlyc3QgYWZmZWN0ZWQgbm9kZSB3YXMgYWxyZWFkeSBwYXJ0aWFsbHkgd3JpdHRlbi4KKwkJICogQXR0ZW1wdCB0byByZXJlYWQgdGhlIG9sZCBkYXRhIGludG8gb3VyIGJ1ZmZlci4gKi8KKworCQlidWYgPSBrbWFsbG9jKGVuZCAtIHN0YXJ0LCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFidWYpIHsKKwkJCXByaW50ayhLRVJOX0NSSVQgIk1hbGxvYyBmYWlsdXJlIGluIHdidWYgcmVjb3ZlcnkuIERhdGEgbG9zcyBlbnN1ZXMuXG4iKTsKKworCQkJZ290byByZWFkX2ZhaWxlZDsKKwkJfQorCisJCS8qIERvIHRoZSByZWFkLi4uICovCisJCWlmIChqZmZzMl9jbGVhbm1hcmtlcl9vb2IoYykpCisJCQlyZXQgPSBjLT5tdGQtPnJlYWRfZWNjKGMtPm10ZCwgc3RhcnQsIGMtPndidWZfb2ZzIC0gc3RhcnQsICZyZXRsZW4sIGJ1ZiwgTlVMTCwgYy0+b29iaW5mbyk7CisJCWVsc2UKKwkJCXJldCA9IGMtPm10ZC0+cmVhZChjLT5tdGQsIHN0YXJ0LCBjLT53YnVmX29mcyAtIHN0YXJ0LCAmcmV0bGVuLCBidWYpOworCQkKKwkJaWYgKHJldCA9PSAtRUJBRE1TRyAmJiByZXRsZW4gPT0gYy0+d2J1Zl9vZnMgLSBzdGFydCkgeworCQkJLyogRUNDIHJlY292ZXJlZCAqLworCQkJcmV0ID0gMDsKKwkJfQorCQlpZiAocmV0IHx8IHJldGxlbiAhPSBjLT53YnVmX29mcyAtIHN0YXJ0KSB7CisJCQlwcmludGsoS0VSTl9DUklUICJPbGQgZGF0YSBhcmUgYWxyZWFkeSBsb3N0IGluIHdidWYgcmVjb3ZlcnkuIERhdGEgbG9zcyBlbnN1ZXMuXG4iKTsKKworCQkJa2ZyZWUoYnVmKTsKKwkJCWJ1ZiA9IE5VTEw7CisJCXJlYWRfZmFpbGVkOgorCQkJZmlyc3RfcmF3ID0gJigqZmlyc3RfcmF3KS0+bmV4dF9waHlzOworCQkJLyogSWYgdGhpcyB3YXMgdGhlIG9ubHkgbm9kZSB0byBiZSByZWNvdmVyZWQsIGdpdmUgdXAgKi8KKwkJCWlmICghKCpmaXJzdF9yYXcpKQorCQkJCXJldHVybjsKKworCQkJLyogSXQgd2Fzbid0LiBHbyBvbiBhbmQgdHJ5IHRvIHJlY292ZXIgbm9kZXMgY29tcGxldGUgaW4gdGhlIHdidWYgKi8KKwkJCXN0YXJ0ID0gcmVmX29mZnNldCgqZmlyc3RfcmF3KTsKKwkJfSBlbHNlIHsKKwkJCS8qIFJlYWQgc3VjY2VlZGVkLiBDb3B5IHRoZSByZW1haW5pbmcgZGF0YSBmcm9tIHRoZSB3YnVmICovCisJCQltZW1jcHkoYnVmICsgKGMtPndidWZfb2ZzIC0gc3RhcnQpLCBjLT53YnVmLCBlbmQgLSBjLT53YnVmX29mcyk7CisJCX0KKwl9CisJLyogT0suLi4gd2UncmUgdG8gcmV3cml0ZSAoZW5kLXN0YXJ0KSBieXRlcyBvZiBkYXRhIGZyb20gZmlyc3RfcmF3IG9ud2FyZHMuCisJICAgRWl0aGVyICdidWYnIGNvbnRhaW5zIHRoZSBkYXRhLCBvciB3ZSBmaW5kIGl0IGluIHRoZSB3YnVmICovCisKKworCS8qIC4uLiBhbmQgZ2V0IGFuIGFsbG9jYXRpb24gb2Ygc3BhY2UgZnJvbSBhIHNoaW55IG5ldyBibG9jayBpbnN0ZWFkICovCisJcmV0ID0gamZmczJfcmVzZXJ2ZV9zcGFjZV9nYyhjLCBlbmQtc3RhcnQsICZvZnMsICZsZW4pOworCWlmIChyZXQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiRmFpbGVkIHRvIGFsbG9jYXRlIHNwYWNlIGZvciB3YnVmIHJlY292ZXJ5LiBEYXRhIGxvc3MgZW5zdWVzLlxuIik7CisJCWlmIChidWYpCisJCQlrZnJlZShidWYpOworCQlyZXR1cm47CisJfQorCWlmIChlbmQtc3RhcnQgPj0gYy0+d2J1Zl9wYWdlc2l6ZSkgeworCQkvKiBOZWVkIHRvIGRvIGFub3RoZXIgd3JpdGUgaW1tZWRpYXRlbHkuIFRoaXMsIGJ0dywKKwkJIG1lYW5zIHRoYXQgd2UnbGwgYmUgd3JpdGluZyBmcm9tICdidWYnIGFuZCBub3QgZnJvbQorCQkgdGhlIHdidWYuIFNpbmNlIGlmIHdlJ3JlIHdyaXRpbmcgZnJvbSB0aGUgd2J1ZiB0aGVyZQorCQkgd29uJ3QgYmUgbW9yZSB0aGFuIGEgd2J1ZiBmdWxsIG9mIGRhdGEsIG5vdyB3aWxsCisJCSB0aGVyZT8gOikgKi8KKworCQl1aW50MzJfdCB0b3dyaXRlID0gKGVuZC1zdGFydCkgLSAoKGVuZC1zdGFydCklYy0+d2J1Zl9wYWdlc2l6ZSk7CisKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIldyaXRlIDB4JXggYnl0ZXMgYXQgMHglMDh4IGluIHdidWYgcmVjb3ZlclxuIiwKKwkJCSAgdG93cml0ZSwgb2ZzKSk7CisJICAKKyNpZmRlZiBCUkVBS01FSEVBREVSCisJCXN0YXRpYyBpbnQgYnJlYWttZTsKKwkJaWYgKGJyZWFrbWUrKyA9PSAyMCkgeworCQkJcHJpbnRrKEtFUk5fTk9USUNFICJGYWtpbmcgd3JpdGUgZXJyb3IgYXQgMHglMDh4XG4iLCBvZnMpOworCQkJYnJlYWttZSA9IDA7CisJCQljLT5tdGQtPndyaXRlX2VjYyhjLT5tdGQsIG9mcywgdG93cml0ZSwgJnJldGxlbiwKKwkJCQkJICBicm9rZW5idWYsIE5VTEwsIGMtPm9vYmluZm8pOworCQkJcmV0ID0gLUVJTzsKKwkJfSBlbHNlCisjZW5kaWYKKwkJaWYgKGpmZnMyX2NsZWFubWFya2VyX29vYihjKSkKKwkJCXJldCA9IGMtPm10ZC0+d3JpdGVfZWNjKGMtPm10ZCwgb2ZzLCB0b3dyaXRlLCAmcmV0bGVuLAorCQkJCQkJYnVmLCBOVUxMLCBjLT5vb2JpbmZvKTsKKwkJZWxzZQorCQkJcmV0ID0gYy0+bXRkLT53cml0ZShjLT5tdGQsIG9mcywgdG93cml0ZSwgJnJldGxlbiwgYnVmKTsKKworCQlpZiAocmV0IHx8IHJldGxlbiAhPSB0b3dyaXRlKSB7CisJCQkvKiBBcmdoLiBXZSB0cmllZC4gUmVhbGx5IHdlIGRpZC4gKi8KKwkJCXByaW50ayhLRVJOX0NSSVQgIlJlY292ZXJ5IG9mIHdidWYgZmFpbGVkIGR1ZSB0byBhIHNlY29uZCB3cml0ZSBlcnJvclxuIik7CisJCQlrZnJlZShidWYpOworCisJCQlpZiAocmV0bGVuKSB7CisJCQkJc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqcmF3MjsKKworCQkJCXJhdzIgPSBqZmZzMl9hbGxvY19yYXdfbm9kZV9yZWYoKTsKKwkJCQlpZiAoIXJhdzIpCisJCQkJCXJldHVybjsKKworCQkJCXJhdzItPmZsYXNoX29mZnNldCA9IG9mcyB8IFJFRl9PQlNPTEVURTsKKwkJCQlyYXcyLT5fX3RvdGxlbiA9IHJlZl90b3RsZW4oYywgamViLCAqZmlyc3RfcmF3KTsKKwkJCQlyYXcyLT5uZXh0X3BoeXMgPSBOVUxMOworCQkJCXJhdzItPm5leHRfaW5faW5vID0gTlVMTDsKKworCQkJCWpmZnMyX2FkZF9waHlzaWNhbF9ub2RlX3JlZihjLCByYXcyKTsKKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCQlwcmludGsoS0VSTl9OT1RJQ0UgIlJlY292ZXJ5IG9mIHdidWYgc3VjY2VlZGVkIHRvICUwOHhcbiIsIG9mcyk7CisKKwkJYy0+d2J1Zl9sZW4gPSAoZW5kIC0gc3RhcnQpIC0gdG93cml0ZTsKKwkJYy0+d2J1Zl9vZnMgPSBvZnMgKyB0b3dyaXRlOworCQltZW1jcHkoYy0+d2J1ZiwgYnVmICsgdG93cml0ZSwgYy0+d2J1Zl9sZW4pOworCQkvKiBEb24ndCBtdWNrIGFib3V0IHdpdGggYy0+d2J1Zl9pbm9kZXMuIEZhbHNlIHBvc2l0aXZlcyBhcmUgaGFybWxlc3MuICovCisKKwkJa2ZyZWUoYnVmKTsKKwl9IGVsc2UgeworCQkvKiBPSywgbm93IHdlJ3JlIGxlZnQgd2l0aCB0aGUgZHJlZ3MgaW4gd2hpY2hldmVyIGJ1ZmZlciB3ZSdyZSB1c2luZyAqLworCQlpZiAoYnVmKSB7CisJCQltZW1jcHkoYy0+d2J1ZiwgYnVmLCBlbmQtc3RhcnQpOworCQkJa2ZyZWUoYnVmKTsKKwkJfSBlbHNlIHsKKwkJCW1lbW1vdmUoYy0+d2J1ZiwgYy0+d2J1ZiArIChzdGFydCAtIGMtPndidWZfb2ZzKSwgZW5kIC0gc3RhcnQpOworCQl9CisJCWMtPndidWZfb2ZzID0gb2ZzOworCQljLT53YnVmX2xlbiA9IGVuZCAtIHN0YXJ0OworCX0KKworCS8qIE5vdyBzb3J0IG91dCB0aGUgamZmczJfcmF3X25vZGVfcmVmcywgbW92aW5nIHRoZW0gZnJvbSB0aGUgb2xkIHRvIHRoZSBuZXh0IGJsb2NrICovCisJbmV3X2plYiA9ICZjLT5ibG9ja3Nbb2ZzIC8gYy0+c2VjdG9yX3NpemVdOworCisJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCWlmIChuZXdfamViLT5maXJzdF9ub2RlKSB7CisJCS8qIE9kZCwgYnV0IHBvc3NpYmxlIHdpdGggU1QgZmxhc2ggbGF0ZXIgbWF5YmUgKi8KKwkJbmV3X2plYi0+bGFzdF9ub2RlLT5uZXh0X3BoeXMgPSAqZmlyc3RfcmF3OworCX0gZWxzZSB7CisJCW5ld19qZWItPmZpcnN0X25vZGUgPSAqZmlyc3RfcmF3OworCX0KKworCXJhdyA9IGZpcnN0X3JhdzsKKwl3aGlsZSAoKnJhdykgeworCQl1aW50MzJfdCByYXdsZW4gPSByZWZfdG90bGVuKGMsIGplYiwgKnJhdyk7CisKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIlJlZmlsaW5nIGJsb2NrIG9mICUwOHggYXQgJTA4eCglZCkgdG8gJTA4eFxuIiwKKwkJCSAgcmF3bGVuLCByZWZfb2Zmc2V0KCpyYXcpLCByZWZfZmxhZ3MoKnJhdyksIG9mcykpOworCisJCWlmIChyZWZfb2Jzb2xldGUoKnJhdykpIHsKKwkJCS8qIFNob3VsZG4ndCByZWFsbHkgaGFwcGVuIG11Y2ggKi8KKwkJCW5ld19qZWItPmRpcnR5X3NpemUgKz0gcmF3bGVuOworCQkJbmV3X2plYi0+ZnJlZV9zaXplIC09IHJhd2xlbjsKKwkJCWMtPmRpcnR5X3NpemUgKz0gcmF3bGVuOworCQl9IGVsc2UgeworCQkJbmV3X2plYi0+dXNlZF9zaXplICs9IHJhd2xlbjsKKwkJCW5ld19qZWItPmZyZWVfc2l6ZSAtPSByYXdsZW47CisJCQlqZWItPmRpcnR5X3NpemUgKz0gcmF3bGVuOworCQkJamViLT51c2VkX3NpemUgIC09IHJhd2xlbjsKKwkJCWMtPmRpcnR5X3NpemUgKz0gcmF3bGVuOworCQl9CisJCWMtPmZyZWVfc2l6ZSAtPSByYXdsZW47CisJCSgqcmF3KS0+Zmxhc2hfb2Zmc2V0ID0gb2ZzIHwgcmVmX2ZsYWdzKCpyYXcpOworCQlvZnMgKz0gcmF3bGVuOworCQluZXdfamViLT5sYXN0X25vZGUgPSAqcmF3OworCisJCXJhdyA9ICYoKnJhdyktPm5leHRfcGh5czsKKwl9CisKKwkvKiBGaXggdXAgdGhlIG9yaWdpbmFsIGplYiBub3cgaXQncyBvbiB0aGUgYmFkX2xpc3QgKi8KKwkqZmlyc3RfcmF3ID0gTlVMTDsKKwlpZiAoZmlyc3RfcmF3ID09ICZqZWItPmZpcnN0X25vZGUpIHsKKwkJamViLT5sYXN0X25vZGUgPSBOVUxMOworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRmFpbGluZyBibG9jayBhdCAlMDh4IGlzIG5vdyBlbXB0eS4gTW92aW5nIHRvIGVyYXNlX3BlbmRpbmdfbGlzdFxuIiwgamViLT5vZmZzZXQpKTsKKwkJbGlzdF9kZWwoJmplYi0+bGlzdCk7CisJCWxpc3RfYWRkKCZqZWItPmxpc3QsICZjLT5lcmFzZV9wZW5kaW5nX2xpc3QpOworCQljLT5ucl9lcmFzaW5nX2Jsb2NrcysrOworCQlqZmZzMl9lcmFzZV9wZW5kaW5nX3RyaWdnZXIoYyk7CisJfQorCWVsc2UKKwkJamViLT5sYXN0X25vZGUgPSBjb250YWluZXJfb2YoZmlyc3RfcmF3LCBzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmLCBuZXh0X3BoeXMpOworCisJQUNDVF9TQU5JVFlfQ0hFQ0soYyxqZWIpOworICAgICAgICBEMShBQ0NUX1BBUkFOT0lBX0NIRUNLKGplYikpOworCisJQUNDVF9TQU5JVFlfQ0hFQ0soYyxuZXdfamViKTsKKyAgICAgICAgRDEoQUNDVF9QQVJBTk9JQV9DSEVDSyhuZXdfamViKSk7CisKKwlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKworCUQxKHByaW50ayhLRVJOX0RFQlVHICJ3YnVmIHJlY292ZXJ5IGNvbXBsZXRlZCBPS1xuIikpOworfQorCisvKiBNZWFuaW5nIG9mIHBhZCBhcmd1bWVudDoKKyAgIDA6IERvIG5vdCBwYWQuIFByb2JhYmx5IHBvaW50bGVzcyAtIHdlIG9ubHkgZXZlciB1c2UgdGhpcyB3aGVuIHdlIGNhbid0IHBhZCBhbnl3YXkuCisgICAxOiBQYWQsIGRvIG5vdCBhZGp1c3QgbmV4dGJsb2NrIGZyZWVfc2l6ZQorICAgMjogUGFkLCBhZGp1c3QgbmV4dGJsb2NrIGZyZWVfc2l6ZQorKi8KKyNkZWZpbmUgTk9QQUQJCTAKKyNkZWZpbmUgUEFEX05PQUNDT1VOVAkxCisjZGVmaW5lIFBBRF9BQ0NPVU5USU5HCTIKKworc3RhdGljIGludCBfX2pmZnMyX2ZsdXNoX3didWYoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIGludCBwYWQpCit7CisJaW50IHJldDsKKwlzaXplX3QgcmV0bGVuOworCisJLyogTm90aGluZyB0byBkbyBpZiBub3QgTkFORCBmbGFzaC4gSW4gcGFydGljdWxhciwgd2Ugc2hvdWxkbid0CisJICAgZGVsX3RpbWVyKCkgdGhlIHRpbWVyIHdlIG5ldmVyIGluaXRpYWxpc2VkLiAqLworCWlmIChqZmZzMl9jYW5fbWFya19vYnNvbGV0ZShjKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWRvd25fdHJ5bG9jaygmYy0+YWxsb2Nfc2VtKSkgeworCQl1cCgmYy0+YWxsb2Nfc2VtKTsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiamZmczJfZmx1c2hfd2J1ZigpIGNhbGxlZCB3aXRoIGFsbG9jX3NlbSBub3QgbG9ja2VkIVxuIik7CisJCUJVRygpOworCX0KKworCWlmKCFjLT53YnVmIHx8ICFjLT53YnVmX2xlbikKKwkJcmV0dXJuIDA7CisKKwkvKiBjbGFpbSByZW1haW5pbmcgc3BhY2Ugb24gdGhlIHBhZ2UKKwkgICB0aGlzIGhhcHBlbnMsIGlmIHdlIGhhdmUgYSBjaGFuZ2UgdG8gYSBuZXcgYmxvY2ssCisJICAgb3IgaWYgZnN5bmMgZm9yY2VzIHVzIHRvIGZsdXNoIHRoZSB3cml0ZWJ1ZmZlci4KKwkgICBpZiB3ZSBoYXZlIGEgc3dpdGNoIHRvIG5leHQgcGFnZSwgd2Ugd2lsbCBub3QgaGF2ZQorCSAgIGVub3VnaCByZW1haW5pbmcgc3BhY2UgZm9yIHRoaXMuIAorCSovCisJaWYgKHBhZCkgeworCQljLT53YnVmX2xlbiA9IFBBRChjLT53YnVmX2xlbik7CisKKwkJLyogUGFkIHdpdGggSkZGUzJfRElSVFlfQklUTUFTSyBpbml0aWFsbHkuICB0aGlzIGhlbHBzIG91dCBFQ0MnZCBOT1IKKwkJICAgd2l0aCA4IGJ5dGUgcGFnZSBzaXplICovCisJCW1lbXNldChjLT53YnVmICsgYy0+d2J1Zl9sZW4sIDAsIGMtPndidWZfcGFnZXNpemUgLSBjLT53YnVmX2xlbik7CisJCQorCQlpZiAoIGMtPndidWZfbGVuICsgc2l6ZW9mKHN0cnVjdCBqZmZzMl91bmtub3duX25vZGUpIDwgYy0+d2J1Zl9wYWdlc2l6ZSkgeworCQkJc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSAqcGFkbm9kZSA9ICh2b2lkICopKGMtPndidWYgKyBjLT53YnVmX2xlbik7CisJCQlwYWRub2RlLT5tYWdpYyA9IGNwdV90b19qZTE2KEpGRlMyX01BR0lDX0JJVE1BU0spOworCQkJcGFkbm9kZS0+bm9kZXR5cGUgPSBjcHVfdG9famUxNihKRkZTMl9OT0RFVFlQRV9QQURESU5HKTsKKwkJCXBhZG5vZGUtPnRvdGxlbiA9IGNwdV90b19qZTMyKGMtPndidWZfcGFnZXNpemUgLSBjLT53YnVmX2xlbik7CisJCQlwYWRub2RlLT5oZHJfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgcGFkbm9kZSwgc2l6ZW9mKCpwYWRub2RlKS00KSk7CisJCX0KKwl9CisJLyogZWxzZSBqZmZzMl9mbGFzaF93cml0ZXYgaGFzIGFjdHVhbGx5IGZpbGxlZCBpbiB0aGUgcmVzdCBvZiB0aGUKKwkgICBidWZmZXIgZm9yIHVzLCBhbmQgd2lsbCBkZWFsIHdpdGggdGhlIG5vZGUgcmVmcyBldGMuIGxhdGVyLiAqLworCQorI2lmZGVmIEJSRUFLTUUKKwlzdGF0aWMgaW50IGJyZWFrbWU7CisJaWYgKGJyZWFrbWUrKyA9PSAyMCkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIkZha2luZyB3cml0ZSBlcnJvciBhdCAweCUwOHhcbiIsIGMtPndidWZfb2ZzKTsKKwkJYnJlYWttZSA9IDA7CisJCWMtPm10ZC0+d3JpdGVfZWNjKGMtPm10ZCwgYy0+d2J1Zl9vZnMsIGMtPndidWZfcGFnZXNpemUsCisJCQkJCSZyZXRsZW4sIGJyb2tlbmJ1ZiwgTlVMTCwgYy0+b29iaW5mbyk7CisJCXJldCA9IC1FSU87CisJfSBlbHNlIAorI2VuZGlmCisJCisJaWYgKGpmZnMyX2NsZWFubWFya2VyX29vYihjKSkKKwkJcmV0ID0gYy0+bXRkLT53cml0ZV9lY2MoYy0+bXRkLCBjLT53YnVmX29mcywgYy0+d2J1Zl9wYWdlc2l6ZSwgJnJldGxlbiwgYy0+d2J1ZiwgTlVMTCwgYy0+b29iaW5mbyk7CisJZWxzZQorCQlyZXQgPSBjLT5tdGQtPndyaXRlKGMtPm10ZCwgYy0+d2J1Zl9vZnMsIGMtPndidWZfcGFnZXNpemUsICZyZXRsZW4sIGMtPndidWYpOworCisJaWYgKHJldCB8fCByZXRsZW4gIT0gYy0+d2J1Zl9wYWdlc2l6ZSkgeworCQlpZiAocmV0KQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiamZmczJfZmx1c2hfd2J1ZigpOiBXcml0ZSBmYWlsZWQgd2l0aCAlZFxuIixyZXQpOworCQllbHNlIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImpmZnMyX2ZsdXNoX3didWYoKTogV3JpdGUgd2FzIHNob3J0OiAlemQgaW5zdGVhZCBvZiAlZFxuIiwKKwkJCQlyZXRsZW4sIGMtPndidWZfcGFnZXNpemUpOworCQkJcmV0ID0gLUVJTzsKKwkJfQorCisJCWpmZnMyX3didWZfcmVjb3ZlcihjKTsKKworCQlyZXR1cm4gcmV0OworCX0KKworCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKworCS8qIEFkanVzdCBmcmVlIHNpemUgb2YgdGhlIGJsb2NrIGlmIHdlIHBhZGRlZC4gKi8KKwlpZiAocGFkKSB7CisJCXN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWI7CisKKwkJamViID0gJmMtPmJsb2Nrc1tjLT53YnVmX29mcyAvIGMtPnNlY3Rvcl9zaXplXTsKKworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZmx1c2hfd2J1ZigpIGFkanVzdGluZyBmcmVlX3NpemUgb2YgJXNibG9jayBhdCAlMDh4XG4iLAorCQkJICAoamViPT1jLT5uZXh0YmxvY2spPyJuZXh0IjoiIiwgamViLT5vZmZzZXQpKTsKKworCQkvKiB3YnVmX3BhZ2VzaXplIC0gd2J1Zl9sZW4gaXMgdGhlIGFtb3VudCBvZiBzcGFjZSB0aGF0J3MgdG8gYmUgCisJCSAgIHBhZGRlZC4gSWYgdGhlcmUgaXMgbGVzcyBmcmVlIHNwYWNlIGluIHRoZSBibG9jayB0aGFuIHRoYXQsCisJCSAgIHNvbWV0aGluZyBzY3Jld2VkIHVwICovCisJCWlmIChqZWItPmZyZWVfc2l6ZSA8IChjLT53YnVmX3BhZ2VzaXplIC0gYy0+d2J1Zl9sZW4pKSB7CisJCQlwcmludGsoS0VSTl9DUklUICJqZmZzMl9mbHVzaF93YnVmKCk6IEFjY291bnRpbmcgZXJyb3IuIHdidWYgYXQgMHglMDh4IGhhcyAweCUwM3ggYnl0ZXMsIDB4JTAzeCBsZWZ0LlxuIiwKKwkJCSAgICAgICBjLT53YnVmX29mcywgYy0+d2J1Zl9sZW4sIGMtPndidWZfcGFnZXNpemUtYy0+d2J1Zl9sZW4pOworCQkJcHJpbnRrKEtFUk5fQ1JJVCAiamZmczJfZmx1c2hfd2J1ZigpOiBCdXQgZnJlZV9zaXplIGZvciBibG9jayBhdCAweCUwOHggaXMgb25seSAweCUwOHhcbiIsCisJCQkgICAgICAgamViLT5vZmZzZXQsIGplYi0+ZnJlZV9zaXplKTsKKwkJCUJVRygpOworCQl9CisJCWplYi0+ZnJlZV9zaXplIC09IChjLT53YnVmX3BhZ2VzaXplIC0gYy0+d2J1Zl9sZW4pOworCQljLT5mcmVlX3NpemUgLT0gKGMtPndidWZfcGFnZXNpemUgLSBjLT53YnVmX2xlbik7CisJCWplYi0+d2FzdGVkX3NpemUgKz0gKGMtPndidWZfcGFnZXNpemUgLSBjLT53YnVmX2xlbik7CisJCWMtPndhc3RlZF9zaXplICs9IChjLT53YnVmX3BhZ2VzaXplIC0gYy0+d2J1Zl9sZW4pOworCX0KKworCS8qIFN0aWNrIGFueSBub3ctb2Jzb2xldGVkIGJsb2NrcyBvbiB0aGUgZXJhc2VfcGVuZGluZ19saXN0ICovCisJamZmczJfcmVmaWxlX3didWZfYmxvY2tzKGMpOworCWpmZnMyX2NsZWFyX3didWZfaW5vX2xpc3QoYyk7CisJc3Bpbl91bmxvY2soJmMtPmVyYXNlX2NvbXBsZXRpb25fbG9jayk7CisKKwltZW1zZXQoYy0+d2J1ZiwweGZmLGMtPndidWZfcGFnZXNpemUpOworCS8qIGFkanVzdCB3cml0ZSBidWZmZXIgb2Zmc2V0LCBlbHNlIHdlIGdldCBhIG5vbiBjb250aWd1b3VzIHdyaXRlIGJ1ZyAqLworCWMtPndidWZfb2ZzICs9IGMtPndidWZfcGFnZXNpemU7CisJYy0+d2J1Zl9sZW4gPSAwOworCXJldHVybiAwOworfQorCisvKiBUcmlnZ2VyIGdhcmJhZ2UgY29sbGVjdGlvbiB0byBmbHVzaCB0aGUgd3JpdGUtYnVmZmVyLiAKKyAgIElmIGlubyBhcmcgaXMgemVybywgZG8gaXQgaWYgX2FueV8gcmVhbCAoaS5lLiBub3QgR0MpIHdyaXRlcyBhcmUKKyAgIG91dHN0YW5kaW5nLiBJZiBpbm8gYXJnIG5vbi16ZXJvLCBkbyBpdCBvbmx5IGlmIGEgd3JpdGUgZm9yIHRoZSAKKyAgIGdpdmVuIGlub2RlIGlzIG91dHN0YW5kaW5nLiAqLworaW50IGpmZnMyX2ZsdXNoX3didWZfZ2Moc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHVpbnQzMl90IGlubykKK3sKKwl1aW50MzJfdCBvbGRfd2J1Zl9vZnM7CisJdWludDMyX3Qgb2xkX3didWZfbGVuOworCWludCByZXQgPSAwOworCisJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2ZsdXNoX3didWZfZ2MoKSBjYWxsZWQgZm9yIGlubyAjJXUuLi5cbiIsIGlubykpOworCisJZG93bigmYy0+YWxsb2Nfc2VtKTsKKwlpZiAoIWpmZnMyX3didWZfcGVuZGluZ19mb3JfaW5vKGMsIGlubykpIHsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIklubyAjJWQgbm90IHBlbmRpbmcgaW4gd2J1Zi4gUmV0dXJuaW5nXG4iLCBpbm8pKTsKKwkJdXAoJmMtPmFsbG9jX3NlbSk7CisJCXJldHVybiAwOworCX0KKworCW9sZF93YnVmX29mcyA9IGMtPndidWZfb2ZzOworCW9sZF93YnVmX2xlbiA9IGMtPndidWZfbGVuOworCisJaWYgKGMtPnVuY2hlY2tlZF9zaXplKSB7CisJCS8qIEdDIHdvbid0IG1ha2UgYW55IHByb2dyZXNzIGZvciBhIHdoaWxlICovCisJCUQxKHByaW50ayhLRVJOX0RFQlVHICJqZmZzMl9mbHVzaF93YnVmX2djKCkgcGFkZGluZy4gTm90IGZpbmlzaGVkIGNoZWNraW5nXG4iKSk7CisJCWRvd25fd3JpdGUoJmMtPndidWZfc2VtKTsKKwkJcmV0ID0gX19qZmZzMl9mbHVzaF93YnVmKGMsIFBBRF9BQ0NPVU5USU5HKTsKKwkJdXBfd3JpdGUoJmMtPndidWZfc2VtKTsKKwl9IGVsc2Ugd2hpbGUgKG9sZF93YnVmX2xlbiAmJgorCQkgICAgICBvbGRfd2J1Zl9vZnMgPT0gYy0+d2J1Zl9vZnMpIHsKKworCQl1cCgmYy0+YWxsb2Nfc2VtKTsKKworCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZmx1c2hfd2J1Zl9nYygpIGNhbGxzIGdjIHBhc3NcbiIpKTsKKworCQlyZXQgPSBqZmZzMl9nYXJiYWdlX2NvbGxlY3RfcGFzcyhjKTsKKwkJaWYgKHJldCkgeworCQkJLyogR0MgZmFpbGVkLiBGbHVzaCBpdCB3aXRoIHBhZGRpbmcgaW5zdGVhZCAqLworCQkJZG93bigmYy0+YWxsb2Nfc2VtKTsKKwkJCWRvd25fd3JpdGUoJmMtPndidWZfc2VtKTsKKwkJCXJldCA9IF9famZmczJfZmx1c2hfd2J1ZihjLCBQQURfQUNDT1VOVElORyk7CisJCQl1cF93cml0ZSgmYy0+d2J1Zl9zZW0pOworCQkJYnJlYWs7CisJCX0KKwkJZG93bigmYy0+YWxsb2Nfc2VtKTsKKwl9CisKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZmx1c2hfd2J1Zl9nYygpIGVuZHMuLi5cbiIpKTsKKworCXVwKCZjLT5hbGxvY19zZW0pOworCXJldHVybiByZXQ7Cit9CisKKy8qIFBhZCB3cml0ZS1idWZmZXIgdG8gZW5kIGFuZCB3cml0ZSBpdCwgd2FzdGluZyBzcGFjZS4gKi8KK2ludCBqZmZzMl9mbHVzaF93YnVmX3BhZChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYykKK3sKKwlpbnQgcmV0OworCisJZG93bl93cml0ZSgmYy0+d2J1Zl9zZW0pOworCXJldCA9IF9famZmczJfZmx1c2hfd2J1ZihjLCBQQURfTk9BQ0NPVU5UKTsKKwl1cF93cml0ZSgmYy0+d2J1Zl9zZW0pOworCisJcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBQQUdFX0RJVih4KSAoICh4KSAmICh+KGMtPndidWZfcGFnZXNpemUgLSAxKSkgKQorI2RlZmluZSBQQUdFX01PRCh4KSAoICh4KSAmIChjLT53YnVmX3BhZ2VzaXplIC0gMSkgKQoraW50IGpmZnMyX2ZsYXNoX3dyaXRldihzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgY29uc3Qgc3RydWN0IGt2ZWMgKmludmVjcywgdW5zaWduZWQgbG9uZyBjb3VudCwgbG9mZl90IHRvLCBzaXplX3QgKnJldGxlbiwgdWludDMyX3QgaW5vKQoreworCXN0cnVjdCBrdmVjIG91dHZlY3NbM107CisJdWludDMyX3QgdG90bGVuID0gMDsKKwl1aW50MzJfdCBzcGxpdF9vZnMgPSAwOworCXVpbnQzMl90IG9sZF90b3RsZW47CisJaW50IHJldCwgc3BsaXR2ZWMgPSAtMTsKKwlpbnQgaW52ZWMsIG91dHZlYzsKKwlzaXplX3Qgd2J1Zl9yZXRsZW47CisJdW5zaWduZWQgY2hhciAqd2J1Zl9wdHI7CisJc2l6ZV90IGRvbmVsZW4gPSAwOworCXVpbnQzMl90IG91dHZlY190byA9IHRvOworCisJLyogSWYgbm90IE5BTkQgZmxhc2gsIGRvbid0IGJvdGhlciAqLworCWlmICghYy0+d2J1ZikKKwkJcmV0dXJuIGpmZnMyX2ZsYXNoX2RpcmVjdF93cml0ZXYoYywgaW52ZWNzLCBjb3VudCwgdG8sIHJldGxlbik7CisJCisJZG93bl93cml0ZSgmYy0+d2J1Zl9zZW0pOworCisJLyogSWYgd2J1Zl9vZnMgaXMgbm90IGluaXRpYWxpemVkLCBzZXQgaXQgdG8gdGFyZ2V0IGFkZHJlc3MgKi8KKwlpZiAoYy0+d2J1Zl9vZnMgPT0gMHhGRkZGRkZGRikgeworCQljLT53YnVmX29mcyA9IFBBR0VfRElWKHRvKTsKKwkJYy0+d2J1Zl9sZW4gPSBQQUdFX01PRCh0byk7CQkJCisJCW1lbXNldChjLT53YnVmLDB4ZmYsYy0+d2J1Zl9wYWdlc2l6ZSk7CisJfQorCisJLyogRml4dXAgdGhlIHdidWYgaWYgd2UgYXJlIG1vdmluZyB0byBhIG5ldyBlcmFzZWJsb2NrLiAgVGhlIGNoZWNrcyBiZWxvdworCSAgIGZhaWwgZm9yIEVDQydkIE5PUiBiZWNhdXNlIGNsZWFubWFya2VyID09IDE2LCBzbyBhIGJsb2NrIHN0YXJ0cyBhdAorCSAgIHh4eDAwMTAuICAqLworCWlmIChqZmZzMl9ub3JfZWNjKGMpKSB7CisJCWlmICgoKGMtPndidWZfb2ZzICUgYy0+c2VjdG9yX3NpemUpID09IDApICYmICFjLT53YnVmX2xlbikgeworCQkJYy0+d2J1Zl9vZnMgPSBQQUdFX0RJVih0byk7CisJCQljLT53YnVmX2xlbiA9IFBBR0VfTU9EKHRvKTsKKwkJCW1lbXNldChjLT53YnVmLDB4ZmYsYy0+d2J1Zl9wYWdlc2l6ZSk7CisJCX0KKwl9CisJCisJLyogU2FuaXR5IGNoZWNrcyBvbiB0YXJnZXQgYWRkcmVzcy4gCisJICAgSXQncyBwZXJtaXR0ZWQgdG8gd3JpdGUgYXQgUEFEKGMtPndidWZfbGVuK2MtPndidWZfb2ZzKSwgCisJICAgYW5kIGl0J3MgcGVybWl0dGVkIHRvIHdyaXRlIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBuZXcgCisJICAgZXJhc2UgYmxvY2suIEFueXRoaW5nIGVsc2UsIGFuZCB5b3UgZGllLgorCSAgIE5ldyBibG9jayBzdGFydHMgYXQgeHh4MDAwYyAoMC1iID0gYmxvY2sgaGVhZGVyKQorCSovCisJaWYgKCAodG8gJiB+KGMtPnNlY3Rvcl9zaXplLTEpKSAhPSAoYy0+d2J1Zl9vZnMgJiB+KGMtPnNlY3Rvcl9zaXplLTEpKSApIHsKKwkJLyogSXQncyBhIHdyaXRlIHRvIGEgbmV3IGJsb2NrICovCisJCWlmIChjLT53YnVmX2xlbikgeworCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2ZsYXNoX3dyaXRldigpIHRvIDB4JWx4IGNhdXNlcyBmbHVzaCBvZiB3YnVmIGF0IDB4JTA4eFxuIiwgKHVuc2lnbmVkIGxvbmcpdG8sIGMtPndidWZfb2ZzKSk7CisJCQlyZXQgPSBfX2pmZnMyX2ZsdXNoX3didWYoYywgUEFEX05PQUNDT1VOVCk7CisJCQlpZiAocmV0KSB7CisJCQkJLyogdGhlIHVuZGVybHlpbmcgbGF5ZXIgaGFzIHRvIGNoZWNrIHdidWZfbGVuIHRvIGRvIHRoZSBjbGVhbnVwICovCisJCQkJRDEocHJpbnRrKEtFUk5fV0FSTklORyAiamZmczJfZmx1c2hfd2J1ZigpIGNhbGxlZCBmcm9tIGpmZnMyX2ZsYXNoX3dyaXRldigpIGZhaWxlZCAlZFxuIiwgcmV0KSk7CisJCQkJKnJldGxlbiA9IDA7CisJCQkJZ290byBleGl0OworCQkJfQorCQl9CisJCS8qIHNldCBwb2ludGVyIHRvIG5ldyBibG9jayAqLworCQljLT53YnVmX29mcyA9IFBBR0VfRElWKHRvKTsKKwkJYy0+d2J1Zl9sZW4gPSBQQUdFX01PRCh0byk7CQkJCisJfSAKKworCWlmICh0byAhPSBQQUQoYy0+d2J1Zl9vZnMgKyBjLT53YnVmX2xlbikpIHsKKwkJLyogV2UncmUgbm90IHdyaXRpbmcgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHdyaXRlYnVmZmVyLiBCYWQuICovCisJCXByaW50ayhLRVJOX0NSSVQgImpmZnMyX2ZsYXNoX3dyaXRldigpOiBOb24tY29udGlndW91cyB3cml0ZSB0byAlMDhseFxuIiwgKHVuc2lnbmVkIGxvbmcpdG8pOworCQlpZiAoYy0+d2J1Zl9sZW4pCisJCQlwcmludGsoS0VSTl9DUklUICJ3YnVmIHdhcyBwcmV2aW91c2x5ICUwOHgtJTA4eFxuIiwKKwkJCQkJICBjLT53YnVmX29mcywgYy0+d2J1Zl9vZnMrYy0+d2J1Zl9sZW4pOworCQlCVUcoKTsKKwl9CisKKwkvKiBOb3RlIG91dHZlY3NbM10gYWJvdmUuIFdlIGtub3cgY291bnQgaXMgbmV2ZXIgZ3JlYXRlciB0aGFuIDIgKi8KKwlpZiAoY291bnQgPiAyKSB7CisJCXByaW50ayhLRVJOX0NSSVQgImpmZnMyX2ZsYXNoX3dyaXRldigpOiBjb3VudCBpcyAlbGRcbiIsIGNvdW50KTsKKwkJQlVHKCk7CisJfQorCisJaW52ZWMgPSAwOworCW91dHZlYyA9IDA7CisKKwkvKiBGaWxsIHdyaXRlYnVmZmVyIGZpcnN0LCBpZiBhbHJlYWR5IGluIHVzZSAqLwkKKwlpZiAoYy0+d2J1Zl9sZW4pIHsKKwkJdWludDMyX3QgaW52ZWNfb2ZzID0gMDsKKworCQkvKiBhZGp1c3QgYWxpZ25tZW50IG9mZnNldCAqLyAKKwkJaWYgKGMtPndidWZfbGVuICE9IFBBR0VfTU9EKHRvKSkgeworCQkJYy0+d2J1Zl9sZW4gPSBQQUdFX01PRCh0byk7CisJCQkvKiB0YWtlIGNhcmUgb2YgYWxpZ25tZW50IHRvIG5leHQgcGFnZSAqLworCQkJaWYgKCFjLT53YnVmX2xlbikKKwkJCQljLT53YnVmX2xlbiA9IGMtPndidWZfcGFnZXNpemU7CisJCX0KKwkJCisJCXdoaWxlKGMtPndidWZfbGVuIDwgYy0+d2J1Zl9wYWdlc2l6ZSkgeworCQkJdWludDMyX3QgdGhpc2xlbjsKKwkJCQorCQkJaWYgKGludmVjID09IGNvdW50KQorCQkJCWdvdG8gYWxsZG9uZTsKKworCQkJdGhpc2xlbiA9IGMtPndidWZfcGFnZXNpemUgLSBjLT53YnVmX2xlbjsKKworCQkJaWYgKHRoaXNsZW4gPj0gaW52ZWNzW2ludmVjXS5pb3ZfbGVuKQorCQkJCXRoaXNsZW4gPSBpbnZlY3NbaW52ZWNdLmlvdl9sZW47CisJCisJCQlpbnZlY19vZnMgPSB0aGlzbGVuOworCisJCQltZW1jcHkoYy0+d2J1ZiArIGMtPndidWZfbGVuLCBpbnZlY3NbaW52ZWNdLmlvdl9iYXNlLCB0aGlzbGVuKTsKKwkJCWMtPndidWZfbGVuICs9IHRoaXNsZW47CisJCQlkb25lbGVuICs9IHRoaXNsZW47CisJCQkvKiBHZXQgbmV4dCBpbnZlYywgaWYgYWN0dWFsIGRpZCBub3QgZmlsbCB0aGUgYnVmZmVyICovCisJCQlpZiAoYy0+d2J1Zl9sZW4gPCBjLT53YnVmX3BhZ2VzaXplKSAKKwkJCQlpbnZlYysrOworCQl9CQkJCisJCQorCQkvKiB3cml0ZSBidWZmZXIgaXMgZnVsbCwgZmx1c2ggYnVmZmVyICovCisJCXJldCA9IF9famZmczJfZmx1c2hfd2J1ZihjLCBOT1BBRCk7CisJCWlmIChyZXQpIHsKKwkJCS8qIHRoZSB1bmRlcmx5aW5nIGxheWVyIGhhcyB0byBjaGVjayB3YnVmX2xlbiB0byBkbyB0aGUgY2xlYW51cCAqLworCQkJRDEocHJpbnRrKEtFUk5fV0FSTklORyAiamZmczJfZmx1c2hfd2J1ZigpIGNhbGxlZCBmcm9tIGpmZnMyX2ZsYXNoX3dyaXRldigpIGZhaWxlZCAlZFxuIiwgcmV0KSk7CisJCQkvKiBSZXRsZW4gemVybyB0byBtYWtlIHN1cmUgb3VyIGNhbGxlciBkb2Vzbid0IG1hcmsgdGhlIHNwYWNlIGRpcnR5LgorCQkJICAgV2UndmUgYWxyZWFkeSBkb25lIGV2ZXJ5dGhpbmcgdGhhdCdzIG5lY2Vzc2FyeSAqLworCQkJKnJldGxlbiA9IDA7CisJCQlnb3RvIGV4aXQ7CisJCX0KKwkJb3V0dmVjX3RvICs9IGRvbmVsZW47CisJCWMtPndidWZfb2ZzID0gb3V0dmVjX3RvOworCisJCS8qIEFsbCBpbnZlY3MgZG9uZSA/ICovCisJCWlmIChpbnZlYyA9PSBjb3VudCkKKwkJCWdvdG8gYWxsZG9uZTsKKworCQkvKiBTZXQgdXAgdGhlIGZpcnN0IG91dHZlYywgY29udGFpbmluZyB0aGUgcmVtYWluZGVyIG9mIHRoZQorCQkgICBpbnZlYyB3ZSBwYXJ0aWFsbHkgdXNlZCAqLworCQlpZiAoaW52ZWNzW2ludmVjXS5pb3ZfbGVuID4gaW52ZWNfb2ZzKSB7CisJCQlvdXR2ZWNzWzBdLmlvdl9iYXNlID0gaW52ZWNzW2ludmVjXS5pb3ZfYmFzZStpbnZlY19vZnM7CisJCQl0b3RsZW4gPSBvdXR2ZWNzWzBdLmlvdl9sZW4gPSBpbnZlY3NbaW52ZWNdLmlvdl9sZW4taW52ZWNfb2ZzOworCQkJaWYgKHRvdGxlbiA+IGMtPndidWZfcGFnZXNpemUpIHsKKwkJCQlzcGxpdHZlYyA9IG91dHZlYzsKKwkJCQlzcGxpdF9vZnMgPSBvdXR2ZWNzWzBdLmlvdl9sZW4gLSBQQUdFX01PRCh0b3RsZW4pOworCQkJfQorCQkJb3V0dmVjKys7CisJCX0KKwkJaW52ZWMrKzsKKwl9CisKKwkvKiBPSywgbm93IHdlJ3ZlIGZsdXNoZWQgdGhlIHdidWYgYW5kIHRoZSBzdGFydCBvZiB0aGUgYml0cworCSAgIHdlIGhhdmUgYmVlbiBhc2tlZCB0byB3cml0ZSwgbm93IHRvIHdyaXRlIHRoZSByZXN0Li4uLiAqLworCisJLyogdG90bGVuIGhvbGRzIHRoZSBhbW91bnQgb2YgZGF0YSBzdGlsbCB0byBiZSB3cml0dGVuICovCisJb2xkX3RvdGxlbiA9IHRvdGxlbjsKKwlmb3IgKCA7IGludmVjIDwgY291bnQ7IGludmVjKyssb3V0dmVjKysgKSB7CisJCW91dHZlY3Nbb3V0dmVjXS5pb3ZfYmFzZSA9IGludmVjc1tpbnZlY10uaW92X2Jhc2U7CisJCXRvdGxlbiArPSBvdXR2ZWNzW291dHZlY10uaW92X2xlbiA9IGludmVjc1tpbnZlY10uaW92X2xlbjsKKwkJaWYgKFBBR0VfRElWKHRvdGxlbikgIT0gUEFHRV9ESVYob2xkX3RvdGxlbikpIHsKKwkJCXNwbGl0dmVjID0gb3V0dmVjOworCQkJc3BsaXRfb2ZzID0gb3V0dmVjc1tvdXR2ZWNdLmlvdl9sZW4gLSBQQUdFX01PRCh0b3RsZW4pOworCQkJb2xkX3RvdGxlbiA9IHRvdGxlbjsKKwkJfQorCX0KKworCS8qIE5vdyB0aGUgb3V0dmVjcyBhcnJheSBob2xkcyBhbGwgdGhlIHJlbWFpbmluZyBkYXRhIHRvIHdyaXRlICovCisJLyogVXAgdG8gc3BsaXR2ZWMsc3BsaXRfb2ZzIGlzIHRvIGJlIHdyaXR0ZW4gaW1tZWRpYXRlbHkuIFRoZSByZXN0CisJICAgZ29lcyBpbnRvIHRoZSAobm93LWVtcHR5KSB3YnVmICovCisKKwlpZiAoc3BsaXR2ZWMgIT0gLTEpIHsKKwkJdWludDMyX3QgcmVtYWluZGVyOworCisJCXJlbWFpbmRlciA9IG91dHZlY3Nbc3BsaXR2ZWNdLmlvdl9sZW4gLSBzcGxpdF9vZnM7CisJCW91dHZlY3Nbc3BsaXR2ZWNdLmlvdl9sZW4gPSBzcGxpdF9vZnM7CisKKwkJLyogV2UgZGlkIGNyb3NzIGEgcGFnZSBib3VuZGFyeSwgc28gd2Ugd3JpdGUgc29tZSBub3cgKi8KKwkJaWYgKGpmZnMyX2NsZWFubWFya2VyX29vYihjKSkKKwkJCXJldCA9IGMtPm10ZC0+d3JpdGV2X2VjYyhjLT5tdGQsIG91dHZlY3MsIHNwbGl0dmVjKzEsIG91dHZlY190bywgJndidWZfcmV0bGVuLCBOVUxMLCBjLT5vb2JpbmZvKTsgCisJCWVsc2UKKwkJCXJldCA9IGpmZnMyX2ZsYXNoX2RpcmVjdF93cml0ZXYoYywgb3V0dmVjcywgc3BsaXR2ZWMrMSwgb3V0dmVjX3RvLCAmd2J1Zl9yZXRsZW4pOworCQkKKwkJaWYgKHJldCA8IDAgfHwgd2J1Zl9yZXRsZW4gIT0gUEFHRV9ESVYodG90bGVuKSkgeworCQkJLyogQXQgdGhpcyBwb2ludCB3ZSBoYXZlIG5vIHByb2JsZW0sCisJCQkgICBjLT53YnVmIGlzIGVtcHR5LiAKKwkJCSovCisJCQkqcmV0bGVuID0gZG9uZWxlbjsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCQkKKwkJZG9uZWxlbiArPSB3YnVmX3JldGxlbjsKKwkJYy0+d2J1Zl9vZnMgPSBQQUdFX0RJVihvdXR2ZWNfdG8pICsgUEFHRV9ESVYodG90bGVuKTsKKworCQlpZiAocmVtYWluZGVyKSB7CisJCQlvdXR2ZWNzW3NwbGl0dmVjXS5pb3ZfYmFzZSArPSBzcGxpdF9vZnM7CisJCQlvdXR2ZWNzW3NwbGl0dmVjXS5pb3ZfbGVuID0gcmVtYWluZGVyOworCQl9IGVsc2UgeworCQkJc3BsaXR2ZWMrKzsKKwkJfQorCisJfSBlbHNlIHsKKwkJc3BsaXR2ZWMgPSAwOworCX0KKworCS8qIE5vdyBzcGxpdHZlYyBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBiaXRzIHdlIGhhdmUgdG8gY29weQorCSAgIGludG8gdGhlIHdidWYgKi8KKwl3YnVmX3B0ciA9IGMtPndidWY7CisKKwlmb3IgKCA7IHNwbGl0dmVjIDwgb3V0dmVjOyBzcGxpdHZlYysrKSB7CisJCS8qIERvbid0IGNvcHkgdGhlIHdidWYgaW50byBpdHNlbGYgKi8KKwkJaWYgKG91dHZlY3Nbc3BsaXR2ZWNdLmlvdl9iYXNlID09IGMtPndidWYpCisJCQljb250aW51ZTsKKwkJbWVtY3B5KHdidWZfcHRyLCBvdXR2ZWNzW3NwbGl0dmVjXS5pb3ZfYmFzZSwgb3V0dmVjc1tzcGxpdHZlY10uaW92X2xlbik7CisJCXdidWZfcHRyICs9IG91dHZlY3Nbc3BsaXR2ZWNdLmlvdl9sZW47CisJCWRvbmVsZW4gKz0gb3V0dmVjc1tzcGxpdHZlY10uaW92X2xlbjsKKwl9CisJYy0+d2J1Zl9sZW4gPSB3YnVmX3B0ciAtIGMtPndidWY7CisKKwkvKiBJZiB0aGVyZSdzIGEgcmVtYWluZGVyIGluIHRoZSB3YnVmIGFuZCBpdCdzIGEgbm9uLUdDIHdyaXRlLAorCSAgIHJlbWVtYmVyIHRoYXQgdGhlIHdidWYgYWZmZWN0cyB0aGlzIGlubyAqLworYWxsZG9uZToKKwkqcmV0bGVuID0gZG9uZWxlbjsKKworCWlmIChjLT53YnVmX2xlbiAmJiBpbm8pCisJCWpmZnMyX3didWZfZGlydGllc19pbm9kZShjLCBpbm8pOworCisJcmV0ID0gMDsKKwkKK2V4aXQ6CisJdXBfd3JpdGUoJmMtPndidWZfc2VtKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICoJVGhpcyBpcyB0aGUgZW50cnkgZm9yIGZsYXNoIHdyaXRlLgorICoJQ2hlY2ssIGlmIHdlIHdvcmsgb24gTkFORCBGTEFTSCwgaWYgc28gYnVpbGQgYW4ga3ZlYyBhbmQgd3JpdGUgaXQgdmlhIHZyaXRldgorKi8KK2ludCBqZmZzMl9mbGFzaF93cml0ZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgbG9mZl90IG9mcywgc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sIGNvbnN0IHVfY2hhciAqYnVmKQoreworCXN0cnVjdCBrdmVjIHZlY3NbMV07CisKKwlpZiAoamZmczJfY2FuX21hcmtfb2Jzb2xldGUoYykpCisJCXJldHVybiBjLT5tdGQtPndyaXRlKGMtPm10ZCwgb2ZzLCBsZW4sIHJldGxlbiwgYnVmKTsKKworCXZlY3NbMF0uaW92X2Jhc2UgPSAodW5zaWduZWQgY2hhciAqKSBidWY7CisJdmVjc1swXS5pb3ZfbGVuID0gbGVuOworCXJldHVybiBqZmZzMl9mbGFzaF93cml0ZXYoYywgdmVjcywgMSwgb2ZzLCByZXRsZW4sIDApOworfQorCisvKgorCUhhbmRsZSByZWFkYmFjayBmcm9tIHdyaXRlYnVmZmVyIGFuZCBFQ0MgZmFpbHVyZSByZXR1cm4KKyovCitpbnQgamZmczJfZmxhc2hfcmVhZChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgbG9mZl90IG9mcywgc2l6ZV90IGxlbiwgc2l6ZV90ICpyZXRsZW4sIHVfY2hhciAqYnVmKQoreworCWxvZmZfdAlvcmJmID0gMCwgb3diZiA9IDAsIGx3YmYgPSAwOworCWludAlyZXQ7CisKKwkvKiBSZWFkIGZsYXNoICovCisJaWYgKCFqZmZzMl9jYW5fbWFya19vYnNvbGV0ZShjKSkgeworCQlkb3duX3JlYWQoJmMtPndidWZfc2VtKTsKKworCQlpZiAoamZmczJfY2xlYW5tYXJrZXJfb29iKGMpKQorCQkJcmV0ID0gYy0+bXRkLT5yZWFkX2VjYyhjLT5tdGQsIG9mcywgbGVuLCByZXRsZW4sIGJ1ZiwgTlVMTCwgYy0+b29iaW5mbyk7CisJCWVsc2UKKwkJCXJldCA9IGMtPm10ZC0+cmVhZChjLT5tdGQsIG9mcywgbGVuLCByZXRsZW4sIGJ1Zik7CisKKwkJaWYgKCAocmV0ID09IC1FQkFETVNHKSAmJiAoKnJldGxlbiA9PSBsZW4pICkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibXRkLT5yZWFkKDB4JXp4IGJ5dGVzIGZyb20gMHglbGx4KSByZXR1cm5lZCBFQ0MgZXJyb3JcbiIsCisJCQkgICAgICAgbGVuLCBvZnMpOworCQkJLyogCisJCQkgKiBXZSBoYXZlIHRoZSByYXcgZGF0YSB3aXRob3V0IEVDQyBjb3JyZWN0aW9uIGluIHRoZSBidWZmZXIsIG1heWJlIAorCQkJICogd2UgYXJlIGx1Y2t5IGFuZCBhbGwgZGF0YSBvciBwYXJ0cyBhcmUgY29ycmVjdC4gV2UgY2hlY2sgdGhlIG5vZGUuCisJCQkgKiBJZiBkYXRhIGFyZSBjb3JydXB0ZWQgbm9kZSBjaGVjayB3aWxsIHNvcnQgaXQgb3V0LgorCQkJICogV2Uga2VlcCB0aGlzIGJsb2NrLCBpdCB3aWxsIGZhaWwgb24gd3JpdGUgb3IgZXJhc2UgYW5kIHRoZSB3ZQorCQkJICogbWFyayBpdCBiYWQuIE9yIHNob3VsZCB3ZSBkbyB0aGF0IG5vdz8gQnV0IHdlIHNob3VsZCBnaXZlIGhpbSBhIGNoYW5jZS4KKwkJCSAqIE1heWJlIHdlIGhhZCBhIHN5c3RlbSBjcmFzaCBvciBwb3dlciBsb3NzIGJlZm9yZSB0aGUgZWNjIHdyaXRlIG9yICAKKwkJCSAqIGEgZXJhc2Ugd2FzIGNvbXBsZXRlZC4KKwkJCSAqIFNvIHdlIHJldHVybiBzdWNjZXNzLiA6KQorCQkJICovCisJCSAJcmV0ID0gMDsKKwkJIH0JCisJfSBlbHNlCisJCXJldHVybiBjLT5tdGQtPnJlYWQoYy0+bXRkLCBvZnMsIGxlbiwgcmV0bGVuLCBidWYpOworCisJLyogaWYgbm8gd3JpdGVidWZmZXIgYXZhaWxhYmxlIG9yIHdyaXRlIGJ1ZmZlciBlbXB0eSwgcmV0dXJuICovCisJaWYgKCFjLT53YnVmX3BhZ2VzaXplIHx8ICFjLT53YnVmX2xlbikKKwkJZ290byBleGl0OworCisJLyogaWYgd2UgcmVhZCBpbiBhIGRpZmZlcmVudCBibG9jaywgcmV0dXJuICovCisJaWYgKCAob2ZzICYgfihjLT5zZWN0b3Jfc2l6ZS0xKSkgIT0gKGMtPndidWZfb2ZzICYgfihjLT5zZWN0b3Jfc2l6ZS0xKSkgKSAKKwkJZ290byBleGl0OworCisJaWYgKG9mcyA+PSBjLT53YnVmX29mcykgeworCQlvd2JmID0gKG9mcyAtIGMtPndidWZfb2ZzKTsJLyogb2Zmc2V0IGluIHdyaXRlIGJ1ZmZlciAqLworCQlpZiAob3diZiA+IGMtPndidWZfbGVuKQkJLyogaXMgcmVhZCBiZXlvbmQgd3JpdGUgYnVmZmVyID8gKi8KKwkJCWdvdG8gZXhpdDsKKwkJbHdiZiA9IGMtPndidWZfbGVuIC0gb3diZjsJLyogbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkgKi8KKwkJaWYgKGx3YmYgPiBsZW4pCQorCQkJbHdiZiA9IGxlbjsKKwl9IGVsc2UgewkKKwkJb3JiZiA9IChjLT53YnVmX29mcyAtIG9mcyk7CS8qIG9mZnNldCBpbiByZWFkIGJ1ZmZlciAqLworCQlpZiAob3JiZiA+IGxlbikJCQkvKiBpcyB3cml0ZSBiZXlvbmQgd3JpdGUgYnVmZmVyID8gKi8KKwkJCWdvdG8gZXhpdDsKKwkJbHdiZiA9IGxlbiAtIG9yYmY7IAkJLyogbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkgKi8KKwkJaWYgKGx3YmYgPiBjLT53YnVmX2xlbikJCisJCQlsd2JmID0gYy0+d2J1Zl9sZW47CisJfQkKKwlpZiAobHdiZiA+IDApCisJCW1lbWNweShidWYrb3JiZixjLT53YnVmK293YmYsbHdiZik7CisKK2V4aXQ6CisJdXBfcmVhZCgmYy0+d2J1Zl9zZW0pOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKglDaGVjaywgaWYgdGhlIG91dCBvZiBiYW5kIGFyZWEgaXMgZW1wdHkKKyAqLworaW50IGpmZnMyX2NoZWNrX29vYl9lbXB0eSggc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9lcmFzZWJsb2NrICpqZWIsIGludCBtb2RlKQoreworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwlpbnQgCXJldCA9IDA7CisJaW50CWksbGVuLHBhZ2U7CisJc2l6ZV90ICByZXRsZW47CisJaW50CW9vYl9zaXplOworCisJLyogYWxsb2NhdGUgYSBidWZmZXIgZm9yIGFsbCBvb2IgZGF0YSBpbiB0aGlzIHNlY3RvciAqLworCW9vYl9zaXplID0gYy0+bXRkLT5vb2JzaXplOworCWxlbiA9IDQgKiBvb2Jfc2l6ZTsKKwlidWYgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJqZmZzMl9jaGVja19vb2JfZW1wdHkoKTogYWxsb2NhdGlvbiBvZiB0ZW1wb3JhcnkgZGF0YSBidWZmZXIgZm9yIG9vYiBjaGVjayBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLyogCisJICogaWYgbW9kZSA9IDAsIHdlIHNjYW4gZm9yIGEgdG90YWwgZW1wdHkgb29iIGFyZWEsIGVsc2Ugd2UgaGF2ZQorCSAqIHRvIHRha2UgY2FyZSBvZiB0aGUgY2xlYW5tYXJrZXIgaW4gdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIGJsb2NrCisJKi8KKwlyZXQgPSBqZmZzMl9mbGFzaF9yZWFkX29vYihjLCBqZWItPm9mZnNldCwgbGVuICwgJnJldGxlbiwgYnVmKTsKKwlpZiAocmV0KSB7CisJCUQxKHByaW50ayhLRVJOX1dBUk5JTkcgImpmZnMyX2NoZWNrX29vYl9lbXB0eSgpOiBSZWFkIE9PQiBmYWlsZWQgJWQgZm9yIGJsb2NrIGF0ICUwOHhcbiIsIHJldCwgamViLT5vZmZzZXQpKTsKKwkJZ290byBvdXQ7CisJfQorCQorCWlmIChyZXRsZW4gPCBsZW4pIHsKKwkJRDEocHJpbnRrKEtFUk5fV0FSTklORyAiamZmczJfY2hlY2tfb29iX2VtcHR5KCk6IFJlYWQgT09CIHJldHVybiBzaG9ydCByZWFkICIKKwkJCSAgIiglemQgYnl0ZXMgbm90ICVkKSBmb3IgYmxvY2sgYXQgJTA4eFxuIiwgcmV0bGVuLCBsZW4sIGplYi0+b2Zmc2V0KSk7CisJCXJldCA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKwkKKwkvKiBTcGVjaWFsIGNoZWNrIGZvciBmaXJzdCBwYWdlICovCisJZm9yKGkgPSAwOyBpIDwgb29iX3NpemUgOyBpKyspIHsKKwkJLyogWWVhaCwgd2Uga25vdyBhYm91dCB0aGUgY2xlYW5tYXJrZXIuICovCisJCWlmIChtb2RlICYmIGkgPj0gYy0+ZnNkYXRhX3BvcyAmJiAKKwkJICAgIGkgPCBjLT5mc2RhdGFfcG9zICsgYy0+ZnNkYXRhX2xlbikKKwkJCWNvbnRpbnVlOworCisJCWlmIChidWZbaV0gIT0gMHhGRikgeworCQkJRDIocHJpbnRrKEtFUk5fREVCVUcgIkZvdW5kICUwMnggYXQgJXggaW4gT09CIGZvciAlMDh4XG4iLAorCQkJCSAgYnVmW3BhZ2UraV0sIHBhZ2UraSwgamViLT5vZmZzZXQpKTsKKwkJCXJldCA9IDE7IAorCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwkvKiB3ZSBrbm93LCB3ZSBhcmUgYWxpZ25lZCA6KSAqLwkKKwlmb3IgKHBhZ2UgPSBvb2Jfc2l6ZTsgcGFnZSA8IGxlbjsgcGFnZSArPSBzaXplb2YobG9uZykpIHsKKwkJdW5zaWduZWQgbG9uZyBkYXQgPSAqKHVuc2lnbmVkIGxvbmcgKikoJmJ1ZltwYWdlXSk7CisJCWlmKGRhdCAhPSAtMSkgeworCQkJcmV0ID0gMTsgCisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworb3V0OgorCWtmcmVlKGJ1Zik7CQorCQorCXJldHVybiByZXQ7Cit9CisKKy8qCisqCVNjYW4gZm9yIGEgdmFsaWQgY2xlYW5tYXJrZXIgYW5kIGZvciBiYWQgYmxvY2tzCisqCUZvciB2aXJ0dWFsIGJsb2NrcyAoY29uY2F0ZW5hdGVkIHBoeXNpY2FsIGJsb2NrcykgY2hlY2sgdGhlIGNsZWFubWFya2VyCisqCW9ubHkgaW4gdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIGZpcnN0IHBoeXNpY2FsIGJsb2NrLCBidXQgc2NhbiBmb3IgYmFkIGJsb2NrcyBpbiBhbGwKKyoJcGh5c2ljYWwgYmxvY2tzCisqLworaW50IGpmZnMyX2NoZWNrX25hbmRfY2xlYW5tYXJrZXIgKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViKQoreworCXN0cnVjdCBqZmZzMl91bmtub3duX25vZGUgbjsKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsyICogTkFORF9NQVhfT09CU0laRV07CisJdW5zaWduZWQgY2hhciAqcDsKKwlpbnQgcmV0LCBpLCBjbnQsIHJldHZhbCA9IDA7CisJc2l6ZV90IHJldGxlbiwgb2Zmc2V0OworCWludCBvb2Jfc2l6ZTsKKworCW9mZnNldCA9IGplYi0+b2Zmc2V0OworCW9vYl9zaXplID0gYy0+bXRkLT5vb2JzaXplOworCisJLyogTG9vcCB0aHJvdWdoIHRoZSBwaHlzaWNhbCBibG9ja3MgKi8KKwlmb3IgKGNudCA9IDA7IGNudCA8IChjLT5zZWN0b3Jfc2l6ZSAvIGMtPm10ZC0+ZXJhc2VzaXplKTsgY250KyspIHsKKwkJLyogQ2hlY2sgZmlyc3QgaWYgdGhlIGJsb2NrIGlzIGJhZC4gKi8KKwkJaWYgKGMtPm10ZC0+YmxvY2tfaXNiYWQgKGMtPm10ZCwgb2Zmc2V0KSkgeworCQkJRDEgKHByaW50ayAoS0VSTl9XQVJOSU5HICJqZmZzMl9jaGVja19uYW5kX2NsZWFubWFya2VyKCk6IEJhZCBibG9jayBhdCAlMDh4XG4iLCBqZWItPm9mZnNldCkpOworCQkJcmV0dXJuIDI7CisJCX0KKwkJLyoKKwkJICAgKiAgICBXZSByZWFkIG9vYiBkYXRhIGZyb20gcGFnZSAwIGFuZCAxIG9mIHRoZSBibG9jay4KKwkJICAgKiAgICBwYWdlIDAgY29udGFpbnMgY2xlYW5tYXJrZXIgYW5kIGJhZGJsb2NrIGluZm8KKwkJICAgKiAgICBwYWdlIDEgY29udGFpbnMgZmFpbHVyZSBjb3VudCBvZiB0aGlzIGJsb2NrCisJCSAqLworCQlyZXQgPSBjLT5tdGQtPnJlYWRfb29iIChjLT5tdGQsIG9mZnNldCwgb29iX3NpemUgPDwgMSwgJnJldGxlbiwgYnVmKTsKKworCQlpZiAocmV0KSB7CisJCQlEMSAocHJpbnRrIChLRVJOX1dBUk5JTkcgImpmZnMyX2NoZWNrX25hbmRfY2xlYW5tYXJrZXIoKTogUmVhZCBPT0IgZmFpbGVkICVkIGZvciBibG9jayBhdCAlMDh4XG4iLCByZXQsIGplYi0+b2Zmc2V0KSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWlmIChyZXRsZW4gPCAob29iX3NpemUgPDwgMSkpIHsKKwkJCUQxIChwcmludGsgKEtFUk5fV0FSTklORyAiamZmczJfY2hlY2tfbmFuZF9jbGVhbm1hcmtlcigpOiBSZWFkIE9PQiByZXR1cm4gc2hvcnQgcmVhZCAoJXpkIGJ5dGVzIG5vdCAlZCkgZm9yIGJsb2NrIGF0ICUwOHhcbiIsIHJldGxlbiwgb29iX3NpemUgPDwgMSwgamViLT5vZmZzZXQpKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJLyogQ2hlY2sgY2xlYW5tYXJrZXIgb25seSBvbiB0aGUgZmlyc3QgcGh5c2ljYWwgYmxvY2sgKi8KKwkJaWYgKCFjbnQpIHsKKwkJCW4ubWFnaWMgPSBjcHVfdG9famUxNiAoSkZGUzJfTUFHSUNfQklUTUFTSyk7CisJCQluLm5vZGV0eXBlID0gY3B1X3RvX2plMTYgKEpGRlMyX05PREVUWVBFX0NMRUFOTUFSS0VSKTsKKwkJCW4udG90bGVuID0gY3B1X3RvX2plMzIgKDgpOworCQkJcCA9ICh1bnNpZ25lZCBjaGFyICopICZuOworCisJCQlmb3IgKGkgPSAwOyBpIDwgYy0+ZnNkYXRhX2xlbjsgaSsrKSB7CisJCQkJaWYgKGJ1ZltjLT5mc2RhdGFfcG9zICsgaV0gIT0gcFtpXSkgeworCQkJCQlyZXR2YWwgPSAxOworCQkJCX0KKwkJCX0KKwkJCUQxKGlmIChyZXR2YWwgPT0gMSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImpmZnMyX2NoZWNrX25hbmRfY2xlYW5tYXJrZXIoKTogQ2xlYW5tYXJrZXIgbm9kZSBub3QgZGV0ZWN0ZWQgaW4gYmxvY2sgYXQgJTA4eFxuIiwgamViLT5vZmZzZXQpOworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk9PQiBhdCAlMDh4IHdhcyAiLCBvZmZzZXQpOworCQkJCWZvciAoaT0wOyBpIDwgb29iX3NpemU7IGkrKykgeworCQkJCQlwcmludGsoIiUwMnggIiwgYnVmW2ldKTsKKwkJCQl9CisJCQkJcHJpbnRrKCJcbiIpOworCQkJfSkKKwkJfQorCQlvZmZzZXQgKz0gYy0+bXRkLT5lcmFzZXNpemU7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBqZmZzMl93cml0ZV9uYW5kX2NsZWFubWFya2VyKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfZXJhc2VibG9jayAqamViKQoreworCXN0cnVjdCAJamZmczJfdW5rbm93bl9ub2RlIG47CisJaW50IAlyZXQ7CisJc2l6ZV90IAlyZXRsZW47CisKKwluLm1hZ2ljID0gY3B1X3RvX2plMTYoSkZGUzJfTUFHSUNfQklUTUFTSyk7CisJbi5ub2RldHlwZSA9IGNwdV90b19qZTE2KEpGRlMyX05PREVUWVBFX0NMRUFOTUFSS0VSKTsKKwluLnRvdGxlbiA9IGNwdV90b19qZTMyKDgpOworCisJcmV0ID0gamZmczJfZmxhc2hfd3JpdGVfb29iKGMsIGplYi0+b2Zmc2V0ICsgYy0+ZnNkYXRhX3BvcywgYy0+ZnNkYXRhX2xlbiwgJnJldGxlbiwgKHVuc2lnbmVkIGNoYXIgKikmbik7CisJCisJaWYgKHJldCkgeworCQlEMShwcmludGsoS0VSTl9XQVJOSU5HICJqZmZzMl93cml0ZV9uYW5kX2NsZWFubWFya2VyKCk6IFdyaXRlIGZhaWxlZCBmb3IgYmxvY2sgYXQgJTA4eDogZXJyb3IgJWRcbiIsIGplYi0+b2Zmc2V0LCByZXQpKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJaWYgKHJldGxlbiAhPSBjLT5mc2RhdGFfbGVuKSB7CisJCUQxKHByaW50ayhLRVJOX1dBUk5JTkcgImpmZnMyX3dyaXRlX25hbmRfY2xlYW5tYXJrZXIoKTogU2hvcnQgd3JpdGUgZm9yIGJsb2NrIGF0ICUwOHg6ICV6ZCBub3QgJWRcbiIsIGplYi0+b2Zmc2V0LCByZXRsZW4sIGMtPmZzZGF0YV9sZW4pKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIAorICogT24gTkFORCB3ZSB0cnkgdG8gbWFyayB0aGlzIGJsb2NrIGJhZC4gSWYgdGhlIGJsb2NrIHdhcyBlcmFzZWQgbW9yZQorICogdGhhbiBNQVhfRVJBU0VfRkFJTFVSRVMgd2UgbWFyayBpdCBmaW5hbHkgYmFkLgorICogRG9uJ3QgY2FyZSBhYm91dCBmYWlsdXJlcy4gVGhpcyBibG9jayByZW1haW5zIG9uIHRoZSBlcmFzZS1wZW5kaW5nCisgKiBvciBiYWRibG9jayBsaXN0IGFzIGxvbmcgYXMgbm9ib2R5IG1hbmlwdWxhdGVzIHRoZSBmbGFzaCB3aXRoCisgKiBhIGJvb3Rsb2FkZXIgb3Igc29tZXRoaW5nIGxpa2UgdGhhdC4KKyAqLworCitpbnQgamZmczJfd3JpdGVfbmFuZF9iYWRibG9jayhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiwgdWludDMyX3QgYmFkX29mZnNldCkKK3sKKwlpbnQgCXJldDsKKworCS8qIGlmIHRoZSBjb3VudCBpcyA8IG1heCwgd2UgdHJ5IHRvIHdyaXRlIHRoZSBjb3VudGVyIHRvIHRoZSAybmQgcGFnZSBvb2IgYXJlYSAqLworCWlmKCArK2plYi0+YmFkX2NvdW50IDwgTUFYX0VSQVNFX0ZBSUxVUkVTKQorCQlyZXR1cm4gMDsKKworCWlmICghYy0+bXRkLT5ibG9ja19tYXJrYmFkKQorCQlyZXR1cm4gMTsgLy8gV2hhdCBlbHNlIGNhbiB3ZSBkbz8KKworCUQxKHByaW50ayhLRVJOX1dBUk5JTkcgImpmZnMyX3dyaXRlX25hbmRfYmFkYmxvY2soKTogTWFya2luZyBiYWQgYmxvY2sgYXQgJTA4eFxuIiwgYmFkX29mZnNldCkpOworCXJldCA9IGMtPm10ZC0+YmxvY2tfbWFya2JhZChjLT5tdGQsIGJhZF9vZmZzZXQpOworCQorCWlmIChyZXQpIHsKKwkJRDEocHJpbnRrKEtFUk5fV0FSTklORyAiamZmczJfd3JpdGVfbmFuZF9iYWRibG9jaygpOiBXcml0ZSBmYWlsZWQgZm9yIGJsb2NrIGF0ICUwOHg6IGVycm9yICVkXG4iLCBqZWItPm9mZnNldCwgcmV0KSk7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAxOworfQorCisjZGVmaW5lIE5BTkRfSkZGUzJfT09CMTZfRlNEQUxFTgk4CisKK3N0YXRpYyBzdHJ1Y3QgbmFuZF9vb2JpbmZvIGpmZnMyX29vYmluZm9fZG9jZWNjID0geworCS51c2VlY2MgPSBNVERfTkFOREVDQ19QTEFDRSwKKwkuZWNjYnl0ZXMgPSA2LAorCS5lY2Nwb3MgPSB7MCwxLDIsMyw0LDV9Cit9OworCisKK3N0YXRpYyBpbnQgamZmczJfbmFuZF9zZXRfb29iaW5mbyhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYykKK3sKKwlzdHJ1Y3QgbmFuZF9vb2JpbmZvICpvaW5mbyA9ICZjLT5tdGQtPm9vYmluZm87CisKKwkvKiBEbyB0aGlzIG9ubHksIGlmIHdlIGhhdmUgYW4gb29iIGJ1ZmZlciAqLworCWlmICghYy0+bXRkLT5vb2JzaXplKQorCQlyZXR1cm4gMDsKKwkKKwkvKiBDbGVhbm1hcmtlciBpcyBvdXQtb2YtYmFuZCwgc28gaW5saW5lIHNpemUgemVybyAqLworCWMtPmNsZWFubWFya2VyX3NpemUgPSAwOworCisJLyogU2hvdWxkIHdlIHVzZSBhdXRvcGxhY2VtZW50ID8gKi8KKwlpZiAob2luZm8gJiYgb2luZm8tPnVzZWVjYyA9PSBNVERfTkFOREVDQ19BVVRPUExBQ0UpIHsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkpGRlMyIHVzaW5nIGF1dG9wbGFjZSBvbiBOQU5EXG4iKSk7CisJCS8qIEdldCB0aGUgcG9zaXRpb24gb2YgdGhlIGZyZWUgYnl0ZXMgKi8KKwkJaWYgKCFvaW5mby0+b29iZnJlZVswXVsxXSkgeworCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgImpmZnMyX25hbmRfc2V0X29vYmluZm8oKTogRWVlcC4gQXV0b3BsYWNlbWVudCBzZWxlY3RlZCBhbmQgbm8gZW1wdHkgc3BhY2UgaW4gb29iXG4iKTsKKwkJCXJldHVybiAtRU5PU1BDOworCQl9CisJCWMtPmZzZGF0YV9wb3MgPSBvaW5mby0+b29iZnJlZVswXVswXTsKKwkJYy0+ZnNkYXRhX2xlbiA9IG9pbmZvLT5vb2JmcmVlWzBdWzFdOworCQlpZiAoYy0+ZnNkYXRhX2xlbiA+IDgpCisJCQljLT5mc2RhdGFfbGVuID0gODsKKwl9IGVsc2UgeworCQkvKiBUaGlzIGlzIGp1c3QgYSBsZWdhY3kgZmFsbGJhY2sgYW5kIHNob3VsZCBnbyBhd2F5IHNvb24gKi8KKwkJc3dpdGNoKGMtPm10ZC0+ZWNjdHlwZSkgeworCQljYXNlIE1URF9FQ0NfUlNfRGlza09uQ2hpcDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkpGRlMyIHVzaW5nIERpc2tPbkNoaXAgaGFyZHdhcmUgRUNDIHdpdGhvdXQgYXV0b3BsYWNlbWVudC4gRml4IGl0IVxuIik7CisJCQljLT5vb2JpbmZvID0gJmpmZnMyX29vYmluZm9fZG9jZWNjOworCQkJYy0+ZnNkYXRhX3BvcyA9IDY7CisJCQljLT5mc2RhdGFfbGVuID0gTkFORF9KRkZTMl9PT0IxNl9GU0RBTEVOOworCQkJYy0+YmFkYmxvY2tfcG9zID0gMTU7CisJCQlicmVhazsKKwkKKwkJZGVmYXVsdDoKKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJKRkZTMiBvbiBOQU5ELiBObyBhdXRvcGxhY21lbnQgaW5mbyBmb3VuZFxuIikpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBqZmZzMl9uYW5kX2ZsYXNoX3NldHVwKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKQoreworCWludCByZXM7CisKKwkvKiBJbml0aWFsaXNlIHdyaXRlIGJ1ZmZlciAqLworCWluaXRfcndzZW0oJmMtPndidWZfc2VtKTsKKwljLT53YnVmX3BhZ2VzaXplID0gYy0+bXRkLT5vb2JibG9jazsKKwljLT53YnVmX29mcyA9IDB4RkZGRkZGRkY7CisJCisJYy0+d2J1ZiA9IGttYWxsb2MoYy0+d2J1Zl9wYWdlc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjLT53YnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlcyA9IGpmZnMyX25hbmRfc2V0X29vYmluZm8oYyk7CisKKyNpZmRlZiBCUkVBS01FCisJaWYgKCFicm9rZW5idWYpCisJCWJyb2tlbmJ1ZiA9IGttYWxsb2MoYy0+d2J1Zl9wYWdlc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFicm9rZW5idWYpIHsKKwkJa2ZyZWUoYy0+d2J1Zik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoYnJva2VuYnVmLCAweGRiLCBjLT53YnVmX3BhZ2VzaXplKTsKKyNlbmRpZgorCXJldHVybiByZXM7Cit9CisKK3ZvaWQgamZmczJfbmFuZF9mbGFzaF9jbGVhbnVwKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKQoreworCWtmcmVlKGMtPndidWYpOworfQorCisjaWZkZWYgQ09ORklHX0pGRlMyX0ZTX05PUl9FQ0MKK2ludCBqZmZzMl9ub3JfZWNjX2ZsYXNoX3NldHVwKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKSB7CisJLyogQ2xlYW5tYXJrZXIgaXMgYWN0dWFsbHkgbGFyZ2VyIG9uIHRoZSBmbGFzaGVzICovCisJYy0+Y2xlYW5tYXJrZXJfc2l6ZSA9IDE2OworCisJLyogSW5pdGlhbGl6ZSB3cml0ZSBidWZmZXIgKi8KKwlpbml0X3J3c2VtKCZjLT53YnVmX3NlbSk7CisJYy0+d2J1Zl9wYWdlc2l6ZSA9IGMtPm10ZC0+ZWNjc2l6ZTsKKwljLT53YnVmX29mcyA9IDB4RkZGRkZGRkY7CisKKwljLT53YnVmID0ga21hbGxvYyhjLT53YnVmX3BhZ2VzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWMtPndidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgamZmczJfbm9yX2VjY19mbGFzaF9jbGVhbnVwKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjKSB7CisJa2ZyZWUoYy0+d2J1Zik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL3dyaXRlLmMgYi9mcy9qZmZzMi93cml0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYTVkYjUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZmZzMi93cml0ZS5jCkBAIC0wLDAgKzEsNzA4IEBACisvKgorICogSkZGUzIgLS0gSm91cm5hbGxpbmcgRmxhc2ggRmlsZSBTeXN0ZW0sIFZlcnNpb24gMi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwMyBSZWQgSGF0LCBJbmMuCisgKgorICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CisgKgorICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KKyAqCisgKiAkSWQ6IHdyaXRlLmMsdiAxLjg3IDIwMDQvMTEvMTYgMjA6MzY6MTIgZHdtdzIgRXhwICQKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlICJub2RlbGlzdC5oIgorI2luY2x1ZGUgImNvbXByLmgiCisKKworaW50IGpmZnMyX2RvX25ld19pbm9kZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsIHVpbnQzMl90IG1vZGUsIHN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKnJpKQoreworCXN0cnVjdCBqZmZzMl9pbm9kZV9jYWNoZSAqaWM7CisKKwlpYyA9IGpmZnMyX2FsbG9jX2lub2RlX2NhY2hlKCk7CisJaWYgKCFpYykgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1zZXQoaWMsIDAsIHNpemVvZigqaWMpKTsKKworCWYtPmlub2NhY2hlID0gaWM7CisJZi0+aW5vY2FjaGUtPm5saW5rID0gMTsKKwlmLT5pbm9jYWNoZS0+bm9kZXMgPSAoc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqKWYtPmlub2NhY2hlOworCWYtPmlub2NhY2hlLT5pbm8gPSArK2MtPmhpZ2hlc3RfaW5vOworCWYtPmlub2NhY2hlLT5zdGF0ZSA9IElOT19TVEFURV9QUkVTRU5UOworCisJcmktPmlubyA9IGNwdV90b19qZTMyKGYtPmlub2NhY2hlLT5pbm8pOworCisJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2RvX25ld19pbm9kZSgpOiBBc3NpZ25lZCBpbm8jICVkXG4iLCBmLT5pbm9jYWNoZS0+aW5vKSk7CisJamZmczJfYWRkX2lub19jYWNoZShjLCBmLT5pbm9jYWNoZSk7CisKKwlyaS0+bWFnaWMgPSBjcHVfdG9famUxNihKRkZTMl9NQUdJQ19CSVRNQVNLKTsKKwlyaS0+bm9kZXR5cGUgPSBjcHVfdG9famUxNihKRkZTMl9OT0RFVFlQRV9JTk9ERSk7CisJcmktPnRvdGxlbiA9IGNwdV90b19qZTMyKFBBRChzaXplb2YoKnJpKSkpOworCXJpLT5oZHJfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgcmksIHNpemVvZihzdHJ1Y3QgamZmczJfdW5rbm93bl9ub2RlKS00KSk7CisJcmktPm1vZGUgPSBjcHVfdG9famVtb2RlKG1vZGUpOworCisJZi0+aGlnaGVzdF92ZXJzaW9uID0gMTsKKwlyaS0+dmVyc2lvbiA9IGNwdV90b19qZTMyKGYtPmhpZ2hlc3RfdmVyc2lvbik7CisKKwlyZXR1cm4gMDsKK30KKworI2lmIENPTkZJR19KRkZTMl9GU19ERUJVRyA+IDAKK3N0YXRpYyB2b2lkIHdyaXRlY2hlY2soc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHVpbnQzMl90IG9mcykKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsxNl07CisJc2l6ZV90IHJldGxlbjsKKwlpbnQgcmV0LCBpOworCisJcmV0ID0gamZmczJfZmxhc2hfcmVhZChjLCBvZnMsIDE2LCAmcmV0bGVuLCBidWYpOworCWlmIChyZXQgfHwgKHJldGxlbiAhPSAxNikpIHsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgInJlYWQgZmFpbGVkIG9yIHNob3J0IGluIHdyaXRlY2hlY2soKS4gcmV0ICVkLCByZXRsZW4gJXpkXG4iLCByZXQsIHJldGxlbikpOworCQlyZXR1cm47CisJfQorCXJldCA9IDA7CisJZm9yIChpPTA7IGk8MTY7IGkrKykgeworCQlpZiAoYnVmW2ldICE9IDB4ZmYpCisJCQlyZXQgPSAxOworCX0KKwlpZiAocmV0KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFSR0guIEFib3V0IHRvIHdyaXRlIG5vZGUgdG8gMHglMDh4IG9uIGZsYXNoLCBidXQgdGhlcmUgYXJlIGRhdGEgYWxyZWFkeSB0aGVyZTpcbiIsIG9mcyk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIjB4JTA4eDogJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwgCisJCSAgICAgICBvZnMsCisJCSAgICAgICBidWZbMF0sIGJ1ZlsxXSwgYnVmWzJdLCBidWZbM10sIGJ1Zls0XSwgYnVmWzVdLCBidWZbNl0sIGJ1Zls3XSwKKwkJICAgICAgIGJ1Zls4XSwgYnVmWzldLCBidWZbMTBdLCBidWZbMTFdLCBidWZbMTJdLCBidWZbMTNdLCBidWZbMTRdLCBidWZbMTVdKTsKKwl9Cit9CisjZW5kaWYKKworCisvKiBqZmZzMl93cml0ZV9kbm9kZSAtIGdpdmVuIGEgcmF3X2lub2RlLCBhbGxvY2F0ZSBhIGZ1bGxfZG5vZGUgZm9yIGl0LCAKKyAgIHdyaXRlIGl0IHRvIHRoZSBmbGFzaCwgbGluayBpdCBpbnRvIHRoZSBleGlzdGluZyBpbm9kZS9mcmFnbWVudCBsaXN0ICovCisKK3N0cnVjdCBqZmZzMl9mdWxsX2Rub2RlICpqZmZzMl93cml0ZV9kbm9kZShzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsIHN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKnJpLCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1aW50MzJfdCBkYXRhbGVuLCB1aW50MzJfdCBmbGFzaF9vZnMsIGludCBhbGxvY19tb2RlKQorCit7CisJc3RydWN0IGpmZnMyX3Jhd19ub2RlX3JlZiAqcmF3OworCXN0cnVjdCBqZmZzMl9mdWxsX2Rub2RlICpmbjsKKwlzaXplX3QgcmV0bGVuOworCXN0cnVjdCBrdmVjIHZlY3NbMl07CisJaW50IHJldDsKKwlpbnQgcmV0cmllZCA9IDA7CisJdW5zaWduZWQgbG9uZyBjbnQgPSAyOworCisJRDEoaWYoamUzMl90b19jcHUocmktPmhkcl9jcmMpICE9IGNyYzMyKDAsIHJpLCBzaXplb2Yoc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSktNCkpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiRWVwLiBDUkMgbm90IGNvcnJlY3QgaW4gamZmczJfd3JpdGVfZG5vZGUoKVxuIik7CisJCUJVRygpOworCX0KKwkgICApOworCXZlY3NbMF0uaW92X2Jhc2UgPSByaTsKKwl2ZWNzWzBdLmlvdl9sZW4gPSBzaXplb2YoKnJpKTsKKwl2ZWNzWzFdLmlvdl9iYXNlID0gKHVuc2lnbmVkIGNoYXIgKilkYXRhOworCXZlY3NbMV0uaW92X2xlbiA9IGRhdGFsZW47CisKKwlEMSh3cml0ZWNoZWNrKGMsIGZsYXNoX29mcykpOworCisJaWYgKGplMzJfdG9fY3B1KHJpLT50b3RsZW4pICE9IHNpemVvZigqcmkpICsgZGF0YWxlbikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJqZmZzMl93cml0ZV9kbm9kZTogcmktPnRvdGxlbiAoMHglMDh4KSAhPSBzaXplb2YoKnJpKSAoMHglMDh6eCkgKyBkYXRhbGVuICgweCUwOHgpXG4iLCBqZTMyX3RvX2NwdShyaS0+dG90bGVuKSwgc2l6ZW9mKCpyaSksIGRhdGFsZW4pOworCX0KKwlyYXcgPSBqZmZzMl9hbGxvY19yYXdfbm9kZV9yZWYoKTsKKwlpZiAoIXJhdykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJCisJZm4gPSBqZmZzMl9hbGxvY19mdWxsX2Rub2RlKCk7CisJaWYgKCFmbikgeworCQlqZmZzMl9mcmVlX3Jhd19ub2RlX3JlZihyYXcpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwlmbi0+b2ZzID0gamUzMl90b19jcHUocmktPm9mZnNldCk7CisJZm4tPnNpemUgPSBqZTMyX3RvX2NwdShyaS0+ZHNpemUpOworCWZuLT5mcmFncyA9IDA7CisKKwkvKiBjaGVjayBudW1iZXIgb2YgdmFsaWQgdmVjcyAqLworCWlmICghZGF0YWxlbiB8fCAhZGF0YSkKKwkJY250ID0gMTsKKyByZXRyeToKKwlmbi0+cmF3ID0gcmF3OworCisJcmF3LT5mbGFzaF9vZmZzZXQgPSBmbGFzaF9vZnM7CisJcmF3LT5fX3RvdGxlbiA9IFBBRChzaXplb2YoKnJpKStkYXRhbGVuKTsKKwlyYXctPm5leHRfcGh5cyA9IE5VTEw7CisKKwlyZXQgPSBqZmZzMl9mbGFzaF93cml0ZXYoYywgdmVjcywgY250LCBmbGFzaF9vZnMsICZyZXRsZW4sCisJCQkJIChhbGxvY19tb2RlPT1BTExPQ19HQyk/MDpmLT5pbm9jYWNoZS0+aW5vKTsKKworCWlmIChyZXQgfHwgKHJldGxlbiAhPSBzaXplb2YoKnJpKSArIGRhdGFsZW4pKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiV3JpdGUgb2YgJXpkIGJ5dGVzIGF0IDB4JTA4eCBmYWlsZWQuIHJldHVybmVkICVkLCByZXRsZW4gJXpkXG4iLCAKKwkJICAgICAgIHNpemVvZigqcmkpK2RhdGFsZW4sIGZsYXNoX29mcywgcmV0LCByZXRsZW4pOworCisJCS8qIE1hcmsgdGhlIHNwYWNlIGFzIGRpcnRpZWQgKi8KKwkJaWYgKHJldGxlbikgeworCQkJLyogRG9lc24ndCBiZWxvbmcgdG8gYW55IGlub2RlICovCisJCQlyYXctPm5leHRfaW5faW5vID0gTlVMTDsKKworCQkJLyogRG9uJ3QgY2hhbmdlIHJhdy0+c2l6ZSB0byBtYXRjaCByZXRsZW4uIFdlIG1heSBoYXZlIAorCQkJICAgd3JpdHRlbiB0aGUgbm9kZSBoZWFkZXIgYWxyZWFkeSwgYW5kIG9ubHkgdGhlIGRhdGEgd2lsbAorCQkJICAgc2VlbSBjb3JydXB0ZWQsIGluIHdoaWNoIGNhc2UgdGhlIHNjYW4gd291bGQgc2tpcCBvdmVyCisJCQkgICBhbnkgbm9kZSB3ZSB3cml0ZSBiZWZvcmUgdGhlIG9yaWdpbmFsIGludGVuZGVkIGVuZCBvZiAKKwkJCSAgIHRoaXMgbm9kZSAqLworCQkJcmF3LT5mbGFzaF9vZmZzZXQgfD0gUkVGX09CU09MRVRFOworCQkJamZmczJfYWRkX3BoeXNpY2FsX25vZGVfcmVmKGMsIHJhdyk7CisJCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgcmF3KTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX05PVElDRSAiTm90IG1hcmtpbmcgdGhlIHNwYWNlIGF0IDB4JTA4eCBhcyBkaXJ0eSBiZWNhdXNlIHRoZSBmbGFzaCBkcml2ZXIgcmV0dXJuZWQgcmV0bGVuIHplcm9cbiIsIHJhdy0+Zmxhc2hfb2Zmc2V0KTsKKwkJCWpmZnMyX2ZyZWVfcmF3X25vZGVfcmVmKHJhdyk7CisJCX0KKwkJaWYgKCFyZXRyaWVkICYmIGFsbG9jX21vZGUgIT0gQUxMT0NfTk9SRVRSWSAmJiAocmF3ID0gamZmczJfYWxsb2NfcmF3X25vZGVfcmVmKCkpKSB7CisJCQkvKiBUcnkgdG8gcmVhbGxvY2F0ZSBzcGFjZSBhbmQgcmV0cnkgKi8KKwkJCXVpbnQzMl90IGR1bW15OworCQkJc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiA9ICZjLT5ibG9ja3NbZmxhc2hfb2ZzIC8gYy0+c2VjdG9yX3NpemVdOworCisJCQlyZXRyaWVkID0gMTsKKworCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIlJldHJ5aW5nIGZhaWxlZCB3cml0ZS5cbiIpKTsKKwkJCQorCQkJQUNDVF9TQU5JVFlfQ0hFQ0soYyxqZWIpOworCQkJRDEoQUNDVF9QQVJBTk9JQV9DSEVDSyhqZWIpKTsKKworCQkJaWYgKGFsbG9jX21vZGUgPT0gQUxMT0NfR0MpIHsKKwkJCQlyZXQgPSBqZmZzMl9yZXNlcnZlX3NwYWNlX2djKGMsIHNpemVvZigqcmkpICsgZGF0YWxlbiwgJmZsYXNoX29mcywgJmR1bW15KTsKKwkJCX0gZWxzZSB7CisJCQkJLyogTG9ja2luZyBwYWluICovCisJCQkJdXAoJmYtPnNlbSk7CisJCQkJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7CisJCQkKKwkJCQlyZXQgPSBqZmZzMl9yZXNlcnZlX3NwYWNlKGMsIHNpemVvZigqcmkpICsgZGF0YWxlbiwgJmZsYXNoX29mcywgJmR1bW15LCBhbGxvY19tb2RlKTsKKwkJCQlkb3duKCZmLT5zZW0pOworCQkJfQorCisJCQlpZiAoIXJldCkgeworCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJBbGxvY2F0ZWQgc3BhY2UgYXQgMHglMDh4IHRvIHJldHJ5IGZhaWxlZCB3cml0ZS5cbiIsIGZsYXNoX29mcykpOworCisJCQkJQUNDVF9TQU5JVFlfQ0hFQ0soYyxqZWIpOworCQkJCUQxKEFDQ1RfUEFSQU5PSUFfQ0hFQ0soamViKSk7CisKKwkJCQlnb3RvIHJldHJ5OworCQkJfQorCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIkZhaWxlZCB0byBhbGxvY2F0ZSBzcGFjZSB0byByZXRyeSBmYWlsZWQgd3JpdGU6ICVkIVxuIiwgcmV0KSk7CisJCQlqZmZzMl9mcmVlX3Jhd19ub2RlX3JlZihyYXcpOworCQl9CisJCS8qIFJlbGVhc2UgdGhlIGZ1bGxfZG5vZGUgd2hpY2ggaXMgbm93IHVzZWxlc3MsIGFuZCByZXR1cm4gKi8KKwkJamZmczJfZnJlZV9mdWxsX2Rub2RlKGZuKTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0P3JldDotRUlPKTsKKwl9CisJLyogTWFyayB0aGUgc3BhY2UgdXNlZCAqLworCS8qIElmIG5vZGUgY292ZXJzIGF0IGxlYXN0IGEgd2hvbGUgcGFnZSwgb3IgaWYgaXQgc3RhcnRzIGF0IHRoZSAKKwkgICBiZWdpbm5pbmcgb2YgYSBwYWdlIGFuZCBydW5zIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUsIG9yIGlmIAorCSAgIGl0J3MgYSBob2xlIG5vZGUsIG1hcmsgaXQgUkVGX1BSSVNUSU5FLCBlbHNlIFJFRl9OT1JNQUwuIAorCSovCisJaWYgKChqZTMyX3RvX2NwdShyaS0+ZHNpemUpID49IFBBR0VfQ0FDSEVfU0laRSkgfHwKKwkgICAgKCAoKGplMzJfdG9fY3B1KHJpLT5vZmZzZXQpJihQQUdFX0NBQ0hFX1NJWkUtMSkpPT0wKSAmJgorCSAgICAgIChqZTMyX3RvX2NwdShyaS0+ZHNpemUpK2plMzJfdG9fY3B1KHJpLT5vZmZzZXQpID09ICBqZTMyX3RvX2NwdShyaS0+aXNpemUpKSkpIHsKKwkJcmF3LT5mbGFzaF9vZmZzZXQgfD0gUkVGX1BSSVNUSU5FOworCX0gZWxzZSB7CisJCXJhdy0+Zmxhc2hfb2Zmc2V0IHw9IFJFRl9OT1JNQUw7CisJfQorCWpmZnMyX2FkZF9waHlzaWNhbF9ub2RlX3JlZihjLCByYXcpOworCisJLyogTGluayBpbnRvIHBlci1pbm9kZSBsaXN0ICovCisJc3Bpbl9sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCXJhdy0+bmV4dF9pbl9pbm8gPSBmLT5pbm9jYWNoZS0+bm9kZXM7CisJZi0+aW5vY2FjaGUtPm5vZGVzID0gcmF3OworCXNwaW5fdW5sb2NrKCZjLT5lcmFzZV9jb21wbGV0aW9uX2xvY2spOworCisJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX3dyaXRlX2Rub2RlIHdyb3RlIG5vZGUgYXQgMHglMDh4KCVkKSB3aXRoIGRzaXplIDB4JXgsIGNzaXplIDB4JXgsIG5vZGVfY3JjIDB4JTA4eCwgZGF0YV9jcmMgMHglMDh4LCB0b3RsZW4gMHglMDh4XG4iLAorCQkgIGZsYXNoX29mcywgcmVmX2ZsYWdzKHJhdyksIGplMzJfdG9fY3B1KHJpLT5kc2l6ZSksIAorCQkgIGplMzJfdG9fY3B1KHJpLT5jc2l6ZSksIGplMzJfdG9fY3B1KHJpLT5ub2RlX2NyYyksCisJCSAgamUzMl90b19jcHUocmktPmRhdGFfY3JjKSwgamUzMl90b19jcHUocmktPnRvdGxlbikpKTsKKworCWlmIChyZXRyaWVkKSB7CisJCUFDQ1RfU0FOSVRZX0NIRUNLKGMsTlVMTCk7CisJfQorCisJcmV0dXJuIGZuOworfQorCitzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKmpmZnMyX3dyaXRlX2RpcmVudChzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmYsIHN0cnVjdCBqZmZzMl9yYXdfZGlyZW50ICpyZCwgY29uc3QgdW5zaWduZWQgY2hhciAqbmFtZSwgdWludDMyX3QgbmFtZWxlbiwgdWludDMyX3QgZmxhc2hfb2ZzLCBpbnQgYWxsb2NfbW9kZSkKK3sKKwlzdHJ1Y3QgamZmczJfcmF3X25vZGVfcmVmICpyYXc7CisJc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICpmZDsKKwlzaXplX3QgcmV0bGVuOworCXN0cnVjdCBrdmVjIHZlY3NbMl07CisJaW50IHJldHJpZWQgPSAwOworCWludCByZXQ7CisKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfd3JpdGVfZGlyZW50KGlubyAjJXUsIG5hbWUgYXQgKjB4JXAgXCIlc1wiLT5pbm8gIyV1LCBuYW1lX2NyYyAweCUwOHgpXG4iLCAKKwkJICBqZTMyX3RvX2NwdShyZC0+cGlubyksIG5hbWUsIG5hbWUsIGplMzJfdG9fY3B1KHJkLT5pbm8pLAorCQkgIGplMzJfdG9fY3B1KHJkLT5uYW1lX2NyYykpKTsKKwlEMSh3cml0ZWNoZWNrKGMsIGZsYXNoX29mcykpOworCisJRDEoaWYoamUzMl90b19jcHUocmQtPmhkcl9jcmMpICE9IGNyYzMyKDAsIHJkLCBzaXplb2Yoc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSktNCkpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiRWVwLiBDUkMgbm90IGNvcnJlY3QgaW4gamZmczJfd3JpdGVfZGlyZW50KClcbiIpOworCQlCVUcoKTsKKwl9CisJICAgKTsKKworCXZlY3NbMF0uaW92X2Jhc2UgPSByZDsKKwl2ZWNzWzBdLmlvdl9sZW4gPSBzaXplb2YoKnJkKTsKKwl2ZWNzWzFdLmlvdl9iYXNlID0gKHVuc2lnbmVkIGNoYXIgKiluYW1lOworCXZlY3NbMV0uaW92X2xlbiA9IG5hbWVsZW47CisJCisJcmF3ID0gamZmczJfYWxsb2NfcmF3X25vZGVfcmVmKCk7CisKKwlpZiAoIXJhdykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlmZCA9IGpmZnMyX2FsbG9jX2Z1bGxfZGlyZW50KG5hbWVsZW4rMSk7CisJaWYgKCFmZCkgeworCQlqZmZzMl9mcmVlX3Jhd19ub2RlX3JlZihyYXcpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwlmZC0+dmVyc2lvbiA9IGplMzJfdG9fY3B1KHJkLT52ZXJzaW9uKTsKKwlmZC0+aW5vID0gamUzMl90b19jcHUocmQtPmlubyk7CisJZmQtPm5oYXNoID0gZnVsbF9uYW1lX2hhc2gobmFtZSwgc3RybGVuKG5hbWUpKTsKKwlmZC0+dHlwZSA9IHJkLT50eXBlOworCW1lbWNweShmZC0+bmFtZSwgbmFtZSwgbmFtZWxlbik7CisJZmQtPm5hbWVbbmFtZWxlbl09MDsKKworIHJldHJ5OgorCWZkLT5yYXcgPSByYXc7CisKKwlyYXctPmZsYXNoX29mZnNldCA9IGZsYXNoX29mczsKKwlyYXctPl9fdG90bGVuID0gUEFEKHNpemVvZigqcmQpK25hbWVsZW4pOworCXJhdy0+bmV4dF9waHlzID0gTlVMTDsKKworCXJldCA9IGpmZnMyX2ZsYXNoX3dyaXRldihjLCB2ZWNzLCAyLCBmbGFzaF9vZnMsICZyZXRsZW4sCisJCQkJIChhbGxvY19tb2RlPT1BTExPQ19HQyk/MDpqZTMyX3RvX2NwdShyZC0+cGlubykpOworCWlmIChyZXQgfHwgKHJldGxlbiAhPSBzaXplb2YoKnJkKSArIG5hbWVsZW4pKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiV3JpdGUgb2YgJXpkIGJ5dGVzIGF0IDB4JTA4eCBmYWlsZWQuIHJldHVybmVkICVkLCByZXRsZW4gJXpkXG4iLCAKKwkJCSAgICAgICBzaXplb2YoKnJkKStuYW1lbGVuLCBmbGFzaF9vZnMsIHJldCwgcmV0bGVuKTsKKwkJLyogTWFyayB0aGUgc3BhY2UgYXMgZGlydGllZCAqLworCQlpZiAocmV0bGVuKSB7CisJCQlyYXctPm5leHRfaW5faW5vID0gTlVMTDsKKwkJCXJhdy0+Zmxhc2hfb2Zmc2V0IHw9IFJFRl9PQlNPTEVURTsKKwkJCWpmZnMyX2FkZF9waHlzaWNhbF9ub2RlX3JlZihjLCByYXcpOworCQkJamZmczJfbWFya19ub2RlX29ic29sZXRlKGMsIHJhdyk7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIk5vdCBtYXJraW5nIHRoZSBzcGFjZSBhdCAweCUwOHggYXMgZGlydHkgYmVjYXVzZSB0aGUgZmxhc2ggZHJpdmVyIHJldHVybmVkIHJldGxlbiB6ZXJvXG4iLCByYXctPmZsYXNoX29mZnNldCk7CisJCQlqZmZzMl9mcmVlX3Jhd19ub2RlX3JlZihyYXcpOworCQl9CisJCWlmICghcmV0cmllZCAmJiAocmF3ID0gamZmczJfYWxsb2NfcmF3X25vZGVfcmVmKCkpKSB7CisJCQkvKiBUcnkgdG8gcmVhbGxvY2F0ZSBzcGFjZSBhbmQgcmV0cnkgKi8KKwkJCXVpbnQzMl90IGR1bW15OworCQkJc3RydWN0IGpmZnMyX2VyYXNlYmxvY2sgKmplYiA9ICZjLT5ibG9ja3NbZmxhc2hfb2ZzIC8gYy0+c2VjdG9yX3NpemVdOworCisJCQlyZXRyaWVkID0gMTsKKworCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIlJldHJ5aW5nIGZhaWxlZCB3cml0ZS5cbiIpKTsKKworCQkJQUNDVF9TQU5JVFlfQ0hFQ0soYyxqZWIpOworCQkJRDEoQUNDVF9QQVJBTk9JQV9DSEVDSyhqZWIpKTsKKworCQkJaWYgKGFsbG9jX21vZGUgPT0gQUxMT0NfR0MpIHsKKwkJCQlyZXQgPSBqZmZzMl9yZXNlcnZlX3NwYWNlX2djKGMsIHNpemVvZigqcmQpICsgbmFtZWxlbiwgJmZsYXNoX29mcywgJmR1bW15KTsKKwkJCX0gZWxzZSB7CisJCQkJLyogTG9ja2luZyBwYWluICovCisJCQkJdXAoJmYtPnNlbSk7CisJCQkJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7CisJCQkKKwkJCQlyZXQgPSBqZmZzMl9yZXNlcnZlX3NwYWNlKGMsIHNpemVvZigqcmQpICsgbmFtZWxlbiwgJmZsYXNoX29mcywgJmR1bW15LCBhbGxvY19tb2RlKTsKKwkJCQlkb3duKCZmLT5zZW0pOworCQkJfQorCisJCQlpZiAoIXJldCkgeworCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJBbGxvY2F0ZWQgc3BhY2UgYXQgMHglMDh4IHRvIHJldHJ5IGZhaWxlZCB3cml0ZS5cbiIsIGZsYXNoX29mcykpOworCQkJCUFDQ1RfU0FOSVRZX0NIRUNLKGMsamViKTsKKwkJCQlEMShBQ0NUX1BBUkFOT0lBX0NIRUNLKGplYikpOworCQkJCWdvdG8gcmV0cnk7CisJCQl9CisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiRmFpbGVkIHRvIGFsbG9jYXRlIHNwYWNlIHRvIHJldHJ5IGZhaWxlZCB3cml0ZTogJWQhXG4iLCByZXQpKTsKKwkJCWpmZnMyX2ZyZWVfcmF3X25vZGVfcmVmKHJhdyk7CisJCX0KKwkJLyogUmVsZWFzZSB0aGUgZnVsbF9kbm9kZSB3aGljaCBpcyBub3cgdXNlbGVzcywgYW5kIHJldHVybiAqLworCQlqZmZzMl9mcmVlX2Z1bGxfZGlyZW50KGZkKTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0P3JldDotRUlPKTsKKwl9CisJLyogTWFyayB0aGUgc3BhY2UgdXNlZCAqLworCXJhdy0+Zmxhc2hfb2Zmc2V0IHw9IFJFRl9QUklTVElORTsKKwlqZmZzMl9hZGRfcGh5c2ljYWxfbm9kZV9yZWYoYywgcmF3KTsKKworCXNwaW5fbG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKwlyYXctPm5leHRfaW5faW5vID0gZi0+aW5vY2FjaGUtPm5vZGVzOworCWYtPmlub2NhY2hlLT5ub2RlcyA9IHJhdzsKKwlzcGluX3VubG9jaygmYy0+ZXJhc2VfY29tcGxldGlvbl9sb2NrKTsKKworCWlmIChyZXRyaWVkKSB7CisJCUFDQ1RfU0FOSVRZX0NIRUNLKGMsTlVMTCk7CisJfQorCisJcmV0dXJuIGZkOworfQorCisvKiBUaGUgT1Mtc3BlY2lmaWMgY29kZSBmaWxscyBpbiB0aGUgbWV0YWRhdGEgaW4gdGhlIGpmZnMyX3Jhd19pbm9kZSBmb3IgdXMsIHNvIHRoYXQKKyAgIHdlIGRvbid0IGhhdmUgdG8gZ28gZGlnZ2luZyBpbiBzdHJ1Y3QgaW5vZGUgb3IgaXRzIGVxdWl2YWxlbnQuIEl0IHNob3VsZCBzZXQ6CisgICBtb2RlLCB1aWQsIGdpZCwgKHN0YXJ0aW5nKWlzaXplLCBhdGltZSwgY3RpbWUsIG10aW1lICovCitpbnQgamZmczJfd3JpdGVfaW5vZGVfcmFuZ2Uoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLAorCQkJICAgIHN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKnJpLCB1bnNpZ25lZCBjaGFyICpidWYsIAorCQkJICAgIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3Qgd3JpdGVsZW4sIHVpbnQzMl90ICpyZXRsZW4pCit7CisJaW50IHJldCA9IDA7CisJdWludDMyX3Qgd3JpdHRlbmxlbiA9IDA7CisKKyAgICAgICAJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX3dyaXRlX2lub2RlX3JhbmdlKCk6IElubyAjJXUsIG9mcyAweCV4LCBsZW4gMHgleFxuIiwKKwkJICBmLT5pbm9jYWNoZS0+aW5vLCBvZmZzZXQsIHdyaXRlbGVuKSk7CisJCQorCXdoaWxlKHdyaXRlbGVuKSB7CisJCXN0cnVjdCBqZmZzMl9mdWxsX2Rub2RlICpmbjsKKwkJdW5zaWduZWQgY2hhciAqY29tcHJidWYgPSBOVUxMOworCQl1aW50MTZfdCBjb21wcnR5cGUgPSBKRkZTMl9DT01QUl9OT05FOworCQl1aW50MzJfdCBwaHlzX29mcywgYWxsb2NsZW47CisJCXVpbnQzMl90IGRhdGFsZW4sIGNkYXRhbGVuOworCQlpbnQgcmV0cmllZCA9IDA7CisKKwlyZXRyeToKKwkJRDIocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX2NvbW1pdF93cml0ZSgpIGxvb3A6IDB4JXggdG8gd3JpdGUgdG8gMHgleFxuIiwgd3JpdGVsZW4sIG9mZnNldCkpOworCisJCXJldCA9IGpmZnMyX3Jlc2VydmVfc3BhY2UoYywgc2l6ZW9mKCpyaSkgKyBKRkZTMl9NSU5fREFUQV9MRU4sICZwaHlzX29mcywgJmFsbG9jbGVuLCBBTExPQ19OT1JNQUwpOworCQlpZiAocmV0KSB7CisJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfcmVzZXJ2ZV9zcGFjZSByZXR1cm5lZCAlZFxuIiwgcmV0KSk7CisJCQlicmVhazsKKwkJfQorCQlkb3duKCZmLT5zZW0pOworCQlkYXRhbGVuID0gbWluX3QodWludDMyX3QsIHdyaXRlbGVuLCBQQUdFX0NBQ0hFX1NJWkUgLSAob2Zmc2V0ICYgKFBBR0VfQ0FDSEVfU0laRS0xKSkpOworCQljZGF0YWxlbiA9IG1pbl90KHVpbnQzMl90LCBhbGxvY2xlbiAtIHNpemVvZigqcmkpLCBkYXRhbGVuKTsKKworCQljb21wcnR5cGUgPSBqZmZzMl9jb21wcmVzcyhjLCBmLCBidWYsICZjb21wcmJ1ZiwgJmRhdGFsZW4sICZjZGF0YWxlbik7CisKKwkJcmktPm1hZ2ljID0gY3B1X3RvX2plMTYoSkZGUzJfTUFHSUNfQklUTUFTSyk7CisJCXJpLT5ub2RldHlwZSA9IGNwdV90b19qZTE2KEpGRlMyX05PREVUWVBFX0lOT0RFKTsKKwkJcmktPnRvdGxlbiA9IGNwdV90b19qZTMyKHNpemVvZigqcmkpICsgY2RhdGFsZW4pOworCQlyaS0+aGRyX2NyYyA9IGNwdV90b19qZTMyKGNyYzMyKDAsIHJpLCBzaXplb2Yoc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSktNCkpOworCisJCXJpLT5pbm8gPSBjcHVfdG9famUzMihmLT5pbm9jYWNoZS0+aW5vKTsKKwkJcmktPnZlcnNpb24gPSBjcHVfdG9famUzMigrK2YtPmhpZ2hlc3RfdmVyc2lvbik7CisJCXJpLT5pc2l6ZSA9IGNwdV90b19qZTMyKG1heChqZTMyX3RvX2NwdShyaS0+aXNpemUpLCBvZmZzZXQgKyBkYXRhbGVuKSk7CisJCXJpLT5vZmZzZXQgPSBjcHVfdG9famUzMihvZmZzZXQpOworCQlyaS0+Y3NpemUgPSBjcHVfdG9famUzMihjZGF0YWxlbik7CisJCXJpLT5kc2l6ZSA9IGNwdV90b19qZTMyKGRhdGFsZW4pOworCQlyaS0+Y29tcHIgPSBjb21wcnR5cGUgJiAweGZmOworCQlyaS0+dXNlcmNvbXByID0gKGNvbXBydHlwZSA+PiA4ICkgJiAweGZmOworCQlyaS0+bm9kZV9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCByaSwgc2l6ZW9mKCpyaSktOCkpOworCQlyaS0+ZGF0YV9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCBjb21wcmJ1ZiwgY2RhdGFsZW4pKTsKKworCQlmbiA9IGpmZnMyX3dyaXRlX2Rub2RlKGMsIGYsIHJpLCBjb21wcmJ1ZiwgY2RhdGFsZW4sIHBoeXNfb2ZzLCBBTExPQ19OT1JFVFJZKTsKKworCQlqZmZzMl9mcmVlX2NvbXByYnVmKGNvbXByYnVmLCBidWYpOworCisJCWlmIChJU19FUlIoZm4pKSB7CisJCQlyZXQgPSBQVFJfRVJSKGZuKTsKKwkJCXVwKCZmLT5zZW0pOworCQkJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7CisJCQlpZiAoIXJldHJpZWQpIHsKKwkJCQkvKiBXcml0ZSBlcnJvciB0byBiZSByZXRyaWVkICovCisJCQkJcmV0cmllZCA9IDE7CisJCQkJRDEocHJpbnRrKEtFUk5fREVCVUcgIlJldHJ5aW5nIG5vZGUgd3JpdGUgaW4gamZmczJfd3JpdGVfaW5vZGVfcmFuZ2UoKVxuIikpOworCQkJCWdvdG8gcmV0cnk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlyZXQgPSBqZmZzMl9hZGRfZnVsbF9kbm9kZV90b19pbm9kZShjLCBmLCBmbik7CisJCWlmIChmLT5tZXRhZGF0YSkgeworCQkJamZmczJfbWFya19ub2RlX29ic29sZXRlKGMsIGYtPm1ldGFkYXRhLT5yYXcpOworCQkJamZmczJfZnJlZV9mdWxsX2Rub2RlKGYtPm1ldGFkYXRhKTsKKwkJCWYtPm1ldGFkYXRhID0gTlVMTDsKKwkJfQorCQlpZiAocmV0KSB7CisJCQkvKiBFZXAgKi8KKwkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJFZXAuIGFkZF9mdWxsX2Rub2RlX3RvX2lub2RlKCkgZmFpbGVkIGluIGNvbW1pdF93cml0ZSwgcmV0dXJuZWQgJWRcbiIsIHJldCkpOworCQkJamZmczJfbWFya19ub2RlX29ic29sZXRlKGMsIGZuLT5yYXcpOworCQkJamZmczJfZnJlZV9mdWxsX2Rub2RlKGZuKTsKKworCQkJdXAoJmYtPnNlbSk7CisJCQlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKwkJCWJyZWFrOworCQl9CisJCXVwKCZmLT5zZW0pOworCQlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKwkJaWYgKCFkYXRhbGVuKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJFZXAuIFdlIGRpZG4ndCBhY3R1YWxseSB3cml0ZSBhbnkgZGF0YSBpbiBqZmZzMl93cml0ZV9pbm9kZV9yYW5nZSgpXG4iKTsKKwkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCQlEMShwcmludGsoS0VSTl9ERUJVRyAiaW5jcmVhc2luZyB3cml0dGVubGVuIGJ5ICVkXG4iLCBkYXRhbGVuKSk7CisJCXdyaXR0ZW5sZW4gKz0gZGF0YWxlbjsKKwkJb2Zmc2V0ICs9IGRhdGFsZW47CisJCXdyaXRlbGVuIC09IGRhdGFsZW47CisJCWJ1ZiArPSBkYXRhbGVuOworCX0KKwkqcmV0bGVuID0gd3JpdHRlbmxlbjsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgamZmczJfZG9fY3JlYXRlKHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBzdHJ1Y3QgamZmczJfaW5vZGVfaW5mbyAqZGlyX2YsIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpmLCBzdHJ1Y3QgamZmczJfcmF3X2lub2RlICpyaSwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pCit7CisJc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQgKnJkOworCXN0cnVjdCBqZmZzMl9mdWxsX2Rub2RlICpmbjsKKwlzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKmZkOworCXVpbnQzMl90IGFsbG9jbGVuLCBwaHlzX29mczsKKwlpbnQgcmV0OworCisJLyogVHJ5IHRvIHJlc2VydmUgZW5vdWdoIHNwYWNlIGZvciBib3RoIG5vZGUgYW5kIGRpcmVudC4gCisJICogSnVzdCB0aGUgbm9kZSB3aWxsIGRvIGZvciBub3csIHRob3VnaCAKKwkgKi8KKwlyZXQgPSBqZmZzMl9yZXNlcnZlX3NwYWNlKGMsIHNpemVvZigqcmkpLCAmcGh5c19vZnMsICZhbGxvY2xlbiwgQUxMT0NfTk9STUFMKTsKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZG9fY3JlYXRlKCk6IHJlc2VydmVkIDB4JXggYnl0ZXNcbiIsIGFsbG9jbGVuKSk7CisJaWYgKHJldCkgeworCQl1cCgmZi0+c2VtKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyaS0+ZGF0YV9jcmMgPSBjcHVfdG9famUzMigwKTsKKwlyaS0+bm9kZV9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCByaSwgc2l6ZW9mKCpyaSktOCkpOworCisJZm4gPSBqZmZzMl93cml0ZV9kbm9kZShjLCBmLCByaSwgTlVMTCwgMCwgcGh5c19vZnMsIEFMTE9DX05PUk1BTCk7CisKKwlEMShwcmludGsoS0VSTl9ERUJVRyAiamZmczJfZG9fY3JlYXRlIGNyZWF0ZWQgZmlsZSB3aXRoIG1vZGUgMHgleFxuIiwKKwkJICBqZW1vZGVfdG9fY3B1KHJpLT5tb2RlKSkpOworCisJaWYgKElTX0VSUihmbikpIHsKKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX3dyaXRlX2Rub2RlKCkgZmFpbGVkXG4iKSk7CisJCS8qIEVlZWsuIFdhdmUgYnllIGJ5ZSAqLworCQl1cCgmZi0+c2VtKTsKKwkJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7CisJCXJldHVybiBQVFJfRVJSKGZuKTsKKwl9CisJLyogTm8gZGF0YSBoZXJlLiBPbmx5IGEgbWV0YWRhdGEgbm9kZSwgd2hpY2ggd2lsbCBiZSAKKwkgICBvYnNvbGV0ZWQgYnkgdGhlIGZpcnN0IGRhdGEgd3JpdGUKKwkqLworCWYtPm1ldGFkYXRhID0gZm47CisKKwl1cCgmZi0+c2VtKTsKKwlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKwlyZXQgPSBqZmZzMl9yZXNlcnZlX3NwYWNlKGMsIHNpemVvZigqcmQpK25hbWVsZW4sICZwaHlzX29mcywgJmFsbG9jbGVuLCBBTExPQ19OT1JNQUwpOworCQkKKwlpZiAocmV0KSB7CisJCS8qIEVlcC4gKi8KKwkJRDEocHJpbnRrKEtFUk5fREVCVUcgImpmZnMyX3Jlc2VydmVfc3BhY2UoKSBmb3IgZGlyZW50IGZhaWxlZFxuIikpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJkID0gamZmczJfYWxsb2NfcmF3X2RpcmVudCgpOworCWlmICghcmQpIHsKKwkJLyogQXJnaC4gTm93IHdlIHRyZWF0IGl0IGxpa2UgYSBub3JtYWwgZGVsZXRlICovCisJCWpmZnMyX2NvbXBsZXRlX3Jlc2VydmF0aW9uKGMpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkb3duKCZkaXJfZi0+c2VtKTsKKworCXJkLT5tYWdpYyA9IGNwdV90b19qZTE2KEpGRlMyX01BR0lDX0JJVE1BU0spOworCXJkLT5ub2RldHlwZSA9IGNwdV90b19qZTE2KEpGRlMyX05PREVUWVBFX0RJUkVOVCk7CisJcmQtPnRvdGxlbiA9IGNwdV90b19qZTMyKHNpemVvZigqcmQpICsgbmFtZWxlbik7CisJcmQtPmhkcl9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCByZCwgc2l6ZW9mKHN0cnVjdCBqZmZzMl91bmtub3duX25vZGUpLTQpKTsKKworCXJkLT5waW5vID0gY3B1X3RvX2plMzIoZGlyX2YtPmlub2NhY2hlLT5pbm8pOworCXJkLT52ZXJzaW9uID0gY3B1X3RvX2plMzIoKytkaXJfZi0+aGlnaGVzdF92ZXJzaW9uKTsKKwlyZC0+aW5vID0gcmktPmlubzsKKwlyZC0+bWN0aW1lID0gcmktPmN0aW1lOworCXJkLT5uc2l6ZSA9IG5hbWVsZW47CisJcmQtPnR5cGUgPSBEVF9SRUc7CisJcmQtPm5vZGVfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgcmQsIHNpemVvZigqcmQpLTgpKTsKKwlyZC0+bmFtZV9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCBuYW1lLCBuYW1lbGVuKSk7CisKKwlmZCA9IGpmZnMyX3dyaXRlX2RpcmVudChjLCBkaXJfZiwgcmQsIG5hbWUsIG5hbWVsZW4sIHBoeXNfb2ZzLCBBTExPQ19OT1JNQUwpOworCisJamZmczJfZnJlZV9yYXdfZGlyZW50KHJkKTsKKwkKKwlpZiAoSVNfRVJSKGZkKSkgeworCQkvKiBkaXJlbnQgZmFpbGVkIHRvIHdyaXRlLiBEZWxldGUgdGhlIGlub2RlIG5vcm1hbGx5IAorCQkgICBhcyBpZiBpdCB3ZXJlIHRoZSBmaW5hbCB1bmxpbmsoKSAqLworCQlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKwkJdXAoJmRpcl9mLT5zZW0pOworCQlyZXR1cm4gUFRSX0VSUihmZCk7CisJfQorCisJLyogTGluayB0aGUgZmQgaW50byB0aGUgaW5vZGUncyBsaXN0LCBvYnNvbGV0aW5nIGFuIG9sZAorCSAgIG9uZSBpZiBuZWNlc3NhcnkuICovCisJamZmczJfYWRkX2ZkX3RvX2xpc3QoYywgZmQsICZkaXJfZi0+ZGVudHMpOworCisJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7CisJdXAoJmRpcl9mLT5zZW0pOworCisJcmV0dXJuIDA7Cit9CisKKworaW50IGpmZnMyX2RvX3VubGluayhzdHJ1Y3QgamZmczJfc2JfaW5mbyAqYywgc3RydWN0IGpmZnMyX2lub2RlX2luZm8gKmRpcl9mLAorCQkgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpkZWFkX2YpCit7CisJc3RydWN0IGpmZnMyX3Jhd19kaXJlbnQgKnJkOworCXN0cnVjdCBqZmZzMl9mdWxsX2RpcmVudCAqZmQ7CisJdWludDMyX3QgYWxsb2NsZW4sIHBoeXNfb2ZzOworCWludCByZXQ7CisKKwlpZiAoMSAvKiBhbHRlcm5hdGl2ZSBicmFuY2ggbmVlZHMgdGVzdGluZyAqLyB8fCAKKwkgICAgIWpmZnMyX2Nhbl9tYXJrX29ic29sZXRlKGMpKSB7CisJCS8qIFdlIGNhbid0IG1hcmsgc3R1ZmYgb2Jzb2xldGUgb24gdGhlIG1lZGl1bS4gV2UgbmVlZCB0byB3cml0ZSBhIGRlbGV0aW9uIGRpcmVudCAqLworCisJCXJkID0gamZmczJfYWxsb2NfcmF3X2RpcmVudCgpOworCQlpZiAoIXJkKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJcmV0ID0gamZmczJfcmVzZXJ2ZV9zcGFjZShjLCBzaXplb2YoKnJkKStuYW1lbGVuLCAmcGh5c19vZnMsICZhbGxvY2xlbiwgQUxMT0NfREVMRVRJT04pOworCQlpZiAocmV0KSB7CisJCQlqZmZzMl9mcmVlX3Jhd19kaXJlbnQocmQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCWRvd24oJmRpcl9mLT5zZW0pOworCisJCS8qIEJ1aWxkIGEgZGVsZXRpb24gbm9kZSAqLworCQlyZC0+bWFnaWMgPSBjcHVfdG9famUxNihKRkZTMl9NQUdJQ19CSVRNQVNLKTsKKwkJcmQtPm5vZGV0eXBlID0gY3B1X3RvX2plMTYoSkZGUzJfTk9ERVRZUEVfRElSRU5UKTsKKwkJcmQtPnRvdGxlbiA9IGNwdV90b19qZTMyKHNpemVvZigqcmQpICsgbmFtZWxlbik7CisJCXJkLT5oZHJfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgcmQsIHNpemVvZihzdHJ1Y3QgamZmczJfdW5rbm93bl9ub2RlKS00KSk7CisJCQorCQlyZC0+cGlubyA9IGNwdV90b19qZTMyKGRpcl9mLT5pbm9jYWNoZS0+aW5vKTsKKwkJcmQtPnZlcnNpb24gPSBjcHVfdG9famUzMigrK2Rpcl9mLT5oaWdoZXN0X3ZlcnNpb24pOworCQlyZC0+aW5vID0gY3B1X3RvX2plMzIoMCk7CisJCXJkLT5tY3RpbWUgPSBjcHVfdG9famUzMihnZXRfc2Vjb25kcygpKTsKKwkJcmQtPm5zaXplID0gbmFtZWxlbjsKKwkJcmQtPnR5cGUgPSBEVF9VTktOT1dOOworCQlyZC0+bm9kZV9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCByZCwgc2l6ZW9mKCpyZCktOCkpOworCQlyZC0+bmFtZV9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCBuYW1lLCBuYW1lbGVuKSk7CisKKwkJZmQgPSBqZmZzMl93cml0ZV9kaXJlbnQoYywgZGlyX2YsIHJkLCBuYW1lLCBuYW1lbGVuLCBwaHlzX29mcywgQUxMT0NfREVMRVRJT04pOworCQkKKwkJamZmczJfZnJlZV9yYXdfZGlyZW50KHJkKTsKKworCQlpZiAoSVNfRVJSKGZkKSkgeworCQkJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7CisJCQl1cCgmZGlyX2YtPnNlbSk7CisJCQlyZXR1cm4gUFRSX0VSUihmZCk7CisJCX0KKworCQkvKiBGaWxlIGl0LiBUaGlzIHdpbGwgbWFyayB0aGUgb2xkIG9uZSBvYnNvbGV0ZS4gKi8KKwkJamZmczJfYWRkX2ZkX3RvX2xpc3QoYywgZmQsICZkaXJfZi0+ZGVudHMpOworCQl1cCgmZGlyX2YtPnNlbSk7CisJfSBlbHNlIHsKKwkJc3RydWN0IGpmZnMyX2Z1bGxfZGlyZW50ICoqcHJldiA9ICZkaXJfZi0+ZGVudHM7CisJCXVpbnQzMl90IG5oYXNoID0gZnVsbF9uYW1lX2hhc2gobmFtZSwgbmFtZWxlbik7CisKKwkJZG93bigmZGlyX2YtPnNlbSk7CisKKwkJd2hpbGUgKCgqcHJldikgJiYgKCpwcmV2KS0+bmhhc2ggPD0gbmhhc2gpIHsKKwkJCWlmICgoKnByZXYpLT5uaGFzaCA9PSBuaGFzaCAmJiAKKwkJCSAgICAhbWVtY21wKCgqcHJldiktPm5hbWUsIG5hbWUsIG5hbWVsZW4pICYmCisJCQkgICAgISgqcHJldiktPm5hbWVbbmFtZWxlbl0pIHsKKwkJCQlzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKnRoaXMgPSAqcHJldjsKKworCQkJCUQxKHByaW50ayhLRVJOX0RFQlVHICJNYXJraW5nIG9sZCBkaXJlbnQgbm9kZSAoaW5vICMldSkgQCUwOHggb2Jzb2xldGVcbiIsCisJCQkJCSAgdGhpcy0+aW5vLCByZWZfb2Zmc2V0KHRoaXMtPnJhdykpKTsKKworCQkJCSpwcmV2ID0gdGhpcy0+bmV4dDsKKwkJCQlqZmZzMl9tYXJrX25vZGVfb2Jzb2xldGUoYywgKHRoaXMtPnJhdykpOworCQkJCWpmZnMyX2ZyZWVfZnVsbF9kaXJlbnQodGhpcyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlwcmV2ID0gJigoKnByZXYpLT5uZXh0KTsKKwkJfQorCQl1cCgmZGlyX2YtPnNlbSk7CisJfQorCisJLyogZGVhZF9mIGlzIE5VTEwgaWYgdGhpcyB3YXMgYSByZW5hbWUgbm90IGEgcmVhbCB1bmxpbmsgKi8KKwkvKiBBbHNvIGNhdGNoIHRoZSAhZi0+aW5vY2FjaGUgY2FzZSwgd2hlcmUgdGhlcmUgd2FzIGEgZGlyZW50CisJICAgcG9pbnRpbmcgdG8gYW4gaW5vZGUgd2hpY2ggZGlkbid0IGV4aXN0LiAqLworCWlmIChkZWFkX2YgJiYgZGVhZF9mLT5pbm9jYWNoZSkgeyAKKworCQlkb3duKCZkZWFkX2YtPnNlbSk7CisKKwkJd2hpbGUgKGRlYWRfZi0+ZGVudHMpIHsKKwkJCS8qIFRoZXJlIGNhbiBiZSBvbmx5IGRlbGV0ZWQgb25lcyAqLworCQkJZmQgPSBkZWFkX2YtPmRlbnRzOworCQkJCisJCQlkZWFkX2YtPmRlbnRzID0gZmQtPm5leHQ7CisJCQkKKwkJCWlmIChmZC0+aW5vKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRGVsZXRpbmcgaW5vZGUgIyV1IHdpdGggYWN0aXZlIGRlbnRyeSBcIiVzXCItPmlubyAjJXVcbiIsCisJCQkJICAgICAgIGRlYWRfZi0+aW5vY2FjaGUtPmlubywgZmQtPm5hbWUsIGZkLT5pbm8pOworCQkJfSBlbHNlIHsKKwkJCQlEMShwcmludGsoS0VSTl9ERUJVRyAiUmVtb3ZpbmcgZGVsZXRpb24gZGlyZW50IGZvciBcIiVzXCIgZnJvbSBkaXIgaW5vICMldVxuIiwgZmQtPm5hbWUsIGRlYWRfZi0+aW5vY2FjaGUtPmlubykpOworCQkJfQorCQkJamZmczJfbWFya19ub2RlX29ic29sZXRlKGMsIGZkLT5yYXcpOworCQkJamZmczJfZnJlZV9mdWxsX2RpcmVudChmZCk7CisJCX0KKworCQlkZWFkX2YtPmlub2NhY2hlLT5ubGluay0tOworCQkvKiBOQjogQ2FsbGVyIG11c3Qgc2V0IGlub2RlIG5saW5rIGlmIGFwcHJvcHJpYXRlICovCisJCXVwKCZkZWFkX2YtPnNlbSk7CisJfQorCisJamZmczJfY29tcGxldGVfcmVzZXJ2YXRpb24oYyk7CisKKwlyZXR1cm4gMDsKK30KKworCitpbnQgamZmczJfZG9fbGluayAoc3RydWN0IGpmZnMyX3NiX2luZm8gKmMsIHN0cnVjdCBqZmZzMl9pbm9kZV9pbmZvICpkaXJfZiwgdWludDMyX3QgaW5vLCB1aW50OF90IHR5cGUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKQoreworCXN0cnVjdCBqZmZzMl9yYXdfZGlyZW50ICpyZDsKKwlzdHJ1Y3QgamZmczJfZnVsbF9kaXJlbnQgKmZkOworCXVpbnQzMl90IGFsbG9jbGVuLCBwaHlzX29mczsKKwlpbnQgcmV0OworCisJcmQgPSBqZmZzMl9hbGxvY19yYXdfZGlyZW50KCk7CisJaWYgKCFyZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBqZmZzMl9yZXNlcnZlX3NwYWNlKGMsIHNpemVvZigqcmQpK25hbWVsZW4sICZwaHlzX29mcywgJmFsbG9jbGVuLCBBTExPQ19OT1JNQUwpOworCWlmIChyZXQpIHsKKwkJamZmczJfZnJlZV9yYXdfZGlyZW50KHJkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJCisJZG93bigmZGlyX2YtPnNlbSk7CisKKwkvKiBCdWlsZCBhIGRlbGV0aW9uIG5vZGUgKi8KKwlyZC0+bWFnaWMgPSBjcHVfdG9famUxNihKRkZTMl9NQUdJQ19CSVRNQVNLKTsKKwlyZC0+bm9kZXR5cGUgPSBjcHVfdG9famUxNihKRkZTMl9OT0RFVFlQRV9ESVJFTlQpOworCXJkLT50b3RsZW4gPSBjcHVfdG9famUzMihzaXplb2YoKnJkKSArIG5hbWVsZW4pOworCXJkLT5oZHJfY3JjID0gY3B1X3RvX2plMzIoY3JjMzIoMCwgcmQsIHNpemVvZihzdHJ1Y3QgamZmczJfdW5rbm93bl9ub2RlKS00KSk7CisKKwlyZC0+cGlubyA9IGNwdV90b19qZTMyKGRpcl9mLT5pbm9jYWNoZS0+aW5vKTsKKwlyZC0+dmVyc2lvbiA9IGNwdV90b19qZTMyKCsrZGlyX2YtPmhpZ2hlc3RfdmVyc2lvbik7CisJcmQtPmlubyA9IGNwdV90b19qZTMyKGlubyk7CisJcmQtPm1jdGltZSA9IGNwdV90b19qZTMyKGdldF9zZWNvbmRzKCkpOworCXJkLT5uc2l6ZSA9IG5hbWVsZW47CisKKwlyZC0+dHlwZSA9IHR5cGU7CisKKwlyZC0+bm9kZV9jcmMgPSBjcHVfdG9famUzMihjcmMzMigwLCByZCwgc2l6ZW9mKCpyZCktOCkpOworCXJkLT5uYW1lX2NyYyA9IGNwdV90b19qZTMyKGNyYzMyKDAsIG5hbWUsIG5hbWVsZW4pKTsKKworCWZkID0gamZmczJfd3JpdGVfZGlyZW50KGMsIGRpcl9mLCByZCwgbmFtZSwgbmFtZWxlbiwgcGh5c19vZnMsIEFMTE9DX05PUk1BTCk7CisJCisJamZmczJfZnJlZV9yYXdfZGlyZW50KHJkKTsKKworCWlmIChJU19FUlIoZmQpKSB7CisJCWpmZnMyX2NvbXBsZXRlX3Jlc2VydmF0aW9uKGMpOworCQl1cCgmZGlyX2YtPnNlbSk7CisJCXJldHVybiBQVFJfRVJSKGZkKTsKKwl9CisKKwkvKiBGaWxlIGl0LiBUaGlzIHdpbGwgbWFyayB0aGUgb2xkIG9uZSBvYnNvbGV0ZS4gKi8KKwlqZmZzMl9hZGRfZmRfdG9fbGlzdChjLCBmZCwgJmRpcl9mLT5kZW50cyk7CisKKwlqZmZzMl9jb21wbGV0ZV9yZXNlcnZhdGlvbihjKTsKKwl1cCgmZGlyX2YtPnNlbSk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL3dyaXRldi5jIGIvZnMvamZmczIvd3JpdGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA3OWY4MwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmZnMyL3dyaXRldi5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBKRkZTMiAtLSBKb3VybmFsbGluZyBGbGFzaCBGaWxlIFN5c3RlbSwgVmVyc2lvbiAyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSwgMjAwMiBSZWQgSGF0LCBJbmMuCisgKgorICogQ3JlYXRlZCBieSBEYXZpZCBXb29kaG91c2UgPGR3bXcyQGluZnJhZGVhZC5vcmc+CisgKgorICogRm9yIGxpY2Vuc2luZyBpbmZvcm1hdGlvbiwgc2VlIHRoZSBmaWxlICdMSUNFTkNFJyBpbiB0aGlzIGRpcmVjdG9yeS4KKyAqCisgKiAkSWQ6IHdyaXRldi5jLHYgMS42IDIwMDQvMTEvMTYgMjA6MzY6MTIgZHdtdzIgRXhwICQKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L210ZC9tdGQuaD4KKyNpbmNsdWRlICJub2RlbGlzdC5oIgorCisvKiBUaGlzIG91Z2h0IHRvIGJlIGluIGNvcmUgTVREIGNvZGUuIEFsbCByZWdpc3RlcmVkIE1URCBkZXZpY2VzCisgICB3aXRob3V0IHdyaXRldiBzaG91bGQgaGF2ZSB0aGlzIHB1dCBpbiBwbGFjZS4gQnVnIHRoZSBNVEQKKyAgIG1haW50YWluZXIgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG10ZF9mYWtlX3dyaXRldihzdHJ1Y3QgbXRkX2luZm8gKm10ZCwgY29uc3Qgc3RydWN0IGt2ZWMgKnZlY3MsCisJCQkJICB1bnNpZ25lZCBsb25nIGNvdW50LCBsb2ZmX3QgdG8sIHNpemVfdCAqcmV0bGVuKQoreworCXVuc2lnbmVkIGxvbmcgaTsKKwlzaXplX3QgdG90bGVuID0gMCwgdGhpc2xlbjsKKwlpbnQgcmV0ID0gMDsKKworCWZvciAoaT0wOyBpPGNvdW50OyBpKyspIHsKKwkJaWYgKCF2ZWNzW2ldLmlvdl9sZW4pCisJCQljb250aW51ZTsKKwkJcmV0ID0gbXRkLT53cml0ZShtdGQsIHRvLCB2ZWNzW2ldLmlvdl9sZW4sICZ0aGlzbGVuLCB2ZWNzW2ldLmlvdl9iYXNlKTsKKwkJdG90bGVuICs9IHRoaXNsZW47CisJCWlmIChyZXQgfHwgdGhpc2xlbiAhPSB2ZWNzW2ldLmlvdl9sZW4pCisJCQlicmVhazsKKwkJdG8gKz0gdmVjc1tpXS5pb3ZfbGVuOworCX0KKwlpZiAocmV0bGVuKQorCQkqcmV0bGVuID0gdG90bGVuOworCXJldHVybiByZXQ7Cit9CisKK2ludCBqZmZzMl9mbGFzaF9kaXJlY3Rfd3JpdGV2KHN0cnVjdCBqZmZzMl9zYl9pbmZvICpjLCBjb25zdCBzdHJ1Y3Qga3ZlYyAqdmVjcywKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIGxvZmZfdCB0bywgc2l6ZV90ICpyZXRsZW4pCit7CisJaWYgKGMtPm10ZC0+d3JpdGV2KQorCQlyZXR1cm4gYy0+bXRkLT53cml0ZXYoYy0+bXRkLCB2ZWNzLCBjb3VudCwgdG8sIHJldGxlbik7CisJZWxzZQorCQlyZXR1cm4gbXRkX2Zha2Vfd3JpdGV2KGMtPm10ZCwgdmVjcywgY291bnQsIHRvLCByZXRsZW4pOworfQorCmRpZmYgLS1naXQgYS9mcy9qZnMvTWFrZWZpbGUgYi9mcy9qZnMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYxZTBlOQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmcy9NYWtlZmlsZQpAQCAtMCwwICsxLDE1IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGludXggSkZTIGZpbGVzeXN0ZW0gcm91dGluZXMuCisjCisKK29iai0kKENPTkZJR19KRlNfRlMpICs9IGpmcy5vCisKK2pmcy15ICAgIDo9IHN1cGVyLm8gZmlsZS5vIGlub2RlLm8gbmFtZWkubyBqZnNfbW91bnQubyBqZnNfdW1vdW50Lm8gXAorCSAgICBqZnNfeHRyZWUubyBqZnNfaW1hcC5vIGpmc19kZWJ1Zy5vIGpmc19kbWFwLm8gXAorCSAgICBqZnNfdW5pY29kZS5vIGpmc19kdHJlZS5vIGpmc19pbm9kZS5vIFwKKwkgICAgamZzX2V4dGVudC5vIHN5bWxpbmsubyBqZnNfbWV0YXBhZ2UubyBcCisJICAgIGpmc19sb2dtZ3IubyBqZnNfdHhubWdyLm8gamZzX3VuaXVwci5vIHJlc2l6ZS5vIHhhdHRyLm8KKworamZzLSQoQ09ORklHX0pGU19QT1NJWF9BQ0wpICs9IGFjbC5vCisKK0VYVFJBX0NGTEFHUyArPSAtRF9KRlNfNEsKZGlmZiAtLWdpdCBhL2ZzL2pmcy9hY2wuYyBiL2ZzL2pmcy9hY2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDJhOWFiCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZzL2FjbC5jCkBAIC0wLDAgKzEsMjM0IEBACisvKgorICogICBDb3B5cmlnaHQgKEMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgIENvcnAuLCAyMDAyLTIwMDQKKyAqICAgQ29weXJpZ2h0IChDKSBBbmRyZWFzIEdydWVuYmFjaGVyLCAyMDAxCisgKiAgIENvcHlyaWdodCAoQykgTGludXMgVG9ydmFsZHMsIDE5OTEsIDE5OTIKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CisjaW5jbHVkZSAiamZzX2luY29yZS5oIgorI2luY2x1ZGUgImpmc194YXR0ci5oIgorI2luY2x1ZGUgImpmc19hY2wuaCIKKworc3RhdGljIHN0cnVjdCBwb3NpeF9hY2wgKmpmc19nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKQoreworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKKwljaGFyICplYV9uYW1lOworCXN0cnVjdCBqZnNfaW5vZGVfaW5mbyAqamkgPSBKRlNfSVAoaW5vZGUpOworCXN0cnVjdCBwb3NpeF9hY2wgKipwX2FjbDsKKwlpbnQgc2l6ZTsKKwljaGFyICp2YWx1ZSA9IE5VTEw7CisKKwlzd2l0Y2godHlwZSkgeworCQljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKKwkJCWVhX25hbWUgPSBYQVRUUl9OQU1FX0FDTF9BQ0NFU1M7CisJCQlwX2FjbCA9ICZqaS0+aV9hY2w7CisJCQlicmVhazsKKwkJY2FzZSBBQ0xfVFlQRV9ERUZBVUxUOgorCQkJZWFfbmFtZSA9IFhBVFRSX05BTUVfQUNMX0RFRkFVTFQ7CisJCQlwX2FjbCA9ICZqaS0+aV9kZWZhdWx0X2FjbDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJaWYgKCpwX2FjbCAhPSBKRlNfQUNMX05PVF9DQUNIRUQpCisJCXJldHVybiBwb3NpeF9hY2xfZHVwKCpwX2FjbCk7CisKKwlzaXplID0gX19qZnNfZ2V0eGF0dHIoaW5vZGUsIGVhX25hbWUsIE5VTEwsIDApOworCisJaWYgKHNpemUgPiAwKSB7CisJCXZhbHVlID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF2YWx1ZSkKKwkJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCQlzaXplID0gX19qZnNfZ2V0eGF0dHIoaW5vZGUsIGVhX25hbWUsIHZhbHVlLCBzaXplKTsKKwl9CisKKwlpZiAoc2l6ZSA8IDApIHsKKwkJaWYgKHNpemUgPT0gLUVOT0RBVEEpIHsKKwkJCSpwX2FjbCA9IE5VTEw7CisJCQlhY2wgPSBOVUxMOworCQl9IGVsc2UKKwkJCWFjbCA9IEVSUl9QVFIoc2l6ZSk7CisJfSBlbHNlIHsKKwkJYWNsID0gcG9zaXhfYWNsX2Zyb21feGF0dHIodmFsdWUsIHNpemUpOworCQlpZiAoIUlTX0VSUihhY2wpKQorCQkJKnBfYWNsID0gcG9zaXhfYWNsX2R1cChhY2wpOworCX0KKwlpZiAodmFsdWUpCisJCWtmcmVlKHZhbHVlKTsKKwlyZXR1cm4gYWNsOworfQorCitzdGF0aWMgaW50IGpmc19zZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlLCBzdHJ1Y3QgcG9zaXhfYWNsICphY2wpCit7CisJY2hhciAqZWFfbmFtZTsKKwlzdHJ1Y3QgamZzX2lub2RlX2luZm8gKmppID0gSkZTX0lQKGlub2RlKTsKKwlzdHJ1Y3QgcG9zaXhfYWNsICoqcF9hY2w7CisJaW50IHJjOworCWludCBzaXplID0gMDsKKwljaGFyICp2YWx1ZSA9IE5VTEw7CisKKwlpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJc3dpdGNoKHR5cGUpIHsKKwkJY2FzZSBBQ0xfVFlQRV9BQ0NFU1M6CisJCQllYV9uYW1lID0gWEFUVFJfTkFNRV9BQ0xfQUNDRVNTOworCQkJcF9hY2wgPSAmamktPmlfYWNsOworCQkJYnJlYWs7CisJCWNhc2UgQUNMX1RZUEVfREVGQVVMVDoKKwkJCWVhX25hbWUgPSBYQVRUUl9OQU1FX0FDTF9ERUZBVUxUOworCQkJcF9hY2wgPSAmamktPmlfZGVmYXVsdF9hY2w7CisJCQlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCQkJcmV0dXJuIGFjbCA/IC1FQUNDRVMgOiAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGFjbCkgeworCQlzaXplID0geGF0dHJfYWNsX3NpemUoYWNsLT5hX2NvdW50KTsKKwkJdmFsdWUgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIXZhbHVlKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXJjID0gcG9zaXhfYWNsX3RvX3hhdHRyKGFjbCwgdmFsdWUsIHNpemUpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBvdXQ7CisJfQorCXJjID0gX19qZnNfc2V0eGF0dHIoaW5vZGUsIGVhX25hbWUsIHZhbHVlLCBzaXplLCAwKTsKK291dDoKKwlpZiAodmFsdWUpCisJCWtmcmVlKHZhbHVlKTsKKworCWlmICghcmMpIHsKKwkJaWYgKCpwX2FjbCAmJiAoKnBfYWNsICE9IEpGU19BQ0xfTk9UX0NBQ0hFRCkpCisJCQlwb3NpeF9hY2xfcmVsZWFzZSgqcF9hY2wpOworCQkqcF9hY2wgPSBwb3NpeF9hY2xfZHVwKGFjbCk7CisJfQorCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBqZnNfY2hlY2tfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrKQoreworCXN0cnVjdCBqZnNfaW5vZGVfaW5mbyAqamkgPSBKRlNfSVAoaW5vZGUpOworCisJaWYgKGppLT5pX2FjbCA9PSBKRlNfQUNMX05PVF9DQUNIRUQpIHsKKwkJc3RydWN0IHBvc2l4X2FjbCAqYWNsID0gamZzX2dldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUyk7CisJCWlmIChJU19FUlIoYWNsKSkKKwkJCXJldHVybiBQVFJfRVJSKGFjbCk7CisJCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CisJfQorCisJaWYgKGppLT5pX2FjbCkKKwkJcmV0dXJuIHBvc2l4X2FjbF9wZXJtaXNzaW9uKGlub2RlLCBqaS0+aV9hY2wsIG1hc2spOworCXJldHVybiAtRUFHQUlOOworfQorCitpbnQgamZzX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXJldHVybiBnZW5lcmljX3Blcm1pc3Npb24oaW5vZGUsIG1hc2ssIGpmc19jaGVja19hY2wpOworfQorCitpbnQgamZzX2luaXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpbm9kZSAqZGlyKQoreworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbCA9IE5VTEw7CisJc3RydWN0IHBvc2l4X2FjbCAqY2xvbmU7CisJbW9kZV90IG1vZGU7CisJaW50IHJjID0gMDsKKworCWlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKQorCQlyZXR1cm4gMDsKKworCWFjbCA9IGpmc19nZXRfYWNsKGRpciwgQUNMX1RZUEVfREVGQVVMVCk7CisJaWYgKElTX0VSUihhY2wpKQorCQlyZXR1cm4gUFRSX0VSUihhY2wpOworCisJaWYgKGFjbCkgeworCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgeworCQkJcmMgPSBqZnNfc2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfREVGQVVMVCwgYWNsKTsKKwkJCWlmIChyYykKKwkJCQlnb3RvIGNsZWFudXA7CisJCX0KKwkJY2xvbmUgPSBwb3NpeF9hY2xfY2xvbmUoYWNsLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFjbG9uZSkgeworCQkJcmMgPSAtRU5PTUVNOworCQkJZ290byBjbGVhbnVwOworCQl9CisJCW1vZGUgPSBpbm9kZS0+aV9tb2RlOworCQlyYyA9IHBvc2l4X2FjbF9jcmVhdGVfbWFzcShjbG9uZSwgJm1vZGUpOworCQlpZiAocmMgPj0gMCkgeworCQkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisJCQlpZiAocmMgPiAwKQorCQkJCXJjID0gamZzX3NldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgY2xvbmUpOworCQl9CisJCXBvc2l4X2FjbF9yZWxlYXNlKGNsb25lKTsKK2NsZWFudXA6CisJCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CisJfSBlbHNlCisJCWlub2RlLT5pX21vZGUgJj0gfmN1cnJlbnQtPmZzLT51bWFzazsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBqZnNfYWNsX2NobW9kKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsLCAqY2xvbmU7CisJaW50IHJjOworCisJaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWFjbCA9IGpmc19nZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MpOworCWlmIChJU19FUlIoYWNsKSB8fCAhYWNsKQorCQlyZXR1cm4gUFRSX0VSUihhY2wpOworCisJY2xvbmUgPSBwb3NpeF9hY2xfY2xvbmUoYWNsLCBHRlBfS0VSTkVMKTsKKwlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOworCWlmICghY2xvbmUpCisJCXJldHVybiAtRU5PTUVNOworCisJcmMgPSBwb3NpeF9hY2xfY2htb2RfbWFzcShjbG9uZSwgaW5vZGUtPmlfbW9kZSk7CisJaWYgKCFyYykKKwkJcmMgPSBqZnNfc2V0X2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTLCBjbG9uZSk7CisKKwlwb3NpeF9hY2xfcmVsZWFzZShjbG9uZSk7CisJcmV0dXJuIHJjOworfQorCitpbnQgamZzX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmlhdHRyKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IHJjOworCisJcmMgPSBpbm9kZV9jaGFuZ2Vfb2soaW5vZGUsIGlhdHRyKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmICgoaWF0dHItPmlhX3ZhbGlkICYgQVRUUl9VSUQgJiYgaWF0dHItPmlhX3VpZCAhPSBpbm9kZS0+aV91aWQpIHx8CisJICAgIChpYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0dJRCAmJiBpYXR0ci0+aWFfZ2lkICE9IGlub2RlLT5pX2dpZCkpIHsKKwkJaWYgKERRVU9UX1RSQU5TRkVSKGlub2RlLCBpYXR0cikpCisJCQlyZXR1cm4gLUVEUVVPVDsKKwl9CisKKwlyYyA9IGlub2RlX3NldGF0dHIoaW5vZGUsIGlhdHRyKTsKKworCWlmICghcmMgJiYgKGlhdHRyLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkpCisJCXJjID0gamZzX2FjbF9jaG1vZChpbm9kZSk7CisKKwlyZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9mcy9qZnMvZW5kaWFuMjQuaCBiL2ZzL2pmcy9lbmRpYW4yNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiN2NkMDUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZnMvZW5kaWFuMjQuaApAQCAtMCwwICsxLDQ5IEBACisvKgorICogICBDb3B5cmlnaHQgKGMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDEKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2lmbmRlZiBfSF9FTkRJQU4yNAorI2RlZmluZQlfSF9FTkRJQU4yNAorCisvKgorICoJZW5kaWFuMjQuaDoKKyAqCisgKiBFbmRpYW4gY29udmVyc2lvbiBmb3IgMjQtYnl0ZSBkYXRhCisgKgorICovCisjZGVmaW5lIF9fc3dhYjI0KHgpIFwKKyh7IFwKKwlfX3UzMiBfX3ggPSAoeCk7IFwKKwkoKF9fdTMyKSggXAorCQkoKF9feCAmIChfX3UzMikweDAwMDAwMGZmVUwpIDw8IDE2KSB8IFwKKwkJIChfX3ggJiAoX191MzIpMHgwMDAwZmYwMFVMKSAgICAgICAgfCBcCisJCSgoX194ICYgKF9fdTMyKTB4MDBmZjAwMDBVTCkgPj4gMTYpICkpOyBcCit9KQorCisjaWYgKGRlZmluZWQoX19LRVJORUxfXykgJiYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pKSB8fCAoZGVmaW5lZChfX0JZVEVfT1JERVIpICYmIChfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOKSkKKwkjZGVmaW5lIF9fY3B1X3RvX2xlMjQoeCkgKChfX3UzMikoeCkpCisJI2RlZmluZSBfX2xlMjRfdG9fY3B1KHgpICgoX191MzIpKHgpKQorI2Vsc2UKKwkjZGVmaW5lIF9fY3B1X3RvX2xlMjQoeCkgX19zd2FiMjQoeCkKKwkjZGVmaW5lIF9fbGUyNF90b19jcHUoeCkgX19zd2FiMjQoeCkKKyNlbmRpZgorCisjaWZkZWYgX19LRVJORUxfXworCSNkZWZpbmUgY3B1X3RvX2xlMjQgX19jcHVfdG9fbGUyNAorCSNkZWZpbmUgbGUyNF90b19jcHUgX19sZTI0X3RvX2NwdQorI2VuZGlmCisKKyNlbmRpZgkJCQkvKiAhX0hfRU5ESUFOMjQgKi8KZGlmZiAtLWdpdCBhL2ZzL2pmcy9maWxlLmMgYi9mcy9qZnMvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4N2IwNmYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZnMvZmlsZS5jCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogICBDb3B5cmlnaHQgKGMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDAtMjAwMgorICogICBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIENocmlzdG9waCBIZWxsd2lnLCAyMDAxLTIwMDIKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlICJqZnNfaW5jb3JlLmgiCisjaW5jbHVkZSAiamZzX2RtYXAuaCIKKyNpbmNsdWRlICJqZnNfdHhubWdyLmgiCisjaW5jbHVkZSAiamZzX3hhdHRyLmgiCisjaW5jbHVkZSAiamZzX2FjbC5oIgorI2luY2x1ZGUgImpmc19kZWJ1Zy5oIgorCisKK2V4dGVybiBpbnQgamZzX2NvbW1pdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKK2V4dGVybiB2b2lkIGpmc190cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKik7CisKK2ludCBqZnNfZnN5bmMoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGRhdGFzeW5jKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IHJjID0gMDsKKworCWlmICghKGlub2RlLT5pX3N0YXRlICYgSV9ESVJUWSkgfHwKKwkgICAgKGRhdGFzeW5jICYmICEoaW5vZGUtPmlfc3RhdGUgJiBJX0RJUlRZX0RBVEFTWU5DKSkpIHsKKwkJLyogTWFrZSBzdXJlIGNvbW1pdHRlZCBjaGFuZ2VzIGhpdCB0aGUgZGlzayAqLworCQlqZnNfZmx1c2hfam91cm5hbChKRlNfU0JJKGlub2RlLT5pX3NiKS0+bG9nLCAxKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJjIHw9IGpmc19jb21taXRfaW5vZGUoaW5vZGUsIDEpOworCisJcmV0dXJuIHJjID8gLUVJTyA6IDA7Cit9CisKK3N0YXRpYyBpbnQgamZzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IHJjOworCisJaWYgKChyYyA9IGdlbmVyaWNfZmlsZV9vcGVuKGlub2RlLCBmaWxlKSkpCisJCXJldHVybiByYzsKKworCS8qCisJICogV2UgYXR0ZW1wdCB0byBhbGxvdyBvbmx5IG9uZSAiYWN0aXZlIiBmaWxlIG9wZW4gcGVyIGFnZ3JlZ2F0ZQorCSAqIGdyb3VwLiAgT3RoZXJ3aXNlLCBhcHBlbmRpbmcgdG8gZmlsZXMgaW4gcGFyYWxsZWwgY2FuIGNhdXNlCisJICogZnJhZ21lbnRhdGlvbiB3aXRoaW4gdGhlIGZpbGVzLgorCSAqCisJICogSWYgdGhlIGZpbGUgaXMgZW1wdHksIGl0IHdhcyBwcm9iYWJseSBqdXN0IGNyZWF0ZWQgYW5kIGdvaW5nCisJICogdG8gYmUgd3JpdHRlbiB0by4gIElmIGl0IGhhcyBhIHNpemUsIHdlJ2xsIGhvbGQgb2ZmIHVudGlsIHRoZQorCSAqIGZpbGUgaXMgYWN0dWFsbHkgZ3Jvd24uCisJICovCisJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYgZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgJiYKKwkgICAgKGlub2RlLT5pX3NpemUgPT0gMCkpIHsKKwkJc3RydWN0IGpmc19pbm9kZV9pbmZvICpqaSA9IEpGU19JUChpbm9kZSk7CisJCXNwaW5fbG9ja19pcnEoJmppLT5hZ19sb2NrKTsKKwkJaWYgKGppLT5hY3RpdmVfYWcgPT0gLTEpIHsKKwkJCWppLT5hY3RpdmVfYWcgPSBqaS0+YWdubzsKKwkJCWF0b21pY19pbmMoCisJCQkgICAgJkpGU19TQkkoaW5vZGUtPmlfc2IpLT5ibWFwLT5kYl9hY3RpdmVbamktPmFnbm9dKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnEoJmppLT5hZ19sb2NrKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgamZzX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGpmc19pbm9kZV9pbmZvICpqaSA9IEpGU19JUChpbm9kZSk7CisKKwlzcGluX2xvY2tfaXJxKCZqaS0+YWdfbG9jayk7CisJaWYgKGppLT5hY3RpdmVfYWcgIT0gLTEpIHsKKwkJc3RydWN0IGJtYXAgKmJtYXAgPSBKRlNfU0JJKGlub2RlLT5pX3NiKS0+Ym1hcDsKKwkJYXRvbWljX2RlYygmYm1hcC0+ZGJfYWN0aXZlW2ppLT5hY3RpdmVfYWddKTsKKwkJamktPmFjdGl2ZV9hZyA9IC0xOworCX0KKwlzcGluX3VubG9ja19pcnEoJmppLT5hZ19sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBqZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zID0geworCS50cnVuY2F0ZQk9IGpmc190cnVuY2F0ZSwKKwkuc2V0eGF0dHIJPSBqZnNfc2V0eGF0dHIsCisJLmdldHhhdHRyCT0gamZzX2dldHhhdHRyLAorCS5saXN0eGF0dHIJPSBqZnNfbGlzdHhhdHRyLAorCS5yZW1vdmV4YXR0cgk9IGpmc19yZW1vdmV4YXR0ciwKKyNpZmRlZiBDT05GSUdfSkZTX1BPU0lYX0FDTAorCS5zZXRhdHRyCT0gamZzX3NldGF0dHIsCisJLnBlcm1pc3Npb24JPSBqZnNfcGVybWlzc2lvbiwKKyNlbmRpZgorfTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBqZnNfZmlsZV9vcGVyYXRpb25zID0geworCS5vcGVuCQk9IGpmc19vcGVuLAorCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKKwkud3JpdGUJCT0gZ2VuZXJpY19maWxlX3dyaXRlLAorCS5yZWFkCQk9IGdlbmVyaWNfZmlsZV9yZWFkLAorCS5haW9fcmVhZAk9IGdlbmVyaWNfZmlsZV9haW9fcmVhZCwKKwkuYWlvX3dyaXRlCT0gZ2VuZXJpY19maWxlX2Fpb193cml0ZSwKKwkubW1hcAkJPSBnZW5lcmljX2ZpbGVfbW1hcCwKKwkucmVhZHYJCT0gZ2VuZXJpY19maWxlX3JlYWR2LAorCS53cml0ZXYJCT0gZ2VuZXJpY19maWxlX3dyaXRldiwKKyAJLnNlbmRmaWxlCT0gZ2VuZXJpY19maWxlX3NlbmRmaWxlLAorCS5mc3luYwkJPSBqZnNfZnN5bmMsCisJLnJlbGVhc2UJPSBqZnNfcmVsZWFzZSwKK307CmRpZmYgLS1naXQgYS9mcy9qZnMvaW5vZGUuYyBiL2ZzL2pmcy9pbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYzkwNjYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZnMvaW5vZGUuYwpAQCAtMCwwICsxLDM4NCBAQAorLyoKKyAqICAgQ29weXJpZ2h0IChDKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuLCAyMDAwLTIwMDQKKyAqICAgUG9ydGlvbnMgQ29weXJpZ2h0IChDKSBDaHJpc3RvcGggSGVsbHdpZywgMjAwMS0yMDAyCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbXBhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorI2luY2x1ZGUgImpmc19pbmNvcmUuaCIKKyNpbmNsdWRlICJqZnNfZmlsc3lzLmgiCisjaW5jbHVkZSAiamZzX2ltYXAuaCIKKyNpbmNsdWRlICJqZnNfZXh0ZW50LmgiCisjaW5jbHVkZSAiamZzX3VuaWNvZGUuaCIKKyNpbmNsdWRlICJqZnNfZGVidWcuaCIKKworCitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgamZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGpmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgamZzX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGpmc19kaXJfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGpmc19maWxlX29wZXJhdGlvbnM7CitzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGpmc19hb3BzOworZXh0ZXJuIGludCBmcmVlWmVyb0xpbmsoc3RydWN0IGlub2RlICopOworCit2b2lkIGpmc19yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaWYgKGRpUmVhZChpbm9kZSkpIHsgCisJCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisJCWlub2RlLT5pX29wID0gJmpmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZqZnNfZmlsZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZqZnNfYW9wczsKKwl9IGVsc2UgaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaW5vZGUtPmlfb3AgPSAmamZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9mb3AgPSAmamZzX2Rpcl9vcGVyYXRpb25zOworCX0gZWxzZSBpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkgeworCQlpZiAoaW5vZGUtPmlfc2l6ZSA+PSBJREFUQVNJWkUpIHsKKwkJCWlub2RlLT5pX29wID0gJnBhZ2Vfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCQkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmamZzX2FvcHM7CisJCX0gZWxzZQorCQkJaW5vZGUtPmlfb3AgPSAmamZzX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwl9IGVsc2UgeworCQlpbm9kZS0+aV9vcCA9ICZqZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsIGlub2RlLT5pX3JkZXYpOworCX0KK30KKworLyoKKyAqIFdvcmtob3JzZSBvZiBib3RoIGZzeW5jICYgd3JpdGVfaW5vZGUKKyAqLworaW50IGpmc19jb21taXRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHdhaXQpCit7CisJaW50IHJjID0gMDsKKwl0aWRfdCB0aWQ7CisJc3RhdGljIGludCBub2lzeSA9IDU7CisKKwlqZnNfaW5mbygiSW4gamZzX2NvbW1pdF9pbm9kZSwgaW5vZGUgPSAweCVwIiwgaW5vZGUpOworCisJLyoKKwkgKiBEb24ndCBjb21taXQgaWYgaW5vZGUgaGFzIGJlZW4gY29tbWl0dGVkIHNpbmNlIGxhc3QgYmVpbmcKKwkgKiBtYXJrZWQgZGlydHksIG9yIGlmIGl0IGhhcyBiZWVuIGRlbGV0ZWQuCisJICovCisJaWYgKGlub2RlLT5pX25saW5rID09IDAgfHwgIXRlc3RfY2ZsYWcoQ09NTUlUX0RpcnR5LCBpbm9kZSkpCisJCXJldHVybiAwOworCisJaWYgKGlzUmVhZE9ubHkoaW5vZGUpKSB7CisJCS8qIGtlcm5lbCBhbGxvd3Mgd3JpdGVzIHRvIGRldmljZXMgb24gcmVhZC1vbmx5CisJCSAqIHBhcnRpdGlvbnMgYW5kIG1heSB0aGluayBpbm9kZSBpcyBkaXJ0eQorCQkgKi8KKwkJaWYgKCFzcGVjaWFsX2ZpbGUoaW5vZGUtPmlfbW9kZSkgJiYgbm9pc3kpIHsKKwkJCWpmc19lcnIoImpmc19jb21taXRfaW5vZGUoMHglcCkgY2FsbGVkIG9uICIKKwkJCQkgICAicmVhZC1vbmx5IHZvbHVtZSIsIGlub2RlKTsKKwkJCWpmc19lcnIoIklzIHJlbW91bnQgcmFjeT8iKTsKKwkJCW5vaXN5LS07CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJdGlkID0gdHhCZWdpbihpbm9kZS0+aV9zYiwgQ09NTUlUX0lOT0RFKTsKKwlkb3duKCZKRlNfSVAoaW5vZGUpLT5jb21taXRfc2VtKTsKKworCS8qCisJICogUmV0ZXN0IGlub2RlIHN0YXRlIGFmdGVyIHRha2luZyBjb21taXRfc2VtCisJICovCisJaWYgKGlub2RlLT5pX25saW5rICYmIHRlc3RfY2ZsYWcoQ09NTUlUX0RpcnR5LCBpbm9kZSkpCisJCXJjID0gdHhDb21taXQodGlkLCAxLCAmaW5vZGUsIHdhaXQgPyBDT01NSVRfU1lOQyA6IDApOworCisJdHhFbmQodGlkKTsKKwl1cCgmSkZTX0lQKGlub2RlKS0+Y29tbWl0X3NlbSk7CisJcmV0dXJuIHJjOworfQorCitpbnQgamZzX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB3YWl0KQoreworCWlmICh0ZXN0X2NmbGFnKENPTU1JVF9Ob2xpbmssIGlub2RlKSkKKwkJcmV0dXJuIDA7CisJLyoKKwkgKiBJZiBDT01NSVRfRElSVFkgaXMgbm90IHNldCwgdGhlIGlub2RlIGlzbid0IHJlYWxseSBkaXJ0eS4KKwkgKiBJdCBoYXMgYmVlbiBjb21taXR0ZWQgc2luY2UgdGhlIGxhc3QgY2hhbmdlLCBidXQgd2FzIHN0aWxsCisJICogb24gdGhlIGRpcnR5IGlub2RlIGxpc3QuCisJICovCisJIGlmICghdGVzdF9jZmxhZyhDT01NSVRfRGlydHksIGlub2RlKSkgeworCQkvKiBNYWtlIHN1cmUgY29tbWl0dGVkIGNoYW5nZXMgaGl0IHRoZSBkaXNrICovCisJCWpmc19mbHVzaF9qb3VybmFsKEpGU19TQkkoaW5vZGUtPmlfc2IpLT5sb2csIHdhaXQpOworCQlyZXR1cm4gMDsKKwkgfQorCisJaWYgKGpmc19jb21taXRfaW5vZGUoaW5vZGUsIHdhaXQpKSB7CisJCWpmc19lcnIoImpmc193cml0ZV9pbm9kZTogamZzX2NvbW1pdF9pbm9kZSBmYWlsZWQhIik7CisJCXJldHVybiAtRUlPOworCX0gZWxzZQorCQlyZXR1cm4gMDsKK30KKwordm9pZCBqZnNfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJamZzX2luZm8oIkluIGpmc19kZWxldGVfaW5vZGUsIGlub2RlID0gMHglcCIsIGlub2RlKTsKKworCWlmICh0ZXN0X2NmbGFnKENPTU1JVF9GcmVld21hcCwgaW5vZGUpKQorCQlmcmVlWmVyb0xpbmsoaW5vZGUpOworCisJZGlGcmVlKGlub2RlKTsKKworCS8qCisJICogRnJlZSB0aGUgaW5vZGUgZnJvbSB0aGUgcXVvdGEgYWxsb2NhdGlvbi4KKwkgKi8KKwlEUVVPVF9JTklUKGlub2RlKTsKKwlEUVVPVF9GUkVFX0lOT0RFKGlub2RlKTsKKwlEUVVPVF9EUk9QKGlub2RlKTsKKworCWNsZWFyX2lub2RlKGlub2RlKTsKK30KKwordm9pZCBqZnNfZGlydHlfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdGF0aWMgaW50IG5vaXN5ID0gNTsKKworCWlmIChpc1JlYWRPbmx5KGlub2RlKSkgeworCQlpZiAoIXNwZWNpYWxfZmlsZShpbm9kZS0+aV9tb2RlKSAmJiBub2lzeSkgeworCQkJLyoga2VybmVsIGFsbG93cyB3cml0ZXMgdG8gZGV2aWNlcyBvbiByZWFkLW9ubHkKKwkJCSAqIHBhcnRpdGlvbnMgYW5kIG1heSB0cnkgdG8gbWFyayBpbm9kZSBkaXJ0eQorCQkJICovCisJCQlqZnNfZXJyKCJqZnNfZGlydHlfaW5vZGUgY2FsbGVkIG9uIHJlYWQtb25seSB2b2x1bWUiKTsKKwkJCWpmc19lcnIoIklzIHJlbW91bnQgcmFjeT8iKTsKKwkJCW5vaXN5LS07CisJCX0KKwkJcmV0dXJuOworCX0KKworCXNldF9jZmxhZyhDT01NSVRfRGlydHksIGlub2RlKTsKK30KKworc3RhdGljIGludAoramZzX2dldF9ibG9ja3Moc3RydWN0IGlub2RlICppcCwgc2VjdG9yX3QgbGJsb2NrLCB1bnNpZ25lZCBsb25nIG1heF9ibG9ja3MsCisJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkKK3sKKwlzNjQgbGJsb2NrNjQgPSBsYmxvY2s7CisJaW50IHJjID0gMDsKKwlpbnQgdGFrZV9sb2NrczsKKwl4YWRfdCB4YWQ7CisJczY0IHhhZGRyOworCWludCB4ZmxhZzsKKwlzMzIgeGxlbjsKKworCS8qCisJICogSWYgdGhpcyBpcyBhIHNwZWNpYWwgaW5vZGUgKGltYXAsIGRtYXApCisJICogdGhlIGxvY2sgc2hvdWxkIGFscmVhZHkgYmUgdGFrZW4KKwkgKi8KKwl0YWtlX2xvY2tzID0gKEpGU19JUChpcCktPmZpbGVzZXQgIT0gQUdHUkVHQVRFX0kpOworCisJLyoKKwkgKiBUYWtlIGFwcHJvcHJpYXRlIGxvY2sgb24gaW5vZGUKKwkgKi8KKwlpZiAodGFrZV9sb2NrcykgeworCQlpZiAoY3JlYXRlKQorCQkJSVdSSVRFX0xPQ0soaXApOworCQllbHNlCisJCQlJUkVBRF9MT0NLKGlwKTsKKwl9CisKKwlpZiAoKChsYmxvY2s2NCA8PCBpcC0+aV9zYi0+c19ibG9ja3NpemVfYml0cykgPCBpcC0+aV9zaXplKSAmJgorCSAgICAoeHRMb29rdXAoaXAsIGxibG9jazY0LCBtYXhfYmxvY2tzLCAmeGZsYWcsICZ4YWRkciwgJnhsZW4sIDApCisJICAgICA9PSAwKSAmJiB4bGVuKSB7CisJCWlmICh4ZmxhZyAmIFhBRF9OT1RSRUNPUkRFRCkgeworCQkJaWYgKCFjcmVhdGUpCisJCQkJLyoKKwkJCQkgKiBBbGxvY2F0ZWQgYnV0IG5vdCByZWNvcmRlZCwgcmVhZCB0cmVhdHMKKwkJCQkgKiB0aGlzIGFzIGEgaG9sZQorCQkJCSAqLworCQkJCWdvdG8gdW5sb2NrOworI2lmZGVmIF9KRlNfNEsKKwkJCVhBRG9mZnNldCgmeGFkLCBsYmxvY2s2NCk7CisJCQlYQURsZW5ndGgoJnhhZCwgeGxlbik7CisJCQlYQURhZGRyZXNzKCZ4YWQsIHhhZGRyKTsKKyNlbHNlCQkJCS8qIF9KRlNfNEsgKi8KKwkJCS8qCisJCQkgKiBBcyBsb25nIGFzIGJsb2NrIHNpemUgPSA0SywgdGhpcyBpc24ndCBhIHByb2JsZW0uCisJCQkgKiBXZSBzaG91bGQgbWFyayB0aGUgd2hvbGUgcGFnZSBub3QgQUJOUiwgYnV0IGhvdworCQkJICogd2lsbCB3ZSBrbm93IHRvIG1hcmsgdGhlIG90aGVyIGJsb2NrcyBCSF9OZXc/CisJCQkgKi8KKwkJCUJVRygpOworI2VuZGlmCQkJCS8qIF9KRlNfNEsgKi8KKwkJCXJjID0gZXh0UmVjb3JkKGlwLCAmeGFkKTsKKwkJCWlmIChyYykKKwkJCQlnb3RvIHVubG9jazsKKwkJCXNldF9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7CisJCX0KKworCQltYXBfYmgoYmhfcmVzdWx0LCBpcC0+aV9zYiwgeGFkZHIpOworCQliaF9yZXN1bHQtPmJfc2l6ZSA9IHhsZW4gPDwgaXAtPmlfYmxrYml0czsKKwkJZ290byB1bmxvY2s7CisJfQorCWlmICghY3JlYXRlKQorCQlnb3RvIHVubG9jazsKKworCS8qCisJICogQWxsb2NhdGUgYSBuZXcgYmxvY2sKKwkgKi8KKyNpZmRlZiBfSkZTXzRLCisJaWYgKChyYyA9IGV4dEhpbnQoaXAsIGxibG9jazY0IDw8IGlwLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzLCAmeGFkKSkpCisJCWdvdG8gdW5sb2NrOworCXJjID0gZXh0QWxsb2MoaXAsIG1heF9ibG9ja3MsIGxibG9jazY0LCAmeGFkLCBGQUxTRSk7CisJaWYgKHJjKQorCQlnb3RvIHVubG9jazsKKworCXNldF9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7CisJbWFwX2JoKGJoX3Jlc3VsdCwgaXAtPmlfc2IsIGFkZHJlc3NYQUQoJnhhZCkpOworCWJoX3Jlc3VsdC0+Yl9zaXplID0gbGVuZ3RoWEFEKCZ4YWQpIDw8IGlwLT5pX2Jsa2JpdHM7CisKKyNlbHNlCQkJCS8qIF9KRlNfNEsgKi8KKwkvKgorCSAqIFdlIG5lZWQgdG8gZG8gd2hhdGV2ZXIgaXQgdGFrZXMgdG8ga2VlcCBhbGwgYnV0IHRoZSBsYXN0IGJ1ZmZlcnMKKwkgKiBpbiA0SyBwYWdlcyAtIHNlZSBqZnNfd3JpdGUuYworCSAqLworCUJVRygpOworI2VuZGlmCQkJCS8qIF9KRlNfNEsgKi8KKworICAgICAgdW5sb2NrOgorCS8qCisJICogUmVsZWFzZSBsb2NrIG9uIGlub2RlCisJICovCisJaWYgKHRha2VfbG9ja3MpIHsKKwkJaWYgKGNyZWF0ZSkKKwkJCUlXUklURV9VTkxPQ0soaXApOworCQllbHNlCisJCQlJUkVBRF9VTkxPQ0soaXApOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgamZzX2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlwLCBzZWN0b3JfdCBsYmxvY2ssCisJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpCit7CisJcmV0dXJuIGpmc19nZXRfYmxvY2tzKGlwLCBsYmxvY2ssIDEsIGJoX3Jlc3VsdCwgY3JlYXRlKTsKK30KKworc3RhdGljIGludCBqZnNfd3JpdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlyZXR1cm4gbm9iaF93cml0ZXBhZ2UocGFnZSwgamZzX2dldF9ibG9jaywgd2JjKTsKK30KKworc3RhdGljIGludCBqZnNfd3JpdGVwYWdlcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCXJldHVybiBtcGFnZV93cml0ZXBhZ2VzKG1hcHBpbmcsIHdiYywgamZzX2dldF9ibG9jayk7Cit9CisKK3N0YXRpYyBpbnQgamZzX3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlyZXR1cm4gbXBhZ2VfcmVhZHBhZ2UocGFnZSwgamZzX2dldF9ibG9jayk7Cit9CisKK3N0YXRpYyBpbnQgamZzX3JlYWRwYWdlcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCXN0cnVjdCBsaXN0X2hlYWQgKnBhZ2VzLCB1bnNpZ25lZCBucl9wYWdlcykKK3sKKwlyZXR1cm4gbXBhZ2VfcmVhZHBhZ2VzKG1hcHBpbmcsIHBhZ2VzLCBucl9wYWdlcywgamZzX2dldF9ibG9jayk7Cit9CisKK3N0YXRpYyBpbnQgamZzX3ByZXBhcmVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKwlyZXR1cm4gbm9iaF9wcmVwYXJlX3dyaXRlKHBhZ2UsIGZyb20sIHRvLCBqZnNfZ2V0X2Jsb2NrKTsKK30KKworc3RhdGljIHNlY3Rvcl90IGpmc19ibWFwKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzZWN0b3JfdCBibG9jaykKK3sKKwlyZXR1cm4gZ2VuZXJpY19ibG9ja19ibWFwKG1hcHBpbmcsIGJsb2NrLCBqZnNfZ2V0X2Jsb2NrKTsKK30KKworc3RhdGljIHNzaXplX3QgamZzX2RpcmVjdF9JTyhpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwKKwljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgbG9mZl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBucl9zZWdzKQoreworCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OworCisJcmV0dXJuIGJsb2NrZGV2X2RpcmVjdF9JTyhydywgaW9jYiwgaW5vZGUsIGlub2RlLT5pX3NiLT5zX2JkZXYsIGlvdiwKKwkJCQlvZmZzZXQsIG5yX3NlZ3MsIGpmc19nZXRfYmxvY2tzLCBOVUxMKTsKK30KKworc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBqZnNfYW9wcyA9IHsKKwkucmVhZHBhZ2UJPSBqZnNfcmVhZHBhZ2UsCisJLnJlYWRwYWdlcwk9IGpmc19yZWFkcGFnZXMsCisJLndyaXRlcGFnZQk9IGpmc193cml0ZXBhZ2UsCisJLndyaXRlcGFnZXMJPSBqZnNfd3JpdGVwYWdlcywKKwkuc3luY19wYWdlCT0gYmxvY2tfc3luY19wYWdlLAorCS5wcmVwYXJlX3dyaXRlCT0gamZzX3ByZXBhcmVfd3JpdGUsCisJLmNvbW1pdF93cml0ZQk9IG5vYmhfY29tbWl0X3dyaXRlLAorCS5ibWFwCQk9IGpmc19ibWFwLAorCS5kaXJlY3RfSU8JPSBqZnNfZGlyZWN0X0lPLAorfTsKKworLyoKKyAqIEd1dHMgb2YgamZzX3RydW5jYXRlLiAgQ2FsbGVkIHdpdGggbG9ja3MgYWxyZWFkeSBoZWxkLiAgQ2FuIGJlIGNhbGxlZAorICogd2l0aCBkaXJlY3RvcnkgZm9yIHRydW5jYXRpbmcgZGlyZWN0b3J5IGluZGV4IHRhYmxlLgorICovCit2b2lkIGpmc190cnVuY2F0ZV9ub2xvY2soc3RydWN0IGlub2RlICppcCwgbG9mZl90IGxlbmd0aCkKK3sKKwlsb2ZmX3QgbmV3c2l6ZTsKKwl0aWRfdCB0aWQ7CisKKwlBU1NFUlQobGVuZ3RoID49IDApOworCisJaWYgKHRlc3RfY2ZsYWcoQ09NTUlUX05vbGluaywgaXApKSB7CisJCXh0VHJ1bmNhdGUoMCwgaXAsIGxlbmd0aCwgQ09NTUlUX1dNQVApOworCQlyZXR1cm47CisJfQorCisJZG8geworCQl0aWQgPSB0eEJlZ2luKGlwLT5pX3NiLCAwKTsKKworCQkvKgorCQkgKiBUaGUgY29tbWl0X3NlbSBjYW5ub3QgYmUgdGFrZW4gYmVmb3JlIHR4QmVnaW4uCisJCSAqIHR4QmVnaW4gbWF5IGJsb2NrIGFuZCB0aGVyZSBpcyBhIGNoYW5jZSB0aGUgaW5vZGUKKwkJICogY291bGQgYmUgbWFya2VkIGRpcnR5IGFuZCBuZWVkIHRvIGJlIGNvbW1pdHRlZAorCQkgKiBiZWZvcmUgdHhCZWdpbiB1bmJsb2NrcworCQkgKi8KKwkJZG93bigmSkZTX0lQKGlwKS0+Y29tbWl0X3NlbSk7CisKKwkJbmV3c2l6ZSA9IHh0VHJ1bmNhdGUodGlkLCBpcCwgbGVuZ3RoLAorCQkJCSAgICAgQ09NTUlUX1RSVU5DQVRFIHwgQ09NTUlUX1BXTUFQKTsKKwkJaWYgKG5ld3NpemUgPCAwKSB7CisJCQl0eEVuZCh0aWQpOworCQkJdXAoJkpGU19JUChpcCktPmNvbW1pdF9zZW0pOworCQkJYnJlYWs7CisJCX0KKworCQlpcC0+aV9tdGltZSA9IGlwLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCQltYXJrX2lub2RlX2RpcnR5KGlwKTsKKworCQl0eENvbW1pdCh0aWQsIDEsICZpcCwgMCk7CisJCXR4RW5kKHRpZCk7CisJCXVwKCZKRlNfSVAoaXApLT5jb21taXRfc2VtKTsKKwl9IHdoaWxlIChuZXdzaXplID4gbGVuZ3RoKTsJLyogVHJ1bmNhdGUgaXNuJ3QgYWx3YXlzIGF0b21pYyAqLworfQorCit2b2lkIGpmc190cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlwKQoreworCWpmc19pbmZvKCJqZnNfdHJ1bmNhdGU6IHNpemUgPSAweCVseCIsICh1bG9uZykgaXAtPmlfc2l6ZSk7CisKKwlub2JoX3RydW5jYXRlX3BhZ2UoaXAtPmlfbWFwcGluZywgaXAtPmlfc2l6ZSk7CisKKwlJV1JJVEVfTE9DSyhpcCk7CisJamZzX3RydW5jYXRlX25vbG9jayhpcCwgaXAtPmlfc2l6ZSk7CisJSVdSSVRFX1VOTE9DSyhpcCk7Cit9CmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX2FjbC5oIGIvZnMvamZzL2pmc19hY2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmFlNDMwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZzL2pmc19hY2wuaApAQCAtMCwwICsxLDMwIEBACisvKgorICogICBDb3B5cmlnaHQgKGMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgIENvcnAuLCAyMDAyCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpZm5kZWYgX0hfSkZTX0FDTAorI2RlZmluZSBfSF9KRlNfQUNMCisKKyNpZmRlZiBDT05GSUdfSkZTX1BPU0lYX0FDTAorCisjaW5jbHVkZSA8bGludXgveGF0dHJfYWNsLmg+CisKK2ludCBqZnNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKiwgaW50LCBzdHJ1Y3QgbmFtZWlkYXRhICopOworaW50IGpmc19pbml0X2FjbChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGlub2RlICopOworaW50IGpmc19zZXRhdHRyKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGlhdHRyICopOworCisjZW5kaWYJCS8qIENPTkZJR19KRlNfUE9TSVhfQUNMICovCisjZW5kaWYJCS8qIF9IX0pGU19BQ0wgKi8KZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfYnRyZWUuaCBiL2ZzL2pmcy9qZnNfYnRyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjNlOWFjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZzL2pmc19idHJlZS5oCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogICBDb3B5cmlnaHQgKEMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDAtMjAwNAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7ICB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIAorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7ICB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgKiAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07ICBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaWZuZGVmCV9IX0pGU19CVFJFRQorI2RlZmluZSBfSF9KRlNfQlRSRUUKKworLyoKKyAqCWpmc19idHJlZS5oOiBCKy10cmVlCisgKgorICogSkZTIEIrLXRyZWUgKGR0cmVlIGFuZCB4dHJlZSkgY29tbW9uIGRlZmluaXRpb25zCisgKi8KKworLyoKKyAqCWJhc2ljIGJ0cmVlIHBhZ2UgLSBidHBhZ2UKKyAqCitzdHJ1Y3QgYnRwYWdlIHsKKwlzNjQgbmV4dDsJCXJpZ2h0IHNpYmxpbmcgYm4KKwlzNjQgcHJldjsJCWxlZnQgc2libGluZyBibgorCisJdTggZmxhZzsKKwl1OCByc3J2ZFs3XTsJCXR5cGUgc3BlY2lmaWMKKwlzNjQgc2VsZjsJCXNlbGYgYWRkcmVzcworCisJdTggZW50cnlbNDA2NF07Cit9OwkJCQkJCSovCisKKy8qIGJ0cGFnZXRfdCBmbGFnICovCisjZGVmaW5lIEJUX1RZUEUJCTB4MDcJLyogQistdHJlZSBpbmRleCAqLworI2RlZmluZQlCVF9ST09UCQkweDAxCS8qIHJvb3QgcGFnZSAqLworI2RlZmluZQlCVF9MRUFGCQkweDAyCS8qIGxlYWYgcGFnZSAqLworI2RlZmluZQlCVF9JTlRFUk5BTAkweDA0CS8qIGludGVybmFsIHBhZ2UgKi8KKyNkZWZpbmUJQlRfUklHSFRNT1NUCTB4MTAJLyogcmlnaHRtb3N0IHBhZ2UgKi8KKyNkZWZpbmUJQlRfTEVGVE1PU1QJMHgyMAkvKiBsZWZ0bW9zdCBwYWdlICovCisjZGVmaW5lCUJUX1NXQVBQRUQJMHg4MAkvKiB1c2VkIGJ5IGZzY2sgZm9yIGVuZGlhbiBzd2FwcGluZyAqLworCisvKiBidG9yZGVyIChpbiBpbm9kZSkgKi8KKyNkZWZpbmUJQlRfUkFORE9NCQkweDAwMDAKKyNkZWZpbmUJQlRfU0VRVUVOVElBTAkJMHgwMDAxCisjZGVmaW5lCUJUX0xPT0tVUAkJMHgwMDEwCisjZGVmaW5lCUJUX0lOU0VSVAkJMHgwMDIwCisjZGVmaW5lCUJUX0RFTEVURQkJMHgwMDQwCisKKy8qCisgKglidHJlZSBwYWdlIGJ1ZmZlciBjYWNoZSBhY2Nlc3MKKyAqLworI2RlZmluZSBCVF9JU19ST09UKE1QKSAoKChNUCktPnhmbGFnICYgQ09NTUlUX1BBR0UpID09IDApCisKKy8qIGdldCBwYWdlIGZyb20gYnVmZmVyIHBhZ2UgKi8KKyNkZWZpbmUgQlRfUEFHRShJUCwgTVAsIFRZUEUsIFJPT1QpXAorCShCVF9JU19ST09UKE1QKSA/IChUWVBFICopJkpGU19JUChJUCktPlJPT1QgOiAoVFlQRSAqKShNUCktPmRhdGEpCisKKy8qIGdldCB0aGUgcGFnZSBidWZmZXIgYW5kIHRoZSBwYWdlIGZvciBzcGVjaWZpZWQgYmxvY2sgYWRkcmVzcyAqLworI2RlZmluZSBCVF9HRVRQQUdFKElQLCBCTiwgTVAsIFRZUEUsIFNJWkUsIFAsIFJDLCBST09UKVwKK3tcCisJaWYgKChCTikgPT0gMClcCisJe1wKKwkJTVAgPSAoc3RydWN0IG1ldGFwYWdlICopJkpGU19JUChJUCktPmJ4ZmxhZztcCisJCVAgPSAoVFlQRSAqKSZKRlNfSVAoSVApLT5ST09UO1wKKwkJUkMgPSAwO1wKKwl9XAorCWVsc2VcCisJe1wKKwkJTVAgPSByZWFkX21ldGFwYWdlKChJUCksIEJOLCBTSVpFLCAxKTtcCisJCWlmIChNUCkge1wKKwkJCVJDID0gMDtcCisJCQlQID0gKE1QKS0+ZGF0YTtcCisJCX0gZWxzZSB7XAorCQkJUCA9IE5VTEw7XAorCQkJamZzX2VycigiYnJlYWQgZmFpbGVkISIpO1wKKwkJCVJDID0gLUVJTztcCisJCX1cCisJfVwKK30KKworI2RlZmluZSBCVF9NQVJLX0RJUlRZKE1QLCBJUClcCit7XAorCWlmIChCVF9JU19ST09UKE1QKSlcCisJCW1hcmtfaW5vZGVfZGlydHkoSVApO1wKKwllbHNlXAorCQltYXJrX21ldGFwYWdlX2RpcnR5KE1QKTtcCit9CisKKy8qIHB1dCB0aGUgcGFnZSBidWZmZXIgKi8KKyNkZWZpbmUgQlRfUFVUUEFHRShNUClcCit7XAorCWlmICghIEJUX0lTX1JPT1QoTVApKSBcCisJCXJlbGVhc2VfbWV0YXBhZ2UoTVApOyBcCit9CisKKworLyoKKyAqCWJ0cmVlIHRyYXZlcnNhbCBzdGFjaworICoKKyAqIHJlY29yZCB0aGUgcGF0aCB0cmF2ZXJzZWQgZHVyaW5nIHRoZSBzZWFyY2g7CisgKiB0b3AgZnJhbWUgcmVjb3JkIHRoZSBsZWFmIHBhZ2UvZW50cnkgc2VsZWN0ZWQuCisgKi8KK3N0cnVjdCBidGZyYW1lIHsJLyogc3RhY2sgZnJhbWUgKi8KKwlzNjQgYm47CQkJLyogODogKi8KKwlzMTYgaW5kZXg7CQkvKiAyOiAqLworCXMxNiBsYXN0aW5kZXg7CQkvKiAyOiB1bnVzZWQgKi8KKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOwkvKiA0Lzg6ICovCit9OwkJCQkvKiAoMTYvMjQpICovCisKK3N0cnVjdCBidHN0YWNrIHsKKwlzdHJ1Y3QgYnRmcmFtZSAqdG9wOworCWludCBuc3BsaXQ7CisJc3RydWN0IGJ0ZnJhbWUgc3RhY2tbTUFYVFJFRUhFSUdIVF07Cit9OworCisjZGVmaW5lIEJUX0NMUihidHN0YWNrKVwKKwkoYnRzdGFjayktPnRvcCA9IChidHN0YWNrKS0+c3RhY2sKKworI2RlZmluZSBCVF9TVEFDS19GVUxMKGJ0c3RhY2spXAorCSggKGJ0c3RhY2spLT50b3AgPT0gJigoYnRzdGFjayktPnN0YWNrW01BWFRSRUVIRUlHSFQtMV0pKQorCisjZGVmaW5lIEJUX1BVU0goQlRTVEFDSywgQk4sIElOREVYKVwKK3tcCisJYXNzZXJ0KCFCVF9TVEFDS19GVUxMKEJUU1RBQ0spKTtcCisJKEJUU1RBQ0spLT50b3AtPmJuID0gQk47XAorCShCVFNUQUNLKS0+dG9wLT5pbmRleCA9IElOREVYO1wKKwkrKyhCVFNUQUNLKS0+dG9wO1wKK30KKworI2RlZmluZSBCVF9QT1AoYnRzdGFjaylcCisJKCAoYnRzdGFjayktPnRvcCA9PSAoYnRzdGFjayktPnN0YWNrID8gTlVMTCA6IC0tKGJ0c3RhY2spLT50b3AgKQorCisjZGVmaW5lIEJUX1NUQUNLKGJ0c3RhY2spXAorCSggKGJ0c3RhY2spLT50b3AgPT0gKGJ0c3RhY2spLT5zdGFjayA/IE5VTEwgOiAoYnRzdGFjayktPnRvcCApCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBCVF9TVEFDS19EVU1QKHN0cnVjdCBidHN0YWNrICpidHN0YWNrKQoreworCWludCBpOworCXByaW50aygiYnRzdGFjayBkdW1wOlxuIik7CisJZm9yIChpID0gMDsgaSA8IE1BWFRSRUVIRUlHSFQ7IGkrKykKKwkJcHJpbnRrKEtFUk5fRVJSICJibiA9ICVMeCwgaW5kZXggPSAlZFxuIiwKKwkJICAgICAgIChsb25nIGxvbmcpYnRzdGFjay0+c3RhY2tbaV0uYm4sCisJCSAgICAgICBidHN0YWNrLT5zdGFja1tpXS5pbmRleCk7Cit9CisKKy8qIHJldHJpZXZlIHNlYXJjaCByZXN1bHRzICovCisjZGVmaW5lIEJUX0dFVFNFQVJDSChJUCwgTEVBRiwgQk4sIE1QLCBUWVBFLCBQLCBJTkRFWCwgUk9PVClcCit7XAorCUJOID0gKExFQUYpLT5ibjtcCisJTVAgPSAoTEVBRiktPm1wO1wKKwlpZiAoQk4pXAorCQlQID0gKFRZUEUgKilNUC0+ZGF0YTtcCisJZWxzZVwKKwkJUCA9IChUWVBFICopJkpGU19JUChJUCktPlJPT1Q7XAorCUlOREVYID0gKExFQUYpLT5pbmRleDtcCit9CisKKy8qIHB1dCB0aGUgcGFnZSBidWZmZXIgb2Ygc2VhcmNoICovCisjZGVmaW5lIEJUX1BVVFNFQVJDSChCVFNUQUNLKVwKK3tcCisJaWYgKCEgQlRfSVNfUk9PVCgoQlRTVEFDSyktPnRvcC0+bXApKVwKKwkJcmVsZWFzZV9tZXRhcGFnZSgoQlRTVEFDSyktPnRvcC0+bXApO1wKK30KKyNlbmRpZgkJCQkvKiBfSF9KRlNfQlRSRUUgKi8KZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfZGVidWcuYyBiL2ZzL2pmcy9qZnNfZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWEwYTg4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvamZzL2pmc19kZWJ1Zy5jCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogICBDb3B5cmlnaHQgKEMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDAtMjAwNAorICogICBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIENocmlzdG9waCBIZWxsd2lnLCAyMDAxLTIwMDIKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgImpmc19pbmNvcmUuaCIKKyNpbmNsdWRlICJqZnNfZmlsc3lzLmgiCisjaW5jbHVkZSAiamZzX2RlYnVnLmgiCisKKyNpZmRlZiBDT05GSUdfSkZTX0RFQlVHCit2b2lkIGR1bXBfbWVtKGNoYXIgKmxhYmVsLCB2b2lkICpkYXRhLCBpbnQgbGVuZ3RoKQoreworCWludCBpLCBqOworCWludCAqaW50cHRyID0gZGF0YTsKKwljaGFyICpjaGFycHRyID0gZGF0YTsKKwljaGFyIGJ1ZlsxMF0sIGxpbmVbODBdOworCisJcHJpbnRrKCIlczogZHVtcCBvZiAlZCBieXRlcyBvZiBkYXRhIGF0IDB4JXBcblxuIiwgbGFiZWwsIGxlbmd0aCwKKwkgICAgICAgZGF0YSk7CisJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxNikgeworCQlsaW5lWzBdID0gMDsKKwkJZm9yIChqID0gMDsgKGogPCA0KSAmJiAoaSArIGogKiA0IDwgbGVuZ3RoKTsgaisrKSB7CisJCQlzcHJpbnRmKGJ1ZiwgIiAlMDh4IiwgaW50cHRyW2kgLyA0ICsgal0pOworCQkJc3RyY2F0KGxpbmUsIGJ1Zik7CisJCX0KKwkJYnVmWzBdID0gJyAnOworCQlidWZbMl0gPSAwOworCQlmb3IgKGogPSAwOyAoaiA8IDE2KSAmJiAoaSArIGogPCBsZW5ndGgpOyBqKyspIHsKKwkJCWJ1ZlsxXSA9CisJCQkgICAgaXNwcmludChjaGFycHRyW2kgKyBqXSkgPyBjaGFycHRyW2kgKyBqXSA6ICcuJzsKKwkJCXN0cmNhdChsaW5lLCBidWYpOworCQl9CisJCXByaW50aygiJXNcbiIsIGxpbmUpOworCX0KK30KKyNlbmRpZgorCisjaWZkZWYgUFJPQ19GU19KRlMgLyogc2VlIGpmc19kZWJ1Zy5oICovCisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmJhc2U7CisjaWZkZWYgQ09ORklHX0pGU19ERUJVRworZXh0ZXJuIHJlYWRfcHJvY190IGpmc190eGFuY2hvcl9yZWFkOworCitzdGF0aWMgaW50IGxvZ2xldmVsX3JlYWQoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCQkgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgbGVuOworCisJbGVuID0gc3ByaW50ZihwYWdlLCAiJWRcbiIsIGpmc2xvZ2xldmVsKTsKKworCWxlbiAtPSBvZmY7CisJKnN0YXJ0ID0gcGFnZSArIG9mZjsKKworCWlmIChsZW4gPiBjb3VudCkKKwkJbGVuID0gY291bnQ7CisJZWxzZQorCQkqZW9mID0gMTsKKworCWlmIChsZW4gPCAwKQorCQlsZW4gPSAwOworCisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGludCBsb2dsZXZlbF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCXVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCit7CisJY2hhciBjOworCisJaWYgKGdldF91c2VyKGMsIGJ1ZmZlcikpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogeWVzLCBJIGtub3cgdGhpcyBpcyBhbiBBU0NJSWlzbS4gIC0taGNoICovCisJaWYgKGMgPCAnMCcgfHwgYyA+ICc5JykKKwkJcmV0dXJuIC1FSU5WQUw7CisJamZzbG9nbGV2ZWwgPSBjIC0gJzAnOworCXJldHVybiBjb3VudDsKK30KKyNlbmRpZgorCisKKyNpZmRlZiBDT05GSUdfSkZTX1NUQVRJU1RJQ1MKK2V4dGVybiByZWFkX3Byb2NfdCBqZnNfbG1zdGF0c19yZWFkOworZXh0ZXJuIHJlYWRfcHJvY190IGpmc190eHN0YXRzX3JlYWQ7CitleHRlcm4gcmVhZF9wcm9jX3QgamZzX3h0c3RhdF9yZWFkOworZXh0ZXJuIHJlYWRfcHJvY190IGpmc19tcHN0YXRfcmVhZDsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHsKKwljb25zdCBjaGFyCSpuYW1lOworCXJlYWRfcHJvY190CSpyZWFkX2ZuOworCXdyaXRlX3Byb2NfdAkqd3JpdGVfZm47Cit9IEVudHJpZXNbXSA9IHsKKyNpZmRlZiBDT05GSUdfSkZTX1NUQVRJU1RJQ1MKKwl7ICJsbXN0YXRzIiwJamZzX2xtc3RhdHNfcmVhZCwgfSwKKwl7ICJ0eHN0YXRzIiwJamZzX3R4c3RhdHNfcmVhZCwgfSwKKwl7ICJ4dHN0YXQiLAlqZnNfeHRzdGF0X3JlYWQsIH0sCisJeyAibXBzdGF0IiwJamZzX21wc3RhdF9yZWFkLCB9LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0pGU19ERUJVRworCXsgIlR4QW5jaG9yIiwJamZzX3R4YW5jaG9yX3JlYWQsIH0sCisJeyAibG9nbGV2ZWwiLAlsb2dsZXZlbF9yZWFkLCBsb2dsZXZlbF93cml0ZSB9CisjZW5kaWYKK307CisjZGVmaW5lIE5QUk9DRU5UCShzaXplb2YoRW50cmllcykvc2l6ZW9mKEVudHJpZXNbMF0pKQorCit2b2lkIGpmc19wcm9jX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWlmICghKGJhc2UgPSBwcm9jX21rZGlyKCJqZnMiLCBwcm9jX3Jvb3RfZnMpKSkKKwkJcmV0dXJuOworCWJhc2UtPm93bmVyID0gVEhJU19NT0RVTEU7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlBST0NFTlQ7IGkrKykgeworCQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnA7CisJCWlmICgocCA9IGNyZWF0ZV9wcm9jX2VudHJ5KEVudHJpZXNbaV0ubmFtZSwgMCwgYmFzZSkpKSB7CisJCQlwLT5yZWFkX3Byb2MgPSBFbnRyaWVzW2ldLnJlYWRfZm47CisJCQlwLT53cml0ZV9wcm9jID0gRW50cmllc1tpXS53cml0ZV9mbjsKKwkJfQorCX0KK30KKwordm9pZCBqZnNfcHJvY19jbGVhbih2b2lkKQoreworCWludCBpOworCisJaWYgKGJhc2UpIHsKKwkJZm9yIChpID0gMDsgaSA8IE5QUk9DRU5UOyBpKyspCisJCQlyZW1vdmVfcHJvY19lbnRyeShFbnRyaWVzW2ldLm5hbWUsIGJhc2UpOworCQlyZW1vdmVfcHJvY19lbnRyeSgiamZzIiwgcHJvY19yb290X2ZzKTsKKwl9Cit9CisKKyNlbmRpZiAvKiBQUk9DX0ZTX0pGUyAqLwpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19kZWJ1Zy5oIGIvZnMvamZzL2pmc19kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzODA3OWEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZnMvamZzX2RlYnVnLmgKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiAgIENvcHlyaWdodCAoYykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwMC0yMDAyCisgKiAgIFBvcnRpb25zIENvcHlyaWdodCAoYykgQ2hyaXN0b3BoIEhlbGx3aWcsIDIwMDEtMjAwMgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7ICB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaWZuZGVmIF9IX0pGU19ERUJVRworI2RlZmluZSBfSF9KRlNfREVCVUcKKworLyoKKyAqCWpmc19kZWJ1Zy5oCisgKgorICogZ2xvYmFsIGRlYnVnIG1lc3NhZ2UsIGRhdGEgc3RydWN0dXJlL21hY3JvIGRlZmluaXRpb25zCisgKiB1bmRlciBjb250cm9sIG9mIENPTkZJR19KRlNfREVCVUcsIENPTkZJR19KRlNfU1RBVElTVElDUzsKKyAqLworCisvKgorICogQ3JlYXRlIC9wcm9jL2ZzL2pmcyBpZiBwcm9jZnMgaXMgZW5hYmxlZCBhbmRlaXRoZXIKKyAqIENPTkZJR19KRlNfREVCVUcgb3IgQ09ORklHX0pGU19TVEFUSVNUSUNTIGlzIGRlZmluZWQKKyAqLworI2lmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpICYmIChkZWZpbmVkKENPTkZJR19KRlNfREVCVUcpIHx8IGRlZmluZWQoQ09ORklHX0pGU19TVEFUSVNUSUNTKSkKKwkjZGVmaW5lIFBST0NfRlNfSkZTCisjZW5kaWYKKworLyoKKyAqCWFzc2VydCB3aXRoIHRyYWRpdGlvbmFsIHByaW50Zi9wYW5pYworICovCisjaWZkZWYgQ09ORklHX0tFUk5FTF9BU1NFUlRTCisvKiBrZ2RiIHN0dWZmICovCisjZGVmaW5lIGFzc2VydChwKSBLRVJORUxfQVNTRVJUKCNwLCBwKQorI2Vsc2UKKyNkZWZpbmUgYXNzZXJ0KHApIGRvIHsJXAorCWlmICghKHApKSB7CVwKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiQlVHIGF0ICVzOiVkIGFzc2VydCglcylcbiIsCVwKKwkJICAgICAgIF9fRklMRV9fLCBfX0xJTkVfXywgI3ApOwkJCVwKKwkJQlVHKCk7CVwKKwl9CQlcCit9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qCisgKglkZWJ1ZyBPTgorICoJLS0tLS0tLS0KKyAqLworI2lmZGVmIENPTkZJR19KRlNfREVCVUcKKyNkZWZpbmUgQVNTRVJUKHApIGFzc2VydChwKQorCisvKiBwcmludGsgdmVyYm9zaXR5ICovCisjZGVmaW5lIEpGU19MT0dMRVZFTF9FUlIgMQorI2RlZmluZSBKRlNfTE9HTEVWRUxfV0FSTiAyCisjZGVmaW5lIEpGU19MT0dMRVZFTF9ERUJVRyAzCisjZGVmaW5lIEpGU19MT0dMRVZFTF9JTkZPIDQKKworZXh0ZXJuIGludCBqZnNsb2dsZXZlbDsKKworLyogZHVtcCBtZW1vcnkgY29udGVudHMgKi8KK2V4dGVybiB2b2lkIGR1bXBfbWVtKGNoYXIgKmxhYmVsLCB2b2lkICpkYXRhLCBpbnQgbGVuZ3RoKTsKKworLyogaW5mb3JtYXRpb24gbWVzc2FnZTogZS5nLiwgY29uZmlndXJhdGlvbiwgbWFqb3IgZXZlbnQgKi8KKyNkZWZpbmUgamZzX2luZm8oZm10LCBhcmcuLi4pIGRvIHsJCQlcCisJaWYgKGpmc2xvZ2xldmVsID49IEpGU19MT0dMRVZFTF9JTkZPKQkJXAorCQlwcmludGsoS0VSTl9JTkZPIGZtdCAiXG4iLCAjIyBhcmcpOwlcCit9IHdoaWxlICgwKQorCisvKiBkZWJ1ZyBtZXNzYWdlOiBhZCBob2MgKi8KKyNkZWZpbmUgamZzX2RlYnVnKGZtdCwgYXJnLi4uKSBkbyB7CQkJXAorCWlmIChqZnNsb2dsZXZlbCA+PSBKRlNfTE9HTEVWRUxfREVCVUcpCQlcCisJCXByaW50ayhLRVJOX0RFQlVHIGZtdCAiXG4iLCAjIyBhcmcpOwlcCit9IHdoaWxlICgwKQorCisvKiB3YXJuIG1lc3NhZ2U6ICovCisjZGVmaW5lIGpmc193YXJuKGZtdCwgYXJnLi4uKSBkbyB7CQkJXAorCWlmIChqZnNsb2dsZXZlbCA+PSBKRlNfTE9HTEVWRUxfV0FSTikJCVwKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBmbXQgIlxuIiwgIyMgYXJnKTsJXAorfSB3aGlsZSAoMCkKKworLyogZXJyb3IgZXZlbnQgbWVzc2FnZTogZS5nLiwgaS9vIGVycm9yICovCisjZGVmaW5lIGpmc19lcnIoZm10LCBhcmcuLi4pIGRvIHsJCQlcCisJaWYgKGpmc2xvZ2xldmVsID49IEpGU19MT0dMRVZFTF9FUlIpCQlcCisJCXByaW50ayhLRVJOX0VSUiBmbXQgIlxuIiwgIyMgYXJnKTsJXAorfSB3aGlsZSAoMCkKKworLyoKKyAqCWRlYnVnIE9GRgorICoJLS0tLS0tLS0tCisgKi8KKyNlbHNlCQkJCS8qIENPTkZJR19KRlNfREVCVUcgKi8KKyNkZWZpbmUgZHVtcF9tZW0obGFiZWwsZGF0YSxsZW5ndGgpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBBU1NFUlQocCkgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGpmc19pbmZvKGZtdCwgYXJnLi4uKSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgamZzX2RlYnVnKGZtdCwgYXJnLi4uKSBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgamZzX3dhcm4oZm10LCBhcmcuLi4pIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBqZnNfZXJyKGZtdCwgYXJnLi4uKSBkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZgkJCQkvKiBDT05GSUdfSkZTX0RFQlVHICovCisKKy8qCisgKglzdGF0aXN0aWNzCisgKgktLS0tLS0tLS0tCisgKi8KKyNpZmRlZglDT05GSUdfSkZTX1NUQVRJU1RJQ1MKKyNkZWZpbmUJSU5DUkVNRU5UKHgpCQkoKHgpKyspCisjZGVmaW5lCURFQ1JFTUVOVCh4KQkJKCh4KS0tKQorI2RlZmluZQlISUdIV0FURVJNQVJLKHgseSkJKCh4KSA9IG1heCgoeCksICh5KSkpCisjZWxzZQorI2RlZmluZQlJTkNSRU1FTlQoeCkKKyNkZWZpbmUJREVDUkVNRU5UKHgpCisjZGVmaW5lCUhJR0hXQVRFUk1BUksoeCx5KQorI2VuZGlmCQkJCS8qIENPTkZJR19KRlNfU1RBVElTVElDUyAqLworCisjZW5kaWYJCQkJLyogX0hfSkZTX0RFQlVHICovCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX2Rpbm9kZS5oIGIvZnMvamZzL2pmc19kaW5vZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODBhMzI1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvamZzL2pmc19kaW5vZGUuaApAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqICAgQ29weXJpZ2h0IChjKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuLCAyMDAwLTIwMDEKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2lmbmRlZiBfSF9KRlNfRElOT0RFCisjZGVmaW5lIF9IX0pGU19ESU5PREUKKworLyoKKyAqICAgICAgamZzX2Rpbm9kZS5oOiBvbi1kaXNrIGlub2RlIG1hbmFnZXIKKyAqLworCisjZGVmaW5lIElOT0RFU0xPVFNJWkUgICAgICAgICAgIDEyOAorI2RlZmluZSBMMklOT0RFU0xPVFNJWkUgICAgICAgICA3CisjZGVmaW5lIGxvZzJJTk9ERVNJWkUgICAgICAgICAgIDkJLyogbG9nMihieXRlcyBwZXIgZGlub2RlKSAqLworCisKKy8qCisgKiAgICAgIG9uLWRpc2sgaW5vZGUgOiA1MTIgYnl0ZXMKKyAqCisgKiBub3RlOiBhbGlnbiA2NC1iaXQgZmllbGRzIG9uIDgtYnl0ZSBib3VuZGFyeS4KKyAqLworc3RydWN0IGRpbm9kZSB7CisJLyoKKwkgKiAgICAgIEkuIGJhc2UgYXJlYSAoMTI4IGJ5dGVzKQorCSAqICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICoKKwkgKiBkZWZpbmUgZ2VuZXJpYy9QT1NJWCBhdHRyaWJ1dGVzCisJICovCisJX19sZTMyIGRpX2lub3N0YW1wOwkvKiA0OiBzdGFtcCB0byBzaG93IGlub2RlIGJlbG9uZ3MgdG8gZmlsZXNldCAqLworCV9fbGUzMiBkaV9maWxlc2V0OwkvKiA0OiBmaWxlc2V0IG51bWJlciAqLworCV9fbGUzMiBkaV9udW1iZXI7CS8qIDQ6IGlub2RlIG51bWJlciwgYWthIGZpbGUgc2VyaWFsIG51bWJlciAqLworCV9fbGUzMiBkaV9nZW47CQkvKiA0OiBpbm9kZSBnZW5lcmF0aW9uIG51bWJlciAqLworCisJcHhkX3QgZGlfaXhweGQ7CQkvKiA4OiBpbm9kZSBleHRlbnQgZGVzY3JpcHRvciAqLworCisJX19sZTY0IGRpX3NpemU7CQkvKiA4OiBzaXplICovCisJX19sZTY0IGRpX25ibG9ja3M7CS8qIDg6IG51bWJlciBvZiBibG9ja3MgYWxsb2NhdGVkICovCisKKwlfX2xlMzIgZGlfbmxpbms7CS8qIDQ6IG51bWJlciBvZiBsaW5rcyB0byB0aGUgb2JqZWN0ICovCisKKwlfX2xlMzIgZGlfdWlkOwkJLyogNDogdXNlciBpZCBvZiBvd25lciAqLworCV9fbGUzMiBkaV9naWQ7CQkvKiA0OiBncm91cCBpZCBvZiBvd25lciAqLworCisJX19sZTMyIGRpX21vZGU7CQkvKiA0OiBhdHRyaWJ1dGUsIGZvcm1hdCBhbmQgcGVybWlzc2lvbiAqLworCisJc3RydWN0IHRpbWVzdHJ1Y190IGRpX2F0aW1lOwkvKiA4OiB0aW1lIGxhc3QgZGF0YSBhY2Nlc3NlZCAqLworCXN0cnVjdCB0aW1lc3RydWNfdCBkaV9jdGltZTsJLyogODogdGltZSBsYXN0IHN0YXR1cyBjaGFuZ2VkICovCisJc3RydWN0IHRpbWVzdHJ1Y190IGRpX210aW1lOwkvKiA4OiB0aW1lIGxhc3QgZGF0YSBtb2RpZmllZCAqLworCXN0cnVjdCB0aW1lc3RydWNfdCBkaV9vdGltZTsJLyogODogdGltZSBjcmVhdGVkICovCisKKwlkeGRfdCBkaV9hY2w7CQkvKiAxNjogYWNsIGRlc2NyaXB0b3IgKi8KKworCWR4ZF90IGRpX2VhOwkJLyogMTY6IGVhIGRlc2NyaXB0b3IgKi8KKworCV9fbGUzMiBkaV9uZXh0X2luZGV4OwkvKiA0OiBOZXh0IGF2YWlsYWJsZSBkaXJfdGFibGUgaW5kZXggKi8KKworCV9fbGUzMiBkaV9hY2x0eXBlOwkvKiA0OiBUeXBlIG9mIEFDTCAqLworCisJLyoKKwkgKiAgICAgIEV4dGVuc2lvbiBBcmVhcy4KKwkgKgorCSAqICAgICAgSGlzdG9yaWNhbGx5LCB0aGUgaW5vZGUgd2FzIHBhcnRpdGlvbmVkIGludG8gNCAxMjgtYnl0ZSBhcmVhcywKKwkgKiAgICAgIHRoZSBsYXN0IDMgYmVpbmcgZGVmaW5lZCBhcyB1bmlvbnMgd2hpY2ggY291bGQgaGF2ZSBtdWx0aXBsZQorCSAqICAgICAgdXNlcy4gIFRoZSBmaXJzdCA5NiBieXRlcyBoYWQgYmVlbiBjb21wbGV0ZWx5IHVudXNlZCB1bnRpbAorCSAqICAgICAgYW4gaW5kZXggdGFibGUgd2FzIGFkZGVkIHRvIHRoZSBkaXJlY3RvcnkuICBJdCBpcyBub3cgbW9yZQorCSAqICAgICAgdXNlZnVsIHRvIGRlc2NyaWJlIHRoZSBsYXN0IDMvNCBvZiB0aGUgaW5vZGUgYXMgYSBzaW5nbGUKKwkgKiAgICAgIHVuaW9uLiAgV2Ugd291bGQgcHJvYmFibHkgYmUgYmV0dGVyIG9mZiByZWRlc2lnbmluZyB0aGUKKwkgKiAgICAgIGVudGlyZSBzdHJ1Y3R1cmUgZnJvbSBzY3JhdGNoLCBidXQgd2UgZG9uJ3Qgd2FudCB0byBicmVhaworCSAqICAgICAgY29tbW9uYWxpdHkgd2l0aCBPUy8yJ3MgSkZTIGF0IHRoaXMgdGltZS4KKwkgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQkvKgorCQkJICogVGhpcyB0YWJsZSBjb250YWlucyB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIHRvCisJCQkgKiBmaW5kIGEgZGlyZWN0b3J5IGVudHJ5IGZyb20gYSAzMi1iaXQgaW5kZXguCisJCQkgKiBJZiB0aGUgaW5kZXggaXMgc21hbGwgZW5vdWdoLCB0aGUgdGFibGUgaXMgaW5saW5lLAorCQkJICogb3RoZXJ3aXNlLCBhbiB4LXRyZWUgcm9vdCBvdmVybGF5cyB0aGlzIHRhYmxlCisJCQkgKi8KKwkJCXN0cnVjdCBkaXJfdGFibGVfc2xvdCBfdGFibGVbMTJdOyAvKiA5NjogaW5saW5lICovCisKKwkJCWR0cm9vdF90IF9kdHJvb3Q7CQkvKiAyODg6IGR0cmVlIHJvb3QgKi8KKwkJfSBfZGlyOwkJCQkJLyogKDM4NCkgKi8KKyNkZWZpbmUgZGlfZGlydGFibGUJdS5fZGlyLl90YWJsZQorI2RlZmluZSBkaV9kdHJvb3QJdS5fZGlyLl9kdHJvb3QKKyNkZWZpbmUgZGlfcGFyZW50ICAgICAgIGRpX2R0cm9vdC5oZWFkZXIuaWRvdGRvdAorI2RlZmluZSBkaV9EQVNECQlkaV9kdHJvb3QuaGVhZGVyLkRBU0QKKworCQlzdHJ1Y3QgeworCQkJdW5pb24geworCQkJCXU4IF9kYXRhWzk2XTsJCS8qIDk2OiB1bnVzZWQgKi8KKwkJCQlzdHJ1Y3QgeworCQkJCQl2b2lkICpfaW1hcDsJLyogNDogdW51c2VkICovCisJCQkJCV9fbGUzMiBfZ2VuZ2VuOwkvKiA0OiBnZW5lcmF0b3IgKi8KKwkJCQl9IF9pbWFwOworCQkJfSBfdTE7CQkJCS8qIDk2OiAqLworI2RlZmluZSBkaV9nZW5nZW4JdS5fZmlsZS5fdTEuX2ltYXAuX2dlbmdlbgorCisJCQl1bmlvbiB7CisJCQkJeHRwYWdlX3QgX3h0cm9vdDsKKwkJCQlzdHJ1Y3QgeworCQkJCQl1OCB1bnVzZWRbMTZdOwkvKiAxNjogKi8KKwkJCQkJZHhkX3QgX2R4ZDsJLyogMTY6ICovCisJCQkJCXVuaW9uIHsKKwkJCQkJCV9fbGUzMiBfcmRldjsJLyogNDogKi8KKwkJCQkJCXU4IF9mYXN0c3ltbGlua1sxMjhdOworCQkJCQl9IF91OworCQkJCQl1OCBfaW5saW5lZWFbMTI4XTsKKwkJCQl9IF9zcGVjaWFsOworCQkJfSBfdTI7CisJCX0gX2ZpbGU7CisjZGVmaW5lIGRpX3h0cm9vdAl1Ll9maWxlLl91Mi5feHRyb290CisjZGVmaW5lIGRpX2R4ZAkJdS5fZmlsZS5fdTIuX3NwZWNpYWwuX2R4ZAorI2RlZmluZSBkaV9idHJvb3QJZGlfeHRyb290CisjZGVmaW5lIGRpX2lubGluZWRhdGEJdS5fZmlsZS5fdTIuX3NwZWNpYWwuX3UKKyNkZWZpbmUgZGlfcmRldgkJdS5fZmlsZS5fdTIuX3NwZWNpYWwuX3UuX3JkZXYKKyNkZWZpbmUgZGlfZmFzdHN5bWxpbmsJdS5fZmlsZS5fdTIuX3NwZWNpYWwuX3UuX2Zhc3RzeW1saW5rCisjZGVmaW5lIGRpX2lubGluZWVhICAgICB1Ll9maWxlLl91Mi5fc3BlY2lhbC5faW5saW5lZWEKKwl9IHU7Cit9OworCisvKiBleHRlbmRlZCBtb2RlIGJpdHMgKG9uLWRpc2sgaW5vZGUgZGlfbW9kZSkgKi8KKyNkZWZpbmUgSUZKT1VSTkFMICAgICAgIDB4MDAwMTAwMDAJLyogam91cm5hbGxlZCBmaWxlICovCisjZGVmaW5lIElTUEFSU0UgICAgICAgICAweDAwMDIwMDAwCS8qIHNwYXJzZSBmaWxlIGVuYWJsZWQgKi8KKyNkZWZpbmUgSU5MSU5FRUEgICAgICAgIDB4MDAwNDAwMDAJLyogaW5saW5lIEVBIGFyZWEgZnJlZSAqLworI2RlZmluZSBJU1dBUEZJTEUJMHgwMDgwMDAwMAkvKiBmaWxlIG9wZW4gZm9yIHBhZ2VyIHN3YXAgc3BhY2UgKi8KKworLyogbW9yZSBleHRlbmRlZCBtb2RlIGJpdHM6IGF0dHJpYnV0ZXMgZm9yIE9TLzIgKi8KKyNkZWZpbmUgSVJFQURPTkxZCTB4MDIwMDAwMDAJLyogbm8gd3JpdGUgYWNjZXNzIHRvIGZpbGUgKi8KKyNkZWZpbmUgSUFSQ0hJVkUJMHg0MDAwMDAwMAkvKiBmaWxlIGFyY2hpdmUgYml0ICovCisjZGVmaW5lIElTWVNURU0JCTB4MDgwMDAwMDAJLyogc3lzdGVtIGZpbGUgKi8KKyNkZWZpbmUgSUhJRERFTgkJMHgwNDAwMDAwMAkvKiBoaWRkZW4gZmlsZSAqLworI2RlZmluZSBJUkFTSAkJMHg0RTAwMDAwMAkvKiBtYXNrIGZvciBjaGFuZ2VhYmxlIGF0dHJpYnV0ZXMgKi8KKyNkZWZpbmUgSU5FV05BTUUJMHg4MDAwMDAwMAkvKiBub24tOC4zIGZpbGVuYW1lIGZvcm1hdCAqLworI2RlZmluZSBJRElSRUNUT1JZCTB4MjAwMDAwMDAJLyogZGlyZWN0b3J5IChzaGFkb3cgb2YgcmVhbCBiaXQpICovCisjZGVmaW5lIEFUVFJTSElGVAkyNQkvKiBiaXRzIHRvIHNoaWZ0IHRvIG1vdmUgYXR0cmlidXRlCisJCQkJICAgc3BlY2lmaWNhdGlvbiB0byBtb2RlIHBvc2l0aW9uICovCisKKyNlbmRpZiAvKl9IX0pGU19ESU5PREUgKi8KZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfZG1hcC5jIGIvZnMvamZzL2pmc19kbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg2ZTQ2NwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmcy9qZnNfZG1hcC5jCkBAIC0wLDAgKzEsNDI3MiBAQAorLyoKKyAqICAgQ29weXJpZ2h0IChDKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuLCAyMDAwLTIwMDQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlICJqZnNfaW5jb3JlLmgiCisjaW5jbHVkZSAiamZzX3N1cGVyYmxvY2suaCIKKyNpbmNsdWRlICJqZnNfZG1hcC5oIgorI2luY2x1ZGUgImpmc19pbWFwLmgiCisjaW5jbHVkZSAiamZzX2xvY2suaCIKKyNpbmNsdWRlICJqZnNfbWV0YXBhZ2UuaCIKKyNpbmNsdWRlICJqZnNfZGVidWcuaCIKKworLyoKKyAqCURlYnVnIGNvZGUgZm9yIGRvdWJsZS1jaGVja2luZyBibG9jayBtYXAKKyAqLworLyogI2RlZmluZQlfSkZTX0RFQlVHX0RNQVAJMSAqLworCisjaWZkZWYJX0pGU19ERUJVR19ETUFQCisjZGVmaW5lIERCSU5JVE1BUChzaXplLGlwYm1hcCxyZXN1bHRzKSBcCisJREJpbml0bWFwKHNpemUsaXBibWFwLHJlc3VsdHMpCisjZGVmaW5lIERCQUxMT0MoZGJtYXAsbWFwc2l6ZSxibGtubyxuYmxvY2tzKSBcCisJREJBbGxvYyhkYm1hcCxtYXBzaXplLGJsa25vLG5ibG9ja3MpCisjZGVmaW5lIERCRlJFRShkYm1hcCxtYXBzaXplLGJsa25vLG5ibG9ja3MpIFwKKwlEQkZyZWUoZGJtYXAsbWFwc2l6ZSxibGtubyxuYmxvY2tzKQorI2RlZmluZSBEQkFMTE9DQ0soZGJtYXAsbWFwc2l6ZSxibGtubyxuYmxvY2tzKSBcCisJREJBbGxvY0NLKGRibWFwLG1hcHNpemUsYmxrbm8sbmJsb2NrcykKKyNkZWZpbmUgREJGUkVFQ0soZGJtYXAsbWFwc2l6ZSxibGtubyxuYmxvY2tzKSBcCisJREJGcmVlQ0soZGJtYXAsbWFwc2l6ZSxibGtubyxuYmxvY2tzKQorCitzdGF0aWMgdm9pZCBEQmluaXRtYXAoczY0LCBzdHJ1Y3QgaW5vZGUgKiwgdTMyICoqKTsKK3N0YXRpYyB2b2lkIERCQWxsb2ModWludCAqLCBzNjQsIHM2NCwgczY0KTsKK3N0YXRpYyB2b2lkIERCRnJlZSh1aW50ICosIHM2NCwgczY0LCBzNjQpOworc3RhdGljIHZvaWQgREJBbGxvY0NLKHVpbnQgKiwgczY0LCBzNjQsIHM2NCk7CitzdGF0aWMgdm9pZCBEQkZyZWVDSyh1aW50ICosIHM2NCwgczY0LCBzNjQpOworI2Vsc2UKKyNkZWZpbmUgREJJTklUTUFQKHNpemUsaXBibWFwLHJlc3VsdHMpCisjZGVmaW5lIERCQUxMT0MoZGJtYXAsIG1hcHNpemUsIGJsa25vLCBuYmxvY2tzKQorI2RlZmluZSBEQkZSRUUoZGJtYXAsIG1hcHNpemUsIGJsa25vLCBuYmxvY2tzKQorI2RlZmluZSBEQkFMTE9DQ0soZGJtYXAsIG1hcHNpemUsIGJsa25vLCBuYmxvY2tzKQorI2RlZmluZSBEQkZSRUVDSyhkYm1hcCwgbWFwc2l6ZSwgYmxrbm8sIG5ibG9ja3MpCisjZW5kaWYJCQkJLyogX0pGU19ERUJVR19ETUFQICovCisKKy8qCisgKglTRVJJQUxJWkFUSU9OIG9mIHRoZSBCbG9jayBBbGxvY2F0aW9uIE1hcC4KKyAqCisgKgl0aGUgd29ya2luZyBzdGF0ZSBvZiB0aGUgYmxvY2sgYWxsb2NhdGlvbiBtYXAgaXMgYWNjZXNzZWQgaW4KKyAqCXR3byBkaXJlY3Rpb25zOgorICoJCisgKgkxKSBhbGxvY2F0aW9uIGFuZCBmcmVlIHJlcXVlc3RzIHRoYXQgc3RhcnQgYXQgdGhlIGRtYXAKKyAqCSAgIGxldmVsIGFuZCBtb3ZlIHVwIHRocm91Z2ggdGhlIGRtYXAgY29udHJvbCBwYWdlcyAoaS5lLgorICoJICAgdGhlIHZhc3QgbWFqb3JpdHkgb2YgcmVxdWVzdHMpLgorICogCisgKiAJMikgYWxsb2NhdGlvbiByZXF1ZXN0cyB0aGF0IHN0YXJ0IGF0IGRtYXAgY29udHJvbCBwYWdlCisgKgkgICBsZXZlbCBhbmQgd29yayBkb3duIHRvd2FyZHMgdGhlIGRtYXBzLgorICoJCisgKgl0aGUgc2VyaWFsaXphdGlvbiBzY2hlbWUgdXNlZCBoZXJlIGlzIGFzIGZvbGxvd3MuIAorICoKKyAqCXJlcXVlc3RzIHdoaWNoIHN0YXJ0IGF0IHRoZSBib3R0b20gYXJlIHNlcmlhbGl6ZWQgYWdhaW5zdCBlYWNoIAorICoJb3RoZXIgdGhyb3VnaCBidWZmZXJzIGFuZCBlYWNoIHJlcXVlc3RzIGhvbGRzIG9udG8gaXRzIGJ1ZmZlcnMgCisgKglhcyBpdCB3b3JrcyBpdCB3YXkgdXAgZnJvbSBhIHNpbmdsZSBkbWFwIHRvIHRoZSByZXF1aXJlZCBsZXZlbCAKKyAqCW9mIGRtYXAgY29udHJvbCBwYWdlLgorICoJcmVxdWVzdHMgdGhhdCBzdGFydCBhdCB0aGUgdG9wIGFyZSBzZXJpYWxpemVkIGFnYWluc3QgZWFjaCBvdGhlcgorICoJYW5kIHJlcXVlc3QgdGhhdCBzdGFydCBmcm9tIHRoZSBib3R0b20gYnkgdGhlIG11bHRpcGxlIHJlYWQvc2luZ2xlCisgKgl3cml0ZSBpbm9kZSBsb2NrIG9mIHRoZSBibWFwIGlub2RlLiByZXF1ZXN0cyBzdGFydGluZyBhdCB0aGUgdG9wCisgKgl0YWtlIHRoaXMgbG9jayBpbiB3cml0ZSBtb2RlIHdoaWxlIHJlcXVlc3Qgc3RhcnRpbmcgYXQgdGhlIGJvdHRvbQorICoJdGFrZSB0aGUgbG9jayBpbiByZWFkIG1vZGUuICBhIHNpbmdsZSB0b3AtZG93biByZXF1ZXN0IG1heSBwcm9jZWVkCisgKglleGNsdXNpdmVseSB3aGlsZSBtdWx0aXBsZSBib3R0b21zLXVwIHJlcXVlc3RzIG1heSBwcm9jZWVkIAorICogCXNpbXVsdGFuZW91c2x5ICh1bmRlciB0aGUgcHJvdGVjdGlvbiBvZiBidXN5IGJ1ZmZlcnMpLgorICoJCisgKglpbiBhZGRpdGlvbiB0byBpbmZvcm1hdGlvbiBmb3VuZCBpbiBkbWFwcyBhbmQgZG1hcCBjb250cm9sIHBhZ2VzLAorICoJdGhlIHdvcmtpbmcgc3RhdGUgb2YgdGhlIGJsb2NrIGFsbG9jYXRpb24gbWFwIGFsc28gaW5jbHVkZXMgcmVhZC8KKyAqCXdyaXRlIGluZm9ybWF0aW9uIG1haW50YWluZWQgaW4gdGhlIGJtYXAgZGVzY3JpcHRvciAoaS5lLiB0b3RhbAorICoJZnJlZSBibG9jayBjb3VudCwgYWxsb2NhdGlvbiBncm91cCBsZXZlbCBmcmVlIGJsb2NrIGNvdW50cykuCisgKglhIHNpbmdsZSBleGNsdXNpdmUgbG9jayAoQk1BUF9MT0NLKSBpcyB1c2VkIHRvIGd1YXJkIHRoaXMgaW5mb3JtYXRpb24KKyAqCWluIHRoZSBmYWNlIG9mIG11bHRpcGxlLWJvdHRvbXMgdXAgcmVxdWVzdHMuCisgKgkobG9jayBvcmRlcmluZzogSVJFQURfTE9DSywgQk1BUF9MT0NLKTsKKyAqCQorICoJYWNjZXNzZXMgdG8gdGhlIHBlcnNpc3RlbnQgc3RhdGUgb2YgdGhlIGJsb2NrIGFsbG9jYXRpb24gbWFwIChsaW1pdGVkCisgKgl0byB0aGUgcGVyc2lzdGVudCBiaXRtYXBzIGluIGRtYXBzKSBpcyBndWFyZGVkIGJ5IChidXN5KSBidWZmZXJzLgorICovCisKKyNkZWZpbmUgQk1BUF9MT0NLX0lOSVQoYm1wKQlpbml0X01VVEVYKCZibXAtPmRiX2JtYXBsb2NrKQorI2RlZmluZSBCTUFQX0xPQ0soYm1wKQkJZG93bigmYm1wLT5kYl9ibWFwbG9jaykKKyNkZWZpbmUgQk1BUF9VTkxPQ0soYm1wKQl1cCgmYm1wLT5kYl9ibWFwbG9jaykKKworLyoKKyAqIGZvcndhcmQgcmVmZXJlbmNlcworICovCitzdGF0aWMgdm9pZCBkYkFsbG9jQml0cyhzdHJ1Y3QgYm1hcCAqIGJtcCwgc3RydWN0IGRtYXAgKiBkcCwgczY0IGJsa25vLAorCQkJaW50IG5ibG9ja3MpOworc3RhdGljIHZvaWQgZGJTcGxpdChkbXRyZWVfdCAqIHRwLCBpbnQgbGVhZm5vLCBpbnQgc3BsaXRzeiwgaW50IG5ld3ZhbCk7CitzdGF0aWMgdm9pZCBkYkJhY2tTcGxpdChkbXRyZWVfdCAqIHRwLCBpbnQgbGVhZm5vKTsKK3N0YXRpYyB2b2lkIGRiSm9pbihkbXRyZWVfdCAqIHRwLCBpbnQgbGVhZm5vLCBpbnQgbmV3dmFsKTsKK3N0YXRpYyB2b2lkIGRiQWRqVHJlZShkbXRyZWVfdCAqIHRwLCBpbnQgbGVhZm5vLCBpbnQgbmV3dmFsKTsKK3N0YXRpYyBpbnQgZGJBZGpDdGwoc3RydWN0IGJtYXAgKiBibXAsIHM2NCBibGtubywgaW50IG5ld3ZhbCwgaW50IGFsbG9jLAorCQkgICAgaW50IGxldmVsKTsKK3N0YXRpYyBpbnQgZGJBbGxvY0FueShzdHJ1Y3QgYm1hcCAqIGJtcCwgczY0IG5ibG9ja3MsIGludCBsMm5iLCBzNjQgKiByZXN1bHRzKTsKK3N0YXRpYyBpbnQgZGJBbGxvY05leHQoc3RydWN0IGJtYXAgKiBibXAsIHN0cnVjdCBkbWFwICogZHAsIHM2NCBibGtubywKKwkJICAgICAgIGludCBuYmxvY2tzKTsKK3N0YXRpYyBpbnQgZGJBbGxvY05lYXIoc3RydWN0IGJtYXAgKiBibXAsIHN0cnVjdCBkbWFwICogZHAsIHM2NCBibGtubywKKwkJICAgICAgIGludCBuYmxvY2tzLAorCQkgICAgICAgaW50IGwybmIsIHM2NCAqIHJlc3VsdHMpOworc3RhdGljIGludCBkYkFsbG9jRG1hcChzdHJ1Y3QgYm1hcCAqIGJtcCwgc3RydWN0IGRtYXAgKiBkcCwgczY0IGJsa25vLAorCQkgICAgICAgaW50IG5ibG9ja3MpOworc3RhdGljIGludCBkYkFsbG9jRG1hcExldihzdHJ1Y3QgYm1hcCAqIGJtcCwgc3RydWN0IGRtYXAgKiBkcCwgaW50IG5ibG9ja3MsCisJCQkgIGludCBsMm5iLAorCQkJICBzNjQgKiByZXN1bHRzKTsKK3N0YXRpYyBpbnQgZGJBbGxvY0FHKHN0cnVjdCBibWFwICogYm1wLCBpbnQgYWdubywgczY0IG5ibG9ja3MsIGludCBsMm5iLAorCQkgICAgIHM2NCAqIHJlc3VsdHMpOworc3RhdGljIGludCBkYkFsbG9jQ3RsKHN0cnVjdCBibWFwICogYm1wLCBzNjQgbmJsb2NrcywgaW50IGwybmIsIHM2NCBibGtubywKKwkJICAgICAgczY0ICogcmVzdWx0cyk7CitzdGF0aWMgaW50IGRiRXh0ZW5kKHN0cnVjdCBpbm9kZSAqaXAsIHM2NCBibGtubywgczY0IG5ibG9ja3MsIHM2NCBhZGRuYmxvY2tzKTsKK3N0YXRpYyBpbnQgZGJGaW5kQml0cyh1MzIgd29yZCwgaW50IGwybmIpOworc3RhdGljIGludCBkYkZpbmRDdGwoc3RydWN0IGJtYXAgKiBibXAsIGludCBsMm5iLCBpbnQgbGV2ZWwsIHM2NCAqIGJsa25vKTsKK3N0YXRpYyBpbnQgZGJGaW5kTGVhZihkbXRyZWVfdCAqIHRwLCBpbnQgbDJuYiwgaW50ICpsZWFmaWR4KTsKK3N0YXRpYyB2b2lkIGRiRnJlZUJpdHMoc3RydWN0IGJtYXAgKiBibXAsIHN0cnVjdCBkbWFwICogZHAsIHM2NCBibGtubywKKwkJICAgICAgIGludCBuYmxvY2tzKTsKK3N0YXRpYyBpbnQgZGJGcmVlRG1hcChzdHJ1Y3QgYm1hcCAqIGJtcCwgc3RydWN0IGRtYXAgKiBkcCwgczY0IGJsa25vLAorCQkgICAgICBpbnQgbmJsb2Nrcyk7CitzdGF0aWMgaW50IGRiTWF4QnVkKHU4ICogY3ApOworczY0IGRiTWFwRmlsZVNpemVUb01hcFNpemUoc3RydWN0IGlub2RlICppcGJtYXApOworc3RhdGljIGludCBibGtzdG9sMihzNjQgbmIpOworCitzdGF0aWMgaW50IGNudGx6KHUzMiB2YWx1ZSk7CitzdGF0aWMgaW50IGNudHR6KHUzMiB3b3JkKTsKKworc3RhdGljIGludCBkYkFsbG9jRG1hcEJVKHN0cnVjdCBibWFwICogYm1wLCBzdHJ1Y3QgZG1hcCAqIGRwLCBzNjQgYmxrbm8sCisJCQkgaW50IG5ibG9ja3MpOworc3RhdGljIGludCBkYkluaXREbWFwKHN0cnVjdCBkbWFwICogZHAsIHM2NCBibGtubywgaW50IG5ibG9ja3MpOworc3RhdGljIGludCBkYkluaXREbWFwVHJlZShzdHJ1Y3QgZG1hcCAqIGRwKTsKK3N0YXRpYyBpbnQgZGJJbml0VHJlZShzdHJ1Y3QgZG1hcHRyZWUgKiBkdHApOworc3RhdGljIGludCBkYkluaXREbWFwQ3RsKHN0cnVjdCBkbWFwY3RsICogZGNwLCBpbnQgbGV2ZWwsIGludCBpKTsKK3N0YXRpYyBpbnQgZGJHZXRMMkFHU2l6ZShzNjQgbmJsb2Nrcyk7CisKKy8qCisgKglidWRkeSB0YWJsZQorICoKKyAqIHRhYmxlIHVzZWQgZm9yIGRldGVybWluaW5nIGJ1ZGR5IHNpemVzIHdpdGhpbiBjaGFyYWN0ZXJzIG9mIAorICogZG1hcCBiaXRtYXAgd29yZHMuICB0aGUgY2hhcmFjdGVycyB0aGVtc2VsdmVzIHNlcnZlIGFzIGluZGV4ZXMKKyAqIGludG8gdGhlIHRhYmxlLCB3aXRoIHRoZSB0YWJsZSBlbGVtZW50cyB5aWVsZGluZyB0aGUgbWF4aW11bQorICogYmluYXJ5IGJ1ZGR5IG9mIGZyZWUgYml0cyB3aXRoaW4gdGhlIGNoYXJhY3Rlci4KKyAqLworc3RhdGljIHM4IGJ1ZHRhYlsyNTZdID0geworCTMsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisJMiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKwkyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorCTIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisJMiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKwkyLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLAorCTIsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsCisJMiwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwKKwkyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorCTIsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsCisJMiwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwKKwkyLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLAorCTIsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisJMiwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwKKwkyLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLAorCTIsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDEsIDAsIDAsIC0xCit9OworCisKKy8qCisgKiBOQU1FOiAgICAJZGJNb3VudCgpCisgKgorICogRlVOQ1RJT046CWluaXRpYWxpemF0ZSB0aGUgYmxvY2sgYWxsb2NhdGlvbiBtYXAuCisgKgorICoJCW1lbW9yeSBpcyBhbGxvY2F0ZWQgZm9yIHRoZSBpbi1jb3JlIGJtYXAgZGVzY3JpcHRvciBhbmQKKyAqCQl0aGUgaW4tY29yZSBkZXNjcmlwdG9yIGlzIGluaXRpYWxpemVkIGZyb20gZGlzay4KKyAqCisgKiBQQVJBTUVURVJTOgorICogICAgICBpcGJtYXAJLSAgcG9pbnRlciB0byBpbi1jb3JlIGlub2RlIGZvciB0aGUgYmxvY2sgbWFwLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIDAJLSBzdWNjZXNzCisgKiAgICAgIC1FTk9NRU0JLSBpbnN1ZmZpY2llbnQgbWVtb3J5CisgKiAgICAgIC1FSU8JLSBpL28gZXJyb3IKKyAqLworaW50IGRiTW91bnQoc3RydWN0IGlub2RlICppcGJtYXApCit7CisJc3RydWN0IGJtYXAgKmJtcDsKKwlzdHJ1Y3QgZGJtYXBfZGlzayAqZGJtcF9sZTsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCWludCBpOworCisJLyoKKwkgKiBhbGxvY2F0ZS9pbml0aWFsaXplIHRoZSBpbi1tZW1vcnkgYm1hcCBkZXNjcmlwdG9yCisJICovCisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgaW4tbWVtb3J5IGJtYXAgZGVzY3JpcHRvciAqLworCWJtcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBibWFwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGJtcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIHJlYWQgdGhlIG9uLWRpc2sgYm1hcCBkZXNjcmlwdG9yLiAqLworCW1wID0gcmVhZF9tZXRhcGFnZShpcGJtYXAsCisJCQkgICBCTUFQQkxLTk8gPDwgSkZTX1NCSShpcGJtYXAtPmlfc2IpLT5sMm5icGVycGFnZSwKKwkJCSAgIFBTSVpFLCAwKTsKKwlpZiAobXAgPT0gTlVMTCkgeworCQlrZnJlZShibXApOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBjb3B5IHRoZSBvbi1kaXNrIGJtYXAgZGVzY3JpcHRvciB0byBpdHMgaW4tbWVtb3J5IHZlcnNpb24uICovCisJZGJtcF9sZSA9IChzdHJ1Y3QgZGJtYXBfZGlzayAqKSBtcC0+ZGF0YTsKKwlibXAtPmRiX21hcHNpemUgPSBsZTY0X3RvX2NwdShkYm1wX2xlLT5kbl9tYXBzaXplKTsKKwlibXAtPmRiX25mcmVlID0gbGU2NF90b19jcHUoZGJtcF9sZS0+ZG5fbmZyZWUpOworCWJtcC0+ZGJfbDJuYnBlcnBhZ2UgPSBsZTMyX3RvX2NwdShkYm1wX2xlLT5kbl9sMm5icGVycGFnZSk7CisJYm1wLT5kYl9udW1hZyA9IGxlMzJfdG9fY3B1KGRibXBfbGUtPmRuX251bWFnKTsKKwlibXAtPmRiX21heGxldmVsID0gbGUzMl90b19jcHUoZGJtcF9sZS0+ZG5fbWF4bGV2ZWwpOworCWJtcC0+ZGJfbWF4YWcgPSBsZTMyX3RvX2NwdShkYm1wX2xlLT5kbl9tYXhhZyk7CisJYm1wLT5kYl9hZ3ByZWYgPSBsZTMyX3RvX2NwdShkYm1wX2xlLT5kbl9hZ3ByZWYpOworCWJtcC0+ZGJfYWdsZXZlbCA9IGxlMzJfdG9fY3B1KGRibXBfbGUtPmRuX2FnbGV2ZWwpOworCWJtcC0+ZGJfYWdoZWlndGggPSBsZTMyX3RvX2NwdShkYm1wX2xlLT5kbl9hZ2hlaWd0aCk7CisJYm1wLT5kYl9hZ3dpZHRoID0gbGUzMl90b19jcHUoZGJtcF9sZS0+ZG5fYWd3aWR0aCk7CisJYm1wLT5kYl9hZ3N0YXJ0ID0gbGUzMl90b19jcHUoZGJtcF9sZS0+ZG5fYWdzdGFydCk7CisJYm1wLT5kYl9hZ2wyc2l6ZSA9IGxlMzJfdG9fY3B1KGRibXBfbGUtPmRuX2FnbDJzaXplKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYQUc7IGkrKykKKwkJYm1wLT5kYl9hZ2ZyZWVbaV0gPSBsZTY0X3RvX2NwdShkYm1wX2xlLT5kbl9hZ2ZyZWVbaV0pOworCWJtcC0+ZGJfYWdzaXplID0gbGU2NF90b19jcHUoZGJtcF9sZS0+ZG5fYWdzaXplKTsKKwlibXAtPmRiX21heGZyZWVidWQgPSBkYm1wX2xlLT5kbl9tYXhmcmVlYnVkOworCisJLyogcmVsZWFzZSB0aGUgYnVmZmVyLiAqLworCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCisJLyogYmluZCB0aGUgYm1hcCBpbm9kZSBhbmQgdGhlIGJtYXAgZGVzY3JpcHRvciB0byBlYWNoIG90aGVyLiAqLworCWJtcC0+ZGJfaXBibWFwID0gaXBibWFwOworCUpGU19TQkkoaXBibWFwLT5pX3NiKS0+Ym1hcCA9IGJtcDsKKworCW1lbXNldChibXAtPmRiX2FjdGl2ZSwgMCwgc2l6ZW9mKGJtcC0+ZGJfYWN0aXZlKSk7CisJREJJTklUTUFQKGJtcC0+ZGJfbWFwc2l6ZSwgaXBibWFwLCAmYm1wLT5kYl9EQm1hcCk7CisKKwkvKgorCSAqIGFsbG9jYXRlL2luaXRpYWxpemUgdGhlIGJtYXAgbG9jaworCSAqLworCUJNQVBfTE9DS19JTklUKGJtcCk7CisKKwlyZXR1cm4gKDApOworfQorCisKKy8qCisgKiBOQU1FOiAgICAJZGJVbm1vdW50KCkKKyAqCisgKiBGVU5DVElPTjoJdGVybWluYXRlIHRoZSBibG9jayBhbGxvY2F0aW9uIG1hcCBpbiBwcmVwYXJhdGlvbiBmb3IKKyAqCQlmaWxlIHN5c3RlbSB1bm1vdW50LgorICoKKyAqIAkJdGhlIGluLWNvcmUgYm1hcCBkZXNjcmlwdG9yIGlzIHdyaXR0ZW4gdG8gZGlzayBhbmQKKyAqCQl0aGUgbWVtb3J5IGZvciB0aGlzIGRlc2NyaXB0b3IgaXMgZnJlZWQuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgaXBibWFwCS0gIHBvaW50ZXIgdG8gaW4tY29yZSBpbm9kZSBmb3IgdGhlIGJsb2NrIG1hcC4KKyAqCisgKiBSRVRVUk4gVkFMVUVTOgorICogICAgICAwCS0gc3VjY2VzcworICogICAgICAtRUlPCS0gaS9vIGVycm9yCisgKi8KK2ludCBkYlVubW91bnQoc3RydWN0IGlub2RlICppcGJtYXAsIGludCBtb3VudGVycm9yKQoreworCXN0cnVjdCBibWFwICpibXAgPSBKRlNfU0JJKGlwYm1hcC0+aV9zYiktPmJtYXA7CisJaW50IGk7CisKKwlpZiAoIShtb3VudGVycm9yIHx8IGlzUmVhZE9ubHkoaXBibWFwKSkpCisJCWRiU3luYyhpcGJtYXApOworCisJLyoKKwkgKiBJbnZhbGlkYXRlIHRoZSBwYWdlIGNhY2hlIGJ1ZmZlcnMKKwkgKi8KKwl0cnVuY2F0ZV9pbm9kZV9wYWdlcyhpcGJtYXAtPmlfbWFwcGluZywgMCk7CisKKwkvKgorCSAqIFNhbml0eSBDaGVjaworCSAqLworCWZvciAoaSA9IDA7IGkgPCBibXAtPmRiX251bWFnOyBpKyspCisJCWlmIChhdG9taWNfcmVhZCgmYm1wLT5kYl9hY3RpdmVbaV0pKQorCQkJcHJpbnRrKEtFUk5fRVJSICJkYlVubW91bnQ6IGRiX2FjdGl2ZVslZF0gPSAlZFxuIiwKKwkJCSAgICAgICBpLCBhdG9taWNfcmVhZCgmYm1wLT5kYl9hY3RpdmVbaV0pKTsKKworCS8qIGZyZWUgdGhlIG1lbW9yeSBmb3IgdGhlIGluLW1lbW9yeSBibWFwLiAqLworCWtmcmVlKGJtcCk7CisKKwlyZXR1cm4gKDApOworfQorCisvKgorICoJZGJTeW5jKCkKKyAqLworaW50IGRiU3luYyhzdHJ1Y3QgaW5vZGUgKmlwYm1hcCkKK3sKKwlzdHJ1Y3QgZGJtYXBfZGlzayAqZGJtcF9sZTsKKwlzdHJ1Y3QgYm1hcCAqYm1wID0gSkZTX1NCSShpcGJtYXAtPmlfc2IpLT5ibWFwOworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJaW50IGk7CisKKwkvKgorCSAqIHdyaXRlIGJtYXAgZ2xvYmFsIGNvbnRyb2wgcGFnZQorCSAqLworCS8qIGdldCB0aGUgYnVmZmVyIGZvciB0aGUgb24tZGlzayBibWFwIGRlc2NyaXB0b3IuICovCisJbXAgPSByZWFkX21ldGFwYWdlKGlwYm1hcCwKKwkJCSAgIEJNQVBCTEtOTyA8PCBKRlNfU0JJKGlwYm1hcC0+aV9zYiktPmwybmJwZXJwYWdlLAorCQkJICAgUFNJWkUsIDApOworCWlmIChtcCA9PSBOVUxMKSB7CisJCWpmc19lcnIoImRiU3luYzogcmVhZF9tZXRhcGFnZSBmYWlsZWQhIik7CisJCXJldHVybiAtRUlPOworCX0KKwkvKiBjb3B5IHRoZSBpbi1tZW1vcnkgdmVyc2lvbiBvZiB0aGUgYm1hcCB0byB0aGUgb24tZGlzayB2ZXJzaW9uICovCisJZGJtcF9sZSA9IChzdHJ1Y3QgZGJtYXBfZGlzayAqKSBtcC0+ZGF0YTsKKwlkYm1wX2xlLT5kbl9tYXBzaXplID0gY3B1X3RvX2xlNjQoYm1wLT5kYl9tYXBzaXplKTsKKwlkYm1wX2xlLT5kbl9uZnJlZSA9IGNwdV90b19sZTY0KGJtcC0+ZGJfbmZyZWUpOworCWRibXBfbGUtPmRuX2wybmJwZXJwYWdlID0gY3B1X3RvX2xlMzIoYm1wLT5kYl9sMm5icGVycGFnZSk7CisJZGJtcF9sZS0+ZG5fbnVtYWcgPSBjcHVfdG9fbGUzMihibXAtPmRiX251bWFnKTsKKwlkYm1wX2xlLT5kbl9tYXhsZXZlbCA9IGNwdV90b19sZTMyKGJtcC0+ZGJfbWF4bGV2ZWwpOworCWRibXBfbGUtPmRuX21heGFnID0gY3B1X3RvX2xlMzIoYm1wLT5kYl9tYXhhZyk7CisJZGJtcF9sZS0+ZG5fYWdwcmVmID0gY3B1X3RvX2xlMzIoYm1wLT5kYl9hZ3ByZWYpOworCWRibXBfbGUtPmRuX2FnbGV2ZWwgPSBjcHVfdG9fbGUzMihibXAtPmRiX2FnbGV2ZWwpOworCWRibXBfbGUtPmRuX2FnaGVpZ3RoID0gY3B1X3RvX2xlMzIoYm1wLT5kYl9hZ2hlaWd0aCk7CisJZGJtcF9sZS0+ZG5fYWd3aWR0aCA9IGNwdV90b19sZTMyKGJtcC0+ZGJfYWd3aWR0aCk7CisJZGJtcF9sZS0+ZG5fYWdzdGFydCA9IGNwdV90b19sZTMyKGJtcC0+ZGJfYWdzdGFydCk7CisJZGJtcF9sZS0+ZG5fYWdsMnNpemUgPSBjcHVfdG9fbGUzMihibXAtPmRiX2FnbDJzaXplKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYQUc7IGkrKykKKwkJZGJtcF9sZS0+ZG5fYWdmcmVlW2ldID0gY3B1X3RvX2xlNjQoYm1wLT5kYl9hZ2ZyZWVbaV0pOworCWRibXBfbGUtPmRuX2Fnc2l6ZSA9IGNwdV90b19sZTY0KGJtcC0+ZGJfYWdzaXplKTsKKwlkYm1wX2xlLT5kbl9tYXhmcmVlYnVkID0gYm1wLT5kYl9tYXhmcmVlYnVkOworCisJLyogd3JpdGUgdGhlIGJ1ZmZlciAqLworCXdyaXRlX21ldGFwYWdlKG1wKTsKKworCS8qCisJICogd3JpdGUgb3V0IGRpcnR5IHBhZ2VzIG9mIGJtYXAKKwkgKi8KKwlmaWxlbWFwX2ZkYXRhd3JpdGUoaXBibWFwLT5pX21hcHBpbmcpOworCWZpbGVtYXBfZmRhdGF3YWl0KGlwYm1hcC0+aV9tYXBwaW5nKTsKKworCWlwYm1hcC0+aV9zdGF0ZSB8PSBJX0RJUlRZOworCWRpV3JpdGVTcGVjaWFsKGlwYm1hcCwgMCk7CisKKwlyZXR1cm4gKDApOworfQorCisKKy8qCisgKiBOQU1FOiAgICAJZGJGcmVlKCkKKyAqCisgKiBGVU5DVElPTjoJZnJlZSB0aGUgc3BlY2lmaWVkIGJsb2NrIHJhbmdlIGZyb20gdGhlIHdvcmtpbmcgYmxvY2sKKyAqCQlhbGxvY2F0aW9uIG1hcC4KKyAqCisgKgkJdGhlIGJsb2NrcyB3aWxsIGJlIGZyZWUgZnJvbSB0aGUgd29ya2luZyBtYXAgb25lIGRtYXAKKyAqCQlhdCBhIHRpbWUuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgaXAJLSAgcG9pbnRlciB0byBpbi1jb3JlIGlub2RlOworICogICAgICBibGtubwktICBzdGFydGluZyBibG9jayBudW1iZXIgdG8gYmUgZnJlZWQuCisgKiAgICAgIG5ibG9ja3MJLSAgbnVtYmVyIG9mIGJsb2NrcyB0byBiZSBmcmVlZC4KKyAqCisgKiBSRVRVUk4gVkFMVUVTOgorICogICAgICAwCS0gc3VjY2VzcworICogICAgICAtRUlPCS0gaS9vIGVycm9yCisgKi8KK2ludCBkYkZyZWUoc3RydWN0IGlub2RlICppcCwgczY0IGJsa25vLCBzNjQgbmJsb2NrcykKK3sKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCXN0cnVjdCBkbWFwICpkcDsKKwlpbnQgbmIsIHJjOworCXM2NCBsYmxrbm8sIHJlbTsKKwlzdHJ1Y3QgaW5vZGUgKmlwYm1hcCA9IEpGU19TQkkoaXAtPmlfc2IpLT5pcGJtYXA7CisJc3RydWN0IGJtYXAgKmJtcCA9IEpGU19TQkkoaXAtPmlfc2IpLT5ibWFwOworCisJSVJFQURfTE9DSyhpcGJtYXApOworCisJLyogYmxvY2sgdG8gYmUgZnJlZWQgYmV0dGVyIGJlIHdpdGhpbiB0aGUgbWFwc2l6ZS4gKi8KKwlpZiAodW5saWtlbHkoKGJsa25vID09IDApIHx8IChibGtubyArIG5ibG9ja3MgPiBibXAtPmRiX21hcHNpemUpKSkgeworCQlJUkVBRF9VTkxPQ0soaXBibWFwKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJibGtubyA9ICVMeCwgbmJsb2NrcyA9ICVMeFxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGJsa25vLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgbmJsb2Nrcyk7CisJCWpmc19lcnJvcihpcC0+aV9zYiwKKwkJCSAgImRiRnJlZTogYmxvY2sgdG8gYmUgZnJlZWQgaXMgb3V0c2lkZSB0aGUgbWFwIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qCisJICogZnJlZSB0aGUgYmxvY2tzIGEgZG1hcCBhdCBhIHRpbWUuCisJICovCisJbXAgPSBOVUxMOworCWZvciAocmVtID0gbmJsb2NrczsgcmVtID4gMDsgcmVtIC09IG5iLCBibGtubyArPSBuYikgeworCQkvKiByZWxlYXNlIHByZXZpb3VzIGRtYXAgaWYgYW55ICovCisJCWlmIChtcCkgeworCQkJd3JpdGVfbWV0YXBhZ2UobXApOworCQl9CisKKwkJLyogZ2V0IHRoZSBidWZmZXIgZm9yIHRoZSBjdXJyZW50IGRtYXAuICovCisJCWxibGtubyA9IEJMS1RPRE1BUChibGtubywgYm1wLT5kYl9sMm5icGVycGFnZSk7CisJCW1wID0gcmVhZF9tZXRhcGFnZShpcGJtYXAsIGxibGtubywgUFNJWkUsIDApOworCQlpZiAobXAgPT0gTlVMTCkgeworCQkJSVJFQURfVU5MT0NLKGlwYm1hcCk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlkcCA9IChzdHJ1Y3QgZG1hcCAqKSBtcC0+ZGF0YTsKKworCQkvKiBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBibG9ja3MgdG8gYmUgZnJlZWQgZnJvbQorCQkgKiB0aGlzIGRtYXAuCisJCSAqLworCQluYiA9IG1pbihyZW0sIEJQRVJETUFQIC0gKGJsa25vICYgKEJQRVJETUFQIC0gMSkpKTsKKworCQlEQkFMTE9DQ0soYm1wLT5kYl9EQm1hcCwgYm1wLT5kYl9tYXBzaXplLCBibGtubywgbmIpOworCisJCS8qIGZyZWUgdGhlIGJsb2Nrcy4gKi8KKwkJaWYgKChyYyA9IGRiRnJlZURtYXAoYm1wLCBkcCwgYmxrbm8sIG5iKSkpIHsKKwkJCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCQkJSVJFQURfVU5MT0NLKGlwYm1hcCk7CisJCQlyZXR1cm4gKHJjKTsKKwkJfQorCisJCURCRlJFRShibXAtPmRiX0RCbWFwLCBibXAtPmRiX21hcHNpemUsIGJsa25vLCBuYik7CisJfQorCisJLyogd3JpdGUgdGhlIGxhc3QgYnVmZmVyLiAqLworCXdyaXRlX21ldGFwYWdlKG1wKTsKKworCUlSRUFEX1VOTE9DSyhpcGJtYXApOworCisJcmV0dXJuICgwKTsKK30KKworCisvKgorICogTkFNRToJZGJVcGRhdGVQTWFwKCkKKyAqCisgKiBGVU5DVElPTjogICAgdXBkYXRlIHRoZSBhbGxvY2F0aW9uIHN0YXRlIChmcmVlIG9yIGFsbG9jYXRlKSBvZiB0aGUKKyAqCQlzcGVjaWZpZWQgYmxvY2sgcmFuZ2UgaW4gdGhlIHBlcnNpc3RlbnQgYmxvY2sgYWxsb2NhdGlvbiBtYXAuCisgKgkJCisgKgkJdGhlIGJsb2NrcyB3aWxsIGJlIHVwZGF0ZWQgaW4gdGhlIHBlcnNpc3RlbnQgbWFwIG9uZQorICoJCWRtYXAgYXQgYSB0aW1lLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIGlwYm1hcAktICBwb2ludGVyIHRvIGluLWNvcmUgaW5vZGUgZm9yIHRoZSBibG9jayBtYXAuCisgKiAgICAgIGZyZWUJLSBUUlVFIGlmIGJsb2NrIHJhbmdlIGlzIHRvIGJlIGZyZWVkIGZyb20gdGhlIHBlcnNpc3RlbnQKKyAqCQkgIG1hcDsgRkFMU0UgaWYgaXQgaXMgdG8gICBiZSBhbGxvY2F0ZWQuCisgKiAgICAgIGJsa25vCS0gIHN0YXJ0aW5nIGJsb2NrIG51bWJlciBvZiB0aGUgcmFuZ2UuCisgKiAgICAgIG5ibG9ja3MJLSAgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgYmxvY2tzIGluIHRoZSByYW5nZS4KKyAqICAgICAgdGJsawktICB0cmFuc2FjdGlvbiBibG9jazsKKyAqCisgKiBSRVRVUk4gVkFMVUVTOgorICogICAgICAwCS0gc3VjY2VzcworICogICAgICAtRUlPCS0gaS9vIGVycm9yCisgKi8KK2ludAorZGJVcGRhdGVQTWFwKHN0cnVjdCBpbm9kZSAqaXBibWFwLAorCSAgICAgaW50IGZyZWUsIHM2NCBibGtubywgczY0IG5ibG9ja3MsIHN0cnVjdCB0YmxvY2sgKiB0YmxrKQoreworCWludCBuYmxrcywgZGJpdG5vLCB3Yml0bm8sIHJiaXRzOworCWludCB3b3JkLCBuYml0cywgbndvcmRzOworCXN0cnVjdCBibWFwICpibXAgPSBKRlNfU0JJKGlwYm1hcC0+aV9zYiktPmJtYXA7CisJczY0IGxibGtubywgcmVtLCBsYXN0bGJsa25vOworCXUzMiBtYXNrOworCXN0cnVjdCBkbWFwICpkcDsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCXN0cnVjdCBqZnNfbG9nICpsb2c7CisJaW50IGxzbiwgZGlmZnQsIGRpZmZwOworCisJLyogdGhlIGJsb2NrcyBiZXR0ZXIgYmUgd2l0aGluIHRoZSBtYXBzaXplLiAqLworCWlmIChibGtubyArIG5ibG9ja3MgPiBibXAtPmRiX21hcHNpemUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJibGtubyA9ICVMeCwgbmJsb2NrcyA9ICVMeFxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGJsa25vLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgbmJsb2Nrcyk7CisJCWpmc19lcnJvcihpcGJtYXAtPmlfc2IsCisJCQkgICJkYlVwZGF0ZVBNYXA6IGJsb2NrcyBhcmUgb3V0c2lkZSB0aGUgbWFwIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIGNvbXB1dGUgZGVsdGEgb2YgdHJhbnNhY3Rpb24gbHNuIGZyb20gbG9nIHN5bmNwdCAqLworCWxzbiA9IHRibGstPmxzbjsKKwlsb2cgPSAoc3RydWN0IGpmc19sb2cgKikgSkZTX1NCSSh0YmxrLT5zYiktPmxvZzsKKwlsb2dkaWZmKGRpZmZ0LCBsc24sIGxvZyk7CisKKwkvKgorCSAqIHVwZGF0ZSB0aGUgYmxvY2sgc3RhdGUgYSBkbWFwIGF0IGEgdGltZS4KKwkgKi8KKwltcCA9IE5VTEw7CisJbGFzdGxibGtubyA9IDA7CisJZm9yIChyZW0gPSBuYmxvY2tzOyByZW0gPiAwOyByZW0gLT0gbmJsa3MsIGJsa25vICs9IG5ibGtzKSB7CisJCS8qIGdldCB0aGUgYnVmZmVyIGZvciB0aGUgY3VycmVudCBkbWFwLiAqLworCQlsYmxrbm8gPSBCTEtUT0RNQVAoYmxrbm8sIGJtcC0+ZGJfbDJuYnBlcnBhZ2UpOworCQlpZiAobGJsa25vICE9IGxhc3RsYmxrbm8pIHsKKwkJCWlmIChtcCkgeworCQkJCXdyaXRlX21ldGFwYWdlKG1wKTsKKwkJCX0KKworCQkJbXAgPSByZWFkX21ldGFwYWdlKGJtcC0+ZGJfaXBibWFwLCBsYmxrbm8sIFBTSVpFLAorCQkJCQkgICAwKTsKKwkJCWlmIChtcCA9PSBOVUxMKQorCQkJCXJldHVybiAtRUlPOworCQl9CisJCWRwID0gKHN0cnVjdCBkbWFwICopIG1wLT5kYXRhOworCisJCS8qIGRldGVybWluZSB0aGUgYml0IG51bWJlciBhbmQgd29yZCB3aXRoaW4gdGhlIGRtYXAgb2YKKwkJICogdGhlIHN0YXJ0aW5nIGJsb2NrLiAgYWxzbyBkZXRlcm1pbmUgaG93IG1hbnkgYmxvY2tzCisJCSAqIGFyZSB0byBiZSB1cGRhdGVkIHdpdGhpbiB0aGlzIGRtYXAuCisJCSAqLworCQlkYml0bm8gPSBibGtubyAmIChCUEVSRE1BUCAtIDEpOworCQl3b3JkID0gZGJpdG5vID4+IEwyREJXT1JEOworCQluYmxrcyA9IG1pbihyZW0sIChzNjQpQlBFUkRNQVAgLSBkYml0bm8pOworCisJCS8qIHVwZGF0ZSB0aGUgYml0cyBvZiB0aGUgZG1hcCB3b3Jkcy4gdGhlIGZpcnN0IGFuZCBsYXN0CisJCSAqIHdvcmRzIG1heSBvbmx5IGhhdmUgYSBzdWJzZXQgb2YgdGhlaXIgYml0cyB1cGRhdGVkLiBpZgorCQkgKiB0aGlzIGlzIHRoZSBjYXNlLCB3ZSdsbCB3b3JrIGFnYWluc3QgdGhhdCB3b3JkIChpLmUuCisJCSAqIHBhcnRpYWwgZmlyc3QgYW5kL29yIGxhc3QpIG9ubHkgaW4gYSBzaW5nbGUgcGFzcy4gIGEgCisJCSAqIHNpbmdsZSBwYXNzIHdpbGwgYWxzbyBiZSB1c2VkIHRvIHVwZGF0ZSBhbGwgd29yZHMgdGhhdAorCQkgKiBhcmUgdG8gaGF2ZSBhbGwgdGhlaXIgYml0cyB1cGRhdGVkLgorCQkgKi8KKwkJZm9yIChyYml0cyA9IG5ibGtzOyByYml0cyA+IDA7CisJCSAgICAgcmJpdHMgLT0gbmJpdHMsIGRiaXRubyArPSBuYml0cykgeworCQkJLyogZGV0ZXJtaW5lIHRoZSBiaXQgbnVtYmVyIHdpdGhpbiB0aGUgd29yZCBhbmQKKwkJCSAqIHRoZSBudW1iZXIgb2YgYml0cyB3aXRoaW4gdGhlIHdvcmQuCisJCQkgKi8KKwkJCXdiaXRubyA9IGRiaXRubyAmIChEQldPUkQgLSAxKTsKKwkJCW5iaXRzID0gbWluKHJiaXRzLCBEQldPUkQgLSB3Yml0bm8pOworCisJCQkvKiBjaGVjayBpZiBvbmx5IHBhcnQgb2YgdGhlIHdvcmQgaXMgdG8gYmUgdXBkYXRlZC4gKi8KKwkJCWlmIChuYml0cyA8IERCV09SRCkgeworCQkJCS8qIHVwZGF0ZSAoZnJlZSBvciBhbGxvY2F0ZSkgdGhlIGJpdHMKKwkJCQkgKiBpbiB0aGlzIHdvcmQuCisJCQkJICovCisJCQkJbWFzayA9CisJCQkJICAgIChPTkVTIDw8IChEQldPUkQgLSBuYml0cykgPj4gd2JpdG5vKTsKKwkJCQlpZiAoZnJlZSkKKwkJCQkJZHAtPnBtYXBbd29yZF0gJj0KKwkJCQkJICAgIGNwdV90b19sZTMyKH5tYXNrKTsKKwkJCQllbHNlCisJCQkJCWRwLT5wbWFwW3dvcmRdIHw9CisJCQkJCSAgICBjcHVfdG9fbGUzMihtYXNrKTsKKworCQkJCXdvcmQgKz0gMTsKKwkJCX0gZWxzZSB7CisJCQkJLyogb25lIG9yIG1vcmUgd29yZHMgYXJlIHRvIGhhdmUgYWxsCisJCQkJICogdGhlaXIgYml0cyB1cGRhdGVkLiAgZGV0ZXJtaW5lIGhvdworCQkJCSAqIG1hbnkgd29yZHMgYW5kIGhvdyBtYW55IGJpdHMuCisJCQkJICovCisJCQkJbndvcmRzID0gcmJpdHMgPj4gTDJEQldPUkQ7CisJCQkJbmJpdHMgPSBud29yZHMgPDwgTDJEQldPUkQ7CisKKwkJCQkvKiB1cGRhdGUgKGZyZWUgb3IgYWxsb2NhdGUpIHRoZSBiaXRzCisJCQkJICogaW4gdGhlc2Ugd29yZHMuCisJCQkJICovCisJCQkJaWYgKGZyZWUpCisJCQkJCW1lbXNldCgmZHAtPnBtYXBbd29yZF0sIDAsCisJCQkJCSAgICAgICBud29yZHMgKiA0KTsKKwkJCQllbHNlCisJCQkJCW1lbXNldCgmZHAtPnBtYXBbd29yZF0sIChpbnQpIE9ORVMsCisJCQkJCSAgICAgICBud29yZHMgKiA0KTsKKworCQkJCXdvcmQgKz0gbndvcmRzOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogdXBkYXRlIGRtYXAgbHNuCisJCSAqLworCQlpZiAobGJsa25vID09IGxhc3RsYmxrbm8pCisJCQljb250aW51ZTsKKworCQlsYXN0bGJsa25vID0gbGJsa25vOworCisJCWlmIChtcC0+bHNuICE9IDApIHsKKwkJCS8qIGluaGVyaXQgb2xkZXIvc21hbGxlciBsc24gKi8KKwkJCWxvZ2RpZmYoZGlmZnAsIG1wLT5sc24sIGxvZyk7CisJCQlpZiAoZGlmZnQgPCBkaWZmcCkgeworCQkJCW1wLT5sc24gPSBsc247CisKKwkJCQkvKiBtb3ZlIGJwIGFmdGVyIHRibG9jayBpbiBsb2dzeW5jIGxpc3QgKi8KKwkJCQlMT0dTWU5DX0xPQ0sobG9nKTsKKwkJCQlsaXN0X21vdmUoJm1wLT5zeW5jbGlzdCwgJnRibGstPnN5bmNsaXN0KTsKKwkJCQlMT0dTWU5DX1VOTE9DSyhsb2cpOworCQkJfQorCisJCQkvKiBpbmhlcml0IHlvdW5nZXIvbGFyZ2VyIGNsc24gKi8KKwkJCUxPR1NZTkNfTE9DSyhsb2cpOworCQkJbG9nZGlmZihkaWZmdCwgdGJsay0+Y2xzbiwgbG9nKTsKKwkJCWxvZ2RpZmYoZGlmZnAsIG1wLT5jbHNuLCBsb2cpOworCQkJaWYgKGRpZmZ0ID4gZGlmZnApCisJCQkJbXAtPmNsc24gPSB0YmxrLT5jbHNuOworCQkJTE9HU1lOQ19VTkxPQ0sobG9nKTsKKwkJfSBlbHNlIHsKKwkJCW1wLT5sb2cgPSBsb2c7CisJCQltcC0+bHNuID0gbHNuOworCisJCQkvKiBpbnNlcnQgYnAgYWZ0ZXIgdGJsb2NrIGluIGxvZ3N5bmMgbGlzdCAqLworCQkJTE9HU1lOQ19MT0NLKGxvZyk7CisKKwkJCWxvZy0+Y291bnQrKzsKKwkJCWxpc3RfYWRkKCZtcC0+c3luY2xpc3QsICZ0YmxrLT5zeW5jbGlzdCk7CisKKwkJCW1wLT5jbHNuID0gdGJsay0+Y2xzbjsKKwkJCUxPR1NZTkNfVU5MT0NLKGxvZyk7CisJCX0KKwl9CisKKwkvKiB3cml0ZSB0aGUgbGFzdCBidWZmZXIuICovCisJaWYgKG1wKSB7CisJCXdyaXRlX21ldGFwYWdlKG1wKTsKKwl9CisKKwlyZXR1cm4gKDApOworfQorCisKKy8qCisgKiBOQU1FOglkYk5leHRBRygpCisgKgorICogRlVOQ1RJT046ICAgIGZpbmQgdGhlIHByZWZlcnJlZCBhbGxvY2F0aW9uIGdyb3VwIGZvciBuZXcgYWxsb2NhdGlvbnMuCisgKgorICoJCVdpdGhpbiB0aGUgYWxsb2NhdGlvbiBncm91cHMsIHdlIG1haW50YWluIGEgcHJlZmVycmVkCisgKgkJYWxsb2NhdGlvbiBncm91cCB3aGljaCBjb25zaXN0cyBvZiBhIGdyb3VwIHdpdGggYXQgbGVhc3QKKyAqCQlhdmVyYWdlIGZyZWUgc3BhY2UuICBJdCBpcyB0aGUgcHJlZmVycmVkIGdyb3VwIHRoYXQgd2UgdGFyZ2V0CisgKgkJbmV3IGlub2RlIGFsbG9jYXRpb24gdG93YXJkcy4gIFRoZSB0aWUtaW4gYmV0d2VlbiBpbm9kZQorICoJCWFsbG9jYXRpb24gYW5kIGJsb2NrIGFsbG9jYXRpb24gb2NjdXJzIGFzIHdlIGFsbG9jYXRlIHRoZQorICoJCWZpcnN0IChkYXRhKSBibG9jayBvZiBhbiBpbm9kZSBhbmQgc3BlY2lmeSB0aGUgaW5vZGUgKGJsb2NrKQorICoJCWFzIHRoZSBhbGxvY2F0aW9uIGhpbnQgZm9yIHRoaXMgYmxvY2suCisgKgorICoJCVdlIHRyeSB0byBhdm9pZCBoYXZpbmcgbW9yZSB0aGFuIG9uZSBvcGVuIGZpbGUgZ3Jvd2luZyBpbgorICoJCWFuIGFsbG9jYXRpb24gZ3JvdXAsIGFzIHRoaXMgd2lsbCBsZWFkIHRvIGZyYWdtZW50YXRpb24uCisgKgkJVGhpcyBkaWZmZXJzIGZyb20gdGhlIG9sZCBPUy8yIG1ldGhvZCBvZiB0cnlpbmcgdG8ga2VlcAorICoJCWVtcHR5IGFncyBhcm91bmQgZm9yIGxhcmdlIGFsbG9jYXRpb25zLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIGlwYm1hcAktICBwb2ludGVyIHRvIGluLWNvcmUgaW5vZGUgZm9yIHRoZSBibG9jayBtYXAuCisgKgorICogUkVUVVJOIFZBTFVFUzoKKyAqICAgICAgdGhlIHByZWZlcnJlZCBhbGxvY2F0aW9uIGdyb3VwIG51bWJlci4KKyAqLworaW50IGRiTmV4dEFHKHN0cnVjdCBpbm9kZSAqaXBibWFwKQoreworCXM2NCBhdmdmcmVlOworCWludCBhZ3ByZWY7CisJczY0IGh3bSA9IDA7CisJaW50IGk7CisJaW50IG5leHRfYmVzdCA9IC0xOworCXN0cnVjdCBibWFwICpibXAgPSBKRlNfU0JJKGlwYm1hcC0+aV9zYiktPmJtYXA7CisKKwlCTUFQX0xPQ0soYm1wKTsKKworCS8qIGRldGVybWluZSB0aGUgYXZlcmFnZSBudW1iZXIgb2YgZnJlZSBibG9ja3Mgd2l0aGluIHRoZSBhZ3MuICovCisJYXZnZnJlZSA9ICh1MzIpYm1wLT5kYl9uZnJlZSAvIGJtcC0+ZGJfbnVtYWc7CisKKwkvKgorCSAqIGlmIHRoZSBjdXJyZW50IHByZWZlcnJlZCBhZyBkb2VzIG5vdCBoYXZlIGFuIGFjdGl2ZSBhbGxvY2F0b3IKKwkgKiBhbmQgaGFzIGF0IGxlYXN0IGF2ZXJhZ2UgZnJlZXNwYWNlLCByZXR1cm4gaXQKKwkgKi8KKwlhZ3ByZWYgPSBibXAtPmRiX2FncHJlZjsKKwlpZiAoKGF0b21pY19yZWFkKCZibXAtPmRiX2FjdGl2ZVthZ3ByZWZdKSA9PSAwKSAmJgorCSAgICAoYm1wLT5kYl9hZ2ZyZWVbYWdwcmVmXSA+PSBhdmdmcmVlKSkKKwkJZ290byB1bmxvY2s7CisKKwkvKiBGcm9tIHRoZSBsYXN0IHByZWZlcnJlZCBhZywgZmluZCB0aGUgbmV4dCBvbmUgd2l0aCBhdCBsZWFzdAorCSAqIGF2ZXJhZ2UgZnJlZSBzcGFjZS4KKwkgKi8KKwlmb3IgKGkgPSAwIDsgaSA8IGJtcC0+ZGJfbnVtYWc7IGkrKywgYWdwcmVmKyspIHsKKwkJaWYgKGFncHJlZiA9PSBibXAtPmRiX251bWFnKQorCQkJYWdwcmVmID0gMDsKKworCQlpZiAoYXRvbWljX3JlYWQoJmJtcC0+ZGJfYWN0aXZlW2FncHJlZl0pKQorCQkJLyogb3BlbiBmaWxlIGlzIGN1cnJlbnRseSBncm93aW5nIGluIHRoaXMgYWcgKi8KKwkJCWNvbnRpbnVlOworCQlpZiAoYm1wLT5kYl9hZ2ZyZWVbYWdwcmVmXSA+PSBhdmdmcmVlKSB7CisJCQkvKiBSZXR1cm4gdGhpcyBvbmUgKi8KKwkJCWJtcC0+ZGJfYWdwcmVmID0gYWdwcmVmOworCQkJZ290byB1bmxvY2s7CisJCX0gZWxzZSBpZiAoYm1wLT5kYl9hZ2ZyZWVbYWdwcmVmXSA+IGh3bSkgeworCQkJLyogTGVzcyB0aGFuIGF2Zy4gZnJlZXNwYWNlLCBidXQgYmVzdCBzbyBmYXIgKi8KKwkJCWh3bSA9IGJtcC0+ZGJfYWdmcmVlW2FncHJlZl07CisJCQluZXh0X2Jlc3QgPSBhZ3ByZWY7CisJCX0KKwl9CisKKwkvKgorCSAqIElmIG5vIGluYWN0aXZlIGFnIHdhcyBmb3VuZCB3aXRoIGF2ZXJhZ2UgZnJlZXNwYWNlLCB1c2UgdGhlCisJICogbmV4dCBiZXN0CisJICovCisJaWYgKG5leHRfYmVzdCAhPSAtMSkKKwkJYm1wLT5kYl9hZ3ByZWYgPSBuZXh0X2Jlc3Q7CisJLyogZWxzZSBsZWF2ZSBkYl9hZ3ByZWYgdW5jaGFuZ2VkICovCit1bmxvY2s6CisJQk1BUF9VTkxPQ0soYm1wKTsKKworCS8qIHJldHVybiB0aGUgcHJlZmVycmVkIGdyb3VwLgorCSAqLworCXJldHVybiAoYm1wLT5kYl9hZ3ByZWYpOworfQorCisvKgorICogTkFNRToJZGJBbGxvYygpCisgKgorICogRlVOQ1RJT046ICAgIGF0dGVtcHQgdG8gYWxsb2NhdGUgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgZnJlZQorICoJCWJsb2NrcyBmcm9tIHRoZSB3b3JraW5nIGFsbG9jYXRpb24gYmxvY2sgbWFwLgorICoKKyAqCQl0aGUgYmxvY2sgYWxsb2NhdGlvbiBwb2xpY3kgdXNlcyBoaW50cyBhbmQgYSBtdWx0aS1zdGVwCisgKgkJYXBwcm9hY2guCisgKgorICoJICAJZm9yIGFsbG9jYXRpb24gcmVxdWVzdHMgc21hbGxlciB0aGFuIHRoZSBudW1iZXIgb2YgYmxvY2tzCisgKgkJcGVyIGRtYXAsIHdlIGZpcnN0IHRyeSB0byBhbGxvY2F0ZSB0aGUgbmV3IGJsb2NrcworICoJCWltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgaGludC4gIGlmIHRoZXNlIGJsb2NrcyBhcmUgbm90CisgKgkJYXZhaWxhYmxlLCB3ZSB0cnkgdG8gYWxsb2NhdGUgYmxvY2tzIG5lYXIgdGhlIGhpbnQuICBpZgorICoJCW5vIGJsb2NrcyBuZWFyIHRoZSBoaW50IGFyZSBhdmFpbGFibGUsIHdlIG5leHQgdHJ5IHRvIAorICoJCWFsbG9jYXRlIHdpdGhpbiB0aGUgc2FtZSBkbWFwIGFzIGNvbnRhaW5zIHRoZSBoaW50LgorICoKKyAqCQlpZiBubyBibG9ja3MgYXJlIGF2YWlsYWJsZSBpbiB0aGUgZG1hcCBvciB0aGUgYWxsb2NhdGlvbgorICoJCXJlcXVlc3QgaXMgbGFyZ2VyIHRoYW4gdGhlIGRtYXAgc2l6ZSwgd2UgdHJ5IHRvIGFsbG9jYXRlCisgKgkJd2l0aGluIHRoZSBzYW1lIGFsbG9jYXRpb24gZ3JvdXAgYXMgY29udGFpbnMgdGhlIGhpbnQuIGlmCisgKgkJdGhpcyBkb2VzIG5vdCBzdWNjZWVkLCB3ZSBmaW5hbGx5IHRyeSB0byBhbGxvY2F0ZSBhbnl3aGVyZQorICoJCXdpdGhpbiB0aGUgYWdncmVnYXRlLgorICoKKyAqCQl3ZSBhbHNvIHRyeSB0byBhbGxvY2F0ZSBhbnl3aGVyZSB3aXRoaW4gdGhlIGFnZ3JlZ2F0ZSBmb3IKKyAqCQlmb3IgYWxsb2NhdGlvbiByZXF1ZXN0cyBsYXJnZXIgdGhhbiB0aGUgYWxsb2NhdGlvbiBncm91cAorICoJCXNpemUgb3IgcmVxdWVzdHMgdGhhdCBzcGVjaWZ5IG5vIGhpbnQgdmFsdWUuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgaXAJLSAgcG9pbnRlciB0byBpbi1jb3JlIGlub2RlOworICogICAgICBoaW50CS0gYWxsb2NhdGlvbiBoaW50LgorICogICAgICBuYmxvY2tzCS0gbnVtYmVyIG9mIGNvbnRpZ3VvdXMgYmxvY2tzIGluIHRoZSByYW5nZS4KKyAqICAgICAgcmVzdWx0cwktIG9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCBzZXQgdG8gdGhlIHN0YXJ0aW5nIGJsb2NrIG51bWJlcgorICoJCSAgb2YgdGhlIG5ld2x5IGFsbG9jYXRlZCBjb250aWd1b3VzIHJhbmdlLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIDAJLSBzdWNjZXNzCisgKiAgICAgIC1FTk9TUEMJLSBpbnN1ZmZpY2llbnQgZGlzayByZXNvdXJjZXMKKyAqICAgICAgLUVJTwktIGkvbyBlcnJvcgorICovCitpbnQgZGJBbGxvYyhzdHJ1Y3QgaW5vZGUgKmlwLCBzNjQgaGludCwgczY0IG5ibG9ja3MsIHM2NCAqIHJlc3VsdHMpCit7CisJaW50IHJjLCBhZ25vOworCXN0cnVjdCBpbm9kZSAqaXBibWFwID0gSkZTX1NCSShpcC0+aV9zYiktPmlwYm1hcDsKKwlzdHJ1Y3QgYm1hcCAqYm1wOworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJczY0IGxibGtubywgYmxrbm87CisJc3RydWN0IGRtYXAgKmRwOworCWludCBsMm5iOworCXM2NCBtYXBTaXplOworCWludCB3cml0ZXJzOworCisJLyogYXNzZXJ0IHRoYXQgbmJsb2NrcyBpcyB2YWxpZCAqLworCWFzc2VydChuYmxvY2tzID4gMCk7CisKKyNpZmRlZiBfU1RJTExfVE9fUE9SVAorCS8qIERBU0QgbGltaXQgY2hlY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRjIyNjk0MSAqLworCWlmIChPVkVSX0xJTUlUKGlwLCBuYmxvY2tzKSkKKwkJcmV0dXJuIC1FTk9TUEM7CisjZW5kaWYJCQkJLyogX1NUSUxMX1RPX1BPUlQgKi8KKworCS8qIGdldCB0aGUgbG9nMiBudW1iZXIgb2YgYmxvY2tzIHRvIGJlIGFsbG9jYXRlZC4KKwkgKiBpZiB0aGUgbnVtYmVyIG9mIGJsb2NrcyBpcyBub3QgYSBsb2cyIG11bHRpcGxlLCAKKwkgKiBpdCB3aWxsIGJlIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQgbG9nMiBtdWx0aXBsZS4KKwkgKi8KKwlsMm5iID0gQkxLU1RPTDIobmJsb2Nrcyk7CisKKwlibXAgPSBKRlNfU0JJKGlwLT5pX3NiKS0+Ym1hcDsKKworLy9yZXRyeTogICAgICAgIC8qIHNlcmlhbGl6ZSB3LnIudC5leHRlbmRmcygpICovCisJbWFwU2l6ZSA9IGJtcC0+ZGJfbWFwc2l6ZTsKKworCS8qIHRoZSBoaW50IHNob3VsZCBiZSB3aXRoaW4gdGhlIG1hcCAqLworCWlmIChoaW50ID49IG1hcFNpemUpIHsKKwkJamZzX2Vycm9yKGlwLT5pX3NiLCAiZGJBbGxvYzogdGhlIGhpbnQgaXMgb3V0c2lkZSB0aGUgbWFwIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIGlmIHRoZSBudW1iZXIgb2YgYmxvY2tzIHRvIGJlIGFsbG9jYXRlZCBpcyBncmVhdGVyIHRoYW4gdGhlCisJICogYWxsb2NhdGlvbiBncm91cCBzaXplLCB0cnkgdG8gYWxsb2NhdGUgYW55d2hlcmUuCisJICovCisJaWYgKGwybmIgPiBibXAtPmRiX2FnbDJzaXplKSB7CisJCUlXUklURV9MT0NLKGlwYm1hcCk7CisKKwkJcmMgPSBkYkFsbG9jQW55KGJtcCwgbmJsb2NrcywgbDJuYiwgcmVzdWx0cyk7CisJCWlmIChyYyA9PSAwKSB7CisJCQlEQkFMTE9DKGJtcC0+ZGJfREJtYXAsIGJtcC0+ZGJfbWFwc2l6ZSwgKnJlc3VsdHMsCisJCQkJbmJsb2Nrcyk7CisJCX0KKworCQlnb3RvIHdyaXRlX3VubG9jazsKKwl9CisKKwkvKgorCSAqIElmIG5vIGhpbnQsIGxldCBkYk5leHRBRyByZWNvbW1lbmQgYW4gYWxsb2NhdGlvbiBncm91cAorCSAqLworCWlmIChoaW50ID09IDApCisJCWdvdG8gcHJlZl9hZzsKKworCS8qIHdlIHdvdWxkIGxpa2UgdG8gYWxsb2NhdGUgY2xvc2UgdG8gdGhlIGhpbnQuICBhZGp1c3QgdGhlCisJICogaGludCB0byB0aGUgYmxvY2sgZm9sbG93aW5nIHRoZSBoaW50IHNpbmNlIHRoZSBhbGxvY2F0b3JzCisJICogd2lsbCBzdGFydCBsb29raW5nIGZvciBmcmVlIHNwYWNlIHN0YXJ0aW5nIGF0IHRoaXMgcG9pbnQuCisJICovCisJYmxrbm8gPSBoaW50ICsgMTsKKworCWlmIChibGtubyA+PSBibXAtPmRiX21hcHNpemUpCisJCWdvdG8gcHJlZl9hZzsKKworCWFnbm8gPSBibGtubyA+PiBibXAtPmRiX2FnbDJzaXplOworCisJLyogY2hlY2sgaWYgYmxrbm8gY3Jvc3NlcyBvdmVyIGludG8gYSBuZXcgYWxsb2NhdGlvbiBncm91cC4KKwkgKiBpZiBzbywgY2hlY2sgaWYgd2Ugc2hvdWxkIGFsbG93IGFsbG9jYXRpb25zIHdpdGhpbiB0aGlzCisJICogYWxsb2NhdGlvbiBncm91cC4KKwkgKi8KKwlpZiAoKGJsa25vICYgKGJtcC0+ZGJfYWdzaXplIC0gMSkpID09IDApCisJCS8qIGNoZWNrIGlmIHRoZSBBRyBpcyBjdXJyZW5seSBiZWluZyB3cml0dGVuIHRvLgorCQkgKiBpZiBzbywgY2FsbCBkYk5leHRBRygpIHRvIGZpbmQgYSBub24tYnVzeQorCQkgKiBBRyB3aXRoIHN1ZmZpY2llbnQgZnJlZSBzcGFjZS4KKwkJICovCisJCWlmIChhdG9taWNfcmVhZCgmYm1wLT5kYl9hY3RpdmVbYWdub10pKQorCQkJZ290byBwcmVmX2FnOworCisJLyogY2hlY2sgaWYgdGhlIGFsbG9jYXRpb24gcmVxdWVzdCBzaXplIGNhbiBiZSBzYXRpc2ZpZWQgZnJvbSBhCisJICogc2luZ2xlIGRtYXAuICBpZiBzbywgdHJ5IHRvIGFsbG9jYXRlIGZyb20gdGhlIGRtYXAgY29udGFpbmluZworCSAqIHRoZSBoaW50IHVzaW5nIGEgdGllcmVkIHN0cmF0ZWd5LgorCSAqLworCWlmIChuYmxvY2tzIDw9IEJQRVJETUFQKSB7CisJCUlSRUFEX0xPQ0soaXBibWFwKTsKKworCQkvKiBnZXQgdGhlIGJ1ZmZlciBmb3IgdGhlIGRtYXAgY29udGFpbmluZyB0aGUgaGludC4KKwkJICovCisJCXJjID0gLUVJTzsKKwkJbGJsa25vID0gQkxLVE9ETUFQKGJsa25vLCBibXAtPmRiX2wybmJwZXJwYWdlKTsKKwkJbXAgPSByZWFkX21ldGFwYWdlKGlwYm1hcCwgbGJsa25vLCBQU0laRSwgMCk7CisJCWlmIChtcCA9PSBOVUxMKQorCQkJZ290byByZWFkX3VubG9jazsKKworCQlkcCA9IChzdHJ1Y3QgZG1hcCAqKSBtcC0+ZGF0YTsKKworCQkvKiBmaXJzdCwgdHJ5IHRvIHNhdGlzZnkgdGhlIGFsbG9jYXRpb24gcmVxdWVzdCB3aXRoIHRoZQorCQkgKiBibG9ja3MgYmVnaW5uaW5nIGF0IHRoZSBoaW50LgorCQkgKi8KKwkJaWYgKChyYyA9IGRiQWxsb2NOZXh0KGJtcCwgZHAsIGJsa25vLCAoaW50KSBuYmxvY2tzKSkKKwkJICAgICE9IC1FTk9TUEMpIHsKKwkJCWlmIChyYyA9PSAwKSB7CisJCQkJKnJlc3VsdHMgPSBibGtubzsKKwkJCQlEQkFMTE9DKGJtcC0+ZGJfREJtYXAsIGJtcC0+ZGJfbWFwc2l6ZSwKKwkJCQkJKnJlc3VsdHMsIG5ibG9ja3MpOworCQkJCW1hcmtfbWV0YXBhZ2VfZGlydHkobXApOworCQkJfQorCisJCQlyZWxlYXNlX21ldGFwYWdlKG1wKTsKKwkJCWdvdG8gcmVhZF91bmxvY2s7CisJCX0KKworCQl3cml0ZXJzID0gYXRvbWljX3JlYWQoJmJtcC0+ZGJfYWN0aXZlW2Fnbm9dKTsKKwkJaWYgKCh3cml0ZXJzID4gMSkgfHwKKwkJICAgICgod3JpdGVycyA9PSAxKSAmJiAoSkZTX0lQKGlwKS0+YWN0aXZlX2FnICE9IGFnbm8pKSkgeworCQkJLyoKKwkJCSAqIFNvbWVvbmUgZWxzZSBpcyB3cml0aW5nIGluIHRoaXMgYWxsb2NhdGlvbgorCQkJICogZ3JvdXAuICBUbyBhdm9pZCBmcmFnbWVudGluZywgdHJ5IGFub3RoZXIgYWcKKwkJCSAqLworCQkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisJCQlJUkVBRF9VTkxPQ0soaXBibWFwKTsKKwkJCWdvdG8gcHJlZl9hZzsKKwkJfQorCisJCS8qIG5leHQsIHRyeSB0byBzYXRpc2Z5IHRoZSBhbGxvY2F0aW9uIHJlcXVlc3Qgd2l0aCBibG9ja3MKKwkJICogbmVhciB0aGUgaGludC4KKwkJICovCisJCWlmICgocmMgPQorCQkgICAgIGRiQWxsb2NOZWFyKGJtcCwgZHAsIGJsa25vLCAoaW50KSBuYmxvY2tzLCBsMm5iLCByZXN1bHRzKSkKKwkJICAgICE9IC1FTk9TUEMpIHsKKwkJCWlmIChyYyA9PSAwKSB7CisJCQkJREJBTExPQyhibXAtPmRiX0RCbWFwLCBibXAtPmRiX21hcHNpemUsCisJCQkJCSpyZXN1bHRzLCBuYmxvY2tzKTsKKwkJCQltYXJrX21ldGFwYWdlX2RpcnR5KG1wKTsKKwkJCX0KKworCQkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisJCQlnb3RvIHJlYWRfdW5sb2NrOworCQl9CisKKwkJLyogdHJ5IHRvIHNhdGlzZnkgdGhlIGFsbG9jYXRpb24gcmVxdWVzdCB3aXRoIGJsb2NrcyB3aXRoaW4KKwkJICogdGhlIHNhbWUgZG1hcCBhcyB0aGUgaGludC4KKwkJICovCisJCWlmICgocmMgPSBkYkFsbG9jRG1hcExldihibXAsIGRwLCAoaW50KSBuYmxvY2tzLCBsMm5iLCByZXN1bHRzKSkKKwkJICAgICE9IC1FTk9TUEMpIHsKKwkJCWlmIChyYyA9PSAwKSB7CisJCQkJREJBTExPQyhibXAtPmRiX0RCbWFwLCBibXAtPmRiX21hcHNpemUsCisJCQkJCSpyZXN1bHRzLCBuYmxvY2tzKTsKKwkJCQltYXJrX21ldGFwYWdlX2RpcnR5KG1wKTsKKwkJCX0KKworCQkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisJCQlnb3RvIHJlYWRfdW5sb2NrOworCQl9CisKKwkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisJCUlSRUFEX1VOTE9DSyhpcGJtYXApOworCX0KKworCS8qIHRyeSB0byBzYXRpc2Z5IHRoZSBhbGxvY2F0aW9uIHJlcXVlc3Qgd2l0aCBibG9ja3Mgd2l0aGluCisJICogdGhlIHNhbWUgYWxsb2NhdGlvbiBncm91cCBhcyB0aGUgaGludC4KKwkgKi8KKwlJV1JJVEVfTE9DSyhpcGJtYXApOworCWlmICgocmMgPSBkYkFsbG9jQUcoYm1wLCBhZ25vLCBuYmxvY2tzLCBsMm5iLCByZXN1bHRzKSkKKwkgICAgIT0gLUVOT1NQQykgeworCQlpZiAocmMgPT0gMCkKKwkJCURCQUxMT0MoYm1wLT5kYl9EQm1hcCwgYm1wLT5kYl9tYXBzaXplLAorCQkJCSpyZXN1bHRzLCBuYmxvY2tzKTsKKwkJZ290byB3cml0ZV91bmxvY2s7CisJfQorCUlXUklURV9VTkxPQ0soaXBibWFwKTsKKworCisgICAgICBwcmVmX2FnOgorCS8qCisJICogTGV0IGRiTmV4dEFHIHJlY29tbWVuZCBhIHByZWZlcnJlZCBhbGxvY2F0aW9uIGdyb3VwCisJICovCisJYWdubyA9IGRiTmV4dEFHKGlwYm1hcCk7CisJSVdSSVRFX0xPQ0soaXBibWFwKTsKKworCS8qIFRyeSB0byBhbGxvY2F0ZSB3aXRoaW4gdGhpcyBhbGxvY2F0aW9uIGdyb3VwLiAgaWYgdGhhdCBmYWlscywgdHJ5IHRvCisJICogYWxsb2NhdGUgYW55d2hlcmUgaW4gdGhlIG1hcC4KKwkgKi8KKwlpZiAoKHJjID0gZGJBbGxvY0FHKGJtcCwgYWdubywgbmJsb2NrcywgbDJuYiwgcmVzdWx0cykpID09IC1FTk9TUEMpCisJCXJjID0gZGJBbGxvY0FueShibXAsIG5ibG9ja3MsIGwybmIsIHJlc3VsdHMpOworCWlmIChyYyA9PSAwKSB7CisJCURCQUxMT0MoYm1wLT5kYl9EQm1hcCwgYm1wLT5kYl9tYXBzaXplLCAqcmVzdWx0cywgbmJsb2Nrcyk7CisJfQorCisgICAgICB3cml0ZV91bmxvY2s6CisJSVdSSVRFX1VOTE9DSyhpcGJtYXApOworCisJcmV0dXJuIChyYyk7CisKKyAgICAgIHJlYWRfdW5sb2NrOgorCUlSRUFEX1VOTE9DSyhpcGJtYXApOworCisJcmV0dXJuIChyYyk7Cit9CisKKyNpZmRlZiBfTk9UWUVUCisvKgorICogTkFNRToJZGJBbGxvY0V4YWN0KCkKKyAqCisgKiBGVU5DVElPTjogICAgdHJ5IHRvIGFsbG9jYXRlIHRoZSByZXF1ZXN0ZWQgZXh0ZW50OworICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIGlwCS0gcG9pbnRlciB0byBpbi1jb3JlIGlub2RlOworICogICAgICBibGtubwktIGV4dGVudCBhZGRyZXNzOworICogICAgICBuYmxvY2tzCS0gZXh0ZW50IGxlbmd0aDsKKyAqCisgKiBSRVRVUk4gVkFMVUVTOgorICogICAgICAwCS0gc3VjY2VzcworICogICAgICAtRU5PU1BDCS0gaW5zdWZmaWNpZW50IGRpc2sgcmVzb3VyY2VzCisgKiAgICAgIC1FSU8JLSBpL28gZXJyb3IKKyAqLworaW50IGRiQWxsb2NFeGFjdChzdHJ1Y3QgaW5vZGUgKmlwLCBzNjQgYmxrbm8sIGludCBuYmxvY2tzKQoreworCWludCByYzsKKwlzdHJ1Y3QgaW5vZGUgKmlwYm1hcCA9IEpGU19TQkkoaXAtPmlfc2IpLT5pcGJtYXA7CisJc3RydWN0IGJtYXAgKmJtcCA9IEpGU19TQkkoaXAtPmlfc2IpLT5ibWFwOworCXN0cnVjdCBkbWFwICpkcDsKKwlzNjQgbGJsa25vOworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisKKwlJUkVBRF9MT0NLKGlwYm1hcCk7CisKKwkvKgorCSAqIHZhbGlkYXRlIGV4dGVudCByZXF1ZXN0OgorCSAqCisJICogbm90ZTogZGVmcmFnZnMgcG9saWN5OgorCSAqICBtYXggNjQgYmxvY2tzIHdpbGwgYmUgbW92ZWQuICAKKwkgKiAgYWxsb2NhdGlvbiByZXF1ZXN0IHNpemUgbXVzdCBiZSBzYXRpc2ZpZWQgZnJvbSBhIHNpbmdsZSBkbWFwLgorCSAqLworCWlmIChuYmxvY2tzIDw9IDAgfHwgbmJsb2NrcyA+IEJQRVJETUFQIHx8IGJsa25vID49IGJtcC0+ZGJfbWFwc2l6ZSkgeworCQlJUkVBRF9VTkxPQ0soaXBibWFwKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG5ibG9ja3MgPiAoKHM2NCkgMSA8PCBibXAtPmRiX21heGZyZWVidWQpKSB7CisJCS8qIHRoZSBmcmVlIHNwYWNlIGlzIG5vIGxvbmdlciBhdmFpbGFibGUgKi8KKwkJSVJFQURfVU5MT0NLKGlwYm1hcCk7CisJCXJldHVybiAtRU5PU1BDOworCX0KKworCS8qIHJlYWQgaW4gdGhlIGRtYXAgY292ZXJpbmcgdGhlIGV4dGVudCAqLworCWxibGtubyA9IEJMS1RPRE1BUChibGtubywgYm1wLT5kYl9sMm5icGVycGFnZSk7CisJbXAgPSByZWFkX21ldGFwYWdlKGlwYm1hcCwgbGJsa25vLCBQU0laRSwgMCk7CisJaWYgKG1wID09IE5VTEwpIHsKKwkJSVJFQURfVU5MT0NLKGlwYm1hcCk7CisJCXJldHVybiAtRUlPOworCX0KKwlkcCA9IChzdHJ1Y3QgZG1hcCAqKSBtcC0+ZGF0YTsKKworCS8qIHRyeSB0byBhbGxvY2F0ZSB0aGUgcmVxdWVzdGVkIGV4dGVudCAqLworCXJjID0gZGJBbGxvY05leHQoYm1wLCBkcCwgYmxrbm8sIG5ibG9ja3MpOworCisJSVJFQURfVU5MT0NLKGlwYm1hcCk7CisKKwlpZiAocmMgPT0gMCkgeworCQlEQkFMTE9DKGJtcC0+ZGJfREJtYXAsIGJtcC0+ZGJfbWFwc2l6ZSwgYmxrbm8sIG5ibG9ja3MpOworCQltYXJrX21ldGFwYWdlX2RpcnR5KG1wKTsKKwl9CisJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisKKwlyZXR1cm4gKHJjKTsKK30KKyNlbmRpZiAvKiBfTk9UWUVUICovCisKKy8qCisgKiBOQU1FOglkYlJlQWxsb2MoKQorICoKKyAqIEZVTkNUSU9OOiAgICBhdHRlbXB0IHRvIGV4dGVuZCBhIGN1cnJlbnQgYWxsb2NhdGlvbiBieSBhIHNwZWNpZmllZAorICoJCW51bWJlciBvZiBibG9ja3MuCisgKgorICoJCXRoaXMgcm91dGluZSBhdHRlbXB0cyB0byBzYXRpc2Z5IHRoZSBhbGxvY2F0aW9uIHJlcXVlc3QKKyAqCQlieSBmaXJzdCB0cnlpbmcgdG8gZXh0ZW5kIHRoZSBleGlzdGluZyBhbGxvY2F0aW9uIGluCisgKgkJcGxhY2UgYnkgYWxsb2NhdGluZyB0aGUgYWRkaXRpb25hbCBibG9ja3MgYXMgdGhlIGJsb2NrcworICoJCWltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgY3VycmVudCBhbGxvY2F0aW9uLiAgaWYgdGhlc2UKKyAqCQlibG9ja3MgYXJlIG5vdCBhdmFpbGFibGUsIHRoaXMgcm91dGluZSB3aWxsIGF0dGVtcHQgdG8KKyAqCQlhbGxvY2F0ZSBhIG5ldyBzZXQgb2YgY29udGlndW91cyBibG9ja3MgbGFyZ2UgZW5vdWdoCisgKgkJdG8gY292ZXIgdGhlIGV4aXN0aW5nIGFsbG9jYXRpb24gcGx1cyB0aGUgYWRkaXRpb25hbAorICoJCW51bWJlciBvZiBibG9ja3MgcmVxdWlyZWQuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgaXAJICAgIC0gIHBvaW50ZXIgdG8gaW4tY29yZSBpbm9kZSByZXF1aXJpbmcgYWxsb2NhdGlvbi4KKyAqICAgICAgYmxrbm8JICAgIC0gIHN0YXJ0aW5nIGJsb2NrIG9mIHRoZSBjdXJyZW50IGFsbG9jYXRpb24uCisgKiAgICAgIG5ibG9ja3MJICAgIC0gIG51bWJlciBvZiBjb250aWd1b3VzIGJsb2NrcyB3aXRoaW4gdGhlIGN1cnJlbnQKKyAqCQkgICAgICAgYWxsb2NhdGlvbi4KKyAqICAgICAgYWRkbmJsb2NrcyAgLSAgbnVtYmVyIG9mIGJsb2NrcyB0byBhZGQgdG8gdGhlIGFsbG9jYXRpb24uCisgKiAgICAgIHJlc3VsdHMJLSAgICAgIG9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCBzZXQgdG8gdGhlIHN0YXJ0aW5nIGJsb2NrIG51bWJlcgorICoJCSAgICAgICBvZiB0aGUgZXhpc3RpbmcgYWxsb2NhdGlvbiBpZiB0aGUgZXhpc3RpbmcgYWxsb2NhdGlvbgorICoJCSAgICAgICB3YXMgZXh0ZW5kZWQgaW4gcGxhY2Ugb3IgdG8gYSBuZXdseSBhbGxvY2F0ZWQgY29udGlndW91cworICoJCSAgICAgICByYW5nZSBpZiB0aGUgZXhpc3RpbmcgYWxsb2NhdGlvbiBjb3VsZCBub3QgYmUgZXh0ZW5kZWQKKyAqCQkgICAgICAgaW4gcGxhY2UuCisgKgorICogUkVUVVJOIFZBTFVFUzoKKyAqICAgICAgMAktIHN1Y2Nlc3MKKyAqICAgICAgLUVOT1NQQwktIGluc3VmZmljaWVudCBkaXNrIHJlc291cmNlcworICogICAgICAtRUlPCS0gaS9vIGVycm9yCisgKi8KK2ludAorZGJSZUFsbG9jKHN0cnVjdCBpbm9kZSAqaXAsCisJICBzNjQgYmxrbm8sIHM2NCBuYmxvY2tzLCBzNjQgYWRkbmJsb2NrcywgczY0ICogcmVzdWx0cykKK3sKKwlpbnQgcmM7CisKKwkvKiB0cnkgdG8gZXh0ZW5kIHRoZSBhbGxvY2F0aW9uIGluIHBsYWNlLgorCSAqLworCWlmICgocmMgPSBkYkV4dGVuZChpcCwgYmxrbm8sIG5ibG9ja3MsIGFkZG5ibG9ja3MpKSA9PSAwKSB7CisJCSpyZXN1bHRzID0gYmxrbm87CisJCXJldHVybiAoMCk7CisJfSBlbHNlIHsKKwkJaWYgKHJjICE9IC1FTk9TUEMpCisJCQlyZXR1cm4gKHJjKTsKKwl9CisKKwkvKiBjb3VsZCBub3QgZXh0ZW5kIHRoZSBhbGxvY2F0aW9uIGluIHBsYWNlLCBzbyBhbGxvY2F0ZSBhCisJICogbmV3IHNldCBvZiBibG9ja3MgZm9yIHRoZSBlbnRpcmUgcmVxdWVzdCAoaS5lLiB0cnkgdG8gZ2V0CisJICogYSByYW5nZSBvZiBjb250aWd1b3VzIGJsb2NrcyBsYXJnZSBlbm91Z2ggdG8gY292ZXIgdGhlCisJICogZXhpc3RpbmcgYWxsb2NhdGlvbiBwbHVzIHRoZSBhZGRpdGlvbmFsIGJsb2Nrcy4pCisJICovCisJcmV0dXJuIChkYkFsbG9jCisJCShpcCwgYmxrbm8gKyBuYmxvY2tzIC0gMSwgYWRkbmJsb2NrcyArIG5ibG9ja3MsIHJlc3VsdHMpKTsKK30KKworCisvKgorICogTkFNRToJZGJFeHRlbmQoKQorICoKKyAqIEZVTkNUSU9OOiAgICBhdHRlbXB0IHRvIGV4dGVuZCBhIGN1cnJlbnQgYWxsb2NhdGlvbiBieSBhIHNwZWNpZmllZAorICoJCW51bWJlciBvZiBibG9ja3MuCisgKgorICoJCXRoaXMgcm91dGluZSBhdHRlbXB0cyB0byBzYXRpc2Z5IHRoZSBhbGxvY2F0aW9uIHJlcXVlc3QKKyAqCQlieSBmaXJzdCB0cnlpbmcgdG8gZXh0ZW5kIHRoZSBleGlzdGluZyBhbGxvY2F0aW9uIGluCisgKgkJcGxhY2UgYnkgYWxsb2NhdGluZyB0aGUgYWRkaXRpb25hbCBibG9ja3MgYXMgdGhlIGJsb2NrcworICoJCWltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgY3VycmVudCBhbGxvY2F0aW9uLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIGlwCSAgICAtICBwb2ludGVyIHRvIGluLWNvcmUgaW5vZGUgcmVxdWlyaW5nIGFsbG9jYXRpb24uCisgKiAgICAgIGJsa25vCSAgICAtICBzdGFydGluZyBibG9jayBvZiB0aGUgY3VycmVudCBhbGxvY2F0aW9uLgorICogICAgICBuYmxvY2tzCSAgICAtICBudW1iZXIgb2YgY29udGlndW91cyBibG9ja3Mgd2l0aGluIHRoZSBjdXJyZW50CisgKgkJICAgICAgIGFsbG9jYXRpb24uCisgKiAgICAgIGFkZG5ibG9ja3MgIC0gIG51bWJlciBvZiBibG9ja3MgdG8gYWRkIHRvIHRoZSBhbGxvY2F0aW9uLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIDAJLSBzdWNjZXNzCisgKiAgICAgIC1FTk9TUEMJLSBpbnN1ZmZpY2llbnQgZGlzayByZXNvdXJjZXMKKyAqICAgICAgLUVJTwktIGkvbyBlcnJvcgorICovCitzdGF0aWMgaW50IGRiRXh0ZW5kKHN0cnVjdCBpbm9kZSAqaXAsIHM2NCBibGtubywgczY0IG5ibG9ja3MsIHM2NCBhZGRuYmxvY2tzKQoreworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpID0gSkZTX1NCSShpcC0+aV9zYik7CisJczY0IGxibGtubywgbGFzdGJsa25vLCBleHRibGtubzsKKwl1aW50IHJlbF9ibG9jazsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCXN0cnVjdCBkbWFwICpkcDsKKwlpbnQgcmM7CisJc3RydWN0IGlub2RlICppcGJtYXAgPSBzYmktPmlwYm1hcDsKKwlzdHJ1Y3QgYm1hcCAqYm1wOworCisJLyoKKwkgKiBXZSBkb24ndCB3YW50IGEgbm9uLWFsaWduZWQgZXh0ZW50IHRvIGNyb3NzIGEgcGFnZSBib3VuZGFyeQorCSAqLworCWlmICgoKHJlbF9ibG9jayA9IGJsa25vICYgKHNiaS0+bmJwZXJwYWdlIC0gMSkpKSAmJgorCSAgICAocmVsX2Jsb2NrICsgbmJsb2NrcyArIGFkZG5ibG9ja3MgPiBzYmktPm5icGVycGFnZSkpCisJCXJldHVybiAtRU5PU1BDOworCisJLyogZ2V0IHRoZSBsYXN0IGJsb2NrIG9mIHRoZSBjdXJyZW50IGFsbG9jYXRpb24gKi8KKwlsYXN0Ymxrbm8gPSBibGtubyArIG5ibG9ja3MgLSAxOworCisJLyogZGV0ZXJtaW5lIHRoZSBibG9jayBudW1iZXIgb2YgdGhlIGJsb2NrIGZvbGxvd2luZworCSAqIHRoZSBleGlzdGluZyBhbGxvY2F0aW9uLgorCSAqLworCWV4dGJsa25vID0gbGFzdGJsa25vICsgMTsKKworCUlSRUFEX0xPQ0soaXBibWFwKTsKKworCS8qIGJldHRlciBiZSB3aXRoaW4gdGhlIGZpbGUgc3lzdGVtICovCisJYm1wID0gc2JpLT5ibWFwOworCWlmIChsYXN0Ymxrbm8gPCAwIHx8IGxhc3RibGtubyA+PSBibXAtPmRiX21hcHNpemUpIHsKKwkJSVJFQURfVU5MT0NLKGlwYm1hcCk7CisJCWpmc19lcnJvcihpcC0+aV9zYiwKKwkJCSAgImRiRXh0ZW5kOiB0aGUgYmxvY2sgaXMgb3V0c2lkZSB0aGUgZmlsZXN5c3RlbSIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiB3ZSdsbCBhdHRlbXB0IHRvIGV4dGVuZCB0aGUgY3VycmVudCBhbGxvY2F0aW9uIGluIHBsYWNlIGJ5CisJICogYWxsb2NhdGluZyB0aGUgYWRkaXRpb25hbCBibG9ja3MgYXMgdGhlIGJsb2NrcyBpbW1lZGlhdGVseQorCSAqIGZvbGxvd2luZyB0aGUgY3VycmVudCBhbGxvY2F0aW9uLiAgd2Ugb25seSB0cnkgdG8gZXh0ZW5kIHRoZQorCSAqIGN1cnJlbnQgYWxsb2NhdGlvbiBpbiBwbGFjZSBpZiB0aGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwgYmxvY2tzCisJICogY2FuIGZpdCBpbnRvIGEgZG1hcCwgdGhlIGxhc3QgYmxvY2sgb2YgdGhlIGN1cnJlbnQgYWxsb2NhdGlvbgorCSAqIGlzIG5vdCB0aGUgbGFzdCBibG9jayBvZiB0aGUgZmlsZSBzeXN0ZW0sIGFuZCB0aGUgc3RhcnQgb2YgdGhlCisJICogaW5wbGFjZSBleHRlbnNpb24gaXMgbm90IG9uIGFuIGFsbG9jYXRpb24gZ3JvdXAgYm91bmRhcnkuCisJICovCisJaWYgKGFkZG5ibG9ja3MgPiBCUEVSRE1BUCB8fCBleHRibGtubyA+PSBibXAtPmRiX21hcHNpemUgfHwKKwkgICAgKGV4dGJsa25vICYgKGJtcC0+ZGJfYWdzaXplIC0gMSkpID09IDApIHsKKwkJSVJFQURfVU5MT0NLKGlwYm1hcCk7CisJCXJldHVybiAtRU5PU1BDOworCX0KKworCS8qIGdldCB0aGUgYnVmZmVyIGZvciB0aGUgZG1hcCBjb250YWluaW5nIHRoZSBmaXJzdCBibG9jaworCSAqIG9mIHRoZSBleHRlbnNpb24uCisJICovCisJbGJsa25vID0gQkxLVE9ETUFQKGV4dGJsa25vLCBibXAtPmRiX2wybmJwZXJwYWdlKTsKKwltcCA9IHJlYWRfbWV0YXBhZ2UoaXBibWFwLCBsYmxrbm8sIFBTSVpFLCAwKTsKKwlpZiAobXAgPT0gTlVMTCkgeworCQlJUkVBRF9VTkxPQ0soaXBibWFwKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJREJBTExPQ0NLKGJtcC0+ZGJfREJtYXAsIGJtcC0+ZGJfbWFwc2l6ZSwgYmxrbm8sIG5ibG9ja3MpOworCWRwID0gKHN0cnVjdCBkbWFwICopIG1wLT5kYXRhOworCisJLyogdHJ5IHRvIGFsbG9jYXRlIHRoZSBibG9ja3MgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZQorCSAqIGN1cnJlbnQgYWxsb2NhdGlvbi4KKwkgKi8KKwlyYyA9IGRiQWxsb2NOZXh0KGJtcCwgZHAsIGV4dGJsa25vLCAoaW50KSBhZGRuYmxvY2tzKTsKKworCUlSRUFEX1VOTE9DSyhpcGJtYXApOworCisJLyogd2VyZSB3ZSBzdWNjZXNzZnVsID8gKi8KKwlpZiAocmMgPT0gMCkgeworCQlEQkFMTE9DKGJtcC0+ZGJfREJtYXAsIGJtcC0+ZGJfbWFwc2l6ZSwgZXh0Ymxrbm8sCisJCQlhZGRuYmxvY2tzKTsKKwkJd3JpdGVfbWV0YXBhZ2UobXApOworCX0gZWxzZQorCQkvKiB3ZSB3ZXJlIG5vdCBzdWNjZXNzZnVsICovCisJCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCisKKwlyZXR1cm4gKHJjKTsKK30KKworCisvKgorICogTkFNRToJZGJBbGxvY05leHQoKQorICoKKyAqIEZVTkNUSU9OOiAgICBhdHRlbXB0IHRvIGFsbG9jYXRlIHRoZSBibG9ja3Mgb2YgdGhlIHNwZWNpZmllZCBibG9jaworICoJCXJhbmdlIHdpdGhpbiBhIGRtYXAuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgYm1wCS0gIHBvaW50ZXIgdG8gYm1hcCBkZXNjcmlwdG9yCisgKiAgICAgIGRwCS0gIHBvaW50ZXIgdG8gZG1hcC4KKyAqICAgICAgYmxrbm8JLSAgc3RhcnRpbmcgYmxvY2sgbnVtYmVyIG9mIHRoZSByYW5nZS4KKyAqICAgICAgbmJsb2NrcwktICBudW1iZXIgb2YgY29udGlndW91cyBmcmVlIGJsb2NrcyBvZiB0aGUgcmFuZ2UuCisgKgorICogUkVUVVJOIFZBTFVFUzoKKyAqICAgICAgMAktIHN1Y2Nlc3MKKyAqICAgICAgLUVOT1NQQwktIGluc3VmZmljaWVudCBkaXNrIHJlc291cmNlcworICogICAgICAtRUlPCS0gaS9vIGVycm9yCisgKgorICogc2VyaWFsaXphdGlvbjogSVJFQURfTE9DSyhpcGJtYXApIGhlbGQgb24gZW50cnkvZXhpdDsKKyAqLworc3RhdGljIGludCBkYkFsbG9jTmV4dChzdHJ1Y3QgYm1hcCAqIGJtcCwgc3RydWN0IGRtYXAgKiBkcCwgczY0IGJsa25vLAorCQkgICAgICAgaW50IG5ibG9ja3MpCit7CisJaW50IGRiaXRubywgd29yZCwgcmVtYml0cywgbmIsIG53b3Jkcywgd2JpdG5vLCBudzsKKwlpbnQgbDJzaXplOworCXM4ICpsZWFmOworCXUzMiBtYXNrOworCisJaWYgKGRwLT50cmVlLmxlYWZpZHggIT0gY3B1X3RvX2xlMzIoTEVBRklORCkpIHsKKwkJamZzX2Vycm9yKGJtcC0+ZGJfaXBibWFwLT5pX3NiLAorCQkJICAiZGJBbGxvY05leHQ6IENvcnJ1cHQgZG1hcCBwYWdlIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIHBpY2sgdXAgYSBwb2ludGVyIHRvIHRoZSBsZWF2ZXMgb2YgdGhlIGRtYXAgdHJlZS4KKwkgKi8KKwlsZWFmID0gZHAtPnRyZWUuc3RyZWUgKyBsZTMyX3RvX2NwdShkcC0+dHJlZS5sZWFmaWR4KTsKKworCS8qIGRldGVybWluZSB0aGUgYml0IG51bWJlciBhbmQgd29yZCB3aXRoaW4gdGhlIGRtYXAgb2YgdGhlCisJICogc3RhcnRpbmcgYmxvY2suCisJICovCisJZGJpdG5vID0gYmxrbm8gJiAoQlBFUkRNQVAgLSAxKTsKKwl3b3JkID0gZGJpdG5vID4+IEwyREJXT1JEOworCisJLyogY2hlY2sgaWYgdGhlIHNwZWNpZmllZCBibG9jayByYW5nZSBpcyBjb250YWluZWQgd2l0aGluCisJICogdGhpcyBkbWFwLgorCSAqLworCWlmIChkYml0bm8gKyBuYmxvY2tzID4gQlBFUkRNQVApCisJCXJldHVybiAtRU5PU1BDOworCisJLyogY2hlY2sgaWYgdGhlIHN0YXJ0aW5nIGxlYWYgaW5kaWNhdGVzIHRoYXQgYW55dGhpbmcKKwkgKiBpcyBmcmVlLgorCSAqLworCWlmIChsZWFmW3dvcmRdID09IE5PRlJFRSkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwkvKiBjaGVjayB0aGUgZG1hcHMgd29yZHMgY29ycmVzcG9uZGluZyB0byBibG9jayByYW5nZSB0byBzZWUKKwkgKiBpZiB0aGUgYmxvY2sgcmFuZ2UgaXMgZnJlZS4gIG5vdCBhbGwgYml0cyBvZiB0aGUgZmlyc3QgYW5kCisJICogbGFzdCB3b3JkcyBtYXkgYmUgY29udGFpbmVkIHdpdGhpbiB0aGUgYmxvY2sgcmFuZ2UuICBpZiB0aGlzCisJICogaXMgdGhlIGNhc2UsIHdlJ2xsIHdvcmsgYWdhaW5zdCB0aG9zZSB3b3JkcyAoaS5lLiBwYXJ0aWFsIGZpcnN0CisJICogYW5kL29yIGxhc3QpIG9uIGFuIGluZGl2aWR1YWwgYmFzaXMgKGEgc2luZ2xlIHBhc3MpIGFuZCBleGFtaW5lCisJICogdGhlIGFjdHVhbCBiaXRzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZSBmcmVlLiAgYSBzaW5nbGUgcGFzcworCSAqIHdpbGwgYmUgdXNlZCBmb3IgYWxsIGRtYXAgd29yZHMgZnVsbHkgY29udGFpbmVkIHdpdGhpbiB0aGUKKwkgKiBzcGVjaWZpZWQgcmFuZ2UuICB3aXRoaW4gdGhpcyBwYXNzLCB0aGUgbGVhdmVzIG9mIHRoZSBkbWFwCisJICogdHJlZSB3aWxsIGJlIGV4YW1pbmVkIHRvIGRldGVybWluZSBpZiB0aGUgYmxvY2tzIGFyZSBmcmVlLiBhCisJICogc2luZ2xlIGxlYWYgbWF5IGRlc2NyaWJlIHRoZSBmcmVlIHNwYWNlIG9mIG11bHRpcGxlIGRtYXAKKwkgKiB3b3Jkcywgc28gd2UgbWF5IHZpc2l0IG9ubHkgYSBzdWJzZXQgb2YgdGhlIGFjdHVhbCBsZWF2ZXMKKwkgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBkbWFwIHdvcmRzIG9mIHRoZSBibG9jayByYW5nZS4KKwkgKi8KKwlmb3IgKHJlbWJpdHMgPSBuYmxvY2tzOyByZW1iaXRzID4gMDsgcmVtYml0cyAtPSBuYiwgZGJpdG5vICs9IG5iKSB7CisJCS8qIGRldGVybWluZSB0aGUgYml0IG51bWJlciB3aXRoaW4gdGhlIHdvcmQgYW5kCisJCSAqIHRoZSBudW1iZXIgb2YgYml0cyB3aXRoaW4gdGhlIHdvcmQuCisJCSAqLworCQl3Yml0bm8gPSBkYml0bm8gJiAoREJXT1JEIC0gMSk7CisJCW5iID0gbWluKHJlbWJpdHMsIERCV09SRCAtIHdiaXRubyk7CisKKwkJLyogY2hlY2sgaWYgb25seSBwYXJ0IG9mIHRoZSB3b3JkIGlzIHRvIGJlIGV4YW1pbmVkLgorCQkgKi8KKwkJaWYgKG5iIDwgREJXT1JEKSB7CisJCQkvKiBjaGVjayBpZiB0aGUgYml0cyBhcmUgZnJlZS4KKwkJCSAqLworCQkJbWFzayA9IChPTkVTIDw8IChEQldPUkQgLSBuYikgPj4gd2JpdG5vKTsKKwkJCWlmICgobWFzayAmIH5sZTMyX3RvX2NwdShkcC0+d21hcFt3b3JkXSkpICE9IG1hc2spCisJCQkJcmV0dXJuIC1FTk9TUEM7CisKKwkJCXdvcmQgKz0gMTsKKwkJfSBlbHNlIHsKKwkJCS8qIG9uZSBvciBtb3JlIGRtYXAgd29yZHMgYXJlIGZ1bGx5IGNvbnRhaW5lZAorCQkJICogd2l0aGluIHRoZSBibG9jayByYW5nZS4gIGRldGVybWluZSBob3cgbWFueQorCQkJICogd29yZHMgYW5kIGhvdyBtYW55IGJpdHMuCisJCQkgKi8KKwkJCW53b3JkcyA9IHJlbWJpdHMgPj4gTDJEQldPUkQ7CisJCQluYiA9IG53b3JkcyA8PCBMMkRCV09SRDsKKworCQkJLyogbm93IGV4YW1pbmUgdGhlIGFwcHJvcHJpYXRlIGxlYXZlcyB0byBkZXRlcm1pbmUKKwkJCSAqIGlmIHRoZSBibG9ja3MgYXJlIGZyZWUuCisJCQkgKi8KKwkJCXdoaWxlIChud29yZHMgPiAwKSB7CisJCQkJLyogZG9lcyB0aGUgbGVhZiBkZXNjcmliZSBhbnkgZnJlZSBzcGFjZSA/CisJCQkJICovCisJCQkJaWYgKGxlYWZbd29yZF0gPCBCVURNSU4pCisJCQkJCXJldHVybiAtRU5PU1BDOworCisJCQkJLyogZGV0ZXJtaW5lIHRoZSBsMiBudW1iZXIgb2YgYml0cyBwcm92aWRlZAorCQkJCSAqIGJ5IHRoaXMgbGVhZi4KKwkJCQkgKi8KKwkJCQlsMnNpemUgPQorCQkJCSAgICBtaW4oKGludClsZWFmW3dvcmRdLCBOTFNUT0wyQlNaKG53b3JkcykpOworCisJCQkJLyogZGV0ZXJtaW5lIGhvdyBtYW55IHdvcmRzIHdlcmUgaGFuZGxlZC4KKwkJCQkgKi8KKwkJCQludyA9IEJVRFNJWkUobDJzaXplLCBCVURNSU4pOworCisJCQkJbndvcmRzIC09IG53OworCQkJCXdvcmQgKz0gbnc7CisJCQl9CisJCX0KKwl9CisKKwkvKiBhbGxvY2F0ZSB0aGUgYmxvY2tzLgorCSAqLworCXJldHVybiAoZGJBbGxvY0RtYXAoYm1wLCBkcCwgYmxrbm8sIG5ibG9ja3MpKTsKK30KKworCisvKgorICogTkFNRToJZGJBbGxvY05lYXIoKQorICoKKyAqIEZVTkNUSU9OOiAgICBhdHRlbXB0IHRvIGFsbG9jYXRlIGEgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgZnJlZSBibG9ja3MgbmVhcgorICoJCWEgc3BlY2lmaWVkIGJsb2NrIChoaW50KSB3aXRoaW4gYSBkbWFwLgorICoKKyAqCQlzdGFydGluZyB3aXRoIHRoZSBkbWFwIGxlYWYgdGhhdCBjb3ZlcnMgdGhlIGhpbnQsIHdlJ2xsCisgKgkJY2hlY2sgdGhlIG5leHQgZm91ciBjb250aWd1b3VzIGxlYXZlcyBmb3Igc3VmZmljaWVudCBmcmVlCisgKgkJc3BhY2UuICBpZiBzdWZmaWNpZW50IGZyZWUgc3BhY2UgaXMgZm91bmQsIHdlJ2xsIGFsbG9jYXRlCisgKgkJdGhlIGRlc2lyZWQgZnJlZSBzcGFjZS4KKyAqCisgKiBQQVJBTUVURVJTOgorICogICAgICBibXAJLSAgcG9pbnRlciB0byBibWFwIGRlc2NyaXB0b3IKKyAqICAgICAgZHAJLSAgcG9pbnRlciB0byBkbWFwLgorICogICAgICBibGtubwktICBibG9jayBudW1iZXIgdG8gYWxsb2NhdGUgbmVhci4KKyAqICAgICAgbmJsb2NrcwktICBhY3R1YWwgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgZnJlZSBibG9ja3MgZGVzaXJlZC4KKyAqICAgICAgbDJuYgktICBsb2cyIG51bWJlciBvZiBjb250aWd1b3VzIGZyZWUgYmxvY2tzIGRlc2lyZWQuCisgKiAgICAgIHJlc3VsdHMJLSAgb24gc3VjY2Vzc2Z1bCByZXR1cm4sIHNldCB0byB0aGUgc3RhcnRpbmcgYmxvY2sgbnVtYmVyCisgKgkJICAgb2YgdGhlIG5ld2x5IGFsbG9jYXRlZCByYW5nZS4KKyAqCisgKiBSRVRVUk4gVkFMVUVTOgorICogICAgICAwCS0gc3VjY2VzcworICogICAgICAtRU5PU1BDCS0gaW5zdWZmaWNpZW50IGRpc2sgcmVzb3VyY2VzCisgKiAgICAgIC1FSU8JLSBpL28gZXJyb3IKKyAqCisgKiBzZXJpYWxpemF0aW9uOiBJUkVBRF9MT0NLKGlwYm1hcCkgaGVsZCBvbiBlbnRyeS9leGl0OworICovCitzdGF0aWMgaW50CitkYkFsbG9jTmVhcihzdHJ1Y3QgYm1hcCAqIGJtcCwKKwkgICAgc3RydWN0IGRtYXAgKiBkcCwgczY0IGJsa25vLCBpbnQgbmJsb2NrcywgaW50IGwybmIsIHM2NCAqIHJlc3VsdHMpCit7CisJaW50IHdvcmQsIGx3b3JkLCByYzsKKwlzOCAqbGVhZjsKKworCWlmIChkcC0+dHJlZS5sZWFmaWR4ICE9IGNwdV90b19sZTMyKExFQUZJTkQpKSB7CisJCWpmc19lcnJvcihibXAtPmRiX2lwYm1hcC0+aV9zYiwKKwkJCSAgImRiQWxsb2NOZWFyOiBDb3JydXB0IGRtYXAgcGFnZSIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlsZWFmID0gZHAtPnRyZWUuc3RyZWUgKyBsZTMyX3RvX2NwdShkcC0+dHJlZS5sZWFmaWR4KTsKKworCS8qIGRldGVybWluZSB0aGUgd29yZCB3aXRoaW4gdGhlIGRtYXAgdGhhdCBob2xkcyB0aGUgaGludAorCSAqIChpLmUuIGJsa25vKS4gIGFsc28sIGRldGVybWluZSB0aGUgbGFzdCB3b3JkIGluIHRoZSBkbWFwCisJICogdGhhdCB3ZSdsbCBpbmNsdWRlIGluIG91ciBleGFtaW5hdGlvbi4KKwkgKi8KKwl3b3JkID0gKGJsa25vICYgKEJQRVJETUFQIC0gMSkpID4+IEwyREJXT1JEOworCWx3b3JkID0gbWluKHdvcmQgKyA0LCBMUEVSRE1BUCk7CisKKwkvKiBleGFtaW5lIHRoZSBsZWF2ZXMgZm9yIHN1ZmZpY2llbnQgZnJlZSBzcGFjZS4KKwkgKi8KKwlmb3IgKDsgd29yZCA8IGx3b3JkOyB3b3JkKyspIHsKKwkJLyogZG9lcyB0aGUgbGVhZiBkZXNjcmliZSBzdWZmaWNpZW50IGZyZWUgc3BhY2UgPworCQkgKi8KKwkJaWYgKGxlYWZbd29yZF0gPCBsMm5iKQorCQkJY29udGludWU7CisKKwkJLyogZGV0ZXJtaW5lIHRoZSBibG9jayBudW1iZXIgd2l0aGluIHRoZSBmaWxlIHN5c3RlbQorCQkgKiBvZiB0aGUgZmlyc3QgYmxvY2sgZGVzY3JpYmVkIGJ5IHRoaXMgZG1hcCB3b3JkLgorCQkgKi8KKwkJYmxrbm8gPSBsZTY0X3RvX2NwdShkcC0+c3RhcnQpICsgKHdvcmQgPDwgTDJEQldPUkQpOworCisJCS8qIGlmIG5vdCBhbGwgYml0cyBvZiB0aGUgZG1hcCB3b3JkIGFyZSBmcmVlLCBnZXQgdGhlCisJCSAqIHN0YXJ0aW5nIGJpdCBudW1iZXIgd2l0aGluIHRoZSBkbWFwIHdvcmQgb2YgdGhlIHJlcXVpcmVkCisJCSAqIHN0cmluZyBvZiBmcmVlIGJpdHMgYW5kIGFkanVzdCB0aGUgYmxvY2sgbnVtYmVyIHdpdGggdGhlCisJCSAqIHZhbHVlLgorCQkgKi8KKwkJaWYgKGxlYWZbd29yZF0gPCBCVURNSU4pCisJCQlibGtubyArPQorCQkJICAgIGRiRmluZEJpdHMobGUzMl90b19jcHUoZHAtPndtYXBbd29yZF0pLCBsMm5iKTsKKworCQkvKiBhbGxvY2F0ZSB0aGUgYmxvY2tzLgorCQkgKi8KKwkJaWYgKChyYyA9IGRiQWxsb2NEbWFwKGJtcCwgZHAsIGJsa25vLCBuYmxvY2tzKSkgPT0gMCkKKwkJCSpyZXN1bHRzID0gYmxrbm87CisKKwkJcmV0dXJuIChyYyk7CisJfQorCisJcmV0dXJuIC1FTk9TUEM7Cit9CisKKworLyoKKyAqIE5BTUU6CWRiQWxsb2NBRygpCisgKgorICogRlVOQ1RJT046ICAgIGF0dGVtcHQgdG8gYWxsb2NhdGUgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY29udGlndW91cworICoJCWZyZWUgYmxvY2tzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGFsbG9jYXRpb24gZ3JvdXAuCisgKgorICoJCXVubGVzcyB0aGUgYWxsb2NhdGlvbiBncm91cCBzaXplIGlzIGVxdWFsIHRvIHRoZSBudW1iZXIKKyAqCQlvZiBibG9ja3MgcGVyIGRtYXAsIHRoZSBkbWFwIGNvbnRyb2wgcGFnZXMgd2lsbCBiZSB1c2VkIHRvCisgKgkJZmluZCB0aGUgcmVxdWlyZWQgZnJlZSBzcGFjZSwgaWYgYXZhaWxhYmxlLiAgd2Ugc3RhcnQgdGhlCisgKgkJc2VhcmNoIGF0IHRoZSBoaWdoZXN0IGRtYXAgY29udHJvbCBwYWdlIGxldmVsIHdoaWNoCisgKgkJZGlzdGluY3RseSBkZXNjcmliZXMgdGhlIGFsbG9jYXRpb24gZ3JvdXAncyBmcmVlIHNwYWNlCisgKgkJKGkuZS4gdGhlIGhpZ2hlc3QgbGV2ZWwgYXQgd2hpY2ggdGhlIGFsbG9jYXRpb24gZ3JvdXAncworICoJCWZyZWUgc3BhY2UgaXMgbm90IG1peGVkIGluIHdpdGggdGhhdCBvZiBhbnkgb3RoZXIgZ3JvdXApLgorICoJCWluIGFkZGl0aW9uLCB3ZSBzdGFydCB0aGUgc2VhcmNoIHdpdGhpbiB0aGlzIGxldmVsIGF0IGEKKyAqCQloZWlnaHQgb2YgdGhlIGRtYXBjdGwgZG10cmVlIGF0IHdoaWNoIHRoZSBub2RlcyBkaXN0aW5jdGx5CisgKgkJZGVzY3JpYmUgdGhlIGFsbG9jYXRpb24gZ3JvdXAncyBmcmVlIHNwYWNlLiAgYXQgdGhpcyBoZWlnaHQsCisgKgkJdGhlIGFsbG9jYXRpb24gZ3JvdXAncyBmcmVlIHNwYWNlIG1heSBiZSByZXByZXNlbnRlZCBieSAxCisgKgkJb3IgdHdvIHN1Yi10cmVlcywgZGVwZW5kaW5nIG9uIHRoZSBhbGxvY2F0aW9uIGdyb3VwIHNpemUuCisgKgkJd2Ugc2VhcmNoIHRoZSB0b3Agbm9kZXMgb2YgdGhlc2Ugc3VidHJlZXMgbGVmdCB0byByaWdodCBmb3IKKyAqCQlzdWZmaWNpZW50IGZyZWUgc3BhY2UuICBpZiBzdWZmaWNpZW50IGZyZWUgc3BhY2UgaXMgZm91bmQsCisgKgkJdGhlIHN1YnRyZWUgaXMgc2VhcmNoZWQgdG8gZmluZCB0aGUgbGVmdG1vc3QgbGVhZiB0aGF0IAorICoJCWhhcyBmcmVlIHNwYWNlLiAgb25jZSB3ZSBoYXZlIG1hZGUgaXQgdG8gdGhlIGxlYWYsIHdlCisgKgkJbW92ZSB0aGUgc2VhcmNoIHRvIHRoZSBuZXh0IGxvd2VyIGxldmVsIGRtYXAgY29udHJvbCBwYWdlCisgKgkJY29ycmVzcG9uZGluZyB0byB0aGlzIGxlYWYuICB3ZSBjb250aW51ZSBkb3duIHRoZSBkbWFwIGNvbnRyb2wKKyAqCQlwYWdlcyB1bnRpbCB3ZSBmaW5kIHRoZSBkbWFwIHRoYXQgY29udGFpbnMgb3Igc3RhcnRzIHRoZQorICoJCXN1ZmZpY2llbnQgZnJlZSBzcGFjZSBhbmQgd2UgYWxsb2NhdGUgYXQgdGhpcyBkbWFwLgorICoKKyAqCQlpZiB0aGUgYWxsb2NhdGlvbiBncm91cCBzaXplIGlzIGVxdWFsIHRvIHRoZSBkbWFwIHNpemUsCisgKgkJd2UnbGwgc3RhcnQgYXQgdGhlIGRtYXAgY29ycmVzcG9uZGluZyB0byB0aGUgYWxsb2NhdGlvbgorICoJCWdyb3VwIGFuZCBhdHRlbXB0IHRoZSBhbGxvY2F0aW9uIGF0IHRoaXMgbGV2ZWwuCisgKgorICoJCXRoZSBkbWFwIGNvbnRyb2wgcGFnZSBzZWFyY2ggaXMgYWxzbyBub3QgcGVyZm9ybWVkIGlmIHRoZQorICoJCWFsbG9jYXRpb24gZ3JvdXAgaXMgY29tcGxldGVseSBmcmVlIGFuZCB3ZSBnbyB0byB0aGUgZmlyc3QKKyAqCQlkbWFwIG9mIHRoZSBhbGxvY2F0aW9uIGdyb3VwIHRvIGRvIHRoZSBhbGxvY2F0aW9uLiAgdGhpcyBpcworICoJCWRvbmUgYmVjYXVzZSB0aGUgYWxsb2NhdGlvbiBncm91cCBtYXkgYmUgcGFydCAobm90IHRoZSBmaXJzdAorICoJCXBhcnQpIG9mIGEgbGFyZ2VyIGJpbmFyeSBidWRkeSBzeXN0ZW0sIGNhdXNpbmcgdGhlIGRtYXAKKyAqCQljb250cm9sIHBhZ2VzIHRvIGluZGljYXRlIG5vIGZyZWUgc3BhY2UgKE5PRlJFRSkgd2l0aGluCisgKgkJdGhlIGFsbG9jYXRpb24gZ3JvdXAuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgYm1wCS0gIHBvaW50ZXIgdG8gYm1hcCBkZXNjcmlwdG9yCisgKglhZ25vCS0gYWxsb2NhdGlvbiBncm91cCBudW1iZXIuCisgKiAgICAgIG5ibG9ja3MJLSAgYWN0dWFsIG51bWJlciBvZiBjb250aWd1b3VzIGZyZWUgYmxvY2tzIGRlc2lyZWQuCisgKiAgICAgIGwybmIJLSAgbG9nMiBudW1iZXIgb2YgY29udGlndW91cyBmcmVlIGJsb2NrcyBkZXNpcmVkLgorICogICAgICByZXN1bHRzCS0gIG9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCBzZXQgdG8gdGhlIHN0YXJ0aW5nIGJsb2NrIG51bWJlcgorICoJCSAgIG9mIHRoZSBuZXdseSBhbGxvY2F0ZWQgcmFuZ2UuCisgKgorICogUkVUVVJOIFZBTFVFUzoKKyAqICAgICAgMAktIHN1Y2Nlc3MKKyAqICAgICAgLUVOT1NQQwktIGluc3VmZmljaWVudCBkaXNrIHJlc291cmNlcworICogICAgICAtRUlPCS0gaS9vIGVycm9yCisgKgorICogbm90ZTogSVdSSVRFX0xPQ0soaXBtYXApIGhlbGQgb24gZW50cnkvZXhpdDsKKyAqLworc3RhdGljIGludAorZGJBbGxvY0FHKHN0cnVjdCBibWFwICogYm1wLCBpbnQgYWdubywgczY0IG5ibG9ja3MsIGludCBsMm5iLCBzNjQgKiByZXN1bHRzKQoreworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJc3RydWN0IGRtYXBjdGwgKmRjcDsKKwlpbnQgcmMsIHRpLCBpLCBrLCBtLCBuLCBhZ3BlcmxldjsKKwlzNjQgYmxrbm8sIGxibGtubzsKKwlpbnQgYnVkbWluOworCisJLyogYWxsb2NhdGlvbiByZXF1ZXN0IHNob3VsZCBub3QgYmUgZm9yIG1vcmUgdGhhbiB0aGUKKwkgKiBhbGxvY2F0aW9uIGdyb3VwIHNpemUuCisJICovCisJaWYgKGwybmIgPiBibXAtPmRiX2FnbDJzaXplKSB7CisJCWpmc19lcnJvcihibXAtPmRiX2lwYm1hcC0+aV9zYiwKKwkJCSAgImRiQWxsb2NBRzogYWxsb2NhdGlvbiByZXF1ZXN0IGlzIGxhcmdlciB0aGFuIHRoZSAiCisJCQkgICJhbGxvY2F0aW9uIGdyb3VwIHNpemUiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogZGV0ZXJtaW5lIHRoZSBzdGFydGluZyBibG9jayBudW1iZXIgb2YgdGhlIGFsbG9jYXRpb24KKwkgKiBncm91cC4KKwkgKi8KKwlibGtubyA9IChzNjQpIGFnbm8gPDwgYm1wLT5kYl9hZ2wyc2l6ZTsKKworCS8qIGNoZWNrIGlmIHRoZSBhbGxvY2F0aW9uIGdyb3VwIHNpemUgaXMgdGhlIG1pbmltdW0gYWxsb2NhdGlvbgorCSAqIGdyb3VwIHNpemUgb3IgaWYgdGhlIGFsbG9jYXRpb24gZ3JvdXAgaXMgY29tcGxldGVseSBmcmVlLiBpZgorCSAqIHRoZSBhbGxvY2F0aW9uIGdyb3VwIHNpemUgaXMgdGhlIG1pbmltdW0gc2l6ZSBvZiBCUEVSRE1BUCAoaS5lLgorCSAqIDEgZG1hcCksIHRoZXJlIGlzIG5vIG5lZWQgdG8gc2VhcmNoIHRoZSBkbWFwIGNvbnRyb2wgcGFnZSAoYmVsb3cpCisJICogdGhhdCBmdWxseSBkZXNjcmliZXMgdGhlIGFsbG9jYXRpb24gZ3JvdXAgc2luY2UgdGhlIGFsbG9jYXRpb24KKwkgKiBncm91cCBpcyBhbHJlYWR5IGZ1bGx5IGRlc2NyaWJlZCBieSBhIGRtYXAuICBpbiB0aGlzIGNhc2UsIHdlCisJICoganVzdCBjYWxsIGRiQWxsb2NDdGwoKSB0byBzZWFyY2ggdGhlIGRtYXAgdHJlZSBhbmQgYWxsb2NhdGUgdGhlCisJICogcmVxdWlyZWQgc3BhY2UgaWYgYXZhaWxhYmxlLiAgCisJICoKKwkgKiBpZiB0aGUgYWxsb2NhdGlvbiBncm91cCBpcyBjb21wbGV0ZWx5IGZyZWUsIGRiQWxsb2NDdGwoKSBpcworCSAqIGFsc28gY2FsbGVkIHRvIGFsbG9jYXRlIHRoZSByZXF1aXJlZCBzcGFjZS4gIHRoaXMgaXMgZG9uZSBmb3IKKwkgKiB0d28gcmVhc29ucy4gIGZpcnN0LCBpdCBtYWtlcyBubyBzZW5zZSBzZWFyY2hpbmcgdGhlIGRtYXAgY29udHJvbAorCSAqIHBhZ2VzIGZvciBmcmVlIHNwYWNlIHdoZW4gd2Uga25vdyB0aGF0IGZyZWUgc3BhY2UgZXhpc3RzLiAgc2Vjb25kLAorCSAqIHRoZSBkbWFwIGNvbnRyb2wgcGFnZXMgbWF5IGluZGljYXRlIHRoYXQgdGhlIGFsbG9jYXRpb24gZ3JvdXAKKwkgKiBoYXMgbm8gZnJlZSBzcGFjZSBpZiB0aGUgYWxsb2NhdGlvbiBncm91cCBpcyBwYXJ0IChub3QgdGhlIGZpcnN0CisJICogcGFydCkgb2YgYSBsYXJnZXIgYmluYXJ5IGJ1ZGR5IHN5c3RlbS4KKwkgKi8KKwlpZiAoYm1wLT5kYl9hZ3NpemUgPT0gQlBFUkRNQVAKKwkgICAgfHwgYm1wLT5kYl9hZ2ZyZWVbYWdub10gPT0gYm1wLT5kYl9hZ3NpemUpIHsKKwkJcmMgPSBkYkFsbG9jQ3RsKGJtcCwgbmJsb2NrcywgbDJuYiwgYmxrbm8sIHJlc3VsdHMpOworCQlpZiAoKHJjID09IC1FTk9TUEMpICYmCisJCSAgICAoYm1wLT5kYl9hZ2ZyZWVbYWdub10gPT0gYm1wLT5kYl9hZ3NpemUpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImJsa25vID0gJUx4LCBibG9ja3MgPSAlTHhcbiIsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgYmxrbm8sCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgbmJsb2Nrcyk7CisJCQlqZnNfZXJyb3IoYm1wLT5kYl9pcGJtYXAtPmlfc2IsCisJCQkJICAiZGJBbGxvY0FHOiBkYkFsbG9jQ3RsIGZhaWxlZCBpbiBmcmVlIEFHIik7CisJCX0KKwkJcmV0dXJuIChyYyk7CisJfQorCisJLyogdGhlIGJ1ZmZlciBmb3IgdGhlIGRtYXAgY29udHJvbCBwYWdlIHRoYXQgZnVsbHkgZGVzY3JpYmVzIHRoZQorCSAqIGFsbG9jYXRpb24gZ3JvdXAuCisJICovCisJbGJsa25vID0gQkxLVE9DVEwoYmxrbm8sIGJtcC0+ZGJfbDJuYnBlcnBhZ2UsIGJtcC0+ZGJfYWdsZXZlbCk7CisJbXAgPSByZWFkX21ldGFwYWdlKGJtcC0+ZGJfaXBibWFwLCBsYmxrbm8sIFBTSVpFLCAwKTsKKwlpZiAobXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU87CisJZGNwID0gKHN0cnVjdCBkbWFwY3RsICopIG1wLT5kYXRhOworCWJ1ZG1pbiA9IGRjcC0+YnVkbWluOworCisJaWYgKGRjcC0+bGVhZmlkeCAhPSBjcHVfdG9fbGUzMihDVExMRUFGSU5EKSkgeworCQlqZnNfZXJyb3IoYm1wLT5kYl9pcGJtYXAtPmlfc2IsCisJCQkgICJkYkFsbG9jQUc6IENvcnJ1cHQgZG1hcGN0bCBwYWdlIik7CisJCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBzZWFyY2ggdGhlIHN1YnRyZWUocykgb2YgdGhlIGRtYXAgY29udHJvbCBwYWdlIHRoYXQgZGVzY3JpYmVzCisJICogdGhlIGFsbG9jYXRpb24gZ3JvdXAsIGxvb2tpbmcgZm9yIHN1ZmZpY2llbnQgZnJlZSBzcGFjZS4gIHRvIGJlZ2luLAorCSAqIGRldGVybWluZSBob3cgbWFueSBhbGxvY2F0aW9uIGdyb3VwcyBhcmUgcmVwcmVzZW50ZWQgaW4gYSBkbWFwCisJICogY29udHJvbCBwYWdlIGF0IHRoZSBjb250cm9sIHBhZ2UgbGV2ZWwgKGkuZS4gTDAsIEwxLCBMMikgdGhhdAorCSAqIGZ1bGx5IGRlc2NyaWJlcyBhbiBhbGxvY2F0aW9uIGdyb3VwLiBuZXh0LCBkZXRlcm1pbmUgdGhlIHN0YXJ0aW5nCisJICogdHJlZSBpbmRleCBvZiB0aGlzIGFsbG9jYXRpb24gZ3JvdXAgd2l0aGluIHRoZSBjb250cm9sIHBhZ2UuCisJICovCisJYWdwZXJsZXYgPQorCSAgICAoMSA8PCAoTDJMUEVSQ1RMIC0gKGJtcC0+ZGJfYWdoZWlndGggPDwgMSkpKSAvIGJtcC0+ZGJfYWd3aWR0aDsKKwl0aSA9IGJtcC0+ZGJfYWdzdGFydCArIGJtcC0+ZGJfYWd3aWR0aCAqIChhZ25vICYgKGFncGVybGV2IC0gMSkpOworCisJLyogZG1hcCBjb250cm9sIHBhZ2UgdHJlZXMgZmFuLW91dCBieSA0IGFuZCBhIHNpbmdsZSBhbGxvY2F0aW9uIAorCSAqIGdyb3VwIG1heSBiZSBkZXNjcmliZWQgYnkgMSBvciAyIHN1YnRyZWVzIHdpdGhpbiB0aGUgYWcgbGV2ZWwKKwkgKiBkbWFwIGNvbnRyb2wgcGFnZSwgZGVwZW5kaW5nIHVwb24gdGhlIGFnIHNpemUuIGV4YW1pbmUgdGhlIGFnJ3MKKwkgKiBzdWJ0cmVlcyBmb3Igc3VmZmljaWVudCBmcmVlIHNwYWNlLCBzdGFydGluZyB3aXRoIHRoZSBsZWZ0bW9zdAorCSAqIHN1YnRyZWUuCisJICovCisJZm9yIChpID0gMDsgaSA8IGJtcC0+ZGJfYWd3aWR0aDsgaSsrLCB0aSsrKSB7CisJCS8qIGlzIHRoZXJlIHN1ZmZpY2llbnQgZnJlZSBzcGFjZSA/CisJCSAqLworCQlpZiAobDJuYiA+IGRjcC0+c3RyZWVbdGldKQorCQkJY29udGludWU7CisKKwkJLyogc3VmZmljaWVudCBmcmVlIHNwYWNlIGZvdW5kIGluIGEgc3VidHJlZS4gbm93IHNlYXJjaCBkb3duCisJCSAqIHRoZSBzdWJ0cmVlIHRvIGZpbmQgdGhlIGxlZnRtb3N0IGxlYWYgdGhhdCBkZXNjcmliZXMgdGhpcworCQkgKiBmcmVlIHNwYWNlLgorCQkgKi8KKwkJZm9yIChrID0gYm1wLT5kYl9hZ2hlaWd0aDsgayA+IDA7IGstLSkgeworCQkJZm9yIChuID0gMCwgbSA9ICh0aSA8PCAyKSArIDE7IG4gPCA0OyBuKyspIHsKKwkJCQlpZiAobDJuYiA8PSBkY3AtPnN0cmVlW20gKyBuXSkgeworCQkJCQl0aSA9IG0gKyBuOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAobiA9PSA0KSB7CisJCQkJamZzX2Vycm9yKGJtcC0+ZGJfaXBibWFwLT5pX3NiLAorCQkJCQkgICJkYkFsbG9jQUc6IGZhaWxlZCBkZXNjZW5kaW5nIHN0cmVlIik7CisJCQkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCX0KKworCQkvKiBkZXRlcm1pbmUgdGhlIGJsb2NrIG51bWJlciB3aXRoaW4gdGhlIGZpbGUgc3lzdGVtCisJCSAqIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyBsZWFmLgorCQkgKi8KKwkJaWYgKGJtcC0+ZGJfYWdsZXZlbCA9PSAyKQorCQkJYmxrbm8gPSAwOworCQllbHNlIGlmIChibXAtPmRiX2FnbGV2ZWwgPT0gMSkKKwkJCWJsa25vICY9IH4oTUFYTDFTSVpFIC0gMSk7CisJCWVsc2UJCS8qIGJtcC0+ZGJfYWdsZXZlbCA9PSAwICovCisJCQlibGtubyAmPSB+KE1BWEwwU0laRSAtIDEpOworCisJCWJsa25vICs9CisJCSAgICAoKHM2NCkgKHRpIC0gbGUzMl90b19jcHUoZGNwLT5sZWFmaWR4KSkpIDw8IGJ1ZG1pbjsKKworCQkvKiByZWxlYXNlIHRoZSBidWZmZXIgaW4gcHJlcGFyYXRpb24gZm9yIGdvaW5nIGRvd24KKwkJICogdGhlIG5leHQgbGV2ZWwgb2YgZG1hcCBjb250cm9sIHBhZ2VzLgorCQkgKi8KKwkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisKKwkJLyogY2hlY2sgaWYgd2UgbmVlZCB0byBjb250aW51ZSB0byBzZWFyY2ggZG93biB0aGUgbG93ZXIKKwkJICogbGV2ZWwgZG1hcCBjb250cm9sIHBhZ2VzLiAgd2UgbmVlZCB0byBpZiB0aGUgbnVtYmVyIG9mCisJCSAqIGJsb2NrcyByZXF1aXJlZCBpcyBsZXNzIHRoYW4gbWF4aW11bSBudW1iZXIgb2YgYmxvY2tzCisJCSAqIGRlc2NyaWJlZCBhdCB0aGUgbmV4dCBsb3dlciBsZXZlbC4KKwkJICovCisJCWlmIChsMm5iIDwgYnVkbWluKSB7CisKKwkJCS8qIHNlYXJjaCB0aGUgbG93ZXIgbGV2ZWwgZG1hcCBjb250cm9sIHBhZ2VzIHRvIGdldAorCQkJICogdGhlIHN0YXJ0aW5nIGJsb2NrIG51bWJlciBvZiB0aGUgdGhlIGRtYXAgdGhhdAorCQkJICogY29udGFpbnMgb3Igc3RhcnRzIG9mZiB0aGUgZnJlZSBzcGFjZS4KKwkJCSAqLworCQkJaWYgKChyYyA9CisJCQkgICAgIGRiRmluZEN0bChibXAsIGwybmIsIGJtcC0+ZGJfYWdsZXZlbCAtIDEsCisJCQkJICAgICAgICZibGtubykpKSB7CisJCQkJaWYgKHJjID09IC1FTk9TUEMpIHsKKwkJCQkJamZzX2Vycm9yKGJtcC0+ZGJfaXBibWFwLT5pX3NiLAorCQkJCQkJICAiZGJBbGxvY0FHOiBjb250cm9sIHBhZ2UgIgorCQkJCQkJICAiaW5jb25zaXN0ZW50Iik7CisJCQkJCXJldHVybiAtRUlPOworCQkJCX0KKwkJCQlyZXR1cm4gKHJjKTsKKwkJCX0KKwkJfQorCisJCS8qIGFsbG9jYXRlIHRoZSBibG9ja3MuCisJCSAqLworCQlyYyA9IGRiQWxsb2NDdGwoYm1wLCBuYmxvY2tzLCBsMm5iLCBibGtubywgcmVzdWx0cyk7CisJCWlmIChyYyA9PSAtRU5PU1BDKSB7CisJCQlqZnNfZXJyb3IoYm1wLT5kYl9pcGJtYXAtPmlfc2IsCisJCQkJICAiZGJBbGxvY0FHOiB1bmFibGUgdG8gYWxsb2NhdGUgYmxvY2tzIik7CisJCQlyYyA9IC1FSU87CisJCX0KKwkJcmV0dXJuIChyYyk7CisJfQorCisJLyogbm8gc3BhY2UgaW4gdGhlIGFsbG9jYXRpb24gZ3JvdXAuICByZWxlYXNlIHRoZSBidWZmZXIgYW5kCisJICogcmV0dXJuIC1FTk9TUEMuCisJICovCisJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisKKwlyZXR1cm4gLUVOT1NQQzsKK30KKworCisvKgorICogTkFNRToJZGJBbGxvY0FueSgpCisgKgorICogRlVOQ1RJT046ICAgIGF0dGVtcHQgdG8gYWxsb2NhdGUgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY29udGlndW91cworICoJCWZyZWUgYmxvY2tzIGFueXdoZXJlIGluIHRoZSBmaWxlIHN5c3RlbS4KKyAqCisgKgkJZGJBbGxvY0FueSgpIGF0dGVtcHRzIHRvIGZpbmQgdGhlIHN1ZmZpY2llbnQgZnJlZSBzcGFjZSBieQorICoJCXNlYXJjaGluZyBkb3duIHRoZSBkbWFwIGNvbnRyb2wgcGFnZXMsIHN0YXJ0aW5nIHdpdGggdGhlCisgKgkJaGlnaGVzdCBsZXZlbCAoaS5lLiBMMCwgTDEsIEwyKSBjb250cm9sIHBhZ2UuICBpZiBmcmVlIHNwYWNlCisgKgkJbGFyZ2UgZW5vdWdoIHRvIHNhdGlzZnkgdGhlIGRlc2lyZWQgZnJlZSBzcGFjZSBpcyBmb3VuZCwgdGhlCisgKgkJZGVzaXJlZCBmcmVlIHNwYWNlIGlzIGFsbG9jYXRlZC4KKyAqCisgKiBQQVJBTUVURVJTOgorICogICAgICBibXAJLSAgcG9pbnRlciB0byBibWFwIGRlc2NyaXB0b3IKKyAqICAgICAgbmJsb2NrcwkgLSAgYWN0dWFsIG51bWJlciBvZiBjb250aWd1b3VzIGZyZWUgYmxvY2tzIGRlc2lyZWQuCisgKiAgICAgIGwybmIJIC0gIGxvZzIgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgZnJlZSBibG9ja3MgZGVzaXJlZC4KKyAqICAgICAgcmVzdWx0cwktICBvbiBzdWNjZXNzZnVsIHJldHVybiwgc2V0IHRvIHRoZSBzdGFydGluZyBibG9jayBudW1iZXIKKyAqCQkgICBvZiB0aGUgbmV3bHkgYWxsb2NhdGVkIHJhbmdlLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIDAJLSBzdWNjZXNzCisgKiAgICAgIC1FTk9TUEMJLSBpbnN1ZmZpY2llbnQgZGlzayByZXNvdXJjZXMKKyAqICAgICAgLUVJTwktIGkvbyBlcnJvcgorICoKKyAqIHNlcmlhbGl6YXRpb246IElXUklURV9MT0NLKGlwYm1hcCkgaGVsZCBvbiBlbnRyeS9leGl0OworICovCitzdGF0aWMgaW50IGRiQWxsb2NBbnkoc3RydWN0IGJtYXAgKiBibXAsIHM2NCBuYmxvY2tzLCBpbnQgbDJuYiwgczY0ICogcmVzdWx0cykKK3sKKwlpbnQgcmM7CisJczY0IGJsa25vID0gMDsKKworCS8qIHN0YXJ0aW5nIHdpdGggdGhlIHRvcCBsZXZlbCBkbWFwIGNvbnRyb2wgcGFnZSwgc2VhcmNoCisJICogZG93biB0aGUgZG1hcCBjb250cm9sIGxldmVscyBmb3Igc3VmZmljaWVudCBmcmVlIHNwYWNlLgorCSAqIGlmIGZyZWUgc3BhY2UgaXMgZm91bmQsIGRiRmluZEN0bCgpIHJldHVybnMgdGhlIHN0YXJ0aW5nCisJICogYmxvY2sgbnVtYmVyIG9mIHRoZSBkbWFwIHRoYXQgY29udGFpbnMgb3Igc3RhcnRzIG9mZiB0aGUKKwkgKiByYW5nZSBvZiBmcmVlIHNwYWNlLgorCSAqLworCWlmICgocmMgPSBkYkZpbmRDdGwoYm1wLCBsMm5iLCBibXAtPmRiX21heGxldmVsLCAmYmxrbm8pKSkKKwkJcmV0dXJuIChyYyk7CisKKwkvKiBhbGxvY2F0ZSB0aGUgYmxvY2tzLgorCSAqLworCXJjID0gZGJBbGxvY0N0bChibXAsIG5ibG9ja3MsIGwybmIsIGJsa25vLCByZXN1bHRzKTsKKwlpZiAocmMgPT0gLUVOT1NQQykgeworCQlqZnNfZXJyb3IoYm1wLT5kYl9pcGJtYXAtPmlfc2IsCisJCQkgICJkYkFsbG9jQW55OiB1bmFibGUgdG8gYWxsb2NhdGUgYmxvY2tzIik7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gKHJjKTsKK30KKworCisvKgorICogTkFNRToJZGJGaW5kQ3RsKCkKKyAqCisgKiBGVU5DVElPTjogICAgc3RhcnRpbmcgYXQgYSBzcGVjaWZpZWQgZG1hcCBjb250cm9sIHBhZ2UgbGV2ZWwgYW5kIGJsb2NrCisgKgkJbnVtYmVyLCBzZWFyY2ggZG93biB0aGUgZG1hcCBjb250cm9sIGxldmVscyBmb3IgYSByYW5nZSBvZgorICoJICAgICAgICBjb250aWd1b3VzIGZyZWUgYmxvY2tzIGxhcmdlIGVub3VnaCB0byBzYXRpc2Z5IGFuIGFsbG9jYXRpb24KKyAqCQlyZXF1ZXN0IGZvciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBmcmVlIGJsb2Nrcy4KKyAqCisgKgkJaWYgc3VmZmljaWVudCBjb250aWd1b3VzIGZyZWUgYmxvY2tzIGFyZSBmb3VuZCwgdGhpcyByb3V0aW5lCisgKgkJcmV0dXJucyB0aGUgc3RhcnRpbmcgYmxvY2sgbnVtYmVyIHdpdGhpbiBhIGRtYXAgcGFnZSB0aGF0CisgKgkJY29udGFpbnMgb3Igc3RhcnRzIGEgcmFuZ2Ugb2YgY29udGlxaW91cyBmcmVlIGJsb2NrcyB0aGF0CisgKgkJaXMgc3VmZmljaWVudCBpbiBzaXplLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIGJtcAktICBwb2ludGVyIHRvIGJtYXAgZGVzY3JpcHRvcgorICogICAgICBsZXZlbAktICBzdGFydGluZyBkbWFwIGNvbnRyb2wgcGFnZSBsZXZlbC4KKyAqICAgICAgbDJuYgktICBsb2cyIG51bWJlciBvZiBjb250aWd1b3VzIGZyZWUgYmxvY2tzIGRlc2lyZWQuCisgKiAgICAgICpibGtubwktICBvbiBlbnRyeSwgc3RhcnRpbmcgYmxvY2sgbnVtYmVyIGZvciBjb25kdWN0aW5nIHRoZSBzZWFyY2guCisgKgkJICAgb24gc3VjY2Vzc2Z1bCByZXR1cm4sIHRoZSBmaXJzdCBibG9jayB3aXRoaW4gYSBkbWFwIHBhZ2UKKyAqCQkgICB0aGF0IGNvbnRhaW5zIG9yIHN0YXJ0cyBhIHJhbmdlIG9mIGNvbnRpZ3VvdXMgZnJlZSBibG9ja3MuCisgKgorICogUkVUVVJOIFZBTFVFUzoKKyAqICAgICAgMAktIHN1Y2Nlc3MKKyAqICAgICAgLUVOT1NQQwktIGluc3VmZmljaWVudCBkaXNrIHJlc291cmNlcworICogICAgICAtRUlPCS0gaS9vIGVycm9yCisgKgorICogc2VyaWFsaXphdGlvbjogSVdSSVRFX0xPQ0soaXBibWFwKSBoZWxkIG9uIGVudHJ5L2V4aXQ7CisgKi8KK3N0YXRpYyBpbnQgZGJGaW5kQ3RsKHN0cnVjdCBibWFwICogYm1wLCBpbnQgbDJuYiwgaW50IGxldmVsLCBzNjQgKiBibGtubykKK3sKKwlpbnQgcmMsIGxlYWZpZHgsIGxldjsKKwlzNjQgYiwgbGJsa25vOworCXN0cnVjdCBkbWFwY3RsICpkY3A7CisJaW50IGJ1ZG1pbjsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCisJLyogc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBkbWFwIGNvbnRyb2wgcGFnZSBsZXZlbCBhbmQgYmxvY2sKKwkgKiBudW1iZXIsIHNlYXJjaCBkb3duIHRoZSBkbWFwIGNvbnRyb2wgbGV2ZWxzIGZvciB0aGUgc3RhcnRpbmcKKwkgKiBibG9jayBudW1iZXIgb2YgYSBkbWFwIHBhZ2UgdGhhdCBjb250YWlucyBvciBzdGFydHMgb2ZmIAorCSAqIHN1ZmZpY2llbnQgZnJlZSBibG9ja3MuCisJICovCisJZm9yIChsZXYgPSBsZXZlbCwgYiA9ICpibGtubzsgbGV2ID49IDA7IGxldi0tKSB7CisJCS8qIGdldCB0aGUgYnVmZmVyIG9mIHRoZSBkbWFwIGNvbnRyb2wgcGFnZSBmb3IgdGhlIGJsb2NrCisJCSAqIG51bWJlciBhbmQgbGV2ZWwgKGkuZS4gTDAsIEwxLCBMMikuCisJCSAqLworCQlsYmxrbm8gPSBCTEtUT0NUTChiLCBibXAtPmRiX2wybmJwZXJwYWdlLCBsZXYpOworCQltcCA9IHJlYWRfbWV0YXBhZ2UoYm1wLT5kYl9pcGJtYXAsIGxibGtubywgUFNJWkUsIDApOworCQlpZiAobXAgPT0gTlVMTCkKKwkJCXJldHVybiAtRUlPOworCQlkY3AgPSAoc3RydWN0IGRtYXBjdGwgKikgbXAtPmRhdGE7CisJCWJ1ZG1pbiA9IGRjcC0+YnVkbWluOworCisJCWlmIChkY3AtPmxlYWZpZHggIT0gY3B1X3RvX2xlMzIoQ1RMTEVBRklORCkpIHsKKwkJCWpmc19lcnJvcihibXAtPmRiX2lwYm1hcC0+aV9zYiwKKwkJCQkgICJkYkZpbmRDdGw6IENvcnJ1cHQgZG1hcGN0bCBwYWdlIik7CisJCQlyZWxlYXNlX21ldGFwYWdlKG1wKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJLyogc2VhcmNoIHRoZSB0cmVlIHdpdGhpbiB0aGUgZG1hcCBjb250cm9sIHBhZ2UgZm9yCisJCSAqIHN1ZmZpY2VudCBmcmVlIHNwYWNlLiAgaWYgc3VmZmljaWVudCBmcmVlIHNwYWNlIGlzIGZvdW5kLAorCQkgKiBkYkZpbmRMZWFmKCkgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxlYWYgYXQgd2hpY2gKKwkJICogZnJlZSBzcGFjZSB3YXMgZm91bmQuCisJCSAqLworCQlyYyA9IGRiRmluZExlYWYoKGRtdHJlZV90ICopIGRjcCwgbDJuYiwgJmxlYWZpZHgpOworCisJCS8qIHJlbGVhc2UgdGhlIGJ1ZmZlci4KKwkJICovCisJCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCisJCS8qIHNwYWNlIGZvdW5kID8KKwkJICovCisJCWlmIChyYykgeworCQkJaWYgKGxldiAhPSBsZXZlbCkgeworCQkJCWpmc19lcnJvcihibXAtPmRiX2lwYm1hcC0+aV9zYiwKKwkJCQkJICAiZGJGaW5kQ3RsOiBkbWFwIGluY29uc2lzdGVudCIpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJcmV0dXJuIC1FTk9TUEM7CisJCX0KKworCQkvKiBhZGp1c3QgdGhlIGJsb2NrIG51bWJlciB0byByZWZsZWN0IHRoZSBsb2NhdGlvbiB3aXRoaW4KKwkJICogdGhlIGRtYXAgY29udHJvbCBwYWdlIChpLmUuIHRoZSBsZWFmKSBhdCB3aGljaCBmcmVlIAorCQkgKiBzcGFjZSB3YXMgZm91bmQuCisJCSAqLworCQliICs9ICgoKHM2NCkgbGVhZmlkeCkgPDwgYnVkbWluKTsKKworCQkvKiB3ZSBzdG9wIHRoZSBzZWFyY2ggYXQgdGhpcyBkbWFwIGNvbnRyb2wgcGFnZSBsZXZlbCBpZgorCQkgKiB0aGUgbnVtYmVyIG9mIGJsb2NrcyByZXF1aXJlZCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwKKwkJICogdG8gdGhlIG1heGltdW0gbnVtYmVyIG9mIGJsb2NrcyBkZXNjcmliZWQgYXQgdGhlIG5leHQKKwkJICogKGxvd2VyKSBsZXZlbC4KKwkJICovCisJCWlmIChsMm5iID49IGJ1ZG1pbikKKwkJCWJyZWFrOworCX0KKworCSpibGtubyA9IGI7CisJcmV0dXJuICgwKTsKK30KKworCisvKgorICogTkFNRToJZGJBbGxvY0N0bCgpCisgKgorICogRlVOQ1RJT046ICAgIGF0dGVtcHQgdG8gYWxsb2NhdGUgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNvbnRpZ3VvdXMKKyAqCQlibG9ja3Mgc3RhcnRpbmcgd2l0aGluIGEgc3BlY2lmaWMgZG1hcC4gIAorICoJCQorICoJCXRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgaGlnaGVyIGxldmVsIHJvdXRpbmVzIHRoYXQgc2VhcmNoCisgKgkJdGhlIGRtYXAgY29udHJvbCBwYWdlcyBhYm92ZSB0aGUgYWN0dWFsIGRtYXBzIGZvciBjb250aWd1b3VzCisgKgkJZnJlZSBzcGFjZS4gIHRoZSByZXN1bHQgb2Ygc3VjY2Vzc2Z1bCBzZWFyY2hlcyBieSB0aGVzZQorICogCQlyb3V0aW5lcyBhcmUgdGhlIHN0YXJ0aW5nIGJsb2NrIG51bWJlcnMgd2l0aGluIGRtYXBzLCB3aXRoCisgKgkJdGhlIGRtYXBzIHRoZW1zZWx2ZXMgY29udGFpbmluZyB0aGUgZGVzaXJlZCBjb250aWd1b3VzIGZyZWUKKyAqCQlzcGFjZSBvciBzdGFydGluZyBhIGNvbnRpZ3VvdXMgZnJlZSBzcGFjZSBvZiBkZXNpcmVkIHNpemUKKyAqCQl0aGF0IGlzIG1hZGUgdXAgb2YgdGhlIGJsb2NrcyBvZiBvbmUgb3IgbW9yZSBkbWFwcy4gdGhlc2UKKyAqCQljYWxscyBzaG91bGQgbm90IGZhaWwgZHVlIHRvIGluc3VmZmljZW50IHJlc291cmNlcy4KKyAqCisgKgkJdGhpcyByb3V0aW5lIGlzIGNhbGxlZCBpbiBzb21lIGNhc2VzIHdoZXJlIGl0IGlzIG5vdCBrbm93bgorICoJCXdoZXRoZXIgaXQgd2lsbCBmYWlsIGR1ZSB0byBpbnN1ZmZpY2llbnQgcmVzb3VyY2VzLiAgbW9yZQorICoJCXNwZWNpZmljYWxseSwgdGhpcyBvY2N1cnMgd2hlbiBhbGxvY2F0aW5nIGZyb20gYW4gYWxsb2NhdGlvbgorICoJCWdyb3VwIHdob3NlIHNpemUgaXMgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBibG9ja3MgcGVyIGRtYXAuCisgKgkJaW4gdGhpcyBjYXNlLCB0aGUgZG1hcCBjb250cm9sIHBhZ2VzIGFyZSBub3QgZXhhbWluZWQgcHJpb3IKKyAqCQl0byBjYWxsaW5nIHRoaXMgcm91dGluZSAodG8gc2F2ZSBwYXRobGVuZ3RoKSBhbmQgdGhlIGNhbGwKKyAqCQltaWdodCBmYWlsLgorICoKKyAqCQlmb3IgYSByZXF1ZXN0IHNpemUgdGhhdCBmaXRzIHdpdGhpbiBhIGRtYXAsIHRoaXMgcm91dGluZSByZWxpZXMKKyAqCQl1cG9uIHRoZSBkbWFwJ3MgZG10cmVlIHRvIGZpbmQgdGhlIHJlcXVlc3RlZCBjb250aWd1b3VzIGZyZWUKKyAqCQlzcGFjZS4gIGZvciByZXF1ZXN0IHNpemVzIHRoYXQgYXJlIGxhcmdlciB0aGFuIGEgZG1hcCwgdGhlCisgKgkJcmVxdWVzdGVkIGZyZWUgc3BhY2Ugd2lsbCBzdGFydCBhdCB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlCisgKgkJZmlyc3QgZG1hcCAoaS5lLiBibGtubykuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgYm1wCS0gIHBvaW50ZXIgdG8gYm1hcCBkZXNjcmlwdG9yCisgKiAgICAgIG5ibG9ja3MJIC0gIGFjdHVhbCBudW1iZXIgb2YgY29udGlndW91cyBmcmVlIGJsb2NrcyB0byBhbGxvY2F0ZS4KKyAqICAgICAgbDJuYgkgLSAgbG9nMiBudW1iZXIgb2YgY29udGlndW91cyBmcmVlIGJsb2NrcyB0byBhbGxvY2F0ZS4KKyAqICAgICAgYmxrbm8JIC0gIHN0YXJ0aW5nIGJsb2NrIG51bWJlciBvZiB0aGUgZG1hcCB0byBzdGFydCB0aGUgYWxsb2NhdGlvbgorICoJCSAgICBmcm9tLgorICogICAgICByZXN1bHRzCS0gIG9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCBzZXQgdG8gdGhlIHN0YXJ0aW5nIGJsb2NrIG51bWJlcgorICoJCSAgIG9mIHRoZSBuZXdseSBhbGxvY2F0ZWQgcmFuZ2UuCisgKgorICogUkVUVVJOIFZBTFVFUzoKKyAqICAgICAgMAktIHN1Y2Nlc3MKKyAqICAgICAgLUVOT1NQQwktIGluc3VmZmljaWVudCBkaXNrIHJlc291cmNlcworICogICAgICAtRUlPCS0gaS9vIGVycm9yCisgKgorICogc2VyaWFsaXphdGlvbjogSVdSSVRFX0xPQ0soaXBibWFwKSBoZWxkIG9uIGVudHJ5L2V4aXQ7CisgKi8KK3N0YXRpYyBpbnQKK2RiQWxsb2NDdGwoc3RydWN0IGJtYXAgKiBibXAsIHM2NCBuYmxvY2tzLCBpbnQgbDJuYiwgczY0IGJsa25vLCBzNjQgKiByZXN1bHRzKQoreworCWludCByYywgbmI7CisJczY0IGIsIGxibGtubywgbjsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCXN0cnVjdCBkbWFwICpkcDsKKworCS8qIGNoZWNrIGlmIHRoZSBhbGxvY2F0aW9uIHJlcXVlc3QgaXMgY29uZmluZWQgdG8gYSBzaW5nbGUgZG1hcC4KKwkgKi8KKwlpZiAobDJuYiA8PSBMMkJQRVJETUFQKSB7CisJCS8qIGdldCB0aGUgYnVmZmVyIGZvciB0aGUgZG1hcC4KKwkJICovCisJCWxibGtubyA9IEJMS1RPRE1BUChibGtubywgYm1wLT5kYl9sMm5icGVycGFnZSk7CisJCW1wID0gcmVhZF9tZXRhcGFnZShibXAtPmRiX2lwYm1hcCwgbGJsa25vLCBQU0laRSwgMCk7CisJCWlmIChtcCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FSU87CisJCWRwID0gKHN0cnVjdCBkbWFwICopIG1wLT5kYXRhOworCisJCS8qIHRyeSB0byBhbGxvY2F0ZSB0aGUgYmxvY2tzLgorCQkgKi8KKwkJcmMgPSBkYkFsbG9jRG1hcExldihibXAsIGRwLCAoaW50KSBuYmxvY2tzLCBsMm5iLCByZXN1bHRzKTsKKwkJaWYgKHJjID09IDApCisJCQltYXJrX21ldGFwYWdlX2RpcnR5KG1wKTsKKworCQlyZWxlYXNlX21ldGFwYWdlKG1wKTsKKworCQlyZXR1cm4gKHJjKTsKKwl9CisKKwkvKiBhbGxvY2F0aW9uIHJlcXVlc3QgaW52b2x2aW5nIG11bHRpcGxlIGRtYXBzLiBpdCBtdXN0IHN0YXJ0IG9uCisJICogYSBkbWFwIGJvdW5kYXJ5LgorCSAqLworCWFzc2VydCgoYmxrbm8gJiAoQlBFUkRNQVAgLSAxKSkgPT0gMCk7CisKKwkvKiBhbGxvY2F0ZSB0aGUgYmxvY2tzIGRtYXAgYnkgZG1hcC4KKwkgKi8KKwlmb3IgKG4gPSBuYmxvY2tzLCBiID0gYmxrbm87IG4gPiAwOyBuIC09IG5iLCBiICs9IG5iKSB7CisJCS8qIGdldCB0aGUgYnVmZmVyIGZvciB0aGUgZG1hcC4KKwkJICovCisJCWxibGtubyA9IEJMS1RPRE1BUChiLCBibXAtPmRiX2wybmJwZXJwYWdlKTsKKwkJbXAgPSByZWFkX21ldGFwYWdlKGJtcC0+ZGJfaXBibWFwLCBsYmxrbm8sIFBTSVpFLCAwKTsKKwkJaWYgKG1wID09IE5VTEwpIHsKKwkJCXJjID0gLUVJTzsKKwkJCWdvdG8gYmFja291dDsKKwkJfQorCQlkcCA9IChzdHJ1Y3QgZG1hcCAqKSBtcC0+ZGF0YTsKKworCQkvKiB0aGUgZG1hcCBiZXR0ZXIgYmUgYWxsIGZyZWUuCisJCSAqLworCQlpZiAoZHAtPnRyZWUuc3RyZWVbUk9PVF0gIT0gTDJCUEVSRE1BUCkgeworCQkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisJCQlqZnNfZXJyb3IoYm1wLT5kYl9pcGJtYXAtPmlfc2IsCisJCQkJICAiZGJBbGxvY0N0bDogdGhlIGRtYXAgaXMgbm90IGFsbCBmcmVlIik7CisJCQlyYyA9IC1FSU87CisJCQlnb3RvIGJhY2tvdXQ7CisJCX0KKworCQkvKiBkZXRlcm1pbmUgaG93IG1hbnkgYmxvY2tzIHRvIGFsbG9jYXRlIGZyb20gdGhpcyBkbWFwLgorCQkgKi8KKwkJbmIgPSBtaW4obiwgKHM2NClCUEVSRE1BUCk7CisKKwkJLyogYWxsb2NhdGUgdGhlIGJsb2NrcyBmcm9tIHRoZSBkbWFwLgorCQkgKi8KKwkJaWYgKChyYyA9IGRiQWxsb2NEbWFwKGJtcCwgZHAsIGIsIG5iKSkpIHsKKwkJCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCQkJZ290byBiYWNrb3V0OworCQl9CisKKwkJLyogd3JpdGUgdGhlIGJ1ZmZlci4KKwkJICovCisJCXdyaXRlX21ldGFwYWdlKG1wKTsKKwl9CisKKwkvKiBzZXQgdGhlIHJlc3VsdHMgKHN0YXJ0aW5nIGJsb2NrIG51bWJlcikgYW5kIHJldHVybi4KKwkgKi8KKwkqcmVzdWx0cyA9IGJsa25vOworCXJldHVybiAoMCk7CisKKwkvKiBzb21ldGhpbmcgZmFpbGVkIGluIGhhbmRsaW5nIGFuIGFsbG9jYXRpb24gcmVxdWVzdCBpbnZvbHZpbmcKKwkgKiBtdWx0aXBsZSBkbWFwcy4gIHdlJ2xsIHRyeSB0byBjbGVhbiB1cCBieSBiYWNraW5nIG91dCBhbnkKKwkgKiBhbGxvY2F0aW9uIHRoYXQgaGFzIGFscmVhZHkgaGFwcGVuZWQgZm9yIHRoaXMgcmVxdWVzdC4gIGlmCisJICogd2UgZmFpbCBpbiBiYWNraW5nIG91dCB0aGUgYWxsb2NhdGlvbiwgd2UnbGwgbWFyayB0aGUgZmlsZQorCSAqIHN5c3RlbSB0byBpbmRpY2F0ZSB0aGF0IGJsb2NrcyBoYXZlIGJlZW4gbGVha2VkLgorCSAqLworICAgICAgYmFja291dDoKKworCS8qIHRyeSB0byBiYWNrb3V0IHRoZSBhbGxvY2F0aW9ucyBkbWFwIGJ5IGRtYXAuCisJICovCisJZm9yIChuID0gbmJsb2NrcyAtIG4sIGIgPSBibGtubzsgbiA+IDA7CisJICAgICBuIC09IEJQRVJETUFQLCBiICs9IEJQRVJETUFQKSB7CisJCS8qIGdldCB0aGUgYnVmZmVyIGZvciB0aGlzIGRtYXAuCisJCSAqLworCQlsYmxrbm8gPSBCTEtUT0RNQVAoYiwgYm1wLT5kYl9sMm5icGVycGFnZSk7CisJCW1wID0gcmVhZF9tZXRhcGFnZShibXAtPmRiX2lwYm1hcCwgbGJsa25vLCBQU0laRSwgMCk7CisJCWlmIChtcCA9PSBOVUxMKSB7CisJCQkvKiBjb3VsZCBub3QgYmFjayBvdXQuICBtYXJrIHRoZSBmaWxlIHN5c3RlbQorCQkJICogdG8gaW5kaWNhdGUgdGhhdCB3ZSBoYXZlIGxlYWtlZCBibG9ja3MuCisJCQkgKi8KKwkJCWpmc19lcnJvcihibXAtPmRiX2lwYm1hcC0+aV9zYiwKKwkJCQkgICJkYkFsbG9jQ3RsOiBJL08gRXJyb3I6IEJsb2NrIExlYWthZ2UuIik7CisJCQljb250aW51ZTsKKwkJfQorCQlkcCA9IChzdHJ1Y3QgZG1hcCAqKSBtcC0+ZGF0YTsKKworCQkvKiBmcmVlIHRoZSBibG9ja3MgaXMgdGhpcyBkbWFwLgorCQkgKi8KKwkJaWYgKGRiRnJlZURtYXAoYm1wLCBkcCwgYiwgQlBFUkRNQVApKSB7CisJCQkvKiBjb3VsZCBub3QgYmFjayBvdXQuICBtYXJrIHRoZSBmaWxlIHN5c3RlbQorCQkJICogdG8gaW5kaWNhdGUgdGhhdCB3ZSBoYXZlIGxlYWtlZCBibG9ja3MuCisJCQkgKi8KKwkJCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCQkJamZzX2Vycm9yKGJtcC0+ZGJfaXBibWFwLT5pX3NiLAorCQkJCSAgImRiQWxsb2NDdGw6IEJsb2NrIExlYWthZ2UuIik7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIHdyaXRlIHRoZSBidWZmZXIuCisJCSAqLworCQl3cml0ZV9tZXRhcGFnZShtcCk7CisJfQorCisJcmV0dXJuIChyYyk7Cit9CisKKworLyoKKyAqIE5BTUU6CWRiQWxsb2NEbWFwTGV2KCkKKyAqCisgKiBGVU5DVElPTjogICAgYXR0ZW1wdCB0byBhbGxvY2F0ZSBhIHNwZWNpZmllZCBudW1iZXIgb2YgY29udGlndW91cyBibG9ja3MKKyAqCQlmcm9tIGEgc3BlY2lmaWVkIGRtYXAuCisgKgkJCisgKgkJdGhpcyByb3V0aW5lIGNoZWNrcyBpZiB0aGUgY29udGlndW91cyBibG9ja3MgYXJlIGF2YWlsYWJsZS4KKyAqCQlpZiBzbywgbmJsb2NrcyBvZiBibG9ja3MgYXJlIGFsbG9jYXRlZDsgb3RoZXJ3aXNlLCBFTk9TUEMgaXMKKyAqCQlyZXR1cm5lZC4KKyAqCisgKiBQQVJBTUVURVJTOgorICogICAgICBtcAktICBwb2ludGVyIHRvIGJtYXAgZGVzY3JpcHRvcgorICogICAgICBkcAktICBwb2ludGVyIHRvIGRtYXAgdG8gYXR0ZW1wdCB0byBhbGxvY2F0ZSBibG9ja3MgZnJvbS4gCisgKiAgICAgIGwybmIJLSAgbG9nMiBudW1iZXIgb2YgY29udGlndW91cyBibG9jayBkZXNpcmVkLgorICogICAgICBuYmxvY2tzCS0gIGFjdHVhbCBudW1iZXIgb2YgY29udGlndW91cyBibG9jayBkZXNpcmVkLgorICogICAgICByZXN1bHRzCS0gIG9uIHN1Y2Nlc3NmdWwgcmV0dXJuLCBzZXQgdG8gdGhlIHN0YXJ0aW5nIGJsb2NrIG51bWJlcgorICoJCSAgIG9mIHRoZSBuZXdseSBhbGxvY2F0ZWQgcmFuZ2UuCisgKgorICogUkVUVVJOIFZBTFVFUzoKKyAqICAgICAgMAktIHN1Y2Nlc3MKKyAqICAgICAgLUVOT1NQQwktIGluc3VmZmljaWVudCBkaXNrIHJlc291cmNlcworICogICAgICAtRUlPCS0gaS9vIGVycm9yCisgKgorICogc2VyaWFsaXphdGlvbjogSVJFQURfTE9DSyhpcGJtYXApLCBlLmcuLCBmcm9tIGRiQWxsb2MoKSwgb3IgCisgKglJV1JJVEVfTE9DSyhpcGJtYXApLCBlLmcuLCBkYkFsbG9jQ3RsKCksIGhlbGQgb24gZW50cnkvZXhpdDsKKyAqLworc3RhdGljIGludAorZGJBbGxvY0RtYXBMZXYoc3RydWN0IGJtYXAgKiBibXAsCisJICAgICAgIHN0cnVjdCBkbWFwICogZHAsIGludCBuYmxvY2tzLCBpbnQgbDJuYiwgczY0ICogcmVzdWx0cykKK3sKKwlzNjQgYmxrbm87CisJaW50IGxlYWZpZHgsIHJjOworCisJLyogY2FuJ3QgYmUgbW9yZSB0aGFuIGEgZG1hcHMgd29ydGggb2YgYmxvY2tzICovCisJYXNzZXJ0KGwybmIgPD0gTDJCUEVSRE1BUCk7CisKKwkvKiBzZWFyY2ggdGhlIHRyZWUgd2l0aGluIHRoZSBkbWFwIHBhZ2UgZm9yIHN1ZmZpY2llbnQKKwkgKiBmcmVlIHNwYWNlLiAgaWYgc3VmZmljaWVudCBmcmVlIHNwYWNlIGlzIGZvdW5kLCBkYkZpbmRMZWFmKCkKKwkgKiByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGVhZiBhdCB3aGljaCBmcmVlIHNwYWNlIHdhcyBmb3VuZC4KKwkgKi8KKwlpZiAoZGJGaW5kTGVhZigoZG10cmVlX3QgKikgJiBkcC0+dHJlZSwgbDJuYiwgJmxlYWZpZHgpKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCS8qIGRldGVybWluZSB0aGUgYmxvY2sgbnVtYmVyIHdpdGhpbiB0aGUgZmlsZSBzeXN0ZW0gY29ycmVzcG9uZGluZworCSAqIHRvIHRoZSBsZWFmIGF0IHdoaWNoIGZyZWUgc3BhY2Ugd2FzIGZvdW5kLgorCSAqLworCWJsa25vID0gbGU2NF90b19jcHUoZHAtPnN0YXJ0KSArIChsZWFmaWR4IDw8IEwyREJXT1JEKTsKKworCS8qIGlmIG5vdCBhbGwgYml0cyBvZiB0aGUgZG1hcCB3b3JkIGFyZSBmcmVlLCBnZXQgdGhlIHN0YXJ0aW5nCisJICogYml0IG51bWJlciB3aXRoaW4gdGhlIGRtYXAgd29yZCBvZiB0aGUgcmVxdWlyZWQgc3RyaW5nIG9mIGZyZWUKKwkgKiBiaXRzIGFuZCBhZGp1c3QgdGhlIGJsb2NrIG51bWJlciB3aXRoIHRoaXMgdmFsdWUuCisJICovCisJaWYgKGRwLT50cmVlLnN0cmVlW2xlYWZpZHggKyBMRUFGSU5EXSA8IEJVRE1JTikKKwkJYmxrbm8gKz0gZGJGaW5kQml0cyhsZTMyX3RvX2NwdShkcC0+d21hcFtsZWFmaWR4XSksIGwybmIpOworCisJLyogYWxsb2NhdGUgdGhlIGJsb2NrcyAqLworCWlmICgocmMgPSBkYkFsbG9jRG1hcChibXAsIGRwLCBibGtubywgbmJsb2NrcykpID09IDApCisJCSpyZXN1bHRzID0gYmxrbm87CisKKwlyZXR1cm4gKHJjKTsKK30KKworCisvKgorICogTkFNRToJZGJBbGxvY0RtYXAoKQorICoKKyAqIEZVTkNUSU9OOiAgICBhZGp1c3QgdGhlIGRpc2sgYWxsb2NhdGlvbiBtYXAgdG8gcmVmbGVjdCB0aGUgYWxsb2NhdGlvbgorICoJCW9mIGEgc3BlY2lmaWVkIGJsb2NrIHJhbmdlIHdpdGhpbiBhIGRtYXAuCisgKgorICoJCXRoaXMgcm91dGluZSBhbGxvY2F0ZXMgdGhlIHNwZWNpZmllZCBibG9ja3MgZnJvbSB0aGUgZG1hcAorICoJCXRocm91Z2ggYSBjYWxsIHRvIGRiQWxsb2NCaXRzKCkuIGlmIHRoZSBhbGxvY2F0aW9uIG9mIHRoZQorICoJCWJsb2NrIHJhbmdlIGNhdXNlcyB0aGUgbWF4aW11bSBzdHJpbmcgb2YgZnJlZSBibG9ja3Mgd2l0aGluCisgKgkJdGhlIGRtYXAgdG8gY2hhbmdlIChpLmUuIHRoZSB2YWx1ZSBvZiB0aGUgcm9vdCBvZiB0aGUgZG1hcCdzCisgKgkJZG10cmVlKSwgdGhpcyByb3V0aW5lIHdpbGwgY2F1c2UgdGhpcyBjaGFuZ2UgdG8gYmUgcmVmbGVjdGVkCisgKgkJdXAgdGhyb3VnaCB0aGUgYXBwcm9wcmlhdGUgbGV2ZWxzIG9mIHRoZSBkbWFwIGNvbnRyb2wgcGFnZXMKKyAqCQlieSBhIGNhbGwgdG8gZGJBZGpDdGwoKSBmb3IgdGhlIEwwIGRtYXAgY29udHJvbCBwYWdlIHRoYXQKKyAqCQljb3ZlcnMgdGhpcyBkbWFwLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIGJtcAktICBwb2ludGVyIHRvIGJtYXAgZGVzY3JpcHRvcgorICogICAgICBkcAktICBwb2ludGVyIHRvIGRtYXAgdG8gYWxsb2NhdGUgdGhlIGJsb2NrIHJhbmdlIGZyb20uCisgKiAgICAgIGJsa25vCS0gIHN0YXJ0aW5nIGJsb2NrIG51bWJlciBvZiB0aGUgYmxvY2sgdG8gYmUgYWxsb2NhdGVkLgorICogICAgICBuYmxvY2tzCS0gIG51bWJlciBvZiBibG9ja3MgdG8gYmUgYWxsb2NhdGVkLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIDAJLSBzdWNjZXNzCisgKiAgICAgIC1FSU8JLSBpL28gZXJyb3IKKyAqCisgKiBzZXJpYWxpemF0aW9uOiBJUkVBRF9MT0NLKGlwYm1hcCkgb3IgSVdSSVRFX0xPQ0soaXBibWFwKSBoZWxkIG9uIGVudHJ5L2V4aXQ7CisgKi8KK3N0YXRpYyBpbnQgZGJBbGxvY0RtYXAoc3RydWN0IGJtYXAgKiBibXAsIHN0cnVjdCBkbWFwICogZHAsIHM2NCBibGtubywKKwkJICAgICAgIGludCBuYmxvY2tzKQoreworCXM4IG9sZHJvb3Q7CisJaW50IHJjOworCisJLyogc2F2ZSB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcm9vdCAoaS5lLiBtYXhpbXVtIGZyZWUgc3RyaW5nKQorCSAqIG9mIHRoZSBkbWFwIHRyZWUuCisJICovCisJb2xkcm9vdCA9IGRwLT50cmVlLnN0cmVlW1JPT1RdOworCisJLyogYWxsb2NhdGUgdGhlIHNwZWNpZmllZCAoYmxvY2tzKSBiaXRzICovCisJZGJBbGxvY0JpdHMoYm1wLCBkcCwgYmxrbm8sIG5ibG9ja3MpOworCisJLyogaWYgdGhlIHJvb3QgaGFzIG5vdCBjaGFuZ2VkLCBkb25lLiAqLworCWlmIChkcC0+dHJlZS5zdHJlZVtST09UXSA9PSBvbGRyb290KQorCQlyZXR1cm4gKDApOworCisJLyogcm9vdCBjaGFuZ2VkLiBidWJibGUgdGhlIGNoYW5nZSB1cCB0byB0aGUgZG1hcCBjb250cm9sIHBhZ2VzLgorCSAqIGlmIHRoZSBhZGp1c3RtZW50IG9mIHRoZSB1cHBlciBsZXZlbCBjb250cm9sIHBhZ2VzIGZhaWxzLAorCSAqIGJhY2tvdXQgdGhlIGJpdCBhbGxvY2F0aW9uICh0aHVzIG1ha2luZyBldmVyeXRoaW5nIGNvbnNpc3RlbnQpLgorCSAqLworCWlmICgocmMgPSBkYkFkakN0bChibXAsIGJsa25vLCBkcC0+dHJlZS5zdHJlZVtST09UXSwgMSwgMCkpKQorCQlkYkZyZWVCaXRzKGJtcCwgZHAsIGJsa25vLCBuYmxvY2tzKTsKKworCXJldHVybiAocmMpOworfQorCisKKy8qCisgKiBOQU1FOglkYkZyZWVEbWFwKCkKKyAqCisgKiBGVU5DVElPTjogICAgYWRqdXN0IHRoZSBkaXNrIGFsbG9jYXRpb24gbWFwIHRvIHJlZmxlY3QgdGhlIGFsbG9jYXRpb24KKyAqCQlvZiBhIHNwZWNpZmllZCBibG9jayByYW5nZSB3aXRoaW4gYSBkbWFwLgorICoKKyAqCQl0aGlzIHJvdXRpbmUgZnJlZXMgdGhlIHNwZWNpZmllZCBibG9ja3MgZnJvbSB0aGUgZG1hcCB0aHJvdWdoCisgKgkJYSBjYWxsIHRvIGRiRnJlZUJpdHMoKS4gaWYgdGhlIGRlYWxsb2NhdGlvbiBvZiB0aGUgYmxvY2sgcmFuZ2UKKyAqCQljYXVzZXMgdGhlIG1heGltdW0gc3RyaW5nIG9mIGZyZWUgYmxvY2tzIHdpdGhpbiB0aGUgZG1hcCB0bworICoJCWNoYW5nZSAoaS5lLiB0aGUgdmFsdWUgb2YgdGhlIHJvb3Qgb2YgdGhlIGRtYXAncyBkbXRyZWUpLCB0aGlzCisgKgkJcm91dGluZSB3aWxsIGNhdXNlIHRoaXMgY2hhbmdlIHRvIGJlIHJlZmxlY3RlZCB1cCB0aHJvdWdoIHRoZQorICoJICAgICAgICBhcHByb3ByaWF0ZSBsZXZlbHMgb2YgdGhlIGRtYXAgY29udHJvbCBwYWdlcyBieSBhIGNhbGwgdG8KKyAqCQlkYkFkakN0bCgpIGZvciB0aGUgTDAgZG1hcCBjb250cm9sIHBhZ2UgdGhhdCBjb3ZlcnMgdGhpcyBkbWFwLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIGJtcAktICBwb2ludGVyIHRvIGJtYXAgZGVzY3JpcHRvcgorICogICAgICBkcAktICBwb2ludGVyIHRvIGRtYXAgdG8gZnJlZSB0aGUgYmxvY2sgcmFuZ2UgZnJvbS4KKyAqICAgICAgYmxrbm8JLSAgc3RhcnRpbmcgYmxvY2sgbnVtYmVyIG9mIHRoZSBibG9jayB0byBiZSBmcmVlZC4KKyAqICAgICAgbmJsb2NrcwktICBudW1iZXIgb2YgYmxvY2tzIHRvIGJlIGZyZWVkLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIDAJLSBzdWNjZXNzCisgKiAgICAgIC1FSU8JLSBpL28gZXJyb3IKKyAqCisgKiBzZXJpYWxpemF0aW9uOiBJUkVBRF9MT0NLKGlwYm1hcCkgb3IgSVdSSVRFX0xPQ0soaXBibWFwKSBoZWxkIG9uIGVudHJ5L2V4aXQ7CisgKi8KK3N0YXRpYyBpbnQgZGJGcmVlRG1hcChzdHJ1Y3QgYm1hcCAqIGJtcCwgc3RydWN0IGRtYXAgKiBkcCwgczY0IGJsa25vLAorCQkgICAgICBpbnQgbmJsb2NrcykKK3sKKwlzOCBvbGRyb290OworCWludCByYywgd29yZDsKKworCS8qIHNhdmUgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHJvb3QgKGkuZS4gbWF4aW11bSBmcmVlIHN0cmluZykKKwkgKiBvZiB0aGUgZG1hcCB0cmVlLgorCSAqLworCW9sZHJvb3QgPSBkcC0+dHJlZS5zdHJlZVtST09UXTsKKworCS8qIGZyZWUgdGhlIHNwZWNpZmllZCAoYmxvY2tzKSBiaXRzICovCisJZGJGcmVlQml0cyhibXAsIGRwLCBibGtubywgbmJsb2Nrcyk7CisKKwkvKiBpZiB0aGUgcm9vdCBoYXMgbm90IGNoYW5nZWQsIGRvbmUuICovCisJaWYgKGRwLT50cmVlLnN0cmVlW1JPT1RdID09IG9sZHJvb3QpCisJCXJldHVybiAoMCk7CisKKwkvKiByb290IGNoYW5nZWQuIGJ1YmJsZSB0aGUgY2hhbmdlIHVwIHRvIHRoZSBkbWFwIGNvbnRyb2wgcGFnZXMuCisJICogaWYgdGhlIGFkanVzdG1lbnQgb2YgdGhlIHVwcGVyIGxldmVsIGNvbnRyb2wgcGFnZXMgZmFpbHMsCisJICogYmFja291dCB0aGUgZGVhbGxvY2F0aW9uLiAKKwkgKi8KKwlpZiAoKHJjID0gZGJBZGpDdGwoYm1wLCBibGtubywgZHAtPnRyZWUuc3RyZWVbUk9PVF0sIDAsIDApKSkgeworCQl3b3JkID0gKGJsa25vICYgKEJQRVJETUFQIC0gMSkpID4+IEwyREJXT1JEOworCisJCS8qIGFzIHBhcnQgb2YgYmFja2luZyBvdXQgdGhlIGRlYWxsb2NhdGlvbiwgd2Ugd2lsbCBoYXZlCisJCSAqIHRvIGJhY2sgc3BsaXQgdGhlIGRtYXAgdHJlZSBpZiB0aGUgZGVhbGxvY2F0aW9uIGNhdXNlZAorCQkgKiB0aGUgZnJlZWQgYmxvY2tzIHRvIGJlY29tZSBwYXJ0IG9mIGEgbGFyZ2VyIGJpbmFyeSBidWRkeQorCQkgKiBzeXN0ZW0uCisJCSAqLworCQlpZiAoZHAtPnRyZWUuc3RyZWVbd29yZF0gPT0gTk9GUkVFKQorCQkJZGJCYWNrU3BsaXQoKGRtdHJlZV90ICopICYgZHAtPnRyZWUsIHdvcmQpOworCisJCWRiQWxsb2NCaXRzKGJtcCwgZHAsIGJsa25vLCBuYmxvY2tzKTsKKwl9CisKKwlyZXR1cm4gKHJjKTsKK30KKworCisvKgorICogTkFNRToJZGJBbGxvY0JpdHMoKQorICoKKyAqIEZVTkNUSU9OOiAgICBhbGxvY2F0ZSBhIHNwZWNpZmllZCBibG9jayByYW5nZSBmcm9tIGEgZG1hcC4KKyAqCisgKgkJdGhpcyByb3V0aW5lIHVwZGF0ZXMgdGhlIGRtYXAgdG8gcmVmbGVjdCB0aGUgd29ya2luZworICoJCXN0YXRlIGFsbG9jYXRpb24gb2YgdGhlIHNwZWNpZmllZCBibG9jayByYW5nZS4gaXQgZGlyZWN0bHkKKyAqCQl1cGRhdGVzIHRoZSBiaXRzIG9mIHRoZSB3b3JraW5nIG1hcCBhbmQgY2F1c2VzIHRoZSBhZGp1c3RtZW50CisgKgkJb2YgdGhlIGJpbmFyeSBidWRkeSBzeXN0ZW0gZGVzY3JpYmVkIGJ5IHRoZSBkbWFwJ3MgZG10cmVlCisgKgkJbGVhdmVzIHRvIHJlZmxlY3QgdGhlIGJpdHMgYWxsb2NhdGVkLiAgaXQgYWxzbyBjYXVzZXMgdGhlCisgKgkJZG1hcCdzIGRtdHJlZSwgYXMgYSB3aG9sZSwgdG8gcmVmbGVjdCB0aGUgYWxsb2NhdGVkIHJhbmdlLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIGJtcAktICBwb2ludGVyIHRvIGJtYXAgZGVzY3JpcHRvcgorICogICAgICBkcAktICBwb2ludGVyIHRvIGRtYXAgdG8gYWxsb2NhdGUgYml0cyBmcm9tLgorICogICAgICBibGtubwktICBzdGFydGluZyBibG9jayBudW1iZXIgb2YgdGhlIGJpdHMgdG8gYmUgYWxsb2NhdGVkLgorICogICAgICBuYmxvY2tzCS0gIG51bWJlciBvZiBiaXRzIHRvIGJlIGFsbG9jYXRlZC4KKyAqCisgKiBSRVRVUk4gVkFMVUVTOiBub25lCisgKgorICogc2VyaWFsaXphdGlvbjogSVJFQURfTE9DSyhpcGJtYXApIG9yIElXUklURV9MT0NLKGlwYm1hcCkgaGVsZCBvbiBlbnRyeS9leGl0OworICovCitzdGF0aWMgdm9pZCBkYkFsbG9jQml0cyhzdHJ1Y3QgYm1hcCAqIGJtcCwgc3RydWN0IGRtYXAgKiBkcCwgczY0IGJsa25vLAorCQkJaW50IG5ibG9ja3MpCit7CisJaW50IGRiaXRubywgd29yZCwgcmVtYml0cywgbmIsIG53b3Jkcywgd2JpdG5vLCBudywgYWdubzsKKwlkbXRyZWVfdCAqdHAgPSAoZG10cmVlX3QgKikgJiBkcC0+dHJlZTsKKwlpbnQgc2l6ZTsKKwlzOCAqbGVhZjsKKworCS8qIHBpY2sgdXAgYSBwb2ludGVyIHRvIHRoZSBsZWF2ZXMgb2YgdGhlIGRtYXAgdHJlZSAqLworCWxlYWYgPSBkcC0+dHJlZS5zdHJlZSArIExFQUZJTkQ7CisKKwkvKiBkZXRlcm1pbmUgdGhlIGJpdCBudW1iZXIgYW5kIHdvcmQgd2l0aGluIHRoZSBkbWFwIG9mIHRoZQorCSAqIHN0YXJ0aW5nIGJsb2NrLgorCSAqLworCWRiaXRubyA9IGJsa25vICYgKEJQRVJETUFQIC0gMSk7CisJd29yZCA9IGRiaXRubyA+PiBMMkRCV09SRDsKKworCS8qIGJsb2NrIHJhbmdlIGJldHRlciBiZSB3aXRoaW4gdGhlIGRtYXAgKi8KKwlhc3NlcnQoZGJpdG5vICsgbmJsb2NrcyA8PSBCUEVSRE1BUCk7CisKKwkvKiBhbGxvY2F0ZSB0aGUgYml0cyBvZiB0aGUgZG1hcCdzIHdvcmRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGJsb2NrCisJICogcmFuZ2UuIG5vdCBhbGwgYml0cyBvZiB0aGUgZmlyc3QgYW5kIGxhc3Qgd29yZHMgbWF5IGJlIGNvbnRhaW5lZAorCSAqIHdpdGhpbiB0aGUgYmxvY2sgcmFuZ2UuICBpZiB0aGlzIGlzIHRoZSBjYXNlLCB3ZSdsbCB3b3JrIGFnYWluc3QKKwkgKiB0aG9zZSB3b3JkcyAoaS5lLiBwYXJ0aWFsIGZpcnN0IGFuZC9vciBsYXN0KSBvbiBhbiBpbmRpdmlkdWFsIGJhc2lzCisJICogKGEgc2luZ2xlIHBhc3MpLCBhbGxvY2F0aW5nIHRoZSBiaXRzIG9mIGludGVyZXN0IGJ5IGhhbmQgYW5kCisJICogdXBkYXRpbmcgdGhlIGxlYWYgY29ycmVzcG9uZGluZyB0byB0aGUgZG1hcCB3b3JkLiBhIHNpbmdsZSBwYXNzCisJICogd2lsbCBiZSB1c2VkIGZvciBhbGwgZG1hcCB3b3JkcyBmdWxseSBjb250YWluZWQgd2l0aGluIHRoZQorCSAqIHNwZWNpZmllZCByYW5nZS4gIHdpdGhpbiB0aGlzIHBhc3MsIHRoZSBiaXRzIG9mIGFsbCBmdWxseSBjb250YWluZWQKKwkgKiBkbWFwIHdvcmRzIHdpbGwgYmUgbWFya2VkIGFzIGZyZWUgaW4gYSBzaW5nbGUgc2hvdCBhbmQgdGhlIGxlYXZlcworCSAqIHdpbGwgYmUgdXBkYXRlZC4gYSBzaW5nbGUgbGVhZiBtYXkgZGVzY3JpYmUgdGhlIGZyZWUgc3BhY2Ugb2YKKwkgKiBtdWx0aXBsZSBkbWFwIHdvcmRzLCBzbyB3ZSBtYXkgdXBkYXRlIG9ubHkgYSBzdWJzZXQgb2YgdGhlIGFjdHVhbAorCSAqIGxlYXZlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBkbWFwIHdvcmRzIG9mIHRoZSBibG9jayByYW5nZS4KKwkgKi8KKwlmb3IgKHJlbWJpdHMgPSBuYmxvY2tzOyByZW1iaXRzID4gMDsgcmVtYml0cyAtPSBuYiwgZGJpdG5vICs9IG5iKSB7CisJCS8qIGRldGVybWluZSB0aGUgYml0IG51bWJlciB3aXRoaW4gdGhlIHdvcmQgYW5kCisJCSAqIHRoZSBudW1iZXIgb2YgYml0cyB3aXRoaW4gdGhlIHdvcmQuCisJCSAqLworCQl3Yml0bm8gPSBkYml0bm8gJiAoREJXT1JEIC0gMSk7CisJCW5iID0gbWluKHJlbWJpdHMsIERCV09SRCAtIHdiaXRubyk7CisKKwkJLyogY2hlY2sgaWYgb25seSBwYXJ0IG9mIGEgd29yZCBpcyB0byBiZSBhbGxvY2F0ZWQuCisJCSAqLworCQlpZiAobmIgPCBEQldPUkQpIHsKKwkJCS8qIGFsbG9jYXRlIChzZXQgdG8gMSkgdGhlIGFwcHJvcHJpYXRlIGJpdHMgd2l0aGluCisJCQkgKiB0aGlzIGRtYXAgd29yZC4KKwkJCSAqLworCQkJZHAtPndtYXBbd29yZF0gfD0gY3B1X3RvX2xlMzIoT05FUyA8PCAoREJXT1JEIC0gbmIpCisJCQkJCQkgICAgICA+PiB3Yml0bm8pOworCisJCQkvKiB1cGRhdGUgdGhlIGxlYWYgZm9yIHRoaXMgZG1hcCB3b3JkLiBpbiBhZGRpdGlvbgorCQkJICogdG8gc2V0dGluZyB0aGUgbGVhZiB2YWx1ZSB0byB0aGUgYmluYXJ5IGJ1ZGR5IG1heAorCQkJICogb2YgdGhlIHVwZGF0ZWQgZG1hcCB3b3JkLCBkYlNwbGl0KCkgd2lsbCBzcGxpdAorCQkJICogdGhlIGJpbmFyeSBzeXN0ZW0gb2YgdGhlIGxlYXZlcyBpZiBuZWVkIGJlLgorCQkJICovCisJCQlkYlNwbGl0KHRwLCB3b3JkLCBCVURNSU4sCisJCQkJZGJNYXhCdWQoKHU4ICopICYgZHAtPndtYXBbd29yZF0pKTsKKworCQkJd29yZCArPSAxOworCQl9IGVsc2UgeworCQkJLyogb25lIG9yIG1vcmUgZG1hcCB3b3JkcyBhcmUgZnVsbHkgY29udGFpbmVkCisJCQkgKiB3aXRoaW4gdGhlIGJsb2NrIHJhbmdlLiAgZGV0ZXJtaW5lIGhvdyBtYW55CisJCQkgKiB3b3JkcyBhbmQgYWxsb2NhdGUgKHNldCB0byAxKSB0aGUgYml0cyBvZiB0aGVzZQorCQkJICogd29yZHMuCisJCQkgKi8KKwkJCW53b3JkcyA9IHJlbWJpdHMgPj4gTDJEQldPUkQ7CisJCQltZW1zZXQoJmRwLT53bWFwW3dvcmRdLCAoaW50KSBPTkVTLCBud29yZHMgKiA0KTsKKworCQkJLyogZGV0ZXJtaW5lIGhvdyBtYW55IGJpdHMuCisJCQkgKi8KKwkJCW5iID0gbndvcmRzIDw8IEwyREJXT1JEOworCisJCQkvKiBub3cgdXBkYXRlIHRoZSBhcHByb3ByaWF0ZSBsZWF2ZXMgdG8gcmVmbGVjdAorCQkJICogdGhlIGFsbG9jYXRlZCB3b3Jkcy4KKwkJCSAqLworCQkJZm9yICg7IG53b3JkcyA+IDA7IG53b3JkcyAtPSBudykgeworCQkJICAgICAgICBpZiAobGVhZlt3b3JkXSA8IEJVRE1JTikgeworCQkJCQlqZnNfZXJyb3IoYm1wLT5kYl9pcGJtYXAtPmlfc2IsCisJCQkJCQkgICJkYkFsbG9jQml0czogbGVhZiBwYWdlICIKKwkJCQkJCSAgImNvcnJ1cHQiKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLyogZGV0ZXJtaW5lIHdoYXQgdGhlIGxlYWYgdmFsdWUgc2hvdWxkIGJlCisJCQkJICogdXBkYXRlZCB0byBhcyB0aGUgbWluaW11bSBvZiB0aGUgbDIgbnVtYmVyCisJCQkJICogb2YgYml0cyBiZWluZyBhbGxvY2F0ZWQgYW5kIHRoZSBsMiBudW1iZXIKKwkJCQkgKiBvZiBiaXRzIGN1cnJlbnRseSBkZXNjcmliZWQgYnkgdGhpcyBsZWFmLgorCQkJCSAqLworCQkJCXNpemUgPSBtaW4oKGludClsZWFmW3dvcmRdLCBOTFNUT0wyQlNaKG53b3JkcykpOworCisJCQkJLyogdXBkYXRlIHRoZSBsZWFmIHRvIHJlZmxlY3QgdGhlIGFsbG9jYXRpb24uCisJCQkJICogaW4gYWRkaXRpb24gdG8gc2V0dGluZyB0aGUgbGVhZiB2YWx1ZSB0bworCQkJCSAqIE5PRlJFRSwgZGJTcGxpdCgpIHdpbGwgc3BsaXQgdGhlIGJpbmFyeQorCQkJCSAqIHN5c3RlbSBvZiB0aGUgbGVhdmVzIHRvIHJlZmxlY3QgdGhlIGN1cnJlbnQKKwkJCQkgKiBhbGxvY2F0aW9uIChzaXplKS4KKwkJCQkgKi8KKwkJCQlkYlNwbGl0KHRwLCB3b3JkLCBzaXplLCBOT0ZSRUUpOworCisJCQkJLyogZ2V0IHRoZSBudW1iZXIgb2YgZG1hcCB3b3JkcyBoYW5kbGVkICovCisJCQkJbncgPSBCVURTSVpFKHNpemUsIEJVRE1JTik7CisJCQkJd29yZCArPSBudzsKKwkJCX0KKwkJfQorCX0KKworCS8qIHVwZGF0ZSB0aGUgZnJlZSBjb3VudCBmb3IgdGhpcyBkbWFwICovCisJZHAtPm5mcmVlID0gY3B1X3RvX2xlMzIobGUzMl90b19jcHUoZHAtPm5mcmVlKSAtIG5ibG9ja3MpOworCisJQk1BUF9MT0NLKGJtcCk7CisKKwkvKiBpZiB0aGlzIGFsbG9jYXRpb24gZ3JvdXAgaXMgY29tcGxldGVseSBmcmVlLAorCSAqIHVwZGF0ZSB0aGUgbWF4aW11bSBhbGxvY2F0aW9uIGdyb3VwIG51bWJlciBpZiB0aGlzIGFsbG9jYXRpb24KKwkgKiBncm91cCBpcyB0aGUgbmV3IG1heC4KKwkgKi8KKwlhZ25vID0gYmxrbm8gPj4gYm1wLT5kYl9hZ2wyc2l6ZTsKKwlpZiAoYWdubyA+IGJtcC0+ZGJfbWF4YWcpCisJCWJtcC0+ZGJfbWF4YWcgPSBhZ25vOworCisJLyogdXBkYXRlIHRoZSBmcmVlIGNvdW50IGZvciB0aGUgYWxsb2NhdGlvbiBncm91cCBhbmQgbWFwICovCisJYm1wLT5kYl9hZ2ZyZWVbYWdub10gLT0gbmJsb2NrczsKKwlibXAtPmRiX25mcmVlIC09IG5ibG9ja3M7CisKKwlCTUFQX1VOTE9DSyhibXApOworfQorCisKKy8qCisgKiBOQU1FOglkYkZyZWVCaXRzKCkKKyAqCisgKiBGVU5DVElPTjogICAgZnJlZSBhIHNwZWNpZmllZCBibG9jayByYW5nZSBmcm9tIGEgZG1hcC4KKyAqCisgKgkJdGhpcyByb3V0aW5lIHVwZGF0ZXMgdGhlIGRtYXAgdG8gcmVmbGVjdCB0aGUgd29ya2luZworICoJCXN0YXRlIGFsbG9jYXRpb24gb2YgdGhlIHNwZWNpZmllZCBibG9jayByYW5nZS4gaXQgZGlyZWN0bHkKKyAqCQl1cGRhdGVzIHRoZSBiaXRzIG9mIHRoZSB3b3JraW5nIG1hcCBhbmQgY2F1c2VzIHRoZSBhZGp1c3RtZW50CisgKgkJb2YgdGhlIGJpbmFyeSBidWRkeSBzeXN0ZW0gZGVzY3JpYmVkIGJ5IHRoZSBkbWFwJ3MgZG10cmVlCisgKgkJbGVhdmVzIHRvIHJlZmxlY3QgdGhlIGJpdHMgZnJlZWQuICBpdCBhbHNvIGNhdXNlcyB0aGUgZG1hcCdzCisgKgkJZG10cmVlLCBhcyBhIHdob2xlLCB0byByZWZsZWN0IHRoZSBkZWFsbG9jYXRlZCByYW5nZS4KKyAqCisgKiBQQVJBTUVURVJTOgorICogICAgICBibXAJLSAgcG9pbnRlciB0byBibWFwIGRlc2NyaXB0b3IKKyAqICAgICAgZHAJLSAgcG9pbnRlciB0byBkbWFwIHRvIGZyZWUgYml0cyBmcm9tLgorICogICAgICBibGtubwktICBzdGFydGluZyBibG9jayBudW1iZXIgb2YgdGhlIGJpdHMgdG8gYmUgZnJlZWQuCisgKiAgICAgIG5ibG9ja3MJLSAgbnVtYmVyIG9mIGJpdHMgdG8gYmUgZnJlZWQuCisgKgorICogUkVUVVJOIFZBTFVFUzogbm9uZQorICoKKyAqIHNlcmlhbGl6YXRpb246IElSRUFEX0xPQ0soaXBibWFwKSBvciBJV1JJVEVfTE9DSyhpcGJtYXApIGhlbGQgb24gZW50cnkvZXhpdDsKKyAqLworc3RhdGljIHZvaWQgZGJGcmVlQml0cyhzdHJ1Y3QgYm1hcCAqIGJtcCwgc3RydWN0IGRtYXAgKiBkcCwgczY0IGJsa25vLAorCQkgICAgICAgaW50IG5ibG9ja3MpCit7CisJaW50IGRiaXRubywgd29yZCwgcmVtYml0cywgbmIsIG53b3Jkcywgd2JpdG5vLCBudywgYWdubzsKKwlkbXRyZWVfdCAqdHAgPSAoZG10cmVlX3QgKikgJiBkcC0+dHJlZTsKKwlpbnQgc2l6ZTsKKworCS8qIGRldGVybWluZSB0aGUgYml0IG51bWJlciBhbmQgd29yZCB3aXRoaW4gdGhlIGRtYXAgb2YgdGhlCisJICogc3RhcnRpbmcgYmxvY2suCisJICovCisJZGJpdG5vID0gYmxrbm8gJiAoQlBFUkRNQVAgLSAxKTsKKwl3b3JkID0gZGJpdG5vID4+IEwyREJXT1JEOworCisJLyogYmxvY2sgcmFuZ2UgYmV0dGVyIGJlIHdpdGhpbiB0aGUgZG1hcC4KKwkgKi8KKwlhc3NlcnQoZGJpdG5vICsgbmJsb2NrcyA8PSBCUEVSRE1BUCk7CisKKwkvKiBmcmVlIHRoZSBiaXRzIG9mIHRoZSBkbWFwcyB3b3JkcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBibG9jayByYW5nZS4KKwkgKiBub3QgYWxsIGJpdHMgb2YgdGhlIGZpcnN0IGFuZCBsYXN0IHdvcmRzIG1heSBiZSBjb250YWluZWQgd2l0aGluCisJICogdGhlIGJsb2NrIHJhbmdlLiAgaWYgdGhpcyBpcyB0aGUgY2FzZSwgd2UnbGwgd29yayBhZ2FpbnN0IHRob3NlCisJICogd29yZHMgKGkuZS4gcGFydGlhbCBmaXJzdCBhbmQvb3IgbGFzdCkgb24gYW4gaW5kaXZpZHVhbCBiYXNpcworCSAqIChhIHNpbmdsZSBwYXNzKSwgZnJlZWluZyB0aGUgYml0cyBvZiBpbnRlcmVzdCBieSBoYW5kIGFuZCB1cGRhdGluZworCSAqIHRoZSBsZWFmIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRtYXAgd29yZC4gYSBzaW5nbGUgcGFzcyB3aWxsIGJlIHVzZWQKKwkgKiBmb3IgYWxsIGRtYXAgd29yZHMgZnVsbHkgY29udGFpbmVkIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHJhbmdlLiAgCisJICogd2l0aGluIHRoaXMgcGFzcywgdGhlIGJpdHMgb2YgYWxsIGZ1bGx5IGNvbnRhaW5lZCBkbWFwIHdvcmRzIHdpbGwKKwkgKiBiZSBtYXJrZWQgYXMgZnJlZSBpbiBhIHNpbmdsZSBzaG90IGFuZCB0aGUgbGVhdmVzIHdpbGwgYmUgdXBkYXRlZC4gYQorCSAqIHNpbmdsZSBsZWFmIG1heSBkZXNjcmliZSB0aGUgZnJlZSBzcGFjZSBvZiBtdWx0aXBsZSBkbWFwIHdvcmRzLAorCSAqIHNvIHdlIG1heSB1cGRhdGUgb25seSBhIHN1YnNldCBvZiB0aGUgYWN0dWFsIGxlYXZlcyBjb3JyZXNwb25kaW5nCisJICogdG8gdGhlIGRtYXAgd29yZHMgb2YgdGhlIGJsb2NrIHJhbmdlLgorCSAqCisJICogZGJKb2luKCkgaXMgdXNlZCB0byB1cGRhdGUgbGVhZiB2YWx1ZXMgYW5kIHdpbGwgam9pbiB0aGUgYmluYXJ5CisJICogYnVkZHkgc3lzdGVtIG9mIHRoZSBsZWF2ZXMgaWYgdGhlIG5ldyBsZWFmIHZhbHVlcyBpbmRpY2F0ZSB0aGlzCisJICogc2hvdWxkIGJlIGRvbmUuCisJICovCisJZm9yIChyZW1iaXRzID0gbmJsb2NrczsgcmVtYml0cyA+IDA7IHJlbWJpdHMgLT0gbmIsIGRiaXRubyArPSBuYikgeworCQkvKiBkZXRlcm1pbmUgdGhlIGJpdCBudW1iZXIgd2l0aGluIHRoZSB3b3JkIGFuZAorCQkgKiB0aGUgbnVtYmVyIG9mIGJpdHMgd2l0aGluIHRoZSB3b3JkLgorCQkgKi8KKwkJd2JpdG5vID0gZGJpdG5vICYgKERCV09SRCAtIDEpOworCQluYiA9IG1pbihyZW1iaXRzLCBEQldPUkQgLSB3Yml0bm8pOworCisJCS8qIGNoZWNrIGlmIG9ubHkgcGFydCBvZiBhIHdvcmQgaXMgdG8gYmUgZnJlZWQuCisJCSAqLworCQlpZiAobmIgPCBEQldPUkQpIHsKKwkJCS8qIGZyZWUgKHplcm8pIHRoZSBhcHByb3ByaWF0ZSBiaXRzIHdpdGhpbiB0aGlzCisJCQkgKiBkbWFwIHdvcmQuIAorCQkJICovCisJCQlkcC0+d21hcFt3b3JkXSAmPQorCQkJICAgIGNwdV90b19sZTMyKH4oT05FUyA8PCAoREJXT1JEIC0gbmIpCisJCQkJCSAgPj4gd2JpdG5vKSk7CisKKwkJCS8qIHVwZGF0ZSB0aGUgbGVhZiBmb3IgdGhpcyBkbWFwIHdvcmQuCisJCQkgKi8KKwkJCWRiSm9pbih0cCwgd29yZCwKKwkJCSAgICAgICBkYk1heEJ1ZCgodTggKikgJiBkcC0+d21hcFt3b3JkXSkpOworCisJCQl3b3JkICs9IDE7CisJCX0gZWxzZSB7CisJCQkvKiBvbmUgb3IgbW9yZSBkbWFwIHdvcmRzIGFyZSBmdWxseSBjb250YWluZWQKKwkJCSAqIHdpdGhpbiB0aGUgYmxvY2sgcmFuZ2UuICBkZXRlcm1pbmUgaG93IG1hbnkKKwkJCSAqIHdvcmRzIGFuZCBmcmVlICh6ZXJvKSB0aGUgYml0cyBvZiB0aGVzZSB3b3Jkcy4KKwkJCSAqLworCQkJbndvcmRzID0gcmVtYml0cyA+PiBMMkRCV09SRDsKKwkJCW1lbXNldCgmZHAtPndtYXBbd29yZF0sIDAsIG53b3JkcyAqIDQpOworCisJCQkvKiBkZXRlcm1pbmUgaG93IG1hbnkgYml0cy4KKwkJCSAqLworCQkJbmIgPSBud29yZHMgPDwgTDJEQldPUkQ7CisKKwkJCS8qIG5vdyB1cGRhdGUgdGhlIGFwcHJvcHJpYXRlIGxlYXZlcyB0byByZWZsZWN0CisJCQkgKiB0aGUgZnJlZWQgd29yZHMuCisJCQkgKi8KKwkJCWZvciAoOyBud29yZHMgPiAwOyBud29yZHMgLT0gbncpIHsKKwkJCQkvKiBkZXRlcm1pbmUgd2hhdCB0aGUgbGVhZiB2YWx1ZSBzaG91bGQgYmUKKwkJCQkgKiB1cGRhdGVkIHRvIGFzIHRoZSBtaW5pbXVtIG9mIHRoZSBsMiBudW1iZXIKKwkJCQkgKiBvZiBiaXRzIGJlaW5nIGZyZWVkIGFuZCB0aGUgbDIgKG1heCkgbnVtYmVyCisJCQkJICogb2YgYml0cyB0aGF0IGNhbiBiZSBkZXNjcmliZWQgYnkgdGhpcyBsZWFmLgorCQkJCSAqLworCQkJCXNpemUgPQorCQkJCSAgICBtaW4oTElUT0wyQlNaCisJCQkJCSh3b3JkLCBMMkxQRVJETUFQLCBCVURNSU4pLAorCQkJCQlOTFNUT0wyQlNaKG53b3JkcykpOworCisJCQkJLyogdXBkYXRlIHRoZSBsZWFmLgorCQkJCSAqLworCQkJCWRiSm9pbih0cCwgd29yZCwgc2l6ZSk7CisKKwkJCQkvKiBnZXQgdGhlIG51bWJlciBvZiBkbWFwIHdvcmRzIGhhbmRsZWQuCisJCQkJICovCisJCQkJbncgPSBCVURTSVpFKHNpemUsIEJVRE1JTik7CisJCQkJd29yZCArPSBudzsKKwkJCX0KKwkJfQorCX0KKworCS8qIHVwZGF0ZSB0aGUgZnJlZSBjb3VudCBmb3IgdGhpcyBkbWFwLgorCSAqLworCWRwLT5uZnJlZSA9IGNwdV90b19sZTMyKGxlMzJfdG9fY3B1KGRwLT5uZnJlZSkgKyBuYmxvY2tzKTsKKworCUJNQVBfTE9DSyhibXApOworCisJLyogdXBkYXRlIHRoZSBmcmVlIGNvdW50IGZvciB0aGUgYWxsb2NhdGlvbiBncm91cCBhbmQgCisJICogbWFwLgorCSAqLworCWFnbm8gPSBibGtubyA+PiBibXAtPmRiX2FnbDJzaXplOworCWJtcC0+ZGJfbmZyZWUgKz0gbmJsb2NrczsKKwlibXAtPmRiX2FnZnJlZVthZ25vXSArPSBuYmxvY2tzOworCisJLyogY2hlY2sgaWYgdGhpcyBhbGxvY2F0aW9uIGdyb3VwIGlzIG5vdCBjb21wbGV0ZWx5IGZyZWUgYW5kCisJICogaWYgaXQgaXMgY3VycmVudGx5IHRoZSBtYXhpbXVtIChyaWdodG1vc3QpIGFsbG9jYXRpb24gZ3JvdXAuCisJICogaWYgc28sIGVzdGFibGlzaCB0aGUgbmV3IG1heGltdW0gYWxsb2NhdGlvbiBncm91cCBudW1iZXIgYnkKKwkgKiBzZWFyY2hpbmcgbGVmdCBmb3IgdGhlIGZpcnN0IGFsbG9jYXRpb24gZ3JvdXAgd2l0aCBhbGxvY2F0aW9uLgorCSAqLworCWlmICgoYm1wLT5kYl9hZ2ZyZWVbYWdub10gPT0gYm1wLT5kYl9hZ3NpemUgJiYgYWdubyA9PSBibXAtPmRiX21heGFnKSB8fAorCSAgICAoYWdubyA9PSBibXAtPmRiX251bWFnIC0gMSAmJgorCSAgICAgYm1wLT5kYl9hZ2ZyZWVbYWdub10gPT0gKGJtcC0+IGRiX21hcHNpemUgJiAoQlBFUkRNQVAgLSAxKSkpKSB7CisJCXdoaWxlIChibXAtPmRiX21heGFnID4gMCkgeworCQkJYm1wLT5kYl9tYXhhZyAtPSAxOworCQkJaWYgKGJtcC0+ZGJfYWdmcmVlW2JtcC0+ZGJfbWF4YWddICE9CisJCQkgICAgYm1wLT5kYl9hZ3NpemUpCisJCQkJYnJlYWs7CisJCX0KKworCQkvKiByZS1lc3RhYmxpc2ggdGhlIGFsbG9jYXRpb24gZ3JvdXAgcHJlZmVyZW5jZSBpZiB0aGUKKwkJICogY3VycmVudCBwcmVmZXJlbmNlIGlzIHJpZ2h0IG9mIHRoZSBtYXhpbXVtIGFsbG9jYXRpb24KKwkJICogZ3JvdXAuCisJCSAqLworCQlpZiAoYm1wLT5kYl9hZ3ByZWYgPiBibXAtPmRiX21heGFnKQorCQkJYm1wLT5kYl9hZ3ByZWYgPSBibXAtPmRiX21heGFnOworCX0KKworCUJNQVBfVU5MT0NLKGJtcCk7Cit9CisKKworLyoKKyAqIE5BTUU6CWRiQWRqQ3RsKCkKKyAqCisgKiBGVU5DVElPTjoJYWRqdXN0IGEgZG1hcCBjb250cm9sIHBhZ2UgYXQgYSBzcGVjaWZpZWQgbGV2ZWwgdG8gcmVmbGVjdAorICoJCXRoZSBjaGFuZ2UgaW4gYSBsb3dlciBsZXZlbCBkbWFwIG9yIGRtYXAgY29udHJvbCBwYWdlJ3MKKyAqCQltYXhpbXVtIHN0cmluZyBvZiBmcmVlIGJsb2NrcyAoaS5lLiBhIGNoYW5nZSBpbiB0aGUgcm9vdAorICoJCW9mIHRoZSBsb3dlciBsZXZlbCBvYmplY3QncyBkbXRyZWUpIGR1ZSB0byB0aGUgYWxsb2NhdGlvbgorICoJCW9yIGRlYWxsb2NhdGlvbiBvZiBhIHJhbmdlIG9mIGJsb2NrcyB3aXRoIGEgc2luZ2xlIGRtYXAuCisgKgorICoJCW9uIGVudHJ5LCB0aGlzIHJvdXRpbmUgaXMgcHJvdmlkZWQgd2l0aCB0aGUgbmV3IHZhbHVlIG9mCisgKgkJdGhlIGxvd2VyIGxldmVsIGRtYXAgb3IgZG1hcCBjb250cm9sIHBhZ2Ugcm9vdCBhbmQgdGhlCisgKgkJc3RhcnRpbmcgYmxvY2sgbnVtYmVyIG9mIHRoZSBibG9jayByYW5nZSB3aG9zZSBhbGxvY2F0aW9uCisgKgkJb3IgZGVhbGxvY2F0aW9uIHJlc3VsdGVkIGluIHRoZSByb290IGNoYW5nZS4gIHRoaXMgcmFuZ2UKKyAqCQlpcyByZXNwcmVzZW50ZWQgYnkgYSBzaW5nbGUgbGVhZiBvZiB0aGUgY3VycmVudCBkbWFwY3RsCisgKgkJYW5kIHRoZSBsZWFmIHdpbGwgYmUgdXBkYXRlZCB3aXRoIHRoaXMgdmFsdWUsIHBvc3NpYmx5CisgKgkJY2F1c2luZyBhIGJpbmFyeSBidWRkeSBzeXN0ZW0gd2l0aGluIHRoZSBsZWF2ZXMgdG8gYmUgCisgKgkJc3BsaXQgb3Igam9pbmVkLiAgdGhlIHVwZGF0ZSBtYXkgYWxzbyBjYXVzZSB0aGUgZG1hcGN0bCdzCisgKgkJZG10cmVlIHRvIGJlIHVwZGF0ZWQuCisgKgorICoJCWlmIHRoZSBhZGp1c3RtZW50IG9mIHRoZSBkbWFwIGNvbnRyb2wgcGFnZSwgaXRzZWxmLCBjYXVzZXMgaXRzCisgKgkJcm9vdCB0byBjaGFuZ2UsIHRoaXMgY2hhbmdlIHdpbGwgYmUgYnViYmxlZCB1cCB0byB0aGUgbmV4dCBkbWFwCisgKgkJY29udHJvbCBsZXZlbCBieSBhIHJlY3Vyc2l2ZSBjYWxsIHRvIHRoaXMgcm91dGluZSwgc3BlY2lmeWluZworICoJCXRoZSBuZXcgcm9vdCB2YWx1ZSBhbmQgdGhlIG5leHQgZG1hcCBjb250cm9sIHBhZ2UgbGV2ZWwgdG8KKyAqCQliZSBhZGp1c3RlZC4KKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIGJtcAktICBwb2ludGVyIHRvIGJtYXAgZGVzY3JpcHRvcgorICogICAgICBibGtubwktICB0aGUgZmlyc3QgYmxvY2sgb2YgYSBibG9jayByYW5nZSB3aXRoaW4gYSBkbWFwLiAgaXQgaXMKKyAqCQkgICB0aGUgYWxsb2NhdGlvbiBvciBkZWFsbG9jYXRpb24gb2YgdGhpcyBibG9jayByYW5nZSB0aGF0CisgKgkJICAgcmVxdWlyZXMgdGhlIGRtYXAgY29udHJvbCBwYWdlIHRvIGJlIGFkanVzdGVkLgorICogICAgICBuZXd2YWwJLSAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgbG93ZXIgbGV2ZWwgZG1hcCBvciBkbWFwIGNvbnRyb2wKKyAqCQkgICBwYWdlIHJvb3QuCisgKiAgICAgIGFsbG9jCS0gIFRSVUUgaWYgYWRqdXN0bWVudCBpcyBkdWUgdG8gYW4gYWxsb2NhdGlvbi4KKyAqICAgICAgbGV2ZWwJLSAgY3VycmVudCBsZXZlbCBvZiBkbWFwIGNvbnRyb2wgcGFnZSAoaS5lLiBMMCwgTDEsIEwyKSB0bworICoJCSAgIGJlIGFkanVzdGVkLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIDAJLSBzdWNjZXNzCisgKiAgICAgIC1FSU8JLSBpL28gZXJyb3IKKyAqCisgKiBzZXJpYWxpemF0aW9uOiBJUkVBRF9MT0NLKGlwYm1hcCkgb3IgSVdSSVRFX0xPQ0soaXBibWFwKSBoZWxkIG9uIGVudHJ5L2V4aXQ7CisgKi8KK3N0YXRpYyBpbnQKK2RiQWRqQ3RsKHN0cnVjdCBibWFwICogYm1wLCBzNjQgYmxrbm8sIGludCBuZXd2YWwsIGludCBhbGxvYywgaW50IGxldmVsKQoreworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJczggb2xkcm9vdDsKKwlpbnQgb2xkdmFsOworCXM2NCBsYmxrbm87CisJc3RydWN0IGRtYXBjdGwgKmRjcDsKKwlpbnQgcmMsIGxlYWZubywgdGk7CisKKwkvKiBnZXQgdGhlIGJ1ZmZlciBmb3IgdGhlIGRtYXAgY29udHJvbCBwYWdlIGZvciB0aGUgc3BlY2lmaWVkCisJICogYmxvY2sgbnVtYmVyIGFuZCBjb250cm9sIHBhZ2UgbGV2ZWwuCisJICovCisJbGJsa25vID0gQkxLVE9DVEwoYmxrbm8sIGJtcC0+ZGJfbDJuYnBlcnBhZ2UsIGxldmVsKTsKKwltcCA9IHJlYWRfbWV0YXBhZ2UoYm1wLT5kYl9pcGJtYXAsIGxibGtubywgUFNJWkUsIDApOworCWlmIChtcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTzsKKwlkY3AgPSAoc3RydWN0IGRtYXBjdGwgKikgbXAtPmRhdGE7CisKKwlpZiAoZGNwLT5sZWFmaWR4ICE9IGNwdV90b19sZTMyKENUTExFQUZJTkQpKSB7CisJCWpmc19lcnJvcihibXAtPmRiX2lwYm1hcC0+aV9zYiwKKwkJCSAgImRiQWRqQ3RsOiBDb3JydXB0IGRtYXBjdGwgcGFnZSIpOworCQlyZWxlYXNlX21ldGFwYWdlKG1wKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogZGV0ZXJtaW5lIHRoZSBsZWFmIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBibG9jayBhbmQKKwkgKiB0aGUgaW5kZXggd2l0aGluIHRoZSBkbWFwIGNvbnRyb2wgdHJlZS4KKwkgKi8KKwlsZWFmbm8gPSBCTEtUT0NUTExFQUYoYmxrbm8sIGRjcC0+YnVkbWluKTsKKwl0aSA9IGxlYWZubyArIGxlMzJfdG9fY3B1KGRjcC0+bGVhZmlkeCk7CisKKwkvKiBzYXZlIHRoZSBjdXJyZW50IGxlYWYgdmFsdWUgYW5kIHRoZSBjdXJyZW50IHJvb3QgbGV2ZWwgKGkuZS4KKwkgKiBtYXhpbXVtIGwyIGZyZWUgc3RyaW5nIGRlc2NyaWJlZCBieSB0aGlzIGRtYXBjdGwpLgorCSAqLworCW9sZHZhbCA9IGRjcC0+c3RyZWVbdGldOworCW9sZHJvb3QgPSBkY3AtPnN0cmVlW1JPT1RdOworCisJLyogY2hlY2sgaWYgdGhpcyBpcyBhIGNvbnRyb2wgcGFnZSB1cGRhdGUgZm9yIGFuIGFsbG9jYXRpb24uCisJICogaWYgc28sIHVwZGF0ZSB0aGUgbGVhZiB0byByZWZsZWN0IHRoZSBuZXcgbGVhZiB2YWx1ZSB1c2luZworCSAqIGRiU3BsaXQoKTsgb3RoZXJ3aXNlIChkZWFsbG9jYXRpb24pLCB1c2UgZGJKb2luKCkgdG8gdWRwYXRlCisJICogdGhlIGxlYWYgd2l0aCB0aGUgbmV3IHZhbHVlLiAgaW4gYWRkaXRpb24gdG8gdXBkYXRpbmcgdGhlCisJICogbGVhZiwgZGJTcGxpdCgpIHdpbGwgYWxzbyBzcGxpdCB0aGUgYmluYXJ5IGJ1ZGR5IHN5c3RlbSBvZgorCSAqIHRoZSBsZWF2ZXMsIGlmIHJlcXVpcmVkLCBhbmQgYnViYmxlIG5ldyB2YWx1ZXMgd2l0aGluIHRoZQorCSAqIGRtYXBjdGwgdHJlZSwgaWYgcmVxdWlyZWQuICBzaW1pbGFybHksIGRiSm9pbigpIHdpbGwgam9pbgorCSAqIHRoZSBiaW5hcnkgYnVkZHkgc3lzdGVtIG9mIGxlYXZlcyBhbmQgYnViYmxlIG5ldyB2YWx1ZXMgdXAKKwkgKiB0aGUgZG1hcGN0bCB0cmVlIGFzIHJlcXVpcmVkIGJ5IHRoZSBuZXcgbGVhZiB2YWx1ZS4KKwkgKi8KKwlpZiAoYWxsb2MpIHsKKwkJLyogY2hlY2sgaWYgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgYSBiaW5hcnkgYnVkZHkKKwkJICogc3lzdGVtLiAgdGhpcyBoYXBwZW5zIHdoZW4gd2UgYXJlIHBlcmZvcm1pbmcgdGhlCisJCSAqIGZpcnN0IGFsbG9jYXRpb24gb3V0IG9mIGFuIGFsbG9jYXRpb24gZ3JvdXAgdGhhdAorCQkgKiBpcyBwYXJ0IChub3QgdGhlIGZpcnN0IHBhcnQpIG9mIGEgbGFyZ2VyIGJpbmFyeQorCQkgKiBidWRkeSBzeXN0ZW0uICBpZiB3ZSBhcmUgaW4gdGhlIG1pZGRsZSwgYmFjayBzcGxpdAorCQkgKiB0aGUgc3lzdGVtIHByaW9yIHRvIGNhbGxpbmcgZGJTcGxpdCgpIHdoaWNoIGFzc3VtZXMKKwkJICogdGhhdCBpdCBpcyBhdCB0aGUgZnJvbnQgb2YgYSBiaW5hcnkgYnVkZHkgc3lzdGVtLgorCQkgKi8KKwkJaWYgKG9sZHZhbCA9PSBOT0ZSRUUpIHsKKwkJCWRiQmFja1NwbGl0KChkbXRyZWVfdCAqKSBkY3AsIGxlYWZubyk7CisJCQlvbGR2YWwgPSBkY3AtPnN0cmVlW3RpXTsKKwkJfQorCQlkYlNwbGl0KChkbXRyZWVfdCAqKSBkY3AsIGxlYWZubywgZGNwLT5idWRtaW4sIG5ld3ZhbCk7CisJfSBlbHNlIHsKKwkJZGJKb2luKChkbXRyZWVfdCAqKSBkY3AsIGxlYWZubywgbmV3dmFsKTsKKwl9CisKKwkvKiBjaGVjayBpZiB0aGUgcm9vdCBvZiB0aGUgY3VycmVudCBkbWFwIGNvbnRyb2wgcGFnZSBjaGFuZ2VkIGR1ZQorCSAqIHRvIHRoZSB1cGRhdGUgYW5kIGlmIHRoZSBjdXJyZW50IGRtYXAgY29udHJvbCBwYWdlIGlzIG5vdCBhdAorCSAqIHRoZSBjdXJyZW50IHRvcCBsZXZlbCAoaS5lLiBMMCwgTDEsIEwyKSBvZiB0aGUgbWFwLiAgaWYgc28gKGkuZS4KKwkgKiByb290IGNoYW5nZWQgYW5kIHRoaXMgaXMgbm90IHRoZSB0b3AgbGV2ZWwpLCBjYWxsIHRoaXMgcm91dGluZQorCSAqIGFnYWluIChyZWN1cnNpb24pIGZvciB0aGUgbmV4dCBoaWdoZXIgbGV2ZWwgb2YgdGhlIG1hcHBpbmcgdG8KKwkgKiByZWZsZWN0IHRoZSBjaGFuZ2UgaW4gcm9vdCBmb3IgdGhlIGN1cnJlbnQgZG1hcCBjb250cm9sIHBhZ2UuCisJICovCisJaWYgKGRjcC0+c3RyZWVbUk9PVF0gIT0gb2xkcm9vdCkgeworCQkvKiBhcmUgd2UgYmVsb3cgdGhlIHRvcCBsZXZlbCBvZiB0aGUgbWFwLiAgaWYgc28sCisJCSAqIGJ1YmJsZSB0aGUgcm9vdCB1cCB0byB0aGUgbmV4dCBoaWdoZXIgbGV2ZWwuCisJCSAqLworCQlpZiAobGV2ZWwgPCBibXAtPmRiX21heGxldmVsKSB7CisJCQkvKiBidWJibGUgdXAgdGhlIG5ldyByb290IG9mIHRoaXMgZG1hcCBjb250cm9sIHBhZ2UgdG8KKwkJCSAqIHRoZSBuZXh0IGxldmVsLgorCQkJICovCisJCQlpZiAoKHJjID0KKwkJCSAgICAgZGJBZGpDdGwoYm1wLCBibGtubywgZGNwLT5zdHJlZVtST09UXSwgYWxsb2MsCisJCQkJICAgICAgbGV2ZWwgKyAxKSkpIHsKKwkJCQkvKiBzb21ldGhpbmcgd2VudCB3cm9uZyBpbiBidWJibGluZyB1cCB0aGUgbmV3CisJCQkJICogcm9vdCB2YWx1ZSwgc28gYmFja291dCB0aGUgY2hhbmdlcyB0byB0aGUKKwkJCQkgKiBjdXJyZW50IGRtYXAgY29udHJvbCBwYWdlLgorCQkJCSAqLworCQkJCWlmIChhbGxvYykgeworCQkJCQlkYkpvaW4oKGRtdHJlZV90ICopIGRjcCwgbGVhZm5vLAorCQkJCQkgICAgICAgb2xkdmFsKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiB0aGUgZGJKb2luKCkgYWJvdmUgbWlnaHQgaGF2ZQorCQkJCQkgKiBjYXVzZWQgYSBsYXJnZXIgYmluYXJ5IGJ1ZGR5IHN5c3RlbQorCQkJCQkgKiB0byBmb3JtIGFuZCB3ZSBtYXkgbm93IGJlIGluIHRoZQorCQkJCQkgKiBtaWRkbGUgb2YgaXQuICBpZiB0aGlzIGlzIHRoZSBjYXNlLAorCQkJCQkgKiBiYWNrIHNwbGl0IHRoZSBidWRkaWVzLgorCQkJCQkgKi8KKwkJCQkJaWYgKGRjcC0+c3RyZWVbdGldID09IE5PRlJFRSkKKwkJCQkJCWRiQmFja1NwbGl0KChkbXRyZWVfdCAqKQorCQkJCQkJCSAgICBkY3AsIGxlYWZubyk7CisJCQkJCWRiU3BsaXQoKGRtdHJlZV90ICopIGRjcCwgbGVhZm5vLAorCQkJCQkJZGNwLT5idWRtaW4sIG9sZHZhbCk7CisJCQkJfQorCisJCQkJLyogcmVsZWFzZSB0aGUgYnVmZmVyIGFuZCByZXR1cm4gdGhlIGVycm9yLgorCQkJCSAqLworCQkJCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCQkJCXJldHVybiAocmMpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogd2UncmUgYXQgdGhlIHRvcCBsZXZlbCBvZiB0aGUgbWFwLiB1cGRhdGUKKwkJCSAqIHRoZSBibWFwIGNvbnRyb2wgcGFnZSB0byByZWZsZWN0IHRoZSBzaXplCisJCQkgKiBvZiB0aGUgbWF4aW11bSBmcmVlIGJ1ZGR5IHN5c3RlbS4KKwkJCSAqLworCQkJYXNzZXJ0KGxldmVsID09IGJtcC0+ZGJfbWF4bGV2ZWwpOworCQkJaWYgKGJtcC0+ZGJfbWF4ZnJlZWJ1ZCAhPSBvbGRyb290KSB7CisJCQkJamZzX2Vycm9yKGJtcC0+ZGJfaXBibWFwLT5pX3NiLAorCQkJCQkgICJkYkFkakN0bDogdGhlIG1heGltdW0gZnJlZSBidWRkeSBpcyAiCisJCQkJCSAgIm5vdCB0aGUgb2xkIHJvb3QiKTsKKwkJCX0KKwkJCWJtcC0+ZGJfbWF4ZnJlZWJ1ZCA9IGRjcC0+c3RyZWVbUk9PVF07CisJCX0KKwl9CisKKwkvKiB3cml0ZSB0aGUgYnVmZmVyLgorCSAqLworCXdyaXRlX21ldGFwYWdlKG1wKTsKKworCXJldHVybiAoMCk7Cit9CisKKworLyoKKyAqIE5BTUU6CWRiU3BsaXQoKQorICoKKyAqIEZVTkNUSU9OOiAgICB1cGRhdGUgdGhlIGxlYWYgb2YgYSBkbXRyZWUgd2l0aCBhIG5ldyB2YWx1ZSwgc3BsaXR0aW5nCisgKgkJdGhlIGxlYWYgZnJvbSB0aGUgYmluYXJ5IGJ1ZGR5IHN5c3RlbSBvZiB0aGUgZG10cmVlJ3MKKyAqCQlsZWF2ZXMsIGFzIHJlcXVpcmVkLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIHRwCS0gcG9pbnRlciB0byB0aGUgdHJlZSBjb250YWluaW5nIHRoZSBsZWFmLgorICogICAgICBsZWFmbm8JLSB0aGUgbnVtYmVyIG9mIHRoZSBsZWFmIHRvIGJlIHVwZGF0ZWQuCisgKiAgICAgIHNwbGl0c3oJLSB0aGUgc2l6ZSB0aGUgYmluYXJ5IGJ1ZGR5IHN5c3RlbSBzdGFydGluZyBhdCB0aGUgbGVhZgorICoJCSAgbXVzdCBiZSBzcGxpdCB0bywgc3BlY2lmaWVkIGFzIHRoZSBsb2cyIG51bWJlciBvZiBibG9ja3MuCisgKiAgICAgIG5ld3ZhbAktIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBsZWFmLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6IG5vbmUKKyAqCisgKiBzZXJpYWxpemF0aW9uOiBJUkVBRF9MT0NLKGlwYm1hcCkgb3IgSVdSSVRFX0xPQ0soaXBibWFwKSBoZWxkIG9uIGVudHJ5L2V4aXQ7CisgKi8KK3N0YXRpYyB2b2lkIGRiU3BsaXQoZG10cmVlX3QgKiB0cCwgaW50IGxlYWZubywgaW50IHNwbGl0c3osIGludCBuZXd2YWwpCit7CisJaW50IGJ1ZHN6OworCWludCBjdXJzejsKKwlzOCAqbGVhZiA9IHRwLT5kbXRfc3RyZWUgKyBsZTMyX3RvX2NwdSh0cC0+ZG10X2xlYWZpZHgpOworCisJLyogY2hlY2sgaWYgdGhlIGxlYWYgbmVlZHMgdG8gYmUgc3BsaXQuCisJICovCisJaWYgKGxlYWZbbGVhZm5vXSA+IHRwLT5kbXRfYnVkbWluKSB7CisJCS8qIHRoZSBzcGxpdCBvY2N1cnMgYnkgY3V0dGluZyB0aGUgYnVkZHkgc3lzdGVtIGluIGhhbGYKKwkJICogYXQgdGhlIHNwZWNpZmllZCBsZWFmIHVudGlsIHdlIHJlYWNoIHRoZSBzcGVjaWZpZWQKKwkJICogc2l6ZS4gIHBpY2sgdXAgdGhlIHN0YXJ0aW5nIHNwbGl0IHNpemUgKGN1cnJlbnQgc2l6ZQorCQkgKiAtIDEgaW4gbDIpIGFuZCB0aGUgY29ycmVzcG9uZGluZyBidWRkeSBzaXplLgorCQkgKi8KKwkJY3Vyc3ogPSBsZWFmW2xlYWZub10gLSAxOworCQlidWRzeiA9IEJVRFNJWkUoY3Vyc3osIHRwLT5kbXRfYnVkbWluKTsKKworCQkvKiBzcGxpdCB1bnRpbCB3ZSByZWFjaCB0aGUgc3BlY2lmaWVkIHNpemUuCisJCSAqLworCQl3aGlsZSAoY3Vyc3ogPj0gc3BsaXRzeikgeworCQkJLyogdXBkYXRlIHRoZSBidWRkeSdzIGxlYWYgd2l0aCBpdHMgbmV3IHZhbHVlLgorCQkJICovCisJCQlkYkFkalRyZWUodHAsIGxlYWZubyBeIGJ1ZHN6LCBjdXJzeik7CisKKwkJCS8qIG9uIHRvIHRoZSBuZXh0IHNpemUgYW5kIGJ1ZGR5LgorCQkJICovCisJCQljdXJzeiAtPSAxOworCQkJYnVkc3ogPj49IDE7CisJCX0KKwl9CisKKwkvKiBhZGp1c3QgdGhlIGRtYXAgdHJlZSB0byByZWZsZWN0IHRoZSBzcGVjaWZpZWQgbGVhZidzIG5ldyAKKwkgKiB2YWx1ZS4KKwkgKi8KKwlkYkFkalRyZWUodHAsIGxlYWZubywgbmV3dmFsKTsKK30KKworCisvKgorICogTkFNRToJZGJCYWNrU3BsaXQoKQorICoKKyAqIEZVTkNUSU9OOiAgICBiYWNrIHNwbGl0IHRoZSBiaW5hcnkgYnVkZHkgc3lzdGVtIG9mIGRtdHJlZSBsZWF2ZXMKKyAqCQl0aGF0IGhvbGQgYSBzcGVjaWZpZWQgbGVhZiB1bnRpbCB0aGUgc3BlY2lmaWVkIGxlYWYKKyAqCQlzdGFydHMgaXRzIG93biBiaW5hcnkgYnVkZHkgc3lzdGVtLgorICoKKyAqCQl0aGUgYWxsb2NhdG9ycyB0eXBpY2FsbHkgcGVyZm9ybSBhbGxvY2F0aW9ucyBhdCB0aGUgc3RhcnQKKyAqCQlvZiBiaW5hcnkgYnVkZHkgc3lzdGVtcyBhbmQgZGJTcGxpdCgpIGlzIHVzZWQgdG8gYWNjb21wbGlzaAorICoJCWFueSByZXF1aXJlZCBzcGxpdHMuICBpbiBzb21lIGNhc2VzLCBob3dldmVyLCBhbGxvY2F0aW9uCisgKgkJbWF5IG9jY3VyIGluIHRoZSBtaWRkbGUgb2YgYSBiaW5hcnkgc3lzdGVtIGFuZCByZXF1aXJlcyBhCisgKgkJYmFjayBzcGxpdCwgd2l0aCB0aGUgc3BsaXQgcHJvY2VlZGluZyBvdXQgZnJvbSB0aGUgbWlkZGxlIG9mCisgKgkJdGhlIHN5c3RlbSAobGVzcyBlZmZpY2llbnQpIHJhdGhlciB0aGFuIHRoZSBzdGFydCBvZiB0aGUKKyAqCQlzeXN0ZW0gKG1vcmUgZWZmaWNpZW50KS4gIHRoZSBjYXNlcyBpbiB3aGljaCBhIGJhY2sgc3BsaXQKKyAqCQlpcyByZXF1aXJlZCBhcmUgcmFyZSBhbmQgYXJlIGxpbWl0ZWQgdG8gdGhlIGZpcnN0IGFsbG9jYXRpb24KKyAqCQl3aXRoaW4gYW4gYWxsb2NhdGlvbiBncm91cCB3aGljaCBpcyBhIHBhcnQgKG5vdCBmaXJzdCBwYXJ0KQorICoJCW9mIGEgbGFyZ2VyIGJpbmFyeSBidWRkeSBzeXN0ZW0gYW5kIGEgZmV3IGV4Y2VwdGlvbiBjYXNlcworICoJCWluIHdoaWNoIGEgcHJldmlvdXMgam9pbiBvcGVyYXRpb24gbXVzdCBiZSBiYWNrZWQgb3V0LgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIHRwCS0gcG9pbnRlciB0byB0aGUgdHJlZSBjb250YWluaW5nIHRoZSBsZWFmLgorICogICAgICBsZWFmbm8JLSB0aGUgbnVtYmVyIG9mIHRoZSBsZWFmIHRvIGJlIHVwZGF0ZWQuCisgKgorICogUkVUVVJOIFZBTFVFUzogbm9uZQorICoKKyAqIHNlcmlhbGl6YXRpb246IElSRUFEX0xPQ0soaXBibWFwKSBvciBJV1JJVEVfTE9DSyhpcGJtYXApIGhlbGQgb24gZW50cnkvZXhpdDsKKyAqLworc3RhdGljIHZvaWQgZGJCYWNrU3BsaXQoZG10cmVlX3QgKiB0cCwgaW50IGxlYWZubykKK3sKKwlpbnQgYnVkc3osIGJ1ZCwgdywgYnN6LCBzaXplOworCWludCBjdXJzejsKKwlzOCAqbGVhZiA9IHRwLT5kbXRfc3RyZWUgKyBsZTMyX3RvX2NwdSh0cC0+ZG10X2xlYWZpZHgpOworCisJLyogbGVhZiBzaG91bGQgYmUgcGFydCAobm90IGZpcnN0IHBhcnQpIG9mIGEgYmluYXJ5CisJICogYnVkZHkgc3lzdGVtLgorCSAqLworCWFzc2VydChsZWFmW2xlYWZub10gPT0gTk9GUkVFKTsKKworCS8qIHRoZSBiYWNrIHNwbGl0IGlzIGFjY29tcGxpc2hlZCBieSBpdGVyYXRpdmVseSBmaW5kaW5nIHRoZSBsZWFmCisJICogdGhhdCBzdGFydHMgdGhlIGJ1ZGR5IHN5c3RlbSB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgbGVhZiBhbmQKKwkgKiBzcGxpdHRpbmcgdGhhdCBzeXN0ZW0gaW4gdHdvLiAgdGhpcyBpdGVyYXRpb24gY29udGludWVzIHVudGlsCisJICogdGhlIHNwZWNpZmllZCBsZWFmIGJlY29tZXMgdGhlIHN0YXJ0IG9mIGEgYnVkZHkgc3lzdGVtLiAKKwkgKgorCSAqIGRldGVybWluZSBtYXhpbXVtIHBvc3NpYmxlIGwyIHNpemUgZm9yIHRoZSBzcGVjaWZpZWQgbGVhZi4KKwkgKi8KKwlzaXplID0KKwkgICAgTElUT0wyQlNaKGxlYWZubywgbGUzMl90b19jcHUodHAtPmRtdF9sMm5sZWFmcyksCisJCSAgICAgIHRwLT5kbXRfYnVkbWluKTsKKworCS8qIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGxlYXZlcyBjb3ZlcmVkIGJ5IHRoaXMgc2l6ZS4gIHRoaXMKKwkgKiBpcyB0aGUgYnVkZHkgc2l6ZSB0aGF0IHdlIHdpbGwgc3RhcnQgd2l0aCBhcyB3ZSBzZWFyY2ggZm9yCisJICogdGhlIGJ1ZGR5IHN5c3RlbSB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgbGVhZi4KKwkgKi8KKwlidWRzeiA9IEJVRFNJWkUoc2l6ZSwgdHAtPmRtdF9idWRtaW4pOworCisJLyogYmFjayBzcGxpdC4KKwkgKi8KKwl3aGlsZSAobGVhZltsZWFmbm9dID09IE5PRlJFRSkgeworCQkvKiBmaW5kIHRoZSBsZWZ0bW9zdCBidWRkeSBsZWFmLgorCQkgKi8KKwkJZm9yICh3ID0gbGVhZm5vLCBic3ogPSBidWRzejs7IGJzeiA8PD0gMSwKKwkJICAgICB3ID0gKHcgPCBidWQpID8gdyA6IGJ1ZCkgeworCQkJYXNzZXJ0KGJzeiA8IGxlMzJfdG9fY3B1KHRwLT5kbXRfbmxlYWZzKSk7CisKKwkJCS8qIGRldGVybWluZSB0aGUgYnVkZHkuCisJCQkgKi8KKwkJCWJ1ZCA9IHcgXiBic3o7CisKKwkJCS8qIGNoZWNrIGlmIHRoaXMgYnVkZHkgaXMgdGhlIHN0YXJ0IG9mIHRoZSBzeXN0ZW0uCisJCQkgKi8KKwkJCWlmIChsZWFmW2J1ZF0gIT0gTk9GUkVFKSB7CisJCQkJLyogc3BsaXQgdGhlIGxlYWYgYXQgdGhlIHN0YXJ0IG9mIHRoZQorCQkJCSAqIHN5c3RlbSBpbiB0d28uCisJCQkJICovCisJCQkJY3Vyc3ogPSBsZWFmW2J1ZF0gLSAxOworCQkJCWRiU3BsaXQodHAsIGJ1ZCwgY3Vyc3osIGN1cnN6KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWFzc2VydChsZWFmW2xlYWZub10gPT0gc2l6ZSk7Cit9CisKKworLyoKKyAqIE5BTUU6CWRiSm9pbigpCisgKgorICogRlVOQ1RJT046ICAgIHVwZGF0ZSB0aGUgbGVhZiBvZiBhIGRtdHJlZSB3aXRoIGEgbmV3IHZhbHVlLCBqb2luaW5nCisgKgkJdGhlIGxlYWYgd2l0aCBvdGhlciBsZWF2ZXMgb2YgdGhlIGRtdHJlZSBpbnRvIGEgbXVsdGktbGVhZgorICoJCWJpbmFyeSBidWRkeSBzeXN0ZW0sIGFzIHJlcXVpcmVkLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIHRwCS0gcG9pbnRlciB0byB0aGUgdHJlZSBjb250YWluaW5nIHRoZSBsZWFmLgorICogICAgICBsZWFmbm8JLSB0aGUgbnVtYmVyIG9mIHRoZSBsZWFmIHRvIGJlIHVwZGF0ZWQuCisgKiAgICAgIG5ld3ZhbAktIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBsZWFmLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6IG5vbmUKKyAqLworc3RhdGljIHZvaWQgZGJKb2luKGRtdHJlZV90ICogdHAsIGludCBsZWFmbm8sIGludCBuZXd2YWwpCit7CisJaW50IGJ1ZHN6LCBidWRkeTsKKwlzOCAqbGVhZjsKKworCS8qIGNhbiB0aGUgbmV3IGxlYWYgdmFsdWUgcmVxdWlyZSBhIGpvaW4gd2l0aCBvdGhlciBsZWF2ZXMgPworCSAqLworCWlmIChuZXd2YWwgPj0gdHAtPmRtdF9idWRtaW4pIHsKKwkJLyogcGlja3VwIGEgcG9pbnRlciB0byB0aGUgbGVhdmVzIG9mIHRoZSB0cmVlLgorCQkgKi8KKwkJbGVhZiA9IHRwLT5kbXRfc3RyZWUgKyBsZTMyX3RvX2NwdSh0cC0+ZG10X2xlYWZpZHgpOworCisJCS8qIHRyeSB0byBqb2luIHRoZSBzcGVjaWZpZWQgbGVhZiBpbnRvIGEgbGFyZ2UgYmluYXJ5CisJCSAqIGJ1ZGR5IHN5c3RlbS4gIHRoZSBqb2luIHByb2NlZWRzIGJ5IGF0dGVtcHRpbmcgdG8gam9pbgorCQkgKiB0aGUgc3BlY2lmaWVkIGxlYWZubyB3aXRoIGl0cyBidWRkeSAobGVhZikgYXQgbmV3IHZhbHVlLgorCQkgKiBpZiB0aGUgam9pbiBvY2N1cnMsIHdlIGF0dGVtcHQgdG8gam9pbiB0aGUgbGVmdCBsZWFmCisJCSAqIG9mIHRoZSBqb2luZWQgYnVkZGllcyB3aXRoIGl0cyBidWRkeSBhdCBuZXcgdmFsdWUgKyAxLgorCQkgKiB3ZSBjb250aW51ZSB0byBqb2luIHVudGlsIHdlIGZpbmQgYSBidWRkeSB0aGF0IGNhbm5vdCBiZQorCQkgKiBqb2luZWQgKGRvZXMgbm90IGhhdmUgYSB2YWx1ZSBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUKKwkJICogbGFzdCBqb2luKSBvciB1bnRpbCBhbGwgbGVhdmVzIGhhdmUgYmVlbiBqb2luZWQgaW50byBhCisJCSAqIHNpbmdsZSBzeXN0ZW0uCisJCSAqCisJCSAqIGdldCB0aGUgYnVkZHkgc2l6ZSAobnVtYmVyIG9mIHdvcmRzIGNvdmVyZWQpIG9mCisJCSAqIHRoZSBuZXcgdmFsdWUuCisJCSAqLworCQlidWRzeiA9IEJVRFNJWkUobmV3dmFsLCB0cC0+ZG10X2J1ZG1pbik7CisKKwkJLyogdHJ5IHRvIGpvaW4uCisJCSAqLworCQl3aGlsZSAoYnVkc3ogPCBsZTMyX3RvX2NwdSh0cC0+ZG10X25sZWFmcykpIHsKKwkJCS8qIGdldCB0aGUgYnVkZHkgbGVhZi4KKwkJCSAqLworCQkJYnVkZHkgPSBsZWFmbm8gXiBidWRzejsKKworCQkJLyogaWYgdGhlIGxlYWYncyBuZXcgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIGl0cworCQkJICogYnVkZHkncyB2YWx1ZSwgd2Ugam9pbiBubyBtb3JlLgorCQkJICovCisJCQlpZiAobmV3dmFsID4gbGVhZltidWRkeV0pCisJCQkJYnJlYWs7CisKKwkJCWFzc2VydChuZXd2YWwgPT0gbGVhZltidWRkeV0pOworCisJCQkvKiBjaGVjayB3aGljaCAobGVhZm5vIG9yIGJ1ZGR5KSBpcyB0aGUgbGVmdCBidWRkeS4KKwkJCSAqIHRoZSBsZWZ0IGJ1ZGR5IGdldHMgdG8gY2xhaW0gdGhlIGJsb2NrcyByZXN1bHRpbmcKKwkJCSAqIGZyb20gdGhlIGpvaW4gd2hpbGUgdGhlIHJpZ2h0IGdldHMgdG8gY2xhaW0gbm9uZS4KKwkJCSAqIHRoZSBsZWZ0IGJ1ZGR5IGlzIGFsc28gZWxpZ2FibGUgdG8gcGFydGljaXBhdGUgaW4KKwkJCSAqIGEgam9pbiBhdCB0aGUgbmV4dCBoaWdoZXIgbGV2ZWwgd2hpbGUgdGhlIHJpZ2h0CisJCQkgKiBpcyBub3QuCisJCQkgKgorCQkJICovCisJCQlpZiAobGVhZm5vIDwgYnVkZHkpIHsKKwkJCQkvKiBsZWFmbm8gaXMgdGhlIGxlZnQgYnVkZHkuCisJCQkJICovCisJCQkJZGJBZGpUcmVlKHRwLCBidWRkeSwgTk9GUkVFKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogYnVkZHkgaXMgdGhlIGxlZnQgYnVkZHkgYW5kIGJlY29tZXMKKwkJCQkgKiBsZWFmbm8uCisJCQkJICovCisJCQkJZGJBZGpUcmVlKHRwLCBsZWFmbm8sIE5PRlJFRSk7CisJCQkJbGVhZm5vID0gYnVkZHk7CisJCQl9CisKKwkJCS8qIG9uIHRvIHRyeSB0aGUgbmV4dCBqb2luLgorCQkJICovCisJCQluZXd2YWwgKz0gMTsKKwkJCWJ1ZHN6IDw8PSAxOworCQl9CisJfQorCisJLyogdXBkYXRlIHRoZSBsZWFmIHZhbHVlLgorCSAqLworCWRiQWRqVHJlZSh0cCwgbGVhZm5vLCBuZXd2YWwpOworfQorCisKKy8qCisgKiBOQU1FOglkYkFkalRyZWUoKQorICoKKyAqIEZVTkNUSU9OOiAgICB1cGRhdGUgYSBsZWFmIG9mIGEgZG10cmVlIHdpdGggYSBuZXcgdmFsdWUsIGFkanVzdGluZworICoJCXRoZSBkbXRyZWUsIGFzIHJlcXVpcmVkLCB0byByZWZsZWN0IHRoZSBuZXcgbGVhZiB2YWx1ZS4KKyAqCQl0aGUgY29tYmluYXRpb24gb2YgYW55IGJ1ZGRpZXMgbXVzdCBhbHJlYWR5IGJlIGRvbmUgYmVmb3JlCisgKgkJdGhpcyBpcyBjYWxsZWQuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgdHAJLSBwb2ludGVyIHRvIHRoZSB0cmVlIHRvIGJlIGFkanVzdGVkLgorICogICAgICBsZWFmbm8JLSB0aGUgbnVtYmVyIG9mIHRoZSBsZWFmIHRvIGJlIHVwZGF0ZWQuCisgKiAgICAgIG5ld3ZhbAktIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBsZWFmLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6IG5vbmUKKyAqLworc3RhdGljIHZvaWQgZGJBZGpUcmVlKGRtdHJlZV90ICogdHAsIGludCBsZWFmbm8sIGludCBuZXd2YWwpCit7CisJaW50IGxwLCBwcCwgazsKKwlpbnQgbWF4OworCisJLyogcGljayB1cCB0aGUgaW5kZXggb2YgdGhlIGxlYWYgZm9yIHRoaXMgbGVhZm5vLgorCSAqLworCWxwID0gbGVhZm5vICsgbGUzMl90b19jcHUodHAtPmRtdF9sZWFmaWR4KTsKKworCS8qIGlzIHRoZSBjdXJyZW50IHZhbHVlIHRoZSBzYW1lIGFzIHRoZSBvbGQgdmFsdWUgPyAgaWYgc28sCisJICogdGhlcmUgaXMgbm90aGluZyB0byBkby4KKwkgKi8KKwlpZiAodHAtPmRtdF9zdHJlZVtscF0gPT0gbmV3dmFsKQorCQlyZXR1cm47CisKKwkvKiBzZXQgdGhlIG5ldyB2YWx1ZS4KKwkgKi8KKwl0cC0+ZG10X3N0cmVlW2xwXSA9IG5ld3ZhbDsKKworCS8qIGJ1YmJsZSB0aGUgbmV3IHZhbHVlIHVwIHRoZSB0cmVlIGFzIHJlcXVpcmVkLgorCSAqLworCWZvciAoayA9IDA7IGsgPCBsZTMyX3RvX2NwdSh0cC0+ZG10X2hlaWdodCk7IGsrKykgeworCQkvKiBnZXQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBsZWFmIG9mIHRoZSA0IGxlYWYKKwkJICogZ3JvdXAgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIGxlYWYgKGxlYWZubykuCisJCSAqLworCQlscCA9ICgobHAgLSAxKSAmIH4weDAzKSArIDE7CisKKwkJLyogZ2V0IHRoZSBpbmRleCBvZiB0aGUgcGFyZW50IG9mIHRoaXMgNCBsZWFmIGdyb3VwLgorCQkgKi8KKwkJcHAgPSAobHAgLSAxKSA+PiAyOworCisJCS8qIGRldGVybWluZSB0aGUgbWF4aW11bSBvZiB0aGUgNCBsZWF2ZXMuCisJCSAqLworCQltYXggPSBUUkVFTUFYKCZ0cC0+ZG10X3N0cmVlW2xwXSk7CisKKwkJLyogaWYgdGhlIG1heGltdW0gb2YgdGhlIDQgaXMgdGhlIHNhbWUgYXMgdGhlCisJCSAqIHBhcmVudCdzIHZhbHVlLCB3ZSdyZSBkb25lLgorCQkgKi8KKwkJaWYgKHRwLT5kbXRfc3RyZWVbcHBdID09IG1heCkKKwkJCWJyZWFrOworCisJCS8qIHBhcmVudCBnZXRzIG5ldyB2YWx1ZS4KKwkJICovCisJCXRwLT5kbXRfc3RyZWVbcHBdID0gbWF4OworCisJCS8qIHBhcmVudCBiZWNvbWVzIGxlYWYgZm9yIG5leHQgZ28tcm91bmQuCisJCSAqLworCQlscCA9IHBwOworCX0KK30KKworCisvKgorICogTkFNRToJZGJGaW5kTGVhZigpCisgKgorICogRlVOQ1RJT046ICAgIHNlYXJjaCBhIGRtdHJlZV90IGZvciBzdWZmaWNpZW50IGZyZWUgYmxvY2tzLCByZXR1cm5pbmcKKyAqCQl0aGUgaW5kZXggb2YgYSBsZWFmIGRlc2NyaWJpbmcgdGhlIGZyZWUgYmxvY2tzIGlmIAorICoJCXN1ZmZpY2llbnQgZnJlZSBibG9ja3MgYXJlIGZvdW5kLgorICoKKyAqCQl0aGUgc2VhcmNoIHN0YXJ0cyBhdCB0aGUgdG9wIG9mIHRoZSBkbXRyZWVfdCB0cmVlIGFuZAorICoJCXByb2NlZWRzIGRvd24gdGhlIHRyZWUgdG8gdGhlIGxlZnRtb3N0IGxlYWYgd2l0aCBzdWZmaWNpZW50CisgKgkJZnJlZSBzcGFjZS4KKyAqCisgKiBQQVJBTUVURVJTOgorICogICAgICB0cAktIHBvaW50ZXIgdG8gdGhlIHRyZWUgdG8gYmUgc2VhcmNoZWQuCisgKiAgICAgIGwybmIJLSBsb2cyIG51bWJlciBvZiBmcmVlIGJsb2NrcyB0byBzZWFyY2ggZm9yLgorICoJbGVhZmlkeAktIHJldHVybiBwb2ludGVyIHRvIGJlIHNldCB0byB0aGUgaW5kZXggb2YgdGhlIGxlYWYKKyAqCQkgIGRlc2NyaWJpbmcgYXQgbGVhc3QgbDJuYiBmcmVlIGJsb2NrcyBpZiBzdWZmaWNpZW50CisgKgkJICBmcmVlIGJsb2NrcyBhcmUgZm91bmQuCisgKgorICogUkVUVVJOIFZBTFVFUzoKKyAqICAgICAgMAktIHN1Y2Nlc3MKKyAqICAgICAgLUVOT1NQQwktIGluc3VmZmljaWVudCBmcmVlIGJsb2Nrcy4gCisgKi8KK3N0YXRpYyBpbnQgZGJGaW5kTGVhZihkbXRyZWVfdCAqIHRwLCBpbnQgbDJuYiwgaW50ICpsZWFmaWR4KQoreworCWludCB0aSwgbiA9IDAsIGssIHggPSAwOworCisJLyogZmlyc3QgY2hlY2sgdGhlIHJvb3Qgb2YgdGhlIHRyZWUgdG8gc2VlIGlmIHRoZXJlIGlzCisJICogc3VmZmljaWVudCBmcmVlIHNwYWNlLgorCSAqLworCWlmIChsMm5iID4gdHAtPmRtdF9zdHJlZVtST09UXSkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwkvKiBzdWZmaWNpZW50IGZyZWUgc3BhY2UgYXZhaWxhYmxlLiBub3cgc2VhcmNoIGRvd24gdGhlIHRyZWUKKwkgKiBzdGFydGluZyBhdCB0aGUgbmV4dCBsZXZlbCBmb3IgdGhlIGxlZnRtb3N0IGxlYWYgdGhhdAorCSAqIGRlc2NyaWJlcyBzdWZmaWNpZW50IGZyZWUgc3BhY2UuCisJICovCisJZm9yIChrID0gbGUzMl90b19jcHUodHAtPmRtdF9oZWlnaHQpLCB0aSA9IDE7CisJICAgICBrID4gMDsgay0tLCB0aSA9ICgodGkgKyBuKSA8PCAyKSArIDEpIHsKKwkJLyogc2VhcmNoIHRoZSBmb3VyIG5vZGVzIGF0IHRoaXMgbGV2ZWwsIHN0YXJ0aW5nIGZyb20KKwkJICogdGhlIGxlZnQuCisJCSAqLworCQlmb3IgKHggPSB0aSwgbiA9IDA7IG4gPCA0OyBuKyspIHsKKwkJCS8qIHN1ZmZpY2llbnQgZnJlZSBzcGFjZSBmb3VuZC4gIG1vdmUgdG8gdGhlIG5leHQKKwkJCSAqIGxldmVsIChvciBxdWl0IGlmIHRoaXMgaXMgdGhlIGxhc3QgbGV2ZWwpLgorCQkJICovCisJCQlpZiAobDJuYiA8PSB0cC0+ZG10X3N0cmVlW3ggKyBuXSkKKwkJCQlicmVhazsKKwkJfQorCisJCS8qIGJldHRlciBoYXZlIGZvdW5kIHNvbWV0aGluZyBzaW5jZSB0aGUgaGlnaGVyCisJCSAqIGxldmVscyBvZiB0aGUgdHJlZSBzYWlkIGl0IHdhcyBoZXJlLgorCQkgKi8KKwkJYXNzZXJ0KG4gPCA0KTsKKwl9CisKKwkvKiBzZXQgdGhlIHJldHVybiB0byB0aGUgbGVmdG1vc3QgbGVhZiBkZXNjcmliaW5nIHN1ZmZpY2llbnQKKwkgKiBmcmVlIHNwYWNlLgorCSAqLworCSpsZWFmaWR4ID0geCArIG4gLSBsZTMyX3RvX2NwdSh0cC0+ZG10X2xlYWZpZHgpOworCisJcmV0dXJuICgwKTsKK30KKworCisvKgorICogTkFNRToJZGJGaW5kQml0cygpCisgKgorICogRlVOQ1RJT046ICAgIGZpbmQgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJpbmFyeSBidWRkeSBmcmVlIGJpdHMgd2l0aGluIGEKKyAqCQlkbWFwIGJpdG1hcCB3b3JkIHZhbHVlLgorICoKKyAqCQl0aGlzIHJvdXRpbmUgc2VhcmNoZXMgdGhlIGJpdG1hcCB2YWx1ZSBmb3IgKDEgPDwgbDJuYikgZnJlZQorICoJCWJpdHMgYXQgKDEgPDwgbDJuYikgYWxpZ25tZW50cyB3aXRoaW4gdGhlIHZhbHVlLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIHdvcmQJLSAgZG1hcCBiaXRtYXAgd29yZCB2YWx1ZS4KKyAqICAgICAgbDJuYgktICBudW1iZXIgb2YgZnJlZSBiaXRzIHNwZWNpZmllZCBhcyBhIGxvZzIgbnVtYmVyLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIHN0YXJ0aW5nIGJpdCBudW1iZXIgb2YgZnJlZSBiaXRzLgorICovCitzdGF0aWMgaW50IGRiRmluZEJpdHModTMyIHdvcmQsIGludCBsMm5iKQoreworCWludCBiaXRubywgbmI7CisJdTMyIG1hc2s7CisKKwkvKiBnZXQgdGhlIG51bWJlciBvZiBiaXRzLgorCSAqLworCW5iID0gMSA8PCBsMm5iOworCWFzc2VydChuYiA8PSBEQldPUkQpOworCisJLyogY29tcGxlbWVudCB0aGUgd29yZCBzbyB3ZSBjYW4gdXNlIGEgbWFzayAoaS5lLiAwcyByZXByZXNlbnQKKwkgKiBmcmVlIGJpdHMpIGFuZCBjb21wdXRlIHRoZSBtYXNrLgorCSAqLworCXdvcmQgPSB+d29yZDsKKwltYXNrID0gT05FUyA8PCAoREJXT1JEIC0gbmIpOworCisJLyogc2NhbiB0aGUgd29yZCBmb3IgbmIgZnJlZSBiaXRzIGF0IG5iIGFsaWdubWVudHMuCisJICovCisJZm9yIChiaXRubyA9IDA7IG1hc2sgIT0gMDsgYml0bm8gKz0gbmIsIG1hc2sgPj49IG5iKSB7CisJCWlmICgobWFzayAmIHdvcmQpID09IG1hc2spCisJCQlicmVhazsKKwl9CisKKwlBU1NFUlQoYml0bm8gPCAzMik7CisKKwkvKiByZXR1cm4gdGhlIGJpdCBudW1iZXIuCisJICovCisJcmV0dXJuIChiaXRubyk7Cit9CisKKworLyoKKyAqIE5BTUU6CWRiTWF4QnVkKHU4ICpjcCkKKyAqCisgKiBGVU5DVElPTjogICAgZGV0ZXJtaW5lIHRoZSBsYXJnZXN0IGJpbmFyeSBidWRkeSBzdHJpbmcgb2YgZnJlZQorICoJCWJpdHMgd2l0aGluIDMyLWJpdHMgb2YgdGhlIG1hcC4KKyAqCisgKiBQQVJBTUVURVJTOgorICogICAgICBjcAktICBwb2ludGVyIHRvIHRoZSAzMi1iaXQgdmFsdWUuCisgKgorICogUkVUVVJOIFZBTFVFUzoKKyAqICAgICAgbGFyZ2VzdCBiaW5hcnkgYnVkZHkgb2YgZnJlZSBiaXRzIHdpdGhpbiBhIGRtYXAgd29yZC4KKyAqLworc3RhdGljIGludCBkYk1heEJ1ZCh1OCAqIGNwKQoreworCXNpZ25lZCBjaGFyIHRtcDEsIHRtcDI7CisKKwkvKiBjaGVjayBpZiB0aGUgd21hcCB3b3JkIGlzIGFsbCBmcmVlLiBpZiBzbywgdGhlCisJICogZnJlZSBidWRkeSBzaXplIGlzIEJVRE1JTi4KKwkgKi8KKwlpZiAoKigodWludCAqKSBjcCkgPT0gMCkKKwkJcmV0dXJuIChCVURNSU4pOworCisJLyogY2hlY2sgaWYgdGhlIHdtYXAgd29yZCBpcyBoYWxmIGZyZWUuIGlmIHNvLCB0aGUKKwkgKiBmcmVlIGJ1ZGR5IHNpemUgaXMgQlVETUlOLTEuCisJICovCisJaWYgKCooKHUxNiAqKSBjcCkgPT0gMCB8fCAqKCh1MTYgKikgY3AgKyAxKSA9PSAwKQorCQlyZXR1cm4gKEJVRE1JTiAtIDEpOworCisJLyogbm90IGFsbCBmcmVlIG9yIGhhbGYgZnJlZS4gZGV0ZXJtaW5lIHRoZSBmcmVlIGJ1ZGR5CisJICogc2l6ZSB0aHJ1IHRhYmxlIGxvb2t1cCB1c2luZyBxdWFydGVycyBvZiB0aGUgd21hcCB3b3JkLgorCSAqLworCXRtcDEgPSBtYXgoYnVkdGFiW2NwWzJdXSwgYnVkdGFiW2NwWzNdXSk7CisJdG1wMiA9IG1heChidWR0YWJbY3BbMF1dLCBidWR0YWJbY3BbMV1dKTsKKwlyZXR1cm4gKG1heCh0bXAxLCB0bXAyKSk7Cit9CisKKworLyoKKyAqIE5BTUU6CWNudHR6KHVpbnQgd29yZCkKKyAqCisgKiBGVU5DVElPTjogICAgZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgdHJhaWxpbmcgemVyb3Mgd2l0aGluIGEgMzItYml0CisgKgkJdmFsdWUuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgdmFsdWUJLSAgMzItYml0IHZhbHVlIHRvIGJlIGV4YW1pbmVkLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIGNvdW50IG9mIHRyYWlsaW5nIHplcm9zCisgKi8KK3N0YXRpYyBpbnQgY250dHoodTMyIHdvcmQpCit7CisJaW50IG47CisKKwlmb3IgKG4gPSAwOyBuIDwgMzI7IG4rKywgd29yZCA+Pj0gMSkgeworCQlpZiAod29yZCAmIDB4MDEpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gKG4pOworfQorCisKKy8qCisgKiBOQU1FOgljbnRseih1MzIgdmFsdWUpCisgKgorICogRlVOQ1RJT046ICAgIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGxlYWRpbmcgemVyb3Mgd2l0aGluIGEgMzItYml0CisgKgkJdmFsdWUuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgdmFsdWUJLSAgMzItYml0IHZhbHVlIHRvIGJlIGV4YW1pbmVkLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIGNvdW50IG9mIGxlYWRpbmcgemVyb3MKKyAqLworc3RhdGljIGludCBjbnRseih1MzIgdmFsdWUpCit7CisJaW50IG47CisKKwlmb3IgKG4gPSAwOyBuIDwgMzI7IG4rKywgdmFsdWUgPDw9IDEpIHsKKwkJaWYgKHZhbHVlICYgSElHSE9SREVSKQorCQkJYnJlYWs7CisJfQorCXJldHVybiAobik7Cit9CisKKworLyoKKyAqIE5BTUU6CWJsa3N0b2wyKHM2NCBuYikKKyAqCisgKiBGVU5DVElPTjoJY29udmVydCBhIGJsb2NrIGNvdW50IHRvIGl0cyBsb2cyIHZhbHVlLiBpZiB0aGUgYmxvY2sKKyAqCSAgICAgICAgY291bnQgaXMgbm90IGEgbDIgbXVsdGlwbGUsIGl0IGlzIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQKKyAqCQlsYXJnZXIgbDIgbXVsdGlwbGUuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgbmIJLSAgbnVtYmVyIG9mIGJsb2NrcworICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIGxvZzIgbnVtYmVyIG9mIGJsb2NrcworICovCitpbnQgYmxrc3RvbDIoczY0IG5iKQoreworCWludCBsMm5iOworCXM2NCBtYXNrOwkJLyogbWVhbnQgdG8gYmUgc2lnbmVkICovCisKKwltYXNrID0gKHM2NCkgMSA8PCAoNjQgLSAxKTsKKworCS8qIGNvdW50IHRoZSBsZWFkaW5nIGJpdHMuCisJICovCisJZm9yIChsMm5iID0gMDsgbDJuYiA8IDY0OyBsMm5iKyssIG1hc2sgPj49IDEpIHsKKwkJLyogbGVhZGluZyBiaXQgZm91bmQuCisJCSAqLworCQlpZiAobmIgJiBtYXNrKSB7CisJCQkvKiBkZXRlcm1pbmUgdGhlIGwyIHZhbHVlLgorCQkJICovCisJCQlsMm5iID0gKDY0IC0gMSkgLSBsMm5iOworCisJCQkvKiBjaGVjayBpZiB3ZSBuZWVkIHRvIHJvdW5kIHVwLgorCQkJICovCisJCQlpZiAofm1hc2sgJiBuYikKKwkJCQlsMm5iKys7CisKKwkJCXJldHVybiAobDJuYik7CisJCX0KKwl9CisJYXNzZXJ0KDApOworCXJldHVybiAwOwkJLyogZml4IGNvbXBpbGVyIHdhcm5pbmcgKi8KK30KKworCisvKgorICogTkFNRTogICAgCWRiQWxsb2NCb3R0b21VcCgpCisgKgorICogRlVOQ1RJT046CWFsbG9jIHRoZSBzcGVjaWZpZWQgYmxvY2sgcmFuZ2UgZnJvbSB0aGUgd29ya2luZyBibG9jaworICoJCWFsbG9jYXRpb24gbWFwLgorICoKKyAqCQl0aGUgYmxvY2tzIHdpbGwgYmUgYWxsb2MgZnJvbSB0aGUgd29ya2luZyBtYXAgb25lIGRtYXAKKyAqCQlhdCBhIHRpbWUuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgaXAJLSAgcG9pbnRlciB0byBpbi1jb3JlIGlub2RlOworICogICAgICBibGtubwktICBzdGFydGluZyBibG9jayBudW1iZXIgdG8gYmUgZnJlZWQuCisgKiAgICAgIG5ibG9ja3MJLSAgbnVtYmVyIG9mIGJsb2NrcyB0byBiZSBmcmVlZC4KKyAqCisgKiBSRVRVUk4gVkFMVUVTOgorICogICAgICAwCS0gc3VjY2VzcworICogICAgICAtRUlPCS0gaS9vIGVycm9yCisgKi8KK2ludCBkYkFsbG9jQm90dG9tVXAoc3RydWN0IGlub2RlICppcCwgczY0IGJsa25vLCBzNjQgbmJsb2NrcykKK3sKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCXN0cnVjdCBkbWFwICpkcDsKKwlpbnQgbmIsIHJjOworCXM2NCBsYmxrbm8sIHJlbTsKKwlzdHJ1Y3QgaW5vZGUgKmlwYm1hcCA9IEpGU19TQkkoaXAtPmlfc2IpLT5pcGJtYXA7CisJc3RydWN0IGJtYXAgKmJtcCA9IEpGU19TQkkoaXAtPmlfc2IpLT5ibWFwOworCisJSVJFQURfTE9DSyhpcGJtYXApOworCisJLyogYmxvY2sgdG8gYmUgYWxsb2NhdGVkIGJldHRlciBiZSB3aXRoaW4gdGhlIG1hcHNpemUuICovCisJQVNTRVJUKG5ibG9ja3MgPD0gYm1wLT5kYl9tYXBzaXplIC0gYmxrbm8pOworCisJLyoKKwkgKiBhbGxvY2F0ZSB0aGUgYmxvY2tzIGEgZG1hcCBhdCBhIHRpbWUuCisJICovCisJbXAgPSBOVUxMOworCWZvciAocmVtID0gbmJsb2NrczsgcmVtID4gMDsgcmVtIC09IG5iLCBibGtubyArPSBuYikgeworCQkvKiByZWxlYXNlIHByZXZpb3VzIGRtYXAgaWYgYW55ICovCisJCWlmIChtcCkgeworCQkJd3JpdGVfbWV0YXBhZ2UobXApOworCQl9CisKKwkJLyogZ2V0IHRoZSBidWZmZXIgZm9yIHRoZSBjdXJyZW50IGRtYXAuICovCisJCWxibGtubyA9IEJMS1RPRE1BUChibGtubywgYm1wLT5kYl9sMm5icGVycGFnZSk7CisJCW1wID0gcmVhZF9tZXRhcGFnZShpcGJtYXAsIGxibGtubywgUFNJWkUsIDApOworCQlpZiAobXAgPT0gTlVMTCkgeworCQkJSVJFQURfVU5MT0NLKGlwYm1hcCk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlkcCA9IChzdHJ1Y3QgZG1hcCAqKSBtcC0+ZGF0YTsKKworCQkvKiBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBibG9ja3MgdG8gYmUgYWxsb2NhdGVkIGZyb20KKwkJICogdGhpcyBkbWFwLgorCQkgKi8KKwkJbmIgPSBtaW4ocmVtLCBCUEVSRE1BUCAtIChibGtubyAmIChCUEVSRE1BUCAtIDEpKSk7CisKKwkJREJGUkVFQ0soYm1wLT5kYl9EQm1hcCwgYm1wLT5kYl9tYXBzaXplLCBibGtubywgbmIpOworCisJCS8qIGFsbG9jYXRlIHRoZSBibG9ja3MuICovCisJCWlmICgocmMgPSBkYkFsbG9jRG1hcEJVKGJtcCwgZHAsIGJsa25vLCBuYikpKSB7CisJCQlyZWxlYXNlX21ldGFwYWdlKG1wKTsKKwkJCUlSRUFEX1VOTE9DSyhpcGJtYXApOworCQkJcmV0dXJuIChyYyk7CisJCX0KKworCQlEQkFMTE9DKGJtcC0+ZGJfREJtYXAsIGJtcC0+ZGJfbWFwc2l6ZSwgYmxrbm8sIG5iKTsKKwl9CisKKwkvKiB3cml0ZSB0aGUgbGFzdCBidWZmZXIuICovCisJd3JpdGVfbWV0YXBhZ2UobXApOworCisJSVJFQURfVU5MT0NLKGlwYm1hcCk7CisKKwlyZXR1cm4gKDApOworfQorCisKK3N0YXRpYyBpbnQgZGJBbGxvY0RtYXBCVShzdHJ1Y3QgYm1hcCAqIGJtcCwgc3RydWN0IGRtYXAgKiBkcCwgczY0IGJsa25vLAorCQkJIGludCBuYmxvY2tzKQoreworCWludCByYzsKKwlpbnQgZGJpdG5vLCB3b3JkLCByZW1iaXRzLCBuYiwgbndvcmRzLCB3Yml0bm8sIGFnbm87CisJczggb2xkcm9vdCwgKmxlYWY7CisJc3RydWN0IGRtYXB0cmVlICp0cCA9IChzdHJ1Y3QgZG1hcHRyZWUgKikgJiBkcC0+dHJlZTsKKworCS8qIHNhdmUgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHJvb3QgKGkuZS4gbWF4aW11bSBmcmVlIHN0cmluZykKKwkgKiBvZiB0aGUgZG1hcCB0cmVlLgorCSAqLworCW9sZHJvb3QgPSB0cC0+c3RyZWVbUk9PVF07CisKKwkvKiBwaWNrIHVwIGEgcG9pbnRlciB0byB0aGUgbGVhdmVzIG9mIHRoZSBkbWFwIHRyZWUgKi8KKwlsZWFmID0gdHAtPnN0cmVlICsgTEVBRklORDsKKworCS8qIGRldGVybWluZSB0aGUgYml0IG51bWJlciBhbmQgd29yZCB3aXRoaW4gdGhlIGRtYXAgb2YgdGhlCisJICogc3RhcnRpbmcgYmxvY2suCisJICovCisJZGJpdG5vID0gYmxrbm8gJiAoQlBFUkRNQVAgLSAxKTsKKwl3b3JkID0gZGJpdG5vID4+IEwyREJXT1JEOworCisJLyogYmxvY2sgcmFuZ2UgYmV0dGVyIGJlIHdpdGhpbiB0aGUgZG1hcCAqLworCWFzc2VydChkYml0bm8gKyBuYmxvY2tzIDw9IEJQRVJETUFQKTsKKworCS8qIGFsbG9jYXRlIHRoZSBiaXRzIG9mIHRoZSBkbWFwJ3Mgd29yZHMgY29ycmVzcG9uZGluZyB0byB0aGUgYmxvY2sKKwkgKiByYW5nZS4gbm90IGFsbCBiaXRzIG9mIHRoZSBmaXJzdCBhbmQgbGFzdCB3b3JkcyBtYXkgYmUgY29udGFpbmVkCisJICogd2l0aGluIHRoZSBibG9jayByYW5nZS4gIGlmIHRoaXMgaXMgdGhlIGNhc2UsIHdlJ2xsIHdvcmsgYWdhaW5zdAorCSAqIHRob3NlIHdvcmRzIChpLmUuIHBhcnRpYWwgZmlyc3QgYW5kL29yIGxhc3QpIG9uIGFuIGluZGl2aWR1YWwgYmFzaXMKKwkgKiAoYSBzaW5nbGUgcGFzcyksIGFsbG9jYXRpbmcgdGhlIGJpdHMgb2YgaW50ZXJlc3QgYnkgaGFuZCBhbmQKKwkgKiB1cGRhdGluZyB0aGUgbGVhZiBjb3JyZXNwb25kaW5nIHRvIHRoZSBkbWFwIHdvcmQuIGEgc2luZ2xlIHBhc3MKKwkgKiB3aWxsIGJlIHVzZWQgZm9yIGFsbCBkbWFwIHdvcmRzIGZ1bGx5IGNvbnRhaW5lZCB3aXRoaW4gdGhlCisJICogc3BlY2lmaWVkIHJhbmdlLiAgd2l0aGluIHRoaXMgcGFzcywgdGhlIGJpdHMgb2YgYWxsIGZ1bGx5IGNvbnRhaW5lZAorCSAqIGRtYXAgd29yZHMgd2lsbCBiZSBtYXJrZWQgYXMgZnJlZSBpbiBhIHNpbmdsZSBzaG90IGFuZCB0aGUgbGVhdmVzCisJICogd2lsbCBiZSB1cGRhdGVkLiBhIHNpbmdsZSBsZWFmIG1heSBkZXNjcmliZSB0aGUgZnJlZSBzcGFjZSBvZgorCSAqIG11bHRpcGxlIGRtYXAgd29yZHMsIHNvIHdlIG1heSB1cGRhdGUgb25seSBhIHN1YnNldCBvZiB0aGUgYWN0dWFsCisJICogbGVhdmVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRtYXAgd29yZHMgb2YgdGhlIGJsb2NrIHJhbmdlLgorCSAqLworCWZvciAocmVtYml0cyA9IG5ibG9ja3M7IHJlbWJpdHMgPiAwOyByZW1iaXRzIC09IG5iLCBkYml0bm8gKz0gbmIpIHsKKwkJLyogZGV0ZXJtaW5lIHRoZSBiaXQgbnVtYmVyIHdpdGhpbiB0aGUgd29yZCBhbmQKKwkJICogdGhlIG51bWJlciBvZiBiaXRzIHdpdGhpbiB0aGUgd29yZC4KKwkJICovCisJCXdiaXRubyA9IGRiaXRubyAmIChEQldPUkQgLSAxKTsKKwkJbmIgPSBtaW4ocmVtYml0cywgREJXT1JEIC0gd2JpdG5vKTsKKworCQkvKiBjaGVjayBpZiBvbmx5IHBhcnQgb2YgYSB3b3JkIGlzIHRvIGJlIGFsbG9jYXRlZC4KKwkJICovCisJCWlmIChuYiA8IERCV09SRCkgeworCQkJLyogYWxsb2NhdGUgKHNldCB0byAxKSB0aGUgYXBwcm9wcmlhdGUgYml0cyB3aXRoaW4KKwkJCSAqIHRoaXMgZG1hcCB3b3JkLgorCQkJICovCisJCQlkcC0+d21hcFt3b3JkXSB8PSBjcHVfdG9fbGUzMihPTkVTIDw8IChEQldPUkQgLSBuYikKKwkJCQkJCSAgICAgID4+IHdiaXRubyk7CisKKwkJCXdvcmQrKzsKKwkJfSBlbHNlIHsKKwkJCS8qIG9uZSBvciBtb3JlIGRtYXAgd29yZHMgYXJlIGZ1bGx5IGNvbnRhaW5lZAorCQkJICogd2l0aGluIHRoZSBibG9jayByYW5nZS4gIGRldGVybWluZSBob3cgbWFueQorCQkJICogd29yZHMgYW5kIGFsbG9jYXRlIChzZXQgdG8gMSkgdGhlIGJpdHMgb2YgdGhlc2UKKwkJCSAqIHdvcmRzLgorCQkJICovCisJCQlud29yZHMgPSByZW1iaXRzID4+IEwyREJXT1JEOworCQkJbWVtc2V0KCZkcC0+d21hcFt3b3JkXSwgKGludCkgT05FUywgbndvcmRzICogNCk7CisKKwkJCS8qIGRldGVybWluZSBob3cgbWFueSBiaXRzICovCisJCQluYiA9IG53b3JkcyA8PCBMMkRCV09SRDsKKwkJCXdvcmQgKz0gbndvcmRzOworCQl9CisJfQorCisJLyogdXBkYXRlIHRoZSBmcmVlIGNvdW50IGZvciB0aGlzIGRtYXAgKi8KKwlkcC0+bmZyZWUgPSBjcHVfdG9fbGUzMihsZTMyX3RvX2NwdShkcC0+bmZyZWUpIC0gbmJsb2Nrcyk7CisKKwkvKiByZWNvbnN0cnVjdCBzdW1tYXJ5IHRyZWUgKi8KKwlkYkluaXREbWFwVHJlZShkcCk7CisKKwlCTUFQX0xPQ0soYm1wKTsKKworCS8qIGlmIHRoaXMgYWxsb2NhdGlvbiBncm91cCBpcyBjb21wbGV0ZWx5IGZyZWUsCisJICogdXBkYXRlIHRoZSBoaWdoZXN0IGFjdGl2ZSBhbGxvY2F0aW9uIGdyb3VwIG51bWJlciAKKwkgKiBpZiB0aGlzIGFsbG9jYXRpb24gZ3JvdXAgaXMgdGhlIG5ldyBtYXguCisJICovCisJYWdubyA9IGJsa25vID4+IGJtcC0+ZGJfYWdsMnNpemU7CisJaWYgKGFnbm8gPiBibXAtPmRiX21heGFnKQorCQlibXAtPmRiX21heGFnID0gYWdubzsKKworCS8qIHVwZGF0ZSB0aGUgZnJlZSBjb3VudCBmb3IgdGhlIGFsbG9jYXRpb24gZ3JvdXAgYW5kIG1hcCAqLworCWJtcC0+ZGJfYWdmcmVlW2Fnbm9dIC09IG5ibG9ja3M7CisJYm1wLT5kYl9uZnJlZSAtPSBuYmxvY2tzOworCisJQk1BUF9VTkxPQ0soYm1wKTsKKworCS8qIGlmIHRoZSByb290IGhhcyBub3QgY2hhbmdlZCwgZG9uZS4gKi8KKwlpZiAodHAtPnN0cmVlW1JPT1RdID09IG9sZHJvb3QpCisJCXJldHVybiAoMCk7CisKKwkvKiByb290IGNoYW5nZWQuIGJ1YmJsZSB0aGUgY2hhbmdlIHVwIHRvIHRoZSBkbWFwIGNvbnRyb2wgcGFnZXMuCisJICogaWYgdGhlIGFkanVzdG1lbnQgb2YgdGhlIHVwcGVyIGxldmVsIGNvbnRyb2wgcGFnZXMgZmFpbHMsCisJICogYmFja291dCB0aGUgYml0IGFsbG9jYXRpb24gKHRodXMgbWFraW5nIGV2ZXJ5dGhpbmcgY29uc2lzdGVudCkuCisJICovCisJaWYgKChyYyA9IGRiQWRqQ3RsKGJtcCwgYmxrbm8sIHRwLT5zdHJlZVtST09UXSwgMSwgMCkpKQorCQlkYkZyZWVCaXRzKGJtcCwgZHAsIGJsa25vLCBuYmxvY2tzKTsKKworCXJldHVybiAocmMpOworfQorCisKKy8qCisgKiBOQU1FOglkYkV4dGVuZEZTKCkKKyAqCisgKiBGVU5DVElPTjoJZXh0ZW5kIGJtYXAgZnJvbSBibGtubyBmb3IgbmJsb2NrczsKKyAqIAkJZGJFeHRlbmRGUygpIHVwZGF0ZXMgYm1hcCByZWFkeSBmb3IgZGJBbGxvY0JvdHRvbVVwKCk7CisgKgorICogTDIKKyAqICB8CisgKiAgIEwxLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tTDEKKyAqICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgIEwwLS0tLS0tLS0tTDAtLS0tLS0tLS1MMCAgICAgICAgICAgTDAtLS0tLS0tLS1MMC0tLS0tLS0tLUwwCisgKiAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKKyAqICAgICAgIGQwLC4uLixkbiAgZDAsLi4uLGRuICBkMCwuLi4sZG4gICAgZDAsLi4uLGRuICBkMCwuLi4sZG4gIGQwLC4sZG07CisgKiBMMkwxTDBkMCwuLi4sZG5MMGQwLC4uLixkbkwwZDAsLi4uLGRuTDFMMGQwLC4uLixkbkwwZDAsLi4uLGRuTDBkMCwuLmRtCisgKgorICogPC0tLW9sZC0tLT48LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLWV4dGVuZC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiAgIAorICovCitpbnQgZGJFeHRlbmRGUyhzdHJ1Y3QgaW5vZGUgKmlwYm1hcCwgczY0IGJsa25vLAlzNjQgbmJsb2NrcykKK3sKKwlzdHJ1Y3QgamZzX3NiX2luZm8gKnNiaSA9IEpGU19TQkkoaXBibWFwLT5pX3NiKTsKKwlpbnQgbmJwZXJwYWdlID0gc2JpLT5uYnBlcnBhZ2U7CisJaW50IGksIGkwID0gVFJVRSwgaiwgajAgPSBUUlVFLCBrLCBuOworCXM2NCBuZXdzaXplOworCXM2NCBwOworCXN0cnVjdCBtZXRhcGFnZSAqbXAsICpsMm1wLCAqbDFtcCA9IE5VTEwsICpsMG1wID0gTlVMTDsKKwlzdHJ1Y3QgZG1hcGN0bCAqbDJkY3AsICpsMWRjcCwgKmwwZGNwOworCXN0cnVjdCBkbWFwICpkcDsKKwlzOCAqbDBsZWFmLCAqbDFsZWFmLCAqbDJsZWFmOworCXN0cnVjdCBibWFwICpibXAgPSBzYmktPmJtYXA7CisJaW50IGFnbm8sIGwyYWdzaXplLCBvbGRsMmFnc2l6ZTsKKwlzNjQgYWdfcmVtOworCisJbmV3c2l6ZSA9IGJsa25vICsgbmJsb2NrczsKKworCWpmc19pbmZvKCJkYkV4dGVuZEZTOiBibGtubzolTGQgbmJsb2NrczolTGQgbmV3c2l6ZTolTGQiLAorCQkgKGxvbmcgbG9uZykgYmxrbm8sIChsb25nIGxvbmcpIG5ibG9ja3MsIChsb25nIGxvbmcpIG5ld3NpemUpOworCisJLyoKKwkgKiAgICAgIGluaXRpYWxpemUgYm1hcCBjb250cm9sIHBhZ2UuCisJICoKKwkgKiBhbGwgdGhlIGRhdGEgaW4gYm1hcCBjb250cm9sIHBhZ2Ugc2hvdWxkIGV4Y2x1ZGUKKwkgKiB0aGUgbWtmcyBoaWRkZW4gZG1hcCBwYWdlLgorCSAqLworCisJLyogdXBkYXRlIG1hcHNpemUgKi8KKwlibXAtPmRiX21hcHNpemUgPSBuZXdzaXplOworCWJtcC0+ZGJfbWF4bGV2ZWwgPSBCTUFQU1pUT0xFVihibXAtPmRiX21hcHNpemUpOworCisJLyogY29tcHV0ZSBuZXcgQUcgc2l6ZSAqLworCWwyYWdzaXplID0gZGJHZXRMMkFHU2l6ZShuZXdzaXplKTsKKwlvbGRsMmFnc2l6ZSA9IGJtcC0+ZGJfYWdsMnNpemU7CisKKwlibXAtPmRiX2FnbDJzaXplID0gbDJhZ3NpemU7CisJYm1wLT5kYl9hZ3NpemUgPSAxIDw8IGwyYWdzaXplOworCisJLyogY29tcHV0ZSBuZXcgbnVtYmVyIG9mIEFHICovCisJYWdubyA9IGJtcC0+ZGJfbnVtYWc7CisJYm1wLT5kYl9udW1hZyA9IG5ld3NpemUgPj4gbDJhZ3NpemU7CisJYm1wLT5kYl9udW1hZyArPSAoKHUzMikgbmV3c2l6ZSAlICh1MzIpIGJtcC0+ZGJfYWdzaXplKSA/IDEgOiAwOworCisJLyoKKwkgKiAgICAgIHJlY29uZmlndXJlIGRiX2FnZnJlZVtdIAorCSAqIGZyb20gb2xkIEFHIGNvbmZpZ3VyYXRpb24gdG8gbmV3IEFHIGNvbmZpZ3VyYXRpb247CisJICoKKwkgKiBjb2FsZXNjZSBjb250aWd1b3VzIGsgKG5ld0FHU2l6ZS9vbGRBR1NpemUpIEFHczsKKwkgKiBpLmUuLCAoQUdpLCAuLi4sIEFHaikgd2hlcmUgaSA9IGsqbiBhbmQgaiA9IGsqKG4rMSkgLSAxIHRvIEFHbjsKKwkgKiBub3RlOiBuZXcgQUcgc2l6ZSA9IG9sZCBBRyBzaXplICogKDIqKngpLgorCSAqLworCWlmIChsMmFnc2l6ZSA9PSBvbGRsMmFnc2l6ZSkKKwkJZ290byBleHRlbmQ7CisJayA9IDEgPDwgKGwyYWdzaXplIC0gb2xkbDJhZ3NpemUpOworCWFnX3JlbSA9IGJtcC0+ZGJfYWdmcmVlWzBdOwkvKiBzYXZlIGFnZnJlZVswXSAqLworCWZvciAoaSA9IDAsIG4gPSAwOyBpIDwgYWdubzsgbisrKSB7CisJCWJtcC0+ZGJfYWdmcmVlW25dID0gMDsJLyogaW5pdCBjb2xsZWN0aW9uIHBvaW50ICovCisKKwkJLyogY29hbGVzY2UgY290aWd1b3VzIGsgQUdzOyAqLworCQlmb3IgKGogPSAwOyBqIDwgayAmJiBpIDwgYWdubzsgaisrLCBpKyspIHsKKwkJCS8qIG1lcmdlIEFHaSB0byBBR24gKi8KKwkJCWJtcC0+ZGJfYWdmcmVlW25dICs9IGJtcC0+ZGJfYWdmcmVlW2ldOworCQl9CisJfQorCWJtcC0+ZGJfYWdmcmVlWzBdICs9IGFnX3JlbTsJLyogcmVzdG9yZSBhZ2ZyZWVbMF0gKi8KKworCWZvciAoOyBuIDwgTUFYQUc7IG4rKykKKwkJYm1wLT5kYl9hZ2ZyZWVbbl0gPSAwOworCisJLyoKKwkgKiB1cGRhdGUgaGlnaGVzdCBhY3RpdmUgYWcgbnVtYmVyCisJICovCisKKwlibXAtPmRiX21heGFnID0gYm1wLT5kYl9tYXhhZyAvIGs7CisKKwkvKgorCSAqICAgICAgZXh0ZW5kIGJtYXAKKwkgKgorCSAqIHVwZGF0ZSBiaXQgbWFwcyBhbmQgY29ycmVzcG9uZGluZyBsZXZlbCBjb250cm9sIHBhZ2VzOworCSAqIGdsb2JhbCBjb250cm9sIHBhZ2UgZGJfbmZyZWUsIGRiX2FnZnJlZVthZ25vXSwgZGJfbWF4ZnJlZWJ1ZDsKKwkgKi8KKyAgICAgIGV4dGVuZDoKKwkvKiBnZXQgTDIgcGFnZSAqLworCXAgPSBCTUFQQkxLTk8gKyBuYnBlcnBhZ2U7CS8qIEwyIHBhZ2UgKi8KKwlsMm1wID0gcmVhZF9tZXRhcGFnZShpcGJtYXAsIHAsIFBTSVpFLCAwKTsKKwlpZiAoIWwybXApIHsKKwkJamZzX2Vycm9yKGlwYm1hcC0+aV9zYiwgImRiRXh0ZW5kRlM6IEwyIHBhZ2UgY291bGQgbm90IGJlIHJlYWQiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWwyZGNwID0gKHN0cnVjdCBkbWFwY3RsICopIGwybXAtPmRhdGE7CisKKwkvKiBjb21wdXRlIHN0YXJ0IEwxICovCisJayA9IGJsa25vID4+IEwyTUFYTDFTSVpFOworCWwybGVhZiA9IGwyZGNwLT5zdHJlZSArIENUTExFQUZJTkQgKyBrOworCXAgPSBCTEtUT0wxKGJsa25vLCBzYmktPmwybmJwZXJwYWdlKTsJLyogTDEgcGFnZSAqLworCisJLyoKKwkgKiBleHRlbmQgZWFjaCBMMSBpbiBMMgorCSAqLworCWZvciAoOyBrIDwgTFBFUkNUTDsgaysrLCBwICs9IG5icGVycGFnZSkgeworCQkvKiBnZXQgTDEgcGFnZSAqLworCQlpZiAoajApIHsKKwkJCS8qIHJlYWQgaW4gTDEgcGFnZTogKGJsa25vICYgKE1BWEwxU0laRSAtIDEpKSAqLworCQkJbDFtcCA9IHJlYWRfbWV0YXBhZ2UoaXBibWFwLCBwLCBQU0laRSwgMCk7CisJCQlpZiAobDFtcCA9PSBOVUxMKQorCQkJCWdvdG8gZXJyb3V0OworCQkJbDFkY3AgPSAoc3RydWN0IGRtYXBjdGwgKikgbDFtcC0+ZGF0YTsKKworCQkJLyogY29tcHV0ZSBzdGFydCBMMCAqLworCQkJaiA9IChibGtubyAmIChNQVhMMVNJWkUgLSAxKSkgPj4gTDJNQVhMMFNJWkU7CisJCQlsMWxlYWYgPSBsMWRjcC0+c3RyZWUgKyBDVExMRUFGSU5EICsgajsKKwkJCXAgPSBCTEtUT0wwKGJsa25vLCBzYmktPmwybmJwZXJwYWdlKTsKKwkJCWowID0gRkFMU0U7CisJCX0gZWxzZSB7CisJCQkvKiBhc3NpZ24vaW5pdCBMMSBwYWdlICovCisJCQlsMW1wID0gZ2V0X21ldGFwYWdlKGlwYm1hcCwgcCwgUFNJWkUsIDApOworCQkJaWYgKGwxbXAgPT0gTlVMTCkKKwkJCQlnb3RvIGVycm91dDsKKworCQkJbDFkY3AgPSAoc3RydWN0IGRtYXBjdGwgKikgbDFtcC0+ZGF0YTsKKworCQkJLyogY29tcHV0ZSBzdGFydCBMMCAqLworCQkJaiA9IDA7CisJCQlsMWxlYWYgPSBsMWRjcC0+c3RyZWUgKyBDVExMRUFGSU5EOworCQkJcCArPSBuYnBlcnBhZ2U7CS8qIDFzdCBMMCBvZiBMMS5rICAqLworCQl9CisKKwkJLyoKKwkJICogZXh0ZW5kIGVhY2ggTDAgaW4gTDEKKwkJICovCisJCWZvciAoOyBqIDwgTFBFUkNUTDsgaisrKSB7CisJCQkvKiBnZXQgTDAgcGFnZSAqLworCQkJaWYgKGkwKSB7CisJCQkJLyogcmVhZCBpbiBMMCBwYWdlOiAoYmxrbm8gJiAoTUFYTDBTSVpFIC0gMSkpICovCisKKwkJCQlsMG1wID0gcmVhZF9tZXRhcGFnZShpcGJtYXAsIHAsIFBTSVpFLCAwKTsKKwkJCQlpZiAobDBtcCA9PSBOVUxMKQorCQkJCQlnb3RvIGVycm91dDsKKwkJCQlsMGRjcCA9IChzdHJ1Y3QgZG1hcGN0bCAqKSBsMG1wLT5kYXRhOworCisJCQkJLyogY29tcHV0ZSBzdGFydCBkbWFwICovCisJCQkJaSA9IChibGtubyAmIChNQVhMMFNJWkUgLSAxKSkgPj4KKwkJCQkgICAgTDJCUEVSRE1BUDsKKwkJCQlsMGxlYWYgPSBsMGRjcC0+c3RyZWUgKyBDVExMRUFGSU5EICsgaTsKKwkJCQlwID0gQkxLVE9ETUFQKGJsa25vLAorCQkJCQkgICAgICBzYmktPmwybmJwZXJwYWdlKTsKKwkJCQlpMCA9IEZBTFNFOworCQkJfSBlbHNlIHsKKwkJCQkvKiBhc3NpZ24vaW5pdCBMMCBwYWdlICovCisJCQkJbDBtcCA9IGdldF9tZXRhcGFnZShpcGJtYXAsIHAsIFBTSVpFLCAwKTsKKwkJCQlpZiAobDBtcCA9PSBOVUxMKQorCQkJCQlnb3RvIGVycm91dDsKKworCQkJCWwwZGNwID0gKHN0cnVjdCBkbWFwY3RsICopIGwwbXAtPmRhdGE7CisKKwkJCQkvKiBjb21wdXRlIHN0YXJ0IGRtYXAgKi8KKwkJCQlpID0gMDsKKwkJCQlsMGxlYWYgPSBsMGRjcC0+c3RyZWUgKyBDVExMRUFGSU5EOworCQkJCXAgKz0gbmJwZXJwYWdlOwkvKiAxc3QgZG1hcCBvZiBMMC5qICovCisJCQl9CisKKwkJCS8qCisJCQkgKiBleHRlbmQgZWFjaCBkbWFwIGluIEwwCisJCQkgKi8KKwkJCWZvciAoOyBpIDwgTFBFUkNUTDsgaSsrKSB7CisJCQkJLyoKKwkJCQkgKiByZWNvbnN0cnVjdCB0aGUgZG1hcCBwYWdlLCBhbmQKKwkJCQkgKiBpbml0aWFsaXplIGNvcnJlc3BvbmRpbmcgcGFyZW50IEwwIGxlYWYKKwkJCQkgKi8KKwkJCQlpZiAoKG4gPSBibGtubyAmIChCUEVSRE1BUCAtIDEpKSkgeworCQkJCQkvKiByZWFkIGluIGRtYXAgcGFnZTogKi8KKwkJCQkJbXAgPSByZWFkX21ldGFwYWdlKGlwYm1hcCwgcCwKKwkJCQkJCQkgICBQU0laRSwgMCk7CisJCQkJCWlmIChtcCA9PSBOVUxMKQorCQkJCQkJZ290byBlcnJvdXQ7CisJCQkJCW4gPSBtaW4obmJsb2NrcywgKHM2NClCUEVSRE1BUCAtIG4pOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIGFzc2lnbi9pbml0IGRtYXAgcGFnZSAqLworCQkJCQltcCA9IHJlYWRfbWV0YXBhZ2UoaXBibWFwLCBwLAorCQkJCQkJCSAgIFBTSVpFLCAwKTsKKwkJCQkJaWYgKG1wID09IE5VTEwpCisJCQkJCQlnb3RvIGVycm91dDsKKworCQkJCQluID0gbWluKG5ibG9ja3MsIChzNjQpQlBFUkRNQVApOworCQkJCX0KKworCQkJCWRwID0gKHN0cnVjdCBkbWFwICopIG1wLT5kYXRhOworCQkJCSpsMGxlYWYgPSBkYkluaXREbWFwKGRwLCBibGtubywgbik7CisKKwkJCQlibXAtPmRiX25mcmVlICs9IG47CisJCQkJYWdubyA9IGxlNjRfdG9fY3B1KGRwLT5zdGFydCkgPj4gbDJhZ3NpemU7CisJCQkJYm1wLT5kYl9hZ2ZyZWVbYWdub10gKz0gbjsKKworCQkJCXdyaXRlX21ldGFwYWdlKG1wKTsKKworCQkJCWwwbGVhZisrOworCQkJCXAgKz0gbmJwZXJwYWdlOworCisJCQkJYmxrbm8gKz0gbjsKKwkJCQluYmxvY2tzIC09IG47CisJCQkJaWYgKG5ibG9ja3MgPT0gMCkKKwkJCQkJYnJlYWs7CisJCQl9CS8qIGZvciBlYWNoIGRtYXAgaW4gYSBMMCAqLworCisJCQkvKgorCQkJICogYnVpbGQgY3VycmVudCBMMCBwYWdlIGZyb20gaXRzIGxlYXZlcywgYW5kIAorCQkJICogaW5pdGlhbGl6ZSBjb3JyZXNwb25kaW5nIHBhcmVudCBMMSBsZWFmCisJCQkgKi8KKwkJCSpsMWxlYWYgPSBkYkluaXREbWFwQ3RsKGwwZGNwLCAwLCArK2kpOworCQkJd3JpdGVfbWV0YXBhZ2UobDBtcCk7CisJCQlsMG1wID0gTlVMTDsKKworCQkJaWYgKG5ibG9ja3MpCisJCQkJbDFsZWFmKys7CS8qIGNvbnRpbnVlIGZvciBuZXh0IEwwICovCisJCQllbHNlIHsKKwkJCQkvKiBtb3JlIHRoYW4gMSBMMCA/ICovCisJCQkJaWYgKGogPiAwKQorCQkJCQlicmVhazsJLyogYnVpbGQgTDEgcGFnZSAqLworCQkJCWVsc2UgeworCQkJCQkvKiBzdW1tYXJpemUgaW4gZ2xvYmFsIGJtYXAgcGFnZSAqLworCQkJCQlibXAtPmRiX21heGZyZWVidWQgPSAqbDFsZWFmOworCQkJCQlyZWxlYXNlX21ldGFwYWdlKGwxbXApOworCQkJCQlyZWxlYXNlX21ldGFwYWdlKGwybXApOworCQkJCQlnb3RvIGZpbmFsaXplOworCQkJCX0KKwkJCX0KKwkJfQkJLyogZm9yIGVhY2ggTDAgaW4gYSBMMSAqLworCisJCS8qCisJCSAqIGJ1aWxkIGN1cnJlbnQgTDEgcGFnZSBmcm9tIGl0cyBsZWF2ZXMsIGFuZCAKKwkJICogaW5pdGlhbGl6ZSBjb3JyZXNwb25kaW5nIHBhcmVudCBMMiBsZWFmCisJCSAqLworCQkqbDJsZWFmID0gZGJJbml0RG1hcEN0bChsMWRjcCwgMSwgKytqKTsKKwkJd3JpdGVfbWV0YXBhZ2UobDFtcCk7CisJCWwxbXAgPSBOVUxMOworCisJCWlmIChuYmxvY2tzKQorCQkJbDJsZWFmKys7CS8qIGNvbnRpbnVlIGZvciBuZXh0IEwxICovCisJCWVsc2UgeworCQkJLyogbW9yZSB0aGFuIDEgTDEgPyAqLworCQkJaWYgKGsgPiAwKQorCQkJCWJyZWFrOwkvKiBidWlsZCBMMiBwYWdlICovCisJCQllbHNlIHsKKwkJCQkvKiBzdW1tYXJpemUgaW4gZ2xvYmFsIGJtYXAgcGFnZSAqLworCQkJCWJtcC0+ZGJfbWF4ZnJlZWJ1ZCA9ICpsMmxlYWY7CisJCQkJcmVsZWFzZV9tZXRhcGFnZShsMm1wKTsKKwkJCQlnb3RvIGZpbmFsaXplOworCQkJfQorCQl9CisJfQkJCS8qIGZvciBlYWNoIEwxIGluIGEgTDIgKi8KKworCWpmc19lcnJvcihpcGJtYXAtPmlfc2IsCisJCSAgImRiRXh0ZW5kRlM6IGZ1bmN0aW9uIGhhcyBub3QgcmV0dXJuZWQgYXMgZXhwZWN0ZWQiKTsKK2Vycm91dDoKKwlpZiAobDBtcCkKKwkJcmVsZWFzZV9tZXRhcGFnZShsMG1wKTsKKwlpZiAobDFtcCkKKwkJcmVsZWFzZV9tZXRhcGFnZShsMW1wKTsKKwlyZWxlYXNlX21ldGFwYWdlKGwybXApOworCXJldHVybiAtRUlPOworCisJLyoKKwkgKiAgICAgIGZpbmFsaXplIGJtYXAgY29udHJvbCBwYWdlCisJICovCitmaW5hbGl6ZToKKworCXJldHVybiAwOworfQorCisKKy8qCisgKglkYkZpbmFsaXplQm1hcCgpCisgKi8KK3ZvaWQgZGJGaW5hbGl6ZUJtYXAoc3RydWN0IGlub2RlICppcGJtYXApCit7CisJc3RydWN0IGJtYXAgKmJtcCA9IEpGU19TQkkoaXBibWFwLT5pX3NiKS0+Ym1hcDsKKwlpbnQgYWN0YWdzLCBpbmFjdGFncywgbDJubDsKKwlzNjQgYWdfcmVtLCBhY3RmcmVlLCBpbmFjdGZyZWUsIGF2Z2ZyZWU7CisJaW50IGksIG47CisKKwkvKgorCSAqICAgICAgZmluYWxpemUgYm1hcCBjb250cm9sIHBhZ2UKKwkgKi8KKy8vZmluYWxpemU6CisJLyogCisJICogY29tcHV0ZSBkYl9hZ3ByZWY6IHByZWZlcnJlZCBhZyB0byBhbGxvY2F0ZSBmcm9tCisJICogKHRoZSBsZWZ0bW9zdCBhZyB3aXRoIGF2ZXJhZ2UgZnJlZSBzcGFjZSBpbiBpdCk7CisJICovCisvL2FncHJlZjoKKwkvKiBnZXQgdGhlIG51bWJlciBvZiBhY3RpdmUgYWdzIGFuZCBpbmFjaXR2ZSBhZ3MgKi8KKwlhY3RhZ3MgPSBibXAtPmRiX21heGFnICsgMTsKKwlpbmFjdGFncyA9IGJtcC0+ZGJfbnVtYWcgLSBhY3RhZ3M7CisJYWdfcmVtID0gYm1wLT5kYl9tYXBzaXplICYgKGJtcC0+ZGJfYWdzaXplIC0gMSk7CS8qID8/PyAqLworCisJLyogZGV0ZXJtaW5lIGhvdyBtYW55IGJsb2NrcyBhcmUgaW4gdGhlIGluYWN0aXZlIGFsbG9jYXRpb24KKwkgKiBncm91cHMuIGluIGRvaW5nIHRoaXMsIHdlIG11c3QgYWNjb3VudCBmb3IgdGhlIGZhY3QgdGhhdAorCSAqIHRoZSByaWdodG1vc3QgZ3JvdXAgbWlnaHQgYmUgYSBwYXJ0aWFsIGdyb3VwIChpLmUuIGZpbGUKKwkgKiBzeXN0ZW0gc2l6ZSBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUgZ3JvdXAgc2l6ZSkuCisJICovCisJaW5hY3RmcmVlID0gKGluYWN0YWdzICYmIGFnX3JlbSkgPworCSAgICAoKGluYWN0YWdzIC0gMSkgPDwgYm1wLT5kYl9hZ2wyc2l6ZSkgKyBhZ19yZW0KKwkgICAgOiBpbmFjdGFncyA8PCBibXAtPmRiX2FnbDJzaXplOworCisJLyogZGV0ZXJtaW5lIGhvdyBtYW55IGZyZWUgYmxvY2tzIGFyZSBpbiB0aGUgYWN0aXZlCisJICogYWxsb2NhdGlvbiBncm91cHMgcGx1cyB0aGUgYXZlcmFnZSBudW1iZXIgb2YgZnJlZSBibG9ja3MKKwkgKiB3aXRoaW4gdGhlIGFjdGl2ZSBhZ3MuCisJICovCisJYWN0ZnJlZSA9IGJtcC0+ZGJfbmZyZWUgLSBpbmFjdGZyZWU7CisJYXZnZnJlZSA9ICh1MzIpIGFjdGZyZWUgLyAodTMyKSBhY3RhZ3M7CisKKwkvKiBpZiB0aGUgcHJlZmVycmVkIGFsbG9jYXRpb24gZ3JvdXAgaGFzIG5vdCBhdmVyYWdlIGZyZWUgc3BhY2UuCisJICogcmUtZXN0YWJsaXNoIHRoZSBwcmVmZXJyZWQgZ3JvdXAgYXMgdGhlIGxlZnRtb3N0CisJICogZ3JvdXAgd2l0aCBhdmVyYWdlIGZyZWUgc3BhY2UuCisJICovCisJaWYgKGJtcC0+ZGJfYWdmcmVlW2JtcC0+ZGJfYWdwcmVmXSA8IGF2Z2ZyZWUpIHsKKwkJZm9yIChibXAtPmRiX2FncHJlZiA9IDA7IGJtcC0+ZGJfYWdwcmVmIDwgYWN0YWdzOworCQkgICAgIGJtcC0+ZGJfYWdwcmVmKyspIHsKKwkJCWlmIChibXAtPmRiX2FnZnJlZVtibXAtPmRiX2FncHJlZl0gPj0gYXZnZnJlZSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoYm1wLT5kYl9hZ3ByZWYgPj0gYm1wLT5kYl9udW1hZykgeworCQkJamZzX2Vycm9yKGlwYm1hcC0+aV9zYiwKKwkJCQkgICJjYW5ub3QgZmluZCBhZyB3aXRoIGF2ZXJhZ2UgZnJlZXNwYWNlIik7CisJCX0KKwl9CisKKwkvKgorCSAqIGNvbXB1dGUgZGJfYWdsZXZlbCwgZGJfYWdoZWlndGgsIGRiX3dpZHRoLCBkYl9hZ3N0YXJ0OgorCSAqIGFuIGFnIGlzIGNvdmVyZWQgaW4gYWdsZXZlbCBkbWFwY3RsIHN1bW1hcnkgdHJlZSwgCisJICogYXQgYWdoZWlnaHQgbGV2ZWwgaGVpZ2h0IChmcm9tIGxlYWYpIHdpdGggYWd3aWR0aCBudW1iZXIgb2Ygbm9kZXMgCisJICogZWFjaCwgd2hpY2ggc3RhcnRzIGF0IGFnc3RhcnQgaW5kZXggbm9kZSBvZiB0aGUgc21tYXJ5IHRyZWUgbm9kZSAKKwkgKiBhcnJheTsKKwkgKi8KKwlibXAtPmRiX2FnbGV2ZWwgPSBCTUFQU1pUT0xFVihibXAtPmRiX2Fnc2l6ZSk7CisJbDJubCA9CisJICAgIGJtcC0+ZGJfYWdsMnNpemUgLSAoTDJCUEVSRE1BUCArIGJtcC0+ZGJfYWdsZXZlbCAqIEwyTFBFUkNUTCk7CisJYm1wLT5kYl9hZ2hlaWd0aCA9IGwybmwgPj4gMTsKKwlibXAtPmRiX2Fnd2lkdGggPSAxIDw8IChsMm5sIC0gKGJtcC0+ZGJfYWdoZWlndGggPDwgMSkpOworCWZvciAoaSA9IDUgLSBibXAtPmRiX2FnaGVpZ3RoLCBibXAtPmRiX2Fnc3RhcnQgPSAwLCBuID0gMTsgaSA+IDA7CisJICAgICBpLS0pIHsKKwkJYm1wLT5kYl9hZ3N0YXJ0ICs9IG47CisJCW4gPDw9IDI7CisJfQorCit9CisKKworLyoKKyAqIE5BTUU6CWRiSW5pdERtYXAoKS91amZzX2lkbWFwX3BhZ2UoKQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogRlVOQ1RJT046CWluaXRpYWxpemUgd29ya2luZy9wZXJzaXN0ZW50IGJpdG1hcCBvZiB0aGUgZG1hcCBwYWdlCisgKgkJZm9yIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJsb2NrczoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqCQlhdCBlbnRyeSwgdGhlIGJpdG1hcHMgaGFkIGJlZW4gaW5pdGlhbGl6ZWQgYXMgZnJlZSAoWkVST1MpOworICoJCVRoZSBudW1iZXIgb2YgYmxvY2tzIHdpbGwgb25seSBhY2NvdW50IGZvciB0aGUgYWN0dWFsbHkgCisgKgkJZXhpc3RpbmcgYmxvY2tzLiBCbG9ja3Mgd2hpY2ggZG9uJ3QgYWN0dWFsbHkgZXhpc3QgaW4gCisgKgkJdGhlIGFnZ3JlZ2F0ZSB3aWxsIGJlIG1hcmtlZCBhcyBhbGxvY2F0ZWQgKE9ORVMpOworICoKKyAqIFBBUkFNRVRFUlM6CisgKglkcAktIHBvaW50ZXIgdG8gcGFnZSBvZiBtYXAKKyAqCW5ibG9ja3MJLSBudW1iZXIgb2YgYmxvY2tzIHRoaXMgcGFnZQorICoKKyAqIFJFVFVSTlM6IE5PTkUKKyAqLworc3RhdGljIGludCBkYkluaXREbWFwKHN0cnVjdCBkbWFwICogZHAsIHM2NCBCbGtubywgaW50IG5ibG9ja3MpCit7CisJaW50IGJsa25vLCB3LCBiLCByLCBudywgbmIsIGk7CisKKwkvKiBzdGFydGluZyBibG9jayBudW1iZXIgd2l0aGluIHRoZSBkbWFwICovCisJYmxrbm8gPSBCbGtubyAmIChCUEVSRE1BUCAtIDEpOworCisJaWYgKGJsa25vID09IDApIHsKKwkJZHAtPm5ibG9ja3MgPSBkcC0+bmZyZWUgPSBjcHVfdG9fbGUzMihuYmxvY2tzKTsKKwkJZHAtPnN0YXJ0ID0gY3B1X3RvX2xlNjQoQmxrbm8pOworCisJCWlmIChuYmxvY2tzID09IEJQRVJETUFQKSB7CisJCQltZW1zZXQoJmRwLT53bWFwWzBdLCAwLCBMUEVSRE1BUCAqIDQpOworCQkJbWVtc2V0KCZkcC0+cG1hcFswXSwgMCwgTFBFUkRNQVAgKiA0KTsKKwkJCWdvdG8gaW5pdFRyZWU7CisJCX0KKwl9IGVsc2UgeworCQlkcC0+bmJsb2NrcyA9CisJCSAgICBjcHVfdG9fbGUzMihsZTMyX3RvX2NwdShkcC0+bmJsb2NrcykgKyBuYmxvY2tzKTsKKwkJZHAtPm5mcmVlID0gY3B1X3RvX2xlMzIobGUzMl90b19jcHUoZHAtPm5mcmVlKSArIG5ibG9ja3MpOworCX0KKworCS8qIHdvcmQgbnVtYmVyIGNvbnRhaW5pbmcgc3RhcnQgYmxvY2sgbnVtYmVyICovCisJdyA9IGJsa25vID4+IEwyREJXT1JEOworCisJLyoKKwkgKiBmcmVlIHRoZSBiaXRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGJsb2NrIHJhbmdlIChaRVJPUyk6CisJICogbm90ZTogbm90IGFsbCBiaXRzIG9mIHRoZSBmaXJzdCBhbmQgbGFzdCB3b3JkcyBtYXkgYmUgY29udGFpbmVkIAorCSAqIHdpdGhpbiB0aGUgYmxvY2sgcmFuZ2UuCisJICovCisJZm9yIChyID0gbmJsb2NrczsgciA+IDA7IHIgLT0gbmIsIGJsa25vICs9IG5iKSB7CisJCS8qIG51bWJlciBvZiBiaXRzIHByZWNlZGluZyByYW5nZSB0byBiZSBmcmVlZCBpbiB0aGUgd29yZCAqLworCQliID0gYmxrbm8gJiAoREJXT1JEIC0gMSk7CisJCS8qIG51bWJlciBvZiBiaXRzIHRvIGZyZWUgaW4gdGhlIHdvcmQgKi8KKwkJbmIgPSBtaW4ociwgREJXT1JEIC0gYik7CisKKwkJLyogaXMgcGFydGlhbCB3b3JkIHRvIGJlIGZyZWVkID8gKi8KKwkJaWYgKG5iIDwgREJXT1JEKSB7CisJCQkvKiBmcmVlIChzZXQgdG8gMCkgZnJvbSB0aGUgYml0bWFwIHdvcmQgKi8KKwkJCWRwLT53bWFwW3ddICY9IGNwdV90b19sZTMyKH4oT05FUyA8PCAoREJXT1JEIC0gbmIpCisJCQkJCQkgICAgID4+IGIpKTsKKwkJCWRwLT5wbWFwW3ddICY9IGNwdV90b19sZTMyKH4oT05FUyA8PCAoREJXT1JEIC0gbmIpCisJCQkJCQkgICAgID4+IGIpKTsKKworCQkJLyogc2tpcCB0aGUgd29yZCBmcmVlZCAqLworCQkJdysrOworCQl9IGVsc2UgeworCQkJLyogZnJlZSAoc2V0IHRvIDApIGNvbnRpZ3VvdXMgYml0bWFwIHdvcmRzICovCisJCQludyA9IHIgPj4gTDJEQldPUkQ7CisJCQltZW1zZXQoJmRwLT53bWFwW3ddLCAwLCBudyAqIDQpOworCQkJbWVtc2V0KCZkcC0+cG1hcFt3XSwgMCwgbncgKiA0KTsKKworCQkJLyogc2tpcCB0aGUgd29yZHMgZnJlZWQgKi8KKwkJCW5iID0gbncgPDwgTDJEQldPUkQ7CisJCQl3ICs9IG53OworCQl9CisJfQorCisJLyoKKwkgKiBtYXJrIGJpdHMgZm9sbG93aW5nIHRoZSByYW5nZSB0byBiZSBmcmVlZCAobm9uLWV4aXN0aW5nIAorCSAqIGJsb2NrcykgYXMgYWxsb2NhdGVkIChPTkVTKQorCSAqLworCisJaWYgKGJsa25vID09IEJQRVJETUFQKQorCQlnb3RvIGluaXRUcmVlOworCisJLyogdGhlIGZpcnN0IHdvcmQgYmV5b25kIHRoZSBlbmQgb2YgZXhpc3RpbmcgYmxvY2tzICovCisJdyA9IGJsa25vID4+IEwyREJXT1JEOworCisJLyogZG9lcyBuYmxvY2tzIGZhbGwgb24gYSAzMi1iaXQgYm91bmRhcnkgPyAqLworCWIgPSBibGtubyAmIChEQldPUkQgLSAxKTsKKwlpZiAoYikgeworCQkvKiBtYXJrIGEgcGFydGlhbCB3b3JkIGFsbG9jYXRlZCAqLworCQlkcC0+d21hcFt3XSA9IGRwLT5wbWFwW3ddID0gY3B1X3RvX2xlMzIoT05FUyA+PiBiKTsKKwkJdysrOworCX0KKworCS8qIHNldCB0aGUgcmVzdCBvZiB0aGUgd29yZHMgaW4gdGhlIHBhZ2UgdG8gYWxsb2NhdGVkIChPTkVTKSAqLworCWZvciAoaSA9IHc7IGkgPCBMUEVSRE1BUDsgaSsrKQorCQlkcC0+cG1hcFtpXSA9IGRwLT53bWFwW2ldID0gY3B1X3RvX2xlMzIoT05FUyk7CisKKwkvKgorCSAqIGluaXQgdHJlZQorCSAqLworICAgICAgaW5pdFRyZWU6CisJcmV0dXJuIChkYkluaXREbWFwVHJlZShkcCkpOworfQorCisKKy8qCisgKiBOQU1FOglkYkluaXREbWFwVHJlZSgpL3VqZnNfY29tcGxldGVfZG1hcCgpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBGVU5DVElPTjoJaW5pdGlhbGl6ZSBzdW1tYXJ5IHRyZWUgb2YgdGhlIHNwZWNpZmllZCBkbWFwOgorICoKKyAqCQlhdCBlbnRyeSwgYml0bWFwIG9mIHRoZSBkbWFwIGhhcyBiZWVuIGluaXRpYWxpemVkOworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogUEFSQU1FVEVSUzoKKyAqCWRwCS0gZG1hcCB0byBjb21wbGV0ZQorICoJYmxrbm8JLSBzdGFydGluZyBibG9jayBudW1iZXIgZm9yIHRoaXMgZG1hcAorICoJdHJlZW1heAktIHdpbGwgYmUgZmlsbGVkIGluIHdpdGggbWF4IGZyZWUgZm9yIHRoaXMgZG1hcAorICoKKyAqIFJFVFVSTlM6CW1heCBmcmVlIHN0cmluZyBhdCB0aGUgcm9vdCBvZiB0aGUgdHJlZQorICovCitzdGF0aWMgaW50IGRiSW5pdERtYXBUcmVlKHN0cnVjdCBkbWFwICogZHApCit7CisJc3RydWN0IGRtYXB0cmVlICp0cDsKKwlzOCAqY3A7CisJaW50IGk7CisKKwkvKiBpbml0IGZpeGVkIGluZm8gb2YgdHJlZSAqLworCXRwID0gJmRwLT50cmVlOworCXRwLT5ubGVhZnMgPSBjcHVfdG9fbGUzMihMUEVSRE1BUCk7CisJdHAtPmwybmxlYWZzID0gY3B1X3RvX2xlMzIoTDJMUEVSRE1BUCk7CisJdHAtPmxlYWZpZHggPSBjcHVfdG9fbGUzMihMRUFGSU5EKTsKKwl0cC0+aGVpZ2h0ID0gY3B1X3RvX2xlMzIoNCk7CisJdHAtPmJ1ZG1pbiA9IEJVRE1JTjsKKworCS8qIGluaXQgZWFjaCBsZWFmIGZyb20gY29ycmVzcG9uZGluZyB3bWFwIHdvcmQ6CisJICogbm90ZTogbGVhZiBpcyBzZXQgdG8gTk9GUkVFKC0xKSBpZiBhbGwgYmxvY2tzIG9mIGNvcnJlc3BvbmRpbmcKKwkgKiBiaXRtYXAgd29yZCBhcmUgYWxsb2NhdGVkLiAKKwkgKi8KKwljcCA9IHRwLT5zdHJlZSArIGxlMzJfdG9fY3B1KHRwLT5sZWFmaWR4KTsKKwlmb3IgKGkgPSAwOyBpIDwgTFBFUkRNQVA7IGkrKykKKwkJKmNwKysgPSBkYk1heEJ1ZCgodTggKikgJiBkcC0+d21hcFtpXSk7CisKKwkvKiBidWlsZCB0aGUgZG1hcCdzIGJpbmFyeSBidWRkeSBzdW1tYXJ5IHRyZWUgKi8KKwlyZXR1cm4gKGRiSW5pdFRyZWUodHApKTsKK30KKworCisvKgorICogTkFNRToJZGJJbml0VHJlZSgpL3VqZnNfYWRqdHJlZSgpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBGVU5DVElPTjoJaW5pdGlhbGl6ZSBiaW5hcnkgYnVkZHkgc3VtbWFyeSB0cmVlIG9mIGEgZG1hcCBvciBkbWFwY3RsLgorICoKKyAqCQlhdCBlbnRyeSwgdGhlIGxlYXZlcyBvZiB0aGUgdHJlZSBoYXMgYmVlbiBpbml0aWFsaXplZCAKKyAqCQlmcm9tIGNvcnJlc3BvbmRpbmcgYml0bWFwIHdvcmQgb3Igcm9vdCBvZiBzdW1tYXJ5IHRyZWUKKyAqCQlvZiB0aGUgY2hpbGQgY29udHJvbCBwYWdlOworICoJCWNvbmZpZ3VyZSBiaW5hcnkgYnVkZHkgc3lzdGVtIGF0IHRoZSBsZWFmIGxldmVsLCB0aGVuCisgKgkJYnViYmxlIHVwIHRoZSB2YWx1ZXMgb2YgdGhlIGxlYWYgbm9kZXMgdXAgdGhlIHRyZWUuCisgKgorICogUEFSQU1FVEVSUzoKKyAqCWNwCS0gUG9pbnRlciB0byB0aGUgcm9vdCBvZiB0aGUgdHJlZQorICoJbDJsZWF2ZXMtIE51bWJlciBvZiBsZWFmIG5vZGVzIGFzIGEgcG93ZXIgb2YgMgorICoJbDJtaW4JLSBOdW1iZXIgb2YgYmxvY2tzIHRoYXQgY2FuIGJlIGNvdmVyZWQgYnkgYSBsZWFmCisgKgkJICBhcyBhIHBvd2VyIG9mIDIKKyAqCisgKiBSRVRVUk5TOiBtYXggZnJlZSBzdHJpbmcgYXQgdGhlIHJvb3Qgb2YgdGhlIHRyZWUKKyAqLworc3RhdGljIGludCBkYkluaXRUcmVlKHN0cnVjdCBkbWFwdHJlZSAqIGR0cCkKK3sKKwlpbnQgbDJtYXgsIGwyZnJlZSwgYnNpemUsIG5leHRiLCBpOworCWludCBjaGlsZCwgcGFyZW50LCBucGFyZW50OworCXM4ICp0cCwgKmNwLCAqY3AxOworCisJdHAgPSBkdHAtPnN0cmVlOworCisJLyogRGV0ZXJtaW5lIHRoZSBtYXhpbXVtIGZyZWUgc3RyaW5nIHBvc3NpYmxlIGZvciB0aGUgbGVhdmVzICovCisJbDJtYXggPSBsZTMyX3RvX2NwdShkdHAtPmwybmxlYWZzKSArIGR0cC0+YnVkbWluOworCisJLyoKKwkgKiBjb25maWd1cmUgdGhlIGxlYWYgbGV2ZXZsIGludG8gYmluYXJ5IGJ1ZGR5IHN5c3RlbQorCSAqCisJICogVHJ5IHRvIGNvbWJpbmUgYnVkZGllcyBzdGFydGluZyB3aXRoIGEgYnVkZHkgc2l6ZSBvZiAxIAorCSAqIChpLmUuIHR3byBsZWF2ZXMpLiBBdCBhIGJ1ZGR5IHNpemUgb2YgMSB0d28gYnVkZHkgbGVhdmVzIAorCSAqIGNhbiBiZSBjb21iaW5lZCBpZiBib3RoIGJ1ZGRpZXMgaGF2ZSBhIG1heGltdW0gZnJlZSBvZiBsMm1pbjsgCisJICogdGhlIGNvbWJpbmF0aW9uIHdpbGwgcmVzdWx0IGluIHRoZSBsZWZ0LW1vc3QgYnVkZHkgbGVhZiBoYXZpbmcgCisJICogYSBtYXhpbXVtIGZyZWUgb2YgbDJtaW4rMS4gIAorCSAqIEFmdGVyIHByb2Nlc3NpbmcgYWxsIGJ1ZGRpZXMgZm9yIGEgZ2l2ZW4gc2l6ZSwgcHJvY2VzcyBidWRkaWVzIAorCSAqIGF0IHRoZSBuZXh0IGhpZ2hlciBidWRkeSBzaXplIChpLmUuIGN1cnJlbnQgc2l6ZSAqIDIpIGFuZCAKKwkgKiB0aGUgbmV4dCBtYXhpbXVtIGZyZWUgKGN1cnJlbnQgZnJlZSArIDEpLiAgCisJICogVGhpcyBjb250aW51ZXMgdW50aWwgdGhlIG1heGltdW0gcG9zc2libGUgYnVkZHkgY29tYmluYXRpb24gCisJICogeWllbGRzIG1heGltdW0gZnJlZS4KKwkgKi8KKwlmb3IgKGwyZnJlZSA9IGR0cC0+YnVkbWluLCBic2l6ZSA9IDE7IGwyZnJlZSA8IGwybWF4OworCSAgICAgbDJmcmVlKyssIGJzaXplID0gbmV4dGIpIHsKKwkJLyogZ2V0IG5leHQgYnVkZHkgc2l6ZSA9PSBjdXJyZW50IGJ1ZGR5IHBhaXIgc2l6ZSAqLworCQluZXh0YiA9IGJzaXplIDw8IDE7CisKKwkJLyogc2NhbiBlYWNoIGFkamFjZW50IGJ1ZGR5IHBhaXIgYXQgY3VycmVudCBidWRkeSBzaXplICovCisJCWZvciAoaSA9IDAsIGNwID0gdHAgKyBsZTMyX3RvX2NwdShkdHAtPmxlYWZpZHgpOworCQkgICAgIGkgPCBsZTMyX3RvX2NwdShkdHAtPm5sZWFmcyk7CisJCSAgICAgaSArPSBuZXh0YiwgY3AgKz0gbmV4dGIpIHsKKwkJCS8qIGNvYWxlc2NlIGlmIGJvdGggYWRqYWNlbnQgYnVkZGllcyBhcmUgbWF4IGZyZWUgKi8KKwkJCWlmICgqY3AgPT0gbDJmcmVlICYmICooY3AgKyBic2l6ZSkgPT0gbDJmcmVlKSB7CisJCQkJKmNwID0gbDJmcmVlICsgMTsJLyogbGVmdCB0YWtlIHJpZ2h0ICovCisJCQkJKihjcCArIGJzaXplKSA9IC0xOwkvKiByaWdodCBnaXZlIGxlZnQgKi8KKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogYnViYmxlIHN1bW1hcnkgaW5mb3JtYXRpb24gb2YgbGVhdmVzIHVwIHRoZSB0cmVlLgorCSAqCisJICogU3RhcnRpbmcgYXQgdGhlIGxlYWYgbm9kZSBsZXZlbCwgdGhlIGZvdXIgbm9kZXMgZGVzY3JpYmVkIGJ5CisJICogdGhlIGhpZ2hlciBsZXZlbCBwYXJlbnQgbm9kZSBhcmUgY29tcGFyZWQgZm9yIGEgbWF4aW11bSBmcmVlIGFuZCAKKwkgKiB0aGlzIG1heGltdW0gYmVjb21lcyB0aGUgdmFsdWUgb2YgdGhlIHBhcmVudCBub2RlLiAgCisJICogd2hlbiBhbGwgbG93ZXIgbGV2ZWwgbm9kZXMgYXJlIHByb2Nlc3NlZCBpbiB0aGlzIGZhc2hpb24gdGhlbiAKKwkgKiBtb3ZlIHVwIHRvIHRoZSBuZXh0IGxldmVsIChwYXJlbnQgYmVjb21lcyBhIGxvd2VyIGxldmVsIG5vZGUpIGFuZCAKKwkgKiBjb250aW51ZSB0aGUgcHJvY2VzcyBmb3IgdGhhdCBsZXZlbC4KKwkgKi8KKwlmb3IgKGNoaWxkID0gbGUzMl90b19jcHUoZHRwLT5sZWFmaWR4KSwKKwkgICAgIG5wYXJlbnQgPSBsZTMyX3RvX2NwdShkdHAtPm5sZWFmcykgPj4gMjsKKwkgICAgIG5wYXJlbnQgPiAwOyBucGFyZW50ID4+PSAyLCBjaGlsZCA9IHBhcmVudCkgeworCQkvKiBnZXQgaW5kZXggb2YgMXN0IG5vZGUgb2YgcGFyZW50IGxldmVsICovCisJCXBhcmVudCA9IChjaGlsZCAtIDEpID4+IDI7CisKKwkJLyogc2V0IHRoZSB2YWx1ZSBvZiB0aGUgcGFyZW50IG5vZGUgYXMgdGhlIG1heGltdW0gCisJCSAqIG9mIHRoZSBmb3VyIG5vZGVzIG9mIHRoZSBjdXJyZW50IGxldmVsLgorCQkgKi8KKwkJZm9yIChpID0gMCwgY3AgPSB0cCArIGNoaWxkLCBjcDEgPSB0cCArIHBhcmVudDsKKwkJICAgICBpIDwgbnBhcmVudDsgaSsrLCBjcCArPSA0LCBjcDErKykKKwkJCSpjcDEgPSBUUkVFTUFYKGNwKTsKKwl9CisKKwlyZXR1cm4gKCp0cCk7Cit9CisKKworLyoKKyAqCWRiSW5pdERtYXBDdGwoKQorICoKKyAqIGZ1bmN0aW9uOiBpbml0aWFsaXplIGRtYXBjdGwgcGFnZQorICovCitzdGF0aWMgaW50IGRiSW5pdERtYXBDdGwoc3RydWN0IGRtYXBjdGwgKiBkY3AsIGludCBsZXZlbCwgaW50IGkpCit7CQkJCS8qIHN0YXJ0IGxlYWYgaW5kZXggbm90IGNvdmVyZWQgYnkgcmFuZ2UgKi8KKwlzOCAqY3A7CisKKwlkY3AtPm5sZWFmcyA9IGNwdV90b19sZTMyKExQRVJDVEwpOworCWRjcC0+bDJubGVhZnMgPSBjcHVfdG9fbGUzMihMMkxQRVJDVEwpOworCWRjcC0+bGVhZmlkeCA9IGNwdV90b19sZTMyKENUTExFQUZJTkQpOworCWRjcC0+aGVpZ2h0ID0gY3B1X3RvX2xlMzIoNSk7CisJZGNwLT5idWRtaW4gPSBMMkJQRVJETUFQICsgTDJMUEVSQ1RMICogbGV2ZWw7CisKKwkvKgorCSAqIGluaXRpYWxpemUgdGhlIGxlYXZlcyBvZiBjdXJyZW50IGxldmVsIHRoYXQgd2VyZSBub3QgY292ZXJlZCAKKwkgKiBieSB0aGUgc3BlY2lmaWVkIGlucHV0IGJsb2NrIHJhbmdlIChpLmUuIHRoZSBsZWF2ZXMgaGF2ZSBubyAKKwkgKiBsb3cgbGV2ZWwgZG1hcGN0bCBvciBkbWFwKS4KKwkgKi8KKwljcCA9ICZkY3AtPnN0cmVlW0NUTExFQUZJTkQgKyBpXTsKKwlmb3IgKDsgaSA8IExQRVJDVEw7IGkrKykKKwkJKmNwKysgPSBOT0ZSRUU7CisKKwkvKiBidWlsZCB0aGUgZG1hcCdzIGJpbmFyeSBidWRkeSBzdW1tYXJ5IHRyZWUgKi8KKwlyZXR1cm4gKGRiSW5pdFRyZWUoKHN0cnVjdCBkbWFwdHJlZSAqKSBkY3ApKTsKK30KKworCisvKgorICogTkFNRToJZGJHZXRMMkFHU2l6ZSgpL3VqZnNfZ2V0YWdsMnNpemUoKQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogRlVOQ1RJT046CURldGVybWluZSBsb2cyKGFsbG9jYXRpb24gZ3JvdXAgc2l6ZSkgZnJvbSBhZ2dyZWdhdGUgc2l6ZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogUEFSQU1FVEVSUzoKKyAqCW5ibG9ja3MJLSBOdW1iZXIgb2YgYmxvY2tzIGluIGFnZ3JlZ2F0ZQorICoKKyAqIFJFVFVSTlM6IGxvZzIoYWxsb2NhdGlvbiBncm91cCBzaXplKSBpbiBhZ2dyZWdhdGUgYmxvY2tzCisgKi8KK3N0YXRpYyBpbnQgZGJHZXRMMkFHU2l6ZShzNjQgbmJsb2NrcykKK3sKKwlzNjQgc3o7CisJczY0IG07CisJaW50IGwyc3o7CisKKwlpZiAobmJsb2NrcyA8IEJQRVJETUFQICogTUFYQUcpCisJCXJldHVybiAoTDJCUEVSRE1BUCk7CisKKwkvKiByb3VuZCB1cCBhZ2dyZWdhdGUgc2l6ZSB0byBwb3dlciBvZiAyICovCisJbSA9ICgodTY0KSAxIDw8ICg2NCAtIDEpKTsKKwlmb3IgKGwyc3ogPSA2NDsgbDJzeiA+PSAwOyBsMnN6LS0sIG0gPj49IDEpIHsKKwkJaWYgKG0gJiBuYmxvY2tzKQorCQkJYnJlYWs7CisJfQorCisJc3ogPSAoczY0KSAxIDw8IGwyc3o7CisJaWYgKHN6IDwgbmJsb2NrcykKKwkJbDJzeiArPSAxOworCisJLyogYWdzaXplID0gcm91bmR1cFNpemUvbWF4X251bWJlcl9vZl9hZyAqLworCXJldHVybiAobDJzeiAtIEwyTUFYQUcpOworfQorCisKKy8qCisgKiBOQU1FOglkYk1hcEZpbGVTaXplVG9NYXBTaXplKCkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEZVTkNUSU9OOgljb21wdXRlIG51bWJlciBvZiBibG9ja3MgdGhlIGJsb2NrIGFsbG9jYXRpb24gbWFwIGZpbGUgCisgKgkJY2FuIGNvdmVyIGZyb20gdGhlIG1hcCBmaWxlIHNpemU7CisgKgorICogUkVUVVJOUzoJTnVtYmVyIG9mIGJsb2NrcyB3aGljaCBjYW4gYmUgY292ZXJlZCBieSB0aGlzIGJsb2NrIG1hcCBmaWxlOworICovCisKKy8qCisgKiBtYXhpbXVtIG51bWJlciBvZiBtYXAgcGFnZXMgYXQgZWFjaCBsZXZlbCBpbmNsdWRpbmcgY29udHJvbCBwYWdlcworICovCisjZGVmaW5lIE1BWEwwUEFHRVMJKDEgKyBMUEVSQ1RMKQorI2RlZmluZSBNQVhMMVBBR0VTCSgxICsgTFBFUkNUTCAqIE1BWEwwUEFHRVMpCisjZGVmaW5lIE1BWEwyUEFHRVMJKDEgKyBMUEVSQ1RMICogTUFYTDFQQUdFUykKKworLyoKKyAqIGNvbnZlcnQgbnVtYmVyIG9mIG1hcCBwYWdlcyB0byB0aGUgemVybyBvcmlnaW4gdG9wIGRtYXBjdGwgbGV2ZWwKKyAqLworI2RlZmluZSBCTUFQUEdUT0xFVihucGFnZXMpCVwKKwkoKChucGFnZXMpIDw9IDMgKyBNQVhMMFBBR0VTKSA/IDAgXAorICAgICAgIDogKChucGFnZXMpIDw9IDIgKyBNQVhMMVBBR0VTKSA/IDEgOiAyKQorCitzNjQgZGJNYXBGaWxlU2l6ZVRvTWFwU2l6ZShzdHJ1Y3QgaW5vZGUgKiBpcGJtYXApCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlwYm1hcC0+aV9zYjsKKwlzNjQgbmJsb2NrczsKKwlzNjQgbnBhZ2VzLCBuZG1hcHM7CisJaW50IGxldmVsLCBpOworCWludCBjb21wbGV0ZSwgZmFjdG9yOworCisJbmJsb2NrcyA9IGlwYm1hcC0+aV9zaXplID4+IEpGU19TQkkoc2IpLT5sMmJzaXplOworCW5wYWdlcyA9IG5ibG9ja3MgPj4gSkZTX1NCSShzYiktPmwybmJwZXJwYWdlOworCWxldmVsID0gQk1BUFBHVE9MRVYobnBhZ2VzKTsKKworCS8qIEF0IGVhY2ggbGV2ZWwsIGFjY3VtdWxhdGUgdGhlIG51bWJlciBvZiBkbWFwIHBhZ2VzIGNvdmVyZWQgYnkgCisJICogdGhlIG51bWJlciBvZiBmdWxsIGNoaWxkIGxldmVscyBiZWxvdyBpdDsKKwkgKiByZXBlYXQgZm9yIHRoZSBsYXN0IGluY29tcGxldGUgY2hpbGQgbGV2ZWwuCisJICovCisJbmRtYXBzID0gMDsKKwlucGFnZXMtLTsJCS8qIHNraXAgdGhlIGZpcnN0IGdsb2JhbCBjb250cm9sIHBhZ2UgKi8KKwkvKiBza2lwIGhpZ2hlciBsZXZlbCBjb250cm9sIHBhZ2VzIGFib3ZlIHRvcCBsZXZlbCBjb3ZlcmVkIGJ5IG1hcCAqLworCW5wYWdlcyAtPSAoMiAtIGxldmVsKTsKKwlucGFnZXMtLTsJCS8qIHNraXAgdG9wIGxldmVsJ3MgY29udHJvbCBwYWdlICovCisJZm9yIChpID0gbGV2ZWw7IGkgPj0gMDsgaS0tKSB7CisJCWZhY3RvciA9CisJCSAgICAoaSA9PSAyKSA/IE1BWEwxUEFHRVMgOiAoKGkgPT0gMSkgPyBNQVhMMFBBR0VTIDogMSk7CisJCWNvbXBsZXRlID0gKHUzMikgbnBhZ2VzIC8gZmFjdG9yOworCQluZG1hcHMgKz0gY29tcGxldGUgKiAoKGkgPT0gMikgPyBMUEVSQ1RMICogTFBFUkNUTAorCQkJCSAgICAgIDogKChpID09IDEpID8gTFBFUkNUTCA6IDEpKTsKKworCQkvKiBwYWdlcyBpbiBsYXN0L2luY29tcGxldGUgY2hpbGQgKi8KKwkJbnBhZ2VzID0gKHUzMikgbnBhZ2VzICUgZmFjdG9yOworCQkvKiBza2lwIGluY29tcGxldGUgY2hpbGQncyBsZXZlbCBjb250cm9sIHBhZ2UgKi8KKwkJbnBhZ2VzLS07CisJfQorCisJLyogY29udmVydCB0aGUgbnVtYmVyIG9mIGRtYXBzIGludG8gdGhlIG51bWJlciBvZiBibG9ja3MgCisJICogd2hpY2ggY2FuIGJlIGNvdmVyZWQgYnkgdGhlIGRtYXBzOworCSAqLworCW5ibG9ja3MgPSBuZG1hcHMgPDwgTDJCUEVSRE1BUDsKKworCXJldHVybiAobmJsb2Nrcyk7Cit9CisKKworI2lmZGVmCV9KRlNfREVCVUdfRE1BUAorLyoKKyAqCURCaW5pdG1hcCgpCisgKi8KK3N0YXRpYyB2b2lkIERCaW5pdG1hcChzNjQgc2l6ZSwgc3RydWN0IGlub2RlICppcGJtYXAsIHUzMiAqKiByZXN1bHRzKQoreworCWludCBucGFnZXM7CisJdTMyICpkYm1hcCwgKmQ7CisJaW50IG47CisJczY0IGxibGtubywgY3VyX2Jsb2NrOworCXN0cnVjdCBkbWFwICpkcDsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCisJbnBhZ2VzID0gc2l6ZSAvIDMyNzY4OworCW5wYWdlcyArPSAoc2l6ZSAlIDMyNzY4KSA/IDEgOiAwOworCisJZGJtYXAgPSAodTMyICopIHhtYWxsb2MobnBhZ2VzICogNDA5NiwgTDJQU0laRSwga2VybmVsX2hlYXApOworCWlmIChkYm1hcCA9PSBOVUxMKQorCQlCVUcoKTsJLyogTm90IHJvYnVzdCBzaW5jZSB0aGlzIGlzIG9ubHkgdW51c2VkIGRlYnVnIGNvZGUgKi8KKworCWZvciAobiA9IDAsIGQgPSBkYm1hcDsgbiA8IG5wYWdlczsgbisrLCBkICs9IDEwMjQpCisJCWJ6ZXJvKGQsIDQwOTYpOworCisJLyogTmVlZCB0byBpbml0aWFsaXplIGZyb20gZGlzayBtYXAgcGFnZXMKKwkgKi8KKwlmb3IgKGQgPSBkYm1hcCwgY3VyX2Jsb2NrID0gMDsgY3VyX2Jsb2NrIDwgc2l6ZTsKKwkgICAgIGN1cl9ibG9jayArPSBCUEVSRE1BUCwgZCArPSBMUEVSRE1BUCkgeworCQlsYmxrbm8gPSBCTEtUT0RNQVAoY3VyX2Jsb2NrLAorCQkJCSAgIEpGU19TQkkoaXBibWFwLT5pX3NiKS0+Ym1hcC0+CisJCQkJICAgZGJfbDJuYnBlcnBhZ2UpOworCQltcCA9IHJlYWRfbWV0YXBhZ2UoaXBibWFwLCBsYmxrbm8sIFBTSVpFLCAwKTsKKwkJaWYgKG1wID09IE5VTEwpIHsKKwkJCWpmc19lcnJvcihpcGJtYXAtPmlfc2IsCisJCQkJICAiREJpbml0bWFwOiBjb3VsZCBub3QgcmVhZCBkaXNrIG1hcCBwYWdlIik7CisJCQljb250aW51ZTsKKwkJfQorCQlkcCA9IChzdHJ1Y3QgZG1hcCAqKSBtcC0+ZGF0YTsKKworCQlmb3IgKG4gPSAwOyBuIDwgTFBFUkRNQVA7IG4rKykKKwkJCWRbbl0gPSBsZTMyX3RvX2NwdShkcC0+d21hcFtuXSk7CisKKwkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisJfQorCisJKnJlc3VsdHMgPSBkYm1hcDsKK30KKworCisvKgorICoJREJBbGxvYygpCisgKi8KK3ZvaWQgREJBbGxvYyh1aW50ICogZGJtYXAsIHM2NCBtYXBzaXplLCBzNjQgYmxrbm8sIHM2NCBuYmxvY2tzKQoreworCWludCB3b3JkLCBuYiwgYml0bm87CisJdTMyIG1hc2s7CisKKwlhc3NlcnQoYmxrbm8gPiAwICYmIGJsa25vIDwgbWFwc2l6ZSk7CisJYXNzZXJ0KG5ibG9ja3MgPiAwICYmIG5ibG9ja3MgPD0gbWFwc2l6ZSk7CisKKwlhc3NlcnQoYmxrbm8gKyBuYmxvY2tzIDw9IG1hcHNpemUpOworCisJZGJtYXAgKz0gKGJsa25vIC8gMzIpOworCXdoaWxlIChuYmxvY2tzID4gMCkgeworCQliaXRubyA9IGJsa25vICYgKDMyIC0gMSk7CisJCW5iID0gbWluKG5ibG9ja3MsIDMyIC0gYml0bm8pOworCisJCW1hc2sgPSAoMHhmZmZmZmZmZiA8PCAoMzIgLSBuYikgPj4gYml0bm8pOworCQlhc3NlcnQoKG1hc2sgJiAqZGJtYXApID09IDApOworCQkqZGJtYXAgfD0gbWFzazsKKworCQlkYm1hcCsrOworCQlibGtubyArPSBuYjsKKwkJbmJsb2NrcyAtPSBuYjsKKwl9Cit9CisKKworLyoKKyAqCURCRnJlZSgpCisgKi8KK3N0YXRpYyB2b2lkIERCRnJlZSh1aW50ICogZGJtYXAsIHM2NCBtYXBzaXplLCBzNjQgYmxrbm8sIHM2NCBuYmxvY2tzKQoreworCWludCB3b3JkLCBuYiwgYml0bm87CisJdTMyIG1hc2s7CisKKwlhc3NlcnQoYmxrbm8gPiAwICYmIGJsa25vIDwgbWFwc2l6ZSk7CisJYXNzZXJ0KG5ibG9ja3MgPiAwICYmIG5ibG9ja3MgPD0gbWFwc2l6ZSk7CisKKwlhc3NlcnQoYmxrbm8gKyBuYmxvY2tzIDw9IG1hcHNpemUpOworCisJZGJtYXAgKz0gKGJsa25vIC8gMzIpOworCXdoaWxlIChuYmxvY2tzID4gMCkgeworCQliaXRubyA9IGJsa25vICYgKDMyIC0gMSk7CisJCW5iID0gbWluKG5ibG9ja3MsIDMyIC0gYml0bm8pOworCisJCW1hc2sgPSAoMHhmZmZmZmZmZiA8PCAoMzIgLSBuYikgPj4gYml0bm8pOworCQlhc3NlcnQoKG1hc2sgJiAqZGJtYXApID09IG1hc2spOworCQkqZGJtYXAgJj0gfm1hc2s7CisKKwkJZGJtYXArKzsKKwkJYmxrbm8gKz0gbmI7CisJCW5ibG9ja3MgLT0gbmI7CisJfQorfQorCisKKy8qCisgKglEQkFsbG9jQ0soKQorICovCitzdGF0aWMgdm9pZCBEQkFsbG9jQ0sodWludCAqIGRibWFwLCBzNjQgbWFwc2l6ZSwgczY0IGJsa25vLCBzNjQgbmJsb2NrcykKK3sKKwlpbnQgd29yZCwgbmIsIGJpdG5vOworCXUzMiBtYXNrOworCisJYXNzZXJ0KGJsa25vID4gMCAmJiBibGtubyA8IG1hcHNpemUpOworCWFzc2VydChuYmxvY2tzID4gMCAmJiBuYmxvY2tzIDw9IG1hcHNpemUpOworCisJYXNzZXJ0KGJsa25vICsgbmJsb2NrcyA8PSBtYXBzaXplKTsKKworCWRibWFwICs9IChibGtubyAvIDMyKTsKKwl3aGlsZSAobmJsb2NrcyA+IDApIHsKKwkJYml0bm8gPSBibGtubyAmICgzMiAtIDEpOworCQluYiA9IG1pbihuYmxvY2tzLCAzMiAtIGJpdG5vKTsKKworCQltYXNrID0gKDB4ZmZmZmZmZmYgPDwgKDMyIC0gbmIpID4+IGJpdG5vKTsKKwkJYXNzZXJ0KChtYXNrICYgKmRibWFwKSA9PSBtYXNrKTsKKworCQlkYm1hcCsrOworCQlibGtubyArPSBuYjsKKwkJbmJsb2NrcyAtPSBuYjsKKwl9Cit9CisKKworLyoKKyAqCURCRnJlZUNLKCkKKyAqLworc3RhdGljIHZvaWQgREJGcmVlQ0sodWludCAqIGRibWFwLCBzNjQgbWFwc2l6ZSwgczY0IGJsa25vLCBzNjQgbmJsb2NrcykKK3sKKwlpbnQgd29yZCwgbmIsIGJpdG5vOworCXUzMiBtYXNrOworCisJYXNzZXJ0KGJsa25vID4gMCAmJiBibGtubyA8IG1hcHNpemUpOworCWFzc2VydChuYmxvY2tzID4gMCAmJiBuYmxvY2tzIDw9IG1hcHNpemUpOworCisJYXNzZXJ0KGJsa25vICsgbmJsb2NrcyA8PSBtYXBzaXplKTsKKworCWRibWFwICs9IChibGtubyAvIDMyKTsKKwl3aGlsZSAobmJsb2NrcyA+IDApIHsKKwkJYml0bm8gPSBibGtubyAmICgzMiAtIDEpOworCQluYiA9IG1pbihuYmxvY2tzLCAzMiAtIGJpdG5vKTsKKworCQltYXNrID0gKDB4ZmZmZmZmZmYgPDwgKDMyIC0gbmIpID4+IGJpdG5vKTsKKwkJYXNzZXJ0KChtYXNrICYgKmRibWFwKSA9PSAwKTsKKworCQlkYm1hcCsrOworCQlibGtubyArPSBuYjsKKwkJbmJsb2NrcyAtPSBuYjsKKwl9Cit9CisKKworLyoKKyAqCWRiUHJ0TWFwKCkKKyAqLworc3RhdGljIHZvaWQgZGJQcnRNYXAoc3RydWN0IGJtYXAgKiBibXApCit7CisJcHJpbnRrKCIgICBtYXBzaXplOiAgICVkJWRcbiIsIGJtcC0+ZGJfbWFwc2l6ZSk7CisJcHJpbnRrKCIgICBuZnJlZTogICAgICVkJWRcbiIsIGJtcC0+ZGJfbmZyZWUpOworCXByaW50aygiICAgbnVtYWc6ICAgICAlZFxuIiwgYm1wLT5kYl9udW1hZyk7CisJcHJpbnRrKCIgICBhZ3NpemU6ICAgICVkJWRcbiIsIGJtcC0+ZGJfYWdzaXplKTsKKwlwcmludGsoIiAgIGFnbDJzaXplOiAgJWRcbiIsIGJtcC0+ZGJfYWdsMnNpemUpOworCXByaW50aygiICAgYWd3aWR0aDogICAlZFxuIiwgYm1wLT5kYl9hZ3dpZHRoKTsKKwlwcmludGsoIiAgIGFnc3RhcnQ6ICAgJWRcbiIsIGJtcC0+ZGJfYWdzdGFydCk7CisJcHJpbnRrKCIgICBhZ2hlaWd0aDogICVkXG4iLCBibXAtPmRiX2FnaGVpZ3RoKTsKKwlwcmludGsoIiAgIGFnbGV2ZWw6ICAgJWRcbiIsIGJtcC0+ZGJfYWdsZXZlbCk7CisJcHJpbnRrKCIgICBtYXhsZXZlbDogICVkXG4iLCBibXAtPmRiX21heGxldmVsKTsKKwlwcmludGsoIiAgIG1heGFnOiAgICAgJWRcbiIsIGJtcC0+ZGJfbWF4YWcpOworCXByaW50aygiICAgYWdwcmVmOiAgICAlZFxuIiwgYm1wLT5kYl9hZ3ByZWYpOworCXByaW50aygiICAgbDJuYnBwZzogICAlZFxuIiwgYm1wLT5kYl9sMm5icGVycGFnZSk7Cit9CisKKworLyoKKyAqCWRiUHJ0Q3RsKCkKKyAqLworc3RhdGljIHZvaWQgZGJQcnRDdGwoc3RydWN0IGRtYXBjdGwgKiBkY3ApCit7CisJaW50IGksIGosIG47CisKKwlwcmludGsoIiAgIGhlaWdodDogICAgJTA4eFxuIiwgbGUzMl90b19jcHUoZGNwLT5oZWlnaHQpKTsKKwlwcmludGsoIiAgIGxlYWZpZHg6ICAgJTA4eFxuIiwgbGUzMl90b19jcHUoZGNwLT5sZWFmaWR4KSk7CisJcHJpbnRrKCIgICBidWRtaW46ICAgICUwOHhcbiIsIGRjcC0+YnVkbWluKTsKKwlwcmludGsoIiAgIG5sZWFmczogICAgJTA4eFxuIiwgbGUzMl90b19jcHUoZGNwLT5ubGVhZnMpKTsKKwlwcmludGsoIiAgIGwybmxlYWZzOiAgJTA4eFxuIiwgbGUzMl90b19jcHUoZGNwLT5sMm5sZWFmcykpOworCisJcHJpbnRrKCJcbiBUcmVlOlxuIik7CisJZm9yIChpID0gMDsgaSA8IENUTExFQUZJTkQ7IGkgKz0gOCkgeworCQluID0gbWluKDgsIENUTExFQUZJTkQgLSBpKTsKKworCQlmb3IgKGogPSAwOyBqIDwgbjsgaisrKQorCQkJcHJpbnRmKCIgIFslMDN4XTogJTAyeCIsIGkgKyBqLAorCQkJICAgICAgIChjaGFyKSBkY3AtPnN0cmVlW2kgKyBqXSk7CisJCXByaW50ZigiXG4iKTsKKwl9CisKKwlwcmludGsoIlxuIFRyZWUgTGVhdmVzOlxuIik7CisJZm9yIChpID0gMDsgaSA8IExQRVJDVEw7IGkgKz0gOCkgeworCQluID0gbWluKDgsIExQRVJDVEwgLSBpKTsKKworCQlmb3IgKGogPSAwOyBqIDwgbjsgaisrKQorCQkJcHJpbnRmKCIgIFslMDN4XTogJTAyeCIsCisJCQkgICAgICAgaSArIGosCisJCQkgICAgICAgKGNoYXIpIGRjcC0+c3RyZWVbaSArIGogKyBDVExMRUFGSU5EXSk7CisJCXByaW50ZigiXG4iKTsKKwl9Cit9CisjZW5kaWYJCQkJLyogX0pGU19ERUJVR19ETUFQICovCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX2RtYXAuaCBiL2ZzL2pmcy9qZnNfZG1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZTI1ODgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZnMvamZzX2RtYXAuaApAQCAtMCwwICsxLDMxNCBAQAorLyoKKyAqICAgQ29weXJpZ2h0IChjKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuLCAyMDAwLTIwMDIKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2lmbmRlZglfSF9KRlNfRE1BUAorI2RlZmluZSBfSF9KRlNfRE1BUAorCisjaW5jbHVkZSAiamZzX3R4bm1nci5oIgorCisjZGVmaW5lIEJNQVBWRVJTSU9OCTEJLyogdmVyc2lvbiBudW1iZXIgKi8KKyNkZWZpbmUJVFJFRVNJWkUJKDI1Nis2NCsxNis0KzEpCS8qIHNpemUgb2YgYSBkbWFwIHRyZWUgKi8KKyNkZWZpbmUJTEVBRklORAkJKDY0KzE2KzQrMSkJLyogaW5kZXggb2YgMXN0IGxlYWYgb2YgYSBkbWFwIHRyZWUgKi8KKyNkZWZpbmUgTFBFUkRNQVAJMjU2CS8qIG51bSBsZWF2ZXMgcGVyIGRtYXAgdHJlZSAqLworI2RlZmluZSBMMkxQRVJETUFQCTgJLyogbDIgbnVtYmVyIG9mIGxlYXZlcyBwZXIgZG1hcCB0cmVlICovCisjZGVmaW5lCURCV09SRAkJMzIJLyogIyBvZiBibGtzIGNvdmVyZWQgYnkgYSBtYXAgd29yZCAqLworI2RlZmluZQlMMkRCV09SRAk1CS8qIGwyICMgb2YgYmxrcyBjb3ZlcmVkIGJ5IGEgbXdvcmQgKi8KKyNkZWZpbmUgQlVETUlOICAJTDJEQldPUkQJLyogbWF4IGZyZWUgc3RyaW5nIGluIGEgbWFwIHdvcmQgKi8KKyNkZWZpbmUgQlBFUkRNQVAJKExQRVJETUFQICogREJXT1JEKQkvKiBudW0gb2YgYmxrcyBwZXIgZG1hcCAqLworI2RlZmluZSBMMkJQRVJETUFQCTEzCS8qIGwyIG51bSBvZiBibGtzIHBlciBkbWFwICovCisjZGVmaW5lIENUTFRSRUVTSVpFCSgxMDI0KzI1Nis2NCsxNis0KzEpCS8qIHNpemUgb2YgYSBkbWFwY3RsIHRyZWUgKi8KKyNkZWZpbmUgQ1RMTEVBRklORAkoMjU2KzY0KzE2KzQrMSkJLyogaWR4IG9mIDFzdCBsZWFmIG9mIGEgZG1hcGN0bCB0cmVlICovCisjZGVmaW5lIExQRVJDVEwJCTEwMjQJLyogbnVtIG9mIGxlYXZlcyBwZXIgZG1hcGN0bCB0cmVlICovCisjZGVmaW5lIEwyTFBFUkNUTAkxMAkvKiBsMiBudW0gb2YgbGVhdmVzIHBlciBkbWFwY3RsIHRyZWUgKi8KKyNkZWZpbmUJUk9PVAkJMAkvKiBpbmRleCBvZiB0aGUgcm9vdCBvZiBhIHRyZWUgKi8KKyNkZWZpbmUJTk9GUkVFCQkoKHM4KSAtMSkJLyogbm8gYmxvY2tzIGZyZWUgKi8KKyNkZWZpbmUJTUFYQUcJCTEyOAkvKiBtYXggbnVtYmVyIG9mIGFsbG9jYXRpb24gZ3JvdXBzICovCisjZGVmaW5lIEwyTUFYQUcJCTcJLyogbDIgbWF4IG51bSBvZiBBRyAqLworI2RlZmluZSBMMk1JTkFHU1oJMjUJLyogbDIgb2YgbWluaW11bSBBRyBzaXplIGluIGJ5dGVzICovCisjZGVmaW5lCUJNQVBCTEtOTwkwCS8qIGxibGtubyBvZiBibWFwIHdpdGhpbiB0aGUgbWFwICovCisKKy8qCisgKiBtYXhpbXVtIGwyIG51bWJlciBvZiBkaXNrIGJsb2NrcyBhdCB0aGUgdmFyaW91cyBkbWFwY3RsIGxldmVscy4KKyAqLworI2RlZmluZQlMMk1BWEwwU0laRQkoTDJCUEVSRE1BUCArIDEgKiBMMkxQRVJDVEwpCisjZGVmaW5lCUwyTUFYTDFTSVpFCShMMkJQRVJETUFQICsgMiAqIEwyTFBFUkNUTCkKKyNkZWZpbmUJTDJNQVhMMlNJWkUJKEwyQlBFUkRNQVAgKyAzICogTDJMUEVSQ1RMKQorCisvKgorICogbWF4aW11bSBudW1iZXIgb2YgZGlzayBibG9ja3MgYXQgdGhlIHZhcmlvdXMgZG1hcGN0bCBsZXZlbHMuCisgKi8KKyNkZWZpbmUJTUFYTDBTSVpFCSgoczY0KTEgPDwgTDJNQVhMMFNJWkUpCisjZGVmaW5lCU1BWEwxU0laRQkoKHM2NCkxIDw8IEwyTUFYTDFTSVpFKQorI2RlZmluZQlNQVhMMlNJWkUJKChzNjQpMSA8PCBMMk1BWEwyU0laRSkKKworI2RlZmluZQlNQVhNQVBTSVpFCU1BWEwyU0laRQkvKiBtYXhpbXVtIGFnZ3JlZ2F0ZSBtYXAgc2l6ZSAqLworCisvKiAKKyAqIGRldGVybWluZSB0aGUgbWF4aW11bSBmcmVlIHN0cmluZyBmb3IgZm91ciAobG93ZXIgbGV2ZWwpIG5vZGVzCisgKiBvZiB0aGUgdHJlZS4KKyAqLworc3RhdGljIF9faW5saW5lIHNpZ25lZCBjaGFyIFRSRUVNQVgoc2lnbmVkIGNoYXIgKmNwKQoreworCXNpZ25lZCBjaGFyIHRtcDEsIHRtcDI7CisKKwl0bXAxID0gbWF4KCooY3ArMiksICooY3ArMykpOworCXRtcDIgPSBtYXgoKihjcCksICooY3ArMSkpOworCisJcmV0dXJuIG1heCh0bXAxLCB0bXAyKTsKK30KKworLyoKKyAqIGNvbnZlcnQgZGlzayBibG9jayBudW1iZXIgdG8gdGhlIGxvZ2ljYWwgYmxvY2sgbnVtYmVyIG9mIHRoZSBkbWFwCisgKiBkZXNjcmliaW5nIHRoZSBkaXNrIGJsb2NrLiAgcyBpcyB0aGUgbG9nMihudW1iZXIgb2YgbG9naWNhbCBibG9ja3MgcGVyIHBhZ2UpCisgKgorICogVGhlIGNhbGN1bGF0aW9uIGZpZ3VyZXMgb3V0IGhvdyBtYW55IGxvZ2ljYWwgcGFnZXMgYXJlIGluIGZyb250IG9mIHRoZSBkbWFwLgorICoJLSB0aGUgbnVtYmVyIG9mIGRtYXBzIHByZWNlZGluZyBpdAorICoJLSB0aGUgbnVtYmVyIG9mIEwwIHBhZ2VzIHByZWNlZGluZyBpdHMgTDAgcGFnZQorICoJLSB0aGUgbnVtYmVyIG9mIEwxIHBhZ2VzIHByZWNlZGluZyBpdHMgTDEgcGFnZQorICoJLSAzIGlzIGFkZGVkIHRvIGFjY291bnQgZm9yIHRoZSBMMiwgTDEsIGFuZCBMMCBwYWdlIGZvciB0aGlzIGRtYXAKKyAqCS0gMSBpcyBhZGRlZCB0byBhY2NvdW50IGZvciB0aGUgY29udHJvbCBwYWdlIG9mIHRoZSBtYXAuCisgKi8KKyNkZWZpbmUgQkxLVE9ETUFQKGIscykgICAgXAorICAgICAgICAoKCgoYikgPj4gMTMpICsgKChiKSA+PiAyMykgKyAoKGIpID4+IDMzKSArIDMgKyAxKSA8PCAocykpCisKKy8qCisgKiBjb252ZXJ0IGRpc2sgYmxvY2sgbnVtYmVyIHRvIHRoZSBsb2dpY2FsIGJsb2NrIG51bWJlciBvZiB0aGUgTEVWRUwgMAorICogZG1hcGN0bCBkZXNjcmliaW5nIHRoZSBkaXNrIGJsb2NrLiAgcyBpcyB0aGUgbG9nMihudW1iZXIgb2YgbG9naWNhbCBibG9ja3MKKyAqIHBlciBwYWdlKQorICoKKyAqIFRoZSBjYWxjdWxhdGlvbiBmaWd1cmVzIG91dCBob3cgbWFueSBsb2dpY2FsIHBhZ2VzIGFyZSBpbiBmcm9udCBvZiB0aGUgTDAuCisgKgktIHRoZSBudW1iZXIgb2YgZG1hcCBwYWdlcyBwcmVjZWRpbmcgaXQKKyAqCS0gdGhlIG51bWJlciBvZiBMMCBwYWdlcyBwcmVjZWRpbmcgaXQKKyAqCS0gdGhlIG51bWJlciBvZiBMMSBwYWdlcyBwcmVjZWRpbmcgaXRzIEwxIHBhZ2UKKyAqCS0gMiBpcyBhZGRlZCB0byBhY2NvdW50IGZvciB0aGUgTDIsIGFuZCBMMSBwYWdlIGZvciB0aGlzIEwwCisgKgktIDEgaXMgYWRkZWQgdG8gYWNjb3VudCBmb3IgdGhlIGNvbnRyb2wgcGFnZSBvZiB0aGUgbWFwLgorICovCisjZGVmaW5lIEJMS1RPTDAoYixzKSAgICAgIFwKKyAgICAgICAgKCgoKChiKSA+PiAyMykgPDwgMTApICsgKChiKSA+PiAyMykgKyAoKGIpID4+IDMzKSArIDIgKyAxKSA8PCAocykpCisKKy8qCisgKiBjb252ZXJ0IGRpc2sgYmxvY2sgbnVtYmVyIHRvIHRoZSBsb2dpY2FsIGJsb2NrIG51bWJlciBvZiB0aGUgTEVWRUwgMQorICogZG1hcGN0bCBkZXNjcmliaW5nIHRoZSBkaXNrIGJsb2NrLiAgcyBpcyB0aGUgbG9nMihudW1iZXIgb2YgbG9naWNhbCBibG9ja3MKKyAqIHBlciBwYWdlKQorICoKKyAqIFRoZSBjYWxjdWxhdGlvbiBmaWd1cmVzIG91dCBob3cgbWFueSBsb2dpY2FsIHBhZ2VzIGFyZSBpbiBmcm9udCBvZiB0aGUgTDEuCisgKgktIHRoZSBudW1iZXIgb2YgZG1hcCBwYWdlcyBwcmVjZWRpbmcgaXQKKyAqCS0gdGhlIG51bWJlciBvZiBMMCBwYWdlcyBwcmVjZWRpbmcgaXQKKyAqCS0gdGhlIG51bWJlciBvZiBMMSBwYWdlcyBwcmVjZWRpbmcgaXQKKyAqCS0gMSBpcyBhZGRlZCB0byBhY2NvdW50IGZvciB0aGUgTDIgcGFnZQorICoJLSAxIGlzIGFkZGVkIHRvIGFjY291bnQgZm9yIHRoZSBjb250cm9sIHBhZ2Ugb2YgdGhlIG1hcC4KKyAqLworI2RlZmluZSBCTEtUT0wxKGIscykgICAgICBcCisgICAgICgoKCgoYikgPj4gMzMpIDw8IDIwKSArICgoKGIpID4+IDMzKSA8PCAxMCkgKyAoKGIpID4+IDMzKSArIDEgKyAxKSA8PCAocykpCisKKy8qCisgKiBjb252ZXJ0IGRpc2sgYmxvY2sgbnVtYmVyIHRvIHRoZSBsb2dpY2FsIGJsb2NrIG51bWJlciBvZiB0aGUgZG1hcGN0bAorICogYXQgdGhlIHNwZWNpZmllZCBsZXZlbCB3aGljaCBkZXNjcmliZXMgdGhlIGRpc2sgYmxvY2suCisgKi8KKyNkZWZpbmUgQkxLVE9DVEwoYixzLGwpICAgXAorICAgICAgICAoKChsKSA9PSAyKSA/IDEgOiAoKGwpID09IDEpID8gQkxLVE9MMSgoYiksKHMpKSA6IEJMS1RPTDAoKGIpLChzKSkpCisKKy8qIAorICogY29udmVydCBhZ2dyZWdhdGUgbWFwIHNpemUgdG8gdGhlIHplcm8gb3JpZ2luIGRtYXBjdGwgbGV2ZWwgb2YgdGhlCisgKiB0b3AgZG1hcGN0bC4KKyAqLworI2RlZmluZQlCTUFQU1pUT0xFVihzaXplKQlcCisJKCgoc2l6ZSkgPD0gTUFYTDBTSVpFKSA/IDAgOiAoKHNpemUpIDw9IE1BWEwxU0laRSkgPyAxIDogMikKKworLyogY29udmVydCBkaXNrIGJsb2NrIG51bWJlciB0byBhbGxvY2F0aW9uIGdyb3VwIG51bWJlci4KKyAqLworI2RlZmluZSBCTEtUT0FHKGIsc2JpKQkoKGIpID4+ICgoc2JpKS0+Ym1hcC0+ZGJfYWdsMnNpemUpKQorCisvKiBjb252ZXJ0IGFsbG9jYXRpb24gZ3JvdXAgbnVtYmVyIHRvIHN0YXJ0aW5nIGRpc2sgYmxvY2sKKyAqIG51bWJlci4KKyAqLworI2RlZmluZSBBR1RPQkxLKGEsaXApCVwKKwkoKHM2NCkoYSkgPDwgKEpGU19TQkkoKGlwKS0+aV9zYiktPmJtYXAtPmRiX2FnbDJzaXplKSkKKworLyoKKyAqCWRtYXAgc3VtbWFyeSB0cmVlCisgKgorICogZG1hcHRyZWUgbXVzdCBiZSBjb25zaXN0ZW50IHdpdGggZG1hcGN0bC4KKyAqLworc3RydWN0IGRtYXB0cmVlIHsKKwlfX2xlMzIgbmxlYWZzOwkJLyogNDogbnVtYmVyIG9mIHRyZWUgbGVhZnMgICAgICAqLworCV9fbGUzMiBsMm5sZWFmczsJLyogNDogbDIgbnVtYmVyIG9mIHRyZWUgbGVhZnMgICAqLworCV9fbGUzMiBsZWFmaWR4OwkJLyogNDogaW5kZXggb2YgZmlyc3QgdHJlZSBsZWFmICAqLworCV9fbGUzMiBoZWlnaHQ7CQkvKiA0OiBoZWlnaHQgb2YgdGhlIHRyZWUgICAgICAgICovCisJczggYnVkbWluOwkJLyogMTogbWluIGwyIHRyZWUgbGVhZiB2YWx1ZSB0byBjb21iaW5lICovCisJczggc3RyZWVbVFJFRVNJWkVdOwkvKiBUUkVFU0laRTogdHJlZSAgICAgICAgICAgICAgICovCisJdTggcGFkWzJdOwkJLyogMjogcGFkIHRvIHdvcmQgYm91bmRhcnkgICAgICAqLworfTsJCQkJLyogLSAzNjAgLSAgICAgICAgICAgICAgICAgICAgICAqLworCisvKgorICoJZG1hcCBwYWdlIHBlciA4SyBibG9ja3MgYml0bWFwCisgKi8KK3N0cnVjdCBkbWFwIHsKKwlfX2xlMzIgbmJsb2NrczsJCS8qIDQ6IG51bSBibGtzIGNvdmVyZWQgYnkgdGhpcyBkbWFwICAgICAqLworCV9fbGUzMiBuZnJlZTsJCS8qIDQ6IG51bSBvZiBmcmVlIGJsa3MgaW4gdGhpcyBkbWFwICAgICAqLworCV9fbGU2NCBzdGFydDsJCS8qIDg6IHN0YXJ0aW5nIGJsa25vIGZvciB0aGlzIGRtYXAgICAgICAqLworCXN0cnVjdCBkbWFwdHJlZSB0cmVlOwkvKiAzNjA6IGRtYXAgdHJlZSAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl1OCBwYWRbMTY3Ml07CQkvKiAxNjcyOiBwYWQgdG8gMjA0OCBieXRlcyAgICAgICAgICAgICAgKi8KKwlfX2xlMzIgd21hcFtMUEVSRE1BUF07CS8qIDEwMjQ6IGJpdHMgb2YgdGhlIHdvcmtpbmcgbWFwICAgICAgICAqLworCV9fbGUzMiBwbWFwW0xQRVJETUFQXTsJLyogMTAyNDogYml0cyBvZiB0aGUgcGVyc2lzdGVudCBtYXAgICAgICovCit9OwkJCQkvKiAtIDQwOTYgLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyoKKyAqCWRpc2sgbWFwIGNvbnRyb2wgcGFnZSBwZXIgbGV2ZWwuCisgKgorICogZG1hcGN0bCBtdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCBkbWFwdHJlZS4KKyAqLworc3RydWN0IGRtYXBjdGwgeworCV9fbGUzMiBubGVhZnM7CQkvKiA0OiBudW1iZXIgb2YgdHJlZSBsZWFmcyAgICAgICovCisJX19sZTMyIGwybmxlYWZzOwkvKiA0OiBsMiBudW1iZXIgb2YgdHJlZSBsZWFmcyAgICovCisJX19sZTMyIGxlYWZpZHg7CQkvKiA0OiBpbmRleCBvZiB0aGUgZmlyc3QgdHJlZSBsZWFmICAgICAgKi8KKwlfX2xlMzIgaGVpZ2h0OwkJLyogNDogaGVpZ2h0IG9mIHRyZWUgICAgICAgICAgICAqLworCXM4IGJ1ZG1pbjsJCS8qIDE6IG1pbmltdW0gbDIgdHJlZSBsZWFmIHZhbHVlICAgICAgICAqLworCXM4IHN0cmVlW0NUTFRSRUVTSVpFXTsJLyogQ1RMVFJFRVNJWkU6IGRtYXBjdGwgdHJlZSAgICAqLworCXU4IHBhZFsyNzE0XTsJCS8qIDI3MTQ6IHBhZCB0byA0MDk2ICAgICAgICAgICAgKi8KK307CQkJCS8qIC0gNDA5NiAtICAgICAgICAgICAgICAgICAgICAgKi8KKworLyoKKyAqCWNvbW1vbiBkZWZpbml0aW9uIGZvciBkbWFwdHJlZSB3aXRoaW4gZG1hcCBhbmQgZG1hcGN0bAorICovCit0eXBlZGVmIHVuaW9uIGRtdHJlZSB7CisJc3RydWN0IGRtYXB0cmVlIHQxOworCXN0cnVjdCBkbWFwY3RsIHQyOworfSBkbXRyZWVfdDsKKworLyogbWFjcm9zIGZvciBhY2Nlc3NpbmcgZmllbGRzIHdpdGhpbiBkbXRyZWUgKi8KKyNkZWZpbmUJZG10X25sZWFmcwl0MS5ubGVhZnMKKyNkZWZpbmUJZG10X2wybmxlYWZzIAl0MS5sMm5sZWFmcworI2RlZmluZQlkbXRfbGVhZmlkeCAJdDEubGVhZmlkeAorI2RlZmluZQlkbXRfaGVpZ2h0IAl0MS5oZWlnaHQKKyNkZWZpbmUJZG10X2J1ZG1pbiAJdDEuYnVkbWluCisjZGVmaW5lCWRtdF9zdHJlZSAJdDEuc3RyZWUKKworLyogCisgKglvbi1kaXNrIGFnZ3JlZ2F0ZSBkaXNrIGFsbG9jYXRpb24gbWFwIGRlc2NyaXB0b3IuCisgKi8KK3N0cnVjdCBkYm1hcF9kaXNrIHsKKwlfX2xlNjQgZG5fbWFwc2l6ZTsJLyogODogbnVtYmVyIG9mIGJsb2NrcyBpbiBhZ2dyZWdhdGUgICAgICovCisJX19sZTY0IGRuX25mcmVlOwkvKiA4OiBudW0gZnJlZSBibGtzIGluIGFnZ3JlZ2F0ZSBtYXAgICAgKi8KKwlfX2xlMzIgZG5fbDJuYnBlcnBhZ2U7CS8qIDQ6IG51bWJlciBvZiBibGtzIHBlciBwYWdlICAgICAgICAgICAqLworCV9fbGUzMiBkbl9udW1hZzsJLyogNDogdG90YWwgbnVtYmVyIG9mIGFncyAgICAgICAgICAgICAgICovCisJX19sZTMyIGRuX21heGxldmVsOwkvKiA0OiBudW1iZXIgb2YgYWN0aXZlIGFncyAgICAgICAgICAgICAgKi8KKwlfX2xlMzIgZG5fbWF4YWc7CS8qIDQ6IG1heCBhY3RpdmUgYWxsb2MgZ3JvdXAgbnVtYmVyICAgICAqLworCV9fbGUzMiBkbl9hZ3ByZWY7CS8qIDQ6IHByZWZlcnJlZCBhbGxvYyBncm91cCAoaGludCkgICAgICAqLworCV9fbGUzMiBkbl9hZ2xldmVsOwkvKiA0OiBkbWFwY3RsIGxldmVsIGhvbGRpbmcgdGhlIEFHICAgICAgKi8KKwlfX2xlMzIgZG5fYWdoZWlndGg7CS8qIDQ6IGhlaWdodCBpbiBkbWFwY3RsIG9mIHRoZSBBRyAgICAgICAqLworCV9fbGUzMiBkbl9hZ3dpZHRoOwkvKiA0OiB3aWR0aCBpbiBkbWFwY3RsIG9mIHRoZSBBRyAgICAgICAgKi8KKwlfX2xlMzIgZG5fYWdzdGFydDsJLyogNDogc3RhcnQgdHJlZSBpbmRleCBhdCBBRyBoZWlnaHQgICAgICovCisJX19sZTMyIGRuX2FnbDJzaXplOwkvKiA0OiBsMiBudW0gb2YgYmxrcyBwZXIgYWxsb2MgZ3JvdXAgICAgKi8KKwlfX2xlNjQgZG5fYWdmcmVlW01BWEFHXTsvKiA4Kk1BWEFHOiBwZXIgQUcgZnJlZSBjb3VudCAgICAgICAgICAgKi8KKwlfX2xlNjQgZG5fYWdzaXplOwkvKiA4OiBudW0gb2YgYmxrcyBwZXIgYWxsb2MgZ3JvdXAgICAgICAgKi8KKwlzOCBkbl9tYXhmcmVlYnVkOwkvKiAxOiBtYXggZnJlZSBidWRkeSBzeXN0ZW0gICAgICAgICAgICAgKi8KKwl1OCBwYWRbMzAwN107CQkvKiAzMDA3OiBwYWQgdG8gNDA5NiAgICAgICAgICAgICAgICAgICAgKi8KK307CQkJCS8qIC0gNDA5NiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitzdHJ1Y3QgZGJtYXAgeworCXM2NCBkbl9tYXBzaXplOwkJLyogbnVtYmVyIG9mIGJsb2NrcyBpbiBhZ2dyZWdhdGUgICAgICovCisJczY0IGRuX25mcmVlOwkJLyogbnVtIGZyZWUgYmxrcyBpbiBhZ2dyZWdhdGUgbWFwICAgICovCisJaW50IGRuX2wybmJwZXJwYWdlOwkvKiBudW1iZXIgb2YgYmxrcyBwZXIgcGFnZSAgICAgICAgICAgKi8KKwlpbnQgZG5fbnVtYWc7CQkvKiB0b3RhbCBudW1iZXIgb2YgYWdzICAgICAgICAgICAgICAgKi8KKwlpbnQgZG5fbWF4bGV2ZWw7CS8qIG51bWJlciBvZiBhY3RpdmUgYWdzICAgICAgICAgICAgICAqLworCWludCBkbl9tYXhhZzsJCS8qIG1heCBhY3RpdmUgYWxsb2MgZ3JvdXAgbnVtYmVyICAgICAqLworCWludCBkbl9hZ3ByZWY7CQkvKiBwcmVmZXJyZWQgYWxsb2MgZ3JvdXAgKGhpbnQpICAgICAgKi8KKwlpbnQgZG5fYWdsZXZlbDsJCS8qIGRtYXBjdGwgbGV2ZWwgaG9sZGluZyB0aGUgQUcgICAgICAqLworCWludCBkbl9hZ2hlaWd0aDsJLyogaGVpZ2h0IGluIGRtYXBjdGwgb2YgdGhlIEFHICAgICAgICovCisJaW50IGRuX2Fnd2lkdGg7CQkvKiB3aWR0aCBpbiBkbWFwY3RsIG9mIHRoZSBBRyAgICAgICAgKi8KKwlpbnQgZG5fYWdzdGFydDsJCS8qIHN0YXJ0IHRyZWUgaW5kZXggYXQgQUcgaGVpZ2h0ICAgICAqLworCWludCBkbl9hZ2wyc2l6ZTsJLyogbDIgbnVtIG9mIGJsa3MgcGVyIGFsbG9jIGdyb3VwICAgICovCisJczY0IGRuX2FnZnJlZVtNQVhBR107CS8qIHBlciBBRyBmcmVlIGNvdW50ICAgICAgICAgICAqLworCXM2NCBkbl9hZ3NpemU7CQkvKiBudW0gb2YgYmxrcyBwZXIgYWxsb2MgZ3JvdXAgICAgICAgKi8KKwlzaWduZWQgY2hhciBkbl9tYXhmcmVlYnVkOwkvKiBtYXggZnJlZSBidWRkeSBzeXN0ZW0gICAgICAgICAgICAgKi8KK307CQkJCS8qIC0gNDA5NiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogCisgKglpbi1tZW1vcnkgYWdncmVnYXRlIGRpc2sgYWxsb2NhdGlvbiBtYXAgZGVzY3JpcHRvci4KKyAqLworc3RydWN0IGJtYXAgeworCXN0cnVjdCBkYm1hcCBkYl9ibWFwOwkJLyogb24tZGlzayBhZ2dyZWdhdGUgbWFwIGRlc2NyaXB0b3IgKi8KKwlzdHJ1Y3QgaW5vZGUgKmRiX2lwYm1hcDsJLyogcHRyIHRvIGFnZ3JlZ2F0ZSBtYXAgaW5jb3JlIGlub2RlICovCisJc3RydWN0IHNlbWFwaG9yZSBkYl9ibWFwbG9jazsJLyogYWdncmVnYXRlIG1hcCBsb2NrICovCisJYXRvbWljX3QgZGJfYWN0aXZlW01BWEFHXTsJLyogY291bnQgb2YgYWN0aXZlLCBvcGVuIGZpbGVzIGluIEFHICovCisJdTMyICpkYl9EQm1hcDsKK307CisKKy8qIG1hY3JvcyBmb3IgYWNjZXNzaW5nIGZpZWxkcyB3aXRoaW4gaW4tbWVtb3J5IGFnZ3JlZ2F0ZSBtYXAgZGVzY3JpcHRvciAqLworI2RlZmluZQlkYl9tYXBzaXplCWRiX2JtYXAuZG5fbWFwc2l6ZQorI2RlZmluZQlkYl9uZnJlZQlkYl9ibWFwLmRuX25mcmVlCisjZGVmaW5lCWRiX2FnZnJlZQlkYl9ibWFwLmRuX2FnZnJlZQorI2RlZmluZQlkYl9hZ3NpemUJZGJfYm1hcC5kbl9hZ3NpemUKKyNkZWZpbmUJZGJfYWdsMnNpemUJZGJfYm1hcC5kbl9hZ2wyc2l6ZQorI2RlZmluZQlkYl9hZ3dpZHRoCWRiX2JtYXAuZG5fYWd3aWR0aAorI2RlZmluZQlkYl9hZ2hlaWd0aAlkYl9ibWFwLmRuX2FnaGVpZ3RoCisjZGVmaW5lCWRiX2Fnc3RhcnQJZGJfYm1hcC5kbl9hZ3N0YXJ0CisjZGVmaW5lCWRiX251bWFnCWRiX2JtYXAuZG5fbnVtYWcKKyNkZWZpbmUJZGJfbWF4bGV2ZWwJZGJfYm1hcC5kbl9tYXhsZXZlbAorI2RlZmluZQlkYl9hZ2xldmVsCWRiX2JtYXAuZG5fYWdsZXZlbAorI2RlZmluZQlkYl9hZ3ByZWYJZGJfYm1hcC5kbl9hZ3ByZWYKKyNkZWZpbmUJZGJfbWF4YWcJZGJfYm1hcC5kbl9tYXhhZworI2RlZmluZQlkYl9tYXhmcmVlYnVkCWRiX2JtYXAuZG5fbWF4ZnJlZWJ1ZAorI2RlZmluZQlkYl9sMm5icGVycGFnZQlkYl9ibWFwLmRuX2wybmJwZXJwYWdlCisKKy8qCisgKiBtYWNyb3MgZm9yIHZhcmlvdXMgY29udmVyc2lvbnMgbmVlZGVkIGJ5IHRoZSBhbGxvY2F0b3JzLgorICogYmxrc3RvbDIoKSwgY250bHooKSwgYW5kIGNudHR6KCkgYXJlIG9wZXJhdGluZyBzeXN0ZW0gZGVwZW5kZW50IGZ1bmN0aW9ucy4KKyAqLworLyogY29udmVydCBudW1iZXIgb2YgYmxvY2tzIHRvIGxvZzIgbnVtYmVyIG9mIGJsb2Nrcywgcm91bmRpbmcgdXAgdG8KKyAqIHRoZSBuZXh0IGxvZzIgdmFsdWUgaWYgYmxvY2tzIGlzIG5vdCBhIGwyIG11bHRpcGxlLgorICovCisjZGVmaW5lCUJMS1NUT0wyKGQpCQkoYmxrc3RvbDIoZCkpCisKKy8qIGNvbnZlcnQgbnVtYmVyIG9mIGxlYWZzIHRvIGxvZzIgbGVhZiB2YWx1ZSAqLworI2RlZmluZQlOTFNUT0wyQlNaKG4pCQkoMzEgLSBjbnRseigobikpICsgQlVETUlOKQorCisvKiBjb252ZXJ0IGxlYWYgaW5kZXggdG8gbG9nMiBsZWFmIHZhbHVlICovCisjZGVmaW5lCUxJVE9MMkJTWihuLG0sYikJKCgoKG4pID09IDApID8gKG0pIDogY250dHooKG4pKSkgKyAoYikpCisKKy8qIGNvbnZlcnQgYSBibG9jayBudW1iZXIgdG8gYSBkbWFwIGNvbnRyb2wgbGVhZiBpbmRleCAqLworI2RlZmluZSBCTEtUT0NUTExFQUYoYixtKQlcCisJKCgoYikgJiAoKChzNjQpMSA8PCAoKG0pICsgTDJMUEVSQ1RMKSkgLSAxKSkgPj4gKG0pKQorCisvKiBjb252ZXJ0IGxvZzIgbGVhZiB2YWx1ZSB0byBidWRkeSBzaXplICovCisjZGVmaW5lCUJVRFNJWkUocyxtKQkJKDEgPDwgKChzKSAtIChtKSkpCisKKy8qCisgKglleHRlcm5hbCByZWZlcmVuY2VzLgorICovCitleHRlcm4gaW50IGRiTW91bnQoc3RydWN0IGlub2RlICppcGJtYXApOworCitleHRlcm4gaW50IGRiVW5tb3VudChzdHJ1Y3QgaW5vZGUgKmlwYm1hcCwgaW50IG1vdW50ZXJyb3IpOworCitleHRlcm4gaW50IGRiRnJlZShzdHJ1Y3QgaW5vZGUgKmlwYm1hcCwgczY0IGJsa25vLCBzNjQgbmJsb2Nrcyk7CisKK2V4dGVybiBpbnQgZGJVcGRhdGVQTWFwKHN0cnVjdCBpbm9kZSAqaXBibWFwLAorCQkJaW50IGZyZWUsIHM2NCBibGtubywgczY0IG5ibG9ja3MsIHN0cnVjdCB0YmxvY2sgKiB0YmxrKTsKKworZXh0ZXJuIGludCBkYk5leHRBRyhzdHJ1Y3QgaW5vZGUgKmlwYm1hcCk7CisKK2V4dGVybiBpbnQgZGJBbGxvYyhzdHJ1Y3QgaW5vZGUgKmlwYm1hcCwgczY0IGhpbnQsIHM2NCBuYmxvY2tzLCBzNjQgKiByZXN1bHRzKTsKKworZXh0ZXJuIGludCBkYlJlQWxsb2Moc3RydWN0IGlub2RlICppcGJtYXAsCisJCSAgICAgczY0IGJsa25vLCBzNjQgbmJsb2NrcywgczY0IGFkZG5ibG9ja3MsIHM2NCAqIHJlc3VsdHMpOworCitleHRlcm4gaW50IGRiU3luYyhzdHJ1Y3QgaW5vZGUgKmlwYm1hcCk7CitleHRlcm4gaW50IGRiQWxsb2NCb3R0b21VcChzdHJ1Y3QgaW5vZGUgKmlwLCBzNjQgYmxrbm8sIHM2NCBuYmxvY2tzKTsKK2V4dGVybiBpbnQgZGJFeHRlbmRGUyhzdHJ1Y3QgaW5vZGUgKmlwYm1hcCwgczY0IGJsa25vLCBzNjQgbmJsb2Nrcyk7CitleHRlcm4gdm9pZCBkYkZpbmFsaXplQm1hcChzdHJ1Y3QgaW5vZGUgKmlwYm1hcCk7CitleHRlcm4gczY0IGRiTWFwRmlsZVNpemVUb01hcFNpemUoc3RydWN0IGlub2RlICppcGJtYXApOworI2VuZGlmCQkJCS8qIF9IX0pGU19ETUFQICovCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX2R0cmVlLmMgYi9mcy9qZnMvamZzX2R0cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM1Nzg5MAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmcy9qZnNfZHRyZWUuYwpAQCAtMCwwICsxLDQ3NTIgQEAKKy8qCisgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwMC0yMDA0CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqCWpmc19kdHJlZS5jOiBkaXJlY3RvcnkgQistdHJlZSBtYW5hZ2VyCisgKgorICogQistdHJlZSB3aXRoIHZhcmlhYmxlIGxlbmd0aCBrZXkgZGlyZWN0b3J5OgorICoKKyAqIGVhY2ggZGlyZWN0b3J5IHBhZ2UgaXMgc3RydWN0dXJlZCBhcyBhbiBhcnJheSBvZiAzMi1ieXRlCisgKiBkaXJlY3RvcnkgZW50cnkgc2xvdHMgaW5pdGlhbGl6ZWQgYXMgYSBmcmVlbGlzdAorICogdG8gYXZvaWQgc2VhcmNoL2NvbXBhY3Rpb24gb2YgZnJlZSBzcGFjZSBhdCBpbnNlcnRpb24uCisgKiB3aGVuIGFuIGVudHJ5IGlzIGluc2VydGVkLCBhIG51bWJlciBvZiBzbG90cyBhcmUgYWxsb2NhdGVkCisgKiBmcm9tIHRoZSBmcmVlbGlzdCBhcyByZXF1aXJlZCB0byBzdG9yZSB2YXJpYWJsZSBsZW5ndGggZGF0YQorICogb2YgdGhlIGVudHJ5OyB3aGVuIHRoZSBlbnRyeSBpcyBkZWxldGVkLCBzbG90cyBvZiB0aGUgZW50cnkKKyAqIGFyZSByZXR1cm5lZCB0byBmcmVlbGlzdC4KKyAqCisgKiBsZWFmIGVudHJ5IHN0b3JlcyBmdWxsIG5hbWUgYXMga2V5IGFuZCBmaWxlIHNlcmlhbCBudW1iZXIKKyAqIChha2EgaW5vZGUgbnVtYmVyKSBhcyBkYXRhLgorICogaW50ZXJuYWwvcm91dGVyIGVudHJ5IHN0b3JlcyBzdWZmZml4IGNvbXByZXNzZWQgbmFtZQorICogYXMga2V5IGFuZCBzaW1wbGUgZXh0ZW50IGRlc2NyaXB0b3IgYXMgZGF0YS4KKyAqCisgKiBlYWNoIGRpcmVjdG9yeSBwYWdlIG1haW50YWlucyBhIHNvcnRlZCBlbnRyeSBpbmRleCB0YWJsZQorICogd2hpY2ggc3RvcmVzIHRoZSBzdGFydCBzbG90IGluZGV4IG9mIHNvcnRlZCBlbnRyaWVzCisgKiB0byBhbGxvdyBiaW5hcnkgc2VhcmNoIG9uIHRoZSB0YWJsZS4KKyAqCisgKiBkaXJlY3Rvcnkgc3RhcnRzIGFzIGEgcm9vdC9sZWFmIHBhZ2UgaW4gb24tZGlzayBpbm9kZQorICogaW5saW5lIGRhdGEgYXJlYS4KKyAqIHdoZW4gaXQgYmVjb21lcyBmdWxsLCBpdCBzdGFydHMgYSBsZWFmIG9mIGEgZXh0ZXJuYWwgZXh0ZW50CisgKiBvZiBsZW5ndGggb2YgMSBibG9jay4gZWFjaCB0aW1lIHRoZSBmaXJzdCBsZWFmIGJlY29tZXMgZnVsbCwKKyAqIGl0IGlzIGV4dGVuZGVkIHJhdGhlciB0aGFuIHNwbGl0IChpdHMgc2l6ZSBpcyBkb3VibGVkKSwKKyAqIHVudGlsIGl0cyBsZW5ndGggYmVjb21zIDQgS0J5dGVzLCBmcm9tIHRoZW4gdGhlIGV4dGVudCBpcyBzcGxpdAorICogd2l0aCBuZXcgNCBLYnl0ZSBleHRlbnQgd2hlbiBpdCBiZWNvbWVzIGZ1bGwKKyAqIHRvIHJlZHVjZSBleHRlcm5hbCBmcmFnbWVudGF0aW9uIG9mIHNtYWxsIGRpcmVjdG9yaWVzLgorICoKKyAqIGJsYWgsIGJsYWgsIGJsYWgsIGZvciBsaW5lYXIgc2NhbiBvZiBkaXJlY3RvcnkgaW4gcGllY2VzIGJ5CisgKiByZWFkZGlyKCkuCisgKgorICoKKyAqCWNhc2UtaW5zZW5zaXRpdmUgZGlyZWN0b3J5IGZpbGUgc3lzdGVtCisgKgorICogbmFtZXMgYXJlIHN0b3JlZCBpbiBjYXNlLXNlbnNpdGl2ZSB3YXkgaW4gbGVhZiBlbnRyeS4KKyAqIGJ1dCBzdG9yZWQsIHNlYXJjaGVkIGFuZCBjb21wYXJlZCBpbiBjYXNlLWluc2Vuc2l0aXZlICh1cHBlcmNhc2UpIG9yZGVyCisgKiAoaS5lLiwgYm90aCBzZWFyY2gga2V5IGFuZCBlbnRyeSBrZXkgYXJlIGZvbGRlZCBmb3Igc2VhcmNoL2NvbXBhcmUpOgorICogKG5vdGUgdGhhdCBjYXNlLXNlbnNpdGl2ZSBvcmRlciBpcyBCUk9LRU4gaW4gc3RvcmFnZSwgZS5nLiwKKyAqICBzZW5zaXRpdmU6IEFkLCBhQiwgYUMsIGFEIC0+IGluc2Vuc2l0aXZlOiBhQiwgYUMsIGFELCBBZAorICoKKyAqICBlbnRyaWVzIHdoaWNoIGZvbGRzIHRvIHRoZSBzYW1lIGtleSBtYWtlcyB1cCBhIGVxdWl2YWxlbnQgY2xhc3MKKyAqICB3aG9zZSBtZW1iZXJzIGFyZSBzdG9yZWQgYXMgY29udGlndW91cyBjbHVzdGVyIChtYXkgY3Jvc3MgcGFnZSBib3VuZGFyeSkKKyAqICBidXQgd2hvc2Ugb3JkZXIgaXMgYXJiaXRyYXJ5IGFuZCBhY3RzIGFzIGR1cGxpY2F0ZSwgZS5nLiwKKyAqICBhYmMsIEFiYywgYUJjLCBhYkMpCisgKgorICogb25jZSBtYXRjaCBpcyBmb3VuZCBhdCBsZWFmLCByZXF1aXJlcyBzY2FuIGZvcndhcmQvYmFja3dhcmQKKyAqIGVpdGhlciBmb3IsIGluIGNhc2UtaW5zZW5zaXRpdmUgc2VhcmNoLCBkdXBsaWNhdGUKKyAqIG9yIGZvciwgaW4gY2FzZS1zZW5zaXRpdmUgc2VhcmNoLCBmb3IgZXhhY3QgbWF0Y2gKKyAqCisgKiByb3V0ZXIgZW50cnkgbXVzdCBiZSBjcmVhdGVkL3N0b3JlZCBpbiBjYXNlLWluc2Vuc2l0aXZlIHdheQorICogaW4gaW50ZXJuYWwgZW50cnk6CisgKiAocmlnaHQgbW9zdCBrZXkgb2YgbGVmdCBwYWdlIGFuZCBsZWZ0IG1vc3Qga2V5IG9mIHJpZ2h0IHBhZ2UKKyAqIGFyZSBmb2xkZWQsIGFuZCBpdHMgc3VmZml4IGNvbXByZXNzaW9uIGlzIHByb3BhZ2F0ZWQgYXMgcm91dGVyCisgKiBrZXkgaW4gcGFyZW50KQorICogKGUuZy4sIGlmIHNwbGl0IG9jY3VycyA8YWJjPiBhbmQgPGFCZD4sIDxBQkQ+IHRyYXRoZXIgdGhhbiA8YUI+CisgKiBzaG91bGQgYmUgbWFkZSB0aGUgcm91dGVyIGtleSBmb3IgdGhlIHNwbGl0KQorICoKKyAqIGNhc2UtaW5zZW5zaXRpdmUgc2VhcmNoOgorICoKKyAqIAlmb2xkIHNlYXJjaCBrZXk7CisgKgorICoJY2FzZS1pbnNlbnNpdGl2ZSBzZWFyY2ggb2YgQi10cmVlOgorICoJZm9yIGludGVybmFsIGVudHJ5LCByb3V0ZXIga2V5IGlzIGFscmVhZHkgZm9sZGVkOworICoJZm9yIGxlYWYgZW50cnksIGZvbGQgdGhlIGVudHJ5IGtleSBiZWZvcmUgY29tcGFyaXNvbi4KKyAqCisgKglpZiAobGVhZiBlbnRyeSBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoIGZvdW5kKQorICoJCWlmIChuZXh0IGVudHJ5IHNhdGlzZmllcyBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoKQorICoJCQlyZXR1cm4gRURVUExJQ0FURTsKKyAqCQlpZiAocHJldiBlbnRyeSBzYXRpc2ZpZXMgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaCkKKyAqCQkJcmV0dXJuIEVEVVBMSUNBVEU7CisgKgkJcmV0dXJuIG1hdGNoOworICoJZWxzZQorICoJCXJldHVybiBubyBtYXRjaDsKKyAqCisgKiAJc2VyaWFsaXphdGlvbjoKKyAqIHRhcmdldCBkaXJlY3RvcnkgaW5vZGUgbG9jayBpcyBiZWluZyBoZWxkIG9uIGVudHJ5L2V4aXQKKyAqIG9mIGFsbCBtYWluIGRpcmVjdG9yeSBzZXJ2aWNlIHJvdXRpbmVzLgorICoKKyAqCWxvZyBiYXNlZCByZWNvdmVyeToKKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorI2luY2x1ZGUgImpmc19pbmNvcmUuaCIKKyNpbmNsdWRlICJqZnNfc3VwZXJibG9jay5oIgorI2luY2x1ZGUgImpmc19maWxzeXMuaCIKKyNpbmNsdWRlICJqZnNfbWV0YXBhZ2UuaCIKKyNpbmNsdWRlICJqZnNfZG1hcC5oIgorI2luY2x1ZGUgImpmc191bmljb2RlLmgiCisjaW5jbHVkZSAiamZzX2RlYnVnLmgiCisKKy8qIGR0cmVlIHNwbGl0IHBhcmFtZXRlciAqLworc3RydWN0IGR0c3BsaXQgeworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJczE2IGluZGV4OworCXMxNiBuc2xvdDsKKwlzdHJ1Y3QgY29tcG9uZW50X25hbWUgKmtleTsKKwlkZGF0YV90ICpkYXRhOworCXN0cnVjdCBweGRsaXN0ICpweGRsaXN0OworfTsKKworI2RlZmluZSBEVF9QQUdFKElQLCBNUCkgQlRfUEFHRShJUCwgTVAsIGR0cGFnZV90LCBpX2R0cm9vdCkKKworLyogZ2V0IHBhZ2UgYnVmZmVyIGZvciBzcGVjaWZpZWQgYmxvY2sgYWRkcmVzcyAqLworI2RlZmluZSBEVF9HRVRQQUdFKElQLCBCTiwgTVAsIFNJWkUsIFAsIFJDKVwKK3tcCisJQlRfR0VUUEFHRShJUCwgQk4sIE1QLCBkdHBhZ2VfdCwgU0laRSwgUCwgUkMsIGlfZHRyb290KVwKKwlpZiAoIShSQykpXAorCXtcCisJCWlmICgoKFApLT5oZWFkZXIubmV4dGluZGV4ID4gKCgoQk4pPT0wKT9EVFJPT1RNQVhTTE9UOihQKS0+aGVhZGVyLm1heHNsb3QpKSB8fFwKKwkJICAgICgoQk4pICYmICgoUCktPmhlYWRlci5tYXhzbG90ID4gRFRQQUdFTUFYU0xPVCkpKVwKKwkJe1wKKwkJCUJUX1BVVFBBR0UoTVApO1wKKwkJCWpmc19lcnJvcigoSVApLT5pX3NiLCAiRFRfR0VUUEFHRTogZHRyZWUgcGFnZSBjb3JydXB0Iik7XAorCQkJTVAgPSBOVUxMO1wKKwkJCVJDID0gLUVJTztcCisJCX1cCisJfVwKK30KKworLyogZm9yIGNvbnNpc3RlbmN5ICovCisjZGVmaW5lIERUX1BVVFBBR0UoTVApIEJUX1BVVFBBR0UoTVApCisKKyNkZWZpbmUgRFRfR0VUU0VBUkNIKElQLCBMRUFGLCBCTiwgTVAsIFAsIElOREVYKSBcCisJQlRfR0VUU0VBUkNIKElQLCBMRUFGLCBCTiwgTVAsIGR0cGFnZV90LCBQLCBJTkRFWCwgaV9kdHJvb3QpCisKKy8qCisgKiBmb3J3YXJkIHJlZmVyZW5jZXMKKyAqLworc3RhdGljIGludCBkdFNwbGl0VXAodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLAorCQkgICAgIHN0cnVjdCBkdHNwbGl0ICogc3BsaXQsIHN0cnVjdCBidHN0YWNrICogYnRzdGFjayk7CisKK3N0YXRpYyBpbnQgZHRTcGxpdFBhZ2UodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZHRzcGxpdCAqIHNwbGl0LAorCQkgICAgICAgc3RydWN0IG1ldGFwYWdlICoqIHJtcHAsIGR0cGFnZV90ICoqIHJwcCwgcHhkX3QgKiByeGRwKTsKKworc3RhdGljIGludCBkdEV4dGVuZFBhZ2UodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLAorCQkJc3RydWN0IGR0c3BsaXQgKiBzcGxpdCwgc3RydWN0IGJ0c3RhY2sgKiBidHN0YWNrKTsKKworc3RhdGljIGludCBkdFNwbGl0Um9vdCh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsCisJCSAgICAgICBzdHJ1Y3QgZHRzcGxpdCAqIHNwbGl0LCBzdHJ1Y3QgbWV0YXBhZ2UgKiogcm1wcCk7CisKK3N0YXRpYyBpbnQgZHREZWxldGVVcCh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBtZXRhcGFnZSAqIGZtcCwKKwkJICAgICAgZHRwYWdlX3QgKiBmcCwgc3RydWN0IGJ0c3RhY2sgKiBidHN0YWNrKTsKKworc3RhdGljIGludCBkdFJlbGluayh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsIGR0cGFnZV90ICogcCk7CisKK3N0YXRpYyBpbnQgZHRSZWFkRmlyc3Qoc3RydWN0IGlub2RlICppcCwgc3RydWN0IGJ0c3RhY2sgKiBidHN0YWNrKTsKKworc3RhdGljIGludCBkdFJlYWROZXh0KHN0cnVjdCBpbm9kZSAqaXAsCisJCSAgICAgIGxvZmZfdCAqIG9mZnNldCwgc3RydWN0IGJ0c3RhY2sgKiBidHN0YWNrKTsKKworc3RhdGljIGludCBkdENvbXBhcmUoc3RydWN0IGNvbXBvbmVudF9uYW1lICoga2V5LCBkdHBhZ2VfdCAqIHAsIGludCBzaSk7CisKK3N0YXRpYyBpbnQgY2lDb21wYXJlKHN0cnVjdCBjb21wb25lbnRfbmFtZSAqIGtleSwgZHRwYWdlX3QgKiBwLCBpbnQgc2ksCisJCSAgICAgaW50IGZsYWcpOworCitzdGF0aWMgdm9pZCBkdEdldEtleShkdHBhZ2VfdCAqIHAsIGludCBpLCBzdHJ1Y3QgY29tcG9uZW50X25hbWUgKiBrZXksCisJCSAgICAgaW50IGZsYWcpOworCitzdGF0aWMgaW50IGNpR2V0TGVhZlByZWZpeEtleShkdHBhZ2VfdCAqIGxwLCBpbnQgbGksIGR0cGFnZV90ICogcnAsCisJCQkgICAgICBpbnQgcmksIHN0cnVjdCBjb21wb25lbnRfbmFtZSAqIGtleSwgaW50IGZsYWcpOworCitzdGF0aWMgdm9pZCBkdEluc2VydEVudHJ5KGR0cGFnZV90ICogcCwgaW50IGluZGV4LCBzdHJ1Y3QgY29tcG9uZW50X25hbWUgKiBrZXksCisJCQkgIGRkYXRhX3QgKiBkYXRhLCBzdHJ1Y3QgZHRfbG9jayAqKik7CisKK3N0YXRpYyB2b2lkIGR0TW92ZUVudHJ5KGR0cGFnZV90ICogc3AsIGludCBzaSwgZHRwYWdlX3QgKiBkcCwKKwkJCXN0cnVjdCBkdF9sb2NrICoqIHNkdGxvY2ssIHN0cnVjdCBkdF9sb2NrICoqIGRkdGxvY2ssCisJCQlpbnQgZG9faW5kZXgpOworCitzdGF0aWMgdm9pZCBkdERlbGV0ZUVudHJ5KGR0cGFnZV90ICogcCwgaW50IGZpLCBzdHJ1Y3QgZHRfbG9jayAqKiBkdGxvY2spOworCitzdGF0aWMgdm9pZCBkdFRydW5jYXRlRW50cnkoZHRwYWdlX3QgKiBwLCBpbnQgdGksIHN0cnVjdCBkdF9sb2NrICoqIGR0bG9jayk7CisKK3N0YXRpYyB2b2lkIGR0TGluZWxvY2tGcmVlbGlzdChkdHBhZ2VfdCAqIHAsIGludCBtLCBzdHJ1Y3QgZHRfbG9jayAqKiBkdGxvY2spOworCisjZGVmaW5lIGNpVG9VcHBlcihjKQlVbmlTdHJ1cHIoKGMpLT5uYW1lKQorCisvKgorICoJcmVhZF9pbmRleF9wYWdlKCkKKyAqCisgKglSZWFkcyBhIHBhZ2Ugb2YgYSBkaXJlY3RvcnkncyBpbmRleCB0YWJsZS4KKyAqCUhhdmluZyBtZXRhZGF0YSBtYXBwZWQgaW50byB0aGUgZGlyZWN0b3J5IGlub2RlJ3MgYWRkcmVzcyBzcGFjZQorICoJcHJlc2VudHMgYSBtdWx0aXR1ZGUgb2YgcHJvYmxlbXMuICBXZSBhdm9pZCB0aGlzIGJ5IG1hcHBpbmcgdG8KKyAqCXRoZSBhYnNvbHV0ZSBhZGRyZXNzIHNwYWNlIG91dHNpZGUgb2YgdGhlICpfbWV0YXBhZ2Ugcm91dGluZXMKKyAqLworc3RhdGljIHN0cnVjdCBtZXRhcGFnZSAqcmVhZF9pbmRleF9wYWdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHM2NCBibGtubykKK3sKKwlpbnQgcmM7CisJczY0IHhhZGRyOworCWludCB4ZmxhZzsKKwlzMzIgeGxlbjsKKworCXJjID0geHRMb29rdXAoaW5vZGUsIGJsa25vLCAxLCAmeGZsYWcsICZ4YWRkciwgJnhsZW4sIDEpOworCWlmIChyYyB8fCAoeGxlbiA9PSAwKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gcmVhZF9tZXRhcGFnZShpbm9kZSwgeGFkZHIsIFBTSVpFLCAxKTsKK30KKworLyoKKyAqCWdldF9pbmRleF9wYWdlKCkKKyAqCisgKglTYW1lIGFzIGdldF9pbmRleF9wYWdlKCksIGJ1dCBnZXQncyBhIG5ldyBwYWdlIHdpdGhvdXQgcmVhZGluZworICovCitzdGF0aWMgc3RydWN0IG1ldGFwYWdlICpnZXRfaW5kZXhfcGFnZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzNjQgYmxrbm8pCit7CisJaW50IHJjOworCXM2NCB4YWRkcjsKKwlpbnQgeGZsYWc7CisJczMyIHhsZW47CisKKwlyYyA9IHh0TG9va3VwKGlub2RlLCBibGtubywgMSwgJnhmbGFnLCAmeGFkZHIsICZ4bGVuLCAxKTsKKwlpZiAocmMgfHwgKHhsZW4gPT0gMCkpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGdldF9tZXRhcGFnZShpbm9kZSwgeGFkZHIsIFBTSVpFLCAxKTsKK30KKworLyoKKyAqCWZpbmRfaW5kZXgoKQorICoKKyAqCVJldHVybnMgZHRyZWUgcGFnZSBjb250YWluaW5nIGRpcmVjdG9yeSB0YWJsZSBlbnRyeSBmb3Igc3BlY2lmaWVkCisgKglpbmRleCBhbmQgcG9pbnRlciB0byBpdHMgZW50cnkuCisgKgorICoJbXAgbXVzdCBiZSByZWxlYXNlZCBieSBjYWxsZXIuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGlyX3RhYmxlX3Nsb3QgKmZpbmRfaW5kZXgoc3RydWN0IGlub2RlICppcCwgdTMyIGluZGV4LAorCQkJCQkgc3RydWN0IG1ldGFwYWdlICoqIG1wLCBzNjQgKmxibG9jaykKK3sKKwlzdHJ1Y3QgamZzX2lub2RlX2luZm8gKmpmc19pcCA9IEpGU19JUChpcCk7CisJczY0IGJsa25vOworCXM2NCBvZmZzZXQ7CisJaW50IHBhZ2Vfb2Zmc2V0OworCXN0cnVjdCBkaXJfdGFibGVfc2xvdCAqc2xvdDsKKwlzdGF0aWMgaW50IG1heFdhcm5pbmdzID0gMTA7CisKKwlpZiAoaW5kZXggPCAyKSB7CisJCWlmIChtYXhXYXJuaW5ncykgeworCQkJamZzX3dhcm4oImZpbmRfZW50cnkgY2FsbGVkIHdpdGggaW5kZXggPSAlZCIsIGluZGV4KTsKKwkJCW1heFdhcm5pbmdzLS07CisJCX0KKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGluZGV4ID49IGpmc19pcC0+bmV4dF9pbmRleCkgeworCQlqZnNfd2FybigiZmluZF9lbnRyeSBjYWxsZWQgd2l0aCBpbmRleCA+PSBuZXh0X2luZGV4Iik7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChqZnNfZGlydGFibGVfaW5saW5lKGlwKSkgeworCQkvKgorCQkgKiBJbmxpbmUgZGlyZWN0b3J5IHRhYmxlCisJCSAqLworCQkqbXAgPSBOVUxMOworCQlzbG90ID0gJmpmc19pcC0+aV9kaXJ0YWJsZVtpbmRleCAtIDJdOworCX0gZWxzZSB7CisJCW9mZnNldCA9IChpbmRleCAtIDIpICogc2l6ZW9mKHN0cnVjdCBkaXJfdGFibGVfc2xvdCk7CisJCXBhZ2Vfb2Zmc2V0ID0gb2Zmc2V0ICYgKFBTSVpFIC0gMSk7CisJCWJsa25vID0gKChvZmZzZXQgKyAxKSA+PiBMMlBTSVpFKSA8PAorCQkgICAgSkZTX1NCSShpcC0+aV9zYiktPmwybmJwZXJwYWdlOworCisJCWlmICgqbXAgJiYgKCpsYmxvY2sgIT0gYmxrbm8pKSB7CisJCQlyZWxlYXNlX21ldGFwYWdlKCptcCk7CisJCQkqbXAgPSBOVUxMOworCQl9CisJCWlmICgqbXAgPT0gMCkgeworCQkJKmxibG9jayA9IGJsa25vOworCQkJKm1wID0gcmVhZF9pbmRleF9wYWdlKGlwLCBibGtubyk7CisJCX0KKwkJaWYgKCptcCA9PSAwKSB7CisJCQlqZnNfZXJyKCJmcmVlX2luZGV4OiBlcnJvciByZWFkaW5nIGRpcmVjdG9yeSB0YWJsZSIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlzbG90ID0KKwkJICAgIChzdHJ1Y3QgZGlyX3RhYmxlX3Nsb3QgKikgKChjaGFyICopICgqbXApLT5kYXRhICsKKwkJCQkJICAgICAgIHBhZ2Vfb2Zmc2V0KTsKKwl9CisJcmV0dXJuIHNsb3Q7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsb2NrX2luZGV4KHRpZF90IHRpZCwgc3RydWN0IGlub2RlICppcCwgc3RydWN0IG1ldGFwYWdlICogbXAsCisJCQkgICAgICB1MzIgaW5kZXgpCit7CisJc3RydWN0IHRsb2NrICp0bGNrOworCXN0cnVjdCBsaW5lbG9jayAqbGxjazsKKwlzdHJ1Y3QgbHYgKmx2OworCisJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBtcCwgdGxja0RBVEEpOworCWxsY2sgPSAoc3RydWN0IGxpbmVsb2NrICopIHRsY2stPmxvY2s7CisKKwlpZiAobGxjay0+aW5kZXggPj0gbGxjay0+bWF4Y250KQorCQlsbGNrID0gdHhMaW5lbG9jayhsbGNrKTsKKwlsdiA9ICZsbGNrLT5sdltsbGNrLT5pbmRleF07CisKKwkvKgorCSAqICAgICAgTGluZWxvY2sgc2xvdCBzaXplIGlzIHR3aWNlIHRoZSBzaXplIG9mIGRpcmVjdG9yeSB0YWJsZQorCSAqICAgICAgc2xvdCBzaXplLiAgNTEyIGVudHJpZXMgcGVyIHBhZ2UuCisJICovCisJbHYtPm9mZnNldCA9ICgoaW5kZXggLSAyKSAmIDUxMSkgPj4gMTsKKwlsdi0+bGVuZ3RoID0gMTsKKwlsbGNrLT5pbmRleCsrOworfQorCisvKgorICoJYWRkX2luZGV4KCkKKyAqCisgKglBZGRzIGFuIGVudHJ5IHRvIHRoZSBkaXJlY3RvcnkgaW5kZXggdGFibGUuICBUaGlzIGlzIHVzZWQgdG8gcHJvdmlkZQorICoJZWFjaCBkaXJlY3RvcnkgZW50cnkgd2l0aCBhIHBlcnNpc3RlbnQgaW5kZXggaW4gd2hpY2ggdG8gcmVzdW1lCisgKglkaXJlY3RvcnkgdHJhdmVyc2FscworICovCitzdGF0aWMgdTMyIGFkZF9pbmRleCh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsIHM2NCBibiwgaW50IHNsb3QpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlwLT5pX3NiOworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpID0gSkZTX1NCSShzYik7CisJc3RydWN0IGpmc19pbm9kZV9pbmZvICpqZnNfaXAgPSBKRlNfSVAoaXApOworCXU2NCBibGtubzsKKwlzdHJ1Y3QgZGlyX3RhYmxlX3Nsb3QgKmRpcnRhYl9zbG90OworCXUzMiBpbmRleDsKKwlzdHJ1Y3QgbGluZWxvY2sgKmxsY2s7CisJc3RydWN0IGx2ICpsdjsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCXM2NCBvZmZzZXQ7CisJdWludCBwYWdlX29mZnNldDsKKwlzdHJ1Y3QgdGxvY2sgKnRsY2s7CisJczY0IHhhZGRyOworCisJQVNTRVJUKERPX0lOREVYKGlwKSk7CisKKwlpZiAoamZzX2lwLT5uZXh0X2luZGV4IDwgMikgeworCQlqZnNfd2FybigiYWRkX2luZGV4OiBuZXh0X2luZGV4ID0gJWQuICBSZXNldHRpbmchIiwKKwkJCSAgIGpmc19pcC0+bmV4dF9pbmRleCk7CisJCWpmc19pcC0+bmV4dF9pbmRleCA9IDI7CisJfQorCisJaW5kZXggPSBqZnNfaXAtPm5leHRfaW5kZXgrKzsKKworCWlmIChpbmRleCA8PSBNQVhfSU5MSU5FX0RJUlRBQkxFX0VOVFJZKSB7CisJCS8qCisJCSAqIGlfc2l6ZSByZWZsZWN0cyBzaXplIG9mIGluZGV4IHRhYmxlLCBvciA4IGJ5dGVzIHBlciBlbnRyeS4KKwkJICovCisJCWlwLT5pX3NpemUgPSAobG9mZl90KSAoaW5kZXggLSAxKSA8PCAzOworCisJCS8qCisJCSAqIGRpciB0YWJsZSBmaXRzIGlubGluZSB3aXRoaW4gaW5vZGUKKwkJICovCisJCWRpcnRhYl9zbG90ID0gJmpmc19pcC0+aV9kaXJ0YWJsZVtpbmRleC0yXTsKKwkJZGlydGFiX3Nsb3QtPmZsYWcgPSBESVJfSU5ERVhfVkFMSUQ7CisJCWRpcnRhYl9zbG90LT5zbG90ID0gc2xvdDsKKwkJRFRTYWRkcmVzcyhkaXJ0YWJfc2xvdCwgYm4pOworCisJCXNldF9jZmxhZyhDT01NSVRfRGlydGFibGUsIGlwKTsKKworCQlyZXR1cm4gaW5kZXg7CisJfQorCWlmIChpbmRleCA9PSAoTUFYX0lOTElORV9ESVJUQUJMRV9FTlRSWSArIDEpKSB7CisJCXN0cnVjdCBkaXJfdGFibGVfc2xvdCB0ZW1wX3RhYmxlWzEyXTsKKworCQkvKgorCQkgKiBJdCdzIHRpbWUgdG8gbW92ZSB0aGUgaW5saW5lIHRhYmxlIHRvIGFuIGV4dGVybmFsCisJCSAqIHBhZ2UgYW5kIGJlZ2luIHRvIGJ1aWxkIHRoZSB4dHJlZQorCQkgKi8KKwkJaWYgKERRVU9UX0FMTE9DX0JMT0NLKGlwLCBzYmktPm5icGVycGFnZSkgfHwKKwkJICAgIGRiQWxsb2MoaXAsIDAsIHNiaS0+bmJwZXJwYWdlLCAmeGFkZHIpKQorCQkJZ290byBjbGVhbl91cDsJLyogTm8gc3BhY2UgKi8KKworCQkvKgorCQkgKiBTYXZlIHRoZSB0YWJsZSwgd2UncmUgZ29pbmcgdG8gb3ZlcndyaXRlIGl0IHdpdGggdGhlCisJCSAqIHh0cmVlIHJvb3QKKwkJICovCisJCW1lbWNweSh0ZW1wX3RhYmxlLCAmamZzX2lwLT5pX2RpcnRhYmxlLCBzaXplb2YodGVtcF90YWJsZSkpOworCisJCS8qCisJCSAqIEluaXRpYWxpemUgZW1wdHkgeC10cmVlCisJCSAqLworCQl4dEluaXRSb290KHRpZCwgaXApOworCisJCS8qCisJCSAqIEFsbG9jYXRlIHRoZSBmaXJzdCBibG9jayAmIGFkZCBpdCB0byB0aGUgeHRyZWUKKwkJICovCisJCWlmICh4dEluc2VydCh0aWQsIGlwLCAwLCAwLCBzYmktPm5icGVycGFnZSwgJnhhZGRyLCAwKSkgeworCQkJLyogVGhpcyByZWFsbHkgc2hvdWxkbid0IGZhaWwgKi8KKwkJCWpmc193YXJuKCJhZGRfaW5kZXg6IHh0SW5zZXJ0IGZhaWxlZCEiKTsKKwkJCW1lbWNweSgmamZzX2lwLT5pX2RpcnRhYmxlLCB0ZW1wX3RhYmxlLAorCQkJICAgICAgIHNpemVvZiAodGVtcF90YWJsZSkpOworCQkJZ290byBjbGVhbl91cDsKKwkJfQorCQlpcC0+aV9zaXplID0gUFNJWkU7CisKKwkJaWYgKChtcCA9IGdldF9pbmRleF9wYWdlKGlwLCAwKSkgPT0gMCkgeworCQkJamZzX2VycigiYWRkX2luZGV4OiBnZXRfbWV0YXBhZ2UgZmFpbGVkISIpOworCQkJeHRUcnVuY2F0ZSh0aWQsIGlwLCAwLCBDT01NSVRfUFdNQVApOworCQkJbWVtY3B5KCZqZnNfaXAtPmlfZGlydGFibGUsIHRlbXBfdGFibGUsCisJCQkgICAgICAgc2l6ZW9mICh0ZW1wX3RhYmxlKSk7CisJCQlnb3RvIGNsZWFuX3VwOworCQl9CisJCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgbXAsIHRsY2tEQVRBKTsKKwkJbGxjayA9IChzdHJ1Y3QgbGluZWxvY2sgKikgJiB0bGNrLT5sb2NrOworCQlBU1NFUlQobGxjay0+aW5kZXggPT0gMCk7CisJCWx2ID0gJmxsY2stPmx2WzBdOworCisJCWx2LT5vZmZzZXQgPSAwOworCQlsdi0+bGVuZ3RoID0gNjsJLyogdGxja0RBVEEgc2xvdCBzaXplIGlzIDE2IGJ5dGVzICovCisJCWxsY2stPmluZGV4Kys7CisKKwkJbWVtY3B5KG1wLT5kYXRhLCB0ZW1wX3RhYmxlLCBzaXplb2YodGVtcF90YWJsZSkpOworCisJCW1hcmtfbWV0YXBhZ2VfZGlydHkobXApOworCQlyZWxlYXNlX21ldGFwYWdlKG1wKTsKKworCQkvKgorCQkgKiBMb2dnaW5nIGlzIG5vdyBkaXJlY3RlZCBieSB4dHJlZSB0bG9ja3MKKwkJICovCisJCWNsZWFyX2NmbGFnKENPTU1JVF9EaXJ0YWJsZSwgaXApOworCX0KKworCW9mZnNldCA9IChpbmRleCAtIDIpICogc2l6ZW9mKHN0cnVjdCBkaXJfdGFibGVfc2xvdCk7CisJcGFnZV9vZmZzZXQgPSBvZmZzZXQgJiAoUFNJWkUgLSAxKTsKKwlibGtubyA9ICgob2Zmc2V0ICsgMSkgPj4gTDJQU0laRSkgPDwgc2JpLT5sMm5icGVycGFnZTsKKwlpZiAocGFnZV9vZmZzZXQgPT0gMCkgeworCQkvKgorCQkgKiBUaGlzIHdpbGwgYmUgdGhlIGJlZ2lubmluZyBvZiBhIG5ldyBwYWdlCisJCSAqLworCQl4YWRkciA9IDA7CisJCWlmICh4dEluc2VydCh0aWQsIGlwLCAwLCBibGtubywgc2JpLT5uYnBlcnBhZ2UsICZ4YWRkciwgMCkpIHsKKwkJCWpmc193YXJuKCJhZGRfaW5kZXg6IHh0SW5zZXJ0IGZhaWxlZCEiKTsKKwkJCWdvdG8gY2xlYW5fdXA7CisJCX0KKwkJaXAtPmlfc2l6ZSArPSBQU0laRTsKKworCQlpZiAoKG1wID0gZ2V0X2luZGV4X3BhZ2UoaXAsIGJsa25vKSkpCisJCQltZW1zZXQobXAtPmRhdGEsIDAsIFBTSVpFKTsJLyogSnVzdCBsb29rcyBiZXR0ZXIgKi8KKwkJZWxzZQorCQkJeHRUcnVuY2F0ZSh0aWQsIGlwLCBvZmZzZXQsIENPTU1JVF9QV01BUCk7CisJfSBlbHNlCisJCW1wID0gcmVhZF9pbmRleF9wYWdlKGlwLCBibGtubyk7CisKKwlpZiAobXAgPT0gMCkgeworCQlqZnNfZXJyKCJhZGRfaW5kZXg6IGdldC9yZWFkX21ldGFwYWdlIGZhaWxlZCEiKTsKKwkJZ290byBjbGVhbl91cDsKKwl9CisKKwlsb2NrX2luZGV4KHRpZCwgaXAsIG1wLCBpbmRleCk7CisKKwlkaXJ0YWJfc2xvdCA9CisJICAgIChzdHJ1Y3QgZGlyX3RhYmxlX3Nsb3QgKikgKChjaGFyICopIG1wLT5kYXRhICsgcGFnZV9vZmZzZXQpOworCWRpcnRhYl9zbG90LT5mbGFnID0gRElSX0lOREVYX1ZBTElEOworCWRpcnRhYl9zbG90LT5zbG90ID0gc2xvdDsKKwlEVFNhZGRyZXNzKGRpcnRhYl9zbG90LCBibik7CisKKwltYXJrX21ldGFwYWdlX2RpcnR5KG1wKTsKKwlyZWxlYXNlX21ldGFwYWdlKG1wKTsKKworCXJldHVybiBpbmRleDsKKworICAgICAgY2xlYW5fdXA6CisKKwlqZnNfaXAtPm5leHRfaW5kZXgtLTsKKworCXJldHVybiAwOworfQorCisvKgorICoJZnJlZV9pbmRleCgpCisgKgorICoJTWFya3MgYW4gZW50cnkgdG8gdGhlIGRpcmVjdG9yeSBpbmRleCB0YWJsZSBhcyBmcmVlLgorICovCitzdGF0aWMgdm9pZCBmcmVlX2luZGV4KHRpZF90IHRpZCwgc3RydWN0IGlub2RlICppcCwgdTMyIGluZGV4LCB1MzIgbmV4dCkKK3sKKwlzdHJ1Y3QgZGlyX3RhYmxlX3Nsb3QgKmRpcnRhYl9zbG90OworCXM2NCBsYmxvY2s7CisJc3RydWN0IG1ldGFwYWdlICptcCA9IE5VTEw7CisKKwlkaXJ0YWJfc2xvdCA9IGZpbmRfaW5kZXgoaXAsIGluZGV4LCAmbXAsICZsYmxvY2spOworCisJaWYgKGRpcnRhYl9zbG90ID09IDApCisJCXJldHVybjsKKworCWRpcnRhYl9zbG90LT5mbGFnID0gRElSX0lOREVYX0ZSRUU7CisJZGlydGFiX3Nsb3QtPnNsb3QgPSBkaXJ0YWJfc2xvdC0+YWRkcjEgPSAwOworCWRpcnRhYl9zbG90LT5hZGRyMiA9IGNwdV90b19sZTMyKG5leHQpOworCisJaWYgKG1wKSB7CisJCWxvY2tfaW5kZXgodGlkLCBpcCwgbXAsIGluZGV4KTsKKwkJbWFya19tZXRhcGFnZV9kaXJ0eShtcCk7CisJCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCX0gZWxzZQorCQlzZXRfY2ZsYWcoQ09NTUlUX0RpcnRhYmxlLCBpcCk7Cit9CisKKy8qCisgKgltb2RpZnlfaW5kZXgoKQorICoKKyAqCUNoYW5nZXMgYW4gZW50cnkgaW4gdGhlIGRpcmVjdG9yeSBpbmRleCB0YWJsZQorICovCitzdGF0aWMgdm9pZCBtb2RpZnlfaW5kZXgodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLCB1MzIgaW5kZXgsIHM2NCBibiwKKwkJCSBpbnQgc2xvdCwgc3RydWN0IG1ldGFwYWdlICoqIG1wLCB1NjQgKmxibG9jaykKK3sKKwlzdHJ1Y3QgZGlyX3RhYmxlX3Nsb3QgKmRpcnRhYl9zbG90OworCisJZGlydGFiX3Nsb3QgPSBmaW5kX2luZGV4KGlwLCBpbmRleCwgbXAsIGxibG9jayk7CisKKwlpZiAoZGlydGFiX3Nsb3QgPT0gMCkKKwkJcmV0dXJuOworCisJRFRTYWRkcmVzcyhkaXJ0YWJfc2xvdCwgYm4pOworCWRpcnRhYl9zbG90LT5zbG90ID0gc2xvdDsKKworCWlmICgqbXApIHsKKwkJbG9ja19pbmRleCh0aWQsIGlwLCAqbXAsIGluZGV4KTsKKwkJbWFya19tZXRhcGFnZV9kaXJ0eSgqbXApOworCX0gZWxzZQorCQlzZXRfY2ZsYWcoQ09NTUlUX0RpcnRhYmxlLCBpcCk7Cit9CisKKy8qCisgKglyZWFkX2luZGV4KCkKKyAqCisgKglyZWFkcyBhIGRpcmVjdG9yeSB0YWJsZSBzbG90CisgKi8KK3N0YXRpYyBpbnQgcmVhZF9pbmRleChzdHJ1Y3QgaW5vZGUgKmlwLCB1MzIgaW5kZXgsCisJCSAgICAgc3RydWN0IGRpcl90YWJsZV9zbG90ICogZGlydGFiX3Nsb3QpCit7CisJczY0IGxibG9jazsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wID0gTlVMTDsKKwlzdHJ1Y3QgZGlyX3RhYmxlX3Nsb3QgKnNsb3Q7CisKKwlzbG90ID0gZmluZF9pbmRleChpcCwgaW5kZXgsICZtcCwgJmxibG9jayk7CisJaWYgKHNsb3QgPT0gMCkgeworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwltZW1jcHkoZGlydGFiX3Nsb3QsIHNsb3QsIHNpemVvZihzdHJ1Y3QgZGlyX3RhYmxlX3Nsb3QpKTsKKworCWlmIChtcCkKKwkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCWR0U2VhcmNoKCkKKyAqCisgKiBmdW5jdGlvbjoKKyAqCVNlYXJjaCBmb3IgdGhlIGVudHJ5IHdpdGggc3BlY2lmaWVkIGtleQorICoKKyAqIHBhcmFtZXRlcjoKKyAqCisgKiByZXR1cm46IDAgLSBzZWFyY2ggcmVzdWx0IG9uIHN0YWNrLCBsZWFmIHBhZ2UgcGlubmVkOworICoJICAgZXJybm8gLSBJL08gZXJyb3IKKyAqLworaW50IGR0U2VhcmNoKHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBjb21wb25lbnRfbmFtZSAqIGtleSwgaW5vX3QgKiBkYXRhLAorCSAgICAgc3RydWN0IGJ0c3RhY2sgKiBidHN0YWNrLCBpbnQgZmxhZykKK3sKKwlpbnQgcmMgPSAwOworCWludCBjbXAgPSAxOwkJLyogaW5pdCBmb3IgZW1wdHkgcGFnZSAqLworCXM2NCBibjsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCWR0cGFnZV90ICpwOworCXM4ICpzdGJsOworCWludCBiYXNlLCBpbmRleCwgbGltOworCXN0cnVjdCBidGZyYW1lICpidHNwOworCXB4ZF90ICpweGQ7CisJaW50IHBzaXplID0gMjg4OwkvKiBpbml0aWFsIGluLWxpbmUgZGlyZWN0b3J5ICovCisJaW5vX3QgaW51bWJlcjsKKwlzdHJ1Y3QgY29tcG9uZW50X25hbWUgY2lLZXk7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlwLT5pX3NiOworCisJY2lLZXkubmFtZSA9CisJICAgICh3Y2hhcl90ICopIGttYWxsb2MoKEpGU19OQU1FX01BWCArIDEpICogc2l6ZW9mKHdjaGFyX3QpLAorCQkJCUdGUF9OT0ZTKTsKKwlpZiAoY2lLZXkubmFtZSA9PSAwKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBkdFNlYXJjaF9FeGl0MjsKKwl9CisKKworCS8qIHVwcGVyY2FzZSBzZWFyY2gga2V5IGZvciBjLWkgZGlyZWN0b3J5ICovCisJVW5pU3RyY3B5KGNpS2V5Lm5hbWUsIGtleS0+bmFtZSk7CisJY2lLZXkubmFtbGVuID0ga2V5LT5uYW1sZW47CisKKwkvKiBvbmx5IHVwcGVyY2FzZSBpZiBjYXNlLWluc2Vuc2l0aXZlIHN1cHBvcnQgaXMgb24gKi8KKwlpZiAoKEpGU19TQkkoc2IpLT5tbnRmbGFnICYgSkZTX09TMikgPT0gSkZTX09TMikgeworCQljaVRvVXBwZXIoJmNpS2V5KTsKKwl9CisJQlRfQ0xSKGJ0c3RhY2spOwkvKiByZXNldCBzdGFjayAqLworCisJLyogaW5pdCBsZXZlbCBjb3VudCBmb3IgbWF4IHBhZ2VzIHRvIHNwbGl0ICovCisJYnRzdGFjay0+bnNwbGl0ID0gMTsKKworCS8qCisJICogICAgICBzZWFyY2ggZG93biB0cmVlIGZyb20gcm9vdDoKKwkgKgorCSAqIGJldHdlZW4gdHdvIGNvbnNlY3V0aXZlIGVudHJpZXMgb2YgPEtpLCBQaT4gYW5kIDxLaiwgUGo+IG9mCisJICogaW50ZXJuYWwgcGFnZSwgY2hpbGQgcGFnZSBQaSBjb250YWlucyBlbnRyeSB3aXRoIGssIEtpIDw9IEsgPCBLai4KKwkgKgorCSAqIGlmIGVudHJ5IHdpdGggc2VhcmNoIGtleSBLIGlzIG5vdCBmb3VuZAorCSAqIGludGVybmFsIHBhZ2Ugc2VhcmNoIGZpbmQgdGhlIGVudHJ5IHdpdGggbGFyZ2VzdCBrZXkgS2kKKwkgKiBsZXNzIHRoYW4gSyB3aGljaCBwb2ludCB0byB0aGUgY2hpbGQgcGFnZSB0byBzZWFyY2g7CisJICogbGVhZiBwYWdlIHNlYXJjaCBmaW5kIHRoZSBlbnRyeSB3aXRoIHNtYWxsZXN0IGtleSBLagorCSAqIGdyZWF0ZXIgdGhhbiBLIHNvIHRoYXQgdGhlIHJldHVybmVkIGluZGV4IGlzIHRoZSBwb3NpdGlvbiBvZgorCSAqIHRoZSBlbnRyeSB0byBiZSBzaGlmdGVkIHJpZ2h0IGZvciBpbnNlcnRpb24gb2YgbmV3IGVudHJ5LgorCSAqIGZvciBlbXB0eSB0cmVlLCBzZWFyY2gga2V5IGlzIGdyZWF0ZXIgdGhhbiBhbnkga2V5IG9mIHRoZSB0cmVlLgorCSAqCisJICogYnkgY29udmVudGlvbiwgcm9vdCBibiA9IDAuCisJICovCisJZm9yIChibiA9IDA7OykgeworCQkvKiBnZXQvcGluIHRoZSBwYWdlIHRvIHNlYXJjaCAqLworCQlEVF9HRVRQQUdFKGlwLCBibiwgbXAsIHBzaXplLCBwLCByYyk7CisJCWlmIChyYykKKwkJCWdvdG8gZHRTZWFyY2hfRXhpdDE7CisKKwkJLyogZ2V0IHNvcnRlZCBlbnRyeSB0YWJsZSBvZiB0aGUgcGFnZSAqLworCQlzdGJsID0gRFRfR0VUU1RCTChwKTsKKworCQkvKgorCQkgKiBiaW5hcnkgc2VhcmNoIHdpdGggc2VhcmNoIGtleSBLIG9uIHRoZSBjdXJyZW50IHBhZ2UuCisJCSAqLworCQlmb3IgKGJhc2UgPSAwLCBsaW0gPSBwLT5oZWFkZXIubmV4dGluZGV4OyBsaW07IGxpbSA+Pj0gMSkgeworCQkJaW5kZXggPSBiYXNlICsgKGxpbSA+PiAxKTsKKworCQkJaWYgKHAtPmhlYWRlci5mbGFnICYgQlRfTEVBRikgeworCQkJCS8qIHVwcGVyY2FzZSBsZWFmIG5hbWUgdG8gY29tcGFyZSAqLworCQkJCWNtcCA9CisJCQkJICAgIGNpQ29tcGFyZSgmY2lLZXksIHAsIHN0YmxbaW5kZXhdLAorCQkJCQkgICAgICBKRlNfU0JJKHNiKS0+bW50ZmxhZyk7CisJCQl9IGVsc2UgeworCQkJCS8qIHJvdXRlciBrZXkgaXMgaW4gdXBwZXJjYXNlICovCisKKwkJCQljbXAgPSBkdENvbXBhcmUoJmNpS2V5LCBwLCBzdGJsW2luZGV4XSk7CisKKworCQkJfQorCQkJaWYgKGNtcCA9PSAwKSB7CisJCQkJLyoKKwkJCQkgKiAgICAgIHNlYXJjaCBoaXQKKwkJCQkgKi8KKwkJCQkvKiBzZWFyY2ggaGl0IC0gbGVhZiBwYWdlOgorCQkJCSAqIHJldHVybiB0aGUgZW50cnkgZm91bmQKKwkJCQkgKi8KKwkJCQlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9MRUFGKSB7CisJCQkJCWludW1iZXIgPSBsZTMyX3RvX2NwdSgKKwkJCSgoc3RydWN0IGxkdGVudHJ5ICopICYgcC0+c2xvdFtzdGJsW2luZGV4XV0pLT5pbnVtYmVyKTsKKworCQkJCQkvKgorCQkJCQkgKiBzZWFyY2ggZm9yIEpGU19MT09LVVAKKwkJCQkJICovCisJCQkJCWlmIChmbGFnID09IEpGU19MT09LVVApIHsKKwkJCQkJCSpkYXRhID0gaW51bWJlcjsKKwkJCQkJCXJjID0gMDsKKwkJCQkJCWdvdG8gb3V0OworCQkJCQl9CisKKwkJCQkJLyoKKwkJCQkJICogc2VhcmNoIGZvciBKRlNfQ1JFQVRFCisJCQkJCSAqLworCQkJCQlpZiAoZmxhZyA9PSBKRlNfQ1JFQVRFKSB7CisJCQkJCQkqZGF0YSA9IGludW1iZXI7CisJCQkJCQlyYyA9IC1FRVhJU1Q7CisJCQkJCQlnb3RvIG91dDsKKwkJCQkJfQorCisJCQkJCS8qCisJCQkJCSAqIHNlYXJjaCBmb3IgSkZTX1JFTU9WRSBvciBKRlNfUkVOQU1FCisJCQkJCSAqLworCQkJCQlpZiAoKGZsYWcgPT0gSkZTX1JFTU9WRSB8fAorCQkJCQkgICAgIGZsYWcgPT0gSkZTX1JFTkFNRSkgJiYKKwkJCQkJICAgICpkYXRhICE9IGludW1iZXIpIHsKKwkJCQkJCXJjID0gLUVTVEFMRTsKKwkJCQkJCWdvdG8gb3V0OworCQkJCQl9CisKKwkJCQkJLyoKKwkJCQkJICogSkZTX1JFTU9WRXxKRlNfRklORERJUnxKRlNfUkVOQU1FCisJCQkJCSAqLworCQkJCQkvKiBzYXZlIHNlYXJjaCByZXN1bHQgKi8KKwkJCQkJKmRhdGEgPSBpbnVtYmVyOworCQkJCQlidHNwID0gYnRzdGFjay0+dG9wOworCQkJCQlidHNwLT5ibiA9IGJuOworCQkJCQlidHNwLT5pbmRleCA9IGluZGV4OworCQkJCQlidHNwLT5tcCA9IG1wOworCisJCQkJCXJjID0gMDsKKwkJCQkJZ290byBkdFNlYXJjaF9FeGl0MTsKKwkJCQl9CisKKwkJCQkvKiBzZWFyY2ggaGl0IC0gaW50ZXJuYWwgcGFnZToKKwkJCQkgKiBkZXNjZW5kL3NlYXJjaCBpdHMgY2hpbGQgcGFnZQorCQkJCSAqLworCQkJCWdvdG8gZ2V0Q2hpbGQ7CisJCQl9CisKKwkJCWlmIChjbXAgPiAwKSB7CisJCQkJYmFzZSA9IGluZGV4ICsgMTsKKwkJCQktLWxpbTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqICAgICAgc2VhcmNoIG1pc3MKKwkJICoKKwkJICogYmFzZSBpcyB0aGUgc21hbGxlc3QgaW5kZXggd2l0aCBrZXkgKEtqKSBncmVhdGVyIHRoYW4KKwkJICogc2VhcmNoIGtleSAoSykgYW5kIG1heSBiZSB6ZXJvIG9yIChtYXhpbmRleCArIDEpIGluZGV4LgorCQkgKi8KKwkJLyoKKwkJICogc2VhcmNoIG1pc3MgLSBsZWFmIHBhZ2UKKwkJICoKKwkJICogcmV0dXJuIGxvY2F0aW9uIG9mIGVudHJ5IChiYXNlKSB3aGVyZSBuZXcgZW50cnkgd2l0aAorCQkgKiBzZWFyY2gga2V5IEsgaXMgdG8gYmUgaW5zZXJ0ZWQuCisJCSAqLworCQlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9MRUFGKSB7CisJCQkvKgorCQkJICogc2VhcmNoIGZvciBKRlNfTE9PS1VQLCBKRlNfUkVNT1ZFLCBvciBKRlNfUkVOQU1FCisJCQkgKi8KKwkJCWlmIChmbGFnID09IEpGU19MT09LVVAgfHwgZmxhZyA9PSBKRlNfUkVNT1ZFIHx8CisJCQkgICAgZmxhZyA9PSBKRlNfUkVOQU1FKSB7CisJCQkJcmMgPSAtRU5PRU5UOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQkvKgorCQkJICogc2VhcmNoIGZvciBKRlNfQ1JFQVRFfEpGU19GSU5ERElSOgorCQkJICoKKwkJCSAqIHNhdmUgc2VhcmNoIHJlc3VsdAorCQkJICovCisJCQkqZGF0YSA9IDA7CisJCQlidHNwID0gYnRzdGFjay0+dG9wOworCQkJYnRzcC0+Ym4gPSBibjsKKwkJCWJ0c3AtPmluZGV4ID0gYmFzZTsKKwkJCWJ0c3AtPm1wID0gbXA7CisKKwkJCXJjID0gMDsKKwkJCWdvdG8gZHRTZWFyY2hfRXhpdDE7CisJCX0KKworCQkvKgorCQkgKiBzZWFyY2ggbWlzcyAtIGludGVybmFsIHBhZ2UKKwkJICoKKwkJICogaWYgYmFzZSBpcyBub24temVybywgZGVjcmVtZW50IGJhc2UgYnkgb25lIHRvIGdldCB0aGUgcGFyZW50CisJCSAqIGVudHJ5IG9mIHRoZSBjaGlsZCBwYWdlIHRvIHNlYXJjaC4KKwkJICovCisJCWluZGV4ID0gYmFzZSA/IGJhc2UgLSAxIDogYmFzZTsKKworCQkvKgorCQkgKiBnbyBkb3duIHRvIGNoaWxkIHBhZ2UKKwkJICovCisJICAgICAgZ2V0Q2hpbGQ6CisJCS8qIHVwZGF0ZSBtYXguIG51bWJlciBvZiBwYWdlcyB0byBzcGxpdCAqLworCQlpZiAoQlRfU1RBQ0tfRlVMTChidHN0YWNrKSkgeworCQkJLyogU29tZXRoaW5nJ3MgY29ycnVwdGVkLCBtYXJrIGZpbGVzeXRlbSBkaXJ0eSBzbworCQkJICogY2hrZHNrIHdpbGwgZml4IGl0LgorCQkJICovCisJCQlqZnNfZXJyb3Ioc2IsICJzdGFjayBvdmVycnVuIGluIGR0U2VhcmNoISIpOworCQkJQlRfU1RBQ0tfRFVNUChidHN0YWNrKTsKKwkJCXJjID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisJCWJ0c3RhY2stPm5zcGxpdCsrOworCisJCS8qIHB1c2ggKGJuLCBpbmRleCkgb2YgdGhlIHBhcmVudCBwYWdlL2VudHJ5ICovCisJCUJUX1BVU0goYnRzdGFjaywgYm4sIGluZGV4KTsKKworCQkvKiBnZXQgdGhlIGNoaWxkIHBhZ2UgYmxvY2sgbnVtYmVyICovCisJCXB4ZCA9IChweGRfdCAqKSAmIHAtPnNsb3Rbc3RibFtpbmRleF1dOworCQlibiA9IGFkZHJlc3NQWEQocHhkKTsKKwkJcHNpemUgPSBsZW5ndGhQWEQocHhkKSA8PCBKRlNfU0JJKGlwLT5pX3NiKS0+bDJic2l6ZTsKKworCQkvKiB1bnBpbiB0aGUgcGFyZW50IHBhZ2UgKi8KKwkJRFRfUFVUUEFHRShtcCk7CisJfQorCisgICAgICBvdXQ6CisJRFRfUFVUUEFHRShtcCk7CisKKyAgICAgIGR0U2VhcmNoX0V4aXQxOgorCisJa2ZyZWUoY2lLZXkubmFtZSk7CisKKyAgICAgIGR0U2VhcmNoX0V4aXQyOgorCisJcmV0dXJuIHJjOworfQorCisKKy8qCisgKglkdEluc2VydCgpCisgKgorICogZnVuY3Rpb246IGluc2VydCBhbiBlbnRyeSB0byBkaXJlY3RvcnkgdHJlZQorICoKKyAqIHBhcmFtZXRlcjoKKyAqCisgKiByZXR1cm46IDAgLSBzdWNjZXNzOworICoJICAgZXJybm8gLSBmYWlsdXJlOworICovCitpbnQgZHRJbnNlcnQodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLAorCSBzdHJ1Y3QgY29tcG9uZW50X25hbWUgKiBuYW1lLCBpbm9fdCAqIGZzbiwgc3RydWN0IGJ0c3RhY2sgKiBidHN0YWNrKQoreworCWludCByYyA9IDA7CisJc3RydWN0IG1ldGFwYWdlICptcDsJLyogbWV0YS1wYWdlIGJ1ZmZlciAqLworCWR0cGFnZV90ICpwOwkJLyogYmFzZSBCKy10cmVlIGluZGV4IHBhZ2UgKi8KKwlzNjQgYm47CisJaW50IGluZGV4OworCXN0cnVjdCBkdHNwbGl0IHNwbGl0OwkvKiBzcGxpdCBpbmZvcm1hdGlvbiAqLworCWRkYXRhX3QgZGF0YTsKKwlzdHJ1Y3QgZHRfbG9jayAqZHRsY2s7CisJaW50IG47CisJc3RydWN0IHRsb2NrICp0bGNrOworCXN0cnVjdCBsdiAqbHY7CisKKwkvKgorCSAqICAgICAgcmV0cmlldmUgc2VhcmNoIHJlc3VsdAorCSAqCisJICogZHRTZWFyY2goKSByZXR1cm5zIChsZWFmIHBhZ2UgcGlubmVkLCBpbmRleCBhdCB3aGljaCB0byBpbnNlcnQpLgorCSAqIG4uYi4gZHRTZWFyY2goKSBtYXkgcmV0dXJuIGluZGV4IG9mIChtYXhpbmRleCArIDEpIG9mCisJICogdGhlIGZ1bGwgcGFnZS4KKwkgKi8KKwlEVF9HRVRTRUFSQ0goaXAsIGJ0c3RhY2stPnRvcCwgYm4sIG1wLCBwLCBpbmRleCk7CisKKwkvKgorCSAqICAgICAgaW5zZXJ0IGVudHJ5IGZvciBuZXcga2V5CisJICovCisJaWYgKERPX0lOREVYKGlwKSkgeworCQlpZiAoSkZTX0lQKGlwKS0+bmV4dF9pbmRleCA9PSBESVJFTkQpIHsKKwkJCURUX1BVVFBBR0UobXApOworCQkJcmV0dXJuIC1FTUxJTks7CisJCX0KKwkJbiA9IE5EVExFQUYobmFtZS0+bmFtbGVuKTsKKwkJZGF0YS5sZWFmLnRpZCA9IHRpZDsKKwkJZGF0YS5sZWFmLmlwID0gaXA7CisJfSBlbHNlIHsKKwkJbiA9IE5EVExFQUZfTEVHQUNZKG5hbWUtPm5hbWxlbik7CisJCWRhdGEubGVhZi5pcCA9IE5VTEw7CS8qIHNpZ25pZmllcyBsZWdhY3kgZGlyZWN0b3J5IGZvcm1hdCAqLworCX0KKwlkYXRhLmxlYWYuaW5vID0gKmZzbjsKKworCS8qCisJICogICAgICBsZWFmIHBhZ2UgZG9lcyBub3QgaGF2ZSBlbm91Z2ggcm9vbSBmb3IgbmV3IGVudHJ5OgorCSAqCisJICogICAgICBleHRlbmQvc3BsaXQgdGhlIGxlYWYgcGFnZTsKKwkgKgorCSAqIGR0U3BsaXRVcCgpIHdpbGwgaW5zZXJ0IHRoZSBlbnRyeSBhbmQgdW5waW4gdGhlIGxlYWYgcGFnZS4KKwkgKi8KKwlpZiAobiA+IHAtPmhlYWRlci5mcmVlY250KSB7CisJCXNwbGl0Lm1wID0gbXA7CisJCXNwbGl0LmluZGV4ID0gaW5kZXg7CisJCXNwbGl0Lm5zbG90ID0gbjsKKwkJc3BsaXQua2V5ID0gbmFtZTsKKwkJc3BsaXQuZGF0YSA9ICZkYXRhOworCQlyYyA9IGR0U3BsaXRVcCh0aWQsIGlwLCAmc3BsaXQsIGJ0c3RhY2spOworCQlyZXR1cm4gcmM7CisJfQorCisJLyoKKwkgKiAgICAgIGxlYWYgcGFnZSBkb2VzIGhhdmUgZW5vdWdoIHJvb20gZm9yIG5ldyBlbnRyeToKKwkgKgorCSAqICAgICAgaW5zZXJ0IHRoZSBuZXcgZGF0YSBlbnRyeSBpbnRvIHRoZSBsZWFmIHBhZ2U7CisJICovCisJQlRfTUFSS19ESVJUWShtcCwgaXApOworCS8qCisJICogYWNxdWlyZSBhIHRyYW5zYWN0aW9uIGxvY2sgb24gdGhlIGxlYWYgcGFnZQorCSAqLworCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgbXAsIHRsY2tEVFJFRSB8IHRsY2tFTlRSWSk7CisJZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgJiB0bGNrLT5sb2NrOworCUFTU0VSVChkdGxjay0+aW5kZXggPT0gMCk7CisJbHYgPSAmIGR0bGNrLT5sdlswXTsKKworCS8qIGxpbmVsb2NrIGhlYWRlciAqLworCWx2LT5vZmZzZXQgPSAwOworCWx2LT5sZW5ndGggPSAxOworCWR0bGNrLT5pbmRleCsrOworCisJZHRJbnNlcnRFbnRyeShwLCBpbmRleCwgbmFtZSwgJmRhdGEsICZkdGxjayk7CisKKwkvKiBsaW5lbG9jayBzdGJsIG9mIG5vbi1yb290IGxlYWYgcGFnZSAqLworCWlmICghKHAtPmhlYWRlci5mbGFnICYgQlRfUk9PVCkpIHsKKwkJaWYgKGR0bGNrLT5pbmRleCA+PSBkdGxjay0+bWF4Y250KQorCQkJZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgdHhMaW5lbG9jayhkdGxjayk7CisJCWx2ID0gJiBkdGxjay0+bHZbZHRsY2stPmluZGV4XTsKKwkJbiA9IGluZGV4ID4+IEwyRFRTTE9UU0laRTsKKwkJbHYtPm9mZnNldCA9IHAtPmhlYWRlci5zdGJsaW5kZXggKyBuOworCQlsdi0+bGVuZ3RoID0KKwkJICAgICgocC0+aGVhZGVyLm5leHRpbmRleCAtIDEpID4+IEwyRFRTTE9UU0laRSkgLSBuICsgMTsKKwkJZHRsY2stPmluZGV4Kys7CisJfQorCisJLyogdW5waW4gdGhlIGxlYWYgcGFnZSAqLworCURUX1BVVFBBR0UobXApOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqCWR0U3BsaXRVcCgpCisgKgorICogZnVuY3Rpb246IHByb3BhZ2F0ZSBpbnNlcnRpb24gYm90dG9tIHVwOworICoKKyAqIHBhcmFtZXRlcjoKKyAqCisgKiByZXR1cm46IDAgLSBzdWNjZXNzOworICoJICAgZXJybm8gLSBmYWlsdXJlOworICogCWxlYWYgcGFnZSB1bnBpbm5lZDsKKyAqLworc3RhdGljIGludCBkdFNwbGl0VXAodGlkX3QgdGlkLAorCSAgc3RydWN0IGlub2RlICppcCwgc3RydWN0IGR0c3BsaXQgKiBzcGxpdCwgc3RydWN0IGJ0c3RhY2sgKiBidHN0YWNrKQoreworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpID0gSkZTX1NCSShpcC0+aV9zYik7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKnNtcDsKKwlkdHBhZ2VfdCAqc3A7CQkvKiBzcGxpdCBwYWdlICovCisJc3RydWN0IG1ldGFwYWdlICpybXA7CisJZHRwYWdlX3QgKnJwOwkJLyogbmV3IHJpZ2h0IHBhZ2Ugc3BsaXQgZnJvbSBzcCAqLworCXB4ZF90IHJweGQ7CQkvKiBuZXcgcmlnaHQgcGFnZSBleHRlbnQgZGVzY3JpcHRvciAqLworCXN0cnVjdCBtZXRhcGFnZSAqbG1wOworCWR0cGFnZV90ICpscDsJCS8qIGxlZnQgY2hpbGQgcGFnZSAqLworCWludCBza2lwOwkJLyogaW5kZXggb2YgZW50cnkgb2YgaW5zZXJ0aW9uICovCisJc3RydWN0IGJ0ZnJhbWUgKnBhcmVudDsJLyogcGFyZW50IHBhZ2UgZW50cnkgb24gdHJhdmVyc2Ugc3RhY2sgKi8KKwlzNjQgeGFkZHIsIG54YWRkcjsKKwlpbnQgeGxlbiwgeHNpemU7CisJc3RydWN0IHB4ZGxpc3QgcHhkbGlzdDsKKwlweGRfdCAqcHhkOworCXN0cnVjdCBjb21wb25lbnRfbmFtZSBrZXkgPSB7IDAsIE5VTEwgfTsKKwlkZGF0YV90ICpkYXRhID0gc3BsaXQtPmRhdGE7CisJaW50IG47CisJc3RydWN0IGR0X2xvY2sgKmR0bGNrOworCXN0cnVjdCB0bG9jayAqdGxjazsKKwlzdHJ1Y3QgbHYgKmx2OworCWludCBxdW90YV9hbGxvY2F0aW9uID0gMDsKKworCS8qIGdldCBzcGxpdCBwYWdlICovCisJc21wID0gc3BsaXQtPm1wOworCXNwID0gRFRfUEFHRShpcCwgc21wKTsKKworCWtleS5uYW1lID0KKwkgICAgKHdjaGFyX3QgKikga21hbGxvYygoSkZTX05BTUVfTUFYICsgMikgKiBzaXplb2Yod2NoYXJfdCksCisJCQkJR0ZQX05PRlMpOworCWlmIChrZXkubmFtZSA9PSAwKSB7CisJCURUX1BVVFBBR0Uoc21wKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGR0U3BsaXRVcF9FeGl0OworCX0KKworCS8qCisJICogICAgICBzcGxpdCBsZWFmIHBhZ2UKKwkgKgorCSAqIFRoZSBzcGxpdCByb3V0aW5lcyBpbnNlcnQgdGhlIG5ldyBlbnRyeSwgYW5kCisJICogYWNxdWlyZSB0eExvY2sgYXMgYXBwcm9wcmlhdGUuCisJICovCisJLyoKKwkgKiAgICAgIHNwbGl0IHJvb3QgbGVhZiBwYWdlOgorCSAqLworCWlmIChzcC0+aGVhZGVyLmZsYWcgJiBCVF9ST09UKSB7CisJCS8qCisJCSAqIGFsbG9jYXRlIGEgc2luZ2xlIGV4dGVudCBjaGlsZCBwYWdlCisJCSAqLworCQl4bGVuID0gMTsKKwkJbiA9IHNiaS0+YnNpemUgPj4gTDJEVFNMT1RTSVpFOworCQluIC09IChuICsgMzEpID4+IEwyRFRTTE9UU0laRTsJLyogc3RibCBzaXplICovCisJCW4gLT0gRFRST09UTUFYU0xPVCAtIHNwLT5oZWFkZXIuZnJlZWNudDsgLyogaGVhZGVyICsgZW50cmllcyAqLworCQlpZiAobiA8PSBzcGxpdC0+bnNsb3QpCisJCQl4bGVuKys7CisJCWlmICgocmMgPSBkYkFsbG9jKGlwLCAwLCAoczY0KSB4bGVuLCAmeGFkZHIpKSkgeworCQkJRFRfUFVUUEFHRShzbXApOworCQkJZ290byBmcmVlS2V5TmFtZTsKKwkJfQorCisJCXB4ZGxpc3QubWF4bnB4ZCA9IDE7CisJCXB4ZGxpc3QubnB4ZCA9IDA7CisJCXB4ZCA9ICZweGRsaXN0LnB4ZFswXTsKKwkJUFhEYWRkcmVzcyhweGQsIHhhZGRyKTsKKwkJUFhEbGVuZ3RoKHB4ZCwgeGxlbik7CisJCXNwbGl0LT5weGRsaXN0ID0gJnB4ZGxpc3Q7CisJCXJjID0gZHRTcGxpdFJvb3QodGlkLCBpcCwgc3BsaXQsICZybXApOworCisJCWlmIChyYykKKwkJCWRiRnJlZShpcCwgeGFkZHIsIHhsZW4pOworCQllbHNlCisJCQlEVF9QVVRQQUdFKHJtcCk7CisKKwkJRFRfUFVUUEFHRShzbXApOworCisJCWdvdG8gZnJlZUtleU5hbWU7CisJfQorCisJLyoKKwkgKiAgICAgIGV4dGVuZCBmaXJzdCBsZWFmIHBhZ2UKKwkgKgorCSAqIGV4dGVuZCB0aGUgMXN0IGV4dGVudCBpZiBsZXNzIHRoYW4gYnVmZmVyIHBhZ2Ugc2l6ZQorCSAqIChkdEV4dGVuZFBhZ2UoKSByZXVybnMgbGVhZiBwYWdlIHVucGlubmVkKQorCSAqLworCXB4ZCA9ICZzcC0+aGVhZGVyLnNlbGY7CisJeGxlbiA9IGxlbmd0aFBYRChweGQpOworCXhzaXplID0geGxlbiA8PCBzYmktPmwyYnNpemU7CisJaWYgKHhzaXplIDwgUFNJWkUpIHsKKwkJeGFkZHIgPSBhZGRyZXNzUFhEKHB4ZCk7CisJCW4gPSB4c2l6ZSA+PiBMMkRUU0xPVFNJWkU7CisJCW4gLT0gKG4gKyAzMSkgPj4gTDJEVFNMT1RTSVpFOwkvKiBzdGJsIHNpemUgKi8KKwkJaWYgKChuICsgc3AtPmhlYWRlci5mcmVlY250KSA8PSBzcGxpdC0+bnNsb3QpCisJCQluID0geGxlbiArICh4bGVuIDw8IDEpOworCQllbHNlCisJCQluID0geGxlbjsKKworCQkvKiBBbGxvY2F0ZSBibG9ja3MgdG8gcXVvdGEuICovCisJCWlmIChEUVVPVF9BTExPQ19CTE9DSyhpcCwgbikpIHsKKwkJCXJjID0gLUVEUVVPVDsKKwkJCWdvdG8gZXh0ZW5kT3V0OworCQl9CisJCXF1b3RhX2FsbG9jYXRpb24gKz0gbjsKKworCQlpZiAoKHJjID0gZGJSZUFsbG9jKHNiaS0+aXBibWFwLCB4YWRkciwgKHM2NCkgeGxlbiwKKwkJCQkgICAgKHM2NCkgbiwgJm54YWRkcikpKQorCQkJZ290byBleHRlbmRPdXQ7CisKKwkJcHhkbGlzdC5tYXhucHhkID0gMTsKKwkJcHhkbGlzdC5ucHhkID0gMDsKKwkJcHhkID0gJnB4ZGxpc3QucHhkWzBdOworCQlQWERhZGRyZXNzKHB4ZCwgbnhhZGRyKQorCQkgICAgUFhEbGVuZ3RoKHB4ZCwgeGxlbiArIG4pOworCQlzcGxpdC0+cHhkbGlzdCA9ICZweGRsaXN0OworCQlpZiAoKHJjID0gZHRFeHRlbmRQYWdlKHRpZCwgaXAsIHNwbGl0LCBidHN0YWNrKSkpIHsKKwkJCW54YWRkciA9IGFkZHJlc3NQWEQocHhkKTsKKwkJCWlmICh4YWRkciAhPSBueGFkZHIpIHsKKwkJCQkvKiBmcmVlIHJlbG9jYXRlZCBleHRlbnQgKi8KKwkJCQl4bGVuID0gbGVuZ3RoUFhEKHB4ZCk7CisJCQkJZGJGcmVlKGlwLCBueGFkZHIsIChzNjQpIHhsZW4pOworCQkJfSBlbHNlIHsKKwkJCQkvKiBmcmVlIGV4dGVuZGVkIGRlbHRhICovCisJCQkJeGxlbiA9IGxlbmd0aFBYRChweGQpIC0gbjsKKwkJCQl4YWRkciA9IGFkZHJlc3NQWEQocHhkKSArIHhsZW47CisJCQkJZGJGcmVlKGlwLCB4YWRkciwgKHM2NCkgbik7CisJCQl9CisJCX0KKworCSAgICAgIGV4dGVuZE91dDoKKwkJRFRfUFVUUEFHRShzbXApOworCQlnb3RvIGZyZWVLZXlOYW1lOworCX0KKworCS8qCisJICogICAgICBzcGxpdCBsZWFmIHBhZ2UgPHNwPiBpbnRvIDxzcD4gYW5kIGEgbmV3IHJpZ2h0IHBhZ2UgPHJwPi4KKwkgKgorCSAqIHJldHVybiA8cnA+IHBpbm5lZCBhbmQgaXRzIGV4dGVudCBkZXNjcmlwdG9yIDxycHhkPgorCSAqLworCS8qCisJICogYWxsb2NhdGUgbmV3IGRpcmVjdG9yeSBwYWdlIGV4dGVudCBhbmQKKwkgKiBuZXcgaW5kZXggcGFnZShzKSB0byBjb3ZlciBwYWdlIHNwbGl0KHMpCisJICoKKwkgKiBhbGxvY2F0aW9uIGhpbnQ6ID8KKwkgKi8KKwluID0gYnRzdGFjay0+bnNwbGl0OworCXB4ZGxpc3QubWF4bnB4ZCA9IHB4ZGxpc3QubnB4ZCA9IDA7CisJeGxlbiA9IHNiaS0+bmJwZXJwYWdlOworCWZvciAocHhkID0gcHhkbGlzdC5weGQ7IG4gPiAwOyBuLS0sIHB4ZCsrKSB7CisJCWlmICgocmMgPSBkYkFsbG9jKGlwLCAwLCAoczY0KSB4bGVuLCAmeGFkZHIpKSA9PSAwKSB7CisJCQlQWERhZGRyZXNzKHB4ZCwgeGFkZHIpOworCQkJUFhEbGVuZ3RoKHB4ZCwgeGxlbik7CisJCQlweGRsaXN0Lm1heG5weGQrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJRFRfUFVUUEFHRShzbXApOworCisJCS8qIHVuZG8gYWxsb2NhdGlvbiAqLworCQlnb3RvIHNwbGl0T3V0OworCX0KKworCXNwbGl0LT5weGRsaXN0ID0gJnB4ZGxpc3Q7CisJaWYgKChyYyA9IGR0U3BsaXRQYWdlKHRpZCwgaXAsIHNwbGl0LCAmcm1wLCAmcnAsICZycHhkKSkpIHsKKwkJRFRfUFVUUEFHRShzbXApOworCisJCS8qIHVuZG8gYWxsb2NhdGlvbiAqLworCQlnb3RvIHNwbGl0T3V0OworCX0KKworCS8qCisJICogcHJvcGFnYXRlIHVwIHRoZSByb3V0ZXIgZW50cnkgZm9yIHRoZSBsZWFmIHBhZ2UganVzdCBzcGxpdAorCSAqCisJICogaW5zZXJ0IGEgcm91dGVyIGVudHJ5IGZvciB0aGUgbmV3IHBhZ2UgaW50byB0aGUgcGFyZW50IHBhZ2UsCisJICogcHJvcGFnYXRlIHRoZSBpbnNlcnQvc3BsaXQgdXAgdGhlIHRyZWUgYnkgd2Fsa2luZyBiYWNrIHRoZSBzdGFjaworCSAqIG9mIChibiBvZiBwYXJlbnQgcGFnZSwgaW5kZXggb2YgY2hpbGQgcGFnZSBlbnRyeSBpbiBwYXJlbnQgcGFnZSkKKwkgKiB0aGF0IHdlcmUgdHJhdmVyc2VkIGR1cmluZyB0aGUgc2VhcmNoIGZvciB0aGUgcGFnZSB0aGF0IHNwbGl0LgorCSAqCisJICogdGhlIHByb3BhZ2F0aW9uIG9mIGluc2VydC9zcGxpdCB1cCB0aGUgdHJlZSBzdG9wcyBpZiB0aGUgcm9vdAorCSAqIHNwbGl0cyBvciB0aGUgcGFnZSBpbnNlcnRlZCBpbnRvIGRvZXNuJ3QgaGF2ZSB0byBzcGxpdCB0byBob2xkCisJICogdGhlIG5ldyBlbnRyeS4KKwkgKgorCSAqIHRoZSBwYXJlbnQgZW50cnkgZm9yIHRoZSBzcGxpdCBwYWdlIHJlbWFpbnMgdGhlIHNhbWUsIGFuZAorCSAqIGEgbmV3IGVudHJ5IGlzIGluc2VydGVkIGF0IGl0cyByaWdodCB3aXRoIHRoZSBmaXJzdCBrZXkgYW5kCisJICogYmxvY2sgbnVtYmVyIG9mIHRoZSBuZXcgcmlnaHQgcGFnZS4KKwkgKgorCSAqIFRoZXJlIGFyZSBhIG1heGltdW0gb2YgNCBwYWdlcyBwaW5uZWQgYXQgYW55IHRpbWU6CisJICogdHdvIGNoaWxkcmVuLCBsZWZ0IHBhcmVudCBhbmQgcmlnaHQgcGFyZW50ICh3aGVuIHRoZSBwYXJlbnQgc3BsaXRzKS4KKwkgKiBrZWVwIHRoZSBjaGlsZCBwYWdlcyBwaW5uZWQgd2hpbGUgd29ya2luZyBvbiB0aGUgcGFyZW50LgorCSAqIG1ha2Ugc3VyZSB0aGF0IGFsbCBwaW5zIGFyZSByZWxlYXNlZCBhdCBleGl0LgorCSAqLworCXdoaWxlICgocGFyZW50ID0gQlRfUE9QKGJ0c3RhY2spKSAhPSBOVUxMKSB7CisJCS8qIHBhcmVudCBwYWdlIHNwZWNpZmllZCBieSBzdGFjayBmcmFtZSA8cGFyZW50PiAqLworCisJCS8qIGtlZXAgY3VycmVudCBjaGlsZCBwYWdlcyAoPGxwPiwgPHJwPikgcGlubmVkICovCisJCWxtcCA9IHNtcDsKKwkJbHAgPSBzcDsKKworCQkvKgorCQkgKiBpbnNlcnQgcm91dGVyIGVudHJ5IGluIHBhcmVudCBmb3IgbmV3IHJpZ2h0IGNoaWxkIHBhZ2UgPHJwPgorCQkgKi8KKwkJLyogZ2V0IHRoZSBwYXJlbnQgcGFnZSA8c3A+ICovCisJCURUX0dFVFBBR0UoaXAsIHBhcmVudC0+Ym4sIHNtcCwgUFNJWkUsIHNwLCByYyk7CisJCWlmIChyYykgeworCQkJRFRfUFVUUEFHRShsbXApOworCQkJRFRfUFVUUEFHRShybXApOworCQkJZ290byBzcGxpdE91dDsKKwkJfQorCisJCS8qCisJCSAqIFRoZSBuZXcga2V5IGVudHJ5IGdvZXMgT05FIEFGVEVSIHRoZSBpbmRleCBvZiBwYXJlbnQgZW50cnksCisJCSAqIGJlY2F1c2UgdGhlIHNwbGl0IHdhcyB0byB0aGUgcmlnaHQuCisJCSAqLworCQlza2lwID0gcGFyZW50LT5pbmRleCArIDE7CisKKwkJLyoKKwkJICogY29tcHV0ZSB0aGUga2V5IGZvciB0aGUgcm91dGVyIGVudHJ5CisJCSAqCisJCSAqIGtleSBzdWZmaXggY29tcHJlc3Npb246CisJCSAqIGZvciBpbnRlcm5hbCBwYWdlcyB0aGF0IGhhdmUgbGVhZiBwYWdlcyBhcyBjaGlsZHJlbiwKKwkJICogcmV0YWluIG9ubHkgd2hhdCdzIG5lZWRlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuCisJCSAqIHRoZSBuZXcgZW50cnkgYW5kIHRoZSBlbnRyeSBvbiB0aGUgcGFnZSB0byBpdHMgbGVmdC4KKwkJICogSWYgdGhlIGtleXMgY29tcGFyZSBlcXVhbCwgcmV0YWluIHRoZSBlbnRpcmUga2V5LgorCQkgKgorCQkgKiBub3RlIHRoYXQgY29tcHJlc3Npb24gaXMgcGVyZm9ybWVkIG9ubHkgYXQgY29tcHV0aW5nCisJCSAqIHJvdXRlciBrZXkgYXQgdGhlIGxvd2VzdCBpbnRlcm5hbCBsZXZlbC4KKwkJICogZnVydGhlciBjb21wcmVzc2lvbiBvZiB0aGUga2V5IGJldHdlZW4gcGFpcnMgb2YgaGlnaGVyCisJCSAqIGxldmVsIGludGVybmFsIHBhZ2VzIGxvc2VzIHRvbyBtdWNoIGluZm9ybWF0aW9uIGFuZAorCQkgKiB0aGUgc2VhcmNoIG1heSBmYWlsLgorCQkgKiAoZS5nLiwgdHdvIGFkamFjZW50IGxlYWYgcGFnZXMgb2Yge2EsIC4uLiwgeH0ge3h4LCAuLi4sfQorCQkgKiByZXN1bHRzIGluIHR3byBhZGphY2VudCBwYXJlbnQgZW50cmllcyAoYSkoeHgpLgorCQkgKiBpZiBzcGxpdCBvY2N1cnMgYmV0d2VlbiB0aGVzZSB0d28gZW50cmllcywgYW5kCisJCSAqIGlmIGNvbXByZXNzaW9uIGlzIGFwcGxpZWQsIHRoZSByb3V0ZXIga2V5IG9mIHBhcmVudCBlbnRyeQorCQkgKiBvZiByaWdodCBwYWdlICh4KSB3aWxsIGRpdmVydCBzZWFyY2ggZm9yIHggaW50byByaWdodAorCQkgKiBzdWJ0cmVlIGFuZCBtaXNzIHggaW4gdGhlIGxlZnQgc3VidHJlZS4pCisJCSAqCisJCSAqIHRoZSBlbnRpcmUga2V5IG11c3QgYmUgcmV0YWluZWQgZm9yIHRoZSBuZXh0LXRvLWxlZnRtb3N0CisJCSAqIGludGVybmFsIGtleSBhdCBhbnkgbGV2ZWwgb2YgdGhlIHRyZWUsIG9yIHNlYXJjaCBtYXkgZmFpbAorCQkgKiAoZS5nLiwgPykKKwkJICovCisJCXN3aXRjaCAocnAtPmhlYWRlci5mbGFnICYgQlRfVFlQRSkgeworCQljYXNlIEJUX0xFQUY6CisJCQkvKgorCQkJICogY29tcHV0ZSB0aGUgbGVuZ3RoIG9mIHByZWZpeCBmb3Igc3VmZml4IGNvbXByZXNzaW9uCisJCQkgKiBiZXR3ZWVuIGxhc3QgZW50cnkgb2YgbGVmdCBwYWdlIGFuZCBmaXJzdCBlbnRyeQorCQkJICogb2YgcmlnaHQgcGFnZQorCQkJICovCisJCQlpZiAoKHNwLT5oZWFkZXIuZmxhZyAmIEJUX1JPT1QgJiYgc2tpcCA+IDEpIHx8CisJCQkgICAgc3AtPmhlYWRlci5wcmV2ICE9IDAgfHwgc2tpcCA+IDEpIHsKKwkJCQkvKiBjb21wdXRlIHVwcGVyY2FzZSByb3V0ZXIgcHJlZml4IGtleSAqLworCQkJCXJjID0gY2lHZXRMZWFmUHJlZml4S2V5KGxwLAorCQkJCQkJCWxwLT5oZWFkZXIubmV4dGluZGV4LTEsCisJCQkJCQkJcnAsIDAsICZrZXksCisJCQkJCQkJc2JpLT5tbnRmbGFnKTsKKwkJCQlpZiAocmMpIHsKKwkJCQkJRFRfUFVUUEFHRShsbXApOworCQkJCQlEVF9QVVRQQUdFKHJtcCk7CisJCQkJCURUX1BVVFBBR0Uoc21wKTsKKwkJCQkJZ290byBzcGxpdE91dDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIG5leHQgdG8gbGVmdG1vc3QgZW50cnkgb2YKKwkJCQkgICBsb3dlc3QgaW50ZXJuYWwgbGV2ZWwgKi8KKworCQkJCS8qIGNvbXB1dGUgdXBwZXJjYXNlIHJvdXRlciBrZXkgKi8KKwkJCQlkdEdldEtleShycCwgMCwgJmtleSwgc2JpLT5tbnRmbGFnKTsKKwkJCQlrZXkubmFtZVtrZXkubmFtbGVuXSA9IDA7CisKKwkJCQlpZiAoKHNiaS0+bW50ZmxhZyAmIEpGU19PUzIpID09IEpGU19PUzIpCisJCQkJCWNpVG9VcHBlcigma2V5KTsKKwkJCX0KKworCQkJbiA9IE5EVElOVEVSTkFMKGtleS5uYW1sZW4pOworCQkJYnJlYWs7CisKKwkJY2FzZSBCVF9JTlRFUk5BTDoKKwkJCWR0R2V0S2V5KHJwLCAwLCAma2V5LCBzYmktPm1udGZsYWcpOworCQkJbiA9IE5EVElOVEVSTkFMKGtleS5uYW1sZW4pOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWpmc19lcnIoImR0U3BsaXRVcCgpOiBVRk8hIik7CisJCQlicmVhazsKKwkJfQorCisJCS8qIHVucGluIGxlZnQgY2hpbGQgcGFnZSAqLworCQlEVF9QVVRQQUdFKGxtcCk7CisKKwkJLyoKKwkJICogY29tcHV0ZSB0aGUgZGF0YSBmb3IgdGhlIHJvdXRlciBlbnRyeQorCQkgKi8KKwkJZGF0YS0+eGQgPSBycHhkOwkvKiBjaGlsZCBwYWdlIHhkICovCisKKwkJLyoKKwkJICogcGFyZW50IHBhZ2UgaXMgZnVsbCAtIHNwbGl0IHRoZSBwYXJlbnQgcGFnZQorCQkgKi8KKwkJaWYgKG4gPiBzcC0+aGVhZGVyLmZyZWVjbnQpIHsKKwkJCS8qIGluaXQgZm9yIHBhcmVudCBwYWdlIHNwbGl0ICovCisJCQlzcGxpdC0+bXAgPSBzbXA7CisJCQlzcGxpdC0+aW5kZXggPSBza2lwOwkvKiBpbmRleCBhdCBpbnNlcnQgKi8KKwkJCXNwbGl0LT5uc2xvdCA9IG47CisJCQlzcGxpdC0+a2V5ID0gJmtleTsKKwkJCS8qIHNwbGl0LT5kYXRhID0gZGF0YTsgKi8KKworCQkJLyogdW5waW4gcmlnaHQgY2hpbGQgcGFnZSAqLworCQkJRFRfUFVUUEFHRShybXApOworCisJCQkvKiBUaGUgc3BsaXQgcm91dGluZXMgaW5zZXJ0IHRoZSBuZXcgZW50cnksCisJCQkgKiBhY3F1aXJlIHR4TG9jayBhcyBhcHByb3ByaWF0ZS4KKwkJCSAqIHJldHVybiA8cnA+IHBpbm5lZCBhbmQgaXRzIGJsb2NrIG51bWJlciA8cmJuPi4KKwkJCSAqLworCQkJcmMgPSAoc3AtPmhlYWRlci5mbGFnICYgQlRfUk9PVCkgPworCQkJICAgIGR0U3BsaXRSb290KHRpZCwgaXAsIHNwbGl0LCAmcm1wKSA6CisJCQkgICAgZHRTcGxpdFBhZ2UodGlkLCBpcCwgc3BsaXQsICZybXAsICZycCwgJnJweGQpOworCQkJaWYgKHJjKSB7CisJCQkJRFRfUFVUUEFHRShzbXApOworCQkJCWdvdG8gc3BsaXRPdXQ7CisJCQl9CisKKwkJCS8qIHNtcCBhbmQgcm1wIGFyZSBwaW5uZWQgKi8KKwkJfQorCQkvKgorCQkgKiBwYXJlbnQgcGFnZSBpcyBub3QgZnVsbCAtIGluc2VydCByb3V0ZXIgZW50cnkgaW4gcGFyZW50IHBhZ2UKKwkJICovCisJCWVsc2UgeworCQkJQlRfTUFSS19ESVJUWShzbXAsIGlwKTsKKwkJCS8qCisJCQkgKiBhY3F1aXJlIGEgdHJhbnNhY3Rpb24gbG9jayBvbiB0aGUgcGFyZW50IHBhZ2UKKwkJCSAqLworCQkJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBzbXAsIHRsY2tEVFJFRSB8IHRsY2tFTlRSWSk7CisJCQlkdGxjayA9IChzdHJ1Y3QgZHRfbG9jayAqKSAmIHRsY2stPmxvY2s7CisJCQlBU1NFUlQoZHRsY2stPmluZGV4ID09IDApOworCQkJbHYgPSAmIGR0bGNrLT5sdlswXTsKKworCQkJLyogbGluZWxvY2sgaGVhZGVyICovCisJCQlsdi0+b2Zmc2V0ID0gMDsKKwkJCWx2LT5sZW5ndGggPSAxOworCQkJZHRsY2stPmluZGV4Kys7CisKKwkJCS8qIGxpbmVsb2NrIHN0Ymwgb2Ygbm9uLXJvb3QgcGFyZW50IHBhZ2UgKi8KKwkJCWlmICghKHNwLT5oZWFkZXIuZmxhZyAmIEJUX1JPT1QpKSB7CisJCQkJbHYrKzsKKwkJCQluID0gc2tpcCA+PiBMMkRUU0xPVFNJWkU7CisJCQkJbHYtPm9mZnNldCA9IHNwLT5oZWFkZXIuc3RibGluZGV4ICsgbjsKKwkJCQlsdi0+bGVuZ3RoID0KKwkJCQkgICAgKChzcC0+aGVhZGVyLm5leHRpbmRleCAtCisJCQkJICAgICAgMSkgPj4gTDJEVFNMT1RTSVpFKSAtIG4gKyAxOworCQkJCWR0bGNrLT5pbmRleCsrOworCQkJfQorCisJCQlkdEluc2VydEVudHJ5KHNwLCBza2lwLCAma2V5LCBkYXRhLCAmZHRsY2spOworCisJCQkvKiBleGl0IHByb3BhZ2F0ZSB1cCAqLworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiB1bnBpbiBjdXJyZW50IHNwbGl0IGFuZCBpdHMgcmlnaHQgcGFnZSAqLworCURUX1BVVFBBR0Uoc21wKTsKKwlEVF9QVVRQQUdFKHJtcCk7CisKKwkvKgorCSAqIGZyZWUgcmVtYWluaW5nIGV4dGVudHMgYWxsb2NhdGVkIGZvciBzcGxpdAorCSAqLworICAgICAgc3BsaXRPdXQ6CisJbiA9IHB4ZGxpc3QubnB4ZDsKKwlweGQgPSAmcHhkbGlzdC5weGRbbl07CisJZm9yICg7IG4gPCBweGRsaXN0Lm1heG5weGQ7IG4rKywgcHhkKyspCisJCWRiRnJlZShpcCwgYWRkcmVzc1BYRChweGQpLCAoczY0KSBsZW5ndGhQWEQocHhkKSk7CisKKyAgICAgIGZyZWVLZXlOYW1lOgorCWtmcmVlKGtleS5uYW1lKTsKKworCS8qIFJvbGxiYWNrIHF1b3RhIGFsbG9jYXRpb24gKi8KKwlpZiAocmMgJiYgcXVvdGFfYWxsb2NhdGlvbikKKwkJRFFVT1RfRlJFRV9CTE9DSyhpcCwgcXVvdGFfYWxsb2NhdGlvbik7CisKKyAgICAgIGR0U3BsaXRVcF9FeGl0OgorCisJcmV0dXJuIHJjOworfQorCisKKy8qCisgKglkdFNwbGl0UGFnZSgpCisgKgorICogZnVuY3Rpb246IFNwbGl0IGEgbm9uLXJvb3QgcGFnZSBvZiBhIGJ0cmVlLgorICoKKyAqIHBhcmFtZXRlcjoKKyAqCisgKiByZXR1cm46IDAgLSBzdWNjZXNzOworICoJICAgZXJybm8gLSBmYWlsdXJlOworICoJcmV0dXJuIHNwbGl0IGFuZCBuZXcgcGFnZSBwaW5uZWQ7CisgKi8KK3N0YXRpYyBpbnQgZHRTcGxpdFBhZ2UodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZHRzcGxpdCAqIHNwbGl0LAorCSAgICBzdHJ1Y3QgbWV0YXBhZ2UgKiogcm1wcCwgZHRwYWdlX3QgKiogcnBwLCBweGRfdCAqIHJweGRwKQoreworCWludCByYyA9IDA7CisJc3RydWN0IG1ldGFwYWdlICpzbXA7CisJZHRwYWdlX3QgKnNwOworCXN0cnVjdCBtZXRhcGFnZSAqcm1wOworCWR0cGFnZV90ICpycDsJCS8qIG5ldyByaWdodCBwYWdlIGFsbG9jYXRlZCAqLworCXM2NCByYm47CQkvKiBuZXcgcmlnaHQgcGFnZSBibG9jayBudW1iZXIgKi8KKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCWR0cGFnZV90ICpwOworCXM2NCBuZXh0Ym47CisJc3RydWN0IHB4ZGxpc3QgKnB4ZGxpc3Q7CisJcHhkX3QgKnB4ZDsKKwlpbnQgc2tpcCwgbmV4dGluZGV4LCBoYWxmLCBsZWZ0LCBueHQsIG9mZiwgc2k7CisJc3RydWN0IGxkdGVudHJ5ICpsZHRlbnRyeTsKKwlzdHJ1Y3QgaWR0ZW50cnkgKmlkdGVudHJ5OworCXU4ICpzdGJsOworCXN0cnVjdCBkdHNsb3QgKmY7CisJaW50IGZzaSwgc3RibHNpemU7CisJaW50IG47CisJc3RydWN0IGR0X2xvY2sgKnNkdGxjaywgKnJkdGxjazsKKwlzdHJ1Y3QgdGxvY2sgKnRsY2s7CisJc3RydWN0IGR0X2xvY2sgKmR0bGNrOworCXN0cnVjdCBsdiAqc2x2LCAqcmx2LCAqbHY7CisKKwkvKiBnZXQgc3BsaXQgcGFnZSAqLworCXNtcCA9IHNwbGl0LT5tcDsKKwlzcCA9IERUX1BBR0UoaXAsIHNtcCk7CisKKwkvKgorCSAqIGFsbG9jYXRlIHRoZSBuZXcgcmlnaHQgcGFnZSBmb3IgdGhlIHNwbGl0CisJICovCisJcHhkbGlzdCA9IHNwbGl0LT5weGRsaXN0OworCXB4ZCA9ICZweGRsaXN0LT5weGRbcHhkbGlzdC0+bnB4ZF07CisJcHhkbGlzdC0+bnB4ZCsrOworCXJibiA9IGFkZHJlc3NQWEQocHhkKTsKKwlybXAgPSBnZXRfbWV0YXBhZ2UoaXAsIHJibiwgUFNJWkUsIDEpOworCWlmIChybXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBBbGxvY2F0ZSBibG9ja3MgdG8gcXVvdGEuICovCisJaWYgKERRVU9UX0FMTE9DX0JMT0NLKGlwLCBsZW5ndGhQWEQocHhkKSkpIHsKKwkJcmVsZWFzZV9tZXRhcGFnZShybXApOworCQlyZXR1cm4gLUVEUVVPVDsKKwl9CisKKwlqZnNfaW5mbygiZHRTcGxpdFBhZ2U6IGlwOjB4JXAgc21wOjB4JXAgcm1wOjB4JXAiLCBpcCwgc21wLCBybXApOworCisJQlRfTUFSS19ESVJUWShybXAsIGlwKTsKKwkvKgorCSAqIGFjcXVpcmUgYSB0cmFuc2FjdGlvbiBsb2NrIG9uIHRoZSBuZXcgcmlnaHQgcGFnZQorCSAqLworCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgcm1wLCB0bGNrRFRSRUUgfCB0bGNrTkVXKTsKKwlyZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgJiB0bGNrLT5sb2NrOworCisJcnAgPSAoZHRwYWdlX3QgKikgcm1wLT5kYXRhOworCSpycHAgPSBycDsKKwlycC0+aGVhZGVyLnNlbGYgPSAqcHhkOworCisJQlRfTUFSS19ESVJUWShzbXAsIGlwKTsKKwkvKgorCSAqIGFjcXVpcmUgYSB0cmFuc2FjdGlvbiBsb2NrIG9uIHRoZSBzcGxpdCBwYWdlCisJICoKKwkgKiBhY3Rpb246CisJICovCisJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBzbXAsIHRsY2tEVFJFRSB8IHRsY2tFTlRSWSk7CisJc2R0bGNrID0gKHN0cnVjdCBkdF9sb2NrICopICYgdGxjay0+bG9jazsKKworCS8qIGxpbmVsb2NrIGhlYWRlciBvZiBzcGxpdCBwYWdlICovCisJQVNTRVJUKHNkdGxjay0+aW5kZXggPT0gMCk7CisJc2x2ID0gJiBzZHRsY2stPmx2WzBdOworCXNsdi0+b2Zmc2V0ID0gMDsKKwlzbHYtPmxlbmd0aCA9IDE7CisJc2R0bGNrLT5pbmRleCsrOworCisJLyoKKwkgKiBpbml0aWFsaXplL3VwZGF0ZSBzaWJsaW5nIHBvaW50ZXJzIGJldHdlZW4gc3AgYW5kIHJwCisJICovCisJbmV4dGJuID0gbGU2NF90b19jcHUoc3AtPmhlYWRlci5uZXh0KTsKKwlycC0+aGVhZGVyLm5leHQgPSBjcHVfdG9fbGU2NChuZXh0Ym4pOworCXJwLT5oZWFkZXIucHJldiA9IGNwdV90b19sZTY0KGFkZHJlc3NQWEQoJnNwLT5oZWFkZXIuc2VsZikpOworCXNwLT5oZWFkZXIubmV4dCA9IGNwdV90b19sZTY0KHJibik7CisKKwkvKgorCSAqIGluaXRpYWxpemUgbmV3IHJpZ2h0IHBhZ2UKKwkgKi8KKwlycC0+aGVhZGVyLmZsYWcgPSBzcC0+aGVhZGVyLmZsYWc7CisKKwkvKiBjb21wdXRlIHNvcnRlZCBlbnRyeSB0YWJsZSBhdCBzdGFydCBvZiBleHRlbnQgZGF0YSBhcmVhICovCisJcnAtPmhlYWRlci5uZXh0aW5kZXggPSAwOworCXJwLT5oZWFkZXIuc3RibGluZGV4ID0gMTsKKworCW4gPSBQU0laRSA+PiBMMkRUU0xPVFNJWkU7CisJcnAtPmhlYWRlci5tYXhzbG90ID0gbjsKKwlzdGJsc2l6ZSA9IChuICsgMzEpID4+IEwyRFRTTE9UU0laRTsJLyogaW4gdW5pdCBvZiBzbG90ICovCisKKwkvKiBpbml0IGZyZWVsaXN0ICovCisJZnNpID0gcnAtPmhlYWRlci5zdGJsaW5kZXggKyBzdGJsc2l6ZTsKKwlycC0+aGVhZGVyLmZyZWVsaXN0ID0gZnNpOworCXJwLT5oZWFkZXIuZnJlZWNudCA9IHJwLT5oZWFkZXIubWF4c2xvdCAtIGZzaTsKKworCS8qCisJICogICAgICBzZXF1ZW50aWFsIGFwcGVuZCBhdCB0YWlsOiBhcHBlbmQgd2l0aG91dCBzcGxpdAorCSAqCisJICogSWYgc3BsaXR0aW5nIHRoZSBsYXN0IHBhZ2Ugb24gYSBsZXZlbCBiZWNhdXNlIG9mIGFwcGVuZGluZworCSAqIGEgZW50cnkgdG8gaXQgKHNraXAgaXMgbWF4ZW50cnkpLCBpdCdzIGxpa2VseSB0aGF0IHRoZSBhY2Nlc3MgaXMKKwkgKiBzZXF1ZW50aWFsLiBBZGRpbmcgYW4gZW1wdHkgcGFnZSBvbiB0aGUgc2lkZSBvZiB0aGUgbGV2ZWwgaXMgbGVzcworCSAqIHdvcmsgYW5kIGNhbiBwdXNoIHRoZSBmaWxsIGZhY3RvciBtdWNoIGhpZ2hlciB0aGFuIG5vcm1hbC4KKwkgKiBJZiB3ZSdyZSB3cm9uZyBpdCdzIG5vIGJpZyBkZWFsLCB3ZSdsbCBqdXN0IGRvIHRoZSBzcGxpdCB0aGUgcmlnaHQKKwkgKiB3YXkgbmV4dCB0aW1lLgorCSAqIChJdCBtYXkgbG9vayBsaWtlIGl0J3MgZXF1YWxseSBlYXN5IHRvIGRvIGEgc2ltaWxhciBoYWNrIGZvcgorCSAqIHJldmVyc2Ugc29ydGVkIGRhdGEsIHRoYXQgaXMsIHNwbGl0IHRoZSB0cmVlIGxlZnQsCisJICogYnV0IGl0J3Mgbm90LiBCZSBteSBndWVzdC4pCisJICovCisJaWYgKG5leHRibiA9PSAwICYmIHNwbGl0LT5pbmRleCA9PSBzcC0+aGVhZGVyLm5leHRpbmRleCkgeworCQkvKiBsaW5lbG9jayBoZWFkZXIgKyBzdGJsIChmaXJzdCBzbG90KSBvZiBuZXcgcGFnZSAqLworCQlybHYgPSAmIHJkdGxjay0+bHZbcmR0bGNrLT5pbmRleF07CisJCXJsdi0+b2Zmc2V0ID0gMDsKKwkJcmx2LT5sZW5ndGggPSAyOworCQlyZHRsY2stPmluZGV4Kys7CisKKwkJLyoKKwkJICogaW5pdGlhbGl6ZSBmcmVlbGlzdCBvZiBuZXcgcmlnaHQgcGFnZQorCQkgKi8KKwkJZiA9ICZycC0+c2xvdFtmc2ldOworCQlmb3IgKGZzaSsrOyBmc2kgPCBycC0+aGVhZGVyLm1heHNsb3Q7IGYrKywgZnNpKyspCisJCQlmLT5uZXh0ID0gZnNpOworCQlmLT5uZXh0ID0gLTE7CisKKwkJLyogaW5zZXJ0IGVudHJ5IGF0IHRoZSBmaXJzdCBlbnRyeSBvZiB0aGUgbmV3IHJpZ2h0IHBhZ2UgKi8KKwkJZHRJbnNlcnRFbnRyeShycCwgMCwgc3BsaXQtPmtleSwgc3BsaXQtPmRhdGEsICZyZHRsY2spOworCisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogICAgICBub24tc2VxdWVudGlhbCBpbnNlcnQgKGF0IHBvc3NpYmx5IG1pZGRsZSBwYWdlKQorCSAqLworCisJLyoKKwkgKiB1cGRhdGUgcHJldiBwb2ludGVyIG9mIHByZXZpb3VzIHJpZ2h0IHNpYmxpbmcgcGFnZTsKKwkgKi8KKwlpZiAobmV4dGJuICE9IDApIHsKKwkJRFRfR0VUUEFHRShpcCwgbmV4dGJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKKwkJaWYgKHJjKSB7CisJCQlkaXNjYXJkX21ldGFwYWdlKHJtcCk7CisJCQlyZXR1cm4gcmM7CisJCX0KKworCQlCVF9NQVJLX0RJUlRZKG1wLCBpcCk7CisJCS8qCisJCSAqIGFjcXVpcmUgYSB0cmFuc2FjdGlvbiBsb2NrIG9uIHRoZSBuZXh0IHBhZ2UKKwkJICovCisJCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgbXAsIHRsY2tEVFJFRSB8IHRsY2tSRUxJTkspOworCQlqZnNfaW5mbygiZHRTcGxpdFBhZ2U6IHRsY2sgPSAweCVwLCBpcCA9IDB4JXAsIG1wPTB4JXAiLAorCQkJdGxjaywgaXAsIG1wKTsKKwkJZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgJiB0bGNrLT5sb2NrOworCisJCS8qIGxpbmVsb2NrIGhlYWRlciBvZiBwcmV2aW91cyByaWdodCBzaWJsaW5nIHBhZ2UgKi8KKwkJbHYgPSAmIGR0bGNrLT5sdltkdGxjay0+aW5kZXhdOworCQlsdi0+b2Zmc2V0ID0gMDsKKwkJbHYtPmxlbmd0aCA9IDE7CisJCWR0bGNrLT5pbmRleCsrOworCisJCXAtPmhlYWRlci5wcmV2ID0gY3B1X3RvX2xlNjQocmJuKTsKKworCQlEVF9QVVRQQUdFKG1wKTsKKwl9CisKKwkvKgorCSAqIHNwbGl0IHRoZSBkYXRhIGJldHdlZW4gdGhlIHNwbGl0IGFuZCByaWdodCBwYWdlcy4KKwkgKi8KKwlza2lwID0gc3BsaXQtPmluZGV4OworCWhhbGYgPSAoUFNJWkUgPj4gTDJEVFNMT1RTSVpFKSA+PiAxOwkvKiBzd2FnICovCisJbGVmdCA9IDA7CisKKwkvKgorCSAqICAgICAgY29tcHV0ZSBmaWxsIGZhY3RvciBmb3Igc3BsaXQgcGFnZXMKKwkgKgorCSAqIDxueHQ+IHRyYWNlcyB0aGUgbmV4dCBlbnRyeSB0byBtb3ZlIHRvIHJwCisJICogPG9mZj4gdHJhY2VzIHRoZSBuZXh0IGVudHJ5IHRvIHN0YXkgaW4gc3AKKwkgKi8KKwlzdGJsID0gKHU4ICopICYgc3AtPnNsb3Rbc3AtPmhlYWRlci5zdGJsaW5kZXhdOworCW5leHRpbmRleCA9IHNwLT5oZWFkZXIubmV4dGluZGV4OworCWZvciAobnh0ID0gb2ZmID0gMDsgbnh0IDwgbmV4dGluZGV4OyArK29mZikgeworCQlpZiAob2ZmID09IHNraXApCisJCQkvKiBjaGVjayBmb3IgZmlsbCBmYWN0b3Igd2l0aCBuZXcgZW50cnkgc2l6ZSAqLworCQkJbiA9IHNwbGl0LT5uc2xvdDsKKwkJZWxzZSB7CisJCQlzaSA9IHN0Ymxbbnh0XTsKKwkJCXN3aXRjaCAoc3AtPmhlYWRlci5mbGFnICYgQlRfVFlQRSkgeworCQkJY2FzZSBCVF9MRUFGOgorCQkJCWxkdGVudHJ5ID0gKHN0cnVjdCBsZHRlbnRyeSAqKSAmIHNwLT5zbG90W3NpXTsKKwkJCQlpZiAoRE9fSU5ERVgoaXApKQorCQkJCQluID0gTkRUTEVBRihsZHRlbnRyeS0+bmFtbGVuKTsKKwkJCQllbHNlCisJCQkJCW4gPSBORFRMRUFGX0xFR0FDWShsZHRlbnRyeS0+CisJCQkJCQkJICAgbmFtbGVuKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBCVF9JTlRFUk5BTDoKKwkJCQlpZHRlbnRyeSA9IChzdHJ1Y3QgaWR0ZW50cnkgKikgJiBzcC0+c2xvdFtzaV07CisJCQkJbiA9IE5EVElOVEVSTkFMKGlkdGVudHJ5LT5uYW1sZW4pOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCisJCQkrK254dDsJLyogYWR2YW5jZSB0byBuZXh0IGVudHJ5IHRvIG1vdmUgaW4gc3AgKi8KKwkJfQorCisJCWxlZnQgKz0gbjsKKwkJaWYgKGxlZnQgPj0gaGFsZikKKwkJCWJyZWFrOworCX0KKworCS8qIDxueHQ+IHBvaW5zIHRvIHRoZSAxc3QgZW50cnkgdG8gbW92ZSAqLworCisJLyoKKwkgKiAgICAgIG1vdmUgZW50cmllcyB0byByaWdodCBwYWdlCisJICoKKwkgKiBkdE1vdmVFbnRyeSgpIGluaXRpYWxpemVzIHJwIGFuZCByZXNlcnZlcyBlbnRyeSBmb3IgaW5zZXJ0aW9uCisJICoKKwkgKiBzcGxpdCBwYWdlIG1vdmVkIG91dCBlbnRyaWVzIGFyZSBsaW5lbG9ja2VkOworCSAqIG5ldy9yaWdodCBwYWdlIG1vdmVkIGluIGVudHJpZXMgYXJlIGxpbmVsb2NrZWQ7CisJICovCisJLyogbGluZWxvY2sgaGVhZGVyICsgc3RibCBvZiBuZXcgcmlnaHQgcGFnZSAqLworCXJsdiA9ICYgcmR0bGNrLT5sdltyZHRsY2stPmluZGV4XTsKKwlybHYtPm9mZnNldCA9IDA7CisJcmx2LT5sZW5ndGggPSA1OworCXJkdGxjay0+aW5kZXgrKzsKKworCWR0TW92ZUVudHJ5KHNwLCBueHQsIHJwLCAmc2R0bGNrLCAmcmR0bGNrLCBET19JTkRFWChpcCkpOworCisJc3AtPmhlYWRlci5uZXh0aW5kZXggPSBueHQ7CisKKwkvKgorCSAqIGZpbmFsaXplIGZyZWVsaXN0IG9mIG5ldyByaWdodCBwYWdlCisJICovCisJZnNpID0gcnAtPmhlYWRlci5mcmVlbGlzdDsKKwlmID0gJnJwLT5zbG90W2ZzaV07CisJZm9yIChmc2krKzsgZnNpIDwgcnAtPmhlYWRlci5tYXhzbG90OyBmKyssIGZzaSsrKQorCQlmLT5uZXh0ID0gZnNpOworCWYtPm5leHQgPSAtMTsKKworCS8qCisJICogVXBkYXRlIGRpcmVjdG9yeSBpbmRleCB0YWJsZSBmb3IgZW50cmllcyBub3cgaW4gcmlnaHQgcGFnZQorCSAqLworCWlmICgocnAtPmhlYWRlci5mbGFnICYgQlRfTEVBRikgJiYgRE9fSU5ERVgoaXApKSB7CisJCXM2NCBsYmxvY2s7CisKKwkJbXAgPSBOVUxMOworCQlzdGJsID0gRFRfR0VUU1RCTChycCk7CisJCWZvciAobiA9IDA7IG4gPCBycC0+aGVhZGVyLm5leHRpbmRleDsgbisrKSB7CisJCQlsZHRlbnRyeSA9IChzdHJ1Y3QgbGR0ZW50cnkgKikgJiBycC0+c2xvdFtzdGJsW25dXTsKKwkJCW1vZGlmeV9pbmRleCh0aWQsIGlwLCBsZTMyX3RvX2NwdShsZHRlbnRyeS0+aW5kZXgpLAorCQkJCSAgICAgcmJuLCBuLCAmbXAsICZsYmxvY2spOworCQl9CisJCWlmIChtcCkKKwkJCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCX0KKworCS8qCisJICogdGhlIHNraXBwZWQgaW5kZXggd2FzIG9uIHRoZSBsZWZ0IHBhZ2UsCisJICovCisJaWYgKHNraXAgPD0gb2ZmKSB7CisJCS8qIGluc2VydCB0aGUgbmV3IGVudHJ5IGluIHRoZSBzcGxpdCBwYWdlICovCisJCWR0SW5zZXJ0RW50cnkoc3AsIHNraXAsIHNwbGl0LT5rZXksIHNwbGl0LT5kYXRhLCAmc2R0bGNrKTsKKworCQkvKiBsaW5lbG9jayBzdGJsIG9mIHNwbGl0IHBhZ2UgKi8KKwkJaWYgKHNkdGxjay0+aW5kZXggPj0gc2R0bGNrLT5tYXhjbnQpCisJCQlzZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgdHhMaW5lbG9jayhzZHRsY2spOworCQlzbHYgPSAmIHNkdGxjay0+bHZbc2R0bGNrLT5pbmRleF07CisJCW4gPSBza2lwID4+IEwyRFRTTE9UU0laRTsKKwkJc2x2LT5vZmZzZXQgPSBzcC0+aGVhZGVyLnN0YmxpbmRleCArIG47CisJCXNsdi0+bGVuZ3RoID0KKwkJICAgICgoc3AtPmhlYWRlci5uZXh0aW5kZXggLSAxKSA+PiBMMkRUU0xPVFNJWkUpIC0gbiArIDE7CisJCXNkdGxjay0+aW5kZXgrKzsKKwl9CisJLyoKKwkgKiB0aGUgc2tpcHBlZCBpbmRleCB3YXMgb24gdGhlIHJpZ2h0IHBhZ2UsCisJICovCisJZWxzZSB7CisJCS8qIGFkanVzdCB0aGUgc2tpcCBpbmRleCB0byByZWZsZWN0IHRoZSBuZXcgcG9zaXRpb24gKi8KKwkJc2tpcCAtPSBueHQ7CisKKwkJLyogaW5zZXJ0IHRoZSBuZXcgZW50cnkgaW4gdGhlIHJpZ2h0IHBhZ2UgKi8KKwkJZHRJbnNlcnRFbnRyeShycCwgc2tpcCwgc3BsaXQtPmtleSwgc3BsaXQtPmRhdGEsICZyZHRsY2spOworCX0KKworICAgICAgb3V0OgorCSpybXBwID0gcm1wOworCSpycHhkcCA9ICpweGQ7CisKKwlyZXR1cm4gcmM7Cit9CisKKworLyoKKyAqCWR0RXh0ZW5kUGFnZSgpCisgKgorICogZnVuY3Rpb246IGV4dGVuZCAxc3Qvb25seSBkaXJlY3RvcnkgbGVhZiBwYWdlCisgKgorICogcGFyYW1ldGVyOgorICoKKyAqIHJldHVybjogMCAtIHN1Y2Nlc3M7CisgKgkgICBlcnJubyAtIGZhaWx1cmU7CisgKglyZXR1cm4gZXh0ZW5kZWQgcGFnZSBwaW5uZWQ7CisgKi8KK3N0YXRpYyBpbnQgZHRFeHRlbmRQYWdlKHRpZF90IHRpZCwKKwkgICAgIHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBkdHNwbGl0ICogc3BsaXQsIHN0cnVjdCBidHN0YWNrICogYnRzdGFjaykKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaXAtPmlfc2I7CisJaW50IHJjOworCXN0cnVjdCBtZXRhcGFnZSAqc21wLCAqcG1wLCAqbXA7CisJZHRwYWdlX3QgKnNwLCAqcHA7CisJc3RydWN0IHB4ZGxpc3QgKnB4ZGxpc3Q7CisJcHhkX3QgKnB4ZCwgKnRweGQ7CisJaW50IHhsZW4sIHhzaXplOworCWludCBuZXdzdGJsaW5kZXgsIG5ld3N0YmxzaXplOworCWludCBvbGRzdGJsaW5kZXgsIG9sZHN0YmxzaXplOworCWludCBmc2ksIGxhc3Q7CisJc3RydWN0IGR0c2xvdCAqZjsKKwlzdHJ1Y3QgYnRmcmFtZSAqcGFyZW50OworCWludCBuOworCXN0cnVjdCBkdF9sb2NrICpkdGxjazsKKwlzNjQgeGFkZHIsIHR4YWRkcjsKKwlzdHJ1Y3QgdGxvY2sgKnRsY2s7CisJc3RydWN0IHB4ZF9sb2NrICpweGRsb2NrOworCXN0cnVjdCBsdiAqbHY7CisJdWludCB0eXBlOworCXN0cnVjdCBsZHRlbnRyeSAqbGR0ZW50cnk7CisJdTggKnN0Ymw7CisKKwkvKiBnZXQgcGFnZSB0byBleHRlbmQgKi8KKwlzbXAgPSBzcGxpdC0+bXA7CisJc3AgPSBEVF9QQUdFKGlwLCBzbXApOworCisJLyogZ2V0IHBhcmVudC9yb290IHBhZ2UgKi8KKwlwYXJlbnQgPSBCVF9QT1AoYnRzdGFjayk7CisJRFRfR0VUUEFHRShpcCwgcGFyZW50LT5ibiwgcG1wLCBQU0laRSwgcHAsIHJjKTsKKwlpZiAocmMpCisJCXJldHVybiAocmMpOworCisJLyoKKwkgKiAgICAgIGV4dGVuZCB0aGUgZXh0ZW50CisJICovCisJcHhkbGlzdCA9IHNwbGl0LT5weGRsaXN0OworCXB4ZCA9ICZweGRsaXN0LT5weGRbcHhkbGlzdC0+bnB4ZF07CisJcHhkbGlzdC0+bnB4ZCsrOworCisJeGFkZHIgPSBhZGRyZXNzUFhEKHB4ZCk7CisJdHB4ZCA9ICZzcC0+aGVhZGVyLnNlbGY7CisJdHhhZGRyID0gYWRkcmVzc1BYRCh0cHhkKTsKKwkvKiBpbi1wbGFjZSBleHRlbnNpb24gKi8KKwlpZiAoeGFkZHIgPT0gdHhhZGRyKSB7CisJCXR5cGUgPSB0bGNrRVhURU5EOworCX0KKwkvKiByZWxvY2F0aW9uICovCisJZWxzZSB7CisJCXR5cGUgPSB0bGNrTkVXOworCisJCS8qIHNhdmUgbW92ZWQgZXh0ZW50IGRlc2NyaXB0b3IgZm9yIGxhdGVyIGZyZWUgKi8KKwkJdGxjayA9IHR4TWFwbG9jayh0aWQsIGlwLCB0bGNrRFRSRUUgfCB0bGNrUkVMT0NBVEUpOworCQlweGRsb2NrID0gKHN0cnVjdCBweGRfbG9jayAqKSAmIHRsY2stPmxvY2s7CisJCXB4ZGxvY2stPmZsYWcgPSBtbGNrRlJFRVBYRDsKKwkJcHhkbG9jay0+cHhkID0gc3AtPmhlYWRlci5zZWxmOworCQlweGRsb2NrLT5pbmRleCA9IDE7CisKKwkJLyoKKwkJICogVXBkYXRlIGRpcmVjdG9yeSBpbmRleCB0YWJsZSB0byByZWZsZWN0IG5ldyBwYWdlIGFkZHJlc3MKKwkJICovCisJCWlmIChET19JTkRFWChpcCkpIHsKKwkJCXM2NCBsYmxvY2s7CisKKwkJCW1wID0gTlVMTDsKKwkJCXN0YmwgPSBEVF9HRVRTVEJMKHNwKTsKKwkJCWZvciAobiA9IDA7IG4gPCBzcC0+aGVhZGVyLm5leHRpbmRleDsgbisrKSB7CisJCQkJbGR0ZW50cnkgPQorCQkJCSAgICAoc3RydWN0IGxkdGVudHJ5ICopICYgc3AtPnNsb3Rbc3RibFtuXV07CisJCQkJbW9kaWZ5X2luZGV4KHRpZCwgaXAsCisJCQkJCSAgICAgbGUzMl90b19jcHUobGR0ZW50cnktPmluZGV4KSwKKwkJCQkJICAgICB4YWRkciwgbiwgJm1wLCAmbGJsb2NrKTsKKwkJCX0KKwkJCWlmIChtcCkKKwkJCQlyZWxlYXNlX21ldGFwYWdlKG1wKTsKKwkJfQorCX0KKworCS8qCisJICogICAgICBleHRlbmQgdGhlIHBhZ2UKKwkgKi8KKwlzcC0+aGVhZGVyLnNlbGYgPSAqcHhkOworCisJamZzX2luZm8oImR0RXh0ZW5kUGFnZTogaXA6MHglcCBzbXA6MHglcCBzcDoweCVwIiwgaXAsIHNtcCwgc3ApOworCisJQlRfTUFSS19ESVJUWShzbXAsIGlwKTsKKwkvKgorCSAqIGFjcXVpcmUgYSB0cmFuc2FjdGlvbiBsb2NrIG9uIHRoZSBleHRlbmRlZC9sZWFmIHBhZ2UKKwkgKi8KKwl0bGNrID0gdHhMb2NrKHRpZCwgaXAsIHNtcCwgdGxja0RUUkVFIHwgdHlwZSk7CisJZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgJiB0bGNrLT5sb2NrOworCWx2ID0gJiBkdGxjay0+bHZbMF07CisKKwkvKiB1cGRhdGUgYnVmZmVyIGV4dGVudCBkZXNjcmlwdG9yIG9mIGV4dGVuZGVkIHBhZ2UgKi8KKwl4bGVuID0gbGVuZ3RoUFhEKHB4ZCk7CisJeHNpemUgPSB4bGVuIDw8IEpGU19TQkkoc2IpLT5sMmJzaXplOworI2lmZGVmIF9TVElMTF9UT19QT1JUCisJYm1TZXRYRChzbXAsIHhhZGRyLCB4c2l6ZSk7CisjZW5kaWYJCQkJLyogIF9TVElMTF9UT19QT1JUICovCisKKwkvKgorCSAqIGNvcHkgb2xkIHN0YmwgdG8gbmV3IHN0YmwgYXQgc3RhcnQgb2YgZXh0ZW5kZWQgYXJlYQorCSAqLworCW9sZHN0YmxpbmRleCA9IHNwLT5oZWFkZXIuc3RibGluZGV4OworCW9sZHN0YmxzaXplID0gKHNwLT5oZWFkZXIubWF4c2xvdCArIDMxKSA+PiBMMkRUU0xPVFNJWkU7CisJbmV3c3RibGluZGV4ID0gc3AtPmhlYWRlci5tYXhzbG90OworCW4gPSB4c2l6ZSA+PiBMMkRUU0xPVFNJWkU7CisJbmV3c3RibHNpemUgPSAobiArIDMxKSA+PiBMMkRUU0xPVFNJWkU7CisJbWVtY3B5KCZzcC0+c2xvdFtuZXdzdGJsaW5kZXhdLCAmc3AtPnNsb3Rbb2xkc3RibGluZGV4XSwKKwkgICAgICAgc3AtPmhlYWRlci5uZXh0aW5kZXgpOworCisJLyoKKwkgKiBpbi1saW5lIGV4dGVuc2lvbjogbGluZWxvY2sgb2xkIGFyZWEgb2YgZXh0ZW5kZWQgcGFnZQorCSAqLworCWlmICh0eXBlID09IHRsY2tFWFRFTkQpIHsKKwkJLyogbGluZWxvY2sgaGVhZGVyICovCisJCWx2LT5vZmZzZXQgPSAwOworCQlsdi0+bGVuZ3RoID0gMTsKKwkJZHRsY2stPmluZGV4Kys7CisJCWx2Kys7CisKKwkJLyogbGluZWxvY2sgbmV3IHN0Ymwgb2YgZXh0ZW5kZWQgcGFnZSAqLworCQlsdi0+b2Zmc2V0ID0gbmV3c3RibGluZGV4OworCQlsdi0+bGVuZ3RoID0gbmV3c3RibHNpemU7CisJfQorCS8qCisJICogcmVsb2NhdGlvbjogbGluZWxvY2sgd2hvbGUgcmVsb2NhdGVkIGFyZWEKKwkgKi8KKwllbHNlIHsKKwkJbHYtPm9mZnNldCA9IDA7CisJCWx2LT5sZW5ndGggPSBzcC0+aGVhZGVyLm1heHNsb3QgKyBuZXdzdGJsc2l6ZTsKKwl9CisKKwlkdGxjay0+aW5kZXgrKzsKKworCXNwLT5oZWFkZXIubWF4c2xvdCA9IG47CisJc3AtPmhlYWRlci5zdGJsaW5kZXggPSBuZXdzdGJsaW5kZXg7CisJLyogc3AtPmhlYWRlci5uZXh0aW5kZXggcmVtYWlucyB0aGUgc2FtZSAqLworCisJLyoKKwkgKiBhZGQgb2xkIHN0YmwgcmVnaW9uIGF0IGhlYWQgb2YgZnJlZWxpc3QKKwkgKi8KKwlmc2kgPSBvbGRzdGJsaW5kZXg7CisJZiA9ICZzcC0+c2xvdFtmc2ldOworCWxhc3QgPSBzcC0+aGVhZGVyLmZyZWVsaXN0OworCWZvciAobiA9IDA7IG4gPCBvbGRzdGJsc2l6ZTsgbisrLCBmc2krKywgZisrKSB7CisJCWYtPm5leHQgPSBsYXN0OworCQlsYXN0ID0gZnNpOworCX0KKwlzcC0+aGVhZGVyLmZyZWVsaXN0ID0gbGFzdDsKKwlzcC0+aGVhZGVyLmZyZWVjbnQgKz0gb2xkc3RibHNpemU7CisKKwkvKgorCSAqIGFwcGVuZCBmcmVlIHJlZ2lvbiBvZiBuZXdseSBleHRlbmRlZCBhcmVhIGF0IHRhaWwgb2YgZnJlZWxpc3QKKwkgKi8KKwkvKiBpbml0IGZyZWUgcmVnaW9uIG9mIG5ld2x5IGV4dGVuZGVkIGFyZWEgKi8KKwlmc2kgPSBuID0gbmV3c3RibGluZGV4ICsgbmV3c3RibHNpemU7CisJZiA9ICZzcC0+c2xvdFtmc2ldOworCWZvciAoZnNpKys7IGZzaSA8IHNwLT5oZWFkZXIubWF4c2xvdDsgZisrLCBmc2krKykKKwkJZi0+bmV4dCA9IGZzaTsKKwlmLT5uZXh0ID0gLTE7CisKKwkvKiBhcHBlbmQgbmV3IGZyZWUgcmVnaW9uIGF0IHRhaWwgb2Ygb2xkIGZyZWVsaXN0ICovCisJZnNpID0gc3AtPmhlYWRlci5mcmVlbGlzdDsKKwlpZiAoZnNpID09IC0xKQorCQlzcC0+aGVhZGVyLmZyZWVsaXN0ID0gbjsKKwllbHNlIHsKKwkJZG8geworCQkJZiA9ICZzcC0+c2xvdFtmc2ldOworCQkJZnNpID0gZi0+bmV4dDsKKwkJfSB3aGlsZSAoZnNpICE9IC0xKTsKKworCQlmLT5uZXh0ID0gbjsKKwl9CisKKwlzcC0+aGVhZGVyLmZyZWVjbnQgKz0gc3AtPmhlYWRlci5tYXhzbG90IC0gbjsKKworCS8qCisJICogaW5zZXJ0IHRoZSBuZXcgZW50cnkKKwkgKi8KKwlkdEluc2VydEVudHJ5KHNwLCBzcGxpdC0+aW5kZXgsIHNwbGl0LT5rZXksIHNwbGl0LT5kYXRhLCAmZHRsY2spOworCisJQlRfTUFSS19ESVJUWShwbXAsIGlwKTsKKwkvKgorCSAqIGxpbmVsb2NrIGFueSBmcmVlc2xvdHMgcmVzaWRpbmcgaW4gb2xkIGV4dGVudAorCSAqLworCWlmICh0eXBlID09IHRsY2tFWFRFTkQpIHsKKwkJbiA9IHNwLT5oZWFkZXIubWF4c2xvdCA+PiAyOworCQlpZiAoc3AtPmhlYWRlci5mcmVlbGlzdCA8IG4pCisJCQlkdExpbmVsb2NrRnJlZWxpc3Qoc3AsIG4sICZkdGxjayk7CisJfQorCisJLyoKKwkgKiAgICAgIHVwZGF0ZSBwYXJlbnQgZW50cnkgb24gdGhlIHBhcmVudC9yb290IHBhZ2UKKwkgKi8KKwkvKgorCSAqIGFjcXVpcmUgYSB0cmFuc2FjdGlvbiBsb2NrIG9uIHRoZSBwYXJlbnQvcm9vdCBwYWdlCisJICovCisJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBwbXAsIHRsY2tEVFJFRSB8IHRsY2tFTlRSWSk7CisJZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgJiB0bGNrLT5sb2NrOworCWx2ID0gJiBkdGxjay0+bHZbZHRsY2stPmluZGV4XTsKKworCS8qIGxpbmVsb2NrIHBhcmVudCBlbnRyeSAtIDFzdCBzbG90ICovCisJbHYtPm9mZnNldCA9IDE7CisJbHYtPmxlbmd0aCA9IDE7CisJZHRsY2stPmluZGV4Kys7CisKKwkvKiB1cGRhdGUgdGhlIHBhcmVudCBweGQgZm9yIHBhZ2UgZXh0ZW5zaW9uICovCisJdHB4ZCA9IChweGRfdCAqKSAmIHBwLT5zbG90WzFdOworCSp0cHhkID0gKnB4ZDsKKworCURUX1BVVFBBR0UocG1wKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICoJZHRTcGxpdFJvb3QoKQorICoKKyAqIGZ1bmN0aW9uOgorICoJc3BsaXQgdGhlIGZ1bGwgcm9vdCBwYWdlIGludG8KKyAqCW9yaWdpbmFsL3Jvb3Qvc3BsaXQgcGFnZSBhbmQgbmV3IHJpZ2h0IHBhZ2UKKyAqCWkuZS4sIHJvb3QgcmVtYWlucyBmaXhlZCBpbiB0cmVlIGFuY2hvciAoaW5vZGUpIGFuZAorICoJdGhlIHJvb3QgaXMgY29waWVkIHRvIGEgc2luZ2xlIG5ldyByaWdodCBjaGlsZCBwYWdlCisgKglzaW5jZSByb290IHBhZ2UgPDwgbm9uLXJvb3QgcGFnZSwgYW5kCisgKgl0aGUgc3BsaXQgcm9vdCBwYWdlIGNvbnRhaW5zIGEgc2luZ2xlIGVudHJ5IGZvciB0aGUKKyAqCW5ldyByaWdodCBjaGlsZCBwYWdlLgorICoKKyAqIHBhcmFtZXRlcjoKKyAqCisgKiByZXR1cm46IDAgLSBzdWNjZXNzOworICoJICAgZXJybm8gLSBmYWlsdXJlOworICoJcmV0dXJuIG5ldyBwYWdlIHBpbm5lZDsKKyAqLworc3RhdGljIGludCBkdFNwbGl0Um9vdCh0aWRfdCB0aWQsCisJICAgIHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBkdHNwbGl0ICogc3BsaXQsIHN0cnVjdCBtZXRhcGFnZSAqKiBybXBwKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpcC0+aV9zYjsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKnNtcDsKKwlkdHJvb3RfdCAqc3A7CisJc3RydWN0IG1ldGFwYWdlICpybXA7CisJZHRwYWdlX3QgKnJwOworCXM2NCByYm47CisJaW50IHhsZW47CisJaW50IHhzaXplOworCXN0cnVjdCBkdHNsb3QgKmY7CisJczggKnN0Ymw7CisJaW50IGZzaSwgc3RibHNpemUsIG47CisJc3RydWN0IGlkdGVudHJ5ICpzOworCXB4ZF90ICpwcHhkOworCXN0cnVjdCBweGRsaXN0ICpweGRsaXN0OworCXB4ZF90ICpweGQ7CisJc3RydWN0IGR0X2xvY2sgKmR0bGNrOworCXN0cnVjdCB0bG9jayAqdGxjazsKKwlzdHJ1Y3QgbHYgKmx2OworCisJLyogZ2V0IHNwbGl0IHJvb3QgcGFnZSAqLworCXNtcCA9IHNwbGl0LT5tcDsKKwlzcCA9ICZKRlNfSVAoaXApLT5pX2R0cm9vdDsKKworCS8qCisJICogICAgICBhbGxvY2F0ZS9pbml0aWFsaXplIGEgc2luZ2xlIChyaWdodCkgY2hpbGQgcGFnZQorCSAqCisJICogTi5CLiBhdCBmaXJzdCBzcGxpdCwgYSBvbmUgKG9yIHR3bykgYmxvY2sgdG8gZml0IG5ldyBlbnRyeQorCSAqIGlzIGFsbG9jYXRlZDsgYXQgc3Vic2VxdWVudCBzcGxpdCwgYSBmdWxsIHBhZ2UgaXMgYWxsb2NhdGVkOworCSAqLworCXB4ZGxpc3QgPSBzcGxpdC0+cHhkbGlzdDsKKwlweGQgPSAmcHhkbGlzdC0+cHhkW3B4ZGxpc3QtPm5weGRdOworCXB4ZGxpc3QtPm5weGQrKzsKKwlyYm4gPSBhZGRyZXNzUFhEKHB4ZCk7CisJeGxlbiA9IGxlbmd0aFBYRChweGQpOworCXhzaXplID0geGxlbiA8PCBKRlNfU0JJKHNiKS0+bDJic2l6ZTsKKwlybXAgPSBnZXRfbWV0YXBhZ2UoaXAsIHJibiwgeHNpemUsIDEpOworCWlmICghcm1wKQorCQlyZXR1cm4gLUVJTzsKKworCXJwID0gcm1wLT5kYXRhOworCisJLyogQWxsb2NhdGUgYmxvY2tzIHRvIHF1b3RhLiAqLworCWlmIChEUVVPVF9BTExPQ19CTE9DSyhpcCwgbGVuZ3RoUFhEKHB4ZCkpKSB7CisJCXJlbGVhc2VfbWV0YXBhZ2Uocm1wKTsKKwkJcmV0dXJuIC1FRFFVT1Q7CisJfQorCisJQlRfTUFSS19ESVJUWShybXAsIGlwKTsKKwkvKgorCSAqIGFjcXVpcmUgYSB0cmFuc2FjdGlvbiBsb2NrIG9uIHRoZSBuZXcgcmlnaHQgcGFnZQorCSAqLworCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgcm1wLCB0bGNrRFRSRUUgfCB0bGNrTkVXKTsKKwlkdGxjayA9IChzdHJ1Y3QgZHRfbG9jayAqKSAmIHRsY2stPmxvY2s7CisKKwlycC0+aGVhZGVyLmZsYWcgPQorCSAgICAoc3AtPmhlYWRlci5mbGFnICYgQlRfTEVBRikgPyBCVF9MRUFGIDogQlRfSU5URVJOQUw7CisJcnAtPmhlYWRlci5zZWxmID0gKnB4ZDsKKworCS8qIGluaXRpYWxpemUgc2libGluZyBwb2ludGVycyAqLworCXJwLT5oZWFkZXIubmV4dCA9IDA7CisJcnAtPmhlYWRlci5wcmV2ID0gMDsKKworCS8qCisJICogICAgICBtb3ZlIGluLWxpbmUgcm9vdCBwYWdlIGludG8gbmV3IHJpZ2h0IHBhZ2UgZXh0ZW50CisJICovCisJLyogbGluZWxvY2sgaGVhZGVyICsgY29waWVkIGVudHJpZXMgKyBuZXcgc3RibCAoMXN0IHNsb3QpIGluIG5ldyBwYWdlICovCisJQVNTRVJUKGR0bGNrLT5pbmRleCA9PSAwKTsKKwlsdiA9ICYgZHRsY2stPmx2WzBdOworCWx2LT5vZmZzZXQgPSAwOworCWx2LT5sZW5ndGggPSAxMDsJLyogMSArIDggKyAxICovCisJZHRsY2stPmluZGV4Kys7CisKKwluID0geHNpemUgPj4gTDJEVFNMT1RTSVpFOworCXJwLT5oZWFkZXIubWF4c2xvdCA9IG47CisJc3RibHNpemUgPSAobiArIDMxKSA+PiBMMkRUU0xPVFNJWkU7CisKKwkvKiBjb3B5IG9sZCBzdGJsIHRvIG5ldyBzdGJsIGF0IHN0YXJ0IG9mIGV4dGVuZGVkIGFyZWEgKi8KKwlycC0+aGVhZGVyLnN0YmxpbmRleCA9IERUUk9PVE1BWFNMT1Q7CisJc3RibCA9IChzOCAqKSAmIHJwLT5zbG90W0RUUk9PVE1BWFNMT1RdOworCW1lbWNweShzdGJsLCBzcC0+aGVhZGVyLnN0YmwsIHNwLT5oZWFkZXIubmV4dGluZGV4KTsKKwlycC0+aGVhZGVyLm5leHRpbmRleCA9IHNwLT5oZWFkZXIubmV4dGluZGV4OworCisJLyogY29weSBvbGQgZGF0YSBhcmVhIHRvIHN0YXJ0IG9mIG5ldyBkYXRhIGFyZWEgKi8KKwltZW1jcHkoJnJwLT5zbG90WzFdLCAmc3AtPnNsb3RbMV0sIElEQVRBU0laRSk7CisKKwkvKgorCSAqIGFwcGVuZCBmcmVlIHJlZ2lvbiBvZiBuZXdseSBleHRlbmRlZCBhcmVhIGF0IHRhaWwgb2YgZnJlZWxpc3QKKwkgKi8KKwkvKiBpbml0IGZyZWUgcmVnaW9uIG9mIG5ld2x5IGV4dGVuZGVkIGFyZWEgKi8KKwlmc2kgPSBuID0gRFRST09UTUFYU0xPVCArIHN0YmxzaXplOworCWYgPSAmcnAtPnNsb3RbZnNpXTsKKwlmb3IgKGZzaSsrOyBmc2kgPCBycC0+aGVhZGVyLm1heHNsb3Q7IGYrKywgZnNpKyspCisJCWYtPm5leHQgPSBmc2k7CisJZi0+bmV4dCA9IC0xOworCisJLyogYXBwZW5kIG5ldyBmcmVlIHJlZ2lvbiBhdCB0YWlsIG9mIG9sZCBmcmVlbGlzdCAqLworCWZzaSA9IHNwLT5oZWFkZXIuZnJlZWxpc3Q7CisJaWYgKGZzaSA9PSAtMSkKKwkJcnAtPmhlYWRlci5mcmVlbGlzdCA9IG47CisJZWxzZSB7CisJCXJwLT5oZWFkZXIuZnJlZWxpc3QgPSBmc2k7CisKKwkJZG8geworCQkJZiA9ICZycC0+c2xvdFtmc2ldOworCQkJZnNpID0gZi0+bmV4dDsKKwkJfSB3aGlsZSAoZnNpICE9IC0xKTsKKworCQlmLT5uZXh0ID0gbjsKKwl9CisKKwlycC0+aGVhZGVyLmZyZWVjbnQgPSBzcC0+aGVhZGVyLmZyZWVjbnQgKyBycC0+aGVhZGVyLm1heHNsb3QgLSBuOworCisJLyoKKwkgKiBVcGRhdGUgZGlyZWN0b3J5IGluZGV4IHRhYmxlIGZvciBlbnRyaWVzIG5vdyBpbiByaWdodCBwYWdlCisJICovCisJaWYgKChycC0+aGVhZGVyLmZsYWcgJiBCVF9MRUFGKSAmJiBET19JTkRFWChpcCkpIHsKKwkJczY0IGxibG9jazsKKwkJc3RydWN0IG1ldGFwYWdlICptcCA9IE5VTEw7CisJCXN0cnVjdCBsZHRlbnRyeSAqbGR0ZW50cnk7CisKKwkJc3RibCA9IERUX0dFVFNUQkwocnApOworCQlmb3IgKG4gPSAwOyBuIDwgcnAtPmhlYWRlci5uZXh0aW5kZXg7IG4rKykgeworCQkJbGR0ZW50cnkgPSAoc3RydWN0IGxkdGVudHJ5ICopICYgcnAtPnNsb3Rbc3RibFtuXV07CisJCQltb2RpZnlfaW5kZXgodGlkLCBpcCwgbGUzMl90b19jcHUobGR0ZW50cnktPmluZGV4KSwKKwkJCQkgICAgIHJibiwgbiwgJm1wLCAmbGJsb2NrKTsKKwkJfQorCQlpZiAobXApCisJCQlyZWxlYXNlX21ldGFwYWdlKG1wKTsKKwl9CisJLyoKKwkgKiBpbnNlcnQgdGhlIG5ldyBlbnRyeSBpbnRvIHRoZSBuZXcgcmlnaHQvY2hpbGQgcGFnZQorCSAqIChza2lwIGluZGV4IGluIHRoZSBuZXcgcmlnaHQgcGFnZSB3aWxsIG5vdCBjaGFuZ2UpCisJICovCisJZHRJbnNlcnRFbnRyeShycCwgc3BsaXQtPmluZGV4LCBzcGxpdC0+a2V5LCBzcGxpdC0+ZGF0YSwgJmR0bGNrKTsKKworCS8qCisJICogICAgICByZXNldCBwYXJlbnQvcm9vdCBwYWdlCisJICoKKwkgKiBzZXQgdGhlIDFzdCBlbnRyeSBvZmZzZXQgdG8gMCwgd2hpY2ggZm9yY2UgdGhlIGxlZnQtbW9zdCBrZXkKKwkgKiBhdCBhbnkgbGV2ZWwgb2YgdGhlIHRyZWUgdG8gYmUgbGVzcyB0aGFuIGFueSBzZWFyY2gga2V5LgorCSAqCisJICogVGhlIGJ0cmVlIGNvbXBhcmlzb24gY29kZSBndWFyYW50ZWVzIHRoYXQgdGhlIGxlZnQtbW9zdCBrZXkgb24gYW55CisJICogbGV2ZWwgb2YgdGhlIHRyZWUgaXMgbmV2ZXIgdXNlZCwgc28gaXQgZG9lc24ndCBuZWVkIHRvIGJlIGZpbGxlZCBpbi4KKwkgKi8KKwlCVF9NQVJLX0RJUlRZKHNtcCwgaXApOworCS8qCisJICogYWNxdWlyZSBhIHRyYW5zYWN0aW9uIGxvY2sgb24gdGhlIHJvb3QgcGFnZSAoaW4tbWVtb3J5IGlub2RlKQorCSAqLworCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgc21wLCB0bGNrRFRSRUUgfCB0bGNrTkVXIHwgdGxja0JUUk9PVCk7CisJZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgJiB0bGNrLT5sb2NrOworCisJLyogbGluZWxvY2sgcm9vdCAqLworCUFTU0VSVChkdGxjay0+aW5kZXggPT0gMCk7CisJbHYgPSAmIGR0bGNrLT5sdlswXTsKKwlsdi0+b2Zmc2V0ID0gMDsKKwlsdi0+bGVuZ3RoID0gRFRST09UTUFYU0xPVDsKKwlkdGxjay0+aW5kZXgrKzsKKworCS8qIHVwZGF0ZSBwYWdlIGhlYWRlciBvZiByb290ICovCisJaWYgKHNwLT5oZWFkZXIuZmxhZyAmIEJUX0xFQUYpIHsKKwkJc3AtPmhlYWRlci5mbGFnICY9IH5CVF9MRUFGOworCQlzcC0+aGVhZGVyLmZsYWcgfD0gQlRfSU5URVJOQUw7CisJfQorCisJLyogaW5pdCB0aGUgZmlyc3QgZW50cnkgKi8KKwlzID0gKHN0cnVjdCBpZHRlbnRyeSAqKSAmIHNwLT5zbG90W0RURU5UUllTVEFSVF07CisJcHB4ZCA9IChweGRfdCAqKSBzOworCSpwcHhkID0gKnB4ZDsKKwlzLT5uZXh0ID0gLTE7CisJcy0+bmFtbGVuID0gMDsKKworCXN0YmwgPSBzcC0+aGVhZGVyLnN0Ymw7CisJc3RibFswXSA9IERURU5UUllTVEFSVDsKKwlzcC0+aGVhZGVyLm5leHRpbmRleCA9IDE7CisKKwkvKiBpbml0IGZyZWVsaXN0ICovCisJZnNpID0gRFRFTlRSWVNUQVJUICsgMTsKKwlmID0gJnNwLT5zbG90W2ZzaV07CisKKwkvKiBpbml0IGZyZWUgcmVnaW9uIG9mIHJlbWFpbmluZyBhcmVhICovCisJZm9yIChmc2krKzsgZnNpIDwgRFRST09UTUFYU0xPVDsgZisrLCBmc2krKykKKwkJZi0+bmV4dCA9IGZzaTsKKwlmLT5uZXh0ID0gLTE7CisKKwlzcC0+aGVhZGVyLmZyZWVsaXN0ID0gRFRFTlRSWVNUQVJUICsgMTsKKwlzcC0+aGVhZGVyLmZyZWVjbnQgPSBEVFJPT1RNQVhTTE9UIC0gKERURU5UUllTVEFSVCArIDEpOworCisJKnJtcHAgPSBybXA7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICoJZHREZWxldGUoKQorICoKKyAqIGZ1bmN0aW9uOiBkZWxldGUgdGhlIGVudHJ5KHMpIHJlZmVyZW5jZWQgYnkgYSBrZXkuCisgKgorICogcGFyYW1ldGVyOgorICoKKyAqIHJldHVybjoKKyAqLworaW50IGR0RGVsZXRlKHRpZF90IHRpZCwKKwkgc3RydWN0IGlub2RlICppcCwgc3RydWN0IGNvbXBvbmVudF9uYW1lICoga2V5LCBpbm9fdCAqIGlubywgaW50IGZsYWcpCit7CisJaW50IHJjID0gMDsKKwlzNjQgYm47CisJc3RydWN0IG1ldGFwYWdlICptcCwgKmltcDsKKwlkdHBhZ2VfdCAqcDsKKwlpbnQgaW5kZXg7CisJc3RydWN0IGJ0c3RhY2sgYnRzdGFjazsKKwlzdHJ1Y3QgZHRfbG9jayAqZHRsY2s7CisJc3RydWN0IHRsb2NrICp0bGNrOworCXN0cnVjdCBsdiAqbHY7CisJaW50IGk7CisJc3RydWN0IGxkdGVudHJ5ICpsZHRlbnRyeTsKKwl1OCAqc3RibDsKKwl1MzIgdGFibGVfaW5kZXgsIG5leHRfaW5kZXg7CisJc3RydWN0IG1ldGFwYWdlICpubXA7CisJZHRwYWdlX3QgKm5wOworCisJLyoKKwkgKiAgICAgIHNlYXJjaCBmb3IgdGhlIGVudHJ5IHRvIGRlbGV0ZToKKwkgKgorCSAqIGR0U2VhcmNoKCkgcmV0dXJucyAobGVhZiBwYWdlIHBpbm5lZCwgaW5kZXggYXQgd2hpY2ggdG8gZGVsZXRlKS4KKwkgKi8KKwlpZiAoKHJjID0gZHRTZWFyY2goaXAsIGtleSwgaW5vLCAmYnRzdGFjaywgZmxhZykpKQorCQlyZXR1cm4gcmM7CisKKwkvKiByZXRyaWV2ZSBzZWFyY2ggcmVzdWx0ICovCisJRFRfR0VUU0VBUkNIKGlwLCBidHN0YWNrLnRvcCwgYm4sIG1wLCBwLCBpbmRleCk7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gZmluZCBwdXQgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGVudHJ5IGludG8gdGhlCisJICogZGlyZWN0b3J5IGluZGV4IHRhYmxlIGluIG9yZGVyIHRvIHJlc3VtZSBhIHJlYWRkaXIgZnJvbSB0aGlzCisJICogZW50cnkuCisJICovCisJaWYgKERPX0lOREVYKGlwKSkgeworCQlzdGJsID0gRFRfR0VUU1RCTChwKTsKKwkJbGR0ZW50cnkgPSAoc3RydWN0IGxkdGVudHJ5ICopICYgcC0+c2xvdFtzdGJsW2luZGV4XV07CisJCXRhYmxlX2luZGV4ID0gbGUzMl90b19jcHUobGR0ZW50cnktPmluZGV4KTsKKwkJaWYgKGluZGV4ID09IChwLT5oZWFkZXIubmV4dGluZGV4IC0gMSkpIHsKKwkJCS8qCisJCQkgKiBMYXN0IGVudHJ5IGluIHRoaXMgbGVhZiBwYWdlCisJCQkgKi8KKwkJCWlmICgocC0+aGVhZGVyLmZsYWcgJiBCVF9ST09UKQorCQkJICAgIHx8IChwLT5oZWFkZXIubmV4dCA9PSAwKSkKKwkJCQluZXh0X2luZGV4ID0gLTE7CisJCQllbHNlIHsKKwkJCQkvKiBSZWFkIG5leHQgbGVhZiBwYWdlICovCisJCQkJRFRfR0VUUEFHRShpcCwgbGU2NF90b19jcHUocC0+aGVhZGVyLm5leHQpLAorCQkJCQkgICBubXAsIFBTSVpFLCBucCwgcmMpOworCQkJCWlmIChyYykKKwkJCQkJbmV4dF9pbmRleCA9IC0xOworCQkJCWVsc2UgeworCQkJCQlzdGJsID0gRFRfR0VUU1RCTChucCk7CisJCQkJCWxkdGVudHJ5ID0KKwkJCQkJICAgIChzdHJ1Y3QgbGR0ZW50cnkgKikgJiBucC0+CisJCQkJCSAgICBzbG90W3N0YmxbMF1dOworCQkJCQluZXh0X2luZGV4ID0KKwkJCQkJICAgIGxlMzJfdG9fY3B1KGxkdGVudHJ5LT5pbmRleCk7CisJCQkJCURUX1BVVFBBR0Uobm1wKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlsZHRlbnRyeSA9CisJCQkgICAgKHN0cnVjdCBsZHRlbnRyeSAqKSAmIHAtPnNsb3Rbc3RibFtpbmRleCArIDFdXTsKKwkJCW5leHRfaW5kZXggPSBsZTMyX3RvX2NwdShsZHRlbnRyeS0+aW5kZXgpOworCQl9CisJCWZyZWVfaW5kZXgodGlkLCBpcCwgdGFibGVfaW5kZXgsIG5leHRfaW5kZXgpOworCX0KKwkvKgorCSAqIHRoZSBsZWFmIHBhZ2UgYmVjb21lcyBlbXB0eSwgZGVsZXRlIHRoZSBwYWdlCisJICovCisJaWYgKHAtPmhlYWRlci5uZXh0aW5kZXggPT0gMSkgeworCQkvKiBkZWxldGUgZW1wdHkgcGFnZSAqLworCQlyYyA9IGR0RGVsZXRlVXAodGlkLCBpcCwgbXAsIHAsICZidHN0YWNrKTsKKwl9CisJLyoKKwkgKiB0aGUgbGVhZiBwYWdlIGhhcyBvdGhlciBlbnRyaWVzIHJlbWFpbmluZzoKKwkgKgorCSAqIGRlbGV0ZSB0aGUgZW50cnkgZnJvbSB0aGUgbGVhZiBwYWdlLgorCSAqLworCWVsc2UgeworCQlCVF9NQVJLX0RJUlRZKG1wLCBpcCk7CisJCS8qCisJCSAqIGFjcXVpcmUgYSB0cmFuc2FjdGlvbiBsb2NrIG9uIHRoZSBsZWFmIHBhZ2UKKwkJICovCisJCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgbXAsIHRsY2tEVFJFRSB8IHRsY2tFTlRSWSk7CisJCWR0bGNrID0gKHN0cnVjdCBkdF9sb2NrICopICYgdGxjay0+bG9jazsKKworCQkvKgorCQkgKiBEbyBub3QgYXNzdW1lIHRoYXQgZHRsY2stPmluZGV4IHdpbGwgYmUgemVyby4gIER1cmluZyBhCisJCSAqIHJlbmFtZSB3aXRoaW4gYSBkaXJlY3RvcnksIHRoaXMgdHJhbnNhY3Rpb24gbWF5IGhhdmUKKwkJICogbW9kaWZpZWQgdGhpcyBwYWdlIGFscmVhZHkgd2hlbiBhZGRpbmcgdGhlIG5ldyBlbnRyeS4KKwkJICovCisKKwkJLyogbGluZWxvY2sgaGVhZGVyICovCisJCWlmIChkdGxjay0+aW5kZXggPj0gZHRsY2stPm1heGNudCkKKwkJCWR0bGNrID0gKHN0cnVjdCBkdF9sb2NrICopIHR4TGluZWxvY2soZHRsY2spOworCQlsdiA9ICYgZHRsY2stPmx2W2R0bGNrLT5pbmRleF07CisJCWx2LT5vZmZzZXQgPSAwOworCQlsdi0+bGVuZ3RoID0gMTsKKwkJZHRsY2stPmluZGV4Kys7CisKKwkJLyogbGluZWxvY2sgc3RibCBvZiBub24tcm9vdCBsZWFmIHBhZ2UgKi8KKwkJaWYgKCEocC0+aGVhZGVyLmZsYWcgJiBCVF9ST09UKSkgeworCQkJaWYgKGR0bGNrLT5pbmRleCA+PSBkdGxjay0+bWF4Y250KQorCQkJCWR0bGNrID0gKHN0cnVjdCBkdF9sb2NrICopIHR4TGluZWxvY2soZHRsY2spOworCQkJbHYgPSAmIGR0bGNrLT5sdltkdGxjay0+aW5kZXhdOworCQkJaSA9IGluZGV4ID4+IEwyRFRTTE9UU0laRTsKKwkJCWx2LT5vZmZzZXQgPSBwLT5oZWFkZXIuc3RibGluZGV4ICsgaTsKKwkJCWx2LT5sZW5ndGggPQorCQkJICAgICgocC0+aGVhZGVyLm5leHRpbmRleCAtIDEpID4+IEwyRFRTTE9UU0laRSkgLQorCQkJICAgIGkgKyAxOworCQkJZHRsY2stPmluZGV4Kys7CisJCX0KKworCQkvKiBmcmVlIHRoZSBsZWFmIGVudHJ5ICovCisJCWR0RGVsZXRlRW50cnkocCwgaW5kZXgsICZkdGxjayk7CisKKwkJLyoKKwkJICogVXBkYXRlIGRpcmVjdG9yeSBpbmRleCB0YWJsZSBmb3IgZW50cmllcyBtb3ZlZCBpbiBzdGJsCisJCSAqLworCQlpZiAoRE9fSU5ERVgoaXApICYmIGluZGV4IDwgcC0+aGVhZGVyLm5leHRpbmRleCkgeworCQkJczY0IGxibG9jazsKKworCQkJaW1wID0gTlVMTDsKKwkJCXN0YmwgPSBEVF9HRVRTVEJMKHApOworCQkJZm9yIChpID0gaW5kZXg7IGkgPCBwLT5oZWFkZXIubmV4dGluZGV4OyBpKyspIHsKKwkJCQlsZHRlbnRyeSA9CisJCQkJICAgIChzdHJ1Y3QgbGR0ZW50cnkgKikgJiBwLT5zbG90W3N0YmxbaV1dOworCQkJCW1vZGlmeV9pbmRleCh0aWQsIGlwLAorCQkJCQkgICAgIGxlMzJfdG9fY3B1KGxkdGVudHJ5LT5pbmRleCksCisJCQkJCSAgICAgYm4sIGksICZpbXAsICZsYmxvY2spOworCQkJfQorCQkJaWYgKGltcCkKKwkJCQlyZWxlYXNlX21ldGFwYWdlKGltcCk7CisJCX0KKworCQlEVF9QVVRQQUdFKG1wKTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKworLyoKKyAqCWR0RGVsZXRlVXAoKQorICoKKyAqIGZ1bmN0aW9uOgorICoJZnJlZSBlbXB0eSBwYWdlcyBhcyBwcm9wYWdhdGluZyBkZWxldGlvbiB1cCB0aGUgdHJlZQorICoKKyAqIHBhcmFtZXRlcjoKKyAqCisgKiByZXR1cm46CisgKi8KK3N0YXRpYyBpbnQgZHREZWxldGVVcCh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsCisJICAgc3RydWN0IG1ldGFwYWdlICogZm1wLCBkdHBhZ2VfdCAqIGZwLCBzdHJ1Y3QgYnRzdGFjayAqIGJ0c3RhY2spCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCWR0cGFnZV90ICpwOworCWludCBpbmRleCwgbmV4dGluZGV4OworCWludCB4bGVuOworCXN0cnVjdCBidGZyYW1lICpwYXJlbnQ7CisJc3RydWN0IGR0X2xvY2sgKmR0bGNrOworCXN0cnVjdCB0bG9jayAqdGxjazsKKwlzdHJ1Y3QgbHYgKmx2OworCXN0cnVjdCBweGRfbG9jayAqcHhkbG9jazsKKwlpbnQgaTsKKworCS8qCisJICogICAgICBrZWVwIHRoZSByb290IGxlYWYgcGFnZSB3aGljaCBoYXMgYmVjb21lIGVtcHR5CisJICovCisJaWYgKEJUX0lTX1JPT1QoZm1wKSkgeworCQkvKgorCQkgKiByZXNldCB0aGUgcm9vdAorCQkgKgorCQkgKiBkdEluaXRSb290KCkgYWNxdWlyZXMgdHhsb2NrIG9uIHRoZSByb290CisJCSAqLworCQlkdEluaXRSb290KHRpZCwgaXAsIFBBUkVOVChpcCkpOworCisJCURUX1BVVFBBR0UoZm1wKTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqICAgICAgZnJlZSB0aGUgbm9uLXJvb3QgbGVhZiBwYWdlCisJICovCisJLyoKKwkgKiBhY3F1aXJlIGEgdHJhbnNhY3Rpb24gbG9jayBvbiB0aGUgcGFnZQorCSAqCisJICogd3JpdGUgRlJFRVhURU5UfE5PUkVET1BBR0UgbG9nIHJlY29yZAorCSAqIE4uQi4gbGluZWxvY2sgaXMgb3ZlcmxhaWQgYXMgZnJlZWQgZXh0ZW50IGRlc2NyaXB0b3IsIGFuZAorCSAqIHRoZSBidWZmZXIgcGFnZSBpcyBmcmVlZDsKKwkgKi8KKwl0bGNrID0gdHhNYXBsb2NrKHRpZCwgaXAsIHRsY2tEVFJFRSB8IHRsY2tGUkVFKTsKKwlweGRsb2NrID0gKHN0cnVjdCBweGRfbG9jayAqKSAmIHRsY2stPmxvY2s7CisJcHhkbG9jay0+ZmxhZyA9IG1sY2tGUkVFUFhEOworCXB4ZGxvY2stPnB4ZCA9IGZwLT5oZWFkZXIuc2VsZjsKKwlweGRsb2NrLT5pbmRleCA9IDE7CisKKwkvKiB1cGRhdGUgc2libGluZyBwb2ludGVycyAqLworCWlmICgocmMgPSBkdFJlbGluayh0aWQsIGlwLCBmcCkpKSB7CisJCUJUX1BVVFBBR0UoZm1wKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXhsZW4gPSBsZW5ndGhQWEQoJmZwLT5oZWFkZXIuc2VsZik7CisKKwkvKiBGcmVlIHF1b3RhIGFsbG9jYXRpb24uICovCisJRFFVT1RfRlJFRV9CTE9DSyhpcCwgeGxlbik7CisKKwkvKiBmcmVlL2ludmFsaWRhdGUgaXRzIGJ1ZmZlciBwYWdlICovCisJZGlzY2FyZF9tZXRhcGFnZShmbXApOworCisJLyoKKwkgKiAgICAgIHByb3BhZ2F0ZSBwYWdlIGRlbGV0aW9uIHVwIHRoZSBkaXJlY3RvcnkgdHJlZQorCSAqCisJICogSWYgdGhlIGRlbGV0ZSBmcm9tIHRoZSBwYXJlbnQgcGFnZSBtYWtlcyBpdCBlbXB0eSwKKwkgKiBjb250aW51ZSBhbGwgdGhlIHdheSB1cCB0aGUgdHJlZS4KKwkgKiBzdG9wIGlmIHRoZSByb290IHBhZ2UgaXMgcmVhY2hlZCAod2hpY2ggaXMgbmV2ZXIgZGVsZXRlZCkgb3IKKwkgKiBpZiB0aGUgZW50cnkgZGVsZXRpb24gZG9lcyBub3QgZW1wdHkgdGhlIHBhZ2UuCisJICovCisJd2hpbGUgKChwYXJlbnQgPSBCVF9QT1AoYnRzdGFjaykpICE9IE5VTEwpIHsKKwkJLyogcGluIHRoZSBwYXJlbnQgcGFnZSA8c3A+ICovCisJCURUX0dFVFBBR0UoaXAsIHBhcmVudC0+Ym4sIG1wLCBQU0laRSwgcCwgcmMpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJLyoKKwkJICogZnJlZSB0aGUgZXh0ZW50IG9mIHRoZSBjaGlsZCBwYWdlIGRlbGV0ZWQKKwkJICovCisJCWluZGV4ID0gcGFyZW50LT5pbmRleDsKKworCQkvKgorCQkgKiBkZWxldGUgdGhlIGVudHJ5IGZvciB0aGUgY2hpbGQgcGFnZSBmcm9tIHBhcmVudAorCQkgKi8KKwkJbmV4dGluZGV4ID0gcC0+aGVhZGVyLm5leHRpbmRleDsKKworCQkvKgorCQkgKiB0aGUgcGFyZW50IGhhcyB0aGUgc2luZ2xlIGVudHJ5IGJlaW5nIGRlbGV0ZWQ6CisJCSAqCisJCSAqIGZyZWUgdGhlIHBhcmVudCBwYWdlIHdoaWNoIGhhcyBiZWNvbWUgZW1wdHkuCisJCSAqLworCQlpZiAobmV4dGluZGV4ID09IDEpIHsKKwkJCS8qCisJCQkgKiBrZWVwIHRoZSByb290IGludGVybmFsIHBhZ2Ugd2hpY2ggaGFzIGJlY29tZSBlbXB0eQorCQkJICovCisJCQlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9ST09UKSB7CisJCQkJLyoKKwkJCQkgKiByZXNldCB0aGUgcm9vdAorCQkJCSAqCisJCQkJICogZHRJbml0Um9vdCgpIGFjcXVpcmVzIHR4bG9jayBvbiB0aGUgcm9vdAorCQkJCSAqLworCQkJCWR0SW5pdFJvb3QodGlkLCBpcCwgUEFSRU5UKGlwKSk7CisKKwkJCQlEVF9QVVRQQUdFKG1wKTsKKworCQkJCXJldHVybiAwOworCQkJfQorCQkJLyoKKwkJCSAqIGZyZWUgdGhlIHBhcmVudCBwYWdlCisJCQkgKi8KKwkJCWVsc2UgeworCQkJCS8qCisJCQkJICogYWNxdWlyZSBhIHRyYW5zYWN0aW9uIGxvY2sgb24gdGhlIHBhZ2UKKwkJCQkgKgorCQkJCSAqIHdyaXRlIEZSRUVYVEVOVHxOT1JFRE9QQUdFIGxvZyByZWNvcmQKKwkJCQkgKi8KKwkJCQl0bGNrID0KKwkJCQkgICAgdHhNYXBsb2NrKHRpZCwgaXAsCisJCQkJCSAgICAgIHRsY2tEVFJFRSB8IHRsY2tGUkVFKTsKKwkJCQlweGRsb2NrID0gKHN0cnVjdCBweGRfbG9jayAqKSAmIHRsY2stPmxvY2s7CisJCQkJcHhkbG9jay0+ZmxhZyA9IG1sY2tGUkVFUFhEOworCQkJCXB4ZGxvY2stPnB4ZCA9IHAtPmhlYWRlci5zZWxmOworCQkJCXB4ZGxvY2stPmluZGV4ID0gMTsKKworCQkJCS8qIHVwZGF0ZSBzaWJsaW5nIHBvaW50ZXJzICovCisJCQkJaWYgKChyYyA9IGR0UmVsaW5rKHRpZCwgaXAsIHApKSkgeworCQkJCQlEVF9QVVRQQUdFKG1wKTsKKwkJCQkJcmV0dXJuIHJjOworCQkJCX0KKworCQkJCXhsZW4gPSBsZW5ndGhQWEQoJnAtPmhlYWRlci5zZWxmKTsKKworCQkJCS8qIEZyZWUgcXVvdGEgYWxsb2NhdGlvbiAqLworCQkJCURRVU9UX0ZSRUVfQkxPQ0soaXAsIHhsZW4pOworCisJCQkJLyogZnJlZS9pbnZhbGlkYXRlIGl0cyBidWZmZXIgcGFnZSAqLworCQkJCWRpc2NhcmRfbWV0YXBhZ2UobXApOworCisJCQkJLyogcHJvcGFnYXRlIHVwICovCisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiB0aGUgcGFyZW50IGhhcyBvdGhlciBlbnRyaWVzIHJlbWFpbmluZzoKKwkJICoKKwkJICogZGVsZXRlIHRoZSByb3V0ZXIgZW50cnkgZnJvbSB0aGUgcGFyZW50IHBhZ2UuCisJCSAqLworCQlCVF9NQVJLX0RJUlRZKG1wLCBpcCk7CisJCS8qCisJCSAqIGFjcXVpcmUgYSB0cmFuc2FjdGlvbiBsb2NrIG9uIHRoZSBwYWdlCisJCSAqCisJCSAqIGFjdGlvbjogcm91dGVyIGVudHJ5IGRlbGV0aW9uCisJCSAqLworCQl0bGNrID0gdHhMb2NrKHRpZCwgaXAsIG1wLCB0bGNrRFRSRUUgfCB0bGNrRU5UUlkpOworCQlkdGxjayA9IChzdHJ1Y3QgZHRfbG9jayAqKSAmIHRsY2stPmxvY2s7CisKKwkJLyogbGluZWxvY2sgaGVhZGVyICovCisJCWlmIChkdGxjay0+aW5kZXggPj0gZHRsY2stPm1heGNudCkKKwkJCWR0bGNrID0gKHN0cnVjdCBkdF9sb2NrICopIHR4TGluZWxvY2soZHRsY2spOworCQlsdiA9ICYgZHRsY2stPmx2W2R0bGNrLT5pbmRleF07CisJCWx2LT5vZmZzZXQgPSAwOworCQlsdi0+bGVuZ3RoID0gMTsKKwkJZHRsY2stPmluZGV4Kys7CisKKwkJLyogbGluZWxvY2sgc3RibCBvZiBub24tcm9vdCBsZWFmIHBhZ2UgKi8KKwkJaWYgKCEocC0+aGVhZGVyLmZsYWcgJiBCVF9ST09UKSkgeworCQkJaWYgKGR0bGNrLT5pbmRleCA8IGR0bGNrLT5tYXhjbnQpCisJCQkJbHYrKzsKKwkJCWVsc2UgeworCQkJCWR0bGNrID0gKHN0cnVjdCBkdF9sb2NrICopIHR4TGluZWxvY2soZHRsY2spOworCQkJCWx2ID0gJiBkdGxjay0+bHZbMF07CisJCQl9CisJCQlpID0gaW5kZXggPj4gTDJEVFNMT1RTSVpFOworCQkJbHYtPm9mZnNldCA9IHAtPmhlYWRlci5zdGJsaW5kZXggKyBpOworCQkJbHYtPmxlbmd0aCA9CisJCQkgICAgKChwLT5oZWFkZXIubmV4dGluZGV4IC0gMSkgPj4gTDJEVFNMT1RTSVpFKSAtCisJCQkgICAgaSArIDE7CisJCQlkdGxjay0+aW5kZXgrKzsKKwkJfQorCisJCS8qIGZyZWUgdGhlIHJvdXRlciBlbnRyeSAqLworCQlkdERlbGV0ZUVudHJ5KHAsIGluZGV4LCAmZHRsY2spOworCisJCS8qIHJlc2V0IGtleSBvZiBuZXcgbGVmdG1vc3QgZW50cnkgb2YgbGV2ZWwgKGZvciBjb25zaXN0ZW5jeSkgKi8KKwkJaWYgKGluZGV4ID09IDAgJiYKKwkJICAgICgocC0+aGVhZGVyLmZsYWcgJiBCVF9ST09UKSB8fCBwLT5oZWFkZXIucHJldiA9PSAwKSkKKwkJCWR0VHJ1bmNhdGVFbnRyeShwLCAwLCAmZHRsY2spOworCisJCS8qIHVucGluIHRoZSBwYXJlbnQgcGFnZSAqLworCQlEVF9QVVRQQUdFKG1wKTsKKworCQkvKiBleGl0IHByb3BhZ2F0aW9uIHVwICovCisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisjaWZkZWYgX05PVFlFVAorLyoKKyAqIE5BTUU6ICAgICAgICBkdFJlbG9jYXRlKCkKKyAqCisgKiBGVU5DVElPTjogICAgcmVsb2NhdGUgZHRwYWdlIChpbnRlcm5hbCBvciBsZWFmKSBvZiBkaXJlY3Rvcnk7CisgKiAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBtYWlubHkgdXNlZCBieSBkZWZyYWdmcyB1dGlsaXR5LgorICovCitpbnQgZHRSZWxvY2F0ZSh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsIHM2NCBsbXhhZGRyLCBweGRfdCAqIG9weGQsCisJICAgICAgIHM2NCBueGFkZHIpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wLCAqcG1wLCAqbG1wLCAqcm1wOworCWR0cGFnZV90ICpwLCAqcHAsICpycCA9IDAsICpscD0gMDsKKwlzNjQgYm47CisJaW50IGluZGV4OworCXN0cnVjdCBidHN0YWNrIGJ0c3RhY2s7CisJcHhkX3QgKnB4ZDsKKwlzNjQgb3hhZGRyLCBuZXh0Ym4sIHByZXZibjsKKwlpbnQgeGxlbiwgeHNpemU7CisJc3RydWN0IHRsb2NrICp0bGNrOworCXN0cnVjdCBkdF9sb2NrICpkdGxjazsKKwlzdHJ1Y3QgcHhkX2xvY2sgKnB4ZGxvY2s7CisJczggKnN0Ymw7CisJc3RydWN0IGx2ICpsdjsKKworCW94YWRkciA9IGFkZHJlc3NQWEQob3B4ZCk7CisJeGxlbiA9IGxlbmd0aFBYRChvcHhkKTsKKworCWpmc19pbmZvKCJkdFJlbG9jYXRlOiBsbXhhZGRyOiVMZCB4YWRkcjolTGQ6JUxkIHhsZW46JWQiLAorCQkgICAobG9uZyBsb25nKWxteGFkZHIsIChsb25nIGxvbmcpb3hhZGRyLCAobG9uZyBsb25nKW54YWRkciwKKwkJICAgeGxlbik7CisKKwkvKgorCSAqICAgICAgMS4gZ2V0IHRoZSBpbnRlcm5hbCBwYXJlbnQgZHRwYWdlIGNvdmVyaW5nCisJICogICAgICByb3V0ZXIgZW50cnkgZm9yIHRoZSB0YXJ0Z2V0IHBhZ2UgdG8gYmUgcmVsb2NhdGVkOworCSAqLworCXJjID0gZHRTZWFyY2hOb2RlKGlwLCBsbXhhZGRyLCBvcHhkLCAmYnRzdGFjayk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwkvKiByZXRyaWV2ZSBzZWFyY2ggcmVzdWx0ICovCisJRFRfR0VUU0VBUkNIKGlwLCBidHN0YWNrLnRvcCwgYm4sIHBtcCwgcHAsIGluZGV4KTsKKwlqZnNfaW5mbygiZHRSZWxvY2F0ZTogcGFyZW50IHJvdXRlciBlbnRyeSB2YWxpZGF0ZWQuIik7CisKKwkvKgorCSAqICAgICAgMi4gcmVsb2NhdGUgdGhlIHRhcmdldCBkdHBhZ2UKKwkgKi8KKwkvKiByZWFkIGluIHRoZSB0YXJnZXQgcGFnZSBmcm9tIHNyYyBleHRlbnQgKi8KKwlEVF9HRVRQQUdFKGlwLCBveGFkZHIsIG1wLCBQU0laRSwgcCwgcmMpOworCWlmIChyYykgeworCQkvKiByZWxlYXNlIHRoZSBwaW5uZWQgcGFyZW50IHBhZ2UgKi8KKwkJRFRfUFVUUEFHRShwbXApOworCQlyZXR1cm4gcmM7CisJfQorCisJLyoKKwkgKiByZWFkIGluIHNpYmxpbmcgcGFnZXMgaWYgYW55IHRvIHVwZGF0ZSBzaWJsaW5nIHBvaW50ZXJzOworCSAqLworCXJtcCA9IE5VTEw7CisJaWYgKHAtPmhlYWRlci5uZXh0KSB7CisJCW5leHRibiA9IGxlNjRfdG9fY3B1KHAtPmhlYWRlci5uZXh0KTsKKwkJRFRfR0VUUEFHRShpcCwgbmV4dGJuLCBybXAsIFBTSVpFLCBycCwgcmMpOworCQlpZiAocmMpIHsKKwkJCURUX1BVVFBBR0UobXApOworCQkJRFRfUFVUUEFHRShwbXApOworCQkJcmV0dXJuIChyYyk7CisJCX0KKwl9CisKKwlsbXAgPSBOVUxMOworCWlmIChwLT5oZWFkZXIucHJldikgeworCQlwcmV2Ym4gPSBsZTY0X3RvX2NwdShwLT5oZWFkZXIucHJldik7CisJCURUX0dFVFBBR0UoaXAsIHByZXZibiwgbG1wLCBQU0laRSwgbHAsIHJjKTsKKwkJaWYgKHJjKSB7CisJCQlEVF9QVVRQQUdFKG1wKTsKKwkJCURUX1BVVFBBR0UocG1wKTsKKwkJCWlmIChybXApCisJCQkJRFRfUFVUUEFHRShybXApOworCQkJcmV0dXJuIChyYyk7CisJCX0KKwl9CisKKwkvKiBhdCB0aGlzIHBvaW50LCBhbGwgeHRwYWdlcyB0byBiZSB1cGRhdGVkIGFyZSBpbiBtZW1vcnkgKi8KKworCS8qCisJICogdXBkYXRlIHNpYmxpbmcgcG9pbnRlcnMgb2Ygc2libGluZyBkdHBhZ2VzIGlmIGFueTsKKwkgKi8KKwlpZiAobG1wKSB7CisJCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgbG1wLCB0bGNrRFRSRUUgfCB0bGNrUkVMSU5LKTsKKwkJZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgJiB0bGNrLT5sb2NrOworCQkvKiBsaW5lbG9jayBoZWFkZXIgKi8KKwkJQVNTRVJUKGR0bGNrLT5pbmRleCA9PSAwKTsKKwkJbHYgPSAmIGR0bGNrLT5sdlswXTsKKwkJbHYtPm9mZnNldCA9IDA7CisJCWx2LT5sZW5ndGggPSAxOworCQlkdGxjay0+aW5kZXgrKzsKKworCQlscC0+aGVhZGVyLm5leHQgPSBjcHVfdG9fbGU2NChueGFkZHIpOworCQlEVF9QVVRQQUdFKGxtcCk7CisJfQorCisJaWYgKHJtcCkgeworCQl0bGNrID0gdHhMb2NrKHRpZCwgaXAsIHJtcCwgdGxja0RUUkVFIHwgdGxja1JFTElOSyk7CisJCWR0bGNrID0gKHN0cnVjdCBkdF9sb2NrICopICYgdGxjay0+bG9jazsKKwkJLyogbGluZWxvY2sgaGVhZGVyICovCisJCUFTU0VSVChkdGxjay0+aW5kZXggPT0gMCk7CisJCWx2ID0gJiBkdGxjay0+bHZbMF07CisJCWx2LT5vZmZzZXQgPSAwOworCQlsdi0+bGVuZ3RoID0gMTsKKwkJZHRsY2stPmluZGV4Kys7CisKKwkJcnAtPmhlYWRlci5wcmV2ID0gY3B1X3RvX2xlNjQobnhhZGRyKTsKKwkJRFRfUFVUUEFHRShybXApOworCX0KKworCS8qCisJICogdXBkYXRlIHRoZSB0YXJnZXQgZHRwYWdlIHRvIGJlIHJlbG9jYXRlZAorCSAqCisJICogd3JpdGUgTE9HX1JFRE9QQUdFIG9mIExPR19ORVcgdHlwZSBmb3IgZHN0IHBhZ2UKKwkgKiBmb3IgdGhlIHdob2xlIHRhcmdldCBwYWdlIChsb2dyZWRvKCkgd2lsbCBhcHBseQorCSAqIGFmdGVyIGltYWdlIGFuZCB1cGRhdGUgYm1hcCBmb3IgYWxsb2NhdGlvbiBvZiB0aGUKKwkgKiBkc3QgZXh0ZW50KSwgYW5kIHVwZGF0ZSBibWFwIGZvciBhbGxvY2F0aW9uIG9mCisJICogdGhlIGRzdCBleHRlbnQ7CisJICovCisJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBtcCwgdGxja0RUUkVFIHwgdGxja05FVyk7CisJZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgJiB0bGNrLT5sb2NrOworCS8qIGxpbmVsb2NrIGhlYWRlciAqLworCUFTU0VSVChkdGxjay0+aW5kZXggPT0gMCk7CisJbHYgPSAmIGR0bGNrLT5sdlswXTsKKworCS8qIHVwZGF0ZSB0aGUgc2VsZiBhZGRyZXNzIGluIHRoZSBkdHBhZ2UgaGVhZGVyICovCisJcHhkID0gJnAtPmhlYWRlci5zZWxmOworCVBYRGFkZHJlc3MocHhkLCBueGFkZHIpOworCisJLyogdGhlIGRzdCBwYWdlIGlzIHRoZSBzYW1lIGFzIHRoZSBzcmMgcGFnZSwgaS5lLiwKKwkgKiBsaW5lbG9jayBmb3IgYWZ0ZXJpbWFnZSBvZiB0aGUgd2hvbGUgcGFnZTsKKwkgKi8KKwlsdi0+b2Zmc2V0ID0gMDsKKwlsdi0+bGVuZ3RoID0gcC0+aGVhZGVyLm1heHNsb3Q7CisJZHRsY2stPmluZGV4Kys7CisKKwkvKiB1cGRhdGUgdGhlIGJ1ZmZlciBleHRlbnQgZGVzY3JpcHRvciBvZiB0aGUgZHRwYWdlICovCisJeHNpemUgPSB4bGVuIDw8IEpGU19TQkkoaXAtPmlfc2IpLT5sMmJzaXplOworI2lmZGVmIF9TVElMTF9UT19QT1JUCisJYm1TZXRYRChtcCwgbnhhZGRyLCB4c2l6ZSk7CisjZW5kaWYgLyogX1NUSUxMX1RPX1BPUlQgKi8KKwkvKiB1bnBpbiB0aGUgcmVsb2NhdGVkIHBhZ2UgKi8KKwlEVF9QVVRQQUdFKG1wKTsKKwlqZnNfaW5mbygiZHRSZWxvY2F0ZTogdGFyZ2V0IGR0cGFnZSByZWxvY2F0ZWQuIik7CisKKwkvKiB0aGUgbW92ZWQgZXh0ZW50IGlzIGR0cGFnZSwgdGhlbiBhIExPR19OT1JFRE9QQUdFIGxvZyByZWMKKwkgKiBuZWVkcyB0byBiZSB3cml0dGVuIChpbiBsb2dyZWRvKCksIHRoZSBMT0dfTk9SRURPUEFHRSBsb2cgcmVjCisJICogd2lsbCBhbHNvIGZvcmNlIGEgYm1hcCB1cGRhdGUgKS4KKwkgKi8KKworCS8qCisJICogICAgICAzLiBhY3F1aXJlIG1hcGxvY2sgZm9yIHRoZSBzb3VyY2UgZXh0ZW50IHRvIGJlIGZyZWVkOworCSAqLworCS8qIGZvciBkdHBhZ2UgcmVsb2NhdGlvbiwgd3JpdGUgYSBMT0dfTk9SRURPUEFHRSByZWNvcmQKKwkgKiBmb3IgdGhlIHNvdXJjZSBkdHBhZ2UgKGxvZ3JlZG8oKSB3aWxsIGluaXQgTm9SZWRvUGFnZQorCSAqIGZpbHRlciBhbmQgd2lsbCBhbHNvIHVwZGF0ZSBibWFwIGZvciBmcmVlIG9mIHRoZSBzb3VyY2UKKwkgKiBkdHBhZ2UpLCBhbmQgdXBhZHRlIGJtYXAgZm9yIGZyZWUgb2YgdGhlIHNvdXJjZSBkdHBhZ2U7CisJICovCisJdGxjayA9IHR4TWFwbG9jayh0aWQsIGlwLCB0bGNrRFRSRUUgfCB0bGNrRlJFRSk7CisJcHhkbG9jayA9IChzdHJ1Y3QgcHhkX2xvY2sgKikgJiB0bGNrLT5sb2NrOworCXB4ZGxvY2stPmZsYWcgPSBtbGNrRlJFRVBYRDsKKwlQWERhZGRyZXNzKCZweGRsb2NrLT5weGQsIG94YWRkcik7CisJUFhEbGVuZ3RoKCZweGRsb2NrLT5weGQsIHhsZW4pOworCXB4ZGxvY2stPmluZGV4ID0gMTsKKworCS8qCisJICogICAgICA0LiB1cGRhdGUgdGhlIHBhcmVudCByb3V0ZXIgZW50cnkgZm9yIHJlbG9jYXRpb247CisJICoKKwkgKiBhY3F1aXJlIHRsY2sgZm9yIHRoZSBwYXJlbnQgZW50cnkgY292ZXJpbmcgdGhlIHRhcmdldCBkdHBhZ2U7CisJICogd3JpdGUgTE9HX1JFRE9QQUdFIHRvIGFwcGx5IGFmdGVyIGltYWdlIG9ubHk7CisJICovCisJamZzX2luZm8oImR0UmVsb2NhdGU6IHVwZGF0ZSBwYXJlbnQgcm91dGVyIGVudHJ5LiIpOworCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgcG1wLCB0bGNrRFRSRUUgfCB0bGNrRU5UUlkpOworCWR0bGNrID0gKHN0cnVjdCBkdF9sb2NrICopICYgdGxjay0+bG9jazsKKwlsdiA9ICYgZHRsY2stPmx2W2R0bGNrLT5pbmRleF07CisKKwkvKiB1cGRhdGUgdGhlIFBYRCB3aXRoIHRoZSBuZXcgYWRkcmVzcyAqLworCXN0YmwgPSBEVF9HRVRTVEJMKHBwKTsKKwlweGQgPSAocHhkX3QgKikgJiBwcC0+c2xvdFtzdGJsW2luZGV4XV07CisJUFhEYWRkcmVzcyhweGQsIG54YWRkcik7CisJbHYtPm9mZnNldCA9IHN0YmxbaW5kZXhdOworCWx2LT5sZW5ndGggPSAxOworCWR0bGNrLT5pbmRleCsrOworCisJLyogdW5waW4gdGhlIHBhcmVudCBkdHBhZ2UgKi8KKwlEVF9QVVRQQUdFKHBtcCk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBOQU1FOglkdFNlYXJjaE5vZGUoKQorICoKKyAqIEZVTkNUSU9OOglTZWFyY2ggZm9yIGFuIGR0cGFnZSBjb250YWluaW5nIGEgc3BlY2lmaWVkIGFkZHJlc3MKKyAqICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIG1haW5seSB1c2VkIGJ5IGRlZnJhZ2ZzIHV0aWxpdHkuCisgKgorICogTk9URToJU2VhcmNoIHJlc3VsdCBvbiBzdGFjaywgdGhlIGZvdW5kIHBhZ2UgaXMgcGlubmVkIGF0IGV4aXQuCisgKgkJVGhlIHJlc3VsdCBwYWdlIG11c3QgYmUgYW4gaW50ZXJuYWwgZHRwYWdlLgorICoJCWxteGFkZHIgZ2l2ZSB0aGUgYWRkcmVzcyBvZiB0aGUgbGVmdCBtb3N0IHBhZ2Ugb2YgdGhlCisgKgkJZHRyZWUgbGV2ZWwsIGluIHdoaWNoIHRoZSByZXF1aXJlZCBkdHBhZ2UgcmVzaWRlcy4KKyAqLworc3RhdGljIGludCBkdFNlYXJjaE5vZGUoc3RydWN0IGlub2RlICppcCwgczY0IGxteGFkZHIsIHB4ZF90ICoga3B4ZCwKKwkJCXN0cnVjdCBidHN0YWNrICogYnRzdGFjaykKK3sKKwlpbnQgcmMgPSAwOworCXM2NCBibjsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCWR0cGFnZV90ICpwOworCWludCBwc2l6ZSA9IDI4ODsJLyogaW5pdGlhbCBpbi1saW5lIGRpcmVjdG9yeSAqLworCXM4ICpzdGJsOworCWludCBpOworCXB4ZF90ICpweGQ7CisJc3RydWN0IGJ0ZnJhbWUgKmJ0c3A7CisKKwlCVF9DTFIoYnRzdGFjayk7CS8qIHJlc2V0IHN0YWNrICovCisKKwkvKgorCSAqICAgICAgZGVzY2VuZCB0cmVlIHRvIHRoZSBsZXZlbCB3aXRoIHNwZWNpZmllZCBsZWZ0bW9zdCBwYWdlCisJICoKKwkgKiAgYnkgY29udmVudGlvbiwgcm9vdCBibiA9IDAuCisJICovCisJZm9yIChibiA9IDA7OykgeworCQkvKiBnZXQvcGluIHRoZSBwYWdlIHRvIHNlYXJjaCAqLworCQlEVF9HRVRQQUdFKGlwLCBibiwgbXAsIHBzaXplLCBwLCByYyk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKworCQkvKiBkb2VzIHRoZSB4YWRkciBvZiBsZWZ0bW9zdCBwYWdlIG9mIHRoZSBsZXZldmwKKwkJICogbWF0Y2hlcyBsZXZldmwgc2VhcmNoIGtleSA/CisJCSAqLworCQlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9ST09UKSB7CisJCQlpZiAobG14YWRkciA9PSAwKQorCQkJCWJyZWFrOworCQl9IGVsc2UgaWYgKGFkZHJlc3NQWEQoJnAtPmhlYWRlci5zZWxmKSA9PSBsbXhhZGRyKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogZGVzY2VuZCBkb3duIHRvIGxlZnRtb3N0IGNoaWxkIHBhZ2UKKwkJICovCisJCWlmIChwLT5oZWFkZXIuZmxhZyAmIEJUX0xFQUYpIHsKKwkJCURUX1BVVFBBR0UobXApOworCQkJcmV0dXJuIC1FU1RBTEU7CisJCX0KKworCQkvKiBnZXQgdGhlIGxlZnRtb3N0IGVudHJ5ICovCisJCXN0YmwgPSBEVF9HRVRTVEJMKHApOworCQlweGQgPSAocHhkX3QgKikgJiBwLT5zbG90W3N0YmxbMF1dOworCisJCS8qIGdldCB0aGUgY2hpbGQgcGFnZSBibG9jayBhZGRyZXNzICovCisJCWJuID0gYWRkcmVzc1BYRChweGQpOworCQlwc2l6ZSA9IGxlbmd0aFBYRChweGQpIDw8IEpGU19TQkkoaXAtPmlfc2IpLT5sMmJzaXplOworCQkvKiB1bnBpbiB0aGUgcGFyZW50IHBhZ2UgKi8KKwkJRFRfUFVUUEFHRShtcCk7CisJfQorCisJLyoKKwkgKiAgICAgIHNlYXJjaCBlYWNoIHBhZ2UgYXQgdGhlIGN1cnJlbnQgbGV2ZXZsCisJICovCisgICAgICBsb29wOgorCXN0YmwgPSBEVF9HRVRTVEJMKHApOworCWZvciAoaSA9IDA7IGkgPCBwLT5oZWFkZXIubmV4dGluZGV4OyBpKyspIHsKKwkJcHhkID0gKHB4ZF90ICopICYgcC0+c2xvdFtzdGJsW2ldXTsKKworCQkvKiBmb3VuZCB0aGUgc3BlY2lmaWVkIHJvdXRlciBlbnRyeSAqLworCQlpZiAoYWRkcmVzc1BYRChweGQpID09IGFkZHJlc3NQWEQoa3B4ZCkgJiYKKwkJICAgIGxlbmd0aFBYRChweGQpID09IGxlbmd0aFBYRChrcHhkKSkgeworCQkJYnRzcCA9IGJ0c3RhY2stPnRvcDsKKwkJCWJ0c3AtPmJuID0gYm47CisJCQlidHNwLT5pbmRleCA9IGk7CisJCQlidHNwLT5tcCA9IG1wOworCisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCS8qIGdldCB0aGUgcmlnaHQgc2libGluZyBwYWdlIGlmIGFueSAqLworCWlmIChwLT5oZWFkZXIubmV4dCkKKwkJYm4gPSBsZTY0X3RvX2NwdShwLT5oZWFkZXIubmV4dCk7CisJZWxzZSB7CisJCURUX1BVVFBBR0UobXApOworCQlyZXR1cm4gLUVTVEFMRTsKKwl9CisKKwkvKiB1bnBpbiBjdXJyZW50IHBhZ2UgKi8KKwlEVF9QVVRQQUdFKG1wKTsKKworCS8qIGdldCB0aGUgcmlnaHQgc2libGluZyBwYWdlICovCisJRFRfR0VUUEFHRShpcCwgYm4sIG1wLCBQU0laRSwgcCwgcmMpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJZ290byBsb29wOworfQorI2VuZGlmIC8qIF9OT1RZRVQgKi8KKworLyoKKyAqCWR0UmVsaW5rKCkKKyAqCisgKiBmdW5jdGlvbjoKKyAqCWxpbmsgYXJvdW5kIGEgZnJlZWQgcGFnZS4KKyAqCisgKiBwYXJhbWV0ZXI6CisgKglmcDoJcGFnZSB0byBiZSBmcmVlZAorICoKKyAqIHJldHVybjoKKyAqLworc3RhdGljIGludCBkdFJlbGluayh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsIGR0cGFnZV90ICogcCkKK3sKKwlpbnQgcmM7CisJc3RydWN0IG1ldGFwYWdlICptcDsKKwlzNjQgbmV4dGJuLCBwcmV2Ym47CisJc3RydWN0IHRsb2NrICp0bGNrOworCXN0cnVjdCBkdF9sb2NrICpkdGxjazsKKwlzdHJ1Y3QgbHYgKmx2OworCisJbmV4dGJuID0gbGU2NF90b19jcHUocC0+aGVhZGVyLm5leHQpOworCXByZXZibiA9IGxlNjRfdG9fY3B1KHAtPmhlYWRlci5wcmV2KTsKKworCS8qIHVwZGF0ZSBwcmV2IHBvaW50ZXIgb2YgdGhlIG5leHQgcGFnZSAqLworCWlmIChuZXh0Ym4gIT0gMCkgeworCQlEVF9HRVRQQUdFKGlwLCBuZXh0Ym4sIG1wLCBQU0laRSwgcCwgcmMpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJQlRfTUFSS19ESVJUWShtcCwgaXApOworCQkvKgorCQkgKiBhY3F1aXJlIGEgdHJhbnNhY3Rpb24gbG9jayBvbiB0aGUgbmV4dCBwYWdlCisJCSAqCisJCSAqIGFjdGlvbjogdXBkYXRlIHByZXYgcG9pbnRlcjsKKwkJICovCisJCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgbXAsIHRsY2tEVFJFRSB8IHRsY2tSRUxJTkspOworCQlqZnNfaW5mbygiZHRSZWxpbmsgbmV4dGJuOiB0bGNrID0gMHglcCwgaXAgPSAweCVwLCBtcD0weCVwIiwKKwkJCXRsY2ssIGlwLCBtcCk7CisJCWR0bGNrID0gKHN0cnVjdCBkdF9sb2NrICopICYgdGxjay0+bG9jazsKKworCQkvKiBsaW5lbG9jayBoZWFkZXIgKi8KKwkJaWYgKGR0bGNrLT5pbmRleCA+PSBkdGxjay0+bWF4Y250KQorCQkJZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgdHhMaW5lbG9jayhkdGxjayk7CisJCWx2ID0gJiBkdGxjay0+bHZbZHRsY2stPmluZGV4XTsKKwkJbHYtPm9mZnNldCA9IDA7CisJCWx2LT5sZW5ndGggPSAxOworCQlkdGxjay0+aW5kZXgrKzsKKworCQlwLT5oZWFkZXIucHJldiA9IGNwdV90b19sZTY0KHByZXZibik7CisJCURUX1BVVFBBR0UobXApOworCX0KKworCS8qIHVwZGF0ZSBuZXh0IHBvaW50ZXIgb2YgdGhlIHByZXZpb3VzIHBhZ2UgKi8KKwlpZiAocHJldmJuICE9IDApIHsKKwkJRFRfR0VUUEFHRShpcCwgcHJldmJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCUJUX01BUktfRElSVFkobXAsIGlwKTsKKwkJLyoKKwkJICogYWNxdWlyZSBhIHRyYW5zYWN0aW9uIGxvY2sgb24gdGhlIHByZXYgcGFnZQorCQkgKgorCQkgKiBhY3Rpb246IHVwZGF0ZSBuZXh0IHBvaW50ZXI7CisJCSAqLworCQl0bGNrID0gdHhMb2NrKHRpZCwgaXAsIG1wLCB0bGNrRFRSRUUgfCB0bGNrUkVMSU5LKTsKKwkJamZzX2luZm8oImR0UmVsaW5rIHByZXZibjogdGxjayA9IDB4JXAsIGlwID0gMHglcCwgbXA9MHglcCIsCisJCQl0bGNrLCBpcCwgbXApOworCQlkdGxjayA9IChzdHJ1Y3QgZHRfbG9jayAqKSAmIHRsY2stPmxvY2s7CisKKwkJLyogbGluZWxvY2sgaGVhZGVyICovCisJCWlmIChkdGxjay0+aW5kZXggPj0gZHRsY2stPm1heGNudCkKKwkJCWR0bGNrID0gKHN0cnVjdCBkdF9sb2NrICopIHR4TGluZWxvY2soZHRsY2spOworCQlsdiA9ICYgZHRsY2stPmx2W2R0bGNrLT5pbmRleF07CisJCWx2LT5vZmZzZXQgPSAwOworCQlsdi0+bGVuZ3RoID0gMTsKKwkJZHRsY2stPmluZGV4Kys7CisKKwkJcC0+aGVhZGVyLm5leHQgPSBjcHVfdG9fbGU2NChuZXh0Ym4pOworCQlEVF9QVVRQQUdFKG1wKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICoJZHRJbml0Um9vdCgpCisgKgorICogaW5pdGlhbGl6ZSBkaXJlY3Rvcnkgcm9vdCAoaW5saW5lIGluIGlub2RlKQorICovCit2b2lkIGR0SW5pdFJvb3QodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLCB1MzIgaWRvdGRvdCkKK3sKKwlzdHJ1Y3QgamZzX2lub2RlX2luZm8gKmpmc19pcCA9IEpGU19JUChpcCk7CisJZHRyb290X3QgKnA7CisJaW50IGZzaTsKKwlzdHJ1Y3QgZHRzbG90ICpmOworCXN0cnVjdCB0bG9jayAqdGxjazsKKwlzdHJ1Y3QgZHRfbG9jayAqZHRsY2s7CisJc3RydWN0IGx2ICpsdjsKKwl1MTYgeGZsYWdfc2F2ZTsKKworCS8qCisJICogSWYgdGhpcyB3YXMgcHJldmlvdXNseSBhbiBub24tZW1wdHkgZGlyZWN0b3J5LCB3ZSBuZWVkIHRvIHJlbW92ZQorCSAqIHRoZSBvbGQgZGlyZWN0b3J5IHRhYmxlLgorCSAqLworCWlmIChET19JTkRFWChpcCkpIHsKKwkJaWYgKCFqZnNfZGlydGFibGVfaW5saW5lKGlwKSkgeworCQkJc3RydWN0IHRibG9jayAqdGJsayA9IHRpZF90b190YmxvY2sodGlkKTsKKwkJCS8qCisJCQkgKiBXZSdyZSBwbGF5aW5nIGdhbWVzIHdpdGggdGhlIHRpZCdzIHhmbGFnLiAgSWYKKwkJCSAqIHdlJ3JlIHJlbW92aW5nIGEgcmVndWxhciBmaWxlLCB0aGUgZmlsZSdzIHh0cmVlCisJCQkgKiBpcyBjb21taXR0ZWQgd2l0aCBDT01NSVRfUE1BUCwgYnV0IHdlIGFsd2F5cworCQkJICogY29tbWl0IHRoZSBkaXJlY3RvcmllcyB4dHJlZSB3aXRoIENPTU1JVF9QV01BUC4KKwkJCSAqLworCQkJeGZsYWdfc2F2ZSA9IHRibGstPnhmbGFnOworCQkJdGJsay0+eGZsYWcgPSAwOworCQkJLyoKKwkJCSAqIHh0VHJ1bmNhdGUgaXNuJ3QgZ3VhcmFudGVlZCB0byBmdWxseSB0cnVuY2F0ZQorCQkJICogdGhlIHh0cmVlLiAgVGhlIGNhbGxlciBuZWVkcyB0byBjaGVjayBpX3NpemUKKwkJCSAqIGFmdGVyIGNvbW1pdHRpbmcgdGhlIHRyYW5zYWN0aW9uIHRvIHNlZSBpZgorCQkJICogYWRkaXRpb25hbCB0cnVuY2F0aW9uIGlzIG5lZWRlZC4gIFRoZQorCQkJICogQ09NTUlUX1N0YWxlIGZsYWcgdGVsbHMgY2FsbGVyIHRoYXQgd2UKKwkJCSAqIGluaXRpYXRlZCB0aGUgdHJ1bmNhdGlvbi4KKwkJCSAqLworCQkJeHRUcnVuY2F0ZSh0aWQsIGlwLCAwLCBDT01NSVRfUFdNQVApOworCQkJc2V0X2NmbGFnKENPTU1JVF9TdGFsZSwgaXApOworCisJCQl0YmxrLT54ZmxhZyA9IHhmbGFnX3NhdmU7CisJCX0gZWxzZQorCQkJaXAtPmlfc2l6ZSA9IDE7CisKKwkJamZzX2lwLT5uZXh0X2luZGV4ID0gMjsKKwl9IGVsc2UKKwkJaXAtPmlfc2l6ZSA9IElEQVRBU0laRTsKKworCS8qCisJICogYWNxdWlyZSBhIHRyYW5zYWN0aW9uIGxvY2sgb24gdGhlIHJvb3QKKwkgKgorCSAqIGFjdGlvbjogZGlyZWN0b3J5IGluaXRpYWxpemF0aW9uOworCSAqLworCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgKHN0cnVjdCBtZXRhcGFnZSAqKSAmIGpmc19pcC0+YnhmbGFnLAorCQkgICAgICB0bGNrRFRSRUUgfCB0bGNrRU5UUlkgfCB0bGNrQlRST09UKTsKKwlkdGxjayA9IChzdHJ1Y3QgZHRfbG9jayAqKSAmIHRsY2stPmxvY2s7CisKKwkvKiBsaW5lbG9jayByb290ICovCisJQVNTRVJUKGR0bGNrLT5pbmRleCA9PSAwKTsKKwlsdiA9ICYgZHRsY2stPmx2WzBdOworCWx2LT5vZmZzZXQgPSAwOworCWx2LT5sZW5ndGggPSBEVFJPT1RNQVhTTE9UOworCWR0bGNrLT5pbmRleCsrOworCisJcCA9ICZqZnNfaXAtPmlfZHRyb290OworCisJcC0+aGVhZGVyLmZsYWcgPSBEWERfSU5ERVggfCBCVF9ST09UIHwgQlRfTEVBRjsKKworCXAtPmhlYWRlci5uZXh0aW5kZXggPSAwOworCisJLyogaW5pdCBmcmVlbGlzdCAqLworCWZzaSA9IDE7CisJZiA9ICZwLT5zbG90W2ZzaV07CisKKwkvKiBpbml0IGRhdGEgYXJlYSBvZiByb290ICovCisJZm9yIChmc2krKzsgZnNpIDwgRFRST09UTUFYU0xPVDsgZisrLCBmc2krKykKKwkJZi0+bmV4dCA9IGZzaTsKKwlmLT5uZXh0ID0gLTE7CisKKwlwLT5oZWFkZXIuZnJlZWxpc3QgPSAxOworCXAtPmhlYWRlci5mcmVlY250ID0gODsKKworCS8qIGluaXQgJy4uJyBlbnRyeSAqLworCXAtPmhlYWRlci5pZG90ZG90ID0gY3B1X3RvX2xlMzIoaWRvdGRvdCk7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKglhZGRfbWlzc2luZ19pbmRpY2VzKCkKKyAqCisgKiBmdW5jdGlvbjogRml4IGR0cmVlIHBhZ2UgaW4gd2hpY2ggb25lIG9yIG1vcmUgZW50cmllcyBoYXMgYW4gaW52YWxpZCBpbmRleC4KKyAqCSAgICAgZnNjay5qZnMgc2hvdWxkIHJlYWxseSBmaXggdGhpcywgYnV0IGl0IGN1cnJlbnRseSBkb2VzIG5vdC4KKyAqCSAgICAgQ2FsbGVkIGZyb20gamZzX3JlYWRkaXIgd2hlbiBiYWQgaW5kZXggaXMgZGV0ZWN0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIGFkZF9taXNzaW5nX2luZGljZXMoc3RydWN0IGlub2RlICppbm9kZSwgczY0IGJuKQoreworCXN0cnVjdCBsZHRlbnRyeSAqZDsKKwlzdHJ1Y3QgZHRfbG9jayAqZHRsY2s7CisJaW50IGk7CisJdWludCBpbmRleDsKKwlzdHJ1Y3QgbHYgKmx2OworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJZHRwYWdlX3QgKnA7CisJaW50IHJjOworCXM4ICpzdGJsOworCXRpZF90IHRpZDsKKwlzdHJ1Y3QgdGxvY2sgKnRsY2s7CisKKwl0aWQgPSB0eEJlZ2luKGlub2RlLT5pX3NiLCAwKTsKKworCURUX0dFVFBBR0UoaW5vZGUsIGJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKKworCWlmIChyYykgeworCQlwcmludGsoS0VSTl9FUlIgIkRUX0dFVFBBR0UgZmFpbGVkIVxuIik7CisJCWdvdG8gZW5kOworCX0KKwlCVF9NQVJLX0RJUlRZKG1wLCBpbm9kZSk7CisKKwlBU1NFUlQocC0+aGVhZGVyLmZsYWcgJiBCVF9MRUFGKTsKKworCXRsY2sgPSB0eExvY2sodGlkLCBpbm9kZSwgbXAsIHRsY2tEVFJFRSB8IHRsY2tFTlRSWSk7CisJZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgJnRsY2stPmxvY2s7CisKKwlzdGJsID0gRFRfR0VUU1RCTChwKTsKKwlmb3IgKGkgPSAwOyBpIDwgcC0+aGVhZGVyLm5leHRpbmRleDsgaSsrKSB7CisJCWQgPSAoc3RydWN0IGxkdGVudHJ5ICopICZwLT5zbG90W3N0YmxbaV1dOworCQlpbmRleCA9IGxlMzJfdG9fY3B1KGQtPmluZGV4KTsKKwkJaWYgKChpbmRleCA8IDIpIHx8IChpbmRleCA+PSBKRlNfSVAoaW5vZGUpLT5uZXh0X2luZGV4KSkgeworCQkJZC0+aW5kZXggPSBjcHVfdG9fbGUzMihhZGRfaW5kZXgodGlkLCBpbm9kZSwgYm4sIGkpKTsKKwkJCWlmIChkdGxjay0+aW5kZXggPj0gZHRsY2stPm1heGNudCkKKwkJCQlkdGxjayA9IChzdHJ1Y3QgZHRfbG9jayAqKSB0eExpbmVsb2NrKGR0bGNrKTsKKwkJCWx2ID0gJmR0bGNrLT5sdltkdGxjay0+aW5kZXhdOworCQkJbHYtPm9mZnNldCA9IHN0YmxbaV07CisJCQlsdi0+bGVuZ3RoID0gMTsKKwkJCWR0bGNrLT5pbmRleCsrOworCQl9CisJfQorCisJRFRfUFVUUEFHRShtcCk7CisJKHZvaWQpIHR4Q29tbWl0KHRpZCwgMSwgJmlub2RlLCAwKTsKK2VuZDoKKwl0eEVuZCh0aWQpOworfQorCisvKgorICogQnVmZmVyIHRvIGhvbGQgZGlyZWN0b3J5IGVudHJ5IGluZm8gd2hpbGUgdHJhdmVyc2luZyBhIGR0cmVlIHBhZ2UKKyAqIGJlZm9yZSBiZWluZyBmZWQgdG8gdGhlIGZpbGxkaXIgZnVuY3Rpb24KKyAqLworc3RydWN0IGpmc19kaXJlbnQgeworCWxvZmZfdCBwb3NpdGlvbjsKKwlpbnQgaW5vOworCXUxNiBuYW1lX2xlbjsKKwljaGFyIG5hbWVbMF07Cit9OworCisvKgorICogZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIG5leHQgdmFyaWFibGUtc2l6ZWQgamZzX2RpcmVudCBpbiBidWZmZXIKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgamZzX2RpcmVudCAqbmV4dF9qZnNfZGlyZW50KHN0cnVjdCBqZnNfZGlyZW50ICpkaXJlbnQpCit7CisJcmV0dXJuIChzdHJ1Y3QgamZzX2RpcmVudCAqKQorCQkoKGNoYXIgKilkaXJlbnQgKworCQkgKChzaXplb2YgKHN0cnVjdCBqZnNfZGlyZW50KSArIGRpcmVudC0+bmFtZV9sZW4gKyAxICsKKwkJICAgc2l6ZW9mIChsb2ZmX3QpIC0gMSkgJgorCQkgIH4oc2l6ZW9mIChsb2ZmX3QpIC0gMSkpKTsKK30KKworLyoKKyAqCWpmc19yZWFkZGlyKCkKKyAqCisgKiBmdW5jdGlvbjogcmVhZCBkaXJlY3RvcnkgZW50cmllcyBzZXF1ZW50aWFsbHkKKyAqCWZyb20gdGhlIHNwZWNpZmllZCBlbnRyeSBvZmZzZXQKKyAqCisgKiBwYXJhbWV0ZXI6CisgKgorICogcmV0dXJuOiBvZmZzZXQgPSAocG4sIGluZGV4KSBvZiBzdGFydCBlbnRyeQorICoJb2YgbmV4dCBqZnNfcmVhZGRpcigpL2R0UmVhZCgpCisgKi8KK2ludCBqZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlwID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IG5sc190YWJsZSAqY29kZXBhZ2UgPSBKRlNfU0JJKGlwLT5pX3NiKS0+bmxzX3RhYjsKKwlpbnQgcmMgPSAwOworCWxvZmZfdCBkdHBvczsJLyogbGVnYWN5IE9TLzIgc3R5bGUgcG9zaXRpb24gKi8KKwlzdHJ1Y3QgZHRvZmZzZXQgeworCQlzMTYgcG47CisJCXMxNiBpbmRleDsKKwkJczMyIHVudXNlZDsKKwl9ICpkdG9mZnNldCA9IChzdHJ1Y3QgZHRvZmZzZXQgKikgJmR0cG9zOworCXM2NCBibjsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCWR0cGFnZV90ICpwOworCWludCBpbmRleDsKKwlzOCAqc3RibDsKKwlzdHJ1Y3QgYnRzdGFjayBidHN0YWNrOworCWludCBpLCBuZXh0OworCXN0cnVjdCBsZHRlbnRyeSAqZDsKKwlzdHJ1Y3QgZHRzbG90ICp0OworCWludCBkX25hbWxlZnQsIGxlbiwgb3V0bGVuOworCXVuc2lnbmVkIGxvbmcgZGlyZW50X2J1ZjsKKwljaGFyICpuYW1lX3B0cjsKKwl1MzIgZGlyX2luZGV4OworCWludCBkb19pbmRleCA9IDA7CisJdWludCBsb29wX2NvdW50ID0gMDsKKwlzdHJ1Y3QgamZzX2RpcmVudCAqamZzX2RpcmVudDsKKwlpbnQgamZzX2RpcmVudHM7CisJaW50IG92ZXJmbG93LCBmaXhfcGFnZSwgcGFnZV9maXhlZCA9IDA7CisJc3RhdGljIGludCB1bmlxdWVfcG9zID0gMjsJLyogSWYgd2UgY2FuJ3QgZml4IGJyb2tlbiBpbmRleCAqLworCisJaWYgKGZpbHAtPmZfcG9zID09IERJUkVORCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoRE9fSU5ERVgoaXApKSB7CisJCS8qCisJCSAqIHBlcnNpc3RlbnQgaW5kZXggaXMgc3RvcmVkIGluIGRpcmVjdG9yeSBlbnRyaWVzLgorCQkgKiBTcGVjaWFsIGNhc2VzOiAgICAgICAgMCA9IC4KKwkJICogICAgICAgICAgICAgICAgICAgICAgIDEgPSAuLgorCQkgKiAgICAgICAgICAgICAgICAgICAgICAtMSA9IEVuZCBvZiBkaXJlY3RvcnkKKwkJICovCisJCWRvX2luZGV4ID0gMTsKKworCQlkaXJfaW5kZXggPSAodTMyKSBmaWxwLT5mX3BvczsKKworCQlpZiAoZGlyX2luZGV4ID4gMSkgeworCQkJc3RydWN0IGRpcl90YWJsZV9zbG90IGRpcnRhYl9zbG90OworCisJCQlpZiAoZHRFbXB0eShpcCkgfHwKKwkJCSAgICAoZGlyX2luZGV4ID49IEpGU19JUChpcCktPm5leHRfaW5kZXgpKSB7CisJCQkJLyogU3RhbGUgcG9zaXRpb24uICBEaXJlY3RvcnkgaGFzIHNocnVuayAqLworCQkJCWZpbHAtPmZfcG9zID0gRElSRU5EOworCQkJCXJldHVybiAwOworCQkJfQorCQkgICAgICByZXBlYXQ6CisJCQlyYyA9IHJlYWRfaW5kZXgoaXAsIGRpcl9pbmRleCwgJmRpcnRhYl9zbG90KTsKKwkJCWlmIChyYykgeworCQkJCWZpbHAtPmZfcG9zID0gRElSRU5EOworCQkJCXJldHVybiByYzsKKwkJCX0KKwkJCWlmIChkaXJ0YWJfc2xvdC5mbGFnID09IERJUl9JTkRFWF9GUkVFKSB7CisJCQkJaWYgKGxvb3BfY291bnQrKyA+IEpGU19JUChpcCktPm5leHRfaW5kZXgpIHsKKwkJCQkJamZzX2VycigiamZzX3JlYWRkaXIgZGV0ZWN0ZWQgIgorCQkJCQkJICAgImluZmluaXRlIGxvb3AhIik7CisJCQkJCWZpbHAtPmZfcG9zID0gRElSRU5EOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJZGlyX2luZGV4ID0gbGUzMl90b19jcHUoZGlydGFiX3Nsb3QuYWRkcjIpOworCQkJCWlmIChkaXJfaW5kZXggPT0gLTEpIHsKKwkJCQkJZmlscC0+Zl9wb3MgPSBESVJFTkQ7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQlnb3RvIHJlcGVhdDsKKwkJCX0KKwkJCWJuID0gYWRkcmVzc0RUUygmZGlydGFiX3Nsb3QpOworCQkJaW5kZXggPSBkaXJ0YWJfc2xvdC5zbG90OworCQkJRFRfR0VUUEFHRShpcCwgYm4sIG1wLCBQU0laRSwgcCwgcmMpOworCQkJaWYgKHJjKSB7CisJCQkJZmlscC0+Zl9wb3MgPSBESVJFTkQ7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9JTlRFUk5BTCkgeworCQkJCWpmc19lcnIoImpmc19yZWFkZGlyOiBiYWQgaW5kZXggdGFibGUiKTsKKwkJCQlEVF9QVVRQQUdFKG1wKTsKKwkJCQlmaWxwLT5mX3BvcyA9IC0xOworCQkJCXJldHVybiAwOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGRpcl9pbmRleCA9PSAwKSB7CisJCQkJLyoKKwkJCQkgKiBzZWxmICIuIgorCQkJCSAqLworCQkJCWZpbHAtPmZfcG9zID0gMDsKKwkJCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuIiwgMSwgMCwgaXAtPmlfaW5vLAorCQkJCQkgICAgRFRfRElSKSkKKwkJCQkJcmV0dXJuIDA7CisJCQl9CisJCQkvKgorCQkJICogcGFyZW50ICIuLiIKKwkJCSAqLworCQkJZmlscC0+Zl9wb3MgPSAxOworCQkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLi4iLCAyLCAxLCBQQVJFTlQoaXApLCBEVF9ESVIpKQorCQkJCXJldHVybiAwOworCisJCQkvKgorCQkJICogRmluZCBmaXJzdCBlbnRyeSBvZiBsZWZ0LW1vc3QgbGVhZgorCQkJICovCisJCQlpZiAoZHRFbXB0eShpcCkpIHsKKwkJCQlmaWxwLT5mX3BvcyA9IERJUkVORDsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJaWYgKChyYyA9IGR0UmVhZEZpcnN0KGlwLCAmYnRzdGFjaykpKQorCQkJCXJldHVybiByYzsKKworCQkJRFRfR0VUU0VBUkNIKGlwLCBidHN0YWNrLnRvcCwgYm4sIG1wLCBwLCBpbmRleCk7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBMZWdhY3kgZmlsZXN5c3RlbSAtIE9TLzIgJiBMaW51eCBKRlMgPCAwLjMuNgorCQkgKgorCQkgKiBwbiA9IGluZGV4ID0gMDogICAgICBGaXJzdCBlbnRyeSAiLiIKKwkJICogcG4gPSAwOyBpbmRleCA9IDE6ICAgU2Vjb25kIGVudHJ5ICIuLiIKKwkJICogcG4gPiAwOiAgICAgICAgICAgICAgUmVhbCBlbnRyaWVzLCBwbj0xIC0+IGxlZnRtb3N0IHBhZ2UKKwkJICogcG4gPSBpbmRleCA9IC0xOiAgICAgTm8gbW9yZSBlbnRyaWVzCisJCSAqLworCQlkdHBvcyA9IGZpbHAtPmZfcG9zOworCQlpZiAoZHRwb3MgPT0gMCkgeworCQkJLyogYnVpbGQgIi4iIGVudHJ5ICovCisKKwkJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4iLCAxLCBmaWxwLT5mX3BvcywgaXAtPmlfaW5vLAorCQkJCSAgICBEVF9ESVIpKQorCQkJCXJldHVybiAwOworCQkJZHRvZmZzZXQtPmluZGV4ID0gMTsKKwkJCWZpbHAtPmZfcG9zID0gZHRwb3M7CisJCX0KKworCQlpZiAoZHRvZmZzZXQtPnBuID09IDApIHsKKwkJCWlmIChkdG9mZnNldC0+aW5kZXggPT0gMSkgeworCQkJCS8qIGJ1aWxkICIuLiIgZW50cnkgKi8KKworCQkJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4uIiwgMiwgZmlscC0+Zl9wb3MsCisJCQkJCSAgICBQQVJFTlQoaXApLCBEVF9ESVIpKQorCQkJCQlyZXR1cm4gMDsKKwkJCX0gZWxzZSB7CisJCQkJamZzX2VycigiamZzX3JlYWRkaXIgY2FsbGVkIHdpdGggIgorCQkJCQkiaW52YWxpZCBvZmZzZXQhIik7CisJCQl9CisJCQlkdG9mZnNldC0+cG4gPSAxOworCQkJZHRvZmZzZXQtPmluZGV4ID0gMDsKKwkJCWZpbHAtPmZfcG9zID0gZHRwb3M7CisJCX0KKworCQlpZiAoZHRFbXB0eShpcCkpIHsKKwkJCWZpbHAtPmZfcG9zID0gRElSRU5EOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoKHJjID0gZHRSZWFkTmV4dChpcCwgJmZpbHAtPmZfcG9zLCAmYnRzdGFjaykpKSB7CisJCQlqZnNfZXJyKCJqZnNfcmVhZGRpcjogdW5leHBlY3RlZCByYyA9ICVkICIKKwkJCQkiZnJvbSBkdFJlYWROZXh0IiwgcmMpOworCQkJZmlscC0+Zl9wb3MgPSBESVJFTkQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKiBnZXQgc3RhcnQgbGVhZiBwYWdlIGFuZCBpbmRleCAqLworCQlEVF9HRVRTRUFSQ0goaXAsIGJ0c3RhY2sudG9wLCBibiwgbXAsIHAsIGluZGV4KTsKKworCQkvKiBvZmZzZXQgYmV5b25kIGRpcmVjdG9yeSBlb2YgPyAqLworCQlpZiAoYm4gPCAwKSB7CisJCQlmaWxwLT5mX3BvcyA9IERJUkVORDsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJZGlyZW50X2J1ZiA9IF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoZGlyZW50X2J1ZiA9PSAwKSB7CisJCURUX1BVVFBBR0UobXApOworCQlqZnNfd2FybigiamZzX3JlYWRkaXI6IF9fZ2V0X2ZyZWVfcGFnZSBmYWlsZWQhIik7CisJCWZpbHAtPmZfcG9zID0gRElSRU5EOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl3aGlsZSAoMSkgeworCQlqZnNfZGlyZW50ID0gKHN0cnVjdCBqZnNfZGlyZW50ICopIGRpcmVudF9idWY7CisJCWpmc19kaXJlbnRzID0gMDsKKwkJb3ZlcmZsb3cgPSBmaXhfcGFnZSA9IDA7CisKKwkJc3RibCA9IERUX0dFVFNUQkwocCk7CisKKwkJZm9yIChpID0gaW5kZXg7IGkgPCBwLT5oZWFkZXIubmV4dGluZGV4OyBpKyspIHsKKwkJCWQgPSAoc3RydWN0IGxkdGVudHJ5ICopICYgcC0+c2xvdFtzdGJsW2ldXTsKKworCQkJaWYgKCgobG9uZykgamZzX2RpcmVudCArIGQtPm5hbWxlbiArIDEpID4KKwkJCSAgICAoZGlyZW50X2J1ZiArIFBTSVpFKSkgeworCQkJCS8qIERCQ1MgY29kZXBhZ2VzIGNvdWxkIG92ZXJydW4gZGlyZW50X2J1ZiAqLworCQkJCWluZGV4ID0gaTsKKwkJCQlvdmVyZmxvdyA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWRfbmFtbGVmdCA9IGQtPm5hbWxlbjsKKwkJCW5hbWVfcHRyID0gamZzX2RpcmVudC0+bmFtZTsKKwkJCWpmc19kaXJlbnQtPmlubyA9IGxlMzJfdG9fY3B1KGQtPmludW1iZXIpOworCisJCQlpZiAoZG9faW5kZXgpIHsKKwkJCQlsZW4gPSBtaW4oZF9uYW1sZWZ0LCBEVExIRFJEQVRBTEVOKTsKKwkJCQlqZnNfZGlyZW50LT5wb3NpdGlvbiA9IGxlMzJfdG9fY3B1KGQtPmluZGV4KTsKKwkJCQkvKgorCQkJCSAqIGQtPmluZGV4IHNob3VsZCBhbHdheXMgYmUgdmFsaWQsIGJ1dCBpdAorCQkJCSAqIGlzbid0LiAgZnNjay5qZnMgZG9lc24ndCBjcmVhdGUgdGhlCisJCQkJICogZGlyZWN0b3J5IGluZGV4IGZvciB0aGUgbG9zdCtmb3VuZAorCQkJCSAqIGRpcmVjdG9yeS4gIFJhdGhlciB0aGFuIGxldCBpdCBnbywKKwkJCQkgKiB3ZSBjYW4gdHJ5IHRvIGZpeCBpdC4KKwkJCQkgKi8KKwkJCQlpZiAoKGpmc19kaXJlbnQtPnBvc2l0aW9uIDwgMikgfHwKKwkJCQkgICAgKGpmc19kaXJlbnQtPnBvc2l0aW9uID49CisJCQkJICAgICBKRlNfSVAoaXApLT5uZXh0X2luZGV4KSkgeworCQkJCQlpZiAoIXBhZ2VfZml4ZWQgJiYgIWlzUmVhZE9ubHkoaXApKSB7CisJCQkJCQlmaXhfcGFnZSA9IDE7CisJCQkJCQkvKgorCQkJCQkJICogc2V0dGluZyBvdmVyZmxvdyBhbmQgc2V0dGluZworCQkJCQkJICogaW5kZXggdG8gaSB3aWxsIGNhdXNlIHRoZQorCQkJCQkJICogc2FtZSBwYWdlIHRvIGJlIHByb2Nlc3NlZAorCQkJCQkJICogYWdhaW4gc3RhcnRpbmcgaGVyZQorCQkJCQkJICovCisJCQkJCQlvdmVyZmxvdyA9IDE7CisJCQkJCQlpbmRleCA9IGk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlqZnNfZGlyZW50LT5wb3NpdGlvbiA9IHVuaXF1ZV9wb3MrKzsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWpmc19kaXJlbnQtPnBvc2l0aW9uID0gZHRwb3M7CisJCQkJbGVuID0gbWluKGRfbmFtbGVmdCwgRFRMSERSREFUQUxFTl9MRUdBQ1kpOworCQkJfQorCisJCQkvKiBjb3B5IHRoZSBuYW1lIG9mIGhlYWQvb25seSBzZWdtZW50ICovCisJCQlvdXRsZW4gPSBqZnNfc3RyZnJvbVVDU19sZShuYW1lX3B0ciwgZC0+bmFtZSwgbGVuLAorCQkJCQkJICAgY29kZXBhZ2UpOworCQkJamZzX2RpcmVudC0+bmFtZV9sZW4gPSBvdXRsZW47CisKKwkJCS8qIGNvcHkgbmFtZSBpbiB0aGUgYWRkaXRpb25hbCBzZWdtZW50KHMpICovCisJCQluZXh0ID0gZC0+bmV4dDsKKwkJCXdoaWxlIChuZXh0ID49IDApIHsKKwkJCQl0ID0gKHN0cnVjdCBkdHNsb3QgKikgJiBwLT5zbG90W25leHRdOworCQkJCW5hbWVfcHRyICs9IG91dGxlbjsKKwkJCQlkX25hbWxlZnQgLT0gbGVuOworCQkJCS8qIFNhbml0eSBDaGVjayAqLworCQkJCWlmIChkX25hbWxlZnQgPT0gMCkgeworCQkJCQlqZnNfZXJyb3IoaXAtPmlfc2IsCisJCQkJCQkgICJKRlM6RHRyZWUgZXJyb3I6IGlubyA9ICIKKwkJCQkJCSAgIiVsZCwgYm49JUxkLCBpbmRleCA9ICVkIiwKKwkJCQkJCSAgKGxvbmcpaXAtPmlfaW5vLAorCQkJCQkJICAobG9uZyBsb25nKWJuLAorCQkJCQkJICBpKTsKKwkJCQkJZ290byBza2lwX29uZTsKKwkJCQl9CisJCQkJbGVuID0gbWluKGRfbmFtbGVmdCwgRFRTTE9UREFUQUxFTik7CisJCQkJb3V0bGVuID0gamZzX3N0cmZyb21VQ1NfbGUobmFtZV9wdHIsIHQtPm5hbWUsCisJCQkJCQkJICAgbGVuLCBjb2RlcGFnZSk7CisJCQkJamZzX2RpcmVudC0+bmFtZV9sZW4gKz0gb3V0bGVuOworCisJCQkJbmV4dCA9IHQtPm5leHQ7CisJCQl9CisKKwkJCWpmc19kaXJlbnRzKys7CisJCQlqZnNfZGlyZW50ID0gbmV4dF9qZnNfZGlyZW50KGpmc19kaXJlbnQpOworc2tpcF9vbmU6CisJCQlpZiAoIWRvX2luZGV4KQorCQkJCWR0b2Zmc2V0LT5pbmRleCsrOworCQl9CisKKwkJaWYgKCFvdmVyZmxvdykgeworCQkJLyogUG9pbnQgdG8gbmV4dCBsZWFmIHBhZ2UgKi8KKwkJCWlmIChwLT5oZWFkZXIuZmxhZyAmIEJUX1JPT1QpCisJCQkJYm4gPSAwOworCQkJZWxzZSB7CisJCQkJYm4gPSBsZTY0X3RvX2NwdShwLT5oZWFkZXIubmV4dCk7CisJCQkJaW5kZXggPSAwOworCQkJCS8qIHVwZGF0ZSBvZmZzZXQgKHBuOmluZGV4KSBmb3IgbmV3IHBhZ2UgKi8KKwkJCQlpZiAoIWRvX2luZGV4KSB7CisJCQkJCWR0b2Zmc2V0LT5wbisrOworCQkJCQlkdG9mZnNldC0+aW5kZXggPSAwOworCQkJCX0KKwkJCX0KKwkJCXBhZ2VfZml4ZWQgPSAwOworCQl9CisKKwkJLyogdW5waW4gcHJldmlvdXMgbGVhZiBwYWdlICovCisJCURUX1BVVFBBR0UobXApOworCisJCWpmc19kaXJlbnQgPSAoc3RydWN0IGpmc19kaXJlbnQgKikgZGlyZW50X2J1ZjsKKwkJd2hpbGUgKGpmc19kaXJlbnRzLS0pIHsKKwkJCWZpbHAtPmZfcG9zID0gamZzX2RpcmVudC0+cG9zaXRpb247CisJCQlpZiAoZmlsbGRpcihkaXJlbnQsIGpmc19kaXJlbnQtPm5hbWUsCisJCQkJICAgIGpmc19kaXJlbnQtPm5hbWVfbGVuLCBmaWxwLT5mX3BvcywKKwkJCQkgICAgamZzX2RpcmVudC0+aW5vLCBEVF9VTktOT1dOKSkKKwkJCQlnb3RvIG91dDsKKwkJCWpmc19kaXJlbnQgPSBuZXh0X2pmc19kaXJlbnQoamZzX2RpcmVudCk7CisJCX0KKworCQlpZiAoZml4X3BhZ2UpIHsKKwkJCWFkZF9taXNzaW5nX2luZGljZXMoaXAsIGJuKTsKKwkJCXBhZ2VfZml4ZWQgPSAxOworCQl9CisKKwkJaWYgKCFvdmVyZmxvdyAmJiAoYm4gPT0gMCkpIHsKKwkJCWZpbHAtPmZfcG9zID0gRElSRU5EOworCQkJYnJlYWs7CisJCX0KKworCQlEVF9HRVRQQUdFKGlwLCBibiwgbXAsIFBTSVpFLCBwLCByYyk7CisJCWlmIChyYykgeworCQkJZnJlZV9wYWdlKGRpcmVudF9idWYpOworCQkJcmV0dXJuIHJjOworCQl9CisJfQorCisgICAgICBvdXQ6CisJZnJlZV9wYWdlKGRpcmVudF9idWYpOworCisJcmV0dXJuIHJjOworfQorCisKKy8qCisgKglkdFJlYWRGaXJzdCgpCisgKgorICogZnVuY3Rpb246IGdldCB0aGUgbGVmdG1vc3QgcGFnZSBvZiB0aGUgZGlyZWN0b3J5CisgKi8KK3N0YXRpYyBpbnQgZHRSZWFkRmlyc3Qoc3RydWN0IGlub2RlICppcCwgc3RydWN0IGJ0c3RhY2sgKiBidHN0YWNrKQoreworCWludCByYyA9IDA7CisJczY0IGJuOworCWludCBwc2l6ZSA9IDI4ODsJLyogaW5pdGlhbCBpbi1saW5lIGRpcmVjdG9yeSAqLworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJZHRwYWdlX3QgKnA7CisJczggKnN0Ymw7CisJc3RydWN0IGJ0ZnJhbWUgKmJ0c3A7CisJcHhkX3QgKnhkOworCisJQlRfQ0xSKGJ0c3RhY2spOwkvKiByZXNldCBzdGFjayAqLworCisJLyoKKwkgKiAgICAgIGRlc2NlbmQgbGVmdG1vc3QgcGF0aCBvZiB0aGUgdHJlZQorCSAqCisJICogYnkgY29udmVudGlvbiwgcm9vdCBibiA9IDAuCisJICovCisJZm9yIChibiA9IDA7OykgeworCQlEVF9HRVRQQUdFKGlwLCBibiwgbXAsIHBzaXplLCBwLCByYyk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKworCQkvKgorCQkgKiBsZWZ0bW9zdCBsZWFmIHBhZ2UKKwkJICovCisJCWlmIChwLT5oZWFkZXIuZmxhZyAmIEJUX0xFQUYpIHsKKwkJCS8qIHJldHVybiBsZWZ0bW9zdCBlbnRyeSAqLworCQkJYnRzcCA9IGJ0c3RhY2stPnRvcDsKKwkJCWJ0c3AtPmJuID0gYm47CisJCQlidHNwLT5pbmRleCA9IDA7CisJCQlidHNwLT5tcCA9IG1wOworCisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qCisJCSAqIGRlc2NlbmQgZG93biB0byBsZWZ0bW9zdCBjaGlsZCBwYWdlCisJCSAqLworCQlpZiAoQlRfU1RBQ0tfRlVMTChidHN0YWNrKSkgeworCQkJRFRfUFVUUEFHRShtcCk7CisJCQlqZnNfZXJyb3IoaXAtPmlfc2IsICJkdFJlYWRGaXJzdDogYnRzdGFjayBvdmVycnVuIik7CisJCQlCVF9TVEFDS19EVU1QKGJ0c3RhY2spOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJLyogcHVzaCAoYm4sIGluZGV4KSBvZiB0aGUgcGFyZW50IHBhZ2UvZW50cnkgKi8KKwkJQlRfUFVTSChidHN0YWNrLCBibiwgMCk7CisKKwkJLyogZ2V0IHRoZSBsZWZ0bW9zdCBlbnRyeSAqLworCQlzdGJsID0gRFRfR0VUU1RCTChwKTsKKwkJeGQgPSAocHhkX3QgKikgJiBwLT5zbG90W3N0YmxbMF1dOworCisJCS8qIGdldCB0aGUgY2hpbGQgcGFnZSBibG9jayBhZGRyZXNzICovCisJCWJuID0gYWRkcmVzc1BYRCh4ZCk7CisJCXBzaXplID0gbGVuZ3RoUFhEKHhkKSA8PCBKRlNfU0JJKGlwLT5pX3NiKS0+bDJic2l6ZTsKKworCQkvKiB1bnBpbiB0aGUgcGFyZW50IHBhZ2UgKi8KKwkJRFRfUFVUUEFHRShtcCk7CisJfQorfQorCisKKy8qCisgKglkdFJlYWROZXh0KCkKKyAqCisgKiBmdW5jdGlvbjogZ2V0IHRoZSBwYWdlIG9mIHRoZSBzcGVjaWZpZWQgb2Zmc2V0IChwbjppbmRleCkKKyAqCisgKiByZXR1cm46IGlmIChvZmZzZXQgPiBlb2YpLCBibiA9IC0xOworICoKKyAqIG5vdGU6IGlmIGluZGV4ID4gbmV4dGluZGV4IG9mIHRoZSB0YXJnZXQgbGVhZiBwYWdlLAorICogc3RhcnQgd2l0aCAxc3QgZW50cnkgb2YgbmV4dCBsZWFmIHBhZ2U7CisgKi8KK3N0YXRpYyBpbnQgZHRSZWFkTmV4dChzdHJ1Y3QgaW5vZGUgKmlwLCBsb2ZmX3QgKiBvZmZzZXQsCisJCSAgICAgIHN0cnVjdCBidHN0YWNrICogYnRzdGFjaykKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBkdG9mZnNldCB7CisJCXMxNiBwbjsKKwkJczE2IGluZGV4OworCQlzMzIgdW51c2VkOworCX0gKmR0b2Zmc2V0ID0gKHN0cnVjdCBkdG9mZnNldCAqKSBvZmZzZXQ7CisJczY0IGJuOworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJZHRwYWdlX3QgKnA7CisJaW50IGluZGV4OworCWludCBwbjsKKwlzOCAqc3RibDsKKwlzdHJ1Y3QgYnRmcmFtZSAqYnRzcCwgKnBhcmVudDsKKwlweGRfdCAqeGQ7CisKKwkvKgorCSAqIGdldCBsZWZ0bW9zdCBsZWFmIHBhZ2UgcGlubmVkCisJICovCisJaWYgKChyYyA9IGR0UmVhZEZpcnN0KGlwLCBidHN0YWNrKSkpCisJCXJldHVybiByYzsKKworCS8qIGdldCBsZWFmIHBhZ2UgKi8KKwlEVF9HRVRTRUFSQ0goaXAsIGJ0c3RhY2stPnRvcCwgYm4sIG1wLCBwLCBpbmRleCk7CisKKwkvKiBnZXQgdGhlIHN0YXJ0IG9mZnNldCAocG46aW5kZXgpICovCisJcG4gPSBkdG9mZnNldC0+cG4gLSAxOwkvKiBOb3cgcG4gPSAwIHJlcHJlc2VudHMgbGVmdG1vc3QgbGVhZiAqLworCWluZGV4ID0gZHRvZmZzZXQtPmluZGV4OworCisJLyogc3RhcnQgYXQgbGVmdG1vc3QgcGFnZSA/ICovCisJaWYgKHBuID09IDApIHsKKwkJLyogb2Zmc2V0IGJleW9uZCBlb2YgPyAqLworCQlpZiAoaW5kZXggPCBwLT5oZWFkZXIubmV4dGluZGV4KQorCQkJZ290byBvdXQ7CisKKwkJaWYgKHAtPmhlYWRlci5mbGFnICYgQlRfUk9PVCkgeworCQkJYm4gPSAtMTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogc3RhcnQgd2l0aCAxc3QgZW50cnkgb2YgbmV4dCBsZWFmIHBhZ2UgKi8KKwkJZHRvZmZzZXQtPnBuKys7CisJCWR0b2Zmc2V0LT5pbmRleCA9IGluZGV4ID0gMDsKKwkJZ290byBhOworCX0KKworCS8qIHN0YXJ0IGF0IG5vbi1sZWZ0bW9zdCBwYWdlOiBzY2FuIHBhcmVudCBwYWdlcyBmb3IgbGFyZ2UgcG4gKi8KKwlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9ST09UKSB7CisJCWJuID0gLTE7CisJCWdvdG8gb3V0OworCX0KKworCS8qIHN0YXJ0IGFmdGVyIG5leHQgbGVhZiBwYWdlID8gKi8KKwlpZiAocG4gPiAxKQorCQlnb3RvIGI7CisKKwkvKiBnZXQgbGVhZiBwYWdlIHBuID0gMSAqLworICAgICAgYToKKwlibiA9IGxlNjRfdG9fY3B1KHAtPmhlYWRlci5uZXh0KTsKKworCS8qIHVucGluIGxlYWYgcGFnZSAqLworCURUX1BVVFBBR0UobXApOworCisJLyogb2Zmc2V0IGJleW9uZCBlb2YgPyAqLworCWlmIChibiA9PSAwKSB7CisJCWJuID0gLTE7CisJCWdvdG8gb3V0OworCX0KKworCWdvdG8gYzsKKworCS8qCisJICogc2NhbiBsYXN0IGludGVybmFsIHBhZ2UgbGV2ZWwgdG8gZ2V0IHRhcmdldCBsZWFmIHBhZ2UKKwkgKi8KKyAgICAgIGI6CisJLyogdW5waW4gbGVmdG1vc3QgbGVhZiBwYWdlICovCisJRFRfUFVUUEFHRShtcCk7CisKKwkvKiBnZXQgbGVmdCBtb3N0IHBhcmVudCBwYWdlICovCisJYnRzcCA9IGJ0c3RhY2stPnRvcDsKKwlwYXJlbnQgPSBidHNwIC0gMTsKKwlibiA9IHBhcmVudC0+Ym47CisJRFRfR0VUUEFHRShpcCwgYm4sIG1wLCBQU0laRSwgcCwgcmMpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJLyogc2NhbiBwYXJlbnQgcGFnZXMgYXQgbGFzdCBpbnRlcm5hbCBwYWdlIGxldmVsICovCisJd2hpbGUgKHBuID49IHAtPmhlYWRlci5uZXh0aW5kZXgpIHsKKwkJcG4gLT0gcC0+aGVhZGVyLm5leHRpbmRleDsKKworCQkvKiBnZXQgbmV4dCBwYXJlbnQgcGFnZSBhZGRyZXNzICovCisJCWJuID0gbGU2NF90b19jcHUocC0+aGVhZGVyLm5leHQpOworCisJCS8qIHVucGluIGN1cnJlbnQgcGFyZW50IHBhZ2UgKi8KKwkJRFRfUFVUUEFHRShtcCk7CisKKwkJLyogb2Zmc2V0IGJleW9uZCBlb2YgPyAqLworCQlpZiAoYm4gPT0gMCkgeworCQkJYm4gPSAtMTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogZ2V0IG5leHQgcGFyZW50IHBhZ2UgKi8KKwkJRFRfR0VUUEFHRShpcCwgYm4sIG1wLCBQU0laRSwgcCwgcmMpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJLyogdXBkYXRlIHBhcmVudCBwYWdlIHN0YWNrIGZyYW1lICovCisJCXBhcmVudC0+Ym4gPSBibjsKKwl9CisKKwkvKiBnZXQgbGVhZiBwYWdlIGFkZHJlc3MgKi8KKwlzdGJsID0gRFRfR0VUU1RCTChwKTsKKwl4ZCA9IChweGRfdCAqKSAmIHAtPnNsb3Rbc3RibFtwbl1dOworCWJuID0gYWRkcmVzc1BYRCh4ZCk7CisKKwkvKiB1bnBpbiBwYXJlbnQgcGFnZSAqLworCURUX1BVVFBBR0UobXApOworCisJLyoKKwkgKiBnZXQgdGFyZ2V0IGxlYWYgcGFnZQorCSAqLworICAgICAgYzoKKwlEVF9HRVRQQUdFKGlwLCBibiwgbXAsIFBTSVpFLCBwLCByYyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwkvKgorCSAqIGxlYWYgcGFnZSBoYXMgYmVlbiBjb21wbGV0ZWQ6CisJICogc3RhcnQgd2l0aCAxc3QgZW50cnkgb2YgbmV4dCBsZWFmIHBhZ2UKKwkgKi8KKwlpZiAoaW5kZXggPj0gcC0+aGVhZGVyLm5leHRpbmRleCkgeworCQlibiA9IGxlNjRfdG9fY3B1KHAtPmhlYWRlci5uZXh0KTsKKworCQkvKiB1bnBpbiBsZWFmIHBhZ2UgKi8KKwkJRFRfUFVUUEFHRShtcCk7CisKKwkJLyogb2Zmc2V0IGJleW9uZCBlb2YgPyAqLworCQlpZiAoYm4gPT0gMCkgeworCQkJYm4gPSAtMTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogZ2V0IG5leHQgbGVhZiBwYWdlICovCisJCURUX0dFVFBBR0UoaXAsIGJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCS8qIHN0YXJ0IHdpdGggMXN0IGVudHJ5IG9mIG5leHQgbGVhZiBwYWdlICovCisJCWR0b2Zmc2V0LT5wbisrOworCQlkdG9mZnNldC0+aW5kZXggPSAwOworCX0KKworICAgICAgb3V0OgorCS8qIHJldHVybiB0YXJnZXQgbGVhZiBwYWdlIHBpbm5lZCAqLworCWJ0c3AgPSBidHN0YWNrLT50b3A7CisJYnRzcC0+Ym4gPSBibjsKKwlidHNwLT5pbmRleCA9IGR0b2Zmc2V0LT5pbmRleDsKKwlidHNwLT5tcCA9IG1wOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqCWR0Q29tcGFyZSgpCisgKgorICogZnVuY3Rpb246IGNvbXBhcmUgc2VhcmNoIGtleSB3aXRoIGFuIGludGVybmFsIGVudHJ5CisgKgorICogcmV0dXJuOgorICoJPCAwIGlmIGsgaXMgPCByZWNvcmQKKyAqCT0gMCBpZiBrIGlzID0gcmVjb3JkCisgKgk+IDAgaWYgayBpcyA+IHJlY29yZAorICovCitzdGF0aWMgaW50IGR0Q29tcGFyZShzdHJ1Y3QgY29tcG9uZW50X25hbWUgKiBrZXksCS8qIHNlYXJjaCBrZXkgKi8KKwkJICAgICBkdHBhZ2VfdCAqIHAsCS8qIGRpcmVjdG9yeSBwYWdlICovCisJCSAgICAgaW50IHNpKQorewkJCQkvKiBlbnRyeSBzbG90IGluZGV4ICovCisJd2NoYXJfdCAqa25hbWU7CisJX19sZTE2ICpuYW1lOworCWludCBrbGVuLCBuYW1sZW4sIGxlbiwgcmM7CisJc3RydWN0IGlkdGVudHJ5ICppaDsKKwlzdHJ1Y3QgZHRzbG90ICp0OworCisJLyoKKwkgKiBmb3JjZSB0aGUgbGVmdC1tb3N0IGtleSBvbiBpbnRlcm5hbCBwYWdlcywgYXQgYW55IGxldmVsIG9mCisJICogdGhlIHRyZWUsIHRvIGJlIGxlc3MgdGhhbiBhbnkgc2VhcmNoIGtleS4KKwkgKiB0aGlzIG9idmlhdGVzIGhhdmluZyB0byB1cGRhdGUgdGhlIGxlZnRtb3N0IGtleSBvbiBhbiBpbnRlcm5hbAorCSAqIHBhZ2Ugd2hlbiB0aGUgdXNlciBpbnNlcnRzIGEgbmV3IGtleSBpbiB0aGUgdHJlZSBzbWFsbGVyIHRoYW4KKwkgKiBhbnl0aGluZyB0aGF0IGhhcyBiZWVuIHN0b3JlZC4KKwkgKgorCSAqICg/IGlmL3doZW4gZHRTZWFyY2goKSBuYXJyb3dzIGRvd24gdG8gMXN0IGVudHJ5IChpbmRleCA9IDApLAorCSAqIGF0IGFueSBpbnRlcm5hbCBwYWdlIGF0IGFueSBsZXZlbCBvZiB0aGUgdHJlZSwKKwkgKiBpdCBkZXNjZW5kcyB0byBjaGlsZCBvZiB0aGUgZW50cnkgYW55d2F5IC0KKwkgKiA/IG1ha2UgdGhlIGVudHJ5IGFzIG1pbiBzaXplIGR1bW15IGVudHJ5KQorCSAqCisJICogaWYgKGUtPmluZGV4ID09IDAgJiYgaC0+cHJldnBnID09IFBfSU5WQUxJRCAmJiAhKGgtPmZsYWdzICYgQlRfTEVBRikpCisJICogcmV0dXJuICgxKTsKKwkgKi8KKworCWtuYW1lID0ga2V5LT5uYW1lOworCWtsZW4gPSBrZXktPm5hbWxlbjsKKworCWloID0gKHN0cnVjdCBpZHRlbnRyeSAqKSAmIHAtPnNsb3Rbc2ldOworCXNpID0gaWgtPm5leHQ7CisJbmFtZSA9IGloLT5uYW1lOworCW5hbWxlbiA9IGloLT5uYW1sZW47CisJbGVuID0gbWluKG5hbWxlbiwgRFRJSERSREFUQUxFTik7CisKKwkvKiBjb21wYXJlIHdpdGggaGVhZC9vbmx5IHNlZ21lbnQgKi8KKwlsZW4gPSBtaW4oa2xlbiwgbGVuKTsKKwlpZiAoKHJjID0gVW5pU3RybmNtcF9sZShrbmFtZSwgbmFtZSwgbGVuKSkpCisJCXJldHVybiByYzsKKworCWtsZW4gLT0gbGVuOworCW5hbWxlbiAtPSBsZW47CisKKwkvKiBjb21wYXJlIHdpdGggYWRkaXRpb25hbCBzZWdtZW50KHMpICovCisJa25hbWUgKz0gbGVuOworCXdoaWxlIChrbGVuID4gMCAmJiBuYW1sZW4gPiAwKSB7CisJCS8qIGNvbXBhcmUgd2l0aCBuZXh0IG5hbWUgc2VnbWVudCAqLworCQl0ID0gKHN0cnVjdCBkdHNsb3QgKikgJiBwLT5zbG90W3NpXTsKKwkJbGVuID0gbWluKG5hbWxlbiwgRFRTTE9UREFUQUxFTik7CisJCWxlbiA9IG1pbihrbGVuLCBsZW4pOworCQluYW1lID0gdC0+bmFtZTsKKwkJaWYgKChyYyA9IFVuaVN0cm5jbXBfbGUoa25hbWUsIG5hbWUsIGxlbikpKQorCQkJcmV0dXJuIHJjOworCisJCWtsZW4gLT0gbGVuOworCQluYW1sZW4gLT0gbGVuOworCQlrbmFtZSArPSBsZW47CisJCXNpID0gdC0+bmV4dDsKKwl9CisKKwlyZXR1cm4gKGtsZW4gLSBuYW1sZW4pOworfQorCisKKworCisvKgorICoJY2lDb21wYXJlKCkKKyAqCisgKiBmdW5jdGlvbjogY29tcGFyZSBzZWFyY2gga2V5IHdpdGggYW4gKGxlYWYvaW50ZXJuYWwpIGVudHJ5CisgKgorICogcmV0dXJuOgorICoJPCAwIGlmIGsgaXMgPCByZWNvcmQKKyAqCT0gMCBpZiBrIGlzID0gcmVjb3JkCisgKgk+IDAgaWYgayBpcyA+IHJlY29yZAorICovCitzdGF0aWMgaW50IGNpQ29tcGFyZShzdHJ1Y3QgY29tcG9uZW50X25hbWUgKiBrZXksCS8qIHNlYXJjaCBrZXkgKi8KKwkJICAgICBkdHBhZ2VfdCAqIHAsCS8qIGRpcmVjdG9yeSBwYWdlICovCisJCSAgICAgaW50IHNpLAkvKiBlbnRyeSBzbG90IGluZGV4ICovCisJCSAgICAgaW50IGZsYWcpCit7CisJd2NoYXJfdCAqa25hbWUsIHg7CisJX19sZTE2ICpuYW1lOworCWludCBrbGVuLCBuYW1sZW4sIGxlbiwgcmM7CisJc3RydWN0IGxkdGVudHJ5ICpsaDsKKwlzdHJ1Y3QgaWR0ZW50cnkgKmloOworCXN0cnVjdCBkdHNsb3QgKnQ7CisJaW50IGk7CisKKwkvKgorCSAqIGZvcmNlIHRoZSBsZWZ0LW1vc3Qga2V5IG9uIGludGVybmFsIHBhZ2VzLCBhdCBhbnkgbGV2ZWwgb2YKKwkgKiB0aGUgdHJlZSwgdG8gYmUgbGVzcyB0aGFuIGFueSBzZWFyY2gga2V5LgorCSAqIHRoaXMgb2J2aWF0ZXMgaGF2aW5nIHRvIHVwZGF0ZSB0aGUgbGVmdG1vc3Qga2V5IG9uIGFuIGludGVybmFsCisJICogcGFnZSB3aGVuIHRoZSB1c2VyIGluc2VydHMgYSBuZXcga2V5IGluIHRoZSB0cmVlIHNtYWxsZXIgdGhhbgorCSAqIGFueXRoaW5nIHRoYXQgaGFzIGJlZW4gc3RvcmVkLgorCSAqCisJICogKD8gaWYvd2hlbiBkdFNlYXJjaCgpIG5hcnJvd3MgZG93biB0byAxc3QgZW50cnkgKGluZGV4ID0gMCksCisJICogYXQgYW55IGludGVybmFsIHBhZ2UgYXQgYW55IGxldmVsIG9mIHRoZSB0cmVlLAorCSAqIGl0IGRlc2NlbmRzIHRvIGNoaWxkIG9mIHRoZSBlbnRyeSBhbnl3YXkgLQorCSAqID8gbWFrZSB0aGUgZW50cnkgYXMgbWluIHNpemUgZHVtbXkgZW50cnkpCisJICoKKwkgKiBpZiAoZS0+aW5kZXggPT0gMCAmJiBoLT5wcmV2cGcgPT0gUF9JTlZBTElEICYmICEoaC0+ZmxhZ3MgJiBCVF9MRUFGKSkKKwkgKiByZXR1cm4gKDEpOworCSAqLworCisJa25hbWUgPSBrZXktPm5hbWU7CisJa2xlbiA9IGtleS0+bmFtbGVuOworCisJLyoKKwkgKiBsZWFmIHBhZ2UgZW50cnkKKwkgKi8KKwlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9MRUFGKSB7CisJCWxoID0gKHN0cnVjdCBsZHRlbnRyeSAqKSAmIHAtPnNsb3Rbc2ldOworCQlzaSA9IGxoLT5uZXh0OworCQluYW1lID0gbGgtPm5hbWU7CisJCW5hbWxlbiA9IGxoLT5uYW1sZW47CisJCWlmIChmbGFnICYgSkZTX0RJUl9JTkRFWCkKKwkJCWxlbiA9IG1pbihuYW1sZW4sIERUTEhEUkRBVEFMRU4pOworCQllbHNlCisJCQlsZW4gPSBtaW4obmFtbGVuLCBEVExIRFJEQVRBTEVOX0xFR0FDWSk7CisJfQorCS8qCisJICogaW50ZXJuYWwgcGFnZSBlbnRyeQorCSAqLworCWVsc2UgeworCQlpaCA9IChzdHJ1Y3QgaWR0ZW50cnkgKikgJiBwLT5zbG90W3NpXTsKKwkJc2kgPSBpaC0+bmV4dDsKKwkJbmFtZSA9IGloLT5uYW1lOworCQluYW1sZW4gPSBpaC0+bmFtbGVuOworCQlsZW4gPSBtaW4obmFtbGVuLCBEVElIRFJEQVRBTEVOKTsKKwl9CisKKwkvKiBjb21wYXJlIHdpdGggaGVhZC9vbmx5IHNlZ21lbnQgKi8KKwlsZW4gPSBtaW4oa2xlbiwgbGVuKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyssIGtuYW1lKyssIG5hbWUrKykgeworCQkvKiBvbmx5IHVwcGVyY2FzZSBpZiBjYXNlLWluc2Vuc2l0aXZlIHN1cHBvcnQgaXMgb24gKi8KKwkJaWYgKChmbGFnICYgSkZTX09TMikgPT0gSkZTX09TMikKKwkJCXggPSBVbmlUb3VwcGVyKGxlMTZfdG9fY3B1KCpuYW1lKSk7CisJCWVsc2UKKwkJCXggPSBsZTE2X3RvX2NwdSgqbmFtZSk7CisJCWlmICgocmMgPSAqa25hbWUgLSB4KSkKKwkJCXJldHVybiByYzsKKwl9CisKKwlrbGVuIC09IGxlbjsKKwluYW1sZW4gLT0gbGVuOworCisJLyogY29tcGFyZSB3aXRoIGFkZGl0aW9uYWwgc2VnbWVudChzKSAqLworCXdoaWxlIChrbGVuID4gMCAmJiBuYW1sZW4gPiAwKSB7CisJCS8qIGNvbXBhcmUgd2l0aCBuZXh0IG5hbWUgc2VnbWVudCAqLworCQl0ID0gKHN0cnVjdCBkdHNsb3QgKikgJiBwLT5zbG90W3NpXTsKKwkJbGVuID0gbWluKG5hbWxlbiwgRFRTTE9UREFUQUxFTik7CisJCWxlbiA9IG1pbihrbGVuLCBsZW4pOworCQluYW1lID0gdC0+bmFtZTsKKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrLCBrbmFtZSsrLCBuYW1lKyspIHsKKwkJCS8qIG9ubHkgdXBwZXJjYXNlIGlmIGNhc2UtaW5zZW5zaXRpdmUgc3VwcG9ydCBpcyBvbiAqLworCQkJaWYgKChmbGFnICYgSkZTX09TMikgPT0gSkZTX09TMikKKwkJCQl4ID0gVW5pVG91cHBlcihsZTE2X3RvX2NwdSgqbmFtZSkpOworCQkJZWxzZQorCQkJCXggPSBsZTE2X3RvX2NwdSgqbmFtZSk7CisKKwkJCWlmICgocmMgPSAqa25hbWUgLSB4KSkKKwkJCQlyZXR1cm4gcmM7CisJCX0KKworCQlrbGVuIC09IGxlbjsKKwkJbmFtbGVuIC09IGxlbjsKKwkJc2kgPSB0LT5uZXh0OworCX0KKworCXJldHVybiAoa2xlbiAtIG5hbWxlbik7Cit9CisKKworLyoKKyAqCWNpR2V0TGVhZlByZWZpeEtleSgpCisgKgorICogZnVuY3Rpb246IGNvbXB1dGUgcHJlZml4IG9mIHN1ZmZpeCBjb21wcmVzc2lvbgorICoJICAgICBmcm9tIHR3byBhZGphY2VudCBsZWFmIGVudHJpZXMKKyAqCSAgICAgYWNyb3NzIHBhZ2UgYm91bmRhcnkKKyAqCisgKiByZXR1cm46IG5vbi16ZXJvIG9uIGVycm9yCisgKgkKKyAqLworc3RhdGljIGludCBjaUdldExlYWZQcmVmaXhLZXkoZHRwYWdlX3QgKiBscCwgaW50IGxpLCBkdHBhZ2VfdCAqIHJwLAorCQkJICAgICAgIGludCByaSwgc3RydWN0IGNvbXBvbmVudF9uYW1lICoga2V5LCBpbnQgZmxhZykKK3sKKwlpbnQga2xlbiwgbmFtbGVuOworCXdjaGFyX3QgKnBsLCAqcHIsICprbmFtZTsKKwlzdHJ1Y3QgY29tcG9uZW50X25hbWUgbGtleTsKKwlzdHJ1Y3QgY29tcG9uZW50X25hbWUgcmtleTsKKworCWxrZXkubmFtZSA9ICh3Y2hhcl90ICopIGttYWxsb2MoKEpGU19OQU1FX01BWCArIDEpICogc2l6ZW9mKHdjaGFyX3QpLAorCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAobGtleS5uYW1lID09IE5VTEwpCisJCXJldHVybiAtRU5PU1BDOworCisJcmtleS5uYW1lID0gKHdjaGFyX3QgKikga21hbGxvYygoSkZTX05BTUVfTUFYICsgMSkgKiBzaXplb2Yod2NoYXJfdCksCisJCQkJCUdGUF9LRVJORUwpOworCWlmIChya2V5Lm5hbWUgPT0gTlVMTCkgeworCQlrZnJlZShsa2V5Lm5hbWUpOworCQlyZXR1cm4gLUVOT1NQQzsKKwl9CisKKwkvKiBnZXQgbGVmdCBhbmQgcmlnaHQga2V5ICovCisJZHRHZXRLZXkobHAsIGxpLCAmbGtleSwgZmxhZyk7CisJbGtleS5uYW1lW2xrZXkubmFtbGVuXSA9IDA7CisKKwlpZiAoKGZsYWcgJiBKRlNfT1MyKSA9PSBKRlNfT1MyKQorCQljaVRvVXBwZXIoJmxrZXkpOworCisJZHRHZXRLZXkocnAsIHJpLCAmcmtleSwgZmxhZyk7CisJcmtleS5uYW1lW3JrZXkubmFtbGVuXSA9IDA7CisKKworCWlmICgoZmxhZyAmIEpGU19PUzIpID09IEpGU19PUzIpCisJCWNpVG9VcHBlcigmcmtleSk7CisKKwkvKiBjb21wdXRlIHByZWZpeCAqLworCWtsZW4gPSAwOworCWtuYW1lID0ga2V5LT5uYW1lOworCW5hbWxlbiA9IG1pbihsa2V5Lm5hbWxlbiwgcmtleS5uYW1sZW4pOworCWZvciAocGwgPSBsa2V5Lm5hbWUsIHByID0gcmtleS5uYW1lOworCSAgICAgbmFtbGVuOyBwbCsrLCBwcisrLCBuYW1sZW4tLSwga2xlbisrLCBrbmFtZSsrKSB7CisJCSprbmFtZSA9ICpwcjsKKwkJaWYgKCpwbCAhPSAqcHIpIHsKKwkJCWtleS0+bmFtbGVuID0ga2xlbiArIDE7CisJCQlnb3RvIGZyZWVfbmFtZXM7CisJCX0KKwl9CisKKwkvKiBsLT5uYW1sZW4gPD0gci0+bmFtbGVuIHNpbmNlIGwgPD0gciAqLworCWlmIChsa2V5Lm5hbWxlbiA8IHJrZXkubmFtbGVuKSB7CisJCSprbmFtZSA9ICpwcjsKKwkJa2V5LT5uYW1sZW4gPSBrbGVuICsgMTsKKwl9IGVsc2UJCQkvKiBsLT5uYW1lbGVuID09IHItPm5hbWVsZW4gKi8KKwkJa2V5LT5uYW1sZW4gPSBrbGVuOworCitmcmVlX25hbWVzOgorCWtmcmVlKGxrZXkubmFtZSk7CisJa2ZyZWUocmtleS5uYW1lKTsKKwlyZXR1cm4gMDsKK30KKworCisKKy8qCisgKglkdEdldEtleSgpCisgKgorICogZnVuY3Rpb246IGdldCBrZXkgb2YgdGhlIGVudHJ5CisgKi8KK3N0YXRpYyB2b2lkIGR0R2V0S2V5KGR0cGFnZV90ICogcCwgaW50IGksCS8qIGVudHJ5IGluZGV4ICovCisJCSAgICAgc3RydWN0IGNvbXBvbmVudF9uYW1lICoga2V5LCBpbnQgZmxhZykKK3sKKwlpbnQgc2k7CisJczggKnN0Ymw7CisJc3RydWN0IGxkdGVudHJ5ICpsaDsKKwlzdHJ1Y3QgaWR0ZW50cnkgKmloOworCXN0cnVjdCBkdHNsb3QgKnQ7CisJaW50IG5hbWxlbiwgbGVuOworCXdjaGFyX3QgKmtuYW1lOworCV9fbGUxNiAqbmFtZTsKKworCS8qIGdldCBlbnRyeSAqLworCXN0YmwgPSBEVF9HRVRTVEJMKHApOworCXNpID0gc3RibFtpXTsKKwlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9MRUFGKSB7CisJCWxoID0gKHN0cnVjdCBsZHRlbnRyeSAqKSAmIHAtPnNsb3Rbc2ldOworCQlzaSA9IGxoLT5uZXh0OworCQluYW1sZW4gPSBsaC0+bmFtbGVuOworCQluYW1lID0gbGgtPm5hbWU7CisJCWlmIChmbGFnICYgSkZTX0RJUl9JTkRFWCkKKwkJCWxlbiA9IG1pbihuYW1sZW4sIERUTEhEUkRBVEFMRU4pOworCQllbHNlCisJCQlsZW4gPSBtaW4obmFtbGVuLCBEVExIRFJEQVRBTEVOX0xFR0FDWSk7CisJfSBlbHNlIHsKKwkJaWggPSAoc3RydWN0IGlkdGVudHJ5ICopICYgcC0+c2xvdFtzaV07CisJCXNpID0gaWgtPm5leHQ7CisJCW5hbWxlbiA9IGloLT5uYW1sZW47CisJCW5hbWUgPSBpaC0+bmFtZTsKKwkJbGVuID0gbWluKG5hbWxlbiwgRFRJSERSREFUQUxFTik7CisJfQorCisJa2V5LT5uYW1sZW4gPSBuYW1sZW47CisJa25hbWUgPSBrZXktPm5hbWU7CisKKwkvKgorCSAqIG1vdmUgaGVhZC9vbmx5IHNlZ21lbnQKKwkgKi8KKwlVbmlTdHJuY3B5X2Zyb21fbGUoa25hbWUsIG5hbWUsIGxlbik7CisKKwkvKgorCSAqIG1vdmUgYWRkaXRpb25hbCBzZWdtZW50KHMpCisJICovCisJd2hpbGUgKHNpID49IDApIHsKKwkJLyogZ2V0IG5leHQgc2VnbWVudCAqLworCQl0ID0gJnAtPnNsb3Rbc2ldOworCQlrbmFtZSArPSBsZW47CisJCW5hbWxlbiAtPSBsZW47CisJCWxlbiA9IG1pbihuYW1sZW4sIERUU0xPVERBVEFMRU4pOworCQlVbmlTdHJuY3B5X2Zyb21fbGUoa25hbWUsIHQtPm5hbWUsIGxlbik7CisKKwkJc2kgPSB0LT5uZXh0OworCX0KK30KKworCisvKgorICoJZHRJbnNlcnRFbnRyeSgpCisgKgorICogZnVuY3Rpb246IGFsbG9jYXRlIGZyZWUgc2xvdChzKSBhbmQKKyAqCSAgICAgd3JpdGUgYSBsZWFmL2ludGVybmFsIGVudHJ5CisgKgorICogcmV0dXJuOiBlbnRyeSBzbG90IGluZGV4CisgKi8KK3N0YXRpYyB2b2lkIGR0SW5zZXJ0RW50cnkoZHRwYWdlX3QgKiBwLCBpbnQgaW5kZXgsIHN0cnVjdCBjb21wb25lbnRfbmFtZSAqIGtleSwKKwkJCSAgZGRhdGFfdCAqIGRhdGEsIHN0cnVjdCBkdF9sb2NrICoqIGR0bG9jaykKK3sKKwlzdHJ1Y3QgZHRzbG90ICpoLCAqdDsKKwlzdHJ1Y3QgbGR0ZW50cnkgKmxoID0gTlVMTDsKKwlzdHJ1Y3QgaWR0ZW50cnkgKmloID0gTlVMTDsKKwlpbnQgaHNpLCBmc2ksIGtsZW4sIGxlbiwgbmV4dGluZGV4OworCXdjaGFyX3QgKmtuYW1lOworCV9fbGUxNiAqbmFtZTsKKwlzOCAqc3RibDsKKwlweGRfdCAqeGQ7CisJc3RydWN0IGR0X2xvY2sgKmR0bGNrID0gKmR0bG9jazsKKwlzdHJ1Y3QgbHYgKmx2OworCWludCB4c2ksIG47CisJczY0IGJuID0gMDsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wID0gTlVMTDsKKworCWtsZW4gPSBrZXktPm5hbWxlbjsKKwlrbmFtZSA9IGtleS0+bmFtZTsKKworCS8qIGFsbG9jYXRlIGEgZnJlZSBzbG90ICovCisJaHNpID0gZnNpID0gcC0+aGVhZGVyLmZyZWVsaXN0OworCWggPSAmcC0+c2xvdFtmc2ldOworCXAtPmhlYWRlci5mcmVlbGlzdCA9IGgtPm5leHQ7CisJLS1wLT5oZWFkZXIuZnJlZWNudDsKKworCS8qIG9wZW4gbmV3IGxpbmVsb2NrICovCisJaWYgKGR0bGNrLT5pbmRleCA+PSBkdGxjay0+bWF4Y250KQorCQlkdGxjayA9IChzdHJ1Y3QgZHRfbG9jayAqKSB0eExpbmVsb2NrKGR0bGNrKTsKKworCWx2ID0gJiBkdGxjay0+bHZbZHRsY2stPmluZGV4XTsKKwlsdi0+b2Zmc2V0ID0gaHNpOworCisJLyogd3JpdGUgaGVhZC9vbmx5IHNlZ21lbnQgKi8KKwlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9MRUFGKSB7CisJCWxoID0gKHN0cnVjdCBsZHRlbnRyeSAqKSBoOworCQlsaC0+bmV4dCA9IGgtPm5leHQ7CisJCWxoLT5pbnVtYmVyID0gY3B1X3RvX2xlMzIoZGF0YS0+bGVhZi5pbm8pOworCQlsaC0+bmFtbGVuID0ga2xlbjsKKwkJbmFtZSA9IGxoLT5uYW1lOworCQlpZiAoZGF0YS0+bGVhZi5pcCkgeworCQkJbGVuID0gbWluKGtsZW4sIERUTEhEUkRBVEFMRU4pOworCQkJaWYgKCEocC0+aGVhZGVyLmZsYWcgJiBCVF9ST09UKSkKKwkJCQlibiA9IGFkZHJlc3NQWEQoJnAtPmhlYWRlci5zZWxmKTsKKwkJCWxoLT5pbmRleCA9IGNwdV90b19sZTMyKGFkZF9pbmRleChkYXRhLT5sZWFmLnRpZCwKKwkJCQkJCQkgIGRhdGEtPmxlYWYuaXAsCisJCQkJCQkJICBibiwgaW5kZXgpKTsKKwkJfSBlbHNlCisJCQlsZW4gPSBtaW4oa2xlbiwgRFRMSERSREFUQUxFTl9MRUdBQ1kpOworCX0gZWxzZSB7CisJCWloID0gKHN0cnVjdCBpZHRlbnRyeSAqKSBoOworCQlpaC0+bmV4dCA9IGgtPm5leHQ7CisJCXhkID0gKHB4ZF90ICopIGloOworCQkqeGQgPSBkYXRhLT54ZDsKKwkJaWgtPm5hbWxlbiA9IGtsZW47CisJCW5hbWUgPSBpaC0+bmFtZTsKKwkJbGVuID0gbWluKGtsZW4sIERUSUhEUkRBVEFMRU4pOworCX0KKworCVVuaVN0cm5jcHlfdG9fbGUobmFtZSwga25hbWUsIGxlbik7CisKKwluID0gMTsKKwl4c2kgPSBoc2k7CisKKwkvKiB3cml0ZSBhZGRpdGlvbmFsIHNlZ21lbnQocykgKi8KKwl0ID0gaDsKKwlrbGVuIC09IGxlbjsKKwl3aGlsZSAoa2xlbikgeworCQkvKiBnZXQgZnJlZSBzbG90ICovCisJCWZzaSA9IHAtPmhlYWRlci5mcmVlbGlzdDsKKwkJdCA9ICZwLT5zbG90W2ZzaV07CisJCXAtPmhlYWRlci5mcmVlbGlzdCA9IHQtPm5leHQ7CisJCS0tcC0+aGVhZGVyLmZyZWVjbnQ7CisKKwkJLyogaXMgbmV4dCBzbG90IGNvbnRpZ3VvdXMgPyAqLworCQlpZiAoZnNpICE9IHhzaSArIDEpIHsKKwkJCS8qIGNsb3NlIGN1cnJlbnQgbGluZWxvY2sgKi8KKwkJCWx2LT5sZW5ndGggPSBuOworCQkJZHRsY2stPmluZGV4Kys7CisKKwkJCS8qIG9wZW4gbmV3IGxpbmVsb2NrICovCisJCQlpZiAoZHRsY2stPmluZGV4IDwgZHRsY2stPm1heGNudCkKKwkJCQlsdisrOworCQkJZWxzZSB7CisJCQkJZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgdHhMaW5lbG9jayhkdGxjayk7CisJCQkJbHYgPSAmIGR0bGNrLT5sdlswXTsKKwkJCX0KKworCQkJbHYtPm9mZnNldCA9IGZzaTsKKwkJCW4gPSAwOworCQl9CisKKwkJa25hbWUgKz0gbGVuOworCQlsZW4gPSBtaW4oa2xlbiwgRFRTTE9UREFUQUxFTik7CisJCVVuaVN0cm5jcHlfdG9fbGUodC0+bmFtZSwga25hbWUsIGxlbik7CisKKwkJbisrOworCQl4c2kgPSBmc2k7CisJCWtsZW4gLT0gbGVuOworCX0KKworCS8qIGNsb3NlIGN1cnJlbnQgbGluZWxvY2sgKi8KKwlsdi0+bGVuZ3RoID0gbjsKKwlkdGxjay0+aW5kZXgrKzsKKworCSpkdGxvY2sgPSBkdGxjazsKKworCS8qIHRlcm1pbmF0ZSBsYXN0L29ubHkgc2VnbWVudCAqLworCWlmIChoID09IHQpIHsKKwkJLyogc2luZ2xlIHNlZ21lbnQgZW50cnkgKi8KKwkJaWYgKHAtPmhlYWRlci5mbGFnICYgQlRfTEVBRikKKwkJCWxoLT5uZXh0ID0gLTE7CisJCWVsc2UKKwkJCWloLT5uZXh0ID0gLTE7CisJfSBlbHNlCisJCS8qIG11bHRpLXNlZ21lbnQgZW50cnkgKi8KKwkJdC0+bmV4dCA9IC0xOworCisJLyogaWYgaW5zZXJ0IGludG8gbWlkZGxlLCBzaGlmdCByaWdodCBzdWNjZWVkaW5nIGVudHJpZXMgaW4gc3RibCAqLworCXN0YmwgPSBEVF9HRVRTVEJMKHApOworCW5leHRpbmRleCA9IHAtPmhlYWRlci5uZXh0aW5kZXg7CisJaWYgKGluZGV4IDwgbmV4dGluZGV4KSB7CisJCW1lbW1vdmUoc3RibCArIGluZGV4ICsgMSwgc3RibCArIGluZGV4LCBuZXh0aW5kZXggLSBpbmRleCk7CisKKwkJaWYgKChwLT5oZWFkZXIuZmxhZyAmIEJUX0xFQUYpICYmIGRhdGEtPmxlYWYuaXApIHsKKwkJCXM2NCBsYmxvY2s7CisKKwkJCS8qCisJCQkgKiBOZWVkIHRvIHVwZGF0ZSBzbG90IG51bWJlciBmb3IgZW50cmllcyB0aGF0IG1vdmVkCisJCQkgKiBpbiB0aGUgc3RibAorCQkJICovCisJCQltcCA9IE5VTEw7CisJCQlmb3IgKG4gPSBpbmRleCArIDE7IG4gPD0gbmV4dGluZGV4OyBuKyspIHsKKwkJCQlsaCA9IChzdHJ1Y3QgbGR0ZW50cnkgKikgJiAocC0+c2xvdFtzdGJsW25dXSk7CisJCQkJbW9kaWZ5X2luZGV4KGRhdGEtPmxlYWYudGlkLCBkYXRhLT5sZWFmLmlwLAorCQkJCQkgICAgIGxlMzJfdG9fY3B1KGxoLT5pbmRleCksIGJuLCBuLAorCQkJCQkgICAgICZtcCwgJmxibG9jayk7CisJCQl9CisJCQlpZiAobXApCisJCQkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisJCX0KKwl9CisKKwlzdGJsW2luZGV4XSA9IGhzaTsKKworCS8qIGFkdmFuY2UgbmV4dCBhdmFpbGFibGUgZW50cnkgaW5kZXggb2Ygc3RibCAqLworCSsrcC0+aGVhZGVyLm5leHRpbmRleDsKK30KKworCisvKgorICoJZHRNb3ZlRW50cnkoKQorICoKKyAqIGZ1bmN0aW9uOiBtb3ZlIGVudHJpZXMgZnJvbSBzcGxpdC9sZWZ0IHBhZ2UgdG8gbmV3L3JpZ2h0IHBhZ2UKKyAqCisgKgluZXh0aW5kZXggb2YgZHN0IHBhZ2UgYW5kIGZyZWVsaXN0L2ZyZWVjbnQgb2YgYm90aCBwYWdlcworICoJYXJlIHVwZGF0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIGR0TW92ZUVudHJ5KGR0cGFnZV90ICogc3AsIGludCBzaSwgZHRwYWdlX3QgKiBkcCwKKwkJCXN0cnVjdCBkdF9sb2NrICoqIHNkdGxvY2ssIHN0cnVjdCBkdF9sb2NrICoqIGRkdGxvY2ssCisJCQlpbnQgZG9faW5kZXgpCit7CisJaW50IHNzaSwgbmV4dDsJCS8qIHNyYyBzbG90IGluZGV4ICovCisJaW50IGRpOwkJCS8qIGRzdCBlbnRyeSBpbmRleCAqLworCWludCBkc2k7CQkvKiBkc3Qgc2xvdCBpbmRleCAqLworCXM4ICpzc3RibCwgKmRzdGJsOwkvKiBzb3J0ZWQgZW50cnkgdGFibGUgKi8KKwlpbnQgc25hbWxlbiwgbGVuOworCXN0cnVjdCBsZHRlbnRyeSAqc2xoLCAqZGxoID0gTlVMTDsKKwlzdHJ1Y3QgaWR0ZW50cnkgKnNpaCwgKmRpaCA9IE5VTEw7CisJc3RydWN0IGR0c2xvdCAqaCwgKnMsICpkOworCXN0cnVjdCBkdF9sb2NrICpzZHRsY2sgPSAqc2R0bG9jaywgKmRkdGxjayA9ICpkZHRsb2NrOworCXN0cnVjdCBsdiAqc2x2LCAqZGx2OworCWludCB4c3NpLCBucywgbmQ7CisJaW50IHNmc2k7CisKKwlzc3RibCA9IChzOCAqKSAmIHNwLT5zbG90W3NwLT5oZWFkZXIuc3RibGluZGV4XTsKKwlkc3RibCA9IChzOCAqKSAmIGRwLT5zbG90W2RwLT5oZWFkZXIuc3RibGluZGV4XTsKKworCWRzaSA9IGRwLT5oZWFkZXIuZnJlZWxpc3Q7CS8qIGZpcnN0ICh3aG9sZSBwYWdlKSBmcmVlIHNsb3QgKi8KKwlzZnNpID0gc3AtPmhlYWRlci5mcmVlbGlzdDsKKworCS8qIGxpbmVsb2NrIGRlc3RpbmF0aW9uIGVudHJ5IHNsb3QgKi8KKwlkbHYgPSAmIGRkdGxjay0+bHZbZGR0bGNrLT5pbmRleF07CisJZGx2LT5vZmZzZXQgPSBkc2k7CisKKwkvKiBsaW5lbG9jayBzb3VyY2UgZW50cnkgc2xvdCAqLworCXNsdiA9ICYgc2R0bGNrLT5sdltzZHRsY2stPmluZGV4XTsKKwlzbHYtPm9mZnNldCA9IHNzdGJsW3NpXTsKKwl4c3NpID0gc2x2LT5vZmZzZXQgLSAxOworCisJLyoKKwkgKiBtb3ZlIGVudHJpZXMKKwkgKi8KKwlucyA9IG5kID0gMDsKKwlmb3IgKGRpID0gMDsgc2kgPCBzcC0+aGVhZGVyLm5leHRpbmRleDsgc2krKywgZGkrKykgeworCQlzc2kgPSBzc3RibFtzaV07CisJCWRzdGJsW2RpXSA9IGRzaTsKKworCQkvKiBpcyBuZXh0IHNsb3QgY29udGlndW91cyA/ICovCisJCWlmIChzc2kgIT0geHNzaSArIDEpIHsKKwkJCS8qIGNsb3NlIGN1cnJlbnQgbGluZWxvY2sgKi8KKwkJCXNsdi0+bGVuZ3RoID0gbnM7CisJCQlzZHRsY2stPmluZGV4Kys7CisKKwkJCS8qIG9wZW4gbmV3IGxpbmVsb2NrICovCisJCQlpZiAoc2R0bGNrLT5pbmRleCA8IHNkdGxjay0+bWF4Y250KQorCQkJCXNsdisrOworCQkJZWxzZSB7CisJCQkJc2R0bGNrID0gKHN0cnVjdCBkdF9sb2NrICopIHR4TGluZWxvY2soc2R0bGNrKTsKKwkJCQlzbHYgPSAmIHNkdGxjay0+bHZbMF07CisJCQl9CisKKwkJCXNsdi0+b2Zmc2V0ID0gc3NpOworCQkJbnMgPSAwOworCQl9CisKKwkJLyoKKwkJICogbW92ZSBoZWFkL29ubHkgc2VnbWVudCBvZiBhbiBlbnRyeQorCQkgKi8KKwkJLyogZ2V0IGRzdCBzbG90ICovCisJCWggPSBkID0gJmRwLT5zbG90W2RzaV07CisKKwkJLyogZ2V0IHNyYyBzbG90IGFuZCBtb3ZlICovCisJCXMgPSAmc3AtPnNsb3Rbc3NpXTsKKwkJaWYgKHNwLT5oZWFkZXIuZmxhZyAmIEJUX0xFQUYpIHsKKwkJCS8qIGdldCBzb3VyY2UgZW50cnkgKi8KKwkJCXNsaCA9IChzdHJ1Y3QgbGR0ZW50cnkgKikgczsKKwkJCWRsaCA9IChzdHJ1Y3QgbGR0ZW50cnkgKikgaDsKKwkJCXNuYW1sZW4gPSBzbGgtPm5hbWxlbjsKKworCQkJaWYgKGRvX2luZGV4KSB7CisJCQkJbGVuID0gbWluKHNuYW1sZW4sIERUTEhEUkRBVEFMRU4pOworCQkJCWRsaC0+aW5kZXggPSBzbGgtPmluZGV4OyAvKiBsaXR0bGUtZW5kaWFuICovCisJCQl9IGVsc2UKKwkJCQlsZW4gPSBtaW4oc25hbWxlbiwgRFRMSERSREFUQUxFTl9MRUdBQ1kpOworCisJCQltZW1jcHkoZGxoLCBzbGgsIDYgKyBsZW4gKiAyKTsKKworCQkJbmV4dCA9IHNsaC0+bmV4dDsKKworCQkJLyogdXBkYXRlIGRzdCBoZWFkL29ubHkgc2VnbWVudCBuZXh0IGZpZWxkICovCisJCQlkc2krKzsKKwkJCWRsaC0+bmV4dCA9IGRzaTsKKwkJfSBlbHNlIHsKKwkJCXNpaCA9IChzdHJ1Y3QgaWR0ZW50cnkgKikgczsKKwkJCXNuYW1sZW4gPSBzaWgtPm5hbWxlbjsKKworCQkJbGVuID0gbWluKHNuYW1sZW4sIERUSUhEUkRBVEFMRU4pOworCQkJZGloID0gKHN0cnVjdCBpZHRlbnRyeSAqKSBoOworCQkJbWVtY3B5KGRpaCwgc2loLCAxMCArIGxlbiAqIDIpOworCQkJbmV4dCA9IHNpaC0+bmV4dDsKKworCQkJZHNpKys7CisJCQlkaWgtPm5leHQgPSBkc2k7CisJCX0KKworCQkvKiBmcmVlIHNyYyBoZWFkL29ubHkgc2VnbWVudCAqLworCQlzLT5uZXh0ID0gc2ZzaTsKKwkJcy0+Y250ID0gMTsKKwkJc2ZzaSA9IHNzaTsKKworCQlucysrOworCQluZCsrOworCQl4c3NpID0gc3NpOworCisJCS8qCisJCSAqIG1vdmUgYWRkaXRpb25hbCBzZWdtZW50KHMpIG9mIHRoZSBlbnRyeQorCQkgKi8KKwkJc25hbWxlbiAtPSBsZW47CisJCXdoaWxlICgoc3NpID0gbmV4dCkgPj0gMCkgeworCQkJLyogaXMgbmV4dCBzbG90IGNvbnRpZ3VvdXMgPyAqLworCQkJaWYgKHNzaSAhPSB4c3NpICsgMSkgeworCQkJCS8qIGNsb3NlIGN1cnJlbnQgbGluZWxvY2sgKi8KKwkJCQlzbHYtPmxlbmd0aCA9IG5zOworCQkJCXNkdGxjay0+aW5kZXgrKzsKKworCQkJCS8qIG9wZW4gbmV3IGxpbmVsb2NrICovCisJCQkJaWYgKHNkdGxjay0+aW5kZXggPCBzZHRsY2stPm1heGNudCkKKwkJCQkJc2x2Kys7CisJCQkJZWxzZSB7CisJCQkJCXNkdGxjayA9CisJCQkJCSAgICAoc3RydWN0IGR0X2xvY2sgKikKKwkJCQkJICAgIHR4TGluZWxvY2soc2R0bGNrKTsKKwkJCQkJc2x2ID0gJiBzZHRsY2stPmx2WzBdOworCQkJCX0KKworCQkJCXNsdi0+b2Zmc2V0ID0gc3NpOworCQkJCW5zID0gMDsKKwkJCX0KKworCQkJLyogZ2V0IG5leHQgc291cmNlIHNlZ21lbnQgKi8KKwkJCXMgPSAmc3AtPnNsb3Rbc3NpXTsKKworCQkJLyogZ2V0IG5leHQgZGVzdGluYXRpb24gZnJlZSBzbG90ICovCisJCQlkKys7CisKKwkJCWxlbiA9IG1pbihzbmFtbGVuLCBEVFNMT1REQVRBTEVOKTsKKwkJCVVuaVN0cm5jcHlfbGUoZC0+bmFtZSwgcy0+bmFtZSwgbGVuKTsKKworCQkJbnMrKzsKKwkJCW5kKys7CisJCQl4c3NpID0gc3NpOworCisJCQlkc2krKzsKKwkJCWQtPm5leHQgPSBkc2k7CisKKwkJCS8qIGZyZWUgc291cmNlIHNlZ21lbnQgKi8KKwkJCW5leHQgPSBzLT5uZXh0OworCQkJcy0+bmV4dCA9IHNmc2k7CisJCQlzLT5jbnQgPSAxOworCQkJc2ZzaSA9IHNzaTsKKworCQkJc25hbWxlbiAtPSBsZW47CisJCX0JCS8qIGVuZCB3aGlsZSAqLworCisJCS8qIHRlcm1pbmF0ZSBkc3QgbGFzdC9vbmx5IHNlZ21lbnQgKi8KKwkJaWYgKGggPT0gZCkgeworCQkJLyogc2luZ2xlIHNlZ21lbnQgZW50cnkgKi8KKwkJCWlmIChkcC0+aGVhZGVyLmZsYWcgJiBCVF9MRUFGKQorCQkJCWRsaC0+bmV4dCA9IC0xOworCQkJZWxzZQorCQkJCWRpaC0+bmV4dCA9IC0xOworCQl9IGVsc2UKKwkJCS8qIG11bHRpLXNlZ21lbnQgZW50cnkgKi8KKwkJCWQtPm5leHQgPSAtMTsKKwl9CQkJLyogZW5kIGZvciAqLworCisJLyogY2xvc2UgY3VycmVudCBsaW5lbG9jayAqLworCXNsdi0+bGVuZ3RoID0gbnM7CisJc2R0bGNrLT5pbmRleCsrOworCSpzZHRsb2NrID0gc2R0bGNrOworCisJZGx2LT5sZW5ndGggPSBuZDsKKwlkZHRsY2stPmluZGV4Kys7CisJKmRkdGxvY2sgPSBkZHRsY2s7CisKKwkvKiB1cGRhdGUgc291cmNlIGhlYWRlciAqLworCXNwLT5oZWFkZXIuZnJlZWxpc3QgPSBzZnNpOworCXNwLT5oZWFkZXIuZnJlZWNudCArPSBuZDsKKworCS8qIHVwZGF0ZSBkZXN0aW5hdGlvbiBoZWFkZXIgKi8KKwlkcC0+aGVhZGVyLm5leHRpbmRleCA9IGRpOworCisJZHAtPmhlYWRlci5mcmVlbGlzdCA9IGRzaTsKKwlkcC0+aGVhZGVyLmZyZWVjbnQgLT0gbmQ7Cit9CisKKworLyoKKyAqCWR0RGVsZXRlRW50cnkoKQorICoKKyAqIGZ1bmN0aW9uOiBmcmVlIGEgKGxlYWYvaW50ZXJuYWwpIGVudHJ5CisgKgorICogbG9nIGZyZWVsaXN0IGhlYWRlciwgc3RibCwgYW5kIGVhY2ggc2VnbWVudCBzbG90IG9mIGVudHJ5CisgKiAoZXZlbiB0aG91Z2ggbGFzdC9vbmx5IHNlZ21lbnQgbmV4dCBmaWVsZCBpcyBtb2RpZmllZCwKKyAqIHBoeXNpY2FsIGltYWdlIGxvZ2dpbmcgcmVxdWlyZXMgYWxsIHNlZ21lbnQgc2xvdHMgb2YKKyAqIHRoZSBlbnRyeSBsb2dnZWQgdG8gYXZvaWQgYXBwbHlpbmcgcHJldmlvdXMgdXBkYXRlcworICogdG8gdGhlIHNhbWUgc2xvdHMpCisgKi8KK3N0YXRpYyB2b2lkIGR0RGVsZXRlRW50cnkoZHRwYWdlX3QgKiBwLCBpbnQgZmksIHN0cnVjdCBkdF9sb2NrICoqIGR0bG9jaykKK3sKKwlpbnQgZnNpOwkJLyogZnJlZSBlbnRyeSBzbG90IGluZGV4ICovCisJczggKnN0Ymw7CisJc3RydWN0IGR0c2xvdCAqdDsKKwlpbnQgc2ksIGZyZWVjbnQ7CisJc3RydWN0IGR0X2xvY2sgKmR0bGNrID0gKmR0bG9jazsKKwlzdHJ1Y3QgbHYgKmx2OworCWludCB4c2ksIG47CisKKwkvKiBnZXQgZnJlZSBlbnRyeSBzbG90IGluZGV4ICovCisJc3RibCA9IERUX0dFVFNUQkwocCk7CisJZnNpID0gc3RibFtmaV07CisKKwkvKiBvcGVuIG5ldyBsaW5lbG9jayAqLworCWlmIChkdGxjay0+aW5kZXggPj0gZHRsY2stPm1heGNudCkKKwkJZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgdHhMaW5lbG9jayhkdGxjayk7CisJbHYgPSAmIGR0bGNrLT5sdltkdGxjay0+aW5kZXhdOworCisJbHYtPm9mZnNldCA9IGZzaTsKKworCS8qIGdldCB0aGUgaGVhZC9vbmx5IHNlZ21lbnQgKi8KKwl0ID0gJnAtPnNsb3RbZnNpXTsKKwlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9MRUFGKQorCQlzaSA9ICgoc3RydWN0IGxkdGVudHJ5ICopIHQpLT5uZXh0OworCWVsc2UKKwkJc2kgPSAoKHN0cnVjdCBpZHRlbnRyeSAqKSB0KS0+bmV4dDsKKwl0LT5uZXh0ID0gc2k7CisJdC0+Y250ID0gMTsKKworCW4gPSBmcmVlY250ID0gMTsKKwl4c2kgPSBmc2k7CisKKwkvKiBmaW5kIHRoZSBsYXN0L29ubHkgc2VnbWVudCAqLworCXdoaWxlIChzaSA+PSAwKSB7CisJCS8qIGlzIG5leHQgc2xvdCBjb250aWd1b3VzID8gKi8KKwkJaWYgKHNpICE9IHhzaSArIDEpIHsKKwkJCS8qIGNsb3NlIGN1cnJlbnQgbGluZWxvY2sgKi8KKwkJCWx2LT5sZW5ndGggPSBuOworCQkJZHRsY2stPmluZGV4Kys7CisKKwkJCS8qIG9wZW4gbmV3IGxpbmVsb2NrICovCisJCQlpZiAoZHRsY2stPmluZGV4IDwgZHRsY2stPm1heGNudCkKKwkJCQlsdisrOworCQkJZWxzZSB7CisJCQkJZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgdHhMaW5lbG9jayhkdGxjayk7CisJCQkJbHYgPSAmIGR0bGNrLT5sdlswXTsKKwkJCX0KKworCQkJbHYtPm9mZnNldCA9IHNpOworCQkJbiA9IDA7CisJCX0KKworCQluKys7CisJCXhzaSA9IHNpOworCQlmcmVlY250Kys7CisKKwkJdCA9ICZwLT5zbG90W3NpXTsKKwkJdC0+Y250ID0gMTsKKwkJc2kgPSB0LT5uZXh0OworCX0KKworCS8qIGNsb3NlIGN1cnJlbnQgbGluZWxvY2sgKi8KKwlsdi0+bGVuZ3RoID0gbjsKKwlkdGxjay0+aW5kZXgrKzsKKworCSpkdGxvY2sgPSBkdGxjazsKKworCS8qIHVwZGF0ZSBmcmVlbGlzdCAqLworCXQtPm5leHQgPSBwLT5oZWFkZXIuZnJlZWxpc3Q7CisJcC0+aGVhZGVyLmZyZWVsaXN0ID0gZnNpOworCXAtPmhlYWRlci5mcmVlY250ICs9IGZyZWVjbnQ7CisKKwkvKiBpZiBkZWxldGUgZnJvbSBtaWRkbGUsCisJICogc2hpZnQgbGVmdCB0aGUgc3VjY2VkZGluZyBlbnRyaWVzIGluIHRoZSBzdGJsCisJICovCisJc2kgPSBwLT5oZWFkZXIubmV4dGluZGV4OworCWlmIChmaSA8IHNpIC0gMSkKKwkJbWVtbW92ZSgmc3RibFtmaV0sICZzdGJsW2ZpICsgMV0sIHNpIC0gZmkgLSAxKTsKKworCXAtPmhlYWRlci5uZXh0aW5kZXgtLTsKK30KKworCisvKgorICoJZHRUcnVuY2F0ZUVudHJ5KCkKKyAqCisgKiBmdW5jdGlvbjogdHJ1bmNhdGUgYSAobGVhZi9pbnRlcm5hbCkgZW50cnkKKyAqCisgKiBsb2cgZnJlZWxpc3QgaGVhZGVyLCBzdGJsLCBhbmQgZWFjaCBzZWdtZW50IHNsb3Qgb2YgZW50cnkKKyAqIChldmVuIHRob3VnaCBsYXN0L29ubHkgc2VnbWVudCBuZXh0IGZpZWxkIGlzIG1vZGlmaWVkLAorICogcGh5c2ljYWwgaW1hZ2UgbG9nZ2luZyByZXF1aXJlcyBhbGwgc2VnbWVudCBzbG90cyBvZgorICogdGhlIGVudHJ5IGxvZ2dlZCB0byBhdm9pZCBhcHBseWluZyBwcmV2aW91cyB1cGRhdGVzCisgKiB0byB0aGUgc2FtZSBzbG90cykKKyAqLworc3RhdGljIHZvaWQgZHRUcnVuY2F0ZUVudHJ5KGR0cGFnZV90ICogcCwgaW50IHRpLCBzdHJ1Y3QgZHRfbG9jayAqKiBkdGxvY2spCit7CisJaW50IHRzaTsJCS8qIHRydW5jYXRlIGVudHJ5IHNsb3QgaW5kZXggKi8KKwlzOCAqc3RibDsKKwlzdHJ1Y3QgZHRzbG90ICp0OworCWludCBzaSwgZnJlZWNudDsKKwlzdHJ1Y3QgZHRfbG9jayAqZHRsY2sgPSAqZHRsb2NrOworCXN0cnVjdCBsdiAqbHY7CisJaW50IGZzaSwgeHNpLCBuOworCisJLyogZ2V0IGZyZWUgZW50cnkgc2xvdCBpbmRleCAqLworCXN0YmwgPSBEVF9HRVRTVEJMKHApOworCXRzaSA9IHN0YmxbdGldOworCisJLyogb3BlbiBuZXcgbGluZWxvY2sgKi8KKwlpZiAoZHRsY2stPmluZGV4ID49IGR0bGNrLT5tYXhjbnQpCisJCWR0bGNrID0gKHN0cnVjdCBkdF9sb2NrICopIHR4TGluZWxvY2soZHRsY2spOworCWx2ID0gJiBkdGxjay0+bHZbZHRsY2stPmluZGV4XTsKKworCWx2LT5vZmZzZXQgPSB0c2k7CisKKwkvKiBnZXQgdGhlIGhlYWQvb25seSBzZWdtZW50ICovCisJdCA9ICZwLT5zbG90W3RzaV07CisJQVNTRVJUKHAtPmhlYWRlci5mbGFnICYgQlRfSU5URVJOQUwpOworCSgoc3RydWN0IGlkdGVudHJ5ICopIHQpLT5uYW1sZW4gPSAwOworCXNpID0gKChzdHJ1Y3QgaWR0ZW50cnkgKikgdCktPm5leHQ7CisJKChzdHJ1Y3QgaWR0ZW50cnkgKikgdCktPm5leHQgPSAtMTsKKworCW4gPSAxOworCWZyZWVjbnQgPSAwOworCWZzaSA9IHNpOworCXhzaSA9IHRzaTsKKworCS8qIGZpbmQgdGhlIGxhc3Qvb25seSBzZWdtZW50ICovCisJd2hpbGUgKHNpID49IDApIHsKKwkJLyogaXMgbmV4dCBzbG90IGNvbnRpZ3VvdXMgPyAqLworCQlpZiAoc2kgIT0geHNpICsgMSkgeworCQkJLyogY2xvc2UgY3VycmVudCBsaW5lbG9jayAqLworCQkJbHYtPmxlbmd0aCA9IG47CisJCQlkdGxjay0+aW5kZXgrKzsKKworCQkJLyogb3BlbiBuZXcgbGluZWxvY2sgKi8KKwkJCWlmIChkdGxjay0+aW5kZXggPCBkdGxjay0+bWF4Y250KQorCQkJCWx2Kys7CisJCQllbHNlIHsKKwkJCQlkdGxjayA9IChzdHJ1Y3QgZHRfbG9jayAqKSB0eExpbmVsb2NrKGR0bGNrKTsKKwkJCQlsdiA9ICYgZHRsY2stPmx2WzBdOworCQkJfQorCisJCQlsdi0+b2Zmc2V0ID0gc2k7CisJCQluID0gMDsKKwkJfQorCisJCW4rKzsKKwkJeHNpID0gc2k7CisJCWZyZWVjbnQrKzsKKworCQl0ID0gJnAtPnNsb3Rbc2ldOworCQl0LT5jbnQgPSAxOworCQlzaSA9IHQtPm5leHQ7CisJfQorCisJLyogY2xvc2UgY3VycmVudCBsaW5lbG9jayAqLworCWx2LT5sZW5ndGggPSBuOworCWR0bGNrLT5pbmRleCsrOworCisJKmR0bG9jayA9IGR0bGNrOworCisJLyogdXBkYXRlIGZyZWVsaXN0ICovCisJaWYgKGZyZWVjbnQgPT0gMCkKKwkJcmV0dXJuOworCXQtPm5leHQgPSBwLT5oZWFkZXIuZnJlZWxpc3Q7CisJcC0+aGVhZGVyLmZyZWVsaXN0ID0gZnNpOworCXAtPmhlYWRlci5mcmVlY250ICs9IGZyZWVjbnQ7Cit9CisKKworLyoKKyAqCWR0TGluZWxvY2tGcmVlbGlzdCgpCisgKi8KK3N0YXRpYyB2b2lkIGR0TGluZWxvY2tGcmVlbGlzdChkdHBhZ2VfdCAqIHAsCS8qIGRpcmVjdG9yeSBwYWdlICovCisJCQkgICAgICAgaW50IG0sCS8qIG1heCBzbG90IGluZGV4ICovCisJCQkgICAgICAgc3RydWN0IGR0X2xvY2sgKiogZHRsb2NrKQoreworCWludCBmc2k7CQkvKiBmcmVlIGVudHJ5IHNsb3QgaW5kZXggKi8KKwlzdHJ1Y3QgZHRzbG90ICp0OworCWludCBzaTsKKwlzdHJ1Y3QgZHRfbG9jayAqZHRsY2sgPSAqZHRsb2NrOworCXN0cnVjdCBsdiAqbHY7CisJaW50IHhzaSwgbjsKKworCS8qIGdldCBmcmVlIGVudHJ5IHNsb3QgaW5kZXggKi8KKwlmc2kgPSBwLT5oZWFkZXIuZnJlZWxpc3Q7CisKKwkvKiBvcGVuIG5ldyBsaW5lbG9jayAqLworCWlmIChkdGxjay0+aW5kZXggPj0gZHRsY2stPm1heGNudCkKKwkJZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgdHhMaW5lbG9jayhkdGxjayk7CisJbHYgPSAmIGR0bGNrLT5sdltkdGxjay0+aW5kZXhdOworCisJbHYtPm9mZnNldCA9IGZzaTsKKworCW4gPSAxOworCXhzaSA9IGZzaTsKKworCXQgPSAmcC0+c2xvdFtmc2ldOworCXNpID0gdC0+bmV4dDsKKworCS8qIGZpbmQgdGhlIGxhc3Qvb25seSBzZWdtZW50ICovCisJd2hpbGUgKHNpIDwgbSAmJiBzaSA+PSAwKSB7CisJCS8qIGlzIG5leHQgc2xvdCBjb250aWd1b3VzID8gKi8KKwkJaWYgKHNpICE9IHhzaSArIDEpIHsKKwkJCS8qIGNsb3NlIGN1cnJlbnQgbGluZWxvY2sgKi8KKwkJCWx2LT5sZW5ndGggPSBuOworCQkJZHRsY2stPmluZGV4Kys7CisKKwkJCS8qIG9wZW4gbmV3IGxpbmVsb2NrICovCisJCQlpZiAoZHRsY2stPmluZGV4IDwgZHRsY2stPm1heGNudCkKKwkJCQlsdisrOworCQkJZWxzZSB7CisJCQkJZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgdHhMaW5lbG9jayhkdGxjayk7CisJCQkJbHYgPSAmIGR0bGNrLT5sdlswXTsKKwkJCX0KKworCQkJbHYtPm9mZnNldCA9IHNpOworCQkJbiA9IDA7CisJCX0KKworCQluKys7CisJCXhzaSA9IHNpOworCisJCXQgPSAmcC0+c2xvdFtzaV07CisJCXNpID0gdC0+bmV4dDsKKwl9CisKKwkvKiBjbG9zZSBjdXJyZW50IGxpbmVsb2NrICovCisJbHYtPmxlbmd0aCA9IG47CisJZHRsY2stPmluZGV4Kys7CisKKwkqZHRsb2NrID0gZHRsY2s7Cit9CisKKworLyoKKyAqIE5BTUU6IGR0TW9kaWZ5CisgKgorICogRlVOQ1RJT046IE1vZGlmeSB0aGUgaW5vZGUgbnVtYmVyIHBhcnQgb2YgYSBkaXJlY3RvcnkgZW50cnkKKyAqCisgKiBQQVJBTUVURVJTOgorICoJdGlkCS0gVHJhbnNhY3Rpb24gaWQKKyAqCWlwCS0gSW5vZGUgb2YgcGFyZW50IGRpcmVjdG9yeQorICoJa2V5CS0gTmFtZSBvZiBlbnRyeSB0byBiZSBtb2RpZmllZAorICoJb3JpZ19pbm8JLSBPcmlnaW5hbCBpbm9kZSBudW1iZXIgZXhwZWN0ZWQgaW4gZW50cnkKKyAqCW5ld19pbm8JLSBOZXcgaW5vZGUgbnVtYmVyIHRvIHB1dCBpbnRvIGVudHJ5CisgKglmbGFnCS0gSkZTX1JFTkFNRQorICoKKyAqIFJFVFVSTlM6CisgKgktRVNUQUxFCS0gSWYgZW50cnkgZm91bmQgZG9lcyBub3QgbWF0Y2ggb3JpZ19pbm8gcGFzc2VkIGluCisgKgktRU5PRU5UCS0gSWYgbm8gZW50cnkgY2FuIGJlIGZvdW5kIHRvIG1hdGNoIGtleQorICoJMAktIElmIHN1Y2Nlc3NmdWxseSBtb2RpZmllZCBlbnRyeQorICovCitpbnQgZHRNb2RpZnkodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLAorCSBzdHJ1Y3QgY29tcG9uZW50X25hbWUgKiBrZXksIGlub190ICogb3JpZ19pbm8sIGlub190IG5ld19pbm8sIGludCBmbGFnKQoreworCWludCByYzsKKwlzNjQgYm47CisJc3RydWN0IG1ldGFwYWdlICptcDsKKwlkdHBhZ2VfdCAqcDsKKwlpbnQgaW5kZXg7CisJc3RydWN0IGJ0c3RhY2sgYnRzdGFjazsKKwlzdHJ1Y3QgdGxvY2sgKnRsY2s7CisJc3RydWN0IGR0X2xvY2sgKmR0bGNrOworCXN0cnVjdCBsdiAqbHY7CisJczggKnN0Ymw7CisJaW50IGVudHJ5X3NpOwkJLyogZW50cnkgc2xvdCBpbmRleCAqLworCXN0cnVjdCBsZHRlbnRyeSAqZW50cnk7CisKKwkvKgorCSAqICAgICAgc2VhcmNoIGZvciB0aGUgZW50cnkgdG8gbW9kaWZ5OgorCSAqCisJICogZHRTZWFyY2goKSByZXR1cm5zIChsZWFmIHBhZ2UgcGlubmVkLCBpbmRleCBhdCB3aGljaCB0byBtb2RpZnkpLgorCSAqLworCWlmICgocmMgPSBkdFNlYXJjaChpcCwga2V5LCBvcmlnX2lubywgJmJ0c3RhY2ssIGZsYWcpKSkKKwkJcmV0dXJuIHJjOworCisJLyogcmV0cmlldmUgc2VhcmNoIHJlc3VsdCAqLworCURUX0dFVFNFQVJDSChpcCwgYnRzdGFjay50b3AsIGJuLCBtcCwgcCwgaW5kZXgpOworCisJQlRfTUFSS19ESVJUWShtcCwgaXApOworCS8qCisJICogYWNxdWlyZSBhIHRyYW5zYWN0aW9uIGxvY2sgb24gdGhlIGxlYWYgcGFnZSBvZiBuYW1lZCBlbnRyeQorCSAqLworCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgbXAsIHRsY2tEVFJFRSB8IHRsY2tFTlRSWSk7CisJZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgJiB0bGNrLT5sb2NrOworCisJLyogZ2V0IHNsb3QgaW5kZXggb2YgdGhlIGVudHJ5ICovCisJc3RibCA9IERUX0dFVFNUQkwocCk7CisJZW50cnlfc2kgPSBzdGJsW2luZGV4XTsKKworCS8qIGxpbmVsb2NrIGVudHJ5ICovCisJQVNTRVJUKGR0bGNrLT5pbmRleCA9PSAwKTsKKwlsdiA9ICYgZHRsY2stPmx2WzBdOworCWx2LT5vZmZzZXQgPSBlbnRyeV9zaTsKKwlsdi0+bGVuZ3RoID0gMTsKKwlkdGxjay0+aW5kZXgrKzsKKworCS8qIGdldCB0aGUgaGVhZC9vbmx5IHNlZ21lbnQgKi8KKwllbnRyeSA9IChzdHJ1Y3QgbGR0ZW50cnkgKikgJiBwLT5zbG90W2VudHJ5X3NpXTsKKworCS8qIHN1YnN0aXR1dGUgdGhlIGlub2RlIG51bWJlciBvZiB0aGUgZW50cnkgKi8KKwllbnRyeS0+aW51bWJlciA9IGNwdV90b19sZTMyKG5ld19pbm8pOworCisJLyogdW5waW4gdGhlIGxlYWYgcGFnZSAqLworCURUX1BVVFBBR0UobXApOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBfSkZTX0RFQlVHX0RUUkVFCisvKgorICoJZHREaXNwbGF5VHJlZSgpCisgKgorICogZnVuY3Rpb246IHRyYXZlcnNlIGZvcndhcmQKKyAqLworaW50IGR0RGlzcGxheVRyZWUoc3RydWN0IGlub2RlICppcCkKK3sKKwlpbnQgcmM7CisJc3RydWN0IG1ldGFwYWdlICptcDsKKwlkdHBhZ2VfdCAqcDsKKwlzNjQgYm4sIHBibjsKKwlpbnQgaW5kZXgsIGxhc3RpbmRleCwgdiwgaDsKKwlweGRfdCAqeGQ7CisJc3RydWN0IGJ0c3RhY2sgYnRzdGFjazsKKwlzdHJ1Y3QgYnRmcmFtZSAqYnRzcDsKKwlzdHJ1Y3QgYnRmcmFtZSAqcGFyZW50OworCXU4ICpzdGJsOworCWludCBwc2l6ZSA9IDI1NjsKKworCXByaW50aygiZGlzcGxheSBCKy10cmVlLlxuIik7CisKKwkvKiBjbGVhciBzdGFjayAqLworCWJ0c3AgPSBidHN0YWNrLnN0YWNrOworCisJLyoKKwkgKiBzdGFydCB3aXRoIHJvb3QKKwkgKgorCSAqIHJvb3QgcmVzaWRlcyBpbiB0aGUgaW5vZGUKKwkgKi8KKwlibiA9IDA7CisJdiA9IGggPSAwOworCisJLyoKKwkgKiBmaXJzdCBhY2Nlc3Mgb2YgZWFjaCBwYWdlOgorCSAqLworICAgICAgbmV3UGFnZToKKwlEVF9HRVRQQUdFKGlwLCBibiwgbXAsIHBzaXplLCBwLCByYyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwkvKiBwcm9jZXNzIGVudHJpZXMgZm9yd2FyZCBmcm9tIGZpcnN0IGluZGV4ICovCisJaW5kZXggPSAwOworCWxhc3RpbmRleCA9IHAtPmhlYWRlci5uZXh0aW5kZXggLSAxOworCisJaWYgKHAtPmhlYWRlci5mbGFnICYgQlRfSU5URVJOQUwpIHsKKwkJLyoKKwkJICogZmlyc3QgYWNjZXNzIG9mIGVhY2ggaW50ZXJuYWwgcGFnZQorCQkgKi8KKwkJcHJpbnRmKCJpbnRlcm5hbCBwYWdlICIpOworCQlkdERpc3BsYXlQYWdlKGlwLCBibiwgcCk7CisKKwkJZ290byBnZXRDaGlsZDsKKwl9IGVsc2UgewkJLyogKHAtPmhlYWRlci5mbGFnICYgQlRfTEVBRikgKi8KKworCQkvKgorCQkgKiBmaXJzdCBhY2Nlc3Mgb2YgZWFjaCBsZWFmIHBhZ2UKKwkJICovCisJCXByaW50ZigibGVhZiBwYWdlICIpOworCQlkdERpc3BsYXlQYWdlKGlwLCBibiwgcCk7CisKKwkJLyoKKwkJICogcHJvY2VzcyBsZWFmIHBhZ2UgZW50cmllcworCQkgKgorCQkgZm9yICggOyBpbmRleCA8PSBsYXN0aW5kZXg7IGluZGV4KyspCisJCSB7CisJCSB9CisJCSAqLworCisJCS8qIHVucGluIHRoZSBsZWFmIHBhZ2UgKi8KKwkJRFRfUFVUUEFHRShtcCk7CisJfQorCisJLyoKKwkgKiBnbyBiYWNrIHVwIHRvIHRoZSBwYXJlbnQgcGFnZQorCSAqLworICAgICAgZ2V0UGFyZW50OgorCS8qIHBvcC9yZXN0b3JlIHBhcmVudCBlbnRyeSBmb3IgdGhlIGN1cnJlbnQgY2hpbGQgcGFnZSAqLworCWlmICgocGFyZW50ID0gKGJ0c3AgPT0gYnRzdGFjay5zdGFjayA/IE5VTEwgOiAtLWJ0c3ApKSA9PSBOVUxMKQorCQkvKiBjdXJyZW50IHBhZ2UgbXVzdCBoYXZlIGJlZW4gcm9vdCAqLworCQlyZXR1cm47CisKKwkvKgorCSAqIHBhcmVudCBwYWdlIHNjYW4gY29tcGxldGVkCisJICovCisJaWYgKChpbmRleCA9IHBhcmVudC0+aW5kZXgpID09IChsYXN0aW5kZXggPSBwYXJlbnQtPmxhc3RpbmRleCkpIHsKKwkJLyogZ28gYmFjayB1cCB0byB0aGUgcGFyZW50IHBhZ2UgKi8KKwkJZ290byBnZXRQYXJlbnQ7CisJfQorCisJLyoKKwkgKiBwYXJlbnQgcGFnZSBoYXMgZW50cmllcyByZW1haW5pbmcKKwkgKi8KKwkvKiBnZXQgYmFjayB0aGUgcGFyZW50IHBhZ2UgKi8KKwlibiA9IHBhcmVudC0+Ym47CisJLyogdiA9IHBhcmVudC0+bGV2ZWw7ICovCisJRFRfR0VUUEFHRShpcCwgYm4sIG1wLCBQU0laRSwgcCwgcmMpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJLyogZ2V0IG5leHQgcGFyZW50IGVudHJ5ICovCisJaW5kZXgrKzsKKworCS8qCisJICogaW50ZXJuYWwgcGFnZTogZ28gZG93biB0byBjaGlsZCBwYWdlIG9mIGN1cnJlbnQgZW50cnkKKwkgKi8KKyAgICAgIGdldENoaWxkOgorCS8qIHB1c2gvc2F2ZSBjdXJyZW50IHBhcmVudCBlbnRyeSBmb3IgdGhlIGNoaWxkIHBhZ2UgKi8KKwlidHNwLT5ibiA9IHBibiA9IGJuOworCWJ0c3AtPmluZGV4ID0gaW5kZXg7CisJYnRzcC0+bGFzdGluZGV4ID0gbGFzdGluZGV4OworCS8qIGJ0c3AtPmxldmVsID0gdjsgKi8KKwkvKiBidHNwLT5ub2RlID0gaDsgKi8KKwkrK2J0c3A7CisKKwkvKiBnZXQgY3VycmVudCBlbnRyeSBmb3IgdGhlIGNoaWxkIHBhZ2UgKi8KKwlzdGJsID0gRFRfR0VUU1RCTChwKTsKKwl4ZCA9IChweGRfdCAqKSAmIHAtPnNsb3Rbc3RibFtpbmRleF1dOworCisJLyoKKwkgKiBmaXJzdCBhY2Nlc3Mgb2YgZWFjaCBpbnRlcm5hbCBlbnRyeToKKwkgKi8KKworCS8qIGdldCBjaGlsZCBwYWdlICovCisJYm4gPSBhZGRyZXNzUFhEKHhkKTsKKwlwc2l6ZSA9IGxlbmd0aFBYRCh4ZCkgPDwgaXAtPmlfaXBtbnQtPmlfbDJic2l6ZTsKKworCXByaW50aygidHJhdmVyc2UgZG93biAweCVMeFslZF0tPjB4JUx4XG4iLCBwYm4sIGluZGV4LCBibik7CisJdisrOworCWggPSBpbmRleDsKKworCS8qIHJlbGVhc2UgcGFyZW50IHBhZ2UgKi8KKwlEVF9QVVRQQUdFKG1wKTsKKworCS8qIHByb2Nlc3MgdGhlIGNoaWxkIHBhZ2UgKi8KKwlnb3RvIG5ld1BhZ2U7Cit9CisKKworLyoKKyAqCWR0RGlzcGxheVBhZ2UoKQorICoKKyAqIGZ1bmN0aW9uOiBkaXNwbGF5IHBhZ2UKKyAqLworaW50IGR0RGlzcGxheVBhZ2Uoc3RydWN0IGlub2RlICppcCwgczY0IGJuLCBkdHBhZ2VfdCAqIHApCit7CisJaW50IHJjOworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJc3RydWN0IGxkdGVudHJ5ICpsaDsKKwlzdHJ1Y3QgaWR0ZW50cnkgKmloOworCXB4ZF90ICp4ZDsKKwlpbnQgaSwgajsKKwl1OCAqc3RibDsKKwl3Y2hhcl90IG5hbWVbSkZTX05BTUVfTUFYICsgMV07CisJc3RydWN0IGNvbXBvbmVudF9uYW1lIGtleSA9IHsgMCwgbmFtZSB9OworCWludCBmcmVlcGFnZSA9IDA7CisKKwlpZiAocCA9PSBOVUxMKSB7CisJCWZyZWVwYWdlID0gMTsKKwkJRFRfR0VUUEFHRShpcCwgYm4sIG1wLCBQU0laRSwgcCwgcmMpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJfQorCisJLyogZGlzcGxheSBwYWdlIGNvbnRyb2wgKi8KKwlwcmludGsoImJuOjB4JUx4IGZsYWc6MHglMDh4IG5leHRpbmRleDolZFxuIiwKKwkgICAgICAgYm4sIHAtPmhlYWRlci5mbGFnLCBwLT5oZWFkZXIubmV4dGluZGV4KTsKKworCS8qIGRpc3BsYXkgZW50cmllcyAqLworCXN0YmwgPSBEVF9HRVRTVEJMKHApOworCWZvciAoaSA9IDAsIGogPSAxOyBpIDwgcC0+aGVhZGVyLm5leHRpbmRleDsgaSsrLCBqKyspIHsKKwkJZHRHZXRLZXkocCwgaSwgJmtleSwgSkZTX1NCSShpcC0+aV9zYiktPm1udGZsYWcpOworCQlrZXkubmFtZVtrZXkubmFtbGVuXSA9ICdcMCc7CisJCWlmIChwLT5oZWFkZXIuZmxhZyAmIEJUX0xFQUYpIHsKKwkJCWxoID0gKHN0cnVjdCBsZHRlbnRyeSAqKSAmIHAtPnNsb3Rbc3RibFtpXV07CisJCQlwcmludGYoIlx0WyVkXSAlczolZCIsIGksIGtleS5uYW1lLAorCQkJICAgICAgIGxlMzJfdG9fY3B1KGxoLT5pbnVtYmVyKSk7CisJCX0gZWxzZSB7CisJCQlpaCA9IChzdHJ1Y3QgaWR0ZW50cnkgKikgJiBwLT5zbG90W3N0YmxbaV1dOworCQkJeGQgPSAocHhkX3QgKikgaWg7CisJCQlibiA9IGFkZHJlc3NQWEQoeGQpOworCQkJcHJpbnRmKCJcdFslZF0gJXM6MHglTHgiLCBpLCBrZXkubmFtZSwgYm4pOworCQl9CisKKwkJaWYgKGogPT0gNCkgeworCQkJcHJpbnRmKCJcbiIpOworCQkJaiA9IDA7CisJCX0KKwl9CisKKwlwcmludGYoIlxuIik7CisKKwlpZiAoZnJlZXBhZ2UpCisJCURUX1BVVFBBR0UobXApOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYJCQkJLyogX0pGU19ERUJVR19EVFJFRSAqLwpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19kdHJlZS5oIGIvZnMvamZzL2pmc19kdHJlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3M2E4MDEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZnMvamZzX2R0cmVlLmgKQEAgLTAsMCArMSwyNzkgQEAKKy8qCisgKiAgIENvcHlyaWdodCAoYykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwMC0yMDAyCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpZm5kZWYgX0hfSkZTX0RUUkVFCisjZGVmaW5lCV9IX0pGU19EVFJFRQorCisvKgorICoJamZzX2R0cmVlLmg6IGRpcmVjdG9yeSBCKy10cmVlIG1hbmFnZXIKKyAqLworCisjaW5jbHVkZSAiamZzX2J0cmVlLmgiCisKK3R5cGVkZWYgdW5pb24geworCXN0cnVjdCB7CisJCXRpZF90IHRpZDsKKwkJc3RydWN0IGlub2RlICppcDsKKwkJdTMyIGlubzsKKwl9IGxlYWY7CisJcHhkX3QgeGQ7Cit9IGRkYXRhX3Q7CisKKworLyoKKyAqICAgICAgZW50cnkgc2VnbWVudC9zbG90CisgKgorICogYW4gZW50cnkgY29uc2lzdHMgb2YgdHlwZSBkZXBlbmRlbnQgaGVhZC9vbmx5IHNlZ21lbnQvc2xvdCBhbmQKKyAqIGFkZGl0aW9uYWwgc2VnbWVudHMvc2xvdHMgbGlua2VkIHZpIG5leHQgZmllbGQ7CisgKiBOLkIuIGxhc3Qvb25seSBzZWdtZW50IG9mIGVudHJ5IGlzIHRlcm1pbmF0ZWQgYnkgbmV4dCA9IC0xOworICovCisvKgorICoJZGlyZWN0b3J5IHBhZ2Ugc2xvdAorICovCitzdHJ1Y3QgZHRzbG90IHsKKwlzOCBuZXh0OwkJLyogMTogKi8KKwlzOCBjbnQ7CQkJLyogMTogKi8KKwlfX2xlMTYgbmFtZVsxNV07CS8qIDMwOiAqLworfTsJCQkJLyogKDMyKSAqLworCisKKyNkZWZpbmUgREFUQVNMT1RTSVpFCTE2CisjZGVmaW5lIEwyREFUQVNMT1RTSVpFCTQKKyNkZWZpbmUJRFRTTE9UU0laRQkzMgorI2RlZmluZQlMMkRUU0xPVFNJWkUJNQorI2RlZmluZSBEVFNMT1RIRFJTSVpFCTIKKyNkZWZpbmUgRFRTTE9UREFUQVNJWkUJMzAKKyNkZWZpbmUgRFRTTE9UREFUQUxFTgkxNQorCisvKgorICoJIGludGVybmFsIG5vZGUgZW50cnkgaGVhZC9vbmx5IHNlZ21lbnQKKyAqLworc3RydWN0IGlkdGVudHJ5IHsKKwlweGRfdCB4ZDsJCS8qIDg6IGNoaWxkIGV4dGVudCBkZXNjcmlwdG9yICovCisKKwlzOCBuZXh0OwkJLyogMTogKi8KKwl1OCBuYW1sZW47CQkvKiAxOiAqLworCV9fbGUxNiBuYW1lWzExXTsJLyogMjI6IDItYnl0ZSBhbGlnbmVkICovCit9OwkJCQkvKiAoMzIpICovCisKKyNkZWZpbmUgRFRJSERSU0laRQkxMAorI2RlZmluZSBEVElIRFJEQVRBTEVOCTExCisKKy8qIGNvbXB1dGUgbnVtYmVyIG9mIHNsb3RzIGZvciBlbnRyeSAqLworI2RlZmluZQlORFRJTlRFUk5BTChrbGVuKSAoICgoNCArIChrbGVuKSkgKyAoMTUgLSAxKSkgLyAxNSApCisKKworLyoKKyAqCWxlYWYgbm9kZSBlbnRyeSBoZWFkL29ubHkgc2VnbWVudAorICoKKyAqIAlGb3IgbGVnYWN5IGZpbGVzeXN0ZW1zLCBuYW1lIGNvbnRhaW5zIDEzIHdjaGFycyAtLSBubyBpbmRleCBmaWVsZAorICovCitzdHJ1Y3QgbGR0ZW50cnkgeworCV9fbGUzMiBpbnVtYmVyOwkJLyogNDogNC1ieXRlIGFsaWduZWQgKi8KKwlzOCBuZXh0OwkJLyogMTogKi8KKwl1OCBuYW1sZW47CQkvKiAxOiAqLworCV9fbGUxNiBuYW1lWzExXTsJLyogMjI6IDItYnl0ZSBhbGlnbmVkICovCisJX19sZTMyIGluZGV4OwkJLyogNDogaW5kZXggaW50byBkaXJfdGFibGUgKi8KK307CQkJCS8qICgzMikgKi8KKworI2RlZmluZSBEVExIRFJTSVpFCTYKKyNkZWZpbmUgRFRMSERSREFUQUxFTl9MRUdBQ1kJMTMJLyogT2xkIChPUy8yKSBmb3JtYXQgKi8KKyNkZWZpbmUgRFRMSERSREFUQUxFTgkxMQorCisvKgorICogZGlyX3RhYmxlIHVzZWQgZm9yIGRpcmVjdG9yeSB0cmF2ZXJzYWwgZHVyaW5nIHJlYWRkaXIKKyAqLworCisvKgorICogS2VlcCBwZXJzaXN0ZW50IGluZGV4IGZvciBkaXJlY3RvcnkgZW50cmllcworICovCisjZGVmaW5lIERPX0lOREVYKElOT0RFKSAoSkZTX1NCSSgoSU5PREUpLT5pX3NiKS0+bW50ZmxhZyAmIEpGU19ESVJfSU5ERVgpCisKKy8qCisgKiBNYXhpbXVtIGVudHJ5IGluIGlubGluZSBkaXJlY3RvcnkgdGFibGUKKyAqLworI2RlZmluZSBNQVhfSU5MSU5FX0RJUlRBQkxFX0VOVFJZIDEzCisKK3N0cnVjdCBkaXJfdGFibGVfc2xvdCB7CisJdTggcnNydmQ7CQkvKiAxOiAqLworCXU4IGZsYWc7CQkvKiAxOiAwIGlmIGZyZWUgKi8KKwl1OCBzbG90OwkJLyogMTogc2xvdCB3aXRoaW4gbGVhZiBwYWdlIG9mIGVudHJ5ICovCisJdTggYWRkcjE7CQkvKiAxOiB1cHBlciA4IGJpdHMgb2YgbGVhZiBwYWdlIGFkZHJlc3MgKi8KKwlfX2xlMzIgYWRkcjI7CQkvKiA0OiBsb3dlciAzMiBiaXRzIG9mIGxlYWYgcGFnZSBhZGRyZXNzIC1PUi0KKwkJCQkgICBpbmRleCBvZiBuZXh0IGVudHJ5IHdoZW4gdGhpcyBlbnRyeSB3YXMgZGVsZXRlZCAqLworfTsJCQkJLyogKDgpICovCisKKy8qCisgKiBmbGFnIHZhbHVlcworICovCisjZGVmaW5lIERJUl9JTkRFWF9WQUxJRCAxCisjZGVmaW5lIERJUl9JTkRFWF9GUkVFIDAKKworI2RlZmluZSBEVFNhZGRyZXNzKGRpcl90YWJsZV9zbG90LCBhZGRyZXNzNjQpXAore1wKKwkoZGlyX3RhYmxlX3Nsb3QpLT5hZGRyMSA9ICgodTY0KWFkZHJlc3M2NCkgPj4gMzI7XAorCShkaXJfdGFibGVfc2xvdCktPmFkZHIyID0gX19jcHVfdG9fbGUzMigoYWRkcmVzczY0KSAmIDB4ZmZmZmZmZmYpO1wKK30KKworI2RlZmluZSBhZGRyZXNzRFRTKGR0cylcCisJKCAoKHM2NCkoKGR0cyktPmFkZHIxKSkgPDwgMzIgfCBfX2xlMzJfdG9fY3B1KChkdHMpLT5hZGRyMikgKQorCisvKiBjb21wdXRlIG51bWJlciBvZiBzbG90cyBmb3IgZW50cnkgKi8KKyNkZWZpbmUJTkRUTEVBRl9MRUdBQ1koa2xlbikJKCAoKDIgKyAoa2xlbikpICsgKDE1IC0gMSkpIC8gMTUgKQorI2RlZmluZQlORFRMRUFGCU5EVElOVEVSTkFMCisKKworLyoKKyAqCWRpcmVjdG9yeSByb290IHBhZ2UgKGluLWxpbmUgaW4gb24tZGlzayBpbm9kZSk6CisgKgorICogY2YuIGR0cGFnZV90IGJlbG93LgorICovCit0eXBlZGVmIHVuaW9uIHsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgZGFzZCBEQVNEOyAvKiAxNjogREFTRCBsaW1pdC91c2FnZSBpbmZvICovCisKKwkJdTggZmxhZzsJLyogMTogKi8KKwkJdTggbmV4dGluZGV4OwkvKiAxOiBuZXh0IGZyZWUgZW50cnkgaW4gc3RibCAqLworCQlzOCBmcmVlY250OwkvKiAxOiBmcmVlIGNvdW50ICovCisJCXM4IGZyZWVsaXN0OwkvKiAxOiBmcmVlbGlzdCBoZWFkZXIgKi8KKworCQlfX2xlMzIgaWRvdGRvdDsJLyogNDogcGFyZW50IGlub2RlIG51bWJlciAqLworCisJCXM4IHN0YmxbOF07CS8qIDg6IHNvcnRlZCBlbnRyeSBpbmRleCB0YWJsZSAqLworCX0gaGVhZGVyOwkJLyogKDMyKSAqLworCisJc3RydWN0IGR0c2xvdCBzbG90WzldOworfSBkdHJvb3RfdDsKKworI2RlZmluZSBQQVJFTlQoSVApIFwKKwkobGUzMl90b19jcHUoSkZTX0lQKElQKS0+aV9kdHJvb3QuaGVhZGVyLmlkb3Rkb3QpKQorCisjZGVmaW5lIERUUk9PVE1BWFNMT1QJOQorCisjZGVmaW5lCWR0RW1wdHkoSVApIChKRlNfSVAoSVApLT5pX2R0cm9vdC5oZWFkZXIubmV4dGluZGV4ID09IDApCisKKworLyoKKyAqCWRpcmVjdG9yeSByZWd1bGFyIHBhZ2U6CisgKgorICoJZW50cnkgc2xvdCBhcnJheSBvZiAzMiBieXRlIHNsb3QKKyAqCisgKiBzb3J0ZWQgZW50cnkgc2xvdCBpbmRleCB0YWJsZSAoc3RibCk6CisgKiBjb250aWd1b3VzIHNsb3RzIGF0IHNsb3Qgc3BlY2lmaWVkIGJ5IHN0YmxpbmRleCwKKyAqIDEtYnl0ZSBwZXIgZW50cnkKKyAqICAgNTEyIGJ5dGUgYmxvY2s6ICAxNiBlbnRyeSB0YmwgKDEgc2xvdCkKKyAqICAxMDI0IGJ5dGUgYmxvY2s6ICAzMiBlbnRyeSB0YmwgKDEgc2xvdCkKKyAqICAyMDQ4IGJ5dGUgYmxvY2s6ICA2NCBlbnRyeSB0YmwgKDIgc2xvdCkKKyAqICA0MDk2IGJ5dGUgYmxvY2s6IDEyOCBlbnRyeSB0YmwgKDQgc2xvdCkKKyAqCisgKiBkYXRhIGFyZWE6CisgKiAgIDUxMiBieXRlIGJsb2NrOiAgMTYgLSAyID0gIDE0IHNsb3QKKyAqICAxMDI0IGJ5dGUgYmxvY2s6ICAzMiAtIDIgPSAgMzAgc2xvdAorICogIDIwNDggYnl0ZSBibG9jazogIDY0IC0gMyA9ICA2MSBzbG90CisgKiAgNDA5NiBieXRlIGJsb2NrOiAxMjggLSA1ID0gMTIzIHNsb3QKKyAqCisgKiBOLkIuIGluZGV4IGlzIDAtYmFzZWQ7IGluZGV4IGZpZWxkcyByZWZlciB0byBzbG90IGluZGV4CisgKiBleGNlcHQgbmV4dGluZGV4IHdoaWNoIHJlZmVycyB0byBlbnRyeSBpbmRleCBpbiBzdGJsOworICogZW5kIG9mIGVudHJ5IHN0b3QgbGlzdCBvciBmcmVlbGlzdCBpcyBtYXJrZWQgd2l0aCAtMS4KKyAqLwordHlwZWRlZiB1bmlvbiB7CisJc3RydWN0IHsKKwkJX19sZTY0IG5leHQ7CS8qIDg6IG5leHQgc2libGluZyAqLworCQlfX2xlNjQgcHJldjsJLyogODogcHJldmlvdXMgc2libGluZyAqLworCisJCXU4IGZsYWc7CS8qIDE6ICovCisJCXU4IG5leHRpbmRleDsJLyogMTogbmV4dCBlbnRyeSBpbmRleCBpbiBzdGJsICovCisJCXM4IGZyZWVjbnQ7CS8qIDE6ICovCisJCXM4IGZyZWVsaXN0OwkvKiAxOiBzbG90IGluZGV4IG9mIGhlYWQgb2YgZnJlZWxpc3QgKi8KKworCQl1OCBtYXhzbG90OwkvKiAxOiBudW1iZXIgb2Ygc2xvdHMgaW4gcGFnZSBzbG90W10gKi8KKwkJdTggc3RibGluZGV4OwkvKiAxOiBzbG90IGluZGV4IG9mIHN0YXJ0IG9mIHN0YmwgKi8KKwkJdTggcnNydmRbMl07CS8qIDI6ICovCisKKwkJcHhkX3Qgc2VsZjsJLyogODogc2VsZiBweGQgKi8KKwl9IGhlYWRlcjsJCS8qICgzMikgKi8KKworCXN0cnVjdCBkdHNsb3Qgc2xvdFsxMjhdOworfSBkdHBhZ2VfdDsKKworI2RlZmluZSBEVFBBR0VNQVhTTE9UICAgICAgICAxMjgKKworI2RlZmluZSBEVDhUSFBHTk9ERUJZVEVTICAgICA1MTIKKyNkZWZpbmUgRFQ4VEhQR05PREVUU0xPVFMgICAgICAxCisjZGVmaW5lIERUOFRIUEdOT0RFU0xPVFMgICAgICAxNgorCisjZGVmaW5lIERUUVRSUEdOT0RFQllURVMgICAgMTAyNAorI2RlZmluZSBEVFFUUlBHTk9ERVRTTE9UUyAgICAgIDEKKyNkZWZpbmUgRFRRVFJQR05PREVTTE9UUyAgICAgIDMyCisKKyNkZWZpbmUgRFRIQUxGUEdOT0RFQllURVMgICAyMDQ4CisjZGVmaW5lIERUSEFMRlBHTk9ERVRTTE9UUyAgICAgMgorI2RlZmluZSBEVEhBTEZQR05PREVTTE9UUyAgICAgNjQKKworI2RlZmluZSBEVEZVTExQR05PREVCWVRFUyAgIDQwOTYKKyNkZWZpbmUgRFRGVUxMUEdOT0RFVFNMT1RTICAgICA0CisjZGVmaW5lIERURlVMTFBHTk9ERVNMT1RTICAgIDEyOAorCisjZGVmaW5lIERURU5UUllTVEFSVAkxCisKKy8qIGdldCBzb3J0ZWQgZW50cnkgdGFibGUgb2YgdGhlIHBhZ2UgKi8KKyNkZWZpbmUgRFRfR0VUU1RCTChwKSAoICgocCktPmhlYWRlci5mbGFnICYgQlRfUk9PVCkgP1wKKwkoKGR0cm9vdF90ICopKHApKS0+aGVhZGVyLnN0YmwgOiBcCisJKHM4ICopJihwKS0+c2xvdFsocCktPmhlYWRlci5zdGJsaW5kZXhdICkKKworLyoKKyAqIEZsYWdzIGZvciBkdFNlYXJjaAorICovCisjZGVmaW5lIEpGU19DUkVBVEUgMQorI2RlZmluZSBKRlNfTE9PS1VQIDIKKyNkZWZpbmUgSkZTX1JFTU9WRSAzCisjZGVmaW5lIEpGU19SRU5BTUUgNAorCisjZGVmaW5lIERJUkVOVFNJWihuYW1sZW4pIFwKKyAgICAoIChzaXplb2Yoc3RydWN0IGRpcmVudCkgLSAyKihKRlNfTkFNRV9NQVgrMSkgKyAyKigobmFtbGVuKSsxKSArIDMpICZ+IDMgKQorCisvKgorICogTWF4aW11bSBmaWxlIG9mZnNldCBmb3IgZGlyZWN0b3JpZXMuCisgKi8KKyNkZWZpbmUgRElSRU5ECUlOVF9NQVgKKworLyoKKyAqCWV4dGVybmFsIGRlY2xhcmF0aW9ucworICovCitleHRlcm4gdm9pZCBkdEluaXRSb290KHRpZF90IHRpZCwgc3RydWN0IGlub2RlICppcCwgdTMyIGlkb3Rkb3QpOworCitleHRlcm4gaW50IGR0U2VhcmNoKHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBjb21wb25lbnRfbmFtZSAqIGtleSwKKwkJICAgIGlub190ICogZGF0YSwgc3RydWN0IGJ0c3RhY2sgKiBidHN0YWNrLCBpbnQgZmxhZyk7CisKK2V4dGVybiBpbnQgZHRJbnNlcnQodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgY29tcG9uZW50X25hbWUgKiBrZXksCisJCSAgICBpbm9fdCAqIGlubywgc3RydWN0IGJ0c3RhY2sgKiBidHN0YWNrKTsKKworZXh0ZXJuIGludCBkdERlbGV0ZSh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBjb21wb25lbnRfbmFtZSAqIGtleSwKKwkJICAgIGlub190ICogZGF0YSwgaW50IGZsYWcpOworCitleHRlcm4gaW50IGR0TW9kaWZ5KHRpZF90IHRpZCwgc3RydWN0IGlub2RlICppcCwgc3RydWN0IGNvbXBvbmVudF9uYW1lICoga2V5LAorCQkgICAgaW5vX3QgKiBvcmlnX2lubywgaW5vX3QgbmV3X2lubywgaW50IGZsYWcpOworCitleHRlcm4gaW50IGpmc19yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKTsKKworI2lmZGVmICBfSkZTX0RFQlVHX0RUUkVFCitleHRlcm4gaW50IGR0RGlzcGxheVRyZWUoc3RydWN0IGlub2RlICppcCk7CisKK2V4dGVybiBpbnQgZHREaXNwbGF5UGFnZShzdHJ1Y3QgaW5vZGUgKmlwLCBzNjQgYm4sIGR0cGFnZV90ICogcCk7CisjZW5kaWYJCQkJLyogX0pGU19ERUJVR19EVFJFRSAqLworCisjZW5kaWYJCQkJLyogIV9IX0pGU19EVFJFRSAqLwpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19leHRlbnQuYyBiL2ZzL2pmcy9qZnNfZXh0ZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk1M2FjYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmcy9qZnNfZXh0ZW50LmMKQEAgLTAsMCArMSw2NjggQEAKKy8qCisgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwMC0yMDA0CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlICJqZnNfaW5jb3JlLmgiCisjaW5jbHVkZSAiamZzX3N1cGVyYmxvY2suaCIKKyNpbmNsdWRlICJqZnNfZG1hcC5oIgorI2luY2x1ZGUgImpmc19leHRlbnQuaCIKKyNpbmNsdWRlICJqZnNfZGVidWcuaCIKKworLyoKKyAqIGZvcndhcmQgcmVmZXJlbmNlcworICovCitzdGF0aWMgaW50IGV4dEJhbGxvYyhzdHJ1Y3QgaW5vZGUgKiwgczY0LCBzNjQgKiwgczY0ICopOworI2lmZGVmIF9OT1RZRVQKK3N0YXRpYyBpbnQgZXh0QnJlYWxsb2Moc3RydWN0IGlub2RlICosIHM2NCwgczY0LCBzNjQgKiwgczY0ICopOworI2VuZGlmCitzdGF0aWMgczY0IGV4dFJvdW5kRG93bihzNjQgbmIpOworCisvKgorICogZXh0ZXJuYWwgcmVmZXJlbmNlcworICovCitleHRlcm4gaW50IGpmc19jb21taXRfaW5vZGUoc3RydWN0IGlub2RlICosIGludCk7CisKKworI2RlZmluZSBEUEQoYSkgICAgICAgICAgKHByaW50aygiKGEpOiAlZFxuIiwoYSkpKQorI2RlZmluZSBEUEMoYSkgICAgICAgICAgKHByaW50aygiKGEpOiAlY1xuIiwoYSkpKQorI2RlZmluZSBEUEwxKGEpCQkJCQlcCit7CQkJCQkJXAorCWlmICgoYSkgPj4gMzIpCQkJCVwKKwkJcHJpbnRrKCIoYSk6ICV4JTA4eCAgIiwoYSkpOwlcCisJZWxzZQkJCQkJXAorCQlwcmludGsoIihhKTogJXggICIsKGEpIDw8IDMyKTsJXAorfQorI2RlZmluZSBEUEwoYSkJCQkJCVwKK3sJCQkJCQlcCisJaWYgKChhKSA+PiAzMikJCQkJXAorCQlwcmludGsoIihhKTogJXglMDh4XG4iLChhKSk7CVwKKwllbHNlCQkJCQlcCisJCXByaW50aygiKGEpOiAleFxuIiwoYSkgPDwgMzIpOwlcCit9CisKKyNkZWZpbmUgRFBEMShhKSAgICAgICAgIChwcmludGsoIihhKTogJWQgICIsKGEpKSkKKyNkZWZpbmUgRFBYKGEpICAgICAgICAgIChwcmludGsoIihhKTogJTA4eFxuIiwoYSkpKQorI2RlZmluZSBEUFgxKGEpICAgICAgICAgKHByaW50aygiKGEpOiAlMDh4ICAiLChhKSkpCisjZGVmaW5lIERQUyhhKSAgICAgICAgICAocHJpbnRrKCIlc1xuIiwoYSkpKQorI2RlZmluZSBEUEUoYSkgICAgICAgICAgKHByaW50aygiXG5FTlRFUklORzogJXNcbiIsKGEpKSkKKyNkZWZpbmUgRFBFMShhKSAgICAgICAgICAocHJpbnRrKCJcbkVOVEVSSU5HOiAlcyIsKGEpKSkKKyNkZWZpbmUgRFBTMShhKSAgICAgICAgIChwcmludGsoIiAgJXMgICIsKGEpKSkKKworCisvKgorICogTkFNRToJZXh0QWxsb2MoKQorICoKKyAqIEZVTkNUSU9OOiAgICBhbGxvY2F0ZSBhbiBleHRlbnQgZm9yIGEgc3BlY2lmaWVkIHBhZ2UgcmFuZ2Ugd2l0aGluIGEKKyAqCQlmaWxlLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKglpcAktIHRoZSBpbm9kZSBvZiB0aGUgZmlsZS4KKyAqCXhsZW4JLSByZXF1ZXN0ZWQgZXh0ZW50IGxlbmd0aC4KKyAqCXBubwktIHRoZSBzdGFydGluZyBwYWdlIG51bWJlciB3aXRoIHRoZSBmaWxlLgorICoJeHAJLSBwb2ludGVyIHRvIGFuIHhhZC4gIG9uIGVudHJ5LCB4YWQgZGVzY3JpYmVzIGFuCisgKgkJICBleHRlbnQgdGhhdCBpcyB1c2VkIGFzIGFuIGFsbG9jYXRpb24gaGludCBpZiB0aGUKKyAqCQkgIHhhZGRyIG9mIHRoZSB4YWQgaXMgbm9uLXplcm8uICBvbiBzdWNjZXNzZnVsIGV4aXQsCisgKgkJICB0aGUgeGFkIGRlc2NyaWJlcyB0aGUgbmV3bHkgYWxsb2NhdGVkIGV4dGVudC4KKyAqCWFibnIJLSBib29sZWFuX3QgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBuZXdseSBhbGxvY2F0ZWQgZXh0ZW50CisgKgkJICBzaG91bGQgYmUgbWFya2VkIGFzIGFsbG9jYXRlZCBidXQgbm90IHJlY29yZGVkLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIDAgICAgICAgLSBzdWNjZXNzCisgKiAgICAgIC1FSU8JLSBpL28gZXJyb3IuCisgKiAgICAgIC1FTk9TUEMJLSBpbnN1ZmZpY2llbnQgZGlzayByZXNvdXJjZXMuCisgKi8KK2ludAorZXh0QWxsb2Moc3RydWN0IGlub2RlICppcCwgczY0IHhsZW4sIHM2NCBwbm8sIHhhZF90ICogeHAsIGJvb2xlYW5fdCBhYm5yKQoreworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpID0gSkZTX1NCSShpcC0+aV9zYik7CisJczY0IG54bGVuLCBueGFkZHIsIHhvZmYsIGhpbnQsIHhhZGRyID0gMDsKKwlpbnQgcmM7CisJaW50IHhmbGFnOworCisJLyogVGhpcyBibG9ja3MgaWYgd2UgYXJlIGxvdyBvbiByZXNvdXJjZXMgKi8KKwl0eEJlZ2luQW5vbihpcC0+aV9zYik7CisKKwkvKiBBdm9pZCByYWNlIHdpdGggamZzX2NvbW1pdF9pbm9kZSgpICovCisJZG93bigmSkZTX0lQKGlwKS0+Y29tbWl0X3NlbSk7CisKKwkvKiB2YWxpZGF0ZSBleHRlbnQgbGVuZ3RoICovCisJaWYgKHhsZW4gPiBNQVhYTEVOKQorCQl4bGVuID0gTUFYWExFTjsKKworCS8qIGdldCB0aGUgcGFnZSdzIHN0YXJ0aW5nIGV4dGVudCBvZmZzZXQgKi8KKwl4b2ZmID0gcG5vIDw8IHNiaS0+bDJuYnBlcnBhZ2U7CisKKwkvKiBjaGVjayBpZiBhbiBhbGxvY2F0aW9uIGhpbnQgd2FzIHByb3ZpZGVkICovCisJaWYgKChoaW50ID0gYWRkcmVzc1hBRCh4cCkpKSB7CisJCS8qIGdldCB0aGUgc2l6ZSBvZiB0aGUgZXh0ZW50IGRlc2NyaWJlZCBieSB0aGUgaGludCAqLworCQlueGxlbiA9IGxlbmd0aFhBRCh4cCk7CisKKwkJLyogY2hlY2sgaWYgdGhlIGhpbnQgaXMgZm9yIHRoZSBwb3J0aW9uIG9mIHRoZSBmaWxlCisJCSAqIGltbWVkaWF0ZWx5IHByZXZpb3VzIHRvIHRoZSBjdXJyZW50IGFsbG9jYXRpb24KKwkJICogcmVxdWVzdCBhbmQgaWYgaGludCBleHRlbnQgaGFzIHRoZSBzYW1lIGFibnIKKwkJICogdmFsdWUgYXMgdGhlIGN1cnJlbnQgcmVxdWVzdC4gIGlmIHNvLCB3ZSBjYW4KKwkJICogZXh0ZW5kIHRoZSBoaW50IGV4dGVudCB0byBpbmNsdWRlIHRoZSBjdXJyZW50CisJCSAqIGV4dGVudCBpZiB3ZSBjYW4gYWxsb2NhdGUgdGhlIGJsb2NrcyBpbW1lZGlhdGVseQorCQkgKiBmb2xsb3dpbmcgdGhlIGhpbnQgZXh0ZW50LgorCQkgKi8KKwkJaWYgKG9mZnNldFhBRCh4cCkgKyBueGxlbiA9PSB4b2ZmICYmCisJCSAgICBhYm5yID09ICgoeHAtPmZsYWcgJiBYQURfTk9UUkVDT1JERUQpID8gVFJVRSA6IEZBTFNFKSkKKwkJCXhhZGRyID0gaGludCArIG54bGVuOworCisJCS8qIGFkanVzdCB0aGUgaGludCB0byB0aGUgbGFzdCBibG9jayBvZiB0aGUgZXh0ZW50ICovCisJCWhpbnQgKz0gKG54bGVuIC0gMSk7CisJfQorCisJLyogYWxsb2NhdGUgdGhlIGRpc2sgYmxvY2tzIGZvciB0aGUgZXh0ZW50LiAgaW5pdGlhbGx5LCBleHRCYWxsb2MoKQorCSAqIHdpbGwgdHJ5IHRvIGFsbG9jYXRlIGRpc2sgYmxvY2tzIGZvciB0aGUgcmVxdWVzdGVkIHNpemUgKHhsZW4pLiAKKwkgKiBpZiB0aGlzIGZhaWxzICh4bGVuIGNvbnRpZ2lvdXMgZnJlZSBibG9ja3Mgbm90IGF2YWxpYWJsZSksIGl0J2xsCisJICogdHJ5IHRvIGFsbG9jYXRlIGEgc21hbGxlciBudW1iZXIgb2YgYmxvY2tzIChwcm9kdWNpbmcgYSBzbWFsbGVyCisJICogZXh0ZW50KSwgd2l0aCB0aGlzIHNtYWxsZXIgbnVtYmVyIG9mIGJsb2NrcyBjb25zaXN0aW5nIG9mIHRoZQorCSAqIHJlcXVlc3RlZCBudW1iZXIgb2YgYmxvY2tzIHJvdW5kZWQgZG93biB0byB0aGUgbmV4dCBzbWFsbGVyCisJICogcG93ZXIgb2YgMiBudW1iZXIgKGkuZS4gMTYgLT4gOCkuICBpdCdsbCBjb250aW51ZSB0byByb3VuZCBkb3duCisJICogYW5kIHJldHJ5IHRoZSBhbGxvY2F0aW9uIHVudGlsIHRoZSBudW1iZXIgb2YgYmxvY2tzIHRvIGFsbG9jYXRlCisJICogaXMgc21hbGxlciB0aGFuIHRoZSBudW1iZXIgb2YgYmxvY2tzIHBlciBwYWdlLgorCSAqLworCW54bGVuID0geGxlbjsKKwlpZiAoKHJjID0gZXh0QmFsbG9jKGlwLCBoaW50ID8gaGludCA6IElOT0hJTlQoaXApLCAmbnhsZW4sICZueGFkZHIpKSkgeworCQl1cCgmSkZTX0lQKGlwKS0+Y29tbWl0X3NlbSk7CisJCXJldHVybiAocmMpOworCX0KKworCS8qIEFsbG9jYXRlIGJsb2NrcyB0byBxdW90YS4gKi8KKwlpZiAoRFFVT1RfQUxMT0NfQkxPQ0soaXAsIG54bGVuKSkgeworCQlkYkZyZWUoaXAsIG54YWRkciwgKHM2NCkgbnhsZW4pOworCQl1cCgmSkZTX0lQKGlwKS0+Y29tbWl0X3NlbSk7CisJCXJldHVybiAtRURRVU9UOworCX0KKworCS8qIGRldGVybWluZSB0aGUgdmFsdWUgb2YgdGhlIGV4dGVudCBmbGFnICovCisJeGZsYWcgPSAoYWJuciA9PSBUUlVFKSA/IFhBRF9OT1RSRUNPUkRFRCA6IDA7CisKKwkvKiBpZiB3ZSBjYW4gZXh0ZW5kIHRoZSBoaW50IGV4dGVudCB0byBjb3ZlciB0aGUgY3VycmVudCByZXF1ZXN0LCAKKwkgKiBleHRlbmQgaXQuICBvdGhlcndpc2UsIGluc2VydCBhIG5ldyBleHRlbnQgdG8KKwkgKiBjb3ZlciB0aGUgY3VycmVudCByZXF1ZXN0LgorCSAqLworCWlmICh4YWRkciAmJiB4YWRkciA9PSBueGFkZHIpCisJCXJjID0geHRFeHRlbmQoMCwgaXAsIHhvZmYsIChpbnQpIG54bGVuLCAwKTsKKwllbHNlCisJCXJjID0geHRJbnNlcnQoMCwgaXAsIHhmbGFnLCB4b2ZmLCAoaW50KSBueGxlbiwgJm54YWRkciwgMCk7CisKKwkvKiBpZiB0aGUgZXh0ZW5kIG9yIGluc2VydCBmYWlsZWQsIAorCSAqIGZyZWUgdGhlIG5ld2x5IGFsbG9jYXRlZCBibG9ja3MgYW5kIHJldHVybiB0aGUgZXJyb3IuCisJICovCisJaWYgKHJjKSB7CisJCWRiRnJlZShpcCwgbnhhZGRyLCBueGxlbik7CisJCURRVU9UX0ZSRUVfQkxPQ0soaXAsIG54bGVuKTsKKwkJdXAoJkpGU19JUChpcCktPmNvbW1pdF9zZW0pOworCQlyZXR1cm4gKHJjKTsKKwl9CisKKwkvKiBzZXQgdGhlIHJlc3VsdHMgb2YgdGhlIGV4dGVudCBhbGxvY2F0aW9uICovCisJWEFEYWRkcmVzcyh4cCwgbnhhZGRyKTsKKwlYQURsZW5ndGgoeHAsIG54bGVuKTsKKwlYQURvZmZzZXQoeHAsIHhvZmYpOworCXhwLT5mbGFnID0geGZsYWc7CisKKwltYXJrX2lub2RlX2RpcnR5KGlwKTsKKworCXVwKCZKRlNfSVAoaXApLT5jb21taXRfc2VtKTsKKwkvKgorCSAqIENPTU1JVF9TeW5jTGlzdCBmbGFncyBhbiBhbm9ueW1vdXMgdGxvY2sgb24gcGFnZSB0aGF0IGlzIG9uCisJICogc3luYyBsaXN0LgorCSAqIFdlIG5lZWQgdG8gY29tbWl0IHRoZSBpbm9kZSB0byBnZXQgdGhlIHBhZ2Ugd3JpdHRlbiBkaXNrLgorCSAqLworCWlmICh0ZXN0X2FuZF9jbGVhcl9jZmxhZyhDT01NSVRfU3luY2xpc3QsaXApKQorCQlqZnNfY29tbWl0X2lub2RlKGlwLCAwKTsKKworCXJldHVybiAoMCk7Cit9CisKKworI2lmZGVmIF9OT1RZRVQKKy8qCisgKiBOQU1FOiAgICAgICAgZXh0UmVhbGxvYygpCisgKgorICogRlVOQ1RJT046ICAgIGV4dGVuZCB0aGUgYWxsb2NhdGlvbiBvZiBhIGZpbGUgZXh0ZW50IGNvbnRhaW5pbmcgYQorICoJCXBhcnRpYWwgYmFjayBsYXN0IHBhZ2UuCisgKgorICogUEFSQU1FVEVSUzoKKyAqCWlwCS0gdGhlIGlub2RlIG9mIHRoZSBmaWxlLgorICoJY3AJLSBjYnVmIGZvciB0aGUgcGFydGlhbCBiYWNrZWQgbGFzdCBwYWdlLgorICoJeGxlbgktIHJlcXVlc3Qgc2l6ZSBvZiB0aGUgcmVzdWx0aW5nIGV4dGVudC4KKyAqCXhwCS0gcG9pbnRlciB0byBhbiB4YWQuIG9uIHN1Y2Nlc3NmdWwgZXhpdCwgdGhlIHhhZAorICoJCSAgZGVzY3JpYmVzIHRoZSBuZXdseSBhbGxvY2F0ZWQgZXh0ZW50LgorICoJYWJucgktIGJvb2xlYW5fdCBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG5ld2x5IGFsbG9jYXRlZCBleHRlbnQKKyAqCQkgIHNob3VsZCBiZSBtYXJrZWQgYXMgYWxsb2NhdGVkIGJ1dCBub3QgcmVjb3JkZWQuCisgKgorICogUkVUVVJOIFZBTFVFUzoKKyAqICAgICAgMCAgICAgICAtIHN1Y2Nlc3MKKyAqICAgICAgLUVJTwktIGkvbyBlcnJvci4KKyAqICAgICAgLUVOT1NQQwktIGluc3VmZmljaWVudCBkaXNrIHJlc291cmNlcy4KKyAqLworaW50IGV4dFJlYWxsb2Moc3RydWN0IGlub2RlICppcCwgczY0IG54bGVuLCB4YWRfdCAqIHhwLCBib29sZWFuX3QgYWJucikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaXAtPmlfc2I7CisJczY0IHhhZGRyLCB4bGVuLCBueGFkZHIsIGRlbHRhLCB4b2ZmOworCXM2NCBudGFpbCwgbmV4dGVuZCwgbmluc2VydDsKKwlpbnQgcmMsIG5icGVycGFnZSA9IEpGU19TQkkoc2IpLT5uYnBlcnBhZ2U7CisJaW50IHhmbGFnOworCisJLyogVGhpcyBibG9ja3MgaWYgd2UgYXJlIGxvdyBvbiByZXNvdXJjZXMgKi8KKwl0eEJlZ2luQW5vbihpcC0+aV9zYik7CisKKwlkb3duKCZKRlNfSVAoaXApLT5jb21taXRfc2VtKTsKKwkvKiB2YWxpZGF0ZSBleHRlbnQgbGVuZ3RoICovCisJaWYgKG54bGVuID4gTUFYWExFTikKKwkJbnhsZW4gPSBNQVhYTEVOOworCisJLyogZ2V0IHRoZSBleHRlbmQgKHBhcnRpYWwpIHBhZ2UncyBkaXNrIGJsb2NrIGFkZHJlc3MgYW5kCisJICogbnVtYmVyIG9mIGJsb2Nrcy4KKwkgKi8KKwl4YWRkciA9IGFkZHJlc3NYQUQoeHApOworCXhsZW4gPSBsZW5ndGhYQUQoeHApOworCXhvZmYgPSBvZmZzZXRYQUQoeHApOworCisJLyogaWYgdGhlIGV4dGVuZCBwYWdlIGlzIGFibnIgYW5kIGlmIHRoZSByZXF1ZXN0IGlzIGZvcgorCSAqIHRoZSBleHRlbnQgdG8gYmUgYWxsb2NhdGVkIGFuZCByZWNvcmRlZCwgCisJICogbWFrZSB0aGUgcGFnZSBhbGxvY2F0ZWQgYW5kIHJlY29yZGVkLgorCSAqLworCWlmICgoeHAtPmZsYWcgJiBYQURfTk9UUkVDT1JERUQpICYmICFhYm5yKSB7CisJCXhwLT5mbGFnID0gMDsKKwkJaWYgKChyYyA9IHh0VXBkYXRlKDAsIGlwLCB4cCkpKQorCQkJZ290byBleGl0OworCX0KKworCS8qIHRyeSB0byBhbGxvY2F0ZWQgdGhlIHJlcXVlc3QgbnVtYmVyIG9mIGJsb2NrcyBmb3IgdGhlCisJICogZXh0ZW50LiAgZGJSZWFsbG9jKCkgZmlyc3QgdHJpZXMgdG8gc2F0aXNmeSB0aGUgcmVxdWVzdAorCSAqIGJ5IGV4dGVuZGluZyB0aGUgYWxsb2NhdGlvbiBpbiBwbGFjZS4gb3RoZXJ3aXNlLCBpdCB3aWxsCisJICogdHJ5IHRvIGFsbG9jYXRlIGEgbmV3IHNldCBvZiBibG9ja3MgbGFyZ2UgZW5vdWdoIGZvciB0aGUKKwkgKiByZXF1ZXN0LiAgaW4gc2F0aXNmeWluZyBhIHJlcXVlc3QsIGRiUmVBbGxvYygpIG1heSBhbGxvY2F0ZQorCSAqIGxlc3MgdGhhbiB3aGF0IHdhcyByZXF1ZXN0IGJ1dCB3aWxsIGFsd2F5cyBhbGxvY2F0ZSBlbm91Z2gKKwkgKiBzcGFjZSBhcyB0byBzYXRpc2Z5IHRoZSBleHRlbmQgcGFnZS4KKwkgKi8KKwlpZiAoKHJjID0gZXh0QnJlYWxsb2MoaXAsIHhhZGRyLCB4bGVuLCAmbnhsZW4sICZueGFkZHIpKSkKKwkJZ290byBleGl0OworCisJLyogQWxsb2NhdCBibG9ja3MgdG8gcXVvdGEuICovCisJaWYgKERRVU9UX0FMTE9DX0JMT0NLKGlwLCBueGxlbikpIHsKKwkJZGJGcmVlKGlwLCBueGFkZHIsIChzNjQpIG54bGVuKTsKKwkJdXAoJkpGU19JUChpcCktPmNvbW1pdF9zZW0pOworCQlyZXR1cm4gLUVEUVVPVDsKKwl9CisKKwlkZWx0YSA9IG54bGVuIC0geGxlbjsKKworCS8qIGNoZWNrIGlmIHRoZSBleHRlbmQgcGFnZSBpcyBub3QgYWJuciBidXQgdGhlIHJlcXVlc3QgaXMgYWJucgorCSAqIGFuZCB0aGUgYWxsb2NhdGVkIGRpc2sgc3BhY2UgaXMgZm9yIG1vcmUgdGhhbiBvbmUgcGFnZS4gIGlmIHRoaXMKKwkgKiBpcyB0aGUgY2FzZSwgdGhlcmUgaXMgYSBtaXNzIG1hdGNoIG9mIGFibnIgYmV0d2VlbiB0aGUgZXh0ZW5kIHBhZ2UKKwkgKiBhbmQgdGhlIG9uZSBvciBtb3JlIHBhZ2VzIGZvbGxvd2luZyB0aGUgZXh0ZW5kIHBhZ2UuICBhcyBhIHJlc3VsdCwKKwkgKiB0d28gZXh0ZW50cyB3aWxsIGhhdmUgdG8gYmUgbWFuaXB1bGF0ZWQuIHRoZSBmaXJzdCB3aWxsIGJlIHRoYXQKKwkgKiBvZiB0aGUgZXh0ZW50IG9mIHRoZSBleHRlbmQgcGFnZSBhbmQgd2lsbCBiZSBtYW5pcHVsYXRlZCB0aHJ1CisJICogYW4geHRFeHRlbmQoKSBvciBhbiB4dFRhaWxnYXRlKCksIGRlcGVuZGluZyB1cG9uIHdoZXRoZXIgdGhlCisJICogZGlzayBhbGxvY2F0aW9uIG9jY3VycmVkIGFzIGFuIGlucGxhY2UgZXh0ZW5zaW9uLiAgdGhlIHNlY29uZAorCSAqIGV4dGVudCB3aWxsIGJlIG1hbmlwdWxhdGVkIChjcmVhdGVkKSB0aHJvdWdoIGFuIHh0SW5zZXJ0KCkgYW5kCisJICogd2lsbCBiZSBmb3IgdGhlIHBhZ2VzIGZvbGxvd2luZyB0aGUgZXh0ZW5kIHBhZ2UuCisJICovCisJaWYgKGFibnIgJiYgKCEoeHAtPmZsYWcgJiBYQURfTk9UUkVDT1JERUQpKSAmJiAobnhsZW4gPiBuYnBlcnBhZ2UpKSB7CisJCW50YWlsID0gbmJwZXJwYWdlOworCQluZXh0ZW5kID0gbnRhaWwgLSB4bGVuOworCQluaW5zZXJ0ID0gbnhsZW4gLSBuYnBlcnBhZ2U7CisKKwkJeGZsYWcgPSBYQURfTk9UUkVDT1JERUQ7CisJfSBlbHNlIHsKKwkJbnRhaWwgPSBueGxlbjsKKwkJbmV4dGVuZCA9IGRlbHRhOworCQluaW5zZXJ0ID0gMDsKKworCQl4ZmxhZyA9IHhwLT5mbGFnOworCX0KKworCS8qIGlmIHdlIHdlcmUgYWJsZSB0byBleHRlbmQgdGhlIGRpc2sgYWxsb2NhdGlvbiBpbiBwbGFjZSwKKwkgKiBleHRlbmQgdGhlIGV4dGVudC4gIG90aGVyd2lzZSwgbW92ZSB0aGUgZXh0ZW50IHRvIGEKKwkgKiBuZXcgZGlzayBsb2NhdGlvbi4KKwkgKi8KKwlpZiAoeGFkZHIgPT0gbnhhZGRyKSB7CisJCS8qIGV4dGVuZCB0aGUgZXh0ZW50ICovCisJCWlmICgocmMgPSB4dEV4dGVuZCgwLCBpcCwgeG9mZiArIHhsZW4sIChpbnQpIG5leHRlbmQsIDApKSkgeworCQkJZGJGcmVlKGlwLCB4YWRkciArIHhsZW4sIGRlbHRhKTsKKwkJCURRVU9UX0ZSRUVfQkxPQ0soaXAsIG54bGVuKTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIG1vdmUgdGhlIGV4dGVudCB0byBhIG5ldyBsb2NhdGlvbjoKKwkJICoKKwkJICogeHRUYWlsZ2F0ZSgpIGFjY291bnRzIGZvciByZWxvY2F0ZWQgdGFpbCBleHRlbnQ7CisJCSAqLworCQlpZiAoKHJjID0geHRUYWlsZ2F0ZSgwLCBpcCwgeG9mZiwgKGludCkgbnRhaWwsIG54YWRkciwgMCkpKSB7CisJCQlkYkZyZWUoaXAsIG54YWRkciwgbnhsZW4pOworCQkJRFFVT1RfRlJFRV9CTE9DSyhpcCwgbnhsZW4pOworCQkJZ290byBleGl0OworCQl9CisJfQorCisKKwkvKiBjaGVjayBpZiB3ZSBuZWVkIHRvIGFsc28gaW5zZXJ0IGEgbmV3IGV4dGVudCAqLworCWlmIChuaW5zZXJ0KSB7CisJCS8qIHBlcmZvcm0gdGhlIGluc2VydC4gIGlmIGl0IGZhaWxzLCBmcmVlIHRoZSBibG9ja3MKKwkJICogdG8gYmUgaW5zZXJ0ZWQgYW5kIG1ha2UgaXQgYXBwZWFyIHRoYXQgd2Ugb25seSBkaWQKKwkJICogdGhlIHh0RXh0ZW5kKCkgb3IgeHRUYWlsZ2F0ZSgpIGFib3ZlLgorCQkgKi8KKwkJeGFkZHIgPSBueGFkZHIgKyBudGFpbDsKKwkJaWYgKHh0SW5zZXJ0ICgwLCBpcCwgeGZsYWcsIHhvZmYgKyBudGFpbCwgKGludCkgbmluc2VydCwKKwkJCSAgICAgICZ4YWRkciwgMCkpIHsKKwkJCWRiRnJlZShpcCwgeGFkZHIsIChzNjQpIG5pbnNlcnQpOworCQkJZGVsdGEgPSBuZXh0ZW5kOworCQkJbnhsZW4gPSBudGFpbDsKKwkJCXhmbGFnID0gMDsKKwkJfQorCX0KKworCS8qIHNldCB0aGUgcmV0dXJuIHJlc3VsdHMgKi8KKwlYQURhZGRyZXNzKHhwLCBueGFkZHIpOworCVhBRGxlbmd0aCh4cCwgbnhsZW4pOworCVhBRG9mZnNldCh4cCwgeG9mZik7CisJeHAtPmZsYWcgPSB4ZmxhZzsKKworCW1hcmtfaW5vZGVfZGlydHkoaXApOworZXhpdDoKKwl1cCgmSkZTX0lQKGlwKS0+Y29tbWl0X3NlbSk7CisJcmV0dXJuIChyYyk7Cit9CisjZW5kaWYJCQkvKiBfTk9UWUVUICovCisKKworLyoKKyAqIE5BTUU6ICAgICAgICBleHRIaW50KCkKKyAqCisgKiBGVU5DVElPTjogICAgcHJvZHVjZSBhbiBleHRlbnQgYWxsb2NhdGlvbiBoaW50IGZvciBhIGZpbGUgb2Zmc2V0LgorICoKKyAqIFBBUkFNRVRFUlM6CisgKglpcAktIHRoZSBpbm9kZSBvZiB0aGUgZmlsZS4KKyAqCW9mZnNldCAgLSBmaWxlIG9mZnNldCBmb3Igd2hpY2ggdGhlIGhpbnQgaXMgbmVlZGVkLgorICoJeHAJLSBwb2ludGVyIHRvIHRoZSB4YWQgdGhhdCBpcyB0byBiZSBmaWxsZWQgaW4gd2l0aAorICoJCSAgdGhlIGhpbnQuCisgKgorICogUkVUVVJOIFZBTFVFUzoKKyAqICAgICAgMCAgICAgICAtIHN1Y2Nlc3MKKyAqICAgICAgLUVJTwktIGkvbyBlcnJvci4KKyAqLworaW50IGV4dEhpbnQoc3RydWN0IGlub2RlICppcCwgczY0IG9mZnNldCwgeGFkX3QgKiB4cCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaXAtPmlfc2I7CisJc3RydWN0IHhhZGxpc3QgeGFkbDsKKwlzdHJ1Y3QgbHhkbGlzdCBseGRsOworCWx4ZF90IGx4ZDsKKwlzNjQgcHJldjsKKwlpbnQgcmMsIG5icGVycGFnZSA9IEpGU19TQkkoc2IpLT5uYnBlcnBhZ2U7CisKKwkvKiBpbml0IHRoZSBoaW50IGFzICJubyBoaW50IHByb3ZpZGVkIiAqLworCVhBRGFkZHJlc3MoeHAsIDApOworCisJLyogZGV0ZXJtaW5lIHRoZSBzdGFydGluZyBleHRlbnQgb2Zmc2V0IG9mIHRoZSBwYWdlIHByZXZpb3VzCisJICogdG8gdGhlIHBhZ2UgY29udGFpbmluZyB0aGUgb2Zmc2V0LgorCSAqLworCXByZXYgPSAoKG9mZnNldCAmIH5QT0ZGU0VUKSA+PiBKRlNfU0JJKHNiKS0+bDJic2l6ZSkgLSBuYnBlcnBhZ2U7CisKKwkvKiBpZiB0aGUgb2Zmc2V0cyBpbiB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgZmlsZSwKKwkgKiBubyBoaW50IHByb3ZpZGVkLgorCSAqLworCWlmIChwcmV2IDwgMCkKKwkJcmV0dXJuICgwKTsKKworCS8qIHByZXBhcmUgdG8gbG9va3VwIHRoZSBwcmV2aW91cyBwYWdlJ3MgZXh0ZW50IGluZm8gKi8KKwlseGRsLm1heG5seGQgPSAxOworCWx4ZGwubmx4ZCA9IDE7CisJbHhkbC5seGQgPSAmbHhkOworCUxYRG9mZnNldCgmbHhkLCBwcmV2KQorCSAgICBMWERsZW5ndGgoJmx4ZCwgbmJwZXJwYWdlKTsKKworCXhhZGwubWF4bnhhZCA9IDE7CisJeGFkbC5ueGFkID0gMDsKKwl4YWRsLnhhZCA9IHhwOworCisJLyogcGVyZm9ybSB0aGUgbG9va3VwICovCisJaWYgKChyYyA9IHh0TG9va3VwTGlzdChpcCwgJmx4ZGwsICZ4YWRsLCAwKSkpCisJCXJldHVybiAocmMpOworCisJLyogY2hlY2sgaWYgbm90IGV4dGVudCBleGlzdHMgZm9yIHRoZSBwcmV2aW91cyBwYWdlLiAgCisJICogdGhpcyBpcyBwb3NzaWJsZSBmb3Igc3BhcnNlIGZpbGVzLgorCSAqLworCWlmICh4YWRsLm54YWQgPT0gMCkgeworLy8gICAgICAgICAgICAgIGFzc2VydChJU1NQQVJTRShpcCkpOworCQlyZXR1cm4gKDApOworCX0KKworCS8qIG9ubHkgcHJlc2VydmUgdGhlIGFibnIgZmxhZyB3aXRoaW4gdGhlIHhhZCBmbGFncworCSAqIG9mIHRoZSByZXR1cm5lZCBoaW50LgorCSAqLworCXhwLT5mbGFnICY9IFhBRF9OT1RSRUNPUkRFRDsKKworICAgICAgICBpZih4YWRsLm54YWQgIT0gMSB8fCBsZW5ndGhYQUQoeHApICE9IG5icGVycGFnZSkgeyAgICAgICAgICAKKwkJamZzX2Vycm9yKGlwLT5pX3NiLCAiZXh0SGludDogY29ycnVwdCB4dHJlZSIpOworCQlyZXR1cm4gLUVJTzsKKyAgICAgICAgfQorCisJcmV0dXJuICgwKTsKK30KKworCisvKgorICogTkFNRTogICAgICAgIGV4dFJlY29yZCgpCisgKgorICogRlVOQ1RJT046ICAgIGNoYW5nZSBhIHBhZ2Ugd2l0aCBhIGZpbGUgZnJvbSBub3QgcmVjb3JkZWQgdG8gcmVjb3JkZWQuCisgKgorICogUEFSQU1FVEVSUzoKKyAqCWlwCS0gaW5vZGUgb2YgdGhlIGZpbGUuCisgKgljcAktIGNidWYgb2YgdGhlIGZpbGUgcGFnZS4KKyAqCisgKiBSRVRVUk4gVkFMVUVTOgorICogICAgICAwICAgICAgIC0gc3VjY2VzcworICogICAgICAtRUlPCS0gaS9vIGVycm9yLgorICogICAgICAtRU5PU1BDCS0gaW5zdWZmaWNpZW50IGRpc2sgcmVzb3VyY2VzLgorICovCitpbnQgZXh0UmVjb3JkKHN0cnVjdCBpbm9kZSAqaXAsIHhhZF90ICogeHApCit7CisJaW50IHJjOworCisJdHhCZWdpbkFub24oaXAtPmlfc2IpOworCisJZG93bigmSkZTX0lQKGlwKS0+Y29tbWl0X3NlbSk7CisKKwkvKiB1cGRhdGUgdGhlIGV4dGVudCAqLworCXJjID0geHRVcGRhdGUoMCwgaXAsIHhwKTsKKworCXVwKCZKRlNfSVAoaXApLT5jb21taXRfc2VtKTsKKwlyZXR1cm4gcmM7Cit9CisKKworI2lmZGVmIF9OT1RZRVQKKy8qCisgKiBOQU1FOiAgICAgICAgZXh0RmlsbCgpCisgKgorICogRlVOQ1RJT046ICAgIGFsbG9jYXRlIGRpc2sgc3BhY2UgZm9yIGEgZmlsZSBwYWdlIHRoYXQgcmVwcmVzZW50cworICoJCWEgZmlsZSBob2xlLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKglpcAktIHRoZSBpbm9kZSBvZiB0aGUgZmlsZS4KKyAqCWNwCS0gY2J1ZiBvZiB0aGUgZmlsZSBwYWdlIHJlcHJlc2VudCB0aGUgaG9sZS4KKyAqCisgKiBSRVRVUk4gVkFMVUVTOgorICogICAgICAwICAgICAgIC0gc3VjY2VzcworICogICAgICAtRUlPCS0gaS9vIGVycm9yLgorICogICAgICAtRU5PU1BDCS0gaW5zdWZmaWNpZW50IGRpc2sgcmVzb3VyY2VzLgorICovCitpbnQgZXh0RmlsbChzdHJ1Y3QgaW5vZGUgKmlwLCB4YWRfdCAqIHhwKQoreworCWludCByYywgbmJwZXJwYWdlID0gSkZTX1NCSShpcC0+aV9zYiktPm5icGVycGFnZTsKKwlzNjQgYmxrbm8gPSBvZmZzZXRYQUQoeHApID4+IGlwLT5pX2Jsa3NpemU7CisKKy8vICAgICAgYXNzZXJ0KElTU1BBUlNFKGlwKSk7CisKKwkvKiBpbml0aWFsaXplIHRoZSBleHRlbnQgYWxsb2NhdGlvbiBoaW50ICovCisJWEFEYWRkcmVzcyh4cCwgMCk7CisKKwkvKiBhbGxvY2F0ZSBhbiBleHRlbnQgdG8gZmlsbCB0aGUgaG9sZSAqLworCWlmICgocmMgPSBleHRBbGxvYyhpcCwgbmJwZXJwYWdlLCBibGtubywgeHAsIEZBTFNFKSkpCisJCXJldHVybiAocmMpOworCisJYXNzZXJ0KGxlbmd0aFBYRCh4cCkgPT0gbmJwZXJwYWdlKTsKKworCXJldHVybiAoMCk7Cit9CisjZW5kaWYJCQkvKiBfTk9UWUVUICovCisKKworLyoKKyAqIE5BTUU6CWV4dEJhbGxvYygpCisgKgorICogRlVOQ1RJT046ICAgIGFsbG9jYXRlIGRpc2sgYmxvY2tzIHRvIGZvcm0gYW4gZXh0ZW50LgorICoKKyAqCQlpbml0aWFsbHksIHdlIHdpbGwgdHJ5IHRvIGFsbG9jYXRlIGRpc2sgYmxvY2tzIGZvciB0aGUKKyAqCQlyZXF1ZXN0ZWQgc2l6ZSAobmJsb2NrcykuICBpZiB0aGlzIGZhaWxzIChuYmxvY2tzIAorICoJCWNvbnRpZ2lvdXMgZnJlZSBibG9ja3Mgbm90IGF2YWxpYWJsZSksIHdlJ2xsIHRyeSB0byBhbGxvY2F0ZQorICoJCWEgc21hbGxlciBudW1iZXIgb2YgYmxvY2tzIChwcm9kdWNpbmcgYSBzbWFsbGVyIGV4dGVudCksIHdpdGgKKyAqCQl0aGlzIHNtYWxsZXIgbnVtYmVyIG9mIGJsb2NrcyBjb25zaXN0aW5nIG9mIHRoZSByZXF1ZXN0ZWQKKyAqCQludW1iZXIgb2YgYmxvY2tzIHJvdW5kZWQgZG93biB0byB0aGUgbmV4dCBzbWFsbGVyIHBvd2VyIG9mIDIKKyAqCQludW1iZXIgKGkuZS4gMTYgLT4gOCkuICB3ZSdsbCBjb250aW51ZSB0byByb3VuZCBkb3duIGFuZAorICoJCXJldHJ5IHRoZSBhbGxvY2F0aW9uIHVudGlsIHRoZSBudW1iZXIgb2YgYmxvY2tzIHRvIGFsbG9jYXRlCisgKgkJaXMgc21hbGxlciB0aGFuIHRoZSBudW1iZXIgb2YgYmxvY2tzIHBlciBwYWdlLgorICoJCQorICogUEFSQU1FVEVSUzoKKyAqCWlwCSAtIHRoZSBpbm9kZSBvZiB0aGUgZmlsZS4KKyAqCWhpbnQJIC0gZGlzayBibG9jayBudW1iZXIgdG8gYmUgdXNlZCBhcyBhbiBhbGxvY2F0aW9uIGhpbnQuCisgKgkqbmJsb2NrcyAtIHBvaW50ZXIgdG8gYW4gczY0IHZhbHVlLiAgb24gZW50cnksIHRoaXMgdmFsdWUgc3BlY2lmaWVzCisgKgkJICAgdGhlIGRlc2lyZWQgbnVtYmVyIG9mIGJsb2NrIHRvIGJlIGFsbG9jYXRlZC4gb24gc3VjY2Vzc2Z1bAorICoJCSAgIGV4aXQsIHRoaXMgdmFsdWUgaXMgc2V0IHRvIHRoZSBudW1iZXIgb2YgYmxvY2tzIGFjdHVhbGx5CisgKgkJICAgYWxsb2NhdGVkLgorICoJYmxrbm8JIC0gcG9pbnRlciB0byBhIGJsb2NrIGFkZHJlc3MgdGhhdCBpcyBmaWxsZWQgaW4gb24gc3VjY2Vzc2Z1bAorICoJCSAgIHJldHVybiB3aXRoIHRoZSBzdGFydGluZyBibG9jayBudW1iZXIgb2YgdGhlIG5ld2x5IAorICoJCSAgIGFsbG9jYXRlZCBibG9jayByYW5nZS4KKyAqCisgKiBSRVRVUk4gVkFMVUVTOgorICogICAgICAwICAgICAgIC0gc3VjY2VzcworICogICAgICAtRUlPCS0gaS9vIGVycm9yLgorICogICAgICAtRU5PU1BDCS0gaW5zdWZmaWNpZW50IGRpc2sgcmVzb3VyY2VzLgorICovCitzdGF0aWMgaW50CitleHRCYWxsb2Moc3RydWN0IGlub2RlICppcCwgczY0IGhpbnQsIHM2NCAqIG5ibG9ja3MsIHM2NCAqIGJsa25vKQoreworCXN0cnVjdCBqZnNfaW5vZGVfaW5mbyAqamkgPSBKRlNfSVAoaXApOworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpID0gSkZTX1NCSShpcC0+aV9zYik7CisJczY0IG5iLCBuYmxrcywgZGFkZHIsIG1heDsKKwlpbnQgcmMsIG5icGVycGFnZSA9IHNiaS0+bmJwZXJwYWdlOworCXN0cnVjdCBibWFwICpibXAgPSBzYmktPmJtYXA7CisJaW50IGFnOworCisJLyogZ2V0IHRoZSBudW1iZXIgb2YgYmxvY2tzIHRvIGluaXRpYWxseSBhdHRlbXB0IHRvIGFsbG9jYXRlLgorCSAqIHdlJ2xsIGZpcnN0IHRyeSB0aGUgbnVtYmVyIG9mIGJsb2NrcyByZXF1ZXN0ZWQgdW5sZXNzIHRoaXMKKwkgKiBudW1iZXIgaXMgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb250aWdpb3VzIGZyZWUKKwkgKiBibG9ja3MgaW4gdGhlIG1hcC4gaW4gdGhhdCBjYXNlLCB3ZSdsbCBzdGFydCBvZmYgd2l0aCB0aGUgCisJICogbWF4aW11bSBmcmVlLgorCSAqLworCW1heCA9IChzNjQpIDEgPDwgYm1wLT5kYl9tYXhmcmVlYnVkOworCWlmICgqbmJsb2NrcyA+PSBtYXggJiYgKm5ibG9ja3MgPiBuYnBlcnBhZ2UpCisJCW5iID0gbmJsa3MgPSAobWF4ID4gbmJwZXJwYWdlKSA/IG1heCA6IG5icGVycGFnZTsKKwllbHNlCisJCW5iID0gbmJsa3MgPSAqbmJsb2NrczsKKworCS8qIHRyeSB0byBhbGxvY2F0ZSBibG9ja3MgKi8KKwl3aGlsZSAoKHJjID0gZGJBbGxvYyhpcCwgaGludCwgbmIsICZkYWRkcikpICE9IDApIHsKKwkJLyogaWYgc29tZXRoaW5nIG90aGVyIHRoYW4gYW4gb3V0IG9mIHNwYWNlIGVycm9yLAorCQkgKiBzdG9wIGFuZCByZXR1cm4gdGhpcyBlcnJvci4KKwkJICovCisJCWlmIChyYyAhPSAtRU5PU1BDKQorCQkJcmV0dXJuIChyYyk7CisKKwkJLyogZGVjcmVhc2UgdGhlIGFsbG9jYXRpb24gcmVxdWVzdCBzaXplICovCisJCW5iID0gbWluKG5ibGtzLCBleHRSb3VuZERvd24obmIpKTsKKworCQkvKiBnaXZlIHVwIGlmIHdlIGNhbm5vdCBjb3ZlciBhIHBhZ2UgKi8KKwkJaWYgKG5iIDwgbmJwZXJwYWdlKQorCQkJcmV0dXJuIChyYyk7CisJfQorCisJKm5ibG9ja3MgPSBuYjsKKwkqYmxrbm8gPSBkYWRkcjsKKworCWlmIChTX0lTUkVHKGlwLT5pX21vZGUpICYmIChqaS0+ZmlsZXNldCA9PSBGSUxFU1lTVEVNX0kpKSB7CisJCWFnID0gQkxLVE9BRyhkYWRkciwgc2JpKTsKKwkJc3Bpbl9sb2NrX2lycSgmamktPmFnX2xvY2spOworCQlpZiAoamktPmFjdGl2ZV9hZyA9PSAtMSkgeworCQkJYXRvbWljX2luYygmYm1wLT5kYl9hY3RpdmVbYWddKTsKKwkJCWppLT5hY3RpdmVfYWcgPSBhZzsKKwkJfSBlbHNlIGlmIChqaS0+YWN0aXZlX2FnICE9IGFnKSB7CisJCQlhdG9taWNfZGVjKCZibXAtPmRiX2FjdGl2ZVtqaS0+YWN0aXZlX2FnXSk7CisJCQlhdG9taWNfaW5jKCZibXAtPmRiX2FjdGl2ZVthZ10pOworCQkJamktPmFjdGl2ZV9hZyA9IGFnOworCQl9CisJCXNwaW5fdW5sb2NrX2lycSgmamktPmFnX2xvY2spOworCX0KKworCXJldHVybiAoMCk7Cit9CisKKworI2lmZGVmIF9OT1RZRVQKKy8qCisgKiBOQU1FOglleHRCcmVhbGxvYygpCisgKgorICogRlVOQ1RJT046ICAgIGF0dGVtcHQgdG8gZXh0ZW5kIGFuIGV4dGVudCdzIGFsbG9jYXRpb24uCisgKgorICoJCWluaXRpYWxseSwgd2Ugd2lsbCB0cnkgdG8gZXh0ZW5kIHRoZSBleHRlbnQncyBhbGxvY2F0aW9uCisgKgkJaW4gcGxhY2UuICBpZiB0aGlzIGZhaWxzLCB3ZSdsbCB0cnkgdG8gbW92ZSB0aGUgZXh0ZW50CisgKgkJdG8gYSBuZXcgc2V0IG9mIGJsb2Nrcy4gaWYgbW92aW5nIHRoZSBleHRlbnQsIHdlIGluaXRpYWxseQorICoJCXdpbGwgdHJ5IHRvIGFsbG9jYXRlIGRpc2sgYmxvY2tzIGZvciB0aGUgcmVxdWVzdGVkIHNpemUKKyAqCQkobm5ldykuICBpZiB0aGlzIGZhaWxzIAkobm5ldyBjb250aWdpb3VzIGZyZWUgYmxvY2tzIG5vdAorICoJCWF2YWxpYWJsZSksIHdlJ2xsIHRyeSAgdG8gYWxsb2NhdGUgYSBzbWFsbGVyIG51bWJlciBvZgorICoJCWJsb2NrcyAocHJvZHVjaW5nIGEgc21hbGxlciBleHRlbnQpLCB3aXRoIHRoaXMgc21hbGxlcgorICoJCW51bWJlciBvZiBibG9ja3MgY29uc2lzdGluZyBvZiB0aGUgcmVxdWVzdGVkIG51bWJlciBvZgorICoJCWJsb2NrcyByb3VuZGVkIGRvd24gdG8gdGhlIG5leHQgc21hbGxlciBwb3dlciBvZiAyCisgKgkJbnVtYmVyIChpLmUuIDE2IC0+IDgpLiAgd2UnbGwgY29udGludWUgdG8gcm91bmQgZG93biBhbmQKKyAqCQlyZXRyeSB0aGUgYWxsb2NhdGlvbiB1bnRpbCB0aGUgbnVtYmVyIG9mIGJsb2NrcyB0byBhbGxvY2F0ZQorICoJCWlzIHNtYWxsZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGJsb2NrcyBwZXIgcGFnZS4KKyAqCQkKKyAqIFBBUkFNRVRFUlM6CisgKglpcAkgLSB0aGUgaW5vZGUgb2YgdGhlIGZpbGUuCisgKglibGtubyAgICAtIHN0YXJ0aW5nIGJsb2NrIG51bWJlciBvZiB0aGUgZXh0ZW50cyBjdXJyZW50IGFsbG9jYXRpb24uCisgKgluYmxrcyAgICAtIG51bWJlciBvZiBibG9ja3Mgd2l0aGluIHRoZSBleHRlbnRzIGN1cnJlbnQgYWxsb2NhdGlvbi4KKyAqCW5ld25ibGtzIC0gcG9pbnRlciB0byBhIHM2NCB2YWx1ZS4gIG9uIGVudHJ5LCB0aGlzIHZhbHVlIGlzIHRoZQorICoJCSAgIHRoZSBuZXcgZGVzaXJlZCBleHRlbnQgc2l6ZSAobnVtYmVyIG9mIGJsb2NrcykuICBvbgorICoJCSAgIHN1Y2Nlc3NmdWwgZXhpdCwgdGhpcyB2YWx1ZSBpcyBzZXQgdG8gdGhlIGV4dGVudCdzIGFjdHVhbAorICoJCSAgIG5ldyBzaXplIChuZXcgbnVtYmVyIG9mIGJsb2NrcykuCisgKgluZXdibGtubyAtIHRoZSBzdGFydGluZyBibG9jayBudW1iZXIgb2YgdGhlIGV4dGVudHMgbmV3IGFsbG9jYXRpb24uCisgKgorICogUkVUVVJOIFZBTFVFUzoKKyAqICAgICAgMCAgICAgICAtIHN1Y2Nlc3MKKyAqICAgICAgLUVJTwktIGkvbyBlcnJvci4KKyAqICAgICAgLUVOT1NQQwktIGluc3VmZmljaWVudCBkaXNrIHJlc291cmNlcy4KKyAqLworc3RhdGljIGludAorZXh0QnJlYWxsb2Moc3RydWN0IGlub2RlICppcCwKKwkgICAgczY0IGJsa25vLCBzNjQgbmJsa3MsIHM2NCAqIG5ld25ibGtzLCBzNjQgKiBuZXdibGtubykKK3sKKwlpbnQgcmM7CisKKwkvKiB0cnkgdG8gZXh0ZW5kIGluIHBsYWNlICovCisJaWYgKChyYyA9IGRiRXh0ZW5kKGlwLCBibGtubywgbmJsa3MsICpuZXduYmxrcyAtIG5ibGtzKSkgPT0gMCkgeworCQkqbmV3Ymxrbm8gPSBibGtubzsKKwkJcmV0dXJuICgwKTsKKwl9IGVsc2UgeworCQlpZiAocmMgIT0gLUVOT1NQQykKKwkJCXJldHVybiAocmMpOworCX0KKworCS8qIGluIHBsYWNlIGV4dGVuc2lvbiBub3QgcG9zc2libGUuICAKKwkgKiB0cnkgdG8gbW92ZSB0aGUgZXh0ZW50IHRvIGEgbmV3IHNldCBvZiBibG9ja3MuCisJICovCisJcmV0dXJuIChleHRCYWxsb2MoaXAsIGJsa25vLCBuZXduYmxrcywgbmV3Ymxrbm8pKTsKK30KKyNlbmRpZgkJCS8qIF9OT1RZRVQgKi8KKworCisvKgorICogTkFNRTogICAgICAgIGV4dFJvdW5kRG93bigpCisgKgorICogRlVOQ1RJT046ICAgIHJvdW5kIGRvd24gYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJsb2NrcyB0byB0aGUgbmV4dAorICoJCXNtYWxsZXN0IHBvd2VyIG9mIDIgbnVtYmVyLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKgluYgktIHRoZSBpbm9kZSBvZiB0aGUgZmlsZS4KKyAqCisgKiBSRVRVUk4gVkFMVUVTOgorICogICAgICBuZXh0IHNtYWxsZXN0IHBvd2VyIG9mIDIgbnVtYmVyLgorICovCitzdGF0aWMgczY0IGV4dFJvdW5kRG93bihzNjQgbmIpCit7CisJaW50IGk7CisJdTY0IG0sIGs7CisKKwlmb3IgKGkgPSAwLCBtID0gKHU2NCkgMSA8PCA2MzsgaSA8IDY0OyBpKyssIG0gPj49IDEpIHsKKwkJaWYgKG0gJiBuYikKKwkJCWJyZWFrOworCX0KKworCWkgPSA2MyAtIGk7CisJayA9ICh1NjQpIDEgPDwgaTsKKwlrID0gKChrIC0gMSkgJiBuYikgPyBrIDogayA+PiAxOworCisJcmV0dXJuIChrKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfZXh0ZW50LmggYi9mcy9qZnMvamZzX2V4dGVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MGZjN2MKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZnMvamZzX2V4dGVudC5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiAgIENvcHlyaWdodCAoYykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwMC0yMDAxCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpZm5kZWYJX0hfSkZTX0VYVEVOVAorI2RlZmluZSBfSF9KRlNfRVhURU5UCisKKy8qICBnZXQgYmxvY2sgYWxsb2NhdGlvbiBhbGxvY2F0aW9uIGhpbnQgYXMgbG9jYXRpb24gb2YgZGlzayBpbm9kZSAqLworI2RlZmluZQlJTk9ISU5UKGlwKQlcCisJKGFkZHJlc3NQWEQoJihKRlNfSVAoaXApLT5peHB4ZCkpICsgbGVuZ3RoUFhEKCYoSkZTX0lQKGlwKS0+aXhweGQpKSAtIDEpCisKK2V4dGVybiBpbnQJZXh0QWxsb2Moc3RydWN0IGlub2RlICosIHM2NCwgczY0LCB4YWRfdCAqLCBib29sZWFuX3QpOworZXh0ZXJuIGludAlleHRGaWxsKHN0cnVjdCBpbm9kZSAqLCB4YWRfdCAqKTsKK2V4dGVybiBpbnQJZXh0SGludChzdHJ1Y3QgaW5vZGUgKiwgczY0LCB4YWRfdCAqKTsKK2V4dGVybiBpbnQJZXh0UmVhbGxvYyhzdHJ1Y3QgaW5vZGUgKiwgczY0LCB4YWRfdCAqLCBib29sZWFuX3QpOworZXh0ZXJuIGludAlleHRSZWNvcmQoc3RydWN0IGlub2RlICosIHhhZF90ICopOworCisjZW5kaWYJLyogX0hfSkZTX0VYVEVOVCAqLwpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19maWxzeXMuaCBiL2ZzL2pmcy9qZnNfZmlsc3lzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZjY2FjOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmcy9qZnNfZmlsc3lzLmgKQEAgLTAsMCArMSwyODAgQEAKKy8qCisgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwMC0yMDAzCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpZm5kZWYgX0hfSkZTX0ZJTFNZUworI2RlZmluZSBfSF9KRlNfRklMU1lTCisKKy8qCisgKglqZnNfZmlsc3lzLmgKKyAqCisgKiBmaWxlIHN5c3RlbSAoaW1wbGVtZW50YXRpb24tZGVwZW5kZW50KSBjb25zdGFudHMgCisgKgorICogcmVmZXIgdG8gPGxpbWl0cy5oPiBmb3Igc3lzdGVtIHdpZGUgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50IGNvbnN0YW50cyAKKyAqLworCisvKgorICoJIGZpbGUgc3lzdGVtIG9wdGlvbiAoc3VwZXJibG9jayBmbGFnKQorICovCisvKiBtb3VudCB0aW1lIGZsYWcgdG8gZGlzYWJsZSBqb3VybmFsaW5nIHRvIGRpc2sgKi8KKyNkZWZpbmUgSkZTX05PSU5URUdSSVRZIDB4MDAwMDAwMTAKKworLyogbW91bnQgdGltZSBmbGFncyBmb3IgZXJyb3IgaGFuZGxpbmcgKi8KKyNkZWZpbmUgSkZTX0VSUl9SRU1PVU5UX1JPIDB4MDAwMDAwMDIgICAvKiByZW1vdW50IHJlYWQtb25seSAqLworI2RlZmluZSBKRlNfRVJSX0NPTlRJTlVFICAgMHgwMDAwMDAwNCAgIC8qIGNvbnRpbnVlICovCisjZGVmaW5lIEpGU19FUlJfUEFOSUMgICAgICAweDAwMDAwMDA4ICAgLyogcGFuaWMgKi8KKworLyogcGxhdGZvcm0gb3B0aW9uIChjb25kaXRpb25hbCBjb21waWxhdGlvbikgKi8KKyNkZWZpbmUgSkZTX0FJWAkJMHg4MDAwMDAwMAkvKiBBSVggc3VwcG9ydCAqLworLyoJUE9TSVggbmFtZS9kaXJlY3RvcnkgIHN1cHBvcnQgKi8KKworI2RlZmluZSBKRlNfT1MyCQkweDQwMDAwMDAwCS8qIE9TLzIgc3VwcG9ydCAqLworLyoJY2FzZS1pbnNlbnNpdGl2ZSBuYW1lL2RpcmVjdG9yeSBzdXBwb3J0ICovCisKKyNkZWZpbmUgSkZTX0RGUwkJMHgyMDAwMDAwMAkvKiBEQ0UgREZTIExGUyBzdXBwb3J0ICovCisKKyNkZWZpbmUgSkZTX0xJTlVYICAgICAgCTB4MTAwMDAwMDAJLyogTGludXggc3VwcG9ydCAqLworLyoJY2FzZS1zZW5zaXRpdmUgbmFtZS9kaXJlY3Rvcnkgc3VwcG9ydCAqLworCisvKiBkaXJlY3Rvcnkgb3B0aW9uICovCisjZGVmaW5lIEpGU19VTklDT0RFCTB4MDAwMDAwMDEJLyogdW5pY29kZSBuYW1lICovCisKKy8qIGNvbW1pdCBvcHRpb24gKi8KKyNkZWZpbmUJSkZTX0NPTU1JVAkweDAwMDAwZjAwCS8qIGNvbW1pdCBvcHRpb24gbWFzayAqLworI2RlZmluZQlKRlNfR1JPVVBDT01NSVQJMHgwMDAwMDEwMAkvKiBncm91cCAob2YgMSkgY29tbWl0ICovCisjZGVmaW5lCUpGU19MQVpZQ09NTUlUCTB4MDAwMDAyMDAJLyogbGF6eSBjb21taXQgKi8KKyNkZWZpbmUJSkZTX1RNUEZTCTB4MDAwMDA0MDAJLyogdGVtcG9yYXJ5IGZpbGUgc3lzdGVtIC0gCisJCQkJCSAqIGRvIG5vdCBsb2cvY29tbWl0OgorCQkJCQkgKi8KKworLyogbG9nIGxvZ2ljYWwgdm9sdW1lIG9wdGlvbiAqLworI2RlZmluZQlKRlNfSU5MSU5FTE9HCTB4MDAwMDA4MDAJLyogaW5saW5lIGxvZyB3aXRoaW4gZmlsZSBzeXN0ZW0gKi8KKyNkZWZpbmUgSkZTX0lOTElORU1PVkUJMHgwMDAwMTAwMAkvKiBpbmxpbmUgbG9nIGJlaW5nIG1vdmVkICovCisKKy8qIFNlY29uZGFyeSBhZ2dyZWdhdGUgaW5vZGUgdGFibGUgKi8KKyNkZWZpbmUgSkZTX0JBRF9TQUlUCTB4MDAwMTAwMDAJLyogY3VycmVudCBzZWNvbmRhcnkgYWl0IGlzIGJhZCAqLworCisvKiBzcGFyc2UgcmVndWxhciBmaWxlIHN1cHBvcnQgKi8KKyNkZWZpbmUgSkZTX1NQQVJTRQkweDAwMDIwMDAwCS8qIHNwYXJzZSByZWd1bGFyIGZpbGUgKi8KKworLyogREFTRCBMaW1pdHMJCUYyMjY5NDEgKi8KKyNkZWZpbmUgSkZTX0RBU0RfRU5BQkxFRAkweDAwMDQwMDAwCS8qIERBU0QgbGltaXRzIGVuYWJsZWQgKi8KKyNkZWZpbmUJSkZTX0RBU0RfUFJJTUUJCTB4MDAwODAwMDAJLyogUHJpbWUgREFTRCB1c2FnZSBvbiBib290ICovCisKKy8qIGJpZyBlbmRpYW4gZmxhZyAqLworI2RlZmluZQlKRlNfU1dBUF9CWVRFUwkJMHgwMDEwMDAwMAkvKiBydW5uaW5nIG9uIGJpZyBlbmRpYW4gY29tcHV0ZXIgKi8KKworLyogRGlyZWN0b3J5IGluZGV4ICovCisjZGVmaW5lIEpGU19ESVJfSU5ERVgJCTB4MDAyMDAwMDAJLyogUGVyc2lzdGFudCBpbmRleCBmb3IgKi8KKwkJCQkJCS8qIGRpcmVjdG9yeSBlbnRyaWVzICAgICovCisKKworLyoKKyAqCWJ1ZmZlciBjYWNoZSBjb25maWd1cmF0aW9uCisgKi8KKy8qIHBhZ2Ugc2l6ZSAqLworI2lmZGVmIFBTSVpFCisjdW5kZWYgUFNJWkUKKyNlbmRpZgorI2RlZmluZQlQU0laRQkJNDA5NgkvKiBwYWdlIHNpemUgKGluIGJ5dGUpICovCisjZGVmaW5lCUwyUFNJWkUJCTEyCS8qIGxvZzIoUFNJWkUpICovCisjZGVmaW5lCVBPRkZTRVQJCTQwOTUJLyogb2Zmc2V0IHdpdGhpbiBwYWdlICovCisKKy8qIGJ1ZmZlciBwYWdlIHNpemUgKi8KKyNkZWZpbmUgQlBTSVpFCVBTSVpFCisKKy8qCisgKglmcyBmdW5kYW1lbnRhbCBzaXplCisgKgorICogUFNJWkUgPj0gZmlsZSBzeXN0ZW0gYmxvY2sgc2l6ZSA+PSBQQlNJWkUgPj0gRElTSVpFCisgKi8KKyNkZWZpbmUJUEJTSVpFCQk1MTIJLyogcGh5c2ljYWwgYmxvY2sgc2l6ZSAoaW4gYnl0ZSkgKi8KKyNkZWZpbmUJTDJQQlNJWkUJOQkvKiBsb2cyKFBCU0laRSkgKi8KKworI2RlZmluZSBESVNJWkUJCTUxMgkvKiBvbi1kaXNrIGlub2RlIHNpemUgKGluIGJ5dGUpICovCisjZGVmaW5lIEwyRElTSVpFCTkJLyogbG9nMihESVNJWkUpICovCisKKyNkZWZpbmUgSURBVEFTSVpFCTI1NgkvKiBpbm9kZSBpbmxpbmUgZGF0YSBzaXplICovCisjZGVmaW5lCUlYQVRUUlNJWkUJMTI4CS8qIGlub2RlIGlubGluZSBleHRlbmRlZCBhdHRyaWJ1dGUgc2l6ZSAqLworCisjZGVmaW5lIFhUUEFHRV9TSVpFICAgICA0MDk2CisjZGVmaW5lIGxvZzJfUEFHRVNJWkUgICAgIDEyCisKKyNkZWZpbmUgSUFHX1NJWkUgICAgICAgIDQwOTYKKyNkZWZpbmUgSUFHX0VYVEVOVF9TSVpFIDQwOTYKKyNkZWZpbmUJSU5PU1BFUklBRwk0MDk2CS8qIG51bWJlciBvZiBkaXNrIGlub2RlcyBwZXIgaWFnICovCisjZGVmaW5lCUwySU5PU1BFUklBRwkxMgkvKiBsMiBudW1iZXIgb2YgZGlzayBpbm9kZXMgcGVyIGlhZyAqLworI2RlZmluZSBJTk9TUEVSRVhUCTMyCS8qIG51bWJlciBvZiBkaXNrIGlub2RlIHBlciBleHRlbnQgKi8KKyNkZWZpbmUgTDJJTk9TUEVSRVhUCTUJLyogbDIgbnVtYmVyIG9mIGRpc2sgaW5vZGUgcGVyIGV4dGVudCAqLworI2RlZmluZQlJWFNJWkUJCShESVNJWkUgKiBJTk9TUEVSRVhUKQkvKiBpbm9kZSBleHRlbnQgc2l6ZSAqLworI2RlZmluZQlJTk9TUEVSUEFHRQk4CS8qIG51bWJlciBvZiBkaXNrIGlub2RlcyBwZXIgNEsgcGFnZSAqLworI2RlZmluZQlMMklOT1NQRVJQQUdFCTMJLyogbG9nMihJTk9TUEVSUEFHRSkgKi8KKworI2RlZmluZQlJQUdGUkVFTElTVF9MV00JNjQKKworI2RlZmluZSBJTk9ERV9FWFRFTlRfU0laRQlJWFNJWkUJLyogaW5vZGUgZXh0ZW50IHNpemUgKi8KKyNkZWZpbmUgTlVNX0lOT0RFX1BFUl9FWFRFTlQJSU5PU1BFUkVYVAorI2RlZmluZSBOVU1fSU5PREVfUEVSX0lBRwlJTk9TUEVSSUFHCisKKyNkZWZpbmUgTUlOQkxPQ0tTSVpFCQk1MTIKKyNkZWZpbmUgTUFYQkxPQ0tTSVpFCQk0MDk2CisjZGVmaW5lCU1BWEZJTEVTSVpFCQkoKHM2NCkxIDw8IDUyKQorCisjZGVmaW5lIEpGU19MSU5LX01BWAkJMHhmZmZmZmZmZgorCisvKiBNaW5pbXVtIG51bWJlciBvZiBieXRlcyBzdXBwb3J0ZWQgZm9yIGEgSkZTIHBhcnRpdGlvbiAqLworI2RlZmluZSBNSU5KRlMJCQkoMHgxMDAwMDAwKQorI2RlZmluZSBNSU5KRlNURVhUCQkiMTYiCisKKy8qCisgKiBmaWxlIHN5c3RlbSBibG9jayBzaXplIC0+IHBoeXNpY2FsIGJsb2NrIHNpemUKKyAqLworI2RlZmluZSBMQk9GRlNFVCh4KQkoKHgpICYgKFBCU0laRSAtIDEpKQorI2RlZmluZSBMQk5VTUJFUih4KQkoKHgpID4+IEwyUEJTSVpFKQorI2RlZmluZQlMQkxLMlBCTEsoc2IsYikJKChiKSA8PCAoc2ItPnNfYmxvY2tzaXplX2JpdHMgLSBMMlBCU0laRSkpCisjZGVmaW5lCVBCTEsyTEJMSyhzYixiKQkoKGIpID4+IChzYi0+c19ibG9ja3NpemVfYml0cyAtIEwyUEJTSVpFKSkKKy8qIHNpemUgaW4gYnl0ZSAtPiBsYXN0IHBhZ2UgbnVtYmVyICovCisjZGVmaW5lCVNJWkUyUE4oc2l6ZSkJKCAoKHM2NCkoKHNpemUpIC0gMSkpID4+IChMMlBTSVpFKSApCisvKiBzaXplIGluIGJ5dGUgLT4gbGFzdCBmaWxlIHN5c3RlbSBibG9jayBudW1iZXIgKi8KKyNkZWZpbmUJU0laRTJCTihzaXplLCBsMmJzaXplKSAoICgoczY0KSgoc2l6ZSkgLSAxKSkgPj4gKGwyYnNpemUpICkKKworLyoKKyAqIGZpeGVkIHBoeXNpY2FsIGJsb2NrIGFkZHJlc3MgKHBoeXNpY2FsIGJsb2NrIHNpemUgPSA1MTIgYnl0ZSkKKyAqCisgKiBOT1RFOiBzaW5jZSB3ZSBjYW4ndCBndWFyYW50ZWUgYSBwaHlzaWNhbCBibG9jayBzaXplIG9mIDUxMiBieXRlcyB0aGUgdXNlIG9mCisgKgkgdGhlc2UgbWFjcm9zIHNob3VsZCBiZSByZW1vdmVkIGFuZCB0aGUgYnl0ZSBvZmZzZXQgbWFjcm9zIHVzZWQgaW5zdGVhZC4KKyAqLworI2RlZmluZSBTVVBFUjFfQgk2NAkvKiBwcmltYXJ5IHN1cGVyYmxvY2sgKi8KKyNkZWZpbmUJQUlNQVBfQgkJKFNVUEVSMV9CICsgOCkJLyogMXN0IGV4dGVudCBvZiBhZ2dyZWdhdGUgaW5vZGUgbWFwICovCisjZGVmaW5lCUFJVEJMX0IJCShBSU1BUF9CICsgMTYpCS8qCisJCQkJCSAqIDFzdCBleHRlbnQgb2YgYWdncmVnYXRlIGlub2RlIHRhYmxlCisJCQkJCSAqLworI2RlZmluZQlTVVBFUjJfQgkoQUlUQkxfQiArIDMyKQkvKiAybmRhcnkgc3VwZXJibG9jayBwYm4gKi8KKyNkZWZpbmUJQk1BUF9CCQkoU1VQRVIyX0IgKyA4KQkvKiBibG9jayBhbGxvY2F0aW9uIG1hcCAqLworCisvKgorICogU0laRV9PRl9TVVBFUiBkZWZpbmVzIHRoZSB0b3RhbCBhbW91bnQgb2Ygc3BhY2UgcmVzZXJ2ZWQgb24gZGlzayBmb3IgdGhlCisgKiBzdXBlcmJsb2NrLiAgVGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIHN1cGVyYmxvY2sgc3RydWN0dXJlLCBzaW5jZSBhbGwgb2YKKyAqIHRoaXMgc3BhY2UgaXMgbm90IGN1cnJlbnRseSBiZWluZyB1c2VkLgorICovCisjZGVmaW5lIFNJWkVfT0ZfU1VQRVIJUFNJWkUKKworLyoKKyAqIFNJWkVfT0ZfQUdfVEFCTEUgZGVmaW5lcyB0aGUgYW1vdW50IG9mIHNwYWNlIHJlc2VydmVkIHRvIGhvbGQgdGhlIEFHIHRhYmxlCisgKi8KKyNkZWZpbmUgU0laRV9PRl9BR19UQUJMRQlQU0laRQorCisvKgorICogU0laRV9PRl9NQVBfUEFHRSBkZWZpbmVzIHRoZSBhbW91bnQgb2YgZGlzayBzcGFjZSByZXNlcnZlZCBmb3IgZWFjaCBwYWdlIG9mCisgKiB0aGUgaW5vZGUgYWxsb2NhdGlvbiBtYXAgKHRvIGhvbGQgaWFnKQorICovCisjZGVmaW5lIFNJWkVfT0ZfTUFQX1BBR0UJUFNJWkUKKworLyoKKyAqIGZpeGVkIGJ5dGUgb2Zmc2V0IGFkZHJlc3MKKyAqLworI2RlZmluZSBTVVBFUjFfT0ZGCTB4ODAwMAkvKiBwcmltYXJ5IHN1cGVyYmxvY2sgKi8KKyNkZWZpbmUgQUlNQVBfT0ZGCShTVVBFUjFfT0ZGICsgU0laRV9PRl9TVVBFUikKKwkJCQkJLyoKKwkJCQkJICogQ29udHJvbCBwYWdlIG9mIGFnZ3JlZ2F0ZSBpbm9kZSBtYXAKKwkJCQkJICogZm9sbG93ZWQgYnkgMXN0IGV4dGVudCBvZiBtYXAKKwkJCQkJICovCisjZGVmaW5lIEFJVEJMX09GRgkoQUlNQVBfT0ZGICsgKFNJWkVfT0ZfTUFQX1BBR0UgPDwgMSkpCisJCQkJCS8qIAorCQkJCQkgKiAxc3QgZXh0ZW50IG9mIGFnZ3JlZ2F0ZSBpbm9kZSB0YWJsZQorCQkJCQkgKi8KKyNkZWZpbmUgU1VQRVIyX09GRgkoQUlUQkxfT0ZGICsgSU5PREVfRVhURU5UX1NJWkUpCisJCQkJCS8qCisJCQkJCSAqIHNlY29uZGFyeSBzdXBlcmJsb2NrCisJCQkJCSAqLworI2RlZmluZSBCTUFQX09GRgkoU1VQRVIyX09GRiArIFNJWkVfT0ZfU1VQRVIpCisJCQkJCS8qCisJCQkJCSAqIGJsb2NrIGFsbG9jYXRpb24gbWFwCisJCQkJCSAqLworCisvKgorICogVGhlIGZvbGxvd2luZyBtYWNybyBpcyB1c2VkIHRvIGluZGljYXRlIHRoZSBudW1iZXIgb2YgcmVzZXJ2ZWQgZGlzayBibG9ja3MgYXQKKyAqIHRoZSBmcm9udCBvZiBhbiBhZ2dyZWdhdGUsIGluIHRlcm1zIG9mIHBoeXNpY2FsIGJsb2Nrcy4gIFRoaXMgdmFsdWUgaXMKKyAqIGN1cnJlbnRseSBkZWZpbmVkIHRvIGJlIDMySy4gIFRoaXMgdHVybnMgb3V0IHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBwcmltYXJ5CisgKiBzdXBlcmJsb2NrJ3MgYWRkcmVzcywgc2luY2UgaXQgZGlyZWN0bHkgZm9sbG93cyB0aGUgcmVzZXJ2ZWQgYmxvY2tzLgorICovCisjZGVmaW5lIEFHR1JfUlNWRF9CTE9DS1MJU1VQRVIxX0IKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgbWFjcm8gaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgbnVtYmVyIG9mIHJlc2VydmVkIGJ5dGVzIGF0IHRoZQorICogZnJvbnQgb2YgYW4gYWdncmVnYXRlLiAgVGhpcyB2YWx1ZSBpcyBjdXJyZW50bHkgZGVmaW5lZCB0byBiZSAzMksuICBUaGlzCisgKiB0dXJucyBvdXQgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIHByaW1hcnkgc3VwZXJibG9jaydzIGJ5dGUgb2Zmc2V0LCBzaW5jZSBpdAorICogZGlyZWN0bHkgZm9sbG93cyB0aGUgcmVzZXJ2ZWQgYmxvY2tzLgorICovCisjZGVmaW5lIEFHR1JfUlNWRF9CWVRFUwlTVVBFUjFfT0ZGCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIG1hY3JvIGRlZmluZXMgdGhlIGJ5dGUgb2Zmc2V0IGZvciB0aGUgZmlyc3QgaW5vZGUgZXh0ZW50IGluCisgKiB0aGUgYWdncmVnYXRlIGlub2RlIHRhYmxlLiAgVGhpcyBhbGxvd3MgdXMgdG8gZmluZCB0aGUgc2VsZiBpbm9kZSB0byBmaW5kIHRoZQorICogcmVzdCBvZiB0aGUgdGFibGUuICBDdXJyZW50bHkgdGhpcyB2YWx1ZSBpcyA0NEsuCisgKi8KKyNkZWZpbmUgQUdHUl9JTk9ERV9UQUJMRV9TVEFSVAlBSVRCTF9PRkYKKworLyoKKyAqCWZpeGVkIHJlc2VydmVkIGlub2RlIG51bWJlcgorICovCisvKiBhZ2dyZWdhdGUgaW5vZGUgKi8KKyNkZWZpbmUgQUdHUl9SRVNFUlZFRF9JCTAJLyogYWdncmVnYXRlIGlub2RlIChyZXNlcnZlZCkgKi8KKyNkZWZpbmUJQUdHUkVHQVRFX0kJMQkvKiBhZ2dyZWdhdGUgaW5vZGUgbWFwIGlub2RlICovCisjZGVmaW5lCUJNQVBfSQkJMgkvKiBhZ2dyZWdhdGUgYmxvY2sgYWxsb2NhdGlvbiBtYXAgaW5vZGUgKi8KKyNkZWZpbmUJTE9HX0kJCTMJLyogYWdncmVnYXRlIGlubGluZSBsb2cgaW5vZGUgKi8KKyNkZWZpbmUgQkFEQkxPQ0tfSQk0CS8qIGFnZ3JlZ2F0ZSBiYWQgYmxvY2sgaW5vZGUgKi8KKyNkZWZpbmUJRklMRVNZU1RFTV9JCTE2CS8qIDFzdC9vbmx5IGZpbGVzZXQgaW5vZGUgaW4gYWl0OgorCQkJCSAqIGZpbGVzZXQgaW5vZGUgbWFwIGlub2RlCisJCQkJICovCisKKy8qIHBlciBmaWxlc2V0IGlub2RlICovCisjZGVmaW5lIEZJTEVTRVRfUlNWRF9JCTAJLyogZmlsZXNldCBpbm9kZSAocmVzZXJ2ZWQpICovCisjZGVmaW5lIEZJTEVTRVRfRVhUX0kJMQkvKiBmaWxlc2V0IGlub2RlIGV4dGVuc2lvbiAqLworI2RlZmluZQlST09UX0kJCTIJLyogZmlsZXNldCByb290IGlub2RlICovCisjZGVmaW5lIEFDTF9JCQkzCS8qIGZpbGVzZXQgQUNMIGlub2RlICovCisKKyNkZWZpbmUgRklMRVNFVF9PQkpFQ1RfSSA0CS8qIHRoZSBmaXJzdCBmaWxlc2V0IGlub2RlIGF2YWlsYWJsZSBmb3IgYSBmaWxlCisJCQkJICogb3IgZGlyZWN0b3J5IG9yIGxpbmsuLi4KKwkJCQkgKi8KKyNkZWZpbmUgRklSU1RfRklMRVNFVF9JTk8gMTYJLyogdGhlIGZpcnN0IGFnZ3JlZ2F0ZSBpbm9kZSB3aGljaCBkZXNjcmliZXMKKwkJCQkgKiBhbiBpbm9kZS4gIChUbyBmc2NrIHRoaXMgaXMgYWxzbyB0aGUgZmlyc3QKKwkJCQkgKiBpbm9kZSBpbiBwYXJ0IDIgb2YgdGhlIGFnZyBpbm9kZSB0YWJsZS4pCisJCQkJICovCisKKy8qCisgKglkaXJlY3RvcnkgY29uZmlndXJhdGlvbgorICovCisjZGVmaW5lIEpGU19OQU1FX01BWAkyNTUKKyNkZWZpbmUgSkZTX1BBVEhfTUFYCUJQU0laRQorCisKKy8qCisgKglmaWxlIHN5c3RlbSBzdGF0ZSAoc3VwZXJibG9jayBzdGF0ZSkKKyAqLworI2RlZmluZSBGTV9DTEVBTiAweDAwMDAwMDAwCS8qIGZpbGUgc3lzdGVtIGlzIHVubW91bnRlZCBhbmQgY2xlYW4gKi8KKyNkZWZpbmUgRk1fTU9VTlQgMHgwMDAwMDAwMQkvKiBmaWxlIHN5c3RlbSBpcyBtb3VudGVkIGNsZWFubHkgKi8KKyNkZWZpbmUgRk1fRElSVFkgMHgwMDAwMDAwMgkvKiBmaWxlIHN5c3RlbSB3YXMgbm90IHVubW91bnRlZCBhbmQgY2xlYW4gCisJCQkJICogd2hlbiBtb3VudGVkIG9yIAorCQkJCSAqIGNvbW1pdCBmYWlsdXJlIG9jY3VycmVkIHdoaWxlIGJlaW5nIG1vdW50ZWQ6CisJCQkJICogZnNjaygpIG11c3QgYmUgcnVuIHRvIHJlcGFpciAKKwkJCQkgKi8KKyNkZWZpbmUJRk1fTE9HUkVETyAweDAwMDAwMDA0CS8qIGxvZyBiYXNlZCByZWNvdmVyeSAobG9ncmVkbygpKSBmYWlsZWQ6CisJCQkJICogZnNjaygpIG11c3QgYmUgcnVuIHRvIHJlcGFpciAKKwkJCQkgKi8KKyNkZWZpbmUJRk1fRVhURU5ERlMgMHgwMDAwMDAwOAkvKiBmaWxlIHN5c3RlbSBleHRlbmRmcygpIGluIHByb2dyZXNzICovCisKKyNlbmRpZgkJCQkvKiBfSF9KRlNfRklMU1lTICovCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX2ltYXAuYyBiL2ZzL2pmcy9qZnNfaW1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MzgzMTMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZnMvamZzX2ltYXAuYwpAQCAtMCwwICsxLDMyNzAgQEAKKy8qCisgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwMC0yMDA0CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqCWpmc19pbWFwLmM6IGlub2RlIGFsbG9jYXRpb24gbWFwIG1hbmFnZXIKKyAqCisgKiBTZXJpYWxpemF0aW9uOgorICogICBFYWNoIEFHIGhhcyBhIHNpbXBsZSBsb2NrIHdoaWNoIGlzIHVzZWQgdG8gY29udHJvbCB0aGUgc2VyaWFsaXphdGlvbiBvZgorICoJdGhlIEFHIGxldmVsIGxpc3RzLiAgVGhpcyBsb2NrIHNob3VsZCBiZSB0YWtlbiBmaXJzdCB3aGVuZXZlciBhbiBBRworICoJbGV2ZWwgbGlzdCB3aWxsIGJlIG1vZGlmaWVkIG9yIGFjY2Vzc2VkLgorICoKKyAqICAgRWFjaCBJQUcgaXMgbG9ja2VkIGJ5IG9idGFpbmluZyB0aGUgYnVmZmVyIGZvciB0aGUgSUFHIHBhZ2UuCisgKgorICogICBUaGVyZSBpcyBhbHNvIGEgaW5vZGUgbG9jayBmb3IgdGhlIGlub2RlIG1hcCBpbm9kZS4gIEEgcmVhZCBsb2NrIG5lZWRzIHRvCisgKgliZSB0YWtlbiB3aGVuZXZlciBhbiBJQUcgaXMgcmVhZCBmcm9tIHRoZSBtYXAgb3IgdGhlIGdsb2JhbCBsZXZlbAorICoJaW5mb3JtYXRpb24gaXMgcmVhZC4gIEEgd3JpdGUgbG9jayBuZWVkcyB0byBiZSB0YWtlbiB3aGVuZXZlciB0aGUgZ2xvYmFsCisgKglsZXZlbCBpbmZvcm1hdGlvbiBpcyBtb2RpZmllZCBvciBhbiBhdG9taWMgb3BlcmF0aW9uIG5lZWRzIHRvIGJlIHVzZWQuCisgKgorICoJSWYgbW9yZSB0aGFuIG9uZSBJQUcgaXMgcmVhZCBhdCBvbmUgdGltZSwgdGhlIHJlYWQgbG9jayBtYXkgbm90CisgKgliZSBnaXZlbiB1cCB1bnRpbCBhbGwgb2YgdGhlIElBRydzIGFyZSByZWFkLiAgT3RoZXJ3aXNlLCBhIGRlYWRsb2NrCisgKgltYXkgb2NjdXIgd2hlbiB0cnlpbmcgdG8gb2J0YWluIHRoZSByZWFkIGxvY2sgd2hpbGUgYW5vdGhlciB0aHJlYWQKKyAqCWhvbGRpbmcgdGhlIHJlYWQgbG9jayBpcyB3YWl0aW5nIG9uIHRoZSBJQUcgYWxyZWFkeSBiZWluZyBoZWxkLgorICoKKyAqICAgVGhlIGNvbnRyb2wgcGFnZSBvZiB0aGUgaW5vZGUgbWFwIGlzIHJlYWQgaW50byBtZW1vcnkgYnkgZGlNb3VudCgpLgorICoJVGhlcmVhZnRlciBpdCBzaG91bGQgb25seSBiZSBtb2RpZmllZCBpbiBtZW1vcnkgYW5kIHRoZW4gaXQgd2lsbCBiZQorICoJd3JpdHRlbiBvdXQgd2hlbiB0aGUgZmlsZXN5c3RlbSBpcyB1bm1vdW50ZWQgYnkgZGlVbm1vdW50KCkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKworI2luY2x1ZGUgImpmc19pbmNvcmUuaCIKKyNpbmNsdWRlICJqZnNfZmlsc3lzLmgiCisjaW5jbHVkZSAiamZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgImpmc19kbWFwLmgiCisjaW5jbHVkZSAiamZzX2ltYXAuaCIKKyNpbmNsdWRlICJqZnNfbWV0YXBhZ2UuaCIKKyNpbmNsdWRlICJqZnNfc3VwZXJibG9jay5oIgorI2luY2x1ZGUgImpmc19kZWJ1Zy5oIgorCisvKgorICogaW1hcCBsb2NrcworICovCisvKiBpYWcgZnJlZSBsaXN0IGxvY2sgKi8KKyNkZWZpbmUgSUFHRlJFRV9MT0NLX0lOSVQoaW1hcCkJCWluaXRfTVVURVgoJmltYXAtPmltX2ZyZWVsb2NrKQorI2RlZmluZSBJQUdGUkVFX0xPQ0soaW1hcCkJCWRvd24oJmltYXAtPmltX2ZyZWVsb2NrKQorI2RlZmluZSBJQUdGUkVFX1VOTE9DSyhpbWFwKQkJdXAoJmltYXAtPmltX2ZyZWVsb2NrKQorCisvKiBwZXIgYWcgaWFnIGxpc3QgbG9ja3MgKi8KKyNkZWZpbmUgQUdfTE9DS19JTklUKGltYXAsaW5kZXgpCWluaXRfTVVURVgoJihpbWFwLT5pbV9hZ2xvY2tbaW5kZXhdKSkKKyNkZWZpbmUgQUdfTE9DSyhpbWFwLGFnbm8pCQlkb3duKCZpbWFwLT5pbV9hZ2xvY2tbYWdub10pCisjZGVmaW5lIEFHX1VOTE9DSyhpbWFwLGFnbm8pCQl1cCgmaW1hcC0+aW1fYWdsb2NrW2Fnbm9dKQorCisvKgorICogZXh0ZXJuYWwgcmVmZXJlbmNlcworICovCitleHRlcm4gc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBqZnNfYW9wczsKKworLyoKKyAqIGZvcndhcmQgcmVmZXJlbmNlcworICovCitzdGF0aWMgaW50IGRpQWxsb2NBRyhzdHJ1Y3QgaW5vbWFwICosIGludCwgYm9vbGVhbl90LCBzdHJ1Y3QgaW5vZGUgKik7CitzdGF0aWMgaW50IGRpQWxsb2NBbnkoc3RydWN0IGlub21hcCAqLCBpbnQsIGJvb2xlYW5fdCwgc3RydWN0IGlub2RlICopOworc3RhdGljIGludCBkaUFsbG9jQml0KHN0cnVjdCBpbm9tYXAgKiwgc3RydWN0IGlhZyAqLCBpbnQpOworc3RhdGljIGludCBkaUFsbG9jRXh0KHN0cnVjdCBpbm9tYXAgKiwgaW50LCBzdHJ1Y3QgaW5vZGUgKik7CitzdGF0aWMgaW50IGRpQWxsb2NJbm8oc3RydWN0IGlub21hcCAqLCBpbnQsIHN0cnVjdCBpbm9kZSAqKTsKK3N0YXRpYyBpbnQgZGlGaW5kRnJlZSh1MzIsIGludCk7CitzdGF0aWMgaW50IGRpTmV3RXh0KHN0cnVjdCBpbm9tYXAgKiwgc3RydWN0IGlhZyAqLCBpbnQpOworc3RhdGljIGludCBkaU5ld0lBRyhzdHJ1Y3QgaW5vbWFwICosIGludCAqLCBpbnQsIHN0cnVjdCBtZXRhcGFnZSAqKik7CitzdGF0aWMgdm9pZCBkdXBsaWNhdGVJWHRyZWUoc3RydWN0IHN1cGVyX2Jsb2NrICosIHM2NCwgaW50LCBzNjQgKik7CisKK3N0YXRpYyBpbnQgZGlJQUdSZWFkKHN0cnVjdCBpbm9tYXAgKiBpbWFwLCBpbnQsIHN0cnVjdCBtZXRhcGFnZSAqKik7CitzdGF0aWMgaW50IGNvcHlfZnJvbV9kaW5vZGUoc3RydWN0IGRpbm9kZSAqLCBzdHJ1Y3QgaW5vZGUgKik7CitzdGF0aWMgdm9pZCBjb3B5X3RvX2Rpbm9kZShzdHJ1Y3QgZGlub2RlICosIHN0cnVjdCBpbm9kZSAqKTsKKworLyoKKyAqCWRlYnVnIGNvZGUgZm9yIGRvdWJsZS1jaGVja2luZyBpbm9kZSBtYXAKKyAqLworLyogI2RlZmluZQlfSkZTX0RFQlVHX0lNQVAJMSAqLworCisjaWZkZWYJX0pGU19ERUJVR19JTUFQCisjZGVmaW5lIERCR19ESUlOSVQoaW1hcCkJREJHZGlJbml0KGltYXApCisjZGVmaW5lIERCR19ESUFMTE9DKGltYXAsIGlubykJREJHZGlBbGxvYyhpbWFwLCBpbm8pCisjZGVmaW5lIERCR19ESUZSRUUoaW1hcCwgaW5vKQlEQkdkaUZyZWUoaW1hcCwgaW5vKQorCitzdGF0aWMgdm9pZCAqREJHZGlJbml0KHN0cnVjdCBpbm9tYXAgKiBpbWFwKTsKK3N0YXRpYyB2b2lkIERCR2RpQWxsb2Moc3RydWN0IGlub21hcCAqIGltYXAsIGlub190IGlubyk7CitzdGF0aWMgdm9pZCBEQkdkaUZyZWUoc3RydWN0IGlub21hcCAqIGltYXAsIGlub190IGlubyk7CisjZWxzZQorI2RlZmluZSBEQkdfRElJTklUKGltYXApCisjZGVmaW5lIERCR19ESUFMTE9DKGltYXAsIGlubykKKyNkZWZpbmUgREJHX0RJRlJFRShpbWFwLCBpbm8pCisjZW5kaWYJCQkJLyogX0pGU19ERUJVR19JTUFQICovCisKKy8qCisgKiBOQU1FOiAgICAgICAgZGlNb3VudCgpCisgKgorICogRlVOQ1RJT046ICAgIGluaXRpYWxpemUgdGhlIGluY29yZSBpbm9kZSBtYXAgY29udHJvbCBzdHJ1Y3R1cmVzIGZvcgorICoJCWEgZmlsZXNldCBvciBhZ2dyZWdhdGUgaW5pdCB0aW1lLgorICoKKyAqICAgICAgICAgICAgICB0aGUgaW5vZGUgbWFwJ3MgY29udHJvbCBzdHJ1Y3R1cmUgKGRpbm9tYXApIGlzIAorICogICAgICAgICAgICAgIGJyb3VnaHQgaW4gZnJvbSBkaXNrIGFuZCBwbGFjZWQgaW4gdmlydHVhbCBtZW1vcnkuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgaXBpbWFwICAtIHBvaW50ZXIgdG8gaW5vZGUgbWFwIGlub2RlIGZvciB0aGUgYWdncmVnYXRlIG9yIGZpbGVzZXQuCisgKgorICogUkVUVVJOIFZBTFVFUzoKKyAqICAgICAgMCAgICAgICAtIHN1Y2Nlc3MKKyAqICAgICAgLUVOT01FTSAgLSBpbnN1ZmZpY2llbnQgZnJlZSB2aXJ0dWFsIG1lbW9yeS4KKyAqICAgICAgLUVJTyAgCS0gaS9vIGVycm9yLgorICovCitpbnQgZGlNb3VudChzdHJ1Y3QgaW5vZGUgKmlwaW1hcCkKK3sKKwlzdHJ1Y3QgaW5vbWFwICppbWFwOworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJaW50IGluZGV4OworCXN0cnVjdCBkaW5vbWFwX2Rpc2sgKmRpbm9tX2xlOworCisJLyoKKwkgKiBhbGxvY2F0ZS9pbml0aWFsaXplIHRoZSBpbi1tZW1vcnkgaW5vZGUgbWFwIGNvbnRyb2wgc3RydWN0dXJlCisJICovCisJLyogYWxsb2NhdGUgdGhlIGluLW1lbW9yeSBpbm9kZSBtYXAgY29udHJvbCBzdHJ1Y3R1cmUuICovCisJaW1hcCA9IChzdHJ1Y3QgaW5vbWFwICopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpbm9tYXApLCBHRlBfS0VSTkVMKTsKKwlpZiAoaW1hcCA9PSBOVUxMKSB7CisJCWpmc19lcnIoImRpTW91bnQ6IGttYWxsb2MgcmV0dXJuZWQgTlVMTCEiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogcmVhZCB0aGUgb24tZGlzayBpbm9kZSBtYXAgY29udHJvbCBzdHJ1Y3R1cmUuICovCisKKwltcCA9IHJlYWRfbWV0YXBhZ2UoaXBpbWFwLAorCQkJICAgSU1BUEJMS05PIDw8IEpGU19TQkkoaXBpbWFwLT5pX3NiKS0+bDJuYnBlcnBhZ2UsCisJCQkgICBQU0laRSwgMCk7CisJaWYgKG1wID09IE5VTEwpIHsKKwkJa2ZyZWUoaW1hcCk7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIGNvcHkgdGhlIG9uLWRpc2sgdmVyc2lvbiB0byB0aGUgaW4tbWVtb3J5IHZlcnNpb24uICovCisJZGlub21fbGUgPSAoc3RydWN0IGRpbm9tYXBfZGlzayAqKSBtcC0+ZGF0YTsKKwlpbWFwLT5pbV9mcmVlaWFnID0gbGUzMl90b19jcHUoZGlub21fbGUtPmluX2ZyZWVpYWcpOworCWltYXAtPmltX25leHRpYWcgPSBsZTMyX3RvX2NwdShkaW5vbV9sZS0+aW5fbmV4dGlhZyk7CisJYXRvbWljX3NldCgmaW1hcC0+aW1fbnVtaW5vcywgbGUzMl90b19jcHUoZGlub21fbGUtPmluX251bWlub3MpKTsKKwlhdG9taWNfc2V0KCZpbWFwLT5pbV9udW1mcmVlLCBsZTMyX3RvX2NwdShkaW5vbV9sZS0+aW5fbnVtZnJlZSkpOworCWltYXAtPmltX25icGVyaWV4dCA9IGxlMzJfdG9fY3B1KGRpbm9tX2xlLT5pbl9uYnBlcmlleHQpOworCWltYXAtPmltX2wybmJwZXJpZXh0ID0gbGUzMl90b19jcHUoZGlub21fbGUtPmluX2wybmJwZXJpZXh0KTsKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBNQVhBRzsgaW5kZXgrKykgeworCQlpbWFwLT5pbV9hZ2N0bFtpbmRleF0uaW5vZnJlZSA9CisJCSAgICBsZTMyX3RvX2NwdShkaW5vbV9sZS0+aW5fYWdjdGxbaW5kZXhdLmlub2ZyZWUpOworCQlpbWFwLT5pbV9hZ2N0bFtpbmRleF0uZXh0ZnJlZSA9CisJCSAgICBsZTMyX3RvX2NwdShkaW5vbV9sZS0+aW5fYWdjdGxbaW5kZXhdLmV4dGZyZWUpOworCQlpbWFwLT5pbV9hZ2N0bFtpbmRleF0ubnVtaW5vcyA9CisJCSAgICBsZTMyX3RvX2NwdShkaW5vbV9sZS0+aW5fYWdjdGxbaW5kZXhdLm51bWlub3MpOworCQlpbWFwLT5pbV9hZ2N0bFtpbmRleF0ubnVtZnJlZSA9CisJCSAgICBsZTMyX3RvX2NwdShkaW5vbV9sZS0+aW5fYWdjdGxbaW5kZXhdLm51bWZyZWUpOworCX0KKworCS8qIHJlbGVhc2UgdGhlIGJ1ZmZlci4gKi8KKwlyZWxlYXNlX21ldGFwYWdlKG1wKTsKKworCS8qCisJICogYWxsb2NhdGUvaW5pdGlhbGl6ZSBpbm9kZSBhbGxvY2F0aW9uIG1hcCBsb2NrcworCSAqLworCS8qIGFsbG9jYXRlIGFuZCBpbml0IGlhZyBmcmVlIGxpc3QgbG9jayAqLworCUlBR0ZSRUVfTE9DS19JTklUKGltYXApOworCisJLyogYWxsb2NhdGUgYW5kIGluaXQgYWcgbGlzdCBsb2NrcyAqLworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IE1BWEFHOyBpbmRleCsrKSB7CisJCUFHX0xPQ0tfSU5JVChpbWFwLCBpbmRleCk7CisJfQorCisJLyogYmluZCB0aGUgaW5vZGUgbWFwIGlub2RlIGFuZCBpbm9kZSBtYXAgY29udHJvbCBzdHJ1Y3R1cmUKKwkgKiB0byBlYWNoIG90aGVyLgorCSAqLworCWltYXAtPmltX2lwaW1hcCA9IGlwaW1hcDsKKwlKRlNfSVAoaXBpbWFwKS0+aV9pbWFwID0gaW1hcDsKKworLy8gICAgICBEQkdfRElJTklUKGltYXApOworCisJcmV0dXJuICgwKTsKK30KKworCisvKgorICogTkFNRTogICAgICAgIGRpVW5tb3VudCgpCisgKgorICogRlVOQ1RJT046ICAgIHdyaXRlIHRvIGRpc2sgdGhlIGluY29yZSBpbm9kZSBtYXAgY29udHJvbCBzdHJ1Y3R1cmVzIGZvcgorICoJCWEgZmlsZXNldCBvciBhZ2dyZWdhdGUgYXQgdW5tb3VudCB0aW1lLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIGlwaW1hcCAgLSBwb2ludGVyIHRvIGlub2RlIG1hcCBpbm9kZSBmb3IgdGhlIGFnZ3JlZ2F0ZSBvciBmaWxlc2V0LgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIDAgICAgICAgLSBzdWNjZXNzCisgKiAgICAgIC1FTk9NRU0gIC0gaW5zdWZmaWNpZW50IGZyZWUgdmlydHVhbCBtZW1vcnkuCisgKiAgICAgIC1FSU8gIAktIGkvbyBlcnJvci4KKyAqLworaW50IGRpVW5tb3VudChzdHJ1Y3QgaW5vZGUgKmlwaW1hcCwgaW50IG1vdW50ZXJyb3IpCit7CisJc3RydWN0IGlub21hcCAqaW1hcCA9IEpGU19JUChpcGltYXApLT5pX2ltYXA7CisKKwkvKgorCSAqIHVwZGF0ZSB0aGUgb24tZGlzayBpbm9kZSBtYXAgY29udHJvbCBzdHJ1Y3R1cmUKKwkgKi8KKworCWlmICghKG1vdW50ZXJyb3IgfHwgaXNSZWFkT25seShpcGltYXApKSkKKwkJZGlTeW5jKGlwaW1hcCk7CisKKwkvKgorCSAqIEludmFsaWRhdGUgdGhlIHBhZ2UgY2FjaGUgYnVmZmVycworCSAqLworCXRydW5jYXRlX2lub2RlX3BhZ2VzKGlwaW1hcC0+aV9tYXBwaW5nLCAwKTsKKworCS8qCisJICogZnJlZSBpbi1tZW1vcnkgY29udHJvbCBzdHJ1Y3R1cmUKKwkgKi8KKwlrZnJlZShpbWFwKTsKKworCXJldHVybiAoMCk7Cit9CisKKworLyoKKyAqCWRpU3luYygpCisgKi8KK2ludCBkaVN5bmMoc3RydWN0IGlub2RlICppcGltYXApCit7CisJc3RydWN0IGRpbm9tYXBfZGlzayAqZGlub21fbGU7CisJc3RydWN0IGlub21hcCAqaW1wID0gSkZTX0lQKGlwaW1hcCktPmlfaW1hcDsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCWludCBpbmRleDsKKworCS8qCisJICogd3JpdGUgaW1hcCBnbG9iYWwgY29ucm9sIHBhZ2UKKwkgKi8KKwkvKiByZWFkIHRoZSBvbi1kaXNrIGlub2RlIG1hcCBjb250cm9sIHN0cnVjdHVyZSAqLworCW1wID0gZ2V0X21ldGFwYWdlKGlwaW1hcCwKKwkJCSAgSU1BUEJMS05PIDw8IEpGU19TQkkoaXBpbWFwLT5pX3NiKS0+bDJuYnBlcnBhZ2UsCisJCQkgIFBTSVpFLCAwKTsKKwlpZiAobXAgPT0gTlVMTCkgeworCQlqZnNfZXJyKCJkaVN5bmM6IGdldF9tZXRhcGFnZSBmYWlsZWQhIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIGNvcHkgdGhlIGluLW1lbW9yeSB2ZXJzaW9uIHRvIHRoZSBvbi1kaXNrIHZlcnNpb24gKi8KKwlkaW5vbV9sZSA9IChzdHJ1Y3QgZGlub21hcF9kaXNrICopIG1wLT5kYXRhOworCWRpbm9tX2xlLT5pbl9mcmVlaWFnID0gY3B1X3RvX2xlMzIoaW1wLT5pbV9mcmVlaWFnKTsKKwlkaW5vbV9sZS0+aW5fbmV4dGlhZyA9IGNwdV90b19sZTMyKGltcC0+aW1fbmV4dGlhZyk7CisJZGlub21fbGUtPmluX251bWlub3MgPSBjcHVfdG9fbGUzMihhdG9taWNfcmVhZCgmaW1wLT5pbV9udW1pbm9zKSk7CisJZGlub21fbGUtPmluX251bWZyZWUgPSBjcHVfdG9fbGUzMihhdG9taWNfcmVhZCgmaW1wLT5pbV9udW1mcmVlKSk7CisJZGlub21fbGUtPmluX25icGVyaWV4dCA9IGNwdV90b19sZTMyKGltcC0+aW1fbmJwZXJpZXh0KTsKKwlkaW5vbV9sZS0+aW5fbDJuYnBlcmlleHQgPSBjcHVfdG9fbGUzMihpbXAtPmltX2wybmJwZXJpZXh0KTsKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBNQVhBRzsgaW5kZXgrKykgeworCQlkaW5vbV9sZS0+aW5fYWdjdGxbaW5kZXhdLmlub2ZyZWUgPQorCQkgICAgY3B1X3RvX2xlMzIoaW1wLT5pbV9hZ2N0bFtpbmRleF0uaW5vZnJlZSk7CisJCWRpbm9tX2xlLT5pbl9hZ2N0bFtpbmRleF0uZXh0ZnJlZSA9CisJCSAgICBjcHVfdG9fbGUzMihpbXAtPmltX2FnY3RsW2luZGV4XS5leHRmcmVlKTsKKwkJZGlub21fbGUtPmluX2FnY3RsW2luZGV4XS5udW1pbm9zID0KKwkJICAgIGNwdV90b19sZTMyKGltcC0+aW1fYWdjdGxbaW5kZXhdLm51bWlub3MpOworCQlkaW5vbV9sZS0+aW5fYWdjdGxbaW5kZXhdLm51bWZyZWUgPQorCQkgICAgY3B1X3RvX2xlMzIoaW1wLT5pbV9hZ2N0bFtpbmRleF0ubnVtZnJlZSk7CisJfQorCisJLyogd3JpdGUgb3V0IHRoZSBjb250cm9sIHN0cnVjdHVyZSAqLworCXdyaXRlX21ldGFwYWdlKG1wKTsKKworCS8qCisJICogd3JpdGUgb3V0IGRpcnR5IHBhZ2VzIG9mIGltYXAKKwkgKi8KKwlmaWxlbWFwX2ZkYXRhd3JpdGUoaXBpbWFwLT5pX21hcHBpbmcpOworCWZpbGVtYXBfZmRhdGF3YWl0KGlwaW1hcC0+aV9tYXBwaW5nKTsKKworCWRpV3JpdGVTcGVjaWFsKGlwaW1hcCwgMCk7CisKKwlyZXR1cm4gKDApOworfQorCisKKy8qCisgKiBOQU1FOiAgICAgICAgZGlSZWFkKCkKKyAqCisgKiBGVU5DVElPTjogICAgaW5pdGlhbGl6ZSBhbiBpbmNvcmUgaW5vZGUgZnJvbSBkaXNrLgorICoKKyAqCQlvbiBlbnRyeSwgdGhlIHNwZWNpZmVkIGluY29yZSBpbm9kZSBzaG91bGQgaXRzZWxmCisgKgkJc3BlY2lmeSB0aGUgZGlzayBpbm9kZSBudW1iZXIgY29ycmVzcG9uZGluZyB0byB0aGUKKyAqCQlpbmNvcmUgaW5vZGUgKGkuZS4gaV9udW1iZXIgc2hvdWxkIGJlIGluaXRpYWxpemVkKS4KKyAqCQkKKyAqCQl0aGlzIHJvdXRpbmUgaGFuZGxlcyBpbmNvcmUgaW5vZGUgaW5pdGlhbGl6YXRpb24gZm9yCisgKgkJYm90aCAic3BlY2lhbCIgYW5kICJyZWd1bGFyIiBpbm9kZXMuICBzcGVjaWFsIGlub2RlcworICoJCWFyZSB0aG9zZSByZXF1aXJlZCBlYXJseSBpbiB0aGUgbW91bnQgcHJvY2VzcyBhbmQKKyAqCSAgICAgICAgcmVxdWlyZSBzcGVjaWFsIGhhbmRsaW5nIHNpbmNlIG11Y2ggb2YgdGhlIGZpbGUgc3lzdGVtCisgKgkJaXMgbm90IHlldCBpbml0aWFsaXplZC4gIHRoZXNlICJzcGVjaWFsIiBpbm9kZXMgYXJlCisgKgkJaWRlbnRpZmllZCBieSBhIE5VTEwgaW5vZGUgbWFwIGlub2RlIHBvaW50ZXIgYW5kIGFyZQorICoJCWFjdHVhbGx5IGluaXRpYWxpemVkIGJ5IGEgY2FsbCB0byBkaVJlYWRTcGVjaWFsKCkuCisgKgkJCisgKgkJZm9yIHJlZ3VsYXIgaW5vZGVzLCB0aGUgaWFnIGRlc2NyaWJpbmcgdGhlIGRpc2sgaW5vZGUKKyAqCQlpcyByZWFkIGZyb20gZGlzayB0byBkZXRlcm1pbmUgdGhlIGlub2RlIGV4dGVudCBhZGRyZXNzCisgKgkJZm9yIHRoZSBkaXNrIGlub2RlLiAgd2l0aCB0aGUgaW5vZGUgZXh0ZW50IGFkZHJlc3MgaW4KKyAqCQloYW5kLCB0aGUgcGFnZSBvZiB0aGUgZXh0ZW50IHRoYXQgY29udGFpbnMgdGhlIGRpc2sKKyAqCQlpbm9kZSBpcyByZWFkIGFuZCB0aGUgZGlzayBpbm9kZSBpcyBjb3BpZWQgdG8gdGhlCisgKgkJaW5jb3JlIGlub2RlLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIGlwICAtICBwb2ludGVyIHRvIGluY29yZSBpbm9kZSB0byBiZSBpbml0aWFsaXplZCBmcm9tIGRpc2suCisgKgorICogUkVUVVJOIFZBTFVFUzoKKyAqICAgICAgMCAgICAgICAtIHN1Y2Nlc3MKKyAqICAgICAgLUVJTyAgCS0gaS9vIGVycm9yLgorICogICAgICAtRU5PTUVNCS0gaW5zdWZmaWNpZW50IG1lbW9yeQorICogICAgICAKKyAqLworaW50IGRpUmVhZChzdHJ1Y3QgaW5vZGUgKmlwKQoreworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpID0gSkZTX1NCSShpcC0+aV9zYik7CisJaW50IGlhZ25vLCBpbm8sIGV4dG5vLCByYzsKKwlzdHJ1Y3QgaW5vZGUgKmlwaW1hcDsKKwlzdHJ1Y3QgZGlub2RlICpkcDsKKwlzdHJ1Y3QgaWFnICppYWdwOworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJczY0IGJsa25vLCBhZ3N0YXJ0OworCXN0cnVjdCBpbm9tYXAgKmltYXA7CisJaW50IGJsb2NrX29mZnNldDsKKwlpbnQgaW5vZGVzX2xlZnQ7CisJdWludCBwYWdlbm87CisJaW50IHJlbF9pbm9kZTsKKworCWpmc19pbmZvKCJkaVJlYWQ6IGlubyA9ICVsZCIsIGlwLT5pX2lubyk7CisKKwlpcGltYXAgPSBzYmktPmlwaW1hcDsKKwlKRlNfSVAoaXApLT5pcGltYXAgPSBpcGltYXA7CisKKwkvKiBkZXRlcm1pbmUgdGhlIGlhZyBudW1iZXIgZm9yIHRoaXMgaW5vZGUgKG51bWJlcikgKi8KKwlpYWdubyA9IElOT1RPSUFHKGlwLT5pX2lubyk7CisKKwkvKiByZWFkIHRoZSBpYWcgKi8KKwlpbWFwID0gSkZTX0lQKGlwaW1hcCktPmlfaW1hcDsKKwlJUkVBRF9MT0NLKGlwaW1hcCk7CisJcmMgPSBkaUlBR1JlYWQoaW1hcCwgaWFnbm8sICZtcCk7CisJSVJFQURfVU5MT0NLKGlwaW1hcCk7CisJaWYgKHJjKSB7CisJCWpmc19lcnIoImRpUmVhZDogZGlJQUdSZWFkIHJldHVybmVkICVkIiwgcmMpOworCQlyZXR1cm4gKHJjKTsKKwl9CisKKwlpYWdwID0gKHN0cnVjdCBpYWcgKikgbXAtPmRhdGE7CisKKwkvKiBkZXRlcm1pbmUgaW5vZGUgZXh0ZW50IHRoYXQgaG9sZHMgdGhlIGRpc2sgaW5vZGUgKi8KKwlpbm8gPSBpcC0+aV9pbm8gJiAoSU5PU1BFUklBRyAtIDEpOworCWV4dG5vID0gaW5vID4+IEwySU5PU1BFUkVYVDsKKworCWlmICgobGVuZ3RoUFhEKCZpYWdwLT5pbm9leHRbZXh0bm9dKSAhPSBpbWFwLT5pbV9uYnBlcmlleHQpIHx8CisJICAgIChhZGRyZXNzUFhEKCZpYWdwLT5pbm9leHRbZXh0bm9dKSA9PSAwKSkgeworCQlyZWxlYXNlX21ldGFwYWdlKG1wKTsKKwkJcmV0dXJuIC1FU1RBTEU7CisJfQorCisJLyogZ2V0IGRpc2sgYmxvY2sgbnVtYmVyIG9mIHRoZSBwYWdlIHdpdGhpbiB0aGUgaW5vZGUgZXh0ZW50CisJICogdGhhdCBob2xkcyB0aGUgZGlzayBpbm9kZS4KKwkgKi8KKwlibGtubyA9IElOT1BCTEsoJmlhZ3AtPmlub2V4dFtleHRub10sIGlubywgc2JpLT5sMm5icGVycGFnZSk7CisKKwkvKiBnZXQgdGhlIGFnIGZvciB0aGUgaWFnICovCisJYWdzdGFydCA9IGxlNjRfdG9fY3B1KGlhZ3AtPmFnc3RhcnQpOworCisJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisKKwlyZWxfaW5vZGUgPSAoaW5vICYgKElOT1NQRVJQQUdFIC0gMSkpOworCXBhZ2VubyA9IGJsa25vID4+IHNiaS0+bDJuYnBlcnBhZ2U7CisKKwlpZiAoKGJsb2NrX29mZnNldCA9ICgodTMyKSBibGtubyAmIChzYmktPm5icGVycGFnZSAtIDEpKSkpIHsKKwkJLyoKKwkJICogT1MvMiBkaWRuJ3QgYWx3YXlzIGFsaWduIGlub2RlIGV4dGVudHMgb24gcGFnZSBib3VuZGFyaWVzCisJCSAqLworCQlpbm9kZXNfbGVmdCA9CisJCSAgICAgKHNiaS0+bmJwZXJwYWdlIC0gYmxvY2tfb2Zmc2V0KSA8PCBzYmktPmwybmlwZXJibGs7CisKKwkJaWYgKHJlbF9pbm9kZSA8IGlub2Rlc19sZWZ0KQorCQkJcmVsX2lub2RlICs9IGJsb2NrX29mZnNldCA8PCBzYmktPmwybmlwZXJibGs7CisJCWVsc2UgeworCQkJcGFnZW5vICs9IDE7CisJCQlyZWxfaW5vZGUgLT0gaW5vZGVzX2xlZnQ7CisJCX0KKwl9CisKKwkvKiByZWFkIHRoZSBwYWdlIG9mIGRpc2sgaW5vZGUgKi8KKwltcCA9IHJlYWRfbWV0YXBhZ2UoaXBpbWFwLCBwYWdlbm8gPDwgc2JpLT5sMm5icGVycGFnZSwgUFNJWkUsIDEpOworCWlmIChtcCA9PSAwKSB7CisJCWpmc19lcnIoImRpUmVhZDogcmVhZF9tZXRhcGFnZSBmYWlsZWQiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogbG9jYXRlIHRoZSB0aGUgZGlzayBpbm9kZSByZXF1ZXN0ZWQgKi8KKwlkcCA9IChzdHJ1Y3QgZGlub2RlICopIG1wLT5kYXRhOworCWRwICs9IHJlbF9pbm9kZTsKKworCWlmIChpcC0+aV9pbm8gIT0gbGUzMl90b19jcHUoZHAtPmRpX251bWJlcikpIHsKKwkJamZzX2Vycm9yKGlwLT5pX3NiLCAiZGlSZWFkOiBpX2lubyAhPSBkaV9udW1iZXIiKTsKKwkJcmMgPSAtRUlPOworCX0gZWxzZSBpZiAobGUzMl90b19jcHUoZHAtPmRpX25saW5rKSA9PSAwKQorCQlyYyA9IC1FU1RBTEU7CisJZWxzZQorCQkvKiBjb3B5IHRoZSBkaXNrIGlub2RlIHRvIHRoZSBpbi1tZW1vcnkgaW5vZGUgKi8KKwkJcmMgPSBjb3B5X2Zyb21fZGlub2RlKGRwLCBpcCk7CisKKwlyZWxlYXNlX21ldGFwYWdlKG1wKTsKKworCS8qIHNldCB0aGUgYWcgZm9yIHRoZSBpbm9kZSAqLworCUpGU19JUChpcCktPmFnbm8gPSBCTEtUT0FHKGFnc3RhcnQsIHNiaSk7CisJSkZTX0lQKGlwKS0+YWN0aXZlX2FnID0gLTE7CisKKwlyZXR1cm4gKHJjKTsKK30KKworCisvKgorICogTkFNRTogICAgICAgIGRpUmVhZFNwZWNpYWwoKQorICoKKyAqIEZVTkNUSU9OOiAgICBpbml0aWFsaXplIGEgJ3NwZWNpYWwnIGlub2RlIGZyb20gZGlzay4KKyAqCisgKgkJdGhpcyByb3V0aW5lcyBoYW5kbGVzIGFnZ3JlZ2F0ZSBsZXZlbCBpbm9kZXMuICBUaGUKKyAqCQlpbm9kZSBjYWNoZSBjYW5ub3QgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRoZQorICoJCWFnZ3JlZ2F0ZSBpbm9kZXMgYW5kIHRoZSBmaWxlc3lzdGVtIGlub2Rlcywgc28gd2UKKyAqCQloYW5kbGUgdGhlc2UgaGVyZS4gIFdlIGRvbid0IGFjdHVhbGx5IHVzZSB0aGUgYWdncmVnYXRlCisgKgkgICAgICAgIGlub2RlIG1hcCwgc2luY2UgdGhlc2UgaW5vZGVzIGFyZSBhdCBhIGZpeGVkIGxvY2F0aW9uCisgKgkJYW5kIGluIHNvbWUgY2FzZXMgdGhlIGFnZ3JlZ2F0ZSBpbm9kZSBtYXAgaXNuJ3QgaW5pdGlhbGl6ZWQKKyAqCQl5ZXQuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgc2IgLSBmaWxlc3lzdGVtIHN1cGVyYmxvY2sKKyAqCWludW0gLSBhZ2dyZWdhdGUgaW5vZGUgbnVtYmVyCisgKglzZWNvbmRhcnkgLSAxIGlmIHNlY29uZGFyeSBhZ2dyZWdhdGUgaW5vZGUgdGFibGUKKyAqCisgKiBSRVRVUk4gVkFMVUVTOgorICogICAgICBuZXcgaW5vZGUJLSBzdWNjZXNzCisgKiAgICAgIE5VTEwJCS0gaS9vIGVycm9yLgorICovCitzdHJ1Y3QgaW5vZGUgKmRpUmVhZFNwZWNpYWwoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW5vX3QgaW51bSwgaW50IHNlY29uZGFyeSkKK3sKKwlzdHJ1Y3QgamZzX3NiX2luZm8gKnNiaSA9IEpGU19TQkkoc2IpOworCXVpbnQgYWRkcmVzczsKKwlzdHJ1Y3QgZGlub2RlICpkcDsKKwlzdHJ1Y3QgaW5vZGUgKmlwOworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisKKwlpcCA9IG5ld19pbm9kZShzYik7CisJaWYgKGlwID09IE5VTEwpIHsKKwkJamZzX2VycigiZGlSZWFkU3BlY2lhbDogbmV3X2lub2RlIHJldHVybmVkIE5VTEwhIik7CisJCXJldHVybiBpcDsKKwl9CisKKwlpZiAoc2Vjb25kYXJ5KSB7CisJCWFkZHJlc3MgPSBhZGRyZXNzUFhEKCZzYmktPmFpdDIpID4+IHNiaS0+bDJuYnBlcnBhZ2U7CisJCUpGU19JUChpcCktPmlwaW1hcCA9IHNiaS0+aXBhaW1hcDI7CisJfSBlbHNlIHsKKwkJYWRkcmVzcyA9IEFJVEJMX09GRiA+PiBMMlBTSVpFOworCQlKRlNfSVAoaXApLT5pcGltYXAgPSBzYmktPmlwYWltYXA7CisJfQorCisJQVNTRVJUKGludW0gPCBJTk9TUEVSRVhUKTsKKworCWlwLT5pX2lubyA9IGludW07CisKKwlhZGRyZXNzICs9IGludW0gPj4gMzsJLyogOCBpbm9kZXMgcGVyIDRLIHBhZ2UgKi8KKworCS8qIHJlYWQgdGhlIHBhZ2Ugb2YgZml4ZWQgZGlzayBpbm9kZSAoQUlUKSBpbiByYXcgbW9kZSAqLworCW1wID0gcmVhZF9tZXRhcGFnZShpcCwgYWRkcmVzcyA8PCBzYmktPmwybmJwZXJwYWdlLCBQU0laRSwgMSk7CisJaWYgKG1wID09IE5VTEwpIHsKKwkJaXAtPmlfbmxpbmsgPSAxOwkvKiBEb24ndCB3YW50IGlwdXQoKSBkZWxldGluZyBpdCAqLworCQlpcHV0KGlwKTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwkvKiBnZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGRpc2sgaW5vZGUgb2YgaW50ZXJlc3QgKi8KKwlkcCA9IChzdHJ1Y3QgZGlub2RlICopIChtcC0+ZGF0YSk7CisJZHAgKz0gaW51bSAlIDg7CQkvKiA4IGlub2RlcyBwZXIgNEsgcGFnZSAqLworCisJLyogY29weSBvbi1kaXNrIGlub2RlIHRvIGluLW1lbW9yeSBpbm9kZSAqLworCWlmICgoY29weV9mcm9tX2Rpbm9kZShkcCwgaXApKSAhPSAwKSB7CisJCS8qIGhhbmRsZSBiYWQgcmV0dXJuIGJ5IHJldHVybmluZyBOVUxMIGZvciBpcCAqLworCQlpcC0+aV9ubGluayA9IDE7CS8qIERvbid0IHdhbnQgaXB1dCgpIGRlbGV0aW5nIGl0ICovCisJCWlwdXQoaXApOworCQkvKiByZWxlYXNlIHRoZSBwYWdlICovCisJCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCQlyZXR1cm4gKE5VTEwpOworCisJfQorCisJaXAtPmlfbWFwcGluZy0+YV9vcHMgPSAmamZzX2FvcHM7CisJbWFwcGluZ19zZXRfZ2ZwX21hc2soaXAtPmlfbWFwcGluZywgR0ZQX05PRlMpOworCisJLyogQWxsb2NhdGlvbnMgdG8gbWV0YWRhdGEgaW5vZGVzIHNob3VsZCBub3QgYWZmZWN0IHF1b3RhcyAqLworCWlwLT5pX2ZsYWdzIHw9IFNfTk9RVU9UQTsKKworCWlmICgoaW51bSA9PSBGSUxFU1lTVEVNX0kpICYmIChKRlNfSVAoaXApLT5pcGltYXAgPT0gc2JpLT5pcGFpbWFwKSkgeworCQlzYmktPmdlbmdlbiA9IGxlMzJfdG9fY3B1KGRwLT5kaV9nZW5nZW4pOworCQlzYmktPmlub3N0YW1wID0gbGUzMl90b19jcHUoZHAtPmRpX2lub3N0YW1wKTsKKwl9CisKKwkvKiByZWxlYXNlIHRoZSBwYWdlICovCisJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisKKwlyZXR1cm4gKGlwKTsKK30KKworLyoKKyAqIE5BTUU6ICAgICAgICBkaVdyaXRlU3BlY2lhbCgpCisgKgorICogRlVOQ1RJT046ICAgIFdyaXRlIHRoZSBzcGVjaWFsIGlub2RlIHRvIGRpc2sKKyAqCisgKiBQQVJBTUVURVJTOgorICogICAgICBpcCAtIHNwZWNpYWwgaW5vZGUKKyAqCXNlY29uZGFyeSAtIDEgaWYgc2Vjb25kYXJ5IGFnZ3JlZ2F0ZSBpbm9kZSB0YWJsZQorICoKKyAqIFJFVFVSTiBWQUxVRVM6IG5vbmUKKyAqLworCit2b2lkIGRpV3JpdGVTcGVjaWFsKHN0cnVjdCBpbm9kZSAqaXAsIGludCBzZWNvbmRhcnkpCit7CisJc3RydWN0IGpmc19zYl9pbmZvICpzYmkgPSBKRlNfU0JJKGlwLT5pX3NiKTsKKwl1aW50IGFkZHJlc3M7CisJc3RydWN0IGRpbm9kZSAqZHA7CisJaW5vX3QgaW51bSA9IGlwLT5pX2lubzsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCisJaXAtPmlfc3RhdGUgJj0gfklfRElSVFk7CisKKwlpZiAoc2Vjb25kYXJ5KQorCQlhZGRyZXNzID0gYWRkcmVzc1BYRCgmc2JpLT5haXQyKSA+PiBzYmktPmwybmJwZXJwYWdlOworCWVsc2UKKwkJYWRkcmVzcyA9IEFJVEJMX09GRiA+PiBMMlBTSVpFOworCisJQVNTRVJUKGludW0gPCBJTk9TUEVSRVhUKTsKKworCWFkZHJlc3MgKz0gaW51bSA+PiAzOwkvKiA4IGlub2RlcyBwZXIgNEsgcGFnZSAqLworCisJLyogcmVhZCB0aGUgcGFnZSBvZiBmaXhlZCBkaXNrIGlub2RlIChBSVQpIGluIHJhdyBtb2RlICovCisJbXAgPSByZWFkX21ldGFwYWdlKGlwLCBhZGRyZXNzIDw8IHNiaS0+bDJuYnBlcnBhZ2UsIFBTSVpFLCAxKTsKKwlpZiAobXAgPT0gTlVMTCkgeworCQlqZnNfZXJyKCJkaVdyaXRlU3BlY2lhbDogZmFpbGVkIHRvIHJlYWQgYWdncmVnYXRlIGlub2RlICIKKwkJCSJleHRlbnQhIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBnZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGRpc2sgaW5vZGUgb2YgaW50ZXJlc3QgKi8KKwlkcCA9IChzdHJ1Y3QgZGlub2RlICopIChtcC0+ZGF0YSk7CisJZHAgKz0gaW51bSAlIDg7CQkvKiA4IGlub2RlcyBwZXIgNEsgcGFnZSAqLworCisJLyogY29weSBvbi1kaXNrIGlub2RlIHRvIGluLW1lbW9yeSBpbm9kZSAqLworCWNvcHlfdG9fZGlub2RlKGRwLCBpcCk7CisJbWVtY3B5KCZkcC0+ZGlfeHRyb290LCAmSkZTX0lQKGlwKS0+aV94dHJvb3QsIDI4OCk7CisKKwlpZiAoaW51bSA9PSBGSUxFU1lTVEVNX0kpCisJCWRwLT5kaV9nZW5nZW4gPSBjcHVfdG9fbGUzMihzYmktPmdlbmdlbik7CisKKwkvKiB3cml0ZSB0aGUgcGFnZSAqLworCXdyaXRlX21ldGFwYWdlKG1wKTsKK30KKworLyoKKyAqIE5BTUU6ICAgICAgICBkaUZyZWVTcGVjaWFsKCkKKyAqCisgKiBGVU5DVElPTjogICAgRnJlZSBhbGxvY2F0ZWQgc3BhY2UgZm9yIHNwZWNpYWwgaW5vZGUKKyAqLwordm9pZCBkaUZyZWVTcGVjaWFsKHN0cnVjdCBpbm9kZSAqaXApCit7CisJaWYgKGlwID09IE5VTEwpIHsKKwkJamZzX2VycigiZGlGcmVlU3BlY2lhbCBjYWxsZWQgd2l0aCBOVUxMIGlwISIpOworCQlyZXR1cm47CisJfQorCWZpbGVtYXBfZmRhdGF3cml0ZShpcC0+aV9tYXBwaW5nKTsKKwlmaWxlbWFwX2ZkYXRhd2FpdChpcC0+aV9tYXBwaW5nKTsKKwl0cnVuY2F0ZV9pbm9kZV9wYWdlcyhpcC0+aV9tYXBwaW5nLCAwKTsKKwlpcHV0KGlwKTsKK30KKworCisKKy8qCisgKiBOQU1FOiAgICAgICAgZGlXcml0ZSgpCisgKgorICogRlVOQ1RJT046ICAgIHdyaXRlIHRoZSBvbi1kaXNrIGlub2RlIHBvcnRpb24gb2YgdGhlIGluLW1lbW9yeSBpbm9kZQorICoJCXRvIGl0cyBjb3JyZXNwb25kaW5nIG9uLWRpc2sgaW5vZGUuCisgKgorICoJCW9uIGVudHJ5LCB0aGUgc3BlY2lmZWQgaW5jb3JlIGlub2RlIHNob3VsZCBpdHNlbGYKKyAqCQlzcGVjaWZ5IHRoZSBkaXNrIGlub2RlIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIHRoZQorICoJCWluY29yZSBpbm9kZSAoaS5lLiBpX251bWJlciBzaG91bGQgYmUgaW5pdGlhbGl6ZWQpLgorICoKKyAqCQl0aGUgaW5vZGUgY29udGFpbnMgdGhlIGlub2RlIGV4dGVudCBhZGRyZXNzIGZvciB0aGUgZGlzaworICoJCWlub2RlLiAgd2l0aCB0aGUgaW5vZGUgZXh0ZW50IGFkZHJlc3MgaW4gaGFuZCwgdGhlCisgKgkJcGFnZSBvZiB0aGUgZXh0ZW50IHRoYXQgY29udGFpbnMgdGhlIGRpc2sgaW5vZGUgaXMKKyAqCQlyZWFkIGFuZCB0aGUgZGlzayBpbm9kZSBwb3J0aW9uIG9mIHRoZSBpbmNvcmUgaW5vZGUKKyAqCQlpcyBjb3BpZWQgdG8gdGhlIGRpc2sgaW5vZGUuCisgKgkJCisgKiBQQVJBTUVURVJTOgorICoJdGlkIC0gIHRyYW5zYWNhdGlvbiBpZAorICogICAgICBpcCAgLSAgcG9pbnRlciB0byBpbmNvcmUgaW5vZGUgdG8gYmUgd3JpdHRlbiB0byB0aGUgaW5vZGUgZXh0ZW50LgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIDAgICAgICAgLSBzdWNjZXNzCisgKiAgICAgIC1FSU8gIAktIGkvbyBlcnJvci4KKyAqLworaW50IGRpV3JpdGUodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwKQoreworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpID0gSkZTX1NCSShpcC0+aV9zYik7CisJc3RydWN0IGpmc19pbm9kZV9pbmZvICpqZnNfaXAgPSBKRlNfSVAoaXApOworCWludCByYyA9IDA7CisJczMyIGlubzsKKwlzdHJ1Y3QgZGlub2RlICpkcDsKKwlzNjQgYmxrbm87CisJaW50IGJsb2NrX29mZnNldDsKKwlpbnQgaW5vZGVzX2xlZnQ7CisJc3RydWN0IG1ldGFwYWdlICptcDsKKwl1aW50IHBhZ2VubzsKKwlpbnQgcmVsX2lub2RlOworCWludCBkaW9mZnNldDsKKwlzdHJ1Y3QgaW5vZGUgKmlwaW1hcDsKKwl1aW50IHR5cGU7CisJbGlkX3QgbGlkOworCXN0cnVjdCB0bG9jayAqZGl0bGNrLCAqdGxjazsKKwlzdHJ1Y3QgbGluZWxvY2sgKmRpbGluZWxvY2ssICppbGluZWxvY2s7CisJc3RydWN0IGx2ICpsdjsKKwlpbnQgbjsKKworCWlwaW1hcCA9IGpmc19pcC0+aXBpbWFwOworCisJaW5vID0gaXAtPmlfaW5vICYgKElOT1NQRVJJQUcgLSAxKTsKKworCWlmICghYWRkcmVzc1BYRCgmKGpmc19pcC0+aXhweGQpKSB8fAorCSAgICAobGVuZ3RoUFhEKCYoamZzX2lwLT5peHB4ZCkpICE9CisJICAgICBKRlNfSVAoaXBpbWFwKS0+aV9pbWFwLT5pbV9uYnBlcmlleHQpKSB7CisJCWpmc19lcnJvcihpcC0+aV9zYiwgImRpV3JpdGU6IGl4cHhkIGludmFsaWQiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyoKKwkgKiByZWFkIHRoZSBwYWdlIG9mIGRpc2sgaW5vZGUgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIGlub2RlOgorCSAqLworCS8qIGNvbXB1dGUgdGhlIGJsb2NrIGFkZHJlc3Mgb2YgdGhlIHBhZ2UgKi8KKwlibGtubyA9IElOT1BCTEsoJihqZnNfaXAtPml4cHhkKSwgaW5vLCBzYmktPmwybmJwZXJwYWdlKTsKKworCXJlbF9pbm9kZSA9IChpbm8gJiAoSU5PU1BFUlBBR0UgLSAxKSk7CisJcGFnZW5vID0gYmxrbm8gPj4gc2JpLT5sMm5icGVycGFnZTsKKworCWlmICgoYmxvY2tfb2Zmc2V0ID0gKCh1MzIpIGJsa25vICYgKHNiaS0+bmJwZXJwYWdlIC0gMSkpKSkgeworCQkvKgorCQkgKiBPUy8yIGRpZG4ndCBhbHdheXMgYWxpZ24gaW5vZGUgZXh0ZW50cyBvbiBwYWdlIGJvdW5kYXJpZXMKKwkJICovCisJCWlub2Rlc19sZWZ0ID0KKwkJICAgIChzYmktPm5icGVycGFnZSAtIGJsb2NrX29mZnNldCkgPDwgc2JpLT5sMm5pcGVyYmxrOworCisJCWlmIChyZWxfaW5vZGUgPCBpbm9kZXNfbGVmdCkKKwkJCXJlbF9pbm9kZSArPSBibG9ja19vZmZzZXQgPDwgc2JpLT5sMm5pcGVyYmxrOworCQllbHNlIHsKKwkJCXBhZ2VubyArPSAxOworCQkJcmVsX2lub2RlIC09IGlub2Rlc19sZWZ0OworCQl9CisJfQorCS8qIHJlYWQgdGhlIHBhZ2Ugb2YgZGlzayBpbm9kZSAqLworICAgICAgcmV0cnk6CisJbXAgPSByZWFkX21ldGFwYWdlKGlwaW1hcCwgcGFnZW5vIDw8IHNiaS0+bDJuYnBlcnBhZ2UsIFBTSVpFLCAxKTsKKwlpZiAobXAgPT0gMCkKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBnZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGRpc2sgaW5vZGUgKi8KKwlkcCA9IChzdHJ1Y3QgZGlub2RlICopIG1wLT5kYXRhOworCWRwICs9IHJlbF9pbm9kZTsKKworCWRpb2Zmc2V0ID0gKGlubyAmIChJTk9TUEVSUEFHRSAtIDEpKSA8PCBMMkRJU0laRTsKKworCS8qCisJICogYWNxdWlyZSB0cmFuc2FjdGlvbiBsb2NrIG9uIHRoZSBvbi1kaXNrIGlub2RlOworCSAqIE4uQi4gdGxvY2sgaXMgYWNxdWlyZWQgb24gaXBpbWFwIG5vdCBpcDsKKwkgKi8KKwlpZiAoKGRpdGxjayA9CisJICAgICB0eExvY2sodGlkLCBpcGltYXAsIG1wLCB0bGNrSU5PREUgfCB0bGNrRU5UUlkpKSA9PSBOVUxMKQorCQlnb3RvIHJldHJ5OworCWRpbGluZWxvY2sgPSAoc3RydWN0IGxpbmVsb2NrICopICYgZGl0bGNrLT5sb2NrOworCisJLyoKKwkgKiBjb3B5IGJ0cmVlIHJvb3QgZnJvbSBpbi1tZW1vcnkgaW5vZGUgdG8gb24tZGlzayBpbm9kZQorCSAqCisJICogKHRsb2NrIGlzIHRha2VuIGZyb20gaW5saW5lIEIrLXRyZWUgcm9vdCBpbiBpbi1tZW1vcnkKKwkgKiBpbm9kZSB3aGVuIHRoZSBCKy10cmVlIHJvb3QgaXMgdXBkYXRlZCwgd2hpY2ggaXMgcG9pbnRlZCAKKwkgKiBieSBqZnNfaXAtPmJsaWQgYXMgd2VsbCBhcyBiZWluZyBvbiB0eCB0bG9jayBsaXN0KQorCSAqCisJICogZnVydGhlciBwcm9jZXNzaW5nIG9mIGJ0cmVlIHJvb3QgaXMgYmFzZWQgb24gdGhlIGNvcHkgCisJICogaW4gaW4tbWVtb3J5IGlub2RlLCB3aGVyZSB0eExvZygpIHdpbGwgbG9nIGZyb20sIGFuZCwgCisJICogZm9yIHh0cmVlIHJvb3QsIHR4VXBkYXRlTWFwKCkgd2lsbCB1cGRhdGUgbWFwIGFuZCByZXNldAorCSAqIFhBRF9ORVcgYml0OworCSAqLworCisJaWYgKFNfSVNESVIoaXAtPmlfbW9kZSkgJiYgKGxpZCA9IGpmc19pcC0+eHRsaWQpKSB7CisJCS8qCisJCSAqIFRoaXMgaXMgdGhlIHNwZWNpYWwgeHRyZWUgaW5zaWRlIHRoZSBkaXJlY3RvcnkgZm9yIHN0b3JpbmcKKwkJICogdGhlIGRpcmVjdG9yeSB0YWJsZQorCQkgKi8KKwkJeHRwYWdlX3QgKnAsICp4cDsKKwkJeGFkX3QgKnhhZDsKKworCQlqZnNfaXAtPnh0bGlkID0gMDsKKwkJdGxjayA9IGxpZF90b190bG9jayhsaWQpOworCQlhc3NlcnQodGxjay0+dHlwZSAmIHRsY2tYVFJFRSk7CisJCXRsY2stPnR5cGUgfD0gdGxja0JUUk9PVDsKKwkJdGxjay0+bXAgPSBtcDsKKwkJaWxpbmVsb2NrID0gKHN0cnVjdCBsaW5lbG9jayAqKSAmIHRsY2stPmxvY2s7CisKKwkJLyoKKwkJICogY29weSB4dHJlZSByb290IGZyb20gaW5vZGUgdG8gZGlub2RlOgorCQkgKi8KKwkJcCA9ICZqZnNfaXAtPmlfeHRyb290OworCQl4cCA9ICh4dHBhZ2VfdCAqKSAmZHAtPmRpX2RpcnRhYmxlOworCQlsdiA9IGlsaW5lbG9jay0+bHY7CisJCWZvciAobiA9IDA7IG4gPCBpbGluZWxvY2stPmluZGV4OyBuKyssIGx2KyspIHsKKwkJCW1lbWNweSgmeHAtPnhhZFtsdi0+b2Zmc2V0XSwgJnAtPnhhZFtsdi0+b2Zmc2V0XSwKKwkJCSAgICAgICBsdi0+bGVuZ3RoIDw8IEwyWFRTTE9UU0laRSk7CisJCX0KKworCQkvKiByZXNldCBvbi1kaXNrIChtZXRhZGF0YSBwYWdlKSB4dHJlZSBYQURfTkVXIGJpdCAqLworCQl4YWQgPSAmeHAtPnhhZFtYVEVOVFJZU1RBUlRdOworCQlmb3IgKG4gPSBYVEVOVFJZU1RBUlQ7CisJCSAgICAgbiA8IGxlMTZfdG9fY3B1KHhwLT5oZWFkZXIubmV4dGluZGV4KTsgbisrLCB4YWQrKykKKwkJCWlmICh4YWQtPmZsYWcgJiAoWEFEX05FVyB8IFhBRF9FWFRFTkRFRCkpCisJCQkJeGFkLT5mbGFnICY9IH4oWEFEX05FVyB8IFhBRF9FWFRFTkRFRCk7CisJfQorCisJaWYgKChsaWQgPSBqZnNfaXAtPmJsaWQpID09IDApCisJCWdvdG8gaW5saW5lRGF0YTsKKwlqZnNfaXAtPmJsaWQgPSAwOworCisJdGxjayA9IGxpZF90b190bG9jayhsaWQpOworCXR5cGUgPSB0bGNrLT50eXBlOworCXRsY2stPnR5cGUgfD0gdGxja0JUUk9PVDsKKwl0bGNrLT5tcCA9IG1wOworCWlsaW5lbG9jayA9IChzdHJ1Y3QgbGluZWxvY2sgKikgJiB0bGNrLT5sb2NrOworCisJLyoKKwkgKiAgICAgIHJlZ3VsYXIgZmlsZTogMTYgYnl0ZSAoWEFEIHNsb3QpIGdyYW51bGFyaXR5CisJICovCisJaWYgKHR5cGUgJiB0bGNrWFRSRUUpIHsKKwkJeHRwYWdlX3QgKnAsICp4cDsKKwkJeGFkX3QgKnhhZDsKKworCQkvKgorCQkgKiBjb3B5IHh0cmVlIHJvb3QgZnJvbSBpbm9kZSB0byBkaW5vZGU6CisJCSAqLworCQlwID0gJmpmc19pcC0+aV94dHJvb3Q7CisJCXhwID0gJmRwLT5kaV94dHJvb3Q7CisJCWx2ID0gaWxpbmVsb2NrLT5sdjsKKwkJZm9yIChuID0gMDsgbiA8IGlsaW5lbG9jay0+aW5kZXg7IG4rKywgbHYrKykgeworCQkJbWVtY3B5KCZ4cC0+eGFkW2x2LT5vZmZzZXRdLCAmcC0+eGFkW2x2LT5vZmZzZXRdLAorCQkJICAgICAgIGx2LT5sZW5ndGggPDwgTDJYVFNMT1RTSVpFKTsKKwkJfQorCisJCS8qIHJlc2V0IG9uLWRpc2sgKG1ldGFkYXRhIHBhZ2UpIHh0cmVlIFhBRF9ORVcgYml0ICovCisJCXhhZCA9ICZ4cC0+eGFkW1hURU5UUllTVEFSVF07CisJCWZvciAobiA9IFhURU5UUllTVEFSVDsKKwkJICAgICBuIDwgbGUxNl90b19jcHUoeHAtPmhlYWRlci5uZXh0aW5kZXgpOyBuKyssIHhhZCsrKQorCQkJaWYgKHhhZC0+ZmxhZyAmIChYQURfTkVXIHwgWEFEX0VYVEVOREVEKSkKKwkJCQl4YWQtPmZsYWcgJj0gfihYQURfTkVXIHwgWEFEX0VYVEVOREVEKTsKKwl9CisJLyoKKwkgKiAgICAgIGRpcmVjdG9yeTogMzIgYnl0ZSAoZGlyZWN0b3J5IGVudHJ5IHNsb3QpIGdyYW51bGFyaXR5CisJICovCisJZWxzZSBpZiAodHlwZSAmIHRsY2tEVFJFRSkgeworCQlkdHBhZ2VfdCAqcCwgKnhwOworCisJCS8qCisJCSAqIGNvcHkgZHRyZWUgcm9vdCBmcm9tIGlub2RlIHRvIGRpbm9kZToKKwkJICovCisJCXAgPSAoZHRwYWdlX3QgKikgJmpmc19pcC0+aV9kdHJvb3Q7CisJCXhwID0gKGR0cGFnZV90ICopICYgZHAtPmRpX2R0cm9vdDsKKwkJbHYgPSBpbGluZWxvY2stPmx2OworCQlmb3IgKG4gPSAwOyBuIDwgaWxpbmVsb2NrLT5pbmRleDsgbisrLCBsdisrKSB7CisJCQltZW1jcHkoJnhwLT5zbG90W2x2LT5vZmZzZXRdLCAmcC0+c2xvdFtsdi0+b2Zmc2V0XSwKKwkJCSAgICAgICBsdi0+bGVuZ3RoIDw8IEwyRFRTTE9UU0laRSk7CisJCX0KKwl9IGVsc2UgeworCQlqZnNfZXJyKCJkaVdyaXRlOiBVRk8gdGxvY2siKTsKKwl9CisKKyAgICAgIGlubGluZURhdGE6CisJLyoKKwkgKiBjb3B5IGlubGluZSBzeW1saW5rIGZyb20gaW4tbWVtb3J5IGlub2RlIHRvIG9uLWRpc2sgaW5vZGUKKwkgKi8KKwlpZiAoU19JU0xOSyhpcC0+aV9tb2RlKSAmJiBpcC0+aV9zaXplIDwgSURBVEFTSVpFKSB7CisJCWx2ID0gJiBkaWxpbmVsb2NrLT5sdltkaWxpbmVsb2NrLT5pbmRleF07CisJCWx2LT5vZmZzZXQgPSAoZGlvZmZzZXQgKyAyICogMTI4KSA+PiBMMklOT0RFU0xPVFNJWkU7CisJCWx2LT5sZW5ndGggPSAyOworCQltZW1jcHkoJmRwLT5kaV9mYXN0c3ltbGluaywgamZzX2lwLT5pX2lubGluZSwgSURBVEFTSVpFKTsKKwkJZGlsaW5lbG9jay0+aW5kZXgrKzsKKwl9CisJLyoKKwkgKiBjb3B5IGlubGluZSBkYXRhIGZyb20gaW4tbWVtb3J5IGlub2RlIHRvIG9uLWRpc2sgaW5vZGU6CisJICogMTI4IGJ5dGUgc2xvdCBncmFudWxhcml0eQorCSAqLworCWlmICh0ZXN0X2NmbGFnKENPTU1JVF9JbmxpbmVlYSwgaXApKSB7CisJCWx2ID0gJiBkaWxpbmVsb2NrLT5sdltkaWxpbmVsb2NrLT5pbmRleF07CisJCWx2LT5vZmZzZXQgPSAoZGlvZmZzZXQgKyAzICogMTI4KSA+PiBMMklOT0RFU0xPVFNJWkU7CisJCWx2LT5sZW5ndGggPSAxOworCQltZW1jcHkoJmRwLT5kaV9pbmxpbmVlYSwgamZzX2lwLT5pX2lubGluZV9lYSwgSU5PREVTTE9UU0laRSk7CisJCWRpbGluZWxvY2stPmluZGV4Kys7CisKKwkJY2xlYXJfY2ZsYWcoQ09NTUlUX0lubGluZWVhLCBpcCk7CisJfQorCisJLyoKKwkgKiAgICAgIGxvY2svY29weSBpbm9kZSBiYXNlOiAxMjggYnl0ZSBzbG90IGdyYW51bGFyaXR5CisJICovCisvLyBiYXNlRGlub2RlOgorCWx2ID0gJiBkaWxpbmVsb2NrLT5sdltkaWxpbmVsb2NrLT5pbmRleF07CisJbHYtPm9mZnNldCA9IGRpb2Zmc2V0ID4+IEwySU5PREVTTE9UU0laRTsKKwljb3B5X3RvX2Rpbm9kZShkcCwgaXApOworCWlmICh0ZXN0X2FuZF9jbGVhcl9jZmxhZyhDT01NSVRfRGlydGFibGUsIGlwKSkgeworCQlsdi0+bGVuZ3RoID0gMjsKKwkJbWVtY3B5KCZkcC0+ZGlfZGlydGFibGUsICZqZnNfaXAtPmlfZGlydGFibGUsIDk2KTsKKwl9IGVsc2UKKwkJbHYtPmxlbmd0aCA9IDE7CisJZGlsaW5lbG9jay0+aW5kZXgrKzsKKworI2lmZGVmIF9KRlNfRkFTVERBU0QKKwkvKgorCSAqIFdlIGFyZW4ndCBsb2dnaW5nIGNoYW5nZXMgdG8gdGhlIERBU0QgdXNlZCBpbiBkaXJlY3RvcnkgaW5vZGVzLAorCSAqIGJ1dCB3ZSBuZWVkIHRvIHdyaXRlIHRoZW0gdG8gZGlzay4gIElmIHdlIGRvbid0IHVubW91bnQgY2xlYW5seSwKKwkgKiBtb3VudCB3aWxsIHJlY2FsY3VsYXRlIHRoZSBEQVNEIHVzZWQuCisJICovCisJaWYgKFNfSVNESVIoaXAtPmlfbW9kZSkKKwkgICAgJiYgKGlwLT5pX2lwbW50LT5pX21udGZsYWcgJiBKRlNfREFTRF9FTkFCTEVEKSkKKwkJbWVtY3B5KCZkcC0+ZGlfREFTRCwgJmlwLT5pX0RBU0QsIHNpemVvZihzdHJ1Y3QgZGFzZCkpOworI2VuZGlmCQkJCS8qICBfSkZTX0ZBU1REQVNEICovCisKKwkvKiByZWxlYXNlIHRoZSBidWZmZXIgaG9sZGluZyB0aGUgdXBkYXRlZCBvbi1kaXNrIGlub2RlLiAKKwkgKiB0aGUgYnVmZmVyIHdpbGwgYmUgbGF0ZXIgd3JpdHRlbiBieSBjb21taXQgcHJvY2Vzc2luZy4KKwkgKi8KKwl3cml0ZV9tZXRhcGFnZShtcCk7CisKKwlyZXR1cm4gKHJjKTsKK30KKworCisvKgorICogTkFNRTogICAgICAgIGRpRnJlZShpcCkKKyAqCisgKiBGVU5DVElPTjogICAgZnJlZSBhIHNwZWNpZmllZCBpbm9kZSBmcm9tIHRoZSBpbm9kZSB3b3JraW5nIG1hcAorICoJCWZvciBhIGZpbGVzZXQgb3IgYWdncmVnYXRlLgorICoKKyAqCQlpZiB0aGUgaW5vZGUgdG8gYmUgZnJlZWQgcmVwcmVzZW50cyB0aGUgZmlyc3QgKG9ubHkpCisgKgkJZnJlZSBpbm9kZSB3aXRoaW4gdGhlIGlhZywgdGhlIGlhZyB3aWxsIGJlIHBsYWNlZCBvbgorICoJCXRoZSBhZyBmcmVlIGlub2RlIGxpc3QuCisgKgkKKyAqCQlmcmVlaW5nIHRoZSBpbm9kZSB3aWxsIGNhdXNlIHRoZSBpbm9kZSBleHRlbnQgdG8gYmUKKyAqCQlmcmVlZCBpZiB0aGUgaW5vZGUgaXMgdGhlIG9ubHkgYWxsb2NhdGVkIGlub2RlIHdpdGhpbgorICoJCXRoZSBleHRlbnQuICBpbiB0aGlzIGNhc2UgYWxsIHRoZSBkaXNrIHJlc291cmNlIGJhY2tpbmcKKyAqCQl1cCB0aGUgaW5vZGUgZXh0ZW50IHdpbGwgYmUgZnJlZWQuIGluIGFkZGl0aW9uLCB0aGUgaWFnCisgKgkJd2lsbCBiZSBwbGFjZWQgb24gdGhlIGFnIGV4dGVudCBmcmVlIGxpc3QgaWYgdGhlIGV4dGVudAorICoJCWlzIHRoZSBmaXJzdCBmcmVlIGV4dGVudCBpbiB0aGUgaWFnLiAgaWYgZnJlZWluZyB0aGUKKyAqCQlleHRlbnQgYWxzbyBtZWFucyB0aGF0IG5vIGZyZWUgaW5vZGVzIHdpbGwgZXhpc3QgZm9yCisgKgkJdGhlIGlhZywgdGhlIGlhZyB3aWxsIGFsc28gYmUgcmVtb3ZlZCBmcm9tIHRoZSBhZyBmcmVlCisgKgkJaW5vZGUgbGlzdC4KKyAqCisgKgkJdGhlIGlhZyBkZXNjcmliaW5nIHRoZSBpbm9kZSB3aWxsIGJlIGZyZWVkIGlmIHRoZSBleHRlbnQKKyAqCQlpcyB0byBiZSBmcmVlZCBhbmQgaXQgaXMgdGhlIG9ubHkgYmFja2VkIGV4dGVudCB3aXRoaW4KKyAqCQl0aGUgaWFnLiAgaW4gdGhpcyBjYXNlLCB0aGUgaWFnIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZQorICoJCWFnIGZyZWUgZXh0ZW50IGxpc3QgYW5kIGFnIGZyZWUgaW5vZGUgbGlzdCBhbmQgcGxhY2VkIG9uCisgKgkJdGhlIGlub2RlIG1hcCdzIGZyZWUgaWFnIGxpc3QuCisgKgorICoJCWEgY2FyZWZ1bCB1cGRhdGUgYXBwcm9hY2ggaXMgdXNlZCB0byBwcm92aWRlIGNvbnNpc3RlbmN5CisgKgkJaW4gdGhlIGZhY2Ugb2YgdXBkYXRlcyB0byBtdWx0aXBsZSBidWZmZXJzLiAgdW5kZXIgdGhpcworICoJCWFwcHJvYWNoLCBhbGwgcmVxdWlyZWQgYnVmZmVycyBhcmUgb2J0YWluZWQgYmVmb3JlIG1ha2luZworICoJCWFueSB1cGRhdGVzIGFuZCBhcmUgaGVsZCB1bnRpbCBhbGwgdXBkYXRlcyBhcmUgY29tcGxldGUuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgaXAgIAktIGlub2RlIHRvIGJlIGZyZWVkLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIDAgICAgICAgLSBzdWNjZXNzCisgKiAgICAgIC1FSU8gIAktIGkvbyBlcnJvci4KKyAqLworaW50IGRpRnJlZShzdHJ1Y3QgaW5vZGUgKmlwKQoreworCWludCByYzsKKwlpbm9fdCBpbnVtID0gaXAtPmlfaW5vOworCXN0cnVjdCBpYWcgKmlhZ3AsICphaWFncCwgKmJpYWdwLCAqY2lhZ3AsICpkaWFncDsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wLCAqYW1wLCAqYm1wLCAqY21wLCAqZG1wOworCWludCBpYWdubywgaW5vLCBleHRubywgYml0bm8sIHN3b3JkLCBhZ25vOworCWludCBiYWNrLCBmd2Q7CisJdTMyIGJpdG1hcCwgbWFzazsKKwlzdHJ1Y3QgaW5vZGUgKmlwaW1hcCA9IEpGU19TQkkoaXAtPmlfc2IpLT5pcGltYXA7CisJc3RydWN0IGlub21hcCAqaW1hcCA9IEpGU19JUChpcGltYXApLT5pX2ltYXA7CisJcHhkX3QgZnJlZXB4ZDsKKwl0aWRfdCB0aWQ7CisJc3RydWN0IGlub2RlICppcGxpc3RbM107CisJc3RydWN0IHRsb2NrICp0bGNrOworCXN0cnVjdCBweGRfbG9jayAqcHhkbG9jazsKKworCS8qCisJICogVGhpcyBpcyBqdXN0IHRvIHN1cHByZXNzIGNvbXBpbGVyIHdhcm5pbmdzLiAgVGhlIHNhbWUgbG9naWMgdGhhdAorCSAqIHJlZmVyZW5jZXMgdGhlc2UgdmFyaWFibGVzIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGVtLgorCSAqLworCWFpYWdwID0gYmlhZ3AgPSBjaWFncCA9IGRpYWdwID0gTlVMTDsKKworCS8qIGdldCB0aGUgaWFnIG51bWJlciBjb250YWluaW5nIHRoZSBpbm9kZS4KKwkgKi8KKwlpYWdubyA9IElOT1RPSUFHKGludW0pOworCisJLyogbWFrZSBzdXJlIHRoYXQgdGhlIGlhZyBpcyBjb250YWluZWQgd2l0aGluIAorCSAqIHRoZSBtYXAuCisJICovCisJaWYgKGlhZ25vID49IGltYXAtPmltX25leHRpYWcpIHsKKwkJZHVtcF9tZW0oImltYXAiLCBpbWFwLCAzMik7CisJCWpmc19lcnJvcihpcC0+aV9zYiwKKwkJCSAgImRpRnJlZTogaW51bSA9ICVkLCBpYWdubyA9ICVkLCBuZXh0aWFnID0gJWQiLAorCQkJICAodWludCkgaW51bSwgaWFnbm8sIGltYXAtPmltX25leHRpYWcpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBnZXQgdGhlIGFsbG9jYXRpb24gZ3JvdXAgZm9yIHRoaXMgaW5vLgorCSAqLworCWFnbm8gPSBKRlNfSVAoaXApLT5hZ25vOworCisJLyogTG9jayB0aGUgQUcgc3BlY2lmaWMgaW5vZGUgbWFwIGluZm9ybWF0aW9uCisJICovCisJQUdfTE9DSyhpbWFwLCBhZ25vKTsKKworCS8qIE9idGFpbiByZWFkIGxvY2sgaW4gaW1hcCBpbm9kZS4gIERvbid0IHJlbGVhc2UgaXQgdW50aWwgd2UgaGF2ZQorCSAqIHJlYWQgYWxsIG9mIHRoZSBJQUcncyB0aGF0IHdlIGFyZSBnb2luZyB0by4KKwkgKi8KKwlJUkVBRF9MT0NLKGlwaW1hcCk7CisKKwkvKiByZWFkIHRoZSBpYWcuCisJICovCisJaWYgKChyYyA9IGRpSUFHUmVhZChpbWFwLCBpYWdubywgJm1wKSkpIHsKKwkJSVJFQURfVU5MT0NLKGlwaW1hcCk7CisJCUFHX1VOTE9DSyhpbWFwLCBhZ25vKTsKKwkJcmV0dXJuIChyYyk7CisJfQorCWlhZ3AgPSAoc3RydWN0IGlhZyAqKSBtcC0+ZGF0YTsKKworCS8qIGdldCB0aGUgaW5vZGUgbnVtYmVyIGFuZCBleHRlbnQgbnVtYmVyIG9mIHRoZSBpbm9kZSB3aXRoaW4KKwkgKiB0aGUgaWFnIGFuZCB0aGUgaW5vZGUgbnVtYmVyIHdpdGhpbiB0aGUgZXh0ZW50LgorCSAqLworCWlubyA9IGludW0gJiAoSU5PU1BFUklBRyAtIDEpOworCWV4dG5vID0gaW5vID4+IEwySU5PU1BFUkVYVDsKKwliaXRubyA9IGlubyAmIChJTk9TUEVSRVhUIC0gMSk7CisJbWFzayA9IEhJR0hPUkRFUiA+PiBiaXRubzsKKworCWlmICghKGxlMzJfdG9fY3B1KGlhZ3AtPndtYXBbZXh0bm9dKSAmIG1hc2spKSB7CisJCWpmc19lcnJvcihpcC0+aV9zYiwKKwkJCSAgImRpRnJlZTogd21hcCBzaG93cyBpbm9kZSBhbHJlYWR5IGZyZWUiKTsKKwl9CisKKwlpZiAoIWFkZHJlc3NQWEQoJmlhZ3AtPmlub2V4dFtleHRub10pKSB7CisJCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCQlJUkVBRF9VTkxPQ0soaXBpbWFwKTsKKwkJQUdfVU5MT0NLKGltYXAsIGFnbm8pOworCQlqZnNfZXJyb3IoaXAtPmlfc2IsICJkaUZyZWU6IGludmFsaWQgaW5vZXh0Iik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIGNvbXB1dGUgdGhlIGJpdG1hcCBmb3IgdGhlIGV4dGVudCByZWZsZWN0aW5nIHRoZSBmcmVlZCBpbm9kZS4KKwkgKi8KKwliaXRtYXAgPSBsZTMyX3RvX2NwdShpYWdwLT53bWFwW2V4dG5vXSkgJiB+bWFzazsKKworCWlmIChpbWFwLT5pbV9hZ2N0bFthZ25vXS5udW1mcmVlID4gaW1hcC0+aW1fYWdjdGxbYWdub10ubnVtaW5vcykgeworCQlyZWxlYXNlX21ldGFwYWdlKG1wKTsKKwkJSVJFQURfVU5MT0NLKGlwaW1hcCk7CisJCUFHX1VOTE9DSyhpbWFwLCBhZ25vKTsKKwkJamZzX2Vycm9yKGlwLT5pX3NiLCAiZGlGcmVlOiBudW1mcmVlID4gbnVtaW5vcyIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJLyoKKwkgKiAgICAgIGlub2RlIGV4dGVudCBzdGlsbCBoYXMgc29tZSBpbm9kZXMgb3IgYmVsb3cgbG93IHdhdGVyIG1hcms6CisJICogICAgICBrZWVwIHRoZSBpbm9kZSBleHRlbnQ7CisJICovCisJaWYgKGJpdG1hcCB8fAorCSAgICBpbWFwLT5pbV9hZ2N0bFthZ25vXS5udW1mcmVlIDwgOTYgfHwKKwkgICAgKGltYXAtPmltX2FnY3RsW2Fnbm9dLm51bWZyZWUgPCAyODggJiYKKwkgICAgICgoKGltYXAtPmltX2FnY3RsW2Fnbm9dLm51bWZyZWUgKiAxMDApIC8KKwkgICAgICAgaW1hcC0+aW1fYWdjdGxbYWdub10ubnVtaW5vcykgPD0gMjUpKSkgeworCQkvKiBpZiB0aGUgaWFnIGN1cnJlbnRseSBoYXMgbm8gZnJlZSBpbm9kZXMgKGkuZS4sCisJCSAqIHRoZSBpbm9kZSBiZWluZyBmcmVlZCBpcyB0aGUgZmlyc3QgZnJlZSBpbm9kZSBvZiBpYWcpLAorCQkgKiBpbnNlcnQgdGhlIGlhZyBhdCBoZWFkIG9mIHRoZSBpbm9kZSBmcmVlIGxpc3QgZm9yIHRoZSBhZy4KKwkJICovCisJCWlmIChpYWdwLT5uZnJlZWlub3MgPT0gMCkgeworCQkJLyogY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBpYWdzIG9uIHRoZSBhZyBpbm9kZQorCQkJICogZnJlZSBsaXN0LiAgaWYgc28sIHJlYWQgdGhlIGZpcnN0IG9uZSBzbyB0aGF0CisJCQkgKiB3ZSBjYW4gbGluayB0aGUgY3VycmVudCBpYWcgb250byB0aGUgbGlzdCBhdAorCQkJICogdGhlIGhlYWQuCisJCQkgKi8KKwkJCWlmICgoZndkID0gaW1hcC0+aW1fYWdjdGxbYWdub10uaW5vZnJlZSkgPj0gMCkgeworCQkJCS8qIHJlYWQgdGhlIGlhZyB0aGF0IGN1cnJlbnRseSBpcyB0aGUgaGVhZAorCQkJCSAqIG9mIHRoZSBsaXN0LgorCQkJCSAqLworCQkJCWlmICgocmMgPSBkaUlBR1JlYWQoaW1hcCwgZndkLCAmYW1wKSkpIHsKKwkJCQkJSVJFQURfVU5MT0NLKGlwaW1hcCk7CisJCQkJCUFHX1VOTE9DSyhpbWFwLCBhZ25vKTsKKwkJCQkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisJCQkJCXJldHVybiAocmMpOworCQkJCX0KKwkJCQlhaWFncCA9IChzdHJ1Y3QgaWFnICopIGFtcC0+ZGF0YTsKKworCQkJCS8qIG1ha2UgY3VycmVudCBoZWFkIHBvaW50IGJhY2sgdG8gdGhlIGlhZy4KKwkJCQkgKi8KKwkJCQlhaWFncC0+aW5vZnJlZWJhY2sgPSBjcHVfdG9fbGUzMihpYWdubyk7CisKKwkJCQl3cml0ZV9tZXRhcGFnZShhbXApOworCQkJfQorCisJCQkvKiBpYWcgcG9pbnRzIGZvcndhcmQgdG8gY3VycmVudCBoZWFkIGFuZCBpYWcKKwkJCSAqIGJlY29tZXMgdGhlIG5ldyBoZWFkIG9mIHRoZSBsaXN0LgorCQkJICovCisJCQlpYWdwLT5pbm9mcmVlZndkID0KKwkJCSAgICBjcHVfdG9fbGUzMihpbWFwLT5pbV9hZ2N0bFthZ25vXS5pbm9mcmVlKTsKKwkJCWlhZ3AtPmlub2ZyZWViYWNrID0gY3B1X3RvX2xlMzIoLTEpOworCQkJaW1hcC0+aW1fYWdjdGxbYWdub10uaW5vZnJlZSA9IGlhZ25vOworCQl9CisJCUlSRUFEX1VOTE9DSyhpcGltYXApOworCisJCS8qIHVwZGF0ZSB0aGUgZnJlZSBpbm9kZSBzdW1tYXJ5IG1hcCBmb3IgdGhlIGV4dGVudCBpZgorCQkgKiBmcmVlaW5nIHRoZSBpbm9kZSBtZWFucyB0aGUgZXh0ZW50IHdpbGwgbm93IGhhdmUgZnJlZQorCQkgKiBpbm9kZXMgKGkuZS4sIHRoZSBpbm9kZSBiZWluZyBmcmVlZCBpcyB0aGUgZmlyc3QgZnJlZSAKKwkJICogaW5vZGUgb2YgZXh0ZW50KSwKKwkJICovCisJCWlmIChpYWdwLT53bWFwW2V4dG5vXSA9PSBjcHVfdG9fbGUzMihPTkVTKSkgeworCQkJc3dvcmQgPSBleHRubyA+PiBMMkVYVFNQRVJTVU07CisJCQliaXRubyA9IGV4dG5vICYgKEVYVFNQRVJTVU0gLSAxKTsKKwkJCWlhZ3AtPmlub3NtYXBbc3dvcmRdICY9CisJCQkgICAgY3B1X3RvX2xlMzIofihISUdIT1JERVIgPj4gYml0bm8pKTsKKwkJfQorCisJCS8qIHVwZGF0ZSB0aGUgYml0bWFwLgorCQkgKi8KKwkJaWFncC0+d21hcFtleHRub10gPSBjcHVfdG9fbGUzMihiaXRtYXApOworCQlEQkdfRElGUkVFKGltYXAsIGludW0pOworCisJCS8qIHVwZGF0ZSB0aGUgZnJlZSBpbm9kZSBjb3VudHMgYXQgdGhlIGlhZywgYWcgYW5kCisJCSAqIG1hcCBsZXZlbC4KKwkJICovCisJCWlhZ3AtPm5mcmVlaW5vcyA9CisJCSAgICBjcHVfdG9fbGUzMihsZTMyX3RvX2NwdShpYWdwLT5uZnJlZWlub3MpICsgMSk7CisJCWltYXAtPmltX2FnY3RsW2Fnbm9dLm51bWZyZWUgKz0gMTsKKwkJYXRvbWljX2luYygmaW1hcC0+aW1fbnVtZnJlZSk7CisKKwkJLyogcmVsZWFzZSB0aGUgQUcgaW5vZGUgbWFwIGxvY2sKKwkJICovCisJCUFHX1VOTE9DSyhpbWFwLCBhZ25vKTsKKworCQkvKiB3cml0ZSB0aGUgaWFnICovCisJCXdyaXRlX21ldGFwYWdlKG1wKTsKKworCQlyZXR1cm4gKDApOworCX0KKworCisJLyoKKwkgKiAgICAgIGlub2RlIGV4dGVudCBoYXMgYmVjb21lIGZyZWUgYW5kIGFib3ZlIGxvdyB3YXRlciBtYXJrOgorCSAqICAgICAgZnJlZSB0aGUgaW5vZGUgZXh0ZW50OworCSAqLworCisJLyoKKwkgKiAgICAgIHByZXBhcmUgdG8gdXBkYXRlIGlhZyBsaXN0KHMpIChjYXJlZnVsIHVwZGF0ZSBzdGVwIDEpCisJICovCisJYW1wID0gYm1wID0gY21wID0gZG1wID0gTlVMTDsKKwlmd2QgPSBiYWNrID0gLTE7CisKKwkvKiBjaGVjayBpZiB0aGUgaWFnIGN1cnJlbnRseSBoYXMgbm8gZnJlZSBleHRlbnRzLiAgaWYgc28sCisJICogaXQgd2lsbCBiZSBwbGFjZWQgb24gdGhlIGhlYWQgb2YgdGhlIGFnIGV4dGVudCBmcmVlIGxpc3QuCisJICovCisJaWYgKGlhZ3AtPm5mcmVlZXh0cyA9PSAwKSB7CisJCS8qIGNoZWNrIGlmIHRoZSBhZyBleHRlbnQgZnJlZSBsaXN0IGhhcyBhbnkgaWFncy4KKwkJICogaWYgc28sIHJlYWQgdGhlIGlhZyBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCBub3cuCisJCSAqIHRoaXMgKGhlYWQpIGlhZyB3aWxsIGJlIHVwZGF0ZWQgbGF0ZXIgdG8gcmVmbGVjdAorCQkgKiB0aGUgYWRkaXRpb24gb2YgdGhlIGN1cnJlbnQgaWFnIGF0IHRoZSBoZWFkIG9mCisJCSAqIHRoZSBsaXN0LgorCQkgKi8KKwkJaWYgKChmd2QgPSBpbWFwLT5pbV9hZ2N0bFthZ25vXS5leHRmcmVlKSA+PSAwKSB7CisJCQlpZiAoKHJjID0gZGlJQUdSZWFkKGltYXAsIGZ3ZCwgJmFtcCkpKQorCQkJCWdvdG8gZXJyb3Jfb3V0OworCQkJYWlhZ3AgPSAoc3RydWN0IGlhZyAqKSBhbXAtPmRhdGE7CisJCX0KKwl9IGVsc2UgeworCQkvKiBpYWcgaGFzIGZyZWUgZXh0ZW50cy4gY2hlY2sgaWYgdGhlIGFkZGl0aW9uIG9mIGEgZnJlZQorCQkgKiBleHRlbnQgd2lsbCBjYXVzZSBhbGwgZXh0ZW50cyB0byBiZSBmcmVlIHdpdGhpbiB0aGlzCisJCSAqIGlhZy4gIGlmIHNvLCB0aGUgaWFnIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBhZyBleHRlbnQKKwkJICogZnJlZSBsaXN0IGFuZCBwbGFjZWQgb24gdGhlIGlub2RlIG1hcCdzIGZyZWUgaWFnIGxpc3QuCisJCSAqLworCQlpZiAoaWFncC0+bmZyZWVleHRzID09IGNwdV90b19sZTMyKEVYVFNQRVJJQUcgLSAxKSkgeworCQkJLyogaW4gcHJlcGFyYXRpb24gZm9yIHJlbW92aW5nIHRoZSBpYWcgZnJvbSB0aGUKKwkJCSAqIGFnIGV4dGVudCBmcmVlIGxpc3QsIHJlYWQgdGhlIGlhZ3MgcHJlY2VlZGluZworCQkJICogYW5kIGZvbGxvd2luZyB0aGUgaWFnIG9uIHRoZSBhZyBleHRlbnQgZnJlZQorCQkJICogbGlzdC4KKwkJCSAqLworCQkJaWYgKChmd2QgPSBsZTMyX3RvX2NwdShpYWdwLT5leHRmcmVlZndkKSkgPj0gMCkgeworCQkJCWlmICgocmMgPSBkaUlBR1JlYWQoaW1hcCwgZndkLCAmYW1wKSkpCisJCQkJCWdvdG8gZXJyb3Jfb3V0OworCQkJCWFpYWdwID0gKHN0cnVjdCBpYWcgKikgYW1wLT5kYXRhOworCQkJfQorCisJCQlpZiAoKGJhY2sgPSBsZTMyX3RvX2NwdShpYWdwLT5leHRmcmVlYmFjaykpID49IDApIHsKKwkJCQlpZiAoKHJjID0gZGlJQUdSZWFkKGltYXAsIGJhY2ssICZibXApKSkKKwkJCQkJZ290byBlcnJvcl9vdXQ7CisJCQkJYmlhZ3AgPSAoc3RydWN0IGlhZyAqKSBibXAtPmRhdGE7CisJCQl9CisJCX0KKwl9CisKKwkvKiByZW1vdmUgdGhlIGlhZyBmcm9tIHRoZSBhZyBpbm9kZSBmcmVlIGxpc3QgaWYgZnJlZWluZworCSAqIHRoaXMgZXh0ZW50IGNhdXNlIHRoZSBpYWcgdG8gaGF2ZSBubyBmcmVlIGlub2Rlcy4KKwkgKi8KKwlpZiAoaWFncC0+bmZyZWVpbm9zID09IGNwdV90b19sZTMyKElOT1NQRVJFWFQgLSAxKSkgeworCQlpbnQgaW5vZnJlZWJhY2sgPSBsZTMyX3RvX2NwdShpYWdwLT5pbm9mcmVlYmFjayk7CisJCWludCBpbm9mcmVlZndkID0gbGUzMl90b19jcHUoaWFncC0+aW5vZnJlZWZ3ZCk7CisKKwkJLyogaW4gcHJlcGFyYXRpb24gZm9yIHJlbW92aW5nIHRoZSBpYWcgZnJvbSB0aGUKKwkJICogYWcgaW5vZGUgZnJlZSBsaXN0LCByZWFkIHRoZSBpYWdzIHByZWNlZWRpbmcKKwkJICogYW5kIGZvbGxvd2luZyB0aGUgaWFnIG9uIHRoZSBhZyBpbm9kZSBmcmVlCisJCSAqIGxpc3QuICBiZWZvcmUgcmVhZGluZyB0aGVzZSBpYWdzLCB3ZSBtdXN0IG1ha2UKKwkJICogc3VyZSB0aGF0IHdlIGFscmVhZHkgZG9uJ3QgaGF2ZSB0aGVtIGluIGhhbmQKKwkJICogZnJvbSB1cCBhYm92ZSwgc2luY2UgcmUtcmVhZGluZyBhbiBpYWcgKGJ1ZmZlcikKKwkJICogd2UgYXJlIGN1cnJlbnRseSBob2xkaW5nIHdvdWxkIGNhdXNlIGEgZGVhZGxvY2suCisJCSAqLworCQlpZiAoaW5vZnJlZWZ3ZCA+PSAwKSB7CisKKwkJCWlmIChpbm9mcmVlZndkID09IGZ3ZCkKKwkJCQljaWFncCA9IChzdHJ1Y3QgaWFnICopIGFtcC0+ZGF0YTsKKwkJCWVsc2UgaWYgKGlub2ZyZWVmd2QgPT0gYmFjaykKKwkJCQljaWFncCA9IChzdHJ1Y3QgaWFnICopIGJtcC0+ZGF0YTsKKwkJCWVsc2UgeworCQkJCWlmICgocmMgPQorCQkJCSAgICAgZGlJQUdSZWFkKGltYXAsIGlub2ZyZWVmd2QsICZjbXApKSkKKwkJCQkJZ290byBlcnJvcl9vdXQ7CisJCQkJY2lhZ3AgPSAoc3RydWN0IGlhZyAqKSBjbXAtPmRhdGE7CisJCQl9CisJCQlhc3NlcnQoY2lhZ3AgIT0gTlVMTCk7CisJCX0KKworCQlpZiAoaW5vZnJlZWJhY2sgPj0gMCkgeworCQkJaWYgKGlub2ZyZWViYWNrID09IGZ3ZCkKKwkJCQlkaWFncCA9IChzdHJ1Y3QgaWFnICopIGFtcC0+ZGF0YTsKKwkJCWVsc2UgaWYgKGlub2ZyZWViYWNrID09IGJhY2spCisJCQkJZGlhZ3AgPSAoc3RydWN0IGlhZyAqKSBibXAtPmRhdGE7CisJCQllbHNlIHsKKwkJCQlpZiAoKHJjID0KKwkJCQkgICAgIGRpSUFHUmVhZChpbWFwLCBpbm9mcmVlYmFjaywgJmRtcCkpKQorCQkJCQlnb3RvIGVycm9yX291dDsKKwkJCQlkaWFncCA9IChzdHJ1Y3QgaWFnICopIGRtcC0+ZGF0YTsKKwkJCX0KKwkJCWFzc2VydChkaWFncCAhPSBOVUxMKTsKKwkJfQorCX0KKworCUlSRUFEX1VOTE9DSyhpcGltYXApOworCisJLyoKKwkgKiBpbnZhbGlkYXRlIGFueSBwYWdlIG9mIHRoZSBpbm9kZSBleHRlbnQgZnJlZWQgZnJvbSBidWZmZXIgY2FjaGU7CisJICovCisJZnJlZXB4ZCA9IGlhZ3AtPmlub2V4dFtleHRub107CisJaW52YWxpZGF0ZV9weGRfbWV0YXBhZ2VzKGlwLCBmcmVlcHhkKTsKKworCS8qCisJICogICAgICB1cGRhdGUgaWFnIGxpc3QocykgKGNhcmVmdWwgdXBkYXRlIHN0ZXAgMikKKwkgKi8KKwkvKiBhZGQgdGhlIGlhZyB0byB0aGUgYWcgZXh0ZW50IGZyZWUgbGlzdCBpZiB0aGlzIGlzIHRoZQorCSAqIGZpcnN0IGZyZWUgZXh0ZW50IGZvciB0aGUgaWFnLgorCSAqLworCWlmIChpYWdwLT5uZnJlZWV4dHMgPT0gMCkgeworCQlpZiAoZndkID49IDApCisJCQlhaWFncC0+ZXh0ZnJlZWJhY2sgPSBjcHVfdG9fbGUzMihpYWdubyk7CisKKwkJaWFncC0+ZXh0ZnJlZWZ3ZCA9CisJCSAgICBjcHVfdG9fbGUzMihpbWFwLT5pbV9hZ2N0bFthZ25vXS5leHRmcmVlKTsKKwkJaWFncC0+ZXh0ZnJlZWJhY2sgPSBjcHVfdG9fbGUzMigtMSk7CisJCWltYXAtPmltX2FnY3RsW2Fnbm9dLmV4dGZyZWUgPSBpYWdubzsKKwl9IGVsc2UgeworCQkvKiByZW1vdmUgdGhlIGlhZyBmcm9tIHRoZSBhZyBleHRlbnQgbGlzdCBpZiBhbGwgZXh0ZW50cworCQkgKiBhcmUgbm93IGZyZWUgYW5kIHBsYWNlIGl0IG9uIHRoZSBpbm9kZSBtYXAgaWFnIGZyZWUgbGlzdC4KKwkJICovCisJCWlmIChpYWdwLT5uZnJlZWV4dHMgPT0gY3B1X3RvX2xlMzIoRVhUU1BFUklBRyAtIDEpKSB7CisJCQlpZiAoZndkID49IDApCisJCQkJYWlhZ3AtPmV4dGZyZWViYWNrID0gaWFncC0+ZXh0ZnJlZWJhY2s7CisKKwkJCWlmIChiYWNrID49IDApCisJCQkJYmlhZ3AtPmV4dGZyZWVmd2QgPSBpYWdwLT5leHRmcmVlZndkOworCQkJZWxzZQorCQkJCWltYXAtPmltX2FnY3RsW2Fnbm9dLmV4dGZyZWUgPQorCQkJCSAgICBsZTMyX3RvX2NwdShpYWdwLT5leHRmcmVlZndkKTsKKworCQkJaWFncC0+ZXh0ZnJlZWZ3ZCA9IGlhZ3AtPmV4dGZyZWViYWNrID0gY3B1X3RvX2xlMzIoLTEpOworCisJCQlJQUdGUkVFX0xPQ0soaW1hcCk7CisJCQlpYWdwLT5pYWdmcmVlID0gY3B1X3RvX2xlMzIoaW1hcC0+aW1fZnJlZWlhZyk7CisJCQlpbWFwLT5pbV9mcmVlaWFnID0gaWFnbm87CisJCQlJQUdGUkVFX1VOTE9DSyhpbWFwKTsKKwkJfQorCX0KKworCS8qIHJlbW92ZSB0aGUgaWFnIGZyb20gdGhlIGFnIGlub2RlIGZyZWUgbGlzdCBpZiBmcmVlaW5nCisJICogdGhpcyBleHRlbnQgY2F1c2VzIHRoZSBpYWcgdG8gaGF2ZSBubyBmcmVlIGlub2Rlcy4KKwkgKi8KKwlpZiAoaWFncC0+bmZyZWVpbm9zID09IGNwdV90b19sZTMyKElOT1NQRVJFWFQgLSAxKSkgeworCQlpZiAoKGludCkgbGUzMl90b19jcHUoaWFncC0+aW5vZnJlZWZ3ZCkgPj0gMCkKKwkJCWNpYWdwLT5pbm9mcmVlYmFjayA9IGlhZ3AtPmlub2ZyZWViYWNrOworCisJCWlmICgoaW50KSBsZTMyX3RvX2NwdShpYWdwLT5pbm9mcmVlYmFjaykgPj0gMCkKKwkJCWRpYWdwLT5pbm9mcmVlZndkID0gaWFncC0+aW5vZnJlZWZ3ZDsKKwkJZWxzZQorCQkJaW1hcC0+aW1fYWdjdGxbYWdub10uaW5vZnJlZSA9CisJCQkgICAgbGUzMl90b19jcHUoaWFncC0+aW5vZnJlZWZ3ZCk7CisKKwkJaWFncC0+aW5vZnJlZWZ3ZCA9IGlhZ3AtPmlub2ZyZWViYWNrID0gY3B1X3RvX2xlMzIoLTEpOworCX0KKworCS8qIHVwZGF0ZSB0aGUgaW5vZGUgZXh0ZW50IGFkZHJlc3MgYW5kIHdvcmtpbmcgbWFwIAorCSAqIHRvIHJlZmxlY3QgdGhlIGZyZWUgZXh0ZW50LgorCSAqIHRoZSBwZXJtYW5lbnQgbWFwIHNob3VsZCBoYXZlIGJlZW4gdXBkYXRlZCBhbHJlYWR5IAorCSAqIGZvciB0aGUgaW5vZGUgYmVpbmcgZnJlZWQuCisJICovCisJaWYgKGlhZ3AtPnBtYXBbZXh0bm9dICE9IDApIHsKKwkJamZzX2Vycm9yKGlwLT5pX3NiLCAiZGlGcmVlOiB0aGUgcG1hcCBkb2VzIG5vdCBzaG93IGlub2RlIGZyZWUiKTsKKwl9CisJaWFncC0+d21hcFtleHRub10gPSAwOworCURCR19ESUZSRUUoaW1hcCwgaW51bSk7CisJUFhEbGVuZ3RoKCZpYWdwLT5pbm9leHRbZXh0bm9dLCAwKTsKKwlQWERhZGRyZXNzKCZpYWdwLT5pbm9leHRbZXh0bm9dLCAwKTsKKworCS8qIHVwZGF0ZSB0aGUgZnJlZSBleHRlbnQgYW5kIGZyZWUgaW5vZGUgc3VtbWFyeSBtYXBzCisJICogdG8gcmVmbGVjdCB0aGUgZnJlZWQgZXh0ZW50LgorCSAqIHRoZSBpbm9kZSBzdW1tYXJ5IG1hcCBpcyBtYXJrZWQgdG8gaW5kaWNhdGUgbm8gaW5vZGVzIAorCSAqIGF2YWlsYWJsZSBmb3IgdGhlIGZyZWVkIGV4dGVudC4KKwkgKi8KKwlzd29yZCA9IGV4dG5vID4+IEwyRVhUU1BFUlNVTTsKKwliaXRubyA9IGV4dG5vICYgKEVYVFNQRVJTVU0gLSAxKTsKKwltYXNrID0gSElHSE9SREVSID4+IGJpdG5vOworCWlhZ3AtPmlub3NtYXBbc3dvcmRdIHw9IGNwdV90b19sZTMyKG1hc2spOworCWlhZ3AtPmV4dHNtYXBbc3dvcmRdICY9IGNwdV90b19sZTMyKH5tYXNrKTsKKworCS8qIHVwZGF0ZSB0aGUgbnVtYmVyIG9mIGZyZWUgaW5vZGVzIGFuZCBudW1iZXIgb2YgZnJlZSBleHRlbnRzCisJICogZm9yIHRoZSBpYWcuCisJICovCisJaWFncC0+bmZyZWVpbm9zID0gY3B1X3RvX2xlMzIobGUzMl90b19jcHUoaWFncC0+bmZyZWVpbm9zKSAtCisJCQkJICAgICAgKElOT1NQRVJFWFQgLSAxKSk7CisJaWFncC0+bmZyZWVleHRzID0gY3B1X3RvX2xlMzIobGUzMl90b19jcHUoaWFncC0+bmZyZWVleHRzKSArIDEpOworCisJLyogdXBkYXRlIHRoZSBudW1iZXIgb2YgZnJlZSBpbm9kZXMgYW5kIGJhY2tlZCBpbm9kZXMKKwkgKiBhdCB0aGUgYWcgYW5kIGlub2RlIG1hcCBsZXZlbC4KKwkgKi8KKwlpbWFwLT5pbV9hZ2N0bFthZ25vXS5udW1mcmVlIC09IChJTk9TUEVSRVhUIC0gMSk7CisJaW1hcC0+aW1fYWdjdGxbYWdub10ubnVtaW5vcyAtPSBJTk9TUEVSRVhUOworCWF0b21pY19zdWIoSU5PU1BFUkVYVCAtIDEsICZpbWFwLT5pbV9udW1mcmVlKTsKKwlhdG9taWNfc3ViKElOT1NQRVJFWFQsICZpbWFwLT5pbV9udW1pbm9zKTsKKworCWlmIChhbXApCisJCXdyaXRlX21ldGFwYWdlKGFtcCk7CisJaWYgKGJtcCkKKwkJd3JpdGVfbWV0YXBhZ2UoYm1wKTsKKwlpZiAoY21wKQorCQl3cml0ZV9tZXRhcGFnZShjbXApOworCWlmIChkbXApCisJCXdyaXRlX21ldGFwYWdlKGRtcCk7CisKKwkvKgorCSAqIHN0YXJ0IHRyYW5zYWN0aW9uIHRvIHVwZGF0ZSBibG9jayBhbGxvY2F0aW9uIG1hcAorCSAqIGZvciB0aGUgaW5vZGUgZXh0ZW50IGZyZWVkOworCSAqCisJICogTi5CLiBBR19MT0NLIGlzIHJlbGVhc2VkIGFuZCBpYWcgd2lsbCBiZSByZWxlYXNlZCBiZWxvdywgYW5kIAorCSAqIG90aGVyIHRocmVhZCBtYXkgYWxsb2NhdGUgaW5vZGUgZnJvbS9yZXVzaW5nIHRoZSBpeGFkIGZyZWVkCisJICogQlVUIHdpdGggbmV3L2RpZmZlcmVudCBiYWNraW5nIGlub2RlIGV4dGVudCBmcm9tIHRoZSBleHRlbnQgCisJICogdG8gYmUgZnJlZWQgYnkgdGhlIHRyYW5zYWN0aW9uOyAgCisJICovCisJdGlkID0gdHhCZWdpbihpcGltYXAtPmlfc2IsIENPTU1JVF9GT1JDRSk7CisJZG93bigmSkZTX0lQKGlwaW1hcCktPmNvbW1pdF9zZW0pOworCisJLyogYWNxdWlyZSB0bG9jayBvZiB0aGUgaWFnIHBhZ2Ugb2YgdGhlIGZyZWVkIGl4YWQgCisJICogdG8gZm9yY2UgdGhlIHBhZ2UgTk9IT01FT0sgKGV2ZW4gdGhvdWdoIG5vIGRhdGEgaXMKKwkgKiBsb2dnZWQgZnJvbSB0aGUgaWFnIHBhZ2UpIHVudGlsIE5PUkVET1BBR0V8RlJFRVhURU5UIGxvZyAKKwkgKiBmb3IgdGhlIGZyZWUgb2YgdGhlIGV4dGVudCBpcyBjb21taXR0ZWQ7CisJICogd3JpdGUgRlJFRVhURU5UfE5PUkVET1BBR0UgbG9nIHJlY29yZAorCSAqIE4uQi4gbGluZWxvY2sgaXMgb3ZlcmxhaWQgYXMgZnJlZWQgZXh0ZW50IGRlc2NyaXB0b3I7CisJICovCisJdGxjayA9IHR4TG9jayh0aWQsIGlwaW1hcCwgbXAsIHRsY2tJTk9ERSB8IHRsY2tGUkVFKTsKKwlweGRsb2NrID0gKHN0cnVjdCBweGRfbG9jayAqKSAmIHRsY2stPmxvY2s7CisJcHhkbG9jay0+ZmxhZyA9IG1sY2tGUkVFUFhEOworCXB4ZGxvY2stPnB4ZCA9IGZyZWVweGQ7CisJcHhkbG9jay0+aW5kZXggPSAxOworCisJd3JpdGVfbWV0YXBhZ2UobXApOworCisJaXBsaXN0WzBdID0gaXBpbWFwOworCisJLyoKKwkgKiBsb2dyZWRvIG5lZWRzIHRoZSBJQUcgbnVtYmVyIGFuZCBJQUcgZXh0ZW50IGluZGV4IGluIG9yZGVyCisJICogdG8gZW5zdXJlIHRoYXQgdGhlIElNYXAgaXMgY29uc2lzdGVudC4gIFRoZSBsZWFzdCBkaXNydXB0aXZlCisJICogd2F5IHRvIHBhc3MgdGhlc2UgdmFsdWVzIHRocm91Z2ggIHRvIHRoZSB0cmFuc2FjdGlvbiBtYW5hZ2VyCisJICogaXMgaW4gdGhlIGlwbGlzdCBhcnJheS4gIAorCSAqIAorCSAqIEl0J3Mgbm90IHByZXR0eSwgYnV0IGl0IHdvcmtzLgorCSAqLworCWlwbGlzdFsxXSA9IChzdHJ1Y3QgaW5vZGUgKikgKHNpemVfdClpYWdubzsKKwlpcGxpc3RbMl0gPSAoc3RydWN0IGlub2RlICopIChzaXplX3QpZXh0bm87CisKKwlyYyA9IHR4Q29tbWl0KHRpZCwgMSwgJmlwbGlzdFswXSwgQ09NTUlUX0ZPUkNFKTsKKworCXR4RW5kKHRpZCk7CisJdXAoJkpGU19JUChpcGltYXApLT5jb21taXRfc2VtKTsKKworCS8qIHVubG9jayB0aGUgQUcgaW5vZGUgbWFwIGluZm9ybWF0aW9uICovCisJQUdfVU5MT0NLKGltYXAsIGFnbm8pOworCisJcmV0dXJuICgwKTsKKworICAgICAgZXJyb3Jfb3V0OgorCUlSRUFEX1VOTE9DSyhpcGltYXApOworCisJaWYgKGFtcCkKKwkJcmVsZWFzZV9tZXRhcGFnZShhbXApOworCWlmIChibXApCisJCXJlbGVhc2VfbWV0YXBhZ2UoYm1wKTsKKwlpZiAoY21wKQorCQlyZWxlYXNlX21ldGFwYWdlKGNtcCk7CisJaWYgKGRtcCkKKwkJcmVsZWFzZV9tZXRhcGFnZShkbXApOworCisJQUdfVU5MT0NLKGltYXAsIGFnbm8pOworCisJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisKKwlyZXR1cm4gKHJjKTsKK30KKworLyoKKyAqIFRoZXJlIGFyZSBzZXZlcmFsIHBsYWNlcyBpbiB0aGUgZGlBbGxvYyogcm91dGluZXMgd2hlcmUgd2UgaW5pdGlhbGl6ZQorICogdGhlIGlub2RlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2RpSW5pdElub2RlKHN0cnVjdCBpbm9kZSAqaXAsIGludCBpYWdubywgaW50IGlubywgaW50IGV4dG5vLCBzdHJ1Y3QgaWFnICogaWFncCkKK3sKKwlzdHJ1Y3QgamZzX3NiX2luZm8gKnNiaSA9IEpGU19TQkkoaXAtPmlfc2IpOworCXN0cnVjdCBqZnNfaW5vZGVfaW5mbyAqamZzX2lwID0gSkZTX0lQKGlwKTsKKworCWlwLT5pX2lubyA9IChpYWdubyA8PCBMMklOT1NQRVJJQUcpICsgaW5vOworCURCR19ESUFMTE9DKEpGU19JUChpcGltYXApLT5pX2ltYXAsIGlwLT5pX2lubyk7CisJamZzX2lwLT5peHB4ZCA9IGlhZ3AtPmlub2V4dFtleHRub107CisJamZzX2lwLT5hZ25vID0gQkxLVE9BRyhsZTY0X3RvX2NwdShpYWdwLT5hZ3N0YXJ0KSwgc2JpKTsKKwlqZnNfaXAtPmFjdGl2ZV9hZyA9IC0xOworfQorCisKKy8qCisgKiBOQU1FOiAgICAgICAgZGlBbGxvYyhwaXAsZGlyLGlwKQorICoKKyAqIEZVTkNUSU9OOiAgICBhbGxvY2F0ZSBhIGRpc2sgaW5vZGUgZnJvbSB0aGUgaW5vZGUgd29ya2luZyBtYXAgCisgKgkJZm9yIGEgZmlsZXNldCBvciBhZ2dyZWdhdGUuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgcGlwICAJLSBwb2ludGVyIHRvIGluY29yZSBpbm9kZSBmb3IgdGhlIHBhcmVudCBpbm9kZS4KKyAqICAgICAgZGlyICAJLSBUUlVFIGlmIHRoZSBuZXcgZGlzayBpbm9kZSBpcyBmb3IgYSBkaXJlY3RvcnkuCisgKiAgICAgIGlwICAJLSBwb2ludGVyIHRvIGEgbmV3IGlub2RlCisgKgorICogUkVUVVJOIFZBTFVFUzoKKyAqICAgICAgMCAgICAgICAtIHN1Y2Nlc3MuCisgKiAgICAgIC1FTk9TUEMJLSBpbnN1ZmZpY2llbnQgZGlzayByZXNvdXJjZXMuCisgKiAgICAgIC1FSU8gIAktIGkvbyBlcnJvci4KKyAqLworaW50IGRpQWxsb2Moc3RydWN0IGlub2RlICpwaXAsIGJvb2xlYW5fdCBkaXIsIHN0cnVjdCBpbm9kZSAqaXApCit7CisJaW50IHJjLCBpbm8sIGlhZ25vLCBhZGRleHQsIGV4dG5vLCBiaXRubywgc3dvcmQ7CisJaW50IG53b3JkcywgcmVtLCBpLCBhZ25vOworCXUzMiBtYXNrLCBpbm9zbWFwLCBleHRzbWFwOworCXN0cnVjdCBpbm9kZSAqaXBpbWFwOworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJaW5vX3QgaW51bTsKKwlzdHJ1Y3QgaWFnICppYWdwOworCXN0cnVjdCBpbm9tYXAgKmltYXA7CisKKwkvKiBnZXQgdGhlIHBvaW50ZXJzIHRvIHRoZSBpbm9kZSBtYXAgaW5vZGUgYW5kIHRoZQorCSAqIGNvcnJlc3BvbmRpbmcgaW1hcCBjb250cm9sIHN0cnVjdHVyZS4KKwkgKi8KKwlpcGltYXAgPSBKRlNfU0JJKHBpcC0+aV9zYiktPmlwaW1hcDsKKwlpbWFwID0gSkZTX0lQKGlwaW1hcCktPmlfaW1hcDsKKwlKRlNfSVAoaXApLT5pcGltYXAgPSBpcGltYXA7CisJSkZTX0lQKGlwKS0+ZmlsZXNldCA9IEZJTEVTWVNURU1fSTsKKworCS8qIGZvciBhIGRpcmVjdG9yeSwgdGhlIGFsbG9jYXRpb24gcG9saWN5IGlzIHRvIHN0YXJ0IAorCSAqIGF0IHRoZSBhZyBsZXZlbCB1c2luZyB0aGUgcHJlZmVycmVkIGFnLgorCSAqLworCWlmIChkaXIgPT0gVFJVRSkgeworCQlhZ25vID0gZGJOZXh0QUcoSkZTX1NCSShwaXAtPmlfc2IpLT5pcGJtYXApOworCQlBR19MT0NLKGltYXAsIGFnbm8pOworCQlnb3RvIHRyeWFnOworCX0KKworCS8qIGZvciBmaWxlcywgdGhlIHBvbGljeSBzdGFydHMgb2ZmIGJ5IHRyeWluZyB0byBhbGxvY2F0ZSBmcm9tCisJICogdGhlIHNhbWUgaWFnIGNvbnRhaW5pbmcgdGhlIHBhcmVudCBkaXNrIGlub2RlOgorCSAqIHRyeSB0byBhbGxvY2F0ZSB0aGUgbmV3IGRpc2sgaW5vZGUgY2xvc2UgdG8gdGhlIHBhcmVudCBkaXNrCisJICogaW5vZGUsIHVzaW5nIHBhcmVudCBkaXNrIGlub2RlIG51bWJlciArIDEgYXMgdGhlIGFsbG9jYXRpb24KKwkgKiBoaW50LiAgKHdlIHVzZSBhIGxlZnQtdG8tcmlnaHQgcG9saWN5IHRvIGF0dGVtcHQgdG8gYXZvaWQKKwkgKiBtb3ZpbmcgYmFja3dhcmQgb24gdGhlIGRpc2suKSAgY29tcHV0ZSB0aGUgaGludCB3aXRoaW4gdGhlCisJICogZmlsZSBzeXN0ZW0gYW5kIHRoZSBpYWcuCisJICovCisKKwkvKiBnZXQgdGhlIGFnIG51bWJlciBvZiB0aGlzIGlhZyAqLworCWFnbm8gPSBKRlNfSVAocGlwKS0+YWdubzsKKworCWlmIChhdG9taWNfcmVhZCgmSkZTX1NCSShwaXAtPmlfc2IpLT5ibWFwLT5kYl9hY3RpdmVbYWdub10pKSB7CisJCS8qCisJCSAqIFRoZXJlIGlzIGFuIG9wZW4gZmlsZSBhY3RpdmVseSBncm93aW5nLiAgV2Ugd2FudCB0bworCQkgKiBhbGxvY2F0ZSBuZXcgaW5vZGVzIGZyb20gYSBkaWZmZXJlbnQgYWcgdG8gYXZvaWQKKwkJICogZnJhZ21lbnRhdGlvbiBwcm9ibGVtcy4KKwkJICovCisJCWFnbm8gPSBkYk5leHRBRyhKRlNfU0JJKHBpcC0+aV9zYiktPmlwYm1hcCk7CisJCUFHX0xPQ0soaW1hcCwgYWdubyk7CisJCWdvdG8gdHJ5YWc7CisJfQorCisJaW51bSA9IHBpcC0+aV9pbm8gKyAxOworCWlubyA9IGludW0gJiAoSU5PU1BFUklBRyAtIDEpOworCisJLyogYmFjayBvZmYgdGhlIHRoZSBoaW50IGlmIGl0IGlzIG91dHNpZGUgb2YgdGhlIGlhZyAqLworCWlmIChpbm8gPT0gMCkKKwkJaW51bSA9IHBpcC0+aV9pbm87CisKKwkvKiBsb2NrIHRoZSBBRyBpbm9kZSBtYXAgaW5mb3JtYXRpb24gKi8KKwlBR19MT0NLKGltYXAsIGFnbm8pOworCisJLyogR2V0IHJlYWQgbG9jayBvbiBpbWFwIGlub2RlICovCisJSVJFQURfTE9DSyhpcGltYXApOworCisJLyogZ2V0IHRoZSBpYWcgbnVtYmVyIGFuZCByZWFkIHRoZSBpYWcgKi8KKwlpYWdubyA9IElOT1RPSUFHKGludW0pOworCWlmICgocmMgPSBkaUlBR1JlYWQoaW1hcCwgaWFnbm8sICZtcCkpKSB7CisJCUlSRUFEX1VOTE9DSyhpcGltYXApOworCQlBR19VTkxPQ0soaW1hcCwgYWdubyk7CisJCXJldHVybiAocmMpOworCX0KKwlpYWdwID0gKHN0cnVjdCBpYWcgKikgbXAtPmRhdGE7CisKKwkvKiBkZXRlcm1pbmUgaWYgbmV3IGlub2RlIGV4dGVudCBpcyBhbGxvd2VkIHRvIGJlIGFkZGVkIHRvIHRoZSBpYWcuCisJICogbmV3IGlub2RlIGV4dGVudCBjYW4gYmUgYWRkZWQgdG8gdGhlIGlhZyBpZiB0aGUgYWcKKwkgKiBoYXMgbGVzcyB0aGFuIDMyIGZyZWUgZGlzayBpbm9kZXMgYW5kIHRoZSBpYWcgaGFzIGZyZWUgZXh0ZW50cy4KKwkgKi8KKwlhZGRleHQgPSAoaW1hcC0+aW1fYWdjdGxbYWdub10ubnVtZnJlZSA8IDMyICYmIGlhZ3AtPm5mcmVlZXh0cyk7CisKKwkvKgorCSAqICAgICAgdHJ5IHRvIGFsbG9jYXRlIGZyb20gdGhlIElBRworCSAqLworCS8qIGNoZWNrIGlmIHRoZSBpbm9kZSBtYXkgYmUgYWxsb2NhdGVkIGZyb20gdGhlIGlhZyAKKwkgKiAoaS5lLiB0aGUgaW5vZGUgaGFzIGZyZWUgaW5vZGVzIG9yIG5ldyBleHRlbnQgY2FuIGJlIGFkZGVkKS4KKwkgKi8KKwlpZiAoaWFncC0+bmZyZWVpbm9zIHx8IGFkZGV4dCkgeworCQkvKiBkZXRlcm1pbmUgdGhlIGV4dGVudCBudW1iZXIgb2YgdGhlIGhpbnQuCisJCSAqLworCQlleHRubyA9IGlubyA+PiBMMklOT1NQRVJFWFQ7CisKKwkJLyogY2hlY2sgaWYgdGhlIGV4dGVudCBjb250YWluaW5nIHRoZSBoaW50IGhhcyBiYWNrZWQKKwkJICogaW5vZGVzLiAgaWYgc28sIHRyeSB0byBhbGxvY2F0ZSB3aXRoaW4gdGhpcyBleHRlbnQuCisJCSAqLworCQlpZiAoYWRkcmVzc1BYRCgmaWFncC0+aW5vZXh0W2V4dG5vXSkpIHsKKwkJCWJpdG5vID0gaW5vICYgKElOT1NQRVJFWFQgLSAxKTsKKwkJCWlmICgoYml0bm8gPQorCQkJICAgICBkaUZpbmRGcmVlKGxlMzJfdG9fY3B1KGlhZ3AtPndtYXBbZXh0bm9dKSwKKwkJCQkJYml0bm8pKQorCQkJICAgIDwgSU5PU1BFUkVYVCkgeworCQkJCWlubyA9IChleHRubyA8PCBMMklOT1NQRVJFWFQpICsgYml0bm87CisKKwkJCQkvKiBhIGZyZWUgaW5vZGUgKGJpdCkgd2FzIGZvdW5kIHdpdGhpbiB0aGlzCisJCQkJICogZXh0ZW50LCBzbyBhbGxvY2F0ZSBpdC4KKwkJCQkgKi8KKwkJCQlyYyA9IGRpQWxsb2NCaXQoaW1hcCwgaWFncCwgaW5vKTsKKwkJCQlJUkVBRF9VTkxPQ0soaXBpbWFwKTsKKwkJCQlpZiAocmMpIHsKKwkJCQkJYXNzZXJ0KHJjID09IC1FSU8pOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIHNldCB0aGUgcmVzdWx0cyBvZiB0aGUgYWxsb2NhdGlvbgorCQkJCQkgKiBhbmQgd3JpdGUgdGhlIGlhZy4KKwkJCQkJICovCisJCQkJCWRpSW5pdElub2RlKGlwLCBpYWdubywgaW5vLCBleHRubywKKwkJCQkJCSAgICBpYWdwKTsKKwkJCQkJbWFya19tZXRhcGFnZV9kaXJ0eShtcCk7CisJCQkJfQorCQkJCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCisJCQkJLyogZnJlZSB0aGUgQUcgbG9jayBhbmQgcmV0dXJuLgorCQkJCSAqLworCQkJCUFHX1VOTE9DSyhpbWFwLCBhZ25vKTsKKwkJCQlyZXR1cm4gKHJjKTsKKwkJCX0KKworCQkJaWYgKCFhZGRleHQpCisJCQkJZXh0bm8gPQorCQkJCSAgICAoZXh0bm8gPT0KKwkJCQkgICAgIEVYVFNQRVJJQUcgLSAxKSA/IDAgOiBleHRubyArIDE7CisJCX0KKworCQkvKgorCQkgKiBubyBmcmVlIGlub2RlcyB3aXRoaW4gdGhlIGV4dGVudCBjb250YWluaW5nIHRoZSBoaW50LgorCQkgKgorCQkgKiB0cnkgdG8gYWxsb2NhdGUgZnJvbSB0aGUgYmFja2VkIGV4dGVudHMgZm9sbG93aW5nCisJCSAqIGhpbnQgb3IsIGlmIGFwcHJvcHJpYXRlIChpLmUuIGFkZGV4dCBpcyB0cnVlKSwgYWxsb2NhdGUKKwkJICogYW4gZXh0ZW50IG9mIGZyZWUgaW5vZGVzIGF0IG9yIGZvbGxvd2luZyB0aGUgZXh0ZW50CisJCSAqIGNvbnRhaW5pbmcgdGhlIGhpbnQuCisJCSAqIAorCQkgKiB0aGUgZnJlZSBpbm9kZSBhbmQgZnJlZSBleHRlbnQgc3VtbWFyeSBtYXBzIGFyZSB1c2VkCisJCSAqIGhlcmUsIHNvIGRldGVybWluZSB0aGUgc3RhcnRpbmcgc3VtbWFyeSBtYXAgcG9zaXRpb24KKwkJICogYW5kIHRoZSBudW1iZXIgb2Ygd29yZHMgd2UnbGwgaGF2ZSB0byBleGFtaW5lLiAgYWdhaW4sCisJCSAqIHRoZSBhcHByb2FjaCBpcyB0byBhbGxvY2F0ZSBmb2xsb3dpbmcgdGhlIGhpbnQsIHNvIHdlCisJCSAqIG1pZ2h0IGhhdmUgdG8gaW5pdGlhbGx5IGlnbm9yZSBwcmlvciBiaXRzIG9mIHRoZSBzdW1tYXJ5CisJCSAqIG1hcCB0aGF0IHJlcHJlc2VudCBleHRlbnRzIHByaW9yIHRvIHRoZSBleHRlbnQgY29udGFpbmluZworCQkgKiB0aGUgaGludCBhbmQgbGF0ZXIgcmV2aXNpdCB0aGVzZSBiaXRzLgorCQkgKi8KKwkJYml0bm8gPSBleHRubyAmIChFWFRTUEVSU1VNIC0gMSk7CisJCW53b3JkcyA9IChiaXRubyA9PSAwKSA/IFNNQVBTWiA6IFNNQVBTWiArIDE7CisJCXN3b3JkID0gZXh0bm8gPj4gTDJFWFRTUEVSU1VNOworCisJCS8qIG1hc2sgYW55IHByaW9yIGJpdHMgZm9yIHRoZSBzdGFydGluZyB3b3JkcyBvZiB0aGUKKwkJICogc3VtbWFyeSBtYXAuCisJCSAqLworCQltYXNrID0gT05FUyA8PCAoRVhUU1BFUlNVTSAtIGJpdG5vKTsKKwkJaW5vc21hcCA9IGxlMzJfdG9fY3B1KGlhZ3AtPmlub3NtYXBbc3dvcmRdKSB8IG1hc2s7CisJCWV4dHNtYXAgPSBsZTMyX3RvX2NwdShpYWdwLT5leHRzbWFwW3N3b3JkXSkgfCBtYXNrOworCisJCS8qIHNjYW4gdGhlIGZyZWUgaW5vZGUgYW5kIGZyZWUgZXh0ZW50IHN1bW1hcnkgbWFwcyBmb3IKKwkJICogZnJlZSByZXNvdXJjZXMuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgbndvcmRzOyBpKyspIHsKKwkJCS8qIGNoZWNrIGlmIHRoaXMgd29yZCBvZiB0aGUgZnJlZSBpbm9kZSBzdW1tYXJ5CisJCQkgKiBtYXAgZGVzY3JpYmVzIGFuIGV4dGVudCB3aXRoIGZyZWUgaW5vZGVzLgorCQkJICovCisJCQlpZiAofmlub3NtYXApIHsKKwkJCQkvKiBhbiBleHRlbnQgd2l0aCBmcmVlIGlub2RlcyBoYXMgYmVlbgorCQkJCSAqIGZvdW5kLiBkZXRlcm1pbmUgdGhlIGV4dGVudCBudW1iZXIKKwkJCQkgKiBhbmQgdGhlIGlub2RlIG51bWJlciB3aXRoaW4gdGhlIGV4dGVudC4KKwkJCQkgKi8KKwkJCQlyZW0gPSBkaUZpbmRGcmVlKGlub3NtYXAsIDApOworCQkJCWV4dG5vID0gKHN3b3JkIDw8IEwyRVhUU1BFUlNVTSkgKyByZW07CisJCQkJcmVtID0gZGlGaW5kRnJlZShsZTMyX3RvX2NwdShpYWdwLT53bWFwW2V4dG5vXSksCisJCQkJCQkgMCk7CisJCQkJaWYgKHJlbSA+PSBJTk9TUEVSRVhUKSB7CisJCQkJCUlSRUFEX1VOTE9DSyhpcGltYXApOworCQkJCQlyZWxlYXNlX21ldGFwYWdlKG1wKTsKKwkJCQkJQUdfVU5MT0NLKGltYXAsIGFnbm8pOworCQkJCQlqZnNfZXJyb3IoaXAtPmlfc2IsCisJCQkJCQkgICJkaUFsbG9jOiBjYW4ndCBmaW5kIGZyZWUgYml0ICIKKwkJCQkJCSAgImluIHdtYXAiKTsKKwkJCQkJcmV0dXJuIEVJTzsKKwkJCQl9CisKKwkJCQkvKiBkZXRlcm1pbmUgdGhlIGlub2RlIG51bWJlciB3aXRoaW4gdGhlCisJCQkJICogaWFnIGFuZCBhbGxvY2F0ZSB0aGUgaW5vZGUgZnJvbSB0aGUKKwkJCQkgKiBtYXAuCisJCQkJICovCisJCQkJaW5vID0gKGV4dG5vIDw8IEwySU5PU1BFUkVYVCkgKyByZW07CisJCQkJcmMgPSBkaUFsbG9jQml0KGltYXAsIGlhZ3AsIGlubyk7CisJCQkJSVJFQURfVU5MT0NLKGlwaW1hcCk7CisJCQkJaWYgKHJjKQorCQkJCQlhc3NlcnQocmMgPT0gLUVJTyk7CisJCQkJZWxzZSB7CisJCQkJCS8qIHNldCB0aGUgcmVzdWx0cyBvZiB0aGUgYWxsb2NhdGlvbgorCQkJCQkgKiBhbmQgd3JpdGUgdGhlIGlhZy4KKwkJCQkJICovCisJCQkJCWRpSW5pdElub2RlKGlwLCBpYWdubywgaW5vLCBleHRubywKKwkJCQkJCSAgICBpYWdwKTsKKwkJCQkJbWFya19tZXRhcGFnZV9kaXJ0eShtcCk7CisJCQkJfQorCQkJCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCisJCQkJLyogZnJlZSB0aGUgQUcgbG9jayBhbmQgcmV0dXJuLgorCQkJCSAqLworCQkJCUFHX1VOTE9DSyhpbWFwLCBhZ25vKTsKKwkJCQlyZXR1cm4gKHJjKTsKKworCQkJfQorCisJCQkvKiBjaGVjayBpZiB3ZSBtYXkgYWxsb2NhdGUgYW4gZXh0ZW50IG9mIGZyZWUKKwkJCSAqIGlub2RlcyBhbmQgd2hldGhlciB0aGlzIHdvcmQgb2YgdGhlIGZyZWUKKwkJCSAqIGV4dGVudHMgc3VtbWFyeSBtYXAgZGVzY3JpYmVzIGEgZnJlZSBleHRlbnQuCisJCQkgKi8KKwkJCWlmIChhZGRleHQgJiYgfmV4dHNtYXApIHsKKwkJCQkvKiBhIGZyZWUgZXh0ZW50IGhhcyBiZWVuIGZvdW5kLiAgZGV0ZXJtaW5lCisJCQkJICogdGhlIGV4dGVudCBudW1iZXIuCisJCQkJICovCisJCQkJcmVtID0gZGlGaW5kRnJlZShleHRzbWFwLCAwKTsKKwkJCQlleHRubyA9IChzd29yZCA8PCBMMkVYVFNQRVJTVU0pICsgcmVtOworCisJCQkJLyogYWxsb2NhdGUgYW4gZXh0ZW50IG9mIGZyZWUgaW5vZGVzLgorCQkJCSAqLworCQkJCWlmICgocmMgPSBkaU5ld0V4dChpbWFwLCBpYWdwLCBleHRubykpKSB7CisJCQkJCS8qIGlmIHRoZXJlIGlzIG5vIGRpc2sgc3BhY2UgZm9yIGEKKwkJCQkJICogbmV3IGV4dGVudCwgdHJ5IHRvIGFsbG9jYXRlIHRoZQorCQkJCQkgKiBkaXNrIGlub2RlIGZyb20gc29tZXdoZXJlIGVsc2UuCisJCQkJCSAqLworCQkJCQlpZiAocmMgPT0gLUVOT1NQQykKKwkJCQkJCWJyZWFrOworCisJCQkJCWFzc2VydChyYyA9PSAtRUlPKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBzZXQgdGhlIHJlc3VsdHMgb2YgdGhlIGFsbG9jYXRpb24KKwkJCQkJICogYW5kIHdyaXRlIHRoZSBpYWcuCisJCQkJCSAqLworCQkJCQlkaUluaXRJbm9kZShpcCwgaWFnbm8sCisJCQkJCQkgICAgZXh0bm8gPDwgTDJJTk9TUEVSRVhULAorCQkJCQkJICAgIGV4dG5vLCBpYWdwKTsKKwkJCQkJbWFya19tZXRhcGFnZV9kaXJ0eShtcCk7CisJCQkJfQorCQkJCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCQkJCS8qIGZyZWUgdGhlIGltYXAgaW5vZGUgJiB0aGUgQUcgbG9jayAmIHJldHVybi4KKwkJCQkgKi8KKwkJCQlJUkVBRF9VTkxPQ0soaXBpbWFwKTsKKwkJCQlBR19VTkxPQ0soaW1hcCwgYWdubyk7CisJCQkJcmV0dXJuIChyYyk7CisJCQl9CisKKwkJCS8qIG1vdmUgb24gdG8gdGhlIG5leHQgc2V0IG9mIHN1bW1hcnkgbWFwIHdvcmRzLgorCQkJICovCisJCQlzd29yZCA9IChzd29yZCA9PSBTTUFQU1ogLSAxKSA/IDAgOiBzd29yZCArIDE7CisJCQlpbm9zbWFwID0gbGUzMl90b19jcHUoaWFncC0+aW5vc21hcFtzd29yZF0pOworCQkJZXh0c21hcCA9IGxlMzJfdG9fY3B1KGlhZ3AtPmV4dHNtYXBbc3dvcmRdKTsKKwkJfQorCX0KKwkvKiB1bmxvY2sgaW1hcCBpbm9kZSAqLworCUlSRUFEX1VOTE9DSyhpcGltYXApOworCisJLyogbm90aGluZyBkb2luZyBpbiB0aGlzIGlhZywgc28gcmVsZWFzZSBpdC4gKi8KKwlyZWxlYXNlX21ldGFwYWdlKG1wKTsKKworICAgICAgdHJ5YWc6CisJLyoKKwkgKiB0cnkgdG8gYWxsb2NhdGUgYW55d2hlcmUgd2l0aGluIHRoZSBzYW1lIEFHIGFzIHRoZSBwYXJlbnQgaW5vZGUuCisJICovCisJcmMgPSBkaUFsbG9jQUcoaW1hcCwgYWdubywgZGlyLCBpcCk7CisKKwlBR19VTkxPQ0soaW1hcCwgYWdubyk7CisKKwlpZiAocmMgIT0gLUVOT1NQQykKKwkJcmV0dXJuIChyYyk7CisKKwkvKgorCSAqIHRyeSB0byBhbGxvY2F0ZSBpbiBhbnkgQUcuCisJICovCisJcmV0dXJuIChkaUFsbG9jQW55KGltYXAsIGFnbm8sIGRpciwgaXApKTsKK30KKworCisvKgorICogTkFNRTogICAgICAgIGRpQWxsb2NBRyhpbWFwLGFnbm8sZGlyLGlwKQorICoKKyAqIEZVTkNUSU9OOiAgICBhbGxvY2F0ZSBhIGRpc2sgaW5vZGUgZnJvbSB0aGUgYWxsb2NhdGlvbiBncm91cC4KKyAqCisgKgkJdGhpcyByb3V0aW5lIGZpcnN0IGRldGVybWluZXMgaWYgYSBuZXcgZXh0ZW50IG9mIGZyZWUKKyAqCQlpbm9kZXMgc2hvdWxkIGJlIGFkZGVkIGZvciB0aGUgYWxsb2NhdGlvbiBncm91cCwgd2l0aAorICoJCXRoZSBjdXJyZW50IHJlcXVlc3Qgc2F0aXNmaWVkIGZyb20gdGhpcyBleHRlbnQuIGlmIHRoaXMKKyAqCQlpcyB0aGUgY2FzZSwgYW4gYXR0ZW1wdCB3aWxsIGJlIG1hZGUgdG8gZG8ganVzdCB0aGF0LiAgaWYKKyAqCQl0aGlzIGF0dGVtcHQgZmFpbHMgb3IgaXQgaGFzIGJlZW4gZGV0ZXJtaW5lZCB0aGF0IGEgbmV3IAorICoJCWV4dGVudCBzaG91bGQgbm90IGJlIGFkZGVkLCBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gc2F0aXNmeQorICoJCXRoZSByZXF1ZXN0IGJ5IGFsbG9jYXRpbmcgYW4gZXhpc3RpbmcgKGJhY2tlZCkgZnJlZSBpbm9kZQorICoJCWZyb20gdGhlIGFsbG9jYXRpb24gZ3JvdXAuCisgKgorICogUFJFIENPTkRJVElPTjogQWxyZWFkeSBoYXZlIHRoZSBBRyBsb2NrIGZvciB0aGlzIEFHLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIGltYXAgIAktIHBvaW50ZXIgdG8gaW5vZGUgbWFwIGNvbnRyb2wgc3RydWN0dXJlLgorICogICAgICBhZ25vICAJLSBhbGxvY2F0aW9uIGdyb3VwIHRvIGFsbG9jYXRlIGZyb20uCisgKiAgICAgIGRpciAgCS0gVFJVRSBpZiB0aGUgbmV3IGRpc2sgaW5vZGUgaXMgZm9yIGEgZGlyZWN0b3J5LgorICogICAgICBpcCAgCS0gcG9pbnRlciB0byB0aGUgbmV3IGlub2RlIHRvIGJlIGZpbGxlZCBpbiBvbiBzdWNjZXNzZnVsIHJldHVybgorICoJCSAgd2l0aCB0aGUgZGlzayBpbm9kZSBudW1iZXIgYWxsb2NhdGVkLCBpdHMgZXh0ZW50IGFkZHJlc3MKKyAqCQkgIGFuZCB0aGUgc3RhcnQgb2YgdGhlIGFnLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIDAgICAgICAgLSBzdWNjZXNzLgorICogICAgICAtRU5PU1BDCS0gaW5zdWZmaWNpZW50IGRpc2sgcmVzb3VyY2VzLgorICogICAgICAtRUlPICAJLSBpL28gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQKK2RpQWxsb2NBRyhzdHJ1Y3QgaW5vbWFwICogaW1hcCwgaW50IGFnbm8sIGJvb2xlYW5fdCBkaXIsIHN0cnVjdCBpbm9kZSAqaXApCit7CisJaW50IHJjLCBhZGRleHQsIG51bWZyZWUsIG51bWlub3M7CisKKwkvKiBnZXQgdGhlIG51bWJlciBvZiBmcmVlIGFuZCB0aGUgbnVtYmVyIG9mIGJhY2tlZCBkaXNrIAorCSAqIGlub2RlcyBjdXJyZW50bHkgd2l0aGluIHRoZSBhZy4KKwkgKi8KKwludW1mcmVlID0gaW1hcC0+aW1fYWdjdGxbYWdub10ubnVtZnJlZTsKKwludW1pbm9zID0gaW1hcC0+aW1fYWdjdGxbYWdub10ubnVtaW5vczsKKworCWlmIChudW1mcmVlID4gbnVtaW5vcykgeworCQlqZnNfZXJyb3IoaXAtPmlfc2IsICJkaUFsbG9jQUc6IG51bWZyZWUgPiBudW1pbm9zIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIGRldGVybWluZSBpZiB3ZSBzaG91bGQgYWxsb2NhdGUgYSBuZXcgZXh0ZW50IG9mIGZyZWUgaW5vZGVzCisJICogd2l0aGluIHRoZSBhZzogZm9yIGRpcmVjdG9yeSBpbm9kZXMsIGFkZCBhIG5ldyBleHRlbnQKKwkgKiBpZiB0aGVyZSBhcmUgYSBzbWFsbCBudW1iZXIgb2YgZnJlZSBpbm9kZXMgb3IgbnVtYmVyIG9mIGZyZWUKKwkgKiBpbm9kZXMgaXMgYSBzbWFsbCBwZXJjZW50YWdlIG9mIHRoZSBudW1iZXIgb2YgYmFja2VkIGlub2Rlcy4KKwkgKi8KKwlpZiAoZGlyID09IFRSVUUpCisJCWFkZGV4dCA9IChudW1mcmVlIDwgNjQgfHwKKwkJCSAgKG51bWZyZWUgPCAyNTYKKwkJCSAgICYmICgobnVtZnJlZSAqIDEwMCkgLyBudW1pbm9zKSA8PSAyMCkpOworCWVsc2UKKwkJYWRkZXh0ID0gKG51bWZyZWUgPT0gMCk7CisKKwkvKgorCSAqIHRyeSB0byBhbGxvY2F0ZSBhIG5ldyBleHRlbnQgb2YgZnJlZSBpbm9kZXMuCisJICovCisJaWYgKGFkZGV4dCkgeworCQkvKiBpZiBmcmVlIHNwYWNlIGlzIG5vdCBhdmFsaWFibGUgZm9yIHRoaXMgbmV3IGV4dGVudCwgdHJ5CisJCSAqIGJlbG93IHRvIGFsbG9jYXRlIGEgZnJlZSBhbmQgZXhpc3RpbmcgKGFscmVhZHkgYmFja2VkKQorCQkgKiBpbm9kZSBmcm9tIHRoZSBhZy4KKwkJICovCisJCWlmICgocmMgPSBkaUFsbG9jRXh0KGltYXAsIGFnbm8sIGlwKSkgIT0gLUVOT1NQQykKKwkJCXJldHVybiAocmMpOworCX0KKworCS8qCisJICogdHJ5IHRvIGFsbG9jYXRlIGFuIGV4aXN0aW5nIGZyZWUgaW5vZGUgZnJvbSB0aGUgYWcuCisJICovCisJcmV0dXJuIChkaUFsbG9jSW5vKGltYXAsIGFnbm8sIGlwKSk7Cit9CisKKworLyoKKyAqIE5BTUU6ICAgICAgICBkaUFsbG9jQW55KGltYXAsYWdubyxkaXIsaWFwKQorICoKKyAqIEZVTkNUSU9OOiAgICBhbGxvY2F0ZSBhIGRpc2sgaW5vZGUgZnJvbSBhbnkgb3RoZXIgYWxsb2NhdGlvbiBncm91cC4KKyAqCisgKgkJdGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIGFuIGFsbG9jYXRpb24gYXR0ZW1wdCB3aXRoaW4KKyAqCQl0aGUgcHJpbWFyeSBhbGxvY2F0aW9uIGdyb3VwIGhhcyBmYWlsZWQuIGlmIGF0dGVtcHRzIHRvCisgKgkJYWxsb2NhdGUgYW4gaW5vZGUgZnJvbSBhbnkgYWxsb2NhdGlvbiBncm91cCBvdGhlciB0aGFuIHRoZQorICoJCXNwZWNpZmllZCBwcmltYXJ5IGdyb3VwLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIGltYXAgIAktIHBvaW50ZXIgdG8gaW5vZGUgbWFwIGNvbnRyb2wgc3RydWN0dXJlLgorICogICAgICBhZ25vICAJLSBwcmltYXJ5IGFsbG9jYXRpb24gZ3JvdXAgKHRvIGF2b2lkKS4KKyAqICAgICAgZGlyICAJLSBUUlVFIGlmIHRoZSBuZXcgZGlzayBpbm9kZSBpcyBmb3IgYSBkaXJlY3RvcnkuCisgKiAgICAgIGlwICAJLSBwb2ludGVyIHRvIGEgbmV3IGlub2RlIHRvIGJlIGZpbGxlZCBpbiBvbiBzdWNjZXNzZnVsIHJldHVybgorICoJCSAgd2l0aCB0aGUgZGlzayBpbm9kZSBudW1iZXIgYWxsb2NhdGVkLCBpdHMgZXh0ZW50IGFkZHJlc3MKKyAqCQkgIGFuZCB0aGUgc3RhcnQgb2YgdGhlIGFnLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIDAgICAgICAgLSBzdWNjZXNzLgorICogICAgICAtRU5PU1BDCS0gaW5zdWZmaWNpZW50IGRpc2sgcmVzb3VyY2VzLgorICogICAgICAtRUlPICAJLSBpL28gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQKK2RpQWxsb2NBbnkoc3RydWN0IGlub21hcCAqIGltYXAsIGludCBhZ25vLCBib29sZWFuX3QgZGlyLCBzdHJ1Y3QgaW5vZGUgKmlwKQoreworCWludCBhZywgcmM7CisJaW50IG1heGFnID0gSkZTX1NCSShpbWFwLT5pbV9pcGltYXAtPmlfc2IpLT5ibWFwLT5kYl9tYXhhZzsKKworCisJLyogdHJ5IHRvIGFsbG9jYXRlIGZyb20gdGhlIGFncyBmb2xsb3dpbmcgYWdubyB1cCB0byAKKwkgKiB0aGUgbWF4aW11bSBhZyBudW1iZXIuCisJICovCisJZm9yIChhZyA9IGFnbm8gKyAxOyBhZyA8PSBtYXhhZzsgYWcrKykgeworCQlBR19MT0NLKGltYXAsIGFnKTsKKworCQlyYyA9IGRpQWxsb2NBRyhpbWFwLCBhZywgZGlyLCBpcCk7CisKKwkJQUdfVU5MT0NLKGltYXAsIGFnKTsKKworCQlpZiAocmMgIT0gLUVOT1NQQykKKwkJCXJldHVybiAocmMpOworCX0KKworCS8qIHRyeSB0byBhbGxvY2F0ZSBmcm9tIHRoZSBhZ3MgaW4gZnJvbnQgb2YgYWduby4KKwkgKi8KKwlmb3IgKGFnID0gMDsgYWcgPCBhZ25vOyBhZysrKSB7CisJCUFHX0xPQ0soaW1hcCwgYWcpOworCisJCXJjID0gZGlBbGxvY0FHKGltYXAsIGFnLCBkaXIsIGlwKTsKKworCQlBR19VTkxPQ0soaW1hcCwgYWcpOworCisJCWlmIChyYyAhPSAtRU5PU1BDKQorCQkJcmV0dXJuIChyYyk7CisJfQorCisJLyogbm8gZnJlZSBkaXNrIGlub2Rlcy4KKwkgKi8KKwlyZXR1cm4gLUVOT1NQQzsKK30KKworCisvKgorICogTkFNRTogICAgICAgIGRpQWxsb2NJbm8oaW1hcCxhZ25vLGlwKQorICoKKyAqIEZVTkNUSU9OOiAgICBhbGxvY2F0ZSBhIGRpc2sgaW5vZGUgZnJvbSB0aGUgYWxsb2NhdGlvbiBncm91cCdzIGZyZWUKKyAqCQlpbm9kZSBsaXN0LCByZXR1cm5pbmcgYW4gZXJyb3IgaWYgdGhpcyBmcmVlIGxpc3QgaXMKKyAqCQllbXB0eSAoaS5lLiBubyBpYWdzIG9uIHRoZSBsaXN0KS4KKyAqCisgKgkJYWxsb2NhdGlvbiBvY2N1cnMgZnJvbSB0aGUgZmlyc3QgaWFnIG9uIHRoZSBsaXN0IHVzaW5nCisgKgkJdGhlIGlhZydzIGZyZWUgaW5vZGUgc3VtbWFyeSBtYXAgdG8gZmluZCB0aGUgbGVmdG1vc3QKKyAqCQlmcmVlIGlub2RlIGluIHRoZSBpYWcuIAorICoJCQorICogUFJFIENPTkRJVElPTjogQWxyZWFkeSBoYXZlIEFHIGxvY2sgZm9yIHRoaXMgQUcuCisgKgkJCisgKiBQQVJBTUVURVJTOgorICogICAgICBpbWFwICAJLSBwb2ludGVyIHRvIGlub2RlIG1hcCBjb250cm9sIHN0cnVjdHVyZS4KKyAqICAgICAgYWdubyAgCS0gYWxsb2NhdGlvbiBncm91cC4KKyAqICAgICAgaXAgIAktIHBvaW50ZXIgdG8gbmV3IGlub2RlIHRvIGJlIGZpbGxlZCBpbiBvbiBzdWNjZXNzZnVsIHJldHVybgorICoJCSAgd2l0aCB0aGUgZGlzayBpbm9kZSBudW1iZXIgYWxsb2NhdGVkLCBpdHMgZXh0ZW50IGFkZHJlc3MKKyAqCQkgIGFuZCB0aGUgc3RhcnQgb2YgdGhlIGFnLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIDAgICAgICAgLSBzdWNjZXNzLgorICogICAgICAtRU5PU1BDCS0gaW5zdWZmaWNpZW50IGRpc2sgcmVzb3VyY2VzLgorICogICAgICAtRUlPICAJLSBpL28gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgZGlBbGxvY0lubyhzdHJ1Y3QgaW5vbWFwICogaW1hcCwgaW50IGFnbm8sIHN0cnVjdCBpbm9kZSAqaXApCit7CisJaW50IGlhZ25vLCBpbm8sIHJjLCByZW0sIGV4dG5vLCBzd29yZDsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCXN0cnVjdCBpYWcgKmlhZ3A7CisKKwkvKiBjaGVjayBpZiB0aGVyZSBhcmUgaWFncyBvbiB0aGUgYWcncyBmcmVlIGlub2RlIGxpc3QuCisJICovCisJaWYgKChpYWdubyA9IGltYXAtPmltX2FnY3RsW2Fnbm9dLmlub2ZyZWUpIDwgMCkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwkvKiBvYnRhaW4gcmVhZCBsb2NrIG9uIGltYXAgaW5vZGUgKi8KKwlJUkVBRF9MT0NLKGltYXAtPmltX2lwaW1hcCk7CisKKwkvKiByZWFkIHRoZSBpYWcgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QuCisJICovCisJaWYgKChyYyA9IGRpSUFHUmVhZChpbWFwLCBpYWdubywgJm1wKSkpIHsKKwkJSVJFQURfVU5MT0NLKGltYXAtPmltX2lwaW1hcCk7CisJCXJldHVybiAocmMpOworCX0KKwlpYWdwID0gKHN0cnVjdCBpYWcgKikgbXAtPmRhdGE7CisKKwkvKiBiZXR0ZXIgYmUgZnJlZSBpbm9kZXMgaW4gdGhpcyBpYWcgaWYgaXQgaXMgb24gdGhlCisJICogbGlzdC4KKwkgKi8KKwlpZiAoIWlhZ3AtPm5mcmVlaW5vcykgeworCQlJUkVBRF9VTkxPQ0soaW1hcC0+aW1faXBpbWFwKTsKKwkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisJCWpmc19lcnJvcihpcC0+aV9zYiwKKwkJCSAgImRpQWxsb2NJbm86IG5mcmVlaW5vcyA9IDAsIGJ1dCBpYWcgb24gZnJlZWxpc3QiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogc2NhbiB0aGUgZnJlZSBpbm9kZSBzdW1tYXJ5IG1hcCB0byBmaW5kIGFuIGV4dGVudAorCSAqIHdpdGggZnJlZSBpbm9kZXMuCisJICovCisJZm9yIChzd29yZCA9IDA7OyBzd29yZCsrKSB7CisJCWlmIChzd29yZCA+PSBTTUFQU1opIHsKKwkJCUlSRUFEX1VOTE9DSyhpbWFwLT5pbV9pcGltYXApOworCQkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisJCQlqZnNfZXJyb3IoaXAtPmlfc2IsCisJCQkJICAiZGlBbGxvY0lubzogZnJlZSBpbm9kZSBub3QgZm91bmQgaW4gc3VtbWFyeSBtYXAiKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJaWYgKH5pYWdwLT5pbm9zbWFwW3N3b3JkXSkKKwkJCWJyZWFrOworCX0KKworCS8qIGZvdW5kIGEgZXh0ZW50IHdpdGggZnJlZSBpbm9kZXMuIGRldGVybWluZQorCSAqIHRoZSBleHRlbnQgbnVtYmVyLgorCSAqLworCXJlbSA9IGRpRmluZEZyZWUobGUzMl90b19jcHUoaWFncC0+aW5vc21hcFtzd29yZF0pLCAwKTsKKwlpZiAocmVtID49IEVYVFNQRVJTVU0pIHsKKwkJSVJFQURfVU5MT0NLKGltYXAtPmltX2lwaW1hcCk7CisJCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCQlqZnNfZXJyb3IoaXAtPmlfc2IsICJkaUFsbG9jSW5vOiBubyBmcmVlIGV4dGVudCBmb3VuZCIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJZXh0bm8gPSAoc3dvcmQgPDwgTDJFWFRTUEVSU1VNKSArIHJlbTsKKworCS8qIGZpbmQgdGhlIGZpcnN0IGZyZWUgaW5vZGUgaW4gdGhlIGV4dGVudC4KKwkgKi8KKwlyZW0gPSBkaUZpbmRGcmVlKGxlMzJfdG9fY3B1KGlhZ3AtPndtYXBbZXh0bm9dKSwgMCk7CisJaWYgKHJlbSA+PSBJTk9TUEVSRVhUKSB7CisJCUlSRUFEX1VOTE9DSyhpbWFwLT5pbV9pcGltYXApOworCQlyZWxlYXNlX21ldGFwYWdlKG1wKTsKKwkJamZzX2Vycm9yKGlwLT5pX3NiLCAiZGlBbGxvY0lubzogZnJlZSBpbm9kZSBub3QgZm91bmQiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogY29tcHV0ZSB0aGUgaW5vZGUgbnVtYmVyIHdpdGhpbiB0aGUgaWFnLiAKKwkgKi8KKwlpbm8gPSAoZXh0bm8gPDwgTDJJTk9TUEVSRVhUKSArIHJlbTsKKworCS8qIGFsbG9jYXRlIHRoZSBpbm9kZS4KKwkgKi8KKwlyYyA9IGRpQWxsb2NCaXQoaW1hcCwgaWFncCwgaW5vKTsKKwlJUkVBRF9VTkxPQ0soaW1hcC0+aW1faXBpbWFwKTsKKwlpZiAocmMpIHsKKwkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisJCXJldHVybiAocmMpOworCX0KKworCS8qIHNldCB0aGUgcmVzdWx0cyBvZiB0aGUgYWxsb2NhdGlvbiBhbmQgd3JpdGUgdGhlIGlhZy4KKwkgKi8KKwlkaUluaXRJbm9kZShpcCwgaWFnbm8sIGlubywgZXh0bm8sIGlhZ3ApOworCXdyaXRlX21ldGFwYWdlKG1wKTsKKworCXJldHVybiAoMCk7Cit9CisKKworLyoKKyAqIE5BTUU6ICAgICAgICBkaUFsbG9jRXh0KGltYXAsYWdubyxpcCkKKyAqCisgKiBGVU5DVElPTjogICAJYWRkIGEgbmV3IGV4dGVudCBvZiBmcmVlIGlub2RlcyB0byBhbiBpYWcsIGFsbG9jYXRpbmcKKyAqCSAgICAgICAJYW4gaW5vZGUgZnJvbSB0aGlzIGV4dGVudCB0byBzYXRpc2Z5IHRoZSBjdXJyZW50IGFsbG9jYXRpb24KKyAqCSAgICAgICAJcmVxdWVzdC4KKyAqCQkKKyAqCQl0aGlzIHJvdXRpbmUgZmlyc3QgdHJpZXMgdG8gZmluZCBhbiBleGlzdGluZyBpYWcgd2l0aCBmcmVlCisgKgkJZXh0ZW50cyB0aHJvdWdoIHRoZSBhZyBmcmVlIGV4dGVudCBsaXN0LiAgaWYgbGlzdCBpcyBub3QKKyAqCQllbXB0eSwgdGhlIGhlYWQgb2YgdGhlIGxpc3Qgd2lsbCBiZSBzZWxlY3RlZCBhcyB0aGUgaG9tZQorICoJCW9mIHRoZSBuZXcgZXh0ZW50IG9mIGZyZWUgaW5vZGVzLiAgb3RoZXJ3aXNlICh0aGUgbGlzdCBpcworICoJCWVtcHR5KSwgYSBuZXcgaWFnIHdpbGwgYmUgYWxsb2NhdGVkIGZvciB0aGUgYWcgdG8gY29udGFpbgorICoJCXRoZSBleHRlbnQuCisgKgkJCisgKgkJb25jZSBhbiBpYWcgaGFzIGJlZW4gc2VsZWN0ZWQsIHRoZSBmcmVlIGV4dGVudCBzdW1tYXJ5IG1hcAorICoJCWlzIHVzZWQgdG8gbG9jYXRlIGEgZnJlZSBleHRlbnQgd2l0aGluIHRoZSBpYWcgYW5kIGRpTmV3RXh0KCkKKyAqCQlpcyBjYWxsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZXh0ZW50LCB3aXRoIGluaXRpYWxpemF0aW9uCisgKgkJaW5jbHVkaW5nIHRoZSBhbGxvY2F0aW9uIG9mIHRoZSBmaXJzdCBpbm9kZSBvZiB0aGUgZXh0ZW50CisgKgkJZm9yIHRoZSBwdXJwb3NlIG9mIHNhdGlzZnlpbmcgdGhpcyByZXF1ZXN0LgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIGltYXAgIAktIHBvaW50ZXIgdG8gaW5vZGUgbWFwIGNvbnRyb2wgc3RydWN0dXJlLgorICogICAgICBhZ25vICAJLSBhbGxvY2F0aW9uIGdyb3VwIG51bWJlci4KKyAqICAgICAgaXAgIAktIHBvaW50ZXIgdG8gbmV3IGlub2RlIHRvIGJlIGZpbGxlZCBpbiBvbiBzdWNjZXNzZnVsIHJldHVybgorICoJCSAgd2l0aCB0aGUgZGlzayBpbm9kZSBudW1iZXIgYWxsb2NhdGVkLCBpdHMgZXh0ZW50IGFkZHJlc3MKKyAqCQkgIGFuZCB0aGUgc3RhcnQgb2YgdGhlIGFnLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIDAgICAgICAgLSBzdWNjZXNzLgorICogICAgICAtRU5PU1BDCS0gaW5zdWZmaWNpZW50IGRpc2sgcmVzb3VyY2VzLgorICogICAgICAtRUlPICAJLSBpL28gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgZGlBbGxvY0V4dChzdHJ1Y3QgaW5vbWFwICogaW1hcCwgaW50IGFnbm8sIHN0cnVjdCBpbm9kZSAqaXApCit7CisJaW50IHJlbSwgaWFnbm8sIHN3b3JkLCBleHRubywgcmM7CisJc3RydWN0IG1ldGFwYWdlICptcDsKKwlzdHJ1Y3QgaWFnICppYWdwOworCisJLyogY2hlY2sgaWYgdGhlIGFnIGhhcyBhbnkgaWFncyB3aXRoIGZyZWUgZXh0ZW50cy4gIGlmIG5vdCwKKwkgKiBhbGxvY2F0ZSBhIG5ldyBpYWcgZm9yIHRoZSBhZy4KKwkgKi8KKwlpZiAoKGlhZ25vID0gaW1hcC0+aW1fYWdjdGxbYWdub10uZXh0ZnJlZSkgPCAwKSB7CisJCS8qIElmIHN1Y2Nlc3NmdWwsIGRpTmV3SUFHIHdpbGwgb2J0YWluIHRoZSByZWFkIGxvY2sgb24gdGhlCisJCSAqIGltYXAgaW5vZGUuCisJCSAqLworCQlpZiAoKHJjID0gZGlOZXdJQUcoaW1hcCwgJmlhZ25vLCBhZ25vLCAmbXApKSkgeworCQkJcmV0dXJuIChyYyk7CisJCX0KKwkJaWFncCA9IChzdHJ1Y3QgaWFnICopIG1wLT5kYXRhOworCisJCS8qIHNldCB0aGUgYWcgbnVtYmVyIGlmIHRoaXMgYSBicmFuZCBuZXcgaWFnCisJCSAqLworCQlpYWdwLT5hZ3N0YXJ0ID0KKwkJICAgIGNwdV90b19sZTY0KEFHVE9CTEsoYWdubywgaW1hcC0+aW1faXBpbWFwKSk7CisJfSBlbHNlIHsKKwkJLyogcmVhZCB0aGUgaWFnLgorCQkgKi8KKwkJSVJFQURfTE9DSyhpbWFwLT5pbV9pcGltYXApOworCQlpZiAoKHJjID0gZGlJQUdSZWFkKGltYXAsIGlhZ25vLCAmbXApKSkgeworCQkJSVJFQURfVU5MT0NLKGltYXAtPmltX2lwaW1hcCk7CisJCQlqZnNfZXJyb3IoaXAtPmlfc2IsICJkaUFsbG9jRXh0OiBlcnJvciByZWFkaW5nIGlhZyIpOworCQkJcmV0dXJuIHJjOworCQl9CisJCWlhZ3AgPSAoc3RydWN0IGlhZyAqKSBtcC0+ZGF0YTsKKwl9CisKKwkvKiB1c2luZyB0aGUgZnJlZSBleHRlbnQgc3VtbWFyeSBtYXAsIGZpbmQgYSBmcmVlIGV4dGVudC4KKwkgKi8KKwlmb3IgKHN3b3JkID0gMDs7IHN3b3JkKyspIHsKKwkJaWYgKHN3b3JkID49IFNNQVBTWikgeworCQkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisJCQlJUkVBRF9VTkxPQ0soaW1hcC0+aW1faXBpbWFwKTsKKwkJCWpmc19lcnJvcihpcC0+aV9zYiwKKwkJCQkgICJkaUFsbG9jRXh0OiBmcmVlIGV4dCBzdW1tYXJ5IG1hcCBub3QgZm91bmQiKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCWlmICh+aWFncC0+ZXh0c21hcFtzd29yZF0pCisJCQlicmVhazsKKwl9CisKKwkvKiBkZXRlcm1pbmUgdGhlIGV4dGVudCBudW1iZXIgb2YgdGhlIGZyZWUgZXh0ZW50LgorCSAqLworCXJlbSA9IGRpRmluZEZyZWUobGUzMl90b19jcHUoaWFncC0+ZXh0c21hcFtzd29yZF0pLCAwKTsKKwlpZiAocmVtID49IEVYVFNQRVJTVU0pIHsKKwkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisJCUlSRUFEX1VOTE9DSyhpbWFwLT5pbV9pcGltYXApOworCQlqZnNfZXJyb3IoaXAtPmlfc2IsICJkaUFsbG9jRXh0OiBmcmVlIGV4dGVudCBub3QgZm91bmQiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWV4dG5vID0gKHN3b3JkIDw8IEwyRVhUU1BFUlNVTSkgKyByZW07CisKKwkvKiBpbml0aWFsaXplIHRoZSBuZXcgZXh0ZW50LgorCSAqLworCXJjID0gZGlOZXdFeHQoaW1hcCwgaWFncCwgZXh0bm8pOworCUlSRUFEX1VOTE9DSyhpbWFwLT5pbV9pcGltYXApOworCWlmIChyYykgeworCQkvKiBzb21ldGhpbmcgYmFkIGhhcHBlbmVkLiAgaWYgYSBuZXcgaWFnIHdhcyBhbGxvY2F0ZWQsCisJCSAqIHBsYWNlIGl0IGJhY2sgb24gdGhlIGlub2RlIG1hcCdzIGlhZyBmcmVlIGxpc3QsIGFuZAorCQkgKiBjbGVhciB0aGUgYWcgbnVtYmVyIGluZm9ybWF0aW9uLgorCQkgKi8KKwkJaWYgKGlhZ3AtPm5mcmVlZXh0cyA9PSBjcHVfdG9fbGUzMihFWFRTUEVSSUFHKSkgeworCQkJSUFHRlJFRV9MT0NLKGltYXApOworCQkJaWFncC0+aWFnZnJlZSA9IGNwdV90b19sZTMyKGltYXAtPmltX2ZyZWVpYWcpOworCQkJaW1hcC0+aW1fZnJlZWlhZyA9IGlhZ25vOworCQkJSUFHRlJFRV9VTkxPQ0soaW1hcCk7CisJCX0KKwkJd3JpdGVfbWV0YXBhZ2UobXApOworCQlyZXR1cm4gKHJjKTsKKwl9CisKKwkvKiBzZXQgdGhlIHJlc3VsdHMgb2YgdGhlIGFsbG9jYXRpb24gYW5kIHdyaXRlIHRoZSBpYWcuCisJICovCisJZGlJbml0SW5vZGUoaXAsIGlhZ25vLCBleHRubyA8PCBMMklOT1NQRVJFWFQsIGV4dG5vLCBpYWdwKTsKKworCXdyaXRlX21ldGFwYWdlKG1wKTsKKworCXJldHVybiAoMCk7Cit9CisKKworLyoKKyAqIE5BTUU6ICAgICAgICBkaUFsbG9jQml0KGltYXAsaWFncCxpbm8pCisgKgorICogRlVOQ1RJT046ICAgCWFsbG9jYXRlIGEgYmFja2VkIGlub2RlIGZyb20gYW4gaWFnLgorICoKKyAqCQl0aGlzIHJvdXRpbmUgcGVyZm9ybXMgdGhlIG1lY2hhbmljcyBvZiBhbGxvY2F0aW5nIGEKKyAqCQlzcGVjaWZpZWQgaW5vZGUgZnJvbSBhIGJhY2tlZCBleHRlbnQuCisgKgorICoJCWlmIHRoZSBpbm9kZSB0byBiZSBhbGxvY2F0ZWQgcmVwcmVzZW50cyB0aGUgbGFzdCBmcmVlCisgKgkJaW5vZGUgd2l0aGluIHRoZSBpYWcsIHRoZSBpYWcgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlCisgKgkJYWcgZnJlZSBpbm9kZSBsaXN0LgorICoKKyAqCQlhIGNhcmVmdWwgdXBkYXRlIGFwcHJvYWNoIGlzIHVzZWQgdG8gcHJvdmlkZSBjb25zaXN0ZW5jeQorICoJCWluIHRoZSBmYWNlIG9mIHVwZGF0ZXMgdG8gbXVsdGlwbGUgYnVmZmVycy4gIHVuZGVyIHRoaXMKKyAqCQlhcHByb2FjaCwgYWxsIHJlcXVpcmVkIGJ1ZmZlcnMgYXJlIG9idGFpbmVkIGJlZm9yZSBtYWtpbmcKKyAqCQlhbnkgdXBkYXRlcyBhbmQgYXJlIGhlbGQgYWxsIGFyZSB1cGRhdGVzIGFyZSBjb21wbGV0ZS4KKyAqCQkKKyAqIFBSRSBDT05ESVRJT046IEFscmVhZHkgaGF2ZSBidWZmZXIgbG9jayBvbiBpYWdwLiAgQWxyZWFkeSBoYXZlIEFHIGxvY2sgb24KKyAqCXRoaXMgQUcuICBNdXN0IGhhdmUgcmVhZCBsb2NrIG9uIGltYXAgaW5vZGUuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgaW1hcCAgCS0gcG9pbnRlciB0byBpbm9kZSBtYXAgY29udHJvbCBzdHJ1Y3R1cmUuCisgKiAgICAgIGlhZ3AgIAktIHBvaW50ZXIgdG8gaWFnLiAKKyAqICAgICAgaW5vICAgCS0gaW5vZGUgbnVtYmVyIHRvIGJlIGFsbG9jYXRlZCB3aXRoaW4gdGhlIGlhZy4KKyAqCisgKiBSRVRVUk4gVkFMVUVTOgorICogICAgICAwICAgICAgIC0gc3VjY2Vzcy4KKyAqICAgICAgLUVOT1NQQwktIGluc3VmZmljaWVudCBkaXNrIHJlc291cmNlcy4KKyAqICAgICAgLUVJTyAgCS0gaS9vIGVycm9yLgorICovCitzdGF0aWMgaW50IGRpQWxsb2NCaXQoc3RydWN0IGlub21hcCAqIGltYXAsIHN0cnVjdCBpYWcgKiBpYWdwLCBpbnQgaW5vKQoreworCWludCBleHRubywgYml0bm8sIGFnbm8sIHN3b3JkLCByYzsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKmFtcCA9IE5VTEwsICpibXAgPSBOVUxMOworCXN0cnVjdCBpYWcgKmFpYWdwID0gTlVMTCwgKmJpYWdwID0gTlVMTDsKKwl1MzIgbWFzazsKKworCS8qIGNoZWNrIGlmIHRoaXMgaXMgdGhlIGxhc3QgZnJlZSBpbm9kZSB3aXRoaW4gdGhlIGlhZy4KKwkgKiBpZiBzbywgaXQgd2lsbCBoYXZlIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgYWcgZnJlZQorCSAqIGlub2RlIGxpc3QsIHNvIGdldCB0aGUgaWFncyBwcmVjZWVkaW5nIGFuZCBmb2xsb3dpbmcKKwkgKiBpdCBvbiB0aGUgbGlzdC4KKwkgKi8KKwlpZiAoaWFncC0+bmZyZWVpbm9zID09IGNwdV90b19sZTMyKDEpKSB7CisJCWlmICgoaW50KSBsZTMyX3RvX2NwdShpYWdwLT5pbm9mcmVlZndkKSA+PSAwKSB7CisJCQlpZiAoKHJjID0KKwkJCSAgICAgZGlJQUdSZWFkKGltYXAsIGxlMzJfdG9fY3B1KGlhZ3AtPmlub2ZyZWVmd2QpLAorCQkJCSAgICAgICAmYW1wKSkpCisJCQkJcmV0dXJuIChyYyk7CisJCQlhaWFncCA9IChzdHJ1Y3QgaWFnICopIGFtcC0+ZGF0YTsKKwkJfQorCisJCWlmICgoaW50KSBsZTMyX3RvX2NwdShpYWdwLT5pbm9mcmVlYmFjaykgPj0gMCkgeworCQkJaWYgKChyYyA9CisJCQkgICAgIGRpSUFHUmVhZChpbWFwLAorCQkJCSAgICAgICBsZTMyX3RvX2NwdShpYWdwLT5pbm9mcmVlYmFjayksCisJCQkJICAgICAgICZibXApKSkgeworCQkJCWlmIChhbXApCisJCQkJCXJlbGVhc2VfbWV0YXBhZ2UoYW1wKTsKKwkJCQlyZXR1cm4gKHJjKTsKKwkJCX0KKwkJCWJpYWdwID0gKHN0cnVjdCBpYWcgKikgYm1wLT5kYXRhOworCQl9CisJfQorCisJLyogZ2V0IHRoZSBhZyBudW1iZXIsIGV4dGVudCBudW1iZXIsIGlub2RlIG51bWJlciB3aXRoaW4KKwkgKiB0aGUgZXh0ZW50LgorCSAqLworCWFnbm8gPSBCTEtUT0FHKGxlNjRfdG9fY3B1KGlhZ3AtPmFnc3RhcnQpLCBKRlNfU0JJKGltYXAtPmltX2lwaW1hcC0+aV9zYikpOworCWV4dG5vID0gaW5vID4+IEwySU5PU1BFUkVYVDsKKwliaXRubyA9IGlubyAmIChJTk9TUEVSRVhUIC0gMSk7CisKKwkvKiBjb21wdXRlIHRoZSBtYXNrIGZvciBzZXR0aW5nIHRoZSBtYXAuCisJICovCisJbWFzayA9IEhJR0hPUkRFUiA+PiBiaXRubzsKKworCS8qIHRoZSBpbm9kZSBzaG91bGQgYmUgZnJlZSBhbmQgYmFja2VkLgorCSAqLworCWlmICgoKGxlMzJfdG9fY3B1KGlhZ3AtPnBtYXBbZXh0bm9dKSAmIG1hc2spICE9IDApIHx8CisJICAgICgobGUzMl90b19jcHUoaWFncC0+d21hcFtleHRub10pICYgbWFzaykgIT0gMCkgfHwKKwkgICAgKGFkZHJlc3NQWEQoJmlhZ3AtPmlub2V4dFtleHRub10pID09IDApKSB7CisJCWlmIChhbXApCisJCQlyZWxlYXNlX21ldGFwYWdlKGFtcCk7CisJCWlmIChibXApCisJCQlyZWxlYXNlX21ldGFwYWdlKGJtcCk7CisKKwkJamZzX2Vycm9yKGltYXAtPmltX2lwaW1hcC0+aV9zYiwKKwkJCSAgImRpQWxsb2NCaXQ6IGlhZyBpbmNvbnNpc3RlbnQiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogbWFyayB0aGUgaW5vZGUgYXMgYWxsb2NhdGVkIGluIHRoZSB3b3JraW5nIG1hcC4KKwkgKi8KKwlpYWdwLT53bWFwW2V4dG5vXSB8PSBjcHVfdG9fbGUzMihtYXNrKTsKKworCS8qIGNoZWNrIGlmIGFsbCBpbm9kZXMgd2l0aGluIHRoZSBleHRlbnQgYXJlIG5vdworCSAqIGFsbG9jYXRlZC4gIGlmIHNvLCB1cGRhdGUgdGhlIGZyZWUgaW5vZGUgc3VtbWFyeQorCSAqIG1hcCB0byByZWZsZWN0IHRoaXMuCisJICovCisJaWYgKGlhZ3AtPndtYXBbZXh0bm9dID09IGNwdV90b19sZTMyKE9ORVMpKSB7CisJCXN3b3JkID0gZXh0bm8gPj4gTDJFWFRTUEVSU1VNOworCQliaXRubyA9IGV4dG5vICYgKEVYVFNQRVJTVU0gLSAxKTsKKwkJaWFncC0+aW5vc21hcFtzd29yZF0gfD0gY3B1X3RvX2xlMzIoSElHSE9SREVSID4+IGJpdG5vKTsKKwl9CisKKwkvKiBpZiB0aGlzIHdhcyB0aGUgbGFzdCBmcmVlIGlub2RlIGluIHRoZSBpYWcsIHJlbW92ZSB0aGUKKwkgKiBpYWcgZnJvbSB0aGUgYWcgZnJlZSBpbm9kZSBsaXN0LgorCSAqLworCWlmIChpYWdwLT5uZnJlZWlub3MgPT0gY3B1X3RvX2xlMzIoMSkpIHsKKwkJaWYgKGFtcCkgeworCQkJYWlhZ3AtPmlub2ZyZWViYWNrID0gaWFncC0+aW5vZnJlZWJhY2s7CisJCQl3cml0ZV9tZXRhcGFnZShhbXApOworCQl9CisKKwkJaWYgKGJtcCkgeworCQkJYmlhZ3AtPmlub2ZyZWVmd2QgPSBpYWdwLT5pbm9mcmVlZndkOworCQkJd3JpdGVfbWV0YXBhZ2UoYm1wKTsKKwkJfSBlbHNlIHsKKwkJCWltYXAtPmltX2FnY3RsW2Fnbm9dLmlub2ZyZWUgPQorCQkJICAgIGxlMzJfdG9fY3B1KGlhZ3AtPmlub2ZyZWVmd2QpOworCQl9CisJCWlhZ3AtPmlub2ZyZWVmd2QgPSBpYWdwLT5pbm9mcmVlYmFjayA9IGNwdV90b19sZTMyKC0xKTsKKwl9CisKKwkvKiB1cGRhdGUgdGhlIGZyZWUgaW5vZGUgY291bnQgYXQgdGhlIGlhZywgYWcsIGlub2RlCisJICogbWFwIGxldmVscy4KKwkgKi8KKwlpYWdwLT5uZnJlZWlub3MgPSBjcHVfdG9fbGUzMihsZTMyX3RvX2NwdShpYWdwLT5uZnJlZWlub3MpIC0gMSk7CisJaW1hcC0+aW1fYWdjdGxbYWdub10ubnVtZnJlZSAtPSAxOworCWF0b21pY19kZWMoJmltYXAtPmltX251bWZyZWUpOworCisJcmV0dXJuICgwKTsKK30KKworCisvKgorICogTkFNRTogICAgICAgIGRpTmV3RXh0KGltYXAsaWFncCxleHRubykKKyAqCisgKiBGVU5DVElPTjogICAgaW5pdGlhbGl6ZSBhIG5ldyBleHRlbnQgb2YgaW5vZGVzIGZvciBhbiBpYWcsIGFsbG9jYXRpbmcKKyAqCSAgICAgICAgdGhlIGZpcnN0IGlub2RlIG9mIHRoZSBleHRlbnQgZm9yIHVzZSBmb3IgdGhlIGN1cnJlbnQKKyAqCSAgICAgICAgYWxsb2NhdGlvbiByZXF1ZXN0LgorICoKKyAqCQlkaXNrIHJlc291cmNlcyBhcmUgYWxsb2NhdGVkIGZvciB0aGUgbmV3IGV4dGVudCBvZiBpbm9kZXMKKyAqCQlhbmQgdGhlIGlub2RlcyB0aGVtc2VsdmVzIGFyZSBpbml0aWFsaXplZCB0byByZWZsZWN0IHRoZWlyCisgKgkJZXhpc3RlbmNlIHdpdGhpbiB0aGUgZXh0ZW50IChpLmUuIHRoZWlyIGlub2RlIG51bWJlcnMgYW5kCisgKgkJaW5vZGUgZXh0ZW50IGFkZHJlc3NlcyBhcmUgc2V0KSBhbmQgdGhlaXIgaW5pdGlhbCBzdGF0ZQorICoJCShtb2RlIGFuZCBsaW5rIGNvdW50IGFyZSBzZXQgdG8gemVybykuCisgKgorICoJCWlmIHRoZSBpYWcgaXMgbmV3LCBpdCBpcyBub3QgeWV0IG9uIGFuIGFnIGV4dGVudCBmcmVlIGxpc3QKKyAqCQlidXQgd2lsbCBub3cgYmUgcGxhY2VkIG9uIHRoaXMgbGlzdC4KKyAqCisgKgkJaWYgdGhlIGFsbG9jYXRpb24gb2YgdGhlIG5ldyBleHRlbnQgY2F1c2VzIHRoZSBpYWcgdG8KKyAqCQloYXZlIG5vIGZyZWUgZXh0ZW50LCB0aGUgaWFnIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZQorICoJCWFnIGV4dGVudCBmcmVlIGxpc3QuCisgKgorICoJCWlmIHRoZSBpYWcgaGFzIG5vIGZyZWUgYmFja2VkIGlub2RlcywgaXQgd2lsbCBiZSBwbGFjZWQKKyAqCQlvbiB0aGUgYWcgZnJlZSBpbm9kZSBsaXN0LCBzaW5jZSB0aGUgYWRkaXRpb24gb2YgdGhlIG5ldworICoJCWV4dGVudCB3aWxsIG5vdyBjYXVzZSBpdCB0byBoYXZlIGZyZWUgaW5vZGVzLgorICoKKyAqCQlhIGNhcmVmdWwgdXBkYXRlIGFwcHJvYWNoIGlzIHVzZWQgdG8gcHJvdmlkZSBjb25zaXN0ZW5jeQorICoJCShpLmUuIGxpc3QgY29uc2lzdGVuY3kpIGluIHRoZSBmYWNlIG9mIHVwZGF0ZXMgdG8gbXVsdGlwbGUKKyAqCQlidWZmZXJzLiAgdW5kZXIgdGhpcyBhcHByb2FjaCwgYWxsIHJlcXVpcmVkIGJ1ZmZlcnMgYXJlCisgKgkJb2J0YWluZWQgYmVmb3JlIG1ha2luZyBhbnkgdXBkYXRlcyBhbmQgYXJlIGhlbGQgdW50aWwgYWxsCisgKgkJdXBkYXRlcyBhcmUgY29tcGxldGUuCisgKgkJCisgKiBQUkUgQ09ORElUSU9OOiBBbHJlYWR5IGhhdmUgYnVmZmVyIGxvY2sgb24gaWFncC4gIEFscmVhZHkgaGF2ZSBBRyBsb2NrIG9uCisgKgl0aGlzIEFHLiAgTXVzdCBoYXZlIHJlYWQgbG9jayBvbiBpbWFwIGlub2RlLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIGltYXAgIAktIHBvaW50ZXIgdG8gaW5vZGUgbWFwIGNvbnRyb2wgc3RydWN0dXJlLgorICogICAgICBpYWdwICAJLSBwb2ludGVyIHRvIGlhZy4gCisgKiAgICAgIGV4dG5vICAJLSBleHRlbnQgbnVtYmVyLgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIDAgICAgICAgLSBzdWNjZXNzLgorICogICAgICAtRU5PU1BDCS0gaW5zdWZmaWNpZW50IGRpc2sgcmVzb3VyY2VzLgorICogICAgICAtRUlPICAJLSBpL28gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgZGlOZXdFeHQoc3RydWN0IGlub21hcCAqIGltYXAsIHN0cnVjdCBpYWcgKiBpYWdwLCBpbnQgZXh0bm8pCit7CisJaW50IGFnbm8sIGlhZ25vLCBmd2QsIGJhY2ssIGZyZWVpID0gMCwgc3dvcmQsIHJjOworCXN0cnVjdCBpYWcgKmFpYWdwID0gTlVMTCwgKmJpYWdwID0gTlVMTCwgKmNpYWdwID0gTlVMTDsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKmFtcCwgKmJtcCwgKmNtcCwgKmRtcDsKKwlzdHJ1Y3QgaW5vZGUgKmlwaW1hcDsKKwlzNjQgYmxrbm8sIGhpbnQ7CisJaW50IGksIGo7CisJdTMyIG1hc2s7CisJaW5vX3QgaW5vOworCXN0cnVjdCBkaW5vZGUgKmRwOworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpOworCisJLyogYmV0dGVyIGhhdmUgZnJlZSBleHRlbnRzLgorCSAqLworCWlmICghaWFncC0+bmZyZWVleHRzKSB7CisJCWpmc19lcnJvcihpbWFwLT5pbV9pcGltYXAtPmlfc2IsICJkaU5ld0V4dDogbm8gZnJlZSBleHRlbnRzIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIGdldCB0aGUgaW5vZGUgbWFwIGlub2RlLgorCSAqLworCWlwaW1hcCA9IGltYXAtPmltX2lwaW1hcDsKKwlzYmkgPSBKRlNfU0JJKGlwaW1hcC0+aV9zYik7CisKKwlhbXAgPSBibXAgPSBjbXAgPSBOVUxMOworCisJLyogZ2V0IHRoZSBhZyBhbmQgaWFnIG51bWJlcnMgZm9yIHRoaXMgaWFnLgorCSAqLworCWFnbm8gPSBCTEtUT0FHKGxlNjRfdG9fY3B1KGlhZ3AtPmFnc3RhcnQpLCBzYmkpOworCWlhZ25vID0gbGUzMl90b19jcHUoaWFncC0+aWFnbnVtKTsKKworCS8qIGNoZWNrIGlmIHRoaXMgaXMgdGhlIGxhc3QgZnJlZSBleHRlbnQgd2l0aGluIHRoZQorCSAqIGlhZy4gIGlmIHNvLCB0aGUgaWFnIG11c3QgYmUgcmVtb3ZlZCBmcm9tIHRoZSBhZworCSAqIGZyZWUgZXh0ZW50IGxpc3QsIHNvIGdldCB0aGUgaWFncyBwcmVjZWVkaW5nIGFuZAorCSAqIGZvbGxvd2luZyB0aGUgaWFnIG9uIHRoaXMgbGlzdC4KKwkgKi8KKwlpZiAoaWFncC0+bmZyZWVleHRzID09IGNwdV90b19sZTMyKDEpKSB7CisJCWlmICgoZndkID0gbGUzMl90b19jcHUoaWFncC0+ZXh0ZnJlZWZ3ZCkpID49IDApIHsKKwkJCWlmICgocmMgPSBkaUlBR1JlYWQoaW1hcCwgZndkLCAmYW1wKSkpCisJCQkJcmV0dXJuIChyYyk7CisJCQlhaWFncCA9IChzdHJ1Y3QgaWFnICopIGFtcC0+ZGF0YTsKKwkJfQorCisJCWlmICgoYmFjayA9IGxlMzJfdG9fY3B1KGlhZ3AtPmV4dGZyZWViYWNrKSkgPj0gMCkgeworCQkJaWYgKChyYyA9IGRpSUFHUmVhZChpbWFwLCBiYWNrLCAmYm1wKSkpCisJCQkJZ290byBlcnJvcl9vdXQ7CisJCQliaWFncCA9IChzdHJ1Y3QgaWFnICopIGJtcC0+ZGF0YTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIHRoZSBpYWcgaGFzIGZyZWUgZXh0ZW50cy4gIGlmIGFsbCBleHRlbnRzIGFyZSBmcmVlCisJCSAqIChhcyBpcyB0aGUgY2FzZSBmb3IgYSBuZXdseSBhbGxvY2F0ZWQgaWFnKSwgdGhlIGlhZworCQkgKiBtdXN0IGJlIGFkZGVkIHRvIHRoZSBhZyBmcmVlIGV4dGVudCBsaXN0LCBzbyBnZXQKKwkJICogdGhlIGlhZyBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdCBpbiBwcmVwYXJhdGlvbiBmb3IKKwkJICogYWRkaW5nIHRoaXMgaWFnIHRvIHRoaXMgbGlzdC4KKwkJICovCisJCWZ3ZCA9IGJhY2sgPSAtMTsKKwkJaWYgKGlhZ3AtPm5mcmVlZXh0cyA9PSBjcHVfdG9fbGUzMihFWFRTUEVSSUFHKSkgeworCQkJaWYgKChmd2QgPSBpbWFwLT5pbV9hZ2N0bFthZ25vXS5leHRmcmVlKSA+PSAwKSB7CisJCQkJaWYgKChyYyA9IGRpSUFHUmVhZChpbWFwLCBmd2QsICZhbXApKSkKKwkJCQkJZ290byBlcnJvcl9vdXQ7CisJCQkJYWlhZ3AgPSAoc3RydWN0IGlhZyAqKSBhbXAtPmRhdGE7CisJCQl9CisJCX0KKwl9CisKKwkvKiBjaGVjayBpZiB0aGUgaWFnIGhhcyBubyBmcmVlIGlub2Rlcy4gIGlmIHNvLCB0aGUgaWFnCisJICogd2lsbCBoYXZlIHRvIGJlIGFkZGVkIHRvIHRoZSBhZyBmcmVlIGlub2RlIGxpc3QsIHNvIGdldAorCSAqIHRoZSBpYWcgYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QgaW4gcHJlcGFyYXRpb24gZm9yCisJICogYWRkaW5nIHRoaXMgaWFnIHRvIHRoaXMgbGlzdC4gIGluIGRvaW5nIHRoaXMsIHdlIG11c3QKKwkgKiBjaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhlIGlhZyBhdCB0aGUgaGVhZCBvZgorCSAqIHRoZSBsaXN0IGluIGhhbmQuCisJICovCisJaWYgKGlhZ3AtPm5mcmVlaW5vcyA9PSAwKSB7CisJCWZyZWVpID0gaW1hcC0+aW1fYWdjdGxbYWdub10uaW5vZnJlZTsKKworCQlpZiAoZnJlZWkgPj0gMCkgeworCQkJaWYgKGZyZWVpID09IGZ3ZCkgeworCQkJCWNpYWdwID0gYWlhZ3A7CisJCQl9IGVsc2UgaWYgKGZyZWVpID09IGJhY2spIHsKKwkJCQljaWFncCA9IGJpYWdwOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoKHJjID0gZGlJQUdSZWFkKGltYXAsIGZyZWVpLCAmY21wKSkpCisJCQkJCWdvdG8gZXJyb3Jfb3V0OworCQkJCWNpYWdwID0gKHN0cnVjdCBpYWcgKikgY21wLT5kYXRhOworCQkJfQorCQkJaWYgKGNpYWdwID09IE5VTEwpIHsKKwkJCQlqZnNfZXJyb3IoaW1hcC0+aW1faXBpbWFwLT5pX3NiLAorCQkJCQkgICJkaU5ld0V4dDogY2lhZ3AgPT0gTlVMTCIpOworCQkJCXJjID0gLUVJTzsKKwkJCQlnb3RvIGVycm9yX291dDsKKwkJCX0KKwkJfQorCX0KKworCS8qIGFsbG9jYXRlIGRpc2sgc3BhY2UgZm9yIHRoZSBpbm9kZSBleHRlbnQuCisJICovCisJaWYgKChleHRubyA9PSAwKSB8fCAoYWRkcmVzc1BYRCgmaWFncC0+aW5vZXh0W2V4dG5vIC0gMV0pID09IDApKQorCQloaW50ID0gKChzNjQpIGFnbm8gPDwgc2JpLT5ibWFwLT5kYl9hZ2wyc2l6ZSkgLSAxOworCWVsc2UKKwkJaGludCA9IGFkZHJlc3NQWEQoJmlhZ3AtPmlub2V4dFtleHRubyAtIDFdKSArCisJCSAgICBsZW5ndGhQWEQoJmlhZ3AtPmlub2V4dFtleHRubyAtIDFdKSAtIDE7CisKKwlpZiAoKHJjID0gZGJBbGxvYyhpcGltYXAsIGhpbnQsIChzNjQpIGltYXAtPmltX25icGVyaWV4dCwgJmJsa25vKSkpCisJCWdvdG8gZXJyb3Jfb3V0OworCisJLyogY29tcHV0ZSB0aGUgaW5vZGUgbnVtYmVyIG9mIHRoZSBmaXJzdCBpbm9kZSB3aXRoaW4gdGhlCisJICogZXh0ZW50LgorCSAqLworCWlubyA9IChpYWdubyA8PCBMMklOT1NQRVJJQUcpICsgKGV4dG5vIDw8IEwySU5PU1BFUkVYVCk7CisKKwkvKiBpbml0aWFsaXplIHRoZSBpbm9kZXMgd2l0aGluIHRoZSBuZXdseSBhbGxvY2F0ZWQgZXh0ZW50IGEKKwkgKiBwYWdlIGF0IGEgdGltZS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaW1hcC0+aW1fbmJwZXJpZXh0OyBpICs9IHNiaS0+bmJwZXJwYWdlKSB7CisJCS8qIGdldCBhIGJ1ZmZlciBmb3IgdGhpcyBwYWdlIG9mIGRpc2sgaW5vZGVzLgorCQkgKi8KKwkJZG1wID0gZ2V0X21ldGFwYWdlKGlwaW1hcCwgYmxrbm8gKyBpLCBQU0laRSwgMSk7CisJCWlmIChkbXAgPT0gTlVMTCkgeworCQkJcmMgPSAtRUlPOworCQkJZ290byBlcnJvcl9vdXQ7CisJCX0KKwkJZHAgPSAoc3RydWN0IGRpbm9kZSAqKSBkbXAtPmRhdGE7CisKKwkJLyogaW5pdGlhbGl6ZSB0aGUgaW5vZGUgbnVtYmVyLCBtb2RlLCBsaW5rIGNvdW50IGFuZAorCQkgKiBpbm9kZSBleHRlbnQgYWRkcmVzcy4KKwkJICovCisJCWZvciAoaiA9IDA7IGogPCBJTk9TUEVSUEFHRTsgaisrLCBkcCsrLCBpbm8rKykgeworCQkJZHAtPmRpX2lub3N0YW1wID0gY3B1X3RvX2xlMzIoc2JpLT5pbm9zdGFtcCk7CisJCQlkcC0+ZGlfbnVtYmVyID0gY3B1X3RvX2xlMzIoaW5vKTsKKwkJCWRwLT5kaV9maWxlc2V0ID0gY3B1X3RvX2xlMzIoRklMRVNZU1RFTV9JKTsKKwkJCWRwLT5kaV9tb2RlID0gMDsKKwkJCWRwLT5kaV9ubGluayA9IDA7CisJCQlQWERhZGRyZXNzKCYoZHAtPmRpX2l4cHhkKSwgYmxrbm8pOworCQkJUFhEbGVuZ3RoKCYoZHAtPmRpX2l4cHhkKSwgaW1hcC0+aW1fbmJwZXJpZXh0KTsKKwkJfQorCQl3cml0ZV9tZXRhcGFnZShkbXApOworCX0KKworCS8qIGlmIHRoaXMgaXMgdGhlIGxhc3QgZnJlZSBleHRlbnQgd2l0aGluIHRoZSBpYWcsIHJlbW92ZSB0aGUKKwkgKiBpYWcgZnJvbSB0aGUgYWcgZnJlZSBleHRlbnQgbGlzdC4KKwkgKi8KKwlpZiAoaWFncC0+bmZyZWVleHRzID09IGNwdV90b19sZTMyKDEpKSB7CisJCWlmIChmd2QgPj0gMCkKKwkJCWFpYWdwLT5leHRmcmVlYmFjayA9IGlhZ3AtPmV4dGZyZWViYWNrOworCisJCWlmIChiYWNrID49IDApCisJCQliaWFncC0+ZXh0ZnJlZWZ3ZCA9IGlhZ3AtPmV4dGZyZWVmd2Q7CisJCWVsc2UKKwkJCWltYXAtPmltX2FnY3RsW2Fnbm9dLmV4dGZyZWUgPQorCQkJICAgIGxlMzJfdG9fY3B1KGlhZ3AtPmV4dGZyZWVmd2QpOworCisJCWlhZ3AtPmV4dGZyZWVmd2QgPSBpYWdwLT5leHRmcmVlYmFjayA9IGNwdV90b19sZTMyKC0xKTsKKwl9IGVsc2UgeworCQkvKiBpZiB0aGUgaWFnIGhhcyBhbGwgZnJlZSBleHRlbnRzIChuZXdseSBhbGxvY2F0ZWQgaWFnKSwKKwkJICogYWRkIHRoZSBpYWcgdG8gdGhlIGFnIGZyZWUgZXh0ZW50IGxpc3QuCisJCSAqLworCQlpZiAoaWFncC0+bmZyZWVleHRzID09IGNwdV90b19sZTMyKEVYVFNQRVJJQUcpKSB7CisJCQlpZiAoZndkID49IDApCisJCQkJYWlhZ3AtPmV4dGZyZWViYWNrID0gY3B1X3RvX2xlMzIoaWFnbm8pOworCisJCQlpYWdwLT5leHRmcmVlZndkID0gY3B1X3RvX2xlMzIoZndkKTsKKwkJCWlhZ3AtPmV4dGZyZWViYWNrID0gY3B1X3RvX2xlMzIoLTEpOworCQkJaW1hcC0+aW1fYWdjdGxbYWdub10uZXh0ZnJlZSA9IGlhZ25vOworCQl9CisJfQorCisJLyogaWYgdGhlIGlhZyBoYXMgbm8gZnJlZSBpbm9kZXMsIGFkZCB0aGUgaWFnIHRvIHRoZQorCSAqIGFnIGZyZWUgaW5vZGUgbGlzdC4KKwkgKi8KKwlpZiAoaWFncC0+bmZyZWVpbm9zID09IDApIHsKKwkJaWYgKGZyZWVpID49IDApCisJCQljaWFncC0+aW5vZnJlZWJhY2sgPSBjcHVfdG9fbGUzMihpYWdubyk7CisKKwkJaWFncC0+aW5vZnJlZWZ3ZCA9CisJCSAgICBjcHVfdG9fbGUzMihpbWFwLT5pbV9hZ2N0bFthZ25vXS5pbm9mcmVlKTsKKwkJaWFncC0+aW5vZnJlZWJhY2sgPSBjcHVfdG9fbGUzMigtMSk7CisJCWltYXAtPmltX2FnY3RsW2Fnbm9dLmlub2ZyZWUgPSBpYWdubzsKKwl9CisKKwkvKiBpbml0aWFsaXplIHRoZSBleHRlbnQgZGVzY3JpcHRvciBvZiB0aGUgZXh0ZW50LiAqLworCVBYRGxlbmd0aCgmaWFncC0+aW5vZXh0W2V4dG5vXSwgaW1hcC0+aW1fbmJwZXJpZXh0KTsKKwlQWERhZGRyZXNzKCZpYWdwLT5pbm9leHRbZXh0bm9dLCBibGtubyk7CisKKwkvKiBpbml0aWFsaXplIHRoZSB3b3JraW5nIGFuZCBwZXJzaXN0ZW50IG1hcCBvZiB0aGUgZXh0ZW50LgorCSAqIHRoZSB3b3JraW5nIG1hcCB3aWxsIGJlIGluaXRpYWxpemVkIHN1Y2ggdGhhdAorCSAqIGl0IGluZGljYXRlcyB0aGUgZmlyc3QgaW5vZGUgb2YgdGhlIGV4dGVudCBpcyBhbGxvY2F0ZWQuCisJICovCisJaWFncC0+d21hcFtleHRub10gPSBjcHVfdG9fbGUzMihISUdIT1JERVIpOworCWlhZ3AtPnBtYXBbZXh0bm9dID0gMDsKKworCS8qIHVwZGF0ZSB0aGUgZnJlZSBpbm9kZSBhbmQgZnJlZSBleHRlbnQgc3VtbWFyeSBtYXBzCisJICogZm9yIHRoZSBleHRlbnQgdG8gaW5kaWNhdGUgdGhlIGV4dGVudCBoYXMgZnJlZSBpbm9kZXMKKwkgKiBhbmQgbm8gbG9uZ2VyIHJlcHJlc2VudHMgYSBmcmVlIGV4dGVudC4KKwkgKi8KKwlzd29yZCA9IGV4dG5vID4+IEwyRVhUU1BFUlNVTTsKKwltYXNrID0gSElHSE9SREVSID4+IChleHRubyAmIChFWFRTUEVSU1VNIC0gMSkpOworCWlhZ3AtPmV4dHNtYXBbc3dvcmRdIHw9IGNwdV90b19sZTMyKG1hc2spOworCWlhZ3AtPmlub3NtYXBbc3dvcmRdICY9IGNwdV90b19sZTMyKH5tYXNrKTsKKworCS8qIHVwZGF0ZSB0aGUgZnJlZSBpbm9kZSBhbmQgZnJlZSBleHRlbnQgY291bnRzIGZvciB0aGUKKwkgKiBpYWcuCisJICovCisJaWFncC0+bmZyZWVpbm9zID0gY3B1X3RvX2xlMzIobGUzMl90b19jcHUoaWFncC0+bmZyZWVpbm9zKSArCisJCQkJICAgICAgKElOT1NQRVJFWFQgLSAxKSk7CisJaWFncC0+bmZyZWVleHRzID0gY3B1X3RvX2xlMzIobGUzMl90b19jcHUoaWFncC0+bmZyZWVleHRzKSAtIDEpOworCisJLyogdXBkYXRlIHRoZSBmcmVlIGFuZCBiYWNrZWQgaW5vZGUgY291bnRzIGZvciB0aGUgYWcuCisJICovCisJaW1hcC0+aW1fYWdjdGxbYWdub10ubnVtZnJlZSArPSAoSU5PU1BFUkVYVCAtIDEpOworCWltYXAtPmltX2FnY3RsW2Fnbm9dLm51bWlub3MgKz0gSU5PU1BFUkVYVDsKKworCS8qIHVwZGF0ZSB0aGUgZnJlZSBhbmQgYmFja2VkIGlub2RlIGNvdW50cyBmb3IgdGhlIGlub2RlIG1hcC4KKwkgKi8KKwlhdG9taWNfYWRkKElOT1NQRVJFWFQgLSAxLCAmaW1hcC0+aW1fbnVtZnJlZSk7CisJYXRvbWljX2FkZChJTk9TUEVSRVhULCAmaW1hcC0+aW1fbnVtaW5vcyk7CisKKwkvKiB3cml0ZSB0aGUgaWFncy4KKwkgKi8KKwlpZiAoYW1wKQorCQl3cml0ZV9tZXRhcGFnZShhbXApOworCWlmIChibXApCisJCXdyaXRlX21ldGFwYWdlKGJtcCk7CisJaWYgKGNtcCkKKwkJd3JpdGVfbWV0YXBhZ2UoY21wKTsKKworCXJldHVybiAoMCk7CisKKyAgICAgIGVycm9yX291dDoKKworCS8qIHJlbGVhc2UgdGhlIGlhZ3MuCisJICovCisJaWYgKGFtcCkKKwkJcmVsZWFzZV9tZXRhcGFnZShhbXApOworCWlmIChibXApCisJCXJlbGVhc2VfbWV0YXBhZ2UoYm1wKTsKKwlpZiAoY21wKQorCQlyZWxlYXNlX21ldGFwYWdlKGNtcCk7CisKKwlyZXR1cm4gKHJjKTsKK30KKworCisvKgorICogTkFNRTogICAgICAgIGRpTmV3SUFHKGltYXAsaWFnbm9wLGFnbm8pCisgKgorICogRlVOQ1RJT046ICAgCWFsbG9jYXRlIGEgbmV3IGlhZyBmb3IgYW4gYWxsb2NhdGlvbiBncm91cC4KKyAqCQkKKyAqCQlmaXJzdCB0cmllcyB0byBhbGxvY2F0ZSB0aGUgaWFnIGZyb20gdGhlIGlub2RlIG1hcCAKKyAqCQlpYWdmcmVlIGxpc3Q6ICAKKyAqCQlpZiB0aGUgbGlzdCBoYXMgZnJlZSBpYWdzLCB0aGUgaGVhZCBvZiB0aGUgbGlzdCBpcyByZW1vdmVkIAorICoJCWFuZCByZXR1cm5lZCB0byBzYXRpc2Z5IHRoZSByZXF1ZXN0LgorICoJCWlmIHRoZSBpbm9kZSBtYXAncyBpYWcgZnJlZSBsaXN0IGlzIGVtcHR5LCB0aGUgaW5vZGUgbWFwCisgKgkJaXMgZXh0ZW5kZWQgdG8gaG9sZCBhIG5ldyBpYWcuIHRoaXMgbmV3IGlhZyBpcyBpbml0aWFsaXplZAorICoJCWFuZCByZXR1cm5lZCB0byBzYXRpc2Z5IHRoZSByZXF1ZXN0LgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIGltYXAgIAktIHBvaW50ZXIgdG8gaW5vZGUgbWFwIGNvbnRyb2wgc3RydWN0dXJlLgorICogICAgICBpYWdub3AgCS0gcG9pbnRlciB0byBhbiBpYWcgbnVtYmVyIHNldCB3aXRoIHRoZSBudW1iZXIgb2YgdGhlCisgKgkJICBuZXdseSBhbGxvY2F0ZWQgaWFnIHVwb24gc3VjY2Vzc2Z1bCByZXR1cm4uCisgKiAgICAgIGFnbm8gIAktIGFsbG9jYXRpb24gZ3JvdXAgbnVtYmVyLgorICoJYnBwCS0gQnVmZmVyIHBvaW50ZXIgdG8gYmUgZmlsbGVkIGluIHdpdGggbmV3IElBRydzIGJ1ZmZlcgorICoKKyAqIFJFVFVSTiBWQUxVRVM6CisgKiAgICAgIDAgICAgICAgLSBzdWNjZXNzLgorICogICAgICAtRU5PU1BDCS0gaW5zdWZmaWNpZW50IGRpc2sgcmVzb3VyY2VzLgorICogICAgICAtRUlPICAJLSBpL28gZXJyb3IuCisgKgorICogc2VyaWFsaXphdGlvbjogCisgKglBRyBsb2NrIGhlbGQgb24gZW50cnkvZXhpdDsKKyAqCXdyaXRlIGxvY2sgb24gdGhlIG1hcCBpcyBoZWxkIGluc2lkZTsKKyAqCXJlYWQgbG9jayBvbiB0aGUgbWFwIGlzIGhlbGQgb24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uOworICoKKyAqIG5vdGU6IG5ldyBpYWcgdHJhbnNhY3Rpb246IAorICogLiBzeW5jaHJvbm91c2x5IHdyaXRlIGlhZzsKKyAqIC4gd3JpdGUgbG9nIG9mIHh0cmVlIGFuZCBpbm9kZSAgb2YgaW1hcDsKKyAqIC4gY29tbWl0OworICogLiBzeW5jaHJvbm91cyB3cml0ZSBvZiB4dHJlZSAocmlnaHQgdG8gbGVmdCwgYm90dG9tIHRvIHRvcCk7CisgKiAuIGF0IHN0YXJ0IG9mIGxvZ3JlZG8oKTogaW5pdCBpbi1tZW1vcnkgaW1hcCB3aXRoIG9uZSBhZGRpdGlvbmFsIGlhZyBwYWdlOworICogLiBhdCBlbmQgb2YgbG9ncmVkbygpOiByZS1yZWFkIGltYXAgaW5vZGUgdG8gZGV0ZXJtaW5lCisgKiAgIG5ldyBpbWFwIHNpemU7CisgKi8KK3N0YXRpYyBpbnQKK2RpTmV3SUFHKHN0cnVjdCBpbm9tYXAgKiBpbWFwLCBpbnQgKmlhZ25vcCwgaW50IGFnbm8sIHN0cnVjdCBtZXRhcGFnZSAqKiBtcHApCit7CisJaW50IHJjOworCWludCBpYWdubywgaSwgeGxlbjsKKwlzdHJ1Y3QgaW5vZGUgKmlwaW1hcDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpOworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJc3RydWN0IGlhZyAqaWFncDsKKwlzNjQgeGFkZHIgPSAwOworCXM2NCBibGtubzsKKwl0aWRfdCB0aWQ7CisjaWZkZWYgX1NUSUxMX1RPX1BPUlQKKwl4YWRfdCB4YWQ7CisjZW5kaWYJCQkJLyogIF9TVElMTF9UT19QT1JUICovCisJc3RydWN0IGlub2RlICppcGxpc3RbMV07CisKKwkvKiBwaWNrIHVwIHBvaW50ZXJzIHRvIHRoZSBpbm9kZSBtYXAgYW5kIG1vdW50IGlub2RlcyAqLworCWlwaW1hcCA9IGltYXAtPmltX2lwaW1hcDsKKwlzYiA9IGlwaW1hcC0+aV9zYjsKKwlzYmkgPSBKRlNfU0JJKHNiKTsKKworCS8qIGFjcXVpcmUgdGhlIGZyZWUgaWFnIGxvY2sgKi8KKwlJQUdGUkVFX0xPQ0soaW1hcCk7CisKKwkvKiBpZiB0aGVyZSBhcmUgYW55IGlhZ3Mgb24gdGhlIGlub2RlIG1hcCBmcmVlIGlhZyBsaXN0LCAKKwkgKiBhbGxvY2F0ZSB0aGUgaWFnIGZyb20gdGhlIGhlYWQgb2YgdGhlIGxpc3QuCisJICovCisJaWYgKGltYXAtPmltX2ZyZWVpYWcgPj0gMCkgeworCQkvKiBwaWNrIHVwIHRoZSBpYWcgbnVtYmVyIGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0ICovCisJCWlhZ25vID0gaW1hcC0+aW1fZnJlZWlhZzsKKworCQkvKiBkZXRlcm1pbmUgdGhlIGxvZ2ljYWwgYmxvY2sgbnVtYmVyIG9mIHRoZSBpYWcgKi8KKwkJYmxrbm8gPSBJQUdUT0xCTEsoaWFnbm8sIHNiaS0+bDJuYnBlcnBhZ2UpOworCX0gZWxzZSB7CisJCS8qIG5vIGZyZWUgaWFncy4gdGhlIGlub2RlIG1hcCB3aWxsIGhhdmUgdG8gYmUgZXh0ZW50ZWQKKwkJICogdG8gaW5jbHVkZSBhIG5ldyBpYWcuCisJCSAqLworCisJCS8qIGFjcXVpcmUgaW5vZGUgbWFwIGxvY2sgKi8KKwkJSVdSSVRFX0xPQ0soaXBpbWFwKTsKKworCQlpZiAoaXBpbWFwLT5pX3NpemUgPj4gTDJQU0laRSAhPSBpbWFwLT5pbV9uZXh0aWFnICsgMSkgeworCQkJSVdSSVRFX1VOTE9DSyhpcGltYXApOworCQkJSUFHRlJFRV9VTkxPQ0soaW1hcCk7CisJCQlqZnNfZXJyb3IoaW1hcC0+aW1faXBpbWFwLT5pX3NiLAorCQkJCSAgImRpTmV3SUFHOiBpcGltYXAtPmlfc2l6ZSBpcyB3cm9uZyIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCisJCS8qIGdldCB0aGUgbmV4dCBhdmFsaWFibGUgaWFnIG51bWJlciAqLworCQlpYWdubyA9IGltYXAtPmltX25leHRpYWc7CisKKwkJLyogbWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSBub3QgZXhjZWVkZWQgdGhlIG1heGltdW0gaW5vZGUKKwkJICogbnVtYmVyIGxpbWl0LgorCQkgKi8KKwkJaWYgKGlhZ25vID4gKE1BWElBR1MgLSAxKSkgeworCQkJLyogcmVsZWFzZSB0aGUgaW5vZGUgbWFwIGxvY2sgKi8KKwkJCUlXUklURV9VTkxPQ0soaXBpbWFwKTsKKworCQkJcmMgPSAtRU5PU1BDOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKgorCQkgKiBzeW5jaHJvbm91c2x5IGFwcGVuZCBuZXcgaWFnIHBhZ2UuCisJCSAqLworCQkvKiBkZXRlcm1pbmUgdGhlIGxvZ2ljYWwgYWRkcmVzcyBvZiBpYWcgcGFnZSB0byBhcHBlbmQgKi8KKwkJYmxrbm8gPSBJQUdUT0xCTEsoaWFnbm8sIHNiaS0+bDJuYnBlcnBhZ2UpOworCisJCS8qIEFsbG9jYXRlIGV4dGVudCBmb3IgbmV3IGlhZyBwYWdlICovCisJCXhsZW4gPSBzYmktPm5icGVycGFnZTsKKwkJaWYgKChyYyA9IGRiQWxsb2MoaXBpbWFwLCAwLCAoczY0KSB4bGVuLCAmeGFkZHIpKSkgeworCQkJLyogcmVsZWFzZSB0aGUgaW5vZGUgbWFwIGxvY2sgKi8KKwkJCUlXUklURV9VTkxPQ0soaXBpbWFwKTsKKworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKiBhc3NpZ24gYSBidWZmZXIgZm9yIHRoZSBwYWdlICovCisJCW1wID0gZ2V0X21ldGFwYWdlKGlwaW1hcCwgeGFkZHIsIFBTSVpFLCAxKTsKKwkJaWYgKCFtcCkgeworCQkJLyogRnJlZSB0aGUgYmxvY2tzIGFsbG9jYXRlZCBmb3IgdGhlIGlhZyBzaW5jZSBpdCB3YXMKKwkJCSAqIG5vdCBzdWNjZXNzZnVsbHkgYWRkZWQgdG8gdGhlIGlub2RlIG1hcAorCQkJICovCisJCQlkYkZyZWUoaXBpbWFwLCB4YWRkciwgKHM2NCkgeGxlbik7CisKKwkJCS8qIHJlbGVhc2UgdGhlIGlub2RlIG1hcCBsb2NrICovCisJCQlJV1JJVEVfVU5MT0NLKGlwaW1hcCk7CisKKwkJCXJjID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlhZ3AgPSAoc3RydWN0IGlhZyAqKSBtcC0+ZGF0YTsKKworCQkvKiBpbml0IHRoZSBpYWcgKi8KKwkJbWVtc2V0KGlhZ3AsIDAsIHNpemVvZihzdHJ1Y3QgaWFnKSk7CisJCWlhZ3AtPmlhZ251bSA9IGNwdV90b19sZTMyKGlhZ25vKTsKKwkJaWFncC0+aW5vZnJlZWZ3ZCA9IGlhZ3AtPmlub2ZyZWViYWNrID0gY3B1X3RvX2xlMzIoLTEpOworCQlpYWdwLT5leHRmcmVlZndkID0gaWFncC0+ZXh0ZnJlZWJhY2sgPSBjcHVfdG9fbGUzMigtMSk7CisJCWlhZ3AtPmlhZ2ZyZWUgPSBjcHVfdG9fbGUzMigtMSk7CisJCWlhZ3AtPm5mcmVlaW5vcyA9IDA7CisJCWlhZ3AtPm5mcmVlZXh0cyA9IGNwdV90b19sZTMyKEVYVFNQRVJJQUcpOworCisJCS8qIGluaXRpYWxpemUgdGhlIGZyZWUgaW5vZGUgc3VtbWFyeSBtYXAgKGZyZWUgZXh0ZW50CisJCSAqIHN1bW1hcnkgbWFwIGluaXRpYWxpemF0aW9uIGhhbmRsZWQgYnkgYnplcm8pLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IFNNQVBTWjsgaSsrKQorCQkJaWFncC0+aW5vc21hcFtpXSA9IGNwdV90b19sZTMyKE9ORVMpOworCisJCS8qCisJCSAqIEludmFsaWRhdGUgdGhlIHBhZ2UgYWZ0ZXIgd3JpdGluZyBhbmQgc3luY2luZyBpdC4KKwkJICogQWZ0ZXIgaXQncyBpbml0aWFsaXplZCwgd2UgYWNjZXNzIGl0IGluIGEgZGlmZmVyZW50CisJCSAqIGFkZHJlc3Mgc3BhY2UKKwkJICovCisJCXNldF9iaXQoTUVUQV9kaXNjYXJkLCAmbXAtPmZsYWcpOworCQlmbHVzaF9tZXRhcGFnZShtcCk7CisKKwkJLyoKKwkJICogc3RhcnQgdHlyYW5zYWN0aW9uIG9mIHVwZGF0ZSBvZiB0aGUgaW5vZGUgbWFwCisJCSAqIGFkZHJlc3Npbmcgc3RydWN0dXJlIHBvaW50aW5nIHRvIHRoZSBuZXcgaWFnIHBhZ2U7CisJCSAqLworCQl0aWQgPSB0eEJlZ2luKHNiLCBDT01NSVRfRk9SQ0UpOworCQlkb3duKCZKRlNfSVAoaXBpbWFwKS0+Y29tbWl0X3NlbSk7CisKKwkJLyogdXBkYXRlIHRoZSBpbm9kZSBtYXAgYWRkcmVzc2luZyBzdHJ1Y3R1cmUgdG8gcG9pbnQgdG8gaXQgKi8KKwkJaWYgKChyYyA9CisJCSAgICAgeHRJbnNlcnQodGlkLCBpcGltYXAsIDAsIGJsa25vLCB4bGVuLCAmeGFkZHIsIDApKSkgeworCQkJdHhFbmQodGlkKTsKKwkJCXVwKCZKRlNfSVAoaXBpbWFwKS0+Y29tbWl0X3NlbSk7CisJCQkvKiBGcmVlIHRoZSBibG9ja3MgYWxsb2NhdGVkIGZvciB0aGUgaWFnIHNpbmNlIGl0IHdhcworCQkJICogbm90IHN1Y2Nlc3NmdWxseSBhZGRlZCB0byB0aGUgaW5vZGUgbWFwCisJCQkgKi8KKwkJCWRiRnJlZShpcGltYXAsIHhhZGRyLCAoczY0KSB4bGVuKTsKKworCQkJLyogcmVsZWFzZSB0aGUgaW5vZGUgbWFwIGxvY2sgKi8KKwkJCUlXUklURV9VTkxPQ0soaXBpbWFwKTsKKworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKiB1cGRhdGUgdGhlIGlub2RlIG1hcCdzIGlub2RlIHRvIHJlZmxlY3QgdGhlIGV4dGVuc2lvbiAqLworCQlpcGltYXAtPmlfc2l6ZSArPSBQU0laRTsKKwkJaW5vZGVfYWRkX2J5dGVzKGlwaW1hcCwgUFNJWkUpOworCisJCS8qCisJCSAqIHR4Q29tbWl0KENPTU1JVF9GT1JDRSkgd2lsbCBzeW5jaHJvbm91c2x5IHdyaXRlIGFkZHJlc3MgCisJCSAqIGluZGV4IHBhZ2VzIGFuZCBpbm9kZSBhZnRlciBjb21taXQgaW4gY2FyZWZ1bCB1cGRhdGUgb3JkZXIgCisJCSAqIG9mIGFkZHJlc3MgaW5kZXggcGFnZXMgKHJpZ2h0IHRvIGxlZnQsIGJvdHRvbSB1cCk7CisJCSAqLworCQlpcGxpc3RbMF0gPSBpcGltYXA7CisJCXJjID0gdHhDb21taXQodGlkLCAxLCAmaXBsaXN0WzBdLCBDT01NSVRfRk9SQ0UpOworCisJCXR4RW5kKHRpZCk7CisJCXVwKCZKRlNfSVAoaXBpbWFwKS0+Y29tbWl0X3NlbSk7CisKKwkJZHVwbGljYXRlSVh0cmVlKHNiLCBibGtubywgeGxlbiwgJnhhZGRyKTsKKworCQkvKiB1cGRhdGUgdGhlIG5leHQgYXZhbGlhYmxlIGlhZyBudW1iZXIgKi8KKwkJaW1hcC0+aW1fbmV4dGlhZyArPSAxOworCisJCS8qIEFkZCB0aGUgaWFnIHRvIHRoZSBpYWcgZnJlZSBsaXN0IHNvIHdlIGRvbid0IGxvc2UgdGhlIGlhZworCQkgKiBpZiBhIGZhaWx1cmUgaGFwcGVucyBub3cuCisJCSAqLworCQlpbWFwLT5pbV9mcmVlaWFnID0gaWFnbm87CisKKwkJLyogVW50aWwgd2UgaGF2ZSBsb2dyZWRvIHdvcmtpbmcsIHdlIHdhbnQgdGhlIGltYXAgaW5vZGUgJgorCQkgKiBjb250cm9sIHBhZ2UgdG8gYmUgdXAgdG8gZGF0ZS4KKwkJICovCisJCWRpU3luYyhpcGltYXApOworCisJCS8qIHJlbGVhc2UgdGhlIGlub2RlIG1hcCBsb2NrICovCisJCUlXUklURV9VTkxPQ0soaXBpbWFwKTsKKwl9CisKKwkvKiBvYnRhaW4gcmVhZCBsb2NrIG9uIG1hcCAqLworCUlSRUFEX0xPQ0soaXBpbWFwKTsKKworCS8qIHJlYWQgdGhlIGlhZyAqLworCWlmICgocmMgPSBkaUlBR1JlYWQoaW1hcCwgaWFnbm8sICZtcCkpKSB7CisJCUlSRUFEX1VOTE9DSyhpcGltYXApOworCQlyYyA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKwlpYWdwID0gKHN0cnVjdCBpYWcgKikgbXAtPmRhdGE7CisKKwkvKiByZW1vdmUgdGhlIGlhZyBmcm9tIHRoZSBpYWcgZnJlZSBsaXN0ICovCisJaW1hcC0+aW1fZnJlZWlhZyA9IGxlMzJfdG9fY3B1KGlhZ3AtPmlhZ2ZyZWUpOworCWlhZ3AtPmlhZ2ZyZWUgPSBjcHVfdG9fbGUzMigtMSk7CisKKwkvKiBzZXQgdGhlIHJldHVybiBpYWcgbnVtYmVyIGFuZCBidWZmZXIgcG9pbnRlciAqLworCSppYWdub3AgPSBpYWdubzsKKwkqbXBwID0gbXA7CisKKyAgICAgIG91dDoKKwkvKiByZWxlYXNlIHRoZSBpYWcgZnJlZSBsb2NrICovCisJSUFHRlJFRV9VTkxPQ0soaW1hcCk7CisKKwlyZXR1cm4gKHJjKTsKK30KKworLyoKKyAqIE5BTUU6ICAgICAgICBkaUlBR1JlYWQoKQorICoKKyAqIEZVTkNUSU9OOiAgICBnZXQgdGhlIGJ1ZmZlciBmb3IgdGhlIHNwZWNpZmllZCBpYWcgd2l0aGluIGEgZmlsZXNldAorICoJCW9yIGFnZ3JlZ2F0ZSBpbm9kZSBtYXAuCisgKgkJCisgKiBQQVJBTUVURVJTOgorICogICAgICBpbWFwICAJLSBwb2ludGVyIHRvIGlub2RlIG1hcCBjb250cm9sIHN0cnVjdHVyZS4KKyAqICAgICAgaWFnbm8gIAktIGlhZyBudW1iZXIuCisgKiAgICAgIGJwcCAgCS0gcG9pbnQgdG8gYnVmZmVyIHBvaW50ZXIgdG8gYmUgZmlsbGVkIGluIG9uIHN1Y2Nlc3NmdWwKKyAqCQkgIGV4aXQuCisgKgorICogU0VSSUFMSVpBVElPTjoKKyAqCW11c3QgaGF2ZSByZWFkIGxvY2sgb24gaW1hcCBpbm9kZQorICoJKFdoZW4gY2FsbGVkIGJ5IGRpRXh0ZW5kRlMsIHRoZSBmaWxlc3lzdGVtIGlzIHF1aWVzY2VkLCB0aGVyZWZvcmUKKyAqCSB0aGUgcmVhZCBsb2NrIGlzIHVubmVjZXNzYXJ5LikKKyAqCisgKiBSRVRVUk4gVkFMVUVTOgorICogICAgICAwICAgICAgIC0gc3VjY2Vzcy4KKyAqICAgICAgLUVJTyAgCS0gaS9vIGVycm9yLgorICovCitzdGF0aWMgaW50IGRpSUFHUmVhZChzdHJ1Y3QgaW5vbWFwICogaW1hcCwgaW50IGlhZ25vLCBzdHJ1Y3QgbWV0YXBhZ2UgKiogbXBwKQoreworCXN0cnVjdCBpbm9kZSAqaXBpbWFwID0gaW1hcC0+aW1faXBpbWFwOworCXM2NCBibGtubzsKKworCS8qIGNvbXB1dGUgdGhlIGxvZ2ljYWwgYmxvY2sgbnVtYmVyIG9mIHRoZSBpYWcuICovCisJYmxrbm8gPSBJQUdUT0xCTEsoaWFnbm8sIEpGU19TQkkoaXBpbWFwLT5pX3NiKS0+bDJuYnBlcnBhZ2UpOworCisJLyogcmVhZCB0aGUgaWFnLiAqLworCSptcHAgPSByZWFkX21ldGFwYWdlKGlwaW1hcCwgYmxrbm8sIFBTSVpFLCAwKTsKKwlpZiAoKm1wcCA9PSBOVUxMKSB7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBOQU1FOiAgICAgICAgZGlGaW5kRnJlZSgpCisgKgorICogRlVOQ1RJT046ICAgIGZpbmQgdGhlIGZpcnN0IGZyZWUgYml0IGluIGEgd29yZCBzdGFydGluZyBhdAorICoJCXRoZSBzcGVjaWZpZWQgYml0IHBvc2l0aW9uLgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgICAgIHdvcmQgIAktIHdvcmQgdG8gYmUgZXhhbWluZWQuCisgKiAgICAgIHN0YXJ0ICAJLSBzdGFydGluZyBiaXQgcG9zaXRpb24uCisgKgorICogUkVUVVJOIFZBTFVFUzoKKyAqICAgICAgYml0IHBvc2l0aW9uIG9mIGZpcnN0IGZyZWUgYml0IGluIHRoZSB3b3JkIG9yIDMyIGlmCisgKglubyBmcmVlIGJpdHMgd2VyZSBmb3VuZC4KKyAqLworc3RhdGljIGludCBkaUZpbmRGcmVlKHUzMiB3b3JkLCBpbnQgc3RhcnQpCit7CisJaW50IGJpdG5vOworCWFzc2VydChzdGFydCA8IDMyKTsKKwkvKiBzY2FuIHRoZSB3b3JkIGZvciB0aGUgZmlyc3QgZnJlZSBiaXQuICovCisJZm9yICh3b3JkIDw8PSBzdGFydCwgYml0bm8gPSBzdGFydDsgYml0bm8gPCAzMjsKKwkgICAgIGJpdG5vKyssIHdvcmQgPDw9IDEpIHsKKwkJaWYgKCh3b3JkICYgSElHSE9SREVSKSA9PSAwKQorCQkJYnJlYWs7CisJfQorCXJldHVybiAoYml0bm8pOworfQorCisvKgorICogTkFNRToJZGlVcGRhdGVQTWFwKCkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEZVTkNUSU9OOiBVcGRhdGUgdGhlIHBlcnNpc3RlbnQgbWFwIGluIGFuIElBRyBmb3IgdGhlIGFsbG9jYXRpb24gb3IgCisgKglmcmVlaW5nIG9mIHRoZSBzcGVjaWZpZWQgaW5vZGUuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBQUkUgQ09ORElUSU9OUzogV29ya2luZyBtYXAgaGFzIGFscmVhZHkgYmVlbiB1cGRhdGVkIGZvciBhbGxvY2F0ZS4KKyAqCisgKiBQQVJBTUVURVJTOgorICoJaXBpbWFwCS0gSW5jb3JlIGlub2RlIG1hcCBpbm9kZQorICoJaW51bQktIE51bWJlciBvZiBpbm9kZSB0byBtYXJrIGluIHBlcm1hbmVudCBtYXAKKyAqCWlzX2ZyZWUJLSBJZiBUUlVFIGluZGljYXRlcyBpbm9kZSBzaG91bGQgYmUgbWFya2VkIGZyZWVkLCBvdGhlcndpc2UKKyAqCQkgIGluZGljYXRlcyBpbm9kZSBzaG91bGQgYmUgbWFya2VkIGFsbG9jYXRlZC4KKyAqCisgKiBSRVRVUk4gVkFMVUVTOiAKKyAqCQkwIGZvciBzdWNjZXNzCisgKi8KK2ludAorZGlVcGRhdGVQTWFwKHN0cnVjdCBpbm9kZSAqaXBpbWFwLAorCSAgICAgdW5zaWduZWQgbG9uZyBpbnVtLCBib29sZWFuX3QgaXNfZnJlZSwgc3RydWN0IHRibG9jayAqIHRibGspCit7CisJaW50IHJjOworCXN0cnVjdCBpYWcgKmlhZ3A7CisJc3RydWN0IG1ldGFwYWdlICptcDsKKwlpbnQgaWFnbm8sIGlubywgZXh0bm8sIGJpdG5vOworCXN0cnVjdCBpbm9tYXAgKmltYXA7CisJdTMyIG1hc2s7CisJc3RydWN0IGpmc19sb2cgKmxvZzsKKwlpbnQgbHNuLCBkaWZmdCwgZGlmZnA7CisKKwlpbWFwID0gSkZTX0lQKGlwaW1hcCktPmlfaW1hcDsKKwkvKiBnZXQgdGhlIGlhZyBudW1iZXIgY29udGFpbmluZyB0aGUgaW5vZGUgKi8KKwlpYWdubyA9IElOT1RPSUFHKGludW0pOworCS8qIG1ha2Ugc3VyZSB0aGF0IHRoZSBpYWcgaXMgY29udGFpbmVkIHdpdGhpbiB0aGUgbWFwICovCisJaWYgKGlhZ25vID49IGltYXAtPmltX25leHRpYWcpIHsKKwkJamZzX2Vycm9yKGlwaW1hcC0+aV9zYiwKKwkJCSAgImRpVXBkYXRlUE1hcDogdGhlIGlhZyBpcyBvdXRzaWRlIHRoZSBtYXAiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCS8qIHJlYWQgdGhlIGlhZyAqLworCUlSRUFEX0xPQ0soaXBpbWFwKTsKKwlyYyA9IGRpSUFHUmVhZChpbWFwLCBpYWdubywgJm1wKTsKKwlJUkVBRF9VTkxPQ0soaXBpbWFwKTsKKwlpZiAocmMpCisJCXJldHVybiAocmMpOworCWlhZ3AgPSAoc3RydWN0IGlhZyAqKSBtcC0+ZGF0YTsKKwkvKiBnZXQgdGhlIGlub2RlIG51bWJlciBhbmQgZXh0ZW50IG51bWJlciBvZiB0aGUgaW5vZGUgd2l0aGluCisJICogdGhlIGlhZyBhbmQgdGhlIGlub2RlIG51bWJlciB3aXRoaW4gdGhlIGV4dGVudC4KKwkgKi8KKwlpbm8gPSBpbnVtICYgKElOT1NQRVJJQUcgLSAxKTsKKwlleHRubyA9IGlubyA+PiBMMklOT1NQRVJFWFQ7CisJYml0bm8gPSBpbm8gJiAoSU5PU1BFUkVYVCAtIDEpOworCW1hc2sgPSBISUdIT1JERVIgPj4gYml0bm87CisJLyogCisJICogbWFyayB0aGUgaW5vZGUgZnJlZSBpbiBwZXJzaXN0ZW50IG1hcDoKKwkgKi8KKwlpZiAoaXNfZnJlZSA9PSBUUlVFKSB7CisJCS8qIFRoZSBpbm9kZSBzaG91bGQgaGF2ZSBiZWVuIGFsbG9jYXRlZCBib3RoIGluIHdvcmtpbmcKKwkJICogbWFwIGFuZCBpbiBwZXJzaXN0ZW50IG1hcDsKKwkJICogdGhlIGlub2RlIHdpbGwgYmUgZnJlZWQgZnJvbSB3b3JraW5nIG1hcCBhdCB0aGUgcmVsZWFzZQorCQkgKiBvZiBsYXN0IHJlZmVyZW5jZSByZWxlYXNlOworCQkgKi8KKwkJaWYgKCEobGUzMl90b19jcHUoaWFncC0+d21hcFtleHRub10pICYgbWFzaykpIHsKKwkJCWpmc19lcnJvcihpcGltYXAtPmlfc2IsIAorCQkJCSAgImRpVXBkYXRlUE1hcDogaW5vZGUgJWxkIG5vdCBtYXJrZWQgYXMgIgorCQkJCSAgImFsbG9jYXRlZCBpbiB3bWFwISIsIGludW0pOworCQl9CisJCWlmICghKGxlMzJfdG9fY3B1KGlhZ3AtPnBtYXBbZXh0bm9dKSAmIG1hc2spKSB7CisJCQlqZnNfZXJyb3IoaXBpbWFwLT5pX3NiLAorCQkJCSAgImRpVXBkYXRlUE1hcDogaW5vZGUgJWxkIG5vdCBtYXJrZWQgYXMgIgorCQkJCSAgImFsbG9jYXRlZCBpbiBwbWFwISIsIGludW0pOworCQl9CisJCS8qIHVwZGF0ZSB0aGUgYml0bWFwIGZvciB0aGUgZXh0ZW50IG9mIHRoZSBmcmVlZCBpbm9kZSAqLworCQlpYWdwLT5wbWFwW2V4dG5vXSAmPSBjcHVfdG9fbGUzMih+bWFzayk7CisJfQorCS8qCisJICogbWFyayB0aGUgaW5vZGUgYWxsb2NhdGVkIGluIHBlcnNpc3RlbnQgbWFwOgorCSAqLworCWVsc2UgeworCQkvKiBUaGUgaW5vZGUgc2hvdWxkIGJlIGFscmVhZHkgYWxsb2NhdGVkIGluIHRoZSB3b3JraW5nIG1hcAorCQkgKiBhbmQgc2hvdWxkIGJlIGZyZWUgaW4gcGVyc2lzdGVudCBtYXA7CisJCSAqLworCQlpZiAoIShsZTMyX3RvX2NwdShpYWdwLT53bWFwW2V4dG5vXSkgJiBtYXNrKSkgeworCQkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisJCQlqZnNfZXJyb3IoaXBpbWFwLT5pX3NiLAorCQkJCSAgImRpVXBkYXRlUE1hcDogdGhlIGlub2RlIGlzIG5vdCBhbGxvY2F0ZWQgaW4gIgorCQkJCSAgInRoZSB3b3JraW5nIG1hcCIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJaWYgKChsZTMyX3RvX2NwdShpYWdwLT5wbWFwW2V4dG5vXSkgJiBtYXNrKSAhPSAwKSB7CisJCQlyZWxlYXNlX21ldGFwYWdlKG1wKTsKKwkJCWpmc19lcnJvcihpcGltYXAtPmlfc2IsCisJCQkJICAiZGlVcGRhdGVQTWFwOiB0aGUgaW5vZGUgaXMgbm90IGZyZWUgaW4gdGhlICIKKwkJCQkgICJwZXJzaXN0ZW50IG1hcCIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJLyogdXBkYXRlIHRoZSBiaXRtYXAgZm9yIHRoZSBleHRlbnQgb2YgdGhlIGFsbG9jYXRlZCBpbm9kZSAqLworCQlpYWdwLT5wbWFwW2V4dG5vXSB8PSBjcHVfdG9fbGUzMihtYXNrKTsKKwl9CisJLyoKKwkgKiB1cGRhdGUgaWFnIGxzbgorCSAqLworCWxzbiA9IHRibGstPmxzbjsKKwlsb2cgPSBKRlNfU0JJKHRibGstPnNiKS0+bG9nOworCWlmIChtcC0+bHNuICE9IDApIHsKKwkJLyogaW5oZXJpdCBvbGRlci9zbWFsbGVyIGxzbiAqLworCQlsb2dkaWZmKGRpZmZ0LCBsc24sIGxvZyk7CisJCWxvZ2RpZmYoZGlmZnAsIG1wLT5sc24sIGxvZyk7CisJCWlmIChkaWZmdCA8IGRpZmZwKSB7CisJCQltcC0+bHNuID0gbHNuOworCQkJLyogbW92ZSBtcCBhZnRlciB0YmxvY2sgaW4gbG9nc3luYyBsaXN0ICovCisJCQlMT0dTWU5DX0xPQ0sobG9nKTsKKwkJCWxpc3RfbW92ZSgmbXAtPnN5bmNsaXN0LCAmdGJsay0+c3luY2xpc3QpOworCQkJTE9HU1lOQ19VTkxPQ0sobG9nKTsKKwkJfQorCQkvKiBpbmhlcml0IHlvdW5nZXIvbGFyZ2VyIGNsc24gKi8KKwkJTE9HU1lOQ19MT0NLKGxvZyk7CisJCWFzc2VydChtcC0+Y2xzbik7CisJCWxvZ2RpZmYoZGlmZnQsIHRibGstPmNsc24sIGxvZyk7CisJCWxvZ2RpZmYoZGlmZnAsIG1wLT5jbHNuLCBsb2cpOworCQlpZiAoZGlmZnQgPiBkaWZmcCkKKwkJCW1wLT5jbHNuID0gdGJsay0+Y2xzbjsKKwkJTE9HU1lOQ19VTkxPQ0sobG9nKTsKKwl9IGVsc2UgeworCQltcC0+bG9nID0gbG9nOworCQltcC0+bHNuID0gbHNuOworCQkvKiBpbnNlcnQgbXAgYWZ0ZXIgdGJsb2NrIGluIGxvZ3N5bmMgbGlzdCAqLworCQlMT0dTWU5DX0xPQ0sobG9nKTsKKwkJbG9nLT5jb3VudCsrOworCQlsaXN0X2FkZCgmbXAtPnN5bmNsaXN0LCAmdGJsay0+c3luY2xpc3QpOworCQltcC0+Y2xzbiA9IHRibGstPmNsc247CisJCUxPR1NZTkNfVU5MT0NLKGxvZyk7CisJfQorCXdyaXRlX21ldGFwYWdlKG1wKTsKKwlyZXR1cm4gKDApOworfQorCisvKgorICoJZGlFeHRlbmRGUygpCisgKgorICogZnVuY3Rpb246IHVwZGF0ZSBpbWFwIGZvciBleHRlbmRmcygpOworICogCisgKiBub3RlOiBBRyBzaXplIGhhcyBiZWVuIGluY3JlYXNlZCBzLnQuIGVhY2ggayBvbGQgY29udGlndW91cyBBR3MgYXJlIAorICogY29hbGVzY2VkIGludG8gYSBuZXcgQUc7CisgKi8KK2ludCBkaUV4dGVuZEZTKHN0cnVjdCBpbm9kZSAqaXBpbWFwLCBzdHJ1Y3QgaW5vZGUgKmlwYm1hcCkKK3sKKwlpbnQgcmMsIHJjeCA9IDA7CisJc3RydWN0IGlub21hcCAqaW1hcCA9IEpGU19JUChpcGltYXApLT5pX2ltYXA7CisJc3RydWN0IGlhZyAqaWFncCA9IE5VTEwsICpoaWFncCA9IE5VTEw7CisJc3RydWN0IGJtYXAgKm1wID0gSkZTX1NCSShpcGJtYXAtPmlfc2IpLT5ibWFwOworCXN0cnVjdCBtZXRhcGFnZSAqYnAsICpoYnA7CisJaW50IGksIG4sIGhlYWQ7CisJaW50IG51bWlub3MsIHhudW1pbm9zID0gMCwgeG51bWZyZWUgPSAwOworCXM2NCBhZ3N0YXJ0OworCisJamZzX2luZm8oImRpRXh0ZW5kRlM6IG5leHRpYWc6JWQgbnVtaW5vczolZCBudW1mcmVlOiVkIiwKKwkJICAgaW1hcC0+aW1fbmV4dGlhZywgYXRvbWljX3JlYWQoJmltYXAtPmltX251bWlub3MpLAorCQkgICBhdG9taWNfcmVhZCgmaW1hcC0+aW1fbnVtZnJlZSkpOworCisJLyoKKwkgKiAgICAgIHJlY29uc3RydWN0IGltYXAgCisJICoKKwkgKiBjb2FsZXNjZSBjb250aWd1b3VzIGsgKG5ld0FHU2l6ZS9vbGRBR1NpemUpIEFHczsKKwkgKiBpLmUuLCAoQUdpLCAuLi4sIEFHaikgd2hlcmUgaSA9IGsqbiBhbmQgaiA9IGsqKG4rMSkgLSAxIHRvIEFHbjsKKwkgKiBub3RlOiBuZXcgQUcgc2l6ZSA9IG9sZCBBRyBzaXplICogKDIqKngpLgorCSAqLworCisJLyogaW5pdCBwZXIgQUcgY29udHJvbCBpbmZvcm1hdGlvbiBpbV9hZ2N0bFtdICovCisJZm9yIChpID0gMDsgaSA8IE1BWEFHOyBpKyspIHsKKwkJaW1hcC0+aW1fYWdjdGxbaV0uaW5vZnJlZSA9IC0xOworCQlpbWFwLT5pbV9hZ2N0bFtpXS5leHRmcmVlID0gLTE7CisJCWltYXAtPmltX2FnY3RsW2ldLm51bWlub3MgPSAwOwkvKiBudW1iZXIgb2YgYmFja2VkIGlub2RlcyAqLworCQlpbWFwLT5pbV9hZ2N0bFtpXS5udW1mcmVlID0gMDsJLyogbnVtYmVyIG9mIGZyZWUgYmFja2VkIGlub2RlcyAqLworCX0KKworCS8qCisJICogICAgICBwcm9jZXNzIGVhY2ggaWFnIHBhZ2Ugb2YgdGhlIG1hcC4KKwkgKgorCSAqIHJlYnVpbGQgQUcgRnJlZSBJbm9kZSBMaXN0LCBBRyBGcmVlIElub2RlIEV4dGVudCBMaXN0OworCSAqLworCWZvciAoaSA9IDA7IGkgPCBpbWFwLT5pbV9uZXh0aWFnOyBpKyspIHsKKwkJaWYgKChyYyA9IGRpSUFHUmVhZChpbWFwLCBpLCAmYnApKSkgeworCQkJcmN4ID0gcmM7CisJCQljb250aW51ZTsKKwkJfQorCQlpYWdwID0gKHN0cnVjdCBpYWcgKikgYnAtPmRhdGE7CisJCWlmIChsZTMyX3RvX2NwdShpYWdwLT5pYWdudW0pICE9IGkpIHsKKwkJCXJlbGVhc2VfbWV0YXBhZ2UoYnApOworCQkJamZzX2Vycm9yKGlwaW1hcC0+aV9zYiwKKwkJCQkgICJkaUV4dGVuZEZzOiB1bmV4cGVjdGVkIHZhbHVlIG9mIGlhZ251bSIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQkvKiBsZWF2ZSBmcmVlIGlhZyBpbiB0aGUgZnJlZSBpYWcgbGlzdCAqLworCQlpZiAoaWFncC0+bmZyZWVleHRzID09IGNwdV90b19sZTMyKEVYVFNQRVJJQUcpKSB7ICAKKwkJICAgICAgICByZWxlYXNlX21ldGFwYWdlKGJwKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogYWdzdGFydCB0aGF0IGNvbXB1dGVzIHRvIHRoZSBzYW1lIGFnIGlzIHRyZWF0ZWQgYXMgc2FtZTsgKi8KKwkJYWdzdGFydCA9IGxlNjRfdG9fY3B1KGlhZ3AtPmFnc3RhcnQpOworCQkvKiBpYWdwLT5hZ3N0YXJ0ID0gYWdzdGFydCAmIH4obXAtPmRiX2Fnc2l6ZSAtIDEpOyAqLworCQluID0gYWdzdGFydCA+PiBtcC0+ZGJfYWdsMnNpemU7CisKKwkJLyogY29tcHV0ZSBiYWNrZWQgaW5vZGVzICovCisJCW51bWlub3MgPSAoRVhUU1BFUklBRyAtIGxlMzJfdG9fY3B1KGlhZ3AtPm5mcmVlZXh0cykpCisJCSAgICA8PCBMMklOT1NQRVJFWFQ7CisJCWlmIChudW1pbm9zID4gMCkgeworCQkJLyogbWVyZ2UgQUcgYmFja2VkIGlub2RlcyAqLworCQkJaW1hcC0+aW1fYWdjdGxbbl0ubnVtaW5vcyArPSBudW1pbm9zOworCQkJeG51bWlub3MgKz0gbnVtaW5vczsKKwkJfQorCisJCS8qIGlmIGFueSBiYWNrZWQgZnJlZSBpbm9kZXMsIGluc2VydCBhdCBBRyBmcmVlIGlub2RlIGxpc3QgKi8KKwkJaWYgKChpbnQpIGxlMzJfdG9fY3B1KGlhZ3AtPm5mcmVlaW5vcykgPiAwKSB7CisJCQlpZiAoKGhlYWQgPSBpbWFwLT5pbV9hZ2N0bFtuXS5pbm9mcmVlKSA9PSAtMSkgeworCQkJCWlhZ3AtPmlub2ZyZWVmd2QgPSBjcHVfdG9fbGUzMigtMSk7CisJCQkJaWFncC0+aW5vZnJlZWJhY2sgPSBjcHVfdG9fbGUzMigtMSk7CisJCQl9IGVsc2UgeworCQkJCWlmICgocmMgPSBkaUlBR1JlYWQoaW1hcCwgaGVhZCwgJmhicCkpKSB7CisJCQkJCXJjeCA9IHJjOworCQkJCQlnb3RvIG5leHRpYWc7CisJCQkJfQorCQkJCWhpYWdwID0gKHN0cnVjdCBpYWcgKikgaGJwLT5kYXRhOworCQkJCWhpYWdwLT5pbm9mcmVlYmFjayA9IGlhZ3AtPmlhZ251bTsKKwkJCQlpYWdwLT5pbm9mcmVlZndkID0gY3B1X3RvX2xlMzIoaGVhZCk7CisJCQkJaWFncC0+aW5vZnJlZWJhY2sgPSBjcHVfdG9fbGUzMigtMSk7CisJCQkJd3JpdGVfbWV0YXBhZ2UoaGJwKTsKKwkJCX0KKworCQkJaW1hcC0+aW1fYWdjdGxbbl0uaW5vZnJlZSA9CisJCQkgICAgbGUzMl90b19jcHUoaWFncC0+aWFnbnVtKTsKKworCQkJLyogbWVyZ2UgQUcgYmFja2VkIGZyZWUgaW5vZGVzICovCisJCQlpbWFwLT5pbV9hZ2N0bFtuXS5udW1mcmVlICs9CisJCQkgICAgbGUzMl90b19jcHUoaWFncC0+bmZyZWVpbm9zKTsKKwkJCXhudW1mcmVlICs9IGxlMzJfdG9fY3B1KGlhZ3AtPm5mcmVlaW5vcyk7CisJCX0KKworCQkvKiBpZiBhbnkgZnJlZSBleHRlbnRzLCBpbnNlcnQgYXQgQUcgZnJlZSBleHRlbnQgbGlzdCAqLworCQlpZiAobGUzMl90b19jcHUoaWFncC0+bmZyZWVleHRzKSA+IDApIHsKKwkJCWlmICgoaGVhZCA9IGltYXAtPmltX2FnY3RsW25dLmV4dGZyZWUpID09IC0xKSB7CisJCQkJaWFncC0+ZXh0ZnJlZWZ3ZCA9IGNwdV90b19sZTMyKC0xKTsKKwkJCQlpYWdwLT5leHRmcmVlYmFjayA9IGNwdV90b19sZTMyKC0xKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKChyYyA9IGRpSUFHUmVhZChpbWFwLCBoZWFkLCAmaGJwKSkpIHsKKwkJCQkJcmN4ID0gcmM7CisJCQkJCWdvdG8gbmV4dGlhZzsKKwkJCQl9CisJCQkJaGlhZ3AgPSAoc3RydWN0IGlhZyAqKSBoYnAtPmRhdGE7CisJCQkJaGlhZ3AtPmV4dGZyZWViYWNrID0gaWFncC0+aWFnbnVtOworCQkJCWlhZ3AtPmV4dGZyZWVmd2QgPSBjcHVfdG9fbGUzMihoZWFkKTsKKwkJCQlpYWdwLT5leHRmcmVlYmFjayA9IGNwdV90b19sZTMyKC0xKTsKKwkJCQl3cml0ZV9tZXRhcGFnZShoYnApOworCQkJfQorCisJCQlpbWFwLT5pbV9hZ2N0bFtuXS5leHRmcmVlID0KKwkJCSAgICBsZTMyX3RvX2NwdShpYWdwLT5pYWdudW0pOworCQl9CisKKwkgICAgICBuZXh0aWFnOgorCQl3cml0ZV9tZXRhcGFnZShicCk7CisJfQorCisJaWYgKHhudW1pbm9zICE9IGF0b21pY19yZWFkKCZpbWFwLT5pbV9udW1pbm9zKSB8fAorCSAgICB4bnVtZnJlZSAhPSBhdG9taWNfcmVhZCgmaW1hcC0+aW1fbnVtZnJlZSkpIHsKKwkJamZzX2Vycm9yKGlwaW1hcC0+aV9zYiwKKwkJCSAgImRpRXh0ZW5kRnM6IG51bWlub3Mgb3IgbnVtZnJlZSBpbmNvcnJlY3QiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIHJjeDsKK30KKworCisvKgorICoJZHVwbGljYXRlSVh0cmVlKCkKKyAqCisgKiBzZXJpYWxpemF0aW9uOiBJV1JJVEVfTE9DSyBoZWxkIG9uIGVudHJ5L2V4aXQKKyAqCisgKiBub3RlOiBzaGFkb3cgcGFnZSB3aXRoIHJlZ3VsYXIgaW5vZGUgKHJlbC4yKTsKKyAqLworc3RhdGljIHZvaWQgZHVwbGljYXRlSVh0cmVlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHM2NCBibGtubywKKwkJCSAgICBpbnQgeGxlbiwgczY0ICp4YWRkcikKK3sKKwlzdHJ1Y3QgamZzX3N1cGVyYmxvY2sgKmpfc2I7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3QgaW5vZGUgKmlwOworCXRpZF90IHRpZDsKKworCS8qIGlmIEFJVDIgaXBtYXAyIGlzIGJhZCwgZG8gbm90IHRyeSB0byB1cGRhdGUgaXQgKi8KKwlpZiAoSkZTX1NCSShzYiktPm1udGZsYWcgJiBKRlNfQkFEX1NBSVQpCS8qIHNfZmxhZyAqLworCQlyZXR1cm47CisJaXAgPSBkaVJlYWRTcGVjaWFsKHNiLCBGSUxFU1lTVEVNX0ksIDEpOworCWlmIChpcCA9PSBOVUxMKSB7CisJCUpGU19TQkkoc2IpLT5tbnRmbGFnIHw9IEpGU19CQURfU0FJVDsKKwkJaWYgKHJlYWRTdXBlcihzYiwgJmJoKSkKKwkJCXJldHVybjsKKwkJal9zYiA9IChzdHJ1Y3QgamZzX3N1cGVyYmxvY2sgKiliaC0+Yl9kYXRhOworCQlqX3NiLT5zX2ZsYWcgfD0gY3B1X3RvX2xlMzIoSkZTX0JBRF9TQUlUKTsKKworCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCXN5bmNfZGlydHlfYnVmZmVyKGJoKTsKKwkJYnJlbHNlKGJoKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHN0YXJ0IHRyYW5zYWN0aW9uICovCisJdGlkID0gdHhCZWdpbihzYiwgQ09NTUlUX0ZPUkNFKTsKKwkvKiB1cGRhdGUgdGhlIGlub2RlIG1hcCBhZGRyZXNzaW5nIHN0cnVjdHVyZSB0byBwb2ludCB0byBpdCAqLworCWlmICh4dEluc2VydCh0aWQsIGlwLCAwLCBibGtubywgeGxlbiwgeGFkZHIsIDApKSB7CisJCUpGU19TQkkoc2IpLT5tbnRmbGFnIHw9IEpGU19CQURfU0FJVDsKKwkJdHhBYm9ydCh0aWQsIDEpOworCQlnb3RvIGNsZWFudXA7CisKKwl9CisJLyogdXBkYXRlIHRoZSBpbm9kZSBtYXAncyBpbm9kZSB0byByZWZsZWN0IHRoZSBleHRlbnNpb24gKi8KKwlpcC0+aV9zaXplICs9IFBTSVpFOworCWlub2RlX2FkZF9ieXRlcyhpcCwgUFNJWkUpOworCXR4Q29tbWl0KHRpZCwgMSwgJmlwLCBDT01NSVRfRk9SQ0UpOworICAgICAgY2xlYW51cDoKKwl0eEVuZCh0aWQpOworCWRpRnJlZVNwZWNpYWwoaXApOworfQorCisvKgorICogTkFNRTogICAgICAgIGNvcHlfZnJvbV9kaW5vZGUoKQorICoKKyAqIEZVTkNUSU9OOiAgICBDb3BpZXMgaW5vZGUgaW5mbyBmcm9tIGRpc2sgaW5vZGUgdG8gaW4tbWVtb3J5IGlub2RlCisgKgorICogUkVUVVJOIFZBTFVFUzoKKyAqICAgICAgMCAgICAgICAtIHN1Y2Nlc3MKKyAqICAgICAgLUVOT01FTQktIGluc3VmZmljaWVudCBtZW1vcnkKKyAqLworc3RhdGljIGludCBjb3B5X2Zyb21fZGlub2RlKHN0cnVjdCBkaW5vZGUgKiBkaXAsIHN0cnVjdCBpbm9kZSAqaXApCit7CisJc3RydWN0IGpmc19pbm9kZV9pbmZvICpqZnNfaXAgPSBKRlNfSVAoaXApOworCisJamZzX2lwLT5maWxlc2V0ID0gbGUzMl90b19jcHUoZGlwLT5kaV9maWxlc2V0KTsKKwlqZnNfaXAtPm1vZGUyID0gbGUzMl90b19jcHUoZGlwLT5kaV9tb2RlKTsKKworCWlwLT5pX21vZGUgPSBsZTMyX3RvX2NwdShkaXAtPmRpX21vZGUpICYgMHhmZmZmOworCWlwLT5pX25saW5rID0gbGUzMl90b19jcHUoZGlwLT5kaV9ubGluayk7CisJaXAtPmlfdWlkID0gbGUzMl90b19jcHUoZGlwLT5kaV91aWQpOworCWlwLT5pX2dpZCA9IGxlMzJfdG9fY3B1KGRpcC0+ZGlfZ2lkKTsKKwlpcC0+aV9zaXplID0gbGU2NF90b19jcHUoZGlwLT5kaV9zaXplKTsKKwlpcC0+aV9hdGltZS50dl9zZWMgPSBsZTMyX3RvX2NwdShkaXAtPmRpX2F0aW1lLnR2X3NlYyk7CisJaXAtPmlfYXRpbWUudHZfbnNlYyA9IGxlMzJfdG9fY3B1KGRpcC0+ZGlfYXRpbWUudHZfbnNlYyk7CisJaXAtPmlfbXRpbWUudHZfc2VjID0gbGUzMl90b19jcHUoZGlwLT5kaV9tdGltZS50dl9zZWMpOworCWlwLT5pX210aW1lLnR2X25zZWMgPSBsZTMyX3RvX2NwdShkaXAtPmRpX210aW1lLnR2X25zZWMpOworCWlwLT5pX2N0aW1lLnR2X3NlYyA9IGxlMzJfdG9fY3B1KGRpcC0+ZGlfY3RpbWUudHZfc2VjKTsKKwlpcC0+aV9jdGltZS50dl9uc2VjID0gbGUzMl90b19jcHUoZGlwLT5kaV9jdGltZS50dl9uc2VjKTsKKwlpcC0+aV9ibGtzaXplID0gaXAtPmlfc2ItPnNfYmxvY2tzaXplOworCWlwLT5pX2Jsb2NrcyA9IExCTEsyUEJMSyhpcC0+aV9zYiwgbGU2NF90b19jcHUoZGlwLT5kaV9uYmxvY2tzKSk7CisJaXAtPmlfZ2VuZXJhdGlvbiA9IGxlMzJfdG9fY3B1KGRpcC0+ZGlfZ2VuKTsKKworCWpmc19pcC0+aXhweGQgPSBkaXAtPmRpX2l4cHhkOwkvKiBpbi1tZW1vcnkgcHhkJ3MgYXJlIGxpdHRsZS1lbmRpYW4gKi8KKwlqZnNfaXAtPmFjbCA9IGRpcC0+ZGlfYWNsOwkvKiBhcyBhcmUgZHhkJ3MgKi8KKwlqZnNfaXAtPmVhID0gZGlwLT5kaV9lYTsKKwlqZnNfaXAtPm5leHRfaW5kZXggPSBsZTMyX3RvX2NwdShkaXAtPmRpX25leHRfaW5kZXgpOworCWpmc19pcC0+b3RpbWUgPSBsZTMyX3RvX2NwdShkaXAtPmRpX290aW1lLnR2X3NlYyk7CisJamZzX2lwLT5hY2x0eXBlID0gbGUzMl90b19jcHUoZGlwLT5kaV9hY2x0eXBlKTsKKworCWlmIChTX0lTQ0hSKGlwLT5pX21vZGUpIHx8IFNfSVNCTEsoaXAtPmlfbW9kZSkpIHsKKwkJamZzX2lwLT5kZXYgPSBsZTMyX3RvX2NwdShkaXAtPmRpX3JkZXYpOworCQlpcC0+aV9yZGV2ID0gbmV3X2RlY29kZV9kZXYoamZzX2lwLT5kZXYpOworCX0KKworCWlmIChTX0lTRElSKGlwLT5pX21vZGUpKSB7CisJCW1lbWNweSgmamZzX2lwLT5pX2RpcnRhYmxlLCAmZGlwLT5kaV9kaXJ0YWJsZSwgMzg0KTsKKwl9IGVsc2UgaWYgKFNfSVNSRUcoaXAtPmlfbW9kZSkgfHwgU19JU0xOSyhpcC0+aV9tb2RlKSkgeworCQltZW1jcHkoJmpmc19pcC0+aV94dHJvb3QsICZkaXAtPmRpX3h0cm9vdCwgMjg4KTsKKwl9IGVsc2UKKwkJbWVtY3B5KCZqZnNfaXAtPmlfaW5saW5lX2VhLCAmZGlwLT5kaV9pbmxpbmVlYSwgMTI4KTsKKworCS8qIFplcm8gdGhlIGluLW1lbW9yeS1vbmx5IHN0dWZmICovCisJamZzX2lwLT5jZmxhZyA9IDA7CisJamZzX2lwLT5idGluZGV4ID0gMDsKKwlqZnNfaXAtPmJ0b3JkZXIgPSAwOworCWpmc19pcC0+YnhmbGFnID0gMDsKKwlqZnNfaXAtPmJsaWQgPSAwOworCWpmc19pcC0+YXRsaGVhZCA9IDA7CisJamZzX2lwLT5hdGx0YWlsID0gMDsKKwlqZnNfaXAtPnh0bGlkID0gMDsKKwlyZXR1cm4gKDApOworfQorCisvKgorICogTkFNRTogICAgICAgIGNvcHlfdG9fZGlub2RlKCkKKyAqCisgKiBGVU5DVElPTjogICAgQ29waWVzIGlub2RlIGluZm8gZnJvbSBpbi1tZW1vcnkgaW5vZGUgdG8gZGlzayBpbm9kZQorICovCitzdGF0aWMgdm9pZCBjb3B5X3RvX2Rpbm9kZShzdHJ1Y3QgZGlub2RlICogZGlwLCBzdHJ1Y3QgaW5vZGUgKmlwKQoreworCXN0cnVjdCBqZnNfaW5vZGVfaW5mbyAqamZzX2lwID0gSkZTX0lQKGlwKTsKKworCWRpcC0+ZGlfZmlsZXNldCA9IGNwdV90b19sZTMyKGpmc19pcC0+ZmlsZXNldCk7CisJZGlwLT5kaV9pbm9zdGFtcCA9IGNwdV90b19sZTMyKEpGU19TQkkoaXAtPmlfc2IpLT5pbm9zdGFtcCk7CisJZGlwLT5kaV9udW1iZXIgPSBjcHVfdG9fbGUzMihpcC0+aV9pbm8pOworCWRpcC0+ZGlfZ2VuID0gY3B1X3RvX2xlMzIoaXAtPmlfZ2VuZXJhdGlvbik7CisJZGlwLT5kaV9zaXplID0gY3B1X3RvX2xlNjQoaXAtPmlfc2l6ZSk7CisJZGlwLT5kaV9uYmxvY2tzID0gY3B1X3RvX2xlNjQoUEJMSzJMQkxLKGlwLT5pX3NiLCBpcC0+aV9ibG9ja3MpKTsKKwlkaXAtPmRpX25saW5rID0gY3B1X3RvX2xlMzIoaXAtPmlfbmxpbmspOworCWRpcC0+ZGlfdWlkID0gY3B1X3RvX2xlMzIoaXAtPmlfdWlkKTsKKwlkaXAtPmRpX2dpZCA9IGNwdV90b19sZTMyKGlwLT5pX2dpZCk7CisJLyoKKwkgKiBtb2RlMiBpcyBvbmx5IG5lZWRlZCBmb3Igc3RvcmluZyB0aGUgaGlnaGVyIG9yZGVyIGJpdHMuCisJICogVHJ1c3QgaV9tb2RlIGZvciB0aGUgbG93ZXIgb3JkZXIgb25lcworCSAqLworCWRpcC0+ZGlfbW9kZSA9IGNwdV90b19sZTMyKChqZnNfaXAtPm1vZGUyICYgMHhmZmZmMDAwMCkgfCBpcC0+aV9tb2RlKTsKKwlkaXAtPmRpX2F0aW1lLnR2X3NlYyA9IGNwdV90b19sZTMyKGlwLT5pX2F0aW1lLnR2X3NlYyk7CisJZGlwLT5kaV9hdGltZS50dl9uc2VjID0gY3B1X3RvX2xlMzIoaXAtPmlfYXRpbWUudHZfbnNlYyk7CisJZGlwLT5kaV9jdGltZS50dl9zZWMgPSBjcHVfdG9fbGUzMihpcC0+aV9jdGltZS50dl9zZWMpOworCWRpcC0+ZGlfY3RpbWUudHZfbnNlYyA9IGNwdV90b19sZTMyKGlwLT5pX2N0aW1lLnR2X25zZWMpOworCWRpcC0+ZGlfbXRpbWUudHZfc2VjID0gY3B1X3RvX2xlMzIoaXAtPmlfbXRpbWUudHZfc2VjKTsKKwlkaXAtPmRpX210aW1lLnR2X25zZWMgPSBjcHVfdG9fbGUzMihpcC0+aV9tdGltZS50dl9uc2VjKTsKKwlkaXAtPmRpX2l4cHhkID0gamZzX2lwLT5peHB4ZDsJLyogaW4tbWVtb3J5IHB4ZCdzIGFyZSBsaXR0bGUtZW5kaWFuICovCisJZGlwLT5kaV9hY2wgPSBqZnNfaXAtPmFjbDsJLyogYXMgYXJlIGR4ZCdzICovCisJZGlwLT5kaV9lYSA9IGpmc19pcC0+ZWE7CisJZGlwLT5kaV9uZXh0X2luZGV4ID0gY3B1X3RvX2xlMzIoamZzX2lwLT5uZXh0X2luZGV4KTsKKwlkaXAtPmRpX290aW1lLnR2X3NlYyA9IGNwdV90b19sZTMyKGpmc19pcC0+b3RpbWUpOworCWRpcC0+ZGlfb3RpbWUudHZfbnNlYyA9IDA7CisJZGlwLT5kaV9hY2x0eXBlID0gY3B1X3RvX2xlMzIoamZzX2lwLT5hY2x0eXBlKTsKKwlpZiAoU19JU0NIUihpcC0+aV9tb2RlKSB8fCBTX0lTQkxLKGlwLT5pX21vZGUpKQorCQlkaXAtPmRpX3JkZXYgPSBjcHVfdG9fbGUzMihqZnNfaXAtPmRldik7Cit9CisKKyNpZmRlZglfSkZTX0RFQlVHX0lNQVAKKy8qCisgKglEQkdkaUluaXQoKQorICovCitzdGF0aWMgdm9pZCAqREJHZGlJbml0KHN0cnVjdCBpbm9tYXAgKiBpbWFwKQoreworCXUzMiAqZGltYXA7CisJaW50IHNpemU7CisJc2l6ZSA9IDY0ICogMTAyNDsKKwlpZiAoKGRpbWFwID0gKHUzMiAqKSB4bWFsbG9jKHNpemUsIEwyUFNJWkUsIGtlcm5lbF9oZWFwKSkgPT0gTlVMTCkKKwkJYXNzZXJ0KDApOworCWJ6ZXJvKCh2b2lkICopIGRpbWFwLCBzaXplKTsKKwlpbWFwLT5pbV9EQkdkaW1hcCA9IGRpbWFwOworfQorCisvKgorICoJREJHZGlBbGxvYygpCisgKi8KK3N0YXRpYyB2b2lkIERCR2RpQWxsb2Moc3RydWN0IGlub21hcCAqIGltYXAsIGlub190IGlubykKK3sKKwl1MzIgKmRpbWFwID0gaW1hcC0+aW1fREJHZGltYXA7CisJaW50IHcsIGI7CisJdTMyIG07CisJdyA9IGlubyA+PiA1OworCWIgPSBpbm8gJiAzMTsKKwltID0gMHg4MDAwMDAwMCA+PiBiOworCWFzc2VydCh3IDwgNjQgKiAyNTYpOworCWlmIChkaW1hcFt3XSAmIG0pIHsKKwkJcHJpbnRrKCJERUJVRyBkaUFsbG9jOiBkdXBsaWNhdGUgYWxsb2MgaW5vOjB4JXhcbiIsIGlubyk7CisJfQorCWRpbWFwW3ddIHw9IG07Cit9CisKKy8qCisgKglEQkdkaUZyZWUoKQorICovCitzdGF0aWMgdm9pZCBEQkdkaUZyZWUoc3RydWN0IGlub21hcCAqIGltYXAsIGlub190IGlubykKK3sKKwl1MzIgKmRpbWFwID0gaW1hcC0+aW1fREJHZGltYXA7CisJaW50IHcsIGI7CisJdTMyIG07CisJdyA9IGlubyA+PiA1OworCWIgPSBpbm8gJiAzMTsKKwltID0gMHg4MDAwMDAwMCA+PiBiOworCWFzc2VydCh3IDwgNjQgKiAyNTYpOworCWlmICgoZGltYXBbd10gJiBtKSA9PSAwKSB7CisJCXByaW50aygiREVCVUcgZGlGcmVlOiBkdXBsaWNhdGUgZnJlZSBpbm86MHgleFxuIiwgaW5vKTsKKwl9CisJZGltYXBbd10gJj0gfm07Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfY3Aoc3RydWN0IGlub21hcCAqIGlwaW1hcCwgY2hhciAqZnVuY3Rpb24sIGludCBsaW5lKQoreworCXByaW50aygiXG4qICoqKioqKioqKiAqXG5Db250cm9sIFBhZ2UgJXMgJWRcbiIsIGZ1bmN0aW9uLCBsaW5lKTsKKwlwcmludGsoIkZyZWVJQUcgJWRcdE5leHRJQUcgJWRcbiIsIGlwaW1hcC0+aW1fZnJlZWlhZywKKwkgICAgICAgaXBpbWFwLT5pbV9uZXh0aWFnKTsKKwlwcmludGsoIk51bUlub3MgJWRcdE51bUZyZWUgJWRcbiIsCisJICAgICAgIGF0b21pY19yZWFkKCZpcGltYXAtPmltX251bWlub3MpLAorCSAgICAgICBhdG9taWNfcmVhZCgmaXBpbWFwLT5pbV9udW1mcmVlKSk7CisJcHJpbnRrKCJBRyBJbm9GcmVlICVkXHRBRyBFeHRGcmVlICVkXG4iLAorCSAgICAgICBpcGltYXAtPmltX2FnY3RsWzBdLmlub2ZyZWUsIGlwaW1hcC0+aW1fYWdjdGxbMF0uZXh0ZnJlZSk7CisJcHJpbnRrKCJBRyBOdW1Jbm9zICVkXHRBRyBOdW1GcmVlICVkXG4iLAorCSAgICAgICBpcGltYXAtPmltX2FnY3RsWzBdLm51bWlub3MsIGlwaW1hcC0+aW1fYWdjdGxbMF0ubnVtZnJlZSk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfaWFnKHN0cnVjdCBpYWcgKiBpYWcsIGNoYXIgKmZ1bmN0aW9uLCBpbnQgbGluZSkKK3sKKwlwcmludGsoIlxuKiAqKioqKioqKiogKlxuSUFHICVzICVkXG4iLCBmdW5jdGlvbiwgbGluZSk7CisJcHJpbnRrKCJJYWdOdW0gJWRcdElBRyBGcmVlICVkXG4iLCBsZTMyX3RvX2NwdShpYWctPmlhZ251bSksCisJICAgICAgIGxlMzJfdG9fY3B1KGlhZy0+aWFnZnJlZSkpOworCXByaW50aygiSW5vRnJlZUZ3ZCAlZFx0SW5vRnJlZUJhY2sgJWRcbiIsCisJICAgICAgIGxlMzJfdG9fY3B1KGlhZy0+aW5vZnJlZWZ3ZCksCisJICAgICAgIGxlMzJfdG9fY3B1KGlhZy0+aW5vZnJlZWJhY2spKTsKKwlwcmludGsoIkV4dEZyZWVGd2QgJWRcdEV4dEZyZWVCYWNrICVkXG4iLAorCSAgICAgICBsZTMyX3RvX2NwdShpYWctPmV4dGZyZWVmd2QpLAorCSAgICAgICBsZTMyX3RvX2NwdShpYWctPmV4dGZyZWViYWNrKSk7CisJcHJpbnRrKCJORnJlZUlub3MgJWRcdE5GcmVlRXh0cyAlZFxuIiwgbGUzMl90b19jcHUoaWFnLT5uZnJlZWlub3MpLAorCSAgICAgICBsZTMyX3RvX2NwdShpYWctPm5mcmVlZXh0cykpOworfQorI2VuZGlmCQkJCS8qIF9KRlNfREVCVUdfSU1BUCAqLwpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19pbWFwLmggYi9mcy9qZnMvamZzX2ltYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjU5YWRlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZzL2pmc19pbWFwLmgKQEAgLTAsMCArMSwxNzUgQEAKKy8qCisgKiAgIENvcHlyaWdodCAoYykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwMC0yMDAyCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpZm5kZWYJX0hfSkZTX0lNQVAKKyNkZWZpbmUgX0hfSkZTX0lNQVAKKworI2luY2x1ZGUgImpmc190eG5tZ3IuaCIKKworLyoKKyAqCWpmc19pbWFwLmg6IGRpc2sgaW5vZGUgbWFuYWdlcgorICovCisKKyNkZWZpbmUJRVhUU1BFUklBRwkxMjgJLyogbnVtYmVyIG9mIGRpc2sgaW5vZGUgZXh0ZW50IHBlciBpYWcgICovCisjZGVmaW5lIElNQVBCTEtOTwkwCS8qIGxibGtubyBvZiBkaW5vbWFwIHdpdGhpbiBpbm9kZSBtYXAgICAqLworI2RlZmluZSBTTUFQU1oJCTQJLyogbnVtYmVyIG9mIHdvcmRzIHBlciBzdW1tYXJ5IG1hcCAgICAgICovCisjZGVmaW5lCUVYVFNQRVJTVU0JMzIJLyogbnVtYmVyIG9mIGV4dGVudHMgcGVyIHN1bW1hcnkgbWFwIGVudHJ5ICovCisjZGVmaW5lCUwyRVhUU1BFUlNVTQk1CS8qIGwyIG51bWJlciBvZiBleHRlbnRzIHBlciBzdW1tYXJ5IG1hcCAqLworI2RlZmluZQlQR1NQRVJJRVhUCTQJLyogbnVtYmVyIG9mIDRLIHBhZ2VzIHBlciBkaW5vZGUgZXh0ZW50ICovCisjZGVmaW5lCU1BWElBR1MJCSgoMTw8MjApLTEpCS8qIG1heGltdW0gbnVtYmVyIG9mIGlhZ3MgICAgICAgKi8KKyNkZWZpbmUJTUFYQUcJCTEyOAkvKiBtYXhpbXVtIG51bWJlciBvZiBhbGxvY2F0aW9uIGdyb3VwcyAgKi8KKworI2RlZmluZSBBTUFQU0laRSAgICAgIDUxMgkvKiBieXRlcyBpbiB0aGUgSUFHIGFsbG9jYXRpb24gbWFwcyAqLworI2RlZmluZSBTTUFQU0laRSAgICAgIDE2CS8qIGJ5dGVzIGluIHRoZSBJQUcgc3VtbWFyeSBtYXBzICovCisKKy8qIGNvbnZlcnQgaW5vZGUgbnVtYmVyIHRvIGlhZyBudW1iZXIgKi8KKyNkZWZpbmUJSU5PVE9JQUcoaW5vKQkoKGlubykgPj4gTDJJTk9TUEVSSUFHKQorCisvKiBjb252ZXJ0IGlhZyBudW1iZXIgdG8gbG9naWNhbCBibG9jayBudW1iZXIgb2YgdGhlIGlhZyBwYWdlICovCisjZGVmaW5lIElBR1RPTEJMSyhpYWdubyxsMm5icGVycGcpCSgoKGlhZ25vKSArIDEpIDw8IChsMm5icGVycGcpKQorCisvKiBnZXQgdGhlIHN0YXJ0aW5nIGJsb2NrIG51bWJlciBvZiB0aGUgNEsgcGFnZSBvZiBhbiBpbm9kZSBleHRlbnQKKyAqIHRoYXQgY29udGFpbnMgaW5vLgorICovCisjZGVmaW5lIElOT1BCTEsocHhkLGlubyxsMm5icGVycGcpICAgIAkoYWRkcmVzc1BYRCgocHhkKSkgKwkJXAorCSgoKChpbm8pICYgKElOT1NQRVJFWFQtMSkpID4+IEwySU5PU1BFUlBBR0UpIDw8IChsMm5icGVycGcpKSkKKworLyoKKyAqCWlub2RlIGFsbG9jYXRpb24gbWFwOgorICogCisgKiBpbm9kZSBhbGxvY2F0aW9uIG1hcCBjb25zaXN0cyBvZiAKKyAqIC4gdGhlIGlub2RlIG1hcCBjb250cm9sIHBhZ2UgYW5kCisgKiAuIGlub2RlIGFsbG9jYXRpb24gZ3JvdXAgcGFnZXMgKHBlciA0MDk2IGlub2RlcykKKyAqIHdoaWNoIGFyZSBhZGRyZXNzZWQgYnkgc3RhbmRhcmQgSkZTIHh0cmVlLgorICovCisvKgorICoJaW5vZGUgYWxsb2NhdGlvbiBncm91cCBwYWdlIChwZXIgNDA5NiBpbm9kZXMgb2YgYW4gQUcpCisgKi8KK3N0cnVjdCBpYWcgeworCV9fbGU2NCBhZ3N0YXJ0OwkJLyogODogc3RhcnRpbmcgYmxvY2sgb2YgYWcgICAgICAgICAgICAgICovCisJX19sZTMyIGlhZ251bTsJCS8qIDQ6IGlub2RlIGFsbG9jYXRpb24gZ3JvdXAgbnVtYmVyICAgICAqLworCV9fbGUzMiBpbm9mcmVlZndkOwkvKiA0OiBhZyBpbm9kZSBmcmVlIGxpc3QgZm9yd2FyZCAgICAgICAgKi8KKwlfX2xlMzIgaW5vZnJlZWJhY2s7CS8qIDQ6IGFnIGlub2RlIGZyZWUgbGlzdCBiYWNrICAgICAgICAgICAqLworCV9fbGUzMiBleHRmcmVlZndkOwkvKiA0OiBhZyBpbm9kZSBleHRlbnQgZnJlZSBsaXN0IGZvcndhcmQgKi8KKwlfX2xlMzIgZXh0ZnJlZWJhY2s7CS8qIDQ6IGFnIGlub2RlIGV4dGVudCBmcmVlIGxpc3QgYmFjayAgICAqLworCV9fbGUzMiBpYWdmcmVlOwkJLyogNDogaWFnIGZyZWUgbGlzdCAgICAgICAgICAgICAgICAgICAgICovCisKKwkvKiBzdW1tYXJ5IG1hcDogMSBiaXQgcGVyIGlub2RlIGV4dGVudCAqLworCV9fbGUzMiBpbm9zbWFwW1NNQVBTWl07CS8qIDE2OiBzdW0gbWFwIG9mIG1hcHdvcmRzIHcvIGZyZWUgaW5vZGVzOworCQkJCSAqICAgICAgbm90ZTogdGhpcyBpbmRpY2F0ZXMgZnJlZSBhbmQgYmFja2VkCisJCQkJICogICAgICBpbm9kZXMsIGlmIHRoZSBleHRlbnQgaXMgbm90IGJhY2tlZCB0aGUKKwkJCQkgKiAgICAgIHZhbHVlIHdpbGwgYmUgMS4gIGlmIHRoZSBleHRlbnQgaXMKKwkJCQkgKiAgICAgIGJhY2tlZCBidXQgYWxsIGlub2RlcyBhcmUgYmVpbmcgdXNlZCB0aGUKKwkJCQkgKiAgICAgIHZhbHVlIHdpbGwgYmUgMS4gIGlmIHRoZSBleHRlbnQgaXMKKwkJCQkgKiAgICAgIGJhY2tlZCBidXQgYXQgbGVhc3Qgb25lIG9mIHRoZSBpbm9kZXMgaXMKKwkJCQkgKiAgICAgIGZyZWUgdGhlIHZhbHVlIHdpbGwgYmUgMC4KKwkJCQkgKi8KKwlfX2xlMzIgZXh0c21hcFtTTUFQU1pdOwkvKiAxNjogc3VtIG1hcCBvZiBtYXB3b3JkcyB3LyBmcmVlIGV4dGVudHMgKi8KKwlfX2xlMzIgbmZyZWVpbm9zOwkJLyogNDogbnVtYmVyIG9mIGZyZWUgaW5vZGVzICAgICAgICAgICAgICovCisJX19sZTMyIG5mcmVlZXh0czsJCS8qIDQ6IG51bWJlciBvZiBmcmVlIGV4dGVudHMgICAgICAgICAgICAqLworCS8qICg3MikgKi8KKwl1OCBwYWRbMTk3Nl07CQkvKiAxOTc2OiBwYWQgdG8gMjA0OCBieXRlcyAqLworCS8qIGFsbG9jYXRpb24gYml0IG1hcDogMSBiaXQgcGVyIGlub2RlICgwIC0gZnJlZSwgMSAtIGFsbG9jYXRlZCkgKi8KKwlfX2xlMzIgd21hcFtFWFRTUEVSSUFHXTsJLyogNTEyOiB3b3JraW5nIGFsbG9jYXRpb24gbWFwICAqLworCV9fbGUzMiBwbWFwW0VYVFNQRVJJQUddOwkvKiA1MTI6IHBlcnNpc3RlbnQgYWxsb2NhdGlvbiBtYXAgKi8KKwlweGRfdCBpbm9leHRbRVhUU1BFUklBR107CS8qIDEwMjQ6IGlub2RlIGV4dGVudCBhZGRyZXNzZXMgKi8KK307CQkJCS8qICg0MDk2KSAqLworCisvKgorICoJcGVyIEFHIGNvbnRyb2wgaW5mb3JtYXRpb24gKGluIGlub2RlIG1hcCBjb250cm9sIHBhZ2UpCisgKi8KK3N0cnVjdCBpYWdjdGxfZGlzayB7CisJX19sZTMyIGlub2ZyZWU7CQkvKiA0OiBmcmVlIGlub2RlIGxpc3QgYW5jaG9yICAgICAgICAgICAgKi8KKwlfX2xlMzIgZXh0ZnJlZTsJCS8qIDQ6IGZyZWUgZXh0ZW50IGxpc3QgYW5jaG9yICAgICAgICAgICAqLworCV9fbGUzMiBudW1pbm9zOwkJLyogNDogbnVtYmVyIG9mIGJhY2tlZCBpbm9kZXMgICAgICAgICAgICovCisJX19sZTMyIG51bWZyZWU7CQkvKiA0OiBudW1iZXIgb2YgZnJlZSBpbm9kZXMgICAgICAgICAgICAgKi8KK307CQkJCS8qICgxNikgKi8KKworc3RydWN0IGlhZ2N0bCB7CisJaW50IGlub2ZyZWU7CQkvKiBmcmVlIGlub2RlIGxpc3QgYW5jaG9yICAgICAgICAgICAgKi8KKwlpbnQgZXh0ZnJlZTsJCS8qIGZyZWUgZXh0ZW50IGxpc3QgYW5jaG9yICAgICAgICAgICAqLworCWludCBudW1pbm9zOwkJLyogbnVtYmVyIG9mIGJhY2tlZCBpbm9kZXMgICAgICAgICAgICovCisJaW50IG51bWZyZWU7CQkvKiBudW1iZXIgb2YgZnJlZSBpbm9kZXMgICAgICAgICAgICAgKi8KK307CisKKy8qCisgKglwZXIgZmlsZXNldC9hZ2dyZWdhdGUgaW5vZGUgbWFwIGNvbnRyb2wgcGFnZQorICovCitzdHJ1Y3QgZGlub21hcF9kaXNrIHsKKwlfX2xlMzIgaW5fZnJlZWlhZzsJLyogNDogZnJlZSBpYWcgbGlzdCBhbmNob3IgICAgICovCisJX19sZTMyIGluX25leHRpYWc7CS8qIDQ6IG5leHQgZnJlZSBpYWcgbnVtYmVyICAgICAqLworCV9fbGUzMiBpbl9udW1pbm9zOwkvKiA0OiBudW0gb2YgYmFja2VkIGlub2RlcyAqLworCV9fbGUzMiBpbl9udW1mcmVlOwkvKiA0OiBudW0gb2YgZnJlZSBiYWNrZWQgaW5vZGVzICovCisJX19sZTMyIGluX25icGVyaWV4dDsJLyogNDogbnVtIG9mIGJsb2NrcyBwZXIgaW5vZGUgZXh0ZW50ICovCisJX19sZTMyIGluX2wybmJwZXJpZXh0OwkvKiA0OiBsMiBvZiBpbl9uYnBlcmlleHQgKi8KKwlfX2xlMzIgaW5fZGlza2Jsb2NrOwkvKiA0OiBmb3Igc3RhbmRhbG9uZSB0ZXN0IGRyaXZlciAgKi8KKwlfX2xlMzIgaW5fbWF4YWc7CS8qIDQ6IGZvciBzdGFuZGFsb25lIHRlc3QgZHJpdmVyICAqLworCXU4IHBhZFsyMDE2XTsJCS8qIDIwMTY6IHBhZCB0byAyMDQ4ICovCisJc3RydWN0IGlhZ2N0bF9kaXNrIGluX2FnY3RsW01BWEFHXTsgLyogMjA0ODogQUcgY29udHJvbCBpbmZvcm1hdGlvbiAqLworfTsJCQkJLyogKDQwOTYpICovCisKK3N0cnVjdCBkaW5vbWFwIHsKKwlpbnQgaW5fZnJlZWlhZzsJCS8qIGZyZWUgaWFnIGxpc3QgYW5jaG9yICAgICAqLworCWludCBpbl9uZXh0aWFnOwkJLyogbmV4dCBmcmVlIGlhZyBudW1iZXIgICAgICovCisJaW50IGluX251bWlub3M7CQkvKiBudW0gb2YgYmFja2VkIGlub2RlcyAqLworCWludCBpbl9udW1mcmVlOwkJLyogbnVtIG9mIGZyZWUgYmFja2VkIGlub2RlcyAqLworCWludCBpbl9uYnBlcmlleHQ7CS8qIG51bSBvZiBibG9ja3MgcGVyIGlub2RlIGV4dGVudCAqLworCWludCBpbl9sMm5icGVyaWV4dDsJLyogbDIgb2YgaW5fbmJwZXJpZXh0ICovCisJaW50IGluX2Rpc2tibG9jazsJLyogZm9yIHN0YW5kYWxvbmUgdGVzdCBkcml2ZXIgICovCisJaW50IGluX21heGFnOwkJLyogZm9yIHN0YW5kYWxvbmUgdGVzdCBkcml2ZXIgICovCisJc3RydWN0IGlhZ2N0bCBpbl9hZ2N0bFtNQVhBR107CS8qIEFHIGNvbnRyb2wgaW5mb3JtYXRpb24gKi8KK307CisKKy8qCisgKglJbi1jb3JlIGlub2RlIG1hcCBjb250cm9sIHBhZ2UKKyAqLworc3RydWN0IGlub21hcCB7CisJc3RydWN0IGRpbm9tYXAgaW1faW1hcDsJCS8qIDQwOTY6IGlub2RlIGFsbG9jYXRpb24gY29udHJvbCAqLworCXN0cnVjdCBpbm9kZSAqaW1faXBpbWFwOwkvKiA0OiBwdHIgdG8gaW5vZGUgZm9yIGltYXAgICAqLworCXN0cnVjdCBzZW1hcGhvcmUgaW1fZnJlZWxvY2s7CS8qIDQ6IGlhZyBmcmVlIGxpc3QgbG9jayAgICAgICovCisJc3RydWN0IHNlbWFwaG9yZSBpbV9hZ2xvY2tbTUFYQUddOwkvKiA1MTI6IHBlciBBRyBsb2NrcyAgICAgICAgICAqLworCXUzMiAqaW1fREJHZGltYXA7CisJYXRvbWljX3QgaW1fbnVtaW5vczsJLyogbnVtIG9mIGJhY2tlZCBpbm9kZXMgKi8KKwlhdG9taWNfdCBpbV9udW1mcmVlOwkvKiBudW0gb2YgZnJlZSBiYWNrZWQgaW5vZGVzICovCit9OworCisjZGVmaW5lCWltX2ZyZWVpYWcJaW1faW1hcC5pbl9mcmVlaWFnCisjZGVmaW5lCWltX25leHRpYWcJaW1faW1hcC5pbl9uZXh0aWFnCisjZGVmaW5lCWltX2FnY3RsCWltX2ltYXAuaW5fYWdjdGwKKyNkZWZpbmUJaW1fbmJwZXJpZXh0CWltX2ltYXAuaW5fbmJwZXJpZXh0CisjZGVmaW5lCWltX2wybmJwZXJpZXh0CWltX2ltYXAuaW5fbDJuYnBlcmlleHQKKworLyogZm9yIHN0YW5kYWxvbmUgdGVzdGRyaXZlcgorICovCisjZGVmaW5lCWltX2Rpc2tibG9jawlpbV9pbWFwLmluX2Rpc2tibG9jaworI2RlZmluZQlpbV9tYXhhZwlpbV9pbWFwLmluX21heGFnCisKK2V4dGVybiBpbnQgZGlGcmVlKHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiBpbnQgZGlBbGxvYyhzdHJ1Y3QgaW5vZGUgKiwgYm9vbGVhbl90LCBzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gaW50IGRpU3luYyhzdHJ1Y3QgaW5vZGUgKik7CisvKiBleHRlcm5hbCByZWZlcmVuY2VzICovCitleHRlcm4gaW50IGRpVXBkYXRlUE1hcChzdHJ1Y3QgaW5vZGUgKmlwaW1hcCwgdW5zaWduZWQgbG9uZyBpbnVtLAorCQkJYm9vbGVhbl90IGlzX2ZyZWUsIHN0cnVjdCB0YmxvY2sgKiB0YmxrKTsKK2V4dGVybiBpbnQgZGlFeHRlbmRGUyhzdHJ1Y3QgaW5vZGUgKmlwaW1hcCwgc3RydWN0IGlub2RlICppcGJtYXApOworZXh0ZXJuIGludCBkaU1vdW50KHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiBpbnQgZGlVbm1vdW50KHN0cnVjdCBpbm9kZSAqLCBpbnQpOworZXh0ZXJuIGludCBkaVJlYWQoc3RydWN0IGlub2RlICopOworZXh0ZXJuIHN0cnVjdCBpbm9kZSAqZGlSZWFkU3BlY2lhbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW5vX3QsIGludCk7CitleHRlcm4gdm9pZCBkaVdyaXRlU3BlY2lhbChzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKK2V4dGVybiB2b2lkIGRpRnJlZVNwZWNpYWwoc3RydWN0IGlub2RlICopOworZXh0ZXJuIGludCBkaVdyaXRlKHRpZF90IHRpZCwgc3RydWN0IGlub2RlICopOworI2VuZGlmCQkJCS8qIF9IX0pGU19JTUFQICovCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX2luY29yZS5oIGIvZnMvamZzL2pmc19pbmNvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmQ3N2MxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZzL2pmc19pbmNvcmUuaApAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqICAgQ29weXJpZ2h0IChDKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuLCAyMDAwLTIwMDQKKyAqICAgUG9ydGlvbnMgQ29weXJpZ2h0IChDKSBDaHJpc3RvcGggSGVsbHdpZywgMjAwMS0yMDAyCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8gCisjaWZuZGVmIF9IX0pGU19JTkNPUkUKKyNkZWZpbmUgX0hfSkZTX0lOQ09SRQorCisjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSAiamZzX3R5cGVzLmgiCisjaW5jbHVkZSAiamZzX3h0cmVlLmgiCisjaW5jbHVkZSAiamZzX2R0cmVlLmgiCisKKy8qCisgKiBKRlMgbWFnaWMgbnVtYmVyCisgKi8KKyNkZWZpbmUgSkZTX1NVUEVSX01BR0lDIDB4MzE1MzQ2NGEgLyogIkpGUzEiICovCisKKy8qCisgKiBKRlMtcHJpdmF0ZSBpbm9kZSBpbmZvcm1hdGlvbgorICovCitzdHJ1Y3QgamZzX2lub2RlX2luZm8geworCWludAlmaWxlc2V0OwkvKiBmaWxlc2V0IG51bWJlciAoYWx3YXlzIDE2KSovCisJdWludAltb2RlMjsJCS8qIGpmcy1zcGVjaWZpYyBtb2RlCQkqLworCXB4ZF90ICAgaXhweGQ7CQkvKiBpbm9kZSBleHRlbnQgZGVzY3JpcHRvcgkqLworCWR4ZF90CWFjbDsJCS8qIGR4ZCBkZXNjcmliaW5nIGFjbAkqLworCWR4ZF90CWVhOwkJLyogZHhkIGRlc2NyaWJpbmcgZWEJKi8KKwl0aW1lX3QJb3RpbWU7CQkvKiB0aW1lIGNyZWF0ZWQJKi8KKwl1aW50CW5leHRfaW5kZXg7CS8qIG5leHQgYXZhaWxhYmxlIGRpcmVjdG9yeSBlbnRyeSBpbmRleCAqLworCWludAlhY2x0eXBlOwkvKiBUeXBlIG9mIEFDTAkqLworCXNob3J0CWJ0b3JkZXI7CS8qIGFjY2VzcyBvcmRlcgkqLworCXNob3J0CWJ0aW5kZXg7CS8qIGJ0cGFnZSBlbnRyeSBpbmRleCovCisJc3RydWN0IGlub2RlICppcGltYXA7CS8qIGlub2RlIG1hcAkJCSovCisJbG9uZwljZmxhZzsJCS8qIGNvbW1pdCBmbGFncwkJKi8KKwl1MTYJYnhmbGFnOwkJLyogeGZsYWcgb2YgcHNldWRvIGJ1ZmZlcj8JKi8KKwl1bmNoYXIJYWdubzsJCS8qIGFnIG51bWJlcgkJCSovCisJc2lnbmVkIGNoYXIgYWN0aXZlX2FnOwkvKiBhZyBjdXJyZW50bHkgYWxsb2NhdGluZyBmcm9tCSovCisJbGlkX3QJYmxpZDsJCS8qIGxpZCBvZiBwc2V1ZG8gYnVmZmVyPwkqLworCWxpZF90CWF0bGhlYWQ7CS8qIGFub255bW91cyB0bG9jayBsaXN0IGhlYWQJKi8KKwlsaWRfdAlhdGx0YWlsOwkvKiBhbm9ueW1vdXMgdGxvY2sgbGlzdCB0YWlsCSovCisJc3BpbmxvY2tfdCBhZ19sb2NrOwkvKiBwcm90ZWN0cyBhY3RpdmVfYWcJCSovCisJc3RydWN0IGxpc3RfaGVhZCBhbm9uX2lub2RlX2xpc3Q7IC8qIGlub2RlcyBoYXZpbmcgYW5vbnltb3VzIHR4bnMgKi8KKwkvKgorCSAqIHJkd3Jsb2NrIHNlcmlhbGl6ZXMgeHRyZWUgYmV0d2VlbiByZWFkcyAmIHdyaXRlcyBhbmQgc3luY2hyb25pemVzCisJICogY2hhbmdlcyB0byBzcGVjaWFsIGlub2Rlcy4gIEl0J3MgdXNlIHdvdWxkIGJlIHJlZHVuZGFudCBvbgorCSAqIGRpcmVjdG9yaWVzIHNpbmNlIHRoZSBpX3NlbSB0YWtlbiBpbiB0aGUgVkZTIGlzIHN1ZmZpY2llbnQuCisJICovCisJc3RydWN0IHJ3X3NlbWFwaG9yZSByZHdybG9jazsKKwkvKgorCSAqIGNvbW1pdF9zZW0gc2VyaWFsaXplcyB0cmFuc2FjdGlvbiBwcm9jZXNzaW5nIG9uIGFuIGlub2RlLgorCSAqIEl0IG11c3QgYmUgdGFrZW4gYWZ0ZXIgYmVnaW5uaW5nIGEgdHJhbnNhY3Rpb24gKHR4QmVnaW4pLCBzaW5jZQorCSAqIGRpcnR5IGlub2RlcyBtYXkgYmUgY29tbWl0dGVkIHdoaWxlIGEgbmV3IHRyYW5zYWN0aW9uIG9uIHRoZQorCSAqIGlub2RlIGlzIGJsb2NrZWQgaW4gdHhCZWdpbiBvciBUeEJlZ2luQW5vbgorCSAqLworCXN0cnVjdCBzZW1hcGhvcmUgY29tbWl0X3NlbTsKKwkvKiB4YXR0cl9zZW0gYWxsb3dzIHVzIHRvIGFjY2VzcyB0aGUgeGF0dHJzIHdpdGhvdXQgdGFraW5nIGlfc2VtICovCisJc3RydWN0IHJ3X3NlbWFwaG9yZSB4YXR0cl9zZW07CisJbGlkX3QJeHRsaWQ7CQkvKiBsaWQgb2YgeHRyZWUgbG9jayBvbiBkaXJlY3RvcnkgKi8KKyNpZmRlZiBDT05GSUdfSkZTX1BPU0lYX0FDTAorCXN0cnVjdCBwb3NpeF9hY2wgKmlfYWNsOworCXN0cnVjdCBwb3NpeF9hY2wgKmlfZGVmYXVsdF9hY2w7CisjZW5kaWYKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl4dHBhZ2VfdCBfeHRyb290OwkvKiAyODg6IHh0cmVlIHJvb3QgKi8KKwkJCXN0cnVjdCBpbm9tYXAgKl9pbWFwOwkvKiA0OiBpbm9kZSBtYXAgaGVhZGVyCSovCisJCX0gZmlsZTsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBkaXJfdGFibGVfc2xvdCBfdGFibGVbMTJdOyAvKiA5NjogZGlyIGluZGV4ICovCisJCQlkdHJvb3RfdCBfZHRyb290OwkvKiAyODg6IGR0cmVlIHJvb3QgKi8KKwkJfSBkaXI7CisJCXN0cnVjdCB7CisJCQl1bmNoYXIgX3VudXNlZFsxNl07CS8qIDE2OiAqLworCQkJZHhkX3QgX2R4ZDsJCS8qIDE2OiAqLworCQkJdW5jaGFyIF9pbmxpbmVbMTI4XTsJLyogMTI4OiBpbmxpbmUgc3ltbGluayAqLworCQkJLyogX2lubGluZV9lYSBtYXkgb3ZlcmxheSB0aGUgbGFzdCBwYXJ0IG9mCisJCQkgKiBmaWxlLl94dHJvb3QgaWYgbWF4ZW50cnkgPSBYVFJPT1RJTklUU0xPVAorCQkJICovCisJCQl1bmNoYXIgX2lubGluZV9lYVsxMjhdOwkvKiAxMjg6IGlubGluZSBleHRlbmRlZCBhdHRyICovCisJCX0gbGluazsKKwl9IHU7CisJdTMyIGRldjsJLyogd2lsbCBkaWUgd2hlbiB3ZSBnZXQgd2lkZSBkZXZfdCAqLworCXN0cnVjdCBpbm9kZQl2ZnNfaW5vZGU7Cit9OworI2RlZmluZSBpX3h0cm9vdCB1LmZpbGUuX3h0cm9vdAorI2RlZmluZSBpX2ltYXAgdS5maWxlLl9pbWFwCisjZGVmaW5lIGlfZGlydGFibGUgdS5kaXIuX3RhYmxlCisjZGVmaW5lIGlfZHRyb290IHUuZGlyLl9kdHJvb3QKKyNkZWZpbmUgaV9pbmxpbmUgdS5saW5rLl9pbmxpbmUKKyNkZWZpbmUgaV9pbmxpbmVfZWEgdS5saW5rLl9pbmxpbmVfZWEKKworI2RlZmluZSBKRlNfQUNMX05PVF9DQUNIRUQgKCh2b2lkICopLTEpCisKKyNkZWZpbmUgSVJFQURfTE9DSyhpcCkJCWRvd25fcmVhZCgmSkZTX0lQKGlwKS0+cmR3cmxvY2spCisjZGVmaW5lIElSRUFEX1VOTE9DSyhpcCkJdXBfcmVhZCgmSkZTX0lQKGlwKS0+cmR3cmxvY2spCisjZGVmaW5lIElXUklURV9MT0NLKGlwKQkJZG93bl93cml0ZSgmSkZTX0lQKGlwKS0+cmR3cmxvY2spCisjZGVmaW5lIElXUklURV9VTkxPQ0soaXApCXVwX3dyaXRlKCZKRlNfSVAoaXApLT5yZHdybG9jaykKKworLyoKKyAqIGNmbGFnCisgKi8KK2VudW0gY2ZsYWdzIHsKKwlDT01NSVRfTm9saW5rLAkJLyogaW5vZGUgY29tbWl0dGVkIHdpdGggemVybyBsaW5rIGNvdW50ICovCisJQ09NTUlUX0lubGluZWVhLAkvKiBjb21taXQgaW5vZGUgaW5saW5lIEVBICovCisJQ09NTUlUX0ZyZWV3bWFwLAkvKiBmcmVlIFdNQVAgYXQgaUNsb3NlKCkgKi8KKwlDT01NSVRfRGlydHksCQkvKiBJbm9kZSBpcyByZWFsbHkgZGlydHkgKi8KKwlDT01NSVRfRGlydGFibGUsCS8qIGNvbW1pdCBjaGFuZ2VzIHRvIGRpX2RpcnRhYmxlICovCisJQ09NTUlUX1N0YWxlLAkJLyogZGF0YSBleHRlbnQgaXMgbm8gbG9uZ2VyIHZhbGlkICovCisJQ09NTUlUX1N5bmNsaXN0LAkvKiBtZXRhZGF0YSBwYWdlcyBvbiBncm91cCBjb21taXQgc3luY2xpc3QgKi8KK307CisKKyNkZWZpbmUgc2V0X2NmbGFnKGZsYWcsIGlwKQlzZXRfYml0KGZsYWcsICYoSkZTX0lQKGlwKS0+Y2ZsYWcpKQorI2RlZmluZSBjbGVhcl9jZmxhZyhmbGFnLCBpcCkJY2xlYXJfYml0KGZsYWcsICYoSkZTX0lQKGlwKS0+Y2ZsYWcpKQorI2RlZmluZSB0ZXN0X2NmbGFnKGZsYWcsIGlwKQl0ZXN0X2JpdChmbGFnLCAmKEpGU19JUChpcCktPmNmbGFnKSkKKyNkZWZpbmUgdGVzdF9hbmRfY2xlYXJfY2ZsYWcoZmxhZywgaXApIFwKKwl0ZXN0X2FuZF9jbGVhcl9iaXQoZmxhZywgJihKRlNfSVAoaXApLT5jZmxhZykpCisvKgorICogSkZTLXByaXZhdGUgc3VwZXJibG9jayBpbmZvcm1hdGlvbi4KKyAqLworc3RydWN0IGpmc19zYl9pbmZvIHsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwkJLyogUG9pbnQgYmFjayB0byB2ZnMgc3VwZXIgYmxvY2sgKi8KKwl1bnNpZ25lZCBsb25nCW1udGZsYWc7CS8qIGFnZ3JlZ2F0ZSBhdHRyaWJ1dGVzCSovCisJc3RydWN0IGlub2RlCSppcGJtYXA7CS8qIGJsb2NrIG1hcCBpbm9kZQkJKi8KKwlzdHJ1Y3QgaW5vZGUJKmlwYWltYXA7CS8qIGFnZ3JlZ2F0ZSBpbm9kZSBtYXAgaW5vZGUJKi8KKwlzdHJ1Y3QgaW5vZGUJKmlwYWltYXAyOwkvKiBzZWNvbmRhcnkgYWltYXAgaW5vZGUJKi8KKwlzdHJ1Y3QgaW5vZGUJKmlwaW1hcDsJLyogYWdncmVnYXRlIGlub2RlIG1hcCBpbm9kZQkqLworCXN0cnVjdCBqZnNfbG9nCSpsb2c7CQkvKiBsb2cJCQkqLworCXN0cnVjdCBsaXN0X2hlYWQgbG9nX2xpc3Q7CS8qIHZvbHVtZXMgYXNzb2NpYXRlZCB3aXRoIGEgam91cm5hbCAqLworCXNob3J0CQlic2l6ZTsJCS8qIGxvZ2ljYWwgYmxvY2sgc2l6ZQkqLworCXNob3J0CQlsMmJzaXplOwkvKiBsb2cyIGxvZ2ljYWwgYmxvY2sgc2l6ZQkqLworCXNob3J0CQluYnBlcnBhZ2U7CS8qIGJsb2NrcyBwZXIgcGFnZQkJKi8KKwlzaG9ydAkJbDJuYnBlcnBhZ2U7CS8qIGxvZzIgYmxvY2tzIHBlciBwYWdlCSovCisJc2hvcnQJCWwybmlwZXJibGs7CS8qIGxvZzIgaW5vZGVzIHBlciBwYWdlCSovCisJZGV2X3QJCWxvZ2RldjsJCS8qIGV4dGVybmFsIGxvZyBkZXZpY2UJKi8KKwl1aW50CQlhZ2dyZWdhdGU7CS8qIHZvbHVtZSBpZGVudGlmaWVyIGluIGxvZyByZWNvcmQgKi8KKwlweGRfdAkJbG9ncHhkOwkJLyogcHhkIGRlc2NyaWJpbmcgbG9nCSovCisJcHhkX3QJCWZzY2tweGQ7CS8qIHB4ZCBkZXNjcmliaW5nIGZzY2sgd2tzcGMgKi8KKwlweGRfdAkJYWl0MjsJCS8qIHB4ZCBkZXNjcmliaW5nIEFJVCBjb3B5CSovCisJY2hhcgkJdXVpZFsxNl07CS8qIDEyOC1iaXQgdXVpZCBmb3Igdm9sdW1lCSovCisJY2hhcgkJbG9ndXVpZFsxNl07CS8qIDEyOC1iaXQgdXVpZCBmb3IgbG9nCSovCisJLyoKKwkgKiBjb21taXRfc3RhdGUgaXMgdXNlZCBmb3Igc3luY2hyb25pemF0aW9uIG9mIHRoZSBqZnNfY29tbWl0CisJICogdGhyZWFkcy4gIEl0IGlzIHByb3RlY3RlZCBieSBMQVpZX0xPQ0soKS4KKwkgKi8KKwlpbnQJCWNvbW1pdF9zdGF0ZTsJLyogY29tbWl0IHN0YXRlICovCisJLyogRm9ybWVybHkgaW4gaXBpbWFwICovCisJdWludAkJZ2VuZ2VuOwkJLyogaW5vZGUgZ2VuZXJhdGlvbiBnZW5lcmF0b3IqLworCXVpbnQJCWlub3N0YW1wOwkvKiBzaG93cyBpbm9kZSBiZWxvbmdzIHRvIGZpbGVzZXQqLworCisgICAgICAgIC8qIEZvcm1lcmx5IGluIGlwYm1hcCAqLworCXN0cnVjdCBibWFwCSpibWFwOwkJLyogaW5jb3JlIGJtYXAgZGVzY3JpcHRvcgkqLworCXN0cnVjdCBubHNfdGFibGUgKm5sc190YWI7CS8qIGN1cnJlbnQgY29kZXBhZ2UJCSovCisJdWludAkJc3RhdGU7CQkvKiBtb3VudC9yZWNvdmVyeSBzdGF0ZQkqLworCXVuc2lnbmVkIGxvbmcJZmxhZzsJCS8qIG1vdW50IHRpbWUgZmxhZ3MgKi8KKwl1aW50CQlwX3N0YXRlOwkvKiBzdGF0ZSBwcmlvciB0byBnb2luZyBubyBpbnRlZ3JpdHkgKi8KK307CisKKy8qIGpmc19zYl9pbmZvIGNvbW1pdF9zdGF0ZSAqLworI2RlZmluZSBJTl9MQVpZQ09NTUlUIDEKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgamZzX2lub2RlX2luZm8gKkpGU19JUChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiBsaXN0X2VudHJ5KGlub2RlLCBzdHJ1Y3QgamZzX2lub2RlX2luZm8sIHZmc19pbm9kZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGpmc19kaXJ0YWJsZV9pbmxpbmUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gKEpGU19JUChpbm9kZSktPm5leHRfaW5kZXggPD0gKE1BWF9JTkxJTkVfRElSVEFCTEVfRU5UUlkgKyAxKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGpmc19zYl9pbmZvICpKRlNfU0JJKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJcmV0dXJuIHNiLT5zX2ZzX2luZm87Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzUmVhZE9ubHkoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpZiAoSkZTX1NCSShpbm9kZS0+aV9zYiktPmxvZykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisjZW5kaWYgLyogX0hfSkZTX0lOQ09SRSAqLwpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19pbm9kZS5jIGIvZnMvamZzL2pmc19pbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZjI0NTkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZnMvamZzX2lub2RlLmMKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwMC0yMDA0CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlICJqZnNfaW5jb3JlLmgiCisjaW5jbHVkZSAiamZzX2ZpbHN5cy5oIgorI2luY2x1ZGUgImpmc19pbWFwLmgiCisjaW5jbHVkZSAiamZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgImpmc19kZWJ1Zy5oIgorCisvKgorICogTkFNRToJaWFsbG9jKCkKKyAqCisgKiBGVU5DVElPTjoJQWxsb2NhdGUgYSBuZXcgaW5vZGUKKyAqCisgKi8KK3N0cnVjdCBpbm9kZSAqaWFsbG9jKHN0cnVjdCBpbm9kZSAqcGFyZW50LCB1bW9kZV90IG1vZGUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IHBhcmVudC0+aV9zYjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBqZnNfaW5vZGVfaW5mbyAqamZzX2lub2RlOworCWludCByYzsKKworCWlub2RlID0gbmV3X2lub2RlKHNiKTsKKwlpZiAoIWlub2RlKSB7CisJCWpmc193YXJuKCJpYWxsb2M6IG5ld19pbm9kZSByZXR1cm5lZCBOVUxMISIpOworCQlyZXR1cm4gaW5vZGU7CisJfQorCisJamZzX2lub2RlID0gSkZTX0lQKGlub2RlKTsKKworCXJjID0gZGlBbGxvYyhwYXJlbnQsIFNfSVNESVIobW9kZSksIGlub2RlKTsKKwlpZiAocmMpIHsKKwkJamZzX3dhcm4oImlhbGxvYzogZGlBbGxvYyByZXR1cm5lZCAlZCEiLCByYyk7CisJCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwkJaXB1dChpbm9kZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlub2RlLT5pX3VpZCA9IGN1cnJlbnQtPmZzdWlkOworCWlmIChwYXJlbnQtPmlfbW9kZSAmIFNfSVNHSUQpIHsKKwkJaW5vZGUtPmlfZ2lkID0gcGFyZW50LT5pX2dpZDsKKwkJaWYgKFNfSVNESVIobW9kZSkpCisJCQltb2RlIHw9IFNfSVNHSUQ7CisJfSBlbHNlCisJCWlub2RlLT5pX2dpZCA9IGN1cnJlbnQtPmZzZ2lkOworCisJLyoKKwkgKiBBbGxvY2F0ZSBpbm9kZSB0byBxdW90YS4KKwkgKi8KKwlpZiAoRFFVT1RfQUxMT0NfSU5PREUoaW5vZGUpKSB7CisJCURRVU9UX0RST1AoaW5vZGUpOworCQlpbm9kZS0+aV9mbGFncyB8PSBTX05PUVVPVEE7CisJCWlub2RlLT5pX25saW5rID0gMDsKKwkJaXB1dChpbm9kZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlub2RlLT5pX21vZGUgPSBtb2RlOworCWlmIChTX0lTRElSKG1vZGUpKQorCQlqZnNfaW5vZGUtPm1vZGUyID0gSURJUkVDVE9SWSB8IG1vZGU7CisJZWxzZQorCQlqZnNfaW5vZGUtPm1vZGUyID0gSU5MSU5FRUEgfCBJU1BBUlNFIHwgbW9kZTsKKwlpbm9kZS0+aV9ibGtzaXplID0gc2ItPnNfYmxvY2tzaXplOworCWlub2RlLT5pX2Jsb2NrcyA9IDA7CisJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCWpmc19pbm9kZS0+b3RpbWUgPSBpbm9kZS0+aV9jdGltZS50dl9zZWM7CisJaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IEpGU19TQkkoc2IpLT5nZW5nZW4rKzsKKworCWpmc19pbm9kZS0+Y2ZsYWcgPSAwOworCisJLyogWmVybyByZW1haW5pbmcgZmllbGRzICovCisJbWVtc2V0KCZqZnNfaW5vZGUtPmFjbCwgMCwgc2l6ZW9mKGR4ZF90KSk7CisJbWVtc2V0KCZqZnNfaW5vZGUtPmVhLCAwLCBzaXplb2YoZHhkX3QpKTsKKwlqZnNfaW5vZGUtPm5leHRfaW5kZXggPSAwOworCWpmc19pbm9kZS0+YWNsdHlwZSA9IDA7CisJamZzX2lub2RlLT5idG9yZGVyID0gMDsKKwlqZnNfaW5vZGUtPmJ0aW5kZXggPSAwOworCWpmc19pbm9kZS0+YnhmbGFnID0gMDsKKwlqZnNfaW5vZGUtPmJsaWQgPSAwOworCWpmc19pbm9kZS0+YXRsaGVhZCA9IDA7CisJamZzX2lub2RlLT5hdGx0YWlsID0gMDsKKwlqZnNfaW5vZGUtPnh0bGlkID0gMDsKKworCWpmc19pbmZvKCJpYWxsb2MgcmV0dXJucyBpbm9kZSA9IDB4JXBcbiIsIGlub2RlKTsKKworCXJldHVybiBpbm9kZTsKK30KZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfaW5vZGUuaCBiL2ZzL2pmcy9qZnNfaW5vZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGY5MWZiCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZzL2pmc19pbm9kZS5oCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiAgIENvcHlyaWdodCAoYykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwMC0yMDAxCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpZm5kZWYJX0hfSkZTX0lOT0RFCisjZGVmaW5lIF9IX0pGU19JTk9ERQorCitleHRlcm4gc3RydWN0IGlub2RlICppYWxsb2Moc3RydWN0IGlub2RlICosIHVtb2RlX3QpOworCisjZW5kaWYJCQkJLyogX0hfSkZTX0lOT0RFICovCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX2xvY2suaCBiL2ZzL2pmcy9qZnNfbG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYWQxZDAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZnMvamZzX2xvY2suaApAQCAtMCwwICsxLDUxIEBACisvKgorICogICBDb3B5cmlnaHQgKGMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDAtMjAwMQorICogICBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIENocmlzdG9waCBIZWxsd2lnLCAyMDAxLTIwMDIKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2lmbmRlZiBfSF9KRlNfTE9DSworI2RlZmluZSBfSF9KRlNfTE9DSworCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisvKgorICoJamZzX2xvY2suaAorICovCisKKy8qCisgKiBDb25kaXRpb25hbCBzbGVlcCB3aGVyZSBjb25kaXRpb24gaXMgcHJvdGVjdGVkIGJ5IHNwaW5sb2NrCisgKgorICogbG9ja19jbWQgYW5kIHVubG9ja19jbWQgdGFrZSBhbmQgcmVsZWFzZSB0aGUgc3BpbmxvY2sKKyAqLworI2RlZmluZSBfX1NMRUVQX0NPTkQod3EsIGNvbmQsIGxvY2tfY21kLCB1bmxvY2tfY21kKQlcCitkbyB7CQkJCQkJCVwKKwlERUNMQVJFX1dBSVRRVUVVRShfX3dhaXQsIGN1cnJlbnQpOwkJXAorCQkJCQkJCVwKKwlhZGRfd2FpdF9xdWV1ZSgmd3EsICZfX3dhaXQpOwkJCVwKKwlmb3IgKDs7KSB7CQkJCQlcCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTtcCisJCWlmIChjb25kKQkJCQlcCisJCQlicmVhazsJCQkJXAorCQl1bmxvY2tfY21kOwkJCQlcCisJCXNjaGVkdWxlKCk7CQkJCVwKKwkJbG9ja19jbWQ7CQkJCVwKKwl9CQkJCQkJXAorCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOwkJCVwKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmd3EsICZfX3dhaXQpOwkJXAorfSB3aGlsZSAoMCkKKworI2VuZGlmCQkJCS8qIF9IX0pGU19MT0NLICovCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX2xvZ21nci5jIGIvZnMvamZzL2pmc19sb2dtZ3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmE2ODY5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvamZzL2pmc19sb2dtZ3IuYwpAQCAtMCwwICsxLDI1MjQgQEAKKy8qCisgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwMC0yMDA0CisgKiAgIFBvcnRpb25zIENvcHlyaWdodCAoQykgQ2hyaXN0b3BoIEhlbGx3aWcsIDIwMDEtMjAwMgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7ICB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIAorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7ICB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgKiAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07ICBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKglqZnNfbG9nbWdyLmM6IGxvZyBtYW5hZ2VyCisgKgorICogZm9yIHJlbGF0ZWQgaW5mb3JtYXRpb24sIHNlZSB0cmFuc2FjdGlvbiBtYW5hZ2VyIChqZnNfdHhubWdyLmMpLCBhbmQKKyAqIHJlY292ZXJ5IG1hbmFnZXIgKGpmc19sb2dyZWRvLmMpLgorICoKKyAqIG5vdGU6IGZvciBkZXRhaWwsIFJURlMuCisgKgorICoJbG9nIGJ1ZmZlciBtYW5hZ2VyOgorICogc3BlY2lhbCBwdXJwb3NlIGJ1ZmZlciBtYW5hZ2VyIHN1cHBvcnRpbmcgbG9nIGkvbyByZXF1aXJlbWVudHMuCisgKiBwZXIgbG9nIHNlcmlhbCBwYWdlb3V0IG9mIGxvZ3BhZ2UKKyAqIHF1ZXVpbmcgaS9vIHJlcXVlc3RzIGFuZCByZWRyaXZlIGkvbyBhdCBpb2RvbmUKKyAqIG1haW50YWluIGN1cnJlbnQgbG9ncGFnZSBidWZmZXIKKyAqIG5vIGNhY2hpbmcgc2luY2UgYXBwZW5kIG9ubHkKKyAqIGFwcHJvcHJpYXRlIGpmcyBidWZmZXIgY2FjaGUgYnVmZmVycyBhcyBuZWVkZWQKKyAqCisgKglncm91cCBjb21taXQ6CisgKiB0cmFuc2FjdGlvbnMgd2hpY2ggd3JvdGUgQ09NTUlUIHJlY29yZHMgaW4gdGhlIHNhbWUgaW4tbWVtb3J5CisgKiBsb2cgcGFnZSBkdXJpbmcgdGhlIHBhZ2VvdXQgb2YgcHJldmlvdXMvY3VycmVudCBsb2cgcGFnZShzKSBhcmUKKyAqIGNvbW1pdHRlZCB0b2dldGhlciBieSB0aGUgcGFnZW91dCBvZiB0aGUgcGFnZS4KKyAqCisgKglUQkQgbGF6eSBjb21taXQ6CisgKiB0cmFuc2FjdGlvbnMgYXJlIGNvbW1pdHRlZCBhc3luY2hyb25vdXNseSB3aGVuIHRoZSBsb2cgcGFnZQorICogY29udGFpbmluZyBpdCBDT01NSVQgaXMgcGFnZWQgb3V0IHdoZW4gaXQgYmVjb21lcyBmdWxsOworICoKKyAqCXNlcmlhbGl6YXRpb246CisgKiAuIGEgcGVyIGxvZyBsb2NrIHNlcmlhbGl6ZSBsb2cgd3JpdGUuCisgKiAuIGEgcGVyIGxvZyBsb2NrIHNlcmlhbGl6ZSBncm91cCBjb21taXQuCisgKiAuIGEgcGVyIGxvZyBsb2NrIHNlcmlhbGl6ZSBsb2cgb3Blbi9jbG9zZTsKKyAqCisgKglUQkQgbG9nIGludGVncml0eToKKyAqIGNhcmVmdWwtd3JpdGUgKHBpbmctcG9uZykgb2YgbGFzdCBsb2dwYWdlIHRvIHJlY292ZXIgZnJvbSBjcmFzaAorICogaW4gb3ZlcndyaXRlLgorICogZGV0ZWN0aW9uIG9mIHNwbGl0IChvdXQtb2Ytb3JkZXIpIHdyaXRlIG9mIHBoeXNpY2FsIHNlY3RvcnMKKyAqIG9mIGxhc3QgbG9ncGFnZSB2aWEgdGltZXN0YW1wIGF0IGVuZCBvZiBlYWNoIHNlY3RvcgorICogd2l0aCBpdHMgbWlycm9yIGRhdGEgYXJyYXkgYXQgdHJhaWxlcikuCisgKgorICoJYWx0ZXJuYXRpdmVzOgorICogbHNuIC0gNjQtYml0IG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBpbnRlZ2VyIHZzCisgKiAzMi1iaXQgbHNwbiBhbmQgcGFnZSBlb3IuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4JCS8qIGZvciBzeW5jX2Jsb2NrZGV2KCkgKi8KKyNpbmNsdWRlIDxsaW51eC9iaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlICJqZnNfaW5jb3JlLmgiCisjaW5jbHVkZSAiamZzX2ZpbHN5cy5oIgorI2luY2x1ZGUgImpmc19tZXRhcGFnZS5oIgorI2luY2x1ZGUgImpmc190eG5tZ3IuaCIKKyNpbmNsdWRlICJqZnNfZGVidWcuaCIKKworCisvKgorICogbGJ1ZidzIHJlYWR5IHRvIGJlIHJlZHJpdmVuLiAgUHJvdGVjdGVkIGJ5IGxvZ19yZWRyaXZlX2xvY2sgKGpmc0lPIHRocmVhZCkKKyAqLworc3RhdGljIHN0cnVjdCBsYnVmICpsb2dfcmVkcml2ZV9saXN0Oworc3RhdGljIERFRklORV9TUElOTE9DSyhsb2dfcmVkcml2ZV9sb2NrKTsKK0RFQ0xBUkVfV0FJVF9RVUVVRV9IRUFEKGpmc19JT190aHJlYWRfd2FpdCk7CisKKworLyoKKyAqCWxvZyByZWFkL3dyaXRlIHNlcmlhbGl6YXRpb24gKHBlciBsb2cpCisgKi8KKyNkZWZpbmUgTE9HX0xPQ0tfSU5JVChsb2cpCWluaXRfTVVURVgoJihsb2cpLT5sb2dsb2NrKQorI2RlZmluZSBMT0dfTE9DSyhsb2cpCQlkb3duKCYoKGxvZyktPmxvZ2xvY2spKQorI2RlZmluZSBMT0dfVU5MT0NLKGxvZykJCXVwKCYoKGxvZyktPmxvZ2xvY2spKQorCisKKy8qCisgKglsb2cgZ3JvdXAgY29tbWl0IHNlcmlhbGl6YXRpb24gKHBlciBsb2cpCisgKi8KKworI2RlZmluZSBMT0dHQ19MT0NLX0lOSVQobG9nKQlzcGluX2xvY2tfaW5pdCgmKGxvZyktPmdjbG9jaykKKyNkZWZpbmUgTE9HR0NfTE9DSyhsb2cpCQlzcGluX2xvY2tfaXJxKCYobG9nKS0+Z2Nsb2NrKQorI2RlZmluZSBMT0dHQ19VTkxPQ0sobG9nKQlzcGluX3VubG9ja19pcnEoJihsb2cpLT5nY2xvY2spCisjZGVmaW5lIExPR0dDX1dBS0VVUCh0YmxrKQl3YWtlX3VwX2FsbCgmKHRibGspLT5nY3dhaXQpCisKKy8qCisgKglsb2cgc3luYyBzZXJpYWxpemF0aW9uIChwZXIgbG9nKQorICovCisjZGVmaW5lCUxPR1NZTkNfREVMVEEobG9nc2l6ZSkJCW1pbigobG9nc2l6ZSkvOCwgMTI4KkxPR1BTSVpFKQorI2RlZmluZQlMT0dTWU5DX0JBUlJJRVIobG9nc2l6ZSkJKChsb2dzaXplKS80KQorLyoKKyNkZWZpbmUJTE9HU1lOQ19ERUxUQShsb2dzaXplKQkJbWluKChsb2dzaXplKS80LCAyNTYqTE9HUFNJWkUpCisjZGVmaW5lCUxPR1NZTkNfQkFSUklFUihsb2dzaXplKQkoKGxvZ3NpemUpLzIpCisqLworCisKKy8qCisgKglsb2cgYnVmZmVyIGNhY2hlIHN5bmNocm9uaXphdGlvbgorICovCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGpmc0xDYWNoZUxvY2spOworCisjZGVmaW5lCUxDQUNIRV9MT0NLKGZsYWdzKQlzcGluX2xvY2tfaXJxc2F2ZSgmamZzTENhY2hlTG9jaywgZmxhZ3MpCisjZGVmaW5lCUxDQUNIRV9VTkxPQ0soZmxhZ3MpCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmpmc0xDYWNoZUxvY2ssIGZsYWdzKQorCisvKgorICogU2VlIF9fU0xFRVBfQ09ORCBpbiBqZnNfbG9ja3MuaAorICovCisjZGVmaW5lIExDQUNIRV9TTEVFUF9DT05EKHdxLCBjb25kLCBmbGFncykJXAorZG8gewkJCQkJCVwKKwlpZiAoY29uZCkJCQkJXAorCQlicmVhazsJCQkJXAorCV9fU0xFRVBfQ09ORCh3cSwgY29uZCwgTENBQ0hFX0xPQ0soZmxhZ3MpLCBMQ0FDSEVfVU5MT0NLKGZsYWdzKSk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUJTENBQ0hFX1dBS0VVUChldmVudCkJd2FrZV91cChldmVudCkKKworCisvKgorICoJbGJ1ZiBidWZmZXIgY2FjaGUgKGxDYWNoZSkgY29udHJvbAorICovCisvKiBsb2cgYnVmZmVyIG1hbmFnZXIgcGFnZW91dCBjb250cm9sIChjdW11bGF0aXZlLCBpbmNsdXNpdmUpICovCisjZGVmaW5lCWxibVJFQUQJCTB4MDAwMQorI2RlZmluZQlsYm1XUklURQkweDAwMDIJLyogZW5xdWV1ZSBhdCB0YWlsIG9mIHdyaXRlIHF1ZXVlOworCQkJCSAqIGluaXQgcGFnZW91dCBpZiBhdCBoZWFkIG9mIHF1ZXVlOworCQkJCSAqLworI2RlZmluZQlsYm1SRUxFQVNFCTB4MDAwNAkvKiByZW1vdmUgZnJvbSB3cml0ZSBxdWV1ZQorCQkJCSAqIGF0IGNvbXBsZXRpb24gb2YgcGFnZW91dDsKKwkJCQkgKiBkbyBub3QgZnJlZS9yZWN5Y2xlIGl0IHlldDoKKwkJCQkgKiBjYWxsZXIgd2lsbCBmcmVlIGl0OworCQkJCSAqLworI2RlZmluZQlsYm1TWU5DCQkweDAwMDgJLyogZG8gbm90IHJldHVybiB0byBmcmVlbGlzdAorCQkJCSAqIHdoZW4gcmVtb3ZlZCBmcm9tIHdyaXRlIHF1ZXVlOworCQkJCSAqLworI2RlZmluZSBsYm1GUkVFCQkweDAwMTAJLyogcmV0dXJuIHRvIGZyZWVsaXN0CisJCQkJICogYXQgY29tcGxldGlvbiBvZiBwYWdlb3V0OworCQkJCSAqIHRoZSBidWZmZXIgbWF5IGJlIHJlY3ljbGVkOworCQkJCSAqLworI2RlZmluZQlsYm1ET05FCQkweDAwMjAKKyNkZWZpbmUJbGJtRVJST1IJMHgwMDQwCisjZGVmaW5lIGxibUdDCQkweDAwODAJLyogbGJtSU9Eb25lIHRvIHBlcmZvcm0gcG9zdC1HQyBwcm9jZXNzaW5nCisJCQkJICogb2YgbG9nIHBhZ2UKKwkJCQkgKi8KKyNkZWZpbmUgbGJtRElSRUNUCTB4MDEwMAorCisvKgorICogR2xvYmFsIGxpc3Qgb2YgYWN0aXZlIGV4dGVybmFsIGpvdXJuYWxzCisgKi8KK3N0YXRpYyBMSVNUX0hFQUQoamZzX2V4dGVybmFsX2xvZ3MpOworc3RhdGljIHN0cnVjdCBqZnNfbG9nICpkdW1teV9sb2cgPSBOVUxMOworc3RhdGljIERFQ0xBUkVfTVVURVgoamZzX2xvZ19zZW0pOworCisvKgorICogZXh0ZXJuYWwgcmVmZXJlbmNlcworICovCitleHRlcm4gdm9pZCB0eExhenlVbmxvY2soc3RydWN0IHRibG9jayAqIHRibGspOworZXh0ZXJuIGludCBqZnNfc3RvcF90aHJlYWRzOworZXh0ZXJuIHN0cnVjdCBjb21wbGV0aW9uIGpmc0lPd2FpdDsKK2V4dGVybiBpbnQgamZzX3Rsb2Nrc19sb3c7CisKKy8qCisgKiBmb3J3YXJkIHJlZmVyZW5jZXMKKyAqLworc3RhdGljIGludCBsbVdyaXRlUmVjb3JkKHN0cnVjdCBqZnNfbG9nICogbG9nLCBzdHJ1Y3QgdGJsb2NrICogdGJsaywKKwkJCSBzdHJ1Y3QgbHJkICogbHJkLCBzdHJ1Y3QgdGxvY2sgKiB0bGNrKTsKKworc3RhdGljIGludCBsbU5leHRQYWdlKHN0cnVjdCBqZnNfbG9nICogbG9nKTsKK3N0YXRpYyBpbnQgbG1Mb2dGaWxlU3lzdGVtKHN0cnVjdCBqZnNfbG9nICogbG9nLCBzdHJ1Y3QgamZzX3NiX2luZm8gKnNiaSwKKwkJCSAgIGludCBhY3RpdmF0ZSk7CisKK3N0YXRpYyBpbnQgb3Blbl9pbmxpbmVfbG9nKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworc3RhdGljIGludCBvcGVuX2R1bW15X2xvZyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKK3N0YXRpYyBpbnQgbGJtTG9nSW5pdChzdHJ1Y3QgamZzX2xvZyAqIGxvZyk7CitzdGF0aWMgdm9pZCBsYm1Mb2dTaHV0ZG93bihzdHJ1Y3QgamZzX2xvZyAqIGxvZyk7CitzdGF0aWMgc3RydWN0IGxidWYgKmxibUFsbG9jYXRlKHN0cnVjdCBqZnNfbG9nICogbG9nLCBpbnQpOworc3RhdGljIHZvaWQgbGJtRnJlZShzdHJ1Y3QgbGJ1ZiAqIGJwKTsKK3N0YXRpYyB2b2lkIGxibWZyZWUoc3RydWN0IGxidWYgKiBicCk7CitzdGF0aWMgaW50IGxibVJlYWQoc3RydWN0IGpmc19sb2cgKiBsb2csIGludCBwbiwgc3RydWN0IGxidWYgKiogYnBwKTsKK3N0YXRpYyB2b2lkIGxibVdyaXRlKHN0cnVjdCBqZnNfbG9nICogbG9nLCBzdHJ1Y3QgbGJ1ZiAqIGJwLCBpbnQgZmxhZywgaW50IGNhbnRfYmxvY2spOworc3RhdGljIHZvaWQgbGJtRGlyZWN0V3JpdGUoc3RydWN0IGpmc19sb2cgKiBsb2csIHN0cnVjdCBsYnVmICogYnAsIGludCBmbGFnKTsKK3N0YXRpYyBpbnQgbGJtSU9XYWl0KHN0cnVjdCBsYnVmICogYnAsIGludCBmbGFnKTsKK3N0YXRpYyBiaW9fZW5kX2lvX3QgbGJtSU9Eb25lOworc3RhdGljIHZvaWQgbGJtU3RhcnRJTyhzdHJ1Y3QgbGJ1ZiAqIGJwKTsKK3N0YXRpYyB2b2lkIGxtR0N3cml0ZShzdHJ1Y3QgamZzX2xvZyAqIGxvZywgaW50IGNhbnRfYmxvY2spOworc3RhdGljIGludCBsbUxvZ1N5bmMoc3RydWN0IGpmc19sb2cgKiBsb2csIGludCBub3N5bmN3YWl0KTsKKworCisKKy8qCisgKglzdGF0aXN0aWNzCisgKi8KKyNpZmRlZiBDT05GSUdfSkZTX1NUQVRJU1RJQ1MKK3N0YXRpYyBzdHJ1Y3QgbG1TdGF0IHsKKwl1aW50IGNvbW1pdDsJCS8qICMgb2YgY29tbWl0ICovCisJdWludCBwYWdlZG9uZTsJCS8qICMgb2YgcGFnZSB3cml0dGVuICovCisJdWludCBzdWJtaXR0ZWQ7CQkvKiAjIG9mIHBhZ2VzIHN1Ym1pdHRlZCAqLworCXVpbnQgZnVsbF9wYWdlOwkJLyogIyBvZiBmdWxsIHBhZ2VzIHN1Ym1pdHRlZCAqLworCXVpbnQgcGFydGlhbF9wYWdlOwkvKiAjIG9mIHBhcnRpYWwgcGFnZXMgc3VibWl0dGVkICovCit9IGxtU3RhdDsKKyNlbmRpZgorCisKKy8qCisgKiBOQU1FOglsbUxvZygpCisgKgorICogRlVOQ1RJT046CXdyaXRlIGEgbG9nIHJlY29yZDsKKyAqCisgKiBQQVJBTUVURVI6CisgKgorICogUkVUVVJOOglsc24gLSBvZmZzZXQgdG8gdGhlIG5leHQgbG9nIHJlY29yZCB0byB3cml0ZSAoZW5kLW9mLWxvZyk7CisgKgkJLTEgIC0gZXJyb3I7CisgKgorICogbm90ZTogdG9kbzogbG9nIGVycm9yIGhhbmRsZXIKKyAqLworaW50IGxtTG9nKHN0cnVjdCBqZnNfbG9nICogbG9nLCBzdHJ1Y3QgdGJsb2NrICogdGJsaywgc3RydWN0IGxyZCAqIGxyZCwKKwkgIHN0cnVjdCB0bG9jayAqIHRsY2spCit7CisJaW50IGxzbjsKKwlpbnQgZGlmZnAsIGRpZmZ0OworCXN0cnVjdCBtZXRhcGFnZSAqbXAgPSBOVUxMOworCisJamZzX2luZm8oImxtTG9nOiBsb2c6MHglcCB0YmxrOjB4JXAsIGxyZDoweCVwIHRsY2s6MHglcCIsCisJCSBsb2csIHRibGssIGxyZCwgdGxjayk7CisKKwlMT0dfTE9DSyhsb2cpOworCisJLyogbG9nIGJ5IChvdXQtb2YtdHJhbnNhY3Rpb24pIEpGUyA/ICovCisJaWYgKHRibGsgPT0gTlVMTCkKKwkJZ290byB3cml0ZVJlY29yZDsKKworCS8qIGxvZyBmcm9tIHBhZ2UgPyAqLworCWlmICh0bGNrID09IE5VTEwgfHwKKwkgICAgdGxjay0+dHlwZSAmIHRsY2tCVFJPT1QgfHwgKG1wID0gdGxjay0+bXApID09IE5VTEwpCisJCWdvdG8gd3JpdGVSZWNvcmQ7CisKKwkvKgorCSAqICAgICAgaW5pdGlhbGl6ZS91cGRhdGUgcGFnZS90cmFuc2FjdGlvbiByZWNvdmVyeSBsc24KKwkgKi8KKwlsc24gPSBsb2ctPmxzbjsKKworCUxPR1NZTkNfTE9DSyhsb2cpOworCisJLyoKKwkgKiBpbml0aWFsaXplIHBhZ2UgbHNuIGlmIGZpcnN0IGxvZyB3cml0ZSBvZiB0aGUgcGFnZQorCSAqLworCWlmIChtcC0+bHNuID09IDApIHsKKwkJbXAtPmxvZyA9IGxvZzsKKwkJbXAtPmxzbiA9IGxzbjsKKwkJbG9nLT5jb3VudCsrOworCisJCS8qIGluc2VydCBwYWdlIGF0IHRhaWwgb2YgbG9nc3luY2xpc3QgKi8KKwkJbGlzdF9hZGRfdGFpbCgmbXAtPnN5bmNsaXN0LCAmbG9nLT5zeW5jbGlzdCk7CisJfQorCisJLyoKKwkgKiAgICAgIGluaXRpYWxpemUvdXBkYXRlIGxzbiBvZiB0YmxvY2sgb2YgdGhlIHBhZ2UKKwkgKgorCSAqIHRyYW5zYWN0aW9uIGluaGVyaXRzIG9sZGVzdCBsc24gb2YgcGFnZXMgYXNzb2NpYXRlZAorCSAqIHdpdGggYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24gb2YgcmVzb3VyY2VzICh0aGVpcgorCSAqIGxvZyByZWNvcmRzIGFyZSB1c2VkIHRvIHJlY29uc3RydWN0IGFsbG9jYXRpb24gbWFwCisJICogYXQgcmVjb3ZlcnkgdGltZTogaW5vZGUgZm9yIGlub2RlIGFsbG9jYXRpb24gbWFwLAorCSAqIEIrLXRyZWUgaW5kZXggb2YgZXh0ZW50IGRlc2NyaXB0b3JzIGZvciBibG9jaworCSAqIGFsbG9jYXRpb24gbWFwKTsKKwkgKiBhbGxvY2F0aW9uIG1hcCBwYWdlcyBpbmhlcml0IHRyYW5zYWN0aW9uIGxzbiBhdAorCSAqIGNvbW1pdCB0aW1lIHRvIGFsbG93IGZvcndhcmRpbmcgbG9nIHN5bmNwdCBwYXN0IGxvZworCSAqIHJlY29yZHMgYXNzb2NpYXRlZCB3aXRoIGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uIG9mCisJICogcmVzb3VyY2VzIG9ubHkgYWZ0ZXIgcGVyc2lzdGVudCBtYXAgb2YgdGhlc2UgbWFwIHBhZ2VzCisJICogaGF2ZSBiZWVuIHVwZGF0ZWQgYW5kIHByb3BhZ2F0ZWQgdG8gaG9tZS4KKwkgKi8KKwkvKgorCSAqIGluaXRpYWxpemUgdHJhbnNhY3Rpb24gbHNuOgorCSAqLworCWlmICh0YmxrLT5sc24gPT0gMCkgeworCQkvKiBpbmhlcml0IGxzbiBvZiBpdHMgZmlyc3QgcGFnZSBsb2dnZWQgKi8KKwkJdGJsay0+bHNuID0gbXAtPmxzbjsKKwkJbG9nLT5jb3VudCsrOworCisJCS8qIGluc2VydCB0YmxvY2sgYWZ0ZXIgdGhlIHBhZ2Ugb24gbG9nc3luY2xpc3QgKi8KKwkJbGlzdF9hZGQoJnRibGstPnN5bmNsaXN0LCAmbXAtPnN5bmNsaXN0KTsKKwl9CisJLyoKKwkgKiB1cGRhdGUgdHJhbnNhY3Rpb24gbHNuOgorCSAqLworCWVsc2UgeworCQkvKiBpbmhlcml0IG9sZGVzdC9zbWFsbGVzdCBsc24gb2YgcGFnZSAqLworCQlsb2dkaWZmKGRpZmZwLCBtcC0+bHNuLCBsb2cpOworCQlsb2dkaWZmKGRpZmZ0LCB0YmxrLT5sc24sIGxvZyk7CisJCWlmIChkaWZmcCA8IGRpZmZ0KSB7CisJCQkvKiB1cGRhdGUgdGJsb2NrIGxzbiB3aXRoIHBhZ2UgbHNuICovCisJCQl0YmxrLT5sc24gPSBtcC0+bHNuOworCisJCQkvKiBtb3ZlIHRibG9jayBhZnRlciBwYWdlIG9uIGxvZ3N5bmNsaXN0ICovCisJCQlsaXN0X21vdmUoJnRibGstPnN5bmNsaXN0LCAmbXAtPnN5bmNsaXN0KTsKKwkJfQorCX0KKworCUxPR1NZTkNfVU5MT0NLKGxvZyk7CisKKwkvKgorCSAqICAgICAgd3JpdGUgdGhlIGxvZyByZWNvcmQKKwkgKi8KKyAgICAgIHdyaXRlUmVjb3JkOgorCWxzbiA9IGxtV3JpdGVSZWNvcmQobG9nLCB0YmxrLCBscmQsIHRsY2spOworCisJLyoKKwkgKiBmb3J3YXJkIGxvZyBzeW5jcHQgaWYgbG9nIHJlYWNoZWQgbmV4dCBzeW5jcHQgdHJpZ2dlcgorCSAqLworCWxvZ2RpZmYoZGlmZnAsIGxzbiwgbG9nKTsKKwlpZiAoZGlmZnAgPj0gbG9nLT5uZXh0c3luYykKKwkJbHNuID0gbG1Mb2dTeW5jKGxvZywgMCk7CisKKwkvKiB1cGRhdGUgZW5kLW9mLWxvZyBsc24gKi8KKwlsb2ctPmxzbiA9IGxzbjsKKworCUxPR19VTkxPQ0sobG9nKTsKKworCS8qIHJldHVybiBlbmQtb2YtbG9nIGFkZHJlc3MgKi8KKwlyZXR1cm4gbHNuOworfQorCisKKy8qCisgKiBOQU1FOglsbVdyaXRlUmVjb3JkKCkKKyAqCisgKiBGVU5DVElPTjoJbW92ZSB0aGUgbG9nIHJlY29yZCB0byBjdXJyZW50IGxvZyBwYWdlCisgKgorICogUEFSQU1FVEVSOgljZAktIGNvbW1pdCBkZXNjcmlwdG9yCisgKgorICogUkVUVVJOOgllbmQtb2YtbG9nIGFkZHJlc3MKKyAqCQkJCisgKiBzZXJpYWxpemF0aW9uOiBMT0dfTE9DSygpIGhlbGQgb24gZW50cnkvZXhpdAorICovCitzdGF0aWMgaW50CitsbVdyaXRlUmVjb3JkKHN0cnVjdCBqZnNfbG9nICogbG9nLCBzdHJ1Y3QgdGJsb2NrICogdGJsaywgc3RydWN0IGxyZCAqIGxyZCwKKwkgICAgICBzdHJ1Y3QgdGxvY2sgKiB0bGNrKQoreworCWludCBsc24gPSAwOwkJLyogZW5kLW9mLWxvZyBhZGRyZXNzICovCisJc3RydWN0IGxidWYgKmJwOwkvKiBkc3QgbG9nIHBhZ2UgYnVmZmVyICovCisJc3RydWN0IGxvZ3BhZ2UgKmxwOwkvKiBkc3QgbG9nIHBhZ2UgKi8KKwljYWRkcl90IGRzdDsJCS8qIGRlc3RpbmF0aW9uIGFkZHJlc3MgaW4gbG9nIHBhZ2UgKi8KKwlpbnQgZHN0b2Zmc2V0OwkJLyogZW5kLW9mLWxvZyBvZmZzZXQgaW4gbG9nIHBhZ2UgKi8KKwlpbnQgZnJlZXNwYWNlOwkJLyogZnJlZSBzcGFjZSBpbiBsb2cgcGFnZSAqLworCWNhZGRyX3QgcDsJCS8qIHNyYyBtZXRhLWRhdGEgcGFnZSAqLworCWNhZGRyX3Qgc3JjOworCWludCBzcmNsZW47CisJaW50IG5ieXRlczsJCS8qIG51bWJlciBvZiBieXRlcyB0byBtb3ZlICovCisJaW50IGk7CisJaW50IGxlbjsKKwlzdHJ1Y3QgbGluZWxvY2sgKmxpbmVsb2NrOworCXN0cnVjdCBsdiAqbHY7CisJc3RydWN0IGx2ZCAqbHZkOworCWludCBsMmxpbmVzaXplOworCisJbGVuID0gMDsKKworCS8qIHJldHJpZXZlIGRlc3RpbmF0aW9uIGxvZyBwYWdlIHRvIHdyaXRlICovCisJYnAgPSAoc3RydWN0IGxidWYgKikgbG9nLT5icDsKKwlscCA9IChzdHJ1Y3QgbG9ncGFnZSAqKSBicC0+bF9sZGF0YTsKKwlkc3RvZmZzZXQgPSBsb2ctPmVvcjsKKworCS8qIGFueSBsb2cgZGF0YSB0byB3cml0ZSA/ICovCisJaWYgKHRsY2sgPT0gTlVMTCkKKwkJZ290byBtb3ZlTHJkOworCisJLyoKKwkgKiAgICAgIG1vdmUgbG9nIHJlY29yZCBkYXRhCisJICovCisJLyogcmV0cmlldmUgc291cmNlIG1ldGEtZGF0YSBwYWdlIHRvIGxvZyAqLworCWlmICh0bGNrLT5mbGFnICYgdGxja1BBR0VMT0NLKSB7CisJCXAgPSAoY2FkZHJfdCkgKHRsY2stPm1wLT5kYXRhKTsKKwkJbGluZWxvY2sgPSAoc3RydWN0IGxpbmVsb2NrICopICYgdGxjay0+bG9jazsKKwl9CisJLyogcmV0cmlldmUgc291cmNlIGluLW1lbW9yeSBpbm9kZSB0byBsb2cgKi8KKwllbHNlIGlmICh0bGNrLT5mbGFnICYgdGxja0lOT0RFTE9DSykgeworCQlpZiAodGxjay0+dHlwZSAmIHRsY2tEVFJFRSkKKwkJCXAgPSAoY2FkZHJfdCkgJkpGU19JUCh0bGNrLT5pcCktPmlfZHRyb290OworCQllbHNlCisJCQlwID0gKGNhZGRyX3QpICZKRlNfSVAodGxjay0+aXApLT5pX3h0cm9vdDsKKwkJbGluZWxvY2sgPSAoc3RydWN0IGxpbmVsb2NrICopICYgdGxjay0+bG9jazsKKwl9CisjaWZkZWYJX0pGU19XSVAKKwllbHNlIGlmICh0bGNrLT5mbGFnICYgdGxja0lOTElORUxPQ0spIHsKKworCQlpbmxpbmVsb2NrID0gKHN0cnVjdCBpbmxpbmVsb2NrICopICYgdGxjazsKKwkJcCA9IChjYWRkcl90KSAmIGlubGluZWxvY2stPnB4ZDsKKwkJbGluZWxvY2sgPSAoc3RydWN0IGxpbmVsb2NrICopICYgdGxjazsKKwl9CisjZW5kaWYJCQkJLyogX0pGU19XSVAgKi8KKwllbHNlIHsKKwkJamZzX2VycigibG1Xcml0ZVJlY29yZDogVUZPIHRsY2s6MHglcCIsIHRsY2spOworCQlyZXR1cm4gMDsJLyogUHJvYmFibHkgc2hvdWxkIHRyYXAgKi8KKwl9CisJbDJsaW5lc2l6ZSA9IGxpbmVsb2NrLT5sMmxpbmVzaXplOworCisgICAgICBtb3ZlRGF0YToKKwlBU1NFUlQobGluZWxvY2stPmluZGV4IDw9IGxpbmVsb2NrLT5tYXhjbnQpOworCisJbHYgPSBsaW5lbG9jay0+bHY7CisJZm9yIChpID0gMDsgaSA8IGxpbmVsb2NrLT5pbmRleDsgaSsrLCBsdisrKSB7CisJCWlmIChsdi0+bGVuZ3RoID09IDApCisJCQljb250aW51ZTsKKworCQkvKiBpcyBwYWdlIGZ1bGwgPyAqLworCQlpZiAoZHN0b2Zmc2V0ID49IExPR1BTSVpFIC0gTE9HUFRMUlNJWkUpIHsKKwkJCS8qIHBhZ2UgYmVjb21lIGZ1bGw6IG1vdmUgb24gdG8gbmV4dCBwYWdlICovCisJCQlsbU5leHRQYWdlKGxvZyk7CisKKwkJCWJwID0gbG9nLT5icDsKKwkJCWxwID0gKHN0cnVjdCBsb2dwYWdlICopIGJwLT5sX2xkYXRhOworCQkJZHN0b2Zmc2V0ID0gTE9HUEhEUlNJWkU7CisJCX0KKworCQkvKgorCQkgKiBtb3ZlIGxvZyB2ZWN0b3IgZGF0YQorCQkgKi8KKwkJc3JjID0gKHU4ICopIHAgKyAobHYtPm9mZnNldCA8PCBsMmxpbmVzaXplKTsKKwkJc3JjbGVuID0gbHYtPmxlbmd0aCA8PCBsMmxpbmVzaXplOworCQlsZW4gKz0gc3JjbGVuOworCQl3aGlsZSAoc3JjbGVuID4gMCkgeworCQkJZnJlZXNwYWNlID0gKExPR1BTSVpFIC0gTE9HUFRMUlNJWkUpIC0gZHN0b2Zmc2V0OworCQkJbmJ5dGVzID0gbWluKGZyZWVzcGFjZSwgc3JjbGVuKTsKKwkJCWRzdCA9IChjYWRkcl90KSBscCArIGRzdG9mZnNldDsKKwkJCW1lbWNweShkc3QsIHNyYywgbmJ5dGVzKTsKKwkJCWRzdG9mZnNldCArPSBuYnl0ZXM7CisKKwkJCS8qIGlzIHBhZ2Ugbm90IGZ1bGwgPyAqLworCQkJaWYgKGRzdG9mZnNldCA8IExPR1BTSVpFIC0gTE9HUFRMUlNJWkUpCisJCQkJYnJlYWs7CisKKwkJCS8qIHBhZ2UgYmVjb21lIGZ1bGw6IG1vdmUgb24gdG8gbmV4dCBwYWdlICovCisJCQlsbU5leHRQYWdlKGxvZyk7CisKKwkJCWJwID0gKHN0cnVjdCBsYnVmICopIGxvZy0+YnA7CisJCQlscCA9IChzdHJ1Y3QgbG9ncGFnZSAqKSBicC0+bF9sZGF0YTsKKwkJCWRzdG9mZnNldCA9IExPR1BIRFJTSVpFOworCisJCQlzcmNsZW4gLT0gbmJ5dGVzOworCQkJc3JjICs9IG5ieXRlczsKKwkJfQorCisJCS8qCisJCSAqIG1vdmUgbG9nIHZlY3RvciBkZXNjcmlwdG9yCisJCSAqLworCQlsZW4gKz0gNDsKKwkJbHZkID0gKHN0cnVjdCBsdmQgKikgKChjYWRkcl90KSBscCArIGRzdG9mZnNldCk7CisJCWx2ZC0+b2Zmc2V0ID0gY3B1X3RvX2xlMTYobHYtPm9mZnNldCk7CisJCWx2ZC0+bGVuZ3RoID0gY3B1X3RvX2xlMTYobHYtPmxlbmd0aCk7CisJCWRzdG9mZnNldCArPSA0OworCQlqZnNfaW5mbygibG1Xcml0ZVJlY29yZDogbHYgb2Zmc2V0OiVkIGxlbmd0aDolZCIsCisJCQkgbHYtPm9mZnNldCwgbHYtPmxlbmd0aCk7CisJfQorCisJaWYgKChpID0gbGluZWxvY2stPm5leHQpKSB7CisJCWxpbmVsb2NrID0gKHN0cnVjdCBsaW5lbG9jayAqKSBsaWRfdG9fdGxvY2soaSk7CisJCWdvdG8gbW92ZURhdGE7CisJfQorCisJLyoKKwkgKiAgICAgIG1vdmUgbG9nIHJlY29yZCBkZXNjcmlwdG9yCisJICovCisgICAgICBtb3ZlTHJkOgorCWxyZC0+bGVuZ3RoID0gY3B1X3RvX2xlMTYobGVuKTsKKworCXNyYyA9IChjYWRkcl90KSBscmQ7CisJc3JjbGVuID0gTE9HUkRTSVpFOworCisJd2hpbGUgKHNyY2xlbiA+IDApIHsKKwkJZnJlZXNwYWNlID0gKExPR1BTSVpFIC0gTE9HUFRMUlNJWkUpIC0gZHN0b2Zmc2V0OworCQluYnl0ZXMgPSBtaW4oZnJlZXNwYWNlLCBzcmNsZW4pOworCQlkc3QgPSAoY2FkZHJfdCkgbHAgKyBkc3RvZmZzZXQ7CisJCW1lbWNweShkc3QsIHNyYywgbmJ5dGVzKTsKKworCQlkc3RvZmZzZXQgKz0gbmJ5dGVzOworCQlzcmNsZW4gLT0gbmJ5dGVzOworCisJCS8qIGFyZSB0aGVyZSBtb3JlIHRvIG1vdmUgdGhhbiBmcmVlc3BhY2Ugb2YgcGFnZSA/ICovCisJCWlmIChzcmNsZW4pCisJCQlnb3RvIHBhZ2VGdWxsOworCisJCS8qCisJCSAqIGVuZCBvZiBsb2cgcmVjb3JkIGRlc2NyaXB0b3IKKwkJICovCisKKwkJLyogdXBkYXRlIGxhc3QgbG9nIHJlY29yZCBlb3IgKi8KKwkJbG9nLT5lb3IgPSBkc3RvZmZzZXQ7CisJCWJwLT5sX2VvciA9IGRzdG9mZnNldDsKKwkJbHNuID0gKGxvZy0+cGFnZSA8PCBMMkxPR1BTSVpFKSArIGRzdG9mZnNldDsKKworCQlpZiAobHJkLT50eXBlICYgY3B1X3RvX2xlMTYoTE9HX0NPTU1JVCkpIHsKKwkJCXRibGstPmNsc24gPSBsc247CisJCQlqZnNfaW5mbygid3I6IHRjbHNuOjB4JXgsIGJlb3I6MHgleCIsIHRibGstPmNsc24sCisJCQkJIGJwLT5sX2Vvcik7CisKKwkJCUlOQ1JFTUVOVChsbVN0YXQuY29tbWl0KTsJLyogIyBvZiBjb21taXQgKi8KKworCQkJLyoKKwkJCSAqIGVucXVldWUgdGJsb2NrIGZvciBncm91cCBjb21taXQ6CisJCQkgKgorCQkJICogZW5xdWV1ZSB0YmxvY2sgb2Ygbm9uLXRyaXZpYWwvc3luY2hyb25vdXMgQ09NTUlUCisJCQkgKiBhdCB0YWlsIG9mIGdyb3VwIGNvbW1pdCBxdWV1ZQorCQkJICogKHRyaXZpYWwvYXN5bmNocm9ub3VzIENPTU1JVHMgYXJlIGlnbm9yZWQgYnkKKwkJCSAqIGdyb3VwIGNvbW1pdC4pCisJCQkgKi8KKwkJCUxPR0dDX0xPQ0sobG9nKTsKKworCQkJLyogaW5pdCB0YmxvY2sgZ2Mgc3RhdGUgKi8KKwkJCXRibGstPmZsYWcgPSB0YmxrR0NfUVVFVUU7CisJCQl0YmxrLT5icCA9IGxvZy0+YnA7CisJCQl0YmxrLT5wbiA9IGxvZy0+cGFnZTsKKwkJCXRibGstPmVvciA9IGxvZy0+ZW9yOworCisJCQkvKiBlbnF1ZXVlIHRyYW5zYWN0aW9uIHRvIGNvbW1pdCBxdWV1ZSAqLworCQkJbGlzdF9hZGRfdGFpbCgmdGJsay0+Y3F1ZXVlLCAmbG9nLT5jcXVldWUpOworCisJCQlMT0dHQ19VTkxPQ0sobG9nKTsKKwkJfQorCisJCWpmc19pbmZvKCJsbVdyaXRlUmVjb3JkOiBscmQ6MHglMDR4IGJwOjB4JXAgcG46JWQgZW9yOjB4JXgiLAorCQkJbGUxNl90b19jcHUobHJkLT50eXBlKSwgbG9nLT5icCwgbG9nLT5wYWdlLCBkc3RvZmZzZXQpOworCisJCS8qIHBhZ2Ugbm90IGZ1bGwgPyAqLworCQlpZiAoZHN0b2Zmc2V0IDwgTE9HUFNJWkUgLSBMT0dQVExSU0laRSkKKwkJCXJldHVybiBsc247CisKKwkgICAgICBwYWdlRnVsbDoKKwkJLyogcGFnZSBiZWNvbWUgZnVsbDogbW92ZSBvbiB0byBuZXh0IHBhZ2UgKi8KKwkJbG1OZXh0UGFnZShsb2cpOworCisJCWJwID0gKHN0cnVjdCBsYnVmICopIGxvZy0+YnA7CisJCWxwID0gKHN0cnVjdCBsb2dwYWdlICopIGJwLT5sX2xkYXRhOworCQlkc3RvZmZzZXQgPSBMT0dQSERSU0laRTsKKwkJc3JjICs9IG5ieXRlczsKKwl9CisKKwlyZXR1cm4gbHNuOworfQorCisKKy8qCisgKiBOQU1FOglsbU5leHRQYWdlKCkKKyAqCisgKiBGVU5DVElPTjoJd3JpdGUgY3VycmVudCBwYWdlIGFuZCBhbGxvY2F0ZSBuZXh0IHBhZ2UuCisgKgorICogUEFSQU1FVEVSOglsb2cKKyAqCisgKiBSRVRVUk46CTAKKyAqCQkJCisgKiBzZXJpYWxpemF0aW9uOiBMT0dfTE9DSygpIGhlbGQgb24gZW50cnkvZXhpdAorICovCitzdGF0aWMgaW50IGxtTmV4dFBhZ2Uoc3RydWN0IGpmc19sb2cgKiBsb2cpCit7CisJc3RydWN0IGxvZ3BhZ2UgKmxwOworCWludCBsc3BuOwkJLyogbG9nIHNlcXVlbmNlIHBhZ2UgbnVtYmVyICovCisJaW50IHBuOwkJCS8qIGN1cnJlbnQgcGFnZSBudW1iZXIgKi8KKwlzdHJ1Y3QgbGJ1ZiAqYnA7CisJc3RydWN0IGxidWYgKm5leHRicDsKKwlzdHJ1Y3QgdGJsb2NrICp0YmxrOworCisJLyogZ2V0IGN1cnJlbnQgbG9nIHBhZ2UgbnVtYmVyIGFuZCBsb2cgc2VxdWVuY2UgcGFnZSBudW1iZXIgKi8KKwlwbiA9IGxvZy0+cGFnZTsKKwlicCA9IGxvZy0+YnA7CisJbHAgPSAoc3RydWN0IGxvZ3BhZ2UgKikgYnAtPmxfbGRhdGE7CisJbHNwbiA9IGxlMzJfdG9fY3B1KGxwLT5oLnBhZ2UpOworCisJTE9HR0NfTE9DSyhsb2cpOworCisJLyoKKwkgKiAgICAgIHdyaXRlIG9yIHF1ZXVlIHRoZSBmdWxsIHBhZ2UgYXQgdGhlIHRhaWwgb2Ygd3JpdGUgcXVldWUKKwkgKi8KKwkvKiBnZXQgdGhlIHRhaWwgdGJsayBvbiBjb21taXQgcXVldWUgKi8KKwlpZiAobGlzdF9lbXB0eSgmbG9nLT5jcXVldWUpKQorCQl0YmxrID0gTlVMTDsKKwllbHNlCisJCXRibGsgPSBsaXN0X2VudHJ5KGxvZy0+Y3F1ZXVlLnByZXYsIHN0cnVjdCB0YmxvY2ssIGNxdWV1ZSk7CisKKwkvKiBldmVyeSB0YmxrIHdobyBoYXMgQ09NTUlUIHJlY29yZCBvbiB0aGUgY3VycmVudCBwYWdlLAorCSAqIGFuZCBoYXMgbm90IGJlZW4gY29tbWl0dGVkLCBtdXN0IGJlIG9uIGNvbW1pdCBxdWV1ZQorCSAqIHNpbmNlIHRibGsgaXMgcXVldWVkIGF0IGNvbW1pdCBxdWV1ZXUgYXQgdGhlIHRpbWUKKwkgKiBvZiB3cml0aW5nIGl0cyBDT01NSVQgcmVjb3JkIG9uIHRoZSBwYWdlIGJlZm9yZQorCSAqIHBhZ2UgYmVjb21lcyBmdWxsIChldmVuIHRob3VnaCB0aGUgdGJsayB0aHJlYWQKKwkgKiB3aG8gd3JvdGUgQ09NTUlUIHJlY29yZCBtYXkgaGF2ZSBiZWVuIHN1c3BlbmRlZAorCSAqIGN1cnJlbnRseSk7CisJICovCisKKwkvKiBpcyBwYWdlIGJvdW5kIHdpdGggb3V0c3RhbmRpbmcgdGFpbCB0YmxrID8gKi8KKwlpZiAodGJsayAmJiB0YmxrLT5wbiA9PSBwbikgeworCQkvKiBtYXJrIHRibGsgZm9yIGVuZC1vZi1wYWdlICovCisJCXRibGstPmZsYWcgfD0gdGJsa0dDX0VPUDsKKworCQlpZiAobG9nLT5jZmxhZyAmIGxvZ0dDX1BBR0VPVVQpIHsKKwkJCS8qIGlmIHBhZ2UgaXMgbm90IGFscmVhZHkgb24gd3JpdGUgcXVldWUsCisJCQkgKiBqdXN0IGVucXVldWUgKG5vIGxibVdSSVRFIHRvIHByZXZlbnQgcmVkcml2ZSkKKwkJCSAqIGJ1ZmZlciB0byB3cXVldWUgdG8gZW5zdXJlIGNvcnJlY3Qgc2VyaWFsIG9yZGVyCisJCQkgKiBvZiB0aGUgcGFnZXMgc2luY2UgbG9nIHBhZ2VzIHdpbGwgYmUgYWRkZWQKKwkJCSAqIGNvbnRpbnVvdXNseQorCQkJICovCisJCQlpZiAoYnAtPmxfd3FuZXh0ID09IE5VTEwpCisJCQkJbGJtV3JpdGUobG9nLCBicCwgMCwgMCk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogTm8gY3VycmVudCBHQyBsZWFkZXIsIGluaXRpYXRlIGdyb3VwIGNvbW1pdAorCQkJICovCisJCQlsb2ctPmNmbGFnIHw9IGxvZ0dDX1BBR0VPVVQ7CisJCQlsbUdDd3JpdGUobG9nLCAwKTsKKwkJfQorCX0KKwkvKiBwYWdlIGlzIG5vdCBib3VuZCB3aXRoIG91dHN0YW5kaW5nIHRibGs6CisJICogaW5pdCB3cml0ZSBvciBtYXJrIGl0IHRvIGJlIHJlZHJpdmVuIChsYm1XUklURSkKKwkgKi8KKwllbHNlIHsKKwkJLyogZmluYWxpemUgdGhlIHBhZ2UgKi8KKwkJYnAtPmxfY2VvciA9IGJwLT5sX2VvcjsKKwkJbHAtPmguZW9yID0gbHAtPnQuZW9yID0gY3B1X3RvX2xlMTYoYnAtPmxfY2Vvcik7CisJCWxibVdyaXRlKGxvZywgYnAsIGxibVdSSVRFIHwgbGJtUkVMRUFTRSB8IGxibUZSRUUsIDApOworCX0KKwlMT0dHQ19VTkxPQ0sobG9nKTsKKworCS8qCisJICogICAgICBhbGxvY2F0ZS9pbml0aWFsaXplIG5leHQgcGFnZQorCSAqLworCS8qIGlmIGxvZyB3cmFwcywgdGhlIGZpcnN0IGRhdGEgcGFnZSBvZiBsb2cgaXMgMgorCSAqICgwIG5ldmVyIHVzZWQsIDEgaXMgc3VwZXJibG9jaykuCisJICovCisJbG9nLT5wYWdlID0gKHBuID09IGxvZy0+c2l6ZSAtIDEpID8gMiA6IHBuICsgMTsKKwlsb2ctPmVvciA9IExPR1BIRFJTSVpFOwkvKiA/IHZhbGlkIHBhZ2UgZW1wdHkvZnVsbCBhdCBsb2dSZWRvKCkgKi8KKworCS8qIGFsbG9jYXRlL2luaXRpYWxpemUgbmV4dCBsb2cgcGFnZSBidWZmZXIgKi8KKwluZXh0YnAgPSBsYm1BbGxvY2F0ZShsb2csIGxvZy0+cGFnZSk7CisJbmV4dGJwLT5sX2VvciA9IGxvZy0+ZW9yOworCWxvZy0+YnAgPSBuZXh0YnA7CisKKwkvKiBpbml0aWFsaXplIG5leHQgbG9nIHBhZ2UgKi8KKwlscCA9IChzdHJ1Y3QgbG9ncGFnZSAqKSBuZXh0YnAtPmxfbGRhdGE7CisJbHAtPmgucGFnZSA9IGxwLT50LnBhZ2UgPSBjcHVfdG9fbGUzMihsc3BuICsgMSk7CisJbHAtPmguZW9yID0gbHAtPnQuZW9yID0gY3B1X3RvX2xlMTYoTE9HUEhEUlNJWkUpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIE5BTUU6CWxtR3JvdXBDb21taXQoKQorICoKKyAqIEZVTkNUSU9OOglncm91cCBjb21taXQKKyAqCWluaXRpYXRlIHBhZ2VvdXQgb2YgdGhlIHBhZ2VzIHdpdGggQ09NTUlUIGluIHRoZSBvcmRlciBvZgorICoJcGFnZSBudW1iZXIgLSByZWRyaXZlIHBhZ2VvdXQgb2YgdGhlIHBhZ2UgYXQgdGhlIGhlYWQgb2YKKyAqCXBhZ2VvdXQgcXVldWUgdW50aWwgZnVsbCBwYWdlIGhhcyBiZWVuIHdyaXR0ZW4uCisgKgorICogUkVUVVJOOgkKKyAqCisgKiBOT1RFOgorICoJTE9HR0NfTE9DSyBzZXJpYWxpemVzIGxvZyBncm91cCBjb21taXQgcXVldWUsIGFuZAorICoJdHJhbnNhY3Rpb24gYmxvY2tzIG9uIHRoZSBjb21taXQgcXVldWUuCisgKglOLkIuIExPR19MT0NLIGlzIE5PVCBoZWxkIGR1cmluZyBsbUdyb3VwQ29tbWl0KCkuCisgKi8KK2ludCBsbUdyb3VwQ29tbWl0KHN0cnVjdCBqZnNfbG9nICogbG9nLCBzdHJ1Y3QgdGJsb2NrICogdGJsaykKK3sKKwlpbnQgcmMgPSAwOworCisJTE9HR0NfTE9DSyhsb2cpOworCisJLyogZ3JvdXAgY29tbWl0dGVkIGFscmVhZHkgPyAqLworCWlmICh0YmxrLT5mbGFnICYgdGJsa0dDX0NPTU1JVFRFRCkgeworCQlpZiAodGJsay0+ZmxhZyAmIHRibGtHQ19FUlJPUikKKwkJCXJjID0gLUVJTzsKKworCQlMT0dHQ19VTkxPQ0sobG9nKTsKKwkJcmV0dXJuIHJjOworCX0KKwlqZnNfaW5mbygibG1Hcm91cCBDb21taXQ6IHRibGsgPSAweCVwLCBnY3J0YyA9ICVkIiwgdGJsaywgbG9nLT5nY3J0Yyk7CisKKwlpZiAodGJsay0+eGZsYWcgJiBDT01NSVRfTEFaWSkKKwkJdGJsay0+ZmxhZyB8PSB0YmxrR0NfTEFaWTsKKworCWlmICgoIShsb2ctPmNmbGFnICYgbG9nR0NfUEFHRU9VVCkpICYmICghbGlzdF9lbXB0eSgmbG9nLT5jcXVldWUpKSAmJgorCSAgICAoISh0YmxrLT54ZmxhZyAmIENPTU1JVF9MQVpZKSB8fCB0ZXN0X2JpdChsb2dfRkxVU0gsICZsb2ctPmZsYWcpCisJICAgICB8fCBqZnNfdGxvY2tzX2xvdykpIHsKKwkJLyoKKwkJICogTm8gcGFnZW91dCBpbiBwcm9ncmVzcworCQkgKgorCQkgKiBzdGFydCBncm91cCBjb21taXQgYXMgaXRzIGdyb3VwIGxlYWRlci4KKwkJICovCisJCWxvZy0+Y2ZsYWcgfD0gbG9nR0NfUEFHRU9VVDsKKworCQlsbUdDd3JpdGUobG9nLCAwKTsKKwl9CisKKwlpZiAodGJsay0+eGZsYWcgJiBDT01NSVRfTEFaWSkgeworCQkvKgorCQkgKiBMYXp5IHRyYW5zYWN0aW9ucyBjYW4gbGVhdmUgbm93CisJCSAqLworCQlMT0dHQ19VTkxPQ0sobG9nKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogbG1HQ3dyaXRlIGdpdmVzIHVwIExPR0dDX0xPQ0ssIGNoZWNrIGFnYWluICovCisKKwlpZiAodGJsay0+ZmxhZyAmIHRibGtHQ19DT01NSVRURUQpIHsKKwkJaWYgKHRibGstPmZsYWcgJiB0YmxrR0NfRVJST1IpCisJCQlyYyA9IC1FSU87CisKKwkJTE9HR0NfVU5MT0NLKGxvZyk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiB1cGNvdW50IHRyYW5zYWN0aW9uIHdhaXRpbmcgZm9yIGNvbXBsZXRpb24KKwkgKi8KKwlsb2ctPmdjcnRjKys7CisJdGJsay0+ZmxhZyB8PSB0YmxrR0NfUkVBRFk7CisKKwlfX1NMRUVQX0NPTkQodGJsay0+Z2N3YWl0LCAodGJsay0+ZmxhZyAmIHRibGtHQ19DT01NSVRURUQpLAorCQkgICAgIExPR0dDX0xPQ0sobG9nKSwgTE9HR0NfVU5MT0NLKGxvZykpOworCisJLyogcmVtb3ZlZCBmcm9tIGNvbW1pdCBxdWV1ZSAqLworCWlmICh0YmxrLT5mbGFnICYgdGJsa0dDX0VSUk9SKQorCQlyYyA9IC1FSU87CisKKwlMT0dHQ19VTkxPQ0sobG9nKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBOQU1FOglsbUdDd3JpdGUoKQorICoKKyAqIEZVTkNUSU9OOglncm91cCBjb21taXQgd3JpdGUKKyAqCWluaXRpYXRlIHdyaXRlIG9mIGxvZyBwYWdlLCBidWlsZGluZyBhIGdyb3VwIG9mIGFsbCB0cmFuc2FjdGlvbnMKKyAqCXdpdGggY29tbWl0IHJlY29yZHMgb24gdGhhdCBwYWdlLgorICoKKyAqIFJFVFVSTjoJTm9uZQorICoKKyAqIE5PVEU6CisgKglMT0dHQ19MT0NLIG11c3QgYmUgaGVsZCBieSBjYWxsZXIuCisgKglOLkIuIExPR19MT0NLIGlzIE5PVCBoZWxkIGR1cmluZyBsbUdyb3VwQ29tbWl0KCkuCisgKi8KK3N0YXRpYyB2b2lkIGxtR0N3cml0ZShzdHJ1Y3QgamZzX2xvZyAqIGxvZywgaW50IGNhbnRfd3JpdGUpCit7CisJc3RydWN0IGxidWYgKmJwOworCXN0cnVjdCBsb2dwYWdlICpscDsKKwlpbnQgZ2NwbjsJCS8qIGdyb3VwIGNvbW1pdCBwYWdlIG51bWJlciAqLworCXN0cnVjdCB0YmxvY2sgKnRibGs7CisJc3RydWN0IHRibG9jayAqeHRibGsgPSBOVUxMOworCisJLyoKKwkgKiBidWlsZCB0aGUgY29tbWl0IGdyb3VwIG9mIGEgbG9nIHBhZ2UKKwkgKgorCSAqIHNjYW4gY29tbWl0IHF1ZXVlIGFuZCBtYWtlIGEgY29tbWl0IGdyb3VwIG9mIGFsbAorCSAqIHRyYW5zYWN0aW9ucyB3aXRoIENPTU1JVCByZWNvcmRzIG9uIHRoZSBzYW1lIGxvZyBwYWdlLgorCSAqLworCS8qIGdldCB0aGUgaGVhZCB0YmxrIG9uIHRoZSBjb21taXQgcXVldWUgKi8KKwlnY3BuID0gbGlzdF9lbnRyeShsb2ctPmNxdWV1ZS5uZXh0LCBzdHJ1Y3QgdGJsb2NrLCBjcXVldWUpLT5wbjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodGJsaywgJmxvZy0+Y3F1ZXVlLCBjcXVldWUpIHsKKwkJaWYgKHRibGstPnBuICE9IGdjcG4pCisJCQlicmVhazsKKworCQl4dGJsayA9IHRibGs7CisKKwkJLyogc3RhdGUgdHJhbnNpdGlvbjogKFFVRVVFLCBSRUFEWSkgLT4gQ09NTUlUICovCisJCXRibGstPmZsYWcgfD0gdGJsa0dDX0NPTU1JVDsKKwl9CisJdGJsayA9IHh0YmxrOwkJLyogbGFzdCB0YmxrIG9mIHRoZSBwYWdlICovCisKKwkvKgorCSAqIHBhZ2VvdXQgdG8gY29tbWl0IHRyYW5zYWN0aW9ucyBvbiB0aGUgbG9nIHBhZ2UuCisJICovCisJYnAgPSAoc3RydWN0IGxidWYgKikgdGJsay0+YnA7CisJbHAgPSAoc3RydWN0IGxvZ3BhZ2UgKikgYnAtPmxfbGRhdGE7CisJLyogaXMgcGFnZSBhbHJlYWR5IGZ1bGwgPyAqLworCWlmICh0YmxrLT5mbGFnICYgdGJsa0dDX0VPUCkgeworCQkvKiBtYXJrIHBhZ2UgdG8gZnJlZSBhdCBlbmQgb2YgZ3JvdXAgY29tbWl0IG9mIHRoZSBwYWdlICovCisJCXRibGstPmZsYWcgJj0gfnRibGtHQ19FT1A7CisJCXRibGstPmZsYWcgfD0gdGJsa0dDX0ZSRUU7CisJCWJwLT5sX2Nlb3IgPSBicC0+bF9lb3I7CisJCWxwLT5oLmVvciA9IGxwLT50LmVvciA9IGNwdV90b19sZTE2KGJwLT5sX2Nlb3IpOworCQlsYm1Xcml0ZShsb2csIGJwLCBsYm1XUklURSB8IGxibVJFTEVBU0UgfCBsYm1HQywKKwkJCSBjYW50X3dyaXRlKTsKKwkJSU5DUkVNRU5UKGxtU3RhdC5mdWxsX3BhZ2UpOworCX0KKwkvKiBwYWdlIGlzIG5vdCB5ZXQgZnVsbCAqLworCWVsc2UgeworCQlicC0+bF9jZW9yID0gdGJsay0+ZW9yOwkvKiA/IGJwLT5sX2Nlb3IgPSBicC0+bF9lb3I7ICovCisJCWxwLT5oLmVvciA9IGxwLT50LmVvciA9IGNwdV90b19sZTE2KGJwLT5sX2Nlb3IpOworCQlsYm1Xcml0ZShsb2csIGJwLCBsYm1XUklURSB8IGxibUdDLCBjYW50X3dyaXRlKTsKKwkJSU5DUkVNRU5UKGxtU3RhdC5wYXJ0aWFsX3BhZ2UpOworCX0KK30KKworLyoKKyAqIE5BTUU6CWxtUG9zdEdDKCkKKyAqCisgKiBGVU5DVElPTjoJZ3JvdXAgY29tbWl0IHBvc3QtcHJvY2Vzc2luZworICoJUHJvY2Vzc2VzIHRyYW5zYWN0aW9ucyBhZnRlciB0aGVpciBjb21taXQgcmVjb3JkcyBoYXZlIGJlZW4gd3JpdHRlbgorICoJdG8gZGlzaywgcmVkcml2aW5nIGxvZyBJL08gaWYgbmVjZXNzYXJ5LgorICoKKyAqIFJFVFVSTjoJTm9uZQorICoKKyAqIE5PVEU6CisgKglUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGEgaW50ZXJydXB0IHRpbWUgYnkgbGJtSU9Eb25lCisgKi8KK3N0YXRpYyB2b2lkIGxtUG9zdEdDKHN0cnVjdCBsYnVmICogYnApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgamZzX2xvZyAqbG9nID0gYnAtPmxfbG9nOworCXN0cnVjdCBsb2dwYWdlICpscDsKKwlzdHJ1Y3QgdGJsb2NrICp0YmxrLCAqdGVtcDsKKworCS8vTE9HR0NfTE9DSyhsb2cpOworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2ctPmdjbG9jaywgZmxhZ3MpOworCS8qCisJICogY3VycmVudCBwYWdlb3V0IG9mIGdyb3VwIGNvbW1pdCBjb21wbGV0ZWQuCisJICoKKwkgKiByZW1vdmUvd2FrZXVwIHRyYW5zYWN0aW9ucyBmcm9tIGNvbW1pdCBxdWV1ZSB3aG8gd2VyZQorCSAqIGdyb3VwIGNvbW1pdHRlZCB3aXRoIHRoZSBjdXJyZW50IGxvZyBwYWdlCisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRibGssIHRlbXAsICZsb2ctPmNxdWV1ZSwgY3F1ZXVlKSB7CisJCWlmICghKHRibGstPmZsYWcgJiB0YmxrR0NfQ09NTUlUKSkKKwkJCWJyZWFrOworCQkvKiBpZiB0cmFuc2FjdGlvbiB3YXMgbWFya2VkIEdDX0NPTU1JVCB0aGVuCisJCSAqIGl0IGhhcyBiZWVuIHNoaXBwZWQgaW4gdGhlIGN1cnJlbnQgcGFnZW91dAorCQkgKiBhbmQgbWFkZSBpdCB0byBkaXNrIC0gaXQgaXMgY29tbWl0dGVkLgorCQkgKi8KKworCQlpZiAoYnAtPmxfZmxhZyAmIGxibUVSUk9SKQorCQkJdGJsay0+ZmxhZyB8PSB0YmxrR0NfRVJST1I7CisKKwkJLyogcmVtb3ZlIGl0IGZyb20gdGhlIGNvbW1pdCBxdWV1ZSAqLworCQlsaXN0X2RlbCgmdGJsay0+Y3F1ZXVlKTsKKwkJdGJsay0+ZmxhZyAmPSB+dGJsa0dDX1FVRVVFOworCisJCWlmICh0YmxrID09IGxvZy0+Zmx1c2hfdGJsaykgeworCQkJLyogd2UgY2FuIHN0b3AgZmx1c2hpbmcgdGhlIGxvZyBub3cgKi8KKwkJCWNsZWFyX2JpdChsb2dfRkxVU0gsICZsb2ctPmZsYWcpOworCQkJbG9nLT5mbHVzaF90YmxrID0gTlVMTDsKKwkJfQorCisJCWpmc19pbmZvKCJsbVBvc3RHQzogdGJsayA9IDB4JXAsIGZsYWcgPSAweCV4IiwgdGJsaywKKwkJCSB0YmxrLT5mbGFnKTsKKworCQlpZiAoISh0YmxrLT54ZmxhZyAmIENPTU1JVF9GT1JDRSkpCisJCQkvKgorCQkJICogSGFuZCB0YmxrIG92ZXIgdG8gbGF6eSBjb21taXQgdGhyZWFkCisJCQkgKi8KKwkJCXR4TGF6eVVubG9jayh0YmxrKTsKKwkJZWxzZSB7CisJCQkvKiBzdGF0ZSB0cmFuc2l0aW9uOiBDT01NSVQgLT4gQ09NTUlUVEVEICovCisJCQl0YmxrLT5mbGFnIHw9IHRibGtHQ19DT01NSVRURUQ7CisKKwkJCWlmICh0YmxrLT5mbGFnICYgdGJsa0dDX1JFQURZKQorCQkJCWxvZy0+Z2NydGMtLTsKKworCQkJTE9HR0NfV0FLRVVQKHRibGspOworCQl9CisKKwkJLyogd2FzIHBhZ2UgZnVsbCBiZWZvcmUgcGFnZW91dCA/CisJCSAqIChhbmQgdGhpcyBpcyB0aGUgbGFzdCB0YmxrIGJvdW5kIHdpdGggdGhlIHBhZ2UpCisJCSAqLworCQlpZiAodGJsay0+ZmxhZyAmIHRibGtHQ19GUkVFKQorCQkJbGJtRnJlZShicCk7CisJCS8qIGRpZCBwYWdlIGJlY29tZSBmdWxsIGFmdGVyIHBhZ2VvdXQgPworCQkgKiAoYW5kIHRoaXMgaXMgdGhlIGxhc3QgdGJsayBib3VuZCB3aXRoIHRoZSBwYWdlKQorCQkgKi8KKwkJZWxzZSBpZiAodGJsay0+ZmxhZyAmIHRibGtHQ19FT1ApIHsKKwkJCS8qIGZpbmFsaXplIHRoZSBwYWdlICovCisJCQlscCA9IChzdHJ1Y3QgbG9ncGFnZSAqKSBicC0+bF9sZGF0YTsKKwkJCWJwLT5sX2Nlb3IgPSBicC0+bF9lb3I7CisJCQlscC0+aC5lb3IgPSBscC0+dC5lb3IgPSBjcHVfdG9fbGUxNihicC0+bF9lb3IpOworCQkJamZzX2luZm8oImxtUG9zdEdDOiBjYWxsaW5nIGxibVdyaXRlIik7CisJCQlsYm1Xcml0ZShsb2csIGJwLCBsYm1XUklURSB8IGxibVJFTEVBU0UgfCBsYm1GUkVFLAorCQkJCSAxKTsKKwkJfQorCisJfQorCisJLyogYXJlIHRoZXJlIGFueSB0cmFuc2FjdGlvbnMgd2hvIGhhdmUgZW50ZXJlZCBsbkdyb3VwQ29tbWl0KCkKKwkgKiAod2hvc2UgQ09NTUlUcyBhcmUgYWZ0ZXIgdGhhdCBvZiB0aGUgbGFzdCBsb2cgcGFnZSB3cml0dGVuLgorCSAqIFRoZXkgYXJlIHdhaXRpbmcgZm9yIG5ldyBncm91cCBjb21taXQgKGFib3ZlIGF0IChTTEVFUCAxKSkKKwkgKiBvciBsYXp5IHRyYW5zYWN0aW9ucyBhcmUgb24gYSBmdWxsIChxdWV1ZWQpIGxvZyBwYWdlLAorCSAqIHNlbGVjdCB0aGUgbGF0ZXN0IHJlYWR5IHRyYW5zYWN0aW9uIGFzIG5ldyBncm91cCBsZWFkZXIgYW5kCisJICogd2FrZSBoZXIgdXAgdG8gbGVhZCBoZXIgZ3JvdXAuCisJICovCisJaWYgKCghbGlzdF9lbXB0eSgmbG9nLT5jcXVldWUpKSAmJgorCSAgICAoKGxvZy0+Z2NydGMgPiAwKSB8fCAodGJsay0+YnAtPmxfd3FuZXh0ICE9IE5VTEwpIHx8CisJICAgICB0ZXN0X2JpdChsb2dfRkxVU0gsICZsb2ctPmZsYWcpIHx8IGpmc190bG9ja3NfbG93KSkKKwkJLyoKKwkJICogQ2FsbCBsbUdDd3JpdGUgd2l0aCBuZXcgZ3JvdXAgbGVhZGVyCisJCSAqLworCQlsbUdDd3JpdGUobG9nLCAxKTsKKworCS8qIG5vIHRyYW5zYWN0aW9uIGFyZSByZWFkeSB5ZXQgKHRyYW5zYWN0aW9ucyBhcmUgb25seSBqdXN0CisJICogcXVldWVkIChHQ19RVUVVRSkgYW5kIG5vdCBlbnRlcmVkIGZvciBncm91cCBjb21taXQgeWV0KS4KKwkgKiB0aGUgZmlyc3QgdHJhbnNhY3Rpb24gZW50ZXJpbmcgZ3JvdXAgY29tbWl0CisJICogd2lsbCBlbGVjdCBoZXJzZWxmIGFzIG5ldyBncm91cCBsZWFkZXIuCisJICovCisJZWxzZQorCQlsb2ctPmNmbGFnICY9IH5sb2dHQ19QQUdFT1VUOworCisJLy9MT0dHQ19VTkxPQ0sobG9nKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2ctPmdjbG9jaywgZmxhZ3MpOworCXJldHVybjsKK30KKworLyoKKyAqIE5BTUU6CWxtTG9nU3luYygpCisgKgorICogRlVOQ1RJT046CXdyaXRlIGxvZyBTWU5DUFQgcmVjb3JkIGZvciBzcGVjaWZpZWQgbG9nCisgKglpZiBuZXcgc3luYyBhZGRyZXNzIGlzIGF2YWlsYWJsZQorICoJKG5vcm1hbGx5IHRoZSBjYXNlIGlmIHN5bmMoKSBpcyBleGVjdXRlZCBieSBiYWNrLWdyb3VuZAorICoJcHJvY2VzcykuCisgKglpZiBub3QsIGV4cGxpY2l0bHkgcnVuIGpmc19ibG9nc3luYygpIHRvIGluaXRpYXRlCisgKglnZXR0aW5nIG9mIG5ldyBzeW5jIGFkZHJlc3MuCisgKgljYWxjdWxhdGUgbmV3IHZhbHVlIG9mIGlfbmV4dHN5bmMgd2hpY2ggZGV0ZXJtaW5lcyB3aGVuCisgKgl0aGlzIGNvZGUgaXMgY2FsbGVkIGFnYWluLgorICoKKyAqCXRoaXMgaXMgY2FsbGVkIG9ubHkgZnJvbSBsbUxvZygpLgorICoKKyAqIFBBUkFNRVRFUjoJaXAJLSBwb2ludGVyIHRvIGxvZ3MgaW5vZGUuCisgKgorICogUkVUVVJOOgkwCisgKgkJCQorICogc2VyaWFsaXphdGlvbjogTE9HX0xPQ0soKSBoZWxkIG9uIGVudHJ5L2V4aXQKKyAqLworc3RhdGljIGludCBsbUxvZ1N5bmMoc3RydWN0IGpmc19sb2cgKiBsb2csIGludCBub3N5bmN3YWl0KQoreworCWludCBsb2dzaXplOworCWludCB3cml0dGVuOwkJLyogd3JpdHRlbiBzaW5jZSBsYXN0IHN5bmNwdCAqLworCWludCBmcmVlOwkJLyogZnJlZSBzcGFjZSBsZWZ0IGF2YWlsYWJsZSAqLworCWludCBkZWx0YTsJCS8qIGFkZGl0aW9uYWwgZGVsdGEgdG8gd3JpdGUgbm9ybWFsbHkgKi8KKwlpbnQgbW9yZTsJCS8qIGFkZGl0aW9uYWwgd3JpdGUgZ3JhbnRlZCAqLworCXN0cnVjdCBscmQgbHJkOworCWludCBsc247CisJc3RydWN0IGxvZ3N5bmNibGsgKmxwOworCisJLyoKKwkgKiAgICAgIGZvcndhcmQgc3luY3B0CisJICovCisJLyogaWYgbGFzdCBzeW5jIGlzIHNhbWUgYXMgbGFzdCBzeW5jcHQsCisJICogaW52b2tlIHN5bmMgcG9pbnQgZm9yd2FyZCBwcm9jZXNzaW5nIHRvIHVwZGF0ZSBzeW5jLgorCSAqLworCisJaWYgKGxvZy0+c3luYyA9PSBsb2ctPnN5bmNwdCkgeworCQlMT0dTWU5DX0xPQ0sobG9nKTsKKwkJLyogVG9EbzogcHVzaCBkaXJ0eSBtZXRhcGFnZXMgb3V0IHRvIGRpc2sgKi8KKy8vICAgICAgICAgICAgICBibUxvZ1N5bmMobG9nKTsKKworCQlpZiAobGlzdF9lbXB0eSgmbG9nLT5zeW5jbGlzdCkpCisJCQlsb2ctPnN5bmMgPSBsb2ctPmxzbjsKKwkJZWxzZSB7CisJCQlscCA9IGxpc3RfZW50cnkobG9nLT5zeW5jbGlzdC5uZXh0LAorCQkJCQlzdHJ1Y3QgbG9nc3luY2Jsaywgc3luY2xpc3QpOworCQkJbG9nLT5zeW5jID0gbHAtPmxzbjsKKwkJfQorCQlMT0dTWU5DX1VOTE9DSyhsb2cpOworCisJfQorCisJLyogaWYgc3luYyBpcyBkaWZmZXJlbnQgZnJvbSBsYXN0IHN5bmNwdCwKKwkgKiB3cml0ZSBhIFNZTkNQVCByZWNvcmQgd2l0aCBzeW5jcHQgPSBzeW5jLgorCSAqIHJlc2V0IHN5bmNwdCA9IHN5bmMKKwkgKi8KKwlpZiAobG9nLT5zeW5jICE9IGxvZy0+c3luY3B0KSB7CisJCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpOworCisJCS8qCisJCSAqIFdlIG5lZWQgdG8gbWFrZSBzdXJlIGFsbCBvZiB0aGUgIndyaXR0ZW4iIG1ldGFwYWdlcworCQkgKiBhY3R1YWxseSBtYWtlIGl0IHRvIGRpc2sKKwkJICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoc2JpLCAmbG9nLT5zYl9saXN0LCBsb2dfbGlzdCkgeworCQkJaWYgKHNiaS0+ZmxhZyAmIEpGU19OT0lOVEVHUklUWSkKKwkJCQljb250aW51ZTsKKwkJCWZpbGVtYXBfZmRhdGF3cml0ZShzYmktPmlwYm1hcC0+aV9tYXBwaW5nKTsKKwkJCWZpbGVtYXBfZmRhdGF3cml0ZShzYmktPmlwaW1hcC0+aV9tYXBwaW5nKTsKKwkJCWZpbGVtYXBfZmRhdGF3cml0ZShzYmktPnNiLT5zX2JkZXYtPmJkX2lub2RlLT5pX21hcHBpbmcpOworCQl9CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoc2JpLCAmbG9nLT5zYl9saXN0LCBsb2dfbGlzdCkgeworCQkJaWYgKHNiaS0+ZmxhZyAmIEpGU19OT0lOVEVHUklUWSkKKwkJCQljb250aW51ZTsKKwkJCWZpbGVtYXBfZmRhdGF3YWl0KHNiaS0+aXBibWFwLT5pX21hcHBpbmcpOworCQkJZmlsZW1hcF9mZGF0YXdhaXQoc2JpLT5pcGltYXAtPmlfbWFwcGluZyk7CisJCQlmaWxlbWFwX2ZkYXRhd2FpdChzYmktPnNiLT5zX2JkZXYtPmJkX2lub2RlLT5pX21hcHBpbmcpOworCQl9CisKKwkJbHJkLmxvZ3RpZCA9IDA7CisJCWxyZC5iYWNrY2hhaW4gPSAwOworCQlscmQudHlwZSA9IGNwdV90b19sZTE2KExPR19TWU5DUFQpOworCQlscmQubGVuZ3RoID0gMDsKKwkJbHJkLmxvZy5zeW5jcHQuc3luYyA9IGNwdV90b19sZTMyKGxvZy0+c3luYyk7CisJCWxzbiA9IGxtV3JpdGVSZWNvcmQobG9nLCBOVUxMLCAmbHJkLCBOVUxMKTsKKworCQlsb2ctPnN5bmNwdCA9IGxvZy0+c3luYzsKKwl9IGVsc2UKKwkJbHNuID0gbG9nLT5sc247CisKKwkvKgorCSAqICAgICAgc2V0dXAgbmV4dCBzeW5jcHQgdHJpZ2dlciAoU1dBRykKKwkgKi8KKwlsb2dzaXplID0gbG9nLT5sb2dzaXplOworCisJbG9nZGlmZih3cml0dGVuLCBsc24sIGxvZyk7CisJZnJlZSA9IGxvZ3NpemUgLSB3cml0dGVuOworCWRlbHRhID0gTE9HU1lOQ19ERUxUQShsb2dzaXplKTsKKwltb3JlID0gbWluKGZyZWUgLyAyLCBkZWx0YSk7CisJaWYgKG1vcmUgPCAyICogTE9HUFNJWkUpIHsKKwkJamZzX3dhcm4oIlxuIC4uLiBMb2cgV3JhcCAuLi4gTG9nIFdyYXAgLi4uIExvZyBXcmFwIC4uLlxuIik7CisJCS8qCisJCSAqICAgICAgbG9nIHdyYXBwaW5nCisJCSAqCisJCSAqIG9wdGlvbiAxIC0gcGFuaWMgPyBOby4hCisJCSAqIG9wdGlvbiAyIC0gc2h1dGRvd24gZmlsZSBzeXN0ZW1zCisJCSAqICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIGxvZyA/CisJCSAqIG9wdGlvbiAzIC0gZXh0ZW5kIGxvZyA/CisJCSAqLworCQkvKgorCQkgKiBvcHRpb24gNCAtIHNlY29uZCBjaGFuY2UKKwkJICoKKwkJICogbWFyayBsb2cgd3JhcHBlZCwgYW5kIGNvbnRpbnVlLgorCQkgKiB3aGVuIGFsbCBhY3RpdmUgdHJhbnNhY3Rpb25zIGFyZSBjb21wbGV0ZWQsCisJCSAqIG1hcmsgbG9nIHZhaWxkIGZvciByZWNvdmVyeS4KKwkJICogaWYgY3Jhc2hlZCBkdXJpbmcgaW52YWxpZCBzdGF0ZSwgbG9nIHN0YXRlCisJCSAqIGltcGxpZXMgaW52YWxkIGxvZywgZm9yY2luZyBmc2NrKCkuCisJCSAqLworCQkvKiBtYXJrIGxvZyBzdGF0ZSBsb2cgd3JhcCBpbiBsb2cgc3VwZXJibG9jayAqLworCQkvKiBsb2ctPnN0YXRlID0gTE9HV1JBUDsgKi8KKworCQkvKiByZXNldCBzeW5jIHBvaW50IGNvbXB1dGF0aW9uICovCisJCWxvZy0+c3luY3B0ID0gbG9nLT5zeW5jID0gbHNuOworCQlsb2ctPm5leHRzeW5jID0gZGVsdGE7CisJfSBlbHNlCisJCS8qIG5leHQgc3luY3B0IHRyaWdnZXIgPSB3cml0dGVuICsgbW9yZSAqLworCQlsb2ctPm5leHRzeW5jID0gd3JpdHRlbiArIG1vcmU7CisKKwkvKiByZXR1cm4gaWYgbG1Mb2dTeW5jKCkgZnJvbSBvdXRzaWRlIG9mIHRyYW5zYWN0aW9uLCBlLmcuLCBzeW5jKCkgKi8KKwlpZiAobm9zeW5jd2FpdCkKKwkJcmV0dXJuIGxzbjsKKworCS8qIGlmIG51bWJlciBvZiBieXRlcyB3cml0dGVuIGZyb20gbGFzdCBzeW5jIHBvaW50IGlzIG1vcmUKKwkgKiB0aGFuIDEvNCBvZiB0aGUgbG9nIHNpemUsIHN0b3AgbmV3IHRyYW5zYWN0aW9ucyBmcm9tCisJICogc3RhcnRpbmcgdW50aWwgYWxsIGN1cnJlbnQgdHJhbnNhY3Rpb25zIGFyZSBjb21wbGV0ZWQKKwkgKiBieSBzZXR0aW5nIHN5bmNiYXJyaWVyIGZsYWcuCisJICovCisJaWYgKHdyaXR0ZW4gPiBMT0dTWU5DX0JBUlJJRVIobG9nc2l6ZSkgJiYgbG9nc2l6ZSA+IDMyICogTE9HUFNJWkUpIHsKKwkJc2V0X2JpdChsb2dfU1lOQ0JBUlJJRVIsICZsb2ctPmZsYWcpOworCQlqZnNfaW5mbygibG9nIGJhcnJpZXIgb246IGxzbj0weCV4IHN5bmNwdD0weCV4IiwgbHNuLAorCQkJIGxvZy0+c3luY3B0KTsKKwkJLyoKKwkJICogV2UgbWF5IGhhdmUgdG8gaW5pdGlhdGUgZ3JvdXAgY29tbWl0CisJCSAqLworCQlqZnNfZmx1c2hfam91cm5hbChsb2csIDApOworCX0KKworCXJldHVybiBsc247Cit9CisKKworLyoKKyAqIE5BTUU6CWxtTG9nT3BlbigpCisgKgorICogRlVOQ1RJT046ICAgIG9wZW4gdGhlIGxvZyBvbiBmaXJzdCBvcGVuOworICoJaW5zZXJ0IGZpbGVzeXN0ZW0gaW4gdGhlIGFjdGl2ZSBsaXN0IG9mIHRoZSBsb2cuCisgKgorICogUEFSQU1FVEVSOglpcG1udAktIGZpbGUgc3lzdGVtIG1vdW50IGlub2RlCisgKgkJaXBsb2cgCS0gbG9nIGlub2RlIChvdXQpCisgKgorICogUkVUVVJOOgorICoKKyAqIHNlcmlhbGl6YXRpb246CisgKi8KK2ludCBsbUxvZ09wZW4oc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlpbnQgcmM7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKKwlzdHJ1Y3QgamZzX2xvZyAqbG9nOworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpID0gSkZTX1NCSShzYik7CisKKwlpZiAoc2JpLT5mbGFnICYgSkZTX05PSU5URUdSSVRZKQorCQlyZXR1cm4gb3Blbl9kdW1teV9sb2coc2IpOworCQorCWlmIChzYmktPm1udGZsYWcgJiBKRlNfSU5MSU5FTE9HKQorCQlyZXR1cm4gb3Blbl9pbmxpbmVfbG9nKHNiKTsKKworCWRvd24oJmpmc19sb2dfc2VtKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvZywgJmpmc19leHRlcm5hbF9sb2dzLCBqb3VybmFsX2xpc3QpIHsKKwkJaWYgKGxvZy0+YmRldi0+YmRfZGV2ID09IHNiaS0+bG9nZGV2KSB7CisJCQlpZiAobWVtY21wKGxvZy0+dXVpZCwgc2JpLT5sb2d1dWlkLAorCQkJCSAgIHNpemVvZihsb2ctPnV1aWQpKSkgeworCQkJCWpmc193YXJuKCJ3cm9uZyB1dWlkIG9uIEpGUyBqb3VybmFsXG4iKTsKKwkJCQl1cCgmamZzX2xvZ19zZW0pOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJLyoKKwkJCSAqIGFkZCBmaWxlIHN5c3RlbSB0byBsb2cgYWN0aXZlIGZpbGUgc3lzdGVtIGxpc3QKKwkJCSAqLworCQkJaWYgKChyYyA9IGxtTG9nRmlsZVN5c3RlbShsb2csIHNiaSwgMSkpKSB7CisJCQkJdXAoJmpmc19sb2dfc2VtKTsKKwkJCQlyZXR1cm4gcmM7CisJCQl9CisJCQlnb3RvIGpvdXJuYWxfZm91bmQ7CisJCX0KKwl9CisKKwlpZiAoIShsb2cgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgamZzX2xvZyksIEdGUF9LRVJORUwpKSkgeworCQl1cCgmamZzX2xvZ19zZW0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGxvZywgMCwgc2l6ZW9mKHN0cnVjdCBqZnNfbG9nKSk7CisJSU5JVF9MSVNUX0hFQUQoJmxvZy0+c2JfbGlzdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmbG9nLT5zeW5jd2FpdCk7CisKKwkvKgorCSAqICAgICAgZXh0ZXJuYWwgbG9nIGFzIHNlcGFyYXRlIGxvZ2ljYWwgdm9sdW1lCisJICoKKwkgKiBmaWxlIHN5c3RlbXMgdG8gbG9nIG1heSBoYXZlIG4tdG8tMSByZWxhdGlvbnNoaXA7CisJICovCisKKwliZGV2ID0gb3Blbl9ieV9kZXZudW0oc2JpLT5sb2dkZXYsIEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpOworCWlmIChJU19FUlIoYmRldikpIHsKKwkJcmMgPSAtUFRSX0VSUihiZGV2KTsKKwkJZ290byBmcmVlOworCX0KKworCWlmICgocmMgPSBiZF9jbGFpbShiZGV2LCBsb2cpKSkgeworCQlnb3RvIGNsb3NlOworCX0KKworCWxvZy0+YmRldiA9IGJkZXY7CisJbWVtY3B5KGxvZy0+dXVpZCwgc2JpLT5sb2d1dWlkLCBzaXplb2YobG9nLT51dWlkKSk7CisJCisJLyoKKwkgKiBpbml0aWFsaXplIGxvZzoKKwkgKi8KKwlpZiAoKHJjID0gbG1Mb2dJbml0KGxvZykpKQorCQlnb3RvIHVuY2xhaW07CisKKwlsaXN0X2FkZCgmbG9nLT5qb3VybmFsX2xpc3QsICZqZnNfZXh0ZXJuYWxfbG9ncyk7CisKKwkvKgorCSAqIGFkZCBmaWxlIHN5c3RlbSB0byBsb2cgYWN0aXZlIGZpbGUgc3lzdGVtIGxpc3QKKwkgKi8KKwlpZiAoKHJjID0gbG1Mb2dGaWxlU3lzdGVtKGxvZywgc2JpLCAxKSkpCisJCWdvdG8gc2h1dGRvd247CisKK2pvdXJuYWxfZm91bmQ6CisJTE9HX0xPQ0sobG9nKTsKKwlsaXN0X2FkZCgmc2JpLT5sb2dfbGlzdCwgJmxvZy0+c2JfbGlzdCk7CisJc2JpLT5sb2cgPSBsb2c7CisJTE9HX1VOTE9DSyhsb2cpOworCisJdXAoJmpmc19sb2dfc2VtKTsKKwlyZXR1cm4gMDsKKworCS8qCisJICogICAgICB1bndpbmQgb24gZXJyb3IKKwkgKi8KKyAgICAgIHNodXRkb3duOgkJLyogdW53aW5kIGxibUxvZ0luaXQoKSAqLworCWxpc3RfZGVsKCZsb2ctPmpvdXJuYWxfbGlzdCk7CisJbGJtTG9nU2h1dGRvd24obG9nKTsKKworICAgICAgdW5jbGFpbToKKwliZF9yZWxlYXNlKGJkZXYpOworCisgICAgICBjbG9zZToJCS8qIGNsb3NlIGV4dGVybmFsIGxvZyBkZXZpY2UgKi8KKwlibGtkZXZfcHV0KGJkZXYpOworCisgICAgICBmcmVlOgkJLyogZnJlZSBsb2cgZGVzY3JpcHRvciAqLworCXVwKCZqZnNfbG9nX3NlbSk7CisJa2ZyZWUobG9nKTsKKworCWpmc193YXJuKCJsbUxvZ09wZW46IGV4aXQoJWQpIiwgcmMpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBvcGVuX2lubGluZV9sb2coc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgamZzX2xvZyAqbG9nOworCWludCByYzsKKworCWlmICghKGxvZyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBqZnNfbG9nKSwgR0ZQX0tFUk5FTCkpKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQobG9nLCAwLCBzaXplb2Yoc3RydWN0IGpmc19sb2cpKTsKKwlJTklUX0xJU1RfSEVBRCgmbG9nLT5zYl9saXN0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZsb2ctPnN5bmN3YWl0KTsKKworCXNldF9iaXQobG9nX0lOTElORUxPRywgJmxvZy0+ZmxhZyk7CisJbG9nLT5iZGV2ID0gc2ItPnNfYmRldjsKKwlsb2ctPmJhc2UgPSBhZGRyZXNzUFhEKCZKRlNfU0JJKHNiKS0+bG9ncHhkKTsKKwlsb2ctPnNpemUgPSBsZW5ndGhQWEQoJkpGU19TQkkoc2IpLT5sb2dweGQpID4+CisJICAgIChMMkxPR1BTSVpFIC0gc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCWxvZy0+bDJic2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCUFTU0VSVChMMkxPR1BTSVpFID49IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKworCS8qCisJICogaW5pdGlhbGl6ZSBsb2cuCisJICovCisJaWYgKChyYyA9IGxtTG9nSW5pdChsb2cpKSkgeworCQlrZnJlZShsb2cpOworCQlqZnNfd2FybigibG1Mb2dPcGVuOiBleGl0KCVkKSIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWxpc3RfYWRkKCZKRlNfU0JJKHNiKS0+bG9nX2xpc3QsICZsb2ctPnNiX2xpc3QpOworCUpGU19TQkkoc2IpLT5sb2cgPSBsb2c7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgb3Blbl9kdW1teV9sb2coc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlpbnQgcmM7CisKKwlkb3duKCZqZnNfbG9nX3NlbSk7CisJaWYgKCFkdW1teV9sb2cpIHsKKwkJZHVtbXlfbG9nID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGpmc19sb2cpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFkdW1teV9sb2cpIHsKKwkJCXVwKCZqZnNfbG9nX3NlbSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQltZW1zZXQoZHVtbXlfbG9nLCAwLCBzaXplb2Yoc3RydWN0IGpmc19sb2cpKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmR1bW15X2xvZy0+c2JfbGlzdCk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmR1bW15X2xvZy0+c3luY3dhaXQpOworCQlkdW1teV9sb2ctPm5vX2ludGVncml0eSA9IDE7CisJCS8qIE1ha2UgdXAgc29tZSBzdHVmZiAqLworCQlkdW1teV9sb2ctPmJhc2UgPSAwOworCQlkdW1teV9sb2ctPnNpemUgPSAxMDI0OworCQlyYyA9IGxtTG9nSW5pdChkdW1teV9sb2cpOworCQlpZiAocmMpIHsKKwkJCWtmcmVlKGR1bW15X2xvZyk7CisJCQlkdW1teV9sb2cgPSBOVUxMOworCQkJdXAoJmpmc19sb2dfc2VtKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKworCUxPR19MT0NLKGR1bW15X2xvZyk7CisJbGlzdF9hZGQoJkpGU19TQkkoc2IpLT5sb2dfbGlzdCwgJmR1bW15X2xvZy0+c2JfbGlzdCk7CisJSkZTX1NCSShzYiktPmxvZyA9IGR1bW15X2xvZzsKKwlMT0dfVU5MT0NLKGR1bW15X2xvZyk7CisJdXAoJmpmc19sb2dfc2VtKTsKKworCXJldHVybiAwOworfQorCisvKgorICogTkFNRToJbG1Mb2dJbml0KCkKKyAqCisgKiBGVU5DVElPTjoJbG9nIGluaXRpYWxpemF0aW9uIGF0IGZpcnN0IGxvZyBvcGVuLgorICoKKyAqCWxvZ3JlZG8oKSAob3IgbG9nZm9ybWF0KCkpIHNob3VsZCBoYXZlIGJlZW4gcnVuIHByZXZpb3VzbHkuCisgKglpbml0aWFsaXplIHRoZSBsb2cgZnJvbSBsb2cgc3VwZXJibG9jay4KKyAqCXNldCB0aGUgbG9nIHN0YXRlIGluIHRoZSBzdXBlcmJsb2NrIHRvIExPR01PVU5UIGFuZAorICoJd3JpdGUgU1lOQ1BUIGxvZyByZWNvcmQuCisgKgkJCisgKiBQQVJBTUVURVI6CWxvZwktIGxvZyBzdHJ1Y3R1cmUKKyAqCisgKiBSRVRVUk46CTAJLSBpZiBvaworICoJCS1FSU5WQUwJLSBiYWQgbG9nIG1hZ2ljIG51bWJlciBvciBzdXBlcmJsb2NrIGRpcnR5CisgKgkJZXJyb3IgcmV0dXJuZWQgZnJvbSBsb2d3YWl0KCkKKyAqCQkJCisgKiBzZXJpYWxpemF0aW9uOiBzaW5nbGUgZmlyc3Qgb3BlbiB0aHJlYWQKKyAqLworaW50IGxtTG9nSW5pdChzdHJ1Y3QgamZzX2xvZyAqIGxvZykKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBscmQgbHJkOworCXN0cnVjdCBsb2dzdXBlciAqbG9nc3VwZXI7CisJc3RydWN0IGxidWYgKmJwc3VwZXI7CisJc3RydWN0IGxidWYgKmJwOworCXN0cnVjdCBsb2dwYWdlICpscDsKKwlpbnQgbHNuID0gMDsKKworCWpmc19pbmZvKCJsbUxvZ0luaXQ6IGxvZzoweCVwIiwgbG9nKTsKKworCS8qIGluaXRpYWxpemUgdGhlIGdyb3VwIGNvbW1pdCBzZXJpYWxpemF0aW9uIGxvY2sgKi8KKwlMT0dHQ19MT0NLX0lOSVQobG9nKTsKKworCS8qIGFsbG9jYXRlL2luaXRpYWxpemUgdGhlIGxvZyB3cml0ZSBzZXJpYWxpemF0aW9uIGxvY2sgKi8KKwlMT0dfTE9DS19JTklUKGxvZyk7CisKKwlMT0dTWU5DX0xPQ0tfSU5JVChsb2cpOworCisJSU5JVF9MSVNUX0hFQUQoJmxvZy0+c3luY2xpc3QpOworCisJSU5JVF9MSVNUX0hFQUQoJmxvZy0+Y3F1ZXVlKTsKKwlsb2ctPmZsdXNoX3RibGsgPSBOVUxMOworCisJbG9nLT5jb3VudCA9IDA7CisKKwkvKgorCSAqIGluaXRpYWxpemUgbG9nIGkvbworCSAqLworCWlmICgocmMgPSBsYm1Mb2dJbml0KGxvZykpKQorCQlyZXR1cm4gcmM7CisKKwlpZiAoIXRlc3RfYml0KGxvZ19JTkxJTkVMT0csICZsb2ctPmZsYWcpKQorCQlsb2ctPmwyYnNpemUgPSBMMkxPR1BTSVpFOworCQorCS8qIGNoZWNrIGZvciBkaXNhYmxlZCBqb3VybmFsaW5nIHRvIGRpc2sgKi8KKwlpZiAobG9nLT5ub19pbnRlZ3JpdHkpIHsKKwkJLyoKKwkJICogSm91cm5hbCBwYWdlcyB3aWxsIHN0aWxsIGJlIGZpbGxlZC4gIFdoZW4gdGhlIHRpbWUgY29tZXMKKwkJICogdG8gYWN0dWFsbHkgZG8gdGhlIEkvTywgdGhlIHdyaXRlIGlzIG5vdCBkb25lLCBhbmQgdGhlCisJCSAqIGVuZGlvIHJvdXRpbmUgaXMgY2FsbGVkIGRpcmVjdGx5LgorCQkgKi8KKwkJYnAgPSBsYm1BbGxvY2F0ZShsb2cgLCAwKTsKKwkJbG9nLT5icCA9IGJwOworCQlicC0+bF9wbiA9IGJwLT5sX2VvciA9IDA7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogdmFsaWRhdGUgbG9nIHN1cGVyYmxvY2sKKwkJICovCisJCWlmICgocmMgPSBsYm1SZWFkKGxvZywgMSwgJmJwc3VwZXIpKSkKKwkJCWdvdG8gZXJyb3V0MTA7CisKKwkJbG9nc3VwZXIgPSAoc3RydWN0IGxvZ3N1cGVyICopIGJwc3VwZXItPmxfbGRhdGE7CisKKwkJaWYgKGxvZ3N1cGVyLT5tYWdpYyAhPSBjcHVfdG9fbGUzMihMT0dNQUdJQykpIHsKKwkJCWpmc193YXJuKCIqKiogTG9nIEZvcm1hdCBFcnJvciAhICoqKiIpOworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byBlcnJvdXQyMDsKKwkJfQorCisJCS8qIGxvZ3JlZG8oKSBzaG91bGQgaGF2ZSBiZWVuIHJ1biBzdWNjZXNzZnVsbHkuICovCisJCWlmIChsb2dzdXBlci0+c3RhdGUgIT0gY3B1X3RvX2xlMzIoTE9HUkVET05FKSkgeworCQkJamZzX3dhcm4oIioqKiBMb2cgSXMgRGlydHkgISAqKioiKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyb3V0MjA7CisJCX0KKworCQkvKiBpbml0aWFsaXplIGxvZyBmcm9tIGxvZyBzdXBlcmJsb2NrICovCisJCWlmICh0ZXN0X2JpdChsb2dfSU5MSU5FTE9HLCZsb2ctPmZsYWcpKSB7CisJCQlpZiAobG9nLT5zaXplICE9IGxlMzJfdG9fY3B1KGxvZ3N1cGVyLT5zaXplKSkgeworCQkJCXJjID0gLUVJTlZBTDsKKwkJCQlnb3RvIGVycm91dDIwOworCQkJfQorCQkJamZzX2luZm8oImxtTG9nSW5pdDogaW5saW5lIGxvZzoweCVwIGJhc2U6MHglTHggIgorCQkJCSAic2l6ZToweCV4IiwgbG9nLAorCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKSBsb2ctPmJhc2UsIGxvZy0+c2l6ZSk7CisJCX0gZWxzZSB7CisJCQlpZiAobWVtY21wKGxvZ3N1cGVyLT51dWlkLCBsb2ctPnV1aWQsIDE2KSkgeworCQkJCWpmc193YXJuKCJ3cm9uZyB1dWlkIG9uIEpGUyBsb2cgZGV2aWNlIik7CisJCQkJZ290byBlcnJvdXQyMDsKKwkJCX0KKwkJCWxvZy0+c2l6ZSA9IGxlMzJfdG9fY3B1KGxvZ3N1cGVyLT5zaXplKTsKKwkJCWxvZy0+bDJic2l6ZSA9IGxlMzJfdG9fY3B1KGxvZ3N1cGVyLT5sMmJzaXplKTsKKwkJCWpmc19pbmZvKCJsbUxvZ0luaXQ6IGV4dGVybmFsIGxvZzoweCVwIGJhc2U6MHglTHggIgorCQkJCSAic2l6ZToweCV4IiwgbG9nLAorCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKSBsb2ctPmJhc2UsIGxvZy0+c2l6ZSk7CisJCX0KKworCQlsb2ctPnBhZ2UgPSBsZTMyX3RvX2NwdShsb2dzdXBlci0+ZW5kKSAvIExPR1BTSVpFOworCQlsb2ctPmVvciA9IGxlMzJfdG9fY3B1KGxvZ3N1cGVyLT5lbmQpIC0gKExPR1BTSVpFICogbG9nLT5wYWdlKTsKKworCQkvKgorCQkgKiBpbml0aWFsaXplIGZvciBsb2cgYXBwZW5kIHdyaXRlIG1vZGUKKwkJICovCisJCS8qIGVzdGFibGlzaCBjdXJyZW50L2VuZC1vZi1sb2cgcGFnZS9idWZmZXIgKi8KKwkJaWYgKChyYyA9IGxibVJlYWQobG9nLCBsb2ctPnBhZ2UsICZicCkpKQorCQkJZ290byBlcnJvdXQyMDsKKworCQlscCA9IChzdHJ1Y3QgbG9ncGFnZSAqKSBicC0+bF9sZGF0YTsKKworCQlqZnNfaW5mbygibG1Mb2dJbml0OiBsc246MHgleCBwYWdlOiVkIGVvcjolZDolZCIsCisJCQkgbGUzMl90b19jcHUobG9nc3VwZXItPmVuZCksIGxvZy0+cGFnZSwgbG9nLT5lb3IsCisJCQkgbGUxNl90b19jcHUobHAtPmguZW9yKSk7CisKKwkJbG9nLT5icCA9IGJwOworCQlicC0+bF9wbiA9IGxvZy0+cGFnZTsKKwkJYnAtPmxfZW9yID0gbG9nLT5lb3I7CisKKwkJLyogaWYgY3VycmVudCBwYWdlIGlzIGZ1bGwsIG1vdmUgb24gdG8gbmV4dCBwYWdlICovCisJCWlmIChsb2ctPmVvciA+PSBMT0dQU0laRSAtIExPR1BUTFJTSVpFKQorCQkJbG1OZXh0UGFnZShsb2cpOworCisJCS8qCisJCSAqIGluaXRpYWxpemUgbG9nIHN5bmNwb2ludAorCQkgKi8KKwkJLyoKKwkJICogd3JpdGUgdGhlIGZpcnN0IFNZTkNQVCByZWNvcmQgd2l0aCBzeW5jcG9pbnQgPSAwCisJCSAqIChpLmUuLCBsb2cgcmVkbyB1cCB0byBIRVJFICEpOworCQkgKiByZW1vdmUgY3VycmVudCBwYWdlIGZyb20gbGJtIHdyaXRlIHF1ZXVlIGF0IGVuZCBvZiBwYWdlb3V0CisJCSAqICh0byB3cml0ZSBsb2cgc3VwZXJibG9jayB1cGRhdGUpLCBidXQgZG8gbm90IHJlbGVhc2UgdG8KKwkJICogZnJlZWxpc3Q7CisJCSAqLworCQlscmQubG9ndGlkID0gMDsKKwkJbHJkLmJhY2tjaGFpbiA9IDA7CisJCWxyZC50eXBlID0gY3B1X3RvX2xlMTYoTE9HX1NZTkNQVCk7CisJCWxyZC5sZW5ndGggPSAwOworCQlscmQubG9nLnN5bmNwdC5zeW5jID0gMDsKKwkJbHNuID0gbG1Xcml0ZVJlY29yZChsb2csIE5VTEwsICZscmQsIE5VTEwpOworCQlicCA9IGxvZy0+YnA7CisJCWJwLT5sX2Nlb3IgPSBicC0+bF9lb3I7CisJCWxwID0gKHN0cnVjdCBsb2dwYWdlICopIGJwLT5sX2xkYXRhOworCQlscC0+aC5lb3IgPSBscC0+dC5lb3IgPSBjcHVfdG9fbGUxNihicC0+bF9lb3IpOworCQlsYm1Xcml0ZShsb2csIGJwLCBsYm1XUklURSB8IGxibVNZTkMsIDApOworCQlpZiAoKHJjID0gbGJtSU9XYWl0KGJwLCAwKSkpCisJCQlnb3RvIGVycm91dDMwOworCisJCS8qCisJCSAqIHVwZGF0ZS93cml0ZSBzdXBlcmJsb2NrCisJCSAqLworCQlsb2dzdXBlci0+c3RhdGUgPSBjcHVfdG9fbGUzMihMT0dNT1VOVCk7CisJCWxvZy0+c2VyaWFsID0gbGUzMl90b19jcHUobG9nc3VwZXItPnNlcmlhbCkgKyAxOworCQlsb2dzdXBlci0+c2VyaWFsID0gY3B1X3RvX2xlMzIobG9nLT5zZXJpYWwpOworCQlsYm1EaXJlY3RXcml0ZShsb2csIGJwc3VwZXIsIGxibVdSSVRFIHwgbGJtUkVMRUFTRSB8IGxibVNZTkMpOworCQlpZiAoKHJjID0gbGJtSU9XYWl0KGJwc3VwZXIsIGxibUZSRUUpKSkKKwkJCWdvdG8gZXJyb3V0MzA7CisJfQorCisJLyogaW5pdGlhbGl6ZSBsb2dzeW5jIHBhcmFtZXRlcnMgKi8KKwlsb2ctPmxvZ3NpemUgPSAobG9nLT5zaXplIC0gMikgPDwgTDJMT0dQU0laRTsKKwlsb2ctPmxzbiA9IGxzbjsKKwlsb2ctPnN5bmNwdCA9IGxzbjsKKwlsb2ctPnN5bmMgPSBsb2ctPnN5bmNwdDsKKwlsb2ctPm5leHRzeW5jID0gTE9HU1lOQ19ERUxUQShsb2ctPmxvZ3NpemUpOworCisJamZzX2luZm8oImxtTG9nSW5pdDogbHNuOjB4JXggc3luY3B0OjB4JXggc3luYzoweCV4IiwKKwkJIGxvZy0+bHNuLCBsb2ctPnN5bmNwdCwgbG9nLT5zeW5jKTsKKworCS8qCisJICogaW5pdGlhbGl6ZSBmb3IgbGF6eS9ncm91cCBjb21taXQKKwkgKi8KKwlsb2ctPmNsc24gPSBsc247CisKKwlyZXR1cm4gMDsKKworCS8qCisJICogICAgICB1bndpbmQgb24gZXJyb3IKKwkgKi8KKyAgICAgIGVycm91dDMwOgkJLyogcmVsZWFzZSBsb2cgcGFnZSAqLworCWxvZy0+d3F1ZXVlID0gTlVMTDsKKwlicC0+bF93cW5leHQgPSBOVUxMOworCWxibUZyZWUoYnApOworCisgICAgICBlcnJvdXQyMDoJCS8qIHJlbGVhc2UgbG9nIHN1cGVyYmxvY2sgKi8KKwlsYm1GcmVlKGJwc3VwZXIpOworCisgICAgICBlcnJvdXQxMDoJCS8qIHVud2luZCBsYm1Mb2dJbml0KCkgKi8KKwlsYm1Mb2dTaHV0ZG93bihsb2cpOworCisJamZzX3dhcm4oImxtTG9nSW5pdDogZXhpdCglZCkiLCByYyk7CisJcmV0dXJuIHJjOworfQorCisKKy8qCisgKiBOQU1FOglsbUxvZ0Nsb3NlKCkKKyAqCisgKiBGVU5DVElPTjoJcmVtb3ZlIGZpbGUgc3lzdGVtIDxpcG1udD4gZnJvbSBhY3RpdmUgbGlzdCBvZiBsb2cgPGlwbG9nPgorICoJCWFuZCBjbG9zZSBpdCBvbiBsYXN0IGNsb3NlLgorICoKKyAqIFBBUkFNRVRFUjoJc2IJLSBzdXBlcmJsb2NrCisgKgorICogUkVUVVJOOgllcnJvcnMgZnJvbSBzdWJyb3V0aW5lcworICoKKyAqIHNlcmlhbGl6YXRpb246CisgKi8KK2ludCBsbUxvZ0Nsb3NlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGpmc19zYl9pbmZvICpzYmkgPSBKRlNfU0JJKHNiKTsKKwlzdHJ1Y3QgamZzX2xvZyAqbG9nID0gc2JpLT5sb2c7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKKwlpbnQgcmMgPSAwOworCisJamZzX2luZm8oImxtTG9nQ2xvc2U6IGxvZzoweCVwIiwgbG9nKTsKKworCWRvd24oJmpmc19sb2dfc2VtKTsKKwlMT0dfTE9DSyhsb2cpOworCWxpc3RfZGVsKCZzYmktPmxvZ19saXN0KTsKKwlMT0dfVU5MT0NLKGxvZyk7CisJc2JpLT5sb2cgPSBOVUxMOworCisJLyoKKwkgKiBXZSBuZWVkIHRvIG1ha2Ugc3VyZSBhbGwgb2YgdGhlICJ3cml0dGVuIiBtZXRhcGFnZXMKKwkgKiBhY3R1YWxseSBtYWtlIGl0IHRvIGRpc2sKKwkgKi8KKwlzeW5jX2Jsb2NrZGV2KHNiLT5zX2JkZXYpOworCisJaWYgKHRlc3RfYml0KGxvZ19JTkxJTkVMT0csICZsb2ctPmZsYWcpKSB7CisJCS8qCisJCSAqICAgICAgaW4tbGluZSBsb2cgaW4gaG9zdCBmaWxlIHN5c3RlbQorCQkgKi8KKwkJcmMgPSBsbUxvZ1NodXRkb3duKGxvZyk7CisJCWtmcmVlKGxvZyk7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghbG9nLT5ub19pbnRlZ3JpdHkpCisJCWxtTG9nRmlsZVN5c3RlbShsb2csIHNiaSwgMCk7CisKKwlpZiAoIWxpc3RfZW1wdHkoJmxvZy0+c2JfbGlzdCkpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBUT0RPOiBlbnN1cmUgdGhhdCB0aGUgZHVtbXlfbG9nIGlzIGluIGEgc3RhdGUgdG8gYWxsb3cKKwkgKiBsYm1Mb2dTaHV0ZG93biB0byBkZWFsbG9jYXRlIGFsbCB0aGUgYnVmZmVycyBhbmQgY2FsbAorCSAqIGtmcmVlIGFnYWluc3QgZHVtbXlfbG9nLiAgRm9yIG5vdywgbGVhdmUgZHVtbXlfbG9nICYgaXRzCisJICogYnVmZmVycyBpbiBtZW1vcnksIGFuZCByZXN1c2UgaWYgYW5vdGhlciBuby1pbnRlZ3JpdHkgbW91bnQKKwkgKiBpcyByZXF1ZXN0ZWQuCisJICovCisJaWYgKGxvZy0+bm9faW50ZWdyaXR5KQorCQlnb3RvIG91dDsKKworCS8qCisJICogICAgICBleHRlcm5hbCBsb2cgYXMgc2VwYXJhdGUgbG9naWNhbCB2b2x1bWUKKwkgKi8KKwlsaXN0X2RlbCgmbG9nLT5qb3VybmFsX2xpc3QpOworCWJkZXYgPSBsb2ctPmJkZXY7CisJcmMgPSBsbUxvZ1NodXRkb3duKGxvZyk7CisKKwliZF9yZWxlYXNlKGJkZXYpOworCWJsa2Rldl9wdXQoYmRldik7CisKKwlrZnJlZShsb2cpOworCisgICAgICBvdXQ6CisJdXAoJmpmc19sb2dfc2VtKTsKKwlqZnNfaW5mbygibG1Mb2dDbG9zZTogZXhpdCglZCkiLCByYyk7CisJcmV0dXJuIHJjOworfQorCisKKy8qCisgKiBOQU1FOglqZnNfZmx1c2hfam91cm5hbCgpCisgKgorICogRlVOQ1RJT046CWluaXRpYXRlIHdyaXRlIG9mIGFueSBvdXRzdGFuZGluZyB0cmFuc2FjdGlvbnMgdG8gdGhlIGpvdXJuYWwKKyAqCQlhbmQgb3B0aW9uYWxseSB3YWl0IHVudGlsIHRoZXkgYXJlIGFsbCB3cml0dGVuIHRvIGRpc2sKKyAqCisgKgkJd2FpdCA9PSAwICBmbHVzaCB1bnRpbCBsYXRlc3QgdHhuIGlzIGNvbW1pdHRlZCwgZG9uJ3Qgd2FpdAorICoJCXdhaXQgPT0gMSAgZmx1c2ggdW50aWwgbGF0ZXN0IHR4biBpcyBjb21taXR0ZWQsIHdhaXQKKyAqCQl3YWl0ID4gMSAgIGZsdXNoIHVudGlsIGFsbCB0eG4ncyBhcmUgY29tcGxldGUsIHdhaXQKKyAqLwordm9pZCBqZnNfZmx1c2hfam91cm5hbChzdHJ1Y3QgamZzX2xvZyAqbG9nLCBpbnQgd2FpdCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgdGJsb2NrICp0YXJnZXQgPSBOVUxMOworCisJLyogamZzX3dyaXRlX2lub2RlIG1heSBjYWxsIHVzIGR1cmluZyByZWFkLW9ubHkgbW91bnQgKi8KKwlpZiAoIWxvZykKKwkJcmV0dXJuOworCisJamZzX2luZm8oImpmc19mbHVzaF9qb3VybmFsOiBsb2c6MHglcCB3YWl0PSVkIiwgbG9nLCB3YWl0KTsKKworCUxPR0dDX0xPQ0sobG9nKTsKKworCWlmICghbGlzdF9lbXB0eSgmbG9nLT5jcXVldWUpKSB7CisJCS8qCisJCSAqIFRoaXMgZW5zdXJlcyB0aGF0IHdlIHdpbGwga2VlcCB3cml0aW5nIHRvIHRoZSBqb3VybmFsIGFzIGxvbmcKKwkJICogYXMgdGhlcmUgYXJlIHVud3JpdHRlbiBjb21taXQgcmVjb3JkcworCQkgKi8KKwkJdGFyZ2V0ID0gbGlzdF9lbnRyeShsb2ctPmNxdWV1ZS5wcmV2LCBzdHJ1Y3QgdGJsb2NrLCBjcXVldWUpOworCisJCWlmICh0ZXN0X2JpdChsb2dfRkxVU0gsICZsb2ctPmZsYWcpKSB7CisJCQkvKgorCQkJICogV2UncmUgYWxyZWFkeSBmbHVzaGluZy4KKwkJCSAqIGlmIGZsdXNoX3RibGsgaXMgTlVMTCwgd2UgYXJlIGZsdXNoaW5nIGV2ZXJ5dGhpbmcsCisJCQkgKiBzbyBsZWF2ZSBpdCB0aGF0IHdheS4gIE90aGVyd2lzZSwgdXBkYXRlIGl0IHRvIHRoZQorCQkJICogbGF0ZXN0IHRyYW5zYWN0aW9uCisJCQkgKi8KKwkJCWlmIChsb2ctPmZsdXNoX3RibGspCisJCQkJbG9nLT5mbHVzaF90YmxrID0gdGFyZ2V0OworCQl9IGVsc2UgeworCQkJLyogT25seSBmbHVzaCB1bnRpbCBsYXRlc3QgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkICovCisJCQlsb2ctPmZsdXNoX3RibGsgPSB0YXJnZXQ7CisJCQlzZXRfYml0KGxvZ19GTFVTSCwgJmxvZy0+ZmxhZyk7CisKKwkJCS8qCisJCQkgKiBJbml0aWF0ZSBJL08gb24gb3V0c3RhbmRpbmcgdHJhbnNhY3Rpb25zCisJCQkgKi8KKwkJCWlmICghKGxvZy0+Y2ZsYWcgJiBsb2dHQ19QQUdFT1VUKSkgeworCQkJCWxvZy0+Y2ZsYWcgfD0gbG9nR0NfUEFHRU9VVDsKKwkJCQlsbUdDd3JpdGUobG9nLCAwKTsKKwkJCX0KKwkJfQorCX0KKwlpZiAoKHdhaXQgPiAxKSB8fCB0ZXN0X2JpdChsb2dfU1lOQ0JBUlJJRVIsICZsb2ctPmZsYWcpKSB7CisJCS8qIEZsdXNoIHVudGlsIGFsbCBhY3Rpdml0eSBjb21wbGV0ZSAqLworCQlzZXRfYml0KGxvZ19GTFVTSCwgJmxvZy0+ZmxhZyk7CisJCWxvZy0+Zmx1c2hfdGJsayA9IE5VTEw7CisJfQorCisJaWYgKHdhaXQgJiYgdGFyZ2V0ICYmICEodGFyZ2V0LT5mbGFnICYgdGJsa0dDX0NPTU1JVFRFRCkpIHsKKwkJREVDTEFSRV9XQUlUUVVFVUUoX193YWl0LCBjdXJyZW50KTsKKworCQlhZGRfd2FpdF9xdWV1ZSgmdGFyZ2V0LT5nY3dhaXQsICZfX3dhaXQpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCUxPR0dDX1VOTE9DSyhsb2cpOworCQlzY2hlZHVsZSgpOworCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwkJTE9HR0NfTE9DSyhsb2cpOworCQlyZW1vdmVfd2FpdF9xdWV1ZSgmdGFyZ2V0LT5nY3dhaXQsICZfX3dhaXQpOworCX0KKwlMT0dHQ19VTkxPQ0sobG9nKTsKKworCWlmICh3YWl0IDwgMikKKwkJcmV0dXJuOworCisJLyoKKwkgKiBJZiB0aGVyZSB3YXMgcmVjZW50IGFjdGl2aXR5LCB3ZSBtYXkgbmVlZCB0byB3YWl0CisJICogZm9yIHRoZSBsYXp5Y29tbWl0IHRocmVhZCB0byBjYXRjaCB1cAorCSAqLworCWlmICgoIWxpc3RfZW1wdHkoJmxvZy0+Y3F1ZXVlKSkgfHwgIWxpc3RfZW1wdHkoJmxvZy0+c3luY2xpc3QpKSB7CisJCWZvciAoaSA9IDA7IGkgPCA4MDA7IGkrKykgewkvKiBUb28gbXVjaD8gKi8KKwkJCW1zbGVlcCgyNTApOworCQkJaWYgKGxpc3RfZW1wdHkoJmxvZy0+Y3F1ZXVlKSAmJgorCQkJICAgIGxpc3RfZW1wdHkoJmxvZy0+c3luY2xpc3QpKQorCQkJCWJyZWFrOworCQl9CisJfQorCWFzc2VydChsaXN0X2VtcHR5KCZsb2ctPmNxdWV1ZSkpOworCWFzc2VydChsaXN0X2VtcHR5KCZsb2ctPnN5bmNsaXN0KSk7CisJY2xlYXJfYml0KGxvZ19GTFVTSCwgJmxvZy0+ZmxhZyk7Cit9CisKKy8qCisgKiBOQU1FOglsbUxvZ1NodXRkb3duKCkKKyAqCisgKiBGVU5DVElPTjoJbG9nIHNodXRkb3duIGF0IGxhc3QgTG9nQ2xvc2UoKS4KKyAqCisgKgkJd3JpdGUgbG9nIHN5bmNwdCByZWNvcmQuCisgKgkJdXBkYXRlIHN1cGVyIGJsb2NrIHRvIHNldCByZWRvbmUgZmxhZyB0byAwLgorICoKKyAqIFBBUkFNRVRFUjoJbG9nCS0gbG9nIGlub2RlCisgKgorICogUkVUVVJOOgkwCS0gc3VjY2VzcworICoJCQkKKyAqIHNlcmlhbGl6YXRpb246IHNpbmdsZSBsYXN0IGNsb3NlIHRocmVhZAorICovCitpbnQgbG1Mb2dTaHV0ZG93bihzdHJ1Y3QgamZzX2xvZyAqIGxvZykKK3sKKwlpbnQgcmM7CisJc3RydWN0IGxyZCBscmQ7CisJaW50IGxzbjsKKwlzdHJ1Y3QgbG9nc3VwZXIgKmxvZ3N1cGVyOworCXN0cnVjdCBsYnVmICpicHN1cGVyOworCXN0cnVjdCBsYnVmICpicDsKKwlzdHJ1Y3QgbG9ncGFnZSAqbHA7CisKKwlqZnNfaW5mbygibG1Mb2dTaHV0ZG93bjogbG9nOjB4JXAiLCBsb2cpOworCisJamZzX2ZsdXNoX2pvdXJuYWwobG9nLCAyKTsKKworCS8qCisJICogd3JpdGUgdGhlIGxhc3QgU1lOQ1BUIHJlY29yZCB3aXRoIHN5bmNwb2ludCA9IDAKKwkgKiAoaS5lLiwgbG9nIHJlZG8gdXAgdG8gSEVSRSAhKQorCSAqLworCWxyZC5sb2d0aWQgPSAwOworCWxyZC5iYWNrY2hhaW4gPSAwOworCWxyZC50eXBlID0gY3B1X3RvX2xlMTYoTE9HX1NZTkNQVCk7CisJbHJkLmxlbmd0aCA9IDA7CisJbHJkLmxvZy5zeW5jcHQuc3luYyA9IDA7CisJCisJbHNuID0gbG1Xcml0ZVJlY29yZChsb2csIE5VTEwsICZscmQsIE5VTEwpOworCWJwID0gbG9nLT5icDsKKwlscCA9IChzdHJ1Y3QgbG9ncGFnZSAqKSBicC0+bF9sZGF0YTsKKwlscC0+aC5lb3IgPSBscC0+dC5lb3IgPSBjcHVfdG9fbGUxNihicC0+bF9lb3IpOworCWxibVdyaXRlKGxvZywgbG9nLT5icCwgbGJtV1JJVEUgfCBsYm1SRUxFQVNFIHwgbGJtU1lOQywgMCk7CisJbGJtSU9XYWl0KGxvZy0+YnAsIGxibUZSRUUpOworCisJLyoKKwkgKiBzeW5jaHJvbm91cyB1cGRhdGUgbG9nIHN1cGVyYmxvY2sKKwkgKiBtYXJrIGxvZyBzdGF0ZSBhcyBzaHV0ZG93biBjbGVhbmx5CisJICogKGkuZS4sIExvZyBkb2VzIG5vdCBuZWVkIHRvIGJlIHJlcGxheWVkKS4KKwkgKi8KKwlpZiAoKHJjID0gbGJtUmVhZChsb2csIDEsICZicHN1cGVyKSkpCisJCWdvdG8gb3V0OworCisJbG9nc3VwZXIgPSAoc3RydWN0IGxvZ3N1cGVyICopIGJwc3VwZXItPmxfbGRhdGE7CisJbG9nc3VwZXItPnN0YXRlID0gY3B1X3RvX2xlMzIoTE9HUkVET05FKTsKKwlsb2dzdXBlci0+ZW5kID0gY3B1X3RvX2xlMzIobHNuKTsKKwlsYm1EaXJlY3RXcml0ZShsb2csIGJwc3VwZXIsIGxibVdSSVRFIHwgbGJtUkVMRUFTRSB8IGxibVNZTkMpOworCXJjID0gbGJtSU9XYWl0KGJwc3VwZXIsIGxibUZSRUUpOworCisJamZzX2luZm8oImxtTG9nU2h1dGRvd246IGxzbjoweCV4IHBhZ2U6JWQgZW9yOiVkIiwKKwkJIGxzbiwgbG9nLT5wYWdlLCBsb2ctPmVvcik7CisKKyAgICAgIG91dDogICAgCisJLyoKKwkgKiBzaHV0ZG93biBwZXIgbG9nIGkvbworCSAqLworCWxibUxvZ1NodXRkb3duKGxvZyk7CisKKwlpZiAocmMpIHsKKwkJamZzX3dhcm4oImxtTG9nU2h1dGRvd246IGV4aXQoJWQpIiwgcmMpOworCX0KKwlyZXR1cm4gcmM7Cit9CisKKworLyoKKyAqIE5BTUU6CWxtTG9nRmlsZVN5c3RlbSgpCisgKgorICogRlVOQ1RJT046CWluc2VydCAoPGFjdGl2YXRlPiA9IHRydWUpL3JlbW92ZSAoPGFjdGl2YXRlPiA9IGZhbHNlKQorICoJZmlsZSBzeXN0ZW0gaW50by9mcm9tIGxvZyBhY3RpdmUgZmlsZSBzeXN0ZW0gbGlzdC4KKyAqCisgKiBQQVJBTUVURToJbG9nCS0gcG9pbnRlciB0byBsb2dzIGlub2RlLgorICoJCWZzZGV2CS0ga2Rldl90IG9mIGZpbGVzeXN0ZW0uCisgKgkJc2VyaWFsICAtIHBvaW50ZXIgdG8gcmV0dXJuZWQgbG9nIHNlcmlhbCBudW1iZXIKKyAqCQlhY3RpdmF0ZSAtIGluc2VydC9yZW1vdmUgZGV2aWNlIGZyb20gYWN0aXZlIGxpc3QuCisgKgorICogUkVUVVJOOgkwCS0gc3VjY2VzcworICoJCWVycm9ycyByZXR1cm5lZCBieSB2bXNfaW93YWl0KCkuCisgKi8KK3N0YXRpYyBpbnQgbG1Mb2dGaWxlU3lzdGVtKHN0cnVjdCBqZnNfbG9nICogbG9nLCBzdHJ1Y3QgamZzX3NiX2luZm8gKnNiaSwKKwkJCSAgIGludCBhY3RpdmF0ZSkKK3sKKwlpbnQgcmMgPSAwOworCWludCBpOworCXN0cnVjdCBsb2dzdXBlciAqbG9nc3VwZXI7CisJc3RydWN0IGxidWYgKmJwc3VwZXI7CisJY2hhciAqdXVpZCA9IHNiaS0+dXVpZDsKKworCS8qCisJICogaW5zZXJ0L3JlbW92ZSBmaWxlIHN5c3RlbSBkZXZpY2UgdG8gbG9nIGFjdGl2ZSBmaWxlIHN5c3RlbSBsaXN0LgorCSAqLworCWlmICgocmMgPSBsYm1SZWFkKGxvZywgMSwgJmJwc3VwZXIpKSkKKwkJcmV0dXJuIHJjOworCisJbG9nc3VwZXIgPSAoc3RydWN0IGxvZ3N1cGVyICopIGJwc3VwZXItPmxfbGRhdGE7CisJaWYgKGFjdGl2YXRlKSB7CisJCWZvciAoaSA9IDA7IGkgPCBNQVhfQUNUSVZFOyBpKyspCisJCQlpZiAoIW1lbWNtcChsb2dzdXBlci0+YWN0aXZlW2ldLnV1aWQsIE5VTExfVVVJRCwgMTYpKSB7CisJCQkJbWVtY3B5KGxvZ3N1cGVyLT5hY3RpdmVbaV0udXVpZCwgdXVpZCwgMTYpOworCQkJCXNiaS0+YWdncmVnYXRlID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJaWYgKGkgPT0gTUFYX0FDVElWRSkgeworCQkJamZzX3dhcm4oIlRvbyBtYW55IGZpbGUgc3lzdGVtcyBzaGFyaW5nIGpvdXJuYWwhIik7CisJCQlsYm1GcmVlKGJwc3VwZXIpOworCQkJcmV0dXJuIC1FTUZJTEU7CS8qIElzIHRoZXJlIGEgYmV0dGVyIHJjPyAqLworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9BQ1RJVkU7IGkrKykKKwkJCWlmICghbWVtY21wKGxvZ3N1cGVyLT5hY3RpdmVbaV0udXVpZCwgdXVpZCwgMTYpKSB7CisJCQkJbWVtY3B5KGxvZ3N1cGVyLT5hY3RpdmVbaV0udXVpZCwgTlVMTF9VVUlELCAxNik7CisJCQkJYnJlYWs7CisJCQl9CisJCWlmIChpID09IE1BWF9BQ1RJVkUpIHsKKwkJCWpmc193YXJuKCJTb21lYm9keSBzdG9tcGVkIG9uIHRoZSBqb3VybmFsISIpOworCQkJbGJtRnJlZShicHN1cGVyKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCQorCX0KKworCS8qCisJICogc3luY2hyb25vdXMgd3JpdGUgbG9nIHN1cGVyYmxvY2s6CisJICoKKwkgKiB3cml0ZSBzaWRlc3RyZWFtIGJ5cGFzc2luZyB3cml0ZSBxdWV1ZToKKwkgKiBhdCBmaWxlIHN5c3RlbSBtb3VudCwgbG9nIHN1cGVyIGJsb2NrIGlzIHVwZGF0ZWQgZm9yCisJICogYWN0aXZhdGlvbiBvZiB0aGUgZmlsZSBzeXN0ZW0gYmVmb3JlIGFueSBsb2cgcmVjb3JkCisJICogKE1PVU5UIHJlY29yZCkgb2YgdGhlIGZpbGUgc3lzdGVtLCBhbmQgYXQgZmlsZSBzeXN0ZW0KKwkgKiB1bm1vdW50LCBhbGwgbWV0YSBkYXRhIGZvciB0aGUgZmlsZSBzeXN0ZW0gaGFzIGJlZW4KKwkgKiBmbHVzaGVkIGJlZm9yZSBsb2cgc3VwZXIgYmxvY2sgaXMgdXBkYXRlZCBmb3IgZGVhY3RpdmF0aW9uCisJICogb2YgdGhlIGZpbGUgc3lzdGVtLgorCSAqLworCWxibURpcmVjdFdyaXRlKGxvZywgYnBzdXBlciwgbGJtV1JJVEUgfCBsYm1SRUxFQVNFIHwgbGJtU1lOQyk7CisJcmMgPSBsYm1JT1dhaXQoYnBzdXBlciwgbGJtRlJFRSk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKgkJbG9nIGJ1ZmZlciBtYW5hZ2VyIChsYm0pCisgKgkJLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogc3BlY2lhbCBwdXJwb3NlIGJ1ZmZlciBtYW5hZ2VyIHN1cHBvcnRpbmcgbG9nIGkvbyByZXF1aXJlbWVudHMuCisgKgorICogcGVyIGxvZyB3cml0ZSBxdWV1ZToKKyAqIGxvZyBwYWdlb3V0IG9jY3VycyBpbiBzZXJpYWwgb3JkZXIgYnkgZmlmbyB3cml0ZSBxdWV1ZSBhbmQKKyAqIHJlc3RyaWN0aW5nIHRvIGEgc2luZ2xlIGkvbyBpbiBwcmVncmVzcyBhdCBhbnkgb25lIHRpbWUuCisgKiBhIGNpcmN1bGFyIHNpbmdseS1saW5rZWQgbGlzdAorICogKGxvZy0+d3JxdWV1ZSBwb2ludHMgdG8gdGhlIHRhaWwsIGFuZCBidWZmZXJzIGFyZSBsaW5rZWQgdmlhCisgKiBicC0+d3JxdWV1ZSBmaWVsZCksIGFuZAorICogbWFpbnRhaW5zIGxvZyBwYWdlIGluIHBhZ2VvdXQgb3Qgd2FpdGluZyBmb3IgcGFnZW91dCBpbiBzZXJpYWwgcGFnZW91dC4KKyAqLworCisvKgorICoJbGJtTG9nSW5pdCgpCisgKgorICogaW5pdGlhbGl6ZSBwZXIgbG9nIEkvTyBzZXR1cCBhdCBsbUxvZ0luaXQoKQorICovCitzdGF0aWMgaW50IGxibUxvZ0luaXQoc3RydWN0IGpmc19sb2cgKiBsb2cpCit7CQkJCS8qIGxvZyBpbm9kZSAqLworCWludCBpOworCXN0cnVjdCBsYnVmICpsYnVmOworCisJamZzX2luZm8oImxibUxvZ0luaXQ6IGxvZzoweCVwIiwgbG9nKTsKKworCS8qIGluaXRpYWxpemUgY3VycmVudCBidWZmZXIgY3Vyc29yICovCisJbG9nLT5icCA9IE5VTEw7CisKKwkvKiBpbml0aWFsaXplIGxvZyBkZXZpY2Ugd3JpdGUgcXVldWUgKi8KKwlsb2ctPndxdWV1ZSA9IE5VTEw7CisKKwkvKgorCSAqIEVhY2ggbG9nIGhhcyBpdHMgb3duIGJ1ZmZlciBwYWdlcyBhbGxvY2F0ZWQgdG8gaXQuICBUaGVzZSBhcmUKKwkgKiBub3QgbWFuYWdlZCBieSB0aGUgcGFnZSBjYWNoZS4gIFRoaXMgZW5zdXJlcyB0aGF0IGEgdHJhbnNhY3Rpb24KKwkgKiB3cml0aW5nIHRvIHRoZSBsb2cgZG9lcyBub3QgYmxvY2sgdHJ5aW5nIHRvIGFsbG9jYXRlIGEgcGFnZSBmcm9tCisJICogdGhlIHBhZ2UgY2FjaGUgKGZvciB0aGUgbG9nKS4gIFRoaXMgd291bGQgYmUgYmFkLCBzaW5jZSBwYWdlCisJICogYWxsb2NhdGlvbiB3YWl0cyBvbiB0aGUga3N3YXBkIHRocmVhZCB0aGF0IG1heSBiZSBjb21taXR0aW5nIGlub2RlcworCSAqIHdoaWNoIHdvdWxkIGNhdXNlIGxvZyBhY3Rpdml0eS4gIFdhcyB0aGF0IGNsZWFyPyAgSSdtIHRyeWluZyB0bworCSAqIGF2b2lkIGRlYWRsb2NrIGhlcmUuCisJICovCisJaW5pdF93YWl0cXVldWVfaGVhZCgmbG9nLT5mcmVlX3dhaXQpOworCisJbG9nLT5sYnVmX2ZyZWUgPSBOVUxMOworCisJZm9yIChpID0gMDsgaSA8IExPR1BBR0VTOyBpKyspIHsKKwkJbGJ1ZiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBsYnVmKSwgR0ZQX0tFUk5FTCk7CisJCWlmIChsYnVmID09IDApCisJCQlnb3RvIGVycm9yOworCQlsYnVmLT5sX2xkYXRhID0gKGNoYXIgKikgZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCQlpZiAobGJ1Zi0+bF9sZGF0YSA9PSAwKSB7CisJCQlrZnJlZShsYnVmKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwkJbGJ1Zi0+bF9sb2cgPSBsb2c7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmxidWYtPmxfaW9ldmVudCk7CisKKwkJbGJ1Zi0+bF9mcmVlbGlzdCA9IGxvZy0+bGJ1Zl9mcmVlOworCQlsb2ctPmxidWZfZnJlZSA9IGxidWY7CisJfQorCisJcmV0dXJuICgwKTsKKworICAgICAgZXJyb3I6CisJbGJtTG9nU2h1dGRvd24obG9nKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworCisvKgorICoJbGJtTG9nU2h1dGRvd24oKQorICoKKyAqIGZpbmFsaXplIHBlciBsb2cgSS9PIHNldHVwIGF0IGxtTG9nU2h1dGRvd24oKQorICovCitzdGF0aWMgdm9pZCBsYm1Mb2dTaHV0ZG93bihzdHJ1Y3QgamZzX2xvZyAqIGxvZykKK3sKKwlzdHJ1Y3QgbGJ1ZiAqbGJ1ZjsKKworCWpmc19pbmZvKCJsYm1Mb2dTaHV0ZG93bjogbG9nOjB4JXAiLCBsb2cpOworCisJbGJ1ZiA9IGxvZy0+bGJ1Zl9mcmVlOworCXdoaWxlIChsYnVmKSB7CisJCXN0cnVjdCBsYnVmICpuZXh0ID0gbGJ1Zi0+bF9mcmVlbGlzdDsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBsYnVmLT5sX2xkYXRhKTsKKwkJa2ZyZWUobGJ1Zik7CisJCWxidWYgPSBuZXh0OworCX0KKworCWxvZy0+YnAgPSBOVUxMOworfQorCisKKy8qCisgKglsYm1BbGxvY2F0ZSgpCisgKgorICogYWxsb2NhdGUgYW4gZW1wdHkgbG9nIGJ1ZmZlcgorICovCitzdGF0aWMgc3RydWN0IGxidWYgKmxibUFsbG9jYXRlKHN0cnVjdCBqZnNfbG9nICogbG9nLCBpbnQgcG4pCit7CisJc3RydWN0IGxidWYgKmJwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKgorCSAqIHJlY3ljbGUgZnJvbSBsb2cgYnVmZmVyIGZyZWVsaXN0IGlmIGFueQorCSAqLworCUxDQUNIRV9MT0NLKGZsYWdzKTsKKwlMQ0FDSEVfU0xFRVBfQ09ORChsb2ctPmZyZWVfd2FpdCwgKGJwID0gbG9nLT5sYnVmX2ZyZWUpLCBmbGFncyk7CisJbG9nLT5sYnVmX2ZyZWUgPSBicC0+bF9mcmVlbGlzdDsKKwlMQ0FDSEVfVU5MT0NLKGZsYWdzKTsKKworCWJwLT5sX2ZsYWcgPSAwOworCisJYnAtPmxfd3FuZXh0ID0gTlVMTDsKKwlicC0+bF9mcmVlbGlzdCA9IE5VTEw7CisKKwlicC0+bF9wbiA9IHBuOworCWJwLT5sX2Jsa25vID0gbG9nLT5iYXNlICsgKHBuIDw8IChMMkxPR1BTSVpFIC0gbG9nLT5sMmJzaXplKSk7CisJYnAtPmxfY2VvciA9IDA7CisKKwlyZXR1cm4gYnA7Cit9CisKKworLyoKKyAqCWxibUZyZWUoKQorICoKKyAqIHJlbGVhc2UgYSBsb2cgYnVmZmVyIHRvIGZyZWVsaXN0CisgKi8KK3N0YXRpYyB2b2lkIGxibUZyZWUoc3RydWN0IGxidWYgKiBicCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJTENBQ0hFX0xPQ0soZmxhZ3MpOworCisJbGJtZnJlZShicCk7CisKKwlMQ0FDSEVfVU5MT0NLKGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgbGJtZnJlZShzdHJ1Y3QgbGJ1ZiAqIGJwKQoreworCXN0cnVjdCBqZnNfbG9nICpsb2cgPSBicC0+bF9sb2c7CisKKwlhc3NlcnQoYnAtPmxfd3FuZXh0ID09IE5VTEwpOworCisJLyoKKwkgKiByZXR1cm4gdGhlIGJ1ZmZlciB0byBoZWFkIG9mIGZyZWVsaXN0CisJICovCisJYnAtPmxfZnJlZWxpc3QgPSBsb2ctPmxidWZfZnJlZTsKKwlsb2ctPmxidWZfZnJlZSA9IGJwOworCisJd2FrZV91cCgmbG9nLT5mcmVlX3dhaXQpOworCXJldHVybjsKK30KKworCisvKgorICogTkFNRToJbGJtUmVkcml2ZQorICoKKyAqIEZVTkNUSU9OOglhZGQgYSBsb2cgYnVmZmVyIHRvIHRoZSB0aGUgbG9nIHJlZHJpdmUgbGlzdAorICoKKyAqIFBBUkFNRVRFUjoKKyAqICAgICBicAktIGxvZyBidWZmZXIKKyAqCisgKiBOT1RFUzoKKyAqCVRha2VzIGxvZ19yZWRyaXZlX2xvY2suCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBsYm1SZWRyaXZlKHN0cnVjdCBsYnVmICpicCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvZ19yZWRyaXZlX2xvY2ssIGZsYWdzKTsKKwlicC0+bF9yZWRyaXZlX25leHQgPSBsb2dfcmVkcml2ZV9saXN0OworCWxvZ19yZWRyaXZlX2xpc3QgPSBicDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2dfcmVkcml2ZV9sb2NrLCBmbGFncyk7CisKKwl3YWtlX3VwKCZqZnNfSU9fdGhyZWFkX3dhaXQpOworfQorCisKKy8qCisgKglsYm1SZWFkKCkKKyAqLworc3RhdGljIGludCBsYm1SZWFkKHN0cnVjdCBqZnNfbG9nICogbG9nLCBpbnQgcG4sIHN0cnVjdCBsYnVmICoqIGJwcCkKK3sKKwlzdHJ1Y3QgYmlvICpiaW87CisJc3RydWN0IGxidWYgKmJwOworCisJLyoKKwkgKiBhbGxvY2F0ZSBhIGxvZyBidWZmZXIKKwkgKi8KKwkqYnBwID0gYnAgPSBsYm1BbGxvY2F0ZShsb2csIHBuKTsKKwlqZnNfaW5mbygibGJtUmVhZDogYnA6MHglcCBwbjoweCV4IiwgYnAsIHBuKTsKKworCWJwLT5sX2ZsYWcgfD0gbGJtUkVBRDsKKworCWJpbyA9IGJpb19hbGxvYyhHRlBfTk9GUywgMSk7CisKKwliaW8tPmJpX3NlY3RvciA9IGJwLT5sX2Jsa25vIDw8IChsb2ctPmwyYnNpemUgLSA5KTsKKwliaW8tPmJpX2JkZXYgPSBsb2ctPmJkZXY7CisJYmlvLT5iaV9pb192ZWNbMF0uYnZfcGFnZSA9IHZpcnRfdG9fcGFnZShicC0+bF9sZGF0YSk7CisJYmlvLT5iaV9pb192ZWNbMF0uYnZfbGVuID0gTE9HUFNJWkU7CisJYmlvLT5iaV9pb192ZWNbMF0uYnZfb2Zmc2V0ID0gMDsKKworCWJpby0+YmlfdmNudCA9IDE7CisJYmlvLT5iaV9pZHggPSAwOworCWJpby0+Ymlfc2l6ZSA9IExPR1BTSVpFOworCisJYmlvLT5iaV9lbmRfaW8gPSBsYm1JT0RvbmU7CisJYmlvLT5iaV9wcml2YXRlID0gYnA7CisJc3VibWl0X2JpbyhSRUFEX1NZTkMsIGJpbyk7CisKKwl3YWl0X2V2ZW50KGJwLT5sX2lvZXZlbnQsIChicC0+bF9mbGFnICE9IGxibVJFQUQpKTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKglsYm1Xcml0ZSgpCisgKgorICogYnVmZmVyIGF0IGhlYWQgb2YgcGFnZW91dCBxdWV1ZSBzdGF5cyBhZnRlciBjb21wbGV0aW9uIG9mCisgKiBwYXJ0aWFsLXBhZ2UgcGFnZW91dCBhbmQgcmVkcml2ZW4gYnkgZXhwbGljaXQgaW5pdGlhdGlvbiBvZgorICogcGFnZW91dCBieSBjYWxsZXIgdW50aWwgZnVsbC1wYWdlIHBhZ2VvdXQgaXMgY29tcGxldGVkIGFuZAorICogcmVsZWFzZWQuCisgKgorICogZGV2aWNlIGRyaXZlciBpL28gZG9uZSByZWRyaXZlcyBwYWdlb3V0IG9mIG5ldyBidWZmZXIgYXQKKyAqIGhlYWQgb2YgcGFnZW91dCBxdWV1ZSB3aGVuIGN1cnJlbnQgYnVmZmVyIGF0IGhlYWQgb2YgcGFnZW91dAorICogcXVldWUgaXMgcmVsZWFzZWQgYXQgdGhlIGNvbXBsZXRpb24gb2YgaXRzIGZ1bGwtcGFnZSBwYWdlb3V0LgorICoKKyAqIExPR0dDX0xPQ0soKSBzZXJpYWxpemVzIGxibVdyaXRlKCkgYnkgbG1OZXh0UGFnZSgpIGFuZCBsbUdyb3VwQ29tbWl0KCkuCisgKiBMQ0FDSEVfTE9DSygpIHNlcmlhbGl6ZXMgeGZsYWcgYmV0d2VlbiBsYm1Xcml0ZSgpIGFuZCBsYm1JT0RvbmUoKQorICovCitzdGF0aWMgdm9pZCBsYm1Xcml0ZShzdHJ1Y3QgamZzX2xvZyAqIGxvZywgc3RydWN0IGxidWYgKiBicCwgaW50IGZsYWcsCisJCSAgICAgaW50IGNhbnRfYmxvY2spCit7CisJc3RydWN0IGxidWYgKnRhaWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWpmc19pbmZvKCJsYm1Xcml0ZTogYnA6MHglcCBmbGFnOjB4JXggcG46MHgleCIsIGJwLCBmbGFnLCBicC0+bF9wbik7CisKKwkvKiBtYXAgdGhlIGxvZ2ljYWwgYmxvY2sgYWRkcmVzcyB0byBwaHlzaWNhbCBibG9jayBhZGRyZXNzICovCisJYnAtPmxfYmxrbm8gPQorCSAgICBsb2ctPmJhc2UgKyAoYnAtPmxfcG4gPDwgKEwyTE9HUFNJWkUgLSBsb2ctPmwyYnNpemUpKTsKKworCUxDQUNIRV9MT0NLKGZsYWdzKTsJCS8qIGRpc2FibGUrbG9jayAqLworCisJLyoKKwkgKiBpbml0aWFsaXplIGJ1ZmZlciBmb3IgZGV2aWNlIGRyaXZlcgorCSAqLworCWJwLT5sX2ZsYWcgPSBmbGFnOworCisJLyoKKwkgKiAgICAgIGluc2VydCBicCBhdCB0YWlsIG9mIHdyaXRlIHF1ZXVlIGFzc29jaWF0ZWQgd2l0aCBsb2cKKwkgKgorCSAqIChyZXF1ZXN0IGlzIGVpdGhlciBmb3IgYnAgYWxyZWFkeS9jdXJyZW50bHkgYXQgaGVhZCBvZiBxdWV1ZQorCSAqIG9yIG5ldyBicCB0byBiZSBpbnNlcnRlZCBhdCB0YWlsKQorCSAqLworCXRhaWwgPSBsb2ctPndxdWV1ZTsKKworCS8qIGlzIGJ1ZmZlciBub3QgYWxyZWFkeSBvbiB3cml0ZSBxdWV1ZSA/ICovCisJaWYgKGJwLT5sX3dxbmV4dCA9PSBOVUxMKSB7CisJCS8qIGluc2VydCBhdCB0YWlsIG9mIHdxdWV1ZSAqLworCQlpZiAodGFpbCA9PSBOVUxMKSB7CisJCQlsb2ctPndxdWV1ZSA9IGJwOworCQkJYnAtPmxfd3FuZXh0ID0gYnA7CisJCX0gZWxzZSB7CisJCQlsb2ctPndxdWV1ZSA9IGJwOworCQkJYnAtPmxfd3FuZXh0ID0gdGFpbC0+bF93cW5leHQ7CisJCQl0YWlsLT5sX3dxbmV4dCA9IGJwOworCQl9CisKKwkJdGFpbCA9IGJwOworCX0KKworCS8qIGlzIGJ1ZmZlciBhdCBoZWFkIG9mIHdxdWV1ZSBhbmQgZm9yIHdyaXRlID8gKi8KKwlpZiAoKGJwICE9IHRhaWwtPmxfd3FuZXh0KSB8fCAhKGZsYWcgJiBsYm1XUklURSkpIHsKKwkJTENBQ0hFX1VOTE9DSyhmbGFncyk7CS8qIHVubG9jaytlbmFibGUgKi8KKwkJcmV0dXJuOworCX0KKworCUxDQUNIRV9VTkxPQ0soZmxhZ3MpOwkvKiB1bmxvY2srZW5hYmxlICovCisKKwlpZiAoY2FudF9ibG9jaykKKwkJbGJtUmVkcml2ZShicCk7CisJZWxzZSBpZiAoZmxhZyAmIGxibVNZTkMpCisJCWxibVN0YXJ0SU8oYnApOworCWVsc2UgeworCQlMT0dHQ19VTkxPQ0sobG9nKTsKKwkJbGJtU3RhcnRJTyhicCk7CisJCUxPR0dDX0xPQ0sobG9nKTsKKwl9Cit9CisKKworLyoKKyAqCWxibURpcmVjdFdyaXRlKCkKKyAqCisgKiBpbml0aWF0ZSBwYWdlb3V0IGJ5cGFzc2luZyB3cml0ZSBxdWV1ZSBmb3Igc2lkZXN0cmVhbQorICogKGUuZy4sIGxvZyBzdXBlcmJsb2NrKSB3cml0ZTsKKyAqLworc3RhdGljIHZvaWQgbGJtRGlyZWN0V3JpdGUoc3RydWN0IGpmc19sb2cgKiBsb2csIHN0cnVjdCBsYnVmICogYnAsIGludCBmbGFnKQoreworCWpmc19pbmZvKCJsYm1EaXJlY3RXcml0ZTogYnA6MHglcCBmbGFnOjB4JXggcG46MHgleCIsCisJCSBicCwgZmxhZywgYnAtPmxfcG4pOworCisJLyoKKwkgKiBpbml0aWFsaXplIGJ1ZmZlciBmb3IgZGV2aWNlIGRyaXZlcgorCSAqLworCWJwLT5sX2ZsYWcgPSBmbGFnIHwgbGJtRElSRUNUOworCisJLyogbWFwIHRoZSBsb2dpY2FsIGJsb2NrIGFkZHJlc3MgdG8gcGh5c2ljYWwgYmxvY2sgYWRkcmVzcyAqLworCWJwLT5sX2Jsa25vID0KKwkgICAgbG9nLT5iYXNlICsgKGJwLT5sX3BuIDw8IChMMkxPR1BTSVpFIC0gbG9nLT5sMmJzaXplKSk7CisKKwkvKgorCSAqICAgICAgaW5pdGlhdGUgcGFnZW91dCBvZiB0aGUgcGFnZQorCSAqLworCWxibVN0YXJ0SU8oYnApOworfQorCisKKy8qCisgKiBOQU1FOglsYm1TdGFydElPKCkKKyAqCisgKiBGVU5DVElPTjoJSW50ZXJmYWNlIHRvIEREIHN0cmF0ZWd5IHJvdXRpbmUKKyAqCisgKiBSRVRVUk46ICAgICAgbm9uZQorICoKKyAqIHNlcmlhbGl6YXRpb246IExDQUNIRV9MT0NLKCkgaXMgTk9UIGhlbGQgZHVyaW5nIGxvZyBpL287CisgKi8KK3N0YXRpYyB2b2lkIGxibVN0YXJ0SU8oc3RydWN0IGxidWYgKiBicCkKK3sKKwlzdHJ1Y3QgYmlvICpiaW87CisJc3RydWN0IGpmc19sb2cgKmxvZyA9IGJwLT5sX2xvZzsKKworCWpmc19pbmZvKCJsYm1TdGFydElPXG4iKTsKKworCWJpbyA9IGJpb19hbGxvYyhHRlBfTk9GUywgMSk7CisJYmlvLT5iaV9zZWN0b3IgPSBicC0+bF9ibGtubyA8PCAobG9nLT5sMmJzaXplIC0gOSk7CisJYmlvLT5iaV9iZGV2ID0gbG9nLT5iZGV2OworCWJpby0+YmlfaW9fdmVjWzBdLmJ2X3BhZ2UgPSB2aXJ0X3RvX3BhZ2UoYnAtPmxfbGRhdGEpOworCWJpby0+YmlfaW9fdmVjWzBdLmJ2X2xlbiA9IExPR1BTSVpFOworCWJpby0+YmlfaW9fdmVjWzBdLmJ2X29mZnNldCA9IDA7CisKKwliaW8tPmJpX3ZjbnQgPSAxOworCWJpby0+YmlfaWR4ID0gMDsKKwliaW8tPmJpX3NpemUgPSBMT0dQU0laRTsKKworCWJpby0+YmlfZW5kX2lvID0gbGJtSU9Eb25lOworCWJpby0+YmlfcHJpdmF0ZSA9IGJwOworCisJLyogY2hlY2sgaWYgam91cm5hbGluZyB0byBkaXNrIGhhcyBiZWVuIGRpc2FibGVkICovCisJaWYgKCFsb2ctPm5vX2ludGVncml0eSkgeworCQlzdWJtaXRfYmlvKFdSSVRFX1NZTkMsIGJpbyk7CisJCUlOQ1JFTUVOVChsbVN0YXQuc3VibWl0dGVkKTsKKwl9CisJZWxzZSB7CisJCWJpby0+Ymlfc2l6ZSA9IDA7CisJCWxibUlPRG9uZShiaW8sIDAsIDApOyAvKiAybmQgYXJndW1lbnQgYXBwZWFycyB0byBub3QgYmUgdXNlZCA9PiAwCisJCQkJICAgICAgICogIDNyZCBhcmd1bWVudCBhcHBlYXJzIHRvIG5vdCBiZSB1c2VkID0+IDAKKwkJCQkgICAgICAgKi8KKwl9Cit9CisKKworLyoKKyAqCWxibUlPV2FpdCgpCisgKi8KK3N0YXRpYyBpbnQgbGJtSU9XYWl0KHN0cnVjdCBsYnVmICogYnAsIGludCBmbGFnKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjID0gMDsKKworCWpmc19pbmZvKCJsYm1JT1dhaXQxOiBicDoweCVwIGZsYWc6MHgleDoweCV4IiwgYnAsIGJwLT5sX2ZsYWcsIGZsYWcpOworCisJTENBQ0hFX0xPQ0soZmxhZ3MpOwkJLyogZGlzYWJsZStsb2NrICovCisKKwlMQ0FDSEVfU0xFRVBfQ09ORChicC0+bF9pb2V2ZW50LCAoYnAtPmxfZmxhZyAmIGxibURPTkUpLCBmbGFncyk7CisKKwlyYyA9IChicC0+bF9mbGFnICYgbGJtRVJST1IpID8gLUVJTyA6IDA7CisKKwlpZiAoZmxhZyAmIGxibUZSRUUpCisJCWxibWZyZWUoYnApOworCisJTENBQ0hFX1VOTE9DSyhmbGFncyk7CS8qIHVubG9jaytlbmFibGUgKi8KKworCWpmc19pbmZvKCJsYm1JT1dhaXQyOiBicDoweCVwIGZsYWc6MHgleDoweCV4IiwgYnAsIGJwLT5sX2ZsYWcsIGZsYWcpOworCXJldHVybiByYzsKK30KKworLyoKKyAqCWxibUlPRG9uZSgpCisgKgorICogZXhlY3V0ZWQgYXQgSU5USU9ET05FIGxldmVsCisgKi8KK3N0YXRpYyBpbnQgbGJtSU9Eb25lKHN0cnVjdCBiaW8gKmJpbywgdW5zaWduZWQgaW50IGJ5dGVzX2RvbmUsIGludCBlcnJvcikKK3sKKwlzdHJ1Y3QgbGJ1ZiAqYnAgPSBiaW8tPmJpX3ByaXZhdGU7CisJc3RydWN0IGxidWYgKm5leHRicCwgKnRhaWw7CisJc3RydWN0IGpmc19sb2cgKmxvZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGJpby0+Ymlfc2l6ZSkKKwkJcmV0dXJuIDE7CisKKwkvKgorCSAqIGdldCBiYWNrIGpmcyBidWZmZXIgYm91bmQgdG8gdGhlIGkvbyBidWZmZXIKKwkgKi8KKwlqZnNfaW5mbygibGJtSU9Eb25lOiBicDoweCVwIGZsYWc6MHgleCIsIGJwLCBicC0+bF9mbGFnKTsKKworCUxDQUNIRV9MT0NLKGZsYWdzKTsJCS8qIGRpc2FibGUrbG9jayAqLworCisJYnAtPmxfZmxhZyB8PSBsYm1ET05FOworCisJaWYgKCF0ZXN0X2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKSkgeworCQlicC0+bF9mbGFnIHw9IGxibUVSUk9SOworCisJCWpmc19lcnIoImxibUlPRG9uZTogSS9PIGVycm9yIGluIEpGUyBsb2ciKTsKKwl9CisKKwliaW9fcHV0KGJpbyk7CisKKwkvKgorCSAqICAgICAgcGFnZWluIGNvbXBsZXRpb24KKwkgKi8KKwlpZiAoYnAtPmxfZmxhZyAmIGxibVJFQUQpIHsKKwkJYnAtPmxfZmxhZyAmPSB+bGJtUkVBRDsKKworCQlMQ0FDSEVfVU5MT0NLKGZsYWdzKTsJLyogdW5sb2NrK2VuYWJsZSAqLworCisJCS8qIHdha2V1cCBJL08gaW5pdGlhdG9yICovCisJCUxDQUNIRV9XQUtFVVAoJmJwLT5sX2lvZXZlbnQpOworCisJCXJldHVybiAwOworCX0KKworCS8qCisJICogICAgICBwYWdlb3V0IGNvbXBsZXRpb24KKwkgKgorCSAqIHRoZSBicCBhdCB0aGUgaGVhZCBvZiB3cml0ZSBxdWV1ZSBoYXMgY29tcGxldGVkIHBhZ2VvdXQuCisJICoKKwkgKiBpZiBzaW5nbGUtY29tbWl0L2Z1bGwtcGFnZSBwYWdlb3V0LCByZW1vdmUgdGhlIGN1cnJlbnQgYnVmZmVyCisJICogZnJvbSBoZWFkIG9mIHBhZ2VvdXQgcXVldWUsIGFuZCByZWRyaXZlIHBhZ2VvdXQgd2l0aAorCSAqIHRoZSBuZXcgYnVmZmVyIGF0IGhlYWQgb2YgcGFnZW91dCBxdWV1ZTsKKwkgKiBvdGhlcndpc2UsIHRoZSBwYXJ0aWFsLXBhZ2UgcGFnZW91dCBidWZmZXIgc3RheXMgYXQKKwkgKiB0aGUgaGVhZCBvZiBwYWdlb3V0IHF1ZXVlIHRvIGJlIHJlZHJpdmVuIGZvciBwYWdlb3V0CisJICogYnkgbG1Hcm91cENvbW1pdCgpIHVudGlsIGZ1bGwtcGFnZSBwYWdlb3V0IGlzIGNvbXBsZXRlZC4KKwkgKi8KKwlicC0+bF9mbGFnICY9IH5sYm1XUklURTsKKwlJTkNSRU1FTlQobG1TdGF0LnBhZ2Vkb25lKTsKKworCS8qIHVwZGF0ZSBjb21taXR0ZWQgbHNuICovCisJbG9nID0gYnAtPmxfbG9nOworCWxvZy0+Y2xzbiA9IChicC0+bF9wbiA8PCBMMkxPR1BTSVpFKSArIGJwLT5sX2Nlb3I7CisKKwlpZiAoYnAtPmxfZmxhZyAmIGxibURJUkVDVCkgeworCQlMQ0FDSEVfV0FLRVVQKCZicC0+bF9pb2V2ZW50KTsKKwkJTENBQ0hFX1VOTE9DSyhmbGFncyk7CisJCXJldHVybiAwOworCX0KKworCXRhaWwgPSBsb2ctPndxdWV1ZTsKKworCS8qIHNpbmdsZSBlbGVtZW50IHF1ZXVlICovCisJaWYgKGJwID09IHRhaWwpIHsKKwkJLyogcmVtb3ZlIGhlYWQgYnVmZmVyIG9mIGZ1bGwtcGFnZSBwYWdlb3V0CisJCSAqIGZyb20gbG9nIGRldmljZSB3cml0ZSBxdWV1ZQorCQkgKi8KKwkJaWYgKGJwLT5sX2ZsYWcgJiBsYm1SRUxFQVNFKSB7CisJCQlsb2ctPndxdWV1ZSA9IE5VTEw7CisJCQlicC0+bF93cW5leHQgPSBOVUxMOworCQl9CisJfQorCS8qIG11bHRpIGVsZW1lbnQgcXVldWUgKi8KKwllbHNlIHsKKwkJLyogcmVtb3ZlIGhlYWQgYnVmZmVyIG9mIGZ1bGwtcGFnZSBwYWdlb3V0CisJCSAqIGZyb20gbG9nIGRldmljZSB3cml0ZSBxdWV1ZQorCQkgKi8KKwkJaWYgKGJwLT5sX2ZsYWcgJiBsYm1SRUxFQVNFKSB7CisJCQluZXh0YnAgPSB0YWlsLT5sX3dxbmV4dCA9IGJwLT5sX3dxbmV4dDsKKwkJCWJwLT5sX3dxbmV4dCA9IE5VTEw7CisKKwkJCS8qCisJCQkgKiByZWRyaXZlIHBhZ2VvdXQgb2YgbmV4dCBwYWdlIGF0IGhlYWQgb2Ygd3JpdGUgcXVldWU6CisJCQkgKiByZWRyaXZlIG5leHQgcGFnZSB3aXRob3V0IGFueSBib3VuZCB0YmxrCisJCQkgKiAoaS5lLiwgcGFnZSB3L28gYW55IENPTU1JVCByZWNvcmRzKSwgb3IKKwkJCSAqIGZpcnN0IHBhZ2Ugb2YgbmV3IGdyb3VwIGNvbW1pdCB3aGljaCBoYXMgYmVlbgorCQkJICogcXVldWVkIGFmdGVyIGN1cnJlbnQgcGFnZSAoc3Vic2VxdWVudCBwYWdlb3V0CisJCQkgKiBpcyBwZXJmb3JtZWQgc3luY2hyb25vdXNseSwgZXhjZXB0IHBhZ2Ugd2l0aG91dAorCQkJICogYW55IENPTU1JVHMpIGJ5IGxtR3JvdXBDb21taXQoKSBhcyBpbmRpY2F0ZWQKKwkJCSAqIGJ5IGxibVdSSVRFIGZsYWc7CisJCQkgKi8KKwkJCWlmIChuZXh0YnAtPmxfZmxhZyAmIGxibVdSSVRFKSB7CisJCQkJLyoKKwkJCQkgKiBXZSBjYW4ndCBkbyB0aGUgSS9PIGF0IGludGVycnVwdCB0aW1lLgorCQkJCSAqIFRoZSBqZnNJTyB0aHJlYWQgY2FuIGRvIGl0CisJCQkJICovCisJCQkJbGJtUmVkcml2ZShuZXh0YnApOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiAgICAgIHN5bmNocm9ub3VzIHBhZ2VvdXQ6CisJICoKKwkgKiBidWZmZXIgaGFzIG5vdCBuZWNlc3NhcmlseSBiZWVuIHJlbW92ZWQgZnJvbSB3cml0ZSBxdWV1ZQorCSAqIChlLmcuLCBzeW5jaHJvbm91cyB3cml0ZSBvZiBwYXJ0aWFsLXBhZ2Ugd2l0aCBDT01NSVQpOgorCSAqIGxlYXZlIGJ1ZmZlciBmb3IgaS9vIGluaXRpYXRvciB0byBkaXNwb3NlCisJICovCisJaWYgKGJwLT5sX2ZsYWcgJiBsYm1TWU5DKSB7CisJCUxDQUNIRV9VTkxPQ0soZmxhZ3MpOwkvKiB1bmxvY2srZW5hYmxlICovCisKKwkJLyogd2FrZXVwIEkvTyBpbml0aWF0b3IgKi8KKwkJTENBQ0hFX1dBS0VVUCgmYnAtPmxfaW9ldmVudCk7CisJfQorCisJLyoKKwkgKiAgICAgIEdyb3VwIENvbW1pdCBwYWdlb3V0OgorCSAqLworCWVsc2UgaWYgKGJwLT5sX2ZsYWcgJiBsYm1HQykgeworCQlMQ0FDSEVfVU5MT0NLKGZsYWdzKTsKKwkJbG1Qb3N0R0MoYnApOworCX0KKworCS8qCisJICogICAgICBhc3luY2hyb25vdXMgcGFnZW91dDoKKwkgKgorCSAqIGJ1ZmZlciBtdXN0IGhhdmUgYmVlbiByZW1vdmVkIGZyb20gd3JpdGUgcXVldWU6CisJICogaW5zZXJ0IGJ1ZmZlciBhdCBoZWFkIG9mIGZyZWVsaXN0IHdoZXJlIGl0IGNhbiBiZSByZWN5Y2xlZAorCSAqLworCWVsc2UgeworCQlhc3NlcnQoYnAtPmxfZmxhZyAmIGxibVJFTEVBU0UpOworCQlhc3NlcnQoYnAtPmxfZmxhZyAmIGxibUZSRUUpOworCQlsYm1mcmVlKGJwKTsKKworCQlMQ0FDSEVfVU5MT0NLKGZsYWdzKTsJLyogdW5sb2NrK2VuYWJsZSAqLworCX0KKworCXJldHVybiAwOworfQorCitpbnQgamZzSU9XYWl0KHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgbGJ1ZiAqYnA7CisKKwlkYWVtb25pemUoImpmc0lPIik7CisKKwljb21wbGV0ZSgmamZzSU93YWl0KTsKKworCWRvIHsKKwkJREVDTEFSRV9XQUlUUVVFVUUod3EsIGN1cnJlbnQpOworCisJCXNwaW5fbG9ja19pcnEoJmxvZ19yZWRyaXZlX2xvY2spOworCQl3aGlsZSAoKGJwID0gbG9nX3JlZHJpdmVfbGlzdCkgIT0gMCkgeworCQkJbG9nX3JlZHJpdmVfbGlzdCA9IGJwLT5sX3JlZHJpdmVfbmV4dDsKKwkJCWJwLT5sX3JlZHJpdmVfbmV4dCA9IE5VTEw7CisJCQlzcGluX3VubG9ja19pcnEoJmxvZ19yZWRyaXZlX2xvY2spOworCQkJbGJtU3RhcnRJTyhicCk7CisJCQlzcGluX2xvY2tfaXJxKCZsb2dfcmVkcml2ZV9sb2NrKTsKKwkJfQorCQlpZiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9GUkVFWkUpIHsKKwkJCXNwaW5fdW5sb2NrX2lycSgmbG9nX3JlZHJpdmVfbG9jayk7CisJCQlyZWZyaWdlcmF0b3IoUEZfRlJFRVpFKTsKKwkJfSBlbHNlIHsKKwkJCWFkZF93YWl0X3F1ZXVlKCZqZnNfSU9fdGhyZWFkX3dhaXQsICZ3cSk7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJc3Bpbl91bmxvY2tfaXJxKCZsb2dfcmVkcml2ZV9sb2NrKTsKKwkJCXNjaGVkdWxlKCk7CisJCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwkJCXJlbW92ZV93YWl0X3F1ZXVlKCZqZnNfSU9fdGhyZWFkX3dhaXQsICZ3cSk7CisJCX0KKwl9IHdoaWxlICghamZzX3N0b3BfdGhyZWFkcyk7CisKKwlqZnNfaW5mbygiamZzSU9XYWl0IGJlaW5nIGtpbGxlZCEiKTsKKwljb21wbGV0ZV9hbmRfZXhpdCgmamZzSU93YWl0LCAwKTsKK30KKworLyoKKyAqIE5BTUU6CWxtTG9nRm9ybWF0KCkvamZzX2xvZ2Zvcm0oKQorICoKKyAqIEZVTkNUSU9OOglmb3JtYXQgZmlsZSBzeXN0ZW0gbG9nCisgKgorICogUEFSQU1FVEVSUzoKKyAqICAgICAgbG9nCS0gdm9sdW1lIGxvZworICoJbG9nQWRkcmVzcyAtIHN0YXJ0IGFkZHJlc3Mgb2YgbG9nIHNwYWNlIGluIEZTIGJsb2NrCisgKglsb2dTaXplCS0gbGVuZ3RoIG9mIGxvZyBzcGFjZSBpbiBGUyBibG9jazsKKyAqCisgKiBSRVRVUk46CTAJLSBzdWNjZXNzCisgKgkJLUVJTwktIGkvbyBlcnJvcgorICoKKyAqIFhYWDogV2UncmUgc3luY2hyb25vdXNseSB3cml0aW5nIG9uZSBwYWdlIGF0IGEgdGltZS4gIFRoaXMgbmVlZHMgdG8KKyAqCWJlIGltcHJvdmVkIGJ5IHdyaXRpbmcgbXVsdGlwbGUgcGFnZXMgYXQgb25jZS4KKyAqLworaW50IGxtTG9nRm9ybWF0KHN0cnVjdCBqZnNfbG9nICpsb2csIHM2NCBsb2dBZGRyZXNzLCBpbnQgbG9nU2l6ZSkKK3sKKwlpbnQgcmMgPSAtRUlPOworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpOworCXN0cnVjdCBsb2dzdXBlciAqbG9nc3VwZXI7CisJc3RydWN0IGxvZ3BhZ2UgKmxwOworCWludCBsc3BuOwkJLyogbG9nIHNlcXVlbmNlIHBhZ2UgbnVtYmVyICovCisJc3RydWN0IGxyZCAqbHJkX3B0cjsKKwlpbnQgbnBhZ2VzID0gMDsKKwlzdHJ1Y3QgbGJ1ZiAqYnA7CisKKwlqZnNfaW5mbygibG1Mb2dGb3JtYXQ6IGxvZ0FkZHJlc3M6JUxkIGxvZ1NpemU6JWQiLAorCQkgKGxvbmcgbG9uZylsb2dBZGRyZXNzLCBsb2dTaXplKTsKKworCXNiaSA9IGxpc3RfZW50cnkobG9nLT5zYl9saXN0Lm5leHQsIHN0cnVjdCBqZnNfc2JfaW5mbywgbG9nX2xpc3QpOworCisJLyogYWxsb2NhdGUgYSBsb2cgYnVmZmVyICovCisJYnAgPSBsYm1BbGxvY2F0ZShsb2csIDEpOworCisJbnBhZ2VzID0gbG9nU2l6ZSA+PiBzYmktPmwybmJwZXJwYWdlOworCisJLyoKKwkgKiAgICAgIGxvZyBzcGFjZToKKwkgKgorCSAqIHBhZ2UgMCAtIHJlc2VydmVkOworCSAqIHBhZ2UgMSAtIGxvZyBzdXBlcmJsb2NrOworCSAqIHBhZ2UgMiAtIGxvZyBkYXRhIHBhZ2U6IEEgU1lOQyBsb2cgcmVjb3JkIGlzIHdyaXR0ZW4KKwkgKiAgICAgICAgICBpbnRvIHRoaXMgcGFnZSBhdCBsb2dmb3JtIHRpbWU7CisJICogcGFnZXMgMy1OIC0gbG9nIGRhdGEgcGFnZTogc2V0IHRvIGVtcHR5IGxvZyBkYXRhIHBhZ2VzOworCSAqLworCS8qCisJICogICAgICBpbml0IGxvZyBzdXBlcmJsb2NrOiBsb2cgcGFnZSAxCisJICovCisJbG9nc3VwZXIgPSAoc3RydWN0IGxvZ3N1cGVyICopIGJwLT5sX2xkYXRhOworCisJbG9nc3VwZXItPm1hZ2ljID0gY3B1X3RvX2xlMzIoTE9HTUFHSUMpOworCWxvZ3N1cGVyLT52ZXJzaW9uID0gY3B1X3RvX2xlMzIoTE9HVkVSU0lPTik7CisJbG9nc3VwZXItPnN0YXRlID0gY3B1X3RvX2xlMzIoTE9HUkVET05FKTsKKwlsb2dzdXBlci0+ZmxhZyA9IGNwdV90b19sZTMyKHNiaS0+bW50ZmxhZyk7CS8qID8gKi8KKwlsb2dzdXBlci0+c2l6ZSA9IGNwdV90b19sZTMyKG5wYWdlcyk7CisJbG9nc3VwZXItPmJzaXplID0gY3B1X3RvX2xlMzIoc2JpLT5ic2l6ZSk7CisJbG9nc3VwZXItPmwyYnNpemUgPSBjcHVfdG9fbGUzMihzYmktPmwyYnNpemUpOworCWxvZ3N1cGVyLT5lbmQgPSBjcHVfdG9fbGUzMigyICogTE9HUFNJWkUgKyBMT0dQSERSU0laRSArIExPR1JEU0laRSk7CisKKwlicC0+bF9mbGFnID0gbGJtV1JJVEUgfCBsYm1TWU5DIHwgbGJtRElSRUNUOworCWJwLT5sX2Jsa25vID0gbG9nQWRkcmVzcyArIHNiaS0+bmJwZXJwYWdlOworCWxibVN0YXJ0SU8oYnApOworCWlmICgocmMgPSBsYm1JT1dhaXQoYnAsIDApKSkKKwkJZ290byBleGl0OworCisJLyoKKwkgKiAgICAgIGluaXQgcGFnZXMgMiB0byBucGFnZXMtMSBhcyBsb2cgZGF0YSBwYWdlczoKKwkgKgorCSAqIGxvZyBwYWdlIHNlcXVlbmNlIG51bWJlciAobHBzbikgaW5pdGlhbGl6YXRpb246CisJICoKKwkgKiBwbjogICAwICAgICAxICAgICAyICAgICAzICAgICAgICAgICAgICAgICBuLTEKKwkgKiAgICAgICArLS0tLS0rLS0tLS0rPT09PT0rPT09PT0rPT09Li4uLi49PT0rPT09PT0rCisJICogbHNwbjogICAgICAgICAgICAgTi0xICAgMCAgICAgMSAgICAgICAgICAgTi0yCisJICogICAgICAgICAgICAgICAgICAgPC0tLSBOIHBhZ2UgY2lyY3VsYXIgZmlsZSAtLS0tPgorCSAqCisJICogdGhlIE4gKD0gbnBhZ2VzLTIpIGRhdGEgcGFnZXMgb2YgdGhlIGxvZyBpcyBtYWludGFpbmVkIGFzCisJICogYSBjaXJjdWxhciBmaWxlIGZvciB0aGUgbG9nIHJlY29yZHM7CisJICogbHBzbiBncm93cyBieSAxIG1vbm90b25pY2FsbHkgYXMgZWFjaCBsb2cgcGFnZSBpcyB3cml0dGVuCisJICogdG8gdGhlIGNpcmN1bGFyIGZpbGUgb2YgdGhlIGxvZzsKKwkgKiBhbmQgc2V0TG9ncGFnZSgpIHdpbGwgbm90IHJlc2V0IHRoZSBwYWdlIG51bWJlciBldmVuIGlmCisJICogdGhlIGVvciBpcyBlcXVhbCB0byBMT0dQSERSU0laRS4gSW4gb3JkZXIgZm9yIGJpbmFyeSBzZWFyY2gKKwkgKiBzdGlsbCB3b3JrIGluIGZpbmQgbG9nIGVuZCBwcm9jZXNzLCB3ZSBoYXZlIHRvIHNpbXVsYXRlIHRoZQorCSAqIGxvZyB3cmFwIHNpdHVhdGlvbiBhdCB0aGUgbG9nIGZvcm1hdCB0aW1lLgorCSAqIFRoZSAxc3QgbG9nIHBhZ2Ugd3JpdHRlbiB3aWxsIGhhdmUgdGhlIGhpZ2hlc3QgbHBzbi4gVGhlbgorCSAqIHRoZSBzdWNjZWVkaW5nIGxvZyBwYWdlcyB3aWxsIGhhdmUgYXNjZW5kaW5nIG9yZGVyIG9mCisJICogdGhlIGxzcG4gc3RhcnRpbmcgZnJvbSAwLCAuLi4gKE4tMikKKwkgKi8KKwlscCA9IChzdHJ1Y3QgbG9ncGFnZSAqKSBicC0+bF9sZGF0YTsKKwkvKgorCSAqIGluaXRpYWxpemUgMXN0IGxvZyBwYWdlIHRvIGJlIHdyaXR0ZW46IGxwc24gPSBOIC0gMSwKKwkgKiB3cml0ZSBhIFNZTkNQVCBsb2cgcmVjb3JkIGlzIHdyaXR0ZW4gdG8gdGhpcyBwYWdlCisJICovCisJbHAtPmgucGFnZSA9IGxwLT50LnBhZ2UgPSBjcHVfdG9fbGUzMihucGFnZXMgLSAzKTsKKwlscC0+aC5lb3IgPSBscC0+dC5lb3IgPSBjcHVfdG9fbGUxNihMT0dQSERSU0laRSArIExPR1JEU0laRSk7CisKKwlscmRfcHRyID0gKHN0cnVjdCBscmQgKikgJmxwLT5kYXRhOworCWxyZF9wdHItPmxvZ3RpZCA9IDA7CisJbHJkX3B0ci0+YmFja2NoYWluID0gMDsKKwlscmRfcHRyLT50eXBlID0gY3B1X3RvX2xlMTYoTE9HX1NZTkNQVCk7CisJbHJkX3B0ci0+bGVuZ3RoID0gMDsKKwlscmRfcHRyLT5sb2cuc3luY3B0LnN5bmMgPSAwOworCisJYnAtPmxfYmxrbm8gKz0gc2JpLT5uYnBlcnBhZ2U7CisJYnAtPmxfZmxhZyA9IGxibVdSSVRFIHwgbGJtU1lOQyB8IGxibURJUkVDVDsKKwlsYm1TdGFydElPKGJwKTsKKwlpZiAoKHJjID0gbGJtSU9XYWl0KGJwLCAwKSkpCisJCWdvdG8gZXhpdDsKKworCS8qCisJICogICAgICBpbml0aWFsaXplIHN1Y2NlZWRpbmcgbG9nIHBhZ2VzOiBscHNuID0gMCwgMSwgLi4uLCAoTi0yKQorCSAqLworCWZvciAobHNwbiA9IDA7IGxzcG4gPCBucGFnZXMgLSAzOyBsc3BuKyspIHsKKwkJbHAtPmgucGFnZSA9IGxwLT50LnBhZ2UgPSBjcHVfdG9fbGUzMihsc3BuKTsKKwkJbHAtPmguZW9yID0gbHAtPnQuZW9yID0gY3B1X3RvX2xlMTYoTE9HUEhEUlNJWkUpOworCisJCWJwLT5sX2Jsa25vICs9IHNiaS0+bmJwZXJwYWdlOworCQlicC0+bF9mbGFnID0gbGJtV1JJVEUgfCBsYm1TWU5DIHwgbGJtRElSRUNUOworCQlsYm1TdGFydElPKGJwKTsKKwkJaWYgKChyYyA9IGxibUlPV2FpdChicCwgMCkpKQorCQkJZ290byBleGl0OworCX0KKworCXJjID0gMDsKK2V4aXQ6CisJLyoKKwkgKiAgICAgIGZpbmFsaXplIGxvZworCSAqLworCS8qIHJlbGVhc2UgdGhlIGJ1ZmZlciAqLworCWxibUZyZWUoYnApOworCisJcmV0dXJuIHJjOworfQorCisjaWZkZWYgQ09ORklHX0pGU19TVEFUSVNUSUNTCitpbnQgamZzX2xtc3RhdHNfcmVhZChjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorCQkgICAgICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgbGVuID0gMDsKKwlvZmZfdCBiZWdpbjsKKworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciwKKwkJICAgICAgICJKRlMgTG9nbWdyIHN0YXRzXG4iCisJCSAgICAgICAiPT09PT09PT09PT09PT09PVxuIgorCQkgICAgICAgImNvbW1pdHMgPSAlZFxuIgorCQkgICAgICAgIndyaXRlcyBzdWJtaXR0ZWQgPSAlZFxuIgorCQkgICAgICAgIndyaXRlcyBjb21wbGV0ZWQgPSAlZFxuIgorCQkgICAgICAgImZ1bGwgcGFnZXMgc3VibWl0dGVkID0gJWRcbiIKKwkJICAgICAgICJwYXJ0aWFsIHBhZ2VzIHN1Ym1pdHRlZCA9ICVkXG4iLAorCQkgICAgICAgbG1TdGF0LmNvbW1pdCwKKwkJICAgICAgIGxtU3RhdC5zdWJtaXR0ZWQsCisJCSAgICAgICBsbVN0YXQucGFnZWRvbmUsCisJCSAgICAgICBsbVN0YXQuZnVsbF9wYWdlLAorCQkgICAgICAgbG1TdGF0LnBhcnRpYWxfcGFnZSk7CisKKwliZWdpbiA9IG9mZnNldDsKKwkqc3RhcnQgPSBidWZmZXIgKyBiZWdpbjsKKwlsZW4gLT0gYmVnaW47CisKKwlpZiAobGVuID4gbGVuZ3RoKQorCQlsZW4gPSBsZW5ndGg7CisJZWxzZQorCQkqZW9mID0gMTsKKworCWlmIChsZW4gPCAwKQorCQlsZW4gPSAwOworCisJcmV0dXJuIGxlbjsKK30KKyNlbmRpZiAvKiBDT05GSUdfSkZTX1NUQVRJU1RJQ1MgKi8KZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfbG9nbWdyLmggYi9mcy9qZnMvamZzX2xvZ21nci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MWFkNzQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZnMvamZzX2xvZ21nci5oCkBAIC0wLDAgKzEsNTEwIEBACisvKgorICogICBDb3B5cmlnaHQgKEMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDAtMjAwNAorICogICBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIENocmlzdG9waCBIZWxsd2lnLCAyMDAxLTIwMDIKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2lmbmRlZglfSF9KRlNfTE9HTUdSCisjZGVmaW5lIF9IX0pGU19MT0dNR1IKKworI2luY2x1ZGUgImpmc19maWxzeXMuaCIKKyNpbmNsdWRlICJqZnNfbG9jay5oIgorCisvKgorICoJbG9nIG1hbmFnZXIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgKi8KKworLyogbG9nIHBhZ2Ugc2l6ZSAqLworI2RlZmluZQlMT0dQU0laRQk0MDk2CisjZGVmaW5lCUwyTE9HUFNJWkUJMTIKKworI2RlZmluZSBMT0dQQUdFUwkxNgkvKiBMb2cgcGFnZXMgcGVyIG1vdW50ZWQgZmlsZSBzeXN0ZW0gKi8KKworLyoKKyAqCWxvZyBsb2dpY2FsIHZvbHVtZQorICoKKyAqIGEgbG9nIGlzIHVzZWQgdG8gbWFrZSB0aGUgY29tbWl0IG9wZXJhdGlvbiBvbiBqb3VybmFsbGVkIAorICogZmlsZXMgd2l0aGluIHRoZSBzYW1lIGxvZ2ljYWwgdm9sdW1lIGdyb3VwIGF0b21pYy4KKyAqIGEgbG9nIGlzIGltcGxlbWVudGVkIHdpdGggYSBsb2dpY2FsIHZvbHVtZS4KKyAqIHRoZXJlIGlzIG9uZSBsb2cgcGVyIGxvZ2ljYWwgdm9sdW1lIGdyb3VwLiAKKyAqCisgKiBibG9jayAwIG9mIHRoZSBsb2cgbG9naWNhbCB2b2x1bWUgaXMgbm90IHVzZWQgKGlwbCBldGMpLgorICogYmxvY2sgMSBjb250YWlucyBhIGxvZyAic3VwZXJibG9jayIgYW5kIGlzIHVzZWQgYnkgbG9nRm9ybWF0KCksCisgKiBsbUxvZ0luaXQoKSwgbG1Mb2dTaHV0ZG93bigpLCBhbmQgbG9nUmVkbygpIHRvIHJlY29yZCBzdGF0dXMgCisgKiBvZiB0aGUgbG9nIGJ1dCBpcyBub3Qgb3RoZXJ3aXNlIHVzZWQgZHVyaW5nIG5vcm1hbCBwcm9jZXNzaW5nLiAKKyAqIGJsb2NrcyAyIC0gKE4tMSkgYXJlIHVzZWQgdG8gY29udGFpbiBsb2cgcmVjb3Jkcy4KKyAqCisgKiB3aGVuIGEgdm9sdW1lIGdyb3VwIGlzIHZhcmllZC1vbi1saW5lLCBsb2dSZWRvKCkgbXVzdCBoYXZlIAorICogYmVlbiBleGVjdXRlZCBiZWZvcmUgdGhlIGZpbGUgc3lzdGVtcyAobG9naWNhbCB2b2x1bWVzKSBpbiAKKyAqIHRoZSB2b2x1bWUgZ3JvdXAgY2FuIGJlIG1vdW50ZWQuCisgKi8KKy8qCisgKglsb2cgc3VwZXJibG9jayAoYmxvY2sgMSBvZiBsb2dpY2FsIHZvbHVtZSkKKyAqLworI2RlZmluZQlMT0dTVVBFUl9CCTEKKyNkZWZpbmUJTE9HU1RBUlRfQgkyCisKKyNkZWZpbmUJTE9HTUFHSUMJMHg4NzY1NDMyMQorI2RlZmluZQlMT0dWRVJTSU9OCTEKKworI2RlZmluZSBNQVhfQUNUSVZFCTEyOAkvKiBNYXggYWN0aXZlIGZpbGUgc3lzdGVtcyBzaGFyaW5nIGxvZyAqLworCitzdHJ1Y3QgbG9nc3VwZXIgeworCV9fbGUzMiBtYWdpYzsJCS8qIDQ6IGxvZyBsdiBpZGVudGlmaWVyICovCisJX19sZTMyIHZlcnNpb247CQkvKiA0OiB2ZXJzaW9uIG51bWJlciAqLworCV9fbGUzMiBzZXJpYWw7CQkvKiA0OiBsb2cgb3Blbi9tb3VudCBjb3VudGVyICovCisJX19sZTMyIHNpemU7CQkvKiA0OiBzaXplIGluIG51bWJlciBvZiBMT0dQU0laRSBibG9ja3MgKi8KKwlfX2xlMzIgYnNpemU7CQkvKiA0OiBsb2dpY2FsIGJsb2NrIHNpemUgaW4gYnl0ZSAqLworCV9fbGUzMiBsMmJzaXplOwkJLyogNDogbG9nMiBvZiBic2l6ZSAqLworCisJX19sZTMyIGZsYWc7CQkvKiA0OiBvcHRpb24gKi8KKwlfX2xlMzIgc3RhdGU7CQkvKiA0OiBzdGF0ZSAtIHNlZSBiZWxvdyAqLworCisJX19sZTMyIGVuZDsJCS8qIDQ6IGFkZHIgb2YgbGFzdCBsb2cgcmVjb3JkIHNldCBieSBsb2dyZWRvICovCisJY2hhciB1dWlkWzE2XTsJCS8qIDE2OiAxMjgtYml0IGpvdXJuYWwgdXVpZCAqLworCWNoYXIgbGFiZWxbMTZdOwkJLyogMTY6IGpvdXJuYWwgbGFiZWwgKi8KKwlzdHJ1Y3QgeworCQljaGFyIHV1aWRbMTZdOworCX0gYWN0aXZlW01BWF9BQ1RJVkVdOwkvKiAyMDQ4OiBhY3RpdmUgZmlsZSBzeXN0ZW1zIGxpc3QgKi8KK307CisKKyNkZWZpbmUgTlVMTF9VVUlEICJcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMCIKKworLyogbG9nIGZsYWc6IGNvbW1pdCBvcHRpb24gKHNlZSBqZnNfZmlsc3lzLmgpICovCisKKy8qIGxvZyBzdGF0ZSAqLworI2RlZmluZQlMT0dNT1VOVAkwCS8qIGxvZyBtb3VudGVkIGJ5IGxtTG9nSW5pdCgpICovCisjZGVmaW5lIExPR1JFRE9ORQkxCS8qIGxvZyBzaHV0ZG93biBieSBsbUxvZ1NodXRkb3duKCkuCisJCQkJICogbG9nIHJlZG8gY29tcGxldGVkIGJ5IGxvZ3JlZG8oKS4KKwkJCQkgKi8KKyNkZWZpbmUgTE9HV1JBUAkJMgkvKiBsb2cgd3JhcHBlZCAqLworI2RlZmluZSBMT0dSRUFERVJSCTMJLyogbG9nIHJlYWQgZXJyb3IgZGV0ZWN0ZWQgaW4gbG9ncmVkbygpICovCisKKworLyoKKyAqCWxvZyBsb2dpY2FsIHBhZ2UKKyAqCisgKiAodGhpcyBjb21tZW50IHNob3VsZCBiZSByZXdyaXR0ZW4gISkKKyAqIHRoZSBoZWFkZXIgYW5kIHRyYWlsZXIgc3RydWN0dXJlcyAoaCx0KSB3aWxsIG5vcm1hbGx5IGhhdmUgCisgKiB0aGUgc2FtZSBwYWdlIGFuZCBlb3IgdmFsdWUuCisgKiBBbiBleGNlcHRpb24gdG8gdGhpcyBvY2N1cnMgd2hlbiBhIGNvbXBsZXRlIHBhZ2Ugd3JpdGUgaXMgbm90IAorICogYWNjb21wbGlzaGVkIG9uIGEgcG93ZXIgZmFpbHVyZS4gU2luY2UgdGhlIGhhcmR3YXJlIG1heSAic3BsaXQgd3JpdGUiCisgKiBzZWN0b3JzIGluIHRoZSBwYWdlLCBhbnkgb3V0IG9mIG9yZGVyIHNlcXVlbmNlIG1heSBvY2N1ciBkdXJpbmcgcG93ZXJmYWlsIAorICogYW5kIG5lZWRzIHRvIGJlIHJlY29nbml6ZWQgZHVyaW5nIGxvZyByZXBsYXkuICBUaGUgeG9yIHZhbHVlIGlzCisgKiBhbiAiZXhjbHVzaXZlIG9yIiBvZiBhbGwgbG9nIHdvcmRzIGluIHRoZSBwYWdlIHVwIHRvIGVvci4gIFRoaXMKKyAqIDMyIGJpdCBlb3IgaXMgc3RvcmVkIHdpdGggdGhlIHRvcCAxNiBiaXRzIGluIHRoZSBoZWFkZXIgYW5kIHRoZQorICogYm90dG9tIDE2IGJpdHMgaW4gdGhlIHRyYWlsZXIuICBsb2dyZWRvIGNhbiBlYXNpbHkgcmVjb2duaXplIHBhZ2VzCisgKiB0aGF0IHdlcmUgbm90IGNvbXBsZXRlZCBieSByZWNvbnN0cnVjdGluZyB0aGlzIGVvciBhbmQgY2hlY2tpbmcgCisgKiB0aGUgbG9nIHBhZ2UuCisgKgorICogUHJldmlvdXMgdmVyc2lvbnMgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gZGlkIG5vdCBhbGxvdyBzcGxpdCAKKyAqIHdyaXRlcyBhbmQgZGV0ZWN0ZWQgcGFydGlhbGx5IHdyaXR0ZW4gcmVjb3JkcyBpbiBsb2dyZWRvIGJ5IAorICogb3JkZXJpbmcgdGhlIHVwZGF0ZXMgdG8gdGhlIGhlYWRlciwgdHJhaWxlciwgYW5kIHRoZSBtb3ZlIG9mIGRhdGEgCisgKiBpbnRvIHRoZSBsb2dkYXRhIGFyZWEuICBUaGUgb3JkZXI6ICgxKSBkYXRhIGlzIG1vdmVkICgyKSBoZWFkZXIgCisgKiBpcyB1cGRhdGVkICgzKSB0cmFpbGVyIGlzIHVwZGF0ZWQuICBJbiBsb2dyZWRvLCB3aGVuIHRoZSBoZWFkZXIgCisgKiBkaWZmZXJlZCBmcm9tIHRoZSB0cmFpbGVyLCB0aGUgaGVhZGVyIGFuZCB0cmFpbGVyIHdlcmUgcmVjb25jaWxlZCAKKyAqIGFzIGZvbGxvd3M6IGlmIGgucGFnZSAhPSB0LnBhZ2UgdGhleSB3ZXJlIHNldCB0byB0aGUgc21hbGxlciBvZiAKKyAqIHRoZSB0d28gYW5kIGguZW9yIGFuZCB0LmVvciBzZXQgdG8gOCAoaS5lLiBlbXB0eSBwYWdlKS4gaWYgKG9ubHkpIAorICogaC5lb3IgIT0gdC5lb3IgdGhleSB3ZXJlIHNldCB0byB0aGUgc21hbGxlciBvZiB0aGVpciB0d28gdmFsdWVzLgorICovCitzdHJ1Y3QgbG9ncGFnZSB7CisJc3RydWN0IHsJCS8qIGhlYWRlciAqLworCQlfX2xlMzIgcGFnZTsJLyogNDogbG9nIHNlcXVlbmNlIHBhZ2UgbnVtYmVyICovCisJCV9fbGUxNiByc3J2ZDsJLyogMjogKi8KKwkJX19sZTE2IGVvcjsJLyogMjogZW5kLW9mLWxvZyBvZmZzZXQgb2YgbGFzcnQgcmVjb3JkIHdyaXRlICovCisJfSBoOworCisJX19sZTMyIGRhdGFbTE9HUFNJWkUgLyA0IC0gNF07CS8qIGxvZyByZWNvcmQgYXJlYSAqLworCisJc3RydWN0IHsJCS8qIHRyYWlsZXIgKi8KKwkJX19sZTMyIHBhZ2U7CS8qIDQ6IG5vcm1hbGx5IHRoZSBzYW1lIGFzIGgucGFnZSAqLworCQlfX2xlMTYgcnNydmQ7CS8qIDI6ICovCisJCV9fbGUxNiBlb3I7CS8qIDI6IG5vcm1hbGx5IHRoZSBzYW1lIGFzIGguZW9yICovCisJfSB0OworfTsKKworI2RlZmluZSBMT0dQSERSU0laRQk4CS8qIGxvZyBwYWdlIGhlYWRlciBzaXplICovCisjZGVmaW5lIExPR1BUTFJTSVpFCTgJLyogbG9nIHBhZ2UgdHJhaWxlciBzaXplICovCisKKworLyoKKyAqCWxvZyByZWNvcmQKKyAqCisgKiAodGhpcyBjb21tZW50IHNob3VsZCBiZSByZXdyaXR0ZW4gISkKKyAqIGpmcyB1c2VzIG9ubHkgImFmdGVyIiBsb2cgcmVjb3JkcyAob25seSBhIHNpbmdsZSB3cml0ZXIgaXMgYWxsb3dlZAorICogaW4gYSAgcGFnZSwgcGFnZXMgYXJlIHdyaXR0ZW4gdG8gdGVtcG9yYXJ5IHBhZ2luZyBzcGFjZSBpZgorICogaWYgdGhleSBtdXN0IGJlIHdyaXR0ZW4gdG8gZGlzayBiZWZvcmUgY29tbWl0LCBhbmQgaS9vIGlzCisgKiBzY2hlZHVsZWQgZm9yIG1vZGlmaWVkIHBhZ2VzIHRvIHRoZWlyIGhvbWUgbG9jYXRpb24gYWZ0ZXIKKyAqIHRoZSBsb2cgcmVjb3JkcyBjb250YWluaW5nIHRoZSBhZnRlciB2YWx1ZXMgYW5kIHRoZSBjb21taXQgCisgKiByZWNvcmQgaXMgd3JpdHRlbiB0byB0aGUgbG9nIG9uIGRpc2ssIHVuZG8gZGlzY2FyZHMgdGhlIGNvcHkKKyAqIGluIG1haW4tbWVtb3J5LikKKyAqCisgKiBhIGxvZyByZWNvcmQgY29uc2lzdHMgb2YgYSBkYXRhIGFyZWEgb2YgdmFyaWFibGUgbGVuZ3RoIGZvbGxvd2VkIGJ5IAorICogYSBkZXNjcmlwdG9yIG9mIGZpeGVkIHNpemUgTE9HUkRTSVpFIGJ5dGVzLgorICogdGhlICBkYXRhIGFyZWEgaXMgcm91bmRlZCB1cCB0byBhbiBpbnRlZ3JhbCBudW1iZXIgb2YgNC1ieXRlcyBhbmQgCisgKiBtdXN0IGJlIG5vIGxvbmdlciB0aGFuIExPR1BTSVpFLgorICogdGhlIGRlc2NyaXB0b3IgaXMgb2Ygc2l6ZSBvZiBtdWx0aXBsZSBvZiA0LWJ5dGVzIGFuZCBhbGlnbmVkIG9uIGEgCisgKiA0LWJ5dGUgYm91bmRhcnkuIAorICogcmVjb3JkcyBhcmUgcGFja2VkIG9uZSBhZnRlciB0aGUgb3RoZXIgaW4gdGhlIGRhdGEgYXJlYSBvZiBsb2cgcGFnZXMuCisgKiAoc29tZXRpbWVzIGEgRFVNTVkgcmVjb3JkIGlzIGluc2VydGVkIHNvIHRoYXQgYXQgbGVhc3Qgb25lIHJlY29yZCBlbmRzIAorICogb24gZXZlcnkgcGFnZSBvciB0aGUgbG9uZ2VzdCByZWNvcmQgaXMgcGxhY2VkIG9uIGF0IG1vc3QgdHdvIHBhZ2VzKS4KKyAqIHRoZSBmaWVsZCBlb3IgaW4gcGFnZSBoZWFkZXIvdHJhaWxlciBwb2ludHMgdG8gdGhlIGJ5dGUgZm9sbG93aW5nIAorICogdGhlIGxhc3QgcmVjb3JkIG9uIGEgcGFnZS4KKyAqLworCisvKiBsb2cgcmVjb3JkIHR5cGVzICovCisjZGVmaW5lIExPR19DT01NSVQJCTB4ODAwMAorI2RlZmluZSBMT0dfU1lOQ1BUCQkweDQwMDAKKyNkZWZpbmUgTE9HX01PVU5UCQkweDIwMDAKKyNkZWZpbmUgTE9HX1JFRE9QQUdFCQkweDA4MDAKKyNkZWZpbmUgTE9HX05PUkVET1BBR0UJCTB4MDA4MAorI2RlZmluZSBMT0dfTk9SRURPSU5PRVhUCTB4MDA0MAorI2RlZmluZSBMT0dfVVBEQVRFTUFQCQkweDAwMDgKKyNkZWZpbmUgTE9HX05PUkVET0ZJTEUJCTB4MDAwMQorCisvKiBSRURPUEFHRS9OT1JFRE9QQUdFIGxvZyByZWNvcmQgZGF0YSB0eXBlICovCisjZGVmaW5lCUxPR19JTk9ERQkJMHgwMDAxCisjZGVmaW5lCUxPR19YVFJFRQkJMHgwMDAyCisjZGVmaW5lCUxPR19EVFJFRQkJMHgwMDA0CisjZGVmaW5lCUxPR19CVFJPT1QJCTB4MDAxMAorI2RlZmluZQlMT0dfRUEJCQkweDAwMjAKKyNkZWZpbmUJTE9HX0FDTAkJCTB4MDA0MAorI2RlZmluZQlMT0dfREFUQQkJMHgwMDgwCisjZGVmaW5lCUxPR19ORVcJCQkweDAxMDAKKyNkZWZpbmUJTE9HX0VYVEVORAkJMHgwMjAwCisjZGVmaW5lIExPR19SRUxPQ0FURQkJMHgwNDAwCisjZGVmaW5lIExPR19ESVJfWFRSRUUJCTB4MDgwMAkvKiBYdHJlZSBpcyBpbiBkaXJlY3RvcnkgaW5vZGUgKi8KKworLyogVVBEQVRFTUFQIGxvZyByZWNvcmQgZGVzY3JpcHRvciB0eXBlICovCisjZGVmaW5lCUxPR19BTExPQ1hBRExJU1QJMHgwMDgwCisjZGVmaW5lCUxPR19BTExPQ1BYRExJU1QJMHgwMDQwCisjZGVmaW5lCUxPR19BTExPQ1hBRAkJMHgwMDIwCisjZGVmaW5lCUxPR19BTExPQ1BYRAkJMHgwMDEwCisjZGVmaW5lCUxPR19GUkVFWEFETElTVAkJMHgwMDA4CisjZGVmaW5lCUxPR19GUkVFUFhETElTVAkJMHgwMDA0CisjZGVmaW5lCUxPR19GUkVFWEFECQkweDAwMDIKKyNkZWZpbmUJTE9HX0ZSRUVQWEQJCTB4MDAwMQorCisKK3N0cnVjdCBscmQgeworCS8qCisJICogdHlwZSBpbmRlcGVuZGVudCBhcmVhCisJICovCisJX19sZTMyIGxvZ3RpZDsJCS8qIDQ6IGxvZyB0cmFuc2FjdGlvbiBpZGVudGlmaWVyICovCisJX19sZTMyIGJhY2tjaGFpbjsJLyogNDogcHRyIHRvIHByZXYgcmVjb3JkIG9mIHNhbWUgdHJhbnNhY3Rpb24gKi8KKwlfX2xlMTYgdHlwZTsJCS8qIDI6IHJlY29yZCB0eXBlICovCisJX19sZTE2IGxlbmd0aDsJCS8qIDI6IGxlbmd0aCBvZiBkYXRhIGluIHJlY29yZCAoaW4gYnl0ZSkgKi8KKwlfX2xlMzIgYWdncmVnYXRlOwkvKiA0OiBmaWxlIHN5c3RlbSBsdi9hZ2dyZWdhdGUgKi8KKwkvKiAoMTYpICovCisKKwkvKgorCSAqIHR5cGUgZGVwZW5kZW50IGFyZWEgKDIwKQorCSAqLworCXVuaW9uIHsKKworCQkvKgorCQkgKiAgICAgIENPTU1JVDogY29tbWl0CisJCSAqCisJCSAqIHRyYW5zYWN0aW9uIGNvbW1pdDogbm8gdHlwZS1kZXBlbmRlbnQgaW5mb3JtYXRpb247CisJCSAqLworCisJCS8qCisJCSAqICAgICAgUkVET1BBR0U6IGFmdGVyLWltYWdlCisJCSAqCisJCSAqIGFwcGx5IGFmdGVyLWltYWdlOworCQkgKgorCQkgKiBOLkIuIFJFRE9QQUdFLCBOT1JFRE9QQUdFLCBhbmQgVVBEQVRFTUFQIG11c3QgYmUgc2FtZSBmb3JtYXQ7CisJCSAqLworCQlzdHJ1Y3QgeworCQkJX19sZTMyIGZpbGVzZXQ7CS8qIDQ6IGZpbGVzZXQgbnVtYmVyICovCisJCQlfX2xlMzIgaW5vZGU7CS8qIDQ6IGlub2RlIG51bWJlciAqLworCQkJX19sZTE2IHR5cGU7CS8qIDI6IFJFRE9QQUdFIHJlY29yZCB0eXBlICovCisJCQlfX2xlMTYgbDJsaW5lc2l6ZTsJLyogMjogbG9nMiBvZiBsaW5lIHNpemUgKi8KKwkJCXB4ZF90IHB4ZDsJLyogODogb24tZGlzayBwYWdlIHB4ZCAqLworCQl9IHJlZG9wYWdlOwkvKiAoMjApICovCisKKwkJLyoKKwkJICogICAgICBOT1JFRE9QQUdFOiB0aGUgcGFnZSBpcyBmcmVlZAorCQkgKgorCQkgKiBkbyBub3QgYXBwbHkgYWZ0ZXItaW1hZ2UgcmVjb3JkcyB3aGljaCBwcmVjZWRlIHRoaXMgcmVjb3JkCisJCSAqIGluIHRoZSBsb2cgd2l0aCB0aGUgc2FtZSBwYWdlIGJsb2NrIG51bWJlciB0byB0aGlzIHBhZ2UuCisJCSAqCisJCSAqIE4uQi4gUkVET1BBR0UsIE5PUkVET1BBR0UsIGFuZCBVUERBVEVNQVAgbXVzdCBiZSBzYW1lIGZvcm1hdDsKKwkJICovCisJCXN0cnVjdCB7CisJCQlfX2xlMzIgZmlsZXNldDsJLyogNDogZmlsZXNldCBudW1iZXIgKi8KKwkJCV9fbGUzMiBpbm9kZTsJLyogNDogaW5vZGUgbnVtYmVyICovCisJCQlfX2xlMTYgdHlwZTsJLyogMjogTk9SRURPUEFHRSByZWNvcmQgdHlwZSAqLworCQkJX19sZTE2IHJzcnZkOwkvKiAyOiByZXNlcnZlZCAqLworCQkJcHhkX3QgcHhkOwkvKiA4OiBvbi1kaXNrIHBhZ2UgcHhkICovCisJCX0gbm9yZWRvcGFnZTsJLyogKDIwKSAqLworCisJCS8qCisJCSAqICAgICAgVVBEQVRFTUFQOiB1cGRhdGUgYmxvY2sgYWxsb2NhdGlvbiBtYXAKKwkJICoKKwkJICogZWl0aGVyIGluLWxpbmUgUFhELAorCQkgKiBvciAgICAgb3V0LW9mLWxpbmUgIFhBRExJU1Q7CisJCSAqCisJCSAqIE4uQi4gUkVET1BBR0UsIE5PUkVET1BBR0UsIGFuZCBVUERBVEVNQVAgbXVzdCBiZSBzYW1lIGZvcm1hdDsKKwkJICovCisJCXN0cnVjdCB7CisJCQlfX2xlMzIgZmlsZXNldDsJLyogNDogZmlsZXNldCBudW1iZXIgKi8KKwkJCV9fbGUzMiBpbm9kZTsJLyogNDogaW5vZGUgbnVtYmVyICovCisJCQlfX2xlMTYgdHlwZTsJLyogMjogVVBEQVRFTUFQIHJlY29yZCB0eXBlICovCisJCQlfX2xlMTYgbnhkOwkvKiAyOiBudW1iZXIgb2YgZXh0ZW50cyAqLworCQkJcHhkX3QgcHhkOwkvKiA4OiBweGQgKi8KKwkJfSB1cGRhdGVtYXA7CS8qICgyMCkgKi8KKworCQkvKgorCQkgKiAgICAgIE5PUkVET0lOT0VYVDogdGhlIGlub2RlIGV4dGVudCBpcyBmcmVlZAorCQkgKgorCQkgKiBkbyBub3QgYXBwbHkgYWZ0ZXItaW1hZ2UgcmVjb3JkcyB3aGljaCBwcmVjZWRlIHRoaXMgCisJCSAqIHJlY29yZCBpbiB0aGUgbG9nIHdpdGggdGhlIGFueSBvZiB0aGUgNCBwYWdlIGJsb2NrIAorCQkgKiBudW1iZXJzIGluIHRoaXMgaW5vZGUgZXh0ZW50LiAKKwkJICogCisJCSAqIE5PVEU6IFRoZSBmaWxlc2V0IGFuZCBweGQgZmllbGRzIE1VU1QgcmVtYWluIGluIAorCQkgKiAgICAgICB0aGUgc2FtZSBmaWVsZHMgaW4gdGhlIFJFRE9QQUdFIHJlY29yZCBmb3JtYXQuCisJCSAqCisJCSAqLworCQlzdHJ1Y3QgeworCQkJX19sZTMyIGZpbGVzZXQ7CS8qIDQ6IGZpbGVzZXQgbnVtYmVyICovCisJCQlfX2xlMzIgaWFnbnVtOwkvKiA0OiBJQUcgbnVtYmVyICAgICAqLworCQkJX19sZTMyIGlub2V4dF9pZHg7CS8qIDQ6IGlub2RlIGV4dGVudCBpbmRleCAqLworCQkJcHhkX3QgcHhkOwkvKiA4OiBvbi1kaXNrIHBhZ2UgcHhkICovCisJCX0gbm9yZWRvaW5vZXh0OwkvKiAoMjApICovCisKKwkJLyoKKwkJICogICAgICBTWU5DUFQ6IGxvZyBzeW5jIHBvaW50CisJCSAqCisJCSAqIHJlcGxheSBsb2cgdXB0byBzeW5jcHQgYWRkcmVzcyBzcGVjaWZpZWQ7CisJCSAqLworCQlzdHJ1Y3QgeworCQkJX19sZTMyIHN5bmM7CS8qIDQ6IHN5bmNwdCBhZGRyZXNzICgwID0gaGVyZSkgKi8KKwkJfSBzeW5jcHQ7CisKKwkJLyoKKwkJICogICAgICBNT1VOVDogZmlsZSBzeXN0ZW0gbW91bnQKKwkJICoKKwkJICogZmlsZSBzeXN0ZW0gbW91bnQ6IG5vIHR5cGUtZGVwZW5kZW50IGluZm9ybWF0aW9uOworCQkgKi8KKworCQkvKgorCQkgKiAgICAgID8gRlJFRVhURU5UOiBmcmVlIHNwZWNpZmllZCBleHRlbnQocykKKwkJICoKKwkJICogZnJlZSBzcGVjaWZpZWQgZXh0ZW50KHMpIGZyb20gYmxvY2sgYWxsb2NhdGlvbiBtYXAKKwkJICogTi5CLjogbmV4dGVudHMgc2hvdWxkIGJlIGxlbmd0aCBvZiBkYXRhL3NpemVvZih4YWRfdCkKKwkJICovCisJCXN0cnVjdCB7CisJCQlfX2xlMzIgdHlwZTsJLyogNDogRlJFRVhURU5UIHJlY29yZCB0eXBlICovCisJCQlfX2xlMzIgbmV4dGVudDsJLyogNDogbnVtYmVyIG9mIGV4dGVudHMgKi8KKworCQkJLyogZGF0YTogUFhEIG9yIFhBRCBsaXN0ICovCisJCX0gZnJlZXh0ZW50OworCisJCS8qCisJCSAqICAgICAgPyBOT1JFRE9GSUxFOiB0aGlzIGZpbGUgaXMgZnJlZWQKKwkJICoKKwkJICogZG8gbm90IGFwcGx5IHJlY29yZHMgd2hpY2ggcHJlY2VkZSB0aGlzIHJlY29yZCBpbiB0aGUgbG9nCisJCSAqIHdpdGggdGhlIHNhbWUgaW5vZGUgbnVtYmVyLgorCQkgKgorCQkgKiBOT1JFRElMRSBtdXN0IGJlIHRoZSBmaXJzdCB0byBiZSB3cml0dGVuIGF0IGNvbW1pdAorCQkgKiAobGFzdCB0byBiZSByZWFkIGluIGxvZ3JlZG8oKSkgLSBpdCBwcmV2ZW50cworCQkgKiByZXBsYXkgb2YgcHJlY2VkaW5nIHVwZGF0ZXMgb2YgYWxsIHByZWNlZGluZyBnZW5lcmF0aW9ucworCQkgKiBvZiB0aGUgaW51bWJlciBlc3AuIHRoZSBvbi1kaXNrIGlub2RlIGl0c2VsZiwgCisJCSAqIGJ1dCBkb2VzIE5PVCBwcmV2ZW50CisJCSAqIHJlcGxheSBvZiB0aGUgCisJCSAqLworCQlzdHJ1Y3QgeworCQkJX19sZTMyIGZpbGVzZXQ7CS8qIDQ6IGZpbGVzZXQgbnVtYmVyICovCisJCQlfX2xlMzIgaW5vZGU7CS8qIDQ6IGlub2RlIG51bWJlciAqLworCQl9IG5vcmVkb2ZpbGU7CisKKwkJLyoKKwkJICogICAgICA/IE5FV1BBR0U6IAorCQkgKgorCQkgKiBtZXRhZGF0YSB0eXBlIGRlcGVuZGVudAorCQkgKi8KKwkJc3RydWN0IHsKKwkJCV9fbGUzMiBmaWxlc2V0OwkvKiA0OiBmaWxlc2V0IG51bWJlciAqLworCQkJX19sZTMyIGlub2RlOwkvKiA0OiBpbm9kZSBudW1iZXIgKi8KKwkJCV9fbGUzMiB0eXBlOwkvKiA0OiBORVdQQUdFIHJlY29yZCB0eXBlICovCisJCQlweGRfdCBweGQ7CS8qIDg6IG9uLWRpc2sgcGFnZSBweGQgKi8KKwkJfSBuZXdwYWdlOworCisJCS8qCisJCSAqICAgICAgPyBEVU1NWTogZmlsbGVyCisJCSAqCisJCSAqIG5vIHR5cGUtZGVwZW5kZW50IGluZm9ybWF0aW9uCisJCSAqLworCX0gbG9nOworfTsJCQkJCS8qICgzNikgKi8KKworI2RlZmluZQlMT0dSRFNJWkUJKHNpemVvZihzdHJ1Y3QgbHJkKSkKKworLyoKKyAqCWxpbmUgdmVjdG9yIGRlc2NyaXB0b3IKKyAqLworc3RydWN0IGx2ZCB7CisJX19sZTE2IG9mZnNldDsKKwlfX2xlMTYgbGVuZ3RoOworfTsKKworCisvKgorICoJbG9nIGxvZ2ljYWwgdm9sdW1lCisgKi8KK3N0cnVjdCBqZnNfbG9nIHsKKworCXN0cnVjdCBsaXN0X2hlYWQgc2JfbGlzdDsvKiAgVGhpcyBpcyB1c2VkIHRvIHN5bmMgbWV0YWRhdGEKKwkJCQkgKiAgICBiZWZvcmUgd3JpdGluZyBzeW5jcHQuCisJCQkJICovCisJc3RydWN0IGxpc3RfaGVhZCBqb3VybmFsX2xpc3Q7IC8qIEdsb2JhbCBsaXN0ICovCisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsgLyogNDogbG9nIGx2IHBvaW50ZXIgKi8KKwlpbnQgc2VyaWFsOwkJLyogNDogbG9nIG1vdW50IHNlcmlhbCBudW1iZXIgKi8KKworCXM2NCBiYXNlOwkJLyogQDg6IGxvZyBleHRlbnQgYWRkcmVzcyAoaW5saW5lIGxvZyApICovCisJaW50IHNpemU7CQkvKiA0OiBsb2cgc2l6ZSBpbiBsb2cgcGFnZSAoaW4gcGFnZSkgKi8KKwlpbnQgbDJic2l6ZTsJCS8qIDQ6IGxvZzIgb2YgYnNpemUgKi8KKworCWxvbmcgZmxhZzsJCS8qIDQ6IGZsYWcgKi8KKworCXN0cnVjdCBsYnVmICpsYnVmX2ZyZWU7CS8qIDQ6IGZyZWUgbGJ1ZnMgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBmcmVlX3dhaXQ7CS8qIDQ6ICovCisKKwkvKiBsb2cgd3JpdGUgKi8KKwlpbnQgbG9ndGlkOwkJLyogNDogbG9nIHRpZCAqLworCWludCBwYWdlOwkJLyogNDogcGFnZSBudW1iZXIgb2YgZW9sIHBhZ2UgKi8KKwlpbnQgZW9yOwkJLyogNDogZW9yIG9mIGxhc3QgcmVjb3JkIGluIGVvbCBwYWdlICovCisJc3RydWN0IGxidWYgKmJwOwkvKiA0OiBjdXJyZW50IGxvZyBwYWdlIGJ1ZmZlciAqLworCisJc3RydWN0IHNlbWFwaG9yZSBsb2dsb2NrOwkvKiA0OiBsb2cgd3JpdGUgc2VyaWFsaXphdGlvbiBsb2NrICovCisKKwkvKiBzeW5jcHQgKi8KKwlpbnQgbmV4dHN5bmM7CQkvKiA0OiBieXRlcyB0byB3cml0ZSBiZWZvcmUgbmV4dCBzeW5jcHQgKi8KKwlpbnQgYWN0aXZlOwkJLyogNDogKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBzeW5jd2FpdDsJLyogNDogKi8KKworCS8qIGNvbW1pdCAqLworCXVpbnQgY2ZsYWc7CQkvKiA0OiAqLworCXN0cnVjdCBsaXN0X2hlYWQgY3F1ZXVlOyAvKiBGSUZPIGNvbW1pdCBxdWV1ZSAqLworCXN0cnVjdCB0YmxvY2sgKmZsdXNoX3RibGs7IC8qIHRibGsgd2UncmUgd2FpdGluZyBvbiBmb3IgZmx1c2ggKi8KKwlpbnQgZ2NydGM7CQkvKiA0OiBHQ19SRUFEWSB0cmFuc2FjdGlvbiBjb3VudCAqLworCXN0cnVjdCB0YmxvY2sgKmdjbHJ0OwkvKiA0OiBsYXRlc3QgR0NfUkVBRFkgdHJhbnNhY3Rpb24gKi8KKwlzcGlubG9ja190IGdjbG9jazsJLyogNDogZ3JvdXAgY29tbWl0IGxvY2sgKi8KKwlpbnQgbG9nc2l6ZTsJCS8qIDQ6IGxvZyBkYXRhIGFyZWEgc2l6ZSBpbiBieXRlICovCisJaW50IGxzbjsJCS8qIDQ6IGVuZC1vZi1sb2cgKi8KKwlpbnQgY2xzbjsJCS8qIDQ6IGNsc24gKi8KKwlpbnQgc3luY3B0OwkJLyogNDogYWRkciBvZiBsYXN0IHN5bmNwdCByZWNvcmQgKi8KKwlpbnQgc3luYzsJCS8qIDQ6IGFkZHIgZnJvbSBsYXN0IGxvZ3N5bmMoKSAqLworCXN0cnVjdCBsaXN0X2hlYWQgc3luY2xpc3Q7CS8qIDg6IGxvZ3N5bmNsaXN0IGFuY2hvciAqLworCXNwaW5sb2NrX3Qgc3luY2xvY2s7CS8qIDQ6IHN5bmNsaXN0IGxvY2sgKi8KKwlzdHJ1Y3QgbGJ1ZiAqd3F1ZXVlOwkvKiA0OiBsb2cgcGFnZW91dCBxdWV1ZSAqLworCWludCBjb3VudDsJCS8qIDQ6IGNvdW50ICovCisJY2hhciB1dWlkWzE2XTsJCS8qIDE2OiAxMjgtYml0IHV1aWQgb2YgbG9nIGRldmljZSAqLworCisJaW50IG5vX2ludGVncml0eTsJLyogMzogZmxhZyB0byBkaXNhYmxlIGpvdXJuYWxpbmcgdG8gZGlzayAqLworfTsKKworLyoKKyAqIExvZyBmbGFnCisgKi8KKyNkZWZpbmUgbG9nX0lOTElORUxPRwkxCisjZGVmaW5lIGxvZ19TWU5DQkFSUklFUgkyCisjZGVmaW5lIGxvZ19RVUlFU0NFCTMKKyNkZWZpbmUgbG9nX0ZMVVNICTQKKworLyoKKyAqIGdyb3VwIGNvbW1pdCBmbGFnCisgKi8KKy8qIGpmc19sb2cgKi8KKyNkZWZpbmUgbG9nR0NfUEFHRU9VVAkweDAwMDAwMDAxCisKKy8qIHRibG9jay9sYnVmICovCisjZGVmaW5lIHRibGtHQ19RVUVVRQkJMHgwMDAxCisjZGVmaW5lIHRibGtHQ19SRUFEWQkJMHgwMDAyCisjZGVmaW5lIHRibGtHQ19DT01NSVQJCTB4MDAwNAorI2RlZmluZSB0YmxrR0NfQ09NTUlUVEVECTB4MDAwOAorI2RlZmluZSB0YmxrR0NfRU9QCQkweDAwMTAKKyNkZWZpbmUgdGJsa0dDX0ZSRUUJCTB4MDAyMAorI2RlZmluZSB0YmxrR0NfTEVBREVSCQkweDAwNDAKKyNkZWZpbmUgdGJsa0dDX0VSUk9SCQkweDAwODAKKyNkZWZpbmUgdGJsa0dDX0xBWlkJCTB4MDEwMAkvLyBEMjMwODYwCisjZGVmaW5lIHRibGtHQ19VTkxPQ0tFRAkJMHgwMjAwCS8vIEQyMzA4NjAKKworLyoKKyAqCQlsb2cgY2FjaGUgYnVmZmVyIGhlYWRlcgorICovCitzdHJ1Y3QgbGJ1ZiB7CisJc3RydWN0IGpmc19sb2cgKmxfbG9nOwkvKiA0OiBsb2cgYXNzb2NpYXRlZCB3aXRoIGJ1ZmZlciAqLworCisJLyoKKwkgKiBkYXRhIGJ1ZmZlciBiYXNlIGFyZWEKKwkgKi8KKwl1aW50IGxfZmxhZzsJCS8qIDQ6IHBhZ2VvdXQgY29udHJvbCBmbGFncyAqLworCisJc3RydWN0IGxidWYgKmxfd3FuZXh0OwkvKiA0OiB3cml0ZSBxdWV1ZSBsaW5rICovCisJc3RydWN0IGxidWYgKmxfZnJlZWxpc3Q7CS8qIDQ6IGZyZWVsaXN0bGluayAqLworCisJaW50IGxfcG47CQkvKiA0OiBsb2cgcGFnZSBudW1iZXIgKi8KKwlpbnQgbF9lb3I7CQkvKiA0OiBsb2cgcmVjb3JkIGVvciAqLworCWludCBsX2Nlb3I7CQkvKiA0OiBjb21taXR0ZWQgbG9nIHJlY29yZCBlb3IgKi8KKworCXM2NCBsX2Jsa25vOwkJLyogODogbG9nIHBhZ2UgYmxvY2sgbnVtYmVyICovCisJY2FkZHJfdCBsX2xkYXRhOwkvKiA0OiBkYXRhIHBhZ2UgKi8KKworCXdhaXRfcXVldWVfaGVhZF90IGxfaW9ldmVudDsJLyogNDogaS9vIGRvbmUgZXZlbnQgKi8KKwlzdHJ1Y3QgcGFnZSAqbF9wYWdlOwkvKiBUaGUgcGFnZSBpdHNlbGYgKi8KK307CisKKy8qIFJldXNlIGxfZnJlZWxpc3QgZm9yIHJlZHJpdmUgbGlzdCAqLworI2RlZmluZSBsX3JlZHJpdmVfbmV4dCBsX2ZyZWVsaXN0CisKKy8qCisgKglsb2dzeW5jbGlzdCBibG9jaworICoKKyAqIGNvbW1vbiBsb2dzeW5jYmxrIHByZWZpeCBmb3IgamJ1Zl90IGFuZCB0YmxvY2sKKyAqLworc3RydWN0IGxvZ3N5bmNibGsgeworCXUxNiB4ZmxhZzsJCS8qIGZsYWdzICovCisJdTE2IGZsYWc7CQkvKiBvbmx5IG1lYW5pbmZ1bCBpbiB0YmxvY2sgKi8KKwlsaWRfdCBsaWQ7CQkvKiBsb2NrIGlkICovCisJczMyIGxzbjsJCS8qIGxvZyBzZXF1ZW5jZSBudW1iZXIgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHN5bmNsaXN0OwkvKiBsb2cgc3luYyBsaXN0IGxpbmsgKi8KK307CisKKy8qCisgKglsb2dzeW5jbGlzdCBzZXJpYWxpemF0aW9uIChwZXIgbG9nKQorICovCisKKyNkZWZpbmUgTE9HU1lOQ19MT0NLX0lOSVQobG9nKSBzcGluX2xvY2tfaW5pdCgmKGxvZyktPnN5bmNsb2NrKQorI2RlZmluZSBMT0dTWU5DX0xPQ0sobG9nKSBzcGluX2xvY2soJihsb2cpLT5zeW5jbG9jaykKKyNkZWZpbmUgTE9HU1lOQ19VTkxPQ0sobG9nKSBzcGluX3VubG9jaygmKGxvZyktPnN5bmNsb2NrKQorCisvKiBjb21wdXRlIHRoZSBkaWZmZXJlbmNlIGluIGJ5dGVzIG9mIGxzbiBmcm9tIHN5bmMgcG9pbnQgKi8KKyNkZWZpbmUgbG9nZGlmZihkaWZmLCBsc24sIGxvZylcCit7XAorCWRpZmYgPSAobHNuKSAtIChsb2cpLT5zeW5jcHQ7XAorCWlmIChkaWZmIDwgMClcCisJCWRpZmYgKz0gKGxvZyktPmxvZ3NpemU7XAorfQorCitleHRlcm4gaW50IGxtTG9nT3BlbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKK2V4dGVybiBpbnQgbG1Mb2dDbG9zZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKK2V4dGVybiBpbnQgbG1Mb2dTaHV0ZG93bihzdHJ1Y3QgamZzX2xvZyAqIGxvZyk7CitleHRlcm4gaW50IGxtTG9nSW5pdChzdHJ1Y3QgamZzX2xvZyAqIGxvZyk7CitleHRlcm4gaW50IGxtTG9nRm9ybWF0KHN0cnVjdCBqZnNfbG9nICpsb2csIHM2NCBsb2dBZGRyZXNzLCBpbnQgbG9nU2l6ZSk7CitleHRlcm4gdm9pZCBqZnNfZmx1c2hfam91cm5hbChzdHJ1Y3QgamZzX2xvZyAqIGxvZywgaW50IHdhaXQpOworCisjZW5kaWYJCQkJLyogX0hfSkZTX0xPR01HUiAqLwpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19tZXRhcGFnZS5jIGIvZnMvamZzL2pmc19tZXRhcGFnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMGEzYWMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZnMvamZzX21ldGFwYWdlLmMKQEAgLTAsMCArMSw1ODAgQEAKKy8qCisgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwMC0yMDAzCisgKiAgIFBvcnRpb25zIENvcHlyaWdodCAoQykgQ2hyaXN0b3BoIEhlbGx3aWcsIDIwMDEtMjAwMgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7ICB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIAorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7ICB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgKiAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07ICBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgImpmc19pbmNvcmUuaCIKKyNpbmNsdWRlICJqZnNfc3VwZXJibG9jay5oIgorI2luY2x1ZGUgImpmc19maWxzeXMuaCIKKyNpbmNsdWRlICJqZnNfbWV0YXBhZ2UuaCIKKyNpbmNsdWRlICJqZnNfdHhubWdyLmgiCisjaW5jbHVkZSAiamZzX2RlYnVnLmgiCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobWV0YV9sb2NrKTsKKworI2lmZGVmIENPTkZJR19KRlNfU1RBVElTVElDUworc3RhdGljIHN0cnVjdCB7CisJdWludAlwYWdlYWxsb2M7CS8qICMgb2YgcGFnZSBhbGxvY2F0aW9ucyAqLworCXVpbnQJcGFnZWZyZWU7CS8qICMgb2YgcGFnZSBmcmVlcyAqLworCXVpbnQJbG9ja3dhaXQ7CS8qICMgb2Ygc2xlZXBpbmcgbG9ja19tZXRhcGFnZSgpIGNhbGxzICovCit9IG1wU3RhdDsKKyNlbmRpZgorCisKKyNkZWZpbmUgSEFTSF9CSVRTIDEwCQkvKiBUaGlzIG1ha2VzIGhhc2hfdGFibGUgMSA0SyBwYWdlICovCisjZGVmaW5lIEhBU0hfU0laRSAoMSA8PCBIQVNIX0JJVFMpCitzdGF0aWMgc3RydWN0IG1ldGFwYWdlICoqaGFzaF90YWJsZSA9IE5VTEw7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBoYXNoX29yZGVyOworCisKK3N0YXRpYyBpbmxpbmUgaW50IG1ldGFwYWdlX2xvY2tlZChzdHJ1Y3QgbWV0YXBhZ2UgKm1wKQoreworCXJldHVybiB0ZXN0X2JpdChNRVRBX2xvY2tlZCwgJm1wLT5mbGFnKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdHJ5bG9ja19tZXRhcGFnZShzdHJ1Y3QgbWV0YXBhZ2UgKm1wKQoreworCXJldHVybiB0ZXN0X2FuZF9zZXRfYml0KE1FVEFfbG9ja2VkLCAmbXAtPmZsYWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdW5sb2NrX21ldGFwYWdlKHN0cnVjdCBtZXRhcGFnZSAqbXApCit7CisJY2xlYXJfYml0KE1FVEFfbG9ja2VkLCAmbXAtPmZsYWcpOworCXdha2VfdXAoJm1wLT53YWl0KTsKK30KKworc3RhdGljIHZvaWQgX19sb2NrX21ldGFwYWdlKHN0cnVjdCBtZXRhcGFnZSAqbXApCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwlJTkNSRU1FTlQobXBTdGF0LmxvY2t3YWl0KTsKKworCWFkZF93YWl0X3F1ZXVlX2V4Y2x1c2l2ZSgmbXAtPndhaXQsICZ3YWl0KTsKKwlkbyB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKG1ldGFwYWdlX2xvY2tlZChtcCkpIHsKKwkJCXNwaW5fdW5sb2NrKCZtZXRhX2xvY2spOworCQkJc2NoZWR1bGUoKTsKKwkJCXNwaW5fbG9jaygmbWV0YV9sb2NrKTsKKwkJfQorCX0gd2hpbGUgKHRyeWxvY2tfbWV0YXBhZ2UobXApKTsKKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJm1wLT53YWl0LCAmd2FpdCk7Cit9CisKKy8qIG5lZWRzIG1ldGFfbG9jayAqLworc3RhdGljIGlubGluZSB2b2lkIGxvY2tfbWV0YXBhZ2Uoc3RydWN0IG1ldGFwYWdlICptcCkKK3sKKwlpZiAodHJ5bG9ja19tZXRhcGFnZShtcCkpCisJCV9fbG9ja19tZXRhcGFnZShtcCk7Cit9CisKKyNkZWZpbmUgTUVUQVBPT0xfTUlOX1BBR0VTIDMyCitzdGF0aWMga21lbV9jYWNoZV90ICptZXRhcGFnZV9jYWNoZTsKK3N0YXRpYyBtZW1wb29sX3QgKm1ldGFwYWdlX21lbXBvb2w7CisKK3N0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICpmb28sIGttZW1fY2FjaGVfdCAqY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBtZXRhcGFnZSAqbXAgPSAoc3RydWN0IG1ldGFwYWdlICopZm9vOworCisJaWYgKChmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CisJICAgIFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikgeworCQltcC0+bGlkID0gMDsKKwkJbXAtPmxzbiA9IDA7CisJCW1wLT5mbGFnID0gMDsKKwkJbXAtPmRhdGEgPSBOVUxMOworCQltcC0+Y2xzbiA9IDA7CisJCW1wLT5sb2cgPSBOVUxMOworCQlzZXRfYml0KE1FVEFfZnJlZSwgJm1wLT5mbGFnKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmbXAtPndhaXQpOworCX0KK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbWV0YXBhZ2UgKmFsbG9jX21ldGFwYWdlKGludCBnZnBfbWFzaykKK3sKKwlyZXR1cm4gbWVtcG9vbF9hbGxvYyhtZXRhcGFnZV9tZW1wb29sLCBnZnBfbWFzayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX21ldGFwYWdlKHN0cnVjdCBtZXRhcGFnZSAqbXApCit7CisJbXAtPmZsYWcgPSAwOworCXNldF9iaXQoTUVUQV9mcmVlLCAmbXAtPmZsYWcpOworCisJbWVtcG9vbF9mcmVlKG1wLCBtZXRhcGFnZV9tZW1wb29sKTsKK30KKworaW50IF9faW5pdCBtZXRhcGFnZV9pbml0KHZvaWQpCit7CisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUgbWV0YXBhZ2Ugc3RydWN0dXJlcworCSAqLworCW1ldGFwYWdlX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImpmc19tcCIsIHNpemVvZihzdHJ1Y3QgbWV0YXBhZ2UpLAorCQkJCQkgICAwLCAwLCBpbml0X29uY2UsIE5VTEwpOworCWlmIChtZXRhcGFnZV9jYWNoZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1ldGFwYWdlX21lbXBvb2wgPSBtZW1wb29sX2NyZWF0ZShNRVRBUE9PTF9NSU5fUEFHRVMsIG1lbXBvb2xfYWxsb2Nfc2xhYiwKKwkJCQkJICBtZW1wb29sX2ZyZWVfc2xhYiwgbWV0YXBhZ2VfY2FjaGUpOworCisJaWYgKG1ldGFwYWdlX21lbXBvb2wgPT0gTlVMTCkgeworCQlrbWVtX2NhY2hlX2Rlc3Ryb3kobWV0YXBhZ2VfY2FjaGUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLyoKKwkgKiBOb3cgdGhlIGhhc2ggbGlzdAorCSAqLworCWZvciAoaGFzaF9vcmRlciA9IDA7CisJICAgICAoKFBBR0VfU0laRSA8PCBoYXNoX29yZGVyKSAvIHNpemVvZih2b2lkICopKSA8IEhBU0hfU0laRTsKKwkgICAgIGhhc2hfb3JkZXIrKyk7CisJaGFzaF90YWJsZSA9CisJICAgIChzdHJ1Y3QgbWV0YXBhZ2UgKiopIF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgaGFzaF9vcmRlcik7CisJYXNzZXJ0KGhhc2hfdGFibGUpOworCW1lbXNldChoYXNoX3RhYmxlLCAwLCBQQUdFX1NJWkUgPDwgaGFzaF9vcmRlcik7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBtZXRhcGFnZV9leGl0KHZvaWQpCit7CisJbWVtcG9vbF9kZXN0cm95KG1ldGFwYWdlX21lbXBvb2wpOworCWttZW1fY2FjaGVfZGVzdHJveShtZXRhcGFnZV9jYWNoZSk7Cit9CisKKy8qCisgKiBCYXNpY2FsbHkgc2FtZSBoYXNoIGFzIGluIHBhZ2VtYXAuaCwgYnV0IHVzaW5nIG91ciBoYXNoIHRhYmxlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbWV0YXBhZ2UgKiptZXRhX2hhc2goc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkJICAgdW5zaWduZWQgbG9uZyBpbmRleCkKK3sKKyNkZWZpbmUgaSAoKCh1bnNpZ25lZCBsb25nKW1hcHBpbmcpLyBcCisJICAgKHNpemVvZihzdHJ1Y3QgaW5vZGUpICYgfihzaXplb2Yoc3RydWN0IGlub2RlKSAtMSApKSkKKyNkZWZpbmUgcyh4KSAoKHgpICsgKCh4KSA+PiBIQVNIX0JJVFMpKQorCXJldHVybiBoYXNoX3RhYmxlICsgKHMoaSArIGluZGV4KSAmIChIQVNIX1NJWkUgLSAxKSk7CisjdW5kZWYgaQorI3VuZGVmIHMKK30KKworc3RhdGljIHN0cnVjdCBtZXRhcGFnZSAqc2VhcmNoX2hhc2goc3RydWN0IG1ldGFwYWdlICoqIGhhc2hfcHRyLAorCQkJCSAgICBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGluZGV4KQoreworCXN0cnVjdCBtZXRhcGFnZSAqcHRyOworCisJZm9yIChwdHIgPSAqaGFzaF9wdHI7IHB0cjsgcHRyID0gcHRyLT5oYXNoX25leHQpIHsKKwkJaWYgKChwdHItPm1hcHBpbmcgPT0gbWFwcGluZykgJiYgKHB0ci0+aW5kZXggPT0gaW5kZXgpKQorCQkJcmV0dXJuIHB0cjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgYWRkX3RvX2hhc2goc3RydWN0IG1ldGFwYWdlICogbXAsIHN0cnVjdCBtZXRhcGFnZSAqKiBoYXNoX3B0cikKK3sKKwlpZiAoKmhhc2hfcHRyKQorCQkoKmhhc2hfcHRyKS0+aGFzaF9wcmV2ID0gbXA7CisKKwltcC0+aGFzaF9wcmV2ID0gTlVMTDsKKwltcC0+aGFzaF9uZXh0ID0gKmhhc2hfcHRyOworCSpoYXNoX3B0ciA9IG1wOworfQorCitzdGF0aWMgdm9pZCByZW1vdmVfZnJvbV9oYXNoKHN0cnVjdCBtZXRhcGFnZSAqIG1wLCBzdHJ1Y3QgbWV0YXBhZ2UgKiogaGFzaF9wdHIpCit7CisJaWYgKG1wLT5oYXNoX3ByZXYpCisJCW1wLT5oYXNoX3ByZXYtPmhhc2hfbmV4dCA9IG1wLT5oYXNoX25leHQ7CisJZWxzZSB7CisJCWFzc2VydCgqaGFzaF9wdHIgPT0gbXApOworCQkqaGFzaF9wdHIgPSBtcC0+aGFzaF9uZXh0OworCX0KKworCWlmIChtcC0+aGFzaF9uZXh0KQorCQltcC0+aGFzaF9uZXh0LT5oYXNoX3ByZXYgPSBtcC0+aGFzaF9wcmV2OworfQorCitzdHJ1Y3QgbWV0YXBhZ2UgKl9fZ2V0X21ldGFwYWdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGxvbmcgbGJsb2NrLAorCQkJCXVuc2lnbmVkIGludCBzaXplLCBpbnQgYWJzb2x1dGUsCisJCQkJdW5zaWduZWQgbG9uZyBuZXcpCit7CisJc3RydWN0IG1ldGFwYWdlICoqaGFzaF9wdHI7CisJaW50IGwyQmxvY2tzUGVyUGFnZTsKKwlpbnQgbDJic2l6ZTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCXVuc2lnbmVkIGxvbmcgcGFnZV9pbmRleDsKKwl1bnNpZ25lZCBsb25nIHBhZ2Vfb2Zmc2V0OworCisJamZzX2luZm8oIl9fZ2V0X21ldGFwYWdlOiBpbm9kZSA9IDB4JXAsIGxibG9jayA9IDB4JWx4IiwgaW5vZGUsIGxibG9jayk7CisKKwlpZiAoYWJzb2x1dGUpCisJCW1hcHBpbmcgPSBpbm9kZS0+aV9zYi0+c19iZGV2LT5iZF9pbm9kZS0+aV9tYXBwaW5nOworCWVsc2UgeworCQkvKgorCQkgKiBJZiBhbiBuZnMgY2xpZW50IHRyaWVzIHRvIHJlYWQgYW4gaW5vZGUgdGhhdCBpcyBsYXJnZXIKKwkJICogdGhhbiBhbnkgZXhpc3RpbmcgaW5vZGVzLCB3ZSBtYXkgdHJ5IHRvIHJlYWQgcGFzdCB0aGUKKwkJICogZW5kIG9mIHRoZSBpbm9kZSBtYXAKKwkJICovCisJCWlmICgobGJsb2NrIDw8IGlub2RlLT5pX2Jsa2JpdHMpID49IGlub2RlLT5pX3NpemUpCisJCQlyZXR1cm4gTlVMTDsKKwkJbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisJfQorCisJaGFzaF9wdHIgPSBtZXRhX2hhc2gobWFwcGluZywgbGJsb2NrKTsKK2FnYWluOgorCXNwaW5fbG9jaygmbWV0YV9sb2NrKTsKKwltcCA9IHNlYXJjaF9oYXNoKGhhc2hfcHRyLCBtYXBwaW5nLCBsYmxvY2spOworCWlmIChtcCkgeworCSAgICAgIHBhZ2VfZm91bmQ6CisJCWlmICh0ZXN0X2JpdChNRVRBX3N0YWxlLCAmbXAtPmZsYWcpKSB7CisJCQlzcGluX3VubG9jaygmbWV0YV9sb2NrKTsKKwkJCW1zbGVlcCgxKTsKKwkJCWdvdG8gYWdhaW47CisJCX0KKwkJbXAtPmNvdW50Kys7CisJCWxvY2tfbWV0YXBhZ2UobXApOworCQlzcGluX3VubG9jaygmbWV0YV9sb2NrKTsKKwkJaWYgKHRlc3RfYml0KE1FVEFfZGlzY2FyZCwgJm1wLT5mbGFnKSkgeworCQkJaWYgKCFuZXcpIHsKKwkJCQlqZnNfZXJyb3IoaW5vZGUtPmlfc2IsCisJCQkJCSAgIl9fZ2V0X21ldGFwYWdlOiB1c2luZyBhICIKKwkJCQkJICAiZGlzY2FyZGVkIG1ldGFwYWdlIik7CisJCQkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQljbGVhcl9iaXQoTUVUQV9kaXNjYXJkLCAmbXAtPmZsYWcpOworCQl9CisJCWpmc19pbmZvKCJfX2dldF9tZXRhcGFnZTogZm91bmQgMHglcCwgaW4gaGFzaCIsIG1wKTsKKwkJaWYgKG1wLT5sb2dpY2FsX3NpemUgIT0gc2l6ZSkgeworCQkJamZzX2Vycm9yKGlub2RlLT5pX3NiLAorCQkJCSAgIl9fZ2V0X21ldGFwYWdlOiBtcC0+bG9naWNhbF9zaXplICE9IHNpemUiKTsKKwkJCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9IGVsc2UgeworCQlsMmJzaXplID0gaW5vZGUtPmlfYmxrYml0czsKKwkJbDJCbG9ja3NQZXJQYWdlID0gUEFHRV9DQUNIRV9TSElGVCAtIGwyYnNpemU7CisJCXBhZ2VfaW5kZXggPSBsYmxvY2sgPj4gbDJCbG9ja3NQZXJQYWdlOworCQlwYWdlX29mZnNldCA9IChsYmxvY2sgLSAocGFnZV9pbmRleCA8PCBsMkJsb2Nrc1BlclBhZ2UpKSA8PAorCQkgICAgbDJic2l6ZTsKKwkJaWYgKChwYWdlX29mZnNldCArIHNpemUpID4gUEFHRV9DQUNIRV9TSVpFKSB7CisJCQlzcGluX3VubG9jaygmbWV0YV9sb2NrKTsKKwkJCWpmc19lcnIoIk1ldGFEYXRhIGNyb3NzZXMgcGFnZSBib3VuZGFyeSEhIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQkKKwkJLyoKKwkJICogTG9ja3MgaGVsZCBvbiBhZ2dyZWdhdGUgaW5vZGUgcGFnZXMgYXJlIHVzdWFsbHkKKwkJICogbm90IGhlbGQgbG9uZywgYW5kIHRoZXkgYXJlIHRha2VuIGluIGNyaXRpY2FsIGNvZGUKKwkJICogcGF0aHMgKGNvbW1pdHRpbmcgZGlydHkgaW5vZGVzLCB0eENvbW1pdCB0aHJlYWQpIAorCQkgKiAKKwkJICogQXR0ZW1wdCB0byBnZXQgbWV0YXBhZ2Ugd2l0aG91dCBibG9ja2luZywgdGFwcGluZyBpbnRvCisJCSAqIHJlc2VydmVzIGlmIG5lY2Vzc2FyeS4KKwkJICovCisJCW1wID0gTlVMTDsKKwkJaWYgKEpGU19JUChpbm9kZSktPmZpbGVzZXQgPT0gQUdHUkVHQVRFX0kpIHsKKwkJCW1wID0gYWxsb2NfbWV0YXBhZ2UoR0ZQX0FUT01JQyk7CisJCQlpZiAoIW1wKSB7CisJCQkJLyoKKwkJCQkgKiBtZW1wb29sIGlzIHN1cHBvc2VkIHRvIHByb3RlY3QgdXMgZnJvbQorCQkJCSAqIGZhaWxpbmcgaGVyZS4gIFdlIHdpbGwgdHJ5IGEgYmxvY2tpbmcKKwkJCQkgKiBjYWxsLCBidXQgYSBkZWFkbG9jayBpcyBwb3NzaWJsZSBoZXJlCisJCQkJICovCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSAgICAgICAiX19nZXRfbWV0YXBhZ2U6IGF0b21pYyBjYWxsIHRvIG1lbXBvb2xfYWxsb2MgZmFpbGVkLlxuIik7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSAgICAgICAiV2lsbCBhdHRlbXB0IGJsb2NraW5nIGNhbGxcbiIpOworCQkJfQorCQl9CisJCWlmICghbXApIHsKKwkJCXN0cnVjdCBtZXRhcGFnZSAqbXAyOworCisJCQlzcGluX3VubG9jaygmbWV0YV9sb2NrKTsKKwkJCW1wID0gYWxsb2NfbWV0YXBhZ2UoR0ZQX05PRlMpOworCQkJc3Bpbl9sb2NrKCZtZXRhX2xvY2spOworCisJCQkvKiB3ZSBkcm9wcGVkIHRoZSBtZXRhX2xvY2ssIHdlIG5lZWQgdG8gc2VhcmNoIHRoZQorCQkJICogaGFzaCBhZ2Fpbi4KKwkJCSAqLworCQkJbXAyID0gc2VhcmNoX2hhc2goaGFzaF9wdHIsIG1hcHBpbmcsIGxibG9jayk7CisJCQlpZiAobXAyKSB7CisJCQkJZnJlZV9tZXRhcGFnZShtcCk7CisJCQkJbXAgPSBtcDI7CisJCQkJZ290byBwYWdlX2ZvdW5kOworCQkJfQorCQl9CisJCW1wLT5mbGFnID0gMDsKKwkJbG9ja19tZXRhcGFnZShtcCk7CisJCWlmIChhYnNvbHV0ZSkKKwkJCXNldF9iaXQoTUVUQV9hYnNvbHV0ZSwgJm1wLT5mbGFnKTsKKwkJbXAtPnhmbGFnID0gQ09NTUlUX1BBR0U7CisJCW1wLT5jb3VudCA9IDE7CisJCWF0b21pY19zZXQoJm1wLT5ub2hvbWVvaywwKTsKKwkJbXAtPm1hcHBpbmcgPSBtYXBwaW5nOworCQltcC0+aW5kZXggPSBsYmxvY2s7CisJCW1wLT5wYWdlID0gTlVMTDsKKwkJbXAtPmxvZ2ljYWxfc2l6ZSA9IHNpemU7CisJCWFkZF90b19oYXNoKG1wLCBoYXNoX3B0cik7CisJCXNwaW5fdW5sb2NrKCZtZXRhX2xvY2spOworCisJCWlmIChuZXcpIHsKKwkJCWpmc19pbmZvKCJfX2dldF9tZXRhcGFnZTogQ2FsbGluZyBncmFiX2NhY2hlX3BhZ2UiKTsKKwkJCW1wLT5wYWdlID0gZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsIHBhZ2VfaW5kZXgpOworCQkJaWYgKCFtcC0+cGFnZSkgeworCQkJCWpmc19lcnIoImdyYWJfY2FjaGVfcGFnZSBmYWlsZWQhIik7CisJCQkJZ290byBmcmVlaXQ7CisJCQl9IGVsc2UgeworCQkJCUlOQ1JFTUVOVChtcFN0YXQucGFnZWFsbG9jKTsKKwkJCQl1bmxvY2tfcGFnZShtcC0+cGFnZSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlqZnNfaW5mbygiX19nZXRfbWV0YXBhZ2U6IENhbGxpbmcgcmVhZF9jYWNoZV9wYWdlIik7CisJCQltcC0+cGFnZSA9IHJlYWRfY2FjaGVfcGFnZShtYXBwaW5nLCBsYmxvY2ssCisJCQkJICAgIChmaWxsZXJfdCAqKW1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZSwgTlVMTCk7CisJCQlpZiAoSVNfRVJSKG1wLT5wYWdlKSkgeworCQkJCWpmc19lcnIoInJlYWRfY2FjaGVfcGFnZSBmYWlsZWQhIik7CisJCQkJZ290byBmcmVlaXQ7CisJCQl9IGVsc2UKKwkJCQlJTkNSRU1FTlQobXBTdGF0LnBhZ2VhbGxvYyk7CisJCX0KKwkJbXAtPmRhdGEgPSBrbWFwKG1wLT5wYWdlKSArIHBhZ2Vfb2Zmc2V0OworCX0KKworCWlmIChuZXcpCisJCW1lbXNldChtcC0+ZGF0YSwgMCwgUFNJWkUpOworCisJamZzX2luZm8oIl9fZ2V0X21ldGFwYWdlOiByZXR1cm5pbmcgPSAweCVwIiwgbXApOworCXJldHVybiBtcDsKKworZnJlZWl0OgorCXNwaW5fbG9jaygmbWV0YV9sb2NrKTsKKwlyZW1vdmVfZnJvbV9oYXNoKG1wLCBoYXNoX3B0cik7CisJZnJlZV9tZXRhcGFnZShtcCk7CisJc3Bpbl91bmxvY2soJm1ldGFfbG9jayk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgaG9sZF9tZXRhcGFnZShzdHJ1Y3QgbWV0YXBhZ2UgKiBtcCwgaW50IGZvcmNlKQoreworCXNwaW5fbG9jaygmbWV0YV9sb2NrKTsKKworCW1wLT5jb3VudCsrOworCisJaWYgKGZvcmNlKSB7CisJCUFTU0VSVCAoISh0ZXN0X2JpdChNRVRBX2ZvcmNlZCwgJm1wLT5mbGFnKSkpOworCQlpZiAodHJ5bG9ja19tZXRhcGFnZShtcCkpCisJCQlzZXRfYml0KE1FVEFfZm9yY2VkLCAmbXAtPmZsYWcpOworCX0gZWxzZQorCQlsb2NrX21ldGFwYWdlKG1wKTsKKworCXNwaW5fdW5sb2NrKCZtZXRhX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBfX3dyaXRlX21ldGFwYWdlKHN0cnVjdCBtZXRhcGFnZSAqIG1wKQoreworCWludCBsMmJzaXplID0gbXAtPm1hcHBpbmctPmhvc3QtPmlfYmxrYml0czsKKwlpbnQgbDJCbG9ja3NQZXJQYWdlID0gUEFHRV9DQUNIRV9TSElGVCAtIGwyYnNpemU7CisJdW5zaWduZWQgbG9uZyBwYWdlX2luZGV4OworCXVuc2lnbmVkIGxvbmcgcGFnZV9vZmZzZXQ7CisJaW50IHJjOworCisJamZzX2luZm8oIl9fd3JpdGVfbWV0YXBhZ2U6IG1wID0gMHglcCIsIG1wKTsKKworCXBhZ2VfaW5kZXggPSBtcC0+cGFnZS0+aW5kZXg7CisJcGFnZV9vZmZzZXQgPQorCSAgICAobXAtPmluZGV4IC0gKHBhZ2VfaW5kZXggPDwgbDJCbG9ja3NQZXJQYWdlKSkgPDwgbDJic2l6ZTsKKworCWxvY2tfcGFnZShtcC0+cGFnZSk7CisJcmMgPSBtcC0+bWFwcGluZy0+YV9vcHMtPnByZXBhcmVfd3JpdGUoTlVMTCwgbXAtPnBhZ2UsIHBhZ2Vfb2Zmc2V0LAorCQkJCQkgICAgICAgcGFnZV9vZmZzZXQgKworCQkJCQkgICAgICAgbXAtPmxvZ2ljYWxfc2l6ZSk7CisJaWYgKHJjKSB7CisJCWpmc19lcnIoInByZXBhcmVfd3JpdGUgcmV0dXJuICVkISIsIHJjKTsKKwkJQ2xlYXJQYWdlVXB0b2RhdGUobXAtPnBhZ2UpOworCQl1bmxvY2tfcGFnZShtcC0+cGFnZSk7CisJCWNsZWFyX2JpdChNRVRBX2RpcnR5LCAmbXAtPmZsYWcpOworCQlyZXR1cm47CisJfQorCXJjID0gbXAtPm1hcHBpbmctPmFfb3BzLT5jb21taXRfd3JpdGUoTlVMTCwgbXAtPnBhZ2UsIHBhZ2Vfb2Zmc2V0LAorCQkJCQkgICAgICBwYWdlX29mZnNldCArCisJCQkJCSAgICAgIG1wLT5sb2dpY2FsX3NpemUpOworCWlmIChyYykgeworCQlqZnNfZXJyKCJjb21taXRfd3JpdGUgcmV0dXJuZWQgJWQiLCByYyk7CisJfQorCisJdW5sb2NrX3BhZ2UobXAtPnBhZ2UpOworCWNsZWFyX2JpdChNRVRBX2RpcnR5LCAmbXAtPmZsYWcpOworCisJamZzX2luZm8oIl9fd3JpdGVfbWV0YXBhZ2UgZG9uZSIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3luY19tZXRhcGFnZShzdHJ1Y3QgbWV0YXBhZ2UgKm1wKQoreworCXN0cnVjdCBwYWdlICpwYWdlID0gbXAtPnBhZ2U7CisKKwlwYWdlX2NhY2hlX2dldChwYWdlKTsKKwlsb2NrX3BhZ2UocGFnZSk7CisKKwkvKiB3ZSdyZSBkb25lIHdpdGggdGhpcyBwYWdlIC0gbm8gbmVlZCB0byBjaGVjayBmb3IgZXJyb3JzICovCisJaWYgKHBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpCisJCXdyaXRlX29uZV9wYWdlKHBhZ2UsIDEpOworCWVsc2UKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworfQorCit2b2lkIHJlbGVhc2VfbWV0YXBhZ2Uoc3RydWN0IG1ldGFwYWdlICogbXApCit7CisJc3RydWN0IGpmc19sb2cgKmxvZzsKKworCWpmc19pbmZvKCJyZWxlYXNlX21ldGFwYWdlOiBtcCA9IDB4JXAsIGZsYWcgPSAweCVseCIsIG1wLCBtcC0+ZmxhZyk7CisKKwlzcGluX2xvY2soJm1ldGFfbG9jayk7CisJaWYgKHRlc3RfYml0KE1FVEFfZm9yY2VkLCAmbXAtPmZsYWcpKSB7CisJCWNsZWFyX2JpdChNRVRBX2ZvcmNlZCwgJm1wLT5mbGFnKTsKKwkJbXAtPmNvdW50LS07CisJCXNwaW5fdW5sb2NrKCZtZXRhX2xvY2spOworCQlyZXR1cm47CisJfQorCisJYXNzZXJ0KG1wLT5jb3VudCk7CisJaWYgKC0tbXAtPmNvdW50IHx8IGF0b21pY19yZWFkKCZtcC0+bm9ob21lb2spKSB7CisJCXVubG9ja19tZXRhcGFnZShtcCk7CisJCXNwaW5fdW5sb2NrKCZtZXRhX2xvY2spOworCQlyZXR1cm47CisJfQorCisJaWYgKG1wLT5wYWdlKSB7CisJCXNldF9iaXQoTUVUQV9zdGFsZSwgJm1wLT5mbGFnKTsKKwkJc3Bpbl91bmxvY2soJm1ldGFfbG9jayk7CisJCWt1bm1hcChtcC0+cGFnZSk7CisJCW1wLT5kYXRhID0gTlVMTDsKKwkJaWYgKHRlc3RfYml0KE1FVEFfZGlydHksICZtcC0+ZmxhZykpCisJCQlfX3dyaXRlX21ldGFwYWdlKG1wKTsKKwkJaWYgKHRlc3RfYml0KE1FVEFfc3luYywgJm1wLT5mbGFnKSkgeworCQkJc3luY19tZXRhcGFnZShtcCk7CisJCQljbGVhcl9iaXQoTUVUQV9zeW5jLCAmbXAtPmZsYWcpOworCQl9CisKKwkJaWYgKHRlc3RfYml0KE1FVEFfZGlzY2FyZCwgJm1wLT5mbGFnKSkgeworCQkJbG9ja19wYWdlKG1wLT5wYWdlKTsKKwkJCWJsb2NrX2ludmFsaWRhdGVwYWdlKG1wLT5wYWdlLCAwKTsKKwkJCXVubG9ja19wYWdlKG1wLT5wYWdlKTsKKwkJfQorCisJCXBhZ2VfY2FjaGVfcmVsZWFzZShtcC0+cGFnZSk7CisJCW1wLT5wYWdlID0gTlVMTDsKKwkJSU5DUkVNRU5UKG1wU3RhdC5wYWdlZnJlZSk7CisJCXNwaW5fbG9jaygmbWV0YV9sb2NrKTsKKwl9CisKKwlpZiAobXAtPmxzbikgeworCQkvKgorCQkgKiBSZW1vdmUgbWV0YXBhZ2UgZnJvbSBsb2dzeW5jbGlzdC4KKwkJICovCisJCWxvZyA9IG1wLT5sb2c7CisJCUxPR1NZTkNfTE9DSyhsb2cpOworCQltcC0+bG9nID0gTlVMTDsKKwkJbXAtPmxzbiA9IDA7CisJCW1wLT5jbHNuID0gMDsKKwkJbG9nLT5jb3VudC0tOworCQlsaXN0X2RlbCgmbXAtPnN5bmNsaXN0KTsKKwkJTE9HU1lOQ19VTkxPQ0sobG9nKTsKKwl9CisJcmVtb3ZlX2Zyb21faGFzaChtcCwgbWV0YV9oYXNoKG1wLT5tYXBwaW5nLCBtcC0+aW5kZXgpKTsKKwlzcGluX3VubG9jaygmbWV0YV9sb2NrKTsKKworCWZyZWVfbWV0YXBhZ2UobXApOworfQorCit2b2lkIF9faW52YWxpZGF0ZV9tZXRhcGFnZXMoc3RydWN0IGlub2RlICppcCwgczY0IGFkZHIsIGludCBsZW4pCit7CisJc3RydWN0IG1ldGFwYWdlICoqaGFzaF9wdHI7CisJdW5zaWduZWQgbG9uZyBsYmxvY2s7CisJaW50IGwyQmxvY2tzUGVyUGFnZSA9IFBBR0VfQ0FDSEVfU0hJRlQgLSBpcC0+aV9ibGtiaXRzOworCS8qIEFsbCBjYWxsZXJzIGFyZSBpbnRlcmVzdGVkIGluIGJsb2NrIGRldmljZSdzIG1hcHBpbmcgKi8KKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlwLT5pX3NiLT5zX2JkZXYtPmJkX2lub2RlLT5pX21hcHBpbmc7CisJc3RydWN0IG1ldGFwYWdlICptcDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCS8qCisJICogRmlyc3QsIG1hcmsgbWV0YXBhZ2VzIHRvIGRpc2NhcmQuICBUaGV5IHdpbGwgZXZlbnR1YWxseSBiZQorCSAqIHJlbGVhc2VkLCBidXQgc2hvdWxkIG5vdCBiZSB3cml0dGVuLgorCSAqLworCWZvciAobGJsb2NrID0gYWRkcjsgbGJsb2NrIDwgYWRkciArIGxlbjsKKwkgICAgIGxibG9jayArPSAxIDw8IGwyQmxvY2tzUGVyUGFnZSkgeworCQloYXNoX3B0ciA9IG1ldGFfaGFzaChtYXBwaW5nLCBsYmxvY2spOworYWdhaW46CisJCXNwaW5fbG9jaygmbWV0YV9sb2NrKTsKKwkJbXAgPSBzZWFyY2hfaGFzaChoYXNoX3B0ciwgbWFwcGluZywgbGJsb2NrKTsKKwkJaWYgKG1wKSB7CisJCQlpZiAodGVzdF9iaXQoTUVUQV9zdGFsZSwgJm1wLT5mbGFnKSkgeworCQkJCXNwaW5fdW5sb2NrKCZtZXRhX2xvY2spOworCQkJCW1zbGVlcCgxKTsKKwkJCQlnb3RvIGFnYWluOworCQkJfQorCisJCQljbGVhcl9iaXQoTUVUQV9kaXJ0eSwgJm1wLT5mbGFnKTsKKwkJCXNldF9iaXQoTUVUQV9kaXNjYXJkLCAmbXAtPmZsYWcpOworCQkJc3Bpbl91bmxvY2soJm1ldGFfbG9jayk7CisJCX0gZWxzZSB7CisJCQlzcGluX3VubG9jaygmbWV0YV9sb2NrKTsKKwkJCXBhZ2UgPSBmaW5kX2xvY2tfcGFnZShtYXBwaW5nLCBsYmxvY2s+PmwyQmxvY2tzUGVyUGFnZSk7CisJCQlpZiAocGFnZSkgeworCQkJCWJsb2NrX2ludmFsaWRhdGVwYWdlKHBhZ2UsIDApOworCQkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJCX0KKwkJfQorCX0KK30KKworI2lmZGVmIENPTkZJR19KRlNfU1RBVElTVElDUworaW50IGpmc19tcHN0YXRfcmVhZChjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorCQkgICAgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaW50IGxlbiA9IDA7CisJb2ZmX3QgYmVnaW47CisKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIsCisJCSAgICAgICAiSkZTIE1ldGFwYWdlIHN0YXRpc3RpY3NcbiIKKwkJICAgICAgICI9PT09PT09PT09PT09PT09PT09PT09PVxuIgorCQkgICAgICAgInBhZ2UgYWxsb2NhdGlvbnMgPSAlZFxuIgorCQkgICAgICAgInBhZ2UgZnJlZXMgPSAlZFxuIgorCQkgICAgICAgImxvY2sgd2FpdHMgPSAlZFxuIiwKKwkJICAgICAgIG1wU3RhdC5wYWdlYWxsb2MsCisJCSAgICAgICBtcFN0YXQucGFnZWZyZWUsCisJCSAgICAgICBtcFN0YXQubG9ja3dhaXQpOworCisJYmVnaW4gPSBvZmZzZXQ7CisJKnN0YXJ0ID0gYnVmZmVyICsgYmVnaW47CisJbGVuIC09IGJlZ2luOworCisJaWYgKGxlbiA+IGxlbmd0aCkKKwkJbGVuID0gbGVuZ3RoOworCWVsc2UKKwkJKmVvZiA9IDE7CisKKwlpZiAobGVuIDwgMCkKKwkJbGVuID0gMDsKKworCXJldHVybiBsZW47Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfbWV0YXBhZ2UuaCBiL2ZzL2pmcy9qZnNfbWV0YXBhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTU4YWJhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZzL2pmc19tZXRhcGFnZS5oCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogICBDb3B5cmlnaHQgKGMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDAtMjAwMgorICogICBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIENocmlzdG9waCBIZWxsd2lnLCAyMDAxLTIwMDIKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2lmbmRlZglfSF9KRlNfTUVUQVBBR0UKKyNkZWZpbmUgX0hfSkZTX01FVEFQQUdFCisKKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisKK3N0cnVjdCBtZXRhcGFnZSB7CisJLyogQ29tbW9uIGxvZ3N5bmNibGsgcHJlZml4IChzZWUgamZzX2xvZ21nci5oKSAqLworCXUxNiB4ZmxhZzsKKwl1MTYgdW51c2VkOworCWxpZF90IGxpZDsKKwlpbnQgbHNuOworCXN0cnVjdCBsaXN0X2hlYWQgc3luY2xpc3Q7CisJLyogRW5kIG9mIGxvZ3N5bmNibGsgcHJlZml4ICovCisKKwl1bnNpZ25lZCBsb25nIGZsYWc7CS8qIFNlZSBCZWxvdyAqLworCXVuc2lnbmVkIGxvbmcgY291bnQ7CS8qIFJlZmVyZW5jZSBjb3VudCAqLworCXZvaWQgKmRhdGE7CQkvKiBEYXRhIHBvaW50ZXIgKi8KKworCS8qIGxpc3QgbWFuYWdlbWVudCBzdHVmZiAqLworCXN0cnVjdCBtZXRhcGFnZSAqaGFzaF9wcmV2OworCXN0cnVjdCBtZXRhcGFnZSAqaGFzaF9uZXh0OwkvKiBBbHNvIHVzZWQgZm9yIGZyZWUgbGlzdCAqLworCisJLyoKKwkgKiBtYXBwaW5nICYgaW5kZXggYmVjb21lIHJlZHVuZGFudCwgYnV0IHdlIG5lZWQgdGhlc2UgaGVyZSB0bworCSAqIGFkZCB0aGUgbWV0YXBhZ2UgdG8gdGhlIGhhc2ggYmVmb3JlIHdlIGhhdmUgdGhlIHJlYWwgcGFnZQorCSAqLworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOworCXVuc2lnbmVkIGxvbmcgaW5kZXg7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKKworCS8qIGltcGxlbWVudGF0aW9uICovCisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdW5zaWduZWQgbG9uZyBsb2dpY2FsX3NpemU7CisKKwkvKiBKb3VybmFsIG1hbmFnZW1lbnQgKi8KKwlpbnQgY2xzbjsKKwlhdG9taWNfdCBub2hvbWVvazsKKwlzdHJ1Y3QgamZzX2xvZyAqbG9nOworfTsKKworLyogbWV0YXBhZ2UgZmxhZyAqLworI2RlZmluZSBNRVRBX2xvY2tlZAkwCisjZGVmaW5lIE1FVEFfYWJzb2x1dGUJMQorI2RlZmluZSBNRVRBX2ZyZWUJMgorI2RlZmluZSBNRVRBX2RpcnR5CTMKKyNkZWZpbmUgTUVUQV9zeW5jCTQKKyNkZWZpbmUgTUVUQV9kaXNjYXJkCTUKKyNkZWZpbmUgTUVUQV9mb3JjZWQJNgorI2RlZmluZSBNRVRBX3N0YWxlCTcKKworI2RlZmluZSBtYXJrX21ldGFwYWdlX2RpcnR5KG1wKSBzZXRfYml0KE1FVEFfZGlydHksICYobXApLT5mbGFnKQorCisvKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCitleHRlcm4gc3RydWN0IG1ldGFwYWdlICpfX2dldF9tZXRhcGFnZShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgdW5zaWduZWQgbG9uZyBsYmxvY2ssIHVuc2lnbmVkIGludCBzaXplLAorCQkJCSAgaW50IGFic29sdXRlLCB1bnNpZ25lZCBsb25nIG5ldyk7CisKKyNkZWZpbmUgcmVhZF9tZXRhcGFnZShpbm9kZSwgbGJsb2NrLCBzaXplLCBhYnNvbHV0ZSlcCisJIF9fZ2V0X21ldGFwYWdlKGlub2RlLCBsYmxvY2ssIHNpemUsIGFic29sdXRlLCBGQUxTRSkKKworI2RlZmluZSBnZXRfbWV0YXBhZ2UoaW5vZGUsIGxibG9jaywgc2l6ZSwgYWJzb2x1dGUpXAorCSBfX2dldF9tZXRhcGFnZShpbm9kZSwgbGJsb2NrLCBzaXplLCBhYnNvbHV0ZSwgVFJVRSkKKworZXh0ZXJuIHZvaWQgcmVsZWFzZV9tZXRhcGFnZShzdHJ1Y3QgbWV0YXBhZ2UgKik7CitleHRlcm4gdm9pZCBob2xkX21ldGFwYWdlKHN0cnVjdCBtZXRhcGFnZSAqLCBpbnQpOworCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfbWV0YXBhZ2Uoc3RydWN0IG1ldGFwYWdlICptcCkKK3sKKwlzZXRfYml0KE1FVEFfZGlydHksICZtcC0+ZmxhZyk7CisJcmVsZWFzZV9tZXRhcGFnZShtcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF9tZXRhcGFnZShzdHJ1Y3QgbWV0YXBhZ2UgKm1wKQoreworCXNldF9iaXQoTUVUQV9zeW5jLCAmbXAtPmZsYWcpOworCXdyaXRlX21ldGFwYWdlKG1wKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRpc2NhcmRfbWV0YXBhZ2Uoc3RydWN0IG1ldGFwYWdlICptcCkKK3sKKwljbGVhcl9iaXQoTUVUQV9kaXJ0eSwgJm1wLT5mbGFnKTsKKwlzZXRfYml0KE1FVEFfZGlzY2FyZCwgJm1wLT5mbGFnKTsKKwlyZWxlYXNlX21ldGFwYWdlKG1wKTsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZXMgaW52YWxpZGF0ZSBhbGwgcGFnZXMgZm9yIGFuIGV4dGVudC4KKyAqLworZXh0ZXJuIHZvaWQgX19pbnZhbGlkYXRlX21ldGFwYWdlcyhzdHJ1Y3QgaW5vZGUgKiwgczY0LCBpbnQpOworI2RlZmluZSBpbnZhbGlkYXRlX3B4ZF9tZXRhcGFnZXMoaXAsIHB4ZCkgXAorCV9faW52YWxpZGF0ZV9tZXRhcGFnZXMoKGlwKSwgYWRkcmVzc1BYRCgmKHB4ZCkpLCBsZW5ndGhQWEQoJihweGQpKSkKKyNkZWZpbmUgaW52YWxpZGF0ZV9keGRfbWV0YXBhZ2VzKGlwLCBkeGQpIFwKKwlfX2ludmFsaWRhdGVfbWV0YXBhZ2VzKChpcCksIGFkZHJlc3NEWEQoJihkeGQpKSwgbGVuZ3RoRFhEKCYoZHhkKSkpCisjZGVmaW5lIGludmFsaWRhdGVfeGFkX21ldGFwYWdlcyhpcCwgeGFkKSBcCisJX19pbnZhbGlkYXRlX21ldGFwYWdlcygoaXApLCBhZGRyZXNzWEFEKCYoeGFkKSksIGxlbmd0aFhBRCgmKHhhZCkpKQorCisjZW5kaWYJCQkJLyogX0hfSkZTX01FVEFQQUdFICovCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX21vdW50LmMgYi9mcy9qZnMvamZzX21vdW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUzNWZmZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmcy9qZnNfbW91bnQuYwpAQCAtMCwwICsxLDUxMiBAQAorLyoKKyAqICAgQ29weXJpZ2h0IChDKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuLCAyMDAwLTIwMDQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogTW9kdWxlOiBqZnNfbW91bnQuYworICoKKyAqIG5vdGU6IGZpbGUgc3lzdGVtIGluIHRyYW5zaXRpb24gdG8gYWdncmVnYXRlL2ZpbGVzZXQ6CisgKgorICogZmlsZSBzeXN0ZW0gbW91bnQgaXMgaW50ZXJwcmV0ZWQgYXMgdGhlIG1vdW50IG9mIGFnZ3JlZ2F0ZSwgCisgKiBpZiBub3QgYWxyZWFkeSBtb3VudGVkLCBhbmQgbW91bnQgb2YgdGhlIHNpbmdsZS9vbmx5IGZpbGVzZXQgaW4gCisgKiB0aGUgYWdncmVnYXRlOworICoKKyAqIGEgZmlsZSBzeXN0ZW0vYWdncmVnYXRlIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGludGVybmFsIGlub2RlCisgKiAoYWthIG1vdW50IGlub2RlKSBpbml0aWFsaXplZCB3aXRoIGFnZ3JlZ2F0ZSBzdXBlcmJsb2NrOworICogZWFjaCB2ZnMgcmVwcmVzZW50cyBhIGZpbGVzZXQsIGFuZCBwb2ludHMgdG8gaXRzICJmaWxlc2V0IGlub2RlIAorICogYWxsb2NhdGlvbiBtYXAgaW5vZGUiIChha2EgZmlsZXNldCBpbm9kZSk6CisgKiAoYW4gYWdncmVnYXRlIGl0c2VsZiBpcyBzdHJ1Y3R1cmVkIHJlY3Vyc2l2ZWx5IGFzIGEgZmlsc2V0OiAKKyAqIGFuIGludGVybmFsIHZmcyBpcyBjb25zdHJ1Y3RlZCBhbmQgcG9pbnRzIHRvIGl0cyAiZmlsZXNldCBpbm9kZSAKKyAqIGFsbG9jYXRpb24gbWFwIGlub2RlIiAoYWthIGFnZ3JlZ2F0ZSBpbm9kZSkgd2hlcmUgZWFjaCBpbm9kZSAKKyAqIHJlcHJlc2VudHMgYSBmaWxlc2V0IGlub2RlKSBzbyB0aGF0IGlub2RlIG51bWJlciBpcyBtYXBwZWQgdG8gCisgKiBvbi1kaXNrIGlub2RlIGluIHVuaWZvcm0gd2F5IGF0IGJvdGggYWdncmVnYXRlIGFuZCBmaWxlc2V0IGxldmVsOworICoKKyAqIGVhY2ggdm5vZGUvaW5vZGUgb2YgYSBmaWxlc2V0IGlzIGxpbmtlZCB0byBpdHMgdmZzICh0byBmYWNpbGl0YXRlCisgKiBwZXIgZmlsZXNldCBpbm9kZSBvcGVyYXRpb25zLCBlLmcuLCB1bm1vdW50IG9mIGEgZmlsZXNldCwgZXRjLik7CisgKiBlYWNoIGlub2RlIHBvaW50cyB0byB0aGUgbW91bnQgaW5vZGUgKHRvIGZhY2lsaXRhdGUgYWNjZXNzIHRvCisgKiBwZXIgYWdncmVnYXRlIGluZm9ybWF0aW9uLCBlLmcuLCBibG9jayBzaXplLCBldGMuKSBhcyB3ZWxsIGFzCisgKiBpdHMgZmlsZSBzZXQgaW5vZGUuCisgKgorICogICBhZ2dyZWdhdGUgCisgKiAgIGlwbW50CisgKiAgIG1udHZmcyAtPiBmaWxlc2V0IGlwaW1hcCsgLT4gYWdncmVnYXRlIGlwYm1hcCAtPiBhZ2dyZWdhdGUgaXBhaW1hcDsKKyAqICAgICAgICAgICAgIGZpbGVzZXQgdmZzICAgICAtPiB2cCgxKSA8LT4gLi4uIDwtPiB2cChuKSA8LT52cHJvb3Q7CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKworI2luY2x1ZGUgImpmc19pbmNvcmUuaCIKKyNpbmNsdWRlICJqZnNfZmlsc3lzLmgiCisjaW5jbHVkZSAiamZzX3N1cGVyYmxvY2suaCIKKyNpbmNsdWRlICJqZnNfZG1hcC5oIgorI2luY2x1ZGUgImpmc19pbWFwLmgiCisjaW5jbHVkZSAiamZzX21ldGFwYWdlLmgiCisjaW5jbHVkZSAiamZzX2RlYnVnLmgiCisKKworLyoKKyAqIGZvcndhcmQgcmVmZXJlbmNlcworICovCitzdGF0aWMgaW50IGNoa1N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK3N0YXRpYyBpbnQgbG9nTU9VTlQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CisKKy8qCisgKiBOQU1FOglqZnNfbW91bnQoc2IpCisgKgorICogRlVOQ1RJT046CXZmc19tb3VudCgpCisgKgorICogUEFSQU1FVEVSOglzYgktIHN1cGVyIGJsb2NrCisgKgorICogUkVUVVJOOgktRUJVU1kJLSBkZXZpY2UgYWxyZWFkeSBtb3VudGVkIG9yIG9wZW4gZm9yIHdyaXRlCisgKgkJLUVCVVNZCS0gY3ZyZHZwIGFscmVhZHkgbW91bnRlZDsKKyAqCQktRUJVU1kJLSBtb3VudCB0YWJsZSBmdWxsCisgKgkJLUVOT1RESVItIGN2cmR2cCBub3QgZGlyZWN0b3J5IG9uIGEgZGV2aWNlIG1vdW50CisgKgkJLUVOWElPCS0gZGV2aWNlIG9wZW4gZmFpbHVyZQorICovCitpbnQgamZzX21vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJaW50IHJjID0gMDsJCS8qIFJldHVybiBjb2RlICAgICAgICAgICovCisJc3RydWN0IGpmc19zYl9pbmZvICpzYmkgPSBKRlNfU0JJKHNiKTsKKwlzdHJ1Y3QgaW5vZGUgKmlwYWltYXAgPSBOVUxMOworCXN0cnVjdCBpbm9kZSAqaXBhaW1hcDIgPSBOVUxMOworCXN0cnVjdCBpbm9kZSAqaXBpbWFwID0gTlVMTDsKKwlzdHJ1Y3QgaW5vZGUgKmlwYm1hcCA9IE5VTEw7CisKKwkvKgorCSAqIHJlYWQvdmFsaWRhdGUgc3VwZXJibG9jayAKKwkgKiAoaW5pdGlhbGl6ZSBtb3VudCBpbm9kZSBmcm9tIHRoZSBzdXBlcmJsb2NrKQorCSAqLworCWlmICgocmMgPSBjaGtTdXBlcihzYikpKSB7CisJCWdvdG8gZXJyb3V0MjA7CisJfQorCisJaXBhaW1hcCA9IGRpUmVhZFNwZWNpYWwoc2IsIEFHR1JFR0FURV9JLCAwKTsKKwlpZiAoaXBhaW1hcCA9PSBOVUxMKSB7CisJCWpmc19lcnIoImpmc19tb3VudDogRmFpbGQgdG8gcmVhZCBBR0dSRUdBVEVfSSIpOworCQlyYyA9IC1FSU87CisJCWdvdG8gZXJyb3V0MjA7CisJfQorCXNiaS0+aXBhaW1hcCA9IGlwYWltYXA7CisKKwlqZnNfaW5mbygiamZzX21vdW50OiBpcGFpbWFwOjB4JXAiLCBpcGFpbWFwKTsKKworCS8qCisJICogaW5pdGlhbGl6ZSBhZ2dyZWdhdGUgaW5vZGUgYWxsb2NhdGlvbiBtYXAKKwkgKi8KKwlpZiAoKHJjID0gZGlNb3VudChpcGFpbWFwKSkpIHsKKwkJamZzX2VycigiamZzX21vdW50OiBkaU1vdW50KGlwYWltYXApIGZhaWxlZCB3L3JjID0gJWQiLCByYyk7CisJCWdvdG8gZXJyb3V0MjE7CisJfQorCisJLyoKKwkgKiBvcGVuIGFnZ3JlZ2F0ZSBibG9jayBhbGxvY2F0aW9uIG1hcAorCSAqLworCWlwYm1hcCA9IGRpUmVhZFNwZWNpYWwoc2IsIEJNQVBfSSwgMCk7CisJaWYgKGlwYm1hcCA9PSBOVUxMKSB7CisJCXJjID0gLUVJTzsKKwkJZ290byBlcnJvdXQyMjsKKwl9CisKKwlqZnNfaW5mbygiamZzX21vdW50OiBpcGJtYXA6MHglcCIsIGlwYm1hcCk7CisKKwlzYmktPmlwYm1hcCA9IGlwYm1hcDsKKworCS8qCisJICogaW5pdGlhbGl6ZSBhZ2dyZWdhdGUgYmxvY2sgYWxsb2NhdGlvbiBtYXAKKwkgKi8KKwlpZiAoKHJjID0gZGJNb3VudChpcGJtYXApKSkgeworCQlqZnNfZXJyKCJqZnNfbW91bnQ6IGRiTW91bnQgZmFpbGVkIHcvcmMgPSAlZCIsIHJjKTsKKwkJZ290byBlcnJvdXQyMjsKKwl9CisKKwkvKgorCSAqIG9wZW4gdGhlIHNlY29uZGFyeSBhZ2dyZWdhdGUgaW5vZGUgYWxsb2NhdGlvbiBtYXAKKwkgKgorCSAqIFRoaXMgaXMgYSBkdXBsaWNhdGUgb2YgdGhlIGFnZ3JlZ2F0ZSBpbm9kZSBhbGxvY2F0aW9uIG1hcC4KKwkgKgorCSAqIGhhbmQgY3JhZnQgYSB2ZnMgaW4gdGhlIHNhbWUgZmFzaGlvbiBhcyB3ZSBkaWQgdG8gcmVhZCBpcGFpbWFwLgorCSAqIEJ5IGFkZGluZyBJTk9TUEVSRVhUICgzMikgdG8gdGhlIGlub2RlIG51bWJlciwgd2UgYXJlIHRlbGxpbmcKKwkgKiBkaVJlYWRTcGVjaWFsIHRoYXQgd2UgYXJlIHJlYWRpbmcgZnJvbSB0aGUgc2Vjb25kYXJ5IGFnZ3JlZ2F0ZQorCSAqIGlub2RlIHRhYmxlLiAgVGhpcyBhbHNvIGNyZWF0ZXMgYSB1bmlxdWUgZW50cnkgaW4gdGhlIGlub2RlIGhhc2gKKwkgKiB0YWJsZS4KKwkgKi8KKwlpZiAoKHNiaS0+bW50ZmxhZyAmIEpGU19CQURfU0FJVCkgPT0gMCkgeworCQlpcGFpbWFwMiA9IGRpUmVhZFNwZWNpYWwoc2IsIEFHR1JFR0FURV9JLCAxKTsKKwkJaWYgKGlwYWltYXAyID09IDApIHsKKwkJCWpmc19lcnIoImpmc19tb3VudDogRmFpbGQgdG8gcmVhZCBBR0dSRUdBVEVfSSIpOworCQkJcmMgPSAtRUlPOworCQkJZ290byBlcnJvdXQzNTsKKwkJfQorCQlzYmktPmlwYWltYXAyID0gaXBhaW1hcDI7CisKKwkJamZzX2luZm8oImpmc19tb3VudDogaXBhaW1hcDI6MHglcCIsIGlwYWltYXAyKTsKKworCQkvKgorCQkgKiBpbml0aWFsaXplIHNlY29uZGFyeSBhZ2dyZWdhdGUgaW5vZGUgYWxsb2NhdGlvbiBtYXAKKwkJICovCisJCWlmICgocmMgPSBkaU1vdW50KGlwYWltYXAyKSkpIHsKKwkJCWpmc19lcnIoImpmc19tb3VudDogZGlNb3VudChpcGFpbWFwMikgZmFpbGVkLCByYyA9ICVkIiwKKwkJCQlyYyk7CisJCQlnb3RvIGVycm91dDM1OworCQl9CisJfSBlbHNlCisJCS8qIFNlY29uZGFyeSBhZ2dyZWdhdGUgaW5vZGUgdGFibGUgaXMgbm90IHZhbGlkICovCisJCXNiaS0+aXBhaW1hcDIgPSBOVUxMOworCisJLyoKKwkgKiAgICAgIG1vdW50ICh0aGUgb25seS9zaW5nbGUpIGZpbGVzZXQKKwkgKi8KKwkvKgorCSAqIG9wZW4gZmlsZXNldCBpbm9kZSBhbGxvY2F0aW9uIG1hcCAoYWthIGZpbGVzZXQgaW5vZGUpCisJICovCisJaXBpbWFwID0gZGlSZWFkU3BlY2lhbChzYiwgRklMRVNZU1RFTV9JLCAwKTsKKwlpZiAoaXBpbWFwID09IE5VTEwpIHsKKwkJamZzX2VycigiamZzX21vdW50OiBGYWlsZWQgdG8gcmVhZCBGSUxFU1lTVEVNX0kiKTsKKwkJLyogb3BlbiBmaWxlc2V0IHNlY29uZGFyeSBpbm9kZSBhbGxvY2F0aW9uIG1hcCAqLworCQlyYyA9IC1FSU87CisJCWdvdG8gZXJyb3V0NDA7CisJfQorCWpmc19pbmZvKCJqZnNfbW91bnQ6IGlwaW1hcDoweCVwIiwgaXBpbWFwKTsKKworCS8qIG1hcCBmdXJ0aGVyIGFjY2VzcyBvZiBwZXIgZmlsZXNldCBpbm9kZXMgYnkgdGhlIGZpbGVzZXQgaW5vZGUgKi8KKwlzYmktPmlwaW1hcCA9IGlwaW1hcDsKKworCS8qIGluaXRpYWxpemUgZmlsZXNldCBpbm9kZSBhbGxvY2F0aW9uIG1hcCAqLworCWlmICgocmMgPSBkaU1vdW50KGlwaW1hcCkpKSB7CisJCWpmc19lcnIoImpmc19tb3VudDogZGlNb3VudCBmYWlsZWQgdy9yYyA9ICVkIiwgcmMpOworCQlnb3RvIGVycm91dDQxOworCX0KKworCWdvdG8gb3V0OworCisJLyoKKwkgKiAgICAgIHVud2luZCBvbiBlcnJvcgorCSAqLworICAgICAgZXJyb3V0NDE6CQkvKiBjbG9zZSBmaWxlc2V0IGlub2RlIGFsbG9jYXRpb24gbWFwIGlub2RlICovCisJZGlGcmVlU3BlY2lhbChpcGltYXApOworCisgICAgICBlcnJvdXQ0MDoJCS8qIGZpbGVzZXQgY2xvc2VkICovCisKKwkvKiBjbG9zZSBzZWNvbmRhcnkgYWdncmVnYXRlIGlub2RlIGFsbG9jYXRpb24gbWFwICovCisJaWYgKGlwYWltYXAyKSB7CisJCWRpVW5tb3VudChpcGFpbWFwMiwgMSk7CisJCWRpRnJlZVNwZWNpYWwoaXBhaW1hcDIpOworCX0KKworICAgICAgZXJyb3V0MzU6CisKKwkvKiBjbG9zZSBhZ2dyZWdhdGUgYmxvY2sgYWxsb2NhdGlvbiBtYXAgKi8KKwlkYlVubW91bnQoaXBibWFwLCAxKTsKKwlkaUZyZWVTcGVjaWFsKGlwYm1hcCk7CisKKyAgICAgIGVycm91dDIyOgkJLyogY2xvc2UgYWdncmVnYXRlIGlub2RlIGFsbG9jYXRpb24gbWFwICovCisKKwlkaVVubW91bnQoaXBhaW1hcCwgMSk7CisKKyAgICAgIGVycm91dDIxOgkJLyogY2xvc2UgYWdncmVnYXRlIGlub2RlcyAqLworCWRpRnJlZVNwZWNpYWwoaXBhaW1hcCk7CisgICAgICBlcnJvdXQyMDoJCS8qIGFnZ3JlZ2F0ZSBjbG9zZWQgKi8KKworICAgICAgb3V0OgorCisJaWYgKHJjKQorCQlqZnNfZXJyKCJNb3VudCBKRlMgRmFpbHVyZTogJWQiLCByYyk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBOQU1FOglqZnNfbW91bnRfcncoc2IsIHJlbW91bnQpCisgKgorICogRlVOQ1RJT046CUNvbXBsZXRlcyByZWFkLXdyaXRlIG1vdW50LCBvciByZW1vdW50cyByZWFkLW9ubHkgdm9sdW1lCisgKgkJYXMgcmVhZC13cml0ZQorICovCitpbnQgamZzX21vdW50X3J3KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCByZW1vdW50KQoreworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpID0gSkZTX1NCSShzYik7ICAKKwlpbnQgcmM7CisKKwkvKgorCSAqIElmIHdlIGFyZSByZS1tb3VudGluZyBhIHByZXZpb3VzbHkgcmVhZC1vbmx5IHZvbHVtZSwgd2Ugd2FudCB0bworCSAqIHJlLXJlYWQgdGhlIGlub2RlIGFuZCBibG9jayBtYXBzLCBzaW5jZSBmc2NrLmpmcyBtYXkgaGF2ZSB1cGRhdGVkCisJICogdGhlbS4KKwkgKi8KKwlpZiAocmVtb3VudCkgeworCQlpZiAoY2hrU3VwZXIoc2IpIHx8IChzYmktPnN0YXRlICE9IEZNX0NMRUFOKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXRydW5jYXRlX2lub2RlX3BhZ2VzKHNiaS0+aXBpbWFwLT5pX21hcHBpbmcsIDApOworCQl0cnVuY2F0ZV9pbm9kZV9wYWdlcyhzYmktPmlwYm1hcC0+aV9tYXBwaW5nLCAwKTsKKwkJZGlVbm1vdW50KHNiaS0+aXBpbWFwLCAxKTsKKwkJaWYgKChyYyA9IGRpTW91bnQoc2JpLT5pcGltYXApKSkgeworCQkJamZzX2VycigiamZzX21vdW50X3J3OiBkaU1vdW50IGZhaWxlZCEiKTsKKwkJCXJldHVybiByYzsKKwkJfQorCisJCWRiVW5tb3VudChzYmktPmlwYm1hcCwgMSk7CisJCWlmICgocmMgPSBkYk1vdW50KHNiaS0+aXBibWFwKSkpIHsKKwkJCWpmc19lcnIoImpmc19tb3VudF9ydzogZGJNb3VudCBmYWlsZWQhIik7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9CisKKwkvKgorCSAqIG9wZW4vaW5pdGlhbGl6ZSBsb2cKKwkgKi8KKwlpZiAoKHJjID0gbG1Mb2dPcGVuKHNiKSkpCisJCXJldHVybiByYzsKKworCS8qCisJICogdXBkYXRlIGZpbGUgc3lzdGVtIHN1cGVyYmxvY2s7CisJICovCisJaWYgKChyYyA9IHVwZGF0ZVN1cGVyKHNiLCBGTV9NT1VOVCkpKSB7CisJCWpmc19lcnIoImpmc19tb3VudDogdXBkYXRlU3VwZXIgZmFpbGVkIHcvcmMgPSAlZCIsIHJjKTsKKwkJbG1Mb2dDbG9zZShzYik7CisJCXJldHVybiByYzsKKwl9CisKKwkvKgorCSAqIHdyaXRlIE1PVU5UIGxvZyByZWNvcmQgb2YgdGhlIGZpbGUgc3lzdGVtCisJICovCisJbG9nTU9VTlQoc2IpOworCisJLyoKKwkgKiBTZXQgcGFnZSBjYWNoZSBhbGxvY2F0aW9uIHBvbGljeQorCSAqLworCW1hcHBpbmdfc2V0X2dmcF9tYXNrKHNiLT5zX2JkZXYtPmJkX2lub2RlLT5pX21hcHBpbmcsIEdGUF9OT0ZTKTsKKworCXJldHVybiByYzsKK30KKworLyoKKyAqCWNoa1N1cGVyKCkKKyAqCisgKiB2YWxpZGF0ZSB0aGUgc3VwZXJibG9jayBvZiB0aGUgZmlsZSBzeXN0ZW0gdG8gYmUgbW91bnRlZCBhbmQgCisgKiBnZXQgdGhlIGZpbGUgc3lzdGVtIHBhcmFtZXRlcnMuCisgKgorICogcmV0dXJucworICoJMCB3aXRoIGZyYWdzaXplIHNldCBpZiBjaGVjayBzdWNjZXNzZnVsCisgKgllcnJvciBjb2RlIGlmIG5vdCBzdWNjZXNzZnVsCisgKi8KK3N0YXRpYyBpbnQgY2hrU3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpID0gSkZTX1NCSShzYik7CisJc3RydWN0IGpmc19zdXBlcmJsb2NrICpqX3NiOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaW50IEFJTV9ieXRlc2l6ZSwgQUlUX2J5dGVzaXplOworCWludCBleHBlY3RlZF9BSU1fYnl0ZXNpemUsIGV4cGVjdGVkX0FJVF9ieXRlc2l6ZTsKKwlzNjQgQUlNX2J5dGVfYWRkciwgQUlUX2J5dGVfYWRkciwgZnNja3dzcF9hZGRyOworCXM2NCBieXRlX2FkZHJfZGlmZjAsIGJ5dGVfYWRkcl9kaWZmMTsKKwlzMzIgYnNpemU7CisKKwlpZiAoKHJjID0gcmVhZFN1cGVyKHNiLCAmYmgpKSkKKwkJcmV0dXJuIHJjOworCWpfc2IgPSAoc3RydWN0IGpmc19zdXBlcmJsb2NrICopYmgtPmJfZGF0YTsKKworCS8qCisJICogdmFsaWRhdGUgc3VwZXJibG9jaworCSAqLworCS8qIHZhbGlkYXRlIGZzIHNpZ25hdHVyZSAqLworCWlmIChzdHJuY21wKGpfc2ItPnNfbWFnaWMsIEpGU19NQUdJQywgNCkgfHwKKwkgICAgbGUzMl90b19jcHUoal9zYi0+c192ZXJzaW9uKSA+IEpGU19WRVJTSU9OKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJYnNpemUgPSBsZTMyX3RvX2NwdShqX3NiLT5zX2JzaXplKTsKKyNpZmRlZiBfSkZTXzRLCisJaWYgKGJzaXplICE9IFBTSVpFKSB7CisJCWpmc19lcnIoIkN1cnJlbnRseSBvbmx5IDRLIGJsb2NrIHNpemUgc3VwcG9ydGVkISIpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKyNlbmRpZgkJCQkvKiBfSkZTXzRLICovCisKKwlqZnNfaW5mbygic3VwZXJibG9jazogZmxhZzoweCUwOHggc3RhdGU6MHglMDh4IHNpemU6MHglTHgiLAorCQkgbGUzMl90b19jcHUoal9zYi0+c19mbGFnKSwgbGUzMl90b19jcHUoal9zYi0+c19zdGF0ZSksCisJCSAodW5zaWduZWQgbG9uZyBsb25nKSBsZTY0X3RvX2NwdShqX3NiLT5zX3NpemUpKTsKKworCS8qIHZhbGlkYXRlIHRoZSBkZXNjcmlwdG9ycyBmb3IgU2Vjb25kYXJ5IEFJTSBhbmQgQUlUICovCisJaWYgKChqX3NiLT5zX2ZsYWcgJiBjcHVfdG9fbGUzMihKRlNfQkFEX1NBSVQpKSAhPQorCSAgICBjcHVfdG9fbGUzMihKRlNfQkFEX1NBSVQpKSB7CisJCWV4cGVjdGVkX0FJTV9ieXRlc2l6ZSA9IDIgKiBQU0laRTsKKwkJQUlNX2J5dGVzaXplID0gbGVuZ3RoUFhEKCYoal9zYi0+c19haW0yKSkgKiBic2l6ZTsKKwkJZXhwZWN0ZWRfQUlUX2J5dGVzaXplID0gNCAqIFBTSVpFOworCQlBSVRfYnl0ZXNpemUgPSBsZW5ndGhQWEQoJihqX3NiLT5zX2FpdDIpKSAqIGJzaXplOworCQlBSU1fYnl0ZV9hZGRyID0gYWRkcmVzc1BYRCgmKGpfc2ItPnNfYWltMikpICogYnNpemU7CisJCUFJVF9ieXRlX2FkZHIgPSBhZGRyZXNzUFhEKCYoal9zYi0+c19haXQyKSkgKiBic2l6ZTsKKwkJYnl0ZV9hZGRyX2RpZmYwID0gQUlUX2J5dGVfYWRkciAtIEFJTV9ieXRlX2FkZHI7CisJCWZzY2t3c3BfYWRkciA9IGFkZHJlc3NQWEQoJihqX3NiLT5zX2ZzY2tweGQpKSAqIGJzaXplOworCQlieXRlX2FkZHJfZGlmZjEgPSBmc2Nrd3NwX2FkZHIgLSBBSVRfYnl0ZV9hZGRyOworCQlpZiAoKEFJTV9ieXRlc2l6ZSAhPSBleHBlY3RlZF9BSU1fYnl0ZXNpemUpIHx8CisJCSAgICAoQUlUX2J5dGVzaXplICE9IGV4cGVjdGVkX0FJVF9ieXRlc2l6ZSkgfHwKKwkJICAgIChieXRlX2FkZHJfZGlmZjAgIT0gQUlNX2J5dGVzaXplKSB8fAorCQkgICAgKGJ5dGVfYWRkcl9kaWZmMSA8PSBBSVRfYnl0ZXNpemUpKQorCQkJal9zYi0+c19mbGFnIHw9IGNwdV90b19sZTMyKEpGU19CQURfU0FJVCk7CisJfQorCisJaWYgKChqX3NiLT5zX2ZsYWcgJiBjcHVfdG9fbGUzMihKRlNfR1JPVVBDT01NSVQpKSAhPQorCSAgICBjcHVfdG9fbGUzMihKRlNfR1JPVVBDT01NSVQpKQorCQlqX3NiLT5zX2ZsYWcgfD0gY3B1X3RvX2xlMzIoSkZTX0dST1VQQ09NTUlUKTsKKworCS8qIHZhbGlkYXRlIGZzIHN0YXRlICovCisJaWYgKGpfc2ItPnNfc3RhdGUgIT0gY3B1X3RvX2xlMzIoRk1fQ0xFQU4pICYmCisJICAgICEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCWpmc19lcnIoImpmc19tb3VudDogTW91bnQgRmFpbHVyZTogRmlsZSBTeXN0ZW0gRGlydHkuIik7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJc2JpLT5zdGF0ZSA9IGxlMzJfdG9fY3B1KGpfc2ItPnNfc3RhdGUpOworCXNiaS0+bW50ZmxhZyA9IGxlMzJfdG9fY3B1KGpfc2ItPnNfZmxhZyk7CisKKwkvKgorCSAqIEpGUyBhbHdheXMgZG9lcyBJL08gYnkgNEsgcGFnZXMuICBEb24ndCB0ZWxsIHRoZSBidWZmZXIgY2FjaGUKKwkgKiB0aGF0IHdlIHVzZSBhbnl0aGluZyBlbHNlIChsZWF2ZSBzX2Jsb2Nrc2l6ZSBhbG9uZSkuCisJICovCisJc2JpLT5ic2l6ZSA9IGJzaXplOworCXNiaS0+bDJic2l6ZSA9IGxlMTZfdG9fY3B1KGpfc2ItPnNfbDJic2l6ZSk7CisKKwkvKgorCSAqIEZvciBub3csIGlnbm9yZSBzX3Bic2l6ZSwgbDJiZmFjdG9yLiAgQWxsIEkvTyBnb2luZyB0aHJvdWdoIGJ1ZmZlcgorCSAqIGNhY2hlLgorCSAqLworCXNiaS0+bmJwZXJwYWdlID0gUFNJWkUgPj4gc2JpLT5sMmJzaXplOworCXNiaS0+bDJuYnBlcnBhZ2UgPSBMMlBTSVpFIC0gc2JpLT5sMmJzaXplOworCXNiaS0+bDJuaXBlcmJsayA9IHNiaS0+bDJic2l6ZSAtIEwyRElTSVpFOworCWlmIChzYmktPm1udGZsYWcgJiBKRlNfSU5MSU5FTE9HKQorCQlzYmktPmxvZ3B4ZCA9IGpfc2ItPnNfbG9ncHhkOworCWVsc2UgeworCQlzYmktPmxvZ2RldiA9IG5ld19kZWNvZGVfZGV2KGxlMzJfdG9fY3B1KGpfc2ItPnNfbG9nZGV2KSk7CisJCW1lbWNweShzYmktPnV1aWQsIGpfc2ItPnNfdXVpZCwgc2l6ZW9mKHNiaS0+dXVpZCkpOworCQltZW1jcHkoc2JpLT5sb2d1dWlkLCBqX3NiLT5zX2xvZ3V1aWQsIHNpemVvZihzYmktPnV1aWQpKTsKKwl9CisJc2JpLT5mc2NrcHhkID0gal9zYi0+c19mc2NrcHhkOworCXNiaS0+YWl0MiA9IGpfc2ItPnNfYWl0MjsKKworICAgICAgb3V0OgorCWJyZWxzZShiaCk7CisJcmV0dXJuIHJjOworfQorCisKKy8qCisgKgl1cGRhdGVTdXBlcigpCisgKgorICogdXBkYXRlIHN5bmNocm9ub3VzbHkgc3VwZXJibG9jayBpZiBpdCBpcyBtb3VudGVkIHJlYWQtd3JpdGUuCisgKi8KK2ludCB1cGRhdGVTdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1aW50IHN0YXRlKQoreworCXN0cnVjdCBqZnNfc3VwZXJibG9jayAqal9zYjsKKwlzdHJ1Y3QgamZzX3NiX2luZm8gKnNiaSA9IEpGU19TQkkoc2IpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaW50IHJjOworCisJaWYgKHNiaS0+ZmxhZyAmIEpGU19OT0lOVEVHUklUWSkgeworCQlpZiAoc3RhdGUgPT0gRk1fRElSVFkpIHsKKwkJCXNiaS0+cF9zdGF0ZSA9IHN0YXRlOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAoc3RhdGUgPT0gRk1fTU9VTlQpIHsKKwkJCXNiaS0+cF9zdGF0ZSA9IHNiaS0+c3RhdGU7CisJCQlzdGF0ZSA9IEZNX0RJUlRZOworCQl9IGVsc2UgaWYgKHN0YXRlID09IEZNX0NMRUFOKSB7CisJCQlzdGF0ZSA9IHNiaS0+cF9zdGF0ZTsKKwkJfSBlbHNlCisJCQlqZnNfZXJyKCJ1cGRhdGVTdXBlcjogYmFkIHN0YXRlIik7CisJfSBlbHNlIGlmIChzYmktPnN0YXRlID09IEZNX0RJUlRZKQorCQlyZXR1cm4gMDsKKwkKKwlpZiAoKHJjID0gcmVhZFN1cGVyKHNiLCAmYmgpKSkKKwkJcmV0dXJuIHJjOworCisJal9zYiA9IChzdHJ1Y3QgamZzX3N1cGVyYmxvY2sgKiliaC0+Yl9kYXRhOworCisJal9zYi0+c19zdGF0ZSA9IGNwdV90b19sZTMyKHN0YXRlKTsKKwlzYmktPnN0YXRlID0gc3RhdGU7CisKKwlpZiAoc3RhdGUgPT0gRk1fTU9VTlQpIHsKKwkJLyogcmVjb3JkIGxvZydzIGRldl90IGFuZCBtb3VudCBzZXJpYWwgbnVtYmVyICovCisJCWpfc2ItPnNfbG9nZGV2ID0gY3B1X3RvX2xlMzIobmV3X2VuY29kZV9kZXYoc2JpLT5sb2ctPmJkZXYtPmJkX2RldikpOworCQlqX3NiLT5zX2xvZ3NlcmlhbCA9IGNwdV90b19sZTMyKHNiaS0+bG9nLT5zZXJpYWwpOworCX0gZWxzZSBpZiAoc3RhdGUgPT0gRk1fQ0xFQU4pIHsKKwkJLyoKKwkJICogSWYgdGhpcyB2b2x1bWUgaXMgc2hhcmVkIHdpdGggT1MvMiwgT1MvMiB3aWxsIG5lZWQgdG8KKwkJICogcmVjYWxjdWxhdGUgREFTRCB1c2FnZSwgc2luY2Ugd2UgZG9uJ3QgZGVhbCB3aXRoIGl0LgorCQkgKi8KKwkJaWYgKGpfc2ItPnNfZmxhZyAmIGNwdV90b19sZTMyKEpGU19EQVNEX0VOQUJMRUQpKQorCQkJal9zYi0+c19mbGFnIHw9IGNwdV90b19sZTMyKEpGU19EQVNEX1BSSU1FKTsKKwl9CisKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJc3luY19kaXJ0eV9idWZmZXIoYmgpOworCWJyZWxzZShiaCk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICoJcmVhZFN1cGVyKCkKKyAqCisgKiByZWFkIHN1cGVyYmxvY2sgYnkgcmF3IHNlY3RvciBhZGRyZXNzCisgKi8KK2ludCByZWFkU3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYnBwKQoreworCS8qIHJlYWQgaW4gcHJpbWFyeSBzdXBlcmJsb2NrICovCisJKmJwcCA9IHNiX2JyZWFkKHNiLCBTVVBFUjFfT0ZGID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwlpZiAoKmJwcCkKKwkJcmV0dXJuIDA7CisKKwkvKiByZWFkIGluIHNlY29uZGFyeS9yZXBsaWNhdGVkIHN1cGVyYmxvY2sgKi8KKwkqYnBwID0gc2JfYnJlYWQoc2IsIFNVUEVSMl9PRkYgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCWlmICgqYnBwKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAtRUlPOworfQorCisKKy8qCisgKglsb2dNT1VOVCgpCisgKgorICogZnVuY3Rpb246IHdyaXRlIGEgTU9VTlQgbG9nIHJlY29yZCBmb3IgZmlsZSBzeXN0ZW0uCisgKgorICogTU9VTlQgcmVjb3JkIGtlZXBzIGxvZ3JlZG8oKSBmcm9tIHByb2Nlc3NpbmcgbG9nIHJlY29yZHMKKyAqIGZvciB0aGlzIGZpbGUgc3lzdGVtIHBhc3QgdGhpcyBwb2ludCBpbiBsb2cuCisgKiBpdCBpcyBoYXJtbGVzcyBpZiBtb3VudCBmYWlscy4KKyAqCisgKiBub3RlOiBNT1VOVCByZWNvcmQgaXMgYXQgYWdncmVnYXRlIGxldmVsLCBub3QgYXQgZmlsZXNldCBsZXZlbCwgCisgKiBzaW5jZSBsb2cgcmVjb3JkcyBvZiBwcmV2aW91cyBtb3VudHMgb2YgYSBmaWxlc2V0CisgKiAoZS5nLiwgQUZURVIgcmVjb3JkIG9mIGV4dGVudCBhbGxvY2F0aW9uKSBoYXZlIHRvIGJlIHByb2Nlc3NlZCAKKyAqIHRvIHVwZGF0ZSBibG9jayBhbGxvY2F0aW9uIG1hcCBhdCBhZ2dyZWdhdGUgbGV2ZWwuCisgKi8KK3N0YXRpYyBpbnQgbG9nTU9VTlQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgamZzX2xvZyAqbG9nID0gSkZTX1NCSShzYiktPmxvZzsKKwlzdHJ1Y3QgbHJkIGxyZDsKKworCWxyZC5sb2d0aWQgPSAwOworCWxyZC5iYWNrY2hhaW4gPSAwOworCWxyZC50eXBlID0gY3B1X3RvX2xlMTYoTE9HX01PVU5UKTsKKwlscmQubGVuZ3RoID0gMDsKKwlscmQuYWdncmVnYXRlID0gY3B1X3RvX2xlMzIobmV3X2VuY29kZV9kZXYoc2ItPnNfYmRldi0+YmRfZGV2KSk7CisJbG1Mb2cobG9nLCBOVUxMLCAmbHJkLCBOVUxMKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19zdXBlcmJsb2NrLmggYi9mcy9qZnMvamZzX3N1cGVyYmxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjA1NjZmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZzL2pmc19zdXBlcmJsb2NrLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwMC0yMDAzCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKyNpZm5kZWYJX0hfSkZTX1NVUEVSQkxPQ0sKKyNkZWZpbmUgX0hfSkZTX1NVUEVSQkxPQ0sKKworLyoKKyAqIG1ha2UgdGhlIG1hZ2ljIG51bWJlciBzb21ldGhpbmcgYSBodW1hbiBjb3VsZCByZWFkCisgKi8KKyNkZWZpbmUgSkZTX01BR0lDIAkiSkZTMSIJLyogTWFnaWMgd29yZCAqLworCisjZGVmaW5lIEpGU19WRVJTSU9OCTIJLyogVmVyc2lvbiBudW1iZXI6IFZlcnNpb24gMiAqLworCisjZGVmaW5lIExWX05BTUVfU0laRQkxMQkvKiBNVVNUIEJFIDExIGZvciBPUy8yIGJvb3Qgc2VjdG9yICovCisKKy8qIAorICoJYWdncmVnYXRlIHN1cGVyYmxvY2sgCisgKgorICogVGhlIG5hbWUgc3VwZXJibG9jayBpcyB0b28gY2xvc2UgdG8gc3VwZXJfYmxvY2ssIHNvIHRoZSBuYW1lIGhhcyBiZWVuCisgKiBjaGFuZ2VkIHRvIGpmc19zdXBlcmJsb2NrLiAgVGhlIHV0aWxpdGllcyBhcmUgc3RpbGwgdXNpbmcgdGhlIG9sZCBuYW1lLgorICovCitzdHJ1Y3QgamZzX3N1cGVyYmxvY2sgeworCWNoYXIgc19tYWdpY1s0XTsJLyogNDogbWFnaWMgbnVtYmVyICovCisJX19sZTMyIHNfdmVyc2lvbjsJLyogNDogdmVyc2lvbiBudW1iZXIgKi8KKworCV9fbGU2NCBzX3NpemU7CQkvKiA4OiBhZ2dyZWdhdGUgc2l6ZSBpbiBoYXJkd2FyZS9MVk0gYmxvY2tzOworCQkJCSAqIFZGUzogbnVtYmVyIG9mIGJsb2NrcworCQkJCSAqLworCV9fbGUzMiBzX2JzaXplOwkJLyogNDogYWdncmVnYXRlIGJsb2NrIHNpemUgaW4gYnl0ZXM7IAorCQkJCSAqIFZGUzogZnJhZ21lbnQgc2l6ZQorCQkJCSAqLworCV9fbGUxNiBzX2wyYnNpemU7CS8qIDI6IGxvZzIgb2Ygc19ic2l6ZSAqLworCV9fbGUxNiBzX2wyYmZhY3RvcjsJLyogMjogbG9nMihzX2JzaXplL2hhcmR3YXJlIGJsb2NrIHNpemUpICovCisJX19sZTMyIHNfcGJzaXplOwkvKiA0OiBoYXJkd2FyZS9MVk0gYmxvY2sgc2l6ZSBpbiBieXRlcyAqLworCV9fbGUxNiBzX2wycGJzaXplOwkvKiAyOiBsb2cyIG9mIHNfcGJzaXplICovCisJX19sZTE2IHBhZDsJCS8qIDI6IHBhZGRpbmcgbmVjZXNzYXJ5IGZvciBhbGlnbm1lbnQgKi8KKworCV9fbGUzMiBzX2Fnc2l6ZTsJLyogNDogYWxsb2NhdGlvbiBncm91cCBzaXplIGluIGFnZ3IuIGJsb2NrcyAqLworCisJX19sZTMyIHNfZmxhZzsJCS8qIDQ6IGFnZ3JlZ2F0ZSBhdHRyaWJ1dGVzOgorCQkJCSAqICAgIHNlZSBqZnNfZmlsc3lzLmgKKwkJCQkgKi8KKwlfX2xlMzIgc19zdGF0ZTsJCS8qIDQ6IG1vdW50L3VubW91bnQvcmVjb3Zlcnkgc3RhdGU6IAorCQkJCSAqICAgIHNlZSBqZnNfZmlsc3lzLmgKKwkJCQkgKi8KKwlfX2xlMzIgc19jb21wcmVzczsJCS8qIDQ6ID4gMCBpZiBkYXRhIGNvbXByZXNzaW9uICovCisKKwlweGRfdCBzX2FpdDI7CQkvKiA4OiBmaXJzdCBleHRlbnQgb2Ygc2Vjb25kYXJ5CisJCQkJICogICAgYWdncmVnYXRlIGlub2RlIHRhYmxlCisJCQkJICovCisKKwlweGRfdCBzX2FpbTI7CQkvKiA4OiBmaXJzdCBleHRlbnQgb2Ygc2Vjb25kYXJ5CisJCQkJICogICAgYWdncmVnYXRlIGlub2RlIG1hcAorCQkJCSAqLworCV9fbGUzMiBzX2xvZ2RldjsJCS8qIDQ6IGRldmljZSBhZGRyZXNzIG9mIGxvZyAqLworCV9fbGUzMiBzX2xvZ3NlcmlhbDsJLyogNDogbG9nIHNlcmlhbCBudW1iZXIgYXQgYWdncmVnYXRlIG1vdW50ICovCisJcHhkX3Qgc19sb2dweGQ7CQkvKiA4OiBpbmxpbmUgbG9nIGV4dGVudCAqLworCisJcHhkX3Qgc19mc2NrcHhkOwkvKiA4OiBpbmxpbmUgZnNjayB3b3JrIHNwYWNlIGV4dGVudCAqLworCisJc3RydWN0IHRpbWVzdHJ1Y190IHNfdGltZTsJLyogODogdGltZSBsYXN0IHVwZGF0ZWQgKi8KKworCV9fbGUzMiBzX2ZzY2tsb2dsZW47CS8qIDQ6IE51bWJlciBvZiBmaWxlc3lzdGVtIGJsb2NrcyByZXNlcnZlZCBmb3IKKwkJCQkgKiAgICB0aGUgZnNjayBzZXJ2aWNlIGxvZy4gIAorCQkJCSAqICAgIE4uQi4gVGhlc2UgYmxvY2tzIGFyZSBkaXZpZGVkIGFtb25nIHRoZQorCQkJCSAqICAgICAgICAgdmVyc2lvbnMga2VwdC4gIFRoaXMgaXMgbm90IGEgcGVyCisJCQkJICogICAgICAgICB2ZXJzaW9uIHNpemUuCisJCQkJICogICAgTi5CLiBUaGVzZSBibG9ja3MgYXJlIGluY2x1ZGVkIGluIHRoZSAKKwkJCQkgKiAgICAgICAgIGxlbmd0aCBmaWVsZCBvZiBzX2ZzY2tweGQuCisJCQkJICovCisJczggc19mc2NrbG9nOwkJLyogMTogd2hpY2ggZnNjayBzZXJ2aWNlIGxvZyBpcyBtb3N0IHJlY2VudAorCQkJCSAqICAgIDAgPT4gbm8gc2VydmljZSBsb2cgZGF0YSB5ZXQKKwkJCQkgKiAgICAxID0+IHRoZSBmaXJzdCBvbmUKKwkJCQkgKiAgICAyID0+IHRoZSAybmQgb25lCisJCQkJICovCisJY2hhciBzX2ZwYWNrWzExXTsJLyogMTE6IGZpbGUgc3lzdGVtIHZvbHVtZSBuYW1lIAorCQkJCSAqICAgICBOLkIuIFRoaXMgbXVzdCBiZSAxMSBieXRlcyB0bworCQkJCSAqICAgICAgICAgIGNvbmZvcm0gd2l0aCB0aGUgT1MvMiBCb290U2VjdG9yCisJCQkJICogICAgICAgICAgcmVxdWlyZW1lbnRzCisJCQkJICogICAgICAgICAgT25seSB1c2VkIHdoZW4gc192ZXJzaW9uIGlzIDEKKwkJCQkgKi8KKworCS8qIGV4dGVuZGZzKCkgcGFyYW1ldGVyIHVuZGVyIHNfc3RhdGUgJiBGTV9FWFRFTkRGUyAqLworCV9fbGU2NCBzX3hzaXplOwkJLyogODogZXh0ZW5kZnMgc19zaXplICovCisJcHhkX3Qgc194ZnNja3B4ZDsJLyogODogZXh0ZW5kZnMgZnNja3B4ZCAqLworCXB4ZF90IHNfeGxvZ3B4ZDsJLyogODogZXh0ZW5kZnMgbG9ncHhkICovCisJLyogLSAxMjggYnl0ZSBib3VuZGFyeSAtICovCisKKwljaGFyIHNfdXVpZFsxNl07CS8qIDE2OiAxMjgtYml0IHV1aWQgZm9yIHZvbHVtZSAqLworCWNoYXIgc19sYWJlbFsxNl07CS8qIDE2OiB2b2x1bWUgbGFiZWwgKi8KKwljaGFyIHNfbG9ndXVpZFsxNl07CS8qIDE2OiAxMjgtYml0IHV1aWQgZm9yIGxvZyBkZXZpY2UgKi8KKworfTsKKworZXh0ZXJuIGludCByZWFkU3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBidWZmZXJfaGVhZCAqKik7CitleHRlcm4gaW50IHVwZGF0ZVN1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1aW50KTsKK2V4dGVybiB2b2lkIGpmc19lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCAuLi4pOworCisjZW5kaWYgLypfSF9KRlNfU1VQRVJCTE9DSyAqLwpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc190eG5tZ3IuYyBiL2ZzL2pmcy9qZnNfdHhubWdyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQwMzAxZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmcy9qZnNfdHhubWdyLmMKQEAgLTAsMCArMSwzMTMxIEBACisvKgorICogICBDb3B5cmlnaHQgKEMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDAtMjAwNQorICogICBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIENocmlzdG9waCBIZWxsd2lnLCAyMDAxLTIwMDIKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvKgorICogICAgICBqZnNfdHhubWdyLmM6IHRyYW5zYWN0aW9uIG1hbmFnZXIKKyAqCisgKiBub3RlczoKKyAqIHRyYW5zYWN0aW9uIHN0YXJ0cyB3aXRoIHR4QmVnaW4oKSBhbmQgZW5kcyB3aXRoIHR4Q29tbWl0KCkKKyAqIG9yIHR4QWJvcnQoKS4KKyAqCisgKiB0bG9jayBpcyBhY3F1aXJlZCBhdCB0aGUgdGltZSBvZiB1cGRhdGU7CisgKiAob2J2aWF0ZSBzY2FuIGF0IGNvbW1pdCB0aW1lIGZvciB4dHJlZSBhbmQgZHRyZWUpCisgKiB0bG9jayBhbmQgbXAgcG9pbnRzIHRvIGVhY2ggb3RoZXI7CisgKiAobm8gaGFzaGxpc3QgZm9yIG1wIC0+IHRsb2NrKS4KKyAqCisgKiBzcGVjaWFsIGNhc2VzOgorICogdGxvY2sgb24gaW4tbWVtb3J5IGlub2RlOgorICogaW4tcGxhY2UgdGxvY2sgaW4gdGhlIGluLW1lbW9yeSBpbm9kZSBpdHNlbGY7CisgKiBjb252ZXJ0ZWQgdG8gcGFnZSBsb2NrIGJ5IGlXcml0ZSgpIGF0IGNvbW1pdCB0aW1lLgorICoKKyAqIHRsb2NrIGR1cmluZyB3cml0ZSgpL21tYXAoKSB1bmRlciBhbm9ueW1vdXMgdHJhbnNhY3Rpb24gKHRpZCA9IDApOgorICogdHJhbnNmZXJyZWQgKD8pIHRvIHRyYW5zYWN0aW9uIGF0IGNvbW1pdCB0aW1lLgorICoKKyAqIHVzZSB0aGUgcGFnZSBpdHNlbGYgdG8gdXBkYXRlIGFsbG9jYXRpb24gbWFwcworICogKG9idmlhdGUgaW50ZXJtZWRpYXRlIHJlcGxpY2F0aW9uIG9mIGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uIGRhdGEpCisgKiBob2xkIG9uIHRvIG1wK2xvY2sgdGhydSB1cGRhdGUgb2YgbWFwcworICovCisKKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgImpmc19pbmNvcmUuaCIKKyNpbmNsdWRlICJqZnNfZmlsc3lzLmgiCisjaW5jbHVkZSAiamZzX21ldGFwYWdlLmgiCisjaW5jbHVkZSAiamZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgImpmc19pbWFwLmgiCisjaW5jbHVkZSAiamZzX2RtYXAuaCIKKyNpbmNsdWRlICJqZnNfc3VwZXJibG9jay5oIgorI2luY2x1ZGUgImpmc19kZWJ1Zy5oIgorCisvKgorICogICAgICB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IHN0cnVjdHVyZXMKKyAqLworc3RhdGljIHN0cnVjdCB7CisJaW50IGZyZWV0aWQ7CQkvKiBpbmRleCBvZiBhIGZyZWUgdGlkIHN0cnVjdHVyZSAqLworCWludCBmcmVlbG9jazsJCS8qIGluZGV4IGZpcnN0IGZyZWUgbG9jayB3b3JkICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgZnJlZXdhaXQ7CS8qIGV2ZW50bGlzdCBvZiBmcmVlIHRibG9jayAqLworCXdhaXRfcXVldWVfaGVhZF90IGZyZWVsb2Nrd2FpdDsJLyogZXZlbnRsaXN0IG9mIGZyZWUgdGxvY2sgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBsb3dsb2Nrd2FpdDsJLyogZXZlbnRsaXN0IG9mIGFtcGxlIHRsb2NrcyAqLworCWludCB0bG9ja3NJblVzZTsJLyogTnVtYmVyIG9mIHRsb2NrcyBpbiB1c2UgKi8KKwlzcGlubG9ja190IExhenlMb2NrOwkvKiBzeW5jaHJvbml6ZSBzeW5jX3F1ZXVlICYgdW5sb2NrX3F1ZXVlICovCisvKglzdHJ1Y3QgdGJsb2NrICpzeW5jX3F1ZXVlOyAqIFRyYW5zYWN0aW9ucyB3YWl0aW5nIGZvciBkYXRhIHN5bmMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHVubG9ja19xdWV1ZTsJLyogVHhucyB3YWl0aW5nIHRvIGJlIHJlbGVhc2VkICovCisJc3RydWN0IGxpc3RfaGVhZCBhbm9uX2xpc3Q7CS8qIGlub2RlcyBoYXZpbmcgYW5vbnltb3VzIHR4bnMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGFub25fbGlzdDI7CS8qIGlub2RlcyBoYXZpbmcgYW5vbnltb3VzIHR4bnMKKwkJCQkJICAgdGhhdCBjb3VsZG4ndCBiZSBzeW5jJ2VkICovCit9IFR4QW5jaG9yOworCitpbnQgamZzX3Rsb2Nrc19sb3c7CQkvKiBJbmRpY2F0ZXMgbG93IG51bWJlciBvZiBhdmFpbGFibGUgdGxvY2tzICovCisKKyNpZmRlZiBDT05GSUdfSkZTX1NUQVRJU1RJQ1MKK3N0YXRpYyBzdHJ1Y3QgeworCXVpbnQgdHhCZWdpbjsKKwl1aW50IHR4QmVnaW5fYmFycmllcjsKKwl1aW50IHR4QmVnaW5fbG9ja3Nsb3c7CisJdWludCB0eEJlZ2luX2ZyZWV0aWQ7CisJdWludCB0eEJlZ2luQW5vbjsKKwl1aW50IHR4QmVnaW5Bbm9uX2JhcnJpZXI7CisJdWludCB0eEJlZ2luQW5vbl9sb2Nrc2xvdzsKKwl1aW50IHR4TG9ja0FsbG9jOworCXVpbnQgdHhMb2NrQWxsb2NfZnJlZWxvY2s7Cit9IFR4U3RhdDsKKyNlbmRpZgorCitzdGF0aWMgaW50IG5UeEJsb2NrID0gLTE7CS8qIG51bWJlciBvZiB0cmFuc2FjdGlvbiBibG9ja3MgKi8KK21vZHVsZV9wYXJhbShuVHhCbG9jaywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoblR4QmxvY2ssCisJCSAiTnVtYmVyIG9mIHRyYW5zYWN0aW9uIGJsb2NrcyAobWF4OjY1NTM2KSIpOworCitzdGF0aWMgaW50IG5UeExvY2sgPSAtMTsJLyogbnVtYmVyIG9mIHRyYW5zYWN0aW9uIGxvY2tzICovCittb2R1bGVfcGFyYW0oblR4TG9jaywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoblR4TG9jaywKKwkJICJOdW1iZXIgb2YgdHJhbnNhY3Rpb24gbG9ja3MgKG1heDo2NTUzNikiKTsKKworc3RydWN0IHRibG9jayAqVHhCbG9jazsJICAgICAgICAvKiB0cmFuc2FjdGlvbiBibG9jayB0YWJsZSAqLworc3RhdGljIGludCBUeExvY2tMV007CQkvKiBMb3cgd2F0ZXIgbWFyayBmb3IgbnVtYmVyIG9mIHR4TG9ja3MgdXNlZCAqLworc3RhdGljIGludCBUeExvY2tIV007CQkvKiBIaWdoIHdhdGVyIG1hcmsgZm9yIG51bWJlciBvZiB0eExvY2tzIHVzZWQgKi8KK3N0YXRpYyBpbnQgVHhMb2NrVkhXTTsJCS8qIFZlcnkgSGlnaCB3YXRlciBtYXJrICovCitzdHJ1Y3QgdGxvY2sgKlR4TG9jazsgICAgICAgICAgIC8qIHRyYW5zYWN0aW9uIGxvY2sgdGFibGUgKi8KKworCisvKgorICogICAgICB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50IGxvY2sKKyAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhqZnNUeG5Mb2NrKTsKKworI2RlZmluZSBUWE5fTE9DSygpICAgICAgICAgICAgICBzcGluX2xvY2soJmpmc1R4bkxvY2spCisjZGVmaW5lIFRYTl9VTkxPQ0soKSAgICAgICAgICAgIHNwaW5fdW5sb2NrKCZqZnNUeG5Mb2NrKQorCisjZGVmaW5lIExBWllfTE9DS19JTklUKCkJc3Bpbl9sb2NrX2luaXQoJlR4QW5jaG9yLkxhenlMb2NrKTsKKyNkZWZpbmUgTEFaWV9MT0NLKGZsYWdzKQlzcGluX2xvY2tfaXJxc2F2ZSgmVHhBbmNob3IuTGF6eUxvY2ssIGZsYWdzKQorI2RlZmluZSBMQVpZX1VOTE9DSyhmbGFncykgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmVHhBbmNob3IuTGF6eUxvY2ssIGZsYWdzKQorCitERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChqZnNfc3luY190aHJlYWRfd2FpdCk7CitERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChqZnNfY29tbWl0X3RocmVhZF93YWl0KTsKK3N0YXRpYyBpbnQgamZzX2NvbW1pdF90aHJlYWRfd2FraW5nOworCisvKgorICogUmV0cnkgbG9naWMgZXhpc3Qgb3V0c2lkZSB0aGVzZSBtYWNyb3MgdG8gcHJvdGVjdCBmcm9tIHNwdXJyaW91cyB3YWtldXBzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgVFhOX1NMRUVQX0RST1BfTE9DSyh3YWl0X3F1ZXVlX2hlYWRfdCAqIGV2ZW50KQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJYWRkX3dhaXRfcXVldWUoZXZlbnQsICZ3YWl0KTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJVFhOX1VOTE9DSygpOworCXNjaGVkdWxlKCk7CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJcmVtb3ZlX3dhaXRfcXVldWUoZXZlbnQsICZ3YWl0KTsKK30KKworI2RlZmluZSBUWE5fU0xFRVAoZXZlbnQpXAore1wKKwlUWE5fU0xFRVBfRFJPUF9MT0NLKGV2ZW50KTtcCisJVFhOX0xPQ0soKTtcCit9CisKKyNkZWZpbmUgVFhOX1dBS0VVUChldmVudCkgd2FrZV91cF9hbGwoZXZlbnQpCisKKworLyoKKyAqICAgICAgc3RhdGlzdGljcworICovCitzdGF0aWMgc3RydWN0IHsKKwl0aWRfdCBtYXh0aWQ7CQkvKiA0OiBiaWdnZXN0IHRpZCBldmVyIHVzZWQgKi8KKwlsaWRfdCBtYXhsaWQ7CQkvKiA0OiBiaWdnZXN0IGxpZCBldmVyIHVzZWQgKi8KKwlpbnQgbnRpZDsJCS8qIDQ6ICMgb2YgdHJhbnNhY3Rpb25zIHBlcmZvcm1lZCAqLworCWludCBubGlkOwkJLyogNDogIyBvZiB0bG9ja3MgYWNxdWlyZWQgKi8KKwlpbnQgd2FpdGxvY2s7CQkvKiA0OiAjIG9mIHRsb2NrIHdhaXQgKi8KK30gc3RhdHR4OworCisKKy8qCisgKiBleHRlcm5hbCByZWZlcmVuY2VzCisgKi8KK2V4dGVybiBpbnQgbG1Hcm91cENvbW1pdChzdHJ1Y3QgamZzX2xvZyAqLCBzdHJ1Y3QgdGJsb2NrICopOworZXh0ZXJuIGludCBqZnNfY29tbWl0X2lub2RlKHN0cnVjdCBpbm9kZSAqLCBpbnQpOworZXh0ZXJuIGludCBqZnNfc3RvcF90aHJlYWRzOworCitleHRlcm4gc3RydWN0IGNvbXBsZXRpb24gamZzSU93YWl0OworCisvKgorICogZm9yd2FyZCByZWZlcmVuY2VzCisgKi8KK3N0YXRpYyBpbnQgZGlMb2coc3RydWN0IGpmc19sb2cgKiBsb2csIHN0cnVjdCB0YmxvY2sgKiB0YmxrLCBzdHJ1Y3QgbHJkICogbHJkLAorCQlzdHJ1Y3QgdGxvY2sgKiB0bGNrLCBzdHJ1Y3QgY29tbWl0ICogY2QpOworc3RhdGljIGludCBkYXRhTG9nKHN0cnVjdCBqZnNfbG9nICogbG9nLCBzdHJ1Y3QgdGJsb2NrICogdGJsaywgc3RydWN0IGxyZCAqIGxyZCwKKwkJc3RydWN0IHRsb2NrICogdGxjayk7CitzdGF0aWMgdm9pZCBkdExvZyhzdHJ1Y3QgamZzX2xvZyAqIGxvZywgc3RydWN0IHRibG9jayAqIHRibGssIHN0cnVjdCBscmQgKiBscmQsCisJCXN0cnVjdCB0bG9jayAqIHRsY2spOworc3RhdGljIHZvaWQgbWFwTG9nKHN0cnVjdCBqZnNfbG9nICogbG9nLCBzdHJ1Y3QgdGJsb2NrICogdGJsaywgc3RydWN0IGxyZCAqIGxyZCwKKwkJc3RydWN0IHRsb2NrICogdGxjayk7CitzdGF0aWMgdm9pZCB0eEFsbG9jUE1hcChzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgbWFwbG9jayAqIG1hcGxvY2ssCisJCXN0cnVjdCB0YmxvY2sgKiB0YmxrKTsKK3N0YXRpYyB2b2lkIHR4Rm9yY2Uoc3RydWN0IHRibG9jayAqIHRibGspOworc3RhdGljIGludCB0eExvZyhzdHJ1Y3QgamZzX2xvZyAqIGxvZywgc3RydWN0IHRibG9jayAqIHRibGssCisJCXN0cnVjdCBjb21taXQgKiBjZCk7CitzdGF0aWMgdm9pZCB0eFVwZGF0ZU1hcChzdHJ1Y3QgdGJsb2NrICogdGJsayk7CitzdGF0aWMgdm9pZCB0eFJlbGVhc2Uoc3RydWN0IHRibG9jayAqIHRibGspOworc3RhdGljIHZvaWQgeHRMb2coc3RydWN0IGpmc19sb2cgKiBsb2csIHN0cnVjdCB0YmxvY2sgKiB0YmxrLCBzdHJ1Y3QgbHJkICogbHJkLAorCSAgIHN0cnVjdCB0bG9jayAqIHRsY2spOworc3RhdGljIHZvaWQgTG9nU3luY1JlbGVhc2Uoc3RydWN0IG1ldGFwYWdlICogbXApOworCisvKgorICogICAgICAgICAgICAgIHRyYW5zYWN0aW9uIGJsb2NrL2xvY2sgbWFuYWdlbWVudAorICogICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qCisgKiBHZXQgYSB0cmFuc2FjdGlvbiBsb2NrIGZyb20gdGhlIGZyZWUgbGlzdC4gIElmIHRoZSBudW1iZXIgaW4gdXNlIGlzCisgKiBncmVhdGVyIHRoYW4gdGhlIGhpZ2ggd2F0ZXIgbWFyaywgd2FrZSB1cCB0aGUgc3luYyBkYWVtb24uICBUaGlzIHNob3VsZAorICogZnJlZSBzb21lIGFub255bW91cyB0cmFuc2FjdGlvbiBsb2Nrcy4gIChUWE5fTE9DSyBtdXN0IGJlIGhlbGQuKQorICovCitzdGF0aWMgbGlkX3QgdHhMb2NrQWxsb2Modm9pZCkKK3sKKwlsaWRfdCBsaWQ7CisKKwlJTkNSRU1FTlQoVHhTdGF0LnR4TG9ja0FsbG9jKTsKKwlpZiAoIVR4QW5jaG9yLmZyZWVsb2NrKSB7CisJCUlOQ1JFTUVOVChUeFN0YXQudHhMb2NrQWxsb2NfZnJlZWxvY2spOworCX0KKworCXdoaWxlICghKGxpZCA9IFR4QW5jaG9yLmZyZWVsb2NrKSkKKwkJVFhOX1NMRUVQKCZUeEFuY2hvci5mcmVlbG9ja3dhaXQpOworCVR4QW5jaG9yLmZyZWVsb2NrID0gVHhMb2NrW2xpZF0ubmV4dDsKKwlISUdIV0FURVJNQVJLKHN0YXR0eC5tYXhsaWQsIGxpZCk7CisJaWYgKCgrK1R4QW5jaG9yLnRsb2Nrc0luVXNlID4gVHhMb2NrSFdNKSAmJiAoamZzX3Rsb2Nrc19sb3cgPT0gMCkpIHsKKwkJamZzX2luZm8oInR4TG9ja0FsbG9jIHRsb2NrcyBsb3ciKTsKKwkJamZzX3Rsb2Nrc19sb3cgPSAxOworCQl3YWtlX3VwKCZqZnNfc3luY190aHJlYWRfd2FpdCk7CisJfQorCisJcmV0dXJuIGxpZDsKK30KKworc3RhdGljIHZvaWQgdHhMb2NrRnJlZShsaWRfdCBsaWQpCit7CisJVHhMb2NrW2xpZF0ubmV4dCA9IFR4QW5jaG9yLmZyZWVsb2NrOworCVR4QW5jaG9yLmZyZWVsb2NrID0gbGlkOworCVR4QW5jaG9yLnRsb2Nrc0luVXNlLS07CisJaWYgKGpmc190bG9ja3NfbG93ICYmIChUeEFuY2hvci50bG9ja3NJblVzZSA8IFR4TG9ja0xXTSkpIHsKKwkJamZzX2luZm8oInR4TG9ja0ZyZWUgamZzX3Rsb2Nrc19sb3cgbm8gbW9yZSIpOworCQlqZnNfdGxvY2tzX2xvdyA9IDA7CisJCVRYTl9XQUtFVVAoJlR4QW5jaG9yLmxvd2xvY2t3YWl0KTsKKwl9CisJVFhOX1dBS0VVUCgmVHhBbmNob3IuZnJlZWxvY2t3YWl0KTsKK30KKworLyoKKyAqIE5BTUU6ICAgICAgICB0eEluaXQoKQorICoKKyAqIEZVTkNUSU9OOiAgICBpbml0aWFsaXplIHRyYW5zYWN0aW9uIG1hbmFnZW1lbnQgc3RydWN0dXJlcworICoKKyAqIFJFVFVSTjoKKyAqCisgKiBzZXJpYWxpemF0aW9uOiBzaW5nbGUgdGhyZWFkIGF0IGpmc19pbml0KCkKKyAqLworaW50IHR4SW5pdCh2b2lkKQoreworCWludCBrLCBzaXplOworCXN0cnVjdCBzeXNpbmZvIHNpOworCisJLyogU2V0IGRlZmF1bHRzIGZvciBuVHhMb2NrIGFuZCBuVHhCbG9jayBpZiB1bnNldCAqLworCisJaWYgKG5UeExvY2sgPT0gLTEpIHsKKwkJaWYgKG5UeEJsb2NrID09IC0xKSB7CisJCQkvKiBCYXNlIGRlZmF1bHQgb24gbWVtb3J5IHNpemUgKi8KKwkJCXNpX21lbWluZm8oJnNpKTsKKwkJCWlmIChzaS50b3RhbHJhbSA+ICgyNTYgKiAxMDI0KSkgLyogMSBHQiAqLworCQkJCW5UeExvY2sgPSA2NCAqIDEwMjQ7CisJCQllbHNlCisJCQkJblR4TG9jayA9IHNpLnRvdGFscmFtID4+IDI7CisJCX0gZWxzZSBpZiAoblR4QmxvY2sgPiAoOCAqIDEwMjQpKQorCQkJblR4TG9jayA9IDY0ICogMTAyNDsKKwkJZWxzZQorCQkJblR4TG9jayA9IG5UeEJsb2NrIDw8IDM7CisJfQorCWlmIChuVHhCbG9jayA9PSAtMSkKKwkJblR4QmxvY2sgPSBuVHhMb2NrID4+IDM7CisKKwkvKiBWZXJpZnkgdHVuYWJsZSBwYXJhbWV0ZXJzICovCisJaWYgKG5UeEJsb2NrIDwgMTYpCisJCW5UeEJsb2NrID0gMTY7CS8qIE5vIG9uZSBzaG91bGQgc2V0IGl0IHRoaXMgbG93ICovCisJaWYgKG5UeEJsb2NrID4gNjU1MzYpCisJCW5UeEJsb2NrID0gNjU1MzY7CisJaWYgKG5UeExvY2sgPCAyNTYpCisJCW5UeExvY2sgPSAyNTY7CS8qIE5vIG9uZSBzaG91bGQgc2V0IGl0IHRoaXMgbG93ICovCisJaWYgKG5UeExvY2sgPiA2NTUzNikKKwkJblR4TG9jayA9IDY1NTM2OworCisJcHJpbnRrKEtFUk5fSU5GTyAiSkZTOiBuVHhCbG9jayA9ICVkLCBuVHhMb2NrID0gJWRcbiIsCisJICAgICAgIG5UeEJsb2NrLCBuVHhMb2NrKTsKKwkvKgorCSAqIGluaXRpYWxpemUgdHJhbnNhY3Rpb24gYmxvY2sgKHRibG9jaykgdGFibGUKKwkgKgorCSAqIHRyYW5zYWN0aW9uIGlkICh0aWQpID0gdGJsb2NrIGluZGV4CisJICogdGlkID0gMCBpcyByZXNlcnZlZC4KKwkgKi8KKwlUeExvY2tMV00gPSAoblR4TG9jayAqIDQpIC8gMTA7CisJVHhMb2NrSFdNID0gKG5UeExvY2sgKiA3KSAvIDEwOworCVR4TG9ja1ZIV00gPSAoblR4TG9jayAqIDgpIC8gMTA7CisKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCB0YmxvY2spICogblR4QmxvY2s7CisJVHhCbG9jayA9IChzdHJ1Y3QgdGJsb2NrICopIHZtYWxsb2Moc2l6ZSk7CisJaWYgKFR4QmxvY2sgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGsgPSAxOyBrIDwgblR4QmxvY2sgLSAxOyBrKyspIHsKKwkJVHhCbG9ja1trXS5uZXh0ID0gayArIDE7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJlR4QmxvY2tba10uZ2N3YWl0KTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmVHhCbG9ja1trXS53YWl0b3IpOworCX0KKwlUeEJsb2NrW2tdLm5leHQgPSAwOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJlR4QmxvY2tba10uZ2N3YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZUeEJsb2NrW2tdLndhaXRvcik7CisKKwlUeEFuY2hvci5mcmVldGlkID0gMTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZUeEFuY2hvci5mcmVld2FpdCk7CisKKwlzdGF0dHgubWF4dGlkID0gMTsJLyogc3RhdGlzdGljcyAqLworCisJLyoKKwkgKiBpbml0aWFsaXplIHRyYW5zYWN0aW9uIGxvY2sgKHRsb2NrKSB0YWJsZQorCSAqCisJICogdHJhbnNhY3Rpb24gbG9jayBpZCA9IHRsb2NrIGluZGV4CisJICogdGxvY2sgaWQgPSAwIGlzIHJlc2VydmVkLgorCSAqLworCXNpemUgPSBzaXplb2Yoc3RydWN0IHRsb2NrKSAqIG5UeExvY2s7CisJVHhMb2NrID0gKHN0cnVjdCB0bG9jayAqKSB2bWFsbG9jKHNpemUpOworCWlmIChUeExvY2sgPT0gTlVMTCkgeworCQl2ZnJlZShUeEJsb2NrKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogaW5pdGlhbGl6ZSB0bG9jayB0YWJsZSAqLworCWZvciAoayA9IDE7IGsgPCBuVHhMb2NrIC0gMTsgaysrKQorCQlUeExvY2tba10ubmV4dCA9IGsgKyAxOworCVR4TG9ja1trXS5uZXh0ID0gMDsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZUeEFuY2hvci5mcmVlbG9ja3dhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJlR4QW5jaG9yLmxvd2xvY2t3YWl0KTsKKworCVR4QW5jaG9yLmZyZWVsb2NrID0gMTsKKwlUeEFuY2hvci50bG9ja3NJblVzZSA9IDA7CisJSU5JVF9MSVNUX0hFQUQoJlR4QW5jaG9yLmFub25fbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJlR4QW5jaG9yLmFub25fbGlzdDIpOworCisJTEFaWV9MT0NLX0lOSVQoKTsKKwlJTklUX0xJU1RfSEVBRCgmVHhBbmNob3IudW5sb2NrX3F1ZXVlKTsKKworCXN0YXR0eC5tYXhsaWQgPSAxOwkvKiBzdGF0aXN0aWNzICovCisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE5BTUU6ICAgICAgICB0eEV4aXQoKQorICoKKyAqIEZVTkNUSU9OOiAgICBjbGVhbiB1cCB3aGVuIG1vZHVsZSBpcyB1bmxvYWRlZAorICovCit2b2lkIHR4RXhpdCh2b2lkKQoreworCXZmcmVlKFR4TG9jayk7CisJVHhMb2NrID0gTlVMTDsKKwl2ZnJlZShUeEJsb2NrKTsKKwlUeEJsb2NrID0gTlVMTDsKK30KKworCisvKgorICogTkFNRTogICAgICAgIHR4QmVnaW4oKQorICoKKyAqIEZVTkNUSU9OOiAgICBzdGFydCBhIHRyYW5zYWN0aW9uLgorICoKKyAqIFBBUkFNRVRFUjogICBzYgktIHN1cGVyYmxvY2sKKyAqICAgICAgICAgICAgICBmbGFnCS0gZm9yY2UgZm9yIG5lc3RlZCB0eDsKKyAqCisgKiBSRVRVUk46CXRpZAktIHRyYW5zYWN0aW9uIGlkCisgKgorICogbm90ZTogZmxhZyBmb3JjZSBhbGxvd3MgdG8gc3RhcnQgdHggZm9yIG5lc3RlZCB0eAorICogdG8gcHJldmVudCBkZWFkbG9jayBvbiBsb2dzeW5jIGJhcnJpZXI7CisgKi8KK3RpZF90IHR4QmVnaW4oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGZsYWcpCit7CisJdGlkX3QgdDsKKwlzdHJ1Y3QgdGJsb2NrICp0YmxrOworCXN0cnVjdCBqZnNfbG9nICpsb2c7CisKKwlqZnNfaW5mbygidHhCZWdpbjogZmxhZyA9IDB4JXgiLCBmbGFnKTsKKwlsb2cgPSBKRlNfU0JJKHNiKS0+bG9nOworCisJVFhOX0xPQ0soKTsKKworCUlOQ1JFTUVOVChUeFN0YXQudHhCZWdpbik7CisKKyAgICAgIHJldHJ5OgorCWlmICghKGZsYWcgJiBDT01NSVRfRk9SQ0UpKSB7CisJCS8qCisJCSAqIHN5bmNocm9uaXplIHdpdGggbG9nc3luYyBiYXJyaWVyCisJCSAqLworCQlpZiAodGVzdF9iaXQobG9nX1NZTkNCQVJSSUVSLCAmbG9nLT5mbGFnKSB8fAorCQkgICAgdGVzdF9iaXQobG9nX1FVSUVTQ0UsICZsb2ctPmZsYWcpKSB7CisJCQlJTkNSRU1FTlQoVHhTdGF0LnR4QmVnaW5fYmFycmllcik7CisJCQlUWE5fU0xFRVAoJmxvZy0+c3luY3dhaXQpOworCQkJZ290byByZXRyeTsKKwkJfQorCX0KKwlpZiAoZmxhZyA9PSAwKSB7CisJCS8qCisJCSAqIERvbid0IGJlZ2luIHRyYW5zYWN0aW9uIGlmIHdlJ3JlIGdldHRpbmcgc3RhcnZlZCBmb3IgdGxvY2tzCisJCSAqIHVubGVzcyBDT01NSVRfRk9SQ0Ugb3IgQ09NTUlUX0lOT0RFICh3aGljaCBtYXkgdWx0aW1hdGVseQorCQkgKiBmcmVlIHRsb2NrcykKKwkJICovCisJCWlmIChUeEFuY2hvci50bG9ja3NJblVzZSA+IFR4TG9ja1ZIV00pIHsKKwkJCUlOQ1JFTUVOVChUeFN0YXQudHhCZWdpbl9sb2Nrc2xvdyk7CisJCQlUWE5fU0xFRVAoJlR4QW5jaG9yLmxvd2xvY2t3YWl0KTsKKwkJCWdvdG8gcmV0cnk7CisJCX0KKwl9CisKKwkvKgorCSAqIGFsbG9jYXRlIHRyYW5zYWN0aW9uIGlkL2Jsb2NrCisJICovCisJaWYgKCh0ID0gVHhBbmNob3IuZnJlZXRpZCkgPT0gMCkgeworCQlqZnNfaW5mbygidHhCZWdpbjogd2FpdGluZyBmb3IgZnJlZSB0aWQiKTsKKwkJSU5DUkVNRU5UKFR4U3RhdC50eEJlZ2luX2ZyZWV0aWQpOworCQlUWE5fU0xFRVAoJlR4QW5jaG9yLmZyZWV3YWl0KTsKKwkJZ290byByZXRyeTsKKwl9CisKKwl0YmxrID0gdGlkX3RvX3RibG9jayh0KTsKKworCWlmICgodGJsay0+bmV4dCA9PSAwKSAmJiAhKGZsYWcgJiBDT01NSVRfRk9SQ0UpKSB7CisJCS8qIERvbid0IGxldCBhIG5vbi1mb3JjZWQgdHJhbnNhY3Rpb24gdGFrZSB0aGUgbGFzdCB0YmxrICovCisJCWpmc19pbmZvKCJ0eEJlZ2luOiB3YWl0aW5nIGZvciBmcmVlIHRpZCIpOworCQlJTkNSRU1FTlQoVHhTdGF0LnR4QmVnaW5fZnJlZXRpZCk7CisJCVRYTl9TTEVFUCgmVHhBbmNob3IuZnJlZXdhaXQpOworCQlnb3RvIHJldHJ5OworCX0KKworCVR4QW5jaG9yLmZyZWV0aWQgPSB0YmxrLT5uZXh0OworCisJLyoKKwkgKiBpbml0aWFsaXplIHRyYW5zYWN0aW9uCisJICovCisKKwkvKgorCSAqIFdlIGNhbid0IHplcm8gdGhlIHdob2xlIHRoaW5nIG9yIHdlIHNjcmV3IHVwIGFub3RoZXIgdGhyZWFkIGJlaW5nCisJICogYXdha2VuZWQgYWZ0ZXIgc2xlZXBpbmcgb24gdGJsay0+d2FpdG9yCisJICoKKwkgKiBtZW1zZXQodGJsaywgMCwgc2l6ZW9mKHN0cnVjdCB0YmxvY2spKTsKKwkgKi8KKwl0YmxrLT5uZXh0ID0gdGJsay0+bGFzdCA9IHRibGstPnhmbGFnID0gdGJsay0+ZmxhZyA9IHRibGstPmxzbiA9IDA7CisKKwl0YmxrLT5zYiA9IHNiOworCSsrbG9nLT5sb2d0aWQ7CisJdGJsay0+bG9ndGlkID0gbG9nLT5sb2d0aWQ7CisKKwkrK2xvZy0+YWN0aXZlOworCisJSElHSFdBVEVSTUFSSyhzdGF0dHgubWF4dGlkLCB0KTsJLyogc3RhdGlzdGljcyAqLworCUlOQ1JFTUVOVChzdGF0dHgubnRpZCk7CS8qIHN0YXRpc3RpY3MgKi8KKworCVRYTl9VTkxPQ0soKTsKKworCWpmc19pbmZvKCJ0eEJlZ2luOiByZXR1cm5pbmcgdGlkID0gJWQiLCB0KTsKKworCXJldHVybiB0OworfQorCisKKy8qCisgKiBOQU1FOiAgICAgICAgdHhCZWdpbkFub24oKQorICoKKyAqIEZVTkNUSU9OOiAgICBzdGFydCBhbiBhbm9ueW1vdXMgdHJhbnNhY3Rpb24uCisgKgkJQmxvY2tzIGlmIGxvZ3N5bmMgb3IgYXZhaWxhYmxlIHRsb2NrcyBhcmUgbG93IHRvIHByZXZlbnQKKyAqCQlhbm9ueW1vdXMgdGxvY2tzIGZyb20gZGVwbGV0aW5nIHN1cHBseS4KKyAqCisgKiBQQVJBTUVURVI6ICAgc2IJLSBzdXBlcmJsb2NrCisgKgorICogUkVUVVJOOglub25lCisgKi8KK3ZvaWQgdHhCZWdpbkFub24oc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgamZzX2xvZyAqbG9nOworCisJbG9nID0gSkZTX1NCSShzYiktPmxvZzsKKworCVRYTl9MT0NLKCk7CisJSU5DUkVNRU5UKFR4U3RhdC50eEJlZ2luQW5vbik7CisKKyAgICAgIHJldHJ5OgorCS8qCisJICogc3luY2hyb25pemUgd2l0aCBsb2dzeW5jIGJhcnJpZXIKKwkgKi8KKwlpZiAodGVzdF9iaXQobG9nX1NZTkNCQVJSSUVSLCAmbG9nLT5mbGFnKSB8fAorCSAgICB0ZXN0X2JpdChsb2dfUVVJRVNDRSwgJmxvZy0+ZmxhZykpIHsKKwkJSU5DUkVNRU5UKFR4U3RhdC50eEJlZ2luQW5vbl9iYXJyaWVyKTsKKwkJVFhOX1NMRUVQKCZsb2ctPnN5bmN3YWl0KTsKKwkJZ290byByZXRyeTsKKwl9CisKKwkvKgorCSAqIERvbid0IGJlZ2luIHRyYW5zYWN0aW9uIGlmIHdlJ3JlIGdldHRpbmcgc3RhcnZlZCBmb3IgdGxvY2tzCisJICovCisJaWYgKFR4QW5jaG9yLnRsb2Nrc0luVXNlID4gVHhMb2NrVkhXTSkgeworCQlJTkNSRU1FTlQoVHhTdGF0LnR4QmVnaW5Bbm9uX2xvY2tzbG93KTsKKwkJVFhOX1NMRUVQKCZUeEFuY2hvci5sb3dsb2Nrd2FpdCk7CisJCWdvdG8gcmV0cnk7CisJfQorCVRYTl9VTkxPQ0soKTsKK30KKworCisvKgorICogICAgICB0eEVuZCgpCisgKgorICogZnVuY3Rpb246IGZyZWUgc3BlY2lmaWVkIHRyYW5zYWN0aW9uIGJsb2NrLgorICoKKyAqICAgICAgbG9nc3luYyBiYXJyaWVyIHByb2Nlc3Npbmc6CisgKgorICogc2VyaWFsaXphdGlvbjoKKyAqLwordm9pZCB0eEVuZCh0aWRfdCB0aWQpCit7CisJc3RydWN0IHRibG9jayAqdGJsayA9IHRpZF90b190YmxvY2sodGlkKTsKKwlzdHJ1Y3QgamZzX2xvZyAqbG9nOworCisJamZzX2luZm8oInR4RW5kOiB0aWQgPSAlZCIsIHRpZCk7CisJVFhOX0xPQ0soKTsKKworCS8qCisJICogd2FrZXVwIHRyYW5zYWN0aW9ucyB3YWl0aW5nIG9uIHRoZSBwYWdlIGxvY2tlZAorCSAqIGJ5IHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uCisJICovCisJVFhOX1dBS0VVUCgmdGJsay0+d2FpdG9yKTsKKworCWxvZyA9IEpGU19TQkkodGJsay0+c2IpLT5sb2c7CisKKwkvKgorCSAqIExhenkgY29tbWl0IHRocmVhZCBjYW4ndCBmcmVlIHRoaXMgZ3V5IHVudGlsIHdlIG1hcmsgaXQgVU5MT0NLRUQsCisJICogb3RoZXJ3aXNlLCB3ZSB3b3VsZCBiZSBsZWZ0IHdpdGggYSB0cmFuc2FjdGlvbiB0aGF0IG1heSBoYXZlIGJlZW4KKwkgKiByZXVzZWQuCisJICoKKwkgKiBMYXp5IGNvbW1pdCB0aHJlYWQgd2lsbCB0dXJuIG9mZiB0YmxrR0NfTEFaWSBiZWZvcmUgY2FsbGluZyB0aGlzCisJICogcm91dGluZS4KKwkgKi8KKwlpZiAodGJsay0+ZmxhZyAmIHRibGtHQ19MQVpZKSB7CisJCWpmc19pbmZvKCJ0eEVuZCBjYWxsZWQgdy9sYXp5IHRpZDogJWQsIHRibGsgPSAweCVwIiwgdGlkLCB0YmxrKTsKKwkJVFhOX1VOTE9DSygpOworCisJCXNwaW5fbG9ja19pcnEoJmxvZy0+Z2Nsb2NrKTsJLy8gTE9HR0NfTE9DSworCQl0YmxrLT5mbGFnIHw9IHRibGtHQ19VTkxPQ0tFRDsKKwkJc3Bpbl91bmxvY2tfaXJxKCZsb2ctPmdjbG9jayk7CS8vIExPR0dDX1VOTE9DSworCQlyZXR1cm47CisJfQorCisJamZzX2luZm8oInR4RW5kOiB0aWQ6ICVkLCB0YmxrID0gMHglcCIsIHRpZCwgdGJsayk7CisKKwlhc3NlcnQodGJsay0+bmV4dCA9PSAwKTsKKworCS8qCisJICogaW5zZXJ0IHRibG9jayBiYWNrIG9uIGZyZWVsaXN0CisJICovCisJdGJsay0+bmV4dCA9IFR4QW5jaG9yLmZyZWV0aWQ7CisJVHhBbmNob3IuZnJlZXRpZCA9IHRpZDsKKworCS8qCisJICogbWFyayB0aGUgdGJsb2NrIG5vdCBhY3RpdmUKKwkgKi8KKwlpZiAoLS1sb2ctPmFjdGl2ZSA9PSAwKSB7CisJCWNsZWFyX2JpdChsb2dfRkxVU0gsICZsb2ctPmZsYWcpOworCisJCS8qCisJCSAqIHN5bmNocm9uaXplIHdpdGggbG9nc3luYyBiYXJyaWVyCisJCSAqLworCQlpZiAodGVzdF9iaXQobG9nX1NZTkNCQVJSSUVSLCAmbG9nLT5mbGFnKSkgeworCQkJLyogZm9yd2FyZCBsb2cgc3luY3B0ICovCisJCQkvKiBsbVN5bmMobG9nKTsgKi8KKworCQkJamZzX2luZm8oImxvZyBiYXJyaWVyIG9mZjogMHgleCIsIGxvZy0+bHNuKTsKKworCQkJLyogZW5hYmxlIG5ldyB0cmFuc2FjdGlvbnMgc3RhcnQgKi8KKwkJCWNsZWFyX2JpdChsb2dfU1lOQ0JBUlJJRVIsICZsb2ctPmZsYWcpOworCisJCQkvKiB3YWtldXAgYWxsIHdhaXRvcnMgZm9yIGxvZ3N5bmMgYmFycmllciAqLworCQkJVFhOX1dBS0VVUCgmbG9nLT5zeW5jd2FpdCk7CisJCX0KKwl9CisKKwkvKgorCSAqIHdha2V1cCBhbGwgd2FpdG9ycyBmb3IgYSBmcmVlIHRibG9jaworCSAqLworCVRYTl9XQUtFVVAoJlR4QW5jaG9yLmZyZWV3YWl0KTsKKworCVRYTl9VTkxPQ0soKTsKK30KKworCisvKgorICogICAgICB0eExvY2soKQorICoKKyAqIGZ1bmN0aW9uOiBhY3F1aXJlIGEgdHJhbnNhY3Rpb24gbG9jayBvbiB0aGUgc3BlY2lmaWVkIDxtcD4KKyAqCisgKiBwYXJhbWV0ZXI6CisgKgorICogcmV0dXJuOiAgICAgIHRyYW5zYWN0aW9uIGxvY2sgaWQKKyAqCisgKiBzZXJpYWxpemF0aW9uOgorICovCitzdHJ1Y3QgdGxvY2sgKnR4TG9jayh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBtZXRhcGFnZSAqIG1wLAorCQkgICAgIGludCB0eXBlKQoreworCXN0cnVjdCBqZnNfaW5vZGVfaW5mbyAqamZzX2lwID0gSkZTX0lQKGlwKTsKKwlpbnQgZGlyX3h0cmVlID0gMDsKKwlsaWRfdCBsaWQ7CisJdGlkX3QgeHRpZDsKKwlzdHJ1Y3QgdGxvY2sgKnRsY2s7CisJc3RydWN0IHh0bG9jayAqeHRsY2s7CisJc3RydWN0IGxpbmVsb2NrICpsaW5lbG9jazsKKwl4dHBhZ2VfdCAqcDsKKwlzdHJ1Y3QgdGJsb2NrICp0YmxrOworCisJVFhOX0xPQ0soKTsKKworCWlmIChTX0lTRElSKGlwLT5pX21vZGUpICYmICh0eXBlICYgdGxja1hUUkVFKSAmJgorCSAgICAhKG1wLT54ZmxhZyAmIENPTU1JVF9QQUdFKSkgeworCQkvKgorCQkgKiBEaXJlY3RvcnkgaW5vZGUgaXMgc3BlY2lhbC4gIEl0IGNhbiBoYXZlIGJvdGggYW4geHRyZWUgdGxvY2sKKwkJICogYW5kIGEgZHRyZWUgdGxvY2sgYXNzb2NpYXRlZCB3aXRoIGl0LgorCQkgKi8KKwkJZGlyX3h0cmVlID0gMTsKKwkJbGlkID0gamZzX2lwLT54dGxpZDsKKwl9IGVsc2UKKwkJbGlkID0gbXAtPmxpZDsKKworCS8qIGlzIHBhZ2Ugbm90IGxvY2tlZCBieSBhIHRyYW5zYWN0aW9uID8gKi8KKwlpZiAobGlkID09IDApCisJCWdvdG8gYWxsb2NhdGVMb2NrOworCisJamZzX2luZm8oInR4TG9jazogdGlkOiVkIGlwOjB4JXAgbXA6MHglcCBsaWQ6JWQiLCB0aWQsIGlwLCBtcCwgbGlkKTsKKworCS8qIGlzIHBhZ2UgbG9ja2VkIGJ5IHRoZSByZXF1ZXN0ZXIgdHJhbnNhY3Rpb24gPyAqLworCXRsY2sgPSBsaWRfdG9fdGxvY2sobGlkKTsKKwlpZiAoKHh0aWQgPSB0bGNrLT50aWQpID09IHRpZCkKKwkJZ290byBncmFudExvY2s7CisKKwkvKgorCSAqIGlzIHBhZ2UgbG9ja2VkIGJ5IGFub255bW91cyB0cmFuc2FjdGlvbi9sb2NrID8KKwkgKgorCSAqIChwYWdlIHVwZGF0ZSB3aXRob3V0IHRyYW5zYWN0aW9uIChpLmUuLCBmaWxlIHdyaXRlKSBpcworCSAqIGxvY2tlZCB1bmRlciBhbm9ueW1vdXMgdHJhbnNhY3Rpb24gdGlkID0gMDoKKwkgKiBhbm9ueW1vdXMgdGxvY2tzIG1haW50YWluZWQgb24gYW5vbnltb3VzIHRsb2NrIGxpc3Qgb2YKKwkgKiB0aGUgaW5vZGUgb2YgdGhlIHBhZ2UgYW5kIGF2YWlsYWJsZSB0byBhbGwgYW5vbnltb3VzCisJICogdHJhbnNhY3Rpb25zIHVudGlsIHR4Q29tbWl0KCkgdGltZSBhdCB3aGljaCBwb2ludAorCSAqIHRoZXkgYXJlIHRyYW5zZmVycmVkIHRvIHRoZSB0cmFuc2FjdGlvbiB0bG9jayBsaXN0IG9mCisJICogdGhlIGNvbW1pdGluZyB0cmFuc2FjdGlvbiBvZiB0aGUgaW5vZGUpCisJICovCisJaWYgKHh0aWQgPT0gMCkgeworCQl0bGNrLT50aWQgPSB0aWQ7CisJCXRibGsgPSB0aWRfdG9fdGJsb2NrKHRpZCk7CisJCS8qCisJCSAqIFRoZSBvcmRlciBvZiB0aGUgdGxvY2tzIGluIHRoZSB0cmFuc2FjdGlvbiBpcyBpbXBvcnRhbnQKKwkJICogKGR1cmluZyB0cnVuY2F0ZSwgY2hpbGQgeHRyZWUgcGFnZXMgbXVzdCBiZSBmcmVlZCBiZWZvcmUKKwkJICogcGFyZW50J3MgdGxvY2tzIGNoYW5nZSB0aGUgd29ya2luZyBtYXApLgorCQkgKiBUYWtlIHRsb2NrIG9mZiBhbm9ueW1vdXMgbGlzdCBhbmQgYWRkIHRvIHRhaWwgb2YKKwkJICogdHJhbnNhY3Rpb24gbGlzdAorCQkgKgorCQkgKiBOb3RlOiAgV2UgcmVhbGx5IG5lZWQgdG8gZ2V0IHJpZCBvZiB0aGUgdGlkICYgbGlkIGFuZAorCQkgKiB1c2UgbGlzdF9oZWFkJ3MuICBUaGlzIGNvZGUgaXMgZ2V0dGluZyBVR0xZIQorCQkgKi8KKwkJaWYgKGpmc19pcC0+YXRsaGVhZCA9PSBsaWQpIHsKKwkJCWlmIChqZnNfaXAtPmF0bHRhaWwgPT0gbGlkKSB7CisJCQkJLyogb25seSBhbm9ueW1vdXMgdHhuLgorCQkJCSAqIFJlbW92ZSBmcm9tIGFub25fbGlzdAorCQkJCSAqLworCQkJCWxpc3RfZGVsX2luaXQoJmpmc19pcC0+YW5vbl9pbm9kZV9saXN0KTsKKwkJCX0KKwkJCWpmc19pcC0+YXRsaGVhZCA9IHRsY2stPm5leHQ7CisJCX0gZWxzZSB7CisJCQlsaWRfdCBsYXN0OworCQkJZm9yIChsYXN0ID0gamZzX2lwLT5hdGxoZWFkOworCQkJICAgICBsaWRfdG9fdGxvY2sobGFzdCktPm5leHQgIT0gbGlkOworCQkJICAgICBsYXN0ID0gbGlkX3RvX3Rsb2NrKGxhc3QpLT5uZXh0KSB7CisJCQkJYXNzZXJ0KGxhc3QpOworCQkJfQorCQkJbGlkX3RvX3Rsb2NrKGxhc3QpLT5uZXh0ID0gdGxjay0+bmV4dDsKKwkJCWlmIChqZnNfaXAtPmF0bHRhaWwgPT0gbGlkKQorCQkJCWpmc19pcC0+YXRsdGFpbCA9IGxhc3Q7CisJCX0KKworCQkvKiBpbnNlcnQgdGhlIHRsb2NrIGF0IHRhaWwgb2YgdHJhbnNhY3Rpb24gdGxvY2sgbGlzdCAqLworCisJCWlmICh0YmxrLT5uZXh0KQorCQkJbGlkX3RvX3Rsb2NrKHRibGstPmxhc3QpLT5uZXh0ID0gbGlkOworCQllbHNlCisJCQl0YmxrLT5uZXh0ID0gbGlkOworCQl0bGNrLT5uZXh0ID0gMDsKKwkJdGJsay0+bGFzdCA9IGxpZDsKKworCQlnb3RvIGdyYW50TG9jazsKKwl9CisKKwlnb3RvIHdhaXRMb2NrOworCisJLyoKKwkgKiBhbGxvY2F0ZSBhIHRsb2NrCisJICovCisgICAgICBhbGxvY2F0ZUxvY2s6CisJbGlkID0gdHhMb2NrQWxsb2MoKTsKKwl0bGNrID0gbGlkX3RvX3Rsb2NrKGxpZCk7CisKKwkvKgorCSAqIGluaXRpYWxpemUgdGxvY2sKKwkgKi8KKwl0bGNrLT50aWQgPSB0aWQ7CisKKwkvKiBtYXJrIHRsb2NrIGZvciBtZXRhLWRhdGEgcGFnZSAqLworCWlmIChtcC0+eGZsYWcgJiBDT01NSVRfUEFHRSkgeworCisJCXRsY2stPmZsYWcgPSB0bGNrUEFHRUxPQ0s7CisKKwkJLyogbWFyayB0aGUgcGFnZSBkaXJ0eSBhbmQgbm9ob21lb2sgKi8KKwkJbWFya19tZXRhcGFnZV9kaXJ0eShtcCk7CisJCWF0b21pY19pbmMoJm1wLT5ub2hvbWVvayk7CisKKwkJamZzX2luZm8oImxvY2tpbmcgbXAgPSAweCVwLCBub2hvbWVvayA9ICVkIHRpZCA9ICVkIHRsY2sgPSAweCVwIiwKKwkJCSBtcCwgYXRvbWljX3JlYWQoJm1wLT5ub2hvbWVvayksIHRpZCwgdGxjayk7CisKKwkJLyogaWYgYW5vbnltb3VzIHRyYW5zYWN0aW9uLCBhbmQgYnVmZmVyIGlzIG9uIHRoZSBncm91cAorCQkgKiBjb21taXQgc3luY2xpc3QsIG1hcmsgaW5vZGUgdG8gc2hvdyB0aGlzLiAgVGhpcyB3aWxsCisJCSAqIHByZXZlbnQgdGhlIGJ1ZmZlciBmcm9tIGJlaW5nIG1hcmtlZCBub2hvbWVvayBmb3IgdG9vCisJCSAqIGxvbmcgYSB0aW1lLgorCQkgKi8KKwkJaWYgKCh0aWQgPT0gMCkgJiYgbXAtPmxzbikKKwkJCXNldF9jZmxhZyhDT01NSVRfU3luY2xpc3QsIGlwKTsKKwl9CisJLyogbWFyayB0bG9jayBmb3IgaW4tbWVtb3J5IGlub2RlICovCisJZWxzZQorCQl0bGNrLT5mbGFnID0gdGxja0lOT0RFTE9DSzsKKworCXRsY2stPnR5cGUgPSAwOworCisJLyogYmluZCB0aGUgdGxvY2sgYW5kIHRoZSBwYWdlICovCisJdGxjay0+aXAgPSBpcDsKKwl0bGNrLT5tcCA9IG1wOworCWlmIChkaXJfeHRyZWUpCisJCWpmc19pcC0+eHRsaWQgPSBsaWQ7CisJZWxzZQorCQltcC0+bGlkID0gbGlkOworCisJLyoKKwkgKiBlbnF1ZXVlIHRyYW5zYWN0aW9uIGxvY2sgdG8gdHJhbnNhY3Rpb24vaW5vZGUKKwkgKi8KKwkvKiBpbnNlcnQgdGhlIHRsb2NrIGF0IHRhaWwgb2YgdHJhbnNhY3Rpb24gdGxvY2sgbGlzdCAqLworCWlmICh0aWQpIHsKKwkJdGJsayA9IHRpZF90b190YmxvY2sodGlkKTsKKwkJaWYgKHRibGstPm5leHQpCisJCQlsaWRfdG9fdGxvY2sodGJsay0+bGFzdCktPm5leHQgPSBsaWQ7CisJCWVsc2UKKwkJCXRibGstPm5leHQgPSBsaWQ7CisJCXRsY2stPm5leHQgPSAwOworCQl0YmxrLT5sYXN0ID0gbGlkOworCX0KKwkvKiBhbm9ueW1vdXMgdHJhbnNhY3Rpb246CisJICogaW5zZXJ0IHRoZSB0bG9jayBhdCBoZWFkIG9mIGlub2RlIGFub255bW91cyB0bG9jayBsaXN0CisJICovCisJZWxzZSB7CisJCXRsY2stPm5leHQgPSBqZnNfaXAtPmF0bGhlYWQ7CisJCWpmc19pcC0+YXRsaGVhZCA9IGxpZDsKKwkJaWYgKHRsY2stPm5leHQgPT0gMCkgeworCQkJLyogVGhpcyBpbm9kZSdzIGZpcnN0IGFub255bW91cyB0cmFuc2FjdGlvbiAqLworCQkJamZzX2lwLT5hdGx0YWlsID0gbGlkOworCQkJbGlzdF9hZGRfdGFpbCgmamZzX2lwLT5hbm9uX2lub2RlX2xpc3QsCisJCQkJICAgICAgJlR4QW5jaG9yLmFub25fbGlzdCk7CisJCX0KKwl9CisKKwkvKiBpbml0aWFsaXplIHR5cGUgZGVwZW5kZW50IGFyZWEgZm9yIGxpbmVsb2NrICovCisJbGluZWxvY2sgPSAoc3RydWN0IGxpbmVsb2NrICopICYgdGxjay0+bG9jazsKKwlsaW5lbG9jay0+bmV4dCA9IDA7CisJbGluZWxvY2stPmZsYWcgPSB0bGNrTElORUxPQ0s7CisJbGluZWxvY2stPm1heGNudCA9IFRMT0NLU0hPUlQ7CisJbGluZWxvY2stPmluZGV4ID0gMDsKKworCXN3aXRjaCAodHlwZSAmIHRsY2tUWVBFKSB7CisJY2FzZSB0bGNrRFRSRUU6CisJCWxpbmVsb2NrLT5sMmxpbmVzaXplID0gTDJEVFNMT1RTSVpFOworCQlicmVhazsKKworCWNhc2UgdGxja1hUUkVFOgorCQlsaW5lbG9jay0+bDJsaW5lc2l6ZSA9IEwyWFRTTE9UU0laRTsKKworCQl4dGxjayA9IChzdHJ1Y3QgeHRsb2NrICopIGxpbmVsb2NrOworCQl4dGxjay0+aGVhZGVyLm9mZnNldCA9IDA7CisJCXh0bGNrLT5oZWFkZXIubGVuZ3RoID0gMjsKKworCQlpZiAodHlwZSAmIHRsY2tORVcpIHsKKwkJCXh0bGNrLT5sd20ub2Zmc2V0ID0gWFRFTlRSWVNUQVJUOworCQl9IGVsc2UgeworCQkJaWYgKG1wLT54ZmxhZyAmIENPTU1JVF9QQUdFKQorCQkJCXAgPSAoeHRwYWdlX3QgKikgbXAtPmRhdGE7CisJCQllbHNlCisJCQkJcCA9ICZqZnNfaXAtPmlfeHRyb290OworCQkJeHRsY2stPmx3bS5vZmZzZXQgPQorCQkJICAgIGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpOworCQl9CisJCXh0bGNrLT5sd20ubGVuZ3RoID0gMDsJLyogISAqLworCQl4dGxjay0+dHdtLm9mZnNldCA9IDA7CisJCXh0bGNrLT5od20ub2Zmc2V0ID0gMDsKKworCQl4dGxjay0+aW5kZXggPSAyOworCQlicmVhazsKKworCWNhc2UgdGxja0lOT0RFOgorCQlsaW5lbG9jay0+bDJsaW5lc2l6ZSA9IEwySU5PREVTTE9UU0laRTsKKwkJYnJlYWs7CisKKwljYXNlIHRsY2tEQVRBOgorCQlsaW5lbG9jay0+bDJsaW5lc2l6ZSA9IEwyREFUQVNMT1RTSVpFOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWpmc19lcnIoIlVGTyB0bG9jazoweCVwIiwgdGxjayk7CisJfQorCisJLyoKKwkgKiB1cGRhdGUgdGxvY2sgdmVjdG9yCisJICovCisgICAgICBncmFudExvY2s6CisJdGxjay0+dHlwZSB8PSB0eXBlOworCisJVFhOX1VOTE9DSygpOworCisJcmV0dXJuIHRsY2s7CisKKwkvKgorCSAqIHBhZ2UgaXMgYmVpbmcgbG9ja2VkIGJ5IGFub3RoZXIgdHJhbnNhY3Rpb246CisJICovCisgICAgICB3YWl0TG9jazoKKwkvKiBPbmx5IGxvY2tzIG9uIGlwaW1hcCBvciBpcGFpbWFwIHNob3VsZCByZWFjaCBoZXJlICovCisJLyogYXNzZXJ0KGpmc19pcC0+ZmlsZXNldCA9PSBBR0dSRUdBVEVfSSk7ICovCisJaWYgKGpmc19pcC0+ZmlsZXNldCAhPSBBR0dSRUdBVEVfSSkgeworCQlqZnNfZXJyKCJ0eExvY2s6IHRyeWluZyB0byBsb2NrIGxvY2tlZCBwYWdlISIpOworCQlkdW1wX21lbSgiaXAiLCBpcCwgc2l6ZW9mKHN0cnVjdCBpbm9kZSkpOworCQlkdW1wX21lbSgibXAiLCBtcCwgc2l6ZW9mKHN0cnVjdCBtZXRhcGFnZSkpOworCQlkdW1wX21lbSgiTG9ja2VyJ3MgdGJsayIsIHRpZF90b190YmxvY2sodGlkKSwKKwkJCSBzaXplb2Yoc3RydWN0IHRibG9jaykpOworCQlkdW1wX21lbSgiVGxvY2siLCB0bGNrLCBzaXplb2Yoc3RydWN0IHRsb2NrKSk7CisJCUJVRygpOworCX0KKwlJTkNSRU1FTlQoc3RhdHR4LndhaXRsb2NrKTsJLyogc3RhdGlzdGljcyAqLworCXJlbGVhc2VfbWV0YXBhZ2UobXApOworCisJamZzX2luZm8oInR4TG9jazogaW4gd2FpdExvY2ssIHRpZCA9ICVkLCB4dGlkID0gJWQsIGxpZCA9ICVkIiwKKwkJIHRpZCwgeHRpZCwgbGlkKTsKKwlUWE5fU0xFRVBfRFJPUF9MT0NLKCZ0aWRfdG9fdGJsb2NrKHh0aWQpLT53YWl0b3IpOworCWpmc19pbmZvKCJ0eExvY2s6IGF3YWtlbmVkICAgICB0aWQgPSAlZCwgbGlkID0gJWQiLCB0aWQsIGxpZCk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworCisvKgorICogTkFNRTogICAgICAgIHR4UmVsZWFzZSgpCisgKgorICogRlVOQ1RJT046ICAgIFJlbGVhc2UgYnVmZmVycyBhc3NvY2lhdGVkIHdpdGggdHJhbnNhY3Rpb24gbG9ja3MsIGJ1dCBkb24ndAorICoJCW1hcmsgaG9tZW9rIHlldC4gIFRoZSBhbGxvd3Mgb3RoZXIgdHJhbnNhY3Rpb25zIHRvIG1vZGlmeQorICoJCWJ1ZmZlcnMsIGJ1dCB3b24ndCBsZXQgdGhlbSBnbyB0byBkaXNrIHVudGlsIGNvbW1pdCByZWNvcmQKKyAqCQlhY3R1YWxseSBnZXRzIHdyaXR0ZW4uCisgKgorICogUEFSQU1FVEVSOgorICogICAgICAgICAgICAgIHRibGsgICAgLQorICoKKyAqIFJFVFVSTjogICAgICBFcnJvcnMgZnJvbSBzdWJyb3V0aW5lcy4KKyAqLworc3RhdGljIHZvaWQgdHhSZWxlYXNlKHN0cnVjdCB0YmxvY2sgKiB0YmxrKQoreworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJbGlkX3QgbGlkOworCXN0cnVjdCB0bG9jayAqdGxjazsKKworCVRYTl9MT0NLKCk7CisKKwlmb3IgKGxpZCA9IHRibGstPm5leHQ7IGxpZDsgbGlkID0gdGxjay0+bmV4dCkgeworCQl0bGNrID0gbGlkX3RvX3Rsb2NrKGxpZCk7CisJCWlmICgobXAgPSB0bGNrLT5tcCkgIT0gTlVMTCAmJgorCQkgICAgKHRsY2stPnR5cGUgJiB0bGNrQlRST09UKSA9PSAwKSB7CisJCQlhc3NlcnQobXAtPnhmbGFnICYgQ09NTUlUX1BBR0UpOworCQkJbXAtPmxpZCA9IDA7CisJCX0KKwl9CisKKwkvKgorCSAqIHdha2V1cCB0cmFuc2FjdGlvbnMgd2FpdGluZyBvbiBhIHBhZ2UgbG9ja2VkCisJICogYnkgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24KKwkgKi8KKwlUWE5fV0FLRVVQKCZ0YmxrLT53YWl0b3IpOworCisJVFhOX1VOTE9DSygpOworfQorCisKKy8qCisgKiBOQU1FOiAgICAgICAgdHhVbmxvY2soKQorICoKKyAqIEZVTkNUSU9OOiAgICBJbml0aWF0ZXMgcGFnZW91dCBvZiBwYWdlcyBtb2RpZmllZCBieSB0aWQgaW4gam91cm5hbGxlZAorICogICAgICAgICAgICAgIG9iamVjdHMgYW5kIGZyZWVzIHRoZWlyIGxvY2t3b3Jkcy4KKyAqLworc3RhdGljIHZvaWQgdHhVbmxvY2soc3RydWN0IHRibG9jayAqIHRibGspCit7CisJc3RydWN0IHRsb2NrICp0bGNrOworCXN0cnVjdCBsaW5lbG9jayAqbGluZWxvY2s7CisJbGlkX3QgbGlkLCBuZXh0LCBsbGlkLCBrOworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJc3RydWN0IGpmc19sb2cgKmxvZzsKKwlpbnQgZGlmZnQsIGRpZmZwOworCisJamZzX2luZm8oInR4VW5sb2NrOiB0YmxrID0gMHglcCIsIHRibGspOworCWxvZyA9IEpGU19TQkkodGJsay0+c2IpLT5sb2c7CisKKwkvKgorCSAqIG1hcmsgcGFnZSB1bmRlciB0bG9jayBob21lb2sgKGl0cyBsb2cgaGFzIGJlZW4gd3JpdHRlbik6CisJICovCisJZm9yIChsaWQgPSB0YmxrLT5uZXh0OyBsaWQ7IGxpZCA9IG5leHQpIHsKKwkJdGxjayA9IGxpZF90b190bG9jayhsaWQpOworCQluZXh0ID0gdGxjay0+bmV4dDsKKworCQlqZnNfaW5mbygidW5sb2NraW5nIGxpZCA9ICVkLCB0bGNrID0gMHglcCIsIGxpZCwgdGxjayk7CisKKwkJLyogdW5iaW5kIHBhZ2UgZnJvbSB0bG9jayAqLworCQlpZiAoKG1wID0gdGxjay0+bXApICE9IE5VTEwgJiYKKwkJICAgICh0bGNrLT50eXBlICYgdGxja0JUUk9PVCkgPT0gMCkgeworCQkJYXNzZXJ0KG1wLT54ZmxhZyAmIENPTU1JVF9QQUdFKTsKKworCQkJLyogaG9sZCBidWZmZXIKKwkJCSAqCisJCQkgKiBJdCdzIHBvc3NpYmxlIHRoYXQgc29tZW9uZSBlbHNlIGhhcyB0aGUgbWV0YXBhZ2UuCisJCQkgKiBUaGUgb25seSB0aGluZ3Mgd2VyZSBjaGFuZ2luZyBhcmUgbm9ob21lb2ssIHdoaWNoCisJCQkgKiBpcyBoYW5kbGVkIGF0b21pY2FsbHksIGFuZCBjbHNuIHdoaWNoIGlzIHByb3RlY3RlZAorCQkJICogYnkgdGhlIExPR1NZTkNfTE9DSy4KKwkJCSAqLworCQkJaG9sZF9tZXRhcGFnZShtcCwgMSk7CisKKwkJCWFzc2VydChhdG9taWNfcmVhZCgmbXAtPm5vaG9tZW9rKSA+IDApOworCQkJYXRvbWljX2RlYygmbXAtPm5vaG9tZW9rKTsKKworCQkJLyogaW5oZXJpdCB5b3VuZ2VyL2xhcmdlciBjbHNuICovCisJCQlMT0dTWU5DX0xPQ0sobG9nKTsKKwkJCWlmIChtcC0+Y2xzbikgeworCQkJCWxvZ2RpZmYoZGlmZnQsIHRibGstPmNsc24sIGxvZyk7CisJCQkJbG9nZGlmZihkaWZmcCwgbXAtPmNsc24sIGxvZyk7CisJCQkJaWYgKGRpZmZ0ID4gZGlmZnApCisJCQkJCW1wLT5jbHNuID0gdGJsay0+Y2xzbjsKKwkJCX0gZWxzZQorCQkJCW1wLT5jbHNuID0gdGJsay0+Y2xzbjsKKwkJCUxPR1NZTkNfVU5MT0NLKGxvZyk7CisKKwkJCWFzc2VydCghKHRsY2stPmZsYWcgJiB0bGNrRlJFRVBBR0UpKTsKKworCQkJaWYgKHRsY2stPmZsYWcgJiB0bGNrV1JJVEVQQUdFKSB7CisJCQkJd3JpdGVfbWV0YXBhZ2UobXApOworCQkJfSBlbHNlIHsKKwkJCQkvKiByZWxlYXNlIHBhZ2Ugd2hpY2ggaGFzIGJlZW4gZm9yY2VkICovCisJCQkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisJCQl9CisJCX0KKworCQkvKiBpbnNlcnQgdGxvY2ssIGFuZCBsaW5lbG9jayhzKSBvZiB0aGUgdGxvY2sgaWYgYW55LAorCQkgKiBhdCBoZWFkIG9mIGZyZWVsaXN0CisJCSAqLworCQlUWE5fTE9DSygpOworCisJCWxsaWQgPSAoKHN0cnVjdCBsaW5lbG9jayAqKSAmIHRsY2stPmxvY2spLT5uZXh0OworCQl3aGlsZSAobGxpZCkgeworCQkJbGluZWxvY2sgPSAoc3RydWN0IGxpbmVsb2NrICopIGxpZF90b190bG9jayhsbGlkKTsKKwkJCWsgPSBsaW5lbG9jay0+bmV4dDsKKwkJCXR4TG9ja0ZyZWUobGxpZCk7CisJCQlsbGlkID0gazsKKwkJfQorCQl0eExvY2tGcmVlKGxpZCk7CisKKwkJVFhOX1VOTE9DSygpOworCX0KKwl0YmxrLT5uZXh0ID0gdGJsay0+bGFzdCA9IDA7CisKKwkvKgorCSAqIHJlbW92ZSB0YmxvY2sgZnJvbSBsb2dzeW5jbGlzdAorCSAqIChhbGxvY2F0aW9uIG1hcCBwYWdlcyBpbmhlcml0ZWQgbHNuIG9mIHRibGsgYW5kCisJICogaGFzIGJlZW4gaW5zZXJ0ZWQgaW4gbG9nc3luYyBsaXN0IGF0IHR4VXBkYXRlTWFwKCkpCisJICovCisJaWYgKHRibGstPmxzbikgeworCQlMT0dTWU5DX0xPQ0sobG9nKTsKKwkJbG9nLT5jb3VudC0tOworCQlsaXN0X2RlbCgmdGJsay0+c3luY2xpc3QpOworCQlMT0dTWU5DX1VOTE9DSyhsb2cpOworCX0KK30KKworCisvKgorICogICAgICB0eE1hcGxvY2soKQorICoKKyAqIGZ1bmN0aW9uOiBhbGxvY2F0ZSBhIHRyYW5zYWN0aW9uIGxvY2sgZm9yIGZyZWVkIHBhZ2UvZW50cnk7CisgKiAgICAgIGZvciBmcmVlZCBwYWdlLCBtYXBsb2NrIGlzIHVzZWQgYXMgeHRsb2NrL2R0bG9jayB0eXBlOworICovCitzdHJ1Y3QgdGxvY2sgKnR4TWFwbG9jayh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsIGludCB0eXBlKQoreworCXN0cnVjdCBqZnNfaW5vZGVfaW5mbyAqamZzX2lwID0gSkZTX0lQKGlwKTsKKwlsaWRfdCBsaWQ7CisJc3RydWN0IHRibG9jayAqdGJsazsKKwlzdHJ1Y3QgdGxvY2sgKnRsY2s7CisJc3RydWN0IG1hcGxvY2sgKm1hcGxvY2s7CisKKwlUWE5fTE9DSygpOworCisJLyoKKwkgKiBhbGxvY2F0ZSBhIHRsb2NrCisJICovCisJbGlkID0gdHhMb2NrQWxsb2MoKTsKKwl0bGNrID0gbGlkX3RvX3Rsb2NrKGxpZCk7CisKKwkvKgorCSAqIGluaXRpYWxpemUgdGxvY2sKKwkgKi8KKwl0bGNrLT50aWQgPSB0aWQ7CisKKwkvKiBiaW5kIHRoZSB0bG9jayBhbmQgdGhlIG9iamVjdCAqLworCXRsY2stPmZsYWcgPSB0bGNrSU5PREVMT0NLOworCXRsY2stPmlwID0gaXA7CisJdGxjay0+bXAgPSBOVUxMOworCisJdGxjay0+dHlwZSA9IHR5cGU7CisKKwkvKgorCSAqIGVucXVldWUgdHJhbnNhY3Rpb24gbG9jayB0byB0cmFuc2FjdGlvbi9pbm9kZQorCSAqLworCS8qIGluc2VydCB0aGUgdGxvY2sgYXQgdGFpbCBvZiB0cmFuc2FjdGlvbiB0bG9jayBsaXN0ICovCisJaWYgKHRpZCkgeworCQl0YmxrID0gdGlkX3RvX3RibG9jayh0aWQpOworCQlpZiAodGJsay0+bmV4dCkKKwkJCWxpZF90b190bG9jayh0YmxrLT5sYXN0KS0+bmV4dCA9IGxpZDsKKwkJZWxzZQorCQkJdGJsay0+bmV4dCA9IGxpZDsKKwkJdGxjay0+bmV4dCA9IDA7CisJCXRibGstPmxhc3QgPSBsaWQ7CisJfQorCS8qIGFub255bW91cyB0cmFuc2FjdGlvbjoKKwkgKiBpbnNlcnQgdGhlIHRsb2NrIGF0IGhlYWQgb2YgaW5vZGUgYW5vbnltb3VzIHRsb2NrIGxpc3QKKwkgKi8KKwllbHNlIHsKKwkJdGxjay0+bmV4dCA9IGpmc19pcC0+YXRsaGVhZDsKKwkJamZzX2lwLT5hdGxoZWFkID0gbGlkOworCQlpZiAodGxjay0+bmV4dCA9PSAwKSB7CisJCQkvKiBUaGlzIGlub2RlJ3MgZmlyc3QgYW5vbnltb3VzIHRyYW5zYWN0aW9uICovCisJCQlqZnNfaXAtPmF0bHRhaWwgPSBsaWQ7CisJCQlsaXN0X2FkZF90YWlsKCZqZnNfaXAtPmFub25faW5vZGVfbGlzdCwKKwkJCQkgICAgICAmVHhBbmNob3IuYW5vbl9saXN0KTsKKwkJfQorCX0KKworCVRYTl9VTkxPQ0soKTsKKworCS8qIGluaXRpYWxpemUgdHlwZSBkZXBlbmRlbnQgYXJlYSBmb3IgbWFwbG9jayAqLworCW1hcGxvY2sgPSAoc3RydWN0IG1hcGxvY2sgKikgJiB0bGNrLT5sb2NrOworCW1hcGxvY2stPm5leHQgPSAwOworCW1hcGxvY2stPm1heGNudCA9IDA7CisJbWFwbG9jay0+aW5kZXggPSAwOworCisJcmV0dXJuIHRsY2s7Cit9CisKKworLyoKKyAqICAgICAgdHhMaW5lbG9jaygpCisgKgorICogZnVuY3Rpb246IGFsbG9jYXRlIGEgdHJhbnNhY3Rpb24gbG9jayBmb3IgbG9nIHZlY3RvciBsaXN0CisgKi8KK3N0cnVjdCBsaW5lbG9jayAqdHhMaW5lbG9jayhzdHJ1Y3QgbGluZWxvY2sgKiB0bG9jaykKK3sKKwlsaWRfdCBsaWQ7CisJc3RydWN0IHRsb2NrICp0bGNrOworCXN0cnVjdCBsaW5lbG9jayAqbGluZWxvY2s7CisKKwlUWE5fTE9DSygpOworCisJLyogYWxsb2NhdGUgYSBUeExvY2sgc3RydWN0dXJlICovCisJbGlkID0gdHhMb2NrQWxsb2MoKTsKKwl0bGNrID0gbGlkX3RvX3Rsb2NrKGxpZCk7CisKKwlUWE5fVU5MT0NLKCk7CisKKwkvKiBpbml0aWFsaXplIGxpbmVsb2NrICovCisJbGluZWxvY2sgPSAoc3RydWN0IGxpbmVsb2NrICopIHRsY2s7CisJbGluZWxvY2stPm5leHQgPSAwOworCWxpbmVsb2NrLT5mbGFnID0gdGxja0xJTkVMT0NLOworCWxpbmVsb2NrLT5tYXhjbnQgPSBUTE9DS0xPTkc7CisJbGluZWxvY2stPmluZGV4ID0gMDsKKworCS8qIGFwcGVuZCBsaW5lbG9jayBhZnRlciB0bG9jayAqLworCWxpbmVsb2NrLT5uZXh0ID0gdGxvY2stPm5leHQ7CisJdGxvY2stPm5leHQgPSBsaWQ7CisKKwlyZXR1cm4gbGluZWxvY2s7Cit9CisKKworCisvKgorICogICAgICAgICAgICAgIHRyYW5zYWN0aW9uIGNvbW1pdCBtYW5hZ2VtZW50CisgKiAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisvKgorICogTkFNRTogICAgICAgIHR4Q29tbWl0KCkKKyAqCisgKiBGVU5DVElPTjogICAgY29tbWl0IHRoZSBjaGFuZ2VzIHRvIHRoZSBvYmplY3RzIHNwZWNpZmllZCBpbgorICogICAgICAgICAgICAgIGNsaXN0LiAgRm9yIGpvdXJuYWxsZWQgc2VnbWVudHMgb25seSB0aGUKKyAqICAgICAgICAgICAgICBjaGFuZ2VzIG9mIHRoZSBjYWxsZXIgYXJlIGNvbW1pdHRlZCwgaWUgYnkgdGlkLgorICogICAgICAgICAgICAgIGZvciBub24tam91cm5hbGxlZCBzZWdtZW50cyB0aGUgZGF0YSBhcmUgZmx1c2hlZCB0bworICogICAgICAgICAgICAgIGRpc2sgYW5kIHRoZW4gdGhlIGNoYW5nZSB0byB0aGUgZGlzayBpbm9kZSBhbmQgaW5kaXJlY3QKKyAqICAgICAgICAgICAgICBibG9ja3MgY29tbWl0dGVkIChzbyBibG9ja3MgbmV3bHkgYWxsb2NhdGVkIHRvIHRoZQorICogICAgICAgICAgICAgIHNlZ21lbnQgd2lsbCBiZSBtYWRlIGEgcGFydCBvZiB0aGUgc2VnbWVudCBhdG9taWNhbGx5KS4KKyAqCisgKiAgICAgICAgICAgICAgYWxsIG9mIHRoZSBzZWdtZW50cyBzcGVjaWZpZWQgaW4gY2xpc3QgbXVzdCBiZSBpbgorICogICAgICAgICAgICAgIG9uZSBmaWxlIHN5c3RlbS4gbm8gbW9yZSB0aGFuIDYgc2VnbWVudHMgYXJlIG5lZWRlZAorICogICAgICAgICAgICAgIHRvIGhhbmRsZSBhbGwgdW5peCBzdmNzLgorICoKKyAqICAgICAgICAgICAgICBpZiB0aGUgaV9ubGluayBmaWVsZCAoaS5lLiBkaXNrIGlub2RlIGxpbmsgY291bnQpCisgKiAgICAgICAgICAgICAgaXMgemVybywgYW5kIHRoZSB0eXBlIG9mIGlub2RlIGlzIGEgcmVndWxhciBmaWxlIG9yCisgKiAgICAgICAgICAgICAgZGlyZWN0b3J5LCBvciBzeW1ib2xpYyBsaW5rICwgdGhlIGlub2RlIGlzIHRydW5jYXRlZAorICogICAgICAgICAgICAgIHRvIHplcm8gbGVuZ3RoLiB0aGUgdHJ1bmNhdGlvbiBpcyBjb21taXR0ZWQgYnV0IHRoZQorICogICAgICAgICAgICAgIFZNIHJlc291cmNlcyBhcmUgdW5hZmZlY3RlZCB1bnRpbCBpdCBpcyBjbG9zZWQgKHNlZQorICogICAgICAgICAgICAgIGlwdXQgYW5kIGljbG9zZSkuCisgKgorICogUEFSQU1FVEVSOgorICoKKyAqIFJFVFVSTjoKKyAqCisgKiBzZXJpYWxpemF0aW9uOgorICogICAgICAgICAgICAgIG9uIGVudHJ5IHRoZSBpbm9kZSBsb2NrIG9uIGVhY2ggc2VnbWVudCBpcyBhc3N1bWVkCisgKiAgICAgICAgICAgICAgdG8gYmUgaGVsZC4KKyAqCisgKiBpL28gZXJyb3I6CisgKi8KK2ludCB0eENvbW1pdCh0aWRfdCB0aWQsCQkvKiB0cmFuc2FjdGlvbiBpZGVudGlmaWVyICovCisJICAgICBpbnQgbmlwLAkJLyogbnVtYmVyIG9mIGlub2RlcyB0byBjb21taXQgKi8KKwkgICAgIHN0cnVjdCBpbm9kZSAqKmlwbGlzdCwJLyogbGlzdCBvZiBpbm9kZSB0byBjb21taXQgKi8KKwkgICAgIGludCBmbGFnKQoreworCWludCByYyA9IDA7CisJc3RydWN0IGNvbW1pdCBjZDsKKwlzdHJ1Y3QgamZzX2xvZyAqbG9nOworCXN0cnVjdCB0YmxvY2sgKnRibGs7CisJc3RydWN0IGxyZCAqbHJkOworCWludCBsc247CisJc3RydWN0IGlub2RlICppcDsKKwlzdHJ1Y3QgamZzX2lub2RlX2luZm8gKmpmc19pcDsKKwlpbnQgaywgbjsKKwlpbm9fdCB0b3A7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKworCWpmc19pbmZvKCJ0eENvbW1pdCwgdGlkID0gJWQsIGZsYWcgPSAlZCIsIHRpZCwgZmxhZyk7CisJLyogaXMgcmVhZC1vbmx5IGZpbGUgc3lzdGVtID8gKi8KKwlpZiAoaXNSZWFkT25seShpcGxpc3RbMF0pKSB7CisJCXJjID0gLUVST0ZTOworCQlnb3RvIFRoZUVuZDsKKwl9CisKKwlzYiA9IGNkLnNiID0gaXBsaXN0WzBdLT5pX3NiOworCWNkLnRpZCA9IHRpZDsKKworCWlmICh0aWQgPT0gMCkKKwkJdGlkID0gdHhCZWdpbihzYiwgMCk7CisJdGJsayA9IHRpZF90b190YmxvY2sodGlkKTsKKworCS8qCisJICogaW5pdGlhbGl6ZSBjb21taXQgc3RydWN0dXJlCisJICovCisJbG9nID0gSkZTX1NCSShzYiktPmxvZzsKKwljZC5sb2cgPSBsb2c7CisKKwkvKiBpbml0aWFsaXplIGxvZyByZWNvcmQgZGVzY3JpcHRvciBpbiBjb21taXQgKi8KKwlscmQgPSAmY2QubHJkOworCWxyZC0+bG9ndGlkID0gY3B1X3RvX2xlMzIodGJsay0+bG9ndGlkKTsKKwlscmQtPmJhY2tjaGFpbiA9IDA7CisKKwl0YmxrLT54ZmxhZyB8PSBmbGFnOworCisJaWYgKChmbGFnICYgKENPTU1JVF9GT1JDRSB8IENPTU1JVF9TWU5DKSkgPT0gMCkKKwkJdGJsay0+eGZsYWcgfD0gQ09NTUlUX0xBWlk7CisJLyoKKwkgKiAgICAgIHByZXBhcmUgbm9uLWpvdXJuYWxlZCBvYmplY3RzIGZvciBjb21taXQKKwkgKgorCSAqIGZsdXNoIGRhdGEgcGFnZXMgb2Ygbm9uLWpvdXJuYWxlZCBmaWxlCisJICogdG8gcHJldmVudCB0aGUgZmlsZSBnZXR0aW5nIG5vbi1pbml0aWFsaXplZCBkaXNrIGJsb2NrcworCSAqIGluIGNhc2Ugb2YgY3Jhc2guCisJICogKG5ldyBibG9ja3MgLSApCisJICovCisJY2QuaXBsaXN0ID0gaXBsaXN0OworCWNkLm5pcCA9IG5pcDsKKworCS8qCisJICogICAgICBhY3F1aXJlIHRyYW5zYWN0aW9uIGxvY2sgb24gKG9uLWRpc2spIGlub2RlcworCSAqCisJICogdXBkYXRlIG9uLWRpc2sgaW5vZGUgZnJvbSBpbi1tZW1vcnkgaW5vZGUKKwkgKiBhY3F1aXJpbmcgdHJhbnNhY3Rpb24gbG9ja3MgZm9yIEFGVEVSIHJlY29yZHMKKwkgKiBvbiB0aGUgb24tZGlzayBpbm9kZSBvZiBmaWxlIG9iamVjdAorCSAqCisJICogc29ydCB0aGUgaW5vZGVzIGFycmF5IGJ5IGlub2RlIG51bWJlciBpbiBkZXNjZW5kaW5nIG9yZGVyCisJICogdG8gcHJldmVudCBkZWFkbG9jayB3aGVuIGFjcXVpcmluZyB0cmFuc2FjdGlvbiBsb2NrCisJICogb2Ygb24tZGlzayBpbm9kZXMgb24gbXVsdGlwbGUgb24tZGlzayBpbm9kZSBwYWdlcyBieQorCSAqIG11bHRpcGxlIGNvbmN1cnJlbnQgdHJhbnNhY3Rpb25zCisJICovCisJZm9yIChrID0gMDsgayA8IGNkLm5pcDsgaysrKSB7CisJCXRvcCA9IChjZC5pcGxpc3Rba10pLT5pX2lubzsKKwkJZm9yIChuID0gayArIDE7IG4gPCBjZC5uaXA7IG4rKykgeworCQkJaXAgPSBjZC5pcGxpc3Rbbl07CisJCQlpZiAoaXAtPmlfaW5vID4gdG9wKSB7CisJCQkJdG9wID0gaXAtPmlfaW5vOworCQkJCWNkLmlwbGlzdFtuXSA9IGNkLmlwbGlzdFtrXTsKKwkJCQljZC5pcGxpc3Rba10gPSBpcDsKKwkJCX0KKwkJfQorCisJCWlwID0gY2QuaXBsaXN0W2tdOworCQlqZnNfaXAgPSBKRlNfSVAoaXApOworCisJCS8qCisJCSAqIEJVR0JVRyAtIFRoaXMgY29kZSBoYXMgdGVtcG9yYXJpbHkgYmVlbiByZW1vdmVkLiAgVGhlCisJCSAqIGludGVudCBpcyB0byBlbnN1cmUgdGhhdCBhbnkgZmlsZSBkYXRhIGlzIHdyaXR0ZW4gYmVmb3JlCisJCSAqIHRoZSBtZXRhZGF0YSBpcyBjb21taXR0ZWQgdG8gdGhlIGpvdXJuYWwuICBUaGlzIHByZXZlbnRzCisJCSAqIHVuaW5pdGlhbGl6ZWQgZGF0YSBmcm9tIGFwcGVhcmluZyBpbiBhIGZpbGUgYWZ0ZXIgdGhlCisJCSAqIGpvdXJuYWwgaGFzIGJlZW4gcmVwbGF5ZWQuICAoVGhlIHVuaW5pdGlhbGl6ZWQgZGF0YQorCQkgKiBjb3VsZCBiZSBzZW5zaXRpdmUgZGF0YSByZW1vdmVkIGJ5IGFub3RoZXIgdXNlci4pCisJCSAqCisJCSAqIFRoZSBwcm9ibGVtIG5vdyBpcyB0aGF0IHdlIGFyZSBob2xkaW5nIHRoZSBJV1JJVEVMT0NLCisJCSAqIG9uIHRoZSBpbm9kZSwgYW5kIGNhbGxpbmcgZmlsZW1hcF9mZGF0YXdyaXRlIG9uIGFuCisJCSAqIHVubWFwcGVkIHBhZ2Ugd2lsbCBjYXVzZSBhIGRlYWRsb2NrIGluIGpmc19nZXRfYmxvY2suCisJCSAqCisJCSAqIFRoZSBsb25nIHRlcm0gc29sdXRpb24gaXMgdG8gcGFyZSBkb3duIHRoZSB1c2Ugb2YKKwkJICogSVdSSVRFTE9DSy4gIFdlIGFyZSBjdXJyZW50bHkgaG9sZGluZyBpdCB0b28gbG9uZy4KKwkJICogV2UgY291bGQgYWxzbyBiZSBzbWFydGVyIGFib3V0IHdoaWNoIGRhdGEgcGFnZXMgbmVlZAorCQkgKiB0byBiZSB3cml0dGVuIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkIGFuZAorCQkgKiB3aGVuIHdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgaXQgYXQgYWxsLgorCQkgKgorCQkgKiBpZiAoKCFTX0lTRElSKGlwLT5pX21vZGUpKQorCQkgKiAgICAmJiAodGJsay0+ZmxhZyAmIENPTU1JVF9ERUxFVEUpID09IDApIHsKKwkJICoJZmlsZW1hcF9mZGF0YXdyaXRlKGlwLT5pX21hcHBpbmcpOworCQkgKglmaWxlbWFwX2ZkYXRhd2FpdChpcC0+aV9tYXBwaW5nKTsKKwkJICogfQorCQkgKi8KKworCQkvKgorCQkgKiBNYXJrIGlub2RlIGFzIG5vdCBkaXJ0eS4gIEl0IHdpbGwgc3RpbGwgYmUgb24gdGhlIGRpcnR5CisJCSAqIGlub2RlIGxpc3QsIGJ1dCB3ZSdsbCBrbm93IG5vdCB0byBjb21taXQgaXQgYWdhaW4gdW5sZXNzCisJCSAqIGl0IGdldHMgbWFya2VkIGRpcnR5IGFnYWluCisJCSAqLworCQljbGVhcl9jZmxhZyhDT01NSVRfRGlydHksIGlwKTsKKworCQkvKiBpbmhlcml0IGFub255bW91cyB0bG9jayhzKSBvZiBpbm9kZSAqLworCQlpZiAoamZzX2lwLT5hdGxoZWFkKSB7CisJCQlsaWRfdG9fdGxvY2soamZzX2lwLT5hdGx0YWlsKS0+bmV4dCA9IHRibGstPm5leHQ7CisJCQl0YmxrLT5uZXh0ID0gamZzX2lwLT5hdGxoZWFkOworCQkJaWYgKCF0YmxrLT5sYXN0KQorCQkJCXRibGstPmxhc3QgPSBqZnNfaXAtPmF0bHRhaWw7CisJCQlqZnNfaXAtPmF0bGhlYWQgPSBqZnNfaXAtPmF0bHRhaWwgPSAwOworCQkJVFhOX0xPQ0soKTsKKwkJCWxpc3RfZGVsX2luaXQoJmpmc19pcC0+YW5vbl9pbm9kZV9saXN0KTsKKwkJCVRYTl9VTkxPQ0soKTsKKwkJfQorCisJCS8qCisJCSAqIGFjcXVpcmUgdHJhbnNhY3Rpb24gbG9jayBvbiBvbi1kaXNrIGlub2RlIHBhZ2UKKwkJICogKGJlY29tZSBmaXJzdCB0bG9jayBvZiB0aGUgdGJsaydzIHRsb2NrIGxpc3QpCisJCSAqLworCQlpZiAoKChyYyA9IGRpV3JpdGUodGlkLCBpcCkpKSkKKwkJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogICAgICB3cml0ZSBsb2cgcmVjb3JkcyBmcm9tIHRyYW5zYWN0aW9uIGxvY2tzCisJICoKKwkgKiB0eFVwZGF0ZU1hcCgpIHJlc2V0cyBYQURfTkVXIGluIFhBRC4KKwkgKi8KKwlpZiAoKHJjID0gdHhMb2cobG9nLCB0YmxrLCAmY2QpKSkKKwkJZ290byBUaGVFbmQ7CisKKwkvKgorCSAqIEVuc3VyZSB0aGF0IGlub2RlIGlzbid0IHJldXNlZCBiZWZvcmUKKwkgKiBsYXp5IGNvbW1pdCB0aHJlYWQgZmluaXNoZXMgcHJvY2Vzc2luZworCSAqLworCWlmICh0YmxrLT54ZmxhZyAmIENPTU1JVF9ERUxFVEUpIHsKKwkJYXRvbWljX2luYygmdGJsay0+dS5pcC0+aV9jb3VudCk7CisJCS8qCisJCSAqIEF2b2lkIGEgcmFyZSBkZWFkbG9jaworCQkgKgorCQkgKiBJZiB0aGUgaW5vZGUgaXMgbG9ja2VkLCB3ZSBtYXkgYmUgYmxvY2tlZCBpbgorCQkgKiBqZnNfY29tbWl0X2lub2RlLiAgSWYgc28sIHdlIGRvbid0IHdhbnQgdGhlCisJCSAqIGxhenlfY29tbWl0IHRocmVhZCBkb2luZyB0aGUgbGFzdCBpcHV0KCkgb24gdGhlIGlub2RlCisJCSAqIHNpbmNlIHRoYXQgbWF5IGJsb2NrIG9uIHRoZSBsb2NrZWQgaW5vZGUuICBJbnN0ZWFkLAorCQkgKiBjb21taXQgdGhlIHRyYW5zYWN0aW9uIHN5bmNocm9ub3VzbHksIHNvIHRoZSBsYXN0IGlwdXQKKwkJICogd2lsbCBiZSBkb25lIGJ5IHRoZSBjYWxsaW5nIHRocmVhZCAob3IgbGF0ZXIpCisJCSAqLworCQlpZiAodGJsay0+dS5pcC0+aV9zdGF0ZSAmIElfTE9DSykKKwkJCXRibGstPnhmbGFnICY9IH5DT01NSVRfTEFaWTsKKwl9CisKKwlBU1NFUlQoKCEodGJsay0+eGZsYWcgJiBDT01NSVRfREVMRVRFKSkgfHwKKwkgICAgICAgKCh0YmxrLT51LmlwLT5pX25saW5rID09IDApICYmCisJCSF0ZXN0X2NmbGFnKENPTU1JVF9Ob2xpbmssIHRibGstPnUuaXApKSk7CisKKwkvKgorCSAqICAgICAgd3JpdGUgQ09NTUlUIGxvZyByZWNvcmQKKwkgKi8KKwlscmQtPnR5cGUgPSBjcHVfdG9fbGUxNihMT0dfQ09NTUlUKTsKKwlscmQtPmxlbmd0aCA9IDA7CisJbHNuID0gbG1Mb2cobG9nLCB0YmxrLCBscmQsIE5VTEwpOworCisJbG1Hcm91cENvbW1pdChsb2csIHRibGspOworCisJLyoKKwkgKiAgICAgIC0gdHJhbnNhY3Rpb24gaXMgbm93IGNvbW1pdHRlZCAtCisJICovCisKKwkvKgorCSAqIGZvcmNlIHBhZ2VzIGluIGNhcmVmdWwgdXBkYXRlCisJICogKGltYXAgYWRkcmVzc2luZyBzdHJ1Y3R1cmUgdXBkYXRlKQorCSAqLworCWlmIChmbGFnICYgQ09NTUlUX0ZPUkNFKQorCQl0eEZvcmNlKHRibGspOworCisJLyoKKwkgKiAgICAgIHVwZGF0ZSBhbGxvY2F0aW9uIG1hcC4KKwkgKgorCSAqIHVwZGF0ZSBpbm9kZSBhbGxvY2F0aW9uIG1hcCBhbmQgaW5vZGU6CisJICogZnJlZSBwYWdlciBsb2NrIG9uIG1lbW9yeSBvYmplY3Qgb2YgaW5vZGUgaWYgYW55LgorCSAqIHVwZGF0ZSAgYmxvY2sgYWxsb2NhdGlvbiBtYXAuCisJICoKKwkgKiB0eFVwZGF0ZU1hcCgpIHJlc2V0cyBYQURfTkVXIGluIFhBRC4KKwkgKi8KKwlpZiAodGJsay0+eGZsYWcgJiBDT01NSVRfRk9SQ0UpCisJCXR4VXBkYXRlTWFwKHRibGspOworCisJLyoKKwkgKiAgICAgIGZyZWUgdHJhbnNhY3Rpb24gbG9ja3MgYW5kIHBhZ2VvdXQvZnJlZSBwYWdlcworCSAqLworCXR4UmVsZWFzZSh0YmxrKTsKKworCWlmICgodGJsay0+ZmxhZyAmIHRibGtHQ19MQVpZKSA9PSAwKQorCQl0eFVubG9jayh0YmxrKTsKKworCisJLyoKKwkgKiAgICAgIHJlc2V0IGluLW1lbW9yeSBvYmplY3Qgc3RhdGUKKwkgKi8KKwlmb3IgKGsgPSAwOyBrIDwgY2QubmlwOyBrKyspIHsKKwkJaXAgPSBjZC5pcGxpc3Rba107CisJCWpmc19pcCA9IEpGU19JUChpcCk7CisKKwkJLyoKKwkJICogcmVzZXQgaW4tbWVtb3J5IGlub2RlIHN0YXRlCisJCSAqLworCQlqZnNfaXAtPmJ4ZmxhZyA9IDA7CisJCWpmc19pcC0+YmxpZCA9IDA7CisJfQorCisgICAgICBvdXQ6CisJaWYgKHJjICE9IDApCisJCXR4QWJvcnQodGlkLCAxKTsKKworICAgICAgVGhlRW5kOgorCWpmc19pbmZvKCJ0eENvbW1pdDogdGlkID0gJWQsIHJldHVybmluZyAlZCIsIHRpZCwgcmMpOworCXJldHVybiByYzsKK30KKworCisvKgorICogTkFNRTogICAgICAgIHR4TG9nKCkKKyAqCisgKiBGVU5DVElPTjogICAgV3JpdGVzIEFGVEVSIGxvZyByZWNvcmRzIGZvciBhbGwgbGluZXMgbW9kaWZpZWQKKyAqICAgICAgICAgICAgICBieSB0aWQgZm9yIHNlZ21lbnRzIHNwZWNpZmllZCBieSBpbm9kZXMgaW4gY29tZGF0YS4KKyAqICAgICAgICAgICAgICBDb2RlIGFzc3VtZXMgb25seSBXUklURUxPQ0tTIGFyZSByZWNvcmRlZCBpbiBsb2Nrd29yZHMuCisgKgorICogUEFSQU1FVEVSUzoKKyAqCisgKiBSRVRVUk4gOgorICovCitzdGF0aWMgaW50IHR4TG9nKHN0cnVjdCBqZnNfbG9nICogbG9nLCBzdHJ1Y3QgdGJsb2NrICogdGJsaywgc3RydWN0IGNvbW1pdCAqIGNkKQoreworCWludCByYyA9IDA7CisJc3RydWN0IGlub2RlICppcDsKKwlsaWRfdCBsaWQ7CisJc3RydWN0IHRsb2NrICp0bGNrOworCXN0cnVjdCBscmQgKmxyZCA9ICZjZC0+bHJkOworCisJLyoKKwkgKiB3cml0ZSBsb2cgcmVjb3JkKHMpIGZvciBlYWNoIHRsb2NrIG9mIHRyYW5zYWN0aW9uLAorCSAqLworCWZvciAobGlkID0gdGJsay0+bmV4dDsgbGlkOyBsaWQgPSB0bGNrLT5uZXh0KSB7CisJCXRsY2sgPSBsaWRfdG9fdGxvY2sobGlkKTsKKworCQl0bGNrLT5mbGFnIHw9IHRsY2tMT0c7CisKKwkJLyogaW5pdGlhbGl6ZSBscmQgY29tbW9uICovCisJCWlwID0gdGxjay0+aXA7CisJCWxyZC0+YWdncmVnYXRlID0gY3B1X3RvX2xlMzIoSkZTX1NCSShpcC0+aV9zYiktPmFnZ3JlZ2F0ZSk7CisJCWxyZC0+bG9nLnJlZG9wYWdlLmZpbGVzZXQgPSBjcHVfdG9fbGUzMihKRlNfSVAoaXApLT5maWxlc2V0KTsKKwkJbHJkLT5sb2cucmVkb3BhZ2UuaW5vZGUgPSBjcHVfdG9fbGUzMihpcC0+aV9pbm8pOworCisJCS8qIHdyaXRlIGxvZyByZWNvcmQgb2YgcGFnZSBmcm9tIHRoZSB0bG9jayAqLworCQlzd2l0Y2ggKHRsY2stPnR5cGUgJiB0bGNrVFlQRSkgeworCQljYXNlIHRsY2tYVFJFRToKKwkJCXh0TG9nKGxvZywgdGJsaywgbHJkLCB0bGNrKTsKKwkJCWJyZWFrOworCisJCWNhc2UgdGxja0RUUkVFOgorCQkJZHRMb2cobG9nLCB0YmxrLCBscmQsIHRsY2spOworCQkJYnJlYWs7CisKKwkJY2FzZSB0bGNrSU5PREU6CisJCQlkaUxvZyhsb2csIHRibGssIGxyZCwgdGxjaywgY2QpOworCQkJYnJlYWs7CisKKwkJY2FzZSB0bGNrTUFQOgorCQkJbWFwTG9nKGxvZywgdGJsaywgbHJkLCB0bGNrKTsKKwkJCWJyZWFrOworCisJCWNhc2UgdGxja0RBVEE6CisJCQlkYXRhTG9nKGxvZywgdGJsaywgbHJkLCB0bGNrKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlqZnNfZXJyKCJVRk8gdGxvY2s6MHglcCIsIHRsY2spOworCQl9CisJfQorCisJcmV0dXJuIHJjOworfQorCisKKy8qCisgKiAgICAgIGRpTG9nKCkKKyAqCisgKiBmdW5jdGlvbjogICAgbG9nIGlub2RlIHRsb2NrIGFuZCBmb3JtYXQgbWFwbG9jayB0byB1cGRhdGUgYm1hcDsKKyAqLworc3RhdGljIGludCBkaUxvZyhzdHJ1Y3QgamZzX2xvZyAqIGxvZywgc3RydWN0IHRibG9jayAqIHRibGssIHN0cnVjdCBscmQgKiBscmQsCisJICBzdHJ1Y3QgdGxvY2sgKiB0bGNrLCBzdHJ1Y3QgY29tbWl0ICogY2QpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCXB4ZF90ICpweGQ7CisJc3RydWN0IHB4ZF9sb2NrICpweGRsb2NrOworCisJbXAgPSB0bGNrLT5tcDsKKworCS8qIGluaXRpYWxpemUgYXMgUkVET1BBR0UgcmVjb3JkIGZvcm1hdCAqLworCWxyZC0+bG9nLnJlZG9wYWdlLnR5cGUgPSBjcHVfdG9fbGUxNihMT0dfSU5PREUpOworCWxyZC0+bG9nLnJlZG9wYWdlLmwybGluZXNpemUgPSBjcHVfdG9fbGUxNihMMklOT0RFU0xPVFNJWkUpOworCisJcHhkID0gJmxyZC0+bG9nLnJlZG9wYWdlLnB4ZDsKKworCS8qCisJICogICAgICBpbm9kZSBhZnRlciBpbWFnZQorCSAqLworCWlmICh0bGNrLT50eXBlICYgdGxja0VOVFJZKSB7CisJCS8qIGxvZyBhZnRlci1pbWFnZSBmb3IgbG9ncmVkbygpOiAqLworCQlscmQtPnR5cGUgPSBjcHVfdG9fbGUxNihMT0dfUkVET1BBR0UpOworLy8gICAgICAgICAgICAgICpweGQgPSBtcC0+Y21fcHhkOworCQlQWERhZGRyZXNzKHB4ZCwgbXAtPmluZGV4KTsKKwkJUFhEbGVuZ3RoKHB4ZCwKKwkJCSAgbXAtPmxvZ2ljYWxfc2l6ZSA+PiB0YmxrLT5zYi0+c19ibG9ja3NpemVfYml0cyk7CisJCWxyZC0+YmFja2NoYWluID0gY3B1X3RvX2xlMzIobG1Mb2cobG9nLCB0YmxrLCBscmQsIHRsY2spKTsKKworCQkvKiBtYXJrIHBhZ2UgYXMgaG9tZXdhcmQgYm91bmQgKi8KKwkJdGxjay0+ZmxhZyB8PSB0bGNrV1JJVEVQQUdFOworCX0gZWxzZSBpZiAodGxjay0+dHlwZSAmIHRsY2tGUkVFKSB7CisJCS8qCisJCSAqICAgICAgZnJlZSBpbm9kZSBleHRlbnQKKwkJICoKKwkJICogKHBhZ2VzIG9mIHRoZSBmcmVlZCBpbm9kZSBleHRlbnQgaGF2ZSBiZWVuIGludmFsaWRhdGVkIGFuZAorCQkgKiBhIG1hcGxvY2sgZm9yIGZyZWUgb2YgdGhlIGV4dGVudCBoYXMgYmVlbiBmb3JtYXR0ZWQgYXQKKwkJICogdHhMb2NrKCkgdGltZSk7CisJCSAqCisJCSAqIHRoZSB0bG9jayBoYWQgYmVlbiBhY3F1aXJlZCBvbiB0aGUgaW5vZGUgYWxsb2NhdGlvbiBtYXAgcGFnZQorCQkgKiAoaWFnKSB0aGF0IHNwZWNpZmllcyB0aGUgZnJlZWQgZXh0ZW50LCBldmVuIHRob3VnaCB0aGUgbWFwCisJCSAqIHBhZ2UgaXMgbm90IGl0c2VsZiBsb2dnZWQsIHRvIHByZXZlbnQgcGFnZW91dCBvZiB0aGUgbWFwCisJCSAqIHBhZ2UgYmVmb3JlIHRoZSBsb2c7CisJCSAqLworCisJCS8qIGxvZyBMT0dfTk9SRURPSU5PRVhUIG9mIHRoZSBmcmVlZCBpbm9kZSBleHRlbnQgZm9yCisJCSAqIGxvZ3JlZG8oKSB0byBzdGFydCBOb1JlZG9QYWdlIGZpbHRlcnMsIGFuZCB0byB1cGRhdGUKKwkJICogaW1hcCBhbmQgYm1hcCBmb3IgZnJlZSBvZiB0aGUgZXh0ZW50OworCQkgKi8KKwkJbHJkLT50eXBlID0gY3B1X3RvX2xlMTYoTE9HX05PUkVET0lOT0VYVCk7CisJCS8qCisJCSAqIEZvciB0aGUgTE9HX05PUkVET0lOT0VYVCByZWNvcmQsIHdlIG5lZWQKKwkJICogdG8gcGFzcyB0aGUgSUFHIG51bWJlciBhbmQgaW5vZGUgZXh0ZW50CisJCSAqIGluZGV4ICh3aXRoaW4gdGhhdCBJQUcpIGZyb20gd2hpY2ggdGhlCisJCSAqIHRoZSBleHRlbnQgYmVpbmcgcmVsZWFzZWQuICBUaGVzZSBoYXZlIGJlZW4KKwkJICogcGFzc2VkIHRvIHVzIGluIHRoZSBpcGxpc3RbMV0gYW5kIGlwbGlzdFsyXS4KKwkJICovCisJCWxyZC0+bG9nLm5vcmVkb2lub2V4dC5pYWdudW0gPQorCQkgICAgY3B1X3RvX2xlMzIoKHUzMikgKHNpemVfdCkgY2QtPmlwbGlzdFsxXSk7CisJCWxyZC0+bG9nLm5vcmVkb2lub2V4dC5pbm9leHRfaWR4ID0KKwkJICAgIGNwdV90b19sZTMyKCh1MzIpIChzaXplX3QpIGNkLT5pcGxpc3RbMl0pOworCisJCXB4ZGxvY2sgPSAoc3RydWN0IHB4ZF9sb2NrICopICYgdGxjay0+bG9jazsKKwkJKnB4ZCA9IHB4ZGxvY2stPnB4ZDsKKwkJbHJkLT5iYWNrY2hhaW4gPSBjcHVfdG9fbGUzMihsbUxvZyhsb2csIHRibGssIGxyZCwgTlVMTCkpOworCisJCS8qIHVwZGF0ZSBibWFwICovCisJCXRsY2stPmZsYWcgfD0gdGxja1VQREFURU1BUDsKKworCQkvKiBtYXJrIHBhZ2UgYXMgaG9tZXdhcmQgYm91bmQgKi8KKwkJdGxjay0+ZmxhZyB8PSB0bGNrV1JJVEVQQUdFOworCX0gZWxzZQorCQlqZnNfZXJyKCJkaUxvZzogVUZPIHR5cGUgdGxjazoweCVwIiwgdGxjayk7CisjaWZkZWYgIF9KRlNfV0lQCisJLyoKKwkgKiAgICAgIGFsbG9jL2ZyZWUgZXh0ZXJuYWwgRUEgZXh0ZW50CisJICoKKwkgKiBhIG1hcGxvY2sgZm9yIHR4VXBkYXRlTWFwKCkgdG8gdXBkYXRlIGJQV01BUCBmb3IgYWxsb2MvZnJlZQorCSAqIG9mIHRoZSBleHRlbnQgaGFzIGJlZW4gZm9ybWF0dGVkIGF0IHR4TG9jaygpIHRpbWU7CisJICovCisJZWxzZSB7CisJCWFzc2VydCh0bGNrLT50eXBlICYgdGxja0VBKTsKKworCQkvKiBsb2cgTE9HX1VQREFURU1BUCBmb3IgbG9ncmVkbygpIHRvIHVwZGF0ZSBibWFwIGZvcgorCQkgKiBhbGxvYyBvZiBuZXcgKGFuZCBmcmVlIG9mIG9sZCkgZXh0ZXJuYWwgRUEgZXh0ZW50OworCQkgKi8KKwkJbHJkLT50eXBlID0gY3B1X3RvX2xlMTYoTE9HX1VQREFURU1BUCk7CisJCXB4ZGxvY2sgPSAoc3RydWN0IHB4ZF9sb2NrICopICYgdGxjay0+bG9jazsKKwkJbmxvY2sgPSBweGRsb2NrLT5pbmRleDsKKwkJZm9yIChpID0gMDsgaSA8IG5sb2NrOyBpKyssIHB4ZGxvY2srKykgeworCQkJaWYgKHB4ZGxvY2stPmZsYWcgJiBtbGNrQUxMT0NQWEQpCisJCQkJbHJkLT5sb2cudXBkYXRlbWFwLnR5cGUgPQorCQkJCSAgICBjcHVfdG9fbGUxNihMT0dfQUxMT0NQWEQpOworCQkJZWxzZQorCQkJCWxyZC0+bG9nLnVwZGF0ZW1hcC50eXBlID0KKwkJCQkgICAgY3B1X3RvX2xlMTYoTE9HX0ZSRUVQWEQpOworCQkJbHJkLT5sb2cudXBkYXRlbWFwLm54ZCA9IGNwdV90b19sZTE2KDEpOworCQkJbHJkLT5sb2cudXBkYXRlbWFwLnB4ZCA9IHB4ZGxvY2stPnB4ZDsKKwkJCWxyZC0+YmFja2NoYWluID0KKwkJCSAgICBjcHVfdG9fbGUzMihsbUxvZyhsb2csIHRibGssIGxyZCwgTlVMTCkpOworCQl9CisKKwkJLyogdXBkYXRlIGJtYXAgKi8KKwkJdGxjay0+ZmxhZyB8PSB0bGNrVVBEQVRFTUFQOworCX0KKyNlbmRpZgkJCQkvKiBfSkZTX1dJUCAqLworCisJcmV0dXJuIHJjOworfQorCisKKy8qCisgKiAgICAgIGRhdGFMb2coKQorICoKKyAqIGZ1bmN0aW9uOiAgICBsb2cgZGF0YSB0bG9jaworICovCitzdGF0aWMgaW50IGRhdGFMb2coc3RydWN0IGpmc19sb2cgKiBsb2csIHN0cnVjdCB0YmxvY2sgKiB0YmxrLCBzdHJ1Y3QgbHJkICogbHJkLAorCSAgICBzdHJ1Y3QgdGxvY2sgKiB0bGNrKQoreworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJcHhkX3QgKnB4ZDsKKworCW1wID0gdGxjay0+bXA7CisKKwkvKiBpbml0aWFsaXplIGFzIFJFRE9QQUdFIHJlY29yZCBmb3JtYXQgKi8KKwlscmQtPmxvZy5yZWRvcGFnZS50eXBlID0gY3B1X3RvX2xlMTYoTE9HX0RBVEEpOworCWxyZC0+bG9nLnJlZG9wYWdlLmwybGluZXNpemUgPSBjcHVfdG9fbGUxNihMMkRBVEFTTE9UU0laRSk7CisKKwlweGQgPSAmbHJkLT5sb2cucmVkb3BhZ2UucHhkOworCisJLyogbG9nIGFmdGVyLWltYWdlIGZvciBsb2dyZWRvKCk6ICovCisJbHJkLT50eXBlID0gY3B1X3RvX2xlMTYoTE9HX1JFRE9QQUdFKTsKKworCWlmIChqZnNfZGlydGFibGVfaW5saW5lKHRsY2stPmlwKSkgeworCQkvKgorCQkgKiBUaGUgdGFibGUgaGFzIGJlZW4gdHJ1bmNhdGVkLCB3ZSd2ZSBtdXN0IGhhdmUgZGVsZXRlZAorCQkgKiB0aGUgbGFzdCBlbnRyeSwgc28gZG9uJ3QgYm90aGVyIGxvZ2dpbmcgdGhpcworCQkgKi8KKwkJbXAtPmxpZCA9IDA7CisJCWhvbGRfbWV0YXBhZ2UobXAsIDApOworCQlhdG9taWNfZGVjKCZtcC0+bm9ob21lb2spOworCQlkaXNjYXJkX21ldGFwYWdlKG1wKTsKKwkJdGxjay0+bXAgPSBOVUxMOworCQlyZXR1cm4gMDsKKwl9CisKKwlQWERhZGRyZXNzKHB4ZCwgbXAtPmluZGV4KTsKKwlQWERsZW5ndGgocHhkLCBtcC0+bG9naWNhbF9zaXplID4+IHRibGstPnNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKworCWxyZC0+YmFja2NoYWluID0gY3B1X3RvX2xlMzIobG1Mb2cobG9nLCB0YmxrLCBscmQsIHRsY2spKTsKKworCS8qIG1hcmsgcGFnZSBhcyBob21ld2FyZCBib3VuZCAqLworCXRsY2stPmZsYWcgfD0gdGxja1dSSVRFUEFHRTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKiAgICAgIGR0TG9nKCkKKyAqCisgKiBmdW5jdGlvbjogICAgbG9nIGR0cmVlIHRsb2NrIGFuZCBmb3JtYXQgbWFwbG9jayB0byB1cGRhdGUgYm1hcDsKKyAqLworc3RhdGljIHZvaWQgZHRMb2coc3RydWN0IGpmc19sb2cgKiBsb2csIHN0cnVjdCB0YmxvY2sgKiB0YmxrLCBzdHJ1Y3QgbHJkICogbHJkLAorCSAgIHN0cnVjdCB0bG9jayAqIHRsY2spCit7CisJc3RydWN0IG1ldGFwYWdlICptcDsKKwlzdHJ1Y3QgcHhkX2xvY2sgKnB4ZGxvY2s7CisJcHhkX3QgKnB4ZDsKKworCW1wID0gdGxjay0+bXA7CisKKwkvKiBpbml0aWFsaXplIGFzIFJFRE9QQUdFL05PUkVET1BBR0UgcmVjb3JkIGZvcm1hdCAqLworCWxyZC0+bG9nLnJlZG9wYWdlLnR5cGUgPSBjcHVfdG9fbGUxNihMT0dfRFRSRUUpOworCWxyZC0+bG9nLnJlZG9wYWdlLmwybGluZXNpemUgPSBjcHVfdG9fbGUxNihMMkRUU0xPVFNJWkUpOworCisJcHhkID0gJmxyZC0+bG9nLnJlZG9wYWdlLnB4ZDsKKworCWlmICh0bGNrLT50eXBlICYgdGxja0JUUk9PVCkKKwkJbHJkLT5sb2cucmVkb3BhZ2UudHlwZSB8PSBjcHVfdG9fbGUxNihMT0dfQlRST09UKTsKKworCS8qCisJICogICAgICBwYWdlIGV4dGVuc2lvbiB2aWEgcmVsb2NhdGlvbjogZW50cnkgaW5zZXJ0aW9uOworCSAqICAgICAgcGFnZSBleHRlbnNpb24gaW4tcGxhY2U6IGVudHJ5IGluc2VydGlvbjsKKwkgKiAgICAgIG5ldyByaWdodCBwYWdlIGZyb20gcGFnZSBzcGxpdCwgcmVpbml0aWFsaXplZCBpbi1saW5lCisJICogICAgICByb290IGZyb20gcm9vdCBwYWdlIHNwbGl0OiBlbnRyeSBpbnNlcnRpb247CisJICovCisJaWYgKHRsY2stPnR5cGUgJiAodGxja05FVyB8IHRsY2tFWFRFTkQpKSB7CisJCS8qIGxvZyBhZnRlci1pbWFnZSBvZiB0aGUgbmV3IHBhZ2UgZm9yIGxvZ3JlZG8oKToKKwkJICogbWFyayBsb2cgKExPR19ORVcpIGZvciBsb2dyZWRvKCkgdG8gaW5pdGlhbGl6ZQorCQkgKiBmcmVlbGlzdCBhbmQgdXBkYXRlIGJtYXAgZm9yIGFsbG9jIG9mIHRoZSBuZXcgcGFnZTsKKwkJICovCisJCWxyZC0+dHlwZSA9IGNwdV90b19sZTE2KExPR19SRURPUEFHRSk7CisJCWlmICh0bGNrLT50eXBlICYgdGxja0VYVEVORCkKKwkJCWxyZC0+bG9nLnJlZG9wYWdlLnR5cGUgfD0gY3B1X3RvX2xlMTYoTE9HX0VYVEVORCk7CisJCWVsc2UKKwkJCWxyZC0+bG9nLnJlZG9wYWdlLnR5cGUgfD0gY3B1X3RvX2xlMTYoTE9HX05FVyk7CisvLyAgICAgICAgICAgICAgKnB4ZCA9IG1wLT5jbV9weGQ7CisJCVBYRGFkZHJlc3MocHhkLCBtcC0+aW5kZXgpOworCQlQWERsZW5ndGgocHhkLAorCQkJICBtcC0+bG9naWNhbF9zaXplID4+IHRibGstPnNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwkJbHJkLT5iYWNrY2hhaW4gPSBjcHVfdG9fbGUzMihsbUxvZyhsb2csIHRibGssIGxyZCwgdGxjaykpOworCisJCS8qIGZvcm1hdCBhIG1hcGxvY2sgZm9yIHR4VXBkYXRlTWFwKCkgdG8gdXBkYXRlIGJQTUFQIGZvcgorCQkgKiBhbGxvYyBvZiB0aGUgbmV3IHBhZ2U7CisJCSAqLworCQlpZiAodGxjay0+dHlwZSAmIHRsY2tCVFJPT1QpCisJCQlyZXR1cm47CisJCXRsY2stPmZsYWcgfD0gdGxja1VQREFURU1BUDsKKwkJcHhkbG9jayA9IChzdHJ1Y3QgcHhkX2xvY2sgKikgJiB0bGNrLT5sb2NrOworCQlweGRsb2NrLT5mbGFnID0gbWxja0FMTE9DUFhEOworCQlweGRsb2NrLT5weGQgPSAqcHhkOworCisJCXB4ZGxvY2stPmluZGV4ID0gMTsKKworCQkvKiBtYXJrIHBhZ2UgYXMgaG9tZXdhcmQgYm91bmQgKi8KKwkJdGxjay0+ZmxhZyB8PSB0bGNrV1JJVEVQQUdFOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiAgICAgIGVudHJ5IGluc2VydGlvbi9kZWxldGlvbiwKKwkgKiAgICAgIHNpYmxpbmcgcGFnZSBsaW5rIHVwZGF0ZSAob2xkIHJpZ2h0IHBhZ2UgYmVmb3JlIHNwbGl0KTsKKwkgKi8KKwlpZiAodGxjay0+dHlwZSAmICh0bGNrRU5UUlkgfCB0bGNrUkVMSU5LKSkgeworCQkvKiBsb2cgYWZ0ZXItaW1hZ2UgZm9yIGxvZ3JlZG8oKTogKi8KKwkJbHJkLT50eXBlID0gY3B1X3RvX2xlMTYoTE9HX1JFRE9QQUdFKTsKKwkJUFhEYWRkcmVzcyhweGQsIG1wLT5pbmRleCk7CisJCVBYRGxlbmd0aChweGQsCisJCQkgIG1wLT5sb2dpY2FsX3NpemUgPj4gdGJsay0+c2ItPnNfYmxvY2tzaXplX2JpdHMpOworCQlscmQtPmJhY2tjaGFpbiA9IGNwdV90b19sZTMyKGxtTG9nKGxvZywgdGJsaywgbHJkLCB0bGNrKSk7CisKKwkJLyogbWFyayBwYWdlIGFzIGhvbWV3YXJkIGJvdW5kICovCisJCXRsY2stPmZsYWcgfD0gdGxja1dSSVRFUEFHRTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogICAgICBwYWdlIGRlbGV0aW9uOiBwYWdlIGhhcyBiZWVuIGludmFsaWRhdGVkCisJICogICAgICBwYWdlIHJlbG9jYXRpb246IHNvdXJjZSBleHRlbnQKKwkgKgorCSAqICAgICAgYSBtYXBsb2NrIGZvciBmcmVlIG9mIHRoZSBwYWdlIGhhcyBiZWVuIGZvcm1hdHRlZAorCSAqICAgICAgYXQgdHhMb2NrKCkgdGltZSk7CisJICovCisJaWYgKHRsY2stPnR5cGUgJiAodGxja0ZSRUUgfCB0bGNrUkVMT0NBVEUpKSB7CisJCS8qIGxvZyBMT0dfTk9SRURPUEFHRSBvZiB0aGUgZGVsZXRlZCBwYWdlIGZvciBsb2dyZWRvKCkKKwkJICogdG8gc3RhcnQgTm9SZWRvUGFnZSBmaWx0ZXIgYW5kIHRvIHVwZGF0ZSBibWFwIGZvciBmcmVlCisJCSAqIG9mIHRoZSBkZWxldGQgcGFnZQorCQkgKi8KKwkJbHJkLT50eXBlID0gY3B1X3RvX2xlMTYoTE9HX05PUkVET1BBR0UpOworCQlweGRsb2NrID0gKHN0cnVjdCBweGRfbG9jayAqKSAmIHRsY2stPmxvY2s7CisJCSpweGQgPSBweGRsb2NrLT5weGQ7CisJCWxyZC0+YmFja2NoYWluID0gY3B1X3RvX2xlMzIobG1Mb2cobG9nLCB0YmxrLCBscmQsIE5VTEwpKTsKKworCQkvKiBhIG1hcGxvY2sgZm9yIHR4VXBkYXRlTWFwKCkgZm9yIGZyZWUgb2YgdGhlIHBhZ2UKKwkJICogaGFzIGJlZW4gZm9ybWF0dGVkIGF0IHR4TG9jaygpIHRpbWU7CisJCSAqLworCQl0bGNrLT5mbGFnIHw9IHRsY2tVUERBVEVNQVA7CisJfQorCXJldHVybjsKK30KKworCisvKgorICogICAgICB4dExvZygpCisgKgorICogZnVuY3Rpb246ICAgIGxvZyB4dHJlZSB0bG9jayBhbmQgZm9ybWF0IG1hcGxvY2sgdG8gdXBkYXRlIGJtYXA7CisgKi8KK3N0YXRpYyB2b2lkIHh0TG9nKHN0cnVjdCBqZnNfbG9nICogbG9nLCBzdHJ1Y3QgdGJsb2NrICogdGJsaywgc3RydWN0IGxyZCAqIGxyZCwKKwkgICBzdHJ1Y3QgdGxvY2sgKiB0bGNrKQoreworCXN0cnVjdCBpbm9kZSAqaXA7CisJc3RydWN0IG1ldGFwYWdlICptcDsKKwl4dHBhZ2VfdCAqcDsKKwlzdHJ1Y3QgeHRsb2NrICp4dGxjazsKKwlzdHJ1Y3QgbWFwbG9jayAqbWFwbG9jazsKKwlzdHJ1Y3QgeGRsaXN0bG9jayAqeGFkbG9jazsKKwlzdHJ1Y3QgcHhkX2xvY2sgKnB4ZGxvY2s7CisJcHhkX3QgKnB4ZDsKKwlpbnQgbmV4dCwgbHdtLCBod207CisKKwlpcCA9IHRsY2stPmlwOworCW1wID0gdGxjay0+bXA7CisKKwkvKiBpbml0aWFsaXplIGFzIFJFRE9QQUdFL05PUkVET1BBR0UgcmVjb3JkIGZvcm1hdCAqLworCWxyZC0+bG9nLnJlZG9wYWdlLnR5cGUgPSBjcHVfdG9fbGUxNihMT0dfWFRSRUUpOworCWxyZC0+bG9nLnJlZG9wYWdlLmwybGluZXNpemUgPSBjcHVfdG9fbGUxNihMMlhUU0xPVFNJWkUpOworCisJcHhkID0gJmxyZC0+bG9nLnJlZG9wYWdlLnB4ZDsKKworCWlmICh0bGNrLT50eXBlICYgdGxja0JUUk9PVCkgeworCQlscmQtPmxvZy5yZWRvcGFnZS50eXBlIHw9IGNwdV90b19sZTE2KExPR19CVFJPT1QpOworCQlwID0gJkpGU19JUChpcCktPmlfeHRyb290OworCQlpZiAoU19JU0RJUihpcC0+aV9tb2RlKSkKKwkJCWxyZC0+bG9nLnJlZG9wYWdlLnR5cGUgfD0KKwkJCSAgICBjcHVfdG9fbGUxNihMT0dfRElSX1hUUkVFKTsKKwl9IGVsc2UKKwkJcCA9ICh4dHBhZ2VfdCAqKSBtcC0+ZGF0YTsKKwluZXh0ID0gbGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCk7CisKKwl4dGxjayA9IChzdHJ1Y3QgeHRsb2NrICopICYgdGxjay0+bG9jazsKKworCW1hcGxvY2sgPSAoc3RydWN0IG1hcGxvY2sgKikgJiB0bGNrLT5sb2NrOworCXhhZGxvY2sgPSAoc3RydWN0IHhkbGlzdGxvY2sgKikgbWFwbG9jazsKKworCS8qCisJICogICAgICBlbnRyeSBpbnNlcnRpb24vZXh0ZW5zaW9uOworCSAqICAgICAgc2libGluZyBwYWdlIGxpbmsgdXBkYXRlIChvbGQgcmlnaHQgcGFnZSBiZWZvcmUgc3BsaXQpOworCSAqLworCWlmICh0bGNrLT50eXBlICYgKHRsY2tORVcgfCB0bGNrR1JPVyB8IHRsY2tSRUxJTkspKSB7CisJCS8qIGxvZyBhZnRlci1pbWFnZSBmb3IgbG9ncmVkbygpOgorCQkgKiBsb2dyZWRvKCkgd2lsbCB1cGRhdGUgYm1hcCBmb3IgYWxsb2Mgb2YgbmV3L2V4dGVuZGVkCisJCSAqIGV4dGVudHMgKFhBRF9ORVd8WEFEX0VYVEVORCkgb2YgWEFEW2x3bTpuZXh0KSBmcm9tCisJCSAqIGFmdGVyLWltYWdlIG9mIFhBRGxpc3Q7CisJCSAqIGxvZ3JlZG8oKSByZXNldHMgKFhBRF9ORVd8WEFEX0VYVEVORCkgZmxhZyB3aGVuCisJCSAqIGFwcGx5aW5nIHRoZSBhZnRlci1pbWFnZSB0byB0aGUgbWV0YS1kYXRhIHBhZ2UuCisJCSAqLworCQlscmQtPnR5cGUgPSBjcHVfdG9fbGUxNihMT0dfUkVET1BBR0UpOworLy8gICAgICAgICAgICAgICpweGQgPSBtcC0+Y21fcHhkOworCQlQWERhZGRyZXNzKHB4ZCwgbXAtPmluZGV4KTsKKwkJUFhEbGVuZ3RoKHB4ZCwKKwkJCSAgbXAtPmxvZ2ljYWxfc2l6ZSA+PiB0YmxrLT5zYi0+c19ibG9ja3NpemVfYml0cyk7CisJCWxyZC0+YmFja2NoYWluID0gY3B1X3RvX2xlMzIobG1Mb2cobG9nLCB0YmxrLCBscmQsIHRsY2spKTsKKworCQkvKiBmb3JtYXQgYSBtYXBsb2NrIGZvciB0eFVwZGF0ZU1hcCgpIHRvIHVwZGF0ZSBiUE1BUAorCQkgKiBmb3IgYWxsb2Mgb2YgbmV3L2V4dGVuZGVkIGV4dGVudHMgb2YgWEFEW2x3bTpuZXh0KQorCQkgKiBmcm9tIHRoZSBwYWdlIGl0c2VsZjsKKwkJICogdHhVcGRhdGVNYXAoKSByZXNldHMgKFhBRF9ORVd8WEFEX0VYVEVORCkgZmxhZy4KKwkJICovCisJCWx3bSA9IHh0bGNrLT5sd20ub2Zmc2V0OworCQlpZiAobHdtID09IDApCisJCQlsd20gPSBYVFBBR0VNQVhTTE9UOworCisJCWlmIChsd20gPT0gbmV4dCkKKwkJCWdvdG8gb3V0OworCQlpZiAobHdtID4gbmV4dCkgeworCQkJamZzX2VycigieHRMb2c6IGx3bSA+IG5leHRcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKwkJdGxjay0+ZmxhZyB8PSB0bGNrVVBEQVRFTUFQOworCQl4YWRsb2NrLT5mbGFnID0gbWxja0FMTE9DWEFETElTVDsKKwkJeGFkbG9jay0+Y291bnQgPSBuZXh0IC0gbHdtOworCQlpZiAoKHhhZGxvY2stPmNvdW50IDw9IDIpICYmICh0YmxrLT54ZmxhZyAmIENPTU1JVF9MQVpZKSkgeworCQkJaW50IGk7CisJCQkvKgorCQkJICogTGF6eSBjb21taXQgbWF5IGFsbG93IHh0cmVlIHRvIGJlIG1vZGlmaWVkIGJlZm9yZQorCQkJICogdHhVcGRhdGVNYXAgcnVucy4gIENvcHkgeGFkIGludG8gbGluZWxvY2sgdG8KKwkJCSAqIHByZXNlcnZlIGNvcnJlY3QgZGF0YS4KKwkJCSAqLworCQkJeGFkbG9jay0+eGRsaXN0ID0gJnh0bGNrLT5weGRsb2NrOworCQkJbWVtY3B5KHhhZGxvY2stPnhkbGlzdCwgJnAtPnhhZFtsd21dLAorCQkJICAgICAgIHNpemVvZih4YWRfdCkgKiB4YWRsb2NrLT5jb3VudCk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCB4YWRsb2NrLT5jb3VudDsgaSsrKQorCQkJCXAtPnhhZFtsd20gKyBpXS5mbGFnICY9CisJCQkJICAgIH4oWEFEX05FVyB8IFhBRF9FWFRFTkRFRCk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogeGRsaXN0IHdpbGwgcG9pbnQgdG8gaW50byBpbm9kZSdzIHh0cmVlLCBlbnN1cmUKKwkJCSAqIHRoYXQgdHJhbnNhY3Rpb24gaXMgbm90IGNvbW1pdHRlZCBsYXppbHkuCisJCQkgKi8KKwkJCXhhZGxvY2stPnhkbGlzdCA9ICZwLT54YWRbbHdtXTsKKwkJCXRibGstPnhmbGFnICY9IH5DT01NSVRfTEFaWTsKKwkJfQorCQlqZnNfaW5mbygieHRMb2c6IGFsbG9jIGlwOjB4JXAgbXA6MHglcCB0bGNrOjB4JXAgbHdtOiVkICIKKwkJCSAiY291bnQ6JWQiLCB0bGNrLT5pcCwgbXAsIHRsY2ssIGx3bSwgeGFkbG9jay0+Y291bnQpOworCisJCW1hcGxvY2stPmluZGV4ID0gMTsKKworCSAgICAgIG91dDoKKwkJLyogbWFyayBwYWdlIGFzIGhvbWV3YXJkIGJvdW5kICovCisJCXRsY2stPmZsYWcgfD0gdGxja1dSSVRFUEFHRTsKKworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiAgICAgIHBhZ2UgZGVsZXRpb246IGZpbGUgZGVsZXRpb24vdHJ1bmNhdGlvbiAocmVmLiB4dFRydW5jYXRlKCkpCisJICoKKwkgKiAocGFnZSB3aWxsIGJlIGludmFsaWRhdGVkIGFmdGVyIGxvZyBpcyB3cml0dGVuIGFuZCBibWFwCisJICogaXMgdXBkYXRlZCBmcm9tIHRoZSBwYWdlKTsKKwkgKi8KKwlpZiAodGxjay0+dHlwZSAmIHRsY2tGUkVFKSB7CisJCS8qIExPR19OT1JFRE9QQUdFIGxvZyBmb3IgTm9SZWRvUGFnZSBmaWx0ZXI6CisJCSAqIGlmIHBhZ2UgZnJlZSBmcm9tIGZpbGUgZGVsZXRlLCBOb1JlZG9GaWxlIGZpbHRlciBmcm9tCisJCSAqIGlub2RlIGltYWdlIG9mIHplcm8gbGluayBjb3VudCB3aWxsIHN1YnN1bWUgTm9SZWRvUGFnZQorCQkgKiBmaWx0ZXJzIGZvciBlYWNoIHBhZ2U7CisJCSAqIGlmIHBhZ2UgZnJlZSBmcm9tIGZpbGUgdHJ1bmNhdHRpb24sIHdyaXRlIE5vUmVkb1BhZ2UKKwkJICogZmlsdGVyOworCQkgKgorCQkgKiB1cGFkdGUgb2YgYmxvY2sgYWxsb2NhdGlvbiBtYXAgZm9yIHRoZSBwYWdlIGl0c2VsZjoKKwkJICogaWYgcGFnZSBmcmVlIGZyb20gZGVsZXRpb24gYW5kIHRydW5jYXRpb24sIExPR19VUERBVEVNQVAKKwkJICogbG9nIGZvciB0aGUgcGFnZSBpdHNlbGYgaXMgZ2VuZXJhdGVkIGZyb20gcHJvY2Vzc2luZworCQkgKiBpdHMgcGFyZW50IHBhZ2UgeGFkIGVudHJpZXM7CisJCSAqLworCQkvKiBpZiBwYWdlIGZyZWUgZnJvbSBmaWxlIHRydW5jYXRpb24sIGxvZyBMT0dfTk9SRURPUEFHRQorCQkgKiBvZiB0aGUgZGVsZXRlZCBwYWdlIGZvciBsb2dyZWRvKCkgdG8gc3RhcnQgTm9SZWRvUGFnZQorCQkgKiBmaWx0ZXIgZm9yIHRoZSBwYWdlOworCQkgKi8KKwkJaWYgKHRibGstPnhmbGFnICYgQ09NTUlUX1RSVU5DQVRFKSB7CisJCQkvKiB3cml0ZSBOT1JFRE9QQUdFIGZvciB0aGUgcGFnZSAqLworCQkJbHJkLT50eXBlID0gY3B1X3RvX2xlMTYoTE9HX05PUkVET1BBR0UpOworCQkJUFhEYWRkcmVzcyhweGQsIG1wLT5pbmRleCk7CisJCQlQWERsZW5ndGgocHhkLAorCQkJCSAgbXAtPmxvZ2ljYWxfc2l6ZSA+PiB0YmxrLT5zYi0+CisJCQkJICBzX2Jsb2Nrc2l6ZV9iaXRzKTsKKwkJCWxyZC0+YmFja2NoYWluID0KKwkJCSAgICBjcHVfdG9fbGUzMihsbUxvZyhsb2csIHRibGssIGxyZCwgTlVMTCkpOworCisJCQlpZiAodGxjay0+dHlwZSAmIHRsY2tCVFJPT1QpIHsKKwkJCQkvKiBFbXB0eSB4dHJlZSBtdXN0IGJlIGxvZ2dlZCAqLworCQkJCWxyZC0+dHlwZSA9IGNwdV90b19sZTE2KExPR19SRURPUEFHRSk7CisJCQkJbHJkLT5iYWNrY2hhaW4gPQorCQkJCSAgICBjcHVfdG9fbGUzMihsbUxvZyhsb2csIHRibGssIGxyZCwgdGxjaykpOworCQkJfQorCQl9CisKKwkJLyogaW5pdCBMT0dfVVBEQVRFTUFQIG9mIHRoZSBmcmVlZCBleHRlbnRzCisJCSAqIFhBRFtYVEVOVFJZU1RBUlQ6aHdtKSBmcm9tIHRoZSBkZWxldGVkIHBhZ2UgaXRzZWxmCisJCSAqIGZvciBsb2dyZWRvKCkgdG8gdXBkYXRlIGJtYXA7CisJCSAqLworCQlscmQtPnR5cGUgPSBjcHVfdG9fbGUxNihMT0dfVVBEQVRFTUFQKTsKKwkJbHJkLT5sb2cudXBkYXRlbWFwLnR5cGUgPSBjcHVfdG9fbGUxNihMT0dfRlJFRVhBRExJU1QpOworCQl4dGxjayA9IChzdHJ1Y3QgeHRsb2NrICopICYgdGxjay0+bG9jazsKKwkJaHdtID0geHRsY2stPmh3bS5vZmZzZXQ7CisJCWxyZC0+bG9nLnVwZGF0ZW1hcC5ueGQgPQorCQkgICAgY3B1X3RvX2xlMTYoaHdtIC0gWFRFTlRSWVNUQVJUICsgMSk7CisJCS8qIHJlZm9ybWF0IGxpbmVsb2NrIGZvciBsbUxvZygpICovCisJCXh0bGNrLT5oZWFkZXIub2Zmc2V0ID0gWFRFTlRSWVNUQVJUOworCQl4dGxjay0+aGVhZGVyLmxlbmd0aCA9IGh3bSAtIFhURU5UUllTVEFSVCArIDE7CisJCXh0bGNrLT5pbmRleCA9IDE7CisJCWxyZC0+YmFja2NoYWluID0gY3B1X3RvX2xlMzIobG1Mb2cobG9nLCB0YmxrLCBscmQsIHRsY2spKTsKKworCQkvKiBmb3JtYXQgYSBtYXBsb2NrIGZvciB0eFVwZGF0ZU1hcCgpIHRvIHVwZGF0ZSBibWFwCisJCSAqIHRvIGZyZWUgZXh0ZW50cyBvZiBYQURbWFRFTlRSWVNUQVJUOmh3bSkgZnJvbSB0aGUKKwkJICogZGVsZXRlZCBwYWdlIGl0c2VsZjsKKwkJICovCisJCXRsY2stPmZsYWcgfD0gdGxja1VQREFURU1BUDsKKwkJeGFkbG9jay0+ZmxhZyA9IG1sY2tGUkVFWEFETElTVDsKKwkJeGFkbG9jay0+Y291bnQgPSBod20gLSBYVEVOVFJZU1RBUlQgKyAxOworCQlpZiAoKHhhZGxvY2stPmNvdW50IDw9IDIpICYmICh0YmxrLT54ZmxhZyAmIENPTU1JVF9MQVpZKSkgeworCQkJLyoKKwkJCSAqIExhenkgY29tbWl0IG1heSBhbGxvdyB4dHJlZSB0byBiZSBtb2RpZmllZCBiZWZvcmUKKwkJCSAqIHR4VXBkYXRlTWFwIHJ1bnMuICBDb3B5IHhhZCBpbnRvIGxpbmVsb2NrIHRvCisJCQkgKiBwcmVzZXJ2ZSBjb3JyZWN0IGRhdGEuCisJCQkgKi8KKwkJCXhhZGxvY2stPnhkbGlzdCA9ICZ4dGxjay0+cHhkbG9jazsKKwkJCW1lbWNweSh4YWRsb2NrLT54ZGxpc3QsICZwLT54YWRbWFRFTlRSWVNUQVJUXSwKKwkJCSAgICAgICBzaXplb2YoeGFkX3QpICogeGFkbG9jay0+Y291bnQpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIHhkbGlzdCB3aWxsIHBvaW50IHRvIGludG8gaW5vZGUncyB4dHJlZSwgZW5zdXJlCisJCQkgKiB0aGF0IHRyYW5zYWN0aW9uIGlzIG5vdCBjb21taXR0ZWQgbGF6aWx5LgorCQkJICovCisJCQl4YWRsb2NrLT54ZGxpc3QgPSAmcC0+eGFkW1hURU5UUllTVEFSVF07CisJCQl0YmxrLT54ZmxhZyAmPSB+Q09NTUlUX0xBWlk7CisJCX0KKwkJamZzX2luZm8oInh0TG9nOiBmcmVlIGlwOjB4JXAgbXA6MHglcCBjb3VudDolZCBsd206MiIsCisJCQkgdGxjay0+aXAsIG1wLCB4YWRsb2NrLT5jb3VudCk7CisKKwkJbWFwbG9jay0+aW5kZXggPSAxOworCisJCS8qIG1hcmsgcGFnZSBhcyBpbnZhbGlkICovCisJCWlmICgoKHRibGstPnhmbGFnICYgQ09NTUlUX1BXTUFQKSB8fCBTX0lTRElSKGlwLT5pX21vZGUpKQorCQkgICAgJiYgISh0bGNrLT50eXBlICYgdGxja0JUUk9PVCkpCisJCQl0bGNrLT5mbGFnIHw9IHRsY2tGUkVFUEFHRTsKKwkJLyoKKwkJICAgZWxzZSAodGJsay0+eGZsYWcgJiBDT01NSVRfUE1BUCkKKwkJICAgPyByZWxlYXNlIHRoZSBwYWdlOworCQkgKi8KKwkJcmV0dXJuOworCX0KKworCS8qCisJICogICAgICBwYWdlL2VudHJ5IHRydW5jYXRpb246IGZpbGUgdHJ1bmNhdGlvbiAocmVmLiB4dFRydW5jYXRlKCkpCisJICoKKwkgKiAgICAgfC0tLS0tLS0tLS0rLS0tLS0tKy0tLS0tLSstLS0tLS0tLS0tLS0tLS18CisJICogICAgICAgICAgICAgICAgfCAgICAgIHwgICAgICB8CisJICogICAgICAgICAgICAgICAgfCAgICAgIHwgICAgIGh3bSAtIGh3bSBiZWZvcmUgdHJ1bmNhdGlvbgorCSAqICAgICAgICAgICAgICAgIHwgICAgIG5leHQgLSB0cnVuY2F0aW9uIHBvaW50CisJICogICAgICAgICAgICAgICBsd20gLSBsd20gYmVmb3JlIHRydW5jYXRpb24KKwkgKiBoZWFkZXIgPworCSAqLworCWlmICh0bGNrLT50eXBlICYgdGxja1RSVU5DQVRFKSB7CisJCXB4ZF90IHRweGQ7CS8qIHRydW5jYXRlZCBleHRlbnQgb2YgeGFkICovCisJCWludCB0d207CisKKwkJLyoKKwkJICogRm9yIHRydW5jYXRpb24gdGhlIGVudGlyZSBsaW5lbG9jayBtYXkgYmUgdXNlZCwgc28gaXQgd291bGQKKwkJICogYmUgZGlmZmljdWx0IHRvIHN0b3JlIHhhZCBsaXN0IGluIGxpbmVsb2NrIGl0c2VsZi4KKwkJICogVGhlcmVmb3JlLCB3ZSdsbCBqdXN0IGZvcmNlIHRyYW5zYWN0aW9uIHRvIGJlIGNvbW1pdHRlZAorCQkgKiBzeW5jaHJvbm91c2x5LCBzbyB0aGF0IHh0cmVlIHBhZ2VzIHdvbid0IGJlIGNoYW5nZWQgYmVmb3JlCisJCSAqIHR4VXBkYXRlTWFwIHJ1bnMuCisJCSAqLworCQl0YmxrLT54ZmxhZyAmPSB+Q09NTUlUX0xBWlk7CisJCWx3bSA9IHh0bGNrLT5sd20ub2Zmc2V0OworCQlpZiAobHdtID09IDApCisJCQlsd20gPSBYVFBBR0VNQVhTTE9UOworCQlod20gPSB4dGxjay0+aHdtLm9mZnNldDsKKwkJdHdtID0geHRsY2stPnR3bS5vZmZzZXQ7CisKKwkJLyoKKwkJICogICAgICB3cml0ZSBsb2cgcmVjb3JkcworCQkgKi8KKwkJLyogbG9nIGFmdGVyLWltYWdlIGZvciBsb2dyZWRvKCk6CisJCSAqCisJCSAqIGxvZ3JlZG8oKSB3aWxsIHVwZGF0ZSBibWFwIGZvciBhbGxvYyBvZiBuZXcvZXh0ZW5kZWQKKwkJICogZXh0ZW50cyAoWEFEX05FV3xYQURfRVhURU5EKSBvZiBYQURbbHdtOm5leHQpIGZyb20KKwkJICogYWZ0ZXItaW1hZ2Ugb2YgWEFEbGlzdDsKKwkJICogbG9ncmVkbygpIHJlc2V0cyAoWEFEX05FV3xYQURfRVhURU5EKSBmbGFnIHdoZW4KKwkJICogYXBwbHlpbmcgdGhlIGFmdGVyLWltYWdlIHRvIHRoZSBtZXRhLWRhdGEgcGFnZS4KKwkJICovCisJCWxyZC0+dHlwZSA9IGNwdV90b19sZTE2KExPR19SRURPUEFHRSk7CisJCVBYRGFkZHJlc3MocHhkLCBtcC0+aW5kZXgpOworCQlQWERsZW5ndGgocHhkLCBtcC0+bG9naWNhbF9zaXplID4+IHRibGstPnNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwkJbHJkLT5iYWNrY2hhaW4gPSBjcHVfdG9fbGUzMihsbUxvZyhsb2csIHRibGssIGxyZCwgdGxjaykpOworCisJCS8qCisJCSAqIHRydW5jYXRlIGVudHJ5IFhBRFt0d20gPT0gbmV4dCAtIDFdOgorCQkgKi8KKwkJaWYgKHR3bSA9PSBuZXh0IC0gMSkgeworCQkJLyogaW5pdCBMT0dfVVBEQVRFTUFQIGZvciBsb2dyZWRvKCkgdG8gdXBkYXRlIGJtYXAgZm9yCisJCQkgKiBmcmVlIG9mIHRydW5jYXRlZCBkZWx0YSBleHRlbnQgb2YgdGhlIHRydW5jYXRlZAorCQkJICogZW50cnkgWEFEW25leHQgLSAxXToKKwkJCSAqICh4dGxjay0+cHhkbG9jayA9IHRydW5jYXRlZCBkZWx0YSBleHRlbnQpOworCQkJICovCisJCQlweGRsb2NrID0gKHN0cnVjdCBweGRfbG9jayAqKSAmIHh0bGNrLT5weGRsb2NrOworCQkJLyogYXNzZXJ0KHB4ZGxvY2stPnR5cGUgJiB0bGNrVFJVTkNBVEUpOyAqLworCQkJbHJkLT50eXBlID0gY3B1X3RvX2xlMTYoTE9HX1VQREFURU1BUCk7CisJCQlscmQtPmxvZy51cGRhdGVtYXAudHlwZSA9IGNwdV90b19sZTE2KExPR19GUkVFUFhEKTsKKwkJCWxyZC0+bG9nLnVwZGF0ZW1hcC5ueGQgPSBjcHVfdG9fbGUxNigxKTsKKwkJCWxyZC0+bG9nLnVwZGF0ZW1hcC5weGQgPSBweGRsb2NrLT5weGQ7CisJCQl0cHhkID0gcHhkbG9jay0+cHhkOwkvKiBzYXZlIHRvIGZvcm1hdCBtYXBsb2NrICovCisJCQlscmQtPmJhY2tjaGFpbiA9CisJCQkgICAgY3B1X3RvX2xlMzIobG1Mb2cobG9nLCB0YmxrLCBscmQsIE5VTEwpKTsKKwkJfQorCisJCS8qCisJCSAqIGZyZWUgZW50cmllcyBYQURbbmV4dDpod21dOgorCQkgKi8KKwkJaWYgKGh3bSA+PSBuZXh0KSB7CisJCQkvKiBpbml0IExPR19VUERBVEVNQVAgb2YgdGhlIGZyZWVkIGV4dGVudHMKKwkJCSAqIFhBRFtuZXh0Omh3bV0gZnJvbSB0aGUgZGVsZXRlZCBwYWdlIGl0c2VsZgorCQkJICogZm9yIGxvZ3JlZG8oKSB0byB1cGRhdGUgYm1hcDsKKwkJCSAqLworCQkJbHJkLT50eXBlID0gY3B1X3RvX2xlMTYoTE9HX1VQREFURU1BUCk7CisJCQlscmQtPmxvZy51cGRhdGVtYXAudHlwZSA9CisJCQkgICAgY3B1X3RvX2xlMTYoTE9HX0ZSRUVYQURMSVNUKTsKKwkJCXh0bGNrID0gKHN0cnVjdCB4dGxvY2sgKikgJiB0bGNrLT5sb2NrOworCQkJaHdtID0geHRsY2stPmh3bS5vZmZzZXQ7CisJCQlscmQtPmxvZy51cGRhdGVtYXAubnhkID0KKwkJCSAgICBjcHVfdG9fbGUxNihod20gLSBuZXh0ICsgMSk7CisJCQkvKiByZWZvcm1hdCBsaW5lbG9jayBmb3IgbG1Mb2coKSAqLworCQkJeHRsY2stPmhlYWRlci5vZmZzZXQgPSBuZXh0OworCQkJeHRsY2stPmhlYWRlci5sZW5ndGggPSBod20gLSBuZXh0ICsgMTsKKwkJCXh0bGNrLT5pbmRleCA9IDE7CisJCQlscmQtPmJhY2tjaGFpbiA9CisJCQkgICAgY3B1X3RvX2xlMzIobG1Mb2cobG9nLCB0YmxrLCBscmQsIHRsY2spKTsKKwkJfQorCisJCS8qCisJCSAqICAgICAgZm9ybWF0IG1hcGxvY2socykgZm9yIHR4VXBkYXRlTWFwKCkgdG8gdXBkYXRlIGJtYXAKKwkJICovCisJCW1hcGxvY2stPmluZGV4ID0gMDsKKworCQkvKgorCQkgKiBhbGxvY2F0ZSBlbnRyaWVzIFhBRFtsd206bmV4dCk6CisJCSAqLworCQlpZiAobHdtIDwgbmV4dCkgeworCQkJLyogZm9ybWF0IGEgbWFwbG9jayBmb3IgdHhVcGRhdGVNYXAoKSB0byB1cGRhdGUgYlBNQVAKKwkJCSAqIGZvciBhbGxvYyBvZiBuZXcvZXh0ZW5kZWQgZXh0ZW50cyBvZiBYQURbbHdtOm5leHQpCisJCQkgKiBmcm9tIHRoZSBwYWdlIGl0c2VsZjsKKwkJCSAqIHR4VXBkYXRlTWFwKCkgcmVzZXRzIChYQURfTkVXfFhBRF9FWFRFTkQpIGZsYWcuCisJCQkgKi8KKwkJCXRsY2stPmZsYWcgfD0gdGxja1VQREFURU1BUDsKKwkJCXhhZGxvY2stPmZsYWcgPSBtbGNrQUxMT0NYQURMSVNUOworCQkJeGFkbG9jay0+Y291bnQgPSBuZXh0IC0gbHdtOworCQkJeGFkbG9jay0+eGRsaXN0ID0gJnAtPnhhZFtsd21dOworCisJCQlqZnNfaW5mbygieHRMb2c6IGFsbG9jIGlwOjB4JXAgbXA6MHglcCBjb3VudDolZCAiCisJCQkJICJsd206JWQgbmV4dDolZCIsCisJCQkJIHRsY2stPmlwLCBtcCwgeGFkbG9jay0+Y291bnQsIGx3bSwgbmV4dCk7CisJCQltYXBsb2NrLT5pbmRleCsrOworCQkJeGFkbG9jaysrOworCQl9CisKKwkJLyoKKwkJICogdHJ1bmNhdGUgZW50cnkgWEFEW3R3bSA9PSBuZXh0IC0gMV06CisJCSAqLworCQlpZiAodHdtID09IG5leHQgLSAxKSB7CisJCQlzdHJ1Y3QgcHhkX2xvY2sgKnB4ZGxvY2s7CisKKwkJCS8qIGZvcm1hdCBhIG1hcGxvY2sgZm9yIHR4VXBkYXRlTWFwKCkgdG8gdXBkYXRlIGJtYXAKKwkJCSAqIHRvIGZyZWUgdHJ1bmNhdGVkIGRlbHRhIGV4dGVudCBvZiB0aGUgdHJ1bmNhdGVkCisJCQkgKiBlbnRyeSBYQURbbmV4dCAtIDFdOworCQkJICogKHh0bGNrLT5weGRsb2NrID0gdHJ1bmNhdGVkIGRlbHRhIGV4dGVudCk7CisJCQkgKi8KKwkJCXRsY2stPmZsYWcgfD0gdGxja1VQREFURU1BUDsKKwkJCXB4ZGxvY2sgPSAoc3RydWN0IHB4ZF9sb2NrICopIHhhZGxvY2s7CisJCQlweGRsb2NrLT5mbGFnID0gbWxja0ZSRUVQWEQ7CisJCQlweGRsb2NrLT5jb3VudCA9IDE7CisJCQlweGRsb2NrLT5weGQgPSB0cHhkOworCisJCQlqZnNfaW5mbygieHRMb2c6IHRydW5jYXRlIGlwOjB4JXAgbXA6MHglcCBjb3VudDolZCAiCisJCQkJICJod206JWQiLCBpcCwgbXAsIHB4ZGxvY2stPmNvdW50LCBod20pOworCQkJbWFwbG9jay0+aW5kZXgrKzsKKwkJCXhhZGxvY2srKzsKKwkJfQorCisJCS8qCisJCSAqIGZyZWUgZW50cmllcyBYQURbbmV4dDpod21dOgorCQkgKi8KKwkJaWYgKGh3bSA+PSBuZXh0KSB7CisJCQkvKiBmb3JtYXQgYSBtYXBsb2NrIGZvciB0eFVwZGF0ZU1hcCgpIHRvIHVwZGF0ZSBibWFwCisJCQkgKiB0byBmcmVlIGV4dGVudHMgb2YgWEFEW25leHQ6aHdtXSBmcm9tIHRoZWRlbGV0ZWQKKwkJCSAqIHBhZ2UgaXRzZWxmOworCQkJICovCisJCQl0bGNrLT5mbGFnIHw9IHRsY2tVUERBVEVNQVA7CisJCQl4YWRsb2NrLT5mbGFnID0gbWxja0ZSRUVYQURMSVNUOworCQkJeGFkbG9jay0+Y291bnQgPSBod20gLSBuZXh0ICsgMTsKKwkJCXhhZGxvY2stPnhkbGlzdCA9ICZwLT54YWRbbmV4dF07CisKKwkJCWpmc19pbmZvKCJ4dExvZzogZnJlZSBpcDoweCVwIG1wOjB4JXAgY291bnQ6JWQgIgorCQkJCSAibmV4dDolZCBod206JWQiLAorCQkJCSB0bGNrLT5pcCwgbXAsIHhhZGxvY2stPmNvdW50LCBuZXh0LCBod20pOworCQkJbWFwbG9jay0+aW5kZXgrKzsKKwkJfQorCisJCS8qIG1hcmsgcGFnZSBhcyBob21ld2FyZCBib3VuZCAqLworCQl0bGNrLT5mbGFnIHw9IHRsY2tXUklURVBBR0U7CisJfQorCXJldHVybjsKK30KKworCisvKgorICogICAgICBtYXBMb2coKQorICoKKyAqIGZ1bmN0aW9uOiAgICBsb2cgZnJvbSBtYXBsb2NrIG9mIGZyZWVkIGRhdGEgZXh0ZW50czsKKyAqLwordm9pZCBtYXBMb2coc3RydWN0IGpmc19sb2cgKiBsb2csIHN0cnVjdCB0YmxvY2sgKiB0YmxrLCBzdHJ1Y3QgbHJkICogbHJkLAorCSAgICBzdHJ1Y3QgdGxvY2sgKiB0bGNrKQoreworCXN0cnVjdCBweGRfbG9jayAqcHhkbG9jazsKKwlpbnQgaSwgbmxvY2s7CisJcHhkX3QgKnB4ZDsKKworCS8qCisJICogICAgICBwYWdlIHJlbG9jYXRpb246IGZyZWUgdGhlIHNvdXJjZSBwYWdlIGV4dGVudAorCSAqCisJICogYSBtYXBsb2NrIGZvciB0eFVwZGF0ZU1hcCgpIGZvciBmcmVlIG9mIHRoZSBwYWdlCisJICogaGFzIGJlZW4gZm9ybWF0dGVkIGF0IHR4TG9jaygpIHRpbWUgc2F2aW5nIHRoZSBzcmMKKwkgKiByZWxvY2F0ZWQgcGFnZSBhZGRyZXNzOworCSAqLworCWlmICh0bGNrLT50eXBlICYgdGxja1JFTE9DQVRFKSB7CisJCS8qIGxvZyBMT0dfTk9SRURPUEFHRSBvZiB0aGUgb2xkIHJlbG9jYXRlZCBwYWdlCisJCSAqIGZvciBsb2dyZWRvKCkgdG8gc3RhcnQgTm9SZWRvUGFnZSBmaWx0ZXI7CisJCSAqLworCQlscmQtPnR5cGUgPSBjcHVfdG9fbGUxNihMT0dfTk9SRURPUEFHRSk7CisJCXB4ZGxvY2sgPSAoc3RydWN0IHB4ZF9sb2NrICopICYgdGxjay0+bG9jazsKKwkJcHhkID0gJmxyZC0+bG9nLnJlZG9wYWdlLnB4ZDsKKwkJKnB4ZCA9IHB4ZGxvY2stPnB4ZDsKKwkJbHJkLT5iYWNrY2hhaW4gPSBjcHVfdG9fbGUzMihsbUxvZyhsb2csIHRibGssIGxyZCwgTlVMTCkpOworCisJCS8qIChOLkIuIGN1cnJlbnRseSwgbG9ncmVkbygpIGRvZXMgTk9UIHVwZGF0ZSBibWFwCisJCSAqIGZvciBmcmVlIG9mIHRoZSBwYWdlIGl0c2VsZiBmb3IgKExPR19YVFJFRXxMT0dfTk9SRURPUEFHRSk7CisJCSAqIGlmIHBhZ2UgZnJlZSBmcm9tIHJlbG9jYXRpb24sIExPR19VUERBVEVNQVAgbG9nIGlzCisJCSAqIHNwZWNpZmljYWxseSBnZW5lcmF0ZWQgbm93IGZvciBsb2dyZWRvKCkKKwkJICogdG8gdXBkYXRlIGJtYXAgZm9yIGZyZWUgb2Ygc3JjIHJlbG9jYXRlZCBwYWdlOworCQkgKiAobmV3IGZsYWcgTE9HX1JFTE9DQVRFIG1heSBiZSBpbnRyb2R1Y2VkIHdoaWNoIHdpbGwKKwkJICogaW5mb3JtIGxvZ3JlZG8oKSB0byBzdGFydCBOT1JlZG9QYWdlIGZpbHRlciBhbmQgYWxzbworCQkgKiB1cGRhdGUgYmxvY2sgYWxsb2NhdGlvbiBtYXAgYXQgdGhlIHNhbWUgdGltZSwgdGh1cworCQkgKiBhdm9pZGluZyBhbiBleHRyYSBsb2cgd3JpdGUpOworCQkgKi8KKwkJbHJkLT50eXBlID0gY3B1X3RvX2xlMTYoTE9HX1VQREFURU1BUCk7CisJCWxyZC0+bG9nLnVwZGF0ZW1hcC50eXBlID0gY3B1X3RvX2xlMTYoTE9HX0ZSRUVQWEQpOworCQlscmQtPmxvZy51cGRhdGVtYXAubnhkID0gY3B1X3RvX2xlMTYoMSk7CisJCWxyZC0+bG9nLnVwZGF0ZW1hcC5weGQgPSBweGRsb2NrLT5weGQ7CisJCWxyZC0+YmFja2NoYWluID0gY3B1X3RvX2xlMzIobG1Mb2cobG9nLCB0YmxrLCBscmQsIE5VTEwpKTsKKworCQkvKiBhIG1hcGxvY2sgZm9yIHR4VXBkYXRlTWFwKCkgZm9yIGZyZWUgb2YgdGhlIHBhZ2UKKwkJICogaGFzIGJlZW4gZm9ybWF0dGVkIGF0IHR4TG9jaygpIHRpbWU7CisJCSAqLworCQl0bGNrLT5mbGFnIHw9IHRsY2tVUERBVEVNQVA7CisJCXJldHVybjsKKwl9CisJLyoKKworCSAqIE90aGVyd2lzZSBpdCdzIG5vdCBhIHJlbG9jYXRlIHJlcXVlc3QKKwkgKgorCSAqLworCWVsc2UgeworCQkvKiBsb2cgTE9HX1VQREFURU1BUCBmb3IgbG9ncmVkbygpIHRvIHVwZGF0ZSBibWFwIGZvcgorCQkgKiBmcmVlIG9mIHRydW5jYXRlZC9yZWxvY2F0ZWQgZGVsdGEgZXh0ZW50IG9mIHRoZSBkYXRhOworCQkgKiBlLmcuOiBleHRlcm5hbCBFQSBleHRlbnQsIHJlbG9jYXRlZC90cnVuY2F0ZWQgZXh0ZW50CisJCSAqIGZyb20geHRUYWlsZ2F0ZSgpOworCQkgKi8KKwkJbHJkLT50eXBlID0gY3B1X3RvX2xlMTYoTE9HX1VQREFURU1BUCk7CisJCXB4ZGxvY2sgPSAoc3RydWN0IHB4ZF9sb2NrICopICYgdGxjay0+bG9jazsKKwkJbmxvY2sgPSBweGRsb2NrLT5pbmRleDsKKwkJZm9yIChpID0gMDsgaSA8IG5sb2NrOyBpKyssIHB4ZGxvY2srKykgeworCQkJaWYgKHB4ZGxvY2stPmZsYWcgJiBtbGNrQUxMT0NQWEQpCisJCQkJbHJkLT5sb2cudXBkYXRlbWFwLnR5cGUgPQorCQkJCSAgICBjcHVfdG9fbGUxNihMT0dfQUxMT0NQWEQpOworCQkJZWxzZQorCQkJCWxyZC0+bG9nLnVwZGF0ZW1hcC50eXBlID0KKwkJCQkgICAgY3B1X3RvX2xlMTYoTE9HX0ZSRUVQWEQpOworCQkJbHJkLT5sb2cudXBkYXRlbWFwLm54ZCA9IGNwdV90b19sZTE2KDEpOworCQkJbHJkLT5sb2cudXBkYXRlbWFwLnB4ZCA9IHB4ZGxvY2stPnB4ZDsKKwkJCWxyZC0+YmFja2NoYWluID0KKwkJCSAgICBjcHVfdG9fbGUzMihsbUxvZyhsb2csIHRibGssIGxyZCwgTlVMTCkpOworCQkJamZzX2luZm8oIm1hcExvZzogeGFkZHI6MHglbHggeGxlbjoweCV4IiwKKwkJCQkgKHVsb25nKSBhZGRyZXNzUFhEKCZweGRsb2NrLT5weGQpLAorCQkJCSBsZW5ndGhQWEQoJnB4ZGxvY2stPnB4ZCkpOworCQl9CisKKwkJLyogdXBkYXRlIGJtYXAgKi8KKwkJdGxjay0+ZmxhZyB8PSB0bGNrVVBEQVRFTUFQOworCX0KK30KKworCisvKgorICogICAgICB0eEVBKCkKKyAqCisgKiBmdW5jdGlvbjogICAgYWNxdWlyZSBtYXBsb2NrIGZvciBFQS9BQ0wgZXh0ZW50cyBvcgorICogICAgICAgICAgICAgIHNldCBDT01NSVRfSU5MSU5FIGZsYWc7CisgKi8KK3ZvaWQgdHhFQSh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsIGR4ZF90ICogb2xkZWEsIGR4ZF90ICogbmV3ZWEpCit7CisJc3RydWN0IHRsb2NrICp0bGNrID0gTlVMTDsKKwlzdHJ1Y3QgcHhkX2xvY2sgKm1hcGxvY2sgPSBOVUxMLCAqcHhkbG9jayA9IE5VTEw7CisKKwkvKgorCSAqIGZvcm1hdCBtYXBsb2NrIGZvciBhbGxvYyBvZiBuZXcgRUEgZXh0ZW50CisJICovCisJaWYgKG5ld2VhKSB7CisJCS8qIFNpbmNlIHRoZSBuZXdlYSBjb3VsZCBiZSBhIGNvbXBsZXRlbHkgemVyb2VkIGVudHJ5IHdlIG5lZWQgdG8KKwkJICogY2hlY2sgZm9yIHRoZSB0d28gZmxhZ3Mgd2hpY2ggaW5kaWNhdGUgd2Ugc2hvdWxkIGFjdHVhbGx5CisJCSAqIGNvbW1pdCBuZXcgRUEgZGF0YQorCQkgKi8KKwkJaWYgKG5ld2VhLT5mbGFnICYgRFhEX0VYVEVOVCkgeworCQkJdGxjayA9IHR4TWFwbG9jayh0aWQsIGlwLCB0bGNrTUFQKTsKKwkJCW1hcGxvY2sgPSAoc3RydWN0IHB4ZF9sb2NrICopICYgdGxjay0+bG9jazsKKwkJCXB4ZGxvY2sgPSAoc3RydWN0IHB4ZF9sb2NrICopIG1hcGxvY2s7CisJCQlweGRsb2NrLT5mbGFnID0gbWxja0FMTE9DUFhEOworCQkJUFhEYWRkcmVzcygmcHhkbG9jay0+cHhkLCBhZGRyZXNzRFhEKG5ld2VhKSk7CisJCQlQWERsZW5ndGgoJnB4ZGxvY2stPnB4ZCwgbGVuZ3RoRFhEKG5ld2VhKSk7CisJCQlweGRsb2NrKys7CisJCQltYXBsb2NrLT5pbmRleCA9IDE7CisJCX0gZWxzZSBpZiAobmV3ZWEtPmZsYWcgJiBEWERfSU5MSU5FKSB7CisJCQl0bGNrID0gTlVMTDsKKworCQkJc2V0X2NmbGFnKENPTU1JVF9JbmxpbmVlYSwgaXApOworCQl9CisJfQorCisJLyoKKwkgKiBmb3JtYXQgbWFwbG9jayBmb3IgZnJlZSBvZiBvbGQgRUEgZXh0ZW50CisJICovCisJaWYgKCF0ZXN0X2NmbGFnKENPTU1JVF9Ob2xpbmssIGlwKSAmJiBvbGRlYS0+ZmxhZyAmIERYRF9FWFRFTlQpIHsKKwkJaWYgKHRsY2sgPT0gTlVMTCkgeworCQkJdGxjayA9IHR4TWFwbG9jayh0aWQsIGlwLCB0bGNrTUFQKTsKKwkJCW1hcGxvY2sgPSAoc3RydWN0IHB4ZF9sb2NrICopICYgdGxjay0+bG9jazsKKwkJCXB4ZGxvY2sgPSAoc3RydWN0IHB4ZF9sb2NrICopIG1hcGxvY2s7CisJCQltYXBsb2NrLT5pbmRleCA9IDA7CisJCX0KKwkJcHhkbG9jay0+ZmxhZyA9IG1sY2tGUkVFUFhEOworCQlQWERhZGRyZXNzKCZweGRsb2NrLT5weGQsIGFkZHJlc3NEWEQob2xkZWEpKTsKKwkJUFhEbGVuZ3RoKCZweGRsb2NrLT5weGQsIGxlbmd0aERYRChvbGRlYSkpOworCQltYXBsb2NrLT5pbmRleCsrOworCX0KK30KKworCisvKgorICogICAgICB0eEZvcmNlKCkKKyAqCisgKiBmdW5jdGlvbjogc3luY2hyb25vdXNseSB3cml0ZSBwYWdlcyBsb2NrZWQgYnkgdHJhbnNhY3Rpb24KKyAqICAgICAgICAgICAgICBhZnRlciB0eExvZygpIGJ1dCBiZWZvcmUgdHhVcGRhdGVNYXAoKTsKKyAqLwordm9pZCB0eEZvcmNlKHN0cnVjdCB0YmxvY2sgKiB0YmxrKQoreworCXN0cnVjdCB0bG9jayAqdGxjazsKKwlsaWRfdCBsaWQsIG5leHQ7CisJc3RydWN0IG1ldGFwYWdlICptcDsKKworCS8qCisJICogcmV2ZXJzZSB0aGUgb3JkZXIgb2YgdHJhbnNhY3Rpb24gdGxvY2tzIGluCisJICogY2FyZWZ1bCB1cGRhdGUgb3JkZXIgb2YgYWRkcmVzcyBpbmRleCBwYWdlcworCSAqIChyaWdodCB0byBsZWZ0LCBib3R0b20gdXApCisJICovCisJdGxjayA9IGxpZF90b190bG9jayh0YmxrLT5uZXh0KTsKKwlsaWQgPSB0bGNrLT5uZXh0OworCXRsY2stPm5leHQgPSAwOworCXdoaWxlIChsaWQpIHsKKwkJdGxjayA9IGxpZF90b190bG9jayhsaWQpOworCQluZXh0ID0gdGxjay0+bmV4dDsKKwkJdGxjay0+bmV4dCA9IHRibGstPm5leHQ7CisJCXRibGstPm5leHQgPSBsaWQ7CisJCWxpZCA9IG5leHQ7CisJfQorCisJLyoKKwkgKiBzeW5jaHJvbm91c2x5IHdyaXRlIHRoZSBwYWdlLCBhbmQKKwkgKiBob2xkIHRoZSBwYWdlIGZvciB0eFVwZGF0ZU1hcCgpOworCSAqLworCWZvciAobGlkID0gdGJsay0+bmV4dDsgbGlkOyBsaWQgPSBuZXh0KSB7CisJCXRsY2sgPSBsaWRfdG9fdGxvY2sobGlkKTsKKwkJbmV4dCA9IHRsY2stPm5leHQ7CisKKwkJaWYgKChtcCA9IHRsY2stPm1wKSAhPSBOVUxMICYmCisJCSAgICAodGxjay0+dHlwZSAmIHRsY2tCVFJPT1QpID09IDApIHsKKwkJCWFzc2VydChtcC0+eGZsYWcgJiBDT01NSVRfUEFHRSk7CisKKwkJCWlmICh0bGNrLT5mbGFnICYgdGxja1dSSVRFUEFHRSkgeworCQkJCXRsY2stPmZsYWcgJj0gfnRsY2tXUklURVBBR0U7CisKKwkJCQkvKiBkbyBub3QgcmVsZWFzZSBwYWdlIHRvIGZyZWVsaXN0ICovCisKKwkJCQkvKgorCQkJCSAqIFRoZSAicmlnaHQiIHRoaW5nIHRvIGRvIGhlcmUgaXMgdG8KKwkJCQkgKiBzeW5jaHJvbm91c2x5IHdyaXRlIHRoZSBtZXRhZGF0YS4KKwkJCQkgKiBXaXRoIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHRoaXMKKwkJCQkgKiBpcyBoYXJkIHNpbmNlIHdyaXRlX21ldGFwYWdlIHJlcXVpcmVzCisJCQkJICogdXMgdG8ga3VubWFwICYgcmVtYXAgdGhlIHBhZ2UuICBJZiB3ZQorCQkJCSAqIGhhdmUgdGxvY2tzIHBvaW50aW5nIGludG8gdGhlIG1ldGFkYXRhCisJCQkJICogcGFnZXMsIHdlIGRvbid0IHdhbnQgdG8gZG8gdGhpcy4gIEkgdGhpbmsKKwkJCQkgKiB3ZSBjYW4gZ2V0IGJ5IHdpdGggc3luY2hyb25vdXNseSB3cml0aW5nCisJCQkJICogdGhlIHBhZ2VzIHdoZW4gdGhleSBhcmUgcmVsZWFzZWQuCisJCQkJICovCisJCQkJYXNzZXJ0KGF0b21pY19yZWFkKCZtcC0+bm9ob21lb2spKTsKKwkJCQlzZXRfYml0KE1FVEFfZGlydHksICZtcC0+ZmxhZyk7CisJCQkJc2V0X2JpdChNRVRBX3N5bmMsICZtcC0+ZmxhZyk7CisJCQl9CisJCX0KKwl9Cit9CisKKworLyoKKyAqICAgICAgdHhVcGRhdGVNYXAoKQorICoKKyAqIGZ1bmN0aW9uOiAgICB1cGRhdGUgcGVyc2lzdGVudCBhbGxvY2F0aW9uIG1hcCAoYW5kIHdvcmtpbmcgbWFwCisgKiAgICAgICAgICAgICAgaWYgYXBwcm9wcmlhdGUpOworICoKKyAqIHBhcmFtZXRlcjoKKyAqLworc3RhdGljIHZvaWQgdHhVcGRhdGVNYXAoc3RydWN0IHRibG9jayAqIHRibGspCit7CisJc3RydWN0IGlub2RlICppcDsKKwlzdHJ1Y3QgaW5vZGUgKmlwaW1hcDsKKwlsaWRfdCBsaWQ7CisJc3RydWN0IHRsb2NrICp0bGNrOworCXN0cnVjdCBtYXBsb2NrICptYXBsb2NrOworCXN0cnVjdCBweGRfbG9jayBweGRsb2NrOworCWludCBtYXB0eXBlOworCWludCBrLCBubG9jazsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wID0gTlVMTDsKKworCWlwaW1hcCA9IEpGU19TQkkodGJsay0+c2IpLT5pcGltYXA7CisKKwltYXB0eXBlID0gKHRibGstPnhmbGFnICYgQ09NTUlUX1BNQVApID8gQ09NTUlUX1BNQVAgOiBDT01NSVRfUFdNQVA7CisKKworCS8qCisJICogICAgICB1cGRhdGUgYmxvY2sgYWxsb2NhdGlvbiBtYXAKKwkgKgorCSAqIHVwZGF0ZSBhbGxvY2F0aW9uIHN0YXRlIGluIHBtYXAgKGFuZCB3bWFwKSBhbmQKKwkgKiB1cGRhdGUgbHNuIG9mIHRoZSBwbWFwIHBhZ2U7CisJICovCisJLyoKKwkgKiBzY2FuIGVhY2ggdGxvY2svcGFnZSBvZiB0cmFuc2FjdGlvbiBmb3IgYmxvY2sgYWxsb2NhdGlvbi9mcmVlOgorCSAqCisJICogZm9yIGVhY2ggdGxvY2svcGFnZSBvZiB0cmFuc2FjdGlvbiwgdXBkYXRlIG1hcC4KKwkgKiAgPyBhcmUgdGhlcmUgdGxvY2sgZm9yIHBtYXAgYW5kIHB3bWFwIGF0IHRoZSBzYW1lIHRpbWUgPworCSAqLworCWZvciAobGlkID0gdGJsay0+bmV4dDsgbGlkOyBsaWQgPSB0bGNrLT5uZXh0KSB7CisJCXRsY2sgPSBsaWRfdG9fdGxvY2sobGlkKTsKKworCQlpZiAoKHRsY2stPmZsYWcgJiB0bGNrVVBEQVRFTUFQKSA9PSAwKQorCQkJY29udGludWU7CisKKwkJaWYgKHRsY2stPmZsYWcgJiB0bGNrRlJFRVBBR0UpIHsKKwkJCS8qCisJCQkgKiBBbm90aGVyIHRocmVhZCBtYXkgYXR0ZW1wdCB0byByZXVzZSBmcmVlZCBzcGFjZQorCQkJICogaW1tZWRpYXRlbHksIHNvIHdlIHdhbnQgdG8gZ2V0IHJpZCBvZiB0aGUgbWV0YXBhZ2UKKwkJCSAqIGJlZm9yZSBhbnlvbmUgZWxzZSBoYXMgYSBjaGFuY2UgdG8gZ2V0IGl0LgorCQkJICogTG9jayBtZXRhcGFnZSwgdXBkYXRlIG1hcHMsIHRoZW4gaW52YWxpZGF0ZQorCQkJICogdGhlIG1ldGFwYWdlLgorCQkJICovCisJCQltcCA9IHRsY2stPm1wOworCQkJQVNTRVJUKG1wLT54ZmxhZyAmIENPTU1JVF9QQUdFKTsKKwkJCWhvbGRfbWV0YXBhZ2UobXAsIDApOworCQl9CisKKwkJLyoKKwkJICogZXh0ZW50IGxpc3Q6CisJCSAqIC4gaW4tbGluZSBQWEQgbGlzdDoKKwkJICogLiBvdXQtb2YtbGluZSBYQUQgbGlzdDoKKwkJICovCisJCW1hcGxvY2sgPSAoc3RydWN0IG1hcGxvY2sgKikgJiB0bGNrLT5sb2NrOworCQlubG9jayA9IG1hcGxvY2stPmluZGV4OworCisJCWZvciAoayA9IDA7IGsgPCBubG9jazsgaysrLCBtYXBsb2NrKyspIHsKKwkJCS8qCisJCQkgKiBhbGxvY2F0ZSBibG9ja3MgaW4gcGVyc2lzdGVudCBtYXA6CisJCQkgKgorCQkJICogYmxvY2tzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgZnJvbSB3bWFwIGF0IGFsbG9jIHRpbWU7CisJCQkgKi8KKwkJCWlmIChtYXBsb2NrLT5mbGFnICYgbWxja0FMTE9DKSB7CisJCQkJdHhBbGxvY1BNYXAoaXBpbWFwLCBtYXBsb2NrLCB0YmxrKTsKKwkJCX0KKwkJCS8qCisJCQkgKiBmcmVlIGJsb2NrcyBpbiBwZXJzaXN0ZW50IGFuZCB3b3JraW5nIG1hcDoKKwkJCSAqIGJsb2NrcyB3aWxsIGJlIGZyZWVkIGluIHBtYXAgYW5kIHRoZW4gaW4gd21hcDsKKwkJCSAqCisJCQkgKiA/IHRibG9jayBzcGVjaWZpZXMgdGhlIFBNQVAvUFdNQVAgYmFzZWQgdXBvbgorCQkJICogdHJhbnNhY3Rpb24KKwkJCSAqCisJCQkgKiBmcmVlIGJsb2NrcyBpbiBwZXJzaXN0ZW50IG1hcDoKKwkJCSAqIGJsb2NrcyB3aWxsIGJlIGZyZWVkIGZyb20gd21hcCBhdCBsYXN0IHJlZmVyZW5jZQorCQkJICogcmVsZWFzZSBvZiB0aGUgb2JqZWN0IGZvciByZWd1bGFyIGZpbGVzOworCQkJICoKKwkJCSAqIEFsd2F5IGZyZWUgYmxvY2tzIGZyb20gYm90aCBwZXJzaXN0ZW50ICYgd29ya2luZworCQkJICogbWFwcyBmb3IgZGlyZWN0b3JpZXMKKwkJCSAqLworCQkJZWxzZSB7CS8qIChtYXBsb2NrLT5mbGFnICYgbWxja0ZSRUUpICovCisKKwkJCQlpZiAoU19JU0RJUih0bGNrLT5pcC0+aV9tb2RlKSkKKwkJCQkJdHhGcmVlTWFwKGlwaW1hcCwgbWFwbG9jaywKKwkJCQkJCSAgdGJsaywgQ09NTUlUX1BXTUFQKTsKKwkJCQllbHNlCisJCQkJCXR4RnJlZU1hcChpcGltYXAsIG1hcGxvY2ssCisJCQkJCQkgIHRibGssIG1hcHR5cGUpOworCQkJfQorCQl9CisJCWlmICh0bGNrLT5mbGFnICYgdGxja0ZSRUVQQUdFKSB7CisJCQlpZiAoISh0YmxrLT5mbGFnICYgdGJsa0dDX0xBWlkpKSB7CisJCQkJLyogVGhpcyBpcyBlcXVpdmFsZW50IHRvIHR4UmVsZWFzZSAqLworCQkJCUFTU0VSVChtcC0+bGlkID09IGxpZCk7CisJCQkJdGxjay0+bXAtPmxpZCA9IDA7CisJCQl9CisJCQlhc3NlcnQoYXRvbWljX3JlYWQoJm1wLT5ub2hvbWVvaykgPT0gMSk7CisJCQlhdG9taWNfZGVjKCZtcC0+bm9ob21lb2spOworCQkJZGlzY2FyZF9tZXRhcGFnZShtcCk7CisJCQl0bGNrLT5tcCA9IE5VTEw7CisJCX0KKwl9CisJLyoKKwkgKiAgICAgIHVwZGF0ZSBpbm9kZSBhbGxvY2F0aW9uIG1hcAorCSAqCisJICogdXBkYXRlIGFsbG9jYXRpb24gc3RhdGUgaW4gcG1hcCBhbmQKKwkgKiB1cGRhdGUgbHNuIG9mIHRoZSBwbWFwIHBhZ2U7CisJICogdXBkYXRlIGluLW1lbW9yeSBpbm9kZSBmbGFnL3N0YXRlCisJICoKKwkgKiB1bmxvY2sgbWFwcGVyL3dyaXRlIGxvY2sKKwkgKi8KKwlpZiAodGJsay0+eGZsYWcgJiBDT01NSVRfQ1JFQVRFKSB7CisJCWRpVXBkYXRlUE1hcChpcGltYXAsIHRibGstPmlubywgRkFMU0UsIHRibGspOworCQlpcGltYXAtPmlfc3RhdGUgfD0gSV9ESVJUWTsKKwkJLyogdXBkYXRlIHBlcnNpc3RlbnQgYmxvY2sgYWxsb2NhdGlvbiBtYXAKKwkJICogZm9yIHRoZSBhbGxvY2F0aW9uIG9mIGlub2RlIGV4dGVudDsKKwkJICovCisJCXB4ZGxvY2suZmxhZyA9IG1sY2tBTExPQ1BYRDsKKwkJcHhkbG9jay5weGQgPSB0YmxrLT51Lml4cHhkOworCQlweGRsb2NrLmluZGV4ID0gMTsKKwkJdHhBbGxvY1BNYXAoaXBpbWFwLCAoc3RydWN0IG1hcGxvY2sgKikgJiBweGRsb2NrLCB0YmxrKTsKKwl9IGVsc2UgaWYgKHRibGstPnhmbGFnICYgQ09NTUlUX0RFTEVURSkgeworCQlpcCA9IHRibGstPnUuaXA7CisJCWRpVXBkYXRlUE1hcChpcGltYXAsIGlwLT5pX2lubywgVFJVRSwgdGJsayk7CisJCWlwaW1hcC0+aV9zdGF0ZSB8PSBJX0RJUlRZOworCQlpcHV0KGlwKTsKKwl9Cit9CisKKworLyoKKyAqICAgICAgdHhBbGxvY1BNYXAoKQorICoKKyAqIGZ1bmN0aW9uOiBhbGxvY2F0ZSBmcm9tIHBlcnNpc3RlbnQgbWFwOworICoKKyAqIHBhcmFtZXRlcjoKKyAqICAgICAgaXBibWFwICAtCisgKiAgICAgIG1hbG9jayAtCisgKiAgICAgICAgICAgICAgeGFkIGxpc3Q6CisgKiAgICAgICAgICAgICAgcHhkOgorICoKKyAqICAgICAgbWFwdHlwZSAtCisgKiAgICAgICAgICAgICAgYWxsb2NhdGUgZnJvbSBwZXJzaXN0ZW50IG1hcDsKKyAqICAgICAgICAgICAgICBmcmVlIGZyb20gcGVyc2lzdGVudCBtYXA7CisgKiAgICAgICAgICAgICAgKGUuZy4sIHRtcCBmaWxlIC0gZnJlZSBmcm9tIHdvcmtpbmcgbWFwIGF0IHJlbGVhZQorICogICAgICAgICAgICAgICBvZiBsYXN0IHJlZmVyZW5jZSk7CisgKiAgICAgICAgICAgICAgZnJlZSBmcm9tIHBlcnNpc3RlbnQgYW5kIHdvcmtpbmcgbWFwOworICoKKyAqICAgICAgbHNuICAgICAtIGxvZyBzZXF1ZW5jZSBudW1iZXI7CisgKi8KK3N0YXRpYyB2b2lkIHR4QWxsb2NQTWFwKHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBtYXBsb2NrICogbWFwbG9jaywKKwkJCXN0cnVjdCB0YmxvY2sgKiB0YmxrKQoreworCXN0cnVjdCBpbm9kZSAqaXBibWFwID0gSkZTX1NCSShpcC0+aV9zYiktPmlwYm1hcDsKKwlzdHJ1Y3QgeGRsaXN0bG9jayAqeGFkbGlzdGxvY2s7CisJeGFkX3QgKnhhZDsKKwlzNjQgeGFkZHI7CisJaW50IHhsZW47CisJc3RydWN0IHB4ZF9sb2NrICpweGRsb2NrOworCXN0cnVjdCB4ZGxpc3Rsb2NrICpweGRsaXN0bG9jazsKKwlweGRfdCAqcHhkOworCWludCBuOworCisJLyoKKwkgKiBhbGxvY2F0ZSBmcm9tIHBlcnNpc3RlbnQgbWFwOworCSAqLworCWlmIChtYXBsb2NrLT5mbGFnICYgbWxja0FMTE9DWEFETElTVCkgeworCQl4YWRsaXN0bG9jayA9IChzdHJ1Y3QgeGRsaXN0bG9jayAqKSBtYXBsb2NrOworCQl4YWQgPSB4YWRsaXN0bG9jay0+eGRsaXN0OworCQlmb3IgKG4gPSAwOyBuIDwgeGFkbGlzdGxvY2stPmNvdW50OyBuKyssIHhhZCsrKSB7CisJCQlpZiAoeGFkLT5mbGFnICYgKFhBRF9ORVcgfCBYQURfRVhURU5ERUQpKSB7CisJCQkJeGFkZHIgPSBhZGRyZXNzWEFEKHhhZCk7CisJCQkJeGxlbiA9IGxlbmd0aFhBRCh4YWQpOworCQkJCWRiVXBkYXRlUE1hcChpcGJtYXAsIEZBTFNFLCB4YWRkciwKKwkJCQkJICAgICAoczY0KSB4bGVuLCB0YmxrKTsKKwkJCQl4YWQtPmZsYWcgJj0gfihYQURfTkVXIHwgWEFEX0VYVEVOREVEKTsKKwkJCQlqZnNfaW5mbygiYWxsb2NQTWFwOiB4YWRkcjoweCVseCB4bGVuOiVkIiwKKwkJCQkJICh1bG9uZykgeGFkZHIsIHhsZW4pOworCQkJfQorCQl9CisJfSBlbHNlIGlmIChtYXBsb2NrLT5mbGFnICYgbWxja0FMTE9DUFhEKSB7CisJCXB4ZGxvY2sgPSAoc3RydWN0IHB4ZF9sb2NrICopIG1hcGxvY2s7CisJCXhhZGRyID0gYWRkcmVzc1BYRCgmcHhkbG9jay0+cHhkKTsKKwkJeGxlbiA9IGxlbmd0aFBYRCgmcHhkbG9jay0+cHhkKTsKKwkJZGJVcGRhdGVQTWFwKGlwYm1hcCwgRkFMU0UsIHhhZGRyLCAoczY0KSB4bGVuLCB0YmxrKTsKKwkJamZzX2luZm8oImFsbG9jUE1hcDogeGFkZHI6MHglbHggeGxlbjolZCIsICh1bG9uZykgeGFkZHIsIHhsZW4pOworCX0gZWxzZSB7CQkvKiAobWFwbG9jay0+ZmxhZyAmIG1sY2tBTExPQ1BYRExJU1QpICovCisKKwkJcHhkbGlzdGxvY2sgPSAoc3RydWN0IHhkbGlzdGxvY2sgKikgbWFwbG9jazsKKwkJcHhkID0gcHhkbGlzdGxvY2stPnhkbGlzdDsKKwkJZm9yIChuID0gMDsgbiA8IHB4ZGxpc3Rsb2NrLT5jb3VudDsgbisrLCBweGQrKykgeworCQkJeGFkZHIgPSBhZGRyZXNzUFhEKHB4ZCk7CisJCQl4bGVuID0gbGVuZ3RoUFhEKHB4ZCk7CisJCQlkYlVwZGF0ZVBNYXAoaXBibWFwLCBGQUxTRSwgeGFkZHIsIChzNjQpIHhsZW4sCisJCQkJICAgICB0YmxrKTsKKwkJCWpmc19pbmZvKCJhbGxvY1BNYXA6IHhhZGRyOjB4JWx4IHhsZW46JWQiLAorCQkJCSAodWxvbmcpIHhhZGRyLCB4bGVuKTsKKwkJfQorCX0KK30KKworCisvKgorICogICAgICB0eEZyZWVNYXAoKQorICoKKyAqIGZ1bmN0aW9uOiAgICBmcmVlIGZyb20gcGVyc2lzdGVudCBhbmQvb3Igd29ya2luZyBtYXA7CisgKgorICogdG9kbzogb3B0aW1pemF0aW9uCisgKi8KK3ZvaWQgdHhGcmVlTWFwKHN0cnVjdCBpbm9kZSAqaXAsCisJICAgICAgIHN0cnVjdCBtYXBsb2NrICogbWFwbG9jaywgc3RydWN0IHRibG9jayAqIHRibGssIGludCBtYXB0eXBlKQoreworCXN0cnVjdCBpbm9kZSAqaXBibWFwID0gSkZTX1NCSShpcC0+aV9zYiktPmlwYm1hcDsKKwlzdHJ1Y3QgeGRsaXN0bG9jayAqeGFkbGlzdGxvY2s7CisJeGFkX3QgKnhhZDsKKwlzNjQgeGFkZHI7CisJaW50IHhsZW47CisJc3RydWN0IHB4ZF9sb2NrICpweGRsb2NrOworCXN0cnVjdCB4ZGxpc3Rsb2NrICpweGRsaXN0bG9jazsKKwlweGRfdCAqcHhkOworCWludCBuOworCisJamZzX2luZm8oInR4RnJlZU1hcDogdGJsazoweCVwIG1hcGxvY2s6MHglcCBtYXB0eXBlOjB4JXgiLAorCQkgdGJsaywgbWFwbG9jaywgbWFwdHlwZSk7CisKKwkvKgorCSAqIGZyZWUgZnJvbSBwZXJzaXN0ZW50IG1hcDsKKwkgKi8KKwlpZiAobWFwdHlwZSA9PSBDT01NSVRfUE1BUCB8fCBtYXB0eXBlID09IENPTU1JVF9QV01BUCkgeworCQlpZiAobWFwbG9jay0+ZmxhZyAmIG1sY2tGUkVFWEFETElTVCkgeworCQkJeGFkbGlzdGxvY2sgPSAoc3RydWN0IHhkbGlzdGxvY2sgKikgbWFwbG9jazsKKwkJCXhhZCA9IHhhZGxpc3Rsb2NrLT54ZGxpc3Q7CisJCQlmb3IgKG4gPSAwOyBuIDwgeGFkbGlzdGxvY2stPmNvdW50OyBuKyssIHhhZCsrKSB7CisJCQkJaWYgKCEoeGFkLT5mbGFnICYgWEFEX05FVykpIHsKKwkJCQkJeGFkZHIgPSBhZGRyZXNzWEFEKHhhZCk7CisJCQkJCXhsZW4gPSBsZW5ndGhYQUQoeGFkKTsKKwkJCQkJZGJVcGRhdGVQTWFwKGlwYm1hcCwgVFJVRSwgeGFkZHIsCisJCQkJCQkgICAgIChzNjQpIHhsZW4sIHRibGspOworCQkJCQlqZnNfaW5mbygiZnJlZVBNYXA6IHhhZGRyOjB4JWx4ICIKKwkJCQkJCSAieGxlbjolZCIsCisJCQkJCQkgKHVsb25nKSB4YWRkciwgeGxlbik7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKG1hcGxvY2stPmZsYWcgJiBtbGNrRlJFRVBYRCkgeworCQkJcHhkbG9jayA9IChzdHJ1Y3QgcHhkX2xvY2sgKikgbWFwbG9jazsKKwkJCXhhZGRyID0gYWRkcmVzc1BYRCgmcHhkbG9jay0+cHhkKTsKKwkJCXhsZW4gPSBsZW5ndGhQWEQoJnB4ZGxvY2stPnB4ZCk7CisJCQlkYlVwZGF0ZVBNYXAoaXBibWFwLCBUUlVFLCB4YWRkciwgKHM2NCkgeGxlbiwKKwkJCQkgICAgIHRibGspOworCQkJamZzX2luZm8oImZyZWVQTWFwOiB4YWRkcjoweCVseCB4bGVuOiVkIiwKKwkJCQkgKHVsb25nKSB4YWRkciwgeGxlbik7CisJCX0gZWxzZSB7CS8qIChtYXBsb2NrLT5mbGFnICYgbWxja0FMTE9DUFhETElTVCkgKi8KKworCQkJcHhkbGlzdGxvY2sgPSAoc3RydWN0IHhkbGlzdGxvY2sgKikgbWFwbG9jazsKKwkJCXB4ZCA9IHB4ZGxpc3Rsb2NrLT54ZGxpc3Q7CisJCQlmb3IgKG4gPSAwOyBuIDwgcHhkbGlzdGxvY2stPmNvdW50OyBuKyssIHB4ZCsrKSB7CisJCQkJeGFkZHIgPSBhZGRyZXNzUFhEKHB4ZCk7CisJCQkJeGxlbiA9IGxlbmd0aFBYRChweGQpOworCQkJCWRiVXBkYXRlUE1hcChpcGJtYXAsIFRSVUUsIHhhZGRyLAorCQkJCQkgICAgIChzNjQpIHhsZW4sIHRibGspOworCQkJCWpmc19pbmZvKCJmcmVlUE1hcDogeGFkZHI6MHglbHggeGxlbjolZCIsCisJCQkJCSAodWxvbmcpIHhhZGRyLCB4bGVuKTsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogZnJlZSBmcm9tIHdvcmtpbmcgbWFwOworCSAqLworCWlmIChtYXB0eXBlID09IENPTU1JVF9QV01BUCB8fCBtYXB0eXBlID09IENPTU1JVF9XTUFQKSB7CisJCWlmIChtYXBsb2NrLT5mbGFnICYgbWxja0ZSRUVYQURMSVNUKSB7CisJCQl4YWRsaXN0bG9jayA9IChzdHJ1Y3QgeGRsaXN0bG9jayAqKSBtYXBsb2NrOworCQkJeGFkID0geGFkbGlzdGxvY2stPnhkbGlzdDsKKwkJCWZvciAobiA9IDA7IG4gPCB4YWRsaXN0bG9jay0+Y291bnQ7IG4rKywgeGFkKyspIHsKKwkJCQl4YWRkciA9IGFkZHJlc3NYQUQoeGFkKTsKKwkJCQl4bGVuID0gbGVuZ3RoWEFEKHhhZCk7CisJCQkJZGJGcmVlKGlwLCB4YWRkciwgKHM2NCkgeGxlbik7CisJCQkJeGFkLT5mbGFnID0gMDsKKwkJCQlqZnNfaW5mbygiZnJlZVdNYXA6IHhhZGRyOjB4JWx4IHhsZW46JWQiLAorCQkJCQkgKHVsb25nKSB4YWRkciwgeGxlbik7CisJCQl9CisJCX0gZWxzZSBpZiAobWFwbG9jay0+ZmxhZyAmIG1sY2tGUkVFUFhEKSB7CisJCQlweGRsb2NrID0gKHN0cnVjdCBweGRfbG9jayAqKSBtYXBsb2NrOworCQkJeGFkZHIgPSBhZGRyZXNzUFhEKCZweGRsb2NrLT5weGQpOworCQkJeGxlbiA9IGxlbmd0aFBYRCgmcHhkbG9jay0+cHhkKTsKKwkJCWRiRnJlZShpcCwgeGFkZHIsIChzNjQpIHhsZW4pOworCQkJamZzX2luZm8oImZyZWVXTWFwOiB4YWRkcjoweCVseCB4bGVuOiVkIiwKKwkJCQkgKHVsb25nKSB4YWRkciwgeGxlbik7CisJCX0gZWxzZSB7CS8qIChtYXBsb2NrLT5mbGFnICYgbWxja0ZSRUVQWERMSVNUKSAqLworCisJCQlweGRsaXN0bG9jayA9IChzdHJ1Y3QgeGRsaXN0bG9jayAqKSBtYXBsb2NrOworCQkJcHhkID0gcHhkbGlzdGxvY2stPnhkbGlzdDsKKwkJCWZvciAobiA9IDA7IG4gPCBweGRsaXN0bG9jay0+Y291bnQ7IG4rKywgcHhkKyspIHsKKwkJCQl4YWRkciA9IGFkZHJlc3NQWEQocHhkKTsKKwkJCQl4bGVuID0gbGVuZ3RoUFhEKHB4ZCk7CisJCQkJZGJGcmVlKGlwLCB4YWRkciwgKHM2NCkgeGxlbik7CisJCQkJamZzX2luZm8oImZyZWVXTWFwOiB4YWRkcjoweCVseCB4bGVuOiVkIiwKKwkJCQkJICh1bG9uZykgeGFkZHIsIHhsZW4pOworCQkJfQorCQl9CisJfQorfQorCisKKy8qCisgKiAgICAgIHR4RnJlZWxvY2soKQorICoKKyAqIGZ1bmN0aW9uOiAgICByZW1vdmUgdGxvY2sgZnJvbSBpbm9kZSBhbm9ueW1vdXMgbG9ja2xpc3QKKyAqLwordm9pZCB0eEZyZWVsb2NrKHN0cnVjdCBpbm9kZSAqaXApCit7CisJc3RydWN0IGpmc19pbm9kZV9pbmZvICpqZnNfaXAgPSBKRlNfSVAoaXApOworCXN0cnVjdCB0bG9jayAqeHRsY2ssICp0bGNrOworCWxpZF90IHhsaWQgPSAwLCBsaWQ7CisKKwlpZiAoIWpmc19pcC0+YXRsaGVhZCkKKwkJcmV0dXJuOworCisJVFhOX0xPQ0soKTsKKwl4dGxjayA9IChzdHJ1Y3QgdGxvY2sgKikgJmpmc19pcC0+YXRsaGVhZDsKKworCXdoaWxlICgobGlkID0geHRsY2stPm5leHQpICE9IDApIHsKKwkJdGxjayA9IGxpZF90b190bG9jayhsaWQpOworCQlpZiAodGxjay0+ZmxhZyAmIHRsY2tGUkVFTE9DSykgeworCQkJeHRsY2stPm5leHQgPSB0bGNrLT5uZXh0OworCQkJdHhMb2NrRnJlZShsaWQpOworCQl9IGVsc2UgeworCQkJeHRsY2sgPSB0bGNrOworCQkJeGxpZCA9IGxpZDsKKwkJfQorCX0KKworCWlmIChqZnNfaXAtPmF0bGhlYWQpCisJCWpmc19pcC0+YXRsdGFpbCA9IHhsaWQ7CisJZWxzZSB7CisJCWpmc19pcC0+YXRsdGFpbCA9IDA7CisJCS8qCisJCSAqIElmIGlub2RlIHdhcyBvbiBhbm9uX2xpc3QsIHJlbW92ZSBpdAorCQkgKi8KKwkJbGlzdF9kZWxfaW5pdCgmamZzX2lwLT5hbm9uX2lub2RlX2xpc3QpOworCX0KKwlUWE5fVU5MT0NLKCk7Cit9CisKKworLyoKKyAqICAgICAgdHhBYm9ydCgpCisgKgorICogZnVuY3Rpb246IGFib3J0IHR4IGJlZm9yZSBjb21taXQ7CisgKgorICogZnJlZXMgbGluZS1sb2NrcyBhbmQgc2VnbWVudCBsb2NrcyBmb3IgYWxsCisgKiBzZWdtZW50cyBpbiBjb21kYXRhIHN0cnVjdHVyZS4KKyAqIE9wdGlvbmFsbHkgc2V0cyBzdGF0ZSBvZiBmaWxlLXN5c3RlbSB0byBGTV9ESVJUWSBpbiBzdXBlci1ibG9jay4KKyAqIGxvZyBhZ2Ugb2YgcGFnZS1mcmFtZXMgaW4gbWVtb3J5IGZvciB3aGljaCBjYWxsZXIgaGFzCisgKiBhcmUgcmVzZXQgdG8gMCAodG8gYXZvaWQgbG9nd2FyYXApLgorICovCit2b2lkIHR4QWJvcnQodGlkX3QgdGlkLCBpbnQgZGlydHkpCit7CisJbGlkX3QgbGlkLCBuZXh0OworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJc3RydWN0IHRibG9jayAqdGJsayA9IHRpZF90b190YmxvY2sodGlkKTsKKwlzdHJ1Y3QgdGxvY2sgKnRsY2s7CisKKwkvKgorCSAqIGZyZWUgdGxvY2tzIG9mIHRoZSB0cmFuc2FjdGlvbgorCSAqLworCWZvciAobGlkID0gdGJsay0+bmV4dDsgbGlkOyBsaWQgPSBuZXh0KSB7CisJCXRsY2sgPSBsaWRfdG9fdGxvY2sobGlkKTsKKwkJbmV4dCA9IHRsY2stPm5leHQ7CisJCW1wID0gdGxjay0+bXA7CisJCUpGU19JUCh0bGNrLT5pcCktPnh0bGlkID0gMDsKKworCQlpZiAobXApIHsKKwkJCW1wLT5saWQgPSAwOworCisJCQkvKgorCQkJICogcmVzZXQgbHNuIG9mIHBhZ2UgdG8gYXZvaWQgbG9nd2FyYXA6CisJCQkgKgorCQkJICogKHBhZ2UgbWF5IGhhdmUgYmVlbiBwcmV2aW91c2x5IGNvbW1pdHRlZCBieSBhbm90aGVyCisJCQkgKiB0cmFuc2FjdGlvbihzKSBidXQgaGFzIG5vdCBiZWVuIHBhZ2VkLCBpLmUuLAorCQkJICogaXQgbWF5IGJlIG9uIGxvZ3N5bmMgbGlzdCBldmVuIHRob3VnaCBpdCBoYXMgbm90CisJCQkgKiBiZWVuIGxvZ2dlZCBmb3IgdGhlIGN1cnJlbnQgdHguKQorCQkJICovCisJCQlpZiAobXAtPnhmbGFnICYgQ09NTUlUX1BBR0UgJiYgbXAtPmxzbikKKwkJCQlMb2dTeW5jUmVsZWFzZShtcCk7CisJCX0KKwkJLyogaW5zZXJ0IHRsb2NrIGF0IGhlYWQgb2YgZnJlZWxpc3QgKi8KKwkJVFhOX0xPQ0soKTsKKwkJdHhMb2NrRnJlZShsaWQpOworCQlUWE5fVU5MT0NLKCk7CisJfQorCisJLyogY2FsbGVyIHdpbGwgZnJlZSB0aGUgdHJhbnNhY3Rpb24gYmxvY2sgKi8KKworCXRibGstPm5leHQgPSB0YmxrLT5sYXN0ID0gMDsKKworCS8qCisJICogbWFyayBmaWxlc3lzdGVtIGRpcnR5CisJICovCisJaWYgKGRpcnR5KQorCQlqZnNfZXJyb3IodGJsay0+c2IsICJ0eEFib3J0Iik7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiAgICAgIHR4TGF6eUNvbW1pdCh2b2lkKQorICoKKyAqCUFsbCB0cmFuc2FjdGlvbnMgZXhjZXB0IHRob3NlIGNoYW5naW5nIGlwaW1hcCAoQ09NTUlUX0ZPUkNFKSBhcmUKKyAqCXByb2Nlc3NlZCBieSB0aGlzIHJvdXRpbmUuICBUaGlzIGluc3VyZXMgdGhhdCB0aGUgaW5vZGUgYW5kIGJsb2NrCisgKglhbGxvY2F0aW9uIG1hcHMgYXJlIHVwZGF0ZWQgaW4gb3JkZXIuICBGb3Igc3luY2hyb25vdXMgdHJhbnNhY3Rpb25zLAorICoJbGV0IHRoZSB1c2VyIHRocmVhZCBmaW5pc2ggcHJvY2Vzc2luZyBhZnRlciB0eFVwZGF0ZU1hcCgpIGlzIGNhbGxlZC4KKyAqLworc3RhdGljIHZvaWQgdHhMYXp5Q29tbWl0KHN0cnVjdCB0YmxvY2sgKiB0YmxrKQoreworCXN0cnVjdCBqZnNfbG9nICpsb2c7CisKKwl3aGlsZSAoKCh0YmxrLT5mbGFnICYgdGJsa0dDX1JFQURZKSA9PSAwKSAmJgorCSAgICAgICAoKHRibGstPmZsYWcgJiB0YmxrR0NfVU5MT0NLRUQpID09IDApKSB7CisJCS8qIFdlIG11c3QgaGF2ZSBnb3R0ZW4gYWhlYWQgb2YgdGhlIHVzZXIgdGhyZWFkCisJCSAqLworCQlqZnNfaW5mbygiamZzX2xhenljb21taXQ6IHRibGsgMHglcCBub3QgdW5sb2NrZWQiLCB0YmxrKTsKKwkJeWllbGQoKTsKKwl9CisKKwlqZnNfaW5mbygidHhMYXp5Q29tbWl0OiBwcm9jZXNzaW5nIHRibGsgMHglcCIsIHRibGspOworCisJdHhVcGRhdGVNYXAodGJsayk7CisKKwlsb2cgPSAoc3RydWN0IGpmc19sb2cgKikgSkZTX1NCSSh0YmxrLT5zYiktPmxvZzsKKworCXNwaW5fbG9ja19pcnEoJmxvZy0+Z2Nsb2NrKTsJLy8gTE9HR0NfTE9DSworCisJdGJsay0+ZmxhZyB8PSB0YmxrR0NfQ09NTUlUVEVEOworCisJaWYgKHRibGstPmZsYWcgJiB0YmxrR0NfUkVBRFkpCisJCWxvZy0+Z2NydGMtLTsKKworCXdha2VfdXBfYWxsKCZ0YmxrLT5nY3dhaXQpOwkvLyBMT0dHQ19XQUtFVVAKKworCS8qCisJICogQ2FuJ3QgcmVsZWFzZSBsb2ctPmdjbG9jayB1bnRpbCB3ZSd2ZSB0ZXN0ZWQgdGJsay0+ZmxhZworCSAqLworCWlmICh0YmxrLT5mbGFnICYgdGJsa0dDX0xBWlkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZsb2ctPmdjbG9jayk7CS8vIExPR0dDX1VOTE9DSworCQl0eFVubG9jayh0YmxrKTsKKwkJdGJsay0+ZmxhZyAmPSB+dGJsa0dDX0xBWlk7CisJCXR4RW5kKHRibGsgLSBUeEJsb2NrKTsJLyogQ29udmVydCBiYWNrIHRvIHRpZCAqLworCX0gZWxzZQorCQlzcGluX3VubG9ja19pcnEoJmxvZy0+Z2Nsb2NrKTsJLy8gTE9HR0NfVU5MT0NLCisKKwlqZnNfaW5mbygidHhMYXp5Q29tbWl0OiBkb25lOiB0YmxrID0gMHglcCIsIHRibGspOworfQorCisvKgorICogICAgICBqZnNfbGF6eWNvbW1pdCh2b2lkKQorICoKKyAqCVRvIGJlIHJ1biBhcyBhIGtlcm5lbCBkYWVtb24uICBJZiBsYm1JT0RvbmUgaXMgY2FsbGVkIGluIGFuIGludGVycnVwdAorICoJY29udGV4dCwgb3Igd2hlcmUgYmxvY2tpbmcgaXMgbm90IHdhbnRlZCwgdGhpcyByb3V0aW5lIHdpbGwgcHJvY2VzcworICoJY29tbWl0dGVkIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSB1bmxvY2sgcXVldWUuCisgKi8KK2ludCBqZnNfbGF6eWNvbW1pdCh2b2lkICphcmcpCit7CisJaW50IFdvcmtEb25lOworCXN0cnVjdCB0YmxvY2sgKnRibGs7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgamZzX3NiX2luZm8gKnNiaTsKKworCWRhZW1vbml6ZSgiamZzQ29tbWl0Iik7CisKKwljb21wbGV0ZSgmamZzSU93YWl0KTsKKworCWRvIHsKKwkJTEFaWV9MT0NLKGZsYWdzKTsKKwkJamZzX2NvbW1pdF90aHJlYWRfd2FraW5nID0gMDsJLyogT0sgdG8gd2FrZSBhbm90aGVyIHRocmVhZCAqLworCQl3aGlsZSAoIWxpc3RfZW1wdHkoJlR4QW5jaG9yLnVubG9ja19xdWV1ZSkpIHsKKwkJCVdvcmtEb25lID0gMDsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkodGJsaywgJlR4QW5jaG9yLnVubG9ja19xdWV1ZSwKKwkJCQkJICAgIGNxdWV1ZSkgeworCisJCQkJc2JpID0gSkZTX1NCSSh0YmxrLT5zYik7CisJCQkJLyoKKwkJCQkgKiBGb3IgZWFjaCB2b2x1bWUsIHRoZSB0cmFuc2FjdGlvbnMgbXVzdCBiZQorCQkJCSAqIGhhbmRsZWQgaW4gb3JkZXIuICBJZiBhbm90aGVyIGNvbW1pdCB0aHJlYWQKKwkJCQkgKiBpcyBoYW5kbGluZyBhIHRibGsgZm9yIHRoaXMgc3VwZXJibG9jaywKKwkJCQkgKiBza2lwIGl0CisJCQkJICovCisJCQkJaWYgKHNiaS0+Y29tbWl0X3N0YXRlICYgSU5fTEFaWUNPTU1JVCkKKwkJCQkJY29udGludWU7CisKKwkJCQlzYmktPmNvbW1pdF9zdGF0ZSB8PSBJTl9MQVpZQ09NTUlUOworCQkJCVdvcmtEb25lID0gMTsKKworCQkJCS8qCisJCQkJICogUmVtb3ZlIHRyYW5zYWN0aW9uIGZyb20gcXVldWUKKwkJCQkgKi8KKwkJCQlsaXN0X2RlbCgmdGJsay0+Y3F1ZXVlKTsKKworCQkJCUxBWllfVU5MT0NLKGZsYWdzKTsKKwkJCQl0eExhenlDb21taXQodGJsayk7CisJCQkJTEFaWV9MT0NLKGZsYWdzKTsKKworCQkJCXNiaS0+Y29tbWl0X3N0YXRlICY9IH5JTl9MQVpZQ09NTUlUOworCQkJCS8qCisJCQkJICogRG9uJ3QgY29udGludWUgaW4gdGhlIGZvciBsb29wLiAgKFdlIGNhbid0CisJCQkJICogYW55d2F5LCBpdCdzIHVuc2FmZSEpICBXZSB3YW50IHRvIGdvIGJhY2sgdG8KKwkJCQkgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0LgorCQkJCSAqLworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBJZiB0aGVyZSB3YXMgbm90aGluZyB0byBkbywgZG9uJ3QgY29udGludWUgKi8KKwkJCWlmICghV29ya0RvbmUpCisJCQkJYnJlYWs7CisJCX0KKwkJLyogSW4gY2FzZSBhIHdha2V1cCBjYW1lIHdoaWxlIGFsbCB0aHJlYWRzIHdlcmUgYWN0aXZlICovCisJCWpmc19jb21taXRfdGhyZWFkX3dha2luZyA9IDA7CisKKwkJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfRlJFRVpFKSB7CisJCQlMQVpZX1VOTE9DSyhmbGFncyk7CisJCQlyZWZyaWdlcmF0b3IoUEZfRlJFRVpFKTsKKwkJfSBlbHNlIHsKKwkJCURFQ0xBUkVfV0FJVFFVRVVFKHdxLCBjdXJyZW50KTsKKworCQkJYWRkX3dhaXRfcXVldWUoJmpmc19jb21taXRfdGhyZWFkX3dhaXQsICZ3cSk7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJTEFaWV9VTkxPQ0soZmxhZ3MpOworCQkJc2NoZWR1bGUoKTsKKwkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmpmc19jb21taXRfdGhyZWFkX3dhaXQsICZ3cSk7CisJCX0KKwl9IHdoaWxlICghamZzX3N0b3BfdGhyZWFkcyk7CisKKwlpZiAoIWxpc3RfZW1wdHkoJlR4QW5jaG9yLnVubG9ja19xdWV1ZSkpCisJCWpmc19lcnIoImpmc19sYXp5Y29tbWl0IGJlaW5nIGtpbGxlZCB3L3BlbmRpbmcgdHJhbnNhY3Rpb25zISIpOworCWVsc2UKKwkJamZzX2luZm8oImpmc19sYXp5Y29tbWl0IGJlaW5nIGtpbGxlZFxuIik7CisJY29tcGxldGVfYW5kX2V4aXQoJmpmc0lPd2FpdCwgMCk7Cit9CisKK3ZvaWQgdHhMYXp5VW5sb2NrKHN0cnVjdCB0YmxvY2sgKiB0YmxrKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlMQVpZX0xPQ0soZmxhZ3MpOworCisJbGlzdF9hZGRfdGFpbCgmdGJsay0+Y3F1ZXVlLCAmVHhBbmNob3IudW5sb2NrX3F1ZXVlKTsKKwkvKgorCSAqIERvbid0IHdha2UgdXAgYSBjb21taXQgdGhyZWFkIGlmIHRoZXJlIGlzIGFscmVhZHkgb25lIHNlcnZpY2luZworCSAqIHRoaXMgc3VwZXJibG9jaywgb3IgaWYgdGhlIGxhc3Qgb25lIHdlIHdva2UgdXAgaGFzbid0IHN0YXJ0ZWQgeWV0LgorCSAqLworCWlmICghKEpGU19TQkkodGJsay0+c2IpLT5jb21taXRfc3RhdGUgJiBJTl9MQVpZQ09NTUlUKSAmJgorCSAgICAhamZzX2NvbW1pdF90aHJlYWRfd2FraW5nKSB7CisJCWpmc19jb21taXRfdGhyZWFkX3dha2luZyA9IDE7CisJCXdha2VfdXAoJmpmc19jb21taXRfdGhyZWFkX3dhaXQpOworCX0KKwlMQVpZX1VOTE9DSyhmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIExvZ1N5bmNSZWxlYXNlKHN0cnVjdCBtZXRhcGFnZSAqIG1wKQoreworCXN0cnVjdCBqZnNfbG9nICpsb2cgPSBtcC0+bG9nOworCisJYXNzZXJ0KGF0b21pY19yZWFkKCZtcC0+bm9ob21lb2spKTsKKwlhc3NlcnQobG9nKTsKKwlhdG9taWNfZGVjKCZtcC0+bm9ob21lb2spOworCisJaWYgKGF0b21pY19yZWFkKCZtcC0+bm9ob21lb2spKQorCQlyZXR1cm47CisKKwlob2xkX21ldGFwYWdlKG1wLCAwKTsKKworCUxPR1NZTkNfTE9DSyhsb2cpOworCW1wLT5sb2cgPSBOVUxMOworCW1wLT5sc24gPSAwOworCW1wLT5jbHNuID0gMDsKKwlsb2ctPmNvdW50LS07CisJbGlzdF9kZWxfaW5pdCgmbXAtPnN5bmNsaXN0KTsKKwlMT0dTWU5DX1VOTE9DSyhsb2cpOworCisJcmVsZWFzZV9tZXRhcGFnZShtcCk7Cit9CisKKy8qCisgKgl0eFF1aWVzY2UKKyAqCisgKglCbG9jayBhbGwgbmV3IHRyYW5zYWN0aW9ucyBhbmQgcHVzaCBhbm9ueW1vdXMgdHJhbnNhY3Rpb25zIHRvCisgKgljb21wbGV0aW9uCisgKgorICoJVGhpcyBkb2VzIGFsbW9zdCB0aGUgc2FtZSB0aGluZyBhcyBqZnNfc3luYyBiZWxvdy4gIFdlIGRvbid0CisgKgl3b3JyeSBhYm91dCBkZWFkbG9ja2luZyB3aGVuIGpmc190bG9ja3NfbG93IGlzIHNldCwgc2luY2Ugd2Ugd291bGQKKyAqCWV4cGVjdCBqZnNfc3luYyB0byBnZXQgdXMgb3V0IG9mIHRoYXQgamFtLgorICovCit2b2lkIHR4UXVpZXNjZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBpbm9kZSAqaXA7CisJc3RydWN0IGpmc19pbm9kZV9pbmZvICpqZnNfaXA7CisJc3RydWN0IGpmc19sb2cgKmxvZyA9IEpGU19TQkkoc2IpLT5sb2c7CisJdGlkX3QgdGlkOworCisJc2V0X2JpdChsb2dfUVVJRVNDRSwgJmxvZy0+ZmxhZyk7CisKKwlUWE5fTE9DSygpOworcmVzdGFydDoKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJlR4QW5jaG9yLmFub25fbGlzdCkpIHsKKwkJamZzX2lwID0gbGlzdF9lbnRyeShUeEFuY2hvci5hbm9uX2xpc3QubmV4dCwKKwkJCQkgICAgc3RydWN0IGpmc19pbm9kZV9pbmZvLAorCQkJCSAgICBhbm9uX2lub2RlX2xpc3QpOworCQlpcCA9ICZqZnNfaXAtPnZmc19pbm9kZTsKKworCQkvKgorCQkgKiBpbm9kZSB3aWxsIGJlIHJlbW92ZWQgZnJvbSBhbm9ueW1vdXMgbGlzdAorCQkgKiB3aGVuIGl0IGlzIGNvbW1pdHRlZAorCQkgKi8KKwkJVFhOX1VOTE9DSygpOworCQl0aWQgPSB0eEJlZ2luKGlwLT5pX3NiLCBDT01NSVRfSU5PREUgfCBDT01NSVRfRk9SQ0UpOworCQlkb3duKCZqZnNfaXAtPmNvbW1pdF9zZW0pOworCQl0eENvbW1pdCh0aWQsIDEsICZpcCwgMCk7CisJCXR4RW5kKHRpZCk7CisJCXVwKCZqZnNfaXAtPmNvbW1pdF9zZW0pOworCQkvKgorCQkgKiBKdXN0IHRvIGJlIHNhZmUuICBJIGRvbid0IGtub3cgaG93CisJCSAqIGxvbmcgd2UgY2FuIHJ1biB3aXRob3V0IGJsb2NraW5nCisJCSAqLworCQljb25kX3Jlc2NoZWQoKTsKKwkJVFhOX0xPQ0soKTsKKwl9CisKKwkvKgorCSAqIElmIGpmc19zeW5jIGlzIHJ1bm5pbmcgaW4gcGFyYWxsZWwsIHRoZXJlIGNvdWxkIGJlIHNvbWUgaW5vZGVzCisJICogb24gYW5vbl9saXN0Mi4gIExldCdzIGNoZWNrLgorCSAqLworCWlmICghbGlzdF9lbXB0eSgmVHhBbmNob3IuYW5vbl9saXN0MikpIHsKKwkJbGlzdF9zcGxpY2UoJlR4QW5jaG9yLmFub25fbGlzdDIsICZUeEFuY2hvci5hbm9uX2xpc3QpOworCQlJTklUX0xJU1RfSEVBRCgmVHhBbmNob3IuYW5vbl9saXN0Mik7CisJCWdvdG8gcmVzdGFydDsKKwl9CisJVFhOX1VOTE9DSygpOworCisJLyoKKwkgKiBXZSBtYXkgbmVlZCB0byBraWNrIG9mZiB0aGUgZ3JvdXAgY29tbWl0CisJICovCisJamZzX2ZsdXNoX2pvdXJuYWwobG9nLCAwKTsKK30KKworLyoKKyAqIHR4UmVzdW1lKCkKKyAqCisgKiBBbGxvd3MgdHJhbnNhY3Rpb25zIHRvIHN0YXJ0IGFnYWluIGZvbGxvd2luZyB0eFF1aWVzY2UKKyAqLwordm9pZCB0eFJlc3VtZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBqZnNfbG9nICpsb2cgPSBKRlNfU0JJKHNiKS0+bG9nOworCisJY2xlYXJfYml0KGxvZ19RVUlFU0NFLCAmbG9nLT5mbGFnKTsKKwlUWE5fV0FLRVVQKCZsb2ctPnN5bmN3YWl0KTsKK30KKworLyoKKyAqICAgICAgamZzX3N5bmModm9pZCkKKyAqCisgKglUbyBiZSBydW4gYXMgYSBrZXJuZWwgZGFlbW9uLiAgVGhpcyBpcyBhd2FrZW5lZCB3aGVuIHRsb2NrcyBydW4gbG93LgorICoJV2Ugd3JpdGUgYW55IGlub2RlcyB0aGF0IGhhdmUgYW5vbnltb3VzIHRsb2NrcyBzbyB0aGV5IHdpbGwgYmVjb21lCisgKglhdmFpbGFibGUuCisgKi8KK2ludCBqZnNfc3luYyh2b2lkICphcmcpCit7CisJc3RydWN0IGlub2RlICppcDsKKwlzdHJ1Y3QgamZzX2lub2RlX2luZm8gKmpmc19pcDsKKwlpbnQgcmM7CisJdGlkX3QgdGlkOworCisJZGFlbW9uaXplKCJqZnNTeW5jIik7CisKKwljb21wbGV0ZSgmamZzSU93YWl0KTsKKworCWRvIHsKKwkJLyoKKwkJICogd3JpdGUgZWFjaCBpbm9kZSBvbiB0aGUgYW5vbnltb3VzIGlub2RlIGxpc3QKKwkJICovCisJCVRYTl9MT0NLKCk7CisJCXdoaWxlIChqZnNfdGxvY2tzX2xvdyAmJiAhbGlzdF9lbXB0eSgmVHhBbmNob3IuYW5vbl9saXN0KSkgeworCQkJamZzX2lwID0gbGlzdF9lbnRyeShUeEFuY2hvci5hbm9uX2xpc3QubmV4dCwKKwkJCQkJICAgIHN0cnVjdCBqZnNfaW5vZGVfaW5mbywKKwkJCQkJICAgIGFub25faW5vZGVfbGlzdCk7CisJCQlpcCA9ICZqZnNfaXAtPnZmc19pbm9kZTsKKworCQkJaWYgKCEgaWdyYWIoaXApKSB7CisJCQkJLyoKKwkJCQkgKiBJbm9kZSBpcyBiZWluZyBmcmVlZAorCQkJCSAqLworCQkJCWxpc3RfZGVsX2luaXQoJmpmc19pcC0+YW5vbl9pbm9kZV9saXN0KTsKKwkJCX0gZWxzZSBpZiAoISBkb3duX3RyeWxvY2soJmpmc19pcC0+Y29tbWl0X3NlbSkpIHsKKwkJCQkvKgorCQkJCSAqIGlub2RlIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIGFub255bW91cyBsaXN0CisJCQkJICogd2hlbiBpdCBpcyBjb21taXR0ZWQKKwkJCQkgKi8KKwkJCQlUWE5fVU5MT0NLKCk7CisJCQkJdGlkID0gdHhCZWdpbihpcC0+aV9zYiwgQ09NTUlUX0lOT0RFKTsKKwkJCQlyYyA9IHR4Q29tbWl0KHRpZCwgMSwgJmlwLCAwKTsKKwkJCQl0eEVuZCh0aWQpOworCQkJCXVwKCZqZnNfaXAtPmNvbW1pdF9zZW0pOworCisJCQkJaXB1dChpcCk7CisJCQkJLyoKKwkJCQkgKiBKdXN0IHRvIGJlIHNhZmUuICBJIGRvbid0IGtub3cgaG93CisJCQkJICogbG9uZyB3ZSBjYW4gcnVuIHdpdGhvdXQgYmxvY2tpbmcKKwkJCQkgKi8KKwkJCQljb25kX3Jlc2NoZWQoKTsKKwkJCQlUWE5fTE9DSygpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBXZSBjYW4ndCBnZXQgdGhlIGNvbW1pdCBzZW1hcGhvcmUuICBJdCBtYXkKKwkJCQkgKiBiZSBoZWxkIGJ5IGEgdGhyZWFkIHdhaXRpbmcgZm9yIHRsb2NrJ3MKKwkJCQkgKiBzbyBsZXQncyBub3QgYmxvY2sgaGVyZS4gIFNhdmUgaXQgdG8KKwkJCQkgKiBwdXQgYmFjayBvbiB0aGUgYW5vbl9saXN0LgorCQkJCSAqLworCisJCQkJLyogVGFrZSBvZmYgYW5vbl9saXN0ICovCisJCQkJbGlzdF9kZWwoJmpmc19pcC0+YW5vbl9pbm9kZV9saXN0KTsKKworCQkJCS8qIFB1dCBvbiBhbm9uX2xpc3QyICovCisJCQkJbGlzdF9hZGQoJmpmc19pcC0+YW5vbl9pbm9kZV9saXN0LAorCQkJCQkgJlR4QW5jaG9yLmFub25fbGlzdDIpOworCisJCQkJVFhOX1VOTE9DSygpOworCQkJCWlwdXQoaXApOworCQkJCVRYTl9MT0NLKCk7CisJCQl9CisJCX0KKwkJLyogQWRkIGFub25fbGlzdDIgYmFjayB0byBhbm9uX2xpc3QgKi8KKwkJbGlzdF9zcGxpY2VfaW5pdCgmVHhBbmNob3IuYW5vbl9saXN0MiwgJlR4QW5jaG9yLmFub25fbGlzdCk7CisKKwkJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfRlJFRVpFKSB7CisJCQlUWE5fVU5MT0NLKCk7CisJCQlyZWZyaWdlcmF0b3IoUEZfRlJFRVpFKTsKKwkJfSBlbHNlIHsKKwkJCURFQ0xBUkVfV0FJVFFVRVVFKHdxLCBjdXJyZW50KTsKKworCQkJYWRkX3dhaXRfcXVldWUoJmpmc19zeW5jX3RocmVhZF93YWl0LCAmd3EpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCVRYTl9VTkxPQ0soKTsKKwkJCXNjaGVkdWxlKCk7CisJCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwkJCXJlbW92ZV93YWl0X3F1ZXVlKCZqZnNfc3luY190aHJlYWRfd2FpdCwgJndxKTsKKwkJfQorCX0gd2hpbGUgKCFqZnNfc3RvcF90aHJlYWRzKTsKKworCWpmc19pbmZvKCJqZnNfc3luYyBiZWluZyBraWxsZWQiKTsKKwljb21wbGV0ZV9hbmRfZXhpdCgmamZzSU93YWl0LCAwKTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpICYmIGRlZmluZWQoQ09ORklHX0pGU19ERUJVRykKK2ludCBqZnNfdHhhbmNob3JfcmVhZChjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgbGVuZ3RoLAorCQkgICAgICBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgbGVuID0gMDsKKwlvZmZfdCBiZWdpbjsKKwljaGFyICpmcmVld2FpdDsKKwljaGFyICpmcmVlbG9ja3dhaXQ7CisJY2hhciAqbG93bG9ja3dhaXQ7CisKKwlmcmVld2FpdCA9CisJICAgIHdhaXRxdWV1ZV9hY3RpdmUoJlR4QW5jaG9yLmZyZWV3YWl0KSA/ICJhY3RpdmUiIDogImVtcHR5IjsKKwlmcmVlbG9ja3dhaXQgPQorCSAgICB3YWl0cXVldWVfYWN0aXZlKCZUeEFuY2hvci5mcmVlbG9ja3dhaXQpID8gImFjdGl2ZSIgOiAiZW1wdHkiOworCWxvd2xvY2t3YWl0ID0KKwkgICAgd2FpdHF1ZXVlX2FjdGl2ZSgmVHhBbmNob3IubG93bG9ja3dhaXQpID8gImFjdGl2ZSIgOiAiZW1wdHkiOworCisJbGVuICs9IHNwcmludGYoYnVmZmVyLAorCQkgICAgICAgIkpGUyBUeEFuY2hvclxuIgorCQkgICAgICAgIj09PT09PT09PT09PVxuIgorCQkgICAgICAgImZyZWV0aWQgPSAlZFxuIgorCQkgICAgICAgImZyZWV3YWl0ID0gJXNcbiIKKwkJICAgICAgICJmcmVlbG9jayA9ICVkXG4iCisJCSAgICAgICAiZnJlZWxvY2t3YWl0ID0gJXNcbiIKKwkJICAgICAgICJsb3dsb2Nrd2FpdCA9ICVzXG4iCisJCSAgICAgICAidGxvY2tzSW5Vc2UgPSAlZFxuIgorCQkgICAgICAgImpmc190bG9ja3NfbG93ID0gJWRcbiIKKwkJICAgICAgICJ1bmxvY2tfcXVldWUgaXMgJXNlbXB0eVxuIiwKKwkJICAgICAgIFR4QW5jaG9yLmZyZWV0aWQsCisJCSAgICAgICBmcmVld2FpdCwKKwkJICAgICAgIFR4QW5jaG9yLmZyZWVsb2NrLAorCQkgICAgICAgZnJlZWxvY2t3YWl0LAorCQkgICAgICAgbG93bG9ja3dhaXQsCisJCSAgICAgICBUeEFuY2hvci50bG9ja3NJblVzZSwKKwkJICAgICAgIGpmc190bG9ja3NfbG93LAorCQkgICAgICAgbGlzdF9lbXB0eSgmVHhBbmNob3IudW5sb2NrX3F1ZXVlKSA/ICIiIDogIm5vdCAiKTsKKworCWJlZ2luID0gb2Zmc2V0OworCSpzdGFydCA9IGJ1ZmZlciArIGJlZ2luOworCWxlbiAtPSBiZWdpbjsKKworCWlmIChsZW4gPiBsZW5ndGgpCisJCWxlbiA9IGxlbmd0aDsKKwllbHNlCisJCSplb2YgPSAxOworCisJaWYgKGxlbiA8IDApCisJCWxlbiA9IDA7CisKKwlyZXR1cm4gbGVuOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19QUk9DX0ZTKSAmJiBkZWZpbmVkKENPTkZJR19KRlNfU1RBVElTVElDUykKK2ludCBqZnNfdHhzdGF0c19yZWFkKGNoYXIgKmJ1ZmZlciwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmZzZXQsIGludCBsZW5ndGgsCisJCSAgICAgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaW50IGxlbiA9IDA7CisJb2ZmX3QgYmVnaW47CisKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIsCisJCSAgICAgICAiSkZTIFR4U3RhdHNcbiIKKwkJICAgICAgICI9PT09PT09PT09PVxuIgorCQkgICAgICAgImNhbGxzIHRvIHR4QmVnaW4gPSAlZFxuIgorCQkgICAgICAgInR4QmVnaW4gYmxvY2tlZCBieSBzeW5jIGJhcnJpZXIgPSAlZFxuIgorCQkgICAgICAgInR4QmVnaW4gYmxvY2tlZCBieSB0bG9ja3MgbG93ID0gJWRcbiIKKwkJICAgICAgICJ0eEJlZ2luIGJsb2NrZWQgYnkgbm8gZnJlZSB0aWQgPSAlZFxuIgorCQkgICAgICAgImNhbGxzIHRvIHR4QmVnaW5Bbm9uID0gJWRcbiIKKwkJICAgICAgICJ0eEJlZ2luQW5vbiBibG9ja2VkIGJ5IHN5bmMgYmFycmllciA9ICVkXG4iCisJCSAgICAgICAidHhCZWdpbkFub24gYmxvY2tlZCBieSB0bG9ja3MgbG93ID0gJWRcbiIKKwkJICAgICAgICJjYWxscyB0byB0eExvY2tBbGxvYyA9ICVkXG4iCisJCSAgICAgICAidExvY2tBbGxvYyBibG9ja2VkIGJ5IG5vIGZyZWUgbG9jayA9ICVkXG4iLAorCQkgICAgICAgVHhTdGF0LnR4QmVnaW4sCisJCSAgICAgICBUeFN0YXQudHhCZWdpbl9iYXJyaWVyLAorCQkgICAgICAgVHhTdGF0LnR4QmVnaW5fbG9ja3Nsb3csCisJCSAgICAgICBUeFN0YXQudHhCZWdpbl9mcmVldGlkLAorCQkgICAgICAgVHhTdGF0LnR4QmVnaW5Bbm9uLAorCQkgICAgICAgVHhTdGF0LnR4QmVnaW5Bbm9uX2JhcnJpZXIsCisJCSAgICAgICBUeFN0YXQudHhCZWdpbkFub25fbG9ja3Nsb3csCisJCSAgICAgICBUeFN0YXQudHhMb2NrQWxsb2MsCisJCSAgICAgICBUeFN0YXQudHhMb2NrQWxsb2NfZnJlZWxvY2spOworCisJYmVnaW4gPSBvZmZzZXQ7CisJKnN0YXJ0ID0gYnVmZmVyICsgYmVnaW47CisJbGVuIC09IGJlZ2luOworCisJaWYgKGxlbiA+IGxlbmd0aCkKKwkJbGVuID0gbGVuZ3RoOworCWVsc2UKKwkJKmVvZiA9IDE7CisKKwlpZiAobGVuIDwgMCkKKwkJbGVuID0gMDsKKworCXJldHVybiBsZW47Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfdHhubWdyLmggYi9mcy9qZnMvamZzX3R4bm1nci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MWI4MmMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZnMvamZzX3R4bm1nci5oCkBAIC0wLDAgKzEsMzE4IEBACisvKgorICogICBDb3B5cmlnaHQgKEMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDAtMjAwNAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7ICB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIAorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7ICB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgKiAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07ICBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaWZuZGVmIF9IX0pGU19UWE5NR1IKKyNkZWZpbmUgX0hfSkZTX1RYTk1HUgorCisjaW5jbHVkZSAiamZzX2xvZ21nci5oIgorCisvKgorICogSGlkZSBpbXBsZW1lbnRhdGlvbiBvZiBUeEJsb2NrIGFuZCBUeExvY2sKKyAqLworI2RlZmluZSB0aWRfdG9fdGJsb2NrKHRpZCkgKCZUeEJsb2NrW3RpZF0pCisKKyNkZWZpbmUgbGlkX3RvX3Rsb2NrKGxpZCkgKCZUeExvY2tbbGlkXSkKKworLyoKKyAqCXRyYW5zYWN0aW9uIGJsb2NrCisgKi8KK3N0cnVjdCB0YmxvY2sgeworCS8qCisJICogdGJsb2NrIGFuZCBqYnVmX3QgY29tbW9uIGFyZWE6IHN0cnVjdCBsb2dzeW5jYmxrCisJICoKKwkgKiB0aGUgZm9sbG93aW5nIDUgZmllbGRzIGFyZSB0aGUgc2FtZSBhcyBzdHJ1Y3QgbG9nc3luY2JsaworCSAqIHdoaWNoIGlzIGNvbW1vbiB0byB0YmxvY2sgYW5kIGpidWYgdG8gZm9ybSBsb2dzeW5jbGlzdAorCSAqLworCXUxNiB4ZmxhZzsJCS8qIHR4IGNvbW1pdCB0eXBlICovCisJdTE2IGZsYWc7CQkvKiB0eCBjb21taXQgc3RhdGUgKi8KKwlsaWRfdCBkdW1teTsJCS8qIE11c3Qga2VlcCBzdHJ1Y3R1cmVzIGNvbW1vbiAqLworCXMzMiBsc247CQkvKiByZWNvdmVyeSBsc24gKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHN5bmNsaXN0OwkvKiBsb2dzeW5jbGlzdCBsaW5rICovCisKKwkvKiBsb2NrIG1hbmFnZW1lbnQgKi8KKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwkvKiBzdXBlciBibG9jayAqLworCWxpZF90IG5leHQ7CQkvKiBpbmRleCBvZiBmaXJzdCB0bG9jayBvZiB0aWQgKi8KKwlsaWRfdCBsYXN0OwkJLyogaW5kZXggb2YgbGFzdCB0bG9jayBvZiB0aWQgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0b3I7CS8qIHRpZHMgd2FpdGluZyBvbiB0aGlzIHRpZCAqLworCisJLyogbG9nIG1hbmFnZW1lbnQgKi8KKwl1MzIgbG9ndGlkOwkJLyogbG9nIHRyYW5zYWN0aW9uIGlkICovCisKKwkvKiBjb21taXQgbWFuYWdlbWVudCAqLworCXN0cnVjdCBsaXN0X2hlYWQgY3F1ZXVlOwkvKiBjb21taXQgcXVldWUgbGlzdCAqLworCXMzMiBjbHNuOwkJLyogY29tbWl0IGxzbiAqLworCXN0cnVjdCBsYnVmICpicDsKKwlzMzIgcG47CQkJLyogY29tbWl0IHJlY29yZCBsb2cgcGFnZSBudW1iZXIgKi8KKwlzMzIgZW9yOwkJLyogY29tbWl0IHJlY29yZCBlb3IgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBnY3dhaXQ7CS8qIGdyb3VwIGNvbW1pdCBldmVudCBsaXN0OgorCQkJCQkgKiByZWFkeSB0cmFuc2FjdGlvbnMgd2FpdCBvbiB0aGlzCisJCQkJCSAqIGV2ZW50IGZvciBncm91cCBjb21taXQgY29tcGxldGlvbi4KKwkJCQkJICovCisJdW5pb24geworCQlzdHJ1Y3QgaW5vZGUgKmlwOyAvKiBpbm9kZSBiZWluZyBkZWxldGVkICovCisJCXB4ZF90IGl4cHhkOwkvKiBweGQgb2YgaW5vZGUgZXh0ZW50IGZvciBjcmVhdGVkIGlub2RlICovCisJfSB1OworCXUzMiBpbm87CQkvKiBpbm9kZSBudW1iZXIgYmVpbmcgY3JlYXRlZCAqLworfTsKKworZXh0ZXJuIHN0cnVjdCB0YmxvY2sgKlR4QmxvY2s7CS8qIHRyYW5zYWN0aW9uIGJsb2NrIHRhYmxlICovCisKKy8qIGNvbW1pdCBmbGFnczogdGJsay0+eGZsYWcgKi8KKyNkZWZpbmUJQ09NTUlUX1NZTkMJMHgwMDAxCS8qIHN5bmNocm9ub3VzIGNvbW1pdCAqLworI2RlZmluZQlDT01NSVRfRk9SQ0UJMHgwMDAyCS8qIGZvcmNlIHBhZ2VvdXQgYXQgZW5kIG9mIGNvbW1pdCAqLworI2RlZmluZQlDT01NSVRfRkxVU0gJMHgwMDA0CS8qIGluaXQgZmx1c2ggYXQgZW5kIG9mIGNvbW1pdCAqLworI2RlZmluZSBDT01NSVRfTUFQCTB4MDBmMAorI2RlZmluZQlDT01NSVRfUE1BUAkweDAwMTAJLyogdXBkYXRlIHBtYXAgKi8KKyNkZWZpbmUJQ09NTUlUX1dNQVAJMHgwMDIwCS8qIHVwZGF0ZSB3bWFwICovCisjZGVmaW5lCUNPTU1JVF9QV01BUAkweDAwNDAJLyogdXBkYXRlIHB3bWFwICovCisjZGVmaW5lCUNPTU1JVF9GUkVFCTB4MGYwMAorI2RlZmluZQlDT01NSVRfREVMRVRFCTB4MDEwMAkvKiBpbm9kZSBkZWxldGUgKi8KKyNkZWZpbmUJQ09NTUlUX1RSVU5DQVRFCTB4MDIwMAkvKiBmaWxlIHRydW5jYXRpb24gKi8KKyNkZWZpbmUJQ09NTUlUX0NSRUFURQkweDA0MDAJLyogaW5vZGUgY3JlYXRlICovCisjZGVmaW5lCUNPTU1JVF9MQVpZCTB4MDgwMAkvKiBsYXp5IGNvbW1pdCAqLworI2RlZmluZSBDT01NSVRfUEFHRQkweDEwMDAJLyogSWRlbnRpZmllcyBlbGVtZW50IGFzIG1ldGFwYWdlICovCisjZGVmaW5lIENPTU1JVF9JTk9ERQkweDIwMDAJLyogSWRlbnRpZmllcyBlbGVtZW50IGFzIGlub2RlICovCisKKy8qIGdyb3VwIGNvbW1pdCBmbGFncyB0YmxrLT5mbGFnOiBzZWUgamZzX2xvZ21nci5oICovCisKKy8qCisgKgl0cmFuc2FjdGlvbiBsb2NrCisgKi8KK3N0cnVjdCB0bG9jayB7CisJbGlkX3QgbmV4dDsJCS8qIDI6IGluZGV4IG5leHQgbG9ja3dvcmQgb24gdGlkIGxvY2tsaXN0CisJCQkJICogICAgICAgICAgbmV4dCBsb2Nrd29yZCBvbiBmcmVlbGlzdAorCQkJCSAqLworCXRpZF90IHRpZDsJCS8qIDI6IHRyYW5zYWN0aW9uIGlkIGhvbGRpbmcgbG9jayAqLworCisJdTE2IGZsYWc7CQkvKiAyOiBsb2NrIGNvbnRyb2wgKi8KKwl1MTYgdHlwZTsJCS8qIDI6IGxvZyB0eXBlICovCisKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOwkvKiA0Lzg6IG9iamVjdCBwYWdlIGJ1ZmZlciBsb2NrZWQgKi8KKwlzdHJ1Y3QgaW5vZGUgKmlwOwkvKiA0Lzg6IG9iamVjdCAqLworCS8qICgxNikgKi8KKworCXMxNiBsb2NrWzI0XTsJCS8qIDQ4OiBvdmVybGF5IGFyZWEgKi8KK307CQkJCS8qICg2NCkgKi8KKworZXh0ZXJuIHN0cnVjdCB0bG9jayAqVHhMb2NrOwkvKiB0cmFuc2FjdGlvbiBsb2NrIHRhYmxlICovCisKKy8qCisgKiB0bG9jayBmbGFnCisgKi8KKy8qIHR4TG9jayBzdGF0ZSAqLworI2RlZmluZSB0bGNrUEFHRUxPQ0sJCTB4ODAwMAorI2RlZmluZSB0bGNrSU5PREVMT0NLCQkweDQwMDAKKyNkZWZpbmUgdGxja0xJTkVMT0NLCQkweDIwMDAKKyNkZWZpbmUgdGxja0lOTElORUxPQ0sJCTB4MTAwMAorLyogbG1Mb2cgc3RhdGUgKi8KKyNkZWZpbmUgdGxja0xPRwkJCTB4MDgwMAorLyogdXBkYXRlTWFwIHN0YXRlICovCisjZGVmaW5lCXRsY2tVUERBVEVNQVAJCTB4MDA4MAorLyogZnJlZUxvY2sgc3RhdGUgKi8KKyNkZWZpbmUgdGxja0ZSRUVMT0NLCQkweDAwMDgKKyNkZWZpbmUgdGxja1dSSVRFUEFHRQkJMHgwMDA0CisjZGVmaW5lIHRsY2tGUkVFUEFHRQkJMHgwMDAyCisKKy8qCisgKiB0bG9jayB0eXBlCisgKi8KKyNkZWZpbmUJdGxja1RZUEUJCTB4ZmUwMAorI2RlZmluZQl0bGNrSU5PREUJCTB4ODAwMAorI2RlZmluZQl0bGNrWFRSRUUJCTB4NDAwMAorI2RlZmluZQl0bGNrRFRSRUUJCTB4MjAwMAorI2RlZmluZQl0bGNrTUFQCQkJMHgxMDAwCisjZGVmaW5lCXRsY2tFQQkJCTB4MDgwMAorI2RlZmluZQl0bGNrQUNMCQkJMHgwNDAwCisjZGVmaW5lCXRsY2tEQVRBCQkweDAyMDAKKyNkZWZpbmUJdGxja0JUUk9PVAkJMHgwMTAwCisKKyNkZWZpbmUJdGxja09QRVJBVElPTgkJMHgwMGZmCisjZGVmaW5lIHRsY2tHUk9XCQkweDAwMDEJLyogZmlsZSBncm93ICovCisjZGVmaW5lIHRsY2tSRU1PVkUJCTB4MDAwMgkvKiBmaWxlIGRlbGV0ZSAqLworI2RlZmluZSB0bGNrVFJVTkNBVEUJCTB4MDAwNAkvKiBmaWxlIHRydW5jYXRlICovCisjZGVmaW5lIHRsY2tSRUxPQ0FURQkJMHgwMDA4CS8qIGZpbGUvZGlyZWN0b3J5IHJlbG9jYXRlICovCisjZGVmaW5lIHRsY2tFTlRSWQkJMHgwMDAxCS8qIGRpcmVjdG9yeSBpbnNlcnQvZGVsZXRlICovCisjZGVmaW5lIHRsY2tFWFRFTkQJCTB4MDAwMgkvKiBkaXJlY3RvcnkgZXh0ZW5kIGluLWxpbmUgKi8KKyNkZWZpbmUgdGxja1NQTElUCQkweDAwMTAJLyogc3BsaXRlZCBwYWdlICovCisjZGVmaW5lIHRsY2tORVcJCQkweDAwMjAJLyogbmV3IHBhZ2UgZnJvbSBzcGxpdCAqLworI2RlZmluZSB0bGNrRlJFRQkJMHgwMDQwCS8qIGZyZWUgcGFnZSAqLworI2RlZmluZSB0bGNrUkVMSU5LCQkweDAwODAJLyogdXBkYXRlIHNpYmxpbmcgcG9pbnRlciAqLworCisvKgorICoJbGluZWxvY2sgZm9yIGxtTG9nKCkKKyAqCisgKiBub3RlOiBsaW5lbG9jayBhbmQgaXRzIHZhcmlhdGlvbnMgYXJlIG92ZXJsYWlkCisgKiBhdCB0bG9jay5sb2NrOiB3YXRjaCBmb3IgYWxpZ25tZW50OworICovCitzdHJ1Y3QgbHYgeworCXU4IG9mZnNldDsJCS8qIDE6ICovCisJdTggbGVuZ3RoOwkJLyogMTogKi8KK307CQkJCS8qICgyKSAqLworCisjZGVmaW5lCVRMT0NLU0hPUlQJMjAKKyNkZWZpbmUJVExPQ0tMT05HCTI4CisKK3N0cnVjdCBsaW5lbG9jayB7CisJbGlkX3QgbmV4dDsJCS8qIDI6IG5leHQgbGluZWxvY2sgKi8KKworCXM4IG1heGNudDsJCS8qIDE6ICovCisJczggaW5kZXg7CQkvKiAxOiAqLworCisJdTE2IGZsYWc7CQkvKiAyOiAqLworCXU4IHR5cGU7CQkvKiAxOiAqLworCXU4IGwybGluZXNpemU7CQkvKiAxOiBsb2cyIG9mIGxpbmVzaXplICovCisJLyogKDgpICovCisKKwlzdHJ1Y3QgbHYgbHZbMjBdOwkvKiA0MDogKi8KK307IAkJCQkvKiAoNDgpICovCisKKyNkZWZpbmUgZHRfbG9jawlsaW5lbG9jaworCitzdHJ1Y3QgeHRsb2NrIHsKKwlsaWRfdCBuZXh0OwkJLyogMjogKi8KKworCXM4IG1heGNudDsJCS8qIDE6ICovCisJczggaW5kZXg7CQkvKiAxOiAqLworCisJdTE2IGZsYWc7CQkvKiAyOiAqLworCXU4IHR5cGU7CQkvKiAxOiAqLworCXU4IGwybGluZXNpemU7CQkvKiAxOiBsb2cyIG9mIGxpbmVzaXplICovCisJCQkJLyogKDgpICovCisKKwlzdHJ1Y3QgbHYgaGVhZGVyOwkvKiAyOiAqLworCXN0cnVjdCBsdiBsd207CQkvKiAyOiBsb3cgd2F0ZXIgbWFyayAqLworCXN0cnVjdCBsdiBod207CQkvKiAyOiBoaWdoIHdhdGVyIG1hcmsgKi8KKwlzdHJ1Y3QgbHYgdHdtOwkJLyogMjogKi8KKwkJCQkvKiAoMTYpICovCisKKwlzMzIgcHhkbG9ja1s4XTsJCS8qIDMyOiAqLworfTsJCQkJLyogKDQ4KSAqLworCisKKy8qCisgKgltYXBsb2NrIGZvciB0eFVwZGF0ZU1hcCgpCisgKgorICogbm90ZTogbWFwbG9jayBhbmQgaXRzIHZhcmlhdGlvbnMgYXJlIG92ZXJsYWlkCisgKiBhdCB0bG9jay5sb2NrL2xpbmVsb2NrOiB3YXRjaCBmb3IgYWxpZ25tZW50OworICogTi5CLiBuZXh0IGZpZWxkIG1heSBiZSBzZXQgYnkgbGluZWxvY2ssIGFuZCBzaG91bGQgbm90CisgKiBiZSBtb2RpZmllZCBieSBtYXBsb2NrOworICogTi5CLiBpbmRleCBvZiB0aGUgZmlyc3QgcHhkbG9jayBzcGVjaWZpZXMgaW5kZXggb2YgbmV4dCAKKyAqIGZyZWUgbWFwbG9jayAoaS5lLiwgbnVtYmVyIG9mIG1hcGxvY2spIGluIHRoZSB0bG9jazsgCisgKi8KK3N0cnVjdCBtYXBsb2NrIHsKKwlsaWRfdCBuZXh0OwkJLyogMjogKi8KKworCXU4IG1heGNudDsJCS8qIDI6ICovCisJdTggaW5kZXg7CQkvKiAyOiBuZXh0IGZyZWUgbWFwbG9jayBpbmRleCAqLworCisJdTE2IGZsYWc7CQkvKiAyOiAqLworCXU4IHR5cGU7CQkvKiAxOiAqLworCXU4IGNvdW50OwkJLyogMTogbnVtYmVyIG9mIHB4ZC94YWQgKi8KKwkJCQkvKiAoOCkgKi8KKworCXB4ZF90IHB4ZDsJCS8qIDg6ICovCit9OwkJCQkvKiAoMTYpOiAqLworCisvKiBtYXBsb2NrIGZsYWcgKi8KKyNkZWZpbmUJbWxja0FMTE9DCQkweDAwZjAKKyNkZWZpbmUJbWxja0FMTE9DWEFETElTVAkweDAwODAKKyNkZWZpbmUJbWxja0FMTE9DUFhETElTVAkweDAwNDAKKyNkZWZpbmUJbWxja0FMTE9DWEFECQkweDAwMjAKKyNkZWZpbmUJbWxja0FMTE9DUFhECQkweDAwMTAKKyNkZWZpbmUJbWxja0ZSRUUJCTB4MDAwZgorI2RlZmluZQltbGNrRlJFRVhBRExJU1QJCTB4MDAwOAorI2RlZmluZQltbGNrRlJFRVBYRExJU1QJCTB4MDAwNAorI2RlZmluZQltbGNrRlJFRVhBRAkJMHgwMDAyCisjZGVmaW5lCW1sY2tGUkVFUFhECQkweDAwMDEKKworI2RlZmluZQlweGRfbG9jawltYXBsb2NrCisKK3N0cnVjdCB4ZGxpc3Rsb2NrIHsKKwlsaWRfdCBuZXh0OwkJLyogMjogKi8KKworCXU4IG1heGNudDsJCS8qIDI6ICovCisJdTggaW5kZXg7CQkvKiAyOiAqLworCisJdTE2IGZsYWc7CQkvKiAyOiAqLworCXU4IHR5cGU7CQkvKiAxOiAqLworCXU4IGNvdW50OwkJLyogMTogbnVtYmVyIG9mIHB4ZC94YWQgKi8KKwkJCQkvKiAoOCkgKi8KKworCS8qCisJICogV2UgbmVlZCB4ZGxpc3QgdG8gYmUgNjQgYml0cyAoOCBieXRlcyksIHJlZ2FyZGxlc3Mgb2YKKwkgKiB3aGV0aGVyIHZvaWQgKiBpcyAzMiBvciA2NCBiaXRzCisJICovCisJdW5pb24geworCQl2b2lkICpfeGRsaXN0OwkvKiBweGQveGFkIGxpc3QgKi8KKwkJczY0IHBhZDsJLyogODogRm9yY2UgNjQtYml0IHhkbGlzdCBzaXplICovCisJfSB1bmlvbjY0OworfTsJCQkJLyogKDE2KTogKi8KKworI2RlZmluZSB4ZGxpc3QgdW5pb242NC5feGRsaXN0CisKKy8qCisgKgljb21taXQKKyAqCisgKiBwYXJhbWV0ZXIgdG8gdGhlIGNvbW1pdCBtYW5hZ2VyIHJvdXRpbmVzCisgKi8KK3N0cnVjdCBjb21taXQgeworCXRpZF90IHRpZDsJCS8qIHRpZCA9IGluZGV4IG9mIHRibG9jayAqLworCWludCBmbGFnOwkJLyogZmxhZ3MgKi8KKwlzdHJ1Y3QgamZzX2xvZyAqbG9nOwkvKiBsb2cgKi8KKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOwkvKiBzdXBlcmJsb2NrICovCisKKwlpbnQgbmlwOwkJLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gaXBsaXN0ICovCisJc3RydWN0IGlub2RlICoqaXBsaXN0OwkvKiBsaXN0IG9mIHBvaW50ZXJzIHRvIGlub2RlcyAqLworCisJLyogbG9nIHJlY29yZCBkZXNjcmlwdG9yIG9uIDY0LWJpdCBib3VuZGFyeSAqLworCXN0cnVjdCBscmQgbHJkOwkJLyogOiBsb2cgcmVjb3JkIGRlc2NyaXB0b3IgKi8KK307CisKKy8qCisgKiBleHRlcm5hbCBkZWNsYXJhdGlvbnMKKyAqLworZXh0ZXJuIHN0cnVjdCB0bG9jayAqdHhMb2NrKHRpZF90IHRpZCwgc3RydWN0IGlub2RlICppcCwgc3RydWN0IG1ldGFwYWdlICptcCwKKwkJCSAgICBpbnQgZmxhZyk7CisKK2V4dGVybiBzdHJ1Y3QgdGxvY2sgKnR4TWFwbG9jayh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsIGludCBmbGFnKTsKKworZXh0ZXJuIGludCB0eENvbW1pdCh0aWRfdCB0aWQsIGludCBuaXAsIHN0cnVjdCBpbm9kZSAqKmlwbGlzdCwgaW50IGZsYWcpOworCitleHRlcm4gdGlkX3QgdHhCZWdpbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZmxhZyk7CisKK2V4dGVybiB2b2lkIHR4QmVnaW5Bbm9uKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworCitleHRlcm4gdm9pZCB0eEVuZCh0aWRfdCB0aWQpOworCitleHRlcm4gdm9pZCB0eEFib3J0KHRpZF90IHRpZCwgaW50IGRpcnR5KTsKKworZXh0ZXJuIHN0cnVjdCBsaW5lbG9jayAqdHhMaW5lbG9jayhzdHJ1Y3QgbGluZWxvY2sgKiB0bG9jayk7CisKK2V4dGVybiB2b2lkIHR4RnJlZU1hcChzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgbWFwbG9jayAqIG1hcGxvY2ssCisJCSAgICAgIHN0cnVjdCB0YmxvY2sgKiB0YmxrLCBpbnQgbWFwdHlwZSk7CisKK2V4dGVybiB2b2lkIHR4RUEodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLCBkeGRfdCAqIG9sZGVhLCBkeGRfdCAqIG5ld2VhKTsKKworZXh0ZXJuIHZvaWQgdHhGcmVlbG9jayhzdHJ1Y3QgaW5vZGUgKmlwKTsKKworZXh0ZXJuIGludCBsbUxvZyhzdHJ1Y3QgamZzX2xvZyAqIGxvZywgc3RydWN0IHRibG9jayAqIHRibGssIHN0cnVjdCBscmQgKiBscmQsCisJCSBzdHJ1Y3QgdGxvY2sgKiB0bGNrKTsKKworZXh0ZXJuIHZvaWQgdHhRdWllc2NlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworCitleHRlcm4gdm9pZCB0eFJlc3VtZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKKyNlbmRpZgkJCQkvKiBfSF9KRlNfVFhOTUdSICovCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX3R5cGVzLmggYi9mcy9qZnMvamZzX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJmYWQzOQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmcy9qZnNfdHlwZXMuaApAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqICAgQ29weXJpZ2h0IChDKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuLCAyMDAwLTIwMDQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2lmbmRlZiBfSF9KRlNfVFlQRVMKKyNkZWZpbmUJX0hfSkZTX1RZUEVTCisKKy8qCisgKglqZnNfdHlwZXMuaDoKKyAqCisgKiBiYXNpYyB0eXBlL3V0aWxpdHkgIGRlZmluaXRpb25zCisgKgorICogbm90ZTogdGhpcyBoZWFkZXIgZmlsZSBtdXN0IGJlIHRoZSAxc3QgaW5jbHVkZSBmaWxlCisgKiBvZiBKRlMgaW5jbHVkZSBsaXN0IGluIGFsbCBKRlMgLmMgZmlsZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKworI2luY2x1ZGUgImVuZGlhbjI0LmgiCisKKy8qCisgKiB0cmFuc2FjdGlvbiBhbmQgbG9jayBpZCdzCisgKgorICogRG9uJ3QgY2hhbmdlIHRoZXNlIHdpdGhvdXQgY2FyZWZ1bGx5IGNvbnNpZGVyaW5nIHRoZSBpbXBhY3Qgb24gdGhlCisgKiBzaXplIGFuZCBhbGlnbm1lbnQgb2YgYWxsIG9mIHRoZSBsaW5lbG9jayB2YXJpYW50cworICovCit0eXBlZGVmIHUxNiB0aWRfdDsKK3R5cGVkZWYgdTE2IGxpZF90OworCisvKgorICogQWxtb3N0IGlkZW50aWNhbCB0byBMaW51eCdzIHRpbWVzcGVjLCBidXQgbm90IHF1aXRlCisgKi8KK3N0cnVjdCB0aW1lc3RydWNfdCB7CisJX19sZTMyIHR2X3NlYzsKKwlfX2xlMzIgdHZfbnNlYzsKK307CisKKy8qCisgKgloYW5keQorICovCisKKyNkZWZpbmUgTEVGVE1PU1RPTkUJMHg4MDAwMDAwMAorI2RlZmluZQlISUdIT1JERVIJMHg4MDAwMDAwMHUJLyogaGlnaCBvcmRlciBiaXQgb24gICAgICAgICAgICAqLworI2RlZmluZQlPTkVTCQkweGZmZmZmZmZmdQkvKiBhbGwgYml0IG9uICAgICAgICAgICAgICAgICAgICovCisKK3R5cGVkZWYgaW50IGJvb2xlYW5fdDsKKyNkZWZpbmUgVFJVRSAxCisjZGVmaW5lIEZBTFNFIDAKKworLyoKKyAqCWxvZ2ljYWwgeGQgKGx4ZCkKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxlbjoyNDsKKwl1bnNpZ25lZCBvZmYxOjg7CisJdTMyIG9mZjI7Cit9IGx4ZF90OworCisvKiBseGRfdCBmaWVsZCBjb25zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUJTFhEbGVuZ3RoKGx4ZCwgbGVuZ3RoMzIpCSggKGx4ZCktPmxlbiA9IGxlbmd0aDMyICkKKyNkZWZpbmUJTFhEb2Zmc2V0KGx4ZCwgb2Zmc2V0NjQpXAore1wKKwkobHhkKS0+b2ZmMSA9ICgoczY0KW9mZnNldDY0KSA+PiAzMjtcCisJKGx4ZCktPm9mZjIgPSAob2Zmc2V0NjQpICYgMHhmZmZmZmZmZjtcCit9CisKKy8qIGx4ZF90IGZpZWxkIGV4dHJhY3Rpb24gKi8KKyNkZWZpbmUJbGVuZ3RoTFhEKGx4ZCkJKCAobHhkKS0+bGVuICkKKyNkZWZpbmUJb2Zmc2V0TFhEKGx4ZClcCisJKCAoKHM2NCkoKGx4ZCktPm9mZjEpKSA8PCAzMiB8IChseGQpLT5vZmYyICkKKworLyogbHhkIGxpc3QgKi8KK3N0cnVjdCBseGRsaXN0IHsKKwlzMTYgbWF4bmx4ZDsKKwlzMTYgbmx4ZDsKKwlseGRfdCAqbHhkOworfTsKKworLyoKKyAqCXBoeXNpY2FsIHhkIChweGQpCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsZW46MjQ7CisJdW5zaWduZWQgYWRkcjE6ODsKKwlfX2xlMzIgYWRkcjI7Cit9IHB4ZF90OworCisvKiB4ZF90IGZpZWxkIGNvbnN0cnVjdGlvbiAqLworCisjZGVmaW5lCVBYRGxlbmd0aChweGQsIGxlbmd0aDMyKQkoKHB4ZCktPmxlbiA9IF9fY3B1X3RvX2xlMjQobGVuZ3RoMzIpKQorI2RlZmluZQlQWERhZGRyZXNzKHB4ZCwgYWRkcmVzczY0KVwKK3tcCisJKHB4ZCktPmFkZHIxID0gKChzNjQpYWRkcmVzczY0KSA+PiAzMjtcCisJKHB4ZCktPmFkZHIyID0gX19jcHVfdG9fbGUzMigoYWRkcmVzczY0KSAmIDB4ZmZmZmZmZmYpO1wKK30KKworLyogeGRfdCBmaWVsZCBleHRyYWN0aW9uICovCisjZGVmaW5lCWxlbmd0aFBYRChweGQpCV9fbGUyNF90b19jcHUoKHB4ZCktPmxlbikKKyNkZWZpbmUJYWRkcmVzc1BYRChweGQpXAorCSggKChzNjQpKChweGQpLT5hZGRyMSkpIDw8IDMyIHwgX19sZTMyX3RvX2NwdSgocHhkKS0+YWRkcjIpKQorCisjZGVmaW5lIE1BWFRSRUVIRUlHSFQgOAorLyogcHhkIGxpc3QgKi8KK3N0cnVjdCBweGRsaXN0IHsKKwlzMTYgbWF4bnB4ZDsKKwlzMTYgbnB4ZDsKKwlweGRfdCBweGRbTUFYVFJFRUhFSUdIVF07Cit9OworCisKKy8qCisgKglkYXRhIGV4dGVudCBkZXNjcmlwdG9yIChkeGQpCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBmbGFnOjg7CS8qIDE6IGZsYWdzICovCisJdW5zaWduZWQgcnNydmQ6MjQ7CisJX19sZTMyIHNpemU7CQkvKiA0OiBzaXplIGluIGJ5dGUgKi8KKwl1bnNpZ25lZCBsZW46MjQ7CS8qIDM6IGxlbmd0aCBpbiB1bml0IG9mIGZzYmxrc2l6ZSAqLworCXVuc2lnbmVkIGFkZHIxOjg7CS8qIDE6IGFkZHJlc3MgaW4gdW5pdCBvZiBmc2Jsa3NpemUgKi8KKwlfX2xlMzIgYWRkcjI7CQkvKiA0OiBhZGRyZXNzIGluIHVuaXQgb2YgZnNibGtzaXplICovCit9IGR4ZF90OwkJCS8qIC0gMTYgLSAqLworCisvKiBkeGRfdCBmbGFncyAqLworI2RlZmluZQlEWERfSU5ERVgJMHg4MAkvKiBCKy10cmVlIGluZGV4ICovCisjZGVmaW5lCURYRF9JTkxJTkUJMHg0MAkvKiBpbi1saW5lIGRhdGEgZXh0ZW50ICovCisjZGVmaW5lCURYRF9FWFRFTlQJMHgyMAkvKiBvdXQtb2YtbGluZSBzaW5nbGUgZXh0ZW50ICovCisjZGVmaW5lCURYRF9GSUxFCTB4MTAJLyogb3V0LW9mLWxpbmUgZmlsZSAoaW5vZGUpICovCisjZGVmaW5lIERYRF9DT1JSVVBUCTB4MDgJLyogSW5jb25zaXN0ZW5jeSBkZXRlY3RlZCAqLworCisvKiBkeGRfdCBmaWVsZCBjb25zdHJ1Y3Rpb24KKyAqCUNvbnZlbmllbnRseSwgdGhlIFBYRCBtYWNyb3Mgd29yayBmb3IgRFhECisgKi8KKyNkZWZpbmUJRFhEbGVuZ3RoCVBYRGxlbmd0aAorI2RlZmluZQlEWERhZGRyZXNzCVBYRGFkZHJlc3MKKyNkZWZpbmUJbGVuZ3RoRFhECWxlbmd0aFBYRAorI2RlZmluZQlhZGRyZXNzRFhECWFkZHJlc3NQWEQKKyNkZWZpbmUgRFhEc2l6ZShkeGQsIHNpemUzMikgKChkeGQpLT5zaXplID0gY3B1X3RvX2xlMzIoc2l6ZTMyKSkKKyNkZWZpbmUgc2l6ZURYRChkeGQpCWxlMzJfdG9fY3B1KChkeGQpLT5zaXplKQorCisvKgorICogICAgICBkaXJlY3RvcnkgZW50cnkgYXJndW1lbnQKKyAqLworc3RydWN0IGNvbXBvbmVudF9uYW1lIHsKKwlpbnQgbmFtbGVuOworCXdjaGFyX3QgKm5hbWU7Cit9OworCisKKy8qCisgKglEQVNEIGxpbWl0IGluZm9ybWF0aW9uIC0gc3RvcmVkIGluIGRpcmVjdG9yeSBpbm9kZQorICovCitzdHJ1Y3QgZGFzZCB7CisJdTggdGhyZXNoOwkJLyogQWxlcnQgVGhyZXNob2xkIChpbiBwZXJjZW50KSAqLworCXU4IGRlbHRhOwkJLyogQWxlcnQgVGhyZXNob2xkIGRlbHRhIChpbiBwZXJjZW50KSAgICovCisJdTggcnNydmQxOworCXU4IGxpbWl0X2hpOwkJLyogREFTRCBsaW1pdCAoaW4gbG9naWNhbCBibG9ja3MpICAgICAgICovCisJX19sZTMyIGxpbWl0X2xvOwkvKiBEQVNEIGxpbWl0IChpbiBsb2dpY2FsIGJsb2NrcykgICAgICAgKi8KKwl1OCByc3J2ZDJbM107CisJdTggdXNlZF9oaTsJCS8qIERBU0QgdXNhZ2UgKGluIGxvZ2ljYWwgYmxvY2tzKSAgICAgICAqLworCV9fbGUzMiB1c2VkX2xvOwkJLyogREFTRCB1c2FnZSAoaW4gbG9naWNhbCBibG9ja3MpICAgICAgICovCit9OworCisjZGVmaW5lIERBU0RMSU1JVChkYXNkcCkgXAorCSgoKHU2NCkoKGRhc2RwKS0+bGltaXRfaGkpIDw8IDMyKSArIF9fbGUzMl90b19jcHUoKGRhc2RwKS0+bGltaXRfbG8pKQorI2RlZmluZSBzZXREQVNETElNSVQoZGFzZHAsIGxpbWl0KVwKK3tcCisJKGRhc2RwKS0+bGltaXRfaGkgPSAoKHU2NClsaW1pdCkgPj4gMzI7XAorCShkYXNkcCktPmxpbWl0X2xvID0gX19jcHVfdG9fbGUzMihsaW1pdCk7XAorfQorI2RlZmluZSBEQVNEVVNFRChkYXNkcCkgXAorCSgoKHU2NCkoKGRhc2RwKS0+dXNlZF9oaSkgPDwgMzIpICsgX19sZTMyX3RvX2NwdSgoZGFzZHApLT51c2VkX2xvKSkKKyNkZWZpbmUgc2V0REFTRFVTRUQoZGFzZHAsIHVzZWQpXAore1wKKwkoZGFzZHApLT51c2VkX2hpID0gKCh1NjQpdXNlZCkgPj4gMzI7XAorCShkYXNkcCktPnVzZWRfbG8gPSBfX2NwdV90b19sZTMyKHVzZWQpO1wKK30KKworI2VuZGlmCQkJCS8qICFfSF9KRlNfVFlQRVMgKi8KZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfdW1vdW50LmMgYi9mcy9qZnMvamZzX3Vtb3VudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMWE5ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZnMvamZzX3Vtb3VudC5jCkBAIC0wLDAgKzEsMTc4IEBACisvKgorICogICBDb3B5cmlnaHQgKEMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDAtMjAwNAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7ICB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIAorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7ICB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgKiAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07ICBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8qCisgKglqZnNfdW1vdW50LmMKKyAqCisgKiBub3RlOiBmaWxlIHN5c3RlbSBpbiB0cmFuc2l0aW9uIHRvIGFnZ3JlZ2F0ZS9maWxlc2V0OgorICogKHJlZi4gamZzX21vdW50LmMpCisgKgorICogZmlsZSBzeXN0ZW0gdW5tb3VudCBpcyBpbnRlcnByZXRlZCBhcyBtb3VudCBvZiB0aGUgc2luZ2xlL29ubHkgCisgKiBmaWxlc2V0IGluIHRoZSBhZ2dyZWdhdGUgYW5kLCBpZiB1bm1vdW50IG9mIHRoZSBsYXN0IGZpbGVzZXQsIAorICogYXMgdW5tb3VudCBvZiB0aGUgYWdnZXJhdGU7CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSAiamZzX2luY29yZS5oIgorI2luY2x1ZGUgImpmc19maWxzeXMuaCIKKyNpbmNsdWRlICJqZnNfc3VwZXJibG9jay5oIgorI2luY2x1ZGUgImpmc19kbWFwLmgiCisjaW5jbHVkZSAiamZzX2ltYXAuaCIKKyNpbmNsdWRlICJqZnNfbWV0YXBhZ2UuaCIKKyNpbmNsdWRlICJqZnNfZGVidWcuaCIKKworLyoKKyAqIE5BTUU6CWpmc191bW91bnQodmZzcCwgZmxhZ3MsIGNycCkKKyAqCisgKiBGVU5DVElPTjoJdmZzX3Vtb3VudCgpCisgKgorICogUEFSQU1FVEVSUzoJdmZzcAktIHZpcnR1YWwgZmlsZSBzeXN0ZW0gcG9pbnRlcgorICoJCWZsYWdzCS0gdW5tb3VudCBmb3Igc2h1dGRvd24KKyAqCQljcnAJLSBjcmVkZW50aWFsCisgKgorICogUkVUVVJOIDoJRUJVU1kJLSBkZXZpY2UgaGFzIG9wZW4gZmlsZXMKKyAqLworaW50IGpmc191bW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqYmRldl9tYXBwaW5nID0gc2ItPnNfYmRldi0+YmRfaW5vZGUtPmlfbWFwcGluZzsKKwlzdHJ1Y3QgamZzX3NiX2luZm8gKnNiaSA9IEpGU19TQkkoc2IpOworCXN0cnVjdCBpbm9kZSAqaXBibWFwID0gc2JpLT5pcGJtYXA7CisJc3RydWN0IGlub2RlICppcGltYXAgPSBzYmktPmlwaW1hcDsKKwlzdHJ1Y3QgaW5vZGUgKmlwYWltYXAgPSBzYmktPmlwYWltYXA7CisJc3RydWN0IGlub2RlICppcGFpbWFwMiA9IHNiaS0+aXBhaW1hcDI7CisJc3RydWN0IGpmc19sb2cgKmxvZzsKKwlpbnQgcmMgPSAwOworCisJamZzX2luZm8oIlVuTW91bnQgSkZTOiBzYjoweCVwIiwgc2IpOworCisJLyoKKwkgKiAgICAgIHVwZGF0ZSBzdXBlcmJsb2NrIGFuZCBjbG9zZSBsb2cgCisJICoKKwkgKiBpZiBtb3VudGVkIHJlYWQtd3JpdGUgYW5kIGxvZyBiYXNlZCByZWNvdmVyeSB3YXMgZW5hYmxlZAorCSAqLworCWlmICgobG9nID0gc2JpLT5sb2cpKQorCQkvKgorCQkgKiBXYWl0IGZvciBvdXRzdGFuZGluZyB0cmFuc2FjdGlvbnMgdG8gYmUgd3JpdHRlbiB0byBsb2c6IAorCQkgKi8KKwkJamZzX2ZsdXNoX2pvdXJuYWwobG9nLCAyKTsKKworCS8qCisJICogY2xvc2UgZmlsZXNldCBpbm9kZSBhbGxvY2F0aW9uIG1hcCAoYWthIGZpbGVzZXQgaW5vZGUpCisJICovCisJZGlVbm1vdW50KGlwaW1hcCwgMCk7CisKKwlkaUZyZWVTcGVjaWFsKGlwaW1hcCk7CisJc2JpLT5pcGltYXAgPSBOVUxMOworCisJLyoKKwkgKiBjbG9zZSBzZWNvbmRhcnkgYWdncmVnYXRlIGlub2RlIGFsbG9jYXRpb24gbWFwCisJICovCisJaXBhaW1hcDIgPSBzYmktPmlwYWltYXAyOworCWlmIChpcGFpbWFwMikgeworCQlkaVVubW91bnQoaXBhaW1hcDIsIDApOworCQlkaUZyZWVTcGVjaWFsKGlwYWltYXAyKTsKKwkJc2JpLT5pcGFpbWFwMiA9IE5VTEw7CisJfQorCisJLyoKKwkgKiBjbG9zZSBhZ2dyZWdhdGUgaW5vZGUgYWxsb2NhdGlvbiBtYXAKKwkgKi8KKwlpcGFpbWFwID0gc2JpLT5pcGFpbWFwOworCWRpVW5tb3VudChpcGFpbWFwLCAwKTsKKwlkaUZyZWVTcGVjaWFsKGlwYWltYXApOworCXNiaS0+aXBhaW1hcCA9IE5VTEw7CisKKwkvKgorCSAqIGNsb3NlIGFnZ3JlZ2F0ZSBibG9jayBhbGxvY2F0aW9uIG1hcAorCSAqLworCWRiVW5tb3VudChpcGJtYXAsIDApOworCisJZGlGcmVlU3BlY2lhbChpcGJtYXApOworCXNiaS0+aXBpbWFwID0gTlVMTDsKKworCS8qCisJICogTWFrZSBzdXJlIGFsbCBtZXRhZGF0YSBtYWtlcyBpdCB0byBkaXNrIGJlZm9yZSB3ZSBtYXJrCisJICogdGhlIHN1cGVyYmxvY2sgYXMgY2xlYW4KKwkgKi8KKwlmaWxlbWFwX2ZkYXRhd3JpdGUoYmRldl9tYXBwaW5nKTsKKwlmaWxlbWFwX2ZkYXRhd2FpdChiZGV2X21hcHBpbmcpOworCisJLyoKKwkgKiBlbnN1cmUgYWxsIGZpbGUgc3lzdGVtIGZpbGUgcGFnZXMgYXJlIHByb3BhZ2F0ZWQgdG8gdGhlaXIKKwkgKiBob21lIGJsb2NrcyBvbiBkaXNrIChhbmQgdGhlaXIgaW4tbWVtb3J5IGJ1ZmZlciBwYWdlcyBhcmUgCisJICogaW52YWxpZGF0ZWQpIEJFRk9SRSB1cGRhdGluZyBmaWxlIHN5c3RlbSBzdXBlcmJsb2NrIHN0YXRlCisJICogKHRvIHNpZ25pZnkgZmlsZSBzeXN0ZW0gaXMgdW5tb3VudGVkIGNsZWFubHksIGFuZCB0aHVzIGluIAorCSAqIGNvbnNpc3RlbnQgc3RhdGUpIGFuZCBsb2cgc3VwZXJibG9jayBhY3RpdmUgZmlsZSBzeXN0ZW0gCisJICogbGlzdCAodG8gc2lnbmlmeSBza2lwIGxvZ3JlZG8oKSkuCisJICovCisJaWYgKGxvZykgewkJLyogbG9nID0gTlVMTCBpZiByZWFkLW9ubHkgbW91bnQgKi8KKwkJdXBkYXRlU3VwZXIoc2IsIEZNX0NMRUFOKTsKKworCQkvKiBSZXN0b3JlIGRlZmF1bHQgZ2ZwX21hc2sgZm9yIGJkZXYgKi8KKwkJbWFwcGluZ19zZXRfZ2ZwX21hc2soYmRldl9tYXBwaW5nLCBHRlBfVVNFUik7CisKKwkJLyoKKwkJICogY2xvc2UgbG9nOiAKKwkJICoKKwkJICogcmVtb3ZlIGZpbGUgc3lzdGVtIGZyb20gbG9nIGFjdGl2ZSBmaWxlIHN5c3RlbSBsaXN0LgorCQkgKi8KKwkJcmMgPSBsbUxvZ0Nsb3NlKHNiKTsKKwl9CisJamZzX2luZm8oIlVuTW91bnQgSkZTIENvbXBsZXRlOiByYyA9ICVkIiwgcmMpOworCXJldHVybiByYzsKK30KKworCitpbnQgamZzX3Vtb3VudF9ydyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICpiZGV2X21hcHBpbmcgPSBzYi0+c19iZGV2LT5iZF9pbm9kZS0+aV9tYXBwaW5nOworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpID0gSkZTX1NCSShzYik7CisJc3RydWN0IGpmc19sb2cgKmxvZyA9IHNiaS0+bG9nOworCisJaWYgKCFsb2cpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBjbG9zZSBsb2c6IAorCSAqCisJICogcmVtb3ZlIGZpbGUgc3lzdGVtIGZyb20gbG9nIGFjdGl2ZSBmaWxlIHN5c3RlbSBsaXN0LgorCSAqLworCWpmc19mbHVzaF9qb3VybmFsKGxvZywgMik7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSBhbGwgbWV0YWRhdGEgbWFrZXMgaXQgdG8gZGlzaworCSAqLworCWRiU3luYyhzYmktPmlwYm1hcCk7CisJZGlTeW5jKHNiaS0+aXBpbWFwKTsKKworCS8qCisJICogTm90ZSB0aGF0IHdlIGhhdmUgdG8gZG8gdGhpcyBldmVuIGlmIHN5bmNfYmxvY2tkZXYoKSB3aWxsCisJICogZG8gZXhhY3RseSB0aGUgc2FtZSBhIGZldyBpbnN0cnVjdGlvbnMgbGF0ZXI6ICBXZSBjYW4ndAorCSAqIG1hcmsgdGhlIHN1cGVyYmxvY2sgY2xlYW4gYmVmb3JlIGV2ZXJ5dGhpbmcgaXMgZmx1c2hlZCB0bworCSAqIGRpc2suCisJICovCisJZmlsZW1hcF9mZGF0YXdyaXRlKGJkZXZfbWFwcGluZyk7CisJZmlsZW1hcF9mZGF0YXdhaXQoYmRldl9tYXBwaW5nKTsKKworCXVwZGF0ZVN1cGVyKHNiLCBGTV9DTEVBTik7CisKKwkvKiBSZXN0b3JlIGRlZmF1bHQgZ2ZwX21hc2sgZm9yIGJkZXYgKi8KKwltYXBwaW5nX3NldF9nZnBfbWFzayhiZGV2X21hcHBpbmcsIEdGUF9VU0VSKTsKKworCXJldHVybiBsbUxvZ0Nsb3NlKHNiKTsKK30KZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfdW5pY29kZS5jIGIvZnMvamZzL2pmc191bmljb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMyMjA4YQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmcy9qZnNfdW5pY29kZS5jCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICogICBDb3B5cmlnaHQgKEMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDAtMjAwNAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7ICB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIAorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7ICB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgKiAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07ICBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlICJqZnNfaW5jb3JlLmgiCisjaW5jbHVkZSAiamZzX2ZpbHN5cy5oIgorI2luY2x1ZGUgImpmc191bmljb2RlLmgiCisjaW5jbHVkZSAiamZzX2RlYnVnLmgiCisKKy8qCisgKiBOQU1FOglqZnNfc3RyZnJvbVVDUygpCisgKgorICogRlVOQ1RJT046CUNvbnZlcnQgbGl0dGxlLWVuZGlhbiB1bmljb2RlIHN0cmluZyB0byBjaGFyYWN0ZXIgc3RyaW5nCisgKgorICovCitpbnQgamZzX3N0cmZyb21VQ1NfbGUoY2hhciAqdG8sIGNvbnN0IF9fbGUxNiAqIGZyb20sCisJCSAgICAgIGludCBsZW4sIHN0cnVjdCBubHNfdGFibGUgKmNvZGVwYWdlKQoreworCWludCBpOworCWludCBvdXRsZW4gPSAwOworCXN0YXRpYyBpbnQgd2Fybl9hZ2FpbiA9IDU7CS8qIE9ubHkgd2FybiB1cCB0byA1IHRpbWVzIHRvdGFsICovCisJaW50IHdhcm4gPSAhIXdhcm5fYWdhaW47CS8qIG9uY2UgcGVyIHN0cmluZyAqLworCisJaWYgKGNvZGVwYWdlKSB7CisJCWZvciAoaSA9IDA7IChpIDwgbGVuKSAmJiBmcm9tW2ldOyBpKyspIHsKKwkJCWludCBjaGFybGVuOworCQkJY2hhcmxlbiA9CisJCQkgICAgY29kZXBhZ2UtPnVuaTJjaGFyKGxlMTZfdG9fY3B1KGZyb21baV0pLAorCQkJCQkgICAgICAgJnRvW291dGxlbl0sCisJCQkJCSAgICAgICBOTFNfTUFYX0NIQVJTRVRfU0laRSk7CisJCQlpZiAoY2hhcmxlbiA+IDApCisJCQkJb3V0bGVuICs9IGNoYXJsZW47CisJCQllbHNlCisJCQkJdG9bb3V0bGVuKytdID0gJz8nOworCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgKGkgPCBsZW4pICYmIGZyb21baV07IGkrKykgeworCQkJaWYgKGxlMTZfdG9fY3B1KGZyb21baV0pICYgMHhmZjAwKSB7CisJCQkJaWYgKHdhcm4pIHsKKwkJCQkJd2Fybi0tOworCQkJCQl3YXJuX2FnYWluLS07CisJCQkJCXByaW50ayhLRVJOX0VSUgorCQkJIm5vbi1sYXRpbjEgY2hhcmFjdGVyIDB4JXggZm91bmQgaW4gSkZTIGZpbGUgbmFtZVxuIiwgCisJCSAgICAgICAJCQkgICAgICAgbGUxNl90b19jcHUoZnJvbVtpXSkpOworCQkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkibW91bnQgd2l0aCBpb2NoYXJzZXQ9dXRmOCB0byBhY2Nlc3NcbiIpOworCQkJCX0KKwkJCQl0b1tpXSA9ICc/JzsKKwkJCX0KKwkJCWVsc2UKKwkJCQl0b1tpXSA9IChjaGFyKSAobGUxNl90b19jcHUoZnJvbVtpXSkpOworCQl9CisJCW91dGxlbiA9IGk7CisJfQorCXRvW291dGxlbl0gPSAwOworCXJldHVybiBvdXRsZW47Cit9CisKKy8qCisgKiBOQU1FOglqZnNfc3RydG9VQ1MoKQorICoKKyAqIEZVTkNUSU9OOglDb252ZXJ0IGNoYXJhY3RlciBzdHJpbmcgdG8gdW5pY29kZSBzdHJpbmcKKyAqCisgKi8KK3N0YXRpYyBpbnQgamZzX3N0cnRvVUNTKHdjaGFyX3QgKiB0bywgY29uc3QgdW5zaWduZWQgY2hhciAqZnJvbSwgaW50IGxlbiwKKwkJc3RydWN0IG5sc190YWJsZSAqY29kZXBhZ2UpCit7CisJaW50IGNoYXJsZW47CisJaW50IGk7CisKKwlpZiAoY29kZXBhZ2UpIHsKKwkJZm9yIChpID0gMDsgbGVuICYmICpmcm9tOyBpKyssIGZyb20gKz0gY2hhcmxlbiwgbGVuIC09IGNoYXJsZW4pCisJCXsKKwkJCWNoYXJsZW4gPSBjb2RlcGFnZS0+Y2hhcjJ1bmkoZnJvbSwgbGVuLCAmdG9baV0pOworCQkJaWYgKGNoYXJsZW4gPCAxKSB7CisJCQkJamZzX2VycigiamZzX3N0cnRvVUNTOiBjaGFyMnVuaSByZXR1cm5lZCAlZC4iLAorCQkJCQljaGFybGVuKTsKKwkJCQlqZnNfZXJyKCJjaGFyc2V0ID0gJXMsIGNoYXIgPSAweCV4IiwKKwkJCQkJY29kZXBhZ2UtPmNoYXJzZXQsICpmcm9tKTsKKwkJCQlyZXR1cm4gY2hhcmxlbjsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IChpIDwgbGVuKSAmJiBmcm9tW2ldOyBpKyspCisJCQl0b1tpXSA9ICh3Y2hhcl90KSBmcm9tW2ldOworCX0KKworCXRvW2ldID0gMDsKKwlyZXR1cm4gaTsKK30KKworLyoKKyAqIE5BTUU6CWdldF9VQ1NuYW1lKCkKKyAqCisgKiBGVU5DVElPTjoJQWxsb2NhdGUgYW5kIHRyYW5zbGF0ZSB0byB1bmljb2RlIHN0cmluZworICoKKyAqLworaW50IGdldF9VQ1NuYW1lKHN0cnVjdCBjb21wb25lbnRfbmFtZSAqIHVuaU5hbWUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgbmxzX3RhYmxlICpubHNfdGFiID0gSkZTX1NCSShkZW50cnktPmRfc2IpLT5ubHNfdGFiOworCWludCBsZW5ndGggPSBkZW50cnktPmRfbmFtZS5sZW47CisKKwlpZiAobGVuZ3RoID4gSkZTX05BTUVfTUFYKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCXVuaU5hbWUtPm5hbWUgPQorCSAgICBrbWFsbG9jKChsZW5ndGggKyAxKSAqIHNpemVvZih3Y2hhcl90KSwgR0ZQX05PRlMpOworCisJaWYgKHVuaU5hbWUtPm5hbWUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwl1bmlOYW1lLT5uYW1sZW4gPSBqZnNfc3RydG9VQ1ModW5pTmFtZS0+bmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCQkgICAgICAgbGVuZ3RoLCBubHNfdGFiKTsKKworCWlmICh1bmlOYW1lLT5uYW1sZW4gPCAwKSB7CisJCWtmcmVlKHVuaU5hbWUtPm5hbWUpOworCQlyZXR1cm4gdW5pTmFtZS0+bmFtbGVuOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc191bmljb2RlLmggYi9mcy9qZnMvamZzX3VuaWNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWUyNWViCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZzL2pmc191bmljb2RlLmgKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiAgIENvcHlyaWdodCAoYykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwMC0yMDAyCisgKiAgIFBvcnRpb25zIENvcHlyaWdodCAoYykgQ2hyaXN0b3BoIEhlbGx3aWcsIDIwMDEtMjAwMgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7ICB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIAorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7ICB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgKiAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07ICBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaWZuZGVmIF9IX0pGU19VTklDT0RFCisjZGVmaW5lIF9IX0pGU19VTklDT0RFCisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSAiamZzX3R5cGVzLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKwl3Y2hhcl90IHN0YXJ0OworCXdjaGFyX3QgZW5kOworCXNpZ25lZCBjaGFyICp0YWJsZTsKK30gVU5JQ0FTRVJBTkdFOworCitleHRlcm4gc2lnbmVkIGNoYXIgVW5pVXBwZXJUYWJsZVs1MTJdOworZXh0ZXJuIFVOSUNBU0VSQU5HRSBVbmlVcHBlclJhbmdlW107CitleHRlcm4gaW50IGdldF9VQ1NuYW1lKHN0cnVjdCBjb21wb25lbnRfbmFtZSAqLCBzdHJ1Y3QgZGVudHJ5ICopOworZXh0ZXJuIGludCBqZnNfc3RyZnJvbVVDU19sZShjaGFyICosIGNvbnN0IF9fbGUxNiAqLCBpbnQsIHN0cnVjdCBubHNfdGFibGUgKik7CisKKyNkZWZpbmUgZnJlZV9VQ1NuYW1lKENPTVApIGtmcmVlKChDT01QKS0+bmFtZSkKKworLyoKKyAqIFVuaVN0cmNweTogIENvcHkgYSBzdHJpbmcKKyAqLworc3RhdGljIGlubGluZSB3Y2hhcl90ICpVbmlTdHJjcHkod2NoYXJfdCAqIHVjczEsIGNvbnN0IHdjaGFyX3QgKiB1Y3MyKQoreworCXdjaGFyX3QgKmFuY2hvciA9IHVjczE7CS8qIHNhdmUgdGhlIHN0YXJ0IG9mIHJlc3VsdCBzdHJpbmcgKi8KKworCXdoaWxlICgoKnVjczErKyA9ICp1Y3MyKyspKTsKKwlyZXR1cm4gYW5jaG9yOworfQorCisKKworLyoKKyAqIFVuaVN0cm5jcHk6ICBDb3B5IGxlbmd0aCBsaW1pdGVkIHN0cmluZyB3aXRoIHBhZAorICovCitzdGF0aWMgaW5saW5lIF9fbGUxNiAqVW5pU3RybmNweV9sZShfX2xlMTYgKiB1Y3MxLCBjb25zdCBfX2xlMTYgKiB1Y3MyLAorCQkJCSAgc2l6ZV90IG4pCit7CisJX19sZTE2ICphbmNob3IgPSB1Y3MxOworCisJd2hpbGUgKG4tLSAmJiAqdWNzMikJLyogQ29weSB0aGUgc3RyaW5ncyAqLworCQkqdWNzMSsrID0gKnVjczIrKzsKKworCW4rKzsKKwl3aGlsZSAobi0tKQkJLyogUGFkIHdpdGggbnVsbHMgKi8KKwkJKnVjczErKyA9IDA7CisJcmV0dXJuIGFuY2hvcjsKK30KKworLyoKKyAqIFVuaVN0cm5jbXBfbGU6ICBDb21wYXJlIGxlbmd0aCBsaW1pdGVkIHN0cmluZyAtIG5hdGl2ZSB0byBsaXR0bGUtZW5kaWFuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IFVuaVN0cm5jbXBfbGUoY29uc3Qgd2NoYXJfdCAqIHVjczEsIGNvbnN0IF9fbGUxNiAqIHVjczIsCisJCQkJc2l6ZV90IG4pCit7CisJaWYgKCFuKQorCQlyZXR1cm4gMDsJLyogTnVsbCBzdHJpbmdzIGFyZSBlcXVhbCAqLworCXdoaWxlICgoKnVjczEgPT0gX19sZTE2X3RvX2NwdSgqdWNzMikpICYmICp1Y3MxICYmIC0tbikgeworCQl1Y3MxKys7CisJCXVjczIrKzsKKwl9CisJcmV0dXJuIChpbnQpICp1Y3MxIC0gKGludCkgX19sZTE2X3RvX2NwdSgqdWNzMik7Cit9CisKKy8qCisgKiBVbmlTdHJuY3B5X3RvX2xlOiAgQ29weSBsZW5ndGggbGltaXRlZCBzdHJpbmcgd2l0aCBwYWQgdG8gbGl0dGxlLWVuZGlhbgorICovCitzdGF0aWMgaW5saW5lIF9fbGUxNiAqVW5pU3RybmNweV90b19sZShfX2xlMTYgKiB1Y3MxLCBjb25zdCB3Y2hhcl90ICogdWNzMiwKKwkJCQkgICAgICAgc2l6ZV90IG4pCit7CisJX19sZTE2ICphbmNob3IgPSB1Y3MxOworCisJd2hpbGUgKG4tLSAmJiAqdWNzMikJLyogQ29weSB0aGUgc3RyaW5ncyAqLworCQkqdWNzMSsrID0gY3B1X3RvX2xlMTYoKnVjczIrKyk7CisKKwluKys7CisJd2hpbGUgKG4tLSkJCS8qIFBhZCB3aXRoIG51bGxzICovCisJCSp1Y3MxKysgPSAwOworCXJldHVybiBhbmNob3I7Cit9CisKKy8qCisgKiBVbmlTdHJuY3B5X2Zyb21fbGU6ICBDb3B5IGxlbmd0aCBsaW1pdGVkIHN0cmluZyB3aXRoIHBhZCBmcm9tIGxpdHRsZS1lbmRpYW4KKyAqLworc3RhdGljIGlubGluZSB3Y2hhcl90ICpVbmlTdHJuY3B5X2Zyb21fbGUod2NoYXJfdCAqIHVjczEsIGNvbnN0IF9fbGUxNiAqIHVjczIsCisJCQkJCSAgc2l6ZV90IG4pCit7CisJd2NoYXJfdCAqYW5jaG9yID0gdWNzMTsKKworCXdoaWxlIChuLS0gJiYgKnVjczIpCS8qIENvcHkgdGhlIHN0cmluZ3MgKi8KKwkJKnVjczErKyA9IF9fbGUxNl90b19jcHUoKnVjczIrKyk7CisKKwluKys7CisJd2hpbGUgKG4tLSkJCS8qIFBhZCB3aXRoIG51bGxzICovCisJCSp1Y3MxKysgPSAwOworCXJldHVybiBhbmNob3I7Cit9CisKKy8qCisgKiBVbmlUb3VwcGVyOiAgQ29udmVydCBhIHVuaWNvZGUgY2hhcmFjdGVyIHRvIHVwcGVyIGNhc2UKKyAqLworc3RhdGljIGlubGluZSB3Y2hhcl90IFVuaVRvdXBwZXIod2NoYXJfdCB1YykKK3sKKwlVTklDQVNFUkFOR0UgKnJwOworCisJaWYgKHVjIDwgc2l6ZW9mKFVuaVVwcGVyVGFibGUpKSB7CS8qIExhdGluIGNoYXJhY3RlcnMgKi8KKwkJcmV0dXJuIHVjICsgVW5pVXBwZXJUYWJsZVt1Y107CS8qIFVzZSBiYXNlIHRhYmxlcyAqLworCX0gZWxzZSB7CisJCXJwID0gVW5pVXBwZXJSYW5nZTsJLyogVXNlIHJhbmdlIHRhYmxlcyAqLworCQl3aGlsZSAocnAtPnN0YXJ0KSB7CisJCQlpZiAodWMgPCBycC0+c3RhcnQpCS8qIEJlZm9yZSBzdGFydCBvZiByYW5nZSAqLworCQkJCXJldHVybiB1YzsJLyogVXBwZXJjYXNlID0gaW5wdXQgKi8KKwkJCWlmICh1YyA8PSBycC0+ZW5kKQkvKiBJbiByYW5nZSAqLworCQkJCXJldHVybiB1YyArIHJwLT50YWJsZVt1YyAtIHJwLT5zdGFydF07CisJCQlycCsrOwkvKiBUcnkgbmV4dCByYW5nZSAqLworCQl9CisJfQorCXJldHVybiB1YzsJCS8qIFBhc3QgbGFzdCByYW5nZSAqLworfQorCisKKy8qCisgKiBVbmlTdHJ1cHI6ICBVcHBlciBjYXNlIGEgdW5pY29kZSBzdHJpbmcKKyAqLworc3RhdGljIGlubGluZSB3Y2hhcl90ICpVbmlTdHJ1cHIod2NoYXJfdCAqIHVwaW4pCit7CisJd2NoYXJfdCAqdXA7CisKKwl1cCA9IHVwaW47CisJd2hpbGUgKCp1cCkgewkJLyogRm9yIGFsbCBjaGFyYWN0ZXJzICovCisJCSp1cCA9IFVuaVRvdXBwZXIoKnVwKTsKKwkJdXArKzsKKwl9CisJcmV0dXJuIHVwaW47CQkvKiBSZXR1cm4gaW5wdXQgcG9pbnRlciAqLworfQorCisjZW5kaWYJCQkJLyogIV9IX0pGU19VTklDT0RFICovCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX3VuaXVwci5jIGIvZnMvamZzL2pmc191bml1cHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWIxODVkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZzL2pmc191bml1cHIuYwpAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqICAgQ29weXJpZ2h0IChjKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuLCAyMDAwLTIwMDIKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlICJqZnNfdW5pY29kZS5oIgorCisvKgorICogTGF0aW4gdXBwZXIgY2FzZQorICovCitzaWduZWQgY2hhciBVbmlVcHBlclRhYmxlWzUxMl0gPSB7CisgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAwMDAtMDBmICovCisgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAwMTAtMDFmICovCisgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAwMjAtMDJmICovCisgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAwMzAtMDNmICovCisgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAwNDAtMDRmICovCisgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAwNTAtMDVmICovCisgICAwLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLCAvKiAwNjAtMDZmICovCisgLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAwNzAtMDdmICovCisgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAwODAtMDhmICovCisgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAwOTAtMDlmICovCisgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAwYTAtMGFmICovCisgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAwYjAtMGJmICovCisgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAwYzAtMGNmICovCisgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAwZDAtMGRmICovCisgLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLCAvKiAwZTAtMGVmICovCisgLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLCAgMCwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsMTIxLCAvKiAwZjAtMGZmICovCisgICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAvKiAxMDAtMTBmICovCisgICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAvKiAxMTAtMTFmICovCisgICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAvKiAxMjAtMTJmICovCisgICAwLCAgMCwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAvKiAxMzAtMTNmICovCisgIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAvKiAxNDAtMTRmICovCisgICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAvKiAxNTAtMTVmICovCisgICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAvKiAxNjAtMTZmICovCisgICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAvKiAxNzAtMTdmICovCisgICAwLCAgMCwgIDAsIC0xLCAgMCwgLTEsICAwLCAgMCwgLTEsICAwLCAgMCwgIDAsIC0xLCAgMCwgIDAsICAwLCAvKiAxODAtMThmICovCisgICAwLCAgMCwgLTEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIC0xLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAxOTAtMTlmICovCisgICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAgMCwgLTEsICAwLCAgMCwgIDAsICAwLCAtMSwgIDAsICAwLCAvKiAxYTAtMWFmICovCisgIC0xLCAgMCwgIDAsICAwLCAtMSwgIDAsIC0xLCAgMCwgIDAsIC0xLCAgMCwgIDAsICAwLCAtMSwgIDAsICAwLCAvKiAxYjAtMWJmICovCisgICAwLCAgMCwgIDAsICAwLCAgMCwgLTEsIC0yLCAgMCwgLTEsIC0yLCAgMCwgLTEsIC0yLCAgMCwgLTEsICAwLCAvKiAxYzAtMWNmICovCisgIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLC03OSwgIDAsIC0xLCAvKiAxZDAtMWRmICovCisgICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAvKiAxZTAtMWVmICovCisgICAwLCAgMCwgLTEsIC0yLCAgMCwgLTEsICAwLCAgMCwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAvKiAxZjAtMWZmICovCit9OworCisvKiBVcHBlciBjYXNlIHJhbmdlIC0gR3JlZWsgKi8KK3N0YXRpYyBzaWduZWQgY2hhciBVbmlDYXNlUmFuZ2VVMDNhMFs0N10gPSB7CisgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsLTM4LC0zNywtMzcsLTM3LCAvKiAzYTAtM2FmICovCisgICAwLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLCAvKiAzYjAtM2JmICovCisgLTMyLC0zMiwtMzEsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTY0LC02MywtNjMsCit9OworCisvKiBVcHBlciBjYXNlIHJhbmdlIC0gQ3lyaWxsaWMgKi8KK3N0YXRpYyBzaWduZWQgY2hhciBVbmlDYXNlUmFuZ2VVMDQzMFs0OF0gPSB7CisgLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLCAvKiA0MzAtNDNmICovCisgLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLCAvKiA0NDAtNDRmICovCisgICAwLC04MCwtODAsLTgwLC04MCwtODAsLTgwLC04MCwtODAsLTgwLC04MCwtODAsLTgwLCAgMCwtODAsLTgwLCAvKiA0NTAtNDVmICovCit9OworCisvKiBVcHBlciBjYXNlIHJhbmdlIC0gRXh0ZW5kZWQgY3lyaWxsaWMgKi8KK3N0YXRpYyBzaWduZWQgY2hhciBVbmlDYXNlUmFuZ2VVMDQ5MFs2MV0gPSB7CisgICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAvKiA0OTAtNDlmICovCisgICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAvKiA0YTAtNGFmICovCisgICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAvKiA0YjAtNGJmICovCisgICAwLCAgMCwgLTEsICAwLCAtMSwgIDAsICAwLCAgMCwgLTEsICAwLCAgMCwgIDAsIC0xLAorfTsKKworLyogVXBwZXIgY2FzZSByYW5nZSAtIEV4dGVuZGVkIGxhdGluIGFuZCBncmVlayAqLworc3RhdGljIHNpZ25lZCBjaGFyIFVuaUNhc2VSYW5nZVUxZTAwWzUwOV0gPSB7CisgICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAvKiAxZTAwLTFlMGYgKi8KKyAgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsIC8qIDFlMTAtMWUxZiAqLworICAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgLyogMWUyMC0xZTJmICovCisgICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAvKiAxZTMwLTFlM2YgKi8KKyAgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsIC8qIDFlNDAtMWU0ZiAqLworICAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgLyogMWU1MC0xZTVmICovCisgICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAvKiAxZTYwLTFlNmYgKi8KKyAgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsIC8qIDFlNzAtMWU3ZiAqLworICAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgLyogMWU4MC0xZThmICovCisgICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAgMCwgIDAsICAwLCAgMCwtNTksICAwLCAtMSwgIDAsIC0xLCAvKiAxZTkwLTFlOWYgKi8KKyAgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsIC8qIDFlYTAtMWVhZiAqLworICAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgLyogMWViMC0xZWJmICovCisgICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAvKiAxZWMwLTFlY2YgKi8KKyAgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsIC8qIDFlZDAtMWVkZiAqLworICAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgLyogMWVlMC0xZWVmICovCisgICAwLCAtMSwgIDAsIC0xLCAgMCwgLTEsICAwLCAtMSwgIDAsIC0xLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAxZWYwLTFlZmYgKi8KKyAgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIC8qIDFmMDAtMWYwZiAqLworICAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgLyogMWYxMC0xZjFmICovCisgICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAxZjIwLTFmMmYgKi8KKyAgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIC8qIDFmMzAtMWYzZiAqLworICAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgLyogMWY0MC0xZjRmICovCisgICAwLCAgOCwgIDAsICA4LCAgMCwgIDgsICAwLCAgOCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAxZjUwLTFmNWYgKi8KKyAgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIC8qIDFmNjAtMWY2ZiAqLworICA3NCwgNzQsIDg2LCA4NiwgODYsIDg2LDEwMCwxMDAsICAwLCAgMCwxMTIsMTEyLDEyNiwxMjYsICAwLCAgMCwgLyogMWY3MC0xZjdmICovCisgICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAxZjgwLTFmOGYgKi8KKyAgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIC8qIDFmOTAtMWY5ZiAqLworICAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgLyogMWZhMC0xZmFmICovCisgICA4LCAgOCwgIDAsICA5LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAxZmIwLTFmYmYgKi8KKyAgIDAsICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIC8qIDFmYzAtMWZjZiAqLworICAgOCwgIDgsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgLyogMWZkMC0xZmRmICovCisgICA4LCAgOCwgIDAsICAwLCAgMCwgIDcsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvKiAxZmUwLTFmZWYgKi8KKyAgIDAsICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCit9OworCisvKiBVcHBlciBjYXNlIHJhbmdlIC0gV2lkZSBsYXRpbiAqLworc3RhdGljIHNpZ25lZCBjaGFyIFVuaUNhc2VSYW5nZVVmZjQwWzI3XSA9IHsKKyAgIDAsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsIC8qIGZmNDAtZmY0ZiAqLworIC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsLTMyLC0zMiwtMzIsCit9OworCisvKgorICogVXBwZXIgQ2FzZSBSYW5nZQorICovCitVTklDQVNFUkFOR0UgVW5pVXBwZXJSYW5nZVtdID0geworICAgIHsgMHgwM2EwLCAgMHgwM2NlLCAgVW5pQ2FzZVJhbmdlVTAzYTAgfSwKKyAgICB7IDB4MDQzMCwgIDB4MDQ1ZiwgIFVuaUNhc2VSYW5nZVUwNDMwIH0sCisgICAgeyAweDA0OTAsICAweDA0Y2MsICBVbmlDYXNlUmFuZ2VVMDQ5MCB9LAorICAgIHsgMHgxZTAwLCAgMHgxZmZjLCAgVW5pQ2FzZVJhbmdlVTFlMDAgfSwKKyAgICB7IDB4ZmY0MCwgIDB4ZmY1YSwgIFVuaUNhc2VSYW5nZVVmZjQwIH0sCisgICAgeyAwIH0KK307CmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX3hhdHRyLmggYi9mcy9qZnMvamZzX3hhdHRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEwNTJmMwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmcy9qZnNfeGF0dHIuaApAQCAtMCwwICsxLDY0IEBACisvKgorICogICBDb3B5cmlnaHQgKGMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDAtMjAwMgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7ICB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKyNpZm5kZWYgSF9KRlNfWEFUVFIKKyNkZWZpbmUgSF9KRlNfWEFUVFIKKworLyoKKyAqIGpmc19lYV9saXN0IGRlc2NyaWJlIHRoZSBvbi1kaXNrIGZvcm1hdCBvZiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlcy4KKyAqIEkga25vdyB0aGUgbnVsbC10ZXJtaW5hdG9yIGlzIHJlZHVuZGFudCBzaW5jZSBuYW1lbGVuIGlzIHN0b3JlZCwgYnV0CisgKiBJIGFtIG1haW50YWluaW5nIGNvbXBhdGliaWxpdHkgd2l0aCBPUy8yIHdoZXJlIHBvc3NpYmxlLgorICovCitzdHJ1Y3QgamZzX2VhIHsKKwl1OCBmbGFnOwkvKiBVbnVzZWQ/ICovCisJdTggbmFtZWxlbjsJLyogTGVuZ3RoIG9mIG5hbWUgKi8KKwlfX2xlMTYgdmFsdWVsZW47CS8qIExlbmd0aCBvZiB2YWx1ZSAqLworCWNoYXIgbmFtZVswXTsJLyogQXR0cmlidXRlIG5hbWUgKGluY2x1ZGVzIG51bGwtdGVybWluYXRvcikgKi8KK307CQkJLyogVmFsdWUgaW1tZWRpYXRlbHkgZm9sbG93cyBuYW1lICovCisKK3N0cnVjdCBqZnNfZWFfbGlzdCB7CisJX19sZTMyIHNpemU7CQkvKiBvdmVyYWxsIHNpemUgKi8KKwlzdHJ1Y3QgamZzX2VhIGVhWzBdOwkvKiBWYXJpYWJsZSBsZW5ndGggbGlzdCAqLworfTsKKworLyogTWFjcm9zIGZvciBkZWZpbmluZyBtYXhpdW11bSBudW1iZXIgb2YgYnl0ZXMgc3VwcG9ydGVkIGZvciBFQXMgKi8KKyNkZWZpbmUgTUFYRUFTSVpFCTY1NTM1CisjZGVmaW5lIE1BWEVBTElTVFNJWkUJTUFYRUFTSVpFCisKKy8qCisgKiBzb21lIG1hY3JvcyBmb3IgZGVhbGluZyB3aXRoIHZhcmlhYmxlIGxlbmd0aCBFQSBsaXN0cy4KKyAqLworI2RlZmluZSBFQV9TSVpFKGVhKSBcCisJKHNpemVvZiAoc3RydWN0IGpmc19lYSkgKyAoZWEpLT5uYW1lbGVuICsgMSArIFwKKwkgbGUxNl90b19jcHUoKGVhKS0+dmFsdWVsZW4pKQorI2RlZmluZQlORVhUX0VBKGVhKSAoKHN0cnVjdCBqZnNfZWEgKikgKCgoY2hhciAqKSAoZWEpKSArIChFQV9TSVpFIChlYSkpKSkKKyNkZWZpbmUJRklSU1RfRUEoZWFsaXN0KSAoKGVhbGlzdCktPmVhKQorI2RlZmluZQlFQUxJU1RfU0laRShlYWxpc3QpIGxlMzJfdG9fY3B1KChlYWxpc3QpLT5zaXplKQorI2RlZmluZQlFTkRfRUFMSVNUKGVhbGlzdCkgXAorCSgoc3RydWN0IGpmc19lYSAqKSAoKChjaGFyICopIChlYWxpc3QpKSArIEVBTElTVF9TSVpFKGVhbGlzdCkpKQorCitleHRlcm4gaW50IF9famZzX3NldHhhdHRyKHN0cnVjdCBpbm9kZSAqLCBjb25zdCBjaGFyICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90LAorCQkJICBpbnQpOworZXh0ZXJuIGludCBqZnNfc2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqLCBjb25zdCBjaGFyICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90LAorCQkJaW50KTsKK2V4dGVybiBzc2l6ZV90IF9famZzX2dldHhhdHRyKHN0cnVjdCBpbm9kZSAqLCBjb25zdCBjaGFyICosIHZvaWQgKiwgc2l6ZV90KTsKK2V4dGVybiBzc2l6ZV90IGpmc19nZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICosIGNvbnN0IGNoYXIgKiwgdm9pZCAqLCBzaXplX3QpOworZXh0ZXJuIHNzaXplX3QgamZzX2xpc3R4YXR0cihzdHJ1Y3QgZGVudHJ5ICosIGNoYXIgKiwgc2l6ZV90KTsKK2V4dGVybiBpbnQgamZzX3JlbW92ZXhhdHRyKHN0cnVjdCBkZW50cnkgKiwgY29uc3QgY2hhciAqKTsKKworI2VuZGlmCS8qIEhfSkZTX1hBVFRSICovCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX3h0cmVlLmMgYi9mcy9qZnMvamZzX3h0cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFjNThjNQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmcy9qZnNfeHRyZWUuYwpAQCAtMCwwICsxLDQ0ODUgQEAKKy8qCisgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3JwLiwgMjAwMC0yMDA0CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKy8qCisgKiAgICAgIGpmc194dHJlZS5jOiBleHRlbnQgYWxsb2NhdGlvbiBkZXNjcmlwdG9yIEIrLXRyZWUgbWFuYWdlcgorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CisjaW5jbHVkZSAiamZzX2luY29yZS5oIgorI2luY2x1ZGUgImpmc19maWxzeXMuaCIKKyNpbmNsdWRlICJqZnNfbWV0YXBhZ2UuaCIKKyNpbmNsdWRlICJqZnNfZG1hcC5oIgorI2luY2x1ZGUgImpmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJqZnNfc3VwZXJibG9jay5oIgorI2luY2x1ZGUgImpmc19kZWJ1Zy5oIgorCisvKgorICogeHRyZWUgbG9jYWwgZmxhZworICovCisjZGVmaW5lIFhUX0lOU0VSVCAgICAgICAweDAwMDAwMDAxCisKKy8qCisgKiAgICAgICB4dHJlZSBrZXkvZW50cnkgY29tcGFyaXNvbjogZXh0ZW50IG9mZnNldAorICoKKyAqIHJldHVybjoKKyAqICAgICAgLTE6IGsgPCBzdGFydCBvZiBleHRlbnQKKyAqICAgICAgIDA6IHN0YXJ0X29mX2V4dGVudCA8PSBrIDw9IGVuZF9vZl9leHRlbnQKKyAqICAgICAgIDE6IGsgPiBlbmRfb2ZfZXh0ZW50CisgKi8KKyNkZWZpbmUgWFRfQ01QKENNUCwgSywgWCwgT0ZGU0VUNjQpXAore1wKKyAgICAgICAgT0ZGU0VUNjQgPSBvZmZzZXRYQUQoWCk7XAorICAgICAgICAoQ01QKSA9ICgoSykgPj0gT0ZGU0VUNjQgKyBsZW5ndGhYQUQoWCkpID8gMSA6XAorICAgICAgICAgICAgICAoKEspIDwgT0ZGU0VUNjQpID8gLTEgOiAwO1wKK30KKworLyogd3JpdGUgYSB4YWQgZW50cnkgKi8KKyNkZWZpbmUgWFRfUFVURU5UUlkoWEFELCBGTEFHLCBPRkYsIExFTiwgQUREUilcCit7XAorICAgICAgICAoWEFEKS0+ZmxhZyA9IChGTEFHKTtcCisgICAgICAgIFhBRG9mZnNldCgoWEFEKSwgKE9GRikpO1wKKyAgICAgICAgWEFEbGVuZ3RoKChYQUQpLCAoTEVOKSk7XAorICAgICAgICBYQURhZGRyZXNzKChYQUQpLCAoQUREUikpO1wKK30KKworI2RlZmluZSBYVF9QQUdFKElQLCBNUCkgQlRfUEFHRShJUCwgTVAsIHh0cGFnZV90LCBpX3h0cm9vdCkKKworLyogZ2V0IHBhZ2UgYnVmZmVyIGZvciBzcGVjaWZpZWQgYmxvY2sgYWRkcmVzcyAqLworLyogVG9EbzogUmVwbGFjZSB0aGlzIHVnbHkgbWFjcm8gd2l0aCBhIGZ1bmN0aW9uICovCisjZGVmaW5lIFhUX0dFVFBBR0UoSVAsIEJOLCBNUCwgU0laRSwgUCwgUkMpXAore1wKKwlCVF9HRVRQQUdFKElQLCBCTiwgTVAsIHh0cGFnZV90LCBTSVpFLCBQLCBSQywgaV94dHJvb3QpXAorCWlmICghKFJDKSlcCisJe1wKKwkJaWYgKChsZTE2X3RvX2NwdSgoUCktPmhlYWRlci5uZXh0aW5kZXgpIDwgWFRFTlRSWVNUQVJUKSB8fFwKKwkJICAgIChsZTE2X3RvX2NwdSgoUCktPmhlYWRlci5uZXh0aW5kZXgpID4gbGUxNl90b19jcHUoKFApLT5oZWFkZXIubWF4ZW50cnkpKSB8fFwKKwkJICAgIChsZTE2X3RvX2NwdSgoUCktPmhlYWRlci5tYXhlbnRyeSkgPiAoKChCTik9PTApP1hUUk9PVE1BWFNMT1Q6UFNJWkU+PkwyWFRTTE9UU0laRSkpKVwKKwkJe1wKKwkJCWpmc19lcnJvcigoSVApLT5pX3NiLCAiWFRfR0VUUEFHRTogeHRyZWUgcGFnZSBjb3JydXB0Iik7XAorCQkJQlRfUFVUUEFHRShNUCk7XAorCQkJTVAgPSBOVUxMO1wKKwkJCVJDID0gLUVJTztcCisJCX1cCisgICAgICAgIH1cCit9CisKKy8qIGZvciBjb25zaXN0ZW5jeSAqLworI2RlZmluZSBYVF9QVVRQQUdFKE1QKSBCVF9QVVRQQUdFKE1QKQorCisjZGVmaW5lIFhUX0dFVFNFQVJDSChJUCwgTEVBRiwgQk4sIE1QLCAgUCwgSU5ERVgpIFwKKwlCVF9HRVRTRUFSQ0goSVAsIExFQUYsIEJOLCBNUCwgeHRwYWdlX3QsIFAsIElOREVYLCBpX3h0cm9vdCkKKy8qIHh0cmVlIGVudHJ5IHBhcmFtZXRlciBkZXNjcmlwdG9yICovCitzdHJ1Y3QgeHRzcGxpdCB7CisJc3RydWN0IG1ldGFwYWdlICptcDsKKwlzMTYgaW5kZXg7CisJdTggZmxhZzsKKwlzNjQgb2ZmOworCXM2NCBhZGRyOworCWludCBsZW47CisJc3RydWN0IHB4ZGxpc3QgKnB4ZGxpc3Q7Cit9OworCisKKy8qCisgKiAgICAgIHN0YXRpc3RpY3MKKyAqLworI2lmZGVmIENPTkZJR19KRlNfU1RBVElTVElDUworc3RhdGljIHN0cnVjdCB7CisJdWludCBzZWFyY2g7CisJdWludCBmYXN0U2VhcmNoOworCXVpbnQgc3BsaXQ7Cit9IHh0U3RhdDsKKyNlbmRpZgorCisKKy8qCisgKiBmb3J3YXJkIHJlZmVyZW5jZXMKKyAqLworc3RhdGljIGludCB4dFNlYXJjaChzdHJ1Y3QgaW5vZGUgKmlwLAorCQkgICAgczY0IHhvZmYsIGludCAqY21wcCwgc3RydWN0IGJ0c3RhY2sgKiBidHN0YWNrLCBpbnQgZmxhZyk7CisKK3N0YXRpYyBpbnQgeHRTcGxpdFVwKHRpZF90IHRpZCwKKwkJICAgICBzdHJ1Y3QgaW5vZGUgKmlwLAorCQkgICAgIHN0cnVjdCB4dHNwbGl0ICogc3BsaXQsIHN0cnVjdCBidHN0YWNrICogYnRzdGFjayk7CisKK3N0YXRpYyBpbnQgeHRTcGxpdFBhZ2UodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgeHRzcGxpdCAqIHNwbGl0LAorCQkgICAgICAgc3RydWN0IG1ldGFwYWdlICoqIHJtcHAsIHM2NCAqIHJibnApOworCitzdGF0aWMgaW50IHh0U3BsaXRSb290KHRpZF90IHRpZCwgc3RydWN0IGlub2RlICppcCwKKwkJICAgICAgIHN0cnVjdCB4dHNwbGl0ICogc3BsaXQsIHN0cnVjdCBtZXRhcGFnZSAqKiBybXBwKTsKKworI2lmZGVmIF9TVElMTF9UT19QT1JUCitzdGF0aWMgaW50IHh0RGVsZXRlVXAodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgbWV0YXBhZ2UgKiBmbXAsCisJCSAgICAgIHh0cGFnZV90ICogZnAsIHN0cnVjdCBidHN0YWNrICogYnRzdGFjayk7CisKK3N0YXRpYyBpbnQgeHRTZWFyY2hOb2RlKHN0cnVjdCBpbm9kZSAqaXAsCisJCQl4YWRfdCAqIHhhZCwKKwkJCWludCAqY21wcCwgc3RydWN0IGJ0c3RhY2sgKiBidHN0YWNrLCBpbnQgZmxhZyk7CisKK3N0YXRpYyBpbnQgeHRSZWxpbmsodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLCB4dHBhZ2VfdCAqIGZwKTsKKyNlbmRpZgkJCQkvKiAgX1NUSUxMX1RPX1BPUlQgKi8KKworLyogRXh0ZXJuYWwgcmVmZXJlbmNlcyAqLworCisvKgorICogICAgICBkZWJ1ZyBjb250cm9sCisgKi8KKy8qICAgICAgI2RlZmluZSBfSkZTX0RFQlVHX1hUUkVFICAgICAgICAxICovCisKKworLyoKKyAqICAgICAgeHRMb29rdXAoKQorICoKKyAqIGZ1bmN0aW9uOiBtYXAgYSBzaW5nbGUgcGFnZSBpbnRvIGEgcGh5c2ljYWwgZXh0ZW50OworICovCitpbnQgeHRMb29rdXAoc3RydWN0IGlub2RlICppcCwgczY0IGxzdGFydCwKKwkgICAgIHM2NCBsbGVuLCBpbnQgKnBmbGFnLCBzNjQgKiBwYWRkciwgczMyICogcGxlbiwgaW50IG5vX2NoZWNrKQoreworCWludCByYyA9IDA7CisJc3RydWN0IGJ0c3RhY2sgYnRzdGFjazsKKwlpbnQgY21wOworCXM2NCBibjsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCXh0cGFnZV90ICpwOworCWludCBpbmRleDsKKwl4YWRfdCAqeGFkOworCXM2NCBzaXplLCB4b2ZmLCB4ZW5kOworCWludCB4bGVuOworCXM2NCB4YWRkcjsKKworCSpwbGVuID0gMDsKKworCWlmICghbm9fY2hlY2spIHsKKwkJLyogaXMgbG9va3VwIG9mZnNldCBiZXlvbmQgZW9mID8gKi8KKwkJc2l6ZSA9ICgodTY0KSBpcC0+aV9zaXplICsgKEpGU19TQkkoaXAtPmlfc2IpLT5ic2l6ZSAtIDEpKSA+PgorCQkgICAgSkZTX1NCSShpcC0+aV9zYiktPmwyYnNpemU7CisJCWlmIChsc3RhcnQgPj0gc2l6ZSkgeworCQkJamZzX2VycigieHRMb29rdXA6IGxzdGFydCAoMHglbHgpID49IHNpemUgKDB4JWx4KSIsCisJCQkJKHVsb25nKSBsc3RhcnQsICh1bG9uZykgc2l6ZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCS8qCisJICogc2VhcmNoIGZvciB0aGUgeGFkIGVudHJ5IGNvdmVyaW5nIHRoZSBsb2dpY2FsIGV4dGVudAorCSAqLworLy9zZWFyY2g6CisJaWYgKChyYyA9IHh0U2VhcmNoKGlwLCBsc3RhcnQsICZjbXAsICZidHN0YWNrLCAwKSkpIHsKKwkJamZzX2VycigieHRMb29rdXA6IHh0U2VhcmNoIHJldHVybmVkICVkIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyoKKwkgKiAgICAgIGNvbXB1dGUgdGhlIHBoeXNpY2FsIGV4dGVudCBjb3ZlcmluZyBsb2dpY2FsIGV4dGVudAorCSAqCisJICogTi5CLiBzZWFyY2ggbWF5IGhhdmUgZmFpbGVkIChlLmcuLCBob2xlIGluIHNwYXJzZSBmaWxlKSwKKwkgKiBhbmQgcmV0dXJuZWQgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGVudHJ5LgorCSAqLworCS8qIHJldHJpZXZlIHNlYXJjaCByZXN1bHQgKi8KKwlYVF9HRVRTRUFSQ0goaXAsIGJ0c3RhY2sudG9wLCBibiwgbXAsIHAsIGluZGV4KTsKKworCS8qIGlzIHhhZCBmb3VuZCBjb3ZlcmluZyBzdGFydCBvZiBsb2dpY2FsIGV4dGVudCA/CisJICogbHN0YXJ0IGlzIGEgcGFnZSBzdGFydCBhZGRyZXNzLAorCSAqIGkuZS4sIGxzdGFydCBjYW5ub3Qgc3RhcnQgaW4gYSBob2xlOworCSAqLworCWlmIChjbXApCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBseGQgY292ZXJlZCBieSB4YWQKKwkgKi8KKwl4YWQgPSAmcC0+eGFkW2luZGV4XTsKKwl4b2ZmID0gb2Zmc2V0WEFEKHhhZCk7CisJeGxlbiA9IGxlbmd0aFhBRCh4YWQpOworCXhlbmQgPSB4b2ZmICsgeGxlbjsKKwl4YWRkciA9IGFkZHJlc3NYQUQoeGFkKTsKKworCS8qIGluaXRpYWxpemUgbmV3IHB4ZCAqLworCSpwZmxhZyA9IHhhZC0+ZmxhZzsKKwkqcGFkZHIgPSB4YWRkciArIChsc3RhcnQgLSB4b2ZmKTsKKwkvKiBhIHBhZ2UgbXVzdCBiZSBmdWxseSBjb3ZlcmVkIGJ5IGFuIHhhZCAqLworCSpwbGVuID0gbWluKHhlbmQgLSBsc3RhcnQsIGxsZW4pOworCisgICAgICBvdXQ6CisJWFRfUFVUUEFHRShtcCk7CisKKwlyZXR1cm4gcmM7Cit9CisKKworLyoKKyAqICAgICAgeHRMb29rdXBMaXN0KCkKKyAqCisgKiBmdW5jdGlvbjogbWFwIGEgc2luZ2xlIGxvZ2ljYWwgZXh0ZW50IGludG8gYSBsaXN0IG9mIHBoeXNpY2FsIGV4dGVudDsKKyAqCisgKiBwYXJhbWV0ZXI6CisgKiAgICAgIHN0cnVjdCBpbm9kZSAgICAqaXAsCisgKiAgICAgIHN0cnVjdCBseGRsaXN0ICAqbHhkbGlzdCwgICAgICAgbHhkIGxpc3QgKGluKQorICogICAgICBzdHJ1Y3QgeGFkbGlzdCAgKnhhZGxpc3QsICAgICAgIHhhZCBsaXN0IChpbi9vdXQpCisgKiAgICAgIGludAkJZmxhZykKKyAqCisgKiBjb3ZlcmFnZSBvZiBseGQgYnkgeGFkIHVuZGVyIGFzc3VtcHRpb24gb2YKKyAqIC4gbHhkJ3MgYXJlIG9yZGVyZWQgYW5kIGRpc2pvaW50LgorICogLiB4YWQncyBhcmUgb3JkZXJlZCBhbmQgZGlzam9pbnQuCisgKgorICogcmV0dXJuOgorICogICAgICAwOiAgICAgIHN1Y2Nlc3MKKyAqCisgKiBub3RlOiBhIHBhZ2UgYmVpbmcgd3JpdHRlbiAoZXZlbiBhIHNpbmdsZSBieXRlKSBpcyBiYWNrZWQgZnVsbHksCisgKiAgICAgIGV4Y2VwdCB0aGUgbGFzdCBwYWdlIHdoaWNoIGlzIG9ubHkgYmFja2VkIHdpdGggYmxvY2tzCisgKiAgICAgIHJlcXVpcmVkIHRvIGNvdmVyIHRoZSBsYXN0IGJ5dGU7CisgKiAgICAgIHRoZSBleHRlbnQgYmFja2luZyBhIHBhZ2UgaXMgZnVsbHkgY29udGFpbmVkIHdpdGhpbiBhbiB4YWQ7CisgKi8KK2ludCB4dExvb2t1cExpc3Qoc3RydWN0IGlub2RlICppcCwgc3RydWN0IGx4ZGxpc3QgKiBseGRsaXN0LAorCQkgc3RydWN0IHhhZGxpc3QgKiB4YWRsaXN0LCBpbnQgZmxhZykKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBidHN0YWNrIGJ0c3RhY2s7CisJaW50IGNtcDsKKwlzNjQgYm47CisJc3RydWN0IG1ldGFwYWdlICptcDsKKwl4dHBhZ2VfdCAqcDsKKwlpbnQgaW5kZXg7CisJbHhkX3QgKmx4ZDsKKwl4YWRfdCAqeGFkLCAqcHhkOworCXM2NCBzaXplLCBsc3RhcnQsIGxlbmQsIHhzdGFydCwgeGVuZCwgcHN0YXJ0OworCXM2NCBsbGVuLCB4bGVuLCBwbGVuOworCXM2NCB4YWRkciwgcGFkZHI7CisJaW50IG5seGQsIG5weGQsIG1heG5weGQ7CisKKwlucHhkID0geGFkbGlzdC0+bnhhZCA9IDA7CisJbWF4bnB4ZCA9IHhhZGxpc3QtPm1heG54YWQ7CisJcHhkID0geGFkbGlzdC0+eGFkOworCisJbmx4ZCA9IGx4ZGxpc3QtPm5seGQ7CisJbHhkID0gbHhkbGlzdC0+bHhkOworCisJbHN0YXJ0ID0gb2Zmc2V0TFhEKGx4ZCk7CisJbGxlbiA9IGxlbmd0aExYRChseGQpOworCWxlbmQgPSBsc3RhcnQgKyBsbGVuOworCisJc2l6ZSA9IChpcC0+aV9zaXplICsgKEpGU19TQkkoaXAtPmlfc2IpLT5ic2l6ZSAtIDEpKSA+PgorCSAgICBKRlNfU0JJKGlwLT5pX3NiKS0+bDJic2l6ZTsKKworCS8qCisJICogc2VhcmNoIGZvciB0aGUgeGFkIGVudHJ5IGNvdmVyaW5nIHRoZSBsb2dpY2FsIGV4dGVudAorCSAqLworICAgICAgc2VhcmNoOgorCWlmIChsc3RhcnQgPj0gc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoKHJjID0geHRTZWFyY2goaXAsIGxzdGFydCwgJmNtcCwgJmJ0c3RhY2ssIDApKSkKKwkJcmV0dXJuIHJjOworCisJLyoKKwkgKiAgICAgIGNvbXB1dGUgdGhlIHBoeXNpY2FsIGV4dGVudCBjb3ZlcmluZyBsb2dpY2FsIGV4dGVudAorCSAqCisJICogTi5CLiBzZWFyY2ggbWF5IGhhdmUgZmFpbGVkIChlLmcuLCBob2xlIGluIHNwYXJzZSBmaWxlKSwKKwkgKiBhbmQgcmV0dXJuZWQgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGVudHJ5LgorCSAqLworLy9tYXA6CisJLyogcmV0cmlldmUgc2VhcmNoIHJlc3VsdCAqLworCVhUX0dFVFNFQVJDSChpcCwgYnRzdGFjay50b3AsIGJuLCBtcCwgcCwgaW5kZXgpOworCisJLyogaXMgeGFkIG9uIHRoZSBuZXh0IHNpYmxpbmcgcGFnZSA/ICovCisJaWYgKGluZGV4ID09IGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpKSB7CisJCWlmIChwLT5oZWFkZXIuZmxhZyAmIEJUX1JPT1QpCisJCQlnb3RvIG1hcGVuZDsKKworCQlpZiAoKGJuID0gbGU2NF90b19jcHUocC0+aGVhZGVyLm5leHQpKSA9PSAwKQorCQkJZ290byBtYXBlbmQ7CisKKwkJWFRfUFVUUEFHRShtcCk7CisKKwkJLyogZ2V0IG5leHQgc2libGluZyBwYWdlICovCisJCVhUX0dFVFBBR0UoaXAsIGJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCWluZGV4ID0gWFRFTlRSWVNUQVJUOworCX0KKworCXhhZCA9ICZwLT54YWRbaW5kZXhdOworCisJLyoKKwkgKiBpcyBseGQgY292ZXJlZCBieSB4YWQgPworCSAqLworICAgICAgY29tcGFyZToKKwl4c3RhcnQgPSBvZmZzZXRYQUQoeGFkKTsKKwl4bGVuID0gbGVuZ3RoWEFEKHhhZCk7CisJeGVuZCA9IHhzdGFydCArIHhsZW47CisJeGFkZHIgPSBhZGRyZXNzWEFEKHhhZCk7CisKKyAgICAgIGNvbXBhcmUxOgorCWlmICh4c3RhcnQgPCBsc3RhcnQpCisJCWdvdG8gY29tcGFyZTI7CisKKwkvKiAobHN0YXJ0IDw9IHhzdGFydCkgKi8KKworCS8qIGx4ZCBpcyBOT1QgY292ZXJlZCBieSB4YWQgKi8KKwlpZiAobGVuZCA8PSB4c3RhcnQpIHsKKwkJLyoKKwkJICogZ2V0IG5leHQgbHhkCisJCSAqLworCQlpZiAoLS1ubHhkID09IDApCisJCQlnb3RvIG1hcGVuZDsKKwkJbHhkKys7CisKKwkJbHN0YXJ0ID0gb2Zmc2V0TFhEKGx4ZCk7CisJCWxsZW4gPSBsZW5ndGhMWEQobHhkKTsKKwkJbGVuZCA9IGxzdGFydCArIGxsZW47CisJCWlmIChsc3RhcnQgPj0gc2l6ZSkKKwkJCWdvdG8gbWFwZW5kOworCisJCS8qIGNvbXBhcmUgd2l0aCB0aGUgY3VycmVudCB4YWQgICovCisJCWdvdG8gY29tcGFyZTE7CisJfQorCS8qIGx4ZCBpcyBjb3ZlcmVkIGJ5IHhhZCAqLworCWVsc2UgewkJCS8qICh4c3RhcnQgPCBsZW5kKSAqLworCisJCS8qIGluaXRpYWxpemUgbmV3IHB4ZCAqLworCQlwc3RhcnQgPSB4c3RhcnQ7CisJCXBsZW4gPSBtaW4obGVuZCAtIHhzdGFydCwgeGxlbik7CisJCXBhZGRyID0geGFkZHI7CisKKwkJZ290byBjb3ZlcjsKKwl9CisKKwkvKiAoeHN0YXJ0IDwgbHN0YXJ0KSAqLworICAgICAgY29tcGFyZTI6CisJLyogbHhkIGlzIGNvdmVyZWQgYnkgeGFkICovCisJaWYgKGxzdGFydCA8IHhlbmQpIHsKKwkJLyogaW5pdGlhbGl6ZSBuZXcgcHhkICovCisJCXBzdGFydCA9IGxzdGFydDsKKwkJcGxlbiA9IG1pbih4ZW5kIC0gbHN0YXJ0LCBsbGVuKTsKKwkJcGFkZHIgPSB4YWRkciArIChsc3RhcnQgLSB4c3RhcnQpOworCisJCWdvdG8gY292ZXI7CisJfQorCS8qIGx4ZCBpcyBOT1QgY292ZXJlZCBieSB4YWQgKi8KKwllbHNlIHsJCQkvKiAoeGVuZCA8PSBsc3RhcnQpICovCisKKwkJLyoKKwkJICogZ2V0IG5leHQgeGFkCisJCSAqCisJCSAqIGxpbmVhciBzZWFyY2ggbmV4dCB4YWQgY292ZXJpbmcgbHhkIG9uCisJCSAqIHRoZSBjdXJyZW50IHhhZCBwYWdlLCBhbmQgdGhlbiB0cmVlIHNlYXJjaAorCQkgKi8KKwkJaWYgKGluZGV4ID09IGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpIC0gMSkgeworCQkJaWYgKHAtPmhlYWRlci5mbGFnICYgQlRfUk9PVCkKKwkJCQlnb3RvIG1hcGVuZDsKKworCQkJWFRfUFVUUEFHRShtcCk7CisJCQlnb3RvIHNlYXJjaDsKKwkJfSBlbHNlIHsKKwkJCWluZGV4Kys7CisJCQl4YWQrKzsKKworCQkJLyogY29tcGFyZSB3aXRoIG5ldyB4YWQgKi8KKwkJCWdvdG8gY29tcGFyZTsKKwkJfQorCX0KKworCS8qCisJICogbHhkIGlzIGNvdmVyZWQgYnkgeGFkIGFuZCBhIG5ldyBweGQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQKKwkgKiAobHN0YXJ0IDw9IHhzdGFydCA8IGxlbmQpIG9yICh4c3RhcnQgPCBsc3RhcnQgPCB4ZW5kKQorCSAqLworICAgICAgY292ZXI6CisJLyogZmluYWxpemUgcHhkIGNvcnJlc3BvbmRpbmcgdG8gY3VycmVudCB4YWQgKi8KKwlYVF9QVVRFTlRSWShweGQsIHhhZC0+ZmxhZywgcHN0YXJ0LCBwbGVuLCBwYWRkcik7CisKKwlpZiAoKytucHhkID49IG1heG5weGQpCisJCWdvdG8gbWFwZW5kOworCXB4ZCsrOworCisJLyoKKwkgKiBseGQgaXMgZnVsbHkgY292ZXJlZCBieSB4YWQKKwkgKi8KKwlpZiAobGVuZCA8PSB4ZW5kKSB7CisJCS8qCisJCSAqIGdldCBuZXh0IGx4ZAorCQkgKi8KKwkJaWYgKC0tbmx4ZCA9PSAwKQorCQkJZ290byBtYXBlbmQ7CisJCWx4ZCsrOworCisJCWxzdGFydCA9IG9mZnNldExYRChseGQpOworCQlsbGVuID0gbGVuZ3RoTFhEKGx4ZCk7CisJCWxlbmQgPSBsc3RhcnQgKyBsbGVuOworCQlpZiAobHN0YXJ0ID49IHNpemUpCisJCQlnb3RvIG1hcGVuZDsKKworCQkvKgorCQkgKiB0ZXN0IGZvciBvbGQgeGFkIGNvdmVyaW5nIG5ldyBseGQKKwkJICogKG9sZCB4c3RhcnQgPCBuZXcgbHN0YXJ0KQorCQkgKi8KKwkJZ290byBjb21wYXJlMjsKKwl9CisJLyoKKwkgKiBseGQgaXMgcGFydGlhbGx5IGNvdmVyZWQgYnkgeGFkCisJICovCisJZWxzZSB7CQkJLyogKHhlbmQgPCBsZW5kKSAgKi8KKworCQkvKgorCQkgKiBnZXQgbmV4dCB4YWQKKwkJICoKKwkJICogbGluZWFyIHNlYXJjaCBuZXh0IHhhZCBjb3ZlcmluZyBseGQgb24KKwkJICogdGhlIGN1cnJlbnQgeGFkIHBhZ2UsIGFuZCB0aGVuIG5leHQgeGFkIHBhZ2Ugc2VhcmNoCisJCSAqLworCQlpZiAoaW5kZXggPT0gbGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCkgLSAxKSB7CisJCQlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9ST09UKQorCQkJCWdvdG8gbWFwZW5kOworCisJCQlpZiAoKGJuID0gbGU2NF90b19jcHUocC0+aGVhZGVyLm5leHQpKSA9PSAwKQorCQkJCWdvdG8gbWFwZW5kOworCisJCQlYVF9QVVRQQUdFKG1wKTsKKworCQkJLyogZ2V0IG5leHQgc2libGluZyBwYWdlICovCisJCQlYVF9HRVRQQUdFKGlwLCBibiwgbXAsIFBTSVpFLCBwLCByYyk7CisJCQlpZiAocmMpCisJCQkJcmV0dXJuIHJjOworCisJCQlpbmRleCA9IFhURU5UUllTVEFSVDsKKwkJCXhhZCA9ICZwLT54YWRbaW5kZXhdOworCQl9IGVsc2UgeworCQkJaW5kZXgrKzsKKwkJCXhhZCsrOworCQl9CisKKwkJLyoKKwkJICogdGVzdCBmb3IgbmV3IHhhZCBjb3ZlcmluZyBvbGQgbHhkCisJCSAqIChvbGQgbHN0YXJ0IDwgbmV3IHhzdGFydCkKKwkJICovCisJCWdvdG8gY29tcGFyZTsKKwl9CisKKyAgICAgIG1hcGVuZDoKKwl4YWRsaXN0LT5ueGFkID0gbnB4ZDsKKworLy9vdXQ6CisJWFRfUFVUUEFHRShtcCk7CisKKwlyZXR1cm4gcmM7Cit9CisKKworLyoKKyAqICAgICAgeHRTZWFyY2goKQorICoKKyAqIGZ1bmN0aW9uOiAgICBzZWFyY2ggZm9yIHRoZSB4YWQgZW50cnkgY292ZXJpbmcgc3BlY2lmaWVkIG9mZnNldC4KKyAqCisgKiBwYXJhbWV0ZXJzOgorICogICAgICBpcCAgICAgIC0gZmlsZSBvYmplY3Q7CisgKiAgICAgIHhvZmYgICAgLSBleHRlbnQgb2Zmc2V0OworICogICAgICBjbXBwICAgIC0gY29tcGFyaXNvbiByZXN1bHQ6CisgKiAgICAgIGJ0c3RhY2sgLSB0cmF2ZXJzZSBzdGFjazsKKyAqICAgICAgZmxhZyAgICAtIHNlYXJjaCBwcm9jZXNzIGZsYWcgKFhUX0lOU0VSVCk7CisgKgorICogcmV0dXJuczoKKyAqICAgICAgYnRzdGFjayBjb250YWlucyAoYm4sIGluZGV4KSBvZiBzZWFyY2ggcGF0aCB0cmF2ZXJzZWQgdG8gdGhlIGVudHJ5LgorICogICAgICAqY21wcCBpcyBzZXQgdG8gcmVzdWx0IG9mIGNvbXBhcmlzb24gd2l0aCB0aGUgZW50cnkgcmV0dXJuZWQuCisgKiAgICAgIHRoZSBwYWdlIGNvbnRhaW5pbmcgdGhlIGVudHJ5IGlzIHBpbm5lZCBhdCBleGl0LgorICovCitzdGF0aWMgaW50IHh0U2VhcmNoKHN0cnVjdCBpbm9kZSAqaXAsIHM2NCB4b2ZmLAkvKiBvZmZzZXQgb2YgZXh0ZW50ICovCisJCSAgICBpbnQgKmNtcHAsIHN0cnVjdCBidHN0YWNrICogYnRzdGFjaywgaW50IGZsYWcpCit7CisJc3RydWN0IGpmc19pbm9kZV9pbmZvICpqZnNfaXAgPSBKRlNfSVAoaXApOworCWludCByYyA9IDA7CisJaW50IGNtcCA9IDE7CQkvKiBpbml0IGZvciBlbXB0eSBwYWdlICovCisJczY0IGJuOwkJCS8qIGJsb2NrIG51bWJlciAqLworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CS8qIHBhZ2UgYnVmZmVyICovCisJeHRwYWdlX3QgKnA7CQkvKiBwYWdlICovCisJeGFkX3QgKnhhZDsKKwlpbnQgYmFzZSwgaW5kZXgsIGxpbSwgYnRpbmRleDsKKwlzdHJ1Y3QgYnRmcmFtZSAqYnRzcDsKKwlpbnQgbnNwbGl0ID0gMDsJCS8qIG51bWJlciBvZiBwYWdlcyB0byBzcGxpdCAqLworCXM2NCB0NjQ7CisKKwlJTkNSRU1FTlQoeHRTdGF0LnNlYXJjaCk7CisKKwlCVF9DTFIoYnRzdGFjayk7CisKKwlidHN0YWNrLT5uc3BsaXQgPSAwOworCisJLyoKKwkgKiAgICAgIHNlYXJjaCBkb3duIHRyZWUgZnJvbSByb290OgorCSAqCisJICogYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgZW50cmllcyBvZiA8S2ksIFBpPiBhbmQgPEtqLCBQaj4gb2YKKwkgKiBpbnRlcm5hbCBwYWdlLCBjaGlsZCBwYWdlIFBpIGNvbnRhaW5zIGVudHJ5IHdpdGggaywgS2kgPD0gSyA8IEtqLgorCSAqCisJICogaWYgZW50cnkgd2l0aCBzZWFyY2gga2V5IEsgaXMgbm90IGZvdW5kCisJICogaW50ZXJuYWwgcGFnZSBzZWFyY2ggZmluZCB0aGUgZW50cnkgd2l0aCBsYXJnZXN0IGtleSBLaQorCSAqIGxlc3MgdGhhbiBLIHdoaWNoIHBvaW50IHRvIHRoZSBjaGlsZCBwYWdlIHRvIHNlYXJjaDsKKwkgKiBsZWFmIHBhZ2Ugc2VhcmNoIGZpbmQgdGhlIGVudHJ5IHdpdGggc21hbGxlc3Qga2V5IEtqCisJICogZ3JlYXRlciB0aGFuIEsgc28gdGhhdCB0aGUgcmV0dXJuZWQgaW5kZXggaXMgdGhlIHBvc2l0aW9uIG9mCisJICogdGhlIGVudHJ5IHRvIGJlIHNoaWZ0ZWQgcmlnaHQgZm9yIGluc2VydGlvbiBvZiBuZXcgZW50cnkuCisJICogZm9yIGVtcHR5IHRyZWUsIHNlYXJjaCBrZXkgaXMgZ3JlYXRlciB0aGFuIGFueSBrZXkgb2YgdGhlIHRyZWUuCisJICoKKwkgKiBieSBjb252ZW50aW9uLCByb290IGJuID0gMC4KKwkgKi8KKwlmb3IgKGJuID0gMDs7KSB7CisJCS8qIGdldC9waW4gdGhlIHBhZ2UgdG8gc2VhcmNoICovCisJCVhUX0dFVFBBR0UoaXAsIGJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCS8qIHRyeSBzZXF1ZW50aWFsIGFjY2VzcyBoZXVyaXN0aWNzIHdpdGggdGhlIHByZXZpb3VzCisJCSAqIGFjY2VzcyBlbnRyeSBpbiB0YXJnZXQgbGVhZiBwYWdlOgorCQkgKiBvbmNlIHNlYXJjaCBuYXJyb3dlZCBkb3duIGludG8gdGhlIHRhcmdldCBsZWFmLAorCQkgKiBrZXkgbXVzdCBlaXRoZXIgbWF0Y2ggYW4gZW50cnkgaW4gdGhlIGxlYWYgb3IKKwkJICoga2V5IGVudHJ5IGRvZXMgbm90IGV4aXN0IGluIHRoZSB0cmVlOworCQkgKi8KKy8vZmFzdFNlYXJjaDoKKwkJaWYgKChqZnNfaXAtPmJ0b3JkZXIgJiBCVF9TRVFVRU5USUFMKSAmJgorCQkgICAgKHAtPmhlYWRlci5mbGFnICYgQlRfTEVBRikgJiYKKwkJICAgIChpbmRleCA9IGpmc19pcC0+YnRpbmRleCkgPAorCQkgICAgbGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCkpIHsKKwkJCXhhZCA9ICZwLT54YWRbaW5kZXhdOworCQkJdDY0ID0gb2Zmc2V0WEFEKHhhZCk7CisJCQlpZiAoeG9mZiA8IHQ2NCArIGxlbmd0aFhBRCh4YWQpKSB7CisJCQkJaWYgKHhvZmYgPj0gdDY0KSB7CisJCQkJCSpjbXBwID0gMDsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCisJCQkJLyogc3RvcCBzZXF1ZW50aWFsIGFjY2VzcyBoZXVyaXN0aWNzICovCisJCQkJZ290byBiaW5hcnlTZWFyY2g7CisJCQl9IGVsc2UgewkvKiAodDY0ICsgbGVuZ3RoWEFEKHhhZCkpIDw9IHhvZmYgKi8KKworCQkJCS8qIHRyeSBuZXh0IHNlcXVlbnRpYWwgZW50cnkgKi8KKwkJCQlpbmRleCsrOworCQkJCWlmIChpbmRleCA8CisJCQkJICAgIGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpKSB7CisJCQkJCXhhZCsrOworCQkJCQl0NjQgPSBvZmZzZXRYQUQoeGFkKTsKKwkJCQkJaWYgKHhvZmYgPCB0NjQgKyBsZW5ndGhYQUQoeGFkKSkgeworCQkJCQkJaWYgKHhvZmYgPj0gdDY0KSB7CisJCQkJCQkJKmNtcHAgPSAwOworCQkJCQkJCWdvdG8gb3V0OworCQkJCQkJfQorCisJCQkJCQkvKiBtaXNzOiBrZXkgZmFsbHMgYmV0d2VlbgorCQkJCQkJICogcHJldmlvdXMgYW5kIHRoaXMgZW50cnkKKwkJCQkJCSAqLworCQkJCQkJKmNtcHAgPSAxOworCQkJCQkJZ290byBvdXQ7CisJCQkJCX0KKworCQkJCQkvKiAoeG9mZiA+PSB0NjQgKyBsZW5ndGhYQUQoeGFkKSk7CisJCQkJCSAqIG1hdGNoaW5nIGVudHJ5IG1heSBiZSBmdXJ0aGVyIG91dDoKKwkJCQkJICogc3RvcCBoZXVyaXN0aWMgc2VhcmNoCisJCQkJCSAqLworCQkJCQkvKiBzdG9wIHNlcXVlbnRpYWwgYWNjZXNzIGhldXJpc3RpY3MgKi8KKwkJCQkJZ290byBiaW5hcnlTZWFyY2g7CisJCQkJfQorCisJCQkJLyogKGluZGV4ID09IHAtPmhlYWRlci5uZXh0aW5kZXgpOworCQkJCSAqIG1pc3M6IGtleSBlbnRyeSBkb2VzIG5vdCBleGlzdCBpbgorCQkJCSAqIHRoZSB0YXJnZXQgbGVhZi90cmVlCisJCQkJICovCisJCQkJKmNtcHAgPSAxOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQkvKgorCQkJICogaWYgaGl0LCByZXR1cm4gaW5kZXggb2YgdGhlIGVudHJ5IGZvdW5kLCBhbmQKKwkJCSAqIGlmIG1pc3MsIHdoZXJlIG5ldyBlbnRyeSB3aXRoIHNlYXJjaCBrZXkgaXMKKwkJCSAqIHRvIGJlIGluc2VydGVkOworCQkJICovCisJCSAgICAgIG91dDoKKwkJCS8qIGNvbXB1dGUgbnVtYmVyIG9mIHBhZ2VzIHRvIHNwbGl0ICovCisJCQlpZiAoZmxhZyAmIFhUX0lOU0VSVCkgeworCQkJCWlmIChwLT5oZWFkZXIubmV4dGluZGV4ID09CS8qIGxpdHRsZS1lbmRpYW4gKi8KKwkJCQkgICAgcC0+aGVhZGVyLm1heGVudHJ5KQorCQkJCQluc3BsaXQrKzsKKwkJCQllbHNlCisJCQkJCW5zcGxpdCA9IDA7CisJCQkJYnRzdGFjay0+bnNwbGl0ID0gbnNwbGl0OworCQkJfQorCisJCQkvKiBzYXZlIHNlYXJjaCByZXN1bHQgKi8KKwkJCWJ0c3AgPSBidHN0YWNrLT50b3A7CisJCQlidHNwLT5ibiA9IGJuOworCQkJYnRzcC0+aW5kZXggPSBpbmRleDsKKwkJCWJ0c3AtPm1wID0gbXA7CisKKwkJCS8qIHVwZGF0ZSBzZXF1ZW50aWFsIGFjY2VzcyBoZXVyaXN0aWNzICovCisJCQlqZnNfaXAtPmJ0aW5kZXggPSBpbmRleDsKKworCQkJSU5DUkVNRU5UKHh0U3RhdC5mYXN0U2VhcmNoKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogd2VsbCwgLi4uIGZ1bGwgc2VhcmNoIG5vdyAqLworCSAgICAgIGJpbmFyeVNlYXJjaDoKKwkJbGltID0gbGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCkgLSBYVEVOVFJZU1RBUlQ7CisKKwkJLyoKKwkJICogYmluYXJ5IHNlYXJjaCB3aXRoIHNlYXJjaCBrZXkgSyBvbiB0aGUgY3VycmVudCBwYWdlCisJCSAqLworCQlmb3IgKGJhc2UgPSBYVEVOVFJZU1RBUlQ7IGxpbTsgbGltID4+PSAxKSB7CisJCQlpbmRleCA9IGJhc2UgKyAobGltID4+IDEpOworCisJCQlYVF9DTVAoY21wLCB4b2ZmLCAmcC0+eGFkW2luZGV4XSwgdDY0KTsKKwkJCWlmIChjbXAgPT0gMCkgeworCQkJCS8qCisJCQkJICogICAgICBzZWFyY2ggaGl0CisJCQkJICovCisJCQkJLyogc2VhcmNoIGhpdCAtIGxlYWYgcGFnZToKKwkJCQkgKiByZXR1cm4gdGhlIGVudHJ5IGZvdW5kCisJCQkJICovCisJCQkJaWYgKHAtPmhlYWRlci5mbGFnICYgQlRfTEVBRikgeworCQkJCQkqY21wcCA9IGNtcDsKKworCQkJCQkvKiBjb21wdXRlIG51bWJlciBvZiBwYWdlcyB0byBzcGxpdCAqLworCQkJCQlpZiAoZmxhZyAmIFhUX0lOU0VSVCkgeworCQkJCQkJaWYgKHAtPmhlYWRlci5uZXh0aW5kZXggPT0KKwkJCQkJCSAgICBwLT5oZWFkZXIubWF4ZW50cnkpCisJCQkJCQkJbnNwbGl0Kys7CisJCQkJCQllbHNlCisJCQkJCQkJbnNwbGl0ID0gMDsKKwkJCQkJCWJ0c3RhY2stPm5zcGxpdCA9IG5zcGxpdDsKKwkJCQkJfQorCisJCQkJCS8qIHNhdmUgc2VhcmNoIHJlc3VsdCAqLworCQkJCQlidHNwID0gYnRzdGFjay0+dG9wOworCQkJCQlidHNwLT5ibiA9IGJuOworCQkJCQlidHNwLT5pbmRleCA9IGluZGV4OworCQkJCQlidHNwLT5tcCA9IG1wOworCisJCQkJCS8qIGluaXQgc2VxdWVudGlhbCBhY2Nlc3MgaGV1cmlzdGljcyAqLworCQkJCQlidGluZGV4ID0gamZzX2lwLT5idGluZGV4OworCQkJCQlpZiAoaW5kZXggPT0gYnRpbmRleCB8fAorCQkJCQkgICAgaW5kZXggPT0gYnRpbmRleCArIDEpCisJCQkJCQlqZnNfaXAtPmJ0b3JkZXIgPSBCVF9TRVFVRU5USUFMOworCQkJCQllbHNlCisJCQkJCQlqZnNfaXAtPmJ0b3JkZXIgPSBCVF9SQU5ET007CisJCQkJCWpmc19pcC0+YnRpbmRleCA9IGluZGV4OworCisJCQkJCXJldHVybiAwOworCQkJCX0KKworCQkJCS8qIHNlYXJjaCBoaXQgLSBpbnRlcm5hbCBwYWdlOgorCQkJCSAqIGRlc2NlbmQvc2VhcmNoIGl0cyBjaGlsZCBwYWdlCisJCQkJICovCisJCQkJZ290byBuZXh0OworCQkJfQorCisJCQlpZiAoY21wID4gMCkgeworCQkJCWJhc2UgPSBpbmRleCArIDE7CisJCQkJLS1saW07CisJCQl9CisJCX0KKworCQkvKgorCQkgKiAgICAgIHNlYXJjaCBtaXNzCisJCSAqCisJCSAqIGJhc2UgaXMgdGhlIHNtYWxsZXN0IGluZGV4IHdpdGgga2V5IChLaikgZ3JlYXRlciB0aGFuCisJCSAqIHNlYXJjaCBrZXkgKEspIGFuZCBtYXkgYmUgemVybyBvciBtYXhlbnRyeSBpbmRleC4KKwkJICovCisJCS8qCisJCSAqIHNlYXJjaCBtaXNzIC0gbGVhZiBwYWdlOgorCQkgKgorCQkgKiByZXR1cm4gbG9jYXRpb24gb2YgZW50cnkgKGJhc2UpIHdoZXJlIG5ldyBlbnRyeSB3aXRoCisJCSAqIHNlYXJjaCBrZXkgSyBpcyB0byBiZSBpbnNlcnRlZC4KKwkJICovCisJCWlmIChwLT5oZWFkZXIuZmxhZyAmIEJUX0xFQUYpIHsKKwkJCSpjbXBwID0gY21wOworCisJCQkvKiBjb21wdXRlIG51bWJlciBvZiBwYWdlcyB0byBzcGxpdCAqLworCQkJaWYgKGZsYWcgJiBYVF9JTlNFUlQpIHsKKwkJCQlpZiAocC0+aGVhZGVyLm5leHRpbmRleCA9PQorCQkJCSAgICBwLT5oZWFkZXIubWF4ZW50cnkpCisJCQkJCW5zcGxpdCsrOworCQkJCWVsc2UKKwkJCQkJbnNwbGl0ID0gMDsKKwkJCQlidHN0YWNrLT5uc3BsaXQgPSBuc3BsaXQ7CisJCQl9CisKKwkJCS8qIHNhdmUgc2VhcmNoIHJlc3VsdCAqLworCQkJYnRzcCA9IGJ0c3RhY2stPnRvcDsKKwkJCWJ0c3AtPmJuID0gYm47CisJCQlidHNwLT5pbmRleCA9IGJhc2U7CisJCQlidHNwLT5tcCA9IG1wOworCisJCQkvKiBpbml0IHNlcXVlbnRpYWwgYWNjZXNzIGhldXJpc3RpY3MgKi8KKwkJCWJ0aW5kZXggPSBqZnNfaXAtPmJ0aW5kZXg7CisJCQlpZiAoYmFzZSA9PSBidGluZGV4IHx8IGJhc2UgPT0gYnRpbmRleCArIDEpCisJCQkJamZzX2lwLT5idG9yZGVyID0gQlRfU0VRVUVOVElBTDsKKwkJCWVsc2UKKwkJCQlqZnNfaXAtPmJ0b3JkZXIgPSBCVF9SQU5ET007CisJCQlqZnNfaXAtPmJ0aW5kZXggPSBiYXNlOworCisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qCisJCSAqIHNlYXJjaCBtaXNzIC0gbm9uLWxlYWYgcGFnZToKKwkJICoKKwkJICogaWYgYmFzZSBpcyBub24temVybywgZGVjcmVtZW50IGJhc2UgYnkgb25lIHRvIGdldCB0aGUgcGFyZW50CisJCSAqIGVudHJ5IG9mIHRoZSBjaGlsZCBwYWdlIHRvIHNlYXJjaC4KKwkJICovCisJCWluZGV4ID0gYmFzZSA/IGJhc2UgLSAxIDogYmFzZTsKKworCQkvKgorCQkgKiBnbyBkb3duIHRvIGNoaWxkIHBhZ2UKKwkJICovCisJICAgICAgbmV4dDoKKwkJLyogdXBkYXRlIG51bWJlciBvZiBwYWdlcyB0byBzcGxpdCAqLworCQlpZiAocC0+aGVhZGVyLm5leHRpbmRleCA9PSBwLT5oZWFkZXIubWF4ZW50cnkpCisJCQluc3BsaXQrKzsKKwkJZWxzZQorCQkJbnNwbGl0ID0gMDsKKworCQkvKiBwdXNoIChibiwgaW5kZXgpIG9mIHRoZSBwYXJlbnQgcGFnZS9lbnRyeSAqLworCQlCVF9QVVNIKGJ0c3RhY2ssIGJuLCBpbmRleCk7CisKKwkJLyogZ2V0IHRoZSBjaGlsZCBwYWdlIGJsb2NrIG51bWJlciAqLworCQlibiA9IGFkZHJlc3NYQUQoJnAtPnhhZFtpbmRleF0pOworCisJCS8qIHVucGluIHRoZSBwYXJlbnQgcGFnZSAqLworCQlYVF9QVVRQQUdFKG1wKTsKKwl9Cit9CisKKy8qCisgKiAgICAgIHh0SW5zZXJ0KCkKKyAqCisgKiBmdW5jdGlvbjoKKyAqCisgKiBwYXJhbWV0ZXI6CisgKiAgICAgIHRpZCAgICAgLSB0cmFuc2FjdGlvbiBpZDsKKyAqICAgICAgaXAgICAgICAtIGZpbGUgb2JqZWN0OworICogICAgICB4ZmxhZyAgIC0gZXh0ZW50IGZsYWcgKFhBRF9OT1RSRUNPUkRFRCk6CisgKiAgICAgIHhvZmYgICAgLSBleHRlbnQgb2Zmc2V0OworICogICAgICB4bGVuICAgIC0gZXh0ZW50IGxlbmd0aDsKKyAqICAgICAgeGFkZHJwICAtIGV4dGVudCBhZGRyZXNzIHBvaW50ZXIgKGluL291dCk6CisgKiAgICAgICAgICAgICAgaWYgKCp4YWRkcnApCisgKiAgICAgICAgICAgICAgICAgICAgICBjYWxsZXIgYWxsb2NhdGVkIGRhdGEgZXh0ZW50IGF0ICp4YWRkcnA7CisgKiAgICAgICAgICAgICAgZWxzZQorICogICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGUgZGF0YSBleHRlbnQgYW5kIHJldHVybiBpdHMgeGFkZHI7CisgKiAgICAgIGZsYWcgICAgLQorICoKKyAqIHJldHVybjoKKyAqLworaW50IHh0SW5zZXJ0KHRpZF90IHRpZCwJCS8qIHRyYW5zYWN0aW9uIGlkICovCisJICAgICBzdHJ1Y3QgaW5vZGUgKmlwLCBpbnQgeGZsYWcsIHM2NCB4b2ZmLCBzMzIgeGxlbiwgczY0ICogeGFkZHJwLAorCSAgICAgaW50IGZsYWcpCit7CisJaW50IHJjID0gMDsKKwlzNjQgeGFkZHIsIGhpbnQ7CisJc3RydWN0IG1ldGFwYWdlICptcDsJLyogbWV0YS1wYWdlIGJ1ZmZlciAqLworCXh0cGFnZV90ICpwOwkJLyogYmFzZSBCKy10cmVlIGluZGV4IHBhZ2UgKi8KKwlzNjQgYm47CisJaW50IGluZGV4LCBuZXh0aW5kZXg7CisJc3RydWN0IGJ0c3RhY2sgYnRzdGFjazsJLyogdHJhdmVyc2Ugc3RhY2sgKi8KKwlzdHJ1Y3QgeHRzcGxpdCBzcGxpdDsJLyogc3BsaXQgaW5mb3JtYXRpb24gKi8KKwl4YWRfdCAqeGFkOworCWludCBjbXA7CisJc3RydWN0IHRsb2NrICp0bGNrOworCXN0cnVjdCB4dGxvY2sgKnh0bGNrOworCisJamZzX2luZm8oInh0SW5zZXJ0OiBueG9mZjoweCVseCBueGxlbjoweCV4IiwgKHVsb25nKSB4b2ZmLCB4bGVuKTsKKworCS8qCisJICogICAgICBzZWFyY2ggZm9yIHRoZSBlbnRyeSBsb2NhdGlvbiBhdCB3aGljaCB0byBpbnNlcnQ6CisJICoKKwkgKiB4dEZhc3RTZWFyY2goKSBhbmQgeHRTZWFyY2goKSBib3RoIHJldHVybnMgKGxlYWYgcGFnZQorCSAqIHBpbm5lZCwgaW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0KS4KKwkgKiBuLmIuIHh0U2VhcmNoKCkgbWF5IHJldHVybiBpbmRleCBvZiBtYXhlbnRyeSBvZgorCSAqIHRoZSBmdWxsIHBhZ2UuCisJICovCisJaWYgKChyYyA9IHh0U2VhcmNoKGlwLCB4b2ZmLCAmY21wLCAmYnRzdGFjaywgWFRfSU5TRVJUKSkpCisJCXJldHVybiByYzsKKworCS8qIHJldHJpZXZlIHNlYXJjaCByZXN1bHQgKi8KKwlYVF9HRVRTRUFSQ0goaXAsIGJ0c3RhY2sudG9wLCBibiwgbXAsIHAsIGluZGV4KTsKKworCS8qIFRoaXMgdGVzdCBtdXN0IGZvbGxvdyBYVF9HRVRTRUFSQ0ggc2luY2UgbXAgbXVzdCBiZSB2YWxpZCBpZgorCSAqIHdlIGJyYW5jaCB0byBvdXQ6ICovCisJaWYgKGNtcCA9PSAwKSB7CisJCXJjID0gLUVFWElTVDsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBhbGxvY2F0ZSBkYXRhIGV4dGVudCByZXF1ZXN0ZWQKKwkgKgorCSAqIGFsbG9jYXRpb24gaGludDogbGFzdCB4YWQKKwkgKi8KKwlpZiAoKHhhZGRyID0gKnhhZGRycCkgPT0gMCkgeworCQlpZiAoaW5kZXggPiBYVEVOVFJZU1RBUlQpIHsKKwkJCXhhZCA9ICZwLT54YWRbaW5kZXggLSAxXTsKKwkJCWhpbnQgPSBhZGRyZXNzWEFEKHhhZCkgKyBsZW5ndGhYQUQoeGFkKSAtIDE7CisJCX0gZWxzZQorCQkJaGludCA9IDA7CisJCWlmICgocmMgPSBEUVVPVF9BTExPQ19CTE9DSyhpcCwgeGxlbikpKQorCQkJZ290byBvdXQ7CisJCWlmICgocmMgPSBkYkFsbG9jKGlwLCBoaW50LCAoczY0KSB4bGVuLCAmeGFkZHIpKSkgeworCQkJRFFVT1RfRlJFRV9CTE9DSyhpcCwgeGxlbik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCS8qCisJICogICAgICBpbnNlcnQgZW50cnkgZm9yIG5ldyBleHRlbnQKKwkgKi8KKwl4ZmxhZyB8PSBYQURfTkVXOworCisJLyoKKwkgKiAgICAgIGlmIHRoZSBsZWFmIHBhZ2UgaXMgZnVsbCwgc3BsaXQgdGhlIHBhZ2UgYW5kCisJICogICAgICBwcm9wYWdhdGUgdXAgdGhlIHJvdXRlciBlbnRyeSBmb3IgdGhlIG5ldyBwYWdlIGZyb20gc3BsaXQKKwkgKgorCSAqIFRoZSB4dFNwbGl0VXAoKSB3aWxsIGluc2VydCB0aGUgZW50cnkgYW5kIHVucGluIHRoZSBsZWFmIHBhZ2UuCisJICovCisJbmV4dGluZGV4ID0gbGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCk7CisJaWYgKG5leHRpbmRleCA9PSBsZTE2X3RvX2NwdShwLT5oZWFkZXIubWF4ZW50cnkpKSB7CisJCXNwbGl0Lm1wID0gbXA7CisJCXNwbGl0LmluZGV4ID0gaW5kZXg7CisJCXNwbGl0LmZsYWcgPSB4ZmxhZzsKKwkJc3BsaXQub2ZmID0geG9mZjsKKwkJc3BsaXQubGVuID0geGxlbjsKKwkJc3BsaXQuYWRkciA9IHhhZGRyOworCQlzcGxpdC5weGRsaXN0ID0gTlVMTDsKKwkJaWYgKChyYyA9IHh0U3BsaXRVcCh0aWQsIGlwLCAmc3BsaXQsICZidHN0YWNrKSkpIHsKKwkJCS8qIHVuZG8gZGF0YSBleHRlbnQgYWxsb2NhdGlvbiAqLworCQkJaWYgKCp4YWRkcnAgPT0gMCkgeworCQkJCWRiRnJlZShpcCwgeGFkZHIsIChzNjQpIHhsZW4pOworCQkJCURRVU9UX0ZSRUVfQkxPQ0soaXAsIHhsZW4pOworCQkJfQorCQkJcmV0dXJuIHJjOworCQl9CisKKwkJKnhhZGRycCA9IHhhZGRyOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqICAgICAgaW5zZXJ0IHRoZSBuZXcgZW50cnkgaW50byB0aGUgbGVhZiBwYWdlCisJICovCisJLyoKKwkgKiBhY3F1aXJlIGEgdHJhbnNhY3Rpb24gbG9jayBvbiB0aGUgbGVhZiBwYWdlOworCSAqCisJICogYWN0aW9uOiB4YWQgaW5zZXJ0aW9uL2V4dGVuc2lvbjsKKwkgKi8KKwlCVF9NQVJLX0RJUlRZKG1wLCBpcCk7CisKKwkvKiBpZiBpbnNlcnQgaW50byBtaWRkbGUsIHNoaWZ0IHJpZ2h0IHJlbWFpbmluZyBlbnRyaWVzLiAqLworCWlmIChpbmRleCA8IG5leHRpbmRleCkKKwkJbWVtbW92ZSgmcC0+eGFkW2luZGV4ICsgMV0sICZwLT54YWRbaW5kZXhdLAorCQkJKG5leHRpbmRleCAtIGluZGV4KSAqIHNpemVvZih4YWRfdCkpOworCisJLyogaW5zZXJ0IHRoZSBuZXcgZW50cnk6IG1hcmsgdGhlIGVudHJ5IE5FVyAqLworCXhhZCA9ICZwLT54YWRbaW5kZXhdOworCVhUX1BVVEVOVFJZKHhhZCwgeGZsYWcsIHhvZmYsIHhsZW4sIHhhZGRyKTsKKworCS8qIGFkdmFuY2UgbmV4dCBhdmFpbGFibGUgZW50cnkgaW5kZXggKi8KKwlwLT5oZWFkZXIubmV4dGluZGV4ID0KKwkgICAgY3B1X3RvX2xlMTYobGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCkgKyAxKTsKKworCS8qIERvbid0IGxvZyBpdCBpZiB0aGVyZSBhcmUgbm8gbGlua3MgdG8gdGhlIGZpbGUgKi8KKwlpZiAoIXRlc3RfY2ZsYWcoQ09NTUlUX05vbGluaywgaXApKSB7CisJCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgbXAsIHRsY2tYVFJFRSB8IHRsY2tHUk9XKTsKKwkJeHRsY2sgPSAoc3RydWN0IHh0bG9jayAqKSAmIHRsY2stPmxvY2s7CisJCXh0bGNrLT5sd20ub2Zmc2V0ID0KKwkJICAgICh4dGxjay0+bHdtLm9mZnNldCkgPyBtaW4oaW5kZXgsCisJCQkJCSAgICAgIChpbnQpeHRsY2stPmx3bS5vZmZzZXQpIDogaW5kZXg7CisJCXh0bGNrLT5sd20ubGVuZ3RoID0KKwkJICAgIGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpIC0geHRsY2stPmx3bS5vZmZzZXQ7CisJfQorCisJKnhhZGRycCA9IHhhZGRyOworCisgICAgICBvdXQ6CisJLyogdW5waW4gdGhlIGxlYWYgcGFnZSAqLworCVhUX1BVVFBBR0UobXApOworCisJcmV0dXJuIHJjOworfQorCisKKy8qCisgKiAgICAgIHh0U3BsaXRVcCgpCisgKgorICogZnVuY3Rpb246CisgKiAgICAgIHNwbGl0IGZ1bGwgcGFnZXMgYXMgcHJvcGFnYXRpbmcgaW5zZXJ0aW9uIHVwIHRoZSB0cmVlCisgKgorICogcGFyYW1ldGVyOgorICogICAgICB0aWQgICAgIC0gdHJhbnNhY3Rpb24gaWQ7CisgKiAgICAgIGlwICAgICAgLSBmaWxlIG9iamVjdDsKKyAqICAgICAgc3BsaXQgICAtIGVudHJ5IHBhcmFtZXRlciBkZXNjcmlwdG9yOworICogICAgICBidHN0YWNrIC0gdHJhdmVyc2Ugc3RhY2sgZnJvbSB4dFNlYXJjaCgpCisgKgorICogcmV0dXJuOgorICovCitzdGF0aWMgaW50Cit4dFNwbGl0VXAodGlkX3QgdGlkLAorCSAgc3RydWN0IGlub2RlICppcCwgc3RydWN0IHh0c3BsaXQgKiBzcGxpdCwgc3RydWN0IGJ0c3RhY2sgKiBidHN0YWNrKQoreworCWludCByYyA9IDA7CisJc3RydWN0IG1ldGFwYWdlICpzbXA7CisJeHRwYWdlX3QgKnNwOwkJLyogc3BsaXQgcGFnZSAqLworCXN0cnVjdCBtZXRhcGFnZSAqcm1wOworCXM2NCByYm47CQkvKiBuZXcgcmlnaHQgcGFnZSBibG9jayBudW1iZXIgKi8KKwlzdHJ1Y3QgbWV0YXBhZ2UgKnJjbXA7CisJeHRwYWdlX3QgKnJjcDsJCS8qIHJpZ2h0IGNoaWxkIHBhZ2UgKi8KKwlzNjQgcmNibjsJCS8qIHJpZ2h0IGNoaWxkIHBhZ2UgYmxvY2sgbnVtYmVyICovCisJaW50IHNraXA7CQkvKiBpbmRleCBvZiBlbnRyeSBvZiBpbnNlcnRpb24gKi8KKwlpbnQgbmV4dGluZGV4OwkJLyogbmV4dCBhdmFpbGFibGUgZW50cnkgaW5kZXggb2YgcCAqLworCXN0cnVjdCBidGZyYW1lICpwYXJlbnQ7CS8qIHBhcmVudCBwYWdlIGVudHJ5IG9uIHRyYXZlcnNlIHN0YWNrICovCisJeGFkX3QgKnhhZDsKKwlzNjQgeGFkZHI7CisJaW50IHhsZW47CisJaW50IG5zcGxpdDsJCS8qIG51bWJlciBvZiBwYWdlcyBzcGxpdCAqLworCXN0cnVjdCBweGRsaXN0IHB4ZGxpc3Q7CisJcHhkX3QgKnB4ZDsKKwlzdHJ1Y3QgdGxvY2sgKnRsY2s7CisJc3RydWN0IHh0bG9jayAqeHRsY2s7CisKKwlzbXAgPSBzcGxpdC0+bXA7CisJc3AgPSBYVF9QQUdFKGlwLCBzbXApOworCisJLyogaXMgaW5vZGUgeHRyZWUgcm9vdCBleHRlbnNpb24vaW5saW5lIEVBIGFyZWEgZnJlZSA/ICovCisJaWYgKChzcC0+aGVhZGVyLmZsYWcgJiBCVF9ST09UKSAmJiAoIVNfSVNESVIoaXAtPmlfbW9kZSkpICYmCisJICAgIChsZTE2X3RvX2NwdShzcC0+aGVhZGVyLm1heGVudHJ5KSA8IFhUUk9PVE1BWFNMT1QpICYmCisJICAgIChKRlNfSVAoaXApLT5tb2RlMiAmIElOTElORUVBKSkgeworCQlzcC0+aGVhZGVyLm1heGVudHJ5ID0gY3B1X3RvX2xlMTYoWFRST09UTUFYU0xPVCk7CisJCUpGU19JUChpcCktPm1vZGUyICY9IH5JTkxJTkVFQTsKKworCQlCVF9NQVJLX0RJUlRZKHNtcCwgaXApOworCQkvKgorCQkgKiBhY3F1aXJlIGEgdHJhbnNhY3Rpb24gbG9jayBvbiB0aGUgbGVhZiBwYWdlOworCQkgKgorCQkgKiBhY3Rpb246IHhhZCBpbnNlcnRpb24vZXh0ZW5zaW9uOworCQkgKi8KKworCQkvKiBpZiBpbnNlcnQgaW50byBtaWRkbGUsIHNoaWZ0IHJpZ2h0IHJlbWFpbmluZyBlbnRyaWVzLiAqLworCQlza2lwID0gc3BsaXQtPmluZGV4OworCQluZXh0aW5kZXggPSBsZTE2X3RvX2NwdShzcC0+aGVhZGVyLm5leHRpbmRleCk7CisJCWlmIChza2lwIDwgbmV4dGluZGV4KQorCQkJbWVtbW92ZSgmc3AtPnhhZFtza2lwICsgMV0sICZzcC0+eGFkW3NraXBdLAorCQkJCShuZXh0aW5kZXggLSBza2lwKSAqIHNpemVvZih4YWRfdCkpOworCisJCS8qIGluc2VydCB0aGUgbmV3IGVudHJ5OiBtYXJrIHRoZSBlbnRyeSBORVcgKi8KKwkJeGFkID0gJnNwLT54YWRbc2tpcF07CisJCVhUX1BVVEVOVFJZKHhhZCwgc3BsaXQtPmZsYWcsIHNwbGl0LT5vZmYsIHNwbGl0LT5sZW4sCisJCQkgICAgc3BsaXQtPmFkZHIpOworCisJCS8qIGFkdmFuY2UgbmV4dCBhdmFpbGFibGUgZW50cnkgaW5kZXggKi8KKwkJc3AtPmhlYWRlci5uZXh0aW5kZXggPQorCQkgICAgY3B1X3RvX2xlMTYobGUxNl90b19jcHUoc3AtPmhlYWRlci5uZXh0aW5kZXgpICsgMSk7CisKKwkJLyogRG9uJ3QgbG9nIGl0IGlmIHRoZXJlIGFyZSBubyBsaW5rcyB0byB0aGUgZmlsZSAqLworCQlpZiAoIXRlc3RfY2ZsYWcoQ09NTUlUX05vbGluaywgaXApKSB7CisJCQl0bGNrID0gdHhMb2NrKHRpZCwgaXAsIHNtcCwgdGxja1hUUkVFIHwgdGxja0dST1cpOworCQkJeHRsY2sgPSAoc3RydWN0IHh0bG9jayAqKSAmIHRsY2stPmxvY2s7CisJCQl4dGxjay0+bHdtLm9mZnNldCA9ICh4dGxjay0+bHdtLm9mZnNldCkgPworCQkJICAgIG1pbihza2lwLCAoaW50KXh0bGNrLT5sd20ub2Zmc2V0KSA6IHNraXA7CisJCQl4dGxjay0+bHdtLmxlbmd0aCA9CisJCQkgICAgbGUxNl90b19jcHUoc3AtPmhlYWRlci5uZXh0aW5kZXgpIC0KKwkJCSAgICB4dGxjay0+bHdtLm9mZnNldDsKKwkJfQorCisJCXJldHVybiAwOworCX0KKworCS8qCisJICogYWxsb2NhdGUgbmV3IGluZGV4IGJsb2NrcyB0byBjb3ZlciBpbmRleCBwYWdlIHNwbGl0KHMpCisJICoKKwkgKiBhbGxvY2F0aW9uIGhpbnQ6ID8KKwkgKi8KKwlpZiAoc3BsaXQtPnB4ZGxpc3QgPT0gTlVMTCkgeworCQluc3BsaXQgPSBidHN0YWNrLT5uc3BsaXQ7CisJCXNwbGl0LT5weGRsaXN0ID0gJnB4ZGxpc3Q7CisJCXB4ZGxpc3QubWF4bnB4ZCA9IHB4ZGxpc3QubnB4ZCA9IDA7CisJCXB4ZCA9ICZweGRsaXN0LnB4ZFswXTsKKwkJeGxlbiA9IEpGU19TQkkoaXAtPmlfc2IpLT5uYnBlcnBhZ2U7CisJCWZvciAoOyBuc3BsaXQgPiAwOyBuc3BsaXQtLSwgcHhkKyspIHsKKwkJCWlmICgocmMgPSBkYkFsbG9jKGlwLCAoczY0KSAwLCAoczY0KSB4bGVuLCAmeGFkZHIpKQorCQkJICAgID09IDApIHsKKwkJCQlQWERhZGRyZXNzKHB4ZCwgeGFkZHIpOworCQkJCVBYRGxlbmd0aChweGQsIHhsZW4pOworCisJCQkJcHhkbGlzdC5tYXhucHhkKys7CisKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogdW5kbyBhbGxvY2F0aW9uICovCisKKwkJCVhUX1BVVFBBR0Uoc21wKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0KKworCS8qCisJICogU3BsaXQgbGVhZiBwYWdlIDxzcD4gaW50byA8c3A+IGFuZCBhIG5ldyByaWdodCBwYWdlIDxycD4uCisJICoKKwkgKiBUaGUgc3BsaXQgcm91dGluZXMgaW5zZXJ0IHRoZSBuZXcgZW50cnkgaW50byB0aGUgbGVhZiBwYWdlLAorCSAqIGFuZCBhY3F1aXJlIHR4TG9jayBhcyBhcHByb3ByaWF0ZS4KKwkgKiByZXR1cm4gPHJwPiBwaW5uZWQgYW5kIGl0cyBibG9jayBudW1iZXIgPHJwYm4+LgorCSAqLworCXJjID0gKHNwLT5oZWFkZXIuZmxhZyAmIEJUX1JPT1QpID8KKwkgICAgeHRTcGxpdFJvb3QodGlkLCBpcCwgc3BsaXQsICZybXApIDoKKwkgICAgeHRTcGxpdFBhZ2UodGlkLCBpcCwgc3BsaXQsICZybXAsICZyYm4pOworCisJWFRfUFVUUEFHRShzbXApOworCisJaWYgKHJjKQorCQlyZXR1cm4gLUVJTzsKKwkvKgorCSAqIHByb3BhZ2F0ZSB1cCB0aGUgcm91dGVyIGVudHJ5IGZvciB0aGUgbGVhZiBwYWdlIGp1c3Qgc3BsaXQKKwkgKgorCSAqIGluc2VydCBhIHJvdXRlciBlbnRyeSBmb3IgdGhlIG5ldyBwYWdlIGludG8gdGhlIHBhcmVudCBwYWdlLAorCSAqIHByb3BhZ2F0ZSB0aGUgaW5zZXJ0L3NwbGl0IHVwIHRoZSB0cmVlIGJ5IHdhbGtpbmcgYmFjayB0aGUgc3RhY2sKKwkgKiBvZiAoYm4gb2YgcGFyZW50IHBhZ2UsIGluZGV4IG9mIGNoaWxkIHBhZ2UgZW50cnkgaW4gcGFyZW50IHBhZ2UpCisJICogdGhhdCB3ZXJlIHRyYXZlcnNlZCBkdXJpbmcgdGhlIHNlYXJjaCBmb3IgdGhlIHBhZ2UgdGhhdCBzcGxpdC4KKwkgKgorCSAqIHRoZSBwcm9wYWdhdGlvbiBvZiBpbnNlcnQvc3BsaXQgdXAgdGhlIHRyZWUgc3RvcHMgaWYgdGhlIHJvb3QKKwkgKiBzcGxpdHMgb3IgdGhlIHBhZ2UgaW5zZXJ0ZWQgaW50byBkb2Vzbid0IGhhdmUgdG8gc3BsaXQgdG8gaG9sZAorCSAqIHRoZSBuZXcgZW50cnkuCisJICoKKwkgKiB0aGUgcGFyZW50IGVudHJ5IGZvciB0aGUgc3BsaXQgcGFnZSByZW1haW5zIHRoZSBzYW1lLCBhbmQKKwkgKiBhIG5ldyBlbnRyeSBpcyBpbnNlcnRlZCBhdCBpdHMgcmlnaHQgd2l0aCB0aGUgZmlyc3Qga2V5IGFuZAorCSAqIGJsb2NrIG51bWJlciBvZiB0aGUgbmV3IHJpZ2h0IHBhZ2UuCisJICoKKwkgKiBUaGVyZSBhcmUgYSBtYXhpbXVtIG9mIDMgcGFnZXMgcGlubmVkIGF0IGFueSB0aW1lOgorCSAqIHJpZ2h0IGNoaWxkLCBsZWZ0IHBhcmVudCBhbmQgcmlnaHQgcGFyZW50ICh3aGVuIHRoZSBwYXJlbnQgc3BsaXRzKQorCSAqIHRvIGtlZXAgdGhlIGNoaWxkIHBhZ2UgcGlubmVkIHdoaWxlIHdvcmtpbmcgb24gdGhlIHBhcmVudC4KKwkgKiBtYWtlIHN1cmUgdGhhdCBhbGwgcGlucyBhcmUgcmVsZWFzZWQgYXQgZXhpdC4KKwkgKi8KKwl3aGlsZSAoKHBhcmVudCA9IEJUX1BPUChidHN0YWNrKSkgIT0gTlVMTCkgeworCQkvKiBwYXJlbnQgcGFnZSBzcGVjaWZpZWQgYnkgc3RhY2sgZnJhbWUgPHBhcmVudD4gKi8KKworCQkvKiBrZWVwIGN1cnJlbnQgY2hpbGQgcGFnZXMgPHJjcD4gcGlubmVkICovCisJCXJjbXAgPSBybXA7CisJCXJjYm4gPSByYm47CisJCXJjcCA9IFhUX1BBR0UoaXAsIHJjbXApOworCisJCS8qCisJCSAqIGluc2VydCByb3V0ZXIgZW50cnkgaW4gcGFyZW50IGZvciBuZXcgcmlnaHQgY2hpbGQgcGFnZSA8cnA+CisJCSAqLworCQkvKiBnZXQvcGluIHRoZSBwYXJlbnQgcGFnZSA8c3A+ICovCisJCVhUX0dFVFBBR0UoaXAsIHBhcmVudC0+Ym4sIHNtcCwgUFNJWkUsIHNwLCByYyk7CisJCWlmIChyYykgeworCQkJWFRfUFVUUEFHRShyY21wKTsKKwkJCXJldHVybiByYzsKKwkJfQorCisJCS8qCisJCSAqIFRoZSBuZXcga2V5IGVudHJ5IGdvZXMgT05FIEFGVEVSIHRoZSBpbmRleCBvZiBwYXJlbnQgZW50cnksCisJCSAqIGJlY2F1c2UgdGhlIHNwbGl0IHdhcyB0byB0aGUgcmlnaHQuCisJCSAqLworCQlza2lwID0gcGFyZW50LT5pbmRleCArIDE7CisKKwkJLyoKKwkJICogc3BsaXQgb3Igc2hpZnQgcmlnaHQgcmVtYWluaW5nIGVudHJpZXMgb2YgdGhlIHBhcmVudCBwYWdlCisJCSAqLworCQluZXh0aW5kZXggPSBsZTE2X3RvX2NwdShzcC0+aGVhZGVyLm5leHRpbmRleCk7CisJCS8qCisJCSAqIHBhcmVudCBwYWdlIGlzIGZ1bGwgLSBzcGxpdCB0aGUgcGFyZW50IHBhZ2UKKwkJICovCisJCWlmIChuZXh0aW5kZXggPT0gbGUxNl90b19jcHUoc3AtPmhlYWRlci5tYXhlbnRyeSkpIHsKKwkJCS8qIGluaXQgZm9yIHBhcmVudCBwYWdlIHNwbGl0ICovCisJCQlzcGxpdC0+bXAgPSBzbXA7CisJCQlzcGxpdC0+aW5kZXggPSBza2lwOwkvKiBpbmRleCBhdCBpbnNlcnQgKi8KKwkJCXNwbGl0LT5mbGFnID0gWEFEX05FVzsKKwkJCXNwbGl0LT5vZmYgPSBvZmZzZXRYQUQoJnJjcC0+eGFkW1hURU5UUllTVEFSVF0pOworCQkJc3BsaXQtPmxlbiA9IEpGU19TQkkoaXAtPmlfc2IpLT5uYnBlcnBhZ2U7CisJCQlzcGxpdC0+YWRkciA9IHJjYm47CisKKwkJCS8qIHVucGluIHByZXZpb3VzIHJpZ2h0IGNoaWxkIHBhZ2UgKi8KKwkJCVhUX1BVVFBBR0UocmNtcCk7CisKKwkJCS8qIFRoZSBzcGxpdCByb3V0aW5lcyBpbnNlcnQgdGhlIG5ldyBlbnRyeSwKKwkJCSAqIGFuZCBhY3F1aXJlIHR4TG9jayBhcyBhcHByb3ByaWF0ZS4KKwkJCSAqIHJldHVybiA8cnA+IHBpbm5lZCBhbmQgaXRzIGJsb2NrIG51bWJlciA8cnBibj4uCisJCQkgKi8KKwkJCXJjID0gKHNwLT5oZWFkZXIuZmxhZyAmIEJUX1JPT1QpID8KKwkJCSAgICB4dFNwbGl0Um9vdCh0aWQsIGlwLCBzcGxpdCwgJnJtcCkgOgorCQkJICAgIHh0U3BsaXRQYWdlKHRpZCwgaXAsIHNwbGl0LCAmcm1wLCAmcmJuKTsKKwkJCWlmIChyYykgeworCQkJCVhUX1BVVFBBR0Uoc21wKTsKKwkJCQlyZXR1cm4gcmM7CisJCQl9CisKKwkJCVhUX1BVVFBBR0Uoc21wKTsKKwkJCS8qIGtlZXAgbmV3IGNoaWxkIHBhZ2UgPHJwPiBwaW5uZWQgKi8KKwkJfQorCQkvKgorCQkgKiBwYXJlbnQgcGFnZSBpcyBub3QgZnVsbCAtIGluc2VydCBpbiBwYXJlbnQgcGFnZQorCQkgKi8KKwkJZWxzZSB7CisJCQkvKgorCQkJICogaW5zZXJ0IHJvdXRlciBlbnRyeSBpbiBwYXJlbnQgZm9yIHRoZSByaWdodCBjaGlsZAorCQkJICogcGFnZSBmcm9tIHRoZSBmaXJzdCBlbnRyeSBvZiB0aGUgcmlnaHQgY2hpbGQgcGFnZToKKwkJCSAqLworCQkJLyoKKwkJCSAqIGFjcXVpcmUgYSB0cmFuc2FjdGlvbiBsb2NrIG9uIHRoZSBwYXJlbnQgcGFnZTsKKwkJCSAqCisJCQkgKiBhY3Rpb246IHJvdXRlciB4YWQgaW5zZXJ0aW9uOworCQkJICovCisJCQlCVF9NQVJLX0RJUlRZKHNtcCwgaXApOworCisJCQkvKgorCQkJICogaWYgaW5zZXJ0IGludG8gbWlkZGxlLCBzaGlmdCByaWdodCByZW1haW5pbmcgZW50cmllcworCQkJICovCisJCQlpZiAoc2tpcCA8IG5leHRpbmRleCkKKwkJCQltZW1tb3ZlKCZzcC0+eGFkW3NraXAgKyAxXSwgJnNwLT54YWRbc2tpcF0sCisJCQkJCShuZXh0aW5kZXggLQorCQkJCQkgc2tpcCkgPDwgTDJYVFNMT1RTSVpFKTsKKworCQkJLyogaW5zZXJ0IHRoZSByb3V0ZXIgZW50cnkgKi8KKwkJCXhhZCA9ICZzcC0+eGFkW3NraXBdOworCQkJWFRfUFVURU5UUlkoeGFkLCBYQURfTkVXLAorCQkJCSAgICBvZmZzZXRYQUQoJnJjcC0+eGFkW1hURU5UUllTVEFSVF0pLAorCQkJCSAgICBKRlNfU0JJKGlwLT5pX3NiKS0+bmJwZXJwYWdlLCByY2JuKTsKKworCQkJLyogYWR2YW5jZSBuZXh0IGF2YWlsYWJsZSBlbnRyeSBpbmRleC4gKi8KKwkJCXNwLT5oZWFkZXIubmV4dGluZGV4ID0KKwkJCSAgICBjcHVfdG9fbGUxNihsZTE2X3RvX2NwdShzcC0+aGVhZGVyLm5leHRpbmRleCkgKworCQkJCQkxKTsKKworCQkJLyogRG9uJ3QgbG9nIGl0IGlmIHRoZXJlIGFyZSBubyBsaW5rcyB0byB0aGUgZmlsZSAqLworCQkJaWYgKCF0ZXN0X2NmbGFnKENPTU1JVF9Ob2xpbmssIGlwKSkgeworCQkJCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgc21wLAorCQkJCQkgICAgICB0bGNrWFRSRUUgfCB0bGNrR1JPVyk7CisJCQkJeHRsY2sgPSAoc3RydWN0IHh0bG9jayAqKSAmIHRsY2stPmxvY2s7CisJCQkJeHRsY2stPmx3bS5vZmZzZXQgPSAoeHRsY2stPmx3bS5vZmZzZXQpID8KKwkJCQkgICAgbWluKHNraXAsIChpbnQpeHRsY2stPmx3bS5vZmZzZXQpIDogc2tpcDsKKwkJCQl4dGxjay0+bHdtLmxlbmd0aCA9CisJCQkJICAgIGxlMTZfdG9fY3B1KHNwLT5oZWFkZXIubmV4dGluZGV4KSAtCisJCQkJICAgIHh0bGNrLT5sd20ub2Zmc2V0OworCQkJfQorCisJCQkvKiB1bnBpbiBwYXJlbnQgcGFnZSAqLworCQkJWFRfUFVUUEFHRShzbXApOworCisJCQkvKiBleGl0IHByb3BhZ2F0ZSB1cCAqLworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiB1bnBpbiBjdXJyZW50IHJpZ2h0IHBhZ2UgKi8KKwlYVF9QVVRQQUdFKHJtcCk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogICAgICB4dFNwbGl0UGFnZSgpCisgKgorICogZnVuY3Rpb246CisgKiAgICAgIHNwbGl0IGEgZnVsbCBub24tcm9vdCBwYWdlIGludG8KKyAqICAgICAgb3JpZ2luYWwvc3BsaXQvbGVmdCBwYWdlIGFuZCBuZXcgcmlnaHQgcGFnZQorICogICAgICBpLmUuLCB0aGUgb3JpZ2luYWwvc3BsaXQgcGFnZSByZW1haW5zIGFzIGxlZnQgcGFnZS4KKyAqCisgKiBwYXJhbWV0ZXI6CisgKiAgICAgIGludAkJdGlkLAorICogICAgICBzdHJ1Y3QgaW5vZGUgICAgKmlwLAorICogICAgICBzdHJ1Y3QgeHRzcGxpdCAgKnNwbGl0LAorICogICAgICBzdHJ1Y3QgbWV0YXBhZ2UJKipybXBwLAorICogICAgICB1NjQJCSpyYm5wLAorICoKKyAqIHJldHVybjoKKyAqICAgICAgUG9pbnRlciB0byBwYWdlIGluIHdoaWNoIHRvIGluc2VydCBvciBOVUxMIG9uIGVycm9yLgorICovCitzdGF0aWMgaW50Cit4dFNwbGl0UGFnZSh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsCisJICAgIHN0cnVjdCB4dHNwbGl0ICogc3BsaXQsIHN0cnVjdCBtZXRhcGFnZSAqKiBybXBwLCBzNjQgKiByYm5wKQoreworCWludCByYyA9IDA7CisJc3RydWN0IG1ldGFwYWdlICpzbXA7CisJeHRwYWdlX3QgKnNwOworCXN0cnVjdCBtZXRhcGFnZSAqcm1wOworCXh0cGFnZV90ICpycDsJCS8qIG5ldyByaWdodCBwYWdlIGFsbG9jYXRlZCAqLworCXM2NCByYm47CQkvKiBuZXcgcmlnaHQgcGFnZSBibG9jayBudW1iZXIgKi8KKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCXh0cGFnZV90ICpwOworCXM2NCBuZXh0Ym47CisJaW50IHNraXAsIG1heGVudHJ5LCBtaWRkbGUsIHJpZ2h0aGFsZiwgbjsKKwl4YWRfdCAqeGFkOworCXN0cnVjdCBweGRsaXN0ICpweGRsaXN0OworCXB4ZF90ICpweGQ7CisJc3RydWN0IHRsb2NrICp0bGNrOworCXN0cnVjdCB4dGxvY2sgKnN4dGxjayA9IE5VTEwsICpyeHRsY2sgPSBOVUxMOworCWludCBxdW90YV9hbGxvY2F0aW9uID0gMDsKKworCXNtcCA9IHNwbGl0LT5tcDsKKwlzcCA9IFhUX1BBR0UoaXAsIHNtcCk7CisKKwlJTkNSRU1FTlQoeHRTdGF0LnNwbGl0KTsKKworCXB4ZGxpc3QgPSBzcGxpdC0+cHhkbGlzdDsKKwlweGQgPSAmcHhkbGlzdC0+cHhkW3B4ZGxpc3QtPm5weGRdOworCXB4ZGxpc3QtPm5weGQrKzsKKwlyYm4gPSBhZGRyZXNzUFhEKHB4ZCk7CisKKwkvKiBBbGxvY2F0ZSBibG9ja3MgdG8gcXVvdGEuICovCisgICAgICAgaWYgKERRVU9UX0FMTE9DX0JMT0NLKGlwLCBsZW5ndGhQWEQocHhkKSkpIHsKKwkgICAgICAgcmMgPSAtRURRVU9UOworCSAgICAgICBnb3RvIGNsZWFuX3VwOworCX0KKworCXF1b3RhX2FsbG9jYXRpb24gKz0gbGVuZ3RoUFhEKHB4ZCk7CisKKwkvKgorCSAqIGFsbG9jYXRlIHRoZSBuZXcgcmlnaHQgcGFnZSBmb3IgdGhlIHNwbGl0CisJICovCisJcm1wID0gZ2V0X21ldGFwYWdlKGlwLCByYm4sIFBTSVpFLCAxKTsKKwlpZiAocm1wID09IE5VTEwpIHsKKwkJcmMgPSAtRUlPOworCQlnb3RvIGNsZWFuX3VwOworCX0KKworCWpmc19pbmZvKCJ4dFNwbGl0UGFnZTogaXA6MHglcCBzbXA6MHglcCBybXA6MHglcCIsIGlwLCBzbXAsIHJtcCk7CisKKwlCVF9NQVJLX0RJUlRZKHJtcCwgaXApOworCS8qCisJICogYWN0aW9uOiBuZXcgcGFnZTsKKwkgKi8KKworCXJwID0gKHh0cGFnZV90ICopIHJtcC0+ZGF0YTsKKwlycC0+aGVhZGVyLnNlbGYgPSAqcHhkOworCXJwLT5oZWFkZXIuZmxhZyA9IHNwLT5oZWFkZXIuZmxhZyAmIEJUX1RZUEU7CisJcnAtPmhlYWRlci5tYXhlbnRyeSA9IHNwLT5oZWFkZXIubWF4ZW50cnk7CS8qIGxpdHRsZS1lbmRpYW4gKi8KKwlycC0+aGVhZGVyLm5leHRpbmRleCA9IGNwdV90b19sZTE2KFhURU5UUllTVEFSVCk7CisKKwlCVF9NQVJLX0RJUlRZKHNtcCwgaXApOworCS8qIERvbid0IGxvZyBpdCBpZiB0aGVyZSBhcmUgbm8gbGlua3MgdG8gdGhlIGZpbGUgKi8KKwlpZiAoIXRlc3RfY2ZsYWcoQ09NTUlUX05vbGluaywgaXApKSB7CisJCS8qCisJCSAqIGFjcXVpcmUgYSB0cmFuc2FjdGlvbiBsb2NrIG9uIHRoZSBuZXcgcmlnaHQgcGFnZTsKKwkJICovCisJCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgcm1wLCB0bGNrWFRSRUUgfCB0bGNrTkVXKTsKKwkJcnh0bGNrID0gKHN0cnVjdCB4dGxvY2sgKikgJiB0bGNrLT5sb2NrOworCQlyeHRsY2stPmx3bS5vZmZzZXQgPSBYVEVOVFJZU1RBUlQ7CisJCS8qCisJCSAqIGFjcXVpcmUgYSB0cmFuc2FjdGlvbiBsb2NrIG9uIHRoZSBzcGxpdCBwYWdlCisJCSAqLworCQl0bGNrID0gdHhMb2NrKHRpZCwgaXAsIHNtcCwgdGxja1hUUkVFIHwgdGxja0dST1cpOworCQlzeHRsY2sgPSAoc3RydWN0IHh0bG9jayAqKSAmIHRsY2stPmxvY2s7CisJfQorCisJLyoKKwkgKiBpbml0aWFsaXplL3VwZGF0ZSBzaWJsaW5nIHBvaW50ZXJzIG9mIDxzcD4gYW5kIDxycD4KKwkgKi8KKwluZXh0Ym4gPSBsZTY0X3RvX2NwdShzcC0+aGVhZGVyLm5leHQpOworCXJwLT5oZWFkZXIubmV4dCA9IGNwdV90b19sZTY0KG5leHRibik7CisJcnAtPmhlYWRlci5wcmV2ID0gY3B1X3RvX2xlNjQoYWRkcmVzc1BYRCgmc3AtPmhlYWRlci5zZWxmKSk7CisJc3AtPmhlYWRlci5uZXh0ID0gY3B1X3RvX2xlNjQocmJuKTsKKworCXNraXAgPSBzcGxpdC0+aW5kZXg7CisKKwkvKgorCSAqICAgICAgc2VxdWVudGlhbCBhcHBlbmQgYXQgdGFpbCAoYWZ0ZXIgbGFzdCBlbnRyeSBvZiBsYXN0IHBhZ2UpCisJICoKKwkgKiBpZiBzcGxpdHRpbmcgdGhlIGxhc3QgcGFnZSBvbiBhIGxldmVsIGJlY2F1c2Ugb2YgYXBwZW5kaW5nCisJICogYSBlbnRyeSB0byBpdCAoc2tpcCBpcyBtYXhlbnRyeSksIGl0J3MgbGlrZWx5IHRoYXQgdGhlIGFjY2VzcyBpcworCSAqIHNlcXVlbnRpYWwuIGFkZGluZyBhbiBlbXB0eSBwYWdlIG9uIHRoZSBzaWRlIG9mIHRoZSBsZXZlbCBpcyBsZXNzCisJICogd29yayBhbmQgY2FuIHB1c2ggdGhlIGZpbGwgZmFjdG9yIG11Y2ggaGlnaGVyIHRoYW4gbm9ybWFsLgorCSAqIGlmIHdlJ3JlIHdyb25nIGl0J3Mgbm8gYmlnIGRlYWwgLSAgd2Ugd2lsbCBkbyB0aGUgc3BsaXQgdGhlIHJpZ2h0CisJICogd2F5IG5leHQgdGltZS4KKwkgKiAoaXQgbWF5IGxvb2sgbGlrZSBpdCdzIGVxdWFsbHkgZWFzeSB0byBkbyBhIHNpbWlsYXIgaGFjayBmb3IKKwkgKiByZXZlcnNlIHNvcnRlZCBkYXRhLCB0aGF0IGlzLCBzcGxpdCB0aGUgdHJlZSBsZWZ0LCBidXQgaXQncyBub3QuCisJICogQmUgbXkgZ3Vlc3QuKQorCSAqLworCWlmIChuZXh0Ym4gPT0gMCAmJiBza2lwID09IGxlMTZfdG9fY3B1KHNwLT5oZWFkZXIubWF4ZW50cnkpKSB7CisJCS8qCisJCSAqIGFjcXVpcmUgYSB0cmFuc2FjdGlvbiBsb2NrIG9uIHRoZSBuZXcvcmlnaHQgcGFnZTsKKwkJICoKKwkJICogYWN0aW9uOiB4YWQgaW5zZXJ0aW9uOworCQkgKi8KKwkJLyogaW5zZXJ0IGVudHJ5IGF0IHRoZSBmaXJzdCBlbnRyeSBvZiB0aGUgbmV3IHJpZ2h0IHBhZ2UgKi8KKwkJeGFkID0gJnJwLT54YWRbWFRFTlRSWVNUQVJUXTsKKwkJWFRfUFVURU5UUlkoeGFkLCBzcGxpdC0+ZmxhZywgc3BsaXQtPm9mZiwgc3BsaXQtPmxlbiwKKwkJCSAgICBzcGxpdC0+YWRkcik7CisKKwkJcnAtPmhlYWRlci5uZXh0aW5kZXggPSBjcHVfdG9fbGUxNihYVEVOVFJZU1RBUlQgKyAxKTsKKworCQlpZiAoIXRlc3RfY2ZsYWcoQ09NTUlUX05vbGluaywgaXApKSB7CisJCQkvKiByeHRsY2stPmx3bS5vZmZzZXQgPSBYVEVOVFJZU1RBUlQ7ICovCisJCQlyeHRsY2stPmx3bS5sZW5ndGggPSAxOworCQl9CisKKwkJKnJtcHAgPSBybXA7CisJCSpyYm5wID0gcmJuOworCisJCWpmc19pbmZvKCJ4dFNwbGl0UGFnZTogc3A6MHglcCBycDoweCVwIiwgc3AsIHJwKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiAgICAgIG5vbi1zZXF1ZW50aWFsIGluc2VydCAoYXQgcG9zc2libHkgbWlkZGxlIHBhZ2UpCisJICovCisKKwkvKgorCSAqIHVwZGF0ZSBwcmV2aW91cyBwb2ludGVyIG9mIG9sZCBuZXh0L3JpZ2h0IHBhZ2Ugb2YgPHNwPgorCSAqLworCWlmIChuZXh0Ym4gIT0gMCkgeworCQlYVF9HRVRQQUdFKGlwLCBuZXh0Ym4sIG1wLCBQU0laRSwgcCwgcmMpOworCQlpZiAocmMpIHsKKwkJCVhUX1BVVFBBR0Uocm1wKTsKKwkJCWdvdG8gY2xlYW5fdXA7CisJCX0KKworCQlCVF9NQVJLX0RJUlRZKG1wLCBpcCk7CisJCS8qCisJCSAqIGFjcXVpcmUgYSB0cmFuc2FjdGlvbiBsb2NrIG9uIHRoZSBuZXh0IHBhZ2U7CisJCSAqCisJCSAqIGFjdGlvbjpzaWJsaW5nIHBvaW50ZXIgdXBkYXRlOworCQkgKi8KKwkJaWYgKCF0ZXN0X2NmbGFnKENPTU1JVF9Ob2xpbmssIGlwKSkKKwkJCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgbXAsIHRsY2tYVFJFRSB8IHRsY2tSRUxJTkspOworCisJCXAtPmhlYWRlci5wcmV2ID0gY3B1X3RvX2xlNjQocmJuKTsKKworCQkvKiBzaWJsaW5nIHBhZ2UgbWF5IGhhdmUgYmVlbiB1cGRhdGVkIHByZXZpb3VzbHksIG9yCisJCSAqIGl0IG1heSBiZSB1cGRhdGVkIGxhdGVyOworCQkgKi8KKworCQlYVF9QVVRQQUdFKG1wKTsKKwl9CisKKwkvKgorCSAqIHNwbGl0IHRoZSBkYXRhIGJldHdlZW4gdGhlIHNwbGl0IGFuZCBuZXcvcmlnaHQgcGFnZXMKKwkgKi8KKwltYXhlbnRyeSA9IGxlMTZfdG9fY3B1KHNwLT5oZWFkZXIubWF4ZW50cnkpOworCW1pZGRsZSA9IG1heGVudHJ5ID4+IDE7CisJcmlnaHRoYWxmID0gbWF4ZW50cnkgLSBtaWRkbGU7CisKKwkvKgorCSAqIHNraXAgaW5kZXggaW4gb2xkIHNwbGl0L2xlZnQgcGFnZSAtIGluc2VydCBpbnRvIGxlZnQgcGFnZToKKwkgKi8KKwlpZiAoc2tpcCA8PSBtaWRkbGUpIHsKKwkJLyogbW92ZSByaWdodCBoYWxmIG9mIHNwbGl0IHBhZ2UgdG8gdGhlIG5ldyByaWdodCBwYWdlICovCisJCW1lbW1vdmUoJnJwLT54YWRbWFRFTlRSWVNUQVJUXSwgJnNwLT54YWRbbWlkZGxlXSwKKwkJCXJpZ2h0aGFsZiA8PCBMMlhUU0xPVFNJWkUpOworCisJCS8qIHNoaWZ0IHJpZ2h0IHRhaWwgb2YgbGVmdCBoYWxmIHRvIG1ha2Ugcm9vbSBmb3IgbmV3IGVudHJ5ICovCisJCWlmIChza2lwIDwgbWlkZGxlKQorCQkJbWVtbW92ZSgmc3AtPnhhZFtza2lwICsgMV0sICZzcC0+eGFkW3NraXBdLAorCQkJCShtaWRkbGUgLSBza2lwKSA8PCBMMlhUU0xPVFNJWkUpOworCisJCS8qIGluc2VydCBuZXcgZW50cnkgKi8KKwkJeGFkID0gJnNwLT54YWRbc2tpcF07CisJCVhUX1BVVEVOVFJZKHhhZCwgc3BsaXQtPmZsYWcsIHNwbGl0LT5vZmYsIHNwbGl0LT5sZW4sCisJCQkgICAgc3BsaXQtPmFkZHIpOworCisJCS8qIHVwZGF0ZSBwYWdlIGhlYWRlciAqLworCQlzcC0+aGVhZGVyLm5leHRpbmRleCA9IGNwdV90b19sZTE2KG1pZGRsZSArIDEpOworCQlpZiAoIXRlc3RfY2ZsYWcoQ09NTUlUX05vbGluaywgaXApKSB7CisJCQlzeHRsY2stPmx3bS5vZmZzZXQgPSAoc3h0bGNrLT5sd20ub2Zmc2V0KSA/CisJCQkgICAgbWluKHNraXAsIChpbnQpc3h0bGNrLT5sd20ub2Zmc2V0KSA6IHNraXA7CisJCX0KKworCQlycC0+aGVhZGVyLm5leHRpbmRleCA9CisJCSAgICBjcHVfdG9fbGUxNihYVEVOVFJZU1RBUlQgKyByaWdodGhhbGYpOworCX0KKwkvKgorCSAqIHNraXAgaW5kZXggaW4gbmV3IHJpZ2h0IHBhZ2UgLSBpbnNlcnQgaW50byByaWdodCBwYWdlOgorCSAqLworCWVsc2UgeworCQkvKiBtb3ZlIGxlZnQgaGVhZCBvZiByaWdodCBoYWxmIHRvIHJpZ2h0IHBhZ2UgKi8KKwkJbiA9IHNraXAgLSBtaWRkbGU7CisJCW1lbW1vdmUoJnJwLT54YWRbWFRFTlRSWVNUQVJUXSwgJnNwLT54YWRbbWlkZGxlXSwKKwkJCW4gPDwgTDJYVFNMT1RTSVpFKTsKKworCQkvKiBpbnNlcnQgbmV3IGVudHJ5ICovCisJCW4gKz0gWFRFTlRSWVNUQVJUOworCQl4YWQgPSAmcnAtPnhhZFtuXTsKKwkJWFRfUFVURU5UUlkoeGFkLCBzcGxpdC0+ZmxhZywgc3BsaXQtPm9mZiwgc3BsaXQtPmxlbiwKKwkJCSAgICBzcGxpdC0+YWRkcik7CisKKwkJLyogbW92ZSByaWdodCB0YWlsIG9mIHJpZ2h0IGhhbGYgdG8gcmlnaHQgcGFnZSAqLworCQlpZiAoc2tpcCA8IG1heGVudHJ5KQorCQkJbWVtbW92ZSgmcnAtPnhhZFtuICsgMV0sICZzcC0+eGFkW3NraXBdLAorCQkJCShtYXhlbnRyeSAtIHNraXApIDw8IEwyWFRTTE9UU0laRSk7CisKKwkJLyogdXBkYXRlIHBhZ2UgaGVhZGVyICovCisJCXNwLT5oZWFkZXIubmV4dGluZGV4ID0gY3B1X3RvX2xlMTYobWlkZGxlKTsKKwkJaWYgKCF0ZXN0X2NmbGFnKENPTU1JVF9Ob2xpbmssIGlwKSkgeworCQkJc3h0bGNrLT5sd20ub2Zmc2V0ID0gKHN4dGxjay0+bHdtLm9mZnNldCkgPworCQkJICAgIG1pbihtaWRkbGUsIChpbnQpc3h0bGNrLT5sd20ub2Zmc2V0KSA6IG1pZGRsZTsKKwkJfQorCisJCXJwLT5oZWFkZXIubmV4dGluZGV4ID0gY3B1X3RvX2xlMTYoWFRFTlRSWVNUQVJUICsKKwkJCQkJCSAgIHJpZ2h0aGFsZiArIDEpOworCX0KKworCWlmICghdGVzdF9jZmxhZyhDT01NSVRfTm9saW5rLCBpcCkpIHsKKwkJc3h0bGNrLT5sd20ubGVuZ3RoID0gbGUxNl90b19jcHUoc3AtPmhlYWRlci5uZXh0aW5kZXgpIC0KKwkJICAgIHN4dGxjay0+bHdtLm9mZnNldDsKKworCQkvKiByeHRsY2stPmx3bS5vZmZzZXQgPSBYVEVOVFJZU1RBUlQ7ICovCisJCXJ4dGxjay0+bHdtLmxlbmd0aCA9IGxlMTZfdG9fY3B1KHJwLT5oZWFkZXIubmV4dGluZGV4KSAtCisJCSAgICBYVEVOVFJZU1RBUlQ7CisJfQorCisJKnJtcHAgPSBybXA7CisJKnJibnAgPSByYm47CisKKwlqZnNfaW5mbygieHRTcGxpdFBhZ2U6IHNwOjB4JXAgcnA6MHglcCIsIHNwLCBycCk7CisJcmV0dXJuIHJjOworCisgICAgICBjbGVhbl91cDoKKworCS8qIFJvbGxiYWNrIHF1b3RhIGFsbG9jYXRpb24uICovCisJaWYgKHF1b3RhX2FsbG9jYXRpb24pCisJCURRVU9UX0ZSRUVfQkxPQ0soaXAsIHF1b3RhX2FsbG9jYXRpb24pOworCisJcmV0dXJuIChyYyk7Cit9CisKKworLyoKKyAqICAgICAgeHRTcGxpdFJvb3QoKQorICoKKyAqIGZ1bmN0aW9uOgorICogICAgICBzcGxpdCB0aGUgZnVsbCByb290IHBhZ2UgaW50bworICogICAgICBvcmlnaW5hbC9yb290L3NwbGl0IHBhZ2UgYW5kIG5ldyByaWdodCBwYWdlCisgKiAgICAgIGkuZS4sIHJvb3QgcmVtYWlucyBmaXhlZCBpbiB0cmVlIGFuY2hvciAoaW5vZGUpIGFuZAorICogICAgICB0aGUgcm9vdCBpcyBjb3BpZWQgdG8gYSBzaW5nbGUgbmV3IHJpZ2h0IGNoaWxkIHBhZ2UKKyAqICAgICAgc2luY2Ugcm9vdCBwYWdlIDw8IG5vbi1yb290IHBhZ2UsIGFuZAorICogICAgICB0aGUgc3BsaXQgcm9vdCBwYWdlIGNvbnRhaW5zIGEgc2luZ2xlIGVudHJ5IGZvciB0aGUKKyAqICAgICAgbmV3IHJpZ2h0IGNoaWxkIHBhZ2UuCisgKgorICogcGFyYW1ldGVyOgorICogICAgICBpbnQJCXRpZCwKKyAqICAgICAgc3RydWN0IGlub2RlICAgICppcCwKKyAqICAgICAgc3RydWN0IHh0c3BsaXQgICpzcGxpdCwKKyAqICAgICAgc3RydWN0IG1ldGFwYWdlCSoqcm1wcCkKKyAqCisgKiByZXR1cm46CisgKiAgICAgIFBvaW50ZXIgdG8gcGFnZSBpbiB3aGljaCB0byBpbnNlcnQgb3IgTlVMTCBvbiBlcnJvci4KKyAqLworc3RhdGljIGludAoreHRTcGxpdFJvb3QodGlkX3QgdGlkLAorCSAgICBzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgeHRzcGxpdCAqIHNwbGl0LCBzdHJ1Y3QgbWV0YXBhZ2UgKiogcm1wcCkKK3sKKwl4dHBhZ2VfdCAqc3A7CisJc3RydWN0IG1ldGFwYWdlICpybXA7CisJeHRwYWdlX3QgKnJwOworCXM2NCByYm47CisJaW50IHNraXAsIG5leHRpbmRleDsKKwl4YWRfdCAqeGFkOworCXB4ZF90ICpweGQ7CisJc3RydWN0IHB4ZGxpc3QgKnB4ZGxpc3Q7CisJc3RydWN0IHRsb2NrICp0bGNrOworCXN0cnVjdCB4dGxvY2sgKnh0bGNrOworCisJc3AgPSAmSkZTX0lQKGlwKS0+aV94dHJvb3Q7CisKKwlJTkNSRU1FTlQoeHRTdGF0LnNwbGl0KTsKKworCS8qCisJICogICAgICBhbGxvY2F0ZSBhIHNpbmdsZSAocmlnaHQpIGNoaWxkIHBhZ2UKKwkgKi8KKwlweGRsaXN0ID0gc3BsaXQtPnB4ZGxpc3Q7CisJcHhkID0gJnB4ZGxpc3QtPnB4ZFtweGRsaXN0LT5ucHhkXTsKKwlweGRsaXN0LT5ucHhkKys7CisJcmJuID0gYWRkcmVzc1BYRChweGQpOworCXJtcCA9IGdldF9tZXRhcGFnZShpcCwgcmJuLCBQU0laRSwgMSk7CisJaWYgKHJtcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIEFsbG9jYXRlIGJsb2NrcyB0byBxdW90YS4gKi8KKwlpZiAoRFFVT1RfQUxMT0NfQkxPQ0soaXAsIGxlbmd0aFBYRChweGQpKSkgeworCQlyZWxlYXNlX21ldGFwYWdlKHJtcCk7CisJCXJldHVybiAtRURRVU9UOworCX0KKworCWpmc19pbmZvKCJ4dFNwbGl0Um9vdDogaXA6MHglcCBybXA6MHglcCIsIGlwLCBybXApOworCisJLyoKKwkgKiBhY3F1aXJlIGEgdHJhbnNhY3Rpb24gbG9jayBvbiB0aGUgbmV3IHJpZ2h0IHBhZ2U7CisJICoKKwkgKiBhY3Rpb246IG5ldyBwYWdlOworCSAqLworCUJUX01BUktfRElSVFkocm1wLCBpcCk7CisKKwlycCA9ICh4dHBhZ2VfdCAqKSBybXAtPmRhdGE7CisJcnAtPmhlYWRlci5mbGFnID0KKwkgICAgKHNwLT5oZWFkZXIuZmxhZyAmIEJUX0xFQUYpID8gQlRfTEVBRiA6IEJUX0lOVEVSTkFMOworCXJwLT5oZWFkZXIuc2VsZiA9ICpweGQ7CisJcnAtPmhlYWRlci5uZXh0aW5kZXggPSBjcHVfdG9fbGUxNihYVEVOVFJZU1RBUlQpOworCXJwLT5oZWFkZXIubWF4ZW50cnkgPSBjcHVfdG9fbGUxNihQU0laRSA+PiBMMlhUU0xPVFNJWkUpOworCisJLyogaW5pdGlhbGl6ZSBzaWJsaW5nIHBvaW50ZXJzICovCisJcnAtPmhlYWRlci5uZXh0ID0gMDsKKwlycC0+aGVhZGVyLnByZXYgPSAwOworCisJLyoKKwkgKiBjb3B5IHRoZSBpbi1saW5lIHJvb3QgcGFnZSBpbnRvIG5ldyByaWdodCBwYWdlIGV4dGVudAorCSAqLworCW5leHRpbmRleCA9IGxlMTZfdG9fY3B1KHNwLT5oZWFkZXIubWF4ZW50cnkpOworCW1lbW1vdmUoJnJwLT54YWRbWFRFTlRSWVNUQVJUXSwgJnNwLT54YWRbWFRFTlRSWVNUQVJUXSwKKwkJKG5leHRpbmRleCAtIFhURU5UUllTVEFSVCkgPDwgTDJYVFNMT1RTSVpFKTsKKworCS8qCisJICogaW5zZXJ0IHRoZSBuZXcgZW50cnkgaW50byB0aGUgbmV3IHJpZ2h0L2NoaWxkIHBhZ2UKKwkgKiAoc2tpcCBpbmRleCBpbiB0aGUgbmV3IHJpZ2h0IHBhZ2Ugd2lsbCBub3QgY2hhbmdlKQorCSAqLworCXNraXAgPSBzcGxpdC0+aW5kZXg7CisJLyogaWYgaW5zZXJ0IGludG8gbWlkZGxlLCBzaGlmdCByaWdodCByZW1haW5pbmcgZW50cmllcyAqLworCWlmIChza2lwICE9IG5leHRpbmRleCkKKwkJbWVtbW92ZSgmcnAtPnhhZFtza2lwICsgMV0sICZycC0+eGFkW3NraXBdLAorCQkJKG5leHRpbmRleCAtIHNraXApICogc2l6ZW9mKHhhZF90KSk7CisKKwl4YWQgPSAmcnAtPnhhZFtza2lwXTsKKwlYVF9QVVRFTlRSWSh4YWQsIHNwbGl0LT5mbGFnLCBzcGxpdC0+b2ZmLCBzcGxpdC0+bGVuLCBzcGxpdC0+YWRkcik7CisKKwkvKiB1cGRhdGUgcGFnZSBoZWFkZXIgKi8KKwlycC0+aGVhZGVyLm5leHRpbmRleCA9IGNwdV90b19sZTE2KG5leHRpbmRleCArIDEpOworCisJaWYgKCF0ZXN0X2NmbGFnKENPTU1JVF9Ob2xpbmssIGlwKSkgeworCQl0bGNrID0gdHhMb2NrKHRpZCwgaXAsIHJtcCwgdGxja1hUUkVFIHwgdGxja05FVyk7CisJCXh0bGNrID0gKHN0cnVjdCB4dGxvY2sgKikgJiB0bGNrLT5sb2NrOworCQl4dGxjay0+bHdtLm9mZnNldCA9IFhURU5UUllTVEFSVDsKKwkJeHRsY2stPmx3bS5sZW5ndGggPSBsZTE2X3RvX2NwdShycC0+aGVhZGVyLm5leHRpbmRleCkgLQorCQkgICAgWFRFTlRSWVNUQVJUOworCX0KKworCS8qCisJICogICAgICByZXNldCB0aGUgcm9vdAorCSAqCisJICogaW5pdCByb290IHdpdGggdGhlIHNpbmdsZSBlbnRyeSBmb3IgdGhlIG5ldyByaWdodCBwYWdlCisJICogc2V0IHRoZSAxc3QgZW50cnkgb2Zmc2V0IHRvIDAsIHdoaWNoIGZvcmNlIHRoZSBsZWZ0LW1vc3Qga2V5CisJICogYXQgYW55IGxldmVsIG9mIHRoZSB0cmVlIHRvIGJlIGxlc3MgdGhhbiBhbnkgc2VhcmNoIGtleS4KKwkgKi8KKwkvKgorCSAqIGFjcXVpcmUgYSB0cmFuc2FjdGlvbiBsb2NrIG9uIHRoZSByb290IHBhZ2UgKGluLW1lbW9yeSBpbm9kZSk7CisJICoKKwkgKiBhY3Rpb246IHJvb3Qgc3BsaXQ7CisJICovCisJQlRfTUFSS19ESVJUWShzcGxpdC0+bXAsIGlwKTsKKworCXhhZCA9ICZzcC0+eGFkW1hURU5UUllTVEFSVF07CisJWFRfUFVURU5UUlkoeGFkLCBYQURfTkVXLCAwLCBKRlNfU0JJKGlwLT5pX3NiKS0+bmJwZXJwYWdlLCByYm4pOworCisJLyogdXBkYXRlIHBhZ2UgaGVhZGVyIG9mIHJvb3QgKi8KKwlzcC0+aGVhZGVyLmZsYWcgJj0gfkJUX0xFQUY7CisJc3AtPmhlYWRlci5mbGFnIHw9IEJUX0lOVEVSTkFMOworCisJc3AtPmhlYWRlci5uZXh0aW5kZXggPSBjcHVfdG9fbGUxNihYVEVOVFJZU1RBUlQgKyAxKTsKKworCWlmICghdGVzdF9jZmxhZyhDT01NSVRfTm9saW5rLCBpcCkpIHsKKwkJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBzcGxpdC0+bXAsIHRsY2tYVFJFRSB8IHRsY2tHUk9XKTsKKwkJeHRsY2sgPSAoc3RydWN0IHh0bG9jayAqKSAmIHRsY2stPmxvY2s7CisJCXh0bGNrLT5sd20ub2Zmc2V0ID0gWFRFTlRSWVNUQVJUOworCQl4dGxjay0+bHdtLmxlbmd0aCA9IDE7CisJfQorCisJKnJtcHAgPSBybXA7CisKKwlqZnNfaW5mbygieHRTcGxpdFJvb3Q6IHNwOjB4JXAgcnA6MHglcCIsIHNwLCBycCk7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqICAgICAgeHRFeHRlbmQoKQorICoKKyAqIGZ1bmN0aW9uOiBleHRlbmQgaW4tcGxhY2U7CisgKgorICogbm90ZTogZXhpc3RpbmcgZXh0ZW50IG1heSBvciBtYXkgbm90IGhhdmUgYmVlbiBjb21taXR0ZWQuCisgKiBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIHBhZ2VyIGJ1ZmZlciBjYWNoZSB1cGRhdGUsIGFuZAorICogd29ya2luZyBibG9jayBhbGxvY2F0aW9uIG1hcCB1cGRhdGU7CisgKiB1cGRhdGUgcG1hcDogYWxsb2Mgd2hvbGUgZXh0ZW5kZWQgZXh0ZW50OworICovCitpbnQgeHRFeHRlbmQodGlkX3QgdGlkLAkJLyogdHJhbnNhY3Rpb24gaWQgKi8KKwkgICAgIHN0cnVjdCBpbm9kZSAqaXAsIHM2NCB4b2ZmLAkvKiBkZWx0YSBleHRlbnQgb2Zmc2V0ICovCisJICAgICBzMzIgeGxlbiwJCS8qIGRlbHRhIGV4dGVudCBsZW5ndGggKi8KKwkgICAgIGludCBmbGFnKQoreworCWludCByYyA9IDA7CisJaW50IGNtcDsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOwkvKiBtZXRhLXBhZ2UgYnVmZmVyICovCisJeHRwYWdlX3QgKnA7CQkvKiBiYXNlIEIrLXRyZWUgaW5kZXggcGFnZSAqLworCXM2NCBibjsKKwlpbnQgaW5kZXgsIG5leHRpbmRleCwgbGVuOworCXN0cnVjdCBidHN0YWNrIGJ0c3RhY2s7CS8qIHRyYXZlcnNlIHN0YWNrICovCisJc3RydWN0IHh0c3BsaXQgc3BsaXQ7CS8qIHNwbGl0IGluZm9ybWF0aW9uICovCisJeGFkX3QgKnhhZDsKKwlzNjQgeGFkZHI7CisJc3RydWN0IHRsb2NrICp0bGNrOworCXN0cnVjdCB4dGxvY2sgKnh0bGNrID0gTlVMTDsKKworCWpmc19pbmZvKCJ4dEV4dGVuZDogbnhvZmY6MHglbHggbnhsZW46MHgleCIsICh1bG9uZykgeG9mZiwgeGxlbik7CisKKwkvKiB0aGVyZSBtdXN0IGV4aXN0IGV4dGVudCB0byBiZSBleHRlbmRlZCAqLworCWlmICgocmMgPSB4dFNlYXJjaChpcCwgeG9mZiAtIDEsICZjbXAsICZidHN0YWNrLCBYVF9JTlNFUlQpKSkKKwkJcmV0dXJuIHJjOworCisJLyogcmV0cmlldmUgc2VhcmNoIHJlc3VsdCAqLworCVhUX0dFVFNFQVJDSChpcCwgYnRzdGFjay50b3AsIGJuLCBtcCwgcCwgaW5kZXgpOworCisJaWYgKGNtcCAhPSAwKSB7CisJCVhUX1BVVFBBR0UobXApOworCQlqZnNfZXJyb3IoaXAtPmlfc2IsICJ4dEV4dGVuZDogeHRTZWFyY2ggZGlkIG5vdCBmaW5kIGV4dGVudCIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBleHRlbnNpb24gbXVzdCBiZSBjb250aWd1b3VzICovCisJeGFkID0gJnAtPnhhZFtpbmRleF07CisJaWYgKChvZmZzZXRYQUQoeGFkKSArIGxlbmd0aFhBRCh4YWQpKSAhPSB4b2ZmKSB7CisJCVhUX1BVVFBBR0UobXApOworCQlqZnNfZXJyb3IoaXAtPmlfc2IsICJ4dEV4dGVuZDogZXh0ZW5zaW9uIGlzIG5vdCBjb250aWd1b3VzIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qCisJICogYWNxdWlyZSBhIHRyYW5zYWN0aW9uIGxvY2sgb24gdGhlIGxlYWYgcGFnZTsKKwkgKgorCSAqIGFjdGlvbjogeGFkIGluc2VydGlvbi9leHRlbnNpb247CisJICovCisJQlRfTUFSS19ESVJUWShtcCwgaXApOworCWlmICghdGVzdF9jZmxhZyhDT01NSVRfTm9saW5rLCBpcCkpIHsKKwkJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBtcCwgdGxja1hUUkVFIHwgdGxja0dST1cpOworCQl4dGxjayA9IChzdHJ1Y3QgeHRsb2NrICopICYgdGxjay0+bG9jazsKKwl9CisKKwkvKiBleHRlbmQgd2lsbCBvdmVyZmxvdyBleHRlbnQgPyAqLworCXhsZW4gPSBsZW5ndGhYQUQoeGFkKSArIHhsZW47CisJaWYgKChsZW4gPSB4bGVuIC0gTUFYWExFTikgPD0gMCkKKwkJZ290byBleHRlbmRPbGQ7CisKKwkvKgorCSAqICAgICAgZXh0ZW50IG92ZXJmbG93OiBpbnNlcnQgZW50cnkgZm9yIG5ldyBleHRlbnQKKwkgKi8KKy8vaW5zZXJ0TmV3OgorCXhvZmYgPSBvZmZzZXRYQUQoeGFkKSArIE1BWFhMRU47CisJeGFkZHIgPSBhZGRyZXNzWEFEKHhhZCkgKyBNQVhYTEVOOworCW5leHRpbmRleCA9IGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpOworCisJLyoKKwkgKiAgICAgIGlmIHRoZSBsZWFmIHBhZ2UgaXMgZnVsbCwgaW5zZXJ0IHRoZSBuZXcgZW50cnkgYW5kCisJICogICAgICBwcm9wYWdhdGUgdXAgdGhlIHJvdXRlciBlbnRyeSBmb3IgdGhlIG5ldyBwYWdlIGZyb20gc3BsaXQKKwkgKgorCSAqIFRoZSB4dFNwbGl0VXAoKSB3aWxsIGluc2VydCB0aGUgZW50cnkgYW5kIHVucGluIHRoZSBsZWFmIHBhZ2UuCisJICovCisJaWYgKG5leHRpbmRleCA9PSBsZTE2X3RvX2NwdShwLT5oZWFkZXIubWF4ZW50cnkpKSB7CisJCS8qIHh0U3BsaVVwKCkgdW5waW5zIGxlYWYgcGFnZXMgKi8KKwkJc3BsaXQubXAgPSBtcDsKKwkJc3BsaXQuaW5kZXggPSBpbmRleCArIDE7CisJCXNwbGl0LmZsYWcgPSBYQURfTkVXOworCQlzcGxpdC5vZmYgPSB4b2ZmOwkvKiBzcGxpdCBvZmZzZXQgKi8KKwkJc3BsaXQubGVuID0gbGVuOworCQlzcGxpdC5hZGRyID0geGFkZHI7CisJCXNwbGl0LnB4ZGxpc3QgPSBOVUxMOworCQlpZiAoKHJjID0geHRTcGxpdFVwKHRpZCwgaXAsICZzcGxpdCwgJmJ0c3RhY2spKSkKKwkJCXJldHVybiByYzsKKworCQkvKiBnZXQgYmFjayBvbGQgcGFnZSAqLworCQlYVF9HRVRQQUdFKGlwLCBibiwgbXAsIFBTSVpFLCBwLCByYyk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwkJLyoKKwkJICogaWYgbGVhZiByb290IGhhcyBiZWVuIHNwbGl0LCBvcmlnaW5hbCByb290IGhhcyBiZWVuCisJCSAqIGNvcGllZCB0byBuZXcgY2hpbGQgcGFnZSwgaS5lLiwgb3JpZ2luYWwgZW50cnkgbm93CisJCSAqIHJlc2lkZXMgb24gdGhlIG5ldyBjaGlsZCBwYWdlOworCQkgKi8KKwkJaWYgKHAtPmhlYWRlci5mbGFnICYgQlRfSU5URVJOQUwpIHsKKwkJCUFTU0VSVChwLT5oZWFkZXIubmV4dGluZGV4ID09CisJCQkgICAgICAgY3B1X3RvX2xlMTYoWFRFTlRSWVNUQVJUICsgMSkpOworCQkJeGFkID0gJnAtPnhhZFtYVEVOVFJZU1RBUlRdOworCQkJYm4gPSBhZGRyZXNzWEFEKHhhZCk7CisJCQlYVF9QVVRQQUdFKG1wKTsKKworCQkJLyogZ2V0IG5ldyBjaGlsZCBwYWdlICovCisJCQlYVF9HRVRQQUdFKGlwLCBibiwgbXAsIFBTSVpFLCBwLCByYyk7CisJCQlpZiAocmMpCisJCQkJcmV0dXJuIHJjOworCisJCQlCVF9NQVJLX0RJUlRZKG1wLCBpcCk7CisJCQlpZiAoIXRlc3RfY2ZsYWcoQ09NTUlUX05vbGluaywgaXApKSB7CisJCQkJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBtcCwgdGxja1hUUkVFfHRsY2tHUk9XKTsKKwkJCQl4dGxjayA9IChzdHJ1Y3QgeHRsb2NrICopICYgdGxjay0+bG9jazsKKwkJCX0KKwkJfQorCX0KKwkvKgorCSAqICAgICAgaW5zZXJ0IHRoZSBuZXcgZW50cnkgaW50byB0aGUgbGVhZiBwYWdlCisJICovCisJZWxzZSB7CisJCS8qIGluc2VydCB0aGUgbmV3IGVudHJ5OiBtYXJrIHRoZSBlbnRyeSBORVcgKi8KKwkJeGFkID0gJnAtPnhhZFtpbmRleCArIDFdOworCQlYVF9QVVRFTlRSWSh4YWQsIFhBRF9ORVcsIHhvZmYsIGxlbiwgeGFkZHIpOworCisJCS8qIGFkdmFuY2UgbmV4dCBhdmFpbGFibGUgZW50cnkgaW5kZXggKi8KKwkJcC0+aGVhZGVyLm5leHRpbmRleCA9CisJCSAgICBjcHVfdG9fbGUxNihsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KSArIDEpOworCX0KKworCS8qIGdldCBiYWNrIG9sZCBlbnRyeSAqLworCXhhZCA9ICZwLT54YWRbaW5kZXhdOworCXhsZW4gPSBNQVhYTEVOOworCisJLyoKKwkgKiBleHRlbmQgb2xkIGV4dGVudAorCSAqLworICAgICAgZXh0ZW5kT2xkOgorCVhBRGxlbmd0aCh4YWQsIHhsZW4pOworCWlmICghKHhhZC0+ZmxhZyAmIFhBRF9ORVcpKQorCQl4YWQtPmZsYWcgfD0gWEFEX0VYVEVOREVEOworCisJaWYgKCF0ZXN0X2NmbGFnKENPTU1JVF9Ob2xpbmssIGlwKSkgeworCQl4dGxjay0+bHdtLm9mZnNldCA9CisJCSAgICAoeHRsY2stPmx3bS5vZmZzZXQpID8gbWluKGluZGV4LAorCQkJCQkgICAgICAoaW50KXh0bGNrLT5sd20ub2Zmc2V0KSA6IGluZGV4OworCQl4dGxjay0+bHdtLmxlbmd0aCA9CisJCSAgICBsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KSAtIHh0bGNrLT5sd20ub2Zmc2V0OworCX0KKworCS8qIHVucGluIHRoZSBsZWFmIHBhZ2UgKi8KKwlYVF9QVVRQQUdFKG1wKTsKKworCXJldHVybiByYzsKK30KKworI2lmZGVmIF9OT1RZRVQKKy8qCisgKiAgICAgIHh0VGFpbGdhdGUoKQorICoKKyAqIGZ1bmN0aW9uOiBzcGxpdCBleGlzdGluZyAndGFpbCcgZXh0ZW50CisgKiAgICAgIChzcGxpdCBvZmZzZXQgPj0gc3RhcnQgb2Zmc2V0IG9mIHRhaWwgZXh0ZW50KSwgYW5kCisgKiAgICAgIHJlbG9jYXRlIGFuZCBleHRlbmQgdGhlIHNwbGl0IHRhaWwgaGFsZjsKKyAqCisgKiBub3RlOiBleGlzdGluZyBleHRlbnQgbWF5IG9yIG1heSBub3QgaGF2ZSBiZWVuIGNvbW1pdHRlZC4KKyAqIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgcGFnZXIgYnVmZmVyIGNhY2hlIHVwZGF0ZSwgYW5kCisgKiB3b3JraW5nIGJsb2NrIGFsbG9jYXRpb24gbWFwIHVwZGF0ZTsKKyAqIHVwZGF0ZSBwbWFwOiBmcmVlIG9sZCBzcGxpdCB0YWlsIGV4dGVudCwgYWxsb2MgbmV3IGV4dGVudDsKKyAqLworaW50IHh0VGFpbGdhdGUodGlkX3QgdGlkLAkJLyogdHJhbnNhY3Rpb24gaWQgKi8KKwkgICAgICAgc3RydWN0IGlub2RlICppcCwgczY0IHhvZmYsCS8qIHNwbGl0L25ldyBleHRlbnQgb2Zmc2V0ICovCisJICAgICAgIHMzMiB4bGVuLAkvKiBuZXcgZXh0ZW50IGxlbmd0aCAqLworCSAgICAgICBzNjQgeGFkZHIsCS8qIG5ldyBleHRlbnQgYWRkcmVzcyAqLworCSAgICAgICBpbnQgZmxhZykKK3sKKwlpbnQgcmMgPSAwOworCWludCBjbXA7CisJc3RydWN0IG1ldGFwYWdlICptcDsJLyogbWV0YS1wYWdlIGJ1ZmZlciAqLworCXh0cGFnZV90ICpwOwkJLyogYmFzZSBCKy10cmVlIGluZGV4IHBhZ2UgKi8KKwlzNjQgYm47CisJaW50IGluZGV4LCBuZXh0aW5kZXgsIGxsZW4sIHJsZW47CisJc3RydWN0IGJ0c3RhY2sgYnRzdGFjazsJLyogdHJhdmVyc2Ugc3RhY2sgKi8KKwlzdHJ1Y3QgeHRzcGxpdCBzcGxpdDsJLyogc3BsaXQgaW5mb3JtYXRpb24gKi8KKwl4YWRfdCAqeGFkOworCXN0cnVjdCB0bG9jayAqdGxjazsKKwlzdHJ1Y3QgeHRsb2NrICp4dGxjayA9IDA7CisJc3RydWN0IHRsb2NrICptdGxjazsKKwlzdHJ1Y3QgbWFwbG9jayAqcHhkbG9jazsKKworLyoKK3ByaW50ZigieHRUYWlsZ2F0ZTogbnhvZmY6MHglbHggbnhsZW46MHgleCBueGFkZHI6MHglbHhcbiIsCisgICAgICAgICh1bG9uZyl4b2ZmLCB4bGVuLCAodWxvbmcpeGFkZHIpOworKi8KKworCS8qIHRoZXJlIG11c3QgZXhpc3QgZXh0ZW50IHRvIGJlIHRhaWxnYXRlZCAqLworCWlmICgocmMgPSB4dFNlYXJjaChpcCwgeG9mZiwgJmNtcCwgJmJ0c3RhY2ssIFhUX0lOU0VSVCkpKQorCQlyZXR1cm4gcmM7CisKKwkvKiByZXRyaWV2ZSBzZWFyY2ggcmVzdWx0ICovCisJWFRfR0VUU0VBUkNIKGlwLCBidHN0YWNrLnRvcCwgYm4sIG1wLCBwLCBpbmRleCk7CisKKwlpZiAoY21wICE9IDApIHsKKwkJWFRfUFVUUEFHRShtcCk7CisJCWpmc19lcnJvcihpcC0+aV9zYiwgInh0VGFpbGdhdGU6IGNvdWxkbid0IGZpbmQgZXh0ZW50Iik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIGVudHJ5IGZvdW5kIG11c3QgYmUgbGFzdCBlbnRyeSAqLworCW5leHRpbmRleCA9IGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpOworCWlmIChpbmRleCAhPSBuZXh0aW5kZXggLSAxKSB7CisJCVhUX1BVVFBBR0UobXApOworCQlqZnNfZXJyb3IoaXAtPmlfc2IsCisJCQkgICJ4dFRhaWxnYXRlOiB0aGUgZW50cnkgZm91bmQgaXMgbm90IHRoZSBsYXN0IGVudHJ5Iik7CisJCXJldHVybiAtRUlPOworCX0KKworCUJUX01BUktfRElSVFkobXAsIGlwKTsKKwkvKgorCSAqIGFjcXVpcmUgdGxvY2sgb2YgdGhlIGxlYWYgcGFnZSBjb250YWluaW5nIG9yaWdpbmFsIGVudHJ5CisJICovCisJaWYgKCF0ZXN0X2NmbGFnKENPTU1JVF9Ob2xpbmssIGlwKSkgeworCQl0bGNrID0gdHhMb2NrKHRpZCwgaXAsIG1wLCB0bGNrWFRSRUUgfCB0bGNrR1JPVyk7CisJCXh0bGNrID0gKHN0cnVjdCB4dGxvY2sgKikgJiB0bGNrLT5sb2NrOworCX0KKworCS8qIGNvbXBsZXRlbHkgcmVwbGFjZSBleHRlbnQgPyAqLworCXhhZCA9ICZwLT54YWRbaW5kZXhdOworLyoKK3ByaW50ZigieHRUYWlsZ2F0ZTogeG9mZjoweCVseCB4bGVuOjB4JXggeGFkZHI6MHglbHhcbiIsCisgICAgICAgICh1bG9uZylvZmZzZXRYQUQoeGFkKSwgbGVuZ3RoWEFEKHhhZCksICh1bG9uZylhZGRyZXNzWEFEKHhhZCkpOworKi8KKwlpZiAoKGxsZW4gPSB4b2ZmIC0gb2Zmc2V0WEFEKHhhZCkpID09IDApCisJCWdvdG8gdXBkYXRlT2xkOworCisJLyoKKwkgKiAgICAgIHBhcnRpYWxseSByZXBsYWNlIGV4dGVudDogaW5zZXJ0IGVudHJ5IGZvciBuZXcgZXh0ZW50CisJICovCisvL2luc2VydE5ldzoKKwkvKgorCSAqICAgICAgaWYgdGhlIGxlYWYgcGFnZSBpcyBmdWxsLCBpbnNlcnQgdGhlIG5ldyBlbnRyeSBhbmQKKwkgKiAgICAgIHByb3BhZ2F0ZSB1cCB0aGUgcm91dGVyIGVudHJ5IGZvciB0aGUgbmV3IHBhZ2UgZnJvbSBzcGxpdAorCSAqCisJICogVGhlIHh0U3BsaXRVcCgpIHdpbGwgaW5zZXJ0IHRoZSBlbnRyeSBhbmQgdW5waW4gdGhlIGxlYWYgcGFnZS4KKwkgKi8KKwlpZiAobmV4dGluZGV4ID09IGxlMTZfdG9fY3B1KHAtPmhlYWRlci5tYXhlbnRyeSkpIHsKKwkJLyogeHRTcGxpVXAoKSB1bnBpbnMgbGVhZiBwYWdlcyAqLworCQlzcGxpdC5tcCA9IG1wOworCQlzcGxpdC5pbmRleCA9IGluZGV4ICsgMTsKKwkJc3BsaXQuZmxhZyA9IFhBRF9ORVc7CisJCXNwbGl0Lm9mZiA9IHhvZmY7CS8qIHNwbGl0IG9mZnNldCAqLworCQlzcGxpdC5sZW4gPSB4bGVuOworCQlzcGxpdC5hZGRyID0geGFkZHI7CisJCXNwbGl0LnB4ZGxpc3QgPSBOVUxMOworCQlpZiAoKHJjID0geHRTcGxpdFVwKHRpZCwgaXAsICZzcGxpdCwgJmJ0c3RhY2spKSkKKwkJCXJldHVybiByYzsKKworCQkvKiBnZXQgYmFjayBvbGQgcGFnZSAqLworCQlYVF9HRVRQQUdFKGlwLCBibiwgbXAsIFBTSVpFLCBwLCByYyk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwkJLyoKKwkJICogaWYgbGVhZiByb290IGhhcyBiZWVuIHNwbGl0LCBvcmlnaW5hbCByb290IGhhcyBiZWVuCisJCSAqIGNvcGllZCB0byBuZXcgY2hpbGQgcGFnZSwgaS5lLiwgb3JpZ2luYWwgZW50cnkgbm93CisJCSAqIHJlc2lkZXMgb24gdGhlIG5ldyBjaGlsZCBwYWdlOworCQkgKi8KKwkJaWYgKHAtPmhlYWRlci5mbGFnICYgQlRfSU5URVJOQUwpIHsKKwkJCUFTU0VSVChwLT5oZWFkZXIubmV4dGluZGV4ID09CisJCQkgICAgICAgY3B1X3RvX2xlMTYoWFRFTlRSWVNUQVJUICsgMSkpOworCQkJeGFkID0gJnAtPnhhZFtYVEVOVFJZU1RBUlRdOworCQkJYm4gPSBhZGRyZXNzWEFEKHhhZCk7CisJCQlYVF9QVVRQQUdFKG1wKTsKKworCQkJLyogZ2V0IG5ldyBjaGlsZCBwYWdlICovCisJCQlYVF9HRVRQQUdFKGlwLCBibiwgbXAsIFBTSVpFLCBwLCByYyk7CisJCQlpZiAocmMpCisJCQkJcmV0dXJuIHJjOworCisJCQlCVF9NQVJLX0RJUlRZKG1wLCBpcCk7CisJCQlpZiAoIXRlc3RfY2ZsYWcoQ09NTUlUX05vbGluaywgaXApKSB7CisJCQkJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBtcCwgdGxja1hUUkVFfHRsY2tHUk9XKTsKKwkJCQl4dGxjayA9IChzdHJ1Y3QgeHRsb2NrICopICYgdGxjay0+bG9jazsKKwkJCX0KKwkJfQorCX0KKwkvKgorCSAqICAgICAgaW5zZXJ0IHRoZSBuZXcgZW50cnkgaW50byB0aGUgbGVhZiBwYWdlCisJICovCisJZWxzZSB7CisJCS8qIGluc2VydCB0aGUgbmV3IGVudHJ5OiBtYXJrIHRoZSBlbnRyeSBORVcgKi8KKwkJeGFkID0gJnAtPnhhZFtpbmRleCArIDFdOworCQlYVF9QVVRFTlRSWSh4YWQsIFhBRF9ORVcsIHhvZmYsIHhsZW4sIHhhZGRyKTsKKworCQkvKiBhZHZhbmNlIG5leHQgYXZhaWxhYmxlIGVudHJ5IGluZGV4ICovCisJCXAtPmhlYWRlci5uZXh0aW5kZXggPQorCQkgICAgY3B1X3RvX2xlMTYobGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCkgKyAxKTsKKwl9CisKKwkvKiBnZXQgYmFjayBvbGQgWEFEICovCisJeGFkID0gJnAtPnhhZFtpbmRleF07CisKKwkvKgorCSAqIHRydW5jYXRlL3JlbG9jYXRlIG9sZCBleHRlbnQgYXQgc3BsaXQgb2Zmc2V0CisJICovCisgICAgICB1cGRhdGVPbGQ6CisJLyogdXBkYXRlIGRtYXAgZm9yIG9sZC9jb21taXR0ZWQvdHJ1bmNhdGVkIGV4dGVudCAqLworCXJsZW4gPSBsZW5ndGhYQUQoeGFkKSAtIGxsZW47CisJaWYgKCEoeGFkLT5mbGFnICYgWEFEX05FVykpIHsKKwkJLyogZnJlZSBmcm9tIFBXTUFQIGF0IGNvbW1pdCAqLworCQlpZiAoIXRlc3RfY2ZsYWcoQ09NTUlUX05vbGluaywgaXApKSB7CisJCQltdGxjayA9IHR4TWFwbG9jayh0aWQsIGlwLCB0bGNrTUFQKTsKKwkJCXB4ZGxvY2sgPSAoc3RydWN0IG1hcGxvY2sgKikgJiBtdGxjay0+bG9jazsKKwkJCXB4ZGxvY2stPmZsYWcgPSBtbGNrRlJFRVBYRDsKKwkJCVBYRGFkZHJlc3MoJnB4ZGxvY2stPnB4ZCwgYWRkcmVzc1hBRCh4YWQpICsgbGxlbik7CisJCQlQWERsZW5ndGgoJnB4ZGxvY2stPnB4ZCwgcmxlbik7CisJCQlweGRsb2NrLT5pbmRleCA9IDE7CisJCX0KKwl9IGVsc2UKKwkJLyogZnJlZSBmcm9tIFdNQVAgKi8KKwkJZGJGcmVlKGlwLCBhZGRyZXNzWEFEKHhhZCkgKyBsbGVuLCAoczY0KSBybGVuKTsKKworCWlmIChsbGVuKQorCQkvKiB0cnVuY2F0ZSAqLworCQlYQURsZW5ndGgoeGFkLCBsbGVuKTsKKwllbHNlCisJCS8qIHJlcGxhY2UgKi8KKwkJWFRfUFVURU5UUlkoeGFkLCBYQURfTkVXLCB4b2ZmLCB4bGVuLCB4YWRkcik7CisKKwlpZiAoIXRlc3RfY2ZsYWcoQ09NTUlUX05vbGluaywgaXApKSB7CisJCXh0bGNrLT5sd20ub2Zmc2V0ID0gKHh0bGNrLT5sd20ub2Zmc2V0KSA/CisJCSAgICBtaW4oaW5kZXgsIChpbnQpeHRsY2stPmx3bS5vZmZzZXQpIDogaW5kZXg7CisJCXh0bGNrLT5sd20ubGVuZ3RoID0gbGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCkgLQorCQkgICAgeHRsY2stPmx3bS5vZmZzZXQ7CisJfQorCisJLyogdW5waW4gdGhlIGxlYWYgcGFnZSAqLworCVhUX1BVVFBBR0UobXApOworCisJcmV0dXJuIHJjOworfQorI2VuZGlmIC8qIF9OT1RZRVQgKi8KKworLyoKKyAqICAgICAgeHRVcGRhdGUoKQorICoKKyAqIGZ1bmN0aW9uOiB1cGRhdGUgWEFEOworICoKKyAqICAgICAgdXBkYXRlIGV4dGVudCBmb3IgYWxsb2NhdGVkX2J1dF9ub3RfcmVjb3JkZWQgb3IKKyAqICAgICAgY29tcHJlc3NlZCBleHRlbnQ7CisgKgorICogcGFyYW1ldGVyOgorICogICAgICBueGFkICAgIC0gbmV3IFhBRDsKKyAqICAgICAgICAgICAgICAgIGxvZ2ljYWwgZXh0ZW50IG9mIHRoZSBzcGVjaWZpZWQgWEFEIG11c3QgYmUgY29tcGxldGVseQorICogICAgICAgICAgICAgICAgY29udGFpbmVkIGJ5IGFuIGV4aXN0aW5nIFhBRDsKKyAqLworaW50IHh0VXBkYXRlKHRpZF90IHRpZCwgc3RydWN0IGlub2RlICppcCwgeGFkX3QgKiBueGFkKQorewkJCQkvKiBuZXcgWEFEICovCisJaW50IHJjID0gMDsKKwlpbnQgY21wOworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CS8qIG1ldGEtcGFnZSBidWZmZXIgKi8KKwl4dHBhZ2VfdCAqcDsJCS8qIGJhc2UgQistdHJlZSBpbmRleCBwYWdlICovCisJczY0IGJuOworCWludCBpbmRleDAsIGluZGV4LCBuZXdpbmRleCwgbmV4dGluZGV4OworCXN0cnVjdCBidHN0YWNrIGJ0c3RhY2s7CS8qIHRyYXZlcnNlIHN0YWNrICovCisJc3RydWN0IHh0c3BsaXQgc3BsaXQ7CS8qIHNwbGl0IGluZm9ybWF0aW9uICovCisJeGFkX3QgKnhhZCwgKmx4YWQsICpyeGFkOworCWludCB4ZmxhZzsKKwlzNjQgbnhvZmYsIHhvZmY7CisJaW50IG54bGVuLCB4bGVuLCBseGxlbiwgcnhsZW47CisJczY0IG54YWRkciwgeGFkZHI7CisJc3RydWN0IHRsb2NrICp0bGNrOworCXN0cnVjdCB4dGxvY2sgKnh0bGNrID0gTlVMTDsKKwlpbnQgbmV3cGFnZSA9IDA7CisKKwkvKiB0aGVyZSBtdXN0IGV4aXN0IGV4dGVudCB0byBiZSB0YWlsZ2F0ZWQgKi8KKwlueG9mZiA9IG9mZnNldFhBRChueGFkKTsKKwlueGxlbiA9IGxlbmd0aFhBRChueGFkKTsKKwlueGFkZHIgPSBhZGRyZXNzWEFEKG54YWQpOworCisJaWYgKChyYyA9IHh0U2VhcmNoKGlwLCBueG9mZiwgJmNtcCwgJmJ0c3RhY2ssIFhUX0lOU0VSVCkpKQorCQlyZXR1cm4gcmM7CisKKwkvKiByZXRyaWV2ZSBzZWFyY2ggcmVzdWx0ICovCisJWFRfR0VUU0VBUkNIKGlwLCBidHN0YWNrLnRvcCwgYm4sIG1wLCBwLCBpbmRleDApOworCisJaWYgKGNtcCAhPSAwKSB7CisJCVhUX1BVVFBBR0UobXApOworCQlqZnNfZXJyb3IoaXAtPmlfc2IsICJ4dFVwZGF0ZTogQ291bGQgbm90IGZpbmQgZXh0ZW50Iik7CisJCXJldHVybiAtRUlPOworCX0KKworCUJUX01BUktfRElSVFkobXAsIGlwKTsKKwkvKgorCSAqIGFjcXVpcmUgdGxvY2sgb2YgdGhlIGxlYWYgcGFnZSBjb250YWluaW5nIG9yaWdpbmFsIGVudHJ5CisJICovCisJaWYgKCF0ZXN0X2NmbGFnKENPTU1JVF9Ob2xpbmssIGlwKSkgeworCQl0bGNrID0gdHhMb2NrKHRpZCwgaXAsIG1wLCB0bGNrWFRSRUUgfCB0bGNrR1JPVyk7CisJCXh0bGNrID0gKHN0cnVjdCB4dGxvY2sgKikgJiB0bGNrLT5sb2NrOworCX0KKworCXhhZCA9ICZwLT54YWRbaW5kZXgwXTsKKwl4ZmxhZyA9IHhhZC0+ZmxhZzsKKwl4b2ZmID0gb2Zmc2V0WEFEKHhhZCk7CisJeGxlbiA9IGxlbmd0aFhBRCh4YWQpOworCXhhZGRyID0gYWRkcmVzc1hBRCh4YWQpOworCisJLyogblhBRCBtdXN0IGJlIGNvbXBsZXRlbHkgY29udGFpbmVkIHdpdGhpbiBYQUQgKi8KKwlpZiAoKHhvZmYgPiBueG9mZikgfHwKKwkgICAgKG54b2ZmICsgbnhsZW4gPiB4b2ZmICsgeGxlbikpIHsKKwkJWFRfUFVUUEFHRShtcCk7CisJCWpmc19lcnJvcihpcC0+aV9zYiwKKwkJCSAgInh0VXBkYXRlOiBuWEFEIGluIG5vdCBjb21wbGV0ZWx5IGNvbnRhaW5lZCB3aXRoaW4gWEFEIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWluZGV4ID0gaW5kZXgwOworCW5ld2luZGV4ID0gaW5kZXggKyAxOworCW5leHRpbmRleCA9IGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpOworCisjaWZkZWYgIF9KRlNfV0lQX05PQ09BTEVTQ0UKKwlpZiAoeG9mZiA8IG54b2ZmKQorCQlnb3RvIHVwZGF0ZVJpZ2h0OworCisJLyoKKwkgKiByZXBsYWNlIFhBRCB3aXRoIG5YQUQKKwkgKi8KKyAgICAgIHJlcGxhY2U6CQkJLyogKG54b2ZmID09IHhvZmYpICovCisJaWYgKG54bGVuID09IHhsZW4pIHsKKwkJLyogcmVwbGFjZSBYQUQgd2l0aCBuWEFEOnJlY29yZGVkICovCisJCSp4YWQgPSAqbnhhZDsKKwkJeGFkLT5mbGFnID0geGZsYWcgJiB+WEFEX05PVFJFQ09SREVEOworCisJCWdvdG8gb3V0OworCX0gZWxzZQkJCS8qIChueGxlbiA8IHhsZW4pICovCisJCWdvdG8gdXBkYXRlTGVmdDsKKyNlbmRpZgkJCQkvKiBfSkZTX1dJUF9OT0NPQUxFU0NFICovCisKKy8qICNpZmRlZiBfSkZTX1dJUF9DT0FMRVNDRSAqLworCWlmICh4b2ZmIDwgbnhvZmYpCisJCWdvdG8gY29hbGVzY2VSaWdodDsKKworCS8qCisJICogY29hbGVzY2Ugd2l0aCBsZWZ0IFhBRAorCSAqLworLy9jb2FsZXNjZUxlZnQ6IC8qICh4b2ZmID09IG54b2ZmKSAqLworCS8qIGlzIFhBRCBmaXJzdCBlbnRyeSBvZiBwYWdlID8gKi8KKwlpZiAoaW5kZXggPT0gWFRFTlRSWVNUQVJUKQorCQlnb3RvIHJlcGxhY2U7CisKKwkvKiBpcyBuWEFEIGxvZ2ljYWxseSBhbmQgcGh5c2ljYWxseSBjb250aWd1b3VzIHdpdGggbFhBRCA/ICovCisJbHhhZCA9ICZwLT54YWRbaW5kZXggLSAxXTsKKwlseGxlbiA9IGxlbmd0aFhBRChseGFkKTsKKwlpZiAoIShseGFkLT5mbGFnICYgWEFEX05PVFJFQ09SREVEKSAmJgorCSAgICAobnhvZmYgPT0gb2Zmc2V0WEFEKGx4YWQpICsgbHhsZW4pICYmCisJICAgIChueGFkZHIgPT0gYWRkcmVzc1hBRChseGFkKSArIGx4bGVuKSAmJgorCSAgICAobHhsZW4gKyBueGxlbiA8IE1BWFhMRU4pKSB7CisJCS8qIGV4dGVuZCByaWdodCBsWEFEICovCisJCWluZGV4MCA9IGluZGV4IC0gMTsKKwkJWEFEbGVuZ3RoKGx4YWQsIGx4bGVuICsgbnhsZW4pOworCisJCS8qIElmIHdlIGp1c3QgbWVyZ2VkIHR3byBleHRlbnRzIHRvZ2V0aGVyLCBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUKKwkJICogcmlnaHQgZXh0ZW50IGdldHMgbG9nZ2VkLiAgSWYgdGhlIGxlZnQgb25lIGlzIG1hcmtlZCBYQURfTkVXLAorCQkgKiB0aGVuIHdlIGtub3cgaXQgd2lsbCBiZSBsb2dnZWQuICBPdGhlcndpc2UsIG1hcmsgYXMKKwkJICogWEFEX0VYVEVOREVECisJCSAqLworCQlpZiAoIShseGFkLT5mbGFnICYgWEFEX05FVykpCisJCQlseGFkLT5mbGFnIHw9IFhBRF9FWFRFTkRFRDsKKworCQlpZiAoeGxlbiA+IG54bGVuKSB7CisJCQkvKiB0cnVuY2F0ZSBYQUQgKi8KKwkJCVhBRG9mZnNldCh4YWQsIHhvZmYgKyBueGxlbik7CisJCQlYQURsZW5ndGgoeGFkLCB4bGVuIC0gbnhsZW4pOworCQkJWEFEYWRkcmVzcyh4YWQsIHhhZGRyICsgbnhsZW4pOworCQkJZ290byBvdXQ7CisJCX0gZWxzZSB7CS8qICh4bGVuID09IG54bGVuKSAqLworCisJCQkvKiByZW1vdmUgWEFEICovCisJCQlpZiAoaW5kZXggPCBuZXh0aW5kZXggLSAxKQorCQkJCW1lbW1vdmUoJnAtPnhhZFtpbmRleF0sICZwLT54YWRbaW5kZXggKyAxXSwKKwkJCQkJKG5leHRpbmRleCAtIGluZGV4IC0KKwkJCQkJIDEpIDw8IEwyWFRTTE9UU0laRSk7CisKKwkJCXAtPmhlYWRlci5uZXh0aW5kZXggPQorCQkJICAgIGNwdV90b19sZTE2KGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpIC0KKwkJCQkJMSk7CisKKwkJCWluZGV4ID0gaW5kZXgwOworCQkJbmV3aW5kZXggPSBpbmRleCArIDE7CisJCQluZXh0aW5kZXggPSBsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KTsKKwkJCXhvZmYgPSBueG9mZiA9IG9mZnNldFhBRChseGFkKTsKKwkJCXhsZW4gPSBueGxlbiA9IGx4bGVuICsgbnhsZW47CisJCQl4YWRkciA9IG54YWRkciA9IGFkZHJlc3NYQUQobHhhZCk7CisJCQlnb3RvIGNvYWxlc2NlUmlnaHQ7CisJCX0KKwl9CisKKwkvKgorCSAqIHJlcGxhY2UgWEFEIHdpdGggblhBRAorCSAqLworICAgICAgcmVwbGFjZToJCQkvKiAobnhvZmYgPT0geG9mZikgKi8KKwlpZiAobnhsZW4gPT0geGxlbikgeworCQkvKiByZXBsYWNlIFhBRCB3aXRoIG5YQUQ6cmVjb3JkZWQgKi8KKwkJKnhhZCA9ICpueGFkOworCQl4YWQtPmZsYWcgPSB4ZmxhZyAmIH5YQURfTk9UUkVDT1JERUQ7CisKKwkJZ290byBjb2FsZXNjZVJpZ2h0OworCX0gZWxzZQkJCS8qIChueGxlbiA8IHhsZW4pICovCisJCWdvdG8gdXBkYXRlTGVmdDsKKworCS8qCisJICogY29hbGVzY2Ugd2l0aCByaWdodCBYQUQKKwkgKi8KKyAgICAgIGNvYWxlc2NlUmlnaHQ6CQkvKiAoeG9mZiA8PSBueG9mZikgKi8KKwkvKiBpcyBYQUQgbGFzdCBlbnRyeSBvZiBwYWdlID8gKi8KKwlpZiAobmV3aW5kZXggPT0gbmV4dGluZGV4KSB7CisJCWlmICh4b2ZmID09IG54b2ZmKQorCQkJZ290byBvdXQ7CisJCWdvdG8gdXBkYXRlUmlnaHQ7CisJfQorCisJLyogaXMgblhBRCBsb2dpY2FsbHkgYW5kIHBoeXNpY2FsbHkgY29udGlndW91cyB3aXRoIHJYQUQgPyAqLworCXJ4YWQgPSAmcC0+eGFkW2luZGV4ICsgMV07CisJcnhsZW4gPSBsZW5ndGhYQUQocnhhZCk7CisJaWYgKCEocnhhZC0+ZmxhZyAmIFhBRF9OT1RSRUNPUkRFRCkgJiYKKwkgICAgKG54b2ZmICsgbnhsZW4gPT0gb2Zmc2V0WEFEKHJ4YWQpKSAmJgorCSAgICAobnhhZGRyICsgbnhsZW4gPT0gYWRkcmVzc1hBRChyeGFkKSkgJiYKKwkgICAgKHJ4bGVuICsgbnhsZW4gPCBNQVhYTEVOKSkgeworCQkvKiBleHRlbmQgbGVmdCByWEFEICovCisJCVhBRG9mZnNldChyeGFkLCBueG9mZik7CisJCVhBRGxlbmd0aChyeGFkLCByeGxlbiArIG54bGVuKTsKKwkJWEFEYWRkcmVzcyhyeGFkLCBueGFkZHIpOworCisJCS8qIElmIHdlIGp1c3QgbWVyZ2VkIHR3byBleHRlbnRzIHRvZ2V0aGVyLCBuZWVkIHRvIG1ha2Ugc3VyZQorCQkgKiB0aGUgbGVmdCBleHRlbnQgZ2V0cyBsb2dnZWQuICBJZiB0aGUgcmlnaHQgb25lIGlzIG1hcmtlZAorCQkgKiBYQURfTkVXLCB0aGVuIHdlIGtub3cgaXQgd2lsbCBiZSBsb2dnZWQuICBPdGhlcndpc2UsIG1hcmsgYXMKKwkJICogWEFEX0VYVEVOREVECisJCSAqLworCQlpZiAoIShyeGFkLT5mbGFnICYgWEFEX05FVykpCisJCQlyeGFkLT5mbGFnIHw9IFhBRF9FWFRFTkRFRDsKKworCQlpZiAoeGxlbiA+IG54bGVuKQorCQkJLyogdHJ1bmNhdGUgWEFEICovCisJCQlYQURsZW5ndGgoeGFkLCB4bGVuIC0gbnhsZW4pOworCQllbHNlIHsJCS8qICh4bGVuID09IG54bGVuKSAqLworCisJCQkvKiByZW1vdmUgWEFEICovCisJCQltZW1tb3ZlKCZwLT54YWRbaW5kZXhdLCAmcC0+eGFkW2luZGV4ICsgMV0sCisJCQkJKG5leHRpbmRleCAtIGluZGV4IC0gMSkgPDwgTDJYVFNMT1RTSVpFKTsKKworCQkJcC0+aGVhZGVyLm5leHRpbmRleCA9CisJCQkgICAgY3B1X3RvX2xlMTYobGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCkgLQorCQkJCQkxKTsKKwkJfQorCisJCWdvdG8gb3V0OworCX0gZWxzZSBpZiAoeG9mZiA9PSBueG9mZikKKwkJZ290byBvdXQ7CisKKwlpZiAoeG9mZiA+PSBueG9mZikgeworCQlYVF9QVVRQQUdFKG1wKTsKKwkJamZzX2Vycm9yKGlwLT5pX3NiLCAieHRVcGRhdGU6IHhvZmYgPj0gbnhvZmYiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorLyogI2VuZGlmIF9KRlNfV0lQX0NPQUxFU0NFICovCisKKwkvKgorCSAqIHNwbGl0IFhBRCBpbnRvIChsWEFELCBuWEFEKToKKwkgKgorCSAqICAgICAgICAgIHwtLS1uWEFELS0tPgorCSAqIC0tfC0tLS0tLS0tLS1YQUQtLS0tLS0tLS0tfC0tCisJICogICB8LWxYQUQtfAorCSAqLworICAgICAgdXBkYXRlUmlnaHQ6CQkvKiAoeG9mZiA8IG54b2ZmKSAqLworCS8qIHRydW5jYXRlIG9sZCBYQUQgYXMgbFhBRDpub3RfcmVjb3JkZWQgKi8KKwl4YWQgPSAmcC0+eGFkW2luZGV4XTsKKwlYQURsZW5ndGgoeGFkLCBueG9mZiAtIHhvZmYpOworCisJLyogaW5zZXJ0IG5YQUQ6cmVjb3JkZWQgKi8KKwlpZiAobmV4dGluZGV4ID09IGxlMTZfdG9fY3B1KHAtPmhlYWRlci5tYXhlbnRyeSkpIHsKKworCQkvKiB4dFNwbGlVcCgpIHVucGlucyBsZWFmIHBhZ2VzICovCisJCXNwbGl0Lm1wID0gbXA7CisJCXNwbGl0LmluZGV4ID0gbmV3aW5kZXg7CisJCXNwbGl0LmZsYWcgPSB4ZmxhZyAmIH5YQURfTk9UUkVDT1JERUQ7CisJCXNwbGl0Lm9mZiA9IG54b2ZmOworCQlzcGxpdC5sZW4gPSBueGxlbjsKKwkJc3BsaXQuYWRkciA9IG54YWRkcjsKKwkJc3BsaXQucHhkbGlzdCA9IE5VTEw7CisJCWlmICgocmMgPSB4dFNwbGl0VXAodGlkLCBpcCwgJnNwbGl0LCAmYnRzdGFjaykpKQorCQkJcmV0dXJuIHJjOworCisJCS8qIGdldCBiYWNrIG9sZCBwYWdlICovCisJCVhUX0dFVFBBR0UoaXAsIGJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCQkvKgorCQkgKiBpZiBsZWFmIHJvb3QgaGFzIGJlZW4gc3BsaXQsIG9yaWdpbmFsIHJvb3QgaGFzIGJlZW4KKwkJICogY29waWVkIHRvIG5ldyBjaGlsZCBwYWdlLCBpLmUuLCBvcmlnaW5hbCBlbnRyeSBub3cKKwkJICogcmVzaWRlcyBvbiB0aGUgbmV3IGNoaWxkIHBhZ2U7CisJCSAqLworCQlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9JTlRFUk5BTCkgeworCQkJQVNTRVJUKHAtPmhlYWRlci5uZXh0aW5kZXggPT0KKwkJCSAgICAgICBjcHVfdG9fbGUxNihYVEVOVFJZU1RBUlQgKyAxKSk7CisJCQl4YWQgPSAmcC0+eGFkW1hURU5UUllTVEFSVF07CisJCQlibiA9IGFkZHJlc3NYQUQoeGFkKTsKKwkJCVhUX1BVVFBBR0UobXApOworCisJCQkvKiBnZXQgbmV3IGNoaWxkIHBhZ2UgKi8KKwkJCVhUX0dFVFBBR0UoaXAsIGJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKKwkJCWlmIChyYykKKwkJCQlyZXR1cm4gcmM7CisKKwkJCUJUX01BUktfRElSVFkobXAsIGlwKTsKKwkJCWlmICghdGVzdF9jZmxhZyhDT01NSVRfTm9saW5rLCBpcCkpIHsKKwkJCQl0bGNrID0gdHhMb2NrKHRpZCwgaXAsIG1wLCB0bGNrWFRSRUV8dGxja0dST1cpOworCQkJCXh0bGNrID0gKHN0cnVjdCB4dGxvY2sgKikgJiB0bGNrLT5sb2NrOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogaXMgblhBRCBvbiBuZXcgcGFnZSA/ICovCisJCQlpZiAobmV3aW5kZXggPgorCQkJICAgIChsZTE2X3RvX2NwdShwLT5oZWFkZXIubWF4ZW50cnkpID4+IDEpKSB7CisJCQkJbmV3aW5kZXggPQorCQkJCSAgICBuZXdpbmRleCAtCisJCQkJICAgIGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpICsKKwkJCQkgICAgWFRFTlRSWVNUQVJUOworCQkJCW5ld3BhZ2UgPSAxOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLyogaWYgaW5zZXJ0IGludG8gbWlkZGxlLCBzaGlmdCByaWdodCByZW1haW5pbmcgZW50cmllcyAqLworCQlpZiAobmV3aW5kZXggPCBuZXh0aW5kZXgpCisJCQltZW1tb3ZlKCZwLT54YWRbbmV3aW5kZXggKyAxXSwgJnAtPnhhZFtuZXdpbmRleF0sCisJCQkJKG5leHRpbmRleCAtIG5ld2luZGV4KSA8PCBMMlhUU0xPVFNJWkUpOworCisJCS8qIGluc2VydCB0aGUgZW50cnkgKi8KKwkJeGFkID0gJnAtPnhhZFtuZXdpbmRleF07CisJCSp4YWQgPSAqbnhhZDsKKwkJeGFkLT5mbGFnID0geGZsYWcgJiB+WEFEX05PVFJFQ09SREVEOworCisJCS8qIGFkdmFuY2UgbmV4dCBhdmFpbGFibGUgZW50cnkgaW5kZXguICovCisJCXAtPmhlYWRlci5uZXh0aW5kZXggPQorCQkgICAgY3B1X3RvX2xlMTYobGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCkgKyAxKTsKKwl9CisKKwkvKgorCSAqIGRvZXMgblhBRCBmb3JjZSAzLXdheSBzcGxpdCA/CisJICoKKwkgKiAgICAgICAgICB8LS0tblhBRC0tLT58CisJICogLS18LS0tLS0tLS0tLVhBRC0tLS0tLS0tLS0tLS18LS0KKwkgKiAgIHwtbFhBRC18ICAgICAgICAgICB8LXJYQUQgLXwKKwkgKi8KKwlpZiAobnhvZmYgKyBueGxlbiA9PSB4b2ZmICsgeGxlbikKKwkJZ290byBvdXQ7CisKKwkvKiByZW9yaWVudCBuWEFEIGFzIFhBRCBmb3IgZnVydGhlciBzcGxpdCBYQUQgaW50byAoblhBRCwgclhBRCkgKi8KKwlpZiAobmV3cGFnZSkgeworCQkvKiBjbG9zZSBvdXQgb2xkIHBhZ2UgKi8KKwkJaWYgKCF0ZXN0X2NmbGFnKENPTU1JVF9Ob2xpbmssIGlwKSkgeworCQkJeHRsY2stPmx3bS5vZmZzZXQgPSAoeHRsY2stPmx3bS5vZmZzZXQpID8KKwkJCSAgICBtaW4oaW5kZXgwLCAoaW50KXh0bGNrLT5sd20ub2Zmc2V0KSA6IGluZGV4MDsKKwkJCXh0bGNrLT5sd20ubGVuZ3RoID0KKwkJCSAgICBsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KSAtCisJCQkgICAgeHRsY2stPmx3bS5vZmZzZXQ7CisJCX0KKworCQlibiA9IGxlNjRfdG9fY3B1KHAtPmhlYWRlci5uZXh0KTsKKwkJWFRfUFVUUEFHRShtcCk7CisKKwkJLyogZ2V0IG5ldyByaWdodCBwYWdlICovCisJCVhUX0dFVFBBR0UoaXAsIGJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCUJUX01BUktfRElSVFkobXAsIGlwKTsKKwkJaWYgKCF0ZXN0X2NmbGFnKENPTU1JVF9Ob2xpbmssIGlwKSkgeworCQkJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBtcCwgdGxja1hUUkVFIHwgdGxja0dST1cpOworCQkJeHRsY2sgPSAoc3RydWN0IHh0bG9jayAqKSAmIHRsY2stPmxvY2s7CisJCX0KKworCQlpbmRleDAgPSBpbmRleCA9IG5ld2luZGV4OworCX0gZWxzZQorCQlpbmRleCsrOworCisJbmV3aW5kZXggPSBpbmRleCArIDE7CisJbmV4dGluZGV4ID0gbGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCk7CisJeGxlbiA9IHhsZW4gLSAobnhvZmYgLSB4b2ZmKTsKKwl4b2ZmID0gbnhvZmY7CisJeGFkZHIgPSBueGFkZHI7CisKKwkvKiByZWNvbXB1dGUgc3BsaXQgcGFnZXMgKi8KKwlpZiAobmV4dGluZGV4ID09IGxlMTZfdG9fY3B1KHAtPmhlYWRlci5tYXhlbnRyeSkpIHsKKwkJWFRfUFVUUEFHRShtcCk7CisKKwkJaWYgKChyYyA9IHh0U2VhcmNoKGlwLCBueG9mZiwgJmNtcCwgJmJ0c3RhY2ssIFhUX0lOU0VSVCkpKQorCQkJcmV0dXJuIHJjOworCisJCS8qIHJldHJpZXZlIHNlYXJjaCByZXN1bHQgKi8KKwkJWFRfR0VUU0VBUkNIKGlwLCBidHN0YWNrLnRvcCwgYm4sIG1wLCBwLCBpbmRleDApOworCisJCWlmIChjbXAgIT0gMCkgeworCQkJWFRfUFVUUEFHRShtcCk7CisJCQlqZnNfZXJyb3IoaXAtPmlfc2IsICJ4dFVwZGF0ZTogeHRTZWFyY2ggZmFpbGVkIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCWlmIChpbmRleDAgIT0gaW5kZXgpIHsKKwkJCVhUX1BVVFBBR0UobXApOworCQkJamZzX2Vycm9yKGlwLT5pX3NiLAorCQkJCSAgInh0VXBkYXRlOiB1bmV4cGVjdGVkIHZhbHVlIG9mIGluZGV4Iik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKworCS8qCisJICogc3BsaXQgWEFEIGludG8gKG5YQUQsIHJYQUQpCisJICoKKwkgKiAgICAgICAgICAtLS1uWEFELS0tfAorCSAqIC0tfC0tLS0tLS0tLS1YQUQtLS0tLS0tLS0tfC0tCisJICogICAgICAgICAgICAgICAgICAgIHwtclhBRC18CisJICovCisgICAgICB1cGRhdGVMZWZ0OgkJLyogKG54b2ZmID09IHhvZmYpICYmIChueGxlbiA8IHhsZW4pICovCisJLyogdXBkYXRlIG9sZCBYQUQgd2l0aCBuWEFEOnJlY29yZGVkICovCisJeGFkID0gJnAtPnhhZFtpbmRleF07CisJKnhhZCA9ICpueGFkOworCXhhZC0+ZmxhZyA9IHhmbGFnICYgflhBRF9OT1RSRUNPUkRFRDsKKworCS8qIGluc2VydCByWEFEOm5vdF9yZWNvcmRlZCAqLworCXhvZmYgPSB4b2ZmICsgbnhsZW47CisJeGxlbiA9IHhsZW4gLSBueGxlbjsKKwl4YWRkciA9IHhhZGRyICsgbnhsZW47CisJaWYgKG5leHRpbmRleCA9PSBsZTE2X3RvX2NwdShwLT5oZWFkZXIubWF4ZW50cnkpKSB7CisvKgorcHJpbnRmKCJ4dFVwZGF0ZS51cGRhdGVMZWZ0LnNwbGl0IHA6MHglcFxuIiwgcCk7CisqLworCQkvKiB4dFNwbGlVcCgpIHVucGlucyBsZWFmIHBhZ2VzICovCisJCXNwbGl0Lm1wID0gbXA7CisJCXNwbGl0LmluZGV4ID0gbmV3aW5kZXg7CisJCXNwbGl0LmZsYWcgPSB4ZmxhZzsKKwkJc3BsaXQub2ZmID0geG9mZjsKKwkJc3BsaXQubGVuID0geGxlbjsKKwkJc3BsaXQuYWRkciA9IHhhZGRyOworCQlzcGxpdC5weGRsaXN0ID0gTlVMTDsKKwkJaWYgKChyYyA9IHh0U3BsaXRVcCh0aWQsIGlwLCAmc3BsaXQsICZidHN0YWNrKSkpCisJCQlyZXR1cm4gcmM7CisKKwkJLyogZ2V0IGJhY2sgb2xkIHBhZ2UgKi8KKwkJWFRfR0VUUEFHRShpcCwgYm4sIG1wLCBQU0laRSwgcCwgcmMpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJLyoKKwkJICogaWYgbGVhZiByb290IGhhcyBiZWVuIHNwbGl0LCBvcmlnaW5hbCByb290IGhhcyBiZWVuCisJCSAqIGNvcGllZCB0byBuZXcgY2hpbGQgcGFnZSwgaS5lLiwgb3JpZ2luYWwgZW50cnkgbm93CisJCSAqIHJlc2lkZXMgb24gdGhlIG5ldyBjaGlsZCBwYWdlOworCQkgKi8KKwkJaWYgKHAtPmhlYWRlci5mbGFnICYgQlRfSU5URVJOQUwpIHsKKwkJCUFTU0VSVChwLT5oZWFkZXIubmV4dGluZGV4ID09CisJCQkgICAgICAgY3B1X3RvX2xlMTYoWFRFTlRSWVNUQVJUICsgMSkpOworCQkJeGFkID0gJnAtPnhhZFtYVEVOVFJZU1RBUlRdOworCQkJYm4gPSBhZGRyZXNzWEFEKHhhZCk7CisJCQlYVF9QVVRQQUdFKG1wKTsKKworCQkJLyogZ2V0IG5ldyBjaGlsZCBwYWdlICovCisJCQlYVF9HRVRQQUdFKGlwLCBibiwgbXAsIFBTSVpFLCBwLCByYyk7CisJCQlpZiAocmMpCisJCQkJcmV0dXJuIHJjOworCisJCQlCVF9NQVJLX0RJUlRZKG1wLCBpcCk7CisJCQlpZiAoIXRlc3RfY2ZsYWcoQ09NTUlUX05vbGluaywgaXApKSB7CisJCQkJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBtcCwgdGxja1hUUkVFfHRsY2tHUk9XKTsKKwkJCQl4dGxjayA9IChzdHJ1Y3QgeHRsb2NrICopICYgdGxjay0+bG9jazsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCS8qIGlmIGluc2VydCBpbnRvIG1pZGRsZSwgc2hpZnQgcmlnaHQgcmVtYWluaW5nIGVudHJpZXMgKi8KKwkJaWYgKG5ld2luZGV4IDwgbmV4dGluZGV4KQorCQkJbWVtbW92ZSgmcC0+eGFkW25ld2luZGV4ICsgMV0sICZwLT54YWRbbmV3aW5kZXhdLAorCQkJCShuZXh0aW5kZXggLSBuZXdpbmRleCkgPDwgTDJYVFNMT1RTSVpFKTsKKworCQkvKiBpbnNlcnQgdGhlIGVudHJ5ICovCisJCXhhZCA9ICZwLT54YWRbbmV3aW5kZXhdOworCQlYVF9QVVRFTlRSWSh4YWQsIHhmbGFnLCB4b2ZmLCB4bGVuLCB4YWRkcik7CisKKwkJLyogYWR2YW5jZSBuZXh0IGF2YWlsYWJsZSBlbnRyeSBpbmRleC4gKi8KKwkJcC0+aGVhZGVyLm5leHRpbmRleCA9CisJCSAgICBjcHVfdG9fbGUxNihsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KSArIDEpOworCX0KKworICAgICAgb3V0OgorCWlmICghdGVzdF9jZmxhZyhDT01NSVRfTm9saW5rLCBpcCkpIHsKKwkJeHRsY2stPmx3bS5vZmZzZXQgPSAoeHRsY2stPmx3bS5vZmZzZXQpID8KKwkJICAgIG1pbihpbmRleDAsIChpbnQpeHRsY2stPmx3bS5vZmZzZXQpIDogaW5kZXgwOworCQl4dGxjay0+bHdtLmxlbmd0aCA9IGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpIC0KKwkJICAgIHh0bGNrLT5sd20ub2Zmc2V0OworCX0KKworCS8qIHVucGluIHRoZSBsZWFmIHBhZ2UgKi8KKwlYVF9QVVRQQUdFKG1wKTsKKworCXJldHVybiByYzsKK30KKworCisvKgorICogICAgICB4dEFwcGVuZCgpCisgKgorICogZnVuY3Rpb246IGdyb3cgaW4gYXBwZW5kIG1vZGUgZnJvbSBjb250aWd1b3VzIHJlZ2lvbiBzcGVjaWZpZWQgOworICoKKyAqIHBhcmFtZXRlcjoKKyAqICAgICAgdGlkICAgICAgICAgICAgIC0gdHJhbnNhY3Rpb24gaWQ7CisgKiAgICAgIGlwICAgICAgICAgICAgICAtIGZpbGUgb2JqZWN0OworICogICAgICB4ZmxhZyAgICAgICAgICAgLSBleHRlbnQgZmxhZzoKKyAqICAgICAgeG9mZiAgICAgICAgICAgIC0gZXh0ZW50IG9mZnNldDsKKyAqICAgICAgbWF4YmxvY2tzICAgICAgIC0gbWF4IGV4dGVudCBsZW5ndGg7CisgKiAgICAgIHhsZW4gICAgICAgICAgICAtIGV4dGVudCBsZW5ndGggKGluL291dCk7CisgKiAgICAgIHhhZGRycCAgICAgICAgICAtIGV4dGVudCBhZGRyZXNzIHBvaW50ZXIgKGluL291dCk6CisgKiAgICAgIGZsYWcgICAgICAgICAgICAtCisgKgorICogcmV0dXJuOgorICovCitpbnQgeHRBcHBlbmQodGlkX3QgdGlkLAkJLyogdHJhbnNhY3Rpb24gaWQgKi8KKwkgICAgIHN0cnVjdCBpbm9kZSAqaXAsIGludCB4ZmxhZywgczY0IHhvZmYsIHMzMiBtYXhibG9ja3MsCQorCSAgICAgczMyICogeGxlbnAsCS8qIChpbi9vdXQpICovCisJICAgICBzNjQgKiB4YWRkcnAsCS8qIChpbi9vdXQpICovCisJICAgICBpbnQgZmxhZykKK3sKKwlpbnQgcmMgPSAwOworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CS8qIG1ldGEtcGFnZSBidWZmZXIgKi8KKwl4dHBhZ2VfdCAqcDsJCS8qIGJhc2UgQistdHJlZSBpbmRleCBwYWdlICovCisJczY0IGJuLCB4YWRkcjsKKwlpbnQgaW5kZXgsIG5leHRpbmRleDsKKwlzdHJ1Y3QgYnRzdGFjayBidHN0YWNrOwkvKiB0cmF2ZXJzZSBzdGFjayAqLworCXN0cnVjdCB4dHNwbGl0IHNwbGl0OwkvKiBzcGxpdCBpbmZvcm1hdGlvbiAqLworCXhhZF90ICp4YWQ7CisJaW50IGNtcDsKKwlzdHJ1Y3QgdGxvY2sgKnRsY2s7CisJc3RydWN0IHh0bG9jayAqeHRsY2s7CisJaW50IG5zcGxpdCwgbmJsb2NrcywgeGxlbjsKKwlzdHJ1Y3QgcHhkbGlzdCBweGRsaXN0OworCXB4ZF90ICpweGQ7CisKKwl4YWRkciA9ICp4YWRkcnA7CisJeGxlbiA9ICp4bGVucDsKKwlqZnNfaW5mbygieHRBcHBlbmQ6IHhvZmY6MHglbHggbWF4YmxvY2tzOiVkIHhsZW46JWQgeGFkZHI6MHglbHgiLAorCQkgKHVsb25nKSB4b2ZmLCBtYXhibG9ja3MsIHhsZW4sICh1bG9uZykgeGFkZHIpOworCisJLyoKKwkgKiAgICAgIHNlYXJjaCBmb3IgdGhlIGVudHJ5IGxvY2F0aW9uIGF0IHdoaWNoIHRvIGluc2VydDoKKwkgKgorCSAqIHh0RmFzdFNlYXJjaCgpIGFuZCB4dFNlYXJjaCgpIGJvdGggcmV0dXJucyAobGVhZiBwYWdlCisJICogcGlubmVkLCBpbmRleCBhdCB3aGljaCB0byBpbnNlcnQpLgorCSAqIG4uYi4geHRTZWFyY2goKSBtYXkgcmV0dXJuIGluZGV4IG9mIG1heGVudHJ5IG9mCisJICogdGhlIGZ1bGwgcGFnZS4KKwkgKi8KKwlpZiAoKHJjID0geHRTZWFyY2goaXAsIHhvZmYsICZjbXAsICZidHN0YWNrLCBYVF9JTlNFUlQpKSkKKwkJcmV0dXJuIHJjOworCisJLyogcmV0cmlldmUgc2VhcmNoIHJlc3VsdCAqLworCVhUX0dFVFNFQVJDSChpcCwgYnRzdGFjay50b3AsIGJuLCBtcCwgcCwgaW5kZXgpOworCisJaWYgKGNtcCA9PSAwKSB7CisJCXJjID0gLUVFWElTVDsKKwkJZ290byBvdXQ7CisJfQorLy9pbnNlcnQ6CisJLyoKKwkgKiAgICAgIGluc2VydCBlbnRyeSBmb3IgbmV3IGV4dGVudAorCSAqLworCXhmbGFnIHw9IFhBRF9ORVc7CisKKwkvKgorCSAqICAgICAgaWYgdGhlIGxlYWYgcGFnZSBpcyBmdWxsLCBzcGxpdCB0aGUgcGFnZSBhbmQKKwkgKiAgICAgIHByb3BhZ2F0ZSB1cCB0aGUgcm91dGVyIGVudHJ5IGZvciB0aGUgbmV3IHBhZ2UgZnJvbSBzcGxpdAorCSAqCisJICogVGhlIHh0U3BsaXRVcCgpIHdpbGwgaW5zZXJ0IHRoZSBlbnRyeSBhbmQgdW5waW4gdGhlIGxlYWYgcGFnZS4KKwkgKi8KKwluZXh0aW5kZXggPSBsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KTsKKwlpZiAobmV4dGluZGV4IDwgbGUxNl90b19jcHUocC0+aGVhZGVyLm1heGVudHJ5KSkKKwkJZ290byBpbnNlcnRMZWFmOworCisJLyoKKwkgKiBhbGxvY2F0ZSBuZXcgaW5kZXggYmxvY2tzIHRvIGNvdmVyIGluZGV4IHBhZ2Ugc3BsaXQocykKKwkgKi8KKwluc3BsaXQgPSBidHN0YWNrLm5zcGxpdDsKKwlzcGxpdC5weGRsaXN0ID0gJnB4ZGxpc3Q7CisJcHhkbGlzdC5tYXhucHhkID0gcHhkbGlzdC5ucHhkID0gMDsKKwlweGQgPSAmcHhkbGlzdC5weGRbMF07CisJbmJsb2NrcyA9IEpGU19TQkkoaXAtPmlfc2IpLT5uYnBlcnBhZ2U7CisJZm9yICg7IG5zcGxpdCA+IDA7IG5zcGxpdC0tLCBweGQrKywgeGFkZHIgKz0gbmJsb2NrcywgbWF4YmxvY2tzIC09IG5ibG9ja3MpIHsJCisJCWlmICgocmMgPSBkYkFsbG9jQm90dG9tVXAoaXAsIHhhZGRyLCAoczY0KSBuYmxvY2tzKSkgPT0gMCkgeworCQkJUFhEYWRkcmVzcyhweGQsIHhhZGRyKTsKKwkJCVBYRGxlbmd0aChweGQsIG5ibG9ja3MpOworCisJCQlweGRsaXN0Lm1heG5weGQrKzsKKworCQkJY29udGludWU7CisJCX0KKworCQkvKiB1bmRvIGFsbG9jYXRpb24gKi8KKworCQlnb3RvIG91dDsKKwl9CisKKwl4bGVuID0gbWluKHhsZW4sIG1heGJsb2Nrcyk7CQorCisJLyoKKwkgKiBhbGxvY2F0ZSBkYXRhIGV4dGVudCByZXF1ZXN0ZWQKKwkgKi8KKwlpZiAoKHJjID0gZGJBbGxvY0JvdHRvbVVwKGlwLCB4YWRkciwgKHM2NCkgeGxlbikpKQorCQlnb3RvIG91dDsKKworCXNwbGl0Lm1wID0gbXA7CisJc3BsaXQuaW5kZXggPSBpbmRleDsKKwlzcGxpdC5mbGFnID0geGZsYWc7CisJc3BsaXQub2ZmID0geG9mZjsKKwlzcGxpdC5sZW4gPSB4bGVuOworCXNwbGl0LmFkZHIgPSB4YWRkcjsKKwlpZiAoKHJjID0geHRTcGxpdFVwKHRpZCwgaXAsICZzcGxpdCwgJmJ0c3RhY2spKSkgeworCQkvKiB1bmRvIGRhdGEgZXh0ZW50IGFsbG9jYXRpb24gKi8KKwkJZGJGcmVlKGlwLCAqeGFkZHJwLCAoczY0KSAqIHhsZW5wKTsKKworCQlyZXR1cm4gcmM7CisJfQorCisJKnhhZGRycCA9IHhhZGRyOworCSp4bGVucCA9IHhsZW47CisJcmV0dXJuIDA7CisKKwkvKgorCSAqICAgICAgaW5zZXJ0IHRoZSBuZXcgZW50cnkgaW50byB0aGUgbGVhZiBwYWdlCisJICovCisgICAgICBpbnNlcnRMZWFmOgorCS8qCisJICogYWxsb2NhdGUgZGF0YSBleHRlbnQgcmVxdWVzdGVkCisJICovCisJaWYgKChyYyA9IGRiQWxsb2NCb3R0b21VcChpcCwgeGFkZHIsIChzNjQpIHhsZW4pKSkKKwkJZ290byBvdXQ7CisKKwlCVF9NQVJLX0RJUlRZKG1wLCBpcCk7CisJLyoKKwkgKiBhY3F1aXJlIGEgdHJhbnNhY3Rpb24gbG9jayBvbiB0aGUgbGVhZiBwYWdlOworCSAqCisJICogYWN0aW9uOiB4YWQgaW5zZXJ0aW9uL2V4dGVuc2lvbjsKKwkgKi8KKwl0bGNrID0gdHhMb2NrKHRpZCwgaXAsIG1wLCB0bGNrWFRSRUUgfCB0bGNrR1JPVyk7CisJeHRsY2sgPSAoc3RydWN0IHh0bG9jayAqKSAmIHRsY2stPmxvY2s7CisKKwkvKiBpbnNlcnQgdGhlIG5ldyBlbnRyeTogbWFyayB0aGUgZW50cnkgTkVXICovCisJeGFkID0gJnAtPnhhZFtpbmRleF07CisJWFRfUFVURU5UUlkoeGFkLCB4ZmxhZywgeG9mZiwgeGxlbiwgeGFkZHIpOworCisJLyogYWR2YW5jZSBuZXh0IGF2YWlsYWJsZSBlbnRyeSBpbmRleCAqLworCXAtPmhlYWRlci5uZXh0aW5kZXggPQorCSAgICBjcHVfdG9fbGUxNihsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KSArIDEpOworCisJeHRsY2stPmx3bS5vZmZzZXQgPQorCSAgICAoeHRsY2stPmx3bS5vZmZzZXQpID8gbWluKGluZGV4LChpbnQpIHh0bGNrLT5sd20ub2Zmc2V0KSA6IGluZGV4OworCXh0bGNrLT5sd20ubGVuZ3RoID0gbGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCkgLQorCSAgICB4dGxjay0+bHdtLm9mZnNldDsKKworCSp4YWRkcnAgPSB4YWRkcjsKKwkqeGxlbnAgPSB4bGVuOworCisgICAgICBvdXQ6CisJLyogdW5waW4gdGhlIGxlYWYgcGFnZSAqLworCVhUX1BVVFBBR0UobXApOworCisJcmV0dXJuIHJjOworfQorI2lmZGVmIF9TVElMTF9UT19QT1JUCisKKy8qIC0gVEJEIGZvciBkZWZyYWdtZW50YWlvbi9yZW9yZ2FuaXphdGlvbiAtCisgKgorICogICAgICB4dERlbGV0ZSgpCisgKgorICogZnVuY3Rpb246CisgKiAgICAgIGRlbGV0ZSB0aGUgZW50cnkgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS4KKyAqCisgKiAgICAgIE4uQi46IHdob2xlIGV4dGVudCBvZiB0aGUgZW50cnkgaXMgYXNzdW1lZCB0byBiZSBkZWxldGVkLgorICoKKyAqIHBhcmFtZXRlcjoKKyAqCisgKiByZXR1cm46CisgKiAgICAgICBFTk9FTlQ6IGlmIHRoZSBlbnRyeSBpcyBub3QgZm91bmQuCisgKgorICogZXhjZXB0aW9uOgorICovCitpbnQgeHREZWxldGUodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLCBzNjQgeG9mZiwgczMyIHhsZW4sIGludCBmbGFnKQoreworCWludCByYyA9IDA7CisJc3RydWN0IGJ0c3RhY2sgYnRzdGFjazsKKwlpbnQgY21wOworCXM2NCBibjsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCXh0cGFnZV90ICpwOworCWludCBpbmRleCwgbmV4dGluZGV4OworCXN0cnVjdCB0bG9jayAqdGxjazsKKwlzdHJ1Y3QgeHRsb2NrICp4dGxjazsKKworCS8qCisJICogZmluZCB0aGUgbWF0Y2hpbmcgZW50cnk7IHh0U2VhcmNoKCkgcGlucyB0aGUgcGFnZQorCSAqLworCWlmICgocmMgPSB4dFNlYXJjaChpcCwgeG9mZiwgJmNtcCwgJmJ0c3RhY2ssIDApKSkKKwkJcmV0dXJuIHJjOworCisJWFRfR0VUU0VBUkNIKGlwLCBidHN0YWNrLnRvcCwgYm4sIG1wLCBwLCBpbmRleCk7CisJaWYgKGNtcCkgeworCQkvKiB1bnBpbiB0aGUgbGVhZiBwYWdlICovCisJCVhUX1BVVFBBR0UobXApOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwkvKgorCSAqIGRlbGV0ZSB0aGUgZW50cnkgZnJvbSB0aGUgbGVhZiBwYWdlCisJICovCisJbmV4dGluZGV4ID0gbGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCk7CisJcC0+aGVhZGVyLm5leHRpbmRleCA9CisJICAgIGNwdV90b19sZTE2KGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpIC0gMSk7CisKKwkvKgorCSAqIGlmIHRoZSBsZWFmIHBhZ2UgYm9jb21lIGVtcHR5LCBmcmVlIHRoZSBwYWdlCisJICovCisJaWYgKHAtPmhlYWRlci5uZXh0aW5kZXggPT0gY3B1X3RvX2xlMTYoWFRFTlRSWVNUQVJUKSkKKwkJcmV0dXJuICh4dERlbGV0ZVVwKHRpZCwgaXAsIG1wLCBwLCAmYnRzdGFjaykpOworCisJQlRfTUFSS19ESVJUWShtcCwgaXApOworCS8qCisJICogYWNxdWlyZSBhIHRyYW5zYWN0aW9uIGxvY2sgb24gdGhlIGxlYWYgcGFnZTsKKwkgKgorCSAqIGFjdGlvbjp4YWQgZGVsZXRpb247CisJICovCisJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBtcCwgdGxja1hUUkVFKTsKKwl4dGxjayA9IChzdHJ1Y3QgeHRsb2NrICopICYgdGxjay0+bG9jazsKKwl4dGxjay0+bHdtLm9mZnNldCA9CisJICAgICh4dGxjay0+bHdtLm9mZnNldCkgPyBtaW4oaW5kZXgsIHh0bGNrLT5sd20ub2Zmc2V0KSA6IGluZGV4OworCisJLyogaWYgZGVsZXRlIGZyb20gbWlkZGxlLCBzaGlmdCBsZWZ0L2NvbXBhY3QgdGhlIHJlbWFpbmluZyBlbnRyaWVzICovCisJaWYgKGluZGV4IDwgbmV4dGluZGV4IC0gMSkKKwkJbWVtbW92ZSgmcC0+eGFkW2luZGV4XSwgJnAtPnhhZFtpbmRleCArIDFdLAorCQkJKG5leHRpbmRleCAtIGluZGV4IC0gMSkgKiBzaXplb2YoeGFkX3QpKTsKKworCVhUX1BVVFBBR0UobXApOworCisJcmV0dXJuIDA7Cit9CisKKworLyogLSBUQkQgZm9yIGRlZnJhZ21lbnRhaW9uL3Jlb3JnYW5pemF0aW9uIC0KKyAqCisgKiAgICAgIHh0RGVsZXRlVXAoKQorICoKKyAqIGZ1bmN0aW9uOgorICogICAgICBmcmVlIGVtcHR5IHBhZ2VzIGFzIHByb3BhZ2F0aW5nIGRlbGV0aW9uIHVwIHRoZSB0cmVlCisgKgorICogcGFyYW1ldGVyOgorICoKKyAqIHJldHVybjoKKyAqLworc3RhdGljIGludAoreHREZWxldGVVcCh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsCisJICAgc3RydWN0IG1ldGFwYWdlICogZm1wLCB4dHBhZ2VfdCAqIGZwLCBzdHJ1Y3QgYnRzdGFjayAqIGJ0c3RhY2spCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCXh0cGFnZV90ICpwOworCWludCBpbmRleCwgbmV4dGluZGV4OworCXM2NCB4YWRkcjsKKwlpbnQgeGxlbjsKKwlzdHJ1Y3QgYnRmcmFtZSAqcGFyZW50OworCXN0cnVjdCB0bG9jayAqdGxjazsKKwlzdHJ1Y3QgeHRsb2NrICp4dGxjazsKKworCS8qCisJICoga2VlcCByb290IGxlYWYgcGFnZSB3aGljaCBoYXMgYmVjb21lIGVtcHR5CisJICovCisJaWYgKGZwLT5oZWFkZXIuZmxhZyAmIEJUX1JPT1QpIHsKKwkJLyoga2VlcCB0aGUgcm9vdCBwYWdlICovCisJCWZwLT5oZWFkZXIuZmxhZyAmPSB+QlRfSU5URVJOQUw7CisJCWZwLT5oZWFkZXIuZmxhZyB8PSBCVF9MRUFGOworCQlmcC0+aGVhZGVyLm5leHRpbmRleCA9IGNwdV90b19sZTE2KFhURU5UUllTVEFSVCk7CisKKwkJLyogWFRfUFVUUEFHRShmbXApOyAqLworCisJCXJldHVybiAwOworCX0KKworCS8qCisJICogZnJlZSBub24tcm9vdCBsZWFmIHBhZ2UKKwkgKi8KKwlpZiAoKHJjID0geHRSZWxpbmsodGlkLCBpcCwgZnApKSkgeworCQlYVF9QVVRQQUdFKGZtcCk7CisJCXJldHVybiByYzsKKwl9CisKKwl4YWRkciA9IGFkZHJlc3NQWEQoJmZwLT5oZWFkZXIuc2VsZik7CisJeGxlbiA9IGxlbmd0aFBYRCgmZnAtPmhlYWRlci5zZWxmKTsKKwkvKiBmcmVlIHRoZSBwYWdlIGV4dGVudCAqLworCWRiRnJlZShpcCwgeGFkZHIsIChzNjQpIHhsZW4pOworCisJLyogZnJlZSB0aGUgYnVmZmVyIHBhZ2UgKi8KKwlkaXNjYXJkX21ldGFwYWdlKGZtcCk7CisKKwkvKgorCSAqIHByb3BhZ2F0ZSBwYWdlIGRlbGV0aW9uIHVwIHRoZSBpbmRleCB0cmVlCisJICoKKwkgKiBJZiB0aGUgZGVsZXRlIGZyb20gdGhlIHBhcmVudCBwYWdlIG1ha2VzIGl0IGVtcHR5LAorCSAqIGNvbnRpbnVlIGFsbCB0aGUgd2F5IHVwIHRoZSB0cmVlLgorCSAqIHN0b3AgaWYgdGhlIHJvb3QgcGFnZSBpcyByZWFjaGVkICh3aGljaCBpcyBuZXZlciBkZWxldGVkKSBvcgorCSAqIGlmIHRoZSBlbnRyeSBkZWxldGlvbiBkb2VzIG5vdCBlbXB0eSB0aGUgcGFnZS4KKwkgKi8KKwl3aGlsZSAoKHBhcmVudCA9IEJUX1BPUChidHN0YWNrKSkgIT0gTlVMTCkgeworCQkvKiBnZXQvcGluIHRoZSBwYXJlbnQgcGFnZSA8c3A+ICovCisJCVhUX0dFVFBBR0UoaXAsIHBhcmVudC0+Ym4sIG1wLCBQU0laRSwgcCwgcmMpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJaW5kZXggPSBwYXJlbnQtPmluZGV4OworCisJCS8qIGRlbGV0ZSB0aGUgZW50cnkgZm9yIHRoZSBmcmVlZCBjaGlsZCBwYWdlIGZyb20gcGFyZW50LgorCQkgKi8KKwkJbmV4dGluZGV4ID0gbGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCk7CisKKwkJLyoKKwkJICogdGhlIHBhcmVudCBoYXMgdGhlIHNpbmdsZSBlbnRyeSBiZWluZyBkZWxldGVkOgorCQkgKiBmcmVlIHRoZSBwYXJlbnQgcGFnZSB3aGljaCBoYXMgYmVjb21lIGVtcHR5LgorCQkgKi8KKwkJaWYgKG5leHRpbmRleCA9PSAxKSB7CisJCQlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9ST09UKSB7CisJCQkJLyoga2VlcCB0aGUgcm9vdCBwYWdlICovCisJCQkJcC0+aGVhZGVyLmZsYWcgJj0gfkJUX0lOVEVSTkFMOworCQkJCXAtPmhlYWRlci5mbGFnIHw9IEJUX0xFQUY7CisJCQkJcC0+aGVhZGVyLm5leHRpbmRleCA9CisJCQkJICAgIGNwdV90b19sZTE2KFhURU5UUllTVEFSVCk7CisKKwkJCQkvKiBYVF9QVVRQQUdFKG1wKTsgKi8KKworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQkvKiBmcmVlIHRoZSBwYXJlbnQgcGFnZSAqLworCQkJCWlmICgocmMgPSB4dFJlbGluayh0aWQsIGlwLCBwKSkpCisJCQkJCXJldHVybiByYzsKKworCQkJCXhhZGRyID0gYWRkcmVzc1BYRCgmcC0+aGVhZGVyLnNlbGYpOworCQkJCS8qIGZyZWUgdGhlIHBhZ2UgZXh0ZW50ICovCisJCQkJZGJGcmVlKGlwLCB4YWRkciwKKwkJCQkgICAgICAgKHM2NCkgSkZTX1NCSShpcC0+aV9zYiktPm5icGVycGFnZSk7CisKKwkJCQkvKiB1bnBpbi9mcmVlIHRoZSBidWZmZXIgcGFnZSAqLworCQkJCWRpc2NhcmRfbWV0YXBhZ2UobXApOworCisJCQkJLyogcHJvcGFnYXRlIHVwICovCisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJLyoKKwkJICogdGhlIHBhcmVudCBoYXMgb3RoZXIgZW50cmllcyByZW1haW5pbmc6CisJCSAqIGRlbGV0ZSB0aGUgcm91dGVyIGVudHJ5IGZyb20gdGhlIHBhcmVudCBwYWdlLgorCQkgKi8KKwkJZWxzZSB7CisJCQlCVF9NQVJLX0RJUlRZKG1wLCBpcCk7CisJCQkvKgorCQkJICogYWNxdWlyZSBhIHRyYW5zYWN0aW9uIGxvY2sgb24gdGhlIGxlYWYgcGFnZTsKKwkJCSAqCisJCQkgKiBhY3Rpb246eGFkIGRlbGV0aW9uOworCQkJICovCisJCQl0bGNrID0gdHhMb2NrKHRpZCwgaXAsIG1wLCB0bGNrWFRSRUUpOworCQkJeHRsY2sgPSAoc3RydWN0IHh0bG9jayAqKSAmIHRsY2stPmxvY2s7CisJCQl4dGxjay0+bHdtLm9mZnNldCA9CisJCQkgICAgKHh0bGNrLT5sd20ub2Zmc2V0KSA/IG1pbihpbmRleCwKKwkJCQkJCSAgICAgIHh0bGNrLT5sd20uCisJCQkJCQkgICAgICBvZmZzZXQpIDogaW5kZXg7CisKKwkJCS8qIGlmIGRlbGV0ZSBmcm9tIG1pZGRsZSwKKwkJCSAqIHNoaWZ0IGxlZnQvY29tcGFjdCB0aGUgcmVtYWluaW5nIGVudHJpZXMgaW4gdGhlIHBhZ2UKKwkJCSAqLworCQkJaWYgKGluZGV4IDwgbmV4dGluZGV4IC0gMSkKKwkJCQltZW1tb3ZlKCZwLT54YWRbaW5kZXhdLCAmcC0+eGFkW2luZGV4ICsgMV0sCisJCQkJCShuZXh0aW5kZXggLSBpbmRleCAtCisJCQkJCSAxKSA8PCBMMlhUU0xPVFNJWkUpOworCisJCQlwLT5oZWFkZXIubmV4dGluZGV4ID0KKwkJCSAgICBjcHVfdG9fbGUxNihsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KSAtCisJCQkJCTEpOworCQkJamZzX2luZm8oInh0RGVsZXRlVXAoZW50cnkpOiAweCVseFslZF0iLAorCQkJCSAodWxvbmcpIHBhcmVudC0+Ym4sIGluZGV4KTsKKwkJfQorCisJCS8qIHVucGluIHRoZSBwYXJlbnQgcGFnZSAqLworCQlYVF9QVVRQQUdFKG1wKTsKKworCQkvKiBleGl0IHByb3BhZ2F0aW9uIHVwICovCisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qCisgKiBOQU1FOiAgICAgICAgeHRSZWxvY2F0ZSgpCisgKgorICogRlVOQ1RJT046ICAgIHJlbG9jYXRlIHh0cGFnZSBvciBkYXRhIGV4dGVudCBvZiByZWd1bGFyIGZpbGU7CisgKiAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyBtYWlubHkgdXNlZCBieSBkZWZyYWdmcyB1dGlsaXR5LgorICoKKyAqIE5PVEU6ICAgICAgICBUaGlzIHJvdXRpbmUgZG9lcyBub3QgaGF2ZSB0aGUgbG9naWMgdG8gaGFuZGxlCisgKiAgICAgICAgICAgICAgdW5jb21taXR0ZWQgYWxsb2NhdGVkIGV4dGVudC4gVGhlIGNhbGxlciBzaG91bGQgY2FsbAorICogICAgICAgICAgICAgIHR4Q29tbWl0KCkgdG8gY29tbWl0IGFsbCB0aGUgYWxsb2NhdGlvbiBiZWZvcmUgY2FsbAorICogICAgICAgICAgICAgIHRoaXMgcm91dGluZS4KKyAqLworaW50Cit4dFJlbG9jYXRlKHRpZF90IHRpZCwgc3RydWN0IGlub2RlICogaXAsIHhhZF90ICogb3hhZCwJLyogb2xkIFhBRCAqLworCSAgIHM2NCBueGFkZHIsCQkvKiBuZXcgeGFkZHIgKi8KKwkgICBpbnQgeHR5cGUpCit7CQkJCS8qIGV4dGVudCB0eXBlOiBYVFBBR0Ugb3IgREFUQUVYVCAqLworCWludCByYyA9IDA7CisJc3RydWN0IHRibG9jayAqdGJsazsKKwlzdHJ1Y3QgdGxvY2sgKnRsY2s7CisJc3RydWN0IHh0bG9jayAqeHRsY2s7CisJc3RydWN0IG1ldGFwYWdlICptcCwgKnBtcCwgKmxtcCwgKnJtcDsJLyogbWV0YS1wYWdlIGJ1ZmZlciAqLworCXh0cGFnZV90ICpwLCAqcHAsICpycCwgKmxwOwkvKiBiYXNlIEIrLXRyZWUgaW5kZXggcGFnZSAqLworCXhhZF90ICp4YWQ7CisJcHhkX3QgKnB4ZDsKKwlzNjQgeG9mZiwgeHNpemU7CisJaW50IHhsZW47CisJczY0IG94YWRkciwgc3hhZGRyLCBkeGFkZHIsIG5leHRibiwgcHJldmJuOworCWNidWZfdCAqY3A7CisJczY0IG9mZnNldCwgbmJ5dGVzLCBuYnJkLCBwbm87CisJaW50IG5iLCBucGFnZXMsIG5ibGtzOworCXM2NCBibjsKKwlpbnQgY21wOworCWludCBpbmRleDsKKwlzdHJ1Y3QgcHhkX2xvY2sgKnB4ZGxvY2s7CisJc3RydWN0IGJ0c3RhY2sgYnRzdGFjazsJLyogdHJhdmVyc2Ugc3RhY2sgKi8KKworCXh0eXBlID0geHR5cGUgJiBFWFRFTlRfVFlQRTsKKworCXhvZmYgPSBvZmZzZXRYQUQob3hhZCk7CisJb3hhZGRyID0gYWRkcmVzc1hBRChveGFkKTsKKwl4bGVuID0gbGVuZ3RoWEFEKG94YWQpOworCisJLyogdmFsaWRhdGUgZXh0ZW50IG9mZnNldCAqLworCW9mZnNldCA9IHhvZmYgPDwgSkZTX1NCSShpcC0+aV9zYiktPmwyYnNpemU7CisJaWYgKG9mZnNldCA+PSBpcC0+aV9zaXplKQorCQlyZXR1cm4gLUVTVEFMRTsJLyogc3RhbGUgZXh0ZW50ICovCisKKwlqZnNfaW5mbygieHRSZWxvY2F0ZTogeHR5cGU6JWQgeG9mZjoweCVseCB4bGVuOjB4JXggeGFkZHI6MHglbHg6MHglbHgiLAorCQkgeHR5cGUsICh1bG9uZykgeG9mZiwgeGxlbiwgKHVsb25nKSBveGFkZHIsICh1bG9uZykgbnhhZGRyKTsKKworCS8qCisJICogICAgICAxLiBnZXQgYW5kIHZhbGlkYXRlIHRoZSBwYXJlbnQgeHRwYWdlL3hhZCBlbnRyeQorCSAqICAgICAgY292ZXJpbmcgdGhlIHNvdXJjZSBleHRlbnQgdG8gYmUgcmVsb2NhdGVkOworCSAqLworCWlmICh4dHlwZSA9PSBEQVRBRVhUKSB7CisJCS8qIHNlYXJjaCBpbiBsZWFmIGVudHJ5ICovCisJCXJjID0geHRTZWFyY2goaXAsIHhvZmYsICZjbXAsICZidHN0YWNrLCAwKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCS8qIHJldHJpZXZlIHNlYXJjaCByZXN1bHQgKi8KKwkJWFRfR0VUU0VBUkNIKGlwLCBidHN0YWNrLnRvcCwgYm4sIHBtcCwgcHAsIGluZGV4KTsKKworCQlpZiAoY21wKSB7CisJCQlYVF9QVVRQQUdFKHBtcCk7CisJCQlyZXR1cm4gLUVTVEFMRTsKKwkJfQorCisJCS8qIHZhbGlkYXRlIGZvciBleGFjdCBtYXRjaCB3aXRoIGEgc2luZ2xlIGVudHJ5ICovCisJCXhhZCA9ICZwcC0+eGFkW2luZGV4XTsKKwkJaWYgKGFkZHJlc3NYQUQoeGFkKSAhPSBveGFkZHIgfHwgbGVuZ3RoWEFEKHhhZCkgIT0geGxlbikgeworCQkJWFRfUFVUUEFHRShwbXApOworCQkJcmV0dXJuIC1FU1RBTEU7CisJCX0KKwl9IGVsc2UgewkJLyogKHh0eXBlID09IFhUUEFHRSkgKi8KKworCQkvKiBzZWFyY2ggaW4gaW50ZXJuYWwgZW50cnkgKi8KKwkJcmMgPSB4dFNlYXJjaE5vZGUoaXAsIG94YWQsICZjbXAsICZidHN0YWNrLCAwKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCS8qIHJldHJpZXZlIHNlYXJjaCByZXN1bHQgKi8KKwkJWFRfR0VUU0VBUkNIKGlwLCBidHN0YWNrLnRvcCwgYm4sIHBtcCwgcHAsIGluZGV4KTsKKworCQlpZiAoY21wKSB7CisJCQlYVF9QVVRQQUdFKHBtcCk7CisJCQlyZXR1cm4gLUVTVEFMRTsKKwkJfQorCisJCS8qIHh0U2VhcmNoTm9kZSgpIHZhbGlkYXRlZCBmb3IgZXhhY3QgbWF0Y2ggd2l0aCBhIHNpbmdsZSBlbnRyeQorCQkgKi8KKwkJeGFkID0gJnBwLT54YWRbaW5kZXhdOworCX0KKwlqZnNfaW5mbygieHRSZWxvY2F0ZTogcGFyZW50IHhhZCBlbnRyeSB2YWxpZGF0ZWQuIik7CisKKwkvKgorCSAqICAgICAgMi4gcmVsb2NhdGUgdGhlIGV4dGVudAorCSAqLworCWlmICh4dHlwZSA9PSBEQVRBRVhUKSB7CisJCS8qIGlmIHRoZSBleHRlbnQgaXMgYWxsb2NhdGVkLWJ1dC1ub3QtcmVjb3JkZWQKKwkJICogdGhlcmUgaXMgbm8gcmVhbCBkYXRhIHRvIGJlIG1vdmVkIGluIHRoaXMgZXh0ZW50LAorCQkgKi8KKwkJaWYgKHhhZC0+ZmxhZyAmIFhBRF9OT1RSRUNPUkRFRCkKKwkJCWdvdG8gb3V0OworCQllbHNlCisJCQkvKiByZWxlYXNlIHh0cGFnZSBmb3IgY21SZWFkKCkveHRMb29rdXAoKSAqLworCQkJWFRfUFVUUEFHRShwbXApOworCisJCS8qCisJCSAqICAgICAgY21SZWxvY2F0ZSgpCisJCSAqCisJCSAqIGNvcHkgdGFyZ2V0IGRhdGEgcGFnZXMgdG8gYmUgcmVsb2NhdGVkOworCQkgKgorCQkgKiBkYXRhIGV4dGVudCBtdXN0IHN0YXJ0IGF0IHBhZ2UgYm91bmRhcnkgYW5kCisJCSAqIG11bHRpcGxlIG9mIHBhZ2Ugc2l6ZSAoZXhjZXB0IHRoZSBsYXN0IGRhdGEgZXh0ZW50KTsKKwkJICogcmVhZCBpbiBlYWNoIHBhZ2Ugb2YgdGhlIHNvdXJjZSBkYXRhIGV4dGVudCBpbnRvIGNidWYsCisJCSAqIHVwZGF0ZSB0aGUgY2J1ZiBleHRlbnQgZGVzY3JpcHRvciBvZiB0aGUgcGFnZSB0byBiZQorCQkgKiBob21ld2FyZCBib3VuZCB0byBuZXcgZHN0IGRhdGEgZXh0ZW50CisJCSAqIGNvcHkgdGhlIGRhdGEgZnJvbSB0aGUgb2xkIGV4dGVudCB0byBuZXcgZXh0ZW50LgorCQkgKiBjb3B5IGlzIGVzc2VudGlhbCBmb3IgY29tcHJlc3NlZCBmaWxlcyB0byBhdm9pZCBwcm9ibGVtcworCQkgKiB0aGF0IGNhbiBhcmlzZSBpZiB0aGVyZSB3YXMgYSBjaGFuZ2UgaW4gY29tcHJlc3Npb24KKwkJICogYWxnb3JpdGhtcy4KKwkJICogaXQgaXMgYSBnb29kIHN0cmF0ZWd5IGJlY2F1c2UgaXQgbWF5IGRpc3J1cHQgY2FjaGUKKwkJICogcG9saWN5IHRvIGtlZXAgdGhlIHBhZ2VzIGluIG1lbW9yeSBhZnRlcndhcmRzLgorCQkgKi8KKwkJb2Zmc2V0ID0geG9mZiA8PCBKRlNfU0JJKGlwLT5pX3NiKS0+bDJic2l6ZTsKKwkJYXNzZXJ0KChvZmZzZXQgJiBDTV9PRkZTRVQpID09IDApOworCQluYnl0ZXMgPSB4bGVuIDw8IEpGU19TQkkoaXAtPmlfc2IpLT5sMmJzaXplOworCQlwbm8gPSBvZmZzZXQgPj4gQ01fTDJCU0laRTsKKwkJbnBhZ2VzID0gKG5ieXRlcyArIChDTV9CU0laRSAtIDEpKSA+PiBDTV9MMkJTSVpFOworLyoKKyAgICAgICAgICAgICAgICBucGFnZXMgPSAoKG9mZnNldCArIG5ieXRlcyAtIDEpID4+IENNX0wyQlNJWkUpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAob2Zmc2V0ID4+IENNX0wyQlNJWkUpICsgMTsKKyovCisJCXN4YWRkciA9IG94YWRkcjsKKwkJZHhhZGRyID0gbnhhZGRyOworCisJCS8qIHByb2Nlc3MgdGhlIHJlcXVlc3Qgb25lIGNhY2hlIGJ1ZmZlciBhdCBhIHRpbWUgKi8KKwkJZm9yIChuYnJkID0gMDsgbmJyZCA8IG5ieXRlczsgbmJyZCArPSBuYiwKKwkJICAgICBvZmZzZXQgKz0gbmIsIHBubysrLCBucGFnZXMtLSkgeworCQkJLyogY29tcHV0ZSBwYWdlIHNpemUgKi8KKwkJCW5iID0gbWluKG5ieXRlcyAtIG5icmQsIENNX0JTSVpFKTsKKworCQkJLyogZ2V0IHRoZSBjYWNoZSBidWZmZXIgb2YgdGhlIHBhZ2UgKi8KKwkJCWlmIChyYyA9IGNtUmVhZChpcCwgb2Zmc2V0LCBucGFnZXMsICZjcCkpCisJCQkJYnJlYWs7CisKKwkJCWFzc2VydChhZGRyZXNzUFhEKCZjcC0+Y21fcHhkKSA9PSBzeGFkZHIpOworCQkJYXNzZXJ0KCFjcC0+Y21fbW9kaWZpZWQpOworCisJCQkvKiBiaW5kIGJ1ZmZlciB3aXRoIHRoZSBuZXcgZXh0ZW50IGFkZHJlc3MgKi8KKwkJCW5ibGtzID0gbmIgPj4gSkZTX0lQKGlwLT5pX3NiKS0+bDJic2l6ZTsKKwkJCWNtU2V0WEQoaXAsIGNwLCBwbm8sIGR4YWRkciwgbmJsa3MpOworCisJCQkvKiByZWxlYXNlIHRoZSBjYnVmLCBtYXJrIGl0IGFzIG1vZGlmaWVkICovCisJCQljbVB1dChjcCwgVFJVRSk7CisKKwkJCWR4YWRkciArPSBuYmxrczsKKwkJCXN4YWRkciArPSBuYmxrczsKKwkJfQorCisJCS8qIGdldCBiYWNrIHBhcmVudCBwYWdlICovCisJCWlmICgocmMgPSB4dFNlYXJjaChpcCwgeG9mZiwgJmNtcCwgJmJ0c3RhY2ssIDApKSkKKwkJCXJldHVybiByYzsKKworCQlYVF9HRVRTRUFSQ0goaXAsIGJ0c3RhY2sudG9wLCBibiwgcG1wLCBwcCwgaW5kZXgpOworCQlqZnNfaW5mbygieHRSZWxvY2F0ZTogdGFyZ2V0IGRhdGEgZXh0ZW50IHJlbG9jYXRlZC4iKTsKKwl9IGVsc2UgewkJLyogKHh0eXBlICA9PSBYVFBBR0UpICovCisKKwkJLyoKKwkJICogcmVhZCBpbiB0aGUgdGFyZ2V0IHh0cGFnZSBmcm9tIHRoZSBzb3VyY2UgZXh0ZW50OworCQkgKi8KKwkJWFRfR0VUUEFHRShpcCwgb3hhZGRyLCBtcCwgUFNJWkUsIHAsIHJjKTsKKwkJaWYgKHJjKSB7CisJCQlYVF9QVVRQQUdFKHBtcCk7CisJCQlyZXR1cm4gcmM7CisJCX0KKworCQkvKgorCQkgKiByZWFkIGluIHNpYmxpbmcgcGFnZXMgaWYgYW55IHRvIHVwZGF0ZSBzaWJsaW5nIHBvaW50ZXJzOworCQkgKi8KKwkJcm1wID0gTlVMTDsKKwkJaWYgKHAtPmhlYWRlci5uZXh0KSB7CisJCQluZXh0Ym4gPSBsZTY0X3RvX2NwdShwLT5oZWFkZXIubmV4dCk7CisJCQlYVF9HRVRQQUdFKGlwLCBuZXh0Ym4sIHJtcCwgUFNJWkUsIHJwLCByYyk7CisJCQlpZiAocmMpIHsKKwkJCQlYVF9QVVRQQUdFKHBtcCk7CisJCQkJWFRfUFVUUEFHRShtcCk7CisJCQkJcmV0dXJuIChyYyk7CisJCQl9CisJCX0KKworCQlsbXAgPSBOVUxMOworCQlpZiAocC0+aGVhZGVyLnByZXYpIHsKKwkJCXByZXZibiA9IGxlNjRfdG9fY3B1KHAtPmhlYWRlci5wcmV2KTsKKwkJCVhUX0dFVFBBR0UoaXAsIHByZXZibiwgbG1wLCBQU0laRSwgbHAsIHJjKTsKKwkJCWlmIChyYykgeworCQkJCVhUX1BVVFBBR0UocG1wKTsKKwkJCQlYVF9QVVRQQUdFKG1wKTsKKwkJCQlpZiAocm1wKQorCQkJCQlYVF9QVVRQQUdFKHJtcCk7CisJCQkJcmV0dXJuIChyYyk7CisJCQl9CisJCX0KKworCQkvKiBhdCB0aGlzIHBvaW50LCBhbGwgeHRwYWdlcyB0byBiZSB1cGRhdGVkIGFyZSBpbiBtZW1vcnkgKi8KKworCQkvKgorCQkgKiB1cGRhdGUgc2libGluZyBwb2ludGVycyBvZiBzaWJsaW5nIHh0cGFnZXMgaWYgYW55OworCQkgKi8KKwkJaWYgKGxtcCkgeworCQkJQlRfTUFSS19ESVJUWShsbXAsIGlwKTsKKwkJCXRsY2sgPQorCQkJICAgIHR4TG9jayh0aWQsIGlwLCBsbXAsIHRsY2tYVFJFRSB8IHRsY2tSRUxJTkspOworCQkJbHAtPmhlYWRlci5uZXh0ID0gY3B1X3RvX2xlNjQobnhhZGRyKTsKKwkJCVhUX1BVVFBBR0UobG1wKTsKKwkJfQorCisJCWlmIChybXApIHsKKwkJCUJUX01BUktfRElSVFkocm1wLCBpcCk7CisJCQl0bGNrID0KKwkJCSAgICB0eExvY2sodGlkLCBpcCwgcm1wLCB0bGNrWFRSRUUgfCB0bGNrUkVMSU5LKTsKKwkJCXJwLT5oZWFkZXIucHJldiA9IGNwdV90b19sZTY0KG54YWRkcik7CisJCQlYVF9QVVRQQUdFKHJtcCk7CisJCX0KKworCQkvKgorCQkgKiB1cGRhdGUgdGhlIHRhcmdldCB4dHBhZ2UgdG8gYmUgcmVsb2NhdGVkCisJCSAqCisJCSAqIHVwZGF0ZSB0aGUgc2VsZiBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgcGFnZQorCQkgKiBhbmQgd3JpdGUgdG8gZGVzdGluYXRpb24gZXh0ZW50OworCQkgKiByZWRvIGltYWdlIGNvdmVycyB0aGUgd2hvbGUgeHRwYWdlIHNpbmNlIGl0IGlzIG5ldyBwYWdlCisJCSAqIHRvIHRoZSBkZXN0aW5hdGlvbiBleHRlbnQ7CisJCSAqIHVwZGF0ZSBvZiBibWFwIGZvciB0aGUgZnJlZSBvZiBzb3VyY2UgZXh0ZW50CisJCSAqIG9mIHRoZSB0YXJnZXQgeHRwYWdlIGl0c2VsZjoKKwkJICogdXBkYXRlIG9mIGJtYXAgZm9yIHRoZSBhbGxvY2F0aW9uIG9mIGRlc3RpbmF0aW9uIGV4dGVudAorCQkgKiBvZiB0aGUgdGFyZ2V0IHh0cGFnZSBpdHNlbGY6CisJCSAqIHVwZGF0ZSBvZiBibWFwIGZvciB0aGUgZXh0ZW50cyBjb3ZlcmVkIGJ5IHhhZCBlbnRyaWVzIGluCisJCSAqIHRoZSB0YXJnZXQgeHRwYWdlIGlzIG5vdCBuZWNlc3Nhcnkgc2luY2UgdGhleSBhcmUgbm90CisJCSAqIHVwZGF0ZWQ7CisJCSAqIGlmIG5vdCBjb21taXR0ZWQgYmVmb3JlIHRoaXMgcmVsb2NhdGlvbiwKKwkJICogdGFyZ2V0IHBhZ2UgbWF5IGNvbnRhaW4gWEFEX05FVyBlbnRyaWVzIHdoaWNoIG11c3QKKwkJICogYmUgc2Nhbm5lZCBmb3IgYm1hcCB1cGRhdGUgKGxvZ3JlZG8oKSBhbHdheXMKKwkJICogc2NhbiB4dHBhZ2UgUkVET1BBR0UgaW1hZ2UgZm9yIGJtYXAgdXBkYXRlKTsKKwkJICogaWYgY29tbWl0dGVkIGJlZm9yZSB0aGlzIHJlbG9jYXRpb24gKHRsY2tSRUxPQ0FURSksCisJCSAqIHNjYW4gbWF5IGJlIHNraXBwZWQgYnkgY29tbWl0KCkgYW5kIGxvZ3JlZG8oKTsKKwkJICovCisJCUJUX01BUktfRElSVFkobXAsIGlwKTsKKwkJLyogdGxja05FVyBpbml0ICB4dGxjay0+bHdtLm9mZnNldCA9IFhURU5UUllTVEFSVDsgKi8KKwkJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBtcCwgdGxja1hUUkVFIHwgdGxja05FVyk7CisJCXh0bGNrID0gKHN0cnVjdCB4dGxvY2sgKikgJiB0bGNrLT5sb2NrOworCisJCS8qIHVwZGF0ZSB0aGUgc2VsZiBhZGRyZXNzIGluIHRoZSB4dHBhZ2UgaGVhZGVyICovCisJCXB4ZCA9ICZwLT5oZWFkZXIuc2VsZjsKKwkJUFhEYWRkcmVzcyhweGQsIG54YWRkcik7CisKKwkJLyogbGluZWxvY2sgZm9yIHRoZSBhZnRlciBpbWFnZSBvZiB0aGUgd2hvbGUgcGFnZSAqLworCQl4dGxjay0+bHdtLmxlbmd0aCA9CisJCSAgICBsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KSAtIHh0bGNrLT5sd20ub2Zmc2V0OworCisJCS8qIHVwZGF0ZSB0aGUgYnVmZmVyIGV4dGVudCBkZXNjcmlwdG9yIG9mIHRhcmdldCB4dHBhZ2UgKi8KKwkJeHNpemUgPSB4bGVuIDw8IEpGU19TQkkoaXAtPmlfc2IpLT5sMmJzaXplOworCQlibVNldFhEKG1wLCBueGFkZHIsIHhzaXplKTsKKworCQkvKiB1bnBpbiB0aGUgdGFyZ2V0IHBhZ2UgdG8gbmV3IGhvbWV3YXJkIGJvdW5kICovCisJCVhUX1BVVFBBR0UobXApOworCQlqZnNfaW5mbygieHRSZWxvY2F0ZTogdGFyZ2V0IHh0cGFnZSByZWxvY2F0ZWQuIik7CisJfQorCisJLyoKKwkgKiAgICAgIDMuIGFjcXVpcmUgbWFwbG9jayBmb3IgdGhlIHNvdXJjZSBleHRlbnQgdG8gYmUgZnJlZWQ7CisJICoKKwkgKiBhY3F1aXJlIGEgbWFwbG9jayBzYXZpbmcgdGhlIHNyYyByZWxvY2F0ZWQgZXh0ZW50IGFkZHJlc3M7CisJICogdG8gZnJlZSBvZiB0aGUgZXh0ZW50IGF0IGNvbW1pdCB0aW1lOworCSAqLworICAgICAgb3V0OgorCS8qIGlmIERBVEFFWFQgcmVsb2NhdGlvbiwgd3JpdGUgYSBMT0dfVVBEQVRFTUFQIHJlY29yZCBmb3IKKwkgKiBmcmVlIFBYRCBvZiB0aGUgc291cmNlIGRhdGEgZXh0ZW50IChsb2dyZWRvKCkgd2lsbCB1cGRhdGUKKwkgKiBibWFwIGZvciBmcmVlIG9mIHNvdXJjZSBkYXRhIGV4dGVudCksIGFuZCB1cGRhdGUgYm1hcCBmb3IKKwkgKiBmcmVlIG9mIHRoZSBzb3VyY2UgZGF0YSBleHRlbnQ7CisJICovCisJaWYgKHh0eXBlID09IERBVEFFWFQpCisJCXRsY2sgPSB0eE1hcGxvY2sodGlkLCBpcCwgdGxja01BUCk7CisJLyogaWYgWFRQQUdFIHJlbG9jYXRpb24sIHdyaXRlIGEgTE9HX05PUkVET1BBR0UgcmVjb3JkCisJICogZm9yIHRoZSBzb3VyY2UgeHRwYWdlIChsb2dyZWRvKCkgd2lsbCBpbml0IE5vUmVkb1BhZ2UKKwkgKiBmaWx0ZXIgYW5kIHdpbGwgYWxzbyB1cGRhdGUgYm1hcCBmb3IgZnJlZSBvZiB0aGUgc291cmNlCisJICogeHRwYWdlKSwgYW5kIHVwZGF0ZSBibWFwIGZvciBmcmVlIG9mIHRoZSBzb3VyY2UgeHRwYWdlOworCSAqIE4uQi4gV2UgdXNlIHRsY2tNQVAgaW5zdGVhZCBvZiB0bGtjWFRSRUUgYmVjYXVzZSB0aGVyZQorCSAqICAgICAgaXMgbm8gYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGxvY2sgc2luY2UgdGhlIGJ1ZmZlcgorCSAqICAgICAgaGFzIGJlZW4gcmVkaXJlY3RlZCB0byB0aGUgdGFyZ2V0IGxvY2F0aW9uLgorCSAqLworCWVsc2UJCQkvKiAoeHR5cGUgID09IFhUUEFHRSkgKi8KKwkJdGxjayA9IHR4TWFwbG9jayh0aWQsIGlwLCB0bGNrTUFQIHwgdGxja1JFTE9DQVRFKTsKKworCXB4ZGxvY2sgPSAoc3RydWN0IHB4ZF9sb2NrICopICYgdGxjay0+bG9jazsKKwlweGRsb2NrLT5mbGFnID0gbWxja0ZSRUVQWEQ7CisJUFhEYWRkcmVzcygmcHhkbG9jay0+cHhkLCBveGFkZHIpOworCVBYRGxlbmd0aCgmcHhkbG9jay0+cHhkLCB4bGVuKTsKKwlweGRsb2NrLT5pbmRleCA9IDE7CisKKwkvKgorCSAqICAgICAgNC4gdXBkYXRlIHRoZSBwYXJlbnQgeGFkIGVudHJ5IGZvciByZWxvY2F0aW9uOworCSAqCisJICogYWNxdWlyZSB0bGNrIGZvciB0aGUgcGFyZW50IGVudHJ5IHdpdGggWEFEX05FVyBhcyBlbnRyeQorCSAqIHVwZGF0ZSB3aGljaCB3aWxsIHdyaXRlIExPR19SRURPUEFHRSBhbmQgdXBkYXRlIGJtYXAgZm9yCisJICogYWxsb2NhdGlvbiBvZiBYQURfTkVXIGRlc3RpbmF0aW9uIGV4dGVudDsKKwkgKi8KKwlqZnNfaW5mbygieHRSZWxvY2F0ZTogdXBkYXRlIHBhcmVudCB4YWQgZW50cnkuIik7CisJQlRfTUFSS19ESVJUWShwbXAsIGlwKTsKKwl0bGNrID0gdHhMb2NrKHRpZCwgaXAsIHBtcCwgdGxja1hUUkVFIHwgdGxja0dST1cpOworCXh0bGNrID0gKHN0cnVjdCB4dGxvY2sgKikgJiB0bGNrLT5sb2NrOworCisJLyogdXBkYXRlIHRoZSBYQUQgd2l0aCB0aGUgbmV3IGRlc3RpbmF0aW9uIGV4dGVudDsgKi8KKwl4YWQgPSAmcHAtPnhhZFtpbmRleF07CisJeGFkLT5mbGFnIHw9IFhBRF9ORVc7CisJWEFEYWRkcmVzcyh4YWQsIG54YWRkcik7CisKKwl4dGxjay0+bHdtLm9mZnNldCA9IG1pbihpbmRleCwgeHRsY2stPmx3bS5vZmZzZXQpOworCXh0bGNrLT5sd20ubGVuZ3RoID0gbGUxNl90b19jcHUocHAtPmhlYWRlci5uZXh0aW5kZXgpIC0KKwkgICAgeHRsY2stPmx3bS5vZmZzZXQ7CisKKwkvKiB1bnBpbiB0aGUgcGFyZW50IHh0cGFnZSAqLworCVhUX1BVVFBBR0UocG1wKTsKKworCXJldHVybiByYzsKK30KKworCisvKgorICogICAgICB4dFNlYXJjaE5vZGUoKQorICoKKyAqIGZ1bmN0aW9uOiAgICBzZWFyY2ggZm9yIHRoZSBpbnRlcm5hbCB4YWQgZW50cnkgY292ZXJpbmcgc3BlY2lmaWVkIGV4dGVudC4KKyAqICAgICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIG1haW5seSB1c2VkIGJ5IGRlZnJhZ2ZzIHV0aWxpdHkuCisgKgorICogcGFyYW1ldGVyczoKKyAqICAgICAgaXAgICAgICAtIGZpbGUgb2JqZWN0OworICogICAgICB4YWQgICAgIC0gZXh0ZW50IHRvIGZpbmQ7CisgKiAgICAgIGNtcHAgICAgLSBjb21wYXJpc29uIHJlc3VsdDoKKyAqICAgICAgYnRzdGFjayAtIHRyYXZlcnNlIHN0YWNrOworICogICAgICBmbGFnICAgIC0gc2VhcmNoIHByb2Nlc3MgZmxhZzsKKyAqCisgKiByZXR1cm5zOgorICogICAgICBidHN0YWNrIGNvbnRhaW5zIChibiwgaW5kZXgpIG9mIHNlYXJjaCBwYXRoIHRyYXZlcnNlZCB0byB0aGUgZW50cnkuCisgKiAgICAgICpjbXBwIGlzIHNldCB0byByZXN1bHQgb2YgY29tcGFyaXNvbiB3aXRoIHRoZSBlbnRyeSByZXR1cm5lZC4KKyAqICAgICAgdGhlIHBhZ2UgY29udGFpbmluZyB0aGUgZW50cnkgaXMgcGlubmVkIGF0IGV4aXQuCisgKi8KK3N0YXRpYyBpbnQgeHRTZWFyY2hOb2RlKHN0cnVjdCBpbm9kZSAqaXAsIHhhZF90ICogeGFkLAkvKiByZXF1aXJlZCBYQUQgZW50cnkgKi8KKwkJCWludCAqY21wcCwgc3RydWN0IGJ0c3RhY2sgKiBidHN0YWNrLCBpbnQgZmxhZykKK3sKKwlpbnQgcmMgPSAwOworCXM2NCB4b2ZmLCB4YWRkcjsKKwlpbnQgeGxlbjsKKwlpbnQgY21wID0gMTsJCS8qIGluaXQgZm9yIGVtcHR5IHBhZ2UgKi8KKwlzNjQgYm47CQkJLyogYmxvY2sgbnVtYmVyICovCisJc3RydWN0IG1ldGFwYWdlICptcDsJLyogbWV0YS1wYWdlIGJ1ZmZlciAqLworCXh0cGFnZV90ICpwOwkJLyogcGFnZSAqLworCWludCBiYXNlLCBpbmRleCwgbGltOworCXN0cnVjdCBidGZyYW1lICpidHNwOworCXM2NCB0NjQ7CisKKwlCVF9DTFIoYnRzdGFjayk7CisKKwl4b2ZmID0gb2Zmc2V0WEFEKHhhZCk7CisJeGxlbiA9IGxlbmd0aFhBRCh4YWQpOworCXhhZGRyID0gYWRkcmVzc1hBRCh4YWQpOworCisJLyoKKwkgKiAgICAgIHNlYXJjaCBkb3duIHRyZWUgZnJvbSByb290OgorCSAqCisJICogYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgZW50cmllcyBvZiA8S2ksIFBpPiBhbmQgPEtqLCBQaj4gb2YKKwkgKiBpbnRlcm5hbCBwYWdlLCBjaGlsZCBwYWdlIFBpIGNvbnRhaW5zIGVudHJ5IHdpdGggaywgS2kgPD0gSyA8IEtqLgorCSAqCisJICogaWYgZW50cnkgd2l0aCBzZWFyY2gga2V5IEsgaXMgbm90IGZvdW5kCisJICogaW50ZXJuYWwgcGFnZSBzZWFyY2ggZmluZCB0aGUgZW50cnkgd2l0aCBsYXJnZXN0IGtleSBLaQorCSAqIGxlc3MgdGhhbiBLIHdoaWNoIHBvaW50IHRvIHRoZSBjaGlsZCBwYWdlIHRvIHNlYXJjaDsKKwkgKiBsZWFmIHBhZ2Ugc2VhcmNoIGZpbmQgdGhlIGVudHJ5IHdpdGggc21hbGxlc3Qga2V5IEtqCisJICogZ3JlYXRlciB0aGFuIEsgc28gdGhhdCB0aGUgcmV0dXJuZWQgaW5kZXggaXMgdGhlIHBvc2l0aW9uIG9mCisJICogdGhlIGVudHJ5IHRvIGJlIHNoaWZ0ZWQgcmlnaHQgZm9yIGluc2VydGlvbiBvZiBuZXcgZW50cnkuCisJICogZm9yIGVtcHR5IHRyZWUsIHNlYXJjaCBrZXkgaXMgZ3JlYXRlciB0aGFuIGFueSBrZXkgb2YgdGhlIHRyZWUuCisJICoKKwkgKiBieSBjb252ZW50aW9uLCByb290IGJuID0gMC4KKwkgKi8KKwlmb3IgKGJuID0gMDs7KSB7CisJCS8qIGdldC9waW4gdGhlIHBhZ2UgdG8gc2VhcmNoICovCisJCVhUX0dFVFBBR0UoaXAsIGJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCQlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9MRUFGKSB7CisJCQlYVF9QVVRQQUdFKG1wKTsKKwkJCXJldHVybiAtRVNUQUxFOworCQl9CisKKwkJbGltID0gbGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCkgLSBYVEVOVFJZU1RBUlQ7CisKKwkJLyoKKwkJICogYmluYXJ5IHNlYXJjaCB3aXRoIHNlYXJjaCBrZXkgSyBvbiB0aGUgY3VycmVudCBwYWdlCisJCSAqLworCQlmb3IgKGJhc2UgPSBYVEVOVFJZU1RBUlQ7IGxpbTsgbGltID4+PSAxKSB7CisJCQlpbmRleCA9IGJhc2UgKyAobGltID4+IDEpOworCisJCQlYVF9DTVAoY21wLCB4b2ZmLCAmcC0+eGFkW2luZGV4XSwgdDY0KTsKKwkJCWlmIChjbXAgPT0gMCkgeworCQkJCS8qCisJCQkJICogICAgICBzZWFyY2ggaGl0CisJCQkJICoKKwkJCQkgKiB2ZXJpZnkgZm9yIGV4YWN0IG1hdGNoOworCQkJCSAqLworCQkJCWlmICh4YWRkciA9PSBhZGRyZXNzWEFEKCZwLT54YWRbaW5kZXhdKSAmJgorCQkJCSAgICB4b2ZmID09IG9mZnNldFhBRCgmcC0+eGFkW2luZGV4XSkpIHsKKwkJCQkJKmNtcHAgPSBjbXA7CisKKwkJCQkJLyogc2F2ZSBzZWFyY2ggcmVzdWx0ICovCisJCQkJCWJ0c3AgPSBidHN0YWNrLT50b3A7CisJCQkJCWJ0c3AtPmJuID0gYm47CisJCQkJCWJ0c3AtPmluZGV4ID0gaW5kZXg7CisJCQkJCWJ0c3AtPm1wID0gbXA7CisKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCisJCQkJLyogZGVzY2VuZC9zZWFyY2ggaXRzIGNoaWxkIHBhZ2UgKi8KKwkJCQlnb3RvIG5leHQ7CisJCQl9CisKKwkJCWlmIChjbXAgPiAwKSB7CisJCQkJYmFzZSA9IGluZGV4ICsgMTsKKwkJCQktLWxpbTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqICAgICAgc2VhcmNoIG1pc3MgLSBub24tbGVhZiBwYWdlOgorCQkgKgorCQkgKiBiYXNlIGlzIHRoZSBzbWFsbGVzdCBpbmRleCB3aXRoIGtleSAoS2opIGdyZWF0ZXIgdGhhbgorCQkgKiBzZWFyY2gga2V5IChLKSBhbmQgbWF5IGJlIHplcm8gb3IgbWF4ZW50cnkgaW5kZXguCisJCSAqIGlmIGJhc2UgaXMgbm9uLXplcm8sIGRlY3JlbWVudCBiYXNlIGJ5IG9uZSB0byBnZXQgdGhlIHBhcmVudAorCQkgKiBlbnRyeSBvZiB0aGUgY2hpbGQgcGFnZSB0byBzZWFyY2guCisJCSAqLworCQlpbmRleCA9IGJhc2UgPyBiYXNlIC0gMSA6IGJhc2U7CisKKwkJLyoKKwkJICogZ28gZG93biB0byBjaGlsZCBwYWdlCisJCSAqLworCSAgICAgIG5leHQ6CisJCS8qIGdldCB0aGUgY2hpbGQgcGFnZSBibG9jayBudW1iZXIgKi8KKwkJYm4gPSBhZGRyZXNzWEFEKCZwLT54YWRbaW5kZXhdKTsKKworCQkvKiB1bnBpbiB0aGUgcGFyZW50IHBhZ2UgKi8KKwkJWFRfUFVUUEFHRShtcCk7CisJfQorfQorCisKKy8qCisgKiAgICAgIHh0UmVsaW5rKCkKKyAqCisgKiBmdW5jdGlvbjoKKyAqICAgICAgbGluayBhcm91bmQgYSBmcmVlZCBwYWdlLgorICoKKyAqIFBhcmFtZXRlcjoKKyAqICAgICAgaW50ICAgICAgICAgICB0aWQsCisgKiAgICAgIHN0cnVjdCBpbm9kZSAgICAqaXAsCisgKiAgICAgIHh0cGFnZV90ICAgICAgICAqcCkKKyAqCisgKiByZXR1cm5zOgorICovCitzdGF0aWMgaW50IHh0UmVsaW5rKHRpZF90IHRpZCwgc3RydWN0IGlub2RlICppcCwgeHRwYWdlX3QgKiBwKQoreworCWludCByYyA9IDA7CisJc3RydWN0IG1ldGFwYWdlICptcDsKKwlzNjQgbmV4dGJuLCBwcmV2Ym47CisJc3RydWN0IHRsb2NrICp0bGNrOworCisJbmV4dGJuID0gbGU2NF90b19jcHUocC0+aGVhZGVyLm5leHQpOworCXByZXZibiA9IGxlNjRfdG9fY3B1KHAtPmhlYWRlci5wcmV2KTsKKworCS8qIHVwZGF0ZSBwcmV2IHBvaW50ZXIgb2YgdGhlIG5leHQgcGFnZSAqLworCWlmIChuZXh0Ym4gIT0gMCkgeworCQlYVF9HRVRQQUdFKGlwLCBuZXh0Ym4sIG1wLCBQU0laRSwgcCwgcmMpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJLyoKKwkJICogYWNxdWlyZSBhIHRyYW5zYWN0aW9uIGxvY2sgb24gdGhlIHBhZ2U7CisJCSAqCisJCSAqIGFjdGlvbjogdXBkYXRlIHByZXYgcG9pbnRlcjsKKwkJICovCisJCUJUX01BUktfRElSVFkobXAsIGlwKTsKKwkJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBtcCwgdGxja1hUUkVFIHwgdGxja1JFTElOSyk7CisKKwkJLyogdGhlIHBhZ2UgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIHRsb2NrJ2QgKi8KKworCQlwLT5oZWFkZXIucHJldiA9IGNwdV90b19sZTY0KHByZXZibik7CisKKwkJWFRfUFVUUEFHRShtcCk7CisJfQorCisJLyogdXBkYXRlIG5leHQgcG9pbnRlciBvZiB0aGUgcHJldmlvdXMgcGFnZSAqLworCWlmIChwcmV2Ym4gIT0gMCkgeworCQlYVF9HRVRQQUdFKGlwLCBwcmV2Ym4sIG1wLCBQU0laRSwgcCwgcmMpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisKKwkJLyoKKwkJICogYWNxdWlyZSBhIHRyYW5zYWN0aW9uIGxvY2sgb24gdGhlIHBhZ2U7CisJCSAqCisJCSAqIGFjdGlvbjogdXBkYXRlIG5leHQgcG9pbnRlcjsKKwkJICovCisJCUJUX01BUktfRElSVFkobXAsIGlwKTsKKwkJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBtcCwgdGxja1hUUkVFIHwgdGxja1JFTElOSyk7CisKKwkJLyogdGhlIHBhZ2UgbWF5IGFscmVhZHkgaGF2ZSBiZWVuIHRsb2NrJ2QgKi8KKworCQlwLT5oZWFkZXIubmV4dCA9IGxlNjRfdG9fY3B1KG5leHRibik7CisKKwkJWFRfUFVUUEFHRShtcCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYJCQkJLyogIF9TVElMTF9UT19QT1JUICovCisKKworLyoKKyAqICAgICAgeHRJbml0Um9vdCgpCisgKgorICogaW5pdGlhbGl6ZSBmaWxlIHJvb3QgKGlubGluZSBpbiBpbm9kZSkKKyAqLwordm9pZCB4dEluaXRSb290KHRpZF90IHRpZCwgc3RydWN0IGlub2RlICppcCkKK3sKKwl4dHBhZ2VfdCAqcDsKKworCS8qCisJICogYWNxdWlyZSBhIHRyYW5zYWN0aW9uIGxvY2sgb24gdGhlIHJvb3QKKwkgKgorCSAqIGFjdGlvbjoKKwkgKi8KKwl0eExvY2sodGlkLCBpcCwgKHN0cnVjdCBtZXRhcGFnZSAqKSAmSkZTX0lQKGlwKS0+YnhmbGFnLAorCQkgICAgICB0bGNrWFRSRUUgfCB0bGNrTkVXKTsKKwlwID0gJkpGU19JUChpcCktPmlfeHRyb290OworCisJcC0+aGVhZGVyLmZsYWcgPSBEWERfSU5ERVggfCBCVF9ST09UIHwgQlRfTEVBRjsKKwlwLT5oZWFkZXIubmV4dGluZGV4ID0gY3B1X3RvX2xlMTYoWFRFTlRSWVNUQVJUKTsKKworCWlmIChTX0lTRElSKGlwLT5pX21vZGUpKQorCQlwLT5oZWFkZXIubWF4ZW50cnkgPSBjcHVfdG9fbGUxNihYVFJPT1RJTklUU0xPVF9ESVIpOworCWVsc2UgeworCQlwLT5oZWFkZXIubWF4ZW50cnkgPSBjcHVfdG9fbGUxNihYVFJPT1RJTklUU0xPVCk7CisJCWlwLT5pX3NpemUgPSAwOworCX0KKworCisJcmV0dXJuOworfQorCisKKy8qCisgKiBXZSBjYW4gcnVuIGludG8gYSBkZWFkbG9jayB0cnVuY2F0aW5nIGEgZmlsZSB3aXRoIGEgbGFyZ2UgbnVtYmVyIG9mCisgKiB4dHJlZSBwYWdlcyAobGFyZ2UgZnJhZ21lbnRlZCBmaWxlKS4gIEEgcm9idXN0IGZpeCB3b3VsZCBlbnRhaWwgYQorICogcmVzZXJ2YXRpb24gc3lzdGVtIHdoZXJlIHdlIHdvdWxkIHJlc2VydmUgYSBudW1iZXIgb2YgbWV0YWRhdGEgcGFnZXMKKyAqIGFuZCB0bG9ja3Mgd2hpY2ggd2Ugd291bGQgYmUgZ3VhcmFudGVlZCB3aXRob3V0IGEgZGVhZGxvY2suICBXaXRob3V0CisgKiB0aGlzLCBhIHBhcnRpYWwgZml4IGlzIHRvIGxpbWl0IG51bWJlciBvZiBtZXRhZGF0YSBwYWdlcyB3ZSB3aWxsIGxvY2sKKyAqIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uLiAgQ3VycmVudGx5IHdlIHdpbGwgdHJ1bmNhdGUgdGhlIGZpbGUgc28gdGhhdAorICogbm8gbW9yZSB0aGFuIDUwIGxlYWYgcGFnZXMgd2lsbCBiZSBsb2NrZWQuICBUaGUgY2FsbGVyIG9mIHh0VHJ1bmNhdGUKKyAqIHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gZ2V0cworICogY29tbWl0dGVkLCBhbmQgdGhhdCBzdWJzZXF1ZW50IHRyYW5zYWN0aW9ucyBhcmUgY3JlYXRlZCB0byB0cnVuY2F0ZQorICogdGhlIGZpbGUgZnVydGhlciBpZiBuZWVkZWQuCisgKi8KKyNkZWZpbmUgTUFYX1RSVU5DQVRFX0xFQVZFUyA1MAorCisvKgorICogICAgICB4dFRydW5jYXRlKCkKKyAqCisgKiBmdW5jdGlvbjoKKyAqICAgICAgdHJhdmVyc2UgZm9yIHRydW5jYXRpb24gbG9nZ2luZyBiYWNrd2FyZCBib3R0b20gdXA7CisgKiAgICAgIHRlcm1pbmF0ZSBhdCB0aGUgbGFzdCBleHRlbnQgZW50cnkgYXQgdGhlIGN1cnJlbnQgc3VidHJlZQorICogICAgICByb290IHBhZ2UgY292ZXJpbmcgbmV3IGRvd24gc2l6ZS4KKyAqICAgICAgdHJ1bmNhdGlvbiBtYXkgb2NjdXIgd2l0aGluIHRoZSBsYXN0IGV4dGVudCBlbnRyeS4KKyAqCisgKiBwYXJhbWV0ZXI6CisgKiAgICAgIGludCAgICAgICAgICAgdGlkLAorICogICAgICBzdHJ1Y3QgaW5vZGUgICAgKmlwLAorICogICAgICBzNjQgICAgICAgICAgIG5ld3NpemUsCisgKiAgICAgIGludCAgICAgICAgICAgdHlwZSkgICB7UFdNQVAsIFBNQVAsIFdNQVA7IERFTEVURSwgVFJVTkNBVEV9CisgKgorICogcmV0dXJuOgorICoKKyAqIG5vdGU6CisgKiAgICAgIFBXTUFQOgorICogICAgICAgMS4gdHJ1bmNhdGUgKG5vbi1DT01NSVRfTk9MSU5LIGZpbGUpCisgKiAgICAgICAgICBieSBqZnNfdHJ1bmNhdGUoKSBvciBqZnNfb3BlbihPX1RSVU5DKToKKyAqICAgICAgICAgIHh0cmVlIGlzIHVwZGF0ZWQ7CisgKgkgMi4gdHJ1bmNhdGUgaW5kZXggdGFibGUgb2YgZGlyZWN0b3J5IHdoZW4gbGFzdCBlbnRyeSByZW1vdmVkCisgKiAgICAgICBtYXAgdXBkYXRlIHZpYSB0bG9jayBhdCBjb21taXQgdGltZTsKKyAqICAgICAgUE1BUDoKKyAqCSBDYWxsIHh0VHJ1bmNhdGVfcG1hcCBpbnN0ZWFkCisgKiAgICAgIFdNQVA6CisgKiAgICAgICAxLiByZW1vdmUgKGZyZWUgemVybyBsaW5rIGNvdW50KSBvbiBsYXN0IHJlZmVyZW5jZSByZWxlYXNlCisgKiAgICAgICAgICAocG1hcCBoYXMgYmVlbiBmcmVlZCBhdCBjb21taXQgemVybyBsaW5rIGNvdW50KTsKKyAqICAgICAgIDIuIHRydW5jYXRlIChDT01NSVRfTk9MSU5LIGZpbGUsIGkuZS4sIHRtcCBmaWxlKToKKyAqICAgICAgICAgIHh0cmVlIGlzIHVwZGF0ZWQ7CisgKiAgICAgICBtYXAgdXBkYXRlIGRpcmVjdGx5IGF0IHRydW5jYXRpb24gdGltZTsKKyAqCisgKiAgICAgIGlmIChERUxFVEUpCisgKiAgICAgICAgICAgICAgbm8gTE9HX05PUkVET1BBR0UgaXMgcmVxdWlyZWQgKE5PUkVET0ZJTEUgaXMgc3VmZmljaWVudCk7CisgKiAgICAgIGVsc2UgaWYgKFRSVU5DQVRFKQorICogICAgICAgICAgICAgIG11c3Qgd3JpdGUgTE9HX05PUkVET1BBR0UgZm9yIGRlbGV0ZWQgaW5kZXggcGFnZTsKKyAqCisgKiBwYWdlcyBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gdGxvY2tlZCBieSBhbm9ueW1vdXMgdHJhbnNhY3Rpb25zCisgKiBkdXJpbmcgZmlsZSBncm93dGggKGkuZS4sIHdyaXRlKSBiZWZvcmUgdHJ1bmNhdGlvbjsKKyAqCisgKiBleGNlcHQgbGFzdCB0cnVuY2F0ZWQgZW50cnksIGRlbGV0ZWQgZW50cmllcyByZW1haW5zIGFzIGlzCisgKiBpbiB0aGUgcGFnZSAobmV4dGluZGV4IGlzIHVwZGF0ZWQpIGZvciBvdGhlciB1c2UKKyAqIChlLmcuLCBsb2cvdXBkYXRlIGFsbG9jYXRpb24gbWFwKTogdGhpcyBhdm9pZCBjb3B5aW5nIHRoZSBwYWdlCisgKiBpbmZvIGJ1dCBkZWxheSBmcmVlIG9mIHBhZ2VzOworICoKKyAqLworczY0IHh0VHJ1bmNhdGUodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLCBzNjQgbmV3c2l6ZSwgaW50IGZsYWcpCit7CisJaW50IHJjID0gMDsKKwlzNjQgdGVvZjsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCXh0cGFnZV90ICpwOworCXM2NCBibjsKKwlpbnQgaW5kZXgsIG5leHRpbmRleDsKKwl4YWRfdCAqeGFkOworCXM2NCB4b2ZmLCB4YWRkcjsKKwlpbnQgeGxlbiwgbGVuLCBmcmVleGxlbjsKKwlzdHJ1Y3QgYnRzdGFjayBidHN0YWNrOworCXN0cnVjdCBidGZyYW1lICpwYXJlbnQ7CisJc3RydWN0IHRibG9jayAqdGJsayA9IE5VTEw7CisJc3RydWN0IHRsb2NrICp0bGNrID0gTlVMTDsKKwlzdHJ1Y3QgeHRsb2NrICp4dGxjayA9IE5VTEw7CisJc3RydWN0IHhkbGlzdGxvY2sgeGFkbG9jazsJLyogbWFwbG9jayBmb3IgQ09NTUlUX1dNQVAgKi8KKwlzdHJ1Y3QgcHhkX2xvY2sgKnB4ZGxvY2s7CQkvKiBtYXBsb2NrIGZvciBDT01NSVRfV01BUCAqLworCXM2NCBuZnJlZWQ7CisJaW50IGZyZWVkLCBsb2c7CisJaW50IGxvY2tlZF9sZWF2ZXMgPSAwOworCisJLyogc2F2ZSBvYmplY3QgdHJ1bmNhdGlvbiB0eXBlICovCisJaWYgKHRpZCkgeworCQl0YmxrID0gdGlkX3RvX3RibG9jayh0aWQpOworCQl0YmxrLT54ZmxhZyB8PSBmbGFnOworCX0KKworCW5mcmVlZCA9IDA7CisKKwlmbGFnICY9IENPTU1JVF9NQVA7CisJYXNzZXJ0KGZsYWcgIT0gQ09NTUlUX1BNQVApOworCisJaWYgKGZsYWcgPT0gQ09NTUlUX1BXTUFQKQorCQlsb2cgPSAxOworCWVsc2UgeworCQlsb2cgPSAwOworCQl4YWRsb2NrLmZsYWcgPSBtbGNrRlJFRVhBRExJU1Q7CisJCXhhZGxvY2suaW5kZXggPSAxOworCX0KKworCS8qCisJICogaWYgdGhlIG5ld3NpemUgaXMgbm90IGFuIGludGVncmFsIG51bWJlciBvZiBwYWdlcywKKwkgKiB0aGUgZmlsZSBiZXR3ZWVuIG5ld3NpemUgYW5kIG5leHQgcGFnZSBib3VuZGFyeSB3aWxsCisJICogYmUgY2xlYXJlZC4KKwkgKiBpZiB0cnVuY2F0aW5nIGludG8gYSBmaWxlIGhvbGUsIGl0IHdpbGwgY2F1c2UKKwkgKiBhIGZ1bGwgYmxvY2sgdG8gYmUgYWxsb2NhdGVkIGZvciB0aGUgbG9naWNhbCBibG9jay4KKwkgKi8KKworCS8qCisJICogcmVsZWFzZSBwYWdlIGJsb2NrcyBvZiB0cnVuY2F0ZWQgcmVnaW9uIDx0ZW9mLCBlb2Y+CisJICoKKwkgKiBmcmVlIHRoZSBkYXRhIGJsb2NrcyBmcm9tIHRoZSBsZWFmIGluZGV4IGJsb2Nrcy4KKwkgKiBkZWxldGUgdGhlIHBhcmVudCBpbmRleCBlbnRyaWVzIGNvcnJlc3BvbmRpbmcgdG8KKwkgKiB0aGUgZnJlZWQgY2hpbGQgZGF0YS9pbmRleCBibG9ja3MuCisJICogZnJlZSB0aGUgaW5kZXggYmxvY2tzIHRoZW1zZWx2ZXMgd2hpY2ggYXJlbid0IG5lZWRlZAorCSAqIGluIG5ldyBzaXplZCBmaWxlLgorCSAqCisJICogaW5kZXggYmxvY2tzIGFyZSB1cGRhdGVkIG9ubHkgaWYgdGhlIGJsb2NrcyBhcmUgdG8gYmUKKwkgKiByZXRhaW5lZCBpbiB0aGUgbmV3IHNpemVkIGZpbGUuCisJICogaWYgdHlwZSBpcyBQTUFQLCB0aGUgZGF0YSBhbmQgaW5kZXggcGFnZXMgYXJlIE5PVAorCSAqIGZyZWVkLCBhbmQgdGhlIGRhdGEgYW5kIGluZGV4IGJsb2NrcyBhcmUgTk9UIGZyZWVkCisJICogZnJvbSAgd29ya2luZyBtYXAuCisJICogKHRoaXMgd2lsbCBhbGxvdyBjb250aW51ZWQgYWNjZXNzIG9mIGRhdGEvaW5kZXggb2YKKwkgKiB0ZW1wb3JhcnkgZmlsZSAoemVyb2xpbmsgY291bnQgZmlsZSB0cnVuY2F0ZWQgdG8gemVyby1sZW5ndGgpKS4KKwkgKi8KKwl0ZW9mID0gKG5ld3NpemUgKyAoSkZTX1NCSShpcC0+aV9zYiktPmJzaXplIC0gMSkpID4+CisJICAgIEpGU19TQkkoaXAtPmlfc2IpLT5sMmJzaXplOworCisJLyogY2xlYXIgc3RhY2sgKi8KKwlCVF9DTFIoJmJ0c3RhY2spOworCisJLyoKKwkgKiBzdGFydCB3aXRoIHJvb3QKKwkgKgorCSAqIHJvb3QgcmVzaWRlcyBpbiB0aGUgaW5vZGUKKwkgKi8KKwlibiA9IDA7CisKKwkvKgorCSAqIGZpcnN0IGFjY2VzcyBvZiBlYWNoIHBhZ2U6CisJICovCisgICAgICBnZXRQYWdlOgorCVhUX0dFVFBBR0UoaXAsIGJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCS8qIHByb2Nlc3MgZW50cmllcyBiYWNrd2FyZCBmcm9tIGxhc3QgaW5kZXggKi8KKwlpbmRleCA9IGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpIC0gMTsKKworCWlmIChwLT5oZWFkZXIuZmxhZyAmIEJUX0lOVEVSTkFMKQorCQlnb3RvIGdldENoaWxkOworCisJLyoKKwkgKiAgICAgIGxlYWYgcGFnZQorCSAqLworCisJLyogU2luY2UgdGhpcyBpcyB0aGUgcmlnaHRtb3N0IGxlYWYsIGFuZCB3ZSBtYXkgaGF2ZSBhbHJlYWR5IGZyZWVkCisJICogYSBwYWdlIHRoYXQgd2FzIGZvcm1lcmx5IHRvIHRoZSByaWdodCwgbGV0J3MgbWFrZSBzdXJlIHRoYXQgdGhlCisJICogbmV4dCBwb2ludGVyIGlzIHplcm8uCisJICovCisJaWYgKHAtPmhlYWRlci5uZXh0KSB7CisJCWlmIChsb2cpCisJCQkvKgorCQkJICogTWFrZSBzdXJlIHRoaXMgY2hhbmdlIHRvIHRoZSBoZWFkZXIgaXMgbG9nZ2VkLgorCQkJICogSWYgd2UgcmVhbGx5IHRydW5jYXRlIHRoaXMgbGVhZiwgdGhlIGZsYWcKKwkJCSAqIHdpbGwgYmUgY2hhbmdlZCB0byB0bGNrVFJVTkNBVEUKKwkJCSAqLworCQkJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBtcCwgdGxja1hUUkVFfHRsY2tHUk9XKTsKKwkJQlRfTUFSS19ESVJUWShtcCwgaXApOworCQlwLT5oZWFkZXIubmV4dCA9IDA7CisJfQorCisJZnJlZWQgPSAwOworCisJLyogZG9lcyByZWdpb24gY292ZXJlZCBieSBsZWFmIHBhZ2UgcHJlY2VkZSBUZW9mID8gKi8KKwl4YWQgPSAmcC0+eGFkW2luZGV4XTsKKwl4b2ZmID0gb2Zmc2V0WEFEKHhhZCk7CisJeGxlbiA9IGxlbmd0aFhBRCh4YWQpOworCWlmICh0ZW9mID49IHhvZmYgKyB4bGVuKSB7CisJCVhUX1BVVFBBR0UobXApOworCQlnb3RvIGdldFBhcmVudDsKKwl9CisKKwkvKiAocmUpYWNxdWlyZSB0bG9jayBvZiB0aGUgbGVhZiBwYWdlICovCisJaWYgKGxvZykgeworCQlpZiAoKytsb2NrZWRfbGVhdmVzID4gTUFYX1RSVU5DQVRFX0xFQVZFUykgeworCQkJLyoKKwkJCSAqIFdlIG5lZWQgdG8gbGltaXQgdGhlIHNpemUgb2YgdGhlIHRyYW5zYWN0aW9uCisJCQkgKiB0byBhdm9pZCBleGhhdXN0aW5nIHBhZ2VjYWNoZSAmIHRsb2NrcworCQkJICovCisJCQlYVF9QVVRQQUdFKG1wKTsKKwkJCW5ld3NpemUgPSAoeG9mZiArIHhsZW4pIDw8IEpGU19TQkkoaXAtPmlfc2IpLT5sMmJzaXplOworCQkJZ290byBnZXRQYXJlbnQ7CisJCX0KKwkJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBtcCwgdGxja1hUUkVFKTsKKwkJdGxjay0+dHlwZSA9IHRsY2tYVFJFRSB8IHRsY2tUUlVOQ0FURTsKKwkJeHRsY2sgPSAoc3RydWN0IHh0bG9jayAqKSAmIHRsY2stPmxvY2s7CisJCXh0bGNrLT5od20ub2Zmc2V0ID0gbGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCkgLSAxOworCX0KKwlCVF9NQVJLX0RJUlRZKG1wLCBpcCk7CisKKwkvKgorCSAqIHNjYW4gYmFja3dhcmQgbGVhZiBwYWdlIGVudHJpZXMKKwkgKi8KKwlmb3IgKDsgaW5kZXggPj0gWFRFTlRSWVNUQVJUOyBpbmRleC0tKSB7CisJCXhhZCA9ICZwLT54YWRbaW5kZXhdOworCQl4b2ZmID0gb2Zmc2V0WEFEKHhhZCk7CisJCXhsZW4gPSBsZW5ndGhYQUQoeGFkKTsKKwkJeGFkZHIgPSBhZGRyZXNzWEFEKHhhZCk7CisKKwkJLyoKKwkJICogVGhlICJkYXRhIiBmb3IgYSBkaXJlY3RvcnkgaXMgaW5kZXhlZCBieSB0aGUgYmxvY2sKKwkJICogZGV2aWNlJ3MgYWRkcmVzcyBzcGFjZS4gIFRoaXMgbWV0YWRhdGEgbXVzdCBiZSBpbnZhbGlkYXRlZAorCQkgKiBoZXJlCisJCSAqLworCQlpZiAoU19JU0RJUihpcC0+aV9tb2RlKSAmJiAodGVvZiA9PSAwKSkKKwkJCWludmFsaWRhdGVfeGFkX21ldGFwYWdlcyhpcCwgKnhhZCk7CisJCS8qCisJCSAqIGVudHJ5IGJleW9uZCBlb2Y6IGNvbnRpbnVlIHNjYW4gb2YgY3VycmVudCBwYWdlCisJCSAqICAgICAgICAgIHhhZAorCQkgKiAtLS18LS0tPT09PT09PS0tLS0tLS0+CisJCSAqICAgZW9mCisJCSAqLworCQlpZiAodGVvZiA8IHhvZmYpIHsKKwkJCW5mcmVlZCArPSB4bGVuOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiAoeG9mZiA8PSB0ZW9mKTogbGFzdCBlbnRyeSB0byBiZSBkZWxldGVkIGZyb20gcGFnZTsKKwkJICogSWYgb3RoZXIgZW50cmllcyByZW1haW4gaW4gcGFnZToga2VlcCBhbmQgdXBkYXRlIHRoZSBwYWdlLgorCQkgKi8KKworCQkvKgorCQkgKiBlb2YgPT0gZW50cnlfc3RhcnQ6IGRlbGV0ZSB0aGUgZW50cnkKKwkJICogICAgICAgICAgIHhhZAorCQkgKiAtLS0tLS0tfD09PT09PT0tLS0tLS0tPgorCQkgKiAgICAgICBlb2YKKwkJICoKKwkJICovCisJCWlmICh0ZW9mID09IHhvZmYpIHsKKwkJCW5mcmVlZCArPSB4bGVuOworCisJCQlpZiAoaW5kZXggPT0gWFRFTlRSWVNUQVJUKQorCQkJCWJyZWFrOworCisJCQluZXh0aW5kZXggPSBpbmRleDsKKwkJfQorCQkvKgorCQkgKiBlb2Ygd2l0aGluIHRoZSBlbnRyeTogdHJ1bmNhdGUgdGhlIGVudHJ5LgorCQkgKiAgICAgICAgICB4YWQKKwkJICogLS0tLS0tLT09PXw9PT0tLS0tLS0tPgorCQkgKiAgICAgICAgICBlb2YKKwkJICovCisJCWVsc2UgaWYgKHRlb2YgPCB4b2ZmICsgeGxlbikgeworCQkJLyogdXBkYXRlIHRydW5jYXRlZCBlbnRyeSAqLworCQkJbGVuID0gdGVvZiAtIHhvZmY7CisJCQlmcmVleGxlbiA9IHhsZW4gLSBsZW47CisJCQlYQURsZW5ndGgoeGFkLCBsZW4pOworCisJCQkvKiBzYXZlIHB4ZCBvZiB0cnVuY2F0ZWQgZXh0ZW50IGluIHRsY2sgKi8KKwkJCXhhZGRyICs9IGxlbjsKKwkJCWlmIChsb2cpIHsJLyogQ09NTUlUX1BXTUFQICovCisJCQkJeHRsY2stPmx3bS5vZmZzZXQgPSAoeHRsY2stPmx3bS5vZmZzZXQpID8KKwkJCQkgICAgbWluKGluZGV4LCAoaW50KXh0bGNrLT5sd20ub2Zmc2V0KSA6IGluZGV4OworCQkJCXh0bGNrLT5sd20ubGVuZ3RoID0gaW5kZXggKyAxIC0KKwkJCQkgICAgeHRsY2stPmx3bS5vZmZzZXQ7CisJCQkJeHRsY2stPnR3bS5vZmZzZXQgPSBpbmRleDsKKwkJCQlweGRsb2NrID0gKHN0cnVjdCBweGRfbG9jayAqKSAmIHh0bGNrLT5weGRsb2NrOworCQkJCXB4ZGxvY2stPmZsYWcgPSBtbGNrRlJFRVBYRDsKKwkJCQlQWERhZGRyZXNzKCZweGRsb2NrLT5weGQsIHhhZGRyKTsKKwkJCQlQWERsZW5ndGgoJnB4ZGxvY2stPnB4ZCwgZnJlZXhsZW4pOworCQkJfQorCQkJLyogZnJlZSB0cnVuY2F0ZWQgZXh0ZW50ICovCisJCQllbHNlIHsJLyogQ09NTUlUX1dNQVAgKi8KKworCQkJCXB4ZGxvY2sgPSAoc3RydWN0IHB4ZF9sb2NrICopICYgeGFkbG9jazsKKwkJCQlweGRsb2NrLT5mbGFnID0gbWxja0ZSRUVQWEQ7CisJCQkJUFhEYWRkcmVzcygmcHhkbG9jay0+cHhkLCB4YWRkcik7CisJCQkJUFhEbGVuZ3RoKCZweGRsb2NrLT5weGQsIGZyZWV4bGVuKTsKKwkJCQl0eEZyZWVNYXAoaXAsIHB4ZGxvY2ssIE5VTEwsIENPTU1JVF9XTUFQKTsKKworCQkJCS8qIHJlc2V0IG1hcCBsb2NrICovCisJCQkJeGFkbG9jay5mbGFnID0gbWxja0ZSRUVYQURMSVNUOworCQkJfQorCisJCQkvKiBjdXJyZW50IGVudHJ5IGlzIG5ldyBsYXN0IGVudHJ5OyAqLworCQkJbmV4dGluZGV4ID0gaW5kZXggKyAxOworCisJCQluZnJlZWQgKz0gZnJlZXhsZW47CisJCX0KKwkJLyoKKwkJICogZW9mIGJleW9uZCB0aGUgZW50cnk6CisJCSAqICAgICAgICAgIHhhZAorCQkgKiAtLS0tLS0tPT09PT09PS0tLXwtLS0+CisJCSAqICAgICAgICAgICAgICAgICBlb2YKKwkJICovCisJCWVsc2UgewkJLyogKHhvZmYgKyB4bGVuIDwgdGVvZikgKi8KKworCQkJbmV4dGluZGV4ID0gaW5kZXggKyAxOworCQl9CisKKwkJaWYgKG5leHRpbmRleCA8IGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpKSB7CisJCQlpZiAoIWxvZykgewkvKiBDT01NSVRfV0FNUCAqLworCQkJCXhhZGxvY2sueGRsaXN0ID0gJnAtPnhhZFtuZXh0aW5kZXhdOworCQkJCXhhZGxvY2suY291bnQgPQorCQkJCSAgICBsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KSAtCisJCQkJICAgIG5leHRpbmRleDsKKwkJCQl0eEZyZWVNYXAoaXAsIChzdHJ1Y3QgbWFwbG9jayAqKSAmIHhhZGxvY2ssCisJCQkJCSAgTlVMTCwgQ09NTUlUX1dNQVApOworCQkJfQorCQkJcC0+aGVhZGVyLm5leHRpbmRleCA9IGNwdV90b19sZTE2KG5leHRpbmRleCk7CisJCX0KKworCQlYVF9QVVRQQUdFKG1wKTsKKworCQkvKiBhc3NlcnQoZnJlZWQgPT0gMCk7ICovCisJCWdvdG8gZ2V0UGFyZW50OworCX0JCQkvKiBlbmQgc2NhbiBvZiBsZWFmIHBhZ2UgZW50cmllcyAqLworCisJZnJlZWQgPSAxOworCisJLyoKKwkgKiBsZWFmIHBhZ2UgYmVjb21lIGVtcHR5OiBmcmVlIHRoZSBwYWdlIGlmIHR5cGUgIT0gUE1BUAorCSAqLworCWlmIChsb2cpIHsJCS8qIENPTU1JVF9QV01BUCAqLworCQkvKiB0eENvbW1pdCgpIHdpdGggdGxja0ZSRUU6CisJCSAqIGZyZWUgZGF0YSBleHRlbnRzIGNvdmVyZWQgYnkgbGVhZiBbWFRFTlRSWVNUQVJUOmh3bSk7CisJCSAqIGludmFsaWRhdGUgbGVhZiBpZiBDT01NSVRfUFdNQVA7CisJCSAqIGlmIChUUlVOQ0FURSksIHdpbGwgd3JpdGUgTE9HX05PUkVET1BBR0U7CisJCSAqLworCQl0bGNrLT50eXBlID0gdGxja1hUUkVFIHwgdGxja0ZSRUU7CisJfSBlbHNlIHsJCS8qIENPTU1JVF9XQU1QICovCisKKwkJLyogZnJlZSBkYXRhIGV4dGVudHMgY292ZXJlZCBieSBsZWFmICovCisJCXhhZGxvY2sueGRsaXN0ID0gJnAtPnhhZFtYVEVOVFJZU1RBUlRdOworCQl4YWRsb2NrLmNvdW50ID0KKwkJICAgIGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpIC0gWFRFTlRSWVNUQVJUOworCQl0eEZyZWVNYXAoaXAsIChzdHJ1Y3QgbWFwbG9jayAqKSAmIHhhZGxvY2ssIE5VTEwsIENPTU1JVF9XTUFQKTsKKwl9CisKKwlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9ST09UKSB7CisJCXAtPmhlYWRlci5mbGFnICY9IH5CVF9JTlRFUk5BTDsKKwkJcC0+aGVhZGVyLmZsYWcgfD0gQlRfTEVBRjsKKwkJcC0+aGVhZGVyLm5leHRpbmRleCA9IGNwdV90b19sZTE2KFhURU5UUllTVEFSVCk7CisKKwkJWFRfUFVUUEFHRShtcCk7CS8qIGRlYnVnICovCisJCWdvdG8gb3V0OworCX0gZWxzZSB7CisJCWlmIChsb2cpIHsJLyogQ09NTUlUX1BXTUFQICovCisJCQkvKiBwYWdlIHdpbGwgYmUgaW52YWxpZGF0ZWQgYXQgdHggY29tcGxldGlvbgorCQkJICovCisJCQlYVF9QVVRQQUdFKG1wKTsKKwkJfSBlbHNlIHsJLyogQ09NTUlUX1dNQVAgKi8KKworCQkJaWYgKG1wLT5saWQpCisJCQkJbGlkX3RvX3Rsb2NrKG1wLT5saWQpLT5mbGFnIHw9IHRsY2tGUkVFTE9DSzsKKworCQkJLyogaW52YWxpZGF0ZSBlbXB0eSBsZWFmIHBhZ2UgKi8KKwkJCWRpc2NhcmRfbWV0YXBhZ2UobXApOworCQl9CisJfQorCisJLyoKKwkgKiB0aGUgbGVhZiBwYWdlIGJlY29tZSBlbXB0eTogZGVsZXRlIHRoZSBwYXJlbnQgZW50cnkKKwkgKiBmb3IgdGhlIGxlYWYgcGFnZSBpZiB0aGUgcGFyZW50IHBhZ2UgaXMgdG8gYmUga2VwdAorCSAqIGluIHRoZSBuZXcgc2l6ZWQgZmlsZS4KKwkgKi8KKworCS8qCisJICogZ28gYmFjayB1cCB0byB0aGUgcGFyZW50IHBhZ2UKKwkgKi8KKyAgICAgIGdldFBhcmVudDoKKwkvKiBwb3AvcmVzdG9yZSBwYXJlbnQgZW50cnkgZm9yIHRoZSBjdXJyZW50IGNoaWxkIHBhZ2UgKi8KKwlpZiAoKHBhcmVudCA9IEJUX1BPUCgmYnRzdGFjaykpID09IE5VTEwpCisJCS8qIGN1cnJlbnQgcGFnZSBtdXN0IGhhdmUgYmVlbiByb290ICovCisJCWdvdG8gb3V0OworCisJLyogZ2V0IGJhY2sgdGhlIHBhcmVudCBwYWdlICovCisJYm4gPSBwYXJlbnQtPmJuOworCVhUX0dFVFBBR0UoaXAsIGJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWluZGV4ID0gcGFyZW50LT5pbmRleDsKKworCS8qCisJICogY2hpbGQgcGFnZSB3YXMgbm90IGVtcHR5OgorCSAqLworCWlmIChmcmVlZCA9PSAwKSB7CisJCS8qIGhhcyBhbnkgZW50cnkgZGVsZXRlZCBmcm9tIHBhcmVudCA/ICovCisJCWlmIChpbmRleCA8IGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpIC0gMSkgeworCQkJLyogKHJlKWFjcXVpcmUgdGxvY2sgb24gdGhlIHBhcmVudCBwYWdlICovCisJCQlpZiAobG9nKSB7CS8qIENPTU1JVF9QV01BUCAqLworCQkJCS8qIHR4Q29tbWl0KCkgd2l0aCB0bGNrVFJVTkNBVEU6CisJCQkJICogZnJlZSBjaGlsZCBleHRlbnRzIGNvdmVyZWQgYnkgcGFyZW50IFspOworCQkJCSAqLworCQkJCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgbXAsIHRsY2tYVFJFRSk7CisJCQkJeHRsY2sgPSAoc3RydWN0IHh0bG9jayAqKSAmIHRsY2stPmxvY2s7CisJCQkJaWYgKCEodGxjay0+dHlwZSAmIHRsY2tUUlVOQ0FURSkpIHsKKwkJCQkJeHRsY2stPmh3bS5vZmZzZXQgPQorCQkJCQkgICAgbGUxNl90b19jcHUocC0+aGVhZGVyLgorCQkJCQkJCW5leHRpbmRleCkgLSAxOworCQkJCQl0bGNrLT50eXBlID0KKwkJCQkJICAgIHRsY2tYVFJFRSB8IHRsY2tUUlVOQ0FURTsKKwkJCQl9CisJCQl9IGVsc2UgewkvKiBDT01NSVRfV01BUCAqLworCisJCQkJLyogZnJlZSBjaGlsZCBleHRlbnRzIGNvdmVyZWQgYnkgcGFyZW50ICovCisJCQkJeGFkbG9jay54ZGxpc3QgPSAmcC0+eGFkW2luZGV4ICsgMV07CisJCQkJeGFkbG9jay5jb3VudCA9CisJCQkJICAgIGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpIC0KKwkJCQkgICAgaW5kZXggLSAxOworCQkJCXR4RnJlZU1hcChpcCwgKHN0cnVjdCBtYXBsb2NrICopICYgeGFkbG9jaywKKwkJCQkJICBOVUxMLCBDT01NSVRfV01BUCk7CisJCQl9CisJCQlCVF9NQVJLX0RJUlRZKG1wLCBpcCk7CisKKwkJCXAtPmhlYWRlci5uZXh0aW5kZXggPSBjcHVfdG9fbGUxNihpbmRleCArIDEpOworCQl9CisJCVhUX1BVVFBBR0UobXApOworCQlnb3RvIGdldFBhcmVudDsKKwl9CisKKwkvKgorCSAqIGNoaWxkIHBhZ2Ugd2FzIGVtcHR5OgorCSAqLworCW5mcmVlZCArPSBsZW5ndGhYQUQoJnAtPnhhZFtpbmRleF0pOworCisJLyoKKwkgKiBEdXJpbmcgd29ya2luZyBtYXAgdXBkYXRlLCBjaGlsZCBwYWdlJ3MgdGxvY2sgbXVzdCBiZSBoYW5kbGVkCisJICogYmVmb3JlIHBhcmVudCdzLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBwYXJlbnQncyB0bG9jayB3aWxsIGNhdXNlCisJICogdGhlIGNoaWxkJ3MgZGlzayBzcGFjZSB0byBiZSBtYXJrZWQgYXZhaWxhYmxlIGluIHRoZSB3bWFwLCBzbworCSAqIGl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIGNoaWxkIHBhZ2UgYmUgcmVsZWFzZWQgYnkgdGhhdCB0aW1lLgorCSAqCisJICogVG9EbzogIHRsb2NrcyBzaG91bGQgYmUgb24gZG91Ymx5LWxpbmtlZCBsaXN0LCBzbyB3ZSBjYW4KKwkgKiBxdWlja2x5IHJlbW92ZSBpdCBhbmQgYWRkIGl0IHRvIHRoZSBlbmQuCisJICovCisKKwkvKgorCSAqIE1vdmUgcGFyZW50IHBhZ2UncyB0bG9jayB0byB0aGUgZW5kIG9mIHRoZSB0aWQncyB0bG9jayBsaXN0CisJICovCisJaWYgKGxvZyAmJiBtcC0+bGlkICYmICh0YmxrLT5sYXN0ICE9IG1wLT5saWQpICYmCisJICAgIGxpZF90b190bG9jayhtcC0+bGlkKS0+dGlkKSB7CisJCWxpZF90IGxpZCA9IG1wLT5saWQ7CisJCXN0cnVjdCB0bG9jayAqcHJldjsKKworCQl0bGNrID0gbGlkX3RvX3Rsb2NrKGxpZCk7CisKKwkJaWYgKHRibGstPm5leHQgPT0gbGlkKQorCQkJdGJsay0+bmV4dCA9IHRsY2stPm5leHQ7CisJCWVsc2UgeworCQkJZm9yIChwcmV2ID0gbGlkX3RvX3Rsb2NrKHRibGstPm5leHQpOworCQkJICAgICBwcmV2LT5uZXh0ICE9IGxpZDsKKwkJCSAgICAgcHJldiA9IGxpZF90b190bG9jayhwcmV2LT5uZXh0KSkgeworCQkJCWFzc2VydChwcmV2LT5uZXh0KTsKKwkJCX0KKwkJCXByZXYtPm5leHQgPSB0bGNrLT5uZXh0OworCQl9CisJCWxpZF90b190bG9jayh0YmxrLT5sYXN0KS0+bmV4dCA9IGxpZDsKKwkJdGxjay0+bmV4dCA9IDA7CisJCXRibGstPmxhc3QgPSBsaWQ7CisJfQorCisJLyoKKwkgKiBwYXJlbnQgcGFnZSBiZWNvbWUgZW1wdHk6IGZyZWUgdGhlIHBhZ2UKKwkgKi8KKwlpZiAoaW5kZXggPT0gWFRFTlRSWVNUQVJUKSB7CisJCWlmIChsb2cpIHsJLyogQ09NTUlUX1BXTUFQICovCisJCQkvKiB0eENvbW1pdCgpIHdpdGggdGxja0ZSRUU6CisJCQkgKiBmcmVlIGNoaWxkIGV4dGVudHMgY292ZXJlZCBieSBwYXJlbnQ7CisJCQkgKiBpbnZhbGlkYXRlIHBhcmVudCBpZiBDT01NSVRfUFdNQVA7CisJCQkgKi8KKwkJCXRsY2sgPSB0eExvY2sodGlkLCBpcCwgbXAsIHRsY2tYVFJFRSk7CisJCQl4dGxjayA9IChzdHJ1Y3QgeHRsb2NrICopICYgdGxjay0+bG9jazsKKwkJCXh0bGNrLT5od20ub2Zmc2V0ID0KKwkJCSAgICBsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KSAtIDE7CisJCQl0bGNrLT50eXBlID0gdGxja1hUUkVFIHwgdGxja0ZSRUU7CisJCX0gZWxzZSB7CS8qIENPTU1JVF9XTUFQICovCisKKwkJCS8qIGZyZWUgY2hpbGQgZXh0ZW50cyBjb3ZlcmVkIGJ5IHBhcmVudCAqLworCQkJeGFkbG9jay54ZGxpc3QgPSAmcC0+eGFkW1hURU5UUllTVEFSVF07CisJCQl4YWRsb2NrLmNvdW50ID0KKwkJCSAgICBsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KSAtCisJCQkgICAgWFRFTlRSWVNUQVJUOworCQkJdHhGcmVlTWFwKGlwLCAoc3RydWN0IG1hcGxvY2sgKikgJiB4YWRsb2NrLCBOVUxMLAorCQkJCSAgQ09NTUlUX1dNQVApOworCQl9CisJCUJUX01BUktfRElSVFkobXAsIGlwKTsKKworCQlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9ST09UKSB7CisJCQlwLT5oZWFkZXIuZmxhZyAmPSB+QlRfSU5URVJOQUw7CisJCQlwLT5oZWFkZXIuZmxhZyB8PSBCVF9MRUFGOworCQkJcC0+aGVhZGVyLm5leHRpbmRleCA9IGNwdV90b19sZTE2KFhURU5UUllTVEFSVCk7CisJCQlpZiAobGUxNl90b19jcHUocC0+aGVhZGVyLm1heGVudHJ5KSA9PSBYVFJPT1RNQVhTTE9UKSB7CisJCQkJLyoKKwkJCQkgKiBTaHJpbmsgcm9vdCBkb3duIHRvIGFsbG93IGlubGluZQorCQkJCSAqIEVBIChvdGhlcndpc2UgZnNjayBjb21wbGFpbnMpCisJCQkJICovCisJCQkJcC0+aGVhZGVyLm1heGVudHJ5ID0KKwkJCQkgICAgY3B1X3RvX2xlMTYoWFRST09USU5JVFNMT1QpOworCQkJCUpGU19JUChpcCktPm1vZGUyIHw9IElOTElORUVBOworCQkJfQorCisJCQlYVF9QVVRQQUdFKG1wKTsJLyogZGVidWcgKi8KKwkJCWdvdG8gb3V0OworCQl9IGVsc2UgeworCQkJaWYgKGxvZykgewkvKiBDT01NSVRfUFdNQVAgKi8KKwkJCQkvKiBwYWdlIHdpbGwgYmUgaW52YWxpZGF0ZWQgYXQgdHggY29tcGxldGlvbgorCQkJCSAqLworCQkJCVhUX1BVVFBBR0UobXApOworCQkJfSBlbHNlIHsJLyogQ09NTUlUX1dNQVAgKi8KKworCQkJCWlmIChtcC0+bGlkKQorCQkJCQlsaWRfdG9fdGxvY2sobXAtPmxpZCktPmZsYWcgfD0KKwkJCQkJCXRsY2tGUkVFTE9DSzsKKworCQkJCS8qIGludmFsaWRhdGUgcGFyZW50IHBhZ2UgKi8KKwkJCQlkaXNjYXJkX21ldGFwYWdlKG1wKTsKKwkJCX0KKworCQkJLyogcGFyZW50IGhhcyBiZWNvbWUgZW1wdHkgYW5kIGZyZWVkOgorCQkJICogZ28gYmFjayB1cCB0byBpdHMgcGFyZW50IHBhZ2UKKwkJCSAqLworCQkJLyogZnJlZWQgPSAxOyAqLworCQkJZ290byBnZXRQYXJlbnQ7CisJCX0KKwl9CisJLyoKKwkgKiBwYXJlbnQgcGFnZSBzdGlsbCBoYXMgZW50cmllcyBmb3IgZnJvbnQgcmVnaW9uOworCSAqLworCWVsc2UgeworCQkvKiB0cnkgdHJ1bmNhdGUgcmVnaW9uIGNvdmVyZWQgYnkgcHJlY2VkaW5nIGVudHJ5CisJCSAqIChwcm9jZXNzIGJhY2t3YXJkKQorCQkgKi8KKwkJaW5kZXgtLTsKKworCQkvKiBnbyBiYWNrIGRvd24gdG8gdGhlIGNoaWxkIHBhZ2UgY29ycmVzcG9uZGluZworCQkgKiB0byB0aGUgZW50cnkKKwkJICovCisJCWdvdG8gZ2V0Q2hpbGQ7CisJfQorCisJLyoKKwkgKiAgICAgIGludGVybmFsIHBhZ2U6IGdvIGRvd24gdG8gY2hpbGQgcGFnZSBvZiBjdXJyZW50IGVudHJ5CisJICovCisgICAgICBnZXRDaGlsZDoKKwkvKiBzYXZlIGN1cnJlbnQgcGFyZW50IGVudHJ5IGZvciB0aGUgY2hpbGQgcGFnZSAqLworCUJUX1BVU0goJmJ0c3RhY2ssIGJuLCBpbmRleCk7CisKKwkvKiBnZXQgY2hpbGQgcGFnZSAqLworCXhhZCA9ICZwLT54YWRbaW5kZXhdOworCWJuID0gYWRkcmVzc1hBRCh4YWQpOworCisJLyoKKwkgKiBmaXJzdCBhY2Nlc3Mgb2YgZWFjaCBpbnRlcm5hbCBlbnRyeToKKwkgKi8KKwkvKiByZWxlYXNlIHBhcmVudCBwYWdlICovCisJWFRfUFVUUEFHRShtcCk7CisKKwkvKiBwcm9jZXNzIHRoZSBjaGlsZCBwYWdlICovCisJZ290byBnZXRQYWdlOworCisgICAgICBvdXQ6CisJLyoKKwkgKiB1cGRhdGUgZmlsZSByZXNvdXJjZSBzdGF0CisJICovCisJLyogc2V0IHNpemUKKwkgKi8KKwlpZiAoU19JU0RJUihpcC0+aV9tb2RlKSAmJiAhbmV3c2l6ZSkKKwkJaXAtPmlfc2l6ZSA9IDE7CS8qIGZzY2sgaGF0ZXMgemVyby1sZW5ndGggZGlyZWN0b3JpZXMgKi8KKwllbHNlCisJCWlwLT5pX3NpemUgPSBuZXdzaXplOworCisJLyogdXBkYXRlIHF1b3RhIGFsbG9jYXRpb24gdG8gcmVmbGVjdCBmcmVlZCBibG9ja3MgKi8KKwlEUVVPVF9GUkVFX0JMT0NLKGlwLCBuZnJlZWQpOworCisJLyoKKwkgKiBmcmVlIHRsb2NrIG9mIGludmFsaWRhdGVkIHBhZ2VzCisJICovCisJaWYgKGZsYWcgPT0gQ09NTUlUX1dNQVApCisJCXR4RnJlZWxvY2soaXApOworCisJcmV0dXJuIG5ld3NpemU7Cit9CisKKworLyoKKyAqICAgICAgeHRUcnVuY2F0ZV9wbWFwKCkKKyAqCisgKiBmdW5jdGlvbjoKKyAqCVBlcmZvcm0gdHJ1bmNhdGUgdG8gemVybyBsZW5naHRoIGZvciBkZWxldGVkIGZpbGUsIGxlYXZpbmcgdGhlCisgKgl0aGUgeHRyZWUgYW5kIHdvcmtpbmcgbWFwIHVudG91Y2hlZC4gIFRoaXMgYWxsb3dzIHRoZSBmaWxlIHRvCisgKgliZSBhY2Nlc3NlZCB2aWEgb3BlbiBmaWxlIGhhbmRsZXMsIHdoaWxlIHRoZSBkZWxldGUgb2YgdGhlIGZpbGUKKyAqCWlzIGNvbW1pdHRlZCB0byBkaXNrLgorICoKKyAqIHBhcmFtZXRlcjoKKyAqICAgICAgdGlkX3QJCXRpZCwKKyAqICAgICAgc3RydWN0IGlub2RlCSppcCwKKyAqICAgICAgczY0CQljb21taXR0ZWRfc2l6ZSkKKyAqCisgKiByZXR1cm46IG5ldyBjb21taXR0ZWQgc2l6ZQorICoKKyAqIG5vdGU6CisgKgorICoJVG8gYXZvaWQgZGVhZGxvY2sgYnkgaG9sZGluZyB0b28gbWFueSB0cmFuc2FjdGlvbiBsb2NrcywgdGhlCisgKgl0cnVuY2F0aW9uIG1heSBiZSBicm9rZW4gdXAgaW50byBtdWx0aXBsZSB0cmFuc2FjdGlvbnMuCisgKglUaGUgY29tbWl0dGVkX3NpemUga2VlcHMgdHJhY2sgb2YgcGFydCBvZiB0aGUgZmlsZSBoYXMgYmVlbgorICoJZnJlZWQgZnJvbSB0aGUgcG1hcHMuCisgKi8KK3M2NCB4dFRydW5jYXRlX3BtYXAodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLCBzNjQgY29tbWl0dGVkX3NpemUpCit7CisJczY0IGJuOworCXN0cnVjdCBidHN0YWNrIGJ0c3RhY2s7CisJaW50IGNtcDsKKwlpbnQgaW5kZXg7CisJaW50IGxvY2tlZF9sZWF2ZXMgPSAwOworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJeHRwYWdlX3QgKnA7CisJc3RydWN0IGJ0ZnJhbWUgKnBhcmVudDsKKwlpbnQgcmM7CisJc3RydWN0IHRibG9jayAqdGJsazsKKwlzdHJ1Y3QgdGxvY2sgKnRsY2sgPSBOVUxMOworCXhhZF90ICp4YWQ7CisJaW50IHhsZW47CisJczY0IHhvZmY7CisJc3RydWN0IHh0bG9jayAqeHRsY2sgPSBOVUxMOworCisJLyogc2F2ZSBvYmplY3QgdHJ1bmNhdGlvbiB0eXBlICovCisJdGJsayA9IHRpZF90b190YmxvY2sodGlkKTsKKwl0YmxrLT54ZmxhZyB8PSBDT01NSVRfUE1BUDsKKworCS8qIGNsZWFyIHN0YWNrICovCisJQlRfQ0xSKCZidHN0YWNrKTsKKworCWlmIChjb21taXR0ZWRfc2l6ZSkgeworCQl4b2ZmID0gKGNvbW1pdHRlZF9zaXplID4+IEpGU19TQkkoaXAtPmlfc2IpLT5sMmJzaXplKSAtIDE7CisJCXJjID0geHRTZWFyY2goaXAsIHhvZmYsICZjbXAsICZidHN0YWNrLCAwKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCVhUX0dFVFNFQVJDSChpcCwgYnRzdGFjay50b3AsIGJuLCBtcCwgcCwgaW5kZXgpOworCisJCWlmIChjbXAgIT0gMCkgeworCQkJWFRfUFVUUEFHRShtcCk7CisJCQlqZnNfZXJyb3IoaXAtPmlfc2IsCisJCQkJICAieHRUcnVuY2F0ZV9wbWFwOiBkaWQgbm90IGZpbmQgZXh0ZW50Iik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIHN0YXJ0IHdpdGggcm9vdAorCQkgKgorCQkgKiByb290IHJlc2lkZXMgaW4gdGhlIGlub2RlCisJCSAqLworCQlibiA9IDA7CisKKwkJLyoKKwkJICogZmlyc3QgYWNjZXNzIG9mIGVhY2ggcGFnZToKKwkJICovCisgICAgICBnZXRQYWdlOgorCQlYVF9HRVRQQUdFKGlwLCBibiwgbXAsIFBTSVpFLCBwLCByYyk7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKworCQkvKiBwcm9jZXNzIGVudHJpZXMgYmFja3dhcmQgZnJvbSBsYXN0IGluZGV4ICovCisJCWluZGV4ID0gbGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCkgLSAxOworCisJCWlmIChwLT5oZWFkZXIuZmxhZyAmIEJUX0lOVEVSTkFMKQorCQkJZ290byBnZXRDaGlsZDsKKwl9CisKKwkvKgorCSAqICAgICAgbGVhZiBwYWdlCisJICovCisKKwlpZiAoKytsb2NrZWRfbGVhdmVzID4gTUFYX1RSVU5DQVRFX0xFQVZFUykgeworCQkvKgorCQkgKiBXZSBuZWVkIHRvIGxpbWl0IHRoZSBzaXplIG9mIHRoZSB0cmFuc2FjdGlvbgorCQkgKiB0byBhdm9pZCBleGhhdXN0aW5nIHBhZ2VjYWNoZSAmIHRsb2NrcworCQkgKi8KKwkJeGFkID0gJnAtPnhhZFtpbmRleF07CisJCXhvZmYgPSBvZmZzZXRYQUQoeGFkKTsKKwkJeGxlbiA9IGxlbmd0aFhBRCh4YWQpOworCQlYVF9QVVRQQUdFKG1wKTsKKwkJcmV0dXJuICAoeG9mZiArIHhsZW4pIDw8IEpGU19TQkkoaXAtPmlfc2IpLT5sMmJzaXplOworCX0KKwl0bGNrID0gdHhMb2NrKHRpZCwgaXAsIG1wLCB0bGNrWFRSRUUpOworCXRsY2stPnR5cGUgPSB0bGNrWFRSRUUgfCB0bGNrRlJFRTsKKwl4dGxjayA9IChzdHJ1Y3QgeHRsb2NrICopICYgdGxjay0+bG9jazsKKwl4dGxjay0+aHdtLm9mZnNldCA9IGluZGV4OworCisKKwlYVF9QVVRQQUdFKG1wKTsKKworCS8qCisJICogZ28gYmFjayB1cCB0byB0aGUgcGFyZW50IHBhZ2UKKwkgKi8KKyAgICAgIGdldFBhcmVudDoKKwkvKiBwb3AvcmVzdG9yZSBwYXJlbnQgZW50cnkgZm9yIHRoZSBjdXJyZW50IGNoaWxkIHBhZ2UgKi8KKwlpZiAoKHBhcmVudCA9IEJUX1BPUCgmYnRzdGFjaykpID09IE5VTEwpCisJCS8qIGN1cnJlbnQgcGFnZSBtdXN0IGhhdmUgYmVlbiByb290ICovCisJCWdvdG8gb3V0OworCisJLyogZ2V0IGJhY2sgdGhlIHBhcmVudCBwYWdlICovCisJYm4gPSBwYXJlbnQtPmJuOworCVhUX0dFVFBBR0UoaXAsIGJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWluZGV4ID0gcGFyZW50LT5pbmRleDsKKworCS8qCisJICogcGFyZW50IHBhZ2UgYmVjb21lIGVtcHR5OiBmcmVlIHRoZSBwYWdlCisJICovCisJaWYgKGluZGV4ID09IFhURU5UUllTVEFSVCkgeworCQkvKiB0eENvbW1pdCgpIHdpdGggdGxja0ZSRUU6CisJCSAqIGZyZWUgY2hpbGQgZXh0ZW50cyBjb3ZlcmVkIGJ5IHBhcmVudDsKKwkJICogaW52YWxpZGF0ZSBwYXJlbnQgaWYgQ09NTUlUX1BXTUFQOworCQkgKi8KKwkJdGxjayA9IHR4TG9jayh0aWQsIGlwLCBtcCwgdGxja1hUUkVFKTsKKwkJeHRsY2sgPSAoc3RydWN0IHh0bG9jayAqKSAmIHRsY2stPmxvY2s7CisJCXh0bGNrLT5od20ub2Zmc2V0ID0KKwkJICAgIGxlMTZfdG9fY3B1KHAtPmhlYWRlci5uZXh0aW5kZXgpIC0gMTsKKwkJdGxjay0+dHlwZSA9IHRsY2tYVFJFRSB8IHRsY2tGUkVFOworCisJCVhUX1BVVFBBR0UobXApOworCisJCWlmIChwLT5oZWFkZXIuZmxhZyAmIEJUX1JPT1QpIHsKKworCQkJZ290byBvdXQ7CisJCX0gZWxzZSB7CisJCQlnb3RvIGdldFBhcmVudDsKKwkJfQorCX0KKwkvKgorCSAqIHBhcmVudCBwYWdlIHN0aWxsIGhhcyBlbnRyaWVzIGZvciBmcm9udCByZWdpb247CisJICovCisJZWxzZQorCQlpbmRleC0tOworCS8qCisJICogICAgICBpbnRlcm5hbCBwYWdlOiBnbyBkb3duIHRvIGNoaWxkIHBhZ2Ugb2YgY3VycmVudCBlbnRyeQorCSAqLworICAgICAgZ2V0Q2hpbGQ6CisJLyogc2F2ZSBjdXJyZW50IHBhcmVudCBlbnRyeSBmb3IgdGhlIGNoaWxkIHBhZ2UgKi8KKwlCVF9QVVNIKCZidHN0YWNrLCBibiwgaW5kZXgpOworCisJLyogZ2V0IGNoaWxkIHBhZ2UgKi8KKwl4YWQgPSAmcC0+eGFkW2luZGV4XTsKKwlibiA9IGFkZHJlc3NYQUQoeGFkKTsKKworCS8qCisJICogZmlyc3QgYWNjZXNzIG9mIGVhY2ggaW50ZXJuYWwgZW50cnk6CisJICovCisJLyogcmVsZWFzZSBwYXJlbnQgcGFnZSAqLworCVhUX1BVVFBBR0UobXApOworCisJLyogcHJvY2VzcyB0aGUgY2hpbGQgcGFnZSAqLworCWdvdG8gZ2V0UGFnZTsKKworICAgICAgb3V0OgorCisJcmV0dXJuIDA7Cit9CisKKworI2lmZGVmIF9KRlNfREVCVUdfWFRSRUUKKy8qCisgKiAgICAgIHh0RGlzcGxheVRyZWUoKQorICoKKyAqIGZ1bmN0aW9uOiB0cmF2ZXJzZSBmb3J3YXJkCisgKi8KK2ludCB4dERpc3BsYXlUcmVlKHN0cnVjdCBpbm9kZSAqaXApCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOworCXh0cGFnZV90ICpwOworCXM2NCBibiwgcGJuOworCWludCBpbmRleCwgbGFzdGluZGV4LCB2LCBoOworCXhhZF90ICp4YWQ7CisJc3RydWN0IGJ0c3RhY2sgYnRzdGFjazsKKwlzdHJ1Y3QgYnRmcmFtZSAqYnRzcDsKKwlzdHJ1Y3QgYnRmcmFtZSAqcGFyZW50OworCisJcHJpbnRrKCJkaXNwbGF5IEIrLXRyZWUuXG4iKTsKKworCS8qIGNsZWFyIHN0YWNrICovCisJYnRzcCA9IGJ0c3RhY2suc3RhY2s7CisKKwkvKgorCSAqIHN0YXJ0IHdpdGggcm9vdAorCSAqCisJICogcm9vdCByZXNpZGVzIGluIHRoZSBpbm9kZQorCSAqLworCWJuID0gMDsKKwl2ID0gaCA9IDA7CisKKwkvKgorCSAqIGZpcnN0IGFjY2VzcyBvZiBlYWNoIHBhZ2U6CisJICovCisgICAgICBnZXRQYWdlOgorCVhUX0dFVFBBR0UoaXAsIGJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCS8qIHByb2Nlc3MgZW50cmllcyBmb3J3YXJkIGZyb20gZmlyc3QgaW5kZXggKi8KKwlpbmRleCA9IFhURU5UUllTVEFSVDsKKwlsYXN0aW5kZXggPSBsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KSAtIDE7CisKKwlpZiAocC0+aGVhZGVyLmZsYWcgJiBCVF9JTlRFUk5BTCkgeworCQkvKgorCQkgKiBmaXJzdCBhY2Nlc3Mgb2YgZWFjaCBpbnRlcm5hbCBwYWdlCisJCSAqLworCQlnb3RvIGdldENoaWxkOworCX0gZWxzZSB7CQkvKiAocC0+aGVhZGVyLmZsYWcgJiBCVF9MRUFGKSAqLworCisJCS8qCisJCSAqIGZpcnN0IGFjY2VzcyBvZiBlYWNoIGxlYWYgcGFnZQorCQkgKi8KKwkJcHJpbnRmKCJsZWFmIHBhZ2UgIik7CisJCXh0RGlzcGxheVBhZ2UoaXAsIGJuLCBwKTsKKworCQkvKiB1bnBpbiB0aGUgbGVhZiBwYWdlICovCisJCVhUX1BVVFBBR0UobXApOworCX0KKworCS8qCisJICogZ28gYmFjayB1cCB0byB0aGUgcGFyZW50IHBhZ2UKKwkgKi8KKyAgICAgIGdldFBhcmVudDoKKwkvKiBwb3AvcmVzdG9yZSBwYXJlbnQgZW50cnkgZm9yIHRoZSBjdXJyZW50IGNoaWxkIHBhZ2UgKi8KKwlpZiAoKHBhcmVudCA9IChidHNwID09IGJ0c3RhY2suc3RhY2sgPyBOVUxMIDogLS1idHNwKSkgPT0gTlVMTCkKKwkJLyogY3VycmVudCBwYWdlIG11c3QgaGF2ZSBiZWVuIHJvb3QgKi8KKwkJcmV0dXJuOworCisJLyoKKwkgKiBwYXJlbnQgcGFnZSBzY2FuIGNvbXBsZXRlZAorCSAqLworCWlmICgoaW5kZXggPSBwYXJlbnQtPmluZGV4KSA9PSAobGFzdGluZGV4ID0gcGFyZW50LT5sYXN0aW5kZXgpKSB7CisJCS8qIGdvIGJhY2sgdXAgdG8gdGhlIHBhcmVudCBwYWdlICovCisJCWdvdG8gZ2V0UGFyZW50OworCX0KKworCS8qCisJICogcGFyZW50IHBhZ2UgaGFzIGVudHJpZXMgcmVtYWluaW5nCisJICovCisJLyogZ2V0IGJhY2sgdGhlIHBhcmVudCBwYWdlICovCisJYm4gPSBwYXJlbnQtPmJuOworCS8qIHYgPSBwYXJlbnQtPmxldmVsOyAqLworCVhUX0dFVFBBR0UoaXAsIGJuLCBtcCwgUFNJWkUsIHAsIHJjKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCS8qIGdldCBuZXh0IHBhcmVudCBlbnRyeSAqLworCWluZGV4Kys7CisKKwkvKgorCSAqIGludGVybmFsIHBhZ2U6IGdvIGRvd24gdG8gY2hpbGQgcGFnZSBvZiBjdXJyZW50IGVudHJ5CisJICovCisgICAgICBnZXRDaGlsZDoKKwkvKiBwdXNoL3NhdmUgY3VycmVudCBwYXJlbnQgZW50cnkgZm9yIHRoZSBjaGlsZCBwYWdlICovCisJYnRzcC0+Ym4gPSBwYm4gPSBibjsKKwlidHNwLT5pbmRleCA9IGluZGV4OworCWJ0c3AtPmxhc3RpbmRleCA9IGxhc3RpbmRleDsKKwkvKiBidHNwLT5sZXZlbCA9IHY7ICovCisJLyogYnRzcC0+bm9kZSA9IGg7ICovCisJKytidHNwOworCisJLyogZ2V0IGNoaWxkIHBhZ2UgKi8KKwl4YWQgPSAmcC0+eGFkW2luZGV4XTsKKwlibiA9IGFkZHJlc3NYQUQoeGFkKTsKKworCS8qCisJICogZmlyc3QgYWNjZXNzIG9mIGVhY2ggaW50ZXJuYWwgZW50cnk6CisJICovCisJLyogcmVsZWFzZSBwYXJlbnQgcGFnZSAqLworCVhUX1BVVFBBR0UobXApOworCisJcHJpbnRrKCJ0cmF2ZXJzZSBkb3duIDB4JWx4WyVkXS0+MHglbHhcbiIsICh1bG9uZykgcGJuLCBpbmRleCwKKwkgICAgICAgKHVsb25nKSBibik7CisJdisrOworCWggPSBpbmRleDsKKworCS8qIHByb2Nlc3MgdGhlIGNoaWxkIHBhZ2UgKi8KKwlnb3RvIGdldFBhZ2U7Cit9CisKKworLyoKKyAqICAgICAgeHREaXNwbGF5UGFnZSgpCisgKgorICogZnVuY3Rpb246IGRpc3BsYXkgcGFnZQorICovCitpbnQgeHREaXNwbGF5UGFnZShzdHJ1Y3QgaW5vZGUgKmlwLCBzNjQgYm4sIHh0cGFnZV90ICogcCkKK3sKKwlpbnQgcmMgPSAwOworCXhhZF90ICp4YWQ7CisJczY0IHhhZGRyLCB4b2ZmOworCWludCB4bGVuLCBpLCBqOworCisJLyogZGlzcGxheSBwYWdlIGNvbnRyb2wgKi8KKwlwcmludGYoImJuOjB4JWx4IGZsYWc6MHgleCBuZXh0aW5kZXg6JWRcbiIsCisJICAgICAgICh1bG9uZykgYm4sIHAtPmhlYWRlci5mbGFnLAorCSAgICAgICBsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KSk7CisKKwkvKiBkaXNwbGF5IGVudHJpZXMgKi8KKwl4YWQgPSAmcC0+eGFkW1hURU5UUllTVEFSVF07CisJCWZvciAoaSA9IFhURU5UUllTVEFSVCwgaiA9IDE7IGkgPCBsZTE2X3RvX2NwdShwLT5oZWFkZXIubmV4dGluZGV4KTsKKwkJICAgICBpKyssIHhhZCsrLCBqKyspIHsKKwkJCXhvZmYgPSBvZmZzZXRYQUQoeGFkKTsKKwkJCXhhZGRyID0gYWRkcmVzc1hBRCh4YWQpOworCQkJeGxlbiA9IGxlbmd0aFhBRCh4YWQpOworCQkJcHJpbnRmKCJcdFslZF0gMHglbHg6MHglbHgoMHgleCkiLCBpLCAodWxvbmcpIHhvZmYsCisJCQkgICAgICAgKHVsb25nKSB4YWRkciwgeGxlbik7CisKKwkJCWlmIChqID09IDQpIHsKKwkJCQlwcmludGYoIlxuIik7CisJCQkJaiA9IDA7CisJCX0KKwl9CisKKwlwcmludGYoIlxuIik7Cit9CisjZW5kaWYJCQkJLyogX0pGU19ERUJVR19YVFJFRSAqLworCisKKyNpZmRlZiBfSkZTX1dJUAorLyoKKyAqICAgICAgeHRHYXRoZXIoKQorICoKKyAqIGZ1bmN0aW9uOgorICogICAgICB0cmF2ZXJzZSBmb3IgYWxsb2NhdGlvbiBhY3F1aXJpbmcgdGxvY2sgYXQgY29tbWl0IHRpbWUKKyAqICAgICAgKHZzIGF0IHRoZSB0aW1lIG9mIHVwZGF0ZSkgbG9nZ2luZyBiYWNrd2FyZCB0b3AgZG93bgorICoKKyAqIG5vdGU6CisgKiAgICAgIHByb2JsZW0gLSBlc3RhYmxpc2hpbmcgdGhhdCBhbGwgbmV3IGFsbG9jYXRpb24gaGF2ZSBiZWVuCisgKiAgICAgIHByb2Nlc3NlZCBib3RoIGZvciBhcHBlbmQgYW5kIHJhbmRvbSB3cml0ZSBpbiBzcGFyc2UgZmlsZQorICogICAgICBhdCB0aGUgY3VycmVudCBlbnRyeSBhdCB0aGUgY3VycmVudCBzdWJ0cmVlIHJvb3QgcGFnZQorICoKKyAqLworaW50IHh0R2F0aGVyKGJ0cmVlX3QgKnQpCit7CisJaW50IHJjID0gMDsKKwl4dHBhZ2VfdCAqcDsKKwl1NjQgYm47CisJaW50IGluZGV4OworCWJ0ZW50cnlfdCAqZTsKKwlzdHJ1Y3QgYnRzdGFjayBidHN0YWNrOworCXN0cnVjdCBidHNmICpwYXJlbnQ7CisKKwkvKiBjbGVhciBzdGFjayAqLworCUJUX0NMUigmYnRzdGFjayk7CisKKwkvKgorCSAqIHN0YXJ0IHdpdGggcm9vdAorCSAqCisJICogcm9vdCByZXNpZGVzIGluIHRoZSBpbm9kZQorCSAqLworCWJuID0gMDsKKwlYVF9HRVRQQUdFKGlwLCBibiwgbXAsIFBTSVpFLCBwLCByYyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwkvKiBuZXcgcm9vdCBpcyBOT1QgcG9pbnRlZCBieSBhIG5ldyBlbnRyeQorCSAgIGlmIChwLT5oZWFkZXIuZmxhZyAmIE5FVykKKwkgICBhbGxvY2F0ZSBuZXcgcGFnZSBsb2NrOworCSAgIHdyaXRlIGEgTkVXUEFHRSBsb2c7CisJICovCisKKyAgICAgIGRvcGFnZToKKwkvKgorCSAqIGZpcnN0IGFjY2VzcyBvZiBlYWNoIHBhZ2U6CisJICovCisJLyogcHJvY2VzcyBlbnRyaWVzIGJhY2t3YXJkIGZyb20gbGFzdCBpbmRleCAqLworCWluZGV4ID0gbGUxNl90b19jcHUocC0+aGVhZGVyLm5leHRpbmRleCkgLSAxOworCisJaWYgKHAtPmhlYWRlci5mbGFnICYgQlRfTEVBRikgeworCQkvKgorCQkgKiBmaXJzdCBhY2Nlc3Mgb2YgZWFjaCBsZWFmIHBhZ2UKKwkJICovCisJCS8qIHByb2Nlc3MgbGVhZiBwYWdlIGVudHJpZXMgYmFja3dhcmQgKi8KKwkJZm9yICg7IGluZGV4ID49IFhURU5UUllTVEFSVDsgaW5kZXgtLSkgeworCQkJZSA9ICZwLT54YWRbaW5kZXhdOworCQkJLyoKKwkJCSAqIGlmIG5ld3BhZ2UsIGxvZyBORVdQQUdFLgorCQkJICoKKwkJCSBpZiAoZS0+ZmxhZyAmIFhBRF9ORVcpIHsKKwkJCSBuZm91bmQgPSsgZW50cnktPmxlbmd0aDsKKwkJCSB1cGRhdGUgY3VycmVudCBwYWdlIGxvY2sgZm9yIHRoZSBlbnRyeTsKKwkJCSBuZXdwYWdlKGVudHJ5KTsKKwkJCSAqCisJCQkgKiBpZiBtb3ZlZCwgbG9nIG1vdmUuCisJCQkgKgorCQkJIH0gZWxzZSBpZiAoZS0+ZmxhZyAmIFhBRF9NT1ZFRCkgeworCQkJIHJlc2V0IGZsYWc7CisJCQkgdXBkYXRlIGN1cnJlbnQgcGFnZSBsb2NrIGZvciB0aGUgZW50cnk7CisJCQkgfQorCQkJICovCisJCX0KKworCQkvKiB1bnBpbiB0aGUgbGVhZiBwYWdlICovCisJCVhUX1BVVFBBR0UobXApOworCisJCS8qCisJCSAqIGdvIGJhY2sgdXAgdG8gdGhlIHBhcmVudCBwYWdlCisJCSAqLworCSAgICAgIGdldFBhcmVudDoKKwkJLyogcmVzdG9yZSBwYXJlbnQgZW50cnkgZm9yIHRoZSBjdXJyZW50IGNoaWxkIHBhZ2UgKi8KKwkJaWYgKChwYXJlbnQgPSBCVF9QT1AoJmJ0c3RhY2spKSA9PSBOVUxMKQorCQkJLyogY3VycmVudCBwYWdlIG11c3QgaGF2ZSBiZWVuIHJvb3QgKi8KKwkJCXJldHVybiAwOworCisJCWlmICgoaW5kZXggPSBwYXJlbnQtPmluZGV4KSA9PSBYVEVOVFJZU1RBUlQpIHsKKwkJCS8qCisJCQkgKiBwYXJlbnQgcGFnZSBzY2FuIGNvbXBsZXRlZAorCQkJICovCisJCQkvKiBnbyBiYWNrIHVwIHRvIHRoZSBwYXJlbnQgcGFnZSAqLworCQkJZ290byBnZXRQYXJlbnQ7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogcGFyZW50IHBhZ2UgaGFzIGVudHJpZXMgcmVtYWluaW5nCisJCQkgKi8KKwkJCS8qIGdldCBiYWNrIHRoZSBwYXJlbnQgcGFnZSAqLworCQkJYm4gPSBwYXJlbnQtPmJuOworCQkJWFRfR0VUUEFHRShpcCwgYm4sIG1wLCBQU0laRSwgcCwgcmMpOworCQkJaWYgKHJjKQorCQkJCXJldHVybiAtRUlPOworCisJCQkvKiBmaXJzdCBzdWJyb290IHBhZ2Ugd2hpY2gKKwkJCSAqIGNvdmVycyBhbGwgbmV3IGFsbG9jYXRlZCBibG9ja3MKKwkJCSAqIGl0c2VsZiBub3QgbmV3L21vZGlmaWVkLgorCQkJICogKGlmIG1vZGlmaWVkIGZyb20gc3BsaXQgb2YgZGVzY2VuZGVudCwKKwkJCSAqIGdvIGRvd24gcGF0aCBvZiBzcGxpdCBwYWdlKQorCisJCQkgaWYgKG5mb3VuZCA9PSBubmV3ICYmCisJCQkgIShwLT5oZWFkZXIuZmxhZyAmIChORVcgfCBNT0QpKSkKKwkJCSBleGl0IHNjYW47CisJCQkgKi8KKworCQkJLyogcHJvY2VzcyBwYXJlbnQgcGFnZSBlbnRyaWVzIGJhY2t3YXJkICovCisJCQlpbmRleC0tOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogZmlyc3QgYWNjZXNzIG9mIGVhY2ggaW50ZXJuYWwgcGFnZQorCQkgKi8KKwl9CisKKwkvKgorCSAqIGludGVybmFsIHBhZ2U6IGdvIGRvd24gdG8gY2hpbGQgcGFnZSBvZiBjdXJyZW50IGVudHJ5CisJICovCisKKwkvKiBzYXZlIGN1cnJlbnQgcGFyZW50IGVudHJ5IGZvciB0aGUgY2hpbGQgcGFnZSAqLworCUJUX1BVU0goJmJ0c3RhY2ssIGJuLCBpbmRleCk7CisKKwkvKiBnZXQgY3VycmVudCBlbnRyeSBmb3IgdGhlIGNoaWxkIHBhZ2UgKi8KKwllID0gJnAtPnhhZFtpbmRleF07CisKKwkvKgorCSAqIGZpcnN0IGFjY2VzcyBvZiBlYWNoIGludGVybmFsIGVudHJ5OgorCSAqLworCS8qCisJICogaWYgbmV3IGVudHJ5LCBsb2cgYnRyZWVfdG5ld2VudHJ5LgorCSAqCisJIGlmIChlLT5mbGFnICYgWEFEX05FVykKKwkgdXBkYXRlIHBhcmVudCBwYWdlIGxvY2sgZm9yIHRoZSBlbnRyeTsKKwkgKi8KKworCS8qIHJlbGVhc2UgcGFyZW50IHBhZ2UgKi8KKwlYVF9QVVRQQUdFKG1wKTsKKworCS8qIGdldCBjaGlsZCBwYWdlICovCisJYm4gPSBlLT5ibjsKKwlYVF9HRVRQQUdFKGlwLCBibiwgbXAsIFBTSVpFLCBwLCByYyk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwkvKgorCSAqIGZpcnN0IGFjY2VzcyBvZiBlYWNoIG5vbi1yb290IHBhZ2U6CisJICovCisJLyoKKwkgKiBpZiBuZXcsIGxvZyBidHJlZV9uZXdwYWdlLgorCSAqCisJIGlmIChwLT5oZWFkZXIuZmxhZyAmIE5FVykKKwkgYWxsb2NhdGUgbmV3IHBhZ2UgbG9jazsKKwkgd3JpdGUgYSBORVdQQUdFIGxvZyAobmV4dCwgcHJldik7CisJICovCisKKwkvKiBwcm9jZXNzIHRoZSBjaGlsZCBwYWdlICovCisJZ290byBkb3BhZ2U7CisKKyAgICAgIG91dDoKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgkJCQkvKiBfSkZTX1dJUCAqLworCisKKyNpZmRlZiBDT05GSUdfSkZTX1NUQVRJU1RJQ1MKK2ludCBqZnNfeHRzdGF0X3JlYWQoY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCwKKwkJICAgIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWludCBsZW4gPSAwOworCW9mZl90IGJlZ2luOworCisJbGVuICs9IHNwcmludGYoYnVmZmVyLAorCQkgICAgICAgIkpGUyBYdHJlZSBzdGF0aXN0aWNzXG4iCisJCSAgICAgICAiPT09PT09PT09PT09PT09PT09PT1cbiIKKwkJICAgICAgICJzZWFyY2hlcyA9ICVkXG4iCisJCSAgICAgICAiZmFzdCBzZWFyY2hlcyA9ICVkXG4iCisJCSAgICAgICAic3BsaXRzID0gJWRcbiIsCisJCSAgICAgICB4dFN0YXQuc2VhcmNoLAorCQkgICAgICAgeHRTdGF0LmZhc3RTZWFyY2gsCisJCSAgICAgICB4dFN0YXQuc3BsaXQpOworCisJYmVnaW4gPSBvZmZzZXQ7CisJKnN0YXJ0ID0gYnVmZmVyICsgYmVnaW47CisJbGVuIC09IGJlZ2luOworCisJaWYgKGxlbiA+IGxlbmd0aCkKKwkJbGVuID0gbGVuZ3RoOworCWVsc2UKKwkJKmVvZiA9IDE7CisKKwlpZiAobGVuIDwgMCkKKwkJbGVuID0gMDsKKworCXJldHVybiBsZW47Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2pmcy9qZnNfeHRyZWUuaCBiL2ZzL2pmcy9qZnNfeHRyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjk3ODQyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvamZzL2pmc194dHJlZS5oCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogICBDb3B5cmlnaHQgKGMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDAtMjAwMgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7ICB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIAorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICogCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7ICB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlCisgKiAgIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07ICBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIAorICogICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaWZuZGVmIF9IX0pGU19YVFJFRQorI2RlZmluZSBfSF9KRlNfWFRSRUUKKworLyoKKyAqICAgICAgamZzX3h0cmVlLmg6IGV4dGVudCBhbGxvY2F0aW9uIGRlc2NyaXB0b3IgQistdHJlZSBtYW5hZ2VyCisgKi8KKworI2luY2x1ZGUgImpmc19idHJlZS5oIgorCisKKy8qCisgKiAgICAgIGV4dGVudCBhbGxvY2F0aW9uIGRlc2NyaXB0b3IgKHhhZCkKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGFkIHsKKwl1bnNpZ25lZCBmbGFnOjg7CS8qIDE6IGZsYWcgKi8KKwl1bnNpZ25lZCByc3ZyZDoxNjsJLyogMjogcmVzZXJ2ZWQgKi8KKwl1bnNpZ25lZCBvZmYxOjg7CS8qIDE6IG9mZnNldCBpbiB1bml0IG9mIGZzYmxrc2l6ZSAqLworCV9fbGUzMiBvZmYyOwkJLyogNDogb2Zmc2V0IGluIHVuaXQgb2YgZnNibGtzaXplICovCisJdW5zaWduZWQgbGVuOjI0OwkvKiAzOiBsZW5ndGggaW4gdW5pdCBvZiBmc2Jsa3NpemUgKi8KKwl1bnNpZ25lZCBhZGRyMTo4OwkvKiAxOiBhZGRyZXNzIGluIHVuaXQgb2YgZnNibGtzaXplICovCisJX19sZTMyIGFkZHIyOwkJLyogNDogYWRkcmVzcyBpbiB1bml0IG9mIGZzYmxrc2l6ZSAqLworfSB4YWRfdDsJCQkvKiAoMTYpICovCisKKyNkZWZpbmUgTUFYWExFTiAgICAgICAgICgoMSA8PCAyNCkgLSAxKQorCisjZGVmaW5lIFhUU0xPVFNJWkUgICAgICAxNgorI2RlZmluZSBMMlhUU0xPVFNJWkUgICAgNAorCisvKiB4YWRfdCBmaWVsZCBjb25zdHJ1Y3Rpb24gKi8KKyNkZWZpbmUgWEFEb2Zmc2V0KHhhZCwgb2Zmc2V0NjQpXAore1wKKyAgICAgICAgKHhhZCktPm9mZjEgPSAoKHU2NClvZmZzZXQ2NCkgPj4gMzI7XAorICAgICAgICAoeGFkKS0+b2ZmMiA9IF9fY3B1X3RvX2xlMzIoKG9mZnNldDY0KSAmIDB4ZmZmZmZmZmYpO1wKK30KKyNkZWZpbmUgWEFEYWRkcmVzcyh4YWQsIGFkZHJlc3M2NClcCit7XAorICAgICAgICAoeGFkKS0+YWRkcjEgPSAoKHU2NClhZGRyZXNzNjQpID4+IDMyO1wKKyAgICAgICAgKHhhZCktPmFkZHIyID0gX19jcHVfdG9fbGUzMigoYWRkcmVzczY0KSAmIDB4ZmZmZmZmZmYpO1wKK30KKyNkZWZpbmUgWEFEbGVuZ3RoKHhhZCwgbGVuZ3RoMzIpICAgICAgICAoeGFkKS0+bGVuID0gX19jcHVfdG9fbGUyNChsZW5ndGgzMikKKworLyogeGFkX3QgZmllbGQgZXh0cmFjdGlvbiAqLworI2RlZmluZSBvZmZzZXRYQUQoeGFkKVwKKyAgICAgICAgKCAoKHM2NCkoKHhhZCktPm9mZjEpKSA8PCAzMiB8IF9fbGUzMl90b19jcHUoKHhhZCktPm9mZjIpKQorI2RlZmluZSBhZGRyZXNzWEFEKHhhZClcCisgICAgICAgICggKChzNjQpKCh4YWQpLT5hZGRyMSkpIDw8IDMyIHwgX19sZTMyX3RvX2NwdSgoeGFkKS0+YWRkcjIpKQorI2RlZmluZSBsZW5ndGhYQUQoeGFkKSAgX19sZTI0X3RvX2NwdSgoeGFkKS0+bGVuKQorCisvKiB4YWQgbGlzdCAqLworc3RydWN0IHhhZGxpc3QgeworCXMxNiBtYXhueGFkOworCXMxNiBueGFkOworCXhhZF90ICp4YWQ7Cit9OworCisvKiB4YWRfdCBmbGFncyAqLworI2RlZmluZSBYQURfTkVXICAgICAgICAgMHgwMQkvKiBuZXcgKi8KKyNkZWZpbmUgWEFEX0VYVEVOREVEICAgIDB4MDIJLyogZXh0ZW5kZWQgKi8KKyNkZWZpbmUgWEFEX0NPTVBSRVNTRUQgIDB4MDQJLyogY29tcHJlc3NlZCB3aXRoIHJlY29yZGVkIGxlbmd0aCAqLworI2RlZmluZSBYQURfTk9UUkVDT1JERUQgMHgwOAkvKiBhbGxvY2F0ZWQgYnV0IG5vdCByZWNvcmRlZCAqLworI2RlZmluZSBYQURfQ09XICAgICAgICAgMHgxMAkvKiBjb3B5LW9uLXdyaXRlICovCisKKworLyogcG9zc2libGUgdmFsdWVzIGZvciBtYXhlbnRyeSAqLworI2RlZmluZSBYVFJPT1RJTklUU0xPVF9ESVIgIDYKKyNkZWZpbmUgWFRST09USU5JVFNMT1QgIDEwCisjZGVmaW5lIFhUUk9PVE1BWFNMT1QgICAxOAorI2RlZmluZSBYVFBBR0VNQVhTTE9UICAgMjU2CisjZGVmaW5lIFhURU5UUllTVEFSVCAgICAyCisKKy8qCisgKiAgICAgIHh0cmVlIHBhZ2U6CisgKi8KK3R5cGVkZWYgdW5pb24geworCXN0cnVjdCB4dGhlYWRlciB7CisJCV9fbGU2NCBuZXh0OwkvKiA4OiAqLworCQlfX2xlNjQgcHJldjsJLyogODogKi8KKworCQl1OCBmbGFnOwkvKiAxOiAqLworCQl1OCByc3J2ZDE7CS8qIDE6ICovCisJCV9fbGUxNiBuZXh0aW5kZXg7CS8qIDI6IG5leHQgaW5kZXggPSBudW1iZXIgb2YgZW50cmllcyAqLworCQlfX2xlMTYgbWF4ZW50cnk7CS8qIDI6IG1heCBudW1iZXIgb2YgZW50cmllcyAqLworCQlfX2xlMTYgcnNydmQyOwkvKiAyOiAqLworCisJCXB4ZF90IHNlbGY7CS8qIDg6IHNlbGYgKi8KKwl9IGhlYWRlcjsJCS8qICgzMikgKi8KKworCXhhZF90IHhhZFtYVFJPT1RNQVhTTE9UXTsJLyogMTYgKiBtYXhlbnRyeTogeGFkIGFycmF5ICovCit9IHh0cGFnZV90OworCisvKgorICogICAgICBleHRlcm5hbCBkZWNsYXJhdGlvbgorICovCitleHRlcm4gaW50IHh0TG9va3VwKHN0cnVjdCBpbm9kZSAqaXAsIHM2NCBsc3RhcnQsIHM2NCBsbGVuLAorCQkgICAgaW50ICpwZmxhZywgczY0ICogcGFkZHIsIGludCAqcGxlbiwgaW50IGZsYWcpOworZXh0ZXJuIGludCB4dExvb2t1cExpc3Qoc3RydWN0IGlub2RlICppcCwgc3RydWN0IGx4ZGxpc3QgKiBseGRsaXN0LAorCQkJc3RydWN0IHhhZGxpc3QgKiB4YWRsaXN0LCBpbnQgZmxhZyk7CitleHRlcm4gdm9pZCB4dEluaXRSb290KHRpZF90IHRpZCwgc3RydWN0IGlub2RlICppcCk7CitleHRlcm4gaW50IHh0SW5zZXJ0KHRpZF90IHRpZCwgc3RydWN0IGlub2RlICppcCwKKwkJICAgIGludCB4ZmxhZywgczY0IHhvZmYsIGludCB4bGVuLCBzNjQgKiB4YWRkcnAsIGludCBmbGFnKTsKK2V4dGVybiBpbnQgeHRFeHRlbmQodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLCBzNjQgeG9mZiwgaW50IHhsZW4sCisJCSAgICBpbnQgZmxhZyk7CisjaWZkZWYgX05PVFlFVAorZXh0ZXJuIGludCB4dFRhaWxnYXRlKHRpZF90IHRpZCwgc3RydWN0IGlub2RlICppcCwKKwkJICAgICAgczY0IHhvZmYsIGludCB4bGVuLCBzNjQgeGFkZHIsIGludCBmbGFnKTsKKyNlbmRpZgorZXh0ZXJuIGludCB4dFVwZGF0ZSh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCB4YWQgKm54YWQpOworZXh0ZXJuIGludCB4dERlbGV0ZSh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsIHM2NCB4b2ZmLCBpbnQgeGxlbiwKKwkJICAgIGludCBmbGFnKTsKK2V4dGVybiBzNjQgeHRUcnVuY2F0ZSh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsIHM2NCBuZXdzaXplLCBpbnQgdHlwZSk7CitleHRlcm4gczY0IHh0VHJ1bmNhdGVfcG1hcCh0aWRfdCB0aWQsIHN0cnVjdCBpbm9kZSAqaXAsIHM2NCBjb21taXR0ZWRfc2l6ZSk7CitleHRlcm4gaW50IHh0UmVsb2NhdGUodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwLAorCQkgICAgICB4YWRfdCAqIG94YWQsIHM2NCBueGFkZHIsIGludCB4dHlwZSk7CitleHRlcm4gaW50IHh0QXBwZW5kKHRpZF90IHRpZCwKKwkJICAgIHN0cnVjdCBpbm9kZSAqaXAsIGludCB4ZmxhZywgczY0IHhvZmYsIGludCBtYXhibG9ja3MsCisJCSAgICBpbnQgKnhsZW5wLCBzNjQgKiB4YWRkcnAsIGludCBmbGFnKTsKKworI2lmZGVmICBfSkZTX0RFQlVHX1hUUkVFCitleHRlcm4gaW50IHh0RGlzcGxheVRyZWUoc3RydWN0IGlub2RlICppcCk7CitleHRlcm4gaW50IHh0RGlzcGxheVBhZ2Uoc3RydWN0IGlub2RlICppcCwgczY0IGJuLCB4dHBhZ2VfdCAqIHApOworI2VuZGlmCQkJCS8qIF9KRlNfREVCVUdfWFRSRUUgKi8KKworI2VuZGlmCQkJCS8qICFfSF9KRlNfWFRSRUUgKi8KZGlmZiAtLWdpdCBhL2ZzL2pmcy9uYW1laS5jIGIvZnMvamZzL25hbWVpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQxM2EzNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmcy9uYW1laS5jCkBAIC0wLDAgKzEsMTU0MCBAQAorLyoKKyAqICAgQ29weXJpZ2h0IChDKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnAuLCAyMDAwLTIwMDQKKyAqICAgUG9ydGlvbnMgQ29weXJpZ2h0IChDKSBDaHJpc3RvcGggSGVsbHdpZywgMjAwMS0yMDAyCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorI2luY2x1ZGUgImpmc19pbmNvcmUuaCIKKyNpbmNsdWRlICJqZnNfc3VwZXJibG9jay5oIgorI2luY2x1ZGUgImpmc19pbm9kZS5oIgorI2luY2x1ZGUgImpmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJqZnNfZG1hcC5oIgorI2luY2x1ZGUgImpmc191bmljb2RlLmgiCisjaW5jbHVkZSAiamZzX21ldGFwYWdlLmgiCisjaW5jbHVkZSAiamZzX3hhdHRyLmgiCisjaW5jbHVkZSAiamZzX2FjbC5oIgorI2luY2x1ZGUgImpmc19kZWJ1Zy5oIgorCitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgamZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBqZnNfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgamZzX2ZpbGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGpmc19hb3BzOworCitleHRlcm4gaW50IGpmc19mc3luYyhzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCk7CitleHRlcm4gdm9pZCBqZnNfdHJ1bmNhdGVfbm9sb2NrKHN0cnVjdCBpbm9kZSAqLCBsb2ZmX3QpOworZXh0ZXJuIGludCBqZnNfaW5pdF9hY2woc3RydWN0IGlub2RlICosIHN0cnVjdCBpbm9kZSAqKTsKKworLyoKKyAqIGZvcndhcmQgcmVmZXJlbmNlcworICovCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBqZnNfZGlyX2lub2RlX29wZXJhdGlvbnM7CitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGpmc19kaXJfb3BlcmF0aW9uczsKK3N0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBqZnNfY2lfZGVudHJ5X29wZXJhdGlvbnM7CisKK3N0YXRpYyBzNjQgY29tbWl0WmVyb0xpbmsodGlkX3QsIHN0cnVjdCBpbm9kZSAqKTsKKworLyoKKyAqIE5BTUU6CWpmc19jcmVhdGUoZGlwLCBkZW50cnksIG1vZGUpCisgKgorICogRlVOQ1RJT046CWNyZWF0ZSBhIHJlZ3VsYXIgZmlsZSBpbiB0aGUgcGFyZW50IGRpcmVjdG9yeSA8ZGlwPgorICoJCXdpdGggbmFtZSA9IDxmcm9tIGRlbnRyeT4gYW5kIG1vZGUgPSA8bW9kZT4KKyAqCisgKiBQQVJBTUVURVI6CWRpcCAJLSBwYXJlbnQgZGlyZWN0b3J5IHZub2RlCisgKgkJZGVudHJ5CS0gZGVudHJ5IG9mIG5ldyBmaWxlCisgKgkJbW9kZQktIGNyZWF0ZSBtb2RlIChyd3hyd3hyd3gpLgorICoJCW5kLSBuZCBzdHJ1Y3QKKyAqCisgKiBSRVRVUk46CUVycm9ycyBmcm9tIHN1YnJvdXRpbmVzCisgKgorICovCitzdGF0aWMgaW50IGpmc19jcmVhdGUoc3RydWN0IGlub2RlICpkaXAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsCisJCXN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWludCByYyA9IDA7CisJdGlkX3QgdGlkOwkJLyogdHJhbnNhY3Rpb24gaWQgKi8KKwlzdHJ1Y3QgaW5vZGUgKmlwID0gTlVMTDsJLyogY2hpbGQgZGlyZWN0b3J5IGlub2RlICovCisJaW5vX3QgaW5vOworCXN0cnVjdCBjb21wb25lbnRfbmFtZSBkbmFtZTsJLyogY2hpbGQgZGlyZWN0b3J5IG5hbWUgKi8KKwlzdHJ1Y3QgYnRzdGFjayBidHN0YWNrOworCXN0cnVjdCBpbm9kZSAqaXBsaXN0WzJdOworCXN0cnVjdCB0YmxvY2sgKnRibGs7CisKKwlqZnNfaW5mbygiamZzX2NyZWF0ZTogZGlwOjB4JXAgbmFtZTolcyIsIGRpcCwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwkvKgorCSAqIHNlYXJjaCBwYXJlbnQgZGlyZWN0b3J5IGZvciBlbnRyeS9mcmVlc3BhY2UKKwkgKiAoZHRTZWFyY2goKSByZXR1cm5zIHBhcmVudCBkaXJlY3RvcnkgcGFnZSBwaW5uZWQpCisJICovCisJaWYgKChyYyA9IGdldF9VQ1NuYW1lKCZkbmFtZSwgZGVudHJ5KSkpCisJCWdvdG8gb3V0MTsKKworCS8qCisJICogRWl0aGVyIGlBbGxvYygpIG9yIHR4QmVnaW4oKSBtYXkgYmxvY2suICBEZWFkbG9jayBjYW4gb2NjdXIgaWYgd2UKKwkgKiBibG9jayB0aGVyZSB3aGlsZSBob2xkaW5nIGR0cmVlIHBhZ2UsIHNvIHdlIGFsbG9jYXRlIHRoZSBpbm9kZSAmCisJICogYmVnaW4gdGhlIHRyYW5zYWN0aW9uIGJlZm9yZSB3ZSBzZWFyY2ggdGhlIGRpcmVjdG9yeS4KKwkgKi8KKwlpcCA9IGlhbGxvYyhkaXAsIG1vZGUpOworCWlmIChpcCA9PSBOVUxMKSB7CisJCXJjID0gLUVOT1NQQzsKKwkJZ290byBvdXQyOworCX0KKworCXRpZCA9IHR4QmVnaW4oZGlwLT5pX3NiLCAwKTsKKworCWRvd24oJkpGU19JUChkaXApLT5jb21taXRfc2VtKTsKKwlkb3duKCZKRlNfSVAoaXApLT5jb21taXRfc2VtKTsKKworCWlmICgocmMgPSBkdFNlYXJjaChkaXAsICZkbmFtZSwgJmlubywgJmJ0c3RhY2ssIEpGU19DUkVBVEUpKSkgeworCQlqZnNfZXJyKCJqZnNfY3JlYXRlOiBkdFNlYXJjaCByZXR1cm5lZCAlZCIsIHJjKTsKKwkJZ290byBvdXQzOworCX0KKworCXRibGsgPSB0aWRfdG9fdGJsb2NrKHRpZCk7CisJdGJsay0+eGZsYWcgfD0gQ09NTUlUX0NSRUFURTsKKwl0YmxrLT5pbm8gPSBpcC0+aV9pbm87CisJdGJsay0+dS5peHB4ZCA9IEpGU19JUChpcCktPml4cHhkOworCisJaXBsaXN0WzBdID0gZGlwOworCWlwbGlzdFsxXSA9IGlwOworCisJLyoKKwkgKiBpbml0aWFsaXplIHRoZSBjaGlsZCBYQUQgdHJlZSByb290IGluLWxpbmUgaW4gaW5vZGUKKwkgKi8KKwl4dEluaXRSb290KHRpZCwgaXApOworCisJLyoKKwkgKiBjcmVhdGUgZW50cnkgaW4gcGFyZW50IGRpcmVjdG9yeSBmb3IgY2hpbGQgZGlyZWN0b3J5CisJICogKGR0SW5zZXJ0KCkgcmVsZWFzZXMgcGFyZW50IGRpcmVjdG9yeSBwYWdlKQorCSAqLworCWlubyA9IGlwLT5pX2lubzsKKwlpZiAoKHJjID0gZHRJbnNlcnQodGlkLCBkaXAsICZkbmFtZSwgJmlubywgJmJ0c3RhY2spKSkgeworCQlpZiAocmMgPT0gLUVJTykgeworCQkJamZzX2VycigiamZzX2NyZWF0ZTogZHRJbnNlcnQgcmV0dXJuZWQgLUVJTyIpOworCQkJdHhBYm9ydCh0aWQsIDEpOwkvKiBNYXJrcyBGaWxlc3lzdGVtIGRpcnR5ICovCisJCX0gZWxzZQorCQkJdHhBYm9ydCh0aWQsIDApOwkvKiBGaWxlc3lzdGVtIGZ1bGwgKi8KKwkJZ290byBvdXQzOworCX0KKworCWlwLT5pX29wID0gJmpmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CisJaXAtPmlfZm9wID0gJmpmc19maWxlX29wZXJhdGlvbnM7CisJaXAtPmlfbWFwcGluZy0+YV9vcHMgPSAmamZzX2FvcHM7CisKKwlpbnNlcnRfaW5vZGVfaGFzaChpcCk7CisJbWFya19pbm9kZV9kaXJ0eShpcCk7CisKKwlkaXAtPmlfY3RpbWUgPSBkaXAtPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUU7CisKKwltYXJrX2lub2RlX2RpcnR5KGRpcCk7CisKKwlyYyA9IHR4Q29tbWl0KHRpZCwgMiwgJmlwbGlzdFswXSwgMCk7CisKKyAgICAgIG91dDM6CisJdHhFbmQodGlkKTsKKwl1cCgmSkZTX0lQKGRpcCktPmNvbW1pdF9zZW0pOworCXVwKCZKRlNfSVAoaXApLT5jb21taXRfc2VtKTsKKwlpZiAocmMpIHsKKwkJaXAtPmlfbmxpbmsgPSAwOworCQlpcHV0KGlwKTsKKwl9IGVsc2UKKwkJZF9pbnN0YW50aWF0ZShkZW50cnksIGlwKTsKKworICAgICAgb3V0MjoKKwlmcmVlX1VDU25hbWUoJmRuYW1lKTsKKworI2lmZGVmIENPTkZJR19KRlNfUE9TSVhfQUNMCisJaWYgKHJjID09IDApCisJCWpmc19pbml0X2FjbChpcCwgZGlwKTsKKyNlbmRpZgorCisgICAgICBvdXQxOgorCisJamZzX2luZm8oImpmc19jcmVhdGU6IHJjOiVkIiwgcmMpOworCXJldHVybiByYzsKK30KKworCisvKgorICogTkFNRToJamZzX21rZGlyKGRpcCwgZGVudHJ5LCBtb2RlKQorICoKKyAqIEZVTkNUSU9OOgljcmVhdGUgYSBjaGlsZCBkaXJlY3RvcnkgaW4gdGhlIHBhcmVudCBkaXJlY3RvcnkgPGRpcD4KKyAqCQl3aXRoIG5hbWUgPSA8ZnJvbSBkZW50cnk+IGFuZCBtb2RlID0gPG1vZGU+CisgKgorICogUEFSQU1FVEVSOglkaXAgCS0gcGFyZW50IGRpcmVjdG9yeSB2bm9kZQorICoJCWRlbnRyeQktIGRlbnRyeSBvZiBjaGlsZCBkaXJlY3RvcnkKKyAqCQltb2RlCS0gY3JlYXRlIG1vZGUgKHJ3eHJ3eHJ3eCkuCisgKgorICogUkVUVVJOOglFcnJvcnMgZnJvbSBzdWJyb3V0aW5lcworICoKKyAqIG5vdGU6CisgKiBFQUNDRVNTOiB1c2VyIG5lZWRzIHNlYXJjaCt3cml0ZSBwZXJtaXNzaW9uIG9uIHRoZSBwYXJlbnQgZGlyZWN0b3J5CisgKi8KK3N0YXRpYyBpbnQgamZzX21rZGlyKHN0cnVjdCBpbm9kZSAqZGlwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlKQoreworCWludCByYyA9IDA7CisJdGlkX3QgdGlkOwkJLyogdHJhbnNhY3Rpb24gaWQgKi8KKwlzdHJ1Y3QgaW5vZGUgKmlwID0gTlVMTDsJLyogY2hpbGQgZGlyZWN0b3J5IGlub2RlICovCisJaW5vX3QgaW5vOworCXN0cnVjdCBjb21wb25lbnRfbmFtZSBkbmFtZTsJLyogY2hpbGQgZGlyZWN0b3J5IG5hbWUgKi8KKwlzdHJ1Y3QgYnRzdGFjayBidHN0YWNrOworCXN0cnVjdCBpbm9kZSAqaXBsaXN0WzJdOworCXN0cnVjdCB0YmxvY2sgKnRibGs7CisKKwlqZnNfaW5mbygiamZzX21rZGlyOiBkaXA6MHglcCBuYW1lOiVzIiwgZGlwLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCS8qIGxpbmsgY291bnQgb3ZlcmZsb3cgb24gcGFyZW50IGRpcmVjdG9yeSA/ICovCisJaWYgKGRpcC0+aV9ubGluayA9PSBKRlNfTElOS19NQVgpIHsKKwkJcmMgPSAtRU1MSU5LOworCQlnb3RvIG91dDE7CisJfQorCisJLyoKKwkgKiBzZWFyY2ggcGFyZW50IGRpcmVjdG9yeSBmb3IgZW50cnkvZnJlZXNwYWNlCisJICogKGR0U2VhcmNoKCkgcmV0dXJucyBwYXJlbnQgZGlyZWN0b3J5IHBhZ2UgcGlubmVkKQorCSAqLworCWlmICgocmMgPSBnZXRfVUNTbmFtZSgmZG5hbWUsIGRlbnRyeSkpKQorCQlnb3RvIG91dDE7CisKKwkvKgorCSAqIEVpdGhlciBpQWxsb2MoKSBvciB0eEJlZ2luKCkgbWF5IGJsb2NrLiAgRGVhZGxvY2sgY2FuIG9jY3VyIGlmIHdlCisJICogYmxvY2sgdGhlcmUgd2hpbGUgaG9sZGluZyBkdHJlZSBwYWdlLCBzbyB3ZSBhbGxvY2F0ZSB0aGUgaW5vZGUgJgorCSAqIGJlZ2luIHRoZSB0cmFuc2FjdGlvbiBiZWZvcmUgd2Ugc2VhcmNoIHRoZSBkaXJlY3RvcnkuCisJICovCisJaXAgPSBpYWxsb2MoZGlwLCBTX0lGRElSIHwgbW9kZSk7CisJaWYgKGlwID09IE5VTEwpIHsKKwkJcmMgPSAtRU5PU1BDOworCQlnb3RvIG91dDI7CisJfQorCisJdGlkID0gdHhCZWdpbihkaXAtPmlfc2IsIDApOworCisJZG93bigmSkZTX0lQKGRpcCktPmNvbW1pdF9zZW0pOworCWRvd24oJkpGU19JUChpcCktPmNvbW1pdF9zZW0pOworCisJaWYgKChyYyA9IGR0U2VhcmNoKGRpcCwgJmRuYW1lLCAmaW5vLCAmYnRzdGFjaywgSkZTX0NSRUFURSkpKSB7CisJCWpmc19lcnIoImpmc19ta2RpcjogZHRTZWFyY2ggcmV0dXJuZWQgJWQiLCByYyk7CisJCWdvdG8gb3V0MzsKKwl9CisKKwl0YmxrID0gdGlkX3RvX3RibG9jayh0aWQpOworCXRibGstPnhmbGFnIHw9IENPTU1JVF9DUkVBVEU7CisJdGJsay0+aW5vID0gaXAtPmlfaW5vOworCXRibGstPnUuaXhweGQgPSBKRlNfSVAoaXApLT5peHB4ZDsKKworCWlwbGlzdFswXSA9IGRpcDsKKwlpcGxpc3RbMV0gPSBpcDsKKworCS8qCisJICogaW5pdGlhbGl6ZSB0aGUgY2hpbGQgZGlyZWN0b3J5IGluLWxpbmUgaW4gaW5vZGUKKwkgKi8KKwlkdEluaXRSb290KHRpZCwgaXAsIGRpcC0+aV9pbm8pOworCisJLyoKKwkgKiBjcmVhdGUgZW50cnkgaW4gcGFyZW50IGRpcmVjdG9yeSBmb3IgY2hpbGQgZGlyZWN0b3J5CisJICogKGR0SW5zZXJ0KCkgcmVsZWFzZXMgcGFyZW50IGRpcmVjdG9yeSBwYWdlKQorCSAqLworCWlubyA9IGlwLT5pX2lubzsKKwlpZiAoKHJjID0gZHRJbnNlcnQodGlkLCBkaXAsICZkbmFtZSwgJmlubywgJmJ0c3RhY2spKSkgeworCQlpZiAocmMgPT0gLUVJTykgeworCQkJamZzX2VycigiamZzX21rZGlyOiBkdEluc2VydCByZXR1cm5lZCAtRUlPIik7CisJCQl0eEFib3J0KHRpZCwgMSk7CS8qIE1hcmtzIEZpbGVzeXN0ZW0gZGlydHkgKi8KKwkJfSBlbHNlCisJCQl0eEFib3J0KHRpZCwgMCk7CS8qIEZpbGVzeXN0ZW0gZnVsbCAqLworCQlnb3RvIG91dDM7CisJfQorCisJaXAtPmlfbmxpbmsgPSAyOwkvKiBmb3IgJy4nICovCisJaXAtPmlfb3AgPSAmamZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCWlwLT5pX2ZvcCA9ICZqZnNfZGlyX29wZXJhdGlvbnM7CisKKwlpbnNlcnRfaW5vZGVfaGFzaChpcCk7CisJbWFya19pbm9kZV9kaXJ0eShpcCk7CisKKwkvKiB1cGRhdGUgcGFyZW50IGRpcmVjdG9yeSBpbm9kZSAqLworCWRpcC0+aV9ubGluaysrOwkJLyogZm9yICcuLicgZnJvbSBjaGlsZCBkaXJlY3RvcnkgKi8KKwlkaXAtPmlfY3RpbWUgPSBkaXAtPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUU7CisJbWFya19pbm9kZV9kaXJ0eShkaXApOworCisJcmMgPSB0eENvbW1pdCh0aWQsIDIsICZpcGxpc3RbMF0sIDApOworCisgICAgICBvdXQzOgorCXR4RW5kKHRpZCk7CisJdXAoJkpGU19JUChkaXApLT5jb21taXRfc2VtKTsKKwl1cCgmSkZTX0lQKGlwKS0+Y29tbWl0X3NlbSk7CisJaWYgKHJjKSB7CisJCWlwLT5pX25saW5rID0gMDsKKwkJaXB1dChpcCk7CisJfSBlbHNlCisJCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpcCk7CisKKyAgICAgIG91dDI6CisJZnJlZV9VQ1NuYW1lKCZkbmFtZSk7CisKKyNpZmRlZiBDT05GSUdfSkZTX1BPU0lYX0FDTAorCWlmIChyYyA9PSAwKQorCQlqZnNfaW5pdF9hY2woaXAsIGRpcCk7CisjZW5kaWYKKworICAgICAgb3V0MToKKworCWpmc19pbmZvKCJqZnNfbWtkaXI6IHJjOiVkIiwgcmMpOworCXJldHVybiByYzsKK30KKworLyoKKyAqIE5BTUU6CWpmc19ybWRpcihkaXAsIGRlbnRyeSkKKyAqCisgKiBGVU5DVElPTjoJcmVtb3ZlIGEgbGluayB0byBjaGlsZCBkaXJlY3RvcnkKKyAqCisgKiBQQVJBTUVURVI6CWRpcCAJLSBwYXJlbnQgaW5vZGUKKyAqCQlkZW50cnkJLSBjaGlsZCBkaXJlY3RvcnkgZGVudHJ5CisgKgorICogUkVUVVJOOgktRUlOVkFMCS0gaWYgbmFtZSBpcyAuIG9yIC4uCisgKgkJLUVJTlZBTCAgLSBpZiAuIG9yIC4uIGV4aXN0IGJ1dCBhcmUgaW52YWxpZC4KKyAqCQllcnJvcnMgZnJvbSBzdWJyb3V0aW5lcworICoKKyAqIG5vdGU6CisgKiBpZiBvdGhlciB0aHJlYWRzIGhhdmUgdGhlIGRpcmVjdG9yeSBvcGVuIHdoZW4gdGhlIGxhc3QgbGluayAKKyAqIGlzIHJlbW92ZWQsIHRoZSAiLiIgYW5kICIuLiIgZW50cmllcywgaWYgcHJlc2VudCwgYXJlIHJlbW92ZWQgYmVmb3JlIAorICogcm1kaXIoKSByZXR1cm5zIGFuZCBubyBuZXcgZW50cmllcyBtYXkgYmUgY3JlYXRlZCBpbiB0aGUgZGlyZWN0b3J5LCAKKyAqIGJ1dCB0aGUgZGlyZWN0b3J5IGlzIG5vdCByZW1vdmVkIHVudGlsIHRoZSBsYXN0IHJlZmVyZW5jZSB0byAKKyAqIHRoZSBkaXJlY3RvcnkgaXMgcmVsZWFzZWQgKGNmLnVubGluaygpIG9mIHJlZ3VsYXIgZmlsZSkuCisgKi8KK3N0YXRpYyBpbnQgamZzX3JtZGlyKHN0cnVjdCBpbm9kZSAqZGlwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJaW50IHJjOworCXRpZF90IHRpZDsJCS8qIHRyYW5zYWN0aW9uIGlkICovCisJc3RydWN0IGlub2RlICppcCA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbm9fdCBpbm87CisJc3RydWN0IGNvbXBvbmVudF9uYW1lIGRuYW1lOworCXN0cnVjdCBpbm9kZSAqaXBsaXN0WzJdOworCXN0cnVjdCB0YmxvY2sgKnRibGs7CisKKwlqZnNfaW5mbygiamZzX3JtZGlyOiBkaXA6MHglcCBuYW1lOiVzIiwgZGlwLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCS8qIEluaXQgaW5vZGUgZm9yIHF1b3RhIG9wZXJhdGlvbnMuICovCisJRFFVT1RfSU5JVChpcCk7CisKKwkvKiBkaXJlY3RvcnkgbXVzdCBiZSBlbXB0eSB0byBiZSByZW1vdmVkICovCisJaWYgKCFkdEVtcHR5KGlwKSkgeworCQlyYyA9IC1FTk9URU1QVFk7CisJCWdvdG8gb3V0OworCX0KKworCWlmICgocmMgPSBnZXRfVUNTbmFtZSgmZG5hbWUsIGRlbnRyeSkpKSB7CisJCWdvdG8gb3V0OworCX0KKworCXRpZCA9IHR4QmVnaW4oZGlwLT5pX3NiLCAwKTsKKworCWRvd24oJkpGU19JUChkaXApLT5jb21taXRfc2VtKTsKKwlkb3duKCZKRlNfSVAoaXApLT5jb21taXRfc2VtKTsKKworCWlwbGlzdFswXSA9IGRpcDsKKwlpcGxpc3RbMV0gPSBpcDsKKworCXRibGsgPSB0aWRfdG9fdGJsb2NrKHRpZCk7CisJdGJsay0+eGZsYWcgfD0gQ09NTUlUX0RFTEVURTsKKwl0YmxrLT51LmlwID0gaXA7CisKKwkvKgorCSAqIGRlbGV0ZSB0aGUgZW50cnkgb2YgdGFyZ2V0IGRpcmVjdG9yeSBmcm9tIHBhcmVudCBkaXJlY3RvcnkKKwkgKi8KKwlpbm8gPSBpcC0+aV9pbm87CisJaWYgKChyYyA9IGR0RGVsZXRlKHRpZCwgZGlwLCAmZG5hbWUsICZpbm8sIEpGU19SRU1PVkUpKSkgeworCQlqZnNfZXJyKCJqZnNfcm1kaXI6IGR0RGVsZXRlIHJldHVybmVkICVkIiwgcmMpOworCQlpZiAocmMgPT0gLUVJTykKKwkJCXR4QWJvcnQodGlkLCAxKTsKKwkJdHhFbmQodGlkKTsKKwkJdXAoJkpGU19JUChkaXApLT5jb21taXRfc2VtKTsKKwkJdXAoJkpGU19JUChpcCktPmNvbW1pdF9zZW0pOworCisJCWdvdG8gb3V0MjsKKwl9CisKKwkvKiB1cGRhdGUgcGFyZW50IGRpcmVjdG9yeSdzIGxpbmsgY291bnQgY29ycmVzcG9uZGluZworCSAqIHRvICIuLiIgZW50cnkgb2YgdGhlIHRhcmdldCBkaXJlY3RvcnkgZGVsZXRlZAorCSAqLworCWRpcC0+aV9ubGluay0tOworCWRpcC0+aV9jdGltZSA9IGRpcC0+aV9tdGltZSA9IENVUlJFTlRfVElNRTsKKwltYXJrX2lub2RlX2RpcnR5KGRpcCk7CisKKwkvKgorCSAqIE9TLzIgY291bGQgaGF2ZSBjcmVhdGVkIEVBIGFuZC9vciBBQ0wKKwkgKi8KKwkvKiBmcmVlIEVBIGZyb20gYm90aCBwZXJzaXN0ZW50IGFuZCB3b3JraW5nIG1hcCAqLworCWlmIChKRlNfSVAoaXApLT5lYS5mbGFnICYgRFhEX0VYVEVOVCkgeworCQkvKiBmcmVlIEVBIHBhZ2VzICovCisJCXR4RUEodGlkLCBpcCwgJkpGU19JUChpcCktPmVhLCBOVUxMKTsKKwl9CisJSkZTX0lQKGlwKS0+ZWEuZmxhZyA9IDA7CisKKwkvKiBmcmVlIEFDTCBmcm9tIGJvdGggcGVyc2lzdGVudCBhbmQgd29ya2luZyBtYXAgKi8KKwlpZiAoSkZTX0lQKGlwKS0+YWNsLmZsYWcgJiBEWERfRVhURU5UKSB7CisJCS8qIGZyZWUgQUNMIHBhZ2VzICovCisJCXR4RUEodGlkLCBpcCwgJkpGU19JUChpcCktPmFjbCwgTlVMTCk7CisJfQorCUpGU19JUChpcCktPmFjbC5mbGFnID0gMDsKKworCS8qIG1hcmsgdGhlIHRhcmdldCBkaXJlY3RvcnkgYXMgZGVsZXRlZCAqLworCWlwLT5pX25saW5rID0gMDsKKwltYXJrX2lub2RlX2RpcnR5KGlwKTsKKworCXJjID0gdHhDb21taXQodGlkLCAyLCAmaXBsaXN0WzBdLCAwKTsKKworCXR4RW5kKHRpZCk7CisKKwl1cCgmSkZTX0lQKGRpcCktPmNvbW1pdF9zZW0pOworCXVwKCZKRlNfSVAoaXApLT5jb21taXRfc2VtKTsKKworCS8qCisJICogVHJ1bmNhdGluZyB0aGUgZGlyZWN0b3J5IGluZGV4IHRhYmxlIGlzIG5vdCBndWFyYW50ZWVkLiAgSXQKKwkgKiBtYXkgbmVlZCB0byBiZSBkb25lIGl0ZXJhdGl2ZWx5CisJICovCisJaWYgKHRlc3RfY2ZsYWcoQ09NTUlUX1N0YWxlLCBkaXApKSB7CisJCWlmIChkaXAtPmlfc2l6ZSA+IDEpCisJCQlqZnNfdHJ1bmNhdGVfbm9sb2NrKGRpcCwgMCk7CisKKwkJY2xlYXJfY2ZsYWcoQ09NTUlUX1N0YWxlLCBkaXApOworCX0KKworICAgICAgb3V0MjoKKwlmcmVlX1VDU25hbWUoJmRuYW1lKTsKKworICAgICAgb3V0OgorCWpmc19pbmZvKCJqZnNfcm1kaXI6IHJjOiVkIiwgcmMpOworCXJldHVybiByYzsKK30KKworLyoKKyAqIE5BTUU6CWpmc191bmxpbmsoZGlwLCBkZW50cnkpCisgKgorICogRlVOQ1RJT046CXJlbW92ZSBhIGxpbmsgdG8gb2JqZWN0IDx2cD4gbmFtZWQgYnkgPG5hbWU+IAorICoJCWZyb20gcGFyZW50IGRpcmVjdG9yeSA8ZHZwPgorICoKKyAqIFBBUkFNRVRFUjoJZGlwIAktIGlub2RlIG9mIHBhcmVudCBkaXJlY3RvcnkKKyAqCQlkZW50cnkgCS0gZGVudHJ5IG9mIG9iamVjdCB0byBiZSByZW1vdmVkCisgKgorICogUkVUVVJOOgllcnJvcnMgZnJvbSBzdWJyb3V0aW5lcworICoKKyAqIG5vdGU6CisgKiB0ZW1wb3JhcnkgZmlsZTogaWYgb25lIG9yIG1vcmUgcHJvY2Vzc2VzIGhhdmUgdGhlIGZpbGUgb3BlbgorICogd2hlbiB0aGUgbGFzdCBsaW5rIGlzIHJlbW92ZWQsIHRoZSBsaW5rIHdpbGwgYmUgcmVtb3ZlZCBiZWZvcmUKKyAqIHVubGluaygpIHJldHVybnMsIGJ1dCB0aGUgcmVtb3ZhbCBvZiB0aGUgZmlsZSBjb250ZW50cyB3aWxsIGJlCisgKiBwb3N0cG9uZWQgdW50aWwgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGZpbGVzIGFyZSBjbG9zZWQuCisgKgorICogSkZTIGRvZXMgTk9UIHN1cHBvcnQgdW5saW5rKCkgb24gZGlyZWN0b3JpZXMuCisgKgorICovCitzdGF0aWMgaW50IGpmc191bmxpbmsoc3RydWN0IGlub2RlICpkaXAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpbnQgcmM7CisJdGlkX3QgdGlkOwkJLyogdHJhbnNhY3Rpb24gaWQgKi8KKwlzdHJ1Y3QgaW5vZGUgKmlwID0gZGVudHJ5LT5kX2lub2RlOworCWlub190IGlubzsKKwlzdHJ1Y3QgY29tcG9uZW50X25hbWUgZG5hbWU7CS8qIG9iamVjdCBuYW1lICovCisJc3RydWN0IGlub2RlICppcGxpc3RbMl07CisJc3RydWN0IHRibG9jayAqdGJsazsKKwlzNjQgbmV3X3NpemUgPSAwOworCWludCBjb21taXRfZmxhZzsKKworCWpmc19pbmZvKCJqZnNfdW5saW5rOiBkaXA6MHglcCBuYW1lOiVzIiwgZGlwLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCS8qIEluaXQgaW5vZGUgZm9yIHF1b3RhIG9wZXJhdGlvbnMuICovCisJRFFVT1RfSU5JVChpcCk7CisKKwlpZiAoKHJjID0gZ2V0X1VDU25hbWUoJmRuYW1lLCBkZW50cnkpKSkKKwkJZ290byBvdXQ7CisKKwlJV1JJVEVfTE9DSyhpcCk7CisKKwl0aWQgPSB0eEJlZ2luKGRpcC0+aV9zYiwgMCk7CisKKwlkb3duKCZKRlNfSVAoZGlwKS0+Y29tbWl0X3NlbSk7CisJZG93bigmSkZTX0lQKGlwKS0+Y29tbWl0X3NlbSk7CisKKwlpcGxpc3RbMF0gPSBkaXA7CisJaXBsaXN0WzFdID0gaXA7CisKKwkvKgorCSAqIGRlbGV0ZSB0aGUgZW50cnkgb2YgdGFyZ2V0IGZpbGUgZnJvbSBwYXJlbnQgZGlyZWN0b3J5CisJICovCisJaW5vID0gaXAtPmlfaW5vOworCWlmICgocmMgPSBkdERlbGV0ZSh0aWQsIGRpcCwgJmRuYW1lLCAmaW5vLCBKRlNfUkVNT1ZFKSkpIHsKKwkJamZzX2VycigiamZzX3VubGluazogZHREZWxldGUgcmV0dXJuZWQgJWQiLCByYyk7CisJCWlmIChyYyA9PSAtRUlPKQorCQkJdHhBYm9ydCh0aWQsIDEpOwkvKiBNYXJrcyBGUyBEaXJ0eSAqLworCQl0eEVuZCh0aWQpOworCQl1cCgmSkZTX0lQKGRpcCktPmNvbW1pdF9zZW0pOworCQl1cCgmSkZTX0lQKGlwKS0+Y29tbWl0X3NlbSk7CisJCUlXUklURV9VTkxPQ0soaXApOworCQlnb3RvIG91dDE7CisJfQorCisJQVNTRVJUKGlwLT5pX25saW5rKTsKKworCWlwLT5pX2N0aW1lID0gZGlwLT5pX2N0aW1lID0gZGlwLT5pX210aW1lID0gQ1VSUkVOVF9USU1FOworCW1hcmtfaW5vZGVfZGlydHkoZGlwKTsKKworCS8qIHVwZGF0ZSB0YXJnZXQncyBpbm9kZSAqLworCWlwLT5pX25saW5rLS07CisJbWFya19pbm9kZV9kaXJ0eShpcCk7CisKKwkvKgorCSAqICAgICAgY29tbWl0IHplcm8gbGluayBjb3VudCBvYmplY3QKKwkgKi8KKwlpZiAoaXAtPmlfbmxpbmsgPT0gMCkgeworCQlhc3NlcnQoIXRlc3RfY2ZsYWcoQ09NTUlUX05vbGluaywgaXApKTsKKwkJLyogZnJlZSBibG9jayByZXNvdXJjZXMgKi8KKwkJaWYgKChuZXdfc2l6ZSA9IGNvbW1pdFplcm9MaW5rKHRpZCwgaXApKSA8IDApIHsKKwkJCXR4QWJvcnQodGlkLCAxKTsJLyogTWFya3MgRlMgRGlydHkgKi8KKwkJCXR4RW5kKHRpZCk7CisJCQl1cCgmSkZTX0lQKGRpcCktPmNvbW1pdF9zZW0pOworCQkJdXAoJkpGU19JUChpcCktPmNvbW1pdF9zZW0pOworCQkJSVdSSVRFX1VOTE9DSyhpcCk7CisJCQlyYyA9IG5ld19zaXplOworCQkJZ290byBvdXQxOworCQl9CisJCXRibGsgPSB0aWRfdG9fdGJsb2NrKHRpZCk7CisJCXRibGstPnhmbGFnIHw9IENPTU1JVF9ERUxFVEU7CisJCXRibGstPnUuaXAgPSBpcDsKKwl9CisKKwkvKgorCSAqIEluY29tcGxldGUgdHJ1bmNhdGUgb2YgZmlsZSBkYXRhIGNhbgorCSAqIHJlc3VsdCBpbiB0aW1pbmcgcHJvYmxlbXMgdW5sZXNzIHdlIHN5bmNocm9ub3VzbHkgY29tbWl0IHRoZQorCSAqIHRyYW5zYWN0aW9uLgorCSAqLworCWlmIChuZXdfc2l6ZSkKKwkJY29tbWl0X2ZsYWcgPSBDT01NSVRfU1lOQzsKKwllbHNlCisJCWNvbW1pdF9mbGFnID0gMDsKKworCS8qCisJICogSWYgeHRUcnVuY2F0ZSB3YXMgaW5jb21wbGV0ZSwgY29tbWl0IHN5bmNocm9ub3VzbHkgdG8gYXZvaWQKKwkgKiB0aW1pbmcgY29tcGxpY2F0aW9ucworCSAqLworCXJjID0gdHhDb21taXQodGlkLCAyLCAmaXBsaXN0WzBdLCBjb21taXRfZmxhZyk7CisKKwl0eEVuZCh0aWQpOworCisJdXAoJkpGU19JUChkaXApLT5jb21taXRfc2VtKTsKKwl1cCgmSkZTX0lQKGlwKS0+Y29tbWl0X3NlbSk7CisKKworCXdoaWxlIChuZXdfc2l6ZSAmJiAocmMgPT0gMCkpIHsKKwkJdGlkID0gdHhCZWdpbihkaXAtPmlfc2IsIDApOworCQlkb3duKCZKRlNfSVAoaXApLT5jb21taXRfc2VtKTsKKwkJbmV3X3NpemUgPSB4dFRydW5jYXRlX3BtYXAodGlkLCBpcCwgbmV3X3NpemUpOworCQlpZiAobmV3X3NpemUgPCAwKSB7CisJCQl0eEFib3J0KHRpZCwgMSk7CS8qIE1hcmtzIEZTIERpcnR5ICovCisJCQlyYyA9IG5ld19zaXplOworCQl9IGVsc2UKKwkJCXJjID0gdHhDb21taXQodGlkLCAyLCAmaXBsaXN0WzBdLCBDT01NSVRfU1lOQyk7CisJCXR4RW5kKHRpZCk7CisJCXVwKCZKRlNfSVAoaXApLT5jb21taXRfc2VtKTsKKwl9CisKKwlpZiAoaXAtPmlfbmxpbmsgPT0gMCkKKwkJc2V0X2NmbGFnKENPTU1JVF9Ob2xpbmssIGlwKTsKKworCUlXUklURV9VTkxPQ0soaXApOworCisJLyoKKwkgKiBUcnVuY2F0aW5nIHRoZSBkaXJlY3RvcnkgaW5kZXggdGFibGUgaXMgbm90IGd1YXJhbnRlZWQuICBJdAorCSAqIG1heSBuZWVkIHRvIGJlIGRvbmUgaXRlcmF0aXZlbHkKKwkgKi8KKwlpZiAodGVzdF9jZmxhZyhDT01NSVRfU3RhbGUsIGRpcCkpIHsKKwkJaWYgKGRpcC0+aV9zaXplID4gMSkKKwkJCWpmc190cnVuY2F0ZV9ub2xvY2soZGlwLCAwKTsKKworCQljbGVhcl9jZmxhZyhDT01NSVRfU3RhbGUsIGRpcCk7CisJfQorCisgICAgICBvdXQxOgorCWZyZWVfVUNTbmFtZSgmZG5hbWUpOworICAgICAgb3V0OgorCWpmc19pbmZvKCJqZnNfdW5saW5rOiByYzolZCIsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBOQU1FOgljb21taXRaZXJvTGluaygpCisgKgorICogRlVOQ1RJT046ICAgIGZvciBub24tZGlyZWN0b3J5LCBjYWxsZWQgYnkgamZzX3JlbW92ZSgpLAorICoJCXRydW5jYXRlIGEgcmVndWxhciBmaWxlLCBkaXJlY3Rvcnkgb3Igc3ltYm9saWMKKyAqCQlsaW5rIHRvIHplcm8gbGVuZ3RoLiByZXR1cm4gMCBpZiB0eXBlIGlzIG5vdCAKKyAqCQlvbmUgb2YgdGhlc2UuCisgKgorICoJCWlmIHRoZSBmaWxlIGlzIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggYSBWTSBzZWdtZW50CisgKgkJb25seSBwZXJtYW5lbnQgZGlzayBhbmQgaW5vZGUgbWFwIHJlc291cmNlcyBhcmUgZnJlZWQsCisgKgkJYW5kIG5laXRoZXIgdGhlIGlub2RlIG5vciBpbmRpcmVjdCBibG9ja3MgYXJlIG1vZGlmaWVkCisgKgkJc28gdGhhdCB0aGUgcmVzb3VyY2VzIGNhbiBiZSBsYXRlciBmcmVlZCBpbiB0aGUgd29yaworICoJCW1hcCBieSBjdHJ1bmMxLgorICoJCWlmIHRoZXJlIGlzIG5vIFZNIHNlZ21lbnQgb24gZW50cnksIHRoZSByZXNvdXJjZXMgYXJlCisgKgkJZnJlZWQgaW4gYm90aCB3b3JrIGFuZCBwZXJtYW5lbnQgbWFwLgorICoJCSg/IGZvciB0ZW1wb3JhcnkgZmlsZSAtIG1lbW9yeSBvYmplY3QgaXMgY2FjaGVkIGV2ZW4gCisgKgkJYWZ0ZXIgbm8gcmVmZXJlbmNlOgorICoJCXJlZmVyZW5jZSBjb3VudCA+IDAgLSAgICkKKyAqCisgKiBQQVJBTUVURVJTOgljZAktIHBvaW50ZXIgdG8gY29tbWl0IGRhdGEgc3RydWN0dXJlLgorICoJCQkgIGN1cnJlbnQgaW5vZGUgaXMgdGhlIG9uZSB0byB0cnVuY2F0ZS4KKyAqCisgKiBSRVRVUk46CUVycm9ycyBmcm9tIHN1YnJvdXRpbmVzCisgKi8KK3N0YXRpYyBzNjQgY29tbWl0WmVyb0xpbmsodGlkX3QgdGlkLCBzdHJ1Y3QgaW5vZGUgKmlwKQoreworCWludCBmaWxldHlwZTsKKwlzdHJ1Y3QgdGJsb2NrICp0YmxrOworCisJamZzX2luZm8oImNvbW1pdFplcm9MaW5rOiB0aWQgPSAlZCwgaXAgPSAweCVwIiwgdGlkLCBpcCk7CisKKwlmaWxldHlwZSA9IGlwLT5pX21vZGUgJiBTX0lGTVQ7CisJc3dpdGNoIChmaWxldHlwZSkgeworCWNhc2UgU19JRlJFRzoKKwkJYnJlYWs7CisJY2FzZSBTX0lGTE5LOgorCQkvKiBmYXN0IHN5bWJvbGljIGxpbmsgKi8KKwkJaWYgKGlwLT5pX3NpemUgPCBJREFUQVNJWkUpIHsKKwkJCWlwLT5pX3NpemUgPSAwOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYXNzZXJ0KGZpbGV0eXBlICE9IFNfSUZESVIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzZXRfY2ZsYWcoQ09NTUlUX0ZyZWV3bWFwLCBpcCk7CisKKwkvKiBtYXJrIHRyYW5zYWN0aW9uIG9mIGJsb2NrIG1hcCB1cGRhdGUgdHlwZSAqLworCXRibGsgPSB0aWRfdG9fdGJsb2NrKHRpZCk7CisJdGJsay0+eGZsYWcgfD0gQ09NTUlUX1BNQVA7CisKKwkvKgorCSAqIGZyZWUgRUEKKwkgKi8KKwlpZiAoSkZTX0lQKGlwKS0+ZWEuZmxhZyAmIERYRF9FWFRFTlQpCisJCS8qIGFjcXVpcmUgbWFwbG9jayBvbiBFQSB0byBiZSBmcmVlZCBmcm9tIGJsb2NrIG1hcCAqLworCQl0eEVBKHRpZCwgaXAsICZKRlNfSVAoaXApLT5lYSwgTlVMTCk7CisKKwkvKgorCSAqIGZyZWUgQUNMCisJICovCisJaWYgKEpGU19JUChpcCktPmFjbC5mbGFnICYgRFhEX0VYVEVOVCkKKwkJLyogYWNxdWlyZSBtYXBsb2NrIG9uIEVBIHRvIGJlIGZyZWVkIGZyb20gYmxvY2sgbWFwICovCisJCXR4RUEodGlkLCBpcCwgJkpGU19JUChpcCktPmFjbCwgTlVMTCk7CisKKwkvKgorCSAqIGZyZWUgeHRyZWUvZGF0YSAodHJ1bmNhdGUgdG8gemVybyBsZW5ndGgpOgorCSAqIGZyZWUgeHRyZWUvZGF0YSBwYWdlcyBmcm9tIGNhY2hlIGlmIENPTU1JVF9QV01BUCwgCisJICogZnJlZSB4dHJlZS9kYXRhIGJsb2NrcyBmcm9tIHBlcnNpc3RlbnQgYmxvY2sgbWFwLCBhbmQKKwkgKiBmcmVlIHh0cmVlL2RhdGEgYmxvY2tzIGZyb20gd29ya2luZyBibG9jayBtYXAgaWYgQ09NTUlUX1BXTUFQOworCSAqLworCWlmIChpcC0+aV9zaXplKQorCQlyZXR1cm4geHRUcnVuY2F0ZV9wbWFwKHRpZCwgaXAsIDApOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIE5BTUU6CWZyZWVaZXJvTGluaygpCisgKgorICogRlVOQ1RJT046ICAgIGZvciBub24tZGlyZWN0b3J5LCBjYWxsZWQgYnkgaUNsb3NlKCksCisgKgkJZnJlZSByZXNvdXJjZXMgb2YgYSBmaWxlIGZyb20gY2FjaGUgYW5kIFdPUktJTkcgbWFwIAorICoJCWZvciBhIGZpbGUgcHJldmlvdXNseSBjb21taXR0ZWQgd2l0aCB6ZXJvIGxpbmsgY291bnQKKyAqCQl3aGlsZSBhc3NvY2lhdGVkIHdpdGggYSBwYWdlciBvYmplY3QsCisgKgorICogUEFSQU1FVEVSOglpcAktIHBvaW50ZXIgdG8gaW5vZGUgb2YgZmlsZS4KKyAqCisgKiBSRVRVUk46CTAgLW9rCisgKi8KK2ludCBmcmVlWmVyb0xpbmsoc3RydWN0IGlub2RlICppcCkKK3sKKwlpbnQgcmMgPSAwOworCWludCB0eXBlOworCisJamZzX2luZm8oImZyZWVaZXJvTGluazogaXAgPSAweCVwIiwgaXApOworCisJLyogcmV0dXJuIGlmIG5vdCByZWcgb3Igc3ltYm9saWMgbGluayBvciBpZiBzaXplIGlzCisJICogYWxyZWFkeSBvay4KKwkgKi8KKwl0eXBlID0gaXAtPmlfbW9kZSAmIFNfSUZNVDsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgU19JRlJFRzoKKwkJYnJlYWs7CisJY2FzZSBTX0lGTE5LOgorCQkvKiBpZiBpdHMgY29udGFpbmVkIGluIGlub2RlIG5vdGhpbmcgdG8gZG8gKi8KKwkJaWYgKGlwLT5pX3NpemUgPCBJREFUQVNJWkUpCisJCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBmcmVlIEVBCisJICovCisJaWYgKEpGU19JUChpcCktPmVhLmZsYWcgJiBEWERfRVhURU5UKSB7CisJCXM2NCB4YWRkciA9IGFkZHJlc3NEWEQoJkpGU19JUChpcCktPmVhKTsKKwkJaW50IHhsZW4gPSBsZW5ndGhEWEQoJkpGU19JUChpcCktPmVhKTsKKwkJc3RydWN0IG1hcGxvY2sgbWFwbG9jazsJLyogbWFwbG9jayBmb3IgQ09NTUlUX1dNQVAgKi8KKwkJc3RydWN0IHB4ZF9sb2NrICpweGRsb2NrOwkvKiBtYXBsb2NrIGZvciBDT01NSVRfV01BUCAqLworCisJCS8qIGZyZWUgRUEgcGFnZXMgZnJvbSBjYWNoZSAqLworCQlpbnZhbGlkYXRlX2R4ZF9tZXRhcGFnZXMoaXAsIEpGU19JUChpcCktPmVhKTsKKworCQkvKiBmcmVlIEVBIGV4dGVudCBmcm9tIHdvcmtpbmcgYmxvY2sgbWFwICovCisJCW1hcGxvY2suaW5kZXggPSAxOworCQlweGRsb2NrID0gKHN0cnVjdCBweGRfbG9jayAqKSAmIG1hcGxvY2s7CisJCXB4ZGxvY2stPmZsYWcgPSBtbGNrRlJFRVBYRDsKKwkJUFhEYWRkcmVzcygmcHhkbG9jay0+cHhkLCB4YWRkcik7CisJCVBYRGxlbmd0aCgmcHhkbG9jay0+cHhkLCB4bGVuKTsKKwkJdHhGcmVlTWFwKGlwLCBweGRsb2NrLCBOVUxMLCBDT01NSVRfV01BUCk7CisJfQorCisJLyoKKwkgKiBmcmVlIEFDTAorCSAqLworCWlmIChKRlNfSVAoaXApLT5hY2wuZmxhZyAmIERYRF9FWFRFTlQpIHsKKwkJczY0IHhhZGRyID0gYWRkcmVzc0RYRCgmSkZTX0lQKGlwKS0+YWNsKTsKKwkJaW50IHhsZW4gPSBsZW5ndGhEWEQoJkpGU19JUChpcCktPmFjbCk7CisJCXN0cnVjdCBtYXBsb2NrIG1hcGxvY2s7CS8qIG1hcGxvY2sgZm9yIENPTU1JVF9XTUFQICovCisJCXN0cnVjdCBweGRfbG9jayAqcHhkbG9jazsJLyogbWFwbG9jayBmb3IgQ09NTUlUX1dNQVAgKi8KKworCQlpbnZhbGlkYXRlX2R4ZF9tZXRhcGFnZXMoaXAsIEpGU19JUChpcCktPmFjbCk7CisKKwkJLyogZnJlZSBBQ0wgZXh0ZW50IGZyb20gd29ya2luZyBibG9jayBtYXAgKi8KKwkJbWFwbG9jay5pbmRleCA9IDE7CisJCXB4ZGxvY2sgPSAoc3RydWN0IHB4ZF9sb2NrICopICYgbWFwbG9jazsKKwkJcHhkbG9jay0+ZmxhZyA9IG1sY2tGUkVFUFhEOworCQlQWERhZGRyZXNzKCZweGRsb2NrLT5weGQsIHhhZGRyKTsKKwkJUFhEbGVuZ3RoKCZweGRsb2NrLT5weGQsIHhsZW4pOworCQl0eEZyZWVNYXAoaXAsIHB4ZGxvY2ssIE5VTEwsIENPTU1JVF9XTUFQKTsKKwl9CisKKwkvKgorCSAqIGZyZWUgeHRyZWUvZGF0YSAodHJ1bmNhdGUgdG8gemVybyBsZW5ndGgpOgorCSAqIGZyZWUgeHRyZWUvZGF0YSBwYWdlcyBmcm9tIGNhY2hlLCBhbmQKKwkgKiBmcmVlIHh0cmVlL2RhdGEgYmxvY2tzIGZyb20gd29ya2luZyBibG9jayBtYXA7CisJICovCisJaWYgKGlwLT5pX3NpemUpCisJCXJjID0geHRUcnVuY2F0ZSgwLCBpcCwgMCwgQ09NTUlUX1dNQVApOworCisJcmV0dXJuIHJjOworfQorCisvKgorICogTkFNRToJamZzX2xpbmsodnAsIGR2cCwgbmFtZSwgY3JwKQorICoKKyAqIEZVTkNUSU9OOgljcmVhdGUgYSBsaW5rIHRvIDx2cD4gYnkgdGhlIG5hbWUgPSA8bmFtZT4KKyAqCQlpbiB0aGUgcGFyZW50IGRpcmVjdG9yeSA8ZHZwPgorICoKKyAqIFBBUkFNRVRFUjoJdnAgCS0gdGFyZ2V0IG9iamVjdAorICoJCWR2cAktIHBhcmVudCBkaXJlY3Rvcnkgb2YgbmV3IGxpbmsKKyAqCQluYW1lCS0gbmFtZSBvZiBuZXcgbGluayB0byB0YXJnZXQgb2JqZWN0CisgKgkJY3JwCS0gY3JlZGVudGlhbAorICoKKyAqIFJFVFVSTjoJRXJyb3JzIGZyb20gc3Vicm91dGluZXMKKyAqCisgKiBub3RlOgorICogSkZTIGRvZXMgTk9UIHN1cHBvcnQgbGluaygpIG9uIGRpcmVjdG9yaWVzICh0byBwcmV2ZW50IGNpcmN1bGFyCisgKiBwYXRoIGluIHRoZSBkaXJlY3RvcnkgaGllcmFyY2h5KTsKKyAqIEVQRVJNOiB0aGUgdGFyZ2V0IG9iamVjdCBpcyBhIGRpcmVjdG9yeSwgYW5kIGVpdGhlciB0aGUgY2FsbGVyCisgKiBkb2VzIG5vdCBoYXZlIGFwcHJvcHJpYXRlIHByaXZpbGVnZXMgb3IgdGhlIGltcGxlbWVudGF0aW9uIHByb2hpYml0cworICogdXNpbmcgbGluaygpIG9uIGRpcmVjdG9yaWVzIFtYUEc0LjJdLgorICoKKyAqIEpGUyBkb2VzIE5PVCBzdXBwb3J0IGxpbmtzIGJldHdlZW4gZmlsZSBzeXN0ZW1zOgorICogRVhERVY6IHRhcmdldCBvYmplY3QgYW5kIG5ldyBsaW5rIGFyZSBvbiBkaWZmZXJlbnQgZmlsZSBzeXN0ZW1zIGFuZAorICogaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc3VwcG9ydCBsaW5rcyBiZXR3ZWVuIGZpbGUgc3lzdGVtcyBbWFBHNC4yXS4KKyAqLworc3RhdGljIGludCBqZnNfbGluayhzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAorCSAgICAgc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpbnQgcmM7CisJdGlkX3QgdGlkOworCXN0cnVjdCBpbm9kZSAqaXAgPSBvbGRfZGVudHJ5LT5kX2lub2RlOworCWlub190IGlubzsKKwlzdHJ1Y3QgY29tcG9uZW50X25hbWUgZG5hbWU7CisJc3RydWN0IGJ0c3RhY2sgYnRzdGFjazsKKwlzdHJ1Y3QgaW5vZGUgKmlwbGlzdFsyXTsKKworCWpmc19pbmZvKCJqZnNfbGluazogJXMgJXMiLCBvbGRfZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJaWYgKGlwLT5pX25saW5rID09IEpGU19MSU5LX01BWCkKKwkJcmV0dXJuIC1FTUxJTks7CisKKwlpZiAoaXAtPmlfbmxpbmsgPT0gMCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwl0aWQgPSB0eEJlZ2luKGlwLT5pX3NiLCAwKTsKKworCWRvd24oJkpGU19JUChkaXIpLT5jb21taXRfc2VtKTsKKwlkb3duKCZKRlNfSVAoaXApLT5jb21taXRfc2VtKTsKKworCS8qCisJICogc2NhbiBwYXJlbnQgZGlyZWN0b3J5IGZvciBlbnRyeS9mcmVlc3BhY2UKKwkgKi8KKwlpZiAoKHJjID0gZ2V0X1VDU25hbWUoJmRuYW1lLCBkZW50cnkpKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoKHJjID0gZHRTZWFyY2goZGlyLCAmZG5hbWUsICZpbm8sICZidHN0YWNrLCBKRlNfQ1JFQVRFKSkpCisJCWdvdG8gZnJlZV9kbmFtZTsKKworCS8qCisJICogY3JlYXRlIGVudHJ5IGZvciBuZXcgbGluayBpbiBwYXJlbnQgZGlyZWN0b3J5CisJICovCisJaW5vID0gaXAtPmlfaW5vOworCWlmICgocmMgPSBkdEluc2VydCh0aWQsIGRpciwgJmRuYW1lLCAmaW5vLCAmYnRzdGFjaykpKQorCQlnb3RvIGZyZWVfZG5hbWU7CisKKwkvKiB1cGRhdGUgb2JqZWN0IGlub2RlICovCisJaXAtPmlfbmxpbmsrKzsJCS8qIGZvciBuZXcgbGluayAqLworCWlwLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCW1hcmtfaW5vZGVfZGlydHkoZGlyKTsKKwlhdG9taWNfaW5jKCZpcC0+aV9jb3VudCk7CisKKwlpcGxpc3RbMF0gPSBpcDsKKwlpcGxpc3RbMV0gPSBkaXI7CisJcmMgPSB0eENvbW1pdCh0aWQsIDIsICZpcGxpc3RbMF0sIDApOworCisJaWYgKHJjKSB7CisJCWlwLT5pX25saW5rLS07CisJCWlwdXQoaXApOworCX0gZWxzZQorCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaXApOworCisgICAgICBmcmVlX2RuYW1lOgorCWZyZWVfVUNTbmFtZSgmZG5hbWUpOworCisgICAgICBvdXQ6CisJdHhFbmQodGlkKTsKKworCXVwKCZKRlNfSVAoZGlyKS0+Y29tbWl0X3NlbSk7CisJdXAoJkpGU19JUChpcCktPmNvbW1pdF9zZW0pOworCisJamZzX2luZm8oImpmc19saW5rOiByYzolZCIsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBOQU1FOglqZnNfc3ltbGluayhkaXAsIGRlbnRyeSwgbmFtZSkKKyAqCisgKiBGVU5DVElPTjoJY3JlYXRlcyBhIHN5bWJvbGljIGxpbmsgdG8gPHN5bWxpbms+IGJ5IG5hbWUgPG5hbWU+CisgKgkJICAgICAgICBpbiBkaXJlY3RvcnkgPGRpcD4KKyAqCisgKiBQQVJBTUVURVI6CWRpcAkgICAgLSBwYXJlbnQgZGlyZWN0b3J5IHZub2RlCisgKgkJICAgICAgICBkZW50cnkgCS0gZGVudHJ5IG9mIHN5bWJvbGljIGxpbmsKKyAqCQkgICAgICAgIG5hbWUgICAgLSB0aGUgcGF0aCBuYW1lIG9mIHRoZSBleGlzdGluZyBvYmplY3QgCisgKgkJCSAgICAgICAgICAgICAgdGhhdCB3aWxsIGJlIHRoZSBzb3VyY2Ugb2YgdGhlIGxpbmsKKyAqCisgKiBSRVRVUk46CWVycm9ycyBmcm9tIHN1YnJvdXRpbmVzCisgKgorICogbm90ZToKKyAqIEVOQU1FVE9PTE9ORzogcGF0aG5hbWUgcmVzb2x1dGlvbiBvZiBhIHN5bWJvbGljIGxpbmsgcHJvZHVjZWQKKyAqIGFuIGludGVybWVkaWF0ZSByZXN1bHQgd2hvc2UgbGVuZ3RoIGV4Y2VlZHMgUEFUSF9NQVggW1hQRzQuMl0KKyovCisKK3N0YXRpYyBpbnQgamZzX3N5bWxpbmsoc3RydWN0IGlub2RlICpkaXAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgcmM7CisJdGlkX3QgdGlkOworCWlub190IGlubyA9IDA7CisJc3RydWN0IGNvbXBvbmVudF9uYW1lIGRuYW1lOworCWludCBzc2l6ZTsJCS8qIHNvdXJjZSBwYXRobmFtZSBzaXplICovCisJc3RydWN0IGJ0c3RhY2sgYnRzdGFjazsKKwlzdHJ1Y3QgaW5vZGUgKmlwID0gZGVudHJ5LT5kX2lub2RlOworCXVuY2hhciAqaV9mYXN0c3ltbGluazsKKwlzNjQgeGxlbiA9IDA7CisJaW50IGJtYXNrID0gMCwgeHNpemU7CisJczY0IGV4dGVudCA9IDAsIHhhZGRyOworCXN0cnVjdCBtZXRhcGFnZSAqbXA7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYjsKKwlzdHJ1Y3QgdGJsb2NrICp0YmxrOworCisJc3RydWN0IGlub2RlICppcGxpc3RbMl07CisKKwlqZnNfaW5mbygiamZzX3N5bWxpbms6IGRpcDoweCVwIG5hbWU6JXMiLCBkaXAsIG5hbWUpOworCisJc3NpemUgPSBzdHJsZW4obmFtZSkgKyAxOworCisJLyoKKwkgKiBzZWFyY2ggcGFyZW50IGRpcmVjdG9yeSBmb3IgZW50cnkvZnJlZXNwYWNlCisJICogKGR0U2VhcmNoKCkgcmV0dXJucyBwYXJlbnQgZGlyZWN0b3J5IHBhZ2UgcGlubmVkKQorCSAqLworCisJaWYgKChyYyA9IGdldF9VQ1NuYW1lKCZkbmFtZSwgZGVudHJ5KSkpCisJCWdvdG8gb3V0MTsKKworCS8qCisJICogYWxsb2NhdGUgb24tZGlzay9pbi1tZW1vcnkgaW5vZGUgZm9yIHN5bWJvbGljIGxpbms6CisJICogKGlBbGxvYygpIHJldHVybnMgbmV3LCBsb2NrZWQgaW5vZGUpCisJICovCisJaXAgPSBpYWxsb2MoZGlwLCBTX0lGTE5LIHwgMDc3Nyk7CisJaWYgKGlwID09IE5VTEwpIHsKKwkJcmMgPSAtRU5PU1BDOworCQlnb3RvIG91dDI7CisJfQorCisJdGlkID0gdHhCZWdpbihkaXAtPmlfc2IsIDApOworCisJZG93bigmSkZTX0lQKGRpcCktPmNvbW1pdF9zZW0pOworCWRvd24oJkpGU19JUChpcCktPmNvbW1pdF9zZW0pOworCisJdGJsayA9IHRpZF90b190YmxvY2sodGlkKTsKKwl0YmxrLT54ZmxhZyB8PSBDT01NSVRfQ1JFQVRFOworCXRibGstPmlubyA9IGlwLT5pX2lubzsKKwl0YmxrLT51Lml4cHhkID0gSkZTX0lQKGlwKS0+aXhweGQ7CisKKwkvKiBmaXggc3ltbGluayBhY2Nlc3MgcGVybWlzc2lvbgorCSAqIChkaXJfY3JlYXRlKCkgQU5EcyBpbiB0aGUgdS51X2NtYXNrLCAKKwkgKiBidXQgc3ltbGlua3MgcmVhbGx5IG5lZWQgdG8gYmUgNzc3IGFjY2VzcykKKwkgKi8KKwlpcC0+aV9tb2RlIHw9IDA3Nzc7CisKKwkvKgorCSAqIHdyaXRlIHN5bWJvbGljIGxpbmsgdGFyZ2V0IHBhdGggbmFtZQorCSAqLworCXh0SW5pdFJvb3QodGlkLCBpcCk7CisKKwkvKgorCSAqIHdyaXRlIHNvdXJjZSBwYXRoIG5hbWUgaW5saW5lIGluIG9uLWRpc2sgaW5vZGUgKGZhc3Qgc3ltYm9saWMgbGluaykKKwkgKi8KKworCWlmIChzc2l6ZSA8PSBJREFUQVNJWkUpIHsKKwkJaXAtPmlfb3AgPSAmamZzX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKworCQlpX2Zhc3RzeW1saW5rID0gSkZTX0lQKGlwKS0+aV9pbmxpbmU7CisJCW1lbWNweShpX2Zhc3RzeW1saW5rLCBuYW1lLCBzc2l6ZSk7CisJCWlwLT5pX3NpemUgPSBzc2l6ZSAtIDE7CisKKwkJLyoKKwkJICogaWYgc3ltbGluayBpcyA+IDEyOCBieXRlcywgd2UgZG9uJ3QgaGF2ZSB0aGUgc3BhY2UgdG8KKwkJICogc3RvcmUgaW5saW5lIGV4dGVuZGVkIGF0dHJpYnV0ZXMKKwkJICovCisJCWlmIChzc2l6ZSA+IHNpemVvZiAoSkZTX0lQKGlwKS0+aV9pbmxpbmUpKQorCQkJSkZTX0lQKGlwKS0+bW9kZTIgJj0gfklOTElORUVBOworCisJCWpmc19pbmZvKCJqZnNfc3ltbGluazogZmFzdCBzeW1saW5rIGFkZGVkICBzc2l6ZTolZCBuYW1lOiVzICIsCisJCQkgc3NpemUsIG5hbWUpOworCX0KKwkvKgorCSAqIHdyaXRlIHNvdXJjZSBwYXRoIG5hbWUgaW4gYSBzaW5nbGUgZXh0ZW50CisJICovCisJZWxzZSB7CisJCWpmc19pbmZvKCJqZnNfc3ltbGluazogYWxsb2NhdGUgZXh0ZW50IGlwOjB4JXAiLCBpcCk7CisKKwkJaXAtPmlfb3AgPSAmcGFnZV9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJCWlwLT5pX21hcHBpbmctPmFfb3BzID0gJmpmc19hb3BzOworCisJCS8qCisJCSAqIGV2ZW4gdGhvdWdoIHRoZSBkYXRhIG9mIHN5bWxpbmsgb2JqZWN0IChzb3VyY2UgCisJCSAqIHBhdGggbmFtZSkgaXMgdHJlYXRlZCBhcyBub24tam91cm5hbGVkIHVzZXIgZGF0YSwKKwkJICogaXQgaXMgcmVhZC93cml0dGVuIHRocnUgYnVmZmVyIGNhY2hlIGZvciBwZXJmb3JtYW5jZS4KKwkJICovCisJCXNiID0gaXAtPmlfc2I7CisJCWJtYXNrID0gSkZTX1NCSShzYiktPmJzaXplIC0gMTsKKwkJeHNpemUgPSAoc3NpemUgKyBibWFzaykgJiB+Ym1hc2s7CisJCXhhZGRyID0gMDsKKwkJeGxlbiA9IHhzaXplID4+IEpGU19TQkkoc2IpLT5sMmJzaXplOworCQlpZiAoKHJjID0geHRJbnNlcnQodGlkLCBpcCwgMCwgMCwgeGxlbiwgJnhhZGRyLCAwKSkpIHsKKwkJCXR4QWJvcnQodGlkLCAwKTsKKwkJCXJjID0gLUVOT1NQQzsKKwkJCWdvdG8gb3V0MzsKKwkJfQorCQlleHRlbnQgPSB4YWRkcjsKKwkJaXAtPmlfc2l6ZSA9IHNzaXplIC0gMTsKKwkJd2hpbGUgKHNzaXplKSB7CisJCQkvKiBUaGlzIGlzIGtpbmQgb2Ygc2lsbHkgc2luY2UgUEFUSF9NQVggPT0gNEsgKi8KKwkJCWludCBjb3B5X3NpemUgPSBtaW4oc3NpemUsIFBTSVpFKTsKKworCQkJbXAgPSBnZXRfbWV0YXBhZ2UoaXAsIHhhZGRyLCBQU0laRSwgMSk7CisKKwkJCWlmIChtcCA9PSBOVUxMKSB7CisJCQkJeHRUcnVuY2F0ZSh0aWQsIGlwLCAwLCBDT01NSVRfUFdNQVApOworCQkJCXJjID0gLUVJTzsKKwkJCQl0eEFib3J0KHRpZCwgMCk7CisJCQkJZ290byBvdXQzOworCQkJfQorCQkJbWVtY3B5KG1wLT5kYXRhLCBuYW1lLCBjb3B5X3NpemUpOworCQkJZmx1c2hfbWV0YXBhZ2UobXApOworCQkJc3NpemUgLT0gY29weV9zaXplOworCQkJbmFtZSArPSBjb3B5X3NpemU7CisJCQl4YWRkciArPSBKRlNfU0JJKHNiKS0+bmJwZXJwYWdlOworCQl9CisJfQorCisJLyoKKwkgKiBjcmVhdGUgZW50cnkgZm9yIHN5bWJvbGljIGxpbmsgaW4gcGFyZW50IGRpcmVjdG9yeQorCSAqLworCXJjID0gZHRTZWFyY2goZGlwLCAmZG5hbWUsICZpbm8sICZidHN0YWNrLCBKRlNfQ1JFQVRFKTsKKwlpZiAocmMgPT0gMCkgeworCQlpbm8gPSBpcC0+aV9pbm87CisJCXJjID0gZHRJbnNlcnQodGlkLCBkaXAsICZkbmFtZSwgJmlubywgJmJ0c3RhY2spOworCX0KKwlpZiAocmMpIHsKKwkJaWYgKHhsZW4pCisJCQl4dFRydW5jYXRlKHRpZCwgaXAsIDAsIENPTU1JVF9QV01BUCk7CisJCXR4QWJvcnQodGlkLCAwKTsKKwkJLyogZGlzY2FyZCBuZXcgaW5vZGUgKi8KKwkJZ290byBvdXQzOworCX0KKworCWluc2VydF9pbm9kZV9oYXNoKGlwKTsKKwltYXJrX2lub2RlX2RpcnR5KGlwKTsKKworCS8qCisJICogY29tbWl0IHVwZGF0ZSBvZiBwYXJlbnQgZGlyZWN0b3J5IGFuZCBsaW5rIG9iamVjdAorCSAqLworCisJaXBsaXN0WzBdID0gZGlwOworCWlwbGlzdFsxXSA9IGlwOworCXJjID0gdHhDb21taXQodGlkLCAyLCAmaXBsaXN0WzBdLCAwKTsKKworICAgICAgb3V0MzoKKwl0eEVuZCh0aWQpOworCXVwKCZKRlNfSVAoZGlwKS0+Y29tbWl0X3NlbSk7CisJdXAoJkpGU19JUChpcCktPmNvbW1pdF9zZW0pOworCWlmIChyYykgeworCQlpcC0+aV9ubGluayA9IDA7CisJCWlwdXQoaXApOworCX0gZWxzZQorCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaXApOworCisgICAgICBvdXQyOgorCWZyZWVfVUNTbmFtZSgmZG5hbWUpOworCisjaWZkZWYgQ09ORklHX0pGU19QT1NJWF9BQ0wKKwlpZiAocmMgPT0gMCkKKwkJamZzX2luaXRfYWNsKGlwLCBkaXApOworI2VuZGlmCisKKyAgICAgIG91dDE6CisJamZzX2luZm8oImpmc19zeW1saW5rOiByYzolZCIsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKKworLyoKKyAqIE5BTUU6ICAgICAgICBqZnNfcmVuYW1lCisgKgorICogRlVOQ1RJT046ICAgIHJlbmFtZSBhIGZpbGUgb3IgZGlyZWN0b3J5CisgKi8KK3N0YXRpYyBpbnQgamZzX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCisJICAgICAgIHN0cnVjdCBpbm9kZSAqbmV3X2Rpciwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKK3sKKwlzdHJ1Y3QgYnRzdGFjayBidHN0YWNrOworCWlub190IGlubzsKKwlzdHJ1Y3QgY29tcG9uZW50X25hbWUgbmV3X2RuYW1lOworCXN0cnVjdCBpbm9kZSAqbmV3X2lwOworCXN0cnVjdCBjb21wb25lbnRfbmFtZSBvbGRfZG5hbWU7CisJc3RydWN0IGlub2RlICpvbGRfaXA7CisJaW50IHJjOworCXRpZF90IHRpZDsKKwlzdHJ1Y3QgdGxvY2sgKnRsY2s7CisJc3RydWN0IGR0X2xvY2sgKmR0bGNrOworCXN0cnVjdCBsdiAqbHY7CisJaW50IGlwY291bnQ7CisJc3RydWN0IGlub2RlICppcGxpc3RbNF07CisJc3RydWN0IHRibG9jayAqdGJsazsKKwlzNjQgbmV3X3NpemUgPSAwOworCWludCBjb21taXRfZmxhZzsKKworCisJamZzX2luZm8oImpmc19yZW5hbWU6ICVzICVzIiwgb2xkX2RlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCSBuZXdfZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwlvbGRfaXAgPSBvbGRfZGVudHJ5LT5kX2lub2RlOworCW5ld19pcCA9IG5ld19kZW50cnktPmRfaW5vZGU7CisKKwlpZiAoKHJjID0gZ2V0X1VDU25hbWUoJm9sZF9kbmFtZSwgb2xkX2RlbnRyeSkpKQorCQlnb3RvIG91dDE7CisKKwlpZiAoKHJjID0gZ2V0X1VDU25hbWUoJm5ld19kbmFtZSwgbmV3X2RlbnRyeSkpKQorCQlnb3RvIG91dDI7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSBzb3VyY2UgaW5vZGUgbnVtYmVyIGlzIHdoYXQgd2UgdGhpbmsgaXQgaXMKKwkgKi8KKwlyYyA9IGR0U2VhcmNoKG9sZF9kaXIsICZvbGRfZG5hbWUsICZpbm8sICZidHN0YWNrLCBKRlNfTE9PS1VQKTsKKwlpZiAocmMgfHwgKGlubyAhPSBvbGRfaXAtPmlfaW5vKSkgeworCQlyYyA9IC1FTk9FTlQ7CisJCWdvdG8gb3V0MzsKKwl9CisKKwkvKgorCSAqIE1ha2Ugc3VyZSBkZXN0IGlub2RlIG51bWJlciAoaWYgYW55KSBpcyB3aGF0IHdlIHRoaW5rIGl0IGlzCisJICovCisJcmMgPSBkdFNlYXJjaChuZXdfZGlyLCAmbmV3X2RuYW1lLCAmaW5vLCAmYnRzdGFjaywgSkZTX0xPT0tVUCk7CisJaWYgKHJjID09IDApIHsKKwkJaWYgKChuZXdfaXAgPT0gMCkgfHwgKGlubyAhPSBuZXdfaXAtPmlfaW5vKSkgeworCQkJcmMgPSAtRVNUQUxFOworCQkJZ290byBvdXQzOworCQl9CisJfSBlbHNlIGlmIChyYyAhPSAtRU5PRU5UKQorCQlnb3RvIG91dDM7CisJZWxzZSBpZiAobmV3X2lwKSB7CisJCS8qIG5vIGVudHJ5IGV4aXN0cywgYnV0IG9uZSB3YXMgZXhwZWN0ZWQgKi8KKwkJcmMgPSAtRVNUQUxFOworCQlnb3RvIG91dDM7CisJfQorCisJaWYgKFNfSVNESVIob2xkX2lwLT5pX21vZGUpKSB7CisJCWlmIChuZXdfaXApIHsKKwkJCWlmICghZHRFbXB0eShuZXdfaXApKSB7CisJCQkJcmMgPSAtRU5PVEVNUFRZOworCQkJCWdvdG8gb3V0MzsKKwkJCX0KKwkJfSBlbHNlIGlmICgobmV3X2RpciAhPSBvbGRfZGlyKSAmJgorCQkJICAgKG5ld19kaXItPmlfbmxpbmsgPT0gSkZTX0xJTktfTUFYKSkgeworCQkJcmMgPSAtRU1MSU5LOworCQkJZ290byBvdXQzOworCQl9CisJfSBlbHNlIGlmIChuZXdfaXApIHsKKwkJSVdSSVRFX0xPQ0sobmV3X2lwKTsKKwkJLyogSW5pdCBpbm9kZSBmb3IgcXVvdGEgb3BlcmF0aW9ucy4gKi8KKwkJRFFVT1RfSU5JVChuZXdfaXApOworCX0KKworCS8qCisJICogVGhlIHJlYWwgd29yayBzdGFydHMgaGVyZQorCSAqLworCXRpZCA9IHR4QmVnaW4obmV3X2Rpci0+aV9zYiwgMCk7CisKKwlkb3duKCZKRlNfSVAobmV3X2RpciktPmNvbW1pdF9zZW0pOworCWRvd24oJkpGU19JUChvbGRfaXApLT5jb21taXRfc2VtKTsKKwlpZiAob2xkX2RpciAhPSBuZXdfZGlyKQorCQlkb3duKCZKRlNfSVAob2xkX2RpciktPmNvbW1pdF9zZW0pOworCisJaWYgKG5ld19pcCkgeworCQlkb3duKCZKRlNfSVAobmV3X2lwKS0+Y29tbWl0X3NlbSk7CisJCS8qCisJCSAqIENoYW5nZSBleGlzdGluZyBkaXJlY3RvcnkgZW50cnkgdG8gbmV3IGlub2RlIG51bWJlcgorCQkgKi8KKwkJaW5vID0gbmV3X2lwLT5pX2lubzsKKwkJcmMgPSBkdE1vZGlmeSh0aWQsIG5ld19kaXIsICZuZXdfZG5hbWUsICZpbm8sCisJCQkgICAgICBvbGRfaXAtPmlfaW5vLCBKRlNfUkVOQU1FKTsKKwkJaWYgKHJjKQorCQkJZ290byBvdXQ0OworCQluZXdfaXAtPmlfbmxpbmstLTsKKwkJaWYgKFNfSVNESVIobmV3X2lwLT5pX21vZGUpKSB7CisJCQluZXdfaXAtPmlfbmxpbmstLTsKKwkJCWlmIChuZXdfaXAtPmlfbmxpbmspIHsKKwkJCQl1cCgmSkZTX0lQKG5ld19kaXIpLT5jb21taXRfc2VtKTsKKwkJCQl1cCgmSkZTX0lQKG9sZF9pcCktPmNvbW1pdF9zZW0pOworCQkJCWlmIChvbGRfZGlyICE9IG5ld19kaXIpCisJCQkJCXVwKCZKRlNfSVAob2xkX2RpciktPmNvbW1pdF9zZW0pOworCQkJCWlmICghU19JU0RJUihvbGRfaXAtPmlfbW9kZSkgJiYgbmV3X2lwKQorCQkJCQlJV1JJVEVfVU5MT0NLKG5ld19pcCk7CisJCQkJamZzX2Vycm9yKG5ld19pcC0+aV9zYiwKKwkJCQkJICAiamZzX3JlbmFtZTogbmV3X2lwLT5pX25saW5rICE9IDAiKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJCXRibGsgPSB0aWRfdG9fdGJsb2NrKHRpZCk7CisJCQl0YmxrLT54ZmxhZyB8PSBDT01NSVRfREVMRVRFOworCQkJdGJsay0+dS5pcCA9IG5ld19pcDsKKwkJfSBlbHNlIGlmIChuZXdfaXAtPmlfbmxpbmsgPT0gMCkgeworCQkJYXNzZXJ0KCF0ZXN0X2NmbGFnKENPTU1JVF9Ob2xpbmssIG5ld19pcCkpOworCQkJLyogZnJlZSBibG9jayByZXNvdXJjZXMgKi8KKwkJCWlmICgobmV3X3NpemUgPSBjb21taXRaZXJvTGluayh0aWQsIG5ld19pcCkpIDwgMCkgeworCQkJCXR4QWJvcnQodGlkLCAxKTsJLyogTWFya3MgRlMgRGlydHkgKi8KKwkJCQlyYyA9IG5ld19zaXplOwkJCisJCQkJZ290byBvdXQ0OworCQkJfQorCQkJdGJsayA9IHRpZF90b190YmxvY2sodGlkKTsKKwkJCXRibGstPnhmbGFnIHw9IENPTU1JVF9ERUxFVEU7CisJCQl0YmxrLT51LmlwID0gbmV3X2lwOworCQl9IGVsc2UgeworCQkJbmV3X2lwLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCQkJbWFya19pbm9kZV9kaXJ0eShuZXdfaXApOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogQWRkIG5ldyBkaXJlY3RvcnkgZW50cnkKKwkJICovCisJCXJjID0gZHRTZWFyY2gobmV3X2RpciwgJm5ld19kbmFtZSwgJmlubywgJmJ0c3RhY2ssCisJCQkgICAgICBKRlNfQ1JFQVRFKTsKKwkJaWYgKHJjKSB7CisJCQlqZnNfZXJyKCJqZnNfcmVuYW1lIGRpZG4ndCBleHBlY3QgZHRTZWFyY2ggdG8gZmFpbCAiCisJCQkJIncvcmMgPSAlZCIsIHJjKTsKKwkJCWdvdG8gb3V0NDsKKwkJfQorCisJCWlubyA9IG9sZF9pcC0+aV9pbm87CisJCXJjID0gZHRJbnNlcnQodGlkLCBuZXdfZGlyLCAmbmV3X2RuYW1lLCAmaW5vLCAmYnRzdGFjayk7CisJCWlmIChyYykgeworCQkJaWYgKHJjID09IC1FSU8pCisJCQkJamZzX2VycigiamZzX3JlbmFtZTogZHRJbnNlcnQgcmV0dXJuZWQgLUVJTyIpOworCQkJZ290byBvdXQ0OworCQl9CisJCWlmIChTX0lTRElSKG9sZF9pcC0+aV9tb2RlKSkKKwkJCW5ld19kaXItPmlfbmxpbmsrKzsKKwl9CisJLyoKKwkgKiBSZW1vdmUgb2xkIGRpcmVjdG9yeSBlbnRyeQorCSAqLworCisJaW5vID0gb2xkX2lwLT5pX2lubzsKKwlyYyA9IGR0RGVsZXRlKHRpZCwgb2xkX2RpciwgJm9sZF9kbmFtZSwgJmlubywgSkZTX1JFTU9WRSk7CisJaWYgKHJjKSB7CisJCWpmc19lcnIoImpmc19yZW5hbWUgZGlkIG5vdCBleHBlY3QgZHREZWxldGUgdG8gcmV0dXJuIHJjID0gJWQiLAorCQkJcmMpOworCQl0eEFib3J0KHRpZCwgMSk7CS8qIE1hcmtzIEZpbGVzeXN0ZW0gZGlydHkgKi8KKwkJZ290byBvdXQ0OworCX0KKwlpZiAoU19JU0RJUihvbGRfaXAtPmlfbW9kZSkpIHsKKwkJb2xkX2Rpci0+aV9ubGluay0tOworCQlpZiAob2xkX2RpciAhPSBuZXdfZGlyKSB7CisJCQkvKgorCQkJICogQ2hhbmdlIGlub2RlIG51bWJlciBvZiBwYXJlbnQgZm9yIG1vdmVkIGRpcmVjdG9yeQorCQkJICovCisKKwkJCUpGU19JUChvbGRfaXApLT5pX2R0cm9vdC5oZWFkZXIuaWRvdGRvdCA9CisJCQkJY3B1X3RvX2xlMzIobmV3X2Rpci0+aV9pbm8pOworCisJCQkvKiBMaW5lbG9jayBoZWFkZXIgb2YgZHRyZWUgKi8KKwkJCXRsY2sgPSB0eExvY2sodGlkLCBvbGRfaXAsCisJCQkJICAgIChzdHJ1Y3QgbWV0YXBhZ2UgKikgJkpGU19JUChvbGRfaXApLT5ieGZsYWcsCisJCQkJICAgICAgdGxja0RUUkVFIHwgdGxja0JUUk9PVCB8IHRsY2tSRUxJTkspOworCQkJZHRsY2sgPSAoc3RydWN0IGR0X2xvY2sgKikgJiB0bGNrLT5sb2NrOworCQkJQVNTRVJUKGR0bGNrLT5pbmRleCA9PSAwKTsKKwkJCWx2ID0gJiBkdGxjay0+bHZbMF07CisJCQlsdi0+b2Zmc2V0ID0gMDsKKwkJCWx2LT5sZW5ndGggPSAxOworCQkJZHRsY2stPmluZGV4Kys7CisJCX0KKwl9CisKKwkvKgorCSAqIFVwZGF0ZSBjdGltZSBvbiBjaGFuZ2VkL21vdmVkIGlub2RlcyAmIG1hcmsgZGlydHkKKwkgKi8KKwlvbGRfaXAtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisJbWFya19pbm9kZV9kaXJ0eShvbGRfaXApOworCisJbmV3X2Rpci0+aV9jdGltZSA9IG5ld19kaXItPmlfbXRpbWUgPSBjdXJyZW50X2ZzX3RpbWUobmV3X2Rpci0+aV9zYik7CisJbWFya19pbm9kZV9kaXJ0eShuZXdfZGlyKTsKKworCS8qIEJ1aWxkIGxpc3Qgb2YgaW5vZGVzIG1vZGlmaWVkIGJ5IHRoaXMgdHJhbnNhY3Rpb24gKi8KKwlpcGNvdW50ID0gMDsKKwlpcGxpc3RbaXBjb3VudCsrXSA9IG9sZF9pcDsKKwlpZiAobmV3X2lwKQorCQlpcGxpc3RbaXBjb3VudCsrXSA9IG5ld19pcDsKKwlpcGxpc3RbaXBjb3VudCsrXSA9IG9sZF9kaXI7CisKKwlpZiAob2xkX2RpciAhPSBuZXdfZGlyKSB7CisJCWlwbGlzdFtpcGNvdW50KytdID0gbmV3X2RpcjsKKwkJb2xkX2Rpci0+aV9jdGltZSA9IG9sZF9kaXItPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUU7CisJCW1hcmtfaW5vZGVfZGlydHkob2xkX2Rpcik7CisJfQorCisJLyoKKwkgKiBJbmNvbXBsZXRlIHRydW5jYXRlIG9mIGZpbGUgZGF0YSBjYW4KKwkgKiByZXN1bHQgaW4gdGltaW5nIHByb2JsZW1zIHVubGVzcyB3ZSBzeW5jaHJvbm91c2x5IGNvbW1pdCB0aGUKKwkgKiB0cmFuc2FjdGlvbi4KKwkgKi8KKwlpZiAobmV3X3NpemUpCisJCWNvbW1pdF9mbGFnID0gQ09NTUlUX1NZTkM7CisJZWxzZQorCQljb21taXRfZmxhZyA9IDA7CisKKwlyYyA9IHR4Q29tbWl0KHRpZCwgaXBjb3VudCwgaXBsaXN0LCBjb21taXRfZmxhZyk7CisKKyAgICAgIG91dDQ6CisJdHhFbmQodGlkKTsKKworCXVwKCZKRlNfSVAobmV3X2RpciktPmNvbW1pdF9zZW0pOworCXVwKCZKRlNfSVAob2xkX2lwKS0+Y29tbWl0X3NlbSk7CisJaWYgKG9sZF9kaXIgIT0gbmV3X2RpcikKKwkJdXAoJkpGU19JUChvbGRfZGlyKS0+Y29tbWl0X3NlbSk7CisJaWYgKG5ld19pcCkKKwkJdXAoJkpGU19JUChuZXdfaXApLT5jb21taXRfc2VtKTsKKworCXdoaWxlIChuZXdfc2l6ZSAmJiAocmMgPT0gMCkpIHsKKwkJdGlkID0gdHhCZWdpbihuZXdfaXAtPmlfc2IsIDApOworCQlkb3duKCZKRlNfSVAobmV3X2lwKS0+Y29tbWl0X3NlbSk7CisJCW5ld19zaXplID0geHRUcnVuY2F0ZV9wbWFwKHRpZCwgbmV3X2lwLCBuZXdfc2l6ZSk7CisJCWlmIChuZXdfc2l6ZSA8IDApIHsKKwkJCXR4QWJvcnQodGlkLCAxKTsKKwkJCXJjID0gbmV3X3NpemU7CQkKKwkJfSBlbHNlCisJCQlyYyA9IHR4Q29tbWl0KHRpZCwgMSwgJm5ld19pcCwgQ09NTUlUX1NZTkMpOworCQl0eEVuZCh0aWQpOworCQl1cCgmSkZTX0lQKG5ld19pcCktPmNvbW1pdF9zZW0pOworCX0KKwlpZiAobmV3X2lwICYmIChuZXdfaXAtPmlfbmxpbmsgPT0gMCkpCisJCXNldF9jZmxhZyhDT01NSVRfTm9saW5rLCBuZXdfaXApOworICAgICAgb3V0MzoKKwlmcmVlX1VDU25hbWUoJm5ld19kbmFtZSk7CisgICAgICBvdXQyOgorCWZyZWVfVUNTbmFtZSgmb2xkX2RuYW1lKTsKKyAgICAgIG91dDE6CisJaWYgKG5ld19pcCAmJiAhU19JU0RJUihuZXdfaXAtPmlfbW9kZSkpCisJCUlXUklURV9VTkxPQ0sobmV3X2lwKTsKKwkvKgorCSAqIFRydW5jYXRpbmcgdGhlIGRpcmVjdG9yeSBpbmRleCB0YWJsZSBpcyBub3QgZ3VhcmFudGVlZC4gIEl0CisJICogbWF5IG5lZWQgdG8gYmUgZG9uZSBpdGVyYXRpdmVseQorCSAqLworCWlmICh0ZXN0X2NmbGFnKENPTU1JVF9TdGFsZSwgb2xkX2RpcikpIHsKKwkJaWYgKG9sZF9kaXItPmlfc2l6ZSA+IDEpCisJCQlqZnNfdHJ1bmNhdGVfbm9sb2NrKG9sZF9kaXIsIDApOworCisJCWNsZWFyX2NmbGFnKENPTU1JVF9TdGFsZSwgb2xkX2Rpcik7CisJfQorCisJamZzX2luZm8oImpmc19yZW5hbWU6IHJldHVybmluZyAlZCIsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKKworLyoKKyAqIE5BTUU6ICAgICAgICBqZnNfbWtub2QKKyAqCisgKiBGVU5DVElPTjogICAgQ3JlYXRlIGEgc3BlY2lhbCBmaWxlIChkZXZpY2UpCisgKi8KK3N0YXRpYyBpbnQgamZzX21rbm9kKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCWludCBtb2RlLCBkZXZfdCByZGV2KQoreworCXN0cnVjdCBqZnNfaW5vZGVfaW5mbyAqamZzX2lwOworCXN0cnVjdCBidHN0YWNrIGJ0c3RhY2s7CisJc3RydWN0IGNvbXBvbmVudF9uYW1lIGRuYW1lOworCWlub190IGlubzsKKwlzdHJ1Y3QgaW5vZGUgKmlwOworCXN0cnVjdCBpbm9kZSAqaXBsaXN0WzJdOworCWludCByYzsKKwl0aWRfdCB0aWQ7CisJc3RydWN0IHRibG9jayAqdGJsazsKKworCWlmICghbmV3X3ZhbGlkX2RldihyZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlqZnNfaW5mbygiamZzX21rbm9kOiAlcyIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJaWYgKChyYyA9IGdldF9VQ1NuYW1lKCZkbmFtZSwgZGVudHJ5KSkpCisJCWdvdG8gb3V0OworCisJaXAgPSBpYWxsb2MoZGlyLCBtb2RlKTsKKwlpZiAoaXAgPT0gTlVMTCkgeworCQlyYyA9IC1FTk9TUEM7CisJCWdvdG8gb3V0MTsKKwl9CisJamZzX2lwID0gSkZTX0lQKGlwKTsKKworCXRpZCA9IHR4QmVnaW4oZGlyLT5pX3NiLCAwKTsKKworCWRvd24oJkpGU19JUChkaXIpLT5jb21taXRfc2VtKTsKKwlkb3duKCZKRlNfSVAoaXApLT5jb21taXRfc2VtKTsKKworCWlmICgocmMgPSBkdFNlYXJjaChkaXIsICZkbmFtZSwgJmlubywgJmJ0c3RhY2ssIEpGU19DUkVBVEUpKSkKKwkJZ290byBvdXQzOworCisJdGJsayA9IHRpZF90b190YmxvY2sodGlkKTsKKwl0YmxrLT54ZmxhZyB8PSBDT01NSVRfQ1JFQVRFOworCXRibGstPmlubyA9IGlwLT5pX2lubzsKKwl0YmxrLT51Lml4cHhkID0gSkZTX0lQKGlwKS0+aXhweGQ7CisKKwlpbm8gPSBpcC0+aV9pbm87CisJaWYgKChyYyA9IGR0SW5zZXJ0KHRpZCwgZGlyLCAmZG5hbWUsICZpbm8sICZidHN0YWNrKSkpCisJCWdvdG8gb3V0MzsKKworCWlwLT5pX29wID0gJmpmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CisJamZzX2lwLT5kZXYgPSBuZXdfZW5jb2RlX2RldihyZGV2KTsKKwlpbml0X3NwZWNpYWxfaW5vZGUoaXAsIGlwLT5pX21vZGUsIHJkZXYpOworCisJaW5zZXJ0X2lub2RlX2hhc2goaXApOworCW1hcmtfaW5vZGVfZGlydHkoaXApOworCisJZGlyLT5pX2N0aW1lID0gZGlyLT5pX210aW1lID0gQ1VSUkVOVF9USU1FOworCisJbWFya19pbm9kZV9kaXJ0eShkaXIpOworCisJaXBsaXN0WzBdID0gZGlyOworCWlwbGlzdFsxXSA9IGlwOworCXJjID0gdHhDb21taXQodGlkLCAyLCBpcGxpc3QsIDApOworCisgICAgICBvdXQzOgorCXR4RW5kKHRpZCk7CisJdXAoJkpGU19JUChpcCktPmNvbW1pdF9zZW0pOworCXVwKCZKRlNfSVAoZGlyKS0+Y29tbWl0X3NlbSk7CisJaWYgKHJjKSB7CisJCWlwLT5pX25saW5rID0gMDsKKwkJaXB1dChpcCk7CisJfSBlbHNlCisJCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpcCk7CisKKyAgICAgIG91dDE6CisJZnJlZV9VQ1NuYW1lKCZkbmFtZSk7CisKKyNpZmRlZiBDT05GSUdfSkZTX1BPU0lYX0FDTAorCWlmIChyYyA9PSAwKQorCQlqZnNfaW5pdF9hY2woaXAsIGRpcik7CisjZW5kaWYKKworICAgICAgb3V0OgorCWpmc19pbmZvKCJqZnNfbWtub2Q6IHJldHVybmluZyAlZCIsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpqZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBidHN0YWNrIGJ0c3RhY2s7CisJaW5vX3QgaW51bTsKKwlzdHJ1Y3QgaW5vZGUgKmlwOworCXN0cnVjdCBjb21wb25lbnRfbmFtZSBrZXk7CisJY29uc3QgY2hhciAqbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7CisJaW50IGxlbiA9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKKwlpbnQgcmM7CisKKwlqZnNfaW5mbygiamZzX2xvb2t1cDogbmFtZSA9ICVzIiwgbmFtZSk7CisKKworCWlmICgobmFtZVswXSA9PSAnLicpICYmIChsZW4gPT0gMSkpCisJCWludW0gPSBkaXAtPmlfaW5vOworCWVsc2UgaWYgKHN0cmNtcChuYW1lLCAiLi4iKSA9PSAwKQorCQlpbnVtID0gUEFSRU5UKGRpcCk7CisJZWxzZSB7CisJCWlmICgocmMgPSBnZXRfVUNTbmFtZSgma2V5LCBkZW50cnkpKSkKKwkJCXJldHVybiBFUlJfUFRSKHJjKTsKKwkJcmMgPSBkdFNlYXJjaChkaXAsICZrZXksICZpbnVtLCAmYnRzdGFjaywgSkZTX0xPT0tVUCk7CisJCWZyZWVfVUNTbmFtZSgma2V5KTsKKwkJaWYgKHJjID09IC1FTk9FTlQpIHsKKwkJCWRfYWRkKGRlbnRyeSwgTlVMTCk7CisJCQlyZXR1cm4gRVJSX1BUUigwKTsKKwkJfSBlbHNlIGlmIChyYykgeworCQkJamZzX2VycigiamZzX2xvb2t1cDogZHRTZWFyY2ggcmV0dXJuZWQgJWQiLCByYyk7CisJCQlyZXR1cm4gRVJSX1BUUihyYyk7CisJCX0KKwl9CisKKwlpcCA9IGlnZXQoZGlwLT5pX3NiLCBpbnVtKTsKKwlpZiAoaXAgPT0gTlVMTCB8fCBpc19iYWRfaW5vZGUoaXApKSB7CisJCWpmc19lcnIoImpmc19sb29rdXA6IGlnZXQgZmFpbGVkIG9uIGludW0gJWQiLCAodWludCkgaW51bSk7CisJCWlmIChpcCkKKwkJCWlwdXQoaXApOworCQlyZXR1cm4gRVJSX1BUUigtRUFDQ0VTKTsKKwl9CisKKwlpZiAoSkZTX1NCSShkaXAtPmlfc2IpLT5tbnRmbGFnICYgSkZTX09TMikKKwkJZGVudHJ5LT5kX29wID0gJmpmc19jaV9kZW50cnlfb3BlcmF0aW9uczsKKworCWRlbnRyeSA9IGRfc3BsaWNlX2FsaWFzKGlwLCBkZW50cnkpOworCisJaWYgKGRlbnRyeSAmJiAoSkZTX1NCSShkaXAtPmlfc2IpLT5tbnRmbGFnICYgSkZTX09TMikpCisJCWRlbnRyeS0+ZF9vcCA9ICZqZnNfY2lfZGVudHJ5X29wZXJhdGlvbnM7CisKKwlyZXR1cm4gZGVudHJ5OworfQorCitzdHJ1Y3QgZGVudHJ5ICpqZnNfZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRlbnRyeS0+ZF9pbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQgPSBFUlJfUFRSKC1FTk9FTlQpOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJdW5zaWduZWQgbG9uZyBwYXJlbnRfaW5vOworCisJcGFyZW50X2lubyA9CisJCWxlMzJfdG9fY3B1KEpGU19JUChkZW50cnktPmRfaW5vZGUpLT5pX2R0cm9vdC5oZWFkZXIuaWRvdGRvdCk7CisJaW5vZGUgPSBpZ2V0KHNiLCBwYXJlbnRfaW5vKTsKKwlpZiAoaW5vZGUpIHsKKwkJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpIHsKKwkJCWlwdXQoaW5vZGUpOworCQkJcGFyZW50ID0gRVJSX1BUUigtRUFDQ0VTKTsKKwkJfSBlbHNlIHsKKwkJCXBhcmVudCA9IGRfYWxsb2NfYW5vbihpbm9kZSk7CisJCQlpZiAoIXBhcmVudCkgeworCQkJCXBhcmVudCA9IEVSUl9QVFIoLUVOT01FTSk7CisJCQkJaXB1dChpbm9kZSk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gcGFyZW50OworfQorCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBqZnNfZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLmNyZWF0ZQkJPSBqZnNfY3JlYXRlLAorCS5sb29rdXAJCT0gamZzX2xvb2t1cCwKKwkubGluawkJPSBqZnNfbGluaywKKwkudW5saW5rCQk9IGpmc191bmxpbmssCisJLnN5bWxpbmsJPSBqZnNfc3ltbGluaywKKwkubWtkaXIJCT0gamZzX21rZGlyLAorCS5ybWRpcgkJPSBqZnNfcm1kaXIsCisJLm1rbm9kCQk9IGpmc19ta25vZCwKKwkucmVuYW1lCQk9IGpmc19yZW5hbWUsCisJLnNldHhhdHRyCT0gamZzX3NldHhhdHRyLAorCS5nZXR4YXR0cgk9IGpmc19nZXR4YXR0ciwKKwkubGlzdHhhdHRyCT0gamZzX2xpc3R4YXR0ciwKKwkucmVtb3ZleGF0dHIJPSBqZnNfcmVtb3ZleGF0dHIsCisjaWZkZWYgQ09ORklHX0pGU19QT1NJWF9BQ0wKKwkuc2V0YXR0cgk9IGpmc19zZXRhdHRyLAorCS5wZXJtaXNzaW9uCT0gamZzX3Blcm1pc3Npb24sCisjZW5kaWYKK307CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgamZzX2Rpcl9vcGVyYXRpb25zID0geworCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIJPSBqZnNfcmVhZGRpciwKKwkuZnN5bmMJCT0gamZzX2ZzeW5jLAorfTsKKworc3RhdGljIGludCBqZnNfY2lfaGFzaChzdHJ1Y3QgZGVudHJ5ICpkaXIsIHN0cnVjdCBxc3RyICp0aGlzKQoreworCXVuc2lnbmVkIGxvbmcgaGFzaDsKKwlpbnQgaTsKKworCWhhc2ggPSBpbml0X25hbWVfaGFzaCgpOworCWZvciAoaT0wOyBpIDwgdGhpcy0+bGVuOyBpKyspCisJCWhhc2ggPSBwYXJ0aWFsX25hbWVfaGFzaCh0b2xvd2VyKHRoaXMtPm5hbWVbaV0pLCBoYXNoKTsKKwl0aGlzLT5oYXNoID0gZW5kX25hbWVfaGFzaChoYXNoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGpmc19jaV9jb21wYXJlKHN0cnVjdCBkZW50cnkgKmRpciwgc3RydWN0IHFzdHIgKmEsIHN0cnVjdCBxc3RyICpiKQoreworCWludCBpLCByZXN1bHQgPSAxOworCisJaWYgKGEtPmxlbiAhPSBiLT5sZW4pCisJCWdvdG8gb3V0OworCWZvciAoaT0wOyBpIDwgYS0+bGVuOyBpKyspIHsKKwkJaWYgKHRvbG93ZXIoYS0+bmFtZVtpXSkgIT0gdG9sb3dlcihiLT5uYW1lW2ldKSkKKwkJCWdvdG8gb3V0OworCX0KKwlyZXN1bHQgPSAwOworCisJLyoKKwkgKiBXZSB3YW50IGNyZWF0ZXMgdG8gcHJlc2VydmUgY2FzZS4gIEEgbmVnYXRpdmUgZGVudHJ5LCBhLCB0aGF0CisJICogaGFzIGEgZGlmZmVyZW50IGNhc2UgdGhhbiBiIG1heSBjYXVzZSBhIG5ldyBlbnRyeSB0byBiZSBjcmVhdGVkCisJICogd2l0aCB0aGUgd3JvbmcgY2FzZS4gIFNpbmNlIHdlIGNhbid0IHRlbGwgaWYgYSBjb21lcyBmcm9tIGEgbmVnYXRpdmUKKwkgKiBkZW50cnksIHdlIGJsaW5kbHkgcmVwbGFjZSBpdCB3aXRoIGIuICBUaGlzIHNob3VsZCBiZSBoYXJtbGVzcyBpZgorCSAqIGEgaXMgbm90IGEgbmVnYXRpdmUgZGVudHJ5LgorCSAqLworCW1lbWNweSgodW5zaWduZWQgY2hhciAqKWEtPm5hbWUsIGItPm5hbWUsIGEtPmxlbik7CitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGpmc19jaV9kZW50cnlfb3BlcmF0aW9ucyA9Cit7CisJLmRfaGFzaCA9IGpmc19jaV9oYXNoLAorCS5kX2NvbXBhcmUgPSBqZnNfY2lfY29tcGFyZSwKK307CmRpZmYgLS1naXQgYS9mcy9qZnMvcmVzaXplLmMgYi9mcy9qZnMvcmVzaXplLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmViNjg2OQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmcy9yZXNpemUuYwpAQCAtMCwwICsxLDUzNyBAQAorLyoKKyAqICAgQ29weXJpZ2h0IChDKSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzICBDb3JwLiwgMjAwMC0yMDA0CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CisjaW5jbHVkZSAiamZzX2luY29yZS5oIgorI2luY2x1ZGUgImpmc19maWxzeXMuaCIKKyNpbmNsdWRlICJqZnNfbWV0YXBhZ2UuaCIKKyNpbmNsdWRlICJqZnNfZGlub2RlLmgiCisjaW5jbHVkZSAiamZzX2ltYXAuaCIKKyNpbmNsdWRlICJqZnNfZG1hcC5oIgorI2luY2x1ZGUgImpmc19zdXBlcmJsb2NrLmgiCisjaW5jbHVkZSAiamZzX3R4bm1nci5oIgorI2luY2x1ZGUgImpmc19kZWJ1Zy5oIgorCisjZGVmaW5lIEJJVFNQRVJQQUdFICAgICAoUFNJWkUgPDwgMykKKyNkZWZpbmUgTDJNRUdBQllURSAgICAgIDIwCisjZGVmaW5lIE1FR0FCWVRFICAgICAgICAoMSA8PCBMMk1FR0FCWVRFKQorI2RlZmluZSBNRUdBQllURTMyICAgICAoTUVHQUJZVEUgPDwgNSkKKworLyogY29udmVydCBibG9jayBudW1iZXIgdG8gYm1hcCBmaWxlIHBhZ2UgbnVtYmVyICovCisjZGVmaW5lIEJMS1RPRE1BUE4oYilcCisgICAgICAgICgoKGIpID4+IDEzKSArICgoYikgPj4gMjMpICsgKChiKSA+PiAzMykgKyAzICsgMSkKKworLyoKKyAqICAgICAgamZzX2V4dGVuZGZzKCkKKyAqCisgKiBmdW5jdGlvbjogZXh0ZW5kIGZpbGUgc3lzdGVtOworICoKKyAqICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tfAorICogICBmaWxlIHN5c3RlbSBzcGFjZSAgICAgICAgICAgICAgIGZzY2sgICAgICAgaW5saW5lIGxvZworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtzcGFjZSAgc3BhY2UKKyAqCisgKiBpbnB1dDoKKyAqICAgICAgbmV3IExWU2l6ZTogaW4gTFYgYmxvY2tzIChyZXF1aXJlZCkKKyAqICAgICAgbmV3IExvZ1NpemU6IGluIExWIGJsb2NrcyAob3B0aW9uYWwpCisgKiAgICAgIG5ldyBGU1NpemU6IGluIExWIGJsb2NrcyAob3B0aW9uYWwpCisgKgorICogbmV3IGNvbmZpZ3VyYXRpb246CisgKiAxLiBzZXQgbmV3IExvZ1NpemUgYXMgc3BlY2lmaWVkIG9yIGRlZmF1bHQgZnJvbSBuZXcgTFZTaXplOworICogMi4gY29tcHV0ZSBuZXcgRlNDS1NpemUgZnJvbSBuZXcgTFZTaXplOworICogMy4gc2V0IG5ldyBGU1NpemUgYXMgTUlOKEZTU2l6ZSwgTFZTaXplLShMb2dTaXplK0ZTQ0tTaXplKSkgd2hlcmUKKyAqICAgIGFzc2VydChuZXcgRlNTaXplID49IG9sZCBGU1NpemUpLAorICogICAgaS5lLiwgZmlsZSBzeXN0ZW0gbXVzdCBub3QgYmUgc2hyaW5rZWQ7CisgKi8KK2ludCBqZnNfZXh0ZW5kZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgczY0IG5ld0xWU2l6ZSwgaW50IG5ld0xvZ1NpemUpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgamZzX3NiX2luZm8gKnNiaSA9IEpGU19TQkkoc2IpOworCXN0cnVjdCBpbm9kZSAqaXBibWFwID0gc2JpLT5pcGJtYXA7CisJc3RydWN0IGlub2RlICppcGJtYXAyOworCXN0cnVjdCBpbm9kZSAqaXBpbWFwID0gc2JpLT5pcGltYXA7CisJc3RydWN0IGpmc19sb2cgKmxvZyA9IHNiaS0+bG9nOworCXN0cnVjdCBibWFwICpibXAgPSBzYmktPmJtYXA7CisJczY0IG5ld0xvZ0FkZHJlc3MsIG5ld0ZTQ0tBZGRyZXNzOworCWludCBuZXdGU0NLU2l6ZTsKKwlzNjQgbmV3TWFwU2l6ZSA9IDAsIG1hcFNpemU7CisJczY0IFhBZGRyZXNzLCBYU2l6ZSwgbmJsb2NrcywgeG9mZiwgeGFkZHIsIHQ2NDsKKwlzNjQgb2xkTFZTaXplOworCXM2NCBuZXdGU1NpemU7CisJczY0IFZvbHVtZVNpemU7CisJaW50IG5ld05wYWdlcyA9IDAsIG5QYWdlcywgbmV3UGFnZSwgeGxlbiwgdDMyOworCWludCB0aWQ7CisJaW50IGxvZ19mb3JtYXR0ZWQgPSAwOworCXN0cnVjdCBpbm9kZSAqaXBsaXN0WzFdOworCXN0cnVjdCBqZnNfc3VwZXJibG9jayAqal9zYiwgKmpfc2IyOworCXVpbnQgb2xkX2Fnc2l6ZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqYmgyOworCisJLyogSWYgdGhlIHZvbHVtZSBoYXNuJ3QgZ3Jvd24sIGdldCBvdXQgbm93ICovCisKKwlpZiAoc2JpLT5tbnRmbGFnICYgSkZTX0lOTElORUxPRykKKwkJb2xkTFZTaXplID0gYWRkcmVzc1BYRCgmc2JpLT5sb2dweGQpICsgbGVuZ3RoUFhEKCZzYmktPmxvZ3B4ZCk7CisJZWxzZQorCQlvbGRMVlNpemUgPSBhZGRyZXNzUFhEKCZzYmktPmZzY2tweGQpICsKKwkJICAgIGxlbmd0aFBYRCgmc2JpLT5mc2NrcHhkKTsKKworCWlmIChvbGRMVlNpemUgPj0gbmV3TFZTaXplKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJqZnNfZXh0ZW5kZnM6IHZvbHVtZSBoYXNuJ3QgZ3Jvd24sIHJldHVybmluZ1xuIik7CisJCWdvdG8gb3V0OworCX0KKworCVZvbHVtZVNpemUgPSBzYi0+c19iZGV2LT5iZF9pbm9kZS0+aV9zaXplID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCisJaWYgKFZvbHVtZVNpemUpIHsKKwkJaWYgKG5ld0xWU2l6ZSA+IFZvbHVtZVNpemUpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImpmc19leHRlbmRmczogaW52YWxpZCBzaXplXG4iKTsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisJfSBlbHNlIHsKKwkJLyogY2hlY2sgdGhlIGRldmljZSAqLworCQliaCA9IHNiX2JyZWFkKHNiLCBuZXdMVlNpemUgLSAxKTsKKwkJaWYgKCFiaCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiamZzX2V4dGVuZGZzOiBpbnZhbGlkIHNpemVcbiIpOworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKwkJYmZvcmdldChiaCk7CisJfQorCisJLyogQ2FuJ3QgZXh0ZW5kIHdyaXRlLXByb3RlY3RlZCBkcml2ZSAqLworCisJaWYgKGlzUmVhZE9ubHkoaXBibWFwKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJqZnNfZXh0ZW5kZnM6IHJlYWQtb25seSBmaWxlIHN5c3RlbVxuIik7CisJCXJjID0gLUVST0ZTOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqICAgICAgcmVjb25maWd1cmUgTFYgc3BhY2VzCisJICogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwkgKgorCSAqIHZhbGlkYXRlIG5ldyBzaXplLCBvciwgaWYgbm90IHNwZWNpZmllZCwgZGV0ZXJtaW5lIG5ldyBzaXplCisJICovCisKKwkvKgorCSAqIHJlY29uZmlndXJlIGlubGluZSBsb2cgc3BhY2U6CisJICovCisJaWYgKChzYmktPm1udGZsYWcgJiBKRlNfSU5MSU5FTE9HKSkgeworCQlpZiAobmV3TG9nU2l6ZSA9PSAwKSB7CisJCQkvKgorCQkJICogbm8gc2l6ZSBzcGVjaWZpZWQ6IGRlZmF1bHQgdG8gMS8yNTYgb2YgYWdncmVnYXRlCisJCQkgKiBzaXplOyByb3VuZGVkIHVwIHRvIGEgbWVnYWJ5dGUgYm91bmRhcnk7CisJCQkgKi8KKwkJCW5ld0xvZ1NpemUgPSBuZXdMVlNpemUgPj4gODsKKwkJCXQzMiA9ICgxIDw8ICgyMCAtIHNiaS0+bDJic2l6ZSkpIC0gMTsKKwkJCW5ld0xvZ1NpemUgPSAobmV3TG9nU2l6ZSArIHQzMikgJiB+dDMyOworCQkJbmV3TG9nU2l6ZSA9CisJCQkgICAgbWluKG5ld0xvZ1NpemUsIE1FR0FCWVRFMzIgPj4gc2JpLT5sMmJzaXplKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBjb252ZXJ0IHRoZSBuZXdMb2dTaXplIHRvIGZzIGJsb2Nrcy4KKwkJCSAqCisJCQkgKiBTaW5jZSB0aGlzIGlzIGdpdmVuIGluIG1lZ2FieXRlcywgaXQgd2lsbCBhbHdheXMgYmUKKwkJCSAqIGFuIGV2ZW4gbnVtYmVyIG9mIHBhZ2VzLgorCQkJICovCisJCQluZXdMb2dTaXplID0gKG5ld0xvZ1NpemUgKiBNRUdBQllURSkgPj4gc2JpLT5sMmJzaXplOworCQl9CisKKwl9IGVsc2UKKwkJbmV3TG9nU2l6ZSA9IDA7CisKKwluZXdMb2dBZGRyZXNzID0gbmV3TFZTaXplIC0gbmV3TG9nU2l6ZTsKKworCS8qCisJICogcmVjb25maWd1cmUgZnNjayB3b3JrIHNwYWNlOgorCSAqCisJICogY29uZmlndXJlIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGxvZ2ljYWwgdm9sdW1lIHJlZ2FyZGxlc3Mgb2YKKwkgKiB3aGV0aGVyIGZpbGUgc3lzdGVtIGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgYWdncmVnYXRlOworCSAqIE5lZWQgZW5vdWdoIDRrIHBhZ2VzIHRvIGNvdmVyOgorCSAqICAtIDEgYml0IHBlciBibG9jayBpbiBhZ2dyZWdhdGUgcm91bmRlZCB1cCB0byBCUEVSRE1BUCBib3VuZGFyeQorCSAqICAtIDEgZXh0cmEgcGFnZSB0byBoYW5kbGUgY29udHJvbCBwYWdlIGFuZCBpbnRlcm1lZGlhdGUgbGV2ZWwgcGFnZXMKKwkgKiAgLSA1MCBleHRyYSBwYWdlcyBmb3IgdGhlIGNoa2RzayBzZXJ2aWNlIGxvZworCSAqLworCXQ2NCA9ICgobmV3TFZTaXplIC0gbmV3TG9nU2l6ZSArIEJQRVJETUFQIC0gMSkgPj4gTDJCUEVSRE1BUCkKKwkgICAgPDwgTDJCUEVSRE1BUDsKKwl0MzIgPSAoKHQ2NCArIChCSVRTUEVSUEFHRSAtIDEpKSAvIEJJVFNQRVJQQUdFKSArIDEgKyA1MDsKKwluZXdGU0NLU2l6ZSA9IHQzMiA8PCBzYmktPmwybmJwZXJwYWdlOworCW5ld0ZTQ0tBZGRyZXNzID0gbmV3TG9nQWRkcmVzcyAtIG5ld0ZTQ0tTaXplOworCisJLyoKKwkgKiBjb21wdXRlIG5ldyBmaWxlIHN5c3RlbSBzcGFjZTsKKwkgKi8KKwluZXdGU1NpemUgPSBuZXdMVlNpemUgLSBuZXdMb2dTaXplIC0gbmV3RlNDS1NpemU7CisKKwkvKiBmaWxlIHN5c3RlbSBjYW5ub3QgYmUgc2hyaW5rZWQgKi8KKwlpZiAobmV3RlNTaXplIDwgYm1wLT5kYl9tYXBzaXplKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBJZiB3ZSdyZSBleHBhbmRpbmcgZW5vdWdoIHRoYXQgdGhlIGlubGluZSBsb2cgZG9lcyBub3Qgb3ZlcmxhcAorCSAqIHRoZSBvbGQgb25lLCB3ZSBjYW4gZm9ybWF0IHRoZSBuZXcgbG9nIGJlZm9yZSB3ZSBxdWllc2NlIHRoZQorCSAqIGZpbGVzeXN0ZW0uCisJICovCisJaWYgKChzYmktPm1udGZsYWcgJiBKRlNfSU5MSU5FTE9HKSAmJiAobmV3TG9nQWRkcmVzcyA+IG9sZExWU2l6ZSkpIHsKKwkJaWYgKChyYyA9IGxtTG9nRm9ybWF0KGxvZywgbmV3TG9nQWRkcmVzcywgbmV3TG9nU2l6ZSkpKQorCQkJZ290byBvdXQ7CisJCWxvZ19mb3JtYXR0ZWQgPSAxOworCX0KKwkvKgorCSAqICAgICAgcXVpZXNjZSBmaWxlIHN5c3RlbQorCSAqCisJICogKHByZXBhcmUgdG8gbW92ZSB0aGUgaW5saW5lIGxvZyBhbmQgdG8gcHJldmVudCBtYXAgdXBkYXRlKQorCSAqCisJICogYmxvY2sgYW55IG5ldyB0cmFuc2FjdGlvbnMgYW5kIHdhaXQgZm9yIGNvbXBsZXRpb24gb2YKKwkgKiBhbGwgd2lwIHRyYW5zYWN0aW9ucyBhbmQgZmx1c2ggbW9kaWZpZWQgcGFnZXMgcy50LgorCSAqIG9uLWRpc2sgZmlsZSBzeXN0ZW0gaXMgaW4gY29uc2lzdGVudCBzdGF0ZSBhbmQKKwkgKiBsb2cgaXMgbm90IHJlcXVpcmVkIGZvciByZWNvdmVyeS4KKwkgKi8KKwl0eFF1aWVzY2Uoc2IpOworCisJaWYgKHNiaS0+bW50ZmxhZyAmIEpGU19JTkxJTkVMT0cpIHsKKwkJLyoKKwkJICogZGVhY3RpdmF0ZSBvbGQgaW5saW5lIGxvZworCQkgKi8KKwkJbG1Mb2dTaHV0ZG93bihsb2cpOworCisJCS8qCisJCSAqIG1hcmsgb24tZGlzayBzdXBlciBibG9jayBmb3IgZnMgaW4gdHJhbnNpdGlvbjsKKwkJICoKKwkJICogdXBkYXRlIG9uLWRpc2sgc3VwZXJibG9jayBmb3IgdGhlIG5ldyBzcGFjZSBjb25maWd1cmF0aW9uCisJCSAqIG9mIGlubGluZSBsb2cgc3BhY2UgYW5kIGZzY2sgd29yayBzcGFjZSBkZXNjcmlwdG9yczoKKwkJICogTi5CLiBGUyBkZXNjcmlwdG9yIGlzIE5PVCB1cGRhdGVkOworCQkgKgorCQkgKiBjcmFzaCByZWNvdmVyeToKKwkJICogbG9ncmVkbygpOiBpZiBGTV9FWFRFTkRGUywgcmV0dXJuIHRvIGZzY2soKSBmb3IgY2xlYW51cDsKKwkJICogZnNjaygpOiBpZiBGTV9FWFRFTkRGUywgcmVmb3JtYXQgaW5saW5lIGxvZyBhbmQgZnNjaworCQkgKiB3b3Jrc3BhY2UgZnJvbSBzdXBlcmJsb2NrIGlubGluZSBsb2cgZGVzY3JpcHRvciBhbmQgZnNjaworCQkgKiB3b3Jrc3BhY2UgZGVzY3JpcHRvcjsKKwkJICovCisKKwkJLyogcmVhZCBpbiBzdXBlcmJsb2NrICovCisJCWlmICgocmMgPSByZWFkU3VwZXIoc2IsICZiaCkpKQorCQkJZ290byBlcnJvcl9vdXQ7CisJCWpfc2IgPSAoc3RydWN0IGpmc19zdXBlcmJsb2NrICopYmgtPmJfZGF0YTsKKworCQkvKiBtYXJrIGV4dGVuZGZzKCkgaW4gcHJvZ3Jlc3MgKi8KKwkJal9zYi0+c19zdGF0ZSB8PSBjcHVfdG9fbGUzMihGTV9FWFRFTkRGUyk7CisJCWpfc2ItPnNfeHNpemUgPSBjcHVfdG9fbGU2NChuZXdGU1NpemUpOworCQlQWERhZGRyZXNzKCZqX3NiLT5zX3hmc2NrcHhkLCBuZXdGU0NLQWRkcmVzcyk7CisJCVBYRGxlbmd0aCgmal9zYi0+c194ZnNja3B4ZCwgbmV3RlNDS1NpemUpOworCQlQWERhZGRyZXNzKCZqX3NiLT5zX3hsb2dweGQsIG5ld0xvZ0FkZHJlc3MpOworCQlQWERsZW5ndGgoJmpfc2ItPnNfeGxvZ3B4ZCwgbmV3TG9nU2l6ZSk7CisKKwkJLyogc3luY2hyb25vdXNseSB1cGRhdGUgc3VwZXJibG9jayAqLworCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCXN5bmNfZGlydHlfYnVmZmVyKGJoKTsKKwkJYnJlbHNlKGJoKTsKKworCQkvKgorCQkgKiBmb3JtYXQgbmV3IGlubGluZSBsb2cgc3luY2hyb25vdXNseTsKKwkJICoKKwkJICogY3Jhc2ggcmVjb3Zlcnk6IGlmIGxvZyBtb3ZlIGluIHByb2dyZXNzLAorCQkgKiByZWZvcm1hdCBsb2cgYW5kIGV4aXQgc3VjY2VzczsKKwkJICovCisJCWlmICghbG9nX2Zvcm1hdHRlZCkKKwkJCWlmICgocmMgPSBsbUxvZ0Zvcm1hdChsb2csIG5ld0xvZ0FkZHJlc3MsIG5ld0xvZ1NpemUpKSkKKwkJCQlnb3RvIGVycm9yX291dDsKKworCQkvKgorCQkgKiBhY3RpdmF0ZSBuZXcgbG9nCisJCSAqLworCQlsb2ctPmJhc2UgPSBuZXdMb2dBZGRyZXNzOworCQlsb2ctPnNpemUgPSBuZXdMb2dTaXplID4+IChMMkxPR1BTSVpFIC0gc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCQlpZiAoKHJjID0gbG1Mb2dJbml0KGxvZykpKQorCQkJZ290byBlcnJvcl9vdXQ7CisJfQorCisJLyoKKwkgKiAgICAgIGV4dGVuZCBibG9jayBhbGxvY2F0aW9uIG1hcAorCSAqICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICoKKwkgKiBleHRlbmRmcygpIGZvciBuZXcgZXh0ZW5zaW9uLCByZXRyeSBhZnRlciBjcmFzaCByZWNvdmVyeTsKKwkgKgorCSAqIG5vdGU6IGJvdGggbG9ncmVkbygpIGFuZCBmc2NrKCkgcmVidWlsZCBtYXAgZnJvbQorCSAqIHRoZSBiaXRtYXAgYW5kIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIGZyb20gc3VwZXJibG9jaworCSAqIChkaXNyZWdhcmRpbmcgYWxsIG90aGVyIGNvbnRyb2wgaW5mb3JtYXRpb24gaW4gdGhlIG1hcCk7CisJICoKKwkgKiBzdXBlcmJsb2NrOgorCSAqICBzX3NpemU6IGFnZ3JlZ2F0ZSBzaXplIGluIHBoeXNpY2FsIGJsb2NrczsKKwkgKi8KKwkvKgorCSAqICAgICAgY29tcHV0ZSB0aGUgbmV3IGJsb2NrIGFsbG9jYXRpb24gbWFwIGNvbmZpZ3VyYXRpb24KKwkgKgorCSAqIG1hcCBkaW5vZGU6CisJICogIGRpX3NpemU6IG1hcCBmaWxlIHNpemUgaW4gYnl0ZTsKKwkgKiAgZGlfbmJsb2NrczogbnVtYmVyIG9mIGJsb2NrcyBhbGxvY2F0ZWQgZm9yIG1hcCBmaWxlOworCSAqICBkaV9tYXBzaXplOiBudW1iZXIgb2YgYmxvY2tzIGluIGFnZ3JlZ2F0ZSAoY292ZXJlZCBieSBtYXApOworCSAqIG1hcCBjb250cm9sIHBhZ2U6CisJICogIGRiX21hcHNpemU6IG51bWJlciBvZiBibG9ja3MgaW4gYWdncmVnYXRlIChjb3ZlcmVkIGJ5IG1hcCk7CisJICovCisJbmV3TWFwU2l6ZSA9IG5ld0ZTU2l6ZTsKKwkvKiBudW1iZXIgb2YgZGF0YSBwYWdlcyBvZiBuZXcgYm1hcCBmaWxlOgorCSAqIHJvdW5kdXAgbmV3IHNpemUgdG8gZnVsbCBkbWFwIHBhZ2UgYm91bmRhcnkgYW5kCisJICogYWRkIDEgZXh0cmEgZG1hcCBwYWdlIGZvciBuZXh0IGV4dGVuZGZzKCkKKwkgKi8KKwl0NjQgPSAobmV3TWFwU2l6ZSAtIDEpICsgQlBFUkRNQVA7CisJbmV3TnBhZ2VzID0gQkxLVE9ETUFQTih0NjQpICsgMTsKKworCS8qCisJICogICAgICBleHRlbmQgbWFwIGZyb20gY3VycmVudCBtYXAgKFdJVEhPVVQgZ3Jvd2luZyBtYXBmaWxlKQorCSAqCisJICogbWFwIG5ldyBleHRlbnNpb24gd2l0aCB1bm1hcHBlZCBwYXJ0IG9mIHRoZSBsYXN0IHBhcnRpYWwKKwkgKiBkbWFwIHBhZ2UsIGlmIGFwcGxpY2FibGUsIGFuZCBleHRyYSBwYWdlKHMpIGFsbG9jYXRlZAorCSAqIGF0IGVuZCBvZiBibWFwIGJ5IG1rZnMoKSBvciBwcmV2aW91cyBleHRlbmRmcygpOworCSAqLworICAgICAgZXh0ZW5kQm1hcDoKKwkvKiBjb21wdXRlIG51bWJlciBvZiBibG9ja3MgcmVxdWVzdGVkIHRvIGV4dGVuZCAqLworCW1hcFNpemUgPSBibXAtPmRiX21hcHNpemU7CisJWEFkZHJlc3MgPSBtYXBTaXplOwkvKiBlWHRlbnNpb24gQWRkcmVzcyAqLworCVhTaXplID0gbmV3TWFwU2l6ZSAtIG1hcFNpemU7CS8qIGVYdGVuc2lvbiBTaXplICovCisJb2xkX2Fnc2l6ZSA9IGJtcC0+ZGJfYWdzaXplOwkvKiBXZSBuZWVkIHRvIGtub3cgaWYgdGhpcyBjaGFuZ2VzICovCisKKwkvKiBjb21wdXRlIG51bWJlciBvZiBibG9ja3MgdGhhdCBjYW4gYmUgZXh0ZW5kZWQgYnkgY3VycmVudCBtYXBmaWxlICovCisJdDY0ID0gZGJNYXBGaWxlU2l6ZVRvTWFwU2l6ZShpcGJtYXApOworCWlmIChtYXBTaXplID4gdDY0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiamZzX2V4dGVuZGZzOiBtYXBTaXplICgweCVMeCkgPiB0NjQgKDB4JUx4KVxuIiwKKwkJICAgICAgIChsb25nIGxvbmcpIG1hcFNpemUsIChsb25nIGxvbmcpIHQ2NCk7CisJCXJjID0gLUVJTzsKKwkJZ290byBlcnJvcl9vdXQ7CisJfQorCW5ibG9ja3MgPSBtaW4odDY0IC0gbWFwU2l6ZSwgWFNpemUpOworCisJLyoKKwkgKiB1cGRhdGUgbWFwIHBhZ2VzIGZvciBuZXcgZXh0ZW5zaW9uOgorCSAqCisJICogdXBkYXRlL2luaXQgZG1hcCBhbmQgYnViYmxlIHVwIHRoZSBjb250cm9sIGhpZXJhcmNoeQorCSAqIGluY3JlbWVudGFsbHkgZm9sZCB1cCBkbWFwcyBpbnRvIHVwcGVyIGxldmVsczsKKwkgKiB1cGRhdGUgYm1hcCBjb250cm9sIHBhZ2U7CisJICovCisJaWYgKChyYyA9IGRiRXh0ZW5kRlMoaXBibWFwLCBYQWRkcmVzcywgbmJsb2NrcykpKQorCQlnb3RvIGVycm9yX291dDsKKwkvKgorCSAqIHRoZSBtYXAgbm93IGhhcyBleHRlbmRlZCB0byBjb3ZlciBhZGRpdGlvbmFsIG5ibG9ja3M6CisJICogZG5fbWFwc2l6ZSA9IG9sZE1hcHNpemUgKyBuYmxvY2tzOworCSAqLworCS8qIGlwYm1hcC0+aV9tYXBzaXplICs9IG5ibG9ja3M7ICovCisJWFNpemUgLT0gbmJsb2NrczsKKworCS8qCisJICogICAgICBncm93IG1hcCBmaWxlIHRvIGNvdmVyIHJlbWFpbmluZyBleHRlbnNpb24KKwkgKiAgICAgIGFuZC9vciBvbmUgZXh0cmEgZG1hcCBwYWdlIGZvciBuZXh0IGV4dGVuZGZzKCk7CisJICoKKwkgKiBhbGxvY2F0ZSBuZXcgbWFwIHBhZ2VzIGFuZCBpdHMgYmFja2luZyBibG9ja3MsIGFuZAorCSAqIHVwZGF0ZSBtYXAgZmlsZSB4dHJlZQorCSAqLworCS8qIGNvbXB1dGUgbnVtYmVyIG9mIGRhdGEgcGFnZXMgb2YgY3VycmVudCBibWFwIGZpbGUgKi8KKwluUGFnZXMgPSBpcGJtYXAtPmlfc2l6ZSA+PiBMMlBTSVpFOworCisJLyogbmVlZCB0byBncm93IG1hcCBmaWxlID8gKi8KKwlpZiAoblBhZ2VzID09IG5ld05wYWdlcykKKwkJZ290byBmaW5hbGl6ZUJtYXA7CisKKwkvKgorCSAqIGdyb3cgYm1hcCBmaWxlIGZvciB0aGUgbmV3IG1hcCBwYWdlcyByZXF1aXJlZDoKKwkgKgorCSAqIGFsbG9jYXRlIGdyb3d0aCBhdCB0aGUgc3RhcnQgb2YgbmV3bHkgZXh0ZW5kZWQgcmVnaW9uOworCSAqIGJtYXAgZmlsZSBvbmx5IGdyb3dzIHNlcXVlbnRpYWxseSwgaS5lLiwgYm90aCBkYXRhIHBhZ2VzCisJICogYW5kIHBvc3NpYmx5IHh0cmVlIGluZGV4IHBhZ2VzIG1heSBncm93IGluIGFwcGVuZCBtb2RlLAorCSAqIHMudC4gbG9ncmVkbygpIGNhbiByZWNvbnN0cnVjdCBwcmUtZXh0ZW5zaW9uIHN0YXRlCisJICogYnkgd2FzaGluZyBhd2F5IGJtYXAgZmlsZSBvZiBwYWdlcyBvdXRzaWRlIHNfc2l6ZSBib3VuZGFyeTsKKwkgKi8KKwkvKgorCSAqIGpvdXJuYWwgbWFwIGZpbGUgZ3Jvd3RoIGFzIGlmIGEgcmVndWxhciBmaWxlIGdyb3d0aDoKKwkgKiAobm90ZTogYm1hcCBpcyBjcmVhdGVkIHdpdGggZGlfbW9kZSA9IElGSk9VUk5BTHxJRlJFRyk7CisJICoKKwkgKiBqb3VybmFsaW5nIG9mIGJtYXAgZmlsZSBncm93dGggaXMgbm90IHJlcXVpcmVkIHNpbmNlCisJICogbG9ncmVkbygpIGRvL2NhbiBub3QgdXNlIGxvZyByZWNvcmRzIG9mIGJtYXAgZmlsZSBncm93dGgKKwkgKiBidXQgaXQgcHJvdmlkZXMgY2FyZWZ1bCB3cml0ZSBzZW1hbnRpY3MsIHBtYXAgdXBkYXRlLCBldGMuOworCSAqLworCS8qIHN5bmNocm9ub3VzIHdyaXRlIG9mIGRhdGEgcGFnZXM6IGJtYXAgZGF0YSBwYWdlcyBhcmUKKwkgKiBjYWNoZWQgaW4gbWV0YS1kYXRhIGNhY2hlLCBhbmQgbm90IHdyaXR0ZW4gb3V0CisJICogYnkgdHhDb21taXQoKTsKKwkgKi8KKwlmaWxlbWFwX2ZkYXRhd2FpdChpcGJtYXAtPmlfbWFwcGluZyk7CisJZmlsZW1hcF9mZGF0YXdyaXRlKGlwYm1hcC0+aV9tYXBwaW5nKTsKKwlmaWxlbWFwX2ZkYXRhd2FpdChpcGJtYXAtPmlfbWFwcGluZyk7CisJZGlXcml0ZVNwZWNpYWwoaXBibWFwLCAwKTsKKworCW5ld1BhZ2UgPSBuUGFnZXM7CS8qIGZpcnN0IG5ldyBwYWdlIG51bWJlciAqLworCXhvZmYgPSBuZXdQYWdlIDw8IHNiaS0+bDJuYnBlcnBhZ2U7CisJeGxlbiA9IChuZXdOcGFnZXMgLSBuUGFnZXMpIDw8IHNiaS0+bDJuYnBlcnBhZ2U7CisJeGxlbiA9IG1pbih4bGVuLCAoaW50KSBuYmxvY2tzKSAmIH4oc2JpLT5uYnBlcnBhZ2UgLSAxKTsKKwl4YWRkciA9IFhBZGRyZXNzOworCisJdGlkID0gdHhCZWdpbihzYiwgQ09NTUlUX0ZPUkNFKTsKKworCWlmICgocmMgPSB4dEFwcGVuZCh0aWQsIGlwYm1hcCwgMCwgeG9mZiwgbmJsb2NrcywgJnhsZW4sICZ4YWRkciwgMCkpKSB7CisJCXR4RW5kKHRpZCk7CisJCWdvdG8gZXJyb3Jfb3V0OworCX0KKwkvKiB1cGRhdGUgYm1hcCBmaWxlIHNpemUgKi8KKwlpcGJtYXAtPmlfc2l6ZSArPSB4bGVuIDw8IHNiaS0+bDJic2l6ZTsKKwlpbm9kZV9hZGRfYnl0ZXMoaXBibWFwLCB4bGVuIDw8IHNiaS0+bDJic2l6ZSk7CisKKwlpcGxpc3RbMF0gPSBpcGJtYXA7CisJcmMgPSB0eENvbW1pdCh0aWQsIDEsICZpcGxpc3RbMF0sIENPTU1JVF9GT1JDRSk7CisKKwl0eEVuZCh0aWQpOworCisJaWYgKHJjKQorCQlnb3RvIGVycm9yX291dDsKKworCS8qCisJICogbWFwIGZpbGUgaGFzIGJlZW4gZ3Jvd24gbm93IHRvIGNvdmVyIGV4dGVuc2lvbiB0byBmdXJ0aGVyIG91dDsKKwkgKiBkaV9zaXplID0gbmV3IG1hcCBmaWxlIHNpemU7CisJICoKKwkgKiBpZiBodWdlIGV4dGVuc2lvbiwgdGhlIHByZXZpb3VzIGV4dGVuc2lvbiBiYXNlZCBvbiBwcmV2aW91cworCSAqIG1hcCBmaWxlIHNpemUgbWF5IG5vdCBoYXZlIGJlZW4gc3VmZmljaWVudCB0byBjb3ZlciB3aG9sZSBleHRlbnNpb24KKwkgKiAoaXQgY291bGQgaGF2ZSBiZWVuIHVzZWQgdXAgZm9yIG5ldyBtYXAgcGFnZXMpLAorCSAqIGJ1dCB0aGUgbmV3bHkgZ3Jvd24gbWFwIGZpbGUgbm93IGNvdmVycyBsb3QgYmlnZ2VyIG5ldyBmcmVlIHNwYWNlCisJICogYXZhaWxhYmxlIGZvciBmdXJ0aGVyIGV4dGVuc2lvbiBvZiBtYXA7CisJICovCisJLyogYW55IG1vcmUgYmxvY2tzIHRvIGV4dGVuZCA/ICovCisJaWYgKFhTaXplKQorCQlnb3RvIGV4dGVuZEJtYXA7CisKKyAgICAgIGZpbmFsaXplQm1hcDoKKwkvKiBmaW5hbGl6ZSBibWFwICovCisJZGJGaW5hbGl6ZUJtYXAoaXBibWFwKTsKKworCS8qCisJICogICAgICB1cGRhdGUgaW5vZGUgYWxsb2NhdGlvbiBtYXAKKwkgKiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqCisJICogbW92ZSBpYWcgbGlzdHMgZnJvbSBvbGQgdG8gbmV3IGlhZzsKKwkgKiBhZ3N0YXJ0IGZpZWxkIGlzIG5vdCB1cGRhdGVkIGZvciBsb2dyZWRvKCkgdG8gcmVjb25zdHJ1Y3QKKwkgKiBpYWcgbGlzdHMgaWYgc3lzdGVtIGNyYXNoIG9jY3Vycy4KKwkgKiAoY29tcHV0YXRpb24gb2YgYWcgbnVtYmVyIGZyb20gYWdzdGFydCBiYXNlZCBvbiBhZ3NpemUKKwkgKiB3aWxsIGNvcnJlY3RseSBpZGVudGlmeSB0aGUgbmV3IGFnKTsKKwkgKi8KKwkvKiBpZiBuZXcgQUcgc2l6ZSB0aGUgc2FtZSBhcyBvbGQgQUcgc2l6ZSwgZG9uZSEgKi8KKwlpZiAoYm1wLT5kYl9hZ3NpemUgIT0gb2xkX2Fnc2l6ZSkgeworCQlpZiAoKHJjID0gZGlFeHRlbmRGUyhpcGltYXAsIGlwYm1hcCkpKQorCQkJZ290byBlcnJvcl9vdXQ7CisKKwkJLyogZmluYWxpemUgaW1hcCAqLworCQlpZiAoKHJjID0gZGlTeW5jKGlwaW1hcCkpKQorCQkJZ290byBlcnJvcl9vdXQ7CisJfQorCisJLyoKKwkgKiAgICAgIGZpbmFsaXplCisJICogICAgICAtLS0tLS0tLQorCSAqCisJICogZXh0ZW5zaW9uIGlzIGNvbW1pdHRlZCB3aGVuIG9uLWRpc2sgc3VwZXIgYmxvY2sgaXMKKwkgKiB1cGRhdGVkIHdpdGggbmV3IGRlc2NyaXB0b3JzOiBsb2dyZWRvIHdpbGwgcmVjb3ZlcgorCSAqIGNyYXNoIGJlZm9yZSBpdCB0byBwcmUtZXh0ZW5zaW9uIHN0YXRlOworCSAqLworCisJLyogc3luYyBsb2cgdG8gc2tpcCBsb2cgcmVwbGF5IG9mIGJtYXAgZmlsZSBncm93dGggdHJhbnNhY3Rpb247ICovCisJLyogbG1Mb2dTeW5jKGxvZywgMSk7ICovCisKKwkvKgorCSAqIHN5bmNocm9ub3VzIHdyaXRlIGJtYXAgZ2xvYmFsIGNvbnRyb2wgcGFnZTsKKwkgKiBmb3IgY3Jhc2ggYmVmb3JlIGNvbXBsZXRpb24gb2Ygd3JpdGUKKwkgKiBsb2dyZWRvKCkgd2lsbCByZWNvdmVyIHRvIHByZS1leHRlbmRmcyBzdGF0ZTsKKwkgKiBmb3IgY3Jhc2ggYWZ0ZXIgY29tcGxldGlvbiBvZiB3cml0ZSwKKwkgKiBsb2dyZWRvKCkgd2lsbCByZWNvdmVyIHBvc3QtZXh0ZW5kZnMgc3RhdGU7CisJICovCisJaWYgKChyYyA9IGRiU3luYyhpcGJtYXApKSkKKwkJZ290byBlcnJvcl9vdXQ7CisKKwkvKgorCSAqIGNvcHkgcHJpbWFyeSBibWFwIGlub2RlIHRvIHNlY29uZGFyeSBibWFwIGlub2RlCisJICovCisKKwlpcGJtYXAyID0gZGlSZWFkU3BlY2lhbChzYiwgQk1BUF9JLCAxKTsKKwlpZiAoaXBibWFwMiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiamZzX2V4dGVuZGZzOiBkaVJlYWRTcGVjaWFsKGJtYXApIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyb3Jfb3V0OworCX0KKwltZW1jcHkoJkpGU19JUChpcGJtYXAyKS0+aV94dHJvb3QsICZKRlNfSVAoaXBibWFwKS0+aV94dHJvb3QsIDI4OCk7CisJaXBibWFwMi0+aV9zaXplID0gaXBibWFwLT5pX3NpemU7CisJaXBibWFwMi0+aV9ibG9ja3MgPSBpcGJtYXAtPmlfYmxvY2tzOworCisJZGlXcml0ZVNwZWNpYWwoaXBibWFwMiwgMSk7CisJZGlGcmVlU3BlY2lhbChpcGJtYXAyKTsKKworCS8qCisJICogICAgICB1cGRhdGUgc3VwZXJibG9jaworCSAqLworCWlmICgocmMgPSByZWFkU3VwZXIoc2IsICZiaCkpKQorCQlnb3RvIGVycm9yX291dDsKKwlqX3NiID0gKHN0cnVjdCBqZnNfc3VwZXJibG9jayAqKWJoLT5iX2RhdGE7CisKKwkvKiBtYXJrIGV4dGVuZGZzKCkgY29tcGxldGlvbiAqLworCWpfc2ItPnNfc3RhdGUgJj0gY3B1X3RvX2xlMzIofkZNX0VYVEVOREZTKTsKKwlqX3NiLT5zX3NpemUgPSBjcHVfdG9fbGU2NChibXAtPmRiX21hcHNpemUgPDwKKwkJCQkgICBsZTE2X3RvX2NwdShqX3NiLT5zX2wyYmZhY3RvcikpOworCWpfc2ItPnNfYWdzaXplID0gY3B1X3RvX2xlMzIoYm1wLT5kYl9hZ3NpemUpOworCisJLyogdXBkYXRlIGlubGluZSBsb2cgc3BhY2UgZGVzY3JpcHRvciAqLworCWlmIChzYmktPm1udGZsYWcgJiBKRlNfSU5MSU5FTE9HKSB7CisJCVBYRGFkZHJlc3MoJihqX3NiLT5zX2xvZ3B4ZCksIG5ld0xvZ0FkZHJlc3MpOworCQlQWERsZW5ndGgoJihqX3NiLT5zX2xvZ3B4ZCksIG5ld0xvZ1NpemUpOworCX0KKworCS8qIHJlY29yZCBsb2cncyBtb3VudCBzZXJpYWwgbnVtYmVyICovCisJal9zYi0+c19sb2dzZXJpYWwgPSBjcHVfdG9fbGUzMihsb2ctPnNlcmlhbCk7CisKKwkvKiB1cGRhdGUgZnNjayB3b3JrIHNwYWNlIGRlc2NyaXB0b3IgKi8KKwlQWERhZGRyZXNzKCYoal9zYi0+c19mc2NrcHhkKSwgbmV3RlNDS0FkZHJlc3MpOworCVBYRGxlbmd0aCgmKGpfc2ItPnNfZnNja3B4ZCksIG5ld0ZTQ0tTaXplKTsKKwlqX3NiLT5zX2ZzY2tsb2cgPSAxOworCS8qIHNiLT5zX2ZzY2tsb2dsZW4gcmVtYWlucyB0aGUgc2FtZSAqLworCisJLyogVXBkYXRlIHNlY29uZGFyeSBzdXBlcmJsb2NrICovCisJYmgyID0gc2JfYnJlYWQoc2IsIFNVUEVSMl9PRkYgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCWlmIChiaDIpIHsKKwkJal9zYjIgPSAoc3RydWN0IGpmc19zdXBlcmJsb2NrICopYmgyLT5iX2RhdGE7CisJCW1lbWNweShqX3NiMiwgal9zYiwgc2l6ZW9mIChzdHJ1Y3QgamZzX3N1cGVyYmxvY2spKTsKKworCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCXN5bmNfZGlydHlfYnVmZmVyKGJoMik7CisJCWJyZWxzZShiaDIpOworCX0KKworCS8qIHdyaXRlIHByaW1hcnkgc3VwZXJibG9jayAqLworCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwlzeW5jX2RpcnR5X2J1ZmZlcihiaCk7CisJYnJlbHNlKGJoKTsKKworCWdvdG8gcmVzdW1lOworCisgICAgICBlcnJvcl9vdXQ6CisJamZzX2Vycm9yKHNiLCAiamZzX2V4dGVuZGZzIik7CisKKyAgICAgIHJlc3VtZToKKwkvKgorCSAqICAgICAgcmVzdW1lIGZpbGUgc3lzdGVtIHRyYW5zYWN0aW9ucworCSAqLworCXR4UmVzdW1lKHNiKTsKKworICAgICAgb3V0OgorCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2ZzL2pmcy9zdXBlci5jIGIvZnMvamZzL3N1cGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg1Njg2NgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmcy9zdXBlci5jCkBAIC0wLDAgKzEsNzAwIEBACisvKgorICogICBDb3B5cmlnaHQgKEMpIEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgQ29ycC4sIDIwMDAtMjAwNAorICogICBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIENocmlzdG9waCBIZWxsd2lnLCAyMDAxLTIwMDIKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyAgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIAorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyAgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZQorICogICB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyAgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJzZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiamZzX2luY29yZS5oIgorI2luY2x1ZGUgImpmc19maWxzeXMuaCIKKyNpbmNsdWRlICJqZnNfbWV0YXBhZ2UuaCIKKyNpbmNsdWRlICJqZnNfc3VwZXJibG9jay5oIgorI2luY2x1ZGUgImpmc19kbWFwLmgiCisjaW5jbHVkZSAiamZzX2ltYXAuaCIKKyNpbmNsdWRlICJqZnNfYWNsLmgiCisjaW5jbHVkZSAiamZzX2RlYnVnLmgiCisKK01PRFVMRV9ERVNDUklQVElPTigiVGhlIEpvdXJuYWxlZCBGaWxlc3lzdGVtIChKRlMpIik7CitNT0RVTEVfQVVUSE9SKCJTdGV2ZSBCZXN0L0RhdmUgS2xlaWthbXAvQmFycnkgQXJuZHQsIElCTSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMga21lbV9jYWNoZV90ICogamZzX2lub2RlX2NhY2hlcDsKKworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGpmc19zdXBlcl9vcGVyYXRpb25zOworc3RhdGljIHN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyBqZnNfZXhwb3J0X29wZXJhdGlvbnM7CitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgamZzX2ZzX3R5cGU7CisKKyNkZWZpbmUgTUFYX0NPTU1JVF9USFJFQURTIDY0CitzdGF0aWMgaW50IGNvbW1pdF90aHJlYWRzID0gMDsKK21vZHVsZV9wYXJhbShjb21taXRfdGhyZWFkcywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoY29tbWl0X3RocmVhZHMsICJOdW1iZXIgb2YgY29tbWl0IHRocmVhZHMiKTsKKworaW50IGpmc19zdG9wX3RocmVhZHM7CitzdGF0aWMgcGlkX3QgamZzSU90aHJlYWQ7CitzdGF0aWMgcGlkX3QgamZzQ29tbWl0VGhyZWFkW01BWF9DT01NSVRfVEhSRUFEU107CitzdGF0aWMgcGlkX3QgamZzU3luY1RocmVhZDsKK0RFQ0xBUkVfQ09NUExFVElPTihqZnNJT3dhaXQpOworCisjaWZkZWYgQ09ORklHX0pGU19ERUJVRworaW50IGpmc2xvZ2xldmVsID0gSkZTX0xPR0xFVkVMX1dBUk47Cittb2R1bGVfcGFyYW0oamZzbG9nbGV2ZWwsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGpmc2xvZ2xldmVsLCAiU3BlY2lmeSBKRlMgbG9nbGV2ZWwgKDAsIDEgb3IgMikiKTsKKyNlbmRpZgorCisvKgorICogRXh0ZXJuYWwgZGVjbGFyYXRpb25zCisgKi8KK2V4dGVybiBpbnQgamZzX21vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK2V4dGVybiBpbnQgamZzX21vdW50X3J3KHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbnQpOworZXh0ZXJuIGludCBqZnNfdW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK2V4dGVybiBpbnQgamZzX3Vtb3VudF9ydyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CisKK2V4dGVybiBpbnQgamZzSU9XYWl0KHZvaWQgKik7CitleHRlcm4gaW50IGpmc19sYXp5Y29tbWl0KHZvaWQgKik7CitleHRlcm4gaW50IGpmc19zeW5jKHZvaWQgKik7CisKK2V4dGVybiB2b2lkIGpmc19yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworZXh0ZXJuIHZvaWQgamZzX2RpcnR5X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworZXh0ZXJuIHZvaWQgamZzX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK2V4dGVybiBpbnQgamZzX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB3YWl0KTsKKworZXh0ZXJuIHN0cnVjdCBkZW50cnkgKmpmc19nZXRfcGFyZW50KHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7CitleHRlcm4gaW50IGpmc19leHRlbmRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgczY0LCBpbnQpOworCitleHRlcm4gc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGpmc19jaV9kZW50cnlfb3BlcmF0aW9uczsKKworI2lmZGVmIFBST0NfRlNfSkZTCQkvKiBzZWUgamZzX2RlYnVnLmggKi8KK2V4dGVybiB2b2lkIGpmc19wcm9jX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBqZnNfcHJvY19jbGVhbih2b2lkKTsKKyNlbmRpZgorCitleHRlcm4gd2FpdF9xdWV1ZV9oZWFkX3QgamZzX0lPX3RocmVhZF93YWl0OworZXh0ZXJuIHdhaXRfcXVldWVfaGVhZF90IGpmc19jb21taXRfdGhyZWFkX3dhaXQ7CitleHRlcm4gd2FpdF9xdWV1ZV9oZWFkX3QgamZzX3N5bmNfdGhyZWFkX3dhaXQ7CisKK3N0YXRpYyB2b2lkIGpmc19oYW5kbGVfZXJyb3Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgamZzX3NiX2luZm8gKnNiaSA9IEpGU19TQkkoc2IpOworCisJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQorCQlyZXR1cm47CisKKwl1cGRhdGVTdXBlcihzYiwgRk1fRElSVFkpOworCisJaWYgKHNiaS0+ZmxhZyAmIEpGU19FUlJfUEFOSUMpCisJCXBhbmljKCJKRlMgKGRldmljZSAlcyk6IHBhbmljIGZvcmNlZCBhZnRlciBlcnJvclxuIiwKKwkJCXNiLT5zX2lkKTsKKwllbHNlIGlmIChzYmktPmZsYWcgJiBKRlNfRVJSX1JFTU9VTlRfUk8pIHsKKwkJamZzX2VycigiRVJST1I6IChkZXZpY2UgJXMpOiByZW1vdW50aW5nIGZpbGVzeXN0ZW0gIgorCQkJImFzIHJlYWQtb25seVxuIiwKKwkJCXNiLT5zX2lkKTsKKwkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCX0gCisKKwkvKiBub3RoaW5nIGlzIGRvbmUgZm9yIGNvbnRpbnVlIGJleW9uZCBtYXJraW5nIHRoZSBzdXBlcmJsb2NrIGRpcnR5ICovCit9CisKK3ZvaWQgamZzX2Vycm9yKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKiBmdW5jdGlvbiwgLi4uKQoreworCXN0YXRpYyBjaGFyIGVycm9yX2J1ZlsyNTZdOworCXZhX2xpc3QgYXJnczsKKworCXZhX3N0YXJ0KGFyZ3MsIGZ1bmN0aW9uKTsKKwl2c3ByaW50ZihlcnJvcl9idWYsIGZ1bmN0aW9uLCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisKKwlwcmludGsoS0VSTl9FUlIgIkVSUk9SOiAoZGV2aWNlICVzKTogJXNcbiIsIHNiLT5zX2lkLCBlcnJvcl9idWYpOworCisJamZzX2hhbmRsZV9lcnJvcihzYik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKmpmc19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBqZnNfaW5vZGVfaW5mbyAqamZzX2lub2RlOworCisJamZzX2lub2RlID0ga21lbV9jYWNoZV9hbGxvYyhqZnNfaW5vZGVfY2FjaGVwLCBHRlBfTk9GUyk7CisJaWYgKCFqZnNfaW5vZGUpCisJCXJldHVybiBOVUxMOworCXJldHVybiAmamZzX2lub2RlLT52ZnNfaW5vZGU7Cit9CisKK3N0YXRpYyB2b2lkIGpmc19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGpmc19pbm9kZV9pbmZvICpqaSA9IEpGU19JUChpbm9kZSk7CisKKwlzcGluX2xvY2tfaXJxKCZqaS0+YWdfbG9jayk7CisJaWYgKGppLT5hY3RpdmVfYWcgIT0gLTEpIHsKKwkJc3RydWN0IGJtYXAgKmJtYXAgPSBKRlNfU0JJKGlub2RlLT5pX3NiKS0+Ym1hcDsKKwkJYXRvbWljX2RlYygmYm1hcC0+ZGJfYWN0aXZlW2ppLT5hY3RpdmVfYWddKTsKKwkJamktPmFjdGl2ZV9hZyA9IC0xOworCX0KKwlzcGluX3VubG9ja19pcnEoJmppLT5hZ19sb2NrKTsKKworI2lmZGVmIENPTkZJR19KRlNfUE9TSVhfQUNMCisJaWYgKGppLT5pX2FjbCAhPSBKRlNfQUNMX05PVF9DQUNIRUQpIHsKKwkJcG9zaXhfYWNsX3JlbGVhc2UoamktPmlfYWNsKTsKKwkJamktPmlfYWNsID0gSkZTX0FDTF9OT1RfQ0FDSEVEOworCX0KKwlpZiAoamktPmlfZGVmYXVsdF9hY2wgIT0gSkZTX0FDTF9OT1RfQ0FDSEVEKSB7CisJCXBvc2l4X2FjbF9yZWxlYXNlKGppLT5pX2RlZmF1bHRfYWNsKTsKKwkJamktPmlfZGVmYXVsdF9hY2wgPSBKRlNfQUNMX05PVF9DQUNIRUQ7CisJfQorI2VuZGlmCisKKwlrbWVtX2NhY2hlX2ZyZWUoamZzX2lub2RlX2NhY2hlcCwgamkpOworfQorCitzdGF0aWMgaW50IGpmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK3sKKwlzdHJ1Y3QgamZzX3NiX2luZm8gKnNiaSA9IEpGU19TQkkoc2IpOworCXM2NCBtYXhpbm9kZXM7CisJc3RydWN0IGlub21hcCAqaW1hcCA9IEpGU19JUChzYmktPmlwaW1hcCktPmlfaW1hcDsKKworCWpmc19pbmZvKCJJbiBqZnNfc3RhdGZzIik7CisJYnVmLT5mX3R5cGUgPSBKRlNfU1VQRVJfTUFHSUM7CisJYnVmLT5mX2JzaXplID0gc2JpLT5ic2l6ZTsKKwlidWYtPmZfYmxvY2tzID0gc2JpLT5ibWFwLT5kYl9tYXBzaXplOworCWJ1Zi0+Zl9iZnJlZSA9IHNiaS0+Ym1hcC0+ZGJfbmZyZWU7CisJYnVmLT5mX2JhdmFpbCA9IHNiaS0+Ym1hcC0+ZGJfbmZyZWU7CisJLyoKKwkgKiBJZiB3ZSByZWFsbHkgcmV0dXJuIHRoZSBudW1iZXIgb2YgYWxsb2NhdGVkICYgZnJlZSBpbm9kZXMsIHNvbWUKKwkgKiBhcHBsaWNhdGlvbnMgd2lsbCBmYWlsIGJlY2F1c2UgdGhleSB3b24ndCBzZWUgZW5vdWdoIGZyZWUgaW5vZGVzLgorCSAqIFdlJ2xsIHRyeSB0byBjYWxjdWxhdGUgc29tZSBndWVzcyBhcyB0byBob3cgbWF5IGlub2RlcyB3ZSBjYW4KKwkgKiByZWFsbHkgYWxsb2NhdGUKKwkgKgorCSAqIGJ1Zi0+Zl9maWxlcyA9IGF0b21pY19yZWFkKCZpbWFwLT5pbV9udW1pbm9zKTsKKwkgKiBidWYtPmZfZmZyZWUgPSBhdG9taWNfcmVhZCgmaW1hcC0+aW1fbnVtZnJlZSk7CisJICovCisJbWF4aW5vZGVzID0gbWluKChzNjQpIGF0b21pY19yZWFkKCZpbWFwLT5pbV9udW1pbm9zKSArCisJCQkoKHNiaS0+Ym1hcC0+ZGJfbmZyZWUgPj4gaW1hcC0+aW1fbDJuYnBlcmlleHQpCisJCQkgPDwgTDJJTk9TUEVSRVhUKSwgKHM2NCkgMHhmZmZmZmZmZkxMKTsKKwlidWYtPmZfZmlsZXMgPSBtYXhpbm9kZXM7CisJYnVmLT5mX2ZmcmVlID0gbWF4aW5vZGVzIC0gKGF0b21pY19yZWFkKCZpbWFwLT5pbV9udW1pbm9zKSAtCisJCQkJICAgIGF0b21pY19yZWFkKCZpbWFwLT5pbV9udW1mcmVlKSk7CisKKwlidWYtPmZfbmFtZWxlbiA9IEpGU19OQU1FX01BWDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgamZzX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpID0gSkZTX1NCSShzYik7CisJaW50IHJjOworCisJamZzX2luZm8oIkluIGpmc19wdXRfc3VwZXIiKTsKKwlyYyA9IGpmc191bW91bnQoc2IpOworCWlmIChyYykKKwkJamZzX2VycigiamZzX3Vtb3VudCBmYWlsZWQgd2l0aCByZXR1cm4gY29kZSAlZCIsIHJjKTsKKwlpZiAoc2JpLT5ubHNfdGFiKQorCQl1bmxvYWRfbmxzKHNiaS0+bmxzX3RhYik7CisJc2JpLT5ubHNfdGFiID0gTlVMTDsKKworCWtmcmVlKHNiaSk7Cit9CisKK2VudW0geworCU9wdF9pbnRlZ3JpdHksIE9wdF9ub2ludGVncml0eSwgT3B0X2lvY2hhcnNldCwgT3B0X3Jlc2l6ZSwKKwlPcHRfcmVzaXplX25vc2l6ZSwgT3B0X2Vycm9ycywgT3B0X2lnbm9yZSwgT3B0X2VyciwKK307CisKK3N0YXRpYyBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKKwl7T3B0X2ludGVncml0eSwgImludGVncml0eSJ9LAorCXtPcHRfbm9pbnRlZ3JpdHksICJub2ludGVncml0eSJ9LAorCXtPcHRfaW9jaGFyc2V0LCAiaW9jaGFyc2V0PSVzIn0sCisJe09wdF9yZXNpemUsICJyZXNpemU9JXUifSwKKwl7T3B0X3Jlc2l6ZV9ub3NpemUsICJyZXNpemUifSwKKwl7T3B0X2Vycm9ycywgImVycm9ycz0lcyJ9LAorCXtPcHRfaWdub3JlLCAibm9xdW90YSJ9LAorCXtPcHRfaWdub3JlLCAicXVvdGEifSwKKwl7T3B0X2lnbm9yZSwgInVzcnF1b3RhIn0sCisJe09wdF9pZ25vcmUsICJncnBxdW90YSJ9LAorCXtPcHRfZXJyLCBOVUxMfQorfTsKKworc3RhdGljIGludCBwYXJzZV9vcHRpb25zKGNoYXIgKm9wdGlvbnMsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHM2NCAqbmV3TFZTaXplLAorCQkJIGludCAqZmxhZykKK3sKKwl2b2lkICpubHNfbWFwID0gKHZvaWQgKiktMTsJLyogLTE6IG5vIGNoYW5nZTsgIE5VTEw6IG5vbmUgKi8KKwljaGFyICpwOworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpID0gSkZTX1NCSShzYik7CisKKwkqbmV3TFZTaXplID0gMDsKKworCWlmICghb3B0aW9ucykKKwkJcmV0dXJuIDE7CisKKwl3aGlsZSAoKHAgPSBzdHJzZXAoJm9wdGlvbnMsICIsIikpICE9IE5VTEwpIHsKKwkJc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOworCQlpbnQgdG9rZW47CisJCWlmICghKnApCisJCQljb250aW51ZTsKKworCQl0b2tlbiA9IG1hdGNoX3Rva2VuKHAsIHRva2VucywgYXJncyk7CisJCXN3aXRjaCAodG9rZW4pIHsKKwkJY2FzZSBPcHRfaW50ZWdyaXR5OgorCQkJKmZsYWcgJj0gfkpGU19OT0lOVEVHUklUWTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9ub2ludGVncml0eToKKwkJCSpmbGFnIHw9IEpGU19OT0lOVEVHUklUWTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9pZ25vcmU6CisJCQkvKiBTaWxlbnRseSBpZ25vcmUgdGhlIHF1b3RhIG9wdGlvbnMgKi8KKwkJCS8qIERvbid0IGRvIGFueXRoaW5nIDstKSAqLworCQkJYnJlYWs7CisJCWNhc2UgT3B0X2lvY2hhcnNldDoKKwkJCWlmIChubHNfbWFwICYmIG5sc19tYXAgIT0gKHZvaWQgKikgLTEpCisJCQkJdW5sb2FkX25scyhubHNfbWFwKTsKKwkJCWlmICghc3RyY21wKGFyZ3NbMF0uZnJvbSwgIm5vbmUiKSkKKwkJCQlubHNfbWFwID0gTlVMTDsKKwkJCWVsc2UgeworCQkJCW5sc19tYXAgPSBsb2FkX25scyhhcmdzWzBdLmZyb20pOworCQkJCWlmICghbmxzX21hcCkgeworCQkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkJICAgICAgICJKRlM6IGNoYXJzZXQgbm90IGZvdW5kXG4iKTsKKwkJCQkJZ290byBjbGVhbnVwOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE9wdF9yZXNpemU6CisJCXsKKwkJCWNoYXIgKnJlc2l6ZSA9IGFyZ3NbMF0uZnJvbTsKKwkJCSpuZXdMVlNpemUgPSBzaW1wbGVfc3RydG91bGwocmVzaXplLCAmcmVzaXplLCAwKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgT3B0X3Jlc2l6ZV9ub3NpemU6CisJCXsKKwkJCSpuZXdMVlNpemUgPSBzYi0+c19iZGV2LT5iZF9pbm9kZS0+aV9zaXplID4+CisJCQkJc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJCQlpZiAoKm5ld0xWU2l6ZSA9PSAwKQorCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCSAgICAgICAiSkZTOiBDYW5ub3QgZGV0ZXJtaW5lIHZvbHVtZSBzaXplXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgT3B0X2Vycm9yczoKKwkJeworCQkJY2hhciAqZXJyb3JzID0gYXJnc1swXS5mcm9tOworCQkJaWYgKCFlcnJvcnMgfHwgISplcnJvcnMpCisJCQkJZ290byBjbGVhbnVwOworCQkJaWYgKCFzdHJjbXAoZXJyb3JzLCAiY29udGludWUiKSkgeworCQkJCSpmbGFnICY9IH5KRlNfRVJSX1JFTU9VTlRfUk87CisJCQkJKmZsYWcgJj0gfkpGU19FUlJfUEFOSUM7CisJCQkJKmZsYWcgfD0gSkZTX0VSUl9DT05USU5VRTsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChlcnJvcnMsICJyZW1vdW50LXJvIikpIHsKKwkJCQkqZmxhZyAmPSB+SkZTX0VSUl9DT05USU5VRTsKKwkJCQkqZmxhZyAmPSB+SkZTX0VSUl9QQU5JQzsKKwkJCQkqZmxhZyB8PSBKRlNfRVJSX1JFTU9VTlRfUk87CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoZXJyb3JzLCAicGFuaWMiKSkgeworCQkJCSpmbGFnICY9IH5KRlNfRVJSX0NPTlRJTlVFOworCQkJCSpmbGFnICY9IH5KRlNfRVJSX1JFTU9VTlRfUk87CisJCQkJKmZsYWcgfD0gSkZTX0VSUl9QQU5JQzsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJICAgICAgICJKRlM6ICVzIGlzIGFuIGludmFsaWQgZXJyb3IgaGFuZGxlclxuIiwKKwkJCQkgICAgICAgZXJyb3JzKTsKKwkJCQlnb3RvIGNsZWFudXA7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OgorCQkJcHJpbnRrKCJqZnM6IFVucmVjb2duaXplZCBtb3VudCBvcHRpb24gXCIlc1wiICIKKwkJCQkJIiBvciBtaXNzaW5nIHZhbHVlXG4iLCBwKTsKKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCX0KKworCWlmIChubHNfbWFwICE9ICh2b2lkICopIC0xKSB7CisJCS8qIERpc2NhcmQgb2xkIChpZiByZW1vdW50KSAqLworCQlpZiAoc2JpLT5ubHNfdGFiKQorCQkJdW5sb2FkX25scyhzYmktPm5sc190YWIpOworCQlzYmktPm5sc190YWIgPSBubHNfbWFwOworCX0KKwlyZXR1cm4gMTsKKworY2xlYW51cDoKKwlpZiAobmxzX21hcCAmJiBubHNfbWFwICE9ICh2b2lkICopIC0xKQorCQl1bmxvYWRfbmxzKG5sc19tYXApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGpmc19yZW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpCit7CisJczY0IG5ld0xWU2l6ZSA9IDA7CisJaW50IHJjID0gMDsKKwlpbnQgZmxhZyA9IEpGU19TQkkoc2IpLT5mbGFnOworCisJaWYgKCFwYXJzZV9vcHRpb25zKGRhdGEsIHNiLCAmbmV3TFZTaXplLCAmZmxhZykpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChuZXdMVlNpemUpIHsKKwkJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJICAiSkZTOiByZXNpemUgcmVxdWlyZXMgdm9sdW1lIHRvIGJlIG1vdW50ZWQgcmVhZC13cml0ZVxuIik7CisJCQlyZXR1cm4gLUVST0ZTOworCQl9CisJCXJjID0gamZzX2V4dGVuZGZzKHNiLCBuZXdMVlNpemUsIDApOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJfQorCisJaWYgKChzYi0+c19mbGFncyAmIE1TX1JET05MWSkgJiYgISgqZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCUpGU19TQkkoc2IpLT5mbGFnID0gZmxhZzsKKwkJcmV0dXJuIGpmc19tb3VudF9ydyhzYiwgMSk7CisJfQorCWlmICgoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpICYmICgqZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCXJjID0gamZzX3Vtb3VudF9ydyhzYik7CisJCUpGU19TQkkoc2IpLT5mbGFnID0gZmxhZzsKKwkJcmV0dXJuIHJjOworCX0KKwlpZiAoKEpGU19TQkkoc2IpLT5mbGFnICYgSkZTX05PSU5URUdSSVRZKSAhPSAoZmxhZyAmIEpGU19OT0lOVEVHUklUWSkpCisJCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQkJcmMgPSBqZnNfdW1vdW50X3J3KHNiKTsKKwkJCWlmIChyYykKKwkJCQlyZXR1cm4gcmM7CisJCQlKRlNfU0JJKHNiKS0+ZmxhZyA9IGZsYWc7CisJCQlyZXR1cm4gamZzX21vdW50X3J3KHNiLCAxKTsKKwkJfQorCUpGU19TQkkoc2IpLT5mbGFnID0gZmxhZzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGpmc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCit7CisJc3RydWN0IGpmc19zYl9pbmZvICpzYmk7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgcmM7CisJczY0IG5ld0xWU2l6ZSA9IDA7CisJaW50IGZsYWc7CisKKwlqZnNfaW5mbygiSW4gamZzX3JlYWRfc3VwZXI6IHNfZmxhZ3M9MHglbHgiLCBzYi0+c19mbGFncyk7CisKKwlpZiAoIW5ld192YWxpZF9kZXYoc2ItPnNfYmRldi0+YmRfZGV2KSkKKwkJcmV0dXJuIC1FT1ZFUkZMT1c7CisKKwlzYmkgPSBrbWFsbG9jKHNpemVvZiAoc3RydWN0IGpmc19zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYmkpCisJCXJldHVybiAtRU5PU1BDOworCW1lbXNldChzYmksIDAsIHNpemVvZiAoc3RydWN0IGpmc19zYl9pbmZvKSk7CisJc2ItPnNfZnNfaW5mbyA9IHNiaTsKKwlzYmktPnNiID0gc2I7CisKKwkvKiBpbml0aWFsaXplIHRoZSBtb3VudCBmbGFnIGFuZCBkZXRlcm1pbmUgdGhlIGRlZmF1bHQgZXJyb3IgaGFuZGxlciAqLworCWZsYWcgPSBKRlNfRVJSX1JFTU9VTlRfUk87CisKKwlpZiAoIXBhcnNlX29wdGlvbnMoKGNoYXIgKikgZGF0YSwgc2IsICZuZXdMVlNpemUsICZmbGFnKSkgeworCQlrZnJlZShzYmkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc2JpLT5mbGFnID0gZmxhZzsKKworI2lmZGVmIENPTkZJR19KRlNfUE9TSVhfQUNMCisJc2ItPnNfZmxhZ3MgfD0gTVNfUE9TSVhBQ0w7CisjZW5kaWYKKworCWlmIChuZXdMVlNpemUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJyZXNpemUgb3B0aW9uIGZvciByZW1vdW50IG9ubHlcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIEluaXRpYWxpemUgYmxvY2tzaXplIHRvIDRLLgorCSAqLworCXNiX3NldF9ibG9ja3NpemUoc2IsIFBTSVpFKTsKKworCS8qCisJICogU2V0IG1ldGhvZCB2ZWN0b3JzLgorCSAqLworCXNiLT5zX29wID0gJmpmc19zdXBlcl9vcGVyYXRpb25zOworCXNiLT5zX2V4cG9ydF9vcCA9ICZqZnNfZXhwb3J0X29wZXJhdGlvbnM7CisKKwlyYyA9IGpmc19tb3VudChzYik7CisJaWYgKHJjKSB7CisJCWlmICghc2lsZW50KSB7CisJCQlqZnNfZXJyKCJqZnNfbW91bnQgZmFpbGVkIHcvcmV0dXJuIGNvZGUgPSAlZCIsIHJjKTsKKwkJfQorCQlnb3RvIG91dF9rZnJlZTsKKwl9CisJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQorCQlzYmktPmxvZyA9IE5VTEw7CisJZWxzZSB7CisJCXJjID0gamZzX21vdW50X3J3KHNiLCAwKTsKKwkJaWYgKHJjKSB7CisJCQlpZiAoIXNpbGVudCkgeworCQkJCWpmc19lcnIoImpmc19tb3VudF9ydyBmYWlsZWQsIHJldHVybiBjb2RlID0gJWQiLAorCQkJCQlyYyk7CisJCQl9CisJCQlnb3RvIG91dF9ub19ydzsKKwkJfQorCX0KKworCXNiLT5zX21hZ2ljID0gSkZTX1NVUEVSX01BR0lDOworCisJaW5vZGUgPSBpZ2V0KHNiLCBST09UX0kpOworCWlmICghaW5vZGUgfHwgaXNfYmFkX2lub2RlKGlub2RlKSkKKwkJZ290byBvdXRfbm9fcm9vdDsKKwlzYi0+c19yb290ID0gZF9hbGxvY19yb290KGlub2RlKTsKKwlpZiAoIXNiLT5zX3Jvb3QpCisJCWdvdG8gb3V0X25vX3Jvb3Q7CisKKwlpZiAoc2JpLT5tbnRmbGFnICYgSkZTX09TMikKKwkJc2ItPnNfcm9vdC0+ZF9vcCA9ICZqZnNfY2lfZGVudHJ5X29wZXJhdGlvbnM7CisKKwkvKiBsb2dpY2FsIGJsb2NrcyBhcmUgcmVwcmVzZW50ZWQgYnkgNDAgYml0cyBpbiBweGRfdCwgZXRjLiAqLworCXNiLT5zX21heGJ5dGVzID0gKCh1NjQpIHNiLT5zX2Jsb2Nrc2l6ZSkgPDwgNDA7CisjaWYgQklUU19QRVJfTE9ORyA9PSAzMgorCS8qCisJICogUGFnZSBjYWNoZSBpcyBpbmRleGVkIGJ5IGxvbmcuCisJICogSSB3b3VsZCB1c2UgTUFYX0xGU19GSUxFU0laRSwgYnV0IGl0J3Mgb25seSBoYWxmIGFzIGJpZworCSAqLworCXNiLT5zX21heGJ5dGVzID0gbWluKCgodTY0KSBQQUdFX0NBQ0hFX1NJWkUgPDwgMzIpIC0gMSwgc2ItPnNfbWF4Ynl0ZXMpOworI2VuZGlmCisJc2ItPnNfdGltZV9ncmFuID0gMTsKKwlyZXR1cm4gMDsKKworb3V0X25vX3Jvb3Q6CisJamZzX2VycigiamZzX3JlYWRfc3VwZXI6IGdldCByb290IGlub2RlIGZhaWxlZCIpOworCWlmIChpbm9kZSkKKwkJaXB1dChpbm9kZSk7CisKK291dF9ub19ydzoKKwlyYyA9IGpmc191bW91bnQoc2IpOworCWlmIChyYykgeworCQlqZnNfZXJyKCJqZnNfdW1vdW50IGZhaWxlZCB3aXRoIHJldHVybiBjb2RlICVkIiwgcmMpOworCX0KK291dF9rZnJlZToKKwlpZiAoc2JpLT5ubHNfdGFiKQorCQl1bmxvYWRfbmxzKHNiaS0+bmxzX3RhYik7CisJa2ZyZWUoc2JpKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQgamZzX3dyaXRlX3N1cGVyX2xvY2tmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpID0gSkZTX1NCSShzYik7CisJc3RydWN0IGpmc19sb2cgKmxvZyA9IHNiaS0+bG9nOworCisJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCXR4UXVpZXNjZShzYik7CisJCWxtTG9nU2h1dGRvd24obG9nKTsKKwkJdXBkYXRlU3VwZXIoc2IsIEZNX0NMRUFOKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGpmc191bmxvY2tmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBqZnNfc2JfaW5mbyAqc2JpID0gSkZTX1NCSShzYik7CisJc3RydWN0IGpmc19sb2cgKmxvZyA9IHNiaS0+bG9nOworCWludCByYyA9IDA7CisKKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJdXBkYXRlU3VwZXIoc2IsIEZNX01PVU5UKTsKKwkJaWYgKChyYyA9IGxtTG9nSW5pdChsb2cpKSkKKwkJCWpmc19lcnIoImpmc191bmxvY2sgZmFpbGVkIHdpdGggcmV0dXJuIGNvZGUgJWQiLCByYyk7CisJCWVsc2UKKwkJCXR4UmVzdW1lKHNiKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmpmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsIAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgamZzX2ZpbGxfc3VwZXIpOworfQorCitzdGF0aWMgaW50IGpmc19zeW5jX2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB3YWl0KQoreworCXN0cnVjdCBqZnNfbG9nICpsb2cgPSBKRlNfU0JJKHNiKS0+bG9nOworCisJLyogbG9nID09IE5VTEwgaW5kaWNhdGVzIHJlYWQtb25seSBtb3VudCAqLworCWlmIChsb2cpCisJCWpmc19mbHVzaF9qb3VybmFsKGxvZywgd2FpdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGpmc19zdXBlcl9vcGVyYXRpb25zID0geworCS5hbGxvY19pbm9kZQk9IGpmc19hbGxvY19pbm9kZSwKKwkuZGVzdHJveV9pbm9kZQk9IGpmc19kZXN0cm95X2lub2RlLAorCS5yZWFkX2lub2RlCT0gamZzX3JlYWRfaW5vZGUsCisJLmRpcnR5X2lub2RlCT0gamZzX2RpcnR5X2lub2RlLAorCS53cml0ZV9pbm9kZQk9IGpmc193cml0ZV9pbm9kZSwKKwkuZGVsZXRlX2lub2RlCT0gamZzX2RlbGV0ZV9pbm9kZSwKKwkucHV0X3N1cGVyCT0gamZzX3B1dF9zdXBlciwKKwkuc3luY19mcwk9IGpmc19zeW5jX2ZzLAorCS53cml0ZV9zdXBlcl9sb2NrZnMgPSBqZnNfd3JpdGVfc3VwZXJfbG9ja2ZzLAorCS51bmxvY2tmcyAgICAgICA9IGpmc191bmxvY2tmcywKKwkuc3RhdGZzCQk9IGpmc19zdGF0ZnMsCisJLnJlbW91bnRfZnMJPSBqZnNfcmVtb3VudCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgamZzX2V4cG9ydF9vcGVyYXRpb25zID0geworCS5nZXRfcGFyZW50CT0gamZzX2dldF9wYXJlbnQsCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgamZzX2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJqZnMiLAorCS5nZXRfc2IJCT0gamZzX2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfYmxvY2tfc3VwZXIsCisJLmZzX2ZsYWdzCT0gRlNfUkVRVUlSRVNfREVWLAorfTsKKworZXh0ZXJuIGludCBtZXRhcGFnZV9pbml0KHZvaWQpOworZXh0ZXJuIGludCB0eEluaXQodm9pZCk7CitleHRlcm4gdm9pZCB0eEV4aXQodm9pZCk7CitleHRlcm4gdm9pZCBtZXRhcGFnZV9leGl0KHZvaWQpOworCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqZm9vLCBrbWVtX2NhY2hlX3QgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IGpmc19pbm9kZV9pbmZvICpqZnNfaXAgPSAoc3RydWN0IGpmc19pbm9kZV9pbmZvICopIGZvbzsKKworCWlmICgoZmxhZ3MgJiAoU0xBQl9DVE9SX1ZFUklGWSB8IFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CisJICAgIFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikgeworCQltZW1zZXQoamZzX2lwLCAwLCBzaXplb2Yoc3RydWN0IGpmc19pbm9kZV9pbmZvKSk7CisJCUlOSVRfTElTVF9IRUFEKCZqZnNfaXAtPmFub25faW5vZGVfbGlzdCk7CisJCWluaXRfcndzZW0oJmpmc19pcC0+cmR3cmxvY2spOworCQlpbml0X01VVEVYKCZqZnNfaXAtPmNvbW1pdF9zZW0pOworCQlpbml0X3J3c2VtKCZqZnNfaXAtPnhhdHRyX3NlbSk7CisJCXNwaW5fbG9ja19pbml0KCZqZnNfaXAtPmFnX2xvY2spOworCQlqZnNfaXAtPmFjdGl2ZV9hZyA9IC0xOworI2lmZGVmIENPTkZJR19KRlNfUE9TSVhfQUNMCisJCWpmc19pcC0+aV9hY2wgPSBKRlNfQUNMX05PVF9DQUNIRUQ7CisJCWpmc19pcC0+aV9kZWZhdWx0X2FjbCA9IEpGU19BQ0xfTk9UX0NBQ0hFRDsKKyNlbmRpZgorCQlpbm9kZV9pbml0X29uY2UoJmpmc19pcC0+dmZzX2lub2RlKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfamZzX2ZzKHZvaWQpCit7CisJaW50IGk7CisJaW50IHJjOworCisJamZzX2lub2RlX2NhY2hlcCA9CisJICAgIGttZW1fY2FjaGVfY3JlYXRlKCJqZnNfaXAiLCBzaXplb2Yoc3RydWN0IGpmc19pbm9kZV9pbmZvKSwgMCwgCisJCQkgICAgU0xBQl9SRUNMQUlNX0FDQ09VTlQsIGluaXRfb25jZSwgTlVMTCk7CisJaWYgKGpmc19pbm9kZV9jYWNoZXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKgorCSAqIE1ldGFwYWdlIGluaXRpYWxpemF0aW9uCisJICovCisJcmMgPSBtZXRhcGFnZV9pbml0KCk7CisJaWYgKHJjKSB7CisJCWpmc19lcnIoIm1ldGFwYWdlX2luaXQgZmFpbGVkIHcvcmMgPSAlZCIsIHJjKTsKKwkJZ290byBmcmVlX3NsYWI7CisJfQorCisJLyoKKwkgKiBUcmFuc2FjdGlvbiBNYW5hZ2VyIGluaXRpYWxpemF0aW9uCisJICovCisJcmMgPSB0eEluaXQoKTsKKwlpZiAocmMpIHsKKwkJamZzX2VycigidHhJbml0IGZhaWxlZCB3L3JjID0gJWQiLCByYyk7CisJCWdvdG8gZnJlZV9tZXRhcGFnZTsKKwl9CisKKwkvKgorCSAqIEkvTyBjb21wbGV0aW9uIHRocmVhZCAoZW5kaW8pCisJICovCisJamZzSU90aHJlYWQgPSBrZXJuZWxfdGhyZWFkKGpmc0lPV2FpdCwgTlVMTCwgQ0xPTkVfS0VSTkVMKTsKKwlpZiAoamZzSU90aHJlYWQgPCAwKSB7CisJCWpmc19lcnIoImluaXRfamZzX2ZzOiBmb3JrIGZhaWxlZCB3L3JjID0gJWQiLCBqZnNJT3RocmVhZCk7CisJCWdvdG8gZW5kX3R4bW5ncjsKKwl9CisJd2FpdF9mb3JfY29tcGxldGlvbigmamZzSU93YWl0KTsJLyogV2FpdCB1bnRpbCB0aHJlYWQgc3RhcnRzICovCisKKwlpZiAoY29tbWl0X3RocmVhZHMgPCAxKQorCQljb21taXRfdGhyZWFkcyA9IG51bV9vbmxpbmVfY3B1cygpOworCWlmIChjb21taXRfdGhyZWFkcyA+IE1BWF9DT01NSVRfVEhSRUFEUykKKwkJY29tbWl0X3RocmVhZHMgPSBNQVhfQ09NTUlUX1RIUkVBRFM7CisKKwlmb3IgKGkgPSAwOyBpIDwgY29tbWl0X3RocmVhZHM7IGkrKykgeworCQlqZnNDb21taXRUaHJlYWRbaV0gPSBrZXJuZWxfdGhyZWFkKGpmc19sYXp5Y29tbWl0LCBOVUxMLAorCQkJCQkJICAgQ0xPTkVfS0VSTkVMKTsKKwkJaWYgKGpmc0NvbW1pdFRocmVhZFtpXSA8IDApIHsKKwkJCWpmc19lcnIoImluaXRfamZzX2ZzOiBmb3JrIGZhaWxlZCB3L3JjID0gJWQiLAorCQkJCWpmc0NvbW1pdFRocmVhZFtpXSk7CisJCQljb21taXRfdGhyZWFkcyA9IGk7CisJCQlnb3RvIGtpbGxfY29tbWl0dGFzazsKKwkJfQorCQkvKiBXYWl0IHVudGlsIHRocmVhZCBzdGFydHMgKi8KKwkJd2FpdF9mb3JfY29tcGxldGlvbigmamZzSU93YWl0KTsKKwl9CisKKwlqZnNTeW5jVGhyZWFkID0ga2VybmVsX3RocmVhZChqZnNfc3luYywgTlVMTCwgQ0xPTkVfS0VSTkVMKTsKKwlpZiAoamZzU3luY1RocmVhZCA8IDApIHsKKwkJamZzX2VycigiaW5pdF9qZnNfZnM6IGZvcmsgZmFpbGVkIHcvcmMgPSAlZCIsIGpmc1N5bmNUaHJlYWQpOworCQlnb3RvIGtpbGxfY29tbWl0dGFzazsKKwl9CisJd2FpdF9mb3JfY29tcGxldGlvbigmamZzSU93YWl0KTsJLyogV2FpdCB1bnRpbCB0aHJlYWQgc3RhcnRzICovCisKKyNpZmRlZiBQUk9DX0ZTX0pGUworCWpmc19wcm9jX2luaXQoKTsKKyNlbmRpZgorCisJcmV0dXJuIHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmpmc19mc190eXBlKTsKKwora2lsbF9jb21taXR0YXNrOgorCWpmc19zdG9wX3RocmVhZHMgPSAxOworCXdha2VfdXBfYWxsKCZqZnNfY29tbWl0X3RocmVhZF93YWl0KTsKKwlmb3IgKGkgPSAwOyBpIDwgY29tbWl0X3RocmVhZHM7IGkrKykKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmamZzSU93YWl0KTsKKworCXdha2VfdXAoJmpmc19JT190aHJlYWRfd2FpdCk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmamZzSU93YWl0KTsJLyogV2FpdCBmb3IgdGhyZWFkIGV4aXQgKi8KK2VuZF90eG1uZ3I6CisJdHhFeGl0KCk7CitmcmVlX21ldGFwYWdlOgorCW1ldGFwYWdlX2V4aXQoKTsKK2ZyZWVfc2xhYjoKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koamZzX2lub2RlX2NhY2hlcCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9qZnNfZnModm9pZCkKK3sKKwlpbnQgaTsKKworCWpmc19pbmZvKCJleGl0X2pmc19mcyBjYWxsZWQiKTsKKworCWpmc19zdG9wX3RocmVhZHMgPSAxOworCXR4RXhpdCgpOworCW1ldGFwYWdlX2V4aXQoKTsKKwl3YWtlX3VwKCZqZnNfSU9fdGhyZWFkX3dhaXQpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmpmc0lPd2FpdCk7CS8qIFdhaXQgdW50aWwgSU8gdGhyZWFkIGV4aXRzICovCisJd2FrZV91cF9hbGwoJmpmc19jb21taXRfdGhyZWFkX3dhaXQpOworCWZvciAoaSA9IDA7IGkgPCBjb21taXRfdGhyZWFkczsgaSsrKQorCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZqZnNJT3dhaXQpOworCXdha2VfdXAoJmpmc19zeW5jX3RocmVhZF93YWl0KTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZqZnNJT3dhaXQpOwkvKiBXYWl0IHVudGlsIFN5bmMgdGhyZWFkIGV4aXRzICovCisjaWZkZWYgUFJPQ19GU19KRlMKKwlqZnNfcHJvY19jbGVhbigpOworI2VuZGlmCisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZqZnNfZnNfdHlwZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KGpmc19pbm9kZV9jYWNoZXApOworfQorCittb2R1bGVfaW5pdChpbml0X2pmc19mcykKK21vZHVsZV9leGl0KGV4aXRfamZzX2ZzKQpkaWZmIC0tZ2l0IGEvZnMvamZzL3N5bWxpbmsuYyBiL2ZzL2pmcy9zeW1saW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY0YzA3ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2pmcy9zeW1saW5rLmMKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqICAgQ29weXJpZ2h0IChjKSBDaHJpc3RvcGggSGVsbHdpZywgMjAwMS0yMDAyCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlICJqZnNfaW5jb3JlLmgiCisjaW5jbHVkZSAiamZzX3hhdHRyLmgiCisKK3N0YXRpYyBpbnQgamZzX2ZvbGxvd19saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJY2hhciAqcyA9IEpGU19JUChkZW50cnktPmRfaW5vZGUpLT5pX2lubGluZTsKKwluZF9zZXRfbGluayhuZCwgcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGpmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnJlYWRsaW5rCT0gZ2VuZXJpY19yZWFkbGluaywKKwkuZm9sbG93X2xpbmsJPSBqZnNfZm9sbG93X2xpbmssCisJLnNldHhhdHRyCT0gamZzX3NldHhhdHRyLAorCS5nZXR4YXR0cgk9IGpmc19nZXR4YXR0ciwKKwkubGlzdHhhdHRyCT0gamZzX2xpc3R4YXR0ciwKKwkucmVtb3ZleGF0dHIJPSBqZnNfcmVtb3ZleGF0dHIsCit9OworCmRpZmYgLS1naXQgYS9mcy9qZnMveGF0dHIuYyBiL2ZzL2pmcy94YXR0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhOWZmZDUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9qZnMveGF0dHIuYwpAQCAtMCwwICsxLDExMjcgQEAKKy8qCisgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyAgQ29ycC4sIDIwMDAtMjAwNAorICogICBDb3B5cmlnaHQgKEMpIENocmlzdG9waCBIZWxsd2lnLCAyMDAyCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgIHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgIHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUKKyAqICAgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgIGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgveGF0dHIuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorI2luY2x1ZGUgImpmc19pbmNvcmUuaCIKKyNpbmNsdWRlICJqZnNfc3VwZXJibG9jay5oIgorI2luY2x1ZGUgImpmc19kbWFwLmgiCisjaW5jbHVkZSAiamZzX2RlYnVnLmgiCisjaW5jbHVkZSAiamZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgImpmc19leHRlbnQuaCIKKyNpbmNsdWRlICJqZnNfbWV0YXBhZ2UuaCIKKyNpbmNsdWRlICJqZnNfeGF0dHIuaCIKKyNpbmNsdWRlICJqZnNfYWNsLmgiCisKKy8qCisgKglqZnNfeGF0dHIuYzogZXh0ZW5kZWQgYXR0cmlidXRlIHNlcnZpY2UKKyAqCisgKiBPdmVyYWxsIGRlc2lnbiAtLQorICoKKyAqIEZvcm1hdDoKKyAqCisgKiAgIEV4dGVuZGVkIGF0dHJpYnV0ZSBsaXN0cyAoamZzX2VhX2xpc3QpIGNvbnNpc3Qgb2YgYW4gb3ZlcmFsbCBzaXplICgzMiBiaXQKKyAqICAgdmFsdWUpIGFuZCBhIHZhcmlhYmxlICgwIG9yIG1vcmUpIG51bWJlciBvZiBleHRlbmRlZCBhdHRyaWJ1dGUKKyAqICAgZW50cmllcy4gIEVhY2ggZXh0ZW5kZWQgYXR0cmlidXRlIGVudHJ5IChqZnNfZWEpIGlzIGEgPG5hbWUsdmFsdWU+IGRvdWJsZQorICogICB3aGVyZSA8bmFtZT4gaXMgY29uc3RydWN0ZWQgZnJvbSBhIG51bGwtdGVybWluYXRlZCBhc2NpaSBzdHJpbmcKKyAqICAgKDEgLi4uIDI1NSBieXRlcyBpbiB0aGUgbmFtZSkgYW5kIDx2YWx1ZT4gaXMgYXJiaXRyYXJ5IDggYml0IGRhdGEKKyAqICAgKDEgLi4uIDY1NTM1IGJ5dGVzKS4gIFRoZSBpbi1tZW1vcnkgZm9ybWF0IGlzCisgKgorICogICAwICAgICAgIDEgICAgICAgIDIgICAgICAgIDQgICAgICAgICAgICAgICAgNCArIG5hbWVsZW4gKyAxCisgKiAgICstLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqICAgfCBGbGFncyB8IE5hbWUgICB8IFZhbHVlICB8IE5hbWUgU3RyaW5nIFwwIHwgRGF0YSAuIC4gLiAuICAgICAgfAorICogICB8ICAgICAgIHwgTGVuZ3RoIHwgTGVuZ3RoIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICB8CisgKiAgICstLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqCisgKiAgIEEgamZzX2VhX2xpc3QgdGhlbiBpcyBzdHJ1Y3R1cmVkIGFzCisgKgorICogICAwICAgICAgICAgICAgNCAgICAgICAgICAgICAgICAgICA0ICsgRUFfU0laRShlYTEpCisgKiAgICstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLQorICogICB8IE92ZXJhbGwgRUEgfCBGaXJzdCBGRUEgRWxlbWVudCB8IFNlY29uZCBGRUEgRWxlbWVudCB8IC4uLi4uIAorICogICB8IExpc3QgU2l6ZSAgfCAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8CisgKiAgICstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLQorICoKKyAqICAgT24tZGlzazoKKyAqCisgKiAgICAgRkVBTElTVHMgYXJlIHN0b3JlZCBvbiBkaXNrIHVzaW5nIGJsb2NrcyBhbGxvY2F0ZWQgYnkgZGJBbGxvYygpIGFuZAorICogICAgIHdyaXR0ZW4gZGlyZWN0bHkuIEFuIEVBIGxpc3QgbWF5IGJlIGluLWxpbmVkIGluIHRoZSBpbm9kZSBpZiB0aGVyZSBpcworICogICAgIHN1ZmZpY2llbnQgcm9vbSBhdmFpbGFibGUuCisgKi8KKworc3RydWN0IGVhX2J1ZmZlciB7CisJaW50IGZsYWc7CQkvKiBJbmRpY2F0ZXMgd2hhdCBzdG9yYWdlIHhhdHRyIHBvaW50cyB0byAqLworCWludCBtYXhfc2l6ZTsJCS8qIGxhcmdlc3QgeGF0dHIgdGhhdCBmaXRzIGluIGN1cnJlbnQgYnVmZmVyICovCisJZHhkX3QgbmV3X2VhOwkJLyogZHhkIHRvIHJlcGxhY2UgZWEgd2hlbiBtb2RpZnlpbmcgeGF0dHIgKi8KKwlzdHJ1Y3QgbWV0YXBhZ2UgKm1wOwkvKiBtZXRhcGFnZSBjb250YWluaW5nIGVhIGxpc3QgKi8KKwlzdHJ1Y3QgamZzX2VhX2xpc3QgKnhhdHRyOwkvKiBidWZmZXIgY29udGFpbmluZyBlYSBsaXN0ICovCit9OworCisvKgorICogZWFfYnVmZmVyLmZsYWcgdmFsdWVzCisgKi8KKyNkZWZpbmUgRUFfSU5MSU5FCTB4MDAwMQorI2RlZmluZSBFQV9FWFRFTlQJMHgwMDAyCisjZGVmaW5lIEVBX05FVwkJMHgwMDA0CisjZGVmaW5lIEVBX01BTExPQwkweDAwMDgKKworLyogTmFtZXNwYWNlcyAqLworI2RlZmluZSBYQVRUUl9TWVNURU1fUFJFRklYICJzeXN0ZW0uIgorI2RlZmluZSBYQVRUUl9TWVNURU1fUFJFRklYX0xFTiAoc2l6ZW9mIChYQVRUUl9TWVNURU1fUFJFRklYKSAtIDEpCisKKyNkZWZpbmUgWEFUVFJfVVNFUl9QUkVGSVggInVzZXIuIgorI2RlZmluZSBYQVRUUl9VU0VSX1BSRUZJWF9MRU4gKHNpemVvZiAoWEFUVFJfVVNFUl9QUkVGSVgpIC0gMSkKKworI2RlZmluZSBYQVRUUl9PUzJfUFJFRklYICJvczIuIgorI2RlZmluZSBYQVRUUl9PUzJfUFJFRklYX0xFTiAoc2l6ZW9mIChYQVRUUl9PUzJfUFJFRklYKSAtIDEpCisKKy8qIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCBpcyBkZWZpbmVkIGluIGluY2x1ZGUvbGludXgveGF0dHIuaCAqLworI2RlZmluZSBYQVRUUl9TRUNVUklUWV9QUkVGSVhfTEVOIChzaXplb2YgKFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCkgLSAxKQorCisjZGVmaW5lIFhBVFRSX1RSVVNURURfUFJFRklYICJ0cnVzdGVkLiIKKyNkZWZpbmUgWEFUVFJfVFJVU1RFRF9QUkVGSVhfTEVOIChzaXplb2YgKFhBVFRSX1RSVVNURURfUFJFRklYKSAtIDEpCisKKy8qCisgKiBUaGVzZSB0aHJlZSByb3V0aW5lcyBhcmUgdXNlZCB0byByZWNvZ25pemUgb24tZGlzayBleHRlbmRlZCBhdHRyaWJ1dGVzCisgKiB0aGF0IGFyZSBpbiBhIHJlY29nbml6ZWQgbmFtZXNwYWNlLiAgSWYgdGhlIGF0dHJpYnV0ZSBpcyBub3QgcmVjb2duaXplZCwKKyAqICJvczIuIiBpcyBwcmVwZW5kZWQgdG8gdGhlIG5hbWUKKyAqLworc3RhdGljIGlubGluZSBpbnQgaXNfb3MyX3hhdHRyKHN0cnVjdCBqZnNfZWEgKmVhKQoreworCS8qCisJICogQ2hlY2sgZm9yICJzeXN0ZW0uIgorCSAqLworCWlmICgoZWEtPm5hbWVsZW4gPj0gWEFUVFJfU1lTVEVNX1BSRUZJWF9MRU4pICYmCisJICAgICFzdHJuY21wKGVhLT5uYW1lLCBYQVRUUl9TWVNURU1fUFJFRklYLCBYQVRUUl9TWVNURU1fUFJFRklYX0xFTikpCisJCXJldHVybiBGQUxTRTsKKwkvKgorCSAqIENoZWNrIGZvciAidXNlci4iCisJICovCisJaWYgKChlYS0+bmFtZWxlbiA+PSBYQVRUUl9VU0VSX1BSRUZJWF9MRU4pICYmCisJICAgICFzdHJuY21wKGVhLT5uYW1lLCBYQVRUUl9VU0VSX1BSRUZJWCwgWEFUVFJfVVNFUl9QUkVGSVhfTEVOKSkKKwkJcmV0dXJuIEZBTFNFOworCS8qCisJICogQ2hlY2sgZm9yICJzZWN1cml0eS4iCisJICovCisJaWYgKChlYS0+bmFtZWxlbiA+PSBYQVRUUl9TRUNVUklUWV9QUkVGSVhfTEVOKSAmJgorCSAgICAhc3RybmNtcChlYS0+bmFtZSwgWEFUVFJfU0VDVVJJVFlfUFJFRklYLAorCQkgICAgIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWF9MRU4pKQorCQlyZXR1cm4gRkFMU0U7CisJLyoKKwkgKiBDaGVjayBmb3IgInRydXN0ZWQuIgorCSAqLworCWlmICgoZWEtPm5hbWVsZW4gPj0gWEFUVFJfVFJVU1RFRF9QUkVGSVhfTEVOKSAmJgorCSAgICAhc3RybmNtcChlYS0+bmFtZSwgWEFUVFJfVFJVU1RFRF9QUkVGSVgsIFhBVFRSX1RSVVNURURfUFJFRklYX0xFTikpCisJCXJldHVybiBGQUxTRTsKKwkvKgorCSAqIEFkZCBhbnkgb3RoZXIgdmFsaWQgbmFtZXNwYWNlIHByZWZpeGVzIGhlcmUKKwkgKi8KKworCS8qCisJICogV2UgYXNzdW1lIGl0J3MgT1MvMidzIGZsYXQgbmFtZXNwYWNlCisJICovCisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG5hbWVfc2l6ZShzdHJ1Y3QgamZzX2VhICplYSkKK3sKKwlpZiAoaXNfb3MyX3hhdHRyKGVhKSkKKwkJcmV0dXJuIGVhLT5uYW1lbGVuICsgWEFUVFJfT1MyX1BSRUZJWF9MRU47CisJZWxzZQorCQlyZXR1cm4gZWEtPm5hbWVsZW47Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNvcHlfbmFtZShjaGFyICpidWZmZXIsIHN0cnVjdCBqZnNfZWEgKmVhKQoreworCWludCBsZW4gPSBlYS0+bmFtZWxlbjsKKworCWlmIChpc19vczJfeGF0dHIoZWEpKSB7CisJCW1lbWNweShidWZmZXIsIFhBVFRSX09TMl9QUkVGSVgsIFhBVFRSX09TMl9QUkVGSVhfTEVOKTsKKwkJYnVmZmVyICs9IFhBVFRSX09TMl9QUkVGSVhfTEVOOworCQlsZW4gKz0gWEFUVFJfT1MyX1BSRUZJWF9MRU47CisJfQorCW1lbWNweShidWZmZXIsIGVhLT5uYW1lLCBlYS0+bmFtZWxlbik7CisJYnVmZmVyW2VhLT5uYW1lbGVuXSA9IDA7CisKKwlyZXR1cm4gbGVuOworfQorCisvKiBGb3J3YXJkIHJlZmVyZW5jZXMgKi8KK3N0YXRpYyB2b2lkIGVhX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGVhX2J1ZmZlciAqZWFfYnVmKTsKKworLyoKKyAqIE5BTUU6IGVhX3dyaXRlX2lubGluZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogRlVOQ1RJT046IEF0dGVtcHQgdG8gd3JpdGUgYW4gRUEgaW5saW5lIGlmIGFyZWEgaXMgYXZhaWxhYmxlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBQUkUgQ09ORElUSU9OUzoKKyAqCUFscmVhZHkgdmVyaWZpZWQgdGhhdCB0aGUgc3BlY2lmaWVkIEVBIGlzIHNtYWxsIGVub3VnaCB0byBmaXQgaW5saW5lCisgKgorICogUEFSQU1FVEVSUzoKKyAqCWlwCS0gSW5vZGUgcG9pbnRlcgorICoJZWFsaXN0CS0gRUEgbGlzdCBwb2ludGVyCisgKglzaXplCS0gc2l6ZSBvZiBlYWxpc3QgaW4gYnl0ZXMKKyAqCWVhCS0gZHhkX3Qgc3RydWN0dXJlIHRvIGJlIGZpbGxlZCBpbiB3aXRoIG5lY2Vzc2FyeSBFQSBpbmZvcm1hdGlvbgorICoJCSAgaWYgd2Ugc3VjY2Vzc2Z1bGx5IGNvcHkgdGhlIEVBIGlubGluZQorICoKKyAqIE5PVEVTOgorICoJQ2hlY2tzIGlmIHRoZSBpbm9kZSdzIGlubGluZSBhcmVhIGlzIGF2YWlsYWJsZS4gIElmIHNvLCBjb3BpZXMgRUEgaW5saW5lCisgKglhbmQgc2V0cyA8ZWE+IGZpZWxkcyBhcHByb3ByaWF0ZWx5LiAgT3RoZXJ3aXNlLCByZXR1cm5zIGZhaWx1cmUsIEVBIHdpbGwKKyAqCWhhdmUgdG8gYmUgcHV0IGludG8gYW4gZXh0ZW50LgorICoKKyAqIFJFVFVSTlM6IDAgZm9yIHN1Y2Nlc3NmdWwgY29weSB0byBpbmxpbmUgYXJlYTsgLTEgaWYgYXJlYSBub3QgYXZhaWxhYmxlCisgKi8KK3N0YXRpYyBpbnQgZWFfd3JpdGVfaW5saW5lKHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBqZnNfZWFfbGlzdCAqZWFsaXN0LAorCQkJICAgaW50IHNpemUsIGR4ZF90ICogZWEpCit7CisJc3RydWN0IGpmc19pbm9kZV9pbmZvICpqaSA9IEpGU19JUChpcCk7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB3ZSBoYXZlIGFuIEVBIC0tIHRoZSBOVUxMIEVBIGxpc3QgaXMgdmFsaWQsIGJ1dCB5b3UKKwkgKiBjYW4ndCBjb3B5IGl0IQorCSAqLworCWlmIChlYWxpc3QgJiYgc2l6ZSA+IHNpemVvZiAoc3RydWN0IGpmc19lYV9saXN0KSkgeworCQlhc3NlcnQoc2l6ZSA8PSBzaXplb2YgKGppLT5pX2lubGluZV9lYSkpOworCisJCS8qCisJCSAqIFNlZSBpZiB0aGUgc3BhY2UgaXMgYXZhaWxhYmxlIG9yIGlmIGl0IGlzIGFscmVhZHkgYmVpbmcKKwkJICogdXNlZCBmb3IgYW4gaW5saW5lIEVBLgorCQkgKi8KKwkJaWYgKCEoamktPm1vZGUyICYgSU5MSU5FRUEpICYmICEoamktPmVhLmZsYWcgJiBEWERfSU5MSU5FKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJRFhEc2l6ZShlYSwgc2l6ZSk7CisJCURYRGxlbmd0aChlYSwgMCk7CisJCURYRGFkZHJlc3MoZWEsIDApOworCQltZW1jcHkoamktPmlfaW5saW5lX2VhLCBlYWxpc3QsIHNpemUpOworCQllYS0+ZmxhZyA9IERYRF9JTkxJTkU7CisJCWppLT5tb2RlMiAmPSB+SU5MSU5FRUE7CisJfSBlbHNlIHsKKwkJZWEtPmZsYWcgPSAwOworCQlEWERzaXplKGVhLCAwKTsKKwkJRFhEbGVuZ3RoKGVhLCAwKTsKKwkJRFhEYWRkcmVzcyhlYSwgMCk7CisKKwkJLyogRnJlZSB1cCBJTkxJTkUgYXJlYSAqLworCQlpZiAoamktPmVhLmZsYWcgJiBEWERfSU5MSU5FKQorCQkJamktPm1vZGUyIHw9IElOTElORUVBOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogTkFNRTogZWFfd3JpdGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEZVTkNUSU9OOiBXcml0ZSBhbiBFQSBmb3IgYW4gaW5vZGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIFBSRSBDT05ESVRJT05TOiBFQSBoYXMgYmVlbiB2ZXJpZmllZCAKKyAqCisgKiBQQVJBTUVURVJTOgorICoJaXAJLSBJbm9kZSBwb2ludGVyCisgKgllYWxpc3QJLSBFQSBsaXN0IHBvaW50ZXIKKyAqCXNpemUJLSBzaXplIG9mIGVhbGlzdCBpbiBieXRlcworICoJZWEJLSBkeGRfdCBzdHJ1Y3R1cmUgdG8gYmUgZmlsbGVkIGluIGFwcHJvcHJpYXRlbHkgd2l0aCB3aGVyZSB0aGUKKyAqCQkgIEVBIHdhcyBjb3BpZWQKKyAqCisgKiBOT1RFUzogV2lsbCB3cml0ZSBFQSBpbmxpbmUgaWYgYWJsZSB0bywgb3RoZXJ3aXNlIGFsbG9jYXRlcyBibG9ja3MgZm9yIGFuCisgKglleHRlbnQgYW5kIHN5bmNocm9ub3VzbHkgd3JpdGVzIGl0IHRvIHRob3NlIGJsb2Nrcy4KKyAqCisgKiBSRVRVUk5TOiAwIGZvciBzdWNjZXNzOyBBbnl0aGluZyBlbHNlIGluZGljYXRlcyBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgZWFfd3JpdGUoc3RydWN0IGlub2RlICppcCwgc3RydWN0IGpmc19lYV9saXN0ICplYWxpc3QsIGludCBzaXplLAorCQkgICAgICAgZHhkX3QgKiBlYSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaXAtPmlfc2I7CisJc3RydWN0IGpmc19pbm9kZV9pbmZvICpqaSA9IEpGU19JUChpcCk7CisJc3RydWN0IGpmc19zYl9pbmZvICpzYmkgPSBKRlNfU0JJKHNiKTsKKwlpbnQgbmJsb2NrczsKKwlzNjQgYmxrbm87CisJaW50IHJjID0gMCwgaTsKKwljaGFyICpjcDsKKwlzMzIgbmJ5dGVzLCBuYjsKKwlzMzIgYnl0ZXNfdG9fd3JpdGU7CisJc3RydWN0IG1ldGFwYWdlICptcDsKKworCS8qCisJICogUXVpY2sgY2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgYW4gaW4tbGluYWJsZSBFQS4gIFNob3J0IEVBcworCSAqIGFuZCBlbXB0eSBFQXMgYXJlIGFsbCBpbi1saW5hYmxlLCBwcm92aWRlZCB0aGUgc3BhY2UgZXhpc3RzLgorCSAqLworCWlmICghZWFsaXN0IHx8IHNpemUgPD0gc2l6ZW9mIChqaS0+aV9pbmxpbmVfZWEpKSB7CisJCWlmICghZWFfd3JpdGVfaW5saW5lKGlwLCBlYWxpc3QsIHNpemUsIGVhKSkKKwkJCXJldHVybiAwOworCX0KKworCS8qIGZpZ3VyZSBvdXQgaG93IG1hbnkgYmxvY2tzIHdlIG5lZWQgKi8KKwluYmxvY2tzID0gKHNpemUgKyAoc2ItPnNfYmxvY2tzaXplIC0gMSkpID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCisJLyogQWxsb2NhdGUgbmV3IGJsb2NrcyB0byBxdW90YS4gKi8KKwlpZiAoRFFVT1RfQUxMT0NfQkxPQ0soaXAsIG5ibG9ja3MpKSB7CisJCXJldHVybiAtRURRVU9UOworCX0KKworCXJjID0gZGJBbGxvYyhpcCwgSU5PSElOVChpcCksIG5ibG9ja3MsICZibGtubyk7CisJaWYgKHJjKSB7CisJCS8qUm9sbGJhY2sgcXVvdGEgYWxsb2NhdGlvbi4gKi8KKwkJRFFVT1RfRlJFRV9CTE9DSyhpcCwgbmJsb2Nrcyk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKgorCSAqIE5vdyBoYXZlIG5ibG9ja3Mgd29ydGggb2Ygc3RvcmFnZSB0byBzdHVmZiBpbnRvIHRoZSBGRUFMSVNULgorCSAqIGxvb3Agb3ZlciB0aGUgRkVBTElTVCBjb3B5aW5nIGRhdGEgaW50byB0aGUgYnVmZmVyIG9uZSBwYWdlIGF0CisJICogYSB0aW1lLgorCSAqLworCWNwID0gKGNoYXIgKikgZWFsaXN0OworCW5ieXRlcyA9IHNpemU7CisJZm9yIChpID0gMDsgaSA8IG5ibG9ja3M7IGkgKz0gc2JpLT5uYnBlcnBhZ2UpIHsKKwkJLyoKKwkJICogRGV0ZXJtaW5lIGhvdyBtYW55IGJ5dGVzIGZvciB0aGlzIHJlcXVlc3QsIGFuZCByb3VuZCB1cCB0bworCQkgKiB0aGUgbmVhcmVzdCBhZ2dyZWdhdGUgYmxvY2sgc2l6ZQorCQkgKi8KKwkJbmIgPSBtaW4oUFNJWkUsIG5ieXRlcyk7CisJCWJ5dGVzX3RvX3dyaXRlID0KKwkJICAgICgoKChuYiArIHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpKSA+PiBzYi0+c19ibG9ja3NpemVfYml0cykpCisJCSAgICA8PCBzYi0+c19ibG9ja3NpemVfYml0czsKKworCQlpZiAoIShtcCA9IGdldF9tZXRhcGFnZShpcCwgYmxrbm8gKyBpLCBieXRlc190b193cml0ZSwgMSkpKSB7CisJCQlyYyA9IC1FSU87CisJCQlnb3RvIGZhaWxlZDsKKwkJfQorCisJCW1lbWNweShtcC0+ZGF0YSwgY3AsIG5iKTsKKworCQkvKgorCQkgKiBXZSByZWFsbHkgbmVlZCBhIHdheSB0byBwcm9wYWdhdGUgZXJyb3JzIGZvcgorCQkgKiBmb3JjZWQgd3JpdGVzIGxpa2UgdGhpcyBvbmUuICAtLWhjaAorCQkgKgorCQkgKiAoX193cml0ZV9tZXRhcGFnZSA9PiByZWxlYXNlX21ldGFwYWdlID0+IGZsdXNoX21ldGFwYWdlKQorCQkgKi8KKyNpZmRlZiBfSkZTX0ZJWE1FCisJCWlmICgocmMgPSBmbHVzaF9tZXRhcGFnZShtcCkpKSB7CisJCQkvKgorCQkJICogdGhlIHdyaXRlIGZhaWxlZCAtLSB0aGlzIG1lYW5zIHRoYXQgdGhlIGJ1ZmZlcgorCQkJICogaXMgc3RpbGwgYXNzaWduZWQgYW5kIHRoZSBibG9ja3MgYXJlIG5vdCBiZWluZworCQkJICogdXNlZC4gIHRoaXMgc2VlbXMgbGlrZSB0aGUgYmVzdCBlcnJvciByZWNvdmVyeQorCQkJICogd2UgY2FuIGdldCAuLi4KKwkJCSAqLworCQkJZ290byBmYWlsZWQ7CisJCX0KKyNlbHNlCisJCWZsdXNoX21ldGFwYWdlKG1wKTsKKyNlbmRpZgorCisJCWNwICs9IFBTSVpFOworCQluYnl0ZXMgLT0gbmI7CisJfQorCisJZWEtPmZsYWcgPSBEWERfRVhURU5UOworCURYRHNpemUoZWEsIGxlMzJfdG9fY3B1KGVhbGlzdC0+c2l6ZSkpOworCURYRGxlbmd0aChlYSwgbmJsb2Nrcyk7CisJRFhEYWRkcmVzcyhlYSwgYmxrbm8pOworCisJLyogRnJlZSB1cCBJTkxJTkUgYXJlYSAqLworCWlmIChqaS0+ZWEuZmxhZyAmIERYRF9JTkxJTkUpCisJCWppLT5tb2RlMiB8PSBJTkxJTkVFQTsKKworCXJldHVybiAwOworCisgICAgICBmYWlsZWQ6CisJLyogUm9sbGJhY2sgcXVvdGEgYWxsb2NhdGlvbi4gKi8KKwlEUVVPVF9GUkVFX0JMT0NLKGlwLCBuYmxvY2tzKTsKKworCWRiRnJlZShpcCwgYmxrbm8sIG5ibG9ja3MpOworCXJldHVybiByYzsKK30KKworLyoKKyAqIE5BTUU6IGVhX3JlYWRfaW5saW5lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBGVU5DVElPTjogUmVhZCBhbiBpbmxpbmVkIEVBIGludG8gdXNlcidzIGJ1ZmZlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogUEFSQU1FVEVSUzoKKyAqCWlwCS0gSW5vZGUgcG9pbnRlcgorICoJZWFsaXN0CS0gUG9pbnRlciB0byBidWZmZXIgdG8gZmlsbCBpbiB3aXRoIEVBCisgKgorICogUkVUVVJOUzogMAorICovCitzdGF0aWMgaW50IGVhX3JlYWRfaW5saW5lKHN0cnVjdCBpbm9kZSAqaXAsIHN0cnVjdCBqZnNfZWFfbGlzdCAqZWFsaXN0KQoreworCXN0cnVjdCBqZnNfaW5vZGVfaW5mbyAqamkgPSBKRlNfSVAoaXApOworCWludCBlYV9zaXplID0gc2l6ZURYRCgmamktPmVhKTsKKworCWlmIChlYV9zaXplID09IDApIHsKKwkJZWFsaXN0LT5zaXplID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogU2FuaXR5IENoZWNrICovCisJaWYgKChzaXplRFhEKCZqaS0+ZWEpID4gc2l6ZW9mIChqaS0+aV9pbmxpbmVfZWEpKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKGxlMzJfdG9fY3B1KCgoc3RydWN0IGpmc19lYV9saXN0ICopICZqaS0+aV9pbmxpbmVfZWEpLT5zaXplKQorCSAgICAhPSBlYV9zaXplKQorCQlyZXR1cm4gLUVJTzsKKworCW1lbWNweShlYWxpc3QsIGppLT5pX2lubGluZV9lYSwgZWFfc2l6ZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBOQU1FOiBlYV9yZWFkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBGVU5DVElPTjogY29weSBFQSBkYXRhIGludG8gdXNlcidzIGJ1ZmZlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogUEFSQU1FVEVSUzoKKyAqCWlwCS0gSW5vZGUgcG9pbnRlcgorICoJZWFsaXN0CS0gUG9pbnRlciB0byBidWZmZXIgdG8gZmlsbCBpbiB3aXRoIEVBCisgKgorICogTk9URVM6ICBJZiBFQSBpcyBpbmxpbmUgY2FsbHMgZWFfcmVhZF9pbmxpbmUoKSB0byBjb3B5IEVBLgorICoKKyAqIFJFVFVSTlM6IDAgZm9yIHN1Y2Nlc3M7IG90aGVyIGluZGljYXRlcyBmYWlsdXJlCisgKi8KK3N0YXRpYyBpbnQgZWFfcmVhZChzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgamZzX2VhX2xpc3QgKmVhbGlzdCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaXAtPmlfc2I7CisJc3RydWN0IGpmc19pbm9kZV9pbmZvICpqaSA9IEpGU19JUChpcCk7CisJc3RydWN0IGpmc19zYl9pbmZvICpzYmkgPSBKRlNfU0JJKHNiKTsKKwlpbnQgbmJsb2NrczsKKwlzNjQgYmxrbm87CisJY2hhciAqY3AgPSAoY2hhciAqKSBlYWxpc3Q7CisJaW50IGk7CisJaW50IG5ieXRlcywgbmI7CisJczMyIGJ5dGVzX3RvX3JlYWQ7CisJc3RydWN0IG1ldGFwYWdlICptcDsKKworCS8qIHF1aWNrIGNoZWNrIGZvciBpbi1saW5lIEVBICovCisJaWYgKGppLT5lYS5mbGFnICYgRFhEX0lOTElORSkKKwkJcmV0dXJuIGVhX3JlYWRfaW5saW5lKGlwLCBlYWxpc3QpOworCisJbmJ5dGVzID0gc2l6ZURYRCgmamktPmVhKTsKKwlpZiAoIW5ieXRlcykgeworCQlqZnNfZXJyb3Ioc2IsICJlYV9yZWFkOiBuYnl0ZXMgaXMgMCIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiAKKwkgKiBGaWd1cmUgb3V0IGhvdyBtYW55IGJsb2NrcyB3ZXJlIGFsbG9jYXRlZCB3aGVuIHRoaXMgRUEgbGlzdCB3YXMKKwkgKiBvcmlnaW5hbGx5IHdyaXR0ZW4gdG8gZGlzay4KKwkgKi8KKwluYmxvY2tzID0gbGVuZ3RoRFhEKCZqaS0+ZWEpIDw8IHNiaS0+bDJuYnBlcnBhZ2U7CisJYmxrbm8gPSBhZGRyZXNzRFhEKCZqaS0+ZWEpIDw8IHNiaS0+bDJuYnBlcnBhZ2U7CisKKwkvKgorCSAqIEkgaGF2ZSBmb3VuZCB0aGUgZGlzayBibG9ja3Mgd2hpY2ggd2VyZSBvcmlnaW5hbGx5IHVzZWQgdG8gc3RvcmUKKwkgKiB0aGUgRkVBTElTVC4gIG5vdyBpIGxvb3Agb3ZlciBlYWNoIGNvbnRpZ3VvdXMgYmxvY2sgY29weWluZyB0aGUKKwkgKiBkYXRhIGludG8gdGhlIGJ1ZmZlci4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbmJsb2NrczsgaSArPSBzYmktPm5icGVycGFnZSkgeworCQkvKgorCQkgKiBEZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMgZm9yIHRoaXMgcmVxdWVzdCwgYW5kIHJvdW5kIHVwIHRvCisJCSAqIHRoZSBuZWFyZXN0IGFnZ3JlZ2F0ZSBibG9jayBzaXplCisJCSAqLworCQluYiA9IG1pbihQU0laRSwgbmJ5dGVzKTsKKwkJYnl0ZXNfdG9fcmVhZCA9CisJCSAgICAoKCgobmIgKyBzYi0+c19ibG9ja3NpemUgLSAxKSkgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHMpKQorCQkgICAgPDwgc2ItPnNfYmxvY2tzaXplX2JpdHM7CisKKwkJaWYgKCEobXAgPSByZWFkX21ldGFwYWdlKGlwLCBibGtubyArIGksIGJ5dGVzX3RvX3JlYWQsIDEpKSkKKwkJCXJldHVybiAtRUlPOworCisJCW1lbWNweShjcCwgbXAtPmRhdGEsIG5iKTsKKwkJcmVsZWFzZV9tZXRhcGFnZShtcCk7CisKKwkJY3AgKz0gUFNJWkU7CisJCW5ieXRlcyAtPSBuYjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE5BTUU6IGVhX2dldAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogRlVOQ1RJT046IFJldHVybnMgYnVmZmVyIGNvbnRhaW5pbmcgZXhpc3RpbmcgZXh0ZW5kZWQgYXR0cmlidXRlcy4KKyAqCSAgICAgVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciB3aWxsIGJlIHRoZSBsYXJnZXIgb2YgdGhlIGV4aXN0aW5nCisgKgkgICAgIGF0dHJpYnV0ZXMgc2l6ZSwgb3IgbWluX3NpemUuCisgKgorICoJICAgICBUaGUgYnVmZmVyLCB3aGljaCBtYXkgYmUgaW5saW5lZCBpbiB0aGUgaW5vZGUgb3IgaW4gdGhlCisgKiAJICAgICBwYWdlIGNhY2hlIG11c3QgYmUgcmVsZWFzZSBieSBjYWxsaW5nIGVhX3JlbGVhc2Ugb3IgZWFfcHV0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBQQVJBTUVURVJTOgorICoJaW5vZGUJLSBJbm9kZSBwb2ludGVyCisgKgllYV9idWYJLSBTdHJ1Y3R1cmUgdG8gYmUgcG9wdWxhdGVkIHdpdGggZWFsaXN0IGFuZCBpdHMgbWV0YWRhdGEKKyAqCW1pbl9zaXplLSBtaW5pbXVtIHNpemUgb2YgYnVmZmVyIHRvIGJlIHJldHVybmVkCisgKgorICogUkVUVVJOUzogMCBmb3Igc3VjY2VzczsgT3RoZXIgaW5kaWNhdGVzIGZhaWx1cmUKKyAqLworc3RhdGljIGludCBlYV9nZXQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGVhX2J1ZmZlciAqZWFfYnVmLCBpbnQgbWluX3NpemUpCit7CisJc3RydWN0IGpmc19pbm9kZV9pbmZvICpqaSA9IEpGU19JUChpbm9kZSk7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCWludCBzaXplOworCWludCBlYV9zaXplID0gc2l6ZURYRCgmamktPmVhKTsKKwlpbnQgYmxvY2tzX25lZWRlZCwgY3VycmVudF9ibG9ja3M7CisJczY0IGJsa25vOworCWludCByYzsKKwlpbnQgcXVvdGFfYWxsb2NhdGlvbiA9IDA7CisKKwkvKiBXaGVuIGZzY2suamZzIGNsZWFycyBhIGJhZCBlYSwgaXQgZG9lc24ndCBjbGVhciB0aGUgc2l6ZSAqLworCWlmIChqaS0+ZWEuZmxhZyA9PSAwKQorCQllYV9zaXplID0gMDsKKworCWlmIChlYV9zaXplID09IDApIHsKKwkJaWYgKG1pbl9zaXplID09IDApIHsKKwkJCWVhX2J1Zi0+ZmxhZyA9IDA7CisJCQllYV9idWYtPm1heF9zaXplID0gMDsKKwkJCWVhX2J1Zi0+eGF0dHIgPSBOVUxMOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKChtaW5fc2l6ZSA8PSBzaXplb2YgKGppLT5pX2lubGluZV9lYSkpICYmCisJCSAgICAoamktPm1vZGUyICYgSU5MSU5FRUEpKSB7CisJCQllYV9idWYtPmZsYWcgPSBFQV9JTkxJTkUgfCBFQV9ORVc7CisJCQllYV9idWYtPm1heF9zaXplID0gc2l6ZW9mIChqaS0+aV9pbmxpbmVfZWEpOworCQkJZWFfYnVmLT54YXR0ciA9IChzdHJ1Y3QgamZzX2VhX2xpc3QgKikgamktPmlfaW5saW5lX2VhOworCQkJRFhEbGVuZ3RoKCZlYV9idWYtPm5ld19lYSwgMCk7CisJCQlEWERhZGRyZXNzKCZlYV9idWYtPm5ld19lYSwgMCk7CisJCQllYV9idWYtPm5ld19lYS5mbGFnID0gRFhEX0lOTElORTsKKwkJCURYRHNpemUoJmVhX2J1Zi0+bmV3X2VhLCBtaW5fc2l6ZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljdXJyZW50X2Jsb2NrcyA9IDA7CisJfSBlbHNlIGlmIChqaS0+ZWEuZmxhZyAmIERYRF9JTkxJTkUpIHsKKwkJaWYgKG1pbl9zaXplIDw9IHNpemVvZiAoamktPmlfaW5saW5lX2VhKSkgeworCQkJZWFfYnVmLT5mbGFnID0gRUFfSU5MSU5FOworCQkJZWFfYnVmLT5tYXhfc2l6ZSA9IHNpemVvZiAoamktPmlfaW5saW5lX2VhKTsKKwkJCWVhX2J1Zi0+eGF0dHIgPSAoc3RydWN0IGpmc19lYV9saXN0ICopIGppLT5pX2lubGluZV9lYTsKKwkJCWdvdG8gc2l6ZV9jaGVjazsKKwkJfQorCQljdXJyZW50X2Jsb2NrcyA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKCEoamktPmVhLmZsYWcgJiBEWERfRVhURU5UKSkgeworCQkJamZzX2Vycm9yKHNiLCAiZWFfZ2V0OiBpbnZhbGlkIGVhLmZsYWcpIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQljdXJyZW50X2Jsb2NrcyA9IChlYV9zaXplICsgc2ItPnNfYmxvY2tzaXplIC0gMSkgPj4KKwkJICAgIHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCX0KKwlzaXplID0gbWF4KG1pbl9zaXplLCBlYV9zaXplKTsKKworCWlmIChzaXplID4gUFNJWkUpIHsKKwkJLyoKKwkJICogVG8ga2VlcCB0aGUgcmVzdCBvZiB0aGUgY29kZSBzaW1wbGUuICBBbGxvY2F0ZSBhCisJCSAqIGNvbnRpZ3VvdXMgYnVmZmVyIHRvIHdvcmsgd2l0aAorCQkgKi8KKwkJZWFfYnVmLT54YXR0ciA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmIChlYV9idWYtPnhhdHRyID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQllYV9idWYtPmZsYWcgPSBFQV9NQUxMT0M7CisJCWVhX2J1Zi0+bWF4X3NpemUgPSAoc2l6ZSArIHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpICYKKwkJICAgIH4oc2ItPnNfYmxvY2tzaXplIC0gMSk7CisKKwkJaWYgKGVhX3NpemUgPT0gMCkKKwkJCXJldHVybiAwOworCisJCWlmICgocmMgPSBlYV9yZWFkKGlub2RlLCBlYV9idWYtPnhhdHRyKSkpIHsKKwkJCWtmcmVlKGVhX2J1Zi0+eGF0dHIpOworCQkJZWFfYnVmLT54YXR0ciA9IE5VTEw7CisJCQlyZXR1cm4gcmM7CisJCX0KKwkJZ290byBzaXplX2NoZWNrOworCX0KKwlibG9ja3NfbmVlZGVkID0gKG1pbl9zaXplICsgc2ItPnNfYmxvY2tzaXplIC0gMSkgPj4KKwkgICAgc2ItPnNfYmxvY2tzaXplX2JpdHM7CisKKwlpZiAoYmxvY2tzX25lZWRlZCA+IGN1cnJlbnRfYmxvY2tzKSB7CisJCS8qIEFsbG9jYXRlIG5ldyBibG9ja3MgdG8gcXVvdGEuICovCisJCWlmIChEUVVPVF9BTExPQ19CTE9DSyhpbm9kZSwgYmxvY2tzX25lZWRlZCkpCisJCQlyZXR1cm4gLUVEUVVPVDsKKworCQlxdW90YV9hbGxvY2F0aW9uID0gYmxvY2tzX25lZWRlZDsKKworCQlyYyA9IGRiQWxsb2MoaW5vZGUsIElOT0hJTlQoaW5vZGUpLCAoczY0KSBibG9ja3NfbmVlZGVkLAorCQkJICAgICAmYmxrbm8pOworCQlpZiAocmMpCisJCQlnb3RvIGNsZWFuX3VwOworCisJCURYRGxlbmd0aCgmZWFfYnVmLT5uZXdfZWEsIGJsb2Nrc19uZWVkZWQpOworCQlEWERhZGRyZXNzKCZlYV9idWYtPm5ld19lYSwgYmxrbm8pOworCQllYV9idWYtPm5ld19lYS5mbGFnID0gRFhEX0VYVEVOVDsKKwkJRFhEc2l6ZSgmZWFfYnVmLT5uZXdfZWEsIG1pbl9zaXplKTsKKworCQllYV9idWYtPmZsYWcgPSBFQV9FWFRFTlQgfCBFQV9ORVc7CisKKwkJZWFfYnVmLT5tcCA9IGdldF9tZXRhcGFnZShpbm9kZSwgYmxrbm8sCisJCQkJCSAgYmxvY2tzX25lZWRlZCA8PCBzYi0+c19ibG9ja3NpemVfYml0cywKKwkJCQkJICAxKTsKKwkJaWYgKGVhX2J1Zi0+bXAgPT0gTlVMTCkgeworCQkJZGJGcmVlKGlub2RlLCBibGtubywgKHM2NCkgYmxvY2tzX25lZWRlZCk7CisJCQlyYyA9IC1FSU87CisJCQlnb3RvIGNsZWFuX3VwOworCQl9CisJCWVhX2J1Zi0+eGF0dHIgPSBlYV9idWYtPm1wLT5kYXRhOworCQllYV9idWYtPm1heF9zaXplID0gKG1pbl9zaXplICsgc2ItPnNfYmxvY2tzaXplIC0gMSkgJgorCQkgICAgfihzYi0+c19ibG9ja3NpemUgLSAxKTsKKwkJaWYgKGVhX3NpemUgPT0gMCkKKwkJCXJldHVybiAwOworCQlpZiAoKHJjID0gZWFfcmVhZChpbm9kZSwgZWFfYnVmLT54YXR0cikpKSB7CisJCQlkaXNjYXJkX21ldGFwYWdlKGVhX2J1Zi0+bXApOworCQkJZGJGcmVlKGlub2RlLCBibGtubywgKHM2NCkgYmxvY2tzX25lZWRlZCk7CisJCQlnb3RvIGNsZWFuX3VwOworCQl9CisJCWdvdG8gc2l6ZV9jaGVjazsKKwl9CisJZWFfYnVmLT5mbGFnID0gRUFfRVhURU5UOworCWVhX2J1Zi0+bXAgPSByZWFkX21ldGFwYWdlKGlub2RlLCBhZGRyZXNzRFhEKCZqaS0+ZWEpLAorCQkJCSAgIGxlbmd0aERYRCgmamktPmVhKSA8PCBzYi0+c19ibG9ja3NpemVfYml0cywKKwkJCQkgICAxKTsKKwlpZiAoZWFfYnVmLT5tcCA9PSBOVUxMKSB7CisJCXJjID0gLUVJTzsKKwkJZ290byBjbGVhbl91cDsKKwl9CisJZWFfYnVmLT54YXR0ciA9IGVhX2J1Zi0+bXAtPmRhdGE7CisJZWFfYnVmLT5tYXhfc2l6ZSA9IChlYV9zaXplICsgc2ItPnNfYmxvY2tzaXplIC0gMSkgJgorCSAgICB+KHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpOworCisgICAgICBzaXplX2NoZWNrOgorCWlmIChFQUxJU1RfU0laRShlYV9idWYtPnhhdHRyKSAhPSBlYV9zaXplKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZWFfZ2V0OiBpbnZhbGlkIGV4dGVuZGVkIGF0dHJpYnV0ZVxuIik7CisJCWR1bXBfbWVtKCJ4YXR0ciIsIGVhX2J1Zi0+eGF0dHIsIGVhX3NpemUpOworCQllYV9yZWxlYXNlKGlub2RlLCBlYV9idWYpOworCQlyYyA9IC1FSU87CisJCWdvdG8gY2xlYW5fdXA7CisJfQorCisJcmV0dXJuIGVhX3NpemU7CisKKyAgICAgIGNsZWFuX3VwOgorCS8qIFJvbGxiYWNrIHF1b3RhIGFsbG9jYXRpb24gKi8KKwlpZiAocXVvdGFfYWxsb2NhdGlvbikKKwkJRFFVT1RfRlJFRV9CTE9DSyhpbm9kZSwgcXVvdGFfYWxsb2NhdGlvbik7CisKKwlyZXR1cm4gKHJjKTsKK30KKworc3RhdGljIHZvaWQgZWFfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZWFfYnVmZmVyICplYV9idWYpCit7CisJaWYgKGVhX2J1Zi0+ZmxhZyAmIEVBX01BTExPQykKKwkJa2ZyZWUoZWFfYnVmLT54YXR0cik7CisJZWxzZSBpZiAoZWFfYnVmLT5mbGFnICYgRUFfRVhURU5UKSB7CisJCWFzc2VydChlYV9idWYtPm1wKTsKKwkJcmVsZWFzZV9tZXRhcGFnZShlYV9idWYtPm1wKTsKKworCQlpZiAoZWFfYnVmLT5mbGFnICYgRUFfTkVXKQorCQkJZGJGcmVlKGlub2RlLCBhZGRyZXNzRFhEKCZlYV9idWYtPm5ld19lYSksCisJCQkgICAgICAgbGVuZ3RoRFhEKCZlYV9idWYtPm5ld19lYSkpOworCX0KK30KKworc3RhdGljIGludCBlYV9wdXQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGVhX2J1ZmZlciAqZWFfYnVmLCBpbnQgbmV3X3NpemUpCit7CisJc3RydWN0IGpmc19pbm9kZV9pbmZvICpqaSA9IEpGU19JUChpbm9kZSk7CisJdW5zaWduZWQgbG9uZyBvbGRfYmxvY2tzLCBuZXdfYmxvY2tzOworCWludCByYyA9IDA7CisJdGlkX3QgdGlkOworCisJaWYgKG5ld19zaXplID09IDApIHsKKwkJZWFfcmVsZWFzZShpbm9kZSwgZWFfYnVmKTsKKwkJZWFfYnVmID0gTlVMTDsKKwl9IGVsc2UgaWYgKGVhX2J1Zi0+ZmxhZyAmIEVBX0lOTElORSkgeworCQlhc3NlcnQobmV3X3NpemUgPD0gc2l6ZW9mIChqaS0+aV9pbmxpbmVfZWEpKTsKKwkJamktPm1vZGUyICY9IH5JTkxJTkVFQTsKKwkJZWFfYnVmLT5uZXdfZWEuZmxhZyA9IERYRF9JTkxJTkU7CisJCURYRHNpemUoJmVhX2J1Zi0+bmV3X2VhLCBuZXdfc2l6ZSk7CisJCURYRGFkZHJlc3MoJmVhX2J1Zi0+bmV3X2VhLCAwKTsKKwkJRFhEbGVuZ3RoKCZlYV9idWYtPm5ld19lYSwgMCk7CisJfSBlbHNlIGlmIChlYV9idWYtPmZsYWcgJiBFQV9NQUxMT0MpIHsKKwkJcmMgPSBlYV93cml0ZShpbm9kZSwgZWFfYnVmLT54YXR0ciwgbmV3X3NpemUsICZlYV9idWYtPm5ld19lYSk7CisJCWtmcmVlKGVhX2J1Zi0+eGF0dHIpOworCX0gZWxzZSBpZiAoZWFfYnVmLT5mbGFnICYgRUFfTkVXKSB7CisJCS8qIFdlIGhhdmUgYWxyZWFkeSBhbGxvY2F0ZWQgYSBuZXcgZHhkICovCisJCWZsdXNoX21ldGFwYWdlKGVhX2J1Zi0+bXApOworCX0gZWxzZSB7CisJCS8qIC0+eGF0dHIgbXVzdCBwb2ludCB0byBvcmlnaW5hbCBlYSdzIG1ldGFwYWdlICovCisJCXJjID0gZWFfd3JpdGUoaW5vZGUsIGVhX2J1Zi0+eGF0dHIsIG5ld19zaXplLCAmZWFfYnVmLT5uZXdfZWEpOworCQlkaXNjYXJkX21ldGFwYWdlKGVhX2J1Zi0+bXApOworCX0KKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXRpZCA9IHR4QmVnaW4oaW5vZGUtPmlfc2IsIDApOworCWRvd24oJmppLT5jb21taXRfc2VtKTsKKworCW9sZF9ibG9ja3MgPSBuZXdfYmxvY2tzID0gMDsKKworCWlmIChqaS0+ZWEuZmxhZyAmIERYRF9FWFRFTlQpIHsKKwkJaW52YWxpZGF0ZV9keGRfbWV0YXBhZ2VzKGlub2RlLCBqaS0+ZWEpOworCQlvbGRfYmxvY2tzID0gbGVuZ3RoRFhEKCZqaS0+ZWEpOworCX0KKworCWlmIChlYV9idWYpIHsKKwkJdHhFQSh0aWQsIGlub2RlLCAmamktPmVhLCAmZWFfYnVmLT5uZXdfZWEpOworCQlpZiAoZWFfYnVmLT5uZXdfZWEuZmxhZyAmIERYRF9FWFRFTlQpIHsKKwkJCW5ld19ibG9ja3MgPSBsZW5ndGhEWEQoJmVhX2J1Zi0+bmV3X2VhKTsKKwkJCWlmIChqaS0+ZWEuZmxhZyAmIERYRF9JTkxJTkUpCisJCQkJamktPm1vZGUyIHw9IElOTElORUVBOworCQl9CisJCWppLT5lYSA9IGVhX2J1Zi0+bmV3X2VhOworCX0gZWxzZSB7CisJCXR4RUEodGlkLCBpbm9kZSwgJmppLT5lYSwgTlVMTCk7CisJCWlmIChqaS0+ZWEuZmxhZyAmIERYRF9JTkxJTkUpCisJCQlqaS0+bW9kZTIgfD0gSU5MSU5FRUE7CisJCWppLT5lYS5mbGFnID0gMDsKKwkJamktPmVhLnNpemUgPSAwOworCX0KKworCS8qIElmIG9sZCBibG9ja3MgZXhpc3QsIHRoZXkgbXVzdCBiZSByZW1vdmVkIGZyb20gcXVvdGEgYWxsb2NhdGlvbi4gKi8KKwlpZiAob2xkX2Jsb2NrcykKKwkJRFFVT1RfRlJFRV9CTE9DSyhpbm9kZSwgb2xkX2Jsb2Nrcyk7CisKKwlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKKwlyYyA9IHR4Q29tbWl0KHRpZCwgMSwgJmlub2RlLCAwKTsKKwl0eEVuZCh0aWQpOworCXVwKCZqaS0+Y29tbWl0X3NlbSk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBjYW5fc2V0X3N5c3RlbV94YXR0cgorICoKKyAqIFRoaXMgY29kZSBpcyBzcGVjaWZpYyB0byB0aGUgc3lzdGVtLiogbmFtZXNwYWNlLiAgSXQgY29udGFpbnMgcG9saWN5CisgKiB3aGljaCBkb2Vzbid0IGJlbG9uZyBpbiB0aGUgbWFpbiB4YXR0ciBjb2RlcGF0aC4KKyAqLworc3RhdGljIGludCBjYW5fc2V0X3N5c3RlbV94YXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCWNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3QgdmFsdWVfbGVuKQoreworI2lmZGVmIENPTkZJR19KRlNfUE9TSVhfQUNMCisJc3RydWN0IHBvc2l4X2FjbCAqYWNsOworCWludCByYzsKKworCWlmICgoY3VycmVudC0+ZnN1aWQgIT0gaW5vZGUtPmlfdWlkKSAmJiAhY2FwYWJsZShDQVBfRk9XTkVSKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCS8qCisJICogWEFUVFJfTkFNRV9BQ0xfQUNDRVNTIGlzIHRpZWQgdG8gaV9tb2RlCisJICovCisJaWYgKHN0cmNtcChuYW1lLCBYQVRUUl9OQU1FX0FDTF9BQ0NFU1MpID09IDApIHsKKwkJYWNsID0gcG9zaXhfYWNsX2Zyb21feGF0dHIodmFsdWUsIHZhbHVlX2xlbik7CisJCWlmIChJU19FUlIoYWNsKSkgeworCQkJcmMgPSBQVFJfRVJSKGFjbCk7CisJCQlwcmludGsoS0VSTl9FUlIgInBvc2l4X2FjbF9mcm9tX3hhdHRyIHJldHVybmVkICVkXG4iLAorCQkJICAgICAgIHJjKTsKKwkJCXJldHVybiByYzsKKwkJfQorCQlpZiAoYWNsKSB7CisJCQltb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7CisJCQlyYyA9IHBvc2l4X2FjbF9lcXVpdl9tb2RlKGFjbCwgJm1vZGUpOworCQkJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKwkJCWlmIChyYyA8IDApIHsKKwkJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkgICAgICAgInBvc2l4X2FjbF9lcXVpdl9tb2RlIHJldHVybmVkICVkXG4iLAorCQkJCSAgICAgICByYyk7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCQkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisJCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJfQorCQkvKgorCQkgKiBXZSdyZSBjaGFuZ2luZyB0aGUgQUNMLiAgR2V0IHJpZCBvZiB0aGUgY2FjaGVkIG9uZQorCQkgKi8KKwkJYWNsID1KRlNfSVAoaW5vZGUpLT5pX2FjbDsKKwkJaWYgKGFjbCAhPSBKRlNfQUNMX05PVF9DQUNIRUQpCisJCQlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOworCQlKRlNfSVAoaW5vZGUpLT5pX2FjbCA9IEpGU19BQ0xfTk9UX0NBQ0hFRDsKKworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKHN0cmNtcChuYW1lLCBYQVRUUl9OQU1FX0FDTF9ERUZBVUxUKSA9PSAwKSB7CisJCWFjbCA9IHBvc2l4X2FjbF9mcm9tX3hhdHRyKHZhbHVlLCB2YWx1ZV9sZW4pOworCQlpZiAoSVNfRVJSKGFjbCkpIHsKKwkJCXJjID0gUFRSX0VSUihhY2wpOworCQkJcHJpbnRrKEtFUk5fRVJSICJwb3NpeF9hY2xfZnJvbV94YXR0ciByZXR1cm5lZCAlZFxuIiwKKwkJCSAgICAgICByYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwkJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKworCQkvKgorCQkgKiBXZSdyZSBjaGFuZ2luZyB0aGUgZGVmYXVsdCBBQ0wuICBHZXQgcmlkIG9mIHRoZSBjYWNoZWQgb25lCisJCSAqLworCQlhY2wgPUpGU19JUChpbm9kZSktPmlfZGVmYXVsdF9hY2w7CisJCWlmIChhY2wgJiYgKGFjbCAhPSBKRlNfQUNMX05PVF9DQUNIRUQpKQorCQkJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKwkJSkZTX0lQKGlub2RlKS0+aV9kZWZhdWx0X2FjbCA9IEpGU19BQ0xfTk9UX0NBQ0hFRDsKKworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYJCQkvKiBDT05GSUdfSkZTX1BPU0lYX0FDTCAqLworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIGludCBjYW5fc2V0X3hhdHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCB2YWx1ZV9sZW4pCit7CisJaWYgKElTX1JET05MWShpbm9kZSkpCisJCXJldHVybiAtRVJPRlM7CisKKwlpZiAoSVNfSU1NVVRBQkxFKGlub2RlKSB8fCBJU19BUFBFTkQoaW5vZGUpIHx8IFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiAtRVBFUk07CisKKwlpZihzdHJuY21wKG5hbWUsIFhBVFRSX1NZU1RFTV9QUkVGSVgsIFhBVFRSX1NZU1RFTV9QUkVGSVhfTEVOKSA9PSAwKQorCQkvKgorCQkgKiAic3lzdGVtLioiCisJCSAqLworCQlyZXR1cm4gY2FuX3NldF9zeXN0ZW1feGF0dHIoaW5vZGUsIG5hbWUsIHZhbHVlLCB2YWx1ZV9sZW4pOworCisJaWYoc3RybmNtcChuYW1lLCBYQVRUUl9UUlVTVEVEX1BSRUZJWCwgWEFUVFJfVFJVU1RFRF9QUkVGSVhfTEVOKSAhPSAwKQorCQlyZXR1cm4gKGNhcGFibGUoQ0FQX1NZU19BRE1JTikgPyAwIDogLUVQRVJNKTsKKworI2lmZGVmIENPTkZJR19KRlNfU0VDVVJJVFkKKwlpZiAoc3RybmNtcChuYW1lLCBYQVRUUl9TRUNVUklUWV9QUkVGSVgsIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWF9MRU4pCisJICAgICE9IDApCisJCXJldHVybiAwOwkvKiBMZWF2ZSBpdCB0byB0aGUgc2VjdXJpdHkgbW9kdWxlICovCisjZW5kaWYKKwkJCisJaWYoKHN0cm5jbXAobmFtZSwgWEFUVFJfVVNFUl9QUkVGSVgsIFhBVFRSX1VTRVJfUFJFRklYX0xFTikgIT0gMCkgJiYKKwkgICAoc3RybmNtcChuYW1lLCBYQVRUUl9PUzJfUFJFRklYLCBYQVRUUl9PUzJfUFJFRklYX0xFTikgIT0gMCkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJgorCSAgICAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkgfHwgaW5vZGUtPmlfbW9kZSAmU19JU1ZUWCkpCisJCXJldHVybiAtRVBFUk07CisKKwlyZXR1cm4gcGVybWlzc2lvbihpbm9kZSwgTUFZX1dSSVRFLCBOVUxMKTsKK30KKworaW50IF9famZzX3NldHhhdHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKnZhbHVlLAorCQkgICBzaXplX3QgdmFsdWVfbGVuLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGpmc19lYV9saXN0ICplYWxpc3Q7CisJc3RydWN0IGpmc19lYSAqZWEsICpvbGRfZWEgPSBOVUxMLCAqbmV4dF9lYSA9IE5VTEw7CisJc3RydWN0IGVhX2J1ZmZlciBlYV9idWY7CisJaW50IG9sZF9lYV9zaXplID0gMDsKKwlpbnQgeGF0dHJfc2l6ZTsKKwlpbnQgbmV3X3NpemU7CisJaW50IG5hbWVsZW4gPSBzdHJsZW4obmFtZSk7CisJY2hhciAqb3MybmFtZSA9IE5VTEw7CisJaW50IGZvdW5kID0gMDsKKwlpbnQgcmM7CisJaW50IGxlbmd0aDsKKworCWlmICgocmMgPSBjYW5fc2V0X3hhdHRyKGlub2RlLCBuYW1lLCB2YWx1ZSwgdmFsdWVfbGVuKSkpCisJCXJldHVybiByYzsKKworCWlmIChzdHJuY21wKG5hbWUsIFhBVFRSX09TMl9QUkVGSVgsIFhBVFRSX09TMl9QUkVGSVhfTEVOKSA9PSAwKSB7CisJCW9zMm5hbWUgPSBrbWFsbG9jKG5hbWVsZW4gLSBYQVRUUl9PUzJfUFJFRklYX0xFTiArIDEsCisJCQkJICBHRlBfS0VSTkVMKTsKKwkJaWYgKCFvczJuYW1lKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXN0cmNweShvczJuYW1lLCBuYW1lICsgWEFUVFJfT1MyX1BSRUZJWF9MRU4pOworCQluYW1lID0gb3MybmFtZTsKKwkJbmFtZWxlbiAtPSBYQVRUUl9PUzJfUFJFRklYX0xFTjsKKwl9CisKKwlkb3duX3dyaXRlKCZKRlNfSVAoaW5vZGUpLT54YXR0cl9zZW0pOworCisJeGF0dHJfc2l6ZSA9IGVhX2dldChpbm9kZSwgJmVhX2J1ZiwgMCk7CisJaWYgKHhhdHRyX3NpemUgPCAwKSB7CisJCXJjID0geGF0dHJfc2l6ZTsKKwkJZ290byBvdXQ7CisJfQorCisgICAgICBhZ2FpbjoKKwllYWxpc3QgPSAoc3RydWN0IGpmc19lYV9saXN0ICopIGVhX2J1Zi54YXR0cjsKKwluZXdfc2l6ZSA9IHNpemVvZiAoc3RydWN0IGpmc19lYV9saXN0KTsKKworCWlmICh4YXR0cl9zaXplKSB7CisJCWZvciAoZWEgPSBGSVJTVF9FQShlYWxpc3QpOyBlYSA8IEVORF9FQUxJU1QoZWFsaXN0KTsKKwkJICAgICBlYSA9IE5FWFRfRUEoZWEpKSB7CisJCQlpZiAoKG5hbWVsZW4gPT0gZWEtPm5hbWVsZW4pICYmCisJCQkgICAgKG1lbWNtcChuYW1lLCBlYS0+bmFtZSwgbmFtZWxlbikgPT0gMCkpIHsKKwkJCQlmb3VuZCA9IDE7CisJCQkJaWYgKGZsYWdzICYgWEFUVFJfQ1JFQVRFKSB7CisJCQkJCXJjID0gLUVFWElTVDsKKwkJCQkJZ290byByZWxlYXNlOworCQkJCX0KKwkJCQlvbGRfZWEgPSBlYTsKKwkJCQlvbGRfZWFfc2l6ZSA9IEVBX1NJWkUoZWEpOworCQkJCW5leHRfZWEgPSBORVhUX0VBKGVhKTsKKwkJCX0gZWxzZQorCQkJCW5ld19zaXplICs9IEVBX1NJWkUoZWEpOworCQl9CisJfQorCisJaWYgKCFmb3VuZCkgeworCQlpZiAoZmxhZ3MgJiBYQVRUUl9SRVBMQUNFKSB7CisJCQlyYyA9IC1FTk9EQVRBOworCQkJZ290byByZWxlYXNlOworCQl9CisJCWlmICh2YWx1ZSA9PSBOVUxMKSB7CisJCQlyYyA9IDA7CisJCQlnb3RvIHJlbGVhc2U7CisJCX0KKwl9CisJaWYgKHZhbHVlKQorCQluZXdfc2l6ZSArPSBzaXplb2YgKHN0cnVjdCBqZnNfZWEpICsgbmFtZWxlbiArIDEgKyB2YWx1ZV9sZW47CisKKwlpZiAobmV3X3NpemUgPiBlYV9idWYubWF4X3NpemUpIHsKKwkJLyoKKwkJICogV2UgbmVlZCB0byBhbGxvY2F0ZSBtb3JlIHNwYWNlIGZvciBtZXJnZWQgZWEgbGlzdC4KKwkJICogV2Ugc2hvdWxkIG9ubHkgaGF2ZSBsb29wIHRvIGFnYWluOiBvbmNlLgorCQkgKi8KKwkJZWFfcmVsZWFzZShpbm9kZSwgJmVhX2J1Zik7CisJCXhhdHRyX3NpemUgPSBlYV9nZXQoaW5vZGUsICZlYV9idWYsIG5ld19zaXplKTsKKwkJaWYgKHhhdHRyX3NpemUgPCAwKSB7CisJCQlyYyA9IHhhdHRyX3NpemU7CisJCQlnb3RvIG91dDsKKwkJfQorCQlnb3RvIGFnYWluOworCX0KKworCS8qIFJlbW92ZSBvbGQgZWEgb2YgdGhlIHNhbWUgbmFtZSAqLworCWlmIChmb3VuZCkgeworCQkvKiBudW1iZXIgb2YgYnl0ZXMgZm9sbG93aW5nIHRhcmdldCBFQSAqLworCQlsZW5ndGggPSAoY2hhciAqKSBFTkRfRUFMSVNUKGVhbGlzdCkgLSAoY2hhciAqKSBuZXh0X2VhOworCQlpZiAobGVuZ3RoID4gMCkKKwkJCW1lbW1vdmUob2xkX2VhLCBuZXh0X2VhLCBsZW5ndGgpOworCQl4YXR0cl9zaXplIC09IG9sZF9lYV9zaXplOworCX0KKworCS8qIEFkZCBuZXcgZW50cnkgdG8gdGhlIGVuZCAqLworCWlmICh2YWx1ZSkgeworCQlpZiAoeGF0dHJfc2l6ZSA9PSAwKQorCQkJLyogQ29tcGxldGVseSBuZXcgZWEgbGlzdCAqLworCQkJeGF0dHJfc2l6ZSA9IHNpemVvZiAoc3RydWN0IGpmc19lYV9saXN0KTsKKworCQllYSA9IChzdHJ1Y3QgamZzX2VhICopICgoY2hhciAqKSBlYWxpc3QgKyB4YXR0cl9zaXplKTsKKwkJZWEtPmZsYWcgPSAwOworCQllYS0+bmFtZWxlbiA9IG5hbWVsZW47CisJCWVhLT52YWx1ZWxlbiA9IChjcHVfdG9fbGUxNih2YWx1ZV9sZW4pKTsKKwkJbWVtY3B5KGVhLT5uYW1lLCBuYW1lLCBuYW1lbGVuKTsKKwkJZWEtPm5hbWVbbmFtZWxlbl0gPSAwOworCQlpZiAodmFsdWVfbGVuKQorCQkJbWVtY3B5KCZlYS0+bmFtZVtuYW1lbGVuICsgMV0sIHZhbHVlLCB2YWx1ZV9sZW4pOworCQl4YXR0cl9zaXplICs9IEVBX1NJWkUoZWEpOworCX0KKworCS8qIERFQlVHIC0gSWYgd2UgZGlkIHRoaXMgcmlnaHQsIHRoZXNlIG51bWJlciBtYXRjaCAqLworCWlmICh4YXR0cl9zaXplICE9IG5ld19zaXplKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgImpmc194c2V0YXR0cjogeGF0dHJfc2l6ZSA9ICVkLCBuZXdfc2l6ZSA9ICVkXG4iLAorCQkgICAgICAgeGF0dHJfc2l6ZSwgbmV3X3NpemUpOworCisJCXJjID0gLUVJTlZBTDsKKwkJZ290byByZWxlYXNlOworCX0KKworCS8qCisJICogSWYgd2UncmUgbGVmdCB3aXRoIGFuIGVtcHR5IGxpc3QsIHRoZXJlJ3Mgbm8gZWEKKwkgKi8KKwlpZiAobmV3X3NpemUgPT0gc2l6ZW9mIChzdHJ1Y3QgamZzX2VhX2xpc3QpKQorCQluZXdfc2l6ZSA9IDA7CisKKwllYWxpc3QtPnNpemUgPSBjcHVfdG9fbGUzMihuZXdfc2l6ZSk7CisKKwlyYyA9IGVhX3B1dChpbm9kZSwgJmVhX2J1ZiwgbmV3X3NpemUpOworCisJZ290byBvdXQ7CisgICAgICByZWxlYXNlOgorCWVhX3JlbGVhc2UoaW5vZGUsICZlYV9idWYpOworICAgICAgb3V0OgorCXVwX3dyaXRlKCZKRlNfSVAoaW5vZGUpLT54YXR0cl9zZW0pOworCisJaWYgKG9zMm5hbWUpCisJCWtmcmVlKG9zMm5hbWUpOworCisJcmV0dXJuIHJjOworfQorCitpbnQgamZzX3NldHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqdmFsdWUsCisJCSBzaXplX3QgdmFsdWVfbGVuLCBpbnQgZmxhZ3MpCit7CisJaWYgKHZhbHVlID09IE5VTEwpIHsJLyogZW1wdHkgRUEsIGRvIG5vdCByZW1vdmUgKi8KKwkJdmFsdWUgPSAiIjsKKwkJdmFsdWVfbGVuID0gMDsKKwl9CisKKwlyZXR1cm4gX19qZnNfc2V0eGF0dHIoZGVudHJ5LT5kX2lub2RlLCBuYW1lLCB2YWx1ZSwgdmFsdWVfbGVuLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgY2FuX2dldF94YXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lKQoreworI2lmZGVmIENPTkZJR19KRlNfU0VDVVJJVFkKKwlpZihzdHJuY21wKG5hbWUsIFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCwgWEFUVFJfU0VDVVJJVFlfUFJFRklYX0xFTikgPT0gMCkKKwkJcmV0dXJuIDA7CisjZW5kaWYKKworCWlmKHN0cm5jbXAobmFtZSwgWEFUVFJfVFJVU1RFRF9QUkVGSVgsIFhBVFRSX1RSVVNURURfUFJFRklYX0xFTikgPT0gMCkKKwkJcmV0dXJuIChjYXBhYmxlKENBUF9TWVNfQURNSU4pID8gMCA6IC1FUEVSTSk7CisKKwlpZihzdHJuY21wKG5hbWUsIFhBVFRSX1NZU1RFTV9QUkVGSVgsIFhBVFRSX1NZU1RFTV9QUkVGSVhfTEVOKSA9PSAwKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBwZXJtaXNzaW9uKGlub2RlLCBNQVlfUkVBRCwgTlVMTCk7Cit9CisKK3NzaXplX3QgX19qZnNfZ2V0eGF0dHIoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqZGF0YSwKKwkJICAgICAgIHNpemVfdCBidWZfc2l6ZSkKK3sKKwlzdHJ1Y3QgamZzX2VhX2xpc3QgKmVhbGlzdDsKKwlzdHJ1Y3QgamZzX2VhICplYTsKKwlzdHJ1Y3QgZWFfYnVmZmVyIGVhX2J1ZjsKKwlpbnQgeGF0dHJfc2l6ZTsKKwlzc2l6ZV90IHNpemU7CisJaW50IG5hbWVsZW4gPSBzdHJsZW4obmFtZSk7CisJY2hhciAqb3MybmFtZSA9IE5VTEw7CisJaW50IHJjOworCWNoYXIgKnZhbHVlOworCisJaWYgKChyYyA9IGNhbl9nZXRfeGF0dHIoaW5vZGUsIG5hbWUpKSkKKwkJcmV0dXJuIHJjOworCisJaWYgKHN0cm5jbXAobmFtZSwgWEFUVFJfT1MyX1BSRUZJWCwgWEFUVFJfT1MyX1BSRUZJWF9MRU4pID09IDApIHsKKwkJb3MybmFtZSA9IGttYWxsb2MobmFtZWxlbiAtIFhBVFRSX09TMl9QUkVGSVhfTEVOICsgMSwKKwkJCQkgIEdGUF9LRVJORUwpOworCQlpZiAoIW9zMm5hbWUpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJc3RyY3B5KG9zMm5hbWUsIG5hbWUgKyBYQVRUUl9PUzJfUFJFRklYX0xFTik7CisJCW5hbWUgPSBvczJuYW1lOworCQluYW1lbGVuIC09IFhBVFRSX09TMl9QUkVGSVhfTEVOOworCX0KKworCWRvd25fcmVhZCgmSkZTX0lQKGlub2RlKS0+eGF0dHJfc2VtKTsKKworCXhhdHRyX3NpemUgPSBlYV9nZXQoaW5vZGUsICZlYV9idWYsIDApOworCisJaWYgKHhhdHRyX3NpemUgPCAwKSB7CisJCXNpemUgPSB4YXR0cl9zaXplOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoeGF0dHJfc2l6ZSA9PSAwKQorCQlnb3RvIG5vdF9mb3VuZDsKKworCWVhbGlzdCA9IChzdHJ1Y3QgamZzX2VhX2xpc3QgKikgZWFfYnVmLnhhdHRyOworCisJLyogRmluZCB0aGUgbmFtZWQgYXR0cmlidXRlICovCisJZm9yIChlYSA9IEZJUlNUX0VBKGVhbGlzdCk7IGVhIDwgRU5EX0VBTElTVChlYWxpc3QpOyBlYSA9IE5FWFRfRUEoZWEpKQorCQlpZiAoKG5hbWVsZW4gPT0gZWEtPm5hbWVsZW4pICYmCisJCSAgICBtZW1jbXAobmFtZSwgZWEtPm5hbWUsIG5hbWVsZW4pID09IDApIHsKKwkJCS8qIEZvdW5kIGl0ICovCisJCQlzaXplID0gbGUxNl90b19jcHUoZWEtPnZhbHVlbGVuKTsKKwkJCWlmICghZGF0YSkKKwkJCQlnb3RvIHJlbGVhc2U7CisJCQllbHNlIGlmIChzaXplID4gYnVmX3NpemUpIHsKKwkJCQlzaXplID0gLUVSQU5HRTsKKwkJCQlnb3RvIHJlbGVhc2U7CisJCQl9CisJCQl2YWx1ZSA9ICgoY2hhciAqKSAmZWEtPm5hbWUpICsgZWEtPm5hbWVsZW4gKyAxOworCQkJbWVtY3B5KGRhdGEsIHZhbHVlLCBzaXplKTsKKwkJCWdvdG8gcmVsZWFzZTsKKwkJfQorICAgICAgbm90X2ZvdW5kOgorCXNpemUgPSAtRU5PREFUQTsKKyAgICAgIHJlbGVhc2U6CisJZWFfcmVsZWFzZShpbm9kZSwgJmVhX2J1Zik7CisgICAgICBvdXQ6CisJdXBfcmVhZCgmSkZTX0lQKGlub2RlKS0+eGF0dHJfc2VtKTsKKworCWlmIChvczJuYW1lKQorCQlrZnJlZShvczJuYW1lKTsKKworCXJldHVybiBzaXplOworfQorCitzc2l6ZV90IGpmc19nZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmRhdGEsCisJCSAgICAgc2l6ZV90IGJ1Zl9zaXplKQoreworCWludCBlcnI7CisKKwllcnIgPSBfX2pmc19nZXR4YXR0cihkZW50cnktPmRfaW5vZGUsIG5hbWUsIGRhdGEsIGJ1Zl9zaXplKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBObyBzcGVjaWFsIHBlcm1pc3Npb25zIGFyZSBuZWVkZWQgdG8gbGlzdCBhdHRyaWJ1dGVzIGV4Y2VwdCBmb3IgdHJ1c3RlZC4qCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNhbl9saXN0KHN0cnVjdCBqZnNfZWEgKmVhKQoreworCXJldHVybiAoc3RybmNtcChlYS0+bmFtZSwgWEFUVFJfVFJVU1RFRF9QUkVGSVgsCisJCQkgICAgWEFUVFJfVFJVU1RFRF9QUkVGSVhfTEVOKSB8fAorCQljYXBhYmxlKENBUF9TWVNfQURNSU4pKTsKK30KKworc3NpemVfdCBqZnNfbGlzdHhhdHRyKHN0cnVjdCBkZW50cnkgKiBkZW50cnksIGNoYXIgKmRhdGEsIHNpemVfdCBidWZfc2l6ZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWNoYXIgKmJ1ZmZlcjsKKwlzc2l6ZV90IHNpemUgPSAwOworCWludCB4YXR0cl9zaXplOworCXN0cnVjdCBqZnNfZWFfbGlzdCAqZWFsaXN0OworCXN0cnVjdCBqZnNfZWEgKmVhOworCXN0cnVjdCBlYV9idWZmZXIgZWFfYnVmOworCisJZG93bl9yZWFkKCZKRlNfSVAoaW5vZGUpLT54YXR0cl9zZW0pOworCisJeGF0dHJfc2l6ZSA9IGVhX2dldChpbm9kZSwgJmVhX2J1ZiwgMCk7CisJaWYgKHhhdHRyX3NpemUgPCAwKSB7CisJCXNpemUgPSB4YXR0cl9zaXplOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoeGF0dHJfc2l6ZSA9PSAwKQorCQlnb3RvIHJlbGVhc2U7CisKKwllYWxpc3QgPSAoc3RydWN0IGpmc19lYV9saXN0ICopIGVhX2J1Zi54YXR0cjsKKworCS8qIGNvbXB1dGUgcmVxdWlyZWQgc2l6ZSBvZiBsaXN0ICovCisJZm9yIChlYSA9IEZJUlNUX0VBKGVhbGlzdCk7IGVhIDwgRU5EX0VBTElTVChlYWxpc3QpOyBlYSA9IE5FWFRfRUEoZWEpKSB7CisJICAgIAlpZiAoY2FuX2xpc3QoZWEpKQorCQkJc2l6ZSArPSBuYW1lX3NpemUoZWEpICsgMTsKKwl9CisKKwlpZiAoIWRhdGEpCisJCWdvdG8gcmVsZWFzZTsKKworCWlmIChzaXplID4gYnVmX3NpemUpIHsKKwkJc2l6ZSA9IC1FUkFOR0U7CisJCWdvdG8gcmVsZWFzZTsKKwl9CisKKwkvKiBDb3B5IGF0dHJpYnV0ZSBuYW1lcyB0byBidWZmZXIgKi8KKwlidWZmZXIgPSBkYXRhOworCWZvciAoZWEgPSBGSVJTVF9FQShlYWxpc3QpOyBlYSA8IEVORF9FQUxJU1QoZWFsaXN0KTsgZWEgPSBORVhUX0VBKGVhKSkgeworCSAgICAJaWYgKGNhbl9saXN0KGVhKSkgeworCQkJaW50IG5hbWVsZW4gPSBjb3B5X25hbWUoYnVmZmVyLCBlYSk7CisJCQlidWZmZXIgKz0gbmFtZWxlbiArIDE7CisJCX0KKwl9CisKKyAgICAgIHJlbGVhc2U6CisJZWFfcmVsZWFzZShpbm9kZSwgJmVhX2J1Zik7CisgICAgICBvdXQ6CisJdXBfcmVhZCgmSkZTX0lQKGlub2RlKS0+eGF0dHJfc2VtKTsKKwlyZXR1cm4gc2l6ZTsKK30KKworaW50IGpmc19yZW1vdmV4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIF9famZzX3NldHhhdHRyKGRlbnRyeS0+ZF9pbm9kZSwgbmFtZSwgTlVMTCwgMCwgWEFUVFJfUkVQTEFDRSk7Cit9CmRpZmYgLS1naXQgYS9mcy9saWJmcy5jIGIvZnMvbGliZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTBiMjk1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbGliZnMuYwpAQCAtMCwwICsxLDU0OSBAQAorLyoKKyAqCWZzL2xpYmZzLmMKKyAqCUxpYnJhcnkgZm9yIGZpbGVzeXN0ZW1zIHdyaXRlcnMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK2ludCBzaW1wbGVfZ2V0YXR0cihzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkgICBzdHJ1Y3Qga3N0YXQgKnN0YXQpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlnZW5lcmljX2ZpbGxhdHRyKGlub2RlLCBzdGF0KTsKKwlzdGF0LT5ibG9ja3MgPSBpbm9kZS0+aV9tYXBwaW5nLT5ucnBhZ2VzIDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gOSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzaW1wbGVfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICpidWYpCit7CisJYnVmLT5mX3R5cGUgPSBzYi0+c19tYWdpYzsKKwlidWYtPmZfYnNpemUgPSBQQUdFX0NBQ0hFX1NJWkU7CisJYnVmLT5mX25hbWVsZW4gPSBOQU1FX01BWDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJldGFpbmluZyBuZWdhdGl2ZSBkZW50cmllcyBmb3IgYW4gaW4tbWVtb3J5IGZpbGVzeXN0ZW0ganVzdCB3YXN0ZXMKKyAqIG1lbW9yeSBhbmQgbG9va3VwIHRpbWU6IGFycmFuZ2UgZm9yIHRoZW0gdG8gYmUgZGVsZXRlZCBpbW1lZGlhdGVseS4KKyAqLworc3RhdGljIGludCBzaW1wbGVfZGVsZXRlX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBMb29rdXAgdGhlIGRhdGEuIFRoaXMgaXMgdHJpdmlhbCAtIGlmIHRoZSBkZW50cnkgZGlkbid0IGFscmVhZHkKKyAqIGV4aXN0LCB3ZSBrbm93IGl0IGlzIG5lZ2F0aXZlLiAgU2V0IGRfb3AgdG8gZGVsZXRlIG5lZ2F0aXZlIGRlbnRyaWVzLgorICovCitzdHJ1Y3QgZGVudHJ5ICpzaW1wbGVfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0YXRpYyBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgc2ltcGxlX2RlbnRyeV9vcGVyYXRpb25zID0geworCQkuZF9kZWxldGUgPSBzaW1wbGVfZGVsZXRlX2RlbnRyeSwKKwl9OworCisJaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+IE5BTUVfTUFYKQorCQlyZXR1cm4gRVJSX1BUUigtRU5BTUVUT09MT05HKTsKKwlkZW50cnktPmRfb3AgPSAmc2ltcGxlX2RlbnRyeV9vcGVyYXRpb25zOworCWRfYWRkKGRlbnRyeSwgTlVMTCk7CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBzaW1wbGVfc3luY19maWxlKHN0cnVjdCBmaWxlICogZmlsZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgZGF0YXN5bmMpCit7CisJcmV0dXJuIDA7Cit9CisgCitpbnQgZGNhY2hlX2Rpcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0YXRpYyBzdHJ1Y3QgcXN0ciBjdXJzb3JfbmFtZSA9IHsubGVuID0gMSwgLm5hbWUgPSAiLiJ9OworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZF9hbGxvYyhmaWxlLT5mX2RlbnRyeSwgJmN1cnNvcl9uYW1lKTsKKworCXJldHVybiBmaWxlLT5wcml2YXRlX2RhdGEgPyAwIDogLUVOT01FTTsKK30KKworaW50IGRjYWNoZV9kaXJfY2xvc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJZHB1dChmaWxlLT5wcml2YXRlX2RhdGEpOworCXJldHVybiAwOworfQorCitsb2ZmX3QgZGNhY2hlX2Rpcl9sc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWdpbikKK3sKKwlkb3duKCZmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCXN3aXRjaCAob3JpZ2luKSB7CisJCWNhc2UgMToKKwkJCW9mZnNldCArPSBmaWxlLT5mX3BvczsKKwkJY2FzZSAwOgorCQkJaWYgKG9mZnNldCA+PSAwKQorCQkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJdXAoJmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKG9mZnNldCAhPSBmaWxlLT5mX3BvcykgeworCQlmaWxlLT5mX3BvcyA9IG9mZnNldDsKKwkJaWYgKGZpbGUtPmZfcG9zID49IDIpIHsKKwkJCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJCQlzdHJ1Y3QgZGVudHJ5ICpjdXJzb3IgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJCQlsb2ZmX3QgbiA9IGZpbGUtPmZfcG9zIC0gMjsKKworCQkJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJCQlsaXN0X2RlbCgmY3Vyc29yLT5kX2NoaWxkKTsKKwkJCXAgPSBmaWxlLT5mX2RlbnRyeS0+ZF9zdWJkaXJzLm5leHQ7CisJCQl3aGlsZSAobiAmJiBwICE9ICZmaWxlLT5mX2RlbnRyeS0+ZF9zdWJkaXJzKSB7CisJCQkJc3RydWN0IGRlbnRyeSAqbmV4dDsKKwkJCQluZXh0ID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgZGVudHJ5LCBkX2NoaWxkKTsKKwkJCQlpZiAoIWRfdW5oYXNoZWQobmV4dCkgJiYgbmV4dC0+ZF9pbm9kZSkKKwkJCQkJbi0tOworCQkJCXAgPSBwLT5uZXh0OworCQkJfQorCQkJbGlzdF9hZGRfdGFpbCgmY3Vyc29yLT5kX2NoaWxkLCBwKTsKKwkJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJCX0KKwl9CisJdXAoJmZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJcmV0dXJuIG9mZnNldDsKK30KKworLyogUmVsYXRpb25zaGlwIGJldHdlZW4gaV9tb2RlIGFuZCB0aGUgRFRfeHh4IHR5cGVzICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgZHRfdHlwZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiAoaW5vZGUtPmlfbW9kZSA+PiAxMikgJiAxNTsKK30KKworLyoKKyAqIERpcmVjdG9yeSBpcyBsb2NrZWQgYW5kIGFsbCBwb3NpdGl2ZSBkZW50cmllcyBpbiBpdCBhcmUgc2FmZSwgc2luY2UKKyAqIGZvciByYW1mcy10eXBlIHRyZWVzIHRoZXkgY2FuJ3QgZ28gYXdheSB3aXRob3V0IHVubGluaygpIG9yIHJtZGlyKCksCisgKiBib3RoIGltcG9zc2libGUgZHVlIHRvIHRoZSBsb2NrIG9uIGRpcmVjdG9yeS4KKyAqLworCitpbnQgZGNhY2hlX3JlYWRkaXIoc3RydWN0IGZpbGUgKiBmaWxwLCB2b2lkICogZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxwLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgZGVudHJ5ICpjdXJzb3IgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGxpc3RfaGVhZCAqcCwgKnEgPSAmY3Vyc29yLT5kX2NoaWxkOworCWlub190IGlubzsKKwlpbnQgaSA9IGZpbHAtPmZfcG9zOworCisJc3dpdGNoIChpKSB7CisJCWNhc2UgMDoKKwkJCWlubyA9IGRlbnRyeS0+ZF9pbm9kZS0+aV9pbm87CisJCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuIiwgMSwgaSwgaW5vLCBEVF9ESVIpIDwgMCkKKwkJCQlicmVhazsKKwkJCWZpbHAtPmZfcG9zKys7CisJCQlpKys7CisJCQkvKiBmYWxsdGhyb3VnaCAqLworCQljYXNlIDE6CisJCQlpbm8gPSBwYXJlbnRfaW5vKGRlbnRyeSk7CisJCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuLiIsIDIsIGksIGlubywgRFRfRElSKSA8IDApCisJCQkJYnJlYWs7CisJCQlmaWxwLT5mX3BvcysrOworCQkJaSsrOworCQkJLyogZmFsbHRocm91Z2ggKi8KKwkJZGVmYXVsdDoKKwkJCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCQkJaWYgKGZpbHAtPmZfcG9zID09IDIpIHsKKwkJCQlsaXN0X2RlbChxKTsKKwkJCQlsaXN0X2FkZChxLCAmZGVudHJ5LT5kX3N1YmRpcnMpOworCQkJfQorCQkJZm9yIChwPXEtPm5leHQ7IHAgIT0gJmRlbnRyeS0+ZF9zdWJkaXJzOyBwPXAtPm5leHQpIHsKKwkJCQlzdHJ1Y3QgZGVudHJ5ICpuZXh0OworCQkJCW5leHQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBkZW50cnksIGRfY2hpbGQpOworCQkJCWlmIChkX3VuaGFzaGVkKG5leHQpIHx8ICFuZXh0LT5kX2lub2RlKQorCQkJCQljb250aW51ZTsKKworCQkJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJCQkJaWYgKGZpbGxkaXIoZGlyZW50LCBuZXh0LT5kX25hbWUubmFtZSwgbmV4dC0+ZF9uYW1lLmxlbiwgZmlscC0+Zl9wb3MsIG5leHQtPmRfaW5vZGUtPmlfaW5vLCBkdF90eXBlKG5leHQtPmRfaW5vZGUpKSA8IDApCisJCQkJCXJldHVybiAwOworCQkJCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCQkJCS8qIG5leHQgaXMgc3RpbGwgYWxpdmUgKi8KKwkJCQlsaXN0X2RlbChxKTsKKwkJCQlsaXN0X2FkZChxLCBwKTsKKwkJCQlwID0gcTsKKwkJCQlmaWxwLT5mX3BvcysrOworCQkJfQorCQkJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3NzaXplX3QgZ2VuZXJpY19yZWFkX2RpcihzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IHNpeiwgbG9mZl90ICpwcG9zKQoreworCXJldHVybiAtRUlTRElSOworfQorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNpbXBsZV9kaXJfb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSBkY2FjaGVfZGlyX29wZW4sCisJLnJlbGVhc2UJPSBkY2FjaGVfZGlyX2Nsb3NlLAorCS5sbHNlZWsJCT0gZGNhY2hlX2Rpcl9sc2VlaywKKwkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAorCS5yZWFkZGlyCT0gZGNhY2hlX3JlYWRkaXIsCit9OworCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBzaW1wbGVfZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLmxvb2t1cAkJPSBzaW1wbGVfbG9va3VwLAorfTsKKworLyoKKyAqIENvbW1vbiBoZWxwZXIgZm9yIHBzZXVkby1maWxlc3lzdGVtcyAoc29ja2ZzLCBwaXBlZnMsIGJkZXYgLSBzdHVmZiB0aGF0CisgKiB3aWxsIG5ldmVyIGJlIG1vdW50YWJsZSkKKyAqLworc3RydWN0IHN1cGVyX2Jsb2NrICoKK2dldF9zYl9wc2V1ZG8oc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsIGNoYXIgKm5hbWUsCisJc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgKm9wcywgdW5zaWduZWQgbG9uZyBtYWdpYykKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSBzZ2V0KGZzX3R5cGUsIE5VTEwsIHNldF9hbm9uX3N1cGVyLCBOVUxMKTsKKwlzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgZGVmYXVsdF9vcHMgPSB7LnN0YXRmcyA9IHNpbXBsZV9zdGF0ZnN9OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKnJvb3Q7CisJc3RydWN0IHFzdHIgZF9uYW1lID0gey5uYW1lID0gbmFtZSwgLmxlbiA9IHN0cmxlbihuYW1lKX07CisKKwlpZiAoSVNfRVJSKHMpKQorCQlyZXR1cm4gczsKKworCXMtPnNfZmxhZ3MgPSBNU19OT1VTRVI7CisJcy0+c19tYXhieXRlcyA9IH4wVUxMOworCXMtPnNfYmxvY2tzaXplID0gMTAyNDsKKwlzLT5zX2Jsb2Nrc2l6ZV9iaXRzID0gMTA7CisJcy0+c19tYWdpYyA9IG1hZ2ljOworCXMtPnNfb3AgPSBvcHMgPyBvcHMgOiAmZGVmYXVsdF9vcHM7CisJcy0+c190aW1lX2dyYW4gPSAxOworCXJvb3QgPSBuZXdfaW5vZGUocyk7CisJaWYgKCFyb290KQorCQlnb3RvIEVub21lbTsKKwlyb290LT5pX21vZGUgPSBTX0lGRElSIHwgU19JUlVTUiB8IFNfSVdVU1I7CisJcm9vdC0+aV91aWQgPSByb290LT5pX2dpZCA9IDA7CisJcm9vdC0+aV9hdGltZSA9IHJvb3QtPmlfbXRpbWUgPSByb290LT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCWRlbnRyeSA9IGRfYWxsb2MoTlVMTCwgJmRfbmFtZSk7CisJaWYgKCFkZW50cnkpIHsKKwkJaXB1dChyb290KTsKKwkJZ290byBFbm9tZW07CisJfQorCWRlbnRyeS0+ZF9zYiA9IHM7CisJZGVudHJ5LT5kX3BhcmVudCA9IGRlbnRyeTsKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgcm9vdCk7CisJcy0+c19yb290ID0gZGVudHJ5OworCXMtPnNfZmxhZ3MgfD0gTVNfQUNUSVZFOworCXJldHVybiBzOworCitFbm9tZW06CisJdXBfd3JpdGUoJnMtPnNfdW1vdW50KTsKKwlkZWFjdGl2YXRlX3N1cGVyKHMpOworCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworfQorCitpbnQgc2ltcGxlX2xpbmsoc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwgc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gb2xkX2RlbnRyeS0+ZF9pbm9kZTsKKworCWlub2RlLT5pX2N0aW1lID0gZGlyLT5pX2N0aW1lID0gZGlyLT5pX210aW1lID0gQ1VSUkVOVF9USU1FOworCWlub2RlLT5pX25saW5rKys7CisJYXRvbWljX2luYygmaW5vZGUtPmlfY291bnQpOworCWRnZXQoZGVudHJ5KTsKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBzaW1wbGVfcG9zaXRpdmUoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXJldHVybiBkZW50cnktPmRfaW5vZGUgJiYgIWRfdW5oYXNoZWQoZGVudHJ5KTsKK30KKworaW50IHNpbXBsZV9lbXB0eShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGRlbnRyeSAqY2hpbGQ7CisJaW50IHJldCA9IDA7CisKKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkLCAmZGVudHJ5LT5kX3N1YmRpcnMsIGRfY2hpbGQpCisJCWlmIChzaW1wbGVfcG9zaXRpdmUoY2hpbGQpKQorCQkJZ290byBvdXQ7CisJcmV0ID0gMTsKK291dDoKKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK2ludCBzaW1wbGVfdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKworCWlub2RlLT5pX2N0aW1lID0gZGlyLT5pX2N0aW1lID0gZGlyLT5pX210aW1lID0gQ1VSUkVOVF9USU1FOworCWlub2RlLT5pX25saW5rLS07CisJZHB1dChkZW50cnkpOworCXJldHVybiAwOworfQorCitpbnQgc2ltcGxlX3JtZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJaWYgKCFzaW1wbGVfZW1wdHkoZGVudHJ5KSkKKwkJcmV0dXJuIC1FTk9URU1QVFk7CisKKwlkZW50cnktPmRfaW5vZGUtPmlfbmxpbmstLTsKKwlzaW1wbGVfdW5saW5rKGRpciwgZGVudHJ5KTsKKwlkaXItPmlfbmxpbmstLTsKKwlyZXR1cm4gMDsKK30KKworaW50IHNpbXBsZV9yZW5hbWUoc3RydWN0IGlub2RlICpvbGRfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAorCQlzdHJ1Y3QgaW5vZGUgKm5ld19kaXIsIHN0cnVjdCBkZW50cnkgKm5ld19kZW50cnkpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG9sZF9kZW50cnktPmRfaW5vZGU7CisJaW50IHRoZXlfYXJlX2RpcnMgPSBTX0lTRElSKG9sZF9kZW50cnktPmRfaW5vZGUtPmlfbW9kZSk7CisKKwlpZiAoIXNpbXBsZV9lbXB0eShuZXdfZGVudHJ5KSkKKwkJcmV0dXJuIC1FTk9URU1QVFk7CisKKwlpZiAobmV3X2RlbnRyeS0+ZF9pbm9kZSkgeworCQlzaW1wbGVfdW5saW5rKG5ld19kaXIsIG5ld19kZW50cnkpOworCQlpZiAodGhleV9hcmVfZGlycykKKwkJCW9sZF9kaXItPmlfbmxpbmstLTsKKwl9IGVsc2UgaWYgKHRoZXlfYXJlX2RpcnMpIHsKKwkJb2xkX2Rpci0+aV9ubGluay0tOworCQluZXdfZGlyLT5pX25saW5rKys7CisJfQorCisJb2xkX2Rpci0+aV9jdGltZSA9IG9sZF9kaXItPmlfbXRpbWUgPSBuZXdfZGlyLT5pX2N0aW1lID0KKwkJbmV3X2Rpci0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzaW1wbGVfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXZvaWQgKmthZGRyOworCisJaWYgKFBhZ2VVcHRvZGF0ZShwYWdlKSkKKwkJZ290byBvdXQ7CisKKwlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwltZW1zZXQoa2FkZHIsIDAsIFBBR0VfQ0FDSEVfU0laRSk7CisJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKK291dDoKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHNpbXBsZV9wcmVwYXJlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCXVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCWlmICh0byAtIGZyb20gIT0gUEFHRV9DQUNIRV9TSVpFKSB7CisJCQl2b2lkICprYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkJCW1lbXNldChrYWRkciwgMCwgZnJvbSk7CisJCQltZW1zZXQoa2FkZHIgKyB0bywgMCwgUEFHRV9DQUNIRV9TSVpFIC0gdG8pOworCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJCX0KKwkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHNpbXBsZV9jb21taXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCB0bykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlsb2ZmX3QgcG9zID0gKChsb2ZmX3QpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgKyB0bzsKKworCS8qCisJICogTm8gbmVlZCB0byB1c2UgaV9zaXplX3JlYWQoKSBoZXJlLCB0aGUgaV9zaXplCisJICogY2Fubm90IGNoYW5nZSB1bmRlciB1cyBiZWNhdXNlIHdlIGhvbGQgdGhlIGlfc2VtLgorCSAqLworCWlmIChwb3MgPiBpbm9kZS0+aV9zaXplKQorCQlpX3NpemVfd3JpdGUoaW5vZGUsIHBvcyk7CisJc2V0X3BhZ2VfZGlydHkocGFnZSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzaW1wbGVfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIGludCBtYWdpYywgc3RydWN0IHRyZWVfZGVzY3IgKmZpbGVzKQoreworCXN0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBzX29wcyA9IHsuc3RhdGZzID0gc2ltcGxlX3N0YXRmc307CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgZGVudHJ5ICpyb290OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwlpbnQgaTsKKworCXMtPnNfYmxvY2tzaXplID0gUEFHRV9DQUNIRV9TSVpFOworCXMtPnNfYmxvY2tzaXplX2JpdHMgPSBQQUdFX0NBQ0hFX1NISUZUOworCXMtPnNfbWFnaWMgPSBtYWdpYzsKKwlzLT5zX29wID0gJnNfb3BzOworCXMtPnNfdGltZV9ncmFuID0gMTsKKworCWlub2RlID0gbmV3X2lub2RlKHMpOworCWlmICghaW5vZGUpCisJCXJldHVybiAtRU5PTUVNOworCWlub2RlLT5pX21vZGUgPSBTX0lGRElSIHwgMDc1NTsKKwlpbm9kZS0+aV91aWQgPSBpbm9kZS0+aV9naWQgPSAwOworCWlub2RlLT5pX2Jsa3NpemUgPSBQQUdFX0NBQ0hFX1NJWkU7CisJaW5vZGUtPmlfYmxvY2tzID0gMDsKKwlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisJaW5vZGUtPmlfb3AgPSAmc2ltcGxlX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCWlub2RlLT5pX2ZvcCA9ICZzaW1wbGVfZGlyX29wZXJhdGlvbnM7CisJcm9vdCA9IGRfYWxsb2Nfcm9vdChpbm9kZSk7CisJaWYgKCFyb290KSB7CisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZm9yIChpID0gMDsgIWZpbGVzLT5uYW1lIHx8IGZpbGVzLT5uYW1lWzBdOyBpKyssIGZpbGVzKyspIHsKKwkJaWYgKCFmaWxlcy0+bmFtZSkKKwkJCWNvbnRpbnVlOworCQlkZW50cnkgPSBkX2FsbG9jX25hbWUocm9vdCwgZmlsZXMtPm5hbWUpOworCQlpZiAoIWRlbnRyeSkKKwkJCWdvdG8gb3V0OworCQlpbm9kZSA9IG5ld19pbm9kZShzKTsKKwkJaWYgKCFpbm9kZSkKKwkJCWdvdG8gb3V0OworCQlpbm9kZS0+aV9tb2RlID0gU19JRlJFRyB8IGZpbGVzLT5tb2RlOworCQlpbm9kZS0+aV91aWQgPSBpbm9kZS0+aV9naWQgPSAwOworCQlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9DQUNIRV9TSVpFOworCQlpbm9kZS0+aV9ibG9ja3MgPSAwOworCQlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisJCWlub2RlLT5pX2ZvcCA9IGZpbGVzLT5vcHM7CisJCWlub2RlLT5pX2lubyA9IGk7CisJCWRfYWRkKGRlbnRyeSwgaW5vZGUpOworCX0KKwlzLT5zX3Jvb3QgPSByb290OworCXJldHVybiAwOworb3V0OgorCWRfZ2Vub2NpZGUocm9vdCk7CisJZHB1dChyb290KTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIERFRklORV9TUElOTE9DSyhwaW5fZnNfbG9jayk7CisKK2ludCBzaW1wbGVfcGluX2ZzKGNoYXIgKm5hbWUsIHN0cnVjdCB2ZnNtb3VudCAqKm1vdW50LCBpbnQgKmNvdW50KQoreworCXN0cnVjdCB2ZnNtb3VudCAqbW50ID0gTlVMTDsKKwlzcGluX2xvY2soJnBpbl9mc19sb2NrKTsKKwlpZiAodW5saWtlbHkoISptb3VudCkpIHsKKwkJc3Bpbl91bmxvY2soJnBpbl9mc19sb2NrKTsKKwkJbW50ID0gZG9fa2Vybl9tb3VudChuYW1lLCAwLCBuYW1lLCBOVUxMKTsKKwkJaWYgKElTX0VSUihtbnQpKQorCQkJcmV0dXJuIFBUUl9FUlIobW50KTsKKwkJc3Bpbl9sb2NrKCZwaW5fZnNfbG9jayk7CisJCWlmICghKm1vdW50KQorCQkJKm1vdW50ID0gbW50OworCX0KKwltbnRnZXQoKm1vdW50KTsKKwkrKypjb3VudDsKKwlzcGluX3VubG9jaygmcGluX2ZzX2xvY2spOworCW1udHB1dChtbnQpOworCXJldHVybiAwOworfQorCit2b2lkIHNpbXBsZV9yZWxlYXNlX2ZzKHN0cnVjdCB2ZnNtb3VudCAqKm1vdW50LCBpbnQgKmNvdW50KQoreworCXN0cnVjdCB2ZnNtb3VudCAqbW50OworCXNwaW5fbG9jaygmcGluX2ZzX2xvY2spOworCW1udCA9ICptb3VudDsKKwlpZiAoIS0tKmNvdW50KQorCQkqbW91bnQgPSBOVUxMOworCXNwaW5fdW5sb2NrKCZwaW5fZnNfbG9jayk7CisJbW50cHV0KG1udCk7Cit9CisKK3NzaXplX3Qgc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodm9pZCBfX3VzZXIgKnRvLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcywKKwkJCQljb25zdCB2b2lkICpmcm9tLCBzaXplX3QgYXZhaWxhYmxlKQoreworCWxvZmZfdCBwb3MgPSAqcHBvczsKKwlpZiAocG9zIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHBvcyA+PSBhdmFpbGFibGUpCisJCXJldHVybiAwOworCWlmIChjb3VudCA+IGF2YWlsYWJsZSAtIHBvcykKKwkJY291bnQgPSBhdmFpbGFibGUgLSBwb3M7CisJaWYgKGNvcHlfdG9fdXNlcih0bywgZnJvbSArIHBvcywgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkqcHBvcyA9IHBvcyArIGNvdW50OworCXJldHVybiBjb3VudDsKK30KKworLyoKKyAqIFRyYW5zYWN0aW9uIGJhc2VkIElPLgorICogVGhlIGZpbGUgZXhwZWN0cyBhIHNpbmdsZSB3cml0ZSB3aGljaCB0cmlnZ2VycyB0aGUgdHJhbnNhY3Rpb24sIGFuZCB0aGVuCisgKiBwb3NzaWJseSBhIHJlYWQgd2hpY2ggY29sbGVjdHMgdGhlIHJlc3VsdCAtIHdoaWNoIGlzIHN0b3JlZCBpbiBhCisgKiBmaWxlLWxvY2FsIGJ1ZmZlci4KKyAqLworY2hhciAqc2ltcGxlX3RyYW5zYWN0aW9uX2dldChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHNpbXBsZV90cmFuc2FjdGlvbl9hcmdyZXNwICphcjsKKwlzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNpbXBsZV90cmFuc2FjdGlvbl9sb2NrKTsKKworCWlmIChzaXplID4gU0lNUExFX1RSQU5TQUNUSU9OX0xJTUlUIC0gMSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVGQklHKTsKKworCWFyID0gKHN0cnVjdCBzaW1wbGVfdHJhbnNhY3Rpb25fYXJncmVzcCAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIWFyKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXNwaW5fbG9jaygmc2ltcGxlX3RyYW5zYWN0aW9uX2xvY2spOworCisJLyogb25seSBvbmUgd3JpdGUgYWxsb3dlZCBwZXIgb3BlbiAqLworCWlmIChmaWxlLT5wcml2YXRlX2RhdGEpIHsKKwkJc3Bpbl91bmxvY2soJnNpbXBsZV90cmFuc2FjdGlvbl9sb2NrKTsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWFyKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVCVVNZKTsKKwl9CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBhcjsKKworCXNwaW5fdW5sb2NrKCZzaW1wbGVfdHJhbnNhY3Rpb25fbG9jayk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoYXItPmRhdGEsIGJ1Ziwgc2l6ZSkpCisJCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOworCisJcmV0dXJuIGFyLT5kYXRhOworfQorCitzc2l6ZV90IHNpbXBsZV90cmFuc2FjdGlvbl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3Qgc2l6ZSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IHNpbXBsZV90cmFuc2FjdGlvbl9hcmdyZXNwICphciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWlmICghYXIpCisJCXJldHVybiAwOworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIHNpemUsIHBvcywgYXItPmRhdGEsIGFyLT5zaXplKTsKK30KKworaW50IHNpbXBsZV90cmFuc2FjdGlvbl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylmaWxlLT5wcml2YXRlX2RhdGEpOworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKGRjYWNoZV9kaXJfY2xvc2UpOworRVhQT1JUX1NZTUJPTChkY2FjaGVfZGlyX2xzZWVrKTsKK0VYUE9SVF9TWU1CT0woZGNhY2hlX2Rpcl9vcGVuKTsKK0VYUE9SVF9TWU1CT0woZGNhY2hlX3JlYWRkaXIpOworRVhQT1JUX1NZTUJPTChnZW5lcmljX3JlYWRfZGlyKTsKK0VYUE9SVF9TWU1CT0woZ2V0X3NiX3BzZXVkbyk7CitFWFBPUlRfU1lNQk9MKHNpbXBsZV9jb21taXRfd3JpdGUpOworRVhQT1JUX1NZTUJPTChzaW1wbGVfZGlyX2lub2RlX29wZXJhdGlvbnMpOworRVhQT1JUX1NZTUJPTChzaW1wbGVfZGlyX29wZXJhdGlvbnMpOworRVhQT1JUX1NZTUJPTChzaW1wbGVfZW1wdHkpOworRVhQT1JUX1NZTUJPTChkX2FsbG9jX25hbWUpOworRVhQT1JUX1NZTUJPTChzaW1wbGVfZmlsbF9zdXBlcik7CitFWFBPUlRfU1lNQk9MKHNpbXBsZV9nZXRhdHRyKTsKK0VYUE9SVF9TWU1CT0woc2ltcGxlX2xpbmspOworRVhQT1JUX1NZTUJPTChzaW1wbGVfbG9va3VwKTsKK0VYUE9SVF9TWU1CT0woc2ltcGxlX3Bpbl9mcyk7CitFWFBPUlRfU1lNQk9MKHNpbXBsZV9wcmVwYXJlX3dyaXRlKTsKK0VYUE9SVF9TWU1CT0woc2ltcGxlX3JlYWRwYWdlKTsKK0VYUE9SVF9TWU1CT0woc2ltcGxlX3JlbGVhc2VfZnMpOworRVhQT1JUX1NZTUJPTChzaW1wbGVfcmVuYW1lKTsKK0VYUE9SVF9TWU1CT0woc2ltcGxlX3JtZGlyKTsKK0VYUE9SVF9TWU1CT0woc2ltcGxlX3N0YXRmcyk7CitFWFBPUlRfU1lNQk9MKHNpbXBsZV9zeW5jX2ZpbGUpOworRVhQT1JUX1NZTUJPTChzaW1wbGVfdW5saW5rKTsKK0VYUE9SVF9TWU1CT0woc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIpOworRVhQT1JUX1NZTUJPTChzaW1wbGVfdHJhbnNhY3Rpb25fZ2V0KTsKK0VYUE9SVF9TWU1CT0woc2ltcGxlX3RyYW5zYWN0aW9uX3JlYWQpOworRVhQT1JUX1NZTUJPTChzaW1wbGVfdHJhbnNhY3Rpb25fcmVsZWFzZSk7CmRpZmYgLS1naXQgYS9mcy9sb2NrZC9NYWtlZmlsZSBiL2ZzL2xvY2tkL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MjVhMGEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9sb2NrZC9NYWtlZmlsZQpAQCAtMCwwICsxLDEwIEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgbGludXggbG9jayBtYW5hZ2VyIHN0dWZmCisjCisKK29iai0kKENPTkZJR19MT0NLRCkgKz0gbG9ja2QubworCitsb2NrZC1vYmpzLXkgOj0gY2xudGxvY2subyBjbG50cHJvYy5vIGhvc3QubyBzdmMubyBzdmNsb2NrLm8gc3Zjc2hhcmUubyBcCisJICAgICAgICBzdmNwcm9jLm8gc3Zjc3Vicy5vIG1vbi5vIHhkci5vCitsb2NrZC1vYmpzLSQoQ09ORklHX0xPQ0tEX1Y0KSArPSB4ZHI0Lm8gc3ZjNHByb2MubworbG9ja2Qtb2JqcwkJICAgICAgOj0gJChsb2NrZC1vYmpzLXkpCmRpZmYgLS1naXQgYS9mcy9sb2NrZC9jbG50bG9jay5jIGIvZnMvbG9ja2QvY2xudGxvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjcxMDNiCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbG9ja2QvY2xudGxvY2suYwpAQCAtMCwwICsxLDI0NSBAQAorLyoKKyAqIGxpbnV4L2ZzL2xvY2tkL2NsbnRsb2NrLmMKKyAqCisgKiBMb2NrIGhhbmRsaW5nIGZvciB0aGUgY2xpZW50IHNpZGUgTkxNIGltcGxlbWVudGF0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LCBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CisjaW5jbHVkZSA8bGludXgvbG9ja2QvbG9ja2QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCisjZGVmaW5lIE5MTURCR19GQUNJTElUWQkJTkxNREJHX0NMSUVOVAorCisvKgorICogTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcworICovCitzdGF0aWMgaW50CQkJcmVjbGFpbWVyKHZvaWQgKnB0cik7CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBoYW5kbGUgYmxvY2tpbmcgYW5kIGdyYW50aW5nIGZyb20gdGhlCisgKiBjbGllbnQgcGVyc3BlY3RpdmUuCisgKi8KKworLyoKKyAqIFRoaXMgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGEgYmxvY2tlZCBjbGllbnQgbG9jay4KKyAqLworc3RydWN0IG5sbV93YWl0IHsKKwlzdHJ1Y3QgbmxtX3dhaXQgKgliX25leHQ7CQkvKiBsaW5rZWQgbGlzdCAqLworCXdhaXRfcXVldWVfaGVhZF90CWJfd2FpdDsJCS8qIHdoZXJlIHRvIHdhaXQgb24gKi8KKwlzdHJ1Y3QgbmxtX2hvc3QgKgliX2hvc3Q7CisJc3RydWN0IGZpbGVfbG9jayAqCWJfbG9jazsJCS8qIGxvY2FsIGZpbGUgbG9jayAqLworCXVuc2lnbmVkIHNob3J0CQliX3JlY2xhaW07CS8qIGdvdCB0byByZWNsYWltIGxvY2sgKi8KKwl1MzIJCQliX3N0YXR1czsJLyogZ3JhbnQgY2FsbGJhY2sgc3RhdHVzICovCit9OworCitzdGF0aWMgc3RydWN0IG5sbV93YWl0ICoJbmxtX2Jsb2NrZWQ7CisKKy8qCisgKiBCbG9jayBvbiBhIGxvY2sKKyAqLworaW50CitubG1jbG50X2Jsb2NrKHN0cnVjdCBubG1faG9zdCAqaG9zdCwgc3RydWN0IGZpbGVfbG9jayAqZmwsIHUzMiAqc3RhdHApCit7CisJc3RydWN0IG5sbV93YWl0CWJsb2NrLCAqKmhlYWQ7CisJaW50CQllcnI7CisJdTMyCQlwc3RhdGU7CisKKwlibG9jay5iX2hvc3QgICA9IGhvc3Q7CisJYmxvY2suYl9sb2NrICAgPSBmbDsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZibG9jay5iX3dhaXQpOworCWJsb2NrLmJfc3RhdHVzID0gTkxNX0xDS19CTE9DS0VEOworCWJsb2NrLmJfbmV4dCAgID0gbmxtX2Jsb2NrZWQ7CisJbmxtX2Jsb2NrZWQgICAgPSAmYmxvY2s7CisKKwkvKiBSZW1lbWJlciBwc2V1ZG8gbnNtIHN0YXRlICovCisJcHN0YXRlID0gaG9zdC0+aF9zdGF0ZTsKKworCS8qIEdvIHRvIHNsZWVwIHdhaXRpbmcgZm9yIEdSQU5UIGNhbGxiYWNrLiBTb21lIHNlcnZlcnMgc2VlbQorCSAqIHRvIGxvc2UgY2FsbGJhY2tzLCBob3dldmVyLCBzbyB3ZSdyZSBnb2luZyB0byBwb2xsIGZyb20KKwkgKiB0aW1lIHRvIHRpbWUganVzdCB0byBtYWtlIHN1cmUuCisJICoKKwkgKiBGb3Igbm93LCB0aGUgcmV0cnkgZnJlcXVlbmN5IGlzIHByZXR0eSBoaWdoOyBub3JtYWxseSAKKwkgKiBhIDEgbWludXRlIHRpbWVvdXQgd291bGQgZG8uIFNlZSB0aGUgY29tbWVudCBiZWZvcmUKKwkgKiBubG1jbG50X2xvY2sgZm9yIGFuIGV4cGxhbmF0aW9uLgorCSAqLworCXNsZWVwX29uX3RpbWVvdXQoJmJsb2NrLmJfd2FpdCwgMzAqSFopOworCisJZm9yIChoZWFkID0gJm5sbV9ibG9ja2VkOyAqaGVhZDsgaGVhZCA9ICYoKmhlYWQpLT5iX25leHQpIHsKKwkJaWYgKCpoZWFkID09ICZibG9jaykgeworCQkJKmhlYWQgPSBibG9jay5iX25leHQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghc2lnbmFsbGVkKCkpIHsKKwkJKnN0YXRwID0gYmxvY2suYl9zdGF0dXM7CisJCXJldHVybiAwOworCX0KKworCS8qIE9rYXksIHdlIHdlcmUgaW50ZXJydXB0ZWQuIENhbmNlbCB0aGUgcGVuZGluZyByZXF1ZXN0CisJICogdW5sZXNzIHRoZSBzZXJ2ZXIgaGFzIHJlYm9vdGVkLgorCSAqLworCWlmIChwc3RhdGUgPT0gaG9zdC0+aF9zdGF0ZSAmJiAoZXJyID0gbmxtY2xudF9jYW5jZWwoaG9zdCwgZmwpKSA8IDApCisJCXByaW50ayhLRVJOX05PVElDRQorCQkJImxvY2tkOiBDQU5DRUwgY2FsbCBmYWlsZWQgKGVycm5vICVkKVxuIiwgLWVycik7CisKKwlyZXR1cm4gLUVSRVNUQVJUU1lTOworfQorCisvKgorICogVGhlIHNlcnZlciBsb2NrZCBoYXMgY2FsbGVkIHVzIGJhY2sgdG8gdGVsbCB1cyB0aGUgbG9jayB3YXMgZ3JhbnRlZAorICovCit1MzIKK25sbWNsbnRfZ3JhbnQoc3RydWN0IG5sbV9sb2NrICpsb2NrKQoreworCXN0cnVjdCBubG1fd2FpdAkqYmxvY2s7CisKKwkvKgorCSAqIExvb2sgdXAgYmxvY2tlZCByZXF1ZXN0IGJhc2VkIG9uIGFyZ3VtZW50cy4gCisJICogV2FybmluZzogbXVzdCBub3QgdXNlIGNvb2tpZSB0byBtYXRjaCBpdCEKKwkgKi8KKwlmb3IgKGJsb2NrID0gbmxtX2Jsb2NrZWQ7IGJsb2NrOyBibG9jayA9IGJsb2NrLT5iX25leHQpIHsKKwkJaWYgKG5sbV9jb21wYXJlX2xvY2tzKGJsb2NrLT5iX2xvY2ssICZsb2NrLT5mbCkpCisJCQlicmVhazsKKwl9CisKKwkvKiBPb29wcywgbm8gYmxvY2tlZCByZXF1ZXN0IGZvdW5kLiAqLworCWlmIChibG9jayA9PSBOVUxMKQorCQlyZXR1cm4gbmxtX2xja19kZW5pZWQ7CisKKwkvKiBBbHJpZ2h0LCB3ZSBmb3VuZCB0aGUgbG9jay4gU2V0IHRoZSByZXR1cm4gc3RhdHVzIGFuZAorCSAqIHdha2UgdXAgdGhlIGNhbGxlci4KKwkgKi8KKwlibG9jay0+Yl9zdGF0dXMgPSBOTE1fTENLX0dSQU5URUQ7CisJd2FrZV91cCgmYmxvY2stPmJfd2FpdCk7CisKKwlyZXR1cm4gbmxtX2dyYW50ZWQ7Cit9CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHByb2NlZHVyZXMgZGVhbCB3aXRoIHRoZSByZWNvdmVyeSBvZiBsb2NrcyBhZnRlciBhCisgKiBzZXJ2ZXIgY3Jhc2guCisgKi8KKworLyoKKyAqIE1hcmsgdGhlIGxvY2tzIGZvciByZWNsYWltaW5nLgorICogRklYTUU6IEluIDIuNSB3ZSBkb24ndCB3YW50IHRvIGl0ZXJhdGUgdGhyb3VnaCBhbnkgZ2xvYmFsIGZpbGVfbG9ja19saXN0LgorICogICAgICAgIE1haW50YWluIE5MTSBsb2NrIHJlY2xhaW1pbmcgbGlzdHMgaW4gdGhlIG5sbV9ob3N0IGluc3RlYWQuCisgKi8KK3N0YXRpYwordm9pZCBubG1jbG50X21hcmtfcmVjbGFpbShzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IGZpbGVfbG9jayAqZmw7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisKKwlsaXN0X2Zvcl9lYWNoKHRtcCwgJmZpbGVfbG9ja19saXN0KSB7CisJCWZsID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBmaWxlX2xvY2ssIGZsX2xpbmspOworCisJCWlub2RlID0gZmwtPmZsX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCQlpZiAoaW5vZGUtPmlfc2ItPnNfbWFnaWMgIT0gTkZTX1NVUEVSX01BR0lDKQorCQkJY29udGludWU7CisJCWlmIChmbC0+ZmxfdS5uZnNfZmwub3duZXItPmhvc3QgIT0gaG9zdCkKKwkJCWNvbnRpbnVlOworCQlpZiAoIShmbC0+ZmxfdS5uZnNfZmwuZmxhZ3MgJiBORlNfTENLX0dSQU5URUQpKQorCQkJY29udGludWU7CisJCWZsLT5mbF91Lm5mc19mbC5mbGFncyB8PSBORlNfTENLX1JFQ0xBSU07CisJfQorfQorCisvKgorICogU29tZW9uZSBoYXMgc2VudCB1cyBhbiBTTV9OT1RJRlkuIEVuc3VyZSB3ZSBiaW5kIHRvIHRoZSBuZXcgcG9ydCBudW1iZXIsCisgKiB0aGF0IHdlIG1hcmsgbG9ja3MgZm9yIHJlY2xhaW1pbmcsIGFuZCB0aGF0IHdlIGJ1bXAgdGhlIHBzZXVkbyBOU00gc3RhdGUuCisgKi8KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgbmxtY2xudF9wcmVwYXJlX3JlY2xhaW0oc3RydWN0IG5sbV9ob3N0ICpob3N0LCB1MzIgbmV3c3RhdGUpCit7CisJaG9zdC0+aF9tb25pdG9yZWQgPSAwOworCWhvc3QtPmhfbnNtc3RhdGUgPSBuZXdzdGF0ZTsKKwlob3N0LT5oX3N0YXRlKys7CisJaG9zdC0+aF9uZXh0cmViaW5kID0gMDsKKwlubG1fcmViaW5kX2hvc3QoaG9zdCk7CisJbmxtY2xudF9tYXJrX3JlY2xhaW0oaG9zdCk7CisJZHByaW50aygiTkxNOiByZWNsYWltaW5nIGxvY2tzIGZvciBob3N0ICVzIiwgaG9zdC0+aF9uYW1lKTsKK30KKworLyoKKyAqIFJlY2xhaW0gYWxsIGxvY2tzIG9uIHNlcnZlciBob3N0LiBXZSBkbyB0aGlzIGJ5IHNwYXduaW5nIGEgc2VwYXJhdGUKKyAqIHJlY2xhaW1lciB0aHJlYWQuCisgKi8KK3ZvaWQKK25sbWNsbnRfcmVjb3Zlcnkoc3RydWN0IG5sbV9ob3N0ICpob3N0LCB1MzIgbmV3c3RhdGUpCit7CisJaWYgKGhvc3QtPmhfcmVjbGFpbWluZysrKSB7CisJCWlmIChob3N0LT5oX25zbXN0YXRlID09IG5ld3N0YXRlKQorCQkJcmV0dXJuOworCQlubG1jbG50X3ByZXBhcmVfcmVjbGFpbShob3N0LCBuZXdzdGF0ZSk7CisJfSBlbHNlIHsKKwkJbmxtY2xudF9wcmVwYXJlX3JlY2xhaW0oaG9zdCwgbmV3c3RhdGUpOworCQlubG1fZ2V0X2hvc3QoaG9zdCk7CisJCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisJCWlmIChrZXJuZWxfdGhyZWFkKHJlY2xhaW1lciwgaG9zdCwgQ0xPTkVfS0VSTkVMKSA8IDApCisJCQltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK3JlY2xhaW1lcih2b2lkICpwdHIpCit7CisJc3RydWN0IG5sbV9ob3N0CSAgKmhvc3QgPSAoc3RydWN0IG5sbV9ob3N0ICopIHB0cjsKKwlzdHJ1Y3QgbmxtX3dhaXQJICAqYmxvY2s7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCXN0cnVjdCBmaWxlX2xvY2sgKmZsOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwlkYWVtb25pemUoIiVzLXJlY2xhaW0iLCBob3N0LT5oX25hbWUpOworCWFsbG93X3NpZ25hbChTSUdLSUxMKTsKKworCS8qIFRoaXMgb25lIGVuc3VyZXMgdGhhdCBvdXIgcGFyZW50IGRvZXNuJ3QgdGVybWluYXRlIHdoaWxlIHRoZQorCSAqIHJlY2xhaW0gaXMgaW4gcHJvZ3Jlc3MgKi8KKwlsb2NrX2tlcm5lbCgpOworCWxvY2tkX3VwKCk7CisKKwkvKiBGaXJzdCwgcmVjbGFpbSBhbGwgbG9ja3MgdGhhdCBoYXZlIGJlZW4gbWFya2VkLiAqLworcmVzdGFydDoKKwlsaXN0X2Zvcl9lYWNoKHRtcCwgJmZpbGVfbG9ja19saXN0KSB7CisJCWZsID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBmaWxlX2xvY2ssIGZsX2xpbmspOworCisJCWlub2RlID0gZmwtPmZsX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCQlpZiAoaW5vZGUtPmlfc2ItPnNfbWFnaWMgIT0gTkZTX1NVUEVSX01BR0lDKQorCQkJY29udGludWU7CisJCWlmIChmbC0+ZmxfdS5uZnNfZmwub3duZXItPmhvc3QgIT0gaG9zdCkKKwkJCWNvbnRpbnVlOworCQlpZiAoIShmbC0+ZmxfdS5uZnNfZmwuZmxhZ3MgJiBORlNfTENLX1JFQ0xBSU0pKQorCQkJY29udGludWU7CisKKwkJZmwtPmZsX3UubmZzX2ZsLmZsYWdzICY9IH5ORlNfTENLX1JFQ0xBSU07CisJCW5sbWNsbnRfcmVjbGFpbShob3N0LCBmbCk7CisJCWlmIChzaWduYWxsZWQoKSkKKwkJCWJyZWFrOworCQlnb3RvIHJlc3RhcnQ7CisJfQorCisJaG9zdC0+aF9yZWNsYWltaW5nID0gMDsKKworCS8qIE5vdywgd2FrZSB1cCBhbGwgcHJvY2Vzc2VzIHRoYXQgc2xlZXAgb24gYSBibG9ja2VkIGxvY2sgKi8KKwlmb3IgKGJsb2NrID0gbmxtX2Jsb2NrZWQ7IGJsb2NrOyBibG9jayA9IGJsb2NrLT5iX25leHQpIHsKKwkJaWYgKGJsb2NrLT5iX2hvc3QgPT0gaG9zdCkgeworCQkJYmxvY2stPmJfc3RhdHVzID0gTkxNX0xDS19ERU5JRURfR1JBQ0VfUEVSSU9EOworCQkJd2FrZV91cCgmYmxvY2stPmJfd2FpdCk7CisJCX0KKwl9CisKKwkvKiBSZWxlYXNlIGhvc3QgaGFuZGxlIGFmdGVyIHVzZSAqLworCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJbG9ja2RfZG93bigpOworCXVubG9ja19rZXJuZWwoKTsKKwltb2R1bGVfcHV0X2FuZF9leGl0KDApOworfQpkaWZmIC0tZ2l0IGEvZnMvbG9ja2QvY2xudHByb2MuYyBiL2ZzL2xvY2tkL2NsbnRwcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ0MDc2MQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2xvY2tkL2NsbnRwcm9jLmMKQEAgLTAsMCArMSw4MjAgQEAKKy8qCisgKiBsaW51eC9mcy9sb2NrZC9jbG50cHJvYy5jCisgKgorICogUlBDIHByb2NlZHVyZXMgZm9yIHRoZSBjbGllbnQgc2lkZSBOTE0gaW1wbGVtZW50YXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2NrZC9sb2NrZC5oPgorI2luY2x1ZGUgPGxpbnV4L2xvY2tkL3NtX2ludGVyLmg+CisKKyNkZWZpbmUgTkxNREJHX0ZBQ0lMSVRZCQlOTE1EQkdfQ0xJRU5UCisjZGVmaW5lIE5MTUNMTlRfR1JBQ0VfV0FJVAkoNSpIWikKKworc3RhdGljIGludAlubG1jbG50X3Rlc3Qoc3RydWN0IG5sbV9ycXN0ICosIHN0cnVjdCBmaWxlX2xvY2sgKik7CitzdGF0aWMgaW50CW5sbWNsbnRfbG9jayhzdHJ1Y3QgbmxtX3Jxc3QgKiwgc3RydWN0IGZpbGVfbG9jayAqKTsKK3N0YXRpYyBpbnQJbmxtY2xudF91bmxvY2soc3RydWN0IG5sbV9ycXN0ICosIHN0cnVjdCBmaWxlX2xvY2sgKik7CitzdGF0aWMgdm9pZAlubG1jbG50X3VubG9ja19jYWxsYmFjayhzdHJ1Y3QgcnBjX3Rhc2sgKik7CitzdGF0aWMgdm9pZAlubG1jbG50X2NhbmNlbF9jYWxsYmFjayhzdHJ1Y3QgcnBjX3Rhc2sgKik7CitzdGF0aWMgaW50CW5sbV9zdGF0X3RvX2Vycm5vKHUzMiBzdGF0KTsKK3N0YXRpYyB2b2lkCW5sbWNsbnRfbG9ja3NfaW5pdF9wcml2YXRlKHN0cnVjdCBmaWxlX2xvY2sgKmZsLCBzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QpOworCisvKgorICogQ29va2llIGNvdW50ZXIgZm9yIE5MTSByZXF1ZXN0cworICovCitzdGF0aWMgdTMyCW5sbV9jb29raWUgPSAweDEyMzQ7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBubG1jbG50X25leHRfY29va2llKHN0cnVjdCBubG1fY29va2llICpjKQoreworCW1lbWNweShjLT5kYXRhLCAmbmxtX2Nvb2tpZSwgNCk7CisJbWVtc2V0KGMtPmRhdGErNCwgMCwgNCk7CisJYy0+bGVuPTQ7CisJbmxtX2Nvb2tpZSsrOworfQorCitzdGF0aWMgc3RydWN0IG5sbV9sb2Nrb3duZXIgKm5sbV9nZXRfbG9ja293bmVyKHN0cnVjdCBubG1fbG9ja293bmVyICpsb2Nrb3duZXIpCit7CisJYXRvbWljX2luYygmbG9ja293bmVyLT5jb3VudCk7CisJcmV0dXJuIGxvY2tvd25lcjsKK30KKworc3RhdGljIHZvaWQgbmxtX3B1dF9sb2Nrb3duZXIoc3RydWN0IG5sbV9sb2Nrb3duZXIgKmxvY2tvd25lcikKK3sKKwlpZiAoIWF0b21pY19kZWNfYW5kX2xvY2soJmxvY2tvd25lci0+Y291bnQsICZsb2Nrb3duZXItPmhvc3QtPmhfbG9jaykpCisJCXJldHVybjsKKwlsaXN0X2RlbCgmbG9ja293bmVyLT5saXN0KTsKKwlzcGluX3VubG9jaygmbG9ja293bmVyLT5ob3N0LT5oX2xvY2spOworCW5sbV9yZWxlYXNlX2hvc3QobG9ja293bmVyLT5ob3N0KTsKKwlrZnJlZShsb2Nrb3duZXIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBubG1fcGlkYnVzeShzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QsIHVpbnQzMl90IHBpZCkKK3sKKwlzdHJ1Y3QgbmxtX2xvY2tvd25lciAqbG9ja293bmVyOworCWxpc3RfZm9yX2VhY2hfZW50cnkobG9ja293bmVyLCAmaG9zdC0+aF9sb2Nrb3duZXJzLCBsaXN0KSB7CisJCWlmIChsb2Nrb3duZXItPnBpZCA9PSBwaWQpCisJCQlyZXR1cm4gLUVCVVNZOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBfX25sbV9hbGxvY19waWQoc3RydWN0IG5sbV9ob3N0ICpob3N0KQoreworCXVpbnQzMl90IHJlczsKKwlkbyB7CisJCXJlcyA9IGhvc3QtPmhfcGlkY291bnQrKzsKKwl9IHdoaWxlIChubG1fcGlkYnVzeShob3N0LCByZXMpIDwgMCk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHN0cnVjdCBubG1fbG9ja293bmVyICpfX25sbV9maW5kX2xvY2tvd25lcihzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QsIGZsX293bmVyX3Qgb3duZXIpCit7CisJc3RydWN0IG5sbV9sb2Nrb3duZXIgKmxvY2tvd25lcjsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvY2tvd25lciwgJmhvc3QtPmhfbG9ja293bmVycywgbGlzdCkgeworCQlpZiAobG9ja293bmVyLT5vd25lciAhPSBvd25lcikKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gbmxtX2dldF9sb2Nrb3duZXIobG9ja293bmVyKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmxtX2xvY2tvd25lciAqbmxtX2ZpbmRfbG9ja293bmVyKHN0cnVjdCBubG1faG9zdCAqaG9zdCwgZmxfb3duZXJfdCBvd25lcikKK3sKKwlzdHJ1Y3QgbmxtX2xvY2tvd25lciAqcmVzLCAqbmV3ID0gTlVMTDsKKworCXNwaW5fbG9jaygmaG9zdC0+aF9sb2NrKTsKKwlyZXMgPSBfX25sbV9maW5kX2xvY2tvd25lcihob3N0LCBvd25lcik7CisJaWYgKHJlcyA9PSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrKCZob3N0LT5oX2xvY2spOworCQluZXcgPSAoc3RydWN0IG5sbV9sb2Nrb3duZXIgKilrbWFsbG9jKHNpemVvZigqbmV3KSwgR0ZQX0tFUk5FTCk7CisJCXNwaW5fbG9jaygmaG9zdC0+aF9sb2NrKTsKKwkJcmVzID0gX19ubG1fZmluZF9sb2Nrb3duZXIoaG9zdCwgb3duZXIpOworCQlpZiAocmVzID09IE5VTEwgJiYgbmV3ICE9IE5VTEwpIHsKKwkJCXJlcyA9IG5ldzsKKwkJCWF0b21pY19zZXQoJm5ldy0+Y291bnQsIDEpOworCQkJbmV3LT5vd25lciA9IG93bmVyOworCQkJbmV3LT5waWQgPSBfX25sbV9hbGxvY19waWQoaG9zdCk7CisJCQluZXctPmhvc3QgPSBubG1fZ2V0X2hvc3QoaG9zdCk7CisJCQlsaXN0X2FkZCgmbmV3LT5saXN0LCAmaG9zdC0+aF9sb2Nrb3duZXJzKTsKKwkJCW5ldyA9IE5VTEw7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmhvc3QtPmhfbG9jayk7CisJaWYgKG5ldyAhPSBOVUxMKQorCQlrZnJlZShuZXcpOworCXJldHVybiByZXM7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIGFyZ3VtZW50cyBmb3IgVEVTVC9MT0NLL1VOTE9DSy9DQU5DRUwgY2FsbHMKKyAqLworc3RhdGljIHZvaWQgbmxtY2xudF9zZXRsb2NrYXJncyhzdHJ1Y3QgbmxtX3Jxc3QgKnJlcSwgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJc3RydWN0IG5sbV9hcmdzCSphcmdwID0gJnJlcS0+YV9hcmdzOworCXN0cnVjdCBubG1fbG9jawkqbG9jayA9ICZhcmdwLT5sb2NrOworCisJbmxtY2xudF9uZXh0X2Nvb2tpZSgmYXJncC0+Y29va2llKTsKKwlhcmdwLT5zdGF0ZSAgID0gbnNtX2xvY2FsX3N0YXRlOworCW1lbWNweSgmbG9jay0+ZmgsIE5GU19GSChmbC0+ZmxfZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpLCBzaXplb2Yoc3RydWN0IG5mc19maCkpOworCWxvY2stPmNhbGxlciAgPSBzeXN0ZW1fdXRzbmFtZS5ub2RlbmFtZTsKKwlsb2NrLT5vaC5kYXRhID0gcmVxLT5hX293bmVyOworCWxvY2stPm9oLmxlbiAgPSBzcHJpbnRmKHJlcS0+YV9vd25lciwgIiVkQCVzIiwKKwkJCQljdXJyZW50LT5waWQsIHN5c3RlbV91dHNuYW1lLm5vZGVuYW1lKTsKKwlsb2Nrc19jb3B5X2xvY2soJmxvY2stPmZsLCBmbCk7Cit9CisKK3N0YXRpYyB2b2lkIG5sbWNsbnRfcmVsZWFzZV9sb2NrYXJncyhzdHJ1Y3QgbmxtX3Jxc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgZmlsZV9sb2NrICpmbCA9ICZyZXEtPmFfYXJncy5sb2NrLmZsOworCisJaWYgKGZsLT5mbF9vcHMgJiYgZmwtPmZsX29wcy0+ZmxfcmVsZWFzZV9wcml2YXRlKQorCQlmbC0+Zmxfb3BzLT5mbF9yZWxlYXNlX3ByaXZhdGUoZmwpOworfQorCisvKgorICogSW5pdGlhbGl6ZSBhcmd1bWVudHMgZm9yIEdSQU5URUQgY2FsbC4gVGhlIG5sbV9ycXN0IHN0cnVjdHVyZQorICogaGFzIGJlZW4gY2xlYXJlZCBhbHJlYWR5LgorICovCitpbnQKK25sbWNsbnRfc2V0Z3JhbnRhcmdzKHN0cnVjdCBubG1fcnFzdCAqY2FsbCwgc3RydWN0IG5sbV9sb2NrICpsb2NrKQoreworCWxvY2tzX2NvcHlfbG9jaygmY2FsbC0+YV9hcmdzLmxvY2suZmwsICZsb2NrLT5mbCk7CisJbWVtY3B5KCZjYWxsLT5hX2FyZ3MubG9jay5maCwgJmxvY2stPmZoLCBzaXplb2YoY2FsbC0+YV9hcmdzLmxvY2suZmgpKTsKKwljYWxsLT5hX2FyZ3MubG9jay5jYWxsZXIgPSBzeXN0ZW1fdXRzbmFtZS5ub2RlbmFtZTsKKwljYWxsLT5hX2FyZ3MubG9jay5vaC5sZW4gPSBsb2NrLT5vaC5sZW47CisKKwkvKiBzZXQgZGVmYXVsdCBkYXRhIGFyZWEgKi8KKwljYWxsLT5hX2FyZ3MubG9jay5vaC5kYXRhID0gY2FsbC0+YV9vd25lcjsKKworCWlmIChsb2NrLT5vaC5sZW4gPiBOTE1DTE5UX09IU0laRSkgeworCQl2b2lkICpkYXRhID0ga21hbGxvYyhsb2NrLT5vaC5sZW4sIEdGUF9LRVJORUwpOworCQlpZiAoIWRhdGEpIHsKKwkJCW5sbWNsbnRfZnJlZWdyYW50YXJncyhjYWxsKTsKKwkJCXJldHVybiAwOworCQl9CisJCWNhbGwtPmFfYXJncy5sb2NrLm9oLmRhdGEgPSAodTggKikgZGF0YTsKKwl9CisKKwltZW1jcHkoY2FsbC0+YV9hcmdzLmxvY2sub2guZGF0YSwgbG9jay0+b2guZGF0YSwgbG9jay0+b2gubGVuKTsKKwlyZXR1cm4gMTsKK30KKwordm9pZAorbmxtY2xudF9mcmVlZ3JhbnRhcmdzKHN0cnVjdCBubG1fcnFzdCAqY2FsbCkKK3sKKwlzdHJ1Y3QgZmlsZV9sb2NrICpmbCA9ICZjYWxsLT5hX2FyZ3MubG9jay5mbDsKKwkvKgorCSAqIENoZWNrIHdoZXRoZXIgd2UgYWxsb2NhdGVkIG1lbW9yeSBmb3IgdGhlIG93bmVyLgorCSAqLworCWlmIChjYWxsLT5hX2FyZ3MubG9jay5vaC5kYXRhICE9ICh1OCAqKSBjYWxsLT5hX293bmVyKSB7CisJCWtmcmVlKGNhbGwtPmFfYXJncy5sb2NrLm9oLmRhdGEpOworCX0KKwlpZiAoZmwtPmZsX29wcyAmJiBmbC0+Zmxfb3BzLT5mbF9yZWxlYXNlX3ByaXZhdGUpCisJCWZsLT5mbF9vcHMtPmZsX3JlbGVhc2VfcHJpdmF0ZShmbCk7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgTkxNIGNsaWVudC4KKyAqLworaW50CitubG1jbG50X3Byb2Moc3RydWN0IGlub2RlICppbm9kZSwgaW50IGNtZCwgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJc3RydWN0IG5mc19zZXJ2ZXIJKm5mc3NydiA9IE5GU19TRVJWRVIoaW5vZGUpOworCXN0cnVjdCBubG1faG9zdAkJKmhvc3Q7CisJc3RydWN0IG5sbV9ycXN0CQlyZXFzdCwgKmNhbGwgPSAmcmVxc3Q7CisJc2lnc2V0X3QJCW9sZHNldDsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKwlpbnQJCQlzdGF0dXMsIHByb3RvLCB2ZXJzOworCisJdmVycyA9IChORlNfUFJPVE8oaW5vZGUpLT52ZXJzaW9uID09IDMpID8gNCA6IDE7CisJaWYgKE5GU19QUk9UTyhpbm9kZSktPnZlcnNpb24gPiAzKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiTkZTdjQgZmlsZSBsb2NraW5nIG5vdCBpbXBsZW1lbnRlZCFcbiIpOworCQlyZXR1cm4gLUVOT0xDSzsKKwl9CisKKwkvKiBSZXRyaWV2ZSB0cmFuc3BvcnQgcHJvdG9jb2wgZnJvbSBORlMgY2xpZW50ICovCisJcHJvdG8gPSBORlNfQ0xJRU5UKGlub2RlKS0+Y2xfeHBydC0+cHJvdDsKKworCWlmICghKGhvc3QgPSBubG1jbG50X2xvb2t1cF9ob3N0KE5GU19BRERSKGlub2RlKSwgcHJvdG8sIHZlcnMpKSkKKwkJcmV0dXJuIC1FTk9MQ0s7CisKKwkvKiBDcmVhdGUgUlBDIGNsaWVudCBoYW5kbGUgaWYgbm90IHRoZXJlLCBhbmQgY29weSBzb2Z0CisJICogYW5kIGludHIgZmxhZ3MgZnJvbSBORlMgY2xpZW50LiAqLworCWlmIChob3N0LT5oX3JwY2NsbnQgPT0gTlVMTCkgeworCQlzdHJ1Y3QgcnBjX2NsbnQJKmNsbnQ7CisKKwkJLyogQmluZCBhbiBycGMgY2xpZW50IHRvIHRoaXMgaG9zdCBoYW5kbGUgKGRvZXMgbm90CisJCSAqIHBlcmZvcm0gYSBwb3J0bWFwcGVyIGxvb2t1cCkgKi8KKwkJaWYgKCEoY2xudCA9IG5sbV9iaW5kX2hvc3QoaG9zdCkpKSB7CisJCQlzdGF0dXMgPSAtRU5PTENLOworCQkJZ290byBkb25lOworCQl9CisJCWNsbnQtPmNsX3NvZnRydHJ5ID0gbmZzc3J2LT5jbGllbnQtPmNsX3NvZnRydHJ5OworCQljbG50LT5jbF9pbnRyICAgICA9IG5mc3Nydi0+Y2xpZW50LT5jbF9pbnRyOworCQljbG50LT5jbF9jaGF0dHkgICA9IG5mc3Nydi0+Y2xpZW50LT5jbF9jaGF0dHk7CisJfQorCisJLyogS2VlcCB0aGUgb2xkIHNpZ25hbCBtYXNrICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKKwlvbGRzZXQgPSBjdXJyZW50LT5ibG9ja2VkOworCisJLyogSWYgd2UncmUgY2xlYW5pbmcgdXAgbG9ja3MgYmVjYXVzZSB0aGUgcHJvY2VzcyBpcyBleGl0aW5nLAorCSAqIHBlcmZvcm0gdGhlIFJQQyBjYWxsIGFzeW5jaHJvbm91c2x5LiAqLworCWlmICgoSVNfU0VUTEsoY21kKSB8fCBJU19TRVRMS1coY21kKSkKKwkgICAgJiYgZmwtPmZsX3R5cGUgPT0gRl9VTkxDSworCSAgICAmJiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9FWElUSU5HKSkgeworCQlzaWdmaWxsc2V0KCZjdXJyZW50LT5ibG9ja2VkKTsJLyogTWFzayBhbGwgc2lnbmFscyAqLworCQlyZWNhbGNfc2lncGVuZGluZygpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CisKKwkJY2FsbCA9IG5sbWNsbnRfYWxsb2NfY2FsbCgpOworCQlpZiAoIWNhbGwpIHsKKwkJCXN0YXR1cyA9IC1FTk9NRU07CisJCQlnb3RvIG91dF9yZXN0b3JlOworCQl9CisJCWNhbGwtPmFfZmxhZ3MgPSBSUENfVEFTS19BU1lOQzsKKwl9IGVsc2UgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CisJCW1lbXNldChjYWxsLCAwLCBzaXplb2YoKmNhbGwpKTsKKwkJbG9ja3NfaW5pdF9sb2NrKCZjYWxsLT5hX2FyZ3MubG9jay5mbCk7CisJCWxvY2tzX2luaXRfbG9jaygmY2FsbC0+YV9yZXMubG9jay5mbCk7CisJfQorCWNhbGwtPmFfaG9zdCA9IGhvc3Q7CisKKwlubG1jbG50X2xvY2tzX2luaXRfcHJpdmF0ZShmbCwgaG9zdCk7CisKKwkvKiBTZXQgdXAgdGhlIGFyZ3VtZW50IHN0cnVjdCAqLworCW5sbWNsbnRfc2V0bG9ja2FyZ3MoY2FsbCwgZmwpOworCisJaWYgKElTX1NFVExLKGNtZCkgfHwgSVNfU0VUTEtXKGNtZCkpIHsKKwkJaWYgKGZsLT5mbF90eXBlICE9IEZfVU5MQ0spIHsKKwkJCWNhbGwtPmFfYXJncy5ibG9jayA9IElTX1NFVExLVyhjbWQpID8gMSA6IDA7CisJCQlzdGF0dXMgPSBubG1jbG50X2xvY2soY2FsbCwgZmwpOworCQl9IGVsc2UKKwkJCXN0YXR1cyA9IG5sbWNsbnRfdW5sb2NrKGNhbGwsIGZsKTsKKwl9IGVsc2UgaWYgKElTX0dFVExLKGNtZCkpCisJCXN0YXR1cyA9IG5sbWNsbnRfdGVzdChjYWxsLCBmbCk7CisJZWxzZQorCQlzdGF0dXMgPSAtRUlOVkFMOworCisgb3V0X3Jlc3RvcmU6CisJc3Bpbl9sb2NrX2lycXNhdmUoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKKwljdXJyZW50LT5ibG9ja2VkID0gb2xkc2V0OworCXJlY2FsY19zaWdwZW5kaW5nKCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworCitkb25lOgorCWRwcmludGsoImxvY2tkOiBjbG50IHByb2MgcmV0dXJucyAlZFxuIiwgc3RhdHVzKTsKKwlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCXJldHVybiBzdGF0dXM7Cit9CitFWFBPUlRfU1lNQk9MKG5sbWNsbnRfcHJvYyk7CisKKy8qCisgKiBBbGxvY2F0ZSBhbiBOTE0gUlBDIGNhbGwgc3RydWN0CisgKi8KK3N0cnVjdCBubG1fcnFzdCAqCitubG1jbG50X2FsbG9jX2NhbGwodm9pZCkKK3sKKwlzdHJ1Y3QgbmxtX3Jxc3QJKmNhbGw7CisKKwl3aGlsZSAoIXNpZ25hbGxlZCgpKSB7CisJCWNhbGwgPSAoc3RydWN0IG5sbV9ycXN0ICopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBubG1fcnFzdCksIEdGUF9LRVJORUwpOworCQlpZiAoY2FsbCkgeworCQkJbWVtc2V0KGNhbGwsIDAsIHNpemVvZigqY2FsbCkpOworCQkJbG9ja3NfaW5pdF9sb2NrKCZjYWxsLT5hX2FyZ3MubG9jay5mbCk7CisJCQlsb2Nrc19pbml0X2xvY2soJmNhbGwtPmFfcmVzLmxvY2suZmwpOworCQkJcmV0dXJuIGNhbGw7CisJCX0KKwkJcHJpbnRrKCJubG1jbG50X2FsbG9jX2NhbGw6IGZhaWxlZCwgd2FpdGluZyBmb3IgbWVtb3J5XG4iKTsKKwkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJCXNjaGVkdWxlX3RpbWVvdXQoNSpIWik7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IG5sbV93YWl0X29uX2dyYWNlKHdhaXRfcXVldWVfaGVhZF90ICpxdWV1ZSkKK3sKKwlERUZJTkVfV0FJVCh3YWl0KTsKKwlpbnQgc3RhdHVzID0gLUVJTlRSOworCisJcHJlcGFyZV90b193YWl0KHF1ZXVlLCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlpZiAoIXNpZ25hbGxlZCAoKSkgeworCQlzY2hlZHVsZV90aW1lb3V0KE5MTUNMTlRfR1JBQ0VfV0FJVCk7CisJCXRyeV90b19mcmVlemUoUEZfRlJFRVpFKTsKKwkJaWYgKCFzaWduYWxsZWQgKCkpCisJCQlzdGF0dXMgPSAwOworCX0KKwlmaW5pc2hfd2FpdChxdWV1ZSwgJndhaXQpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBHZW5lcmljIE5MTSBjYWxsCisgKi8KK3N0YXRpYyBpbnQKK25sbWNsbnRfY2FsbChzdHJ1Y3QgbmxtX3Jxc3QgKnJlcSwgdTMyIHByb2MpCit7CisJc3RydWN0IG5sbV9ob3N0CSpob3N0ID0gcmVxLT5hX2hvc3Q7CisJc3RydWN0IHJwY19jbG50CSpjbG50OworCXN0cnVjdCBubG1fYXJncwkqYXJncCA9ICZyZXEtPmFfYXJnczsKKwlzdHJ1Y3QgbmxtX3JlcwkqcmVzcCA9ICZyZXEtPmFfcmVzOworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfYXJncAk9IGFyZ3AsCisJCS5ycGNfcmVzcAk9IHJlc3AsCisJfTsKKwlpbnQJCXN0YXR1czsKKworCWRwcmludGsoImxvY2tkOiBjYWxsIHByb2NlZHVyZSAlZCBvbiAlc1xuIiwKKwkJCShpbnQpcHJvYywgaG9zdC0+aF9uYW1lKTsKKworCWRvIHsKKwkJaWYgKGhvc3QtPmhfcmVjbGFpbWluZyAmJiAhYXJncC0+cmVjbGFpbSkKKwkJCWdvdG8gaW5fZ3JhY2VfcGVyaW9kOworCisJCS8qIElmIHdlIGhhdmUgbm8gUlBDIGNsaWVudCB5ZXQsIGNyZWF0ZSBvbmUuICovCisJCWlmICgoY2xudCA9IG5sbV9iaW5kX2hvc3QoaG9zdCkpID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT0xDSzsKKwkJbXNnLnJwY19wcm9jID0gJmNsbnQtPmNsX3Byb2NpbmZvW3Byb2NdOworCisJCS8qIFBlcmZvcm0gdGhlIFJQQyBjYWxsLiBJZiBhbiBlcnJvciBvY2N1cnMsIHRyeSBhZ2FpbiAqLworCQlpZiAoKHN0YXR1cyA9IHJwY19jYWxsX3N5bmMoY2xudCwgJm1zZywgMCkpIDwgMCkgeworCQkJZHByaW50aygibG9ja2Q6IHJwY19jYWxsIHJldHVybmVkIGVycm9yICVkXG4iLCAtc3RhdHVzKTsKKwkJCXN3aXRjaCAoc3RhdHVzKSB7CisJCQljYXNlIC1FUFJPVE9OT1NVUFBPUlQ6CisJCQkJc3RhdHVzID0gLUVJTlZBTDsKKwkJCQlicmVhazsKKwkJCWNhc2UgLUVDT05OUkVGVVNFRDoKKwkJCWNhc2UgLUVUSU1FRE9VVDoKKwkJCWNhc2UgLUVOT1RDT05OOgorCQkJCW5sbV9yZWJpbmRfaG9zdChob3N0KTsKKwkJCQlzdGF0dXMgPSAtRUFHQUlOOworCQkJCWJyZWFrOworCQkJY2FzZSAtRVJFU1RBUlRTWVM6CisJCQkJcmV0dXJuIHNpZ25hbGxlZCAoKSA/IC1FSU5UUiA6IHN0YXR1czsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJfSBlbHNlCisJCWlmIChyZXNwLT5zdGF0dXMgPT0gTkxNX0xDS19ERU5JRURfR1JBQ0VfUEVSSU9EKSB7CisJCQlkcHJpbnRrKCJsb2NrZDogc2VydmVyIGluIGdyYWNlIHBlcmlvZFxuIik7CisJCQlpZiAoYXJncC0+cmVjbGFpbSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkgICAgICJsb2NrZDogc3B1cmlvdXMgZ3JhY2UgcGVyaW9kIHJlamVjdD8hXG4iKTsKKwkJCQlyZXR1cm4gLUVOT0xDSzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICghYXJncC0+cmVjbGFpbSkgeworCQkJCS8qIFdlIGFwcGVhciB0byBiZSBvdXQgb2YgdGhlIGdyYWNlIHBlcmlvZCAqLworCQkJCXdha2VfdXBfYWxsKCZob3N0LT5oX2dyYWNld2FpdCk7CisJCQl9CisJCQlkcHJpbnRrKCJsb2NrZDogc2VydmVyIHJldHVybnMgc3RhdHVzICVkXG4iLCByZXNwLT5zdGF0dXMpOworCQkJcmV0dXJuIDA7CS8qIE9rYXksIGNhbGwgY29tcGxldGUgKi8KKwkJfQorCitpbl9ncmFjZV9wZXJpb2Q6CisJCS8qCisJCSAqIFRoZSBzZXJ2ZXIgaGFzIHJlYm9vdGVkIGFuZCBhcHBlYXJzIHRvIGJlIGluIHRoZSBncmFjZQorCQkgKiBwZXJpb2QgZHVyaW5nIHdoaWNoIGxvY2tzIGFyZSBvbmx5IGFsbG93ZWQgdG8gYmUKKwkJICogcmVjbGFpbWVkLgorCQkgKiBXZSBjYW4gb25seSBiYWNrIG9mZiBhbmQgdHJ5IGFnYWluIGxhdGVyLgorCQkgKi8KKwkJc3RhdHVzID0gbmxtX3dhaXRfb25fZ3JhY2UoJmhvc3QtPmhfZ3JhY2V3YWl0KTsKKwl9IHdoaWxlIChzdGF0dXMgPT0gMCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogR2VuZXJpYyBOTE0gY2FsbCwgYXN5bmMgdmVyc2lvbi4KKyAqLworaW50CitubG1zdmNfYXN5bmNfY2FsbChzdHJ1Y3QgbmxtX3Jxc3QgKnJlcSwgdTMyIHByb2MsIHJwY19hY3Rpb24gY2FsbGJhY2spCit7CisJc3RydWN0IG5sbV9ob3N0CSpob3N0ID0gcmVxLT5hX2hvc3Q7CisJc3RydWN0IHJwY19jbG50CSpjbG50OworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfYXJncAk9ICZyZXEtPmFfYXJncywKKwkJLnJwY19yZXNwCT0gJnJlcS0+YV9yZXMsCisJfTsKKwlpbnQJCXN0YXR1czsKKworCWRwcmludGsoImxvY2tkOiBjYWxsIHByb2NlZHVyZSAlZCBvbiAlcyAoYXN5bmMpXG4iLAorCQkJKGludClwcm9jLCBob3N0LT5oX25hbWUpOworCisJLyogSWYgd2UgaGF2ZSBubyBSUEMgY2xpZW50IHlldCwgY3JlYXRlIG9uZS4gKi8KKwlpZiAoKGNsbnQgPSBubG1fYmluZF9ob3N0KGhvc3QpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0xDSzsKKwltc2cucnBjX3Byb2MgPSAmY2xudC0+Y2xfcHJvY2luZm9bcHJvY107CisKKyAgICAgICAgLyogYm9vdHN0cmFwIGFuZCBraWNrIG9mZiB0aGUgYXN5bmMgUlBDIGNhbGwgKi8KKyAgICAgICAgc3RhdHVzID0gcnBjX2NhbGxfYXN5bmMoY2xudCwgJm1zZywgUlBDX1RBU0tfQVNZTkMsIGNhbGxiYWNrLCByZXEpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludAorbmxtY2xudF9hc3luY19jYWxsKHN0cnVjdCBubG1fcnFzdCAqcmVxLCB1MzIgcHJvYywgcnBjX2FjdGlvbiBjYWxsYmFjaykKK3sKKwlzdHJ1Y3QgbmxtX2hvc3QJKmhvc3QgPSByZXEtPmFfaG9zdDsKKwlzdHJ1Y3QgcnBjX2NsbnQJKmNsbnQ7CisJc3RydWN0IG5sbV9hcmdzCSphcmdwID0gJnJlcS0+YV9hcmdzOworCXN0cnVjdCBubG1fcmVzCSpyZXNwID0gJnJlcS0+YV9yZXM7CisJc3RydWN0IHJwY19tZXNzYWdlIG1zZyA9IHsKKwkJLnJwY19hcmdwCT0gYXJncCwKKwkJLnJwY19yZXNwCT0gcmVzcCwKKwl9OworCWludAkJc3RhdHVzOworCisJZHByaW50aygibG9ja2Q6IGNhbGwgcHJvY2VkdXJlICVkIG9uICVzIChhc3luYylcbiIsCisJCQkoaW50KXByb2MsIGhvc3QtPmhfbmFtZSk7CisKKwkvKiBJZiB3ZSBoYXZlIG5vIFJQQyBjbGllbnQgeWV0LCBjcmVhdGUgb25lLiAqLworCWlmICgoY2xudCA9IG5sbV9iaW5kX2hvc3QoaG9zdCkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTENLOworCW1zZy5ycGNfcHJvYyA9ICZjbG50LT5jbF9wcm9jaW5mb1twcm9jXTsKKworCS8qIEluY3JlbWVudCBob3N0IHJlZmNvdW50ICovCisJbmxtX2dldF9ob3N0KGhvc3QpOworICAgICAgICAvKiBib290c3RyYXAgYW5kIGtpY2sgb2ZmIHRoZSBhc3luYyBSUEMgY2FsbCAqLworICAgICAgICBzdGF0dXMgPSBycGNfY2FsbF9hc3luYyhjbG50LCAmbXNnLCBSUENfVEFTS19BU1lOQywgY2FsbGJhY2ssIHJlcSk7CisJaWYgKHN0YXR1cyA8IDApCisJCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIFRFU1QgZm9yIHRoZSBwcmVzZW5jZSBvZiBhIGNvbmZsaWN0aW5nIGxvY2sKKyAqLworc3RhdGljIGludAorbmxtY2xudF90ZXN0KHN0cnVjdCBubG1fcnFzdCAqcmVxLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwlpbnQJc3RhdHVzOworCisJc3RhdHVzID0gbmxtY2xudF9jYWxsKHJlcSwgTkxNUFJPQ19URVNUKTsKKwlubG1jbG50X3JlbGVhc2VfbG9ja2FyZ3MocmVxKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcmV0dXJuIHN0YXR1czsKKworCXN0YXR1cyA9IHJlcS0+YV9yZXMuc3RhdHVzOworCWlmIChzdGF0dXMgPT0gTkxNX0xDS19HUkFOVEVEKSB7CisJCWZsLT5mbF90eXBlID0gRl9VTkxDSzsKKwl9IGlmIChzdGF0dXMgPT0gTkxNX0xDS19ERU5JRUQpIHsKKwkJLyoKKwkJICogUmVwb3J0IHRoZSBjb25mbGljdGluZyBsb2NrIGJhY2sgdG8gdGhlIGFwcGxpY2F0aW9uLgorCQkgKi8KKwkJbG9ja3NfY29weV9sb2NrKGZsLCAmcmVxLT5hX3Jlcy5sb2NrLmZsKTsKKwkJZmwtPmZsX3BpZCA9IDA7CisJfSBlbHNlIHsKKwkJcmV0dXJuIG5sbV9zdGF0X3RvX2Vycm5vKHJlcS0+YV9yZXMuc3RhdHVzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbmxtY2xudF9sb2Nrc19jb3B5X2xvY2soc3RydWN0IGZpbGVfbG9jayAqbmV3LCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwltZW1jcHkoJm5ldy0+ZmxfdS5uZnNfZmwsICZmbC0+ZmxfdS5uZnNfZmwsIHNpemVvZihuZXctPmZsX3UubmZzX2ZsKSk7CisJbmxtX2dldF9sb2Nrb3duZXIobmV3LT5mbF91Lm5mc19mbC5vd25lcik7Cit9CisKK3N0YXRpYyB2b2lkIG5sbWNsbnRfbG9ja3NfcmVsZWFzZV9wcml2YXRlKHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCW5sbV9wdXRfbG9ja293bmVyKGZsLT5mbF91Lm5mc19mbC5vd25lcik7CisJZmwtPmZsX29wcyA9IE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9sb2NrX29wZXJhdGlvbnMgbmxtY2xudF9sb2NrX29wcyA9IHsKKwkuZmxfY29weV9sb2NrID0gbmxtY2xudF9sb2Nrc19jb3B5X2xvY2ssCisJLmZsX3JlbGVhc2VfcHJpdmF0ZSA9IG5sbWNsbnRfbG9ja3NfcmVsZWFzZV9wcml2YXRlLAorfTsKKworc3RhdGljIHZvaWQgbmxtY2xudF9sb2Nrc19pbml0X3ByaXZhdGUoc3RydWN0IGZpbGVfbG9jayAqZmwsIHN0cnVjdCBubG1faG9zdCAqaG9zdCkKK3sKKwlCVUdfT04oZmwtPmZsX29wcyAhPSBOVUxMKTsKKwlmbC0+ZmxfdS5uZnNfZmwuc3RhdGUgPSAwOworCWZsLT5mbF91Lm5mc19mbC5mbGFncyA9IDA7CisJZmwtPmZsX3UubmZzX2ZsLm93bmVyID0gbmxtX2ZpbmRfbG9ja293bmVyKGhvc3QsIGZsLT5mbF9vd25lcik7CisJZmwtPmZsX29wcyA9ICZubG1jbG50X2xvY2tfb3BzOworfQorCitzdGF0aWMgdm9pZCBkb192ZnNfbG9jayhzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwlpbnQgcmVzID0gMDsKKwlzd2l0Y2ggKGZsLT5mbF9mbGFncyAmIChGTF9QT1NJWHxGTF9GTE9DSykpIHsKKwkJY2FzZSBGTF9QT1NJWDoKKwkJCXJlcyA9IHBvc2l4X2xvY2tfZmlsZV93YWl0KGZsLT5mbF9maWxlLCBmbCk7CisJCQlicmVhazsKKwkJY2FzZSBGTF9GTE9DSzoKKwkJCXJlcyA9IGZsb2NrX2xvY2tfZmlsZV93YWl0KGZsLT5mbF9maWxlLCBmbCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUJVRygpOworCX0KKwlpZiAocmVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IFZGUyBpcyBvdXQgb2Ygc3luYyB3aXRoIGxvY2sgbWFuYWdlciFcbiIsCisJCQkJX19GVU5DVElPTl9fKTsKK30KKworLyoKKyAqIExPQ0s6IFRyeSB0byBjcmVhdGUgYSBsb2NrCisgKgorICoJCQlQcm9ncmFtbWVyIEhhcmFzc21lbnQgQWxlcnQKKyAqCisgKiBXaGVuIGdpdmVuIGEgYmxvY2tpbmcgbG9jayByZXF1ZXN0IGluIGEgc3luYyBSUEMgY2FsbCwgdGhlIEhQVVggbG9ja2QKKyAqIHdpbGwgZmFpdGhmdWxseSByZXR1cm4gTENLX0JMT0NLRUQgYnV0IG5ldmVyIGNhcmVzIHRvIG5vdGlmeSB1cyB3aGVuCisgKiB0aGUgbG9jayBjb3VsZCBiZSBncmFudGVkLiBUaGlzIHdheSwgb3VyIGxvY2FsIHByb2Nlc3MgY291bGQgaGFuZworICogYXJvdW5kIGZvcmV2ZXIgd2FpdGluZyBmb3IgdGhlIGNhbGxiYWNrLgorICoKKyAqICBTb2x1dGlvbiBBOglJbXBsZW1lbnQgYnVzeS13YWl0aW5nCisgKiAgU29sdXRpb24gQjogVXNlIHRoZSBhc3luYyB2ZXJzaW9uIG9mIHRoZSBjYWxsIChOTE1fTE9DS197TVNHLFJFU30pCisgKgorICogRm9yIG5vdyBJIGFtIGltcGxlbWVudGluZyBzb2x1dGlvbiBBLCBiZWNhdXNlIEkgaGF0ZSB0aGUgaWRlYSBvZgorICogcmUtaW1wbGVtZW50aW5nIGxvY2tkIGZvciBhIHRoaXJkIHRpbWUgaW4gdHdvIG1vbnRocy4gVGhlIGFzeW5jCisgKiBjYWxscyBzaG91bGRuJ3QgYmUgdG9vIGhhcmQgdG8gZG8sIGhvd2V2ZXIuCisgKgorICogVGhpcyBpcyBvbmUgb2YgdGhlIGxvdmVseSB0aGluZ3MgYWJvdXQgc3RhbmRhcmRzIGluIHRoZSBORlMgYXJlYToKKyAqIHRoZXkncmUgc28gc29mdCBhbmQgc3F1aXNoeSB5b3UgY2FuJ3QgcmVhbGx5IGJsYW1lIEhQIGZvciBkb2luZyB0aGlzLgorICovCitzdGF0aWMgaW50CitubG1jbG50X2xvY2soc3RydWN0IG5sbV9ycXN0ICpyZXEsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCXN0cnVjdCBubG1faG9zdAkqaG9zdCA9IHJlcS0+YV9ob3N0OworCXN0cnVjdCBubG1fcmVzCSpyZXNwID0gJnJlcS0+YV9yZXM7CisJaW50CQlzdGF0dXM7CisKKwlpZiAoIWhvc3QtPmhfbW9uaXRvcmVkICYmIG5zbV9tb25pdG9yKGhvc3QpIDwgMCkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgImxvY2tkOiBmYWlsZWQgdG8gbW9uaXRvciAlc1xuIiwKKwkJCQkJaG9zdC0+aF9uYW1lKTsKKwkJc3RhdHVzID0gLUVOT0xDSzsKKwkJZ290byBvdXQ7CisJfQorCisJZG8geworCQlpZiAoKHN0YXR1cyA9IG5sbWNsbnRfY2FsbChyZXEsIE5MTVBST0NfTE9DSykpID49IDApIHsKKwkJCWlmIChyZXNwLT5zdGF0dXMgIT0gTkxNX0xDS19CTE9DS0VEKQorCQkJCWJyZWFrOworCQkJc3RhdHVzID0gbmxtY2xudF9ibG9jayhob3N0LCBmbCwgJnJlc3AtPnN0YXR1cyk7CisJCX0KKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIG91dDsKKwl9IHdoaWxlIChyZXNwLT5zdGF0dXMgPT0gTkxNX0xDS19CTE9DS0VEICYmIHJlcS0+YV9hcmdzLmJsb2NrKTsKKworCWlmIChyZXNwLT5zdGF0dXMgPT0gTkxNX0xDS19HUkFOVEVEKSB7CisJCWZsLT5mbF91Lm5mc19mbC5zdGF0ZSA9IGhvc3QtPmhfc3RhdGU7CisJCWZsLT5mbF91Lm5mc19mbC5mbGFncyB8PSBORlNfTENLX0dSQU5URUQ7CisJCWZsLT5mbF9mbGFncyB8PSBGTF9TTEVFUDsKKwkJZG9fdmZzX2xvY2soZmwpOworCX0KKwlzdGF0dXMgPSBubG1fc3RhdF90b19lcnJubyhyZXNwLT5zdGF0dXMpOworb3V0OgorCW5sbWNsbnRfcmVsZWFzZV9sb2NrYXJncyhyZXEpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBSRUNMQUlNOiBUcnkgdG8gcmVjbGFpbSBhIGxvY2sKKyAqLworaW50CitubG1jbG50X3JlY2xhaW0oc3RydWN0IG5sbV9ob3N0ICpob3N0LCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwlzdHJ1Y3QgbmxtX3Jxc3QgcmVxc3QsICpyZXE7CisJaW50CQlzdGF0dXM7CisKKwlyZXEgPSAmcmVxc3Q7CisJbWVtc2V0KHJlcSwgMCwgc2l6ZW9mKCpyZXEpKTsKKwlsb2Nrc19pbml0X2xvY2soJnJlcS0+YV9hcmdzLmxvY2suZmwpOworCWxvY2tzX2luaXRfbG9jaygmcmVxLT5hX3Jlcy5sb2NrLmZsKTsKKwlyZXEtPmFfaG9zdCAgPSBob3N0OworCXJlcS0+YV9mbGFncyA9IDA7CisKKwkvKiBTZXQgdXAgdGhlIGFyZ3VtZW50IHN0cnVjdCAqLworCW5sbWNsbnRfc2V0bG9ja2FyZ3MocmVxLCBmbCk7CisJcmVxLT5hX2FyZ3MucmVjbGFpbSA9IDE7CisKKwlpZiAoKHN0YXR1cyA9IG5sbWNsbnRfY2FsbChyZXEsIE5MTVBST0NfTE9DSykpID49IDAKKwkgJiYgcmVxLT5hX3Jlcy5zdGF0dXMgPT0gTkxNX0xDS19HUkFOVEVEKQorCQlyZXR1cm4gMDsKKworCXByaW50ayhLRVJOX1dBUk5JTkcgImxvY2tkOiBmYWlsZWQgdG8gcmVjbGFpbSBsb2NrIGZvciBwaWQgJWQgIgorCQkJCSIoZXJybm8gJWQsIHN0YXR1cyAlZClcbiIsIGZsLT5mbF9waWQsCisJCQkJc3RhdHVzLCByZXEtPmFfcmVzLnN0YXR1cyk7CisKKwkvKgorCSAqIEZJWE1FOiBUaGlzIGlzIGEgc2VyaW91cyBmYWlsdXJlLiBXZSBjYW4KKwkgKgorCSAqICBhLglJZ25vcmUgdGhlIHByb2JsZW0KKwkgKiAgYi4JU2VuZCB0aGUgb3duaW5nIHByb2Nlc3Mgc29tZSBzaWduYWwgKExpbnV4IGRvZXNuJ3QgaGF2ZQorCSAqCVNJR0xPU1QsIHRob3VnaC4uLikKKwkgKiAgYy4JUmV0cnkgdGhlIG9wZXJhdGlvbgorCSAqCisJICogVW50aWwgc29tZW9uZSBjb21lcyB1cCB3aXRoIGEgc2ltcGxlIGltcGxlbWVudGF0aW9uCisJICogZm9yIGIgb3IgYywgSSdsbCBjaG9vc2Ugb3B0aW9uIGEuCisJICovCisKKwlyZXR1cm4gLUVOT0xDSzsKK30KKworLyoKKyAqIFVOTE9DSzogcmVtb3ZlIGFuIGV4aXN0aW5nIGxvY2sKKyAqLworc3RhdGljIGludAorbmxtY2xudF91bmxvY2soc3RydWN0IG5sbV9ycXN0ICpyZXEsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCXN0cnVjdCBubG1fcmVzCSpyZXNwID0gJnJlcS0+YV9yZXM7CisJaW50CQlzdGF0dXM7CisKKwkvKiBDbGVhbiB0aGUgR1JBTlRFRCBmbGFnIG5vdyBzbyB0aGUgbG9jayBkb2Vzbid0IGdldAorCSAqIHJlY2xhaW1lZCB3aGlsZSB3ZSdyZSBzdHVjayBpbiB0aGUgdW5sb2NrIGNhbGwuICovCisJZmwtPmZsX3UubmZzX2ZsLmZsYWdzICY9IH5ORlNfTENLX0dSQU5URUQ7CisKKwlpZiAocmVxLT5hX2ZsYWdzICYgUlBDX1RBU0tfQVNZTkMpIHsKKwkJc3RhdHVzID0gbmxtY2xudF9hc3luY19jYWxsKHJlcSwgTkxNUFJPQ19VTkxPQ0ssCisJCQkJCW5sbWNsbnRfdW5sb2NrX2NhbGxiYWNrKTsKKwkJLyogSHJtZi4uLiBEbyB0aGUgdW5sb2NrIGVhcmx5IHNpbmNlIGxvY2tzX3JlbW92ZV9wb3NpeCgpCisJCSAqIHJlYWxseSBleHBlY3RzIHVzIHRvIGZyZWUgdGhlIGxvY2sgc3luY2hyb25vdXNseSAqLworCQlkb192ZnNfbG9jayhmbCk7CisJCWlmIChzdGF0dXMgPCAwKSB7CisJCQlubG1jbG50X3JlbGVhc2VfbG9ja2FyZ3MocmVxKTsKKwkJCWtmcmVlKHJlcSk7CisJCX0KKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwlzdGF0dXMgPSBubG1jbG50X2NhbGwocmVxLCBOTE1QUk9DX1VOTE9DSyk7CisJbmxtY2xudF9yZWxlYXNlX2xvY2thcmdzKHJlcSk7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisKKwlkb192ZnNfbG9jayhmbCk7CisJaWYgKHJlc3AtPnN0YXR1cyA9PSBOTE1fTENLX0dSQU5URUQpCisJCXJldHVybiAwOworCisJaWYgKHJlc3AtPnN0YXR1cyAhPSBOTE1fTENLX0RFTklFRF9OT0xPQ0tTKQorCQlwcmludGsoImxvY2tkOiB1bmV4cGVjdGVkIHVubG9jayBzdGF0dXM6ICVkXG4iLCByZXNwLT5zdGF0dXMpOworCisJLyogV2hhdCB0byBkbyBub3c/IEknbSBvdXQgb2YgbXkgZGVwdGguLi4gKi8KKworCXJldHVybiAtRU5PTENLOworfQorCitzdGF0aWMgdm9pZAorbmxtY2xudF91bmxvY2tfY2FsbGJhY2soc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCXN0cnVjdCBubG1fcnFzdAkqcmVxID0gKHN0cnVjdCBubG1fcnFzdCAqKSB0YXNrLT50a19jYWxsZGF0YTsKKwlpbnQJCXN0YXR1cyA9IHJlcS0+YV9yZXMuc3RhdHVzOworCisJaWYgKFJQQ19BU1NBU1NJTkFURUQodGFzaykpCisJCWdvdG8gZGllOworCisJaWYgKHRhc2stPnRrX3N0YXR1cyA8IDApIHsKKwkJZHByaW50aygibG9ja2Q6IHVubG9jayBmYWlsZWQgKGVyciA9ICVkKVxuIiwgLXRhc2stPnRrX3N0YXR1cyk7CisJCWdvdG8gcmV0cnlfcmViaW5kOworCX0KKwlpZiAoc3RhdHVzID09IE5MTV9MQ0tfREVOSUVEX0dSQUNFX1BFUklPRCkgeworCQlycGNfZGVsYXkodGFzaywgTkxNQ0xOVF9HUkFDRV9XQUlUKTsKKwkJZ290byByZXRyeV91bmxvY2s7CisJfQorCWlmIChzdGF0dXMgIT0gTkxNX0xDS19HUkFOVEVEKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJsb2NrZDogdW5leHBlY3RlZCB1bmxvY2sgc3RhdHVzOiAlZFxuIiwgc3RhdHVzKTsKK2RpZToKKwlubG1fcmVsZWFzZV9ob3N0KHJlcS0+YV9ob3N0KTsKKwlubG1jbG50X3JlbGVhc2VfbG9ja2FyZ3MocmVxKTsKKwlrZnJlZShyZXEpOworCXJldHVybjsKKyByZXRyeV9yZWJpbmQ6CisJbmxtX3JlYmluZF9ob3N0KHJlcS0+YV9ob3N0KTsKKyByZXRyeV91bmxvY2s6CisJcnBjX3Jlc3RhcnRfY2FsbCh0YXNrKTsKK30KKworLyoKKyAqIENhbmNlbCBhIGJsb2NrZWQgbG9jayByZXF1ZXN0LgorICogV2UgYWx3YXlzIHVzZSBhbiBhc3luYyBSUEMgY2FsbCBmb3IgdGhpcyBpbiBvcmRlciBub3QgdG8gaGFuZyBhCisgKiBwcm9jZXNzIHRoYXQgaGFzIGJlZW4gQ3RybC1DJ2VkLgorICovCitpbnQKK25sbWNsbnRfY2FuY2VsKHN0cnVjdCBubG1faG9zdCAqaG9zdCwgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJc3RydWN0IG5sbV9ycXN0CSpyZXE7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlzaWdzZXRfdAlvbGRzZXQ7CisJaW50CQlzdGF0dXM7CisKKwkvKiBCbG9jayBhbGwgc2lnbmFscyB3aGlsZSBzZXR0aW5nIHVwIGNhbGwgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworCW9sZHNldCA9IGN1cnJlbnQtPmJsb2NrZWQ7CisJc2lnZmlsbHNldCgmY3VycmVudC0+YmxvY2tlZCk7CisJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CisKKwlyZXEgPSBubG1jbG50X2FsbG9jX2NhbGwoKTsKKwlpZiAoIXJlcSkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmVxLT5hX2hvc3QgID0gaG9zdDsKKwlyZXEtPmFfZmxhZ3MgPSBSUENfVEFTS19BU1lOQzsKKworCW5sbWNsbnRfc2V0bG9ja2FyZ3MocmVxLCBmbCk7CisKKwlzdGF0dXMgPSBubG1jbG50X2FzeW5jX2NhbGwocmVxLCBOTE1QUk9DX0NBTkNFTCwKKwkJCQkJbmxtY2xudF9jYW5jZWxfY2FsbGJhY2spOworCWlmIChzdGF0dXMgPCAwKSB7CisJCW5sbWNsbnRfcmVsZWFzZV9sb2NrYXJncyhyZXEpOworCQlrZnJlZShyZXEpOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CisJY3VycmVudC0+YmxvY2tlZCA9IG9sZHNldDsKKwlyZWNhbGNfc2lncGVuZGluZygpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkCitubG1jbG50X2NhbmNlbF9jYWxsYmFjayhzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IG5sbV9ycXN0CSpyZXEgPSAoc3RydWN0IG5sbV9ycXN0ICopIHRhc2stPnRrX2NhbGxkYXRhOworCisJaWYgKFJQQ19BU1NBU1NJTkFURUQodGFzaykpCisJCWdvdG8gZGllOworCisJaWYgKHRhc2stPnRrX3N0YXR1cyA8IDApIHsKKwkJZHByaW50aygibG9ja2Q6IENBTkNFTCBjYWxsIGVycm9yICVkLCByZXRyeWluZy5cbiIsCisJCQkJCXRhc2stPnRrX3N0YXR1cyk7CisJCWdvdG8gcmV0cnlfY2FuY2VsOworCX0KKworCWRwcmludGsoImxvY2tkOiBjYW5jZWwgc3RhdHVzICVkICh0YXNrICVkKVxuIiwKKwkJCXJlcS0+YV9yZXMuc3RhdHVzLCB0YXNrLT50a19waWQpOworCisJc3dpdGNoIChyZXEtPmFfcmVzLnN0YXR1cykgeworCWNhc2UgTkxNX0xDS19HUkFOVEVEOgorCWNhc2UgTkxNX0xDS19ERU5JRURfR1JBQ0VfUEVSSU9EOgorCQkvKiBFdmVyeXRoaW5nJ3MgZ29vZCAqLworCQlicmVhazsKKwljYXNlIE5MTV9MQ0tfREVOSUVEX05PTE9DS1M6CisJCWRwcmludGsoImxvY2tkOiBDQU5DRUwgZmFpbGVkIChzZXJ2ZXIgaGFzIG5vIGxvY2tzKVxuIik7CisJCWdvdG8gcmV0cnlfY2FuY2VsOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX05PVElDRSAibG9ja2Q6IHdlaXJkIHJldHVybiAlZCBmb3IgQ0FOQ0VMIGNhbGxcbiIsCisJCQlyZXEtPmFfcmVzLnN0YXR1cyk7CisJfQorCitkaWU6CisJbmxtX3JlbGVhc2VfaG9zdChyZXEtPmFfaG9zdCk7CisJbmxtY2xudF9yZWxlYXNlX2xvY2thcmdzKHJlcSk7CisJa2ZyZWUocmVxKTsKKwlyZXR1cm47CisKK3JldHJ5X2NhbmNlbDoKKwlubG1fcmViaW5kX2hvc3QocmVxLT5hX2hvc3QpOworCXJwY19yZXN0YXJ0X2NhbGwodGFzayk7CisJcnBjX2RlbGF5KHRhc2ssIDMwICogSFopOworfQorCisvKgorICogQ29udmVydCBhbiBOTE0gc3RhdHVzIGNvZGUgdG8gYSBnZW5lcmljIGtlcm5lbCBlcnJubworICovCitzdGF0aWMgaW50CitubG1fc3RhdF90b19lcnJubyh1MzIgc3RhdHVzKQoreworCXN3aXRjaChzdGF0dXMpIHsKKwljYXNlIE5MTV9MQ0tfR1JBTlRFRDoKKwkJcmV0dXJuIDA7CisJY2FzZSBOTE1fTENLX0RFTklFRDoKKwkJcmV0dXJuIC1FQUdBSU47CisJY2FzZSBOTE1fTENLX0RFTklFRF9OT0xPQ0tTOgorCWNhc2UgTkxNX0xDS19ERU5JRURfR1JBQ0VfUEVSSU9EOgorCQlyZXR1cm4gLUVOT0xDSzsKKwljYXNlIE5MTV9MQ0tfQkxPQ0tFRDoKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJsb2NrZDogdW5leHBlY3RlZCBzdGF0dXMgTkxNX0JMT0NLRURcbiIpOworCQlyZXR1cm4gLUVOT0xDSzsKKyNpZmRlZiBDT05GSUdfTE9DS0RfVjQKKwljYXNlIE5MTV9ERUFETENLOgorCQlyZXR1cm4gLUVERUFETEs7CisJY2FzZSBOTE1fUk9GUzoKKwkJcmV0dXJuIC1FUk9GUzsKKwljYXNlIE5MTV9TVEFMRV9GSDoKKwkJcmV0dXJuIC1FU1RBTEU7CisJY2FzZSBOTE1fRkJJRzoKKwkJcmV0dXJuIC1FT1ZFUkZMT1c7CisJY2FzZSBOTE1fRkFJTEVEOgorCQlyZXR1cm4gLUVOT0xDSzsKKyNlbmRpZgorCX0KKwlwcmludGsoS0VSTl9OT1RJQ0UgImxvY2tkOiB1bmV4cGVjdGVkIHNlcnZlciBzdGF0dXMgJWRcbiIsIHN0YXR1cyk7CisJcmV0dXJuIC1FTk9MQ0s7Cit9CmRpZmYgLS1naXQgYS9mcy9sb2NrZC9ob3N0LmMgYi9mcy9sb2NrZC9ob3N0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI3MDdjNQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2xvY2tkL2hvc3QuYwpAQCAtMCwwICsxLDM0NiBAQAorLyoKKyAqIGxpbnV4L2ZzL2xvY2tkL2hvc3QuYworICoKKyAqIE1hbmFnZW1lbnQgZm9yIE5MTSBwZWVyIGhvc3RzLiBUaGUgbmxtX2hvc3Qgc3RydWN0IGlzIHNoYXJlZAorICogYmV0d2VlbiBjbGllbnQgYW5kIHNlcnZlciBpbXBsZW1lbnRhdGlvbi4gVGhlIG9ubHkgcmVhc29uIHRvCisgKiBkbyBzbyBpcyB0byByZWR1Y2UgY29kZSBibG9hdC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CisjaW5jbHVkZSA8bGludXgvbG9ja2QvbG9ja2QuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2NrZC9zbV9pbnRlci5oPgorCisKKyNkZWZpbmUgTkxNREJHX0ZBQ0lMSVRZCQlOTE1EQkdfSE9TVENBQ0hFCisjZGVmaW5lIE5MTV9IT1NUX01BWAkJNjQKKyNkZWZpbmUgTkxNX0hPU1RfTlJIQVNICQkzMgorI2RlZmluZSBOTE1fQUREUkhBU0goYWRkcikJKG50b2hsKGFkZHIpICYgKE5MTV9IT1NUX05SSEFTSC0xKSkKKyNkZWZpbmUgTkxNX0hPU1RfUkVCSU5ECQkoNjAgKiBIWikKKyNkZWZpbmUgTkxNX0hPU1RfRVhQSVJFCQkoKG5yaG9zdHMgPiBOTE1fSE9TVF9NQVgpPyAzMDAgKiBIWiA6IDEyMCAqIEhaKQorI2RlZmluZSBOTE1fSE9TVF9DT0xMRUNUCSgobnJob3N0cyA+IE5MTV9IT1NUX01BWCk/IDEyMCAqIEhaIDogIDYwICogSFopCisjZGVmaW5lIE5MTV9IT1NUX0FERFIoc3YpCSgmKHN2KS0+c19ubG1jbG50LT5jbF94cHJ0LT5hZGRyKQorCitzdGF0aWMgc3RydWN0IG5sbV9ob3N0ICoJbmxtX2hvc3RzW05MTV9IT1NUX05SSEFTSF07CitzdGF0aWMgdW5zaWduZWQgbG9uZwkJbmV4dF9nYzsKK3N0YXRpYyBpbnQJCQlucmhvc3RzOworc3RhdGljIERFQ0xBUkVfTVVURVgobmxtX2hvc3Rfc2VtYSk7CisKKworc3RhdGljIHZvaWQJCQlubG1fZ2NfaG9zdHModm9pZCk7CisKKy8qCisgKiBGaW5kIGFuIE5MTSBzZXJ2ZXIgaGFuZGxlIGluIHRoZSBjYWNoZS4gSWYgdGhlcmUgaXMgbm9uZSwgY3JlYXRlIGl0LgorICovCitzdHJ1Y3QgbmxtX2hvc3QgKgorbmxtY2xudF9sb29rdXBfaG9zdChzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbiwgaW50IHByb3RvLCBpbnQgdmVyc2lvbikKK3sKKwlyZXR1cm4gbmxtX2xvb2t1cF9ob3N0KDAsIHNpbiwgcHJvdG8sIHZlcnNpb24pOworfQorCisvKgorICogRmluZCBhbiBOTE0gY2xpZW50IGhhbmRsZSBpbiB0aGUgY2FjaGUuIElmIHRoZXJlIGlzIG5vbmUsIGNyZWF0ZSBpdC4KKyAqLworc3RydWN0IG5sbV9ob3N0ICoKK25sbXN2Y19sb29rdXBfaG9zdChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwKQoreworCXJldHVybiBubG1fbG9va3VwX2hvc3QoMSwgJnJxc3RwLT5ycV9hZGRyLAorCQkJICAgICAgIHJxc3RwLT5ycV9wcm90LCBycXN0cC0+cnFfdmVycyk7Cit9CisKKy8qCisgKiBDb21tb24gaG9zdCBsb29rdXAgcm91dGluZSBmb3Igc2VydmVyICYgY2xpZW50CisgKi8KK3N0cnVjdCBubG1faG9zdCAqCitubG1fbG9va3VwX2hvc3QoaW50IHNlcnZlciwgc3RydWN0IHNvY2thZGRyX2luICpzaW4sCisJCQkJCWludCBwcm90bywgaW50IHZlcnNpb24pCit7CisJc3RydWN0IG5sbV9ob3N0CSpob3N0LCAqKmhwOworCXUzMgkJYWRkcjsKKwlpbnQJCWhhc2g7CisKKwlkcHJpbnRrKCJsb2NrZDogbmxtX2xvb2t1cF9ob3N0KCUwOHgsIHA9JWQsIHY9JWQpXG4iLAorCQkJKHVuc2lnbmVkKShzaW4/IG50b2hsKHNpbi0+c2luX2FkZHIuc19hZGRyKSA6IDApLCBwcm90bywgdmVyc2lvbik7CisKKwloYXNoID0gTkxNX0FERFJIQVNIKHNpbi0+c2luX2FkZHIuc19hZGRyKTsKKworCS8qIExvY2sgaGFzaCB0YWJsZSAqLworCWRvd24oJm5sbV9ob3N0X3NlbWEpOworCisJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgbmV4dF9nYykpCisJCW5sbV9nY19ob3N0cygpOworCisJZm9yIChocCA9ICZubG1faG9zdHNbaGFzaF07IChob3N0ID0gKmhwKSAhPSAwOyBocCA9ICZob3N0LT5oX25leHQpIHsKKwkJaWYgKGhvc3QtPmhfcHJvdG8gIT0gcHJvdG8pCisJCQljb250aW51ZTsKKwkJaWYgKGhvc3QtPmhfdmVyc2lvbiAhPSB2ZXJzaW9uKQorCQkJY29udGludWU7CisJCWlmIChob3N0LT5oX3NlcnZlciAhPSBzZXJ2ZXIpCisJCQljb250aW51ZTsKKworCQlpZiAobmxtX2NtcF9hZGRyKCZob3N0LT5oX2FkZHIsIHNpbikpIHsKKwkJCWlmIChocCAhPSBubG1faG9zdHMgKyBoYXNoKSB7CisJCQkJKmhwID0gaG9zdC0+aF9uZXh0OworCQkJCWhvc3QtPmhfbmV4dCA9IG5sbV9ob3N0c1toYXNoXTsKKwkJCQlubG1faG9zdHNbaGFzaF0gPSBob3N0OworCQkJfQorCQkJbmxtX2dldF9ob3N0KGhvc3QpOworCQkJdXAoJm5sbV9ob3N0X3NlbWEpOworCQkJcmV0dXJuIGhvc3Q7CisJCX0KKwl9CisKKwkvKiBPb29wcywgbm8gaG9zdCBmb3VuZCwgY3JlYXRlIGl0ICovCisJZHByaW50aygibG9ja2Q6IGNyZWF0aW5nIGhvc3QgZW50cnlcbiIpOworCisJaWYgKCEoaG9zdCA9IChzdHJ1Y3QgbmxtX2hvc3QgKikga21hbGxvYyhzaXplb2YoKmhvc3QpLCBHRlBfS0VSTkVMKSkpCisJCWdvdG8gbm9ob3N0OworCW1lbXNldChob3N0LCAwLCBzaXplb2YoKmhvc3QpKTsKKworCWFkZHIgPSBzaW4tPnNpbl9hZGRyLnNfYWRkcjsKKwlzcHJpbnRmKGhvc3QtPmhfbmFtZSwgIiV1LiV1LiV1LiV1IiwgTklQUVVBRChhZGRyKSk7CisKKwlob3N0LT5oX2FkZHIgICAgICAgPSAqc2luOworCWhvc3QtPmhfYWRkci5zaW5fcG9ydCA9IDA7CS8qIG91Y2ghICovCisJaG9zdC0+aF92ZXJzaW9uICAgID0gdmVyc2lvbjsKKwlob3N0LT5oX3Byb3RvICAgICAgPSBwcm90bzsKKwlob3N0LT5oX3JwY2NsbnQgICAgPSBOVUxMOworCWluaXRfTVVURVgoJmhvc3QtPmhfc2VtYSk7CisJaG9zdC0+aF9uZXh0cmViaW5kID0gamlmZmllcyArIE5MTV9IT1NUX1JFQklORDsKKwlob3N0LT5oX2V4cGlyZXMgICAgPSBqaWZmaWVzICsgTkxNX0hPU1RfRVhQSVJFOworCWF0b21pY19zZXQoJmhvc3QtPmhfY291bnQsIDEpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmhvc3QtPmhfZ3JhY2V3YWl0KTsKKwlob3N0LT5oX3N0YXRlICAgICAgPSAwOwkJCS8qIHBzZXVkbyBOU00gc3RhdGUgKi8KKwlob3N0LT5oX25zbXN0YXRlICAgPSAwOwkJCS8qIHJlYWwgTlNNIHN0YXRlICovCisJaG9zdC0+aF9zZXJ2ZXIJICAgPSBzZXJ2ZXI7CisJaG9zdC0+aF9uZXh0ICAgICAgID0gbmxtX2hvc3RzW2hhc2hdOworCW5sbV9ob3N0c1toYXNoXSAgICA9IGhvc3Q7CisJSU5JVF9MSVNUX0hFQUQoJmhvc3QtPmhfbG9ja293bmVycyk7CisJc3Bpbl9sb2NrX2luaXQoJmhvc3QtPmhfbG9jayk7CisKKwlpZiAoKytucmhvc3RzID4gTkxNX0hPU1RfTUFYKQorCQluZXh0X2djID0gMDsKKworbm9ob3N0OgorCXVwKCZubG1faG9zdF9zZW1hKTsKKwlyZXR1cm4gaG9zdDsKK30KKworc3RydWN0IG5sbV9ob3N0ICoKK25sbV9maW5kX2NsaWVudCh2b2lkKQoreworCS8qIGZpbmQgYSBubG1faG9zdCBmb3IgYSBjbGllbnQgZm9yIHdoaWNoIGhfa2lsbGVkID09IDAuCisJICogYW5kIHJldHVybiBpdAorCSAqLworCWludCBoYXNoOworCWRvd24oJm5sbV9ob3N0X3NlbWEpOworCWZvciAoaGFzaCA9IDAgOyBoYXNoIDwgTkxNX0hPU1RfTlJIQVNIOyBoYXNoKyspIHsKKwkJc3RydWN0IG5sbV9ob3N0ICpob3N0LCAqKmhwOworCQlmb3IgKGhwID0gJm5sbV9ob3N0c1toYXNoXTsgKGhvc3QgPSAqaHApICE9IDA7IGhwID0gJmhvc3QtPmhfbmV4dCkgeworCQkJaWYgKGhvc3QtPmhfc2VydmVyICYmCisJCQkgICAgaG9zdC0+aF9raWxsZWQgPT0gMCkgeworCQkJCW5sbV9nZXRfaG9zdChob3N0KTsKKwkJCQl1cCgmbmxtX2hvc3Rfc2VtYSk7CisJCQkJcmV0dXJuIGhvc3Q7CisJCQl9CisJCX0KKwl9CisJdXAoJm5sbV9ob3N0X3NlbWEpOworCXJldHVybiBOVUxMOworfQorCisJCQkJCisvKgorICogQ3JlYXRlIHRoZSBOTE0gUlBDIGNsaWVudCBmb3IgYW4gTkxNIHBlZXIKKyAqLworc3RydWN0IHJwY19jbG50ICoKK25sbV9iaW5kX2hvc3Qoc3RydWN0IG5sbV9ob3N0ICpob3N0KQoreworCXN0cnVjdCBycGNfY2xudAkqY2xudDsKKwlzdHJ1Y3QgcnBjX3hwcnQJKnhwcnQ7CisKKwlkcHJpbnRrKCJsb2NrZDogbmxtX2JpbmRfaG9zdCglMDh4KVxuIiwKKwkJCSh1bnNpZ25lZCludG9obChob3N0LT5oX2FkZHIuc2luX2FkZHIuc19hZGRyKSk7CisKKwkvKiBMb2NrIGhvc3QgaGFuZGxlICovCisJZG93bigmaG9zdC0+aF9zZW1hKTsKKworCS8qIElmIHdlJ3ZlIGFscmVhZHkgY3JlYXRlZCBhbiBSUEMgY2xpZW50LCBjaGVjayB3aGV0aGVyCisJICogUlBDIHJlYmluZCBpcyByZXF1aXJlZAorCSAqIE5vdGU6IHdoeSBrZWVwIHJlYmluZGluZyBpZiB3ZSdyZSBvbiBhIHRjcCBjb25uZWN0aW9uPworCSAqLworCWlmICgoY2xudCA9IGhvc3QtPmhfcnBjY2xudCkgIT0gTlVMTCkgeworCQl4cHJ0ID0gY2xudC0+Y2xfeHBydDsKKwkJaWYgKCF4cHJ0LT5zdHJlYW0gJiYgdGltZV9hZnRlcl9lcShqaWZmaWVzLCBob3N0LT5oX25leHRyZWJpbmQpKSB7CisJCQljbG50LT5jbF9wb3J0ID0gMDsKKwkJCWhvc3QtPmhfbmV4dHJlYmluZCA9IGppZmZpZXMgKyBOTE1fSE9TVF9SRUJJTkQ7CisJCQlkcHJpbnRrKCJsb2NrZDogbmV4dCByZWJpbmQgaW4gJWxkIGppZmZpZXNcbiIsCisJCQkJCWhvc3QtPmhfbmV4dHJlYmluZCAtIGppZmZpZXMpOworCQl9CisJfSBlbHNlIHsKKwkJeHBydCA9IHhwcnRfY3JlYXRlX3Byb3RvKGhvc3QtPmhfcHJvdG8sICZob3N0LT5oX2FkZHIsIE5VTEwpOworCQlpZiAoSVNfRVJSKHhwcnQpKQorCQkJZ290byBmb3JnZXRpdDsKKworCQl4cHJ0X3NldF90aW1lb3V0KCZ4cHJ0LT50aW1lb3V0LCA1LCBubG1zdmNfdGltZW91dCk7CisKKwkJLyogRXhpc3RpbmcgTkxNIHNlcnZlcnMgYWNjZXB0IEFVVEhfVU5JWCBvbmx5ICovCisJCWNsbnQgPSBycGNfY3JlYXRlX2NsaWVudCh4cHJ0LCBob3N0LT5oX25hbWUsICZubG1fcHJvZ3JhbSwKKwkJCQkJaG9zdC0+aF92ZXJzaW9uLCBSUENfQVVUSF9VTklYKTsKKwkJaWYgKElTX0VSUihjbG50KSkgeworCQkJeHBydF9kZXN0cm95KHhwcnQpOworCQkJZ290byBmb3JnZXRpdDsKKwkJfQorCQljbG50LT5jbF9hdXRvYmluZCA9IDE7CS8qIHR1cm4gb24gcG1hcCBxdWVyaWVzICovCisJCXhwcnQtPm5vY29uZyA9IDE7CS8qIE5vIGNvbmdlc3Rpb24gY29udHJvbCBmb3IgTkxNICovCisJCXhwcnQtPnJlc3Zwb3J0ID0gMTsJLyogTkxNIHJlcXVpcmVzIGEgcmVzZXJ2ZWQgcG9ydCAqLworCisJCWhvc3QtPmhfcnBjY2xudCA9IGNsbnQ7CisJfQorCisJdXAoJmhvc3QtPmhfc2VtYSk7CisJcmV0dXJuIGNsbnQ7CisKK2ZvcmdldGl0OgorCXByaW50aygibG9ja2Q6IGNvdWxkbid0IGNyZWF0ZSBSUEMgaGFuZGxlIGZvciAlc1xuIiwgaG9zdC0+aF9uYW1lKTsKKwl1cCgmaG9zdC0+aF9zZW1hKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIEZvcmNlIGEgcG9ydG1hcCBsb29rdXAgb2YgdGhlIHJlbW90ZSBsb2NrZCBwb3J0CisgKi8KK3ZvaWQKK25sbV9yZWJpbmRfaG9zdChzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QpCit7CisJZHByaW50aygibG9ja2Q6IHJlYmluZCBob3N0ICVzXG4iLCBob3N0LT5oX25hbWUpOworCWlmIChob3N0LT5oX3JwY2NsbnQgJiYgdGltZV9hZnRlcl9lcShqaWZmaWVzLCBob3N0LT5oX25leHRyZWJpbmQpKSB7CisJCWhvc3QtPmhfcnBjY2xudC0+Y2xfcG9ydCA9IDA7CisJCWhvc3QtPmhfbmV4dHJlYmluZCA9IGppZmZpZXMgKyBOTE1fSE9TVF9SRUJJTkQ7CisJfQorfQorCisvKgorICogSW5jcmVtZW50IE5MTSBob3N0IGNvdW50CisgKi8KK3N0cnVjdCBubG1faG9zdCAqIG5sbV9nZXRfaG9zdChzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QpCit7CisJaWYgKGhvc3QpIHsKKwkJZHByaW50aygibG9ja2Q6IGdldCBob3N0ICVzXG4iLCBob3N0LT5oX25hbWUpOworCQlhdG9taWNfaW5jKCZob3N0LT5oX2NvdW50KTsKKwkJaG9zdC0+aF9leHBpcmVzID0gamlmZmllcyArIE5MTV9IT1NUX0VYUElSRTsKKwl9CisJcmV0dXJuIGhvc3Q7Cit9CisKKy8qCisgKiBSZWxlYXNlIE5MTSBob3N0IGFmdGVyIHVzZQorICovCit2b2lkIG5sbV9yZWxlYXNlX2hvc3Qoc3RydWN0IG5sbV9ob3N0ICpob3N0KQoreworCWlmIChob3N0ICE9IE5VTEwpIHsKKwkJZHByaW50aygibG9ja2Q6IHJlbGVhc2UgaG9zdCAlc1xuIiwgaG9zdC0+aF9uYW1lKTsKKwkJYXRvbWljX2RlYygmaG9zdC0+aF9jb3VudCk7CisJCUJVR19PTihhdG9taWNfcmVhZCgmaG9zdC0+aF9jb3VudCkgPCAwKTsKKwl9Cit9CisKKy8qCisgKiBTaHV0IGRvd24gdGhlIGhvc3RzIG1vZHVsZS4KKyAqIE5vdGUgdGhhdCB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIG9ubHkgYXQgc2VydmVyIHNodXRkb3duIHRpbWUuCisgKi8KK3ZvaWQKK25sbV9zaHV0ZG93bl9ob3N0cyh2b2lkKQoreworCXN0cnVjdCBubG1faG9zdAkqaG9zdDsKKwlpbnQJCWk7CisKKwlkcHJpbnRrKCJsb2NrZDogc2h1dHRpbmcgZG93biBob3N0IG1vZHVsZVxuIik7CisJZG93bigmbmxtX2hvc3Rfc2VtYSk7CisKKwkvKiBGaXJzdCwgbWFrZSBhbGwgaG9zdHMgZWxpZ2libGUgZm9yIGdjICovCisJZHByaW50aygibG9ja2Q6IG51a2luZyBhbGwgaG9zdHMuLi5cbiIpOworCWZvciAoaSA9IDA7IGkgPCBOTE1fSE9TVF9OUkhBU0g7IGkrKykgeworCQlmb3IgKGhvc3QgPSBubG1faG9zdHNbaV07IGhvc3Q7IGhvc3QgPSBob3N0LT5oX25leHQpCisJCQlob3N0LT5oX2V4cGlyZXMgPSBqaWZmaWVzIC0gMTsKKwl9CisKKwkvKiBUaGVuLCBwZXJmb3JtIGEgZ2FyYmFnZSBjb2xsZWN0aW9uIHBhc3MgKi8KKwlubG1fZ2NfaG9zdHMoKTsKKwl1cCgmbmxtX2hvc3Rfc2VtYSk7CisKKwkvKiBjb21wbGFpbiBpZiBhbnkgaG9zdHMgYXJlIGxlZnQgKi8KKwlpZiAobnJob3N0cykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJsb2NrZDogY291bGRuJ3Qgc2h1dGRvd24gaG9zdCBtb2R1bGUhXG4iKTsKKwkJZHByaW50aygibG9ja2Q6ICVkIGhvc3RzIGxlZnQ6XG4iLCBucmhvc3RzKTsKKwkJZm9yIChpID0gMDsgaSA8IE5MTV9IT1NUX05SSEFTSDsgaSsrKSB7CisJCQlmb3IgKGhvc3QgPSBubG1faG9zdHNbaV07IGhvc3Q7IGhvc3QgPSBob3N0LT5oX25leHQpIHsKKwkJCQlkcHJpbnRrKCIgICAgICAgJXMgKGNudCAlZCB1c2UgJWQgZXhwICVsZClcbiIsCisJCQkJCWhvc3QtPmhfbmFtZSwgYXRvbWljX3JlYWQoJmhvc3QtPmhfY291bnQpLAorCQkJCQlob3N0LT5oX2ludXNlLCBob3N0LT5oX2V4cGlyZXMpOworCQkJfQorCQl9CisJfQorfQorCisvKgorICogR2FyYmFnZSBjb2xsZWN0IGFueSB1bnVzZWQgTkxNIGhvc3RzLgorICogVGhpcyBHQyBjb21iaW5lcyByZWZlcmVuY2UgY291bnRpbmcgZm9yIGFzeW5jIG9wZXJhdGlvbnMgd2l0aAorICogbWFyayAmIHN3ZWVwIGZvciByZXNvdXJjZXMgaGVsZCBieSByZW1vdGUgY2xpZW50cy4KKyAqLworc3RhdGljIHZvaWQKK25sbV9nY19ob3N0cyh2b2lkKQoreworCXN0cnVjdCBubG1faG9zdAkqKnEsICpob3N0OworCXN0cnVjdCBycGNfY2xudAkqY2xudDsKKwlpbnQJCWk7CisKKwlkcHJpbnRrKCJsb2NrZDogaG9zdCBnYXJiYWdlIGNvbGxlY3Rpb25cbiIpOworCWZvciAoaSA9IDA7IGkgPCBOTE1fSE9TVF9OUkhBU0g7IGkrKykgeworCQlmb3IgKGhvc3QgPSBubG1faG9zdHNbaV07IGhvc3Q7IGhvc3QgPSBob3N0LT5oX25leHQpCisJCQlob3N0LT5oX2ludXNlID0gMDsKKwl9CisKKwkvKiBNYXJrIGFsbCBob3N0cyB0aGF0IGhvbGQgbG9ja3MsIGJsb2NrcyBvciBzaGFyZXMgKi8KKwlubG1zdmNfbWFya19yZXNvdXJjZXMoKTsKKworCWZvciAoaSA9IDA7IGkgPCBOTE1fSE9TVF9OUkhBU0g7IGkrKykgeworCQlxID0gJm5sbV9ob3N0c1tpXTsKKwkJd2hpbGUgKChob3N0ID0gKnEpICE9IE5VTEwpIHsKKwkJCWlmIChhdG9taWNfcmVhZCgmaG9zdC0+aF9jb3VudCkgfHwgaG9zdC0+aF9pbnVzZQorCQkJIHx8IHRpbWVfYmVmb3JlKGppZmZpZXMsIGhvc3QtPmhfZXhwaXJlcykpIHsKKwkJCQlkcHJpbnRrKCJubG1fZ2NfaG9zdHMgc2tpcHBpbmcgJXMgKGNudCAlZCB1c2UgJWQgZXhwICVsZClcbiIsCisJCQkJCWhvc3QtPmhfbmFtZSwgYXRvbWljX3JlYWQoJmhvc3QtPmhfY291bnQpLAorCQkJCQlob3N0LT5oX2ludXNlLCBob3N0LT5oX2V4cGlyZXMpOworCQkJCXEgPSAmaG9zdC0+aF9uZXh0OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZHByaW50aygibG9ja2Q6IGRlbGV0ZSBob3N0ICVzXG4iLCBob3N0LT5oX25hbWUpOworCQkJKnEgPSBob3N0LT5oX25leHQ7CisJCQkvKiBEb24ndCB1bm1vbml0b3IgaG9zdHMgdGhhdCBoYXZlIGJlZW4gaW52YWxpZGF0ZWQgKi8KKwkJCWlmIChob3N0LT5oX21vbml0b3JlZCAmJiAhaG9zdC0+aF9raWxsZWQpCisJCQkJbnNtX3VubW9uaXRvcihob3N0KTsKKwkJCWlmICgoY2xudCA9IGhvc3QtPmhfcnBjY2xudCkgIT0gTlVMTCkgeworCQkJCWlmIChhdG9taWNfcmVhZCgmY2xudC0+Y2xfdXNlcnMpKSB7CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkJCSJsb2NrZDogYWN0aXZlIFJQQyBoYW5kbGVcbiIpOworCQkJCQljbG50LT5jbF9kZWFkID0gMTsKKwkJCQl9IGVsc2UgeworCQkJCQlycGNfZGVzdHJveV9jbGllbnQoaG9zdC0+aF9ycGNjbG50KTsKKwkJCQl9CisJCQl9CisJCQlCVUdfT04oIWxpc3RfZW1wdHkoJmhvc3QtPmhfbG9ja293bmVycykpOworCQkJa2ZyZWUoaG9zdCk7CisJCQlucmhvc3RzLS07CisJCX0KKwl9CisKKwluZXh0X2djID0gamlmZmllcyArIE5MTV9IT1NUX0NPTExFQ1Q7Cit9CisKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL21vbi5jIGIvZnMvbG9ja2QvbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZjMWJlYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2xvY2tkL21vbi5jCkBAIC0wLDAgKzEsMjQ2IEBACisvKgorICogbGludXgvZnMvbG9ja2QvbW9uLmMKKyAqCisgKiBUaGUga2VybmVsIHN0YXRkIGNsaWVudC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2NrZC9sb2NrZC5oPgorI2luY2x1ZGUgPGxpbnV4L2xvY2tkL3NtX2ludGVyLmg+CisKKworI2RlZmluZSBOTE1EQkdfRkFDSUxJVFkJCU5MTURCR19NT05JVE9SCisKK3N0YXRpYyBzdHJ1Y3QgcnBjX2NsbnQgKgluc21fY3JlYXRlKHZvaWQpOworCitzdGF0aWMgc3RydWN0IHJwY19wcm9ncmFtCW5zbV9wcm9ncmFtOworCisvKgorICogTG9jYWwgTlNNIHN0YXRlCisgKi8KK3UzMgkJCQluc21fbG9jYWxfc3RhdGU7CisKKy8qCisgKiBDb21tb24gcHJvY2VkdXJlIGZvciBTTV9NT04vU01fVU5NT04gY2FsbHMKKyAqLworc3RhdGljIGludAorbnNtX21vbl91bm1vbihzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QsIHUzMiBwcm9jLCBzdHJ1Y3QgbnNtX3JlcyAqcmVzKQoreworCXN0cnVjdCBycGNfY2xudAkqY2xudDsKKwlpbnQJCXN0YXR1czsKKwlzdHJ1Y3QgbnNtX2FyZ3MJYXJnczsKKworCWNsbnQgPSBuc21fY3JlYXRlKCk7CisJaWYgKElTX0VSUihjbG50KSkgeworCQlzdGF0dXMgPSBQVFJfRVJSKGNsbnQpOworCQlnb3RvIG91dDsKKwl9CisKKwlhcmdzLmFkZHIgPSBob3N0LT5oX2FkZHIuc2luX2FkZHIuc19hZGRyOworCWFyZ3MucHJvdG89IChob3N0LT5oX3Byb3RvPDwxKSB8IGhvc3QtPmhfc2VydmVyOworCWFyZ3MucHJvZyA9IE5MTV9QUk9HUkFNOworCWFyZ3MudmVycyA9IGhvc3QtPmhfdmVyc2lvbjsKKwlhcmdzLnByb2MgPSBOTE1QUk9DX05TTV9OT1RJRlk7CisJbWVtc2V0KHJlcywgMCwgc2l6ZW9mKCpyZXMpKTsKKworCXN0YXR1cyA9IHJwY19jYWxsKGNsbnQsIHByb2MsICZhcmdzLCByZXMsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9ERUJVRyAibnNtX21vbl91bm1vbjogcnBjIGZhaWxlZCwgc3RhdHVzPSVkXG4iLAorCQkJc3RhdHVzKTsKKwllbHNlCisJCXN0YXR1cyA9IDA7Cisgb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBTZXQgdXAgbW9uaXRvcmluZyBvZiBhIHJlbW90ZSBob3N0CisgKi8KK2ludAorbnNtX21vbml0b3Ioc3RydWN0IG5sbV9ob3N0ICpob3N0KQoreworCXN0cnVjdCBuc21fcmVzCXJlczsKKwlpbnQJCXN0YXR1czsKKworCWRwcmludGsoImxvY2tkOiBuc21fbW9uaXRvciglcylcbiIsIGhvc3QtPmhfbmFtZSk7CisKKwlzdGF0dXMgPSBuc21fbW9uX3VubW9uKGhvc3QsIFNNX01PTiwgJnJlcyk7CisKKwlpZiAoc3RhdHVzIDwgMCB8fCByZXMuc3RhdHVzICE9IDApCisJCXByaW50ayhLRVJOX05PVElDRSAibG9ja2Q6IGNhbm5vdCBtb25pdG9yICVzXG4iLCBob3N0LT5oX25hbWUpOworCWVsc2UKKwkJaG9zdC0+aF9tb25pdG9yZWQgPSAxOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBDZWFzZSB0byBtb25pdG9yIHJlbW90ZSBob3N0CisgKi8KK2ludAorbnNtX3VubW9uaXRvcihzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IG5zbV9yZXMJcmVzOworCWludAkJc3RhdHVzOworCisJZHByaW50aygibG9ja2Q6IG5zbV91bm1vbml0b3IoJXMpXG4iLCBob3N0LT5oX25hbWUpOworCisJc3RhdHVzID0gbnNtX21vbl91bm1vbihob3N0LCBTTV9VTk1PTiwgJnJlcyk7CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX05PVElDRSAibG9ja2Q6IGNhbm5vdCB1bm1vbml0b3IgJXNcbiIsIGhvc3QtPmhfbmFtZSk7CisJZWxzZQorCQlob3N0LT5oX21vbml0b3JlZCA9IDA7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIENyZWF0ZSBOU00gY2xpZW50IGZvciB0aGUgbG9jYWwgaG9zdAorICovCitzdGF0aWMgc3RydWN0IHJwY19jbG50ICoKK25zbV9jcmVhdGUodm9pZCkKK3sKKwlzdHJ1Y3QgcnBjX3hwcnQJCSp4cHJ0OworCXN0cnVjdCBycGNfY2xudAkJKmNsbnQ7CisJc3RydWN0IHNvY2thZGRyX2luCXNpbjsKKworCXNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlzaW4uc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0xPT1BCQUNLKTsKKwlzaW4uc2luX3BvcnQgPSAwOworCisJeHBydCA9IHhwcnRfY3JlYXRlX3Byb3RvKElQUFJPVE9fVURQLCAmc2luLCBOVUxMKTsKKwlpZiAoSVNfRVJSKHhwcnQpKQorCQlyZXR1cm4gKHN0cnVjdCBycGNfY2xudCAqKXhwcnQ7CisKKwljbG50ID0gcnBjX2NyZWF0ZV9jbGllbnQoeHBydCwgImxvY2FsaG9zdCIsCisJCQkJJm5zbV9wcm9ncmFtLCBTTV9WRVJTSU9OLAorCQkJCVJQQ19BVVRIX05VTEwpOworCWlmIChJU19FUlIoY2xudCkpCisJCWdvdG8gb3V0X2Rlc3Ryb3k7CisJY2xudC0+Y2xfc29mdHJ0cnkgPSAxOworCWNsbnQtPmNsX2NoYXR0eSAgID0gMTsKKwljbG50LT5jbF9vbmVzaG90ICA9IDE7CisJeHBydC0+cmVzdnBvcnQgPSAxOwkvKiBOU00gcmVxdWlyZXMgYSByZXNlcnZlZCBwb3J0ICovCisJcmV0dXJuIGNsbnQ7CisKK291dF9kZXN0cm95OgorCXhwcnRfZGVzdHJveSh4cHJ0KTsKKwlyZXR1cm4gY2xudDsKK30KKworLyoKKyAqIFhEUiBmdW5jdGlvbnMgZm9yIE5TTS4KKyAqLworCitzdGF0aWMgdTMyICoKK3hkcl9lbmNvZGVfY29tbW9uKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgc3RydWN0IG5zbV9hcmdzICphcmdwKQoreworCWNoYXIJYnVmZmVyWzIwXTsKKworCS8qCisJICogVXNlIHRoZSBkb3R0ZWQtcXVhZCBJUCBhZGRyZXNzIG9mIHRoZSByZW1vdGUgaG9zdCBhcworCSAqIGlkZW50aWZpZXIuIExpbnV4IHN0YXRkIGFsd2F5cyBsb29rcyB1cCB0aGUgY2Fub25pY2FsCisJICogaG9zdG5hbWUgZmlyc3QgZm9yIHdoYXRldmVyIHJlbW90ZSBob3N0bmFtZSBpdCByZWNlaXZlcywKKwkgKiBzbyB0aGlzIHdvcmtzIGFscmlnaHQuCisJICovCisJc3ByaW50ZihidWZmZXIsICIldS4ldS4ldS4ldSIsIE5JUFFVQUQoYXJncC0+YWRkcikpOworCWlmICghKHAgPSB4ZHJfZW5jb2RlX3N0cmluZyhwLCBidWZmZXIpKQorCSB8fCAhKHAgPSB4ZHJfZW5jb2RlX3N0cmluZyhwLCBzeXN0ZW1fdXRzbmFtZS5ub2RlbmFtZSkpKQorCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKKwkqcCsrID0gaHRvbmwoYXJncC0+cHJvZyk7CisJKnArKyA9IGh0b25sKGFyZ3AtPnZlcnMpOworCSpwKysgPSBodG9ubChhcmdwLT5wcm9jKTsKKworCXJldHVybiBwOworfQorCitzdGF0aWMgaW50Cit4ZHJfZW5jb2RlX21vbihzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBuc21fYXJncyAqYXJncCkKK3sKKwlwID0geGRyX2VuY29kZV9jb21tb24ocnFzdHAsIHAsIGFyZ3ApOworCWlmIChJU19FUlIocCkpCisJCXJldHVybiBQVFJfRVJSKHApOworCSpwKysgPSBhcmdwLT5hZGRyOworCSpwKysgPSBhcmdwLT52ZXJzOworCSpwKysgPSBhcmdwLT5wcm90bzsKKwkqcCsrID0gMDsKKwlycXN0cC0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocnFzdHAtPnJxX3N2ZWMsIHApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit4ZHJfZW5jb2RlX3VubW9uKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgc3RydWN0IG5zbV9hcmdzICphcmdwKQoreworCXAgPSB4ZHJfZW5jb2RlX2NvbW1vbihycXN0cCwgcCwgYXJncCk7CisJaWYgKElTX0VSUihwKSkKKwkJcmV0dXJuIFBUUl9FUlIocCk7CisJcnFzdHAtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJxc3RwLT5ycV9zdmVjLCBwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoreGRyX2RlY29kZV9zdGF0X3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBuc21fcmVzICpyZXNwKQoreworCXJlc3AtPnN0YXR1cyA9IG50b2hsKCpwKyspOworCXJlc3AtPnN0YXRlID0gbnRvaGwoKnArKyk7CisJZHByaW50aygibnNtOiB4ZHJfZGVjb2RlX3N0YXRfcmVzIHN0YXR1cyAlZCBzdGF0ZSAlZFxuIiwKKwkJCXJlc3AtPnN0YXR1cywgcmVzcC0+c3RhdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit4ZHJfZGVjb2RlX3N0YXQoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3QgbnNtX3JlcyAqcmVzcCkKK3sKKwlyZXNwLT5zdGF0ZSA9IG50b2hsKCpwKyspOworCXJldHVybiAwOworfQorCisjZGVmaW5lIFNNX215X25hbWVfc3oJKDErWERSX1FVQURMRU4oU01fTUFYU1RSTEVOKSkKKyNkZWZpbmUgU01fbXlfaWRfc3oJKDMrMStTTV9teV9uYW1lX3N6KQorI2RlZmluZSBTTV9tb25faWRfc3oJKDErWERSX1FVQURMRU4oMjApK1NNX215X2lkX3N6KQorI2RlZmluZSBTTV9tb25fc3oJKFNNX21vbl9pZF9zeis0KQorI2RlZmluZSBTTV9tb25yZXNfc3oJMgorI2RlZmluZSBTTV91bm1vbnJlc19zegkxCisKKyNpZm5kZWYgTUFYCisjIGRlZmluZSBNQVgoYSwgYikJKCgoYSkgPiAoYikpPyAoYSkgOiAoYikpCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBycGNfcHJvY2luZm8JbnNtX3Byb2NlZHVyZXNbXSA9IHsKK1tTTV9NT05dID0geworCQkucF9wcm9jCQk9IFNNX01PTiwKKwkJLnBfZW5jb2RlCT0gKGt4ZHJwcm9jX3QpIHhkcl9lbmNvZGVfbW9uLAorCQkucF9kZWNvZGUJPSAoa3hkcnByb2NfdCkgeGRyX2RlY29kZV9zdGF0X3JlcywKKwkJLnBfYnVmc2l6CT0gTUFYKFNNX21vbl9zeiwgU01fbW9ucmVzX3N6KSA8PCAyLAorCX0sCitbU01fVU5NT05dID0geworCQkucF9wcm9jCQk9IFNNX1VOTU9OLAorCQkucF9lbmNvZGUJPSAoa3hkcnByb2NfdCkgeGRyX2VuY29kZV91bm1vbiwKKwkJLnBfZGVjb2RlCT0gKGt4ZHJwcm9jX3QpIHhkcl9kZWNvZGVfc3RhdCwKKwkJLnBfYnVmc2l6CT0gTUFYKFNNX21vbl9pZF9zeiwgU01fdW5tb25yZXNfc3opIDw8IDIsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcnBjX3ZlcnNpb24JbnNtX3ZlcnNpb24xID0geworCQkubnVtYmVyCQk9IDEsIAorCQkubnJwcm9jcwk9IHNpemVvZihuc21fcHJvY2VkdXJlcykvc2l6ZW9mKG5zbV9wcm9jZWR1cmVzWzBdKSwKKwkJLnByb2NzCQk9IG5zbV9wcm9jZWR1cmVzCit9OworCitzdGF0aWMgc3RydWN0IHJwY192ZXJzaW9uICoJbnNtX3ZlcnNpb25bXSA9IHsKKwlbMV0gPSAmbnNtX3ZlcnNpb24xLAorfTsKKworc3RhdGljIHN0cnVjdCBycGNfc3RhdAkJbnNtX3N0YXRzOworCitzdGF0aWMgc3RydWN0IHJwY19wcm9ncmFtCW5zbV9wcm9ncmFtID0geworCQkubmFtZQkJPSAic3RhdGQiLAorCQkubnVtYmVyCQk9IFNNX1BST0dSQU0sCisJCS5ucnZlcnMJCT0gc2l6ZW9mKG5zbV92ZXJzaW9uKS9zaXplb2YobnNtX3ZlcnNpb25bMF0pLAorCQkudmVyc2lvbgk9IG5zbV92ZXJzaW9uLAorCQkuc3RhdHMJCT0gJm5zbV9zdGF0cworfTsKZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL3N2Yy5jIGIvZnMvbG9ja2Qvc3ZjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgyZTQ3MAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2xvY2tkL3N2Yy5jCkBAIC0wLDAgKzEsNTE5IEBACisvKgorICogbGludXgvZnMvbG9ja2Qvc3ZjLmMKKyAqCisgKiBUaGlzIGlzIHRoZSBjZW50cmFsIGxvY2tkIHNlcnZpY2UuCisgKgorICogRklYTUU6IFNlcGFyYXRlIHRoZSBsb2NrZCBORlMgc2VydmVyIGZ1bmN0aW9uYWxpdHkgZnJvbSB0aGUgbG9ja2QgTkZTCisgKiAJICBjbGllbnQgZnVuY3Rpb25hbGl0eS4gT2ggd2h5IGRpZG4ndCBTdW4gY3JlYXRlIHR3byBzZXBhcmF0ZQorICoJICBzZXJ2aWNlcyBpbiB0aGUgZmlyc3QgcGxhY2U/CisgKgorICogQXV0aG9yczoJT2xhZiBLaXJjaCAob2tpckBtb25hZC5zd2IuZGUpCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCisjaW5jbHVkZSA8bGludXgvc3VucnBjL3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N0YXRzLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Y3NvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9sb2NrZC9sb2NrZC5oPgorI2luY2x1ZGUgPGxpbnV4L25mcy5oPgorCisjZGVmaW5lIE5MTURCR19GQUNJTElUWQkJTkxNREJHX1NWQworI2RlZmluZSBMT0NLRF9CVUZTSVpFCQkoMTAyNCArIE5MTVNWQ19YRFJTSVpFKQorI2RlZmluZSBBTExPV0VEX1NJR1MJCShzaWdtYXNrKFNJR0tJTEwpKQorCitzdGF0aWMgc3RydWN0IHN2Y19wcm9ncmFtCW5sbXN2Y19wcm9ncmFtOworCitzdHJ1Y3Qgbmxtc3ZjX2JpbmRpbmcgKgkJbmxtc3ZjX29wczsKK0VYUE9SVF9TWU1CT0wobmxtc3ZjX29wcyk7CisKK3N0YXRpYyBERUNMQVJFX01VVEVYKG5sbXN2Y19zZW1hKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQJCW5sbXN2Y191c2VyczsKK3N0YXRpYyBwaWRfdAkJCW5sbXN2Y19waWQ7CitpbnQJCQkJbmxtc3ZjX2dyYWNlX3BlcmlvZDsKK3Vuc2lnbmVkIGxvbmcJCQlubG1zdmNfdGltZW91dDsKKworc3RhdGljIERFQ0xBUkVfTVVURVhfTE9DS0VEKGxvY2tkX3N0YXJ0KTsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChsb2NrZF9leGl0KTsKKworLyoKKyAqIFRoZXNlIGNhbiBiZSBzZXQgYXQgaW5zbW9kIHRpbWUgKHVzZWZ1bCBmb3IgTkZTIGFzIHJvb3QgZmlsZXN5c3RlbSksCisgKiBhbmQgYWxzbyBjaGFuZ2VkIHRocm91Z2ggdGhlIHN5c2N0bCBpbnRlcmZhY2UuICAtLSBKYW1pZSBMb2tpZXIsIEF1ZyAyMDAzCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nCQlubG1fZ3JhY2VfcGVyaW9kOworc3RhdGljIHVuc2lnbmVkIGxvbmcJCW5sbV90aW1lb3V0ID0gTE9DS0RfREZMVF9USU1FTzsKK3N0YXRpYyBpbnQJCQlubG1fdWRwcG9ydCwgbmxtX3RjcHBvcnQ7CisKKy8qCisgKiBDb25zdGFudHMgbmVlZGVkIGZvciB0aGUgc3lzY3RsIGludGVyZmFjZS4KKyAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcJbmxtX2dyYWNlX3BlcmlvZF9taW4gPSAwOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcJbmxtX2dyYWNlX3BlcmlvZF9tYXggPSAyNDA7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZwlubG1fdGltZW91dF9taW4gPSAzOworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcJbmxtX3RpbWVvdXRfbWF4ID0gMjA7CitzdGF0aWMgY29uc3QgaW50CQlubG1fcG9ydF9taW4gPSAwLCBubG1fcG9ydF9tYXggPSA2NTUzNTsKKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICogbmxtX3N5c2N0bF90YWJsZTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc2V0X2dyYWNlX3BlcmlvZCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZ3JhY2VfcGVyaW9kOworCisJLyogTm90ZTogbmxtX3RpbWVvdXQgc2hvdWxkIGFsd2F5cyBiZSBub256ZXJvICovCisJaWYgKG5sbV9ncmFjZV9wZXJpb2QpCisJCWdyYWNlX3BlcmlvZCA9ICgobmxtX2dyYWNlX3BlcmlvZCArIG5sbV90aW1lb3V0IC0gMSkKKwkJCQkvIG5sbV90aW1lb3V0KSAqIG5sbV90aW1lb3V0ICogSFo7CisJZWxzZQorCQlncmFjZV9wZXJpb2QgPSBubG1fdGltZW91dCAqIDUgKiBIWjsKKwlubG1zdmNfZ3JhY2VfcGVyaW9kID0gMTsKKwlyZXR1cm4gZ3JhY2VfcGVyaW9kICsgamlmZmllczsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX2dyYWNlX3BlcmlvZCh2b2lkKQoreworCW5sbXN2Y19ncmFjZV9wZXJpb2QgPSAwOworfQorCisvKgorICogVGhpcyBpcyB0aGUgbG9ja2Qga2VybmVsIHRocmVhZAorICovCitzdGF0aWMgdm9pZAorbG9ja2Qoc3RydWN0IHN2Y19ycXN0ICpycXN0cCkKK3sKKwlzdHJ1Y3Qgc3ZjX3NlcnYJKnNlcnYgPSBycXN0cC0+cnFfc2VydmVyOworCWludAkJZXJyID0gMDsKKwl1bnNpZ25lZCBsb25nIGdyYWNlX3BlcmlvZF9leHBpcmU7CisKKwkvKiBMb2NrIG1vZHVsZSBhbmQgc2V0IHVwIGtlcm5lbCB0aHJlYWQgKi8KKwkvKiBsb2NrZF91cCBpcyB3YWl0aW5nIGZvciB1cyB0byBzdGFydHVwLCBzbyB3aWxsCisJICogYmUgaG9sZGluZyBhIHJlZmVyZW5jZSB0byB0aGlzIG1vZHVsZSwgc28gaXQKKwkgKiBpcyBzYWZlIHRvIGp1c3QgY2xhaW0gYW5vdGhlciByZWZlcmVuY2UKKwkgKi8KKwlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOworCWxvY2tfa2VybmVsKCk7CisKKwkvKgorCSAqIExldCBvdXIgbWFrZXIga25vdyB3ZSdyZSBydW5uaW5nLgorCSAqLworCW5sbXN2Y19waWQgPSBjdXJyZW50LT5waWQ7CisJdXAoJmxvY2tkX3N0YXJ0KTsKKworCWRhZW1vbml6ZSgibG9ja2QiKTsKKworCS8qIFByb2Nlc3MgcmVxdWVzdCB3aXRoIHNpZ25hbHMgYmxvY2tlZCwgYnV0IGFsbG93IFNJR0tJTEwuICAqLworCWFsbG93X3NpZ25hbChTSUdLSUxMKTsKKworCS8qIGtpY2sgcnBjaW9kICovCisJcnBjaW9kX3VwKCk7CisKKwlkcHJpbnRrKCJORlMgbG9ja2luZyBzZXJ2aWNlIHN0YXJ0ZWQgKHZlciAiIExPQ0tEX1ZFUlNJT04gIikuXG4iKTsKKworCWlmICghbmxtX3RpbWVvdXQpCisJCW5sbV90aW1lb3V0ID0gTE9DS0RfREZMVF9USU1FTzsKKwlubG1zdmNfdGltZW91dCA9IG5sbV90aW1lb3V0ICogSFo7CisKKwlncmFjZV9wZXJpb2RfZXhwaXJlID0gc2V0X2dyYWNlX3BlcmlvZCgpOworCisJLyoKKwkgKiBUaGUgbWFpbiByZXF1ZXN0IGxvb3AuIFdlIGRvbid0IHRlcm1pbmF0ZSB1bnRpbCB0aGUgbGFzdAorCSAqIE5GUyBtb3VudCBvciBORlMgZGFlbW9uIGhhcyBnb25lIGF3YXksIGFuZCB3ZSd2ZSBiZWVuIHNlbnQgYQorCSAqIHNpZ25hbCwgb3IgZWxzZSBhbm90aGVyIHByb2Nlc3MgaGFzIHRha2VuIG92ZXIgb3VyIGpvYi4KKwkgKi8KKwl3aGlsZSAoKG5sbXN2Y191c2VycyB8fCAhc2lnbmFsbGVkKCkpICYmIG5sbXN2Y19waWQgPT0gY3VycmVudC0+cGlkKSB7CisJCWxvbmcgdGltZW91dCA9IE1BWF9TQ0hFRFVMRV9USU1FT1VUOworCisJCWlmIChzaWduYWxsZWQoKSkgeworCQkJZmx1c2hfc2lnbmFscyhjdXJyZW50KTsKKwkJCWlmIChubG1zdmNfb3BzKSB7CisJCQkJbmxtc3ZjX2ludmFsaWRhdGVfYWxsKCk7CisJCQkJZ3JhY2VfcGVyaW9kX2V4cGlyZSA9IHNldF9ncmFjZV9wZXJpb2QoKTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIFJldHJ5IGFueSBibG9ja2VkIGxvY2tzIHRoYXQgaGF2ZSBiZWVuIG5vdGlmaWVkIGJ5CisJCSAqIHRoZSBWRlMuIERvbid0IGRvIHRoaXMgZHVyaW5nIGdyYWNlIHBlcmlvZC4KKwkJICogKFRoZW9yZXRpY2FsbHksIHRoZXJlIHNob3VsZG4ndCBldmVuIGJlIGJsb2NrZWQgbG9ja3MKKwkJICogZHVyaW5nIGdyYWNlIHBlcmlvZCkuCisJCSAqLworCQlpZiAoIW5sbXN2Y19ncmFjZV9wZXJpb2QpIHsKKwkJCXRpbWVvdXQgPSBubG1zdmNfcmV0cnlfYmxvY2tlZCgpOworCQl9IGVsc2UgaWYgKHRpbWVfYmVmb3JlKGdyYWNlX3BlcmlvZF9leHBpcmUsIGppZmZpZXMpKQorCQkJY2xlYXJfZ3JhY2VfcGVyaW9kKCk7CisKKwkJLyoKKwkJICogRmluZCBhIHNvY2tldCB3aXRoIGRhdGEgYXZhaWxhYmxlIGFuZCBjYWxsIGl0cworCQkgKiByZWN2ZnJvbSByb3V0aW5lLgorCQkgKi8KKwkJZXJyID0gc3ZjX3JlY3Yoc2VydiwgcnFzdHAsIHRpbWVvdXQpOworCQlpZiAoZXJyID09IC1FQUdBSU4gfHwgZXJyID09IC1FSU5UUikKKwkJCWNvbnRpbnVlOworCQlpZiAoZXJyIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJsb2NrZDogdGVybWluYXRpbmcgb24gZXJyb3IgJWRcbiIsCisJCQkgICAgICAgLWVycik7CisJCQlicmVhazsKKwkJfQorCisJCWRwcmludGsoImxvY2tkOiByZXF1ZXN0IGZyb20gJTA4eFxuIiwKKwkJCSh1bnNpZ25lZCludG9obChycXN0cC0+cnFfYWRkci5zaW5fYWRkci5zX2FkZHIpKTsKKworCQlzdmNfcHJvY2VzcyhzZXJ2LCBycXN0cCk7CisKKwl9CisKKwkvKgorCSAqIENoZWNrIHdoZXRoZXIgdGhlcmUncyBhIG5ldyBsb2NrZCBwcm9jZXNzIGJlZm9yZQorCSAqIHNodXR0aW5nIGRvd24gdGhlIGhvc3RzIGFuZCBjbGVhcmluZyB0aGUgc2xvdC4KKwkgKi8KKwlpZiAoIW5sbXN2Y19waWQgfHwgY3VycmVudC0+cGlkID09IG5sbXN2Y19waWQpIHsKKwkJaWYgKG5sbXN2Y19vcHMpCisJCQlubG1zdmNfaW52YWxpZGF0ZV9hbGwoKTsKKwkJbmxtX3NodXRkb3duX2hvc3RzKCk7CisJCW5sbXN2Y19waWQgPSAwOworCX0gZWxzZQorCQlwcmludGsoS0VSTl9ERUJVRworCQkJImxvY2tkOiBuZXcgcHJvY2Vzcywgc2tpcHBpbmcgaG9zdCBzaHV0ZG93blxuIik7CisJd2FrZV91cCgmbG9ja2RfZXhpdCk7CisJCQorCS8qIEV4aXQgdGhlIFJQQyB0aHJlYWQgKi8KKwlzdmNfZXhpdF90aHJlYWQocnFzdHApOworCisJLyogcmVsZWFzZSBycGNpb2QgKi8KKwlycGNpb2RfZG93bigpOworCisJLyogUmVsZWFzZSBtb2R1bGUgKi8KKwl1bmxvY2tfa2VybmVsKCk7CisJbW9kdWxlX3B1dF9hbmRfZXhpdCgwKTsKK30KKworLyoKKyAqIEJyaW5nIHVwIHRoZSBsb2NrZCBwcm9jZXNzIGlmIGl0J3Mgbm90IGFscmVhZHkgdXAuCisgKi8KK2ludAorbG9ja2RfdXAodm9pZCkKK3sKKwlzdGF0aWMgaW50CQl3YXJuZWQ7CisJc3RydWN0IHN2Y19zZXJ2ICoJc2VydjsKKwlpbnQJCQllcnJvciA9IDA7CisKKwlkb3duKCZubG1zdmNfc2VtYSk7CisJLyoKKwkgKiBVbmNvbmRpdGlvbmFsbHkgaW5jcmVtZW50IHRoZSB1c2VyIGNvdW50IC4uLiB0aGlzIGlzCisJICogdGhlIG51bWJlciBvZiBjbGllbnRzIHdobyBfd2FudF8gYSBsb2NrZCBwcm9jZXNzLgorCSAqLworCW5sbXN2Y191c2VycysrOyAKKwkvKgorCSAqIENoZWNrIHdoZXRoZXIgd2UncmUgYWxyZWFkeSB1cCBhbmQgcnVubmluZy4KKwkgKi8KKwlpZiAobmxtc3ZjX3BpZCkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIFNhbml0eSBjaGVjazogaWYgdGhlcmUncyBubyBwaWQsCisJICogd2Ugc2hvdWxkIGJlIHRoZSBmaXJzdCB1c2VyIC4uLgorCSAqLworCWlmIChubG1zdmNfdXNlcnMgPiAxKQorCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkibG9ja2RfdXA6IG5vIHBpZCwgJWQgdXNlcnM/P1xuIiwgbmxtc3ZjX3VzZXJzKTsKKworCWVycm9yID0gLUVOT01FTTsKKwlzZXJ2ID0gc3ZjX2NyZWF0ZSgmbmxtc3ZjX3Byb2dyYW0sIExPQ0tEX0JVRlNJWkUpOworCWlmICghc2VydikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJsb2NrZF91cDogY3JlYXRlIHNlcnZpY2UgZmFpbGVkXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKChlcnJvciA9IHN2Y19tYWtlc29jayhzZXJ2LCBJUFBST1RPX1VEUCwgbmxtX3VkcHBvcnQpKSA8IDAgCisjaWZkZWYgQ09ORklHX05GU0RfVENQCisJIHx8IChlcnJvciA9IHN2Y19tYWtlc29jayhzZXJ2LCBJUFBST1RPX1RDUCwgbmxtX3RjcHBvcnQpKSA8IDAKKyNlbmRpZgorCQkpIHsKKwkJaWYgKHdhcm5lZCsrID09IDApIAorCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJCSJsb2NrZF91cDogbWFrZXNvY2sgZmFpbGVkLCBlcnJvcj0lZFxuIiwgZXJyb3IpOworCQlnb3RvIGRlc3Ryb3lfYW5kX291dDsKKwl9IAorCXdhcm5lZCA9IDA7CisKKwkvKgorCSAqIENyZWF0ZSB0aGUga2VybmVsIHRocmVhZCBhbmQgd2FpdCBmb3IgaXQgdG8gc3RhcnQuCisJICovCisJZXJyb3IgPSBzdmNfY3JlYXRlX3RocmVhZChsb2NrZCwgc2Vydik7CisJaWYgKGVycm9yKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSJsb2NrZF91cDogY3JlYXRlIHRocmVhZCBmYWlsZWQsIGVycm9yPSVkXG4iLCBlcnJvcik7CisJCWdvdG8gZGVzdHJveV9hbmRfb3V0OworCX0KKwlkb3duKCZsb2NrZF9zdGFydCk7CisKKwkvKgorCSAqIE5vdGU6IHN2Y19zZXJ2IHN0cnVjdHVyZXMgaGF2ZSBhbiBpbml0aWFsIHVzZSBjb3VudCBvZiAxLAorCSAqIHNvIHdlIGV4aXQgdGhyb3VnaCBoZXJlIG9uIGJvdGggc3VjY2VzcyBhbmQgZmFpbHVyZS4KKwkgKi8KK2Rlc3Ryb3lfYW5kX291dDoKKwlzdmNfZGVzdHJveShzZXJ2KTsKK291dDoKKwl1cCgmbmxtc3ZjX3NlbWEpOworCXJldHVybiBlcnJvcjsKK30KK0VYUE9SVF9TWU1CT0wobG9ja2RfdXApOworCisvKgorICogRGVjcmVtZW50IHRoZSB1c2VyIGNvdW50IGFuZCBicmluZyBkb3duIGxvY2tkIGlmIHdlJ3JlIHRoZSBsYXN0LgorICovCit2b2lkCitsb2NrZF9kb3duKHZvaWQpCit7CisJc3RhdGljIGludCB3YXJuZWQ7CisKKwlkb3duKCZubG1zdmNfc2VtYSk7CisJaWYgKG5sbXN2Y191c2VycykgeworCQlpZiAoLS1ubG1zdmNfdXNlcnMpCisJCQlnb3RvIG91dDsKKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibG9ja2RfZG93bjogbm8gdXNlcnMhIHBpZD0lZFxuIiwgbmxtc3ZjX3BpZCk7CisKKwlpZiAoIW5sbXN2Y19waWQpIHsKKwkJaWYgKHdhcm5lZCsrID09IDApCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJsb2NrZF9kb3duOiBubyBsb2NrZCBydW5uaW5nLlxuIik7IAorCQlnb3RvIG91dDsKKwl9CisJd2FybmVkID0gMDsKKworCWtpbGxfcHJvYyhubG1zdmNfcGlkLCBTSUdLSUxMLCAxKTsKKwkvKgorCSAqIFdhaXQgZm9yIHRoZSBsb2NrZCBwcm9jZXNzIHRvIGV4aXQsIGJ1dCBzaW5jZSB3ZSdyZSBob2xkaW5nCisJICogdGhlIGxvY2tkIHNlbWFwaG9yZSwgd2UgY2FuJ3Qgd2FpdCBhcm91bmQgZm9yZXZlciAuLi4KKwkgKi8KKwljbGVhcl90aHJlYWRfZmxhZyhUSUZfU0lHUEVORElORyk7CisJaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZsb2NrZF9leGl0LCBIWik7CisJaWYgKG5sbXN2Y19waWQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAKKwkJCSJsb2NrZF9kb3duOiBsb2NrZCBmYWlsZWQgdG8gZXhpdCwgY2xlYXJpbmcgcGlkXG4iKTsKKwkJbmxtc3ZjX3BpZCA9IDA7CisJfQorCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCXJlY2FsY19zaWdwZW5kaW5nKCk7CisJc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKK291dDoKKwl1cCgmbmxtc3ZjX3NlbWEpOworfQorRVhQT1JUX1NZTUJPTChsb2NrZF9kb3duKTsKKworLyoKKyAqIFN5c2N0bCBwYXJhbWV0ZXJzIChzYW1lIGFzIG1vZHVsZSBwYXJhbWV0ZXJzLCBkaWZmZXJlbnQgaW50ZXJmYWNlKS4KKyAqLworCisvKiBTb21ldGhpbmcgdGhhdCBpc24ndCBDVExfQU5ZLCBDVExfTk9ORSBvciBhIHZhbHVlIHRoYXQgbWF5IGNsYXNoLiAqLworI2RlZmluZSBDVExfVU5OVU1CRVJFRAkJLTIKKworc3RhdGljIGN0bF90YWJsZSBubG1fc3lzY3Rsc1tdID0geworCXsKKwkJLmN0bF9uYW1lCT0gQ1RMX1VOTlVNQkVSRUQsCisJCS5wcm9jbmFtZQk9ICJubG1fZ3JhY2VfcGVyaW9kIiwKKwkJLmRhdGEJCT0gJm5sbV9ncmFjZV9wZXJpb2QsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb3Vsb25ndmVjX21pbm1heCwKKwkJLmV4dHJhMQkJPSAodW5zaWduZWQgbG9uZyAqKSAmbmxtX2dyYWNlX3BlcmlvZF9taW4sCisJCS5leHRyYTIJCT0gKHVuc2lnbmVkIGxvbmcgKikgJm5sbV9ncmFjZV9wZXJpb2RfbWF4LAorCX0sCisJeworCQkuY3RsX25hbWUJPSBDVExfVU5OVU1CRVJFRCwKKwkJLnByb2NuYW1lCT0gIm5sbV90aW1lb3V0IiwKKwkJLmRhdGEJCT0gJm5sbV90aW1lb3V0LAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG91bG9uZ3ZlY19taW5tYXgsCisJCS5leHRyYTEJCT0gKHVuc2lnbmVkIGxvbmcgKikgJm5sbV90aW1lb3V0X21pbiwKKwkJLmV4dHJhMgkJPSAodW5zaWduZWQgbG9uZyAqKSAmbmxtX3RpbWVvdXRfbWF4LAorCX0sCisJeworCQkuY3RsX25hbWUJPSBDVExfVU5OVU1CRVJFRCwKKwkJLnByb2NuYW1lCT0gIm5sbV91ZHBwb3J0IiwKKwkJLmRhdGEJCT0gJm5sbV91ZHBwb3J0LAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCQkuZXh0cmExCQk9IChpbnQgKikgJm5sbV9wb3J0X21pbiwKKwkJLmV4dHJhMgkJPSAoaW50ICopICZubG1fcG9ydF9tYXgsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IENUTF9VTk5VTUJFUkVELAorCQkucHJvY25hbWUJPSAibmxtX3RjcHBvcnQiLAorCQkuZGF0YQkJPSAmbmxtX3RjcHBvcnQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5leHRyYTEJCT0gKGludCAqKSAmbmxtX3BvcnRfbWluLAorCQkuZXh0cmEyCQk9IChpbnQgKikgJm5sbV9wb3J0X21heCwKKwl9LAorCXsgLmN0bF9uYW1lID0gMCB9Cit9OworCitzdGF0aWMgY3RsX3RhYmxlIG5sbV9zeXNjdGxfZGlyW10gPSB7CisJeworCQkuY3RsX25hbWUJPSBDVExfVU5OVU1CRVJFRCwKKwkJLnByb2NuYW1lCT0gIm5mcyIsCisJCS5tb2RlCQk9IDA1NTUsCisJCS5jaGlsZAkJPSBubG1fc3lzY3RscywKKwl9LAorCXsgLmN0bF9uYW1lID0gMCB9Cit9OworCitzdGF0aWMgY3RsX3RhYmxlIG5sbV9zeXNjdGxfcm9vdFtdID0geworCXsKKwkJLmN0bF9uYW1lCT0gQ1RMX0ZTLAorCQkucHJvY25hbWUJPSAiZnMiLAorCQkubW9kZQkJPSAwNTU1LAorCQkuY2hpbGQJCT0gbmxtX3N5c2N0bF9kaXIsCisJfSwKKwl7IC5jdGxfbmFtZSA9IDAgfQorfTsKKworLyoKKyAqIE1vZHVsZSAoYW5kIGRyaXZlcmZzKSBwYXJhbWV0ZXJzLgorICovCisKKyNkZWZpbmUgcGFyYW1fc2V0X21pbl9tYXgobmFtZSwgdHlwZSwgd2hpY2hfc3RydG9sLCBtaW4sIG1heCkJCVwKK3N0YXRpYyBpbnQgcGFyYW1fc2V0XyMjbmFtZShjb25zdCBjaGFyICp2YWwsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKQlcCit7CQkJCQkJCQkJXAorCWNoYXIgKmVuZHA7CQkJCQkJCVwKKwlfX3R5cGVvZl9fKHR5cGUpIG51bSA9IHdoaWNoX3N0cnRvbCh2YWwsICZlbmRwLCAwKTsJCVwKKwlpZiAoZW5kcCA9PSB2YWwgfHwgKmVuZHAgfHwgbnVtIDwgKG1pbikgfHwgbnVtID4gKG1heCkpCQlcCisJCXJldHVybiAtRUlOVkFMOwkJCQkJCVwKKwkqKChpbnQgKikga3AtPmFyZykgPSBudW07CQkJCQlcCisJcmV0dXJuIDA7CQkJCQkJCVwKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfY2FsbGJhY2sodTMyIHByb2MpCit7CisJcmV0dXJuIHByb2MgPT0gTkxNUFJPQ19HUkFOVEVECisJCXx8IHByb2MgPT0gTkxNUFJPQ19HUkFOVEVEX01TRworCQl8fCBwcm9jID09IE5MTVBST0NfVEVTVF9SRVMKKwkJfHwgcHJvYyA9PSBOTE1QUk9DX0xPQ0tfUkVTCisJCXx8IHByb2MgPT0gTkxNUFJPQ19DQU5DRUxfUkVTCisJCXx8IHByb2MgPT0gTkxNUFJPQ19VTkxPQ0tfUkVTCisJCXx8IHByb2MgPT0gTkxNUFJPQ19OU01fTk9USUZZOworfQorCisKK3N0YXRpYyBpbnQgbG9ja2RfYXV0aGVudGljYXRlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHApCit7CisJcnFzdHAtPnJxX2NsaWVudCA9IE5VTEw7CisJc3dpdGNoIChycXN0cC0+cnFfYXV0aG9wLT5mbGF2b3VyKSB7CisJCWNhc2UgUlBDX0FVVEhfTlVMTDoKKwkJY2FzZSBSUENfQVVUSF9VTklYOgorCQkJaWYgKHJxc3RwLT5ycV9wcm9jID09IDApCisJCQkJcmV0dXJuIFNWQ19PSzsKKwkJCWlmIChpc19jYWxsYmFjayhycXN0cC0+cnFfcHJvYykpIHsKKwkJCQkvKiBMZWF2ZSBpdCB0byBpbmRpdmlkdWFsIHByb2NlZHVyZXMgdG8KKwkJCQkgKiBjYWxsIG5sbXN2Y19sb29rdXBfaG9zdChycXN0cCkKKwkJCQkgKi8KKwkJCQlyZXR1cm4gU1ZDX09LOworCQkJfQorCQkJcmV0dXJuIHN2Y19zZXRfY2xpZW50KHJxc3RwKTsKKwl9CisJcmV0dXJuIFNWQ19ERU5JRUQ7Cit9CisKKworcGFyYW1fc2V0X21pbl9tYXgocG9ydCwgaW50LCBzaW1wbGVfc3RydG9sLCAwLCA2NTUzNSkKK3BhcmFtX3NldF9taW5fbWF4KGdyYWNlX3BlcmlvZCwgdW5zaWduZWQgbG9uZywgc2ltcGxlX3N0cnRvdWwsCisJCSAgbmxtX2dyYWNlX3BlcmlvZF9taW4sIG5sbV9ncmFjZV9wZXJpb2RfbWF4KQorcGFyYW1fc2V0X21pbl9tYXgodGltZW91dCwgdW5zaWduZWQgbG9uZywgc2ltcGxlX3N0cnRvdWwsCisJCSAgbmxtX3RpbWVvdXRfbWluLCBubG1fdGltZW91dF9tYXgpCisKK01PRFVMRV9BVVRIT1IoIk9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJORlMgZmlsZSBsb2NraW5nIHNlcnZpY2UgdmVyc2lvbiAiIExPQ0tEX1ZFUlNJT04gIi4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX3BhcmFtX2NhbGwobmxtX2dyYWNlX3BlcmlvZCwgcGFyYW1fc2V0X2dyYWNlX3BlcmlvZCwgcGFyYW1fZ2V0X3Vsb25nLAorCQkgICZubG1fZ3JhY2VfcGVyaW9kLCAwNjQ0KTsKK21vZHVsZV9wYXJhbV9jYWxsKG5sbV90aW1lb3V0LCBwYXJhbV9zZXRfdGltZW91dCwgcGFyYW1fZ2V0X3Vsb25nLAorCQkgICZubG1fdGltZW91dCwgMDY0NCk7Cittb2R1bGVfcGFyYW1fY2FsbChubG1fdWRwcG9ydCwgcGFyYW1fc2V0X3BvcnQsIHBhcmFtX2dldF9pbnQsCisJCSAgJm5sbV91ZHBwb3J0LCAwNjQ0KTsKK21vZHVsZV9wYXJhbV9jYWxsKG5sbV90Y3Bwb3J0LCBwYXJhbV9zZXRfcG9ydCwgcGFyYW1fZ2V0X2ludCwKKwkJICAmbmxtX3RjcHBvcnQsIDA2NDQpOworCisvKgorICogSW5pdGlhbGlzaW5nIGFuZCB0ZXJtaW5hdGluZyB0aGUgbW9kdWxlLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmxtKHZvaWQpCit7CisJbmxtX3N5c2N0bF90YWJsZSA9IHJlZ2lzdGVyX3N5c2N0bF90YWJsZShubG1fc3lzY3RsX3Jvb3QsIDApOworCXJldHVybiBubG1fc3lzY3RsX3RhYmxlID8gMCA6IC1FTk9NRU07Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X25sbSh2b2lkKQoreworCS8qIEZJWE1FOiBkZWxldGUgYWxsIE5MTSBjbGllbnRzICovCisJbmxtX3NodXRkb3duX2hvc3RzKCk7CisJdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUobmxtX3N5c2N0bF90YWJsZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbmxtKTsKK21vZHVsZV9leGl0KGV4aXRfbmxtKTsKKworLyoKKyAqIERlZmluZSBOTE0gcHJvZ3JhbSBhbmQgcHJvY2VkdXJlcworICovCitzdGF0aWMgc3RydWN0IHN2Y192ZXJzaW9uCW5sbXN2Y192ZXJzaW9uMSA9IHsKKwkJLnZzX3ZlcnMJPSAxLAorCQkudnNfbnByb2MJPSAxNywKKwkJLnZzX3Byb2MJPSBubG1zdmNfcHJvY2VkdXJlcywKKwkJLnZzX3hkcnNpemUJPSBOTE1TVkNfWERSU0laRSwKK307CitzdGF0aWMgc3RydWN0IHN2Y192ZXJzaW9uCW5sbXN2Y192ZXJzaW9uMyA9IHsKKwkJLnZzX3ZlcnMJPSAzLAorCQkudnNfbnByb2MJPSAyNCwKKwkJLnZzX3Byb2MJPSBubG1zdmNfcHJvY2VkdXJlcywKKwkJLnZzX3hkcnNpemUJPSBOTE1TVkNfWERSU0laRSwKK307CisjaWZkZWYgQ09ORklHX0xPQ0tEX1Y0CitzdGF0aWMgc3RydWN0IHN2Y192ZXJzaW9uCW5sbXN2Y192ZXJzaW9uNCA9IHsKKwkJLnZzX3ZlcnMJPSA0LAorCQkudnNfbnByb2MJPSAyNCwKKwkJLnZzX3Byb2MJPSBubG1zdmNfcHJvY2VkdXJlczQsCisJCS52c194ZHJzaXplCT0gTkxNU1ZDX1hEUlNJWkUsCit9OworI2VuZGlmCitzdGF0aWMgc3RydWN0IHN2Y192ZXJzaW9uICoJbmxtc3ZjX3ZlcnNpb25bXSA9IHsKKwlbMV0gPSAmbmxtc3ZjX3ZlcnNpb24xLAorCVszXSA9ICZubG1zdmNfdmVyc2lvbjMsCisjaWZkZWYgQ09ORklHX0xPQ0tEX1Y0CisJWzRdID0gJm5sbXN2Y192ZXJzaW9uNCwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBzdmNfc3RhdAkJbmxtc3ZjX3N0YXRzOworCisjZGVmaW5lIE5MTV9OUlZFUlMJKHNpemVvZihubG1zdmNfdmVyc2lvbikvc2l6ZW9mKG5sbXN2Y192ZXJzaW9uWzBdKSkKK3N0YXRpYyBzdHJ1Y3Qgc3ZjX3Byb2dyYW0Jbmxtc3ZjX3Byb2dyYW0gPSB7CisJLnBnX3Byb2cJCT0gTkxNX1BST0dSQU0sCQkvKiBwcm9ncmFtIG51bWJlciAqLworCS5wZ19udmVycwkJPSBOTE1fTlJWRVJTLAkJLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gbmxtc3ZjX3ZlcnNpb24gKi8KKwkucGdfdmVycwkJPSBubG1zdmNfdmVyc2lvbiwJLyogdmVyc2lvbiB0YWJsZSAqLworCS5wZ19uYW1lCQk9ICJsb2NrZCIsCQkvKiBzZXJ2aWNlIG5hbWUgKi8KKwkucGdfY2xhc3MJCT0gIm5mc2QiLAkJLyogc2hhcmUgYXV0aGVudGljYXRpb24gd2l0aCBuZnNkICovCisJLnBnX3N0YXRzCQk9ICZubG1zdmNfc3RhdHMsCS8qIHN0YXRzIHRhYmxlICovCisJLnBnX2F1dGhlbnRpY2F0ZSA9ICZsb2NrZF9hdXRoZW50aWNhdGUJLyogZXhwb3J0IGF1dGhlbnRpY2F0aW9uICovCit9OwpkaWZmIC0tZ2l0IGEvZnMvbG9ja2Qvc3ZjNHByb2MuYyBiL2ZzL2xvY2tkL3N2YzRwcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg5NjcwZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2xvY2tkL3N2YzRwcm9jLmMKQEAgLTAsMCArMSw1ODAgQEAKKy8qCisgKiBsaW51eC9mcy9sb2NrZC9zdmM0cHJvYy5jCisgKgorICogTG9ja2Qgc2VydmVyIHByb2NlZHVyZXMuIFdlIGRvbid0IGltcGxlbWVudCB0aGUgTkxNXypfUkVTIAorICogcHJvY2VkdXJlcyBiZWNhdXNlIHdlIGRvbid0IHVzZSB0aGUgYXN5bmMgcHJvY2VkdXJlcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL25mc2QuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2NrZC9sb2NrZC5oPgorI2luY2x1ZGUgPGxpbnV4L2xvY2tkL3NoYXJlLmg+CisjaW5jbHVkZSA8bGludXgvbG9ja2Qvc21faW50ZXIuaD4KKworCisjZGVmaW5lIE5MTURCR19GQUNJTElUWQkJTkxNREJHX0NMSUVOVAorCitzdGF0aWMgdTMyCW5sbTRzdmNfY2FsbGJhY2soc3RydWN0IHN2Y19ycXN0ICosIHUzMiwgc3RydWN0IG5sbV9yZXMgKik7CitzdGF0aWMgdm9pZAlubG00c3ZjX2NhbGxiYWNrX2V4aXQoc3RydWN0IHJwY190YXNrICopOworCisvKgorICogT2J0YWluIGNsaWVudCBhbmQgZmlsZSBmcm9tIGFyZ3VtZW50cworICovCitzdGF0aWMgdTMyCitubG00c3ZjX3JldHJpZXZlX2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAorCQkJc3RydWN0IG5sbV9ob3N0ICoqaG9zdHAsIHN0cnVjdCBubG1fZmlsZSAqKmZpbHApCit7CisJc3RydWN0IG5sbV9ob3N0CQkqaG9zdCA9IE5VTEw7CisJc3RydWN0IG5sbV9maWxlCQkqZmlsZSA9IE5VTEw7CisJc3RydWN0IG5sbV9sb2NrCQkqbG9jayA9ICZhcmdwLT5sb2NrOworCXUzMgkJCWVycm9yID0gMDsKKworCS8qIG5mc2QgY2FsbGJhY2tzIG11c3QgaGF2ZSBiZWVuIGluc3RhbGxlZCBmb3IgdGhpcyBwcm9jZWR1cmUgKi8KKwlpZiAoIW5sbXN2Y19vcHMpCisJCXJldHVybiBubG1fbGNrX2RlbmllZF9ub2xvY2tzOworCisJLyogT2J0YWluIGhvc3QgaGFuZGxlICovCisJaWYgKCEoaG9zdCA9IG5sbXN2Y19sb29rdXBfaG9zdChycXN0cCkpCisJIHx8IChhcmdwLT5tb25pdG9yICYmICFob3N0LT5oX21vbml0b3JlZCAmJiBuc21fbW9uaXRvcihob3N0KSA8IDApKQorCQlnb3RvIG5vX2xvY2tzOworCSpob3N0cCA9IGhvc3Q7CisKKwkvKiBPYnRhaW4gZmlsZSBwb2ludGVyLiBOb3QgdXNlZCBieSBGUkVFX0FMTCBjYWxsLiAqLworCWlmIChmaWxwICE9IE5VTEwpIHsKKwkJaWYgKChlcnJvciA9IG5sbV9sb29rdXBfZmlsZShycXN0cCwgJmZpbGUsICZsb2NrLT5maCkpICE9IDApCisJCQlnb3RvIG5vX2xvY2tzOworCQkqZmlscCA9IGZpbGU7CisKKwkJLyogU2V0IHVwIHRoZSBtaXNzaW5nIHBhcnRzIG9mIHRoZSBmaWxlX2xvY2sgc3RydWN0dXJlICovCisJCWxvY2stPmZsLmZsX2ZpbGUgID0gZmlsZS0+Zl9maWxlOworCQlsb2NrLT5mbC5mbF9vd25lciA9IChmbF9vd25lcl90KSBob3N0OworCQlsb2NrLT5mbC5mbF9sbW9wcyA9ICZubG1zdmNfbG9ja19vcGVyYXRpb25zOworCX0KKworCXJldHVybiAwOworCitub19sb2NrczoKKwlpZiAoaG9zdCkKKwkJbmxtX3JlbGVhc2VfaG9zdChob3N0KTsKKyAJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CQorCXJldHVybiBubG1fbGNrX2RlbmllZF9ub2xvY2tzOworfQorCisvKgorICogTlVMTDogVGVzdCBmb3IgcHJlc2VuY2Ugb2Ygc2VydmljZQorICovCitzdGF0aWMgaW50CitubG00c3ZjX3Byb2NfbnVsbChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB2b2lkICphcmdwLCB2b2lkICpyZXNwKQoreworCWRwcmludGsoImxvY2tkOiBOVUxMICAgICAgICAgIGNhbGxlZFxuIik7CisJcmV0dXJuIHJwY19zdWNjZXNzOworfQorCisvKgorICogVEVTVDogQ2hlY2sgZm9yIGNvbmZsaWN0aW5nIGxvY2sKKyAqLworc3RhdGljIGludAorbmxtNHN2Y19wcm9jX3Rlc3Qoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAorCQkJCSAgICAgICAgIHN0cnVjdCBubG1fcmVzICAqcmVzcCkKK3sKKwlzdHJ1Y3QgbmxtX2hvc3QJKmhvc3Q7CisJc3RydWN0IG5sbV9maWxlCSpmaWxlOworCisJZHByaW50aygibG9ja2Q6IFRFU1Q0ICAgICAgICBjYWxsZWRcbiIpOworCXJlc3AtPmNvb2tpZSA9IGFyZ3AtPmNvb2tpZTsKKworCS8qIERvbid0IGFjY2VwdCB0ZXN0IHJlcXVlc3RzIGR1cmluZyBncmFjZSBwZXJpb2QgKi8KKwlpZiAobmxtc3ZjX2dyYWNlX3BlcmlvZCkgeworCQlyZXNwLT5zdGF0dXMgPSBubG1fbGNrX2RlbmllZF9ncmFjZV9wZXJpb2Q7CisJCXJldHVybiBycGNfc3VjY2VzczsKKwl9CisKKwkvKiBPYnRhaW4gY2xpZW50IGFuZCBmaWxlICovCisJaWYgKChyZXNwLT5zdGF0dXMgPSBubG00c3ZjX3JldHJpZXZlX2FyZ3MocnFzdHAsIGFyZ3AsICZob3N0LCAmZmlsZSkpKQorCQlyZXR1cm4gcnBjX3N1Y2Nlc3M7CisKKwkvKiBOb3cgY2hlY2sgZm9yIGNvbmZsaWN0aW5nIGxvY2tzICovCisJcmVzcC0+c3RhdHVzID0gbmxtc3ZjX3Rlc3Rsb2NrKGZpbGUsICZhcmdwLT5sb2NrLCAmcmVzcC0+bG9jayk7CisKKwlkcHJpbnRrKCJsb2NrZDogVEVTVDQgICAgICAgICAgc3RhdHVzICVkXG4iLCBudG9obChyZXNwLT5zdGF0dXMpKTsKKwlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCW5sbV9yZWxlYXNlX2ZpbGUoZmlsZSk7CisJcmV0dXJuIHJwY19zdWNjZXNzOworfQorCitzdGF0aWMgaW50CitubG00c3ZjX3Byb2NfbG9jayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCisJCQkJICAgICAgICAgc3RydWN0IG5sbV9yZXMgICpyZXNwKQoreworCXN0cnVjdCBubG1faG9zdAkqaG9zdDsKKwlzdHJ1Y3QgbmxtX2ZpbGUJKmZpbGU7CisKKwlkcHJpbnRrKCJsb2NrZDogTE9DSyAgICAgICAgICBjYWxsZWRcbiIpOworCisJcmVzcC0+Y29va2llID0gYXJncC0+Y29va2llOworCisJLyogRG9uJ3QgYWNjZXB0IG5ldyBsb2NrIHJlcXVlc3RzIGR1cmluZyBncmFjZSBwZXJpb2QgKi8KKwlpZiAobmxtc3ZjX2dyYWNlX3BlcmlvZCAmJiAhYXJncC0+cmVjbGFpbSkgeworCQlyZXNwLT5zdGF0dXMgPSBubG1fbGNrX2RlbmllZF9ncmFjZV9wZXJpb2Q7CisJCXJldHVybiBycGNfc3VjY2VzczsKKwl9CisKKwkvKiBPYnRhaW4gY2xpZW50IGFuZCBmaWxlICovCisJaWYgKChyZXNwLT5zdGF0dXMgPSBubG00c3ZjX3JldHJpZXZlX2FyZ3MocnFzdHAsIGFyZ3AsICZob3N0LCAmZmlsZSkpKQorCQlyZXR1cm4gcnBjX3N1Y2Nlc3M7CisKKyNpZiAwCisJLyogSWYgc3VwcGxpZWQgc3RhdGUgZG9lc24ndCBtYXRjaCBjdXJyZW50IHN0YXRlLCB3ZSBhc3N1bWUgaXQncworCSAqIGFuIG9sZCByZXF1ZXN0IHRoYXQgdGltZS13YXJwZWQgc29tZWhvdy4gQW55IGVycm9yIHJldHVybiB3b3VsZAorCSAqIGRvIGluIHRoaXMgY2FzZSBiZWNhdXNlIGl0J3MgaXJyZWxldmFudCBhbnl3YXkuCisJICoKKwkgKiBOQjogV2UgZG9uJ3QgcmV0cmlldmUgdGhlIHJlbW90ZSBob3N0J3Mgc3RhdGUgeWV0LgorCSAqLworCWlmIChob3N0LT5oX25zbXN0YXRlICYmIGhvc3QtPmhfbnNtc3RhdGUgIT0gYXJncC0+c3RhdGUpIHsKKwkJcmVzcC0+c3RhdHVzID0gbmxtX2xja19kZW5pZWRfbm9sb2NrczsKKwl9IGVsc2UKKyNlbmRpZgorCisJLyogTm93IHRyeSB0byBsb2NrIHRoZSBmaWxlICovCisJcmVzcC0+c3RhdHVzID0gbmxtc3ZjX2xvY2socnFzdHAsIGZpbGUsICZhcmdwLT5sb2NrLAorCQkJCQlhcmdwLT5ibG9jaywgJmFyZ3AtPmNvb2tpZSk7CisKKwlkcHJpbnRrKCJsb2NrZDogTE9DSyAgICAgICAgICBzdGF0dXMgJWRcbiIsIG50b2hsKHJlc3AtPnN0YXR1cykpOworCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJbmxtX3JlbGVhc2VfZmlsZShmaWxlKTsKKwlyZXR1cm4gcnBjX3N1Y2Nlc3M7Cit9CisKK3N0YXRpYyBpbnQKK25sbTRzdmNfcHJvY19jYW5jZWwoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAorCQkJCSAgICAgICAgICAgc3RydWN0IG5sbV9yZXMgICpyZXNwKQoreworCXN0cnVjdCBubG1faG9zdAkqaG9zdDsKKwlzdHJ1Y3QgbmxtX2ZpbGUJKmZpbGU7CisKKwlkcHJpbnRrKCJsb2NrZDogQ0FOQ0VMICAgICAgICBjYWxsZWRcbiIpOworCisJcmVzcC0+Y29va2llID0gYXJncC0+Y29va2llOworCisJLyogRG9uJ3QgYWNjZXB0IHJlcXVlc3RzIGR1cmluZyBncmFjZSBwZXJpb2QgKi8KKwlpZiAobmxtc3ZjX2dyYWNlX3BlcmlvZCkgeworCQlyZXNwLT5zdGF0dXMgPSBubG1fbGNrX2RlbmllZF9ncmFjZV9wZXJpb2Q7CisJCXJldHVybiBycGNfc3VjY2VzczsKKwl9CisKKwkvKiBPYnRhaW4gY2xpZW50IGFuZCBmaWxlICovCisJaWYgKChyZXNwLT5zdGF0dXMgPSBubG00c3ZjX3JldHJpZXZlX2FyZ3MocnFzdHAsIGFyZ3AsICZob3N0LCAmZmlsZSkpKQorCQlyZXR1cm4gcnBjX3N1Y2Nlc3M7CisKKwkvKiBUcnkgdG8gY2FuY2VsIHJlcXVlc3QuICovCisJcmVzcC0+c3RhdHVzID0gbmxtc3ZjX2NhbmNlbF9ibG9ja2VkKGZpbGUsICZhcmdwLT5sb2NrKTsKKworCWRwcmludGsoImxvY2tkOiBDQU5DRUwgICAgICAgIHN0YXR1cyAlZFxuIiwgbnRvaGwocmVzcC0+c3RhdHVzKSk7CisJbmxtX3JlbGVhc2VfaG9zdChob3N0KTsKKwlubG1fcmVsZWFzZV9maWxlKGZpbGUpOworCXJldHVybiBycGNfc3VjY2VzczsKK30KKworLyoKKyAqIFVOTE9DSzogcmVsZWFzZSBhIGxvY2sKKyAqLworc3RhdGljIGludAorbmxtNHN2Y19wcm9jX3VubG9jayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCisJCQkJICAgICAgICAgICBzdHJ1Y3QgbmxtX3JlcyAgKnJlc3ApCit7CisJc3RydWN0IG5sbV9ob3N0CSpob3N0OworCXN0cnVjdCBubG1fZmlsZQkqZmlsZTsKKworCWRwcmludGsoImxvY2tkOiBVTkxPQ0sgICAgICAgIGNhbGxlZFxuIik7CisKKwlyZXNwLT5jb29raWUgPSBhcmdwLT5jb29raWU7CisKKwkvKiBEb24ndCBhY2NlcHQgbmV3IGxvY2sgcmVxdWVzdHMgZHVyaW5nIGdyYWNlIHBlcmlvZCAqLworCWlmIChubG1zdmNfZ3JhY2VfcGVyaW9kKSB7CisJCXJlc3AtPnN0YXR1cyA9IG5sbV9sY2tfZGVuaWVkX2dyYWNlX3BlcmlvZDsKKwkJcmV0dXJuIHJwY19zdWNjZXNzOworCX0KKworCS8qIE9idGFpbiBjbGllbnQgYW5kIGZpbGUgKi8KKwlpZiAoKHJlc3AtPnN0YXR1cyA9IG5sbTRzdmNfcmV0cmlldmVfYXJncyhycXN0cCwgYXJncCwgJmhvc3QsICZmaWxlKSkpCisJCXJldHVybiBycGNfc3VjY2VzczsKKworCS8qIE5vdyB0cnkgdG8gcmVtb3ZlIHRoZSBsb2NrICovCisJcmVzcC0+c3RhdHVzID0gbmxtc3ZjX3VubG9jayhmaWxlLCAmYXJncC0+bG9jayk7CisKKwlkcHJpbnRrKCJsb2NrZDogVU5MT0NLICAgICAgICBzdGF0dXMgJWRcbiIsIG50b2hsKHJlc3AtPnN0YXR1cykpOworCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJbmxtX3JlbGVhc2VfZmlsZShmaWxlKTsKKwlyZXR1cm4gcnBjX3N1Y2Nlc3M7Cit9CisKKy8qCisgKiBHUkFOVEVEOiBBIHNlcnZlciBjYWxscyB1cyB0byB0ZWxsIHRoYXQgYSBwcm9jZXNzJyBsb2NrIHJlcXVlc3QKKyAqIHdhcyBncmFudGVkCisgKi8KK3N0YXRpYyBpbnQKK25sbTRzdmNfcHJvY19ncmFudGVkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKKwkJCQkgICAgICAgICAgICBzdHJ1Y3QgbmxtX3JlcyAgKnJlc3ApCit7CisJcmVzcC0+Y29va2llID0gYXJncC0+Y29va2llOworCisJZHByaW50aygibG9ja2Q6IEdSQU5URUQgICAgICAgY2FsbGVkXG4iKTsKKwlyZXNwLT5zdGF0dXMgPSBubG1jbG50X2dyYW50KCZhcmdwLT5sb2NrKTsKKwlkcHJpbnRrKCJsb2NrZDogR1JBTlRFRCAgICAgICBzdGF0dXMgJWRcbiIsIG50b2hsKHJlc3AtPnN0YXR1cykpOworCXJldHVybiBycGNfc3VjY2VzczsKK30KKworLyoKKyAqIGBBc3luYycgdmVyc2lvbnMgb2YgdGhlIGFib3ZlIHNlcnZpY2Ugcm91dGluZXMuIFRoZXkgYXJlbid0IHJlYWxseSwKKyAqIGJlY2F1c2Ugd2Ugc2VuZCB0aGUgY2FsbGJhY2sgYmVmb3JlIHRoZSByZXBseSBwcm9wZXIuIEkgaG9wZSB0aGlzCisgKiBkb2Vzbid0IGJyZWFrIGFueSBjbGllbnRzLgorICovCitzdGF0aWMgaW50CitubG00c3ZjX3Byb2NfdGVzdF9tc2coc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAorCQkJCQkgICAgIHZvaWQJICAgICAqcmVzcCkKK3sKKwlzdHJ1Y3QgbmxtX3JlcwlyZXM7CisJdTMyCQlzdGF0OworCisJZHByaW50aygibG9ja2Q6IFRFU1RfTVNHICAgICAgY2FsbGVkXG4iKTsKKwltZW1zZXQoJnJlcywgMCwgc2l6ZW9mKHJlcykpOworCisJaWYgKChzdGF0ID0gbmxtNHN2Y19wcm9jX3Rlc3QocnFzdHAsIGFyZ3AsICZyZXMpKSA9PSAwKQorCQlzdGF0ID0gbmxtNHN2Y19jYWxsYmFjayhycXN0cCwgTkxNUFJPQ19URVNUX1JFUywgJnJlcyk7CisJcmV0dXJuIHN0YXQ7Cit9CisKK3N0YXRpYyBpbnQKK25sbTRzdmNfcHJvY19sb2NrX21zZyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCisJCQkJCSAgICAgdm9pZAkgICAgICpyZXNwKQoreworCXN0cnVjdCBubG1fcmVzCXJlczsKKwl1MzIJCXN0YXQ7CisKKwlkcHJpbnRrKCJsb2NrZDogTE9DS19NU0cgICAgICBjYWxsZWRcbiIpOworCW1lbXNldCgmcmVzLCAwLCBzaXplb2YocmVzKSk7CisKKwlpZiAoKHN0YXQgPSBubG00c3ZjX3Byb2NfbG9jayhycXN0cCwgYXJncCwgJnJlcykpID09IDApCisJCXN0YXQgPSBubG00c3ZjX2NhbGxiYWNrKHJxc3RwLCBOTE1QUk9DX0xPQ0tfUkVTLCAmcmVzKTsKKwlyZXR1cm4gc3RhdDsKK30KKworc3RhdGljIGludAorbmxtNHN2Y19wcm9jX2NhbmNlbF9tc2coc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAorCQkJCQkgICAgICAgdm9pZAkgICAgICAgKnJlc3ApCit7CisJc3RydWN0IG5sbV9yZXMJcmVzOworCXUzMgkJc3RhdDsKKworCWRwcmludGsoImxvY2tkOiBDQU5DRUxfTVNHICAgIGNhbGxlZFxuIik7CisJbWVtc2V0KCZyZXMsIDAsIHNpemVvZihyZXMpKTsKKworCWlmICgoc3RhdCA9IG5sbTRzdmNfcHJvY19jYW5jZWwocnFzdHAsIGFyZ3AsICZyZXMpKSA9PSAwKQorCQlzdGF0ID0gbmxtNHN2Y19jYWxsYmFjayhycXN0cCwgTkxNUFJPQ19DQU5DRUxfUkVTLCAmcmVzKTsKKwlyZXR1cm4gc3RhdDsKK30KKworc3RhdGljIGludAorbmxtNHN2Y19wcm9jX3VubG9ja19tc2coc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgKnJlc3ApCit7CisJc3RydWN0IG5sbV9yZXMJcmVzOworCXUzMgkJc3RhdDsKKworCWRwcmludGsoImxvY2tkOiBVTkxPQ0tfTVNHICAgIGNhbGxlZFxuIik7CisJbWVtc2V0KCZyZXMsIDAsIHNpemVvZihyZXMpKTsKKworCWlmICgoc3RhdCA9IG5sbTRzdmNfcHJvY191bmxvY2socnFzdHAsIGFyZ3AsICZyZXMpKSA9PSAwKQorCQlzdGF0ID0gbmxtNHN2Y19jYWxsYmFjayhycXN0cCwgTkxNUFJPQ19VTkxPQ0tfUkVTLCAmcmVzKTsKKwlyZXR1cm4gc3RhdDsKK30KKworc3RhdGljIGludAorbmxtNHN2Y19wcm9jX2dyYW50ZWRfbXNnKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqcmVzcCkKK3sKKwlzdHJ1Y3QgbmxtX3JlcwlyZXM7CisJdTMyCQlzdGF0OworCisJZHByaW50aygibG9ja2Q6IEdSQU5URURfTVNHICAgY2FsbGVkXG4iKTsKKwltZW1zZXQoJnJlcywgMCwgc2l6ZW9mKHJlcykpOworCisJaWYgKChzdGF0ID0gbmxtNHN2Y19wcm9jX2dyYW50ZWQocnFzdHAsIGFyZ3AsICZyZXMpKSA9PSAwKQorCQlzdGF0ID0gbmxtNHN2Y19jYWxsYmFjayhycXN0cCwgTkxNUFJPQ19HUkFOVEVEX1JFUywgJnJlcyk7CisJcmV0dXJuIHN0YXQ7Cit9CisKKy8qCisgKiBTSEFSRTogY3JlYXRlIGEgRE9TIHNoYXJlIG9yIGFsdGVyIGV4aXN0aW5nIHNoYXJlLgorICovCitzdGF0aWMgaW50CitubG00c3ZjX3Byb2Nfc2hhcmUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAorCQkJCSAgICAgICAgICBzdHJ1Y3QgbmxtX3JlcyAgKnJlc3ApCit7CisJc3RydWN0IG5sbV9ob3N0CSpob3N0OworCXN0cnVjdCBubG1fZmlsZQkqZmlsZTsKKworCWRwcmludGsoImxvY2tkOiBTSEFSRSAgICAgICAgIGNhbGxlZFxuIik7CisKKwlyZXNwLT5jb29raWUgPSBhcmdwLT5jb29raWU7CisKKwkvKiBEb24ndCBhY2NlcHQgbmV3IGxvY2sgcmVxdWVzdHMgZHVyaW5nIGdyYWNlIHBlcmlvZCAqLworCWlmIChubG1zdmNfZ3JhY2VfcGVyaW9kICYmICFhcmdwLT5yZWNsYWltKSB7CisJCXJlc3AtPnN0YXR1cyA9IG5sbV9sY2tfZGVuaWVkX2dyYWNlX3BlcmlvZDsKKwkJcmV0dXJuIHJwY19zdWNjZXNzOworCX0KKworCS8qIE9idGFpbiBjbGllbnQgYW5kIGZpbGUgKi8KKwlpZiAoKHJlc3AtPnN0YXR1cyA9IG5sbTRzdmNfcmV0cmlldmVfYXJncyhycXN0cCwgYXJncCwgJmhvc3QsICZmaWxlKSkpCisJCXJldHVybiBycGNfc3VjY2VzczsKKworCS8qIE5vdyB0cnkgdG8gY3JlYXRlIHRoZSBzaGFyZSAqLworCXJlc3AtPnN0YXR1cyA9IG5sbXN2Y19zaGFyZV9maWxlKGhvc3QsIGZpbGUsIGFyZ3ApOworCisJZHByaW50aygibG9ja2Q6IFNIQVJFICAgICAgICAgc3RhdHVzICVkXG4iLCBudG9obChyZXNwLT5zdGF0dXMpKTsKKwlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCW5sbV9yZWxlYXNlX2ZpbGUoZmlsZSk7CisJcmV0dXJuIHJwY19zdWNjZXNzOworfQorCisvKgorICogVU5TSEFSRTogUmVsZWFzZSBhIERPUyBzaGFyZS4KKyAqLworc3RhdGljIGludAorbmxtNHN2Y19wcm9jX3Vuc2hhcmUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAorCQkJCSAgICAgICAgICAgIHN0cnVjdCBubG1fcmVzICAqcmVzcCkKK3sKKwlzdHJ1Y3QgbmxtX2hvc3QJKmhvc3Q7CisJc3RydWN0IG5sbV9maWxlCSpmaWxlOworCisJZHByaW50aygibG9ja2Q6IFVOU0hBUkUgICAgICAgY2FsbGVkXG4iKTsKKworCXJlc3AtPmNvb2tpZSA9IGFyZ3AtPmNvb2tpZTsKKworCS8qIERvbid0IGFjY2VwdCByZXF1ZXN0cyBkdXJpbmcgZ3JhY2UgcGVyaW9kICovCisJaWYgKG5sbXN2Y19ncmFjZV9wZXJpb2QpIHsKKwkJcmVzcC0+c3RhdHVzID0gbmxtX2xja19kZW5pZWRfZ3JhY2VfcGVyaW9kOworCQlyZXR1cm4gcnBjX3N1Y2Nlc3M7CisJfQorCisJLyogT2J0YWluIGNsaWVudCBhbmQgZmlsZSAqLworCWlmICgocmVzcC0+c3RhdHVzID0gbmxtNHN2Y19yZXRyaWV2ZV9hcmdzKHJxc3RwLCBhcmdwLCAmaG9zdCwgJmZpbGUpKSkKKwkJcmV0dXJuIHJwY19zdWNjZXNzOworCisJLyogTm93IHRyeSB0byBsb2NrIHRoZSBmaWxlICovCisJcmVzcC0+c3RhdHVzID0gbmxtc3ZjX3Vuc2hhcmVfZmlsZShob3N0LCBmaWxlLCBhcmdwKTsKKworCWRwcmludGsoImxvY2tkOiBVTlNIQVJFICAgICAgIHN0YXR1cyAlZFxuIiwgbnRvaGwocmVzcC0+c3RhdHVzKSk7CisJbmxtX3JlbGVhc2VfaG9zdChob3N0KTsKKwlubG1fcmVsZWFzZV9maWxlKGZpbGUpOworCXJldHVybiBycGNfc3VjY2VzczsKK30KKworLyoKKyAqIE5NX0xPQ0s6IENyZWF0ZSBhbiB1bm1vbml0b3JlZCBsb2NrCisgKi8KK3N0YXRpYyBpbnQKK25sbTRzdmNfcHJvY19ubV9sb2NrKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKKwkJCQkgICAgICAgICAgICBzdHJ1Y3QgbmxtX3JlcyAgKnJlc3ApCit7CisJZHByaW50aygibG9ja2Q6IE5NX0xPQ0sgICAgICAgY2FsbGVkXG4iKTsKKworCWFyZ3AtPm1vbml0b3IgPSAwOwkJLyoganVzdCBjbGVhbiB0aGUgbW9uaXRvciBmbGFnICovCisJcmV0dXJuIG5sbTRzdmNfcHJvY19sb2NrKHJxc3RwLCBhcmdwLCByZXNwKTsKK30KKworLyoKKyAqIEZSRUVfQUxMOiBSZWxlYXNlIGFsbCBsb2NrcyBhbmQgc2hhcmVzIGhlbGQgYnkgY2xpZW50CisgKi8KK3N0YXRpYyBpbnQKK25sbTRzdmNfcHJvY19mcmVlX2FsbChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCisJCQkJCSAgICAgdm9pZCAgICAgICAgICAgICpyZXNwKQoreworCXN0cnVjdCBubG1faG9zdAkqaG9zdDsKKworCS8qIE9idGFpbiBjbGllbnQgKi8KKwlpZiAobmxtNHN2Y19yZXRyaWV2ZV9hcmdzKHJxc3RwLCBhcmdwLCAmaG9zdCwgTlVMTCkpCisJCXJldHVybiBycGNfc3VjY2VzczsKKworCW5sbXN2Y19mcmVlX2hvc3RfcmVzb3VyY2VzKGhvc3QpOworCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJcmV0dXJuIHJwY19zdWNjZXNzOworfQorCisvKgorICogU01fTk9USUZZOiBwcml2YXRlIGNhbGxiYWNrIGZyb20gc3RhdGQgKG5vdCBwYXJ0IG9mIG9mZmljaWFsIE5MTSBwcm90bykKKyAqLworc3RhdGljIGludAorbmxtNHN2Y19wcm9jX3NtX25vdGlmeShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX3JlYm9vdCAqYXJncCwKKwkJCQkJICAgICAgdm9pZAkgICAgICAgICpyZXNwKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbglzYWRkciA9IHJxc3RwLT5ycV9hZGRyOworCWludAkJCXZlcnMgPSBhcmdwLT52ZXJzOworCWludAkJCXByb3QgPSBhcmdwLT5wcm90byA+PiAxOworCisJc3RydWN0IG5sbV9ob3N0CQkqaG9zdDsKKworCWRwcmludGsoImxvY2tkOiBTTV9OT1RJRlkgICAgIGNhbGxlZFxuIik7CisJaWYgKHNhZGRyLnNpbl9hZGRyLnNfYWRkciAhPSBodG9ubChJTkFERFJfTE9PUEJBQ0spCisJIHx8IG50b2hzKHNhZGRyLnNpbl9wb3J0KSA+PSAxMDI0KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSJsb2NrZDogcmVqZWN0ZWQgTlNNIGNhbGxiYWNrIGZyb20gJTA4eDolZFxuIiwKKwkJCW50b2hsKHJxc3RwLT5ycV9hZGRyLnNpbl9hZGRyLnNfYWRkciksCisJCQludG9ocyhycXN0cC0+cnFfYWRkci5zaW5fcG9ydCkpOworCQlyZXR1cm4gcnBjX3N5c3RlbV9lcnI7CisJfQorCisJLyogT2J0YWluIHRoZSBob3N0IHBvaW50ZXIgZm9yIHRoaXMgTkZTIHNlcnZlciBhbmQgdHJ5IHRvCisJICogcmVjbGFpbSBhbGwgbG9ja3Mgd2UgaG9sZCBvbiB0aGlzIHNlcnZlci4KKwkgKi8KKwlzYWRkci5zaW5fYWRkci5zX2FkZHIgPSBhcmdwLT5hZGRyOworCisJaWYgKChhcmdwLT5wcm90byAmIDEpPT0wKSB7CisJCWlmICgoaG9zdCA9IG5sbWNsbnRfbG9va3VwX2hvc3QoJnNhZGRyLCBwcm90LCB2ZXJzKSkgIT0gTlVMTCkgeworCQkJbmxtY2xudF9yZWNvdmVyeShob3N0LCBhcmdwLT5zdGF0ZSk7CisJCQlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCQl9CisJfSBlbHNlIHsKKwkJLyogSWYgd2UgcnVuIG9uIGFuIE5GUyBzZXJ2ZXIsIGRlbGV0ZSBhbGwgbG9ja3MgaGVsZCBieSB0aGUgY2xpZW50ICovCisKKwkJaWYgKChob3N0ID0gbmxtX2xvb2t1cF9ob3N0KDEsICZzYWRkciwgcHJvdCwgdmVycykpICE9IE5VTEwpIHsKKwkJCW5sbXN2Y19mcmVlX2hvc3RfcmVzb3VyY2VzKGhvc3QpOworCQkJbmxtX3JlbGVhc2VfaG9zdChob3N0KTsKKwkJfQorCX0KKwlyZXR1cm4gcnBjX3N1Y2Nlc3M7Cit9CisKKy8qCisgKiBjbGllbnQgc2VudCBhIEdSQU5URURfUkVTLCBsZXQncyByZW1vdmUgdGhlIGFzc29jaWF0ZWQgYmxvY2sKKyAqLworc3RhdGljIGludAorbmxtNHN2Y19wcm9jX2dyYW50ZWRfcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fcmVzICAqYXJncCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqcmVzcCkKK3sKKyAgICAgICAgaWYgKCFubG1zdmNfb3BzKQorICAgICAgICAgICAgICAgIHJldHVybiBycGNfc3VjY2VzczsKKworICAgICAgICBkcHJpbnRrKCJsb2NrZDogR1JBTlRFRF9SRVMgICBjYWxsZWRcbiIpOworCisgICAgICAgIG5sbXN2Y19ncmFudF9yZXBseShycXN0cCwgJmFyZ3AtPmNvb2tpZSwgYXJncC0+c3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIHJwY19zdWNjZXNzOworfQorCisKKworLyoKKyAqIFRoaXMgaXMgdGhlIGdlbmVyaWMgbG9ja2QgY2FsbGJhY2sgZm9yIGFzeW5jIFJQQyBjYWxscworICovCitzdGF0aWMgdTMyCitubG00c3ZjX2NhbGxiYWNrKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiBwcm9jLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKK3sKKwlzdHJ1Y3QgbmxtX2hvc3QJKmhvc3Q7CisJc3RydWN0IG5sbV9ycXN0CSpjYWxsOworCisJaWYgKCEoY2FsbCA9IG5sbWNsbnRfYWxsb2NfY2FsbCgpKSkKKwkJcmV0dXJuIHJwY19zeXN0ZW1fZXJyOworCisJaG9zdCA9IG5sbWNsbnRfbG9va3VwX2hvc3QoJnJxc3RwLT5ycV9hZGRyLAorCQkJCXJxc3RwLT5ycV9wcm90LCBycXN0cC0+cnFfdmVycyk7CisJaWYgKCFob3N0KSB7CisJCWtmcmVlKGNhbGwpOworCQlyZXR1cm4gcnBjX3N5c3RlbV9lcnI7CisJfQorCisJY2FsbC0+YV9mbGFncyA9IFJQQ19UQVNLX0FTWU5DOworCWNhbGwtPmFfaG9zdCAgPSBob3N0OworCW1lbWNweSgmY2FsbC0+YV9hcmdzLCByZXNwLCBzaXplb2YoKnJlc3ApKTsKKworCWlmIChubG1zdmNfYXN5bmNfY2FsbChjYWxsLCBwcm9jLCBubG00c3ZjX2NhbGxiYWNrX2V4aXQpIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXJldHVybiBycGNfc3VjY2VzczsKKyBlcnJvcjoKKwlrZnJlZShjYWxsKTsKKwlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCXJldHVybiBycGNfc3lzdGVtX2VycjsKK30KKworc3RhdGljIHZvaWQKK25sbTRzdmNfY2FsbGJhY2tfZXhpdChzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IG5sbV9ycXN0CSpjYWxsID0gKHN0cnVjdCBubG1fcnFzdCAqKSB0YXNrLT50a19jYWxsZGF0YTsKKworCWlmICh0YXNrLT50a19zdGF0dXMgPCAwKSB7CisJCWRwcmludGsoImxvY2tkOiAlNGQgY2FsbGJhY2sgZmFpbGVkIChlcnJubyA9ICVkKVxuIiwKKwkJCQkJdGFzay0+dGtfcGlkLCAtdGFzay0+dGtfc3RhdHVzKTsKKwl9CisJbmxtX3JlbGVhc2VfaG9zdChjYWxsLT5hX2hvc3QpOworCWtmcmVlKGNhbGwpOworfQorCisvKgorICogTkxNIFNlcnZlciBwcm9jZWR1cmVzLgorICovCisKKyNkZWZpbmUgbmxtNHN2Y19lbmNvZGVfbm9yZXAJbmxtNHN2Y19lbmNvZGVfdm9pZAorI2RlZmluZSBubG00c3ZjX2RlY29kZV9ub3JlcAlubG00c3ZjX2RlY29kZV92b2lkCisjZGVmaW5lIG5sbTRzdmNfZGVjb2RlX3Rlc3RyZXMJbmxtNHN2Y19kZWNvZGVfdm9pZAorI2RlZmluZSBubG00c3ZjX2RlY29kZV9sb2NrcmVzCW5sbTRzdmNfZGVjb2RlX3ZvaWQKKyNkZWZpbmUgbmxtNHN2Y19kZWNvZGVfdW5sb2NrcmVzCW5sbTRzdmNfZGVjb2RlX3ZvaWQKKyNkZWZpbmUgbmxtNHN2Y19kZWNvZGVfY2FuY2VscmVzCW5sbTRzdmNfZGVjb2RlX3ZvaWQKKyNkZWZpbmUgbmxtNHN2Y19kZWNvZGVfZ3JhbnRlZHJlcwlubG00c3ZjX2RlY29kZV92b2lkCisKKyNkZWZpbmUgbmxtNHN2Y19wcm9jX25vbmUJbmxtNHN2Y19wcm9jX251bGwKKyNkZWZpbmUgbmxtNHN2Y19wcm9jX3Rlc3RfcmVzCW5sbTRzdmNfcHJvY19udWxsCisjZGVmaW5lIG5sbTRzdmNfcHJvY19sb2NrX3JlcwlubG00c3ZjX3Byb2NfbnVsbAorI2RlZmluZSBubG00c3ZjX3Byb2NfY2FuY2VsX3JlcwlubG00c3ZjX3Byb2NfbnVsbAorI2RlZmluZSBubG00c3ZjX3Byb2NfdW5sb2NrX3JlcwlubG00c3ZjX3Byb2NfbnVsbAorCitzdHJ1Y3QgbmxtX3ZvaWQJCQl7IGludCBkdW1teTsgfTsKKworI2RlZmluZSBQUk9DKG5hbWUsIHhhcmd0LCB4cmVzdCwgYXJndCwgcmVzdCwgcmVzcHNpemUpCVwKKyB7IC5wY19mdW5jCT0gKHN2Y19wcm9jZnVuYykgbmxtNHN2Y19wcm9jXyMjbmFtZSwJXAorICAgLnBjX2RlY29kZQk9IChreGRycHJvY190KSBubG00c3ZjX2RlY29kZV8jI3hhcmd0LAlcCisgICAucGNfZW5jb2RlCT0gKGt4ZHJwcm9jX3QpIG5sbTRzdmNfZW5jb2RlXyMjeHJlc3QsCVwKKyAgIC5wY19yZWxlYXNlCT0gTlVMTCwJCQkJCVwKKyAgIC5wY19hcmdzaXplCT0gc2l6ZW9mKHN0cnVjdCBubG1fIyNhcmd0KSwJCVwKKyAgIC5wY19yZXNzaXplCT0gc2l6ZW9mKHN0cnVjdCBubG1fIyNyZXN0KSwJCVwKKyAgIC5wY194ZHJyZXNzaXplID0gcmVzcHNpemUsCQkJCVwKKyB9CisjZGVmaW5lCUNrCSgxK1hEUl9RVUFETEVOKE5MTV9NQVhDT09LSUVMRU4pKQkvKiBjb29raWUgKi8KKyNkZWZpbmUJTm8JKDErMTAyNC80KQkJCQkvKiBuZXRvYmogKi8KKyNkZWZpbmUJU3QJMQkJCQkJLyogc3RhdHVzICovCisjZGVmaW5lCVJnCTQJCQkJCS8qIHJhbmdlIChvZmZzZXQgKyBsZW5ndGgpICovCitzdHJ1Y3Qgc3ZjX3Byb2NlZHVyZQkJbmxtc3ZjX3Byb2NlZHVyZXM0W10gPSB7CisgIFBST0MobnVsbCwJCXZvaWQsCQl2b2lkLAkJdm9pZCwJdm9pZCwgMSksCisgIFBST0ModGVzdCwJCXRlc3RhcmdzLAl0ZXN0cmVzLAlhcmdzLAlyZXMsIENrK1N0KzIrTm8rUmcpLAorICBQUk9DKGxvY2ssCQlsb2NrYXJncywJcmVzLAkJYXJncywJcmVzLCBDaytTdCksCisgIFBST0MoY2FuY2VsLAkJY2FuY2FyZ3MsCXJlcywJCWFyZ3MsCXJlcywgQ2srU3QpLAorICBQUk9DKHVubG9jaywJCXVubG9ja2FyZ3MsCXJlcywJCWFyZ3MsCXJlcywgQ2srU3QpLAorICBQUk9DKGdyYW50ZWQsCQl0ZXN0YXJncywJcmVzLAkJYXJncywJcmVzLCBDaytTdCksCisgIFBST0ModGVzdF9tc2csCXRlc3RhcmdzLAlub3JlcCwJCWFyZ3MsCXZvaWQsIDEpLAorICBQUk9DKGxvY2tfbXNnLAlsb2NrYXJncywJbm9yZXAsCQlhcmdzLAl2b2lkLCAxKSwKKyAgUFJPQyhjYW5jZWxfbXNnLAljYW5jYXJncywJbm9yZXAsCQlhcmdzLAl2b2lkLCAxKSwKKyAgUFJPQyh1bmxvY2tfbXNnLAl1bmxvY2thcmdzLAlub3JlcCwJCWFyZ3MsCXZvaWQsIDEpLAorICBQUk9DKGdyYW50ZWRfbXNnLAl0ZXN0YXJncywJbm9yZXAsCQlhcmdzLAl2b2lkLCAxKSwKKyAgUFJPQyh0ZXN0X3JlcywJdGVzdHJlcywJbm9yZXAsCQlyZXMsCXZvaWQsIDEpLAorICBQUk9DKGxvY2tfcmVzLAlsb2NrcmVzLAlub3JlcCwJCXJlcywJdm9pZCwgMSksCisgIFBST0MoY2FuY2VsX3JlcywJY2FuY2VscmVzLAlub3JlcCwJCXJlcywJdm9pZCwgMSksCisgIFBST0ModW5sb2NrX3JlcywJdW5sb2NrcmVzLAlub3JlcCwJCXJlcywJdm9pZCwgMSksCisgIFBST0MoZ3JhbnRlZF9yZXMsCXJlcywJCW5vcmVwLAkJcmVzLAl2b2lkLCAxKSwKKyAgLyogc3RhdGQgY2FsbGJhY2sgKi8KKyAgUFJPQyhzbV9ub3RpZnksCXJlYm9vdCwJCXZvaWQsCQlyZWJvb3QsCXZvaWQsIDEpLAorICBQUk9DKG5vbmUsCQl2b2lkLAkJdm9pZCwJCXZvaWQsCXZvaWQsIDApLAorICBQUk9DKG5vbmUsCQl2b2lkLAkJdm9pZCwJCXZvaWQsCXZvaWQsIDApLAorICBQUk9DKG5vbmUsCQl2b2lkLAkJdm9pZCwJCXZvaWQsCXZvaWQsIDApLAorICBQUk9DKHNoYXJlLAkJc2hhcmVhcmdzLAlzaGFyZXJlcywJYXJncywJcmVzLCBDaytTdCsxKSwKKyAgUFJPQyh1bnNoYXJlLAkJc2hhcmVhcmdzLAlzaGFyZXJlcywJYXJncywJcmVzLCBDaytTdCsxKSwKKyAgUFJPQyhubV9sb2NrLAkJbG9ja2FyZ3MsCXJlcywJCWFyZ3MsCXJlcywgQ2srU3QpLAorICBQUk9DKGZyZWVfYWxsLAlub3RpZnksCQl2b2lkLAkJYXJncywJdm9pZCwgMSksCisKK307CmRpZmYgLS1naXQgYS9mcy9sb2NrZC9zdmNsb2NrLmMgYi9mcy9sb2NrZC9zdmNsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmOTU5NwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2xvY2tkL3N2Y2xvY2suYwpAQCAtMCwwICsxLDY4NiBAQAorLyoKKyAqIGxpbnV4L2ZzL2xvY2tkL3N2Y2xvY2suYworICoKKyAqIEhhbmRsaW5nIG9mIHNlcnZlci1zaWRlIGxvY2tzLCBtb3N0bHkgb2YgdGhlIGJsb2NrZWQgdmFyaWV0eS4KKyAqIFRoaXMgaXMgdGhlIHVnbGllc3QgcGFydCBvZiBsb2NrZCBiZWNhdXNlIHdlIHRyZWFkIG9uIHZlcnkgdGhpbiBpY2UuCisgKiBHUkFOVCBhbmQgQ0FOQ0VMIGNhbGxzIG1heSBnZXQgc3R1Y2ssIG1lZXQgaW4gbWlkLWZsaWdodCwgZXRjLgorICogSU1OU0hPIGludHJvZHVjaW5nIHRoZSBncmFudCBjYWxsYmFjayBpbnRvIHRoZSBOTE0gcHJvdG9jb2wgd2FzIG9uZQorICogb2YgdGhlIHdvcnN0IGlkZWFzIFN1biBldmVyIGhhZC4gRXhjZXB0IG1heWJlIGZvciB0aGUgaWRlYSBvZiBkb2luZworICogTkZTIGZpbGUgbG9ja2luZyBhdCBhbGwuCisgKgorICogSSdtIHRyeWluZyBoYXJkIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9ucyBieSBwcm90ZWN0aW5nIG1vc3QgYWNjZXNzZXMKKyAqIHRvIGEgZmlsZSdzIGxpc3Qgb2YgYmxvY2tlZCBsb2NrcyB0aHJvdWdoIGEgc2VtYXBob3JlLiBUaGUgZ2xvYmFsCisgKiBsaXN0IG9mIGJsb2NrZWQgbG9ja3MgaXMgbm90IHByb3RlY3RlZCBpbiB0aGlzIGZhc2hpb24gaG93ZXZlci4KKyAqIFRoZXJlZm9yZSwgc29tZSBmdW5jdGlvbnMgKHN1Y2ggYXMgdGhlIFJQQyBjYWxsYmFjayBmb3IgdGhlIGFzeW5jIGdyYW50CisgKiBjYWxsKSBtb3ZlIGJsb2NrZWQgbG9ja3MgdG93YXJkcyB0aGUgaGVhZCBvZiB0aGUgbGlzdCAqd2hpbGUgc29tZSBvdGhlcgorICogcHJvY2VzcyBtaWdodCBiZSB0cmF2ZXJzaW5nIGl0Ki4gVGhpcyBzaG91bGQgbm90IGJlIGEgcHJvYmxlbSBpbgorICogcHJhY3RpY2UsIGJlY2F1c2UgdGhpcyB3aWxsIG9ubHkgY2F1c2UgZnVuY3Rpb25zIHRyYXZlcnNpbmcgdGhlIGxpc3QKKyAqIHRvIHZpc2l0IHNvbWUgYmxvY2tzIHR3aWNlLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CisjaW5jbHVkZSA8bGludXgvbG9ja2QvbmxtLmg+CisjaW5jbHVkZSA8bGludXgvbG9ja2QvbG9ja2QuaD4KKworI2RlZmluZSBOTE1EQkdfRkFDSUxJVFkJCU5MTURCR19TVkNMT0NLCisKKyNpZmRlZiBDT05GSUdfTE9DS0RfVjQKKyNkZWZpbmUgbmxtX2RlYWRsb2NrCW5sbTRfZGVhZGxvY2sKKyNlbHNlCisjZGVmaW5lIG5sbV9kZWFkbG9jawlubG1fbGNrX2RlbmllZAorI2VuZGlmCisKK3N0YXRpYyB2b2lkCW5sbXN2Y19pbnNlcnRfYmxvY2soc3RydWN0IG5sbV9ibG9jayAqYmxvY2ssIHVuc2lnbmVkIGxvbmcpOworc3RhdGljIGludAlubG1zdmNfcmVtb3ZlX2Jsb2NrKHN0cnVjdCBubG1fYmxvY2sgKmJsb2NrKTsKK3N0YXRpYyB2b2lkCW5sbXN2Y19ncmFudF9jYWxsYmFjayhzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spOworCisvKgorICogVGhlIGxpc3Qgb2YgYmxvY2tlZCBsb2NrcyB0byByZXRyeQorICovCitzdGF0aWMgc3RydWN0IG5sbV9ibG9jayAqCW5sbV9ibG9ja2VkOworCisvKgorICogSW5zZXJ0IGEgYmxvY2tlZCBsb2NrIGludG8gdGhlIGdsb2JhbCBsaXN0CisgKi8KK3N0YXRpYyB2b2lkCitubG1zdmNfaW5zZXJ0X2Jsb2NrKHN0cnVjdCBubG1fYmxvY2sgKmJsb2NrLCB1bnNpZ25lZCBsb25nIHdoZW4pCit7CisJc3RydWN0IG5sbV9ibG9jayAqKmJwLCAqYjsKKworCWRwcmludGsoImxvY2tkOiBubG1zdmNfaW5zZXJ0X2Jsb2NrKCVwLCAlbGQpXG4iLCBibG9jaywgd2hlbik7CisJaWYgKGJsb2NrLT5iX3F1ZXVlZCkKKwkJbmxtc3ZjX3JlbW92ZV9ibG9jayhibG9jayk7CisJYnAgPSAmbmxtX2Jsb2NrZWQ7CisJaWYgKHdoZW4gIT0gTkxNX05FVkVSKSB7CisJCWlmICgod2hlbiArPSBqaWZmaWVzKSA9PSBOTE1fTkVWRVIpCisJCQl3aGVuICsrOworCQl3aGlsZSAoKGIgPSAqYnApICYmIHRpbWVfYmVmb3JlX2VxKGItPmJfd2hlbix3aGVuKSAmJiBiLT5iX3doZW4gIT0gTkxNX05FVkVSKQorCQkJYnAgPSAmYi0+Yl9uZXh0OworCX0gZWxzZQorCQl3aGlsZSAoKGIgPSAqYnApICE9IDApCisJCQlicCA9ICZiLT5iX25leHQ7CisKKwlibG9jay0+Yl9xdWV1ZWQgPSAxOworCWJsb2NrLT5iX3doZW4gPSB3aGVuOworCWJsb2NrLT5iX25leHQgPSBiOworCSpicCA9IGJsb2NrOworfQorCisvKgorICogUmVtb3ZlIGEgYmxvY2sgZnJvbSB0aGUgZ2xvYmFsIGxpc3QKKyAqLworc3RhdGljIGludAorbmxtc3ZjX3JlbW92ZV9ibG9jayhzdHJ1Y3QgbmxtX2Jsb2NrICpibG9jaykKK3sKKwlzdHJ1Y3QgbmxtX2Jsb2NrICoqYnAsICpiOworCisJaWYgKCFibG9jay0+Yl9xdWV1ZWQpCisJCXJldHVybiAxOworCWZvciAoYnAgPSAmbmxtX2Jsb2NrZWQ7IChiID0gKmJwKSAhPSAwOyBicCA9ICZiLT5iX25leHQpIHsKKwkJaWYgKGIgPT0gYmxvY2spIHsKKwkJCSpicCA9IGJsb2NrLT5iX25leHQ7CisJCQlibG9jay0+Yl9xdWV1ZWQgPSAwOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZpbmQgYSBibG9jayBmb3IgYSBnaXZlbiBsb2NrIGFuZCBvcHRpb25hbGx5IHJlbW92ZSBpdCBmcm9tCisgKiB0aGUgbGlzdC4KKyAqLworc3RhdGljIHN0cnVjdCBubG1fYmxvY2sgKgorbmxtc3ZjX2xvb2t1cF9ibG9jayhzdHJ1Y3QgbmxtX2ZpbGUgKmZpbGUsIHN0cnVjdCBubG1fbG9jayAqbG9jaywgaW50IHJlbW92ZSkKK3sKKwlzdHJ1Y3QgbmxtX2Jsb2NrCSoqaGVhZCwgKmJsb2NrOworCXN0cnVjdCBmaWxlX2xvY2sJKmZsOworCisJZHByaW50aygibG9ja2Q6IG5sbXN2Y19sb29rdXBfYmxvY2sgZj0lcCBwZD0lZCAlTGQtJUxkIHR5PSVkXG4iLAorCQkJCWZpbGUsIGxvY2stPmZsLmZsX3BpZCwKKwkJCQkobG9uZyBsb25nKWxvY2stPmZsLmZsX3N0YXJ0LAorCQkJCShsb25nIGxvbmcpbG9jay0+ZmwuZmxfZW5kLCBsb2NrLT5mbC5mbF90eXBlKTsKKwlmb3IgKGhlYWQgPSAmbmxtX2Jsb2NrZWQ7IChibG9jayA9ICpoZWFkKSAhPSAwOyBoZWFkID0gJmJsb2NrLT5iX25leHQpIHsKKwkJZmwgPSAmYmxvY2stPmJfY2FsbC5hX2FyZ3MubG9jay5mbDsKKwkJZHByaW50aygibG9ja2Q6IGNoZWNrIGY9JXAgcGQ9JWQgJUxkLSVMZCB0eT0lZCBjb29raWU9JXNcbiIsCisJCQkJYmxvY2stPmJfZmlsZSwgZmwtPmZsX3BpZCwKKwkJCQkobG9uZyBsb25nKWZsLT5mbF9zdGFydCwKKwkJCQkobG9uZyBsb25nKWZsLT5mbF9lbmQsIGZsLT5mbF90eXBlLAorCQkJCW5sbWRiZ19jb29raWUyYSgmYmxvY2stPmJfY2FsbC5hX2FyZ3MuY29va2llKSk7CisJCWlmIChibG9jay0+Yl9maWxlID09IGZpbGUgJiYgbmxtX2NvbXBhcmVfbG9ja3MoZmwsICZsb2NrLT5mbCkpIHsKKwkJCWlmIChyZW1vdmUpIHsKKwkJCQkqaGVhZCA9IGJsb2NrLT5iX25leHQ7CisJCQkJYmxvY2stPmJfcXVldWVkID0gMDsKKwkJCX0KKwkJCXJldHVybiBibG9jazsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIGludCBubG1fY29va2llX21hdGNoKHN0cnVjdCBubG1fY29va2llICphLCBzdHJ1Y3QgbmxtX2Nvb2tpZSAqYikKK3sKKwlpZihhLT5sZW4gIT0gYi0+bGVuKQorCQlyZXR1cm4gMDsKKwlpZihtZW1jbXAoYS0+ZGF0YSxiLT5kYXRhLGEtPmxlbikpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKgorICogRmluZCBhIGJsb2NrIHdpdGggYSBnaXZlbiBOTE0gY29va2llLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBubG1fYmxvY2sgKgorbmxtc3ZjX2ZpbmRfYmxvY2soc3RydWN0IG5sbV9jb29raWUgKmNvb2tpZSwgIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luKQoreworCXN0cnVjdCBubG1fYmxvY2sgKmJsb2NrOworCisJZm9yIChibG9jayA9IG5sbV9ibG9ja2VkOyBibG9jazsgYmxvY2sgPSBibG9jay0+Yl9uZXh0KSB7CisJCWRwcmludGsoImNvb2tpZTogaGVhZCBvZiBibG9ja2VkIHF1ZXVlICVwLCBibG9jayAlcFxuIiwgCisJCQlubG1fYmxvY2tlZCwgYmxvY2spOworCQlpZiAobmxtX2Nvb2tpZV9tYXRjaCgmYmxvY2stPmJfY2FsbC5hX2FyZ3MuY29va2llLGNvb2tpZSkKKwkJCQkmJiBubG1fY21wX2FkZHIoc2luLCAmYmxvY2stPmJfaG9zdC0+aF9hZGRyKSkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBibG9jazsKK30KKworLyoKKyAqIENyZWF0ZSBhIGJsb2NrIGFuZCBpbml0aWFsaXplIGl0LgorICoKKyAqIE5vdGU6IHdlIGV4cGxpY2l0bHkgc2V0IHRoZSBjb29raWUgb2YgdGhlIGdyYW50IHJlcGx5IHRvIHRoYXQgb2YKKyAqIHRoZSBibG9ja2VkIGxvY2sgcmVxdWVzdC4gVGhlIHNwZWMgZXhwbGljaXRseSBtZW50aW9ucyB0aGF0IHRoZSBjbGllbnQKKyAqIHNob3VsZCBfbm90XyByZWx5IG9uIHRoZSBjYWxsYmFjayBjb250YWluaW5nIHRoZSBzYW1lIGNvb2tpZSBhcyB0aGUKKyAqIHJlcXVlc3QsIGJ1dCAoYXMgSSBmb3VuZCBvdXQgbGF0ZXIpIHRoYXQncyBiZWNhdXNlIHNvbWUgaW1wbGVtZW50YXRpb25zCisgKiBkbyBqdXN0IHRoaXMuIE5ldmVyIG1pbmQgdGhlIHN0YW5kYXJkcyBjb21pdHRlZXMsIHRoZXkgc3VwcG9ydCBvdXIKKyAqIGxvZ2dpbmcgaW5kdXN0cmllcy4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmxtX2Jsb2NrICoKK25sbXN2Y19jcmVhdGVfYmxvY2soc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9maWxlICpmaWxlLAorCQkJCXN0cnVjdCBubG1fbG9jayAqbG9jaywgc3RydWN0IG5sbV9jb29raWUgKmNvb2tpZSkKK3sKKwlzdHJ1Y3QgbmxtX2Jsb2NrCSpibG9jazsKKwlzdHJ1Y3QgbmxtX2hvc3QJCSpob3N0OworCXN0cnVjdCBubG1fcnFzdAkJKmNhbGw7CisKKwkvKiBDcmVhdGUgaG9zdCBoYW5kbGUgZm9yIGNhbGxiYWNrICovCisJaG9zdCA9IG5sbWNsbnRfbG9va3VwX2hvc3QoJnJxc3RwLT5ycV9hZGRyLAorCQkJCXJxc3RwLT5ycV9wcm90LCBycXN0cC0+cnFfdmVycyk7CisJaWYgKGhvc3QgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGJsb2NrLCBhbmQgaW5pdGlhbGl6ZSBhcmd1bWVudHMgKi8KKwlpZiAoIShibG9jayA9IChzdHJ1Y3QgbmxtX2Jsb2NrICopIGttYWxsb2Moc2l6ZW9mKCpibG9jayksIEdGUF9LRVJORUwpKSkKKwkJZ290byBmYWlsZWQ7CisJbWVtc2V0KGJsb2NrLCAwLCBzaXplb2YoKmJsb2NrKSk7CisJbG9ja3NfaW5pdF9sb2NrKCZibG9jay0+Yl9jYWxsLmFfYXJncy5sb2NrLmZsKTsKKwlsb2Nrc19pbml0X2xvY2soJmJsb2NrLT5iX2NhbGwuYV9yZXMubG9jay5mbCk7CisKKwlpZiAoIW5sbWNsbnRfc2V0Z3JhbnRhcmdzKCZibG9jay0+Yl9jYWxsLCBsb2NrKSkKKwkJZ290byBmYWlsZWRfZnJlZTsKKworCS8qIFNldCBub3RpZmllciBmdW5jdGlvbiBmb3IgVkZTLCBhbmQgaW5pdCBhcmdzICovCisJYmxvY2stPmJfY2FsbC5hX2FyZ3MubG9jay5mbC5mbF9sbW9wcyA9ICZubG1zdmNfbG9ja19vcGVyYXRpb25zOworCWJsb2NrLT5iX2NhbGwuYV9hcmdzLmNvb2tpZSA9ICpjb29raWU7CS8qIHNlZSBhYm92ZSAqLworCisJZHByaW50aygibG9ja2Q6IGNyZWF0ZWQgYmxvY2sgJXAuLi5cbiIsIGJsb2NrKTsKKworCS8qIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgYmxvY2sgKi8KKwlibG9jay0+Yl9kYWVtb24gPSBycXN0cC0+cnFfc2VydmVyOworCWJsb2NrLT5iX2hvc3QgICA9IGhvc3Q7CisJYmxvY2stPmJfZmlsZSAgID0gZmlsZTsKKworCS8qIEFkZCB0byBmaWxlJ3MgbGlzdCBvZiBibG9ja3MgKi8KKwlibG9jay0+Yl9mbmV4dCAgPSBmaWxlLT5mX2Jsb2NrczsKKwlmaWxlLT5mX2Jsb2NrcyAgPSBibG9jazsKKworCS8qIFNldCB1cCBSUEMgYXJndW1lbnRzIGZvciBjYWxsYmFjayAqLworCWNhbGwgPSAmYmxvY2stPmJfY2FsbDsKKwljYWxsLT5hX2hvc3QgICAgPSBob3N0OworCWNhbGwtPmFfZmxhZ3MgICA9IFJQQ19UQVNLX0FTWU5DOworCisJcmV0dXJuIGJsb2NrOworCitmYWlsZWRfZnJlZToKKwlrZnJlZShibG9jayk7CitmYWlsZWQ6CisJbmxtX3JlbGVhc2VfaG9zdChob3N0KTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIERlbGV0ZSBhIGJsb2NrLiBJZiB0aGUgbG9jayB3YXMgY2FuY2VsbGVkIG9yIHRoZSBncmFudCBjYWxsYmFjaworICogZmFpbGVkLCB1bmxvY2sgaXMgc2V0IHRvIDEuCisgKiBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gY2hlY2sgd2hldGhlciB0aGUgZmlsZQorICogY2FuIGJlIGNsb3NlZCBoZXJlYWZ0ZXIuCisgKi8KK3N0YXRpYyB2b2lkCitubG1zdmNfZGVsZXRlX2Jsb2NrKHN0cnVjdCBubG1fYmxvY2sgKmJsb2NrLCBpbnQgdW5sb2NrKQoreworCXN0cnVjdCBmaWxlX2xvY2sJKmZsID0gJmJsb2NrLT5iX2NhbGwuYV9hcmdzLmxvY2suZmw7CisJc3RydWN0IG5sbV9maWxlCQkqZmlsZSA9IGJsb2NrLT5iX2ZpbGU7CisJc3RydWN0IG5sbV9ibG9jawkqKmJwOworCisJZHByaW50aygibG9ja2Q6IGRlbGV0aW5nIGJsb2NrICVwLi4uXG4iLCBibG9jayk7CisKKwkvKiBSZW1vdmUgYmxvY2sgZnJvbSBsaXN0ICovCisJbmxtc3ZjX3JlbW92ZV9ibG9jayhibG9jayk7CisJaWYgKGZsLT5mbF9uZXh0KQorCQlwb3NpeF91bmJsb2NrX2xvY2soZmlsZS0+Zl9maWxlLCBmbCk7CisJaWYgKHVubG9jaykgeworCQlmbC0+ZmxfdHlwZSA9IEZfVU5MQ0s7CisJCXBvc2l4X2xvY2tfZmlsZShmaWxlLT5mX2ZpbGUsIGZsKTsKKwkJYmxvY2stPmJfZ3JhbnRlZCA9IDA7CisJfQorCisJLyogSWYgdGhlIGJsb2NrIGlzIGluIHRoZSBtaWRkbGUgb2YgYSBHUkFOVCBjYWxsYmFjaywKKwkgKiBkb24ndCBraWxsIGl0IHlldC4gKi8KKwlpZiAoYmxvY2stPmJfaW5jYWxsKSB7CisJCW5sbXN2Y19pbnNlcnRfYmxvY2soYmxvY2ssIE5MTV9ORVZFUik7CisJCWJsb2NrLT5iX2RvbmUgPSAxOworCQlyZXR1cm47CisJfQorCisJLyogUmVtb3ZlIGJsb2NrIGZyb20gZmlsZSdzIGxpc3Qgb2YgYmxvY2tzICovCisJZm9yIChicCA9ICZmaWxlLT5mX2Jsb2NrczsgKmJwOyBicCA9ICYoKmJwKS0+Yl9mbmV4dCkgeworCQlpZiAoKmJwID09IGJsb2NrKSB7CisJCQkqYnAgPSBibG9jay0+Yl9mbmV4dDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGJsb2NrLT5iX2hvc3QpCisJCW5sbV9yZWxlYXNlX2hvc3QoYmxvY2stPmJfaG9zdCk7CisJbmxtY2xudF9mcmVlZ3JhbnRhcmdzKCZibG9jay0+Yl9jYWxsKTsKKwlrZnJlZShibG9jayk7Cit9CisKKy8qCisgKiBMb29wIG92ZXIgYWxsIGJsb2NrcyBhbmQgcGVyZm9ybSB0aGUgYWN0aW9uIHNwZWNpZmllZC4KKyAqIChOTE1fQUNUX0NIRUNLIGhhbmRsZWQgYnkgbmxtc3ZjX2luc3BlY3RfZmlsZSkuCisgKi8KK2ludAorbmxtc3ZjX3RyYXZlcnNlX2Jsb2NrcyhzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QsIHN0cnVjdCBubG1fZmlsZSAqZmlsZSwgaW50IGFjdGlvbikKK3sKKwlzdHJ1Y3QgbmxtX2Jsb2NrCSpibG9jaywgKm5leHQ7CisKKwlkb3duKCZmaWxlLT5mX3NlbWEpOworCWZvciAoYmxvY2sgPSBmaWxlLT5mX2Jsb2NrczsgYmxvY2s7IGJsb2NrID0gbmV4dCkgeworCQluZXh0ID0gYmxvY2stPmJfZm5leHQ7CisJCWlmIChhY3Rpb24gPT0gTkxNX0FDVF9NQVJLKQorCQkJYmxvY2stPmJfaG9zdC0+aF9pbnVzZSA9IDE7CisJCWVsc2UgaWYgKGFjdGlvbiA9PSBOTE1fQUNUX1VOTE9DSykgeworCQkJaWYgKGhvc3QgPT0gTlVMTCB8fCBob3N0ID09IGJsb2NrLT5iX2hvc3QpCisJCQkJbmxtc3ZjX2RlbGV0ZV9ibG9jayhibG9jaywgMSk7CisJCX0KKwl9CisJdXAoJmZpbGUtPmZfc2VtYSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBdHRlbXB0IHRvIGVzdGFibGlzaCBhIGxvY2ssIGFuZCBpZiBpdCBjYW4ndCBiZSBncmFudGVkLCBibG9jayBpdAorICogaWYgcmVxdWlyZWQuCisgKi8KK3UzMgorbmxtc3ZjX2xvY2soc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9maWxlICpmaWxlLAorCQkJc3RydWN0IG5sbV9sb2NrICpsb2NrLCBpbnQgd2FpdCwgc3RydWN0IG5sbV9jb29raWUgKmNvb2tpZSkKK3sKKwlzdHJ1Y3QgZmlsZV9sb2NrCSpjb25mbG9jazsKKwlzdHJ1Y3QgbmxtX2Jsb2NrCSpibG9jazsKKwlpbnQJCQllcnJvcjsKKworCWRwcmludGsoImxvY2tkOiBubG1zdmNfbG9jayglcy8lbGQsIHR5PSVkLCBwaT0lZCwgJUxkLSVMZCwgYmw9JWQpXG4iLAorCQkJCWZpbGUtPmZfZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2ItPnNfaWQsCisJCQkJZmlsZS0+Zl9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9pbm8sCisJCQkJbG9jay0+ZmwuZmxfdHlwZSwgbG9jay0+ZmwuZmxfcGlkLAorCQkJCShsb25nIGxvbmcpbG9jay0+ZmwuZmxfc3RhcnQsCisJCQkJKGxvbmcgbG9uZylsb2NrLT5mbC5mbF9lbmQsCisJCQkJd2FpdCk7CisKKworCS8qIEdldCBleGlzdGluZyBibG9jayAoaW4gY2FzZSBjbGllbnQgaXMgYnVzeS13YWl0aW5nKSAqLworCWJsb2NrID0gbmxtc3ZjX2xvb2t1cF9ibG9jayhmaWxlLCBsb2NrLCAwKTsKKworCWxvY2stPmZsLmZsX2ZsYWdzIHw9IEZMX0xPQ0tEOworCithZ2FpbjoKKwkvKiBMb2NrIGZpbGUgYWdhaW5zdCBjb25jdXJyZW50IGFjY2VzcyAqLworCWRvd24oJmZpbGUtPmZfc2VtYSk7CisKKwlpZiAoIShjb25mbG9jayA9IHBvc2l4X3Rlc3RfbG9jayhmaWxlLT5mX2ZpbGUsICZsb2NrLT5mbCkpKSB7CisJCWVycm9yID0gcG9zaXhfbG9ja19maWxlKGZpbGUtPmZfZmlsZSwgJmxvY2stPmZsKTsKKworCQlpZiAoYmxvY2spCisJCQlubG1zdmNfZGVsZXRlX2Jsb2NrKGJsb2NrLCAwKTsKKwkJdXAoJmZpbGUtPmZfc2VtYSk7CisKKwkJZHByaW50aygibG9ja2Q6IHBvc2l4X2xvY2tfZmlsZSByZXR1cm5lZCAlZFxuIiwgLWVycm9yKTsKKwkJc3dpdGNoKC1lcnJvcikgeworCQljYXNlIDA6CisJCQlyZXR1cm4gbmxtX2dyYW50ZWQ7CisJCWNhc2UgRURFQURMSzoKKwkJCXJldHVybiBubG1fZGVhZGxvY2s7CisJCWNhc2UgRUFHQUlOOgorCQkJcmV0dXJuIG5sbV9sY2tfZGVuaWVkOworCQlkZWZhdWx0OgkJCS8qIGluY2x1ZGVzIEVOT0xDSyAqLworCQkJcmV0dXJuIG5sbV9sY2tfZGVuaWVkX25vbG9ja3M7CisJCX0KKwl9CisKKwlpZiAoIXdhaXQpIHsKKwkJdXAoJmZpbGUtPmZfc2VtYSk7CisJCXJldHVybiBubG1fbGNrX2RlbmllZDsKKwl9CisKKwlpZiAocG9zaXhfbG9ja3NfZGVhZGxvY2soJmxvY2stPmZsLCBjb25mbG9jaykpIHsKKwkJdXAoJmZpbGUtPmZfc2VtYSk7CisJCXJldHVybiBubG1fZGVhZGxvY2s7CisJfQorCisJLyogSWYgd2UgZG9uJ3QgaGF2ZSBhIGJsb2NrLCBjcmVhdGUgYW5kIGluaXRpYWxpemUgaXQuIFRoZW4KKwkgKiByZXRyeSBiZWNhdXNlIHdlIG1heSBoYXZlIHNsZXB0IGluIGttYWxsb2MuICovCisJLyogV2UgaGF2ZSB0byByZWxlYXNlIGZfc2VtYSBhcyBubG1zdmNfY3JlYXRlX2Jsb2NrIG1heSB0cnkgdG8KKwkgKiB0byBjbGFpbSBpdCB3aGlsZSBkb2luZyBob3N0IGdhcmJhZ2UgY29sbGVjdGlvbiAqLworCWlmIChibG9jayA9PSBOVUxMKSB7CisJCXVwKCZmaWxlLT5mX3NlbWEpOworCQlkcHJpbnRrKCJsb2NrZDogYmxvY2tpbmcgb24gdGhpcyBsb2NrIChhbGxvY2F0aW5nKS5cbiIpOworCQlpZiAoIShibG9jayA9IG5sbXN2Y19jcmVhdGVfYmxvY2socnFzdHAsIGZpbGUsIGxvY2ssIGNvb2tpZSkpKQorCQkJcmV0dXJuIG5sbV9sY2tfZGVuaWVkX25vbG9ja3M7CisJCWdvdG8gYWdhaW47CisJfQorCisJLyogQXBwZW5kIHRvIGxpc3Qgb2YgYmxvY2tlZCAqLworCW5sbXN2Y19pbnNlcnRfYmxvY2soYmxvY2ssIE5MTV9ORVZFUik7CisKKwlpZiAobGlzdF9lbXB0eSgmYmxvY2stPmJfY2FsbC5hX2FyZ3MubG9jay5mbC5mbF9ibG9jaykpIHsKKwkJLyogTm93IGFkZCBibG9jayB0byBibG9jayBsaXN0IG9mIHRoZSBjb25mbGljdGluZyBsb2NrCisJCSAgIGlmIHdlIGhhdmVuJ3QgZG9uZSBzby4gKi8KKwkJZHByaW50aygibG9ja2Q6IGJsb2NraW5nIG9uIHRoaXMgbG9jay5cbiIpOworCQlwb3NpeF9ibG9ja19sb2NrKGNvbmZsb2NrLCAmYmxvY2stPmJfY2FsbC5hX2FyZ3MubG9jay5mbCk7CisJfQorCisJdXAoJmZpbGUtPmZfc2VtYSk7CisJcmV0dXJuIG5sbV9sY2tfYmxvY2tlZDsKK30KKworLyoKKyAqIFRlc3QgZm9yIHByZXNlbmNlIG9mIGEgY29uZmxpY3RpbmcgbG9jay4KKyAqLwordTMyCitubG1zdmNfdGVzdGxvY2soc3RydWN0IG5sbV9maWxlICpmaWxlLCBzdHJ1Y3QgbmxtX2xvY2sgKmxvY2ssCisJCQkJICAgICAgIHN0cnVjdCBubG1fbG9jayAqY29uZmxvY2spCit7CisJc3RydWN0IGZpbGVfbG9jawkqZmw7CisKKwlkcHJpbnRrKCJsb2NrZDogbmxtc3ZjX3Rlc3Rsb2NrKCVzLyVsZCwgdHk9JWQsICVMZC0lTGQpXG4iLAorCQkJCWZpbGUtPmZfZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2ItPnNfaWQsCisJCQkJZmlsZS0+Zl9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9pbm8sCisJCQkJbG9jay0+ZmwuZmxfdHlwZSwKKwkJCQkobG9uZyBsb25nKWxvY2stPmZsLmZsX3N0YXJ0LAorCQkJCShsb25nIGxvbmcpbG9jay0+ZmwuZmxfZW5kKTsKKworCWlmICgoZmwgPSBwb3NpeF90ZXN0X2xvY2soZmlsZS0+Zl9maWxlLCAmbG9jay0+ZmwpKSAhPSBOVUxMKSB7CisJCWRwcmludGsoImxvY2tkOiBjb25mbGljdGluZyBsb2NrKHR5PSVkLCAlTGQtJUxkKVxuIiwKKwkJCQlmbC0+ZmxfdHlwZSwgKGxvbmcgbG9uZylmbC0+Zmxfc3RhcnQsCisJCQkJKGxvbmcgbG9uZylmbC0+ZmxfZW5kKTsKKwkJY29uZmxvY2stPmNhbGxlciA9ICJzb21laG9zdCI7CS8qIEZJWE1FICovCisJCWNvbmZsb2NrLT5vaC5sZW4gPSAwOwkJLyogZG9uJ3QgcmV0dXJuIE9IIGluZm8gKi8KKwkJY29uZmxvY2stPmZsID0gKmZsOworCQlyZXR1cm4gbmxtX2xja19kZW5pZWQ7CisJfQorCisJcmV0dXJuIG5sbV9ncmFudGVkOworfQorCisvKgorICogUmVtb3ZlIGEgbG9jay4KKyAqIFRoaXMgaW1wbGllcyBhIENBTkNFTCBjYWxsOiBXZSBzZW5kIGEgR1JBTlRfTVNHLCB0aGUgY2xpZW50IHJlcGxpZXMKKyAqIHdpdGggYSBHUkFOVF9SRVMgY2FsbCB3aGljaCBnZXRzIGxvc3QsIGFuZCBjYWxscyBVTkxPQ0sgaW1tZWRpYXRlbHkKKyAqIGFmdGVyd2FyZHMuIEluIHRoaXMgY2FzZSB0aGUgYmxvY2sgd2lsbCBzdGlsbCBiZSB0aGVyZSwgYW5kIGhlbmNlCisgKiBtdXN0IGJlIHJlbW92ZWQuCisgKi8KK3UzMgorbmxtc3ZjX3VubG9jayhzdHJ1Y3QgbmxtX2ZpbGUgKmZpbGUsIHN0cnVjdCBubG1fbG9jayAqbG9jaykKK3sKKwlpbnQJZXJyb3I7CisKKwlkcHJpbnRrKCJsb2NrZDogbmxtc3ZjX3VubG9jayglcy8lbGQsIHBpPSVkLCAlTGQtJUxkKVxuIiwKKwkJCQlmaWxlLT5mX2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NiLT5zX2lkLAorCQkJCWZpbGUtPmZfZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfaW5vLAorCQkJCWxvY2stPmZsLmZsX3BpZCwKKwkJCQkobG9uZyBsb25nKWxvY2stPmZsLmZsX3N0YXJ0LAorCQkJCShsb25nIGxvbmcpbG9jay0+ZmwuZmxfZW5kKTsKKworCS8qIEZpcnN0LCBjYW5jZWwgYW55IGxvY2sgdGhhdCBtaWdodCBiZSB0aGVyZSAqLworCW5sbXN2Y19jYW5jZWxfYmxvY2tlZChmaWxlLCBsb2NrKTsKKworCWxvY2stPmZsLmZsX3R5cGUgPSBGX1VOTENLOworCWVycm9yID0gcG9zaXhfbG9ja19maWxlKGZpbGUtPmZfZmlsZSwgJmxvY2stPmZsKTsKKworCXJldHVybiAoZXJyb3IgPCAwKT8gbmxtX2xja19kZW5pZWRfbm9sb2NrcyA6IG5sbV9ncmFudGVkOworfQorCisvKgorICogQ2FuY2VsIGEgcHJldmlvdXNseSBibG9ja2VkIHJlcXVlc3QuCisgKgorICogQSBjYW5jZWwgcmVxdWVzdCBhbHdheXMgb3ZlcnJpZGVzIGFueSBncmFudCB0aGF0IG1heSBjdXJyZW50bHkKKyAqIGJlIGluIHByb2dyZXNzLgorICogVGhlIGNhbGxpbmcgcHJvY2VkdXJlIG11c3QgY2hlY2sgd2hldGhlciB0aGUgZmlsZSBjYW4gYmUgY2xvc2VkLgorICovCit1MzIKK25sbXN2Y19jYW5jZWxfYmxvY2tlZChzdHJ1Y3QgbmxtX2ZpbGUgKmZpbGUsIHN0cnVjdCBubG1fbG9jayAqbG9jaykKK3sKKwlzdHJ1Y3QgbmxtX2Jsb2NrCSpibG9jazsKKworCWRwcmludGsoImxvY2tkOiBubG1zdmNfY2FuY2VsKCVzLyVsZCwgcGk9JWQsICVMZC0lTGQpXG4iLAorCQkJCWZpbGUtPmZfZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2ItPnNfaWQsCisJCQkJZmlsZS0+Zl9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9pbm8sCisJCQkJbG9jay0+ZmwuZmxfcGlkLAorCQkJCShsb25nIGxvbmcpbG9jay0+ZmwuZmxfc3RhcnQsCisJCQkJKGxvbmcgbG9uZylsb2NrLT5mbC5mbF9lbmQpOworCisJZG93bigmZmlsZS0+Zl9zZW1hKTsKKwlpZiAoKGJsb2NrID0gbmxtc3ZjX2xvb2t1cF9ibG9jayhmaWxlLCBsb2NrLCAxKSkgIT0gTlVMTCkKKwkJbmxtc3ZjX2RlbGV0ZV9ibG9jayhibG9jaywgMSk7CisJdXAoJmZpbGUtPmZfc2VtYSk7CisJcmV0dXJuIG5sbV9ncmFudGVkOworfQorCisvKgorICogVW5ibG9jayBhIGJsb2NrZWQgbG9jayByZXF1ZXN0LiBUaGlzIGlzIGEgY2FsbGJhY2sgaW52b2tlZCBmcm9tIHRoZQorICogVkZTIGxheWVyIHdoZW4gYSBsb2NrIG9uIHdoaWNoIHdlIGJsb2NrZWQgaXMgcmVtb3ZlZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgZ3JhbnQgdGhlIGJsb2NrZWQgbG9jayBpbnN0YW50bHksIGJ1dCByYXRoZXIgbW92ZXMKKyAqIHRoZSBibG9jayB0byB0aGUgaGVhZCBvZiBubG1fYmxvY2tlZCB3aGVyZSBpdCBjYW4gYmUgcGlja2VkIHVwIGJ5IGxvY2tkLgorICovCitzdGF0aWMgdm9pZAorbmxtc3ZjX25vdGlmeV9ibG9ja2VkKHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCXN0cnVjdCBubG1fYmxvY2sJKipicCwgKmJsb2NrOworCisJZHByaW50aygibG9ja2Q6IFZGUyB1bmJsb2NrIG5vdGlmaWNhdGlvbiBmb3IgYmxvY2sgJXBcbiIsIGZsKTsKKwlmb3IgKGJwID0gJm5sbV9ibG9ja2VkOyAoYmxvY2sgPSAqYnApICE9IDA7IGJwID0gJmJsb2NrLT5iX25leHQpIHsKKwkJaWYgKG5sbV9jb21wYXJlX2xvY2tzKCZibG9jay0+Yl9jYWxsLmFfYXJncy5sb2NrLmZsLCBmbCkpIHsKKwkJCW5sbXN2Y19pbnNlcnRfYmxvY2soYmxvY2ssIDApOworCQkJc3ZjX3dha2VfdXAoYmxvY2stPmJfZGFlbW9uKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCXByaW50ayhLRVJOX1dBUk5JTkcgImxvY2tkOiBub3RpZmljYXRpb24gZm9yIHVua25vd24gYmxvY2shXG4iKTsKK30KKworc3RhdGljIGludCBubG1zdmNfc2FtZV9vd25lcihzdHJ1Y3QgZmlsZV9sb2NrICpmbDEsIHN0cnVjdCBmaWxlX2xvY2sgKmZsMikKK3sKKwlyZXR1cm4gZmwxLT5mbF9vd25lciA9PSBmbDItPmZsX293bmVyICYmIGZsMS0+ZmxfcGlkID09IGZsMi0+ZmxfcGlkOworfQorCitzdHJ1Y3QgbG9ja19tYW5hZ2VyX29wZXJhdGlvbnMgbmxtc3ZjX2xvY2tfb3BlcmF0aW9ucyA9IHsKKwkuZmxfY29tcGFyZV9vd25lciA9IG5sbXN2Y19zYW1lX293bmVyLAorCS5mbF9ub3RpZnkgPSBubG1zdmNfbm90aWZ5X2Jsb2NrZWQsCit9OworCisvKgorICogVHJ5IHRvIGNsYWltIGEgbG9jayB0aGF0IHdhcyBwcmV2aW91c2x5IGJsb2NrZWQuCisgKgorICogTm90ZSB0aGF0IHdlIHVzZSBib3RoIHRoZSBSUENfR1JBTlRFRF9NU0cgY2FsbCBfYW5kXyBhbiBhc3luYworICogUlBDIHRocmVhZCB3aGVuIG5vdGlmeWluZyB0aGUgY2xpZW50LiBUaGlzIHNlZW1zIGxpa2Ugb3ZlcmtpbGwuLi4KKyAqIEhlcmUncyB3aHk6CisgKiAgLQl3ZSBkb24ndCB3YW50IHRvIHVzZSBhIHN5bmNocm9ub3VzIFJQQyB0aHJlYWQsIG90aGVyd2lzZQorICoJd2UgbWlnaHQgZmluZCBvdXJzZWx2ZXMgaGFuZ2luZyBvbiBhIGRlYWQgcG9ydG1hcHBlci4KKyAqICAtCVNvbWUgbG9ja2QgaW1wbGVtZW50YXRpb25zIChlLmcuIEhQKSBkb24ndCByZWFjdCB0bworICoJUlBDX0dSQU5URUQgY2FsbHM7IHRoZXkgc2VlbSB0byBpbnNpc3Qgb24gUlBDX0dSQU5URURfTVNHIGNhbGxzLgorICovCitzdGF0aWMgdm9pZAorbmxtc3ZjX2dyYW50X2Jsb2NrZWQoc3RydWN0IG5sbV9ibG9jayAqYmxvY2spCit7CisJc3RydWN0IG5sbV9maWxlCQkqZmlsZSA9IGJsb2NrLT5iX2ZpbGU7CisJc3RydWN0IG5sbV9sb2NrCQkqbG9jayA9ICZibG9jay0+Yl9jYWxsLmFfYXJncy5sb2NrOworCXN0cnVjdCBmaWxlX2xvY2sJKmNvbmZsb2NrOworCWludAkJCWVycm9yOworCisJZHByaW50aygibG9ja2Q6IGdyYW50IGJsb2NrZWQgbG9jayAlcFxuIiwgYmxvY2spOworCisJLyogRmlyc3QgdGhpbmcgaXMgbG9jayB0aGUgZmlsZSAqLworCWRvd24oJmZpbGUtPmZfc2VtYSk7CisKKwkvKiBVbmxpbmsgYmxvY2sgcmVxdWVzdCBmcm9tIGxpc3QgKi8KKwlubG1zdmNfcmVtb3ZlX2Jsb2NrKGJsb2NrKTsKKworCS8qIElmIGJfZ3JhbnRlZCBpcyB0cnVlIHRoaXMgbWVhbnMgd2UndmUgYmVlbiBoZXJlIGJlZm9yZS4KKwkgKiBKdXN0IHJldHJ5IHRoZSBncmFudCBjYWxsYmFjaywgcG9zc2libHkgcmVmcmVzaGluZyB0aGUgUlBDCisJICogYmluZGluZyAqLworCWlmIChibG9jay0+Yl9ncmFudGVkKSB7CisJCW5sbV9yZWJpbmRfaG9zdChibG9jay0+Yl9ob3N0KTsKKwkJZ290byBjYWxsYmFjazsKKwl9CisKKwkvKiBUcnkgdGhlIGxvY2sgb3BlcmF0aW9uIGFnYWluICovCisJaWYgKChjb25mbG9jayA9IHBvc2l4X3Rlc3RfbG9jayhmaWxlLT5mX2ZpbGUsICZsb2NrLT5mbCkpICE9IE5VTEwpIHsKKwkJLyogQnVtbWVyLCB3ZSBibG9ja2VkIGFnYWluICovCisJCWRwcmludGsoImxvY2tkOiBsb2NrIHN0aWxsIGJsb2NrZWRcbiIpOworCQlubG1zdmNfaW5zZXJ0X2Jsb2NrKGJsb2NrLCBOTE1fTkVWRVIpOworCQlwb3NpeF9ibG9ja19sb2NrKGNvbmZsb2NrLCAmbG9jay0+ZmwpOworCQl1cCgmZmlsZS0+Zl9zZW1hKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEFscmlnaHQsIG5vIGNvbmZsaWN0aW5nIGxvY2suIE5vdyBsb2NrIGl0IGZvciByZWFsLiBJZiB0aGUKKwkgKiBmb2xsb3dpbmcgeWllbGRzIGFuIGVycm9yLCB0aGlzIGlzIG1vc3QgcHJvYmFibHkgZHVlIHRvIGxvdworCSAqIG1lbW9yeS4gUmV0cnkgdGhlIGxvY2sgaW4gYSBmZXcgc2Vjb25kcy4KKwkgKi8KKwlpZiAoKGVycm9yID0gcG9zaXhfbG9ja19maWxlKGZpbGUtPmZfZmlsZSwgJmxvY2stPmZsKSkgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImxvY2tkOiB1bmV4cGVjdGVkIGVycm9yICVkIGluICVzIVxuIiwKKwkJCQktZXJyb3IsIF9fRlVOQ1RJT05fXyk7CisJCW5sbXN2Y19pbnNlcnRfYmxvY2soYmxvY2ssIDEwICogSFopOworCQl1cCgmZmlsZS0+Zl9zZW1hKTsKKwkJcmV0dXJuOworCX0KKworY2FsbGJhY2s6CisJLyogTG9jayB3YXMgZ3JhbnRlZCBieSBWRlMuICovCisJZHByaW50aygibG9ja2Q6IEdSQU5UaW5nIGJsb2NrZWQgbG9jay5cbiIpOworCWJsb2NrLT5iX2dyYW50ZWQgPSAxOworCWJsb2NrLT5iX2luY2FsbCAgPSAxOworCisJLyogU2NoZWR1bGUgbmV4dCBncmFudCBjYWxsYmFjayBpbiAzMCBzZWNvbmRzICovCisJbmxtc3ZjX2luc2VydF9ibG9jayhibG9jaywgMzAgKiBIWik7CisKKwkvKiBDYWxsIHRoZSBjbGllbnQgKi8KKwlubG1fZ2V0X2hvc3QoYmxvY2stPmJfY2FsbC5hX2hvc3QpOworCWlmIChubG1zdmNfYXN5bmNfY2FsbCgmYmxvY2stPmJfY2FsbCwgTkxNUFJPQ19HUkFOVEVEX01TRywKKwkJCQkJCW5sbXN2Y19ncmFudF9jYWxsYmFjaykgPCAwKQorCQlubG1fcmVsZWFzZV9ob3N0KGJsb2NrLT5iX2NhbGwuYV9ob3N0KTsKKwl1cCgmZmlsZS0+Zl9zZW1hKTsKK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIGNhbGxiYWNrIGZyb20gdGhlIFJQQyBsYXllciB3aGVuIHRoZSBOTE1fR1JBTlRFRF9NU0cKKyAqIFJQQyBjYWxsIGhhcyBzdWNjZWVkZWQgb3IgdGltZWQgb3V0LgorICogTGlrZSBhbGwgUlBDIGNhbGxiYWNrcywgaXQgaXMgaW52b2tlZCBieSB0aGUgcnBjaW9kIHByb2Nlc3MsIHNvIGl0CisgKiBiZXR0ZXIgbm90IHNsZWVwLiBUaGVyZWZvcmUsIHdlIHB1dCB0aGUgYmxvY2tlZCBsb2NrIG9uIHRoZSBubG1fYmxvY2tlZAorICogY2hhaW4gb25jZSBtb3JlIGluIG9yZGVyIHRvIGhhdmUgaXQgcmVtb3ZlZCBieSBsb2NrZCBpdHNlbGYgKHdoaWNoIGNhbgorICogdGhlbiBzbGVlcCBvbiB0aGUgZmlsZSBzZW1hcGhvcmUgd2l0aG91dCBkaXNydXB0aW5nIGUuZy4gdGhlIG5mcyBjbGllbnQpLgorICovCitzdGF0aWMgdm9pZAorbmxtc3ZjX2dyYW50X2NhbGxiYWNrKHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgbmxtX3Jxc3QJCSpjYWxsID0gKHN0cnVjdCBubG1fcnFzdCAqKSB0YXNrLT50a19jYWxsZGF0YTsKKwlzdHJ1Y3QgbmxtX2Jsb2NrCSpibG9jazsKKwl1bnNpZ25lZCBsb25nCQl0aW1lb3V0OworCXN0cnVjdCBzb2NrYWRkcl9pbgkqcGVlcl9hZGRyID0gUlBDX1BFRVJBRERSKHRhc2stPnRrX2NsaWVudCk7CisKKwlkcHJpbnRrKCJsb2NrZDogR1JBTlRfTVNHIFJQQyBjYWxsYmFja1xuIik7CisJZHByaW50aygiY2FsbGJhY2s6IGxvb2tpbmcgZm9yIGNvb2tpZSAlcywgaG9zdCAoJXUuJXUuJXUuJXUpXG4iLAorCQlubG1kYmdfY29va2llMmEoJmNhbGwtPmFfYXJncy5jb29raWUpLAorCQlOSVBRVUFEKHBlZXJfYWRkci0+c2luX2FkZHIuc19hZGRyKSk7CisJaWYgKCEoYmxvY2sgPSBubG1zdmNfZmluZF9ibG9jaygmY2FsbC0+YV9hcmdzLmNvb2tpZSwgcGVlcl9hZGRyKSkpIHsKKwkJZHByaW50aygibG9ja2Q6IG5vIGJsb2NrIGZvciBjb29raWUgJXMsIGhvc3QgKCV1LiV1LiV1LiV1KVxuIiwKKwkJCW5sbWRiZ19jb29raWUyYSgmY2FsbC0+YV9hcmdzLmNvb2tpZSksCisJCQlOSVBRVUFEKHBlZXJfYWRkci0+c2luX2FkZHIuc19hZGRyKSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBUZWNobmljYWxseSwgd2Ugc2hvdWxkIGRvd24gdGhlIGZpbGUgc2VtYXBob3JlIGhlcmUuIFNpbmNlIHdlCisJICogbW92ZSB0aGUgYmxvY2sgdG93YXJkcyB0aGUgaGVhZCBvZiB0aGUgcXVldWUgb25seSwgbm8gaGFybQorCSAqIGNhbiBiZSBkb25lLCB0aG91Z2guICovCisJaWYgKHRhc2stPnRrX3N0YXR1cyA8IDApIHsKKwkJLyogUlBDIGVycm9yOiBSZS1pbnNlcnQgZm9yIHJldHJhbnNtaXNzaW9uICovCisJCXRpbWVvdXQgPSAxMCAqIEhaOworCX0gZWxzZSBpZiAoYmxvY2stPmJfZG9uZSkgeworCQkvKiBCbG9jayBhbHJlYWR5IHJlbW92ZWQsIGtpbGwgaXQgZm9yIHJlYWwgKi8KKwkJdGltZW91dCA9IDA7CisJfSBlbHNlIHsKKwkJLyogQ2FsbCB3YXMgc3VjY2Vzc2Z1bCwgbm93IHdhaXQgZm9yIGNsaWVudCBjYWxsYmFjayAqLworCQl0aW1lb3V0ID0gNjAgKiBIWjsKKwl9CisJbmxtc3ZjX2luc2VydF9ibG9jayhibG9jaywgdGltZW91dCk7CisJc3ZjX3dha2VfdXAoYmxvY2stPmJfZGFlbW9uKTsKKwlibG9jay0+Yl9pbmNhbGwgPSAwOworCisJbmxtX3JlbGVhc2VfaG9zdChjYWxsLT5hX2hvc3QpOworfQorCisvKgorICogV2UgcmVjZWl2ZWQgYSBHUkFOVF9SRVMgY2FsbGJhY2suIFRyeSB0byBmaW5kIHRoZSBjb3JyZXNwb25kaW5nCisgKiBibG9jay4KKyAqLwordm9pZAorbmxtc3ZjX2dyYW50X3JlcGx5KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fY29va2llICpjb29raWUsIHUzMiBzdGF0dXMpCit7CisJc3RydWN0IG5sbV9ibG9jawkqYmxvY2s7CisJc3RydWN0IG5sbV9maWxlCQkqZmlsZTsKKworCWRwcmludGsoImdyYW50X3JlcGx5OiBsb29raW5nIGZvciBjb29raWUgJXgsIGhvc3QgKCUwOHgpLCBzPSVkIFxuIiwgCisJCSoodW5zaWduZWQgaW50ICopKGNvb2tpZS0+ZGF0YSksIAorCQludG9obChycXN0cC0+cnFfYWRkci5zaW5fYWRkci5zX2FkZHIpLCBzdGF0dXMpOworCWlmICghKGJsb2NrID0gbmxtc3ZjX2ZpbmRfYmxvY2soY29va2llLCAmcnFzdHAtPnJxX2FkZHIpKSkKKwkJcmV0dXJuOworCWZpbGUgPSBibG9jay0+Yl9maWxlOworCisJZmlsZS0+Zl9jb3VudCsrOworCWRvd24oJmZpbGUtPmZfc2VtYSk7CisJaWYgKChibG9jayA9IG5sbXN2Y19maW5kX2Jsb2NrKGNvb2tpZSwmcnFzdHAtPnJxX2FkZHIpKSAhPSBOVUxMKSB7CisJCWlmIChzdGF0dXMgPT0gTkxNX0xDS19ERU5JRURfR1JBQ0VfUEVSSU9EKSB7CisJCQkvKiBUcnkgYWdhaW4gaW4gYSBjb3VwbGUgb2Ygc2Vjb25kcyAqLworCQkJbmxtc3ZjX2luc2VydF9ibG9jayhibG9jaywgMTAgKiBIWik7CisJCQlibG9jayA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQkvKiBMb2NrIGlzIG5vdyBoZWxkIGJ5IGNsaWVudCwgb3IgaGFzIGJlZW4gcmVqZWN0ZWQuCisJCQkgKiBJbiBib3RoIGNhc2VzLCB0aGUgYmxvY2sgc2hvdWxkIGJlIHJlbW92ZWQuICovCisJCQl1cCgmZmlsZS0+Zl9zZW1hKTsKKwkJCWlmIChzdGF0dXMgPT0gTkxNX0xDS19HUkFOVEVEKQorCQkJCW5sbXN2Y19kZWxldGVfYmxvY2soYmxvY2ssIDApOworCQkJZWxzZQorCQkJCW5sbXN2Y19kZWxldGVfYmxvY2soYmxvY2ssIDEpOworCQl9CisJfQorCWlmICghYmxvY2spCisJCXVwKCZmaWxlLT5mX3NlbWEpOworCW5sbV9yZWxlYXNlX2ZpbGUoZmlsZSk7Cit9CisKKy8qCisgKiBSZXRyeSBhbGwgYmxvY2tlZCBsb2NrcyB0aGF0IGhhdmUgYmVlbiBub3RpZmllZC4gVGhpcyBpcyB3aGVyZSBsb2NrZAorICogcGlja3MgdXAgbG9ja3MgdGhhdCBjYW4gYmUgZ3JhbnRlZCwgb3IgZ3JhbnQgbm90aWZpY2F0aW9ucyB0aGF0IG11c3QKKyAqIGJlIHJldHJhbnNtaXR0ZWQuCisgKi8KK3Vuc2lnbmVkIGxvbmcKK25sbXN2Y19yZXRyeV9ibG9ja2VkKHZvaWQpCit7CisJc3RydWN0IG5sbV9ibG9jawkqYmxvY2s7CisKKwlkcHJpbnRrKCJubG1zdmNfcmV0cnlfYmxvY2tlZCglcCwgd2hlbj0lbGQpXG4iLAorCQkJbmxtX2Jsb2NrZWQsCisJCQlubG1fYmxvY2tlZD8gbmxtX2Jsb2NrZWQtPmJfd2hlbiA6IDApOworCXdoaWxlICgoYmxvY2sgPSBubG1fYmxvY2tlZCkgIT0gMCkgeworCQlpZiAoYmxvY2stPmJfd2hlbiA9PSBOTE1fTkVWRVIpCisJCQlicmVhazsKKwkgICAgICAgIGlmICh0aW1lX2FmdGVyKGJsb2NrLT5iX3doZW4samlmZmllcykpCisJCQlicmVhazsKKwkJZHByaW50aygibmxtc3ZjX3JldHJ5X2Jsb2NrZWQoJXAsIHdoZW49JWxkLCBkb25lPSVkKVxuIiwKKwkJCWJsb2NrLCBibG9jay0+Yl93aGVuLCBibG9jay0+Yl9kb25lKTsKKwkJaWYgKGJsb2NrLT5iX2RvbmUpCisJCQlubG1zdmNfZGVsZXRlX2Jsb2NrKGJsb2NrLCAwKTsKKwkJZWxzZQorCQkJbmxtc3ZjX2dyYW50X2Jsb2NrZWQoYmxvY2spOworCX0KKworCWlmICgoYmxvY2sgPSBubG1fYmxvY2tlZCkgJiYgYmxvY2stPmJfd2hlbiAhPSBOTE1fTkVWRVIpCisJCXJldHVybiAoYmxvY2stPmJfd2hlbiAtIGppZmZpZXMpOworCisJcmV0dXJuIE1BWF9TQ0hFRFVMRV9USU1FT1VUOworfQpkaWZmIC0tZ2l0IGEvZnMvbG9ja2Qvc3ZjcHJvYy5jIGIvZnMvbG9ja2Qvc3ZjcHJvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1N2UzNDQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9sb2NrZC9zdmNwcm9jLmMKQEAgLTAsMCArMSw2MDYgQEAKKy8qCisgKiBsaW51eC9mcy9sb2NrZC9zdmNwcm9jLmMKKyAqCisgKiBMb2NrZCBzZXJ2ZXIgcHJvY2VkdXJlcy4gV2UgZG9uJ3QgaW1wbGVtZW50IHRoZSBOTE1fKl9SRVMgCisgKiBwcm9jZWR1cmVzIGJlY2F1c2Ugd2UgZG9uJ3QgdXNlIHRoZSBhc3luYyBwcm9jZWR1cmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2QvbmZzZC5oPgorI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2xvY2tkLmg+CisjaW5jbHVkZSA8bGludXgvbG9ja2Qvc2hhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2NrZC9zbV9pbnRlci5oPgorCisKKyNkZWZpbmUgTkxNREJHX0ZBQ0lMSVRZCQlOTE1EQkdfQ0xJRU5UCisKK3N0YXRpYyB1MzIJbmxtc3ZjX2NhbGxiYWNrKHN0cnVjdCBzdmNfcnFzdCAqLCB1MzIsIHN0cnVjdCBubG1fcmVzICopOworc3RhdGljIHZvaWQJbmxtc3ZjX2NhbGxiYWNrX2V4aXQoc3RydWN0IHJwY190YXNrICopOworCisjaWZkZWYgQ09ORklHX0xPQ0tEX1Y0CitzdGF0aWMgdTMyCitjYXN0X3RvX25sbSh1MzIgc3RhdHVzLCB1MzIgdmVycykKK3sKKwkvKiBOb3RlOiBzdGF0dXMgaXMgYXNzdW1lZCB0byBiZSBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgISEhICovCisJaWYgKHZlcnMgIT0gNCl7CisJCXN3aXRjaCAoc3RhdHVzKSB7CisJCWNhc2UgbmxtX2dyYW50ZWQ6CisJCWNhc2UgbmxtX2xja19kZW5pZWQ6CisJCWNhc2UgbmxtX2xja19kZW5pZWRfbm9sb2NrczoKKwkJY2FzZSBubG1fbGNrX2Jsb2NrZWQ6CisJCWNhc2UgbmxtX2xja19kZW5pZWRfZ3JhY2VfcGVyaW9kOgorCQkJYnJlYWs7CisJCWNhc2UgbmxtNF9kZWFkbG9jazoKKwkJCXN0YXR1cyA9IG5sbV9sY2tfZGVuaWVkOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzdGF0dXMgPSBubG1fbGNrX2RlbmllZF9ub2xvY2tzOworCQl9CisJfQorCisJcmV0dXJuIChzdGF0dXMpOworfQorI2RlZmluZQljYXN0X3N0YXR1cyhzdGF0dXMpIChjYXN0X3RvX25sbShzdGF0dXMsIHJxc3RwLT5ycV92ZXJzKSkKKyNlbHNlCisjZGVmaW5lIGNhc3Rfc3RhdHVzKHN0YXR1cykgKHN0YXR1cykKKyNlbmRpZgorCisvKgorICogT2J0YWluIGNsaWVudCBhbmQgZmlsZSBmcm9tIGFyZ3VtZW50cworICovCitzdGF0aWMgdTMyCitubG1zdmNfcmV0cmlldmVfYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCisJCQlzdHJ1Y3QgbmxtX2hvc3QgKipob3N0cCwgc3RydWN0IG5sbV9maWxlICoqZmlscCkKK3sKKwlzdHJ1Y3QgbmxtX2hvc3QJCSpob3N0ID0gTlVMTDsKKwlzdHJ1Y3QgbmxtX2ZpbGUJCSpmaWxlID0gTlVMTDsKKwlzdHJ1Y3QgbmxtX2xvY2sJCSpsb2NrID0gJmFyZ3AtPmxvY2s7CisJdTMyCQkJZXJyb3I7CisKKwkvKiBuZnNkIGNhbGxiYWNrcyBtdXN0IGhhdmUgYmVlbiBpbnN0YWxsZWQgZm9yIHRoaXMgcHJvY2VkdXJlICovCisJaWYgKCFubG1zdmNfb3BzKQorCQlyZXR1cm4gbmxtX2xja19kZW5pZWRfbm9sb2NrczsKKworCS8qIE9idGFpbiBob3N0IGhhbmRsZSAqLworCWlmICghKGhvc3QgPSBubG1zdmNfbG9va3VwX2hvc3QocnFzdHApKQorCSB8fCAoYXJncC0+bW9uaXRvciAmJiAhaG9zdC0+aF9tb25pdG9yZWQgJiYgbnNtX21vbml0b3IoaG9zdCkgPCAwKSkKKwkJZ290byBub19sb2NrczsKKwkqaG9zdHAgPSBob3N0OworCisJLyogT2J0YWluIGZpbGUgcG9pbnRlci4gTm90IHVzZWQgYnkgRlJFRV9BTEwgY2FsbC4gKi8KKwlpZiAoZmlscCAhPSBOVUxMKSB7CisJCWlmICgoZXJyb3IgPSBubG1fbG9va3VwX2ZpbGUocnFzdHAsICZmaWxlLCAmbG9jay0+ZmgpKSAhPSAwKQorCQkJZ290byBub19sb2NrczsKKwkJKmZpbHAgPSBmaWxlOworCisJCS8qIFNldCB1cCB0aGUgbWlzc2luZyBwYXJ0cyBvZiB0aGUgZmlsZV9sb2NrIHN0cnVjdHVyZSAqLworCQlsb2NrLT5mbC5mbF9maWxlICA9IGZpbGUtPmZfZmlsZTsKKwkJbG9jay0+ZmwuZmxfb3duZXIgPSAoZmxfb3duZXJfdCkgaG9zdDsKKwkJbG9jay0+ZmwuZmxfbG1vcHMgPSAmbmxtc3ZjX2xvY2tfb3BlcmF0aW9uczsKKwl9CisKKwlyZXR1cm4gMDsKKworbm9fbG9ja3M6CisJaWYgKGhvc3QpCisJCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJcmV0dXJuIG5sbV9sY2tfZGVuaWVkX25vbG9ja3M7Cit9CisKKy8qCisgKiBOVUxMOiBUZXN0IGZvciBwcmVzZW5jZSBvZiBzZXJ2aWNlCisgKi8KK3N0YXRpYyBpbnQKK25sbXN2Y19wcm9jX251bGwoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdm9pZCAqYXJncCwgdm9pZCAqcmVzcCkKK3sKKwlkcHJpbnRrKCJsb2NrZDogTlVMTCAgICAgICAgICBjYWxsZWRcbiIpOworCXJldHVybiBycGNfc3VjY2VzczsKK30KKworLyoKKyAqIFRFU1Q6IENoZWNrIGZvciBjb25mbGljdGluZyBsb2NrCisgKi8KK3N0YXRpYyBpbnQKK25sbXN2Y19wcm9jX3Rlc3Qoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAorCQkJCSAgICAgICAgIHN0cnVjdCBubG1fcmVzICAqcmVzcCkKK3sKKwlzdHJ1Y3QgbmxtX2hvc3QJKmhvc3Q7CisJc3RydWN0IG5sbV9maWxlCSpmaWxlOworCisJZHByaW50aygibG9ja2Q6IFRFU1QgICAgICAgICAgY2FsbGVkXG4iKTsKKwlyZXNwLT5jb29raWUgPSBhcmdwLT5jb29raWU7CisKKwkvKiBEb24ndCBhY2NlcHQgdGVzdCByZXF1ZXN0cyBkdXJpbmcgZ3JhY2UgcGVyaW9kICovCisJaWYgKG5sbXN2Y19ncmFjZV9wZXJpb2QpIHsKKwkJcmVzcC0+c3RhdHVzID0gbmxtX2xja19kZW5pZWRfZ3JhY2VfcGVyaW9kOworCQlyZXR1cm4gcnBjX3N1Y2Nlc3M7CisJfQorCisJLyogT2J0YWluIGNsaWVudCBhbmQgZmlsZSAqLworCWlmICgocmVzcC0+c3RhdHVzID0gbmxtc3ZjX3JldHJpZXZlX2FyZ3MocnFzdHAsIGFyZ3AsICZob3N0LCAmZmlsZSkpKQorCQlyZXR1cm4gcnBjX3N1Y2Nlc3M7CisKKwkvKiBOb3cgY2hlY2sgZm9yIGNvbmZsaWN0aW5nIGxvY2tzICovCisJcmVzcC0+c3RhdHVzID0gY2FzdF9zdGF0dXMobmxtc3ZjX3Rlc3Rsb2NrKGZpbGUsICZhcmdwLT5sb2NrLCAmcmVzcC0+bG9jaykpOworCisJZHByaW50aygibG9ja2Q6IFRFU1QgICAgICAgICAgc3RhdHVzICVkIHZlcnMgJWRcbiIsCisJCW50b2hsKHJlc3AtPnN0YXR1cyksIHJxc3RwLT5ycV92ZXJzKTsKKwlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCW5sbV9yZWxlYXNlX2ZpbGUoZmlsZSk7CisJcmV0dXJuIHJwY19zdWNjZXNzOworfQorCitzdGF0aWMgaW50CitubG1zdmNfcHJvY19sb2NrKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKKwkJCQkgICAgICAgICBzdHJ1Y3QgbmxtX3JlcyAgKnJlc3ApCit7CisJc3RydWN0IG5sbV9ob3N0CSpob3N0OworCXN0cnVjdCBubG1fZmlsZQkqZmlsZTsKKworCWRwcmludGsoImxvY2tkOiBMT0NLICAgICAgICAgIGNhbGxlZFxuIik7CisKKwlyZXNwLT5jb29raWUgPSBhcmdwLT5jb29raWU7CisKKwkvKiBEb24ndCBhY2NlcHQgbmV3IGxvY2sgcmVxdWVzdHMgZHVyaW5nIGdyYWNlIHBlcmlvZCAqLworCWlmIChubG1zdmNfZ3JhY2VfcGVyaW9kICYmICFhcmdwLT5yZWNsYWltKSB7CisJCXJlc3AtPnN0YXR1cyA9IG5sbV9sY2tfZGVuaWVkX2dyYWNlX3BlcmlvZDsKKwkJcmV0dXJuIHJwY19zdWNjZXNzOworCX0KKworCS8qIE9idGFpbiBjbGllbnQgYW5kIGZpbGUgKi8KKwlpZiAoKHJlc3AtPnN0YXR1cyA9IG5sbXN2Y19yZXRyaWV2ZV9hcmdzKHJxc3RwLCBhcmdwLCAmaG9zdCwgJmZpbGUpKSkKKwkJcmV0dXJuIHJwY19zdWNjZXNzOworCisjaWYgMAorCS8qIElmIHN1cHBsaWVkIHN0YXRlIGRvZXNuJ3QgbWF0Y2ggY3VycmVudCBzdGF0ZSwgd2UgYXNzdW1lIGl0J3MKKwkgKiBhbiBvbGQgcmVxdWVzdCB0aGF0IHRpbWUtd2FycGVkIHNvbWVob3cuIEFueSBlcnJvciByZXR1cm4gd291bGQKKwkgKiBkbyBpbiB0aGlzIGNhc2UgYmVjYXVzZSBpdCdzIGlycmVsZXZhbnQgYW55d2F5LgorCSAqCisJICogTkI6IFdlIGRvbid0IHJldHJpZXZlIHRoZSByZW1vdGUgaG9zdCdzIHN0YXRlIHlldC4KKwkgKi8KKwlpZiAoaG9zdC0+aF9uc21zdGF0ZSAmJiBob3N0LT5oX25zbXN0YXRlICE9IGFyZ3AtPnN0YXRlKSB7CisJCXJlc3AtPnN0YXR1cyA9IG5sbV9sY2tfZGVuaWVkX25vbG9ja3M7CisJfSBlbHNlCisjZW5kaWYKKworCS8qIE5vdyB0cnkgdG8gbG9jayB0aGUgZmlsZSAqLworCXJlc3AtPnN0YXR1cyA9IGNhc3Rfc3RhdHVzKG5sbXN2Y19sb2NrKHJxc3RwLCBmaWxlLCAmYXJncC0+bG9jaywKKwkJCQkJICAgICAgIGFyZ3AtPmJsb2NrLCAmYXJncC0+Y29va2llKSk7CisKKwlkcHJpbnRrKCJsb2NrZDogTE9DSyAgICAgICAgICBzdGF0dXMgJWRcbiIsIG50b2hsKHJlc3AtPnN0YXR1cykpOworCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJbmxtX3JlbGVhc2VfZmlsZShmaWxlKTsKKwlyZXR1cm4gcnBjX3N1Y2Nlc3M7Cit9CisKK3N0YXRpYyBpbnQKK25sbXN2Y19wcm9jX2NhbmNlbChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCisJCQkJICAgICAgICAgICBzdHJ1Y3QgbmxtX3JlcyAgKnJlc3ApCit7CisJc3RydWN0IG5sbV9ob3N0CSpob3N0OworCXN0cnVjdCBubG1fZmlsZQkqZmlsZTsKKworCWRwcmludGsoImxvY2tkOiBDQU5DRUwgICAgICAgIGNhbGxlZFxuIik7CisKKwlyZXNwLT5jb29raWUgPSBhcmdwLT5jb29raWU7CisKKwkvKiBEb24ndCBhY2NlcHQgcmVxdWVzdHMgZHVyaW5nIGdyYWNlIHBlcmlvZCAqLworCWlmIChubG1zdmNfZ3JhY2VfcGVyaW9kKSB7CisJCXJlc3AtPnN0YXR1cyA9IG5sbV9sY2tfZGVuaWVkX2dyYWNlX3BlcmlvZDsKKwkJcmV0dXJuIHJwY19zdWNjZXNzOworCX0KKworCS8qIE9idGFpbiBjbGllbnQgYW5kIGZpbGUgKi8KKwlpZiAoKHJlc3AtPnN0YXR1cyA9IG5sbXN2Y19yZXRyaWV2ZV9hcmdzKHJxc3RwLCBhcmdwLCAmaG9zdCwgJmZpbGUpKSkKKwkJcmV0dXJuIHJwY19zdWNjZXNzOworCisJLyogVHJ5IHRvIGNhbmNlbCByZXF1ZXN0LiAqLworCXJlc3AtPnN0YXR1cyA9IGNhc3Rfc3RhdHVzKG5sbXN2Y19jYW5jZWxfYmxvY2tlZChmaWxlLCAmYXJncC0+bG9jaykpOworCisJZHByaW50aygibG9ja2Q6IENBTkNFTCAgICAgICAgc3RhdHVzICVkXG4iLCBudG9obChyZXNwLT5zdGF0dXMpKTsKKwlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCW5sbV9yZWxlYXNlX2ZpbGUoZmlsZSk7CisJcmV0dXJuIHJwY19zdWNjZXNzOworfQorCisvKgorICogVU5MT0NLOiByZWxlYXNlIGEgbG9jaworICovCitzdGF0aWMgaW50CitubG1zdmNfcHJvY191bmxvY2soc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAorCQkJCSAgICAgICAgICAgc3RydWN0IG5sbV9yZXMgICpyZXNwKQoreworCXN0cnVjdCBubG1faG9zdAkqaG9zdDsKKwlzdHJ1Y3QgbmxtX2ZpbGUJKmZpbGU7CisKKwlkcHJpbnRrKCJsb2NrZDogVU5MT0NLICAgICAgICBjYWxsZWRcbiIpOworCisJcmVzcC0+Y29va2llID0gYXJncC0+Y29va2llOworCisJLyogRG9uJ3QgYWNjZXB0IG5ldyBsb2NrIHJlcXVlc3RzIGR1cmluZyBncmFjZSBwZXJpb2QgKi8KKwlpZiAobmxtc3ZjX2dyYWNlX3BlcmlvZCkgeworCQlyZXNwLT5zdGF0dXMgPSBubG1fbGNrX2RlbmllZF9ncmFjZV9wZXJpb2Q7CisJCXJldHVybiBycGNfc3VjY2VzczsKKwl9CisKKwkvKiBPYnRhaW4gY2xpZW50IGFuZCBmaWxlICovCisJaWYgKChyZXNwLT5zdGF0dXMgPSBubG1zdmNfcmV0cmlldmVfYXJncyhycXN0cCwgYXJncCwgJmhvc3QsICZmaWxlKSkpCisJCXJldHVybiBycGNfc3VjY2VzczsKKworCS8qIE5vdyB0cnkgdG8gcmVtb3ZlIHRoZSBsb2NrICovCisJcmVzcC0+c3RhdHVzID0gY2FzdF9zdGF0dXMobmxtc3ZjX3VubG9jayhmaWxlLCAmYXJncC0+bG9jaykpOworCisJZHByaW50aygibG9ja2Q6IFVOTE9DSyAgICAgICAgc3RhdHVzICVkXG4iLCBudG9obChyZXNwLT5zdGF0dXMpKTsKKwlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCW5sbV9yZWxlYXNlX2ZpbGUoZmlsZSk7CisJcmV0dXJuIHJwY19zdWNjZXNzOworfQorCisvKgorICogR1JBTlRFRDogQSBzZXJ2ZXIgY2FsbHMgdXMgdG8gdGVsbCB0aGF0IGEgcHJvY2VzcycgbG9jayByZXF1ZXN0CisgKiB3YXMgZ3JhbnRlZAorICovCitzdGF0aWMgaW50CitubG1zdmNfcHJvY19ncmFudGVkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKKwkJCQkgICAgICAgICAgICBzdHJ1Y3QgbmxtX3JlcyAgKnJlc3ApCit7CisJcmVzcC0+Y29va2llID0gYXJncC0+Y29va2llOworCisJZHByaW50aygibG9ja2Q6IEdSQU5URUQgICAgICAgY2FsbGVkXG4iKTsKKwlyZXNwLT5zdGF0dXMgPSBubG1jbG50X2dyYW50KCZhcmdwLT5sb2NrKTsKKwlkcHJpbnRrKCJsb2NrZDogR1JBTlRFRCAgICAgICBzdGF0dXMgJWRcbiIsIG50b2hsKHJlc3AtPnN0YXR1cykpOworCXJldHVybiBycGNfc3VjY2VzczsKK30KKworLyoKKyAqIGBBc3luYycgdmVyc2lvbnMgb2YgdGhlIGFib3ZlIHNlcnZpY2Ugcm91dGluZXMuIFRoZXkgYXJlbid0IHJlYWxseSwKKyAqIGJlY2F1c2Ugd2Ugc2VuZCB0aGUgY2FsbGJhY2sgYmVmb3JlIHRoZSByZXBseSBwcm9wZXIuIEkgaG9wZSB0aGlzCisgKiBkb2Vzbid0IGJyZWFrIGFueSBjbGllbnRzLgorICovCitzdGF0aWMgaW50CitubG1zdmNfcHJvY190ZXN0X21zZyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCisJCQkJCSAgICAgdm9pZAkgICAgICpyZXNwKQoreworCXN0cnVjdCBubG1fcmVzCXJlczsKKwl1MzIJCXN0YXQ7CisKKwlkcHJpbnRrKCJsb2NrZDogVEVTVF9NU0cgICAgICBjYWxsZWRcbiIpOworCW1lbXNldCgmcmVzLCAwLCBzaXplb2YocmVzKSk7CisKKwlpZiAoKHN0YXQgPSBubG1zdmNfcHJvY190ZXN0KHJxc3RwLCBhcmdwLCAmcmVzKSkgPT0gMCkKKwkJc3RhdCA9IG5sbXN2Y19jYWxsYmFjayhycXN0cCwgTkxNUFJPQ19URVNUX1JFUywgJnJlcyk7CisJcmV0dXJuIHN0YXQ7Cit9CisKK3N0YXRpYyBpbnQKK25sbXN2Y19wcm9jX2xvY2tfbXNnKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKKwkJCQkJICAgICB2b2lkCSAgICAgKnJlc3ApCit7CisJc3RydWN0IG5sbV9yZXMJcmVzOworCXUzMgkJc3RhdDsKKworCWRwcmludGsoImxvY2tkOiBMT0NLX01TRyAgICAgIGNhbGxlZFxuIik7CisJbWVtc2V0KCZyZXMsIDAsIHNpemVvZihyZXMpKTsKKworCWlmICgoc3RhdCA9IG5sbXN2Y19wcm9jX2xvY2socnFzdHAsIGFyZ3AsICZyZXMpKSA9PSAwKQorCQlzdGF0ID0gbmxtc3ZjX2NhbGxiYWNrKHJxc3RwLCBOTE1QUk9DX0xPQ0tfUkVTLCAmcmVzKTsKKwlyZXR1cm4gc3RhdDsKK30KKworc3RhdGljIGludAorbmxtc3ZjX3Byb2NfY2FuY2VsX21zZyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCisJCQkJCSAgICAgICB2b2lkCSAgICAgICAqcmVzcCkKK3sKKwlzdHJ1Y3QgbmxtX3JlcwlyZXM7CisJdTMyCQlzdGF0OworCisJZHByaW50aygibG9ja2Q6IENBTkNFTF9NU0cgICAgY2FsbGVkXG4iKTsKKwltZW1zZXQoJnJlcywgMCwgc2l6ZW9mKHJlcykpOworCisJaWYgKChzdGF0ID0gbmxtc3ZjX3Byb2NfY2FuY2VsKHJxc3RwLCBhcmdwLCAmcmVzKSkgPT0gMCkKKwkJc3RhdCA9IG5sbXN2Y19jYWxsYmFjayhycXN0cCwgTkxNUFJPQ19DQU5DRUxfUkVTLCAmcmVzKTsKKwlyZXR1cm4gc3RhdDsKK30KKworc3RhdGljIGludAorbmxtc3ZjX3Byb2NfdW5sb2NrX21zZyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqcmVzcCkKK3sKKwlzdHJ1Y3QgbmxtX3JlcwlyZXM7CisJdTMyCQlzdGF0OworCisJZHByaW50aygibG9ja2Q6IFVOTE9DS19NU0cgICAgY2FsbGVkXG4iKTsKKwltZW1zZXQoJnJlcywgMCwgc2l6ZW9mKHJlcykpOworCisJaWYgKChzdGF0ID0gbmxtc3ZjX3Byb2NfdW5sb2NrKHJxc3RwLCBhcmdwLCAmcmVzKSkgPT0gMCkKKwkJc3RhdCA9IG5sbXN2Y19jYWxsYmFjayhycXN0cCwgTkxNUFJPQ19VTkxPQ0tfUkVTLCAmcmVzKTsKKwlyZXR1cm4gc3RhdDsKK30KKworc3RhdGljIGludAorbmxtc3ZjX3Byb2NfZ3JhbnRlZF9tc2coc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICpyZXNwKQoreworCXN0cnVjdCBubG1fcmVzCXJlczsKKwl1MzIJCXN0YXQ7CisKKwlkcHJpbnRrKCJsb2NrZDogR1JBTlRFRF9NU0cgICBjYWxsZWRcbiIpOworCW1lbXNldCgmcmVzLCAwLCBzaXplb2YocmVzKSk7CisKKwlpZiAoKHN0YXQgPSBubG1zdmNfcHJvY19ncmFudGVkKHJxc3RwLCBhcmdwLCAmcmVzKSkgPT0gMCkKKwkJc3RhdCA9IG5sbXN2Y19jYWxsYmFjayhycXN0cCwgTkxNUFJPQ19HUkFOVEVEX1JFUywgJnJlcyk7CisJcmV0dXJuIHN0YXQ7Cit9CisKKy8qCisgKiBTSEFSRTogY3JlYXRlIGEgRE9TIHNoYXJlIG9yIGFsdGVyIGV4aXN0aW5nIHNoYXJlLgorICovCitzdGF0aWMgaW50CitubG1zdmNfcHJvY19zaGFyZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3AsCisJCQkJICAgICAgICAgIHN0cnVjdCBubG1fcmVzICAqcmVzcCkKK3sKKwlzdHJ1Y3QgbmxtX2hvc3QJKmhvc3Q7CisJc3RydWN0IG5sbV9maWxlCSpmaWxlOworCisJZHByaW50aygibG9ja2Q6IFNIQVJFICAgICAgICAgY2FsbGVkXG4iKTsKKworCXJlc3AtPmNvb2tpZSA9IGFyZ3AtPmNvb2tpZTsKKworCS8qIERvbid0IGFjY2VwdCBuZXcgbG9jayByZXF1ZXN0cyBkdXJpbmcgZ3JhY2UgcGVyaW9kICovCisJaWYgKG5sbXN2Y19ncmFjZV9wZXJpb2QgJiYgIWFyZ3AtPnJlY2xhaW0pIHsKKwkJcmVzcC0+c3RhdHVzID0gbmxtX2xja19kZW5pZWRfZ3JhY2VfcGVyaW9kOworCQlyZXR1cm4gcnBjX3N1Y2Nlc3M7CisJfQorCisJLyogT2J0YWluIGNsaWVudCBhbmQgZmlsZSAqLworCWlmICgocmVzcC0+c3RhdHVzID0gbmxtc3ZjX3JldHJpZXZlX2FyZ3MocnFzdHAsIGFyZ3AsICZob3N0LCAmZmlsZSkpKQorCQlyZXR1cm4gcnBjX3N1Y2Nlc3M7CisKKwkvKiBOb3cgdHJ5IHRvIGNyZWF0ZSB0aGUgc2hhcmUgKi8KKwlyZXNwLT5zdGF0dXMgPSBjYXN0X3N0YXR1cyhubG1zdmNfc2hhcmVfZmlsZShob3N0LCBmaWxlLCBhcmdwKSk7CisKKwlkcHJpbnRrKCJsb2NrZDogU0hBUkUgICAgICAgICBzdGF0dXMgJWRcbiIsIG50b2hsKHJlc3AtPnN0YXR1cykpOworCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJbmxtX3JlbGVhc2VfZmlsZShmaWxlKTsKKwlyZXR1cm4gcnBjX3N1Y2Nlc3M7Cit9CisKKy8qCisgKiBVTlNIQVJFOiBSZWxlYXNlIGEgRE9TIHNoYXJlLgorICovCitzdGF0aWMgaW50CitubG1zdmNfcHJvY191bnNoYXJlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKKwkJCQkgICAgICAgICAgICBzdHJ1Y3QgbmxtX3JlcyAgKnJlc3ApCit7CisJc3RydWN0IG5sbV9ob3N0CSpob3N0OworCXN0cnVjdCBubG1fZmlsZQkqZmlsZTsKKworCWRwcmludGsoImxvY2tkOiBVTlNIQVJFICAgICAgIGNhbGxlZFxuIik7CisKKwlyZXNwLT5jb29raWUgPSBhcmdwLT5jb29raWU7CisKKwkvKiBEb24ndCBhY2NlcHQgcmVxdWVzdHMgZHVyaW5nIGdyYWNlIHBlcmlvZCAqLworCWlmIChubG1zdmNfZ3JhY2VfcGVyaW9kKSB7CisJCXJlc3AtPnN0YXR1cyA9IG5sbV9sY2tfZGVuaWVkX2dyYWNlX3BlcmlvZDsKKwkJcmV0dXJuIHJwY19zdWNjZXNzOworCX0KKworCS8qIE9idGFpbiBjbGllbnQgYW5kIGZpbGUgKi8KKwlpZiAoKHJlc3AtPnN0YXR1cyA9IG5sbXN2Y19yZXRyaWV2ZV9hcmdzKHJxc3RwLCBhcmdwLCAmaG9zdCwgJmZpbGUpKSkKKwkJcmV0dXJuIHJwY19zdWNjZXNzOworCisJLyogTm93IHRyeSB0byB1bnNoYXJlIHRoZSBmaWxlICovCisJcmVzcC0+c3RhdHVzID0gY2FzdF9zdGF0dXMobmxtc3ZjX3Vuc2hhcmVfZmlsZShob3N0LCBmaWxlLCBhcmdwKSk7CisKKwlkcHJpbnRrKCJsb2NrZDogVU5TSEFSRSAgICAgICBzdGF0dXMgJWRcbiIsIG50b2hsKHJlc3AtPnN0YXR1cykpOworCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJbmxtX3JlbGVhc2VfZmlsZShmaWxlKTsKKwlyZXR1cm4gcnBjX3N1Y2Nlc3M7Cit9CisKKy8qCisgKiBOTV9MT0NLOiBDcmVhdGUgYW4gdW5tb25pdG9yZWQgbG9jaworICovCitzdGF0aWMgaW50CitubG1zdmNfcHJvY19ubV9sb2NrKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fYXJncyAqYXJncCwKKwkJCQkgICAgICAgICAgICBzdHJ1Y3QgbmxtX3JlcyAgKnJlc3ApCit7CisJZHByaW50aygibG9ja2Q6IE5NX0xPQ0sgICAgICAgY2FsbGVkXG4iKTsKKworCWFyZ3AtPm1vbml0b3IgPSAwOwkJLyoganVzdCBjbGVhbiB0aGUgbW9uaXRvciBmbGFnICovCisJcmV0dXJuIG5sbXN2Y19wcm9jX2xvY2socnFzdHAsIGFyZ3AsIHJlc3ApOworfQorCisvKgorICogRlJFRV9BTEw6IFJlbGVhc2UgYWxsIGxvY2tzIGFuZCBzaGFyZXMgaGVsZCBieSBjbGllbnQKKyAqLworc3RhdGljIGludAorbmxtc3ZjX3Byb2NfZnJlZV9hbGwoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5sbV9hcmdzICphcmdwLAorCQkJCQkgICAgIHZvaWQgICAgICAgICAgICAqcmVzcCkKK3sKKwlzdHJ1Y3QgbmxtX2hvc3QJKmhvc3Q7CisKKwkvKiBPYnRhaW4gY2xpZW50ICovCisJaWYgKG5sbXN2Y19yZXRyaWV2ZV9hcmdzKHJxc3RwLCBhcmdwLCAmaG9zdCwgTlVMTCkpCisJCXJldHVybiBycGNfc3VjY2VzczsKKworCW5sbXN2Y19mcmVlX2hvc3RfcmVzb3VyY2VzKGhvc3QpOworCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJcmV0dXJuIHJwY19zdWNjZXNzOworfQorCisvKgorICogU01fTk9USUZZOiBwcml2YXRlIGNhbGxiYWNrIGZyb20gc3RhdGQgKG5vdCBwYXJ0IG9mIG9mZmljaWFsIE5MTSBwcm90bykKKyAqLworc3RhdGljIGludAorbmxtc3ZjX3Byb2Nfc21fbm90aWZ5KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fcmVib290ICphcmdwLAorCQkJCQkgICAgICB2b2lkCSAgICAgICAgKnJlc3ApCit7CisJc3RydWN0IHNvY2thZGRyX2luCXNhZGRyID0gcnFzdHAtPnJxX2FkZHI7CisJaW50CQkJdmVycyA9IGFyZ3AtPnZlcnM7CisJaW50CQkJcHJvdCA9IGFyZ3AtPnByb3RvID4+IDE7CisJc3RydWN0IG5sbV9ob3N0CQkqaG9zdDsKKworCWRwcmludGsoImxvY2tkOiBTTV9OT1RJRlkgICAgIGNhbGxlZFxuIik7CisJaWYgKHNhZGRyLnNpbl9hZGRyLnNfYWRkciAhPSBodG9ubChJTkFERFJfTE9PUEJBQ0spCisJIHx8IG50b2hzKHNhZGRyLnNpbl9wb3J0KSA+PSAxMDI0KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSJsb2NrZDogcmVqZWN0ZWQgTlNNIGNhbGxiYWNrIGZyb20gJTA4eDolZFxuIiwKKwkJCW50b2hsKHJxc3RwLT5ycV9hZGRyLnNpbl9hZGRyLnNfYWRkciksCisJCQludG9ocyhycXN0cC0+cnFfYWRkci5zaW5fcG9ydCkpOworCQlyZXR1cm4gcnBjX3N5c3RlbV9lcnI7CisJfQorCisJLyogT2J0YWluIHRoZSBob3N0IHBvaW50ZXIgZm9yIHRoaXMgTkZTIHNlcnZlciBhbmQgdHJ5IHRvCisJICogcmVjbGFpbSBhbGwgbG9ja3Mgd2UgaG9sZCBvbiB0aGlzIHNlcnZlci4KKwkgKi8KKwlzYWRkci5zaW5fYWRkci5zX2FkZHIgPSBhcmdwLT5hZGRyOworCWlmICgoYXJncC0+cHJvdG8gJiAxKT09MCkgeworCQlpZiAoKGhvc3QgPSBubG1jbG50X2xvb2t1cF9ob3N0KCZzYWRkciwgcHJvdCwgdmVycykpICE9IE5VTEwpIHsKKwkJCW5sbWNsbnRfcmVjb3ZlcnkoaG9zdCwgYXJncC0+c3RhdGUpOworCQkJbmxtX3JlbGVhc2VfaG9zdChob3N0KTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIElmIHdlIHJ1biBvbiBhbiBORlMgc2VydmVyLCBkZWxldGUgYWxsIGxvY2tzIGhlbGQgYnkgdGhlIGNsaWVudCAqLworCQlpZiAoKGhvc3QgPSBubG1fbG9va3VwX2hvc3QoMSwgJnNhZGRyLCBwcm90LCB2ZXJzKSkgIT0gTlVMTCkgeworCQkJbmxtc3ZjX2ZyZWVfaG9zdF9yZXNvdXJjZXMoaG9zdCk7CisJCQlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCQl9CisJfQorCisJcmV0dXJuIHJwY19zdWNjZXNzOworfQorCisvKgorICogY2xpZW50IHNlbnQgYSBHUkFOVEVEX1JFUywgbGV0J3MgcmVtb3ZlIHRoZSBhc3NvY2lhdGVkIGJsb2NrCisgKi8KK3N0YXRpYyBpbnQKK25sbXN2Y19wcm9jX2dyYW50ZWRfcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBubG1fcmVzICAqYXJncCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqcmVzcCkKK3sKKwlpZiAoIW5sbXN2Y19vcHMpCisJCXJldHVybiBycGNfc3VjY2VzczsKKworCWRwcmludGsoImxvY2tkOiBHUkFOVEVEX1JFUyAgIGNhbGxlZFxuIik7CisKKwlubG1zdmNfZ3JhbnRfcmVwbHkocnFzdHAsICZhcmdwLT5jb29raWUsIGFyZ3AtPnN0YXR1cyk7CisJcmV0dXJuIHJwY19zdWNjZXNzOworfQorCisvKgorICogVGhpcyBpcyB0aGUgZ2VuZXJpYyBsb2NrZCBjYWxsYmFjayBmb3IgYXN5bmMgUlBDIGNhbGxzCisgKi8KK3N0YXRpYyB1MzIKK25sbXN2Y19jYWxsYmFjayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgcHJvYywgc3RydWN0IG5sbV9yZXMgKnJlc3ApCit7CisJc3RydWN0IG5sbV9ob3N0CSpob3N0OworCXN0cnVjdCBubG1fcnFzdAkqY2FsbDsKKworCWlmICghKGNhbGwgPSBubG1jbG50X2FsbG9jX2NhbGwoKSkpCisJCXJldHVybiBycGNfc3lzdGVtX2VycjsKKworCWhvc3QgPSBubG1jbG50X2xvb2t1cF9ob3N0KCZycXN0cC0+cnFfYWRkciwKKwkJCQlycXN0cC0+cnFfcHJvdCwgcnFzdHAtPnJxX3ZlcnMpOworCWlmICghaG9zdCkgeworCQlrZnJlZShjYWxsKTsKKwkJcmV0dXJuIHJwY19zeXN0ZW1fZXJyOworCX0KKworCWNhbGwtPmFfZmxhZ3MgPSBSUENfVEFTS19BU1lOQzsKKwljYWxsLT5hX2hvc3QgID0gaG9zdDsKKwltZW1jcHkoJmNhbGwtPmFfYXJncywgcmVzcCwgc2l6ZW9mKCpyZXNwKSk7CisKKwlpZiAobmxtc3ZjX2FzeW5jX2NhbGwoY2FsbCwgcHJvYywgbmxtc3ZjX2NhbGxiYWNrX2V4aXQpIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXJldHVybiBycGNfc3VjY2VzczsKKyBlcnJvcjoKKwlubG1fcmVsZWFzZV9ob3N0KGhvc3QpOworCWtmcmVlKGNhbGwpOworCXJldHVybiBycGNfc3lzdGVtX2VycjsKK30KKworc3RhdGljIHZvaWQKK25sbXN2Y19jYWxsYmFja19leGl0KHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgbmxtX3Jxc3QJKmNhbGwgPSAoc3RydWN0IG5sbV9ycXN0ICopIHRhc2stPnRrX2NhbGxkYXRhOworCisJaWYgKHRhc2stPnRrX3N0YXR1cyA8IDApIHsKKwkJZHByaW50aygibG9ja2Q6ICU0ZCBjYWxsYmFjayBmYWlsZWQgKGVycm5vID0gJWQpXG4iLAorCQkJCQl0YXNrLT50a19waWQsIC10YXNrLT50a19zdGF0dXMpOworCX0KKwlubG1fcmVsZWFzZV9ob3N0KGNhbGwtPmFfaG9zdCk7CisJa2ZyZWUoY2FsbCk7Cit9CisKKy8qCisgKiBOTE0gU2VydmVyIHByb2NlZHVyZXMuCisgKi8KKworI2RlZmluZSBubG1zdmNfZW5jb2RlX25vcmVwCW5sbXN2Y19lbmNvZGVfdm9pZAorI2RlZmluZSBubG1zdmNfZGVjb2RlX25vcmVwCW5sbXN2Y19kZWNvZGVfdm9pZAorI2RlZmluZSBubG1zdmNfZGVjb2RlX3Rlc3RyZXMJbmxtc3ZjX2RlY29kZV92b2lkCisjZGVmaW5lIG5sbXN2Y19kZWNvZGVfbG9ja3JlcwlubG1zdmNfZGVjb2RlX3ZvaWQKKyNkZWZpbmUgbmxtc3ZjX2RlY29kZV91bmxvY2tyZXMJbmxtc3ZjX2RlY29kZV92b2lkCisjZGVmaW5lIG5sbXN2Y19kZWNvZGVfY2FuY2VscmVzCW5sbXN2Y19kZWNvZGVfdm9pZAorI2RlZmluZSBubG1zdmNfZGVjb2RlX2dyYW50ZWRyZXMJbmxtc3ZjX2RlY29kZV92b2lkCisKKyNkZWZpbmUgbmxtc3ZjX3Byb2Nfbm9uZQlubG1zdmNfcHJvY19udWxsCisjZGVmaW5lIG5sbXN2Y19wcm9jX3Rlc3RfcmVzCW5sbXN2Y19wcm9jX251bGwKKyNkZWZpbmUgbmxtc3ZjX3Byb2NfbG9ja19yZXMJbmxtc3ZjX3Byb2NfbnVsbAorI2RlZmluZSBubG1zdmNfcHJvY19jYW5jZWxfcmVzCW5sbXN2Y19wcm9jX251bGwKKyNkZWZpbmUgbmxtc3ZjX3Byb2NfdW5sb2NrX3JlcwlubG1zdmNfcHJvY19udWxsCisKK3N0cnVjdCBubG1fdm9pZAkJCXsgaW50IGR1bW15OyB9OworCisjZGVmaW5lIFBST0MobmFtZSwgeGFyZ3QsIHhyZXN0LCBhcmd0LCByZXN0LCByZXNwc2l6ZSkJXAorIHsgLnBjX2Z1bmMJPSAoc3ZjX3Byb2NmdW5jKSBubG1zdmNfcHJvY18jI25hbWUsCVwKKyAgIC5wY19kZWNvZGUJPSAoa3hkcnByb2NfdCkgbmxtc3ZjX2RlY29kZV8jI3hhcmd0LAlcCisgICAucGNfZW5jb2RlCT0gKGt4ZHJwcm9jX3QpIG5sbXN2Y19lbmNvZGVfIyN4cmVzdCwJXAorICAgLnBjX3JlbGVhc2UJPSBOVUxMLAkJCQkJXAorICAgLnBjX2FyZ3NpemUJPSBzaXplb2Yoc3RydWN0IG5sbV8jI2FyZ3QpLAkJXAorICAgLnBjX3Jlc3NpemUJPSBzaXplb2Yoc3RydWN0IG5sbV8jI3Jlc3QpLAkJXAorICAgLnBjX3hkcnJlc3NpemUgPSByZXNwc2l6ZSwJCQkJXAorIH0KKworI2RlZmluZQlDawkoMStYRFJfUVVBRExFTihOTE1fTUFYQ09PS0lFTEVOKSkJLyogY29va2llICovCisjZGVmaW5lCVN0CTEJCQkJLyogc3RhdHVzICovCisjZGVmaW5lCU5vCSgxKzEwMjQvNCkJCQkvKiBOZXQgT2JqICovCisjZGVmaW5lCVJnCTIJCQkJLyogcmFuZ2UgLSBvZmZzZXQgKyBzaXplICovCisKK3N0cnVjdCBzdmNfcHJvY2VkdXJlCQlubG1zdmNfcHJvY2VkdXJlc1tdID0geworICBQUk9DKG51bGwsCQl2b2lkLAkJdm9pZCwJCXZvaWQsCXZvaWQsIDEpLAorICBQUk9DKHRlc3QsCQl0ZXN0YXJncywJdGVzdHJlcywJYXJncywJcmVzLCBDaytTdCsyK05vK1JnKSwKKyAgUFJPQyhsb2NrLAkJbG9ja2FyZ3MsCXJlcywJCWFyZ3MsCXJlcywgQ2srU3QpLAorICBQUk9DKGNhbmNlbCwJCWNhbmNhcmdzLAlyZXMsCQlhcmdzLAlyZXMsIENrK1N0KSwKKyAgUFJPQyh1bmxvY2ssCQl1bmxvY2thcmdzLAlyZXMsCQlhcmdzLAlyZXMsIENrK1N0KSwKKyAgUFJPQyhncmFudGVkLAkJdGVzdGFyZ3MsCXJlcywJCWFyZ3MsCXJlcywgQ2srU3QpLAorICBQUk9DKHRlc3RfbXNnLAl0ZXN0YXJncywJbm9yZXAsCQlhcmdzLAl2b2lkLCAxKSwKKyAgUFJPQyhsb2NrX21zZywJbG9ja2FyZ3MsCW5vcmVwLAkJYXJncywJdm9pZCwgMSksCisgIFBST0MoY2FuY2VsX21zZywJY2FuY2FyZ3MsCW5vcmVwLAkJYXJncywJdm9pZCwgMSksCisgIFBST0ModW5sb2NrX21zZywJdW5sb2NrYXJncywJbm9yZXAsCQlhcmdzLAl2b2lkLCAxKSwKKyAgUFJPQyhncmFudGVkX21zZywJdGVzdGFyZ3MsCW5vcmVwLAkJYXJncywJdm9pZCwgMSksCisgIFBST0ModGVzdF9yZXMsCXRlc3RyZXMsCW5vcmVwLAkJcmVzLAl2b2lkLCAxKSwKKyAgUFJPQyhsb2NrX3JlcywJbG9ja3JlcywJbm9yZXAsCQlyZXMsCXZvaWQsIDEpLAorICBQUk9DKGNhbmNlbF9yZXMsCWNhbmNlbHJlcywJbm9yZXAsCQlyZXMsCXZvaWQsIDEpLAorICBQUk9DKHVubG9ja19yZXMsCXVubG9ja3JlcywJbm9yZXAsCQlyZXMsCXZvaWQsIDEpLAorICBQUk9DKGdyYW50ZWRfcmVzLAlyZXMsCQlub3JlcCwJCXJlcywJdm9pZCwgMSksCisgIC8qIHN0YXRkIGNhbGxiYWNrICovCisgIFBST0Moc21fbm90aWZ5LAlyZWJvb3QsCQl2b2lkLAkJcmVib290LAl2b2lkLCAxKSwKKyAgUFJPQyhub25lLAkJdm9pZCwJCXZvaWQsCQl2b2lkLAl2b2lkLCAxKSwKKyAgUFJPQyhub25lLAkJdm9pZCwJCXZvaWQsCQl2b2lkLAl2b2lkLCAxKSwKKyAgUFJPQyhub25lLAkJdm9pZCwJCXZvaWQsCQl2b2lkLAl2b2lkLCAxKSwKKyAgUFJPQyhzaGFyZSwJCXNoYXJlYXJncywJc2hhcmVyZXMsCWFyZ3MsCXJlcywgQ2srU3QrMSksCisgIFBST0ModW5zaGFyZSwJCXNoYXJlYXJncywJc2hhcmVyZXMsCWFyZ3MsCXJlcywgQ2srU3QrMSksCisgIFBST0Mobm1fbG9jaywJCWxvY2thcmdzLAlyZXMsCQlhcmdzLAlyZXMsIENrK1N0KSwKKyAgUFJPQyhmcmVlX2FsbCwJbm90aWZ5LAkJdm9pZCwJCWFyZ3MsCXZvaWQsIDApLAorCit9OwpkaWZmIC0tZ2l0IGEvZnMvbG9ja2Qvc3Zjc2hhcmUuYyBiL2ZzL2xvY2tkL3N2Y3NoYXJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk0M2ZiNwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2xvY2tkL3N2Y3NoYXJlLmMKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBsaW51eC9mcy9sb2NrZC9zdmNzaGFyZS5jCisgKgorICogTWFuYWdlbWVudCBvZiBET1Mgc2hhcmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Yy5oPgorI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2xvY2tkLmg+CisjaW5jbHVkZSA8bGludXgvbG9ja2Qvc2hhcmUuaD4KKworc3RhdGljIGlubGluZSBpbnQKK25sbV9jbXBfb3duZXIoc3RydWN0IG5sbV9zaGFyZSAqc2hhcmUsIHN0cnVjdCB4ZHJfbmV0b2JqICpvaCkKK3sKKwlyZXR1cm4gc2hhcmUtPnNfb3duZXIubGVuID09IG9oLT5sZW4KKwkgICAgJiYgIW1lbWNtcChzaGFyZS0+c19vd25lci5kYXRhLCBvaC0+ZGF0YSwgb2gtPmxlbik7Cit9CisKK3UzMgorbmxtc3ZjX3NoYXJlX2ZpbGUoc3RydWN0IG5sbV9ob3N0ICpob3N0LCBzdHJ1Y3QgbmxtX2ZpbGUgKmZpbGUsCisJCQlzdHJ1Y3QgbmxtX2FyZ3MgKmFyZ3ApCit7CisJc3RydWN0IG5sbV9zaGFyZQkqc2hhcmU7CisJc3RydWN0IHhkcl9uZXRvYmoJKm9oID0gJmFyZ3AtPmxvY2sub2g7CisJdTgJCQkqb2hkYXRhOworCisJZm9yIChzaGFyZSA9IGZpbGUtPmZfc2hhcmVzOyBzaGFyZTsgc2hhcmUgPSBzaGFyZS0+c19uZXh0KSB7CisJCWlmIChzaGFyZS0+c19ob3N0ID09IGhvc3QgJiYgbmxtX2NtcF9vd25lcihzaGFyZSwgb2gpKQorCQkJZ290byB1cGRhdGU7CisJCWlmICgoYXJncC0+ZnNtX2FjY2VzcyAmIHNoYXJlLT5zX21vZGUpCisJCSB8fCAoYXJncC0+ZnNtX21vZGUgICAmIHNoYXJlLT5zX2FjY2VzcyApKQorCQkJcmV0dXJuIG5sbV9sY2tfZGVuaWVkOworCX0KKworCXNoYXJlID0gKHN0cnVjdCBubG1fc2hhcmUgKikga21hbGxvYyhzaXplb2YoKnNoYXJlKSArIG9oLT5sZW4sCisJCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoc2hhcmUgPT0gTlVMTCkKKwkJcmV0dXJuIG5sbV9sY2tfZGVuaWVkX25vbG9ja3M7CisKKwkvKiBDb3B5IG93bmVyIGhhbmRsZSAqLworCW9oZGF0YSA9ICh1OCAqKSAoc2hhcmUgKyAxKTsKKwltZW1jcHkob2hkYXRhLCBvaC0+ZGF0YSwgb2gtPmxlbik7CisKKwlzaGFyZS0+c19maWxlCSAgICA9IGZpbGU7CisJc2hhcmUtPnNfaG9zdCAgICAgICA9IGhvc3Q7CisJc2hhcmUtPnNfb3duZXIuZGF0YSA9IG9oZGF0YTsKKwlzaGFyZS0+c19vd25lci5sZW4gID0gb2gtPmxlbjsKKwlzaGFyZS0+c19uZXh0ICAgICAgID0gZmlsZS0+Zl9zaGFyZXM7CisJZmlsZS0+Zl9zaGFyZXMgICAgICA9IHNoYXJlOworCit1cGRhdGU6CisJc2hhcmUtPnNfYWNjZXNzID0gYXJncC0+ZnNtX2FjY2VzczsKKwlzaGFyZS0+c19tb2RlICAgPSBhcmdwLT5mc21fbW9kZTsKKwlyZXR1cm4gbmxtX2dyYW50ZWQ7Cit9CisKKy8qCisgKiBEZWxldGUgYSBzaGFyZS4KKyAqLwordTMyCitubG1zdmNfdW5zaGFyZV9maWxlKHN0cnVjdCBubG1faG9zdCAqaG9zdCwgc3RydWN0IG5sbV9maWxlICpmaWxlLAorCQkJc3RydWN0IG5sbV9hcmdzICphcmdwKQoreworCXN0cnVjdCBubG1fc2hhcmUJKnNoYXJlLCAqKnNocHA7CisJc3RydWN0IHhkcl9uZXRvYmoJKm9oID0gJmFyZ3AtPmxvY2sub2g7CisKKwlmb3IgKHNocHAgPSAmZmlsZS0+Zl9zaGFyZXM7IChzaGFyZSA9ICpzaHBwKSAhPSAwOyBzaHBwID0gJnNoYXJlLT5zX25leHQpIHsKKwkJaWYgKHNoYXJlLT5zX2hvc3QgPT0gaG9zdCAmJiBubG1fY21wX293bmVyKHNoYXJlLCBvaCkpIHsKKwkJCSpzaHBwID0gc2hhcmUtPnNfbmV4dDsKKwkJCWtmcmVlKHNoYXJlKTsKKwkJCXJldHVybiBubG1fZ3JhbnRlZDsKKwkJfQorCX0KKworCS8qIFgvT3BlbiBzcGVjIHNheXMgcmV0dXJuIHN1Y2Nlc3MgZXZlbiBpZiB0aGVyZSB3YXMgbm8KKwkgKiBjb3JyZXNwb25kaW5nIHNoYXJlLiAqLworCXJldHVybiBubG1fZ3JhbnRlZDsKK30KKworLyoKKyAqIFRyYXZlcnNlIGFsbCBzaGFyZXMgZm9yIGEgZ2l2ZW4gZmlsZSAoYW5kIGhvc3QpLgorICogTkxNX0FDVF9DSEVDSyBpcyBoYW5kbGVkIGJ5IG5sbXN2Y19pbnNwZWN0X2ZpbGUuCisgKi8KK2ludAorbmxtc3ZjX3RyYXZlcnNlX3NoYXJlcyhzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QsIHN0cnVjdCBubG1fZmlsZSAqZmlsZSwgaW50IGFjdGlvbikKK3sKKwlzdHJ1Y3QgbmxtX3NoYXJlCSpzaGFyZSwgKipzaHBwOworCisJc2hwcCA9ICZmaWxlLT5mX3NoYXJlczsKKwl3aGlsZSAoKHNoYXJlID0gKnNocHApICE9ICBOVUxMKSB7CisJCWlmIChhY3Rpb24gPT0gTkxNX0FDVF9NQVJLKQorCQkJc2hhcmUtPnNfaG9zdC0+aF9pbnVzZSA9IDE7CisJCWVsc2UgaWYgKGFjdGlvbiA9PSBOTE1fQUNUX1VOTE9DSykgeworCQkJaWYgKGhvc3QgPT0gTlVMTCB8fCBob3N0ID09IHNoYXJlLT5zX2hvc3QpIHsKKwkJCQkqc2hwcCA9IHNoYXJlLT5zX25leHQ7CisJCQkJa2ZyZWUoc2hhcmUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCXNocHAgPSAmc2hhcmUtPnNfbmV4dDsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL2xvY2tkL3N2Y3N1YnMuYyBiL2ZzL2xvY2tkL3N2Y3N1YnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTc1MzYzCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbG9ja2Qvc3Zjc3Vicy5jCkBAIC0wLDAgKzEsMzA5IEBACisvKgorICogbGludXgvZnMvbG9ja2Qvc3Zjc3Vicy5jCisgKgorICogVmFyaW91cyBzdXBwb3J0IHJvdXRpbmVzIGZvciB0aGUgTkxNIHNlcnZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYsIE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2QvbmZzZmguaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2xvY2tkLmg+CisjaW5jbHVkZSA8bGludXgvbG9ja2Qvc2hhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2NrZC9zbV9pbnRlci5oPgorCisjZGVmaW5lIE5MTURCR19GQUNJTElUWQkJTkxNREJHX1NWQ1NVQlMKKworCisvKgorICogR2xvYmFsIGZpbGUgaGFzaCB0YWJsZQorICovCisjZGVmaW5lIEZJTEVfSEFTSF9CSVRTCQk1CisjZGVmaW5lIEZJTEVfTlJIQVNICQkoMTw8RklMRV9IQVNIX0JJVFMpCitzdGF0aWMgc3RydWN0IG5sbV9maWxlICoJbmxtX2ZpbGVzW0ZJTEVfTlJIQVNIXTsKK3N0YXRpYyBERUNMQVJFX01VVEVYKG5sbV9maWxlX3NlbWEpOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBmaWxlX2hhc2goc3RydWN0IG5mc19maCAqZikKK3sKKwl1bnNpZ25lZCBpbnQgdG1wPTA7CisJaW50IGk7CisJZm9yIChpPTA7IGk8TkZTMl9GSFNJWkU7aSsrKQorCQl0bXAgKz0gZi0+ZGF0YVtpXTsKKwlyZXR1cm4gdG1wICYgKEZJTEVfTlJIQVNIIC0gMSk7Cit9CisKKy8qCisgKiBMb29rdXAgZmlsZSBpbmZvLiBJZiBpdCBkb2Vzbid0IGV4aXN0LCBjcmVhdGUgYSBmaWxlIGluZm8gc3RydWN0CisgKiBhbmQgb3BlbiBhIChWRlMpIGZpbGUgZm9yIHRoZSBnaXZlbiBpbm9kZS4KKyAqCisgKiBGSVhNRToKKyAqIE5vdGUgdGhhdCB3ZSBvcGVuIHRoZSBmaWxlIE9fUkRPTkxZIGV2ZW4gd2hlbiBjcmVhdGluZyB3cml0ZSBsb2Nrcy4KKyAqIFRoaXMgaXMgbm90IHF1aXRlIHJpZ2h0LCBidXQgZm9yIG5vdywgd2UgYXNzdW1lIHRoZSBjbGllbnQgcGVyZm9ybXMKKyAqIHRoZSBwcm9wZXIgUi9XIGNoZWNraW5nLgorICovCit1MzIKK25sbV9sb29rdXBfZmlsZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmxtX2ZpbGUgKipyZXN1bHQsCisJCQkJCXN0cnVjdCBuZnNfZmggKmYpCit7CisJc3RydWN0IG5sbV9maWxlCSpmaWxlOworCXVuc2lnbmVkIGludAloYXNoOworCXUzMgkJbmZzZXJyOworCXUzMgkJKmZocCA9ICh1MzIqKWYtPmRhdGE7CisKKwlkcHJpbnRrKCJsb2NrZDogbmxtX2ZpbGVfbG9va3VwKCUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4KVxuIiwKKwkJZmhwWzBdLCBmaHBbMV0sIGZocFsyXSwgZmhwWzNdLCBmaHBbNF0sIGZocFs1XSk7CisKKworCWhhc2ggPSBmaWxlX2hhc2goZik7CisKKwkvKiBMb2NrIGZpbGUgdGFibGUgKi8KKwlkb3duKCZubG1fZmlsZV9zZW1hKTsKKworCWZvciAoZmlsZSA9IG5sbV9maWxlc1toYXNoXTsgZmlsZTsgZmlsZSA9IGZpbGUtPmZfbmV4dCkKKwkJaWYgKCFuZnNfY29tcGFyZV9maCgmZmlsZS0+Zl9oYW5kbGUsIGYpKQorCQkJZ290byBmb3VuZDsKKworCWRwcmludGsoImxvY2tkOiBjcmVhdGluZyBmaWxlIGZvciAoJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHgpXG4iLAorCQlmaHBbMF0sIGZocFsxXSwgZmhwWzJdLCBmaHBbM10sIGZocFs0XSwgZmhwWzVdKTsKKworCW5mc2VyciA9IG5sbV9sY2tfZGVuaWVkX25vbG9ja3M7CisJZmlsZSA9IChzdHJ1Y3QgbmxtX2ZpbGUgKikga21hbGxvYyhzaXplb2YoKmZpbGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZpbGUpCisJCWdvdG8gb3V0X3VubG9jazsKKworCW1lbXNldChmaWxlLCAwLCBzaXplb2YoKmZpbGUpKTsKKwltZW1jcHkoJmZpbGUtPmZfaGFuZGxlLCBmLCBzaXplb2Yoc3RydWN0IG5mc19maCkpOworCWZpbGUtPmZfaGFzaCA9IGhhc2g7CisJaW5pdF9NVVRFWCgmZmlsZS0+Zl9zZW1hKTsKKworCS8qIE9wZW4gdGhlIGZpbGUuIE5vdGUgdGhhdCB0aGlzIG11c3Qgbm90IHNsZWVwIGZvciB0b28gbG9uZywgZWxzZQorCSAqIHdlIHdvdWxkIGxvY2sgdXAgbG9ja2Q6LSkgU28gbm8gTkZTIHJlLWV4cG9ydHMsIGZvbGtzLgorCSAqCisJICogV2UgaGF2ZSB0byBtYWtlIHN1cmUgd2UgaGF2ZSB0aGUgcmlnaHQgY3JlZGVudGlhbCB0byBvcGVuCisJICogdGhlIGZpbGUuCisJICovCisJaWYgKChuZnNlcnIgPSBubG1zdmNfb3BzLT5mb3BlbihycXN0cCwgZiwgJmZpbGUtPmZfZmlsZSkpICE9IDApIHsKKwkJZHByaW50aygibG9ja2Q6IG9wZW4gZmFpbGVkIChuZnNlcnIgJWQpXG4iLCBudG9obChuZnNlcnIpKTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlmaWxlLT5mX25leHQgPSBubG1fZmlsZXNbaGFzaF07CisJbmxtX2ZpbGVzW2hhc2hdID0gZmlsZTsKKworZm91bmQ6CisJZHByaW50aygibG9ja2Q6IGZvdW5kIGZpbGUgJXAgKGNvdW50ICVkKVxuIiwgZmlsZSwgZmlsZS0+Zl9jb3VudCk7CisJKnJlc3VsdCA9IGZpbGU7CisJZmlsZS0+Zl9jb3VudCsrOworCW5mc2VyciA9IDA7CisKK291dF91bmxvY2s6CisJdXAoJm5sbV9maWxlX3NlbWEpOworCXJldHVybiBuZnNlcnI7CisKK291dF9mcmVlOgorCWtmcmVlKGZpbGUpOworI2lmZGVmIENPTkZJR19MT0NLRF9WNAorCWlmIChuZnNlcnIgPT0gMSkKKwkJbmZzZXJyID0gbmxtNF9zdGFsZV9maDsKKwllbHNlCisjZW5kaWYKKwluZnNlcnIgPSBubG1fbGNrX2RlbmllZDsKKwlnb3RvIG91dF91bmxvY2s7Cit9CisKKy8qCisgKiBEZWxldGUgYSBmaWxlIGFmdGVyIGhhdmluZyByZWxlYXNlZCBhbGwgbG9ja3MsIGJsb2NrcyBhbmQgc2hhcmVzCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorbmxtX2RlbGV0ZV9maWxlKHN0cnVjdCBubG1fZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgbmxtX2ZpbGUJKipmcCwgKmY7CisKKwlkcHJpbnRrKCJsb2NrZDogY2xvc2luZyBmaWxlICVzLyVsZFxuIiwKKwkJaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubyk7CisJZnAgPSBubG1fZmlsZXMgKyBmaWxlLT5mX2hhc2g7CisJd2hpbGUgKChmID0gKmZwKSAhPSBOVUxMKSB7CisJCWlmIChmID09IGZpbGUpIHsKKwkJCSpmcCA9IGZpbGUtPmZfbmV4dDsKKwkJCW5sbXN2Y19vcHMtPmZjbG9zZShmaWxlLT5mX2ZpbGUpOworCQkJa2ZyZWUoZmlsZSk7CisJCQlyZXR1cm47CisJCX0KKwkJZnAgPSAmZi0+Zl9uZXh0OworCX0KKworCXByaW50ayhLRVJOX1dBUk5JTkcgImxvY2tkOiBhdHRlbXB0IHRvIHJlbGVhc2UgdW5rbm93biBmaWxlIVxuIik7Cit9CisKKy8qCisgKiBMb29wIG92ZXIgYWxsIGxvY2tzIG9uIHRoZSBnaXZlbiBmaWxlIGFuZCBwZXJmb3JtIHRoZSBzcGVjaWZpZWQKKyAqIGFjdGlvbi4KKyAqLworc3RhdGljIGludAorbmxtX3RyYXZlcnNlX2xvY2tzKHN0cnVjdCBubG1faG9zdCAqaG9zdCwgc3RydWN0IG5sbV9maWxlICpmaWxlLCBpbnQgYWN0aW9uKQoreworCXN0cnVjdCBpbm9kZQkgKmlub2RlID0gbmxtc3ZjX2ZpbGVfaW5vZGUoZmlsZSk7CisJc3RydWN0IGZpbGVfbG9jayAqZmw7CisJc3RydWN0IG5sbV9ob3N0CSAqbG9ja2hvc3Q7CisKK2FnYWluOgorCWZpbGUtPmZfbG9ja3MgPSAwOworCWZvciAoZmwgPSBpbm9kZS0+aV9mbG9jazsgZmw7IGZsID0gZmwtPmZsX25leHQpIHsKKwkJaWYgKCEoZmwtPmZsX2ZsYWdzICYgRkxfTE9DS0QpKQorCQkJY29udGludWU7CisKKwkJLyogdXBkYXRlIGN1cnJlbnQgbG9jayBjb3VudCAqLworCQlmaWxlLT5mX2xvY2tzKys7CisJCWxvY2tob3N0ID0gKHN0cnVjdCBubG1faG9zdCAqKSBmbC0+Zmxfb3duZXI7CisJCWlmIChhY3Rpb24gPT0gTkxNX0FDVF9NQVJLKQorCQkJbG9ja2hvc3QtPmhfaW51c2UgPSAxOworCQllbHNlIGlmIChhY3Rpb24gPT0gTkxNX0FDVF9DSEVDSykKKwkJCXJldHVybiAxOworCQllbHNlIGlmIChhY3Rpb24gPT0gTkxNX0FDVF9VTkxPQ0spIHsKKwkJCXN0cnVjdCBmaWxlX2xvY2sgbG9jayA9ICpmbDsKKworCQkJaWYgKGhvc3QgJiYgbG9ja2hvc3QgIT0gaG9zdCkKKwkJCQljb250aW51ZTsKKworCQkJbG9jay5mbF90eXBlICA9IEZfVU5MQ0s7CisJCQlsb2NrLmZsX3N0YXJ0ID0gMDsKKwkJCWxvY2suZmxfZW5kICAgPSBPRkZTRVRfTUFYOworCQkJaWYgKHBvc2l4X2xvY2tfZmlsZShmaWxlLT5mX2ZpbGUsICZsb2NrKSA8IDApIHsKKwkJCQlwcmludGsoImxvY2tkOiB1bmxvY2sgZmFpbHVyZSBpbiAlczolZFxuIiwKKwkJCQkJCV9fRklMRV9fLCBfX0xJTkVfXyk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlnb3RvIGFnYWluOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBPcGVyYXRlIG9uIGEgc2luZ2xlIGZpbGUKKyAqLworc3RhdGljIGlubGluZSBpbnQKK25sbV9pbnNwZWN0X2ZpbGUoc3RydWN0IG5sbV9ob3N0ICpob3N0LCBzdHJ1Y3QgbmxtX2ZpbGUgKmZpbGUsIGludCBhY3Rpb24pCit7CisJaWYgKGFjdGlvbiA9PSBOTE1fQUNUX0NIRUNLKSB7CisJCS8qIEZhc3QgcGF0aCBmb3IgbWFyayBhbmQgc3dlZXAgZ2FyYmFnZSBjb2xsZWN0aW9uICovCisJCWlmIChmaWxlLT5mX2NvdW50IHx8IGZpbGUtPmZfYmxvY2tzIHx8IGZpbGUtPmZfc2hhcmVzKQorCQkJcmV0dXJuIDE7CisJfSBlbHNlIHsKKwkJaWYgKG5sbXN2Y190cmF2ZXJzZV9ibG9ja3MoaG9zdCwgZmlsZSwgYWN0aW9uKQorCQkgfHwgbmxtc3ZjX3RyYXZlcnNlX3NoYXJlcyhob3N0LCBmaWxlLCBhY3Rpb24pKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiBubG1fdHJhdmVyc2VfbG9ja3MoaG9zdCwgZmlsZSwgYWN0aW9uKTsKK30KKworLyoKKyAqIExvb3Agb3ZlciBhbGwgZmlsZXMgaW4gdGhlIGZpbGUgdGFibGUuCisgKi8KK3N0YXRpYyBpbnQKK25sbV90cmF2ZXJzZV9maWxlcyhzdHJ1Y3QgbmxtX2hvc3QgKmhvc3QsIGludCBhY3Rpb24pCit7CisJc3RydWN0IG5sbV9maWxlCSpmaWxlLCAqKmZwOworCWludAkJaTsKKworCWRvd24oJm5sbV9maWxlX3NlbWEpOworCWZvciAoaSA9IDA7IGkgPCBGSUxFX05SSEFTSDsgaSsrKSB7CisJCWZwID0gbmxtX2ZpbGVzICsgaTsKKwkJd2hpbGUgKChmaWxlID0gKmZwKSAhPSBOVUxMKSB7CisJCQkvKiBUcmF2ZXJzZSBsb2NrcywgYmxvY2tzIGFuZCBzaGFyZXMgb2YgdGhpcyBmaWxlCisJCQkgKiBhbmQgdXBkYXRlIGZpbGUtPmZfbG9ja3MgY291bnQgKi8KKwkJCWlmIChubG1faW5zcGVjdF9maWxlKGhvc3QsIGZpbGUsIGFjdGlvbikpIHsKKwkJCQl1cCgmbmxtX2ZpbGVfc2VtYSk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisKKwkJCS8qIE5vIG1vcmUgcmVmZXJlbmNlcyB0byB0aGlzIGZpbGUuIExldCBnbyBvZiBpdC4gKi8KKwkJCWlmICghZmlsZS0+Zl9ibG9ja3MgJiYgIWZpbGUtPmZfbG9ja3MKKwkJCSAmJiAhZmlsZS0+Zl9zaGFyZXMgJiYgIWZpbGUtPmZfY291bnQpIHsKKwkJCQkqZnAgPSBmaWxlLT5mX25leHQ7CisJCQkJbmxtc3ZjX29wcy0+ZmNsb3NlKGZpbGUtPmZfZmlsZSk7CisJCQkJa2ZyZWUoZmlsZSk7CisJCQl9IGVsc2UgeworCQkJCWZwID0gJmZpbGUtPmZfbmV4dDsKKwkJCX0KKwkJfQorCX0KKwl1cCgmbmxtX2ZpbGVfc2VtYSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWxlYXNlIGZpbGUuIElmIHRoZXJlIGFyZSBubyBtb3JlIHJlbW90ZSBsb2NrcyBvbiB0aGlzIGZpbGUsCisgKiBjbG9zZSBpdCBhbmQgZnJlZSB0aGUgaGFuZGxlLgorICoKKyAqIE5vdGUgdGhhdCB3ZSBjYW4ndCBkbyBwcm9wZXIgcmVmZXJlbmNlIGNvdW50aW5nIHdpdGhvdXQgbWFqb3IKKyAqIGNvbnRvcnRpb25zIGJlY2F1c2UgdGhlIGNvZGUgaW4gZnMvbG9ja3MuYyBjcmVhdGVzLCBkZWxldGVzIGFuZAorICogc3BsaXRzIGxvY2tzIHdpdGhvdXQgbm90aWZpY2F0aW9uLiBPdXIgb25seSB3YXkgaXMgdG8gd2FsayB0aGUKKyAqIGVudGlyZSBsb2NrIGxpc3QgZWFjaCB0aW1lIHdlIHJlbW92ZSBhIGxvY2suCisgKi8KK3ZvaWQKK25sbV9yZWxlYXNlX2ZpbGUoc3RydWN0IG5sbV9maWxlICpmaWxlKQoreworCWRwcmludGsoImxvY2tkOiBubG1fcmVsZWFzZV9maWxlKCVwLCBjdCA9ICVkKVxuIiwKKwkJCQlmaWxlLCBmaWxlLT5mX2NvdW50KTsKKworCS8qIExvY2sgZmlsZSB0YWJsZSAqLworCWRvd24oJm5sbV9maWxlX3NlbWEpOworCisJLyogSWYgdGhlcmUgYXJlIG5vIG1vcmUgbG9ja3MgZXRjLCBkZWxldGUgdGhlIGZpbGUgKi8KKwlpZigtLWZpbGUtPmZfY291bnQgPT0gMCkgeworCQlpZighbmxtX2luc3BlY3RfZmlsZShOVUxMLCBmaWxlLCBOTE1fQUNUX0NIRUNLKSkKKwkJCW5sbV9kZWxldGVfZmlsZShmaWxlKTsKKwl9CisKKwl1cCgmbmxtX2ZpbGVfc2VtYSk7Cit9CisKKy8qCisgKiBNYXJrIGFsbCBob3N0cyB0aGF0IHN0aWxsIGhvbGQgcmVzb3VyY2VzCisgKi8KK3ZvaWQKK25sbXN2Y19tYXJrX3Jlc291cmNlcyh2b2lkKQoreworCWRwcmludGsoImxvY2tkOiBubG1zdmNfbWFya19yZXNvdXJjZXNcbiIpOworCisJbmxtX3RyYXZlcnNlX2ZpbGVzKE5VTEwsIE5MTV9BQ1RfTUFSSyk7Cit9CisKKy8qCisgKiBSZWxlYXNlIGFsbCByZXNvdXJjZXMgaGVsZCBieSB0aGUgZ2l2ZW4gY2xpZW50CisgKi8KK3ZvaWQKK25sbXN2Y19mcmVlX2hvc3RfcmVzb3VyY2VzKHN0cnVjdCBubG1faG9zdCAqaG9zdCkKK3sKKwlkcHJpbnRrKCJsb2NrZDogbmxtc3ZjX2ZyZWVfaG9zdF9yZXNvdXJjZXNcbiIpOworCisJaWYgKG5sbV90cmF2ZXJzZV9maWxlcyhob3N0LCBOTE1fQUNUX1VOTE9DSykpCisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSJsb2NrZDogY291bGRuJ3QgcmVtb3ZlIGFsbCBsb2NrcyBoZWxkIGJ5ICVzIiwKKwkJCWhvc3QtPmhfbmFtZSk7Cit9CisKKy8qCisgKiBkZWxldGUgYWxsIGhvc3RzIHN0cnVjdHMgZm9yIGNsaWVudHMKKyAqLwordm9pZAorbmxtc3ZjX2ludmFsaWRhdGVfYWxsKHZvaWQpCit7CisJc3RydWN0IG5sbV9ob3N0ICpob3N0OworCXdoaWxlICgoaG9zdCA9IG5sbV9maW5kX2NsaWVudCgpKSAhPSBOVUxMKSB7CisJCW5sbXN2Y19mcmVlX2hvc3RfcmVzb3VyY2VzKGhvc3QpOworCQlob3N0LT5oX2V4cGlyZXMgPSAwOworCQlob3N0LT5oX2tpbGxlZCA9IDE7CisJCW5sbV9yZWxlYXNlX2hvc3QoaG9zdCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZnMvbG9ja2QveGRyLmMgYi9mcy9sb2NrZC94ZHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDFlOWMwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbG9ja2QveGRyLmMKQEAgLTAsMCArMSw2MzUgQEAKKy8qCisgKiBsaW51eC9mcy9sb2NrZC94ZHIuYworICoKKyAqIFhEUiBzdXBwb3J0IGZvciBsb2NrZCBhbmQgdGhlIGxvY2sgY2xpZW50LgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnMuaD4KKworI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy94ZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3RhdHMuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2NrZC9sb2NrZC5oPgorI2luY2x1ZGUgPGxpbnV4L2xvY2tkL3NtX2ludGVyLmg+CisKKyNkZWZpbmUgTkxNREJHX0ZBQ0lMSVRZCQlOTE1EQkdfWERSCisKKworc3RhdGljIGlubGluZSBsb2ZmX3QKK3MzMl90b19sb2ZmX3QoX19zMzIgb2Zmc2V0KQoreworCXJldHVybiAobG9mZl90KW9mZnNldDsKK30KKworc3RhdGljIGlubGluZSBfX3MzMgorbG9mZl90X3RvX3MzMihsb2ZmX3Qgb2Zmc2V0KQoreworCV9fczMyIHJlczsKKwlpZiAob2Zmc2V0ID49IE5MTV9PRkZTRVRfTUFYKQorCQlyZXMgPSBOTE1fT0ZGU0VUX01BWDsKKwllbHNlIGlmIChvZmZzZXQgPD0gLU5MTV9PRkZTRVRfTUFYKQorCQlyZXMgPSAtTkxNX09GRlNFVF9NQVg7CisJZWxzZQorCQlyZXMgPSBvZmZzZXQ7CisJcmV0dXJuIHJlczsKK30KKworLyoKKyAqIFhEUiBmdW5jdGlvbnMgZm9yIGJhc2ljIE5MTSB0eXBlcworICovCitzdGF0aWMgaW5saW5lIHUzMiAqbmxtX2RlY29kZV9jb29raWUodTMyICpwLCBzdHJ1Y3QgbmxtX2Nvb2tpZSAqYykKK3sKKwl1bnNpZ25lZCBpbnQJbGVuOworCisJbGVuID0gbnRvaGwoKnArKyk7CisJCisJaWYobGVuPT0wKQorCXsKKwkJYy0+bGVuPTQ7CisJCW1lbXNldChjLT5kYXRhLCAwLCA0KTsJLyogaG9ja2V5cHV4IGJyYWluIGRhbWFnZSAqLworCX0KKwllbHNlIGlmKGxlbjw9TkxNX01BWENPT0tJRUxFTikKKwl7CisJCWMtPmxlbj1sZW47CisJCW1lbWNweShjLT5kYXRhLCBwLCBsZW4pOworCQlwKz1YRFJfUVVBRExFTihsZW4pOworCX0KKwllbHNlIAorCXsKKwkJcHJpbnRrKEtFUk5fTk9USUNFCisJCQkibG9ja2Q6IGJhZCBjb29raWUgc2l6ZSAlZCAob25seSBjb29raWVzIHVuZGVyICVkIGJ5dGVzIGFyZSBzdXBwb3J0ZWQuKVxuIiwgbGVuLCBOTE1fTUFYQ09PS0lFTEVOKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBwOworfQorCitzdGF0aWMgaW5saW5lIHUzMiAqCitubG1fZW5jb2RlX2Nvb2tpZSh1MzIgKnAsIHN0cnVjdCBubG1fY29va2llICpjKQoreworCSpwKysgPSBodG9ubChjLT5sZW4pOworCW1lbWNweShwLCBjLT5kYXRhLCBjLT5sZW4pOworCXArPVhEUl9RVUFETEVOKGMtPmxlbik7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyICoKK25sbV9kZWNvZGVfZmgodTMyICpwLCBzdHJ1Y3QgbmZzX2ZoICpmKQoreworCXVuc2lnbmVkIGludAlsZW47CisKKwlpZiAoKGxlbiA9IG50b2hsKCpwKyspKSAhPSBORlMyX0ZIU0laRSkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UKKwkJCSJsb2NrZDogYmFkIGZoYW5kbGUgc2l6ZSAlZCAoc2hvdWxkIGJlICVkKVxuIiwKKwkJCWxlbiwgTkZTMl9GSFNJWkUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJZi0+c2l6ZSA9IE5GUzJfRkhTSVpFOworCW1lbXNldChmLT5kYXRhLCAwLCBzaXplb2YoZi0+ZGF0YSkpOworCW1lbWNweShmLT5kYXRhLCBwLCBORlMyX0ZIU0laRSk7CisJcmV0dXJuIHAgKyBYRFJfUVVBRExFTihORlMyX0ZIU0laRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyICoKK25sbV9lbmNvZGVfZmgodTMyICpwLCBzdHJ1Y3QgbmZzX2ZoICpmKQoreworCSpwKysgPSBodG9ubChORlMyX0ZIU0laRSk7CisJbWVtY3B5KHAsIGYtPmRhdGEsIE5GUzJfRkhTSVpFKTsKKwlyZXR1cm4gcCArIFhEUl9RVUFETEVOKE5GUzJfRkhTSVpFKTsKK30KKworLyoKKyAqIEVuY29kZSBhbmQgZGVjb2RlIG93bmVyIGhhbmRsZQorICovCitzdGF0aWMgaW5saW5lIHUzMiAqCitubG1fZGVjb2RlX29oKHUzMiAqcCwgc3RydWN0IHhkcl9uZXRvYmogKm9oKQoreworCXJldHVybiB4ZHJfZGVjb2RlX25ldG9iaihwLCBvaCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyICoKK25sbV9lbmNvZGVfb2godTMyICpwLCBzdHJ1Y3QgeGRyX25ldG9iaiAqb2gpCit7CisJcmV0dXJuIHhkcl9lbmNvZGVfbmV0b2JqKHAsIG9oKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgKgorbmxtX2RlY29kZV9sb2NrKHUzMiAqcCwgc3RydWN0IG5sbV9sb2NrICpsb2NrKQoreworCXN0cnVjdCBmaWxlX2xvY2sJKmZsID0gJmxvY2stPmZsOworCXMzMgkJCXN0YXJ0LCBsZW4sIGVuZDsKKworCWlmICghKHAgPSB4ZHJfZGVjb2RlX3N0cmluZ19pbnBsYWNlKHAsICZsb2NrLT5jYWxsZXIsCisJCQkJCSAgICAmbG9jay0+bGVuLAorCQkJCQkgICAgTkxNX01BWFNUUkxFTikpCisJIHx8ICEocCA9IG5sbV9kZWNvZGVfZmgocCwgJmxvY2stPmZoKSkKKwkgfHwgIShwID0gbmxtX2RlY29kZV9vaChwLCAmbG9jay0+b2gpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlsb2Nrc19pbml0X2xvY2soZmwpOworCWZsLT5mbF9vd25lciA9IGN1cnJlbnQtPmZpbGVzOworCWZsLT5mbF9waWQgICA9IG50b2hsKCpwKyspOworCWZsLT5mbF9mbGFncyA9IEZMX1BPU0lYOworCWZsLT5mbF90eXBlICA9IEZfUkRMQ0s7CQkvKiBhcyBnb29kIGFzIGFueXRoaW5nIGVsc2UgKi8KKwlzdGFydCA9IG50b2hsKCpwKyspOworCWxlbiA9IG50b2hsKCpwKyspOworCWVuZCA9IHN0YXJ0ICsgbGVuIC0gMTsKKworCWZsLT5mbF9zdGFydCA9IHMzMl90b19sb2ZmX3Qoc3RhcnQpOworCisJaWYgKGxlbiA9PSAwIHx8IGVuZCA8IDApCisJCWZsLT5mbF9lbmQgPSBPRkZTRVRfTUFYOworCWVsc2UKKwkJZmwtPmZsX2VuZCA9IHMzMl90b19sb2ZmX3QoZW5kKTsKKwlyZXR1cm4gcDsKK30KKworLyoKKyAqIEVuY29kZSBhIGxvY2sgYXMgcGFydCBvZiBhbiBOTE0gY2FsbAorICovCitzdGF0aWMgdTMyICoKK25sbV9lbmNvZGVfbG9jayh1MzIgKnAsIHN0cnVjdCBubG1fbG9jayAqbG9jaykKK3sKKwlzdHJ1Y3QgZmlsZV9sb2NrCSpmbCA9ICZsb2NrLT5mbDsKKwlfX3MzMgkJCXN0YXJ0LCBsZW47CisKKwlpZiAoIShwID0geGRyX2VuY29kZV9zdHJpbmcocCwgbG9jay0+Y2FsbGVyKSkKKwkgfHwgIShwID0gbmxtX2VuY29kZV9maChwLCAmbG9jay0+ZmgpKQorCSB8fCAhKHAgPSBubG1fZW5jb2RlX29oKHAsICZsb2NrLT5vaCkpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChmbC0+Zmxfc3RhcnQgPiBOTE1fT0ZGU0VUX01BWAorCSB8fCAoZmwtPmZsX2VuZCA+IE5MTV9PRkZTRVRfTUFYICYmIGZsLT5mbF9lbmQgIT0gT0ZGU0VUX01BWCkpCisJCXJldHVybiBOVUxMOworCisJc3RhcnQgPSBsb2ZmX3RfdG9fczMyKGZsLT5mbF9zdGFydCk7CisJaWYgKGZsLT5mbF9lbmQgPT0gT0ZGU0VUX01BWCkKKwkJbGVuID0gMDsKKwllbHNlCisJCWxlbiA9IGxvZmZfdF90b19zMzIoZmwtPmZsX2VuZCAtIGZsLT5mbF9zdGFydCArIDEpOworCisJKnArKyA9IGh0b25sKGZsLT5mbF9waWQpOworCSpwKysgPSBodG9ubChzdGFydCk7CisJKnArKyA9IGh0b25sKGxlbik7CisKKwlyZXR1cm4gcDsKK30KKworLyoKKyAqIEVuY29kZSByZXN1bHQgb2YgYSBURVNUL1RFU1RfTVNHIGNhbGwKKyAqLworc3RhdGljIHUzMiAqCitubG1fZW5jb2RlX3Rlc3RyZXModTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKK3sKKwlzMzIJCXN0YXJ0LCBsZW47CisKKwlpZiAoIShwID0gbmxtX2VuY29kZV9jb29raWUocCwgJnJlc3AtPmNvb2tpZSkpKQorCQlyZXR1cm4gTlVMTDsKKwkqcCsrID0gcmVzcC0+c3RhdHVzOworCisJaWYgKHJlc3AtPnN0YXR1cyA9PSBubG1fbGNrX2RlbmllZCkgeworCQlzdHJ1Y3QgZmlsZV9sb2NrCSpmbCA9ICZyZXNwLT5sb2NrLmZsOworCisJCSpwKysgPSAoZmwtPmZsX3R5cGUgPT0gRl9SRExDSyk/IHhkcl96ZXJvIDogeGRyX29uZTsKKwkJKnArKyA9IGh0b25sKGZsLT5mbF9waWQpOworCisJCS8qIEVuY29kZSBvd25lciBoYW5kbGUuICovCisJCWlmICghKHAgPSB4ZHJfZW5jb2RlX25ldG9iaihwLCAmcmVzcC0+bG9jay5vaCkpKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJc3RhcnQgPSBsb2ZmX3RfdG9fczMyKGZsLT5mbF9zdGFydCk7CisJCWlmIChmbC0+ZmxfZW5kID09IE9GRlNFVF9NQVgpCisJCQlsZW4gPSAwOworCQllbHNlCisJCQlsZW4gPSBsb2ZmX3RfdG9fczMyKGZsLT5mbF9lbmQgLSBmbC0+Zmxfc3RhcnQgKyAxKTsKKworCQkqcCsrID0gaHRvbmwoc3RhcnQpOworCQkqcCsrID0gaHRvbmwobGVuKTsKKwl9CisKKwlyZXR1cm4gcDsKK30KKworCisvKgorICogRmlyc3QsIHRoZSBzZXJ2ZXIgc2lkZSBYRFIgZnVuY3Rpb25zCisgKi8KK2ludAorbmxtc3ZjX2RlY29kZV90ZXN0YXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIG5sbV9hcmdzICphcmdwKQoreworCXUzMglleGNsdXNpdmU7CisKKwlpZiAoIShwID0gbmxtX2RlY29kZV9jb29raWUocCwgJmFyZ3AtPmNvb2tpZSkpKQorCQlyZXR1cm4gMDsKKworCWV4Y2x1c2l2ZSA9IG50b2hsKCpwKyspOworCWlmICghKHAgPSBubG1fZGVjb2RlX2xvY2socCwgJmFyZ3AtPmxvY2spKSkKKwkJcmV0dXJuIDA7CisJaWYgKGV4Y2x1c2l2ZSkKKwkJYXJncC0+bG9jay5mbC5mbF90eXBlID0gRl9XUkxDSzsKKworCXJldHVybiB4ZHJfYXJnc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKK2ludAorbmxtc3ZjX2VuY29kZV90ZXN0cmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCit7CisJaWYgKCEocCA9IG5sbV9lbmNvZGVfdGVzdHJlcyhwLCByZXNwKSkpCisJCXJldHVybiAwOworCXJldHVybiB4ZHJfcmVzc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKK2ludAorbmxtc3ZjX2RlY29kZV9sb2NrYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIG5sbV9hcmdzICphcmdwKQoreworCXUzMglleGNsdXNpdmU7CisKKwlpZiAoIShwID0gbmxtX2RlY29kZV9jb29raWUocCwgJmFyZ3AtPmNvb2tpZSkpKQorCQlyZXR1cm4gMDsKKwlhcmdwLT5ibG9jayAgPSBudG9obCgqcCsrKTsKKwlleGNsdXNpdmUgICAgPSBudG9obCgqcCsrKTsKKwlpZiAoIShwID0gbmxtX2RlY29kZV9sb2NrKHAsICZhcmdwLT5sb2NrKSkpCisJCXJldHVybiAwOworCWlmIChleGNsdXNpdmUpCisJCWFyZ3AtPmxvY2suZmwuZmxfdHlwZSA9IEZfV1JMQ0s7CisJYXJncC0+cmVjbGFpbSA9IG50b2hsKCpwKyspOworCWFyZ3AtPnN0YXRlICAgPSBudG9obCgqcCsrKTsKKwlhcmdwLT5tb25pdG9yID0gMTsJCS8qIG1vbml0b3IgY2xpZW50IGJ5IGRlZmF1bHQgKi8KKworCXJldHVybiB4ZHJfYXJnc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKK2ludAorbmxtc3ZjX2RlY29kZV9jYW5jYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIG5sbV9hcmdzICphcmdwKQoreworCXUzMglleGNsdXNpdmU7CisKKwlpZiAoIShwID0gbmxtX2RlY29kZV9jb29raWUocCwgJmFyZ3AtPmNvb2tpZSkpKQorCQlyZXR1cm4gMDsKKwlhcmdwLT5ibG9jayA9IG50b2hsKCpwKyspOworCWV4Y2x1c2l2ZSA9IG50b2hsKCpwKyspOworCWlmICghKHAgPSBubG1fZGVjb2RlX2xvY2socCwgJmFyZ3AtPmxvY2spKSkKKwkJcmV0dXJuIDA7CisJaWYgKGV4Y2x1c2l2ZSkKKwkJYXJncC0+bG9jay5mbC5mbF90eXBlID0gRl9XUkxDSzsKKwlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitpbnQKK25sbXN2Y19kZWNvZGVfdW5sb2NrYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIG5sbV9hcmdzICphcmdwKQoreworCWlmICghKHAgPSBubG1fZGVjb2RlX2Nvb2tpZShwLCAmYXJncC0+Y29va2llKSkKKwkgfHwgIShwID0gbmxtX2RlY29kZV9sb2NrKHAsICZhcmdwLT5sb2NrKSkpCisJCXJldHVybiAwOworCWFyZ3AtPmxvY2suZmwuZmxfdHlwZSA9IEZfVU5MQ0s7CisJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CitubG1zdmNfZGVjb2RlX3NoYXJlYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIG5sbV9hcmdzICphcmdwKQoreworCXN0cnVjdCBubG1fbG9jawkqbG9jayA9ICZhcmdwLT5sb2NrOworCisJbWVtc2V0KGxvY2ssIDAsIHNpemVvZigqbG9jaykpOworCWxvY2tzX2luaXRfbG9jaygmbG9jay0+ZmwpOworCWxvY2stPmZsLmZsX3BpZCA9IH4odTMyKSAwOworCisJaWYgKCEocCA9IG5sbV9kZWNvZGVfY29va2llKHAsICZhcmdwLT5jb29raWUpKQorCSB8fCAhKHAgPSB4ZHJfZGVjb2RlX3N0cmluZ19pbnBsYWNlKHAsICZsb2NrLT5jYWxsZXIsCisJCQkJCSAgICAmbG9jay0+bGVuLCBOTE1fTUFYU1RSTEVOKSkKKwkgfHwgIShwID0gbmxtX2RlY29kZV9maChwLCAmbG9jay0+ZmgpKQorCSB8fCAhKHAgPSBubG1fZGVjb2RlX29oKHAsICZsb2NrLT5vaCkpKQorCQlyZXR1cm4gMDsKKwlhcmdwLT5mc21fbW9kZSA9IG50b2hsKCpwKyspOworCWFyZ3AtPmZzbV9hY2Nlc3MgPSBudG9obCgqcCsrKTsKKwlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitpbnQKK25sbXN2Y19lbmNvZGVfc2hhcmVyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKK3sKKwlpZiAoIShwID0gbmxtX2VuY29kZV9jb29raWUocCwgJnJlc3AtPmNvb2tpZSkpKQorCQlyZXR1cm4gMDsKKwkqcCsrID0gcmVzcC0+c3RhdHVzOworCSpwKysgPSB4ZHJfemVybzsJCS8qIHNlcXVlbmNlIGFyZ3VtZW50ICovCisJcmV0dXJuIHhkcl9yZXNzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CitubG1zdmNfZW5jb2RlX3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQoreworCWlmICghKHAgPSBubG1fZW5jb2RlX2Nvb2tpZShwLCAmcmVzcC0+Y29va2llKSkpCisJCXJldHVybiAwOworCSpwKysgPSByZXNwLT5zdGF0dXM7CisJcmV0dXJuIHhkcl9yZXNzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CitubG1zdmNfZGVjb2RlX25vdGlmeShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBubG1fYXJncyAqYXJncCkKK3sKKwlzdHJ1Y3QgbmxtX2xvY2sJKmxvY2sgPSAmYXJncC0+bG9jazsKKworCWlmICghKHAgPSB4ZHJfZGVjb2RlX3N0cmluZ19pbnBsYWNlKHAsICZsb2NrLT5jYWxsZXIsCisJCQkJCSAgICAmbG9jay0+bGVuLCBOTE1fTUFYU1RSTEVOKSkpCisJCXJldHVybiAwOworCWFyZ3AtPnN0YXRlID0gbnRvaGwoKnArKyk7CisJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CitubG1zdmNfZGVjb2RlX3JlYm9vdChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBubG1fcmVib290ICphcmdwKQoreworCWlmICghKHAgPSB4ZHJfZGVjb2RlX3N0cmluZ19pbnBsYWNlKHAsICZhcmdwLT5tb24sICZhcmdwLT5sZW4sIFNNX01BWFNUUkxFTikpKQorCQlyZXR1cm4gMDsKKwlhcmdwLT5zdGF0ZSA9IG50b2hsKCpwKyspOworCS8qIFByZXNlcnZlIHRoZSBhZGRyZXNzIGluIG5ldHdvcmsgYnl0ZSBvcmRlciAqLworCWFyZ3AtPmFkZHIgPSAqcCsrOworCWFyZ3AtPnZlcnMgPSAqcCsrOworCWFyZ3AtPnByb3RvID0gKnArKzsKKwlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitpbnQKK25sbXN2Y19kZWNvZGVfcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCit7CisJaWYgKCEocCA9IG5sbV9kZWNvZGVfY29va2llKHAsICZyZXNwLT5jb29raWUpKSkKKwkJcmV0dXJuIDA7CisJcmVzcC0+c3RhdHVzID0gbnRvaGwoKnArKyk7CisJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CitubG1zdmNfZGVjb2RlX3ZvaWQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCB2b2lkICpkdW1teSkKK3sKKwlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitpbnQKK25sbXN2Y19lbmNvZGVfdm9pZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHZvaWQgKmR1bW15KQoreworCXJldHVybiB4ZHJfcmVzc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKKy8qCisgKiBOb3csIHRoZSBjbGllbnQgc2lkZSBYRFIgZnVuY3Rpb25zCisgKi8KKyNpZmRlZiBOTE1DTE5UX1NVUFBPUlRfU0hBUkVTCitzdGF0aWMgaW50CitubG1jbHRfZGVjb2RlX3ZvaWQoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgdm9pZCAqcHRyKQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK25sbWNsdF9lbmNvZGVfdGVzdGFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgbmxtX2FyZ3MgKmFyZ3ApCit7CisJc3RydWN0IG5sbV9sb2NrCSpsb2NrID0gJmFyZ3AtPmxvY2s7CisKKwlpZiAoIShwID0gbmxtX2VuY29kZV9jb29raWUocCwgJmFyZ3AtPmNvb2tpZSkpKQorCQlyZXR1cm4gLUVJTzsKKwkqcCsrID0gKGxvY2stPmZsLmZsX3R5cGUgPT0gRl9XUkxDSyk/IHhkcl9vbmUgOiB4ZHJfemVybzsKKwlpZiAoIShwID0gbmxtX2VuY29kZV9sb2NrKHAsIGxvY2spKSkKKwkJcmV0dXJuIC1FSU87CisJcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitubG1jbHRfZGVjb2RlX3Rlc3RyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCit7CisJaWYgKCEocCA9IG5sbV9kZWNvZGVfY29va2llKHAsICZyZXNwLT5jb29raWUpKSkKKwkJcmV0dXJuIC1FSU87CisJcmVzcC0+c3RhdHVzID0gbnRvaGwoKnArKyk7CisJaWYgKHJlc3AtPnN0YXR1cyA9PSBOTE1fTENLX0RFTklFRCkgeworCQlzdHJ1Y3QgZmlsZV9sb2NrCSpmbCA9ICZyZXNwLT5sb2NrLmZsOworCQl1MzIJCQlleGNsOworCQlzMzIJCQlzdGFydCwgbGVuLCBlbmQ7CisKKwkJbWVtc2V0KCZyZXNwLT5sb2NrLCAwLCBzaXplb2YocmVzcC0+bG9jaykpOworCQlsb2Nrc19pbml0X2xvY2soZmwpOworCQlleGNsID0gbnRvaGwoKnArKyk7CisJCWZsLT5mbF9waWQgPSBudG9obCgqcCsrKTsKKwkJaWYgKCEocCA9IG5sbV9kZWNvZGVfb2gocCwgJnJlc3AtPmxvY2sub2gpKSkKKwkJCXJldHVybiAtRUlPOworCisJCWZsLT5mbF9mbGFncyA9IEZMX1BPU0lYOworCQlmbC0+ZmxfdHlwZSAgPSBleGNsPyBGX1dSTENLIDogRl9SRExDSzsKKwkJc3RhcnQgPSBudG9obCgqcCsrKTsKKwkJbGVuID0gbnRvaGwoKnArKyk7CisJCWVuZCA9IHN0YXJ0ICsgbGVuIC0gMTsKKworCQlmbC0+Zmxfc3RhcnQgPSBzMzJfdG9fbG9mZl90KHN0YXJ0KTsKKwkJaWYgKGxlbiA9PSAwIHx8IGVuZCA8IDApCisJCQlmbC0+ZmxfZW5kID0gT0ZGU0VUX01BWDsKKwkJZWxzZQorCQkJZmwtPmZsX2VuZCA9IHMzMl90b19sb2ZmX3QoZW5kKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAorbmxtY2x0X2VuY29kZV9sb2NrYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBubG1fYXJncyAqYXJncCkKK3sKKwlzdHJ1Y3QgbmxtX2xvY2sJKmxvY2sgPSAmYXJncC0+bG9jazsKKworCWlmICghKHAgPSBubG1fZW5jb2RlX2Nvb2tpZShwLCAmYXJncC0+Y29va2llKSkpCisJCXJldHVybiAtRUlPOworCSpwKysgPSBhcmdwLT5ibG9jaz8geGRyX29uZSA6IHhkcl96ZXJvOworCSpwKysgPSAobG9jay0+ZmwuZmxfdHlwZSA9PSBGX1dSTENLKT8geGRyX29uZSA6IHhkcl96ZXJvOworCWlmICghKHAgPSBubG1fZW5jb2RlX2xvY2socCwgbG9jaykpKQorCQlyZXR1cm4gLUVJTzsKKwkqcCsrID0gYXJncC0+cmVjbGFpbT8geGRyX29uZSA6IHhkcl96ZXJvOworCSpwKysgPSBodG9ubChhcmdwLT5zdGF0ZSk7CisJcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitubG1jbHRfZW5jb2RlX2NhbmNhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIG5sbV9hcmdzICphcmdwKQoreworCXN0cnVjdCBubG1fbG9jawkqbG9jayA9ICZhcmdwLT5sb2NrOworCisJaWYgKCEocCA9IG5sbV9lbmNvZGVfY29va2llKHAsICZhcmdwLT5jb29raWUpKSkKKwkJcmV0dXJuIC1FSU87CisJKnArKyA9IGFyZ3AtPmJsb2NrPyB4ZHJfb25lIDogeGRyX3plcm87CisJKnArKyA9IChsb2NrLT5mbC5mbF90eXBlID09IEZfV1JMQ0spPyB4ZHJfb25lIDogeGRyX3plcm87CisJaWYgKCEocCA9IG5sbV9lbmNvZGVfbG9jayhwLCBsb2NrKSkpCisJCXJldHVybiAtRUlPOworCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbmxtY2x0X2VuY29kZV91bmxvY2thcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIG5sbV9hcmdzICphcmdwKQoreworCXN0cnVjdCBubG1fbG9jawkqbG9jayA9ICZhcmdwLT5sb2NrOworCisJaWYgKCEocCA9IG5sbV9lbmNvZGVfY29va2llKHAsICZhcmdwLT5jb29raWUpKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKCEocCA9IG5sbV9lbmNvZGVfbG9jayhwLCBsb2NrKSkpCisJCXJldHVybiAtRUlPOworCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbmxtY2x0X2VuY29kZV9yZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCit7CisJaWYgKCEocCA9IG5sbV9lbmNvZGVfY29va2llKHAsICZyZXNwLT5jb29raWUpKSkKKwkJcmV0dXJuIC1FSU87CisJKnArKyA9IHJlc3AtPnN0YXR1czsKKwlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25sbWNsdF9lbmNvZGVfdGVzdHJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKK3sKKwlpZiAoIShwID0gbmxtX2VuY29kZV90ZXN0cmVzKHAsIHJlc3ApKSkKKwkJcmV0dXJuIC1FSU87CisJcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitubG1jbHRfZGVjb2RlX3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKK3sKKwlpZiAoIShwID0gbmxtX2RlY29kZV9jb29raWUocCwgJnJlc3AtPmNvb2tpZSkpKQorCQlyZXR1cm4gLUVJTzsKKwlyZXNwLT5zdGF0dXMgPSBudG9obCgqcCsrKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEJ1ZmZlciByZXF1aXJlbWVudHMgZm9yIE5MTQorICovCisjZGVmaW5lIE5MTV92b2lkX3N6CQkwCisjZGVmaW5lIE5MTV9jb29raWVfc3oJCTErWERSX1FVQURMRU4oTkxNX01BWENPT0tJRUxFTikKKyNkZWZpbmUgTkxNX2NhbGxlcl9zegkJMStYRFJfUVVBRExFTihzaXplb2Yoc3lzdGVtX3V0c25hbWUubm9kZW5hbWUpKQorI2RlZmluZSBOTE1fbmV0b2JqX3N6CQkxK1hEUl9RVUFETEVOKFhEUl9NQVhfTkVUT0JKKQorLyogI2RlZmluZSBOTE1fb3duZXJfc3oJCTErWERSX1FVQURMRU4oTkxNX01BWE9XTkVSKSAqLworI2RlZmluZSBOTE1fZmhhbmRsZV9zegkJMStYRFJfUVVBRExFTihORlMyX0ZIU0laRSkKKyNkZWZpbmUgTkxNX2xvY2tfc3oJCTMrTkxNX2NhbGxlcl9zeitOTE1fbmV0b2JqX3N6K05MTV9maGFuZGxlX3N6CisjZGVmaW5lIE5MTV9ob2xkZXJfc3oJCTQrTkxNX25ldG9ial9zegorCisjZGVmaW5lIE5MTV90ZXN0YXJnc19zegkJTkxNX2Nvb2tpZV9zeisxK05MTV9sb2NrX3N6CisjZGVmaW5lIE5MTV9sb2NrYXJnc19zegkJTkxNX2Nvb2tpZV9zeis0K05MTV9sb2NrX3N6CisjZGVmaW5lIE5MTV9jYW5jYXJnc19zegkJTkxNX2Nvb2tpZV9zeisyK05MTV9sb2NrX3N6CisjZGVmaW5lIE5MTV91bmxvY2thcmdzX3N6CU5MTV9jb29raWVfc3orTkxNX2xvY2tfc3oKKworI2RlZmluZSBOTE1fdGVzdHJlc19zegkJTkxNX2Nvb2tpZV9zeisxK05MTV9ob2xkZXJfc3oKKyNkZWZpbmUgTkxNX3Jlc19zegkJTkxNX2Nvb2tpZV9zeisxCisjZGVmaW5lIE5MTV9ub3JlcF9zegkJMAorCisjaWZuZGVmIE1BWAorIyBkZWZpbmUgTUFYKGEsIGIpCQkoKChhKSA+IChiKSk/IChhKSA6IChiKSkKKyNlbmRpZgorCisvKgorICogRm9yIE5MTSwgYSB2b2lkIHByb2NlZHVyZSByZWFsbHkgcmV0dXJucyBub3RoaW5nCisgKi8KKyNkZWZpbmUgbmxtY2x0X2RlY29kZV9ub3JlcAlOVUxMCisKKyNkZWZpbmUgUFJPQyhwcm9jLCBhcmd0eXBlLCByZXN0eXBlKQlcCitbTkxNUFJPQ18jI3Byb2NdID0gewkJCQkJCQlcCisJLnBfcHJvYyAgICAgID0gTkxNUFJPQ18jI3Byb2MsCQkJCQlcCisJLnBfZW5jb2RlICAgID0gKGt4ZHJwcm9jX3QpIG5sbWNsdF9lbmNvZGVfIyNhcmd0eXBlLAkJXAorCS5wX2RlY29kZSAgICA9IChreGRycHJvY190KSBubG1jbHRfZGVjb2RlXyMjcmVzdHlwZSwJCVwKKwkucF9idWZzaXogICAgPSBNQVgoTkxNXyMjYXJndHlwZSMjX3N6LCBOTE1fIyNyZXN0eXBlIyNfc3opIDw8IDIJXAorCX0KKworc3RhdGljIHN0cnVjdCBycGNfcHJvY2luZm8JbmxtX3Byb2NlZHVyZXNbXSA9IHsKKyAgICBQUk9DKFRFU1QsCQl0ZXN0YXJncywJdGVzdHJlcyksCisgICAgUFJPQyhMT0NLLAkJbG9ja2FyZ3MsCXJlcyksCisgICAgUFJPQyhDQU5DRUwsCWNhbmNhcmdzLAlyZXMpLAorICAgIFBST0MoVU5MT0NLLAl1bmxvY2thcmdzLAlyZXMpLAorICAgIFBST0MoR1JBTlRFRCwJdGVzdGFyZ3MsCXJlcyksCisgICAgUFJPQyhURVNUX01TRywJdGVzdGFyZ3MsCW5vcmVwKSwKKyAgICBQUk9DKExPQ0tfTVNHLAlsb2NrYXJncywJbm9yZXApLAorICAgIFBST0MoQ0FOQ0VMX01TRywJY2FuY2FyZ3MsCW5vcmVwKSwKKyAgICBQUk9DKFVOTE9DS19NU0csCXVubG9ja2FyZ3MsCW5vcmVwKSwKKyAgICBQUk9DKEdSQU5URURfTVNHLAl0ZXN0YXJncywJbm9yZXApLAorICAgIFBST0MoVEVTVF9SRVMsCXRlc3RyZXMsCW5vcmVwKSwKKyAgICBQUk9DKExPQ0tfUkVTLAlyZXMsCQlub3JlcCksCisgICAgUFJPQyhDQU5DRUxfUkVTLAlyZXMsCQlub3JlcCksCisgICAgUFJPQyhVTkxPQ0tfUkVTLAlyZXMsCQlub3JlcCksCisgICAgUFJPQyhHUkFOVEVEX1JFUywJcmVzLAkJbm9yZXApLAorI2lmZGVmIE5MTUNMTlRfU1VQUE9SVF9TSEFSRVMKKyAgICBQUk9DKFNIQVJFLAkJc2hhcmVhcmdzLAlzaGFyZXJlcyksCisgICAgUFJPQyhVTlNIQVJFLAlzaGFyZWFyZ3MsCXNoYXJlcmVzKSwKKyAgICBQUk9DKE5NX0xPQ0ssCWxvY2thcmdzLAlyZXMpLAorICAgIFBST0MoRlJFRV9BTEwsCW5vdGlmeSwJCXZvaWQpLAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHJwY192ZXJzaW9uCW5sbV92ZXJzaW9uMSA9IHsKKwkJLm51bWJlcgkJPSAxLAorCQkubnJwcm9jcwk9IDE2LAorCQkucHJvY3MJCT0gbmxtX3Byb2NlZHVyZXMsCit9OworCitzdGF0aWMgc3RydWN0IHJwY192ZXJzaW9uCW5sbV92ZXJzaW9uMyA9IHsKKwkJLm51bWJlcgkJPSAzLAorCQkubnJwcm9jcwk9IDI0LAorCQkucHJvY3MJCT0gbmxtX3Byb2NlZHVyZXMsCit9OworCisjaWZkZWYgCUNPTkZJR19MT0NLRF9WNAorZXh0ZXJuIHN0cnVjdCBycGNfdmVyc2lvbiBubG1fdmVyc2lvbjQ7CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBycGNfdmVyc2lvbiAqCW5sbV92ZXJzaW9uc1tdID0geworCVsxXSA9ICZubG1fdmVyc2lvbjEsCisJWzNdID0gJm5sbV92ZXJzaW9uMywKKyNpZmRlZiAJQ09ORklHX0xPQ0tEX1Y0CisJWzRdID0gJm5sbV92ZXJzaW9uNCwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCBycGNfc3RhdAkJbmxtX3N0YXRzOworCitzdHJ1Y3QgcnBjX3Byb2dyYW0JCW5sbV9wcm9ncmFtID0geworCQkubmFtZQkJPSAibG9ja2QiLAorCQkubnVtYmVyCQk9IE5MTV9QUk9HUkFNLAorCQkubnJ2ZXJzCQk9IHNpemVvZihubG1fdmVyc2lvbnMpIC8gc2l6ZW9mKG5sbV92ZXJzaW9uc1swXSksCisJCS52ZXJzaW9uCT0gbmxtX3ZlcnNpb25zLAorCQkuc3RhdHMJCT0gJm5sbV9zdGF0cywKK307CisKKyNpZmRlZiBSUENfREVCVUcKK2NvbnN0IGNoYXIgKm5sbWRiZ19jb29raWUyYShjb25zdCBzdHJ1Y3QgbmxtX2Nvb2tpZSAqY29va2llKQoreworCS8qCisJICogV2UgY2FuIGdldCBhd2F5IHdpdGggYSBzdGF0aWMgYnVmZmVyIGJlY2F1c2Ugd2UncmUgb25seQorCSAqIGNhbGxlZCB3aXRoIEJLTCBoZWxkLgorCSAqLworCXN0YXRpYyBjaGFyIGJ1ZlsyKk5MTV9NQVhDT09LSUVMRU4rMV07CisJaW50IGk7CisJaW50IGxlbiA9IHNpemVvZihidWYpOworCWNoYXIgKnAgPSBidWY7CisKKwlsZW4tLTsJLyogYWxsb3cgZm9yIHRyYWlsaW5nIFwwICovCisJaWYgKGxlbiA8IDMpCisJCXJldHVybiAiPz8/IjsKKwlmb3IgKGkgPSAwIDsgaSA8IGNvb2tpZS0+bGVuIDsgaSsrKSB7CisJCWlmIChsZW4gPCAyKSB7CisJCQlzdHJjcHkocC0zLCAiLi4uIik7CisJCQlicmVhazsKKwkJfQorCQlzcHJpbnRmKHAsICIlMDJ4IiwgY29va2llLT5kYXRhW2ldKTsKKwkJcCArPSAyOworCQlsZW4gLT0gMjsKKwl9CisJKnAgPSAnXDAnOworCisJcmV0dXJuIGJ1ZjsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvbG9ja2QveGRyNC5jIGIvZnMvbG9ja2QveGRyNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNGQ2YjQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9sb2NrZC94ZHI0LmMKQEAgLTAsMCArMSw1ODAgQEAKKy8qCisgKiBsaW51eC9mcy9sb2NrZC94ZHI0LmMKKyAqCisgKiBYRFIgc3VwcG9ydCBmb3IgbG9ja2QgYW5kIHRoZSBsb2NrIGNsaWVudC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+CisgKiBDb3B5cmlnaHQgKEMpIDE5OTksIFRyb25kIE15a2xlYnVzdCA8dHJvbmQubXlrbGVidXN0QGZ5cy51aW8ubm8+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CisjaW5jbHVkZSA8bGludXgvbmZzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMveGRyLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N0YXRzLmg+CisjaW5jbHVkZSA8bGludXgvbG9ja2QvbG9ja2QuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2NrZC9zbV9pbnRlci5oPgorCisjZGVmaW5lIE5MTURCR19GQUNJTElUWQkJTkxNREJHX1hEUgorCitzdGF0aWMgaW5saW5lIGxvZmZfdAorczY0X3RvX2xvZmZfdChfX3M2NCBvZmZzZXQpCit7CisJcmV0dXJuIChsb2ZmX3Qpb2Zmc2V0OworfQorCisKK3N0YXRpYyBpbmxpbmUgczY0Citsb2ZmX3RfdG9fczY0KGxvZmZfdCBvZmZzZXQpCit7CisJczY0IHJlczsKKwlpZiAob2Zmc2V0ID4gTkxNNF9PRkZTRVRfTUFYKQorCQlyZXMgPSBOTE00X09GRlNFVF9NQVg7CisJZWxzZSBpZiAob2Zmc2V0IDwgLU5MTTRfT0ZGU0VUX01BWCkKKwkJcmVzID0gLU5MTTRfT0ZGU0VUX01BWDsKKwllbHNlCisJCXJlcyA9IG9mZnNldDsKKwlyZXR1cm4gcmVzOworfQorCisvKgorICogWERSIGZ1bmN0aW9ucyBmb3IgYmFzaWMgTkxNIHR5cGVzCisgKi8KK3N0YXRpYyB1MzIgKgorbmxtNF9kZWNvZGVfY29va2llKHUzMiAqcCwgc3RydWN0IG5sbV9jb29raWUgKmMpCit7CisJdW5zaWduZWQgaW50CWxlbjsKKworCWxlbiA9IG50b2hsKCpwKyspOworCQorCWlmKGxlbj09MCkKKwl7CisJCWMtPmxlbj00OworCQltZW1zZXQoYy0+ZGF0YSwgMCwgNCk7CS8qIGhvY2tleXB1eCBicmFpbiBkYW1hZ2UgKi8KKwl9CisJZWxzZSBpZihsZW48PU5MTV9NQVhDT09LSUVMRU4pCisJeworCQljLT5sZW49bGVuOworCQltZW1jcHkoYy0+ZGF0YSwgcCwgbGVuKTsKKwkJcCs9WERSX1FVQURMRU4obGVuKTsKKwl9CisJZWxzZSAKKwl7CisJCXByaW50ayhLRVJOX05PVElDRQorCQkJImxvY2tkOiBiYWQgY29va2llIHNpemUgJWQgKG9ubHkgY29va2llcyB1bmRlciAlZCBieXRlcyBhcmUgc3VwcG9ydGVkLilcbiIsIGxlbiwgTkxNX01BWENPT0tJRUxFTik7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gcDsKK30KKworc3RhdGljIHUzMiAqCitubG00X2VuY29kZV9jb29raWUodTMyICpwLCBzdHJ1Y3QgbmxtX2Nvb2tpZSAqYykKK3sKKwkqcCsrID0gaHRvbmwoYy0+bGVuKTsKKwltZW1jcHkocCwgYy0+ZGF0YSwgYy0+bGVuKTsKKwlwKz1YRFJfUVVBRExFTihjLT5sZW4pOworCXJldHVybiBwOworfQorCitzdGF0aWMgdTMyICoKK25sbTRfZGVjb2RlX2ZoKHUzMiAqcCwgc3RydWN0IG5mc19maCAqZikKK3sKKwltZW1zZXQoZi0+ZGF0YSwgMCwgc2l6ZW9mKGYtPmRhdGEpKTsKKwlmLT5zaXplID0gbnRvaGwoKnArKyk7CisJaWYgKGYtPnNpemUgPiBORlNfTUFYRkhTSVpFKSB7CisJCXByaW50ayhLRVJOX05PVElDRQorCQkJImxvY2tkOiBiYWQgZmhhbmRsZSBzaXplICVkIChzaG91bGQgYmUgPD0lZClcbiIsCisJCQlmLT5zaXplLCBORlNfTUFYRkhTSVpFKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorICAgICAgCW1lbWNweShmLT5kYXRhLCBwLCBmLT5zaXplKTsKKwlyZXR1cm4gcCArIFhEUl9RVUFETEVOKGYtPnNpemUpOworfQorCitzdGF0aWMgdTMyICoKK25sbTRfZW5jb2RlX2ZoKHUzMiAqcCwgc3RydWN0IG5mc19maCAqZikKK3sKKwkqcCsrID0gaHRvbmwoZi0+c2l6ZSk7CisJaWYgKGYtPnNpemUpIHBbWERSX1FVQURMRU4oZi0+c2l6ZSktMV0gPSAwOyAvKiBkb24ndCBsZWFrIGFueXRoaW5nICovCisJbWVtY3B5KHAsIGYtPmRhdGEsIGYtPnNpemUpOworCXJldHVybiBwICsgWERSX1FVQURMRU4oZi0+c2l6ZSk7Cit9CisKKy8qCisgKiBFbmNvZGUgYW5kIGRlY29kZSBvd25lciBoYW5kbGUKKyAqLworc3RhdGljIHUzMiAqCitubG00X2RlY29kZV9vaCh1MzIgKnAsIHN0cnVjdCB4ZHJfbmV0b2JqICpvaCkKK3sKKwlyZXR1cm4geGRyX2RlY29kZV9uZXRvYmoocCwgb2gpOworfQorCitzdGF0aWMgdTMyICoKK25sbTRfZW5jb2RlX29oKHUzMiAqcCwgc3RydWN0IHhkcl9uZXRvYmogKm9oKQoreworCXJldHVybiB4ZHJfZW5jb2RlX25ldG9iaihwLCBvaCk7Cit9CisKK3N0YXRpYyB1MzIgKgorbmxtNF9kZWNvZGVfbG9jayh1MzIgKnAsIHN0cnVjdCBubG1fbG9jayAqbG9jaykKK3sKKwlzdHJ1Y3QgZmlsZV9sb2NrCSpmbCA9ICZsb2NrLT5mbDsKKwlfX3M2NAkJCWxlbiwgc3RhcnQsIGVuZDsKKworCWlmICghKHAgPSB4ZHJfZGVjb2RlX3N0cmluZ19pbnBsYWNlKHAsICZsb2NrLT5jYWxsZXIsCisJCQkJCSAgICAmbG9jay0+bGVuLCBOTE1fTUFYU1RSTEVOKSkKKwkgfHwgIShwID0gbmxtNF9kZWNvZGVfZmgocCwgJmxvY2stPmZoKSkKKwkgfHwgIShwID0gbmxtNF9kZWNvZGVfb2gocCwgJmxvY2stPm9oKSkpCisJCXJldHVybiBOVUxMOworCisJbG9ja3NfaW5pdF9sb2NrKGZsKTsKKwlmbC0+Zmxfb3duZXIgPSBjdXJyZW50LT5maWxlczsKKwlmbC0+ZmxfcGlkICAgPSBudG9obCgqcCsrKTsKKwlmbC0+ZmxfZmxhZ3MgPSBGTF9QT1NJWDsKKwlmbC0+ZmxfdHlwZSAgPSBGX1JETENLOwkJLyogYXMgZ29vZCBhcyBhbnl0aGluZyBlbHNlICovCisJcCA9IHhkcl9kZWNvZGVfaHlwZXIocCwgJnN0YXJ0KTsKKwlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmbGVuKTsKKwllbmQgPSBzdGFydCArIGxlbiAtIDE7CisKKwlmbC0+Zmxfc3RhcnQgPSBzNjRfdG9fbG9mZl90KHN0YXJ0KTsKKworCWlmIChsZW4gPT0gMCB8fCBlbmQgPCAwKQorCQlmbC0+ZmxfZW5kID0gT0ZGU0VUX01BWDsKKwllbHNlCisJCWZsLT5mbF9lbmQgPSBzNjRfdG9fbG9mZl90KGVuZCk7CisJcmV0dXJuIHA7Cit9CisKKy8qCisgKiBFbmNvZGUgYSBsb2NrIGFzIHBhcnQgb2YgYW4gTkxNIGNhbGwKKyAqLworc3RhdGljIHUzMiAqCitubG00X2VuY29kZV9sb2NrKHUzMiAqcCwgc3RydWN0IG5sbV9sb2NrICpsb2NrKQoreworCXN0cnVjdCBmaWxlX2xvY2sJKmZsID0gJmxvY2stPmZsOworCV9fczY0CQkJc3RhcnQsIGxlbjsKKworCWlmICghKHAgPSB4ZHJfZW5jb2RlX3N0cmluZyhwLCBsb2NrLT5jYWxsZXIpKQorCSB8fCAhKHAgPSBubG00X2VuY29kZV9maChwLCAmbG9jay0+ZmgpKQorCSB8fCAhKHAgPSBubG00X2VuY29kZV9vaChwLCAmbG9jay0+b2gpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoZmwtPmZsX3N0YXJ0ID4gTkxNNF9PRkZTRVRfTUFYCisJIHx8IChmbC0+ZmxfZW5kID4gTkxNNF9PRkZTRVRfTUFYICYmIGZsLT5mbF9lbmQgIT0gT0ZGU0VUX01BWCkpCisJCXJldHVybiBOVUxMOworCisJKnArKyA9IGh0b25sKGZsLT5mbF9waWQpOworCisJc3RhcnQgPSBsb2ZmX3RfdG9fczY0KGZsLT5mbF9zdGFydCk7CisJaWYgKGZsLT5mbF9lbmQgPT0gT0ZGU0VUX01BWCkKKwkJbGVuID0gMDsKKwllbHNlCisJCWxlbiA9IGxvZmZfdF90b19zNjQoZmwtPmZsX2VuZCAtIGZsLT5mbF9zdGFydCArIDEpOworCisJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgc3RhcnQpOworCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsIGxlbik7CisKKwlyZXR1cm4gcDsKK30KKworLyoKKyAqIEVuY29kZSByZXN1bHQgb2YgYSBURVNUL1RFU1RfTVNHIGNhbGwKKyAqLworc3RhdGljIHUzMiAqCitubG00X2VuY29kZV90ZXN0cmVzKHUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCit7CisJczY0CQlzdGFydCwgbGVuOworCisJZHByaW50aygieGRyOiBiZWZvcmUgZW5jb2RlX3Rlc3RyZXMgKHAgJXAgcmVzcCAlcClcbiIsIHAsIHJlc3ApOworCWlmICghKHAgPSBubG00X2VuY29kZV9jb29raWUocCwgJnJlc3AtPmNvb2tpZSkpKQorCQlyZXR1cm4gTlVMTDsKKwkqcCsrID0gcmVzcC0+c3RhdHVzOworCisJaWYgKHJlc3AtPnN0YXR1cyA9PSBubG1fbGNrX2RlbmllZCkgeworCQlzdHJ1Y3QgZmlsZV9sb2NrCSpmbCA9ICZyZXNwLT5sb2NrLmZsOworCisJCSpwKysgPSAoZmwtPmZsX3R5cGUgPT0gRl9SRExDSyk/IHhkcl96ZXJvIDogeGRyX29uZTsKKwkJKnArKyA9IGh0b25sKGZsLT5mbF9waWQpOworCisJCS8qIEVuY29kZSBvd25lciBoYW5kbGUuICovCisJCWlmICghKHAgPSB4ZHJfZW5jb2RlX25ldG9iaihwLCAmcmVzcC0+bG9jay5vaCkpKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJc3RhcnQgPSBsb2ZmX3RfdG9fczY0KGZsLT5mbF9zdGFydCk7CisJCWlmIChmbC0+ZmxfZW5kID09IE9GRlNFVF9NQVgpCisJCQlsZW4gPSAwOworCQllbHNlCisJCQlsZW4gPSBsb2ZmX3RfdG9fczY0KGZsLT5mbF9lbmQgLSBmbC0+Zmxfc3RhcnQgKyAxKTsKKwkJCisJCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsIHN0YXJ0KTsKKwkJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgbGVuKTsKKwkJZHByaW50aygieGRyOiBlbmNvZGVfdGVzdHJlcyAoc3RhdHVzICVkIHBpZCAlZCB0eXBlICVkIHN0YXJ0ICVMZCBlbmQgJUxkKVxuIiwKKwkJCXJlc3AtPnN0YXR1cywgZmwtPmZsX3BpZCwgZmwtPmZsX3R5cGUsCisJCQkobG9uZyBsb25nKWZsLT5mbF9zdGFydCwgIChsb25nIGxvbmcpZmwtPmZsX2VuZCk7CisJfQorCisJZHByaW50aygieGRyOiBhZnRlciBlbmNvZGVfdGVzdHJlcyAocCAlcCByZXNwICVwKVxuIiwgcCwgcmVzcCk7CisJcmV0dXJuIHA7Cit9CisKKworLyoKKyAqIEZpcnN0LCB0aGUgc2VydmVyIHNpZGUgWERSIGZ1bmN0aW9ucworICovCitpbnQKK25sbTRzdmNfZGVjb2RlX3Rlc3RhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgbmxtX2FyZ3MgKmFyZ3ApCit7CisJdTMyCWV4Y2x1c2l2ZTsKKworCWlmICghKHAgPSBubG00X2RlY29kZV9jb29raWUocCwgJmFyZ3AtPmNvb2tpZSkpKQorCQlyZXR1cm4gMDsKKworCWV4Y2x1c2l2ZSA9IG50b2hsKCpwKyspOworCWlmICghKHAgPSBubG00X2RlY29kZV9sb2NrKHAsICZhcmdwLT5sb2NrKSkpCisJCXJldHVybiAwOworCWlmIChleGNsdXNpdmUpCisJCWFyZ3AtPmxvY2suZmwuZmxfdHlwZSA9IEZfV1JMQ0s7CisKKwlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitpbnQKK25sbTRzdmNfZW5jb2RlX3Rlc3RyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKK3sKKwlpZiAoIShwID0gbmxtNF9lbmNvZGVfdGVzdHJlcyhwLCByZXNwKSkpCisJCXJldHVybiAwOworCXJldHVybiB4ZHJfcmVzc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKK2ludAorbmxtNHN2Y19kZWNvZGVfbG9ja2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBubG1fYXJncyAqYXJncCkKK3sKKwl1MzIJZXhjbHVzaXZlOworCisJaWYgKCEocCA9IG5sbTRfZGVjb2RlX2Nvb2tpZShwLCAmYXJncC0+Y29va2llKSkpCisJCXJldHVybiAwOworCWFyZ3AtPmJsb2NrICA9IG50b2hsKCpwKyspOworCWV4Y2x1c2l2ZSAgICA9IG50b2hsKCpwKyspOworCWlmICghKHAgPSBubG00X2RlY29kZV9sb2NrKHAsICZhcmdwLT5sb2NrKSkpCisJCXJldHVybiAwOworCWlmIChleGNsdXNpdmUpCisJCWFyZ3AtPmxvY2suZmwuZmxfdHlwZSA9IEZfV1JMQ0s7CisJYXJncC0+cmVjbGFpbSA9IG50b2hsKCpwKyspOworCWFyZ3AtPnN0YXRlICAgPSBudG9obCgqcCsrKTsKKwlhcmdwLT5tb25pdG9yID0gMTsJCS8qIG1vbml0b3IgY2xpZW50IGJ5IGRlZmF1bHQgKi8KKworCXJldHVybiB4ZHJfYXJnc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKK2ludAorbmxtNHN2Y19kZWNvZGVfY2FuY2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBubG1fYXJncyAqYXJncCkKK3sKKwl1MzIJZXhjbHVzaXZlOworCisJaWYgKCEocCA9IG5sbTRfZGVjb2RlX2Nvb2tpZShwLCAmYXJncC0+Y29va2llKSkpCisJCXJldHVybiAwOworCWFyZ3AtPmJsb2NrID0gbnRvaGwoKnArKyk7CisJZXhjbHVzaXZlID0gbnRvaGwoKnArKyk7CisJaWYgKCEocCA9IG5sbTRfZGVjb2RlX2xvY2socCwgJmFyZ3AtPmxvY2spKSkKKwkJcmV0dXJuIDA7CisJaWYgKGV4Y2x1c2l2ZSkKKwkJYXJncC0+bG9jay5mbC5mbF90eXBlID0gRl9XUkxDSzsKKwlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitpbnQKK25sbTRzdmNfZGVjb2RlX3VubG9ja2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBubG1fYXJncyAqYXJncCkKK3sKKwlpZiAoIShwID0gbmxtNF9kZWNvZGVfY29va2llKHAsICZhcmdwLT5jb29raWUpKQorCSB8fCAhKHAgPSBubG00X2RlY29kZV9sb2NrKHAsICZhcmdwLT5sb2NrKSkpCisJCXJldHVybiAwOworCWFyZ3AtPmxvY2suZmwuZmxfdHlwZSA9IEZfVU5MQ0s7CisJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CitubG00c3ZjX2RlY29kZV9zaGFyZWFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBubG1fYXJncyAqYXJncCkKK3sKKwlzdHJ1Y3QgbmxtX2xvY2sJKmxvY2sgPSAmYXJncC0+bG9jazsKKworCW1lbXNldChsb2NrLCAwLCBzaXplb2YoKmxvY2spKTsKKwlsb2Nrc19pbml0X2xvY2soJmxvY2stPmZsKTsKKwlsb2NrLT5mbC5mbF9waWQgPSB+KHUzMikgMDsKKworCWlmICghKHAgPSBubG00X2RlY29kZV9jb29raWUocCwgJmFyZ3AtPmNvb2tpZSkpCisJIHx8ICEocCA9IHhkcl9kZWNvZGVfc3RyaW5nX2lucGxhY2UocCwgJmxvY2stPmNhbGxlciwKKwkJCQkJICAgICZsb2NrLT5sZW4sIE5MTV9NQVhTVFJMRU4pKQorCSB8fCAhKHAgPSBubG00X2RlY29kZV9maChwLCAmbG9jay0+ZmgpKQorCSB8fCAhKHAgPSBubG00X2RlY29kZV9vaChwLCAmbG9jay0+b2gpKSkKKwkJcmV0dXJuIDA7CisJYXJncC0+ZnNtX21vZGUgPSBudG9obCgqcCsrKTsKKwlhcmdwLT5mc21fYWNjZXNzID0gbnRvaGwoKnArKyk7CisJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CitubG00c3ZjX2VuY29kZV9zaGFyZXJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQoreworCWlmICghKHAgPSBubG00X2VuY29kZV9jb29raWUocCwgJnJlc3AtPmNvb2tpZSkpKQorCQlyZXR1cm4gMDsKKwkqcCsrID0gcmVzcC0+c3RhdHVzOworCSpwKysgPSB4ZHJfemVybzsJCS8qIHNlcXVlbmNlIGFyZ3VtZW50ICovCisJcmV0dXJuIHhkcl9yZXNzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CitubG00c3ZjX2VuY29kZV9yZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3QgbmxtX3JlcyAqcmVzcCkKK3sKKwlpZiAoIShwID0gbmxtNF9lbmNvZGVfY29va2llKHAsICZyZXNwLT5jb29raWUpKSkKKwkJcmV0dXJuIDA7CisJKnArKyA9IHJlc3AtPnN0YXR1czsKKwlyZXR1cm4geGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitpbnQKK25sbTRzdmNfZGVjb2RlX25vdGlmeShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBubG1fYXJncyAqYXJncCkKK3sKKwlzdHJ1Y3QgbmxtX2xvY2sJKmxvY2sgPSAmYXJncC0+bG9jazsKKworCWlmICghKHAgPSB4ZHJfZGVjb2RlX3N0cmluZ19pbnBsYWNlKHAsICZsb2NrLT5jYWxsZXIsCisJCQkJCSAgICAmbG9jay0+bGVuLCBOTE1fTUFYU1RSTEVOKSkpCisJCXJldHVybiAwOworCWFyZ3AtPnN0YXRlID0gbnRvaGwoKnArKyk7CisJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CitubG00c3ZjX2RlY29kZV9yZWJvb3Qoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3QgbmxtX3JlYm9vdCAqYXJncCkKK3sKKwlpZiAoIShwID0geGRyX2RlY29kZV9zdHJpbmdfaW5wbGFjZShwLCAmYXJncC0+bW9uLCAmYXJncC0+bGVuLCBTTV9NQVhTVFJMRU4pKSkKKwkJcmV0dXJuIDA7CisJYXJncC0+c3RhdGUgPSBudG9obCgqcCsrKTsKKwkvKiBQcmVzZXJ2ZSB0aGUgYWRkcmVzcyBpbiBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KKwlhcmdwLT5hZGRyID0gKnArKzsKKwlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitpbnQKK25sbTRzdmNfZGVjb2RlX3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQoreworCWlmICghKHAgPSBubG00X2RlY29kZV9jb29raWUocCwgJnJlc3AtPmNvb2tpZSkpKQorCQlyZXR1cm4gMDsKKwlyZXNwLT5zdGF0dXMgPSBudG9obCgqcCsrKTsKKwlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitpbnQKK25sbTRzdmNfZGVjb2RlX3ZvaWQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCB2b2lkICpkdW1teSkKK3sKKwlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitpbnQKK25sbTRzdmNfZW5jb2RlX3ZvaWQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCB2b2lkICpkdW1teSkKK3sKKwlyZXR1cm4geGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOworfQorCisvKgorICogTm93LCB0aGUgY2xpZW50IHNpZGUgWERSIGZ1bmN0aW9ucworICovCisjaWZkZWYgTkxNQ0xOVF9TVVBQT1JUX1NIQVJFUworc3RhdGljIGludAorbmxtNGNsdF9kZWNvZGVfdm9pZChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCB2b2lkICpwdHIpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludAorbmxtNGNsdF9lbmNvZGVfdGVzdGFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgbmxtX2FyZ3MgKmFyZ3ApCit7CisJc3RydWN0IG5sbV9sb2NrCSpsb2NrID0gJmFyZ3AtPmxvY2s7CisKKwlpZiAoIShwID0gbmxtNF9lbmNvZGVfY29va2llKHAsICZhcmdwLT5jb29raWUpKSkKKwkJcmV0dXJuIC1FSU87CisJKnArKyA9IChsb2NrLT5mbC5mbF90eXBlID09IEZfV1JMQ0spPyB4ZHJfb25lIDogeGRyX3plcm87CisJaWYgKCEocCA9IG5sbTRfZW5jb2RlX2xvY2socCwgbG9jaykpKQorCQlyZXR1cm4gLUVJTzsKKwlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25sbTRjbHRfZGVjb2RlX3Rlc3RyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCit7CisJaWYgKCEocCA9IG5sbTRfZGVjb2RlX2Nvb2tpZShwLCAmcmVzcC0+Y29va2llKSkpCisJCXJldHVybiAtRUlPOworCXJlc3AtPnN0YXR1cyA9IG50b2hsKCpwKyspOworCWlmIChyZXNwLT5zdGF0dXMgPT0gTkxNX0xDS19ERU5JRUQpIHsKKwkJc3RydWN0IGZpbGVfbG9jawkqZmwgPSAmcmVzcC0+bG9jay5mbDsKKwkJdTMyCQkJZXhjbDsKKwkJczY0CQkJc3RhcnQsIGVuZCwgbGVuOworCisJCW1lbXNldCgmcmVzcC0+bG9jaywgMCwgc2l6ZW9mKHJlc3AtPmxvY2spKTsKKwkJbG9ja3NfaW5pdF9sb2NrKGZsKTsKKwkJZXhjbCA9IG50b2hsKCpwKyspOworCQlmbC0+ZmxfcGlkID0gbnRvaGwoKnArKyk7CisJCWlmICghKHAgPSBubG00X2RlY29kZV9vaChwLCAmcmVzcC0+bG9jay5vaCkpKQorCQkJcmV0dXJuIC1FSU87CisKKwkJZmwtPmZsX2ZsYWdzID0gRkxfUE9TSVg7CisJCWZsLT5mbF90eXBlICA9IGV4Y2w/IEZfV1JMQ0sgOiBGX1JETENLOworCQlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmc3RhcnQpOworCQlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmbGVuKTsKKwkJZW5kID0gc3RhcnQgKyBsZW4gLSAxOworCisJCWZsLT5mbF9zdGFydCA9IHM2NF90b19sb2ZmX3Qoc3RhcnQpOworCQlpZiAobGVuID09IDAgfHwgZW5kIDwgMCkKKwkJCWZsLT5mbF9lbmQgPSBPRkZTRVRfTUFYOworCQllbHNlCisJCQlmbC0+ZmxfZW5kID0gczY0X3RvX2xvZmZfdChlbmQpOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50CitubG00Y2x0X2VuY29kZV9sb2NrYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBubG1fYXJncyAqYXJncCkKK3sKKwlzdHJ1Y3QgbmxtX2xvY2sJKmxvY2sgPSAmYXJncC0+bG9jazsKKworCWlmICghKHAgPSBubG00X2VuY29kZV9jb29raWUocCwgJmFyZ3AtPmNvb2tpZSkpKQorCQlyZXR1cm4gLUVJTzsKKwkqcCsrID0gYXJncC0+YmxvY2s/IHhkcl9vbmUgOiB4ZHJfemVybzsKKwkqcCsrID0gKGxvY2stPmZsLmZsX3R5cGUgPT0gRl9XUkxDSyk/IHhkcl9vbmUgOiB4ZHJfemVybzsKKwlpZiAoIShwID0gbmxtNF9lbmNvZGVfbG9jayhwLCBsb2NrKSkpCisJCXJldHVybiAtRUlPOworCSpwKysgPSBhcmdwLT5yZWNsYWltPyB4ZHJfb25lIDogeGRyX3plcm87CisJKnArKyA9IGh0b25sKGFyZ3AtPnN0YXRlKTsKKwlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25sbTRjbHRfZW5jb2RlX2NhbmNhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIG5sbV9hcmdzICphcmdwKQoreworCXN0cnVjdCBubG1fbG9jawkqbG9jayA9ICZhcmdwLT5sb2NrOworCisJaWYgKCEocCA9IG5sbTRfZW5jb2RlX2Nvb2tpZShwLCAmYXJncC0+Y29va2llKSkpCisJCXJldHVybiAtRUlPOworCSpwKysgPSBhcmdwLT5ibG9jaz8geGRyX29uZSA6IHhkcl96ZXJvOworCSpwKysgPSAobG9jay0+ZmwuZmxfdHlwZSA9PSBGX1dSTENLKT8geGRyX29uZSA6IHhkcl96ZXJvOworCWlmICghKHAgPSBubG00X2VuY29kZV9sb2NrKHAsIGxvY2spKSkKKwkJcmV0dXJuIC1FSU87CisJcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitubG00Y2x0X2VuY29kZV91bmxvY2thcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIG5sbV9hcmdzICphcmdwKQoreworCXN0cnVjdCBubG1fbG9jawkqbG9jayA9ICZhcmdwLT5sb2NrOworCisJaWYgKCEocCA9IG5sbTRfZW5jb2RlX2Nvb2tpZShwLCAmYXJncC0+Y29va2llKSkpCisJCXJldHVybiAtRUlPOworCWlmICghKHAgPSBubG00X2VuY29kZV9sb2NrKHAsIGxvY2spKSkKKwkJcmV0dXJuIC1FSU87CisJcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitubG00Y2x0X2VuY29kZV9yZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCit7CisJaWYgKCEocCA9IG5sbTRfZW5jb2RlX2Nvb2tpZShwLCAmcmVzcC0+Y29va2llKSkpCisJCXJldHVybiAtRUlPOworCSpwKysgPSByZXNwLT5zdGF0dXM7CisJcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitubG00Y2x0X2VuY29kZV90ZXN0cmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBubG1fcmVzICpyZXNwKQoreworCWlmICghKHAgPSBubG00X2VuY29kZV90ZXN0cmVzKHAsIHJlc3ApKSkKKwkJcmV0dXJuIC1FSU87CisJcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitubG00Y2x0X2RlY29kZV9yZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5sbV9yZXMgKnJlc3ApCit7CisJaWYgKCEocCA9IG5sbTRfZGVjb2RlX2Nvb2tpZShwLCAmcmVzcC0+Y29va2llKSkpCisJCXJldHVybiAtRUlPOworCXJlc3AtPnN0YXR1cyA9IG50b2hsKCpwKyspOworCXJldHVybiAwOworfQorCisvKgorICogQnVmZmVyIHJlcXVpcmVtZW50cyBmb3IgTkxNCisgKi8KKyNkZWZpbmUgTkxNNF92b2lkX3N6CQkwCisjZGVmaW5lIE5MTTRfY29va2llX3N6CQkxK1hEUl9RVUFETEVOKE5MTV9NQVhDT09LSUVMRU4pCisjZGVmaW5lIE5MTTRfY2FsbGVyX3N6CQkxK1hEUl9RVUFETEVOKE5MTV9NQVhTVFJMRU4pCisjZGVmaW5lIE5MTTRfbmV0b2JqX3N6CQkxK1hEUl9RVUFETEVOKFhEUl9NQVhfTkVUT0JKKQorLyogI2RlZmluZSBOTE00X293bmVyX3N6CQkxK1hEUl9RVUFETEVOKE5MTTRfTUFYT1dORVIpICovCisjZGVmaW5lIE5MTTRfZmhhbmRsZV9zegkJMStYRFJfUVVBRExFTihORlMzX0ZIU0laRSkKKyNkZWZpbmUgTkxNNF9sb2NrX3N6CQk1K05MTTRfY2FsbGVyX3N6K05MTTRfbmV0b2JqX3N6K05MTTRfZmhhbmRsZV9zegorI2RlZmluZSBOTE00X2hvbGRlcl9zegkJNitOTE00X25ldG9ial9zegorCisjZGVmaW5lIE5MTTRfdGVzdGFyZ3Nfc3oJTkxNNF9jb29raWVfc3orMStOTE00X2xvY2tfc3oKKyNkZWZpbmUgTkxNNF9sb2NrYXJnc19zeglOTE00X2Nvb2tpZV9zeis0K05MTTRfbG9ja19zegorI2RlZmluZSBOTE00X2NhbmNhcmdzX3N6CU5MTTRfY29va2llX3N6KzIrTkxNNF9sb2NrX3N6CisjZGVmaW5lIE5MTTRfdW5sb2NrYXJnc19zeglOTE00X2Nvb2tpZV9zeitOTE00X2xvY2tfc3oKKworI2RlZmluZSBOTE00X3Rlc3RyZXNfc3oJCU5MTTRfY29va2llX3N6KzErTkxNNF9ob2xkZXJfc3oKKyNkZWZpbmUgTkxNNF9yZXNfc3oJCU5MTTRfY29va2llX3N6KzEKKyNkZWZpbmUgTkxNNF9ub3JlcF9zegkJMAorCisjaWZuZGVmIE1BWAorIyBkZWZpbmUgTUFYKGEsYikJCSgoKGEpID4gKGIpKT8gKGEpIDogKGIpKQorI2VuZGlmCisKKy8qCisgKiBGb3IgTkxNLCBhIHZvaWQgcHJvY2VkdXJlIHJlYWxseSByZXR1cm5zIG5vdGhpbmcKKyAqLworI2RlZmluZSBubG00Y2x0X2RlY29kZV9ub3JlcAlOVUxMCisKKyNkZWZpbmUgUFJPQyhwcm9jLCBhcmd0eXBlLCByZXN0eXBlKQkJCQkJXAorW05MTVBST0NfIyNwcm9jXSA9IHsJCQkJCQkJXAorCS5wX3Byb2MgICAgICA9IE5MTVBST0NfIyNwcm9jLAkJCQkJXAorCS5wX2VuY29kZSAgICA9IChreGRycHJvY190KSBubG00Y2x0X2VuY29kZV8jI2FyZ3R5cGUsCQlcCisJLnBfZGVjb2RlICAgID0gKGt4ZHJwcm9jX3QpIG5sbTRjbHRfZGVjb2RlXyMjcmVzdHlwZSwJCVwKKwkucF9idWZzaXogICAgPSBNQVgoTkxNNF8jI2FyZ3R5cGUjI19zeiwgTkxNNF8jI3Jlc3R5cGUjI19zeikgPDwgMglcCisJfQorCitzdGF0aWMgc3RydWN0IHJwY19wcm9jaW5mbwlubG00X3Byb2NlZHVyZXNbXSA9IHsKKyAgICBQUk9DKFRFU1QsCQl0ZXN0YXJncywJdGVzdHJlcyksCisgICAgUFJPQyhMT0NLLAkJbG9ja2FyZ3MsCXJlcyksCisgICAgUFJPQyhDQU5DRUwsCWNhbmNhcmdzLAlyZXMpLAorICAgIFBST0MoVU5MT0NLLAl1bmxvY2thcmdzLAlyZXMpLAorICAgIFBST0MoR1JBTlRFRCwJdGVzdGFyZ3MsCXJlcyksCisgICAgUFJPQyhURVNUX01TRywJdGVzdGFyZ3MsCW5vcmVwKSwKKyAgICBQUk9DKExPQ0tfTVNHLAlsb2NrYXJncywJbm9yZXApLAorICAgIFBST0MoQ0FOQ0VMX01TRywJY2FuY2FyZ3MsCW5vcmVwKSwKKyAgICBQUk9DKFVOTE9DS19NU0csCXVubG9ja2FyZ3MsCW5vcmVwKSwKKyAgICBQUk9DKEdSQU5URURfTVNHLAl0ZXN0YXJncywJbm9yZXApLAorICAgIFBST0MoVEVTVF9SRVMsCXRlc3RyZXMsCW5vcmVwKSwKKyAgICBQUk9DKExPQ0tfUkVTLAlyZXMsCQlub3JlcCksCisgICAgUFJPQyhDQU5DRUxfUkVTLAlyZXMsCQlub3JlcCksCisgICAgUFJPQyhVTkxPQ0tfUkVTLAlyZXMsCQlub3JlcCksCisgICAgUFJPQyhHUkFOVEVEX1JFUywJcmVzLAkJbm9yZXApLAorI2lmZGVmIE5MTUNMTlRfU1VQUE9SVF9TSEFSRVMKKyAgICBQUk9DKFNIQVJFLAkJc2hhcmVhcmdzLAlzaGFyZXJlcyksCisgICAgUFJPQyhVTlNIQVJFLAlzaGFyZWFyZ3MsCXNoYXJlcmVzKSwKKyAgICBQUk9DKE5NX0xPQ0ssCWxvY2thcmdzLAlyZXMpLAorICAgIFBST0MoRlJFRV9BTEwsCW5vdGlmeSwJCXZvaWQpLAorI2VuZGlmCit9OworCitzdHJ1Y3QgcnBjX3ZlcnNpb24JbmxtX3ZlcnNpb240ID0geworCS5udW1iZXIJCT0gNCwKKwkubnJwcm9jcwk9IDI0LAorCS5wcm9jcwkJPSBubG00X3Byb2NlZHVyZXMsCit9OwpkaWZmIC0tZ2l0IGEvZnMvbG9ja3MuYyBiL2ZzL2xvY2tzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5MmNlNQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2xvY2tzLmMKQEAgLTAsMCArMSwyMjEyIEBACisvKgorICogIGxpbnV4L2ZzL2xvY2tzLmMKKyAqCisgKiAgUHJvdmlkZSBzdXBwb3J0IGZvciBmY250bCgpJ3MgRl9HRVRMSywgRl9TRVRMSywgYW5kIEZfU0VUTEtXIGNhbGxzLgorICogIERvdWcgRXZhbnMgKGRqZUBzcGlmZi51dWNwKSwgQXVndXN0IDA3LCAxOTkyCisgKgorICogIERlYWRsb2NrIGRldGVjdGlvbiBhZGRlZC4KKyAqICBGSVhNRTogb25lIHRoaW5nIGlzbid0IGhhbmRsZWQgeWV0OgorICoJLSBtYW5kYXRvcnkgbG9ja3MgKHJlcXVpcmVzIGxvdHMgb2YgY2hhbmdlcyBlbHNld2hlcmUpCisgKiAgS2VsbHkgQ2FybWljaGFlbCAoa2VsbHlAWzE0Mi4yNC44LjY1XSksIFNlcHRlbWJlciAxNywgMTk5NC4KKyAqCisgKiAgTWlzY2VsbGFuZW91cyBlZGl0cywgYW5kIGEgdG90YWwgcmV3cml0ZSBvZiBwb3NpeF9sb2NrX2ZpbGUoKSBjb2RlLgorICogIEthaSBQZXR6a2UgKHdwcEBtYXJpZS5waHlzaWsudHUtYmVybGluLmRlKSwgMTk5NAorICogIAorICogIENvbnZlcnRlZCBmaWxlX2xvY2tfdGFibGUgdG8gYSBsaW5rZWQgbGlzdCBmcm9tIGFuIGFycmF5LCB3aGljaCBlbGltaW5hdGVzCisgKiAgdGhlIGxpbWl0cyBvbiBob3cgbWFueSBhY3RpdmUgZmlsZSBsb2NrcyBhcmUgb3Blbi4KKyAqICBDaGFkIFBhZ2UgKHBhZ2VvbmVAbmV0Y29tLmNvbSksIE5vdmVtYmVyIDI3LCAxOTk0CisgKiAKKyAqICBSZW1vdmVkIGRlcGVuZGVuY3kgb24gZmlsZSBkZXNjcmlwdG9ycy4gZHVwKCknZWQgZmlsZSBkZXNjcmlwdG9ycyBub3cKKyAqICBnZXQgdGhlIHNhbWUgbG9ja3MgYXMgdGhlIG9yaWdpbmFsIGZpbGUgZGVzY3JpcHRvcnMsIGFuZCBhIGNsb3NlKCkgb24KKyAqICBhbnkgZmlsZSBkZXNjcmlwdG9yIHJlbW92ZXMgQUxMIHRoZSBsb2NrcyBvbiB0aGUgZmlsZSBmb3IgdGhlIGN1cnJlbnQKKyAqICBwcm9jZXNzLiBTaW5jZSBsb2NrcyBzdGlsbCBkZXBlbmQgb24gdGhlIHByb2Nlc3MgaWQsIGxvY2tzIGFyZSBpbmhlcml0ZWQKKyAqICBhZnRlciBhbiBleGVjKCkgYnV0IG5vdCBhZnRlciBhIGZvcmsoKS4gVGhpcyBhZ3JlZXMgd2l0aCBQT1NJWCwgYW5kIGJvdGgKKyAqICBCU0QgYW5kIFNWUjQgcHJhY3RpY2UuCisgKiAgQW5keSBXYWxrZXIgKGFuZHlAbHlzYWtlci5rdmFlcm5lci5ubyksIEZlYnJ1YXJ5IDE0LCAxOTk1CisgKgorICogIFNjcmFwcGVkIGZyZWUgbGlzdCB3aGljaCBpcyByZWR1bmRhbnQgbm93IHRoYXQgd2UgYWxsb2NhdGUgbG9ja3MKKyAqICBkeW5hbWljYWxseSB3aXRoIGttYWxsb2MoKS9rZnJlZSgpLgorICogIEFuZHkgV2Fsa2VyIChhbmR5QGx5c2FrZXIua3ZhZXJuZXIubm8pLCBGZWJydWFyeSAyMSwgMTk5NQorICoKKyAqICBJbXBsZW1lbnRlZCB0d28gbG9jayBwZXJzb25hbGl0aWVzIC0gRkxfRkxPQ0sgYW5kIEZMX1BPU0lYLgorICoKKyAqICBGTF9QT1NJWCBsb2NrcyBhcmUgY3JlYXRlZCB3aXRoIGNhbGxzIHRvIGZjbnRsKCkgYW5kIGxvY2tmKCkgdGhyb3VnaCB0aGUKKyAqICBmY250bCgpIHN5c3RlbSBjYWxsLiBUaGV5IGhhdmUgdGhlIHNlbWFudGljcyBkZXNjcmliZWQgYWJvdmUuCisgKgorICogIEZMX0ZMT0NLIGxvY2tzIGFyZSBjcmVhdGVkIHdpdGggY2FsbHMgdG8gZmxvY2soKSwgdGhyb3VnaCB0aGUgZmxvY2soKQorICogIHN5c3RlbSBjYWxsLCB3aGljaCBpcyBuZXcuIE9sZCBDIGxpYnJhcmllcyBpbXBsZW1lbnQgZmxvY2soKSB2aWEgZmNudGwoKQorICogIGFuZCB3aWxsIGNvbnRpbnVlIHRvIHVzZSB0aGUgb2xkLCBicm9rZW4gaW1wbGVtZW50YXRpb24uCisgKgorICogIEZMX0ZMT0NLIGxvY2tzIGZvbGxvdyB0aGUgNC40IEJTRCBmbG9jaygpIHNlbWFudGljcy4gVGhleSBhcmUgYXNzb2NpYXRlZAorICogIHdpdGggYSBmaWxlIHBvaW50ZXIgKGZpbHApLiBBcyBhIHJlc3VsdCB0aGV5IGNhbiBiZSBzaGFyZWQgYnkgYSBwYXJlbnQKKyAqICBwcm9jZXNzIGFuZCBpdHMgY2hpbGRyZW4gYWZ0ZXIgYSBmb3JrKCkuIFRoZXkgYXJlIHJlbW92ZWQgd2hlbiB0aGUgbGFzdAorICogIGZpbGUgZGVzY3JpcHRvciByZWZlcnJpbmcgdG8gdGhlIGZpbGUgcG9pbnRlciBpcyBjbG9zZWQgKHVubGVzcyBleHBsaWNpdGx5CisgKiAgdW5sb2NrZWQpLiAKKyAqCisgKiAgRkxfRkxPQ0sgbG9ja3MgbmV2ZXIgZGVhZGxvY2ssIGFuIGV4aXN0aW5nIGxvY2sgaXMgYWx3YXlzIHJlbW92ZWQgYmVmb3JlCisgKiAgdXBncmFkaW5nIGZyb20gc2hhcmVkIHRvIGV4Y2x1c2l2ZSAob3IgdmljZSB2ZXJzYSkuIFdoZW4gdGhpcyBoYXBwZW5zCisgKiAgYW55IHByb2Nlc3NlcyBibG9ja2VkIGJ5IHRoZSBjdXJyZW50IGxvY2sgYXJlIHdva2VuIHVwIGFuZCBhbGxvd2VkIHRvCisgKiAgcnVuIGJlZm9yZSB0aGUgbmV3IGxvY2sgaXMgYXBwbGllZC4KKyAqICBBbmR5IFdhbGtlciAoYW5keUBseXNha2VyLmt2YWVybmVyLm5vKSwgSnVuZSAwOSwgMTk5NQorICoKKyAqICBSZW1vdmVkIHNvbWUgcmFjZSBjb25kaXRpb25zIGluIGZsb2NrX2xvY2tfZmlsZSgpLCBtYXJrZWQgb3RoZXIgcG9zc2libGUKKyAqICByYWNlcy4gSnVzdCBncmVwIGZvciBGSVhNRSB0byBzZWUgdGhlbS4gCisgKiAgRG1pdHJ5IEdvcm9kY2hhbmluIChwZ21kc2dAaWJpLmNvbSksIEZlYnJ1YXJ5IDA5LCAxOTk2LgorICoKKyAqICBBZGRyZXNzZWQgRG1pdHJ5J3MgY29uY2VybnMuIERlYWRsb2NrIGNoZWNraW5nIG5vIGxvbmdlciByZWN1cnNpdmUuCisgKiAgTG9jayBhbGxvY2F0aW9uIGNoYW5nZWQgdG8gR0ZQX0FUT01JQyBhcyB3ZSBjYW4ndCBhZmZvcmQgdG8gc2xlZXAKKyAqICBvbmNlIHdlJ3ZlIGNoZWNrZWQgZm9yIGJsb2NraW5nIGFuZCBkZWFkbG9ja2luZy4KKyAqICBBbmR5IFdhbGtlciAoYW5keUBseXNha2VyLmt2YWVybmVyLm5vKSwgQXByaWwgMDMsIDE5OTYuCisgKgorICogIEluaXRpYWwgaW1wbGVtZW50YXRpb24gb2YgbWFuZGF0b3J5IGxvY2tzLiBTdW5PUyB0dXJuZWQgb3V0IHRvIGJlCisgKiAgYSByb3R0ZW4gbW9kZWwsIHNvIEkgaW1wbGVtZW50ZWQgdGhlICJvYnZpb3VzIiBzZW1hbnRpY3MuCisgKiAgU2VlICdEb2N1bWVudGF0aW9uL21hbmRhdG9yeS50eHQnIGZvciBkZXRhaWxzLgorICogIEFuZHkgV2Fsa2VyIChhbmR5QGx5c2FrZXIua3ZhZXJuZXIubm8pLCBBcHJpbCAwNiwgMTk5Ni4KKyAqCisgKiAgRG9uJ3QgYWxsb3cgbWFuZGF0b3J5IGxvY2tzIG9uIG1tYXAoKSdlZCBmaWxlcy4gQWRkZWQgc2ltcGxlIGZ1bmN0aW9ucyB0bworICogIGNoZWNrIGlmIGEgZmlsZSBoYXMgbWFuZGF0b3J5IGxvY2tzLCB1c2VkIGJ5IG1tYXAoKSwgb3BlbigpIGFuZCBjcmVhdCgpIHRvCisgKiAgc2VlIGlmIHN5c3RlbSBjYWxsIHNob3VsZCBiZSByZWplY3RlZC4gUmVmLiBIUC1VWC9TdW5PUy9Tb2xhcmlzIFJlZmVyZW5jZQorICogIE1hbnVhbCwgU2VjdGlvbiAyLgorICogIEFuZHkgV2Fsa2VyIChhbmR5QGx5c2FrZXIua3ZhZXJuZXIubm8pLCBBcHJpbCAwOSwgMTk5Ni4KKyAqCisgKiAgVGlkaWVkIHVwIGJsb2NrIGxpc3QgaGFuZGxpbmcuIEFkZGVkICcvcHJvYy9sb2NrcycgaW50ZXJmYWNlLgorICogIEFuZHkgV2Fsa2VyIChhbmR5QGx5c2FrZXIua3ZhZXJuZXIubm8pLCBBcHJpbCAyNCwgMTk5Ni4KKyAqCisgKiAgRml4ZWQgZGVhZGxvY2sgY29uZGl0aW9uIGZvciBwYXRob2xvZ2ljYWwgY29kZSB0aGF0IG1peGVzIGNhbGxzIHRvCisgKiAgZmxvY2soKSBhbmQgZmNudGwoKS4KKyAqICBBbmR5IFdhbGtlciAoYW5keUBseXNha2VyLmt2YWVybmVyLm5vKSwgQXByaWwgMjksIDE5OTYuCisgKgorICogIEFsbG93IG9ubHkgb25lIHR5cGUgb2YgbG9ja2luZyBzY2hlbWUgKEZMX1BPU0lYIG9yIEZMX0ZMT0NLKSB0byBiZSBpbiB1c2UKKyAqICBmb3IgYSBnaXZlbiBmaWxlIGF0IGEgdGltZS4gQ2hhbmdlZCB0aGUgQ09ORklHX0xPQ0tfTUFOREFUT1JZIHNjaGVtZSB0bworICogIGd1YXJhbnRlZSBzZW5zaWJsZSBiZWhhdmlvdXIgaW4gdGhlIGNhc2Ugd2hlcmUgZmlsZSBzeXN0ZW0gbW9kdWxlcyBtaWdodAorICogIGJlIGNvbXBpbGVkIHdpdGggZGlmZmVyZW50IG9wdGlvbnMgdGhhbiB0aGUga2VybmVsIGl0c2VsZi4KKyAqICBBbmR5IFdhbGtlciAoYW5keUBseXNha2VyLmt2YWVybmVyLm5vKSwgTWF5IDE1LCAxOTk2LgorICoKKyAqICBBZGRlZCBhIGNvdXBsZSBvZiBtaXNzaW5nIHdha2VfdXAoKSBjYWxscy4gVGhhbmtzIHRvIFRob21hcyBNZWNrZWwKKyAqICAoVGhvbWFzLk1lY2tlbEBtbmkuZmgtZ2llc3Nlbi5kZSkgZm9yIHNwb3R0aW5nIHRoaXMuCisgKiAgQW5keSBXYWxrZXIgKGFuZHlAbHlzYWtlci5rdmFlcm5lci5ubyksIE1heSAxNSwgMTk5Ni4KKyAqCisgKiAgQ2hhbmdlZCBGTF9QT1NJWCBsb2NrcyB0byB1c2UgdGhlIGJsb2NrIGxpc3QgaW4gdGhlIHNhbWUgd2F5IGFzIEZMX0ZMT0NLCisgKiAgbG9ja3MuIENoYW5nZWQgcHJvY2VzcyBzeW5jaHJvbmlzYXRpb24gdG8gYXZvaWQgZGVyZWZlcmVuY2luZyBsb2NrcyB0aGF0CisgKiAgaGF2ZSBhbHJlYWR5IGJlZW4gZnJlZWQuCisgKiAgQW5keSBXYWxrZXIgKGFuZHlAbHlzYWtlci5rdmFlcm5lci5ubyksIFNlcCAyMSwgMTk5Ni4KKyAqCisgKiAgTWFkZSB0aGUgYmxvY2sgbGlzdCBhIGNpcmN1bGFyIGxpc3QgdG8gbWluaW1pc2Ugc2VhcmNoaW5nIGluIHRoZSBsaXN0LgorICogIEFuZHkgV2Fsa2VyIChhbmR5QGx5c2FrZXIua3ZhZXJuZXIubm8pLCBTZXAgMjUsIDE5OTYuCisgKgorICogIE1hZGUgbWFuZGF0b3J5IGxvY2tpbmcgYSBtb3VudCBvcHRpb24uIERlZmF1bHQgaXMgbm90IHRvIGFsbG93IG1hbmRhdG9yeQorICogIGxvY2tpbmcuCisgKiAgQW5keSBXYWxrZXIgKGFuZHlAbHlzYWtlci5rdmFlcm5lci5ubyksIE9jdCAwNCwgMTk5Ni4KKyAqCisgKiAgU29tZSBhZGFwdGF0aW9ucyBmb3IgTkZTIHN1cHBvcnQuCisgKiAgT2xhZiBLaXJjaCAob2tpckBtb25hZC5zd2IuZGUpLCBEZWMgMTk5NiwKKyAqCisgKiAgRml4ZWQgL3Byb2MvbG9ja3MgaW50ZXJmYWNlIHNvIHRoYXQgd2UgY2FuJ3Qgb3ZlcnJ1biB0aGUgYnVmZmVyIHdlIGFyZSBoYW5kZWQuCisgKiAgQW5keSBXYWxrZXIgKGFuZHlAbHlzYWtlci5rdmFlcm5lci5ubyksIE1heSAxMiwgMTk5Ny4KKyAqCisgKiAgVXNlIHNsYWIgYWxsb2NhdG9yIGluc3RlYWQgb2Yga21hbGxvYy9rZnJlZS4KKyAqICBVc2UgZ2VuZXJpYyBsaXN0IGltcGxlbWVudGF0aW9uIGZyb20gPGxpbnV4L2xpc3QuaD4uCisgKiAgU3BlZCB1cCBwb3NpeF9sb2Nrc19kZWFkbG9jayBieSBvbmx5IGNvbnNpZGVyaW5nIGJsb2NrZWQgbG9ja3MuCisgKiAgTWF0dGhldyBXaWxjb3ggPHdpbGx5QGRlYmlhbi5vcmc+LCBNYXJjaCwgMjAwMC4KKyAqCisgKiAgTGVhc2VzIGFuZCBMT0NLX01BTkQKKyAqICBNYXR0aGV3IFdpbGNveCA8d2lsbHlAZGViaWFuLm9yZz4sIEp1bmUsIDIwMDAuCisgKiAgU3RlcGhlbiBSb3Rod2VsbCA8c2ZyQGNhbmIuYXV1Zy5vcmcuYXU+LCBKdW5lLCAyMDAwLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisKKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBJU19QT1NJWChmbCkJKGZsLT5mbF9mbGFncyAmIEZMX1BPU0lYKQorI2RlZmluZSBJU19GTE9DSyhmbCkJKGZsLT5mbF9mbGFncyAmIEZMX0ZMT0NLKQorI2RlZmluZSBJU19MRUFTRShmbCkJKGZsLT5mbF9mbGFncyAmIEZMX0xFQVNFKQorCitpbnQgbGVhc2VzX2VuYWJsZSA9IDE7CitpbnQgbGVhc2VfYnJlYWtfdGltZSA9IDQ1OworCisjZGVmaW5lIGZvcl9lYWNoX2xvY2soaW5vZGUsIGxvY2twKSBcCisJZm9yIChsb2NrcCA9ICZpbm9kZS0+aV9mbG9jazsgKmxvY2twICE9IE5VTEw7IGxvY2twID0gJigqbG9ja3ApLT5mbF9uZXh0KQorCitMSVNUX0hFQUQoZmlsZV9sb2NrX2xpc3QpOworCitFWFBPUlRfU1lNQk9MKGZpbGVfbG9ja19saXN0KTsKKworc3RhdGljIExJU1RfSEVBRChibG9ja2VkX2xpc3QpOworCitzdGF0aWMga21lbV9jYWNoZV90ICpmaWxlbG9ja19jYWNoZTsKKworLyogQWxsb2NhdGUgYW4gZW1wdHkgbG9jayBzdHJ1Y3R1cmUuICovCitzdGF0aWMgc3RydWN0IGZpbGVfbG9jayAqbG9ja3NfYWxsb2NfbG9jayh2b2lkKQoreworCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKGZpbGVsb2NrX2NhY2hlLCBTTEFCX0tFUk5FTCk7Cit9CisKKy8qIEZyZWUgYSBsb2NrIHdoaWNoIGlzIG5vdCBpbiB1c2UuICovCitzdGF0aWMgaW5saW5lIHZvaWQgbG9ja3NfZnJlZV9sb2NrKHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCWlmIChmbCA9PSBOVUxMKSB7CisJCUJVRygpOworCQlyZXR1cm47CisJfQorCWlmICh3YWl0cXVldWVfYWN0aXZlKCZmbC0+Zmxfd2FpdCkpCisJCXBhbmljKCJBdHRlbXB0aW5nIHRvIGZyZWUgbG9jayB3aXRoIGFjdGl2ZSB3YWl0IHF1ZXVlIik7CisKKwlpZiAoIWxpc3RfZW1wdHkoJmZsLT5mbF9ibG9jaykpCisJCXBhbmljKCJBdHRlbXB0aW5nIHRvIGZyZWUgbG9jayB3aXRoIGFjdGl2ZSBibG9jayBsaXN0Iik7CisKKwlpZiAoIWxpc3RfZW1wdHkoJmZsLT5mbF9saW5rKSkKKwkJcGFuaWMoIkF0dGVtcHRpbmcgdG8gZnJlZSBsb2NrIG9uIGFjdGl2ZSBsb2NrIGxpc3QiKTsKKworCWlmIChmbC0+Zmxfb3BzKSB7CisJCWlmIChmbC0+Zmxfb3BzLT5mbF9yZWxlYXNlX3ByaXZhdGUpCisJCQlmbC0+Zmxfb3BzLT5mbF9yZWxlYXNlX3ByaXZhdGUoZmwpOworCQlmbC0+Zmxfb3BzID0gTlVMTDsKKwl9CisKKwlpZiAoZmwtPmZsX2xtb3BzKSB7CisJCWlmIChmbC0+ZmxfbG1vcHMtPmZsX3JlbGVhc2VfcHJpdmF0ZSkKKwkJCWZsLT5mbF9sbW9wcy0+ZmxfcmVsZWFzZV9wcml2YXRlKGZsKTsKKwkJZmwtPmZsX2xtb3BzID0gTlVMTDsKKwl9CisKKwlrbWVtX2NhY2hlX2ZyZWUoZmlsZWxvY2tfY2FjaGUsIGZsKTsKK30KKwordm9pZCBsb2Nrc19pbml0X2xvY2soc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJSU5JVF9MSVNUX0hFQUQoJmZsLT5mbF9saW5rKTsKKwlJTklUX0xJU1RfSEVBRCgmZmwtPmZsX2Jsb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZmbC0+Zmxfd2FpdCk7CisJZmwtPmZsX25leHQgPSBOVUxMOworCWZsLT5mbF9mYXN5bmMgPSBOVUxMOworCWZsLT5mbF9vd25lciA9IE5VTEw7CisJZmwtPmZsX3BpZCA9IDA7CisJZmwtPmZsX2ZpbGUgPSBOVUxMOworCWZsLT5mbF9mbGFncyA9IDA7CisJZmwtPmZsX3R5cGUgPSAwOworCWZsLT5mbF9zdGFydCA9IGZsLT5mbF9lbmQgPSAwOworCWZsLT5mbF9vcHMgPSBOVUxMOworCWZsLT5mbF9sbW9wcyA9IE5VTEw7Cit9CisKK0VYUE9SVF9TWU1CT0wobG9ja3NfaW5pdF9sb2NrKTsKKworLyoKKyAqIEluaXRpYWxpc2VzIHRoZSBmaWVsZHMgb2YgdGhlIGZpbGUgbG9jayB3aGljaCBhcmUgaW52YXJpYW50IGZvcgorICogZnJlZSBmaWxlX2xvY2tzLgorICovCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqZm9vLCBrbWVtX2NhY2hlX3QgKmNhY2hlLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBmaWxlX2xvY2sgKmxvY2sgPSAoc3RydWN0IGZpbGVfbG9jayAqKSBmb287CisKKwlpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRll8U0xBQl9DVE9SX0NPTlNUUlVDVE9SKSkgIT0KKwkJCQkJU0xBQl9DVE9SX0NPTlNUUlVDVE9SKQorCQlyZXR1cm47CisKKwlsb2Nrc19pbml0X2xvY2sobG9jayk7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIGEgbmV3IGxvY2sgZnJvbSBhbiBleGlzdGluZyBmaWxlX2xvY2sgc3RydWN0dXJlLgorICovCit2b2lkIGxvY2tzX2NvcHlfbG9jayhzdHJ1Y3QgZmlsZV9sb2NrICpuZXcsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCW5ldy0+Zmxfb3duZXIgPSBmbC0+Zmxfb3duZXI7CisJbmV3LT5mbF9waWQgPSBmbC0+ZmxfcGlkOworCW5ldy0+ZmxfZmlsZSA9IGZsLT5mbF9maWxlOworCW5ldy0+ZmxfZmxhZ3MgPSBmbC0+ZmxfZmxhZ3M7CisJbmV3LT5mbF90eXBlID0gZmwtPmZsX3R5cGU7CisJbmV3LT5mbF9zdGFydCA9IGZsLT5mbF9zdGFydDsKKwluZXctPmZsX2VuZCA9IGZsLT5mbF9lbmQ7CisJbmV3LT5mbF9vcHMgPSBmbC0+Zmxfb3BzOworCW5ldy0+ZmxfbG1vcHMgPSBmbC0+ZmxfbG1vcHM7CisJaWYgKGZsLT5mbF9vcHMgJiYgZmwtPmZsX29wcy0+ZmxfY29weV9sb2NrKQorCQlmbC0+Zmxfb3BzLT5mbF9jb3B5X2xvY2sobmV3LCBmbCk7CisJaWYgKGZsLT5mbF9sbW9wcyAmJiBmbC0+ZmxfbG1vcHMtPmZsX2NvcHlfbG9jaykKKwkJZmwtPmZsX2xtb3BzLT5mbF9jb3B5X2xvY2sobmV3LCBmbCk7Cit9CisKK0VYUE9SVF9TWU1CT0wobG9ja3NfY29weV9sb2NrKTsKKworc3RhdGljIGlubGluZSBpbnQgZmxvY2tfdHJhbnNsYXRlX2NtZChpbnQgY21kKSB7CisJaWYgKGNtZCAmIExPQ0tfTUFORCkKKwkJcmV0dXJuIGNtZCAmIChMT0NLX01BTkQgfCBMT0NLX1JXKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgTE9DS19TSDoKKwkJcmV0dXJuIEZfUkRMQ0s7CisJY2FzZSBMT0NLX0VYOgorCQlyZXR1cm4gRl9XUkxDSzsKKwljYXNlIExPQ0tfVU46CisJCXJldHVybiBGX1VOTENLOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogRmlsbCBpbiBhIGZpbGVfbG9jayBzdHJ1Y3R1cmUgd2l0aCBhbiBhcHByb3ByaWF0ZSBGTE9DSyBsb2NrLiAqLworc3RhdGljIGludCBmbG9ja19tYWtlX2xvY2soc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBmaWxlX2xvY2sgKipsb2NrLAorCQl1bnNpZ25lZCBpbnQgY21kKQoreworCXN0cnVjdCBmaWxlX2xvY2sgKmZsOworCWludCB0eXBlID0gZmxvY2tfdHJhbnNsYXRlX2NtZChjbWQpOworCWlmICh0eXBlIDwgMCkKKwkJcmV0dXJuIHR5cGU7CisJCisJZmwgPSBsb2Nrc19hbGxvY19sb2NrKCk7CisJaWYgKGZsID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJZmwtPmZsX2ZpbGUgPSBmaWxwOworCWZsLT5mbF9waWQgPSBjdXJyZW50LT50Z2lkOworCWZsLT5mbF9mbGFncyA9IEZMX0ZMT0NLOworCWZsLT5mbF90eXBlID0gdHlwZTsKKwlmbC0+ZmxfZW5kID0gT0ZGU0VUX01BWDsKKwkKKwkqbG9jayA9IGZsOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFzc2lnbl90eXBlKHN0cnVjdCBmaWxlX2xvY2sgKmZsLCBpbnQgdHlwZSkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEZfUkRMQ0s6CisJY2FzZSBGX1dSTENLOgorCWNhc2UgRl9VTkxDSzoKKwkJZmwtPmZsX3R5cGUgPSB0eXBlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFZlcmlmeSBhICJzdHJ1Y3QgZmxvY2siIGFuZCBjb3B5IGl0IHRvIGEgInN0cnVjdCBmaWxlX2xvY2siIGFzIGEgUE9TSVgKKyAqIHN0eWxlIGxvY2suCisgKi8KK3N0YXRpYyBpbnQgZmxvY2tfdG9fcG9zaXhfbG9jayhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGZpbGVfbG9jayAqZmwsCisJCQkgICAgICAgc3RydWN0IGZsb2NrICpsKQoreworCW9mZl90IHN0YXJ0LCBlbmQ7CisKKwlzd2l0Y2ggKGwtPmxfd2hlbmNlKSB7CisJY2FzZSAwOiAvKlNFRUtfU0VUKi8KKwkJc3RhcnQgPSAwOworCQlicmVhazsKKwljYXNlIDE6IC8qU0VFS19DVVIqLworCQlzdGFydCA9IGZpbHAtPmZfcG9zOworCQlicmVhazsKKwljYXNlIDI6IC8qU0VFS19FTkQqLworCQlzdGFydCA9IGlfc2l6ZV9yZWFkKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogUE9TSVgtMTk5NiBsZWF2ZXMgdGhlIGNhc2UgbC0+bF9sZW4gPCAwIHVuZGVmaW5lZDsKKwkgICBQT1NJWC0yMDAxIGRlZmluZXMgaXQuICovCisJc3RhcnQgKz0gbC0+bF9zdGFydDsKKwllbmQgPSBzdGFydCArIGwtPmxfbGVuIC0gMTsKKwlpZiAobC0+bF9sZW4gPCAwKSB7CisJCWVuZCA9IHN0YXJ0IC0gMTsKKwkJc3RhcnQgKz0gbC0+bF9sZW47CisJfQorCisJaWYgKHN0YXJ0IDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGwtPmxfbGVuID4gMCAmJiBlbmQgPCAwKQorCQlyZXR1cm4gLUVPVkVSRkxPVzsKKworCWZsLT5mbF9zdGFydCA9IHN0YXJ0OwkvKiB3ZSByZWNvcmQgdGhlIGFic29sdXRlIHBvc2l0aW9uICovCisJZmwtPmZsX2VuZCA9IGVuZDsKKwlpZiAobC0+bF9sZW4gPT0gMCkKKwkJZmwtPmZsX2VuZCA9IE9GRlNFVF9NQVg7CisJCisJZmwtPmZsX293bmVyID0gY3VycmVudC0+ZmlsZXM7CisJZmwtPmZsX3BpZCA9IGN1cnJlbnQtPnRnaWQ7CisJZmwtPmZsX2ZpbGUgPSBmaWxwOworCWZsLT5mbF9mbGFncyA9IEZMX1BPU0lYOworCWZsLT5mbF9vcHMgPSBOVUxMOworCWZsLT5mbF9sbW9wcyA9IE5VTEw7CisKKwlyZXR1cm4gYXNzaWduX3R5cGUoZmwsIGwtPmxfdHlwZSk7Cit9CisKKyNpZiBCSVRTX1BFUl9MT05HID09IDMyCitzdGF0aWMgaW50IGZsb2NrNjRfdG9fcG9zaXhfbG9jayhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGZpbGVfbG9jayAqZmwsCisJCQkJIHN0cnVjdCBmbG9jazY0ICpsKQoreworCWxvZmZfdCBzdGFydDsKKworCXN3aXRjaCAobC0+bF93aGVuY2UpIHsKKwljYXNlIDA6IC8qU0VFS19TRVQqLworCQlzdGFydCA9IDA7CisJCWJyZWFrOworCWNhc2UgMTogLypTRUVLX0NVUiovCisJCXN0YXJ0ID0gZmlscC0+Zl9wb3M7CisJCWJyZWFrOworCWNhc2UgMjogLypTRUVLX0VORCovCisJCXN0YXJ0ID0gaV9zaXplX3JlYWQoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoKChzdGFydCArPSBsLT5sX3N0YXJ0KSA8IDApIHx8IChsLT5sX2xlbiA8IDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlmbC0+ZmxfZW5kID0gc3RhcnQgKyBsLT5sX2xlbiAtIDE7CisJaWYgKGwtPmxfbGVuID4gMCAmJiBmbC0+ZmxfZW5kIDwgMCkKKwkJcmV0dXJuIC1FT1ZFUkZMT1c7CisJZmwtPmZsX3N0YXJ0ID0gc3RhcnQ7CS8qIHdlIHJlY29yZCB0aGUgYWJzb2x1dGUgcG9zaXRpb24gKi8KKwlpZiAobC0+bF9sZW4gPT0gMCkKKwkJZmwtPmZsX2VuZCA9IE9GRlNFVF9NQVg7CisJCisJZmwtPmZsX293bmVyID0gY3VycmVudC0+ZmlsZXM7CisJZmwtPmZsX3BpZCA9IGN1cnJlbnQtPnRnaWQ7CisJZmwtPmZsX2ZpbGUgPSBmaWxwOworCWZsLT5mbF9mbGFncyA9IEZMX1BPU0lYOworCWZsLT5mbF9vcHMgPSBOVUxMOworCWZsLT5mbF9sbW9wcyA9IE5VTEw7CisKKwlzd2l0Y2ggKGwtPmxfdHlwZSkgeworCWNhc2UgRl9SRExDSzoKKwljYXNlIEZfV1JMQ0s6CisJY2FzZSBGX1VOTENLOgorCQlmbC0+ZmxfdHlwZSA9IGwtPmxfdHlwZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuICgwKTsKK30KKyNlbmRpZgorCisvKiBkZWZhdWx0IGxlYXNlIGxvY2sgbWFuYWdlciBvcGVyYXRpb25zICovCitzdGF0aWMgdm9pZCBsZWFzZV9icmVha19jYWxsYmFjayhzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwlraWxsX2Zhc3luYygmZmwtPmZsX2Zhc3luYywgU0lHSU8sIFBPTExfTVNHKTsKK30KKworc3RhdGljIHZvaWQgbGVhc2VfcmVsZWFzZV9wcml2YXRlX2NhbGxiYWNrKHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCWlmICghZmwtPmZsX2ZpbGUpCisJCXJldHVybjsKKworCWZfZGVsb3duKGZsLT5mbF9maWxlKTsKKwlmbC0+ZmxfZmlsZS0+Zl9vd25lci5zaWdudW0gPSAwOworfQorCitpbnQgbGVhc2VfbXlsZWFzZV9jYWxsYmFjayhzdHJ1Y3QgZmlsZV9sb2NrICpmbCwgc3RydWN0IGZpbGVfbG9jayAqdHJ5KQoreworCXJldHVybiBmbC0+ZmxfZmlsZSA9PSB0cnktPmZsX2ZpbGU7Cit9CisKK3N0cnVjdCBsb2NrX21hbmFnZXJfb3BlcmF0aW9ucyBsZWFzZV9tYW5hZ2VyX29wcyA9IHsKKwkuZmxfYnJlYWsgPSBsZWFzZV9icmVha19jYWxsYmFjaywKKwkuZmxfcmVsZWFzZV9wcml2YXRlID0gbGVhc2VfcmVsZWFzZV9wcml2YXRlX2NhbGxiYWNrLAorCS5mbF9teWxlYXNlID0gbGVhc2VfbXlsZWFzZV9jYWxsYmFjaywKKwkuZmxfY2hhbmdlID0gbGVhc2VfbW9kaWZ5LAorfTsKKworLyoKKyAqIEluaXRpYWxpemUgYSBsZWFzZSwgdXNlIHRoZSBkZWZhdWx0IGxvY2sgbWFuYWdlciBvcGVyYXRpb25zCisgKi8KK3N0YXRpYyBpbnQgbGVhc2VfaW5pdChzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IHR5cGUsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKQorIHsKKwlmbC0+Zmxfb3duZXIgPSBjdXJyZW50LT5maWxlczsKKwlmbC0+ZmxfcGlkID0gY3VycmVudC0+dGdpZDsKKworCWZsLT5mbF9maWxlID0gZmlscDsKKwlmbC0+ZmxfZmxhZ3MgPSBGTF9MRUFTRTsKKwlpZiAoYXNzaWduX3R5cGUoZmwsIHR5cGUpICE9IDApIHsKKwkJbG9ja3NfZnJlZV9sb2NrKGZsKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWZsLT5mbF9zdGFydCA9IDA7CisJZmwtPmZsX2VuZCA9IE9GRlNFVF9NQVg7CisJZmwtPmZsX29wcyA9IE5VTEw7CisJZmwtPmZsX2xtb3BzID0gJmxlYXNlX21hbmFnZXJfb3BzOworCXJldHVybiAwOworfQorCisvKiBBbGxvY2F0ZSBhIGZpbGVfbG9jayBpbml0aWFsaXNlZCB0byB0aGlzIHR5cGUgb2YgbGVhc2UgKi8KK3N0YXRpYyBpbnQgbGVhc2VfYWxsb2Moc3RydWN0IGZpbGUgKmZpbHAsIGludCB0eXBlLCBzdHJ1Y3QgZmlsZV9sb2NrICoqZmxwKQoreworCXN0cnVjdCBmaWxlX2xvY2sgKmZsID0gbG9ja3NfYWxsb2NfbG9jaygpOworCWludCBlcnJvcjsKKworCWlmIChmbCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVycm9yID0gbGVhc2VfaW5pdChmaWxwLCB0eXBlLCBmbCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJKmZscCA9IGZsOworCXJldHVybiAwOworfQorCisvKiBDaGVjayBpZiB0d28gbG9ja3Mgb3ZlcmxhcCBlYWNoIG90aGVyLgorICovCitzdGF0aWMgaW5saW5lIGludCBsb2Nrc19vdmVybGFwKHN0cnVjdCBmaWxlX2xvY2sgKmZsMSwgc3RydWN0IGZpbGVfbG9jayAqZmwyKQoreworCXJldHVybiAoKGZsMS0+ZmxfZW5kID49IGZsMi0+Zmxfc3RhcnQpICYmCisJCShmbDItPmZsX2VuZCA+PSBmbDEtPmZsX3N0YXJ0KSk7Cit9CisKKy8qCisgKiBDaGVjayB3aGV0aGVyIHR3byBsb2NrcyBoYXZlIHRoZSBzYW1lIG93bmVyLgorICovCitzdGF0aWMgaW5saW5lIGludAorcG9zaXhfc2FtZV9vd25lcihzdHJ1Y3QgZmlsZV9sb2NrICpmbDEsIHN0cnVjdCBmaWxlX2xvY2sgKmZsMikKK3sKKwlpZiAoZmwxLT5mbF9sbW9wcyAmJiBmbDEtPmZsX2xtb3BzLT5mbF9jb21wYXJlX293bmVyKQorCQlyZXR1cm4gZmwyLT5mbF9sbW9wcyA9PSBmbDEtPmZsX2xtb3BzICYmCisJCQlmbDEtPmZsX2xtb3BzLT5mbF9jb21wYXJlX293bmVyKGZsMSwgZmwyKTsKKwlyZXR1cm4gZmwxLT5mbF9vd25lciA9PSBmbDItPmZsX293bmVyOworfQorCisvKiBSZW1vdmUgd2FpdGVyIGZyb20gYmxvY2tlcidzIGJsb2NrIGxpc3QuCisgKiBXaGVuIGJsb2NrZXIgZW5kcyB1cCBwb2ludGluZyB0byBpdHNlbGYgdGhlbiB0aGUgbGlzdCBpcyBlbXB0eS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fbG9ja3NfZGVsZXRlX2Jsb2NrKHN0cnVjdCBmaWxlX2xvY2sgKndhaXRlcikKK3sKKwlsaXN0X2RlbF9pbml0KCZ3YWl0ZXItPmZsX2Jsb2NrKTsKKwlsaXN0X2RlbF9pbml0KCZ3YWl0ZXItPmZsX2xpbmspOworCXdhaXRlci0+ZmxfbmV4dCA9IE5VTEw7Cit9CisKKy8qCisgKi8KK3N0YXRpYyB2b2lkIGxvY2tzX2RlbGV0ZV9ibG9jayhzdHJ1Y3QgZmlsZV9sb2NrICp3YWl0ZXIpCit7CisJbG9ja19rZXJuZWwoKTsKKwlfX2xvY2tzX2RlbGV0ZV9ibG9jayh3YWl0ZXIpOworCXVubG9ja19rZXJuZWwoKTsKK30KKworLyogSW5zZXJ0IHdhaXRlciBpbnRvIGJsb2NrZXIncyBibG9jayBsaXN0LgorICogV2UgdXNlIGEgY2lyY3VsYXIgbGlzdCBzbyB0aGF0IHByb2Nlc3NlcyBjYW4gYmUgZWFzaWx5IHdva2VuIHVwIGluCisgKiB0aGUgb3JkZXIgdGhleSBibG9ja2VkLiBUaGUgZG9jdW1lbnRhdGlvbiBkb2Vzbid0IHJlcXVpcmUgdGhpcyBidXQKKyAqIGl0IHNlZW1zIGxpa2UgdGhlIHJlYXNvbmFibGUgdGhpbmcgdG8gZG8uCisgKi8KK3N0YXRpYyB2b2lkIGxvY2tzX2luc2VydF9ibG9jayhzdHJ1Y3QgZmlsZV9sb2NrICpibG9ja2VyLCAKKwkJCSAgICAgICBzdHJ1Y3QgZmlsZV9sb2NrICp3YWl0ZXIpCit7CisJaWYgKCFsaXN0X2VtcHR5KCZ3YWl0ZXItPmZsX2Jsb2NrKSkgeworCQlwcmludGsoS0VSTl9FUlIgImxvY2tzX2luc2VydF9ibG9jazogcmVtb3ZpbmcgZHVwbGljYXRlZCBsb2NrICIKKwkJCSIocGlkPSVkICVMZC0lTGQgdHlwZT0lZClcbiIsIHdhaXRlci0+ZmxfcGlkLAorCQkJd2FpdGVyLT5mbF9zdGFydCwgd2FpdGVyLT5mbF9lbmQsIHdhaXRlci0+ZmxfdHlwZSk7CisJCV9fbG9ja3NfZGVsZXRlX2Jsb2NrKHdhaXRlcik7CisJfQorCWxpc3RfYWRkX3RhaWwoJndhaXRlci0+ZmxfYmxvY2ssICZibG9ja2VyLT5mbF9ibG9jayk7CisJd2FpdGVyLT5mbF9uZXh0ID0gYmxvY2tlcjsKKwlpZiAoSVNfUE9TSVgoYmxvY2tlcikpCisJCWxpc3RfYWRkKCZ3YWl0ZXItPmZsX2xpbmssICZibG9ja2VkX2xpc3QpOworfQorCisvKiBXYWtlIHVwIHByb2Nlc3NlcyBibG9ja2VkIHdhaXRpbmcgZm9yIGJsb2NrZXIuCisgKiBJZiB0b2xkIHRvIHdhaXQgdGhlbiBzY2hlZHVsZSB0aGUgcHJvY2Vzc2VzIHVudGlsIHRoZSBibG9jayBsaXN0CisgKiBpcyBlbXB0eSwgb3RoZXJ3aXNlIGVtcHR5IHRoZSBibG9jayBsaXN0IG91cnNlbHZlcy4KKyAqLworc3RhdGljIHZvaWQgbG9ja3Nfd2FrZV91cF9ibG9ja3Moc3RydWN0IGZpbGVfbG9jayAqYmxvY2tlcikKK3sKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmJsb2NrZXItPmZsX2Jsb2NrKSkgeworCQlzdHJ1Y3QgZmlsZV9sb2NrICp3YWl0ZXIgPSBsaXN0X2VudHJ5KGJsb2NrZXItPmZsX2Jsb2NrLm5leHQsCisJCQkJc3RydWN0IGZpbGVfbG9jaywgZmxfYmxvY2spOworCQlfX2xvY2tzX2RlbGV0ZV9ibG9jayh3YWl0ZXIpOworCQlpZiAod2FpdGVyLT5mbF9sbW9wcyAmJiB3YWl0ZXItPmZsX2xtb3BzLT5mbF9ub3RpZnkpCisJCQl3YWl0ZXItPmZsX2xtb3BzLT5mbF9ub3RpZnkod2FpdGVyKTsKKwkJZWxzZQorCQkJd2FrZV91cCgmd2FpdGVyLT5mbF93YWl0KTsKKwl9Cit9CisKKy8qIEluc2VydCBmaWxlIGxvY2sgZmwgaW50byBhbiBpbm9kZSdzIGxvY2sgbGlzdCBhdCB0aGUgcG9zaXRpb24gaW5kaWNhdGVkCisgKiBieSBwb3MuIEF0IHRoZSBzYW1lIHRpbWUgYWRkIHRoZSBsb2NrIHRvIHRoZSBnbG9iYWwgZmlsZSBsb2NrIGxpc3QuCisgKi8KK3N0YXRpYyB2b2lkIGxvY2tzX2luc2VydF9sb2NrKHN0cnVjdCBmaWxlX2xvY2sgKipwb3MsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCWxpc3RfYWRkKCZmbC0+ZmxfbGluaywgJmZpbGVfbG9ja19saXN0KTsKKworCS8qIGluc2VydCBpbnRvIGZpbGUncyBsaXN0ICovCisJZmwtPmZsX25leHQgPSAqcG9zOworCSpwb3MgPSBmbDsKKworCWlmIChmbC0+Zmxfb3BzICYmIGZsLT5mbF9vcHMtPmZsX2luc2VydCkKKwkJZmwtPmZsX29wcy0+ZmxfaW5zZXJ0KGZsKTsKK30KKworLyoKKyAqIERlbGV0ZSBhIGxvY2sgYW5kIHRoZW4gZnJlZSBpdC4KKyAqIFdha2UgdXAgcHJvY2Vzc2VzIHRoYXQgYXJlIGJsb2NrZWQgd2FpdGluZyBmb3IgdGhpcyBsb2NrLAorICogbm90aWZ5IHRoZSBGUyB0aGF0IHRoZSBsb2NrIGhhcyBiZWVuIGNsZWFyZWQgYW5kCisgKiBmaW5hbGx5IGZyZWUgdGhlIGxvY2suCisgKi8KK3N0YXRpYyB2b2lkIGxvY2tzX2RlbGV0ZV9sb2NrKHN0cnVjdCBmaWxlX2xvY2sgKip0aGlzZmxfcCkKK3sKKwlzdHJ1Y3QgZmlsZV9sb2NrICpmbCA9ICp0aGlzZmxfcDsKKworCSp0aGlzZmxfcCA9IGZsLT5mbF9uZXh0OworCWZsLT5mbF9uZXh0ID0gTlVMTDsKKwlsaXN0X2RlbF9pbml0KCZmbC0+ZmxfbGluayk7CisKKwlmYXN5bmNfaGVscGVyKDAsIGZsLT5mbF9maWxlLCAwLCAmZmwtPmZsX2Zhc3luYyk7CisJaWYgKGZsLT5mbF9mYXN5bmMgIT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImxvY2tzX2RlbGV0ZV9sb2NrOiBmYXN5bmMgPT0gJXBcbiIsIGZsLT5mbF9mYXN5bmMpOworCQlmbC0+ZmxfZmFzeW5jID0gTlVMTDsKKwl9CisKKwlpZiAoZmwtPmZsX29wcyAmJiBmbC0+Zmxfb3BzLT5mbF9yZW1vdmUpCisJCWZsLT5mbF9vcHMtPmZsX3JlbW92ZShmbCk7CisKKwlsb2Nrc193YWtlX3VwX2Jsb2NrcyhmbCk7CisJbG9ja3NfZnJlZV9sb2NrKGZsKTsKK30KKworLyogRGV0ZXJtaW5lIGlmIGxvY2sgc3lzX2ZsIGJsb2NrcyBsb2NrIGNhbGxlcl9mbC4gQ29tbW9uIGZ1bmN0aW9uYWxpdHkKKyAqIGNoZWNrcyBmb3Igc2hhcmVkL2V4Y2x1c2l2ZSBzdGF0dXMgb2Ygb3ZlcmxhcHBpbmcgbG9ja3MuCisgKi8KK3N0YXRpYyBpbnQgbG9ja3NfY29uZmxpY3Qoc3RydWN0IGZpbGVfbG9jayAqY2FsbGVyX2ZsLCBzdHJ1Y3QgZmlsZV9sb2NrICpzeXNfZmwpCit7CisJaWYgKHN5c19mbC0+ZmxfdHlwZSA9PSBGX1dSTENLKQorCQlyZXR1cm4gMTsKKwlpZiAoY2FsbGVyX2ZsLT5mbF90eXBlID09IEZfV1JMQ0spCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCisvKiBEZXRlcm1pbmUgaWYgbG9jayBzeXNfZmwgYmxvY2tzIGxvY2sgY2FsbGVyX2ZsLiBQT1NJWCBzcGVjaWZpYworICogY2hlY2tpbmcgYmVmb3JlIGNhbGxpbmcgdGhlIGxvY2tzX2NvbmZsaWN0KCkuCisgKi8KK3N0YXRpYyBpbnQgcG9zaXhfbG9ja3NfY29uZmxpY3Qoc3RydWN0IGZpbGVfbG9jayAqY2FsbGVyX2ZsLCBzdHJ1Y3QgZmlsZV9sb2NrICpzeXNfZmwpCit7CisJLyogUE9TSVggbG9ja3Mgb3duZWQgYnkgdGhlIHNhbWUgcHJvY2VzcyBkbyBub3QgY29uZmxpY3Qgd2l0aAorCSAqIGVhY2ggb3RoZXIuCisJICovCisJaWYgKCFJU19QT1NJWChzeXNfZmwpIHx8IHBvc2l4X3NhbWVfb3duZXIoY2FsbGVyX2ZsLCBzeXNfZmwpKQorCQlyZXR1cm4gKDApOworCisJLyogQ2hlY2sgd2hldGhlciB0aGV5IG92ZXJsYXAgKi8KKwlpZiAoIWxvY2tzX292ZXJsYXAoY2FsbGVyX2ZsLCBzeXNfZmwpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAobG9ja3NfY29uZmxpY3QoY2FsbGVyX2ZsLCBzeXNfZmwpKTsKK30KKworLyogRGV0ZXJtaW5lIGlmIGxvY2sgc3lzX2ZsIGJsb2NrcyBsb2NrIGNhbGxlcl9mbC4gRkxPQ0sgc3BlY2lmaWMKKyAqIGNoZWNraW5nIGJlZm9yZSBjYWxsaW5nIHRoZSBsb2Nrc19jb25mbGljdCgpLgorICovCitzdGF0aWMgaW50IGZsb2NrX2xvY2tzX2NvbmZsaWN0KHN0cnVjdCBmaWxlX2xvY2sgKmNhbGxlcl9mbCwgc3RydWN0IGZpbGVfbG9jayAqc3lzX2ZsKQoreworCS8qIEZMT0NLIGxvY2tzIHJlZmVycmluZyB0byB0aGUgc2FtZSBmaWxwIGRvIG5vdCBjb25mbGljdCB3aXRoCisJICogZWFjaCBvdGhlci4KKwkgKi8KKwlpZiAoIUlTX0ZMT0NLKHN5c19mbCkgfHwgKGNhbGxlcl9mbC0+ZmxfZmlsZSA9PSBzeXNfZmwtPmZsX2ZpbGUpKQorCQlyZXR1cm4gKDApOworCWlmICgoY2FsbGVyX2ZsLT5mbF90eXBlICYgTE9DS19NQU5EKSB8fCAoc3lzX2ZsLT5mbF90eXBlICYgTE9DS19NQU5EKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gKGxvY2tzX2NvbmZsaWN0KGNhbGxlcl9mbCwgc3lzX2ZsKSk7Cit9CisKK3N0YXRpYyBpbnQgaW50ZXJydXB0aWJsZV9zbGVlcF9vbl9sb2NrZWQod2FpdF9xdWV1ZV9oZWFkX3QgKmZsX3dhaXQsIGludCB0aW1lb3V0KQoreworCWludCByZXN1bHQgPSAwOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCWFkZF93YWl0X3F1ZXVlKGZsX3dhaXQsICZ3YWl0KTsKKwlpZiAodGltZW91dCA9PSAwKQorCQlzY2hlZHVsZSgpOworCWVsc2UKKwkJcmVzdWx0ID0gc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCXJlc3VsdCA9IC1FUkVTVEFSVFNZUzsKKwlyZW1vdmVfd2FpdF9xdWV1ZShmbF93YWl0LCAmd2FpdCk7CisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgbG9ja3NfYmxvY2tfb25fdGltZW91dChzdHJ1Y3QgZmlsZV9sb2NrICpibG9ja2VyLCBzdHJ1Y3QgZmlsZV9sb2NrICp3YWl0ZXIsIGludCB0aW1lKQoreworCWludCByZXN1bHQ7CisJbG9ja3NfaW5zZXJ0X2Jsb2NrKGJsb2NrZXIsIHdhaXRlcik7CisJcmVzdWx0ID0gaW50ZXJydXB0aWJsZV9zbGVlcF9vbl9sb2NrZWQoJndhaXRlci0+Zmxfd2FpdCwgdGltZSk7CisJX19sb2Nrc19kZWxldGVfYmxvY2sod2FpdGVyKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdHJ1Y3QgZmlsZV9sb2NrICoKK3Bvc2l4X3Rlc3RfbG9jayhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJc3RydWN0IGZpbGVfbG9jayAqY2ZsOworCisJbG9ja19rZXJuZWwoKTsKKwlmb3IgKGNmbCA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLT5pX2Zsb2NrOyBjZmw7IGNmbCA9IGNmbC0+ZmxfbmV4dCkgeworCQlpZiAoIUlTX1BPU0lYKGNmbCkpCisJCQljb250aW51ZTsKKwkJaWYgKHBvc2l4X2xvY2tzX2NvbmZsaWN0KGNmbCwgZmwpKQorCQkJYnJlYWs7CisJfQorCXVubG9ja19rZXJuZWwoKTsKKworCXJldHVybiAoY2ZsKTsKK30KKworRVhQT1JUX1NZTUJPTChwb3NpeF90ZXN0X2xvY2spOworCisvKiBUaGlzIGZ1bmN0aW9uIHRlc3RzIGZvciBkZWFkbG9jayBjb25kaXRpb24gYmVmb3JlIHB1dHRpbmcgYSBwcm9jZXNzIHRvCisgKiBzbGVlcC4gVGhlIGRldGVjdGlvbiBzY2hlbWUgaXMgbm8gbG9uZ2VyIHJlY3Vyc2l2ZS4gUmVjdXJzaXZlIHdhcyBuZWF0LAorICogYnV0IGRhbmdlcm91cyAtIHdlIHJpc2tlZCBzdGFjayBjb3JydXB0aW9uIGlmIHRoZSBsb2NrIGRhdGEgd2FzIGJhZCwgb3IKKyAqIGlmIHRoZSByZWN1cnNpb24gd2FzIHRvbyBkZWVwIGZvciBhbnkgb3RoZXIgcmVhc29uLgorICoKKyAqIFdlIHJlbHkgb24gdGhlIGZhY3QgdGhhdCBhIHRhc2sgY2FuIG9ubHkgYmUgb24gb25lIGxvY2sncyB3YWl0IHF1ZXVlCisgKiBhdCBhIHRpbWUuIFdoZW4gd2UgZmluZCBibG9ja2VkX3Rhc2sgb24gYSB3YWl0IHF1ZXVlIHdlIGNhbiByZS1zZWFyY2gKKyAqIHdpdGggYmxvY2tlZF90YXNrIGVxdWFsIHRvIHRoYXQgcXVldWUncyBvd25lciwgdW50aWwgZWl0aGVyIGJsb2NrZWRfdGFzaworICogaXNuJ3QgZm91bmQsIG9yIGJsb2NrZWRfdGFzayBpcyBmb3VuZCBvbiBhIHF1ZXVlIG93bmVkIGJ5IG15X3Rhc2suCisgKgorICogTm90ZTogdGhlIGFib3ZlIGFzc3VtcHRpb24gbWF5IG5vdCBiZSB0cnVlIHdoZW4gaGFuZGxpbmcgbG9jayByZXF1ZXN0cworICogZnJvbSBhIGJyb2tlbiBORlMgY2xpZW50LiBCdXQgYnJva2VuIE5GUyBjbGllbnRzIGhhdmUgYSBsb3QgbW9yZSB0bworICogd29ycnkgYWJvdXQgdGhhbiBwcm9wZXIgZGVhZGxvY2sgZGV0ZWN0aW9uIGFueXdheS4uLiAtLW9raXIKKyAqLworaW50IHBvc2l4X2xvY2tzX2RlYWRsb2NrKHN0cnVjdCBmaWxlX2xvY2sgKmNhbGxlcl9mbCwKKwkJCQlzdHJ1Y3QgZmlsZV9sb2NrICpibG9ja19mbCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisKK25leHRfdGFzazoKKwlpZiAocG9zaXhfc2FtZV9vd25lcihjYWxsZXJfZmwsIGJsb2NrX2ZsKSkKKwkJcmV0dXJuIDE7CisJbGlzdF9mb3JfZWFjaCh0bXAsICZibG9ja2VkX2xpc3QpIHsKKwkJc3RydWN0IGZpbGVfbG9jayAqZmwgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGZpbGVfbG9jaywgZmxfbGluayk7CisJCWlmIChwb3NpeF9zYW1lX293bmVyKGZsLCBibG9ja19mbCkpIHsKKwkJCWZsID0gZmwtPmZsX25leHQ7CisJCQlibG9ja19mbCA9IGZsOworCQkJZ290byBuZXh0X3Rhc2s7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0wocG9zaXhfbG9ja3NfZGVhZGxvY2spOworCisvKiBUcnkgdG8gY3JlYXRlIGEgRkxPQ0sgbG9jayBvbiBmaWxwLiBXZSBhbHdheXMgaW5zZXJ0IG5ldyBGTE9DSyBsb2NrcworICogYXQgdGhlIGhlYWQgb2YgdGhlIGxpc3QsIGJ1dCB0aGF0J3Mgc2VjcmV0IGtub3dsZWRnZSBrbm93biBvbmx5IHRvCisgKiBmbG9ja19sb2NrX2ZpbGUgYW5kIHBvc2l4X2xvY2tfZmlsZS4KKyAqLworc3RhdGljIGludCBmbG9ja19sb2NrX2ZpbGUoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBmaWxlX2xvY2sgKm5ld19mbCkKK3sKKwlzdHJ1Y3QgZmlsZV9sb2NrICoqYmVmb3JlOworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJaW50IGVycm9yID0gMDsKKwlpbnQgZm91bmQgPSAwOworCisJbG9ja19rZXJuZWwoKTsKKwlmb3JfZWFjaF9sb2NrKGlub2RlLCBiZWZvcmUpIHsKKwkJc3RydWN0IGZpbGVfbG9jayAqZmwgPSAqYmVmb3JlOworCQlpZiAoSVNfUE9TSVgoZmwpKQorCQkJYnJlYWs7CisJCWlmIChJU19MRUFTRShmbCkpCisJCQljb250aW51ZTsKKwkJaWYgKGZpbHAgIT0gZmwtPmZsX2ZpbGUpCisJCQljb250aW51ZTsKKwkJaWYgKG5ld19mbC0+ZmxfdHlwZSA9PSBmbC0+ZmxfdHlwZSkKKwkJCWdvdG8gb3V0OworCQlmb3VuZCA9IDE7CisJCWxvY2tzX2RlbGV0ZV9sb2NrKGJlZm9yZSk7CisJCWJyZWFrOworCX0KKwl1bmxvY2tfa2VybmVsKCk7CisKKwlpZiAobmV3X2ZsLT5mbF90eXBlID09IEZfVU5MQ0spCisJCXJldHVybiAwOworCisJLyoKKwkgKiBJZiBhIGhpZ2hlci1wcmlvcml0eSBwcm9jZXNzIHdhcyBibG9ja2VkIG9uIHRoZSBvbGQgZmlsZSBsb2NrLAorCSAqIGdpdmUgaXQgdGhlIG9wcG9ydHVuaXR5IHRvIGxvY2sgdGhlIGZpbGUuCisJICovCisJaWYgKGZvdW5kKQorCQljb25kX3Jlc2NoZWQoKTsKKworCWxvY2tfa2VybmVsKCk7CisJZm9yX2VhY2hfbG9jayhpbm9kZSwgYmVmb3JlKSB7CisJCXN0cnVjdCBmaWxlX2xvY2sgKmZsID0gKmJlZm9yZTsKKwkJaWYgKElTX1BPU0lYKGZsKSkKKwkJCWJyZWFrOworCQlpZiAoSVNfTEVBU0UoZmwpKQorCQkJY29udGludWU7CisJCWlmICghZmxvY2tfbG9ja3NfY29uZmxpY3QobmV3X2ZsLCBmbCkpCisJCQljb250aW51ZTsKKwkJZXJyb3IgPSAtRUFHQUlOOworCQlpZiAobmV3X2ZsLT5mbF9mbGFncyAmIEZMX1NMRUVQKSB7CisJCQlsb2Nrc19pbnNlcnRfYmxvY2soZmwsIG5ld19mbCk7CisJCX0KKwkJZ290byBvdXQ7CisJfQorCWxvY2tzX2luc2VydF9sb2NrKCZpbm9kZS0+aV9mbG9jaywgbmV3X2ZsKTsKKwllcnJvciA9IDA7CisKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycm9yOworfQorCitFWFBPUlRfU1lNQk9MKHBvc2l4X2xvY2tfZmlsZSk7CisKK3N0YXRpYyBpbnQgX19wb3NpeF9sb2NrX2ZpbGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGVfbG9jayAqcmVxdWVzdCkKK3sKKwlzdHJ1Y3QgZmlsZV9sb2NrICpmbDsKKwlzdHJ1Y3QgZmlsZV9sb2NrICpuZXdfZmwsICpuZXdfZmwyOworCXN0cnVjdCBmaWxlX2xvY2sgKmxlZnQgPSBOVUxMOworCXN0cnVjdCBmaWxlX2xvY2sgKnJpZ2h0ID0gTlVMTDsKKwlzdHJ1Y3QgZmlsZV9sb2NrICoqYmVmb3JlOworCWludCBlcnJvciwgYWRkZWQgPSAwOworCisJLyoKKwkgKiBXZSBtYXkgbmVlZCB0d28gZmlsZV9sb2NrIHN0cnVjdHVyZXMgZm9yIHRoaXMgb3BlcmF0aW9uLAorCSAqIHNvIHdlIGdldCB0aGVtIGluIGFkdmFuY2UgdG8gYXZvaWQgcmFjZXMuCisJICovCisJbmV3X2ZsID0gbG9ja3NfYWxsb2NfbG9jaygpOworCW5ld19mbDIgPSBsb2Nrc19hbGxvY19sb2NrKCk7CisKKwlsb2NrX2tlcm5lbCgpOworCWlmIChyZXF1ZXN0LT5mbF90eXBlICE9IEZfVU5MQ0spIHsKKwkJZm9yX2VhY2hfbG9jayhpbm9kZSwgYmVmb3JlKSB7CisJCQlzdHJ1Y3QgZmlsZV9sb2NrICpmbCA9ICpiZWZvcmU7CisJCQlpZiAoIUlTX1BPU0lYKGZsKSkKKwkJCQljb250aW51ZTsKKwkJCWlmICghcG9zaXhfbG9ja3NfY29uZmxpY3QocmVxdWVzdCwgZmwpKQorCQkJCWNvbnRpbnVlOworCQkJZXJyb3IgPSAtRUFHQUlOOworCQkJaWYgKCEocmVxdWVzdC0+ZmxfZmxhZ3MgJiBGTF9TTEVFUCkpCisJCQkJZ290byBvdXQ7CisJCQllcnJvciA9IC1FREVBRExLOworCQkJaWYgKHBvc2l4X2xvY2tzX2RlYWRsb2NrKHJlcXVlc3QsIGZsKSkKKwkJCQlnb3RvIG91dDsKKwkJCWVycm9yID0gLUVBR0FJTjsKKwkJCWxvY2tzX2luc2VydF9ibG9jayhmbCwgcmVxdWVzdCk7CisJCQlnb3RvIG91dDsKKyAgCQl9CisgIAl9CisKKwkvKiBJZiB3ZSdyZSBqdXN0IGxvb2tpbmcgZm9yIGEgY29uZmxpY3QsIHdlJ3JlIGRvbmUuICovCisJZXJyb3IgPSAwOworCWlmIChyZXF1ZXN0LT5mbF9mbGFncyAmIEZMX0FDQ0VTUykKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IC1FTk9MQ0s7IC8qICJubyBsdWNrIiAqLworCWlmICghKG5ld19mbCAmJiBuZXdfZmwyKSkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIFdlJ3ZlIGFsbG9jYXRlZCB0aGUgbmV3IGxvY2tzIGluIGFkdmFuY2UsIHNvIHRoZXJlIGFyZSBubworCSAqIGVycm9ycyBwb3NzaWJsZSAoYW5kIG5vIGJsb2NraW5nIG9wZXJhdGlvbnMpIGZyb20gaGVyZSBvbi4KKwkgKiAKKwkgKiBGaW5kIHRoZSBmaXJzdCBvbGQgbG9jayB3aXRoIHRoZSBzYW1lIG93bmVyIGFzIHRoZSBuZXcgbG9jay4KKwkgKi8KKwkKKwliZWZvcmUgPSAmaW5vZGUtPmlfZmxvY2s7CisKKwkvKiBGaXJzdCBza2lwIGxvY2tzIG93bmVkIGJ5IG90aGVyIHByb2Nlc3Nlcy4gICovCisJd2hpbGUgKChmbCA9ICpiZWZvcmUpICYmICghSVNfUE9TSVgoZmwpIHx8CisJCQkJICAhcG9zaXhfc2FtZV9vd25lcihyZXF1ZXN0LCBmbCkpKSB7CisJCWJlZm9yZSA9ICZmbC0+ZmxfbmV4dDsKKwl9CisKKwkvKiBQcm9jZXNzIGxvY2tzIHdpdGggdGhpcyBvd25lci4gICovCisJd2hpbGUgKChmbCA9ICpiZWZvcmUpICYmIHBvc2l4X3NhbWVfb3duZXIocmVxdWVzdCwgZmwpKSB7CisJCS8qIERldGVjdCBhZGphY2VudCBvciBvdmVybGFwcGluZyByZWdpb25zIChpZiBzYW1lIGxvY2sgdHlwZSkKKwkJICovCisJCWlmIChyZXF1ZXN0LT5mbF90eXBlID09IGZsLT5mbF90eXBlKSB7CisJCQlpZiAoZmwtPmZsX2VuZCA8IHJlcXVlc3QtPmZsX3N0YXJ0IC0gMSkKKwkJCQlnb3RvIG5leHRfbG9jazsKKwkJCS8qIElmIHRoZSBuZXh0IGxvY2sgaW4gdGhlIGxpc3QgaGFzIGVudGlyZWx5IGJpZ2dlcgorCQkJICogYWRkcmVzc2VzIHRoYW4gdGhlIG5ldyBvbmUsIGluc2VydCB0aGUgbG9jayBoZXJlLgorCQkJICovCisJCQlpZiAoZmwtPmZsX3N0YXJ0ID4gcmVxdWVzdC0+ZmxfZW5kICsgMSkKKwkJCQlicmVhazsKKworCQkJLyogSWYgd2UgY29tZSBoZXJlLCB0aGUgbmV3IGFuZCBvbGQgbG9jayBhcmUgb2YgdGhlCisJCQkgKiBzYW1lIHR5cGUgYW5kIGFkamFjZW50IG9yIG92ZXJsYXBwaW5nLiBNYWtlIG9uZQorCQkJICogbG9jayB5aWVsZGluZyBmcm9tIHRoZSBsb3dlciBzdGFydCBhZGRyZXNzIG9mIGJvdGgKKwkJCSAqIGxvY2tzIHRvIHRoZSBoaWdoZXIgZW5kIGFkZHJlc3MuCisJCQkgKi8KKwkJCWlmIChmbC0+Zmxfc3RhcnQgPiByZXF1ZXN0LT5mbF9zdGFydCkKKwkJCQlmbC0+Zmxfc3RhcnQgPSByZXF1ZXN0LT5mbF9zdGFydDsKKwkJCWVsc2UKKwkJCQlyZXF1ZXN0LT5mbF9zdGFydCA9IGZsLT5mbF9zdGFydDsKKwkJCWlmIChmbC0+ZmxfZW5kIDwgcmVxdWVzdC0+ZmxfZW5kKQorCQkJCWZsLT5mbF9lbmQgPSByZXF1ZXN0LT5mbF9lbmQ7CisJCQllbHNlCisJCQkJcmVxdWVzdC0+ZmxfZW5kID0gZmwtPmZsX2VuZDsKKwkJCWlmIChhZGRlZCkgeworCQkJCWxvY2tzX2RlbGV0ZV9sb2NrKGJlZm9yZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlyZXF1ZXN0ID0gZmw7CisJCQlhZGRlZCA9IDE7CisJCX0KKwkJZWxzZSB7CisJCQkvKiBQcm9jZXNzaW5nIGZvciBkaWZmZXJlbnQgbG9jayB0eXBlcyBpcyBhIGJpdAorCQkJICogbW9yZSBjb21wbGV4LgorCQkJICovCisJCQlpZiAoZmwtPmZsX2VuZCA8IHJlcXVlc3QtPmZsX3N0YXJ0KQorCQkJCWdvdG8gbmV4dF9sb2NrOworCQkJaWYgKGZsLT5mbF9zdGFydCA+IHJlcXVlc3QtPmZsX2VuZCkKKwkJCQlicmVhazsKKwkJCWlmIChyZXF1ZXN0LT5mbF90eXBlID09IEZfVU5MQ0spCisJCQkJYWRkZWQgPSAxOworCQkJaWYgKGZsLT5mbF9zdGFydCA8IHJlcXVlc3QtPmZsX3N0YXJ0KQorCQkJCWxlZnQgPSBmbDsKKwkJCS8qIElmIHRoZSBuZXh0IGxvY2sgaW4gdGhlIGxpc3QgaGFzIGEgaGlnaGVyIGVuZAorCQkJICogYWRkcmVzcyB0aGFuIHRoZSBuZXcgb25lLCBpbnNlcnQgdGhlIG5ldyBvbmUgaGVyZS4KKwkJCSAqLworCQkJaWYgKGZsLT5mbF9lbmQgPiByZXF1ZXN0LT5mbF9lbmQpIHsKKwkJCQlyaWdodCA9IGZsOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGZsLT5mbF9zdGFydCA+PSByZXF1ZXN0LT5mbF9zdGFydCkgeworCQkJCS8qIFRoZSBuZXcgbG9jayBjb21wbGV0ZWx5IHJlcGxhY2VzIGFuIG9sZAorCQkJCSAqIG9uZSAoVGhpcyBtYXkgaGFwcGVuIHNldmVyYWwgdGltZXMpLgorCQkJCSAqLworCQkJCWlmIChhZGRlZCkgeworCQkJCQlsb2Nrc19kZWxldGVfbG9jayhiZWZvcmUpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJLyogUmVwbGFjZSB0aGUgb2xkIGxvY2sgd2l0aCB0aGUgbmV3IG9uZS4KKwkJCQkgKiBXYWtlIHVwIGFueWJvZHkgd2FpdGluZyBmb3IgdGhlIG9sZCBvbmUsCisJCQkJICogYXMgdGhlIGNoYW5nZSBpbiBsb2NrIHR5cGUgbWlnaHQgc2F0aXNmeQorCQkJCSAqIHRoZWlyIG5lZWRzLgorCQkJCSAqLworCQkJCWxvY2tzX3dha2VfdXBfYmxvY2tzKGZsKTsKKwkJCQlmbC0+Zmxfc3RhcnQgPSByZXF1ZXN0LT5mbF9zdGFydDsKKwkJCQlmbC0+ZmxfZW5kID0gcmVxdWVzdC0+ZmxfZW5kOworCQkJCWZsLT5mbF90eXBlID0gcmVxdWVzdC0+ZmxfdHlwZTsKKwkJCQlmbC0+ZmxfdSA9IHJlcXVlc3QtPmZsX3U7CisJCQkJcmVxdWVzdCA9IGZsOworCQkJCWFkZGVkID0gMTsKKwkJCX0KKwkJfQorCQkvKiBHbyBvbiB0byBuZXh0IGxvY2suCisJCSAqLworCW5leHRfbG9jazoKKwkJYmVmb3JlID0gJmZsLT5mbF9uZXh0OworCX0KKworCWVycm9yID0gMDsKKwlpZiAoIWFkZGVkKSB7CisJCWlmIChyZXF1ZXN0LT5mbF90eXBlID09IEZfVU5MQ0spCisJCQlnb3RvIG91dDsKKwkJbG9ja3NfY29weV9sb2NrKG5ld19mbCwgcmVxdWVzdCk7CisJCWxvY2tzX2luc2VydF9sb2NrKGJlZm9yZSwgbmV3X2ZsKTsKKwkJbmV3X2ZsID0gTlVMTDsKKwl9CisJaWYgKHJpZ2h0KSB7CisJCWlmIChsZWZ0ID09IHJpZ2h0KSB7CisJCQkvKiBUaGUgbmV3IGxvY2sgYnJlYWtzIHRoZSBvbGQgb25lIGluIHR3byBwaWVjZXMsCisJCQkgKiBzbyB3ZSBoYXZlIHRvIHVzZSB0aGUgc2Vjb25kIG5ldyBsb2NrLgorCQkJICovCisJCQlsZWZ0ID0gbmV3X2ZsMjsKKwkJCW5ld19mbDIgPSBOVUxMOworCQkJbG9ja3NfY29weV9sb2NrKGxlZnQsIHJpZ2h0KTsKKwkJCWxvY2tzX2luc2VydF9sb2NrKGJlZm9yZSwgbGVmdCk7CisJCX0KKwkJcmlnaHQtPmZsX3N0YXJ0ID0gcmVxdWVzdC0+ZmxfZW5kICsgMTsKKwkJbG9ja3Nfd2FrZV91cF9ibG9ja3MocmlnaHQpOworCX0KKwlpZiAobGVmdCkgeworCQlsZWZ0LT5mbF9lbmQgPSByZXF1ZXN0LT5mbF9zdGFydCAtIDE7CisJCWxvY2tzX3dha2VfdXBfYmxvY2tzKGxlZnQpOworCX0KKyBvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCS8qCisJICogRnJlZSBhbnkgdW51c2VkIGxvY2tzLgorCSAqLworCWlmIChuZXdfZmwpCisJCWxvY2tzX2ZyZWVfbG9jayhuZXdfZmwpOworCWlmIChuZXdfZmwyKQorCQlsb2Nrc19mcmVlX2xvY2sobmV3X2ZsMik7CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqIHBvc2l4X2xvY2tfZmlsZSAtIEFwcGx5IGEgUE9TSVgtc3R5bGUgbG9jayB0byBhIGZpbGUKKyAqIEBmaWxwOiBUaGUgZmlsZSB0byBhcHBseSB0aGUgbG9jayB0bworICogQGZsOiBUaGUgbG9jayB0byBiZSBhcHBsaWVkCisgKgorICogQWRkIGEgUE9TSVggc3R5bGUgbG9jayB0byBhIGZpbGUuCisgKiBXZSBtZXJnZSBhZGphY2VudCAmIG92ZXJsYXBwaW5nIGxvY2tzIHdoZW5ldmVyIHBvc3NpYmxlLgorICogUE9TSVggbG9ja3MgYXJlIHNvcnRlZCBieSBvd25lciB0YXNrLCB0aGVuIGJ5IHN0YXJ0aW5nIGFkZHJlc3MKKyAqLworaW50IHBvc2l4X2xvY2tfZmlsZShzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJcmV0dXJuIF9fcG9zaXhfbG9ja19maWxlKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLCBmbCk7Cit9CisKKy8qKgorICogcG9zaXhfbG9ja19maWxlX3dhaXQgLSBBcHBseSBhIFBPU0lYLXN0eWxlIGxvY2sgdG8gYSBmaWxlCisgKiBAZmlscDogVGhlIGZpbGUgdG8gYXBwbHkgdGhlIGxvY2sgdG8KKyAqIEBmbDogVGhlIGxvY2sgdG8gYmUgYXBwbGllZAorICoKKyAqIEFkZCBhIFBPU0lYIHN0eWxlIGxvY2sgdG8gYSBmaWxlLgorICogV2UgbWVyZ2UgYWRqYWNlbnQgJiBvdmVybGFwcGluZyBsb2NrcyB3aGVuZXZlciBwb3NzaWJsZS4KKyAqIFBPU0lYIGxvY2tzIGFyZSBzb3J0ZWQgYnkgb3duZXIgdGFzaywgdGhlbiBieSBzdGFydGluZyBhZGRyZXNzCisgKi8KK2ludCBwb3NpeF9sb2NrX2ZpbGVfd2FpdChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJaW50IGVycm9yOworCW1pZ2h0X3NsZWVwICgpOworCWZvciAoOzspIHsKKwkJZXJyb3IgPSBfX3Bvc2l4X2xvY2tfZmlsZShmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSwgZmwpOworCQlpZiAoKGVycm9yICE9IC1FQUdBSU4pIHx8ICEoZmwtPmZsX2ZsYWdzICYgRkxfU0xFRVApKQorCQkJYnJlYWs7CisJCWVycm9yID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGZsLT5mbF93YWl0LCAhZmwtPmZsX25leHQpOworCQlpZiAoIWVycm9yKQorCQkJY29udGludWU7CisKKwkJbG9ja3NfZGVsZXRlX2Jsb2NrKGZsKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBlcnJvcjsKK30KK0VYUE9SVF9TWU1CT0wocG9zaXhfbG9ja19maWxlX3dhaXQpOworCisvKioKKyAqIGxvY2tzX21hbmRhdG9yeV9sb2NrZWQgLSBDaGVjayBmb3IgYW4gYWN0aXZlIGxvY2sKKyAqIEBpbm9kZTogdGhlIGZpbGUgdG8gY2hlY2sKKyAqCisgKiBTZWFyY2hlcyB0aGUgaW5vZGUncyBsaXN0IG9mIGxvY2tzIHRvIGZpbmQgYW55IFBPU0lYIGxvY2tzIHdoaWNoIGNvbmZsaWN0LgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBsb2Nrc192ZXJpZnlfbG9ja2VkKCkgb25seS4KKyAqLworaW50IGxvY2tzX21hbmRhdG9yeV9sb2NrZWQoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlmbF9vd25lcl90IG93bmVyID0gY3VycmVudC0+ZmlsZXM7CisJc3RydWN0IGZpbGVfbG9jayAqZmw7CisKKwkvKgorCSAqIFNlYXJjaCB0aGUgbG9jayBsaXN0IGZvciB0aGlzIGlub2RlIGZvciBhbnkgUE9TSVggbG9ja3MuCisJICovCisJbG9ja19rZXJuZWwoKTsKKwlmb3IgKGZsID0gaW5vZGUtPmlfZmxvY2s7IGZsICE9IE5VTEw7IGZsID0gZmwtPmZsX25leHQpIHsKKwkJaWYgKCFJU19QT1NJWChmbCkpCisJCQljb250aW51ZTsKKwkJaWYgKGZsLT5mbF9vd25lciAhPSBvd25lcikKKwkJCWJyZWFrOworCX0KKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGZsID8gLUVBR0FJTiA6IDA7Cit9CisKKy8qKgorICogbG9ja3NfbWFuZGF0b3J5X2FyZWEgLSBDaGVjayBmb3IgYSBjb25mbGljdGluZyBsb2NrCisgKiBAcmVhZF93cml0ZTogJUZMT0NLX1ZFUklGWV9XUklURSBmb3IgZXhjbHVzaXZlIGFjY2VzcywgJUZMT0NLX1ZFUklGWV9SRUFECisgKgkJZm9yIHNoYXJlZAorICogQGlub2RlOiAgICAgIHRoZSBmaWxlIHRvIGNoZWNrCisgKiBAZmlscDogICAgICAgaG93IHRoZSBmaWxlIHdhcyBvcGVuZWQgKGlmIGl0IHdhcykKKyAqIEBvZmZzZXQ6ICAgICBzdGFydCBvZiBhcmVhIHRvIGNoZWNrCisgKiBAY291bnQ6ICAgICAgbGVuZ3RoIG9mIGFyZWEgdG8gY2hlY2sKKyAqCisgKiBTZWFyY2hlcyB0aGUgaW5vZGUncyBsaXN0IG9mIGxvY2tzIHRvIGZpbmQgYW55IFBPU0lYIGxvY2tzIHdoaWNoIGNvbmZsaWN0LgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSByd192ZXJpZnlfYXJlYSgpIGFuZAorICogbG9ja3NfdmVyaWZ5X3RydW5jYXRlKCkuCisgKi8KK2ludCBsb2Nrc19tYW5kYXRvcnlfYXJlYShpbnQgcmVhZF93cml0ZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSBzdHJ1Y3QgZmlsZSAqZmlscCwgbG9mZl90IG9mZnNldCwKKwkJCSBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGZpbGVfbG9jayBmbDsKKwlpbnQgZXJyb3I7CisKKwlsb2Nrc19pbml0X2xvY2soJmZsKTsKKwlmbC5mbF9vd25lciA9IGN1cnJlbnQtPmZpbGVzOworCWZsLmZsX3BpZCA9IGN1cnJlbnQtPnRnaWQ7CisJZmwuZmxfZmlsZSA9IGZpbHA7CisJZmwuZmxfZmxhZ3MgPSBGTF9QT1NJWCB8IEZMX0FDQ0VTUzsKKwlpZiAoZmlscCAmJiAhKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkKKwkJZmwuZmxfZmxhZ3MgfD0gRkxfU0xFRVA7CisJZmwuZmxfdHlwZSA9IChyZWFkX3dyaXRlID09IEZMT0NLX1ZFUklGWV9XUklURSkgPyBGX1dSTENLIDogRl9SRExDSzsKKwlmbC5mbF9zdGFydCA9IG9mZnNldDsKKwlmbC5mbF9lbmQgPSBvZmZzZXQgKyBjb3VudCAtIDE7CisKKwlmb3IgKDs7KSB7CisJCWVycm9yID0gX19wb3NpeF9sb2NrX2ZpbGUoaW5vZGUsICZmbCk7CisJCWlmIChlcnJvciAhPSAtRUFHQUlOKQorCQkJYnJlYWs7CisJCWlmICghKGZsLmZsX2ZsYWdzICYgRkxfU0xFRVApKQorCQkJYnJlYWs7CisJCWVycm9yID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGZsLmZsX3dhaXQsICFmbC5mbF9uZXh0KTsKKwkJaWYgKCFlcnJvcikgeworCQkJLyoKKwkJCSAqIElmIHdlJ3ZlIGJlZW4gc2xlZXBpbmcgc29tZW9uZSBtaWdodCBoYXZlCisJCQkgKiBjaGFuZ2VkIHRoZSBwZXJtaXNzaW9ucyBiZWhpbmQgb3VyIGJhY2suCisJCQkgKi8KKwkJCWlmICgoaW5vZGUtPmlfbW9kZSAmIChTX0lTR0lEIHwgU19JWEdSUCkpID09IFNfSVNHSUQpCisJCQkJY29udGludWU7CisJCX0KKworCQlsb2Nrc19kZWxldGVfYmxvY2soJmZsKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGVycm9yOworfQorCitFWFBPUlRfU1lNQk9MKGxvY2tzX21hbmRhdG9yeV9hcmVhKTsKKworLyogV2UgYWxyZWFkeSBoYWQgYSBsZWFzZSBvbiB0aGlzIGZpbGU7IGp1c3QgY2hhbmdlIGl0cyB0eXBlICovCitpbnQgbGVhc2VfbW9kaWZ5KHN0cnVjdCBmaWxlX2xvY2sgKipiZWZvcmUsIGludCBhcmcpCit7CisJc3RydWN0IGZpbGVfbG9jayAqZmwgPSAqYmVmb3JlOworCWludCBlcnJvciA9IGFzc2lnbl90eXBlKGZsLCBhcmcpOworCisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJbG9ja3Nfd2FrZV91cF9ibG9ja3MoZmwpOworCWlmIChhcmcgPT0gRl9VTkxDSykKKwkJbG9ja3NfZGVsZXRlX2xvY2soYmVmb3JlKTsKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTChsZWFzZV9tb2RpZnkpOworCitzdGF0aWMgdm9pZCB0aW1lX291dF9sZWFzZXMoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgZmlsZV9sb2NrICoqYmVmb3JlOworCXN0cnVjdCBmaWxlX2xvY2sgKmZsOworCisJYmVmb3JlID0gJmlub2RlLT5pX2Zsb2NrOworCXdoaWxlICgoZmwgPSAqYmVmb3JlKSAmJiBJU19MRUFTRShmbCkgJiYgKGZsLT5mbF90eXBlICYgRl9JTlBST0dSRVNTKSkgeworCQlpZiAoKGZsLT5mbF9icmVha190aW1lID09IDApCisJCQkJfHwgdGltZV9iZWZvcmUoamlmZmllcywgZmwtPmZsX2JyZWFrX3RpbWUpKSB7CisJCQliZWZvcmUgPSAmZmwtPmZsX25leHQ7CisJCQljb250aW51ZTsKKwkJfQorCQlwcmludGsoS0VSTl9JTkZPICJsZWFzZSBicm9rZW4gLSBvd25lciBwaWQgPSAlZFxuIiwgZmwtPmZsX3BpZCk7CisJCWxlYXNlX21vZGlmeShiZWZvcmUsIGZsLT5mbF90eXBlICYgfkZfSU5QUk9HUkVTUyk7CisJCWlmIChmbCA9PSAqYmVmb3JlKQkvKiBsZWFzZV9tb2RpZnkgbWF5IGhhdmUgZnJlZWQgZmwgKi8KKwkJCWJlZm9yZSA9ICZmbC0+ZmxfbmV4dDsKKwl9Cit9CisKKy8qKgorICoJX19icmVha19sZWFzZQktCXJldm9rZSBhbGwgb3V0c3RhbmRpbmcgbGVhc2VzIG9uIGZpbGUKKyAqCUBpbm9kZTogdGhlIGlub2RlIG9mIHRoZSBmaWxlIHRvIHJldHVybgorICoJQG1vZGU6IHRoZSBvcGVuIG1vZGUgKHJlYWQgb3Igd3JpdGUpCisgKgorICoJYnJlYWtfbGVhc2UgKGlubGluZWQgZm9yIHNwZWVkKSBoYXMgY2hlY2tlZCB0aGVyZSBhbHJlYWR5CisgKglpcyBhIGxlYXNlIG9uIHRoaXMgZmlsZS4gIExlYXNlcyBhcmUgYnJva2VuIG9uIGEgY2FsbCB0byBvcGVuKCkKKyAqCW9yIHRydW5jYXRlKCkuICBUaGlzIGZ1bmN0aW9uIGNhbiBzbGVlcCB1bmxlc3MgeW91CisgKglzcGVjaWZpZWQgJU9fTk9OQkxPQ0sgdG8geW91ciBvcGVuKCkuCisgKi8KK2ludCBfX2JyZWFrX2xlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGludCBtb2RlKQoreworCWludCBlcnJvciA9IDAsIGZ1dHVyZTsKKwlzdHJ1Y3QgZmlsZV9sb2NrICpuZXdfZmwsICpmbG9jazsKKwlzdHJ1Y3QgZmlsZV9sb2NrICpmbDsKKwlpbnQgYWxsb2NfZXJyOworCXVuc2lnbmVkIGxvbmcgYnJlYWtfdGltZTsKKwlpbnQgaV9oYXZlX3RoaXNfbGVhc2UgPSAwOworCisJYWxsb2NfZXJyID0gbGVhc2VfYWxsb2MoTlVMTCwgbW9kZSAmIEZNT0RFX1dSSVRFID8gRl9XUkxDSyA6IEZfUkRMQ0ssCisJCQkmbmV3X2ZsKTsKKworCWxvY2tfa2VybmVsKCk7CisKKwl0aW1lX291dF9sZWFzZXMoaW5vZGUpOworCisJZmxvY2sgPSBpbm9kZS0+aV9mbG9jazsKKwlpZiAoKGZsb2NrID09IE5VTEwpIHx8ICFJU19MRUFTRShmbG9jaykpCisJCWdvdG8gb3V0OworCisJZm9yIChmbCA9IGZsb2NrOyBmbCAmJiBJU19MRUFTRShmbCk7IGZsID0gZmwtPmZsX25leHQpCisJCWlmIChmbC0+Zmxfb3duZXIgPT0gY3VycmVudC0+ZmlsZXMpCisJCQlpX2hhdmVfdGhpc19sZWFzZSA9IDE7CisKKwlpZiAobW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCS8qIElmIHdlIHdhbnQgd3JpdGUgYWNjZXNzLCB3ZSBoYXZlIHRvIHJldm9rZSBhbnkgbGVhc2UuICovCisJCWZ1dHVyZSA9IEZfVU5MQ0sgfCBGX0lOUFJPR1JFU1M7CisJfSBlbHNlIGlmIChmbG9jay0+ZmxfdHlwZSAmIEZfSU5QUk9HUkVTUykgeworCQkvKiBJZiB0aGUgbGVhc2UgaXMgYWxyZWFkeSBiZWluZyBicm9rZW4sIHdlIGp1c3QgbGVhdmUgaXQgKi8KKwkJZnV0dXJlID0gZmxvY2stPmZsX3R5cGU7CisJfSBlbHNlIGlmIChmbG9jay0+ZmxfdHlwZSAmIEZfV1JMQ0spIHsKKwkJLyogRG93bmdyYWRlIHRoZSBleGNsdXNpdmUgbGVhc2UgdG8gYSByZWFkLW9ubHkgbGVhc2UuICovCisJCWZ1dHVyZSA9IEZfUkRMQ0sgfCBGX0lOUFJPR1JFU1M7CisJfSBlbHNlIHsKKwkJLyogdGhlIGV4aXN0aW5nIGxlYXNlIHdhcyByZWFkLW9ubHksIHNvIHdlIGNhbiByZWFkIHRvby4gKi8KKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGFsbG9jX2VyciAmJiAhaV9oYXZlX3RoaXNfbGVhc2UgJiYgKChtb2RlICYgT19OT05CTE9DSykgPT0gMCkpIHsKKwkJZXJyb3IgPSBhbGxvY19lcnI7CisJCWdvdG8gb3V0OworCX0KKworCWJyZWFrX3RpbWUgPSAwOworCWlmIChsZWFzZV9icmVha190aW1lID4gMCkgeworCQlicmVha190aW1lID0gamlmZmllcyArIGxlYXNlX2JyZWFrX3RpbWUgKiBIWjsKKwkJaWYgKGJyZWFrX3RpbWUgPT0gMCkKKwkJCWJyZWFrX3RpbWUrKzsJLyogc28gdGhhdCAwIG1lYW5zIG5vIGJyZWFrIHRpbWUgKi8KKwl9CisKKwlmb3IgKGZsID0gZmxvY2s7IGZsICYmIElTX0xFQVNFKGZsKTsgZmwgPSBmbC0+ZmxfbmV4dCkgeworCQlpZiAoZmwtPmZsX3R5cGUgIT0gZnV0dXJlKSB7CisJCQlmbC0+ZmxfdHlwZSA9IGZ1dHVyZTsKKwkJCWZsLT5mbF9icmVha190aW1lID0gYnJlYWtfdGltZTsKKwkJCS8qIGxlYXNlIG11c3QgaGF2ZSBsbW9wcyBicmVhayBjYWxsYmFjayAqLworCQkJZmwtPmZsX2xtb3BzLT5mbF9icmVhayhmbCk7CisJCX0KKwl9CisKKwlpZiAoaV9oYXZlX3RoaXNfbGVhc2UgfHwgKG1vZGUgJiBPX05PTkJMT0NLKSkgeworCQllcnJvciA9IC1FV09VTERCTE9DSzsKKwkJZ290byBvdXQ7CisJfQorCityZXN0YXJ0OgorCWJyZWFrX3RpbWUgPSBmbG9jay0+ZmxfYnJlYWtfdGltZTsKKwlpZiAoYnJlYWtfdGltZSAhPSAwKSB7CisJCWJyZWFrX3RpbWUgLT0gamlmZmllczsKKwkJaWYgKGJyZWFrX3RpbWUgPT0gMCkKKwkJCWJyZWFrX3RpbWUrKzsKKwl9CisJZXJyb3IgPSBsb2Nrc19ibG9ja19vbl90aW1lb3V0KGZsb2NrLCBuZXdfZmwsIGJyZWFrX3RpbWUpOworCWlmIChlcnJvciA+PSAwKSB7CisJCWlmIChlcnJvciA9PSAwKQorCQkJdGltZV9vdXRfbGVhc2VzKGlub2RlKTsKKwkJLyogV2FpdCBmb3IgdGhlIG5leHQgbGVhc2UgdGhhdCBoYXMgbm90IGJlZW4gYnJva2VuIHlldCAqLworCQlmb3IgKGZsb2NrID0gaW5vZGUtPmlfZmxvY2s7IGZsb2NrICYmIElTX0xFQVNFKGZsb2NrKTsKKwkJCQlmbG9jayA9IGZsb2NrLT5mbF9uZXh0KSB7CisJCQlpZiAoZmxvY2stPmZsX3R5cGUgJiBGX0lOUFJPR1JFU1MpCisJCQkJZ290byByZXN0YXJ0OworCQl9CisJCWVycm9yID0gMDsKKwl9CisKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJaWYgKCFhbGxvY19lcnIpCisJCWxvY2tzX2ZyZWVfbG9jayhuZXdfZmwpOworCXJldHVybiBlcnJvcjsKK30KKworRVhQT1JUX1NZTUJPTChfX2JyZWFrX2xlYXNlKTsKKworLyoqCisgKglsZWFzZV9nZXRfbXRpbWUKKyAqCUBpbm9kZTogdGhlIGlub2RlCisgKiAgICAgIEB0aW1lOiAgcG9pbnRlciB0byBhIHRpbWVzcGVjIHdoaWNoIHdpbGwgY29udGFpbiB0aGUgbGFzdCBtb2RpZmllZCB0aW1lCisgKgorICogVGhpcyBpcyB0byBmb3JjZSBORlMgY2xpZW50cyB0byBmbHVzaCB0aGVpciBjYWNoZXMgZm9yIGZpbGVzIHdpdGgKKyAqIGV4Y2x1c2l2ZSBsZWFzZXMuICBUaGUganVzdGlmaWNhdGlvbiBpcyB0aGF0IGlmIHNvbWVvbmUgaGFzIGFuCisgKiBleGNsdXNpdmUgbGVhc2UsIHRoZW4gdGhleSBjb3VsZCBiZSBtb2RpZml5aW5nIGl0LgorICovCit2b2lkIGxlYXNlX2dldF9tdGltZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWUpCit7CisJc3RydWN0IGZpbGVfbG9jayAqZmxvY2sgPSBpbm9kZS0+aV9mbG9jazsKKwlpZiAoZmxvY2sgJiYgSVNfTEVBU0UoZmxvY2spICYmIChmbG9jay0+ZmxfdHlwZSAmIEZfV1JMQ0spKQorCQkqdGltZSA9IGN1cnJlbnRfZnNfdGltZShpbm9kZS0+aV9zYik7CisJZWxzZQorCQkqdGltZSA9IGlub2RlLT5pX210aW1lOworfQorCitFWFBPUlRfU1lNQk9MKGxlYXNlX2dldF9tdGltZSk7CisKKy8qKgorICoJZmNudGxfZ2V0bGVhc2UgLSBFbnF1aXJlIHdoYXQgbGVhc2UgaXMgY3VycmVudGx5IGFjdGl2ZQorICoJQGZpbHA6IHRoZSBmaWxlCisgKgorICoJVGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBvbmUgb2YKKyAqCShpZiBubyBsZWFzZSBicmVhayBpcyBwZW5kaW5nKToKKyAqCisgKgklRl9SRExDSyB0byBpbmRpY2F0ZSBhIHNoYXJlZCBsZWFzZSBpcyBoZWxkLgorICoKKyAqCSVGX1dSTENLIHRvIGluZGljYXRlIGFuIGV4Y2x1c2l2ZSBsZWFzZSBpcyBoZWxkLgorICoKKyAqCSVGX1VOTENLIHRvIGluZGljYXRlIG5vIGxlYXNlIGlzIGhlbGQuCisgKgorICoJKGlmIGEgbGVhc2UgYnJlYWsgaXMgcGVuZGluZyk6CisgKgorICoJJUZfUkRMQ0sgdG8gaW5kaWNhdGUgYW4gZXhjbHVzaXZlIGxlYXNlIG5lZWRzIHRvIGJlCisgKgkJY2hhbmdlZCB0byBhIHNoYXJlZCBsZWFzZSAob3IgcmVtb3ZlZCkuCisgKgorICoJJUZfVU5MQ0sgdG8gaW5kaWNhdGUgdGhlIGxlYXNlIG5lZWRzIHRvIGJlIHJlbW92ZWQuCisgKgorICoJWFhYOiBzZnIgJiB3aWxseSBkaXNhZ3JlZSBvdmVyIHdoZXRoZXIgRl9JTlBST0dSRVNTCisgKglzaG91bGQgYmUgcmV0dXJuZWQgdG8gdXNlcnNwYWNlLgorICovCitpbnQgZmNudGxfZ2V0bGVhc2Uoc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IGZpbGVfbG9jayAqZmw7CisJaW50IHR5cGUgPSBGX1VOTENLOworCisJbG9ja19rZXJuZWwoKTsKKwl0aW1lX291dF9sZWFzZXMoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpOworCWZvciAoZmwgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9mbG9jazsgZmwgJiYgSVNfTEVBU0UoZmwpOworCQkJZmwgPSBmbC0+ZmxfbmV4dCkgeworCQlpZiAoZmwtPmZsX2ZpbGUgPT0gZmlscCkgeworCQkJdHlwZSA9IGZsLT5mbF90eXBlICYgfkZfSU5QUk9HUkVTUzsKKwkJCWJyZWFrOworCQl9CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gdHlwZTsKK30KKworLyoqCisgKglfX3NldGxlYXNlCS0Jc2V0cyBhIGxlYXNlIG9uIGFuIG9wZW4gZmlsZQorICoJQGZpbHA6IGZpbGUgcG9pbnRlcgorICoJQGFyZzogdHlwZSBvZiBsZWFzZSB0byBvYnRhaW4KKyAqCUBmbHA6IGlucHV0IC0gZmlsZV9sb2NrIHRvIHVzZSwgb3V0cHV0IC0gZmlsZV9sb2NrIGluc2VydGVkCisgKgorICoJVGhlIChpbnB1dCkgZmxwLT5mbF9sbW9wcy0+ZmxfYnJlYWsgZnVuY3Rpb24gaXMgcmVxdWlyZWQKKyAqCWJ5IGJyZWFrX2xlYXNlKCkuCisgKgorICoJQ2FsbGVkIHdpdGgga2VybmVsIGxvY2sgaGVsZC4KKyAqLworaW50IF9fc2V0bGVhc2Uoc3RydWN0IGZpbGUgKmZpbHAsIGxvbmcgYXJnLCBzdHJ1Y3QgZmlsZV9sb2NrICoqZmxwKQoreworCXN0cnVjdCBmaWxlX2xvY2sgKmZsLCAqKmJlZm9yZSwgKipteV9iZWZvcmUgPSBOVUxMLCAqbGVhc2UgPSAqZmxwOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbHAtPmZfZGVudHJ5OworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IGVycm9yLCByZGxlYXNlX2NvdW50ID0gMCwgd3JsZWFzZV9jb3VudCA9IDA7CisKKwl0aW1lX291dF9sZWFzZXMoaW5vZGUpOworCisJZXJyb3IgPSAtRUlOVkFMOworCWlmICghZmxwIHx8ICEoKmZscCkgfHwgISgqZmxwKS0+ZmxfbG1vcHMgfHwgISgqZmxwKS0+ZmxfbG1vcHMtPmZsX2JyZWFrKQorCQlnb3RvIG91dDsKKworCWVycm9yID0gLUVBR0FJTjsKKwlpZiAoKGFyZyA9PSBGX1JETENLKSAmJiAoYXRvbWljX3JlYWQoJmlub2RlLT5pX3dyaXRlY291bnQpID4gMCkpCisJCWdvdG8gb3V0OworCWlmICgoYXJnID09IEZfV1JMQ0spCisJICAgICYmICgoYXRvbWljX3JlYWQoJmRlbnRyeS0+ZF9jb3VudCkgPiAxKQorCQl8fCAoYXRvbWljX3JlYWQoJmlub2RlLT5pX2NvdW50KSA+IDEpKSkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQsIHdlIGtub3cgdGhhdCBpZiB0aGVyZSBpcyBhbiBleGNsdXNpdmUKKwkgKiBsZWFzZSBvbiB0aGlzIGZpbGUsIHRoZW4gd2UgaG9sZCBpdCBvbiB0aGlzIGZpbHAKKwkgKiAob3RoZXJ3aXNlIG91ciBvcGVuIG9mIHRoaXMgZmlsZSB3b3VsZCBoYXZlIGJsb2NrZWQpLgorCSAqIEFuZCBpZiB3ZSBhcmUgdHJ5aW5nIHRvIGFjcXVpcmUgYW4gZXhjbHVzaXZlIGxlYXNlLAorCSAqIHRoZW4gdGhlIGZpbGUgaXMgbm90IG9wZW4gYnkgYW55b25lIChpbmNsdWRpbmcgdXMpCisJICogZXhjZXB0IGZvciB0aGlzIGZpbHAuCisJICovCisJZm9yIChiZWZvcmUgPSAmaW5vZGUtPmlfZmxvY2s7CisJCQkoKGZsID0gKmJlZm9yZSkgIT0gTlVMTCkgJiYgSVNfTEVBU0UoZmwpOworCQkJYmVmb3JlID0gJmZsLT5mbF9uZXh0KSB7CisJCWlmIChsZWFzZS0+ZmxfbG1vcHMtPmZsX215bGVhc2UoZmwsIGxlYXNlKSkKKwkJCW15X2JlZm9yZSA9IGJlZm9yZTsKKwkJZWxzZSBpZiAoZmwtPmZsX3R5cGUgPT0gKEZfSU5QUk9HUkVTUyB8IEZfVU5MQ0spKQorCQkJLyoKKwkJCSAqIFNvbWVvbmUgaXMgaW4gdGhlIHByb2Nlc3Mgb2Ygb3BlbmluZyB0aGlzCisJCQkgKiBmaWxlIGZvciB3cml0aW5nIHNvIHdlIG1heSBub3QgdGFrZSBhbgorCQkJICogZXhjbHVzaXZlIGxlYXNlIG9uIGl0LgorCQkJICovCisJCQl3cmxlYXNlX2NvdW50Kys7CisJCWVsc2UKKwkJCXJkbGVhc2VfY291bnQrKzsKKwl9CisKKwlpZiAoKGFyZyA9PSBGX1JETENLICYmICh3cmxlYXNlX2NvdW50ID4gMCkpIHx8CisJICAgIChhcmcgPT0gRl9XUkxDSyAmJiAoKHJkbGVhc2VfY291bnQgKyB3cmxlYXNlX2NvdW50KSA+IDApKSkKKwkJZ290byBvdXQ7CisKKwlpZiAobXlfYmVmb3JlICE9IE5VTEwpIHsKKwkJZXJyb3IgPSBsZWFzZS0+ZmxfbG1vcHMtPmZsX2NoYW5nZShteV9iZWZvcmUsIGFyZyk7CisJCWdvdG8gb3V0OworCX0KKworCWVycm9yID0gMDsKKwlpZiAoYXJnID09IEZfVU5MQ0spCisJCWdvdG8gb3V0OworCisJZXJyb3IgPSAtRUlOVkFMOworCWlmICghbGVhc2VzX2VuYWJsZSkKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IGxlYXNlX2FsbG9jKGZpbHAsIGFyZywgJmZsKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCisJbG9ja3NfY29weV9sb2NrKGZsLCBsZWFzZSk7CisKKwlsb2Nrc19pbnNlcnRfbG9jayhiZWZvcmUsIGZsKTsKKworCSpmbHAgPSBmbDsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKKyAvKioKKyAqCXNldGxlYXNlICAgICAgICAtICAgICAgIHNldHMgYSBsZWFzZSBvbiBhbiBvcGVuIGZpbGUKKyAqCUBmaWxwOiBmaWxlIHBvaW50ZXIKKyAqCUBhcmc6IHR5cGUgb2YgbGVhc2UgdG8gb2J0YWluCisgKglAbGVhc2U6IGZpbGVfbG9jayB0byB1c2UKKyAqCisgKglDYWxsIHRoaXMgdG8gZXN0YWJsaXNoIGEgbGVhc2Ugb24gdGhlIGZpbGUuCisgKglUaGUgZmxfbG1vcHMgZmxfYnJlYWsgZnVuY3Rpb24gaXMgcmVxdWlyZWQgYnkgYnJlYWtfbGVhc2UKKyAqLworCitpbnQgc2V0bGVhc2Uoc3RydWN0IGZpbGUgKmZpbHAsIGxvbmcgYXJnLCBzdHJ1Y3QgZmlsZV9sb2NrICoqbGVhc2UpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlscC0+Zl9kZW50cnk7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgZXJyb3I7CisKKwlpZiAoKGN1cnJlbnQtPmZzdWlkICE9IGlub2RlLT5pX3VpZCkgJiYgIWNhcGFibGUoQ0FQX0xFQVNFKSkKKwkJcmV0dXJuIC1FQUNDRVM7CisJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwllcnJvciA9IHNlY3VyaXR5X2ZpbGVfbG9jayhmaWxwLCBhcmcpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJbG9ja19rZXJuZWwoKTsKKwllcnJvciA9IF9fc2V0bGVhc2UoZmlscCwgYXJnLCBsZWFzZSk7CisJdW5sb2NrX2tlcm5lbCgpOworCisJcmV0dXJuIGVycm9yOworfQorCitFWFBPUlRfU1lNQk9MKHNldGxlYXNlKTsKKworLyoqCisgKglmY250bF9zZXRsZWFzZQktCXNldHMgYSBsZWFzZSBvbiBhbiBvcGVuIGZpbGUKKyAqCUBmZDogb3BlbiBmaWxlIGRlc2NyaXB0b3IKKyAqCUBmaWxwOiBmaWxlIHBvaW50ZXIKKyAqCUBhcmc6IHR5cGUgb2YgbGVhc2UgdG8gb2J0YWluCisgKgorICoJQ2FsbCB0aGlzIGZjbnRsIHRvIGVzdGFibGlzaCBhIGxlYXNlIG9uIHRoZSBmaWxlLgorICoJTm90ZSB0aGF0IHlvdSBhbHNvIG5lZWQgdG8gY2FsbCAlRl9TRVRTSUcgdG8KKyAqCXJlY2VpdmUgYSBzaWduYWwgd2hlbiB0aGUgbGVhc2UgaXMgYnJva2VuLgorICovCitpbnQgZmNudGxfc2V0bGVhc2UodW5zaWduZWQgaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlscCwgbG9uZyBhcmcpCit7CisJc3RydWN0IGZpbGVfbG9jayBmbCwgKmZscCA9ICZmbDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxwLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludCBlcnJvcjsKKworCWlmICgoY3VycmVudC0+ZnN1aWQgIT0gaW5vZGUtPmlfdWlkKSAmJiAhY2FwYWJsZShDQVBfTEVBU0UpKQorCQlyZXR1cm4gLUVBQ0NFUzsKKwlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiAtRUlOVkFMOworCWVycm9yID0gc2VjdXJpdHlfZmlsZV9sb2NrKGZpbHAsIGFyZyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlsb2Nrc19pbml0X2xvY2soJmZsKTsKKwllcnJvciA9IGxlYXNlX2luaXQoZmlscCwgYXJnLCAmZmwpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJbG9ja19rZXJuZWwoKTsKKworCWVycm9yID0gX19zZXRsZWFzZShmaWxwLCBhcmcsICZmbHApOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfdW5sb2NrOworCisJZXJyb3IgPSBmYXN5bmNfaGVscGVyKGZkLCBmaWxwLCAxLCAmZmxwLT5mbF9mYXN5bmMpOworCWlmIChlcnJvciA8IDApIHsKKwkJLyogcmVtb3ZlIGxlYXNlIGp1c3QgaW5zZXJ0ZWQgYnkgX19zZXRsZWFzZSAqLworCQlmbHAtPmZsX3R5cGUgPSBGX1VOTENLIHwgRl9JTlBST0dSRVNTOworCQlmbHAtPmZsX2JyZWFrX3RpbWUgPSBqaWZmaWVzLSAxMDsKKwkJdGltZV9vdXRfbGVhc2VzKGlub2RlKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWVycm9yID0gZl9zZXRvd24oZmlscCwgY3VycmVudC0+cGlkLCAwKTsKK291dF91bmxvY2s6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKiBmbG9ja19sb2NrX2ZpbGVfd2FpdCAtIEFwcGx5IGEgRkxPQ0stc3R5bGUgbG9jayB0byBhIGZpbGUKKyAqIEBmaWxwOiBUaGUgZmlsZSB0byBhcHBseSB0aGUgbG9jayB0bworICogQGZsOiBUaGUgbG9jayB0byBiZSBhcHBsaWVkCisgKgorICogQWRkIGEgRkxPQ0sgc3R5bGUgbG9jayB0byBhIGZpbGUuCisgKi8KK2ludCBmbG9ja19sb2NrX2ZpbGVfd2FpdChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJaW50IGVycm9yOworCW1pZ2h0X3NsZWVwKCk7CisJZm9yICg7OykgeworCQllcnJvciA9IGZsb2NrX2xvY2tfZmlsZShmaWxwLCBmbCk7CisJCWlmICgoZXJyb3IgIT0gLUVBR0FJTikgfHwgIShmbC0+ZmxfZmxhZ3MgJiBGTF9TTEVFUCkpCisJCQlicmVhazsKKwkJZXJyb3IgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZmwtPmZsX3dhaXQsICFmbC0+ZmxfbmV4dCk7CisJCWlmICghZXJyb3IpCisJCQljb250aW51ZTsKKworCQlsb2Nrc19kZWxldGVfYmxvY2soZmwpOworCQlicmVhazsKKwl9CisJcmV0dXJuIGVycm9yOworfQorCitFWFBPUlRfU1lNQk9MKGZsb2NrX2xvY2tfZmlsZV93YWl0KTsKKworLyoqCisgKglzeXNfZmxvY2s6IC0gZmxvY2soKSBzeXN0ZW0gY2FsbC4KKyAqCUBmZDogdGhlIGZpbGUgZGVzY3JpcHRvciB0byBsb2NrLgorICoJQGNtZDogdGhlIHR5cGUgb2YgbG9jayB0byBhcHBseS4KKyAqCisgKglBcHBseSBhICVGTF9GTE9DSyBzdHlsZSBsb2NrIHRvIGFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yLgorICoJVGhlIEBjbWQgY2FuIGJlIG9uZSBvZgorICoKKyAqCSVMT0NLX1NIIC0tIGEgc2hhcmVkIGxvY2suCisgKgorICoJJUxPQ0tfRVggLS0gYW4gZXhjbHVzaXZlIGxvY2suCisgKgorICoJJUxPQ0tfVU4gLS0gcmVtb3ZlIGFuIGV4aXN0aW5nIGxvY2suCisgKgorICoJJUxPQ0tfTUFORCAtLSBhIGBtYW5kYXRvcnknIGZsb2NrLiAgVGhpcyBleGlzdHMgdG8gZW11bGF0ZSBXaW5kb3dzIFNoYXJlIE1vZGVzLgorICoKKyAqCSVMT0NLX01BTkQgY2FuIGJlIGNvbWJpbmVkIHdpdGggJUxPQ0tfUkVBRCBvciAlTE9DS19XUklURSB0byBhbGxvdyBvdGhlcgorICoJcHJvY2Vzc2VzIHJlYWQgYW5kIHdyaXRlIGFjY2VzcyByZXNwZWN0aXZlbHkuCisgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfZmxvY2sodW5zaWduZWQgaW50IGZkLCB1bnNpZ25lZCBpbnQgY21kKQoreworCXN0cnVjdCBmaWxlICpmaWxwOworCXN0cnVjdCBmaWxlX2xvY2sgKmxvY2s7CisJaW50IGNhbl9zbGVlcCwgdW5sb2NrOworCWludCBlcnJvcjsKKworCWVycm9yID0gLUVCQURGOworCWZpbHAgPSBmZ2V0KGZkKTsKKwlpZiAoIWZpbHApCisJCWdvdG8gb3V0OworCisJY2FuX3NsZWVwID0gIShjbWQgJiBMT0NLX05CKTsKKwljbWQgJj0gfkxPQ0tfTkI7CisJdW5sb2NrID0gKGNtZCA9PSBMT0NLX1VOKTsKKworCWlmICghdW5sb2NrICYmICEoY21kICYgTE9DS19NQU5EKSAmJiAhKGZpbHAtPmZfbW9kZSAmIDMpKQorCQlnb3RvIG91dF9wdXRmOworCisJZXJyb3IgPSBmbG9ja19tYWtlX2xvY2soZmlscCwgJmxvY2ssIGNtZCk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dF9wdXRmOworCWlmIChjYW5fc2xlZXApCisJCWxvY2stPmZsX2ZsYWdzIHw9IEZMX1NMRUVQOworCisJZXJyb3IgPSBzZWN1cml0eV9maWxlX2xvY2soZmlscCwgY21kKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlpZiAoZmlscC0+Zl9vcCAmJiBmaWxwLT5mX29wLT5mbG9jaykKKwkJZXJyb3IgPSBmaWxwLT5mX29wLT5mbG9jayhmaWxwLAorCQkJCQkgIChjYW5fc2xlZXApID8gRl9TRVRMS1cgOiBGX1NFVExLLAorCQkJCQkgIGxvY2spOworCWVsc2UKKwkJZXJyb3IgPSBmbG9ja19sb2NrX2ZpbGVfd2FpdChmaWxwLCBsb2NrKTsKKworIG91dF9mcmVlOgorCWlmIChsaXN0X2VtcHR5KCZsb2NrLT5mbF9saW5rKSkgeworCQlsb2Nrc19mcmVlX2xvY2sobG9jayk7CisJfQorCisgb3V0X3B1dGY6CisJZnB1dChmaWxwKTsKKyBvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCisvKiBSZXBvcnQgdGhlIGZpcnN0IGV4aXN0aW5nIGxvY2sgdGhhdCB3b3VsZCBjb25mbGljdCB3aXRoIGwuCisgKiBUaGlzIGltcGxlbWVudHMgdGhlIEZfR0VUTEsgY29tbWFuZCBvZiBmY250bCgpLgorICovCitpbnQgZmNudGxfZ2V0bGsoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBmbG9jayBfX3VzZXIgKmwpCit7CisJc3RydWN0IGZpbGVfbG9jayAqZmwsIGZpbGVfbG9jazsKKwlzdHJ1Y3QgZmxvY2sgZmxvY2s7CisJaW50IGVycm9yOworCisJZXJyb3IgPSAtRUZBVUxUOworCWlmIChjb3B5X2Zyb21fdXNlcigmZmxvY2ssIGwsIHNpemVvZihmbG9jaykpKQorCQlnb3RvIG91dDsKKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKChmbG9jay5sX3R5cGUgIT0gRl9SRExDSykgJiYgKGZsb2NrLmxfdHlwZSAhPSBGX1dSTENLKSkKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IGZsb2NrX3RvX3Bvc2l4X2xvY2soZmlscCwgJmZpbGVfbG9jaywgJmZsb2NrKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCisJaWYgKGZpbHAtPmZfb3AgJiYgZmlscC0+Zl9vcC0+bG9jaykgeworCQllcnJvciA9IGZpbHAtPmZfb3AtPmxvY2soZmlscCwgRl9HRVRMSywgJmZpbGVfbG9jayk7CisJCWlmIChlcnJvciA8IDApCisJCQlnb3RvIG91dDsKKwkJZWxzZQorCQkgIGZsID0gKGZpbGVfbG9jay5mbF90eXBlID09IEZfVU5MQ0sgPyBOVUxMIDogJmZpbGVfbG9jayk7CisJfSBlbHNlIHsKKwkJZmwgPSBwb3NpeF90ZXN0X2xvY2soZmlscCwgJmZpbGVfbG9jayk7CisJfQorIAorCWZsb2NrLmxfdHlwZSA9IEZfVU5MQ0s7CisJaWYgKGZsICE9IE5VTEwpIHsKKwkJZmxvY2subF9waWQgPSBmbC0+ZmxfcGlkOworI2lmIEJJVFNfUEVSX0xPTkcgPT0gMzIKKwkJLyoKKwkJICogTWFrZSBzdXJlIHdlIGNhbiByZXByZXNlbnQgdGhlIHBvc2l4IGxvY2sgdmlhCisJCSAqIGxlZ2FjeSAzMmJpdCBmbG9jay4KKwkJICovCisJCWVycm9yID0gLUVPVkVSRkxPVzsKKwkJaWYgKGZsLT5mbF9zdGFydCA+IE9GRlRfT0ZGU0VUX01BWCkKKwkJCWdvdG8gb3V0OworCQlpZiAoKGZsLT5mbF9lbmQgIT0gT0ZGU0VUX01BWCkKKwkJICAgICYmIChmbC0+ZmxfZW5kID4gT0ZGVF9PRkZTRVRfTUFYKSkKKwkJCWdvdG8gb3V0OworI2VuZGlmCisJCWZsb2NrLmxfc3RhcnQgPSBmbC0+Zmxfc3RhcnQ7CisJCWZsb2NrLmxfbGVuID0gZmwtPmZsX2VuZCA9PSBPRkZTRVRfTUFYID8gMCA6CisJCQlmbC0+ZmxfZW5kIC0gZmwtPmZsX3N0YXJ0ICsgMTsKKwkJZmxvY2subF93aGVuY2UgPSAwOworCQlmbG9jay5sX3R5cGUgPSBmbC0+ZmxfdHlwZTsKKwl9CisJZXJyb3IgPSAtRUZBVUxUOworCWlmICghY29weV90b191c2VyKGwsICZmbG9jaywgc2l6ZW9mKGZsb2NrKSkpCisJCWVycm9yID0gMDsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qIEFwcGx5IHRoZSBsb2NrIGRlc2NyaWJlZCBieSBsIHRvIGFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yLgorICogVGhpcyBpbXBsZW1lbnRzIGJvdGggdGhlIEZfU0VUTEsgYW5kIEZfU0VUTEtXIGNvbW1hbmRzIG9mIGZjbnRsKCkuCisgKi8KK2ludCBmY250bF9zZXRsayhzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgc3RydWN0IGZsb2NrIF9fdXNlciAqbCkKK3sKKwlzdHJ1Y3QgZmlsZV9sb2NrICpmaWxlX2xvY2sgPSBsb2Nrc19hbGxvY19sb2NrKCk7CisJc3RydWN0IGZsb2NrIGZsb2NrOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IGVycm9yOworCisJaWYgKGZpbGVfbG9jayA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0xDSzsKKworCS8qCisJICogVGhpcyBtaWdodCBibG9jaywgc28gd2UgZG8gaXQgYmVmb3JlIGNoZWNraW5nIHRoZSBpbm9kZS4KKwkgKi8KKwllcnJvciA9IC1FRkFVTFQ7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZmbG9jaywgbCwgc2l6ZW9mKGZsb2NrKSkpCisJCWdvdG8gb3V0OworCisJaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKworCS8qIERvbid0IGFsbG93IG1hbmRhdG9yeSBsb2NrcyBvbiBmaWxlcyB0aGF0IG1heSBiZSBtZW1vcnkgbWFwcGVkCisJICogYW5kIHNoYXJlZC4KKwkgKi8KKwlpZiAoSVNfTUFORExPQ0soaW5vZGUpICYmCisJICAgIChpbm9kZS0+aV9tb2RlICYgKFNfSVNHSUQgfCBTX0lYR1JQKSkgPT0gU19JU0dJRCAmJgorCSAgICBtYXBwaW5nX3dyaXRhYmx5X21hcHBlZChmaWxwLT5mX21hcHBpbmcpKSB7CisJCWVycm9yID0gLUVBR0FJTjsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyb3IgPSBmbG9ja190b19wb3NpeF9sb2NrKGZpbHAsIGZpbGVfbG9jaywgJmZsb2NrKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCWlmIChjbWQgPT0gRl9TRVRMS1cpIHsKKwkJZmlsZV9sb2NrLT5mbF9mbGFncyB8PSBGTF9TTEVFUDsKKwl9CisJCisJZXJyb3IgPSAtRUJBREY7CisJc3dpdGNoIChmbG9jay5sX3R5cGUpIHsKKwljYXNlIEZfUkRMQ0s6CisJCWlmICghKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQkJZ290byBvdXQ7CisJCWJyZWFrOworCWNhc2UgRl9XUkxDSzoKKwkJaWYgKCEoZmlscC0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJZ290byBvdXQ7CisJCWJyZWFrOworCWNhc2UgRl9VTkxDSzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwllcnJvciA9IHNlY3VyaXR5X2ZpbGVfbG9jayhmaWxwLCBmaWxlX2xvY2stPmZsX3R5cGUpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisKKwlpZiAoZmlscC0+Zl9vcCAmJiBmaWxwLT5mX29wLT5sb2NrICE9IE5VTEwpIHsKKwkJZXJyb3IgPSBmaWxwLT5mX29wLT5sb2NrKGZpbHAsIGNtZCwgZmlsZV9sb2NrKTsKKwkJZ290byBvdXQ7CisJfQorCisJZm9yICg7OykgeworCQllcnJvciA9IF9fcG9zaXhfbG9ja19maWxlKGlub2RlLCBmaWxlX2xvY2spOworCQlpZiAoKGVycm9yICE9IC1FQUdBSU4pIHx8IChjbWQgPT0gRl9TRVRMSykpCisJCQlicmVhazsKKwkJZXJyb3IgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZmlsZV9sb2NrLT5mbF93YWl0LAorCQkJCSFmaWxlX2xvY2stPmZsX25leHQpOworCQlpZiAoIWVycm9yKQorCQkJY29udGludWU7CisKKwkJbG9ja3NfZGVsZXRlX2Jsb2NrKGZpbGVfbG9jayk7CisJCWJyZWFrOworCX0KKworIG91dDoKKwlsb2Nrc19mcmVlX2xvY2soZmlsZV9sb2NrKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKyNpZiBCSVRTX1BFUl9MT05HID09IDMyCisvKiBSZXBvcnQgdGhlIGZpcnN0IGV4aXN0aW5nIGxvY2sgdGhhdCB3b3VsZCBjb25mbGljdCB3aXRoIGwuCisgKiBUaGlzIGltcGxlbWVudHMgdGhlIEZfR0VUTEsgY29tbWFuZCBvZiBmY250bCgpLgorICovCitpbnQgZmNudGxfZ2V0bGs2NChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGZsb2NrNjQgX191c2VyICpsKQoreworCXN0cnVjdCBmaWxlX2xvY2sgKmZsLCBmaWxlX2xvY2s7CisJc3RydWN0IGZsb2NrNjQgZmxvY2s7CisJaW50IGVycm9yOworCisJZXJyb3IgPSAtRUZBVUxUOworCWlmIChjb3B5X2Zyb21fdXNlcigmZmxvY2ssIGwsIHNpemVvZihmbG9jaykpKQorCQlnb3RvIG91dDsKKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKChmbG9jay5sX3R5cGUgIT0gRl9SRExDSykgJiYgKGZsb2NrLmxfdHlwZSAhPSBGX1dSTENLKSkKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IGZsb2NrNjRfdG9fcG9zaXhfbG9jayhmaWxwLCAmZmlsZV9sb2NrLCAmZmxvY2spOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisKKwlpZiAoZmlscC0+Zl9vcCAmJiBmaWxwLT5mX29wLT5sb2NrKSB7CisJCWVycm9yID0gZmlscC0+Zl9vcC0+bG9jayhmaWxwLCBGX0dFVExLLCAmZmlsZV9sb2NrKTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCWdvdG8gb3V0OworCQllbHNlCisJCSAgZmwgPSAoZmlsZV9sb2NrLmZsX3R5cGUgPT0gRl9VTkxDSyA/IE5VTEwgOiAmZmlsZV9sb2NrKTsKKwl9IGVsc2UgeworCQlmbCA9IHBvc2l4X3Rlc3RfbG9jayhmaWxwLCAmZmlsZV9sb2NrKTsKKwl9CisgCisJZmxvY2subF90eXBlID0gRl9VTkxDSzsKKwlpZiAoZmwgIT0gTlVMTCkgeworCQlmbG9jay5sX3BpZCA9IGZsLT5mbF9waWQ7CisJCWZsb2NrLmxfc3RhcnQgPSBmbC0+Zmxfc3RhcnQ7CisJCWZsb2NrLmxfbGVuID0gZmwtPmZsX2VuZCA9PSBPRkZTRVRfTUFYID8gMCA6CisJCQlmbC0+ZmxfZW5kIC0gZmwtPmZsX3N0YXJ0ICsgMTsKKwkJZmxvY2subF93aGVuY2UgPSAwOworCQlmbG9jay5sX3R5cGUgPSBmbC0+ZmxfdHlwZTsKKwl9CisJZXJyb3IgPSAtRUZBVUxUOworCWlmICghY29weV90b191c2VyKGwsICZmbG9jaywgc2l6ZW9mKGZsb2NrKSkpCisJCWVycm9yID0gMDsKKyAgCitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCisvKiBBcHBseSB0aGUgbG9jayBkZXNjcmliZWQgYnkgbCB0byBhbiBvcGVuIGZpbGUgZGVzY3JpcHRvci4KKyAqIFRoaXMgaW1wbGVtZW50cyBib3RoIHRoZSBGX1NFVExLIGFuZCBGX1NFVExLVyBjb21tYW5kcyBvZiBmY250bCgpLgorICovCitpbnQgZmNudGxfc2V0bGs2NChzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwgc3RydWN0IGZsb2NrNjQgX191c2VyICpsKQoreworCXN0cnVjdCBmaWxlX2xvY2sgKmZpbGVfbG9jayA9IGxvY2tzX2FsbG9jX2xvY2soKTsKKwlzdHJ1Y3QgZmxvY2s2NCBmbG9jazsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWludCBlcnJvcjsKKworCWlmIChmaWxlX2xvY2sgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9MQ0s7CisKKwkvKgorCSAqIFRoaXMgbWlnaHQgYmxvY2ssIHNvIHdlIGRvIGl0IGJlZm9yZSBjaGVja2luZyB0aGUgaW5vZGUuCisJICovCisJZXJyb3IgPSAtRUZBVUxUOworCWlmIChjb3B5X2Zyb21fdXNlcigmZmxvY2ssIGwsIHNpemVvZihmbG9jaykpKQorCQlnb3RvIG91dDsKKworCWlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisKKwkvKiBEb24ndCBhbGxvdyBtYW5kYXRvcnkgbG9ja3Mgb24gZmlsZXMgdGhhdCBtYXkgYmUgbWVtb3J5IG1hcHBlZAorCSAqIGFuZCBzaGFyZWQuCisJICovCisJaWYgKElTX01BTkRMT0NLKGlub2RlKSAmJgorCSAgICAoaW5vZGUtPmlfbW9kZSAmIChTX0lTR0lEIHwgU19JWEdSUCkpID09IFNfSVNHSUQgJiYKKwkgICAgbWFwcGluZ193cml0YWJseV9tYXBwZWQoZmlscC0+Zl9tYXBwaW5nKSkgeworCQllcnJvciA9IC1FQUdBSU47CisJCWdvdG8gb3V0OworCX0KKworCWVycm9yID0gZmxvY2s2NF90b19wb3NpeF9sb2NrKGZpbHAsIGZpbGVfbG9jaywgJmZsb2NrKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCWlmIChjbWQgPT0gRl9TRVRMS1c2NCkgeworCQlmaWxlX2xvY2stPmZsX2ZsYWdzIHw9IEZMX1NMRUVQOworCX0KKwkKKwllcnJvciA9IC1FQkFERjsKKwlzd2l0Y2ggKGZsb2NrLmxfdHlwZSkgeworCWNhc2UgRl9SRExDSzoKKwkJaWYgKCEoZmlscC0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCQlnb3RvIG91dDsKKwkJYnJlYWs7CisJY2FzZSBGX1dSTENLOgorCQlpZiAoIShmaWxwLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlnb3RvIG91dDsKKwkJYnJlYWs7CisJY2FzZSBGX1VOTENLOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWVycm9yID0gc2VjdXJpdHlfZmlsZV9sb2NrKGZpbHAsIGZpbGVfbG9jay0+ZmxfdHlwZSk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKworCWlmIChmaWxwLT5mX29wICYmIGZpbHAtPmZfb3AtPmxvY2sgIT0gTlVMTCkgeworCQllcnJvciA9IGZpbHAtPmZfb3AtPmxvY2soZmlscCwgY21kLCBmaWxlX2xvY2spOworCQlnb3RvIG91dDsKKwl9CisKKwlmb3IgKDs7KSB7CisJCWVycm9yID0gX19wb3NpeF9sb2NrX2ZpbGUoaW5vZGUsIGZpbGVfbG9jayk7CisJCWlmICgoZXJyb3IgIT0gLUVBR0FJTikgfHwgKGNtZCA9PSBGX1NFVExLNjQpKQorCQkJYnJlYWs7CisJCWVycm9yID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGZpbGVfbG9jay0+Zmxfd2FpdCwKKwkJCQkhZmlsZV9sb2NrLT5mbF9uZXh0KTsKKwkJaWYgKCFlcnJvcikKKwkJCWNvbnRpbnVlOworCisJCWxvY2tzX2RlbGV0ZV9ibG9jayhmaWxlX2xvY2spOworCQlicmVhazsKKwl9CisKK291dDoKKwlsb2Nrc19mcmVlX2xvY2soZmlsZV9sb2NrKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisjZW5kaWYgLyogQklUU19QRVJfTE9ORyA9PSAzMiAqLworCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgZmlsZSBpcyBiZWluZyByZW1vdmVkCisgKiBmcm9tIHRoZSB0YXNrJ3MgZmQgYXJyYXkuICBQT1NJWCBsb2NrcyBiZWxvbmdpbmcgdG8gdGhpcyB0YXNrCisgKiBhcmUgZGVsZXRlZCBhdCB0aGlzIHRpbWUuCisgKi8KK3ZvaWQgbG9ja3NfcmVtb3ZlX3Bvc2l4KHN0cnVjdCBmaWxlICpmaWxwLCBmbF9vd25lcl90IG93bmVyKQoreworCXN0cnVjdCBmaWxlX2xvY2sgbG9jaywgKipiZWZvcmU7CisKKwkvKgorCSAqIElmIHRoZXJlIGFyZSBubyBsb2NrcyBoZWxkIG9uIHRoaXMgZmlsZSwgd2UgZG9uJ3QgbmVlZCB0byBjYWxsCisJICogcG9zaXhfbG9ja19maWxlKCkuICBBbm90aGVyIHByb2Nlc3MgY291bGQgYmUgc2V0dGluZyBhIGxvY2sgb24gdGhpcworCSAqIGZpbGUgYXQgdGhlIHNhbWUgdGltZSwgYnV0IHdlIHdvdWxkbid0IHJlbW92ZSB0aGF0IGxvY2sgYW55d2F5LgorCSAqLworCWJlZm9yZSA9ICZmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9mbG9jazsKKwlpZiAoKmJlZm9yZSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlsb2NrLmZsX3R5cGUgPSBGX1VOTENLOworCWxvY2suZmxfZmxhZ3MgPSBGTF9QT1NJWDsKKwlsb2NrLmZsX3N0YXJ0ID0gMDsKKwlsb2NrLmZsX2VuZCA9IE9GRlNFVF9NQVg7CisJbG9jay5mbF9vd25lciA9IG93bmVyOworCWxvY2suZmxfcGlkID0gY3VycmVudC0+dGdpZDsKKwlsb2NrLmZsX2ZpbGUgPSBmaWxwOworCWxvY2suZmxfb3BzID0gTlVMTDsKKwlsb2NrLmZsX2xtb3BzID0gTlVMTDsKKworCWlmIChmaWxwLT5mX29wICYmIGZpbHAtPmZfb3AtPmxvY2sgIT0gTlVMTCkgeworCQlmaWxwLT5mX29wLT5sb2NrKGZpbHAsIEZfU0VUTEssICZsb2NrKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogQ2FuJ3QgdXNlIHBvc2l4X2xvY2tfZmlsZSBoZXJlOyB3ZSBuZWVkIHRvIHJlbW92ZSBpdCBubyBtYXR0ZXIKKwkgKiB3aGljaCBwaWQgd2UgaGF2ZS4KKwkgKi8KKwlsb2NrX2tlcm5lbCgpOworCXdoaWxlICgqYmVmb3JlICE9IE5VTEwpIHsKKwkJc3RydWN0IGZpbGVfbG9jayAqZmwgPSAqYmVmb3JlOworCQlpZiAoSVNfUE9TSVgoZmwpICYmIHBvc2l4X3NhbWVfb3duZXIoZmwsICZsb2NrKSkgeworCQkJbG9ja3NfZGVsZXRlX2xvY2soYmVmb3JlKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWJlZm9yZSA9ICZmbC0+ZmxfbmV4dDsKKwl9CisJdW5sb2NrX2tlcm5lbCgpOworb3V0OgorCWlmIChsb2NrLmZsX29wcyAmJiBsb2NrLmZsX29wcy0+ZmxfcmVsZWFzZV9wcml2YXRlKQorCQlsb2NrLmZsX29wcy0+ZmxfcmVsZWFzZV9wcml2YXRlKCZsb2NrKTsKK30KKworRVhQT1JUX1NZTUJPTChsb2Nrc19yZW1vdmVfcG9zaXgpOworCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb24gdGhlIGxhc3QgY2xvc2Ugb2YgYW4gb3BlbiBmaWxlLgorICovCit2b2lkIGxvY2tzX3JlbW92ZV9mbG9jayhzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOyAKKwlzdHJ1Y3QgZmlsZV9sb2NrICpmbDsKKwlzdHJ1Y3QgZmlsZV9sb2NrICoqYmVmb3JlOworCisJaWYgKCFpbm9kZS0+aV9mbG9jaykKKwkJcmV0dXJuOworCisJaWYgKGZpbHAtPmZfb3AgJiYgZmlscC0+Zl9vcC0+ZmxvY2spIHsKKwkJc3RydWN0IGZpbGVfbG9jayBmbCA9IHsKKwkJCS5mbF9waWQgPSBjdXJyZW50LT50Z2lkLAorCQkJLmZsX2ZpbGUgPSBmaWxwLAorCQkJLmZsX2ZsYWdzID0gRkxfRkxPQ0ssCisJCQkuZmxfdHlwZSA9IEZfVU5MQ0ssCisJCQkuZmxfZW5kID0gT0ZGU0VUX01BWCwKKwkJfTsKKwkJZmlscC0+Zl9vcC0+ZmxvY2soZmlscCwgRl9TRVRMS1csICZmbCk7CisJfQorCisJbG9ja19rZXJuZWwoKTsKKwliZWZvcmUgPSAmaW5vZGUtPmlfZmxvY2s7CisKKwl3aGlsZSAoKGZsID0gKmJlZm9yZSkgIT0gTlVMTCkgeworCQlpZiAoZmwtPmZsX2ZpbGUgPT0gZmlscCkgeworCQkJLyoKKwkJCSAqIFdlIG1pZ2h0IGhhdmUgYSBQT1NJWCBsb2NrIHRoYXQgd2FzIGNyZWF0ZWQgYXQgdGhlIHNhbWUgdGltZQorCQkJICogdGhlIGZpbHAgd2FzIGNsb3NlZCBmb3IgdGhlIGxhc3QgdGltZS4gSnVzdCByZW1vdmUgdGhhdCB0b28sCisJCQkgKiByZWdhcmRsZXNzIG9mIG93bmVyc2hpcCwgc2luY2Ugbm9ib2R5IGNhbiBvd24gaXQuCisJCQkgKi8KKwkJCWlmIChJU19GTE9DSyhmbCkgfHwgSVNfUE9TSVgoZmwpKSB7CisJCQkJbG9ja3NfZGVsZXRlX2xvY2soYmVmb3JlKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChJU19MRUFTRShmbCkpIHsKKwkJCQlsZWFzZV9tb2RpZnkoYmVmb3JlLCBGX1VOTENLKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qIFdoYXQ/ICovCisJCQlCVUcoKTsKKyAJCX0KKwkJYmVmb3JlID0gJmZsLT5mbF9uZXh0OworCX0KKwl1bmxvY2tfa2VybmVsKCk7Cit9CisKKy8qKgorICoJcG9zaXhfYmxvY2tfbG9jayAtIGJsb2NrcyB3YWl0aW5nIGZvciBhIGZpbGUgbG9jaworICoJQGJsb2NrZXI6IHRoZSBsb2NrIHdoaWNoIGlzIGJsb2NraW5nCisgKglAd2FpdGVyOiB0aGUgbG9jayB3aGljaCBjb25mbGljdHMgYW5kIGhhcyB0byB3YWl0CisgKgorICogbG9ja2QgbmVlZHMgdG8gYmxvY2sgd2FpdGluZyBmb3IgbG9ja3MuCisgKi8KK3ZvaWQKK3Bvc2l4X2Jsb2NrX2xvY2soc3RydWN0IGZpbGVfbG9jayAqYmxvY2tlciwgc3RydWN0IGZpbGVfbG9jayAqd2FpdGVyKQoreworCWxvY2tzX2luc2VydF9ibG9jayhibG9ja2VyLCB3YWl0ZXIpOworfQorCitFWFBPUlRfU1lNQk9MKHBvc2l4X2Jsb2NrX2xvY2spOworCisvKioKKyAqCXBvc2l4X3VuYmxvY2tfbG9jayAtIHN0b3Agd2FpdGluZyBmb3IgYSBmaWxlIGxvY2sKKyAqICAgICAgQGZpbHA6ICAgaG93IHRoZSBmaWxlIHdhcyBvcGVuZWQKKyAqCUB3YWl0ZXI6IHRoZSBsb2NrIHdoaWNoIHdhcyB3YWl0aW5nCisgKgorICoJbG9ja2QgbmVlZHMgdG8gYmxvY2sgd2FpdGluZyBmb3IgbG9ja3MuCisgKi8KK3ZvaWQKK3Bvc2l4X3VuYmxvY2tfbG9jayhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGZpbGVfbG9jayAqd2FpdGVyKQoreworCS8qIAorCSAqIEEgcmVtb3RlIG1hY2hpbmUgbWF5IGNhbmNlbCB0aGUgbG9jayByZXF1ZXN0IGFmdGVyIGl0J3MgYmVlbgorCSAqIGdyYW50ZWQgbG9jYWxseS4gIElmIHRoYXQgaGFwcGVucywgd2UgbmVlZCB0byBkZWxldGUgdGhlIGxvY2suCisJICovCisJbG9ja19rZXJuZWwoKTsKKwlpZiAod2FpdGVyLT5mbF9uZXh0KSB7CisJCV9fbG9ja3NfZGVsZXRlX2Jsb2NrKHdhaXRlcik7CisJCXVubG9ja19rZXJuZWwoKTsKKwl9IGVsc2UgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXdhaXRlci0+ZmxfdHlwZSA9IEZfVU5MQ0s7CisJCXBvc2l4X2xvY2tfZmlsZShmaWxwLCB3YWl0ZXIpOworCX0KK30KKworRVhQT1JUX1NZTUJPTChwb3NpeF91bmJsb2NrX2xvY2spOworCitzdGF0aWMgdm9pZCBsb2NrX2dldF9zdGF0dXMoY2hhciogb3V0LCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCwgaW50IGlkLCBjaGFyICpwZngpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CisKKwlpZiAoZmwtPmZsX2ZpbGUgIT0gTlVMTCkKKwkJaW5vZGUgPSBmbC0+ZmxfZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisKKwlvdXQgKz0gc3ByaW50ZihvdXQsICIlZDolcyAiLCBpZCwgcGZ4KTsKKwlpZiAoSVNfUE9TSVgoZmwpKSB7CisJCW91dCArPSBzcHJpbnRmKG91dCwgIiU2cyAlcyAiLAorCQkJICAgICAoZmwtPmZsX2ZsYWdzICYgRkxfQUNDRVNTKSA/ICJBQ0NFU1MiIDogIlBPU0lYICIsCisJCQkgICAgIChpbm9kZSA9PSBOVUxMKSA/ICIqTk9JTk9ERSoiIDoKKwkJCSAgICAgKElTX01BTkRMT0NLKGlub2RlKSAmJgorCQkJICAgICAgKGlub2RlLT5pX21vZGUgJiAoU19JWEdSUCB8IFNfSVNHSUQpKSA9PSBTX0lTR0lEKSA/CisJCQkgICAgICJNQU5EQVRPUlkiIDogIkFEVklTT1JZICIpOworCX0gZWxzZSBpZiAoSVNfRkxPQ0soZmwpKSB7CisJCWlmIChmbC0+ZmxfdHlwZSAmIExPQ0tfTUFORCkgeworCQkJb3V0ICs9IHNwcmludGYob3V0LCAiRkxPQ0sgIE1TTkZTICAgICAiKTsKKwkJfSBlbHNlIHsKKwkJCW91dCArPSBzcHJpbnRmKG91dCwgIkZMT0NLICBBRFZJU09SWSAgIik7CisJCX0KKwl9IGVsc2UgaWYgKElTX0xFQVNFKGZsKSkgeworCQlvdXQgKz0gc3ByaW50ZihvdXQsICJMRUFTRSAgIik7CisJCWlmIChmbC0+ZmxfdHlwZSAmIEZfSU5QUk9HUkVTUykKKwkJCW91dCArPSBzcHJpbnRmKG91dCwgIkJSRUFLSU5HICAiKTsKKwkJZWxzZSBpZiAoZmwtPmZsX2ZpbGUpCisJCQlvdXQgKz0gc3ByaW50ZihvdXQsICJBQ1RJVkUgICAgIik7CisJCWVsc2UKKwkJCW91dCArPSBzcHJpbnRmKG91dCwgIkJSRUFLRVIgICAiKTsKKwl9IGVsc2UgeworCQlvdXQgKz0gc3ByaW50ZihvdXQsICJVTktOT1dOIFVOS05PV04gICIpOworCX0KKwlpZiAoZmwtPmZsX3R5cGUgJiBMT0NLX01BTkQpIHsKKwkJb3V0ICs9IHNwcmludGYob3V0LCAiJXMgIiwKKwkJCSAgICAgICAoZmwtPmZsX3R5cGUgJiBMT0NLX1JFQUQpCisJCQkgICAgICAgPyAoZmwtPmZsX3R5cGUgJiBMT0NLX1dSSVRFKSA/ICJSVyAgICIgOiAiUkVBRCAiCisJCQkgICAgICAgOiAoZmwtPmZsX3R5cGUgJiBMT0NLX1dSSVRFKSA/ICJXUklURSIgOiAiTk9ORSAiKTsKKwl9IGVsc2UgeworCQlvdXQgKz0gc3ByaW50ZihvdXQsICIlcyAiLAorCQkJICAgICAgIChmbC0+ZmxfdHlwZSAmIEZfSU5QUk9HUkVTUykKKwkJCSAgICAgICA/IChmbC0+ZmxfdHlwZSAmIEZfVU5MQ0spID8gIlVOTENLIiA6ICJSRUFEICIKKwkJCSAgICAgICA6IChmbC0+ZmxfdHlwZSAmIEZfV1JMQ0spID8gIldSSVRFIiA6ICJSRUFEICIpOworCX0KKwlpZiAoaW5vZGUpIHsKKyNpZmRlZiBXRV9DQU5fQlJFQUtfTFNMS19OT1cKKwkJb3V0ICs9IHNwcmludGYob3V0LCAiJWQgJXM6JWxkICIsIGZsLT5mbF9waWQsCisJCQkJaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubyk7CisjZWxzZQorCQkvKiB1c2Vyc3BhY2UgcmVsaWVzIG9uIHRoaXMgcmVwcmVzZW50YXRpb24gb2YgZGV2X3QgOy0oICovCisJCW91dCArPSBzcHJpbnRmKG91dCwgIiVkICUwMng6JTAyeDolbGQgIiwgZmwtPmZsX3BpZCwKKwkJCQlNQUpPUihpbm9kZS0+aV9zYi0+c19kZXYpLAorCQkJCU1JTk9SKGlub2RlLT5pX3NiLT5zX2RldiksIGlub2RlLT5pX2lubyk7CisjZW5kaWYKKwl9IGVsc2UgeworCQlvdXQgKz0gc3ByaW50ZihvdXQsICIlZCA8bm9uZT46MCAiLCBmbC0+ZmxfcGlkKTsKKwl9CisJaWYgKElTX1BPU0lYKGZsKSkgeworCQlpZiAoZmwtPmZsX2VuZCA9PSBPRkZTRVRfTUFYKQorCQkJb3V0ICs9IHNwcmludGYob3V0LCAiJUxkIEVPRlxuIiwgZmwtPmZsX3N0YXJ0KTsKKwkJZWxzZQorCQkJb3V0ICs9IHNwcmludGYob3V0LCAiJUxkICVMZFxuIiwgZmwtPmZsX3N0YXJ0LAorCQkJCQlmbC0+ZmxfZW5kKTsKKwl9IGVsc2UgeworCQlvdXQgKz0gc3ByaW50ZihvdXQsICIwIEVPRlxuIik7CisJfQorfQorCitzdGF0aWMgdm9pZCBtb3ZlX2xvY2tfc3RhdHVzKGNoYXIgKipwLCBvZmZfdCogcG9zLCBvZmZfdCBvZmZzZXQpCit7CisJaW50IGxlbjsKKwlsZW4gPSBzdHJsZW4oKnApOworCWlmKCpwb3MgPj0gb2Zmc2V0KSB7CisJCS8qIHRoZSBjb21wbGV0ZSBsaW5lIGlzIHZhbGlkICovCisJCSpwICs9IGxlbjsKKwkJKnBvcyArPSBsZW47CisJCXJldHVybjsKKwl9CisJaWYoKnBvcytsZW4gPiBvZmZzZXQpIHsKKwkJLyogdXNlIHRoZSBzZWNvbmQgcGFydCBvZiB0aGUgbGluZSAqLworCQlpbnQgaSA9IG9mZnNldC0qcG9zOworCQltZW1tb3ZlKCpwLCpwK2ksbGVuLWkpOworCQkqcCArPSBsZW4taTsKKwkJKnBvcyArPSBsZW47CisJCXJldHVybjsKKwl9CisJLyogZGlzY2FyZCB0aGUgY29tcGxldGUgbGluZSAqLworCSpwb3MgKz0gbGVuOworfQorCisvKioKKyAqCWdldF9sb2Nrc19zdGF0dXMJLQlyZXBvcnRzIGxvY2sgdXNhZ2UgaW4gL3Byb2MvbG9ja3MKKyAqCUBidWZmZXI6IGFkZHJlc3MgaW4gdXNlcnNwYWNlIHRvIHdyaXRlIGludG8KKyAqCUBzdGFydDogPworICoJQG9mZnNldDogaG93IGZhciB3ZSBhcmUgdGhyb3VnaCB0aGUgYnVmZmVyCisgKglAbGVuZ3RoOiBob3cgbXVjaCB0byByZWFkCisgKi8KKworaW50IGdldF9sb2Nrc19zdGF0dXMoY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwgaW50IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisJY2hhciAqcSA9IGJ1ZmZlcjsKKwlvZmZfdCBwb3MgPSAwOworCWludCBpID0gMDsKKworCWxvY2tfa2VybmVsKCk7CisJbGlzdF9mb3JfZWFjaCh0bXAsICZmaWxlX2xvY2tfbGlzdCkgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICpidG1wOworCQlzdHJ1Y3QgZmlsZV9sb2NrICpmbCA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgZmlsZV9sb2NrLCBmbF9saW5rKTsKKwkJbG9ja19nZXRfc3RhdHVzKHEsIGZsLCArK2ksICIiKTsKKwkJbW92ZV9sb2NrX3N0YXR1cygmcSwgJnBvcywgb2Zmc2V0KTsKKworCQlpZihwb3MgPj0gb2Zmc2V0K2xlbmd0aCkKKwkJCWdvdG8gZG9uZTsKKworCQlsaXN0X2Zvcl9lYWNoKGJ0bXAsICZmbC0+ZmxfYmxvY2spIHsKKwkJCXN0cnVjdCBmaWxlX2xvY2sgKmJmbCA9IGxpc3RfZW50cnkoYnRtcCwKKwkJCQkJc3RydWN0IGZpbGVfbG9jaywgZmxfYmxvY2spOworCQkJbG9ja19nZXRfc3RhdHVzKHEsIGJmbCwgaSwgIiAtPiIpOworCQkJbW92ZV9sb2NrX3N0YXR1cygmcSwgJnBvcywgb2Zmc2V0KTsKKworCQkJaWYocG9zID49IG9mZnNldCtsZW5ndGgpCisJCQkJZ290byBkb25lOworCQl9CisJfQorZG9uZToKKwl1bmxvY2tfa2VybmVsKCk7CisJKnN0YXJ0ID0gYnVmZmVyOworCWlmKHEtYnVmZmVyIDwgbGVuZ3RoKQorCQlyZXR1cm4gKHEtYnVmZmVyKTsKKwlyZXR1cm4gbGVuZ3RoOworfQorCisvKioKKyAqCWxvY2tfbWF5X3JlYWQgLSBjaGVja3MgdGhhdCB0aGUgcmVnaW9uIGlzIGZyZWUgb2YgbG9ja3MKKyAqCUBpbm9kZTogdGhlIGlub2RlIHRoYXQgaXMgYmVpbmcgcmVhZAorICoJQHN0YXJ0OiB0aGUgZmlyc3QgYnl0ZSB0byByZWFkCisgKglAbGVuOiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAqCisgKglFbXVsYXRlcyBXaW5kb3dzIGxvY2tpbmcgcmVxdWlyZW1lbnRzLiAgV2hvbGUtZmlsZQorICoJbWFuZGF0b3J5IGxvY2tzIChzaGFyZSBtb2RlcykgY2FuIHByb2hpYml0IGEgcmVhZCBhbmQKKyAqCWJ5dGUtcmFuZ2UgUE9TSVggbG9ja3MgY2FuIHByb2hpYml0IGEgcmVhZCBpZiB0aGV5IG92ZXJsYXAuCisgKgorICoJTi5CLiB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkgZXZlciBjYWxsZWQKKyAqCWZyb20ga25mc2QgYW5kIG93bmVyc2hpcCBvZiBsb2NrcyBpcyBuZXZlciBjaGVja2VkLgorICovCitpbnQgbG9ja19tYXlfcmVhZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCXN0cnVjdCBmaWxlX2xvY2sgKmZsOworCWludCByZXN1bHQgPSAxOworCWxvY2tfa2VybmVsKCk7CisJZm9yIChmbCA9IGlub2RlLT5pX2Zsb2NrOyBmbCAhPSBOVUxMOyBmbCA9IGZsLT5mbF9uZXh0KSB7CisJCWlmIChJU19QT1NJWChmbCkpIHsKKwkJCWlmIChmbC0+ZmxfdHlwZSA9PSBGX1JETENLKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKChmbC0+ZmxfZW5kIDwgc3RhcnQpIHx8IChmbC0+Zmxfc3RhcnQgPiAoc3RhcnQgKyBsZW4pKSkKKwkJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChJU19GTE9DSyhmbCkpIHsKKwkJCWlmICghKGZsLT5mbF90eXBlICYgTE9DS19NQU5EKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChmbC0+ZmxfdHlwZSAmIExPQ0tfUkVBRCkKKwkJCQljb250aW51ZTsKKwkJfSBlbHNlCisJCQljb250aW51ZTsKKwkJcmVzdWx0ID0gMDsKKwkJYnJlYWs7CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitFWFBPUlRfU1lNQk9MKGxvY2tfbWF5X3JlYWQpOworCisvKioKKyAqCWxvY2tfbWF5X3dyaXRlIC0gY2hlY2tzIHRoYXQgdGhlIHJlZ2lvbiBpcyBmcmVlIG9mIGxvY2tzCisgKglAaW5vZGU6IHRoZSBpbm9kZSB0aGF0IGlzIGJlaW5nIHdyaXR0ZW4KKyAqCUBzdGFydDogdGhlIGZpcnN0IGJ5dGUgdG8gd3JpdGUKKyAqCUBsZW46IHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKKyAqCisgKglFbXVsYXRlcyBXaW5kb3dzIGxvY2tpbmcgcmVxdWlyZW1lbnRzLiAgV2hvbGUtZmlsZQorICoJbWFuZGF0b3J5IGxvY2tzIChzaGFyZSBtb2RlcykgY2FuIHByb2hpYml0IGEgd3JpdGUgYW5kCisgKglieXRlLXJhbmdlIFBPU0lYIGxvY2tzIGNhbiBwcm9oaWJpdCBhIHdyaXRlIGlmIHRoZXkgb3ZlcmxhcC4KKyAqCisgKglOLkIuIHRoaXMgZnVuY3Rpb24gaXMgb25seSBldmVyIGNhbGxlZAorICoJZnJvbSBrbmZzZCBhbmQgb3duZXJzaGlwIG9mIGxvY2tzIGlzIG5ldmVyIGNoZWNrZWQuCisgKi8KK2ludCBsb2NrX21heV93cml0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgc3RhcnQsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCXN0cnVjdCBmaWxlX2xvY2sgKmZsOworCWludCByZXN1bHQgPSAxOworCWxvY2tfa2VybmVsKCk7CisJZm9yIChmbCA9IGlub2RlLT5pX2Zsb2NrOyBmbCAhPSBOVUxMOyBmbCA9IGZsLT5mbF9uZXh0KSB7CisJCWlmIChJU19QT1NJWChmbCkpIHsKKwkJCWlmICgoZmwtPmZsX2VuZCA8IHN0YXJ0KSB8fCAoZmwtPmZsX3N0YXJ0ID4gKHN0YXJ0ICsgbGVuKSkpCisJCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAoSVNfRkxPQ0soZmwpKSB7CisJCQlpZiAoIShmbC0+ZmxfdHlwZSAmIExPQ0tfTUFORCkpCisJCQkJY29udGludWU7CisJCQlpZiAoZmwtPmZsX3R5cGUgJiBMT0NLX1dSSVRFKQorCQkJCWNvbnRpbnVlOworCQl9IGVsc2UKKwkJCWNvbnRpbnVlOworCQlyZXN1bHQgPSAwOworCQlicmVhazsKKwl9CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXN1bHQ7Cit9CisKK0VYUE9SVF9TWU1CT0wobG9ja19tYXlfd3JpdGUpOworCitzdGF0aWMgaW5saW5lIHZvaWQgX19zdGVhbF9sb2NrcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgZmxfb3duZXJfdCBmcm9tKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZmlsZV9sb2NrICpmbCA9IGlub2RlLT5pX2Zsb2NrOworCisJd2hpbGUgKGZsKSB7CisJCWlmIChmbC0+ZmxfZmlsZSA9PSBmaWxlICYmIGZsLT5mbF9vd25lciA9PSBmcm9tKQorCQkJZmwtPmZsX293bmVyID0gY3VycmVudC0+ZmlsZXM7CisJCWZsID0gZmwtPmZsX25leHQ7CisJfQorfQorCisvKiBXaGVuIGdldHRpbmcgcmVhZHkgZm9yIGV4ZWN1dGluZyBhIGJpbmFyeSwgd2UgbWFrZSBzdXJlIHRoYXQgY3VycmVudAorICogaGFzIGEgZmlsZXNfc3RydWN0IG9uIGl0cyBvd24uIEJlZm9yZSBkcm9wcGluZyB0aGUgb2xkIGZpbGVzX3N0cnVjdCwKKyAqIHdlIHRha2Ugb3ZlciBvd25lcnNoaXAgb2YgYWxsIGxvY2tzIGZvciBhbGwgZmlsZSBkZXNjcmlwdG9ycyB3ZSBvd24uCisgKiBOb3RlIHRoYXQgd2UgbWF5IGFjY2lkZW50YWxseSBzdGVhbCBhIGxvY2sgZm9yIGEgZmlsZSB0aGF0IGEgc2libGluZworICogaGFzIGNyZWF0ZWQgc2luY2UgdGhlIHVuc2hhcmVfZmlsZXMoKSBjYWxsLgorICovCit2b2lkIHN0ZWFsX2xvY2tzKGZsX293bmVyX3QgZnJvbSkKK3sKKwlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcyA9IGN1cnJlbnQtPmZpbGVzOworCWludCBpLCBqOworCisJaWYgKGZyb20gPT0gZmlsZXMpCisJCXJldHVybjsKKworCWxvY2tfa2VybmVsKCk7CisJaiA9IDA7CisJZm9yICg7OykgeworCQl1bnNpZ25lZCBsb25nIHNldDsKKwkJaSA9IGogKiBfX05GREJJVFM7CisJCWlmIChpID49IGZpbGVzLT5tYXhfZmRzZXQgfHwgaSA+PSBmaWxlcy0+bWF4X2ZkcykKKwkJCWJyZWFrOworCQlzZXQgPSBmaWxlcy0+b3Blbl9mZHMtPmZkc19iaXRzW2orK107CisJCXdoaWxlIChzZXQpIHsKKwkJCWlmIChzZXQgJiAxKSB7CisJCQkJc3RydWN0IGZpbGUgKmZpbGUgPSBmaWxlcy0+ZmRbaV07CisJCQkJaWYgKGZpbGUpCisJCQkJCV9fc3RlYWxfbG9ja3MoZmlsZSwgZnJvbSk7CisJCQl9CisJCQlpKys7CisJCQlzZXQgPj49IDE7CisJCX0KKwl9CisJdW5sb2NrX2tlcm5lbCgpOworfQorRVhQT1JUX1NZTUJPTChzdGVhbF9sb2Nrcyk7CisKK3N0YXRpYyBpbnQgX19pbml0IGZpbGVsb2NrX2luaXQodm9pZCkKK3sKKwlmaWxlbG9ja19jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJmaWxlX2xvY2tfY2FjaGUiLAorCQkJc2l6ZW9mKHN0cnVjdCBmaWxlX2xvY2spLCAwLCBTTEFCX1BBTklDLAorCQkJaW5pdF9vbmNlLCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KKworY29yZV9pbml0Y2FsbChmaWxlbG9ja19pbml0KTsKZGlmZiAtLWdpdCBhL2ZzL21iY2FjaGUuYyBiL2ZzL21iY2FjaGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWU0ZDI3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbWJjYWNoZS5jCkBAIC0wLDAgKzEsNjc3IEBACisvKgorICogbGludXgvZnMvbWJjYWNoZS5jCisgKiAoQykgMjAwMS0yMDAyIEFuZHJlYXMgR3J1ZW5iYWNoZXIsIDxhLmdydWVuYmFjaGVyQGNvbXB1dGVyLm9yZz4KKyAqLworCisvKgorICogRmlsZXN5c3RlbSBNZXRhIEluZm9ybWF0aW9uIEJsb2NrIENhY2hlIChtYmNhY2hlKQorICoKKyAqIFRoZSBtYmNhY2hlIGNhY2hlcyBibG9ja3Mgb2YgYmxvY2sgZGV2aWNlcyB0aGF0IG5lZWQgdG8gYmUgbG9jYXRlZAorICogYnkgdGhlaXIgZGV2aWNlL2Jsb2NrIG51bWJlciwgYXMgd2VsbCBhcyBieSBvdGhlciBjcml0ZXJpYSAoc3VjaAorICogYXMgdGhlIGJsb2NrJ3MgY29udGVudHMpLgorICoKKyAqIFRoZXJlIGNhbiBvbmx5IGJlIG9uZSBjYWNoZSBlbnRyeSBpbiBhIGNhY2hlIHBlciBkZXZpY2UgYW5kIGJsb2NrIG51bWJlci4KKyAqIEFkZGl0aW9uYWwgaW5kZXhlcyBuZWVkIG5vdCBiZSB1bmlxdWUgaW4gdGhpcyBzZW5zZS4gVGhlIG51bWJlciBvZgorICogYWRkaXRpb25hbCBpbmRleGVzICg9b3RoZXIgY3JpdGVyaWEpIGNhbiBiZSBoYXJkd2lyZWQgYXQgY29tcGlsZSB0aW1lCisgKiBvciBzcGVjaWZpZWQgYXQgY2FjaGUgY3JlYXRlIHRpbWUuCisgKgorICogRWFjaCBjYWNoZSBlbnRyeSBpcyBvZiBmaXhlZCBzaXplLiBBbiBlbnRyeSBtYXkgYmUgYHZhbGlkJyBvciBgaW52YWxpZCcKKyAqIGluIHRoZSBjYWNoZS4gQSB2YWxpZCBlbnRyeSBpcyBpbiB0aGUgbWFpbiBoYXNoIHRhYmxlcyBvZiB0aGUgY2FjaGUsCisgKiBhbmQgbWF5IGFsc28gYmUgaW4gdGhlIGxydSBsaXN0LiBBbiBpbnZhbGlkIGVudHJ5IGlzIG5vdCBpbiBhbnkgaGFzaGVzCisgKiBvciBsaXN0cy4KKyAqCisgKiBBIHZhbGlkIGNhY2hlIGVudHJ5IGlzIG9ubHkgaW4gdGhlIGxydSBsaXN0IGlmIG5vIGhhbmRsZXMgcmVmZXIgdG8gaXQuCisgKiBJbnZhbGlkIGNhY2hlIGVudHJpZXMgd2lsbCBiZSBmcmVlZCB3aGVuIHRoZSBsYXN0IGhhbmRsZSB0byB0aGUgY2FjaGUKKyAqIGVudHJ5IGlzIHJlbGVhc2VkLiBFbnRyaWVzIHRoYXQgY2Fubm90IGJlIGZyZWVkIGltbWVkaWF0ZWx5IGFyZSBwdXQKKyAqIGJhY2sgb24gdGhlIGxydSBsaXN0LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21iY2FjaGUuaD4KKworCisjaWZkZWYgTUJfQ0FDSEVfREVCVUcKKyMgZGVmaW5lIG1iX2RlYnVnKGYuLi4pIGRvIHsgXAorCQlwcmludGsoS0VSTl9ERUJVRyBmKTsgXAorCQlwcmludGsoIlxuIik7IFwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBtYl9hc3NlcnQoYykgZG8geyBpZiAoIShjKSkgXAorCQlwcmludGsoS0VSTl9FUlIgImFzc2VydGlvbiAiICNjICIgZmFpbGVkXG4iKTsgXAorCX0gd2hpbGUoMCkKKyNlbHNlCisjIGRlZmluZSBtYl9kZWJ1ZyhmLi4uKSBkbyB7IH0gd2hpbGUoMCkKKyMgZGVmaW5lIG1iX2Fzc2VydChjKSBkbyB7IH0gd2hpbGUoMCkKKyNlbmRpZgorI2RlZmluZSBtYl9lcnJvcihmLi4uKSBkbyB7IFwKKwkJcHJpbnRrKEtFUk5fRVJSIGYpOyBcCisJCXByaW50aygiXG4iKTsgXAorCX0gd2hpbGUoMCkKKworI2RlZmluZSBNQl9DQUNIRV9XUklURVIgKCh1bnNpZ25lZCBzaG9ydCl+MFUgPj4gMSkKKworREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQobWJfY2FjaGVfcXVldWUpOworCQkKK01PRFVMRV9BVVRIT1IoIkFuZHJlYXMgR3J1ZW5iYWNoZXIgPGEuZ3J1ZW5iYWNoZXJAY29tcHV0ZXIub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNZXRhIGJsb2NrIGNhY2hlIChmb3IgZXh0ZW5kZWQgYXR0cmlidXRlcykiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworRVhQT1JUX1NZTUJPTChtYl9jYWNoZV9jcmVhdGUpOworRVhQT1JUX1NZTUJPTChtYl9jYWNoZV9zaHJpbmspOworRVhQT1JUX1NZTUJPTChtYl9jYWNoZV9kZXN0cm95KTsKK0VYUE9SVF9TWU1CT0wobWJfY2FjaGVfZW50cnlfYWxsb2MpOworRVhQT1JUX1NZTUJPTChtYl9jYWNoZV9lbnRyeV9pbnNlcnQpOworRVhQT1JUX1NZTUJPTChtYl9jYWNoZV9lbnRyeV9yZWxlYXNlKTsKK0VYUE9SVF9TWU1CT0wobWJfY2FjaGVfZW50cnlfZnJlZSk7CitFWFBPUlRfU1lNQk9MKG1iX2NhY2hlX2VudHJ5X2dldCk7CisjaWYgIWRlZmluZWQoTUJfQ0FDSEVfSU5ERVhFU19DT1VOVCkgfHwgKE1CX0NBQ0hFX0lOREVYRVNfQ09VTlQgPiAwKQorRVhQT1JUX1NZTUJPTChtYl9jYWNoZV9lbnRyeV9maW5kX2ZpcnN0KTsKK0VYUE9SVF9TWU1CT0wobWJfY2FjaGVfZW50cnlfZmluZF9uZXh0KTsKKyNlbmRpZgorCitzdHJ1Y3QgbWJfY2FjaGUgeworCXN0cnVjdCBsaXN0X2hlYWQJCWNfY2FjaGVfbGlzdDsKKwljb25zdCBjaGFyCQkJKmNfbmFtZTsKKwlzdHJ1Y3QgbWJfY2FjaGVfb3AJCWNfb3A7CisJYXRvbWljX3QJCQljX2VudHJ5X2NvdW50OworCWludAkJCQljX2J1Y2tldF9iaXRzOworI2lmbmRlZiBNQl9DQUNIRV9JTkRFWEVTX0NPVU5UCisJaW50CQkJCWNfaW5kZXhlc19jb3VudDsKKyNlbmRpZgorCWttZW1fY2FjaGVfdAkJCSpjX2VudHJ5X2NhY2hlOworCXN0cnVjdCBsaXN0X2hlYWQJCSpjX2Jsb2NrX2hhc2g7CisJc3RydWN0IGxpc3RfaGVhZAkJKmNfaW5kZXhlc19oYXNoWzBdOworfTsKKworCisvKgorICogR2xvYmFsIGRhdGE6IGxpc3Qgb2YgYWxsIG1iY2FjaGUncywgbHJ1IGxpc3QsIGFuZCBhIHNwaW5sb2NrIGZvcgorICogYWNjZXNzaW5nIGNhY2hlIGRhdGEgc3RydWN0dXJlcyBvbiBTTVAgbWFjaGluZXMuIFRoZSBscnUgbGlzdCBpcworICogZ2xvYmFsIGFjcm9zcyBhbGwgbWJjYWNoZXMuCisgKi8KKworc3RhdGljIExJU1RfSEVBRChtYl9jYWNoZV9saXN0KTsKK3N0YXRpYyBMSVNUX0hFQUQobWJfY2FjaGVfbHJ1X2xpc3QpOworc3RhdGljIERFRklORV9TUElOTE9DSyhtYl9jYWNoZV9zcGlubG9jayk7CitzdGF0aWMgc3RydWN0IHNocmlua2VyICptYl9zaHJpbmtlcjsKKworc3RhdGljIGlubGluZSBpbnQKK21iX2NhY2hlX2luZGV4ZXMoc3RydWN0IG1iX2NhY2hlICpjYWNoZSkKK3sKKyNpZmRlZiBNQl9DQUNIRV9JTkRFWEVTX0NPVU5UCisJcmV0dXJuIE1CX0NBQ0hFX0lOREVYRVNfQ09VTlQ7CisjZWxzZQorCXJldHVybiBjYWNoZS0+Y19pbmRleGVzX2NvdW50OworI2VuZGlmCit9CisKKy8qCisgKiBXaGF0IHRoZSBtYmNhY2hlIHJlZ2lzdGVycyBhcyB0byBnZXQgc2hydW5rIGR5bmFtaWNhbGx5LgorICovCisKK3N0YXRpYyBpbnQgbWJfY2FjaGVfc2hyaW5rX2ZuKGludCBucl90b19zY2FuLCB1bnNpZ25lZCBpbnQgZ2ZwX21hc2spOworCisKK3N0YXRpYyBpbmxpbmUgaW50CitfX21iX2NhY2hlX2VudHJ5X2lzX2hhc2hlZChzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKmNlKQoreworCXJldHVybiAhbGlzdF9lbXB0eSgmY2UtPmVfYmxvY2tfbGlzdCk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkCitfX21iX2NhY2hlX2VudHJ5X3VuaGFzaChzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKmNlKQoreworCWludCBuOworCisJaWYgKF9fbWJfY2FjaGVfZW50cnlfaXNfaGFzaGVkKGNlKSkgeworCQlsaXN0X2RlbF9pbml0KCZjZS0+ZV9ibG9ja19saXN0KTsKKwkJZm9yIChuPTA7IG48bWJfY2FjaGVfaW5kZXhlcyhjZS0+ZV9jYWNoZSk7IG4rKykKKwkJCWxpc3RfZGVsKCZjZS0+ZV9pbmRleGVzW25dLm9fbGlzdCk7CisJfQorfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19tYl9jYWNoZV9lbnRyeV9mb3JnZXQoc3RydWN0IG1iX2NhY2hlX2VudHJ5ICpjZSwgaW50IGdmcF9tYXNrKQoreworCXN0cnVjdCBtYl9jYWNoZSAqY2FjaGUgPSBjZS0+ZV9jYWNoZTsKKworCW1iX2Fzc2VydCghKGNlLT5lX3VzZWQgfHwgY2UtPmVfcXVldWVkKSk7CisJaWYgKGNhY2hlLT5jX29wLmZyZWUgJiYgY2FjaGUtPmNfb3AuZnJlZShjZSwgZ2ZwX21hc2spKSB7CisJCS8qIGZyZWUgZmFpbGVkIC0tIHB1dCBiYWNrIG9uIHRoZSBscnUgbGlzdAorCQkgICBmb3IgZnJlZWluZyBsYXRlci4gKi8KKwkJc3Bpbl9sb2NrKCZtYl9jYWNoZV9zcGlubG9jayk7CisJCWxpc3RfYWRkKCZjZS0+ZV9scnVfbGlzdCwgJm1iX2NhY2hlX2xydV9saXN0KTsKKwkJc3Bpbl91bmxvY2soJm1iX2NhY2hlX3NwaW5sb2NrKTsKKwl9IGVsc2UgeworCQlrbWVtX2NhY2hlX2ZyZWUoY2FjaGUtPmNfZW50cnlfY2FjaGUsIGNlKTsKKwkJYXRvbWljX2RlYygmY2FjaGUtPmNfZW50cnlfY291bnQpOworCX0KK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQKK19fbWJfY2FjaGVfZW50cnlfcmVsZWFzZV91bmxvY2soc3RydWN0IG1iX2NhY2hlX2VudHJ5ICpjZSkKK3sKKwkvKiBXYWtlIHVwIGFsbCBwcm9jZXNzZXMgcXVldWluZyBmb3IgdGhpcyBjYWNoZSBlbnRyeS4gKi8KKwlpZiAoY2UtPmVfcXVldWVkKQorCQl3YWtlX3VwX2FsbCgmbWJfY2FjaGVfcXVldWUpOworCWlmIChjZS0+ZV91c2VkID49IE1CX0NBQ0hFX1dSSVRFUikKKwkJY2UtPmVfdXNlZCAtPSBNQl9DQUNIRV9XUklURVI7CisJY2UtPmVfdXNlZC0tOworCWlmICghKGNlLT5lX3VzZWQgfHwgY2UtPmVfcXVldWVkKSkgeworCQlpZiAoIV9fbWJfY2FjaGVfZW50cnlfaXNfaGFzaGVkKGNlKSkKKwkJCWdvdG8gZm9yZ2V0OworCQltYl9hc3NlcnQobGlzdF9lbXB0eSgmY2UtPmVfbHJ1X2xpc3QpKTsKKwkJbGlzdF9hZGRfdGFpbCgmY2UtPmVfbHJ1X2xpc3QsICZtYl9jYWNoZV9scnVfbGlzdCk7CisJfQorCXNwaW5fdW5sb2NrKCZtYl9jYWNoZV9zcGlubG9jayk7CisJcmV0dXJuOworZm9yZ2V0OgorCXNwaW5fdW5sb2NrKCZtYl9jYWNoZV9zcGlubG9jayk7CisJX19tYl9jYWNoZV9lbnRyeV9mb3JnZXQoY2UsIEdGUF9LRVJORUwpOworfQorCisKKy8qCisgKiBtYl9jYWNoZV9zaHJpbmtfZm4oKSAgbWVtb3J5IHByZXNzdXJlIGNhbGxiYWNrCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGtlcm5lbCBtZW1vcnkgbWFuYWdlbWVudCB3aGVuIG1lbW9yeQorICogZ2V0cyBsb3cuCisgKgorICogQG5yX3RvX3NjYW46IE51bWJlciBvZiBvYmplY3RzIHRvIHNjYW4KKyAqIEBnZnBfbWFzazogKGlnbm9yZWQpCisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIG9iamVjdHMgd2hpY2ggYXJlIHByZXNlbnQgaW4gdGhlIGNhY2hlLgorICovCitzdGF0aWMgaW50CittYl9jYWNoZV9zaHJpbmtfZm4oaW50IG5yX3RvX3NjYW4sIHVuc2lnbmVkIGludCBnZnBfbWFzaykKK3sKKwlMSVNUX0hFQUQoZnJlZV9saXN0KTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsLCAqbHRtcDsKKwlpbnQgY291bnQgPSAwOworCisJc3Bpbl9sb2NrKCZtYl9jYWNoZV9zcGlubG9jayk7CisJbGlzdF9mb3JfZWFjaChsLCAmbWJfY2FjaGVfbGlzdCkgeworCQlzdHJ1Y3QgbWJfY2FjaGUgKmNhY2hlID0KKwkJCWxpc3RfZW50cnkobCwgc3RydWN0IG1iX2NhY2hlLCBjX2NhY2hlX2xpc3QpOworCQltYl9kZWJ1ZygiY2FjaGUgJXMgKCVkKSIsIGNhY2hlLT5jX25hbWUsCisJCQkgIGF0b21pY19yZWFkKCZjYWNoZS0+Y19lbnRyeV9jb3VudCkpOworCQljb3VudCArPSBhdG9taWNfcmVhZCgmY2FjaGUtPmNfZW50cnlfY291bnQpOworCX0KKwltYl9kZWJ1ZygidHJ5aW5nIHRvIGZyZWUgJWQgZW50cmllcyIsIG5yX3RvX3NjYW4pOworCWlmIChucl90b19zY2FuID09IDApIHsKKwkJc3Bpbl91bmxvY2soJm1iX2NhY2hlX3NwaW5sb2NrKTsKKwkJZ290byBvdXQ7CisJfQorCXdoaWxlIChucl90b19zY2FuLS0gJiYgIWxpc3RfZW1wdHkoJm1iX2NhY2hlX2xydV9saXN0KSkgeworCQlzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKmNlID0KKwkJCWxpc3RfZW50cnkobWJfY2FjaGVfbHJ1X2xpc3QubmV4dCwKKwkJCQkgICBzdHJ1Y3QgbWJfY2FjaGVfZW50cnksIGVfbHJ1X2xpc3QpOworCQlsaXN0X21vdmVfdGFpbCgmY2UtPmVfbHJ1X2xpc3QsICZmcmVlX2xpc3QpOworCQlfX21iX2NhY2hlX2VudHJ5X3VuaGFzaChjZSk7CisJfQorCXNwaW5fdW5sb2NrKCZtYl9jYWNoZV9zcGlubG9jayk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKGwsIGx0bXAsICZmcmVlX2xpc3QpIHsKKwkJX19tYl9jYWNoZV9lbnRyeV9mb3JnZXQobGlzdF9lbnRyeShsLCBzdHJ1Y3QgbWJfY2FjaGVfZW50cnksCisJCQkJCQkgICBlX2xydV9saXN0KSwgZ2ZwX21hc2spOworCX0KK291dDoKKwlyZXR1cm4gKGNvdW50IC8gMTAwKSAqIHN5c2N0bF92ZnNfY2FjaGVfcHJlc3N1cmU7Cit9CisKKworLyoKKyAqIG1iX2NhY2hlX2NyZWF0ZSgpICBjcmVhdGUgYSBuZXcgY2FjaGUKKyAqCisgKiBBbGwgZW50cmllcyBpbiBvbmUgY2FjaGUgYXJlIGVxdWFsIHNpemUuIENhY2hlIGVudHJpZXMgbWF5IGJlIGZyb20KKyAqIG11bHRpcGxlIGRldmljZXMuIElmIHRoaXMgaXMgdGhlIGZpcnN0IG1iY2FjaGUgY3JlYXRlZCwgcmVnaXN0ZXJzCisgKiB0aGUgY2FjaGUgd2l0aCBrZXJuZWwgbWVtb3J5IG1hbmFnZW1lbnQuIFJldHVybnMgTlVMTCBpZiBubyBtb3JlCisgKiBtZW1vcnkgd2FzIGF2YWlsYWJsZS4KKyAqCisgKiBAbmFtZTogbmFtZSBvZiB0aGUgY2FjaGUgKGluZm9ybWFsKQorICogQGNhY2hlX29wOiBjb250YWlucyB0aGUgY2FsbGJhY2sgY2FsbGVkIHdoZW4gZnJlZWluZyBhIGNhY2hlIGVudHJ5CisgKiBAZW50cnlfc2l6ZTogVGhlIHNpemUgb2YgYSBjYWNoZSBlbnRyeSwgaW5jbHVkaW5nCisgKiAgICAgICAgICAgICAgc3RydWN0IG1iX2NhY2hlX2VudHJ5CisgKiBAaW5kZXhlc19jb3VudDogbnVtYmVyIG9mIGFkZGl0aW9uYWwgaW5kZXhlcyBpbiB0aGUgY2FjaGUuIE11c3QgZXF1YWwKKyAqICAgICAgICAgICAgICAgICBNQl9DQUNIRV9JTkRFWEVTX0NPVU5UIGlmIHRoZSBudW1iZXIgb2YgaW5kZXhlcyBpcworICogICAgICAgICAgICAgICAgIGhhcmR3aXJlZC4KKyAqIEBidWNrZXRfYml0czogbG9nMihudW1iZXIgb2YgaGFzaCBidWNrZXRzKQorICovCitzdHJ1Y3QgbWJfY2FjaGUgKgorbWJfY2FjaGVfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBtYl9jYWNoZV9vcCAqY2FjaGVfb3AsCisJCXNpemVfdCBlbnRyeV9zaXplLCBpbnQgaW5kZXhlc19jb3VudCwgaW50IGJ1Y2tldF9iaXRzKQoreworCWludCBtPTAsIG4sIGJ1Y2tldF9jb3VudCA9IDEgPDwgYnVja2V0X2JpdHM7CisJc3RydWN0IG1iX2NhY2hlICpjYWNoZSA9IE5VTEw7CisKKwlpZihlbnRyeV9zaXplIDwgc2l6ZW9mKHN0cnVjdCBtYl9jYWNoZV9lbnRyeSkgKworCSAgIGluZGV4ZXNfY291bnQgKiBzaXplb2YoKChzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKikgMCktPmVfaW5kZXhlc1swXSkpCisJCXJldHVybiBOVUxMOworCisJY2FjaGUgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWJfY2FjaGUpICsKKwkgICAgICAgICAgICAgICAgaW5kZXhlc19jb3VudCAqIHNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjYWNoZSkKKwkJZ290byBmYWlsOworCWNhY2hlLT5jX25hbWUgPSBuYW1lOworCWNhY2hlLT5jX29wLmZyZWUgPSBOVUxMOworCWlmIChjYWNoZV9vcCkKKwkJY2FjaGUtPmNfb3AuZnJlZSA9IGNhY2hlX29wLT5mcmVlOworCWF0b21pY19zZXQoJmNhY2hlLT5jX2VudHJ5X2NvdW50LCAwKTsKKwljYWNoZS0+Y19idWNrZXRfYml0cyA9IGJ1Y2tldF9iaXRzOworI2lmZGVmIE1CX0NBQ0hFX0lOREVYRVNfQ09VTlQKKwltYl9hc3NlcnQoaW5kZXhlc19jb3VudCA9PSBNQl9DQUNIRV9JTkRFWEVTX0NPVU5UKTsKKyNlbHNlCisJY2FjaGUtPmNfaW5kZXhlc19jb3VudCA9IGluZGV4ZXNfY291bnQ7CisjZW5kaWYKKwljYWNoZS0+Y19ibG9ja19oYXNoID0ga21hbGxvYyhidWNrZXRfY291bnQgKiBzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCksCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFjYWNoZS0+Y19ibG9ja19oYXNoKQorCQlnb3RvIGZhaWw7CisJZm9yIChuPTA7IG48YnVja2V0X2NvdW50OyBuKyspCisJCUlOSVRfTElTVF9IRUFEKCZjYWNoZS0+Y19ibG9ja19oYXNoW25dKTsKKwlmb3IgKG09MDsgbTxpbmRleGVzX2NvdW50OyBtKyspIHsKKwkJY2FjaGUtPmNfaW5kZXhlc19oYXNoW21dID0ga21hbGxvYyhidWNrZXRfY291bnQgKgorCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCksCisJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdGUF9LRVJORUwpOworCQlpZiAoIWNhY2hlLT5jX2luZGV4ZXNfaGFzaFttXSkKKwkJCWdvdG8gZmFpbDsKKwkJZm9yIChuPTA7IG48YnVja2V0X2NvdW50OyBuKyspCisJCQlJTklUX0xJU1RfSEVBRCgmY2FjaGUtPmNfaW5kZXhlc19oYXNoW21dW25dKTsKKwl9CisJY2FjaGUtPmNfZW50cnlfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZShuYW1lLCBlbnRyeV9zaXplLCAwLAorCQlTTEFCX1JFQ0xBSU1fQUNDT1VOVCwgTlVMTCwgTlVMTCk7CisJaWYgKCFjYWNoZS0+Y19lbnRyeV9jYWNoZSkKKwkJZ290byBmYWlsOworCisJc3Bpbl9sb2NrKCZtYl9jYWNoZV9zcGlubG9jayk7CisJbGlzdF9hZGQoJmNhY2hlLT5jX2NhY2hlX2xpc3QsICZtYl9jYWNoZV9saXN0KTsKKwlzcGluX3VubG9jaygmbWJfY2FjaGVfc3BpbmxvY2spOworCXJldHVybiBjYWNoZTsKKworZmFpbDoKKwlpZiAoY2FjaGUpIHsKKwkJd2hpbGUgKC0tbSA+PSAwKQorCQkJa2ZyZWUoY2FjaGUtPmNfaW5kZXhlc19oYXNoW21dKTsKKwkJaWYgKGNhY2hlLT5jX2Jsb2NrX2hhc2gpCisJCQlrZnJlZShjYWNoZS0+Y19ibG9ja19oYXNoKTsKKwkJa2ZyZWUoY2FjaGUpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworCisvKgorICogbWJfY2FjaGVfc2hyaW5rKCkKKyAqCisgKiBSZW1vdmVzIGFsbCBjYWNoZSBlbnRpcmVzIG9mIGEgZGV2aWNlIGZyb20gdGhlIGNhY2hlLiBBbGwgY2FjaGUgZW50cmllcworICogY3VycmVudGx5IGluIHVzZSBjYW5ub3QgYmUgZnJlZWQsIGFuZCB0aHVzIHJlbWFpbiBpbiB0aGUgY2FjaGUuIEFsbCBvdGhlcnMKKyAqIGFyZSBmcmVlZC4KKyAqCisgKiBAY2FjaGU6IHdoaWNoIGNhY2hlIHRvIHNocmluaworICogQGJkZXY6IHdoaWNoIGRldmljZSdzIGNhY2hlIGVudHJpZXMgdG8gc2hyaW5rCisgKi8KK3ZvaWQKK21iX2NhY2hlX3NocmluayhzdHJ1Y3QgbWJfY2FjaGUgKmNhY2hlLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQoreworCUxJU1RfSEVBRChmcmVlX2xpc3QpOworCXN0cnVjdCBsaXN0X2hlYWQgKmwsICpsdG1wOworCisJc3Bpbl9sb2NrKCZtYl9jYWNoZV9zcGlubG9jayk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKGwsIGx0bXAsICZtYl9jYWNoZV9scnVfbGlzdCkgeworCQlzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKmNlID0KKwkJCWxpc3RfZW50cnkobCwgc3RydWN0IG1iX2NhY2hlX2VudHJ5LCBlX2xydV9saXN0KTsKKwkJaWYgKGNlLT5lX2JkZXYgPT0gYmRldikgeworCQkJbGlzdF9tb3ZlX3RhaWwoJmNlLT5lX2xydV9saXN0LCAmZnJlZV9saXN0KTsKKwkJCV9fbWJfY2FjaGVfZW50cnlfdW5oYXNoKGNlKTsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmbWJfY2FjaGVfc3BpbmxvY2spOworCWxpc3RfZm9yX2VhY2hfc2FmZShsLCBsdG1wLCAmZnJlZV9saXN0KSB7CisJCV9fbWJfY2FjaGVfZW50cnlfZm9yZ2V0KGxpc3RfZW50cnkobCwgc3RydWN0IG1iX2NhY2hlX2VudHJ5LAorCQkJCQkJICAgZV9scnVfbGlzdCksIEdGUF9LRVJORUwpOworCX0KK30KKworCisvKgorICogbWJfY2FjaGVfZGVzdHJveSgpCisgKgorICogU2hyaW5rcyB0aGUgY2FjaGUgdG8gaXRzIG1pbmltdW0gcG9zc2libGUgc2l6ZSAoaG9wZWZ1bGx5IDAgZW50cmllcyksCisgKiBhbmQgdGhlbiBkZXN0cm95cyBpdC4gSWYgdGhpcyB3YXMgdGhlIGxhc3QgbWJjYWNoZSwgdW4tcmVnaXN0ZXJzIHRoZQorICogbWJjYWNoZSBmcm9tIGtlcm5lbCBtZW1vcnkgbWFuYWdlbWVudC4KKyAqLwordm9pZAorbWJfY2FjaGVfZGVzdHJveShzdHJ1Y3QgbWJfY2FjaGUgKmNhY2hlKQoreworCUxJU1RfSEVBRChmcmVlX2xpc3QpOworCXN0cnVjdCBsaXN0X2hlYWQgKmwsICpsdG1wOworCWludCBuOworCisJc3Bpbl9sb2NrKCZtYl9jYWNoZV9zcGlubG9jayk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKGwsIGx0bXAsICZtYl9jYWNoZV9scnVfbGlzdCkgeworCQlzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKmNlID0KKwkJCWxpc3RfZW50cnkobCwgc3RydWN0IG1iX2NhY2hlX2VudHJ5LCBlX2xydV9saXN0KTsKKwkJaWYgKGNlLT5lX2NhY2hlID09IGNhY2hlKSB7CisJCQlsaXN0X21vdmVfdGFpbCgmY2UtPmVfbHJ1X2xpc3QsICZmcmVlX2xpc3QpOworCQkJX19tYl9jYWNoZV9lbnRyeV91bmhhc2goY2UpOworCQl9CisJfQorCWxpc3RfZGVsKCZjYWNoZS0+Y19jYWNoZV9saXN0KTsKKwlzcGluX3VubG9jaygmbWJfY2FjaGVfc3BpbmxvY2spOworCisJbGlzdF9mb3JfZWFjaF9zYWZlKGwsIGx0bXAsICZmcmVlX2xpc3QpIHsKKwkJX19tYl9jYWNoZV9lbnRyeV9mb3JnZXQobGlzdF9lbnRyeShsLCBzdHJ1Y3QgbWJfY2FjaGVfZW50cnksCisJCQkJCQkgICBlX2xydV9saXN0KSwgR0ZQX0tFUk5FTCk7CisJfQorCisJaWYgKGF0b21pY19yZWFkKCZjYWNoZS0+Y19lbnRyeV9jb3VudCkgPiAwKSB7CisJCW1iX2Vycm9yKCJjYWNoZSAlczogJWQgb3JwaGFuZWQgZW50cmllcyIsCisJCQkgIGNhY2hlLT5jX25hbWUsCisJCQkgIGF0b21pY19yZWFkKCZjYWNoZS0+Y19lbnRyeV9jb3VudCkpOworCX0KKworCWttZW1fY2FjaGVfZGVzdHJveShjYWNoZS0+Y19lbnRyeV9jYWNoZSk7CisKKwlmb3IgKG49MDsgbiA8IG1iX2NhY2hlX2luZGV4ZXMoY2FjaGUpOyBuKyspCisJCWtmcmVlKGNhY2hlLT5jX2luZGV4ZXNfaGFzaFtuXSk7CisJa2ZyZWUoY2FjaGUtPmNfYmxvY2tfaGFzaCk7CisJa2ZyZWUoY2FjaGUpOworfQorCisKKy8qCisgKiBtYl9jYWNoZV9lbnRyeV9hbGxvYygpCisgKgorICogQWxsb2NhdGVzIGEgbmV3IGNhY2hlIGVudHJ5LiBUaGUgbmV3IGVudHJ5IHdpbGwgbm90IGJlIHZhbGlkIGluaXRpYWxseSwKKyAqIGFuZCB0aHVzIGNhbm5vdCBiZSBsb29rZWQgdXAgeWV0LiBJdCBzaG91bGQgYmUgZmlsbGVkIHdpdGggZGF0YSwgYW5kCisgKiB0aGVuIGluc2VydGVkIGludG8gdGhlIGNhY2hlIHVzaW5nIG1iX2NhY2hlX2VudHJ5X2luc2VydCgpLiBSZXR1cm5zIE5VTEwKKyAqIGlmIG5vIG1vcmUgbWVtb3J5IHdhcyBhdmFpbGFibGUuCisgKi8KK3N0cnVjdCBtYl9jYWNoZV9lbnRyeSAqCittYl9jYWNoZV9lbnRyeV9hbGxvYyhzdHJ1Y3QgbWJfY2FjaGUgKmNhY2hlKQoreworCXN0cnVjdCBtYl9jYWNoZV9lbnRyeSAqY2U7CisKKwlhdG9taWNfaW5jKCZjYWNoZS0+Y19lbnRyeV9jb3VudCk7CisJY2UgPSBrbWVtX2NhY2hlX2FsbG9jKGNhY2hlLT5jX2VudHJ5X2NhY2hlLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2UpIHsKKwkJSU5JVF9MSVNUX0hFQUQoJmNlLT5lX2xydV9saXN0KTsKKwkJSU5JVF9MSVNUX0hFQUQoJmNlLT5lX2Jsb2NrX2xpc3QpOworCQljZS0+ZV9jYWNoZSA9IGNhY2hlOworCQljZS0+ZV91c2VkID0gMSArIE1CX0NBQ0hFX1dSSVRFUjsKKwkJY2UtPmVfcXVldWVkID0gMDsKKwl9CisJcmV0dXJuIGNlOworfQorCisKKy8qCisgKiBtYl9jYWNoZV9lbnRyeV9pbnNlcnQoKQorICoKKyAqIEluc2VydHMgYW4gZW50cnkgdGhhdCB3YXMgYWxsb2NhdGVkIHVzaW5nIG1iX2NhY2hlX2VudHJ5X2FsbG9jKCkgaW50bworICogdGhlIGNhY2hlLiBBZnRlciB0aGlzLCB0aGUgY2FjaGUgZW50cnkgY2FuIGJlIGxvb2tlZCB1cCwgYnV0IGlzIG5vdCB5ZXQKKyAqIGluIHRoZSBscnUgbGlzdCBhcyB0aGUgY2FsbGVyIHN0aWxsIGhvbGRzIGEgaGFuZGxlIHRvIGl0LiBSZXR1cm5zIDAgb24KKyAqIHN1Y2Nlc3MsIG9yIC1FQlVTWSBpZiBhIGNhY2hlIGVudHJ5IGZvciB0aGF0IGRldmljZSArIGlub2RlIGV4aXN0cworICogYWxyZWFkeSAodGhpcyBtYXkgaGFwcGVuIGFmdGVyIGEgZmFpbGVkIGxvb2t1cCwgYnV0IHdoZW4gYW5vdGhlciBwcm9jZXNzCisgKiBoYXMgaW5zZXJ0ZWQgdGhlIHNhbWUgY2FjaGUgZW50cnkgaW4gdGhlIG1lYW50aW1lKS4KKyAqCisgKiBAYmRldjogZGV2aWNlIHRoZSBjYWNoZSBlbnRyeSBiZWxvbmdzIHRvCisgKiBAYmxvY2s6IGJsb2NrIG51bWJlcgorICogQGtleXM6IGFycmF5IG9mIGFkZGl0aW9uYWwga2V5cy4gVGhlcmUgbXVzdCBiZSBpbmRleGVzX2NvdW50IGVudHJpZXMKKyAqICAgICAgICBpbiB0aGUgYXJyYXkgKGFzIHNwZWNpZmllZCB3aGVuIGNyZWF0aW5nIHRoZSBjYWNoZSkuCisgKi8KK2ludAorbWJfY2FjaGVfZW50cnlfaW5zZXJ0KHN0cnVjdCBtYl9jYWNoZV9lbnRyeSAqY2UsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJCSAgICAgIHNlY3Rvcl90IGJsb2NrLCB1bnNpZ25lZCBpbnQga2V5c1tdKQoreworCXN0cnVjdCBtYl9jYWNoZSAqY2FjaGUgPSBjZS0+ZV9jYWNoZTsKKwl1bnNpZ25lZCBpbnQgYnVja2V0OworCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisJaW50IGVycm9yID0gLUVCVVNZLCBuOworCisJYnVja2V0ID0gaGFzaF9sb25nKCh1bnNpZ25lZCBsb25nKWJkZXYgKyAoYmxvY2sgJiAweGZmZmZmZmZmKSwgCisJCQkgICBjYWNoZS0+Y19idWNrZXRfYml0cyk7CisJc3Bpbl9sb2NrKCZtYl9jYWNoZV9zcGlubG9jayk7CisJbGlzdF9mb3JfZWFjaF9wcmV2KGwsICZjYWNoZS0+Y19ibG9ja19oYXNoW2J1Y2tldF0pIHsKKwkJc3RydWN0IG1iX2NhY2hlX2VudHJ5ICpjZSA9CisJCQlsaXN0X2VudHJ5KGwsIHN0cnVjdCBtYl9jYWNoZV9lbnRyeSwgZV9ibG9ja19saXN0KTsKKwkJaWYgKGNlLT5lX2JkZXYgPT0gYmRldiAmJiBjZS0+ZV9ibG9jayA9PSBibG9jaykKKwkJCWdvdG8gb3V0OworCX0KKwlfX21iX2NhY2hlX2VudHJ5X3VuaGFzaChjZSk7CisJY2UtPmVfYmRldiA9IGJkZXY7CisJY2UtPmVfYmxvY2sgPSBibG9jazsKKwlsaXN0X2FkZCgmY2UtPmVfYmxvY2tfbGlzdCwgJmNhY2hlLT5jX2Jsb2NrX2hhc2hbYnVja2V0XSk7CisJZm9yIChuPTA7IG48bWJfY2FjaGVfaW5kZXhlcyhjYWNoZSk7IG4rKykgeworCQljZS0+ZV9pbmRleGVzW25dLm9fa2V5ID0ga2V5c1tuXTsKKwkJYnVja2V0ID0gaGFzaF9sb25nKGtleXNbbl0sIGNhY2hlLT5jX2J1Y2tldF9iaXRzKTsKKwkJbGlzdF9hZGQoJmNlLT5lX2luZGV4ZXNbbl0ub19saXN0LAorCQkJICZjYWNoZS0+Y19pbmRleGVzX2hhc2hbbl1bYnVja2V0XSk7CisJfQorCWVycm9yID0gMDsKK291dDoKKwlzcGluX3VubG9jaygmbWJfY2FjaGVfc3BpbmxvY2spOworCXJldHVybiBlcnJvcjsKK30KKworCisvKgorICogbWJfY2FjaGVfZW50cnlfcmVsZWFzZSgpCisgKgorICogUmVsZWFzZSBhIGhhbmRsZSB0byBhIGNhY2hlIGVudHJ5LiBXaGVuIHRoZSBsYXN0IGhhbmRsZSB0byBhIGNhY2hlIGVudHJ5CisgKiBpcyByZWxlYXNlZCBpdCBpcyBlaXRoZXIgZnJlZWQgKGlmIGl0IGlzIGludmFsaWQpIG9yIG90aGVyd2lzZSBpbnNlcnRlZAorICogaW4gdG8gdGhlIGxydSBsaXN0LgorICovCit2b2lkCittYl9jYWNoZV9lbnRyeV9yZWxlYXNlKHN0cnVjdCBtYl9jYWNoZV9lbnRyeSAqY2UpCit7CisJc3Bpbl9sb2NrKCZtYl9jYWNoZV9zcGlubG9jayk7CisJX19tYl9jYWNoZV9lbnRyeV9yZWxlYXNlX3VubG9jayhjZSk7Cit9CisKKworLyoKKyAqIG1iX2NhY2hlX2VudHJ5X2ZyZWUoKQorICoKKyAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgc2VxdWVuY2UgbWJfY2FjaGVfZW50cnlfdGFrZW91dCgpIC0tCisgKiBtYl9jYWNoZV9lbnRyeV9yZWxlYXNlKCkuCisgKi8KK3ZvaWQKK21iX2NhY2hlX2VudHJ5X2ZyZWUoc3RydWN0IG1iX2NhY2hlX2VudHJ5ICpjZSkKK3sKKwlzcGluX2xvY2soJm1iX2NhY2hlX3NwaW5sb2NrKTsKKwltYl9hc3NlcnQobGlzdF9lbXB0eSgmY2UtPmVfbHJ1X2xpc3QpKTsKKwlfX21iX2NhY2hlX2VudHJ5X3VuaGFzaChjZSk7CisJX19tYl9jYWNoZV9lbnRyeV9yZWxlYXNlX3VubG9jayhjZSk7Cit9CisKKworLyoKKyAqIG1iX2NhY2hlX2VudHJ5X2dldCgpCisgKgorICogR2V0IGEgY2FjaGUgZW50cnkgIGJ5IGRldmljZSAvIGJsb2NrIG51bWJlci4gKFRoZXJlIGNhbiBvbmx5IGJlIG9uZSBlbnRyeQorICogaW4gdGhlIGNhY2hlIHBlciBkZXZpY2UgYW5kIGJsb2NrLikgUmV0dXJucyBOVUxMIGlmIG5vIHN1Y2ggY2FjaGUgZW50cnkKKyAqIGV4aXN0cy4gVGhlIHJldHVybmVkIGNhY2hlIGVudHJ5IGlzIGxvY2tlZCBmb3IgZXhjbHVzaXZlIGFjY2VzcyAoInNpbmdsZQorICogd3JpdGVyIikuCisgKi8KK3N0cnVjdCBtYl9jYWNoZV9lbnRyeSAqCittYl9jYWNoZV9lbnRyeV9nZXQoc3RydWN0IG1iX2NhY2hlICpjYWNoZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJICAgc2VjdG9yX3QgYmxvY2spCit7CisJdW5zaWduZWQgaW50IGJ1Y2tldDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsOworCXN0cnVjdCBtYl9jYWNoZV9lbnRyeSAqY2U7CisKKwlidWNrZXQgPSBoYXNoX2xvbmcoKHVuc2lnbmVkIGxvbmcpYmRldiArIChibG9jayAmIDB4ZmZmZmZmZmYpLAorCQkJICAgY2FjaGUtPmNfYnVja2V0X2JpdHMpOworCXNwaW5fbG9jaygmbWJfY2FjaGVfc3BpbmxvY2spOworCWxpc3RfZm9yX2VhY2gobCwgJmNhY2hlLT5jX2Jsb2NrX2hhc2hbYnVja2V0XSkgeworCQljZSA9IGxpc3RfZW50cnkobCwgc3RydWN0IG1iX2NhY2hlX2VudHJ5LCBlX2Jsb2NrX2xpc3QpOworCQlpZiAoY2UtPmVfYmRldiA9PSBiZGV2ICYmIGNlLT5lX2Jsb2NrID09IGJsb2NrKSB7CisJCQlERUZJTkVfV0FJVCh3YWl0KTsKKworCQkJaWYgKCFsaXN0X2VtcHR5KCZjZS0+ZV9scnVfbGlzdCkpCisJCQkJbGlzdF9kZWxfaW5pdCgmY2UtPmVfbHJ1X2xpc3QpOworCisJCQl3aGlsZSAoY2UtPmVfdXNlZCA+IDApIHsKKwkJCQljZS0+ZV9xdWV1ZWQrKzsKKwkJCQlwcmVwYXJlX3RvX3dhaXQoJm1iX2NhY2hlX3F1ZXVlLCAmd2FpdCwKKwkJCQkJCVRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCQlzcGluX3VubG9jaygmbWJfY2FjaGVfc3BpbmxvY2spOworCQkJCXNjaGVkdWxlKCk7CisJCQkJc3Bpbl9sb2NrKCZtYl9jYWNoZV9zcGlubG9jayk7CisJCQkJY2UtPmVfcXVldWVkLS07CisJCQl9CisJCQlmaW5pc2hfd2FpdCgmbWJfY2FjaGVfcXVldWUsICZ3YWl0KTsKKwkJCWNlLT5lX3VzZWQgKz0gMSArIE1CX0NBQ0hFX1dSSVRFUjsKKworCQkJaWYgKCFfX21iX2NhY2hlX2VudHJ5X2lzX2hhc2hlZChjZSkpIHsKKwkJCQlfX21iX2NhY2hlX2VudHJ5X3JlbGVhc2VfdW5sb2NrKGNlKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCWdvdG8gY2xlYW51cDsKKwkJfQorCX0KKwljZSA9IE5VTEw7CisKK2NsZWFudXA6CisJc3Bpbl91bmxvY2soJm1iX2NhY2hlX3NwaW5sb2NrKTsKKwlyZXR1cm4gY2U7Cit9CisKKyNpZiAhZGVmaW5lZChNQl9DQUNIRV9JTkRFWEVTX0NPVU5UKSB8fCAoTUJfQ0FDSEVfSU5ERVhFU19DT1VOVCA+IDApCisKK3N0YXRpYyBzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKgorX19tYl9jYWNoZV9lbnRyeV9maW5kKHN0cnVjdCBsaXN0X2hlYWQgKmwsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCisJCSAgICAgIGludCBpbmRleCwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgdW5zaWduZWQgaW50IGtleSkKK3sKKwl3aGlsZSAobCAhPSBoZWFkKSB7CisJCXN0cnVjdCBtYl9jYWNoZV9lbnRyeSAqY2UgPQorCQkJbGlzdF9lbnRyeShsLCBzdHJ1Y3QgbWJfY2FjaGVfZW50cnksCisJCQkgICAgICAgICAgIGVfaW5kZXhlc1tpbmRleF0ub19saXN0KTsKKwkJaWYgKGNlLT5lX2JkZXYgPT0gYmRldiAmJiBjZS0+ZV9pbmRleGVzW2luZGV4XS5vX2tleSA9PSBrZXkpIHsKKwkJCURFRklORV9XQUlUKHdhaXQpOworCisJCQlpZiAoIWxpc3RfZW1wdHkoJmNlLT5lX2xydV9saXN0KSkKKwkJCQlsaXN0X2RlbF9pbml0KCZjZS0+ZV9scnVfbGlzdCk7CisKKwkJCS8qIEluY3JlbWVudGluZyBiZWZvcmUgaG9sZGluZyB0aGUgbG9jayBnaXZlcyByZWFkZXJzCisJCQkgICBwcmlvcml0eSBvdmVyIHdyaXRlcnMuICovCisJCQljZS0+ZV91c2VkKys7CisJCQl3aGlsZSAoY2UtPmVfdXNlZCA+PSBNQl9DQUNIRV9XUklURVIpIHsKKwkJCQljZS0+ZV9xdWV1ZWQrKzsKKwkJCQlwcmVwYXJlX3RvX3dhaXQoJm1iX2NhY2hlX3F1ZXVlLCAmd2FpdCwKKwkJCQkJCVRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCQlzcGluX3VubG9jaygmbWJfY2FjaGVfc3BpbmxvY2spOworCQkJCXNjaGVkdWxlKCk7CisJCQkJc3Bpbl9sb2NrKCZtYl9jYWNoZV9zcGlubG9jayk7CisJCQkJY2UtPmVfcXVldWVkLS07CisJCQl9CisJCQlmaW5pc2hfd2FpdCgmbWJfY2FjaGVfcXVldWUsICZ3YWl0KTsKKworCQkJaWYgKCFfX21iX2NhY2hlX2VudHJ5X2lzX2hhc2hlZChjZSkpIHsKKwkJCQlfX21iX2NhY2hlX2VudHJ5X3JlbGVhc2VfdW5sb2NrKGNlKTsKKwkJCQlzcGluX2xvY2soJm1iX2NhY2hlX3NwaW5sb2NrKTsKKwkJCQlyZXR1cm4gRVJSX1BUUigtRUFHQUlOKTsKKwkJCX0KKwkJCXJldHVybiBjZTsKKwkJfQorCQlsID0gbC0+bmV4dDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKworLyoKKyAqIG1iX2NhY2hlX2VudHJ5X2ZpbmRfZmlyc3QoKQorICoKKyAqIEZpbmQgdGhlIGZpcnN0IGNhY2hlIGVudHJ5IG9uIGEgZ2l2ZW4gZGV2aWNlIHdpdGggYSBjZXJ0YWluIGtleSBpbgorICogYW4gYWRkaXRpb25hbCBpbmRleC4gQWRkaXRvbmFsIG1hdGNoZXMgY2FuIGJlIGZvdW5kIHdpdGgKKyAqIG1iX2NhY2hlX2VudHJ5X2ZpbmRfbmV4dCgpLiBSZXR1cm5zIE5VTEwgaWYgbm8gbWF0Y2ggd2FzIGZvdW5kLiBUaGUKKyAqIHJldHVybmVkIGNhY2hlIGVudHJ5IGlzIGxvY2tlZCBmb3Igc2hhcmVkIGFjY2VzcyAoIm11bHRpcGxlIHJlYWRlcnMiKS4KKyAqCisgKiBAY2FjaGU6IHRoZSBjYWNoZSB0byBzZWFyY2gKKyAqIEBpbmRleDogdGhlIG51bWJlciBvZiB0aGUgYWRkaXRvbmFsIGluZGV4IHRvIHNlYXJjaCAoMDw9aW5kZXg8aW5kZXhlc19jb3VudCkKKyAqIEBiZGV2OiB0aGUgZGV2aWNlIHRoZSBjYWNoZSBlbnRyeSBzaG91bGQgYmVsb25nIHRvCisgKiBAa2V5OiB0aGUga2V5IGluIHRoZSBpbmRleAorICovCitzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKgorbWJfY2FjaGVfZW50cnlfZmluZF9maXJzdChzdHJ1Y3QgbWJfY2FjaGUgKmNhY2hlLCBpbnQgaW5kZXgsCisJCQkgIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHVuc2lnbmVkIGludCBrZXkpCit7CisJdW5zaWduZWQgaW50IGJ1Y2tldCA9IGhhc2hfbG9uZyhrZXksIGNhY2hlLT5jX2J1Y2tldF9iaXRzKTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsOworCXN0cnVjdCBtYl9jYWNoZV9lbnRyeSAqY2U7CisKKwltYl9hc3NlcnQoaW5kZXggPCBtYl9jYWNoZV9pbmRleGVzKGNhY2hlKSk7CisJc3Bpbl9sb2NrKCZtYl9jYWNoZV9zcGlubG9jayk7CisJbCA9IGNhY2hlLT5jX2luZGV4ZXNfaGFzaFtpbmRleF1bYnVja2V0XS5uZXh0OworCWNlID0gX19tYl9jYWNoZV9lbnRyeV9maW5kKGwsICZjYWNoZS0+Y19pbmRleGVzX2hhc2hbaW5kZXhdW2J1Y2tldF0sCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsIGJkZXYsIGtleSk7CisJc3Bpbl91bmxvY2soJm1iX2NhY2hlX3NwaW5sb2NrKTsKKwlyZXR1cm4gY2U7Cit9CisKKworLyoKKyAqIG1iX2NhY2hlX2VudHJ5X2ZpbmRfbmV4dCgpCisgKgorICogRmluZCB0aGUgbmV4dCBjYWNoZSBlbnRyeSBvbiBhIGdpdmVuIGRldmljZSB3aXRoIGEgY2VydGFpbiBrZXkgaW4gYW4KKyAqIGFkZGl0aW9uYWwgaW5kZXguIFJldHVybnMgTlVMTCBpZiBubyBtYXRjaCBjb3VsZCBiZSBmb3VuZC4gVGhlIHByZXZpb3VzCisgKiBlbnRyeSBpcyBhdG9tYXRpY2FsbHkgcmVsZWFzZWQsIHNvIHRoYXQgbWJfY2FjaGVfZW50cnlfZmluZF9uZXh0KCkgY2FuCisgKiBiZSBjYWxsZWQgbGlrZSB0aGlzOgorICoKKyAqIGVudHJ5ID0gbWJfY2FjaGVfZW50cnlfZmluZF9maXJzdCgpOworICogd2hpbGUgKGVudHJ5KSB7CisgKiAJLi4uCisgKgllbnRyeSA9IG1iX2NhY2hlX2VudHJ5X2ZpbmRfbmV4dChlbnRyeSwgLi4uKTsKKyAqIH0KKyAqCisgKiBAcHJldjogVGhlIHByZXZpb3VzIG1hdGNoCisgKiBAaW5kZXg6IHRoZSBudW1iZXIgb2YgdGhlIGFkZGl0b25hbCBpbmRleCB0byBzZWFyY2ggKDA8PWluZGV4PGluZGV4ZXNfY291bnQpCisgKiBAYmRldjogdGhlIGRldmljZSB0aGUgY2FjaGUgZW50cnkgc2hvdWxkIGJlbG9uZyB0bworICogQGtleTogdGhlIGtleSBpbiB0aGUgaW5kZXgKKyAqLworc3RydWN0IG1iX2NhY2hlX2VudHJ5ICoKK21iX2NhY2hlX2VudHJ5X2ZpbmRfbmV4dChzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKnByZXYsIGludCBpbmRleCwKKwkJCSBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCB1bnNpZ25lZCBpbnQga2V5KQoreworCXN0cnVjdCBtYl9jYWNoZSAqY2FjaGUgPSBwcmV2LT5lX2NhY2hlOworCXVuc2lnbmVkIGludCBidWNrZXQgPSBoYXNoX2xvbmcoa2V5LCBjYWNoZS0+Y19idWNrZXRfYml0cyk7CisJc3RydWN0IGxpc3RfaGVhZCAqbDsKKwlzdHJ1Y3QgbWJfY2FjaGVfZW50cnkgKmNlOworCisJbWJfYXNzZXJ0KGluZGV4IDwgbWJfY2FjaGVfaW5kZXhlcyhjYWNoZSkpOworCXNwaW5fbG9jaygmbWJfY2FjaGVfc3BpbmxvY2spOworCWwgPSBwcmV2LT5lX2luZGV4ZXNbaW5kZXhdLm9fbGlzdC5uZXh0OworCWNlID0gX19tYl9jYWNoZV9lbnRyeV9maW5kKGwsICZjYWNoZS0+Y19pbmRleGVzX2hhc2hbaW5kZXhdW2J1Y2tldF0sCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsIGJkZXYsIGtleSk7CisJX19tYl9jYWNoZV9lbnRyeV9yZWxlYXNlX3VubG9jayhwcmV2KTsKKwlyZXR1cm4gY2U7Cit9CisKKyNlbmRpZiAgLyogIWRlZmluZWQoTUJfQ0FDSEVfSU5ERVhFU19DT1VOVCkgfHwgKE1CX0NBQ0hFX0lOREVYRVNfQ09VTlQgPiAwKSAqLworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X21iY2FjaGUodm9pZCkKK3sKKwltYl9zaHJpbmtlciA9IHNldF9zaHJpbmtlcihERUZBVUxUX1NFRUtTLCBtYl9jYWNoZV9zaHJpbmtfZm4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9tYmNhY2hlKHZvaWQpCit7CisJcmVtb3ZlX3Nocmlua2VyKG1iX3Nocmlua2VyKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9tYmNhY2hlKQorbW9kdWxlX2V4aXQoZXhpdF9tYmNhY2hlKQorCmRpZmYgLS1naXQgYS9mcy9taW5peC9NYWtlZmlsZSBiL2ZzL21pbml4L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNjMwMTUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9taW5peC9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBtaW5peCBmaWxlc3lzdGVtIHJvdXRpbmVzLgorIworCitvYmotJChDT05GSUdfTUlOSVhfRlMpICs9IG1pbml4Lm8KKworbWluaXgtb2JqcyA6PSBiaXRtYXAubyBpdHJlZV92MS5vIGl0cmVlX3YyLm8gbmFtZWkubyBpbm9kZS5vIGZpbGUubyBkaXIubwpkaWZmIC0tZ2l0IGEvZnMvbWluaXgvYml0bWFwLmMgYi9mcy9taW5peC9iaXRtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzZhNGU0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbWluaXgvYml0bWFwLmMKQEAgLTAsMCArMSwyNjkgQEAKKy8qCisgKiAgbGludXgvZnMvbWluaXgvYml0bWFwLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICovCisKKy8qCisgKiBNb2RpZmllZCBmb3IgNjgweDAgYnkgSGFtaXNoIE1hY2RvbmFsZAorICogRml4ZWQgZm9yIDY4MHgwIGJ5IEFuZHJlYXMgU2Nod2FiCisgKi8KKworLyogYml0bWFwLmMgY29udGFpbnMgdGhlIGNvZGUgdGhhdCBoYW5kbGVzIHRoZSBpbm9kZSBhbmQgYmxvY2sgYml0bWFwcyAqLworCisjaW5jbHVkZSAibWluaXguaCIKKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKK3N0YXRpYyBpbnQgbmliYmxlbWFwW10gPSB7IDQsMywzLDIsMywyLDIsMSwzLDIsMiwxLDIsMSwxLDAgfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY291bnRfZnJlZShzdHJ1Y3QgYnVmZmVyX2hlYWQgKm1hcFtdLCB1bnNpZ25lZCBudW1ibG9ja3MsIF9fdTMyIG51bWJpdHMpCit7CisJdW5zaWduZWQgaSwgaiwgc3VtID0gMDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworICAKKwlmb3IgKGk9MDsgaTxudW1ibG9ja3MtMTsgaSsrKSB7CisJCWlmICghKGJoPW1hcFtpXSkpIAorCQkJcmV0dXJuKDApOworCQlmb3IgKGo9MDsgajxCTE9DS19TSVpFOyBqKyspCisJCQlzdW0gKz0gbmliYmxlbWFwW2JoLT5iX2RhdGFbal0gJiAweGZdCisJCQkJKyBuaWJibGVtYXBbKGJoLT5iX2RhdGFbal0+PjQpICYgMHhmXTsKKwl9CisKKwlpZiAobnVtYmxvY2tzPT0wIHx8ICEoYmg9bWFwW251bWJsb2Nrcy0xXSkpCisJCXJldHVybigwKTsKKwlpID0gKChudW1iaXRzLShudW1ibG9ja3MtMSkqQkxPQ0tfU0laRSo4KS8xNikqMjsKKwlmb3IgKGo9MDsgajxpOyBqKyspIHsKKwkJc3VtICs9IG5pYmJsZW1hcFtiaC0+Yl9kYXRhW2pdICYgMHhmXQorCQkJKyBuaWJibGVtYXBbKGJoLT5iX2RhdGFbal0+PjQpICYgMHhmXTsKKwl9CisKKwlpID0gbnVtYml0cyUxNjsKKwlpZiAoaSE9MCkgeworCQlpID0gKihfX3UxNiAqKSgmYmgtPmJfZGF0YVtqXSkgfCB+KCgxPDxpKSAtIDEpOworCQlzdW0gKz0gbmliYmxlbWFwW2kgJiAweGZdICsgbmliYmxlbWFwWyhpPj40KSAmIDB4Zl07CisJCXN1bSArPSBuaWJibGVtYXBbKGk+PjgpICYgMHhmXSArIG5pYmJsZW1hcFsoaT4+MTIpICYgMHhmXTsKKwl9CisJcmV0dXJuKHN1bSk7Cit9CisKK3ZvaWQgbWluaXhfZnJlZV9ibG9jayhzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgaW50IGJsb2NrKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IG1pbml4X3NiX2luZm8gKiBzYmkgPSBtaW5peF9zYihzYik7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJdW5zaWduZWQgaW50IGJpdCx6b25lOworCisJaWYgKGJsb2NrIDwgc2JpLT5zX2ZpcnN0ZGF0YXpvbmUgfHwgYmxvY2sgPj0gc2JpLT5zX256b25lcykgeworCQlwcmludGsoInRyeWluZyB0byBmcmVlIGJsb2NrIG5vdCBpbiBkYXRhem9uZVxuIik7CisJCXJldHVybjsKKwl9CisJem9uZSA9IGJsb2NrIC0gc2JpLT5zX2ZpcnN0ZGF0YXpvbmUgKyAxOworCWJpdCA9IHpvbmUgJiA4MTkxOworCXpvbmUgPj49IDEzOworCWlmICh6b25lID49IHNiaS0+c196bWFwX2Jsb2NrcykgeworCQlwcmludGsoIm1pbml4X2ZyZWVfYmxvY2s6IG5vbmV4aXN0ZW50IGJpdG1hcCBidWZmZXJcbiIpOworCQlyZXR1cm47CisJfQorCWJoID0gc2JpLT5zX3ptYXBbem9uZV07CisJbG9ja19rZXJuZWwoKTsKKwlpZiAoIW1pbml4X3Rlc3RfYW5kX2NsZWFyX2JpdChiaXQsYmgtPmJfZGF0YSkpCisJCXByaW50aygiZnJlZV9ibG9jayAoJXM6JWQpOiBiaXQgYWxyZWFkeSBjbGVhcmVkXG4iLAorCQkgICAgICAgc2ItPnNfaWQsIGJsb2NrKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJbWFya19idWZmZXJfZGlydHkoYmgpOworCXJldHVybjsKK30KKworaW50IG1pbml4X25ld19ibG9jayhzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwlzdHJ1Y3QgbWluaXhfc2JfaW5mbyAqc2JpID0gbWluaXhfc2IoaW5vZGUtPmlfc2IpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNiaS0+c196bWFwX2Jsb2NrczsgaSsrKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBzYmktPnNfem1hcFtpXTsKKwkJaW50IGo7CisKKwkJbG9ja19rZXJuZWwoKTsKKwkJaWYgKChqID0gbWluaXhfZmluZF9maXJzdF96ZXJvX2JpdChiaC0+Yl9kYXRhLCA4MTkyKSkgPCA4MTkyKSB7CisJCQltaW5peF9zZXRfYml0KGosYmgtPmJfZGF0YSk7CisJCQl1bmxvY2tfa2VybmVsKCk7CisJCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCQlqICs9IGkqODE5MiArIHNiaS0+c19maXJzdGRhdGF6b25lLTE7CisJCQlpZiAoaiA8IHNiaS0+c19maXJzdGRhdGF6b25lIHx8IGogPj0gc2JpLT5zX256b25lcykKKwkJCQlicmVhazsKKwkJCXJldHVybiBqOworCQl9CisJCXVubG9ja19rZXJuZWwoKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGxvbmcgbWluaXhfY291bnRfZnJlZV9ibG9ja3Moc3RydWN0IG1pbml4X3NiX2luZm8gKnNiaSkKK3sKKwlyZXR1cm4gKGNvdW50X2ZyZWUoc2JpLT5zX3ptYXAsIHNiaS0+c196bWFwX2Jsb2NrcywKKwkJc2JpLT5zX256b25lcyAtIHNiaS0+c19maXJzdGRhdGF6b25lICsgMSkKKwkJPDwgc2JpLT5zX2xvZ196b25lX3NpemUpOworfQorCitzdHJ1Y3QgbWluaXhfaW5vZGUgKgorbWluaXhfVjFfcmF3X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGlub190IGlubywgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgpCit7CisJaW50IGJsb2NrOworCXN0cnVjdCBtaW5peF9zYl9pbmZvICpzYmkgPSBtaW5peF9zYihzYik7CisJc3RydWN0IG1pbml4X2lub2RlICpwOworCisJaWYgKCFpbm8gfHwgaW5vID4gc2JpLT5zX25pbm9kZXMpIHsKKwkJcHJpbnRrKCJCYWQgaW5vZGUgbnVtYmVyIG9uIGRldiAlczogJWxkIGlzIG91dCBvZiByYW5nZVxuIiwKKwkJICAgICAgIHNiLT5zX2lkLCAobG9uZylpbm8pOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaW5vLS07CisJYmxvY2sgPSAyICsgc2JpLT5zX2ltYXBfYmxvY2tzICsgc2JpLT5zX3ptYXBfYmxvY2tzICsKKwkJIGlubyAvIE1JTklYX0lOT0RFU19QRVJfQkxPQ0s7CisJKmJoID0gc2JfYnJlYWQoc2IsIGJsb2NrKTsKKwlpZiAoISpiaCkgeworCQlwcmludGsoInVuYWJsZSB0byByZWFkIGktbm9kZSBibG9ja1xuIik7CisJCXJldHVybiBOVUxMOworCX0KKwlwID0gKHZvaWQgKikoKmJoKS0+Yl9kYXRhOworCXJldHVybiBwICsgaW5vICUgTUlOSVhfSU5PREVTX1BFUl9CTE9DSzsKK30KKworc3RydWN0IG1pbml4Ml9pbm9kZSAqCittaW5peF9WMl9yYXdfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW5vX3QgaW5vLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaCkKK3sKKwlpbnQgYmxvY2s7CisJc3RydWN0IG1pbml4X3NiX2luZm8gKnNiaSA9IG1pbml4X3NiKHNiKTsKKwlzdHJ1Y3QgbWluaXgyX2lub2RlICpwOworCisJKmJoID0gTlVMTDsKKwlpZiAoIWlubyB8fCBpbm8gPiBzYmktPnNfbmlub2RlcykgeworCQlwcmludGsoIkJhZCBpbm9kZSBudW1iZXIgb24gZGV2ICVzOiAlbGQgaXMgb3V0IG9mIHJhbmdlXG4iLAorCQkgICAgICAgc2ItPnNfaWQsIChsb25nKWlubyk7CisJCXJldHVybiBOVUxMOworCX0KKwlpbm8tLTsKKwlibG9jayA9IDIgKyBzYmktPnNfaW1hcF9ibG9ja3MgKyBzYmktPnNfem1hcF9ibG9ja3MgKworCQkgaW5vIC8gTUlOSVgyX0lOT0RFU19QRVJfQkxPQ0s7CisJKmJoID0gc2JfYnJlYWQoc2IsIGJsb2NrKTsKKwlpZiAoISpiaCkgeworCQlwcmludGsoInVuYWJsZSB0byByZWFkIGktbm9kZSBibG9ja1xuIik7CisJCXJldHVybiBOVUxMOworCX0KKwlwID0gKHZvaWQgKikoKmJoKS0+Yl9kYXRhOworCXJldHVybiBwICsgaW5vICUgTUlOSVgyX0lOT0RFU19QRVJfQkxPQ0s7Cit9CisKKy8qIENsZWFyIHRoZSBsaW5rIGNvdW50IGFuZCBtb2RlIG9mIGEgZGVsZXRlZCBpbm9kZSBvbiBkaXNrLiAqLworCitzdGF0aWMgdm9pZCBtaW5peF9jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCisJaWYgKElOT0RFX1ZFUlNJT04oaW5vZGUpID09IE1JTklYX1YxKSB7CisJCXN0cnVjdCBtaW5peF9pbm9kZSAqcmF3X2lub2RlOworCQlyYXdfaW5vZGUgPSBtaW5peF9WMV9yYXdfaW5vZGUoaW5vZGUtPmlfc2IsIGlub2RlLT5pX2lubywgJmJoKTsKKwkJaWYgKHJhd19pbm9kZSkgeworCQkJcmF3X2lub2RlLT5pX25saW5rcyA9IDA7CisJCQlyYXdfaW5vZGUtPmlfbW9kZSA9IDA7CisJCX0KKwl9IGVsc2UgeworCQlzdHJ1Y3QgbWluaXgyX2lub2RlICpyYXdfaW5vZGU7CisJCXJhd19pbm9kZSA9IG1pbml4X1YyX3Jhd19pbm9kZShpbm9kZS0+aV9zYiwgaW5vZGUtPmlfaW5vLCAmYmgpOworCQlpZiAocmF3X2lub2RlKSB7CisJCQlyYXdfaW5vZGUtPmlfbmxpbmtzID0gMDsKKwkJCXJhd19pbm9kZS0+aV9tb2RlID0gMDsKKwkJfQorCX0KKwlpZiAoYmgpIHsKKwkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQlicmVsc2UgKGJoKTsKKwl9Cit9CisKK3ZvaWQgbWluaXhfZnJlZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwlzdHJ1Y3QgbWluaXhfc2JfaW5mbyAqc2JpID0gbWluaXhfc2IoaW5vZGUtPmlfc2IpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXVuc2lnbmVkIGxvbmcgaW5vOworCisJaW5vID0gaW5vZGUtPmlfaW5vOworCWlmIChpbm8gPCAxIHx8IGlubyA+IHNiaS0+c19uaW5vZGVzKSB7CisJCXByaW50aygibWluaXhfZnJlZV9pbm9kZTogaW5vZGUgMCBvciBub25leGlzdGVudCBpbm9kZVxuIik7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoKGlubyA+PiAxMykgPj0gc2JpLT5zX2ltYXBfYmxvY2tzKSB7CisJCXByaW50aygibWluaXhfZnJlZV9pbm9kZTogbm9uZXhpc3RlbnQgaW1hcCBpbiBzdXBlcmJsb2NrXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJbWluaXhfY2xlYXJfaW5vZGUoaW5vZGUpOwkvKiBjbGVhciBvbi1kaXNrIGNvcHkgKi8KKworCWJoID0gc2JpLT5zX2ltYXBbaW5vID4+IDEzXTsKKwlsb2NrX2tlcm5lbCgpOworCWlmICghbWluaXhfdGVzdF9hbmRfY2xlYXJfYml0KGlubyAmIDgxOTEsIGJoLT5iX2RhdGEpKQorCQlwcmludGsoIm1pbml4X2ZyZWVfaW5vZGU6IGJpdCAlbHUgYWxyZWFkeSBjbGVhcmVkLlxuIiwgaW5vKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJbWFya19idWZmZXJfZGlydHkoYmgpOworIG91dDoKKwljbGVhcl9pbm9kZShpbm9kZSk7CQkvKiBjbGVhciBpbi1tZW1vcnkgY29weSAqLworfQorCitzdHJ1Y3QgaW5vZGUgKiBtaW5peF9uZXdfaW5vZGUoY29uc3Qgc3RydWN0IGlub2RlICogZGlyLCBpbnQgKiBlcnJvcikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLT5pX3NiOworCXN0cnVjdCBtaW5peF9zYl9pbmZvICpzYmkgPSBtaW5peF9zYihzYik7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG5ld19pbm9kZShzYik7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJaW50IGksajsKKworCWlmICghaW5vZGUpIHsKKwkJKmVycm9yID0gLUVOT01FTTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWogPSA4MTkyOworCWJoID0gTlVMTDsKKwkqZXJyb3IgPSAtRU5PU1BDOworCWxvY2tfa2VybmVsKCk7CisJZm9yIChpID0gMDsgaSA8IHNiaS0+c19pbWFwX2Jsb2NrczsgaSsrKSB7CisJCWJoID0gc2JpLT5zX2ltYXBbaV07CisJCWlmICgoaiA9IG1pbml4X2ZpbmRfZmlyc3RfemVyb19iaXQoYmgtPmJfZGF0YSwgODE5MikpIDwgODE5MikKKwkJCWJyZWFrOworCX0KKwlpZiAoIWJoIHx8IGogPj0gODE5MikgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKG1pbml4X3Rlc3RfYW5kX3NldF9iaXQoaixiaC0+Yl9kYXRhKSkgewkvKiBzaG91bGRuJ3QgaGFwcGVuICovCisJCXByaW50aygibmV3X2lub2RlOiBiaXQgYWxyZWFkeSBzZXQiKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJaiArPSBpKjgxOTI7CisJaWYgKCFqIHx8IGogPiBzYmktPnNfbmlub2RlcykgeworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlub2RlLT5pX3VpZCA9IGN1cnJlbnQtPmZzdWlkOworCWlub2RlLT5pX2dpZCA9IChkaXItPmlfbW9kZSAmIFNfSVNHSUQpID8gZGlyLT5pX2dpZCA6IGN1cnJlbnQtPmZzZ2lkOworCWlub2RlLT5pX2lubyA9IGo7CisJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlpbm9kZS0+aV9ibG9ja3MgPSBpbm9kZS0+aV9ibGtzaXplID0gMDsKKwltZW1zZXQoJm1pbml4X2koaW5vZGUpLT51LCAwLCBzaXplb2YobWluaXhfaShpbm9kZSktPnUpKTsKKwlpbnNlcnRfaW5vZGVfaGFzaChpbm9kZSk7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisKKwkqZXJyb3IgPSAwOworCXJldHVybiBpbm9kZTsKK30KKwordW5zaWduZWQgbG9uZyBtaW5peF9jb3VudF9mcmVlX2lub2RlcyhzdHJ1Y3QgbWluaXhfc2JfaW5mbyAqc2JpKQoreworCXJldHVybiBjb3VudF9mcmVlKHNiaS0+c19pbWFwLCBzYmktPnNfaW1hcF9ibG9ja3MsIHNiaS0+c19uaW5vZGVzICsgMSk7Cit9CmRpZmYgLS1naXQgYS9mcy9taW5peC9kaXIuYyBiL2ZzL21pbml4L2Rpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMjUwMmEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9taW5peC9kaXIuYwpAQCAtMCwwICsxLDQwOSBAQAorLyoKKyAqICBsaW51eC9mcy9taW5peC9kaXIuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgbWluaXggZGlyZWN0b3J5IGhhbmRsaW5nIGZ1bmN0aW9ucworICovCisKKyNpbmNsdWRlICJtaW5peC5oIgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCit0eXBlZGVmIHN0cnVjdCBtaW5peF9kaXJfZW50cnkgbWluaXhfZGlyZW50OworCitzdGF0aWMgaW50IG1pbml4X3JlYWRkaXIoc3RydWN0IGZpbGUgKiwgdm9pZCAqLCBmaWxsZGlyX3QpOworCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1pbml4X2Rpcl9vcGVyYXRpb25zID0geworCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIJPSBtaW5peF9yZWFkZGlyLAorCS5mc3luYwkJPSBtaW5peF9zeW5jX2ZpbGUsCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgZGlyX3B1dF9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQoreworCWt1bm1hcChwYWdlKTsKKwlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIG9mZnNldCBpbnRvIHBhZ2UgYHBhZ2VfbnInIG9mIHRoZSBsYXN0IHZhbGlkCisgKiBieXRlIGluIHRoYXQgcGFnZSwgcGx1cyBvbmUuCisgKi8KK3N0YXRpYyB1bnNpZ25lZAorbWluaXhfbGFzdF9ieXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGxvbmcgcGFnZV9ucikKK3sKKwl1bnNpZ25lZCBsYXN0X2J5dGUgPSBQQUdFX0NBQ0hFX1NJWkU7CisKKwlpZiAocGFnZV9uciA9PSAoaW5vZGUtPmlfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUKSkKKwkJbGFzdF9ieXRlID0gaW5vZGUtPmlfc2l6ZSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKwlyZXR1cm4gbGFzdF9ieXRlOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZGlyX3BhZ2VzKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIChpbm9kZS0+aV9zaXplK1BBR0VfQ0FDSEVfU0laRS0xKT4+UEFHRV9DQUNIRV9TSElGVDsKK30KKworc3RhdGljIGludCBkaXJfY29tbWl0X2NodW5rKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmRpciA9IChzdHJ1Y3QgaW5vZGUgKilwYWdlLT5tYXBwaW5nLT5ob3N0OworCWludCBlcnIgPSAwOworCXBhZ2UtPm1hcHBpbmctPmFfb3BzLT5jb21taXRfd3JpdGUoTlVMTCwgcGFnZSwgZnJvbSwgdG8pOworCWlmIChJU19ESVJTWU5DKGRpcikpCisJCWVyciA9IHdyaXRlX29uZV9wYWdlKHBhZ2UsIDEpOworCWVsc2UKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBwYWdlICogZGlyX2dldF9wYWdlKHN0cnVjdCBpbm9kZSAqZGlyLCB1bnNpZ25lZCBsb25nIG4pCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBkaXItPmlfbWFwcGluZzsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHJlYWRfY2FjaGVfcGFnZShtYXBwaW5nLCBuLAorCQkJCShmaWxsZXJfdCopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlLCBOVUxMKTsKKwlpZiAoIUlTX0VSUihwYWdlKSkgeworCQl3YWl0X29uX3BhZ2VfbG9ja2VkKHBhZ2UpOworCQlrbWFwKHBhZ2UpOworCQlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkKKwkJCWdvdG8gZmFpbDsKKwl9CisJcmV0dXJuIHBhZ2U7CisKK2ZhaWw6CisJZGlyX3B1dF9wYWdlKHBhZ2UpOworCXJldHVybiBFUlJfUFRSKC1FSU8pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKm1pbml4X25leHRfZW50cnkodm9pZCAqZGUsIHN0cnVjdCBtaW5peF9zYl9pbmZvICpzYmkpCit7CisJcmV0dXJuICh2b2lkKikoKGNoYXIqKWRlICsgc2JpLT5zX2RpcnNpemUpOworfQorCitzdGF0aWMgaW50IG1pbml4X3JlYWRkaXIoc3RydWN0IGZpbGUgKiBmaWxwLCB2b2lkICogZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwl1bnNpZ25lZCBsb25nIHBvcyA9IGZpbHAtPmZfcG9zOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJdW5zaWduZWQgb2Zmc2V0ID0gcG9zICYgflBBR0VfQ0FDSEVfTUFTSzsKKwl1bnNpZ25lZCBsb25nIG4gPSBwb3MgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwl1bnNpZ25lZCBsb25nIG5wYWdlcyA9IGRpcl9wYWdlcyhpbm9kZSk7CisJc3RydWN0IG1pbml4X3NiX2luZm8gKnNiaSA9IG1pbml4X3NiKHNiKTsKKwl1bnNpZ25lZCBjaHVua19zaXplID0gc2JpLT5zX2RpcnNpemU7CisKKwlsb2NrX2tlcm5lbCgpOworCisJcG9zID0gKHBvcyArIGNodW5rX3NpemUtMSkgJiB+KGNodW5rX3NpemUtMSk7CisJaWYgKHBvcyA+PSBpbm9kZS0+aV9zaXplKQorCQlnb3RvIGRvbmU7CisKKwlmb3IgKCA7IG4gPCBucGFnZXM7IG4rKywgb2Zmc2V0ID0gMCkgeworCQljaGFyICpwLCAqa2FkZHIsICpsaW1pdDsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBkaXJfZ2V0X3BhZ2UoaW5vZGUsIG4pOworCisJCWlmIChJU19FUlIocGFnZSkpCisJCQljb250aW51ZTsKKwkJa2FkZHIgPSAoY2hhciAqKXBhZ2VfYWRkcmVzcyhwYWdlKTsKKwkJcCA9IGthZGRyK29mZnNldDsKKwkJbGltaXQgPSBrYWRkciArIG1pbml4X2xhc3RfYnl0ZShpbm9kZSwgbikgLSBjaHVua19zaXplOworCQlmb3IgKCA7IHAgPD0gbGltaXQgOyBwID0gbWluaXhfbmV4dF9lbnRyeShwLCBzYmkpKSB7CisJCQltaW5peF9kaXJlbnQgKmRlID0gKG1pbml4X2RpcmVudCAqKXA7CisJCQlpZiAoZGUtPmlub2RlKSB7CisJCQkJaW50IG92ZXI7CisJCQkJdW5zaWduZWQgbCA9IHN0cm5sZW4oZGUtPm5hbWUsc2JpLT5zX25hbWVsZW4pOworCisJCQkJb2Zmc2V0ID0gcCAtIGthZGRyOworCQkJCW92ZXIgPSBmaWxsZGlyKGRpcmVudCwgZGUtPm5hbWUsIGwsCisJCQkJCQkobjw8UEFHRV9DQUNIRV9TSElGVCkgfCBvZmZzZXQsCisJCQkJCQlkZS0+aW5vZGUsIERUX1VOS05PV04pOworCQkJCWlmIChvdmVyKSB7CisJCQkJCWRpcl9wdXRfcGFnZShwYWdlKTsKKwkJCQkJZ290byBkb25lOworCQkJCX0KKwkJCX0KKwkJfQorCQlkaXJfcHV0X3BhZ2UocGFnZSk7CisJfQorCitkb25lOgorCWZpbHAtPmZfcG9zID0gKG4gPDwgUEFHRV9DQUNIRV9TSElGVCkgfCBvZmZzZXQ7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBuYW1lY29tcGFyZShpbnQgbGVuLCBpbnQgbWF4bGVuLAorCWNvbnN0IGNoYXIgKiBuYW1lLCBjb25zdCBjaGFyICogYnVmZmVyKQoreworCWlmIChsZW4gPCBtYXhsZW4gJiYgYnVmZmVyW2xlbl0pCisJCXJldHVybiAwOworCXJldHVybiAhbWVtY21wKG5hbWUsIGJ1ZmZlciwgbGVuKTsKK30KKworLyoKKyAqCW1pbml4X2ZpbmRfZW50cnkoKQorICoKKyAqIGZpbmRzIGFuIGVudHJ5IGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IHdpdGggdGhlIHdhbnRlZCBuYW1lLiBJdAorICogcmV0dXJucyB0aGUgY2FjaGUgYnVmZmVyIGluIHdoaWNoIHRoZSBlbnRyeSB3YXMgZm91bmQsIGFuZCB0aGUgZW50cnkKKyAqIGl0c2VsZiAoYXMgYSBwYXJhbWV0ZXIgLSByZXNfZGlyKS4gSXQgZG9lcyBOT1QgcmVhZCB0aGUgaW5vZGUgb2YgdGhlCisgKiBlbnRyeSAtIHlvdSdsbCBoYXZlIHRvIGRvIHRoYXQgeW91cnNlbGYgaWYgeW91IHdhbnQgdG8uCisgKi8KK21pbml4X2RpcmVudCAqbWluaXhfZmluZF9lbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBwYWdlICoqcmVzX3BhZ2UpCit7CisJY29uc3QgY2hhciAqIG5hbWUgPSBkZW50cnktPmRfbmFtZS5uYW1lOworCWludCBuYW1lbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCXN0cnVjdCBpbm9kZSAqIGRpciA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2IgPSBkaXItPmlfc2I7CisJc3RydWN0IG1pbml4X3NiX2luZm8gKiBzYmkgPSBtaW5peF9zYihzYik7CisJdW5zaWduZWQgbG9uZyBuOworCXVuc2lnbmVkIGxvbmcgbnBhZ2VzID0gZGlyX3BhZ2VzKGRpcik7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOworCXN0cnVjdCBtaW5peF9kaXJfZW50cnkgKmRlOworCisJKnJlc19wYWdlID0gTlVMTDsKKworCWZvciAobiA9IDA7IG4gPCBucGFnZXM7IG4rKykgeworCQljaGFyICprYWRkcjsKKwkJcGFnZSA9IGRpcl9nZXRfcGFnZShkaXIsIG4pOworCQlpZiAoSVNfRVJSKHBhZ2UpKQorCQkJY29udGludWU7CisKKwkJa2FkZHIgPSAoY2hhciopcGFnZV9hZGRyZXNzKHBhZ2UpOworCQlkZSA9IChzdHJ1Y3QgbWluaXhfZGlyX2VudHJ5ICopIGthZGRyOworCQlrYWRkciArPSBtaW5peF9sYXN0X2J5dGUoZGlyLCBuKSAtIHNiaS0+c19kaXJzaXplOworCQlmb3IgKCA7IChjaGFyICopIGRlIDw9IGthZGRyIDsgZGUgPSBtaW5peF9uZXh0X2VudHJ5KGRlLHNiaSkpIHsKKwkJCWlmICghZGUtPmlub2RlKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKG5hbWVjb21wYXJlKG5hbWVsZW4sc2JpLT5zX25hbWVsZW4sbmFtZSxkZS0+bmFtZSkpCisJCQkJZ290byBmb3VuZDsKKwkJfQorCQlkaXJfcHV0X3BhZ2UocGFnZSk7CisJfQorCXJldHVybiBOVUxMOworCitmb3VuZDoKKwkqcmVzX3BhZ2UgPSBwYWdlOworCXJldHVybiBkZTsKK30KKworaW50IG1pbml4X2FkZF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmRpciA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CisJY29uc3QgY2hhciAqIG5hbWUgPSBkZW50cnktPmRfbmFtZS5uYW1lOworCWludCBuYW1lbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiID0gZGlyLT5pX3NiOworCXN0cnVjdCBtaW5peF9zYl9pbmZvICogc2JpID0gbWluaXhfc2Ioc2IpOworCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKKwlzdHJ1Y3QgbWluaXhfZGlyX2VudHJ5ICogZGU7CisJdW5zaWduZWQgbG9uZyBucGFnZXMgPSBkaXJfcGFnZXMoZGlyKTsKKwl1bnNpZ25lZCBsb25nIG47CisJY2hhciAqa2FkZHI7CisJdW5zaWduZWQgZnJvbSwgdG87CisJaW50IGVycjsKKworCS8qCisJICogV2UgdGFrZSBjYXJlIG9mIGRpcmVjdG9yeSBleHBhbnNpb24gaW4gdGhlIHNhbWUgbG9vcAorCSAqIFRoaXMgY29kZSBwbGF5cyBvdXRzaWRlIGlfc2l6ZSwgc28gaXQgbG9ja3MgdGhlIHBhZ2UKKwkgKiB0byBwcm90ZWN0IHRoYXQgcmVnaW9uLgorCSAqLworCWZvciAobiA9IDA7IG4gPD0gbnBhZ2VzOyBuKyspIHsKKwkJY2hhciAqZGlyX2VuZDsKKworCQlwYWdlID0gZGlyX2dldF9wYWdlKGRpciwgbik7CisJCWVyciA9IFBUUl9FUlIocGFnZSk7CisJCWlmIChJU19FUlIocGFnZSkpCisJCQlnb3RvIG91dDsKKwkJbG9ja19wYWdlKHBhZ2UpOworCQlrYWRkciA9IChjaGFyKilwYWdlX2FkZHJlc3MocGFnZSk7CisJCWRpcl9lbmQgPSBrYWRkciArIG1pbml4X2xhc3RfYnl0ZShkaXIsIG4pOworCQlkZSA9IChtaW5peF9kaXJlbnQgKilrYWRkcjsKKwkJa2FkZHIgKz0gUEFHRV9DQUNIRV9TSVpFIC0gc2JpLT5zX2RpcnNpemU7CisJCXdoaWxlICgoY2hhciAqKWRlIDw9IGthZGRyKSB7CisJCQlpZiAoKGNoYXIgKilkZSA9PSBkaXJfZW5kKSB7CisJCQkJLyogV2UgaGl0IGlfc2l6ZSAqLworCQkJCWRlLT5pbm9kZSA9IDA7CisJCQkJZ290byBnb3RfaXQ7CisJCQl9CisJCQlpZiAoIWRlLT5pbm9kZSkKKwkJCQlnb3RvIGdvdF9pdDsKKwkJCWVyciA9IC1FRVhJU1Q7CisJCQlpZiAobmFtZWNvbXBhcmUobmFtZWxlbixzYmktPnNfbmFtZWxlbixuYW1lLGRlLT5uYW1lKSkKKwkJCQlnb3RvIG91dF91bmxvY2s7CisJCQlkZSA9IG1pbml4X25leHRfZW50cnkoZGUsIHNiaSk7CisJCX0KKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCWRpcl9wdXRfcGFnZShwYWdlKTsKKwl9CisJQlVHKCk7CisJcmV0dXJuIC1FSU5WQUw7CisKK2dvdF9pdDoKKwlmcm9tID0gKGNoYXIqKWRlIC0gKGNoYXIqKXBhZ2VfYWRkcmVzcyhwYWdlKTsKKwl0byA9IGZyb20gKyBzYmktPnNfZGlyc2l6ZTsKKwllcnIgPSBwYWdlLT5tYXBwaW5nLT5hX29wcy0+cHJlcGFyZV93cml0ZShOVUxMLCBwYWdlLCBmcm9tLCB0byk7CisJaWYgKGVycikKKwkJZ290byBvdXRfdW5sb2NrOworCW1lbWNweSAoZGUtPm5hbWUsIG5hbWUsIG5hbWVsZW4pOworCW1lbXNldCAoZGUtPm5hbWUgKyBuYW1lbGVuLCAwLCBzYmktPnNfZGlyc2l6ZSAtIG5hbWVsZW4gLSAyKTsKKwlkZS0+aW5vZGUgPSBpbm9kZS0+aV9pbm87CisJZXJyID0gZGlyX2NvbW1pdF9jaHVuayhwYWdlLCBmcm9tLCB0byk7CisJZGlyLT5pX210aW1lID0gZGlyLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwltYXJrX2lub2RlX2RpcnR5KGRpcik7CitvdXRfcHV0OgorCWRpcl9wdXRfcGFnZShwYWdlKTsKK291dDoKKwlyZXR1cm4gZXJyOworb3V0X3VubG9jazoKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlnb3RvIG91dF9wdXQ7Cit9CisKK2ludCBtaW5peF9kZWxldGVfZW50cnkoc3RydWN0IG1pbml4X2Rpcl9lbnRyeSAqZGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gcGFnZS0+bWFwcGluZzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gKHN0cnVjdCBpbm9kZSopbWFwcGluZy0+aG9zdDsKKwljaGFyICprYWRkciA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwl1bnNpZ25lZCBmcm9tID0gKGNoYXIqKWRlIC0ga2FkZHI7CisJdW5zaWduZWQgdG8gPSBmcm9tICsgbWluaXhfc2IoaW5vZGUtPmlfc2IpLT5zX2RpcnNpemU7CisJaW50IGVycjsKKworCWxvY2tfcGFnZShwYWdlKTsKKwllcnIgPSBtYXBwaW5nLT5hX29wcy0+cHJlcGFyZV93cml0ZShOVUxMLCBwYWdlLCBmcm9tLCB0byk7CisJaWYgKGVyciA9PSAwKSB7CisJCWRlLT5pbm9kZSA9IDA7CisJCWVyciA9IGRpcl9jb21taXRfY2h1bmsocGFnZSwgZnJvbSwgdG8pOworCX0gZWxzZSB7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCX0KKwlkaXJfcHV0X3BhZ2UocGFnZSk7CisJaW5vZGUtPmlfY3RpbWUgPSBpbm9kZS0+aV9tdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJcmV0dXJuIGVycjsKK30KKworaW50IG1pbml4X21ha2VfZW1wdHkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIpCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCXN0cnVjdCBwYWdlICpwYWdlID0gZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsIDApOworCXN0cnVjdCBtaW5peF9zYl9pbmZvICogc2JpID0gbWluaXhfc2IoaW5vZGUtPmlfc2IpOworCXN0cnVjdCBtaW5peF9kaXJfZW50cnkgKiBkZTsKKwljaGFyICprYWRkcjsKKwlpbnQgZXJyOworCisJaWYgKCFwYWdlKQorCQlyZXR1cm4gLUVOT01FTTsKKwllcnIgPSBtYXBwaW5nLT5hX29wcy0+cHJlcGFyZV93cml0ZShOVUxMLCBwYWdlLCAwLCAyICogc2JpLT5zX2RpcnNpemUpOworCWlmIChlcnIpIHsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwltZW1zZXQoa2FkZHIsIDAsIFBBR0VfQ0FDSEVfU0laRSk7CisKKwlkZSA9IChzdHJ1Y3QgbWluaXhfZGlyX2VudHJ5ICopa2FkZHI7CisJZGUtPmlub2RlID0gaW5vZGUtPmlfaW5vOworCXN0cmNweShkZS0+bmFtZSwiLiIpOworCWRlID0gbWluaXhfbmV4dF9lbnRyeShkZSwgc2JpKTsKKwlkZS0+aW5vZGUgPSBkaXItPmlfaW5vOworCXN0cmNweShkZS0+bmFtZSwiLi4iKTsKKwlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisKKwllcnIgPSBkaXJfY29tbWl0X2NodW5rKHBhZ2UsIDAsIDIgKiBzYmktPnNfZGlyc2l6ZSk7CitmYWlsOgorCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogcm91dGluZSB0byBjaGVjayB0aGF0IHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IGlzIGVtcHR5IChmb3Igcm1kaXIpCisgKi8KK2ludCBtaW5peF9lbXB0eV9kaXIoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgaSwgbnBhZ2VzID0gZGlyX3BhZ2VzKGlub2RlKTsKKwlzdHJ1Y3QgbWluaXhfc2JfaW5mbyAqc2JpID0gbWluaXhfc2IoaW5vZGUtPmlfc2IpOworCisJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgaSsrKSB7CisJCWNoYXIgKmthZGRyOworCQltaW5peF9kaXJlbnQgKiBkZTsKKwkJcGFnZSA9IGRpcl9nZXRfcGFnZShpbm9kZSwgaSk7CisKKwkJaWYgKElTX0VSUihwYWdlKSkKKwkJCWNvbnRpbnVlOworCisJCWthZGRyID0gKGNoYXIgKilwYWdlX2FkZHJlc3MocGFnZSk7CisJCWRlID0gKG1pbml4X2RpcmVudCAqKWthZGRyOworCQlrYWRkciArPSBtaW5peF9sYXN0X2J5dGUoaW5vZGUsIGkpIC0gc2JpLT5zX2RpcnNpemU7CisKKwkJd2hpbGUgKChjaGFyICopZGUgPD0ga2FkZHIpIHsKKwkJCWlmIChkZS0+aW5vZGUgIT0gMCkgeworCQkJCS8qIGNoZWNrIGZvciAuIGFuZCAuLiAqLworCQkJCWlmIChkZS0+bmFtZVswXSAhPSAnLicpCisJCQkJCWdvdG8gbm90X2VtcHR5OworCQkJCWlmICghZGUtPm5hbWVbMV0pIHsKKwkJCQkJaWYgKGRlLT5pbm9kZSAhPSBpbm9kZS0+aV9pbm8pCisJCQkJCQlnb3RvIG5vdF9lbXB0eTsKKwkJCQl9IGVsc2UgaWYgKGRlLT5uYW1lWzFdICE9ICcuJykKKwkJCQkJZ290byBub3RfZW1wdHk7CisJCQkJZWxzZSBpZiAoZGUtPm5hbWVbMl0pCisJCQkJCWdvdG8gbm90X2VtcHR5OworCQkJfQorCQkJZGUgPSBtaW5peF9uZXh0X2VudHJ5KGRlLCBzYmkpOworCQl9CisJCWRpcl9wdXRfcGFnZShwYWdlKTsKKwl9CisJcmV0dXJuIDE7CisKK25vdF9lbXB0eToKKwlkaXJfcHV0X3BhZ2UocGFnZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFJlbGVhc2VzIHRoZSBwYWdlICovCit2b2lkIG1pbml4X3NldF9saW5rKHN0cnVjdCBtaW5peF9kaXJfZW50cnkgKmRlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBpbm9kZSAqZGlyID0gKHN0cnVjdCBpbm9kZSopcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3QgbWluaXhfc2JfaW5mbyAqc2JpID0gbWluaXhfc2IoZGlyLT5pX3NiKTsKKwl1bnNpZ25lZCBmcm9tID0gKGNoYXIgKilkZS0oY2hhciopcGFnZV9hZGRyZXNzKHBhZ2UpOworCXVuc2lnbmVkIHRvID0gZnJvbSArIHNiaS0+c19kaXJzaXplOworCWludCBlcnI7CisKKwlsb2NrX3BhZ2UocGFnZSk7CisJZXJyID0gcGFnZS0+bWFwcGluZy0+YV9vcHMtPnByZXBhcmVfd3JpdGUoTlVMTCwgcGFnZSwgZnJvbSwgdG8pOworCWlmIChlcnIgPT0gMCkgeworCQlkZS0+aW5vZGUgPSBpbm9kZS0+aV9pbm87CisJCWVyciA9IGRpcl9jb21taXRfY2h1bmsocGFnZSwgZnJvbSwgdG8pOworCX0gZWxzZSB7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCX0KKwlkaXJfcHV0X3BhZ2UocGFnZSk7CisJZGlyLT5pX210aW1lID0gZGlyLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwltYXJrX2lub2RlX2RpcnR5KGRpcik7Cit9CisKK3N0cnVjdCBtaW5peF9kaXJfZW50cnkgKiBtaW5peF9kb3Rkb3QgKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgcGFnZSAqKnApCit7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBkaXJfZ2V0X3BhZ2UoZGlyLCAwKTsKKwlzdHJ1Y3QgbWluaXhfc2JfaW5mbyAqc2JpID0gbWluaXhfc2IoZGlyLT5pX3NiKTsKKwlzdHJ1Y3QgbWluaXhfZGlyX2VudHJ5ICpkZSA9IE5VTEw7CisKKwlpZiAoIUlTX0VSUihwYWdlKSkgeworCQlkZSA9IG1pbml4X25leHRfZW50cnkocGFnZV9hZGRyZXNzKHBhZ2UpLCBzYmkpOworCQkqcCA9IHBhZ2U7CisJfQorCXJldHVybiBkZTsKK30KKworaW5vX3QgbWluaXhfaW5vZGVfYnlfbmFtZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJc3RydWN0IG1pbml4X2Rpcl9lbnRyeSAqZGUgPSBtaW5peF9maW5kX2VudHJ5KGRlbnRyeSwgJnBhZ2UpOworCWlub190IHJlcyA9IDA7CisKKwlpZiAoZGUpIHsKKwkJcmVzID0gZGUtPmlub2RlOworCQlkaXJfcHV0X3BhZ2UocGFnZSk7CisJfQorCXJldHVybiByZXM7Cit9CmRpZmYgLS1naXQgYS9mcy9taW5peC9maWxlLmMgYi9mcy9taW5peC9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFkNzdhYwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL21pbml4L2ZpbGUuYwpAQCAtMCwwICsxLDQ1IEBACisvKgorICogIGxpbnV4L2ZzL21pbml4L2ZpbGUuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgbWluaXggcmVndWxhciBmaWxlIGhhbmRsaW5nIHByaW1pdGl2ZXMKKyAqLworCisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4JCS8qIGZvciBmc3luY19pbm9kZV9idWZmZXJzKCkgKi8KKyNpbmNsdWRlICJtaW5peC5oIgorCisvKgorICogV2UgaGF2ZSBtb3N0bHkgTlVMTHMgaGVyZTogdGhlIGN1cnJlbnQgZGVmYXVsdHMgYXJlIE9LIGZvcgorICogdGhlIG1pbml4IGZpbGVzeXN0ZW0uCisgKi8KK2ludCBtaW5peF9zeW5jX2ZpbGUoc3RydWN0IGZpbGUgKiwgc3RydWN0IGRlbnRyeSAqLCBpbnQpOworCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1pbml4X2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlYWQJCT0gZ2VuZXJpY19maWxlX3JlYWQsCisJLndyaXRlCQk9IGdlbmVyaWNfZmlsZV93cml0ZSwKKwkubW1hcAkJPSBnZW5lcmljX2ZpbGVfbW1hcCwKKwkuZnN5bmMJCT0gbWluaXhfc3luY19maWxlLAorCS5zZW5kZmlsZQk9IGdlbmVyaWNfZmlsZV9zZW5kZmlsZSwKK307CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIG1pbml4X2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkudHJ1bmNhdGUJPSBtaW5peF90cnVuY2F0ZSwKKwkuZ2V0YXR0cgk9IG1pbml4X2dldGF0dHIsCit9OworCitpbnQgbWluaXhfc3luY19maWxlKHN0cnVjdCBmaWxlICogZmlsZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgZGF0YXN5bmMpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgZXJyOworCisJZXJyID0gc3luY19tYXBwaW5nX2J1ZmZlcnMoaW5vZGUtPmlfbWFwcGluZyk7CisJaWYgKCEoaW5vZGUtPmlfc3RhdGUgJiBJX0RJUlRZKSkKKwkJcmV0dXJuIGVycjsKKwlpZiAoZGF0YXN5bmMgJiYgIShpbm9kZS0+aV9zdGF0ZSAmIElfRElSVFlfREFUQVNZTkMpKQorCQlyZXR1cm4gZXJyOworCQorCWVyciB8PSBtaW5peF9zeW5jX2lub2RlKGlub2RlKTsKKwlyZXR1cm4gZXJyID8gLUVJTyA6IDA7Cit9CmRpZmYgLS1naXQgYS9mcy9taW5peC9pbm9kZS5jIGIvZnMvbWluaXgvaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjE4YzIxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbWluaXgvaW5vZGUuYwpAQCAtMCwwICsxLDU5OCBAQAorLyoKKyAqICBsaW51eC9mcy9taW5peC9pbm9kZS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk2ICBHZXJ0amFuIHZhbiBXaW5nZXJkZSAgICAoZ2VydGphbkBjcy52dS5ubCkKKyAqCU1pbml4IFYyIGZzIHN1cHBvcnQuCisgKgorICogIE1vZGlmaWVkIGZvciA2ODB4MCBieSBBbmRyZWFzIFNjaHdhYgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlICJtaW5peC5oIgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdodWlkLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisKK3N0YXRpYyB2b2lkIG1pbml4X3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICogaW5vZGUpOworc3RhdGljIGludCBtaW5peF93cml0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgaW50IHdhaXQpOworc3RhdGljIGludCBtaW5peF9zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1Zik7CitzdGF0aWMgaW50IG1pbml4X3JlbW91bnQgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBpbnQgKiBmbGFncywgY2hhciAqIGRhdGEpOworCitzdGF0aWMgdm9pZCBtaW5peF9kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpbm9kZS0+aV9zaXplID0gMDsKKwltaW5peF90cnVuY2F0ZShpbm9kZSk7CisJbWluaXhfZnJlZV9pbm9kZShpbm9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIG1pbml4X3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCWludCBpOworCXN0cnVjdCBtaW5peF9zYl9pbmZvICpzYmkgPSBtaW5peF9zYihzYik7CisKKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJc2JpLT5zX21zLT5zX3N0YXRlID0gc2JpLT5zX21vdW50X3N0YXRlOworCQltYXJrX2J1ZmZlcl9kaXJ0eShzYmktPnNfc2JoKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IHNiaS0+c19pbWFwX2Jsb2NrczsgaSsrKQorCQlicmVsc2Uoc2JpLT5zX2ltYXBbaV0pOworCWZvciAoaSA9IDA7IGkgPCBzYmktPnNfem1hcF9ibG9ja3M7IGkrKykKKwkJYnJlbHNlKHNiaS0+c196bWFwW2ldKTsKKwlicmVsc2UgKHNiaS0+c19zYmgpOworCWtmcmVlKHNiaS0+c19pbWFwKTsKKwlzYi0+c19mc19pbmZvID0gTlVMTDsKKwlrZnJlZShzYmkpOworCisJcmV0dXJuOworfQorCitzdGF0aWMga21lbV9jYWNoZV90ICogbWluaXhfaW5vZGVfY2FjaGVwOworCitzdGF0aWMgc3RydWN0IGlub2RlICptaW5peF9hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBtaW5peF9pbm9kZV9pbmZvICplaTsKKwllaSA9IChzdHJ1Y3QgbWluaXhfaW5vZGVfaW5mbyAqKWttZW1fY2FjaGVfYWxsb2MobWluaXhfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJaWYgKCFlaSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuICZlaS0+dmZzX2lub2RlOworfQorCitzdGF0aWMgdm9pZCBtaW5peF9kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJa21lbV9jYWNoZV9mcmVlKG1pbml4X2lub2RlX2NhY2hlcCwgbWluaXhfaShpbm9kZSkpOworfQorCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBtaW5peF9pbm9kZV9pbmZvICplaSA9IChzdHJ1Y3QgbWluaXhfaW5vZGVfaW5mbyAqKSBmb287CisKKwlpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRll8U0xBQl9DVE9SX0NPTlNUUlVDVE9SKSkgPT0KKwkgICAgU0xBQl9DVE9SX0NPTlNUUlVDVE9SKQorCQlpbm9kZV9pbml0X29uY2UoJmVpLT52ZnNfaW5vZGUpOworfQorIAorc3RhdGljIGludCBpbml0X2lub2RlY2FjaGUodm9pZCkKK3sKKwltaW5peF9pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgibWluaXhfaW5vZGVfY2FjaGUiLAorCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgbWluaXhfaW5vZGVfaW5mbyksCisJCQkJCSAgICAgMCwgU0xBQl9SRUNMQUlNX0FDQ09VTlQsCisJCQkJCSAgICAgaW5pdF9vbmNlLCBOVUxMKTsKKwlpZiAobWluaXhfaW5vZGVfY2FjaGVwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X2lub2RlY2FjaGUodm9pZCkKK3sKKwlpZiAoa21lbV9jYWNoZV9kZXN0cm95KG1pbml4X2lub2RlX2NhY2hlcCkpCisJCXByaW50ayhLRVJOX0lORk8gIm1pbml4X2lub2RlX2NhY2hlOiBub3QgYWxsIHN0cnVjdHVyZXMgd2VyZSBmcmVlZFxuIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBtaW5peF9zb3BzID0geworCS5hbGxvY19pbm9kZQk9IG1pbml4X2FsbG9jX2lub2RlLAorCS5kZXN0cm95X2lub2RlCT0gbWluaXhfZGVzdHJveV9pbm9kZSwKKwkucmVhZF9pbm9kZQk9IG1pbml4X3JlYWRfaW5vZGUsCisJLndyaXRlX2lub2RlCT0gbWluaXhfd3JpdGVfaW5vZGUsCisJLmRlbGV0ZV9pbm9kZQk9IG1pbml4X2RlbGV0ZV9pbm9kZSwKKwkucHV0X3N1cGVyCT0gbWluaXhfcHV0X3N1cGVyLAorCS5zdGF0ZnMJCT0gbWluaXhfc3RhdGZzLAorCS5yZW1vdW50X2ZzCT0gbWluaXhfcmVtb3VudCwKK307CisKK3N0YXRpYyBpbnQgbWluaXhfcmVtb3VudCAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIGludCAqIGZsYWdzLCBjaGFyICogZGF0YSkKK3sKKwlzdHJ1Y3QgbWluaXhfc2JfaW5mbyAqIHNiaSA9IG1pbml4X3NiKHNiKTsKKwlzdHJ1Y3QgbWluaXhfc3VwZXJfYmxvY2sgKiBtczsKKworCW1zID0gc2JpLT5zX21zOworCWlmICgoKmZsYWdzICYgTVNfUkRPTkxZKSA9PSAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKQorCQlyZXR1cm4gMDsKKwlpZiAoKmZsYWdzICYgTVNfUkRPTkxZKSB7CisJCWlmIChtcy0+c19zdGF0ZSAmIE1JTklYX1ZBTElEX0ZTIHx8CisJCSAgICAhKHNiaS0+c19tb3VudF9zdGF0ZSAmIE1JTklYX1ZBTElEX0ZTKSkKKwkJCXJldHVybiAwOworCQkvKiBNb3VudGluZyBhIHJ3IHBhcnRpdGlvbiByZWFkLW9ubHkuICovCisJCW1zLT5zX3N0YXRlID0gc2JpLT5zX21vdW50X3N0YXRlOworCQltYXJrX2J1ZmZlcl9kaXJ0eShzYmktPnNfc2JoKTsKKwl9IGVsc2UgeworCSAgCS8qIE1vdW50IGEgcGFydGl0aW9uIHdoaWNoIGlzIHJlYWQtb25seSwgcmVhZC13cml0ZS4gKi8KKwkJc2JpLT5zX21vdW50X3N0YXRlID0gbXMtPnNfc3RhdGU7CisJCW1zLT5zX3N0YXRlICY9IH5NSU5JWF9WQUxJRF9GUzsKKwkJbWFya19idWZmZXJfZGlydHkoc2JpLT5zX3NiaCk7CisKKwkJaWYgKCEoc2JpLT5zX21vdW50X3N0YXRlICYgTUlOSVhfVkFMSURfRlMpKQorCQkJcHJpbnRrICgiTUlOSVgtZnMgd2FybmluZzogcmVtb3VudGluZyB1bmNoZWNrZWQgZnMsICIKKwkJCQkicnVubmluZyBmc2NrIGlzIHJlY29tbWVuZGVkLlxuIik7CisJCWVsc2UgaWYgKChzYmktPnNfbW91bnRfc3RhdGUgJiBNSU5JWF9FUlJPUl9GUykpCisJCQlwcmludGsgKCJNSU5JWC1mcyB3YXJuaW5nOiByZW1vdW50aW5nIGZzIHdpdGggZXJyb3JzLCAiCisJCQkJInJ1bm5pbmcgZnNjayBpcyByZWNvbW1lbmRlZC5cbiIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtaW5peF9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBidWZmZXJfaGVhZCAqKm1hcDsKKwlzdHJ1Y3QgbWluaXhfc3VwZXJfYmxvY2sgKm1zOworCWludCBpLCBibG9jazsKKwlzdHJ1Y3QgaW5vZGUgKnJvb3RfaW5vZGU7CisJc3RydWN0IG1pbml4X3NiX2luZm8gKnNiaTsKKworCXNiaSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaW5peF9zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYmkpCisJCXJldHVybiAtRU5PTUVNOworCXMtPnNfZnNfaW5mbyA9IHNiaTsKKwltZW1zZXQoc2JpLCAwLCBzaXplb2Yoc3RydWN0IG1pbml4X3NiX2luZm8pKTsKKworCS8qIE4uQi4gVGhlc2Ugc2hvdWxkIGJlIGNvbXBpbGUtdGltZSB0ZXN0cy4KKwkgICBVbmZvcnR1bmF0ZWx5IHRoYXQgaXMgaW1wb3NzaWJsZS4gKi8KKwlpZiAoMzIgIT0gc2l6ZW9mIChzdHJ1Y3QgbWluaXhfaW5vZGUpKQorCQlwYW5pYygiYmFkIFYxIGktbm9kZSBzaXplIik7CisJaWYgKDY0ICE9IHNpemVvZihzdHJ1Y3QgbWluaXgyX2lub2RlKSkKKwkJcGFuaWMoImJhZCBWMiBpLW5vZGUgc2l6ZSIpOworCisJaWYgKCFzYl9zZXRfYmxvY2tzaXplKHMsIEJMT0NLX1NJWkUpKQorCQlnb3RvIG91dF9iYWRfaGJsb2NrOworCisJaWYgKCEoYmggPSBzYl9icmVhZChzLCAxKSkpCisJCWdvdG8gb3V0X2JhZF9zYjsKKworCW1zID0gKHN0cnVjdCBtaW5peF9zdXBlcl9ibG9jayAqKSBiaC0+Yl9kYXRhOworCXNiaS0+c19tcyA9IG1zOworCXNiaS0+c19zYmggPSBiaDsKKwlzYmktPnNfbW91bnRfc3RhdGUgPSBtcy0+c19zdGF0ZTsKKwlzYmktPnNfbmlub2RlcyA9IG1zLT5zX25pbm9kZXM7CisJc2JpLT5zX256b25lcyA9IG1zLT5zX256b25lczsKKwlzYmktPnNfaW1hcF9ibG9ja3MgPSBtcy0+c19pbWFwX2Jsb2NrczsKKwlzYmktPnNfem1hcF9ibG9ja3MgPSBtcy0+c196bWFwX2Jsb2NrczsKKwlzYmktPnNfZmlyc3RkYXRhem9uZSA9IG1zLT5zX2ZpcnN0ZGF0YXpvbmU7CisJc2JpLT5zX2xvZ196b25lX3NpemUgPSBtcy0+c19sb2dfem9uZV9zaXplOworCXNiaS0+c19tYXhfc2l6ZSA9IG1zLT5zX21heF9zaXplOworCXMtPnNfbWFnaWMgPSBtcy0+c19tYWdpYzsKKwlpZiAocy0+c19tYWdpYyA9PSBNSU5JWF9TVVBFUl9NQUdJQykgeworCQlzYmktPnNfdmVyc2lvbiA9IE1JTklYX1YxOworCQlzYmktPnNfZGlyc2l6ZSA9IDE2OworCQlzYmktPnNfbmFtZWxlbiA9IDE0OworCQlzYmktPnNfbGlua19tYXggPSBNSU5JWF9MSU5LX01BWDsKKwl9IGVsc2UgaWYgKHMtPnNfbWFnaWMgPT0gTUlOSVhfU1VQRVJfTUFHSUMyKSB7CisJCXNiaS0+c192ZXJzaW9uID0gTUlOSVhfVjE7CisJCXNiaS0+c19kaXJzaXplID0gMzI7CisJCXNiaS0+c19uYW1lbGVuID0gMzA7CisJCXNiaS0+c19saW5rX21heCA9IE1JTklYX0xJTktfTUFYOworCX0gZWxzZSBpZiAocy0+c19tYWdpYyA9PSBNSU5JWDJfU1VQRVJfTUFHSUMpIHsKKwkJc2JpLT5zX3ZlcnNpb24gPSBNSU5JWF9WMjsKKwkJc2JpLT5zX256b25lcyA9IG1zLT5zX3pvbmVzOworCQlzYmktPnNfZGlyc2l6ZSA9IDE2OworCQlzYmktPnNfbmFtZWxlbiA9IDE0OworCQlzYmktPnNfbGlua19tYXggPSBNSU5JWDJfTElOS19NQVg7CisJfSBlbHNlIGlmIChzLT5zX21hZ2ljID09IE1JTklYMl9TVVBFUl9NQUdJQzIpIHsKKwkJc2JpLT5zX3ZlcnNpb24gPSBNSU5JWF9WMjsKKwkJc2JpLT5zX256b25lcyA9IG1zLT5zX3pvbmVzOworCQlzYmktPnNfZGlyc2l6ZSA9IDMyOworCQlzYmktPnNfbmFtZWxlbiA9IDMwOworCQlzYmktPnNfbGlua19tYXggPSBNSU5JWDJfTElOS19NQVg7CisJfSBlbHNlCisJCWdvdG8gb3V0X25vX2ZzOworCisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUgYnVmZmVyIG1hcCB0byBrZWVwIHRoZSBzdXBlcmJsb2NrIHNtYWxsLgorCSAqLworCWkgPSAoc2JpLT5zX2ltYXBfYmxvY2tzICsgc2JpLT5zX3ptYXBfYmxvY2tzKSAqIHNpemVvZihiaCk7CisJbWFwID0ga21hbGxvYyhpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1hcCkKKwkJZ290byBvdXRfbm9fbWFwOworCW1lbXNldChtYXAsIDAsIGkpOworCXNiaS0+c19pbWFwID0gJm1hcFswXTsKKwlzYmktPnNfem1hcCA9ICZtYXBbc2JpLT5zX2ltYXBfYmxvY2tzXTsKKworCWJsb2NrPTI7CisJZm9yIChpPTAgOyBpIDwgc2JpLT5zX2ltYXBfYmxvY2tzIDsgaSsrKSB7CisJCWlmICghKHNiaS0+c19pbWFwW2ldPXNiX2JyZWFkKHMsIGJsb2NrKSkpCisJCQlnb3RvIG91dF9ub19iaXRtYXA7CisJCWJsb2NrKys7CisJfQorCWZvciAoaT0wIDsgaSA8IHNiaS0+c196bWFwX2Jsb2NrcyA7IGkrKykgeworCQlpZiAoIShzYmktPnNfem1hcFtpXT1zYl9icmVhZChzLCBibG9jaykpKQorCQkJZ290byBvdXRfbm9fYml0bWFwOworCQlibG9jaysrOworCX0KKworCW1pbml4X3NldF9iaXQoMCxzYmktPnNfaW1hcFswXS0+Yl9kYXRhKTsKKwltaW5peF9zZXRfYml0KDAsc2JpLT5zX3ptYXBbMF0tPmJfZGF0YSk7CisKKwkvKiBzZXQgdXAgZW5vdWdoIHNvIHRoYXQgaXQgY2FuIHJlYWQgYW4gaW5vZGUgKi8KKwlzLT5zX29wID0gJm1pbml4X3NvcHM7CisJcm9vdF9pbm9kZSA9IGlnZXQocywgTUlOSVhfUk9PVF9JTk8pOworCWlmICghcm9vdF9pbm9kZSB8fCBpc19iYWRfaW5vZGUocm9vdF9pbm9kZSkpCisJCWdvdG8gb3V0X25vX3Jvb3Q7CisKKwlzLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdF9pbm9kZSk7CisJaWYgKCFzLT5zX3Jvb3QpCisJCWdvdG8gb3V0X2lwdXQ7CisKKwlpZiAoIU5PX1RSVU5DQVRFKQorCQlzLT5zX3Jvb3QtPmRfb3AgPSAmbWluaXhfZGVudHJ5X29wZXJhdGlvbnM7CisKKwlpZiAoIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQltcy0+c19zdGF0ZSAmPSB+TUlOSVhfVkFMSURfRlM7CisJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwl9CisJaWYgKCEoc2JpLT5zX21vdW50X3N0YXRlICYgTUlOSVhfVkFMSURfRlMpKQorCQlwcmludGsgKCJNSU5JWC1mczogbW91bnRpbmcgdW5jaGVja2VkIGZpbGUgc3lzdGVtLCAiCisJCQkicnVubmluZyBmc2NrIGlzIHJlY29tbWVuZGVkLlxuIik7CisgCWVsc2UgaWYgKHNiaS0+c19tb3VudF9zdGF0ZSAmIE1JTklYX0VSUk9SX0ZTKQorCQlwcmludGsgKCJNSU5JWC1mczogbW91bnRpbmcgZmlsZSBzeXN0ZW0gd2l0aCBlcnJvcnMsICIKKwkJCSJydW5uaW5nIGZzY2sgaXMgcmVjb21tZW5kZWQuXG4iKTsKKwlyZXR1cm4gMDsKKworb3V0X2lwdXQ6CisJaXB1dChyb290X2lub2RlKTsKKwlnb3RvIG91dF9mcmVlbWFwOworCitvdXRfbm9fcm9vdDoKKwlpZiAoIXNpbGVudCkKKwkJcHJpbnRrKCJNSU5JWC1mczogZ2V0IHJvb3QgaW5vZGUgZmFpbGVkXG4iKTsKKwlnb3RvIG91dF9mcmVlbWFwOworCitvdXRfbm9fYml0bWFwOgorCXByaW50aygiTUlOSVgtZnM6IGJhZCBzdXBlcmJsb2NrIG9yIHVuYWJsZSB0byByZWFkIGJpdG1hcHNcbiIpOworICAgIG91dF9mcmVlbWFwOgorCWZvciAoaSA9IDA7IGkgPCBzYmktPnNfaW1hcF9ibG9ja3M7IGkrKykKKwkJYnJlbHNlKHNiaS0+c19pbWFwW2ldKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2JpLT5zX3ptYXBfYmxvY2tzOyBpKyspCisJCWJyZWxzZShzYmktPnNfem1hcFtpXSk7CisJa2ZyZWUoc2JpLT5zX2ltYXApOworCWdvdG8gb3V0X3JlbGVhc2U7CisKK291dF9ub19tYXA6CisJaWYgKCFzaWxlbnQpCisJCXByaW50ayAoIk1JTklYLWZzOiBjYW4ndCBhbGxvY2F0ZSBtYXBcbiIpOworCWdvdG8gb3V0X3JlbGVhc2U7CisKK291dF9ub19mczoKKwlpZiAoIXNpbGVudCkKKwkJcHJpbnRrKCJWRlM6IENhbid0IGZpbmQgYSBNaW5peCBvciBNaW5peCBWMiBmaWxlc3lzdGVtIG9uIGRldmljZSAiCisJCSAgICAgICAiJXMuXG4iLCBzLT5zX2lkKTsKKyAgICBvdXRfcmVsZWFzZToKKwlicmVsc2UoYmgpOworCWdvdG8gb3V0OworCitvdXRfYmFkX2hibG9jazoKKwlwcmludGsoIk1JTklYLWZzOiBibG9ja3NpemUgdG9vIHNtYWxsIGZvciBkZXZpY2UuXG4iKTsKKwlnb3RvIG91dDsKKworb3V0X2JhZF9zYjoKKwlwcmludGsoIk1JTklYLWZzOiB1bmFibGUgdG8gcmVhZCBzdXBlcmJsb2NrXG4iKTsKKyBvdXQ6CisJcy0+c19mc19pbmZvID0gTlVMTDsKKwlrZnJlZShzYmkpOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IG1pbml4X3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQoreworCXN0cnVjdCBtaW5peF9zYl9pbmZvICpzYmkgPSBtaW5peF9zYihzYik7CisJYnVmLT5mX3R5cGUgPSBzYi0+c19tYWdpYzsKKwlidWYtPmZfYnNpemUgPSBzYi0+c19ibG9ja3NpemU7CisJYnVmLT5mX2Jsb2NrcyA9IChzYmktPnNfbnpvbmVzIC0gc2JpLT5zX2ZpcnN0ZGF0YXpvbmUpIDw8IHNiaS0+c19sb2dfem9uZV9zaXplOworCWJ1Zi0+Zl9iZnJlZSA9IG1pbml4X2NvdW50X2ZyZWVfYmxvY2tzKHNiaSk7CisJYnVmLT5mX2JhdmFpbCA9IGJ1Zi0+Zl9iZnJlZTsKKwlidWYtPmZfZmlsZXMgPSBzYmktPnNfbmlub2RlczsKKwlidWYtPmZfZmZyZWUgPSBtaW5peF9jb3VudF9mcmVlX2lub2RlcyhzYmkpOworCWJ1Zi0+Zl9uYW1lbGVuID0gc2JpLT5zX25hbWVsZW47CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWluaXhfZ2V0X2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGJsb2NrLAorCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpCit7CisJaWYgKElOT0RFX1ZFUlNJT04oaW5vZGUpID09IE1JTklYX1YxKQorCQlyZXR1cm4gVjFfbWluaXhfZ2V0X2Jsb2NrKGlub2RlLCBibG9jaywgYmhfcmVzdWx0LCBjcmVhdGUpOworCWVsc2UKKwkJcmV0dXJuIFYyX21pbml4X2dldF9ibG9jayhpbm9kZSwgYmxvY2ssIGJoX3Jlc3VsdCwgY3JlYXRlKTsKK30KKworc3RhdGljIGludCBtaW5peF93cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCXJldHVybiBibG9ja193cml0ZV9mdWxsX3BhZ2UocGFnZSwgbWluaXhfZ2V0X2Jsb2NrLCB3YmMpOworfQorc3RhdGljIGludCBtaW5peF9yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJuIGJsb2NrX3JlYWRfZnVsbF9wYWdlKHBhZ2UsbWluaXhfZ2V0X2Jsb2NrKTsKK30KK3N0YXRpYyBpbnQgbWluaXhfcHJlcGFyZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCXJldHVybiBibG9ja19wcmVwYXJlX3dyaXRlKHBhZ2UsZnJvbSx0byxtaW5peF9nZXRfYmxvY2spOworfQorc3RhdGljIHNlY3Rvcl90IG1pbml4X2JtYXAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHNlY3Rvcl90IGJsb2NrKQoreworCXJldHVybiBnZW5lcmljX2Jsb2NrX2JtYXAobWFwcGluZyxibG9jayxtaW5peF9nZXRfYmxvY2spOworfQorc3RhdGljIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgbWluaXhfYW9wcyA9IHsKKwkucmVhZHBhZ2UgPSBtaW5peF9yZWFkcGFnZSwKKwkud3JpdGVwYWdlID0gbWluaXhfd3JpdGVwYWdlLAorCS5zeW5jX3BhZ2UgPSBibG9ja19zeW5jX3BhZ2UsCisJLnByZXBhcmVfd3JpdGUgPSBtaW5peF9wcmVwYXJlX3dyaXRlLAorCS5jb21taXRfd3JpdGUgPSBnZW5lcmljX2NvbW1pdF93cml0ZSwKKwkuYm1hcCA9IG1pbml4X2JtYXAKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBtaW5peF9zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnJlYWRsaW5rCT0gZ2VuZXJpY19yZWFkbGluaywKKwkuZm9sbG93X2xpbmsJPSBwYWdlX2ZvbGxvd19saW5rX2xpZ2h0LAorCS5wdXRfbGluawk9IHBhZ2VfcHV0X2xpbmssCisJLmdldGF0dHIJPSBtaW5peF9nZXRhdHRyLAorfTsKKwordm9pZCBtaW5peF9zZXRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgZGV2X3QgcmRldikKK3sKKwlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgeworCQlpbm9kZS0+aV9vcCA9ICZtaW5peF9maWxlX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZtaW5peF9maWxlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJm1pbml4X2FvcHM7CisJfSBlbHNlIGlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCWlub2RlLT5pX29wID0gJm1pbml4X2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9mb3AgPSAmbWluaXhfZGlyX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJm1pbml4X2FvcHM7CisJfSBlbHNlIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKSB7CisJCWlub2RlLT5pX29wID0gJm1pbml4X3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmbWluaXhfYW9wczsKKwl9IGVsc2UKKwkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLCByZGV2KTsKK30KKworLyoKKyAqIFRoZSBtaW5peCBWMSBmdW5jdGlvbiB0byByZWFkIGFuIGlub2RlLgorICovCitzdGF0aWMgdm9pZCBWMV9taW5peF9yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXN0cnVjdCBtaW5peF9pbm9kZSAqIHJhd19pbm9kZTsKKwlzdHJ1Y3QgbWluaXhfaW5vZGVfaW5mbyAqbWluaXhfaW5vZGUgPSBtaW5peF9pKGlub2RlKTsKKwlpbnQgaTsKKworCXJhd19pbm9kZSA9IG1pbml4X1YxX3Jhd19pbm9kZShpbm9kZS0+aV9zYiwgaW5vZGUtPmlfaW5vLCAmYmgpOworCWlmICghcmF3X2lub2RlKSB7CisJCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwkJcmV0dXJuOworCX0KKwlpbm9kZS0+aV9tb2RlID0gcmF3X2lub2RlLT5pX21vZGU7CisJaW5vZGUtPmlfdWlkID0gKHVpZF90KXJhd19pbm9kZS0+aV91aWQ7CisJaW5vZGUtPmlfZ2lkID0gKGdpZF90KXJhd19pbm9kZS0+aV9naWQ7CisJaW5vZGUtPmlfbmxpbmsgPSByYXdfaW5vZGUtPmlfbmxpbmtzOworCWlub2RlLT5pX3NpemUgPSByYXdfaW5vZGUtPmlfc2l6ZTsKKwlpbm9kZS0+aV9tdGltZS50dl9zZWMgPSBpbm9kZS0+aV9hdGltZS50dl9zZWMgPSBpbm9kZS0+aV9jdGltZS50dl9zZWMgPSByYXdfaW5vZGUtPmlfdGltZTsKKwlpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gMDsKKwlpbm9kZS0+aV9hdGltZS50dl9uc2VjID0gMDsKKwlpbm9kZS0+aV9jdGltZS50dl9uc2VjID0gMDsKKwlpbm9kZS0+aV9ibG9ja3MgPSBpbm9kZS0+aV9ibGtzaXplID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKQorCQltaW5peF9pbm9kZS0+dS5pMV9kYXRhW2ldID0gcmF3X2lub2RlLT5pX3pvbmVbaV07CisJbWluaXhfc2V0X2lub2RlKGlub2RlLCBvbGRfZGVjb2RlX2RldihyYXdfaW5vZGUtPmlfem9uZVswXSkpOworCWJyZWxzZShiaCk7Cit9CisKKy8qCisgKiBUaGUgbWluaXggVjIgZnVuY3Rpb24gdG8gcmVhZCBhbiBpbm9kZS4KKyAqLworc3RhdGljIHZvaWQgVjJfbWluaXhfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlzdHJ1Y3QgbWluaXgyX2lub2RlICogcmF3X2lub2RlOworCXN0cnVjdCBtaW5peF9pbm9kZV9pbmZvICptaW5peF9pbm9kZSA9IG1pbml4X2koaW5vZGUpOworCWludCBpOworCisJcmF3X2lub2RlID0gbWluaXhfVjJfcmF3X2lub2RlKGlub2RlLT5pX3NiLCBpbm9kZS0+aV9pbm8sICZiaCk7CisJaWYgKCFyYXdfaW5vZGUpIHsKKwkJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCQlyZXR1cm47CisJfQorCWlub2RlLT5pX21vZGUgPSByYXdfaW5vZGUtPmlfbW9kZTsKKwlpbm9kZS0+aV91aWQgPSAodWlkX3QpcmF3X2lub2RlLT5pX3VpZDsKKwlpbm9kZS0+aV9naWQgPSAoZ2lkX3QpcmF3X2lub2RlLT5pX2dpZDsKKwlpbm9kZS0+aV9ubGluayA9IHJhd19pbm9kZS0+aV9ubGlua3M7CisJaW5vZGUtPmlfc2l6ZSA9IHJhd19pbm9kZS0+aV9zaXplOworCWlub2RlLT5pX210aW1lLnR2X3NlYyA9IHJhd19pbm9kZS0+aV9tdGltZTsKKwlpbm9kZS0+aV9hdGltZS50dl9zZWMgPSByYXdfaW5vZGUtPmlfYXRpbWU7CisJaW5vZGUtPmlfY3RpbWUudHZfc2VjID0gcmF3X2lub2RlLT5pX2N0aW1lOworCWlub2RlLT5pX210aW1lLnR2X25zZWMgPSAwOworCWlub2RlLT5pX2F0aW1lLnR2X25zZWMgPSAwOworCWlub2RlLT5pX2N0aW1lLnR2X25zZWMgPSAwOworCWlub2RlLT5pX2Jsb2NrcyA9IGlub2RlLT5pX2Jsa3NpemUgPSAwOworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQorCQltaW5peF9pbm9kZS0+dS5pMl9kYXRhW2ldID0gcmF3X2lub2RlLT5pX3pvbmVbaV07CisJbWluaXhfc2V0X2lub2RlKGlub2RlLCBvbGRfZGVjb2RlX2RldihyYXdfaW5vZGUtPmlfem9uZVswXSkpOworCWJyZWxzZShiaCk7Cit9CisKKy8qCisgKiBUaGUgZ2xvYmFsIGZ1bmN0aW9uIHRvIHJlYWQgYW4gaW5vZGUuCisgKi8KK3N0YXRpYyB2b2lkIG1pbml4X3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJaWYgKElOT0RFX1ZFUlNJT04oaW5vZGUpID09IE1JTklYX1YxKQorCQlWMV9taW5peF9yZWFkX2lub2RlKGlub2RlKTsKKwllbHNlCisJCVYyX21pbml4X3JlYWRfaW5vZGUoaW5vZGUpOworfQorCisvKgorICogVGhlIG1pbml4IFYxIGZ1bmN0aW9uIHRvIHN5bmNocm9uaXplIGFuIGlub2RlLgorICovCitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICogVjFfbWluaXhfdXBkYXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXN0cnVjdCBtaW5peF9pbm9kZSAqIHJhd19pbm9kZTsKKwlzdHJ1Y3QgbWluaXhfaW5vZGVfaW5mbyAqbWluaXhfaW5vZGUgPSBtaW5peF9pKGlub2RlKTsKKwlpbnQgaTsKKworCXJhd19pbm9kZSA9IG1pbml4X1YxX3Jhd19pbm9kZShpbm9kZS0+aV9zYiwgaW5vZGUtPmlfaW5vLCAmYmgpOworCWlmICghcmF3X2lub2RlKQorCQlyZXR1cm4gTlVMTDsKKwlyYXdfaW5vZGUtPmlfbW9kZSA9IGlub2RlLT5pX21vZGU7CisJcmF3X2lub2RlLT5pX3VpZCA9IGZzX2hpZ2gybG93dWlkKGlub2RlLT5pX3VpZCk7CisJcmF3X2lub2RlLT5pX2dpZCA9IGZzX2hpZ2gybG93Z2lkKGlub2RlLT5pX2dpZCk7CisJcmF3X2lub2RlLT5pX25saW5rcyA9IGlub2RlLT5pX25saW5rOworCXJhd19pbm9kZS0+aV9zaXplID0gaW5vZGUtPmlfc2l6ZTsKKwlyYXdfaW5vZGUtPmlfdGltZSA9IGlub2RlLT5pX210aW1lLnR2X3NlYzsKKwlpZiAoU19JU0NIUihpbm9kZS0+aV9tb2RlKSB8fCBTX0lTQkxLKGlub2RlLT5pX21vZGUpKQorCQlyYXdfaW5vZGUtPmlfem9uZVswXSA9IG9sZF9lbmNvZGVfZGV2KGlub2RlLT5pX3JkZXYpOworCWVsc2UgZm9yIChpID0gMDsgaSA8IDk7IGkrKykKKwkJcmF3X2lub2RlLT5pX3pvbmVbaV0gPSBtaW5peF9pbm9kZS0+dS5pMV9kYXRhW2ldOworCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwlyZXR1cm4gYmg7Cit9CisKKy8qCisgKiBUaGUgbWluaXggVjIgZnVuY3Rpb24gdG8gc3luY2hyb25pemUgYW4gaW5vZGUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBWMl9taW5peF91cGRhdGVfaW5vZGUoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJc3RydWN0IG1pbml4Ml9pbm9kZSAqIHJhd19pbm9kZTsKKwlzdHJ1Y3QgbWluaXhfaW5vZGVfaW5mbyAqbWluaXhfaW5vZGUgPSBtaW5peF9pKGlub2RlKTsKKwlpbnQgaTsKKworCXJhd19pbm9kZSA9IG1pbml4X1YyX3Jhd19pbm9kZShpbm9kZS0+aV9zYiwgaW5vZGUtPmlfaW5vLCAmYmgpOworCWlmICghcmF3X2lub2RlKQorCQlyZXR1cm4gTlVMTDsKKwlyYXdfaW5vZGUtPmlfbW9kZSA9IGlub2RlLT5pX21vZGU7CisJcmF3X2lub2RlLT5pX3VpZCA9IGZzX2hpZ2gybG93dWlkKGlub2RlLT5pX3VpZCk7CisJcmF3X2lub2RlLT5pX2dpZCA9IGZzX2hpZ2gybG93Z2lkKGlub2RlLT5pX2dpZCk7CisJcmF3X2lub2RlLT5pX25saW5rcyA9IGlub2RlLT5pX25saW5rOworCXJhd19pbm9kZS0+aV9zaXplID0gaW5vZGUtPmlfc2l6ZTsKKwlyYXdfaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9tdGltZS50dl9zZWM7CisJcmF3X2lub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfYXRpbWUudHZfc2VjOworCXJhd19pbm9kZS0+aV9jdGltZSA9IGlub2RlLT5pX2N0aW1lLnR2X3NlYzsKKwlpZiAoU19JU0NIUihpbm9kZS0+aV9tb2RlKSB8fCBTX0lTQkxLKGlub2RlLT5pX21vZGUpKQorCQlyYXdfaW5vZGUtPmlfem9uZVswXSA9IG9sZF9lbmNvZGVfZGV2KGlub2RlLT5pX3JkZXYpOworCWVsc2UgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCisJCXJhd19pbm9kZS0+aV96b25lW2ldID0gbWluaXhfaW5vZGUtPnUuaTJfZGF0YVtpXTsKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJcmV0dXJuIGJoOworfQorCitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICptaW5peF91cGRhdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpZiAoSU5PREVfVkVSU0lPTihpbm9kZSkgPT0gTUlOSVhfVjEpCisJCXJldHVybiBWMV9taW5peF91cGRhdGVfaW5vZGUoaW5vZGUpOworCWVsc2UKKwkJcmV0dXJuIFYyX21pbml4X3VwZGF0ZV9pbm9kZShpbm9kZSk7Cit9CisKK3N0YXRpYyBpbnQgbWluaXhfd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICogaW5vZGUsIGludCB3YWl0KQoreworCWJyZWxzZShtaW5peF91cGRhdGVfaW5vZGUoaW5vZGUpKTsKKwlyZXR1cm4gMDsKK30KKworaW50IG1pbml4X3N5bmNfaW5vZGUoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCWJoID0gbWluaXhfdXBkYXRlX2lub2RlKGlub2RlKTsKKwlpZiAoYmggJiYgYnVmZmVyX2RpcnR5KGJoKSkKKwl7CisJCXN5bmNfZGlydHlfYnVmZmVyKGJoKTsKKwkJaWYgKGJ1ZmZlcl9yZXEoYmgpICYmICFidWZmZXJfdXB0b2RhdGUoYmgpKQorCQl7CisJCQlwcmludGsgKCJJTyBlcnJvciBzeW5jaW5nIG1pbml4IGlub2RlIFslczolMDhseF1cbiIsCisJCQkJaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubyk7CisJCQllcnIgPSAtMTsKKwkJfQorCX0KKwllbHNlIGlmICghYmgpCisJCWVyciA9IC0xOworCWJyZWxzZSAoYmgpOworCXJldHVybiBlcnI7Cit9CisKK2ludCBtaW5peF9nZXRhdHRyKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdCAqc3RhdCkKK3sKKwlnZW5lcmljX2ZpbGxhdHRyKGRlbnRyeS0+ZF9pbm9kZSwgc3RhdCk7CisJaWYgKElOT0RFX1ZFUlNJT04oZGVudHJ5LT5kX2lub2RlKSA9PSBNSU5JWF9WMSkKKwkJc3RhdC0+YmxvY2tzID0gKEJMT0NLX1NJWkUgLyA1MTIpICogVjFfbWluaXhfYmxvY2tzKHN0YXQtPnNpemUpOworCWVsc2UKKwkJc3RhdC0+YmxvY2tzID0gKEJMT0NLX1NJWkUgLyA1MTIpICogVjJfbWluaXhfYmxvY2tzKHN0YXQtPnNpemUpOworCXN0YXQtPmJsa3NpemUgPSBCTE9DS19TSVpFOworCXJldHVybiAwOworfQorCisvKgorICogVGhlIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIGZvciBmaWxlIHRydW5jYXRpb24uCisgKi8KK3ZvaWQgbWluaXhfdHJ1bmNhdGUoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJaWYgKCEoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSB8fCBTX0lTRElSKGlub2RlLT5pX21vZGUpIHx8IFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpKQorCQlyZXR1cm47CisJaWYgKElOT0RFX1ZFUlNJT04oaW5vZGUpID09IE1JTklYX1YxKQorCQlWMV9taW5peF90cnVuY2F0ZShpbm9kZSk7CisJZWxzZQorCQlWMl9taW5peF90cnVuY2F0ZShpbm9kZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKm1pbml4X2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoreworCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIG1pbml4X2ZpbGxfc3VwZXIpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgbWluaXhfZnNfdHlwZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gIm1pbml4IiwKKwkuZ2V0X3NiCQk9IG1pbml4X2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfYmxvY2tfc3VwZXIsCisJLmZzX2ZsYWdzCT0gRlNfUkVRVUlSRVNfREVWLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9taW5peF9mcyh2b2lkKQoreworCWludCBlcnIgPSBpbml0X2lub2RlY2FjaGUoKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJZXJyID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmbWluaXhfZnNfdHlwZSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJcmV0dXJuIDA7CitvdXQ6CisJZGVzdHJveV9pbm9kZWNhY2hlKCk7CitvdXQxOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X21pbml4X2ZzKHZvaWQpCit7CisgICAgICAgIHVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmbWluaXhfZnNfdHlwZSk7CisJZGVzdHJveV9pbm9kZWNhY2hlKCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbWluaXhfZnMpCittb2R1bGVfZXhpdChleGl0X21pbml4X2ZzKQorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCmRpZmYgLS1naXQgYS9mcy9taW5peC9pdHJlZV9jb21tb24uYyBiL2ZzL21pbml4L2l0cmVlX2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyOWJhZjgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9taW5peC9pdHJlZV9jb21tb24uYwpAQCAtMCwwICsxLDM2MiBAQAorLyogR2VuZXJpYyBwYXJ0ICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwlibG9ja190CSpwOworCWJsb2NrX3QJa2V5OworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7Cit9IEluZGlyZWN0OworCitzdGF0aWMgREVGSU5FX1JXTE9DSyhwb2ludGVyc19sb2NrKTsKKworc3RhdGljIGlubGluZSB2b2lkIGFkZF9jaGFpbihJbmRpcmVjdCAqcCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgYmxvY2tfdCAqdikKK3sKKwlwLT5rZXkgPSAqKHAtPnAgPSB2KTsKKwlwLT5iaCA9IGJoOworfQorCitzdGF0aWMgaW5saW5lIGludCB2ZXJpZnlfY2hhaW4oSW5kaXJlY3QgKmZyb20sIEluZGlyZWN0ICp0bykKK3sKKwl3aGlsZSAoZnJvbSA8PSB0byAmJiBmcm9tLT5rZXkgPT0gKmZyb20tPnApCisJCWZyb20rKzsKKwlyZXR1cm4gKGZyb20gPiB0byk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYmxvY2tfdCAqYmxvY2tfZW5kKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJcmV0dXJuIChibG9ja190ICopKChjaGFyKiliaC0+Yl9kYXRhICsgQkxPQ0tfU0laRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgSW5kaXJlY3QgKmdldF9icmFuY2goc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkJaW50IGRlcHRoLAorCQkJCQlpbnQgKm9mZnNldHMsCisJCQkJCUluZGlyZWN0IGNoYWluW0RFUFRIXSwKKwkJCQkJaW50ICplcnIpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCUluZGlyZWN0ICpwID0gY2hhaW47CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCSplcnIgPSAwOworCS8qIGlfZGF0YSBpcyBub3QgZ29pbmcgYXdheSwgbm8gbG9jayBuZWVkZWQgKi8KKwlhZGRfY2hhaW4gKGNoYWluLCBOVUxMLCBpX2RhdGEoaW5vZGUpICsgKm9mZnNldHMpOworCWlmICghcC0+a2V5KQorCQlnb3RvIG5vX2Jsb2NrOworCXdoaWxlICgtLWRlcHRoKSB7CisJCWJoID0gc2JfYnJlYWQoc2IsIGJsb2NrX3RvX2NwdShwLT5rZXkpKTsKKwkJaWYgKCFiaCkKKwkJCWdvdG8gZmFpbHVyZTsKKwkJcmVhZF9sb2NrKCZwb2ludGVyc19sb2NrKTsKKwkJaWYgKCF2ZXJpZnlfY2hhaW4oY2hhaW4sIHApKQorCQkJZ290byBjaGFuZ2VkOworCQlhZGRfY2hhaW4oKytwLCBiaCwgKGJsb2NrX3QgKiliaC0+Yl9kYXRhICsgKisrb2Zmc2V0cyk7CisJCXJlYWRfdW5sb2NrKCZwb2ludGVyc19sb2NrKTsKKwkJaWYgKCFwLT5rZXkpCisJCQlnb3RvIG5vX2Jsb2NrOworCX0KKwlyZXR1cm4gTlVMTDsKKworY2hhbmdlZDoKKwlyZWFkX3VubG9jaygmcG9pbnRlcnNfbG9jayk7CisJYnJlbHNlKGJoKTsKKwkqZXJyID0gLUVBR0FJTjsKKwlnb3RvIG5vX2Jsb2NrOworZmFpbHVyZToKKwkqZXJyID0gLUVJTzsKK25vX2Jsb2NrOgorCXJldHVybiBwOworfQorCitzdGF0aWMgaW50IGFsbG9jX2JyYW5jaChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICBpbnQgbnVtLAorCQkJICAgICBpbnQgKm9mZnNldHMsCisJCQkgICAgIEluZGlyZWN0ICpicmFuY2gpCit7CisJaW50IG4gPSAwOworCWludCBpOworCWludCBwYXJlbnQgPSBtaW5peF9uZXdfYmxvY2soaW5vZGUpOworCisJYnJhbmNoWzBdLmtleSA9IGNwdV90b19ibG9jayhwYXJlbnQpOworCWlmIChwYXJlbnQpIGZvciAobiA9IDE7IG4gPCBudW07IG4rKykgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCQkvKiBBbGxvY2F0ZSB0aGUgbmV4dCBibG9jayAqLworCQlpbnQgbnIgPSBtaW5peF9uZXdfYmxvY2soaW5vZGUpOworCQlpZiAoIW5yKQorCQkJYnJlYWs7CisJCWJyYW5jaFtuXS5rZXkgPSBjcHVfdG9fYmxvY2sobnIpOworCQliaCA9IHNiX2dldGJsayhpbm9kZS0+aV9zYiwgcGFyZW50KTsKKwkJbG9ja19idWZmZXIoYmgpOworCQltZW1zZXQoYmgtPmJfZGF0YSwgMCwgQkxPQ0tfU0laRSk7CisJCWJyYW5jaFtuXS5iaCA9IGJoOworCQlicmFuY2hbbl0ucCA9IChibG9ja190KikgYmgtPmJfZGF0YSArIG9mZnNldHNbbl07CisJCSpicmFuY2hbbl0ucCA9IGJyYW5jaFtuXS5rZXk7CisJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJbWFya19idWZmZXJfZGlydHlfaW5vZGUoYmgsIGlub2RlKTsKKwkJcGFyZW50ID0gbnI7CisJfQorCWlmIChuID09IG51bSkKKwkJcmV0dXJuIDA7CisKKwkvKiBBbGxvY2F0aW9uIGZhaWxlZCwgZnJlZSB3aGF0IHdlIGFscmVhZHkgYWxsb2NhdGVkICovCisJZm9yIChpID0gMTsgaSA8IG47IGkrKykKKwkJYmZvcmdldChicmFuY2hbaV0uYmgpOworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCW1pbml4X2ZyZWVfYmxvY2soaW5vZGUsIGJsb2NrX3RvX2NwdShicmFuY2hbaV0ua2V5KSk7CisJcmV0dXJuIC1FTk9TUEM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNwbGljZV9icmFuY2goc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgIEluZGlyZWN0IGNoYWluW0RFUFRIXSwKKwkJCQkgICAgIEluZGlyZWN0ICp3aGVyZSwKKwkJCQkgICAgIGludCBudW0pCit7CisJaW50IGk7CisKKwl3cml0ZV9sb2NrKCZwb2ludGVyc19sb2NrKTsKKworCS8qIFZlcmlmeSB0aGF0IHBsYWNlIHdlIGFyZSBzcGxpY2luZyB0byBpcyBzdGlsbCB0aGVyZSBhbmQgdmFjYW50ICovCisJaWYgKCF2ZXJpZnlfY2hhaW4oY2hhaW4sIHdoZXJlLTEpIHx8ICp3aGVyZS0+cCkKKwkJZ290byBjaGFuZ2VkOworCisJKndoZXJlLT5wID0gd2hlcmUtPmtleTsKKworCXdyaXRlX3VubG9jaygmcG9pbnRlcnNfbG9jayk7CisKKwkvKiBXZSBhcmUgZG9uZSB3aXRoIGF0b21pYyBzdHVmZiwgbm93IGRvIHRoZSByZXN0IG9mIGhvdXNla2VlcGluZyAqLworCisJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCisJLyogaGFkIHdlIHNwbGljZWQgaXQgb250byBpbmRpcmVjdCBibG9jaz8gKi8KKwlpZiAod2hlcmUtPmJoKQorCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZSh3aGVyZS0+YmgsIGlub2RlKTsKKworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCXJldHVybiAwOworCitjaGFuZ2VkOgorCXdyaXRlX3VubG9jaygmcG9pbnRlcnNfbG9jayk7CisJZm9yIChpID0gMTsgaSA8IG51bTsgaSsrKQorCQliZm9yZ2V0KHdoZXJlW2ldLmJoKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCisJCW1pbml4X2ZyZWVfYmxvY2soaW5vZGUsIGJsb2NrX3RvX2NwdSh3aGVyZVtpXS5rZXkpKTsKKwlyZXR1cm4gLUVBR0FJTjsKK30KKworc3RhdGljIGlubGluZSBpbnQgZ2V0X2Jsb2NrKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzZWN0b3JfdCBibG9jaywKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCBjcmVhdGUpCit7CisJaW50IGVyciA9IC1FSU87CisJaW50IG9mZnNldHNbREVQVEhdOworCUluZGlyZWN0IGNoYWluW0RFUFRIXTsKKwlJbmRpcmVjdCAqcGFydGlhbDsKKwlpbnQgbGVmdDsKKwlpbnQgZGVwdGggPSBibG9ja190b19wYXRoKGlub2RlLCBibG9jaywgb2Zmc2V0cyk7CisKKwlpZiAoZGVwdGggPT0gMCkKKwkJZ290byBvdXQ7CisKK3JlcmVhZDoKKwlwYXJ0aWFsID0gZ2V0X2JyYW5jaChpbm9kZSwgZGVwdGgsIG9mZnNldHMsIGNoYWluLCAmZXJyKTsKKworCS8qIFNpbXBsZXN0IGNhc2UgLSBibG9jayBmb3VuZCwgbm8gYWxsb2NhdGlvbiBuZWVkZWQgKi8KKwlpZiAoIXBhcnRpYWwpIHsKK2dvdF9pdDoKKwkJbWFwX2JoKGJoLCBpbm9kZS0+aV9zYiwgYmxvY2tfdG9fY3B1KGNoYWluW2RlcHRoLTFdLmtleSkpOworCQkvKiBDbGVhbiB1cCBhbmQgZXhpdCAqLworCQlwYXJ0aWFsID0gY2hhaW4rZGVwdGgtMTsgLyogdGhlIHdob2xlIGNoYWluICovCisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKiBOZXh0IHNpbXBsZSBjYXNlIC0gcGxhaW4gbG9va3VwIG9yIGZhaWxlZCByZWFkIG9mIGluZGlyZWN0IGJsb2NrICovCisJaWYgKCFjcmVhdGUgfHwgZXJyID09IC1FSU8pIHsKK2NsZWFudXA6CisJCXdoaWxlIChwYXJ0aWFsID4gY2hhaW4pIHsKKwkJCWJyZWxzZShwYXJ0aWFsLT5iaCk7CisJCQlwYXJ0aWFsLS07CisJCX0KK291dDoKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKgorCSAqIEluZGlyZWN0IGJsb2NrIG1pZ2h0IGJlIHJlbW92ZWQgYnkgdHJ1bmNhdGUgd2hpbGUgd2Ugd2VyZQorCSAqIHJlYWRpbmcgaXQuIEhhbmRsaW5nIG9mIHRoYXQgY2FzZSAoZm9yZ2V0IHdoYXQgd2UndmUgZ290IGFuZAorCSAqIHJlcmVhZCkgaXMgdGFrZW4gb3V0IG9mIHRoZSBtYWluIHBhdGguCisJICovCisJaWYgKGVyciA9PSAtRUFHQUlOKQorCQlnb3RvIGNoYW5nZWQ7CisKKwlsZWZ0ID0gKGNoYWluICsgZGVwdGgpIC0gcGFydGlhbDsKKwllcnIgPSBhbGxvY19icmFuY2goaW5vZGUsIGxlZnQsIG9mZnNldHMrKHBhcnRpYWwtY2hhaW4pLCBwYXJ0aWFsKTsKKwlpZiAoZXJyKQorCQlnb3RvIGNsZWFudXA7CisKKwlpZiAoc3BsaWNlX2JyYW5jaChpbm9kZSwgY2hhaW4sIHBhcnRpYWwsIGxlZnQpIDwgMCkKKwkJZ290byBjaGFuZ2VkOworCisJc2V0X2J1ZmZlcl9uZXcoYmgpOworCWdvdG8gZ290X2l0OworCitjaGFuZ2VkOgorCXdoaWxlIChwYXJ0aWFsID4gY2hhaW4pIHsKKwkJYnJlbHNlKHBhcnRpYWwtPmJoKTsKKwkJcGFydGlhbC0tOworCX0KKwlnb3RvIHJlcmVhZDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYWxsX3plcm9lcyhibG9ja190ICpwLCBibG9ja190ICpxKQoreworCXdoaWxlIChwIDwgcSkKKwkJaWYgKCpwKyspCisJCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIEluZGlyZWN0ICpmaW5kX3NoYXJlZChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCWludCBkZXB0aCwKKwkJCQlpbnQgb2Zmc2V0c1tERVBUSF0sCisJCQkJSW5kaXJlY3QgY2hhaW5bREVQVEhdLAorCQkJCWJsb2NrX3QgKnRvcCkKK3sKKwlJbmRpcmVjdCAqcGFydGlhbCwgKnA7CisJaW50IGssIGVycjsKKworCSp0b3AgPSAwOworCWZvciAoayA9IGRlcHRoOyBrID4gMSAmJiAhb2Zmc2V0c1trLTFdOyBrLS0pCisJCTsKKwlwYXJ0aWFsID0gZ2V0X2JyYW5jaChpbm9kZSwgaywgb2Zmc2V0cywgY2hhaW4sICZlcnIpOworCisJd3JpdGVfbG9jaygmcG9pbnRlcnNfbG9jayk7CisJaWYgKCFwYXJ0aWFsKQorCQlwYXJ0aWFsID0gY2hhaW4gKyBrLTE7CisJaWYgKCFwYXJ0aWFsLT5rZXkgJiYgKnBhcnRpYWwtPnApIHsKKwkJd3JpdGVfdW5sb2NrKCZwb2ludGVyc19sb2NrKTsKKwkJZ290byBub190b3A7CisJfQorCWZvciAocD1wYXJ0aWFsO3A+Y2hhaW4gJiYgYWxsX3plcm9lcygoYmxvY2tfdCopcC0+YmgtPmJfZGF0YSxwLT5wKTtwLS0pCisJCTsKKwlpZiAocCA9PSBjaGFpbiArIGsgLSAxICYmIHAgPiBjaGFpbikgeworCQlwLT5wLS07CisJfSBlbHNlIHsKKwkJKnRvcCA9ICpwLT5wOworCQkqcC0+cCA9IDA7CisJfQorCXdyaXRlX3VubG9jaygmcG9pbnRlcnNfbG9jayk7CisKKwl3aGlsZShwYXJ0aWFsID4gcCkKKwl7CisJCWJyZWxzZShwYXJ0aWFsLT5iaCk7CisJCXBhcnRpYWwtLTsKKwl9Citub190b3A6CisJcmV0dXJuIHBhcnRpYWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX2RhdGEoc3RydWN0IGlub2RlICppbm9kZSwgYmxvY2tfdCAqcCwgYmxvY2tfdCAqcSkKK3sKKwl1bnNpZ25lZCBsb25nIG5yOworCisJZm9yICggOyBwIDwgcSA7IHArKykgeworCQluciA9IGJsb2NrX3RvX2NwdSgqcCk7CisJCWlmIChucikgeworCQkJKnAgPSAwOworCQkJbWluaXhfZnJlZV9ibG9jayhpbm9kZSwgbnIpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBmcmVlX2JyYW5jaGVzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGJsb2NrX3QgKnAsIGJsb2NrX3QgKnEsIGludCBkZXB0aCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwl1bnNpZ25lZCBsb25nIG5yOworCisJaWYgKGRlcHRoLS0pIHsKKwkJZm9yICggOyBwIDwgcSA7IHArKykgeworCQkJbnIgPSBibG9ja190b19jcHUoKnApOworCQkJaWYgKCFucikKKwkJCQljb250aW51ZTsKKwkJCSpwID0gMDsKKwkJCWJoID0gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIG5yKTsKKwkJCWlmICghYmgpCisJCQkJY29udGludWU7CisJCQlmcmVlX2JyYW5jaGVzKGlub2RlLCAoYmxvY2tfdCopYmgtPmJfZGF0YSwKKwkJCQkgICAgICBibG9ja19lbmQoYmgpLCBkZXB0aCk7CisJCQliZm9yZ2V0KGJoKTsKKwkJCW1pbml4X2ZyZWVfYmxvY2soaW5vZGUsIG5yKTsKKwkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQl9CisJfSBlbHNlCisJCWZyZWVfZGF0YShpbm9kZSwgcCwgcSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0cnVuY2F0ZSAoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJYmxvY2tfdCAqaWRhdGEgPSBpX2RhdGEoaW5vZGUpOworCWludCBvZmZzZXRzW0RFUFRIXTsKKwlJbmRpcmVjdCBjaGFpbltERVBUSF07CisJSW5kaXJlY3QgKnBhcnRpYWw7CisJYmxvY2tfdCBuciA9IDA7CisJaW50IG47CisJaW50IGZpcnN0X3dob2xlOworCWxvbmcgaWJsb2NrOworCisJaWJsb2NrID0gKGlub2RlLT5pX3NpemUgKyBCTE9DS19TSVpFLTEpID4+IDEwOworCWJsb2NrX3RydW5jYXRlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgaW5vZGUtPmlfc2l6ZSwgZ2V0X2Jsb2NrKTsKKworCW4gPSBibG9ja190b19wYXRoKGlub2RlLCBpYmxvY2ssIG9mZnNldHMpOworCWlmICghbikKKwkJcmV0dXJuOworCisJaWYgKG4gPT0gMSkgeworCQlmcmVlX2RhdGEoaW5vZGUsIGlkYXRhK29mZnNldHNbMF0sIGlkYXRhICsgRElSRUNUKTsKKwkJZmlyc3Rfd2hvbGUgPSAwOworCQlnb3RvIGRvX2luZGlyZWN0czsKKwl9CisKKwlmaXJzdF93aG9sZSA9IG9mZnNldHNbMF0gKyAxIC0gRElSRUNUOworCXBhcnRpYWwgPSBmaW5kX3NoYXJlZChpbm9kZSwgbiwgb2Zmc2V0cywgY2hhaW4sICZucik7CisJaWYgKG5yKSB7CisJCWlmIChwYXJ0aWFsID09IGNoYWluKQorCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCWVsc2UKKwkJCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKHBhcnRpYWwtPmJoLCBpbm9kZSk7CisJCWZyZWVfYnJhbmNoZXMoaW5vZGUsICZuciwgJm5yKzEsIChjaGFpbituLTEpIC0gcGFydGlhbCk7CisJfQorCS8qIENsZWFyIHRoZSBlbmRzIG9mIGluZGlyZWN0IGJsb2NrcyBvbiB0aGUgc2hhcmVkIGJyYW5jaCAqLworCXdoaWxlIChwYXJ0aWFsID4gY2hhaW4pIHsKKwkJZnJlZV9icmFuY2hlcyhpbm9kZSwgcGFydGlhbC0+cCArIDEsIGJsb2NrX2VuZChwYXJ0aWFsLT5iaCksCisJCQkJKGNoYWluK24tMSkgLSBwYXJ0aWFsKTsKKwkJbWFya19idWZmZXJfZGlydHlfaW5vZGUocGFydGlhbC0+YmgsIGlub2RlKTsKKwkJYnJlbHNlIChwYXJ0aWFsLT5iaCk7CisJCXBhcnRpYWwtLTsKKwl9Citkb19pbmRpcmVjdHM6CisJLyogS2lsbCB0aGUgcmVtYWluaW5nICh3aG9sZSkgc3VidHJlZXMgKi8KKwl3aGlsZSAoZmlyc3Rfd2hvbGUgPCBERVBUSC0xKSB7CisJCW5yID0gaWRhdGFbRElSRUNUK2ZpcnN0X3dob2xlXTsKKwkJaWYgKG5yKSB7CisJCQlpZGF0YVtESVJFQ1QrZmlyc3Rfd2hvbGVdID0gMDsKKwkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQkJZnJlZV9icmFuY2hlcyhpbm9kZSwgJm5yLCAmbnIrMSwgZmlyc3Rfd2hvbGUrMSk7CisJCX0KKwkJZmlyc3Rfd2hvbGUrKzsKKwl9CisJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbmJsb2Nrcyhsb2ZmX3Qgc2l6ZSkKK3sKKwl1bnNpZ25lZCBibG9ja3MsIHJlcywgZGlyZWN0ID0gRElSRUNULCBpID0gREVQVEg7CisJYmxvY2tzID0gKHNpemUgKyBCTE9DS19TSVpFIC0gMSkgPj4gQkxPQ0tfU0laRV9CSVRTOworCXJlcyA9IGJsb2NrczsKKwl3aGlsZSAoLS1pICYmIGJsb2NrcyA+IGRpcmVjdCkgeworCQlibG9ja3MgLT0gZGlyZWN0OworCQlibG9ja3MgKz0gQkxPQ0tfU0laRS9zaXplb2YoYmxvY2tfdCkgLSAxOworCQlibG9ja3MgLz0gQkxPQ0tfU0laRS9zaXplb2YoYmxvY2tfdCk7CisJCXJlcyArPSBibG9ja3M7CisJCWRpcmVjdCA9IDE7CisJfQorCXJldHVybiByZXM7Cit9CmRpZmYgLS1naXQgYS9mcy9taW5peC9pdHJlZV92MS5jIGIvZnMvbWluaXgvaXRyZWVfdjEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTA2YWVmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbWluaXgvaXRyZWVfdjEuYwpAQCAtMCwwICsxLDYxIEBACisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlICJtaW5peC5oIgorCitlbnVtIHtERVBUSCA9IDMsIERJUkVDVCA9IDd9OwkvKiBPbmx5IGRvdWJsZSBpbmRpcmVjdCAqLworCit0eXBlZGVmIHUxNiBibG9ja190OwkvKiAxNiBiaXQsIGhvc3Qgb3JkZXIgKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGJsb2NrX3RvX2NwdShibG9ja190IG4pCit7CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbmxpbmUgYmxvY2tfdCBjcHVfdG9fYmxvY2sodW5zaWduZWQgbG9uZyBuKQoreworCXJldHVybiBuOworfQorCitzdGF0aWMgaW5saW5lIGJsb2NrX3QgKmlfZGF0YShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiAoYmxvY2tfdCAqKW1pbml4X2koaW5vZGUpLT51LmkxX2RhdGE7Cit9CisKK3N0YXRpYyBpbnQgYmxvY2tfdG9fcGF0aChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgbG9uZyBibG9jaywgaW50IG9mZnNldHNbREVQVEhdKQoreworCWludCBuID0gMDsKKworCWlmIChibG9jayA8IDApIHsKKwkJcHJpbnRrKCJtaW5peF9ibWFwOiBibG9jazwwIik7CisJfSBlbHNlIGlmIChibG9jayA+PSAobWluaXhfc2IoaW5vZGUtPmlfc2IpLT5zX21heF9zaXplL0JMT0NLX1NJWkUpKSB7CisJCXByaW50aygibWluaXhfYm1hcDogYmxvY2s+YmlnIik7CisJfSBlbHNlIGlmIChibG9jayA8IDcpIHsKKwkJb2Zmc2V0c1tuKytdID0gYmxvY2s7CisJfSBlbHNlIGlmICgoYmxvY2sgLT0gNykgPCA1MTIpIHsKKwkJb2Zmc2V0c1tuKytdID0gNzsKKwkJb2Zmc2V0c1tuKytdID0gYmxvY2s7CisJfSBlbHNlIHsKKwkJYmxvY2sgLT0gNTEyOworCQlvZmZzZXRzW24rK10gPSA4OworCQlvZmZzZXRzW24rK10gPSBibG9jaz4+OTsKKwkJb2Zmc2V0c1tuKytdID0gYmxvY2sgJiA1MTE7CisJfQorCXJldHVybiBuOworfQorCisjaW5jbHVkZSAiaXRyZWVfY29tbW9uLmMiCisKK2ludCBWMV9taW5peF9nZXRfYmxvY2soc3RydWN0IGlub2RlICogaW5vZGUsIGxvbmcgYmxvY2ssCisJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwgaW50IGNyZWF0ZSkKK3sKKwlyZXR1cm4gZ2V0X2Jsb2NrKGlub2RlLCBibG9jaywgYmhfcmVzdWx0LCBjcmVhdGUpOworfQorCit2b2lkIFYxX21pbml4X3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCXRydW5jYXRlKGlub2RlKTsKK30KKwordW5zaWduZWQgVjFfbWluaXhfYmxvY2tzKGxvZmZfdCBzaXplKQoreworCXJldHVybiBuYmxvY2tzKHNpemUpOworfQpkaWZmIC0tZ2l0IGEvZnMvbWluaXgvaXRyZWVfdjIuYyBiL2ZzL21pbml4L2l0cmVlX3YyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FkYzc2NwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL21pbml4L2l0cmVlX3YyLmMKQEAgLTAsMCArMSw2NiBAQAorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSAibWluaXguaCIKKworZW51bSB7RElSRUNUID0gNywgREVQVEggPSA0fTsJLyogSGF2ZSB0cmlwbGUgaW5kaXJlY3QgKi8KKwordHlwZWRlZiB1MzIgYmxvY2tfdDsJLyogMzIgYml0LCBob3N0IG9yZGVyICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBibG9ja190b19jcHUoYmxvY2tfdCBuKQoreworCXJldHVybiBuOworfQorCitzdGF0aWMgaW5saW5lIGJsb2NrX3QgY3B1X3RvX2Jsb2NrKHVuc2lnbmVkIGxvbmcgbikKK3sKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGlubGluZSBibG9ja190ICppX2RhdGEoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gKGJsb2NrX3QgKiltaW5peF9pKGlub2RlKS0+dS5pMl9kYXRhOworfQorCitzdGF0aWMgaW50IGJsb2NrX3RvX3BhdGgoc3RydWN0IGlub2RlICogaW5vZGUsIGxvbmcgYmxvY2ssIGludCBvZmZzZXRzW0RFUFRIXSkKK3sKKwlpbnQgbiA9IDA7CisKKwlpZiAoYmxvY2sgPCAwKSB7CisJCXByaW50aygibWluaXhfYm1hcDogYmxvY2s8MCIpOworCX0gZWxzZSBpZiAoYmxvY2sgPj0gKG1pbml4X3NiKGlub2RlLT5pX3NiKS0+c19tYXhfc2l6ZS9CTE9DS19TSVpFKSkgeworCQlwcmludGsoIm1pbml4X2JtYXA6IGJsb2NrPmJpZyIpOworCX0gZWxzZSBpZiAoYmxvY2sgPCA3KSB7CisJCW9mZnNldHNbbisrXSA9IGJsb2NrOworCX0gZWxzZSBpZiAoKGJsb2NrIC09IDcpIDwgMjU2KSB7CisJCW9mZnNldHNbbisrXSA9IDc7CisJCW9mZnNldHNbbisrXSA9IGJsb2NrOworCX0gZWxzZSBpZiAoKGJsb2NrIC09IDI1NikgPCAyNTYqMjU2KSB7CisJCW9mZnNldHNbbisrXSA9IDg7CisJCW9mZnNldHNbbisrXSA9IGJsb2NrPj44OworCQlvZmZzZXRzW24rK10gPSBibG9jayAmIDI1NTsKKwl9IGVsc2UgeworCQlibG9jayAtPSAyNTYqMjU2OworCQlvZmZzZXRzW24rK10gPSA5OworCQlvZmZzZXRzW24rK10gPSBibG9jaz4+MTY7CisJCW9mZnNldHNbbisrXSA9IChibG9jaz4+OCkgJiAyNTU7CisJCW9mZnNldHNbbisrXSA9IGJsb2NrICYgMjU1OworCX0KKwlyZXR1cm4gbjsKK30KKworI2luY2x1ZGUgIml0cmVlX2NvbW1vbi5jIgorCitpbnQgVjJfbWluaXhfZ2V0X2Jsb2NrKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBsb25nIGJsb2NrLAorCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpCit7CisJcmV0dXJuIGdldF9ibG9jayhpbm9kZSwgYmxvY2ssIGJoX3Jlc3VsdCwgY3JlYXRlKTsKK30KKwordm9pZCBWMl9taW5peF90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwl0cnVuY2F0ZShpbm9kZSk7Cit9CisKK3Vuc2lnbmVkIFYyX21pbml4X2Jsb2Nrcyhsb2ZmX3Qgc2l6ZSkKK3sKKwlyZXR1cm4gbmJsb2NrcyhzaXplKTsKK30KZGlmZiAtLWdpdCBhL2ZzL21pbml4L21pbml4LmggYi9mcy9taW5peC9taW5peC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MmE4YmIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9taW5peC9taW5peC5oCkBAIC0wLDAgKzEsOTYgQEAKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9taW5peF9mcy5oPgorCisvKgorICogY2hhbmdlIHRoZSBkZWZpbmUgYmVsb3cgdG8gMCBpZiB5b3Ugd2FudCBuYW1lcyA+IGluZm8tPnNfbmFtZWxlbiBjaGFycyB0byBiZQorICogdHJ1bmNhdGVkLiBFbHNlIHRoZXkgd2lsbCBiZSBkaXNhbGxvd2VkIChFTkFNRVRPT0xPTkcpLgorICovCisjZGVmaW5lIE5PX1RSVU5DQVRFIDEKKworI2RlZmluZSBJTk9ERV9WRVJTSU9OKGlub2RlKQltaW5peF9zYihpbm9kZS0+aV9zYiktPnNfdmVyc2lvbgorCisjZGVmaW5lIE1JTklYX1YxCQkweDAwMDEJCS8qIG9yaWdpbmFsIG1pbml4IGZzICovCisjZGVmaW5lIE1JTklYX1YyCQkweDAwMDIJCS8qIG1pbml4IFYyIGZzICovCisKKy8qCisgKiBtaW5peCBmcyBpbm9kZSBkYXRhIGluIG1lbW9yeQorICovCitzdHJ1Y3QgbWluaXhfaW5vZGVfaW5mbyB7CisJdW5pb24geworCQlfX3UxNiBpMV9kYXRhWzE2XTsKKwkJX191MzIgaTJfZGF0YVsxNl07CisJfSB1OworCXN0cnVjdCBpbm9kZSB2ZnNfaW5vZGU7Cit9OworCisvKgorICogbWluaXggc3VwZXItYmxvY2sgZGF0YSBpbiBtZW1vcnkKKyAqLworc3RydWN0IG1pbml4X3NiX2luZm8geworCXVuc2lnbmVkIGxvbmcgc19uaW5vZGVzOworCXVuc2lnbmVkIGxvbmcgc19uem9uZXM7CisJdW5zaWduZWQgbG9uZyBzX2ltYXBfYmxvY2tzOworCXVuc2lnbmVkIGxvbmcgc196bWFwX2Jsb2NrczsKKwl1bnNpZ25lZCBsb25nIHNfZmlyc3RkYXRhem9uZTsKKwl1bnNpZ25lZCBsb25nIHNfbG9nX3pvbmVfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHNfbWF4X3NpemU7CisJaW50IHNfZGlyc2l6ZTsKKwlpbnQgc19uYW1lbGVuOworCWludCBzX2xpbmtfbWF4OworCXN0cnVjdCBidWZmZXJfaGVhZCAqKiBzX2ltYXA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICoqIHNfem1hcDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzX3NiaDsKKwlzdHJ1Y3QgbWluaXhfc3VwZXJfYmxvY2sgKiBzX21zOworCXVuc2lnbmVkIHNob3J0IHNfbW91bnRfc3RhdGU7CisJdW5zaWduZWQgc2hvcnQgc192ZXJzaW9uOworfTsKKworZXh0ZXJuIHN0cnVjdCBtaW5peF9pbm9kZSAqIG1pbml4X1YxX3Jhd19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW5vX3QsIHN0cnVjdCBidWZmZXJfaGVhZCAqKik7CitleHRlcm4gc3RydWN0IG1pbml4Ml9pbm9kZSAqIG1pbml4X1YyX3Jhd19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW5vX3QsIHN0cnVjdCBidWZmZXJfaGVhZCAqKik7CitleHRlcm4gc3RydWN0IGlub2RlICogbWluaXhfbmV3X2lub2RlKGNvbnN0IHN0cnVjdCBpbm9kZSAqIGRpciwgaW50ICogZXJyb3IpOworZXh0ZXJuIHZvaWQgbWluaXhfZnJlZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBtaW5peF9jb3VudF9mcmVlX2lub2RlcyhzdHJ1Y3QgbWluaXhfc2JfaW5mbyAqc2JpKTsKK2V4dGVybiBpbnQgbWluaXhfbmV3X2Jsb2NrKHN0cnVjdCBpbm9kZSAqIGlub2RlKTsKK2V4dGVybiB2b2lkIG1pbml4X2ZyZWVfYmxvY2soc3RydWN0IGlub2RlICogaW5vZGUsIGludCBibG9jayk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBtaW5peF9jb3VudF9mcmVlX2Jsb2NrcyhzdHJ1Y3QgbWluaXhfc2JfaW5mbyAqc2JpKTsKKworZXh0ZXJuIGludCBtaW5peF9nZXRhdHRyKHN0cnVjdCB2ZnNtb3VudCAqLCBzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBrc3RhdCAqKTsKKworZXh0ZXJuIHZvaWQgVjJfbWluaXhfdHJ1bmNhdGUoc3RydWN0IGlub2RlICopOworZXh0ZXJuIHZvaWQgVjFfbWluaXhfdHJ1bmNhdGUoc3RydWN0IGlub2RlICopOworZXh0ZXJuIHZvaWQgVjJfbWluaXhfdHJ1bmNhdGUoc3RydWN0IGlub2RlICopOworZXh0ZXJuIHZvaWQgbWluaXhfdHJ1bmNhdGUoc3RydWN0IGlub2RlICopOworZXh0ZXJuIGludCBtaW5peF9zeW5jX2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiB2b2lkIG1pbml4X3NldF9pbm9kZShzdHJ1Y3QgaW5vZGUgKiwgZGV2X3QpOworZXh0ZXJuIGludCBWMV9taW5peF9nZXRfYmxvY2soc3RydWN0IGlub2RlICosIGxvbmcsIHN0cnVjdCBidWZmZXJfaGVhZCAqLCBpbnQpOworZXh0ZXJuIGludCBWMl9taW5peF9nZXRfYmxvY2soc3RydWN0IGlub2RlICosIGxvbmcsIHN0cnVjdCBidWZmZXJfaGVhZCAqLCBpbnQpOworZXh0ZXJuIHVuc2lnbmVkIFYxX21pbml4X2Jsb2Nrcyhsb2ZmX3QpOworZXh0ZXJuIHVuc2lnbmVkIFYyX21pbml4X2Jsb2Nrcyhsb2ZmX3QpOworCitleHRlcm4gc3RydWN0IG1pbml4X2Rpcl9lbnRyeSAqbWluaXhfZmluZF9lbnRyeShzdHJ1Y3QgZGVudHJ5Kiwgc3RydWN0IHBhZ2UqKik7CitleHRlcm4gaW50IG1pbml4X2FkZF9saW5rKHN0cnVjdCBkZW50cnkqLCBzdHJ1Y3QgaW5vZGUqKTsKK2V4dGVybiBpbnQgbWluaXhfZGVsZXRlX2VudHJ5KHN0cnVjdCBtaW5peF9kaXJfZW50cnkqLCBzdHJ1Y3QgcGFnZSopOworZXh0ZXJuIGludCBtaW5peF9tYWtlX2VtcHR5KHN0cnVjdCBpbm9kZSosIHN0cnVjdCBpbm9kZSopOworZXh0ZXJuIGludCBtaW5peF9lbXB0eV9kaXIoc3RydWN0IGlub2RlKik7CitleHRlcm4gdm9pZCBtaW5peF9zZXRfbGluayhzdHJ1Y3QgbWluaXhfZGlyX2VudHJ5Kiwgc3RydWN0IHBhZ2UqLCBzdHJ1Y3QgaW5vZGUqKTsKK2V4dGVybiBzdHJ1Y3QgbWluaXhfZGlyX2VudHJ5ICptaW5peF9kb3Rkb3Qoc3RydWN0IGlub2RlKiwgc3RydWN0IHBhZ2UqKik7CitleHRlcm4gaW5vX3QgbWluaXhfaW5vZGVfYnlfbmFtZShzdHJ1Y3QgZGVudHJ5Kik7CisKK2V4dGVybiBpbnQgbWluaXhfc3luY19maWxlKHN0cnVjdCBmaWxlICosIHN0cnVjdCBkZW50cnkgKiwgaW50KTsKKworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIG1pbml4X2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBtaW5peF9kaXJfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1pbml4X2ZpbGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1pbml4X2Rpcl9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBtaW5peF9kZW50cnlfb3BlcmF0aW9uczsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbWluaXhfc2JfaW5mbyAqbWluaXhfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlyZXR1cm4gc2ItPnNfZnNfaW5mbzsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbWluaXhfaW5vZGVfaW5mbyAqbWluaXhfaShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiBsaXN0X2VudHJ5KGlub2RlLCBzdHJ1Y3QgbWluaXhfaW5vZGVfaW5mbywgdmZzX2lub2RlKTsKK30KZGlmZiAtLWdpdCBhL2ZzL21pbml4L25hbWVpLmMgYi9mcy9taW5peC9uYW1laS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNWJjYTUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9taW5peC9uYW1laS5jCkBAIC0wLDAgKzEsMzE3IEBACisvKgorICogIGxpbnV4L2ZzL21pbml4L25hbWVpLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICovCisKKyNpbmNsdWRlICJtaW5peC5oIgorCitzdGF0aWMgaW5saW5lIHZvaWQgaW5jX2NvdW50KHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW5vZGUtPmlfbmxpbmsrKzsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRlY19jb3VudChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlub2RlLT5pX25saW5rLS07CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7Cit9CisKK3N0YXRpYyBpbnQgYWRkX25vbmRpcihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW50IGVyciA9IG1pbml4X2FkZF9saW5rKGRlbnRyeSwgaW5vZGUpOworCWlmICghZXJyKSB7CisJCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJCXJldHVybiAwOworCX0KKwlkZWNfY291bnQoaW5vZGUpOworCWlwdXQoaW5vZGUpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWluaXhfaGFzaChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICpxc3RyKQoreworCXVuc2lnbmVkIGxvbmcgaGFzaDsKKwlpbnQgaTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lOworCisJaSA9IG1pbml4X3NiKGRlbnRyeS0+ZF9pbm9kZS0+aV9zYiktPnNfbmFtZWxlbjsKKwlpZiAoaSA+PSBxc3RyLT5sZW4pCisJCXJldHVybiAwOworCS8qIFRydW5jYXRlIHRoZSBuYW1lIGluIHBsYWNlLCBhdm9pZHMgaGF2aW5nIHRvIGRlZmluZSBhIGNvbXBhcmUKKwkgICBmdW5jdGlvbi4gKi8KKwlxc3RyLT5sZW4gPSBpOworCW5hbWUgPSBxc3RyLT5uYW1lOworCWhhc2ggPSBpbml0X25hbWVfaGFzaCgpOworCXdoaWxlIChpLS0pCisJCWhhc2ggPSBwYXJ0aWFsX25hbWVfaGFzaCgqbmFtZSsrLCBoYXNoKTsKKwlxc3RyLT5oYXNoID0gZW5kX25hbWVfaGFzaChoYXNoKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIG1pbml4X2RlbnRyeV9vcGVyYXRpb25zID0geworCS5kX2hhc2gJCT0gbWluaXhfaGFzaCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICptaW5peF9sb29rdXAoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gTlVMTDsKKwlpbm9fdCBpbm87CisKKwlkZW50cnktPmRfb3AgPSBkaXItPmlfc2ItPnNfcm9vdC0+ZF9vcDsKKworCWlmIChkZW50cnktPmRfbmFtZS5sZW4gPiBtaW5peF9zYihkaXItPmlfc2IpLT5zX25hbWVsZW4pCisJCXJldHVybiBFUlJfUFRSKC1FTkFNRVRPT0xPTkcpOworCisJaW5vID0gbWluaXhfaW5vZGVfYnlfbmFtZShkZW50cnkpOworCWlmIChpbm8pIHsKKwkJaW5vZGUgPSBpZ2V0KGRpci0+aV9zYiwgaW5vKTsKKyAKKwkJaWYgKCFpbm9kZSkKKwkJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworCX0KKwlkX2FkZChkZW50cnksIGlub2RlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBtaW5peF9ta25vZChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsIGRldl90IHJkZXYpCit7CisJaW50IGVycm9yOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwlpZiAoIW9sZF92YWxpZF9kZXYocmRldikpCisJCXJldHVybiAtRUlOVkFMOworCisJaW5vZGUgPSBtaW5peF9uZXdfaW5vZGUoZGlyLCAmZXJyb3IpOworCisJaWYgKGlub2RlKSB7CisJCWlub2RlLT5pX21vZGUgPSBtb2RlOworCQltaW5peF9zZXRfaW5vZGUoaW5vZGUsIHJkZXYpOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJZXJyb3IgPSBhZGRfbm9uZGlyKGRlbnRyeSwgaW5vZGUpOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgbWluaXhfY3JlYXRlKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKKwkJc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJcmV0dXJuIG1pbml4X21rbm9kKGRpciwgZGVudHJ5LCBtb2RlLCAwKTsKK30KKworc3RhdGljIGludCBtaW5peF9zeW1saW5rKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCSAgY29uc3QgY2hhciAqIHN5bW5hbWUpCit7CisJaW50IGVyciA9IC1FTkFNRVRPT0xPTkc7CisJaW50IGkgPSBzdHJsZW4oc3ltbmFtZSkrMTsKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKworCWlmIChpID4gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkKKwkJZ290byBvdXQ7CisKKwlpbm9kZSA9IG1pbml4X25ld19pbm9kZShkaXIsICZlcnIpOworCWlmICghaW5vZGUpCisJCWdvdG8gb3V0OworCisJaW5vZGUtPmlfbW9kZSA9IFNfSUZMTksgfCAwNzc3OworCW1pbml4X3NldF9pbm9kZShpbm9kZSwgMCk7CisJZXJyID0gcGFnZV9zeW1saW5rKGlub2RlLCBzeW1uYW1lLCBpKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mYWlsOworCisJZXJyID0gYWRkX25vbmRpcihkZW50cnksIGlub2RlKTsKK291dDoKKwlyZXR1cm4gZXJyOworCitvdXRfZmFpbDoKKwlkZWNfY291bnQoaW5vZGUpOworCWlwdXQoaW5vZGUpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgaW50IG1pbml4X2xpbmsoc3RydWN0IGRlbnRyeSAqIG9sZF9kZW50cnksIHN0cnVjdCBpbm9kZSAqIGRpciwKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG9sZF9kZW50cnktPmRfaW5vZGU7CisKKwlpZiAoaW5vZGUtPmlfbmxpbmsgPj0gbWluaXhfc2IoaW5vZGUtPmlfc2IpLT5zX2xpbmtfbWF4KQorCQlyZXR1cm4gLUVNTElOSzsKKworCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlpbmNfY291bnQoaW5vZGUpOworCWF0b21pY19pbmMoJmlub2RlLT5pX2NvdW50KTsKKwlyZXR1cm4gYWRkX25vbmRpcihkZW50cnksIGlub2RlKTsKK30KKworc3RhdGljIGludCBtaW5peF9ta2RpcihzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpCit7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJaW50IGVyciA9IC1FTUxJTks7CisKKwlpZiAoZGlyLT5pX25saW5rID49IG1pbml4X3NiKGRpci0+aV9zYiktPnNfbGlua19tYXgpCisJCWdvdG8gb3V0OworCisJaW5jX2NvdW50KGRpcik7CisKKwlpbm9kZSA9IG1pbml4X25ld19pbm9kZShkaXIsICZlcnIpOworCWlmICghaW5vZGUpCisJCWdvdG8gb3V0X2RpcjsKKworCWlub2RlLT5pX21vZGUgPSBTX0lGRElSIHwgbW9kZTsKKwlpZiAoZGlyLT5pX21vZGUgJiBTX0lTR0lEKQorCQlpbm9kZS0+aV9tb2RlIHw9IFNfSVNHSUQ7CisJbWluaXhfc2V0X2lub2RlKGlub2RlLCAwKTsKKworCWluY19jb3VudChpbm9kZSk7CisKKwllcnIgPSBtaW5peF9tYWtlX2VtcHR5KGlub2RlLCBkaXIpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2ZhaWw7CisKKwllcnIgPSBtaW5peF9hZGRfbGluayhkZW50cnksIGlub2RlKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mYWlsOworCisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKK291dDoKKwlyZXR1cm4gZXJyOworCitvdXRfZmFpbDoKKwlkZWNfY291bnQoaW5vZGUpOworCWRlY19jb3VudChpbm9kZSk7CisJaXB1dChpbm9kZSk7CitvdXRfZGlyOgorCWRlY19jb3VudChkaXIpOworCWdvdG8gb3V0OworfQorCitzdGF0aWMgaW50IG1pbml4X3VubGluayhzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpbnQgZXJyID0gLUVOT0VOVDsKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgcGFnZSAqIHBhZ2U7CisJc3RydWN0IG1pbml4X2Rpcl9lbnRyeSAqIGRlOworCisJZGUgPSBtaW5peF9maW5kX2VudHJ5KGRlbnRyeSwgJnBhZ2UpOworCWlmICghZGUpCisJCWdvdG8gZW5kX3VubGluazsKKworCWVyciA9IG1pbml4X2RlbGV0ZV9lbnRyeShkZSwgcGFnZSk7CisJaWYgKGVycikKKwkJZ290byBlbmRfdW5saW5rOworCisJaW5vZGUtPmlfY3RpbWUgPSBkaXItPmlfY3RpbWU7CisJZGVjX2NvdW50KGlub2RlKTsKK2VuZF91bmxpbms6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtaW5peF9ybWRpcihzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgZXJyID0gLUVOT1RFTVBUWTsKKworCWlmIChtaW5peF9lbXB0eV9kaXIoaW5vZGUpKSB7CisJCWVyciA9IG1pbml4X3VubGluayhkaXIsIGRlbnRyeSk7CisJCWlmICghZXJyKSB7CisJCQlkZWNfY291bnQoZGlyKTsKKwkJCWRlY19jb3VudChpbm9kZSk7CisJCX0KKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtaW5peF9yZW5hbWUoc3RydWN0IGlub2RlICogb2xkX2Rpciwgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwKKwkJCSAgIHN0cnVjdCBpbm9kZSAqIG5ld19kaXIsIHN0cnVjdCBkZW50cnkgKm5ld19kZW50cnkpCit7CisJc3RydWN0IG1pbml4X3NiX2luZm8gKiBpbmZvID0gbWluaXhfc2Iob2xkX2Rpci0+aV9zYik7CisJc3RydWN0IGlub2RlICogb2xkX2lub2RlID0gb2xkX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKiBuZXdfaW5vZGUgPSBuZXdfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBwYWdlICogZGlyX3BhZ2UgPSBOVUxMOworCXN0cnVjdCBtaW5peF9kaXJfZW50cnkgKiBkaXJfZGUgPSBOVUxMOworCXN0cnVjdCBwYWdlICogb2xkX3BhZ2U7CisJc3RydWN0IG1pbml4X2Rpcl9lbnRyeSAqIG9sZF9kZTsKKwlpbnQgZXJyID0gLUVOT0VOVDsKKworCW9sZF9kZSA9IG1pbml4X2ZpbmRfZW50cnkob2xkX2RlbnRyeSwgJm9sZF9wYWdlKTsKKwlpZiAoIW9sZF9kZSkKKwkJZ290byBvdXQ7CisKKwlpZiAoU19JU0RJUihvbGRfaW5vZGUtPmlfbW9kZSkpIHsKKwkJZXJyID0gLUVJTzsKKwkJZGlyX2RlID0gbWluaXhfZG90ZG90KG9sZF9pbm9kZSwgJmRpcl9wYWdlKTsKKwkJaWYgKCFkaXJfZGUpCisJCQlnb3RvIG91dF9vbGQ7CisJfQorCisJaWYgKG5ld19pbm9kZSkgeworCQlzdHJ1Y3QgcGFnZSAqIG5ld19wYWdlOworCQlzdHJ1Y3QgbWluaXhfZGlyX2VudHJ5ICogbmV3X2RlOworCisJCWVyciA9IC1FTk9URU1QVFk7CisJCWlmIChkaXJfZGUgJiYgIW1pbml4X2VtcHR5X2RpcihuZXdfaW5vZGUpKQorCQkJZ290byBvdXRfZGlyOworCisJCWVyciA9IC1FTk9FTlQ7CisJCW5ld19kZSA9IG1pbml4X2ZpbmRfZW50cnkobmV3X2RlbnRyeSwgJm5ld19wYWdlKTsKKwkJaWYgKCFuZXdfZGUpCisJCQlnb3RvIG91dF9kaXI7CisJCWluY19jb3VudChvbGRfaW5vZGUpOworCQltaW5peF9zZXRfbGluayhuZXdfZGUsIG5ld19wYWdlLCBvbGRfaW5vZGUpOworCQluZXdfaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCQlpZiAoZGlyX2RlKQorCQkJbmV3X2lub2RlLT5pX25saW5rLS07CisJCWRlY19jb3VudChuZXdfaW5vZGUpOworCX0gZWxzZSB7CisJCWlmIChkaXJfZGUpIHsKKwkJCWVyciA9IC1FTUxJTks7CisJCQlpZiAobmV3X2Rpci0+aV9ubGluayA+PSBpbmZvLT5zX2xpbmtfbWF4KQorCQkJCWdvdG8gb3V0X2RpcjsKKwkJfQorCQlpbmNfY291bnQob2xkX2lub2RlKTsKKwkJZXJyID0gbWluaXhfYWRkX2xpbmsobmV3X2RlbnRyeSwgb2xkX2lub2RlKTsKKwkJaWYgKGVycikgeworCQkJZGVjX2NvdW50KG9sZF9pbm9kZSk7CisJCQlnb3RvIG91dF9kaXI7CisJCX0KKwkJaWYgKGRpcl9kZSkKKwkJCWluY19jb3VudChuZXdfZGlyKTsKKwl9CisKKwltaW5peF9kZWxldGVfZW50cnkob2xkX2RlLCBvbGRfcGFnZSk7CisJZGVjX2NvdW50KG9sZF9pbm9kZSk7CisKKwlpZiAoZGlyX2RlKSB7CisJCW1pbml4X3NldF9saW5rKGRpcl9kZSwgZGlyX3BhZ2UsIG5ld19kaXIpOworCQlkZWNfY291bnQob2xkX2Rpcik7CisJfQorCXJldHVybiAwOworCitvdXRfZGlyOgorCWlmIChkaXJfZGUpIHsKKwkJa3VubWFwKGRpcl9wYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKGRpcl9wYWdlKTsKKwl9CitvdXRfb2xkOgorCWt1bm1hcChvbGRfcGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKG9sZF9wYWdlKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogZGlyZWN0b3JpZXMgY2FuIGhhbmRsZSBtb3N0IG9wZXJhdGlvbnMuLi4KKyAqLworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgbWluaXhfZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLmNyZWF0ZQkJPSBtaW5peF9jcmVhdGUsCisJLmxvb2t1cAkJPSBtaW5peF9sb29rdXAsCisJLmxpbmsJCT0gbWluaXhfbGluaywKKwkudW5saW5rCQk9IG1pbml4X3VubGluaywKKwkuc3ltbGluawk9IG1pbml4X3N5bWxpbmssCisJLm1rZGlyCQk9IG1pbml4X21rZGlyLAorCS5ybWRpcgkJPSBtaW5peF9ybWRpciwKKwkubWtub2QJCT0gbWluaXhfbWtub2QsCisJLnJlbmFtZQkJPSBtaW5peF9yZW5hbWUsCisJLmdldGF0dHIJPSBtaW5peF9nZXRhdHRyLAorfTsKZGlmZiAtLWdpdCBhL2ZzL21wYWdlLmMgYi9mcy9tcGFnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZDhkMWEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9tcGFnZS5jCkBAIC0wLDAgKzEsNzcyIEBACisvKgorICogZnMvbXBhZ2UuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiwgTGludXMgVG9ydmFsZHMuCisgKgorICogQ29udGFpbnMgZnVuY3Rpb25zIHJlbGF0ZWQgdG8gcHJlcGFyaW5nIGFuZCBzdWJtaXR0aW5nIEJJT3Mgd2hpY2ggY29udGFpbgorICogbXVsdGlwbGUgcGFnZWNhY2hlIHBhZ2VzLgorICoKKyAqIDE1TWF5MjAwMglha3BtQHppcC5jb20uYXUKKyAqCQlJbml0aWFsIHZlcnNpb24KKyAqIDI3SnVuMjAwMglheGJvZUBzdXNlLmRlCisgKgkJdXNlIGJpb19hZGRfcGFnZSgpIHRvIGJ1aWxkIGJpbydzIGp1c3QgdGhlIHJpZ2h0IHNpemUKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KKyNpbmNsdWRlIDxsaW51eC9iaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CisjaW5jbHVkZSA8bGludXgvbXBhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KKyNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2V2ZWMuaD4KKworLyoKKyAqIEkvTyBjb21wbGV0aW9uIGhhbmRsZXIgZm9yIG11bHRpcGFnZSBCSU9zLgorICoKKyAqIFRoZSBtcGFnZSBjb2RlIG5ldmVyIHB1dHMgcGFydGlhbCBwYWdlcyBpbnRvIGEgQklPIChleGNlcHQgZm9yIGVuZC1vZi1maWxlKS4KKyAqIElmIGEgcGFnZSBkb2VzIG5vdCBtYXAgdG8gYSBjb250aWd1b3VzIHJ1biBvZiBibG9ja3MgdGhlbiBpdCBzaW1wbHkgZmFsbHMKKyAqIGJhY2sgdG8gYmxvY2tfcmVhZF9mdWxsX3BhZ2UoKS4KKyAqCisgKiBXaHkgaXMgdGhpcz8gIElmIGEgcGFnZSdzIGNvbXBsZXRpb24gZGVwZW5kcyBvbiBhIG51bWJlciBvZiBkaWZmZXJlbnQgQklPcworICogd2hpY2ggY2FuIGNvbXBsZXRlIGluIGFueSBvcmRlciAob3IgYXQgdGhlIHNhbWUgdGltZSkgdGhlbiBkZXRlcm1pbmluZyB0aGUKKyAqIHN0YXR1cyBvZiB0aGF0IHBhZ2UgaXMgaGFyZC4gIFNlZSBlbmRfYnVmZmVyX2FzeW5jX3JlYWQoKSBmb3IgdGhlIGRldGFpbHMuCisgKiBUaGVyZSBpcyBubyBwb2ludCBpbiBkdXBsaWNhdGluZyBhbGwgdGhhdCBjb21wbGV4aXR5LgorICovCitzdGF0aWMgaW50IG1wYWdlX2VuZF9pb19yZWFkKHN0cnVjdCBiaW8gKmJpbywgdW5zaWduZWQgaW50IGJ5dGVzX2RvbmUsIGludCBlcnIpCit7CisJY29uc3QgaW50IHVwdG9kYXRlID0gdGVzdF9iaXQoQklPX1VQVE9EQVRFLCAmYmlvLT5iaV9mbGFncyk7CisJc3RydWN0IGJpb192ZWMgKmJ2ZWMgPSBiaW8tPmJpX2lvX3ZlYyArIGJpby0+YmlfdmNudCAtIDE7CisKKwlpZiAoYmlvLT5iaV9zaXplKQorCQlyZXR1cm4gMTsKKworCWRvIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBidmVjLT5idl9wYWdlOworCisJCWlmICgtLWJ2ZWMgPj0gYmlvLT5iaV9pb192ZWMpCisJCQlwcmVmZXRjaHcoJmJ2ZWMtPmJ2X3BhZ2UtPmZsYWdzKTsKKworCQlpZiAodXB0b2RhdGUpIHsKKwkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJfSBlbHNlIHsKKwkJCUNsZWFyUGFnZVVwdG9kYXRlKHBhZ2UpOworCQkJU2V0UGFnZUVycm9yKHBhZ2UpOworCQl9CisJCXVubG9ja19wYWdlKHBhZ2UpOworCX0gd2hpbGUgKGJ2ZWMgPj0gYmlvLT5iaV9pb192ZWMpOworCWJpb19wdXQoYmlvKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtcGFnZV9lbmRfaW9fd3JpdGUoc3RydWN0IGJpbyAqYmlvLCB1bnNpZ25lZCBpbnQgYnl0ZXNfZG9uZSwgaW50IGVycikKK3sKKwljb25zdCBpbnQgdXB0b2RhdGUgPSB0ZXN0X2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKTsKKwlzdHJ1Y3QgYmlvX3ZlYyAqYnZlYyA9IGJpby0+YmlfaW9fdmVjICsgYmlvLT5iaV92Y250IC0gMTsKKworCWlmIChiaW8tPmJpX3NpemUpCisJCXJldHVybiAxOworCisJZG8geworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGJ2ZWMtPmJ2X3BhZ2U7CisKKwkJaWYgKC0tYnZlYyA+PSBiaW8tPmJpX2lvX3ZlYykKKwkJCXByZWZldGNodygmYnZlYy0+YnZfcGFnZS0+ZmxhZ3MpOworCisJCWlmICghdXB0b2RhdGUpCisJCQlTZXRQYWdlRXJyb3IocGFnZSk7CisJCWVuZF9wYWdlX3dyaXRlYmFjayhwYWdlKTsKKwl9IHdoaWxlIChidmVjID49IGJpby0+YmlfaW9fdmVjKTsKKwliaW9fcHV0KGJpbyk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBiaW8gKm1wYWdlX2Jpb19zdWJtaXQoaW50IHJ3LCBzdHJ1Y3QgYmlvICpiaW8pCit7CisJYmlvLT5iaV9lbmRfaW8gPSBtcGFnZV9lbmRfaW9fcmVhZDsKKwlpZiAocncgPT0gV1JJVEUpCisJCWJpby0+YmlfZW5kX2lvID0gbXBhZ2VfZW5kX2lvX3dyaXRlOworCXN1Ym1pdF9iaW8ocncsIGJpbyk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmlvICoKK21wYWdlX2FsbG9jKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJCXNlY3Rvcl90IGZpcnN0X3NlY3RvciwgaW50IG5yX3ZlY3MsCisJCXVuc2lnbmVkIGludCBfX25vY2FzdCBnZnBfZmxhZ3MpCit7CisJc3RydWN0IGJpbyAqYmlvOworCisJYmlvID0gYmlvX2FsbG9jKGdmcF9mbGFncywgbnJfdmVjcyk7CisKKwlpZiAoYmlvID09IE5VTEwgJiYgKGN1cnJlbnQtPmZsYWdzICYgUEZfTUVNQUxMT0MpKSB7CisJCXdoaWxlICghYmlvICYmIChucl92ZWNzIC89IDIpKQorCQkJYmlvID0gYmlvX2FsbG9jKGdmcF9mbGFncywgbnJfdmVjcyk7CisJfQorCisJaWYgKGJpbykgeworCQliaW8tPmJpX2JkZXYgPSBiZGV2OworCQliaW8tPmJpX3NlY3RvciA9IGZpcnN0X3NlY3RvcjsKKwl9CisJcmV0dXJuIGJpbzsKK30KKworLyoKKyAqIHN1cHBvcnQgZnVuY3Rpb24gZm9yIG1wYWdlX3JlYWRwYWdlcy4gIFRoZSBmcyBzdXBwbGllZCBnZXRfYmxvY2sgbWlnaHQKKyAqIHJldHVybiBhbiB1cCB0byBkYXRlIGJ1ZmZlci4gIFRoaXMgaXMgdXNlZCB0byBtYXAgdGhhdCBidWZmZXIgaW50bworICogdGhlIHBhZ2UsIHdoaWNoIGFsbG93cyByZWFkcGFnZSB0byBhdm9pZCB0cmlnZ2VyaW5nIGEgZHVwbGljYXRlIGNhbGwKKyAqIHRvIGdldF9ibG9jay4KKyAqCisgKiBUaGUgaWRlYSBpcyB0byBhdm9pZCBhZGRpbmcgYnVmZmVycyB0byBwYWdlcyB0aGF0IGRvbid0IGFscmVhZHkgaGF2ZQorICogdGhlbS4gIFNvIHdoZW4gdGhlIGJ1ZmZlciBpcyB1cCB0byBkYXRlIGFuZCB0aGUgcGFnZSBzaXplID09IGJsb2NrIHNpemUsCisgKiB0aGlzIG1hcmtzIHRoZSBwYWdlIHVwIHRvIGRhdGUgaW5zdGVhZCBvZiBhZGRpbmcgbmV3IGJ1ZmZlcnMuCisgKi8KK3N0YXRpYyB2b2lkIAorbWFwX2J1ZmZlcl90b19wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgcGFnZV9ibG9jaykgCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpwYWdlX2JoLCAqaGVhZDsKKwlpbnQgYmxvY2sgPSAwOworCisJaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSB7CisJCS8qCisJCSAqIGRvbid0IG1ha2UgYW55IGJ1ZmZlcnMgaWYgdGhlcmUgaXMgb25seSBvbmUgYnVmZmVyIG9uCisJCSAqIHRoZSBwYWdlIGFuZCB0aGUgcGFnZSBqdXN0IG5lZWRzIHRvIGJlIHNldCB1cCB0byBkYXRlCisJCSAqLworCQlpZiAoaW5vZGUtPmlfYmxrYml0cyA9PSBQQUdFX0NBQ0hFX1NISUZUICYmIAorCQkgICAgYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOyAgICAKKwkJCXJldHVybjsKKwkJfQorCQljcmVhdGVfZW1wdHlfYnVmZmVycyhwYWdlLCAxIDw8IGlub2RlLT5pX2Jsa2JpdHMsIDApOworCX0KKwloZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCXBhZ2VfYmggPSBoZWFkOworCWRvIHsKKwkJaWYgKGJsb2NrID09IHBhZ2VfYmxvY2spIHsKKwkJCXBhZ2VfYmgtPmJfc3RhdGUgPSBiaC0+Yl9zdGF0ZTsKKwkJCXBhZ2VfYmgtPmJfYmRldiA9IGJoLT5iX2JkZXY7CisJCQlwYWdlX2JoLT5iX2Jsb2NrbnIgPSBiaC0+Yl9ibG9ja25yOworCQkJYnJlYWs7CisJCX0KKwkJcGFnZV9iaCA9IHBhZ2VfYmgtPmJfdGhpc19wYWdlOworCQlibG9jaysrOworCX0gd2hpbGUgKHBhZ2VfYmggIT0gaGVhZCk7Cit9CisKKy8qKgorICogbXBhZ2VfcmVhZHBhZ2VzIC0gcG9wdWxhdGUgYW4gYWRkcmVzcyBzcGFjZSB3aXRoIHNvbWUgcGFnZXMsIGFuZAorICogICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0IHJlYWRzIGFnYWluc3QgdGhlbS4KKyAqCisgKiBAbWFwcGluZzogdGhlIGFkZHJlc3Nfc3BhY2UKKyAqIEBwYWdlczogVGhlIGFkZHJlc3Mgb2YgYSBsaXN0X2hlYWQgd2hpY2ggY29udGFpbnMgdGhlIHRhcmdldCBwYWdlcy4gIFRoZXNlCisgKiAgIHBhZ2VzIGhhdmUgdGhlaXIgLT5pbmRleCBwb3B1bGF0ZWQgYW5kIGFyZSBvdGhlcndpc2UgdW5pbml0aWFsaXNlZC4KKyAqCisgKiAgIFRoZSBwYWdlIGF0IEBwYWdlcy0+cHJldiBoYXMgdGhlIGxvd2VzdCBmaWxlIG9mZnNldCwgYW5kIHJlYWRzIHNob3VsZCBiZQorICogICBpc3N1ZWQgaW4gQHBhZ2VzLT5wcmV2IHRvIEBwYWdlcy0+bmV4dCBvcmRlci4KKyAqCisgKiBAbnJfcGFnZXM6IFRoZSBudW1iZXIgb2YgcGFnZXMgYXQgKkBwYWdlcworICogQGdldF9ibG9jazogVGhlIGZpbGVzeXN0ZW0ncyBibG9jayBtYXBwZXIgZnVuY3Rpb24uCisgKgorICogVGhpcyBmdW5jdGlvbiB3YWxrcyB0aGUgcGFnZXMgYW5kIHRoZSBibG9ja3Mgd2l0aGluIGVhY2ggcGFnZSwgYnVpbGRpbmcgYW5kCisgKiBlbWl0dGluZyBsYXJnZSBCSU9zLgorICoKKyAqIElmIGFueXRoaW5nIHVudXN1YWwgaGFwcGVucywgc3VjaCBhczoKKyAqCisgKiAtIGVuY291bnRlcmluZyBhIHBhZ2Ugd2hpY2ggaGFzIGJ1ZmZlcnMKKyAqIC0gZW5jb3VudGVyaW5nIGEgcGFnZSB3aGljaCBoYXMgYSBub24taG9sZSBhZnRlciBhIGhvbGUKKyAqIC0gZW5jb3VudGVyaW5nIGEgcGFnZSB3aXRoIG5vbi1jb250aWd1b3VzIGJsb2NrcworICoKKyAqIHRoZW4gdGhpcyBjb2RlIGp1c3QgZ2l2ZXMgdXAgYW5kIGNhbGxzIHRoZSBidWZmZXJfaGVhZC1iYXNlZCByZWFkIGZ1bmN0aW9uLgorICogSXQgZG9lcyBoYW5kbGUgYSBwYWdlIHdoaWNoIGhhcyBob2xlcyBhdCB0aGUgZW5kIC0gdGhhdCBpcyBhIGNvbW1vbiBjYXNlOgorICogdGhlIGVuZC1vZi1maWxlIG9uIGJsb2Nrc2l6ZSA8IFBBR0VfQ0FDSEVfU0laRSBzZXR1cHMuCisgKgorICogQkhfQm91bmRhcnkgZXhwbGFuYXRpb246CisgKgorICogVGhlcmUgaXMgYSBwcm9ibGVtLiAgVGhlIG1wYWdlIHJlYWQgY29kZSBhc3NlbWJsZXMgc2V2ZXJhbCBwYWdlcywgZ2V0cyBhbGwKKyAqIHRoZWlyIGRpc2sgbWFwcGluZ3MsIGFuZCB0aGVuIHN1Ym1pdHMgdGhlbSBhbGwuICBUaGF0J3MgZmluZSwgYnV0IG9idGFpbmluZworICogdGhlIGRpc2sgbWFwcGluZ3MgbWF5IHJlcXVpcmUgSS9PLiAgUmVhZHMgb2YgaW5kaXJlY3QgYmxvY2tzLCBmb3IgZXhhbXBsZS4KKyAqCisgKiBTbyBhbiBtcGFnZSByZWFkIG9mIHRoZSBmaXJzdCAxNiBibG9ja3Mgb2YgYW4gZXh0MiBmaWxlIHdpbGwgY2F1c2UgSS9PIHRvIGJlCisgKiBzdWJtaXR0ZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKKyAqIAkxMiAwIDEgMiAzIDQgNSA2IDcgOCA5IDEwIDExIDEzIDE0IDE1IDE2CisgKiBiZWNhdXNlIHRoZSBpbmRpcmVjdCBibG9jayBoYXMgdG8gYmUgcmVhZCB0byBnZXQgdGhlIG1hcHBpbmdzIG9mIGJsb2NrcworICogMTMsMTQsMTUsMTYuICBPYnZpb3VzbHksIHRoaXMgaW1wYWN0cyBwZXJmb3JtYW5jZS4KKyAqIAorICogU28gd2hhdCB3ZSBkbyBpdCB0byBhbGxvdyB0aGUgZmlsZXN5c3RlbSdzIGdldF9ibG9jaygpIGZ1bmN0aW9uIHRvIHNldAorICogQkhfQm91bmRhcnkgd2hlbiBpdCBtYXBzIGJsb2NrIDExLiAgQkhfQm91bmRhcnkgc2F5czogbWFwcGluZyBvZiB0aGUgYmxvY2sKKyAqIGFmdGVyIHRoaXMgb25lIHdpbGwgcmVxdWlyZSBJL08gYWdhaW5zdCBhIGJsb2NrIHdoaWNoIGlzIHByb2JhYmx5IGNsb3NlIHRvCisgKiB0aGlzIG9uZS4gIFNvIHlvdSBzaG91bGQgcHVzaCB3aGF0IEkvTyB5b3UgaGF2ZSBjdXJyZW50bHkgYWNjdW11bGF0ZWQuCisgKgorICogVGhpcyBhbGwgY2F1c2VzIHRoZSBkaXNrIHJlcXVlc3RzIHRvIGJlIGlzc3VlZCBpbiB0aGUgY29ycmVjdCBvcmRlci4KKyAqLworc3RhdGljIHN0cnVjdCBiaW8gKgorZG9fbXBhZ2VfcmVhZHBhZ2Uoc3RydWN0IGJpbyAqYmlvLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbnJfcGFnZXMsCisJCQlzZWN0b3JfdCAqbGFzdF9ibG9ja19pbl9iaW8sIGdldF9ibG9ja190IGdldF9ibG9jaykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwljb25zdCB1bnNpZ25lZCBibGtiaXRzID0gaW5vZGUtPmlfYmxrYml0czsKKwljb25zdCB1bnNpZ25lZCBibG9ja3NfcGVyX3BhZ2UgPSBQQUdFX0NBQ0hFX1NJWkUgPj4gYmxrYml0czsKKwljb25zdCB1bnNpZ25lZCBibG9ja3NpemUgPSAxIDw8IGJsa2JpdHM7CisJc2VjdG9yX3QgYmxvY2tfaW5fZmlsZTsKKwlzZWN0b3JfdCBsYXN0X2Jsb2NrOworCXNlY3Rvcl90IGJsb2Nrc1tNQVhfQlVGX1BFUl9QQUdFXTsKKwl1bnNpZ25lZCBwYWdlX2Jsb2NrOworCXVuc2lnbmVkIGZpcnN0X2hvbGUgPSBibG9ja3NfcGVyX3BhZ2U7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IE5VTEw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkIGJoOworCWludCBsZW5ndGg7CisJaW50IGZ1bGx5X21hcHBlZCA9IDE7CisKKwlpZiAocGFnZV9oYXNfYnVmZmVycyhwYWdlKSkKKwkJZ290byBjb25mdXNlZDsKKworCWJsb2NrX2luX2ZpbGUgPSBwYWdlLT5pbmRleCA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIGJsa2JpdHMpOworCWxhc3RfYmxvY2sgPSAoaV9zaXplX3JlYWQoaW5vZGUpICsgYmxvY2tzaXplIC0gMSkgPj4gYmxrYml0czsKKworCWJoLmJfcGFnZSA9IHBhZ2U7CisJZm9yIChwYWdlX2Jsb2NrID0gMDsgcGFnZV9ibG9jayA8IGJsb2Nrc19wZXJfcGFnZTsKKwkJCQlwYWdlX2Jsb2NrKyssIGJsb2NrX2luX2ZpbGUrKykgeworCQliaC5iX3N0YXRlID0gMDsKKwkJaWYgKGJsb2NrX2luX2ZpbGUgPCBsYXN0X2Jsb2NrKSB7CisJCQlpZiAoZ2V0X2Jsb2NrKGlub2RlLCBibG9ja19pbl9maWxlLCAmYmgsIDApKQorCQkJCWdvdG8gY29uZnVzZWQ7CisJCX0KKworCQlpZiAoIWJ1ZmZlcl9tYXBwZWQoJmJoKSkgeworCQkJZnVsbHlfbWFwcGVkID0gMDsKKwkJCWlmIChmaXJzdF9ob2xlID09IGJsb2Nrc19wZXJfcGFnZSkKKwkJCQlmaXJzdF9ob2xlID0gcGFnZV9ibG9jazsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogc29tZSBmaWxlc3lzdGVtcyB3aWxsIGNvcHkgZGF0YSBpbnRvIHRoZSBwYWdlIGR1cmluZworCQkgKiB0aGUgZ2V0X2Jsb2NrIGNhbGwsIGluIHdoaWNoIGNhc2Ugd2UgZG9uJ3Qgd2FudCB0bworCQkgKiByZWFkIGl0IGFnYWluLiAgbWFwX2J1ZmZlcl90b19wYWdlIGNvcGllcyB0aGUgZGF0YQorCQkgKiB3ZSBqdXN0IGNvbGxlY3RlZCBmcm9tIGdldF9ibG9jayBpbnRvIHRoZSBwYWdlJ3MgYnVmZmVycworCQkgKiBzbyByZWFkcGFnZSBkb2Vzbid0IGhhdmUgdG8gcmVwZWF0IHRoZSBnZXRfYmxvY2sgY2FsbAorCQkgKi8KKwkJaWYgKGJ1ZmZlcl91cHRvZGF0ZSgmYmgpKSB7CisJCQltYXBfYnVmZmVyX3RvX3BhZ2UocGFnZSwgJmJoLCBwYWdlX2Jsb2NrKTsKKwkJCWdvdG8gY29uZnVzZWQ7CisJCX0KKwkKKwkJaWYgKGZpcnN0X2hvbGUgIT0gYmxvY2tzX3Blcl9wYWdlKQorCQkJZ290byBjb25mdXNlZDsJCS8qIGhvbGUgLT4gbm9uLWhvbGUgKi8KKworCQkvKiBDb250aWd1b3VzIGJsb2Nrcz8gKi8KKwkJaWYgKHBhZ2VfYmxvY2sgJiYgYmxvY2tzW3BhZ2VfYmxvY2stMV0gIT0gYmguYl9ibG9ja25yLTEpCisJCQlnb3RvIGNvbmZ1c2VkOworCQlibG9ja3NbcGFnZV9ibG9ja10gPSBiaC5iX2Jsb2NrbnI7CisJCWJkZXYgPSBiaC5iX2JkZXY7CisJfQorCisJaWYgKGZpcnN0X2hvbGUgIT0gYmxvY2tzX3Blcl9wYWdlKSB7CisJCWNoYXIgKmthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQltZW1zZXQoa2FkZHIgKyAoZmlyc3RfaG9sZSA8PCBibGtiaXRzKSwgMCwKKwkJCQlQQUdFX0NBQ0hFX1NJWkUgLSAoZmlyc3RfaG9sZSA8PCBibGtiaXRzKSk7CisJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJCWlmIChmaXJzdF9ob2xlID09IDApIHsKKwkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJZ290byBvdXQ7CisJCX0KKwl9IGVsc2UgaWYgKGZ1bGx5X21hcHBlZCkgeworCQlTZXRQYWdlTWFwcGVkVG9EaXNrKHBhZ2UpOworCX0KKworCS8qCisJICogVGhpcyBwYWdlIHdpbGwgZ28gdG8gQklPLiAgRG8gd2UgbmVlZCB0byBzZW5kIHRoaXMgQklPIG9mZiBmaXJzdD8KKwkgKi8KKwlpZiAoYmlvICYmICgqbGFzdF9ibG9ja19pbl9iaW8gIT0gYmxvY2tzWzBdIC0gMSkpCisJCWJpbyA9IG1wYWdlX2Jpb19zdWJtaXQoUkVBRCwgYmlvKTsKKworYWxsb2NfbmV3OgorCWlmIChiaW8gPT0gTlVMTCkgeworCQliaW8gPSBtcGFnZV9hbGxvYyhiZGV2LCBibG9ja3NbMF0gPDwgKGJsa2JpdHMgLSA5KSwKKwkJCSAgCW1pbl90KGludCwgbnJfcGFnZXMsIGJpb19nZXRfbnJfdmVjcyhiZGV2KSksCisJCQkJR0ZQX0tFUk5FTCk7CisJCWlmIChiaW8gPT0gTlVMTCkKKwkJCWdvdG8gY29uZnVzZWQ7CisJfQorCisJbGVuZ3RoID0gZmlyc3RfaG9sZSA8PCBibGtiaXRzOworCWlmIChiaW9fYWRkX3BhZ2UoYmlvLCBwYWdlLCBsZW5ndGgsIDApIDwgbGVuZ3RoKSB7CisJCWJpbyA9IG1wYWdlX2Jpb19zdWJtaXQoUkVBRCwgYmlvKTsKKwkJZ290byBhbGxvY19uZXc7CisJfQorCisJaWYgKGJ1ZmZlcl9ib3VuZGFyeSgmYmgpIHx8IChmaXJzdF9ob2xlICE9IGJsb2Nrc19wZXJfcGFnZSkpCisJCWJpbyA9IG1wYWdlX2Jpb19zdWJtaXQoUkVBRCwgYmlvKTsKKwllbHNlCisJCSpsYXN0X2Jsb2NrX2luX2JpbyA9IGJsb2Nrc1tibG9ja3NfcGVyX3BhZ2UgLSAxXTsKK291dDoKKwlyZXR1cm4gYmlvOworCitjb25mdXNlZDoKKwlpZiAoYmlvKQorCQliaW8gPSBtcGFnZV9iaW9fc3VibWl0KFJFQUQsIGJpbyk7CisJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpCisJICAgICAgICBibG9ja19yZWFkX2Z1bGxfcGFnZShwYWdlLCBnZXRfYmxvY2spOworCWVsc2UKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJZ290byBvdXQ7Cit9CisKK2ludAorbXBhZ2VfcmVhZHBhZ2VzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzdHJ1Y3QgbGlzdF9oZWFkICpwYWdlcywKKwkJCQl1bnNpZ25lZCBucl9wYWdlcywgZ2V0X2Jsb2NrX3QgZ2V0X2Jsb2NrKQoreworCXN0cnVjdCBiaW8gKmJpbyA9IE5VTEw7CisJdW5zaWduZWQgcGFnZV9pZHg7CisJc2VjdG9yX3QgbGFzdF9ibG9ja19pbl9iaW8gPSAwOworCXN0cnVjdCBwYWdldmVjIGxydV9wdmVjOworCisJcGFnZXZlY19pbml0KCZscnVfcHZlYywgMCk7CisJZm9yIChwYWdlX2lkeCA9IDA7IHBhZ2VfaWR4IDwgbnJfcGFnZXM7IHBhZ2VfaWR4KyspIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBsaXN0X2VudHJ5KHBhZ2VzLT5wcmV2LCBzdHJ1Y3QgcGFnZSwgbHJ1KTsKKworCQlwcmVmZXRjaHcoJnBhZ2UtPmZsYWdzKTsKKwkJbGlzdF9kZWwoJnBhZ2UtPmxydSk7CisJCWlmICghYWRkX3RvX3BhZ2VfY2FjaGUocGFnZSwgbWFwcGluZywKKwkJCQkJcGFnZS0+aW5kZXgsIEdGUF9LRVJORUwpKSB7CisJCQliaW8gPSBkb19tcGFnZV9yZWFkcGFnZShiaW8sIHBhZ2UsCisJCQkJCW5yX3BhZ2VzIC0gcGFnZV9pZHgsCisJCQkJCSZsYXN0X2Jsb2NrX2luX2JpbywgZ2V0X2Jsb2NrKTsKKwkJCWlmICghcGFnZXZlY19hZGQoJmxydV9wdmVjLCBwYWdlKSkKKwkJCQlfX3BhZ2V2ZWNfbHJ1X2FkZCgmbHJ1X3B2ZWMpOworCQl9IGVsc2UgeworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQl9CisJfQorCXBhZ2V2ZWNfbHJ1X2FkZCgmbHJ1X3B2ZWMpOworCUJVR19PTighbGlzdF9lbXB0eShwYWdlcykpOworCWlmIChiaW8pCisJCW1wYWdlX2Jpb19zdWJtaXQoUkVBRCwgYmlvKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wobXBhZ2VfcmVhZHBhZ2VzKTsKKworLyoKKyAqIFRoaXMgaXNuJ3QgY2FsbGVkIG11Y2ggYXQgYWxsCisgKi8KK2ludCBtcGFnZV9yZWFkcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgZ2V0X2Jsb2NrX3QgZ2V0X2Jsb2NrKQoreworCXN0cnVjdCBiaW8gKmJpbyA9IE5VTEw7CisJc2VjdG9yX3QgbGFzdF9ibG9ja19pbl9iaW8gPSAwOworCisJYmlvID0gZG9fbXBhZ2VfcmVhZHBhZ2UoYmlvLCBwYWdlLCAxLAorCQkJJmxhc3RfYmxvY2tfaW5fYmlvLCBnZXRfYmxvY2spOworCWlmIChiaW8pCisJCW1wYWdlX2Jpb19zdWJtaXQoUkVBRCwgYmlvKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wobXBhZ2VfcmVhZHBhZ2UpOworCisvKgorICogV3JpdGluZyBpcyBub3Qgc28gc2ltcGxlLgorICoKKyAqIElmIHRoZSBwYWdlIGhhcyBidWZmZXJzIHRoZW4gdGhleSB3aWxsIGJlIHVzZWQgZm9yIG9idGFpbmluZyB0aGUgZGlzaworICogbWFwcGluZy4gIFdlIG9ubHkgc3VwcG9ydCBwYWdlcyB3aGljaCBhcmUgZnVsbHkgbWFwcGVkLWFuZC1kaXJ0eSwgd2l0aCBhCisgKiBzcGVjaWFsIGNhc2UgZm9yIHBhZ2VzIHdoaWNoIGFyZSB1bm1hcHBlZCBhdCB0aGUgZW5kOiBlbmQtb2YtZmlsZS4KKyAqCisgKiBJZiB0aGUgcGFnZSBoYXMgbm8gYnVmZmVycyAocHJlZmVycmVkKSB0aGVuIHRoZSBwYWdlIGlzIG1hcHBlZCBoZXJlLgorICoKKyAqIElmIGFsbCBibG9ja3MgYXJlIGZvdW5kIHRvIGJlIGNvbnRpZ3VvdXMgdGhlbiB0aGUgcGFnZSBjYW4gZ28gaW50byB0aGUKKyAqIEJJTy4gIE90aGVyd2lzZSBmYWxsIGJhY2sgdG8gdGhlIG1hcHBpbmcncyB3cml0ZXBhZ2UoKS4KKyAqIAorICogRklYTUU6IFRoaXMgY29kZSB3YW50cyBhbiBlc3RpbWF0ZSBvZiBob3cgbWFueSBwYWdlcyBhcmUgc3RpbGwgdG8gYmUKKyAqIHdyaXR0ZW4sIHNvIGl0IGNhbiBpbnRlbGxpZ2VudGx5IGFsbG9jYXRlIGEgc3VpdGFibHktc2l6ZWQgQklPLiAgRm9yIG5vdywKKyAqIGp1c3QgYWxsb2NhdGUgZnVsbC1zaXplICgxNi1wYWdlKSBCSU9zLgorICovCitzdGF0aWMgc3RydWN0IGJpbyAqCitfX21wYWdlX3dyaXRlcGFnZShzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBwYWdlICpwYWdlLCBnZXRfYmxvY2tfdCBnZXRfYmxvY2ssCisJc2VjdG9yX3QgKmxhc3RfYmxvY2tfaW5fYmlvLCBpbnQgKnJldCwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMsCisJd3JpdGVwYWdlX3Qgd3JpdGVwYWdlX2ZuKQoreworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gcGFnZS0+bWFwcGluZzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwljb25zdCB1bnNpZ25lZCBibGtiaXRzID0gaW5vZGUtPmlfYmxrYml0czsKKwl1bnNpZ25lZCBsb25nIGVuZF9pbmRleDsKKwljb25zdCB1bnNpZ25lZCBibG9ja3NfcGVyX3BhZ2UgPSBQQUdFX0NBQ0hFX1NJWkUgPj4gYmxrYml0czsKKwlzZWN0b3JfdCBsYXN0X2Jsb2NrOworCXNlY3Rvcl90IGJsb2NrX2luX2ZpbGU7CisJc2VjdG9yX3QgYmxvY2tzW01BWF9CVUZfUEVSX1BBR0VdOworCXVuc2lnbmVkIHBhZ2VfYmxvY2s7CisJdW5zaWduZWQgZmlyc3RfdW5tYXBwZWQgPSBibG9ja3NfcGVyX3BhZ2U7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IE5VTEw7CisJaW50IGJvdW5kYXJ5ID0gMDsKKwlzZWN0b3JfdCBib3VuZGFyeV9ibG9jayA9IDA7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYm91bmRhcnlfYmRldiA9IE5VTEw7CisJaW50IGxlbmd0aDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgbWFwX2JoOworCWxvZmZfdCBpX3NpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CisKKwlpZiAocGFnZV9oYXNfYnVmZmVycyhwYWdlKSkgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBoZWFkOworCisJCS8qIElmIHRoZXkncmUgYWxsIG1hcHBlZCBhbmQgZGlydHksIGRvIGl0ICovCisJCXBhZ2VfYmxvY2sgPSAwOworCQlkbyB7CisJCQlCVUdfT04oYnVmZmVyX2xvY2tlZChiaCkpOworCQkJaWYgKCFidWZmZXJfbWFwcGVkKGJoKSkgeworCQkJCS8qCisJCQkJICogdW5tYXBwZWQgZGlydHkgYnVmZmVycyBhcmUgY3JlYXRlZCBieQorCQkJCSAqIF9fc2V0X3BhZ2VfZGlydHlfYnVmZmVycyAtPiBtbWFwcGVkIGRhdGEKKwkJCQkgKi8KKwkJCQlpZiAoYnVmZmVyX2RpcnR5KGJoKSkKKwkJCQkJZ290byBjb25mdXNlZDsKKwkJCQlpZiAoZmlyc3RfdW5tYXBwZWQgPT0gYmxvY2tzX3Blcl9wYWdlKQorCQkJCQlmaXJzdF91bm1hcHBlZCA9IHBhZ2VfYmxvY2s7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmIChmaXJzdF91bm1hcHBlZCAhPSBibG9ja3NfcGVyX3BhZ2UpCisJCQkJZ290byBjb25mdXNlZDsJLyogaG9sZSAtPiBub24taG9sZSAqLworCisJCQlpZiAoIWJ1ZmZlcl9kaXJ0eShiaCkgfHwgIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCQkJZ290byBjb25mdXNlZDsKKwkJCWlmIChwYWdlX2Jsb2NrKSB7CisJCQkJaWYgKGJoLT5iX2Jsb2NrbnIgIT0gYmxvY2tzW3BhZ2VfYmxvY2stMV0gKyAxKQorCQkJCQlnb3RvIGNvbmZ1c2VkOworCQkJfQorCQkJYmxvY2tzW3BhZ2VfYmxvY2srK10gPSBiaC0+Yl9ibG9ja25yOworCQkJYm91bmRhcnkgPSBidWZmZXJfYm91bmRhcnkoYmgpOworCQkJaWYgKGJvdW5kYXJ5KSB7CisJCQkJYm91bmRhcnlfYmxvY2sgPSBiaC0+Yl9ibG9ja25yOworCQkJCWJvdW5kYXJ5X2JkZXYgPSBiaC0+Yl9iZGV2OworCQkJfQorCQkJYmRldiA9IGJoLT5iX2JkZXY7CisJCX0gd2hpbGUgKChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CisKKwkJaWYgKGZpcnN0X3VubWFwcGVkKQorCQkJZ290byBwYWdlX2lzX21hcHBlZDsKKworCQkvKgorCQkgKiBQYWdlIGhhcyBidWZmZXJzLCBidXQgdGhleSBhcmUgYWxsIHVubWFwcGVkLiBUaGUgcGFnZSB3YXMKKwkJICogY3JlYXRlZCBieSBwYWdlaW4gb3IgcmVhZCBvdmVyIGEgaG9sZSB3aGljaCB3YXMgaGFuZGxlZCBieQorCQkgKiBibG9ja19yZWFkX2Z1bGxfcGFnZSgpLiAgSWYgdGhpcyBhZGRyZXNzX3NwYWNlIGlzIGFsc28KKwkJICogdXNpbmcgbXBhZ2VfcmVhZHBhZ2VzIHRoZW4gdGhpcyBjYW4gcmFyZWx5IGhhcHBlbi4KKwkJICovCisJCWdvdG8gY29uZnVzZWQ7CisJfQorCisJLyoKKwkgKiBUaGUgcGFnZSBoYXMgbm8gYnVmZmVyczogbWFwIGl0IHRvIGRpc2sKKwkgKi8KKwlCVUdfT04oIVBhZ2VVcHRvZGF0ZShwYWdlKSk7CisJYmxvY2tfaW5fZmlsZSA9IHBhZ2UtPmluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gYmxrYml0cyk7CisJbGFzdF9ibG9jayA9IChpX3NpemUgLSAxKSA+PiBibGtiaXRzOworCW1hcF9iaC5iX3BhZ2UgPSBwYWdlOworCWZvciAocGFnZV9ibG9jayA9IDA7IHBhZ2VfYmxvY2sgPCBibG9ja3NfcGVyX3BhZ2U7ICkgeworCisJCW1hcF9iaC5iX3N0YXRlID0gMDsKKwkJaWYgKGdldF9ibG9jayhpbm9kZSwgYmxvY2tfaW5fZmlsZSwgJm1hcF9iaCwgMSkpCisJCQlnb3RvIGNvbmZ1c2VkOworCQlpZiAoYnVmZmVyX25ldygmbWFwX2JoKSkKKwkJCXVubWFwX3VuZGVybHlpbmdfbWV0YWRhdGEobWFwX2JoLmJfYmRldiwKKwkJCQkJCW1hcF9iaC5iX2Jsb2NrbnIpOworCQlpZiAoYnVmZmVyX2JvdW5kYXJ5KCZtYXBfYmgpKSB7CisJCQlib3VuZGFyeV9ibG9jayA9IG1hcF9iaC5iX2Jsb2NrbnI7CisJCQlib3VuZGFyeV9iZGV2ID0gbWFwX2JoLmJfYmRldjsKKwkJfQorCQlpZiAocGFnZV9ibG9jaykgeworCQkJaWYgKG1hcF9iaC5iX2Jsb2NrbnIgIT0gYmxvY2tzW3BhZ2VfYmxvY2stMV0gKyAxKQorCQkJCWdvdG8gY29uZnVzZWQ7CisJCX0KKwkJYmxvY2tzW3BhZ2VfYmxvY2srK10gPSBtYXBfYmguYl9ibG9ja25yOworCQlib3VuZGFyeSA9IGJ1ZmZlcl9ib3VuZGFyeSgmbWFwX2JoKTsKKwkJYmRldiA9IG1hcF9iaC5iX2JkZXY7CisJCWlmIChibG9ja19pbl9maWxlID09IGxhc3RfYmxvY2spCisJCQlicmVhazsKKwkJYmxvY2tfaW5fZmlsZSsrOworCX0KKwlCVUdfT04ocGFnZV9ibG9jayA9PSAwKTsKKworCWZpcnN0X3VubWFwcGVkID0gcGFnZV9ibG9jazsKKworcGFnZV9pc19tYXBwZWQ6CisJZW5kX2luZGV4ID0gaV9zaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJaWYgKHBhZ2UtPmluZGV4ID49IGVuZF9pbmRleCkgeworCQkvKgorCQkgKiBUaGUgcGFnZSBzdHJhZGRsZXMgaV9zaXplLiAgSXQgbXVzdCBiZSB6ZXJvZWQgb3V0IG9uIGVhY2gKKwkJICogYW5kIGV2ZXJ5IHdyaXRlcGFnZSBpbnZva2F0aW9uIGJlY2F1c2UgaXQgbWF5IGJlIG1tYXBwZWQuCisJCSAqICJBIGZpbGUgaXMgbWFwcGVkIGluIG11bHRpcGxlcyBvZiB0aGUgcGFnZSBzaXplLiAgRm9yIGEgZmlsZQorCQkgKiB0aGF0IGlzIG5vdCBhIG11bHRpcGxlIG9mIHRoZSBwYWdlIHNpemUsIHRoZSByZW1haW5pbmcgbWVtb3J5CisJCSAqIGlzIHplcm9lZCB3aGVuIG1hcHBlZCwgYW5kIHdyaXRlcyB0byB0aGF0IHJlZ2lvbiBhcmUgbm90CisJCSAqIHdyaXR0ZW4gb3V0IHRvIHRoZSBmaWxlLiIKKwkJICovCisJCXVuc2lnbmVkIG9mZnNldCA9IGlfc2l6ZSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKwkJY2hhciAqa2FkZHI7CisKKwkJaWYgKHBhZ2UtPmluZGV4ID4gZW5kX2luZGV4IHx8ICFvZmZzZXQpCisJCQlnb3RvIGNvbmZ1c2VkOworCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkJbWVtc2V0KGthZGRyICsgb2Zmc2V0LCAwLCBQQUdFX0NBQ0hFX1NJWkUgLSBvZmZzZXQpOworCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCX0KKworCS8qCisJICogVGhpcyBwYWdlIHdpbGwgZ28gdG8gQklPLiAgRG8gd2UgbmVlZCB0byBzZW5kIHRoaXMgQklPIG9mZiBmaXJzdD8KKwkgKi8KKwlpZiAoYmlvICYmICpsYXN0X2Jsb2NrX2luX2JpbyAhPSBibG9ja3NbMF0gLSAxKQorCQliaW8gPSBtcGFnZV9iaW9fc3VibWl0KFdSSVRFLCBiaW8pOworCithbGxvY19uZXc6CisJaWYgKGJpbyA9PSBOVUxMKSB7CisJCWJpbyA9IG1wYWdlX2FsbG9jKGJkZXYsIGJsb2Nrc1swXSA8PCAoYmxrYml0cyAtIDkpLAorCQkJCWJpb19nZXRfbnJfdmVjcyhiZGV2KSwgR0ZQX05PRlN8X19HRlBfSElHSCk7CisJCWlmIChiaW8gPT0gTlVMTCkKKwkJCWdvdG8gY29uZnVzZWQ7CisJfQorCisJLyoKKwkgKiBNdXN0IHRyeSB0byBhZGQgdGhlIHBhZ2UgYmVmb3JlIG1hcmtpbmcgdGhlIGJ1ZmZlciBjbGVhbiBvcgorCSAqIHRoZSBjb25mdXNlZCBmYWlsIHBhdGggYWJvdmUgKE9PTSkgd2lsbCBiZSB2ZXJ5IGNvbmZ1c2VkIHdoZW4KKwkgKiBpdCBmaW5kcyBhbGwgYmggbWFya2VkIGNsZWFuIChpLmUuIGl0IHdpbGwgbm90IHdyaXRlIGFueXRoaW5nKQorCSAqLworCWxlbmd0aCA9IGZpcnN0X3VubWFwcGVkIDw8IGJsa2JpdHM7CisJaWYgKGJpb19hZGRfcGFnZShiaW8sIHBhZ2UsIGxlbmd0aCwgMCkgPCBsZW5ndGgpIHsKKwkJYmlvID0gbXBhZ2VfYmlvX3N1Ym1pdChXUklURSwgYmlvKTsKKwkJZ290byBhbGxvY19uZXc7CisJfQorCisJLyoKKwkgKiBPSywgd2UgaGF2ZSBvdXIgQklPLCBzbyB3ZSBjYW4gbm93IG1hcmsgdGhlIGJ1ZmZlcnMgY2xlYW4uICBNYWtlCisJICogc3VyZSB0byBvbmx5IGNsZWFuIGJ1ZmZlcnMgd2hpY2ggd2Uga25vdyB3ZSdsbCBiZSB3cml0aW5nLgorCSAqLworCWlmIChwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IGhlYWQ7CisJCXVuc2lnbmVkIGJ1ZmZlcl9jb3VudGVyID0gMDsKKworCQlkbyB7CisJCQlpZiAoYnVmZmVyX2NvdW50ZXIrKyA9PSBmaXJzdF91bm1hcHBlZCkKKwkJCQlicmVhazsKKwkJCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisJCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKKwkJfSB3aGlsZSAoYmggIT0gaGVhZCk7CisKKwkJLyoKKwkJICogd2UgY2Fubm90IGRyb3AgdGhlIGJoIGlmIHRoZSBwYWdlIGlzIG5vdCB1cHRvZGF0ZQorCQkgKiBvciBhIGNvbmN1cnJlbnQgcmVhZHBhZ2Ugd291bGQgZmFpbCB0byBzZXJpYWxpemUgd2l0aCB0aGUgYmgKKwkJICogYW5kIGl0IHdvdWxkIHJlYWQgZnJvbSBkaXNrIGJlZm9yZSB3ZSByZWFjaCB0aGUgcGxhdHRlci4KKwkJICovCisJCWlmIChidWZmZXJfaGVhZHNfb3Zlcl9saW1pdCAmJiBQYWdlVXB0b2RhdGUocGFnZSkpCisJCQl0cnlfdG9fZnJlZV9idWZmZXJzKHBhZ2UpOworCX0KKworCUJVR19PTihQYWdlV3JpdGViYWNrKHBhZ2UpKTsKKwlzZXRfcGFnZV93cml0ZWJhY2socGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJaWYgKGJvdW5kYXJ5IHx8IChmaXJzdF91bm1hcHBlZCAhPSBibG9ja3NfcGVyX3BhZ2UpKSB7CisJCWJpbyA9IG1wYWdlX2Jpb19zdWJtaXQoV1JJVEUsIGJpbyk7CisJCWlmIChib3VuZGFyeV9ibG9jaykgeworCQkJd3JpdGVfYm91bmRhcnlfYmxvY2soYm91bmRhcnlfYmRldiwKKwkJCQkJYm91bmRhcnlfYmxvY2ssIDEgPDwgYmxrYml0cyk7CisJCX0KKwl9IGVsc2UgeworCQkqbGFzdF9ibG9ja19pbl9iaW8gPSBibG9ja3NbYmxvY2tzX3Blcl9wYWdlIC0gMV07CisJfQorCWdvdG8gb3V0OworCitjb25mdXNlZDoKKwlpZiAoYmlvKQorCQliaW8gPSBtcGFnZV9iaW9fc3VibWl0KFdSSVRFLCBiaW8pOworCisJaWYgKHdyaXRlcGFnZV9mbikgeworCQkqcmV0ID0gKCp3cml0ZXBhZ2VfZm4pKHBhZ2UsIHdiYyk7CisJfSBlbHNlIHsKKwkJKnJldCA9IC1FQUdBSU47CisJCWdvdG8gb3V0OworCX0KKwkvKgorCSAqIFRoZSBjYWxsZXIgaGFzIGEgcmVmIG9uIHRoZSBpbm9kZSwgc28gKm1hcHBpbmcgaXMgc3RhYmxlCisJICovCisJaWYgKCpyZXQpIHsKKwkJaWYgKCpyZXQgPT0gLUVOT1NQQykKKwkJCXNldF9iaXQoQVNfRU5PU1BDLCAmbWFwcGluZy0+ZmxhZ3MpOworCQllbHNlCisJCQlzZXRfYml0KEFTX0VJTywgJm1hcHBpbmctPmZsYWdzKTsKKwl9CitvdXQ6CisJcmV0dXJuIGJpbzsKK30KKworLyoqCisgKiBtcGFnZV93cml0ZXBhZ2VzIC0gd2FsayB0aGUgbGlzdCBvZiBkaXJ0eSBwYWdlcyBvZiB0aGUgZ2l2ZW4KKyAqIGFkZHJlc3Mgc3BhY2UgYW5kIHdyaXRlcGFnZSgpIGFsbCBvZiB0aGVtLgorICogCisgKiBAbWFwcGluZzogYWRkcmVzcyBzcGFjZSBzdHJ1Y3R1cmUgdG8gd3JpdGUKKyAqIEB3YmM6IHN1YnRyYWN0IHRoZSBudW1iZXIgb2Ygd3JpdHRlbiBwYWdlcyBmcm9tICpAd2JjLT5ucl90b193cml0ZQorICogQGdldF9ibG9jazogdGhlIGZpbGVzeXN0ZW0ncyBibG9jayBtYXBwZXIgZnVuY3Rpb24uCisgKiAgICAgICAgICAgICBJZiB0aGlzIGlzIE5VTEwgdGhlbiB1c2UgYV9vcHMtPndyaXRlcGFnZS4gIE90aGVyd2lzZSwgZ28KKyAqICAgICAgICAgICAgIGRpcmVjdC10by1CSU8uCisgKgorICogVGhpcyBpcyBhIGxpYnJhcnkgZnVuY3Rpb24sIHdoaWNoIGltcGxlbWVudHMgdGhlIHdyaXRlcGFnZXMoKQorICogYWRkcmVzc19zcGFjZV9vcGVyYXRpb24uCisgKgorICogSWYgYSBwYWdlIGlzIGFscmVhZHkgdW5kZXIgSS9PLCBnZW5lcmljX3dyaXRlcGFnZXMoKSBza2lwcyBpdCwgZXZlbgorICogaWYgaXQncyBkaXJ0eS4gIFRoaXMgaXMgZGVzaXJhYmxlIGJlaGF2aW91ciBmb3IgbWVtb3J5LWNsZWFuaW5nIHdyaXRlYmFjaywKKyAqIGJ1dCBpdCBpcyBJTkNPUlJFQ1QgZm9yIGRhdGEtaW50ZWdyaXR5IHN5c3RlbSBjYWxscyBzdWNoIGFzIGZzeW5jKCkuICBmc3luYygpCisgKiBhbmQgbXN5bmMoKSBuZWVkIHRvIGd1YXJhbnRlZSB0aGF0IGFsbCB0aGUgZGF0YSB3aGljaCB3YXMgZGlydHkgYXQgdGhlIHRpbWUKKyAqIHRoZSBjYWxsIHdhcyBtYWRlIGdldCBuZXcgSS9PIHN0YXJ0ZWQgYWdhaW5zdCB0aGVtLiAgSWYgd2JjLT5zeW5jX21vZGUgaXMKKyAqIFdCX1NZTkNfQUxMIHRoZW4gd2Ugd2VyZSBjYWxsZWQgZm9yIGRhdGEgaW50ZWdyaXR5IGFuZCB3ZSBtdXN0IHdhaXQgZm9yCisgKiBleGlzdGluZyBJTyB0byBjb21wbGV0ZS4KKyAqLworaW50CittcGFnZV93cml0ZXBhZ2VzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYywgZ2V0X2Jsb2NrX3QgZ2V0X2Jsb2NrKQoreworCXJldHVybiBfX21wYWdlX3dyaXRlcGFnZXMobWFwcGluZywgd2JjLCBnZXRfYmxvY2ssCisJCW1hcHBpbmctPmFfb3BzLT53cml0ZXBhZ2UpOworfQorCitpbnQKK19fbXBhZ2Vfd3JpdGVwYWdlcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMsIGdldF9ibG9ja190IGdldF9ibG9jaywKKwkJd3JpdGVwYWdlX3Qgd3JpdGVwYWdlX2ZuKQoreworCXN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGkgPSBtYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvOworCXN0cnVjdCBiaW8gKmJpbyA9IE5VTEw7CisJc2VjdG9yX3QgbGFzdF9ibG9ja19pbl9iaW8gPSAwOworCWludCByZXQgPSAwOworCWludCBkb25lID0gMDsKKwlpbnQgKCp3cml0ZXBhZ2UpKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYyk7CisJc3RydWN0IHBhZ2V2ZWMgcHZlYzsKKwlpbnQgbnJfcGFnZXM7CisJcGdvZmZfdCBpbmRleDsKKwlwZ29mZl90IGVuZCA9IC0xOwkJLyogSW5jbHVzaXZlICovCisJaW50IHNjYW5uZWQgPSAwOworCWludCBpc19yYW5nZSA9IDA7CisKKwlpZiAod2JjLT5ub25ibG9ja2luZyAmJiBiZGlfd3JpdGVfY29uZ2VzdGVkKGJkaSkpIHsKKwkJd2JjLT5lbmNvdW50ZXJlZF9jb25nZXN0aW9uID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJd3JpdGVwYWdlID0gTlVMTDsKKwlpZiAoZ2V0X2Jsb2NrID09IE5VTEwpCisJCXdyaXRlcGFnZSA9IG1hcHBpbmctPmFfb3BzLT53cml0ZXBhZ2U7CisKKwlwYWdldmVjX2luaXQoJnB2ZWMsIDApOworCWlmICh3YmMtPnN5bmNfbW9kZSA9PSBXQl9TWU5DX05PTkUpIHsKKwkJaW5kZXggPSBtYXBwaW5nLT53cml0ZWJhY2tfaW5kZXg7IC8qIFN0YXJ0IGZyb20gcHJldiBvZmZzZXQgKi8KKwl9IGVsc2UgeworCQlpbmRleCA9IDA7CQkJICAvKiB3aG9sZS1maWxlIHN3ZWVwICovCisJCXNjYW5uZWQgPSAxOworCX0KKwlpZiAod2JjLT5zdGFydCB8fCB3YmMtPmVuZCkgeworCQlpbmRleCA9IHdiYy0+c3RhcnQgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwkJZW5kID0gd2JjLT5lbmQgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwkJaXNfcmFuZ2UgPSAxOworCQlzY2FubmVkID0gMTsKKwl9CityZXRyeToKKwl3aGlsZSAoIWRvbmUgJiYgKGluZGV4IDw9IGVuZCkgJiYKKwkJCShucl9wYWdlcyA9IHBhZ2V2ZWNfbG9va3VwX3RhZygmcHZlYywgbWFwcGluZywgJmluZGV4LAorCQkJUEFHRUNBQ0hFX1RBR19ESVJUWSwKKwkJCW1pbihlbmQgLSBpbmRleCwgKHBnb2ZmX3QpUEFHRVZFQ19TSVpFLTEpICsgMSkpKSB7CisJCXVuc2lnbmVkIGk7CisKKwkJc2Nhbm5lZCA9IDE7CisJCWZvciAoaSA9IDA7IGkgPCBucl9wYWdlczsgaSsrKSB7CisJCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHB2ZWMucGFnZXNbaV07CisKKwkJCS8qCisJCQkgKiBBdCB0aGlzIHBvaW50IHdlIGhvbGQgbmVpdGhlciBtYXBwaW5nLT50cmVlX2xvY2sgbm9yCisJCQkgKiBsb2NrIG9uIHRoZSBwYWdlIGl0c2VsZjogdGhlIHBhZ2UgbWF5IGJlIHRydW5jYXRlZCBvcgorCQkJICogaW52YWxpZGF0ZWQgKGNoYW5naW5nIHBhZ2UtPm1hcHBpbmcgdG8gTlVMTCksIG9yIGV2ZW4KKwkJCSAqIHN3aXp6bGVkIGJhY2sgZnJvbSBzd2FwcGVyX3NwYWNlIHRvIHRtcGZzIGZpbGUKKwkJCSAqIG1hcHBpbmcKKwkJCSAqLworCisJCQlsb2NrX3BhZ2UocGFnZSk7CisKKwkJCWlmICh1bmxpa2VseShwYWdlLT5tYXBwaW5nICE9IG1hcHBpbmcpKSB7CisJCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmICh1bmxpa2VseShpc19yYW5nZSkgJiYgcGFnZS0+aW5kZXggPiBlbmQpIHsKKwkJCQlkb25lID0gMTsKKwkJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKHdiYy0+c3luY19tb2RlICE9IFdCX1NZTkNfTk9ORSkKKwkJCQl3YWl0X29uX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCisJCQlpZiAoUGFnZVdyaXRlYmFjayhwYWdlKSB8fAorCQkJCQkhY2xlYXJfcGFnZV9kaXJ0eV9mb3JfaW8ocGFnZSkpIHsKKwkJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKHdyaXRlcGFnZSkgeworCQkJCXJldCA9ICgqd3JpdGVwYWdlKShwYWdlLCB3YmMpOworCQkJCWlmIChyZXQpIHsKKwkJCQkJaWYgKHJldCA9PSAtRU5PU1BDKQorCQkJCQkJc2V0X2JpdChBU19FTk9TUEMsCisJCQkJCQkJJm1hcHBpbmctPmZsYWdzKTsKKwkJCQkJZWxzZQorCQkJCQkJc2V0X2JpdChBU19FSU8sCisJCQkJCQkJJm1hcHBpbmctPmZsYWdzKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWJpbyA9IF9fbXBhZ2Vfd3JpdGVwYWdlKGJpbywgcGFnZSwgZ2V0X2Jsb2NrLAorCQkJCQkJJmxhc3RfYmxvY2tfaW5fYmlvLCAmcmV0LCB3YmMsCisJCQkJCQl3cml0ZXBhZ2VfZm4pOworCQkJfQorCQkJaWYgKHJldCB8fCAoLS0od2JjLT5ucl90b193cml0ZSkgPD0gMCkpCisJCQkJZG9uZSA9IDE7CisJCQlpZiAod2JjLT5ub25ibG9ja2luZyAmJiBiZGlfd3JpdGVfY29uZ2VzdGVkKGJkaSkpIHsKKwkJCQl3YmMtPmVuY291bnRlcmVkX2Nvbmdlc3Rpb24gPSAxOworCQkJCWRvbmUgPSAxOworCQkJfQorCQl9CisJCXBhZ2V2ZWNfcmVsZWFzZSgmcHZlYyk7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKwlpZiAoIXNjYW5uZWQgJiYgIWRvbmUpIHsKKwkJLyoKKwkJICogV2UgaGl0IHRoZSBsYXN0IHBhZ2UgYW5kIHRoZXJlIGlzIG1vcmUgd29yayB0byBiZSBkb25lOiB3cmFwCisJCSAqIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlCisJCSAqLworCQlzY2FubmVkID0gMTsKKwkJaW5kZXggPSAwOworCQlnb3RvIHJldHJ5OworCX0KKwlpZiAoIWlzX3JhbmdlKQorCQltYXBwaW5nLT53cml0ZWJhY2tfaW5kZXggPSBpbmRleDsKKwlpZiAoYmlvKQorCQltcGFnZV9iaW9fc3VibWl0KFdSSVRFLCBiaW8pOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKG1wYWdlX3dyaXRlcGFnZXMpOworRVhQT1JUX1NZTUJPTChfX21wYWdlX3dyaXRlcGFnZXMpOworCitpbnQgbXBhZ2Vfd3JpdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBnZXRfYmxvY2tfdCBnZXRfYmxvY2ssCisJc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGJpbyAqYmlvOworCXNlY3Rvcl90IGxhc3RfYmxvY2tfaW5fYmlvID0gMDsKKworCWJpbyA9IF9fbXBhZ2Vfd3JpdGVwYWdlKE5VTEwsIHBhZ2UsIGdldF9ibG9jaywKKwkJCSZsYXN0X2Jsb2NrX2luX2JpbywgJnJldCwgd2JjLCBOVUxMKTsKKwlpZiAoYmlvKQorCQltcGFnZV9iaW9fc3VibWl0KFdSSVRFLCBiaW8pOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wobXBhZ2Vfd3JpdGVwYWdlKTsKZGlmZiAtLWdpdCBhL2ZzL21zZG9zL01ha2VmaWxlIGIvZnMvbXNkb3MvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE2NzY0NgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL21zZG9zL01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IG1zZG9zIGZpbGVzeXN0ZW0gcm91dGluZXMuCisjCisKK29iai0kKENPTkZJR19NU0RPU19GUykgKz0gbXNkb3MubworCittc2Rvcy15IDo9IG5hbWVpLm8KZGlmZiAtLWdpdCBhL2ZzL21zZG9zL25hbWVpLmMgYi9mcy9tc2Rvcy9uYW1laS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NGY1MTEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9tc2Rvcy9uYW1laS5jCkBAIC0wLDAgKzEsNzExIEBACisvKgorICogIGxpbnV4L2ZzL21zZG9zL25hbWVpLmMKKyAqCisgKiAgV3JpdHRlbiAxOTkyLDE5OTMgYnkgV2VybmVyIEFsbWVzYmVyZ2VyCisgKiAgSGlkZGVuIGZpbGVzIDE5OTUgYnkgQWxiZXJ0IENhaGFsYW4gPGFsYmVydEBjY3MubmV1LmVkdT4gPGFkY0Bjb2UubmV1LmVkdT4KKyAqICBSZXdyaXR0ZW4gZm9yIGNvbnN0YW50IGludW1iZXJzIDE5OTkgYnkgQWwgVmlybworICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tc2Rvc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisKKy8qIE1TLURPUyAiZGV2aWNlIHNwZWNpYWwgZmlsZXMiICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciAqcmVzZXJ2ZWRfbmFtZXNbXSA9IHsKKwkiQ09OICAgICAiLCAiUFJOICAgICAiLCAiTlVMICAgICAiLCAiQVVYICAgICAiLAorCSJMUFQxICAgICIsICJMUFQyICAgICIsICJMUFQzICAgICIsICJMUFQ0ICAgICIsCisJIkNPTTEgICAgIiwgIkNPTTIgICAgIiwgIkNPTTMgICAgIiwgIkNPTTQgICAgIiwKKwlOVUxMCit9OworCisvKiBDaGFyYWN0ZXJzIHRoYXQgYXJlIHVuZGVzaXJhYmxlIGluIGFuIE1TLURPUyBmaWxlIG5hbWUgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGJhZF9jaGFyc1tdID0gIio/PD58XCIiOworc3RhdGljIHVuc2lnbmVkIGNoYXIgYmFkX2lmX3N0cmljdF9wY1tdID0gIis9LDsgIjsKKy8qIEdFTURPUyBpcyBsZXNzIHJlc3RyaWN0aXZlICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBiYWRfaWZfc3RyaWN0X2F0YXJpW10gPSAiICI7CisKKyNkZWZpbmUgYmFkX2lmX3N0cmljdChvcHRzKSBcCisJKChvcHRzKS0+YXRhcmkgPyBiYWRfaWZfc3RyaWN0X2F0YXJpIDogYmFkX2lmX3N0cmljdF9wYykKKworLyoqKioqIEZvcm1hdHMgYW4gTVMtRE9TIGZpbGUgbmFtZS4gUmVqZWN0cyBpbnZhbGlkIG5hbWVzLiAqLworc3RhdGljIGludCBtc2Rvc19mb3JtYXRfbmFtZShjb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lLCBpbnQgbGVuLAorCQkJICAgICB1bnNpZ25lZCBjaGFyICpyZXMsIHN0cnVjdCBmYXRfbW91bnRfb3B0aW9ucyAqb3B0cykKKwkvKgorCSAqIG5hbWUgaXMgdGhlIHByb3Bvc2VkIG5hbWUsIGxlbiBpcyBpdHMgbGVuZ3RoLCByZXMgaXMKKwkgKiB0aGUgcmVzdWx0aW5nIG5hbWUsIG9wdHMtPm5hbWVfY2hlY2sgaXMgZWl0aGVyIChyKWVsYXhlZCwKKwkgKiAobilvcm1hbCBvciAocyl0cmljdCwgb3B0cy0+ZG90c09LIGFsbG93cyBkb3RzIGF0IHRoZQorCSAqIGJlZ2lubmluZyBvZiBuYW1lIChmb3IgaGlkZGVuIGZpbGVzKQorCSAqLworeworCXVuc2lnbmVkIGNoYXIgKndhbGs7CisJY29uc3QgdW5zaWduZWQgY2hhciAqKnJlc2VydmVkOworCXVuc2lnbmVkIGNoYXIgYzsKKwlpbnQgc3BhY2U7CisKKwlpZiAobmFtZVswXSA9PSAnLicpIHsJLyogZG90ZmlsZSBiZWNhdXNlIC4gYW5kIC4uIGFscmVhZHkgZG9uZSAqLworCQlpZiAob3B0cy0+ZG90c09LKSB7CisJCQkvKiBHZXQgcmlkIG9mIGRvdCAtIHRlc3QgZm9yIGl0IGVsc2V3aGVyZSAqLworCQkJbmFtZSsrOworCQkJbGVuLS07CisJCX0gZWxzZSBpZiAoIW9wdHMtPmF0YXJpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qCisJICogZGlzYWxsb3cgbmFtZXMgdGhhdCBfcmVhbGx5XyBzdGFydCB3aXRoIGEgZG90IGZvciBNUy1ET1MsCisJICogR0VNRE9TIGRvZXMgbm90IGNhcmUKKwkgKi8KKwlzcGFjZSA9ICFvcHRzLT5hdGFyaTsKKwljID0gMDsKKwlmb3IgKHdhbGsgPSByZXM7IGxlbiAmJiB3YWxrIC0gcmVzIDwgODsgd2FsaysrKSB7CisJCWMgPSAqbmFtZSsrOworCQlsZW4tLTsKKwkJaWYgKG9wdHMtPm5hbWVfY2hlY2sgIT0gJ3InICYmIHN0cmNocihiYWRfY2hhcnMsIGMpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChvcHRzLT5uYW1lX2NoZWNrID09ICdzJyAmJiBzdHJjaHIoYmFkX2lmX3N0cmljdChvcHRzKSwgYykpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onICYmIG9wdHMtPm5hbWVfY2hlY2sgPT0gJ3MnKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChjIDwgJyAnIHx8IGMgPT0gJzonIHx8IGMgPT0gJ1xcJykKKwkJCXJldHVybiAtRUlOVkFMOworCS8qCisJICogMHhFNSBpcyBsZWdhbCBhcyBhIGZpcnN0IGNoYXJhY3RlciwgYnV0IHdlIG11c3Qgc3Vic3RpdHV0ZQorCSAqIDB4MDUgYmVjYXVzZSAweEU1IG1hcmtzIGRlbGV0ZWQgZmlsZXMuICBZZXMsIERPUyByZWFsbHkKKwkgKiBkb2VzIHRoaXMuCisJICogSXQgc2VlbXMgdGhhdCBNaWNyb3NvZnQgaGFja2VkIERPUyB0byBzdXBwb3J0IG5vbi1VUworCSAqIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlIDB4RTUgY2hhcmFjdGVyIHdhcyBhbHJlYWR5IGluIHVzZSB0bworCSAqIG1hcmsgZGVsZXRlZCBmaWxlcy4KKwkgKi8KKwkJaWYgKChyZXMgPT0gd2FsaykgJiYgKGMgPT0gMHhFNSkpCisJCQljID0gMHgwNTsKKwkJaWYgKGMgPT0gJy4nKQorCQkJYnJlYWs7CisJCXNwYWNlID0gKGMgPT0gJyAnKTsKKwkJKndhbGsgPSAoIW9wdHMtPm5vY2FzZSAmJiBjID49ICdhJyAmJiBjIDw9ICd6JykgPyBjIC0gMzIgOiBjOworCX0KKwlpZiAoc3BhY2UpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChvcHRzLT5uYW1lX2NoZWNrID09ICdzJyAmJiBsZW4gJiYgYyAhPSAnLicpIHsKKwkJYyA9ICpuYW1lKys7CisJCWxlbi0tOworCQlpZiAoYyAhPSAnLicpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJd2hpbGUgKGMgIT0gJy4nICYmIGxlbi0tKQorCQljID0gKm5hbWUrKzsKKwlpZiAoYyA9PSAnLicpIHsKKwkJd2hpbGUgKHdhbGsgLSByZXMgPCA4KQorCQkJKndhbGsrKyA9ICcgJzsKKwkJd2hpbGUgKGxlbiA+IDAgJiYgd2FsayAtIHJlcyA8IE1TRE9TX05BTUUpIHsKKwkJCWMgPSAqbmFtZSsrOworCQkJbGVuLS07CisJCQlpZiAob3B0cy0+bmFtZV9jaGVjayAhPSAncicgJiYgc3RyY2hyKGJhZF9jaGFycywgYykpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAob3B0cy0+bmFtZV9jaGVjayA9PSAncycgJiYKKwkJCSAgICBzdHJjaHIoYmFkX2lmX3N0cmljdChvcHRzKSwgYykpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoYyA8ICcgJyB8fCBjID09ICc6JyB8fCBjID09ICdcXCcpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoYyA9PSAnLicpIHsKKwkJCQlpZiAob3B0cy0+bmFtZV9jaGVjayA9PSAncycpCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onICYmIG9wdHMtPm5hbWVfY2hlY2sgPT0gJ3MnKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJc3BhY2UgPSBjID09ICcgJzsKKwkJCWlmICghb3B0cy0+bm9jYXNlICYmIGMgPj0gJ2EnICYmIGMgPD0gJ3onKQorCQkJCSp3YWxrKysgPSBjIC0gMzI7CisJCQllbHNlCisJCQkJKndhbGsrKyA9IGM7CisJCX0KKwkJaWYgKHNwYWNlKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChvcHRzLT5uYW1lX2NoZWNrID09ICdzJyAmJiBsZW4pCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJd2hpbGUgKHdhbGsgLSByZXMgPCBNU0RPU19OQU1FKQorCQkqd2FsaysrID0gJyAnOworCWlmICghb3B0cy0+YXRhcmkpCisJCS8qIEdFTURPUyBpcyBsZXNzIHN0dXBpZCBhbmQgaGFzIG5vIHJlc2VydmVkIG5hbWVzICovCisJCWZvciAocmVzZXJ2ZWQgPSByZXNlcnZlZF9uYW1lczsgKnJlc2VydmVkOyByZXNlcnZlZCsrKQorCQkJaWYgKCFzdHJuY21wKHJlcywgKnJlc2VydmVkLCA4KSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqIExvY2F0ZXMgYSBkaXJlY3RvcnkgZW50cnkuICBVc2VzIHVuZm9ybWF0dGVkIG5hbWUuICovCitzdGF0aWMgaW50IG1zZG9zX2ZpbmQoc3RydWN0IGlub2RlICpkaXIsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5hbWUsIGludCBsZW4sCisJCSAgICAgIHN0cnVjdCBmYXRfc2xvdF9pbmZvICpzaW5mbykKK3sKKwlzdHJ1Y3QgbXNkb3Nfc2JfaW5mbyAqc2JpID0gTVNET1NfU0IoZGlyLT5pX3NiKTsKKwl1bnNpZ25lZCBjaGFyIG1zZG9zX25hbWVbTVNET1NfTkFNRV07CisJaW50IGVycjsKKworCWVyciA9IG1zZG9zX2Zvcm1hdF9uYW1lKG5hbWUsIGxlbiwgbXNkb3NfbmFtZSwgJnNiaS0+b3B0aW9ucyk7CisJaWYgKGVycikKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwllcnIgPSBmYXRfc2NhbihkaXIsIG1zZG9zX25hbWUsIHNpbmZvKTsKKwlpZiAoIWVyciAmJiBzYmktPm9wdGlvbnMuZG90c09LKSB7CisJCWlmIChuYW1lWzBdID09ICcuJykgeworCQkJaWYgKCEoc2luZm8tPmRlLT5hdHRyICYgQVRUUl9ISURERU4pKQorCQkJCWVyciA9IC1FTk9FTlQ7CisJCX0gZWxzZSB7CisJCQlpZiAoc2luZm8tPmRlLT5hdHRyICYgQVRUUl9ISURERU4pCisJCQkJZXJyID0gLUVOT0VOVDsKKwkJfQorCQlpZiAoZXJyKQorCQkJYnJlbHNlKHNpbmZvLT5iaCk7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBDb21wdXRlIHRoZSBoYXNoIGZvciB0aGUgbXNkb3MgbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBkZW50cnkuCisgKiBOb3RlOiBpZiB0aGUgbmFtZSBpcyBpbnZhbGlkLCB3ZSBsZWF2ZSB0aGUgaGFzaCBjb2RlIHVuY2hhbmdlZCBzbworICogdGhhdCB0aGUgZXhpc3RpbmcgZGVudHJ5IGNhbiBiZSB1c2VkLiBUaGUgbXNkb3MgZnMgcm91dGluZXMgd2lsbAorICogcmV0dXJuIEVOT0VOVCBvciBFSU5WQUwgYXMgYXBwcm9wcmlhdGUuCisgKi8KK3N0YXRpYyBpbnQgbXNkb3NfaGFzaChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICpxc3RyKQoreworCXN0cnVjdCBmYXRfbW91bnRfb3B0aW9ucyAqb3B0aW9ucyA9ICZNU0RPU19TQihkZW50cnktPmRfc2IpLT5vcHRpb25zOworCXVuc2lnbmVkIGNoYXIgbXNkb3NfbmFtZVtNU0RPU19OQU1FXTsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IG1zZG9zX2Zvcm1hdF9uYW1lKHFzdHItPm5hbWUsIHFzdHItPmxlbiwgbXNkb3NfbmFtZSwgb3B0aW9ucyk7CisJaWYgKCFlcnJvcikKKwkJcXN0ci0+aGFzaCA9IGZ1bGxfbmFtZV9oYXNoKG1zZG9zX25hbWUsIE1TRE9TX05BTUUpOworCXJldHVybiAwOworfQorCisvKgorICogQ29tcGFyZSB0d28gbXNkb3MgbmFtZXMuIElmIGVpdGhlciBvZiB0aGUgbmFtZXMgYXJlIGludmFsaWQsCisgKiB3ZSBmYWxsIGJhY2sgdG8gZG9pbmcgdGhlIHN0YW5kYXJkIG5hbWUgY29tcGFyaXNvbi4KKyAqLworc3RhdGljIGludCBtc2Rvc19jbXAoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgcXN0ciAqYSwgc3RydWN0IHFzdHIgKmIpCit7CisJc3RydWN0IGZhdF9tb3VudF9vcHRpb25zICpvcHRpb25zID0gJk1TRE9TX1NCKGRlbnRyeS0+ZF9zYiktPm9wdGlvbnM7CisJdW5zaWduZWQgY2hhciBhX21zZG9zX25hbWVbTVNET1NfTkFNRV0sIGJfbXNkb3NfbmFtZVtNU0RPU19OQU1FXTsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IG1zZG9zX2Zvcm1hdF9uYW1lKGEtPm5hbWUsIGEtPmxlbiwgYV9tc2Rvc19uYW1lLCBvcHRpb25zKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb2xkX2NvbXBhcmU7CisJZXJyb3IgPSBtc2Rvc19mb3JtYXRfbmFtZShiLT5uYW1lLCBiLT5sZW4sIGJfbXNkb3NfbmFtZSwgb3B0aW9ucyk7CisJaWYgKGVycm9yKQorCQlnb3RvIG9sZF9jb21wYXJlOworCWVycm9yID0gbWVtY21wKGFfbXNkb3NfbmFtZSwgYl9tc2Rvc19uYW1lLCBNU0RPU19OQU1FKTsKK291dDoKKwlyZXR1cm4gZXJyb3I7CisKK29sZF9jb21wYXJlOgorCWVycm9yID0gMTsKKwlpZiAoYS0+bGVuID09IGItPmxlbikKKwkJZXJyb3IgPSBtZW1jbXAoYS0+bmFtZSwgYi0+bmFtZSwgYS0+bGVuKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBtc2Rvc19kZW50cnlfb3BlcmF0aW9ucyA9IHsKKwkuZF9oYXNoCQk9IG1zZG9zX2hhc2gsCisJLmRfY29tcGFyZQk9IG1zZG9zX2NtcCwKK307CisKKy8qCisgKiBBVi4gV3JhcHBlcnMgZm9yIEZBVCBzYiBvcGVyYXRpb25zLiBJcyBpdCB3aXNlPworICovCisKKy8qKioqKiBHZXQgaW5vZGUgdXNpbmcgZGlyZWN0b3J5IGFuZCBuYW1lICovCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqbXNkb3NfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkJICAgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRpci0+aV9zYjsKKwlzdHJ1Y3QgZmF0X3Nsb3RfaW5mbyBzaW5mbzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKKwlpbnQgcmVzOworCisJZGVudHJ5LT5kX29wID0gJm1zZG9zX2RlbnRyeV9vcGVyYXRpb25zOworCisJbG9ja19rZXJuZWwoKTsKKwlyZXMgPSBtc2Rvc19maW5kKGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLCAmc2luZm8pOworCWlmIChyZXMgPT0gLUVOT0VOVCkKKwkJZ290byBhZGQ7CisJaWYgKHJlcyA8IDApCisJCWdvdG8gb3V0OworCWlub2RlID0gZmF0X2J1aWxkX2lub2RlKHNiLCBzaW5mby5kZSwgc2luZm8uaV9wb3MpOworCWJyZWxzZShzaW5mby5iaCk7CisJaWYgKElTX0VSUihpbm9kZSkpIHsKKwkJcmVzID0gUFRSX0VSUihpbm9kZSk7CisJCWdvdG8gb3V0OworCX0KK2FkZDoKKwlyZXMgPSAwOworCWRlbnRyeSA9IGRfc3BsaWNlX2FsaWFzKGlub2RlLCBkZW50cnkpOworCWlmIChkZW50cnkpCisJCWRlbnRyeS0+ZF9vcCA9ICZtc2Rvc19kZW50cnlfb3BlcmF0aW9uczsKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJaWYgKCFyZXMpCisJCXJldHVybiBkZW50cnk7CisJcmV0dXJuIEVSUl9QVFIocmVzKTsKK30KKworLyoqKioqIENyZWF0ZXMgYSBkaXJlY3RvcnkgZW50cnkgKG5hbWUgaXMgYWxyZWFkeSBmb3JtYXR0ZWQpLiAqLworc3RhdGljIGludCBtc2Rvc19hZGRfZW50cnkoc3RydWN0IGlub2RlICpkaXIsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5hbWUsCisJCQkgICBpbnQgaXNfZGlyLCBpbnQgaXNfaGlkLCBpbnQgY2x1c3RlciwKKwkJCSAgIHN0cnVjdCB0aW1lc3BlYyAqdHMsIHN0cnVjdCBmYXRfc2xvdF9pbmZvICpzaW5mbykKK3sKKwlzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5IGRlOworCV9fbGUxNiB0aW1lLCBkYXRlOworCWludCBlcnI7CisKKwltZW1jcHkoZGUubmFtZSwgbmFtZSwgTVNET1NfTkFNRSk7CisJZGUuYXR0ciA9IGlzX2RpciA/IEFUVFJfRElSIDogQVRUUl9BUkNIOworCWlmIChpc19oaWQpCisJCWRlLmF0dHIgfD0gQVRUUl9ISURERU47CisJZGUubGNhc2UgPSAwOworCWZhdF9kYXRlX3VuaXgyZG9zKHRzLT50dl9zZWMsICZ0aW1lLCAmZGF0ZSk7CisJZGUuY2RhdGUgPSBkZS5hZGF0ZSA9IDA7CisJZGUuY3RpbWUgPSAwOworCWRlLmN0aW1lX2NzID0gMDsKKwlkZS50aW1lID0gdGltZTsKKwlkZS5kYXRlID0gZGF0ZTsKKwlkZS5zdGFydCA9IGNwdV90b19sZTE2KGNsdXN0ZXIpOworCWRlLnN0YXJ0aGkgPSBjcHVfdG9fbGUxNihjbHVzdGVyID4+IDE2KTsKKwlkZS5zaXplID0gMDsKKworCWVyciA9IGZhdF9hZGRfZW50cmllcyhkaXIsICZkZSwgMSwgc2luZm8pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlkaXItPmlfY3RpbWUgPSBkaXItPmlfbXRpbWUgPSAqdHM7CisJaWYgKElTX0RJUlNZTkMoZGlyKSkKKwkJKHZvaWQpZmF0X3N5bmNfaW5vZGUoZGlyKTsKKwllbHNlCisJCW1hcmtfaW5vZGVfZGlydHkoZGlyKTsKKworCXJldHVybiAwOworfQorCisvKioqKiogQ3JlYXRlIGEgZmlsZSAqLworc3RhdGljIGludCBtc2Rvc19jcmVhdGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsCisJCQlzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLT5pX3NiOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGZhdF9zbG90X2luZm8gc2luZm87CisJc3RydWN0IHRpbWVzcGVjIHRzOworCXVuc2lnbmVkIGNoYXIgbXNkb3NfbmFtZVtNU0RPU19OQU1FXTsKKwlpbnQgZXJyLCBpc19oaWQ7CisKKwlsb2NrX2tlcm5lbCgpOworCisJZXJyID0gbXNkb3NfZm9ybWF0X25hbWUoZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLAorCQkJCW1zZG9zX25hbWUsICZNU0RPU19TQihzYiktPm9wdGlvbnMpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWlzX2hpZCA9IChkZW50cnktPmRfbmFtZS5uYW1lWzBdID09ICcuJykgJiYgKG1zZG9zX25hbWVbMF0gIT0gJy4nKTsKKwkvKiBIYXZlIHRvIGRvIGl0IGR1ZSB0byBmb28gdnMuIC5mb28gY29uZmxpY3RzICovCisJaWYgKCFmYXRfc2NhbihkaXIsIG1zZG9zX25hbWUsICZzaW5mbykpIHsKKwkJYnJlbHNlKHNpbmZvLmJoKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJdHMgPSBDVVJSRU5UX1RJTUVfU0VDOworCWVyciA9IG1zZG9zX2FkZF9lbnRyeShkaXIsIG1zZG9zX25hbWUsIDAsIGlzX2hpZCwgMCwgJnRzLCAmc2luZm8pOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWlub2RlID0gZmF0X2J1aWxkX2lub2RlKHNiLCBzaW5mby5kZSwgc2luZm8uaV9wb3MpOworCWJyZWxzZShzaW5mby5iaCk7CisJaWYgKElTX0VSUihpbm9kZSkpIHsKKwkJZXJyID0gUFRSX0VSUihpbm9kZSk7CisJCWdvdG8gb3V0OworCX0KKwlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfY3RpbWUgPSB0czsKKwkvKiB0aW1lc3RhbXAgaXMgYWxyZWFkeSB3cml0dGVuLCBzbyBtYXJrX2lub2RlX2RpcnR5KCkgaXMgdW5uZWVkZWQuICovCisKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioqKiogUmVtb3ZlIGEgZGlyZWN0b3J5ICovCitzdGF0aWMgaW50IG1zZG9zX3JtZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZmF0X3Nsb3RfaW5mbyBzaW5mbzsKKwlpbnQgZXJyOworCisJbG9ja19rZXJuZWwoKTsKKwkvKgorCSAqIENoZWNrIHdoZXRoZXIgdGhlIGRpcmVjdG9yeSBpcyBub3QgaW4gdXNlLCB0aGVuIGNoZWNrCisJICogd2hldGhlciBpdCBpcyBlbXB0eS4KKwkgKi8KKwllcnIgPSBmYXRfZGlyX2VtcHR5KGlub2RlKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwllcnIgPSBtc2Rvc19maW5kKGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLCAmc2luZm8pOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0gZmF0X3JlbW92ZV9lbnRyaWVzKGRpciwgJnNpbmZvKTsJLyogYW5kIHJlbGVhc2VzIGJoICovCisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZGlyLT5pX25saW5rLS07CisKKwlpbm9kZS0+aV9ubGluayA9IDA7CisJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCWZhdF9kZXRhY2goaW5vZGUpOworb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qKioqKiBNYWtlIGEgZGlyZWN0b3J5ICovCitzdGF0aWMgaW50IG1zZG9zX21rZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPmlfc2I7CisJc3RydWN0IGZhdF9zbG90X2luZm8gc2luZm87CisJc3RydWN0IGlub2RlICppbm9kZTsKKwl1bnNpZ25lZCBjaGFyIG1zZG9zX25hbWVbTVNET1NfTkFNRV07CisJc3RydWN0IHRpbWVzcGVjIHRzOworCWludCBlcnIsIGlzX2hpZCwgY2x1c3RlcjsKKworCWxvY2tfa2VybmVsKCk7CisKKwllcnIgPSBtc2Rvc19mb3JtYXRfbmFtZShkZW50cnktPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5sZW4sCisJCQkJbXNkb3NfbmFtZSwgJk1TRE9TX1NCKHNiKS0+b3B0aW9ucyk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJaXNfaGlkID0gKGRlbnRyeS0+ZF9uYW1lLm5hbWVbMF0gPT0gJy4nKSAmJiAobXNkb3NfbmFtZVswXSAhPSAnLicpOworCS8qIGZvbyB2cyAuZm9vIHNpdHVhdGlvbiAqLworCWlmICghZmF0X3NjYW4oZGlyLCBtc2Rvc19uYW1lLCAmc2luZm8pKSB7CisJCWJyZWxzZShzaW5mby5iaCk7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXRzID0gQ1VSUkVOVF9USU1FX1NFQzsKKwljbHVzdGVyID0gZmF0X2FsbG9jX25ld19kaXIoZGlyLCAmdHMpOworCWlmIChjbHVzdGVyIDwgMCkgeworCQllcnIgPSBjbHVzdGVyOworCQlnb3RvIG91dDsKKwl9CisJZXJyID0gbXNkb3NfYWRkX2VudHJ5KGRpciwgbXNkb3NfbmFtZSwgMSwgaXNfaGlkLCBjbHVzdGVyLCAmdHMsICZzaW5mbyk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZTsKKwlkaXItPmlfbmxpbmsrKzsKKworCWlub2RlID0gZmF0X2J1aWxkX2lub2RlKHNiLCBzaW5mby5kZSwgc2luZm8uaV9wb3MpOworCWJyZWxzZShzaW5mby5iaCk7CisJaWYgKElTX0VSUihpbm9kZSkpIHsKKwkJZXJyID0gUFRSX0VSUihpbm9kZSk7CisJCS8qIHRoZSBkaXJlY3Rvcnkgd2FzIGNvbXBsZXRlZCwganVzdCByZXR1cm4gYSBlcnJvciAqLworCQlnb3RvIG91dDsKKwl9CisJaW5vZGUtPmlfbmxpbmsgPSAyOworCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IHRzOworCS8qIHRpbWVzdGFtcCBpcyBhbHJlYWR5IHdyaXR0ZW4sIHNvIG1hcmtfaW5vZGVfZGlydHkoKSBpcyB1bm5lZWRlZC4gKi8KKworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7CisKK291dF9mcmVlOgorCWZhdF9mcmVlX2NsdXN0ZXJzKGRpciwgY2x1c3Rlcik7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnI7Cit9CisKKy8qKioqKiBVbmxpbmsgYSBmaWxlICovCitzdGF0aWMgaW50IG1zZG9zX3VubGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGZhdF9zbG90X2luZm8gc2luZm87CisJaW50IGVycjsKKworCWxvY2tfa2VybmVsKCk7CisJZXJyID0gbXNkb3NfZmluZChkaXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLmxlbiwgJnNpbmZvKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWVyciA9IGZhdF9yZW1vdmVfZW50cmllcyhkaXIsICZzaW5mbyk7CS8qIGFuZCByZWxlYXNlcyBiaCAqLworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWlub2RlLT5pX25saW5rID0gMDsKKwlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJZmF0X2RldGFjaChpbm9kZSk7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBkb19tc2Rvc19yZW5hbWUoc3RydWN0IGlub2RlICpvbGRfZGlyLCB1bnNpZ25lZCBjaGFyICpvbGRfbmFtZSwKKwkJCSAgIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCisJCQkgICBzdHJ1Y3QgaW5vZGUgKm5ld19kaXIsIHVuc2lnbmVkIGNoYXIgKm5ld19uYW1lLAorCQkJICAgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSwgaW50IGlzX2hpZCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRvdGRvdF9iaDsKKwlzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5ICpkb3Rkb3RfZGU7CisJbG9mZl90IGRvdGRvdF9pX3BvczsKKwlzdHJ1Y3QgaW5vZGUgKm9sZF9pbm9kZSwgKm5ld19pbm9kZTsKKwlzdHJ1Y3QgZmF0X3Nsb3RfaW5mbyBvbGRfc2luZm8sIHNpbmZvOworCXN0cnVjdCB0aW1lc3BlYyB0czsKKwlpbnQgZXJyLCBvbGRfYXR0cnMsIGlzX2RpciwgdXBkYXRlX2RvdGRvdCwgY29ycnVwdCA9IDA7CisKKwlvbGRfc2luZm8uYmggPSBzaW5mby5iaCA9IGRvdGRvdF9iaCA9IE5VTEw7CisJb2xkX2lub2RlID0gb2xkX2RlbnRyeS0+ZF9pbm9kZTsKKwluZXdfaW5vZGUgPSBuZXdfZGVudHJ5LT5kX2lub2RlOworCisJZXJyID0gZmF0X3NjYW4ob2xkX2Rpciwgb2xkX25hbWUsICZvbGRfc2luZm8pOworCWlmIChlcnIpIHsKKwkJZXJyID0gLUVJTzsKKwkJZ290byBvdXQ7CisJfQorCisJaXNfZGlyID0gU19JU0RJUihvbGRfaW5vZGUtPmlfbW9kZSk7CisJdXBkYXRlX2RvdGRvdCA9IChpc19kaXIgJiYgb2xkX2RpciAhPSBuZXdfZGlyKTsKKwlpZiAodXBkYXRlX2RvdGRvdCkgeworCQlpZiAoZmF0X2dldF9kb3Rkb3RfZW50cnkob2xkX2lub2RlLCAmZG90ZG90X2JoLCAmZG90ZG90X2RlLAorCQkJCQkgJmRvdGRvdF9pX3BvcykgPCAwKSB7CisJCQllcnIgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlvbGRfYXR0cnMgPSBNU0RPU19JKG9sZF9pbm9kZSktPmlfYXR0cnM7CisJZXJyID0gZmF0X3NjYW4obmV3X2RpciwgbmV3X25hbWUsICZzaW5mbyk7CisJaWYgKCFlcnIpIHsKKwkJaWYgKCFuZXdfaW5vZGUpIHsKKwkJCS8qICJmb28iIC0+ICIuZm9vIiBjYXNlLiBqdXN0IGNoYW5nZSB0aGUgQVRUUl9ISURERU4gKi8KKwkJCWlmIChzaW5mby5kZSAhPSBvbGRfc2luZm8uZGUpIHsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJaWYgKGlzX2hpZCkKKwkJCQlNU0RPU19JKG9sZF9pbm9kZSktPmlfYXR0cnMgfD0gQVRUUl9ISURERU47CisJCQllbHNlCisJCQkJTVNET1NfSShvbGRfaW5vZGUpLT5pX2F0dHJzICY9IH5BVFRSX0hJRERFTjsKKwkJCWlmIChJU19ESVJTWU5DKG9sZF9kaXIpKSB7CisJCQkJZXJyID0gZmF0X3N5bmNfaW5vZGUob2xkX2lub2RlKTsKKwkJCQlpZiAoZXJyKSB7CisJCQkJCU1TRE9TX0kob2xkX2lub2RlKS0+aV9hdHRycyA9IG9sZF9hdHRyczsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfSBlbHNlCisJCQkJbWFya19pbm9kZV9kaXJ0eShvbGRfaW5vZGUpOworCisJCQlvbGRfZGlyLT5pX3ZlcnNpb24rKzsKKwkJCW9sZF9kaXItPmlfY3RpbWUgPSBvbGRfZGlyLT5pX210aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwkJCWlmIChJU19ESVJTWU5DKG9sZF9kaXIpKQorCQkJCSh2b2lkKWZhdF9zeW5jX2lub2RlKG9sZF9kaXIpOworCQkJZWxzZQorCQkJCW1hcmtfaW5vZGVfZGlydHkob2xkX2Rpcik7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCXRzID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlpZiAobmV3X2lub2RlKSB7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwkJaWYgKE1TRE9TX0kobmV3X2lub2RlKS0+aV9wb3MgIT0gc2luZm8uaV9wb3MpIHsKKwkJCS8qIFdURj8/PyBDcnkgYW5kIGZhaWwuICovCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtc2Rvc19yZW5hbWU6IGZzIGNvcnJ1cHRlZFxuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChpc19kaXIpIHsKKwkJCWVyciA9IGZhdF9kaXJfZW1wdHkobmV3X2lub2RlKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBvdXQ7CisJCX0KKwkJZmF0X2RldGFjaChuZXdfaW5vZGUpOworCX0gZWxzZSB7CisJCWVyciA9IG1zZG9zX2FkZF9lbnRyeShuZXdfZGlyLCBuZXdfbmFtZSwgaXNfZGlyLCBpc19oaWQsIDAsCisJCQkJICAgICAgJnRzLCAmc2luZm8pOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJfQorCW5ld19kaXItPmlfdmVyc2lvbisrOworCisJZmF0X2RldGFjaChvbGRfaW5vZGUpOworCWZhdF9hdHRhY2gob2xkX2lub2RlLCBzaW5mby5pX3Bvcyk7CisJaWYgKGlzX2hpZCkKKwkJTVNET1NfSShvbGRfaW5vZGUpLT5pX2F0dHJzIHw9IEFUVFJfSElEREVOOworCWVsc2UKKwkJTVNET1NfSShvbGRfaW5vZGUpLT5pX2F0dHJzICY9IH5BVFRSX0hJRERFTjsKKwlpZiAoSVNfRElSU1lOQyhuZXdfZGlyKSkgeworCQllcnIgPSBmYXRfc3luY19pbm9kZShvbGRfaW5vZGUpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJvcl9pbm9kZTsKKwl9IGVsc2UKKwkJbWFya19pbm9kZV9kaXJ0eShvbGRfaW5vZGUpOworCisJaWYgKHVwZGF0ZV9kb3Rkb3QpIHsKKwkJaW50IHN0YXJ0ID0gTVNET1NfSShuZXdfZGlyKS0+aV9sb2dzdGFydDsKKwkJZG90ZG90X2RlLT5zdGFydCA9IGNwdV90b19sZTE2KHN0YXJ0KTsKKwkJZG90ZG90X2RlLT5zdGFydGhpID0gY3B1X3RvX2xlMTYoc3RhcnQgPj4gMTYpOworCQltYXJrX2J1ZmZlcl9kaXJ0eShkb3Rkb3RfYmgpOworCQlpZiAoSVNfRElSU1lOQyhuZXdfZGlyKSkgeworCQkJZXJyID0gc3luY19kaXJ0eV9idWZmZXIoZG90ZG90X2JoKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBlcnJvcl9kb3Rkb3Q7CisJCX0KKwkJb2xkX2Rpci0+aV9ubGluay0tOworCQlpZiAoIW5ld19pbm9kZSkKKwkJCW5ld19kaXItPmlfbmxpbmsrKzsKKwl9CisKKwllcnIgPSBmYXRfcmVtb3ZlX2VudHJpZXMob2xkX2RpciwgJm9sZF9zaW5mbyk7CS8qIGFuZCByZWxlYXNlcyBiaCAqLworCW9sZF9zaW5mby5iaCA9IE5VTEw7CisJaWYgKGVycikKKwkJZ290byBlcnJvcl9kb3Rkb3Q7CisJb2xkX2Rpci0+aV92ZXJzaW9uKys7CisJb2xkX2Rpci0+aV9jdGltZSA9IG9sZF9kaXItPmlfbXRpbWUgPSB0czsKKwlpZiAoSVNfRElSU1lOQyhvbGRfZGlyKSkKKwkJKHZvaWQpZmF0X3N5bmNfaW5vZGUob2xkX2Rpcik7CisJZWxzZQorCQltYXJrX2lub2RlX2RpcnR5KG9sZF9kaXIpOworCisJaWYgKG5ld19pbm9kZSkgeworCQlpZiAoaXNfZGlyKQorCQkJbmV3X2lub2RlLT5pX25saW5rIC09IDI7CisJCWVsc2UKKwkJCW5ld19pbm9kZS0+aV9ubGluay0tOworCQluZXdfaW5vZGUtPmlfY3RpbWUgPSB0czsKKwl9CitvdXQ6CisJYnJlbHNlKHNpbmZvLmJoKTsKKwlicmVsc2UoZG90ZG90X2JoKTsKKwlicmVsc2Uob2xkX3NpbmZvLmJoKTsKKwlyZXR1cm4gZXJyOworCitlcnJvcl9kb3Rkb3Q6CisJLyogZGF0YSBjbHVzdGVyIGlzIHNoYXJlZCwgc2VyaW91cyBjb3JydXB0aW9uICovCisJY29ycnVwdCA9IDE7CisKKwlpZiAodXBkYXRlX2RvdGRvdCkgeworCQlpbnQgc3RhcnQgPSBNU0RPU19JKG9sZF9kaXIpLT5pX2xvZ3N0YXJ0OworCQlkb3Rkb3RfZGUtPnN0YXJ0ID0gY3B1X3RvX2xlMTYoc3RhcnQpOworCQlkb3Rkb3RfZGUtPnN0YXJ0aGkgPSBjcHVfdG9fbGUxNihzdGFydCA+PiAxNik7CisJCW1hcmtfYnVmZmVyX2RpcnR5KGRvdGRvdF9iaCk7CisJCWNvcnJ1cHQgfD0gc3luY19kaXJ0eV9idWZmZXIoZG90ZG90X2JoKTsKKwl9CitlcnJvcl9pbm9kZToKKwlmYXRfZGV0YWNoKG9sZF9pbm9kZSk7CisJZmF0X2F0dGFjaChvbGRfaW5vZGUsIG9sZF9zaW5mby5pX3Bvcyk7CisJTVNET1NfSShvbGRfaW5vZGUpLT5pX2F0dHJzID0gb2xkX2F0dHJzOworCWlmIChuZXdfaW5vZGUpIHsKKwkJZmF0X2F0dGFjaChuZXdfaW5vZGUsIHNpbmZvLmlfcG9zKTsKKwkJaWYgKGNvcnJ1cHQpCisJCQljb3JydXB0IHw9IGZhdF9zeW5jX2lub2RlKG5ld19pbm9kZSk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogSWYgbmV3IGVudHJ5IHdhcyBub3Qgc2hhcmluZyB0aGUgZGF0YSBjbHVzdGVyLCBpdAorCQkgKiBzaG91bGRuJ3QgYmUgc2VyaW91cyBjb3JydXB0aW9uLgorCQkgKi8KKwkJaW50IGVycjIgPSBmYXRfcmVtb3ZlX2VudHJpZXMobmV3X2RpciwgJnNpbmZvKTsKKwkJaWYgKGNvcnJ1cHQpCisJCQljb3JydXB0IHw9IGVycjI7CisJCXNpbmZvLmJoID0gTlVMTDsKKwl9CisJaWYgKGNvcnJ1cHQgPCAwKSB7CisJCWZhdF9mc19wYW5pYyhuZXdfZGlyLT5pX3NiLAorCQkJICAgICAiJXM6IEZpbGVzeXN0ZW0gY29ycnVwdGVkIChpX3BvcyAlbGxkKSIsCisJCQkgICAgIF9fRlVOQ1RJT05fXywgc2luZm8uaV9wb3MpOworCX0KKwlnb3RvIG91dDsKK30KKworLyoqKioqIFJlbmFtZSwgYSB3cmFwcGVyIGZvciByZW5hbWVfc2FtZV9kaXIgJiByZW5hbWVfZGlmZl9kaXIgKi8KK3N0YXRpYyBpbnQgbXNkb3NfcmVuYW1lKHN0cnVjdCBpbm9kZSAqb2xkX2Rpciwgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwKKwkJCXN0cnVjdCBpbm9kZSAqbmV3X2Rpciwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKK3sKKwl1bnNpZ25lZCBjaGFyIG9sZF9tc2Rvc19uYW1lW01TRE9TX05BTUVdLCBuZXdfbXNkb3NfbmFtZVtNU0RPU19OQU1FXTsKKwlpbnQgZXJyLCBpc19oaWQ7CisKKwlsb2NrX2tlcm5lbCgpOworCisJZXJyID0gbXNkb3NfZm9ybWF0X25hbWUob2xkX2RlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkJb2xkX2RlbnRyeS0+ZF9uYW1lLmxlbiwgb2xkX21zZG9zX25hbWUsCisJCQkJJk1TRE9TX1NCKG9sZF9kaXItPmlfc2IpLT5vcHRpb25zKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwllcnIgPSBtc2Rvc19mb3JtYXRfbmFtZShuZXdfZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJCQluZXdfZGVudHJ5LT5kX25hbWUubGVuLCBuZXdfbXNkb3NfbmFtZSwKKwkJCQkmTVNET1NfU0IobmV3X2Rpci0+aV9zYiktPm9wdGlvbnMpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJaXNfaGlkID0KKwkgICAgIChuZXdfZGVudHJ5LT5kX25hbWUubmFtZVswXSA9PSAnLicpICYmIChuZXdfbXNkb3NfbmFtZVswXSAhPSAnLicpOworCisJZXJyID0gZG9fbXNkb3NfcmVuYW1lKG9sZF9kaXIsIG9sZF9tc2Rvc19uYW1lLCBvbGRfZGVudHJ5LAorCQkJICAgICAgbmV3X2RpciwgbmV3X21zZG9zX25hbWUsIG5ld19kZW50cnksIGlzX2hpZCk7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBtc2Rvc19kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkuY3JlYXRlCQk9IG1zZG9zX2NyZWF0ZSwKKwkubG9va3VwCQk9IG1zZG9zX2xvb2t1cCwKKwkudW5saW5rCQk9IG1zZG9zX3VubGluaywKKwkubWtkaXIJCT0gbXNkb3NfbWtkaXIsCisJLnJtZGlyCQk9IG1zZG9zX3JtZGlyLAorCS5yZW5hbWUJCT0gbXNkb3NfcmVuYW1lLAorCS5zZXRhdHRyCT0gZmF0X25vdGlmeV9jaGFuZ2UsCit9OworCitzdGF0aWMgaW50IG1zZG9zX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlpbnQgcmVzOworCisJcmVzID0gZmF0X2ZpbGxfc3VwZXIoc2IsIGRhdGEsIHNpbGVudCwgJm1zZG9zX2Rpcl9pbm9kZV9vcGVyYXRpb25zLCAwKTsKKwlpZiAocmVzKQorCQlyZXR1cm4gcmVzOworCisJc2ItPnNfZmxhZ3MgfD0gTVNfTk9BVElNRTsKKwlzYi0+c19yb290LT5kX29wID0gJm1zZG9zX2RlbnRyeV9vcGVyYXRpb25zOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICptc2Rvc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCQkJCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsCisJCQkJCXZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgbXNkb3NfZmlsbF9zdXBlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBtc2Rvc19mc190eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAibXNkb3MiLAorCS5nZXRfc2IJCT0gbXNkb3NfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9ibG9ja19zdXBlciwKKwkuZnNfZmxhZ3MJPSBGU19SRVFVSVJFU19ERVYsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X21zZG9zX2ZzKHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJm1zZG9zX2ZzX3R5cGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9tc2Rvc19mcyh2b2lkKQoreworCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmbXNkb3NfZnNfdHlwZSk7Cit9CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIldlcm5lciBBbG1lc2JlcmdlciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNUy1ET1MgZmlsZXN5c3RlbSBzdXBwb3J0Iik7CisKK21vZHVsZV9pbml0KGluaXRfbXNkb3NfZnMpCittb2R1bGVfZXhpdChleGl0X21zZG9zX2ZzKQpkaWZmIC0tZ2l0IGEvZnMvbmFtZWkuYyBiL2ZzL25hbWVpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU0YWVmMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25hbWVpLmMKQEAgLTAsMCArMSwyNDU0IEBACisvKgorICogIGxpbnV4L2ZzL25hbWVpLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICovCisKKy8qCisgKiBTb21lIGNvcnJlY3Rpb25zIGJ5IHR5dHNvLgorICovCisKKy8qIFtGZWIgMTk5NyBULiBTY2hvZWJlbC1UaGV1ZXJdIENvbXBsZXRlIHJld3JpdGUgb2YgdGhlIHBhdGhuYW1lCisgKiBsb29rdXAgbG9naWMuCisgKi8KKy8qIFtGZWItQXByIDIwMDAsIEFWXSBSZXdyaXRlIHRvIHRoZSBuZXcgbmFtZXNwYWNlIGFyY2hpdGVjdHVyZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZG5vdGlmeS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgorI2luY2x1ZGUgPGFzbS9uYW1laS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNkZWZpbmUgQUNDX01PREUoeCkgKCJcMDAwXDAwNFwwMDJcMDA2IlsoeCkmT19BQ0NNT0RFXSkKKworLyogW0ZlYi0xOTk3IFQuIFNjaG9lYmVsLVRoZXVlcl0KKyAqIEZ1bmRhbWVudGFsIGNoYW5nZXMgaW4gdGhlIHBhdGhuYW1lIGxvb2t1cCBtZWNoYW5pc21zIChuYW1laSkKKyAqIHdlcmUgbmVjZXNzYXJ5IGJlY2F1c2Ugb2Ygb21pcnIuICBUaGUgcmVhc29uIGlzIHRoYXQgb21pcnIgbmVlZHMKKyAqIHRvIGtub3cgdGhlIF9yZWFsXyBwYXRobmFtZSwgbm90IHRoZSB1c2VyLXN1cHBsaWVkIG9uZSwgaW4gY2FzZQorICogb2Ygc3ltbGlua3MgKGFuZCBhbHNvIHdoZW4gdHJhbnNuYW1lIHJlcGxhY2VtZW50cyBvY2N1cikuCisgKgorICogVGhlIG5ldyBjb2RlIHJlcGxhY2VzIHRoZSBvbGQgcmVjdXJzaXZlIHN5bWxpbmsgcmVzb2x1dGlvbiB3aXRoCisgKiBhbiBpdGVyYXRpdmUgb25lIChpbiBjYXNlIG9mIG5vbi1uZXN0ZWQgc3ltbGluayBjaGFpbnMpLiAgSXQgZG9lcworICogdGhpcyB3aXRoIGNhbGxzIHRvIDxmcz5fZm9sbG93X2xpbmsoKS4KKyAqIEFzIGEgc2lkZSBlZmZlY3QsIGRpcl9uYW1laSgpLCBfbmFtZWkoKSBhbmQgZm9sbG93X2xpbmsoKSBhcmUgbm93IAorICogcmVwbGFjZWQgd2l0aCBhIHNpbmdsZSBmdW5jdGlvbiBsb29rdXBfZGVudHJ5KCkgdGhhdCBjYW4gaGFuZGxlIGFsbCAKKyAqIHRoZSBzcGVjaWFsIGNhc2VzIG9mIHRoZSBmb3JtZXIgY29kZS4KKyAqCisgKiBXaXRoIHRoZSBuZXcgZGNhY2hlLCB0aGUgcGF0aG5hbWUgaXMgc3RvcmVkIGF0IGVhY2ggaW5vZGUsIGF0IGxlYXN0IGFzCisgKiBsb25nIGFzIHRoZSByZWZjb3VudCBvZiB0aGUgaW5vZGUgaXMgcG9zaXRpdmUuICBBcyBhIHNpZGUgZWZmZWN0LCB0aGUKKyAqIHNpemUgb2YgdGhlIGRjYWNoZSBkZXBlbmRzIG9uIHRoZSBpbm9kZSBjYWNoZSBhbmQgdGh1cyBpcyBkeW5hbWljLgorICoKKyAqIFsyOS1BcHItMTk5OCBDLiBTY290dCBBbmFuaWFuXSBVcGRhdGVkIGFib3ZlIGRlc2NyaXB0aW9uIG9mIHN5bWxpbmsKKyAqIHJlc29sdXRpb24gdG8gY29ycmVzcG9uZCB3aXRoIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvZGUuCisgKgorICogTm90ZSB0aGF0IHRoZSBzeW1saW5rIHJlc29sdXRpb24gaXMgbm90ICpjb21wbGV0ZWx5KiBpdGVyYXRpdmUuCisgKiBUaGVyZSBpcyBzdGlsbCBhIHNpZ25pZmljYW50IGFtb3VudCBvZiB0YWlsLSBhbmQgbWlkLSByZWN1cnNpb24gaW4KKyAqIHRoZSBhbGdvcml0aG0uICBBbHNvLCBub3RlIHRoYXQgPGZzPl9yZWFkbGluaygpIGlzIG5vdCB1c2VkIGluCisgKiBsb29rdXBfZGVudHJ5KCk6IGxvb2t1cF9kZW50cnkoKSBvbiB0aGUgcmVzdWx0IG9mIDxmcz5fcmVhZGxpbmsoKQorICogbWF5IHJldHVybiBkaWZmZXJlbnQgcmVzdWx0cyB0aGFuIDxmcz5fZm9sbG93X2xpbmsoKS4gIE1hbnkgdmlydHVhbAorICogZmlsZXN5c3RlbXMgKGluY2x1ZGluZyAvcHJvYykgZXhoaWJpdCB0aGlzIGJlaGF2aW9yLgorICovCisKKy8qIFsyNC1GZWItOTcgVC4gU2Nob2ViZWwtVGhldWVyXSBTaWRlIGVmZmVjdHMgY2F1c2VkIGJ5IG5ldyBpbXBsZW1lbnRhdGlvbjoKKyAqIE5ldyBzeW1saW5rIHNlbWFudGljczogd2hlbiBvcGVuKCkgaXMgY2FsbGVkIHdpdGggZmxhZ3MgT19DUkVBVCB8IE9fRVhDTAorICogYW5kIHRoZSBuYW1lIGFscmVhZHkgZXhpc3RzIGluIGZvcm0gb2YgYSBzeW1saW5rLCB0cnkgdG8gY3JlYXRlIHRoZSBuZXcKKyAqIG5hbWUgaW5kaWNhdGVkIGJ5IHRoZSBzeW1saW5rLiBUaGUgb2xkIGNvZGUgYWx3YXlzIGNvbXBsYWluZWQgdGhhdCB0aGUKKyAqIG5hbWUgYWxyZWFkeSBleGlzdHMsIGR1ZSB0byBub3QgZm9sbG93aW5nIHRoZSBzeW1saW5rIGV2ZW4gaWYgaXRzIHRhcmdldAorICogaXMgbm9uZXhpc3RlbnQuICBUaGUgbmV3IHNlbWFudGljcyBhZmZlY3RzIGFsc28gbWtub2QoKSBhbmQgbGluaygpIHdoZW4KKyAqIHRoZSBuYW1lIGlzIGEgc3ltbGluayBwb2ludGluZyB0byBhIG5vbi1leGlzdGFudCBuYW1lLgorICoKKyAqIEkgZG9uJ3Qga25vdyB3aGljaCBzZW1hbnRpY3MgaXMgdGhlIHJpZ2h0IG9uZSwgc2luY2UgSSBoYXZlIG5vIGFjY2VzcworICogdG8gc3RhbmRhcmRzLiBCdXQgSSBmb3VuZCBieSB0cmlhbCB0aGF0IEhQLVVYIDkuMCBoYXMgdGhlIGZ1bGwgIm5ldyIKKyAqIHNlbWFudGljcyBpbXBsZW1lbnRlZCwgd2hpbGUgU3VuT1MgNC4xLjEgYW5kIFNvbGFyaXMgKFN1bk9TIDUuNCkgaGF2ZSB0aGUKKyAqICJvbGQiIG9uZS4gUGVyc29uYWxseSwgSSB0aGluayB0aGUgbmV3IHNlbWFudGljcyBpcyBtdWNoIG1vcmUgbG9naWNhbC4KKyAqIE5vdGUgdGhhdCAibG4gb2xkIG5ldyIgd2hlcmUgIm5ldyIgaXMgYSBzeW1saW5rIHBvaW50aW5nIHRvIGEgbm9uLWV4aXN0aW5nCisgKiBmaWxlIGRvZXMgc3VjY2VlZCBpbiBib3RoIEhQLVVYIGFuZCBTdW5PcywgYnV0IG5vdCBpbiBTb2xhcmlzCisgKiBhbmQgaW4gdGhlIG9sZCBMaW51eCBzZW1hbnRpY3MuCisgKi8KKworLyogWzE2LURlYy05NyBLZXZpbiBCdWhyXSBGb3Igc2VjdXJpdHkgcmVhc29ucywgd2UgY2hhbmdlIHNvbWUgc3ltbGluaworICogc2VtYW50aWNzLiAgU2VlIHRoZSBjb21tZW50cyBpbiAib3Blbl9uYW1laSIgYW5kICJkb19saW5rIiBiZWxvdy4KKyAqCisgKiBbMTAtU2VwLTk4IEFsYW4gTW9kcmFdIEFub3RoZXIgc3ltbGluayBjaGFuZ2UuCisgKi8KKworLyogW0ZlYi1BcHIgMjAwMCBBVl0gQ29tcGxldGUgcmV3cml0ZS4gUnVsZXMgZm9yIHN5bWxpbmtzOgorICoJaW5zaWRlIHRoZSBwYXRoIC0gYWx3YXlzIGZvbGxvdy4KKyAqCWluIHRoZSBsYXN0IGNvbXBvbmVudCBpbiBjcmVhdGlvbi9yZW1vdmFsL3JlbmFtaW5nIC0gbmV2ZXIgZm9sbG93LgorICoJaWYgTE9PS1VQX0ZPTExPVyBwYXNzZWQgLSBmb2xsb3cuCisgKglpZiB0aGUgcGF0aG5hbWUgaGFzIHRyYWlsaW5nIHNsYXNoZXMgLSBmb2xsb3cuCisgKglvdGhlcndpc2UgLSBkb24ndCBmb2xsb3cuCisgKiAoYXBwbGllZCBpbiB0aGF0IG9yZGVyKS4KKyAqCisgKiBbSnVuIDIwMDAgQVZdIEluY29uc2lzdGVudCBiZWhhdmlvdXIgb2Ygb3BlbigpIGluIGNhc2UgaWYgZmxhZ3M9PU9fQ1JFQVQKKyAqIHJlc3RvcmVkIGZvciAyLjQuIFRoaXMgaXMgdGhlIGxhc3Qgc3Vydml2aW5nIHBhcnQgb2Ygb2xkIDQuMkJTRCBidWcuCisgKiBEdXJpbmcgdGhlIDIuNCB3ZSBuZWVkIHRvIGZpeCB0aGUgdXNlcmxhbmQgc3R1ZmYgZGVwZW5kaW5nIG9uIGl0IC0KKyAqIGhvcGVmdWxseSB3ZSB3aWxsIGJlIGFibGUgdG8gZ2V0IHJpZCBvZiB0aGF0IHdhcnQgaW4gMi41LiBTbyBmYXIgb25seQorICogWEVtYWNzIHNlZW1zIHRvIGJlIHJlbHlpbmcgb24gaXQuLi4KKyAqLworLyoKKyAqIFtTZXAgMjAwMSBBVl0gU2luZ2xlLXNlbWFwaG9yZSBsb2NraW5nIHNjaGVtZSAoa3Vkb3MgdG8gRGF2aWQgSG9sbGFuZCkKKyAqIGltcGxlbWVudGVkLiAgTGV0J3Mgc2VlIGlmIHJhaXNlZCBwcmlvcml0eSBvZiAtPnNfdmZzX3JlbmFtZV9zZW0gZ2l2ZXMKKyAqIGFueSBleHRyYSBjb250ZW50aW9uLi4uCisgKi8KKworLyogSW4gb3JkZXIgdG8gcmVkdWNlIHNvbWUgcmFjZXMsIHdoaWxlIGF0IHRoZSBzYW1lIHRpbWUgZG9pbmcgYWRkaXRpb25hbAorICogY2hlY2tpbmcgYW5kIGhvcGVmdWxseSBzcGVlZGluZyB0aGluZ3MgdXAsIHdlIGNvcHkgZmlsZW5hbWVzIHRvIHRoZQorICoga2VybmVsIGRhdGEgc3BhY2UgYmVmb3JlIHVzaW5nIHRoZW0uLgorICoKKyAqIFBPU0lYLjEgMi40OiBhbiBlbXB0eSBwYXRobmFtZSBpcyBpbnZhbGlkIChFTk9FTlQpLgorICogUEFUSF9NQVggaW5jbHVkZXMgdGhlIG51bCB0ZXJtaW5hdG9yIC0tUlIuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGRvX2dldG5hbWUoY29uc3QgY2hhciBfX3VzZXIgKmZpbGVuYW1lLCBjaGFyICpwYWdlKQoreworCWludCByZXR2YWw7CisJdW5zaWduZWQgbG9uZyBsZW4gPSBQQVRIX01BWDsKKworCWlmICghc2VnbWVudF9lcShnZXRfZnMoKSwgS0VSTkVMX0RTKSkgeworCQlpZiAoKHVuc2lnbmVkIGxvbmcpIGZpbGVuYW1lID49IFRBU0tfU0laRSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoVEFTS19TSVpFIC0gKHVuc2lnbmVkIGxvbmcpIGZpbGVuYW1lIDwgUEFUSF9NQVgpCisJCQlsZW4gPSBUQVNLX1NJWkUgLSAodW5zaWduZWQgbG9uZykgZmlsZW5hbWU7CisJfQorCisJcmV0dmFsID0gc3RybmNweV9mcm9tX3VzZXIocGFnZSwgZmlsZW5hbWUsIGxlbik7CisJaWYgKHJldHZhbCA+IDApIHsKKwkJaWYgKHJldHZhbCA8IGxlbikKKwkJCXJldHVybiAwOworCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKwl9IGVsc2UgaWYgKCFyZXR2YWwpCisJCXJldHZhbCA9IC1FTk9FTlQ7CisJcmV0dXJuIHJldHZhbDsKK30KKworY2hhciAqIGdldG5hbWUoY29uc3QgY2hhciBfX3VzZXIgKiBmaWxlbmFtZSkKK3sKKwljaGFyICp0bXAsICpyZXN1bHQ7CisKKwlyZXN1bHQgPSBFUlJfUFRSKC1FTk9NRU0pOworCXRtcCA9IF9fZ2V0bmFtZSgpOworCWlmICh0bXApICB7CisJCWludCByZXR2YWwgPSBkb19nZXRuYW1lKGZpbGVuYW1lLCB0bXApOworCisJCXJlc3VsdCA9IHRtcDsKKwkJaWYgKHJldHZhbCA8IDApIHsKKwkJCV9fcHV0bmFtZSh0bXApOworCQkJcmVzdWx0ID0gRVJSX1BUUihyZXR2YWwpOworCQl9CisJfQorCWF1ZGl0X2dldG5hbWUocmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisjaWZkZWYgQ09ORklHX0FVRElUU1lTQ0FMTAordm9pZCBwdXRuYW1lKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaWYgKHVubGlrZWx5KGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQpKQorCQlhdWRpdF9wdXRuYW1lKG5hbWUpOworCWVsc2UKKwkJX19wdXRuYW1lKG5hbWUpOworfQorRVhQT1JUX1NZTUJPTChwdXRuYW1lKTsKKyNlbmRpZgorCisKKy8qKgorICogZ2VuZXJpY19wZXJtaXNzaW9uICAtICBjaGVjayBmb3IgYWNjZXNzIHJpZ2h0cyBvbiBhIFBvc2l4LWxpa2UgZmlsZXN5c3RlbQorICogQGlub2RlOglpbm9kZSB0byBjaGVjayBhY2Nlc3MgcmlnaHRzIGZvcgorICogQG1hc2s6CXJpZ2h0IHRvIGNoZWNrIGZvciAoJU1BWV9SRUFELCAlTUFZX1dSSVRFLCAlTUFZX0VYRUMpCisgKiBAY2hlY2tfYWNsOglvcHRpb25hbCBjYWxsYmFjayB0byBjaGVjayBmb3IgUG9zaXggQUNMcworICoKKyAqIFVzZWQgdG8gY2hlY2sgZm9yIHJlYWQvd3JpdGUvZXhlY3V0ZSBwZXJtaXNzaW9ucyBvbiBhIGZpbGUuCisgKiBXZSB1c2UgImZzdWlkIiBmb3IgdGhpcywgbGV0dGluZyB1cyBzZXQgYXJiaXRyYXJ5IHBlcm1pc3Npb25zCisgKiBmb3IgZmlsZXN5c3RlbSBhY2Nlc3Mgd2l0aG91dCBjaGFuZ2luZyB0aGUgIm5vcm1hbCIgdWlkcyB3aGljaAorICogYXJlIHVzZWQgZm9yIG90aGVyIHRoaW5ncy4uCisgKi8KK2ludCBnZW5lcmljX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssCisJCWludCAoKmNoZWNrX2FjbCkoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2spKQoreworCXVtb2RlX3QJCQltb2RlID0gaW5vZGUtPmlfbW9kZTsKKworCWlmIChjdXJyZW50LT5mc3VpZCA9PSBpbm9kZS0+aV91aWQpCisJCW1vZGUgPj49IDY7CisJZWxzZSB7CisJCWlmIChJU19QT1NJWEFDTChpbm9kZSkgJiYgKG1vZGUgJiBTX0lSV1hHKSAmJiBjaGVja19hY2wpIHsKKwkJCWludCBlcnJvciA9IGNoZWNrX2FjbChpbm9kZSwgbWFzayk7CisJCQlpZiAoZXJyb3IgPT0gLUVBQ0NFUykKKwkJCQlnb3RvIGNoZWNrX2NhcGFiaWxpdGllczsKKwkJCWVsc2UgaWYgKGVycm9yICE9IC1FQUdBSU4pCisJCQkJcmV0dXJuIGVycm9yOworCQl9CisKKwkJaWYgKGluX2dyb3VwX3AoaW5vZGUtPmlfZ2lkKSkKKwkJCW1vZGUgPj49IDM7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgREFDcyBhcmUgb2sgd2UgZG9uJ3QgbmVlZCBhbnkgY2FwYWJpbGl0eSBjaGVjay4KKwkgKi8KKwlpZiAoKChtb2RlICYgbWFzayAmIChNQVlfUkVBRHxNQVlfV1JJVEV8TUFZX0VYRUMpKSA9PSBtYXNrKSkKKwkJcmV0dXJuIDA7CisKKyBjaGVja19jYXBhYmlsaXRpZXM6CisJLyoKKwkgKiBSZWFkL3dyaXRlIERBQ3MgYXJlIGFsd2F5cyBvdmVycmlkYWJsZS4KKwkgKiBFeGVjdXRhYmxlIERBQ3MgYXJlIG92ZXJyaWRhYmxlIGlmIGF0IGxlYXN0IG9uZSBleGVjIGJpdCBpcyBzZXQuCisJICovCisJaWYgKCEobWFzayAmIE1BWV9FWEVDKSB8fAorCSAgICAoaW5vZGUtPmlfbW9kZSAmIFNfSVhVR08pIHx8IFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCWlmIChjYXBhYmxlKENBUF9EQUNfT1ZFUlJJREUpKQorCQkJcmV0dXJuIDA7CisKKwkvKgorCSAqIFNlYXJjaGluZyBpbmNsdWRlcyBleGVjdXRhYmxlIG9uIGRpcmVjdG9yaWVzLCBlbHNlIGp1c3QgcmVhZC4KKwkgKi8KKwlpZiAobWFzayA9PSBNQVlfUkVBRCB8fCAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSAmJiAhKG1hc2sgJiBNQVlfV1JJVEUpKSkKKwkJaWYgKGNhcGFibGUoQ0FQX0RBQ19SRUFEX1NFQVJDSCkpCisJCQlyZXR1cm4gMDsKKworCXJldHVybiAtRUFDQ0VTOworfQorCitpbnQgcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaW50IHJldHZhbCwgc3VibWFzazsKKworCWlmIChtYXNrICYgTUFZX1dSSVRFKSB7CisJCXVtb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7CisKKwkJLyoKKwkJICogTm9ib2R5IGdldHMgd3JpdGUgYWNjZXNzIHRvIGEgcmVhZC1vbmx5IGZzLgorCQkgKi8KKwkJaWYgKElTX1JET05MWShpbm9kZSkgJiYKKwkJICAgIChTX0lTUkVHKG1vZGUpIHx8IFNfSVNESVIobW9kZSkgfHwgU19JU0xOSyhtb2RlKSkpCisJCQlyZXR1cm4gLUVST0ZTOworCisJCS8qCisJCSAqIE5vYm9keSBnZXRzIHdyaXRlIGFjY2VzcyB0byBhbiBpbW11dGFibGUgZmlsZS4KKwkJICovCisJCWlmIChJU19JTU1VVEFCTEUoaW5vZGUpKQorCQkJcmV0dXJuIC1FQUNDRVM7CisJfQorCisKKwkvKiBPcmRpbmFyeSBwZXJtaXNzaW9uIHJvdXRpbmVzIGRvIG5vdCB1bmRlcnN0YW5kIE1BWV9BUFBFTkQuICovCisJc3VibWFzayA9IG1hc2sgJiB+TUFZX0FQUEVORDsKKwlpZiAoaW5vZGUtPmlfb3AgJiYgaW5vZGUtPmlfb3AtPnBlcm1pc3Npb24pCisJCXJldHZhbCA9IGlub2RlLT5pX29wLT5wZXJtaXNzaW9uKGlub2RlLCBzdWJtYXNrLCBuZCk7CisJZWxzZQorCQlyZXR2YWwgPSBnZW5lcmljX3Blcm1pc3Npb24oaW5vZGUsIHN1Ym1hc2ssIE5VTEwpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlyZXR1cm4gc2VjdXJpdHlfaW5vZGVfcGVybWlzc2lvbihpbm9kZSwgbWFzaywgbmQpOworfQorCisvKgorICogZ2V0X3dyaXRlX2FjY2VzcygpIGdldHMgd3JpdGUgcGVybWlzc2lvbiBmb3IgYSBmaWxlLgorICogcHV0X3dyaXRlX2FjY2VzcygpIHJlbGVhc2VzIHRoaXMgd3JpdGUgcGVybWlzc2lvbi4KKyAqIFRoaXMgaXMgdXNlZCBmb3IgcmVndWxhciBmaWxlcy4KKyAqIFdlIGNhbm5vdCBzdXBwb3J0IHdyaXRlIChhbmQgbWF5YmUgbW1hcCByZWFkLXdyaXRlIHNoYXJlZCkgYWNjZXNzZXMgYW5kCisgKiBNQVBfREVOWVdSSVRFIG1tYXBwaW5ncyBzaW11bHRhbmVvdXNseS4gVGhlIGlfd3JpdGVjb3VudCBmaWVsZCBvZiBhbiBpbm9kZQorICogY2FuIGhhdmUgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAwOiBubyB3cml0ZXJzLCBubyBWTV9ERU5ZV1JJVEUgbWFwcGluZ3MKKyAqIDwgMDogKC1pX3dyaXRlY291bnQpIHZtX2FyZWFfc3RydWN0cyB3aXRoIFZNX0RFTllXUklURSBzZXQgZXhpc3QKKyAqID4gMDogKGlfd3JpdGVjb3VudCkgdXNlcnMgYXJlIHdyaXRpbmcgdG8gdGhlIGZpbGUuCisgKgorICogTm9ybWFsbHkgd2Ugb3BlcmF0ZSBvbiB0aGF0IGNvdW50ZXIgd2l0aCBhdG9taWNfe2luYyxkZWN9IGFuZCBpdCdzIHNhZmUKKyAqIGV4Y2VwdCBmb3IgdGhlIGNhc2VzIHdoZXJlIHdlIGRvbid0IGhvbGQgaV93cml0ZWNvdW50IHlldC4gVGhlbiB3ZSBuZWVkIHRvCisgKiB1c2Uge2dldCxkZW55fV93cml0ZV9hY2Nlc3MoKSAtIHRoZXNlIGZ1bmN0aW9ucyBjaGVjayB0aGUgc2lnbiBhbmQgcmVmdXNlCisgKiB0byBkbyB0aGUgY2hhbmdlIGlmIHNpZ24gaXMgd3JvbmcuIEV4Y2x1c2lvbiBiZXR3ZWVuIHRoZW0gaXMgcHJvdmlkZWQgYnkKKyAqIHRoZSBpbm9kZS0+aV9sb2NrIHNwaW5sb2NrLgorICovCisKK2ludCBnZXRfd3JpdGVfYWNjZXNzKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJaWYgKGF0b21pY19yZWFkKCZpbm9kZS0+aV93cml0ZWNvdW50KSA8IDApIHsKKwkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCQlyZXR1cm4gLUVUWFRCU1k7CisJfQorCWF0b21pY19pbmMoJmlub2RlLT5pX3dyaXRlY291bnQpOworCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKworCXJldHVybiAwOworfQorCitpbnQgZGVueV93cml0ZV9hY2Nlc3Moc3RydWN0IGZpbGUgKiBmaWxlKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKworCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJaWYgKGF0b21pY19yZWFkKCZpbm9kZS0+aV93cml0ZWNvdW50KSA+IDApIHsKKwkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCQlyZXR1cm4gLUVUWFRCU1k7CisJfQorCWF0b21pY19kZWMoJmlub2RlLT5pX3dyaXRlY291bnQpOworCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKworCXJldHVybiAwOworfQorCit2b2lkIHBhdGhfcmVsZWFzZShzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlkcHV0KG5kLT5kZW50cnkpOworCW1udHB1dChuZC0+bW50KTsKK30KKworLyoKKyAqIHVtb3VudCgpIG11c3RuJ3QgY2FsbCBwYXRoX3JlbGVhc2UoKS9tbnRwdXQoKSBhcyB0aGF0IHdvdWxkIGNsZWFyCisgKiBtbnRfZXhwaXJ5X21hcmsKKyAqLwordm9pZCBwYXRoX3JlbGVhc2Vfb25fdW1vdW50KHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWRwdXQobmQtPmRlbnRyeSk7CisJX21udHB1dChuZC0+bW50KTsKK30KKworLyoKKyAqIEludGVybmFsIGxvb2t1cCgpIHVzaW5nIHRoZSBuZXcgZ2VuZXJpYyBkY2FjaGUuCisgKiBTTVAtc2FmZQorICovCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqIGNhY2hlZF9sb29rdXAoc3RydWN0IGRlbnRyeSAqIHBhcmVudCwgc3RydWN0IHFzdHIgKiBuYW1lLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5ID0gX19kX2xvb2t1cChwYXJlbnQsIG5hbWUpOworCisJLyogbG9ja2VzcyBfX2RfbG9va3VwIG1heSBmYWlsIGR1ZSB0byBjb25jdXJyZW50IGRfbW92ZSgpIAorCSAqIGluIHNvbWUgdW5yZWxhdGVkIGRpcmVjdG9yeSwgc28gdHJ5IHdpdGggZF9sb29rdXAKKwkgKi8KKwlpZiAoIWRlbnRyeSkKKwkJZGVudHJ5ID0gZF9sb29rdXAocGFyZW50LCBuYW1lKTsKKworCWlmIChkZW50cnkgJiYgZGVudHJ5LT5kX29wICYmIGRlbnRyeS0+ZF9vcC0+ZF9yZXZhbGlkYXRlKSB7CisJCWlmICghZGVudHJ5LT5kX29wLT5kX3JldmFsaWRhdGUoZGVudHJ5LCBuZCkgJiYgIWRfaW52YWxpZGF0ZShkZW50cnkpKSB7CisJCQlkcHV0KGRlbnRyeSk7CisJCQlkZW50cnkgPSBOVUxMOworCQl9CisJfQorCXJldHVybiBkZW50cnk7Cit9CisKKy8qCisgKiBTaG9ydC1jdXQgdmVyc2lvbiBvZiBwZXJtaXNzaW9uKCksIGZvciBjYWxsaW5nIGJ5CisgKiBwYXRoX3dhbGsoKSwgd2hlbiBkY2FjaGUgbG9jayBpcyBoZWxkLiAgQ29tYmluZXMgcGFydHMKKyAqIG9mIHBlcm1pc3Npb24oKSBhbmQgZ2VuZXJpY19wZXJtaXNzaW9uKCksIGFuZCB0ZXN0cyBPTkxZIGZvcgorICogTUFZX0VYRUMgcGVybWlzc2lvbi4KKyAqCisgKiBJZiBhcHByb3ByaWF0ZSwgY2hlY2sgREFDIG9ubHkuICBJZiBub3QgYXBwcm9wcmlhdGUsIG9yCisgKiBzaG9ydC1jdXQgREFDIGZhaWxzLCB0aGVuIGNhbGwgcGVybWlzc2lvbigpIHRvIGRvIG1vcmUKKyAqIGNvbXBsZXRlIHBlcm1pc3Npb24gY2hlY2suCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGV4ZWNfcGVybWlzc2lvbl9saXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgICAgIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXVtb2RlX3QJbW9kZSA9IGlub2RlLT5pX21vZGU7CisKKwlpZiAoaW5vZGUtPmlfb3AgJiYgaW5vZGUtPmlfb3AtPnBlcm1pc3Npb24pCisJCXJldHVybiAtRUFHQUlOOworCisJaWYgKGN1cnJlbnQtPmZzdWlkID09IGlub2RlLT5pX3VpZCkKKwkJbW9kZSA+Pj0gNjsKKwllbHNlIGlmIChpbl9ncm91cF9wKGlub2RlLT5pX2dpZCkpCisJCW1vZGUgPj49IDM7CisKKwlpZiAobW9kZSAmIE1BWV9FWEVDKQorCQlnb3RvIG9rOworCisJaWYgKChpbm9kZS0+aV9tb2RlICYgU19JWFVHTykgJiYgY2FwYWJsZShDQVBfREFDX09WRVJSSURFKSkKKwkJZ290byBvazsKKworCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpICYmIGNhcGFibGUoQ0FQX0RBQ19PVkVSUklERSkpCisJCWdvdG8gb2s7CisKKwlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSAmJiBjYXBhYmxlKENBUF9EQUNfUkVBRF9TRUFSQ0gpKQorCQlnb3RvIG9rOworCisJcmV0dXJuIC1FQUNDRVM7CitvazoKKwlyZXR1cm4gc2VjdXJpdHlfaW5vZGVfcGVybWlzc2lvbihpbm9kZSwgTUFZX0VYRUMsIG5kKTsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gZXZlcnl0aGluZyBlbHNlIGZhaWxzLCBhbmQgd2UgYWN0dWFsbHkgaGF2ZQorICogdG8gZ28gdG8gdGhlIGxvdy1sZXZlbCBmaWxlc3lzdGVtIHRvIGZpbmQgb3V0IHdoYXQgd2Ugc2hvdWxkIGRvLi4KKyAqCisgKiBXZSBnZXQgdGhlIGRpcmVjdG9yeSBzZW1hcGhvcmUsIGFuZCBhZnRlciBnZXR0aW5nIHRoYXQgd2UgYWxzbworICogbWFrZSBzdXJlIHRoYXQgbm9ib2R5IGFkZGVkIHRoZSBlbnRyeSB0byB0aGUgZGNhY2hlIGluIHRoZSBtZWFudGltZS4uCisgKiBTTVAtc2FmZQorICovCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqIHJlYWxfbG9va3VwKHN0cnVjdCBkZW50cnkgKiBwYXJlbnQsIHN0cnVjdCBxc3RyICogbmFtZSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGRlbnRyeSAqIHJlc3VsdDsKKwlzdHJ1Y3QgaW5vZGUgKmRpciA9IHBhcmVudC0+ZF9pbm9kZTsKKworCWRvd24oJmRpci0+aV9zZW0pOworCS8qCisJICogRmlyc3QgcmUtZG8gdGhlIGNhY2hlZCBsb29rdXAganVzdCBpbiBjYXNlIGl0IHdhcyBjcmVhdGVkCisJICogd2hpbGUgd2Ugd2FpdGVkIGZvciB0aGUgZGlyZWN0b3J5IHNlbWFwaG9yZS4uCisJICoKKwkgKiBGSVhNRSEgVGhpcyBjb3VsZCB1c2UgdmVyc2lvbiBudW1iZXJpbmcgb3Igc2ltaWxhciB0bworCSAqIGF2b2lkIHVubmVjZXNzYXJ5IGNhY2hlIGxvb2t1cHMuCisJICoKKwkgKiBUaGUgImRjYWNoZV9sb2NrIiBpcyBwdXJlbHkgdG8gcHJvdGVjdCB0aGUgUkNVIGxpc3Qgd2Fsa2VyCisJICogZnJvbSBjb25jdXJyZW50IHJlbmFtZXMgYXQgdGhpcyBwb2ludCAod2UgbXVzdG4ndCBnZXQgZmFsc2UKKwkgKiBuZWdhdGl2ZXMgZnJvbSB0aGUgUkNVIGxpc3Qgd2FsayBoZXJlLCB1bmxpa2UgdGhlIG9wdGltaXN0aWMKKwkgKiBmYXN0IHdhbGspLgorCSAqCisJICogc28gZG9pbmcgZF9sb29rdXAoKSAod2l0aCBzZXFsb2NrKSwgaW5zdGVhZCBvZiBsb2NrZnJlZSBfX2RfbG9va3VwCisJICovCisJcmVzdWx0ID0gZF9sb29rdXAocGFyZW50LCBuYW1lKTsKKwlpZiAoIXJlc3VsdCkgeworCQlzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5ID0gZF9hbGxvYyhwYXJlbnQsIG5hbWUpOworCQlyZXN1bHQgPSBFUlJfUFRSKC1FTk9NRU0pOworCQlpZiAoZGVudHJ5KSB7CisJCQlyZXN1bHQgPSBkaXItPmlfb3AtPmxvb2t1cChkaXIsIGRlbnRyeSwgbmQpOworCQkJaWYgKHJlc3VsdCkKKwkJCQlkcHV0KGRlbnRyeSk7CisJCQllbHNlCisJCQkJcmVzdWx0ID0gZGVudHJ5OworCQl9CisJCXVwKCZkaXItPmlfc2VtKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKgorCSAqIFVoaHVoISBOYXN0eSBjYXNlOiB0aGUgY2FjaGUgd2FzIHJlLXBvcHVsYXRlZCB3aGlsZQorCSAqIHdlIHdhaXRlZCBvbiB0aGUgc2VtYXBob3JlLiBOZWVkIHRvIHJldmFsaWRhdGUuCisJICovCisJdXAoJmRpci0+aV9zZW0pOworCWlmIChyZXN1bHQtPmRfb3AgJiYgcmVzdWx0LT5kX29wLT5kX3JldmFsaWRhdGUpIHsKKwkJaWYgKCFyZXN1bHQtPmRfb3AtPmRfcmV2YWxpZGF0ZShyZXN1bHQsIG5kKSAmJiAhZF9pbnZhbGlkYXRlKHJlc3VsdCkpIHsKKwkJCWRwdXQocmVzdWx0KTsKKwkJCXJlc3VsdCA9IEVSUl9QVFIoLUVOT0VOVCk7CisJCX0KKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBfX2VtdWxfbG9va3VwX2RlbnRyeShjb25zdCBjaGFyICosIHN0cnVjdCBuYW1laWRhdGEgKik7CisKKy8qIFNNUC1zYWZlICovCitzdGF0aWMgaW5saW5lIGludAord2Fsa19pbml0X3Jvb3QoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJcmVhZF9sb2NrKCZjdXJyZW50LT5mcy0+bG9jayk7CisJaWYgKGN1cnJlbnQtPmZzLT5hbHRyb290ICYmICEobmQtPmZsYWdzICYgTE9PS1VQX05PQUxUKSkgeworCQluZC0+bW50ID0gbW50Z2V0KGN1cnJlbnQtPmZzLT5hbHRyb290bW50KTsKKwkJbmQtPmRlbnRyeSA9IGRnZXQoY3VycmVudC0+ZnMtPmFsdHJvb3QpOworCQlyZWFkX3VubG9jaygmY3VycmVudC0+ZnMtPmxvY2spOworCQlpZiAoX19lbXVsX2xvb2t1cF9kZW50cnkobmFtZSxuZCkpCisJCQlyZXR1cm4gMDsKKwkJcmVhZF9sb2NrKCZjdXJyZW50LT5mcy0+bG9jayk7CisJfQorCW5kLT5tbnQgPSBtbnRnZXQoY3VycmVudC0+ZnMtPnJvb3RtbnQpOworCW5kLT5kZW50cnkgPSBkZ2V0KGN1cnJlbnQtPmZzLT5yb290KTsKKwlyZWFkX3VubG9jaygmY3VycmVudC0+ZnMtPmxvY2spOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIGludCBfX3Zmc19mb2xsb3dfbGluayhzdHJ1Y3QgbmFtZWlkYXRhICpuZCwgY29uc3QgY2hhciAqbGluaykKK3sKKwlpbnQgcmVzID0gMDsKKwljaGFyICpuYW1lOworCWlmIChJU19FUlIobGluaykpCisJCWdvdG8gZmFpbDsKKworCWlmICgqbGluayA9PSAnLycpIHsKKwkJcGF0aF9yZWxlYXNlKG5kKTsKKwkJaWYgKCF3YWxrX2luaXRfcm9vdChsaW5rLCBuZCkpCisJCQkvKiB3ZWlyZCBfX2VtdWxfcHJlZml4KCkgc3R1ZmYgZGlkIGl0ICovCisJCQlnb3RvIG91dDsKKwl9CisJcmVzID0gbGlua19wYXRoX3dhbGsobGluaywgbmQpOworb3V0OgorCWlmIChuZC0+ZGVwdGggfHwgcmVzIHx8IG5kLT5sYXN0X3R5cGUhPUxBU1RfTk9STSkKKwkJcmV0dXJuIHJlczsKKwkvKgorCSAqIElmIGl0IGlzIGFuIGl0ZXJhdGl2ZSBzeW1saW5rcyByZXNvbHV0aW9uIGluIG9wZW5fbmFtZWkoKSB3ZQorCSAqIGhhdmUgdG8gY29weSB0aGUgbGFzdCBjb21wb25lbnQuIEFuZCBhbGwgdGhhdCBjcmFwIGJlY2F1c2Ugb2YKKwkgKiBibG9vZHkgY3JlYXRlKCkgb24gYnJva2VuIHN5bWxpbmtzLiBGdXJyZnUuLi4KKwkgKi8KKwluYW1lID0gX19nZXRuYW1lKCk7CisJaWYgKHVubGlrZWx5KCFuYW1lKSkgeworCQlwYXRoX3JlbGVhc2UobmQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJc3RyY3B5KG5hbWUsIG5kLT5sYXN0Lm5hbWUpOworCW5kLT5sYXN0Lm5hbWUgPSBuYW1lOworCXJldHVybiAwOworZmFpbDoKKwlwYXRoX3JlbGVhc2UobmQpOworCXJldHVybiBQVFJfRVJSKGxpbmspOworfQorCitzdGF0aWMgaW5saW5lIGludCBfX2RvX2ZvbGxvd19saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaW50IGVycm9yOworCisJdG91Y2hfYXRpbWUobmQtPm1udCwgZGVudHJ5KTsKKwluZF9zZXRfbGluayhuZCwgTlVMTCk7CisJZXJyb3IgPSBkZW50cnktPmRfaW5vZGUtPmlfb3AtPmZvbGxvd19saW5rKGRlbnRyeSwgbmQpOworCWlmICghZXJyb3IpIHsKKwkJY2hhciAqcyA9IG5kX2dldF9saW5rKG5kKTsKKwkJaWYgKHMpCisJCQllcnJvciA9IF9fdmZzX2ZvbGxvd19saW5rKG5kLCBzKTsKKwkJaWYgKGRlbnRyeS0+ZF9pbm9kZS0+aV9vcC0+cHV0X2xpbmspCisJCQlkZW50cnktPmRfaW5vZGUtPmlfb3AtPnB1dF9saW5rKGRlbnRyeSwgbmQpOworCX0KKworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIFRoaXMgbGltaXRzIHJlY3Vyc2l2ZSBzeW1saW5rIGZvbGxvd3MgdG8gOCwgd2hpbGUKKyAqIGxpbWl0aW5nIGNvbnNlY3V0aXZlIHN5bWxpbmtzIHRvIDQwLgorICoKKyAqIFdpdGhvdXQgdGhhdCBraW5kIG9mIHRvdGFsIGxpbWl0LCBuYXN0eSBjaGFpbnMgb2YgY29uc2VjdXRpdmUKKyAqIHN5bWxpbmtzIGNhbiBjYXVzZSBhbG1vc3QgYXJiaXRyYXJpbHkgbG9uZyBsb29rdXBzLiAKKyAqLworc3RhdGljIGlubGluZSBpbnQgZG9fZm9sbG93X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlpbnQgZXJyID0gLUVMT09QOworCWlmIChjdXJyZW50LT5saW5rX2NvdW50ID49IE1BWF9ORVNURURfTElOS1MpCisJCWdvdG8gbG9vcDsKKwlpZiAoY3VycmVudC0+dG90YWxfbGlua19jb3VudCA+PSA0MCkKKwkJZ290byBsb29wOworCUJVR19PTihuZC0+ZGVwdGggPj0gTUFYX05FU1RFRF9MSU5LUyk7CisJY29uZF9yZXNjaGVkKCk7CisJZXJyID0gc2VjdXJpdHlfaW5vZGVfZm9sbG93X2xpbmsoZGVudHJ5LCBuZCk7CisJaWYgKGVycikKKwkJZ290byBsb29wOworCWN1cnJlbnQtPmxpbmtfY291bnQrKzsKKwljdXJyZW50LT50b3RhbF9saW5rX2NvdW50Kys7CisJbmQtPmRlcHRoKys7CisJZXJyID0gX19kb19mb2xsb3dfbGluayhkZW50cnksIG5kKTsKKwljdXJyZW50LT5saW5rX2NvdW50LS07CisJbmQtPmRlcHRoLS07CisJcmV0dXJuIGVycjsKK2xvb3A6CisJcGF0aF9yZWxlYXNlKG5kKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgZm9sbG93X3VwKHN0cnVjdCB2ZnNtb3VudCAqKm1udCwgc3RydWN0IGRlbnRyeSAqKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgdmZzbW91bnQgKnBhcmVudDsKKwlzdHJ1Y3QgZGVudHJ5ICptb3VudHBvaW50OworCXNwaW5fbG9jaygmdmZzbW91bnRfbG9jayk7CisJcGFyZW50PSgqbW50KS0+bW50X3BhcmVudDsKKwlpZiAocGFyZW50ID09ICptbnQpIHsKKwkJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOworCQlyZXR1cm4gMDsKKwl9CisJbW50Z2V0KHBhcmVudCk7CisJbW91bnRwb2ludD1kZ2V0KCgqbW50KS0+bW50X21vdW50cG9pbnQpOworCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKwlkcHV0KCpkZW50cnkpOworCSpkZW50cnkgPSBtb3VudHBvaW50OworCW1udHB1dCgqbW50KTsKKwkqbW50ID0gcGFyZW50OworCXJldHVybiAxOworfQorCisvKiBubyBuZWVkIGZvciBkY2FjaGVfbG9jaywgYXMgc2VyaWFsaXphdGlvbiBpcyB0YWtlbiBjYXJlIGluCisgKiBuYW1lc3BhY2UuYworICovCitzdGF0aWMgaW50IGZvbGxvd19tb3VudChzdHJ1Y3QgdmZzbW91bnQgKiptbnQsIHN0cnVjdCBkZW50cnkgKipkZW50cnkpCit7CisJaW50IHJlcyA9IDA7CisJd2hpbGUgKGRfbW91bnRwb2ludCgqZGVudHJ5KSkgeworCQlzdHJ1Y3QgdmZzbW91bnQgKm1vdW50ZWQgPSBsb29rdXBfbW50KCptbnQsICpkZW50cnkpOworCQlpZiAoIW1vdW50ZWQpCisJCQlicmVhazsKKwkJbW50cHV0KCptbnQpOworCQkqbW50ID0gbW91bnRlZDsKKwkJZHB1dCgqZGVudHJ5KTsKKwkJKmRlbnRyeSA9IGRnZXQobW91bnRlZC0+bW50X3Jvb3QpOworCQlyZXMgPSAxOworCX0KKwlyZXR1cm4gcmVzOworfQorCisvKiBubyBuZWVkIGZvciBkY2FjaGVfbG9jaywgYXMgc2VyaWFsaXphdGlvbiBpcyB0YWtlbiBjYXJlIGluCisgKiBuYW1lc3BhY2UuYworICovCitzdGF0aWMgaW5saW5lIGludCBfX2ZvbGxvd19kb3duKHN0cnVjdCB2ZnNtb3VudCAqKm1udCwgc3RydWN0IGRlbnRyeSAqKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgdmZzbW91bnQgKm1vdW50ZWQ7CisKKwltb3VudGVkID0gbG9va3VwX21udCgqbW50LCAqZGVudHJ5KTsKKwlpZiAobW91bnRlZCkgeworCQltbnRwdXQoKm1udCk7CisJCSptbnQgPSBtb3VudGVkOworCQlkcHV0KCpkZW50cnkpOworCQkqZGVudHJ5ID0gZGdldChtb3VudGVkLT5tbnRfcm9vdCk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGZvbGxvd19kb3duKHN0cnVjdCB2ZnNtb3VudCAqKm1udCwgc3RydWN0IGRlbnRyeSAqKmRlbnRyeSkKK3sKKwlyZXR1cm4gX19mb2xsb3dfZG93bihtbnQsZGVudHJ5KTsKK30KKyAKK3N0YXRpYyBpbmxpbmUgdm9pZCBmb2xsb3dfZG90ZG90KHN0cnVjdCB2ZnNtb3VudCAqKm1udCwgc3RydWN0IGRlbnRyeSAqKmRlbnRyeSkKK3sKKwl3aGlsZSgxKSB7CisJCXN0cnVjdCB2ZnNtb3VudCAqcGFyZW50OworCQlzdHJ1Y3QgZGVudHJ5ICpvbGQgPSAqZGVudHJ5OworCisgICAgICAgICAgICAgICAgcmVhZF9sb2NrKCZjdXJyZW50LT5mcy0+bG9jayk7CisJCWlmICgqZGVudHJ5ID09IGN1cnJlbnQtPmZzLT5yb290ICYmCisJCSAgICAqbW50ID09IGN1cnJlbnQtPmZzLT5yb290bW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3VubG9jaygmY3VycmVudC0+ZnMtPmxvY2spOworCQkJYnJlYWs7CisJCX0KKyAgICAgICAgICAgICAgICByZWFkX3VubG9jaygmY3VycmVudC0+ZnMtPmxvY2spOworCQlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwkJaWYgKCpkZW50cnkgIT0gKCptbnQpLT5tbnRfcm9vdCkgeworCQkJKmRlbnRyeSA9IGRnZXQoKCpkZW50cnkpLT5kX3BhcmVudCk7CisJCQlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCQkJZHB1dChvbGQpOworCQkJYnJlYWs7CisJCX0KKwkJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwkJc3Bpbl9sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKwkJcGFyZW50ID0gKCptbnQpLT5tbnRfcGFyZW50OworCQlpZiAocGFyZW50ID09ICptbnQpIHsKKwkJCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKwkJCWJyZWFrOworCQl9CisJCW1udGdldChwYXJlbnQpOworCQkqZGVudHJ5ID0gZGdldCgoKm1udCktPm1udF9tb3VudHBvaW50KTsKKwkJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOworCQlkcHV0KG9sZCk7CisJCW1udHB1dCgqbW50KTsKKwkJKm1udCA9IHBhcmVudDsKKwl9CisJZm9sbG93X21vdW50KG1udCwgZGVudHJ5KTsKK30KKworc3RydWN0IHBhdGggeworCXN0cnVjdCB2ZnNtb3VudCAqbW50OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKK307CisKKy8qCisgKiAgSXQncyBtb3JlIGNvbnZvbHV0ZWQgdGhhbiBJJ2QgbGlrZSBpdCB0byBiZSwgYnV0Li4uIGl0J3Mgc3RpbGwgZmFpcmx5CisgKiAgc21hbGwgYW5kIGZvciBub3cgSSdkIHByZWZlciB0byBoYXZlIGZhc3QgcGF0aCBhcyBzdHJhaWdodCBhcyBwb3NzaWJsZS4KKyAqICBJdCBfaXNfIHRpbWUtY3JpdGljYWwuCisgKi8KK3N0YXRpYyBpbnQgZG9fbG9va3VwKHN0cnVjdCBuYW1laWRhdGEgKm5kLCBzdHJ1Y3QgcXN0ciAqbmFtZSwKKwkJICAgICBzdHJ1Y3QgcGF0aCAqcGF0aCkKK3sKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IG5kLT5tbnQ7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gX19kX2xvb2t1cChuZC0+ZGVudHJ5LCBuYW1lKTsKKworCWlmICghZGVudHJ5KQorCQlnb3RvIG5lZWRfbG9va3VwOworCWlmIChkZW50cnktPmRfb3AgJiYgZGVudHJ5LT5kX29wLT5kX3JldmFsaWRhdGUpCisJCWdvdG8gbmVlZF9yZXZhbGlkYXRlOworZG9uZToKKwlwYXRoLT5tbnQgPSBtbnQ7CisJcGF0aC0+ZGVudHJ5ID0gZGVudHJ5OworCXJldHVybiAwOworCituZWVkX2xvb2t1cDoKKwlkZW50cnkgPSByZWFsX2xvb2t1cChuZC0+ZGVudHJ5LCBuYW1lLCBuZCk7CisJaWYgKElTX0VSUihkZW50cnkpKQorCQlnb3RvIGZhaWw7CisJZ290byBkb25lOworCituZWVkX3JldmFsaWRhdGU6CisJaWYgKGRlbnRyeS0+ZF9vcC0+ZF9yZXZhbGlkYXRlKGRlbnRyeSwgbmQpKQorCQlnb3RvIGRvbmU7CisJaWYgKGRfaW52YWxpZGF0ZShkZW50cnkpKQorCQlnb3RvIGRvbmU7CisJZHB1dChkZW50cnkpOworCWdvdG8gbmVlZF9sb29rdXA7CisKK2ZhaWw6CisJcmV0dXJuIFBUUl9FUlIoZGVudHJ5KTsKK30KKworLyoKKyAqIE5hbWUgcmVzb2x1dGlvbi4KKyAqCisgKiBUaGlzIGlzIHRoZSBiYXNpYyBuYW1lIHJlc29sdXRpb24gZnVuY3Rpb24sIHR1cm5pbmcgYSBwYXRobmFtZQorICogaW50byB0aGUgZmluYWwgZGVudHJ5LgorICoKKyAqIFdlIGV4cGVjdCAnYmFzZScgdG8gYmUgcG9zaXRpdmUgYW5kIGEgZGlyZWN0b3J5LgorICovCitzdGF0aWMgZmFzdGNhbGwgaW50IF9fbGlua19wYXRoX3dhbGsoY29uc3QgY2hhciAqIG5hbWUsIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBwYXRoIG5leHQ7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgZXJyOworCXVuc2lnbmVkIGludCBsb29rdXBfZmxhZ3MgPSBuZC0+ZmxhZ3M7CisJCisJd2hpbGUgKCpuYW1lPT0nLycpCisJCW5hbWUrKzsKKwlpZiAoISpuYW1lKQorCQlnb3RvIHJldHVybl9yZXZhbDsKKworCWlub2RlID0gbmQtPmRlbnRyeS0+ZF9pbm9kZTsKKwlpZiAobmQtPmRlcHRoKQorCQlsb29rdXBfZmxhZ3MgPSBMT09LVVBfRk9MTE9XOworCisJLyogQXQgdGhpcyBwb2ludCB3ZSBrbm93IHdlIGhhdmUgYSByZWFsIHBhdGggY29tcG9uZW50LiAqLworCWZvcig7OykgeworCQl1bnNpZ25lZCBsb25nIGhhc2g7CisJCXN0cnVjdCBxc3RyIHRoaXM7CisJCXVuc2lnbmVkIGludCBjOworCisJCWVyciA9IGV4ZWNfcGVybWlzc2lvbl9saXRlKGlub2RlLCBuZCk7CisJCWlmIChlcnIgPT0gLUVBR0FJTikgeyAKKwkJCWVyciA9IHBlcm1pc3Npb24oaW5vZGUsIE1BWV9FWEVDLCBuZCk7CisJCX0KKyAJCWlmIChlcnIpCisJCQlicmVhazsKKworCQl0aGlzLm5hbWUgPSBuYW1lOworCQljID0gKihjb25zdCB1bnNpZ25lZCBjaGFyICopbmFtZTsKKworCQloYXNoID0gaW5pdF9uYW1lX2hhc2goKTsKKwkJZG8geworCQkJbmFtZSsrOworCQkJaGFzaCA9IHBhcnRpYWxfbmFtZV9oYXNoKGMsIGhhc2gpOworCQkJYyA9ICooY29uc3QgdW5zaWduZWQgY2hhciAqKW5hbWU7CisJCX0gd2hpbGUgKGMgJiYgKGMgIT0gJy8nKSk7CisJCXRoaXMubGVuID0gbmFtZSAtIChjb25zdCBjaGFyICopIHRoaXMubmFtZTsKKwkJdGhpcy5oYXNoID0gZW5kX25hbWVfaGFzaChoYXNoKTsKKworCQkvKiByZW1vdmUgdHJhaWxpbmcgc2xhc2hlcz8gKi8KKwkJaWYgKCFjKQorCQkJZ290byBsYXN0X2NvbXBvbmVudDsKKwkJd2hpbGUgKCorK25hbWUgPT0gJy8nKTsKKwkJaWYgKCEqbmFtZSkKKwkJCWdvdG8gbGFzdF93aXRoX3NsYXNoZXM7CisKKwkJLyoKKwkJICogIi4iIGFuZCAiLi4iIGFyZSBzcGVjaWFsIC0gIi4uIiBlc3BlY2lhbGx5IHNvIGJlY2F1c2UgaXQgaGFzCisJCSAqIHRvIGJlIGFibGUgdG8ga25vdyBhYm91dCB0aGUgY3VycmVudCByb290IGRpcmVjdG9yeSBhbmQKKwkJICogcGFyZW50IHJlbGF0aW9uc2hpcHMuCisJCSAqLworCQlpZiAodGhpcy5uYW1lWzBdID09ICcuJykgc3dpdGNoICh0aGlzLmxlbikgeworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoJCisJCQkJaWYgKHRoaXMubmFtZVsxXSAhPSAnLicpCisJCQkJCWJyZWFrOworCQkJCWZvbGxvd19kb3Rkb3QoJm5kLT5tbnQsICZuZC0+ZGVudHJ5KTsKKwkJCQlpbm9kZSA9IG5kLT5kZW50cnktPmRfaW5vZGU7CisJCQkJLyogZmFsbHRocm91Z2ggKi8KKwkJCWNhc2UgMToKKwkJCQljb250aW51ZTsKKwkJfQorCQkvKgorCQkgKiBTZWUgaWYgdGhlIGxvdy1sZXZlbCBmaWxlc3lzdGVtIG1pZ2h0IHdhbnQKKwkJICogdG8gdXNlIGl0cyBvd24gaGFzaC4uCisJCSAqLworCQlpZiAobmQtPmRlbnRyeS0+ZF9vcCAmJiBuZC0+ZGVudHJ5LT5kX29wLT5kX2hhc2gpIHsKKwkJCWVyciA9IG5kLT5kZW50cnktPmRfb3AtPmRfaGFzaChuZC0+ZGVudHJ5LCAmdGhpcyk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlicmVhazsKKwkJfQorCQluZC0+ZmxhZ3MgfD0gTE9PS1VQX0NPTlRJTlVFOworCQkvKiBUaGlzIGRvZXMgdGhlIGFjdHVhbCBsb29rdXBzLi4gKi8KKwkJZXJyID0gZG9fbG9va3VwKG5kLCAmdGhpcywgJm5leHQpOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisJCS8qIENoZWNrIG1vdW50cG9pbnRzLi4gKi8KKwkJZm9sbG93X21vdW50KCZuZXh0Lm1udCwgJm5leHQuZGVudHJ5KTsKKworCQllcnIgPSAtRU5PRU5UOworCQlpbm9kZSA9IG5leHQuZGVudHJ5LT5kX2lub2RlOworCQlpZiAoIWlub2RlKQorCQkJZ290byBvdXRfZHB1dDsKKwkJZXJyID0gLUVOT1RESVI7IAorCQlpZiAoIWlub2RlLT5pX29wKQorCQkJZ290byBvdXRfZHB1dDsKKworCQlpZiAoaW5vZGUtPmlfb3AtPmZvbGxvd19saW5rKSB7CisJCQltbnRnZXQobmV4dC5tbnQpOworCQkJZXJyID0gZG9fZm9sbG93X2xpbmsobmV4dC5kZW50cnksIG5kKTsKKwkJCWRwdXQobmV4dC5kZW50cnkpOworCQkJbW50cHV0KG5leHQubW50KTsKKwkJCWlmIChlcnIpCisJCQkJZ290byByZXR1cm5fZXJyOworCQkJZXJyID0gLUVOT0VOVDsKKwkJCWlub2RlID0gbmQtPmRlbnRyeS0+ZF9pbm9kZTsKKwkJCWlmICghaW5vZGUpCisJCQkJYnJlYWs7CisJCQllcnIgPSAtRU5PVERJUjsgCisJCQlpZiAoIWlub2RlLT5pX29wKQorCQkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJZHB1dChuZC0+ZGVudHJ5KTsKKwkJCW5kLT5tbnQgPSBuZXh0Lm1udDsKKwkJCW5kLT5kZW50cnkgPSBuZXh0LmRlbnRyeTsKKwkJfQorCQllcnIgPSAtRU5PVERJUjsgCisJCWlmICghaW5vZGUtPmlfb3AtPmxvb2t1cCkKKwkJCWJyZWFrOworCQljb250aW51ZTsKKwkJLyogaGVyZSBlbmRzIHRoZSBtYWluIGxvb3AgKi8KKworbGFzdF93aXRoX3NsYXNoZXM6CisJCWxvb2t1cF9mbGFncyB8PSBMT09LVVBfRk9MTE9XIHwgTE9PS1VQX0RJUkVDVE9SWTsKK2xhc3RfY29tcG9uZW50OgorCQluZC0+ZmxhZ3MgJj0gfkxPT0tVUF9DT05USU5VRTsKKwkJaWYgKGxvb2t1cF9mbGFncyAmIExPT0tVUF9QQVJFTlQpCisJCQlnb3RvIGxvb2t1cF9wYXJlbnQ7CisJCWlmICh0aGlzLm5hbWVbMF0gPT0gJy4nKSBzd2l0Y2ggKHRoaXMubGVuKSB7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJY2FzZSAyOgkKKwkJCQlpZiAodGhpcy5uYW1lWzFdICE9ICcuJykKKwkJCQkJYnJlYWs7CisJCQkJZm9sbG93X2RvdGRvdCgmbmQtPm1udCwgJm5kLT5kZW50cnkpOworCQkJCWlub2RlID0gbmQtPmRlbnRyeS0+ZF9pbm9kZTsKKwkJCQkvKiBmYWxsdGhyb3VnaCAqLworCQkJY2FzZSAxOgorCQkJCWdvdG8gcmV0dXJuX3JldmFsOworCQl9CisJCWlmIChuZC0+ZGVudHJ5LT5kX29wICYmIG5kLT5kZW50cnktPmRfb3AtPmRfaGFzaCkgeworCQkJZXJyID0gbmQtPmRlbnRyeS0+ZF9vcC0+ZF9oYXNoKG5kLT5kZW50cnksICZ0aGlzKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCWJyZWFrOworCQl9CisJCWVyciA9IGRvX2xvb2t1cChuZCwgJnRoaXMsICZuZXh0KTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCQlmb2xsb3dfbW91bnQoJm5leHQubW50LCAmbmV4dC5kZW50cnkpOworCQlpbm9kZSA9IG5leHQuZGVudHJ5LT5kX2lub2RlOworCQlpZiAoKGxvb2t1cF9mbGFncyAmIExPT0tVUF9GT0xMT1cpCisJCSAgICAmJiBpbm9kZSAmJiBpbm9kZS0+aV9vcCAmJiBpbm9kZS0+aV9vcC0+Zm9sbG93X2xpbmspIHsKKwkJCW1udGdldChuZXh0Lm1udCk7CisJCQllcnIgPSBkb19mb2xsb3dfbGluayhuZXh0LmRlbnRyeSwgbmQpOworCQkJZHB1dChuZXh0LmRlbnRyeSk7CisJCQltbnRwdXQobmV4dC5tbnQpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIHJldHVybl9lcnI7CisJCQlpbm9kZSA9IG5kLT5kZW50cnktPmRfaW5vZGU7CisJCX0gZWxzZSB7CisJCQlkcHV0KG5kLT5kZW50cnkpOworCQkJbmQtPm1udCA9IG5leHQubW50OworCQkJbmQtPmRlbnRyeSA9IG5leHQuZGVudHJ5OworCQl9CisJCWVyciA9IC1FTk9FTlQ7CisJCWlmICghaW5vZGUpCisJCQlicmVhazsKKwkJaWYgKGxvb2t1cF9mbGFncyAmIExPT0tVUF9ESVJFQ1RPUlkpIHsKKwkJCWVyciA9IC1FTk9URElSOyAKKwkJCWlmICghaW5vZGUtPmlfb3AgfHwgIWlub2RlLT5pX29wLT5sb29rdXApCisJCQkJYnJlYWs7CisJCX0KKwkJZ290byByZXR1cm5fYmFzZTsKK2xvb2t1cF9wYXJlbnQ6CisJCW5kLT5sYXN0ID0gdGhpczsKKwkJbmQtPmxhc3RfdHlwZSA9IExBU1RfTk9STTsKKwkJaWYgKHRoaXMubmFtZVswXSAhPSAnLicpCisJCQlnb3RvIHJldHVybl9iYXNlOworCQlpZiAodGhpcy5sZW4gPT0gMSkKKwkJCW5kLT5sYXN0X3R5cGUgPSBMQVNUX0RPVDsKKwkJZWxzZSBpZiAodGhpcy5sZW4gPT0gMiAmJiB0aGlzLm5hbWVbMV0gPT0gJy4nKQorCQkJbmQtPmxhc3RfdHlwZSA9IExBU1RfRE9URE9UOworCQllbHNlCisJCQlnb3RvIHJldHVybl9iYXNlOworcmV0dXJuX3JldmFsOgorCQkvKgorCQkgKiBXZSBieXBhc3NlZCB0aGUgb3JkaW5hcnkgcmV2YWxpZGF0aW9uIHJvdXRpbmVzLgorCQkgKiBXZSBtYXkgbmVlZCB0byBjaGVjayB0aGUgY2FjaGVkIGRlbnRyeSBmb3Igc3RhbGVuZXNzLgorCQkgKi8KKwkJaWYgKG5kLT5kZW50cnkgJiYgbmQtPmRlbnRyeS0+ZF9zYiAmJgorCQkgICAgKG5kLT5kZW50cnktPmRfc2ItPnNfdHlwZS0+ZnNfZmxhZ3MgJiBGU19SRVZBTF9ET1QpKSB7CisJCQllcnIgPSAtRVNUQUxFOworCQkJLyogTm90ZTogd2UgZG8gbm90IGRfaW52YWxpZGF0ZSgpICovCisJCQlpZiAoIW5kLT5kZW50cnktPmRfb3AtPmRfcmV2YWxpZGF0ZShuZC0+ZGVudHJ5LCBuZCkpCisJCQkJYnJlYWs7CisJCX0KK3JldHVybl9iYXNlOgorCQlyZXR1cm4gMDsKK291dF9kcHV0OgorCQlkcHV0KG5leHQuZGVudHJ5KTsKKwkJYnJlYWs7CisJfQorCXBhdGhfcmVsZWFzZShuZCk7CityZXR1cm5fZXJyOgorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBXcmFwcGVyIHRvIHJldHJ5IHBhdGhuYW1lIHJlc29sdXRpb24gd2hlbmV2ZXIgdGhlIHVuZGVybHlpbmcKKyAqIGZpbGUgc3lzdGVtIHJldHVybnMgYW4gRVNUQUxFLgorICoKKyAqIFJldHJ5IHRoZSB3aG9sZSBwYXRoIG9uY2UsIGZvcmNpbmcgcmVhbCBsb29rdXAgcmVxdWVzdHMKKyAqIGluc3RlYWQgb2YgcmVseWluZyBvbiB0aGUgZGNhY2hlLgorICovCitpbnQgZmFzdGNhbGwgbGlua19wYXRoX3dhbGsoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IG5hbWVpZGF0YSBzYXZlID0gKm5kOworCWludCByZXN1bHQ7CisKKwkvKiBtYWtlIHN1cmUgdGhlIHN0dWZmIHdlIHNhdmVkIGRvZXNuJ3QgZ28gYXdheSAqLworCWRnZXQoc2F2ZS5kZW50cnkpOworCW1udGdldChzYXZlLm1udCk7CisKKwlyZXN1bHQgPSBfX2xpbmtfcGF0aF93YWxrKG5hbWUsIG5kKTsKKwlpZiAocmVzdWx0ID09IC1FU1RBTEUpIHsKKwkJKm5kID0gc2F2ZTsKKwkJZGdldChuZC0+ZGVudHJ5KTsKKwkJbW50Z2V0KG5kLT5tbnQpOworCQluZC0+ZmxhZ3MgfD0gTE9PS1VQX1JFVkFMOworCQlyZXN1bHQgPSBfX2xpbmtfcGF0aF93YWxrKG5hbWUsIG5kKTsKKwl9CisKKwlkcHV0KHNhdmUuZGVudHJ5KTsKKwltbnRwdXQoc2F2ZS5tbnQpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IGZhc3RjYWxsIHBhdGhfd2Fsayhjb25zdCBjaGFyICogbmFtZSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJY3VycmVudC0+dG90YWxfbGlua19jb3VudCA9IDA7CisJcmV0dXJuIGxpbmtfcGF0aF93YWxrKG5hbWUsIG5kKTsKK30KKworLyogU01QLXNhZmUgKi8KKy8qIHJldHVybnMgMSBpZiBldmVyeXRoaW5nIGlzIGRvbmUgKi8KK3N0YXRpYyBpbnQgX19lbXVsX2xvb2t1cF9kZW50cnkoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaWYgKHBhdGhfd2FsayhuYW1lLCBuZCkpCisJCXJldHVybiAwOwkJLyogc29tZXRoaW5nIHdlbnQgd3JvbmcuLi4gKi8KKworCWlmICghbmQtPmRlbnRyeS0+ZF9pbm9kZSB8fCBTX0lTRElSKG5kLT5kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpIHsKKwkJc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSA9IG5kLT5kZW50cnk7CisJCXN0cnVjdCB2ZnNtb3VudCAqb2xkX21udCA9IG5kLT5tbnQ7CisJCXN0cnVjdCBxc3RyIGxhc3QgPSBuZC0+bGFzdDsKKwkJaW50IGxhc3RfdHlwZSA9IG5kLT5sYXN0X3R5cGU7CisJCS8qCisJCSAqIE5BTUUgd2FzIG5vdCBmb3VuZCBpbiBhbHRlcm5hdGUgcm9vdCBvciBpdCdzIGEgZGlyZWN0b3J5LiAgVHJ5IHRvIGZpbmQKKwkJICogaXQgaW4gdGhlIG5vcm1hbCByb290OgorCQkgKi8KKwkJbmQtPmxhc3RfdHlwZSA9IExBU1RfUk9PVDsKKwkJcmVhZF9sb2NrKCZjdXJyZW50LT5mcy0+bG9jayk7CisJCW5kLT5tbnQgPSBtbnRnZXQoY3VycmVudC0+ZnMtPnJvb3RtbnQpOworCQluZC0+ZGVudHJ5ID0gZGdldChjdXJyZW50LT5mcy0+cm9vdCk7CisJCXJlYWRfdW5sb2NrKCZjdXJyZW50LT5mcy0+bG9jayk7CisJCWlmIChwYXRoX3dhbGsobmFtZSwgbmQpID09IDApIHsKKwkJCWlmIChuZC0+ZGVudHJ5LT5kX2lub2RlKSB7CisJCQkJZHB1dChvbGRfZGVudHJ5KTsKKwkJCQltbnRwdXQob2xkX21udCk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlwYXRoX3JlbGVhc2UobmQpOworCQl9CisJCW5kLT5kZW50cnkgPSBvbGRfZGVudHJ5OworCQluZC0+bW50ID0gb2xkX21udDsKKwkJbmQtPmxhc3QgPSBsYXN0OworCQluZC0+bGFzdF90eXBlID0gbGFzdF90eXBlOworCX0KKwlyZXR1cm4gMTsKK30KKwordm9pZCBzZXRfZnNfYWx0cm9vdCh2b2lkKQoreworCWNoYXIgKmVtdWwgPSBfX2VtdWxfcHJlZml4KCk7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IE5VTEwsICpvbGRtbnQ7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gTlVMTCwgKm9sZGRlbnRyeTsKKwlpbnQgZXJyOworCisJaWYgKCFlbXVsKQorCQlnb3RvIHNldF9pdDsKKwllcnIgPSBwYXRoX2xvb2t1cChlbXVsLCBMT09LVVBfRk9MTE9XfExPT0tVUF9ESVJFQ1RPUll8TE9PS1VQX05PQUxULCAmbmQpOworCWlmICghZXJyKSB7CisJCW1udCA9IG5kLm1udDsKKwkJZGVudHJ5ID0gbmQuZGVudHJ5OworCX0KK3NldF9pdDoKKwl3cml0ZV9sb2NrKCZjdXJyZW50LT5mcy0+bG9jayk7CisJb2xkbW50ID0gY3VycmVudC0+ZnMtPmFsdHJvb3RtbnQ7CisJb2xkZGVudHJ5ID0gY3VycmVudC0+ZnMtPmFsdHJvb3Q7CisJY3VycmVudC0+ZnMtPmFsdHJvb3RtbnQgPSBtbnQ7CisJY3VycmVudC0+ZnMtPmFsdHJvb3QgPSBkZW50cnk7CisJd3JpdGVfdW5sb2NrKCZjdXJyZW50LT5mcy0+bG9jayk7CisJaWYgKG9sZGRlbnRyeSkgeworCQlkcHV0KG9sZGRlbnRyeSk7CisJCW1udHB1dChvbGRtbnQpOworCX0KK30KKworaW50IGZhc3RjYWxsIHBhdGhfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaW50IHJldHZhbDsKKworCW5kLT5sYXN0X3R5cGUgPSBMQVNUX1JPT1Q7IC8qIGlmIHRoZXJlIGFyZSBvbmx5IHNsYXNoZXMuLi4gKi8KKwluZC0+ZmxhZ3MgPSBmbGFnczsKKwluZC0+ZGVwdGggPSAwOworCisJcmVhZF9sb2NrKCZjdXJyZW50LT5mcy0+bG9jayk7CisJaWYgKCpuYW1lPT0nLycpIHsKKwkJaWYgKGN1cnJlbnQtPmZzLT5hbHRyb290ICYmICEobmQtPmZsYWdzICYgTE9PS1VQX05PQUxUKSkgeworCQkJbmQtPm1udCA9IG1udGdldChjdXJyZW50LT5mcy0+YWx0cm9vdG1udCk7CisJCQluZC0+ZGVudHJ5ID0gZGdldChjdXJyZW50LT5mcy0+YWx0cm9vdCk7CisJCQlyZWFkX3VubG9jaygmY3VycmVudC0+ZnMtPmxvY2spOworCQkJaWYgKF9fZW11bF9sb29rdXBfZGVudHJ5KG5hbWUsbmQpKQorCQkJCXJldHVybiAwOworCQkJcmVhZF9sb2NrKCZjdXJyZW50LT5mcy0+bG9jayk7CisJCX0KKwkJbmQtPm1udCA9IG1udGdldChjdXJyZW50LT5mcy0+cm9vdG1udCk7CisJCW5kLT5kZW50cnkgPSBkZ2V0KGN1cnJlbnQtPmZzLT5yb290KTsKKwl9IGVsc2UgeworCQluZC0+bW50ID0gbW50Z2V0KGN1cnJlbnQtPmZzLT5wd2RtbnQpOworCQluZC0+ZGVudHJ5ID0gZGdldChjdXJyZW50LT5mcy0+cHdkKTsKKwl9CisJcmVhZF91bmxvY2soJmN1cnJlbnQtPmZzLT5sb2NrKTsKKwljdXJyZW50LT50b3RhbF9saW5rX2NvdW50ID0gMDsKKwlyZXR2YWwgPSBsaW5rX3BhdGhfd2FsayhuYW1lLCBuZCk7CisJaWYgKHVubGlrZWx5KGN1cnJlbnQtPmF1ZGl0X2NvbnRleHQKKwkJICAgICAmJiBuZCAmJiBuZC0+ZGVudHJ5ICYmIG5kLT5kZW50cnktPmRfaW5vZGUpKQorCQlhdWRpdF9pbm9kZShuYW1lLCBuZC0+ZGVudHJ5LT5kX2lub2RlKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogUmVzdHJpY3RlZCBmb3JtIG9mIGxvb2t1cC4gRG9lc24ndCBmb2xsb3cgbGlua3MsIHNpbmdsZS1jb21wb25lbnQgb25seSwKKyAqIG5lZWRzIHBhcmVudCBhbHJlYWR5IGxvY2tlZC4gRG9lc24ndCBmb2xsb3cgbW91bnRzLgorICogU01QLXNhZmUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICogX19sb29rdXBfaGFzaChzdHJ1Y3QgcXN0ciAqbmFtZSwgc3RydWN0IGRlbnRyeSAqIGJhc2UsIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBkZW50cnkgKiBkZW50cnk7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgZXJyOworCisJaW5vZGUgPSBiYXNlLT5kX2lub2RlOworCWVyciA9IHBlcm1pc3Npb24oaW5vZGUsIE1BWV9FWEVDLCBuZCk7CisJZGVudHJ5ID0gRVJSX1BUUihlcnIpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBTZWUgaWYgdGhlIGxvdy1sZXZlbCBmaWxlc3lzdGVtIG1pZ2h0IHdhbnQKKwkgKiB0byB1c2UgaXRzIG93biBoYXNoLi4KKwkgKi8KKwlpZiAoYmFzZS0+ZF9vcCAmJiBiYXNlLT5kX29wLT5kX2hhc2gpIHsKKwkJZXJyID0gYmFzZS0+ZF9vcC0+ZF9oYXNoKGJhc2UsIG5hbWUpOworCQlkZW50cnkgPSBFUlJfUFRSKGVycik7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBvdXQ7CisJfQorCisJZGVudHJ5ID0gY2FjaGVkX2xvb2t1cChiYXNlLCBuYW1lLCBuZCk7CisJaWYgKCFkZW50cnkpIHsKKwkJc3RydWN0IGRlbnRyeSAqbmV3ID0gZF9hbGxvYyhiYXNlLCBuYW1lKTsKKwkJZGVudHJ5ID0gRVJSX1BUUigtRU5PTUVNKTsKKwkJaWYgKCFuZXcpCisJCQlnb3RvIG91dDsKKwkJZGVudHJ5ID0gaW5vZGUtPmlfb3AtPmxvb2t1cChpbm9kZSwgbmV3LCBuZCk7CisJCWlmICghZGVudHJ5KQorCQkJZGVudHJ5ID0gbmV3OworCQllbHNlCisJCQlkcHV0KG5ldyk7CisJfQorb3V0OgorCXJldHVybiBkZW50cnk7Cit9CisKK3N0cnVjdCBkZW50cnkgKiBsb29rdXBfaGFzaChzdHJ1Y3QgcXN0ciAqbmFtZSwgc3RydWN0IGRlbnRyeSAqIGJhc2UpCit7CisJcmV0dXJuIF9fbG9va3VwX2hhc2gobmFtZSwgYmFzZSwgTlVMTCk7Cit9CisKKy8qIFNNUC1zYWZlICovCitzdHJ1Y3QgZGVudHJ5ICogbG9va3VwX29uZV9sZW4oY29uc3QgY2hhciAqIG5hbWUsIHN0cnVjdCBkZW50cnkgKiBiYXNlLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgaGFzaDsKKwlzdHJ1Y3QgcXN0ciB0aGlzOworCXVuc2lnbmVkIGludCBjOworCisJdGhpcy5uYW1lID0gbmFtZTsKKwl0aGlzLmxlbiA9IGxlbjsKKwlpZiAoIWxlbikKKwkJZ290byBhY2Nlc3M7CisKKwloYXNoID0gaW5pdF9uYW1lX2hhc2goKTsKKwl3aGlsZSAobGVuLS0pIHsKKwkJYyA9ICooY29uc3QgdW5zaWduZWQgY2hhciAqKW5hbWUrKzsKKwkJaWYgKGMgPT0gJy8nIHx8IGMgPT0gJ1wwJykKKwkJCWdvdG8gYWNjZXNzOworCQloYXNoID0gcGFydGlhbF9uYW1lX2hhc2goYywgaGFzaCk7CisJfQorCXRoaXMuaGFzaCA9IGVuZF9uYW1lX2hhc2goaGFzaCk7CisKKwlyZXR1cm4gbG9va3VwX2hhc2goJnRoaXMsIGJhc2UpOworYWNjZXNzOgorCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworfQorCisvKgorICoJbmFtZWkoKQorICoKKyAqIGlzIHVzZWQgYnkgbW9zdCBzaW1wbGUgY29tbWFuZHMgdG8gZ2V0IHRoZSBpbm9kZSBvZiBhIHNwZWNpZmllZCBuYW1lLgorICogT3BlbiwgbGluayBldGMgdXNlIHRoZWlyIG93biByb3V0aW5lcywgYnV0IHRoaXMgaXMgZW5vdWdoIGZvciB0aGluZ3MKKyAqIGxpa2UgJ2NobW9kJyBldGMuCisgKgorICogbmFtZWkgZXhpc3RzIGluIHR3byB2ZXJzaW9uczogbmFtZWkvbG5hbWVpLiBUaGUgb25seSBkaWZmZXJlbmNlIGlzCisgKiB0aGF0IG5hbWVpIGZvbGxvd3MgbGlua3MsIHdoaWxlIGxuYW1laSBkb2VzIG5vdC4KKyAqIFNNUC1zYWZlCisgKi8KK2ludCBmYXN0Y2FsbCBfX3VzZXJfd2Fsayhjb25zdCBjaGFyIF9fdXNlciAqbmFtZSwgdW5zaWduZWQgZmxhZ3MsIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWNoYXIgKnRtcCA9IGdldG5hbWUobmFtZSk7CisJaW50IGVyciA9IFBUUl9FUlIodG1wKTsKKworCWlmICghSVNfRVJSKHRtcCkpIHsKKwkJZXJyID0gcGF0aF9sb29rdXAodG1wLCBmbGFncywgbmQpOworCQlwdXRuYW1lKHRtcCk7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBJdCdzIGlubGluZSwgc28gcGVuYWx0eSBmb3IgZmlsZXN5c3RlbXMgdGhhdCBkb24ndCB1c2Ugc3RpY2t5IGJpdCBpcworICogbWluaW1hbC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgY2hlY2tfc3RpY2t5KHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmICghKGRpci0+aV9tb2RlICYgU19JU1ZUWCkpCisJCXJldHVybiAwOworCWlmIChpbm9kZS0+aV91aWQgPT0gY3VycmVudC0+ZnN1aWQpCisJCXJldHVybiAwOworCWlmIChkaXItPmlfdWlkID09IGN1cnJlbnQtPmZzdWlkKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gIWNhcGFibGUoQ0FQX0ZPV05FUik7Cit9CisKKy8qCisgKglDaGVjayB3aGV0aGVyIHdlIGNhbiByZW1vdmUgYSBsaW5rIHZpY3RpbSBmcm9tIGRpcmVjdG9yeSBkaXIsIGNoZWNrCisgKiAgd2hldGhlciB0aGUgdHlwZSBvZiB2aWN0aW0gaXMgcmlnaHQuCisgKiAgMS4gV2UgY2FuJ3QgZG8gaXQgaWYgZGlyIGlzIHJlYWQtb25seSAoZG9uZSBpbiBwZXJtaXNzaW9uKCkpCisgKiAgMi4gV2Ugc2hvdWxkIGhhdmUgd3JpdGUgYW5kIGV4ZWMgcGVybWlzc2lvbnMgb24gZGlyCisgKiAgMy4gV2UgY2FuJ3QgcmVtb3ZlIGFueXRoaW5nIGZyb20gYXBwZW5kLW9ubHkgZGlyCisgKiAgNC4gV2UgY2FuJ3QgZG8gYW55dGhpbmcgd2l0aCBpbW11dGFibGUgZGlyIChkb25lIGluIHBlcm1pc3Npb24oKSkKKyAqICA1LiBJZiB0aGUgc3RpY2t5IGJpdCBvbiBkaXIgaXMgc2V0IHdlIHNob3VsZCBlaXRoZXIKKyAqCWEuIGJlIG93bmVyIG9mIGRpciwgb3IKKyAqCWIuIGJlIG93bmVyIG9mIHZpY3RpbSwgb3IKKyAqCWMuIGhhdmUgQ0FQX0ZPV05FUiBjYXBhYmlsaXR5CisgKiAgNi4gSWYgdGhlIHZpY3RpbSBpcyBhcHBlbmQtb25seSBvciBpbW11dGFibGUgd2UgY2FuJ3QgZG8gYW50eWhpbmcgd2l0aAorICogICAgIGxpbmtzIHBvaW50aW5nIHRvIGl0LgorICogIDcuIElmIHdlIHdlcmUgYXNrZWQgdG8gcmVtb3ZlIGEgZGlyZWN0b3J5IGFuZCB2aWN0aW0gaXNuJ3Qgb25lIC0gRU5PVERJUi4KKyAqICA4LiBJZiB3ZSB3ZXJlIGFza2VkIHRvIHJlbW92ZSBhIG5vbi1kaXJlY3RvcnkgYW5kIHZpY3RpbSBpc24ndCBvbmUgLSBFSVNESVIuCisgKiAgOS4gV2UgY2FuJ3QgcmVtb3ZlIGEgcm9vdCBvciBtb3VudHBvaW50LgorICogMTAuIFdlIGRvbid0IGFsbG93IHJlbW92YWwgb2YgTkZTIHNpbGx5cmVuYW1lZCBmaWxlczsgaXQncyBoYW5kbGVkIGJ5CisgKiAgICAgbmZzX2FzeW5jX3VubGluaygpLgorICovCitzdGF0aWMgaW5saW5lIGludCBtYXlfZGVsZXRlKHN0cnVjdCBpbm9kZSAqZGlyLHN0cnVjdCBkZW50cnkgKnZpY3RpbSxpbnQgaXNkaXIpCit7CisJaW50IGVycm9yOworCisJaWYgKCF2aWN0aW0tPmRfaW5vZGUpCisJCXJldHVybiAtRU5PRU5UOworCisJQlVHX09OKHZpY3RpbS0+ZF9wYXJlbnQtPmRfaW5vZGUgIT0gZGlyKTsKKworCWVycm9yID0gcGVybWlzc2lvbihkaXIsTUFZX1dSSVRFIHwgTUFZX0VYRUMsIE5VTEwpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCWlmIChJU19BUFBFTkQoZGlyKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwlpZiAoY2hlY2tfc3RpY2t5KGRpciwgdmljdGltLT5kX2lub2RlKXx8SVNfQVBQRU5EKHZpY3RpbS0+ZF9pbm9kZSl8fAorCSAgICBJU19JTU1VVEFCTEUodmljdGltLT5kX2lub2RlKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwlpZiAoaXNkaXIpIHsKKwkJaWYgKCFTX0lTRElSKHZpY3RpbS0+ZF9pbm9kZS0+aV9tb2RlKSkKKwkJCXJldHVybiAtRU5PVERJUjsKKwkJaWYgKElTX1JPT1QodmljdGltKSkKKwkJCXJldHVybiAtRUJVU1k7CisJfSBlbHNlIGlmIChTX0lTRElSKHZpY3RpbS0+ZF9pbm9kZS0+aV9tb2RlKSkKKwkJcmV0dXJuIC1FSVNESVI7CisJaWYgKElTX0RFQURESVIoZGlyKSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJaWYgKHZpY3RpbS0+ZF9mbGFncyAmIERDQUNIRV9ORlNGU19SRU5BTUVEKQorCQlyZXR1cm4gLUVCVVNZOworCXJldHVybiAwOworfQorCisvKglDaGVjayB3aGV0aGVyIHdlIGNhbiBjcmVhdGUgYW4gb2JqZWN0IHdpdGggZGVudHJ5IGNoaWxkIGluIGRpcmVjdG9yeQorICogIGRpci4KKyAqICAxLiBXZSBjYW4ndCBkbyBpdCBpZiBjaGlsZCBhbHJlYWR5IGV4aXN0cyAob3BlbiBoYXMgc3BlY2lhbCB0cmVhdG1lbnQgZm9yCisgKiAgICAgdGhpcyBjYXNlLCBidXQgc2luY2Ugd2UgYXJlIGlubGluZWQgaXQncyBPSykKKyAqICAyLiBXZSBjYW4ndCBkbyBpdCBpZiBkaXIgaXMgcmVhZC1vbmx5IChkb25lIGluIHBlcm1pc3Npb24oKSkKKyAqICAzLiBXZSBzaG91bGQgaGF2ZSB3cml0ZSBhbmQgZXhlYyBwZXJtaXNzaW9ucyBvbiBkaXIKKyAqICA0LiBXZSBjYW4ndCBkbyBpdCBpZiBkaXIgaXMgaW1tdXRhYmxlIChkb25lIGluIHBlcm1pc3Npb24oKSkKKyAqLworc3RhdGljIGlubGluZSBpbnQgbWF5X2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqY2hpbGQsCisJCQkgICAgIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWlmIChjaGlsZC0+ZF9pbm9kZSkKKwkJcmV0dXJuIC1FRVhJU1Q7CisJaWYgKElTX0RFQURESVIoZGlyKSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJcmV0dXJuIHBlcm1pc3Npb24oZGlyLE1BWV9XUklURSB8IE1BWV9FWEVDLCBuZCk7Cit9CisKKy8qIAorICogU3BlY2lhbCBjYXNlOiBPX0NSRUFUfE9fRVhDTCBpbXBsaWVzIE9fTk9GT0xMT1cgZm9yIHNlY3VyaXR5CisgKiByZWFzb25zLgorICoKKyAqIE9fRElSRUNUT1JZIHRyYW5zbGF0ZXMgaW50byBmb3JjaW5nIGEgZGlyZWN0b3J5IGxvb2t1cC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbG9va3VwX2ZsYWdzKHVuc2lnbmVkIGludCBmKQoreworCXVuc2lnbmVkIGxvbmcgcmV0dmFsID0gTE9PS1VQX0ZPTExPVzsKKworCWlmIChmICYgT19OT0ZPTExPVykKKwkJcmV0dmFsICY9IH5MT09LVVBfRk9MTE9XOworCQorCWlmICgoZiAmIChPX0NSRUFUfE9fRVhDTCkpID09IChPX0NSRUFUfE9fRVhDTCkpCisJCXJldHZhbCAmPSB+TE9PS1VQX0ZPTExPVzsKKwkKKwlpZiAoZiAmIE9fRElSRUNUT1JZKQorCQlyZXR2YWwgfD0gTE9PS1VQX0RJUkVDVE9SWTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBwMSBhbmQgcDIgc2hvdWxkIGJlIGRpcmVjdG9yaWVzIG9uIHRoZSBzYW1lIGZzLgorICovCitzdHJ1Y3QgZGVudHJ5ICpsb2NrX3JlbmFtZShzdHJ1Y3QgZGVudHJ5ICpwMSwgc3RydWN0IGRlbnRyeSAqcDIpCit7CisJc3RydWN0IGRlbnRyeSAqcDsKKworCWlmIChwMSA9PSBwMikgeworCQlkb3duKCZwMS0+ZF9pbm9kZS0+aV9zZW0pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlkb3duKCZwMS0+ZF9pbm9kZS0+aV9zYi0+c192ZnNfcmVuYW1lX3NlbSk7CisKKwlmb3IgKHAgPSBwMTsgcC0+ZF9wYXJlbnQgIT0gcDsgcCA9IHAtPmRfcGFyZW50KSB7CisJCWlmIChwLT5kX3BhcmVudCA9PSBwMikgeworCQkJZG93bigmcDItPmRfaW5vZGUtPmlfc2VtKTsKKwkJCWRvd24oJnAxLT5kX2lub2RlLT5pX3NlbSk7CisJCQlyZXR1cm4gcDsKKwkJfQorCX0KKworCWZvciAocCA9IHAyOyBwLT5kX3BhcmVudCAhPSBwOyBwID0gcC0+ZF9wYXJlbnQpIHsKKwkJaWYgKHAtPmRfcGFyZW50ID09IHAxKSB7CisJCQlkb3duKCZwMS0+ZF9pbm9kZS0+aV9zZW0pOworCQkJZG93bigmcDItPmRfaW5vZGUtPmlfc2VtKTsKKwkJCXJldHVybiBwOworCQl9CisJfQorCisJZG93bigmcDEtPmRfaW5vZGUtPmlfc2VtKTsKKwlkb3duKCZwMi0+ZF9pbm9kZS0+aV9zZW0pOworCXJldHVybiBOVUxMOworfQorCit2b2lkIHVubG9ja19yZW5hbWUoc3RydWN0IGRlbnRyeSAqcDEsIHN0cnVjdCBkZW50cnkgKnAyKQoreworCXVwKCZwMS0+ZF9pbm9kZS0+aV9zZW0pOworCWlmIChwMSAhPSBwMikgeworCQl1cCgmcDItPmRfaW5vZGUtPmlfc2VtKTsKKwkJdXAoJnAxLT5kX2lub2RlLT5pX3NiLT5zX3Zmc19yZW5hbWVfc2VtKTsKKwl9Cit9CisKK2ludCB2ZnNfY3JlYXRlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLAorCQlzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlpbnQgZXJyb3IgPSBtYXlfY3JlYXRlKGRpciwgZGVudHJ5LCBuZCk7CisKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWlmICghZGlyLT5pX29wIHx8ICFkaXItPmlfb3AtPmNyZWF0ZSkKKwkJcmV0dXJuIC1FQUNDRVM7CS8qIHNob3VsZG4ndCBpdCBiZSBFTk9TWVM/ICovCisJbW9kZSAmPSBTX0lBTExVR087CisJbW9kZSB8PSBTX0lGUkVHOworCWVycm9yID0gc2VjdXJpdHlfaW5vZGVfY3JlYXRlKGRpciwgZGVudHJ5LCBtb2RlKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwlEUVVPVF9JTklUKGRpcik7CisJZXJyb3IgPSBkaXItPmlfb3AtPmNyZWF0ZShkaXIsIGRlbnRyeSwgbW9kZSwgbmQpOworCWlmICghZXJyb3IpIHsKKwkJaW5vZGVfZGlyX25vdGlmeShkaXIsIEROX0NSRUFURSk7CisJCXNlY3VyaXR5X2lub2RlX3Bvc3RfY3JlYXRlKGRpciwgZGVudHJ5LCBtb2RlKTsKKwl9CisJcmV0dXJuIGVycm9yOworfQorCitpbnQgbWF5X29wZW4oc3RydWN0IG5hbWVpZGF0YSAqbmQsIGludCBhY2NfbW9kZSwgaW50IGZsYWcpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gbmQtPmRlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludCBlcnJvcjsKKworCWlmICghaW5vZGUpCisJCXJldHVybiAtRU5PRU5UOworCisJaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiAtRUxPT1A7CisJCisJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgKGZsYWcgJiBGTU9ERV9XUklURSkpCisJCXJldHVybiAtRUlTRElSOworCisJZXJyb3IgPSBwZXJtaXNzaW9uKGlub2RlLCBhY2NfbW9kZSwgbmQpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJLyoKKwkgKiBGSUZPJ3MsIHNvY2tldHMgYW5kIGRldmljZSBmaWxlcyBhcmUgc3BlY2lhbDogdGhleSBkb24ndAorCSAqIGFjdHVhbGx5IGxpdmUgb24gdGhlIGZpbGVzeXN0ZW0gaXRzZWxmLCBhbmQgYXMgc3VjaCB5b3UKKwkgKiBjYW4gd3JpdGUgdG8gdGhlbSBldmVuIGlmIHRoZSBmaWxlc3lzdGVtIGlzIHJlYWQtb25seS4KKwkgKi8KKwlpZiAoU19JU0ZJRk8oaW5vZGUtPmlfbW9kZSkgfHwgU19JU1NPQ0soaW5vZGUtPmlfbW9kZSkpIHsKKwkgICAgCWZsYWcgJj0gfk9fVFJVTkM7CisJfSBlbHNlIGlmIChTX0lTQkxLKGlub2RlLT5pX21vZGUpIHx8IFNfSVNDSFIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaWYgKG5kLT5tbnQtPm1udF9mbGFncyAmIE1OVF9OT0RFVikKKwkJCXJldHVybiAtRUFDQ0VTOworCisJCWZsYWcgJj0gfk9fVFJVTkM7CisJfSBlbHNlIGlmIChJU19SRE9OTFkoaW5vZGUpICYmIChmbGFnICYgRk1PREVfV1JJVEUpKQorCQlyZXR1cm4gLUVST0ZTOworCS8qCisJICogQW4gYXBwZW5kLW9ubHkgZmlsZSBtdXN0IGJlIG9wZW5lZCBpbiBhcHBlbmQgbW9kZSBmb3Igd3JpdGluZy4KKwkgKi8KKwlpZiAoSVNfQVBQRU5EKGlub2RlKSkgeworCQlpZiAgKChmbGFnICYgRk1PREVfV1JJVEUpICYmICEoZmxhZyAmIE9fQVBQRU5EKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChmbGFnICYgT19UUlVOQykKKwkJCXJldHVybiAtRVBFUk07CisJfQorCisJLyogT19OT0FUSU1FIGNhbiBvbmx5IGJlIHNldCBieSB0aGUgb3duZXIgb3Igc3VwZXJ1c2VyICovCisJaWYgKGZsYWcgJiBPX05PQVRJTUUpCisJCWlmIChjdXJyZW50LT5mc3VpZCAhPSBpbm9kZS0+aV91aWQgJiYgIWNhcGFibGUoQ0FQX0ZPV05FUikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJLyoKKwkgKiBFbnN1cmUgdGhlcmUgYXJlIG5vIG91dHN0YW5kaW5nIGxlYXNlcyBvbiB0aGUgZmlsZS4KKwkgKi8KKwllcnJvciA9IGJyZWFrX2xlYXNlKGlub2RlLCBmbGFnKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWlmIChmbGFnICYgT19UUlVOQykgeworCQllcnJvciA9IGdldF93cml0ZV9hY2Nlc3MoaW5vZGUpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisKKwkJLyoKKwkJICogUmVmdXNlIHRvIHRydW5jYXRlIGZpbGVzIHdpdGggbWFuZGF0b3J5IGxvY2tzIGhlbGQgb24gdGhlbS4KKwkJICovCisJCWVycm9yID0gbG9ja3NfdmVyaWZ5X2xvY2tlZChpbm9kZSk7CisJCWlmICghZXJyb3IpIHsKKwkJCURRVU9UX0lOSVQoaW5vZGUpOworCQkJCisJCQllcnJvciA9IGRvX3RydW5jYXRlKGRlbnRyeSwgMCk7CisJCX0KKwkJcHV0X3dyaXRlX2FjY2Vzcyhpbm9kZSk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwl9IGVsc2UKKwkJaWYgKGZsYWcgJiBGTU9ERV9XUklURSkKKwkJCURRVU9UX0lOSVQoaW5vZGUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglvcGVuX25hbWVpKCkKKyAqCisgKiBuYW1laSBmb3Igb3BlbiAtIHRoaXMgaXMgaW4gZmFjdCBhbG1vc3QgdGhlIHdob2xlIG9wZW4tcm91dGluZS4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIGxvdyBiaXRzIG9mICJmbGFnIiBhcmVuJ3QgdGhlIHNhbWUgYXMgaW4gdGhlIG9wZW4KKyAqIHN5c3RlbSBjYWxsIC0gdGhleSBhcmUgMDAgLSBubyBwZXJtaXNzaW9ucyBuZWVkZWQKKyAqCQkJICAwMSAtIHJlYWQgcGVybWlzc2lvbiBuZWVkZWQKKyAqCQkJICAxMCAtIHdyaXRlIHBlcm1pc3Npb24gbmVlZGVkCisgKgkJCSAgMTEgLSByZWFkL3dyaXRlIHBlcm1pc3Npb25zIG5lZWRlZAorICogd2hpY2ggaXMgYSBsb3QgbW9yZSBsb2dpY2FsLCBhbmQgYWxzbyBhbGxvd3MgdGhlICJubyBwZXJtIiBuZWVkZWQKKyAqIGZvciBzeW1saW5rcyAod2hlcmUgdGhlIHBlcm1pc3Npb25zIGFyZSBjaGVja2VkIGxhdGVyKS4KKyAqIFNNUC1zYWZlCisgKi8KK2ludCBvcGVuX25hbWVpKGNvbnN0IGNoYXIgKiBwYXRobmFtZSwgaW50IGZsYWcsIGludCBtb2RlLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlpbnQgYWNjX21vZGUsIGVycm9yID0gMDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJc3RydWN0IGRlbnRyeSAqZGlyOworCWludCBjb3VudCA9IDA7CisKKwlhY2NfbW9kZSA9IEFDQ19NT0RFKGZsYWcpOworCisJLyogQWxsb3cgdGhlIExTTSBwZXJtaXNzaW9uIGhvb2sgdG8gZGlzdGluZ3Vpc2ggYXBwZW5kIAorCSAgIGFjY2VzcyBmcm9tIGdlbmVyYWwgd3JpdGUgYWNjZXNzLiAqLworCWlmIChmbGFnICYgT19BUFBFTkQpCisJCWFjY19tb2RlIHw9IE1BWV9BUFBFTkQ7CisKKwkvKiBGaWxsIGluIHRoZSBvcGVuKCkgaW50ZW50IGRhdGEgKi8KKwluZC0+aW50ZW50Lm9wZW4uZmxhZ3MgPSBmbGFnOworCW5kLT5pbnRlbnQub3Blbi5jcmVhdGVfbW9kZSA9IG1vZGU7CisKKwkvKgorCSAqIFRoZSBzaW1wbGVzdCBjYXNlIC0ganVzdCBhIHBsYWluIGxvb2t1cC4KKwkgKi8KKwlpZiAoIShmbGFnICYgT19DUkVBVCkpIHsKKwkJZXJyb3IgPSBwYXRoX2xvb2t1cChwYXRobmFtZSwgbG9va3VwX2ZsYWdzKGZsYWcpfExPT0tVUF9PUEVOLCBuZCk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwkJZ290byBvazsKKwl9CisKKwkvKgorCSAqIENyZWF0ZSAtIHdlIG5lZWQgdG8ga25vdyB0aGUgcGFyZW50LgorCSAqLworCWVycm9yID0gcGF0aF9sb29rdXAocGF0aG5hbWUsIExPT0tVUF9QQVJFTlR8TE9PS1VQX09QRU58TE9PS1VQX0NSRUFURSwgbmQpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJLyoKKwkgKiBXZSBoYXZlIHRoZSBwYXJlbnQgYW5kIGxhc3QgY29tcG9uZW50LiBGaXJzdCBvZiBhbGwsIGNoZWNrCisJICogdGhhdCB3ZSBhcmUgbm90IGFza2VkIHRvIGNyZWF0KDIpIGFuIG9idmlvdXMgZGlyZWN0b3J5IC0gdGhhdAorCSAqIHdpbGwgbm90IGRvLgorCSAqLworCWVycm9yID0gLUVJU0RJUjsKKwlpZiAobmQtPmxhc3RfdHlwZSAhPSBMQVNUX05PUk0gfHwgbmQtPmxhc3QubmFtZVtuZC0+bGFzdC5sZW5dKQorCQlnb3RvIGV4aXQ7CisKKwlkaXIgPSBuZC0+ZGVudHJ5OworCW5kLT5mbGFncyAmPSB+TE9PS1VQX1BBUkVOVDsKKwlkb3duKCZkaXItPmRfaW5vZGUtPmlfc2VtKTsKKwlkZW50cnkgPSBfX2xvb2t1cF9oYXNoKCZuZC0+bGFzdCwgbmQtPmRlbnRyeSwgbmQpOworCitkb19sYXN0OgorCWVycm9yID0gUFRSX0VSUihkZW50cnkpOworCWlmIChJU19FUlIoZGVudHJ5KSkgeworCQl1cCgmZGlyLT5kX2lub2RlLT5pX3NlbSk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiBOZWdhdGl2ZSBkZW50cnksIGp1c3QgY3JlYXRlIHRoZSBmaWxlICovCisJaWYgKCFkZW50cnktPmRfaW5vZGUpIHsKKwkJaWYgKCFJU19QT1NJWEFDTChkaXItPmRfaW5vZGUpKQorCQkJbW9kZSAmPSB+Y3VycmVudC0+ZnMtPnVtYXNrOworCQllcnJvciA9IHZmc19jcmVhdGUoZGlyLT5kX2lub2RlLCBkZW50cnksIG1vZGUsIG5kKTsKKwkJdXAoJmRpci0+ZF9pbm9kZS0+aV9zZW0pOworCQlkcHV0KG5kLT5kZW50cnkpOworCQluZC0+ZGVudHJ5ID0gZGVudHJ5OworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGV4aXQ7CisJCS8qIERvbid0IGNoZWNrIGZvciB3cml0ZSBwZXJtaXNzaW9uLCBkb24ndCB0cnVuY2F0ZSAqLworCQlhY2NfbW9kZSA9IDA7CisJCWZsYWcgJj0gfk9fVFJVTkM7CisJCWdvdG8gb2s7CisJfQorCisJLyoKKwkgKiBJdCBhbHJlYWR5IGV4aXN0cy4KKwkgKi8KKwl1cCgmZGlyLT5kX2lub2RlLT5pX3NlbSk7CisKKwllcnJvciA9IC1FRVhJU1Q7CisJaWYgKGZsYWcgJiBPX0VYQ0wpCisJCWdvdG8gZXhpdF9kcHV0OworCisJaWYgKGRfbW91bnRwb2ludChkZW50cnkpKSB7CisJCWVycm9yID0gLUVMT09QOworCQlpZiAoZmxhZyAmIE9fTk9GT0xMT1cpCisJCQlnb3RvIGV4aXRfZHB1dDsKKwkJd2hpbGUgKF9fZm9sbG93X2Rvd24oJm5kLT5tbnQsJmRlbnRyeSkgJiYgZF9tb3VudHBvaW50KGRlbnRyeSkpOworCX0KKwllcnJvciA9IC1FTk9FTlQ7CisJaWYgKCFkZW50cnktPmRfaW5vZGUpCisJCWdvdG8gZXhpdF9kcHV0OworCWlmIChkZW50cnktPmRfaW5vZGUtPmlfb3AgJiYgZGVudHJ5LT5kX2lub2RlLT5pX29wLT5mb2xsb3dfbGluaykKKwkJZ290byBkb19saW5rOworCisJZHB1dChuZC0+ZGVudHJ5KTsKKwluZC0+ZGVudHJ5ID0gZGVudHJ5OworCWVycm9yID0gLUVJU0RJUjsKKwlpZiAoZGVudHJ5LT5kX2lub2RlICYmIFNfSVNESVIoZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKQorCQlnb3RvIGV4aXQ7CitvazoKKwllcnJvciA9IG1heV9vcGVuKG5kLCBhY2NfbW9kZSwgZmxhZyk7CisJaWYgKGVycm9yKQorCQlnb3RvIGV4aXQ7CisJcmV0dXJuIDA7CisKK2V4aXRfZHB1dDoKKwlkcHV0KGRlbnRyeSk7CitleGl0OgorCXBhdGhfcmVsZWFzZShuZCk7CisJcmV0dXJuIGVycm9yOworCitkb19saW5rOgorCWVycm9yID0gLUVMT09QOworCWlmIChmbGFnICYgT19OT0ZPTExPVykKKwkJZ290byBleGl0X2RwdXQ7CisJLyoKKwkgKiBUaGlzIGlzIHN1YnRsZS4gSW5zdGVhZCBvZiBjYWxsaW5nIGRvX2ZvbGxvd19saW5rKCkgd2UgZG8gdGhlCisJICogdGhpbmcgYnkgaGFuZHMuIFRoZSByZWFzb24gaXMgdGhhdCB0aGlzIHdheSB3ZSBoYXZlIHplcm8gbGlua19jb3VudAorCSAqIGFuZCBwYXRoX3dhbGsoKSAoY2FsbGVkIGZyb20gLT5mb2xsb3dfbGluaykgaG9ub3JpbmcgTE9PS1VQX1BBUkVOVC4KKwkgKiBBZnRlciB0aGF0IHdlIGhhdmUgdGhlIHBhcmVudCBhbmQgbGFzdCBjb21wb25lbnQsIGkuZS4KKwkgKiB3ZSBhcmUgaW4gdGhlIHNhbWUgc2l0dWF0aW9uIGFzIGFmdGVyIHRoZSBmaXJzdCBwYXRoX3dhbGsoKS4KKwkgKiBXZWxsLCBhbG1vc3QgLSBpZiB0aGUgbGFzdCBjb21wb25lbnQgaXMgbm9ybWFsIHdlIGdldCBpdHMgY29weQorCSAqIHN0b3JlZCBpbiBuZC0+bGFzdC5uYW1lIGFuZCB3ZSB3aWxsIGhhdmUgdG8gcHV0bmFtZSgpIGl0IHdoZW4gd2UKKwkgKiBhcmUgZG9uZS4gUHJvY2ZzLWxpa2Ugc3ltbGlua3MganVzdCBzZXQgTEFTVF9CSU5ELgorCSAqLworCW5kLT5mbGFncyB8PSBMT09LVVBfUEFSRU5UOworCWVycm9yID0gc2VjdXJpdHlfaW5vZGVfZm9sbG93X2xpbmsoZGVudHJ5LCBuZCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGV4aXRfZHB1dDsKKwllcnJvciA9IF9fZG9fZm9sbG93X2xpbmsoZGVudHJ5LCBuZCk7CisJZHB1dChkZW50cnkpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCW5kLT5mbGFncyAmPSB+TE9PS1VQX1BBUkVOVDsKKwlpZiAobmQtPmxhc3RfdHlwZSA9PSBMQVNUX0JJTkQpIHsKKwkJZGVudHJ5ID0gbmQtPmRlbnRyeTsKKwkJZ290byBvazsKKwl9CisJZXJyb3IgPSAtRUlTRElSOworCWlmIChuZC0+bGFzdF90eXBlICE9IExBU1RfTk9STSkKKwkJZ290byBleGl0OworCWlmIChuZC0+bGFzdC5uYW1lW25kLT5sYXN0Lmxlbl0pIHsKKwkJcHV0bmFtZShuZC0+bGFzdC5uYW1lKTsKKwkJZ290byBleGl0OworCX0KKwllcnJvciA9IC1FTE9PUDsKKwlpZiAoY291bnQrKz09MzIpIHsKKwkJcHV0bmFtZShuZC0+bGFzdC5uYW1lKTsKKwkJZ290byBleGl0OworCX0KKwlkaXIgPSBuZC0+ZGVudHJ5OworCWRvd24oJmRpci0+ZF9pbm9kZS0+aV9zZW0pOworCWRlbnRyeSA9IF9fbG9va3VwX2hhc2goJm5kLT5sYXN0LCBuZC0+ZGVudHJ5LCBuZCk7CisJcHV0bmFtZShuZC0+bGFzdC5uYW1lKTsKKwlnb3RvIGRvX2xhc3Q7Cit9CisKKy8qKgorICogbG9va3VwX2NyZWF0ZSAtIGxvb2t1cCBhIGRlbnRyeSwgY3JlYXRpbmcgaXQgaWYgaXQgZG9lc24ndCBleGlzdAorICogQG5kOiBuYW1laWRhdGEgaW5mbworICogQGlzX2RpcjogZGlyZWN0b3J5IGZsYWcKKyAqCisgKiBTaW1wbGUgZnVuY3Rpb24gdG8gbG9va3VwIGFuZCByZXR1cm4gYSBkZW50cnkgYW5kIGNyZWF0ZSBpdAorICogaWYgaXQgZG9lc24ndCBleGlzdC4gIElzIFNNUC1zYWZlLgorICovCitzdHJ1Y3QgZGVudHJ5ICpsb29rdXBfY3JlYXRlKHN0cnVjdCBuYW1laWRhdGEgKm5kLCBpbnQgaXNfZGlyKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKworCWRvd24oJm5kLT5kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwlkZW50cnkgPSBFUlJfUFRSKC1FRVhJU1QpOworCWlmIChuZC0+bGFzdF90eXBlICE9IExBU1RfTk9STSkKKwkJZ290byBmYWlsOworCW5kLT5mbGFncyAmPSB+TE9PS1VQX1BBUkVOVDsKKwlkZW50cnkgPSBsb29rdXBfaGFzaCgmbmQtPmxhc3QsIG5kLT5kZW50cnkpOworCWlmIChJU19FUlIoZGVudHJ5KSkKKwkJZ290byBmYWlsOworCWlmICghaXNfZGlyICYmIG5kLT5sYXN0Lm5hbWVbbmQtPmxhc3QubGVuXSAmJiAhZGVudHJ5LT5kX2lub2RlKQorCQlnb3RvIGVub2VudDsKKwlyZXR1cm4gZGVudHJ5OworZW5vZW50OgorCWRwdXQoZGVudHJ5KTsKKwlkZW50cnkgPSBFUlJfUFRSKC1FTk9FTlQpOworZmFpbDoKKwlyZXR1cm4gZGVudHJ5OworfQorCitpbnQgdmZzX21rbm9kKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLCBkZXZfdCBkZXYpCit7CisJaW50IGVycm9yID0gbWF5X2NyZWF0ZShkaXIsIGRlbnRyeSwgTlVMTCk7CisKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWlmICgoU19JU0NIUihtb2RlKSB8fCBTX0lTQkxLKG1vZGUpKSAmJiAhY2FwYWJsZShDQVBfTUtOT0QpKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKCFkaXItPmlfb3AgfHwgIWRpci0+aV9vcC0+bWtub2QpCisJCXJldHVybiAtRVBFUk07CisKKwllcnJvciA9IHNlY3VyaXR5X2lub2RlX21rbm9kKGRpciwgZGVudHJ5LCBtb2RlLCBkZXYpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJRFFVT1RfSU5JVChkaXIpOworCWVycm9yID0gZGlyLT5pX29wLT5ta25vZChkaXIsIGRlbnRyeSwgbW9kZSwgZGV2KTsKKwlpZiAoIWVycm9yKSB7CisJCWlub2RlX2Rpcl9ub3RpZnkoZGlyLCBETl9DUkVBVEUpOworCQlzZWN1cml0eV9pbm9kZV9wb3N0X21rbm9kKGRpciwgZGVudHJ5LCBtb2RlLCBkZXYpOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfbWtub2QoY29uc3QgY2hhciBfX3VzZXIgKiBmaWxlbmFtZSwgaW50IG1vZGUsIHVuc2lnbmVkIGRldikKK3sKKwlpbnQgZXJyb3IgPSAwOworCWNoYXIgKiB0bXA7CisJc3RydWN0IGRlbnRyeSAqIGRlbnRyeTsKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCisJaWYgKFNfSVNESVIobW9kZSkpCisJCXJldHVybiAtRVBFUk07CisJdG1wID0gZ2V0bmFtZShmaWxlbmFtZSk7CisJaWYgKElTX0VSUih0bXApKQorCQlyZXR1cm4gUFRSX0VSUih0bXApOworCisJZXJyb3IgPSBwYXRoX2xvb2t1cCh0bXAsIExPT0tVUF9QQVJFTlQsICZuZCk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKwlkZW50cnkgPSBsb29rdXBfY3JlYXRlKCZuZCwgMCk7CisJZXJyb3IgPSBQVFJfRVJSKGRlbnRyeSk7CisKKwlpZiAoIUlTX1BPU0lYQUNMKG5kLmRlbnRyeS0+ZF9pbm9kZSkpCisJCW1vZGUgJj0gfmN1cnJlbnQtPmZzLT51bWFzazsKKwlpZiAoIUlTX0VSUihkZW50cnkpKSB7CisJCXN3aXRjaCAobW9kZSAmIFNfSUZNVCkgeworCQljYXNlIDA6IGNhc2UgU19JRlJFRzoKKwkJCWVycm9yID0gdmZzX2NyZWF0ZShuZC5kZW50cnktPmRfaW5vZGUsZGVudHJ5LG1vZGUsJm5kKTsKKwkJCWJyZWFrOworCQljYXNlIFNfSUZDSFI6IGNhc2UgU19JRkJMSzoKKwkJCWVycm9yID0gdmZzX21rbm9kKG5kLmRlbnRyeS0+ZF9pbm9kZSxkZW50cnksbW9kZSwKKwkJCQkJbmV3X2RlY29kZV9kZXYoZGV2KSk7CisJCQlicmVhazsKKwkJY2FzZSBTX0lGSUZPOiBjYXNlIFNfSUZTT0NLOgorCQkJZXJyb3IgPSB2ZnNfbWtub2QobmQuZGVudHJ5LT5kX2lub2RlLGRlbnRyeSxtb2RlLDApOworCQkJYnJlYWs7CisJCWNhc2UgU19JRkRJUjoKKwkJCWVycm9yID0gLUVQRVJNOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnJvciA9IC1FSU5WQUw7CisJCX0KKwkJZHB1dChkZW50cnkpOworCX0KKwl1cCgmbmQuZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJcGF0aF9yZWxlYXNlKCZuZCk7CitvdXQ6CisJcHV0bmFtZSh0bXApOworCisJcmV0dXJuIGVycm9yOworfQorCitpbnQgdmZzX21rZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlKQoreworCWludCBlcnJvciA9IG1heV9jcmVhdGUoZGlyLCBkZW50cnksIE5VTEwpOworCisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlpZiAoIWRpci0+aV9vcCB8fCAhZGlyLT5pX29wLT5ta2RpcikKKwkJcmV0dXJuIC1FUEVSTTsKKworCW1vZGUgJj0gKFNfSVJXWFVHT3xTX0lTVlRYKTsKKwllcnJvciA9IHNlY3VyaXR5X2lub2RlX21rZGlyKGRpciwgZGVudHJ5LCBtb2RlKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCURRVU9UX0lOSVQoZGlyKTsKKwllcnJvciA9IGRpci0+aV9vcC0+bWtkaXIoZGlyLCBkZW50cnksIG1vZGUpOworCWlmICghZXJyb3IpIHsKKwkJaW5vZGVfZGlyX25vdGlmeShkaXIsIEROX0NSRUFURSk7CisJCXNlY3VyaXR5X2lub2RlX3Bvc3RfbWtkaXIoZGlyLGRlbnRyeSwgbW9kZSk7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworYXNtbGlua2FnZSBsb25nIHN5c19ta2Rpcihjb25zdCBjaGFyIF9fdXNlciAqIHBhdGhuYW1lLCBpbnQgbW9kZSkKK3sKKwlpbnQgZXJyb3IgPSAwOworCWNoYXIgKiB0bXA7CisKKwl0bXAgPSBnZXRuYW1lKHBhdGhuYW1lKTsKKwllcnJvciA9IFBUUl9FUlIodG1wKTsKKwlpZiAoIUlTX0VSUih0bXApKSB7CisJCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwkJc3RydWN0IG5hbWVpZGF0YSBuZDsKKworCQllcnJvciA9IHBhdGhfbG9va3VwKHRtcCwgTE9PS1VQX1BBUkVOVCwgJm5kKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXQ7CisJCWRlbnRyeSA9IGxvb2t1cF9jcmVhdGUoJm5kLCAxKTsKKwkJZXJyb3IgPSBQVFJfRVJSKGRlbnRyeSk7CisJCWlmICghSVNfRVJSKGRlbnRyeSkpIHsKKwkJCWlmICghSVNfUE9TSVhBQ0wobmQuZGVudHJ5LT5kX2lub2RlKSkKKwkJCQltb2RlICY9IH5jdXJyZW50LT5mcy0+dW1hc2s7CisJCQllcnJvciA9IHZmc19ta2RpcihuZC5kZW50cnktPmRfaW5vZGUsIGRlbnRyeSwgbW9kZSk7CisJCQlkcHV0KGRlbnRyeSk7CisJCX0KKwkJdXAoJm5kLmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCQlwYXRoX3JlbGVhc2UoJm5kKTsKK291dDoKKwkJcHV0bmFtZSh0bXApOworCX0KKworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIFdlIHRyeSB0byBkcm9wIHRoZSBkZW50cnkgZWFybHk6IHdlIHNob3VsZCBoYXZlCisgKiBhIHVzYWdlIGNvdW50IG9mIDIgaWYgd2UncmUgdGhlIG9ubHkgdXNlciBvZiB0aGlzCisgKiBkZW50cnksIGFuZCBpZiB0aGF0IGlzIHRydWUgKHBvc3NpYmx5IGFmdGVyIHBydW5pbmcKKyAqIHRoZSBkY2FjaGUpLCB0aGVuIHdlIGRyb3AgdGhlIGRlbnRyeSBub3cuCisgKgorICogQSBsb3ctbGV2ZWwgZmlsZXN5c3RlbSBjYW4sIGlmIGl0IGNob3NlcywgbGVnYWxseQorICogZG8gYQorICoKKyAqCWlmICghZF91bmhhc2hlZChkZW50cnkpKQorICoJCXJldHVybiAtRUJVU1k7CisgKgorICogaWYgaXQgY2Fubm90IGhhbmRsZSB0aGUgY2FzZSBvZiByZW1vdmluZyBhIGRpcmVjdG9yeQorICogdGhhdCBpcyBzdGlsbCBpbiB1c2UgYnkgc29tZXRoaW5nIGVsc2UuLgorICovCit2b2lkIGRlbnRyeV91bmhhc2goc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWRnZXQoZGVudHJ5KTsKKwlpZiAoYXRvbWljX3JlYWQoJmRlbnRyeS0+ZF9jb3VudCkpCisJCXNocmlua19kY2FjaGVfcGFyZW50KGRlbnRyeSk7CisJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7CisJaWYgKGF0b21pY19yZWFkKCZkZW50cnktPmRfY291bnQpID09IDIpCisJCV9fZF9kcm9wKGRlbnRyeSk7CisJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworfQorCitpbnQgdmZzX3JtZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJaW50IGVycm9yID0gbWF5X2RlbGV0ZShkaXIsIGRlbnRyeSwgMSk7CisKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWlmICghZGlyLT5pX29wIHx8ICFkaXItPmlfb3AtPnJtZGlyKQorCQlyZXR1cm4gLUVQRVJNOworCisJRFFVT1RfSU5JVChkaXIpOworCisJZG93bigmZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJZGVudHJ5X3VuaGFzaChkZW50cnkpOworCWlmIChkX21vdW50cG9pbnQoZGVudHJ5KSkKKwkJZXJyb3IgPSAtRUJVU1k7CisJZWxzZSB7CisJCWVycm9yID0gc2VjdXJpdHlfaW5vZGVfcm1kaXIoZGlyLCBkZW50cnkpOworCQlpZiAoIWVycm9yKSB7CisJCQllcnJvciA9IGRpci0+aV9vcC0+cm1kaXIoZGlyLCBkZW50cnkpOworCQkJaWYgKCFlcnJvcikKKwkJCQlkZW50cnktPmRfaW5vZGUtPmlfZmxhZ3MgfD0gU19ERUFEOworCQl9CisJfQorCXVwKCZkZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwlpZiAoIWVycm9yKSB7CisJCWlub2RlX2Rpcl9ub3RpZnkoZGlyLCBETl9ERUxFVEUpOworCQlkX2RlbGV0ZShkZW50cnkpOworCX0KKwlkcHV0KGRlbnRyeSk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfcm1kaXIoY29uc3QgY2hhciBfX3VzZXIgKiBwYXRobmFtZSkKK3sKKwlpbnQgZXJyb3IgPSAwOworCWNoYXIgKiBuYW1lOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCisJbmFtZSA9IGdldG5hbWUocGF0aG5hbWUpOworCWlmKElTX0VSUihuYW1lKSkKKwkJcmV0dXJuIFBUUl9FUlIobmFtZSk7CisKKwllcnJvciA9IHBhdGhfbG9va3VwKG5hbWUsIExPT0tVUF9QQVJFTlQsICZuZCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGV4aXQ7CisKKwlzd2l0Y2gobmQubGFzdF90eXBlKSB7CisJCWNhc2UgTEFTVF9ET1RET1Q6CisJCQllcnJvciA9IC1FTk9URU1QVFk7CisJCQlnb3RvIGV4aXQxOworCQljYXNlIExBU1RfRE9UOgorCQkJZXJyb3IgPSAtRUlOVkFMOworCQkJZ290byBleGl0MTsKKwkJY2FzZSBMQVNUX1JPT1Q6CisJCQllcnJvciA9IC1FQlVTWTsKKwkJCWdvdG8gZXhpdDE7CisJfQorCWRvd24oJm5kLmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCWRlbnRyeSA9IGxvb2t1cF9oYXNoKCZuZC5sYXN0LCBuZC5kZW50cnkpOworCWVycm9yID0gUFRSX0VSUihkZW50cnkpOworCWlmICghSVNfRVJSKGRlbnRyeSkpIHsKKwkJZXJyb3IgPSB2ZnNfcm1kaXIobmQuZGVudHJ5LT5kX2lub2RlLCBkZW50cnkpOworCQlkcHV0KGRlbnRyeSk7CisJfQorCXVwKCZuZC5kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKK2V4aXQxOgorCXBhdGhfcmVsZWFzZSgmbmQpOworZXhpdDoKKwlwdXRuYW1lKG5hbWUpOworCXJldHVybiBlcnJvcjsKK30KKworaW50IHZmc191bmxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpbnQgZXJyb3IgPSBtYXlfZGVsZXRlKGRpciwgZGVudHJ5LCAwKTsKKworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJaWYgKCFkaXItPmlfb3AgfHwgIWRpci0+aV9vcC0+dW5saW5rKQorCQlyZXR1cm4gLUVQRVJNOworCisJRFFVT1RfSU5JVChkaXIpOworCisJZG93bigmZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJaWYgKGRfbW91bnRwb2ludChkZW50cnkpKQorCQllcnJvciA9IC1FQlVTWTsKKwllbHNlIHsKKwkJZXJyb3IgPSBzZWN1cml0eV9pbm9kZV91bmxpbmsoZGlyLCBkZW50cnkpOworCQlpZiAoIWVycm9yKQorCQkJZXJyb3IgPSBkaXItPmlfb3AtPnVubGluayhkaXIsIGRlbnRyeSk7CisJfQorCXVwKCZkZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKworCS8qIFdlIGRvbid0IGRfZGVsZXRlKCkgTkZTIHNpbGx5cmVuYW1lZCBmaWxlcy0tdGhleSBzdGlsbCBleGlzdC4gKi8KKwlpZiAoIWVycm9yICYmICEoZGVudHJ5LT5kX2ZsYWdzICYgRENBQ0hFX05GU0ZTX1JFTkFNRUQpKSB7CisJCWRfZGVsZXRlKGRlbnRyeSk7CisJCWlub2RlX2Rpcl9ub3RpZnkoZGlyLCBETl9ERUxFVEUpOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBNYWtlIHN1cmUgdGhhdCB0aGUgYWN0dWFsIHRydW5jYXRpb24gb2YgdGhlIGZpbGUgd2lsbCBvY2N1ciBvdXRzaWRlIGl0cworICogZGlyZWN0b3J5J3MgaV9zZW0uICBUcnVuY2F0ZSBjYW4gdGFrZSBhIGxvbmcgdGltZSBpZiB0aGVyZSBpcyBhIGxvdCBvZgorICogd3JpdGVvdXQgaGFwcGVuaW5nLCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBwcmV2ZW50IGFjY2VzcyB0byB0aGUgZGlyZWN0b3J5CisgKiB3aGlsZSB3YWl0aW5nIG9uIHRoZSBJL08uCisgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfdW5saW5rKGNvbnN0IGNoYXIgX191c2VyICogcGF0aG5hbWUpCit7CisJaW50IGVycm9yID0gMDsKKwljaGFyICogbmFtZTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKKworCW5hbWUgPSBnZXRuYW1lKHBhdGhuYW1lKTsKKwlpZihJU19FUlIobmFtZSkpCisJCXJldHVybiBQVFJfRVJSKG5hbWUpOworCisJZXJyb3IgPSBwYXRoX2xvb2t1cChuYW1lLCBMT09LVVBfUEFSRU5ULCAmbmQpOworCWlmIChlcnJvcikKKwkJZ290byBleGl0OworCWVycm9yID0gLUVJU0RJUjsKKwlpZiAobmQubGFzdF90eXBlICE9IExBU1RfTk9STSkKKwkJZ290byBleGl0MTsKKwlkb3duKCZuZC5kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwlkZW50cnkgPSBsb29rdXBfaGFzaCgmbmQubGFzdCwgbmQuZGVudHJ5KTsKKwllcnJvciA9IFBUUl9FUlIoZGVudHJ5KTsKKwlpZiAoIUlTX0VSUihkZW50cnkpKSB7CisJCS8qIFdoeSBub3QgYmVmb3JlPyBCZWNhdXNlIHdlIHdhbnQgY29ycmVjdCBlcnJvciB2YWx1ZSAqLworCQlpZiAobmQubGFzdC5uYW1lW25kLmxhc3QubGVuXSkKKwkJCWdvdG8gc2xhc2hlczsKKwkJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJCWlmIChpbm9kZSkKKwkJCWF0b21pY19pbmMoJmlub2RlLT5pX2NvdW50KTsKKwkJZXJyb3IgPSB2ZnNfdW5saW5rKG5kLmRlbnRyeS0+ZF9pbm9kZSwgZGVudHJ5KTsKKwlleGl0MjoKKwkJZHB1dChkZW50cnkpOworCX0KKwl1cCgmbmQuZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJaWYgKGlub2RlKQorCQlpcHV0KGlub2RlKTsJLyogdHJ1bmNhdGUgdGhlIGlub2RlIGhlcmUgKi8KK2V4aXQxOgorCXBhdGhfcmVsZWFzZSgmbmQpOworZXhpdDoKKwlwdXRuYW1lKG5hbWUpOworCXJldHVybiBlcnJvcjsKKworc2xhc2hlczoKKwllcnJvciA9ICFkZW50cnktPmRfaW5vZGUgPyAtRU5PRU5UIDoKKwkJU19JU0RJUihkZW50cnktPmRfaW5vZGUtPmlfbW9kZSkgPyAtRUlTRElSIDogLUVOT1RESVI7CisJZ290byBleGl0MjsKK30KKworaW50IHZmc19zeW1saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm9sZG5hbWUsIGludCBtb2RlKQoreworCWludCBlcnJvciA9IG1heV9jcmVhdGUoZGlyLCBkZW50cnksIE5VTEwpOworCisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlpZiAoIWRpci0+aV9vcCB8fCAhZGlyLT5pX29wLT5zeW1saW5rKQorCQlyZXR1cm4gLUVQRVJNOworCisJZXJyb3IgPSBzZWN1cml0eV9pbm9kZV9zeW1saW5rKGRpciwgZGVudHJ5LCBvbGRuYW1lKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCURRVU9UX0lOSVQoZGlyKTsKKwllcnJvciA9IGRpci0+aV9vcC0+c3ltbGluayhkaXIsIGRlbnRyeSwgb2xkbmFtZSk7CisJaWYgKCFlcnJvcikgeworCQlpbm9kZV9kaXJfbm90aWZ5KGRpciwgRE5fQ1JFQVRFKTsKKwkJc2VjdXJpdHlfaW5vZGVfcG9zdF9zeW1saW5rKGRpciwgZGVudHJ5LCBvbGRuYW1lKTsKKwl9CisJcmV0dXJuIGVycm9yOworfQorCithc21saW5rYWdlIGxvbmcgc3lzX3N5bWxpbmsoY29uc3QgY2hhciBfX3VzZXIgKiBvbGRuYW1lLCBjb25zdCBjaGFyIF9fdXNlciAqIG5ld25hbWUpCit7CisJaW50IGVycm9yID0gMDsKKwljaGFyICogZnJvbTsKKwljaGFyICogdG87CisKKwlmcm9tID0gZ2V0bmFtZShvbGRuYW1lKTsKKwlpZihJU19FUlIoZnJvbSkpCisJCXJldHVybiBQVFJfRVJSKGZyb20pOworCXRvID0gZ2V0bmFtZShuZXduYW1lKTsKKwllcnJvciA9IFBUUl9FUlIodG8pOworCWlmICghSVNfRVJSKHRvKSkgeworCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJCXN0cnVjdCBuYW1laWRhdGEgbmQ7CisKKwkJZXJyb3IgPSBwYXRoX2xvb2t1cCh0bywgTE9PS1VQX1BBUkVOVCwgJm5kKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXQ7CisJCWRlbnRyeSA9IGxvb2t1cF9jcmVhdGUoJm5kLCAwKTsKKwkJZXJyb3IgPSBQVFJfRVJSKGRlbnRyeSk7CisJCWlmICghSVNfRVJSKGRlbnRyeSkpIHsKKwkJCWVycm9yID0gdmZzX3N5bWxpbmsobmQuZGVudHJ5LT5kX2lub2RlLCBkZW50cnksIGZyb20sIFNfSUFMTFVHTyk7CisJCQlkcHV0KGRlbnRyeSk7CisJCX0KKwkJdXAoJm5kLmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCQlwYXRoX3JlbGVhc2UoJm5kKTsKK291dDoKKwkJcHV0bmFtZSh0byk7CisJfQorCXB1dG5hbWUoZnJvbSk7CisJcmV0dXJuIGVycm9yOworfQorCitpbnQgdmZzX2xpbmsoc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwgc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKm5ld19kZW50cnkpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG9sZF9kZW50cnktPmRfaW5vZGU7CisJaW50IGVycm9yOworCisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwllcnJvciA9IG1heV9jcmVhdGUoZGlyLCBuZXdfZGVudHJ5LCBOVUxMKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWlmIChkaXItPmlfc2IgIT0gaW5vZGUtPmlfc2IpCisJCXJldHVybiAtRVhERVY7CisKKwkvKgorCSAqIEEgbGluayB0byBhbiBhcHBlbmQtb25seSBvciBpbW11dGFibGUgZmlsZSBjYW5ub3QgYmUgY3JlYXRlZC4KKwkgKi8KKwlpZiAoSVNfQVBQRU5EKGlub2RlKSB8fCBJU19JTU1VVEFCTEUoaW5vZGUpKQorCQlyZXR1cm4gLUVQRVJNOworCWlmICghZGlyLT5pX29wIHx8ICFkaXItPmlfb3AtPmxpbmspCisJCXJldHVybiAtRVBFUk07CisJaWYgKFNfSVNESVIob2xkX2RlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWVycm9yID0gc2VjdXJpdHlfaW5vZGVfbGluayhvbGRfZGVudHJ5LCBkaXIsIG5ld19kZW50cnkpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJZG93bigmb2xkX2RlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCURRVU9UX0lOSVQoZGlyKTsKKwllcnJvciA9IGRpci0+aV9vcC0+bGluayhvbGRfZGVudHJ5LCBkaXIsIG5ld19kZW50cnkpOworCXVwKCZvbGRfZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJaWYgKCFlcnJvcikgeworCQlpbm9kZV9kaXJfbm90aWZ5KGRpciwgRE5fQ1JFQVRFKTsKKwkJc2VjdXJpdHlfaW5vZGVfcG9zdF9saW5rKG9sZF9kZW50cnksIGRpciwgbmV3X2RlbnRyeSk7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIEhhcmRsaW5rcyBhcmUgb2Z0ZW4gdXNlZCBpbiBkZWxpY2F0ZSBzaXR1YXRpb25zLiAgV2UgYXZvaWQKKyAqIHNlY3VyaXR5LXJlbGF0ZWQgc3VycHJpc2VzIGJ5IG5vdCBmb2xsb3dpbmcgc3ltbGlua3Mgb24gdGhlCisgKiBuZXduYW1lLiAgLS1LQUIKKyAqCisgKiBXZSBkb24ndCBmb2xsb3cgdGhlbSBvbiB0aGUgb2xkbmFtZSBlaXRoZXIgdG8gYmUgY29tcGF0aWJsZQorICogd2l0aCBsaW51eCAyLjAsIGFuZCB0byBhdm9pZCBoYXJkLWxpbmtpbmcgdG8gZGlyZWN0b3JpZXMKKyAqIGFuZCBvdGhlciBzcGVjaWFsIGZpbGVzLiAgLS1BRE0KKyAqLworYXNtbGlua2FnZSBsb25nIHN5c19saW5rKGNvbnN0IGNoYXIgX191c2VyICogb2xkbmFtZSwgY29uc3QgY2hhciBfX3VzZXIgKiBuZXduYW1lKQoreworCXN0cnVjdCBkZW50cnkgKm5ld19kZW50cnk7CisJc3RydWN0IG5hbWVpZGF0YSBuZCwgb2xkX25kOworCWludCBlcnJvcjsKKwljaGFyICogdG87CisKKwl0byA9IGdldG5hbWUobmV3bmFtZSk7CisJaWYgKElTX0VSUih0bykpCisJCXJldHVybiBQVFJfRVJSKHRvKTsKKworCWVycm9yID0gX191c2VyX3dhbGsob2xkbmFtZSwgMCwgJm9sZF9uZCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGV4aXQ7CisJZXJyb3IgPSBwYXRoX2xvb2t1cCh0bywgTE9PS1VQX1BBUkVOVCwgJm5kKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCWVycm9yID0gLUVYREVWOworCWlmIChvbGRfbmQubW50ICE9IG5kLm1udCkKKwkJZ290byBvdXRfcmVsZWFzZTsKKwluZXdfZGVudHJ5ID0gbG9va3VwX2NyZWF0ZSgmbmQsIDApOworCWVycm9yID0gUFRSX0VSUihuZXdfZGVudHJ5KTsKKwlpZiAoIUlTX0VSUihuZXdfZGVudHJ5KSkgeworCQllcnJvciA9IHZmc19saW5rKG9sZF9uZC5kZW50cnksIG5kLmRlbnRyeS0+ZF9pbm9kZSwgbmV3X2RlbnRyeSk7CisJCWRwdXQobmV3X2RlbnRyeSk7CisJfQorCXVwKCZuZC5kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKK291dF9yZWxlYXNlOgorCXBhdGhfcmVsZWFzZSgmbmQpOworb3V0OgorCXBhdGhfcmVsZWFzZSgmb2xkX25kKTsKK2V4aXQ6CisJcHV0bmFtZSh0byk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBUaGUgd29yc3Qgb2YgYWxsIG5hbWVzcGFjZSBvcGVyYXRpb25zIC0gcmVuYW1pbmcgZGlyZWN0b3J5LiAiUGVydmVydGVkIgorICogZG9lc24ndCBldmVuIHN0YXJ0IHRvIGRlc2NyaWJlIGl0LiBTb21lYm9keSBpbiBVQ0IgaGFkIGEgaGVjayBvZiBhIHRyaXAuLi4KKyAqIFByb2JsZW1zOgorICoJYSkgd2UgY2FuIGdldCBpbnRvIGxvb3AgY3JlYXRpb24uIENoZWNrIGlzIGRvbmUgaW4gaXNfc3ViZGlyKCkuCisgKgliKSByYWNlIHBvdGVudGlhbCAtIHR3byBpbm5vY2VudCByZW5hbWVzIGNhbiBjcmVhdGUgYSBsb29wIHRvZ2V0aGVyLgorICoJICAgVGhhdCdzIHdoZXJlIDQuNCBzY3Jld3MgdXAuIEN1cnJlbnQgZml4OiBzZXJpYWxpemF0aW9uIG9uCisgKgkgICBzYi0+c192ZnNfcmVuYW1lX3NlbS4gV2UgbWlnaHQgYmUgbW9yZSBhY2N1cmF0ZSwgYnV0IHRoYXQncyBhbm90aGVyCisgKgkgICBzdG9yeS4KKyAqCWMpIHdlIGhhdmUgdG8gbG9jayBfdGhyZWVfIG9iamVjdHMgLSBwYXJlbnRzIGFuZCB2aWN0aW0gKGlmIGl0IGV4aXN0cykuCisgKgkgICBBbmQgdGhhdCAtIGFmdGVyIHdlIGdvdCAtPmlfc2VtIG9uIHBhcmVudHMgKHVudGlsIHRoZW4gd2UgZG9uJ3Qga25vdworICoJICAgd2hldGhlciB0aGUgdGFyZ2V0IGV4aXN0cykuICBTb2x1dGlvbjogdHJ5IHRvIGJlIHNtYXJ0IHdpdGggbG9ja2luZworICoJICAgb3JkZXIgZm9yIGlub2Rlcy4gIFdlIHJlbHkgb24gdGhlIGZhY3QgdGhhdCB0cmVlIHRvcG9sb2d5IG1heSBjaGFuZ2UKKyAqCSAgIG9ubHkgdW5kZXIgLT5zX3Zmc19yZW5hbWVfc2VtIF9hbmRfIHRoYXQgcGFyZW50IG9mIHRoZSBvYmplY3Qgd2UKKyAqCSAgIG1vdmUgd2lsbCBiZSBsb2NrZWQuICBUaHVzIHdlIGNhbiByYW5rIGRpcmVjdG9yaWVzIGJ5IHRoZSB0cmVlCisgKgkgICAoYW5jZXN0b3JzIGZpcnN0KSBhbmQgcmFuayBhbGwgbm9uLWRpcmVjdG9yaWVzIGFmdGVyIHRoZW0uCisgKgkgICBUaGF0IHdvcmtzIHNpbmNlIGV2ZXJ5Ym9keSBleGNlcHQgcmVuYW1lIGRvZXMgImxvY2sgcGFyZW50LCBsb29rdXAsCisgKgkgICBsb2NrIGNoaWxkIiBhbmQgcmVuYW1lIGlzIHVuZGVyIC0+c192ZnNfcmVuYW1lX3NlbS4KKyAqCSAgIEhPV0VWRVIsIGl0IHJlbGllcyBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IGFueSBvYmplY3Qgd2l0aCAtPmxvb2t1cCgpCisgKgkgICBoYXMgbm8gbW9yZSB0aGFuIDEgZGVudHJ5LiAgSWYgImh5YnJpZCIgb2JqZWN0cyB3aWxsIGV2ZXIgYXBwZWFyLAorICoJICAgd2UnZCBiZXR0ZXIgbWFrZSBzdXJlIHRoYXQgdGhlcmUncyBubyBsaW5rKDIpIGZvciB0aGVtLgorICoJZCkgc29tZSBmaWxlc3lzdGVtcyBkb24ndCBzdXBwb3J0IG9wZW5lZC1idXQtdW5saW5rZWQgZGlyZWN0b3JpZXMsCisgKgkgICBlaXRoZXIgYmVjYXVzZSBvZiBsYXlvdXQgb3IgYmVjYXVzZSB0aGV5IGFyZSBub3QgcmVhZHkgdG8gZGVhbCB3aXRoCisgKgkgICBhbGwgY2FzZXMgY29ycmVjdGx5LiBUaGUgbGF0dGVyIHdpbGwgYmUgZml4ZWQgKHRha2luZyB0aGlzIHNvcnQgb2YKKyAqCSAgIHN0dWZmIGludG8gVkZTKSwgYnV0IHRoZSBmb3JtZXIgaXMgbm90IGdvaW5nIGF3YXkuIFNvbHV0aW9uOiB0aGUgc2FtZQorICoJICAgdHJpY2sgYXMgaW4gcm1kaXIoKS4KKyAqCWUpIGNvbnZlcnNpb24gZnJvbSBmaGFuZGxlIHRvIGRlbnRyeSBtYXkgY29tZSBpbiB0aGUgd3JvbmcgbW9tZW50IC0gd2hlbgorICoJICAgd2UgYXJlIHJlbW92aW5nIHRoZSB0YXJnZXQuIFNvbHV0aW9uOiB3ZSB3aWxsIGhhdmUgdG8gZ3JhYiAtPmlfc2VtCisgKgkgICBpbiB0aGUgZmhhbmRsZV90b19kZW50cnkgY29kZS4gW0ZJWE1FIC0gY3VycmVudCBuZnNmaC5jIHJlbGllcyBvbgorICoJICAgLT5pX3NlbSBvbiBwYXJlbnRzLCB3aGljaCB3b3JrcyBidXQgbGVhZHMgdG8gc29tZSB0cnVlbHkgZXhjZXNzaXZlCisgKgkgICBsb2NraW5nXS4KKyAqLworaW50IHZmc19yZW5hbWVfZGlyKHN0cnVjdCBpbm9kZSAqb2xkX2Rpciwgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwKKwkgICAgICAgc3RydWN0IGlub2RlICpuZXdfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQoreworCWludCBlcnJvciA9IDA7CisJc3RydWN0IGlub2RlICp0YXJnZXQ7CisKKwkvKgorCSAqIElmIHdlIGFyZSBnb2luZyB0byBjaGFuZ2UgdGhlIHBhcmVudCAtIGNoZWNrIHdyaXRlIHBlcm1pc3Npb25zLAorCSAqIHdlJ2xsIG5lZWQgdG8gZmxpcCAnLi4nLgorCSAqLworCWlmIChuZXdfZGlyICE9IG9sZF9kaXIpIHsKKwkJZXJyb3IgPSBwZXJtaXNzaW9uKG9sZF9kZW50cnktPmRfaW5vZGUsIE1BWV9XUklURSwgTlVMTCk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwl9CisKKwllcnJvciA9IHNlY3VyaXR5X2lub2RlX3JlbmFtZShvbGRfZGlyLCBvbGRfZGVudHJ5LCBuZXdfZGlyLCBuZXdfZGVudHJ5KTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCXRhcmdldCA9IG5ld19kZW50cnktPmRfaW5vZGU7CisJaWYgKHRhcmdldCkgeworCQlkb3duKCZ0YXJnZXQtPmlfc2VtKTsKKwkJZGVudHJ5X3VuaGFzaChuZXdfZGVudHJ5KTsKKwl9CisJaWYgKGRfbW91bnRwb2ludChvbGRfZGVudHJ5KXx8ZF9tb3VudHBvaW50KG5ld19kZW50cnkpKQorCQllcnJvciA9IC1FQlVTWTsKKwllbHNlIAorCQllcnJvciA9IG9sZF9kaXItPmlfb3AtPnJlbmFtZShvbGRfZGlyLCBvbGRfZGVudHJ5LCBuZXdfZGlyLCBuZXdfZGVudHJ5KTsKKwlpZiAodGFyZ2V0KSB7CisJCWlmICghZXJyb3IpCisJCQl0YXJnZXQtPmlfZmxhZ3MgfD0gU19ERUFEOworCQl1cCgmdGFyZ2V0LT5pX3NlbSk7CisJCWlmIChkX3VuaGFzaGVkKG5ld19kZW50cnkpKQorCQkJZF9yZWhhc2gobmV3X2RlbnRyeSk7CisJCWRwdXQobmV3X2RlbnRyeSk7CisJfQorCWlmICghZXJyb3IpIHsKKwkJZF9tb3ZlKG9sZF9kZW50cnksbmV3X2RlbnRyeSk7CisJCXNlY3VyaXR5X2lub2RlX3Bvc3RfcmVuYW1lKG9sZF9kaXIsIG9sZF9kZW50cnksCisJCQkJCSAgIG5ld19kaXIsIG5ld19kZW50cnkpOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKK2ludCB2ZnNfcmVuYW1lX290aGVyKHN0cnVjdCBpbm9kZSAqb2xkX2Rpciwgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwKKwkgICAgICAgc3RydWN0IGlub2RlICpuZXdfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqdGFyZ2V0OworCWludCBlcnJvcjsKKworCWVycm9yID0gc2VjdXJpdHlfaW5vZGVfcmVuYW1lKG9sZF9kaXIsIG9sZF9kZW50cnksIG5ld19kaXIsIG5ld19kZW50cnkpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJZGdldChuZXdfZGVudHJ5KTsKKwl0YXJnZXQgPSBuZXdfZGVudHJ5LT5kX2lub2RlOworCWlmICh0YXJnZXQpCisJCWRvd24oJnRhcmdldC0+aV9zZW0pOworCWlmIChkX21vdW50cG9pbnQob2xkX2RlbnRyeSl8fGRfbW91bnRwb2ludChuZXdfZGVudHJ5KSkKKwkJZXJyb3IgPSAtRUJVU1k7CisJZWxzZQorCQllcnJvciA9IG9sZF9kaXItPmlfb3AtPnJlbmFtZShvbGRfZGlyLCBvbGRfZGVudHJ5LCBuZXdfZGlyLCBuZXdfZGVudHJ5KTsKKwlpZiAoIWVycm9yKSB7CisJCS8qIFRoZSBmb2xsb3dpbmcgZF9tb3ZlKCkgc2hvdWxkIGJlY29tZSB1bmNvbmRpdGlvbmFsICovCisJCWlmICghKG9sZF9kaXItPmlfc2ItPnNfdHlwZS0+ZnNfZmxhZ3MgJiBGU19PRERfUkVOQU1FKSkKKwkJCWRfbW92ZShvbGRfZGVudHJ5LCBuZXdfZGVudHJ5KTsKKwkJc2VjdXJpdHlfaW5vZGVfcG9zdF9yZW5hbWUob2xkX2Rpciwgb2xkX2RlbnRyeSwgbmV3X2RpciwgbmV3X2RlbnRyeSk7CisJfQorCWlmICh0YXJnZXQpCisJCXVwKCZ0YXJnZXQtPmlfc2VtKTsKKwlkcHV0KG5ld19kZW50cnkpOworCXJldHVybiBlcnJvcjsKK30KKworaW50IHZmc19yZW5hbWUoc3RydWN0IGlub2RlICpvbGRfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAorCSAgICAgICBzdHJ1Y3QgaW5vZGUgKm5ld19kaXIsIHN0cnVjdCBkZW50cnkgKm5ld19kZW50cnkpCit7CisJaW50IGVycm9yOworCWludCBpc19kaXIgPSBTX0lTRElSKG9sZF9kZW50cnktPmRfaW5vZGUtPmlfbW9kZSk7CisKKwlpZiAob2xkX2RlbnRyeS0+ZF9pbm9kZSA9PSBuZXdfZGVudHJ5LT5kX2lub2RlKQorIAkJcmV0dXJuIDA7CisgCisJZXJyb3IgPSBtYXlfZGVsZXRlKG9sZF9kaXIsIG9sZF9kZW50cnksIGlzX2Rpcik7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlpZiAoIW5ld19kZW50cnktPmRfaW5vZGUpCisJCWVycm9yID0gbWF5X2NyZWF0ZShuZXdfZGlyLCBuZXdfZGVudHJ5LCBOVUxMKTsKKwllbHNlCisJCWVycm9yID0gbWF5X2RlbGV0ZShuZXdfZGlyLCBuZXdfZGVudHJ5LCBpc19kaXIpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJaWYgKCFvbGRfZGlyLT5pX29wIHx8ICFvbGRfZGlyLT5pX29wLT5yZW5hbWUpCisJCXJldHVybiAtRVBFUk07CisKKwlEUVVPVF9JTklUKG9sZF9kaXIpOworCURRVU9UX0lOSVQobmV3X2Rpcik7CisKKwlpZiAoaXNfZGlyKQorCQllcnJvciA9IHZmc19yZW5hbWVfZGlyKG9sZF9kaXIsb2xkX2RlbnRyeSxuZXdfZGlyLG5ld19kZW50cnkpOworCWVsc2UKKwkJZXJyb3IgPSB2ZnNfcmVuYW1lX290aGVyKG9sZF9kaXIsb2xkX2RlbnRyeSxuZXdfZGlyLG5ld19kZW50cnkpOworCWlmICghZXJyb3IpIHsKKwkJaWYgKG9sZF9kaXIgPT0gbmV3X2RpcikKKwkJCWlub2RlX2Rpcl9ub3RpZnkob2xkX2RpciwgRE5fUkVOQU1FKTsKKwkJZWxzZSB7CisJCQlpbm9kZV9kaXJfbm90aWZ5KG9sZF9kaXIsIEROX0RFTEVURSk7CisJCQlpbm9kZV9kaXJfbm90aWZ5KG5ld19kaXIsIEROX0NSRUFURSk7CisJCX0KKwl9CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW5saW5lIGludCBkb19yZW5hbWUoY29uc3QgY2hhciAqIG9sZG5hbWUsIGNvbnN0IGNoYXIgKiBuZXduYW1lKQoreworCWludCBlcnJvciA9IDA7CisJc3RydWN0IGRlbnRyeSAqIG9sZF9kaXIsICogbmV3X2RpcjsKKwlzdHJ1Y3QgZGVudHJ5ICogb2xkX2RlbnRyeSwgKm5ld19kZW50cnk7CisJc3RydWN0IGRlbnRyeSAqIHRyYXA7CisJc3RydWN0IG5hbWVpZGF0YSBvbGRuZCwgbmV3bmQ7CisKKwllcnJvciA9IHBhdGhfbG9va3VwKG9sZG5hbWUsIExPT0tVUF9QQVJFTlQsICZvbGRuZCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGV4aXQ7CisKKwllcnJvciA9IHBhdGhfbG9va3VwKG5ld25hbWUsIExPT0tVUF9QQVJFTlQsICZuZXduZCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGV4aXQxOworCisJZXJyb3IgPSAtRVhERVY7CisJaWYgKG9sZG5kLm1udCAhPSBuZXduZC5tbnQpCisJCWdvdG8gZXhpdDI7CisKKwlvbGRfZGlyID0gb2xkbmQuZGVudHJ5OworCWVycm9yID0gLUVCVVNZOworCWlmIChvbGRuZC5sYXN0X3R5cGUgIT0gTEFTVF9OT1JNKQorCQlnb3RvIGV4aXQyOworCisJbmV3X2RpciA9IG5ld25kLmRlbnRyeTsKKwlpZiAobmV3bmQubGFzdF90eXBlICE9IExBU1RfTk9STSkKKwkJZ290byBleGl0MjsKKworCXRyYXAgPSBsb2NrX3JlbmFtZShuZXdfZGlyLCBvbGRfZGlyKTsKKworCW9sZF9kZW50cnkgPSBsb29rdXBfaGFzaCgmb2xkbmQubGFzdCwgb2xkX2Rpcik7CisJZXJyb3IgPSBQVFJfRVJSKG9sZF9kZW50cnkpOworCWlmIChJU19FUlIob2xkX2RlbnRyeSkpCisJCWdvdG8gZXhpdDM7CisJLyogc291cmNlIG11c3QgZXhpc3QgKi8KKwllcnJvciA9IC1FTk9FTlQ7CisJaWYgKCFvbGRfZGVudHJ5LT5kX2lub2RlKQorCQlnb3RvIGV4aXQ0OworCS8qIHVubGVzcyB0aGUgc291cmNlIGlzIGEgZGlyZWN0b3J5IHRyYWlsaW5nIHNsYXNoZXMgZ2l2ZSAtRU5PVERJUiAqLworCWlmICghU19JU0RJUihvbGRfZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKSB7CisJCWVycm9yID0gLUVOT1RESVI7CisJCWlmIChvbGRuZC5sYXN0Lm5hbWVbb2xkbmQubGFzdC5sZW5dKQorCQkJZ290byBleGl0NDsKKwkJaWYgKG5ld25kLmxhc3QubmFtZVtuZXduZC5sYXN0Lmxlbl0pCisJCQlnb3RvIGV4aXQ0OworCX0KKwkvKiBzb3VyY2Ugc2hvdWxkIG5vdCBiZSBhbmNlc3RvciBvZiB0YXJnZXQgKi8KKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKG9sZF9kZW50cnkgPT0gdHJhcCkKKwkJZ290byBleGl0NDsKKwluZXdfZGVudHJ5ID0gbG9va3VwX2hhc2goJm5ld25kLmxhc3QsIG5ld19kaXIpOworCWVycm9yID0gUFRSX0VSUihuZXdfZGVudHJ5KTsKKwlpZiAoSVNfRVJSKG5ld19kZW50cnkpKQorCQlnb3RvIGV4aXQ0OworCS8qIHRhcmdldCBzaG91bGQgbm90IGJlIGFuIGFuY2VzdG9yIG9mIHNvdXJjZSAqLworCWVycm9yID0gLUVOT1RFTVBUWTsKKwlpZiAobmV3X2RlbnRyeSA9PSB0cmFwKQorCQlnb3RvIGV4aXQ1OworCisJZXJyb3IgPSB2ZnNfcmVuYW1lKG9sZF9kaXItPmRfaW5vZGUsIG9sZF9kZW50cnksCisJCQkJICAgbmV3X2Rpci0+ZF9pbm9kZSwgbmV3X2RlbnRyeSk7CitleGl0NToKKwlkcHV0KG5ld19kZW50cnkpOworZXhpdDQ6CisJZHB1dChvbGRfZGVudHJ5KTsKK2V4aXQzOgorCXVubG9ja19yZW5hbWUobmV3X2Rpciwgb2xkX2Rpcik7CitleGl0MjoKKwlwYXRoX3JlbGVhc2UoJm5ld25kKTsKK2V4aXQxOgorCXBhdGhfcmVsZWFzZSgmb2xkbmQpOworZXhpdDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfcmVuYW1lKGNvbnN0IGNoYXIgX191c2VyICogb2xkbmFtZSwgY29uc3QgY2hhciBfX3VzZXIgKiBuZXduYW1lKQoreworCWludCBlcnJvcjsKKwljaGFyICogZnJvbTsKKwljaGFyICogdG87CisKKwlmcm9tID0gZ2V0bmFtZShvbGRuYW1lKTsKKwlpZihJU19FUlIoZnJvbSkpCisJCXJldHVybiBQVFJfRVJSKGZyb20pOworCXRvID0gZ2V0bmFtZShuZXduYW1lKTsKKwllcnJvciA9IFBUUl9FUlIodG8pOworCWlmICghSVNfRVJSKHRvKSkgeworCQllcnJvciA9IGRvX3JlbmFtZShmcm9tLHRvKTsKKwkJcHV0bmFtZSh0byk7CisJfQorCXB1dG5hbWUoZnJvbSk7CisJcmV0dXJuIGVycm9yOworfQorCitpbnQgdmZzX3JlYWRsaW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgaW50IGJ1ZmxlbiwgY29uc3QgY2hhciAqbGluaykKK3sKKwlpbnQgbGVuOworCisJbGVuID0gUFRSX0VSUihsaW5rKTsKKwlpZiAoSVNfRVJSKGxpbmspKQorCQlnb3RvIG91dDsKKworCWxlbiA9IHN0cmxlbihsaW5rKTsKKwlpZiAobGVuID4gKHVuc2lnbmVkKSBidWZsZW4pCisJCWxlbiA9IGJ1ZmxlbjsKKwlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgbGluaywgbGVuKSkKKwkJbGVuID0gLUVGQVVMVDsKK291dDoKKwlyZXR1cm4gbGVuOworfQorCisvKgorICogQSBoZWxwZXIgZm9yIC0+cmVhZGxpbmsoKS4gIFRoaXMgc2hvdWxkIGJlIHVzZWQgKk9OTFkqIGZvciBzeW1saW5rcyB0aGF0CisgKiBoYXZlIC0+Zm9sbG93X2xpbmsoKSB0b3VjaGluZyBuZCBvbmx5IGluIG5kX3NldF9saW5rKCkuICBVc2luZyAob3Igbm90CisgKiB1c2luZykgaXQgZm9yIGFueSBnaXZlbiBpbm9kZSBpcyB1cCB0byBmaWxlc3lzdGVtLgorICovCitpbnQgZ2VuZXJpY19yZWFkbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgX191c2VyICpidWZmZXIsIGludCBidWZsZW4pCit7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlpbnQgcmVzOworCW5kLmRlcHRoID0gMDsKKwlyZXMgPSBkZW50cnktPmRfaW5vZGUtPmlfb3AtPmZvbGxvd19saW5rKGRlbnRyeSwgJm5kKTsKKwlpZiAoIXJlcykgeworCQlyZXMgPSB2ZnNfcmVhZGxpbmsoZGVudHJ5LCBidWZmZXIsIGJ1ZmxlbiwgbmRfZ2V0X2xpbmsoJm5kKSk7CisJCWlmIChkZW50cnktPmRfaW5vZGUtPmlfb3AtPnB1dF9saW5rKQorCQkJZGVudHJ5LT5kX2lub2RlLT5pX29wLT5wdXRfbGluayhkZW50cnksICZuZCk7CisJfQorCXJldHVybiByZXM7Cit9CisKK2ludCB2ZnNfZm9sbG93X2xpbmsoc3RydWN0IG5hbWVpZGF0YSAqbmQsIGNvbnN0IGNoYXIgKmxpbmspCit7CisJcmV0dXJuIF9fdmZzX2ZvbGxvd19saW5rKG5kLCBsaW5rKTsKK30KKworLyogZ2V0IHRoZSBsaW5rIGNvbnRlbnRzIGludG8gcGFnZWNhY2hlICovCitzdGF0aWMgY2hhciAqcGFnZV9nZXRsaW5rKHN0cnVjdCBkZW50cnkgKiBkZW50cnksIHN0cnVjdCBwYWdlICoqcHBhZ2UpCit7CisJc3RydWN0IHBhZ2UgKiBwYWdlOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmc7CisJcGFnZSA9IHJlYWRfY2FjaGVfcGFnZShtYXBwaW5nLCAwLCAoZmlsbGVyX3QgKiltYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2UsCisJCQkJTlVMTCk7CisJaWYgKElTX0VSUihwYWdlKSkKKwkJZ290byBzeW5jX2ZhaWw7CisJd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKKwlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkKKwkJZ290byBhc3luY19mYWlsOworCSpwcGFnZSA9IHBhZ2U7CisJcmV0dXJuIGttYXAocGFnZSk7CisKK2FzeW5jX2ZhaWw6CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCXJldHVybiBFUlJfUFRSKC1FSU8pOworCitzeW5jX2ZhaWw6CisJcmV0dXJuIChjaGFyKilwYWdlOworfQorCitpbnQgcGFnZV9yZWFkbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgX191c2VyICpidWZmZXIsIGludCBidWZsZW4pCit7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOworCWNoYXIgKnMgPSBwYWdlX2dldGxpbmsoZGVudHJ5LCAmcGFnZSk7CisJaW50IHJlcyA9IHZmc19yZWFkbGluayhkZW50cnksYnVmZmVyLGJ1ZmxlbixzKTsKKwlpZiAocGFnZSkgeworCQlrdW5tYXAocGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwl9CisJcmV0dXJuIHJlczsKK30KKworaW50IHBhZ2VfZm9sbG93X2xpbmtfbGlnaHQoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwluZF9zZXRfbGluayhuZCwgcGFnZV9nZXRsaW5rKGRlbnRyeSwgJnBhZ2UpKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBwYWdlX3B1dF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaWYgKCFJU19FUlIobmRfZ2V0X2xpbmsobmQpKSkgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwkJcGFnZSA9IGZpbmRfZ2V0X3BhZ2UoZGVudHJ5LT5kX2lub2RlLT5pX21hcHBpbmcsIDApOworCQlpZiAoIXBhZ2UpCisJCQlCVUcoKTsKKwkJa3VubWFwKHBhZ2UpOworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwl9Cit9CisKK2ludCBwYWdlX3N5bWxpbmsoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqc3ltbmFtZSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBncmFiX2NhY2hlX3BhZ2UobWFwcGluZywgMCk7CisJaW50IGVyciA9IC1FTk9NRU07CisJY2hhciAqa2FkZHI7CisKKwlpZiAoIXBhZ2UpCisJCWdvdG8gZmFpbDsKKwllcnIgPSBtYXBwaW5nLT5hX29wcy0+cHJlcGFyZV93cml0ZShOVUxMLCBwYWdlLCAwLCBsZW4tMSk7CisJaWYgKGVycikKKwkJZ290byBmYWlsX21hcDsKKwlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwltZW1jcHkoa2FkZHIsIHN5bW5hbWUsIGxlbi0xKTsKKwlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJbWFwcGluZy0+YV9vcHMtPmNvbW1pdF93cml0ZShOVUxMLCBwYWdlLCAwLCBsZW4tMSk7CisJLyoKKwkgKiBOb3RpY2UgdGhhdCB3ZSBhcmUgX25vdF8gZ29pbmcgdG8gYmxvY2sgaGVyZSAtIGVuZCBvZiBwYWdlIGlzCisJICogdW5tYXBwZWQsIHNvIHRoaXMgd2lsbCBvbmx5IHRyeSB0byBtYXAgdGhlIHJlc3Qgb2YgcGFnZSwgc2VlCisJICogdGhhdCBpdCBpcyB1bm1hcHBlZCAodHlwaWNhbGx5IGV2ZW4gd2lsbCBub3QgbG9vayBpbnRvIGlub2RlIC0KKwkgKiAtPmlfc2l6ZSB3aWxsIGJlIGVub3VnaCBmb3IgZXZlcnl0aGluZykgYW5kIHplcm8gaXQgb3V0LgorCSAqIE9UT0ggaXQncyBvYnZpb3VzbHkgY29ycmVjdCBhbmQgc2hvdWxkIG1ha2UgdGhlIHBhZ2UgdXAtdG8tZGF0ZS4KKwkgKi8KKwlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkgeworCQllcnIgPSBtYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2UoTlVMTCwgcGFnZSk7CisJCXdhaXRfb25fcGFnZV9sb2NrZWQocGFnZSk7CisJfSBlbHNlIHsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJfQorCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBmYWlsOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCXJldHVybiAwOworZmFpbF9tYXA6CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworZmFpbDoKKwlyZXR1cm4gZXJyOworfQorCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBwYWdlX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkucmVhZGxpbmsJPSBnZW5lcmljX3JlYWRsaW5rLAorCS5mb2xsb3dfbGluawk9IHBhZ2VfZm9sbG93X2xpbmtfbGlnaHQsCisJLnB1dF9saW5rCT0gcGFnZV9wdXRfbGluaywKK307CisKK0VYUE9SVF9TWU1CT0woX191c2VyX3dhbGspOworRVhQT1JUX1NZTUJPTChmb2xsb3dfZG93bik7CitFWFBPUlRfU1lNQk9MKGZvbGxvd191cCk7CitFWFBPUlRfU1lNQk9MKGdldF93cml0ZV9hY2Nlc3MpOyAvKiBiaW5mbXRfYW91dCAqLworRVhQT1JUX1NZTUJPTChnZXRuYW1lKTsKK0VYUE9SVF9TWU1CT0wobG9ja19yZW5hbWUpOworRVhQT1JUX1NZTUJPTChsb29rdXBfaGFzaCk7CitFWFBPUlRfU1lNQk9MKGxvb2t1cF9vbmVfbGVuKTsKK0VYUE9SVF9TWU1CT0wocGFnZV9mb2xsb3dfbGlua19saWdodCk7CitFWFBPUlRfU1lNQk9MKHBhZ2VfcHV0X2xpbmspOworRVhQT1JUX1NZTUJPTChwYWdlX3JlYWRsaW5rKTsKK0VYUE9SVF9TWU1CT0wocGFnZV9zeW1saW5rKTsKK0VYUE9SVF9TWU1CT0wocGFnZV9zeW1saW5rX2lub2RlX29wZXJhdGlvbnMpOworRVhQT1JUX1NZTUJPTChwYXRoX2xvb2t1cCk7CitFWFBPUlRfU1lNQk9MKHBhdGhfcmVsZWFzZSk7CitFWFBPUlRfU1lNQk9MKHBhdGhfd2Fsayk7CitFWFBPUlRfU1lNQk9MKHBlcm1pc3Npb24pOworRVhQT1JUX1NZTUJPTCh1bmxvY2tfcmVuYW1lKTsKK0VYUE9SVF9TWU1CT0wodmZzX2NyZWF0ZSk7CitFWFBPUlRfU1lNQk9MKHZmc19mb2xsb3dfbGluayk7CitFWFBPUlRfU1lNQk9MKHZmc19saW5rKTsKK0VYUE9SVF9TWU1CT0wodmZzX21rZGlyKTsKK0VYUE9SVF9TWU1CT0wodmZzX21rbm9kKTsKK0VYUE9SVF9TWU1CT0woZ2VuZXJpY19wZXJtaXNzaW9uKTsKK0VYUE9SVF9TWU1CT0wodmZzX3JlYWRsaW5rKTsKK0VYUE9SVF9TWU1CT0wodmZzX3JlbmFtZSk7CitFWFBPUlRfU1lNQk9MKHZmc19ybWRpcik7CitFWFBPUlRfU1lNQk9MKHZmc19zeW1saW5rKTsKK0VYUE9SVF9TWU1CT0wodmZzX3VubGluayk7CitFWFBPUlRfU1lNQk9MKGRlbnRyeV91bmhhc2gpOworRVhQT1JUX1NZTUJPTChnZW5lcmljX3JlYWRsaW5rKTsKZGlmZiAtLWdpdCBhL2ZzL25hbWVzcGFjZS5jIGIvZnMvbmFtZXNwYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I5M2U1ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25hbWVzcGFjZS5jCkBAIC0wLDAgKzEsMTQ2NSBAQAorLyoKKyAqICBsaW51eC9mcy9uYW1lc3BhY2UuYworICoKKyAqIChDKSBDb3B5cmlnaHQgQWwgVmlybyAyMDAwLCAyMDAxCisgKglSZWxlYXNlZCB1bmRlciBHUEwgdjIuCisgKgorICogQmFzZWQgb24gY29kZSBmcm9tIGZzL3N1cGVyLmMsIGNvcHlyaWdodCBMaW51cyBUb3J2YWxkcyBhbmQgb3RoZXJzLgorICogSGVhdmlseSByZXdyaXR0ZW4uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9hY2N0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1lc3BhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKworZXh0ZXJuIGludCBfX2luaXQgaW5pdF9yb290ZnModm9pZCk7CisKKyNpZmRlZiBDT05GSUdfU1lTRlMKK2V4dGVybiBpbnQgX19pbml0IHN5c2ZzX2luaXQodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgc3lzZnNfaW5pdCh2b2lkKQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKKy8qIHNwaW5sb2NrIGZvciB2ZnNtb3VudCByZWxhdGVkIG9wZXJhdGlvbnMsIGlucGxhY2Ugb2YgZGNhY2hlX2xvY2sgKi8KKyBfX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcCBERUZJTkVfU1BJTkxPQ0sodmZzbW91bnRfbG9jayk7CisKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkICptb3VudF9oYXNodGFibGU7CitzdGF0aWMgaW50IGhhc2hfbWFzaywgaGFzaF9iaXRzOworc3RhdGljIGttZW1fY2FjaGVfdCAqbW50X2NhY2hlOyAKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGhhc2goc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwl1bnNpZ25lZCBsb25nIHRtcCA9ICgodW5zaWduZWQgbG9uZykgbW50IC8gTDFfQ0FDSEVfQllURVMpOworCXRtcCArPSAoKHVuc2lnbmVkIGxvbmcpIGRlbnRyeSAvIEwxX0NBQ0hFX0JZVEVTKTsKKwl0bXAgPSB0bXAgKyAodG1wID4+IGhhc2hfYml0cyk7CisJcmV0dXJuIHRtcCAmIGhhc2hfbWFzazsKK30KKworc3RydWN0IHZmc21vdW50ICphbGxvY192ZnNtbnQoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IGttZW1fY2FjaGVfYWxsb2MobW50X2NhY2hlLCBHRlBfS0VSTkVMKTsgCisJaWYgKG1udCkgeworCQltZW1zZXQobW50LCAwLCBzaXplb2Yoc3RydWN0IHZmc21vdW50KSk7CisJCWF0b21pY19zZXQoJm1udC0+bW50X2NvdW50LDEpOworCQlJTklUX0xJU1RfSEVBRCgmbW50LT5tbnRfaGFzaCk7CisJCUlOSVRfTElTVF9IRUFEKCZtbnQtPm1udF9jaGlsZCk7CisJCUlOSVRfTElTVF9IRUFEKCZtbnQtPm1udF9tb3VudHMpOworCQlJTklUX0xJU1RfSEVBRCgmbW50LT5tbnRfbGlzdCk7CisJCUlOSVRfTElTVF9IRUFEKCZtbnQtPm1udF9mc2xpbmspOworCQlpZiAobmFtZSkgeworCQkJaW50IHNpemUgPSBzdHJsZW4obmFtZSkrMTsKKwkJCWNoYXIgKm5ld25hbWUgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCQkJaWYgKG5ld25hbWUpIHsKKwkJCQltZW1jcHkobmV3bmFtZSwgbmFtZSwgc2l6ZSk7CisJCQkJbW50LT5tbnRfZGV2bmFtZSA9IG5ld25hbWU7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIG1udDsKK30KKwordm9pZCBmcmVlX3Zmc21udChzdHJ1Y3QgdmZzbW91bnQgKm1udCkKK3sKKwlrZnJlZShtbnQtPm1udF9kZXZuYW1lKTsKKwlrbWVtX2NhY2hlX2ZyZWUobW50X2NhY2hlLCBtbnQpOworfQorCisvKgorICogTm93LCBsb29rdXBfbW50IGluY3JlbWVudHMgdGhlIHJlZiBjb3VudCBiZWZvcmUgcmV0dXJuaW5nCisgKiB0aGUgdmZzbW91bnQgc3RydWN0LgorICovCitzdHJ1Y3QgdmZzbW91bnQgKmxvb2t1cF9tbnQoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICogaGVhZCA9IG1vdW50X2hhc2h0YWJsZSArIGhhc2gobW50LCBkZW50cnkpOworCXN0cnVjdCBsaXN0X2hlYWQgKiB0bXAgPSBoZWFkOworCXN0cnVjdCB2ZnNtb3VudCAqcCwgKmZvdW5kID0gTlVMTDsKKworCXNwaW5fbG9jaygmdmZzbW91bnRfbG9jayk7CisJZm9yICg7OykgeworCQl0bXAgPSB0bXAtPm5leHQ7CisJCXAgPSBOVUxMOworCQlpZiAodG1wID09IGhlYWQpCisJCQlicmVhazsKKwkJcCA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgdmZzbW91bnQsIG1udF9oYXNoKTsKKwkJaWYgKHAtPm1udF9wYXJlbnQgPT0gbW50ICYmIHAtPm1udF9tb3VudHBvaW50ID09IGRlbnRyeSkgeworCQkJZm91bmQgPSBtbnRnZXQocCk7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmdmZzbW91bnRfbG9jayk7CisJcmV0dXJuIGZvdW5kOworfQorCitzdGF0aWMgaW5saW5lIGludCBjaGVja19tbnQoc3RydWN0IHZmc21vdW50ICptbnQpCit7CisJcmV0dXJuIG1udC0+bW50X25hbWVzcGFjZSA9PSBjdXJyZW50LT5uYW1lc3BhY2U7Cit9CisKK3N0YXRpYyB2b2lkIGRldGFjaF9tbnQoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBuYW1laWRhdGEgKm9sZF9uZCkKK3sKKwlvbGRfbmQtPmRlbnRyeSA9IG1udC0+bW50X21vdW50cG9pbnQ7CisJb2xkX25kLT5tbnQgPSBtbnQtPm1udF9wYXJlbnQ7CisJbW50LT5tbnRfcGFyZW50ID0gbW50OworCW1udC0+bW50X21vdW50cG9pbnQgPSBtbnQtPm1udF9yb290OworCWxpc3RfZGVsX2luaXQoJm1udC0+bW50X2NoaWxkKTsKKwlsaXN0X2RlbF9pbml0KCZtbnQtPm1udF9oYXNoKTsKKwlvbGRfbmQtPmRlbnRyeS0+ZF9tb3VudGVkLS07Cit9CisKK3N0YXRpYyB2b2lkIGF0dGFjaF9tbnQoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCW1udC0+bW50X3BhcmVudCA9IG1udGdldChuZC0+bW50KTsKKwltbnQtPm1udF9tb3VudHBvaW50ID0gZGdldChuZC0+ZGVudHJ5KTsKKwlsaXN0X2FkZCgmbW50LT5tbnRfaGFzaCwgbW91bnRfaGFzaHRhYmxlK2hhc2gobmQtPm1udCwgbmQtPmRlbnRyeSkpOworCWxpc3RfYWRkX3RhaWwoJm1udC0+bW50X2NoaWxkLCAmbmQtPm1udC0+bW50X21vdW50cyk7CisJbmQtPmRlbnRyeS0+ZF9tb3VudGVkKys7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKm5leHRfbW50KHN0cnVjdCB2ZnNtb3VudCAqcCwgc3RydWN0IHZmc21vdW50ICpyb290KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQgPSBwLT5tbnRfbW91bnRzLm5leHQ7CisJaWYgKG5leHQgPT0gJnAtPm1udF9tb3VudHMpIHsKKwkJd2hpbGUgKDEpIHsKKwkJCWlmIChwID09IHJvb3QpCisJCQkJcmV0dXJuIE5VTEw7CisJCQluZXh0ID0gcC0+bW50X2NoaWxkLm5leHQ7CisJCQlpZiAobmV4dCAhPSAmcC0+bW50X3BhcmVudC0+bW50X21vdW50cykKKwkJCQlicmVhazsKKwkJCXAgPSBwLT5tbnRfcGFyZW50OworCQl9CisJfQorCXJldHVybiBsaXN0X2VudHJ5KG5leHQsIHN0cnVjdCB2ZnNtb3VudCwgbW50X2NoaWxkKTsKK30KKworc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqCitjbG9uZV9tbnQoc3RydWN0IHZmc21vdW50ICpvbGQsIHN0cnVjdCBkZW50cnkgKnJvb3QpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IG9sZC0+bW50X3NiOworCXN0cnVjdCB2ZnNtb3VudCAqbW50ID0gYWxsb2NfdmZzbW50KG9sZC0+bW50X2Rldm5hbWUpOworCisJaWYgKG1udCkgeworCQltbnQtPm1udF9mbGFncyA9IG9sZC0+bW50X2ZsYWdzOworCQlhdG9taWNfaW5jKCZzYi0+c19hY3RpdmUpOworCQltbnQtPm1udF9zYiA9IHNiOworCQltbnQtPm1udF9yb290ID0gZGdldChyb290KTsKKwkJbW50LT5tbnRfbW91bnRwb2ludCA9IG1udC0+bW50X3Jvb3Q7CisJCW1udC0+bW50X3BhcmVudCA9IG1udDsKKwkJbW50LT5tbnRfbmFtZXNwYWNlID0gb2xkLT5tbnRfbmFtZXNwYWNlOworCisJCS8qIHN0aWNrIHRoZSBkdXBsaWNhdGUgbW91bnQgb24gdGhlIHNhbWUgZXhwaXJ5IGxpc3QKKwkJICogYXMgdGhlIG9yaWdpbmFsIGlmIHRoYXQgd2FzIG9uIG9uZSAqLworCQlzcGluX2xvY2soJnZmc21vdW50X2xvY2spOworCQlpZiAoIWxpc3RfZW1wdHkoJm9sZC0+bW50X2ZzbGluaykpCisJCQlsaXN0X2FkZCgmbW50LT5tbnRfZnNsaW5rLCAmb2xkLT5tbnRfZnNsaW5rKTsKKwkJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOworCX0KKwlyZXR1cm4gbW50OworfQorCit2b2lkIF9fbW50cHV0KHN0cnVjdCB2ZnNtb3VudCAqbW50KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBtbnQtPm1udF9zYjsKKwlkcHV0KG1udC0+bW50X3Jvb3QpOworCWZyZWVfdmZzbW50KG1udCk7CisJZGVhY3RpdmF0ZV9zdXBlcihzYik7Cit9CisKK0VYUE9SVF9TWU1CT0woX19tbnRwdXQpOworCisvKiBpdGVyYXRvciAqLworc3RhdGljIHZvaWQgKm1fc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgbmFtZXNwYWNlICpuID0gbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCWxvZmZfdCBsID0gKnBvczsKKworCWRvd25fcmVhZCgmbi0+c2VtKTsKKwlsaXN0X2Zvcl9lYWNoKHAsICZuLT5saXN0KQorCQlpZiAoIWwtLSkKKwkJCXJldHVybiBsaXN0X2VudHJ5KHAsIHN0cnVjdCB2ZnNtb3VudCwgbW50X2xpc3QpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCAqbV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IG5hbWVzcGFjZSAqbiA9IG0tPnByaXZhdGU7CisJc3RydWN0IGxpc3RfaGVhZCAqcCA9ICgoc3RydWN0IHZmc21vdW50ICopdiktPm1udF9saXN0Lm5leHQ7CisJKCpwb3MpKys7CisJcmV0dXJuIHA9PSZuLT5saXN0ID8gTlVMTCA6IGxpc3RfZW50cnkocCwgc3RydWN0IHZmc21vdW50LCBtbnRfbGlzdCk7Cit9CisKK3N0YXRpYyB2b2lkIG1fc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJc3RydWN0IG5hbWVzcGFjZSAqbiA9IG0tPnByaXZhdGU7CisJdXBfcmVhZCgmbi0+c2VtKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1hbmdsZShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGNvbnN0IGNoYXIgKnMpCit7CisJc2VxX2VzY2FwZShtLCBzLCAiIFx0XG5cXCIpOworfQorCitzdGF0aWMgaW50IHNob3dfdmZzbW50KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IHY7CisJaW50IGVyciA9IDA7CisJc3RhdGljIHN0cnVjdCBwcm9jX2ZzX2luZm8geworCQlpbnQgZmxhZzsKKwkJY2hhciAqc3RyOworCX0gZnNfaW5mb1tdID0geworCQl7IE1TX1NZTkNIUk9OT1VTLCAiLHN5bmMiIH0sCisJCXsgTVNfRElSU1lOQywgIixkaXJzeW5jIiB9LAorCQl7IE1TX01BTkRMT0NLLCAiLG1hbmQiIH0sCisJCXsgTVNfTk9BVElNRSwgIixub2F0aW1lIiB9LAorCQl7IE1TX05PRElSQVRJTUUsICIsbm9kaXJhdGltZSIgfSwKKwkJeyAwLCBOVUxMIH0KKwl9OworCXN0YXRpYyBzdHJ1Y3QgcHJvY19mc19pbmZvIG1udF9pbmZvW10gPSB7CisJCXsgTU5UX05PU1VJRCwgIixub3N1aWQiIH0sCisJCXsgTU5UX05PREVWLCAiLG5vZGV2IiB9LAorCQl7IE1OVF9OT0VYRUMsICIsbm9leGVjIiB9LAorCQl7IDAsIE5VTEwgfQorCX07CisJc3RydWN0IHByb2NfZnNfaW5mbyAqZnNfaW5mb3A7CisKKwltYW5nbGUobSwgbW50LT5tbnRfZGV2bmFtZSA/IG1udC0+bW50X2Rldm5hbWUgOiAibm9uZSIpOworCXNlcV9wdXRjKG0sICcgJyk7CisJc2VxX3BhdGgobSwgbW50LCBtbnQtPm1udF9yb290LCAiIFx0XG5cXCIpOworCXNlcV9wdXRjKG0sICcgJyk7CisJbWFuZ2xlKG0sIG1udC0+bW50X3NiLT5zX3R5cGUtPm5hbWUpOworCXNlcV9wdXRzKG0sIG1udC0+bW50X3NiLT5zX2ZsYWdzICYgTVNfUkRPTkxZID8gIiBybyIgOiAiIHJ3Iik7CisJZm9yIChmc19pbmZvcCA9IGZzX2luZm87IGZzX2luZm9wLT5mbGFnOyBmc19pbmZvcCsrKSB7CisJCWlmIChtbnQtPm1udF9zYi0+c19mbGFncyAmIGZzX2luZm9wLT5mbGFnKQorCQkJc2VxX3B1dHMobSwgZnNfaW5mb3AtPnN0cik7CisJfQorCWZvciAoZnNfaW5mb3AgPSBtbnRfaW5mbzsgZnNfaW5mb3AtPmZsYWc7IGZzX2luZm9wKyspIHsKKwkJaWYgKG1udC0+bW50X2ZsYWdzICYgZnNfaW5mb3AtPmZsYWcpCisJCQlzZXFfcHV0cyhtLCBmc19pbmZvcC0+c3RyKTsKKwl9CisJaWYgKG1udC0+bW50X3NiLT5zX29wLT5zaG93X29wdGlvbnMpCisJCWVyciA9IG1udC0+bW50X3NiLT5zX29wLT5zaG93X29wdGlvbnMobSwgbW50KTsKKwlzZXFfcHV0cyhtLCAiIDAgMFxuIik7CisJcmV0dXJuIGVycjsKK30KKworc3RydWN0IHNlcV9vcGVyYXRpb25zIG1vdW50c19vcCA9IHsKKwkuc3RhcnQJPSBtX3N0YXJ0LAorCS5uZXh0CT0gbV9uZXh0LAorCS5zdG9wCT0gbV9zdG9wLAorCS5zaG93CT0gc2hvd192ZnNtbnQKK307CisKKy8qKgorICogbWF5X3Vtb3VudF90cmVlIC0gY2hlY2sgaWYgYSBtb3VudCB0cmVlIGlzIGJ1c3kKKyAqIEBtbnQ6IHJvb3Qgb2YgbW91bnQgdHJlZQorICoKKyAqIFRoaXMgaXMgY2FsbGVkIHRvIGNoZWNrIGlmIGEgdHJlZSBvZiBtb3VudHMgaGFzIGFueQorICogb3BlbiBmaWxlcywgcHdkcywgY2hyb290cyBvciBzdWIgbW91bnRzIHRoYXQgYXJlCisgKiBidXN5LgorICovCitpbnQgbWF5X3Vtb3VudF90cmVlKHN0cnVjdCB2ZnNtb3VudCAqbW50KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQ7CisJc3RydWN0IHZmc21vdW50ICp0aGlzX3BhcmVudCA9IG1udDsKKwlpbnQgYWN0dWFsX3JlZnM7CisJaW50IG1pbmltdW1fcmVmczsKKworCXNwaW5fbG9jaygmdmZzbW91bnRfbG9jayk7CisJYWN0dWFsX3JlZnMgPSBhdG9taWNfcmVhZCgmbW50LT5tbnRfY291bnQpOworCW1pbmltdW1fcmVmcyA9IDI7CityZXBlYXQ6CisJbmV4dCA9IHRoaXNfcGFyZW50LT5tbnRfbW91bnRzLm5leHQ7CityZXN1bWU6CisJd2hpbGUgKG5leHQgIT0gJnRoaXNfcGFyZW50LT5tbnRfbW91bnRzKSB7CisJCXN0cnVjdCB2ZnNtb3VudCAqcCA9IGxpc3RfZW50cnkobmV4dCwgc3RydWN0IHZmc21vdW50LCBtbnRfY2hpbGQpOworCisJCW5leHQgPSBuZXh0LT5uZXh0OworCisJCWFjdHVhbF9yZWZzICs9IGF0b21pY19yZWFkKCZwLT5tbnRfY291bnQpOworCQltaW5pbXVtX3JlZnMgKz0gMjsKKworCQlpZiAoIWxpc3RfZW1wdHkoJnAtPm1udF9tb3VudHMpKSB7CisJCQl0aGlzX3BhcmVudCA9IHA7CisJCQlnb3RvIHJlcGVhdDsKKwkJfQorCX0KKworCWlmICh0aGlzX3BhcmVudCAhPSBtbnQpIHsKKwkJbmV4dCA9IHRoaXNfcGFyZW50LT5tbnRfY2hpbGQubmV4dDsKKwkJdGhpc19wYXJlbnQgPSB0aGlzX3BhcmVudC0+bW50X3BhcmVudDsKKwkJZ290byByZXN1bWU7CisJfQorCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKworCWlmIChhY3R1YWxfcmVmcyA+IG1pbmltdW1fcmVmcykKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKG1heV91bW91bnRfdHJlZSk7CisKKy8qKgorICogbWF5X3Vtb3VudCAtIGNoZWNrIGlmIGEgbW91bnQgcG9pbnQgaXMgYnVzeQorICogQG1udDogcm9vdCBvZiBtb3VudAorICoKKyAqIFRoaXMgaXMgY2FsbGVkIHRvIGNoZWNrIGlmIGEgbW91bnQgcG9pbnQgaGFzIGFueQorICogb3BlbiBmaWxlcywgcHdkcywgY2hyb290cyBvciBzdWIgbW91bnRzLiBJZiB0aGUKKyAqIG1vdW50IGhhcyBzdWIgbW91bnRzIHRoaXMgd2lsbCByZXR1cm4gYnVzeQorICogcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBzdWIgbW91bnRzIGFyZSBidXN5LgorICoKKyAqIERvZXNuJ3QgdGFrZSBxdW90YSBhbmQgc3R1ZmYgaW50byBhY2NvdW50LiBJT1csIGluIHNvbWUgY2FzZXMgaXQgd2lsbAorICogZ2l2ZSBmYWxzZSBuZWdhdGl2ZXMuIFRoZSBtYWluIHJlYXNvbiB3aHkgaXQncyBoZXJlIGlzIHRoYXQgd2UgbmVlZAorICogYSBub24tZGVzdHJ1Y3RpdmUgd2F5IHRvIGxvb2sgZm9yIGVhc2lseSB1bW91bnRhYmxlIGZpbGVzeXN0ZW1zLgorICovCitpbnQgbWF5X3Vtb3VudChzdHJ1Y3QgdmZzbW91bnQgKm1udCkKK3sKKwlpZiAoYXRvbWljX3JlYWQoJm1udC0+bW50X2NvdW50KSA+IDIpCisJCXJldHVybiAtRUJVU1k7CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0wobWF5X3Vtb3VudCk7CisKK3ZvaWQgdW1vdW50X3RyZWUoc3RydWN0IHZmc21vdW50ICptbnQpCit7CisJc3RydWN0IHZmc21vdW50ICpwOworCUxJU1RfSEVBRChraWxsKTsKKworCWZvciAocCA9IG1udDsgcDsgcCA9IG5leHRfbW50KHAsIG1udCkpIHsKKwkJbGlzdF9kZWwoJnAtPm1udF9saXN0KTsKKwkJbGlzdF9hZGQoJnAtPm1udF9saXN0LCAma2lsbCk7CisJfQorCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZraWxsKSkgeworCQltbnQgPSBsaXN0X2VudHJ5KGtpbGwubmV4dCwgc3RydWN0IHZmc21vdW50LCBtbnRfbGlzdCk7CisJCWxpc3RfZGVsX2luaXQoJm1udC0+bW50X2xpc3QpOworCQlsaXN0X2RlbF9pbml0KCZtbnQtPm1udF9mc2xpbmspOworCQlpZiAobW50LT5tbnRfcGFyZW50ID09IG1udCkgeworCQkJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOworCQl9IGVsc2UgeworCQkJc3RydWN0IG5hbWVpZGF0YSBvbGRfbmQ7CisJCQlkZXRhY2hfbW50KG1udCwgJm9sZF9uZCk7CisJCQlzcGluX3VubG9jaygmdmZzbW91bnRfbG9jayk7CisJCQlwYXRoX3JlbGVhc2UoJm9sZF9uZCk7CisJCX0KKwkJbW50cHV0KG1udCk7CisJCXNwaW5fbG9jaygmdmZzbW91bnRfbG9jayk7CisJfQorfQorCitzdGF0aWMgaW50IGRvX3Vtb3VudChzdHJ1Y3QgdmZzbW91bnQgKm1udCwgaW50IGZsYWdzKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiID0gbW50LT5tbnRfc2I7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IHNlY3VyaXR5X3NiX3Vtb3VudChtbnQsIGZsYWdzKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJLyoKKwkgKiBBbGxvdyB1c2Vyc3BhY2UgdG8gcmVxdWVzdCBhIG1vdW50cG9pbnQgYmUgZXhwaXJlZCByYXRoZXIgdGhhbgorCSAqIHVubW91bnRpbmcgdW5jb25kaXRpb25hbGx5LiBVbm1vdW50IG9ubHkgaGFwcGVucyBpZjoKKwkgKiAgKDEpIHRoZSBtYXJrIGlzIGFscmVhZHkgc2V0ICh0aGUgbWFyayBpcyBjbGVhcmVkIGJ5IG1udHB1dCgpKQorCSAqICAoMikgdGhlIHVzYWdlIGNvdW50ID09IDEgW3BhcmVudCB2ZnNtb3VudF0gKyAxIFtzeXNfdW1vdW50XQorCSAqLworCWlmIChmbGFncyAmIE1OVF9FWFBJUkUpIHsKKwkJaWYgKG1udCA9PSBjdXJyZW50LT5mcy0+cm9vdG1udCB8fAorCQkgICAgZmxhZ3MgJiAoTU5UX0ZPUkNFIHwgTU5UX0RFVEFDSCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoYXRvbWljX3JlYWQoJm1udC0+bW50X2NvdW50KSAhPSAyKQorCQkJcmV0dXJuIC1FQlVTWTsKKworCQlpZiAoIXhjaGcoJm1udC0+bW50X2V4cGlyeV9tYXJrLCAxKSkKKwkJCXJldHVybiAtRUFHQUlOOworCX0KKworCS8qCisJICogSWYgd2UgbWF5IGhhdmUgdG8gYWJvcnQgb3BlcmF0aW9ucyB0byBnZXQgb3V0IG9mIHRoaXMKKwkgKiBtb3VudCwgYW5kIHRoZXkgd2lsbCB0aGVtc2VsdmVzIGhvbGQgcmVzb3VyY2VzIHdlIG11c3QKKwkgKiBhbGxvdyB0aGUgZnMgdG8gZG8gdGhpbmdzLiBJbiB0aGUgVW5peCB0cmFkaXRpb24gb2YKKwkgKiAnR2VlIHRoYXRzIHRyaWNreSBsZXRzIGRvIGl0IGluIHVzZXJzcGFjZScgdGhlIHVtb3VudF9iZWdpbgorCSAqIG1pZ2h0IGZhaWwgdG8gY29tcGxldGUgb24gdGhlIGZpcnN0IHJ1biB0aHJvdWdoIGFzIG90aGVyIHRhc2tzCisJICogbXVzdCByZXR1cm4sIGFuZCB0aGUgbGlrZS4gVGhhdHMgZm9yIHRoZSBtb3VudCBwcm9ncmFtIHRvIHdvcnJ5CisJICogYWJvdXQgZm9yIHRoZSBtb21lbnQuCisJICovCisKKwlsb2NrX2tlcm5lbCgpOworCWlmKCAoZmxhZ3MmTU5UX0ZPUkNFKSAmJiBzYi0+c19vcC0+dW1vdW50X2JlZ2luKQorCQlzYi0+c19vcC0+dW1vdW50X2JlZ2luKHNiKTsKKwl1bmxvY2tfa2VybmVsKCk7CisKKwkvKgorCSAqIE5vIHNlbnNlIHRvIGdyYWIgdGhlIGxvY2sgZm9yIHRoaXMgdGVzdCwgYnV0IHRlc3QgaXRzZWxmIGxvb2tzCisJICogc29tZXdoYXQgYm9ndXMuIFN1Z2dlc3Rpb25zIGZvciBiZXR0ZXIgcmVwbGFjZW1lbnQ/CisJICogSG8taHVtLi4uIEluIHByaW5jaXBsZSwgd2UgbWlnaHQgdHJlYXQgdGhhdCBhcyB1bW91bnQgKyBzd2l0Y2gKKwkgKiB0byByb290ZnMuIEdDIHdvdWxkIGV2ZW50dWFsbHkgdGFrZSBjYXJlIG9mIHRoZSBvbGQgdmZzbW91bnQuCisJICogQWN0dWFsbHkgaXQgbWFrZXMgc2Vuc2UsIGVzcGVjaWFsbHkgaWYgcm9vdGZzIHdvdWxkIGNvbnRhaW4gYQorCSAqIC9yZWJvb3QgLSBzdGF0aWMgYmluYXJ5IHRoYXQgd291bGQgY2xvc2UgYWxsIGRlc2NyaXB0b3JzIGFuZAorCSAqIGNhbGwgcmVib290KDkpLiBUaGVuIGluaXQoOCkgY291bGQgdW1vdW50IHJvb3QgYW5kIGV4ZWMgL3JlYm9vdC4KKwkgKi8KKwlpZiAobW50ID09IGN1cnJlbnQtPmZzLT5yb290bW50ICYmICEoZmxhZ3MgJiBNTlRfREVUQUNIKSkgeworCQkvKgorCQkgKiBTcGVjaWFsIGNhc2UgZm9yICJ1bm1vdW50aW5nIiByb290IC4uLgorCQkgKiB3ZSBqdXN0IHRyeSB0byByZW1vdW50IGl0IHJlYWRvbmx5LgorCQkgKi8KKwkJZG93bl93cml0ZSgmc2ItPnNfdW1vdW50KTsKKwkJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCQlsb2NrX2tlcm5lbCgpOworCQkJRFFVT1RfT0ZGKHNiKTsKKwkJCXJldHZhbCA9IGRvX3JlbW91bnRfc2Ioc2IsIE1TX1JET05MWSwgTlVMTCwgMCk7CisJCQl1bmxvY2tfa2VybmVsKCk7CisJCX0KKwkJdXBfd3JpdGUoJnNiLT5zX3Vtb3VudCk7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJZG93bl93cml0ZSgmY3VycmVudC0+bmFtZXNwYWNlLT5zZW0pOworCXNwaW5fbG9jaygmdmZzbW91bnRfbG9jayk7CisKKwlpZiAoYXRvbWljX3JlYWQoJnNiLT5zX2FjdGl2ZSkgPT0gMSkgeworCQkvKiBsYXN0IGluc3RhbmNlIC0gdHJ5IHRvIGJlIHNtYXJ0ICovCisJCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKwkJbG9ja19rZXJuZWwoKTsKKwkJRFFVT1RfT0ZGKHNiKTsKKwkJYWNjdF9hdXRvX2Nsb3NlKHNiKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlzZWN1cml0eV9zYl91bW91bnRfY2xvc2UobW50KTsKKwkJc3Bpbl9sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKwl9CisJcmV0dmFsID0gLUVCVVNZOworCWlmIChhdG9taWNfcmVhZCgmbW50LT5tbnRfY291bnQpID09IDIgfHwgZmxhZ3MgJiBNTlRfREVUQUNIKSB7CisJCWlmICghbGlzdF9lbXB0eSgmbW50LT5tbnRfbGlzdCkpCisJCQl1bW91bnRfdHJlZShtbnQpOworCQlyZXR2YWwgPSAwOworCX0KKwlzcGluX3VubG9jaygmdmZzbW91bnRfbG9jayk7CisJaWYgKHJldHZhbCkKKwkJc2VjdXJpdHlfc2JfdW1vdW50X2J1c3kobW50KTsKKwl1cF93cml0ZSgmY3VycmVudC0+bmFtZXNwYWNlLT5zZW0pOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBOb3cgdW1vdW50IGNhbiBoYW5kbGUgbW91bnQgcG9pbnRzIGFzIHdlbGwgYXMgYmxvY2sgZGV2aWNlcy4KKyAqIFRoaXMgaXMgaW1wb3J0YW50IGZvciBmaWxlc3lzdGVtcyB3aGljaCB1c2UgdW5uYW1lZCBibG9jayBkZXZpY2VzLgorICoKKyAqIFdlIG5vdyBzdXBwb3J0IGEgZmxhZyBmb3IgZm9yY2VkIHVubW91bnQgbGlrZSB0aGUgb3RoZXIgJ2JpZyBpcm9uJworICogdW5peGVzLiBPdXIgQVBJIGlzIGlkZW50aWNhbCB0byBPU0YvMSB0byBhdm9pZCBtYWtpbmcgYSBtZXNzIG9mIEFNRAorICovCisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfdW1vdW50KGNoYXIgX191c2VyICogbmFtZSwgaW50IGZsYWdzKQoreworCXN0cnVjdCBuYW1laWRhdGEgbmQ7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IF9fdXNlcl93YWxrKG5hbWUsIExPT0tVUF9GT0xMT1csICZuZCk7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXQ7CisJcmV0dmFsID0gLUVJTlZBTDsKKwlpZiAobmQuZGVudHJ5ICE9IG5kLm1udC0+bW50X3Jvb3QpCisJCWdvdG8gZHB1dF9hbmRfb3V0OworCWlmICghY2hlY2tfbW50KG5kLm1udCkpCisJCWdvdG8gZHB1dF9hbmRfb3V0OworCisJcmV0dmFsID0gLUVQRVJNOworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJZ290byBkcHV0X2FuZF9vdXQ7CisKKwlyZXR2YWwgPSBkb191bW91bnQobmQubW50LCBmbGFncyk7CitkcHV0X2FuZF9vdXQ6CisJcGF0aF9yZWxlYXNlX29uX3Vtb3VudCgmbmQpOworb3V0OgorCXJldHVybiByZXR2YWw7Cit9CisKKyNpZmRlZiBfX0FSQ0hfV0FOVF9TWVNfT0xEVU1PVU5UCisKKy8qCisgKglUaGUgMi4wIGNvbXBhdGlibGUgdW1vdW50LiBObyBmbGFncy4gCisgKi8KKyAKK2FzbWxpbmthZ2UgbG9uZyBzeXNfb2xkdW1vdW50KGNoYXIgX191c2VyICogbmFtZSkKK3sKKwlyZXR1cm4gc3lzX3Vtb3VudChuYW1lLDApOworfQorCisjZW5kaWYKKworc3RhdGljIGludCBtb3VudF9pc19zYWZlKHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWlmIChjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVQRVJNOworI2lmZGVmIG5vdHlldAorCWlmIChTX0lTTE5LKG5kLT5kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiAtRVBFUk07CisJaWYgKG5kLT5kZW50cnktPmRfaW5vZGUtPmlfbW9kZSAmIFNfSVNWVFgpIHsKKwkJaWYgKGN1cnJlbnQtPnVpZCAhPSBuZC0+ZGVudHJ5LT5kX2lub2RlLT5pX3VpZCkKKwkJCXJldHVybiAtRVBFUk07CisJfQorCWlmIChwZXJtaXNzaW9uKG5kLT5kZW50cnktPmRfaW5vZGUsIE1BWV9XUklURSwgbmQpKQorCQlyZXR1cm4gLUVQRVJNOworCXJldHVybiAwOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQKK2xpdmVzX2JlbG93X2luX3NhbWVfZnMoc3RydWN0IGRlbnRyeSAqZCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXdoaWxlICgxKSB7CisJCWlmIChkID09IGRlbnRyeSkKKwkJCXJldHVybiAxOworCQlpZiAoZCA9PSBOVUxMIHx8IGQgPT0gZC0+ZF9wYXJlbnQpCisJCQlyZXR1cm4gMDsKKwkJZCA9IGQtPmRfcGFyZW50OworCX0KK30KKworc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqY29weV90cmVlKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IHZmc21vdW50ICpyZXMsICpwLCAqcSwgKnIsICpzOworCXN0cnVjdCBsaXN0X2hlYWQgKmg7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKworCXJlcyA9IHEgPSBjbG9uZV9tbnQobW50LCBkZW50cnkpOworCWlmICghcSkKKwkJZ290byBFbm9tZW07CisJcS0+bW50X21vdW50cG9pbnQgPSBtbnQtPm1udF9tb3VudHBvaW50OworCisJcCA9IG1udDsKKwlmb3IgKGggPSBtbnQtPm1udF9tb3VudHMubmV4dDsgaCAhPSAmbW50LT5tbnRfbW91bnRzOyBoID0gaC0+bmV4dCkgeworCQlyID0gbGlzdF9lbnRyeShoLCBzdHJ1Y3QgdmZzbW91bnQsIG1udF9jaGlsZCk7CisJCWlmICghbGl2ZXNfYmVsb3dfaW5fc2FtZV9mcyhyLT5tbnRfbW91bnRwb2ludCwgZGVudHJ5KSkKKwkJCWNvbnRpbnVlOworCisJCWZvciAocyA9IHI7IHM7IHMgPSBuZXh0X21udChzLCByKSkgeworCQkJd2hpbGUgKHAgIT0gcy0+bW50X3BhcmVudCkgeworCQkJCXAgPSBwLT5tbnRfcGFyZW50OworCQkJCXEgPSBxLT5tbnRfcGFyZW50OworCQkJfQorCQkJcCA9IHM7CisJCQluZC5tbnQgPSBxOworCQkJbmQuZGVudHJ5ID0gcC0+bW50X21vdW50cG9pbnQ7CisJCQlxID0gY2xvbmVfbW50KHAsIHAtPm1udF9yb290KTsKKwkJCWlmICghcSkKKwkJCQlnb3RvIEVub21lbTsKKwkJCXNwaW5fbG9jaygmdmZzbW91bnRfbG9jayk7CisJCQlsaXN0X2FkZF90YWlsKCZxLT5tbnRfbGlzdCwgJnJlcy0+bW50X2xpc3QpOworCQkJYXR0YWNoX21udChxLCAmbmQpOworCQkJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOworCQl9CisJfQorCXJldHVybiByZXM7CisgRW5vbWVtOgorCWlmIChyZXMpIHsKKwkJc3Bpbl9sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKwkJdW1vdW50X3RyZWUocmVzKTsKKwkJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBncmFmdF90cmVlKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlpbnQgZXJyOworCWlmIChtbnQtPm1udF9zYi0+c19mbGFncyAmIE1TX05PVVNFUikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoU19JU0RJUihuZC0+ZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpICE9CisJICAgICAgU19JU0RJUihtbnQtPm1udF9yb290LT5kX2lub2RlLT5pX21vZGUpKQorCQlyZXR1cm4gLUVOT1RESVI7CisKKwllcnIgPSAtRU5PRU5UOworCWRvd24oJm5kLT5kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwlpZiAoSVNfREVBRERJUihuZC0+ZGVudHJ5LT5kX2lub2RlKSkKKwkJZ290byBvdXRfdW5sb2NrOworCisJZXJyID0gc2VjdXJpdHlfc2JfY2hlY2tfc2IobW50LCBuZCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfdW5sb2NrOworCisJZXJyID0gLUVOT0VOVDsKKwlzcGluX2xvY2soJnZmc21vdW50X2xvY2spOworCWlmIChJU19ST09UKG5kLT5kZW50cnkpIHx8ICFkX3VuaGFzaGVkKG5kLT5kZW50cnkpKSB7CisJCXN0cnVjdCBsaXN0X2hlYWQgaGVhZDsKKworCQlhdHRhY2hfbW50KG1udCwgbmQpOworCQlsaXN0X2FkZF90YWlsKCZoZWFkLCAmbW50LT5tbnRfbGlzdCk7CisJCWxpc3Rfc3BsaWNlKCZoZWFkLCBjdXJyZW50LT5uYW1lc3BhY2UtPmxpc3QucHJldik7CisJCW1udGdldChtbnQpOworCQllcnIgPSAwOworCX0KKwlzcGluX3VubG9jaygmdmZzbW91bnRfbG9jayk7CitvdXRfdW5sb2NrOgorCXVwKCZuZC0+ZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJaWYgKCFlcnIpCisJCXNlY3VyaXR5X3NiX3Bvc3RfYWRkbW91bnQobW50LCBuZCk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIGRvIGxvb3BiYWNrIG1vdW50LgorICovCitzdGF0aWMgaW50IGRvX2xvb3BiYWNrKHN0cnVjdCBuYW1laWRhdGEgKm5kLCBjaGFyICpvbGRfbmFtZSwgaW50IHJlY3Vyc2UpCit7CisJc3RydWN0IG5hbWVpZGF0YSBvbGRfbmQ7CisJc3RydWN0IHZmc21vdW50ICptbnQgPSBOVUxMOworCWludCBlcnIgPSBtb3VudF9pc19zYWZlKG5kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWlmICghb2xkX25hbWUgfHwgISpvbGRfbmFtZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZXJyID0gcGF0aF9sb29rdXAob2xkX25hbWUsIExPT0tVUF9GT0xMT1csICZvbGRfbmQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlkb3duX3dyaXRlKCZjdXJyZW50LT5uYW1lc3BhY2UtPnNlbSk7CisJZXJyID0gLUVJTlZBTDsKKwlpZiAoY2hlY2tfbW50KG5kLT5tbnQpICYmICghcmVjdXJzZSB8fCBjaGVja19tbnQob2xkX25kLm1udCkpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWlmIChyZWN1cnNlKQorCQkJbW50ID0gY29weV90cmVlKG9sZF9uZC5tbnQsIG9sZF9uZC5kZW50cnkpOworCQllbHNlCisJCQltbnQgPSBjbG9uZV9tbnQob2xkX25kLm1udCwgb2xkX25kLmRlbnRyeSk7CisJfQorCisJaWYgKG1udCkgeworCQkvKiBzdG9wIGJpbmQgbW91bnRzIGZyb20gZXhwaXJpbmcgKi8KKwkJc3Bpbl9sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKwkJbGlzdF9kZWxfaW5pdCgmbW50LT5tbnRfZnNsaW5rKTsKKwkJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOworCisJCWVyciA9IGdyYWZ0X3RyZWUobW50LCBuZCk7CisJCWlmIChlcnIpIHsKKwkJCXNwaW5fbG9jaygmdmZzbW91bnRfbG9jayk7CisJCQl1bW91bnRfdHJlZShtbnQpOworCQkJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOworCQl9IGVsc2UKKwkJCW1udHB1dChtbnQpOworCX0KKworCXVwX3dyaXRlKCZjdXJyZW50LT5uYW1lc3BhY2UtPnNlbSk7CisJcGF0aF9yZWxlYXNlKCZvbGRfbmQpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBjaGFuZ2UgZmlsZXN5c3RlbSBmbGFncy4gZGlyIHNob3VsZCBiZSBhIHBoeXNpY2FsIHJvb3Qgb2YgZmlsZXN5c3RlbS4KKyAqIElmIHlvdSd2ZSBtb3VudGVkIGEgbm9uLXJvb3QgZGlyZWN0b3J5IHNvbWV3aGVyZSBhbmQgd2FudCB0byBkbyByZW1vdW50CisgKiBvbiBpdCAtIHRvdWdoIGx1Y2suCisgKi8KKworc3RhdGljIGludCBkb19yZW1vdW50KHN0cnVjdCBuYW1laWRhdGEgKm5kLCBpbnQgZmxhZ3MsIGludCBtbnRfZmxhZ3MsCisJCSAgICAgIHZvaWQgKmRhdGEpCit7CisJaW50IGVycjsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiA9IG5kLT5tbnQtPm1udF9zYjsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmICghY2hlY2tfbW50KG5kLT5tbnQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChuZC0+ZGVudHJ5ICE9IG5kLT5tbnQtPm1udF9yb290KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRvd25fd3JpdGUoJnNiLT5zX3Vtb3VudCk7CisJZXJyID0gZG9fcmVtb3VudF9zYihzYiwgZmxhZ3MsIGRhdGEsIDApOworCWlmICghZXJyKQorCQluZC0+bW50LT5tbnRfZmxhZ3M9bW50X2ZsYWdzOworCXVwX3dyaXRlKCZzYi0+c191bW91bnQpOworCWlmICghZXJyKQorCQlzZWN1cml0eV9zYl9wb3N0X3JlbW91bnQobmQtPm1udCwgZmxhZ3MsIGRhdGEpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZG9fbW92ZV9tb3VudChzdHJ1Y3QgbmFtZWlkYXRhICpuZCwgY2hhciAqb2xkX25hbWUpCit7CisJc3RydWN0IG5hbWVpZGF0YSBvbGRfbmQsIHBhcmVudF9uZDsKKwlzdHJ1Y3QgdmZzbW91bnQgKnA7CisJaW50IGVyciA9IDA7CisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCWlmICghb2xkX25hbWUgfHwgISpvbGRfbmFtZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZXJyID0gcGF0aF9sb29rdXAob2xkX25hbWUsIExPT0tVUF9GT0xMT1csICZvbGRfbmQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlkb3duX3dyaXRlKCZjdXJyZW50LT5uYW1lc3BhY2UtPnNlbSk7CisJd2hpbGUoZF9tb3VudHBvaW50KG5kLT5kZW50cnkpICYmIGZvbGxvd19kb3duKCZuZC0+bW50LCAmbmQtPmRlbnRyeSkpCisJCTsKKwllcnIgPSAtRUlOVkFMOworCWlmICghY2hlY2tfbW50KG5kLT5tbnQpIHx8ICFjaGVja19tbnQob2xkX25kLm1udCkpCisJCWdvdG8gb3V0OworCisJZXJyID0gLUVOT0VOVDsKKwlkb3duKCZuZC0+ZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJaWYgKElTX0RFQURESVIobmQtPmRlbnRyeS0+ZF9pbm9kZSkpCisJCWdvdG8gb3V0MTsKKworCXNwaW5fbG9jaygmdmZzbW91bnRfbG9jayk7CisJaWYgKCFJU19ST09UKG5kLT5kZW50cnkpICYmIGRfdW5oYXNoZWQobmQtPmRlbnRyeSkpCisJCWdvdG8gb3V0MjsKKworCWVyciA9IC1FSU5WQUw7CisJaWYgKG9sZF9uZC5kZW50cnkgIT0gb2xkX25kLm1udC0+bW50X3Jvb3QpCisJCWdvdG8gb3V0MjsKKworCWlmIChvbGRfbmQubW50ID09IG9sZF9uZC5tbnQtPm1udF9wYXJlbnQpCisJCWdvdG8gb3V0MjsKKworCWlmIChTX0lTRElSKG5kLT5kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkgIT0KKwkgICAgICBTX0lTRElSKG9sZF9uZC5kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpCisJCWdvdG8gb3V0MjsKKworCWVyciA9IC1FTE9PUDsKKwlmb3IgKHAgPSBuZC0+bW50OyBwLT5tbnRfcGFyZW50IT1wOyBwID0gcC0+bW50X3BhcmVudCkKKwkJaWYgKHAgPT0gb2xkX25kLm1udCkKKwkJCWdvdG8gb3V0MjsKKwllcnIgPSAwOworCisJZGV0YWNoX21udChvbGRfbmQubW50LCAmcGFyZW50X25kKTsKKwlhdHRhY2hfbW50KG9sZF9uZC5tbnQsIG5kKTsKKworCS8qIGlmIHRoZSBtb3VudCBpcyBtb3ZlZCwgaXQgc2hvdWxkIG5vIGxvbmdlciBiZSBleHBpcmUKKwkgKiBhdXRvbWF0aWNhbGx5ICovCisJbGlzdF9kZWxfaW5pdCgmb2xkX25kLm1udC0+bW50X2ZzbGluayk7CitvdXQyOgorCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKK291dDE6CisJdXAoJm5kLT5kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKK291dDoKKwl1cF93cml0ZSgmY3VycmVudC0+bmFtZXNwYWNlLT5zZW0pOworCWlmICghZXJyKQorCQlwYXRoX3JlbGVhc2UoJnBhcmVudF9uZCk7CisJcGF0aF9yZWxlYXNlKCZvbGRfbmQpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBjcmVhdGUgYSBuZXcgbW91bnQgZm9yIHVzZXJzcGFjZSBhbmQgcmVxdWVzdCBpdCB0byBiZSBhZGRlZCBpbnRvIHRoZQorICogbmFtZXNwYWNlJ3MgdHJlZQorICovCitzdGF0aWMgaW50IGRvX25ld19tb3VudChzdHJ1Y3QgbmFtZWlkYXRhICpuZCwgY2hhciAqdHlwZSwgaW50IGZsYWdzLAorCQkJaW50IG1udF9mbGFncywgY2hhciAqbmFtZSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udDsKKworCWlmICghdHlwZSB8fCAhbWVtY2hyKHR5cGUsIDAsIFBBR0VfU0laRSkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogd2UgbmVlZCBjYXBhYmlsaXRpZXMuLi4gKi8KKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwltbnQgPSBkb19rZXJuX21vdW50KHR5cGUsIGZsYWdzLCBuYW1lLCBkYXRhKTsKKwlpZiAoSVNfRVJSKG1udCkpCisJCXJldHVybiBQVFJfRVJSKG1udCk7CisKKwlyZXR1cm4gZG9fYWRkX21vdW50KG1udCwgbmQsIG1udF9mbGFncywgTlVMTCk7Cit9CisKKy8qCisgKiBhZGQgYSBtb3VudCBpbnRvIGEgbmFtZXNwYWNlJ3MgbW91bnQgdHJlZQorICogLSBwcm92aWRlIHRoZSBvcHRpb24gb2YgYWRkaW5nIHRoZSBuZXcgbW91bnQgdG8gYW4gZXhwaXJhdGlvbiBsaXN0CisgKi8KK2ludCBkb19hZGRfbW91bnQoc3RydWN0IHZmc21vdW50ICpuZXdtbnQsIHN0cnVjdCBuYW1laWRhdGEgKm5kLAorCQkgaW50IG1udF9mbGFncywgc3RydWN0IGxpc3RfaGVhZCAqZnNsaXN0KQoreworCWludCBlcnI7CisKKwlkb3duX3dyaXRlKCZjdXJyZW50LT5uYW1lc3BhY2UtPnNlbSk7CisJLyogU29tZXRoaW5nIHdhcyBtb3VudGVkIGhlcmUgd2hpbGUgd2Ugc2xlcHQgKi8KKwl3aGlsZShkX21vdW50cG9pbnQobmQtPmRlbnRyeSkgJiYgZm9sbG93X2Rvd24oJm5kLT5tbnQsICZuZC0+ZGVudHJ5KSkKKwkJOworCWVyciA9IC1FSU5WQUw7CisJaWYgKCFjaGVja19tbnQobmQtPm1udCkpCisJCWdvdG8gdW5sb2NrOworCisJLyogUmVmdXNlIHRoZSBzYW1lIGZpbGVzeXN0ZW0gb24gdGhlIHNhbWUgbW91bnQgcG9pbnQgKi8KKwllcnIgPSAtRUJVU1k7CisJaWYgKG5kLT5tbnQtPm1udF9zYiA9PSBuZXdtbnQtPm1udF9zYiAmJgorCSAgICBuZC0+bW50LT5tbnRfcm9vdCA9PSBuZC0+ZGVudHJ5KQorCQlnb3RvIHVubG9jazsKKworCWVyciA9IC1FSU5WQUw7CisJaWYgKFNfSVNMTksobmV3bW50LT5tbnRfcm9vdC0+ZF9pbm9kZS0+aV9tb2RlKSkKKwkJZ290byB1bmxvY2s7CisKKwluZXdtbnQtPm1udF9mbGFncyA9IG1udF9mbGFnczsKKwllcnIgPSBncmFmdF90cmVlKG5ld21udCwgbmQpOworCisJaWYgKGVyciA9PSAwICYmIGZzbGlzdCkgeworCQkvKiBhZGQgdG8gdGhlIHNwZWNpZmllZCBleHBpcmF0aW9uIGxpc3QgKi8KKwkJc3Bpbl9sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKwkJbGlzdF9hZGRfdGFpbCgmbmV3bW50LT5tbnRfZnNsaW5rLCBmc2xpc3QpOworCQlzcGluX3VubG9jaygmdmZzbW91bnRfbG9jayk7CisJfQorCit1bmxvY2s6CisJdXBfd3JpdGUoJmN1cnJlbnQtPm5hbWVzcGFjZS0+c2VtKTsKKwltbnRwdXQobmV3bW50KTsKKwlyZXR1cm4gZXJyOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChkb19hZGRfbW91bnQpOworCisvKgorICogcHJvY2VzcyBhIGxpc3Qgb2YgZXhwaXJhYmxlIG1vdW50cG9pbnRzIHdpdGggdGhlIGludGVudCBvZiBkaXNjYXJkaW5nIGFueQorICogbW91bnRwb2ludHMgdGhhdCBhcmVuJ3QgaW4gdXNlIGFuZCBoYXZlbid0IGJlZW4gdG91Y2hlZCBzaW5jZSBsYXN0IHdlIGNhbWUKKyAqIGhlcmUKKyAqLwordm9pZCBtYXJrX21vdW50c19mb3JfZXhwaXJ5KHN0cnVjdCBsaXN0X2hlYWQgKm1vdW50cykKK3sKKwlzdHJ1Y3QgbmFtZXNwYWNlICpuYW1lc3BhY2U7CisJc3RydWN0IHZmc21vdW50ICptbnQsICpuZXh0OworCUxJU1RfSEVBRChncmF2ZXlhcmQpOworCisJaWYgKGxpc3RfZW1wdHkobW91bnRzKSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKworCS8qIGV4dHJhY3QgZnJvbSB0aGUgZXhwaXJhdGlvbiBsaXN0IGV2ZXJ5IHZmc21vdW50IHRoYXQgbWF0Y2hlcyB0aGUKKwkgKiBmb2xsb3dpbmcgY3JpdGVyaWE6CisJICogLSBvbmx5IHJlZmVyZW5jZWQgYnkgaXRzIHBhcmVudCB2ZnNtb3VudAorCSAqIC0gc3RpbGwgbWFya2VkIGZvciBleHBpcnkgKG1hcmtlZCBvbiB0aGUgbGFzdCBjYWxsIGhlcmU7IG1hcmtzIGFyZQorCSAqICAgY2xlYXJlZCBieSBtbnRwdXQoKSkKKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobW50LCBuZXh0LCBtb3VudHMsIG1udF9mc2xpbmspIHsKKwkJaWYgKCF4Y2hnKCZtbnQtPm1udF9leHBpcnlfbWFyaywgMSkgfHwKKwkJICAgIGF0b21pY19yZWFkKCZtbnQtPm1udF9jb3VudCkgIT0gMSkKKwkJCWNvbnRpbnVlOworCisJCW1udGdldChtbnQpOworCQlsaXN0X21vdmUoJm1udC0+bW50X2ZzbGluaywgJmdyYXZleWFyZCk7CisJfQorCisJLyoKKwkgKiBnbyB0aHJvdWdoIHRoZSB2ZnNtb3VudHMgd2UndmUganVzdCBjb25zaWduZWQgdG8gdGhlIGdyYXZleWFyZCB0bworCSAqIC0gY2hlY2sgdGhhdCB0aGV5J3JlIHN0aWxsIGRlYWQKKwkgKiAtIGRlbGV0ZSB0aGUgdmZzbW91bnQgZnJvbSB0aGUgYXBwcm9wcmlhdGUgbmFtZXNwYWNlIHVuZGVyIGxvY2sKKwkgKiAtIGRpc3Bvc2Ugb2YgdGhlIGNvcnBzZQorCSAqLworCXdoaWxlICghbGlzdF9lbXB0eSgmZ3JhdmV5YXJkKSkgeworCQltbnQgPSBsaXN0X2VudHJ5KGdyYXZleWFyZC5uZXh0LCBzdHJ1Y3QgdmZzbW91bnQsIG1udF9mc2xpbmspOworCQlsaXN0X2RlbF9pbml0KCZtbnQtPm1udF9mc2xpbmspOworCisJCS8qIGRvbid0IGRvIGFueXRoaW5nIGlmIHRoZSBuYW1lc3BhY2UgaXMgZGVhZCAtIGFsbCB0aGUKKwkJICogdmZzbW91bnRzIGZyb20gaXQgYXJlIGdvaW5nIGF3YXkgYW55d2F5ICovCisJCW5hbWVzcGFjZSA9IG1udC0+bW50X25hbWVzcGFjZTsKKwkJaWYgKCFuYW1lc3BhY2UgfHwgYXRvbWljX3JlYWQoJm5hbWVzcGFjZS0+Y291bnQpIDw9IDApCisJCQljb250aW51ZTsKKwkJZ2V0X25hbWVzcGFjZShuYW1lc3BhY2UpOworCisJCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKwkJZG93bl93cml0ZSgmbmFtZXNwYWNlLT5zZW0pOworCQlzcGluX2xvY2soJnZmc21vdW50X2xvY2spOworCisJCS8qIGNoZWNrIHRoYXQgaXQgaXMgc3RpbGwgZGVhZDogdGhlIGNvdW50IHNob3VsZCBub3cgYmUgMiAtIGFzCisJCSAqIGNvbnRyaWJ1dGVkIGJ5IHRoZSB2ZnNtb3VudCBwYXJlbnQgYW5kIHRoZSBtbnRnZXQgYWJvdmUgKi8KKwkJaWYgKGF0b21pY19yZWFkKCZtbnQtPm1udF9jb3VudCkgPT0gMikgeworCQkJc3RydWN0IHZmc21vdW50ICp4ZG1udDsKKwkJCXN0cnVjdCBkZW50cnkgKnhkZW50cnk7CisKKwkJCS8qIGRlbGV0ZSBmcm9tIHRoZSBuYW1lc3BhY2UgKi8KKwkJCWxpc3RfZGVsX2luaXQoJm1udC0+bW50X2xpc3QpOworCQkJbGlzdF9kZWxfaW5pdCgmbW50LT5tbnRfY2hpbGQpOworCQkJbGlzdF9kZWxfaW5pdCgmbW50LT5tbnRfaGFzaCk7CisJCQltbnQtPm1udF9tb3VudHBvaW50LT5kX21vdW50ZWQtLTsKKworCQkJeGRlbnRyeSA9IG1udC0+bW50X21vdW50cG9pbnQ7CisJCQltbnQtPm1udF9tb3VudHBvaW50ID0gbW50LT5tbnRfcm9vdDsKKwkJCXhkbW50ID0gbW50LT5tbnRfcGFyZW50OworCQkJbW50LT5tbnRfcGFyZW50ID0gbW50OworCisJCQlzcGluX3VubG9jaygmdmZzbW91bnRfbG9jayk7CisKKwkJCW1udHB1dCh4ZG1udCk7CisJCQlkcHV0KHhkZW50cnkpOworCisJCQkvKiBub3cgbGF5IGl0IHRvIHJlc3QgaWYgdGhpcyB3YXMgdGhlIGxhc3QgcmVmIG9uIHRoZQorCQkJICogc3VwZXJibG9jayAqLworCQkJaWYgKGF0b21pY19yZWFkKCZtbnQtPm1udF9zYi0+c19hY3RpdmUpID09IDEpIHsKKwkJCQkvKiBsYXN0IGluc3RhbmNlIC0gdHJ5IHRvIGJlIHNtYXJ0ICovCisJCQkJbG9ja19rZXJuZWwoKTsKKwkJCQlEUVVPVF9PRkYobW50LT5tbnRfc2IpOworCQkJCWFjY3RfYXV0b19jbG9zZShtbnQtPm1udF9zYik7CisJCQkJdW5sb2NrX2tlcm5lbCgpOworCQkJfQorCisJCQltbnRwdXQobW50KTsKKwkJfSBlbHNlIHsKKwkJCS8qIHNvbWVvbmUgYnJvdWdodCBpdCBiYWNrIHRvIGxpZmUgd2hpbHN0IHdlIGRpZG4ndAorCQkJICogaGF2ZSBhbnkgbG9ja3MgaGVsZCBzbyByZXR1cm4gaXQgdG8gdGhlIGV4cGlyYXRpb24KKwkJCSAqIGxpc3QgKi8KKwkJCWxpc3RfYWRkX3RhaWwoJm1udC0+bW50X2ZzbGluaywgbW91bnRzKTsKKwkJCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKwkJfQorCisJCXVwX3dyaXRlKCZuYW1lc3BhY2UtPnNlbSk7CisKKwkJbW50cHV0KG1udCk7CisJCXB1dF9uYW1lc3BhY2UobmFtZXNwYWNlKTsKKworCQlzcGluX2xvY2soJnZmc21vdW50X2xvY2spOworCX0KKworCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwobWFya19tb3VudHNfZm9yX2V4cGlyeSk7CisKKy8qCisgKiBTb21lIGNvcHlfZnJvbV91c2VyKCkgaW1wbGVtZW50YXRpb25zIGRvIG5vdCByZXR1cm4gdGhlIGV4YWN0IG51bWJlciBvZgorICogYnl0ZXMgcmVtYWluaW5nIHRvIGNvcHkgb24gYSBmYXVsdC4gIEJ1dCBjb3B5X21vdW50X29wdGlvbnMoKSByZXF1aXJlcyB0aGF0LgorICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gZGlmZmVycyBmcm9tIGNvcHlfZnJvbV91c2VyKCkgaW4gdGhhdCBpdCB3aWxsIG9vcHMKKyAqIG9uIGJhZCB2YWx1ZXMgb2YgYHRvJywgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIGEgc2hvcnQgY29weS4KKyAqLworc3RhdGljIGxvbmcKK2V4YWN0X2NvcHlfZnJvbV91c2VyKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQoreworCWNoYXIgKnQgPSB0bzsKKwljb25zdCBjaGFyIF9fdXNlciAqZiA9IGZyb207CisJY2hhciBjOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGZyb20sIG4pKQorCQlyZXR1cm4gbjsKKworCXdoaWxlIChuKSB7CisJCWlmIChfX2dldF91c2VyKGMsIGYpKSB7CisJCQltZW1zZXQodCwgMCwgbik7CisJCQlicmVhazsKKwkJfQorCQkqdCsrID0gYzsKKwkJZisrOworCQluLS07CisJfQorCXJldHVybiBuOworfQorCitpbnQgY29weV9tb3VudF9vcHRpb25zKGNvbnN0IHZvaWQgX191c2VyICpkYXRhLCB1bnNpZ25lZCBsb25nICp3aGVyZSkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHBhZ2U7CisJdW5zaWduZWQgbG9uZyBzaXplOworCQorCSp3aGVyZSA9IDA7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gMDsKKworCWlmICghKHBhZ2UgPSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCkpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIFdlIG9ubHkgY2FyZSB0aGF0ICpzb21lKiBkYXRhIGF0IHRoZSBhZGRyZXNzIHRoZSB1c2VyCisJICogZ2F2ZSB1cyBpcyB2YWxpZC4gIEp1c3QgaW4gY2FzZSwgd2UnbGwgemVybworCSAqIHRoZSByZW1haW5kZXIgb2YgdGhlIHBhZ2UuCisJICovCisJLyogY29weV9mcm9tX3VzZXIgY2Fubm90IGNyb3NzIFRBU0tfU0laRSAhICovCisJc2l6ZSA9IFRBU0tfU0laRSAtICh1bnNpZ25lZCBsb25nKWRhdGE7CisJaWYgKHNpemUgPiBQQUdFX1NJWkUpCisJCXNpemUgPSBQQUdFX1NJWkU7CisKKwlpID0gc2l6ZSAtIGV4YWN0X2NvcHlfZnJvbV91c2VyKCh2b2lkICopcGFnZSwgZGF0YSwgc2l6ZSk7CisJaWYgKCFpKSB7CisJCWZyZWVfcGFnZShwYWdlKTsgCisJCXJldHVybiAtRUZBVUxUOworCX0KKwlpZiAoaSAhPSBQQUdFX1NJWkUpCisJCW1lbXNldCgoY2hhciAqKXBhZ2UgKyBpLCAwLCBQQUdFX1NJWkUgLSBpKTsKKwkqd2hlcmUgPSBwYWdlOworCXJldHVybiAwOworfQorCisvKgorICogRmxhZ3MgaXMgYSAzMi1iaXQgdmFsdWUgdGhhdCBhbGxvd3MgdXAgdG8gMzEgbm9uLWZzIGRlcGVuZGVudCBmbGFncyB0bworICogYmUgZ2l2ZW4gdG8gdGhlIG1vdW50KCkgY2FsbCAoaWU6IHJlYWQtb25seSwgbm8tZGV2LCBuby1zdWlkIGV0YykuCisgKgorICogZGF0YSBpcyBhICh2b2lkICopIHRoYXQgY2FuIHBvaW50IHRvIGFueSBzdHJ1Y3R1cmUgdXAgdG8KKyAqIFBBR0VfU0laRS0xIGJ5dGVzLCB3aGljaCBjYW4gY29udGFpbiBhcmJpdHJhcnkgZnMtZGVwZW5kZW50CisgKiBpbmZvcm1hdGlvbiAob3IgYmUgTlVMTCkuCisgKgorICogUHJlLTAuOTcgdmVyc2lvbnMgb2YgbW91bnQoKSBkaWRuJ3QgaGF2ZSBhIGZsYWdzIHdvcmQuCisgKiBXaGVuIHRoZSBmbGFncyB3b3JkIHdhcyBpbnRyb2R1Y2VkIGl0cyB0b3AgaGFsZiB3YXMgcmVxdWlyZWQKKyAqIHRvIGhhdmUgdGhlIG1hZ2ljIHZhbHVlIDB4QzBFRCwgYW5kIHRoaXMgcmVtYWluZWQgc28gdW50aWwgMi40LjAtdGVzdDkuCisgKiBUaGVyZWZvcmUsIGlmIHRoaXMgbWFnaWMgbnVtYmVyIGlzIHByZXNlbnQsIGl0IGNhcnJpZXMgbm8gaW5mb3JtYXRpb24KKyAqIGFuZCBtdXN0IGJlIGRpc2NhcmRlZC4KKyAqLworbG9uZyBkb19tb3VudChjaGFyICogZGV2X25hbWUsIGNoYXIgKiBkaXJfbmFtZSwgY2hhciAqdHlwZV9wYWdlLAorCQkgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHZvaWQgKmRhdGFfcGFnZSkKK3sKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCWludCByZXR2YWwgPSAwOworCWludCBtbnRfZmxhZ3MgPSAwOworCisJLyogRGlzY2FyZCBtYWdpYyAqLworCWlmICgoZmxhZ3MgJiBNU19NR0NfTVNLKSA9PSBNU19NR0NfVkFMKQorCQlmbGFncyAmPSB+TVNfTUdDX01TSzsKKworCS8qIEJhc2ljIHNhbml0eSBjaGVja3MgKi8KKworCWlmICghZGlyX25hbWUgfHwgISpkaXJfbmFtZSB8fCAhbWVtY2hyKGRpcl9uYW1lLCAwLCBQQUdFX1NJWkUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZGV2X25hbWUgJiYgIW1lbWNocihkZXZfbmFtZSwgMCwgUEFHRV9TSVpFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZGF0YV9wYWdlKQorCQkoKGNoYXIgKilkYXRhX3BhZ2UpW1BBR0VfU0laRSAtIDFdID0gMDsKKworCS8qIFNlcGFyYXRlIHRoZSBwZXItbW91bnRwb2ludCBmbGFncyAqLworCWlmIChmbGFncyAmIE1TX05PU1VJRCkKKwkJbW50X2ZsYWdzIHw9IE1OVF9OT1NVSUQ7CisJaWYgKGZsYWdzICYgTVNfTk9ERVYpCisJCW1udF9mbGFncyB8PSBNTlRfTk9ERVY7CisJaWYgKGZsYWdzICYgTVNfTk9FWEVDKQorCQltbnRfZmxhZ3MgfD0gTU5UX05PRVhFQzsKKwlmbGFncyAmPSB+KE1TX05PU1VJRHxNU19OT0VYRUN8TVNfTk9ERVZ8TVNfQUNUSVZFKTsKKworCS8qIC4uLiBhbmQgZ2V0IHRoZSBtb3VudHBvaW50ICovCisJcmV0dmFsID0gcGF0aF9sb29rdXAoZGlyX25hbWUsIExPT0tVUF9GT0xMT1csICZuZCk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHZhbCA9IHNlY3VyaXR5X3NiX21vdW50KGRldl9uYW1lLCAmbmQsIHR5cGVfcGFnZSwgZmxhZ3MsIGRhdGFfcGFnZSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBkcHV0X291dDsKKworCWlmIChmbGFncyAmIE1TX1JFTU9VTlQpCisJCXJldHZhbCA9IGRvX3JlbW91bnQoJm5kLCBmbGFncyAmIH5NU19SRU1PVU5ULCBtbnRfZmxhZ3MsCisJCQkJICAgIGRhdGFfcGFnZSk7CisJZWxzZSBpZiAoZmxhZ3MgJiBNU19CSU5EKQorCQlyZXR2YWwgPSBkb19sb29wYmFjaygmbmQsIGRldl9uYW1lLCBmbGFncyAmIE1TX1JFQyk7CisJZWxzZSBpZiAoZmxhZ3MgJiBNU19NT1ZFKQorCQlyZXR2YWwgPSBkb19tb3ZlX21vdW50KCZuZCwgZGV2X25hbWUpOworCWVsc2UKKwkJcmV0dmFsID0gZG9fbmV3X21vdW50KCZuZCwgdHlwZV9wYWdlLCBmbGFncywgbW50X2ZsYWdzLAorCQkJCSAgICAgIGRldl9uYW1lLCBkYXRhX3BhZ2UpOworZHB1dF9vdXQ6CisJcGF0aF9yZWxlYXNlKCZuZCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworaW50IGNvcHlfbmFtZXNwYWNlKGludCBmbGFncywgc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJc3RydWN0IG5hbWVzcGFjZSAqbmFtZXNwYWNlID0gdHNrLT5uYW1lc3BhY2U7CisJc3RydWN0IG5hbWVzcGFjZSAqbmV3X25zOworCXN0cnVjdCB2ZnNtb3VudCAqcm9vdG1udCA9IE5VTEwsICpwd2RtbnQgPSBOVUxMLCAqYWx0cm9vdG1udCA9IE5VTEw7CisJc3RydWN0IGZzX3N0cnVjdCAqZnMgPSB0c2stPmZzOworCXN0cnVjdCB2ZnNtb3VudCAqcCwgKnE7CisKKwlpZiAoIW5hbWVzcGFjZSkKKwkJcmV0dXJuIDA7CisKKwlnZXRfbmFtZXNwYWNlKG5hbWVzcGFjZSk7CisKKwlpZiAoIShmbGFncyAmIENMT05FX05FV05TKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpIHsKKwkJcHV0X25hbWVzcGFjZShuYW1lc3BhY2UpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCW5ld19ucyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBuYW1lc3BhY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5ld19ucykKKwkJZ290byBvdXQ7CisKKwlhdG9taWNfc2V0KCZuZXdfbnMtPmNvdW50LCAxKTsKKwlpbml0X3J3c2VtKCZuZXdfbnMtPnNlbSk7CisJSU5JVF9MSVNUX0hFQUQoJm5ld19ucy0+bGlzdCk7CisKKwlkb3duX3dyaXRlKCZ0c2stPm5hbWVzcGFjZS0+c2VtKTsKKwkvKiBGaXJzdCBwYXNzOiBjb3B5IHRoZSB0cmVlIHRvcG9sb2d5ICovCisJbmV3X25zLT5yb290ID0gY29weV90cmVlKG5hbWVzcGFjZS0+cm9vdCwgbmFtZXNwYWNlLT5yb290LT5tbnRfcm9vdCk7CisJaWYgKCFuZXdfbnMtPnJvb3QpIHsKKwkJdXBfd3JpdGUoJnRzay0+bmFtZXNwYWNlLT5zZW0pOworCQlrZnJlZShuZXdfbnMpOworCQlnb3RvIG91dDsKKwl9CisJc3Bpbl9sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZuZXdfbnMtPmxpc3QsICZuZXdfbnMtPnJvb3QtPm1udF9saXN0KTsKKwlzcGluX3VubG9jaygmdmZzbW91bnRfbG9jayk7CisKKwkvKgorCSAqIFNlY29uZCBwYXNzOiBzd2l0Y2ggdGhlIHRzay0+ZnMtPiogZWxlbWVudHMgYW5kIG1hcmsgbmV3IHZmc21vdW50cworCSAqIGFzIGJlbG9uZ2luZyB0byBuZXcgbmFtZXNwYWNlLiAgV2UgaGF2ZSBhbHJlYWR5IGFjcXVpcmVkIGEgcHJpdmF0ZQorCSAqIGZzX3N0cnVjdCwgc28gdHNrLT5mcy0+bG9jayBpcyBub3QgbmVlZGVkLgorCSAqLworCXAgPSBuYW1lc3BhY2UtPnJvb3Q7CisJcSA9IG5ld19ucy0+cm9vdDsKKwl3aGlsZSAocCkgeworCQlxLT5tbnRfbmFtZXNwYWNlID0gbmV3X25zOworCQlpZiAoZnMpIHsKKwkJCWlmIChwID09IGZzLT5yb290bW50KSB7CisJCQkJcm9vdG1udCA9IHA7CisJCQkJZnMtPnJvb3RtbnQgPSBtbnRnZXQocSk7CisJCQl9CisJCQlpZiAocCA9PSBmcy0+cHdkbW50KSB7CisJCQkJcHdkbW50ID0gcDsKKwkJCQlmcy0+cHdkbW50ID0gbW50Z2V0KHEpOworCQkJfQorCQkJaWYgKHAgPT0gZnMtPmFsdHJvb3RtbnQpIHsKKwkJCQlhbHRyb290bW50ID0gcDsKKwkJCQlmcy0+YWx0cm9vdG1udCA9IG1udGdldChxKTsKKwkJCX0KKwkJfQorCQlwID0gbmV4dF9tbnQocCwgbmFtZXNwYWNlLT5yb290KTsKKwkJcSA9IG5leHRfbW50KHEsIG5ld19ucy0+cm9vdCk7CisJfQorCXVwX3dyaXRlKCZ0c2stPm5hbWVzcGFjZS0+c2VtKTsKKworCXRzay0+bmFtZXNwYWNlID0gbmV3X25zOworCisJaWYgKHJvb3RtbnQpCisJCW1udHB1dChyb290bW50KTsKKwlpZiAocHdkbW50KQorCQltbnRwdXQocHdkbW50KTsKKwlpZiAoYWx0cm9vdG1udCkKKwkJbW50cHV0KGFsdHJvb3RtbnQpOworCisJcHV0X25hbWVzcGFjZShuYW1lc3BhY2UpOworCXJldHVybiAwOworCitvdXQ6CisJcHV0X25hbWVzcGFjZShuYW1lc3BhY2UpOworCXJldHVybiAtRU5PTUVNOworfQorCithc21saW5rYWdlIGxvbmcgc3lzX21vdW50KGNoYXIgX191c2VyICogZGV2X25hbWUsIGNoYXIgX191c2VyICogZGlyX25hbWUsCisJCQkgIGNoYXIgX191c2VyICogdHlwZSwgdW5zaWduZWQgbG9uZyBmbGFncywKKwkJCSAgdm9pZCBfX3VzZXIgKiBkYXRhKQoreworCWludCByZXR2YWw7CisJdW5zaWduZWQgbG9uZyBkYXRhX3BhZ2U7CisJdW5zaWduZWQgbG9uZyB0eXBlX3BhZ2U7CisJdW5zaWduZWQgbG9uZyBkZXZfcGFnZTsKKwljaGFyICpkaXJfcGFnZTsKKworCXJldHZhbCA9IGNvcHlfbW91bnRfb3B0aW9ucyAodHlwZSwgJnR5cGVfcGFnZSk7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlkaXJfcGFnZSA9IGdldG5hbWUoZGlyX25hbWUpOworCXJldHZhbCA9IFBUUl9FUlIoZGlyX3BhZ2UpOworCWlmIChJU19FUlIoZGlyX3BhZ2UpKQorCQlnb3RvIG91dDE7CisKKwlyZXR2YWwgPSBjb3B5X21vdW50X29wdGlvbnMgKGRldl9uYW1lLCAmZGV2X3BhZ2UpOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIG91dDI7CisKKwlyZXR2YWwgPSBjb3B5X21vdW50X29wdGlvbnMgKGRhdGEsICZkYXRhX3BhZ2UpOworCWlmIChyZXR2YWwgPCAwKQorCQlnb3RvIG91dDM7CisKKwlsb2NrX2tlcm5lbCgpOworCXJldHZhbCA9IGRvX21vdW50KChjaGFyKilkZXZfcGFnZSwgZGlyX3BhZ2UsIChjaGFyKil0eXBlX3BhZ2UsCisJCQkgIGZsYWdzLCAodm9pZCopZGF0YV9wYWdlKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJZnJlZV9wYWdlKGRhdGFfcGFnZSk7CisKK291dDM6CisJZnJlZV9wYWdlKGRldl9wYWdlKTsKK291dDI6CisJcHV0bmFtZShkaXJfcGFnZSk7CitvdXQxOgorCWZyZWVfcGFnZSh0eXBlX3BhZ2UpOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBSZXBsYWNlIHRoZSBmcy0+e3Jvb3RtbnQscm9vdH0gd2l0aCB7bW50LGRlbnRyeX0uIFB1dCB0aGUgb2xkIHZhbHVlcy4KKyAqIEl0IGNhbiBibG9jay4gUmVxdWlyZXMgdGhlIGJpZyBsb2NrIGhlbGQuCisgKi8KK3ZvaWQgc2V0X2ZzX3Jvb3Qoc3RydWN0IGZzX3N0cnVjdCAqZnMsIHN0cnVjdCB2ZnNtb3VudCAqbW50LAorCQkgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBkZW50cnkgKm9sZF9yb290OworCXN0cnVjdCB2ZnNtb3VudCAqb2xkX3Jvb3RtbnQ7CisJd3JpdGVfbG9jaygmZnMtPmxvY2spOworCW9sZF9yb290ID0gZnMtPnJvb3Q7CisJb2xkX3Jvb3RtbnQgPSBmcy0+cm9vdG1udDsKKwlmcy0+cm9vdG1udCA9IG1udGdldChtbnQpOworCWZzLT5yb290ID0gZGdldChkZW50cnkpOworCXdyaXRlX3VubG9jaygmZnMtPmxvY2spOworCWlmIChvbGRfcm9vdCkgeworCQlkcHV0KG9sZF9yb290KTsKKwkJbW50cHV0KG9sZF9yb290bW50KTsKKwl9Cit9CisKKy8qCisgKiBSZXBsYWNlIHRoZSBmcy0+e3B3ZG1udCxwd2R9IHdpdGgge21udCxkZW50cnl9LiBQdXQgdGhlIG9sZCB2YWx1ZXMuCisgKiBJdCBjYW4gYmxvY2suIFJlcXVpcmVzIHRoZSBiaWcgbG9jayBoZWxkLgorICovCit2b2lkIHNldF9mc19wd2Qoc3RydWN0IGZzX3N0cnVjdCAqZnMsIHN0cnVjdCB2ZnNtb3VudCAqbW50LAorCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGRlbnRyeSAqb2xkX3B3ZDsKKwlzdHJ1Y3QgdmZzbW91bnQgKm9sZF9wd2RtbnQ7CisKKwl3cml0ZV9sb2NrKCZmcy0+bG9jayk7CisJb2xkX3B3ZCA9IGZzLT5wd2Q7CisJb2xkX3B3ZG1udCA9IGZzLT5wd2RtbnQ7CisJZnMtPnB3ZG1udCA9IG1udGdldChtbnQpOworCWZzLT5wd2QgPSBkZ2V0KGRlbnRyeSk7CisJd3JpdGVfdW5sb2NrKCZmcy0+bG9jayk7CisKKwlpZiAob2xkX3B3ZCkgeworCQlkcHV0KG9sZF9wd2QpOworCQltbnRwdXQob2xkX3B3ZG1udCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjaHJvb3RfZnNfcmVmcyhzdHJ1Y3QgbmFtZWlkYXRhICpvbGRfbmQsIHN0cnVjdCBuYW1laWRhdGEgKm5ld19uZCkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmcsICpwOworCXN0cnVjdCBmc19zdHJ1Y3QgKmZzOworCisJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlkb19lYWNoX3RocmVhZChnLCBwKSB7CisJCXRhc2tfbG9jayhwKTsKKwkJZnMgPSBwLT5mczsKKwkJaWYgKGZzKSB7CisJCQlhdG9taWNfaW5jKCZmcy0+Y291bnQpOworCQkJdGFza191bmxvY2socCk7CisJCQlpZiAoZnMtPnJvb3Q9PW9sZF9uZC0+ZGVudHJ5JiZmcy0+cm9vdG1udD09b2xkX25kLT5tbnQpCisJCQkJc2V0X2ZzX3Jvb3QoZnMsIG5ld19uZC0+bW50LCBuZXdfbmQtPmRlbnRyeSk7CisJCQlpZiAoZnMtPnB3ZD09b2xkX25kLT5kZW50cnkmJmZzLT5wd2RtbnQ9PW9sZF9uZC0+bW50KQorCQkJCXNldF9mc19wd2QoZnMsIG5ld19uZC0+bW50LCBuZXdfbmQtPmRlbnRyeSk7CisJCQlwdXRfZnNfc3RydWN0KGZzKTsKKwkJfSBlbHNlCisJCQl0YXNrX3VubG9jayhwKTsKKwl9IHdoaWxlX2VhY2hfdGhyZWFkKGcsIHApOworCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKK30KKworLyoKKyAqIHBpdm90X3Jvb3QgU2VtYW50aWNzOgorICogTW92ZXMgdGhlIHJvb3QgZmlsZSBzeXN0ZW0gb2YgdGhlIGN1cnJlbnQgcHJvY2VzcyB0byB0aGUgZGlyZWN0b3J5IHB1dF9vbGQsCisgKiBtYWtlcyBuZXdfcm9vdCBhcyB0aGUgbmV3IHJvb3QgZmlsZSBzeXN0ZW0gb2YgdGhlIGN1cnJlbnQgcHJvY2VzcywgYW5kIHNldHMKKyAqIHJvb3QvY3dkIG9mIGFsbCBwcm9jZXNzZXMgd2hpY2ggaGFkIHRoZW0gb24gdGhlIGN1cnJlbnQgcm9vdCB0byBuZXdfcm9vdC4KKyAqCisgKiBSZXN0cmljdGlvbnM6CisgKiBUaGUgbmV3X3Jvb3QgYW5kIHB1dF9vbGQgbXVzdCBiZSBkaXJlY3RvcmllcywgYW5kICBtdXN0IG5vdCBiZSBvbiB0aGUKKyAqIHNhbWUgZmlsZSAgc3lzdGVtIGFzIHRoZSBjdXJyZW50IHByb2Nlc3Mgcm9vdC4gVGhlIHB1dF9vbGQgIG11c3QgIGJlCisgKiB1bmRlcm5lYXRoIG5ld19yb290LCAgaS5lLiBhZGRpbmcgYSBub24temVybyBudW1iZXIgb2YgLy4uIHRvIHRoZSBzdHJpbmcKKyAqIHBvaW50ZWQgdG8gYnkgcHV0X29sZCBtdXN0IHlpZWxkIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyBuZXdfcm9vdC4gTm8gb3RoZXIKKyAqIGZpbGUgc3lzdGVtIG1heSBiZSBtb3VudGVkIG9uIHB1dF9vbGQuIEFmdGVyIGFsbCwgbmV3X3Jvb3QgaXMgYSBtb3VudHBvaW50LgorICoKKyAqIE5vdGVzOgorICogIC0gd2UgZG9uJ3QgbW92ZSByb290L2N3ZCBpZiB0aGV5IGFyZSBub3QgYXQgdGhlIHJvb3QgKHJlYXNvbjogaWYgc29tZXRoaW5nCisgKiAgICBjYXJlZCBlbm91Z2ggdG8gY2hhbmdlIHRoZW0sIGl0J3MgcHJvYmFibHkgd3JvbmcgdG8gZm9yY2UgdGhlbSBlbHNld2hlcmUpCisgKiAgLSBpdCdzIG9rYXkgdG8gcGljayBhIHJvb3QgdGhhdCBpc24ndCB0aGUgcm9vdCBvZiBhIGZpbGUgc3lzdGVtLCBlLmcuCisgKiAgICAvbmZzL215X3Jvb3Qgd2hlcmUgL25mcyBpcyB0aGUgbW91bnQgcG9pbnQuIEl0IG11c3QgYmUgYSBtb3VudHBvaW50LAorICogICAgdGhvdWdoLCBzbyB5b3UgbWF5IG5lZWQgdG8gc2F5IG1vdW50IC0tYmluZCAvbmZzL215X3Jvb3QgL25mcy9teV9yb290CisgKiAgICBmaXJzdC4KKyAqLworCithc21saW5rYWdlIGxvbmcgc3lzX3Bpdm90X3Jvb3QoY29uc3QgY2hhciBfX3VzZXIgKm5ld19yb290LCBjb25zdCBjaGFyIF9fdXNlciAqcHV0X29sZCkKK3sKKwlzdHJ1Y3QgdmZzbW91bnQgKnRtcDsKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5ld19uZCwgb2xkX25kLCBwYXJlbnRfbmQsIHJvb3RfcGFyZW50LCB1c2VyX25kOworCWludCBlcnJvcjsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWxvY2tfa2VybmVsKCk7CisKKwllcnJvciA9IF9fdXNlcl93YWxrKG5ld19yb290LCBMT09LVVBfRk9MTE9XfExPT0tVUF9ESVJFQ1RPUlksICZuZXdfbmQpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQwOworCWVycm9yID0gLUVJTlZBTDsKKwlpZiAoIWNoZWNrX21udChuZXdfbmQubW50KSkKKwkJZ290byBvdXQxOworCisJZXJyb3IgPSBfX3VzZXJfd2FsayhwdXRfb2xkLCBMT09LVVBfRk9MTE9XfExPT0tVUF9ESVJFQ1RPUlksICZvbGRfbmQpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQxOworCisJZXJyb3IgPSBzZWN1cml0eV9zYl9waXZvdHJvb3QoJm9sZF9uZCwgJm5ld19uZCk7CisJaWYgKGVycm9yKSB7CisJCXBhdGhfcmVsZWFzZSgmb2xkX25kKTsKKwkJZ290byBvdXQxOworCX0KKworCXJlYWRfbG9jaygmY3VycmVudC0+ZnMtPmxvY2spOworCXVzZXJfbmQubW50ID0gbW50Z2V0KGN1cnJlbnQtPmZzLT5yb290bW50KTsKKwl1c2VyX25kLmRlbnRyeSA9IGRnZXQoY3VycmVudC0+ZnMtPnJvb3QpOworCXJlYWRfdW5sb2NrKCZjdXJyZW50LT5mcy0+bG9jayk7CisJZG93bl93cml0ZSgmY3VycmVudC0+bmFtZXNwYWNlLT5zZW0pOworCWRvd24oJm9sZF9uZC5kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKCFjaGVja19tbnQodXNlcl9uZC5tbnQpKQorCQlnb3RvIG91dDI7CisJZXJyb3IgPSAtRU5PRU5UOworCWlmIChJU19ERUFERElSKG5ld19uZC5kZW50cnktPmRfaW5vZGUpKQorCQlnb3RvIG91dDI7CisJaWYgKGRfdW5oYXNoZWQobmV3X25kLmRlbnRyeSkgJiYgIUlTX1JPT1QobmV3X25kLmRlbnRyeSkpCisJCWdvdG8gb3V0MjsKKwlpZiAoZF91bmhhc2hlZChvbGRfbmQuZGVudHJ5KSAmJiAhSVNfUk9PVChvbGRfbmQuZGVudHJ5KSkKKwkJZ290byBvdXQyOworCWVycm9yID0gLUVCVVNZOworCWlmIChuZXdfbmQubW50ID09IHVzZXJfbmQubW50IHx8IG9sZF9uZC5tbnQgPT0gdXNlcl9uZC5tbnQpCisJCWdvdG8gb3V0MjsgLyogbG9vcCwgb24gdGhlIHNhbWUgZmlsZSBzeXN0ZW0gICovCisJZXJyb3IgPSAtRUlOVkFMOworCWlmICh1c2VyX25kLm1udC0+bW50X3Jvb3QgIT0gdXNlcl9uZC5kZW50cnkpCisJCWdvdG8gb3V0MjsgLyogbm90IGEgbW91bnRwb2ludCAqLworCWlmIChuZXdfbmQubW50LT5tbnRfcm9vdCAhPSBuZXdfbmQuZGVudHJ5KQorCQlnb3RvIG91dDI7IC8qIG5vdCBhIG1vdW50cG9pbnQgKi8KKwl0bXAgPSBvbGRfbmQubW50OyAvKiBtYWtlIHN1cmUgd2UgY2FuIHJlYWNoIHB1dF9vbGQgZnJvbSBuZXdfcm9vdCAqLworCXNwaW5fbG9jaygmdmZzbW91bnRfbG9jayk7CisJaWYgKHRtcCAhPSBuZXdfbmQubW50KSB7CisJCWZvciAoOzspIHsKKwkJCWlmICh0bXAtPm1udF9wYXJlbnQgPT0gdG1wKQorCQkJCWdvdG8gb3V0MzsgLyogYWxyZWFkeSBtb3VudGVkIG9uIHB1dF9vbGQgKi8KKwkJCWlmICh0bXAtPm1udF9wYXJlbnQgPT0gbmV3X25kLm1udCkKKwkJCQlicmVhazsKKwkJCXRtcCA9IHRtcC0+bW50X3BhcmVudDsKKwkJfQorCQlpZiAoIWlzX3N1YmRpcih0bXAtPm1udF9tb3VudHBvaW50LCBuZXdfbmQuZGVudHJ5KSkKKwkJCWdvdG8gb3V0MzsKKwl9IGVsc2UgaWYgKCFpc19zdWJkaXIob2xkX25kLmRlbnRyeSwgbmV3X25kLmRlbnRyeSkpCisJCWdvdG8gb3V0MzsKKwlkZXRhY2hfbW50KG5ld19uZC5tbnQsICZwYXJlbnRfbmQpOworCWRldGFjaF9tbnQodXNlcl9uZC5tbnQsICZyb290X3BhcmVudCk7CisJYXR0YWNoX21udCh1c2VyX25kLm1udCwgJm9sZF9uZCk7ICAgICAvKiBtb3VudCBvbGQgcm9vdCBvbiBwdXRfb2xkICovCisJYXR0YWNoX21udChuZXdfbmQubW50LCAmcm9vdF9wYXJlbnQpOyAvKiBtb3VudCBuZXdfcm9vdCBvbiAvICovCisJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOworCWNocm9vdF9mc19yZWZzKCZ1c2VyX25kLCAmbmV3X25kKTsKKwlzZWN1cml0eV9zYl9wb3N0X3Bpdm90cm9vdCgmdXNlcl9uZCwgJm5ld19uZCk7CisJZXJyb3IgPSAwOworCXBhdGhfcmVsZWFzZSgmcm9vdF9wYXJlbnQpOworCXBhdGhfcmVsZWFzZSgmcGFyZW50X25kKTsKK291dDI6CisJdXAoJm9sZF9uZC5kZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwl1cF93cml0ZSgmY3VycmVudC0+bmFtZXNwYWNlLT5zZW0pOworCXBhdGhfcmVsZWFzZSgmdXNlcl9uZCk7CisJcGF0aF9yZWxlYXNlKCZvbGRfbmQpOworb3V0MToKKwlwYXRoX3JlbGVhc2UoJm5ld19uZCk7CitvdXQwOgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyb3I7CitvdXQzOgorCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKwlnb3RvIG91dDI7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0X21vdW50X3RyZWUodm9pZCkKK3sKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udDsKKwlzdHJ1Y3QgbmFtZXNwYWNlICpuYW1lc3BhY2U7CisJc3RydWN0IHRhc2tfc3RydWN0ICpnLCAqcDsKKworCW1udCA9IGRvX2tlcm5fbW91bnQoInJvb3RmcyIsIDAsICJyb290ZnMiLCBOVUxMKTsKKwlpZiAoSVNfRVJSKG1udCkpCisJCXBhbmljKCJDYW4ndCBjcmVhdGUgcm9vdGZzIik7CisJbmFtZXNwYWNlID0ga21hbGxvYyhzaXplb2YoKm5hbWVzcGFjZSksIEdGUF9LRVJORUwpOworCWlmICghbmFtZXNwYWNlKQorCQlwYW5pYygiQ2FuJ3QgYWxsb2NhdGUgaW5pdGlhbCBuYW1lc3BhY2UiKTsKKwlhdG9taWNfc2V0KCZuYW1lc3BhY2UtPmNvdW50LCAxKTsKKwlJTklUX0xJU1RfSEVBRCgmbmFtZXNwYWNlLT5saXN0KTsKKwlpbml0X3J3c2VtKCZuYW1lc3BhY2UtPnNlbSk7CisJbGlzdF9hZGQoJm1udC0+bW50X2xpc3QsICZuYW1lc3BhY2UtPmxpc3QpOworCW5hbWVzcGFjZS0+cm9vdCA9IG1udDsKKwltbnQtPm1udF9uYW1lc3BhY2UgPSBuYW1lc3BhY2U7CisKKwlpbml0X3Rhc2submFtZXNwYWNlID0gbmFtZXNwYWNlOworCXJlYWRfbG9jaygmdGFza2xpc3RfbG9jayk7CisJZG9fZWFjaF90aHJlYWQoZywgcCkgeworCQlnZXRfbmFtZXNwYWNlKG5hbWVzcGFjZSk7CisJCXAtPm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKKwl9IHdoaWxlX2VhY2hfdGhyZWFkKGcsIHApOworCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKworCXNldF9mc19wd2QoY3VycmVudC0+ZnMsIG5hbWVzcGFjZS0+cm9vdCwgbmFtZXNwYWNlLT5yb290LT5tbnRfcm9vdCk7CisJc2V0X2ZzX3Jvb3QoY3VycmVudC0+ZnMsIG5hbWVzcGFjZS0+cm9vdCwgbmFtZXNwYWNlLT5yb290LT5tbnRfcm9vdCk7Cit9CisKK3ZvaWQgX19pbml0IG1udF9pbml0KHVuc2lnbmVkIGxvbmcgbWVtcGFnZXMpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqZDsKKwl1bnNpZ25lZCBpbnQgbnJfaGFzaDsKKwlpbnQgaTsKKworCW1udF9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJtbnRfY2FjaGUiLCBzaXplb2Yoc3RydWN0IHZmc21vdW50KSwKKwkJCTAsIFNMQUJfSFdDQUNIRV9BTElHTnxTTEFCX1BBTklDLCBOVUxMLCBOVUxMKTsKKworCW1vdW50X2hhc2h0YWJsZSA9IChzdHJ1Y3QgbGlzdF9oZWFkICopCisJCV9fZ2V0X2ZyZWVfcGFnZShHRlBfQVRPTUlDKTsKKworCWlmICghbW91bnRfaGFzaHRhYmxlKQorCQlwYW5pYygiRmFpbGVkIHRvIGFsbG9jYXRlIG1vdW50IGhhc2ggdGFibGVcbiIpOworCisJLyoKKwkgKiBGaW5kIHRoZSBwb3dlci1vZi10d28gbGlzdC1oZWFkcyB0aGF0IGNhbiBmaXQgaW50byB0aGUgYWxsb2NhdGlvbi4uCisJICogV2UgZG9uJ3QgZ3VhcmFudGVlIHRoYXQgInNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKSIgaXMgbmVjZXNzYXJpbHkKKwkgKiBhIHBvd2VyLW9mLXR3by4KKwkgKi8KKwlucl9oYXNoID0gUEFHRV9TSVpFIC8gc2l6ZW9mKHN0cnVjdCBsaXN0X2hlYWQpOworCWhhc2hfYml0cyA9IDA7CisJZG8geworCQloYXNoX2JpdHMrKzsKKwl9IHdoaWxlICgobnJfaGFzaCA+PiBoYXNoX2JpdHMpICE9IDApOworCWhhc2hfYml0cy0tOworCisJLyoKKwkgKiBSZS1jYWxjdWxhdGUgdGhlIGFjdHVhbCBudW1iZXIgb2YgZW50cmllcyBhbmQgdGhlIG1hc2sKKwkgKiBmcm9tIHRoZSBudW1iZXIgb2YgYml0cyB3ZSBjYW4gZml0LgorCSAqLworCW5yX2hhc2ggPSAxVUwgPDwgaGFzaF9iaXRzOworCWhhc2hfbWFzayA9IG5yX2hhc2gtMTsKKworCXByaW50aygiTW91bnQtY2FjaGUgaGFzaCB0YWJsZSBlbnRyaWVzOiAlZFxuIiwgbnJfaGFzaCk7CisKKwkvKiBBbmQgaW5pdGlhbGl6ZSB0aGUgbmV3bHkgYWxsb2NhdGVkIGFycmF5ICovCisJZCA9IG1vdW50X2hhc2h0YWJsZTsKKwlpID0gbnJfaGFzaDsKKwlkbyB7CisJCUlOSVRfTElTVF9IRUFEKGQpOworCQlkKys7CisJCWktLTsKKwl9IHdoaWxlIChpKTsKKwlzeXNmc19pbml0KCk7CisJaW5pdF9yb290ZnMoKTsKKwlpbml0X21vdW50X3RyZWUoKTsKK30KKwordm9pZCBfX3B1dF9uYW1lc3BhY2Uoc3RydWN0IG5hbWVzcGFjZSAqbmFtZXNwYWNlKQoreworCXN0cnVjdCB2ZnNtb3VudCAqbW50OworCisJZG93bl93cml0ZSgmbmFtZXNwYWNlLT5zZW0pOworCXNwaW5fbG9jaygmdmZzbW91bnRfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1udCwgJm5hbWVzcGFjZS0+bGlzdCwgbW50X2xpc3QpIHsKKwkJbW50LT5tbnRfbmFtZXNwYWNlID0gTlVMTDsKKwl9CisKKwl1bW91bnRfdHJlZShuYW1lc3BhY2UtPnJvb3QpOworCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKwl1cF93cml0ZSgmbmFtZXNwYWNlLT5zZW0pOworCWtmcmVlKG5hbWVzcGFjZSk7Cit9CmRpZmYgLS1naXQgYS9mcy9uY3Bmcy9LY29uZmlnIGIvZnMvbmNwZnMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDI4MDg0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbmNwZnMvS2NvbmZpZwpAQCAtMCwwICsxLDg3IEBACisjCisjIE5DUCBGaWxlc3lzdGVtIGNvbmZpZ3VyYXRpb24KKyMKK2NvbmZpZyBOQ1BGU19QQUNLRVRfU0lHTklORworCWJvb2wgIlBhY2tldCBzaWduYXR1cmVzIgorCWRlcGVuZHMgb24gTkNQX0ZTCisJaGVscAorCSAgTkNQIGFsbG93cyBwYWNrZXRzIHRvIGJlIHNpZ25lZCBmb3Igc3Ryb25nZXIgc2VjdXJpdHkuIElmIHlvdSB3YW50CisJICBzZWN1cml0eSwgc2F5IFkuICBOb3JtYWwgdXNlcnMgY2FuIGxlYXZlIGl0IG9mZi4gIFRvIGJlIGFibGUgdG8gdXNlCisJICBwYWNrZXQgc2lnbmluZyB5b3UgbXVzdCB1c2UgbmNwZnMgPiAyLjAuMTIuCisKK2NvbmZpZyBOQ1BGU19JT0NUTF9MT0NLSU5HCisJYm9vbCAiUHJvcHJpZXRhcnkgZmlsZSBsb2NraW5nIgorCWRlcGVuZHMgb24gTkNQX0ZTCisJaGVscAorCSAgQWxsb3dzIGxvY2tpbmcgb2YgcmVjb3JkcyBvbiByZW1vdGUgdm9sdW1lcy4gIFNheSBOIHVubGVzcyB5b3UgaGF2ZQorCSAgc3BlY2lhbCBhcHBsaWNhdGlvbnMgd2hpY2ggYXJlIGFibGUgdG8gdXRpbGl6ZSB0aGlzIGxvY2tpbmcgc2NoZW1lLgorCitjb25maWcgTkNQRlNfU1RST05HCisJYm9vbCAiQ2xlYXIgcmVtb3ZlL2RlbGV0ZSBpbmhpYml0IHdoZW4gbmVlZGVkIgorCWRlcGVuZHMgb24gTkNQX0ZTCisJaGVscAorCSAgQWxsb3dzIG1hbmlwdWxhdGlvbiBvZiBmaWxlcyBmbGFnZ2VkIGFzIERlbGV0ZSBvciBSZW5hbWUgSW5oaWJpdC4KKwkgIFRvIHVzZSB0aGlzIGZlYXR1cmUgeW91IG11c3QgbW91bnQgdm9sdW1lcyB3aXRoIHRoZSBuY3Btb3VudAorCSAgcGFyYW1ldGVyICItcyIgKG5jcGZzLTIuMC4xMiBhbmQgbmV3ZXIpLiAgU2F5IFkgdW5sZXNzIHlvdSBhcmUgbm90CisJICBtb3VudGluZyB2b2x1bWVzIHdpdGggLWYgNDQ0LgorCitjb25maWcgTkNQRlNfTkZTX05TCisJYm9vbCAiVXNlIE5GUyBuYW1lc3BhY2UgaWYgYXZhaWxhYmxlIgorCWRlcGVuZHMgb24gTkNQX0ZTCisJaGVscAorCSAgQWxsb3dzIHlvdSB0byB1dGlsaXplIE5GUyBuYW1lc3BhY2Ugb24gTmV0V2FyZSBzZXJ2ZXJzLiAgSXQgYnJpbmdzCisJICB5b3UgY2FzZSBzZW5zaXRpdmUgZmlsZW5hbWVzLiAgU2F5IFkuICBZb3UgY2FuIGRpc2FibGUgaXQgYXQKKwkgIG1vdW50LXRpbWUgd2l0aCB0aGUgYC1OIG5mcycgcGFyYW1ldGVyIG9mIG5jcG1vdW50LgorCitjb25maWcgTkNQRlNfT1MyX05TCisJYm9vbCAiVXNlIExPTkcgKE9TLzIpIG5hbWVzcGFjZSBpZiBhdmFpbGFibGUiCisJZGVwZW5kcyBvbiBOQ1BfRlMKKwloZWxwCisJICBBbGxvd3MgeW91IHRvIHV0aWxpemUgT1MyL0xPTkcgbmFtZXNwYWNlIG9uIE5ldFdhcmUgc2VydmVycy4KKwkgIEZpbGVuYW1lcyBpbiB0aGlzIG5hbWVzcGFjZSBhcmUgbGltaXRlZCB0byAyNTUgY2hhcmFjdGVycywgdGhleSBhcmUKKwkgIGNhc2UgaW5zZW5zaXRpdmUsIGFuZCBjYXNlIGluIG5hbWVzIGlzIHByZXNlcnZlZC4gIFNheSBZLiAgWW91IGNhbgorCSAgZGlzYWJsZSBpdCBhdCBtb3VudCB0aW1lIHdpdGggdGhlIC1OIG9zMiBwYXJhbWV0ZXIgb2YgbmNwbW91bnQuCisKK2NvbmZpZyBOQ1BGU19TTUFMTERPUworCWJvb2wgIkxvd2VyY2FzZSBET1MgZmlsZW5hbWVzIgorCWRlcGVuZHMgb24gTkNQX0ZTCisJLS0taGVscC0tLQorCSAgSWYgeW91IHNheSBZIGhlcmUsIGV2ZXJ5IGZpbGVuYW1lIG9uIGEgTmV0V2FyZSBzZXJ2ZXIgdm9sdW1lIHVzaW5nCisJICB0aGUgT1MyL0xPTkcgbmFtZXNwYWNlIGFuZCBjcmVhdGVkIHVuZGVyIERPUyBvciBvbiBhIHZvbHVtZSB1c2luZworCSAgRE9TIG5hbWVzcGFjZSB3aWxsIGJlIGNvbnZlcnRlZCB0byBsb3dlcmNhc2UgY2hhcmFjdGVycy4KKwkgIFNheWluZyBOIGhlcmUgd2lsbCBnaXZlIHlvdSB0aGVzZSBmaWxlbmFtZXMgaW4gdXBwZXJjYXNlLgorCisJICBUaGlzIGlzIG9ubHkgYSBjb3NtZXRpYyBvcHRpb24gc2luY2UgdGhlIE9TMi9MT05HIG5hbWVzcGFjZSBpcyBjYXNlCisJICBpbnNlbnNpdGl2ZS4gVGhlIG9ubHkgbWFqb3IgcmVhc29uIGZvciB0aGlzIG9wdGlvbiBpcyBiYWNrd2FyZAorCSAgY29tcGF0aWJpbGl0eSB3aGVuIG1vdmluZyBmcm9tIERPUyB0byBPUzIvTE9ORyBuYW1lc3BhY2Ugc3VwcG9ydC4KKwkgIExvbmcgZmlsZW5hbWVzIChjcmVhdGVkIGJ5IFdpbjk1KSB3aWxsIG5vdCBiZSBhZmZlY3RlZC4KKworCSAgVGhpcyBvcHRpb24gZG9lcyBub3Qgc29sdmUgdGhlIHByb2JsZW0gdGhhdCBmaWxlbmFtZXMgYXBwZWFyCisJICBkaWZmZXJlbnRseSB1bmRlciBMaW51eCBhbmQgdW5kZXIgV2luZG93cywgc2luY2UgV2luZG93cyBkb2VzIGFuCisJICBhZGRpdGlvbmFsIGNvbnZlcnNpb25zIG9uIHRoZSBjbGllbnQgc2lkZS4gWW91IGNhbiBhY2hpZXZlIHNpbWlsYXIKKwkgIGVmZmVjdHMgYnkgc2F5aW5nIFkgdG8gIkFsbG93IHVzaW5nIG9mIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0IgorCSAgYmVsb3cuCisKK2NvbmZpZyBOQ1BGU19OTFMKKwlib29sICJVc2UgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQiCisJZGVwZW5kcyBvbiBOQ1BfRlMKKwlzZWxlY3QgTkxTCisJaGVscAorCSAgQWxsb3dzIHlvdSB0byB1c2UgY29kZXBhZ2VzIGFuZCBJL08gY2hhcnNldHMgZm9yIGZpbGUgbmFtZQorCSAgdHJhbnNsYXRpb24gYmV0d2VlbiB0aGUgc2VydmVyIGZpbGUgc3lzdGVtIGFuZCBpbnB1dC9vdXRwdXQuIFRoaXMKKwkgIG1heSBiZSB1c2VmdWwsIGlmIHlvdSB3YW50IHRvIGFjY2VzcyB0aGUgc2VydmVyIHdpdGggb3RoZXIgb3BlcmF0aW5nCisJICBzeXN0ZW1zLCBlLmcuIFdpbmRvd3MgOTUuIFNlZSBhbHNvIE5MUyBmb3IgbW9yZSBJbmZvcm1hdGlvbi4KKworCSAgVG8gc2VsZWN0IGNvZGVwYWdlcyBhbmQgSS9PIGNoYXJzZXRzIHVzZSBuY3Bmcy0yLjIuMC4xMyBvciBuZXdlci4KKworY29uZmlnIE5DUEZTX0VYVFJBUworCWJvb2wgIkVuYWJsZSBzeW1ib2xpYyBsaW5rcyBhbmQgZXhlY3V0ZSBmbGFncyIKKwlkZXBlbmRzIG9uIE5DUF9GUworCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyB0aGUgdXNlIG9mIHN5bWJvbGljIGxpbmtzIGFuZCBhbiBleGVjdXRlIHBlcm1pc3Npb24KKwkgIGJpdCBvbiBOQ1BGUy4gVGhlIGZpbGUgc2VydmVyIG5lZWQgbm90IGhhdmUgbG9uZyBuYW1lIHNwYWNlIG9yIE5GUworCSAgbmFtZSBzcGFjZSBsb2FkZWQgZm9yIHRoZXNlIHRvIHdvcmsuCisKKwkgIFRvIHVzZSB0aGUgbmV3IGF0dHJpYnV0ZXMsIGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgZmxhZ3MKKwkgICctZiA2MDAgLWQgNzU1JyBvbiB0aGUgbmNwbW91bnQgY29tbWFuZCBsaW5lLgorCmRpZmYgLS1naXQgYS9mcy9uY3Bmcy9NYWtlZmlsZSBiL2ZzL25jcGZzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZWEwOTUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uY3Bmcy9NYWtlZmlsZQpAQCAtMCwwICsxLDE2IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgbGludXggbmNwIGZpbGVzeXN0ZW0gcm91dGluZXMuCisjCisKK29iai0kKENPTkZJR19OQ1BfRlMpICs9IG5jcGZzLm8KKworbmNwZnMteSAgICAgIDo9IGRpci5vIGZpbGUubyBpbm9kZS5vIGlvY3RsLm8gbW1hcC5vIG5jcGxpYl9rZXJuZWwubyBzb2NrLm8gXAorCQluY3BzaWduX2tlcm5lbC5vIGdldG9wdC5vCisKK25jcGZzLSQoQ09ORklHX05DUEZTX0VYVFJBUykgICArPSBzeW1saW5rLm8KK25jcGZzLSQoQ09ORklHX05DUEZTX05GU19OUykgICArPSBzeW1saW5rLm8KKworIyBJZiB5b3Ugd2FudCBkZWJ1Z2dpbmcgb3V0cHV0LCBwbGVhc2UgdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZQorIyBFWFRSQV9DRkxBR1MgKz0gLURERUJVR19OQ1A9MQorCitDRkxBR1NfbmNwbGliX2tlcm5lbC5vIDo9IC1maW5saW5lLWZ1bmN0aW9ucwpkaWZmIC0tZ2l0IGEvZnMvbmNwZnMvZGlyLmMgYi9mcy9uY3Bmcy9kaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGMyZDg2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbmNwZnMvZGlyLmMKQEAgLTAsMCArMSwxMjYwIEBACisvKgorICogIGRpci5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBieSBWb2xrZXIgTGVuZGVja2UKKyAqICBNb2RpZmllZCBmb3IgYmlnIGVuZGlhbiBieSBKLkYuIENoYWRpbWEgYW5kIERhdmlkIFMuIE1pbGxlcgorICogIE1vZGlmaWVkIDE5OTcgUGV0ZXIgV2FsdGVuYmVyZywgQmlsbCBIYXdlcywgRGF2aWQgV29vZGhvdXNlIGZvciAyLjEgZGNhY2hlCisgKiAgTW9kaWZpZWQgMTk5OCwgMTk5OSBXb2xmcmFtIFBpZW5rb3NzIGZvciBOTFMKKyAqICBNb2RpZmllZCAxOTk5IFdvbGZyYW0gUGllbmtvc3MgZm9yIGRpcmVjdG9yeSBjYWNoaW5nCisgKiAgTW9kaWZpZWQgMjAwMCBCZW4gSGFycmlzLCBVbml2ZXJzaXR5IG9mIENhbWJyaWRnZSBmb3IgTkZTIE5TIG1ldGEtaW5mbworICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uY3BfZnMuaD4KKworI2luY2x1ZGUgIm5jcGxpYl9rZXJuZWwuaCIKKworc3RhdGljIHZvaWQgbmNwX3JlYWRfdm9sdW1lX2xpc3Qoc3RydWN0IGZpbGUgKiwgdm9pZCAqLCBmaWxsZGlyX3QsCisJCQkJc3RydWN0IG5jcF9jYWNoZV9jb250cm9sICopOworc3RhdGljIHZvaWQgbmNwX2RvX3JlYWRkaXIoc3RydWN0IGZpbGUgKiwgdm9pZCAqLCBmaWxsZGlyX3QsCisJCQkJc3RydWN0IG5jcF9jYWNoZV9jb250cm9sICopOworCitzdGF0aWMgaW50IG5jcF9yZWFkZGlyKHN0cnVjdCBmaWxlICosIHZvaWQgKiwgZmlsbGRpcl90KTsKKworc3RhdGljIGludCBuY3BfY3JlYXRlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCwgc3RydWN0IG5hbWVpZGF0YSAqKTsKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpuY3BfbG9va3VwKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBuYW1laWRhdGEgKik7CitzdGF0aWMgaW50IG5jcF91bmxpbmsoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKik7CitzdGF0aWMgaW50IG5jcF9ta2RpcihzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLCBpbnQpOworc3RhdGljIGludCBuY3Bfcm1kaXIoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKik7CitzdGF0aWMgaW50IG5jcF9yZW5hbWUoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKiwKKwkgIAkgICAgICBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqKTsKK3N0YXRpYyBpbnQgbmNwX21rbm9kKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkgICAgIGludCBtb2RlLCBkZXZfdCByZGV2KTsKKyNpZiBkZWZpbmVkKENPTkZJR19OQ1BGU19FWFRSQVMpIHx8IGRlZmluZWQoQ09ORklHX05DUEZTX05GU19OUykKK2V4dGVybiBpbnQgbmNwX3N5bWxpbmsoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKiwgY29uc3QgY2hhciAqKTsKKyNlbHNlCisjZGVmaW5lIG5jcF9zeW1saW5rIE5VTEwKKyNlbmRpZgorCQkgICAgICAKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgbmNwX2Rpcl9vcGVyYXRpb25zID0KK3sKKwkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAorCS5yZWFkZGlyCT0gbmNwX3JlYWRkaXIsCisJLmlvY3RsCQk9IG5jcF9pb2N0bCwKK307CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIG5jcF9kaXJfaW5vZGVfb3BlcmF0aW9ucyA9Cit7CisJLmNyZWF0ZQkJPSBuY3BfY3JlYXRlLAorCS5sb29rdXAJCT0gbmNwX2xvb2t1cCwKKwkudW5saW5rCQk9IG5jcF91bmxpbmssCisJLnN5bWxpbmsJPSBuY3Bfc3ltbGluaywKKwkubWtkaXIJCT0gbmNwX21rZGlyLAorCS5ybWRpcgkJPSBuY3Bfcm1kaXIsCisJLm1rbm9kCQk9IG5jcF9ta25vZCwKKwkucmVuYW1lCQk9IG5jcF9yZW5hbWUsCisJLnNldGF0dHIJPSBuY3Bfbm90aWZ5X2NoYW5nZSwKK307CisKKy8qCisgKiBEZW50cnkgb3BlcmF0aW9ucyByb3V0aW5lcworICovCitzdGF0aWMgaW50IG5jcF9sb29rdXBfdmFsaWRhdGUoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgbmFtZWlkYXRhICopOworc3RhdGljIGludCBuY3BfaGFzaF9kZW50cnkoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3QgcXN0ciAqKTsKK3N0YXRpYyBpbnQgbmNwX2NvbXBhcmVfZGVudHJ5IChzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBxc3RyICosIHN0cnVjdCBxc3RyICopOworc3RhdGljIGludCBuY3BfZGVsZXRlX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICopOworCitzdGF0aWMgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIG5jcF9kZW50cnlfb3BlcmF0aW9ucyA9Cit7CisJLmRfcmV2YWxpZGF0ZQk9IG5jcF9sb29rdXBfdmFsaWRhdGUsCisJLmRfaGFzaAkJPSBuY3BfaGFzaF9kZW50cnksCisJLmRfY29tcGFyZQk9IG5jcF9jb21wYXJlX2RlbnRyeSwKKwkuZF9kZWxldGUJPSBuY3BfZGVsZXRlX2RlbnRyeSwKK307CisKK3N0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBuY3Bfcm9vdF9kZW50cnlfb3BlcmF0aW9ucyA9Cit7CisJLmRfaGFzaAkJPSBuY3BfaGFzaF9kZW50cnksCisJLmRfY29tcGFyZQk9IG5jcF9jb21wYXJlX2RlbnRyeSwKKwkuZF9kZWxldGUJPSBuY3BfZGVsZXRlX2RlbnRyeSwKK307CisKKworLyoKKyAqIE5vdGU6IGxlYXZlIHRoZSBoYXNoIHVuY2hhbmdlZCBpZiB0aGUgZGlyZWN0b3J5CisgKiBpcyBjYXNlLXNlbnNpdGl2ZS4KKyAqLworc3RhdGljIGludCAKK25jcF9oYXNoX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICp0aGlzKQoreworCXN0cnVjdCBubHNfdGFibGUgKnQ7CisJdW5zaWduZWQgbG9uZyBoYXNoOworCWludCBpOworCisJdCA9IE5DUF9JT19UQUJMRShkZW50cnkpOworCisJaWYgKCFuY3BfY2FzZV9zZW5zaXRpdmUoZGVudHJ5LT5kX2lub2RlKSkgeworCQloYXNoID0gaW5pdF9uYW1lX2hhc2goKTsKKwkJZm9yIChpPTA7IGk8dGhpcy0+bGVuIDsgaSsrKQorCQkJaGFzaCA9IHBhcnRpYWxfbmFtZV9oYXNoKG5jcF90b2xvd2VyKHQsIHRoaXMtPm5hbWVbaV0pLAorCQkJCQkJCQkJaGFzaCk7CisJCXRoaXMtPmhhc2ggPSBlbmRfbmFtZV9oYXNoKGhhc2gpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbmNwX2NvbXBhcmVfZGVudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHFzdHIgKmEsIHN0cnVjdCBxc3RyICpiKQoreworCWlmIChhLT5sZW4gIT0gYi0+bGVuKQorCQlyZXR1cm4gMTsKKworCWlmIChuY3BfY2FzZV9zZW5zaXRpdmUoZGVudHJ5LT5kX2lub2RlKSkKKwkJcmV0dXJuIHN0cm5jbXAoYS0+bmFtZSwgYi0+bmFtZSwgYS0+bGVuKTsKKworCXJldHVybiBuY3Bfc3RybmljbXAoTkNQX0lPX1RBQkxFKGRlbnRyeSksIGEtPm5hbWUsIGItPm5hbWUsIGEtPmxlbik7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBjYWxsYmFjayBmcm9tIGRwdXQoKSB3aGVuIGRfY291bnQgaXMgZ29pbmcgdG8gMC4KKyAqIFdlIHVzZSB0aGlzIHRvIHVuaGFzaCBkZW50cmllcyB3aXRoIGJhZCBpbm9kZXMuCisgKiBDbG9zaW5nIGZpbGVzIGNhbiBiZSBzYWZlbHkgcG9zdHBvbmVkIHVudGlsIGlwdXQoKSAtIGl0J3MgZG9uZSB0aGVyZSBhbnl3YXkuCisgKi8KK3N0YXRpYyBpbnQKK25jcF9kZWxldGVfZGVudHJ5KHN0cnVjdCBkZW50cnkgKiBkZW50cnkpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKworCWlmIChpbm9kZSkgeworCQlpZiAoaXNfYmFkX2lub2RlKGlub2RlKSkKKwkJCXJldHVybiAxOworCX0gZWxzZQorCXsKKwkvKiBOLkIuIFVuaGFzaCBuZWdhdGl2ZSBkZW50cmllcz8gKi8KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CituY3Bfc2luZ2xlX3ZvbHVtZShzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyKQoreworCXJldHVybiAoc2VydmVyLT5tLm1vdW50ZWRfdm9sWzBdICE9ICdcMCcpOworfQorCitzdGF0aWMgaW5saW5lIGludCBuY3BfaXNfc2VydmVyX3Jvb3Qoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gKCFuY3Bfc2luZ2xlX3ZvbHVtZShOQ1BfU0VSVkVSKGlub2RlKSkgJiYKKwkJaW5vZGUgPT0gaW5vZGUtPmlfc2ItPnNfcm9vdC0+ZF9pbm9kZSk7Cit9CisKKworLyoKKyAqIFRoaXMgaXMgdGhlIGNhbGxiYWNrIHdoZW4gdGhlIGRjYWNoZSBoYXMgYSBsb29rdXAgaGl0LgorICovCisKKworI2lmZGVmIENPTkZJR19OQ1BGU19TVFJPTkcKKy8qIHRyeSB0byBkZWxldGUgYSByZWFkb25seSBmaWxlIChOVyBSIGJpdCBzZXQpICovCisKK3N0YXRpYyBpbnQKK25jcF9mb3JjZV91bmxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkqIGRlbnRyeSkKK3sKKyAgICAgICAgaW50IHJlcz0weDljLHJlczI7CisJc3RydWN0IG53X21vZGlmeV9kb3NfaW5mbyBpbmZvOworCV9fbGUzMiBvbGRfbndhdHRyOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwltZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisJCisgICAgICAgIC8qIHJlbW92ZSB0aGUgUmVhZC1Pbmx5IGZsYWcgb24gdGhlIE5XIHNlcnZlciAqLworCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCisJb2xkX253YXR0ciA9IE5DUF9GSU5GTyhpbm9kZSktPm53YXR0cjsKKwlpbmZvLmF0dHJpYnV0ZXMgPSBvbGRfbndhdHRyICYgfihhUk9OTFl8YURFTEVURUlOSElCSVR8YVJFTkFNRUlOSElCSVQpOworCXJlczIgPSBuY3BfbW9kaWZ5X2ZpbGVfb3Jfc3ViZGlyX2Rvc19pbmZvX3BhdGgoTkNQX1NFUlZFUihpbm9kZSksIGlub2RlLCBOVUxMLCBETV9BVFRSSUJVVEVTLCAmaW5mbyk7CisJaWYgKHJlczIpCisJCWdvdG8gbGVhdmVfbWU7CisKKyAgICAgICAgLyogbm93IHRyeSBhZ2FpbiB0aGUgZGVsZXRlIG9wZXJhdGlvbiAqLworICAgICAgICByZXMgPSBuY3BfZGVsX2ZpbGVfb3Jfc3ViZGlyMihOQ1BfU0VSVkVSKGRpciksIGRlbnRyeSk7CisKKyAgICAgICAgaWYgKHJlcykgIC8qIGRlbGV0ZSBmYWlsZWQsIHNldCBSIGJpdCBhZ2FpbiAqLworICAgICAgICB7CisJCWluZm8uYXR0cmlidXRlcyA9IG9sZF9ud2F0dHI7CisJCXJlczIgPSBuY3BfbW9kaWZ5X2ZpbGVfb3Jfc3ViZGlyX2Rvc19pbmZvX3BhdGgoTkNQX1NFUlZFUihpbm9kZSksIGlub2RlLCBOVUxMLCBETV9BVFRSSUJVVEVTLCAmaW5mbyk7CisJCWlmIChyZXMyKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBsZWF2ZV9tZTsKKyAgICAgICAgfQorbGVhdmVfbWU6CisgICAgICAgIHJldHVybihyZXMpOworfQorI2VuZGlmCS8qIENPTkZJR19OQ1BGU19TVFJPTkcgKi8KKworI2lmZGVmIENPTkZJR19OQ1BGU19TVFJPTkcKK3N0YXRpYyBpbnQKK25jcF9mb3JjZV9yZW5hbWUoc3RydWN0IGlub2RlICpvbGRfZGlyLCBzdHJ1Y3QgZGVudHJ5KiBvbGRfZGVudHJ5LCBjaGFyICpfb2xkX25hbWUsCisgICAgICAgICAgICAgICAgIHN0cnVjdCBpbm9kZSAqbmV3X2Rpciwgc3RydWN0IGRlbnRyeSogbmV3X2RlbnRyeSwgY2hhciAqX25ld19uYW1lKQoreworCXN0cnVjdCBud19tb2RpZnlfZG9zX2luZm8gaW5mbzsKKyAgICAgICAgaW50IHJlcz0weDkwLHJlczI7CisJc3RydWN0IGlub2RlICpvbGRfaW5vZGUgPSBvbGRfZGVudHJ5LT5kX2lub2RlOworCV9fbGUzMiBvbGRfbndhdHRyID0gTkNQX0ZJTkZPKG9sZF9pbm9kZSktPm53YXR0cjsKKwlfX2xlMzIgbmV3X253YXR0ciA9IDA7IC8qIHNodXQgY29tcGlsZXIgd2FybmluZyAqLworCWludCBvbGRfbndhdHRyX2NoYW5nZWQgPSAwOworCWludCBuZXdfbndhdHRyX2NoYW5nZWQgPSAwOworCisJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworCQorICAgICAgICAvKiByZW1vdmUgdGhlIFJlYWQtT25seSBmbGFnIG9uIHRoZSBOVyBzZXJ2ZXIgKi8KKworCWluZm8uYXR0cmlidXRlcyA9IG9sZF9ud2F0dHIgJiB+KGFST05MWXxhUkVOQU1FSU5ISUJJVHxhREVMRVRFSU5ISUJJVCk7CisJcmVzMiA9IG5jcF9tb2RpZnlfZmlsZV9vcl9zdWJkaXJfZG9zX2luZm9fcGF0aChOQ1BfU0VSVkVSKG9sZF9pbm9kZSksIG9sZF9pbm9kZSwgTlVMTCwgRE1fQVRUUklCVVRFUywgJmluZm8pOworCWlmICghcmVzMikKKwkJb2xkX253YXR0cl9jaGFuZ2VkID0gMTsKKwlpZiAobmV3X2RlbnRyeSAmJiBuZXdfZGVudHJ5LT5kX2lub2RlKSB7CisJCW5ld19ud2F0dHIgPSBOQ1BfRklORk8obmV3X2RlbnRyeS0+ZF9pbm9kZSktPm53YXR0cjsKKwkJaW5mby5hdHRyaWJ1dGVzID0gbmV3X253YXR0ciAmIH4oYVJPTkxZfGFSRU5BTUVJTkhJQklUfGFERUxFVEVJTkhJQklUKTsKKwkJcmVzMiA9IG5jcF9tb2RpZnlfZmlsZV9vcl9zdWJkaXJfZG9zX2luZm9fcGF0aChOQ1BfU0VSVkVSKG5ld19kaXIpLCBuZXdfZGlyLCBfbmV3X25hbWUsIERNX0FUVFJJQlVURVMsICZpbmZvKTsKKwkJaWYgKCFyZXMyKQorCQkJbmV3X253YXR0cl9jaGFuZ2VkID0gMTsKKwl9CisgICAgICAgIC8qIG5vdyB0cnkgYWdhaW4gdGhlIHJlbmFtZSBvcGVyYXRpb24gKi8KKwkvKiBidXQgb25seSBpZiBzb21ldGhpbmcgcmVhbGx5IGhhcHBlbmVkICovCisJaWYgKG5ld19ud2F0dHJfY2hhbmdlZCB8fCBvbGRfbndhdHRyX2NoYW5nZWQpIHsKKwkgICAgICAgIHJlcyA9IG5jcF9yZW5fb3JfbW92X2ZpbGVfb3Jfc3ViZGlyKE5DUF9TRVJWRVIob2xkX2RpciksCisgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfZGlyLCBfb2xkX25hbWUsCisgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfZGlyLCBfbmV3X25hbWUpOworCX0gCisJaWYgKHJlcykKKwkJZ290byBsZWF2ZV9tZTsKKwkvKiBmaWxlIHdhcyBzdWNjZXNzZnVsbHkgcmVuYW1lZCwgc286CisJICAgZG8gbm90IHNldCBhdHRyaWJ1dGVzIG9uIG9sZCBmaWxlIC0gaXQgbm8gbG9uZ2VyIGV4aXN0cworCSAgIGNvcHkgYXR0cmlidXRlcyBmcm9tIG9sZCBmaWxlIHRvIG5ldyAqLworCW5ld19ud2F0dHJfY2hhbmdlZCA9IG9sZF9ud2F0dHJfY2hhbmdlZDsKKwluZXdfbndhdHRyID0gb2xkX253YXR0cjsKKwlvbGRfbndhdHRyX2NoYW5nZWQgPSAwOworCQorbGVhdmVfbWU6OworCWlmIChvbGRfbndhdHRyX2NoYW5nZWQpIHsKKwkJaW5mby5hdHRyaWJ1dGVzID0gb2xkX253YXR0cjsKKwkJcmVzMiA9IG5jcF9tb2RpZnlfZmlsZV9vcl9zdWJkaXJfZG9zX2luZm9fcGF0aChOQ1BfU0VSVkVSKG9sZF9pbm9kZSksIG9sZF9pbm9kZSwgTlVMTCwgRE1fQVRUUklCVVRFUywgJmluZm8pOworCQkvKiBpZ25vcmUgZXJyb3JzICovCisJfQorCWlmIChuZXdfbndhdHRyX2NoYW5nZWQpCXsKKwkJaW5mby5hdHRyaWJ1dGVzID0gbmV3X253YXR0cjsKKwkJcmVzMiA9IG5jcF9tb2RpZnlfZmlsZV9vcl9zdWJkaXJfZG9zX2luZm9fcGF0aChOQ1BfU0VSVkVSKG5ld19kaXIpLCBuZXdfZGlyLCBfbmV3X25hbWUsIERNX0FUVFJJQlVURVMsICZpbmZvKTsKKwkJLyogaWdub3JlIGVycm9ycyAqLworCX0KKyAgICAgICAgcmV0dXJuKHJlcyk7Cit9CisjZW5kaWYJLyogQ09ORklHX05DUEZTX1NUUk9ORyAqLworCisKK3N0YXRpYyBpbnQKK19fbmNwX2xvb2t1cF92YWxpZGF0ZShzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyOworCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKKwlzdHJ1Y3QgaW5vZGUgKmRpcjsKKwlzdHJ1Y3QgbmNwX2VudHJ5X2luZm8gZmluZm87CisJaW50IHJlcywgdmFsID0gMCwgbGVuOworCV9fdTggX19uYW1lW05DUF9NQVhQQVRITEVOICsgMV07CisKKwlwYXJlbnQgPSBkZ2V0X3BhcmVudChkZW50cnkpOworCWRpciA9IHBhcmVudC0+ZF9pbm9kZTsKKworCWlmICghZGVudHJ5LT5kX2lub2RlKQorCQlnb3RvIGZpbmlzaGVkOworCisJc2VydmVyID0gTkNQX1NFUlZFUihkaXIpOworCisJaWYgKCFuY3BfY29ubl92YWxpZChzZXJ2ZXIpKQorCQlnb3RvIGZpbmlzaGVkOworCisJLyoKKwkgKiBJbnNwaXJlZCBieSBzbWJmczoKKwkgKiBUaGUgZGVmYXVsdCB2YWxpZGF0aW9uIGlzIGJhc2VkIG9uIGRlbnRyeSBhZ2U6CisJICogV2Ugc2V0IHRoZSBtYXggYWdlIGF0IG1vdW50IHRpbWUuICAoQnV0IGVhY2gKKwkgKiBzdWNjZXNzZnVsIHNlcnZlciBsb29rdXAgcmVuZXdzIHRoZSB0aW1lc3RhbXAuKQorCSAqLworCXZhbCA9IE5DUF9URVNUX0FHRShzZXJ2ZXIsIGRlbnRyeSk7CisJaWYgKHZhbCkKKwkJZ290byBmaW5pc2hlZDsKKworCUREUFJJTlRLKCJuY3BfbG9va3VwX3ZhbGlkYXRlOiAlcy8lcyBub3QgdmFsaWQsIGFnZT0lbGQsIHNlcnZlciBsb29rdXBcbiIsCisJCWRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQlOQ1BfR0VUX0FHRShkZW50cnkpKTsKKworCWxlbiA9IHNpemVvZihfX25hbWUpOworCWlmIChuY3BfaXNfc2VydmVyX3Jvb3QoZGlyKSkgeworCQlyZXMgPSBuY3BfaW8ydm9sKHNlcnZlciwgX19uYW1lLCAmbGVuLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkJCSBkZW50cnktPmRfbmFtZS5sZW4sIDEpOworCQlpZiAoIXJlcykKKwkJCXJlcyA9IG5jcF9sb29rdXBfdm9sdW1lKHNlcnZlciwgX19uYW1lLCAmKGZpbmZvLmkpKTsKKwl9IGVsc2UgeworCQlyZXMgPSBuY3BfaW8ydm9sKHNlcnZlciwgX19uYW1lLCAmbGVuLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkJCSBkZW50cnktPmRfbmFtZS5sZW4sICFuY3BfcHJlc2VydmVfY2FzZShkaXIpKTsKKwkJaWYgKCFyZXMpCisJCQlyZXMgPSBuY3Bfb2J0YWluX2luZm8oc2VydmVyLCBkaXIsIF9fbmFtZSwgJihmaW5mby5pKSk7CisJfQorCWZpbmZvLnZvbHVtZSA9IGZpbmZvLmkudm9sTnVtYmVyOworCUREUFJJTlRLKCJuY3BfbG9va3VwX3ZhbGlkYXRlOiBsb29rZWQgZm9yICVzLyVzLCByZXM9JWRcbiIsCisJCWRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBfX25hbWUsIHJlcyk7CisJLyoKKwkgKiBJZiB3ZSBkaWRuJ3QgZmluZCBpdCwgb3IgaWYgaXQgaGFzIGEgZGlmZmVyZW50IGRpckVudE51bSB0bworCSAqIHdoYXQgd2UgcmVtZW1iZXIsIGl0J3Mgbm90IHZhbGlkIGFueSBtb3JlLgorCSAqLworCWlmICghcmVzKSB7CisJCWlmIChmaW5mby5pLmRpckVudE51bSA9PSBOQ1BfRklORk8oZGVudHJ5LT5kX2lub2RlKS0+ZGlyRW50TnVtKSB7CisJCQluY3BfbmV3X2RlbnRyeShkZW50cnkpOworCQkJdmFsPTE7CisJCX0gZWxzZQorCQkJRERQUklOVEsoIm5jcF9sb29rdXBfdmFsaWRhdGU6IGZvdW5kLCBidXQgZGlyRW50TnVtIGNoYW5nZWRcbiIpOworCisJCW5jcF91cGRhdGVfaW5vZGUyKGRlbnRyeS0+ZF9pbm9kZSwgJmZpbmZvKTsKKwl9CisKK2ZpbmlzaGVkOgorCUREUFJJTlRLKCJuY3BfbG9va3VwX3ZhbGlkYXRlOiByZXN1bHQ9JWRcbiIsIHZhbCk7CisJZHB1dChwYXJlbnQpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbnQKK25jcF9sb29rdXBfdmFsaWRhdGUoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaW50IHJlczsKKwlsb2NrX2tlcm5lbCgpOworCXJlcyA9IF9fbmNwX2xvb2t1cF92YWxpZGF0ZShkZW50cnksIG5kKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKgorbmNwX2RnZXRfZnBvcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBkZW50cnkgKnBhcmVudCwgdW5zaWduZWQgbG9uZyBmcG9zKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnQgPSBkZW50cnk7CisJc3RydWN0IGxpc3RfaGVhZCAqbmV4dDsKKworCWlmIChkX3ZhbGlkYXRlKGRlbnQsIHBhcmVudCkpIHsKKwkJaWYgKGRlbnQtPmRfbmFtZS5sZW4gPD0gTkNQX01BWFBBVEhMRU4gJiYKKwkJICAgICh1bnNpZ25lZCBsb25nKWRlbnQtPmRfZnNkYXRhID09IGZwb3MpIHsKKwkJCWlmICghZGVudC0+ZF9pbm9kZSkgeworCQkJCWRwdXQoZGVudCk7CisJCQkJZGVudCA9IE5VTEw7CisJCQl9CisJCQlyZXR1cm4gZGVudDsKKwkJfQorCQlkcHV0KGRlbnQpOworCX0KKworCS8qIElmIGEgcG9pbnRlciBpcyBpbnZhbGlkLCB3ZSBzZWFyY2ggdGhlIGRlbnRyeS4gKi8KKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwluZXh0ID0gcGFyZW50LT5kX3N1YmRpcnMubmV4dDsKKwl3aGlsZSAobmV4dCAhPSAmcGFyZW50LT5kX3N1YmRpcnMpIHsKKwkJZGVudCA9IGxpc3RfZW50cnkobmV4dCwgc3RydWN0IGRlbnRyeSwgZF9jaGlsZCk7CisJCWlmICgodW5zaWduZWQgbG9uZylkZW50LT5kX2ZzZGF0YSA9PSBmcG9zKSB7CisJCQlpZiAoZGVudC0+ZF9pbm9kZSkKKwkJCQlkZ2V0X2xvY2tlZChkZW50KTsKKwkJCWVsc2UKKwkJCQlkZW50ID0gTlVMTDsKKwkJCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJCQlnb3RvIG91dDsKKwkJfQorCQluZXh0ID0gbmV4dC0+bmV4dDsKKwl9CisJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwlyZXR1cm4gTlVMTDsKKworb3V0OgorCXJldHVybiBkZW50OworfQorCitzdGF0aWMgdGltZV90IG5jcF9vYnRhaW5fbXRpbWUoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciA9IE5DUF9TRVJWRVIoaW5vZGUpOworCXN0cnVjdCBud19pbmZvX3N0cnVjdCBpOworCisJaWYgKCFuY3BfY29ubl92YWxpZChzZXJ2ZXIpIHx8IG5jcF9pc19zZXJ2ZXJfcm9vdChpbm9kZSkpCisJCXJldHVybiAwOworCisJaWYgKG5jcF9vYnRhaW5faW5mbyhzZXJ2ZXIsIGlub2RlLCBOVUxMLCAmaSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIG5jcF9kYXRlX2RvczJ1bml4KGkubW9kaWZ5VGltZSwgaS5tb2RpZnlEYXRlKTsKK30KKworc3RhdGljIGludCBuY3BfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxwLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKKwlzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyID0gTkNQX1NFUlZFUihpbm9kZSk7CisJdW5pb24gIG5jcF9kaXJfY2FjaGUgKmNhY2hlID0gTlVMTDsKKwlzdHJ1Y3QgbmNwX2NhY2hlX2NvbnRyb2wgY3RsOworCWludCByZXN1bHQsIG10aW1lX3ZhbGlkID0gMDsKKwl0aW1lX3QgbXRpbWUgPSAwOworCisJbG9ja19rZXJuZWwoKTsKKworCWN0bC5wYWdlICA9IE5VTEw7CisJY3RsLmNhY2hlID0gTlVMTDsKKworCUREUFJJTlRLKCJuY3BfcmVhZGRpcjogcmVhZGluZyAlcy8lcywgcG9zPSVkXG4iLAorCQlkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJKGludCkgZmlscC0+Zl9wb3MpOworCisJcmVzdWx0ID0gLUVJTzsKKwlpZiAoIW5jcF9jb25uX3ZhbGlkKHNlcnZlcikpCisJCWdvdG8gb3V0OworCisJcmVzdWx0ID0gMDsKKwlpZiAoZmlscC0+Zl9wb3MgPT0gMCkgeworCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuIiwgMSwgMCwgaW5vZGUtPmlfaW5vLCBEVF9ESVIpKQorCQkJZ290byBvdXQ7CisJCWZpbHAtPmZfcG9zID0gMTsKKwl9CisJaWYgKGZpbHAtPmZfcG9zID09IDEpIHsKKwkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLi4iLCAyLCAxLCBwYXJlbnRfaW5vKGRlbnRyeSksIERUX0RJUikpCisJCQlnb3RvIG91dDsKKwkJZmlscC0+Zl9wb3MgPSAyOworCX0KKworCXBhZ2UgPSBncmFiX2NhY2hlX3BhZ2UoJmlub2RlLT5pX2RhdGEsIDApOworCWlmICghcGFnZSkKKwkJZ290byByZWFkX3JlYWxseTsKKworCWN0bC5jYWNoZSA9IGNhY2hlID0ga21hcChwYWdlKTsKKwljdGwuaGVhZCAgPSBjYWNoZS0+aGVhZDsKKworCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpIHx8ICFjdGwuaGVhZC5lb2YpCisJCWdvdG8gaW5pdF9jYWNoZTsKKworCWlmIChmaWxwLT5mX3BvcyA9PSAyKSB7CisJCWlmIChqaWZmaWVzIC0gY3RsLmhlYWQudGltZSA+PSBOQ1BfTUFYX0FHRShzZXJ2ZXIpKQorCQkJZ290byBpbml0X2NhY2hlOworCisJCW10aW1lID0gbmNwX29idGFpbl9tdGltZShkZW50cnkpOworCQltdGltZV92YWxpZCA9IDE7CisJCWlmICgoIW10aW1lKSB8fCAobXRpbWUgIT0gY3RsLmhlYWQubXRpbWUpKQorCQkJZ290byBpbml0X2NhY2hlOworCX0KKworCWlmIChmaWxwLT5mX3BvcyA+IGN0bC5oZWFkLmVuZCkKKwkJZ290byBmaW5pc2hlZDsKKworCWN0bC5mcG9zID0gZmlscC0+Zl9wb3MgKyAoTkNQX0RJUkNBQ0hFX1NUQVJUIC0gMik7CisJY3RsLm9mcyAgPSBjdGwuZnBvcyAvIE5DUF9ESVJDQUNIRV9TSVpFOworCWN0bC5pZHggID0gY3RsLmZwb3MgJSBOQ1BfRElSQ0FDSEVfU0laRTsKKworCWZvciAoOzspIHsKKwkJaWYgKGN0bC5vZnMgIT0gMCkgeworCQkJY3RsLnBhZ2UgPSBmaW5kX2xvY2tfcGFnZSgmaW5vZGUtPmlfZGF0YSwgY3RsLm9mcyk7CisJCQlpZiAoIWN0bC5wYWdlKQorCQkJCWdvdG8gaW52YWxpZF9jYWNoZTsKKwkJCWN0bC5jYWNoZSA9IGttYXAoY3RsLnBhZ2UpOworCQkJaWYgKCFQYWdlVXB0b2RhdGUoY3RsLnBhZ2UpKQorCQkJCWdvdG8gaW52YWxpZF9jYWNoZTsKKwkJfQorCQl3aGlsZSAoY3RsLmlkeCA8IE5DUF9ESVJDQUNIRV9TSVpFKSB7CisJCQlzdHJ1Y3QgZGVudHJ5ICpkZW50OworCQkJaW50IHJlczsKKworCQkJZGVudCA9IG5jcF9kZ2V0X2Zwb3MoY3RsLmNhY2hlLT5kZW50cnlbY3RsLmlkeF0sCisJCQkJCQlkZW50cnksIGZpbHAtPmZfcG9zKTsKKwkJCWlmICghZGVudCkKKwkJCQlnb3RvIGludmFsaWRfY2FjaGU7CisJCQlyZXMgPSBmaWxsZGlyKGRpcmVudCwgZGVudC0+ZF9uYW1lLm5hbWUsCisJCQkJCWRlbnQtPmRfbmFtZS5sZW4sIGZpbHAtPmZfcG9zLAorCQkJCQlkZW50LT5kX2lub2RlLT5pX2lubywgRFRfVU5LTk9XTik7CisJCQlkcHV0KGRlbnQpOworCQkJaWYgKHJlcykKKwkJCQlnb3RvIGZpbmlzaGVkOworCQkJZmlscC0+Zl9wb3MgKz0gMTsKKwkJCWN0bC5pZHggKz0gMTsKKwkJCWlmIChmaWxwLT5mX3BvcyA+IGN0bC5oZWFkLmVuZCkKKwkJCQlnb3RvIGZpbmlzaGVkOworCQl9CisJCWlmIChjdGwucGFnZSkgeworCQkJa3VubWFwKGN0bC5wYWdlKTsKKwkJCVNldFBhZ2VVcHRvZGF0ZShjdGwucGFnZSk7CisJCQl1bmxvY2tfcGFnZShjdGwucGFnZSk7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UoY3RsLnBhZ2UpOworCQkJY3RsLnBhZ2UgPSBOVUxMOworCQl9CisJCWN0bC5pZHggID0gMDsKKwkJY3RsLm9mcyArPSAxOworCX0KK2ludmFsaWRfY2FjaGU6CisJaWYgKGN0bC5wYWdlKSB7CisJCWt1bm1hcChjdGwucGFnZSk7CisJCXVubG9ja19wYWdlKGN0bC5wYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKGN0bC5wYWdlKTsKKwkJY3RsLnBhZ2UgPSBOVUxMOworCX0KKwljdGwuY2FjaGUgPSBjYWNoZTsKK2luaXRfY2FjaGU6CisJbmNwX2ludmFsaWRhdGVfZGlyY2FjaGVfZW50cmllcyhkZW50cnkpOworCWlmICghbXRpbWVfdmFsaWQpIHsKKwkJbXRpbWUgPSBuY3Bfb2J0YWluX210aW1lKGRlbnRyeSk7CisJCW10aW1lX3ZhbGlkID0gMTsKKwl9CisJY3RsLmhlYWQubXRpbWUgPSBtdGltZTsKKwljdGwuaGVhZC50aW1lID0gamlmZmllczsKKwljdGwuaGVhZC5lb2YgPSAwOworCWN0bC5mcG9zID0gMjsKKwljdGwub2ZzID0gMDsKKwljdGwuaWR4ID0gTkNQX0RJUkNBQ0hFX1NUQVJUOworCWN0bC5maWxsZWQgPSAwOworCWN0bC52YWxpZCAgPSAxOworcmVhZF9yZWFsbHk6CisJaWYgKG5jcF9pc19zZXJ2ZXJfcm9vdChpbm9kZSkpIHsKKwkJbmNwX3JlYWRfdm9sdW1lX2xpc3QoZmlscCwgZGlyZW50LCBmaWxsZGlyLCAmY3RsKTsKKwl9IGVsc2UgeworCQluY3BfZG9fcmVhZGRpcihmaWxwLCBkaXJlbnQsIGZpbGxkaXIsICZjdGwpOworCX0KKwljdGwuaGVhZC5lbmQgPSBjdGwuZnBvcyAtIDE7CisJY3RsLmhlYWQuZW9mID0gY3RsLnZhbGlkOworZmluaXNoZWQ6CisJaWYgKHBhZ2UpIHsKKwkJY2FjaGUtPmhlYWQgPSBjdGwuaGVhZDsKKwkJa3VubWFwKHBhZ2UpOworCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJfQorCWlmIChjdGwucGFnZSkgeworCQlrdW5tYXAoY3RsLnBhZ2UpOworCQlTZXRQYWdlVXB0b2RhdGUoY3RsLnBhZ2UpOworCQl1bmxvY2tfcGFnZShjdGwucGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShjdGwucGFnZSk7CisJfQorb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50CituY3BfZmlsbF9jYWNoZShzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpciwKKwkJc3RydWN0IG5jcF9jYWNoZV9jb250cm9sICpjdHJsLCBzdHJ1Y3QgbmNwX2VudHJ5X2luZm8gKmVudHJ5KQoreworCXN0cnVjdCBkZW50cnkgKm5ld2RlbnQsICpkZW50cnkgPSBmaWxwLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKm5ld2lubywgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBuY3BfY2FjaGVfY29udHJvbCBjdGwgPSAqY3RybDsKKwlzdHJ1Y3QgcXN0ciBxbmFtZTsKKwlpbnQgdmFsaWQgPSAwOworCWludCBoYXNoZWQgPSAwOworCWlub190IGlubyA9IDA7CisJX191OCBfX25hbWVbTkNQX01BWFBBVEhMRU4gKyAxXTsKKworCXFuYW1lLmxlbiA9IHNpemVvZihfX25hbWUpOworCWlmIChuY3Bfdm9sMmlvKE5DUF9TRVJWRVIoaW5vZGUpLCBfX25hbWUsICZxbmFtZS5sZW4sCisJCQllbnRyeS0+aS5lbnRyeU5hbWUsIGVudHJ5LT5pLm5hbWVMZW4sCisJCQkhbmNwX3ByZXNlcnZlX2VudHJ5X2Nhc2UoaW5vZGUsIGVudHJ5LT5pLk5TQ3JlYXRvcikpKQorCQlyZXR1cm4gMTsgLyogSSdtIG5vdCBzdXJlICovCisKKwlxbmFtZS5uYW1lID0gX19uYW1lOworCXFuYW1lLmhhc2ggPSBmdWxsX25hbWVfaGFzaChxbmFtZS5uYW1lLCBxbmFtZS5sZW4pOworCisJaWYgKGRlbnRyeS0+ZF9vcCAmJiBkZW50cnktPmRfb3AtPmRfaGFzaCkKKwkJaWYgKGRlbnRyeS0+ZF9vcC0+ZF9oYXNoKGRlbnRyeSwgJnFuYW1lKSAhPSAwKQorCQkJZ290byBlbmRfYWR2YW5jZTsKKworCW5ld2RlbnQgPSBkX2xvb2t1cChkZW50cnksICZxbmFtZSk7CisKKwlpZiAoIW5ld2RlbnQpIHsKKwkJbmV3ZGVudCA9IGRfYWxsb2MoZGVudHJ5LCAmcW5hbWUpOworCQlpZiAoIW5ld2RlbnQpCisJCQlnb3RvIGVuZF9hZHZhbmNlOworCX0gZWxzZSB7CisJCWhhc2hlZCA9IDE7CisJCW1lbWNweSgoY2hhciAqKSBuZXdkZW50LT5kX25hbWUubmFtZSwgcW5hbWUubmFtZSwKKwkJCQkJCQluZXdkZW50LT5kX25hbWUubGVuKTsKKwl9CisKKwlpZiAoIW5ld2RlbnQtPmRfaW5vZGUpIHsKKwkJZW50cnktPm9wZW5lZCA9IDA7CisJCWVudHJ5LT5pbm8gPSBpdW5pcXVlKGlub2RlLT5pX3NiLCAyKTsKKwkJbmV3aW5vID0gbmNwX2lnZXQoaW5vZGUtPmlfc2IsIGVudHJ5KTsKKwkJaWYgKG5ld2lubykgeworCQkJbmV3ZGVudC0+ZF9vcCA9ICZuY3BfZGVudHJ5X29wZXJhdGlvbnM7CisJCQlkX2luc3RhbnRpYXRlKG5ld2RlbnQsIG5ld2lubyk7CisJCQlpZiAoIWhhc2hlZCkKKwkJCQlkX3JlaGFzaChuZXdkZW50KTsKKwkJfQorCX0gZWxzZQorCQluY3BfdXBkYXRlX2lub2RlMihuZXdkZW50LT5kX2lub2RlLCBlbnRyeSk7CisKKwlpZiAobmV3ZGVudC0+ZF9pbm9kZSkgeworCQlpbm8gPSBuZXdkZW50LT5kX2lub2RlLT5pX2lubzsKKwkJbmV3ZGVudC0+ZF9mc2RhdGEgPSAodm9pZCAqKSBjdGwuZnBvczsKKwkJbmNwX25ld19kZW50cnkobmV3ZGVudCk7CisJfQorCisJaWYgKGN0bC5pZHggPj0gTkNQX0RJUkNBQ0hFX1NJWkUpIHsKKwkJaWYgKGN0bC5wYWdlKSB7CisJCQlrdW5tYXAoY3RsLnBhZ2UpOworCQkJU2V0UGFnZVVwdG9kYXRlKGN0bC5wYWdlKTsKKwkJCXVubG9ja19wYWdlKGN0bC5wYWdlKTsKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShjdGwucGFnZSk7CisJCX0KKwkJY3RsLmNhY2hlID0gTlVMTDsKKwkJY3RsLmlkeCAgLT0gTkNQX0RJUkNBQ0hFX1NJWkU7CisJCWN0bC5vZnMgICs9IDE7CisJCWN0bC5wYWdlICA9IGdyYWJfY2FjaGVfcGFnZSgmaW5vZGUtPmlfZGF0YSwgY3RsLm9mcyk7CisJCWlmIChjdGwucGFnZSkKKwkJCWN0bC5jYWNoZSA9IGttYXAoY3RsLnBhZ2UpOworCX0KKwlpZiAoY3RsLmNhY2hlKSB7CisJCWN0bC5jYWNoZS0+ZGVudHJ5W2N0bC5pZHhdID0gbmV3ZGVudDsKKwkJdmFsaWQgPSAxOworCX0KKwlkcHV0KG5ld2RlbnQpOworZW5kX2FkdmFuY2U6CisJaWYgKCF2YWxpZCkKKwkJY3RsLnZhbGlkID0gMDsKKwlpZiAoIWN0bC5maWxsZWQgJiYgKGN0bC5mcG9zID09IGZpbHAtPmZfcG9zKSkgeworCQlpZiAoIWlubykKKwkJCWlubyA9IGZpbmRfaW5vZGVfbnVtYmVyKGRlbnRyeSwgJnFuYW1lKTsKKwkJaWYgKCFpbm8pCisJCQlpbm8gPSBpdW5pcXVlKGlub2RlLT5pX3NiLCAyKTsKKwkJY3RsLmZpbGxlZCA9IGZpbGxkaXIoZGlyZW50LCBxbmFtZS5uYW1lLCBxbmFtZS5sZW4sCisJCQkJICAgICBmaWxwLT5mX3BvcywgaW5vLCBEVF9VTktOT1dOKTsKKwkJaWYgKCFjdGwuZmlsbGVkKQorCQkJZmlscC0+Zl9wb3MgKz0gMTsKKwl9CisJY3RsLmZwb3MgKz0gMTsKKwljdGwuaWR4ICArPSAxOworCSpjdHJsID0gY3RsOworCXJldHVybiAoY3RsLnZhbGlkIHx8ICFjdGwuZmlsbGVkKTsKK30KKworc3RhdGljIHZvaWQKK25jcF9yZWFkX3ZvbHVtZV9saXN0KHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyLAorCQkJc3RydWN0IG5jcF9jYWNoZV9jb250cm9sICpjdGwpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlscC0+Zl9kZW50cnk7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyID0gTkNQX1NFUlZFUihpbm9kZSk7CisJc3RydWN0IG5jcF92b2x1bWVfaW5mbyBpbmZvOworCXN0cnVjdCBuY3BfZW50cnlfaW5mbyBlbnRyeTsKKwlpbnQgaTsKKworCURQUklOVEsoIm5jcF9yZWFkX3ZvbHVtZV9saXN0OiBwb3M9JWxkXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcpIGZpbHAtPmZfcG9zKTsKKworCWZvciAoaSA9IDA7IGkgPCBOQ1BfTlVNQkVSX09GX1ZPTFVNRVM7IGkrKykgeworCisJCWlmIChuY3BfZ2V0X3ZvbHVtZV9pbmZvX3dpdGhfbnVtYmVyKHNlcnZlciwgaSwgJmluZm8pICE9IDApCisJCQlyZXR1cm47CisJCWlmICghc3RybGVuKGluZm8udm9sdW1lX25hbWUpKQorCQkJY29udGludWU7CisKKwkJRFBSSU5USygibmNwX3JlYWRfdm9sdW1lX2xpc3Q6IGZvdW5kIHZvbDogJXNcbiIsCisJCQlpbmZvLnZvbHVtZV9uYW1lKTsKKworCQlpZiAobmNwX2xvb2t1cF92b2x1bWUoc2VydmVyLCBpbmZvLnZvbHVtZV9uYW1lLAorCQkJCQkmZW50cnkuaSkpIHsKKwkJCURQUklOVEsoIm5jcGZzOiBjb3VsZCBub3QgbG9va3VwIHZvbCAlc1xuIiwKKwkJCQlpbmZvLnZvbHVtZV9uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWVudHJ5LnZvbHVtZSA9IGVudHJ5Lmkudm9sTnVtYmVyOworCQlpZiAoIW5jcF9maWxsX2NhY2hlKGZpbHAsIGRpcmVudCwgZmlsbGRpciwgY3RsLCAmZW50cnkpKQorCQkJcmV0dXJuOworCX0KK30KKworc3RhdGljIHZvaWQKK25jcF9kb19yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyLAorCQkJCQkJc3RydWN0IG5jcF9jYWNoZV9jb250cm9sICpjdGwpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlscC0+Zl9kZW50cnk7CisJc3RydWN0IGlub2RlICpkaXIgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciA9IE5DUF9TRVJWRVIoZGlyKTsKKwlzdHJ1Y3Qgbndfc2VhcmNoX3NlcXVlbmNlIHNlcTsKKwlzdHJ1Y3QgbmNwX2VudHJ5X2luZm8gZW50cnk7CisJaW50IGVycjsKKwl2b2lkKiBidWY7CisJaW50IG1vcmU7CisJc2l6ZV90IGJ1ZnNpemU7CisKKwlEUFJJTlRLKCJuY3BfZG9fcmVhZGRpcjogJXMvJXMsIGZwb3M9JWxkXG4iLAorCQlkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJKHVuc2lnbmVkIGxvbmcpIGZpbHAtPmZfcG9zKTsKKwlQUFJJTlRLKCJuY3BfZG9fcmVhZGRpcjogaW5pdCAlcywgdm9sbnVtPSVkLCBkaXJlbnQ9JXVcbiIsCisJCWRlbnRyeS0+ZF9uYW1lLm5hbWUsIE5DUF9GSU5GTyhkaXIpLT52b2xOdW1iZXIsCisJCU5DUF9GSU5GTyhkaXIpLT5kaXJFbnROdW0pOworCisJZXJyID0gbmNwX2luaXRpYWxpemVfc2VhcmNoKHNlcnZlciwgZGlyLCAmc2VxKTsKKwlpZiAoZXJyKSB7CisJCURQUklOVEsoIm5jcF9kb19yZWFkZGlyOiBpbml0IGZhaWxlZCwgZXJyPSVkXG4iLCBlcnIpOworCQlyZXR1cm47CisJfQorI2lmZGVmIFVTRV9PTERfU0xPV19ESVJFQ1RPUllfTElTVElORworCWZvciAoOzspIHsKKwkJZXJyID0gbmNwX3NlYXJjaF9mb3JfZmlsZV9vcl9zdWJkaXIoc2VydmVyLCAmc2VxLCAmZW50cnkuaSk7CisJCWlmIChlcnIpIHsKKwkJCURQUklOVEsoIm5jcF9kb19yZWFkZGlyOiBzZWFyY2ggZmFpbGVkLCBlcnI9JWRcbiIsIGVycik7CisJCQlicmVhazsKKwkJfQorCQllbnRyeS52b2x1bWUgPSBlbnRyeS5pLnZvbE51bWJlcjsKKwkJaWYgKCFuY3BfZmlsbF9jYWNoZShmaWxwLCBkaXJlbnQsIGZpbGxkaXIsIGN0bCwgJmVudHJ5KSkKKwkJCWJyZWFrOworCX0KKyNlbHNlCisJLyogV2UgTVVTVCBOT1QgdXNlIHNlcnZlci0+YnVmZmVyX3NpemUgaGFuZHNoYWtlZCB3aXRoIHNlcnZlciBpZiB3ZSBhcmUKKwkgICB1c2luZyBVRFAsIGFzIGZvciBVRFAgc2VydmVyIHVzZXMgbWF4LiBidWZmZXIgc2l6ZSBkZXRlcm1pbmVkIGJ5CisJICAgTVRVLCBhbmQgZm9yIFRDUCBzZXJ2ZXIgdXNlcyBoYXJkd2lyZWQgdmFsdWUgNjVLQiAoPT0gNjY1NjAgYnl0ZXMpLiAKKwkgICBTbyB3ZSB1c2UgMTI4S0IsIGp1c3QgdG8gYmUgc3VyZSwgYXMgdGhlcmUgaXMgbm8gd2F5IGhvdyB0byBrbm93CisJICAgdGhpcyB2YWx1ZSBpbiBhZHZhbmNlLiAqLworCWJ1ZnNpemUgPSAxMzEwNzI7CisJYnVmID0gdm1hbGxvYyhidWZzaXplKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuOworCWRvIHsKKwkJaW50IGNudDsKKwkJY2hhciogcnBsOworCQlzaXplX3QgcnBsczsKKworCQllcnIgPSBuY3Bfc2VhcmNoX2Zvcl9maWxlc2V0KHNlcnZlciwgJnNlcSwgJm1vcmUsICZjbnQsIGJ1ZiwgYnVmc2l6ZSwgJnJwbCwgJnJwbHMpOworCQlpZiAoZXJyKQkJLyogRXJyb3IgKi8KKwkJCWJyZWFrOworCQlpZiAoIWNudCkJCS8qIHByZXZlbnQgZW5kbGVzcyBsb29wICovCisJCQlicmVhazsKKwkJd2hpbGUgKGNudC0tKSB7CisJCQlzaXplX3Qgb25lcnBsOworCQkJCisJCQlpZiAocnBscyA8IG9mZnNldG9mKHN0cnVjdCBud19pbmZvX3N0cnVjdCwgZW50cnlOYW1lKSkKKwkJCQlicmVhazsJLyogc2hvcnQgcGFja2V0ICovCisJCQluY3BfZXh0cmFjdF9maWxlX2luZm8ocnBsLCAmZW50cnkuaSk7CisJCQlvbmVycGwgPSBvZmZzZXRvZihzdHJ1Y3QgbndfaW5mb19zdHJ1Y3QsIGVudHJ5TmFtZSkgKyBlbnRyeS5pLm5hbWVMZW47CisJCQlpZiAocnBscyA8IG9uZXJwbCkKKwkJCQlicmVhazsJLyogc2hvcnQgcGFja2V0ICovCisJCQkodm9pZCluY3Bfb2J0YWluX25mc19pbmZvKHNlcnZlciwgJmVudHJ5LmkpOworCQkJcnBsICs9IG9uZXJwbDsKKwkJCXJwbHMgLT0gb25lcnBsOworCQkJZW50cnkudm9sdW1lID0gZW50cnkuaS52b2xOdW1iZXI7CisJCQlpZiAoIW5jcF9maWxsX2NhY2hlKGZpbHAsIGRpcmVudCwgZmlsbGRpciwgY3RsLCAmZW50cnkpKQorCQkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAobW9yZSk7CisJdmZyZWUoYnVmKTsKKyNlbmRpZgorCXJldHVybjsKK30KKworaW50IG5jcF9jb25uX2xvZ2dlZF9pbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBuY3Bfc2VydmVyKiBzZXJ2ZXIgPSBOQ1BfU0JQKHNiKTsKKwlpbnQgcmVzdWx0OworCisJaWYgKG5jcF9zaW5nbGVfdm9sdW1lKHNlcnZlcikpIHsKKwkJaW50IGxlbjsKKwkJc3RydWN0IGRlbnRyeSogZGVudDsKKwkJX191MzIgdm9sTnVtYmVyOworCQlfX2xlMzIgZGlyRW50TnVtOworCQlfX2xlMzIgRG9zRGlyTnVtOworCQlfX3U4IF9fbmFtZVtOQ1BfTUFYUEFUSExFTiArIDFdOworCisJCWxlbiA9IHNpemVvZihfX25hbWUpOworCQlyZXN1bHQgPSBuY3BfaW8ydm9sKHNlcnZlciwgX19uYW1lLCAmbGVuLCBzZXJ2ZXItPm0ubW91bnRlZF92b2wsCisJCQkJICAgIHN0cmxlbihzZXJ2ZXItPm0ubW91bnRlZF92b2wpLCAxKTsKKwkJaWYgKHJlc3VsdCkKKwkJCWdvdG8gb3V0OworCQlyZXN1bHQgPSAtRU5PRU5UOworCQlpZiAobmNwX2dldF92b2x1bWVfcm9vdChzZXJ2ZXIsIF9fbmFtZSwgJnZvbE51bWJlciwgJmRpckVudE51bSwgJkRvc0Rpck51bSkpIHsKKwkJCVBQUklOVEsoIm5jcF9jb25uX2xvZ2dlZF9pbjogJXMgbm90IGZvdW5kXG4iLAorCQkJCXNlcnZlci0+bS5tb3VudGVkX3ZvbCk7CisJCQlnb3RvIG91dDsKKwkJfQorCQlkZW50ID0gc2ItPnNfcm9vdDsKKwkJaWYgKGRlbnQpIHsKKwkJCXN0cnVjdCBpbm9kZSogaW5vID0gZGVudC0+ZF9pbm9kZTsKKwkJCWlmIChpbm8pIHsKKwkJCQlOQ1BfRklORk8oaW5vKS0+dm9sTnVtYmVyID0gdm9sTnVtYmVyOworCQkJCU5DUF9GSU5GTyhpbm8pLT5kaXJFbnROdW0gPSBkaXJFbnROdW07CisJCQkJTkNQX0ZJTkZPKGlubyktPkRvc0Rpck51bSA9IERvc0Rpck51bTsKKwkJCX0gZWxzZSB7CisJCQkJRFBSSU5USygibmNwZnM6IHNiLT5zX3Jvb3QtPmRfaW5vZGUgPT0gTlVMTCFcbiIpOworCQkJfQorCQl9IGVsc2UgeworCQkJRFBSSU5USygibmNwZnM6IHNiLT5zX3Jvb3QgPT0gTlVMTCFcbiIpOworCQl9CisJfQorCXJlc3VsdCA9IDA7CisKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqbmNwX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyID0gTkNQX1NFUlZFUihkaXIpOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOworCXN0cnVjdCBuY3BfZW50cnlfaW5mbyBmaW5mbzsKKwlpbnQgZXJyb3IsIHJlcywgbGVuOworCV9fdTggX19uYW1lW05DUF9NQVhQQVRITEVOICsgMV07CisKKwlsb2NrX2tlcm5lbCgpOworCWVycm9yID0gLUVJTzsKKwlpZiAoIW5jcF9jb25uX3ZhbGlkKHNlcnZlcikpCisJCWdvdG8gZmluaXNoZWQ7CisKKwlQUFJJTlRLKCJuY3BfbG9va3VwOiBzZXJ2ZXIgbG9va3VwIGZvciAlcy8lc1xuIiwKKwkJZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJbGVuID0gc2l6ZW9mKF9fbmFtZSk7CisJaWYgKG5jcF9pc19zZXJ2ZXJfcm9vdChkaXIpKSB7CisJCXJlcyA9IG5jcF9pbzJ2b2woc2VydmVyLCBfX25hbWUsICZsZW4sIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkJIGRlbnRyeS0+ZF9uYW1lLmxlbiwgMSk7CisJCWlmICghcmVzKQorCQkJcmVzID0gbmNwX2xvb2t1cF92b2x1bWUoc2VydmVyLCBfX25hbWUsICYoZmluZm8uaSkpOworCX0gZWxzZSB7CisJCXJlcyA9IG5jcF9pbzJ2b2woc2VydmVyLCBfX25hbWUsICZsZW4sIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkJIGRlbnRyeS0+ZF9uYW1lLmxlbiwgIW5jcF9wcmVzZXJ2ZV9jYXNlKGRpcikpOworCQlpZiAoIXJlcykKKwkJCXJlcyA9IG5jcF9vYnRhaW5faW5mbyhzZXJ2ZXIsIGRpciwgX19uYW1lLCAmKGZpbmZvLmkpKTsKKwl9CisJUFBSSU5USygibmNwX2xvb2t1cDogbG9va2VkIGZvciAlcy8lcywgcmVzPSVkXG4iLAorCQlkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgX19uYW1lLCByZXMpOworCS8qCisJICogSWYgd2UgZGlkbid0IGZpbmQgYW4gZW50cnksIG1ha2UgYSBuZWdhdGl2ZSBkZW50cnkuCisJICovCisJaWYgKHJlcykKKwkJZ290byBhZGRfZW50cnk7CisKKwkvKgorCSAqIENyZWF0ZSBhbiBpbm9kZSBmb3IgdGhlIGVudHJ5LgorCSAqLworCWZpbmZvLm9wZW5lZCA9IDA7CisJZmluZm8uaW5vID0gaXVuaXF1ZShkaXItPmlfc2IsIDIpOworCWZpbmZvLnZvbHVtZSA9IGZpbmZvLmkudm9sTnVtYmVyOworCWVycm9yID0gLUVBQ0NFUzsKKwlpbm9kZSA9IG5jcF9pZ2V0KGRpci0+aV9zYiwgJmZpbmZvKTsKKworCWlmIChpbm9kZSkgeworCQluY3BfbmV3X2RlbnRyeShkZW50cnkpOworYWRkX2VudHJ5OgorCQlkZW50cnktPmRfb3AgPSAmbmNwX2RlbnRyeV9vcGVyYXRpb25zOworCQlkX2FkZChkZW50cnksIGlub2RlKTsKKwkJZXJyb3IgPSAwOworCX0KKworZmluaXNoZWQ6CisJUFBSSU5USygibmNwX2xvb2t1cDogcmVzdWx0PSVkXG4iLCBlcnJvcik7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBFUlJfUFRSKGVycm9yKTsKK30KKworLyoKKyAqIFRoaXMgY29kZSBpcyBjb21tb24gdG8gY3JlYXRlLCBta2RpciwgYW5kIG1rbm9kLgorICovCitzdGF0aWMgaW50IG5jcF9pbnN0YW50aWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJc3RydWN0IG5jcF9lbnRyeV9pbmZvICpmaW5mbykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWludCBlcnJvciA9IC1FSU5WQUw7CisKKwlmaW5mby0+aW5vID0gaXVuaXF1ZShkaXItPmlfc2IsIDIpOworCWlub2RlID0gbmNwX2lnZXQoZGlyLT5pX3NiLCBmaW5mbyk7CisJaWYgKCFpbm9kZSkKKwkJZ290byBvdXRfY2xvc2U7CisJZF9pbnN0YW50aWF0ZShkZW50cnksaW5vZGUpOworCWVycm9yID0gMDsKK291dDoKKwlyZXR1cm4gZXJyb3I7CisKK291dF9jbG9zZToKKwlQUFJJTlRLKCJuY3BfaW5zdGFudGlhdGU6ICVzLyVzIGZhaWxlZCwgY2xvc2luZyBmaWxlXG4iLAorCQlkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisJbmNwX2Nsb3NlX2ZpbGUoTkNQX1NFUlZFUihkaXIpLCBmaW5mby0+ZmlsZV9oYW5kbGUpOworCWdvdG8gb3V0OworfQorCitpbnQgbmNwX2NyZWF0ZV9uZXcoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsCisJCSAgIGRldl90IHJkZXYsIF9fbGUzMiBhdHRyaWJ1dGVzKQoreworCXN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIgPSBOQ1BfU0VSVkVSKGRpcik7CisJc3RydWN0IG5jcF9lbnRyeV9pbmZvIGZpbmZvOworCWludCBlcnJvciwgcmVzdWx0LCBsZW47CisJaW50IG9wbW9kZTsKKwlfX3U4IF9fbmFtZVtOQ1BfTUFYUEFUSExFTiArIDFdOworCQorCVBQUklOVEsoIm5jcF9jcmVhdGVfbmV3OiBjcmVhdGluZyAlcy8lcywgbW9kZT0leFxuIiwKKwkJZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIG1vZGUpOworCisJZXJyb3IgPSAtRUlPOworCWxvY2tfa2VybmVsKCk7CisJaWYgKCFuY3BfY29ubl92YWxpZChzZXJ2ZXIpKQorCQlnb3RvIG91dDsKKworCW5jcF9hZ2VfZGVudHJ5KHNlcnZlciwgZGVudHJ5KTsKKwlsZW4gPSBzaXplb2YoX19uYW1lKTsKKwllcnJvciA9IG5jcF9pbzJ2b2woc2VydmVyLCBfX25hbWUsICZsZW4sIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkgICBkZW50cnktPmRfbmFtZS5sZW4sICFuY3BfcHJlc2VydmVfY2FzZShkaXIpKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCisJZXJyb3IgPSAtRUFDQ0VTOworCQorCWlmIChTX0lTUkVHKG1vZGUpICYmIAorCSAgICAoc2VydmVyLT5tLmZsYWdzICYgTkNQX01PVU5UX0VYVFJBUykgJiYgCisJICAgIChtb2RlICYgU19JWFVHTykpCisJCWF0dHJpYnV0ZXMgfD0gYVNZU1RFTSB8IGFTSEFSRUQ7CisJCisJcmVzdWx0ID0gbmNwX29wZW5fY3JlYXRlX2ZpbGVfb3Jfc3ViZGlyKHNlcnZlciwgZGlyLCBfX25hbWUsCisJCQkJT0NfTU9ERV9DUkVBVEUgfCBPQ19NT0RFX09QRU4gfCBPQ19NT0RFX1JFUExBQ0UsCisJCQkJYXR0cmlidXRlcywgQVJfUkVBRCB8IEFSX1dSSVRFLCAmZmluZm8pOworCW9wbW9kZSA9IE9fUkRXUjsKKwlpZiAocmVzdWx0KSB7CisJCXJlc3VsdCA9IG5jcF9vcGVuX2NyZWF0ZV9maWxlX29yX3N1YmRpcihzZXJ2ZXIsIGRpciwgX19uYW1lLAorCQkJCU9DX01PREVfQ1JFQVRFIHwgT0NfTU9ERV9PUEVOIHwgT0NfTU9ERV9SRVBMQUNFLAorCQkJCWF0dHJpYnV0ZXMsIEFSX1dSSVRFLCAmZmluZm8pOworCQlpZiAocmVzdWx0KSB7CisJCQlpZiAocmVzdWx0ID09IDB4ODcpCisJCQkJZXJyb3IgPSAtRU5BTUVUT09MT05HOworCQkJRFBSSU5USygibmNwX2NyZWF0ZTogJXMvJXMgZmFpbGVkXG4iLAorCQkJCWRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCW9wbW9kZSA9IE9fV1JPTkxZOworCX0KKwlmaW5mby5hY2Nlc3MgPSBvcG1vZGU7CisJaWYgKG5jcF9pc19uZnNfZXh0cmFzKHNlcnZlciwgZmluZm8udm9sdW1lKSkgeworCQlmaW5mby5pLm5mcy5tb2RlID0gbW9kZTsKKwkJZmluZm8uaS5uZnMucmRldiA9IG5ld19lbmNvZGVfZGV2KHJkZXYpOworCQlpZiAobmNwX21vZGlmeV9uZnNfaW5mbyhzZXJ2ZXIsIGZpbmZvLnZvbHVtZSwKKwkJCQkJZmluZm8uaS5kaXJFbnROdW0sCisJCQkJCW1vZGUsIG5ld19lbmNvZGVfZGV2KHJkZXYpKSAhPSAwKQorCQkJZ290byBvdXQ7CisJfQorCisJZXJyb3IgPSBuY3BfaW5zdGFudGlhdGUoZGlyLCBkZW50cnksICZmaW5mbyk7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBuY3BfY3JlYXRlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLAorCQlzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlyZXR1cm4gbmNwX2NyZWF0ZV9uZXcoZGlyLCBkZW50cnksIG1vZGUsIDAsIDApOworfQorCitzdGF0aWMgaW50IG5jcF9ta2RpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgbmNwX2VudHJ5X2luZm8gZmluZm87CisJc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciA9IE5DUF9TRVJWRVIoZGlyKTsKKwlpbnQgZXJyb3IsIGxlbjsKKwlfX3U4IF9fbmFtZVtOQ1BfTUFYUEFUSExFTiArIDFdOworCisJRFBSSU5USygibmNwX21rZGlyOiBtYWtpbmcgJXMvJXNcbiIsCisJCWRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCWVycm9yID0gLUVJTzsKKwlsb2NrX2tlcm5lbCgpOworCWlmICghbmNwX2Nvbm5fdmFsaWQoc2VydmVyKSkKKwkJZ290byBvdXQ7CisKKwluY3BfYWdlX2RlbnRyeShzZXJ2ZXIsIGRlbnRyeSk7CisJbGVuID0gc2l6ZW9mKF9fbmFtZSk7CisJZXJyb3IgPSBuY3BfaW8ydm9sKHNlcnZlciwgX19uYW1lLCAmbGVuLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkJICAgZGVudHJ5LT5kX25hbWUubGVuLCAhbmNwX3ByZXNlcnZlX2Nhc2UoZGlyKSk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKworCWVycm9yID0gLUVBQ0NFUzsKKwlpZiAobmNwX29wZW5fY3JlYXRlX2ZpbGVfb3Jfc3ViZGlyKHNlcnZlciwgZGlyLCBfX25hbWUsCisJCQkJCSAgIE9DX01PREVfQ1JFQVRFLCBhRElSLAorCQkJCQkgICBjcHVfdG9fbGUxNigweGZmZmYpLAorCQkJCQkgICAmZmluZm8pID09IDApCisJeworCQlpZiAobmNwX2lzX25mc19leHRyYXMoc2VydmVyLCBmaW5mby52b2x1bWUpKSB7CisJCQltb2RlIHw9IFNfSUZESVI7CisJCQlmaW5mby5pLm5mcy5tb2RlID0gbW9kZTsKKwkJCWlmIChuY3BfbW9kaWZ5X25mc19pbmZvKHNlcnZlciwKKwkJCQkJCWZpbmZvLnZvbHVtZSwKKwkJCQkJCWZpbmZvLmkuZGlyRW50TnVtLAorCQkJCQkJbW9kZSwgMCkgIT0gMCkKKwkJCQlnb3RvIG91dDsKKwkJfQorCQllcnJvciA9IG5jcF9pbnN0YW50aWF0ZShkaXIsIGRlbnRyeSwgJmZpbmZvKTsKKwl9CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBuY3Bfcm1kaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyID0gTkNQX1NFUlZFUihkaXIpOworCWludCBlcnJvciwgcmVzdWx0LCBsZW47CisJX191OCBfX25hbWVbTkNQX01BWFBBVEhMRU4gKyAxXTsKKworCURQUklOVEsoIm5jcF9ybWRpcjogcmVtb3ZpbmcgJXMvJXNcbiIsCisJCWRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCWVycm9yID0gLUVJTzsKKwlsb2NrX2tlcm5lbCgpOworCWlmICghbmNwX2Nvbm5fdmFsaWQoc2VydmVyKSkKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IC1FQlVTWTsKKwlpZiAoIWRfdW5oYXNoZWQoZGVudHJ5KSkKKwkJZ290byBvdXQ7CisKKwlsZW4gPSBzaXplb2YoX19uYW1lKTsKKwllcnJvciA9IG5jcF9pbzJ2b2woc2VydmVyLCBfX25hbWUsICZsZW4sIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkgICBkZW50cnktPmRfbmFtZS5sZW4sICFuY3BfcHJlc2VydmVfY2FzZShkaXIpKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCisJcmVzdWx0ID0gbmNwX2RlbF9maWxlX29yX3N1YmRpcihzZXJ2ZXIsIGRpciwgX19uYW1lKTsKKwlzd2l0Y2ggKHJlc3VsdCkgeworCQljYXNlIDB4MDA6CisJCQllcnJvciA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAweDg1OgkvKiB1bmF1dGhvcml6ZWQgdG8gZGVsZXRlIGZpbGUgKi8KKwkJY2FzZSAweDhBOgkvKiB1bmF1dGhvcml6ZWQgdG8gZGVsZXRlIGZpbGUgKi8KKwkJCWVycm9yID0gLUVBQ0NFUzsKKwkJCWJyZWFrOworCQljYXNlIDB4OEY6CisJCWNhc2UgMHg5MDoJLyogcmVhZCBvbmx5ICovCisJCQllcnJvciA9IC1FUEVSTTsKKwkJCWJyZWFrOworCQljYXNlIDB4OUY6CS8qIGluIHVzZSBieSBhbm90aGVyIGNsaWVudCAqLworCQkJZXJyb3IgPSAtRUJVU1k7CisJCQlicmVhazsKKwkJY2FzZSAweEEwOgkvKiBkaXJlY3Rvcnkgbm90IGVtcHR5ICovCisJCQllcnJvciA9IC1FTk9URU1QVFk7CisJCQlicmVhazsKKwkJY2FzZSAweEZGOgkvKiBzb21lb25lIGRlbGV0ZWQgZmlsZSAqLworCQkJZXJyb3IgPSAtRU5PRU5UOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnJvciA9IC1FQUNDRVM7CisJCQlicmVhazsKKyAgICAgICAJfQorb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgbmNwX3VubGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlcjsKKwlpbnQgZXJyb3I7CisKKwlsb2NrX2tlcm5lbCgpOworCXNlcnZlciA9IE5DUF9TRVJWRVIoZGlyKTsKKwlEUFJJTlRLKCJuY3BfdW5saW5rOiB1bmxpbmtpbmcgJXMvJXNcbiIsCisJCWRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwkKKwllcnJvciA9IC1FSU87CisJaWYgKCFuY3BfY29ubl92YWxpZChzZXJ2ZXIpKQorCQlnb3RvIG91dDsKKworCS8qCisJICogQ2hlY2sgd2hldGhlciB0byBjbG9zZSB0aGUgZmlsZSAuLi4KKwkgKi8KKwlpZiAoaW5vZGUpIHsKKwkJUFBSSU5USygibmNwX3VubGluazogY2xvc2luZyBmaWxlXG4iKTsKKwkJbmNwX21ha2VfY2xvc2VkKGlub2RlKTsKKwl9CisKKwllcnJvciA9IG5jcF9kZWxfZmlsZV9vcl9zdWJkaXIyKHNlcnZlciwgZGVudHJ5KTsKKyNpZmRlZiBDT05GSUdfTkNQRlNfU1RST05HCisJLyogOUMgaXMgSW52YWxpZCBwYXRoLi4gSXQgc2hvdWxkIGJlIDhGLCA5MCAtIHJlYWQgb25seSwgYnV0CisJICAgaXQgaXMgbm90IDotKCAqLworCWlmICgoZXJyb3IgPT0gMHg5QyB8fCBlcnJvciA9PSAweDkwKSAmJiBzZXJ2ZXItPm0uZmxhZ3MgJiBOQ1BfTU9VTlRfU1RST05HKSB7IC8qIFIvTyAqLworCQllcnJvciA9IG5jcF9mb3JjZV91bmxpbmsoZGlyLCBkZW50cnkpOworCX0KKyNlbmRpZgorCXN3aXRjaCAoZXJyb3IpIHsKKwkJY2FzZSAweDAwOgorCQkJRFBSSU5USygibmNwOiByZW1vdmVkICVzLyVzXG4iLAorCQkJCWRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwkJCWJyZWFrOworCQljYXNlIDB4ODU6CisJCWNhc2UgMHg4QToKKwkJCWVycm9yID0gLUVBQ0NFUzsKKwkJCWJyZWFrOworCQljYXNlIDB4OEQ6CS8qIHNvbWUgZmlsZXMgaW4gdXNlICovCisJCWNhc2UgMHg4RToJLyogYWxsIGZpbGVzIGluIHVzZSAqLworCQkJZXJyb3IgPSAtRUJVU1k7CisJCQlicmVhazsKKwkJY2FzZSAweDhGOgkvKiBzb21lIHJlYWQgb25seSAqLworCQljYXNlIDB4OTA6CS8qIGFsbCByZWFkIG9ubHkgKi8KKwkJY2FzZSAweDlDOgkvKiAhISEgcmV0dXJuZWQgd2hlbiBpbi11c2Ugb3IgcmVhZC1vbmx5IGJ5IE5XNCAqLworCQkJZXJyb3IgPSAtRVBFUk07CisJCQlicmVhazsKKwkJY2FzZSAweEZGOgorCQkJZXJyb3IgPSAtRU5PRU5UOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnJvciA9IC1FQUNDRVM7CisJCQlicmVhazsKKwl9CisJCQorb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgbmNwX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCisJCSAgICAgIHN0cnVjdCBpbm9kZSAqbmV3X2Rpciwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKK3sKKwlzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyID0gTkNQX1NFUlZFUihvbGRfZGlyKTsKKwlpbnQgZXJyb3I7CisJaW50IG9sZF9sZW4sIG5ld19sZW47CisJX191OCBfX29sZF9uYW1lW05DUF9NQVhQQVRITEVOICsgMV0sIF9fbmV3X25hbWVbTkNQX01BWFBBVEhMRU4gKyAxXTsKKworCURQUklOVEsoIm5jcF9yZW5hbWU6ICVzLyVzIHRvICVzLyVzXG4iLAorCQlvbGRfZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIG9sZF9kZW50cnktPmRfbmFtZS5uYW1lLAorCQluZXdfZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIG5ld19kZW50cnktPmRfbmFtZS5uYW1lKTsKKworCWVycm9yID0gLUVJTzsKKwlsb2NrX2tlcm5lbCgpOworCWlmICghbmNwX2Nvbm5fdmFsaWQoc2VydmVyKSkKKwkJZ290byBvdXQ7CisKKwluY3BfYWdlX2RlbnRyeShzZXJ2ZXIsIG9sZF9kZW50cnkpOworCW5jcF9hZ2VfZGVudHJ5KHNlcnZlciwgbmV3X2RlbnRyeSk7CisKKwlvbGRfbGVuID0gc2l6ZW9mKF9fb2xkX25hbWUpOworCWVycm9yID0gbmNwX2lvMnZvbChzZXJ2ZXIsIF9fb2xkX25hbWUsICZvbGRfbGVuLAorCQkJICAgb2xkX2RlbnRyeS0+ZF9uYW1lLm5hbWUsIG9sZF9kZW50cnktPmRfbmFtZS5sZW4sCisJCQkgICAhbmNwX3ByZXNlcnZlX2Nhc2Uob2xkX2RpcikpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisKKwluZXdfbGVuID0gc2l6ZW9mKF9fbmV3X25hbWUpOworCWVycm9yID0gbmNwX2lvMnZvbChzZXJ2ZXIsIF9fbmV3X25hbWUsICZuZXdfbGVuLAorCQkJICAgbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUsIG5ld19kZW50cnktPmRfbmFtZS5sZW4sCisJCQkgICAhbmNwX3ByZXNlcnZlX2Nhc2UobmV3X2RpcikpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IG5jcF9yZW5fb3JfbW92X2ZpbGVfb3Jfc3ViZGlyKHNlcnZlciwgb2xkX2RpciwgX19vbGRfbmFtZSwKKwkJCQkJCSAgICAgIG5ld19kaXIsIF9fbmV3X25hbWUpOworI2lmZGVmIENPTkZJR19OQ1BGU19TVFJPTkcKKwlpZiAoKGVycm9yID09IDB4OTAgfHwgZXJyb3IgPT0gMHg4QiB8fCBlcnJvciA9PSAtRUFDQ0VTKSAmJgorCQkJc2VydmVyLT5tLmZsYWdzICYgTkNQX01PVU5UX1NUUk9ORykgewkvKiBSTyAqLworCQllcnJvciA9IG5jcF9mb3JjZV9yZW5hbWUob2xkX2Rpciwgb2xkX2RlbnRyeSwgX19vbGRfbmFtZSwKKwkJCQkJIG5ld19kaXIsIG5ld19kZW50cnksIF9fbmV3X25hbWUpOworCX0KKyNlbmRpZgorCXN3aXRjaCAoZXJyb3IpIHsKKwkJY2FzZSAweDAwOgorICAgICAgICAgICAgICAgCSAgICAgICAgRFBSSU5USygibmNwIHJlbmFtZWQgJXMgLT4gJXMuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRfZGVudHJ5LT5kX25hbWUubmFtZSxuZXdfZGVudHJ5LT5kX25hbWUubmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSAweDlFOgorCQkJZXJyb3IgPSAtRU5BTUVUT09MT05HOworCQkJYnJlYWs7CisJCWNhc2UgMHhGRjoKKwkJCWVycm9yID0gLUVOT0VOVDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXJyb3IgPSAtRUFDQ0VTOworCQkJYnJlYWs7CisJfQorb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgbmNwX21rbm9kKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkgICAgIGludCBtb2RlLCBkZXZfdCByZGV2KQoreworCWlmICghbmV3X3ZhbGlkX2RldihyZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKG5jcF9pc19uZnNfZXh0cmFzKE5DUF9TRVJWRVIoZGlyKSwgTkNQX0ZJTkZPKGRpciktPnZvbE51bWJlcikpIHsKKwkJRFBSSU5USyhLRVJOX0RFQlVHICJuY3BfbWtub2Q6IG1vZGUgPSAwJW9cbiIsIG1vZGUpOworCQlyZXR1cm4gbmNwX2NyZWF0ZV9uZXcoZGlyLCBkZW50cnksIG1vZGUsIHJkZXYsIDApOworCX0KKwlyZXR1cm4gLUVQRVJNOyAvKiBTdHJhbmdlLCBidXQgdHJ1ZSAqLworfQorCisvKiBUaGUgZm9sbG93aW5nIHJvdXRpbmVzIGFyZSB0YWtlbiBkaXJlY3RseSBmcm9tIG1zZG9zLWZzICovCisKKy8qIExpbmVhciBkYXkgbnVtYmVycyBvZiB0aGUgcmVzcGVjdGl2ZSAxc3RzIGluIG5vbi1sZWFwIHllYXJzLiAqLworCitzdGF0aWMgaW50IGRheV9uW10gPQorezAsIDMxLCA1OSwgOTAsIDEyMCwgMTUxLCAxODEsIDIxMiwgMjQzLCAyNzMsIDMwNCwgMzM0LCAwLCAwLCAwLCAwfTsKKy8qIEphbiBGZWIgTWFyIEFwciBNYXkgSnVuIEp1bCBBdWcgU2VwIE9jdCBOb3YgRGVjICovCisKKworZXh0ZXJuIHN0cnVjdCB0aW1lem9uZSBzeXNfdHo7CisKK3N0YXRpYyBpbnQgdXRjMmxvY2FsKGludCB0aW1lKQoreworCXJldHVybiB0aW1lIC0gc3lzX3R6LnR6X21pbnV0ZXN3ZXN0ICogNjA7Cit9CisKK3N0YXRpYyBpbnQgbG9jYWwydXRjKGludCB0aW1lKQoreworCXJldHVybiB0aW1lICsgc3lzX3R6LnR6X21pbnV0ZXN3ZXN0ICogNjA7Cit9CisKKy8qIENvbnZlcnQgYSBNUy1ET1MgdGltZS9kYXRlIHBhaXIgdG8gYSBVTklYIGRhdGUgKHNlY29uZHMgc2luY2UgMSAxIDcwKS4gKi8KK2ludAorbmNwX2RhdGVfZG9zMnVuaXgoX19sZTE2IHQsIF9fbGUxNiBkKQoreworCXVuc2lnbmVkIHNob3J0IHRpbWUgPSBsZTE2X3RvX2NwdSh0KSwgZGF0ZSA9IGxlMTZfdG9fY3B1KGQpOworCWludCBtb250aCwgeWVhciwgc2VjczsKKworCS8qIGZpcnN0IHN1YnRyYWN0IGFuZCBtYXNrIGFmdGVyIHRoYXQuLi4gT3RoZXJ3aXNlLCBpZgorCSAgIGRhdGUgPT0gMCwgYmFkIHRoaW5ncyBoYXBwZW4gKi8KKwltb250aCA9ICgoZGF0ZSA+PiA1KSAtIDEpICYgMTU7CisJeWVhciA9IGRhdGUgPj4gOTsKKwlzZWNzID0gKHRpbWUgJiAzMSkgKiAyICsgNjAgKiAoKHRpbWUgPj4gNSkgJiA2MykgKyAodGltZSA+PiAxMSkgKiAzNjAwICsKKwkJODY0MDAgKiAoKGRhdGUgJiAzMSkgLSAxICsgZGF5X25bbW9udGhdICsgKHllYXIgLyA0KSArIAorCQl5ZWFyICogMzY1IC0gKCh5ZWFyICYgMykgPT0gMCAmJiBtb250aCA8IDIgPyAxIDogMCkgKyAzNjUzKTsKKwkvKiBkYXlzIHNpbmNlIDEuMS43MCBwbHVzIDgwJ3MgbGVhcCBkYXkgKi8KKwlyZXR1cm4gbG9jYWwydXRjKHNlY3MpOworfQorCisKKy8qIENvbnZlcnQgbGluZWFyIFVOSVggZGF0ZSB0byBhIE1TLURPUyB0aW1lL2RhdGUgcGFpci4gKi8KK3ZvaWQKK25jcF9kYXRlX3VuaXgyZG9zKGludCB1bml4X2RhdGUsIF9fbGUxNiAqdGltZSwgX19sZTE2ICpkYXRlKQoreworCWludCBkYXksIHllYXIsIG5sX2RheSwgbW9udGg7CisKKwl1bml4X2RhdGUgPSB1dGMybG9jYWwodW5peF9kYXRlKTsKKwkqdGltZSA9IGNwdV90b19sZTE2KAorCQkodW5peF9kYXRlICUgNjApIC8gMiArICgoKHVuaXhfZGF0ZSAvIDYwKSAlIDYwKSA8PCA1KSArCisJCSgoKHVuaXhfZGF0ZSAvIDM2MDApICUgMjQpIDw8IDExKSk7CisJZGF5ID0gdW5peF9kYXRlIC8gODY0MDAgLSAzNjUyOworCXllYXIgPSBkYXkgLyAzNjU7CisJaWYgKCh5ZWFyICsgMykgLyA0ICsgMzY1ICogeWVhciA+IGRheSkKKwkJeWVhci0tOworCWRheSAtPSAoeWVhciArIDMpIC8gNCArIDM2NSAqIHllYXI7CisJaWYgKGRheSA9PSA1OSAmJiAhKHllYXIgJiAzKSkgeworCQlubF9kYXkgPSBkYXk7CisJCW1vbnRoID0gMjsKKwl9IGVsc2UgeworCQlubF9kYXkgPSAoeWVhciAmIDMpIHx8IGRheSA8PSA1OSA/IGRheSA6IGRheSAtIDE7CisJCWZvciAobW9udGggPSAwOyBtb250aCA8IDEyOyBtb250aCsrKQorCQkJaWYgKGRheV9uW21vbnRoXSA+IG5sX2RheSkKKwkJCQlicmVhazsKKwl9CisJKmRhdGUgPSBjcHVfdG9fbGUxNihubF9kYXkgLSBkYXlfblttb250aCAtIDFdICsgMSArIChtb250aCA8PCA1KSArICh5ZWFyIDw8IDkpKTsKK30KZGlmZiAtLWdpdCBhL2ZzL25jcGZzL2ZpbGUuYyBiL2ZzL25jcGZzL2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTQ3ZDliCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmNwZnMvZmlsZS5jCkBAIC0wLDAgKzEsMzAwIEBACisvKgorICogIGZpbGUuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgYnkgVm9sa2VyIExlbmRlY2tlCisgKiAgTW9kaWZpZWQgMTk5NyBQZXRlciBXYWx0ZW5iZXJnLCBCaWxsIEhhd2VzLCBEYXZpZCBXb29kaG91c2UgZm9yIDIuMSBkY2FjaGUKKyAqCisgKi8KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uY3BfZnMuaD4KKyNpbmNsdWRlICJuY3BsaWJfa2VybmVsLmgiCisKK3N0YXRpYyBpbnQgbmNwX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBkYXRhc3luYykKK3sKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE9wZW4gYSBmaWxlIHdpdGggdGhlIHNwZWNpZmllZCByZWFkL3dyaXRlIG1vZGUuCisgKi8KK2ludCBuY3BfbWFrZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCByaWdodCkKK3sKKwlpbnQgZXJyb3I7CisJaW50IGFjY2VzczsKKworCWVycm9yID0gLUVJTlZBTDsKKwlpZiAoIWlub2RlKSB7CisJCXByaW50ayhLRVJOX0VSUiAibmNwX21ha2Vfb3BlbjogZ290IE5VTEwgaW5vZGVcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlEUFJJTlRLKCJuY3BfbWFrZV9vcGVuOiBvcGVuZWQ9JWQsIHZvbHVtZSAjICV1LCBkaXIgZW50cnkgIyAldVxuIiwKKwkJYXRvbWljX3JlYWQoJk5DUF9GSU5GTyhpbm9kZSktPm9wZW5lZCksIAorCQlOQ1BfRklORk8oaW5vZGUpLT52b2xOdW1iZXIsIAorCQlOQ1BfRklORk8oaW5vZGUpLT5kaXJFbnROdW0pOworCWVycm9yID0gLUVBQ0NFUzsKKwlkb3duKCZOQ1BfRklORk8oaW5vZGUpLT5vcGVuX3NlbSk7CisJaWYgKCFhdG9taWNfcmVhZCgmTkNQX0ZJTkZPKGlub2RlKS0+b3BlbmVkKSkgeworCQlzdHJ1Y3QgbmNwX2VudHJ5X2luZm8gZmluZm87CisJCWludCByZXN1bHQ7CisKKwkJLyogdHJpZXMgbWF4LiByaWdodHMgKi8KKwkJZmluZm8uYWNjZXNzID0gT19SRFdSOworCQlyZXN1bHQgPSBuY3Bfb3Blbl9jcmVhdGVfZmlsZV9vcl9zdWJkaXIoTkNQX1NFUlZFUihpbm9kZSksCisJCQkJCWlub2RlLCBOVUxMLCBPQ19NT0RFX09QRU4sCisJCQkJCTAsIEFSX1JFQUQgfCBBUl9XUklURSwgJmZpbmZvKTsKKwkJaWYgKCFyZXN1bHQpCisJCQlnb3RvIHVwZGF0ZTsKKwkJLyogUkRXUiBkaWQgbm90IHN1Y2NlZWRlZCwgdHJ5IHJlYWRvbmx5IG9yIHdyaXRlb25seSBhcyByZXF1ZXN0ZWQgKi8KKwkJc3dpdGNoIChyaWdodCkgeworCQkJY2FzZSBPX1JET05MWToKKwkJCQlmaW5mby5hY2Nlc3MgPSBPX1JET05MWTsKKwkJCQlyZXN1bHQgPSBuY3Bfb3Blbl9jcmVhdGVfZmlsZV9vcl9zdWJkaXIoTkNQX1NFUlZFUihpbm9kZSksCisJCQkJCWlub2RlLCBOVUxMLCBPQ19NT0RFX09QRU4sCisJCQkJCTAsIEFSX1JFQUQsICZmaW5mbyk7CisJCQkJYnJlYWs7CisJCQljYXNlIE9fV1JPTkxZOgorCQkJCWZpbmZvLmFjY2VzcyA9IE9fV1JPTkxZOworCQkJCXJlc3VsdCA9IG5jcF9vcGVuX2NyZWF0ZV9maWxlX29yX3N1YmRpcihOQ1BfU0VSVkVSKGlub2RlKSwKKwkJCQkJaW5vZGUsIE5VTEwsIE9DX01PREVfT1BFTiwKKwkJCQkJMCwgQVJfV1JJVEUsICZmaW5mbyk7CisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKHJlc3VsdCkgeworCQkJUFBSSU5USygibmNwX21ha2Vfb3BlbjogZmFpbGVkLCByZXN1bHQ9JWRcbiIsIHJlc3VsdCk7CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKwkJLyoKKwkJICogVXBkYXRlIHRoZSBpbm9kZSBpbmZvcm1hdGlvbi4KKwkJICovCisJdXBkYXRlOgorCQluY3BfdXBkYXRlX2lub2RlKGlub2RlLCAmZmluZm8pOworCQlhdG9taWNfc2V0KCZOQ1BfRklORk8oaW5vZGUpLT5vcGVuZWQsIDEpOworCX0KKworCWFjY2VzcyA9IE5DUF9GSU5GTyhpbm9kZSktPmFjY2VzczsKKwlQUFJJTlRLKCJuY3BfbWFrZV9vcGVuOiBmaWxlIG9wZW4sIGFjY2Vzcz0leFxuIiwgYWNjZXNzKTsKKwlpZiAoYWNjZXNzID09IHJpZ2h0IHx8IGFjY2VzcyA9PSBPX1JEV1IpIHsKKwkJYXRvbWljX2luYygmTkNQX0ZJTkZPKGlub2RlKS0+b3BlbmVkKTsKKwkJZXJyb3IgPSAwOworCX0KKworb3V0X3VubG9jazoKKwl1cCgmTkNQX0ZJTkZPKGlub2RlKS0+b3Blbl9zZW0pOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHNzaXplX3QKK25jcF9maWxlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc2l6ZV90IGFscmVhZHlfcmVhZCA9IDA7CisJb2ZmX3QgcG9zOworCXNpemVfdCBidWZzaXplOworCWludCBlcnJvcjsKKwl2b2lkKiBmcmVlcGFnZTsKKwlzaXplX3QgZnJlZWxlbjsKKworCURQUklOVEsoIm5jcF9maWxlX3JlYWQ6IGVudGVyICVzLyVzXG4iLAorCQlkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwlpZiAoIW5jcF9jb25uX3ZhbGlkKE5DUF9TRVJWRVIoaW5vZGUpKSkKKwkJcmV0dXJuIC1FSU87CisKKwlwb3MgPSAqcHBvczsKKworCWlmICgoc3NpemVfdCkgY291bnQgPCAwKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoIWNvdW50KQorCQlyZXR1cm4gMDsKKwlpZiAocG9zID4gaW5vZGUtPmlfc2ItPnNfbWF4Ynl0ZXMpCisJCXJldHVybiAwOworCWlmIChwb3MgKyBjb3VudCA+IGlub2RlLT5pX3NiLT5zX21heGJ5dGVzKSB7CisJCWNvdW50ID0gaW5vZGUtPmlfc2ItPnNfbWF4Ynl0ZXMgLSBwb3M7CisJfQorCisJZXJyb3IgPSBuY3BfbWFrZV9vcGVuKGlub2RlLCBPX1JET05MWSk7CisJaWYgKGVycm9yKSB7CisJCURQUklOVEsoS0VSTl9FUlIgIm5jcF9maWxlX3JlYWQ6IG9wZW4gZmFpbGVkLCBlcnJvcj0lZFxuIiwgZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJYnVmc2l6ZSA9IE5DUF9TRVJWRVIoaW5vZGUpLT5idWZmZXJfc2l6ZTsKKworCWVycm9yID0gLUVJTzsKKwlmcmVlbGVuID0gbmNwX3JlYWRfYm91bmNlX3NpemUoYnVmc2l6ZSk7CisJZnJlZXBhZ2UgPSB2bWFsbG9jKGZyZWVsZW4pOworCWlmICghZnJlZXBhZ2UpCisJCWdvdG8gb3V0cmVsOworCWVycm9yID0gMDsKKwkvKiBGaXJzdCByZWFkIGluIGFzIG11Y2ggYXMgcG9zc2libGUgZm9yIGVhY2ggYnVmc2l6ZS4gKi8KKwl3aGlsZSAoYWxyZWFkeV9yZWFkIDwgY291bnQpIHsKKwkJaW50IHJlYWRfdGhpc190aW1lOworCQlzaXplX3QgdG9fcmVhZCA9IG1pbl90KHVuc2lnbmVkIGludCwKKwkJCQkgICAgIGJ1ZnNpemUgLSAocG9zICUgYnVmc2l6ZSksCisJCQkJICAgICBjb3VudCAtIGFscmVhZHlfcmVhZCk7CisKKwkJZXJyb3IgPSBuY3BfcmVhZF9ib3VuY2UoTkNQX1NFUlZFUihpbm9kZSksCisJCQkgCU5DUF9GSU5GTyhpbm9kZSktPmZpbGVfaGFuZGxlLAorCQkJCXBvcywgdG9fcmVhZCwgYnVmLCAmcmVhZF90aGlzX3RpbWUsIAorCQkJCWZyZWVwYWdlLCBmcmVlbGVuKTsKKwkJaWYgKGVycm9yKSB7CisJCQllcnJvciA9IC1FSU87CS8qIE5XIGVycm5vIC0+IExpbnV4IGVycm5vICovCisJCQlicmVhazsKKwkJfQorCQlwb3MgKz0gcmVhZF90aGlzX3RpbWU7CisJCWJ1ZiArPSByZWFkX3RoaXNfdGltZTsKKwkJYWxyZWFkeV9yZWFkICs9IHJlYWRfdGhpc190aW1lOworCisJCWlmIChyZWFkX3RoaXNfdGltZSAhPSB0b19yZWFkKSB7CisJCQlicmVhazsKKwkJfQorCX0KKwl2ZnJlZShmcmVlcGFnZSk7CisKKwkqcHBvcyA9IHBvczsKKworCWZpbGVfYWNjZXNzZWQoZmlsZSk7CisKKwlEUFJJTlRLKCJuY3BfZmlsZV9yZWFkOiBleGl0ICVzLyVzXG4iLAorCQlkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSk7CitvdXRyZWw6CisJbmNwX2lub2RlX2Nsb3NlKGlub2RlKTsJCQorCXJldHVybiBhbHJlYWR5X3JlYWQgPyBhbHJlYWR5X3JlYWQgOiBlcnJvcjsKK30KKworc3RhdGljIHNzaXplX3QKK25jcF9maWxlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXNpemVfdCBhbHJlYWR5X3dyaXR0ZW4gPSAwOworCW9mZl90IHBvczsKKwlzaXplX3QgYnVmc2l6ZTsKKwlpbnQgZXJybm87CisJdm9pZCogYm91bmNlYnVmZmVyOworCisJRFBSSU5USygibmNwX2ZpbGVfd3JpdGU6IGVudGVyICVzLyVzXG4iLAorCQlkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisJaWYgKCFuY3BfY29ubl92YWxpZChOQ1BfU0VSVkVSKGlub2RlKSkpCisJCXJldHVybiAtRUlPOworCWlmICgoc3NpemVfdCkgY291bnQgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwb3MgPSAqcHBvczsKKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fQVBQRU5EKSB7CisJCXBvcyA9IGlub2RlLT5pX3NpemU7CisJfQorCisJaWYgKHBvcyArIGNvdW50ID4gTUFYX05PTl9MRlMgJiYgIShmaWxlLT5mX2ZsYWdzJk9fTEFSR0VGSUxFKSkgeworCQlpZiAocG9zID49IE1BWF9OT05fTEZTKSB7CisJCQlzZW5kX3NpZyhTSUdYRlNaLCBjdXJyZW50LCAwKTsKKwkJCXJldHVybiAtRUZCSUc7CisJCX0KKwkJaWYgKGNvdW50ID4gTUFYX05PTl9MRlMgLSAodTMyKXBvcykgeworCQkJY291bnQgPSBNQVhfTk9OX0xGUyAtICh1MzIpcG9zOworCQl9CisJfQorCWlmIChwb3MgPj0gaW5vZGUtPmlfc2ItPnNfbWF4Ynl0ZXMpIHsKKwkJaWYgKGNvdW50IHx8IHBvcyA+IGlub2RlLT5pX3NiLT5zX21heGJ5dGVzKSB7CisJCQlzZW5kX3NpZyhTSUdYRlNaLCBjdXJyZW50LCAwKTsKKwkJCXJldHVybiAtRUZCSUc7CisJCX0KKwl9CisJaWYgKHBvcyArIGNvdW50ID4gaW5vZGUtPmlfc2ItPnNfbWF4Ynl0ZXMpIHsKKwkJY291bnQgPSBpbm9kZS0+aV9zYi0+c19tYXhieXRlcyAtIHBvczsKKwl9CisJCisJaWYgKCFjb3VudCkKKwkJcmV0dXJuIDA7CisJZXJybm8gPSBuY3BfbWFrZV9vcGVuKGlub2RlLCBPX1dST05MWSk7CisJaWYgKGVycm5vKSB7CisJCURQUklOVEsoS0VSTl9FUlIgIm5jcF9maWxlX3dyaXRlOiBvcGVuIGZhaWxlZCwgZXJyb3I9JWRcbiIsIGVycm5vKTsKKwkJcmV0dXJuIGVycm5vOworCX0KKwlidWZzaXplID0gTkNQX1NFUlZFUihpbm9kZSktPmJ1ZmZlcl9zaXplOworCisJYWxyZWFkeV93cml0dGVuID0gMDsKKworCWJvdW5jZWJ1ZmZlciA9IHZtYWxsb2MoYnVmc2l6ZSk7CisJaWYgKCFib3VuY2VidWZmZXIpIHsKKwkJZXJybm8gPSAtRUlPOwkvKiAtRU5PTUVNICovCisJCWdvdG8gb3V0cmVsOworCX0KKwl3aGlsZSAoYWxyZWFkeV93cml0dGVuIDwgY291bnQpIHsKKwkJaW50IHdyaXR0ZW5fdGhpc190aW1lOworCQlzaXplX3QgdG9fd3JpdGUgPSBtaW5fdCh1bnNpZ25lZCBpbnQsCisJCQkJICAgICAgYnVmc2l6ZSAtIChwb3MgJSBidWZzaXplKSwKKwkJCQkgICAgICBjb3VudCAtIGFscmVhZHlfd3JpdHRlbik7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGJvdW5jZWJ1ZmZlciwgYnVmLCB0b193cml0ZSkpIHsKKwkJCWVycm5vID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChuY3Bfd3JpdGVfa2VybmVsKE5DUF9TRVJWRVIoaW5vZGUpLCAKKwkJICAgIE5DUF9GSU5GTyhpbm9kZSktPmZpbGVfaGFuZGxlLAorCQkgICAgcG9zLCB0b193cml0ZSwgYm91bmNlYnVmZmVyLCAmd3JpdHRlbl90aGlzX3RpbWUpICE9IDApIHsKKwkJCWVycm5vID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJCXBvcyArPSB3cml0dGVuX3RoaXNfdGltZTsKKwkJYnVmICs9IHdyaXR0ZW5fdGhpc190aW1lOworCQlhbHJlYWR5X3dyaXR0ZW4gKz0gd3JpdHRlbl90aGlzX3RpbWU7CisKKwkJaWYgKHdyaXR0ZW5fdGhpc190aW1lICE9IHRvX3dyaXRlKSB7CisJCQlicmVhazsKKwkJfQorCX0KKwl2ZnJlZShib3VuY2VidWZmZXIpOworCisJaW5vZGVfdXBkYXRlX3RpbWUoaW5vZGUsIDEpOworCisJKnBwb3MgPSBwb3M7CisKKwlpZiAocG9zID4gaW5vZGUtPmlfc2l6ZSkgeworCQlpbm9kZS0+aV9zaXplID0gcG9zOworCX0KKwlEUFJJTlRLKCJuY3BfZmlsZV93cml0ZTogZXhpdCAlcy8lc1xuIiwKKwkJZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworb3V0cmVsOgorCW5jcF9pbm9kZV9jbG9zZShpbm9kZSk7CQkKKwlyZXR1cm4gYWxyZWFkeV93cml0dGVuID8gYWxyZWFkeV93cml0dGVuIDogZXJybm87Cit9CisKK3N0YXRpYyBpbnQgbmNwX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpIHsKKwlpZiAobmNwX21ha2VfY2xvc2VkKGlub2RlKSkgeworCQlEUFJJTlRLKCJuY3BfcmVsZWFzZTogZmFpbGVkIHRvIGNsb3NlXG4iKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgbmNwX2ZpbGVfb3BlcmF0aW9ucyA9Cit7CisJLmxsc2VlawkJPSByZW1vdGVfbGxzZWVrLAorCS5yZWFkCQk9IG5jcF9maWxlX3JlYWQsCisJLndyaXRlCQk9IG5jcF9maWxlX3dyaXRlLAorCS5pb2N0bAkJPSBuY3BfaW9jdGwsCisJLm1tYXAJCT0gbmNwX21tYXAsCisJLnJlbGVhc2UJPSBuY3BfcmVsZWFzZSwKKwkuZnN5bmMJCT0gbmNwX2ZzeW5jLAorfTsKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgbmNwX2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyA9Cit7CisJLnNldGF0dHIJPSBuY3Bfbm90aWZ5X2NoYW5nZSwKK307CmRpZmYgLS1naXQgYS9mcy9uY3Bmcy9nZXRvcHQuYyBiL2ZzL25jcGZzL2dldG9wdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNWIwMDMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uY3Bmcy9nZXRvcHQuYwpAQCAtMCwwICsxLDc1IEBACisvKgorICogZ2V0b3B0LmMKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKworI2luY2x1ZGUgImdldG9wdC5oIgorCisvKioKKyAqCW5jcF9nZXRvcHQgLSBvcHRpb24gcGFyc2VyCisgKglAY2FsbGVyOiBuYW1lIG9mIHRoZSBjYWxsZXIsIGZvciBlcnJvciBtZXNzYWdlcworICoJQG9wdGlvbnM6IHRoZSBvcHRpb25zIHN0cmluZworICoJQG9wdHM6IGFuIGFycmF5IG9mICZzdHJ1Y3Qgb3B0aW9uIGVudHJpZXMgY29udHJvbGxpbmcgcGFyc2VyIG9wZXJhdGlvbnMKKyAqCUBvcHRvcHQ6IG91dHB1dDsgd2lsbCBjb250YWluIHRoZSBjdXJyZW50IG9wdGlvbgorICoJQG9wdGFyZzogb3V0cHV0OyB3aWxsIGNvbnRhaW4gdGhlIHZhbHVlIChpZiBvbmUgZXhpc3RzKQorICoJQGZsYWc6IG91dHB1dDsgbWF5IGJlIE5VTEw7IHNob3VsZCBwb2ludCB0byBhIGxvbmcgZm9yIG9yJ2luZyBmbGFncworICoJQHZhbHVlOiBvdXRwdXQ7IG1heSBiZSBOVUxMOyB3aWxsIGJlIG92ZXJ3cml0dGVuIHdpdGggdGhlIGludGVnZXIgdmFsdWUKKyAqCQlvZiB0aGUgY3VycmVudCBhcmd1bWVudC4KKyAqCisgKglIZWxwZXIgdG8gcGFyc2Ugb3B0aW9ucyBvbiB0aGUgZm9ybWF0IHVzZWQgYnkgbW91bnQgKCJhPWIsYz1kLGUsZiIpLgorICoJUmV0dXJucyBvcHRzLT52YWwgaWYgYSBtYXRjaGluZyBlbnRyeSBpbiB0aGUgJ29wdHMnIGFycmF5IGlzIGZvdW5kLAorICoJMCB3aGVuIG5vIG1vcmUgdG9rZW5zIGFyZSBmb3VuZCwgLTEgaWYgYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQuCisgKi8KK2ludCBuY3BfZ2V0b3B0KGNvbnN0IGNoYXIgKmNhbGxlciwgY2hhciAqKm9wdGlvbnMsIGNvbnN0IHN0cnVjdCBuY3Bfb3B0aW9uICpvcHRzLAorCSAgICAgICBjaGFyICoqb3B0b3B0LCBjaGFyICoqb3B0YXJnLCB1bnNpZ25lZCBsb25nICp2YWx1ZSkKK3sKKwljaGFyICp0b2tlbjsKKwljaGFyICp2YWw7CisKKwlkbyB7CisJCWlmICgodG9rZW4gPSBzdHJzZXAob3B0aW9ucywgIiwiKSkgPT0gTlVMTCkKKwkJCXJldHVybiAwOworCX0gd2hpbGUgKCp0b2tlbiA9PSAnXDAnKTsKKwlpZiAob3B0b3B0KQorCQkqb3B0b3B0ID0gdG9rZW47CisKKwlpZiAoKHZhbCA9IHN0cmNociAodG9rZW4sICc9JykpICE9IE5VTEwpIHsKKwkJKnZhbCsrID0gMDsKKwl9CisJKm9wdGFyZyA9IHZhbDsKKwlmb3IgKDsgb3B0cy0+bmFtZTsgb3B0cysrKSB7CisJCWlmICghc3RyY21wKG9wdHMtPm5hbWUsIHRva2VuKSkgeworCQkJaWYgKCF2YWwpIHsKKwkJCQlpZiAob3B0cy0+aGFzX2FyZyAmIE9QVF9OT1BBUkFNKSB7CisJCQkJCXJldHVybiBvcHRzLT52YWw7CisJCQkJfQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiB0aGUgJXMgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iLAorCQkJCSAgICAgICBjYWxsZXIsIHRva2VuKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWlmIChvcHRzLT5oYXNfYXJnICYgT1BUX0lOVCkgeworCQkJCWNoYXIqIHY7CisKKwkJCQkqdmFsdWUgPSBzaW1wbGVfc3RydG91bCh2YWwsICZ2LCAwKTsKKwkJCQlpZiAoISp2KSB7CisJCQkJCXJldHVybiBvcHRzLT52YWw7CisJCQkJfQorCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBpbnZhbGlkIG51bWVyaWMgdmFsdWUgaW4gJXM9JXNcbiIsCisJCQkJCWNhbGxlciwgdG9rZW4sIHZhbCk7CisJCQkJcmV0dXJuIC1FRE9NOworCQkJfQorCQkJaWYgKG9wdHMtPmhhc19hcmcgJiBPUFRfU1RSSU5HKSB7CisJCQkJcmV0dXJuIG9wdHMtPnZhbDsKKwkJCX0KKwkJCXByaW50ayhLRVJOX0lORk8gIiVzOiB1bmV4cGVjdGVkIGFyZ3VtZW50ICVzIHRvIHRoZSAlcyBvcHRpb25cbiIsCisJCQkJY2FsbGVyLCB2YWwsIHRva2VuKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCXByaW50ayhLRVJOX0lORk8gIiVzOiBVbnJlY29nbml6ZWQgbW91bnQgb3B0aW9uICVzXG4iLCBjYWxsZXIsIHRva2VuKTsKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CmRpZmYgLS1naXQgYS9mcy9uY3Bmcy9nZXRvcHQuaCBiL2ZzL25jcGZzL2dldG9wdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjY2MwMDcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uY3Bmcy9nZXRvcHQuaApAQCAtMCwwICsxLDE2IEBACisjaWZuZGVmIF9MSU5VWF9HRVRPUFRfSAorI2RlZmluZSBfTElOVVhfR0VUT1BUX0gKKworI2RlZmluZSBPUFRfTk9QQVJBTQkxCisjZGVmaW5lIE9QVF9JTlQJCTIKKyNkZWZpbmUgT1BUX1NUUklORwk0CitzdHJ1Y3QgbmNwX29wdGlvbiB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBpbnQgaGFzX2FyZzsKKwlpbnQgdmFsOworfTsKKworZXh0ZXJuIGludCBuY3BfZ2V0b3B0KGNvbnN0IGNoYXIgKmNhbGxlciwgY2hhciAqKm9wdGlvbnMsIGNvbnN0IHN0cnVjdCBuY3Bfb3B0aW9uICpvcHRzLAorCQkgICAgICBjaGFyICoqb3B0b3B0LCBjaGFyICoqb3B0YXJnLCB1bnNpZ25lZCBsb25nICp2YWx1ZSk7CisKKyNlbmRpZiAvKiBfTElOVVhfR0VUT1BUX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL25jcGZzL2lub2RlLmMgYi9mcy9uY3Bmcy9pbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0Nzk1ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uY3Bmcy9pbm9kZS5jCkBAIC0wLDAgKzEsMTAxMiBAQAorLyoKKyAqICBpbm9kZS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBieSBWb2xrZXIgTGVuZGVja2UKKyAqICBNb2RpZmllZCBmb3IgYmlnIGVuZGlhbiBieSBKLkYuIENoYWRpbWEgYW5kIERhdmlkIFMuIE1pbGxlcgorICogIE1vZGlmaWVkIDE5OTcgUGV0ZXIgV2FsdGVuYmVyZywgQmlsbCBIYXdlcywgRGF2aWQgV29vZGhvdXNlIGZvciAyLjEgZGNhY2hlCisgKiAgTW9kaWZpZWQgMTk5OCBXb2xmcmFtIFBpZW5rb3NzIGZvciBOTFMKKyAqICBNb2RpZmllZCAyMDAwIEJlbiBIYXJyaXMsIFVuaXZlcnNpdHkgb2YgQ2FtYnJpZGdlIGZvciBORlMgTlMgbWV0YS1pbmZvCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uY3BfZnMuaD4KKworI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisKKyNpbmNsdWRlICJuY3BsaWJfa2VybmVsLmgiCisjaW5jbHVkZSAiZ2V0b3B0LmgiCisKK3N0YXRpYyB2b2lkIG5jcF9kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICopOworc3RhdGljIHZvaWQgbmNwX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CitzdGF0aWMgaW50ICBuY3Bfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3Qga3N0YXRmcyAqKTsKKworc3RhdGljIGttZW1fY2FjaGVfdCAqIG5jcF9pbm9kZV9jYWNoZXA7CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKm5jcF9hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBuY3BfaW5vZGVfaW5mbyAqZWk7CisJZWkgPSAoc3RydWN0IG5jcF9pbm9kZV9pbmZvICopa21lbV9jYWNoZV9hbGxvYyhuY3BfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJaWYgKCFlaSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuICZlaS0+dmZzX2lub2RlOworfQorCitzdGF0aWMgdm9pZCBuY3BfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWttZW1fY2FjaGVfZnJlZShuY3BfaW5vZGVfY2FjaGVwLCBOQ1BfRklORk8oaW5vZGUpKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKiBmb28sIGttZW1fY2FjaGVfdCAqIGNhY2hlcCwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgbmNwX2lub2RlX2luZm8gKmVpID0gKHN0cnVjdCBuY3BfaW5vZGVfaW5mbyAqKSBmb287CisKKwlpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRll8U0xBQl9DVE9SX0NPTlNUUlVDVE9SKSkgPT0KKwkgICAgU0xBQl9DVE9SX0NPTlNUUlVDVE9SKSB7CisJCWluaXRfTVVURVgoJmVpLT5vcGVuX3NlbSk7CisJCWlub2RlX2luaXRfb25jZSgmZWktPnZmc19pbm9kZSk7CisJfQorfQorIAorc3RhdGljIGludCBpbml0X2lub2RlY2FjaGUodm9pZCkKK3sKKwluY3BfaW5vZGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoIm5jcF9pbm9kZV9jYWNoZSIsCisJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBuY3BfaW5vZGVfaW5mbyksCisJCQkJCSAgICAgMCwgU0xBQl9SRUNMQUlNX0FDQ09VTlQsCisJCQkJCSAgICAgaW5pdF9vbmNlLCBOVUxMKTsKKwlpZiAobmNwX2lub2RlX2NhY2hlcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGVzdHJveV9pbm9kZWNhY2hlKHZvaWQpCit7CisJaWYgKGttZW1fY2FjaGVfZGVzdHJveShuY3BfaW5vZGVfY2FjaGVwKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAibmNwX2lub2RlX2NhY2hlOiBub3QgYWxsIHN0cnVjdHVyZXMgd2VyZSBmcmVlZFxuIik7Cit9CisKK3N0YXRpYyBpbnQgbmNwX3JlbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50ICpmbGFncywgY2hhciogZGF0YSkKK3sKKwkqZmxhZ3MgfD0gTVNfTk9ESVJBVElNRTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIG5jcF9zb3BzID0KK3sKKwkuYWxsb2NfaW5vZGUJPSBuY3BfYWxsb2NfaW5vZGUsCisJLmRlc3Ryb3lfaW5vZGUJPSBuY3BfZGVzdHJveV9pbm9kZSwKKwkuZHJvcF9pbm9kZQk9IGdlbmVyaWNfZGVsZXRlX2lub2RlLAorCS5kZWxldGVfaW5vZGUJPSBuY3BfZGVsZXRlX2lub2RlLAorCS5wdXRfc3VwZXIJPSBuY3BfcHV0X3N1cGVyLAorCS5zdGF0ZnMJCT0gbmNwX3N0YXRmcywKKwkucmVtb3VudF9mcwk9IG5jcF9yZW1vdW50LAorfTsKKworZXh0ZXJuIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBuY3Bfcm9vdF9kZW50cnlfb3BlcmF0aW9uczsKKyNpZiBkZWZpbmVkKENPTkZJR19OQ1BGU19FWFRSQVMpIHx8IGRlZmluZWQoQ09ORklHX05DUEZTX05GU19OUykKK2V4dGVybiBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIG5jcF9zeW1saW5rX2FvcHM7CitleHRlcm4gaW50IG5jcF9zeW1saW5rKHN0cnVjdCBpbm9kZSosIHN0cnVjdCBkZW50cnkqLCBjb25zdCBjaGFyKik7CisjZW5kaWYKKworLyoKKyAqIEZpbGwgaW4gdGhlIG5jcGZzLXNwZWNpZmljIGluZm9ybWF0aW9uIGluIHRoZSBpbm9kZS4KKyAqLworc3RhdGljIHZvaWQgbmNwX3VwZGF0ZV9kaXJlbnQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG5jcF9lbnRyeV9pbmZvICpud2luZm8pCit7CisJTkNQX0ZJTkZPKGlub2RlKS0+RG9zRGlyTnVtID0gbndpbmZvLT5pLkRvc0Rpck51bTsKKwlOQ1BfRklORk8oaW5vZGUpLT5kaXJFbnROdW0gPSBud2luZm8tPmkuZGlyRW50TnVtOworCU5DUF9GSU5GTyhpbm9kZSktPnZvbE51bWJlciA9IG53aW5mby0+dm9sdW1lOworfQorCit2b2lkIG5jcF91cGRhdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG5jcF9lbnRyeV9pbmZvICpud2luZm8pCit7CisJbmNwX3VwZGF0ZV9kaXJlbnQoaW5vZGUsIG53aW5mbyk7CisJTkNQX0ZJTkZPKGlub2RlKS0+bndhdHRyID0gbndpbmZvLT5pLmF0dHJpYnV0ZXM7CisJTkNQX0ZJTkZPKGlub2RlKS0+YWNjZXNzID0gbndpbmZvLT5hY2Nlc3M7CisJbWVtY3B5KE5DUF9GSU5GTyhpbm9kZSktPmZpbGVfaGFuZGxlLCBud2luZm8tPmZpbGVfaGFuZGxlLAorCQkJc2l6ZW9mKG53aW5mby0+ZmlsZV9oYW5kbGUpKTsKKwlEUFJJTlRLKCJuY3BfdXBkYXRlX2lub2RlOiB1cGRhdGVkICVzLCB2b2xudW09JWQsIGRpcmVudD0ldVxuIiwKKwkJbndpbmZvLT5pLmVudHJ5TmFtZSwgTkNQX0ZJTkZPKGlub2RlKS0+dm9sTnVtYmVyLAorCQlOQ1BfRklORk8oaW5vZGUpLT5kaXJFbnROdW0pOworfQorCitzdGF0aWMgdm9pZCBuY3BfdXBkYXRlX2RhdGVzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBud19pbmZvX3N0cnVjdCAqbndpKQoreworCS8qIE5GUyBuYW1lc3BhY2UgbW9kZSBvdmVycmlkZXMgb3RoZXJzIGlmIGl0J3Mgc2V0LiAqLworCURQUklOVEsoS0VSTl9ERUJVRyAibmNwX3VwZGF0ZV9kYXRlc19hbmRfbW9kZTogKCVzKSBuZnMubW9kZT0wJW9cbiIsCisJCW53aS0+ZW50cnlOYW1lLCBud2ktPm5mcy5tb2RlKTsKKwlpZiAobndpLT5uZnMubW9kZSkgeworCQkvKiBYWFggU2VjdXJpdHk/ICovCisJCWlub2RlLT5pX21vZGUgPSBud2ktPm5mcy5tb2RlOworCX0KKworCWlub2RlLT5pX2Jsb2NrcyA9IChpbm9kZS0+aV9zaXplICsgTkNQX0JMT0NLX1NJWkUgLSAxKSA+PiBOQ1BfQkxPQ0tfU0hJRlQ7CisKKwlpbm9kZS0+aV9tdGltZS50dl9zZWMgPSBuY3BfZGF0ZV9kb3MydW5peChud2ktPm1vZGlmeVRpbWUsIG53aS0+bW9kaWZ5RGF0ZSk7CisJaW5vZGUtPmlfY3RpbWUudHZfc2VjID0gbmNwX2RhdGVfZG9zMnVuaXgobndpLT5jcmVhdGlvblRpbWUsIG53aS0+Y3JlYXRpb25EYXRlKTsKKwlpbm9kZS0+aV9hdGltZS50dl9zZWMgPSBuY3BfZGF0ZV9kb3MydW5peCgwLCBud2ktPmxhc3RBY2Nlc3NEYXRlKTsKKwlpbm9kZS0+aV9hdGltZS50dl9uc2VjID0gMDsKKwlpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gMDsKKwlpbm9kZS0+aV9jdGltZS50dl9uc2VjID0gMDsKK30KKworc3RhdGljIHZvaWQgbmNwX3VwZGF0ZV9hdHRycyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbmNwX2VudHJ5X2luZm8gKm53aW5mbykKK3sKKwlzdHJ1Y3QgbndfaW5mb19zdHJ1Y3QgKm53aSA9ICZud2luZm8tPmk7CisJc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciA9IE5DUF9TRVJWRVIoaW5vZGUpOworCisJaWYgKG53aS0+YXR0cmlidXRlcyAmIGFESVIpIHsKKwkJaW5vZGUtPmlfbW9kZSA9IHNlcnZlci0+bS5kaXJfbW9kZTsKKwkJLyogZm9yIGRpcmVjdG9yaWVzIGRhdGFTdHJlYW1TaXplIHNlZW1zIHRvIGJlIHNvbWUKKwkJICAgT2JqZWN0IElEID8/PyAqLworCQlpbm9kZS0+aV9zaXplID0gTkNQX0JMT0NLX1NJWkU7CisJfSBlbHNlIHsKKwkJaW5vZGUtPmlfbW9kZSA9IHNlcnZlci0+bS5maWxlX21vZGU7CisJCWlub2RlLT5pX3NpemUgPSBsZTMyX3RvX2NwdShud2ktPmRhdGFTdHJlYW1TaXplKTsKKyNpZmRlZiBDT05GSUdfTkNQRlNfRVhUUkFTCisJCWlmICgoc2VydmVyLT5tLmZsYWdzICYgKE5DUF9NT1VOVF9FWFRSQVN8TkNQX01PVU5UX1NZTUxJTktTKSkgCisJCSAmJiAobndpLT5hdHRyaWJ1dGVzICYgYVNIQVJFRCkpIHsKKwkJCXN3aXRjaCAobndpLT5hdHRyaWJ1dGVzICYgKGFISURERU58YVNZU1RFTSkpIHsKKwkJCQljYXNlIGFISURERU46CisJCQkJCWlmIChzZXJ2ZXItPm0uZmxhZ3MgJiBOQ1BfTU9VTlRfU1lNTElOS1MpIHsKKwkJCQkJCWlmICgvKiAoaW5vZGUtPmlfc2l6ZSA+PSBOQ1BfTUlOX1NZTUxJTktfU0laRSkKKwkJCQkJCSAmJiAqLyAoaW5vZGUtPmlfc2l6ZSA8PSBOQ1BfTUFYX1NZTUxJTktfU0laRSkpIHsKKwkJCQkJCQlpbm9kZS0+aV9tb2RlID0gKGlub2RlLT5pX21vZGUgJiB+U19JRk1UKSB8IFNfSUZMTks7CisJCQkJCQkJTkNQX0ZJTkZPKGlub2RlKS0+ZmxhZ3MgfD0gTkNQSV9LTFVER0VfU1lNTElOSzsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQkvKiBGQUxMVEhST1VHSCAqLworCQkJCWNhc2UgMDoKKwkJCQkJaWYgKHNlcnZlci0+bS5mbGFncyAmIE5DUF9NT1VOVF9FWFRSQVMpCisJCQkJCQlpbm9kZS0+aV9tb2RlIHw9IFNfSVJVR087CisJCQkJCWJyZWFrOworCQkJCWNhc2UgYVNZU1RFTToKKwkJCQkJaWYgKHNlcnZlci0+bS5mbGFncyAmIE5DUF9NT1VOVF9FWFRSQVMpCisJCQkJCQlpbm9kZS0+aV9tb2RlIHw9IChpbm9kZS0+aV9tb2RlID4+IDIpICYgU19JWFVHTzsKKwkJCQkJYnJlYWs7CisJCQkJLyogY2FzZSBhU1lTVEVNfGFISURERU46ICovCisJCQkJZGVmYXVsdDoKKwkJCQkJLyogcmVzZXJ2ZWQgY29tYmluYXRpb24gKi8KKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKyNlbmRpZgorCX0KKwlpZiAobndpLT5hdHRyaWJ1dGVzICYgYVJPTkxZKSBpbm9kZS0+aV9tb2RlICY9IH5TX0lXVUdPOworfQorCit2b2lkIG5jcF91cGRhdGVfaW5vZGUyKHN0cnVjdCBpbm9kZSogaW5vZGUsIHN0cnVjdCBuY3BfZW50cnlfaW5mbyAqbndpbmZvKQoreworCU5DUF9GSU5GTyhpbm9kZSktPmZsYWdzID0gMDsKKwlpZiAoIWF0b21pY19yZWFkKCZOQ1BfRklORk8oaW5vZGUpLT5vcGVuZWQpKSB7CisJCU5DUF9GSU5GTyhpbm9kZSktPm53YXR0ciA9IG53aW5mby0+aS5hdHRyaWJ1dGVzOworCQluY3BfdXBkYXRlX2F0dHJzKGlub2RlLCBud2luZm8pOworCX0KKworCW5jcF91cGRhdGVfZGF0ZXMoaW5vZGUsICZud2luZm8tPmkpOworCW5jcF91cGRhdGVfZGlyZW50KGlub2RlLCBud2luZm8pOworfQorCisvKgorICogRmlsbCBpbiB0aGUgaW5vZGUgYmFzZWQgb24gdGhlIG5jcF9lbnRyeV9pbmZvIHN0cnVjdHVyZS4KKyAqLworc3RhdGljIHZvaWQgbmNwX3NldF9hdHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBuY3BfZW50cnlfaW5mbyAqbndpbmZvKQoreworCXN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIgPSBOQ1BfU0VSVkVSKGlub2RlKTsKKworCU5DUF9GSU5GTyhpbm9kZSktPmZsYWdzID0gMDsKKwkKKwluY3BfdXBkYXRlX2F0dHJzKGlub2RlLCBud2luZm8pOworCisJRERQUklOVEsoIm5jcF9yZWFkX2lub2RlOiBpbm9kZS0+aV9tb2RlID0gJXVcbiIsIGlub2RlLT5pX21vZGUpOworCisJaW5vZGUtPmlfbmxpbmsgPSAxOworCWlub2RlLT5pX3VpZCA9IHNlcnZlci0+bS51aWQ7CisJaW5vZGUtPmlfZ2lkID0gc2VydmVyLT5tLmdpZDsKKwlpbm9kZS0+aV9ibGtzaXplID0gTkNQX0JMT0NLX1NJWkU7CisKKwluY3BfdXBkYXRlX2RhdGVzKGlub2RlLCAmbndpbmZvLT5pKTsKKwluY3BfdXBkYXRlX2lub2RlKGlub2RlLCBud2luZm8pOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfTkNQRlNfRVhUUkFTKSB8fCBkZWZpbmVkKENPTkZJR19OQ1BGU19ORlNfTlMpCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgbmNwX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkucmVhZGxpbmsJPSBnZW5lcmljX3JlYWRsaW5rLAorCS5mb2xsb3dfbGluawk9IHBhZ2VfZm9sbG93X2xpbmtfbGlnaHQsCisJLnB1dF9saW5rCT0gcGFnZV9wdXRfbGluaywKKwkuc2V0YXR0cgk9IG5jcF9ub3RpZnlfY2hhbmdlLAorfTsKKyNlbmRpZgorCisvKgorICogR2V0IGEgbmV3IGlub2RlLgorICovCitzdHJ1Y3QgaW5vZGUgKiAKK25jcF9pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBuY3BfZW50cnlfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJaWYgKGluZm8gPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIm5jcF9pZ2V0OiBpbmZvIGlzIE5VTExcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpbm9kZSA9IG5ld19pbm9kZShzYik7CisJaWYgKGlub2RlKSB7CisJCWF0b21pY19zZXQoJk5DUF9GSU5GTyhpbm9kZSktPm9wZW5lZCwgaW5mby0+b3BlbmVkKTsKKworCQlpbm9kZS0+aV9pbm8gPSBpbmZvLT5pbm87CisJCW5jcF9zZXRfYXR0cihpbm9kZSwgaW5mbyk7CisJCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisJCQlpbm9kZS0+aV9vcCA9ICZuY3BfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCQkJaW5vZGUtPmlfZm9wID0gJm5jcF9maWxlX29wZXJhdGlvbnM7CisJCX0gZWxzZSBpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgeworCQkJaW5vZGUtPmlfb3AgPSAmbmNwX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCQkJaW5vZGUtPmlfZm9wID0gJm5jcF9kaXJfb3BlcmF0aW9uczsKKyNpZmRlZiBDT05GSUdfTkNQRlNfTkZTX05TCisJCX0gZWxzZSBpZiAoU19JU0NIUihpbm9kZS0+aV9tb2RlKSB8fCBTX0lTQkxLKGlub2RlLT5pX21vZGUpIHx8IFNfSVNGSUZPKGlub2RlLT5pX21vZGUpIHx8IFNfSVNTT0NLKGlub2RlLT5pX21vZGUpKSB7CisJCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsCisJCQkJbmV3X2RlY29kZV9kZXYoaW5mby0+aS5uZnMucmRldikpOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfTkNQRlNfRVhUUkFTKSB8fCBkZWZpbmVkKENPTkZJR19OQ1BGU19ORlNfTlMpCisJCX0gZWxzZSBpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkgeworCQkJaW5vZGUtPmlfb3AgPSAmbmNwX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWlub2RlLT5pX2RhdGEuYV9vcHMgPSAmbmNwX3N5bWxpbmtfYW9wczsKKyNlbmRpZgorCQl9IGVsc2UgeworCQkJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCQl9CisJCWluc2VydF9pbm9kZV9oYXNoKGlub2RlKTsKKwl9IGVsc2UKKwkJcHJpbnRrKEtFUk5fRVJSICJuY3BfaWdldDogaWdldCBmYWlsZWQhXG4iKTsKKwlyZXR1cm4gaW5vZGU7Cit9CisKK3N0YXRpYyB2b2lkCituY3BfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJRERQUklOVEsoIm5jcF9kZWxldGVfaW5vZGU6IHB1dCBkaXJlY3RvcnkgJWxkXG4iLCBpbm9kZS0+aV9pbm8pOworCX0KKworCWlmIChuY3BfbWFrZV9jbG9zZWQoaW5vZGUpICE9IDApIHsKKwkJLyogV2UgY2FuJ3QgZG8gYW55dGhpbmcgYnV0IGNvbXBsYWluLiAqLworCQlwcmludGsoS0VSTl9FUlIgIm5jcF9kZWxldGVfaW5vZGU6IGNvdWxkIG5vdCBjbG9zZVxuIik7CisJfQorCWNsZWFyX2lub2RlKGlub2RlKTsKK30KKworc3RhdGljIHZvaWQgbmNwX3N0b3BfdGFza3Moc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlcikgeworCXN0cnVjdCBzb2NrKiBzayA9IHNlcnZlci0+bmNwX3NvY2stPnNrOworCQkKKwlzay0+c2tfZXJyb3JfcmVwb3J0ID0gc2VydmVyLT5lcnJvcl9yZXBvcnQ7CisJc2stPnNrX2RhdGFfcmVhZHkgICA9IHNlcnZlci0+ZGF0YV9yZWFkeTsKKwlzay0+c2tfd3JpdGVfc3BhY2UgID0gc2VydmVyLT53cml0ZV9zcGFjZTsKKwlkZWxfdGltZXJfc3luYygmc2VydmVyLT50aW1lb3V0X3RtKTsKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG5jcF9vcHRpb24gbmNwX29wdHNbXSA9IHsKKwl7ICJ1aWQiLAlPUFRfSU5ULAkndScgfSwKKwl7ICJnaWQiLAlPUFRfSU5ULAknZycgfSwKKwl7ICJvd25lciIsCU9QVF9JTlQsCSdvJyB9LAorCXsgIm1vZGUiLAlPUFRfSU5ULAknbScgfSwKKwl7ICJkaXJtb2RlIiwJT1BUX0lOVCwJJ2QnIH0sCisJeyAidGltZW91dCIsCU9QVF9JTlQsCSd0JyB9LAorCXsgInJldHJ5IiwJT1BUX0lOVCwJJ3InIH0sCisJeyAiZmxhZ3MiLAlPUFRfSU5ULAknZicgfSwKKwl7ICJ3ZG9ncGlkIiwJT1BUX0lOVCwJJ3cnIH0sCisJeyAibmNwZmQiLAlPUFRfSU5ULAknbicgfSwKKwl7ICJpbmZvZmQiLAlPUFRfSU5ULAknaScgfSwJLyogdjUgKi8KKwl7ICJ2ZXJzaW9uIiwJT1BUX0lOVCwJJ3YnIH0sCisJeyBOVUxMLAkJMCwJCTAgfSB9OworCitzdGF0aWMgaW50IG5jcF9wYXJzZV9vcHRpb25zKHN0cnVjdCBuY3BfbW91bnRfZGF0YV9rZXJuZWwgKmRhdGEsIGNoYXIgKm9wdGlvbnMpIHsKKwlpbnQgb3B0dmFsOworCWNoYXIgKm9wdGFyZzsKKwl1bnNpZ25lZCBsb25nIG9wdGludDsKKwlpbnQgdmVyc2lvbiA9IDA7CisKKwlkYXRhLT5mbGFncyA9IDA7CisJZGF0YS0+aW50X2ZsYWdzID0gMDsKKwlkYXRhLT5tb3VudGVkX3VpZCA9IDA7CisJZGF0YS0+d2RvZ19waWQgPSAtMTsKKwlkYXRhLT5uY3BfZmQgPSB+MDsKKwlkYXRhLT50aW1lX291dCA9IDEwOworCWRhdGEtPnJldHJ5X2NvdW50ID0gMjA7CisJZGF0YS0+dWlkID0gMDsKKwlkYXRhLT5naWQgPSAwOworCWRhdGEtPmZpbGVfbW9kZSA9IDA2MDA7CisJZGF0YS0+ZGlyX21vZGUgPSAwNzAwOworCWRhdGEtPmluZm9fZmQgPSAtMTsKKwlkYXRhLT5tb3VudGVkX3ZvbFswXSA9IDA7CisJCisJd2hpbGUgKChvcHR2YWwgPSBuY3BfZ2V0b3B0KCJuY3BmcyIsICZvcHRpb25zLCBuY3Bfb3B0cywgTlVMTCwgJm9wdGFyZywgJm9wdGludCkpICE9IDApIHsKKwkJaWYgKG9wdHZhbCA8IDApCisJCQlyZXR1cm4gb3B0dmFsOworCQlzd2l0Y2ggKG9wdHZhbCkgeworCQkJY2FzZSAndSc6CisJCQkJZGF0YS0+dWlkID0gb3B0aW50OworCQkJCWJyZWFrOworCQkJY2FzZSAnZyc6CisJCQkJZGF0YS0+Z2lkID0gb3B0aW50OworCQkJCWJyZWFrOworCQkJY2FzZSAnbyc6CisJCQkJZGF0YS0+bW91bnRlZF91aWQgPSBvcHRpbnQ7CisJCQkJYnJlYWs7CisJCQljYXNlICdtJzoKKwkJCQlkYXRhLT5maWxlX21vZGUgPSBvcHRpbnQ7CisJCQkJYnJlYWs7CisJCQljYXNlICdkJzoKKwkJCQlkYXRhLT5kaXJfbW9kZSA9IG9wdGludDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3QnOgorCQkJCWRhdGEtPnRpbWVfb3V0ID0gb3B0aW50OworCQkJCWJyZWFrOworCQkJY2FzZSAncic6CisJCQkJZGF0YS0+cmV0cnlfY291bnQgPSBvcHRpbnQ7CisJCQkJYnJlYWs7CisJCQljYXNlICdmJzoKKwkJCQlkYXRhLT5mbGFncyA9IG9wdGludDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3cnOgorCQkJCWRhdGEtPndkb2dfcGlkID0gb3B0aW50OworCQkJCWJyZWFrOworCQkJY2FzZSAnbic6CisJCQkJZGF0YS0+bmNwX2ZkID0gb3B0aW50OworCQkJCWJyZWFrOworCQkJY2FzZSAnaSc6CisJCQkJZGF0YS0+aW5mb19mZCA9IG9wdGludDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3YnOgorCQkJCWlmIChvcHRpbnQgPCBOQ1BfTU9VTlRfVkVSU0lPTl9WNCkgeworCQkJCQlyZXR1cm4gLUVDSFJORzsKKwkJCQl9CisJCQkJaWYgKG9wdGludCA+IE5DUF9NT1VOVF9WRVJTSU9OX1Y1KSB7CisJCQkJCXJldHVybiAtRUNIUk5HOworCQkJCX0KKwkJCQl2ZXJzaW9uID0gb3B0aW50OworCQkJCWJyZWFrOworCQkJCisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmNwX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqcmF3X2RhdGEsIGludCBzaWxlbnQpCit7CisJc3RydWN0IG5jcF9tb3VudF9kYXRhX2tlcm5lbCBkYXRhOworCXN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXI7CisJc3RydWN0IGZpbGUgKm5jcF9maWxwOworCXN0cnVjdCBpbm9kZSAqcm9vdF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKnNvY2tfaW5vZGU7CisJc3RydWN0IHNvY2tldCAqc29jazsKKwlpbnQgZXJyb3I7CisJaW50IGRlZmF1bHRfYnVmc2l6ZTsKKyNpZmRlZiBDT05GSUdfTkNQRlNfUEFDS0VUX1NJR05JTkcKKwlpbnQgb3B0aW9uczsKKyNlbmRpZgorCXN0cnVjdCBuY3BfZW50cnlfaW5mbyBmaW5mbzsKKworCXNlcnZlciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBuY3Bfc2VydmVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZXJ2ZXIpCisJCXJldHVybiAtRU5PTUVNOworCXNiLT5zX2ZzX2luZm8gPSBzZXJ2ZXI7CisJbWVtc2V0KHNlcnZlciwgMCwgc2l6ZW9mKHN0cnVjdCBuY3Bfc2VydmVyKSk7CisKKwllcnJvciA9IC1FRkFVTFQ7CisJaWYgKHJhd19kYXRhID09IE5VTEwpCisJCWdvdG8gb3V0OworCXN3aXRjaCAoKihpbnQqKXJhd19kYXRhKSB7CisJCWNhc2UgTkNQX01PVU5UX1ZFUlNJT046CisJCQl7CisJCQkJc3RydWN0IG5jcF9tb3VudF9kYXRhKiBtZCA9IChzdHJ1Y3QgbmNwX21vdW50X2RhdGEqKXJhd19kYXRhOworCisJCQkJZGF0YS5mbGFncyA9IG1kLT5mbGFnczsKKwkJCQlkYXRhLmludF9mbGFncyA9IE5DUF9JTU9VTlRfTE9HR0VESU5fUE9TU0lCTEU7CisJCQkJZGF0YS5tb3VudGVkX3VpZCA9IG1kLT5tb3VudGVkX3VpZDsKKwkJCQlkYXRhLndkb2dfcGlkID0gbWQtPndkb2dfcGlkOworCQkJCWRhdGEubmNwX2ZkID0gbWQtPm5jcF9mZDsKKwkJCQlkYXRhLnRpbWVfb3V0ID0gbWQtPnRpbWVfb3V0OworCQkJCWRhdGEucmV0cnlfY291bnQgPSBtZC0+cmV0cnlfY291bnQ7CisJCQkJZGF0YS51aWQgPSBtZC0+dWlkOworCQkJCWRhdGEuZ2lkID0gbWQtPmdpZDsKKwkJCQlkYXRhLmZpbGVfbW9kZSA9IG1kLT5maWxlX21vZGU7CisJCQkJZGF0YS5kaXJfbW9kZSA9IG1kLT5kaXJfbW9kZTsKKwkJCQlkYXRhLmluZm9fZmQgPSAtMTsKKwkJCQltZW1jcHkoZGF0YS5tb3VudGVkX3ZvbCwgbWQtPm1vdW50ZWRfdm9sLAorCQkJCQlOQ1BfVk9MTkFNRV9MRU4rMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBOQ1BfTU9VTlRfVkVSU0lPTl9WNDoKKwkJCXsKKwkJCQlzdHJ1Y3QgbmNwX21vdW50X2RhdGFfdjQqIG1kID0gKHN0cnVjdCBuY3BfbW91bnRfZGF0YV92NCopcmF3X2RhdGE7CisKKwkJCQlkYXRhLmZsYWdzID0gbWQtPmZsYWdzOworCQkJCWRhdGEuaW50X2ZsYWdzID0gMDsKKwkJCQlkYXRhLm1vdW50ZWRfdWlkID0gbWQtPm1vdW50ZWRfdWlkOworCQkJCWRhdGEud2RvZ19waWQgPSBtZC0+d2RvZ19waWQ7CisJCQkJZGF0YS5uY3BfZmQgPSBtZC0+bmNwX2ZkOworCQkJCWRhdGEudGltZV9vdXQgPSBtZC0+dGltZV9vdXQ7CisJCQkJZGF0YS5yZXRyeV9jb3VudCA9IG1kLT5yZXRyeV9jb3VudDsKKwkJCQlkYXRhLnVpZCA9IG1kLT51aWQ7CisJCQkJZGF0YS5naWQgPSBtZC0+Z2lkOworCQkJCWRhdGEuZmlsZV9tb2RlID0gbWQtPmZpbGVfbW9kZTsKKwkJCQlkYXRhLmRpcl9tb2RlID0gbWQtPmRpcl9tb2RlOworCQkJCWRhdGEuaW5mb19mZCA9IC0xOworCQkJCWRhdGEubW91bnRlZF92b2xbMF0gPSAwOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnJvciA9IC1FQ0hSTkc7CisJCQlpZiAobWVtY21wKHJhd19kYXRhLCAidmVycyIsIDQpID09IDApIHsKKwkJCQllcnJvciA9IG5jcF9wYXJzZV9vcHRpb25zKCZkYXRhLCByYXdfZGF0YSk7CisJCQl9CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBvdXQ7CisJCQlicmVhazsKKwl9CisJZXJyb3IgPSAtRUJBREY7CisJbmNwX2ZpbHAgPSBmZ2V0KGRhdGEubmNwX2ZkKTsKKwlpZiAoIW5jcF9maWxwKQorCQlnb3RvIG91dDsKKwllcnJvciA9IC1FTk9UU09DSzsKKwlzb2NrX2lub2RlID0gbmNwX2ZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCWlmICghU19JU1NPQ0soc29ja19pbm9kZS0+aV9tb2RlKSkKKwkJZ290byBvdXRfZnB1dDsKKwlzb2NrID0gU09DS0VUX0koc29ja19pbm9kZSk7CisJaWYgKCFzb2NrKQorCQlnb3RvIG91dF9mcHV0OworCQkKKwlpZiAoc29jay0+dHlwZSA9PSBTT0NLX1NUUkVBTSkKKwkJZGVmYXVsdF9idWZzaXplID0gMHhGMDAwOworCWVsc2UKKwkJZGVmYXVsdF9idWZzaXplID0gMTAyNDsKKworCXNiLT5zX2ZsYWdzIHw9IE1TX05PRElSQVRJTUU7CS8qIHByb2JhYmx5IGV2ZW4gbm9hdGltZSAqLworCXNiLT5zX21heGJ5dGVzID0gMHhGRkZGRkZGRlU7CisJc2ItPnNfYmxvY2tzaXplID0gMTAyNDsJLyogRWguLi4gIElzIHRoaXMgY29ycmVjdD8gKi8KKwlzYi0+c19ibG9ja3NpemVfYml0cyA9IDEwOworCXNiLT5zX21hZ2ljID0gTkNQX1NVUEVSX01BR0lDOworCXNiLT5zX29wID0gJm5jcF9zb3BzOworCisJc2VydmVyID0gTkNQX1NCUChzYik7CisJbWVtc2V0KHNlcnZlciwgMCwgc2l6ZW9mKCpzZXJ2ZXIpKTsKKworCXNlcnZlci0+bmNwX2ZpbHAgPSBuY3BfZmlscDsKKwlzZXJ2ZXItPm5jcF9zb2NrID0gc29jazsKKwkKKwlpZiAoZGF0YS5pbmZvX2ZkICE9IC0xKSB7CisJCXN0cnVjdCBzb2NrZXQgKmluZm9fc29jazsKKworCQllcnJvciA9IC1FQkFERjsKKwkJc2VydmVyLT5pbmZvX2ZpbHAgPSBmZ2V0KGRhdGEuaW5mb19mZCk7CisJCWlmICghc2VydmVyLT5pbmZvX2ZpbHApCisJCQlnb3RvIG91dF9mcHV0OworCQllcnJvciA9IC1FTk9UU09DSzsKKwkJc29ja19pbm9kZSA9IHNlcnZlci0+aW5mb19maWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwkJaWYgKCFTX0lTU09DSyhzb2NrX2lub2RlLT5pX21vZGUpKQorCQkJZ290byBvdXRfZnB1dDI7CisJCWluZm9fc29jayA9IFNPQ0tFVF9JKHNvY2tfaW5vZGUpOworCQlpZiAoIWluZm9fc29jaykKKwkJCWdvdG8gb3V0X2ZwdXQyOworCQllcnJvciA9IC1FQkFERkQ7CisJCWlmIChpbmZvX3NvY2stPnR5cGUgIT0gU09DS19TVFJFQU0pCisJCQlnb3RvIG91dF9mcHV0MjsKKwkJc2VydmVyLT5pbmZvX3NvY2sgPSBpbmZvX3NvY2s7CisJfQorCisvKglzZXJ2ZXItPmxvY2sgPSAwOwkqLworCWluaXRfTVVURVgoJnNlcnZlci0+c2VtKTsKKwlzZXJ2ZXItPnBhY2tldCA9IE5VTEw7CisvKglzZXJ2ZXItPmJ1ZmZlcl9zaXplID0gMDsJKi8KKy8qCXNlcnZlci0+Y29ubl9zdGF0dXMgPSAwOwkqLworLyoJc2VydmVyLT5yb290X2RlbnRyeSA9IE5VTEw7CSovCisvKglzZXJ2ZXItPnJvb3Rfc2V0dXBlZCA9IDA7CSovCisjaWZkZWYgQ09ORklHX05DUEZTX1BBQ0tFVF9TSUdOSU5HCisvKglzZXJ2ZXItPnNpZ25fd2FudGVkID0gMDsJKi8KKy8qCXNlcnZlci0+c2lnbl9hY3RpdmUgPSAwOwkqLworI2VuZGlmCisJc2VydmVyLT5hdXRoLmF1dGhfdHlwZSA9IE5DUF9BVVRIX05PTkU7CisvKglzZXJ2ZXItPmF1dGgub2JqZWN0X25hbWVfbGVuID0gMDsJKi8KKy8qCXNlcnZlci0+YXV0aC5vYmplY3RfbmFtZSA9IE5VTEw7CSovCisvKglzZXJ2ZXItPmF1dGgub2JqZWN0X3R5cGUgPSAwOwkJKi8KKy8qCXNlcnZlci0+cHJpdi5sZW4gPSAwOwkJCSovCisvKglzZXJ2ZXItPnByaXYuZGF0YSA9IE5VTEw7CQkqLworCisJc2VydmVyLT5tID0gZGF0YTsKKwkvKiBBbHRob3VnaHQgYW55dGhpbmcgcHJvZHVjaW5nIHRoaXMgaXMgYnVnZ3ksIGl0IGhhcHBlbnMKKwkgICBub3cgYmVjYXVzZSBvZiBQQVRIX01BWCBjaGFuZ2VzLi4gKi8KKwlpZiAoc2VydmVyLT5tLnRpbWVfb3V0IDwgMSkgeworCQlzZXJ2ZXItPm0udGltZV9vdXQgPSAxMDsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiWW91IG5lZWQgdG8gcmVjb21waWxlIHlvdXIgbmNwZnMgdXRpbHMuLlxuIik7CisJfQorCXNlcnZlci0+bS50aW1lX291dCA9IHNlcnZlci0+bS50aW1lX291dCAqIEhaIC8gMTAwOworCXNlcnZlci0+bS5maWxlX21vZGUgPSAoc2VydmVyLT5tLmZpbGVfbW9kZSAmIFNfSVJXWFVHTykgfCBTX0lGUkVHOworCXNlcnZlci0+bS5kaXJfbW9kZSA9IChzZXJ2ZXItPm0uZGlyX21vZGUgJiBTX0lSV1hVR08pIHwgU19JRkRJUjsKKworI2lmZGVmIENPTkZJR19OQ1BGU19OTFMKKwkvKiBsb2FkIHRoZSBkZWZhdWx0IE5MUyBjaGFyc2V0cyAqLworCXNlcnZlci0+bmxzX3ZvbCA9IGxvYWRfbmxzX2RlZmF1bHQoKTsKKwlzZXJ2ZXItPm5sc19pbyA9IGxvYWRfbmxzX2RlZmF1bHQoKTsKKyNlbmRpZiAvKiBDT05GSUdfTkNQRlNfTkxTICovCisKKwlzZXJ2ZXItPmRlbnRyeV90dGwgPSAwOwkvKiBubyBjYWNoaW5nICovCisKKwlJTklUX0xJU1RfSEVBRCgmc2VydmVyLT50eC5yZXF1ZXN0cyk7CisJaW5pdF9NVVRFWCgmc2VydmVyLT5yY3YuY3JlcV9zZW0pOworCXNlcnZlci0+dHguY3JlcQkJPSBOVUxMOworCXNlcnZlci0+cmN2LmNyZXEJPSBOVUxMOworCXNlcnZlci0+ZGF0YV9yZWFkeQk9IHNvY2stPnNrLT5za19kYXRhX3JlYWR5OworCXNlcnZlci0+d3JpdGVfc3BhY2UJPSBzb2NrLT5zay0+c2tfd3JpdGVfc3BhY2U7CisJc2VydmVyLT5lcnJvcl9yZXBvcnQJPSBzb2NrLT5zay0+c2tfZXJyb3JfcmVwb3J0OworCXNvY2stPnNrLT5za191c2VyX2RhdGEJPSBzZXJ2ZXI7CisKKwlpbml0X3RpbWVyKCZzZXJ2ZXItPnRpbWVvdXRfdG0pOworI3VuZGVmIE5DUF9QQUNLRVRfU0laRQorI2RlZmluZSBOQ1BfUEFDS0VUX1NJWkUgMTMxMDcyCisJZXJyb3IgPSAtRU5PTUVNOworCXNlcnZlci0+cGFja2V0X3NpemUgPSBOQ1BfUEFDS0VUX1NJWkU7CisJc2VydmVyLT5wYWNrZXQgPSB2bWFsbG9jKE5DUF9QQUNLRVRfU0laRSk7CisJaWYgKHNlcnZlci0+cGFja2V0ID09IE5VTEwpCisJCWdvdG8gb3V0X25sczsKKworCXNvY2stPnNrLT5za19kYXRhX3JlYWR5CSAgPSBuY3BfdGNwX2RhdGFfcmVhZHk7CisJc29jay0+c2stPnNrX2Vycm9yX3JlcG9ydCA9IG5jcF90Y3BfZXJyb3JfcmVwb3J0OworCWlmIChzb2NrLT50eXBlID09IFNPQ0tfU1RSRUFNKSB7CisJCXNlcnZlci0+cmN2LnB0ciA9ICh1bnNpZ25lZCBjaGFyKikmc2VydmVyLT5yY3YuYnVmOworCQlzZXJ2ZXItPnJjdi5sZW4gPSAxMDsKKwkJc2VydmVyLT5yY3Yuc3RhdGUgPSAwOworCQlJTklUX1dPUksoJnNlcnZlci0+cmN2LnRxLCBuY3BfdGNwX3Jjdl9wcm9jLCBzZXJ2ZXIpOworCQlJTklUX1dPUksoJnNlcnZlci0+dHgudHEsIG5jcF90Y3BfdHhfcHJvYywgc2VydmVyKTsKKwkJc29jay0+c2stPnNrX3dyaXRlX3NwYWNlID0gbmNwX3RjcF93cml0ZV9zcGFjZTsKKwl9IGVsc2UgeworCQlJTklUX1dPUksoJnNlcnZlci0+cmN2LnRxLCBuY3BkZ3JhbV9yY3ZfcHJvYywgc2VydmVyKTsKKwkJSU5JVF9XT1JLKCZzZXJ2ZXItPnRpbWVvdXRfdHEsIG5jcGRncmFtX3RpbWVvdXRfcHJvYywgc2VydmVyKTsKKwkJc2VydmVyLT50aW1lb3V0X3RtLmRhdGEgPSAodW5zaWduZWQgbG9uZylzZXJ2ZXI7CisJCXNlcnZlci0+dGltZW91dF90bS5mdW5jdGlvbiA9IG5jcGRncmFtX3RpbWVvdXRfY2FsbDsKKwl9CisKKwluY3BfbG9ja19zZXJ2ZXIoc2VydmVyKTsKKwllcnJvciA9IG5jcF9jb25uZWN0KHNlcnZlcik7CisJbmNwX3VubG9ja19zZXJ2ZXIoc2VydmVyKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIG91dF9wYWNrZXQ7CisJRFBSSU5USygibmNwX2ZpbGxfc3VwZXI6IE5DUF9TQlAoc2IpID0gJXhcbiIsIChpbnQpIE5DUF9TQlAoc2IpKTsKKworCWVycm9yID0gLUVNU0dTSVpFOwkvKiAtRVJFTU9URVNJREVJTkNPTVBBVElCTEUgKi8KKyNpZmRlZiBDT05GSUdfTkNQRlNfUEFDS0VUX1NJR05JTkcKKwlpZiAobmNwX25lZ290aWF0ZV9zaXplX2FuZF9vcHRpb25zKHNlcnZlciwgZGVmYXVsdF9idWZzaXplLAorCQlOQ1BfREVGQVVMVF9PUFRJT05TLCAmKHNlcnZlci0+YnVmZmVyX3NpemUpLCAmb3B0aW9ucykgPT0gMCkKKwl7CisJCWlmIChvcHRpb25zICE9IE5DUF9ERUZBVUxUX09QVElPTlMpCisJCXsKKwkJCWlmIChuY3BfbmVnb3RpYXRlX3NpemVfYW5kX29wdGlvbnMoc2VydmVyLCAKKwkJCQlkZWZhdWx0X2J1ZnNpemUsCisJCQkJb3B0aW9ucyAmIDIsIAorCQkJCSYoc2VydmVyLT5idWZmZXJfc2l6ZSksICZvcHRpb25zKSAhPSAwKQorCQkJCQorCQkJeworCQkJCWdvdG8gb3V0X2Rpc2Nvbm5lY3Q7CisJCQl9CisJCX0KKwkJaWYgKG9wdGlvbnMgJiAyKQorCQkJc2VydmVyLT5zaWduX3dhbnRlZCA9IDE7CisJfQorCWVsc2UgCisjZW5kaWYJLyogQ09ORklHX05DUEZTX1BBQ0tFVF9TSUdOSU5HICovCisJaWYgKG5jcF9uZWdvdGlhdGVfYnVmZmVyc2l6ZShzZXJ2ZXIsIGRlZmF1bHRfYnVmc2l6ZSwKKyAgCQkJCSAgICAgJihzZXJ2ZXItPmJ1ZmZlcl9zaXplKSkgIT0gMCkKKwkJZ290byBvdXRfZGlzY29ubmVjdDsKKwlEUFJJTlRLKCJuY3BmczogYnVmc2l6ZSA9ICVkXG4iLCBzZXJ2ZXItPmJ1ZmZlcl9zaXplKTsKKworCW1lbXNldCgmZmluZm8sIDAsIHNpemVvZihmaW5mbykpOworCWZpbmZvLmkuYXR0cmlidXRlcwk9IGFESVI7CisJZmluZm8uaS5kYXRhU3RyZWFtU2l6ZQk9IDA7CS8qIGlnbm9yZWQgKi8KKwlmaW5mby5pLmRpckVudE51bQk9IDA7CisJZmluZm8uaS5Eb3NEaXJOdW0JPSAwOworI2lmZGVmIENPTkZJR19OQ1BGU19TTUFMTERPUworCWZpbmZvLmkuTlNDcmVhdG9yCT0gTldfTlNfRE9TOworI2VuZGlmCisJZmluZm8udm9sdW1lCQk9IE5DUF9OVU1CRVJfT0ZfVk9MVU1FUzsKKwkvKiBzZXQgZGF0ZXMgb2YgbW91bnRwb2ludCB0byBKYW4gMSwgMTk4NjsgMDA6MDAgKi8KKwlmaW5mby5pLmNyZWF0aW9uVGltZQk9IGZpbmZvLmkubW9kaWZ5VGltZQorCQkJCT0gY3B1X3RvX2xlMTYoMHgwMDAwKTsKKwlmaW5mby5pLmNyZWF0aW9uRGF0ZQk9IGZpbmZvLmkubW9kaWZ5RGF0ZQorCQkJCT0gZmluZm8uaS5sYXN0QWNjZXNzRGF0ZQorCQkJCT0gY3B1X3RvX2xlMTYoMHgwQzIxKTsKKwlmaW5mby5pLm5hbWVMZW4JCT0gMDsKKwlmaW5mby5pLmVudHJ5TmFtZVswXQk9ICdcMCc7CisKKwlmaW5mby5vcGVuZWQJCT0gMDsKKwlmaW5mby5pbm8JCT0gMjsJLyogdHJhZGl0aW9uICovCisKKwlzZXJ2ZXItPm5hbWVfc3BhY2VbZmluZm8udm9sdW1lXSA9IE5XX05TX0RPUzsKKworCWVycm9yID0gLUVOT01FTTsKKyAgICAgICAgcm9vdF9pbm9kZSA9IG5jcF9pZ2V0KHNiLCAmZmluZm8pOworICAgICAgICBpZiAoIXJvb3RfaW5vZGUpCisJCWdvdG8gb3V0X2Rpc2Nvbm5lY3Q7CisJRFBSSU5USygibmNwX2ZpbGxfc3VwZXI6IHJvb3Qgdm9sPSVkXG4iLCBOQ1BfRklORk8ocm9vdF9pbm9kZSktPnZvbE51bWJlcik7CisJc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290X2lub2RlKTsKKyAgICAgICAgaWYgKCFzYi0+c19yb290KQorCQlnb3RvIG91dF9ub19yb290OworCXNiLT5zX3Jvb3QtPmRfb3AgPSAmbmNwX3Jvb3RfZGVudHJ5X29wZXJhdGlvbnM7CisJcmV0dXJuIDA7CisKK291dF9ub19yb290OgorCWlwdXQocm9vdF9pbm9kZSk7CitvdXRfZGlzY29ubmVjdDoKKwluY3BfbG9ja19zZXJ2ZXIoc2VydmVyKTsKKwluY3BfZGlzY29ubmVjdChzZXJ2ZXIpOworCW5jcF91bmxvY2tfc2VydmVyKHNlcnZlcik7CitvdXRfcGFja2V0OgorCW5jcF9zdG9wX3Rhc2tzKHNlcnZlcik7CisJdmZyZWUoc2VydmVyLT5wYWNrZXQpOworb3V0X25sczoKKyNpZmRlZiBDT05GSUdfTkNQRlNfTkxTCisJdW5sb2FkX25scyhzZXJ2ZXItPm5sc19pbyk7CisJdW5sb2FkX25scyhzZXJ2ZXItPm5sc192b2wpOworI2VuZGlmCitvdXRfZnB1dDI6CisJaWYgKHNlcnZlci0+aW5mb19maWxwKQorCQlmcHV0KHNlcnZlci0+aW5mb19maWxwKTsKK291dF9mcHV0OgorCS8qIDIzLzEyLzE5OTggTWFyY2luIERhbGVja2kgPGRhbGVja2lAY3MubmV0LnBsPjoKKwkgKiAKKwkgKiBUaGUgcHJldmlvdXNseSB1c2VkIHB1dF9maWxwKG5jcF9maWxwKTsgd2FzIGJvZ291cywgc2luY2UKKwkgKiBpdCBkb2Vzbid0IHByb3BlciB1bmxvY2tpbmcuCisJICovCisJZnB1dChuY3BfZmlscCk7CitvdXQ6CisJc2ItPnNfZnNfaW5mbyA9IE5VTEw7CisJa2ZyZWUoc2VydmVyKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkIG5jcF9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyID0gTkNQX1NCUChzYik7CisKKwluY3BfbG9ja19zZXJ2ZXIoc2VydmVyKTsKKwluY3BfZGlzY29ubmVjdChzZXJ2ZXIpOworCW5jcF91bmxvY2tfc2VydmVyKHNlcnZlcik7CisKKwluY3Bfc3RvcF90YXNrcyhzZXJ2ZXIpOworCisjaWZkZWYgQ09ORklHX05DUEZTX05MUworCS8qIHVubG9hZCB0aGUgTkxTIGNoYXJzZXRzICovCisJaWYgKHNlcnZlci0+bmxzX3ZvbCkKKwl7CisJCXVubG9hZF9ubHMoc2VydmVyLT5ubHNfdm9sKTsKKwkJc2VydmVyLT5ubHNfdm9sID0gTlVMTDsKKwl9CisJaWYgKHNlcnZlci0+bmxzX2lvKQorCXsKKwkJdW5sb2FkX25scyhzZXJ2ZXItPm5sc19pbyk7CisJCXNlcnZlci0+bmxzX2lvID0gTlVMTDsKKwl9CisjZW5kaWYgLyogQ09ORklHX05DUEZTX05MUyAqLworCisJaWYgKHNlcnZlci0+aW5mb19maWxwKQorCQlmcHV0KHNlcnZlci0+aW5mb19maWxwKTsKKwlmcHV0KHNlcnZlci0+bmNwX2ZpbHApOworCWtpbGxfcHJvYyhzZXJ2ZXItPm0ud2RvZ19waWQsIFNJR1RFUk0sIDEpOworCisJaWYgKHNlcnZlci0+cHJpdi5kYXRhKSAKKwkJbmNwX2tmcmVlX3Moc2VydmVyLT5wcml2LmRhdGEsIHNlcnZlci0+cHJpdi5sZW4pOworCWlmIChzZXJ2ZXItPmF1dGgub2JqZWN0X25hbWUpCisJCW5jcF9rZnJlZV9zKHNlcnZlci0+YXV0aC5vYmplY3RfbmFtZSwgc2VydmVyLT5hdXRoLm9iamVjdF9uYW1lX2xlbik7CisJdmZyZWUoc2VydmVyLT5wYWNrZXQpOworCXNiLT5zX2ZzX2luZm8gPSBOVUxMOworCWtmcmVlKHNlcnZlcik7Cit9CisKK3N0YXRpYyBpbnQgbmNwX3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQoreworCXN0cnVjdCBkZW50cnkqIGQ7CisJc3RydWN0IGlub2RlKiBpOworCXN0cnVjdCBuY3BfaW5vZGVfaW5mbyogbmk7CisJc3RydWN0IG5jcF9zZXJ2ZXIqIHM7CisJc3RydWN0IG5jcF92b2x1bWVfaW5mbyB2aTsKKwlpbnQgZXJyOworCV9fdTggZGg7CisJCisJZCA9IHNiLT5zX3Jvb3Q7CisJaWYgKCFkKSB7CisJCWdvdG8gZGZsdDsKKwl9CisJaSA9IGQtPmRfaW5vZGU7CisJaWYgKCFpKSB7CisJCWdvdG8gZGZsdDsKKwl9CisJbmkgPSBOQ1BfRklORk8oaSk7CisJaWYgKCFuaSkgeworCQlnb3RvIGRmbHQ7CisJfQorCXMgPSBOQ1BfU0JQKHNiKTsKKwlpZiAoIXMpIHsKKwkJZ290byBkZmx0OworCX0KKwlpZiAoIXMtPm0ubW91bnRlZF92b2xbMF0pIHsKKwkJZ290byBkZmx0OworCX0KKworCWVyciA9IG5jcF9kaXJoYW5kbGVfYWxsb2MocywgbmktPnZvbE51bWJlciwgbmktPkRvc0Rpck51bSwgJmRoKTsKKwlpZiAoZXJyKSB7CisJCWdvdG8gZGZsdDsKKwl9CisJZXJyID0gbmNwX2dldF9kaXJlY3RvcnlfaW5mbyhzLCBkaCwgJnZpKTsKKwluY3BfZGlyaGFuZGxlX2ZyZWUocywgZGgpOworCWlmIChlcnIpIHsKKwkJZ290byBkZmx0OworCX0KKwlidWYtPmZfdHlwZSA9IE5DUF9TVVBFUl9NQUdJQzsKKwlidWYtPmZfYnNpemUgPSB2aS5zZWN0b3JzX3Blcl9ibG9jayAqIDUxMjsKKwlidWYtPmZfYmxvY2tzID0gdmkudG90YWxfYmxvY2tzOworCWJ1Zi0+Zl9iZnJlZSA9IHZpLmZyZWVfYmxvY2tzOworCWJ1Zi0+Zl9iYXZhaWwgPSB2aS5mcmVlX2Jsb2NrczsKKwlidWYtPmZfZmlsZXMgPSB2aS50b3RhbF9kaXJfZW50cmllczsKKwlidWYtPmZfZmZyZWUgPSB2aS5hdmFpbGFibGVfZGlyX2VudHJpZXM7CisJYnVmLT5mX25hbWVsZW4gPSAxMjsKKwlyZXR1cm4gMDsKKworCS8qIFdlIGNhbm5vdCBzYXkgaG93IG11Y2ggZGlzayBzcGFjZSBpcyBsZWZ0IG9uIGEgbW91bnRlZAorCSAgIE5ldFdhcmUgU2VydmVyLCBiZWNhdXNlIGZyZWUgc3BhY2UgaXMgZGlzdHJpYnV0ZWQgb3ZlcgorCSAgIHZvbHVtZXMsIGFuZCB0aGUgY3VycmVudCB1c2VyIG1pZ2h0IGhhdmUgZGlzayBxdW90YXMuIFNvCisJICAgZnJlZSBzcGFjZSBpcyBub3QgdGhhdCBzaW1wbGUgdG8gZGV0ZXJtaW5lLiBPdXIgZGVjaXNpb24KKwkgICBoZXJlIGlzIHRvIGVyciBjb25zZXJ2YXRpdmVseS4gKi8KKworZGZsdDo7CisJYnVmLT5mX3R5cGUgPSBOQ1BfU1VQRVJfTUFHSUM7CisJYnVmLT5mX2JzaXplID0gTkNQX0JMT0NLX1NJWkU7CisJYnVmLT5mX2Jsb2NrcyA9IDA7CisJYnVmLT5mX2JmcmVlID0gMDsKKwlidWYtPmZfYmF2YWlsID0gMDsKKwlidWYtPmZfbmFtZWxlbiA9IDEyOworCXJldHVybiAwOworfQorCitpbnQgbmNwX25vdGlmeV9jaGFuZ2Uoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmF0dHIpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgcmVzdWx0ID0gMDsKKwlfX2xlMzIgaW5mb19tYXNrOworCXN0cnVjdCBud19tb2RpZnlfZG9zX2luZm8gaW5mbzsKKwlzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyOworCisJcmVzdWx0ID0gLUVJTzsKKworCWxvY2tfa2VybmVsKCk7CQorCisJc2VydmVyID0gTkNQX1NFUlZFUihpbm9kZSk7CisJaWYgKCghc2VydmVyKSB8fCAhbmNwX2Nvbm5fdmFsaWQoc2VydmVyKSkKKwkJZ290byBvdXQ7CisKKwkvKiBhZ2VpbmcgdGhlIGRlbnRyeSB0byBmb3JjZSB2YWxpZGF0aW9uICovCisJbmNwX2FnZV9kZW50cnkoc2VydmVyLCBkZW50cnkpOworCisJcmVzdWx0ID0gaW5vZGVfY2hhbmdlX29rKGlub2RlLCBhdHRyKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlyZXN1bHQgPSAtRVBFUk07CisJaWYgKCgoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1VJRCkgJiYKKwkgICAgIChhdHRyLT5pYV91aWQgIT0gc2VydmVyLT5tLnVpZCkpKQorCQlnb3RvIG91dDsKKworCWlmICgoKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9HSUQpICYmCisJICAgICAoYXR0ci0+aWFfZ2lkICE9IHNlcnZlci0+bS5naWQpKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoKChhdHRyLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkgJiYKKwkgICAgIChhdHRyLT5pYV9tb2RlICYKKwkgICAgICB+KFNfSUZSRUcgfCBTX0lGRElSIHwgU19JUldYVUdPKSkpKQorCQlnb3RvIG91dDsKKworCWluZm9fbWFzayA9IDA7CisJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworCisjaWYgMSAKKyAgICAgICAgaWYgKChhdHRyLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkgIT0gMCkKKyAgICAgICAgeworCQl1bW9kZV90IG5ld21vZGUgPSBhdHRyLT5pYV9tb2RlOworCisJCWluZm9fbWFzayB8PSBETV9BVFRSSUJVVEVTOworCisgICAgICAgICAgICAgICAgaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKyAgICAgICAgICAgICAgICAJbmV3bW9kZSAmPSBzZXJ2ZXItPm0uZGlyX21vZGU7CisJCX0gZWxzZSB7CisjaWZkZWYgQ09ORklHX05DUEZTX0VYVFJBUwkJCQorCQkJaWYgKHNlcnZlci0+bS5mbGFncyAmIE5DUF9NT1VOVF9FWFRSQVMpIHsKKwkJCQkvKiBhbnkgbm9uLWRlZmF1bHQgZXhlY3V0ZSBiaXQgc2V0ICovCisJCQkJaWYgKG5ld21vZGUgJiB+c2VydmVyLT5tLmZpbGVfbW9kZSAmIFNfSVhVR08pCisJCQkJCWluZm8uYXR0cmlidXRlcyB8PSBhU0hBUkVEIHwgYVNZU1RFTTsKKwkJCQkvKiByZWFkIGZvciBncm91cC93b3JsZCBhbmQgbm90IGluIGRlZmF1bHQgZmlsZV9tb2RlICovCisJCQkJZWxzZSBpZiAobmV3bW9kZSAmIH5zZXJ2ZXItPm0uZmlsZV9tb2RlICYgU19JUlVHTykKKwkJCQkJaW5mby5hdHRyaWJ1dGVzIHw9IGFTSEFSRUQ7CisJCQl9IGVsc2UKKyNlbmRpZgorCQkJCW5ld21vZGUgJj0gc2VydmVyLT5tLmZpbGVfbW9kZTsJCQkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG5ld21vZGUgJiBTX0lXVUdPKQorICAgICAgICAgICAgICAgIAlpbmZvLmF0dHJpYnV0ZXMgJj0gfihhUk9OTFl8YVJFTkFNRUlOSElCSVR8YURFTEVURUlOSElCSVQpOworICAgICAgICAgICAgICAgIGVsc2UKKwkJCWluZm8uYXR0cmlidXRlcyB8PSAgKGFST05MWXxhUkVOQU1FSU5ISUJJVHxhREVMRVRFSU5ISUJJVCk7CisKKyNpZmRlZiBDT05GSUdfTkNQRlNfTkZTX05TCisJCWlmIChuY3BfaXNfbmZzX2V4dHJhcyhzZXJ2ZXIsIE5DUF9GSU5GTyhpbm9kZSktPnZvbE51bWJlcikpIHsKKwkJCXJlc3VsdCA9IG5jcF9tb2RpZnlfbmZzX2luZm8oc2VydmVyLAorCQkJCQkJICAgICBOQ1BfRklORk8oaW5vZGUpLT52b2xOdW1iZXIsCisJCQkJCQkgICAgIE5DUF9GSU5GTyhpbm9kZSktPmRpckVudE51bSwKKwkJCQkJCSAgICAgYXR0ci0+aWFfbW9kZSwgMCk7CisJCQlpZiAocmVzdWx0ICE9IDApCisJCQkJZ290byBvdXQ7CisJCQlpbmZvLmF0dHJpYnV0ZXMgJj0gfihhU0hBUkVEIHwgYVNZU1RFTSk7CisJCQl7CisJCQkJLyogbWFyayBwYXJ0aWFsIHN1Y2Nlc3MgKi8KKwkJCQlzdHJ1Y3QgaWF0dHIgdG1wYXR0cjsKKwkJCQkKKwkJCQl0bXBhdHRyLmlhX3ZhbGlkID0gQVRUUl9NT0RFOworCQkJCXRtcGF0dHIuaWFfbW9kZSA9IGF0dHItPmlhX21vZGU7CisKKwkJCQlyZXN1bHQgPSBpbm9kZV9zZXRhdHRyKGlub2RlLCAmdG1wYXR0cik7CisJCQkJaWYgKHJlc3VsdCkKKwkJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKyNlbmRpZgorICAgICAgICB9CisjZW5kaWYKKworCS8qIERvIFNJWkUgYmVmb3JlIGF0dHJpYnV0ZXMsIG90aGVyd2lzZSBtdGltZSB0b2dldGhlciB3aXRoIHNpemUgZG9lcyBub3Qgd29yay4uLgorCSAqLworCWlmICgoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpICE9IDApIHsKKwkJaW50IHdyaXR0ZW47CisKKwkJRFBSSU5USygibmNwZnM6IHRyeWluZyB0byBjaGFuZ2Ugc2l6ZSB0byAlbGRcbiIsCisJCQlhdHRyLT5pYV9zaXplKTsKKworCQlpZiAoKHJlc3VsdCA9IG5jcF9tYWtlX29wZW4oaW5vZGUsIE9fV1JPTkxZKSkgPCAwKSB7CisJCQlyZXN1bHQgPSAtRUFDQ0VTOworCQkJZ290byBvdXQ7CisJCX0KKwkJbmNwX3dyaXRlX2tlcm5lbChOQ1BfU0VSVkVSKGlub2RlKSwgTkNQX0ZJTkZPKGlub2RlKS0+ZmlsZV9oYW5kbGUsCisJCQkgIGF0dHItPmlhX3NpemUsIDAsICIiLCAmd3JpdHRlbik7CisKKwkJLyogQWNjb3JkaW5nIHRvIG5kaXIsIHRoZSBjaGFuZ2VzIG9ubHkgdGFrZSBlZmZlY3QgYWZ0ZXIKKwkJICAgY2xvc2luZyB0aGUgZmlsZSAqLworCQluY3BfaW5vZGVfY2xvc2UoaW5vZGUpOworCQlyZXN1bHQgPSBuY3BfbWFrZV9jbG9zZWQoaW5vZGUpOworCQlpZiAocmVzdWx0KQorCQkJZ290byBvdXQ7CisJCXsKKwkJCXN0cnVjdCBpYXR0ciB0bXBhdHRyOworCQkJCisJCQl0bXBhdHRyLmlhX3ZhbGlkID0gQVRUUl9TSVpFOworCQkJdG1wYXR0ci5pYV9zaXplID0gYXR0ci0+aWFfc2l6ZTsKKwkJCQorCQkJcmVzdWx0ID0gaW5vZGVfc2V0YXR0cihpbm9kZSwgJnRtcGF0dHIpOworCQkJaWYgKHJlc3VsdCkKKwkJCQlnb3RvIG91dDsKKwkJfQorCX0KKwlpZiAoKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9DVElNRSkgIT0gMCkgeworCQlpbmZvX21hc2sgfD0gKERNX0NSRUFURV9USU1FIHwgRE1fQ1JFQVRFX0RBVEUpOworCQluY3BfZGF0ZV91bml4MmRvcyhhdHRyLT5pYV9jdGltZS50dl9zZWMsCisJCQkgICAgICZpbmZvLmNyZWF0aW9uVGltZSwgJmluZm8uY3JlYXRpb25EYXRlKTsKKwl9CisJaWYgKChhdHRyLT5pYV92YWxpZCAmIEFUVFJfTVRJTUUpICE9IDApIHsKKwkJaW5mb19tYXNrIHw9IChETV9NT0RJRllfVElNRSB8IERNX01PRElGWV9EQVRFKTsKKwkJbmNwX2RhdGVfdW5peDJkb3MoYXR0ci0+aWFfbXRpbWUudHZfc2VjLAorCQkJCSAgJmluZm8ubW9kaWZ5VGltZSwgJmluZm8ubW9kaWZ5RGF0ZSk7CisJfQorCWlmICgoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0FUSU1FKSAhPSAwKSB7CisJCV9fbGUxNiBkdW1teTsKKwkJaW5mb19tYXNrIHw9IChETV9MQVNUX0FDQ0VTU19EQVRFKTsKKwkJbmNwX2RhdGVfdW5peDJkb3MoYXR0ci0+aWFfYXRpbWUudHZfc2VjLAorCQkJCSAgJmR1bW15LCAmaW5mby5sYXN0QWNjZXNzRGF0ZSk7CisJfQorCWlmIChpbmZvX21hc2sgIT0gMCkgeworCQlyZXN1bHQgPSBuY3BfbW9kaWZ5X2ZpbGVfb3Jfc3ViZGlyX2Rvc19pbmZvKE5DUF9TRVJWRVIoaW5vZGUpLAorCQkJCSAgICAgIGlub2RlLCBpbmZvX21hc2ssICZpbmZvKTsKKwkJaWYgKHJlc3VsdCAhPSAwKSB7CisJCQlyZXN1bHQgPSAtRUFDQ0VTOworCisJCQlpZiAoaW5mb19tYXNrID09IChETV9DUkVBVEVfVElNRSB8IERNX0NSRUFURV9EQVRFKSkgeworCQkJCS8qIE5ldFdhcmUgc2VlbXMgbm90IHRvIGFsbG93IHRoaXMuIEkKKwkJCQkgICBkbyBub3Qga25vdyB3aHkuIFNvLCBqdXN0IHRlbGwgdGhlCisJCQkJICAgdXNlciBldmVyeXRoaW5nIHdlbnQgZmluZS4gVGhpcyBpcworCQkJCSAgIGEgdGVycmlibGUgaGFjaywgYnV0IEkgZG8gbm90IGtub3cKKwkJCQkgICBob3cgdG8gZG8gdGhpcyBjb3JyZWN0bHkuICovCisJCQkJcmVzdWx0ID0gMDsKKwkJCX0gZWxzZQorCQkJCWdvdG8gb3V0OworCQl9CisjaWZkZWYgQ09ORklHX05DUEZTX1NUUk9ORwkJCisJCWlmICgoIXJlc3VsdCkgJiYgKGluZm9fbWFzayAmIERNX0FUVFJJQlVURVMpKQorCQkJTkNQX0ZJTkZPKGlub2RlKS0+bndhdHRyID0gaW5mby5hdHRyaWJ1dGVzOworI2VuZGlmCisJfQorCWlmICghcmVzdWx0KQorCQlyZXN1bHQgPSBpbm9kZV9zZXRhdHRyKGlub2RlLCBhdHRyKTsKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworI2lmZGVmIERFQlVHX05DUF9NQUxMT0MKK2ludCBuY3BfbWFsbG9jZWQ7CitpbnQgbmNwX2N1cnJlbnRfbWFsbG9jZWQ7CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqbmNwX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoreworCXJldHVybiBnZXRfc2Jfbm9kZXYoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIG5jcF9maWxsX3N1cGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIG5jcF9mc190eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAibmNwZnMiLAorCS5nZXRfc2IJCT0gbmNwX2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfYW5vbl9zdXBlciwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmNwX2ZzKHZvaWQpCit7CisJaW50IGVycjsKKwlEUFJJTlRLKCJuY3BmczogaW5pdF9tb2R1bGUgY2FsbGVkXG4iKTsKKworI2lmZGVmIERFQlVHX05DUF9NQUxMT0MKKwluY3BfbWFsbG9jZWQgPSAwOworCW5jcF9jdXJyZW50X21hbGxvY2VkID0gMDsKKyNlbmRpZgorCWVyciA9IGluaXRfaW5vZGVjYWNoZSgpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MTsKKwllcnIgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZuY3BfZnNfdHlwZSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJcmV0dXJuIDA7CitvdXQ6CisJZGVzdHJveV9pbm9kZWNhY2hlKCk7CitvdXQxOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X25jcF9mcyh2b2lkKQoreworCURQUklOVEsoIm5jcGZzOiBjbGVhbnVwX21vZHVsZSBjYWxsZWRcbiIpOworCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmbmNwX2ZzX3R5cGUpOworCWRlc3Ryb3lfaW5vZGVjYWNoZSgpOworI2lmZGVmIERFQlVHX05DUF9NQUxMT0MKKwlQUklOVEsoIm5jcF9tYWxsb2NlZDogJWRcbiIsIG5jcF9tYWxsb2NlZCk7CisJUFJJTlRLKCJuY3BfY3VycmVudF9tYWxsb2NlZDogJWRcbiIsIG5jcF9jdXJyZW50X21hbGxvY2VkKTsKKyNlbmRpZgorfQorCittb2R1bGVfaW5pdChpbml0X25jcF9mcykKK21vZHVsZV9leGl0KGV4aXRfbmNwX2ZzKQorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvbmNwZnMvaW9jdGwuYyBiL2ZzL25jcGZzL2lvY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhkZjc5MwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25jcGZzL2lvY3RsLmMKQEAgLTAsMCArMSw2NDkgQEAKKy8qCisgKiAgaW9jdGwuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgYnkgVm9sa2VyIExlbmRlY2tlCisgKiAgTW9kaWZpZWQgMTk5NyBQZXRlciBXYWx0ZW5iZXJnLCBCaWxsIEhhd2VzLCBEYXZpZCBXb29kaG91c2UgZm9yIDIuMSBkY2FjaGUKKyAqICBNb2RpZmllZCAxOTk4LCAxOTk5IFdvbGZyYW0gUGllbmtvc3MgZm9yIE5MUworICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2h1aWQuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uY3BfZnMuaD4KKworI2luY2x1ZGUgIm5jcGxpYl9rZXJuZWwuaCIKKworLyogbWF4aW11bSBsaW1pdCBmb3IgbmNwX29iamVjdG5hbWVfaW9jdGwgKi8KKyNkZWZpbmUgTkNQX09CSkVDVF9OQU1FX01BWF9MRU4JNDA5NgorLyogbWF4aW11bSBsaW1pdCBmb3IgbmNwX3ByaXZhdGVkYXRhX2lvY3RsICovCisjZGVmaW5lIE5DUF9QUklWQVRFX0RBVEFfTUFYX0xFTiA4MTkyCisvKiBtYXhpbXVtIG5lZ290aWFibGUgcGFja2V0IHNpemUgKi8KKyNkZWZpbmUgTkNQX1BBQ0tFVF9TSVpFX0lOVEVSTkFMIDY1NTM2CisKK3N0YXRpYyBpbnQKK25jcF9nZXRfZnNfaW5mbyhzdHJ1Y3QgbmNwX3NlcnZlciogc2VydmVyLCBzdHJ1Y3QgaW5vZGUqIGlub2RlLCBzdHJ1Y3QgbmNwX2ZzX2luZm8gX191c2VyICphcmcpCit7CisJc3RydWN0IG5jcF9mc19pbmZvIGluZm87CisKKwlpZiAoKHBlcm1pc3Npb24oaW5vZGUsIE1BWV9XUklURSwgTlVMTCkgIT0gMCkKKwkgICAgJiYgKGN1cnJlbnQtPnVpZCAhPSBzZXJ2ZXItPm0ubW91bnRlZF91aWQpKSB7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKwlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sIGFyZywgc2l6ZW9mKGluZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoaW5mby52ZXJzaW9uICE9IE5DUF9HRVRfRlNfSU5GT19WRVJTSU9OKSB7CisJCURQUklOVEsoImluZm8udmVyc2lvbiBpbnZhbGlkOiAlZFxuIiwgaW5mby52ZXJzaW9uKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qIFRPRE86IGluZm8uYWRkciA9IHNlcnZlci0+bS5zZXJ2X2FkZHI7ICovCisJU0VUX1VJRChpbmZvLm1vdW50ZWRfdWlkLCBzZXJ2ZXItPm0ubW91bnRlZF91aWQpOworCWluZm8uY29ubmVjdGlvbgkJPSBzZXJ2ZXItPmNvbm5lY3Rpb247CisJaW5mby5idWZmZXJfc2l6ZQk9IHNlcnZlci0+YnVmZmVyX3NpemU7CisJaW5mby52b2x1bWVfbnVtYmVyCT0gTkNQX0ZJTkZPKGlub2RlKS0+dm9sTnVtYmVyOworCWluZm8uZGlyZWN0b3J5X2lkCT0gTkNQX0ZJTkZPKGlub2RlKS0+RG9zRGlyTnVtOworCisJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbmNwX2dldF9mc19pbmZvX3YyKHN0cnVjdCBuY3Bfc2VydmVyKiBzZXJ2ZXIsIHN0cnVjdCBpbm9kZSogaW5vZGUsIHN0cnVjdCBuY3BfZnNfaW5mb192MiBfX3VzZXIgKiBhcmcpCit7CisJc3RydWN0IG5jcF9mc19pbmZvX3YyIGluZm8yOworCisJaWYgKChwZXJtaXNzaW9uKGlub2RlLCBNQVlfV1JJVEUsIE5VTEwpICE9IDApCisJICAgICYmIChjdXJyZW50LT51aWQgIT0gc2VydmVyLT5tLm1vdW50ZWRfdWlkKSkgeworCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisJaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvMiwgYXJnLCBzaXplb2YoaW5mbzIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoaW5mbzIudmVyc2lvbiAhPSBOQ1BfR0VUX0ZTX0lORk9fVkVSU0lPTl9WMikgeworCQlEUFJJTlRLKCJpbmZvLnZlcnNpb24gaW52YWxpZDogJWRcbiIsIGluZm8yLnZlcnNpb24pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaW5mbzIubW91bnRlZF91aWQgICA9IHNlcnZlci0+bS5tb3VudGVkX3VpZDsKKwlpbmZvMi5jb25uZWN0aW9uICAgID0gc2VydmVyLT5jb25uZWN0aW9uOworCWluZm8yLmJ1ZmZlcl9zaXplICAgPSBzZXJ2ZXItPmJ1ZmZlcl9zaXplOworCWluZm8yLnZvbHVtZV9udW1iZXIgPSBOQ1BfRklORk8oaW5vZGUpLT52b2xOdW1iZXI7CisJaW5mbzIuZGlyZWN0b3J5X2lkICA9IE5DUF9GSU5GTyhpbm9kZSktPkRvc0Rpck51bTsKKwlpbmZvMi5kdW1teTEgPSBpbmZvMi5kdW1teTIgPSBpbmZvMi5kdW1teTMgPSAwOworCisJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZpbmZvMiwgc2l6ZW9mKGluZm8yKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX05DUEZTX05MUworLyogSGVyZSB3ZSBhcmUgc2VsZWN0IHRoZSBpb2NoYXJzZXQgYW5kIHRoZSBjb2RlcGFnZSBmb3IgTkxTLgorICogVGhhbmtzIFBldHIgVmFuZHJvdmVjIGZvciBpZGVhIGFuZCBtYW55IGhpbnRzLgorICovCitzdGF0aWMgaW50CituY3Bfc2V0X2NoYXJzZXRzKHN0cnVjdCBuY3Bfc2VydmVyKiBzZXJ2ZXIsIHN0cnVjdCBuY3BfbmxzX2lvY3RsIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBuY3BfbmxzX2lvY3RsIHVzZXI7CisJc3RydWN0IG5sc190YWJsZSAqY29kZXBhZ2U7CisJc3RydWN0IG5sc190YWJsZSAqaW9jaGFyc2V0OworCXN0cnVjdCBubHNfdGFibGUgKm9sZHNldF9pbzsKKwlzdHJ1Y3QgbmxzX3RhYmxlICpvbGRzZXRfY3A7CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRUFDQ0VTOworCWlmIChzZXJ2ZXItPnJvb3Rfc2V0dXBlZCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmdXNlciwgYXJnLCBzaXplb2YodXNlcikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWNvZGVwYWdlID0gTlVMTDsKKwl1c2VyLmNvZGVwYWdlW05DUF9JT0NTTkFNRV9MRU5dID0gMDsKKwlpZiAoIXVzZXIuY29kZXBhZ2VbMF0gfHwgIXN0cmNtcCh1c2VyLmNvZGVwYWdlLCAiZGVmYXVsdCIpKQorCQljb2RlcGFnZSA9IGxvYWRfbmxzX2RlZmF1bHQoKTsKKwllbHNlIHsKKwkJY29kZXBhZ2UgPSBsb2FkX25scyh1c2VyLmNvZGVwYWdlKTsKKwkJaWYgKCFjb2RlcGFnZSkgeworCQkJcmV0dXJuIC1FQkFEUlFDOworCQl9CisJfQorCisJaW9jaGFyc2V0ID0gTlVMTDsKKwl1c2VyLmlvY2hhcnNldFtOQ1BfSU9DU05BTUVfTEVOXSA9IDA7CisJaWYgKCF1c2VyLmlvY2hhcnNldFswXSB8fCAhc3RyY21wKHVzZXIuaW9jaGFyc2V0LCAiZGVmYXVsdCIpKSB7CisJCWlvY2hhcnNldCA9IGxvYWRfbmxzX2RlZmF1bHQoKTsKKwkJTkNQX0NMUl9GTEFHKHNlcnZlciwgTkNQX0ZMQUdfVVRGOCk7CisJfSBlbHNlIGlmICghc3RyY21wKHVzZXIuaW9jaGFyc2V0LCAidXRmOCIpKSB7CisJCWlvY2hhcnNldCA9IGxvYWRfbmxzX2RlZmF1bHQoKTsKKwkJTkNQX1NFVF9GTEFHKHNlcnZlciwgTkNQX0ZMQUdfVVRGOCk7CisJfSBlbHNlIHsKKwkJaW9jaGFyc2V0ID0gbG9hZF9ubHModXNlci5pb2NoYXJzZXQpOworCQlpZiAoIWlvY2hhcnNldCkgeworCQkJdW5sb2FkX25scyhjb2RlcGFnZSk7CisJCQlyZXR1cm4gLUVCQURSUUM7CisJCX0KKwkJTkNQX0NMUl9GTEFHKHNlcnZlciwgTkNQX0ZMQUdfVVRGOCk7CisJfQorCisJb2xkc2V0X2NwID0gc2VydmVyLT5ubHNfdm9sOworCXNlcnZlci0+bmxzX3ZvbCA9IGNvZGVwYWdlOworCW9sZHNldF9pbyA9IHNlcnZlci0+bmxzX2lvOworCXNlcnZlci0+bmxzX2lvID0gaW9jaGFyc2V0OworCisJaWYgKG9sZHNldF9jcCkKKwkJdW5sb2FkX25scyhvbGRzZXRfY3ApOworCWlmIChvbGRzZXRfaW8pCisJCXVubG9hZF9ubHMob2xkc2V0X2lvKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CituY3BfZ2V0X2NoYXJzZXRzKHN0cnVjdCBuY3Bfc2VydmVyKiBzZXJ2ZXIsIHN0cnVjdCBuY3BfbmxzX2lvY3RsIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBuY3BfbmxzX2lvY3RsIHVzZXI7CisJaW50IGxlbjsKKworCW1lbXNldCgmdXNlciwgMCwgc2l6ZW9mKHVzZXIpKTsKKwlpZiAoc2VydmVyLT5ubHNfdm9sICYmIHNlcnZlci0+bmxzX3ZvbC0+Y2hhcnNldCkgeworCQlsZW4gPSBzdHJsZW4oc2VydmVyLT5ubHNfdm9sLT5jaGFyc2V0KTsKKwkJaWYgKGxlbiA+IE5DUF9JT0NTTkFNRV9MRU4pCisJCQlsZW4gPSBOQ1BfSU9DU05BTUVfTEVOOworCQlzdHJuY3B5KHVzZXIuY29kZXBhZ2UsIHNlcnZlci0+bmxzX3ZvbC0+Y2hhcnNldCwgbGVuKTsKKwkJdXNlci5jb2RlcGFnZVtsZW5dID0gMDsKKwl9CisKKwlpZiAoTkNQX0lTX0ZMQUcoc2VydmVyLCBOQ1BfRkxBR19VVEY4KSkKKwkJc3RyY3B5KHVzZXIuaW9jaGFyc2V0LCAidXRmOCIpOworCWVsc2UgaWYgKHNlcnZlci0+bmxzX2lvICYmIHNlcnZlci0+bmxzX2lvLT5jaGFyc2V0KSB7CisJCWxlbiA9IHN0cmxlbihzZXJ2ZXItPm5sc19pby0+Y2hhcnNldCk7CisJCWlmIChsZW4gPiBOQ1BfSU9DU05BTUVfTEVOKQorCQkJbGVuID0gTkNQX0lPQ1NOQU1FX0xFTjsKKwkJc3RybmNweSh1c2VyLmlvY2hhcnNldCwJc2VydmVyLT5ubHNfaW8tPmNoYXJzZXQsIGxlbik7CisJCXVzZXIuaW9jaGFyc2V0W2xlbl0gPSAwOworCX0KKworCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmdXNlciwgc2l6ZW9mKHVzZXIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX05DUEZTX05MUyAqLworCitpbnQgbmNwX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAorCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIgPSBOQ1BfU0VSVkVSKGlub2RlKTsKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBuY3BfaW9jdGxfcmVxdWVzdCByZXF1ZXN0OworCWNoYXIqIGJvdW5jZWJ1ZmZlcjsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBOQ1BfSU9DX05DUFJFUVVFU1Q6CisKKwkJaWYgKChwZXJtaXNzaW9uKGlub2RlLCBNQVlfV1JJVEUsIE5VTEwpICE9IDApCisJCSAgICAmJiAoY3VycmVudC0+dWlkICE9IHNlcnZlci0+bS5tb3VudGVkX3VpZCkpIHsKKwkJCXJldHVybiAtRUFDQ0VTOworCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxdWVzdCwgYXJncCwgc2l6ZW9mKHJlcXVlc3QpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmICgocmVxdWVzdC5mdW5jdGlvbiA+IDI1NSkKKwkJICAgIHx8IChyZXF1ZXN0LnNpemUgPgorCQkgIE5DUF9QQUNLRVRfU0laRSAtIHNpemVvZihzdHJ1Y3QgbmNwX3JlcXVlc3RfaGVhZGVyKSkpIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJvdW5jZWJ1ZmZlciA9IHZtYWxsb2MoTkNQX1BBQ0tFVF9TSVpFX0lOVEVSTkFMKTsKKwkJaWYgKCFib3VuY2VidWZmZXIpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGJvdW5jZWJ1ZmZlciwgcmVxdWVzdC5kYXRhLCByZXF1ZXN0LnNpemUpKSB7CisJCQl2ZnJlZShib3VuY2VidWZmZXIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJbmNwX2xvY2tfc2VydmVyKHNlcnZlcik7CisKKwkJLyogRklYTUU6IFdlIGhhY2sgYXJvdW5kIGluIHRoZSBzZXJ2ZXIncyBzdHJ1Y3R1cmVzCisJCSAgIGhlcmUgdG8gYmUgYWJsZSB0byB1c2UgbmNwX3JlcXVlc3QgKi8KKworCQlzZXJ2ZXItPmhhc19zdWJmdW5jdGlvbiA9IDA7CisJCXNlcnZlci0+Y3VycmVudF9zaXplID0gcmVxdWVzdC5zaXplOworCQltZW1jcHkoc2VydmVyLT5wYWNrZXQsIGJvdW5jZWJ1ZmZlciwgcmVxdWVzdC5zaXplKTsKKworCQlyZXN1bHQgPSBuY3BfcmVxdWVzdDIoc2VydmVyLCByZXF1ZXN0LmZ1bmN0aW9uLCAKKwkJCWJvdW5jZWJ1ZmZlciwgTkNQX1BBQ0tFVF9TSVpFX0lOVEVSTkFMKTsKKwkJaWYgKHJlc3VsdCA8IDApCisJCQlyZXN1bHQgPSAtRUlPOworCQllbHNlCisJCQlyZXN1bHQgPSBzZXJ2ZXItPnJlcGx5X3NpemU7CisJCW5jcF91bmxvY2tfc2VydmVyKHNlcnZlcik7CisJCURQUklOVEsoIm5jcF9pb2N0bDogY29weSAlZCBieXRlc1xuIiwKKwkJCXJlc3VsdCk7CisJCWlmIChyZXN1bHQgPj0gMCkKKwkJCWlmIChjb3B5X3RvX3VzZXIocmVxdWVzdC5kYXRhLCBib3VuY2VidWZmZXIsIHJlc3VsdCkpCisJCQkJcmVzdWx0ID0gLUVGQVVMVDsKKwkJdmZyZWUoYm91bmNlYnVmZmVyKTsKKwkJcmV0dXJuIHJlc3VsdDsKKworCWNhc2UgTkNQX0lPQ19DT05OX0xPR0dFRF9JTjoKKworCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJaWYgKCEoc2VydmVyLT5tLmludF9mbGFncyAmIE5DUF9JTU9VTlRfTE9HR0VESU5fUE9TU0lCTEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChzZXJ2ZXItPnJvb3Rfc2V0dXBlZCkKKwkJCXJldHVybiAtRUJVU1k7CisJCXNlcnZlci0+cm9vdF9zZXR1cGVkID0gMTsKKwkJcmV0dXJuIG5jcF9jb25uX2xvZ2dlZF9pbihpbm9kZS0+aV9zYik7CisKKwljYXNlIE5DUF9JT0NfR0VUX0ZTX0lORk86CisJCXJldHVybiBuY3BfZ2V0X2ZzX2luZm8oc2VydmVyLCBpbm9kZSwgYXJncCk7CisKKwljYXNlIE5DUF9JT0NfR0VUX0ZTX0lORk9fVjI6CisJCXJldHVybiBuY3BfZ2V0X2ZzX2luZm9fdjIoc2VydmVyLCBpbm9kZSwgYXJncCk7CisKKwljYXNlIE5DUF9JT0NfR0VUTU9VTlRVSUQyOgorCQl7CisJCQl1bnNpZ25lZCBsb25nIHRtcCA9IHNlcnZlci0+bS5tb3VudGVkX3VpZDsKKworCQkJaWYgKCAgIChwZXJtaXNzaW9uKGlub2RlLCBNQVlfUkVBRCwgTlVMTCkgIT0gMCkKKwkJCSAgICAmJiAoY3VycmVudC0+dWlkICE9IHNlcnZlci0+bS5tb3VudGVkX3VpZCkpCisJCQl7CisJCQkJcmV0dXJuIC1FQUNDRVM7CisJCQl9CisJCQlpZiAocHV0X3VzZXIodG1wLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKilhcmdwKSkgCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJY2FzZSBOQ1BfSU9DX0dFVFJPT1Q6CisJCXsKKwkJCXN0cnVjdCBuY3Bfc2V0cm9vdF9pb2N0bCBzcjsKKworCQkJaWYgKCAgIChwZXJtaXNzaW9uKGlub2RlLCBNQVlfUkVBRCwgTlVMTCkgIT0gMCkKKwkJCSAgICAmJiAoY3VycmVudC0+dWlkICE9IHNlcnZlci0+bS5tb3VudGVkX3VpZCkpCisJCQl7CisJCQkJcmV0dXJuIC1FQUNDRVM7CisJCQl9CisJCQlpZiAoc2VydmVyLT5tLm1vdW50ZWRfdm9sWzBdKSB7CisJCQkJc3RydWN0IGRlbnRyeSogZGVudHJ5ID0gaW5vZGUtPmlfc2ItPnNfcm9vdDsKKworCQkJCWlmIChkZW50cnkpIHsKKwkJCQkJc3RydWN0IGlub2RlKiBpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwkJCQkKKwkJCQkJaWYgKGlub2RlKSB7CisJCQkJCQlzci52b2xOdW1iZXIgPSBOQ1BfRklORk8oaW5vZGUpLT52b2xOdW1iZXI7CisJCQkJCQlzci5kaXJFbnROdW0gPSBOQ1BfRklORk8oaW5vZGUpLT5kaXJFbnROdW07CisJCQkJCQlzci5uYW1lc3BhY2UgPSBzZXJ2ZXItPm5hbWVfc3BhY2Vbc3Iudm9sTnVtYmVyXTsKKwkJCQkJfSBlbHNlCisJCQkJCQlEUFJJTlRLKCJuY3Bmczogc19yb290LT5kX2lub2RlPT1OVUxMXG4iKTsKKwkJCQl9IGVsc2UKKwkJCQkJRFBSSU5USygibmNwZnM6IHNfcm9vdD09TlVMTFxuIik7CisJCQl9IGVsc2UgeworCQkJCXNyLnZvbE51bWJlciA9IC0xOworCQkJCXNyLm5hbWVzcGFjZSA9IDA7CisJCQkJc3IuZGlyRW50TnVtID0gMDsKKwkJCX0KKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnNyLCBzaXplb2Yoc3IpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCQl9CisJY2FzZSBOQ1BfSU9DX1NFVFJPT1Q6CisJCXsKKwkJCXN0cnVjdCBuY3Bfc2V0cm9vdF9pb2N0bCBzcjsKKwkJCV9fdTMyIHZudW07CisJCQlfX2xlMzIgZGU7CisJCQlfX2xlMzIgZG9zZGU7CisJCQlzdHJ1Y3QgZGVudHJ5KiBkZW50cnk7CisKKwkJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXsKKwkJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJCX0KKwkJCWlmIChzZXJ2ZXItPnJvb3Rfc2V0dXBlZCkgcmV0dXJuIC1FQlVTWTsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmc3IsIGFyZ3AsIHNpemVvZihzcikpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKHNyLnZvbE51bWJlciA8IDApIHsKKwkJCQlzZXJ2ZXItPm0ubW91bnRlZF92b2xbMF0gPSAwOworCQkJCXZudW0gPSBOQ1BfTlVNQkVSX09GX1ZPTFVNRVM7CisJCQkJZGUgPSAwOworCQkJCWRvc2RlID0gMDsKKwkJCX0gZWxzZSBpZiAoc3Iudm9sTnVtYmVyID49IE5DUF9OVU1CRVJfT0ZfVk9MVU1FUykgeworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfSBlbHNlIGlmIChuY3BfbW91bnRfc3ViZGlyKHNlcnZlciwgc3Iudm9sTnVtYmVyLAorCQkJCQkJc3IubmFtZXNwYWNlLCBzci5kaXJFbnROdW0sCisJCQkJCQkmdm51bSwgJmRlLCAmZG9zZGUpKSB7CisJCQkJcmV0dXJuIC1FTk9FTlQ7CisJCQl9CisJCQkKKwkJCWRlbnRyeSA9IGlub2RlLT5pX3NiLT5zX3Jvb3Q7CisJCQlzZXJ2ZXItPnJvb3Rfc2V0dXBlZCA9IDE7CisJCQlpZiAoZGVudHJ5KSB7CisJCQkJc3RydWN0IGlub2RlKiBpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwkJCQkKKwkJCQlpZiAoaW5vZGUpIHsKKwkJCQkJTkNQX0ZJTkZPKGlub2RlKS0+dm9sTnVtYmVyID0gdm51bTsKKwkJCQkJTkNQX0ZJTkZPKGlub2RlKS0+ZGlyRW50TnVtID0gZGU7CisJCQkJCU5DUF9GSU5GTyhpbm9kZSktPkRvc0Rpck51bSA9IGRvc2RlOworCQkJCX0gZWxzZQorCQkJCQlEUFJJTlRLKCJuY3Bmczogc19yb290LT5kX2lub2RlPT1OVUxMXG4iKTsKKwkJCX0gZWxzZQorCQkJCURQUklOVEsoIm5jcGZzOiBzX3Jvb3Q9PU5VTExcbiIpOworCisJCQlyZXR1cm4gMDsKKwkJfQorCisjaWZkZWYgQ09ORklHX05DUEZTX1BBQ0tFVF9TSUdOSU5HCQorCWNhc2UgTkNQX0lPQ19TSUdOX0lOSVQ6CisJCWlmICgocGVybWlzc2lvbihpbm9kZSwgTUFZX1dSSVRFLCBOVUxMKSAhPSAwKQorCQkgICAgJiYgKGN1cnJlbnQtPnVpZCAhPSBzZXJ2ZXItPm0ubW91bnRlZF91aWQpKQorCQl7CisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJfQorCQlpZiAoYXJncCkgeworCQkJaWYgKHNlcnZlci0+c2lnbl93YW50ZWQpCisJCQl7CisJCQkJc3RydWN0IG5jcF9zaWduX2luaXQgc2lnbjsKKworCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmc2lnbiwgYXJncCwgc2l6ZW9mKHNpZ24pKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJbWVtY3B5KHNlcnZlci0+c2lnbl9yb290LHNpZ24uc2lnbl9yb290LDgpOworCQkJCW1lbWNweShzZXJ2ZXItPnNpZ25fbGFzdCxzaWduLnNpZ25fbGFzdCwxNik7CisJCQkJc2VydmVyLT5zaWduX2FjdGl2ZSA9IDE7CisJCQl9CisJCQkvKiBpZ25vcmUgd2hlbiBzaWduYXR1cmVzIG5vdCB3YW50ZWQgKi8KKwkJfSBlbHNlIHsKKwkJCXNlcnZlci0+c2lnbl9hY3RpdmUgPSAwOworCQl9CisJCXJldHVybiAwOwkJCisJCQorICAgICAgICBjYXNlIE5DUF9JT0NfU0lHTl9XQU5URUQ6CisJCWlmICggICAocGVybWlzc2lvbihpbm9kZSwgTUFZX1JFQUQsIE5VTEwpICE9IDApCisJCSAgICAmJiAoY3VycmVudC0+dWlkICE9IHNlcnZlci0+bS5tb3VudGVkX3VpZCkpCisJCXsKKwkJCXJldHVybiAtRUFDQ0VTOworCQl9CisJCQorICAgICAgICAgICAgICAgIGlmIChwdXRfdXNlcihzZXJ2ZXItPnNpZ25fd2FudGVkLCAoaW50IF9fdXNlciAqKWFyZ3ApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisJY2FzZSBOQ1BfSU9DX1NFVF9TSUdOX1dBTlRFRDoKKwkJeworCQkJaW50IG5ld3N0YXRlOworCisJCQlpZiAoICAgKHBlcm1pc3Npb24oaW5vZGUsIE1BWV9XUklURSwgTlVMTCkgIT0gMCkKKwkJCSAgICAmJiAoY3VycmVudC0+dWlkICE9IHNlcnZlci0+bS5tb3VudGVkX3VpZCkpCisJCQl7CisJCQkJcmV0dXJuIC1FQUNDRVM7CisJCQl9CisJCQkvKiBnZXQgb25seSBsb3cgOCBiaXRzLi4uICovCisJCQlpZiAoZ2V0X3VzZXIobmV3c3RhdGUsICh1bnNpZ25lZCBjaGFyIF9fdXNlciAqKWFyZ3ApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKHNlcnZlci0+c2lnbl9hY3RpdmUpIHsKKwkJCQkvKiBjYW5ub3QgdHVybiBzaWduYXR1cmVzIE9GRiB3aGVuIGFjdGl2ZSAqLworCQkJCWlmICghbmV3c3RhdGUpIHJldHVybiAtRUlOVkFMOworCQkJfSBlbHNlIHsKKwkJCQlzZXJ2ZXItPnNpZ25fd2FudGVkID0gbmV3c3RhdGUgIT0gMDsKKwkJCX0KKwkJCXJldHVybiAwOworCQl9CisKKyNlbmRpZiAvKiBDT05GSUdfTkNQRlNfUEFDS0VUX1NJR05JTkcgKi8KKworI2lmZGVmIENPTkZJR19OQ1BGU19JT0NUTF9MT0NLSU5HCisJY2FzZSBOQ1BfSU9DX0xPQ0tVTkxPQ0s6CisJCWlmICggICAocGVybWlzc2lvbihpbm9kZSwgTUFZX1dSSVRFLCBOVUxMKSAhPSAwKQorCQkgICAgJiYgKGN1cnJlbnQtPnVpZCAhPSBzZXJ2ZXItPm0ubW91bnRlZF91aWQpKQorCQl7CisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJfQorCQl7CisJCQlzdHJ1Y3QgbmNwX2xvY2tfaW9jdGwJIHJxZGF0YTsKKwkJCWludCByZXN1bHQ7CisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmcnFkYXRhLCBhcmdwLCBzaXplb2YocnFkYXRhKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAocnFkYXRhLm9yaWdpbiAhPSAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJLyogY2hlY2sgZm9yIGNtZCAqLworCQkJc3dpdGNoIChycWRhdGEuY21kKSB7CisJCQkJY2FzZSBOQ1BfTE9DS19FWDoKKwkJCQljYXNlIE5DUF9MT0NLX1NIOgorCQkJCQkJaWYgKHJxZGF0YS50aW1lb3V0ID09IDApCisJCQkJCQkJcnFkYXRhLnRpbWVvdXQgPSBOQ1BfTE9DS19ERUZBVUxUX1RJTUVPVVQ7CisJCQkJCQllbHNlIGlmIChycWRhdGEudGltZW91dCA+IE5DUF9MT0NLX01BWF9USU1FT1VUKQorCQkJCQkJCXJxZGF0YS50aW1lb3V0ID0gTkNQX0xPQ0tfTUFYX1RJTUVPVVQ7CisJCQkJCQlicmVhazsKKwkJCQljYXNlIE5DUF9MT0NLX0xPRzoKKwkJCQkJCXJxZGF0YS50aW1lb3V0ID0gTkNQX0xPQ0tfREVGQVVMVF9USU1FT1VUOwkvKiBoYXMgbm8gZWZmZWN0ICovCisJCQkJY2FzZSBOQ1BfTE9DS19DTEVBUjoKKwkJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCS8qIGxvY2tpbmcgbmVlZHMgYm90aCByZWFkIGFuZCB3cml0ZSBhY2Nlc3MgKi8KKwkJCWlmICgocmVzdWx0ID0gbmNwX21ha2Vfb3Blbihpbm9kZSwgT19SRFdSKSkgIT0gMCkKKwkJCXsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJcmVzdWx0ID0gLUVJTzsKKwkJCWlmICghbmNwX2Nvbm5fdmFsaWQoc2VydmVyKSkKKwkJCQlnb3RvIG91dHJlbDsKKwkJCXJlc3VsdCA9IC1FSVNESVI7CisJCQlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCisJCQkJZ290byBvdXRyZWw7CisJCQlpZiAocnFkYXRhLmNtZCA9PSBOQ1BfTE9DS19DTEVBUikKKwkJCXsKKwkJCQlyZXN1bHQgPSBuY3BfQ2xlYXJQaHlzaWNhbFJlY29yZChOQ1BfU0VSVkVSKGlub2RlKSwKKwkJCQkJCQlOQ1BfRklORk8oaW5vZGUpLT5maWxlX2hhbmRsZSwgCisJCQkJCQkJcnFkYXRhLm9mZnNldCwKKwkJCQkJCQlycWRhdGEubGVuZ3RoKTsKKwkJCQlpZiAocmVzdWx0ID4gMCkgcmVzdWx0ID0gMDsJLyogbm8gc3VjaCBsb2NrICovCisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaW50IGxvY2tjbWQ7CisKKwkJCQlzd2l0Y2ggKHJxZGF0YS5jbWQpCisJCQkJeworCQkJCQljYXNlIE5DUF9MT0NLX0VYOiAgbG9ja2NtZD0xOyBicmVhazsKKwkJCQkJY2FzZSBOQ1BfTE9DS19TSDogIGxvY2tjbWQ9MzsgYnJlYWs7CisJCQkJCWRlZmF1bHQ6CSAgIGxvY2tjbWQ9MDsgYnJlYWs7CisJCQkJfQorCQkJCXJlc3VsdCA9IG5jcF9Mb2dQaHlzaWNhbFJlY29yZChOQ1BfU0VSVkVSKGlub2RlKSwKKwkJCQkJCQlOQ1BfRklORk8oaW5vZGUpLT5maWxlX2hhbmRsZSwKKwkJCQkJCQlsb2NrY21kLAorCQkJCQkJCXJxZGF0YS5vZmZzZXQsCisJCQkJCQkJcnFkYXRhLmxlbmd0aCwKKwkJCQkJCQlycWRhdGEudGltZW91dCk7CisJCQkJaWYgKHJlc3VsdCA+IDApIHJlc3VsdCA9IC1FQUdBSU47CisJCQl9CitvdXRyZWw6CQkJCisJCQluY3BfaW5vZGVfY2xvc2UoaW5vZGUpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorI2VuZGlmCS8qIENPTkZJR19OQ1BGU19JT0NUTF9MT0NLSU5HICovCisKKwljYXNlIE5DUF9JT0NfR0VUT0JKRUNUTkFNRToKKwkJaWYgKGN1cnJlbnQtPnVpZCAhPSBzZXJ2ZXItPm0ubW91bnRlZF91aWQpIHsKKwkJCXJldHVybiAtRUFDQ0VTOworCQl9CisJCXsKKwkJCXN0cnVjdCBuY3Bfb2JqZWN0bmFtZV9pb2N0bCB1c2VyOworCQkJc2l6ZV90IG91dGw7CisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmdXNlciwgYXJncCwgc2l6ZW9mKHVzZXIpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXVzZXIuYXV0aF90eXBlID0gc2VydmVyLT5hdXRoLmF1dGhfdHlwZTsKKwkJCW91dGwgPSB1c2VyLm9iamVjdF9uYW1lX2xlbjsKKwkJCXVzZXIub2JqZWN0X25hbWVfbGVuID0gc2VydmVyLT5hdXRoLm9iamVjdF9uYW1lX2xlbjsKKwkJCWlmIChvdXRsID4gdXNlci5vYmplY3RfbmFtZV9sZW4pCisJCQkJb3V0bCA9IHVzZXIub2JqZWN0X25hbWVfbGVuOworCQkJaWYgKG91dGwpIHsKKwkJCQlpZiAoY29weV90b191c2VyKHVzZXIub2JqZWN0X25hbWUsCisJCQkJCQkgc2VydmVyLT5hdXRoLm9iamVjdF9uYW1lLAorCQkJCQkJIG91dGwpKSByZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnVzZXIsIHNpemVvZih1c2VyKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCWNhc2UgTkNQX0lPQ19TRVRPQkpFQ1ROQU1FOgorCQlpZiAoY3VycmVudC0+dWlkICE9IHNlcnZlci0+bS5tb3VudGVkX3VpZCkgeworCQkJcmV0dXJuIC1FQUNDRVM7CisJCX0KKwkJeworCQkJc3RydWN0IG5jcF9vYmplY3RuYW1lX2lvY3RsIHVzZXI7CisJCQl2b2lkKiBuZXduYW1lOworCQkJdm9pZCogb2xkbmFtZTsKKwkJCXNpemVfdCBvbGRuYW1lbGVuOworCQkJdm9pZCogb2xkcHJpdmF0ZTsKKwkJCXNpemVfdCBvbGRwcml2YXRlbGVuOworCisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnVzZXIsIGFyZ3AsIHNpemVvZih1c2VyKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAodXNlci5vYmplY3RfbmFtZV9sZW4gPiBOQ1BfT0JKRUNUX05BTUVfTUFYX0xFTikKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCWlmICh1c2VyLm9iamVjdF9uYW1lX2xlbikgeworCQkJCW5ld25hbWUgPSBuY3Bfa21hbGxvYyh1c2VyLm9iamVjdF9uYW1lX2xlbiwgR0ZQX1VTRVIpOworCQkJCWlmICghbmV3bmFtZSkgcmV0dXJuIC1FTk9NRU07CisJCQkJaWYgKGNvcHlfZnJvbV91c2VyKG5ld25hbWUsIHVzZXIub2JqZWN0X25hbWUsIHVzZXIub2JqZWN0X25hbWVfbGVuKSkgeworCQkJCQluY3Bfa2ZyZWVfcyhuZXduYW1lLCB1c2VyLm9iamVjdF9uYW1lX2xlbik7CisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJbmV3bmFtZSA9IE5VTEw7CisJCQl9CisJCQkvKiBlbnRlciBjcml0aWNhbCBzZWN0aW9uICovCisJCQkvKiBtYXliZSB0aGF0IGtmcmVlIGNhbiBzbGVlcCBzbyBkbyB0aGF0IHRoaXMgd2F5ICovCisJCQkvKiBpdCBpcyBhdCBsZWFzdCBtb3JlIFNNUCBmcmllbmRseSAoaW4gZnV0dXJlLi4uKSAqLworCQkJb2xkbmFtZSA9IHNlcnZlci0+YXV0aC5vYmplY3RfbmFtZTsKKwkJCW9sZG5hbWVsZW4gPSBzZXJ2ZXItPmF1dGgub2JqZWN0X25hbWVfbGVuOworCQkJb2xkcHJpdmF0ZSA9IHNlcnZlci0+cHJpdi5kYXRhOworCQkJb2xkcHJpdmF0ZWxlbiA9IHNlcnZlci0+cHJpdi5sZW47CisJCQlzZXJ2ZXItPmF1dGguYXV0aF90eXBlID0gdXNlci5hdXRoX3R5cGU7CisJCQlzZXJ2ZXItPmF1dGgub2JqZWN0X25hbWVfbGVuID0gdXNlci5vYmplY3RfbmFtZV9sZW47CisJCQlzZXJ2ZXItPmF1dGgub2JqZWN0X25hbWUgPSBuZXduYW1lOworCQkJc2VydmVyLT5wcml2LmxlbiA9IDA7CisJCQlzZXJ2ZXItPnByaXYuZGF0YSA9IE5VTEw7CisJCQkvKiBsZWF2ZSBjcml0aWNhbCBzZWN0aW9uICovCisJCQlpZiAob2xkcHJpdmF0ZSkgbmNwX2tmcmVlX3Mob2xkcHJpdmF0ZSwgb2xkcHJpdmF0ZWxlbik7CisJCQlpZiAob2xkbmFtZSkgbmNwX2tmcmVlX3Mob2xkbmFtZSwgb2xkbmFtZWxlbik7CisJCQlyZXR1cm4gMDsKKwkJfQorCWNhc2UgTkNQX0lPQ19HRVRQUklWQVRFREFUQToKKwkJaWYgKGN1cnJlbnQtPnVpZCAhPSBzZXJ2ZXItPm0ubW91bnRlZF91aWQpIHsKKwkJCXJldHVybiAtRUFDQ0VTOworCQl9CisJCXsKKwkJCXN0cnVjdCBuY3BfcHJpdmF0ZWRhdGFfaW9jdGwgdXNlcjsKKwkJCXNpemVfdCBvdXRsOworCisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnVzZXIsIGFyZ3AsIHNpemVvZih1c2VyKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlvdXRsID0gdXNlci5sZW47CisJCQl1c2VyLmxlbiA9IHNlcnZlci0+cHJpdi5sZW47CisJCQlpZiAob3V0bCA+IHVzZXIubGVuKSBvdXRsID0gdXNlci5sZW47CisJCQlpZiAob3V0bCkgeworCQkJCWlmIChjb3B5X3RvX3VzZXIodXNlci5kYXRhLAorCQkJCQkJIHNlcnZlci0+cHJpdi5kYXRhLAorCQkJCQkJIG91dGwpKSByZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnVzZXIsIHNpemVvZih1c2VyKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCWNhc2UgTkNQX0lPQ19TRVRQUklWQVRFREFUQToKKwkJaWYgKGN1cnJlbnQtPnVpZCAhPSBzZXJ2ZXItPm0ubW91bnRlZF91aWQpIHsKKwkJCXJldHVybiAtRUFDQ0VTOworCQl9CisJCXsKKwkJCXN0cnVjdCBuY3BfcHJpdmF0ZWRhdGFfaW9jdGwgdXNlcjsKKwkJCXZvaWQqIG5ldzsKKwkJCXZvaWQqIG9sZDsKKwkJCXNpemVfdCBvbGRsZW47CisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmdXNlciwgYXJncCwgc2l6ZW9mKHVzZXIpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmICh1c2VyLmxlbiA+IE5DUF9QUklWQVRFX0RBVEFfTUFYX0xFTikKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCWlmICh1c2VyLmxlbikgeworCQkJCW5ldyA9IG5jcF9rbWFsbG9jKHVzZXIubGVuLCBHRlBfVVNFUik7CisJCQkJaWYgKCFuZXcpIHJldHVybiAtRU5PTUVNOworCQkJCWlmIChjb3B5X2Zyb21fdXNlcihuZXcsIHVzZXIuZGF0YSwgdXNlci5sZW4pKSB7CisJCQkJCW5jcF9rZnJlZV9zKG5ldywgdXNlci5sZW4pOworCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCW5ldyA9IE5VTEw7CisJCQl9CisJCQkvKiBlbnRlciBjcml0aWNhbCBzZWN0aW9uICovCisJCQlvbGQgPSBzZXJ2ZXItPnByaXYuZGF0YTsKKwkJCW9sZGxlbiA9IHNlcnZlci0+cHJpdi5sZW47CisJCQlzZXJ2ZXItPnByaXYubGVuID0gdXNlci5sZW47CisJCQlzZXJ2ZXItPnByaXYuZGF0YSA9IG5ldzsKKwkJCS8qIGxlYXZlIGNyaXRpY2FsIHNlY3Rpb24gKi8KKwkJCWlmIChvbGQpIG5jcF9rZnJlZV9zKG9sZCwgb2xkbGVuKTsKKwkJCXJldHVybiAwOworCQl9CisKKyNpZmRlZiBDT05GSUdfTkNQRlNfTkxTCisJY2FzZSBOQ1BfSU9DX1NFVENIQVJTRVRTOgorCQlyZXR1cm4gbmNwX3NldF9jaGFyc2V0cyhzZXJ2ZXIsIGFyZ3ApOworCQkKKwljYXNlIE5DUF9JT0NfR0VUQ0hBUlNFVFM6CisJCXJldHVybiBuY3BfZ2V0X2NoYXJzZXRzKHNlcnZlciwgYXJncCk7CisKKyNlbmRpZiAvKiBDT05GSUdfTkNQRlNfTkxTICovCisKKwljYXNlIE5DUF9JT0NfU0VUREVOVFJZVFRMOgorCQlpZiAoKHBlcm1pc3Npb24oaW5vZGUsIE1BWV9XUklURSwgTlVMTCkgIT0gMCkgJiYKKwkJCQkgKGN1cnJlbnQtPnVpZCAhPSBzZXJ2ZXItPm0ubW91bnRlZF91aWQpKQorCQkJcmV0dXJuIC1FQUNDRVM7CisJCXsKKwkJCXVfaW50MzJfdCB1c2VyOworCisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnVzZXIsIGFyZ3AsIHNpemVvZih1c2VyKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkvKiAyMCBzZWNzIGF0IG1vc3QuLi4gKi8KKwkJCWlmICh1c2VyID4gMjAwMDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl1c2VyID0gKHVzZXIgKiBIWikgLyAxMDAwOworCQkJc2VydmVyLT5kZW50cnlfdHRsID0gdXNlcjsKKwkJCXJldHVybiAwOworCQl9CisJCQorCWNhc2UgTkNQX0lPQ19HRVRERU5UUllUVEw6CisJCXsKKwkJCXVfaW50MzJfdCB1c2VyID0gKHNlcnZlci0+ZGVudHJ5X3R0bCAqIDEwMDApIC8gSFo7CisJCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZ1c2VyLCBzaXplb2YodXNlcikpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisJCX0KKworCX0KKy8qICNpZmRlZiBDT05GSUdfVUlEMTYgKi8KKwkvKiBOQ1BfSU9DX0dFVE1PVU5UVUlEIG1heSBiZSBzYW1lIGFzIE5DUF9JT0NfR0VUTU9VTlRVSUQyLAorICAgICAgICAgICBzbyB3ZSBoYXZlIHRoaXMgb3V0IG9mIHN3aXRjaCAqLworCWlmIChjbWQgPT0gTkNQX0lPQ19HRVRNT1VOVFVJRCkgeworCQlfX2tlcm5lbF91aWRfdCB1aWQgPSAwOworCQlpZiAoKHBlcm1pc3Npb24oaW5vZGUsIE1BWV9SRUFELCBOVUxMKSAhPSAwKQorCQkgICAgJiYgKGN1cnJlbnQtPnVpZCAhPSBzZXJ2ZXItPm0ubW91bnRlZF91aWQpKSB7CisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJfQorCQlTRVRfVUlEKHVpZCwgc2VydmVyLT5tLm1vdW50ZWRfdWlkKTsKKwkJaWYgKHB1dF91c2VyKHVpZCwgKF9fa2VybmVsX3VpZF90IF9fdXNlciAqKWFyZ3ApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKy8qICNlbmRpZiAqLworCXJldHVybiAtRUlOVkFMOworfQpkaWZmIC0tZ2l0IGEvZnMvbmNwZnMvbW1hcC5jIGIvZnMvbmNwZnMvbW1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZDYwYzMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uY3Bmcy9tbWFwLmMKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiAgbW1hcC5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBieSBWb2xrZXIgTGVuZGVja2UKKyAqICBNb2RpZmllZCAxOTk3IFBldGVyIFdhbHRlbmJlcmcsIEJpbGwgSGF3ZXMsIERhdmlkIFdvb2Rob3VzZSBmb3IgMi4xIGRjYWNoZQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NobS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbW1hbi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L25jcF9mcy5oPgorCisjaW5jbHVkZSAibmNwbGliX2tlcm5lbC5oIgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisvKgorICogRmlsbCBpbiB0aGUgc3VwcGxpZWQgcGFnZSBmb3IgbW1hcAorICovCitzdGF0aWMgc3RydWN0IHBhZ2UqIG5jcF9maWxlX21tYXBfbm9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqYXJlYSwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgaW50ICp0eXBlKQoreworCXN0cnVjdCBmaWxlICpmaWxlID0gYXJlYS0+dm1fZmlsZTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBwYWdlKiBwYWdlOworCWNoYXIgKnBnX2FkZHI7CisJdW5zaWduZWQgaW50IGFscmVhZHlfcmVhZDsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CisJaW50IGJ1ZnNpemU7CisJaW50IHBvczsKKworCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9ISUdIVVNFUik7IC8qIG5jcGZzIGhhcyBub3RoaW5nIGFnYWluc3QgaGlnaCBwYWdlcworCSAgICAgICAgICAgYXMgbG9uZyBhcyByZWN2bXNnIGFuZCBtZW1zZXQgd29ya3Mgb24gaXQgKi8KKwlpZiAoIXBhZ2UpCisJCXJldHVybiBwYWdlOworCXBnX2FkZHIgPSBrbWFwKHBhZ2UpOworCWFkZHJlc3MgJj0gUEFHRV9NQVNLOworCXBvcyA9IGFkZHJlc3MgLSBhcmVhLT52bV9zdGFydCArIChhcmVhLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUKTsKKworCWNvdW50ID0gUEFHRV9TSVpFOworCWlmIChhZGRyZXNzICsgUEFHRV9TSVpFID4gYXJlYS0+dm1fZW5kKSB7CisJCWNvdW50ID0gYXJlYS0+dm1fZW5kIC0gYWRkcmVzczsKKwl9CisJLyogd2hhdCB3ZSBjYW4gcmVhZCBpbiBvbmUgZ28gKi8KKwlidWZzaXplID0gTkNQX1NFUlZFUihpbm9kZSktPmJ1ZmZlcl9zaXplOworCisJYWxyZWFkeV9yZWFkID0gMDsKKwlpZiAobmNwX21ha2Vfb3Blbihpbm9kZSwgT19SRE9OTFkpID49IDApIHsKKwkJd2hpbGUgKGFscmVhZHlfcmVhZCA8IGNvdW50KSB7CisJCQlpbnQgcmVhZF90aGlzX3RpbWU7CisJCQlpbnQgdG9fcmVhZDsKKworCQkJdG9fcmVhZCA9IGJ1ZnNpemUgLSAocG9zICUgYnVmc2l6ZSk7CisKKwkJCXRvX3JlYWQgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHRvX3JlYWQsIGNvdW50IC0gYWxyZWFkeV9yZWFkKTsKKworCQkJaWYgKG5jcF9yZWFkX2tlcm5lbChOQ1BfU0VSVkVSKGlub2RlKSwKKwkJCQkgICAgIE5DUF9GSU5GTyhpbm9kZSktPmZpbGVfaGFuZGxlLAorCQkJCSAgICAgcG9zLCB0b19yZWFkLAorCQkJCSAgICAgcGdfYWRkciArIGFscmVhZHlfcmVhZCwKKwkJCQkgICAgICZyZWFkX3RoaXNfdGltZSkgIT0gMCkgeworCQkJCXJlYWRfdGhpc190aW1lID0gMDsKKwkJCX0KKwkJCXBvcyArPSByZWFkX3RoaXNfdGltZTsKKwkJCWFscmVhZHlfcmVhZCArPSByZWFkX3RoaXNfdGltZTsKKworCQkJaWYgKHJlYWRfdGhpc190aW1lIDwgdG9fcmVhZCkgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCW5jcF9pbm9kZV9jbG9zZShpbm9kZSk7CisKKwl9CisKKwlpZiAoYWxyZWFkeV9yZWFkIDwgUEFHRV9TSVpFKQorCQltZW1zZXQocGdfYWRkciArIGFscmVhZHlfcmVhZCwgMCwgUEFHRV9TSVpFIC0gYWxyZWFkeV9yZWFkKTsKKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwlrdW5tYXAocGFnZSk7CisKKwkvKgorCSAqIElmIEkgdW5kZXJzdGFuZCBuY3BfcmVhZF9rZXJuZWwoKSBwcm9wZXJseSwgdGhlIGFib3ZlIGFsd2F5cworCSAqIGZldGNoZXMgZnJvbSB0aGUgbmV0d29yaywgaGVyZSB0aGUgYW5hbG9ndWUgb2YgZGlzay4KKwkgKiAtLSB3bGkKKwkgKi8KKwlpZiAodHlwZSkKKwkJKnR5cGUgPSBWTV9GQVVMVF9NQUpPUjsKKwlpbmNfcGFnZV9zdGF0ZShwZ21hamZhdWx0KTsKKwlyZXR1cm4gcGFnZTsKK30KKworc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBuY3BfZmlsZV9tbWFwID0KK3sKKwkubm9wYWdlCT0gbmNwX2ZpbGVfbW1hcF9ub3BhZ2UsCit9OworCisKKy8qIFRoaXMgaXMgdXNlZCBmb3IgYSBnZW5lcmFsIG1tYXAgb2YgYSBuY3AgZmlsZSAqLworaW50IG5jcF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJCisJRFBSSU5USygibmNwX21tYXA6IGNhbGxlZFxuIik7CisKKwlpZiAoIW5jcF9jb25uX3ZhbGlkKE5DUF9TRVJWRVIoaW5vZGUpKSkKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBvbmx5IFBBR0VfQ09XIG9yIHJlYWQtb25seSBzdXBwb3J0ZWQgbm93ICovCisJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9TSEFSRUQpCisJCXJldHVybiAtRUlOVkFMOworCS8qIHdlIGRvIG5vdCBzdXBwb3J0IGZpbGVzIGJpZ2dlciB0aGFuIDRHQi4uLiBXZSBldmVudHVhbGx5IAorCSAgIHN1cHBvcnRzIGp1c3QgNEdCLi4uICovCisJaWYgKCgodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSA+PiBQQUdFX1NISUZUKSArIHZtYS0+dm1fcGdvZmYgCisJICAgPiAoMVUgPDwgKDMyIC0gUEFHRV9TSElGVCkpKQorCQlyZXR1cm4gLUVGQklHOworCisJdm1hLT52bV9vcHMgPSAmbmNwX2ZpbGVfbW1hcDsKKwlmaWxlX2FjY2Vzc2VkKGZpbGUpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMvbmNwZnMvbmNwbGliX2tlcm5lbC5jIGIvZnMvbmNwZnMvbmNwbGliX2tlcm5lbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZWI1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uY3Bmcy9uY3BsaWJfa2VybmVsLmMKQEAgLTAsMCArMSwxMzU1IEBACisvKgorICogIG5jcGxpYl9rZXJuZWwuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgYnkgVm9sa2VyIExlbmRlY2tlCisgKiAgTW9kaWZpZWQgZm9yIGJpZyBlbmRpYW4gYnkgSi5GLiBDaGFkaW1hIGFuZCBEYXZpZCBTLiBNaWxsZXIKKyAqICBNb2RpZmllZCAxOTk3IFBldGVyIFdhbHRlbmJlcmcsIEJpbGwgSGF3ZXMsIERhdmlkIFdvb2Rob3VzZSBmb3IgMi4xIGRjYWNoZQorICogIE1vZGlmaWVkIDE5OTkgV29sZnJhbSBQaWVua29zcyBmb3IgTkxTCisgKiAgTW9kaWZpZWQgMjAwMCBCZW4gSGFycmlzLCBVbml2ZXJzaXR5IG9mIENhbWJyaWRnZSBmb3IgTkZTIE5TIG1ldGEtaW5mbworICoKKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2luY2x1ZGUgIm5jcGxpYl9rZXJuZWwuaCIKKworc3RhdGljIGlubGluZSB2b2lkIGFzc2VydF9zZXJ2ZXJfbG9ja2VkKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIpCit7CisJaWYgKHNlcnZlci0+bG9jayA9PSAwKSB7CisJCURQUklOVEsoIm5jcGZzOiBzZXJ2ZXIgbm90IGxvY2tlZCFcbiIpOworCX0KK30KKworc3RhdGljIHZvaWQgbmNwX2FkZF9ieXRlKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIF9fdTggeCkKK3sKKwlhc3NlcnRfc2VydmVyX2xvY2tlZChzZXJ2ZXIpOworCSooX191OCAqKSAoJihzZXJ2ZXItPnBhY2tldFtzZXJ2ZXItPmN1cnJlbnRfc2l6ZV0pKSA9IHg7CisJc2VydmVyLT5jdXJyZW50X3NpemUgKz0gMTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIG5jcF9hZGRfd29yZChzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBfX2xlMTYgeCkKK3sKKwlhc3NlcnRfc2VydmVyX2xvY2tlZChzZXJ2ZXIpOworCXB1dF91bmFsaWduZWQoeCwgKF9fbGUxNiAqKSAoJihzZXJ2ZXItPnBhY2tldFtzZXJ2ZXItPmN1cnJlbnRfc2l6ZV0pKSk7CisJc2VydmVyLT5jdXJyZW50X3NpemUgKz0gMjsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIG5jcF9hZGRfYmUxNihzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBfX3UxNiB4KQoreworCWFzc2VydF9zZXJ2ZXJfbG9ja2VkKHNlcnZlcik7CisJcHV0X3VuYWxpZ25lZChjcHVfdG9fYmUxNih4KSwgKF9fYmUxNiAqKSAoJihzZXJ2ZXItPnBhY2tldFtzZXJ2ZXItPmN1cnJlbnRfc2l6ZV0pKSk7CisJc2VydmVyLT5jdXJyZW50X3NpemUgKz0gMjsKK30KKworc3RhdGljIHZvaWQgbmNwX2FkZF9kd29yZChzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBfX2xlMzIgeCkKK3sKKwlhc3NlcnRfc2VydmVyX2xvY2tlZChzZXJ2ZXIpOworCXB1dF91bmFsaWduZWQoeCwgKF9fbGUzMiAqKSAoJihzZXJ2ZXItPnBhY2tldFtzZXJ2ZXItPmN1cnJlbnRfc2l6ZV0pKSk7CisJc2VydmVyLT5jdXJyZW50X3NpemUgKz0gNDsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIG5jcF9hZGRfYmUzMihzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBfX3UzMiB4KQoreworCWFzc2VydF9zZXJ2ZXJfbG9ja2VkKHNlcnZlcik7CisJcHV0X3VuYWxpZ25lZChjcHVfdG9fYmUzMih4KSwgKF9fYmUzMiAqKSgmKHNlcnZlci0+cGFja2V0W3NlcnZlci0+Y3VycmVudF9zaXplXSkpKTsKKwlzZXJ2ZXItPmN1cnJlbnRfc2l6ZSArPSA0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbmNwX2FkZF9kd29yZF9saChzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBfX3UzMiB4KSB7CisJbmNwX2FkZF9kd29yZChzZXJ2ZXIsIGNwdV90b19sZTMyKHgpKTsKK30KKworc3RhdGljIHZvaWQgbmNwX2FkZF9tZW0oc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwgY29uc3Qgdm9pZCAqc291cmNlLCBpbnQgc2l6ZSkKK3sKKwlhc3NlcnRfc2VydmVyX2xvY2tlZChzZXJ2ZXIpOworCW1lbWNweSgmKHNlcnZlci0+cGFja2V0W3NlcnZlci0+Y3VycmVudF9zaXplXSksIHNvdXJjZSwgc2l6ZSk7CisJc2VydmVyLT5jdXJyZW50X3NpemUgKz0gc2l6ZTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIG5jcF9hZGRfcHN0cmluZyhzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBjb25zdCBjaGFyICpzKQoreworCWludCBsZW4gPSBzdHJsZW4ocyk7CisJYXNzZXJ0X3NlcnZlcl9sb2NrZWQoc2VydmVyKTsKKwlpZiAobGVuID4gMjU1KSB7CisJCURQUklOVEsoIm5jcGZzOiBzdHJpbmcgdG9vIGxvbmc6ICVzXG4iLCBzKTsKKwkJbGVuID0gMjU1OworCX0KKwluY3BfYWRkX2J5dGUoc2VydmVyLCBsZW4pOworCW5jcF9hZGRfbWVtKHNlcnZlciwgcywgbGVuKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuY3BfaW5pdF9yZXF1ZXN0KHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIpCit7CisJbmNwX2xvY2tfc2VydmVyKHNlcnZlcik7CisKKwlzZXJ2ZXItPmN1cnJlbnRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbmNwX3JlcXVlc3RfaGVhZGVyKTsKKwlzZXJ2ZXItPmhhc19zdWJmdW5jdGlvbiA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuY3BfaW5pdF9yZXF1ZXN0X3Moc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwgaW50IHN1YmZ1bmN0aW9uKQoreworCW5jcF9sb2NrX3NlcnZlcihzZXJ2ZXIpOworCQorCXNlcnZlci0+Y3VycmVudF9zaXplID0gc2l6ZW9mKHN0cnVjdCBuY3BfcmVxdWVzdF9oZWFkZXIpICsgMjsKKwluY3BfYWRkX2J5dGUoc2VydmVyLCBzdWJmdW5jdGlvbik7CisKKwlzZXJ2ZXItPmhhc19zdWJmdW5jdGlvbiA9IDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgY2hhciAqCisgbmNwX3JlcGx5X2RhdGEoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwgaW50IG9mZnNldCkKK3sKKwlyZXR1cm4gJihzZXJ2ZXItPnBhY2tldFtzaXplb2Yoc3RydWN0IG5jcF9yZXBseV9oZWFkZXIpICsgb2Zmc2V0XSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX191OCBCVkFMKHZvaWQqIGRhdGEpCit7CisJcmV0dXJuIGdldF91bmFsaWduZWQoKF9fdTgqKWRhdGEpOworfQorCitzdGF0aWMgX191OAorIG5jcF9yZXBseV9ieXRlKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIGludCBvZmZzZXQpCit7CisJcmV0dXJuIGdldF91bmFsaWduZWQoKF9fdTggKikgbmNwX3JlcGx5X2RhdGEoc2VydmVyLCBvZmZzZXQpKTsKK30KKworc3RhdGljIGlubGluZSBfX3UxNiBXVkFMX0xIKHZvaWQqIGRhdGEpCit7CisJcmV0dXJuIGxlMTZfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fbGUxNiopZGF0YSkpOworfQorCitzdGF0aWMgX191MTYKKyBuY3BfcmVwbHlfbGUxNihzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBpbnQgb2Zmc2V0KQoreworCXJldHVybiBsZTE2X3RvX2NwdShnZXRfdW5hbGlnbmVkKChfX2xlMTYgKikgbmNwX3JlcGx5X2RhdGEoc2VydmVyLCBvZmZzZXQpKSk7Cit9CisKK3N0YXRpYyBfX3UxNgorIG5jcF9yZXBseV9iZTE2KHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIGludCBvZmZzZXQpCit7CisJcmV0dXJuIGJlMTZfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fYmUxNiAqKSBuY3BfcmVwbHlfZGF0YShzZXJ2ZXIsIG9mZnNldCkpKTsKK30KKworc3RhdGljIGlubGluZSBfX3UzMiBEVkFMX0xIKHZvaWQqIGRhdGEpCit7CisJcmV0dXJuIGxlMzJfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fbGUzMiopZGF0YSkpOworfQorCitzdGF0aWMgX19sZTMyCisgbmNwX3JlcGx5X2R3b3JkKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIGludCBvZmZzZXQpCit7CisJcmV0dXJuIGdldF91bmFsaWduZWQoKF9fbGUzMiAqKSBuY3BfcmVwbHlfZGF0YShzZXJ2ZXIsIG9mZnNldCkpOworfQorCitzdGF0aWMgaW5saW5lIF9fdTMyIG5jcF9yZXBseV9kd29yZF9saChzdHJ1Y3QgbmNwX3NlcnZlciogc2VydmVyLCBpbnQgb2Zmc2V0KSB7CisJcmV0dXJuIGxlMzJfdG9fY3B1KG5jcF9yZXBseV9kd29yZChzZXJ2ZXIsIG9mZnNldCkpOworfQorCitpbnQKK25jcF9uZWdvdGlhdGVfYnVmZmVyc2l6ZShzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBpbnQgc2l6ZSwgaW50ICp0YXJnZXQpCit7CisJaW50IHJlc3VsdDsKKworCW5jcF9pbml0X3JlcXVlc3Qoc2VydmVyKTsKKwluY3BfYWRkX2JlMTYoc2VydmVyLCBzaXplKTsKKworCWlmICgocmVzdWx0ID0gbmNwX3JlcXVlc3Qoc2VydmVyLCAzMykpICE9IDApIHsKKwkJbmNwX3VubG9ja19zZXJ2ZXIoc2VydmVyKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJKnRhcmdldCA9IG1pbl90KHVuc2lnbmVkIGludCwgbmNwX3JlcGx5X2JlMTYoc2VydmVyLCAwKSwgc2l6ZSk7CisKKwluY3BfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOworCXJldHVybiAwOworfQorCisKKy8qIG9wdGlvbnM6IAorICoJYml0IDAJaXB4IGNoZWNrc3VtCisgKgliaXQgMQlwYWNrZXQgc2lnbmluZworICovCitpbnQKK25jcF9uZWdvdGlhdGVfc2l6ZV9hbmRfb3B0aW9ucyhzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCAKKwlpbnQgc2l6ZSwgaW50IG9wdGlvbnMsIGludCAqcmV0X3NpemUsIGludCAqcmV0X29wdGlvbnMpIHsKKwlpbnQgcmVzdWx0OworCisJLyogdGhlcmUgaXMgbWluaW11bSAqLworCWlmIChzaXplIDwgTkNQX0JMT0NLX1NJWkUpIHNpemUgPSBOQ1BfQkxPQ0tfU0laRTsKKworCW5jcF9pbml0X3JlcXVlc3Qoc2VydmVyKTsKKwluY3BfYWRkX2JlMTYoc2VydmVyLCBzaXplKTsKKwluY3BfYWRkX2J5dGUoc2VydmVyLCBvcHRpb25zKTsKKwkKKwlpZiAoKHJlc3VsdCA9IG5jcF9yZXF1ZXN0KHNlcnZlciwgMHg2MSkpICE9IDApCisJeworCQluY3BfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qIE5DUCBvdmVyIFVEUCByZXR1cm5zIDAgKCEhISkgKi8KKwlyZXN1bHQgPSBuY3BfcmVwbHlfYmUxNihzZXJ2ZXIsIDApOworCWlmIChyZXN1bHQgPj0gTkNQX0JMT0NLX1NJWkUpCisJCXNpemUgPSBtaW4ocmVzdWx0LCBzaXplKTsKKwkqcmV0X3NpemUgPSBzaXplOworCSpyZXRfb3B0aW9ucyA9IG5jcF9yZXBseV9ieXRlKHNlcnZlciwgNCk7CisKKwluY3BfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOworCXJldHVybiAwOworfQorCitpbnQgbmNwX2dldF92b2x1bWVfaW5mb193aXRoX251bWJlcihzdHJ1Y3QgbmNwX3NlcnZlciogc2VydmVyLAorCQkJICAgICBpbnQgbiwgc3RydWN0IG5jcF92b2x1bWVfaW5mbyogdGFyZ2V0KSB7CisJaW50IHJlc3VsdDsKKwlpbnQgbGVuOworCisJbmNwX2luaXRfcmVxdWVzdF9zKHNlcnZlciwgNDQpOworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIG4pOworCisJaWYgKChyZXN1bHQgPSBuY3BfcmVxdWVzdChzZXJ2ZXIsIDIyKSkgIT0gMCkgeworCQlnb3RvIG91dDsKKwl9CisJdGFyZ2V0LT50b3RhbF9ibG9ja3MgPSBuY3BfcmVwbHlfZHdvcmRfbGgoc2VydmVyLCAwKTsKKwl0YXJnZXQtPmZyZWVfYmxvY2tzID0gbmNwX3JlcGx5X2R3b3JkX2xoKHNlcnZlciwgNCk7CisJdGFyZ2V0LT5wdXJnZWFibGVfYmxvY2tzID0gbmNwX3JlcGx5X2R3b3JkX2xoKHNlcnZlciwgOCk7CisJdGFyZ2V0LT5ub3RfeWV0X3B1cmdlYWJsZV9ibG9ja3MgPSBuY3BfcmVwbHlfZHdvcmRfbGgoc2VydmVyLCAxMik7CisJdGFyZ2V0LT50b3RhbF9kaXJfZW50cmllcyA9IG5jcF9yZXBseV9kd29yZF9saChzZXJ2ZXIsIDE2KTsKKwl0YXJnZXQtPmF2YWlsYWJsZV9kaXJfZW50cmllcyA9IG5jcF9yZXBseV9kd29yZF9saChzZXJ2ZXIsIDIwKTsKKwl0YXJnZXQtPnNlY3RvcnNfcGVyX2Jsb2NrID0gbmNwX3JlcGx5X2J5dGUoc2VydmVyLCAyOCk7CisKKwltZW1zZXQoJih0YXJnZXQtPnZvbHVtZV9uYW1lKSwgMCwgc2l6ZW9mKHRhcmdldC0+dm9sdW1lX25hbWUpKTsKKworCXJlc3VsdCA9IC1FSU87CisJbGVuID0gbmNwX3JlcGx5X2J5dGUoc2VydmVyLCAyOSk7CisJaWYgKGxlbiA+IE5DUF9WT0xOQU1FX0xFTikgeworCQlEUFJJTlRLKCJuY3Bmczogdm9sdW1lIG5hbWUgdG9vIGxvbmc6ICVkXG4iLCBsZW4pOworCQlnb3RvIG91dDsKKwl9CisJbWVtY3B5KCYodGFyZ2V0LT52b2x1bWVfbmFtZSksIG5jcF9yZXBseV9kYXRhKHNlcnZlciwgMzApLCBsZW4pOworCXJlc3VsdCA9IDA7CitvdXQ6CisJbmNwX3VubG9ja19zZXJ2ZXIoc2VydmVyKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgbmNwX2dldF9kaXJlY3RvcnlfaW5mbyhzdHJ1Y3QgbmNwX3NlcnZlciogc2VydmVyLCBfX3U4IG4sIAorCQkJICAgc3RydWN0IG5jcF92b2x1bWVfaW5mbyogdGFyZ2V0KSB7CisJaW50IHJlc3VsdDsKKwlpbnQgbGVuOworCisJbmNwX2luaXRfcmVxdWVzdF9zKHNlcnZlciwgNDUpOworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIG4pOworCisJaWYgKChyZXN1bHQgPSBuY3BfcmVxdWVzdChzZXJ2ZXIsIDIyKSkgIT0gMCkgeworCQlnb3RvIG91dDsKKwl9CisJdGFyZ2V0LT50b3RhbF9ibG9ja3MgPSBuY3BfcmVwbHlfZHdvcmRfbGgoc2VydmVyLCAwKTsKKwl0YXJnZXQtPmZyZWVfYmxvY2tzID0gbmNwX3JlcGx5X2R3b3JkX2xoKHNlcnZlciwgNCk7CisJdGFyZ2V0LT5wdXJnZWFibGVfYmxvY2tzID0gMDsKKwl0YXJnZXQtPm5vdF95ZXRfcHVyZ2VhYmxlX2Jsb2NrcyA9IDA7CisJdGFyZ2V0LT50b3RhbF9kaXJfZW50cmllcyA9IG5jcF9yZXBseV9kd29yZF9saChzZXJ2ZXIsIDgpOworCXRhcmdldC0+YXZhaWxhYmxlX2Rpcl9lbnRyaWVzID0gbmNwX3JlcGx5X2R3b3JkX2xoKHNlcnZlciwgMTIpOworCXRhcmdldC0+c2VjdG9yc19wZXJfYmxvY2sgPSBuY3BfcmVwbHlfYnl0ZShzZXJ2ZXIsIDIwKTsKKworCW1lbXNldCgmKHRhcmdldC0+dm9sdW1lX25hbWUpLCAwLCBzaXplb2YodGFyZ2V0LT52b2x1bWVfbmFtZSkpOworCisJcmVzdWx0ID0gLUVJTzsKKwlsZW4gPSBuY3BfcmVwbHlfYnl0ZShzZXJ2ZXIsIDIxKTsKKwlpZiAobGVuID4gTkNQX1ZPTE5BTUVfTEVOKSB7CisJCURQUklOVEsoIm5jcGZzOiB2b2x1bWUgbmFtZSB0b28gbG9uZzogJWRcbiIsIGxlbik7CisJCWdvdG8gb3V0OworCX0KKwltZW1jcHkoJih0YXJnZXQtPnZvbHVtZV9uYW1lKSwgbmNwX3JlcGx5X2RhdGEoc2VydmVyLCAyMiksIGxlbik7CisJcmVzdWx0ID0gMDsKK291dDoKKwluY3BfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludAorbmNwX2Nsb3NlX2ZpbGUoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwgY29uc3QgY2hhciAqZmlsZV9pZCkKK3sKKwlpbnQgcmVzdWx0OworCisJbmNwX2luaXRfcmVxdWVzdChzZXJ2ZXIpOworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDApOworCW5jcF9hZGRfbWVtKHNlcnZlciwgZmlsZV9pZCwgNik7CisKKwlyZXN1bHQgPSBuY3BfcmVxdWVzdChzZXJ2ZXIsIDY2KTsKKwluY3BfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludAorbmNwX21ha2VfY2xvc2VkKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW50IGVycjsKKworCWVyciA9IDA7CisJZG93bigmTkNQX0ZJTkZPKGlub2RlKS0+b3Blbl9zZW0pOwkKKwlpZiAoYXRvbWljX3JlYWQoJk5DUF9GSU5GTyhpbm9kZSktPm9wZW5lZCkgPT0gMSkgeworCQlhdG9taWNfc2V0KCZOQ1BfRklORk8oaW5vZGUpLT5vcGVuZWQsIDApOworCQllcnIgPSBuY3BfY2xvc2VfZmlsZShOQ1BfU0VSVkVSKGlub2RlKSwgTkNQX0ZJTkZPKGlub2RlKS0+ZmlsZV9oYW5kbGUpOworCisJCWlmICghZXJyKQorCQkJUFBSSU5USygibmNwX21ha2VfY2xvc2VkOiB2b2xudW09JWQsIGRpcmVudD0ldSwgZXJyb3I9JWRcbiIsCisJCQkJTkNQX0ZJTkZPKGlub2RlKS0+dm9sTnVtYmVyLAorCQkJCU5DUF9GSU5GTyhpbm9kZSktPmRpckVudE51bSwgZXJyKTsKKwl9CisJdXAoJk5DUF9GSU5GTyhpbm9kZSktPm9wZW5fc2VtKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBuY3BfYWRkX2hhbmRsZV9wYXRoKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIF9fdTggdm9sX251bSwKKwkJCQlfX2xlMzIgZGlyX2Jhc2UsIGludCBoYXZlX2Rpcl9iYXNlLCAKKwkJCQljb25zdCBjaGFyICpwYXRoKQoreworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIHZvbF9udW0pOworCW5jcF9hZGRfZHdvcmQoc2VydmVyLCBkaXJfYmFzZSk7CisJaWYgKGhhdmVfZGlyX2Jhc2UgIT0gMCkgeworCQluY3BfYWRkX2J5dGUoc2VydmVyLCAxKTsJLyogZGlyX2Jhc2UgKi8KKwl9IGVsc2UgeworCQluY3BfYWRkX2J5dGUoc2VydmVyLCAweGZmKTsJLyogbm8gaGFuZGxlICovCisJfQorCWlmIChwYXRoICE9IE5VTEwpIHsKKwkJbmNwX2FkZF9ieXRlKHNlcnZlciwgMSk7CS8qIDEgY29tcG9uZW50ICovCisJCW5jcF9hZGRfcHN0cmluZyhzZXJ2ZXIsIHBhdGgpOworCX0gZWxzZSB7CisJCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDApOworCX0KK30KKworaW50IG5jcF9kaXJoYW5kbGVfYWxsb2Moc3RydWN0IG5jcF9zZXJ2ZXIqIHNlcnZlciwgX191OCB2b2xudW0sIF9fbGUzMiBkaXJlbnQsCisJCQlfX3U4KiBkaXJoYW5kbGUpIHsKKwlpbnQgcmVzdWx0OworCisJbmNwX2luaXRfcmVxdWVzdChzZXJ2ZXIpOworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDEyKTsJCS8qIHN1YmZ1bmN0aW9uICovCisJbmNwX2FkZF9ieXRlKHNlcnZlciwgTldfTlNfRE9TKTsKKwluY3BfYWRkX2J5dGUoc2VydmVyLCAwKTsKKwluY3BfYWRkX3dvcmQoc2VydmVyLCAwKTsKKwluY3BfYWRkX2hhbmRsZV9wYXRoKHNlcnZlciwgdm9sbnVtLCBkaXJlbnQsIDEsIE5VTEwpOworCWlmICgocmVzdWx0ID0gbmNwX3JlcXVlc3Qoc2VydmVyLCA4NykpID09IDApIHsKKwkJKmRpcmhhbmRsZSA9IG5jcF9yZXBseV9ieXRlKHNlcnZlciwgMCk7CisJfQorCW5jcF91bmxvY2tfc2VydmVyKHNlcnZlcik7CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IG5jcF9kaXJoYW5kbGVfZnJlZShzdHJ1Y3QgbmNwX3NlcnZlciogc2VydmVyLCBfX3U4IGRpcmhhbmRsZSkgeworCWludCByZXN1bHQ7CisJCisJbmNwX2luaXRfcmVxdWVzdF9zKHNlcnZlciwgMjApOworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIGRpcmhhbmRsZSk7CisJcmVzdWx0ID0gbmNwX3JlcXVlc3Qoc2VydmVyLCAyMik7CisJbmNwX3VubG9ja19zZXJ2ZXIoc2VydmVyKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCit2b2lkIG5jcF9leHRyYWN0X2ZpbGVfaW5mbyh2b2lkICpzdHJ1Y3R1cmUsIHN0cnVjdCBud19pbmZvX3N0cnVjdCAqdGFyZ2V0KQoreworCV9fdTggKm5hbWVfbGVuOworCWNvbnN0IGludCBpbmZvX3N0cnVjdF9zaXplID0gb2Zmc2V0b2Yoc3RydWN0IG53X2luZm9fc3RydWN0LCBuYW1lTGVuKTsKKworCW1lbWNweSh0YXJnZXQsIHN0cnVjdHVyZSwgaW5mb19zdHJ1Y3Rfc2l6ZSk7CisJbmFtZV9sZW4gPSBzdHJ1Y3R1cmUgKyBpbmZvX3N0cnVjdF9zaXplOworCXRhcmdldC0+bmFtZUxlbiA9ICpuYW1lX2xlbjsKKwltZW1jcHkodGFyZ2V0LT5lbnRyeU5hbWUsIG5hbWVfbGVuICsgMSwgKm5hbWVfbGVuKTsKKwl0YXJnZXQtPmVudHJ5TmFtZVsqbmFtZV9sZW5dID0gJ1wwJzsKKwl0YXJnZXQtPnZvbE51bWJlciA9IGxlMzJfdG9fY3B1KHRhcmdldC0+dm9sTnVtYmVyKTsKKwlyZXR1cm47Cit9CisKKyNpZmRlZiBDT05GSUdfTkNQRlNfTkZTX05TCitzdGF0aWMgaW5saW5lIHZvaWQgbmNwX2V4dHJhY3RfbmZzX2luZm8odW5zaWduZWQgY2hhciAqc3RydWN0dXJlLAorCQkJCSBzdHJ1Y3QgbndfbmZzX2luZm8gKnRhcmdldCkKK3sKKwl0YXJnZXQtPm1vZGUgPSBEVkFMX0xIKHN0cnVjdHVyZSk7CisJdGFyZ2V0LT5yZGV2ID0gRFZBTF9MSChzdHJ1Y3R1cmUgKyA4KTsKK30KKyNlbmRpZgorCitpbnQgbmNwX29idGFpbl9uZnNfaW5mbyhzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLAorCQkgICAgICAgIHN0cnVjdCBud19pbmZvX3N0cnVjdCAqdGFyZ2V0KQorCit7CisJaW50IHJlc3VsdCA9IDA7CisjaWZkZWYgQ09ORklHX05DUEZTX05GU19OUworCV9fdTMyIHZvbG51bSA9IHRhcmdldC0+dm9sTnVtYmVyOworCisJaWYgKG5jcF9pc19uZnNfZXh0cmFzKHNlcnZlciwgdm9sbnVtKSkgeworCQluY3BfaW5pdF9yZXF1ZXN0KHNlcnZlcik7CisJCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDE5KTsJLyogc3ViZnVuY3Rpb24gKi8KKwkJbmNwX2FkZF9ieXRlKHNlcnZlciwgc2VydmVyLT5uYW1lX3NwYWNlW3ZvbG51bV0pOworCQluY3BfYWRkX2J5dGUoc2VydmVyLCBOV19OU19ORlMpOworCQluY3BfYWRkX2J5dGUoc2VydmVyLCAwKTsKKwkJbmNwX2FkZF9ieXRlKHNlcnZlciwgdm9sbnVtKTsKKwkJbmNwX2FkZF9kd29yZChzZXJ2ZXIsIHRhcmdldC0+ZGlyRW50TnVtKTsKKwkJLyogV2UgbXVzdCByZXRyaWV2ZSBib3RoIG5saW5rcyBhbmQgcmRldiwgb3RoZXJ3aXNlIHNvbWUgc2VydmVyIHZlcnNpb25zCisJCSAgIHJlcG9ydCB6ZXJvZXMgaW5zdGVhZCBvZiB2YWxpZCBkYXRhICovCisJCW5jcF9hZGRfZHdvcmRfbGgoc2VydmVyLCBOU0lCTV9ORlNfTU9ERSB8IE5TSUJNX05GU19OTElOS1MgfCBOU0lCTV9ORlNfUkRFVik7CisKKwkJaWYgKChyZXN1bHQgPSBuY3BfcmVxdWVzdChzZXJ2ZXIsIDg3KSkgPT0gMCkgeworCQkJbmNwX2V4dHJhY3RfbmZzX2luZm8obmNwX3JlcGx5X2RhdGEoc2VydmVyLCAwKSwgJnRhcmdldC0+bmZzKTsKKwkJCURQUklOVEsoS0VSTl9ERUJVRworCQkJCSJuY3Bfb2J0YWluX25mc19pbmZvOiAoJXMpIG1vZGU9MCVvLCByZGV2PTB4JXhcbiIsCisJCQkJdGFyZ2V0LT5lbnRyeU5hbWUsIHRhcmdldC0+bmZzLm1vZGUsCisJCQkJdGFyZ2V0LT5uZnMucmRldik7CisJCX0gZWxzZSB7CisJCQl0YXJnZXQtPm5mcy5tb2RlID0gMDsKKwkJCXRhcmdldC0+bmZzLnJkZXYgPSAwOworCQl9CisJICAgICAgICBuY3BfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOworCisJfSBlbHNlCisjZW5kaWYKKwl7CisJCXRhcmdldC0+bmZzLm1vZGUgPSAwOworCQl0YXJnZXQtPm5mcy5yZGV2ID0gMDsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIFJldHVybnMgaW5mb3JtYXRpb24gZm9yIGEgKG9uZS1jb21wb25lbnQpIG5hbWUgcmVsYXRpdmUgdG8KKyAqIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LgorICovCitpbnQgbmNwX29idGFpbl9pbmZvKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBpbm9kZSAqZGlyLCBjaGFyICpwYXRoLAorCQkJc3RydWN0IG53X2luZm9fc3RydWN0ICp0YXJnZXQpCit7CisJX191OCAgdm9sbnVtID0gTkNQX0ZJTkZPKGRpciktPnZvbE51bWJlcjsKKwlfX2xlMzIgZGlyZW50ID0gTkNQX0ZJTkZPKGRpciktPmRpckVudE51bTsKKwlpbnQgcmVzdWx0OworCisJaWYgKHRhcmdldCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAibmNwX29idGFpbl9pbmZvOiBpbnZhbGlkIGNhbGxcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbmNwX2luaXRfcmVxdWVzdChzZXJ2ZXIpOworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDYpOwkvKiBzdWJmdW5jdGlvbiAqLworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIHNlcnZlci0+bmFtZV9zcGFjZVt2b2xudW1dKTsKKwluY3BfYWRkX2J5dGUoc2VydmVyLCBzZXJ2ZXItPm5hbWVfc3BhY2Vbdm9sbnVtXSk7IC8qIE4uQi4gdHdpY2UgPz8gKi8KKwluY3BfYWRkX3dvcmQoc2VydmVyLCBjcHVfdG9fbGUxNigweDgwMDYpKTsJLyogZ2V0IGFsbCAqLworCW5jcF9hZGRfZHdvcmQoc2VydmVyLCBSSU1fQUxMKTsKKwluY3BfYWRkX2hhbmRsZV9wYXRoKHNlcnZlciwgdm9sbnVtLCBkaXJlbnQsIDEsIHBhdGgpOworCisJaWYgKChyZXN1bHQgPSBuY3BfcmVxdWVzdChzZXJ2ZXIsIDg3KSkgIT0gMCkKKwkJZ290byBvdXQ7CisJbmNwX2V4dHJhY3RfZmlsZV9pbmZvKG5jcF9yZXBseV9kYXRhKHNlcnZlciwgMCksIHRhcmdldCk7CisJbmNwX3VubG9ja19zZXJ2ZXIoc2VydmVyKTsKKwkKKwlyZXN1bHQgPSBuY3Bfb2J0YWluX25mc19pbmZvKHNlcnZlciwgdGFyZ2V0KTsKKwlyZXR1cm4gcmVzdWx0OworCitvdXQ6CisJbmNwX3VubG9ja19zZXJ2ZXIoc2VydmVyKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisjaWZkZWYgQ09ORklHX05DUEZTX05GU19OUworc3RhdGljIGludAorbmNwX29idGFpbl9ET1NfZGlyX2Jhc2Uoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwKKwkJX191OCB2b2xudW0sIF9fbGUzMiBkaXJlbnQsCisJCWNoYXIgKnBhdGgsIC8qIEF0IG1vc3QgMSBjb21wb25lbnQgKi8KKwkJX19sZTMyICpET1NfZGlyX2Jhc2UpCit7CisJaW50IHJlc3VsdDsKKworCW5jcF9pbml0X3JlcXVlc3Qoc2VydmVyKTsKKwluY3BfYWRkX2J5dGUoc2VydmVyLCA2KTsgLyogc3ViZnVuY3Rpb24gKi8KKwluY3BfYWRkX2J5dGUoc2VydmVyLCBzZXJ2ZXItPm5hbWVfc3BhY2Vbdm9sbnVtXSk7CisJbmNwX2FkZF9ieXRlKHNlcnZlciwgc2VydmVyLT5uYW1lX3NwYWNlW3ZvbG51bV0pOworCW5jcF9hZGRfd29yZChzZXJ2ZXIsIGNwdV90b19sZTE2KDB4ODAwNikpOyAvKiBnZXQgYWxsICovCisJbmNwX2FkZF9kd29yZChzZXJ2ZXIsIFJJTV9ESVJFQ1RPUlkpOworCW5jcF9hZGRfaGFuZGxlX3BhdGgoc2VydmVyLCB2b2xudW0sIGRpcmVudCwgMSwgcGF0aCk7CisKKwlpZiAoKHJlc3VsdCA9IG5jcF9yZXF1ZXN0KHNlcnZlciwgODcpKSA9PSAwKQorCXsKKwkgICAJaWYgKERPU19kaXJfYmFzZSkgKkRPU19kaXJfYmFzZT1uY3BfcmVwbHlfZHdvcmQoc2VydmVyLCAweDM0KTsKKwl9CisJbmNwX3VubG9ja19zZXJ2ZXIoc2VydmVyKTsKKwlyZXR1cm4gcmVzdWx0OworfQorI2VuZGlmIC8qIENPTkZJR19OQ1BGU19ORlNfTlMgKi8KKworc3RhdGljIGlubGluZSBpbnQKK25jcF9nZXRfa25vd25fbmFtZXNwYWNlKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIF9fdTggdm9sdW1lKQoreworI2lmIGRlZmluZWQoQ09ORklHX05DUEZTX09TMl9OUykgfHwgZGVmaW5lZChDT05GSUdfTkNQRlNfTkZTX05TKQorCWludCByZXN1bHQ7CisJX191OCAqbmFtZXNwYWNlOworCV9fdTE2IG5vX25hbWVzcGFjZXM7CisKKwluY3BfaW5pdF9yZXF1ZXN0KHNlcnZlcik7CisJbmNwX2FkZF9ieXRlKHNlcnZlciwgMjQpOwkvKiBTdWJmdW5jdGlvbjogR2V0IE5hbWUgU3BhY2VzIExvYWRlZCAqLworCW5jcF9hZGRfd29yZChzZXJ2ZXIsIDApOworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIHZvbHVtZSk7CisKKwlpZiAoKHJlc3VsdCA9IG5jcF9yZXF1ZXN0KHNlcnZlciwgODcpKSAhPSAwKSB7CisJCW5jcF91bmxvY2tfc2VydmVyKHNlcnZlcik7CisJCXJldHVybiBOV19OU19ET1M7IC8qIG5vdCByZXN1bHQgPz8gKi8KKwl9CisKKwlyZXN1bHQgPSBOV19OU19ET1M7CisJbm9fbmFtZXNwYWNlcyA9IG5jcF9yZXBseV9sZTE2KHNlcnZlciwgMCk7CisJbmFtZXNwYWNlID0gbmNwX3JlcGx5X2RhdGEoc2VydmVyLCAyKTsKKworCXdoaWxlIChub19uYW1lc3BhY2VzID4gMCkgeworCQlEUFJJTlRLKCJnZXRfbmFtZXNwYWNlczogZm91bmQgJWQgb24gJWRcbiIsICpuYW1lc3BhY2UsIHZvbHVtZSk7CisKKyNpZmRlZiBDT05GSUdfTkNQRlNfTkZTX05TCisJCWlmICgoKm5hbWVzcGFjZSA9PSBOV19OU19ORlMpICYmICEoc2VydmVyLT5tLmZsYWdzJk5DUF9NT1VOVF9OT19ORlMpKSAKKwkJeworCQkJcmVzdWx0ID0gTldfTlNfTkZTOworCQkJYnJlYWs7CisJCX0KKyNlbmRpZgkvKiBDT05GSUdfTkNQRlNfTkZTX05TICovCisjaWZkZWYgQ09ORklHX05DUEZTX09TMl9OUworCQlpZiAoKCpuYW1lc3BhY2UgPT0gTldfTlNfT1MyKSAmJiAhKHNlcnZlci0+bS5mbGFncyZOQ1BfTU9VTlRfTk9fT1MyKSkKKwkJeworCQkJcmVzdWx0ID0gTldfTlNfT1MyOworCQl9CisjZW5kaWYJLyogQ09ORklHX05DUEZTX09TMl9OUyAqLworCQluYW1lc3BhY2UgKz0gMTsKKwkJbm9fbmFtZXNwYWNlcyAtPSAxOworCX0KKwluY3BfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOworCXJldHVybiByZXN1bHQ7CisjZWxzZQkvKiBuZWl0aGVyIE9TMiBub3IgTkZTIC0gb25seSBET1MgKi8KKwlyZXR1cm4gTldfTlNfRE9TOworI2VuZGlmCS8qIGRlZmluZWQoQ09ORklHX05DUEZTX09TMl9OUykgfHwgZGVmaW5lZChDT05GSUdfTkNQRlNfTkZTX05TKSAqLworfQorCitzdGF0aWMgaW50CituY3BfT2J0YWluU3BlY2lmaWNEaXJCYXNlKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsCisJCV9fdTggbnNTcmMsIF9fdTggbnNEc3QsIF9fdTggdm9sX251bSwgX19sZTMyIGRpcl9iYXNlLAorCQljaGFyICpwYXRoLCAvKiBBdCBtb3N0IDEgY29tcG9uZW50ICovCisJCV9fbGUzMiAqZGlyRW50TnVtLCBfX2xlMzIgKkRvc0Rpck51bSkKK3sKKwlpbnQgcmVzdWx0OworCisJbmNwX2luaXRfcmVxdWVzdChzZXJ2ZXIpOworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDYpOyAvKiBzdWJmdW5jdGlvbiAqLworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIG5zU3JjKTsKKwluY3BfYWRkX2J5dGUoc2VydmVyLCBuc0RzdCk7CisJbmNwX2FkZF93b3JkKHNlcnZlciwgY3B1X3RvX2xlMTYoMHg4MDA2KSk7IC8qIGdldCBhbGwgKi8KKwluY3BfYWRkX2R3b3JkKHNlcnZlciwgUklNX0FMTCk7CisJbmNwX2FkZF9oYW5kbGVfcGF0aChzZXJ2ZXIsIHZvbF9udW0sIGRpcl9iYXNlLCAxLCBwYXRoKTsKKworCWlmICgocmVzdWx0ID0gbmNwX3JlcXVlc3Qoc2VydmVyLCA4NykpICE9IDApCisJeworCQluY3BfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCWlmIChkaXJFbnROdW0pCisJCSpkaXJFbnROdW0gPSBuY3BfcmVwbHlfZHdvcmQoc2VydmVyLCAweDMwKTsKKwlpZiAoRG9zRGlyTnVtKQorCQkqRG9zRGlyTnVtID0gbmNwX3JlcGx5X2R3b3JkKHNlcnZlciwgMHgzNCk7CisJbmNwX3VubG9ja19zZXJ2ZXIoc2VydmVyKTsKKwlyZXR1cm4gMDsKK30KKworaW50CituY3BfbW91bnRfc3ViZGlyKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsCisJCSBfX3U4IHZvbE51bWJlciwgX191OCBzcmNOUywgX19sZTMyIGRpckVudE51bSwKKwkJIF9fdTMyKiB2b2x1bWUsIF9fbGUzMiogbmV3RGlyRW50LCBfX2xlMzIqIG5ld0Rvc0VudCkKK3sKKwlpbnQgZHN0TlM7CisJaW50IHJlc3VsdDsKKwkKKwlkc3ROUyA9IG5jcF9nZXRfa25vd25fbmFtZXNwYWNlKHNlcnZlciwgdm9sTnVtYmVyKTsKKwlpZiAoKHJlc3VsdCA9IG5jcF9PYnRhaW5TcGVjaWZpY0RpckJhc2Uoc2VydmVyLCBzcmNOUywgZHN0TlMsIHZvbE51bWJlciwgCisJCQkJICAgICAgZGlyRW50TnVtLCBOVUxMLCBuZXdEaXJFbnQsIG5ld0Rvc0VudCkpICE9IDApCisJeworCQlyZXR1cm4gcmVzdWx0OworCX0KKwlzZXJ2ZXItPm5hbWVfc3BhY2Vbdm9sTnVtYmVyXSA9IGRzdE5TOworCSp2b2x1bWUgPSB2b2xOdW1iZXI7CisJc2VydmVyLT5tLm1vdW50ZWRfdm9sWzFdID0gMDsKKwlzZXJ2ZXItPm0ubW91bnRlZF92b2xbMF0gPSAnWCc7CisJcmV0dXJuIDA7Cit9CisKK2ludCAKK25jcF9nZXRfdm9sdW1lX3Jvb3Qoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwgY29uc3QgY2hhciAqdm9sbmFtZSwKKwkJICAgIF9fdTMyKiB2b2x1bWUsIF9fbGUzMiogZGlyZW50LCBfX2xlMzIqIGRvc2RpcmVudCkKK3sKKwlpbnQgcmVzdWx0OworCV9fdTggdm9sbnVtOworCisJRFBSSU5USygibmNwX2dldF92b2x1bWVfcm9vdDogbG9va2luZyB1cCB2b2wgJXNcbiIsIHZvbG5hbWUpOworCisJbmNwX2luaXRfcmVxdWVzdChzZXJ2ZXIpOworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDIyKTsJLyogU3ViZnVuY3Rpb246IEdlbmVyYXRlIGRpciBoYW5kbGUgKi8KKwluY3BfYWRkX2J5dGUoc2VydmVyLCAwKTsJLyogRE9TIG5hbWVzcGFjZSAqLworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDApOwkvKiByZXNlcnZlZCAqLworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDApOwkvKiByZXNlcnZlZCAqLworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDApOwkvKiByZXNlcnZlZCAqLworCisJbmNwX2FkZF9ieXRlKHNlcnZlciwgMCk7CS8qIGZha2VkIHZvbHVtZSBudW1iZXIgKi8KKwluY3BfYWRkX2R3b3JkKHNlcnZlciwgMCk7CS8qIGZha2VkIGRpcl9iYXNlICovCisJbmNwX2FkZF9ieXRlKHNlcnZlciwgMHhmZik7CS8qIERvbid0IGhhdmUgYSBkaXJfYmFzZSAqLworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDEpOwkvKiAxIHBhdGggY29tcG9uZW50ICovCisJbmNwX2FkZF9wc3RyaW5nKHNlcnZlciwgdm9sbmFtZSk7CisKKwlpZiAoKHJlc3VsdCA9IG5jcF9yZXF1ZXN0KHNlcnZlciwgODcpKSAhPSAwKSB7CisJCW5jcF91bmxvY2tfc2VydmVyKHNlcnZlcik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCSpkaXJlbnQgPSAqZG9zZGlyZW50ID0gbmNwX3JlcGx5X2R3b3JkKHNlcnZlciwgNCk7CisJdm9sbnVtID0gbmNwX3JlcGx5X2J5dGUoc2VydmVyLCA4KTsKKwluY3BfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOworCSp2b2x1bWUgPSB2b2xudW07CisKKwlzZXJ2ZXItPm5hbWVfc3BhY2Vbdm9sbnVtXSA9IG5jcF9nZXRfa25vd25fbmFtZXNwYWNlKHNlcnZlciwgdm9sbnVtKTsKKworCURQUklOVEsoImxvb2t1cF92b2w6IG5hbWVzcGFjZVslZF0gPSAlZFxuIiwKKwkJdm9sbnVtLCBzZXJ2ZXItPm5hbWVfc3BhY2Vbdm9sbnVtXSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50CituY3BfbG9va3VwX3ZvbHVtZShzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBjb25zdCBjaGFyICp2b2xuYW1lLAorCQkgIHN0cnVjdCBud19pbmZvX3N0cnVjdCAqdGFyZ2V0KQoreworCWludCByZXN1bHQ7CisKKwltZW1zZXQodGFyZ2V0LCAwLCBzaXplb2YoKnRhcmdldCkpOworCXJlc3VsdCA9IG5jcF9nZXRfdm9sdW1lX3Jvb3Qoc2VydmVyLCB2b2xuYW1lLAorCQkJJnRhcmdldC0+dm9sTnVtYmVyLCAmdGFyZ2V0LT5kaXJFbnROdW0sICZ0YXJnZXQtPkRvc0Rpck51bSk7CisJaWYgKHJlc3VsdCkgeworCQlyZXR1cm4gcmVzdWx0OworCX0KKwl0YXJnZXQtPm5hbWVMZW4gPSBzdHJsZW4odm9sbmFtZSk7CisJbWVtY3B5KHRhcmdldC0+ZW50cnlOYW1lLCB2b2xuYW1lLCB0YXJnZXQtPm5hbWVMZW4rMSk7CisJdGFyZ2V0LT5hdHRyaWJ1dGVzID0gYURJUjsKKwkvKiBzZXQgZGF0ZXMgdG8gSmFuIDEsIDE5ODYgIDAwOjAwICovCisJdGFyZ2V0LT5jcmVhdGlvblRpbWUgPSB0YXJnZXQtPm1vZGlmeVRpbWUgPSBjcHVfdG9fbGUxNigweDAwMDApOworCXRhcmdldC0+Y3JlYXRpb25EYXRlID0gdGFyZ2V0LT5tb2RpZnlEYXRlID0gdGFyZ2V0LT5sYXN0QWNjZXNzRGF0ZSA9IGNwdV90b19sZTE2KDB4MEMyMSk7CisJdGFyZ2V0LT5uZnMubW9kZSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK2ludCBuY3BfbW9kaWZ5X2ZpbGVfb3Jfc3ViZGlyX2Rvc19pbmZvX3BhdGgoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwKKwkJCQkJICAgIHN0cnVjdCBpbm9kZSAqZGlyLAorCQkJCQkgICAgY29uc3QgY2hhciAqcGF0aCwKKwkJCQkJICAgIF9fbGUzMiBpbmZvX21hc2ssCisJCQkJCSAgICBjb25zdCBzdHJ1Y3QgbndfbW9kaWZ5X2Rvc19pbmZvICppbmZvKQoreworCV9fdTggIHZvbG51bSA9IE5DUF9GSU5GTyhkaXIpLT52b2xOdW1iZXI7CisJX19sZTMyIGRpcmVudCA9IE5DUF9GSU5GTyhkaXIpLT5kaXJFbnROdW07CisJaW50IHJlc3VsdDsKKworCW5jcF9pbml0X3JlcXVlc3Qoc2VydmVyKTsKKwluY3BfYWRkX2J5dGUoc2VydmVyLCA3KTsJLyogc3ViZnVuY3Rpb24gKi8KKwluY3BfYWRkX2J5dGUoc2VydmVyLCBzZXJ2ZXItPm5hbWVfc3BhY2Vbdm9sbnVtXSk7CisJbmNwX2FkZF9ieXRlKHNlcnZlciwgMCk7CS8qIHJlc2VydmVkICovCisJbmNwX2FkZF93b3JkKHNlcnZlciwgY3B1X3RvX2xlMTYoMHg4MDA2KSk7CS8qIHNlYXJjaCBhdHRyaWJzOiBhbGwgKi8KKworCW5jcF9hZGRfZHdvcmQoc2VydmVyLCBpbmZvX21hc2spOworCW5jcF9hZGRfbWVtKHNlcnZlciwgaW5mbywgc2l6ZW9mKCppbmZvKSk7CisJbmNwX2FkZF9oYW5kbGVfcGF0aChzZXJ2ZXIsIHZvbG51bSwgZGlyZW50LCAxLCBwYXRoKTsKKworCXJlc3VsdCA9IG5jcF9yZXF1ZXN0KHNlcnZlciwgODcpOworCW5jcF91bmxvY2tfc2VydmVyKHNlcnZlcik7CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IG5jcF9tb2RpZnlfZmlsZV9vcl9zdWJkaXJfZG9zX2luZm8oc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwKKwkJCQkgICAgICAgc3RydWN0IGlub2RlICpkaXIsCisJCQkJICAgICAgIF9fbGUzMiBpbmZvX21hc2ssCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBud19tb2RpZnlfZG9zX2luZm8gKmluZm8pCit7CisJcmV0dXJuIG5jcF9tb2RpZnlfZmlsZV9vcl9zdWJkaXJfZG9zX2luZm9fcGF0aChzZXJ2ZXIsIGRpciwgTlVMTCwKKwkJaW5mb19tYXNrLCBpbmZvKTsKK30KKworI2lmZGVmIENPTkZJR19OQ1BGU19ORlNfTlMKK2ludCBuY3BfbW9kaWZ5X25mc19pbmZvKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIF9fdTggdm9sbnVtLCBfX2xlMzIgZGlyZW50LAorCQkJICAgICAgIF9fdTMyIG1vZGUsIF9fdTMyIHJkZXYpCisKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKworCWlmIChzZXJ2ZXItPm5hbWVfc3BhY2Vbdm9sbnVtXSA9PSBOV19OU19ORlMpIHsKKwkJbmNwX2luaXRfcmVxdWVzdChzZXJ2ZXIpOworCQluY3BfYWRkX2J5dGUoc2VydmVyLCAyNSk7CS8qIHN1YmZ1bmN0aW9uICovCisJCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIHNlcnZlci0+bmFtZV9zcGFjZVt2b2xudW1dKTsKKwkJbmNwX2FkZF9ieXRlKHNlcnZlciwgTldfTlNfTkZTKTsKKwkJbmNwX2FkZF9ieXRlKHNlcnZlciwgdm9sbnVtKTsKKwkJbmNwX2FkZF9kd29yZChzZXJ2ZXIsIGRpcmVudCk7CisJCS8qIHdlIG11c3QgYWx3YXlzIG9wZXJhdGUgb24gYm90aCBubGlua3MgYW5kIHJkZXYsIG90aGVyd2lzZQorCQkgICByZGV2IGlzIG5vdCBzZXQgKi8KKwkJbmNwX2FkZF9kd29yZF9saChzZXJ2ZXIsIE5TSUJNX05GU19NT0RFIHwgTlNJQk1fTkZTX05MSU5LUyB8IE5TSUJNX05GU19SREVWKTsKKwkJbmNwX2FkZF9kd29yZF9saChzZXJ2ZXIsIG1vZGUpOworCQluY3BfYWRkX2R3b3JkX2xoKHNlcnZlciwgMSk7CS8qIG5saW5rcyAqLworCQluY3BfYWRkX2R3b3JkX2xoKHNlcnZlciwgcmRldik7CisJCXJlc3VsdCA9IG5jcF9yZXF1ZXN0KHNlcnZlciwgODcpOworCQluY3BfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorI2VuZGlmCisKKworc3RhdGljIGludAorbmNwX0RlbGV0ZU5TRW50cnkoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwKKwkJICBfX3U4IGhhdmVfZGlyX2Jhc2UsIF9fdTggdm9sbnVtLCBfX2xlMzIgZGlyZW50LAorCQkgIGNoYXIqIG5hbWUsIF9fdTggbnMsIF9fbGUxNiBhdHRyKQoreworCWludCByZXN1bHQ7CisKKwluY3BfaW5pdF9yZXF1ZXN0KHNlcnZlcik7CisJbmNwX2FkZF9ieXRlKHNlcnZlciwgOCk7CS8qIHN1YmZ1bmN0aW9uICovCisJbmNwX2FkZF9ieXRlKHNlcnZlciwgbnMpOworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDApOwkvKiByZXNlcnZlZCAqLworCW5jcF9hZGRfd29yZChzZXJ2ZXIsIGF0dHIpOwkvKiBzZWFyY2ggYXR0cmliczogYWxsICovCisJbmNwX2FkZF9oYW5kbGVfcGF0aChzZXJ2ZXIsIHZvbG51bSwgZGlyZW50LCBoYXZlX2Rpcl9iYXNlLCBuYW1lKTsKKworCXJlc3VsdCA9IG5jcF9yZXF1ZXN0KHNlcnZlciwgODcpOworCW5jcF91bmxvY2tfc2VydmVyKHNlcnZlcik7CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50CituY3BfZGVsX2ZpbGVfb3Jfc3ViZGlyMihzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLAorCQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJX191OCAgdm9sbnVtOworCV9fbGUzMiBkaXJlbnQ7CisKKwlpZiAoIWlub2RlKSB7CisjaWZkZWYgQ09ORklHX05DUEZTX0RFQlVHREVOVFJZCisJCVBSSU5USygibmNwZnM6IG5jcGRlbDI6IGRlbnRyeS0+ZF9pbm9kZSA9PSBOVUxMXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gMHhGRjsJLyogQW55IGVycm9yICovCisJfQorCXZvbG51bSA9IE5DUF9GSU5GTyhpbm9kZSktPnZvbE51bWJlcjsKKwlkaXJlbnQgPSBOQ1BfRklORk8oaW5vZGUpLT5Eb3NEaXJOdW07CisJcmV0dXJuIG5jcF9EZWxldGVOU0VudHJ5KHNlcnZlciwgMSwgdm9sbnVtLCBkaXJlbnQsIE5VTEwsIE5XX05TX0RPUywgY3B1X3RvX2xlMTYoMHg4MDA2KSk7Cit9CisKK2ludAorbmNwX2RlbF9maWxlX29yX3N1YmRpcihzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLAorCQkgICAgICAgc3RydWN0IGlub2RlICpkaXIsIGNoYXIgKm5hbWUpCit7CisJX191OCAgdm9sbnVtID0gTkNQX0ZJTkZPKGRpciktPnZvbE51bWJlcjsKKwlfX2xlMzIgZGlyZW50ID0gTkNQX0ZJTkZPKGRpciktPmRpckVudE51bTsKKworI2lmZGVmIENPTkZJR19OQ1BGU19ORlNfTlMKKwlpZiAoc2VydmVyLT5uYW1lX3NwYWNlW3ZvbG51bV09PU5XX05TX05GUykKKyAJeworIAkJaW50IHJlc3VsdDsKKyAKKyAJCXJlc3VsdD1uY3Bfb2J0YWluX0RPU19kaXJfYmFzZShzZXJ2ZXIsIHZvbG51bSwgZGlyZW50LCBuYW1lLCAmZGlyZW50KTsKKyAJCWlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7CisgCQlyZXR1cm4gbmNwX0RlbGV0ZU5TRW50cnkoc2VydmVyLCAxLCB2b2xudW0sIGRpcmVudCwgTlVMTCwgTldfTlNfRE9TLCBjcHVfdG9fbGUxNigweDgwMDYpKTsKKyAJfQorIAllbHNlCisjZW5kaWYJLyogQ09ORklHX05DUEZTX05GU19OUyAqLworIAkJcmV0dXJuIG5jcF9EZWxldGVOU0VudHJ5KHNlcnZlciwgMSwgdm9sbnVtLCBkaXJlbnQsIG5hbWUsIHNlcnZlci0+bmFtZV9zcGFjZVt2b2xudW1dLCBjcHVfdG9fbGUxNigweDgwMDYpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIENvbnZlcnRUb05XZnJvbURXT1JEKF9fdTE2IHYwLCBfX3UxNiB2MSwgX191OCByZXRbNl0pCit7CisJX19sZTE2ICpkZXN0ID0gKF9fbGUxNiAqKSByZXQ7CisJZGVzdFsxXSA9IGNwdV90b19sZTE2KHYwKTsKKwlkZXN0WzJdID0gY3B1X3RvX2xlMTYodjEpOworCWRlc3RbMF0gPSBjcHVfdG9fbGUxNih2MCArIDEpOworCXJldHVybjsKK30KKworLyogSWYgYm90aCBkaXIgYW5kIG5hbWUgYXJlIE5VTEwsIHRoZW4gaW4gdGFyZ2V0IHRoZXJlJ3MgYWxyZWFkeSBhCisgICBsb29rZWQtdXAgZW50cnkgdGhhdCB3YW50cyB0byBiZSBvcGVuZWQuICovCitpbnQgbmNwX29wZW5fY3JlYXRlX2ZpbGVfb3Jfc3ViZGlyKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsCisJCQkJICAgc3RydWN0IGlub2RlICpkaXIsIGNoYXIgKm5hbWUsCisJCQkJICAgaW50IG9wZW5fY3JlYXRlX21vZGUsCisJCQkJICAgX19sZTMyIGNyZWF0ZV9hdHRyaWJ1dGVzLAorCQkJCSAgIF9fbGUxNiBkZXNpcmVkX2FjY19yaWdodHMsCisJCQkJICAgc3RydWN0IG5jcF9lbnRyeV9pbmZvICp0YXJnZXQpCit7CisJX19sZTE2IHNlYXJjaF9hdHRyaWJzID0gY3B1X3RvX2xlMTYoMHgwMDA2KTsKKwlfX3U4ICB2b2xudW07CisJX19sZTMyIGRpcmVudDsKKwlpbnQgcmVzdWx0OworCisJdm9sbnVtID0gTkNQX0ZJTkZPKGRpciktPnZvbE51bWJlcjsKKwlkaXJlbnQgPSBOQ1BfRklORk8oZGlyKS0+ZGlyRW50TnVtOworCisJaWYgKChjcmVhdGVfYXR0cmlidXRlcyAmIGFESVIpICE9IDApIHsKKwkJc2VhcmNoX2F0dHJpYnMgfD0gY3B1X3RvX2xlMTYoMHg4MDAwKTsKKwl9CisJbmNwX2luaXRfcmVxdWVzdChzZXJ2ZXIpOworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDEpOwkvKiBzdWJmdW5jdGlvbiAqLworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIHNlcnZlci0+bmFtZV9zcGFjZVt2b2xudW1dKTsKKwluY3BfYWRkX2J5dGUoc2VydmVyLCBvcGVuX2NyZWF0ZV9tb2RlKTsKKwluY3BfYWRkX3dvcmQoc2VydmVyLCBzZWFyY2hfYXR0cmlicyk7CisJbmNwX2FkZF9kd29yZChzZXJ2ZXIsIFJJTV9BTEwpOworCW5jcF9hZGRfZHdvcmQoc2VydmVyLCBjcmVhdGVfYXR0cmlidXRlcyk7CisJLyogVGhlIGRlc2lyZWQgYWNjIHJpZ2h0cyBzZWVtIHRvIGJlIHRoZSBpbmhlcml0ZWQgcmlnaHRzIG1hc2sKKwkgICBmb3IgZGlyZWN0b3JpZXMgKi8KKwluY3BfYWRkX3dvcmQoc2VydmVyLCBkZXNpcmVkX2FjY19yaWdodHMpOworCW5jcF9hZGRfaGFuZGxlX3BhdGgoc2VydmVyLCB2b2xudW0sIGRpcmVudCwgMSwgbmFtZSk7CisKKwlpZiAoKHJlc3VsdCA9IG5jcF9yZXF1ZXN0KHNlcnZlciwgODcpKSAhPSAwKQorCQlnb3RvIG91dDsKKwlpZiAoIShjcmVhdGVfYXR0cmlidXRlcyAmIGFESVIpKQorCQl0YXJnZXQtPm9wZW5lZCA9IDE7CisKKwkvKiBpbiB0YXJnZXQgdGhlcmUncyBhIG5ldyBmaW5mbyB0byBmaWxsICovCisJbmNwX2V4dHJhY3RfZmlsZV9pbmZvKG5jcF9yZXBseV9kYXRhKHNlcnZlciwgNiksICYodGFyZ2V0LT5pKSk7CisJdGFyZ2V0LT52b2x1bWUgPSB0YXJnZXQtPmkudm9sTnVtYmVyOworCUNvbnZlcnRUb05XZnJvbURXT1JEKG5jcF9yZXBseV9sZTE2KHNlcnZlciwgMCksCisJCQkgICAgIG5jcF9yZXBseV9sZTE2KHNlcnZlciwgMiksCisJCQkgICAgIHRhcmdldC0+ZmlsZV9oYW5kbGUpOworCQorCW5jcF91bmxvY2tfc2VydmVyKHNlcnZlcik7CisKKwkodm9pZCluY3Bfb2J0YWluX25mc19pbmZvKHNlcnZlciwgJih0YXJnZXQtPmkpKTsKKwlyZXR1cm4gMDsKKworb3V0OgorCW5jcF91bmxvY2tfc2VydmVyKHNlcnZlcik7CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50CituY3BfaW5pdGlhbGl6ZV9zZWFyY2goc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwgc3RydWN0IGlub2RlICpkaXIsCisJCQlzdHJ1Y3Qgbndfc2VhcmNoX3NlcXVlbmNlICp0YXJnZXQpCit7CisJX191OCAgdm9sbnVtID0gTkNQX0ZJTkZPKGRpciktPnZvbE51bWJlcjsKKwlfX2xlMzIgZGlyZW50ID0gTkNQX0ZJTkZPKGRpciktPmRpckVudE51bTsKKwlpbnQgcmVzdWx0OworCisJbmNwX2luaXRfcmVxdWVzdChzZXJ2ZXIpOworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDIpOwkvKiBzdWJmdW5jdGlvbiAqLworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIHNlcnZlci0+bmFtZV9zcGFjZVt2b2xudW1dKTsKKwluY3BfYWRkX2J5dGUoc2VydmVyLCAwKTsJLyogcmVzZXJ2ZWQgKi8KKwluY3BfYWRkX2hhbmRsZV9wYXRoKHNlcnZlciwgdm9sbnVtLCBkaXJlbnQsIDEsIE5VTEwpOworCisJcmVzdWx0ID0gbmNwX3JlcXVlc3Qoc2VydmVyLCA4Nyk7CisJaWYgKHJlc3VsdCkKKwkJZ290byBvdXQ7CisJbWVtY3B5KHRhcmdldCwgbmNwX3JlcGx5X2RhdGEoc2VydmVyLCAwKSwgc2l6ZW9mKCp0YXJnZXQpKTsKKworb3V0OgorCW5jcF91bmxvY2tfc2VydmVyKHNlcnZlcik7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyogU2VhcmNoIGZvciBldmVyeXRoaW5nICovCitpbnQgbmNwX3NlYXJjaF9mb3JfZmlsZV9vcl9zdWJkaXIoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwKKwkJCQkgIHN0cnVjdCBud19zZWFyY2hfc2VxdWVuY2UgKnNlcSwKKwkJCQkgIHN0cnVjdCBud19pbmZvX3N0cnVjdCAqdGFyZ2V0KQoreworCWludCByZXN1bHQ7CisKKwluY3BfaW5pdF9yZXF1ZXN0KHNlcnZlcik7CisJbmNwX2FkZF9ieXRlKHNlcnZlciwgMyk7CS8qIHN1YmZ1bmN0aW9uICovCisJbmNwX2FkZF9ieXRlKHNlcnZlciwgc2VydmVyLT5uYW1lX3NwYWNlW3NlcS0+dm9sTnVtYmVyXSk7CisJbmNwX2FkZF9ieXRlKHNlcnZlciwgMCk7CS8qIGRhdGEgc3RyZWFtICg/Pz8pICovCisJbmNwX2FkZF93b3JkKHNlcnZlciwgY3B1X3RvX2xlMTYoMHg4MDA2KSk7CS8qIFNlYXJjaCBhdHRyaWJzICovCisJbmNwX2FkZF9kd29yZChzZXJ2ZXIsIFJJTV9BTEwpOwkJLyogcmV0dXJuIGluZm8gbWFzayAqLworCW5jcF9hZGRfbWVtKHNlcnZlciwgc2VxLCA5KTsKKyNpZmRlZiBDT05GSUdfTkNQRlNfTkZTX05TCisJaWYgKHNlcnZlci0+bmFtZV9zcGFjZVtzZXEtPnZvbE51bWJlcl0gPT0gTldfTlNfTkZTKSB7CisJCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDApOwkvKiAwIGJ5dGUgcGF0dGVybiAqLworCX0gZWxzZSAKKyNlbmRpZgorCXsKKwkJbmNwX2FkZF9ieXRlKHNlcnZlciwgMik7CS8qIDIgYnl0ZSBwYXR0ZXJuICovCisJCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDB4ZmYpOwkvKiBmb2xsb3dpbmcgaXMgYSB3aWxkY2FyZCAqLworCQluY3BfYWRkX2J5dGUoc2VydmVyLCAnKicpOworCX0KKwkKKwlpZiAoKHJlc3VsdCA9IG5jcF9yZXF1ZXN0KHNlcnZlciwgODcpKSAhPSAwKQorCQlnb3RvIG91dDsKKwltZW1jcHkoc2VxLCBuY3BfcmVwbHlfZGF0YShzZXJ2ZXIsIDApLCBzaXplb2YoKnNlcSkpOworCW5jcF9leHRyYWN0X2ZpbGVfaW5mbyhuY3BfcmVwbHlfZGF0YShzZXJ2ZXIsIDEwKSwgdGFyZ2V0KTsKKworCW5jcF91bmxvY2tfc2VydmVyKHNlcnZlcik7CisJCisJcmVzdWx0ID0gbmNwX29idGFpbl9uZnNfaW5mbyhzZXJ2ZXIsIHRhcmdldCk7CisJcmV0dXJuIHJlc3VsdDsKKworb3V0OgorCW5jcF91bmxvY2tfc2VydmVyKHNlcnZlcik7CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IG5jcF9zZWFyY2hfZm9yX2ZpbGVzZXQoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwKKwkJCSAgIHN0cnVjdCBud19zZWFyY2hfc2VxdWVuY2UgKnNlcSwKKwkJCSAgIGludCogbW9yZSwKKwkJCSAgIGludCogY250LAorCQkJICAgY2hhciogYnVmZmVyLAorCQkJICAgc2l6ZV90IGJ1ZnNpemUsCisJCQkgICBjaGFyKiogcmJ1ZiwKKwkJCSAgIHNpemVfdCogcnNpemUpCit7CisJaW50IHJlc3VsdDsKKworCW5jcF9pbml0X3JlcXVlc3Qoc2VydmVyKTsKKwluY3BfYWRkX2J5dGUoc2VydmVyLCAyMCk7CisJbmNwX2FkZF9ieXRlKHNlcnZlciwgc2VydmVyLT5uYW1lX3NwYWNlW3NlcS0+dm9sTnVtYmVyXSk7CisJbmNwX2FkZF9ieXRlKHNlcnZlciwgMCk7CQkvKiBkYXRhc3RyZWFtICovCisJbmNwX2FkZF93b3JkKHNlcnZlciwgY3B1X3RvX2xlMTYoMHg4MDA2KSk7CisJbmNwX2FkZF9kd29yZChzZXJ2ZXIsIFJJTV9BTEwpOworCW5jcF9hZGRfd29yZChzZXJ2ZXIsIGNwdV90b19sZTE2KDMyNzY3KSk7CS8qIG1heCByZXR1cm5lZCBpdGVtcyAqLworCW5jcF9hZGRfbWVtKHNlcnZlciwgc2VxLCA5KTsKKyNpZmRlZiBDT05GSUdfTkNQRlNfTkZTX05TCisJaWYgKHNlcnZlci0+bmFtZV9zcGFjZVtzZXEtPnZvbE51bWJlcl0gPT0gTldfTlNfTkZTKSB7CisJCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDApOwkvKiAwIGJ5dGUgcGF0dGVybiAqLworCX0gZWxzZSAKKyNlbmRpZgorCXsKKwkJbmNwX2FkZF9ieXRlKHNlcnZlciwgMik7CS8qIDIgYnl0ZSBwYXR0ZXJuICovCisJCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDB4ZmYpOwkvKiBmb2xsb3dpbmcgaXMgYSB3aWxkY2FyZCAqLworCQluY3BfYWRkX2J5dGUoc2VydmVyLCAnKicpOworCX0KKwlyZXN1bHQgPSBuY3BfcmVxdWVzdDIoc2VydmVyLCA4NywgYnVmZmVyLCBidWZzaXplKTsKKwlpZiAocmVzdWx0KSB7CisJCW5jcF91bmxvY2tfc2VydmVyKHNlcnZlcik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCWlmIChzZXJ2ZXItPm5jcF9yZXBseV9zaXplIDwgMTIpIHsKKwkJbmNwX3VubG9ja19zZXJ2ZXIoc2VydmVyKTsKKwkJcmV0dXJuIDB4RkY7CisJfQorCSpyc2l6ZSA9IHNlcnZlci0+bmNwX3JlcGx5X3NpemUgLSAxMjsKKwluY3BfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOworCWJ1ZmZlciA9IGJ1ZmZlciArIHNpemVvZihzdHJ1Y3QgbmNwX3JlcGx5X2hlYWRlcik7CisJKnJidWYgPSBidWZmZXIgKyAxMjsKKwkqY250ID0gV1ZBTF9MSChidWZmZXIgKyAxMCk7CisJKm1vcmUgPSBCVkFMKGJ1ZmZlciArIDkpOworCW1lbWNweShzZXEsIGJ1ZmZlciwgOSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25jcF9SZW5hbWVOU0VudHJ5KHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsCisJCSAgc3RydWN0IGlub2RlICpvbGRfZGlyLCBjaGFyICpvbGRfbmFtZSwgX19sZTE2IG9sZF90eXBlLAorCQkgIHN0cnVjdCBpbm9kZSAqbmV3X2RpciwgY2hhciAqbmV3X25hbWUpCit7CisJaW50IHJlc3VsdCA9IC1FSU5WQUw7CisKKwlpZiAoKG9sZF9kaXIgPT0gTlVMTCkgfHwgKG9sZF9uYW1lID09IE5VTEwpIHx8CisJICAgIChuZXdfZGlyID09IE5VTEwpIHx8IChuZXdfbmFtZSA9PSBOVUxMKSkKKwkJZ290byBvdXQ7CisKKwluY3BfaW5pdF9yZXF1ZXN0KHNlcnZlcik7CisJbmNwX2FkZF9ieXRlKHNlcnZlciwgNCk7CS8qIHN1YmZ1bmN0aW9uICovCisJbmNwX2FkZF9ieXRlKHNlcnZlciwgc2VydmVyLT5uYW1lX3NwYWNlW05DUF9GSU5GTyhvbGRfZGlyKS0+dm9sTnVtYmVyXSk7CisJbmNwX2FkZF9ieXRlKHNlcnZlciwgMSk7CS8qIHJlbmFtZSBmbGFnICovCisJbmNwX2FkZF93b3JkKHNlcnZlciwgb2xkX3R5cGUpOwkvKiBzZWFyY2ggYXR0cmlidXRlcyAqLworCisJLyogc291cmNlIEhhbmRsZSBQYXRoICovCisJbmNwX2FkZF9ieXRlKHNlcnZlciwgTkNQX0ZJTkZPKG9sZF9kaXIpLT52b2xOdW1iZXIpOworCW5jcF9hZGRfZHdvcmQoc2VydmVyLCBOQ1BfRklORk8ob2xkX2RpciktPmRpckVudE51bSk7CisJbmNwX2FkZF9ieXRlKHNlcnZlciwgMSk7CisJbmNwX2FkZF9ieXRlKHNlcnZlciwgMSk7CS8qIDEgc291cmNlIGNvbXBvbmVudCAqLworCisJLyogZGVzdCBIYW5kbGUgUGF0aCAqLworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIE5DUF9GSU5GTyhuZXdfZGlyKS0+dm9sTnVtYmVyKTsKKwluY3BfYWRkX2R3b3JkKHNlcnZlciwgTkNQX0ZJTkZPKG5ld19kaXIpLT5kaXJFbnROdW0pOworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDEpOworCW5jcF9hZGRfYnl0ZShzZXJ2ZXIsIDEpOwkvKiAxIGRlc3RpbmF0aW9uIGNvbXBvbmVudCAqLworCisJLyogc291cmNlIHBhdGggc3RyaW5nICovCisJbmNwX2FkZF9wc3RyaW5nKHNlcnZlciwgb2xkX25hbWUpOworCS8qIGRlc3QgcGF0aCBzdHJpbmcgKi8KKwluY3BfYWRkX3BzdHJpbmcoc2VydmVyLCBuZXdfbmFtZSk7CisKKwlyZXN1bHQgPSBuY3BfcmVxdWVzdChzZXJ2ZXIsIDg3KTsKKwluY3BfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOworb3V0OgorCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBuY3BfcmVuX29yX21vdl9maWxlX29yX3N1YmRpcihzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLAorCQkJCXN0cnVjdCBpbm9kZSAqb2xkX2RpciwgY2hhciAqb2xkX25hbWUsCisJCQkJc3RydWN0IGlub2RlICpuZXdfZGlyLCBjaGFyICpuZXdfbmFtZSkKK3sKKyAgICAgICAgaW50IHJlc3VsdDsKKyAgICAgICAgX19sZTE2IG9sZF90eXBlID0gY3B1X3RvX2xlMTYoMHgwNik7CisKKy8qIElmIHNvbWVib2R5IGNhbiBkbyBpdCBhdG9taWMsIGNhbGwgbWUuLi4gdmFuZHJvdmVAdmMuY3Z1dC5jeiAqLworCXJlc3VsdCA9IG5jcF9SZW5hbWVOU0VudHJ5KHNlcnZlciwgb2xkX2Rpciwgb2xkX25hbWUsIG9sZF90eXBlLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2RpciwgbmV3X25hbWUpOworICAgICAgICBpZiAocmVzdWx0ID09IDB4RkYpCS8qIEZpbGUgTm90IEZvdW5kLCB0cnkgZGlyZWN0b3J5ICovCisJeworCQlvbGRfdHlwZSA9IGNwdV90b19sZTE2KDB4MTYpOworCQlyZXN1bHQgPSBuY3BfUmVuYW1lTlNFbnRyeShzZXJ2ZXIsIG9sZF9kaXIsIG9sZF9uYW1lLCBvbGRfdHlwZSwKKwkJCQkJCSAgIG5ld19kaXIsIG5ld19uYW1lKTsKKwl9CisJaWYgKHJlc3VsdCAhPSAweDkyKSByZXR1cm4gcmVzdWx0OwkvKiBBbGwgZXhjZXB0IE5PX0ZJTEVTX1JFTkFNRUQgKi8KKwlyZXN1bHQgPSBuY3BfZGVsX2ZpbGVfb3Jfc3ViZGlyKHNlcnZlciwgbmV3X2RpciwgbmV3X25hbWUpOworCWlmIChyZXN1bHQgIT0gMCkgcmV0dXJuIC1FQUNDRVM7CisJcmVzdWx0ID0gbmNwX1JlbmFtZU5TRW50cnkoc2VydmVyLCBvbGRfZGlyLCBvbGRfbmFtZSwgb2xkX3R5cGUsCisJCQkJCSAgIG5ld19kaXIsIG5ld19uYW1lKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCQorCisvKiBXZSBoYXZlIHRvIHRyYW5zZmVyIHRvL2Zyb20gdXNlciBzcGFjZSAqLworaW50CituY3BfcmVhZF9rZXJuZWwoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwgY29uc3QgY2hhciAqZmlsZV9pZCwKKwkgICAgIF9fdTMyIG9mZnNldCwgX191MTYgdG9fcmVhZCwgY2hhciAqdGFyZ2V0LCBpbnQgKmJ5dGVzX3JlYWQpCit7CisJY2hhciAqc291cmNlOworCWludCByZXN1bHQ7CisKKwluY3BfaW5pdF9yZXF1ZXN0KHNlcnZlcik7CisJbmNwX2FkZF9ieXRlKHNlcnZlciwgMCk7CisJbmNwX2FkZF9tZW0oc2VydmVyLCBmaWxlX2lkLCA2KTsKKwluY3BfYWRkX2JlMzIoc2VydmVyLCBvZmZzZXQpOworCW5jcF9hZGRfYmUxNihzZXJ2ZXIsIHRvX3JlYWQpOworCisJaWYgKChyZXN1bHQgPSBuY3BfcmVxdWVzdChzZXJ2ZXIsIDcyKSkgIT0gMCkgeworCQlnb3RvIG91dDsKKwl9CisJKmJ5dGVzX3JlYWQgPSBuY3BfcmVwbHlfYmUxNihzZXJ2ZXIsIDApOworCXNvdXJjZSA9IG5jcF9yZXBseV9kYXRhKHNlcnZlciwgMiArIChvZmZzZXQgJiAxKSk7CisKKwltZW1jcHkodGFyZ2V0LCBzb3VyY2UsICpieXRlc19yZWFkKTsKK291dDoKKwluY3BfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIFRoZXJlIGlzIGEgcHJvYmxlbS4uLiBlZ3JlcCBhbmQgc29tZSBvdGhlciBzaWxseSB0b29scyBkbzoKKwl4ID0gbW1hcChOVUxMLCBNQVBfUFJJVkFURSwgUFJPVF9SRUFEfFBST1RfV1JJVEUsIDxuY3BmcyBmZD4sIDMyNzY4KTsKKwlyZWFkKDxuY3BmcyBmZD4sIHgsIDMyNzY4KTsKKyAgIE5vdyBjb3B5aW5nIHJlYWQgcmVzdWx0IGJ5IGNvcHlfdG9fdXNlciBjYXVzZXMgcGFnZWZhdWx0LiBUaGlzIHBhZ2VmYXVsdAorICAgY291bGQgbm90IGJlIGhhbmRsZWQgYmVjYXVzZSBvZiBzZXJ2ZXIgd2FzIGxvY2tlZCBkdWUgdG8gcmVhZC4gU28gd2UgaGF2ZQorICAgdG8gdXNlIHRlbXBvcmFyeSBidWZmZXIuIFNvIG5jcF91bmxvY2tfc2VydmVyIG11c3QgYmUgZG9uZSBiZWZvcmUKKyAgIGNvcHlfdG9fdXNlciAoYW5kIGZvciB3cml0ZSwgY29weV9mcm9tX3VzZXIgbXVzdCBiZSBkb25lIGJlZm9yZSAKKyAgIG5jcF9pbml0X3JlcXVlc3QuLi4gc2FtZSBhcHBsaWVzIGZvciBzZW5kIHJhdyBwYWNrZXQgaW9jdGwpLiBCZWNhdXNlIG9mCisgICBmaWxlIGlzIG5vcm1hbGx5IHJlYWQgaW4gYmlnZ2VyIGNodW5rcywgY2FsbGVyIHByb3ZpZGVzIGttYWxsb2NlZCAKKyAgICh2bWFsbG9jZWQpIGNodW5rIG9mIG1lbW9yeSB3aXRoIHNpemUgPj0gdG9fcmVhZC4uLgorICovCitpbnQKK25jcF9yZWFkX2JvdW5jZShzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBjb25zdCBjaGFyICpmaWxlX2lkLAorCSBfX3UzMiBvZmZzZXQsIF9fdTE2IHRvX3JlYWQsIGNoYXIgX191c2VyICp0YXJnZXQsIGludCAqYnl0ZXNfcmVhZCwKKwkgdm9pZCogYm91bmNlLCBfX3UzMiBidWZzaXplKQoreworCWludCByZXN1bHQ7CisKKwluY3BfaW5pdF9yZXF1ZXN0KHNlcnZlcik7CisJbmNwX2FkZF9ieXRlKHNlcnZlciwgMCk7CisJbmNwX2FkZF9tZW0oc2VydmVyLCBmaWxlX2lkLCA2KTsKKwluY3BfYWRkX2JlMzIoc2VydmVyLCBvZmZzZXQpOworCW5jcF9hZGRfYmUxNihzZXJ2ZXIsIHRvX3JlYWQpOworCXJlc3VsdCA9IG5jcF9yZXF1ZXN0MihzZXJ2ZXIsIDcyLCBib3VuY2UsIGJ1ZnNpemUpOworCW5jcF91bmxvY2tfc2VydmVyKHNlcnZlcik7CisJaWYgKCFyZXN1bHQpIHsKKwkJaW50IGxlbiA9IGJlMTZfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fYmUxNiopKChjaGFyKilib3VuY2UgKyAKKwkJCSAgc2l6ZW9mKHN0cnVjdCBuY3BfcmVwbHlfaGVhZGVyKSkpKTsKKwkJcmVzdWx0ID0gLUVJTzsKKwkJaWYgKGxlbiA8PSB0b19yZWFkKSB7CisJCQljaGFyKiBzb3VyY2U7CisKKwkJCXNvdXJjZSA9IChjaGFyKilib3VuY2UgKyAKKwkJCSAgICAgICAgIHNpemVvZihzdHJ1Y3QgbmNwX3JlcGx5X2hlYWRlcikgKyAyICsgCisJCQkgICAgICAgICAob2Zmc2V0ICYgMSk7CisJCQkqYnl0ZXNfcmVhZCA9IGxlbjsKKwkJCXJlc3VsdCA9IDA7CisJCQlpZiAoY29weV90b191c2VyKHRhcmdldCwgc291cmNlLCBsZW4pKQorCQkJCXJlc3VsdCA9IC1FRkFVTFQ7CisJCX0KKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50CituY3Bfd3JpdGVfa2VybmVsKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIGNvbnN0IGNoYXIgKmZpbGVfaWQsCisJCSBfX3UzMiBvZmZzZXQsIF9fdTE2IHRvX3dyaXRlLAorCQkgY29uc3QgY2hhciAqc291cmNlLCBpbnQgKmJ5dGVzX3dyaXR0ZW4pCit7CisJaW50IHJlc3VsdDsKKworCW5jcF9pbml0X3JlcXVlc3Qoc2VydmVyKTsKKwluY3BfYWRkX2J5dGUoc2VydmVyLCAwKTsKKwluY3BfYWRkX21lbShzZXJ2ZXIsIGZpbGVfaWQsIDYpOworCW5jcF9hZGRfYmUzMihzZXJ2ZXIsIG9mZnNldCk7CisJbmNwX2FkZF9iZTE2KHNlcnZlciwgdG9fd3JpdGUpOworCW5jcF9hZGRfbWVtKHNlcnZlciwgc291cmNlLCB0b193cml0ZSk7CisJCisJaWYgKChyZXN1bHQgPSBuY3BfcmVxdWVzdChzZXJ2ZXIsIDczKSkgPT0gMCkKKwkJKmJ5dGVzX3dyaXR0ZW4gPSB0b193cml0ZTsKKwluY3BfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOworCXJldHVybiByZXN1bHQ7Cit9CisKKyNpZmRlZiBDT05GSUdfTkNQRlNfSU9DVExfTE9DS0lORworaW50CituY3BfTG9nUGh5c2ljYWxSZWNvcmQoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwgY29uc3QgY2hhciAqZmlsZV9pZCwKKwkgIF9fdTggbG9ja3R5cGUsIF9fdTMyIG9mZnNldCwgX191MzIgbGVuZ3RoLCBfX3UxNiB0aW1lb3V0KQoreworCWludCByZXN1bHQ7CisKKwluY3BfaW5pdF9yZXF1ZXN0KHNlcnZlcik7CisJbmNwX2FkZF9ieXRlKHNlcnZlciwgbG9ja3R5cGUpOworCW5jcF9hZGRfbWVtKHNlcnZlciwgZmlsZV9pZCwgNik7CisJbmNwX2FkZF9iZTMyKHNlcnZlciwgb2Zmc2V0KTsKKwluY3BfYWRkX2JlMzIoc2VydmVyLCBsZW5ndGgpOworCW5jcF9hZGRfYmUxNihzZXJ2ZXIsIHRpbWVvdXQpOworCisJaWYgKChyZXN1bHQgPSBuY3BfcmVxdWVzdChzZXJ2ZXIsIDB4MUEpKSAhPSAwKQorCXsKKwkJbmNwX3VubG9ja19zZXJ2ZXIoc2VydmVyKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJbmNwX3VubG9ja19zZXJ2ZXIoc2VydmVyKTsKKwlyZXR1cm4gMDsKK30KKworaW50CituY3BfQ2xlYXJQaHlzaWNhbFJlY29yZChzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBjb25zdCBjaGFyICpmaWxlX2lkLAorCSAgX191MzIgb2Zmc2V0LCBfX3UzMiBsZW5ndGgpCit7CisJaW50IHJlc3VsdDsKKworCW5jcF9pbml0X3JlcXVlc3Qoc2VydmVyKTsKKwluY3BfYWRkX2J5dGUoc2VydmVyLCAwKTsJLyogd2hvIGtub3dzLi4uIGxhbmFseXplciBzYXlzIHRoYXQgKi8KKwluY3BfYWRkX21lbShzZXJ2ZXIsIGZpbGVfaWQsIDYpOworCW5jcF9hZGRfYmUzMihzZXJ2ZXIsIG9mZnNldCk7CisJbmNwX2FkZF9iZTMyKHNlcnZlciwgbGVuZ3RoKTsKKworCWlmICgocmVzdWx0ID0gbmNwX3JlcXVlc3Qoc2VydmVyLCAweDFFKSkgIT0gMCkKKwl7CisJCW5jcF91bmxvY2tfc2VydmVyKHNlcnZlcik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCW5jcF91bmxvY2tfc2VydmVyKHNlcnZlcik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYJLyogQ09ORklHX05DUEZTX0lPQ1RMX0xPQ0tJTkcgKi8KKworI2lmZGVmIENPTkZJR19OQ1BGU19OTFMKKy8qIFRoaXMgYXJlIHRoZSBOTFMgY29udmVyc2lvbiByb3V0aW5lcyB3aXRoIGluc3BpcmF0aW9ucyBhbmQgY29kZSBwYXJ0cworICogZnJvbSB0aGUgdmZhdCBmaWxlIHN5c3RlbSBhbmQgaGludHMgZnJvbSBQZXRyIFZhbmRyb3ZlYy4KKyAqLworCitpbnQKK25jcF9faW8ydm9sKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIHVuc2lnbmVkIGNoYXIgKnZuYW1lLCB1bnNpZ25lZCBpbnQgKnZsZW4sCisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmluYW1lLCB1bnNpZ25lZCBpbnQgaWxlbiwgaW50IGNjKQoreworCXN0cnVjdCBubHNfdGFibGUgKmluID0gc2VydmVyLT5ubHNfaW87CisJc3RydWN0IG5sc190YWJsZSAqb3V0ID0gc2VydmVyLT5ubHNfdm9sOworCXVuc2lnbmVkIGNoYXIgKnZuYW1lX3N0YXJ0OworCXVuc2lnbmVkIGNoYXIgKnZuYW1lX2VuZDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICppbmFtZV9lbmQ7CisKKwlpbmFtZV9lbmQgPSBpbmFtZSArIGlsZW47CisJdm5hbWVfc3RhcnQgPSB2bmFtZTsKKwl2bmFtZV9lbmQgPSB2bmFtZSArICp2bGVuIC0gMTsKKworCXdoaWxlIChpbmFtZSA8IGluYW1lX2VuZCkgeworCQlpbnQgY2hsOworCQl3Y2hhcl90IGVjOworCisJCWlmIChOQ1BfSVNfRkxBRyhzZXJ2ZXIsIE5DUF9GTEFHX1VURjgpKSB7CisJCQlpbnQgazsKKworCQkJayA9IHV0ZjhfbWJ0b3djKCZlYywgaW5hbWUsIGluYW1lX2VuZCAtIGluYW1lKTsKKwkJCWlmIChrIDwgMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWluYW1lICs9IGs7CisJCX0gZWxzZSB7CisJCQlpZiAoKmluYW1lID09IE5DUF9FU0MpIHsKKwkJCQlpbnQgazsKKworCQkJCWlmIChpbmFtZV9lbmQgLSBpbmFtZSA8IDUpCisJCQkJCWdvdG8gbm9zcGVjOworCisJCQkJZWMgPSAwOworCQkJCWZvciAoayA9IDE7IGsgPCA1OyBrKyspIHsKKwkJCQkJdW5zaWduZWQgY2hhciBuYzsKKworCQkJCQluYyA9IGluYW1lW2tdIC0gJzAnOworCQkJCQlpZiAobmMgPj0gMTApIHsKKwkJCQkJCW5jIC09ICdBJyAtICcwJyAtIDEwOworCQkJCQkJaWYgKChuYyA8IDEwKSB8fCAobmMgPiAxNSkpIHsKKwkJCQkJCQlnb3RvIG5vc3BlYzsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQllYyA9IChlYyA8PCA0KSB8IG5jOworCQkJCX0KKwkJCQlpbmFtZSArPSA1OworCQkJfSBlbHNlIHsKK25vc3BlYzo7CQkJCisJCQkJaWYgKCAoY2hsID0gaW4tPmNoYXIydW5pKGluYW1lLCBpbmFtZV9lbmQgLSBpbmFtZSwgJmVjKSkgPCAwKQorCQkJCQlyZXR1cm4gY2hsOworCQkJCWluYW1lICs9IGNobDsKKwkJCX0KKwkJfQorCisJCS8qIHVuaXRvdXBwZXIgc2hvdWxkIGJlIGhlcmUhICovCisKKwkJY2hsID0gb3V0LT51bmkyY2hhcihlYywgdm5hbWUsIHZuYW1lX2VuZCAtIHZuYW1lKTsKKwkJaWYgKGNobCA8IDApCisJCQlyZXR1cm4gY2hsOworCisJCS8qIHRoaXMgaXMgd3JvbmcuLi4gKi8KKwkJaWYgKGNjKSB7CisJCQlpbnQgY2hpOworCisJCQlmb3IgKGNoaSA9IDA7IGNoaSA8IGNobDsgY2hpKyspeworCQkJCXZuYW1lW2NoaV0gPSBuY3BfdG91cHBlcihvdXQsIHZuYW1lW2NoaV0pOworCQkJfQorCQl9CisJCXZuYW1lICs9IGNobDsKKwl9CisKKwkqdm5hbWUgPSAwOworCSp2bGVuID0gdm5hbWUgLSB2bmFtZV9zdGFydDsKKwlyZXR1cm4gMDsKK30KKworaW50CituY3BfX3ZvbDJpbyhzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCB1bnNpZ25lZCBjaGFyICppbmFtZSwgdW5zaWduZWQgaW50ICppbGVuLAorCQljb25zdCB1bnNpZ25lZCBjaGFyICp2bmFtZSwgdW5zaWduZWQgaW50IHZsZW4sIGludCBjYykKK3sKKwlzdHJ1Y3QgbmxzX3RhYmxlICppbiA9IHNlcnZlci0+bmxzX3ZvbDsKKwlzdHJ1Y3QgbmxzX3RhYmxlICpvdXQgPSBzZXJ2ZXItPm5sc19pbzsKKwljb25zdCB1bnNpZ25lZCBjaGFyICp2bmFtZV9lbmQ7CisJdW5zaWduZWQgY2hhciAqaW5hbWVfc3RhcnQ7CisJdW5zaWduZWQgY2hhciAqaW5hbWVfZW5kOworCXVuc2lnbmVkIGNoYXIgKnZuYW1lX2NjOworCWludCBlcnI7CisKKwl2bmFtZV9jYyA9IE5VTEw7CisKKwlpZiAoY2MpIHsKKwkJaW50IGk7CisKKwkJLyogdGhpcyBpcyB3cm9uZyEgKi8KKwkJdm5hbWVfY2MgPSBrbWFsbG9jKHZsZW4sIEdGUF9LRVJORUwpOworCQlpZiAoIXZuYW1lX2NjKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWZvciAoaSA9IDA7IGkgPCB2bGVuOyBpKyspCisJCQl2bmFtZV9jY1tpXSA9IG5jcF90b2xvd2VyKGluLCB2bmFtZVtpXSk7CisJCXZuYW1lID0gdm5hbWVfY2M7CisJfQorCisJaW5hbWVfc3RhcnQgPSBpbmFtZTsKKwlpbmFtZV9lbmQgPSBpbmFtZSArICppbGVuIC0gMTsKKwl2bmFtZV9lbmQgPSB2bmFtZSArIHZsZW47CisKKwl3aGlsZSAodm5hbWUgPCB2bmFtZV9lbmQpIHsKKwkJd2NoYXJfdCBlYzsKKwkJaW50IGNobDsKKworCQlpZiAoIChjaGwgPSBpbi0+Y2hhcjJ1bmkodm5hbWUsIHZuYW1lX2VuZCAtIHZuYW1lLCAmZWMpKSA8IDApIHsKKwkJCWVyciA9IGNobDsKKwkJCWdvdG8gcXVpdDsKKwkJfQorCQl2bmFtZSArPSBjaGw7CisKKwkJLyogdW5pdG9sb3dlciBzaG91bGQgYmUgaGVyZSEgKi8KKworCQlpZiAoTkNQX0lTX0ZMQUcoc2VydmVyLCBOQ1BfRkxBR19VVEY4KSkgeworCQkJaW50IGs7CisKKwkJCWsgPSB1dGY4X3djdG9tYihpbmFtZSwgZWMsIGluYW1lX2VuZCAtIGluYW1lKTsKKwkJCWlmIChrIDwgMCkgeworCQkJCWVyciA9IC1FTkFNRVRPT0xPTkc7CisJCQkJZ290byBxdWl0OworCQkJfQorCQkJaW5hbWUgKz0gazsKKwkJfSBlbHNlIHsKKwkJCWlmICggKGNobCA9IG91dC0+dW5pMmNoYXIoZWMsIGluYW1lLCBpbmFtZV9lbmQgLSBpbmFtZSkpID49IDApIHsKKwkJCQlpbmFtZSArPSBjaGw7CisJCQl9IGVsc2UgeworCQkJCWludCBrOworCisJCQkJaWYgKGluYW1lX2VuZCAtIGluYW1lIDwgNSkgeworCQkJCQllcnIgPSAtRU5BTUVUT09MT05HOworCQkJCQlnb3RvIHF1aXQ7CisJCQkJfQorCQkJCSppbmFtZSA9IE5DUF9FU0M7CisJCQkJZm9yIChrID0gNDsgayA+IDA7IGstLSkgeworCQkJCQl1bnNpZ25lZCBjaGFyIHY7CisJCQkJCQorCQkJCQl2ID0gKGVjICYgMHhGKSArICcwJzsKKwkJCQkJaWYgKHYgPiAnOScpIHsKKwkJCQkJCXYgKz0gJ0EnIC0gJzknIC0gMTsKKwkJCQkJfQorCQkJCQlpbmFtZVtrXSA9IHY7CisJCQkJCWVjID4+PSA0OworCQkJCX0KKwkJCQlpbmFtZSArPSA1OworCQkJfQorCQl9CisJfQorCisJKmluYW1lID0gMDsKKwkqaWxlbiA9IGluYW1lIC0gaW5hbWVfc3RhcnQ7CisJZXJyID0gMDsKK3F1aXQ6OworCWlmIChjYykKKwkJa2ZyZWUodm5hbWVfY2MpOworCXJldHVybiBlcnI7Cit9CisKKyNlbHNlCisKK2ludAorbmNwX19pbzJ2b2wodW5zaWduZWQgY2hhciAqdm5hbWUsIHVuc2lnbmVkIGludCAqdmxlbiwKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqaW5hbWUsIHVuc2lnbmVkIGludCBpbGVuLCBpbnQgY2MpCit7CisJaW50IGk7CisKKwlpZiAoKnZsZW4gPD0gaWxlbikKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwlpZiAoY2MpCisJCWZvciAoaSA9IDA7IGkgPCBpbGVuOyBpKyspIHsKKwkJCSp2bmFtZSA9IHRvdXBwZXIoKmluYW1lKTsKKwkJCXZuYW1lKys7CisJCQlpbmFtZSsrOworCQl9CisJZWxzZSB7CisJCW1lbW1vdmUodm5hbWUsIGluYW1lLCBpbGVuKTsKKwkJdm5hbWUgKz0gaWxlbjsKKwl9CisKKwkqdmxlbiA9IGlsZW47CisJKnZuYW1lID0gMDsKKwlyZXR1cm4gMDsKK30KKworaW50CituY3BfX3ZvbDJpbyh1bnNpZ25lZCBjaGFyICppbmFtZSwgdW5zaWduZWQgaW50ICppbGVuLAorCQljb25zdCB1bnNpZ25lZCBjaGFyICp2bmFtZSwgdW5zaWduZWQgaW50IHZsZW4sIGludCBjYykKK3sKKwlpbnQgaTsKKworCWlmICgqaWxlbiA8PSB2bGVuKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCWlmIChjYykKKwkJZm9yIChpID0gMDsgaSA8IHZsZW47IGkrKykgeworCQkJKmluYW1lID0gdG9sb3dlcigqdm5hbWUpOworCQkJaW5hbWUrKzsKKwkJCXZuYW1lKys7CisJCX0KKwllbHNlIHsKKwkJbWVtbW92ZShpbmFtZSwgdm5hbWUsIHZsZW4pOworCQlpbmFtZSArPSB2bGVuOworCX0KKworCSppbGVuID0gdmxlbjsKKwkqaW5hbWUgPSAwOworCXJldHVybiAwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL25jcGZzL25jcGxpYl9rZXJuZWwuaCBiL2ZzL25jcGZzL25jcGxpYl9rZXJuZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWVjMmU5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbmNwZnMvbmNwbGliX2tlcm5lbC5oCkBAIC0wLDAgKzEsMjU5IEBACisvKgorICogIG5jcGxpYl9rZXJuZWwuaAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgYnkgVm9sa2VyIExlbmRlY2tlCisgKiAgTW9kaWZpZWQgZm9yIGJpZyBlbmRpYW4gYnkgSi5GLiBDaGFkaW1hIGFuZCBEYXZpZCBTLiBNaWxsZXIKKyAqICBNb2RpZmllZCAxOTk3IFBldGVyIFdhbHRlbmJlcmcsIEJpbGwgSGF3ZXMsIERhdmlkIFdvb2Rob3VzZSBmb3IgMi4xIGRjYWNoZQorICogIE1vZGlmaWVkIDE5OTgsIDE5OTkgV29sZnJhbSBQaWVua29zcyBmb3IgTkxTCisgKiAgTW9kaWZpZWQgMTk5OSBXb2xmcmFtIFBpZW5rb3NzIGZvciBkaXJlY3RvcnkgY2FjaGluZworICoKKyAqLworCisjaWZuZGVmIF9OQ1BMSUJfSAorI2RlZmluZSBfTkNQTElCX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKyNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CisKKyNpZmRlZiBDT05GSUdfTkNQRlNfTkxTCisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjZWxzZQorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjZW5kaWYgLyogQ09ORklHX05DUEZTX05MUyAqLworCisjaW5jbHVkZSA8bGludXgvbmNwX2ZzLmg+CisKKyNkZWZpbmUgTkNQX01JTl9TWU1MSU5LX1NJWkUJOAorI2RlZmluZSBOQ1BfTUFYX1NZTUxJTktfU0laRQk1MTIKKworI2RlZmluZSBOQ1BfQkxPQ0tfU0hJRlQJCTkKKyNkZWZpbmUgTkNQX0JMT0NLX1NJWkUJCSgxIDw8IChOQ1BfQkxPQ0tfU0hJRlQpKQorCitpbnQgbmNwX25lZ290aWF0ZV9idWZmZXJzaXplKHN0cnVjdCBuY3Bfc2VydmVyICosIGludCwgaW50ICopOworaW50IG5jcF9uZWdvdGlhdGVfc2l6ZV9hbmRfb3B0aW9ucyhzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBpbnQgc2l6ZSwKKyAgCQkJICBpbnQgb3B0aW9ucywgaW50ICpyZXRfc2l6ZSwgaW50ICpyZXRfb3B0aW9ucyk7CisKK2ludCBuY3BfZ2V0X3ZvbHVtZV9pbmZvX3dpdGhfbnVtYmVyKHN0cnVjdCBuY3Bfc2VydmVyKiBzZXJ2ZXIsIGludCBuLAorCQkJCSAgICBzdHJ1Y3QgbmNwX3ZvbHVtZV9pbmZvICp0YXJnZXQpOworCitpbnQgbmNwX2dldF9kaXJlY3RvcnlfaW5mbyhzdHJ1Y3QgbmNwX3NlcnZlciogc2VydmVyLCBfX3U4IGRpcmhhbmRsZSwKKwkJCSAgIHN0cnVjdCBuY3Bfdm9sdW1lX2luZm8qIHRhcmdldCk7CisKK2ludCBuY3BfY2xvc2VfZmlsZShzdHJ1Y3QgbmNwX3NlcnZlciAqLCBjb25zdCBjaGFyICopOworc3RhdGljIGlubGluZSBpbnQgbmNwX3JlYWRfYm91bmNlX3NpemUoX191MzIgc2l6ZSkgeworCXJldHVybiBzaXplb2Yoc3RydWN0IG5jcF9yZXBseV9oZWFkZXIpICsgMiArIDIgKyBzaXplICsgODsKK307CitpbnQgbmNwX3JlYWRfYm91bmNlKHN0cnVjdCBuY3Bfc2VydmVyICosIGNvbnN0IGNoYXIgKiwgX191MzIsIF9fdTE2LCAKKwkJY2hhciBfX3VzZXIgKiwgaW50ICosIHZvaWQqIGJvdW5jZSwgX191MzIgYm91bmNlbGVuKTsKK2ludCBuY3BfcmVhZF9rZXJuZWwoc3RydWN0IG5jcF9zZXJ2ZXIgKiwgY29uc3QgY2hhciAqLCBfX3UzMiwgX191MTYsIAorCQljaGFyICosIGludCAqKTsKK2ludCBuY3Bfd3JpdGVfa2VybmVsKHN0cnVjdCBuY3Bfc2VydmVyICosIGNvbnN0IGNoYXIgKiwgX191MzIsIF9fdTE2LAorCQljb25zdCBjaGFyICosIGludCAqKTsKKworc3RhdGljIGlubGluZSB2b2lkIG5jcF9pbm9kZV9jbG9zZShzdHJ1Y3QgaW5vZGUgKmlub2RlKSB7CisJYXRvbWljX2RlYygmTkNQX0ZJTkZPKGlub2RlKS0+b3BlbmVkKTsKK30KKwordm9pZCBuY3BfZXh0cmFjdF9maWxlX2luZm8odm9pZCogc3JjLCBzdHJ1Y3QgbndfaW5mb19zdHJ1Y3QqIHRhcmdldCk7CitpbnQgbmNwX29idGFpbl9pbmZvKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBpbm9kZSAqLCBjaGFyICosCisJCXN0cnVjdCBud19pbmZvX3N0cnVjdCAqdGFyZ2V0KTsKK2ludCBuY3Bfb2J0YWluX25mc19pbmZvKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBud19pbmZvX3N0cnVjdCAqdGFyZ2V0KTsKK2ludCBuY3BfZ2V0X3ZvbHVtZV9yb290KHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIGNvbnN0IGNoYXIgKnZvbG5hbWUsCisJCQlfX3UzMiAqdm9sdW1lLCBfX2xlMzIgKmRpcmVudCwgX19sZTMyICpkb3NkaXJlbnQpOworaW50IG5jcF9sb29rdXBfdm9sdW1lKHN0cnVjdCBuY3Bfc2VydmVyICosIGNvbnN0IGNoYXIgKiwgc3RydWN0IG53X2luZm9fc3RydWN0ICopOworaW50IG5jcF9tb2RpZnlfZmlsZV9vcl9zdWJkaXJfZG9zX2luZm8oc3RydWN0IG5jcF9zZXJ2ZXIgKiwgc3RydWN0IGlub2RlICosCisJIF9fbGUzMiwgY29uc3Qgc3RydWN0IG53X21vZGlmeV9kb3NfaW5mbyAqaW5mbyk7CitpbnQgbmNwX21vZGlmeV9maWxlX29yX3N1YmRpcl9kb3NfaW5mb19wYXRoKHN0cnVjdCBuY3Bfc2VydmVyICosIHN0cnVjdCBpbm9kZSAqLAorCSBjb25zdCBjaGFyKiBwYXRoLCBfX2xlMzIsIGNvbnN0IHN0cnVjdCBud19tb2RpZnlfZG9zX2luZm8gKmluZm8pOworaW50IG5jcF9tb2RpZnlfbmZzX2luZm8oc3RydWN0IG5jcF9zZXJ2ZXIgKiwgX191OCB2b2xudW0sIF9fbGUzMiBkaXJlbnQsCisJCQlfX3UzMiBtb2RlLCBfX3UzMiByZGV2KTsKKworaW50IG5jcF9kZWxfZmlsZV9vcl9zdWJkaXIyKHN0cnVjdCBuY3Bfc2VydmVyICosIHN0cnVjdCBkZW50cnkqKTsKK2ludCBuY3BfZGVsX2ZpbGVfb3Jfc3ViZGlyKHN0cnVjdCBuY3Bfc2VydmVyICosIHN0cnVjdCBpbm9kZSAqLCBjaGFyICopOworaW50IG5jcF9vcGVuX2NyZWF0ZV9maWxlX29yX3N1YmRpcihzdHJ1Y3QgbmNwX3NlcnZlciAqLCBzdHJ1Y3QgaW5vZGUgKiwgY2hhciAqLAorCQkJCWludCwgX19sZTMyLCBfX2xlMTYsIHN0cnVjdCBuY3BfZW50cnlfaW5mbyAqKTsKKworaW50IG5jcF9pbml0aWFsaXplX3NlYXJjaChzdHJ1Y3QgbmNwX3NlcnZlciAqLCBzdHJ1Y3QgaW5vZGUgKiwKKwkJICAgICAgc3RydWN0IG53X3NlYXJjaF9zZXF1ZW5jZSAqdGFyZ2V0KTsKK2ludCBuY3Bfc2VhcmNoX2Zvcl9maWxlX29yX3N1YmRpcihzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLAorCQkJICAgICAgc3RydWN0IG53X3NlYXJjaF9zZXF1ZW5jZSAqc2VxLAorCQkJICAgICAgc3RydWN0IG53X2luZm9fc3RydWN0ICp0YXJnZXQpOworaW50IG5jcF9zZWFyY2hfZm9yX2ZpbGVzZXQoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwKKwkJCSAgIHN0cnVjdCBud19zZWFyY2hfc2VxdWVuY2UgKnNlcSwKKwkJCSAgIGludCogbW9yZSwgaW50KiBjbnQsCisJCQkgICBjaGFyKiBidWZmZXIsIHNpemVfdCBidWZzaXplLAorCQkJICAgY2hhcioqIHJidWYsIHNpemVfdCogcnNpemUpOworCitpbnQgbmNwX3Jlbl9vcl9tb3ZfZmlsZV9vcl9zdWJkaXIoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwKKwkJCSAgICAgIHN0cnVjdCBpbm9kZSAqLCBjaGFyICosIHN0cnVjdCBpbm9kZSAqLCBjaGFyICopOworCisKK2ludAorbmNwX0xvZ1BoeXNpY2FsUmVjb3JkKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsCisJCSAgICAgIGNvbnN0IGNoYXIgKmZpbGVfaWQsIF9fdTggbG9ja3R5cGUsCisJCSAgICAgIF9fdTMyIG9mZnNldCwgX191MzIgbGVuZ3RoLCBfX3UxNiB0aW1lb3V0KTsKKworI2lmZGVmIENPTkZJR19OQ1BGU19JT0NUTF9MT0NLSU5HCitpbnQKK25jcF9DbGVhclBoeXNpY2FsUmVjb3JkKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsCisJCQljb25zdCBjaGFyICpmaWxlX2lkLAorCQkJX191MzIgb2Zmc2V0LCBfX3UzMiBsZW5ndGgpOworI2VuZGlmCS8qIENPTkZJR19OQ1BGU19JT0NUTF9MT0NLSU5HICovCisKK2ludAorbmNwX21vdW50X3N1YmRpcihzdHJ1Y3QgbmNwX3NlcnZlciAqLCBfX3U4LCBfX3U4LCBfX2xlMzIsCisJCSBfX3UzMiogdm9sdW1lLCBfX2xlMzIqIGRpcmVudCwgX19sZTMyKiBkb3NkaXJlbnQpOworaW50IG5jcF9kaXJoYW5kbGVfYWxsb2Moc3RydWN0IG5jcF9zZXJ2ZXIgKiwgX191OCB2b2wsIF9fbGUzMiBkaXJlbnQsIF9fdTggKmRpcmhhbmRsZSk7CitpbnQgbmNwX2RpcmhhbmRsZV9mcmVlKHN0cnVjdCBuY3Bfc2VydmVyICosIF9fdTggZGlyaGFuZGxlKTsKKworaW50IG5jcF9jcmVhdGVfbmV3KHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RlLCBkZXZfdCByZGV2LCBfX2xlMzIgYXR0cmlidXRlcyk7CisKK3N0YXRpYyBpbmxpbmUgaW50IG5jcF9pc19uZnNfZXh0cmFzKHN0cnVjdCBuY3Bfc2VydmVyKiBzZXJ2ZXIsIHVuc2lnbmVkIGludCB2b2xudW0pIHsKKyNpZmRlZiBDT05GSUdfTkNQRlNfTkZTX05TCisJcmV0dXJuIChzZXJ2ZXItPm0uZmxhZ3MgJiBOQ1BfTU9VTlRfTkZTX0VYVFJBUykgJiYKKwkgICAgICAgKHNlcnZlci0+bmFtZV9zcGFjZVt2b2xudW1dID09IE5XX05TX05GUyk7CisjZWxzZQorCXJldHVybiAwOworI2VuZGlmCit9CisKKyNpZmRlZiBDT05GSUdfTkNQRlNfTkxTCisKK2ludCBuY3BfX2lvMnZvbChzdHJ1Y3QgbmNwX3NlcnZlciAqLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCAqLAorCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50LCBpbnQpOworaW50IG5jcF9fdm9sMmlvKHN0cnVjdCBuY3Bfc2VydmVyICosIHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50ICosCisJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBpbnQsIGludCk7CisKKyNkZWZpbmUgTkNQX0VTQwkJCSc6JworI2RlZmluZSBOQ1BfSU9fVEFCTEUoZGVudHJ5KQkoTkNQX1NFUlZFUigoZGVudHJ5KS0+ZF9pbm9kZSktPm5sc19pbykKKyNkZWZpbmUgbmNwX3RvbG93ZXIodCwgYykJbmxzX3RvbG93ZXIodCwgYykKKyNkZWZpbmUgbmNwX3RvdXBwZXIodCwgYykJbmxzX3RvdXBwZXIodCwgYykKKyNkZWZpbmUgbmNwX3N0cm5pY21wKHQsIHMxLCBzMiwgbGVuKSBcCisJbmxzX3N0cm5pY21wKHQsIHMxLCBzMiwgbGVuKQorI2RlZmluZSBuY3BfaW8ydm9sKFMsbSxpLG4sayxVKQluY3BfX2lvMnZvbChTLG0saSxuLGssVSkKKyNkZWZpbmUgbmNwX3ZvbDJpbyhTLG0saSxuLGssVSkJbmNwX192b2wyaW8oUyxtLGksbixrLFUpCisKKyNlbHNlCisKK2ludCBuY3BfX2lvMnZvbCh1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkIGludCAqLAorCQkJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50LCBpbnQpOworaW50IG5jcF9fdm9sMmlvKHVuc2lnbmVkIGNoYXIgKiwgdW5zaWduZWQgaW50ICosCisJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBpbnQsIGludCk7CisKKyNkZWZpbmUgTkNQX0lPX1RBQkxFKGRlbnRyeSkJTlVMTAorI2RlZmluZSBuY3BfdG9sb3dlcih0LCBjKQl0b2xvd2VyKGMpCisjZGVmaW5lIG5jcF90b3VwcGVyKHQsIGMpCXRvdXBwZXIoYykKKyNkZWZpbmUgbmNwX2lvMnZvbChTLG0saSxuLGssVSkJbmNwX19pbzJ2b2wobSxpLG4sayxVKQorI2RlZmluZSBuY3Bfdm9sMmlvKFMsbSxpLG4sayxVKQluY3BfX3ZvbDJpbyhtLGksbixrLFUpCisKKworc3RhdGljIGlubGluZSBpbnQgbmNwX3N0cm5pY21wKHN0cnVjdCBubHNfdGFibGUgKnQsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMxLAorCQljb25zdCB1bnNpZ25lZCBjaGFyICpzMiwgaW50IGxlbikKK3sKKwl3aGlsZSAobGVuLS0pIHsKKwkJaWYgKHRvbG93ZXIoKnMxKyspICE9IHRvbG93ZXIoKnMyKyspKQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfTkNQRlNfTkxTICovCisKKyNkZWZpbmUgTkNQX0dFVF9BR0UoZGVudHJ5KQkoamlmZmllcyAtIChkZW50cnkpLT5kX3RpbWUpCisjZGVmaW5lIE5DUF9NQVhfQUdFKHNlcnZlcikJKChzZXJ2ZXIpLT5kZW50cnlfdHRsKQorI2RlZmluZSBOQ1BfVEVTVF9BR0Uoc2VydmVyLGRlbnRyeSkJKE5DUF9HRVRfQUdFKGRlbnRyeSkgPCBOQ1BfTUFYX0FHRShzZXJ2ZXIpKQorCitzdGF0aWMgaW5saW5lIHZvaWQKK25jcF9hZ2VfZGVudHJ5KHN0cnVjdCBuY3Bfc2VydmVyKiBzZXJ2ZXIsIHN0cnVjdCBkZW50cnkqIGRlbnRyeSkKK3sKKwlkZW50cnktPmRfdGltZSA9IGppZmZpZXMgLSBzZXJ2ZXItPmRlbnRyeV90dGw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorbmNwX25ld19kZW50cnkoc3RydWN0IGRlbnRyeSogZGVudHJ5KQoreworCWRlbnRyeS0+ZF90aW1lID0gamlmZmllczsKK30KKworc3RhdGljIGlubGluZSB2b2lkCituY3BfcmVuZXdfZGVudHJpZXMoc3RydWN0IGRlbnRyeSAqcGFyZW50KQoreworCXN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIgPSBOQ1BfU0VSVkVSKHBhcmVudC0+ZF9pbm9kZSk7CisJc3RydWN0IGxpc3RfaGVhZCAqbmV4dDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisKKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwluZXh0ID0gcGFyZW50LT5kX3N1YmRpcnMubmV4dDsKKwl3aGlsZSAobmV4dCAhPSAmcGFyZW50LT5kX3N1YmRpcnMpIHsKKwkJZGVudHJ5ID0gbGlzdF9lbnRyeShuZXh0LCBzdHJ1Y3QgZGVudHJ5LCBkX2NoaWxkKTsKKworCQlpZiAoZGVudHJ5LT5kX2ZzZGF0YSA9PSBOVUxMKQorCQkJbmNwX2FnZV9kZW50cnkoc2VydmVyLCBkZW50cnkpOworCQllbHNlCisJCQluY3BfbmV3X2RlbnRyeShkZW50cnkpOworCisJCW5leHQgPSBuZXh0LT5uZXh0OworCX0KKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK25jcF9pbnZhbGlkYXRlX2RpcmNhY2hlX2VudHJpZXMoc3RydWN0IGRlbnRyeSAqcGFyZW50KQoreworCXN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIgPSBOQ1BfU0VSVkVSKHBhcmVudC0+ZF9pbm9kZSk7CisJc3RydWN0IGxpc3RfaGVhZCAqbmV4dDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisKKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwluZXh0ID0gcGFyZW50LT5kX3N1YmRpcnMubmV4dDsKKwl3aGlsZSAobmV4dCAhPSAmcGFyZW50LT5kX3N1YmRpcnMpIHsKKwkJZGVudHJ5ID0gbGlzdF9lbnRyeShuZXh0LCBzdHJ1Y3QgZGVudHJ5LCBkX2NoaWxkKTsKKwkJZGVudHJ5LT5kX2ZzZGF0YSA9IE5VTEw7CisJCW5jcF9hZ2VfZGVudHJ5KHNlcnZlciwgZGVudHJ5KTsKKwkJbmV4dCA9IG5leHQtPm5leHQ7CisJfQorCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7Cit9CisKK3N0cnVjdCBuY3BfY2FjaGVfaGVhZCB7CisJdGltZV90CQltdGltZTsKKwl1bnNpZ25lZCBsb25nCXRpbWU7CS8qIGNhY2hlIGFnZSAqLworCXVuc2lnbmVkIGxvbmcJZW5kOwkvKiBsYXN0IHZhbGlkIGZwb3MgaW4gY2FjaGUgKi8KKwlpbnQJCWVvZjsKK307CisKKyNkZWZpbmUgTkNQX0RJUkNBQ0hFX1NJWkUJKChpbnQpKFBBR0VfQ0FDSEVfU0laRS9zaXplb2Yoc3RydWN0IGRlbnRyeSAqKSkpCit1bmlvbiBuY3BfZGlyX2NhY2hlIHsKKwlzdHJ1Y3QgbmNwX2NhY2hlX2hlYWQJaGVhZDsKKwlzdHJ1Y3QgZGVudHJ5CQkqZGVudHJ5W05DUF9ESVJDQUNIRV9TSVpFXTsKK307CisKKyNkZWZpbmUgTkNQX0ZJUlNUQ0FDSEVfU0laRQkoKGludCkoKE5DUF9ESVJDQUNIRV9TSVpFICogXAorCXNpemVvZihzdHJ1Y3QgZGVudHJ5ICopIC0gc2l6ZW9mKHN0cnVjdCBuY3BfY2FjaGVfaGVhZCkpIC8gXAorCXNpemVvZihzdHJ1Y3QgZGVudHJ5ICopKSkKKworI2RlZmluZSBOQ1BfRElSQ0FDSEVfU1RBUlQJKE5DUF9ESVJDQUNIRV9TSVpFIC0gTkNQX0ZJUlNUQ0FDSEVfU0laRSkKKworc3RydWN0IG5jcF9jYWNoZV9jb250cm9sIHsKKwlzdHJ1Y3QJbmNwX2NhY2hlX2hlYWQJCWhlYWQ7CisJc3RydWN0CXBhZ2UJCQkqcGFnZTsKKwl1bmlvbgluY3BfZGlyX2NhY2hlCQkqY2FjaGU7CisJdW5zaWduZWQgbG9uZwkJCWZwb3MsIG9mczsKKwlpbnQJCQkJZmlsbGVkLCB2YWxpZCwgaWR4OworfTsKKworI2VuZGlmIC8qIF9OQ1BMSUJfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvbmNwZnMvbmNwc2lnbl9rZXJuZWwuYyBiL2ZzL25jcGZzL25jcHNpZ25fa2VybmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZlYzkwYwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25jcGZzL25jcHNpZ25fa2VybmVsLmMKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiAgbmNwc2lnbl9rZXJuZWwuYworICoKKyAqICBBcm5lIGRlIEJydWlqbiAoYXJuZUBrbm93YXJlLm5sKSwgMTk5NworICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpZmRlZiBDT05GSUdfTkNQRlNfUEFDS0VUX1NJR05JTkcKKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25jcC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgIm5jcHNpZ25fa2VybmVsLmgiCisKKy8qIGkzODY6IDMyLWJpdCwgbGl0dGxlIGVuZGlhbiwgaGFuZGxlcyBtaXMtYWxpZ25tZW50ICovCisjaWZkZWYgX19pMzg2X18KKyNkZWZpbmUgR0VUX0xFMzIocCkgKCooaW50ICopKHApKQorI2RlZmluZSBQVVRfTEUzMihwLHYpIHsgKihpbnQgKikocCk9djsgfQorI2Vsc2UKKy8qIGZyb20gaW5jbHVkZS9uY3BsaWIuaCAqLworI2RlZmluZSBCVkFMKGJ1Zixwb3MpICgoKF9fdTggKikoYnVmKSlbcG9zXSkKKyNkZWZpbmUgUFZBTChidWYscG9zKSAoKHVuc2lnbmVkKUJWQUwoYnVmLHBvcykpCisjZGVmaW5lIEJTRVQoYnVmLHBvcyx2YWwpIChCVkFMKGJ1Zixwb3MpID0gKHZhbCkpCisKK3N0YXRpYyBpbmxpbmUgX191MTYKK1dWQUxfTEgoX191OCAqIGJ1ZiwgaW50IHBvcykKK3sKKwlyZXR1cm4gUFZBTChidWYsIHBvcykgfCBQVkFMKGJ1ZiwgcG9zICsgMSkgPDwgODsKK30KK3N0YXRpYyBpbmxpbmUgX191MzIKK0RWQUxfTEgoX191OCAqIGJ1ZiwgaW50IHBvcykKK3sKKwlyZXR1cm4gV1ZBTF9MSChidWYsIHBvcykgfCBXVkFMX0xIKGJ1ZiwgcG9zICsgMikgPDwgMTY7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQKK1dTRVRfTEgoX191OCAqIGJ1ZiwgaW50IHBvcywgX191MTYgdmFsKQoreworCUJTRVQoYnVmLCBwb3MsIHZhbCAmIDB4ZmYpOworCUJTRVQoYnVmLCBwb3MgKyAxLCB2YWwgPj4gOCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQKK0RTRVRfTEgoX191OCAqIGJ1ZiwgaW50IHBvcywgX191MzIgdmFsKQoreworCVdTRVRfTEgoYnVmLCBwb3MsIHZhbCAmIDB4ZmZmZik7CisJV1NFVF9MSChidWYsIHBvcyArIDIsIHZhbCA+PiAxNik7Cit9CisKKyNkZWZpbmUgR0VUX0xFMzIocCkgRFZBTF9MSChwLDApCisjZGVmaW5lIFBVVF9MRTMyKHAsdikgRFNFVF9MSChwLDAsdikKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBud3NpZ24oY2hhciAqcl9kYXRhMSwgY2hhciAqcl9kYXRhMiwgY2hhciAqb3V0ZGF0YSkgeworIGludCBpOworIHVuc2lnbmVkIGludCB3MCx3MSx3Mix3MzsKKyBzdGF0aWMgaW50IHJiaXRbNF09ezAsIDIsIDEsIDN9OworI2lmZGVmIF9faTM4Nl9fCisgdW5zaWduZWQgaW50ICpkYXRhMj0oaW50ICopcl9kYXRhMjsKKyNlbHNlCisgdW5zaWduZWQgaW50IGRhdGEyWzE2XTsKKyBmb3IgKGk9MDtpPDE2O2krKykKKyAgZGF0YTJbaV09R0VUX0xFMzIocl9kYXRhMisoaTw8MikpOworI2VuZGlmIAorIHcwPUdFVF9MRTMyKHJfZGF0YTEpOworIHcxPUdFVF9MRTMyKHJfZGF0YTErNCk7CisgdzI9R0VUX0xFMzIocl9kYXRhMSs4KTsKKyB3Mz1HRVRfTEUzMihyX2RhdGExKzEyKTsKKyBmb3IgKGk9MDtpPDE2O2krPTQpIHsKKyAgdzA9cm9sMzIodzAgKyAoKHcxICYgdzIpIHwgKCh+dzEpICYgdzMpKSArIGRhdGEyW2krMF0sMyk7CisgIHczPXJvbDMyKHczICsgKCh3MCAmIHcxKSB8ICgofncwKSAmIHcyKSkgKyBkYXRhMltpKzFdLDcpOworICB3Mj1yb2wzMih3MiArICgodzMgJiB3MCkgfCAoKH53MykgJiB3MSkpICsgZGF0YTJbaSsyXSwxMSk7CisgIHcxPXJvbDMyKHcxICsgKCh3MiAmIHczKSB8ICgofncyKSAmIHcwKSkgKyBkYXRhMltpKzNdLDE5KTsKKyB9CisgZm9yIChpPTA7aTw0O2krKykgeworICB3MD1yb2wzMih3MCArICgoKHcyIHwgdzMpICYgdzEpIHwgKHcyICYgdzMpKSArIDB4NWE4Mjc5OTkgKyBkYXRhMltpKzBdLDMpOworICB3Mz1yb2wzMih3MyArICgoKHcxIHwgdzIpICYgdzApIHwgKHcxICYgdzIpKSArIDB4NWE4Mjc5OTkgKyBkYXRhMltpKzRdLDUpOworICB3Mj1yb2wzMih3MiArICgoKHcwIHwgdzEpICYgdzMpIHwgKHcwICYgdzEpKSArIDB4NWE4Mjc5OTkgKyBkYXRhMltpKzhdLDkpOworICB3MT1yb2wzMih3MSArICgoKHczIHwgdzApICYgdzIpIHwgKHczICYgdzApKSArIDB4NWE4Mjc5OTkgKyBkYXRhMltpKzEyXSwxMyk7CisgfQorIGZvciAoaT0wO2k8NDtpKyspIHsKKyAgdzA9cm9sMzIodzAgKyAoKHcxIF4gdzIpIF4gdzMpICsgMHg2ZWQ5ZWJhMSArIGRhdGEyW3JiaXRbaV0rMF0sMyk7CisgIHczPXJvbDMyKHczICsgKCh3MCBeIHcxKSBeIHcyKSArIDB4NmVkOWViYTEgKyBkYXRhMltyYml0W2ldKzhdLDkpOworICB3Mj1yb2wzMih3MiArICgodzMgXiB3MCkgXiB3MSkgKyAweDZlZDllYmExICsgZGF0YTJbcmJpdFtpXSs0XSwxMSk7CisgIHcxPXJvbDMyKHcxICsgKCh3MiBeIHczKSBeIHcwKSArIDB4NmVkOWViYTEgKyBkYXRhMltyYml0W2ldKzEyXSwxNSk7CisgfQorIFBVVF9MRTMyKG91dGRhdGEsKHcwK0dFVF9MRTMyKHJfZGF0YTEpKSAmIDB4ZmZmZmZmZmYpOworIFBVVF9MRTMyKG91dGRhdGErNCwodzErR0VUX0xFMzIocl9kYXRhMSs0KSkgJiAweGZmZmZmZmZmKTsKKyBQVVRfTEUzMihvdXRkYXRhKzgsKHcyK0dFVF9MRTMyKHJfZGF0YTErOCkpICYgMHhmZmZmZmZmZik7CisgUFVUX0xFMzIob3V0ZGF0YSsxMiwodzMrR0VUX0xFMzIocl9kYXRhMSsxMikpICYgMHhmZmZmZmZmZik7Cit9CisKKy8qIE1ha2UgYSBzaWduYXR1cmUgZm9yIHRoZSBjdXJyZW50IHBhY2tldCBhbmQgYWRkIGl0IGF0IHRoZSBlbmQgb2YgdGhlICovCisvKiBwYWNrZXQuICovCit2b2lkIF9fc2lnbl9wYWNrZXQoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwgY29uc3QgY2hhciAqcGFja2V0LCBzaXplX3Qgc2l6ZSwgX191MzIgdG90YWxzaXplLCB2b2lkICpzaWduX2J1ZmYpIHsKKwl1bnNpZ25lZCBjaGFyIGRhdGFbNjRdOworCisJbWVtY3B5KGRhdGEsIHNlcnZlci0+c2lnbl9yb290LCA4KTsKKwkqKF9fdTMyKikoZGF0YSArIDgpID0gdG90YWxzaXplOworCWlmIChzaXplIDwgNTIpIHsKKwkJbWVtY3B5KGRhdGEgKyAxMiwgcGFja2V0LCBzaXplKTsKKwkJbWVtc2V0KGRhdGEgKyAxMiArIHNpemUsIDAsIDUyIC0gc2l6ZSk7CisJfSBlbHNlIHsKKwkJbWVtY3B5KGRhdGEgKyAxMiwgcGFja2V0LCA1Mik7CisJfQorCW53c2lnbihzZXJ2ZXItPnNpZ25fbGFzdCwgZGF0YSwgc2VydmVyLT5zaWduX2xhc3QpOworCW1lbWNweShzaWduX2J1ZmYsIHNlcnZlci0+c2lnbl9sYXN0LCA4KTsKK30KKworaW50IHNpZ25fdmVyaWZ5X3JlcGx5KHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIGNvbnN0IGNoYXIgKnBhY2tldCwgc2l6ZV90IHNpemUsIF9fdTMyIHRvdGFsc2l6ZSwgY29uc3Qgdm9pZCAqc2lnbl9idWZmKSB7CisJdW5zaWduZWQgY2hhciBkYXRhWzY0XTsKKwl1bnNpZ25lZCBjaGFyIGhhc2hbMTZdOworCisJbWVtY3B5KGRhdGEsIHNlcnZlci0+c2lnbl9yb290LCA4KTsKKwkqKF9fdTMyKikoZGF0YSArIDgpID0gdG90YWxzaXplOworCWlmIChzaXplIDwgNTIpIHsKKwkJbWVtY3B5KGRhdGEgKyAxMiwgcGFja2V0LCBzaXplKTsKKwkJbWVtc2V0KGRhdGEgKyAxMiArIHNpemUsIDAsIDUyIC0gc2l6ZSk7CisJfSBlbHNlIHsKKwkJbWVtY3B5KGRhdGEgKyAxMiwgcGFja2V0LCA1Mik7CisJfQorCW53c2lnbihzZXJ2ZXItPnNpZ25fbGFzdCwgZGF0YSwgaGFzaCk7CisJcmV0dXJuIG1lbWNtcChzaWduX2J1ZmYsIGhhc2gsIDgpOworfQorCisjZW5kaWYJLyogQ09ORklHX05DUEZTX1BBQ0tFVF9TSUdOSU5HICovCisKZGlmZiAtLWdpdCBhL2ZzL25jcGZzL25jcHNpZ25fa2VybmVsLmggYi9mcy9uY3Bmcy9uY3BzaWduX2tlcm5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NTFhNjgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uY3Bmcy9uY3BzaWduX2tlcm5lbC5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiAgbmNwc2lnbl9rZXJuZWwuaAorICoKKyAqICBBcm5lIGRlIEJydWlqbiAoYXJuZUBrbm93YXJlLm5sKSwgMTk5NworICoKKyAqLworIAorI2lmbmRlZiBfTkNQU0lHTl9LRVJORUxfSAorI2RlZmluZSBfTkNQU0lHTl9LRVJORUxfSAorCisjaW5jbHVkZSA8bGludXgvbmNwX2ZzLmg+CisKKyNpZmRlZiBDT05GSUdfTkNQRlNfUEFDS0VUX1NJR05JTkcKK3ZvaWQgX19zaWduX3BhY2tldChzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3Qgc2l6ZSwgX191MzIgdG90YWxzaXplLCB2b2lkICpzaWduX2J1ZmYpOworaW50IHNpZ25fdmVyaWZ5X3JlcGx5KHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBzaXplLCBfX3UzMiB0b3RhbHNpemUsIGNvbnN0IHZvaWQgKnNpZ25fYnVmZik7CisjZW5kaWYKKworc3RhdGljIGlubGluZSBzaXplX3Qgc2lnbl9wYWNrZXQoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IHNpemUsIF9fdTMyIHRvdGFsc2l6ZSwgdm9pZCAqc2lnbl9idWZmKSB7CisjaWZkZWYgQ09ORklHX05DUEZTX1BBQ0tFVF9TSUdOSU5HCisJaWYgKHNlcnZlci0+c2lnbl9hY3RpdmUpIHsKKwkJX19zaWduX3BhY2tldChzZXJ2ZXIsIGRhdGEsIHNpemUsIHRvdGFsc2l6ZSwgc2lnbl9idWZmKTsKKwkJcmV0dXJuIDg7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvbmNwZnMvc29jay5jIGIvZnMvbmNwZnMvc29jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1OTNhNWMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uY3Bmcy9zb2NrLmMKQEAgLTAsMCArMSw4NTAgQEAKKy8qCisgKiAgbGludXgvZnMvbmNwZnMvc29jay5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MyAgUmljayBTbGFka2V5CisgKgorICogIE1vZGlmaWVkIDE5OTUsIDE5OTYgYnkgVm9sa2VyIExlbmRlY2tlIHRvIGJlIHVzYWJsZSBmb3IgbmNwCisgKiAgTW9kaWZpZWQgMTk5NyBQZXRlciBXYWx0ZW5iZXJnLCBCaWxsIEhhd2VzLCBEYXZpZCBXb29kaG91c2UgZm9yIDIuMSBkY2FjaGUKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bmV0L3NjbS5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaXB4Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L25jcF9mcy5oPgorCisjaW5jbHVkZSAibmNwc2lnbl9rZXJuZWwuaCIKKworc3RhdGljIGludCBfcmVjdihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCB2b2lkICpidWYsIGludCBzaXplLCB1bnNpZ25lZCBmbGFncykKK3sKKwlzdHJ1Y3QgbXNnaGRyIG1zZyA9IHtOVUxMLCB9OworCXN0cnVjdCBrdmVjIGlvdiA9IHtidWYsIHNpemV9OworCXJldHVybiBrZXJuZWxfcmVjdm1zZyhzb2NrLCAmbXNnLCAmaW92LCAxLCBzaXplLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRvX3NlbmQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IGt2ZWMgKnZlYywgaW50IGNvdW50LAorCQkJICBpbnQgbGVuLCB1bnNpZ25lZCBmbGFncykKK3sKKwlzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsgLm1zZ19mbGFncyA9IGZsYWdzIH07CisJcmV0dXJuIGtlcm5lbF9zZW5kbXNnKHNvY2ssICZtc2csIHZlYywgY291bnQsIGxlbik7Cit9CisKK3N0YXRpYyBpbnQgX3NlbmQoc3RydWN0IHNvY2tldCAqc29jaywgY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qga3ZlYyB2ZWM7CisJdmVjLmlvdl9iYXNlID0gKHZvaWQgKikgYnVmZjsKKwl2ZWMuaW92X2xlbiA9IGxlbjsKKwlyZXR1cm4gZG9fc2VuZChzb2NrLCAmdmVjLCAxLCBsZW4sIDApOworfQorCitzdHJ1Y3QgbmNwX3JlcXVlc3RfcmVwbHkgeworCXN0cnVjdCBsaXN0X2hlYWQgcmVxOworCXdhaXRfcXVldWVfaGVhZF90IHdxOworCXN0cnVjdCBuY3BfcmVwbHlfaGVhZGVyKiByZXBseV9idWY7CisJc2l6ZV90IGRhdGFsZW47CisJaW50IHJlc3VsdDsKKwllbnVtIHsgUlFfRE9ORSwgUlFfSU5QUk9HUkVTUywgUlFfUVVFVUVELCBSUV9JRExFIH0gc3RhdHVzOworCXN0cnVjdCBrdmVjKiB0eF9jaW92OworCXNpemVfdCB0eF90b3RhbGxlbjsKKwlzaXplX3QgdHhfaW92bGVuOworCXN0cnVjdCBrdmVjIHR4X2lvdlszXTsKKwl1X2ludDE2X3QgdHhfdHlwZTsKKwl1X2ludDMyX3Qgc2lnbls2XTsKK307CisKK3ZvaWQgbmNwX3RjcF9kYXRhX3JlYWR5KHN0cnVjdCBzb2NrICpzaywgaW50IGxlbikKK3sKKwlzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyID0gc2stPnNrX3VzZXJfZGF0YTsKKworCXNlcnZlci0+ZGF0YV9yZWFkeShzaywgbGVuKTsKKwlzY2hlZHVsZV93b3JrKCZzZXJ2ZXItPnJjdi50cSk7Cit9CisKK3ZvaWQgbmNwX3RjcF9lcnJvcl9yZXBvcnQoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIgPSBzay0+c2tfdXNlcl9kYXRhOworCQorCXNlcnZlci0+ZXJyb3JfcmVwb3J0KHNrKTsKKwlzY2hlZHVsZV93b3JrKCZzZXJ2ZXItPnJjdi50cSk7Cit9CisKK3ZvaWQgbmNwX3RjcF93cml0ZV9zcGFjZShzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciA9IHNrLT5za191c2VyX2RhdGE7CisJCisJLyogV2UgZG8gbm90IG5lZWQgYW55IGxvY2tpbmc6IHdlIGZpcnN0IHNldCB0eC5jcmVxLCBhbmQgdGhlbiB3ZSBkbyBzZW5kbXNnLAorCSAgIG5vdCB2aWNlIHZlcnNhLi4uICovCisJc2VydmVyLT53cml0ZV9zcGFjZShzayk7CisJaWYgKHNlcnZlci0+dHguY3JlcSkKKwkJc2NoZWR1bGVfd29yaygmc2VydmVyLT50eC50cSk7Cit9CisKK3ZvaWQgbmNwZGdyYW1fdGltZW91dF9jYWxsKHVuc2lnbmVkIGxvbmcgdikKK3sKKwlzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyID0gKHZvaWQqKXY7CisJCisJc2NoZWR1bGVfd29yaygmc2VydmVyLT50aW1lb3V0X3RxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5jcF9maW5pc2hfcmVxdWVzdChzdHJ1Y3QgbmNwX3JlcXVlc3RfcmVwbHkgKnJlcSwgaW50IHJlc3VsdCkKK3sKKwlyZXEtPnJlc3VsdCA9IHJlc3VsdDsKKwlyZXEtPnN0YXR1cyA9IFJRX0RPTkU7CisJd2FrZV91cF9hbGwoJnJlcS0+d3EpOworfQorCitzdGF0aWMgdm9pZCBfX2Fib3J0X25jcF9jb25uZWN0aW9uKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBuY3BfcmVxdWVzdF9yZXBseSAqYWJvcnRlZCwgaW50IGVycikKK3sKKwlzdHJ1Y3QgbmNwX3JlcXVlc3RfcmVwbHkgKnJlcTsKKworCW5jcF9pbnZhbGlkYXRlX2Nvbm4oc2VydmVyKTsKKwlkZWxfdGltZXIoJnNlcnZlci0+dGltZW91dF90bSk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZzZXJ2ZXItPnR4LnJlcXVlc3RzKSkgeworCQlyZXEgPSBsaXN0X2VudHJ5KHNlcnZlci0+dHgucmVxdWVzdHMubmV4dCwgc3RydWN0IG5jcF9yZXF1ZXN0X3JlcGx5LCByZXEpOworCQkKKwkJbGlzdF9kZWxfaW5pdCgmcmVxLT5yZXEpOworCQlpZiAocmVxID09IGFib3J0ZWQpIHsKKwkJCW5jcF9maW5pc2hfcmVxdWVzdChyZXEsIGVycik7CisJCX0gZWxzZSB7CisJCQluY3BfZmluaXNoX3JlcXVlc3QocmVxLCAtRUlPKTsKKwkJfQorCX0KKwlyZXEgPSBzZXJ2ZXItPnJjdi5jcmVxOworCWlmIChyZXEpIHsKKwkJc2VydmVyLT5yY3YuY3JlcSA9IE5VTEw7CisJCWlmIChyZXEgPT0gYWJvcnRlZCkgeworCQkJbmNwX2ZpbmlzaF9yZXF1ZXN0KHJlcSwgZXJyKTsKKwkJfSBlbHNlIHsKKwkJCW5jcF9maW5pc2hfcmVxdWVzdChyZXEsIC1FSU8pOworCQl9CisJCXNlcnZlci0+cmN2LnB0ciA9IE5VTEw7CisJCXNlcnZlci0+cmN2LnN0YXRlID0gMDsKKwl9CisJcmVxID0gc2VydmVyLT50eC5jcmVxOworCWlmIChyZXEpIHsKKwkJc2VydmVyLT50eC5jcmVxID0gTlVMTDsKKwkJaWYgKHJlcSA9PSBhYm9ydGVkKSB7CisJCQluY3BfZmluaXNoX3JlcXVlc3QocmVxLCBlcnIpOworCQl9IGVsc2UgeworCQkJbmNwX2ZpbmlzaF9yZXF1ZXN0KHJlcSwgLUVJTyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdldF9jb25uX251bWJlcihzdHJ1Y3QgbmNwX3JlcGx5X2hlYWRlciAqcnApCit7CisJcmV0dXJuIHJwLT5jb25uX2xvdyB8IChycC0+Y29ubl9oaWdoIDw8IDgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19uY3BfYWJvcnRfcmVxdWVzdChzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmNwX3JlcXVlc3RfcmVwbHkgKnJlcSwgaW50IGVycikKK3sKKwkvKiBJZiByZXEgaXMgZG9uZSwgd2UgZ290IHNpZ25hbCwgYnV0IHdlIGFsc28gcmVjZWl2ZWQgYW5zd2VyLi4uICovCisJc3dpdGNoIChyZXEtPnN0YXR1cykgeworCQljYXNlIFJRX0lETEU6CisJCWNhc2UgUlFfRE9ORToKKwkJCWJyZWFrOworCQljYXNlIFJRX1FVRVVFRDoKKwkJCWxpc3RfZGVsX2luaXQoJnJlcS0+cmVxKTsKKwkJCW5jcF9maW5pc2hfcmVxdWVzdChyZXEsIGVycik7CisJCQlicmVhazsKKwkJY2FzZSBSUV9JTlBST0dSRVNTOgorCQkJX19hYm9ydF9uY3BfY29ubmVjdGlvbihzZXJ2ZXIsIHJlcSwgZXJyKTsKKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIG5jcF9hYm9ydF9yZXF1ZXN0KHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBuY3BfcmVxdWVzdF9yZXBseSAqcmVxLCBpbnQgZXJyKQoreworCWRvd24oJnNlcnZlci0+cmN2LmNyZXFfc2VtKTsKKwlfX25jcF9hYm9ydF9yZXF1ZXN0KHNlcnZlciwgcmVxLCBlcnIpOworCXVwKCZzZXJ2ZXItPnJjdi5jcmVxX3NlbSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX25jcHRjcF9hYm9ydChzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyKQoreworCV9fYWJvcnRfbmNwX2Nvbm5lY3Rpb24oc2VydmVyLCBOVUxMLCAwKTsKK30KKworc3RhdGljIGludCBuY3BkZ3JhbV9zZW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBuY3BfcmVxdWVzdF9yZXBseSAqcmVxKQoreworCXN0cnVjdCBrdmVjIHZlY1szXTsKKwkvKiBzb2NrX3NlbmRtc2cgdXBkYXRlcyBpb3YgcG9pbnRlcnMgZm9yIHVzIDotKCAqLworCW1lbWNweSh2ZWMsIHJlcS0+dHhfY2lvdiwgcmVxLT50eF9pb3ZsZW4gKiBzaXplb2YodmVjWzBdKSk7CisJcmV0dXJuIGRvX3NlbmQoc29jaywgdmVjLCByZXEtPnR4X2lvdmxlbiwKKwkJICAgICAgIHJlcS0+dHhfdG90YWxsZW4sIE1TR19ET05UV0FJVCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fbmNwdGNwX3RyeV9zZW5kKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIpCit7CisJc3RydWN0IG5jcF9yZXF1ZXN0X3JlcGx5ICpycTsKKwlzdHJ1Y3Qga3ZlYyAqaW92OworCXN0cnVjdCBrdmVjIGlvdmNbM107CisJaW50IHJlc3VsdDsKKworCXJxID0gc2VydmVyLT50eC5jcmVxOworCWlmICghcnEpCisJCXJldHVybjsKKworCS8qIHNvY2tfc2VuZG1zZyB1cGRhdGVzIGlvdiBwb2ludGVycyBmb3IgdXMgOi0oICovCisJbWVtY3B5KGlvdmMsIHJxLT50eF9jaW92LCBycS0+dHhfaW92bGVuICogc2l6ZW9mKGlvdlswXSkpOworCXJlc3VsdCA9IGRvX3NlbmQoc2VydmVyLT5uY3Bfc29jaywgaW92YywgcnEtPnR4X2lvdmxlbiwKKwkJCSBycS0+dHhfdG90YWxsZW4sIE1TR19OT1NJR05BTCB8IE1TR19ET05UV0FJVCk7CisKKwlpZiAocmVzdWx0ID09IC1FQUdBSU4pCisJCXJldHVybjsKKworCWlmIChyZXN1bHQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAibmNwZnM6IHRjcDogU2VuZCBmYWlsZWQ6ICVkXG4iLCByZXN1bHQpOworCQlfX25jcF9hYm9ydF9yZXF1ZXN0KHNlcnZlciwgcnEsIHJlc3VsdCk7CisJCXJldHVybjsKKwl9CisJaWYgKHJlc3VsdCA+PSBycS0+dHhfdG90YWxsZW4pIHsKKwkJc2VydmVyLT5yY3YuY3JlcSA9IHJxOworCQlzZXJ2ZXItPnR4LmNyZXEgPSBOVUxMOworCQlyZXR1cm47CisJfQorCXJxLT50eF90b3RhbGxlbiAtPSByZXN1bHQ7CisJaW92ID0gcnEtPnR4X2Npb3Y7CisJd2hpbGUgKGlvdi0+aW92X2xlbiA8PSByZXN1bHQpIHsKKwkJcmVzdWx0IC09IGlvdi0+aW92X2xlbjsKKwkJaW92Kys7CisJCXJxLT50eF9pb3ZsZW4tLTsKKwl9CisJaW92LT5pb3ZfYmFzZSArPSByZXN1bHQ7CisJaW92LT5pb3ZfbGVuIC09IHJlc3VsdDsKKwlycS0+dHhfY2lvdiA9IGlvdjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5jcF9pbml0X2hlYWRlcihzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmNwX3JlcXVlc3RfcmVwbHkgKnJlcSwgc3RydWN0IG5jcF9yZXF1ZXN0X2hlYWRlciAqaCkKK3sKKwlyZXEtPnN0YXR1cyA9IFJRX0lOUFJPR1JFU1M7CisJaC0+Y29ubl9sb3cgPSBzZXJ2ZXItPmNvbm5lY3Rpb247CisJaC0+Y29ubl9oaWdoID0gc2VydmVyLT5jb25uZWN0aW9uID4+IDg7CisJaC0+c2VxdWVuY2UgPSArK3NlcnZlci0+c2VxdWVuY2U7Cit9CisJCitzdGF0aWMgdm9pZCBuY3BkZ3JhbV9zdGFydF9yZXF1ZXN0KHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBuY3BfcmVxdWVzdF9yZXBseSAqcmVxKQoreworCXNpemVfdCBzaWdubGVuOworCXN0cnVjdCBuY3BfcmVxdWVzdF9oZWFkZXIqIGg7CisJCisJcmVxLT50eF9jaW92ID0gcmVxLT50eF9pb3YgKyAxOworCisJaCA9IHJlcS0+dHhfaW92WzFdLmlvdl9iYXNlOworCW5jcF9pbml0X2hlYWRlcihzZXJ2ZXIsIHJlcSwgaCk7CisJc2lnbmxlbiA9IHNpZ25fcGFja2V0KHNlcnZlciwgcmVxLT50eF9pb3ZbMV0uaW92X2Jhc2UgKyBzaXplb2Yoc3RydWN0IG5jcF9yZXF1ZXN0X2hlYWRlcikgLSAxLCAKKwkJCXJlcS0+dHhfaW92WzFdLmlvdl9sZW4gLSBzaXplb2Yoc3RydWN0IG5jcF9yZXF1ZXN0X2hlYWRlcikgKyAxLAorCQkJY3B1X3RvX2xlMzIocmVxLT50eF90b3RhbGxlbiksIHJlcS0+c2lnbik7CisJaWYgKHNpZ25sZW4pIHsKKwkJcmVxLT50eF9jaW92WzFdLmlvdl9iYXNlID0gcmVxLT5zaWduOworCQlyZXEtPnR4X2Npb3ZbMV0uaW92X2xlbiA9IHNpZ25sZW47CisJCXJlcS0+dHhfaW92bGVuICs9IDE7CisJCXJlcS0+dHhfdG90YWxsZW4gKz0gc2lnbmxlbjsKKwl9CisJc2VydmVyLT5yY3YuY3JlcSA9IHJlcTsKKwlzZXJ2ZXItPnRpbWVvdXRfbGFzdCA9IHNlcnZlci0+bS50aW1lX291dDsKKwlzZXJ2ZXItPnRpbWVvdXRfcmV0cmllcyA9IHNlcnZlci0+bS5yZXRyeV9jb3VudDsKKwluY3BkZ3JhbV9zZW5kKHNlcnZlci0+bmNwX3NvY2ssIHJlcSk7CisJbW9kX3RpbWVyKCZzZXJ2ZXItPnRpbWVvdXRfdG0sIGppZmZpZXMgKyBzZXJ2ZXItPm0udGltZV9vdXQpOworfQorCisjZGVmaW5lIE5DUF9UQ1BfWE1JVF9NQUdJQwkoMHg0NDZENjQ1NCkKKyNkZWZpbmUgTkNQX1RDUF9YTUlUX1ZFUlNJT04JKDEpCisjZGVmaW5lIE5DUF9UQ1BfUkNWRF9NQUdJQwkoMHg3NDRFNjM1MCkKKworc3RhdGljIHZvaWQgbmNwdGNwX3N0YXJ0X3JlcXVlc3Qoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwgc3RydWN0IG5jcF9yZXF1ZXN0X3JlcGx5ICpyZXEpCit7CisJc2l6ZV90IHNpZ25sZW47CisJc3RydWN0IG5jcF9yZXF1ZXN0X2hlYWRlciogaDsKKworCXJlcS0+dHhfY2lvdiA9IHJlcS0+dHhfaW92OworCWggPSByZXEtPnR4X2lvdlsxXS5pb3ZfYmFzZTsKKwluY3BfaW5pdF9oZWFkZXIoc2VydmVyLCByZXEsIGgpOworCXNpZ25sZW4gPSBzaWduX3BhY2tldChzZXJ2ZXIsIHJlcS0+dHhfaW92WzFdLmlvdl9iYXNlICsgc2l6ZW9mKHN0cnVjdCBuY3BfcmVxdWVzdF9oZWFkZXIpIC0gMSwKKwkJCXJlcS0+dHhfaW92WzFdLmlvdl9sZW4gLSBzaXplb2Yoc3RydWN0IG5jcF9yZXF1ZXN0X2hlYWRlcikgKyAxLAorCQkJY3B1X3RvX2JlMzIocmVxLT50eF90b3RhbGxlbiArIDI0KSwgcmVxLT5zaWduICsgNCkgKyAxNjsKKworCXJlcS0+c2lnblswXSA9IGh0b25sKE5DUF9UQ1BfWE1JVF9NQUdJQyk7CisJcmVxLT5zaWduWzFdID0gaHRvbmwocmVxLT50eF90b3RhbGxlbiArIHNpZ25sZW4pOworCXJlcS0+c2lnblsyXSA9IGh0b25sKE5DUF9UQ1BfWE1JVF9WRVJTSU9OKTsKKwlyZXEtPnNpZ25bM10gPSBodG9ubChyZXEtPmRhdGFsZW4gKyA4KTsKKwlyZXEtPnR4X2lvdlswXS5pb3ZfYmFzZSA9IHJlcS0+c2lnbjsKKwlyZXEtPnR4X2lvdlswXS5pb3ZfbGVuID0gc2lnbmxlbjsKKwlyZXEtPnR4X2lvdmxlbiArPSAxOworCXJlcS0+dHhfdG90YWxsZW4gKz0gc2lnbmxlbjsKKworCXNlcnZlci0+dHguY3JlcSA9IHJlcTsKKwlfX25jcHRjcF90cnlfc2VuZChzZXJ2ZXIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19uY3Bfc3RhcnRfcmVxdWVzdChzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmNwX3JlcXVlc3RfcmVwbHkgKnJlcSkKK3sKKwlpZiAoc2VydmVyLT5uY3Bfc29jay0+dHlwZSA9PSBTT0NLX1NUUkVBTSkKKwkJbmNwdGNwX3N0YXJ0X3JlcXVlc3Qoc2VydmVyLCByZXEpOworCWVsc2UKKwkJbmNwZGdyYW1fc3RhcnRfcmVxdWVzdChzZXJ2ZXIsIHJlcSk7Cit9CisKK3N0YXRpYyBpbnQgbmNwX2FkZF9yZXF1ZXN0KHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBuY3BfcmVxdWVzdF9yZXBseSAqcmVxKQoreworCWRvd24oJnNlcnZlci0+cmN2LmNyZXFfc2VtKTsKKwlpZiAoIW5jcF9jb25uX3ZhbGlkKHNlcnZlcikpIHsKKwkJdXAoJnNlcnZlci0+cmN2LmNyZXFfc2VtKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJuY3BmczogdGNwOiBTZXJ2ZXIgZGllZFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlpZiAoc2VydmVyLT50eC5jcmVxIHx8IHNlcnZlci0+cmN2LmNyZXEpIHsKKwkJcmVxLT5zdGF0dXMgPSBSUV9RVUVVRUQ7CisJCWxpc3RfYWRkX3RhaWwoJnJlcS0+cmVxLCAmc2VydmVyLT50eC5yZXF1ZXN0cyk7CisJCXVwKCZzZXJ2ZXItPnJjdi5jcmVxX3NlbSk7CisJCXJldHVybiAwOworCX0KKwlfX25jcF9zdGFydF9yZXF1ZXN0KHNlcnZlciwgcmVxKTsKKwl1cCgmc2VydmVyLT5yY3YuY3JlcV9zZW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX25jcF9uZXh0X3JlcXVlc3Qoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlcikKK3sKKwlzdHJ1Y3QgbmNwX3JlcXVlc3RfcmVwbHkgKnJlcTsKKworCXNlcnZlci0+cmN2LmNyZXEgPSBOVUxMOworCWlmIChsaXN0X2VtcHR5KCZzZXJ2ZXItPnR4LnJlcXVlc3RzKSkgeworCQlyZXR1cm47CisJfQorCXJlcSA9IGxpc3RfZW50cnkoc2VydmVyLT50eC5yZXF1ZXN0cy5uZXh0LCBzdHJ1Y3QgbmNwX3JlcXVlc3RfcmVwbHksIHJlcSk7CisJbGlzdF9kZWxfaW5pdCgmcmVxLT5yZXEpOworCV9fbmNwX3N0YXJ0X3JlcXVlc3Qoc2VydmVyLCByZXEpOworfQorCitzdGF0aWMgdm9pZCBpbmZvX3NlcnZlcihzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCB1bnNpZ25lZCBpbnQgaWQsIGNvbnN0IHZvaWQgKiBkYXRhLCBzaXplX3QgbGVuKQoreworCWlmIChzZXJ2ZXItPmluZm9fc29jaykgeworCQlzdHJ1Y3Qga3ZlYyBpb3ZbMl07CisJCV9fYmUzMiBoZHJbMl07CisJCisJCWhkclswXSA9IGNwdV90b19iZTMyKGxlbiArIDgpOworCQloZHJbMV0gPSBjcHVfdG9fYmUzMihpZCk7CisJCisJCWlvdlswXS5pb3ZfYmFzZSA9IGhkcjsKKwkJaW92WzBdLmlvdl9sZW4gPSA4OworCQlpb3ZbMV0uaW92X2Jhc2UgPSAodm9pZCAqKSBkYXRhOworCQlpb3ZbMV0uaW92X2xlbiA9IGxlbjsKKworCQlkb19zZW5kKHNlcnZlci0+aW5mb19zb2NrLCBpb3YsIDIsIGxlbiArIDgsIE1TR19OT1NJR05BTCk7CisJfQorfQorCit2b2lkIG5jcGRncmFtX3Jjdl9wcm9jKHZvaWQgKnMpCit7CisJc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciA9IHM7CisJc3RydWN0IHNvY2tldCogc29jazsKKwkKKwlzb2NrID0gc2VydmVyLT5uY3Bfc29jazsKKwkKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgbmNwX3JlcGx5X2hlYWRlciByZXBseTsKKwkJaW50IHJlc3VsdDsKKworCQlyZXN1bHQgPSBfcmVjdihzb2NrLCAmcmVwbHksIHNpemVvZihyZXBseSksIE1TR19QRUVLIHwgTVNHX0RPTlRXQUlUKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCWJyZWFrOworCQl9CisJCWlmIChyZXN1bHQgPj0gc2l6ZW9mKHJlcGx5KSkgeworCQkJc3RydWN0IG5jcF9yZXF1ZXN0X3JlcGx5ICpyZXE7CisJCisJCQlpZiAocmVwbHkudHlwZSA9PSBOQ1BfV0FUQ0hET0cpIHsKKwkJCQl1bnNpZ25lZCBjaGFyIGJ1ZlsxMF07CisKKwkJCQlpZiAoc2VydmVyLT5jb25uZWN0aW9uICE9IGdldF9jb25uX251bWJlcigmcmVwbHkpKSB7CisJCQkJCWdvdG8gZHJvcDsKKwkJCQl9CisJCQkJcmVzdWx0ID0gX3JlY3Yoc29jaywgYnVmLCBzaXplb2YoYnVmKSwgTVNHX0RPTlRXQUlUKTsKKwkJCQlpZiAocmVzdWx0IDwgMCkgeworCQkJCQlEUFJJTlRLKCJyZWN2IGZhaWxlZCB3aXRoICVkXG4iLCByZXN1bHQpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKHJlc3VsdCA8IDEwKSB7CisJCQkJCURQUklOVEsoInRvbyBzaG9ydCAoJXUpIHdhdGNoZG9nIHBhY2tldFxuIiwgcmVzdWx0KTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWlmIChidWZbOV0gIT0gJz8nKSB7CisJCQkJCURQUklOVEsoImJhZCBzaWduYXR1cmUgKCUwMlgpIGluIHdhdGNoZG9nIHBhY2tldFxuIiwgYnVmWzldKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWJ1Zls5XSA9ICdZJzsKKwkJCQlfc2VuZChzb2NrLCBidWYsIHNpemVvZihidWYpKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChyZXBseS50eXBlICE9IE5DUF9QT1NJVElWRV9BQ0sgJiYgcmVwbHkudHlwZSAhPSBOQ1BfUkVQTFkpIHsKKwkJCQlyZXN1bHQgPSBfcmVjdihzb2NrLCBzZXJ2ZXItPnVuZXhwZWN0ZWRfcGFja2V0LmRhdGEsIHNpemVvZihzZXJ2ZXItPnVuZXhwZWN0ZWRfcGFja2V0LmRhdGEpLCBNU0dfRE9OVFdBSVQpOworCQkJCWlmIChyZXN1bHQgPCAwKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlpbmZvX3NlcnZlcihzZXJ2ZXIsIDAsIHNlcnZlci0+dW5leHBlY3RlZF9wYWNrZXQuZGF0YSwgcmVzdWx0KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWRvd24oJnNlcnZlci0+cmN2LmNyZXFfc2VtKTsJCQorCQkJcmVxID0gc2VydmVyLT5yY3YuY3JlcTsKKwkJCWlmIChyZXEgJiYgKHJlcS0+dHhfdHlwZSA9PSBOQ1BfQUxMT0NfU0xPVF9SRVFVRVNUIHx8IChzZXJ2ZXItPnNlcXVlbmNlID09IHJlcGx5LnNlcXVlbmNlICYmIAorCQkJCQlzZXJ2ZXItPmNvbm5lY3Rpb24gPT0gZ2V0X2Nvbm5fbnVtYmVyKCZyZXBseSkpKSkgeworCQkJCWlmIChyZXBseS50eXBlID09IE5DUF9QT1NJVElWRV9BQ0spIHsKKwkJCQkJc2VydmVyLT50aW1lb3V0X3JldHJpZXMgPSBzZXJ2ZXItPm0ucmV0cnlfY291bnQ7CisJCQkJCXNlcnZlci0+dGltZW91dF9sYXN0ID0gTkNQX01BWF9SUENfVElNRU9VVDsKKwkJCQkJbW9kX3RpbWVyKCZzZXJ2ZXItPnRpbWVvdXRfdG0sIGppZmZpZXMgKyBOQ1BfTUFYX1JQQ19USU1FT1VUKTsKKwkJCQl9IGVsc2UgaWYgKHJlcGx5LnR5cGUgPT0gTkNQX1JFUExZKSB7CisJCQkJCXJlc3VsdCA9IF9yZWN2KHNvY2ssICh2b2lkKilyZXEtPnJlcGx5X2J1ZiwgcmVxLT5kYXRhbGVuLCBNU0dfRE9OVFdBSVQpOworI2lmZGVmIENPTkZJR19OQ1BGU19QQUNLRVRfU0lHTklORworCQkJCQlpZiAocmVzdWx0ID49IDAgJiYgc2VydmVyLT5zaWduX2FjdGl2ZSAmJiByZXEtPnR4X3R5cGUgIT0gTkNQX0RFQUxMT0NfU0xPVF9SRVFVRVNUKSB7CisJCQkJCQlpZiAocmVzdWx0IDwgOCArIDgpIHsKKwkJCQkJCQlyZXN1bHQgPSAtRUlPOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQl1bnNpZ25lZCBpbnQgaGRybDsKKwkJCQkJCQkKKwkJCQkJCQlyZXN1bHQgLT0gODsKKwkJCQkJCQloZHJsID0gc29jay0+c2stPnNrX2ZhbWlseSA9PSBBRl9JTkVUID8gOCA6IDY7CisJCQkJCQkJaWYgKHNpZ25fdmVyaWZ5X3JlcGx5KHNlcnZlciwgKChjaGFyKilyZXEtPnJlcGx5X2J1ZikgKyBoZHJsLCByZXN1bHQgLSBoZHJsLCBjcHVfdG9fbGUzMihyZXN1bHQpLCAoKGNoYXIqKXJlcS0+cmVwbHlfYnVmKSArIHJlc3VsdCkpIHsKKwkJCQkJCQkJcHJpbnRrKEtFUk5fSU5GTyAibmNwZnM6IFNpZ25hdHVyZSB2aW9sYXRpb25cbiIpOworCQkJCQkJCQlyZXN1bHQgPSAtRUlPOworCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfQorI2VuZGlmCisJCQkJCWRlbF90aW1lcigmc2VydmVyLT50aW1lb3V0X3RtKTsKKwkJCQkgICAgIAlzZXJ2ZXItPnJjdi5jcmVxID0gTlVMTDsKKwkJCQkJbmNwX2ZpbmlzaF9yZXF1ZXN0KHJlcSwgcmVzdWx0KTsKKwkJCQkJX19uY3BfbmV4dF9yZXF1ZXN0KHNlcnZlcik7CisJCQkJCXVwKCZzZXJ2ZXItPnJjdi5jcmVxX3NlbSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKwkJCXVwKCZzZXJ2ZXItPnJjdi5jcmVxX3NlbSk7CisJCX0KK2Ryb3A6OwkJCisJCV9yZWN2KHNvY2ssICZyZXBseSwgc2l6ZW9mKHJlcGx5KSwgTVNHX0RPTlRXQUlUKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9fbmNwZGdyYW1fdGltZW91dF9wcm9jKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIpCit7CisJLyogSWYgdGltZXIgaXMgcGVuZGluZywgd2UgYXJlIHByb2Nlc3NpbmcgYW5vdGhlciByZXF1ZXN0Li4uICovCisJaWYgKCF0aW1lcl9wZW5kaW5nKCZzZXJ2ZXItPnRpbWVvdXRfdG0pKSB7CisJCXN0cnVjdCBuY3BfcmVxdWVzdF9yZXBseSogcmVxOworCQkKKwkJcmVxID0gc2VydmVyLT5yY3YuY3JlcTsKKwkJaWYgKHJlcSkgeworCQkJaW50IHRpbWVvdXQ7CisJCQkKKwkJCWlmIChzZXJ2ZXItPm0uZmxhZ3MgJiBOQ1BfTU9VTlRfU09GVCkgeworCQkJCWlmIChzZXJ2ZXItPnRpbWVvdXRfcmV0cmllcy0tID09IDApIHsKKwkJCQkJX19uY3BfYWJvcnRfcmVxdWVzdChzZXJ2ZXIsIHJlcSwgLUVUSU1FRE9VVCk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCQkvKiBJZ25vcmUgZXJyb3JzICovCisJCQluY3BkZ3JhbV9zZW5kKHNlcnZlci0+bmNwX3NvY2ssIHJlcSk7CisJCQl0aW1lb3V0ID0gc2VydmVyLT50aW1lb3V0X2xhc3QgPDwgMTsKKwkJCWlmICh0aW1lb3V0ID4gTkNQX01BWF9SUENfVElNRU9VVCkgeworCQkJCXRpbWVvdXQgPSBOQ1BfTUFYX1JQQ19USU1FT1VUOworCQkJfQorCQkJc2VydmVyLT50aW1lb3V0X2xhc3QgPSB0aW1lb3V0OworCQkJbW9kX3RpbWVyKCZzZXJ2ZXItPnRpbWVvdXRfdG0sIGppZmZpZXMgKyB0aW1lb3V0KTsKKwkJfQorCX0KK30KKwordm9pZCBuY3BkZ3JhbV90aW1lb3V0X3Byb2Modm9pZCAqcykKK3sKKwlzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyID0gczsKKwlkb3duKCZzZXJ2ZXItPnJjdi5jcmVxX3NlbSk7CisJX19uY3BkZ3JhbV90aW1lb3V0X3Byb2Moc2VydmVyKTsKKwl1cCgmc2VydmVyLT5yY3YuY3JlcV9zZW0pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbmNwX2luaXRfcmVxKHN0cnVjdCBuY3BfcmVxdWVzdF9yZXBseSogcmVxKQoreworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnJlcS0+d3EpOworCXJlcS0+c3RhdHVzID0gUlFfSURMRTsKK30KKworc3RhdGljIGludCBkb190Y3BfcmN2KHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbikKK3sKKwlpbnQgcmVzdWx0OworCQorCWlmIChidWZmZXIpIHsKKwkJcmVzdWx0ID0gX3JlY3Yoc2VydmVyLT5uY3Bfc29jaywgYnVmZmVyLCBsZW4sIE1TR19ET05UV0FJVCk7CisJfSBlbHNlIHsKKwkJc3RhdGljIHVuc2lnbmVkIGNoYXIgZHVtbXlbMTAyNF07CisJCQkKKwkJaWYgKGxlbiA+IHNpemVvZihkdW1teSkpIHsKKwkJCWxlbiA9IHNpemVvZihkdW1teSk7CisJCX0KKwkJcmVzdWx0ID0gX3JlY3Yoc2VydmVyLT5uY3Bfc29jaywgZHVtbXksIGxlbiwgTVNHX0RPTlRXQUlUKTsKKwl9CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJaWYgKHJlc3VsdCA+IGxlbikgeworCQlwcmludGsoS0VSTl9FUlIgIm5jcGZzOiB0Y3A6IGJ1ZyBpbiByZWN2bXNnICgldSA+ICVadSlcbiIsIHJlc3VsdCwgbGVuKTsKKwkJcmV0dXJuIC1FSU87CQkJCisJfQorCXJldHVybiByZXN1bHQ7Cit9CQorCitzdGF0aWMgaW50IF9fbmNwdGNwX3Jjdl9wcm9jKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIpCit7CisJLyogV2UgaGF2ZSB0byBjaGVjayB0aGUgcmVzdWx0LCBzbyBzdG9yZSB0aGUgY29tcGxldGUgaGVhZGVyICovCisJd2hpbGUgKDEpIHsKKwkJaW50IHJlc3VsdDsKKwkJc3RydWN0IG5jcF9yZXF1ZXN0X3JlcGx5ICpyZXE7CisJCWludCBkYXRhbGVuOworCQlpbnQgdHlwZTsKKworCQl3aGlsZSAoc2VydmVyLT5yY3YubGVuKSB7CisJCQlyZXN1bHQgPSBkb190Y3BfcmN2KHNlcnZlciwgc2VydmVyLT5yY3YucHRyLCBzZXJ2ZXItPnJjdi5sZW4pOworCQkJaWYgKHJlc3VsdCA9PSAtRUFHQUlOKSB7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlpZiAocmVzdWx0IDw9IDApIHsKKwkJCQlyZXEgPSBzZXJ2ZXItPnJjdi5jcmVxOworCQkJCWlmIChyZXEpIHsKKwkJCQkJX19uY3BfYWJvcnRfcmVxdWVzdChzZXJ2ZXIsIHJlcSwgLUVJTyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJX19uY3B0Y3BfYWJvcnQoc2VydmVyKTsKKwkJCQl9CisJCQkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJuY3BmczogdGNwOiBlcnJvciBpbiByZWN2bXNnOiAlZFxuIiwgcmVzdWx0KTsKKwkJCQl9IGVsc2UgeworCQkJCQlEUFJJTlRLKEtFUk5fRVJSICJuY3BmczogdGNwOiBFT0ZcbiIpOworCQkJCX0KKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJCWlmIChzZXJ2ZXItPnJjdi5wdHIpIHsKKwkJCQlzZXJ2ZXItPnJjdi5wdHIgKz0gcmVzdWx0OworCQkJfQorCQkJc2VydmVyLT5yY3YubGVuIC09IHJlc3VsdDsKKwkJfQorCQlzd2l0Y2ggKHNlcnZlci0+cmN2LnN0YXRlKSB7CisJCQljYXNlIDA6CisJCQkJaWYgKHNlcnZlci0+cmN2LmJ1Zi5tYWdpYyAhPSBodG9ubChOQ1BfVENQX1JDVkRfTUFHSUMpKSB7CisJCQkJCXByaW50ayhLRVJOX0VSUiAibmNwZnM6IHRjcDogVW5leHBlY3RlZCByZXBseSB0eXBlICUwOFhcbiIsIG50b2hsKHNlcnZlci0+cmN2LmJ1Zi5tYWdpYykpOworCQkJCQlfX25jcHRjcF9hYm9ydChzZXJ2ZXIpOworCQkJCQlyZXR1cm4gLUVJTzsKKwkJCQl9CisJCQkJZGF0YWxlbiA9IG50b2hsKHNlcnZlci0+cmN2LmJ1Zi5sZW4pICYgMHgwRkZGRkZGRjsKKwkJCQlpZiAoZGF0YWxlbiA8IDEwKSB7CisJCQkJCXByaW50ayhLRVJOX0VSUiAibmNwZnM6IHRjcDogVW5leHBlY3RlZCByZXBseSBsZW4gJWRcbiIsIGRhdGFsZW4pOworCQkJCQlfX25jcHRjcF9hYm9ydChzZXJ2ZXIpOworCQkJCQlyZXR1cm4gLUVJTzsKKwkJCQl9CisjaWZkZWYgQ09ORklHX05DUEZTX1BBQ0tFVF9TSUdOSU5HCQkJCQorCQkJCWlmIChzZXJ2ZXItPnNpZ25fYWN0aXZlKSB7CisJCQkJCWlmIChkYXRhbGVuIDwgMTgpIHsKKwkJCQkJCXByaW50ayhLRVJOX0VSUiAibmNwZnM6IHRjcDogVW5leHBlY3RlZCByZXBseSBsZW4gJWRcbiIsIGRhdGFsZW4pOworCQkJCQkJX19uY3B0Y3BfYWJvcnQoc2VydmVyKTsKKwkJCQkJCXJldHVybiAtRUlPOworCQkJCQl9CisJCQkJCXNlcnZlci0+cmN2LmJ1Zi5sZW4gPSBkYXRhbGVuIC0gODsKKwkJCQkJc2VydmVyLT5yY3YucHRyID0gKHVuc2lnbmVkIGNoYXIqKSZzZXJ2ZXItPnJjdi5idWYucDE7CisJCQkJCXNlcnZlci0+cmN2LmxlbiA9IDg7CisJCQkJCXNlcnZlci0+cmN2LnN0YXRlID0gNDsKKwkJCQkJYnJlYWs7CisJCQkJfQorI2VuZGlmCQkJCQorCQkJCXR5cGUgPSBudG9ocyhzZXJ2ZXItPnJjdi5idWYudHlwZSk7CisjaWZkZWYgQ09ORklHX05DUEZTX1BBQ0tFVF9TSUdOSU5HCQkJCQorY29udDo7CQkJCQorI2VuZGlmCisJCQkJaWYgKHR5cGUgIT0gTkNQX1JFUExZKSB7CisJCQkJCWlmIChkYXRhbGVuIC0gOCA8PSBzaXplb2Yoc2VydmVyLT51bmV4cGVjdGVkX3BhY2tldC5kYXRhKSkgeworCQkJCQkJKihfX3UxNiopKHNlcnZlci0+dW5leHBlY3RlZF9wYWNrZXQuZGF0YSkgPSBodG9ucyh0eXBlKTsKKwkJCQkJCXNlcnZlci0+dW5leHBlY3RlZF9wYWNrZXQubGVuID0gZGF0YWxlbiAtIDg7CisKKwkJCQkJCXNlcnZlci0+cmN2LnN0YXRlID0gNTsKKwkJCQkJCXNlcnZlci0+cmN2LnB0ciA9IHNlcnZlci0+dW5leHBlY3RlZF9wYWNrZXQuZGF0YSArIDI7CisJCQkJCQlzZXJ2ZXItPnJjdi5sZW4gPSBkYXRhbGVuIC0gMTA7CisJCQkJCQlicmVhazsKKwkJCQkJfQkJCQkJCisJCQkJCURQUklOVEsoIm5jcGZzOiB0Y3A6IFVuZXhwZWN0ZWQgTkNQIHR5cGUgJTAyWFxuIiwgdHlwZSk7Citza2lwZGF0YTI6OworCQkJCQlzZXJ2ZXItPnJjdi5zdGF0ZSA9IDI7Citza2lwZGF0YTo7CisJCQkJCXNlcnZlci0+cmN2LnB0ciA9IE5VTEw7CisJCQkJCXNlcnZlci0+cmN2LmxlbiA9IGRhdGFsZW4gLSAxMDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXJlcSA9IHNlcnZlci0+cmN2LmNyZXE7CisJCQkJaWYgKCFyZXEpIHsKKwkJCQkJRFBSSU5USyhLRVJOX0VSUiAibmNwZnM6IFJlcGx5IHdpdGhvdXQgYXBwcm9wcmlhdGUgcmVxdWVzdFxuIik7CisJCQkJCWdvdG8gc2tpcGRhdGEyOworCQkJCX0KKwkJCQlpZiAoZGF0YWxlbiA+IHJlcS0+ZGF0YWxlbiArIDgpIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJuY3BmczogdGNwOiBVbmV4cGVjdGVkIHJlcGx5IGxlbiAlZCAoZXhwZWN0ZWQgYXQgbW9zdCAlWmQpXG4iLCBkYXRhbGVuLCByZXEtPmRhdGFsZW4gKyA4KTsKKwkJCQkJc2VydmVyLT5yY3Yuc3RhdGUgPSAzOworCQkJCQlnb3RvIHNraXBkYXRhOworCQkJCX0KKwkJCQlyZXEtPmRhdGFsZW4gPSBkYXRhbGVuIC0gODsKKwkJCQlyZXEtPnJlcGx5X2J1Zi0+dHlwZSA9IE5DUF9SRVBMWTsKKwkJCQlzZXJ2ZXItPnJjdi5wdHIgPSAodW5zaWduZWQgY2hhciopKHJlcS0+cmVwbHlfYnVmKSArIDI7CisJCQkJc2VydmVyLT5yY3YubGVuID0gZGF0YWxlbiAtIDEwOworCQkJCXNlcnZlci0+cmN2LnN0YXRlID0gMTsKKwkJCQlicmVhazsKKyNpZmRlZiBDT05GSUdfTkNQRlNfUEFDS0VUX1NJR05JTkcJCQkJCisJCQljYXNlIDQ6CisJCQkJZGF0YWxlbiA9IHNlcnZlci0+cmN2LmJ1Zi5sZW47CisJCQkJdHlwZSA9IG50b2hzKHNlcnZlci0+cmN2LmJ1Zi50eXBlMik7CisJCQkJZ290byBjb250OworI2VuZGlmCisJCQljYXNlIDE6CisJCQkJcmVxID0gc2VydmVyLT5yY3YuY3JlcTsKKwkJCQlpZiAocmVxLT50eF90eXBlICE9IE5DUF9BTExPQ19TTE9UX1JFUVVFU1QpIHsKKwkJCQkJaWYgKHJlcS0+cmVwbHlfYnVmLT5zZXF1ZW5jZSAhPSBzZXJ2ZXItPnNlcXVlbmNlKSB7CisJCQkJCQlwcmludGsoS0VSTl9FUlIgIm5jcGZzOiB0Y3A6IEJhZCBzZXF1ZW5jZSBudW1iZXJcbiIpOworCQkJCQkJX19uY3BfYWJvcnRfcmVxdWVzdChzZXJ2ZXIsIHJlcSwgLUVJTyk7CisJCQkJCQlyZXR1cm4gLUVJTzsKKwkJCQkJfQorCQkJCQlpZiAoKHJlcS0+cmVwbHlfYnVmLT5jb25uX2xvdyB8IChyZXEtPnJlcGx5X2J1Zi0+Y29ubl9oaWdoIDw8IDgpKSAhPSBzZXJ2ZXItPmNvbm5lY3Rpb24pIHsKKwkJCQkJCXByaW50ayhLRVJOX0VSUiAibmNwZnM6IHRjcDogQ29ubmVjdGlvbiBudW1iZXIgbWlzbWF0Y2hcbiIpOworCQkJCQkJX19uY3BfYWJvcnRfcmVxdWVzdChzZXJ2ZXIsIHJlcSwgLUVJTyk7CisJCQkJCQlyZXR1cm4gLUVJTzsKKwkJCQkJfQorCQkJCX0KKyNpZmRlZiBDT05GSUdfTkNQRlNfUEFDS0VUX1NJR05JTkcJCQkJCisJCQkJaWYgKHNlcnZlci0+c2lnbl9hY3RpdmUgJiYgcmVxLT50eF90eXBlICE9IE5DUF9ERUFMTE9DX1NMT1RfUkVRVUVTVCkgeworCQkJCQlpZiAoc2lnbl92ZXJpZnlfcmVwbHkoc2VydmVyLCAodW5zaWduZWQgY2hhciopKHJlcS0+cmVwbHlfYnVmKSArIDYsIHJlcS0+ZGF0YWxlbiAtIDYsIGNwdV90b19iZTMyKHJlcS0+ZGF0YWxlbiArIDE2KSwgJnNlcnZlci0+cmN2LmJ1Zi50eXBlKSkgeworCQkJCQkJcHJpbnRrKEtFUk5fRVJSICJuY3BmczogdGNwOiBTaWduYXR1cmUgdmlvbGF0aW9uXG4iKTsKKwkJCQkJCV9fbmNwX2Fib3J0X3JlcXVlc3Qoc2VydmVyLCByZXEsIC1FSU8pOworCQkJCQkJcmV0dXJuIC1FSU87CisJCQkJCX0KKwkJCQl9CisjZW5kaWYJCQkJCisJCQkJbmNwX2ZpbmlzaF9yZXF1ZXN0KHJlcSwgcmVxLT5kYXRhbGVuKTsKKwkJCW5leHRyZXE6OworCQkJCV9fbmNwX25leHRfcmVxdWVzdChzZXJ2ZXIpOworCQkJY2FzZSAyOgorCQkJbmV4dDo7CisJCQkJc2VydmVyLT5yY3YucHRyID0gKHVuc2lnbmVkIGNoYXIqKSZzZXJ2ZXItPnJjdi5idWY7CisJCQkJc2VydmVyLT5yY3YubGVuID0gMTA7CisJCQkJc2VydmVyLT5yY3Yuc3RhdGUgPSAwOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCW5jcF9maW5pc2hfcmVxdWVzdChzZXJ2ZXItPnJjdi5jcmVxLCAtRUlPKTsKKwkJCQlnb3RvIG5leHRyZXE7CisJCQljYXNlIDU6CisJCQkJaW5mb19zZXJ2ZXIoc2VydmVyLCAwLCBzZXJ2ZXItPnVuZXhwZWN0ZWRfcGFja2V0LmRhdGEsIHNlcnZlci0+dW5leHBlY3RlZF9wYWNrZXQubGVuKTsKKwkJCQlnb3RvIG5leHQ7CisJCX0KKwl9Cit9CisKK3ZvaWQgbmNwX3RjcF9yY3ZfcHJvYyh2b2lkICpzKQoreworCXN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIgPSBzOworCisJZG93bigmc2VydmVyLT5yY3YuY3JlcV9zZW0pOworCV9fbmNwdGNwX3Jjdl9wcm9jKHNlcnZlcik7CisJdXAoJnNlcnZlci0+cmN2LmNyZXFfc2VtKTsKK30KKwordm9pZCBuY3BfdGNwX3R4X3Byb2Modm9pZCAqcykKK3sKKwlzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyID0gczsKKwkKKwlkb3duKCZzZXJ2ZXItPnJjdi5jcmVxX3NlbSk7CisJX19uY3B0Y3BfdHJ5X3NlbmQoc2VydmVyKTsKKwl1cCgmc2VydmVyLT5yY3YuY3JlcV9zZW0pOworfQorCitzdGF0aWMgaW50IGRvX25jcF9ycGNfY2FsbChzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyLCBpbnQgc2l6ZSwKKwkJc3RydWN0IG5jcF9yZXBseV9oZWFkZXIqIHJlcGx5X2J1ZiwgaW50IG1heF9yZXBseV9zaXplKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IG5jcF9yZXF1ZXN0X3JlcGx5IHJlcTsKKworCW5jcF9pbml0X3JlcSgmcmVxKTsKKwlyZXEucmVwbHlfYnVmID0gcmVwbHlfYnVmOworCXJlcS5kYXRhbGVuID0gbWF4X3JlcGx5X3NpemU7CisJcmVxLnR4X2lvdlsxXS5pb3ZfYmFzZSA9IHNlcnZlci0+cGFja2V0OworCXJlcS50eF9pb3ZbMV0uaW92X2xlbiA9IHNpemU7CisJcmVxLnR4X2lvdmxlbiA9IDE7CisJcmVxLnR4X3RvdGFsbGVuID0gc2l6ZTsKKwlyZXEudHhfdHlwZSA9ICoodV9pbnQxNl90KilzZXJ2ZXItPnBhY2tldDsKKworCXJlc3VsdCA9IG5jcF9hZGRfcmVxdWVzdChzZXJ2ZXIsICZyZXEpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCXJldHVybiByZXN1bHQ7CisJfQorCWlmICh3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocmVxLndxLCByZXEuc3RhdHVzID09IFJRX0RPTkUpKSB7CisJCW5jcF9hYm9ydF9yZXF1ZXN0KHNlcnZlciwgJnJlcSwgLUVJTyk7CisJfQorCXJldHVybiByZXEucmVzdWx0OworfQorCisvKgorICogV2UgbmVlZCB0aGUgc2VydmVyIHRvIGJlIGxvY2tlZCBoZXJlLCBzbyBjaGVjayEKKyAqLworCitzdGF0aWMgaW50IG5jcF9kb19yZXF1ZXN0KHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIGludCBzaXplLAorCQl2b2lkKiByZXBseSwgaW50IG1heF9yZXBseV9zaXplKQoreworCWludCByZXN1bHQ7CisKKwlpZiAoc2VydmVyLT5sb2NrID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJuY3BmczogU2VydmVyIG5vdCBsb2NrZWQhXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmICghbmNwX2Nvbm5fdmFsaWQoc2VydmVyKSkgeworCQlwcmludGsoS0VSTl9FUlIgIm5jcGZzOiBDb25uZWN0aW9uIGludmFsaWQhXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXsKKwkJc2lnc2V0X3Qgb2xkX3NldDsKKwkJdW5zaWduZWQgbG9uZyBtYXNrLCBmbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworCQlvbGRfc2V0ID0gY3VycmVudC0+YmxvY2tlZDsKKwkJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfRVhJVElORykKKwkJCW1hc2sgPSAwOworCQllbHNlCisJCQltYXNrID0gc2lnbWFzayhTSUdLSUxMKTsKKwkJaWYgKHNlcnZlci0+bS5mbGFncyAmIE5DUF9NT1VOVF9JTlRSKSB7CisJCQkvKiBGSVhNRTogVGhpcyBkb2Vzbid0IHNlZW0gcmlnaHQgYXQgYWxsLiAgU28sIGxpa2UsCisJCQkgICB3ZSBjYW4ndCBoYW5kbGUgU0lHSU5UIGFuZCBnZXQgd2hhdGV2ZXIgdG8gc3RvcD8KKwkJCSAgIFdoYXQgaWYgd2UndmUgYmxvY2tlZCBpdCBvdXJzZWx2ZXM/ICBXaGF0IGFib3V0CisJCQkgICBhbGFybXM/ICBXaHksIGluIGZhY3QsIGFyZSB3ZSBtdWNraW5nIHdpdGggdGhlCisJCQkgICBzaWdtYXNrIGF0IGFsbD8gLS0gcn4gKi8KKwkJCWlmIChjdXJyZW50LT5zaWdoYW5kLT5hY3Rpb25bU0lHSU5UIC0gMV0uc2Euc2FfaGFuZGxlciA9PSBTSUdfREZMKQorCQkJCW1hc2sgfD0gc2lnbWFzayhTSUdJTlQpOworCQkJaWYgKGN1cnJlbnQtPnNpZ2hhbmQtPmFjdGlvbltTSUdRVUlUIC0gMV0uc2Euc2FfaGFuZGxlciA9PSBTSUdfREZMKQorCQkJCW1hc2sgfD0gc2lnbWFzayhTSUdRVUlUKTsKKwkJfQorCQlzaWdpbml0c2V0aW52KCZjdXJyZW50LT5ibG9ja2VkLCBtYXNrKTsKKwkJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworCQkKKwkJcmVzdWx0ID0gZG9fbmNwX3JwY19jYWxsKHNlcnZlciwgc2l6ZSwgcmVwbHksIG1heF9yZXBseV9zaXplKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworCQljdXJyZW50LT5ibG9ja2VkID0gb2xkX3NldDsKKwkJcmVjYWxjX3NpZ3BlbmRpbmcoKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworCX0KKworCUREUFJJTlRLKCJkb19uY3BfcnBjX2NhbGwgcmV0dXJuZWQgJWRcbiIsIHJlc3VsdCk7CisKKwlpZiAocmVzdWx0IDwgMCkgeworCQkvKiBUaGVyZSB3YXMgYSBwcm9ibGVtIHdpdGggSS9PLCBzbyB0aGUgY29ubmVjdGlvbnMgaXMKKwkJICogbm8gbG9uZ2VyIHVzYWJsZS4gKi8KKwkJbmNwX2ludmFsaWRhdGVfY29ubihzZXJ2ZXIpOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBuY3BfZG9fcmVxdWVzdCBhc3N1cmVzIHRoYXQgYXQgbGVhc3QgYSBjb21wbGV0ZSByZXBseSBoZWFkZXIgaXMKKyAqIHJlY2VpdmVkLiBJdCBhc3N1bWVzIHRoYXQgc2VydmVyLT5jdXJyZW50X3NpemUgY29udGFpbnMgdGhlIG5jcAorICogcmVxdWVzdCBzaXplCisgKi8KK2ludCBuY3BfcmVxdWVzdDIoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlciwgaW50IGZ1bmN0aW9uLCAKKwkJdm9pZCogcnBsLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgbmNwX3JlcXVlc3RfaGVhZGVyICpoOworCXN0cnVjdCBuY3BfcmVwbHlfaGVhZGVyKiByZXBseSA9IHJwbDsKKwlpbnQgcmVzdWx0OworCisJaCA9IChzdHJ1Y3QgbmNwX3JlcXVlc3RfaGVhZGVyICopIChzZXJ2ZXItPnBhY2tldCk7CisJaWYgKHNlcnZlci0+aGFzX3N1YmZ1bmN0aW9uICE9IDApIHsKKwkJKihfX3UxNiAqKSAmIChoLT5kYXRhWzBdKSA9IGh0b25zKHNlcnZlci0+Y3VycmVudF9zaXplIC0gc2l6ZW9mKCpoKSAtIDIpOworCX0KKwloLT50eXBlID0gTkNQX1JFUVVFU1Q7CisJLyoKKwkgKiBUaGUgc2VydmVyIHNob3VsZG4ndCBrbm93IG9yIGNhcmUgd2hhdCB0YXNrIGlzIG1ha2luZyBhCisJICogcmVxdWVzdCwgc28gd2UgYWx3YXlzIHVzZSB0aGUgc2FtZSB0YXNrIG51bWJlci4KKwkgKi8KKwloLT50YXNrID0gMjsgLyogKGN1cnJlbnQtPnBpZCkgJiAweGZmOyAqLworCWgtPmZ1bmN0aW9uID0gZnVuY3Rpb247CisKKwlyZXN1bHQgPSBuY3BfZG9fcmVxdWVzdChzZXJ2ZXIsIHNlcnZlci0+Y3VycmVudF9zaXplLCByZXBseSwgc2l6ZSk7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJRFBSSU5USygibmNwX3JlcXVlc3RfZXJyb3I6ICVkXG4iLCByZXN1bHQpOworCQlnb3RvIG91dDsKKwl9CisJc2VydmVyLT5jb21wbGV0aW9uID0gcmVwbHktPmNvbXBsZXRpb25fY29kZTsKKwlzZXJ2ZXItPmNvbm5fc3RhdHVzID0gcmVwbHktPmNvbm5lY3Rpb25fc3RhdGU7CisJc2VydmVyLT5yZXBseV9zaXplID0gcmVzdWx0OworCXNlcnZlci0+bmNwX3JlcGx5X3NpemUgPSByZXN1bHQgLSBzaXplb2Yoc3RydWN0IG5jcF9yZXBseV9oZWFkZXIpOworCisJcmVzdWx0ID0gcmVwbHktPmNvbXBsZXRpb25fY29kZTsKKworCWlmIChyZXN1bHQgIT0gMCkKKwkJUFBSSU5USygibmNwX3JlcXVlc3Q6IGNvbXBsZXRpb24gY29kZT0leFxuIiwgcmVzdWx0KTsKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgbmNwX2Nvbm5lY3Qoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlcikKK3sKKwlzdHJ1Y3QgbmNwX3JlcXVlc3RfaGVhZGVyICpoOworCWludCByZXN1bHQ7CisKKwlzZXJ2ZXItPmNvbm5lY3Rpb24gPSAweEZGRkY7CisJc2VydmVyLT5zZXF1ZW5jZSA9IDI1NTsKKworCWggPSAoc3RydWN0IG5jcF9yZXF1ZXN0X2hlYWRlciAqKSAoc2VydmVyLT5wYWNrZXQpOworCWgtPnR5cGUgPSBOQ1BfQUxMT0NfU0xPVF9SRVFVRVNUOworCWgtPnRhc2sJCT0gMjsgLyogc2VlIGFib3ZlICovCisJaC0+ZnVuY3Rpb24JPSAwOworCisJcmVzdWx0ID0gbmNwX2RvX3JlcXVlc3Qoc2VydmVyLCBzaXplb2YoKmgpLCBzZXJ2ZXItPnBhY2tldCwgc2VydmVyLT5wYWNrZXRfc2l6ZSk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gb3V0OworCXNlcnZlci0+Y29ubmVjdGlvbiA9IGgtPmNvbm5fbG93ICsgKGgtPmNvbm5faGlnaCAqIDI1Nik7CisJcmVzdWx0ID0gMDsKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQgbmNwX2Rpc2Nvbm5lY3Qoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlcikKK3sKKwlzdHJ1Y3QgbmNwX3JlcXVlc3RfaGVhZGVyICpoOworCisJaCA9IChzdHJ1Y3QgbmNwX3JlcXVlc3RfaGVhZGVyICopIChzZXJ2ZXItPnBhY2tldCk7CisJaC0+dHlwZSA9IE5DUF9ERUFMTE9DX1NMT1RfUkVRVUVTVDsKKwloLT50YXNrCQk9IDI7IC8qIHNlZSBhYm92ZSAqLworCWgtPmZ1bmN0aW9uCT0gMDsKKworCXJldHVybiBuY3BfZG9fcmVxdWVzdChzZXJ2ZXIsIHNpemVvZigqaCksIHNlcnZlci0+cGFja2V0LCBzZXJ2ZXItPnBhY2tldF9zaXplKTsKK30KKwordm9pZCBuY3BfbG9ja19zZXJ2ZXIoc3RydWN0IG5jcF9zZXJ2ZXIgKnNlcnZlcikKK3sKKwlkb3duKCZzZXJ2ZXItPnNlbSk7CisJaWYgKHNlcnZlci0+bG9jaykKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibmNwX2xvY2tfc2VydmVyOiB3YXMgbG9ja2VkIVxuIik7CisJc2VydmVyLT5sb2NrID0gMTsKK30KKwordm9pZCBuY3BfdW5sb2NrX3NlcnZlcihzdHJ1Y3QgbmNwX3NlcnZlciAqc2VydmVyKQoreworCWlmICghc2VydmVyLT5sb2NrKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm5jcF91bmxvY2tfc2VydmVyOiB3YXMgbm90IGxvY2tlZCFcbiIpOworCQlyZXR1cm47CisJfQorCXNlcnZlci0+bG9jayA9IDA7CisJdXAoJnNlcnZlci0+c2VtKTsKK30KZGlmZiAtLWdpdCBhL2ZzL25jcGZzL3N5bWxpbmsuYyBiL2ZzL25jcGZzL3N5bWxpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTM1ZjFiCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmNwZnMvc3ltbGluay5jCkBAIC0wLDAgKzEsMTgzIEBACisvKgorICogIGxpbnV4L2ZzL25jcGZzL3N5bWxpbmsuYworICoKKyAqICBDb2RlIGZvciBhbGxvd2luZyBzeW1ib2xpYyBsaW5rcyBvbiBOQ1BGUyAoaS5lLiBOZXRXYXJlKQorICogIFN5bWJvbGljIGxpbmtzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIG5hdGl2ZSBOZXRXYXJlLCBzbyB3ZSB1c2UgYW4KKyAqICBpbmZyZXF1ZW50bHktdXNlZCBmbGFnIChTaCkgYW5kIHN0b3JlIGEgdHdvLXdvcmQgbWFnaWMgaGVhZGVyIGluCisgKiAgdGhlIGZpbGUgdG8gbWFrZSBzdXJlIHdlIGRvbid0IGFjY2lkZW50YWxseSB1c2UgYSBub24tbGluayBmaWxlCisgKiAgYXMgYSBsaW5rLgorICoKKyAqICBXaGVuIHVzaW5nIHRoZSBORlMgbmFtZXNwYWNlLCB3ZSBzZXQgdGhlIG1vZGUgdG8gaW5kaWNhdGUgYSBzeW1saW5rIGFuZAorICogIGRvbid0IGJvdGhlciB3aXRoIHRoZSBtYWdpYyBudW1iZXJzLgorICoKKyAqICBmcm9tIGxpbnV4L2ZzL2V4dDIvc3ltbGluay5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5OC05OSwgRnJhbmsgQS4gVm9yc3RlbmJvc2NoCisgKgorICogIG5jcGZzIHN5bWxpbmsgaGFuZGxpbmcgY29kZQorICogIE5MUyBzdXBwb3J0IChjKSAxOTk5IFBldHIgVmFuZHJvdmVjCisgKiAgTW9kaWZpZWQgMjAwMCBCZW4gSGFycmlzLCBVbml2ZXJzaXR5IG9mIENhbWJyaWRnZSBmb3IgTkZTIE5TIG1ldGEtaW5mbworICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L25jcF9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlICJuY3BsaWJfa2VybmVsLmgiCisKKworLyogdGhlc2UgbWFnaWMgbnVtYmVycyBtdXN0IGFwcGVhciBpbiB0aGUgc3ltbGluayBmaWxlIC0tIHRoaXMgbWFrZXMgaXQgYSBiaXQKKyAgIG1vcmUgcmVzaWxpZW50IGFnYWluc3QgdGhlIG1hZ2ljIGF0dHJpYnV0ZXMgYmVpbmcgc2V0IG9uIHJhbmRvbSBmaWxlcy4gKi8KKworI2RlZmluZSBOQ1BfU1lNTElOS19NQUdJQzAJY3B1X3RvX2xlMzIoMHg2YzZkNzk3MykgICAgIC8qICJzeW1sbmstPiIgKi8KKyNkZWZpbmUgTkNQX1NZTUxJTktfTUFHSUMxCWNwdV90b19sZTMyKDB4M2UyZDZiNmUpCisKKy8qIC0tLS0tIHJlYWQgYSBzeW1ib2xpYyBsaW5rIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IG5jcF9zeW1saW5rX3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlpbnQgZXJyb3IsIGxlbmd0aCwgbGVuOworCWNoYXIgKmxpbmssICpyYXdsaW5rOworCWNoYXIgKmJ1ZiA9IGttYXAocGFnZSk7CisKKwllcnJvciA9IC1FTk9NRU07CisJcmF3bGluaz0oY2hhciAqKWttYWxsb2MoTkNQX01BWF9TWU1MSU5LX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghcmF3bGluaykKKwkJZ290byBmYWlsOworCisJaWYgKG5jcF9tYWtlX29wZW4oaW5vZGUsT19SRE9OTFkpKQorCQlnb3RvIGZhaWxFSU87CisKKwllcnJvcj1uY3BfcmVhZF9rZXJuZWwoTkNQX1NFUlZFUihpbm9kZSksTkNQX0ZJTkZPKGlub2RlKS0+ZmlsZV9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgMCxOQ1BfTUFYX1NZTUxJTktfU0laRSxyYXdsaW5rLCZsZW5ndGgpOworCisJbmNwX2lub2RlX2Nsb3NlKGlub2RlKTsKKwkvKiBDbG9zZSBmaWxlIGhhbmRsZSBpZiBubyBvdGhlciB1c2Vycy4uLiAqLworCW5jcF9tYWtlX2Nsb3NlZChpbm9kZSk7CisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWxFSU87CisKKwlpZiAoTkNQX0ZJTkZPKGlub2RlKS0+ZmxhZ3MgJiBOQ1BJX0tMVURHRV9TWU1MSU5LKSB7CisJCWlmIChsZW5ndGg8TkNQX01JTl9TWU1MSU5LX1NJWkUgfHwgCisJCSAgICAoKF9fbGUzMiAqKXJhd2xpbmspWzBdIT1OQ1BfU1lNTElOS19NQUdJQzAgfHwKKwkJICAgICgoX19sZTMyICopcmF3bGluaylbMV0hPU5DUF9TWU1MSU5LX01BR0lDMSkKKwkJICAgIAlnb3RvIGZhaWxFSU87CisJCWxpbmsgPSByYXdsaW5rICsgODsKKwkJbGVuZ3RoIC09IDg7CisJfSBlbHNlIHsKKwkJbGluayA9IHJhd2xpbms7CisJfQorCisJbGVuID0gTkNQX01BWF9TWU1MSU5LX1NJWkU7CisJZXJyb3IgPSBuY3Bfdm9sMmlvKE5DUF9TRVJWRVIoaW5vZGUpLCBidWYsICZsZW4sIGxpbmssIGxlbmd0aCwgMCk7CisJa2ZyZWUocmF3bGluayk7CisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWw7CisJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCWt1bm1hcChwYWdlKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXR1cm4gMDsKKworZmFpbEVJTzoKKwllcnJvciA9IC1FSU87CisJa2ZyZWUocmF3bGluayk7CitmYWlsOgorCVNldFBhZ2VFcnJvcihwYWdlKTsKKwlrdW5tYXAocGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogc3ltbGlua3MgY2FuJ3QgZG8gbXVjaC4uLgorICovCitzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIG5jcF9zeW1saW5rX2FvcHMgPSB7CisJLnJlYWRwYWdlCT0gbmNwX3N5bWxpbmtfcmVhZHBhZ2UsCit9OworCQorLyogLS0tLS0gY3JlYXRlIGEgbmV3IHN5bWJvbGljIGxpbmsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAKK2ludCBuY3Bfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpzeW1uYW1lKSB7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwljaGFyICpyYXdsaW5rOworCWludCBsZW5ndGgsIGVyciwgaSwgb3V0bGVuOworCWludCBrbHVkZ2U7CisJaW50IG1vZGU7CisJX19sZTMyIGF0dHI7CisJdW5zaWduZWQgaW50IGhkcjsKKworCURQUklOVEsoIm5jcF9zeW1saW5rKGRpcj0lcCxkZW50cnk9JXAsc3ltbmFtZT0lcylcbiIsZGlyLGRlbnRyeSxzeW1uYW1lKTsKKworCWlmIChuY3BfaXNfbmZzX2V4dHJhcyhOQ1BfU0VSVkVSKGRpciksIE5DUF9GSU5GTyhkaXIpLT52b2xOdW1iZXIpKQorCQlrbHVkZ2UgPSAwOworCWVsc2UKKyNpZmRlZiBDT05GSUdfTkNQRlNfRVhUUkFTCisJaWYgKE5DUF9TRVJWRVIoZGlyKS0+bS5mbGFncyAmIE5DUF9NT1VOVF9TWU1MSU5LUykKKwkJa2x1ZGdlID0gMTsKKwllbHNlCisjZW5kaWYKKwkvKiBFUEVSTSBpcyByZXR1cm5lZCBieSBWRlMgaWYgc3ltbGluayBwcm9jZWR1cmUgZG9lcyBub3QgZXhpc3QgKi8KKwkJcmV0dXJuIC1FUEVSTTsKKyAgCisJcmF3bGluaz0oY2hhciAqKWttYWxsb2MoTkNQX01BWF9TWU1MSU5LX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghcmF3bGluaykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoa2x1ZGdlKSB7CisJCW1vZGUgPSAwOworCQlhdHRyID0gYVNIQVJFRCB8IGFISURERU47CisJCSgoX19sZTMyICopcmF3bGluaylbMF09TkNQX1NZTUxJTktfTUFHSUMwOworCQkoKF9fbGUzMiAqKXJhd2xpbmspWzFdPU5DUF9TWU1MSU5LX01BR0lDMTsKKwkJaGRyID0gODsKKwl9IGVsc2UgeworCQltb2RlID0gU19JRkxOSyB8IFNfSVJXWFVHTzsKKwkJYXR0ciA9IDA7CisJCWhkciA9IDA7CisJfQkJCQorCisJbGVuZ3RoID0gc3RybGVuKHN5bW5hbWUpOworCS8qIG1hcCB0by9mcm9tIHNlcnZlciBjaGFyc2V0LCBkbyBub3QgdG91Y2ggdXBwZXIvbG93ZXIgY2FzZSBhcworCSAgIHN5bWxpbmsgY2FuIHBvaW50IG91dCBvZiBuY3AgZmlsZXN5c3RlbSAqLworCW91dGxlbiA9IE5DUF9NQVhfU1lNTElOS19TSVpFIC0gaGRyOworCWVyciA9IG5jcF9pbzJ2b2woTkNQX1NFUlZFUihkaXIpLCByYXdsaW5rICsgaGRyLCAmb3V0bGVuLCBzeW1uYW1lLCBsZW5ndGgsIDApOworCWlmIChlcnIpCisJCWdvdG8gZmFpbGZyZWU7CisKKwlvdXRsZW4gKz0gaGRyOworCisJZXJyID0gLUVJTzsKKwlpZiAobmNwX2NyZWF0ZV9uZXcoZGlyLGRlbnRyeSxtb2RlLDAsYXR0cikpIHsKKwkJZ290byBmYWlsZnJlZTsKKwl9CisKKwlpbm9kZT1kZW50cnktPmRfaW5vZGU7CisKKwlpZiAobmNwX21ha2Vfb3Blbihpbm9kZSwgT19XUk9OTFkpKQorCQlnb3RvIGZhaWxmcmVlOworCisJaWYgKG5jcF93cml0ZV9rZXJuZWwoTkNQX1NFUlZFUihpbm9kZSksIE5DUF9GSU5GTyhpbm9kZSktPmZpbGVfaGFuZGxlLCAKKwkJCSAgICAgMCwgb3V0bGVuLCByYXdsaW5rLCAmaSkgfHwgaSE9b3V0bGVuKSB7CisJCWdvdG8gZmFpbDsKKwl9CisKKwluY3BfaW5vZGVfY2xvc2UoaW5vZGUpOworCW5jcF9tYWtlX2Nsb3NlZChpbm9kZSk7CisJa2ZyZWUocmF3bGluayk7CisJcmV0dXJuIDA7CitmYWlsOjsKKwluY3BfaW5vZGVfY2xvc2UoaW5vZGUpOworCW5jcF9tYWtlX2Nsb3NlZChpbm9kZSk7CitmYWlsZnJlZTo7CisJa2ZyZWUocmF3bGluayk7CisJcmV0dXJuIGVycjsKK30KKworLyogLS0tLS0gRU9GIC0tLS0tICovCmRpZmYgLS1naXQgYS9mcy9uZnMvTWFrZWZpbGUgYi9mcy9uZnMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRiYWEwMwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25mcy9NYWtlZmlsZQpAQCAtMCwwICsxLDE1IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGludXggbmZzIGZpbGVzeXN0ZW0gcm91dGluZXMuCisjCisKK29iai0kKENPTkZJR19ORlNfRlMpICs9IG5mcy5vCisKK25mcy15IAkJCTo9IGRpci5vIGZpbGUubyBpbm9kZS5vIG5mczJ4ZHIubyBwYWdlbGlzdC5vIFwKKwkJCSAgIHByb2MubyByZWFkLm8gc3ltbGluay5vIHVubGluay5vIHdyaXRlLm8KK25mcy0kKENPTkZJR19ST09UX05GUykJKz0gbmZzcm9vdC5vIG1vdW50X2NsbnQubyAgICAgIAorbmZzLSQoQ09ORklHX05GU19WMykJKz0gbmZzM3Byb2MubyBuZnMzeGRyLm8KK25mcy0kKENPTkZJR19ORlNfVjQpCSs9IG5mczRwcm9jLm8gbmZzNHhkci5vIG5mczRzdGF0ZS5vIG5mczRyZW5ld2QubyBcCisJCQkgICBkZWxlZ2F0aW9uLm8gaWRtYXAubyBcCisJCQkgICBjYWxsYmFjay5vIGNhbGxiYWNrX3hkci5vIGNhbGxiYWNrX3Byb2MubworbmZzLSQoQ09ORklHX05GU19ESVJFQ1RJTykgKz0gZGlyZWN0Lm8KK25mcy1vYmpzCQk6PSAkKG5mcy15KQpkaWZmIC0tZ2l0IGEvZnMvbmZzL2NhbGxiYWNrLmMgYi9mcy9uZnMvY2FsbGJhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjBkNjE3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzL2NhbGxiYWNrLmMKQEAgLTAsMCArMSwxODcgQEAKKy8qCisgKiBsaW51eC9mcy9uZnMvY2FsbGJhY2suYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBUcm9uZCBNeWtsZWJ1c3QKKyAqCisgKiBORlN2NCBjYWxsYmFjayBoYW5kbGluZworICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3Zjc29jay5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgorI2luY2x1ZGUgImNhbGxiYWNrLmgiCisKKyNkZWZpbmUgTkZTREJHX0ZBQ0lMSVRZIE5GU0RCR19DQUxMQkFDSworCitzdHJ1Y3QgbmZzX2NhbGxiYWNrX2RhdGEgeworCXVuc2lnbmVkIGludCB1c2VyczsKKwlzdHJ1Y3Qgc3ZjX3NlcnYgKnNlcnY7CisJcGlkX3QgcGlkOworCXN0cnVjdCBjb21wbGV0aW9uIHN0YXJ0ZWQ7CisJc3RydWN0IGNvbXBsZXRpb24gc3RvcHBlZDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbmZzX2NhbGxiYWNrX2RhdGEgbmZzX2NhbGxiYWNrX2luZm87CitzdGF0aWMgREVDTEFSRV9NVVRFWChuZnNfY2FsbGJhY2tfc2VtYSk7CitzdGF0aWMgc3RydWN0IHN2Y19wcm9ncmFtIG5mczRfY2FsbGJhY2tfcHJvZ3JhbTsKKwordW5zaWduZWQgc2hvcnQgbmZzX2NhbGxiYWNrX3RjcHBvcnQ7CisKKy8qCisgKiBUaGlzIGlzIHRoZSBjYWxsYmFjayBrZXJuZWwgdGhyZWFkLgorICovCitzdGF0aWMgdm9pZCBuZnNfY2FsbGJhY2tfc3ZjKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHApCit7CisJc3RydWN0IHN2Y19zZXJ2ICpzZXJ2ID0gcnFzdHAtPnJxX3NlcnZlcjsKKwlpbnQgZXJyOworCisJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKKwlsb2NrX2tlcm5lbCgpOworCisJbmZzX2NhbGxiYWNrX2luZm8ucGlkID0gY3VycmVudC0+cGlkOworCWRhZW1vbml6ZSgibmZzdjQtc3ZjIik7CisJLyogUHJvY2VzcyByZXF1ZXN0IHdpdGggc2lnbmFscyBibG9ja2VkLCBidXQgYWxsb3cgU0lHS0lMTC4gICovCisJYWxsb3dfc2lnbmFsKFNJR0tJTEwpOworCisJY29tcGxldGUoJm5mc19jYWxsYmFja19pbmZvLnN0YXJ0ZWQpOworCisJd2hpbGUgKG5mc19jYWxsYmFja19pbmZvLnVzZXJzICE9IDAgfHwgIXNpZ25hbGxlZCgpKSB7CisJCS8qCisJCSAqIExpc3RlbiBmb3IgYSByZXF1ZXN0IG9uIHRoZSBzb2NrZXQKKwkJICovCisJCWVyciA9IHN2Y19yZWN2KHNlcnYsIHJxc3RwLCBNQVhfU0NIRURVTEVfVElNRU9VVCk7CisJCWlmIChlcnIgPT0gLUVBR0FJTiB8fCBlcnIgPT0gLUVJTlRSKQorCQkJY29udGludWU7CisJCWlmIChlcnIgPCAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJCSIlczogdGVybWluYXRpbmcgb24gZXJyb3IgJWRcbiIsCisJCQkJCV9fRlVOQ1RJT05fXywgLWVycik7CisJCQlicmVhazsKKwkJfQorCQlkcHJpbnRrKCIlczogcmVxdWVzdCBmcm9tICV1LiV1LiV1LiV1XG4iLCBfX0ZVTkNUSU9OX18sCisJCQkJTklQUVVBRChycXN0cC0+cnFfYWRkci5zaW5fYWRkci5zX2FkZHIpKTsKKwkJc3ZjX3Byb2Nlc3Moc2VydiwgcnFzdHApOworCX0KKworCW5mc19jYWxsYmFja19pbmZvLnBpZCA9IDA7CisJY29tcGxldGUoJm5mc19jYWxsYmFja19pbmZvLnN0b3BwZWQpOworCXVubG9ja19rZXJuZWwoKTsKKwltb2R1bGVfcHV0X2FuZF9leGl0KDApOworfQorCisvKgorICogQnJpbmcgdXAgdGhlIHNlcnZlciBwcm9jZXNzIGlmIGl0IGlzIG5vdCBhbHJlYWR5IHVwLgorICovCitpbnQgbmZzX2NhbGxiYWNrX3VwKHZvaWQpCit7CisJc3RydWN0IHN2Y19zZXJ2ICpzZXJ2OworCXN0cnVjdCBzdmNfc29jayAqc3ZzazsKKwlpbnQgcmV0ID0gMDsKKworCWxvY2tfa2VybmVsKCk7CisJZG93bigmbmZzX2NhbGxiYWNrX3NlbWEpOworCWlmIChuZnNfY2FsbGJhY2tfaW5mby51c2VycysrIHx8IG5mc19jYWxsYmFja19pbmZvLnBpZCAhPSAwKQorCQlnb3RvIG91dDsKKwlpbml0X2NvbXBsZXRpb24oJm5mc19jYWxsYmFja19pbmZvLnN0YXJ0ZWQpOworCWluaXRfY29tcGxldGlvbigmbmZzX2NhbGxiYWNrX2luZm8uc3RvcHBlZCk7CisJc2VydiA9IHN2Y19jcmVhdGUoJm5mczRfY2FsbGJhY2tfcHJvZ3JhbSwgTkZTNF9DQUxMQkFDS19CVUZTSVpFKTsKKwlyZXQgPSAtRU5PTUVNOworCWlmICghc2VydikKKwkJZ290byBvdXRfZXJyOworCS8qIEZJWE1FOiBXZSBkb24ndCB3YW50IHRvIHJlZ2lzdGVyIHRoaXMgc29ja2V0IHdpdGggdGhlIHBvcnRtYXBwZXIgKi8KKwlyZXQgPSBzdmNfbWFrZXNvY2soc2VydiwgSVBQUk9UT19UQ1AsIDApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dF9kZXN0cm95OworCWlmICghbGlzdF9lbXB0eSgmc2Vydi0+c3ZfcGVybXNvY2tzKSkgeworCQlzdnNrID0gbGlzdF9lbnRyeShzZXJ2LT5zdl9wZXJtc29ja3MubmV4dCwKKwkJCQlzdHJ1Y3Qgc3ZjX3NvY2ssIHNrX2xpc3QpOworCQluZnNfY2FsbGJhY2tfdGNwcG9ydCA9IG50b2hzKGluZXRfc2soc3Zzay0+c2tfc2spLT5zcG9ydCk7CisJCWRwcmludGsgKCJDYWxsYmFjayBwb3J0ID0gMHgleFxuIiwgbmZzX2NhbGxiYWNrX3RjcHBvcnQpOworCX0gZWxzZQorCQlCVUcoKTsKKwlyZXQgPSBzdmNfY3JlYXRlX3RocmVhZChuZnNfY2FsbGJhY2tfc3ZjLCBzZXJ2KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXRfZGVzdHJveTsKKwluZnNfY2FsbGJhY2tfaW5mby5zZXJ2ID0gc2VydjsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZuZnNfY2FsbGJhY2tfaW5mby5zdGFydGVkKTsKK291dDoKKwl1cCgmbmZzX2NhbGxiYWNrX3NlbWEpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmV0Oworb3V0X2Rlc3Ryb3k6CisJc3ZjX2Rlc3Ryb3koc2Vydik7CitvdXRfZXJyOgorCW5mc19jYWxsYmFja19pbmZvLnVzZXJzLS07CisJZ290byBvdXQ7Cit9CisKKy8qCisgKiBLaWxsIHRoZSBzZXJ2ZXIgcHJvY2VzcyBpZiBpdCBpcyBub3QgYWxyZWFkeSB1cC4KKyAqLworaW50IG5mc19jYWxsYmFja19kb3duKHZvaWQpCit7CisJaW50IHJldCA9IDA7CisKKwlsb2NrX2tlcm5lbCgpOworCWRvd24oJm5mc19jYWxsYmFja19zZW1hKTsKKwlpZiAoLS1uZnNfY2FsbGJhY2tfaW5mby51c2VycyB8fCBuZnNfY2FsbGJhY2tfaW5mby5waWQgPT0gMCkKKwkJZ290byBvdXQ7CisJa2lsbF9wcm9jKG5mc19jYWxsYmFja19pbmZvLnBpZCwgU0lHS0lMTCwgMSk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmbmZzX2NhbGxiYWNrX2luZm8uc3RvcHBlZCk7CitvdXQ6CisJdXAoJm5mc19jYWxsYmFja19zZW1hKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBuZnNfY2FsbGJhY2tfYXV0aGVudGljYXRlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHApCit7CisJc3RydWN0IGluX2FkZHIgKmFkZHIgPSAmcnFzdHAtPnJxX2FkZHIuc2luX2FkZHI7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHA7CisKKwkvKiBEb24ndCB0YWxrIHRvIHN0cmFuZ2VycyAqLworCWNscCA9IG5mczRfZmluZF9jbGllbnQoYWRkcik7CisJaWYgKGNscCA9PSBOVUxMKQorCQlyZXR1cm4gU1ZDX0RST1A7CisJZHByaW50aygiJXM6ICV1LiV1LiV1LiV1IE5GU3Y0IGNhbGxiYWNrIVxuIiwgX19GVU5DVElPTl9fLCBOSVBRVUFEKGFkZHIpKTsKKwluZnM0X3B1dF9jbGllbnQoY2xwKTsKKwlzd2l0Y2ggKHJxc3RwLT5ycV9hdXRob3AtPmZsYXZvdXIpIHsKKwkJY2FzZSBSUENfQVVUSF9OVUxMOgorCQkJaWYgKHJxc3RwLT5ycV9wcm9jICE9IENCX05VTEwpCisJCQkJcmV0dXJuIFNWQ19ERU5JRUQ7CisJCQlicmVhazsKKwkJY2FzZSBSUENfQVVUSF9VTklYOgorCQkJYnJlYWs7CisJCWNhc2UgUlBDX0FVVEhfR1NTOgorCQkJLyogRklYTUU6IFJQQ1NFQ19HU1MgaGFuZGxpbmc/ICovCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gU1ZDX0RFTklFRDsKKwl9CisJcmV0dXJuIFNWQ19PSzsKK30KKworLyoKKyAqIERlZmluZSBORlM0IGNhbGxiYWNrIHByb2dyYW0KKyAqLworZXh0ZXJuIHN0cnVjdCBzdmNfdmVyc2lvbiBuZnM0X2NhbGxiYWNrX3ZlcnNpb24xOworCitzdGF0aWMgc3RydWN0IHN2Y192ZXJzaW9uICpuZnM0X2NhbGxiYWNrX3ZlcnNpb25bXSA9IHsKKwlbMV0gPSAmbmZzNF9jYWxsYmFja192ZXJzaW9uMSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3ZjX3N0YXQgbmZzNF9jYWxsYmFja19zdGF0czsKKworc3RhdGljIHN0cnVjdCBzdmNfcHJvZ3JhbSBuZnM0X2NhbGxiYWNrX3Byb2dyYW0gPSB7CisJLnBnX3Byb2cgPSBORlM0X0NBTExCQUNLLAkJCS8qIFJQQyBzZXJ2aWNlIG51bWJlciAqLworCS5wZ19udmVycyA9IEFSUkFZX1NJWkUobmZzNF9jYWxsYmFja192ZXJzaW9uKSwJLyogTnVtYmVyIG9mIGVudHJpZXMgKi8KKwkucGdfdmVycyA9IG5mczRfY2FsbGJhY2tfdmVyc2lvbiwJCS8qIHZlcnNpb24gdGFibGUgKi8KKwkucGdfbmFtZSA9ICJORlN2NCBjYWxsYmFjayIsCQkJLyogc2VydmljZSBuYW1lICovCisJLnBnX2NsYXNzID0gIm5mcyIsCQkJCS8qIGF1dGhlbnRpY2F0aW9uIGNsYXNzICovCisJLnBnX3N0YXRzID0gJm5mczRfY2FsbGJhY2tfc3RhdHMsCisJLnBnX2F1dGhlbnRpY2F0ZSA9IG5mc19jYWxsYmFja19hdXRoZW50aWNhdGUsCit9OwpkaWZmIC0tZ2l0IGEvZnMvbmZzL2NhbGxiYWNrLmggYi9mcy9uZnMvY2FsbGJhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGRiMmQ0ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnMvY2FsbGJhY2suaApAQCAtMCwwICsxLDcwIEBACisvKgorICogbGludXgvZnMvbmZzL2NhbGxiYWNrLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgVHJvbmQgTXlrbGVidXN0CisgKgorICogTkZTdjQgY2FsbGJhY2sgZGVmaW5pdGlvbnMKKyAqLworI2lmbmRlZiBfX0xJTlVYX0ZTX05GU19DQUxMQkFDS19ICisjZGVmaW5lIF9fTElOVVhfRlNfTkZTX0NBTExCQUNLX0gKKworI2RlZmluZSBORlM0X0NBTExCQUNLIDB4NDAwMDAwMDAKKyNkZWZpbmUgTkZTNF9DQUxMQkFDS19YRFJTSVpFIDIwNDgKKyNkZWZpbmUgTkZTNF9DQUxMQkFDS19CVUZTSVpFICgxMDI0ICsgTkZTNF9DQUxMQkFDS19YRFJTSVpFKQorCitlbnVtIG5mczRfY2FsbGJhY2tfcHJvY251bSB7CisJQ0JfTlVMTCA9IDAsCisJQ0JfQ09NUE9VTkQgPSAxLAorfTsKKworZW51bSBuZnM0X2NhbGxiYWNrX29wbnVtIHsKKwlPUF9DQl9HRVRBVFRSID0gMywKKwlPUF9DQl9SRUNBTEwgID0gNCwKKwlPUF9DQl9JTExFR0FMID0gMTAwNDQsCit9OworCitzdHJ1Y3QgY2JfY29tcG91bmRfaGRyX2FyZyB7CisJaW50IHRhZ2xlbjsKKwljb25zdCBjaGFyICp0YWc7CisJdW5zaWduZWQgaW50IGNhbGxiYWNrX2lkZW50OworCXVuc2lnbmVkIG5vcHM7Cit9OworCitzdHJ1Y3QgY2JfY29tcG91bmRfaGRyX3JlcyB7CisJdWludDMyX3QgKnN0YXR1czsKKwlpbnQgdGFnbGVuOworCWNvbnN0IGNoYXIgKnRhZzsKKwl1aW50MzJfdCAqbm9wczsKK307CisKK3N0cnVjdCBjYl9nZXRhdHRyYXJncyB7CisJc3RydWN0IHNvY2thZGRyX2luICphZGRyOworCXN0cnVjdCBuZnNfZmggZmg7CisJdWludDMyX3QgYml0bWFwWzJdOworfTsKKworc3RydWN0IGNiX2dldGF0dHJyZXMgeworCXVpbnQzMl90IHN0YXR1czsKKwl1aW50MzJfdCBiaXRtYXBbMl07CisJdWludDY0X3Qgc2l6ZTsKKwl1aW50NjRfdCBjaGFuZ2VfYXR0cjsKKwlzdHJ1Y3QgdGltZXNwZWMgY3RpbWU7CisJc3RydWN0IHRpbWVzcGVjIG10aW1lOworfTsKKworc3RydWN0IGNiX3JlY2FsbGFyZ3MgeworCXN0cnVjdCBzb2NrYWRkcl9pbiAqYWRkcjsKKwlzdHJ1Y3QgbmZzX2ZoIGZoOworCW5mczRfc3RhdGVpZCBzdGF0ZWlkOworCXVpbnQzMl90IHRydW5jYXRlOworfTsKKworZXh0ZXJuIHVuc2lnbmVkIG5mczRfY2FsbGJhY2tfZ2V0YXR0cihzdHJ1Y3QgY2JfZ2V0YXR0cmFyZ3MgKmFyZ3MsIHN0cnVjdCBjYl9nZXRhdHRycmVzICpyZXMpOworZXh0ZXJuIHVuc2lnbmVkIG5mczRfY2FsbGJhY2tfcmVjYWxsKHN0cnVjdCBjYl9yZWNhbGxhcmdzICphcmdzLCB2b2lkICpkdW1teSk7CisKK2V4dGVybiBpbnQgbmZzX2NhbGxiYWNrX3VwKHZvaWQpOworZXh0ZXJuIGludCBuZnNfY2FsbGJhY2tfZG93bih2b2lkKTsKKworZXh0ZXJuIHVuc2lnbmVkIHNob3J0IG5mc19jYWxsYmFja190Y3Bwb3J0OworCisjZW5kaWYgLyogX19MSU5VWF9GU19ORlNfQ0FMTEJBQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvbmZzL2NhbGxiYWNrX3Byb2MuYyBiL2ZzL25mcy9jYWxsYmFja19wcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNlMjdlNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25mcy9jYWxsYmFja19wcm9jLmMKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIGxpbnV4L2ZzL25mcy9jYWxsYmFja19wcm9jLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgVHJvbmQgTXlrbGVidXN0CisgKgorICogTkZTdjQgY2FsbGJhY2sgcHJvY2VkdXJlcworICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbmZzNC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgorI2luY2x1ZGUgImNhbGxiYWNrLmgiCisjaW5jbHVkZSAiZGVsZWdhdGlvbi5oIgorCisjZGVmaW5lIE5GU0RCR19GQUNJTElUWSBORlNEQkdfQ0FMTEJBQ0sKKyAKK3Vuc2lnbmVkIG5mczRfY2FsbGJhY2tfZ2V0YXR0cihzdHJ1Y3QgY2JfZ2V0YXR0cmFyZ3MgKmFyZ3MsIHN0cnVjdCBjYl9nZXRhdHRycmVzICpyZXMpCit7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHA7CisJc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uOworCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2k7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwkKKwlyZXMtPmJpdG1hcFswXSA9IHJlcy0+Yml0bWFwWzFdID0gMDsKKwlyZXMtPnN0YXR1cyA9IGh0b25sKE5GUzRFUlJfQkFESEFORExFKTsKKwljbHAgPSBuZnM0X2ZpbmRfY2xpZW50KCZhcmdzLT5hZGRyLT5zaW5fYWRkcik7CisJaWYgKGNscCA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwlpbm9kZSA9IG5mc19kZWxlZ2F0aW9uX2ZpbmRfaW5vZGUoY2xwLCAmYXJncy0+ZmgpOworCWlmIChpbm9kZSA9PSBOVUxMKQorCQlnb3RvIG91dF9wdXRjbGllbnQ7CisJbmZzaSA9IE5GU19JKGlub2RlKTsKKwlkb3duX3JlYWQoJm5mc2ktPnJ3c2VtKTsKKwlkZWxlZ2F0aW9uID0gbmZzaS0+ZGVsZWdhdGlvbjsKKwlpZiAoZGVsZWdhdGlvbiA9PSBOVUxMIHx8IChkZWxlZ2F0aW9uLT50eXBlICYgRk1PREVfV1JJVEUpID09IDApCisJCWdvdG8gb3V0X2lwdXQ7CisJcmVzLT5zaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOworCXJlcy0+Y2hhbmdlX2F0dHIgPSBORlNfQ0hBTkdFX0FUVFIoaW5vZGUpOworCXJlcy0+Y3RpbWUgPSBpbm9kZS0+aV9jdGltZTsKKwlyZXMtPm10aW1lID0gaW5vZGUtPmlfbXRpbWU7CisJcmVzLT5iaXRtYXBbMF0gPSAoRkFUVFI0X1dPUkQwX0NIQU5HRXxGQVRUUjRfV09SRDBfU0laRSkgJgorCQlhcmdzLT5iaXRtYXBbMF07CisJcmVzLT5iaXRtYXBbMV0gPSAoRkFUVFI0X1dPUkQxX1RJTUVfTUVUQURBVEF8RkFUVFI0X1dPUkQxX1RJTUVfTU9ESUZZKSAmCisJCWFyZ3MtPmJpdG1hcFsxXTsKKwlyZXMtPnN0YXR1cyA9IDA7CitvdXRfaXB1dDoKKwl1cF9yZWFkKCZuZnNpLT5yd3NlbSk7CisJaXB1dChpbm9kZSk7CitvdXRfcHV0Y2xpZW50OgorCW5mczRfcHV0X2NsaWVudChjbHApOworb3V0OgorCWRwcmludGsoIiVzOiBleGl0IHdpdGggc3RhdHVzID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgbnRvaGwocmVzLT5zdGF0dXMpKTsKKwlyZXR1cm4gcmVzLT5zdGF0dXM7Cit9CisKK3Vuc2lnbmVkIG5mczRfY2FsbGJhY2tfcmVjYWxsKHN0cnVjdCBjYl9yZWNhbGxhcmdzICphcmdzLCB2b2lkICpkdW1teSkKK3sKKwlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXVuc2lnbmVkIHJlczsKKwkKKwlyZXMgPSBodG9ubChORlM0RVJSX0JBREhBTkRMRSk7CisJY2xwID0gbmZzNF9maW5kX2NsaWVudCgmYXJncy0+YWRkci0+c2luX2FkZHIpOworCWlmIChjbHAgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisJaW5vZGUgPSBuZnNfZGVsZWdhdGlvbl9maW5kX2lub2RlKGNscCwgJmFyZ3MtPmZoKTsKKwlpZiAoaW5vZGUgPT0gTlVMTCkKKwkJZ290byBvdXRfcHV0Y2xpZW50OworCS8qIFNldCB1cCBhIGhlbHBlciB0aHJlYWQgdG8gYWN0dWFsbHkgcmV0dXJuIHRoZSBkZWxlZ2F0aW9uICovCisJc3dpdGNoKG5mc19hc3luY19pbm9kZV9yZXR1cm5fZGVsZWdhdGlvbihpbm9kZSwgJmFyZ3MtPnN0YXRlaWQpKSB7CisJCWNhc2UgMDoKKwkJCXJlcyA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAtRU5PRU5UOgorCQkJcmVzID0gaHRvbmwoTkZTNEVSUl9CQURfU1RBVEVJRCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJlcyA9IGh0b25sKE5GUzRFUlJfUkVTT1VSQ0UpOworCX0KKwlpcHV0KGlub2RlKTsKK291dF9wdXRjbGllbnQ6CisJbmZzNF9wdXRfY2xpZW50KGNscCk7CitvdXQ6CisJZHByaW50aygiJXM6IGV4aXQgd2l0aCBzdGF0dXMgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBudG9obChyZXMpKTsKKwlyZXR1cm4gcmVzOworfQpkaWZmIC0tZ2l0IGEvZnMvbmZzL2NhbGxiYWNrX3hkci5jIGIvZnMvbmZzL2NhbGxiYWNrX3hkci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNzFkZjkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnMvY2FsbGJhY2tfeGRyLmMKQEAgLTAsMCArMSw0ODEgQEAKKy8qCisgKiBsaW51eC9mcy9uZnMvY2FsbGJhY2tfeGRyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgVHJvbmQgTXlrbGVidXN0CisgKgorICogTkZTdjQgY2FsbGJhY2sgZW5jb2RlL2RlY29kZSBwcm9jZWR1cmVzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CisjaW5jbHVkZSA8bGludXgvbmZzNC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgorI2luY2x1ZGUgImNhbGxiYWNrLmgiCisKKyNkZWZpbmUgQ0JfT1BfVEFHTEVOX01BWFNaCSg1MTIpCisjZGVmaW5lIENCX09QX0hEUl9SRVNfTUFYU1oJKDIgKyBDQl9PUF9UQUdMRU5fTUFYU1opCisjZGVmaW5lIENCX09QX0dFVEFUVFJfQklUTUFQX01BWFNaCSg0KQorI2RlZmluZSBDQl9PUF9HRVRBVFRSX1JFU19NQVhTWgkoQ0JfT1BfSERSX1JFU19NQVhTWiArIFwKKwkJCQlDQl9PUF9HRVRBVFRSX0JJVE1BUF9NQVhTWiArIFwKKwkJCQkyICsgMiArIDMgKyAzKQorI2RlZmluZSBDQl9PUF9SRUNBTExfUkVTX01BWFNaCShDQl9PUF9IRFJfUkVTX01BWFNaKQorCisjZGVmaW5lIE5GU0RCR19GQUNJTElUWSBORlNEQkdfQ0FMTEJBQ0sKKwordHlwZWRlZiB1bnNpZ25lZCAoKmNhbGxiYWNrX3Byb2Nlc3Nfb3BfdCkodm9pZCAqLCB2b2lkICopOwordHlwZWRlZiB1bnNpZ25lZCAoKmNhbGxiYWNrX2RlY29kZV9hcmdfdCkoc3RydWN0IHN2Y19ycXN0ICosIHN0cnVjdCB4ZHJfc3RyZWFtICosIHZvaWQgKik7Cit0eXBlZGVmIHVuc2lnbmVkICgqY2FsbGJhY2tfZW5jb2RlX3Jlc190KShzdHJ1Y3Qgc3ZjX3Jxc3QgKiwgc3RydWN0IHhkcl9zdHJlYW0gKiwgdm9pZCAqKTsKKworCitzdHJ1Y3QgY2FsbGJhY2tfb3AgeworCWNhbGxiYWNrX3Byb2Nlc3Nfb3BfdCBwcm9jZXNzX29wOworCWNhbGxiYWNrX2RlY29kZV9hcmdfdCBkZWNvZGVfYXJnczsKKwljYWxsYmFja19lbmNvZGVfcmVzX3QgZW5jb2RlX3JlczsKKwlsb25nIHJlc19tYXhzaXplOworfTsKKworc3RhdGljIHN0cnVjdCBjYWxsYmFja19vcCBjYWxsYmFja19vcHNbXTsKKworc3RhdGljIGludCBuZnM0X2NhbGxiYWNrX251bGwoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdm9pZCAqYXJncCwgdm9pZCAqcmVzcCkKK3sKKwlyZXR1cm4gaHRvbmwoTkZTNF9PSyk7Cit9CisKK3N0YXRpYyBpbnQgbmZzNF9kZWNvZGVfdm9pZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgdm9pZCAqZHVtbXkpCit7CisJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworc3RhdGljIGludCBuZnM0X2VuY29kZV92b2lkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCB2b2lkICpkdW1teSkKK3sKKwlyZXR1cm4geGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitzdGF0aWMgdWludDMyX3QgKnJlYWRfYnVmKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGludCBuYnl0ZXMpCit7CisJdWludDMyX3QgKnA7CisKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCBuYnl0ZXMpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJORlN2NCBjYWxsYmFjayByZXBseSBidWZmZXIgb3ZlcmZsb3dlZCFcbiIpOworCXJldHVybiBwOworfQorCitzdGF0aWMgdW5zaWduZWQgZGVjb2RlX3N0cmluZyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1bnNpZ25lZCBpbnQgKmxlbiwgY29uc3QgY2hhciAqKnN0cikKK3sKKwl1aW50MzJfdCAqcDsKKworCXAgPSByZWFkX2J1Zih4ZHIsIDQpOworCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQlyZXR1cm4gaHRvbmwoTkZTNEVSUl9SRVNPVVJDRSk7CisJKmxlbiA9IG50b2hsKCpwKTsKKworCWlmICgqbGVuICE9IDApIHsKKwkJcCA9IHJlYWRfYnVmKHhkciwgKmxlbik7CisJCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQkJcmV0dXJuIGh0b25sKE5GUzRFUlJfUkVTT1VSQ0UpOworCQkqc3RyID0gKGNvbnN0IGNoYXIgKilwOworCX0gZWxzZQorCQkqc3RyID0gTlVMTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgZGVjb2RlX2ZoKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfZmggKmZoKQoreworCXVpbnQzMl90ICpwOworCisJcCA9IHJlYWRfYnVmKHhkciwgNCk7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCXJldHVybiBodG9ubChORlM0RVJSX1JFU09VUkNFKTsKKwlmaC0+c2l6ZSA9IG50b2hsKCpwKTsKKwlpZiAoZmgtPnNpemUgPiBORlM0X0ZIU0laRSkKKwkJcmV0dXJuIGh0b25sKE5GUzRFUlJfQkFESEFORExFKTsKKwlwID0gcmVhZF9idWYoeGRyLCBmaC0+c2l6ZSk7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCXJldHVybiBodG9ubChORlM0RVJSX1JFU09VUkNFKTsKKwltZW1jcHkoJmZoLT5kYXRhWzBdLCBwLCBmaC0+c2l6ZSk7CisJbWVtc2V0KCZmaC0+ZGF0YVtmaC0+c2l6ZV0sIDAsIHNpemVvZihmaC0+ZGF0YSkgLSBmaC0+c2l6ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBkZWNvZGVfYml0bWFwKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXApCit7CisJdWludDMyX3QgKnA7CisJdW5zaWduZWQgaW50IGF0dHJsZW47CisKKwlwID0gcmVhZF9idWYoeGRyLCA0KTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJcmV0dXJuIGh0b25sKE5GUzRFUlJfUkVTT1VSQ0UpOworCWF0dHJsZW4gPSBudG9obCgqcCk7CisJcCA9IHJlYWRfYnVmKHhkciwgYXR0cmxlbiA8PCAyKTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJcmV0dXJuIGh0b25sKE5GUzRFUlJfUkVTT1VSQ0UpOworCWlmIChsaWtlbHkoYXR0cmxlbiA+IDApKQorCQliaXRtYXBbMF0gPSBudG9obCgqcCsrKTsKKwlpZiAoYXR0cmxlbiA+IDEpCisJCWJpdG1hcFsxXSA9IG50b2hsKCpwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGRlY29kZV9zdGF0ZWlkKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIG5mczRfc3RhdGVpZCAqc3RhdGVpZCkKK3sKKwl1aW50MzJfdCAqcDsKKworCXAgPSByZWFkX2J1Zih4ZHIsIDE2KTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJcmV0dXJuIGh0b25sKE5GUzRFUlJfUkVTT1VSQ0UpOworCW1lbWNweShzdGF0ZWlkLT5kYXRhLCBwLCAxNik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBkZWNvZGVfY29tcG91bmRfaGRyX2FyZyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgY2JfY29tcG91bmRfaGRyX2FyZyAqaGRyKQoreworCXVpbnQzMl90ICpwOworCXVuc2lnbmVkIGludCBtaW5vcl92ZXJzaW9uOworCXVuc2lnbmVkIHN0YXR1czsKKworCXN0YXR1cyA9IGRlY29kZV9zdHJpbmcoeGRyLCAmaGRyLT50YWdsZW4sICZoZHItPnRhZyk7CisJaWYgKHVubGlrZWx5KHN0YXR1cyAhPSAwKSkKKwkJcmV0dXJuIHN0YXR1czsKKwkvKiBXZSBkbyBub3QgbGlrZSBvdmVybHkgbG9uZyB0YWdzISAqLworCWlmIChoZHItPnRhZ2xlbiA+IENCX09QX1RBR0xFTl9NQVhTWi0xMiB8fCBoZHItPnRhZ2xlbiA8IDApIHsKKwkJcHJpbnRrKCJORlN2NCBDQUxMQkFDSyAlczogY2xpZW50IHNlbnQgdGFnIG9mIGxlbmd0aCAldVxuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIGhkci0+dGFnbGVuKTsKKwkJcmV0dXJuIGh0b25sKE5GUzRFUlJfUkVTT1VSQ0UpOworCX0KKwlwID0gcmVhZF9idWYoeGRyLCAxMik7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCXJldHVybiBodG9ubChORlM0RVJSX1JFU09VUkNFKTsKKwltaW5vcl92ZXJzaW9uID0gbnRvaGwoKnArKyk7CisJLyogQ2hlY2sgbWlub3IgdmVyc2lvbiBpcyB6ZXJvLiAqLworCWlmIChtaW5vcl92ZXJzaW9uICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE5GU3Y0IHNlcnZlciBjYWxsYmFjayB3aXRoIGlsbGVnYWwgbWlub3IgdmVyc2lvbiAldSFcbiIsCisJCQkJX19GVU5DVElPTl9fLCBtaW5vcl92ZXJzaW9uKTsKKwkJcmV0dXJuIGh0b25sKE5GUzRFUlJfTUlOT1JfVkVSU19NSVNNQVRDSCk7CisJfQorCWhkci0+Y2FsbGJhY2tfaWRlbnQgPSBudG9obCgqcCsrKTsKKwloZHItPm5vcHMgPSBudG9obCgqcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBkZWNvZGVfb3BfaGRyKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVuc2lnbmVkIGludCAqb3ApCit7CisJdWludDMyX3QgKnA7CisJcCA9IHJlYWRfYnVmKHhkciwgNCk7CisJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCXJldHVybiBodG9ubChORlM0RVJSX1JFU09VUkNFKTsKKwkqb3AgPSBudG9obCgqcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBkZWNvZGVfZ2V0YXR0cl9hcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBjYl9nZXRhdHRyYXJncyAqYXJncykKK3sKKwl1bnNpZ25lZCBzdGF0dXM7CisKKwlzdGF0dXMgPSBkZWNvZGVfZmgoeGRyLCAmYXJncy0+ZmgpOworCWlmICh1bmxpa2VseShzdGF0dXMgIT0gMCkpCisJCWdvdG8gb3V0OworCWFyZ3MtPmFkZHIgPSAmcnFzdHAtPnJxX2FkZHI7CisJc3RhdHVzID0gZGVjb2RlX2JpdG1hcCh4ZHIsIGFyZ3MtPmJpdG1hcCk7CitvdXQ6CisJZHByaW50aygiJXM6IGV4aXQgd2l0aCBzdGF0dXMgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBkZWNvZGVfcmVjYWxsX2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IGNiX3JlY2FsbGFyZ3MgKmFyZ3MpCit7CisJdWludDMyX3QgKnA7CisJdW5zaWduZWQgc3RhdHVzOworCisJYXJncy0+YWRkciA9ICZycXN0cC0+cnFfYWRkcjsKKwlzdGF0dXMgPSBkZWNvZGVfc3RhdGVpZCh4ZHIsICZhcmdzLT5zdGF0ZWlkKTsKKwlpZiAodW5saWtlbHkoc3RhdHVzICE9IDApKQorCQlnb3RvIG91dDsKKwlwID0gcmVhZF9idWYoeGRyLCA0KTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkgeworCQlzdGF0dXMgPSBodG9ubChORlM0RVJSX1JFU09VUkNFKTsKKwkJZ290byBvdXQ7CisJfQorCWFyZ3MtPnRydW5jYXRlID0gbnRvaGwoKnApOworCXN0YXR1cyA9IGRlY29kZV9maCh4ZHIsICZhcmdzLT5maCk7CitvdXQ6CisJZHByaW50aygiJXM6IGV4aXQgd2l0aCBzdGF0dXMgPSAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgZW5jb2RlX3N0cmluZyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1bnNpZ25lZCBpbnQgbGVuLCBjb25zdCBjaGFyICpzdHIpCit7CisJdWludDMyX3QgKnA7CisKKwlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCA0ICsgbGVuKTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJcmV0dXJuIGh0b25sKE5GUzRFUlJfUkVTT1VSQ0UpOworCXhkcl9lbmNvZGVfb3BhcXVlKHAsIHN0ciwgbGVuKTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBDQl9TVVBQT1JURURfQVRUUjAgKEZBVFRSNF9XT1JEMF9DSEFOR0V8RkFUVFI0X1dPUkQwX1NJWkUpCisjZGVmaW5lIENCX1NVUFBPUlRFRF9BVFRSMSAoRkFUVFI0X1dPUkQxX1RJTUVfTUVUQURBVEF8RkFUVFI0X1dPUkQxX1RJTUVfTU9ESUZZKQorc3RhdGljIHVuc2lnbmVkIGVuY29kZV9hdHRyX2JpdG1hcChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCB1aW50MzJfdCAqYml0bWFwLCB1aW50MzJfdCAqKnNhdmVwKQoreworCXVpbnQzMl90IGJtWzJdOworCXVpbnQzMl90ICpwOworCisJYm1bMF0gPSBodG9ubChiaXRtYXBbMF0gJiBDQl9TVVBQT1JURURfQVRUUjApOworCWJtWzFdID0gaHRvbmwoYml0bWFwWzFdICYgQ0JfU1VQUE9SVEVEX0FUVFIxKTsKKwlpZiAoYm1bMV0gIT0gMCkgeworCQlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCAxNik7CisJCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQkJcmV0dXJuIGh0b25sKE5GUzRFUlJfUkVTT1VSQ0UpOworCQkqcCsrID0gaHRvbmwoMik7CisJCSpwKysgPSBibVswXTsKKwkJKnArKyA9IGJtWzFdOworCX0gZWxzZSBpZiAoYm1bMF0gIT0gMCkgeworCQlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCAxMik7CisJCWlmICh1bmxpa2VseShwID09IE5VTEwpKQorCQkJcmV0dXJuIGh0b25sKE5GUzRFUlJfUkVTT1VSQ0UpOworCQkqcCsrID0gaHRvbmwoMSk7CisJCSpwKysgPSBibVswXTsKKwl9IGVsc2UgeworCQlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCA4KTsKKwkJaWYgKHVubGlrZWx5KHAgPT0gTlVMTCkpCisJCQlyZXR1cm4gaHRvbmwoTkZTNEVSUl9SRVNPVVJDRSk7CisJCSpwKysgPSBodG9ubCgwKTsKKwl9CisJKnNhdmVwID0gcDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGVuY29kZV9hdHRyX2NoYW5nZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCB1aW50MzJfdCAqYml0bWFwLCB1aW50NjRfdCBjaGFuZ2UpCit7CisJdWludDMyX3QgKnA7CisKKwlpZiAoIShiaXRtYXBbMF0gJiBGQVRUUjRfV09SRDBfQ0hBTkdFKSkKKwkJcmV0dXJuIDA7CisJcCA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgOCk7CisJaWYgKHVubGlrZWx5KHAgPT0gMCkpCisJCXJldHVybiBodG9ubChORlM0RVJSX1JFU09VUkNFKTsKKwlwID0geGRyX2VuY29kZV9oeXBlcihwLCBjaGFuZ2UpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgZW5jb2RlX2F0dHJfc2l6ZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCB1aW50MzJfdCAqYml0bWFwLCB1aW50NjRfdCBzaXplKQoreworCXVpbnQzMl90ICpwOworCisJaWYgKCEoYml0bWFwWzBdICYgRkFUVFI0X1dPUkQwX1NJWkUpKQorCQlyZXR1cm4gMDsKKwlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCA4KTsKKwlpZiAodW5saWtlbHkocCA9PSAwKSkKKwkJcmV0dXJuIGh0b25sKE5GUzRFUlJfUkVTT1VSQ0UpOworCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsIHNpemUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgZW5jb2RlX2F0dHJfdGltZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWUpCit7CisJdWludDMyX3QgKnA7CisKKwlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCAxMik7CisJaWYgKHVubGlrZWx5KHAgPT0gMCkpCisJCXJldHVybiBodG9ubChORlM0RVJSX1JFU09VUkNFKTsKKwlwID0geGRyX2VuY29kZV9oeXBlcihwLCB0aW1lLT50dl9zZWMpOworCSpwID0gaHRvbmwodGltZS0+dHZfbnNlYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBlbmNvZGVfYXR0cl9jdGltZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCB1aW50MzJfdCAqYml0bWFwLCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWUpCit7CisJaWYgKCEoYml0bWFwWzFdICYgRkFUVFI0X1dPUkQxX1RJTUVfTUVUQURBVEEpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gZW5jb2RlX2F0dHJfdGltZSh4ZHIsdGltZSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBlbmNvZGVfYXR0cl9tdGltZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCB1aW50MzJfdCAqYml0bWFwLCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWUpCit7CisJaWYgKCEoYml0bWFwWzFdICYgRkFUVFI0X1dPUkQxX1RJTUVfTU9ESUZZKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGVuY29kZV9hdHRyX3RpbWUoeGRyLHRpbWUpOworfQorCitzdGF0aWMgdW5zaWduZWQgZW5jb2RlX2NvbXBvdW5kX2hkcl9yZXMoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IGNiX2NvbXBvdW5kX2hkcl9yZXMgKmhkcikKK3sKKwl1bnNpZ25lZCBzdGF0dXM7CisKKwloZHItPnN0YXR1cyA9IHhkcl9yZXNlcnZlX3NwYWNlKHhkciwgNCk7CisJaWYgKHVubGlrZWx5KGhkci0+c3RhdHVzID09IE5VTEwpKQorCQlyZXR1cm4gaHRvbmwoTkZTNEVSUl9SRVNPVVJDRSk7CisJc3RhdHVzID0gZW5jb2RlX3N0cmluZyh4ZHIsIGhkci0+dGFnbGVuLCBoZHItPnRhZyk7CisJaWYgKHVubGlrZWx5KHN0YXR1cyAhPSAwKSkKKwkJcmV0dXJuIHN0YXR1czsKKwloZHItPm5vcHMgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDQpOworCWlmICh1bmxpa2VseShoZHItPm5vcHMgPT0gTlVMTCkpCisJCXJldHVybiBodG9ubChORlM0RVJSX1JFU09VUkNFKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGVuY29kZV9vcF9oZHIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3Qgb3AsIHVpbnQzMl90IHJlcykKK3sKKwl1aW50MzJfdCAqcDsKKwkKKwlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCA4KTsKKwlpZiAodW5saWtlbHkocCA9PSBOVUxMKSkKKwkJcmV0dXJuIGh0b25sKE5GUzRFUlJfUkVTT1VSQ0UpOworCSpwKysgPSBodG9ubChvcCk7CisJKnAgPSByZXM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBlbmNvZGVfZ2V0YXR0cl9yZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IGNiX2dldGF0dHJyZXMgKnJlcykKK3sKKwl1aW50MzJfdCAqc2F2ZXA7CisJdW5zaWduZWQgc3RhdHVzID0gcmVzLT5zdGF0dXM7CisJCisJaWYgKHVubGlrZWx5KHN0YXR1cyAhPSAwKSkKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZW5jb2RlX2F0dHJfYml0bWFwKHhkciwgcmVzLT5iaXRtYXAsICZzYXZlcCk7CisJaWYgKHVubGlrZWx5KHN0YXR1cyAhPSAwKSkKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZW5jb2RlX2F0dHJfY2hhbmdlKHhkciwgcmVzLT5iaXRtYXAsIHJlcy0+Y2hhbmdlX2F0dHIpOworCWlmICh1bmxpa2VseShzdGF0dXMgIT0gMCkpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGVuY29kZV9hdHRyX3NpemUoeGRyLCByZXMtPmJpdG1hcCwgcmVzLT5zaXplKTsKKwlpZiAodW5saWtlbHkoc3RhdHVzICE9IDApKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBlbmNvZGVfYXR0cl9jdGltZSh4ZHIsIHJlcy0+Yml0bWFwLCAmcmVzLT5jdGltZSk7CisJaWYgKHVubGlrZWx5KHN0YXR1cyAhPSAwKSkKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZW5jb2RlX2F0dHJfbXRpbWUoeGRyLCByZXMtPmJpdG1hcCwgJnJlcy0+bXRpbWUpOworCSpzYXZlcCA9IGh0b25sKCh1bnNpZ25lZCBpbnQpKChjaGFyICopeGRyLT5wIC0gKGNoYXIgKikoc2F2ZXArMSkpKTsKK291dDoKKwlkcHJpbnRrKCIlczogZXhpdCB3aXRoIHN0YXR1cyA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHVuc2lnbmVkIHByb2Nlc3Nfb3Aoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwKKwkJc3RydWN0IHhkcl9zdHJlYW0gKnhkcl9pbiwgdm9pZCAqYXJncCwKKwkJc3RydWN0IHhkcl9zdHJlYW0gKnhkcl9vdXQsIHZvaWQgKnJlc3ApCit7CisJc3RydWN0IGNhbGxiYWNrX29wICpvcDsKKwl1bnNpZ25lZCBpbnQgb3BfbnI7CisJdW5zaWduZWQgaW50IHN0YXR1cyA9IDA7CisJbG9uZyBtYXhsZW47CisJdW5zaWduZWQgcmVzOworCisJZHByaW50aygiJXM6IHN0YXJ0XG4iLCBfX0ZVTkNUSU9OX18pOworCXN0YXR1cyA9IGRlY29kZV9vcF9oZHIoeGRyX2luLCAmb3BfbnIpOworCWlmICh1bmxpa2VseShzdGF0dXMgIT0gMCkpIHsKKwkJb3BfbnIgPSBPUF9DQl9JTExFR0FMOworCQlvcCA9ICZjYWxsYmFja19vcHNbMF07CisJfSBlbHNlIGlmICh1bmxpa2VseShvcF9uciAhPSBPUF9DQl9HRVRBVFRSICYmIG9wX25yICE9IE9QX0NCX1JFQ0FMTCkpIHsKKwkJb3BfbnIgPSBPUF9DQl9JTExFR0FMOworCQlvcCA9ICZjYWxsYmFja19vcHNbMF07CisJCXN0YXR1cyA9IGh0b25sKE5GUzRFUlJfT1BfSUxMRUdBTCk7CisJfSBlbHNlCisJCW9wID0gJmNhbGxiYWNrX29wc1tvcF9ucl07CisKKwltYXhsZW4gPSB4ZHJfb3V0LT5lbmQgLSB4ZHJfb3V0LT5wOworCWlmIChtYXhsZW4gPiAwICYmIG1heGxlbiA8IFBBR0VfU0laRSkgeworCQlpZiAobGlrZWx5KHN0YXR1cyA9PSAwICYmIG9wLT5kZWNvZGVfYXJncyAhPSBOVUxMKSkKKwkJCXN0YXR1cyA9IG9wLT5kZWNvZGVfYXJncyhycXN0cCwgeGRyX2luLCBhcmdwKTsKKwkJaWYgKGxpa2VseShzdGF0dXMgPT0gMCAmJiBvcC0+cHJvY2Vzc19vcCAhPSBOVUxMKSkKKwkJCXN0YXR1cyA9IG9wLT5wcm9jZXNzX29wKGFyZ3AsIHJlc3ApOworCX0gZWxzZQorCQlzdGF0dXMgPSBodG9ubChORlM0RVJSX1JFU09VUkNFKTsKKworCXJlcyA9IGVuY29kZV9vcF9oZHIoeGRyX291dCwgb3BfbnIsIHN0YXR1cyk7CisJaWYgKHN0YXR1cyA9PSAwKQorCQlzdGF0dXMgPSByZXM7CisJaWYgKG9wLT5lbmNvZGVfcmVzICE9IE5VTEwgJiYgc3RhdHVzID09IDApCisJCXN0YXR1cyA9IG9wLT5lbmNvZGVfcmVzKHJxc3RwLCB4ZHJfb3V0LCByZXNwKTsKKwlkcHJpbnRrKCIlczogZG9uZSwgc3RhdHVzID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRGVjb2RlLCBwcm9jZXNzIGFuZCBlbmNvZGUgYSBDT01QT1VORAorICovCitzdGF0aWMgaW50IG5mczRfY2FsbGJhY2tfY29tcG91bmQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdm9pZCAqYXJncCwgdm9pZCAqcmVzcCkKK3sKKwlzdHJ1Y3QgY2JfY29tcG91bmRfaGRyX2FyZyBoZHJfYXJnOworCXN0cnVjdCBjYl9jb21wb3VuZF9oZHJfcmVzIGhkcl9yZXM7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyX2luLCB4ZHJfb3V0OworCXVpbnQzMl90ICpwOworCXVuc2lnbmVkIGludCBzdGF0dXM7CisJdW5zaWduZWQgaW50IG5vcHMgPSAxOworCisJZHByaW50aygiJXM6IHN0YXJ0XG4iLCBfX0ZVTkNUSU9OX18pOworCisJeGRyX2luaXRfZGVjb2RlKCZ4ZHJfaW4sICZycXN0cC0+cnFfYXJnLCBycXN0cC0+cnFfYXJnLmhlYWRbMF0uaW92X2Jhc2UpOworCisJcCA9ICh1aW50MzJfdCopKChjaGFyICopcnFzdHAtPnJxX3Jlcy5oZWFkWzBdLmlvdl9iYXNlICsgcnFzdHAtPnJxX3Jlcy5oZWFkWzBdLmlvdl9sZW4pOworCXJxc3RwLT5ycV9yZXMuaGVhZFswXS5pb3ZfbGVuID0gUEFHRV9TSVpFOworCXhkcl9pbml0X2VuY29kZSgmeGRyX291dCwgJnJxc3RwLT5ycV9yZXMsIHApOworCisJZGVjb2RlX2NvbXBvdW5kX2hkcl9hcmcoJnhkcl9pbiwgJmhkcl9hcmcpOworCWhkcl9yZXMudGFnbGVuID0gaGRyX2FyZy50YWdsZW47CisJaGRyX3Jlcy50YWcgPSBoZHJfYXJnLnRhZzsKKwllbmNvZGVfY29tcG91bmRfaGRyX3JlcygmeGRyX291dCwgJmhkcl9yZXMpOworCisJZm9yICg7OykgeworCQlzdGF0dXMgPSBwcm9jZXNzX29wKHJxc3RwLCAmeGRyX2luLCBhcmdwLCAmeGRyX291dCwgcmVzcCk7CisJCWlmIChzdGF0dXMgIT0gMCkKKwkJCWJyZWFrOworCQlpZiAobm9wcyA9PSBoZHJfYXJnLm5vcHMpCisJCQlicmVhazsKKwkJbm9wcysrOworCX0KKwkqaGRyX3Jlcy5zdGF0dXMgPSBzdGF0dXM7CisJKmhkcl9yZXMubm9wcyA9IGh0b25sKG5vcHMpOworCWRwcmludGsoIiVzOiBkb25lLCBzdGF0dXMgPSAldVxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCXJldHVybiBycGNfc3VjY2VzczsKK30KKworLyoKKyAqIERlZmluZSBORlM0IGNhbGxiYWNrIENPTVBPVU5EIG9wcy4KKyAqLworc3RhdGljIHN0cnVjdCBjYWxsYmFja19vcCBjYWxsYmFja19vcHNbXSA9IHsKKwlbMF0gPSB7CisJCS5yZXNfbWF4c2l6ZSA9IENCX09QX0hEUl9SRVNfTUFYU1osCisJfSwKKwlbT1BfQ0JfR0VUQVRUUl0gPSB7CisJCS5wcm9jZXNzX29wID0gKGNhbGxiYWNrX3Byb2Nlc3Nfb3BfdCluZnM0X2NhbGxiYWNrX2dldGF0dHIsCisJCS5kZWNvZGVfYXJncyA9IChjYWxsYmFja19kZWNvZGVfYXJnX3QpZGVjb2RlX2dldGF0dHJfYXJncywKKwkJLmVuY29kZV9yZXMgPSAoY2FsbGJhY2tfZW5jb2RlX3Jlc190KWVuY29kZV9nZXRhdHRyX3JlcywKKwkJLnJlc19tYXhzaXplID0gQ0JfT1BfR0VUQVRUUl9SRVNfTUFYU1osCisJfSwKKwlbT1BfQ0JfUkVDQUxMXSA9IHsKKwkJLnByb2Nlc3Nfb3AgPSAoY2FsbGJhY2tfcHJvY2Vzc19vcF90KW5mczRfY2FsbGJhY2tfcmVjYWxsLAorCQkuZGVjb2RlX2FyZ3MgPSAoY2FsbGJhY2tfZGVjb2RlX2FyZ190KWRlY29kZV9yZWNhbGxfYXJncywKKwkJLnJlc19tYXhzaXplID0gQ0JfT1BfUkVDQUxMX1JFU19NQVhTWiwKKwl9Cit9OworCisvKgorICogRGVmaW5lIE5GUzQgY2FsbGJhY2sgcHJvY2VkdXJlcworICovCitzdGF0aWMgc3RydWN0IHN2Y19wcm9jZWR1cmUgbmZzNF9jYWxsYmFja19wcm9jZWR1cmVzMVtdID0geworCVtDQl9OVUxMXSA9IHsKKwkJLnBjX2Z1bmMgPSBuZnM0X2NhbGxiYWNrX251bGwsCisJCS5wY19kZWNvZGUgPSAoa3hkcnByb2NfdCluZnM0X2RlY29kZV92b2lkLAorCQkucGNfZW5jb2RlID0gKGt4ZHJwcm9jX3QpbmZzNF9lbmNvZGVfdm9pZCwKKwkJLnBjX3hkcnJlc3NpemUgPSAxLAorCX0sCisJW0NCX0NPTVBPVU5EXSA9IHsKKwkJLnBjX2Z1bmMgPSBuZnM0X2NhbGxiYWNrX2NvbXBvdW5kLAorCQkucGNfZW5jb2RlID0gKGt4ZHJwcm9jX3QpbmZzNF9lbmNvZGVfdm9pZCwKKwkJLnBjX2FyZ3NpemUgPSAyNTYsCisJCS5wY19yZXNzaXplID0gMjU2LAorCQkucGNfeGRycmVzc2l6ZSA9IE5GUzRfQ0FMTEJBQ0tfQlVGU0laRSwKKwl9Cit9OworCitzdHJ1Y3Qgc3ZjX3ZlcnNpb24gbmZzNF9jYWxsYmFja192ZXJzaW9uMSA9IHsKKwkudnNfdmVycyA9IDEsCisJLnZzX25wcm9jID0gQVJSQVlfU0laRShuZnM0X2NhbGxiYWNrX3Byb2NlZHVyZXMxKSwKKwkudnNfcHJvYyA9IG5mczRfY2FsbGJhY2tfcHJvY2VkdXJlczEsCisJLnZzX3hkcnNpemUgPSBORlM0X0NBTExCQUNLX1hEUlNJWkUsCisJLnZzX2Rpc3BhdGNoID0gTlVMTCwKK307CisKZGlmZiAtLWdpdCBhL2ZzL25mcy9kZWxlZ2F0aW9uLmMgYi9mcy9uZnMvZGVsZWdhdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViOWM2MGYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnMvZGVsZWdhdGlvbi5jCkBAIC0wLDAgKzEsMzQyIEBACisvKgorICogbGludXgvZnMvbmZzL2RlbGVnYXRpb24uYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBUcm9uZCBNeWtsZWJ1c3QKKyAqCisgKiBORlMgZmlsZSBkZWxlZ2F0aW9uIG1hbmFnZW1lbnQKKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSA8bGludXgvbmZzNC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L25mc194ZHIuaD4KKworI2luY2x1ZGUgImRlbGVnYXRpb24uaCIKKworc3RhdGljIHN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqbmZzX2FsbG9jX2RlbGVnYXRpb24odm9pZCkKK3sKKwlyZXR1cm4gKHN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBuZnNfZGVsZWdhdGlvbiksIEdGUF9LRVJORUwpOworfQorCitzdGF0aWMgdm9pZCBuZnNfZnJlZV9kZWxlZ2F0aW9uKHN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbikKK3sKKwlpZiAoZGVsZWdhdGlvbi0+Y3JlZCkKKwkJcHV0X3JwY2NyZWQoZGVsZWdhdGlvbi0+Y3JlZCk7CisJa2ZyZWUoZGVsZWdhdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkIG5mc19kZWxlZ2F0aW9uX2NsYWltX29wZW5zKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKKwlzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4OworCXN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZTsKKworYWdhaW46CisJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGN0eCwgJm5mc2ktPm9wZW5fZmlsZXMsIGxpc3QpIHsKKwkJc3RhdGUgPSBjdHgtPnN0YXRlOworCQlpZiAoc3RhdGUgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXRlc3RfYml0KE5GU19ERUxFR0FURURfU1RBVEUsICZzdGF0ZS0+ZmxhZ3MpKQorCQkJY29udGludWU7CisJCWdldF9uZnNfb3Blbl9jb250ZXh0KGN0eCk7CisJCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkJaWYgKG5mczRfb3Blbl9kZWxlZ2F0aW9uX3JlY2FsbChjdHgtPmRlbnRyeSwgc3RhdGUpIDwgMCkKKwkJCXJldHVybjsKKwkJcHV0X25mc19vcGVuX2NvbnRleHQoY3R4KTsKKwkJZ290byBhZ2FpbjsKKwl9CisJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworfQorCisvKgorICogU2V0IHVwIGEgZGVsZWdhdGlvbiBvbiBhbiBpbm9kZQorICovCit2b2lkIG5mc19pbm9kZV9yZWNsYWltX2RlbGVnYXRpb24oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHJwY19jcmVkICpjcmVkLCBzdHJ1Y3QgbmZzX29wZW5yZXMgKnJlcykKK3sKKwlzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb24gPSBORlNfSShpbm9kZSktPmRlbGVnYXRpb247CisKKwlpZiAoZGVsZWdhdGlvbiA9PSBOVUxMKQorCQlyZXR1cm47CisJbWVtY3B5KGRlbGVnYXRpb24tPnN0YXRlaWQuZGF0YSwgcmVzLT5kZWxlZ2F0aW9uLmRhdGEsCisJCQlzaXplb2YoZGVsZWdhdGlvbi0+c3RhdGVpZC5kYXRhKSk7CisJZGVsZWdhdGlvbi0+dHlwZSA9IHJlcy0+ZGVsZWdhdGlvbl90eXBlOworCWRlbGVnYXRpb24tPm1heHNpemUgPSByZXMtPm1heHNpemU7CisJcHV0X3JwY2NyZWQoY3JlZCk7CisJZGVsZWdhdGlvbi0+Y3JlZCA9IGdldF9ycGNjcmVkKGNyZWQpOworCWRlbGVnYXRpb24tPmZsYWdzICY9IH5ORlNfREVMRUdBVElPTl9ORUVEX1JFQ0xBSU07CisJTkZTX0koaW5vZGUpLT5kZWxlZ2F0aW9uX3N0YXRlID0gZGVsZWdhdGlvbi0+dHlwZTsKKwlzbXBfd21iKCk7Cit9CisKKy8qCisgKiBTZXQgdXAgYSBkZWxlZ2F0aW9uIG9uIGFuIGlub2RlCisgKi8KK2ludCBuZnNfaW5vZGVfc2V0X2RlbGVnYXRpb24oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHJwY19jcmVkICpjcmVkLCBzdHJ1Y3QgbmZzX29wZW5yZXMgKnJlcykKK3sKKwlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCA9IE5GU19TRVJWRVIoaW5vZGUpLT5uZnM0X3N0YXRlOworCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CisJc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uOworCWludCBzdGF0dXMgPSAwOworCisJZGVsZWdhdGlvbiA9IG5mc19hbGxvY19kZWxlZ2F0aW9uKCk7CisJaWYgKGRlbGVnYXRpb24gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtY3B5KGRlbGVnYXRpb24tPnN0YXRlaWQuZGF0YSwgcmVzLT5kZWxlZ2F0aW9uLmRhdGEsCisJCQlzaXplb2YoZGVsZWdhdGlvbi0+c3RhdGVpZC5kYXRhKSk7CisJZGVsZWdhdGlvbi0+dHlwZSA9IHJlcy0+ZGVsZWdhdGlvbl90eXBlOworCWRlbGVnYXRpb24tPm1heHNpemUgPSByZXMtPm1heHNpemU7CisJZGVsZWdhdGlvbi0+Y3JlZCA9IGdldF9ycGNjcmVkKGNyZWQpOworCWRlbGVnYXRpb24tPmlub2RlID0gaW5vZGU7CisKKwlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7CisJaWYgKG5mc2ktPmRlbGVnYXRpb24gPT0gTlVMTCkgeworCQlsaXN0X2FkZCgmZGVsZWdhdGlvbi0+c3VwZXJfbGlzdCwgJmNscC0+Y2xfZGVsZWdhdGlvbnMpOworCQluZnNpLT5kZWxlZ2F0aW9uID0gZGVsZWdhdGlvbjsKKwkJbmZzaS0+ZGVsZWdhdGlvbl9zdGF0ZSA9IGRlbGVnYXRpb24tPnR5cGU7CisJCWRlbGVnYXRpb24gPSBOVUxMOworCX0gZWxzZSB7CisJCWlmIChtZW1jbXAoJmRlbGVnYXRpb24tPnN0YXRlaWQsICZuZnNpLT5kZWxlZ2F0aW9uLT5zdGF0ZWlkLAorCQkJCQlzaXplb2YoZGVsZWdhdGlvbi0+c3RhdGVpZCkpICE9IDAgfHwKKwkJCQlkZWxlZ2F0aW9uLT50eXBlICE9IG5mc2ktPmRlbGVnYXRpb24tPnR5cGUpIHsKKwkJCXByaW50aygiJXM6IHNlcnZlciAldS4ldS4ldS4ldSwgaGFuZGVkIG91dCBhIGR1cGxpY2F0ZSBkZWxlZ2F0aW9uIVxuIiwKKwkJCQkJX19GVU5DVElPTl9fLCBOSVBRVUFEKGNscC0+Y2xfYWRkcikpOworCQkJc3RhdHVzID0gLUVJTzsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKKwlpZiAoZGVsZWdhdGlvbiAhPSBOVUxMKQorCQlrZnJlZShkZWxlZ2F0aW9uKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IG5mc19kb19yZXR1cm5fZGVsZWdhdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb24pCit7CisJaW50IHJlcyA9IDA7CisKKwlfX25mc19yZXZhbGlkYXRlX2lub2RlKE5GU19TRVJWRVIoaW5vZGUpLCBpbm9kZSk7CisKKwlyZXMgPSBuZnM0X3Byb2NfZGVsZWdyZXR1cm4oaW5vZGUsIGRlbGVnYXRpb24tPmNyZWQsICZkZWxlZ2F0aW9uLT5zdGF0ZWlkKTsKKwluZnNfZnJlZV9kZWxlZ2F0aW9uKGRlbGVnYXRpb24pOworCXJldHVybiByZXM7Cit9CisKKy8qIFN5bmMgYWxsIGRhdGEgdG8gZGlzayB1cG9uIGRlbGVnYXRpb24gcmV0dXJuICovCitzdGF0aWMgdm9pZCBuZnNfbXN5bmNfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlmaWxlbWFwX2ZkYXRhd3JpdGUoaW5vZGUtPmlfbWFwcGluZyk7CisJbmZzX3diX2FsbChpbm9kZSk7CisJZmlsZW1hcF9mZGF0YXdhaXQoaW5vZGUtPmlfbWFwcGluZyk7Cit9CisKKy8qCisgKiBCYXNpYyBwcm9jZWR1cmUgZm9yIHJldHVybmluZyBhIGRlbGVnYXRpb24gdG8gdGhlIHNlcnZlcgorICovCitpbnQgbmZzX2lub2RlX3JldHVybl9kZWxlZ2F0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHAgPSBORlNfU0VSVkVSKGlub2RlKS0+bmZzNF9zdGF0ZTsKKwlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOworCXN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbjsKKwlpbnQgcmVzID0gMDsKKworCW5mc19tc3luY19pbm9kZShpbm9kZSk7CisJZG93bl9yZWFkKCZjbHAtPmNsX3NlbSk7CisJLyogR3VhcmQgYWdhaW5zdCBuZXcgZGVsZWdhdGVkIG9wZW4gY2FsbHMgKi8KKwlkb3duX3dyaXRlKCZuZnNpLT5yd3NlbSk7CisJc3Bpbl9sb2NrKCZjbHAtPmNsX2xvY2spOworCWRlbGVnYXRpb24gPSBuZnNpLT5kZWxlZ2F0aW9uOworCWlmIChkZWxlZ2F0aW9uICE9IE5VTEwpIHsKKwkJbGlzdF9kZWxfaW5pdCgmZGVsZWdhdGlvbi0+c3VwZXJfbGlzdCk7CisJCW5mc2ktPmRlbGVnYXRpb24gPSBOVUxMOworCQluZnNpLT5kZWxlZ2F0aW9uX3N0YXRlID0gMDsKKwl9CisJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7CisJbmZzX2RlbGVnYXRpb25fY2xhaW1fb3BlbnMoaW5vZGUpOworCXVwX3dyaXRlKCZuZnNpLT5yd3NlbSk7CisJdXBfcmVhZCgmY2xwLT5jbF9zZW0pOworCW5mc19tc3luY19pbm9kZShpbm9kZSk7CisKKwlpZiAoZGVsZWdhdGlvbiAhPSBOVUxMKQorCQlyZXMgPSBuZnNfZG9fcmV0dXJuX2RlbGVnYXRpb24oaW5vZGUsIGRlbGVnYXRpb24pOworCXJldHVybiByZXM7Cit9CisKKy8qCisgKiBSZXR1cm4gYWxsIGRlbGVnYXRpb25zIGFzc29jaWF0ZWQgdG8gYSBzdXBlciBibG9jaworICovCit2b2lkIG5mc19yZXR1cm5fYWxsX2RlbGVnYXRpb25zKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHAgPSBORlNfU0Ioc2IpLT5uZnM0X3N0YXRlOworCXN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJaWYgKGNscCA9PSBOVUxMKQorCQlyZXR1cm47CityZXN0YXJ0OgorCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRlbGVnYXRpb24sICZjbHAtPmNsX2RlbGVnYXRpb25zLCBzdXBlcl9saXN0KSB7CisJCWlmIChkZWxlZ2F0aW9uLT5pbm9kZS0+aV9zYiAhPSBzYikKKwkJCWNvbnRpbnVlOworCQlpbm9kZSA9IGlncmFiKGRlbGVnYXRpb24tPmlub2RlKTsKKwkJaWYgKGlub2RlID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7CisJCW5mc19pbm9kZV9yZXR1cm5fZGVsZWdhdGlvbihpbm9kZSk7CisJCWlwdXQoaW5vZGUpOworCQlnb3RvIHJlc3RhcnQ7CisJfQorCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOworfQorCisvKgorICogUmV0dXJuIGFsbCBkZWxlZ2F0aW9ucyBmb2xsb3dpbmcgYW4gTkZTNEVSUl9DQl9QQVRIX0RPV04gZXJyb3IuCisgKi8KK3ZvaWQgbmZzX2hhbmRsZV9jYl9wYXRoZG93bihzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCkKK3sKKwlzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb247CisJc3RydWN0IGlub2RlICppbm9kZTsKKworCWlmIChjbHAgPT0gTlVMTCkKKwkJcmV0dXJuOworcmVzdGFydDoKKwlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZWxlZ2F0aW9uLCAmY2xwLT5jbF9kZWxlZ2F0aW9ucywgc3VwZXJfbGlzdCkgeworCQlpbm9kZSA9IGlncmFiKGRlbGVnYXRpb24tPmlub2RlKTsKKwkJaWYgKGlub2RlID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7CisJCW5mc19pbm9kZV9yZXR1cm5fZGVsZWdhdGlvbihpbm9kZSk7CisJCWlwdXQoaW5vZGUpOworCQlnb3RvIHJlc3RhcnQ7CisJfQorCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOworfQorCitzdHJ1Y3QgcmVjYWxsX3RocmVhZGFyZ3MgeworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHA7CisJY29uc3QgbmZzNF9zdGF0ZWlkICpzdGF0ZWlkOworCisJc3RydWN0IGNvbXBsZXRpb24gc3RhcnRlZDsKKwlpbnQgcmVzdWx0OworfTsKKworc3RhdGljIGludCByZWNhbGxfdGhyZWFkKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHJlY2FsbF90aHJlYWRhcmdzICphcmdzID0gKHN0cnVjdCByZWNhbGxfdGhyZWFkYXJncyAqKWRhdGE7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGlncmFiKGFyZ3MtPmlub2RlKTsKKwlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCA9IE5GU19TRVJWRVIoaW5vZGUpLT5uZnM0X3N0YXRlOworCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CisJc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uOworCisJZGFlbW9uaXplKCJuZnN2NC1kZWxlZ3JldHVybiIpOworCisJbmZzX21zeW5jX2lub2RlKGlub2RlKTsKKwlkb3duX3JlYWQoJmNscC0+Y2xfc2VtKTsKKwlkb3duX3dyaXRlKCZuZnNpLT5yd3NlbSk7CisJc3Bpbl9sb2NrKCZjbHAtPmNsX2xvY2spOworCWRlbGVnYXRpb24gPSBuZnNpLT5kZWxlZ2F0aW9uOworCWlmIChkZWxlZ2F0aW9uICE9IE5VTEwgJiYgbWVtY21wKGRlbGVnYXRpb24tPnN0YXRlaWQuZGF0YSwKKwkJCQlhcmdzLT5zdGF0ZWlkLT5kYXRhLAorCQkJCXNpemVvZihkZWxlZ2F0aW9uLT5zdGF0ZWlkLmRhdGEpKSA9PSAwKSB7CisJCWxpc3RfZGVsX2luaXQoJmRlbGVnYXRpb24tPnN1cGVyX2xpc3QpOworCQluZnNpLT5kZWxlZ2F0aW9uID0gTlVMTDsKKwkJbmZzaS0+ZGVsZWdhdGlvbl9zdGF0ZSA9IDA7CisJCWFyZ3MtPnJlc3VsdCA9IDA7CisJfSBlbHNlIHsKKwkJZGVsZWdhdGlvbiA9IE5VTEw7CisJCWFyZ3MtPnJlc3VsdCA9IC1FTk9FTlQ7CisJfQorCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOworCWNvbXBsZXRlKCZhcmdzLT5zdGFydGVkKTsKKwluZnNfZGVsZWdhdGlvbl9jbGFpbV9vcGVucyhpbm9kZSk7CisJdXBfd3JpdGUoJm5mc2ktPnJ3c2VtKTsKKwl1cF9yZWFkKCZjbHAtPmNsX3NlbSk7CisJbmZzX21zeW5jX2lub2RlKGlub2RlKTsKKworCWlmIChkZWxlZ2F0aW9uICE9IE5VTEwpCisJCW5mc19kb19yZXR1cm5fZGVsZWdhdGlvbihpbm9kZSwgZGVsZWdhdGlvbik7CisJaXB1dChpbm9kZSk7CisJbW9kdWxlX3B1dF9hbmRfZXhpdCgwKTsKK30KKworLyoKKyAqIEFzeW5jaHJvbm91cyBkZWxlZ2F0aW9uIHJlY2FsbCEKKyAqLworaW50IG5mc19hc3luY19pbm9kZV9yZXR1cm5fZGVsZWdhdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBuZnM0X3N0YXRlaWQgKnN0YXRlaWQpCit7CisJc3RydWN0IHJlY2FsbF90aHJlYWRhcmdzIGRhdGEgPSB7CisJCS5pbm9kZSA9IGlub2RlLAorCQkuc3RhdGVpZCA9IHN0YXRlaWQsCisJfTsKKwlpbnQgc3RhdHVzOworCisJaW5pdF9jb21wbGV0aW9uKCZkYXRhLnN0YXJ0ZWQpOworCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisJc3RhdHVzID0ga2VybmVsX3RocmVhZChyZWNhbGxfdGhyZWFkLCAmZGF0YSwgQ0xPTkVfS0VSTkVMKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBvdXRfbW9kdWxlX3B1dDsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZkYXRhLnN0YXJ0ZWQpOworCXJldHVybiBkYXRhLnJlc3VsdDsKK291dF9tb2R1bGVfcHV0OgorCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBSZXRyaWV2ZSB0aGUgaW5vZGUgYXNzb2NpYXRlZCB3aXRoIGEgZGVsZWdhdGlvbgorICovCitzdHJ1Y3QgaW5vZGUgKm5mc19kZWxlZ2F0aW9uX2ZpbmRfaW5vZGUoc3RydWN0IG5mczRfY2xpZW50ICpjbHAsIGNvbnN0IHN0cnVjdCBuZnNfZmggKmZoYW5kbGUpCit7CisJc3RydWN0IG5mc19kZWxlZ2F0aW9uICpkZWxlZ2F0aW9uOworCXN0cnVjdCBpbm9kZSAqcmVzID0gTlVMTDsKKwlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZWxlZ2F0aW9uLCAmY2xwLT5jbF9kZWxlZ2F0aW9ucywgc3VwZXJfbGlzdCkgeworCQlpZiAobmZzX2NvbXBhcmVfZmgoZmhhbmRsZSwgJk5GU19JKGRlbGVnYXRpb24tPmlub2RlKS0+ZmgpID09IDApIHsKKwkJCXJlcyA9IGlncmFiKGRlbGVnYXRpb24tPmlub2RlKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOworCXJldHVybiByZXM7Cit9CisKKy8qCisgKiBNYXJrIGFsbCBkZWxlZ2F0aW9ucyBhcyBuZWVkaW5nIHRvIGJlIHJlY2xhaW1lZAorICovCit2b2lkIG5mc19kZWxlZ2F0aW9uX21hcmtfcmVjbGFpbShzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCkKK3sKKwlzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb247CisJc3Bpbl9sb2NrKCZjbHAtPmNsX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGVsZWdhdGlvbiwgJmNscC0+Y2xfZGVsZWdhdGlvbnMsIHN1cGVyX2xpc3QpCisJCWRlbGVnYXRpb24tPmZsYWdzIHw9IE5GU19ERUxFR0FUSU9OX05FRURfUkVDTEFJTTsKKwlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKK30KKworLyoKKyAqIFJlYXAgYWxsIHVuY2xhaW1lZCBkZWxlZ2F0aW9ucyBhZnRlciByZWJvb3QgcmVjb3ZlcnkgaXMgZG9uZQorICovCit2b2lkIG5mc19kZWxlZ2F0aW9uX3JlYXBfdW5jbGFpbWVkKHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwKQoreworCXN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbiwgKm47CisJTElTVF9IRUFEKGhlYWQpOworCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGVsZWdhdGlvbiwgbiwgJmNscC0+Y2xfZGVsZWdhdGlvbnMsIHN1cGVyX2xpc3QpIHsKKwkJaWYgKChkZWxlZ2F0aW9uLT5mbGFncyAmIE5GU19ERUxFR0FUSU9OX05FRURfUkVDTEFJTSkgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlsaXN0X21vdmUoJmRlbGVnYXRpb24tPnN1cGVyX2xpc3QsICZoZWFkKTsKKwkJTkZTX0koZGVsZWdhdGlvbi0+aW5vZGUpLT5kZWxlZ2F0aW9uID0gTlVMTDsKKwkJTkZTX0koZGVsZWdhdGlvbi0+aW5vZGUpLT5kZWxlZ2F0aW9uX3N0YXRlID0gMDsKKwl9CisJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7CisJd2hpbGUoIWxpc3RfZW1wdHkoJmhlYWQpKSB7CisJCWRlbGVnYXRpb24gPSBsaXN0X2VudHJ5KGhlYWQubmV4dCwgc3RydWN0IG5mc19kZWxlZ2F0aW9uLCBzdXBlcl9saXN0KTsKKwkJbGlzdF9kZWwoJmRlbGVnYXRpb24tPnN1cGVyX2xpc3QpOworCQluZnNfZnJlZV9kZWxlZ2F0aW9uKGRlbGVnYXRpb24pOworCX0KK30KZGlmZiAtLWdpdCBhL2ZzL25mcy9kZWxlZ2F0aW9uLmggYi9mcy9uZnMvZGVsZWdhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNmM0NWEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnMvZGVsZWdhdGlvbi5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBsaW51eC9mcy9uZnMvZGVsZWdhdGlvbi5oCisgKgorICogQ29weXJpZ2h0IChjKSBUcm9uZCBNeWtsZWJ1c3QKKyAqCisgKiBEZWZpbml0aW9ucyBwZXJ0YWluaW5nIHRvIE5GUyBkZWxlZ2F0ZWQgZmlsZXMKKyAqLworI2lmbmRlZiBGU19ORlNfREVMRUdBVElPTl9ICisjZGVmaW5lIEZTX05GU19ERUxFR0FUSU9OX0gKKworI2lmIGRlZmluZWQoQ09ORklHX05GU19WNCkKKy8qCisgKiBORlN2NCBkZWxlZ2F0aW9uCisgKi8KK3N0cnVjdCBuZnNfZGVsZWdhdGlvbiB7CisJc3RydWN0IGxpc3RfaGVhZCBzdXBlcl9saXN0OworCXN0cnVjdCBycGNfY3JlZCAqY3JlZDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCW5mczRfc3RhdGVpZCBzdGF0ZWlkOworCWludCB0eXBlOworI2RlZmluZSBORlNfREVMRUdBVElPTl9ORUVEX1JFQ0xBSU0gMQorCWxvbmcgZmxhZ3M7CisJbG9mZl90IG1heHNpemU7Cit9OworCitpbnQgbmZzX2lub2RlX3NldF9kZWxlZ2F0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBycGNfY3JlZCAqY3JlZCwgc3RydWN0IG5mc19vcGVucmVzICpyZXMpOwordm9pZCBuZnNfaW5vZGVfcmVjbGFpbV9kZWxlZ2F0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBycGNfY3JlZCAqY3JlZCwgc3RydWN0IG5mc19vcGVucmVzICpyZXMpOworaW50IG5mc19pbm9kZV9yZXR1cm5fZGVsZWdhdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK2ludCBuZnNfYXN5bmNfaW5vZGVfcmV0dXJuX2RlbGVnYXRpb24oc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgbmZzNF9zdGF0ZWlkICpzdGF0ZWlkKTsKKworc3RydWN0IGlub2RlICpuZnNfZGVsZWdhdGlvbl9maW5kX2lub2RlKHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwLCBjb25zdCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlKTsKK3ZvaWQgbmZzX3JldHVybl9hbGxfZGVsZWdhdGlvbnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7Cit2b2lkIG5mc19oYW5kbGVfY2JfcGF0aGRvd24oc3RydWN0IG5mczRfY2xpZW50ICpjbHApOworCit2b2lkIG5mc19kZWxlZ2F0aW9uX21hcmtfcmVjbGFpbShzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCk7Cit2b2lkIG5mc19kZWxlZ2F0aW9uX3JlYXBfdW5jbGFpbWVkKHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwKTsKKworLyogTkZTdjQgZGVsZWdhdGlvbi1yZWxhdGVkIHByb2NlZHVyZXMgKi8KK2ludCBuZnM0X3Byb2NfZGVsZWdyZXR1cm4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHJwY19jcmVkICpjcmVkLCBjb25zdCBuZnM0X3N0YXRlaWQgKnN0YXRlaWQpOworaW50IG5mczRfb3Blbl9kZWxlZ2F0aW9uX3JlY2FsbChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSk7CisKK3N0YXRpYyBpbmxpbmUgaW50IG5mc19oYXZlX2RlbGVnYXRpb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZsYWdzKQoreworCWZsYWdzICY9IEZNT0RFX1JFQUR8Rk1PREVfV1JJVEU7CisJc21wX3JtYigpOworCWlmICgoTkZTX0koaW5vZGUpLT5kZWxlZ2F0aW9uX3N0YXRlICYgZmxhZ3MpID09IGZsYWdzKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBuZnNfaGF2ZV9kZWxlZ2F0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmbGFncykKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL25mcy9kaXIuYyBiL2ZzL25mcy9kaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2Y5NmFjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzL2Rpci5jCkBAIC0wLDAgKzEsMTU2MiBAQAorLyoKKyAqICBsaW51eC9mcy9uZnMvZGlyLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkyICBSaWNrIFNsYWRrZXkKKyAqCisgKiAgbmZzIGRpcmVjdG9yeSBoYW5kbGluZyBmdW5jdGlvbnMKKyAqCisgKiAxMCBBcHIgMTk5NglBZGRlZCBzaWxseSByZW5hbWUgZm9yIHVubGluawktLW9raXIKKyAqIDI4IFNlcCAxOTk2CUltcHJvdmVkIGRpcmVjdG9yeSBjYWNoZSAtLW9raXIKKyAqIDIzIEF1ZyAxOTk3ICBDbGF1cyBIZWluZSBjbGF1c0Btb21vLm1hdGgucnd0aC1hYWNoZW4uZGUgCisgKiAgICAgICAgICAgICAgUmUtaW1wbGVtZW50ZWQgc2lsbHkgcmVuYW1lIGZvciB1bmxpbmssIG5ld2x5IGltcGxlbWVudGVkCisgKiAgICAgICAgICAgICAgc2lsbHkgcmVuYW1lIGZvciBuZnNfcmVuYW1lKCkgZm9sbG93aW5nIHRoZSBzdWdnZXN0aW9ucworICogICAgICAgICAgICAgIG9mIE9sYWYgS2lyY2ggKG9raXIpIGZvdW5kIGluIHRoaXMgZmlsZS4KKyAqICAgICAgICAgICAgICBGb2xsb3dpbmcgTGludXMgY29tbWVudHMgb24gbXkgb3JpZ2luYWwgaGFjaywgdGhpcyB2ZXJzaW9uCisgKiAgICAgICAgICAgICAgZGVwZW5kcyBvbmx5IG9uIHRoZSBkY2FjaGUgc3R1ZmYgYW5kIGRvZXNuJ3QgdG91Y2ggdGhlIGlub2RlCisgKiAgICAgICAgICAgICAgbGF5ZXIgKGlwdXQoKSBhbmQgZnJpZW5kcykuCisgKiAgNiBKdW4gMTk5OQlDYWNoZSByZWFkZGlyIGxvb2t1cHMgaW4gdGhlIHBhZ2UgY2FjaGUuIC1EYXZlTQorICovCisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisKKyNpbmNsdWRlICJkZWxlZ2F0aW9uLmgiCisKKyNkZWZpbmUgTkZTX1BBUkFOT0lBIDEKKy8qICNkZWZpbmUgTkZTX0RFQlVHX1ZFUkJPU0UgMSAqLworCitzdGF0aWMgaW50IG5mc19vcGVuZGlyKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKK3N0YXRpYyBpbnQgbmZzX3JlYWRkaXIoc3RydWN0IGZpbGUgKiwgdm9pZCAqLCBmaWxsZGlyX3QpOworc3RhdGljIHN0cnVjdCBkZW50cnkgKm5mc19sb29rdXAoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IG5hbWVpZGF0YSAqKTsKK3N0YXRpYyBpbnQgbmZzX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLCBpbnQsIHN0cnVjdCBuYW1laWRhdGEgKik7CitzdGF0aWMgaW50IG5mc19ta2RpcihzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLCBpbnQpOworc3RhdGljIGludCBuZnNfcm1kaXIoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKik7CitzdGF0aWMgaW50IG5mc191bmxpbmsoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKik7CitzdGF0aWMgaW50IG5mc19zeW1saW5rKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIGNvbnN0IGNoYXIgKik7CitzdGF0aWMgaW50IG5mc19saW5rKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKik7CitzdGF0aWMgaW50IG5mc19ta25vZChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLCBpbnQsIGRldl90KTsKK3N0YXRpYyBpbnQgbmZzX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqLAorCQkgICAgICBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqKTsKK3N0YXRpYyBpbnQgbmZzX2ZzeW5jX2RpcihzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCk7CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgbmZzX2Rpcl9vcGVyYXRpb25zID0geworCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIJPSBuZnNfcmVhZGRpciwKKwkub3BlbgkJPSBuZnNfb3BlbmRpciwKKwkucmVsZWFzZQk9IG5mc19yZWxlYXNlLAorCS5mc3luYwkJPSBuZnNfZnN5bmNfZGlyLAorfTsKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgbmZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0geworCS5jcmVhdGUJCT0gbmZzX2NyZWF0ZSwKKwkubG9va3VwCQk9IG5mc19sb29rdXAsCisJLmxpbmsJCT0gbmZzX2xpbmssCisJLnVubGluawkJPSBuZnNfdW5saW5rLAorCS5zeW1saW5rCT0gbmZzX3N5bWxpbmssCisJLm1rZGlyCQk9IG5mc19ta2RpciwKKwkucm1kaXIJCT0gbmZzX3JtZGlyLAorCS5ta25vZAkJPSBuZnNfbWtub2QsCisJLnJlbmFtZQkJPSBuZnNfcmVuYW1lLAorCS5wZXJtaXNzaW9uCT0gbmZzX3Blcm1pc3Npb24sCisJLmdldGF0dHIJPSBuZnNfZ2V0YXR0ciwKKwkuc2V0YXR0cgk9IG5mc19zZXRhdHRyLAorfTsKKworI2lmZGVmIENPTkZJR19ORlNfVjQKKworc3RhdGljIHN0cnVjdCBkZW50cnkgKm5mc19hdG9taWNfbG9va3VwKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBuYW1laWRhdGEgKik7CitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBuZnM0X2Rpcl9pbm9kZV9vcGVyYXRpb25zID0geworCS5jcmVhdGUJCT0gbmZzX2NyZWF0ZSwKKwkubG9va3VwCQk9IG5mc19hdG9taWNfbG9va3VwLAorCS5saW5rCQk9IG5mc19saW5rLAorCS51bmxpbmsJCT0gbmZzX3VubGluaywKKwkuc3ltbGluawk9IG5mc19zeW1saW5rLAorCS5ta2RpcgkJPSBuZnNfbWtkaXIsCisJLnJtZGlyCQk9IG5mc19ybWRpciwKKwkubWtub2QJCT0gbmZzX21rbm9kLAorCS5yZW5hbWUJCT0gbmZzX3JlbmFtZSwKKwkucGVybWlzc2lvbgk9IG5mc19wZXJtaXNzaW9uLAorCS5nZXRhdHRyCT0gbmZzX2dldGF0dHIsCisJLnNldGF0dHIJPSBuZnNfc2V0YXR0ciwKK307CisKKyNlbmRpZiAvKiBDT05GSUdfTkZTX1Y0ICovCisKKy8qCisgKiBPcGVuIGZpbGUKKyAqLworc3RhdGljIGludAorbmZzX29wZW5kaXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJaW50IHJlcyA9IDA7CisKKwlsb2NrX2tlcm5lbCgpOworCS8qIENhbGwgZ2VuZXJpYyBvcGVuIGNvZGUgaW4gb3JkZXIgdG8gY2FjaGUgY3JlZGVudGlhbHMgKi8KKwlpZiAoIXJlcykKKwkJcmVzID0gbmZzX29wZW4oaW5vZGUsIGZpbHApOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmVzOworfQorCit0eXBlZGVmIHUzMiAqICgqZGVjb2RlX2RpcmVudF90KSh1MzIgKiwgc3RydWN0IG5mc19lbnRyeSAqLCBpbnQpOwordHlwZWRlZiBzdHJ1Y3QgeworCXN0cnVjdCBmaWxlCSpmaWxlOworCXN0cnVjdCBwYWdlCSpwYWdlOworCXVuc2lnbmVkIGxvbmcJcGFnZV9pbmRleDsKKwl1MzIJCSpwdHI7CisJdTY0CQl0YXJnZXQ7CisJc3RydWN0IG5mc19lbnRyeSAqZW50cnk7CisJZGVjb2RlX2RpcmVudF90CWRlY29kZTsKKwlpbnQJCXBsdXM7CisJaW50CQllcnJvcjsKK30gbmZzX3JlYWRkaXJfZGVzY3JpcHRvcl90OworCisvKiBOb3cgd2UgY2FjaGUgZGlyZWN0b3JpZXMgcHJvcGVybHksIGJ5IHN0dWZmaW5nIHRoZSBkaXJlbnQKKyAqIGRhdGEgZGlyZWN0bHkgaW4gdGhlIHBhZ2UgY2FjaGUuCisgKgorICogSW5vZGUgaW52YWxpZGF0aW9uIGR1ZSB0byByZWZyZXNoIGV0Yy4gdGFrZXMgY2FyZSBvZgorICogX2V2ZXJ5dGhpbmdfLCBubyBzbG9wcHkgZW50cnkgZmx1c2hpbmcgbG9naWMsIG5vIGV4dHJhbmVvdXMKKyAqIGNvcHlpbmcsIG5ldHdvcmsgZGlyZWN0IHRvIHBhZ2UgY2FjaGUsIHRoZSB3YXkgaXQgd2FzIG1lYW50CisgKiB0byBiZS4KKyAqCisgKiBOT1RFOiBEaXJlbnQgaW5mb3JtYXRpb24gdmVyaWZpY2F0aW9uIGlzIGRvbmUgYWx3YXlzIGJ5IHRoZQorICoJIHBhZ2UtaW4gb2YgdGhlIFJQQyByZXBseSwgbm93aGVyZSBlbHNlLCB0aGlzIHNpbXBsaWVzCisgKgkgdGhpbmdzIHN1YnN0YW50aWFsbHkuCisgKi8KK3N0YXRpYworaW50IG5mc19yZWFkZGlyX2ZpbGxlcihuZnNfcmVhZGRpcl9kZXNjcmlwdG9yX3QgKmRlc2MsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBmaWxlCSpmaWxlID0gZGVzYy0+ZmlsZTsKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHJwY19jcmVkCSpjcmVkID0gbmZzX2ZpbGVfY3JlZChmaWxlKTsKKwl1bnNpZ25lZCBsb25nCXRpbWVzdGFtcDsKKwlpbnQJCWVycm9yOworCisJZGZwcmludGsoVkZTLCAiTkZTOiBuZnNfcmVhZGRpcl9maWxsZXIoKSByZWFkaW5nIGNvb2tpZSAlTHUgaW50byBwYWdlICVsdS5cbiIsIChsb25nIGxvbmcpZGVzYy0+ZW50cnktPmNvb2tpZSwgcGFnZS0+aW5kZXgpOworCisgYWdhaW46CisJdGltZXN0YW1wID0gamlmZmllczsKKwllcnJvciA9IE5GU19QUk9UTyhpbm9kZSktPnJlYWRkaXIoZmlsZS0+Zl9kZW50cnksIGNyZWQsIGRlc2MtPmVudHJ5LT5jb29raWUsIHBhZ2UsCisJCQkJCSAgTkZTX1NFUlZFUihpbm9kZSktPmR0c2l6ZSwgZGVzYy0+cGx1cyk7CisJaWYgKGVycm9yIDwgMCkgeworCQkvKiBXZSByZXF1ZXN0ZWQgUkVBRERJUlBMVVMsIGJ1dCB0aGUgc2VydmVyIGRvZXNuJ3QgZ3JvayBpdCAqLworCQlpZiAoZXJyb3IgPT0gLUVOT1RTVVBQICYmIGRlc2MtPnBsdXMpIHsKKwkJCU5GU19TRVJWRVIoaW5vZGUpLT5jYXBzICY9IH5ORlNfQ0FQX1JFQURESVJQTFVTOworCQkJTkZTX0ZMQUdTKGlub2RlKSAmPSB+TkZTX0lOT19BRFZJU0VfUkRQTFVTOworCQkJZGVzYy0+cGx1cyA9IDA7CisJCQlnb3RvIGFnYWluOworCQl9CisJCWdvdG8gZXJyb3I7CisJfQorCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwlORlNfRkxBR1MoaW5vZGUpIHw9IE5GU19JTk9fSU5WQUxJRF9BVElNRTsKKwkvKiBFbnN1cmUgY29uc2lzdGVudCBwYWdlIGFsaWdubWVudCBvZiB0aGUgZGF0YS4KKwkgKiBOb3RlOiBhc3N1bWVzIHdlIGhhdmUgZXhjbHVzaXZlIGFjY2VzcyB0byB0aGlzIG1hcHBpbmcgZWl0aGVyCisJICoJIHRocm91Z2h0IGlub2RlLT5pX3NlbSBvciBzb21lIG90aGVyIG1lY2hhbmlzbS4KKwkgKi8KKwlpZiAocGFnZS0+aW5kZXggPT0gMCkgeworCQlpbnZhbGlkYXRlX2lub2RlX3BhZ2VzKGlub2RlLT5pX21hcHBpbmcpOworCQlORlNfSShpbm9kZSktPnJlYWRkaXJfdGltZXN0YW1wID0gdGltZXN0YW1wOworCX0KKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXR1cm4gMDsKKyBlcnJvcjoKKwlTZXRQYWdlRXJyb3IocGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJbmZzX3phcF9jYWNoZXMoaW5vZGUpOworCWRlc2MtPmVycm9yID0gZXJyb3I7CisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbmxpbmUKK2ludCBkaXJfZGVjb2RlKG5mc19yZWFkZGlyX2Rlc2NyaXB0b3JfdCAqZGVzYykKK3sKKwl1MzIJKnAgPSBkZXNjLT5wdHI7CisJcCA9IGRlc2MtPmRlY29kZShwLCBkZXNjLT5lbnRyeSwgZGVzYy0+cGx1cyk7CisJaWYgKElTX0VSUihwKSkKKwkJcmV0dXJuIFBUUl9FUlIocCk7CisJZGVzYy0+cHRyID0gcDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZQordm9pZCBkaXJfcGFnZV9yZWxlYXNlKG5mc19yZWFkZGlyX2Rlc2NyaXB0b3JfdCAqZGVzYykKK3sKKwlrdW5tYXAoZGVzYy0+cGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKGRlc2MtPnBhZ2UpOworCWRlc2MtPnBhZ2UgPSBOVUxMOworCWRlc2MtPnB0ciA9IE5VTEw7Cit9CisKKy8qCisgKiBHaXZlbiBhIHBvaW50ZXIgdG8gYSBidWZmZXIgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGZpbGxlZCBieSBhIGNhbGwKKyAqIHRvIHJlYWRkaXIsIGZpbmQgdGhlIG5leHQgZW50cnkuCisgKgorICogSWYgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIGhhcyBiZWVuIHJlYWNoZWQsIHJldHVybiAtRUFHQUlOLCBpZiBub3QsCisgKiByZXR1cm4gdGhlIG9mZnNldCB3aXRoaW4gdGhlIGJ1ZmZlciBvZiB0aGUgbmV4dCBlbnRyeSB0byBiZQorICogcmVhZC4KKyAqLworc3RhdGljIGlubGluZQoraW50IGZpbmRfZGlyZW50KG5mc19yZWFkZGlyX2Rlc2NyaXB0b3JfdCAqZGVzYywgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJc3RydWN0IG5mc19lbnRyeSAqZW50cnkgPSBkZXNjLT5lbnRyeTsKKwlpbnQJCWxvb3BfY291bnQgPSAwLAorCQkJc3RhdHVzOworCisJd2hpbGUoKHN0YXR1cyA9IGRpcl9kZWNvZGUoZGVzYykpID09IDApIHsKKwkJZGZwcmludGsoVkZTLCAiTkZTOiBmb3VuZCBjb29raWUgJUx1XG4iLCAobG9uZyBsb25nKWVudHJ5LT5jb29raWUpOworCQlpZiAoZW50cnktPnByZXZfY29va2llID09IGRlc2MtPnRhcmdldCkKKwkJCWJyZWFrOworCQlpZiAobG9vcF9jb3VudCsrID4gMjAwKSB7CisJCQlsb29wX2NvdW50ID0gMDsKKwkJCXNjaGVkdWxlKCk7CisJCX0KKwl9CisJZGZwcmludGsoVkZTLCAiTkZTOiBmaW5kX2RpcmVudCgpIHJldHVybnMgJWRcbiIsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEZpbmQgdGhlIGdpdmVuIHBhZ2UsIGFuZCBjYWxsIGZpbmRfZGlyZW50KCkgaW4gb3JkZXIgdG8gdHJ5IHRvCisgKiByZXR1cm4gdGhlIG5leHQgZW50cnkuCisgKi8KK3N0YXRpYyBpbmxpbmUKK2ludCBmaW5kX2RpcmVudF9wYWdlKG5mc19yZWFkZGlyX2Rlc2NyaXB0b3JfdCAqZGVzYykKK3sKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gZGVzYy0+ZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHBhZ2UJKnBhZ2U7CisJaW50CQlzdGF0dXM7CisKKwlkZnByaW50ayhWRlMsICJORlM6IGZpbmRfZGlyZW50X3BhZ2UoKSBzZWFyY2hpbmcgZGlyZWN0b3J5IHBhZ2UgJWxkXG4iLCBkZXNjLT5wYWdlX2luZGV4KTsKKworCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgZGVzYy0+cGFnZV9pbmRleCwKKwkJCSAgICAgICAoZmlsbGVyX3QgKiluZnNfcmVhZGRpcl9maWxsZXIsIGRlc2MpOworCWlmIChJU19FUlIocGFnZSkpIHsKKwkJc3RhdHVzID0gUFRSX0VSUihwYWdlKTsKKwkJZ290byBvdXQ7CisJfQorCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpKQorCQlnb3RvIHJlYWRfZXJyb3I7CisKKwkvKiBOT1RFOiBTb21lb25lIGVsc2UgbWF5IGhhdmUgY2hhbmdlZCB0aGUgUkVBRERJUlBMVVMgZmxhZyAqLworCWRlc2MtPnBhZ2UgPSBwYWdlOworCWRlc2MtPnB0ciA9IGttYXAocGFnZSk7CQkvKiBtYXRjaGluZyBrdW5tYXAgaW4gbmZzX2RvX2ZpbGxkaXIgKi8KKwlzdGF0dXMgPSBmaW5kX2RpcmVudChkZXNjLCBwYWdlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZGlyX3BhZ2VfcmVsZWFzZShkZXNjKTsKKyBvdXQ6CisJZGZwcmludGsoVkZTLCAiTkZTOiBmaW5kX2RpcmVudF9wYWdlKCkgcmV0dXJucyAlZFxuIiwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworIHJlYWRfZXJyb3I6CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCXJldHVybiAtRUlPOworfQorCisvKgorICogUmVjdXJzZSB0aHJvdWdoIHRoZSBwYWdlIGNhY2hlIHBhZ2VzLCBhbmQgcmV0dXJuIGEKKyAqIGZpbGxlZCBuZnNfZW50cnkgc3RydWN0dXJlIG9mIHRoZSBuZXh0IGRpcmVjdG9yeSBlbnRyeSBpZiBwb3NzaWJsZS4KKyAqCisgKiBUaGUgdGFyZ2V0IGZvciB0aGUgc2VhcmNoIGlzICdkZXNjLT50YXJnZXQnLgorICovCitzdGF0aWMgaW5saW5lCitpbnQgcmVhZGRpcl9zZWFyY2hfcGFnZWNhY2hlKG5mc19yZWFkZGlyX2Rlc2NyaXB0b3JfdCAqZGVzYykKK3sKKwlpbnQJCWxvb3BfY291bnQgPSAwOworCWludAkJcmVzOworCisJZGZwcmludGsoVkZTLCAiTkZTOiByZWFkZGlyX3NlYXJjaF9wYWdlY2FjaGUoKSBzZWFyY2hpbmcgZm9yIGNvb2tpZSAlTHVcbiIsIChsb25nIGxvbmcpZGVzYy0+dGFyZ2V0KTsKKwlmb3IgKDs7KSB7CisJCXJlcyA9IGZpbmRfZGlyZW50X3BhZ2UoZGVzYyk7CisJCWlmIChyZXMgIT0gLUVBR0FJTikKKwkJCWJyZWFrOworCQkvKiBBbGlnbiB0byBiZWdpbm5pbmcgb2YgbmV4dCBwYWdlICovCisJCWRlc2MtPnBhZ2VfaW5kZXggKys7CisJCWlmIChsb29wX2NvdW50KysgPiAyMDApIHsKKwkJCWxvb3BfY291bnQgPSAwOworCQkJc2NoZWR1bGUoKTsKKwkJfQorCX0KKwlkZnByaW50ayhWRlMsICJORlM6IHJlYWRkaXJfc2VhcmNoX3BhZ2VjYWNoZSgpIHJldHVybmVkICVkXG4iLCByZXMpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGR0X3R5cGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gKGlub2RlLT5pX21vZGUgPj4gMTIpICYgMTU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpuZnNfcmVhZGRpcl9sb29rdXAobmZzX3JlYWRkaXJfZGVzY3JpcHRvcl90ICpkZXNjKTsKKworLyoKKyAqIE9uY2Ugd2UndmUgZm91bmQgdGhlIHN0YXJ0IG9mIHRoZSBkaXJlbnQgd2l0aGluIGEgcGFnZTogZmlsbCAnZXIgdXAuLi4KKyAqLworc3RhdGljIAoraW50IG5mc19kb19maWxsZGlyKG5mc19yZWFkZGlyX2Rlc2NyaXB0b3JfdCAqZGVzYywgdm9pZCAqZGlyZW50LAorCQkgICBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwlzdHJ1Y3QgZmlsZQkqZmlsZSA9IGRlc2MtPmZpbGU7CisJc3RydWN0IG5mc19lbnRyeSAqZW50cnkgPSBkZXNjLT5lbnRyeTsKKwlzdHJ1Y3QgZGVudHJ5CSpkZW50cnkgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcJZmlsZWlkOworCWludAkJbG9vcF9jb3VudCA9IDAsCisJCQlyZXM7CisKKwlkZnByaW50ayhWRlMsICJORlM6IG5mc19kb19maWxsZGlyKCkgZmlsbGluZyBzdGFydGluZyBAIGNvb2tpZSAlTHVcbiIsIChsb25nIGxvbmcpZGVzYy0+dGFyZ2V0KTsKKworCWZvcig7OykgeworCQl1bnNpZ25lZCBkX3R5cGUgPSBEVF9VTktOT1dOOworCQkvKiBOb3RlOiBlbnRyeS0+cHJldl9jb29raWUgY29udGFpbnMgdGhlIGNvb2tpZSBmb3IKKwkJICoJIHJldHJpZXZpbmcgdGhlIGN1cnJlbnQgZGlyZW50IG9uIHRoZSBzZXJ2ZXIgKi8KKwkJZmlsZWlkID0gbmZzX2ZpbGVpZF90b19pbm9fdChlbnRyeS0+aW5vKTsKKworCQkvKiBHZXQgYSBkZW50cnkgaWYgd2UgaGF2ZSBvbmUgKi8KKwkJaWYgKGRlbnRyeSAhPSBOVUxMKQorCQkJZHB1dChkZW50cnkpOworCQlkZW50cnkgPSBuZnNfcmVhZGRpcl9sb29rdXAoZGVzYyk7CisKKwkJLyogVXNlIHJlYWRkaXJwbHVzIGluZm8gKi8KKwkJaWYgKGRlbnRyeSAhPSBOVUxMICYmIGRlbnRyeS0+ZF9pbm9kZSAhPSBOVUxMKSB7CisJCQlkX3R5cGUgPSBkdF90eXBlKGRlbnRyeS0+ZF9pbm9kZSk7CisJCQlmaWxlaWQgPSBkZW50cnktPmRfaW5vZGUtPmlfaW5vOworCQl9CisKKwkJcmVzID0gZmlsbGRpcihkaXJlbnQsIGVudHJ5LT5uYW1lLCBlbnRyeS0+bGVuLCAKKwkJCSAgICAgIGVudHJ5LT5wcmV2X2Nvb2tpZSwgZmlsZWlkLCBkX3R5cGUpOworCQlpZiAocmVzIDwgMCkKKwkJCWJyZWFrOworCQlmaWxlLT5mX3BvcyA9IGRlc2MtPnRhcmdldCA9IGVudHJ5LT5jb29raWU7CisJCWlmIChkaXJfZGVjb2RlKGRlc2MpICE9IDApIHsKKwkJCWRlc2MtPnBhZ2VfaW5kZXggKys7CisJCQlicmVhazsKKwkJfQorCQlpZiAobG9vcF9jb3VudCsrID4gMjAwKSB7CisJCQlsb29wX2NvdW50ID0gMDsKKwkJCXNjaGVkdWxlKCk7CisJCX0KKwl9CisJZGlyX3BhZ2VfcmVsZWFzZShkZXNjKTsKKwlpZiAoZGVudHJ5ICE9IE5VTEwpCisJCWRwdXQoZGVudHJ5KTsKKwlkZnByaW50ayhWRlMsICJORlM6IG5mc19kb19maWxsZGlyKCkgZmlsbGluZyBlbmRlZCBAIGNvb2tpZSAlTHU7IHJldHVybmluZyA9ICVkXG4iLCAobG9uZyBsb25nKWRlc2MtPnRhcmdldCwgcmVzKTsKKwlyZXR1cm4gcmVzOworfQorCisvKgorICogSWYgd2UgY2Fubm90IGZpbmQgYSBjb29raWUgaW4gb3VyIGNhY2hlLCB3ZSBzdXNwZWN0IHRoYXQgdGhpcyBpcworICogYmVjYXVzZSBpdCBwb2ludHMgdG8gYSBkZWxldGVkIGZpbGUsIHNvIHdlIGFzayB0aGUgc2VydmVyIHRvIHJldHVybgorICogd2hhdGV2ZXIgaXQgdGhpbmtzIGlzIHRoZSBuZXh0IGVudHJ5LiBXZSB0aGVuIGZlZWQgdGhpcyB0byBmaWxsZGlyLgorICogSWYgYWxsIGdvZXMgd2VsbCwgd2Ugc2hvdWxkIHRoZW4gYmUgYWJsZSB0byBmaW5kIG91ciB3YXkgcm91bmQgdGhlCisgKiBjYWNoZSBvbiB0aGUgbmV4dCBjYWxsIHRvIHJlYWRkaXJfc2VhcmNoX3BhZ2VjYWNoZSgpOworICoKKyAqIE5PVEU6IHdlIGNhbm5vdCBhZGQgdGhlIGFub255bW91cyBwYWdlIHRvIHRoZSBwYWdlY2FjaGUgYmVjYXVzZQorICoJIHRoZSBkYXRhIGl0IGNvbnRhaW5zIG1pZ2h0IG5vdCBiZSBwYWdlIGFsaWduZWQuIEJlc2lkZXMsCisgKgkgd2Ugc2hvdWxkIGFscmVhZHkgaGF2ZSBhIGNvbXBsZXRlIHJlcHJlc2VudGF0aW9uIG9mIHRoZQorICoJIGRpcmVjdG9yeSBpbiB0aGUgcGFnZSBjYWNoZSBieSB0aGUgdGltZSB3ZSBnZXQgaGVyZS4KKyAqLworc3RhdGljIGlubGluZQoraW50IHVuY2FjaGVkX3JlYWRkaXIobmZzX3JlYWRkaXJfZGVzY3JpcHRvcl90ICpkZXNjLCB2b2lkICpkaXJlbnQsCisJCSAgICAgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJc3RydWN0IGZpbGUJKmZpbGUgPSBkZXNjLT5maWxlOworCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgcnBjX2NyZWQJKmNyZWQgPSBuZnNfZmlsZV9jcmVkKGZpbGUpOworCXN0cnVjdCBwYWdlCSpwYWdlID0gTlVMTDsKKwlpbnQJCXN0YXR1czsKKworCWRmcHJpbnRrKFZGUywgIk5GUzogdW5jYWNoZWRfcmVhZGRpcigpIHNlYXJjaGluZyBmb3IgY29va2llICVMdVxuIiwgKGxvbmcgbG9uZylkZXNjLT50YXJnZXQpOworCisJcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0hJR0hVU0VSKTsKKwlpZiAoIXBhZ2UpIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCWRlc2MtPmVycm9yID0gTkZTX1BST1RPKGlub2RlKS0+cmVhZGRpcihmaWxlLT5mX2RlbnRyeSwgY3JlZCwgZGVzYy0+dGFyZ2V0LAorCQkJCQkJcGFnZSwKKwkJCQkJCU5GU19TRVJWRVIoaW5vZGUpLT5kdHNpemUsCisJCQkJCQlkZXNjLT5wbHVzKTsKKwlORlNfRkxBR1MoaW5vZGUpIHw9IE5GU19JTk9fSU5WQUxJRF9BVElNRTsKKwlkZXNjLT5wYWdlID0gcGFnZTsKKwlkZXNjLT5wdHIgPSBrbWFwKHBhZ2UpOwkJLyogbWF0Y2hpbmcga3VubWFwIGluIG5mc19kb19maWxsZGlyICovCisJaWYgKGRlc2MtPmVycm9yID49IDApIHsKKwkJaWYgKChzdGF0dXMgPSBkaXJfZGVjb2RlKGRlc2MpKSA9PSAwKQorCQkJZGVzYy0+ZW50cnktPnByZXZfY29va2llID0gZGVzYy0+dGFyZ2V0OworCX0gZWxzZQorCQlzdGF0dXMgPSAtRUlPOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIG91dF9yZWxlYXNlOworCisJc3RhdHVzID0gbmZzX2RvX2ZpbGxkaXIoZGVzYywgZGlyZW50LCBmaWxsZGlyKTsKKworCS8qIFJlc2V0IHJlYWQgZGVzY3JpcHRvciBzbyBpdCBzZWFyY2hlcyB0aGUgcGFnZSBjYWNoZSBmcm9tCisJICogdGhlIHN0YXJ0IHVwb24gdGhlIG5leHQgY2FsbCB0byByZWFkZGlyX3NlYXJjaF9wYWdlY2FjaGUoKSAqLworCWRlc2MtPnBhZ2VfaW5kZXggPSAwOworCWRlc2MtPmVudHJ5LT5jb29raWUgPSBkZXNjLT5lbnRyeS0+cHJldl9jb29raWUgPSAwOworCWRlc2MtPmVudHJ5LT5lb2YgPSAwOworIG91dDoKKwlkZnByaW50ayhWRlMsICJORlM6IHVuY2FjaGVkX3JlYWRkaXIoKSByZXR1cm5zICVkXG4iLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cisgb3V0X3JlbGVhc2U6CisJZGlyX3BhZ2VfcmVsZWFzZShkZXNjKTsKKwlnb3RvIG91dDsKK30KKworLyogVGhlIGZpbGUgb2Zmc2V0IHBvc2l0aW9uIGlzIG5vdyByZXByZXNlbnRlZCBhcyBhIHRydWUgb2Zmc2V0IGludG8gdGhlCisgKiBwYWdlIGNhY2hlIGFzIGlzIHRoZSBjYXNlIGluIG1vc3Qgb2YgdGhlIG90aGVyIGZpbGVzeXN0ZW1zLgorICovCitzdGF0aWMgaW50IG5mc19yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCXN0cnVjdCBkZW50cnkJKmRlbnRyeSA9IGZpbHAtPmZfZGVudHJ5OworCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJbmZzX3JlYWRkaXJfZGVzY3JpcHRvcl90IG15X2Rlc2MsCisJCQkqZGVzYyA9ICZteV9kZXNjOworCXN0cnVjdCBuZnNfZW50cnkgbXlfZW50cnk7CisJc3RydWN0IG5mc19maAkgZmg7CisJc3RydWN0IG5mc19mYXR0ciBmYXR0cjsKKwlsb25nCQlyZXM7CisKKwlsb2NrX2tlcm5lbCgpOworCisJcmVzID0gbmZzX3JldmFsaWRhdGVfaW5vZGUoTkZTX1NFUlZFUihpbm9kZSksIGlub2RlKTsKKwlpZiAocmVzIDwgMCkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiByZXM7CisJfQorCisJLyoKKwkgKiBmaWxwLT5mX3BvcyBwb2ludHMgdG8gdGhlIGZpbGUgb2Zmc2V0IGluIHRoZSBwYWdlIGNhY2hlLgorCSAqIGJ1dCBpZiB0aGUgY2FjaGUgaGFzIG1lYW53aGlsZSBiZWVuIHphcHBlZCwgd2UgbmVlZCB0bworCSAqIHJlYWQgZnJvbSB0aGUgbGFzdCBkaXJlbnQgdG8gcmV2YWxpZGF0ZSBmX3BvcworCSAqIGl0c2VsZi4KKwkgKi8KKwltZW1zZXQoZGVzYywgMCwgc2l6ZW9mKCpkZXNjKSk7CisKKwlkZXNjLT5maWxlID0gZmlscDsKKwlkZXNjLT50YXJnZXQgPSBmaWxwLT5mX3BvczsKKwlkZXNjLT5kZWNvZGUgPSBORlNfUFJPVE8oaW5vZGUpLT5kZWNvZGVfZGlyZW50OworCWRlc2MtPnBsdXMgPSBORlNfVVNFX1JFQURESVJQTFVTKGlub2RlKTsKKworCW15X2VudHJ5LmNvb2tpZSA9IG15X2VudHJ5LnByZXZfY29va2llID0gMDsKKwlteV9lbnRyeS5lb2YgPSAwOworCW15X2VudHJ5LmZoID0gJmZoOworCW15X2VudHJ5LmZhdHRyID0gJmZhdHRyOworCWRlc2MtPmVudHJ5ID0gJm15X2VudHJ5OworCisJd2hpbGUoIWRlc2MtPmVudHJ5LT5lb2YpIHsKKwkJcmVzID0gcmVhZGRpcl9zZWFyY2hfcGFnZWNhY2hlKGRlc2MpOworCQlpZiAocmVzID09IC1FQkFEQ09PS0lFKSB7CisJCQkvKiBUaGlzIG1lYW5zIGVpdGhlciBlbmQgb2YgZGlyZWN0b3J5ICovCisJCQlpZiAoZGVzYy0+ZW50cnktPmNvb2tpZSAhPSBkZXNjLT50YXJnZXQpIHsKKwkJCQkvKiBPciB0aGF0IHRoZSBzZXJ2ZXIgaGFzICdsb3N0JyBhIGNvb2tpZSAqLworCQkJCXJlcyA9IHVuY2FjaGVkX3JlYWRkaXIoZGVzYywgZGlyZW50LCBmaWxsZGlyKTsKKwkJCQlpZiAocmVzID49IDApCisJCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcmVzID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChyZXMgPT0gLUVUT09TTUFMTCAmJiBkZXNjLT5wbHVzKSB7CisJCQlORlNfRkxBR1MoaW5vZGUpICY9IH5ORlNfSU5PX0FEVklTRV9SRFBMVVM7CisJCQluZnNfemFwX2NhY2hlcyhpbm9kZSk7CisJCQlkZXNjLT5wbHVzID0gMDsKKwkJCWRlc2MtPmVudHJ5LT5lb2YgPSAwOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHJlcyA8IDApCisJCQlicmVhazsKKworCQlyZXMgPSBuZnNfZG9fZmlsbGRpcihkZXNjLCBkaXJlbnQsIGZpbGxkaXIpOworCQlpZiAocmVzIDwgMCkgeworCQkJcmVzID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlpZiAoZGVzYy0+ZXJyb3IgPCAwKQorCQlyZXR1cm4gZGVzYy0+ZXJyb3I7CisJaWYgKHJlcyA8IDApCisJCXJldHVybiByZXM7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBbGwgZGlyZWN0b3J5IG9wZXJhdGlvbnMgdW5kZXIgTkZTIGFyZSBzeW5jaHJvbm91cywgc28gZnN5bmMoKQorICogaXMgYSBkdW1teSBvcGVyYXRpb24uCisgKi8KK2ludCBuZnNfZnN5bmNfZGlyKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBkYXRhc3luYykKK3sKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEEgY2hlY2sgZm9yIHdoZXRoZXIgb3Igbm90IHRoZSBwYXJlbnQgZGlyZWN0b3J5IGhhcyBjaGFuZ2VkLgorICogSW4gdGhlIGNhc2UgaXQgaGFzLCB3ZSBhc3N1bWUgdGhhdCB0aGUgZGVudHJpZXMgYXJlIHVudHJ1c3R3b3J0aHkKKyAqIGFuZCBtYXkgbmVlZCB0byBiZSBsb29rZWQgdXAgYWdhaW4uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG5mc19jaGVja192ZXJpZmllcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWlmIChJU19ST09UKGRlbnRyeSkpCisJCXJldHVybiAxOworCWlmICgoTkZTX0ZMQUdTKGRpcikgJiBORlNfSU5PX0lOVkFMSURfQVRUUikgIT0gMAorCQkJfHwgbmZzX2F0dHJpYnV0ZV90aW1lb3V0KGRpcikpCisJCXJldHVybiAwOworCXJldHVybiBuZnNfdmVyaWZ5X2NoYW5nZV9hdHRyaWJ1dGUoZGlyLCAodW5zaWduZWQgbG9uZylkZW50cnktPmRfZnNkYXRhKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5mc19zZXRfdmVyaWZpZXIoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgdW5zaWduZWQgbG9uZyB2ZXJmKQoreworCWRlbnRyeS0+ZF9mc2RhdGEgPSAodm9pZCAqKXZlcmY7Cit9CisKKy8qCisgKiBXaGVuZXZlciBhbiBORlMgb3BlcmF0aW9uIHN1Y2NlZWRzLCB3ZSBrbm93IHRoYXQgdGhlIGRlbnRyeQorICogaXMgdmFsaWQsIHNvIHdlIHVwZGF0ZSB0aGUgcmV2YWxpZGF0aW9uIHRpbWVzdGFtcC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIG5mc19yZW5ld190aW1lcyhzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5KQoreworCWRlbnRyeS0+ZF90aW1lID0gamlmZmllczsKK30KKworc3RhdGljIGlubGluZQoraW50IG5mc19sb29rdXBfdmVyaWZ5X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0VSVkVSKGlub2RlKTsKKworCWlmIChuZCAhPSBOVUxMKSB7CisJCWludCBuZGZsYWdzID0gbmQtPmZsYWdzOworCQkvKiBWRlMgd2FudHMgYW4gb24tdGhlLXdpcmUgcmV2YWxpZGF0aW9uICovCisJCWlmIChuZGZsYWdzICYgTE9PS1VQX1JFVkFMKQorCQkJZ290byBvdXRfZm9yY2U7CisJCS8qIFRoaXMgaXMgYW4gb3BlbigyKSAqLworCQlpZiAoKG5kZmxhZ3MgJiBMT09LVVBfT1BFTikgJiYKKwkJCQkhKG5kZmxhZ3MgJiBMT09LVVBfQ09OVElOVUUpICYmCisJCQkJIShzZXJ2ZXItPmZsYWdzICYgTkZTX01PVU5UX05PQ1RPKSkKKwkJCWdvdG8gb3V0X2ZvcmNlOworCX0KKwlyZXR1cm4gbmZzX3JldmFsaWRhdGVfaW5vZGUoc2VydmVyLCBpbm9kZSk7CitvdXRfZm9yY2U6CisJcmV0dXJuIF9fbmZzX3JldmFsaWRhdGVfaW5vZGUoc2VydmVyLCBpbm9kZSk7Cit9CisKKy8qCisgKiBXZSBqdWRnZSBob3cgbG9uZyB3ZSB3YW50IHRvIHRydXN0IG5lZ2F0aXZlCisgKiBkZW50cmllcyBieSBsb29raW5nIGF0IHRoZSBwYXJlbnQgaW5vZGUgbXRpbWUuCisgKgorICogSWYgcGFyZW50IG10aW1lIGhhcyBjaGFuZ2VkLCB3ZSByZXZhbGlkYXRlLCBlbHNlIHdlIHdhaXQgZm9yIGEKKyAqIHBlcmlvZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBwYXJlbnQncyBhdHRyaWJ1dGUgY2FjaGUgdGltZW91dCB2YWx1ZS4KKyAqLworc3RhdGljIGlubGluZQoraW50IG5mc19uZWdfbmVlZF9yZXZhbChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkgICAgICAgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaW50IG5kZmxhZ3MgPSAwOworCisJaWYgKG5kKQorCQluZGZsYWdzID0gbmQtPmZsYWdzOworCS8qIERvbid0IHJldmFsaWRhdGUgYSBuZWdhdGl2ZSBkZW50cnkgaWYgd2UncmUgY3JlYXRpbmcgYSBuZXcgZmlsZSAqLworCWlmICgobmRmbGFncyAmIExPT0tVUF9DUkVBVEUpICYmICEobmRmbGFncyAmIExPT0tVUF9DT05USU5VRSkpCisJCXJldHVybiAwOworCXJldHVybiAhbmZzX2NoZWNrX3ZlcmlmaWVyKGRpciwgZGVudHJ5KTsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhlIGRjYWNoZSBoYXMgYSBsb29rdXAgaGl0LAorICogYW5kIHdlIHNob3VsZCBjaGVjayB3aGV0aGVyIHdlIGNhbiByZWFsbHkgdHJ1c3QgdGhhdAorICogbG9va3VwLgorICoKKyAqIE5PVEUhIFRoZSBoaXQgY2FuIGJlIGEgbmVnYXRpdmUgaGl0IHRvbywgZG9uJ3QgYXNzdW1lCisgKiB3ZSBoYXZlIGFuIGlub2RlIQorICoKKyAqIElmIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGlzIHNlZW4gdG8gaGF2ZSBjaGFuZ2VkLCB3ZSB0aHJvdyBvdXQgdGhlCisgKiBjYWNoZWQgZGVudHJ5IGFuZCBkbyBhIG5ldyBsb29rdXAuCisgKi8KK3N0YXRpYyBpbnQgbmZzX2xvb2t1cF9yZXZhbGlkYXRlKHN0cnVjdCBkZW50cnkgKiBkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZSAqZGlyOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IGRlbnRyeSAqcGFyZW50OworCWludCBlcnJvcjsKKwlzdHJ1Y3QgbmZzX2ZoIGZoYW5kbGU7CisJc3RydWN0IG5mc19mYXR0ciBmYXR0cjsKKwl1bnNpZ25lZCBsb25nIHZlcmlmaWVyOworCisJcGFyZW50ID0gZGdldF9wYXJlbnQoZGVudHJ5KTsKKwlsb2NrX2tlcm5lbCgpOworCWRpciA9IHBhcmVudC0+ZF9pbm9kZTsKKwlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKworCWlmICghaW5vZGUpIHsKKwkJaWYgKG5mc19uZWdfbmVlZF9yZXZhbChkaXIsIGRlbnRyeSwgbmQpKQorCQkJZ290byBvdXRfYmFkOworCQlnb3RvIG91dF92YWxpZDsKKwl9CisKKwlpZiAoaXNfYmFkX2lub2RlKGlub2RlKSkgeworCQlkZnByaW50ayhWRlMsICJuZnNfbG9va3VwX3ZhbGlkYXRlOiAlcy8lcyBoYXMgZHVkIGlub2RlXG4iLAorCQkJZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCQlnb3RvIG91dF9iYWQ7CisJfQorCisJLyogUmV2YWxpZGF0ZSBwYXJlbnQgZGlyZWN0b3J5IGF0dHJpYnV0ZSBjYWNoZSAqLworCWlmIChuZnNfcmV2YWxpZGF0ZV9pbm9kZShORlNfU0VSVkVSKGRpciksIGRpcikgPCAwKQorCQlnb3RvIG91dF96YXBfcGFyZW50OworCisJLyogRm9yY2UgYSBmdWxsIGxvb2sgdXAgaWZmIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGhhcyBjaGFuZ2VkICovCisJaWYgKG5mc19jaGVja192ZXJpZmllcihkaXIsIGRlbnRyeSkpIHsKKwkJaWYgKG5mc19sb29rdXBfdmVyaWZ5X2lub2RlKGlub2RlLCBuZCkpCisJCQlnb3RvIG91dF96YXBfcGFyZW50OworCQlnb3RvIG91dF92YWxpZDsKKwl9CisKKwlpZiAoTkZTX1NUQUxFKGlub2RlKSkKKwkJZ290byBvdXRfYmFkOworCisJdmVyaWZpZXIgPSBuZnNfc2F2ZV9jaGFuZ2VfYXR0cmlidXRlKGRpcik7CisJZXJyb3IgPSBORlNfUFJPVE8oZGlyKS0+bG9va3VwKGRpciwgJmRlbnRyeS0+ZF9uYW1lLCAmZmhhbmRsZSwgJmZhdHRyKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0X2JhZDsKKwlpZiAobmZzX2NvbXBhcmVfZmgoTkZTX0ZIKGlub2RlKSwgJmZoYW5kbGUpKQorCQlnb3RvIG91dF9iYWQ7CisJaWYgKChlcnJvciA9IG5mc19yZWZyZXNoX2lub2RlKGlub2RlLCAmZmF0dHIpKSAhPSAwKQorCQlnb3RvIG91dF9iYWQ7CisKKwluZnNfcmVuZXdfdGltZXMoZGVudHJ5KTsKKwluZnNfc2V0X3ZlcmlmaWVyKGRlbnRyeSwgdmVyaWZpZXIpOworIG91dF92YWxpZDoKKwl1bmxvY2tfa2VybmVsKCk7CisJZHB1dChwYXJlbnQpOworCXJldHVybiAxOworb3V0X3phcF9wYXJlbnQ6CisJbmZzX3phcF9jYWNoZXMoZGlyKTsKKyBvdXRfYmFkOgorCU5GU19DQUNIRUlOVihkaXIpOworCWlmIChpbm9kZSAmJiBTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCS8qIFB1cmdlIHJlYWRkaXIgY2FjaGVzLiAqLworCQluZnNfemFwX2NhY2hlcyhpbm9kZSk7CisJCS8qIElmIHdlIGhhdmUgc3VibW91bnRzLCBkb24ndCB1bmhhc2ggISAqLworCQlpZiAoaGF2ZV9zdWJtb3VudHMoZGVudHJ5KSkKKwkJCWdvdG8gb3V0X3ZhbGlkOworCQlzaHJpbmtfZGNhY2hlX3BhcmVudChkZW50cnkpOworCX0KKwlkX2Ryb3AoZGVudHJ5KTsKKwl1bmxvY2tfa2VybmVsKCk7CisJZHB1dChwYXJlbnQpOworCXJldHVybiAwOworfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgZnJvbSBkcHV0KCkgd2hlbiBkX2NvdW50IGlzIGdvaW5nIHRvIDAuCisgKi8KK3N0YXRpYyBpbnQgbmZzX2RlbnRyeV9kZWxldGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWRmcHJpbnRrKFZGUywgIk5GUzogZGVudHJ5X2RlbGV0ZSglcy8lcywgJXgpXG4iLAorCQlkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJZGVudHJ5LT5kX2ZsYWdzKTsKKworCWlmIChkZW50cnktPmRfZmxhZ3MgJiBEQ0FDSEVfTkZTRlNfUkVOQU1FRCkgeworCQkvKiBVbmhhc2ggaXQsIHNvIHRoYXQgLT5kX2lwdXQoKSB3b3VsZCBiZSBjYWxsZWQgKi8KKwkJcmV0dXJuIDE7CisJfQorCWlmICghKGRlbnRyeS0+ZF9zYi0+c19mbGFncyAmIE1TX0FDVElWRSkpIHsKKwkJLyogVW5oYXNoIGl0LCBzbyB0aGF0IGFuY2VzdG9ycyBvZiBraWxsZWQgYXN5bmMgdW5saW5rCisJCSAqIGZpbGVzIHdpbGwgYmUgY2xlYW5lZCB1cCBkdXJpbmcgdW1vdW50ICovCisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKKworfQorCisvKgorICogQ2FsbGVkIHdoZW4gdGhlIGRlbnRyeSBsb3NlcyBpbm9kZS4KKyAqIFdlIHVzZSBpdCB0byBjbGVhbiB1cCBzaWxseS1yZW5hbWVkIGZpbGVzLgorICovCitzdGF0aWMgdm9pZCBuZnNfZGVudHJ5X2lwdXQoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmIChkZW50cnktPmRfZmxhZ3MgJiBEQ0FDSEVfTkZTRlNfUkVOQU1FRCkgeworCQlsb2NrX2tlcm5lbCgpOworCQlpbm9kZS0+aV9ubGluay0tOworCQluZnNfY29tcGxldGVfdW5saW5rKGRlbnRyeSk7CisJCXVubG9ja19rZXJuZWwoKTsKKwl9CisJLyogV2hlbiBjcmVhdGluZyBhIG5lZ2F0aXZlIGRlbnRyeSwgd2Ugd2FudCB0byByZW5ldyBkX3RpbWUgKi8KKwluZnNfcmVuZXdfdGltZXMoZGVudHJ5KTsKKwlpcHV0KGlub2RlKTsKK30KKworc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIG5mc19kZW50cnlfb3BlcmF0aW9ucyA9IHsKKwkuZF9yZXZhbGlkYXRlCT0gbmZzX2xvb2t1cF9yZXZhbGlkYXRlLAorCS5kX2RlbGV0ZQk9IG5mc19kZW50cnlfZGVsZXRlLAorCS5kX2lwdXQJCT0gbmZzX2RlbnRyeV9pcHV0LAorfTsKKworc3RhdGljIGlubGluZQoraW50IG5mc19pc19leGNsdXNpdmVfY3JlYXRlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlpZiAoTkZTX1BST1RPKGRpciktPnZlcnNpb24gPT0gMikKKwkJcmV0dXJuIDA7CisJaWYgKCFuZCB8fCAobmQtPmZsYWdzICYgTE9PS1VQX0NPTlRJTlVFKSB8fCAhKG5kLT5mbGFncyAmIExPT0tVUF9DUkVBVEUpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gKG5kLT5pbnRlbnQub3Blbi5mbGFncyAmIE9fRVhDTCkgIT0gMDsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKm5mc19sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBkZW50cnkgKnJlczsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKKwlpbnQgZXJyb3I7CisJc3RydWN0IG5mc19maCBmaGFuZGxlOworCXN0cnVjdCBuZnNfZmF0dHIgZmF0dHI7CisKKwlkZnByaW50ayhWRlMsICJORlM6IGxvb2t1cCglcy8lcylcbiIsCisJCWRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCXJlcyA9IEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7CisJaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+IE5GU19TRVJWRVIoZGlyKS0+bmFtZWxlbikKKwkJZ290byBvdXQ7CisKKwlyZXMgPSBFUlJfUFRSKC1FTk9NRU0pOworCWRlbnRyeS0+ZF9vcCA9IE5GU19QUk9UTyhkaXIpLT5kZW50cnlfb3BzOworCisJbG9ja19rZXJuZWwoKTsKKwkvKiBSZXZhbGlkYXRlIHBhcmVudCBkaXJlY3RvcnkgYXR0cmlidXRlIGNhY2hlICovCisJZXJyb3IgPSBuZnNfcmV2YWxpZGF0ZV9pbm9kZShORlNfU0VSVkVSKGRpciksIGRpcik7CisJaWYgKGVycm9yIDwgMCkgeworCQlyZXMgPSBFUlJfUFRSKGVycm9yKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCS8qIElmIHdlJ3JlIGRvaW5nIGFuIGV4Y2x1c2l2ZSBjcmVhdGUsIG9wdGltaXplIGF3YXkgdGhlIGxvb2t1cCAqLworCWlmIChuZnNfaXNfZXhjbHVzaXZlX2NyZWF0ZShkaXIsIG5kKSkKKwkJZ290byBub19lbnRyeTsKKworCWVycm9yID0gTkZTX1BST1RPKGRpciktPmxvb2t1cChkaXIsICZkZW50cnktPmRfbmFtZSwgJmZoYW5kbGUsICZmYXR0cik7CisJaWYgKGVycm9yID09IC1FTk9FTlQpCisJCWdvdG8gbm9fZW50cnk7CisJaWYgKGVycm9yIDwgMCkgeworCQlyZXMgPSBFUlJfUFRSKGVycm9yKTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwlyZXMgPSBFUlJfUFRSKC1FQUNDRVMpOworCWlub2RlID0gbmZzX2ZoZ2V0KGRlbnRyeS0+ZF9zYiwgJmZoYW5kbGUsICZmYXR0cik7CisJaWYgKCFpbm9kZSkKKwkJZ290byBvdXRfdW5sb2NrOworbm9fZW50cnk6CisJcmVzID0gZF9hZGRfdW5pcXVlKGRlbnRyeSwgaW5vZGUpOworCWlmIChyZXMgIT0gTlVMTCkKKwkJZGVudHJ5ID0gcmVzOworCW5mc19yZW5ld190aW1lcyhkZW50cnkpOworCW5mc19zZXRfdmVyaWZpZXIoZGVudHJ5LCBuZnNfc2F2ZV9jaGFuZ2VfYXR0cmlidXRlKGRpcikpOworb3V0X3VubG9jazoKKwl1bmxvY2tfa2VybmVsKCk7CitvdXQ6CisJcmV0dXJuIHJlczsKK30KKworI2lmZGVmIENPTkZJR19ORlNfVjQKK3N0YXRpYyBpbnQgbmZzX29wZW5fcmV2YWxpZGF0ZShzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBuYW1laWRhdGEgKik7CisKK3N0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBuZnM0X2RlbnRyeV9vcGVyYXRpb25zID0geworCS5kX3JldmFsaWRhdGUJPSBuZnNfb3Blbl9yZXZhbGlkYXRlLAorCS5kX2RlbGV0ZQk9IG5mc19kZW50cnlfZGVsZXRlLAorCS5kX2lwdXQJCT0gbmZzX2RlbnRyeV9pcHV0LAorfTsKKworc3RhdGljIGludCBpc19hdG9taWNfb3BlbihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaWYgKCFuZCkKKwkJcmV0dXJuIDA7CisJLyogQ2hlY2sgdGhhdCB3ZSBhcmUgaW5kZWVkIHRyeWluZyB0byBvcGVuIHRoaXMgZmlsZSAqLworCWlmICgobmQtPmZsYWdzICYgTE9PS1VQX0NPTlRJTlVFKSB8fCAhKG5kLT5mbGFncyAmIExPT0tVUF9PUEVOKSkKKwkJcmV0dXJuIDA7CisJLyogTkZTIGRvZXMgbm90ICh5ZXQpIGhhdmUgYSBzdGF0ZWZ1bCBvcGVuIGZvciBkaXJlY3RvcmllcyAqLworCWlmIChuZC0+ZmxhZ3MgJiBMT09LVVBfRElSRUNUT1JZKQorCQlyZXR1cm4gMDsKKwkvKiBBcmUgd2UgdHJ5aW5nIHRvIHdyaXRlIHRvIGEgcmVhZCBvbmx5IHBhcnRpdGlvbj8gKi8KKwlpZiAoSVNfUkRPTkxZKGRpcikgJiYgKG5kLT5pbnRlbnQub3Blbi5mbGFncyAmIChPX0NSRUFUfE9fVFJVTkN8Rk1PREVfV1JJVEUpKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpuZnNfYXRvbWljX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpyZXMgPSBOVUxMOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOworCWludCBlcnJvcjsKKworCS8qIENoZWNrIHRoYXQgd2UgYXJlIGluZGVlZCB0cnlpbmcgdG8gb3BlbiB0aGlzIGZpbGUgKi8KKwlpZiAoIWlzX2F0b21pY19vcGVuKGRpciwgbmQpKQorCQlnb3RvIG5vX29wZW47CisKKwlpZiAoZGVudHJ5LT5kX25hbWUubGVuID4gTkZTX1NFUlZFUihkaXIpLT5uYW1lbGVuKSB7CisJCXJlcyA9IEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7CisJCWdvdG8gb3V0OworCX0KKwlkZW50cnktPmRfb3AgPSBORlNfUFJPVE8oZGlyKS0+ZGVudHJ5X29wczsKKworCS8qIExldCB2ZnNfY3JlYXRlKCkgZGVhbCB3aXRoIE9fRVhDTCAqLworCWlmIChuZC0+aW50ZW50Lm9wZW4uZmxhZ3MgJiBPX0VYQ0wpCisJCWdvdG8gbm9fZW50cnk7CisKKwkvKiBPcGVuIHRoZSBmaWxlIG9uIHRoZSBzZXJ2ZXIgKi8KKwlsb2NrX2tlcm5lbCgpOworCS8qIFJldmFsaWRhdGUgcGFyZW50IGRpcmVjdG9yeSBhdHRyaWJ1dGUgY2FjaGUgKi8KKwllcnJvciA9IG5mc19yZXZhbGlkYXRlX2lub2RlKE5GU19TRVJWRVIoZGlyKSwgZGlyKTsKKwlpZiAoZXJyb3IgPCAwKSB7CisJCXJlcyA9IEVSUl9QVFIoZXJyb3IpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAobmQtPmludGVudC5vcGVuLmZsYWdzICYgT19DUkVBVCkgeworCQluZnNfYmVnaW5fZGF0YV91cGRhdGUoZGlyKTsKKwkJaW5vZGUgPSBuZnM0X2F0b21pY19vcGVuKGRpciwgZGVudHJ5LCBuZCk7CisJCW5mc19lbmRfZGF0YV91cGRhdGUoZGlyKTsKKwl9IGVsc2UKKwkJaW5vZGUgPSBuZnM0X2F0b21pY19vcGVuKGRpciwgZGVudHJ5LCBuZCk7CisJdW5sb2NrX2tlcm5lbCgpOworCWlmIChJU19FUlIoaW5vZGUpKSB7CisJCWVycm9yID0gUFRSX0VSUihpbm9kZSk7CisJCXN3aXRjaCAoZXJyb3IpIHsKKwkJCS8qIE1ha2UgYSBuZWdhdGl2ZSBkZW50cnkgKi8KKwkJCWNhc2UgLUVOT0VOVDoKKwkJCQlpbm9kZSA9IE5VTEw7CisJCQkJYnJlYWs7CisJCQkvKiBUaGlzIHR1cm5lZCBvdXQgbm90IHRvIGJlIGEgcmVndWxhciBmaWxlICovCisJCQljYXNlIC1FTE9PUDoKKwkJCQlpZiAoIShuZC0+aW50ZW50Lm9wZW4uZmxhZ3MgJiBPX05PRk9MTE9XKSkKKwkJCQkJZ290byBub19vcGVuOworCQkJLyogY2FzZSAtRUlTRElSOiAqLworCQkJLyogY2FzZSAtRUlOVkFMOiAqLworCQkJZGVmYXVsdDoKKwkJCQlyZXMgPSBFUlJfUFRSKGVycm9yKTsKKwkJCQlnb3RvIG91dDsKKwkJfQorCX0KK25vX2VudHJ5OgorCXJlcyA9IGRfYWRkX3VuaXF1ZShkZW50cnksIGlub2RlKTsKKwlpZiAocmVzICE9IE5VTEwpCisJCWRlbnRyeSA9IHJlczsKKwluZnNfcmVuZXdfdGltZXMoZGVudHJ5KTsKKwluZnNfc2V0X3ZlcmlmaWVyKGRlbnRyeSwgbmZzX3NhdmVfY2hhbmdlX2F0dHJpYnV0ZShkaXIpKTsKK291dDoKKwlyZXR1cm4gcmVzOworbm9fb3BlbjoKKwlyZXR1cm4gbmZzX2xvb2t1cChkaXIsIGRlbnRyeSwgbmQpOworfQorCitzdGF0aWMgaW50IG5mc19vcGVuX3JldmFsaWRhdGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICpkaXI7CisJdW5zaWduZWQgbG9uZyB2ZXJpZmllcjsKKwlpbnQgb3BlbmZsYWdzLCByZXQgPSAwOworCisJcGFyZW50ID0gZGdldF9wYXJlbnQoZGVudHJ5KTsKKwlkaXIgPSBwYXJlbnQtPmRfaW5vZGU7CisJaWYgKCFpc19hdG9taWNfb3BlbihkaXIsIG5kKSkKKwkJZ290byBub19vcGVuOworCS8qIFdlIGNhbid0IGNyZWF0ZSBuZXcgZmlsZXMgaW4gbmZzX29wZW5fcmV2YWxpZGF0ZSgpLCBzbyB3ZQorCSAqIG9wdGltaXplIGF3YXkgcmV2YWxpZGF0aW9uIG9mIG5lZ2F0aXZlIGRlbnRyaWVzLgorCSAqLworCWlmIChpbm9kZSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwkvKiBORlMgb25seSBzdXBwb3J0cyBPUEVOIG9uIHJlZ3VsYXIgZmlsZXMgKi8KKwlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCisJCWdvdG8gbm9fb3BlbjsKKwlvcGVuZmxhZ3MgPSBuZC0+aW50ZW50Lm9wZW4uZmxhZ3M7CisJLyogV2UgY2Fubm90IGRvIGV4Y2x1c2l2ZSBjcmVhdGlvbiBvbiBhIHBvc2l0aXZlIGRlbnRyeSAqLworCWlmICgob3BlbmZsYWdzICYgKE9fQ1JFQVR8T19FWENMKSkgPT0gKE9fQ1JFQVR8T19FWENMKSkKKwkJZ290byBub19vcGVuOworCS8qIFdlIGNhbid0IGNyZWF0ZSBuZXcgZmlsZXMsIG9yIHRydW5jYXRlIGV4aXN0aW5nIG9uZXMgaGVyZSAqLworCW9wZW5mbGFncyAmPSB+KE9fQ1JFQVR8T19UUlVOQyk7CisKKwkvKgorCSAqIE5vdGU6IHdlJ3JlIG5vdCBob2xkaW5nIGlub2RlLT5pX3NlbSBhbmQgc28gbWF5IGJlIHJhY2luZyB3aXRoCisJICogb3BlcmF0aW9ucyB0aGF0IGNoYW5nZSB0aGUgZGlyZWN0b3J5LiBXZSB0aGVyZWZvcmUgc2F2ZSB0aGUKKwkgKiBjaGFuZ2UgYXR0cmlidXRlICpiZWZvcmUqIHdlIGRvIHRoZSBSUEMgY2FsbC4KKwkgKi8KKwlsb2NrX2tlcm5lbCgpOworCXZlcmlmaWVyID0gbmZzX3NhdmVfY2hhbmdlX2F0dHJpYnV0ZShkaXIpOworCXJldCA9IG5mczRfb3Blbl9yZXZhbGlkYXRlKGRpciwgZGVudHJ5LCBvcGVuZmxhZ3MpOworCWlmICghcmV0KQorCQluZnNfc2V0X3ZlcmlmaWVyKGRlbnRyeSwgdmVyaWZpZXIpOworCXVubG9ja19rZXJuZWwoKTsKK291dDoKKwlkcHV0KHBhcmVudCk7CisJaWYgKCFyZXQpCisJCWRfZHJvcChkZW50cnkpOworCXJldHVybiByZXQ7Citub19vcGVuOgorCWRwdXQocGFyZW50KTsKKwlpZiAoaW5vZGUgIT0gTlVMTCAmJiBuZnNfaGF2ZV9kZWxlZ2F0aW9uKGlub2RlLCBGTU9ERV9SRUFEKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIG5mc19sb29rdXBfcmV2YWxpZGF0ZShkZW50cnksIG5kKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfTkZTVjQgKi8KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKm5mc19yZWFkZGlyX2xvb2t1cChuZnNfcmVhZGRpcl9kZXNjcmlwdG9yX3QgKmRlc2MpCit7CisJc3RydWN0IGRlbnRyeSAqcGFyZW50ID0gZGVzYy0+ZmlsZS0+Zl9kZW50cnk7CisJc3RydWN0IGlub2RlICpkaXIgPSBwYXJlbnQtPmRfaW5vZGU7CisJc3RydWN0IG5mc19lbnRyeSAqZW50cnkgPSBkZXNjLT5lbnRyeTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnksICphbGlhczsKKwlzdHJ1Y3QgcXN0ciBuYW1lID0geworCQkubmFtZSA9IGVudHJ5LT5uYW1lLAorCQkubGVuID0gZW50cnktPmxlbiwKKwl9OworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwlzd2l0Y2ggKG5hbWUubGVuKSB7CisJCWNhc2UgMjoKKwkJCWlmIChuYW1lLm5hbWVbMF0gPT0gJy4nICYmIG5hbWUubmFtZVsxXSA9PSAnLicpCisJCQkJcmV0dXJuIGRnZXRfcGFyZW50KHBhcmVudCk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJaWYgKG5hbWUubmFtZVswXSA9PSAnLicpCisJCQkJcmV0dXJuIGRnZXQocGFyZW50KTsKKwl9CisJbmFtZS5oYXNoID0gZnVsbF9uYW1lX2hhc2gobmFtZS5uYW1lLCBuYW1lLmxlbik7CisJZGVudHJ5ID0gZF9sb29rdXAocGFyZW50LCAmbmFtZSk7CisJaWYgKGRlbnRyeSAhPSBOVUxMKQorCQlyZXR1cm4gZGVudHJ5OworCWlmICghZGVzYy0+cGx1cyB8fCAhKGVudHJ5LT5mYXR0ci0+dmFsaWQgJiBORlNfQVRUUl9GQVRUUikpCisJCXJldHVybiBOVUxMOworCS8qIE5vdGU6IGNhbGxlciBpcyBhbHJlYWR5IGhvbGRpbmcgdGhlIGRpci0+aV9zZW0hICovCisJZGVudHJ5ID0gZF9hbGxvYyhwYXJlbnQsICZuYW1lKTsKKwlpZiAoZGVudHJ5ID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCWRlbnRyeS0+ZF9vcCA9IE5GU19QUk9UTyhkaXIpLT5kZW50cnlfb3BzOworCWlub2RlID0gbmZzX2ZoZ2V0KGRlbnRyeS0+ZF9zYiwgZW50cnktPmZoLCBlbnRyeS0+ZmF0dHIpOworCWlmICghaW5vZGUpIHsKKwkJZHB1dChkZW50cnkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYWxpYXMgPSBkX2FkZF91bmlxdWUoZGVudHJ5LCBpbm9kZSk7CisJaWYgKGFsaWFzICE9IE5VTEwpIHsKKwkJZHB1dChkZW50cnkpOworCQlkZW50cnkgPSBhbGlhczsKKwl9CisJbmZzX3JlbmV3X3RpbWVzKGRlbnRyeSk7CisJbmZzX3NldF92ZXJpZmllcihkZW50cnksIG5mc19zYXZlX2NoYW5nZV9hdHRyaWJ1dGUoZGlyKSk7CisJcmV0dXJuIGRlbnRyeTsKK30KKworLyoKKyAqIENvZGUgY29tbW9uIHRvIGNyZWF0ZSwgbWtkaXIsIGFuZCBta25vZC4KKyAqLworaW50IG5mc19pbnN0YW50aWF0ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuZnNfZmggKmZoYW5kbGUsCisJCQkJc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCit7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgZXJyb3IgPSAtRUFDQ0VTOworCisJLyogV2UgbWF5IGhhdmUgYmVlbiBpbml0aWFsaXplZCBmdXJ0aGVyIGRvd24gKi8KKwlpZiAoZGVudHJ5LT5kX2lub2RlKQorCQlyZXR1cm4gMDsKKwlpZiAoZmhhbmRsZS0+c2l6ZSA9PSAwKSB7CisJCXN0cnVjdCBpbm9kZSAqZGlyID0gZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZTsKKwkJZXJyb3IgPSBORlNfUFJPVE8oZGlyKS0+bG9va3VwKGRpciwgJmRlbnRyeS0+ZF9uYW1lLCBmaGFuZGxlLCBmYXR0cik7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gb3V0X2VycjsKKwl9CisJaWYgKCEoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFIpKSB7CisJCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0IoZGVudHJ5LT5kX3NiKTsKKwkJZXJyb3IgPSBzZXJ2ZXItPnJwY19vcHMtPmdldGF0dHIoc2VydmVyLCBmaGFuZGxlLCBmYXR0cik7CisJCWlmIChlcnJvciA8IDApCisJCQlnb3RvIG91dF9lcnI7CisJfQorCWVycm9yID0gLUVOT01FTTsKKwlpbm9kZSA9IG5mc19maGdldChkZW50cnktPmRfc2IsIGZoYW5kbGUsIGZhdHRyKTsKKwlpZiAoaW5vZGUgPT0gTlVMTCkKKwkJZ290byBvdXRfZXJyOworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJcmV0dXJuIDA7CitvdXRfZXJyOgorCWRfZHJvcChkZW50cnkpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIEZvbGxvd2luZyBhIGZhaWxlZCBjcmVhdGUgb3BlcmF0aW9uLCB3ZSBkcm9wIHRoZSBkZW50cnkgcmF0aGVyCisgKiB0aGFuIHJldGFpbiBhIG5lZ2F0aXZlIGRlbnRyeS4gVGhpcyBhdm9pZHMgYSBwcm9ibGVtIGluIHRoZSBldmVudAorICogdGhhdCB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZCBvbiB0aGUgc2VydmVyLCBidXQgYW4gZXJyb3IgaW4gdGhlCisgKiByZXBseSBwYXRoIG1hZGUgaXQgYXBwZWFyIHRvIGhhdmUgZmFpbGVkLgorICovCitzdGF0aWMgaW50IG5mc19jcmVhdGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsCisJCXN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpYXR0ciBhdHRyOworCWludCBlcnJvcjsKKwlpbnQgb3Blbl9mbGFncyA9IDA7CisKKwlkZnByaW50ayhWRlMsICJORlM6IGNyZWF0ZSglcy8lbGQsICVzXG4iLCBkaXItPmlfc2ItPnNfaWQsIAorCQlkaXItPmlfaW5vLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCWF0dHIuaWFfbW9kZSA9IG1vZGU7CisJYXR0ci5pYV92YWxpZCA9IEFUVFJfTU9ERTsKKworCWlmIChuZCAmJiAobmQtPmZsYWdzICYgTE9PS1VQX0NSRUFURSkpCisJCW9wZW5fZmxhZ3MgPSBuZC0+aW50ZW50Lm9wZW4uZmxhZ3M7CisKKwlsb2NrX2tlcm5lbCgpOworCW5mc19iZWdpbl9kYXRhX3VwZGF0ZShkaXIpOworCWVycm9yID0gTkZTX1BST1RPKGRpciktPmNyZWF0ZShkaXIsIGRlbnRyeSwgJmF0dHIsIG9wZW5fZmxhZ3MpOworCW5mc19lbmRfZGF0YV91cGRhdGUoZGlyKTsKKwlpZiAoZXJyb3IgIT0gMCkKKwkJZ290byBvdXRfZXJyOworCW5mc19yZW5ld190aW1lcyhkZW50cnkpOworCW5mc19zZXRfdmVyaWZpZXIoZGVudHJ5LCBuZnNfc2F2ZV9jaGFuZ2VfYXR0cmlidXRlKGRpcikpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK291dF9lcnI6CisJdW5sb2NrX2tlcm5lbCgpOworCWRfZHJvcChkZW50cnkpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIFNlZSBjb21tZW50cyBmb3IgbmZzX3Byb2NfY3JlYXRlIHJlZ2FyZGluZyBmYWlsZWQgb3BlcmF0aW9ucy4KKyAqLworc3RhdGljIGludAorbmZzX21rbm9kKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLCBkZXZfdCByZGV2KQoreworCXN0cnVjdCBpYXR0ciBhdHRyOworCWludCBzdGF0dXM7CisKKwlkZnByaW50ayhWRlMsICJORlM6IG1rbm9kKCVzLyVsZCwgJXNcbiIsIGRpci0+aV9zYi0+c19pZCwKKwkJZGlyLT5pX2lubywgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwlpZiAoIW5ld192YWxpZF9kZXYocmRldikpCisJCXJldHVybiAtRUlOVkFMOworCisJYXR0ci5pYV9tb2RlID0gbW9kZTsKKwlhdHRyLmlhX3ZhbGlkID0gQVRUUl9NT0RFOworCisJbG9ja19rZXJuZWwoKTsKKwluZnNfYmVnaW5fZGF0YV91cGRhdGUoZGlyKTsKKwlzdGF0dXMgPSBORlNfUFJPVE8oZGlyKS0+bWtub2QoZGlyLCBkZW50cnksICZhdHRyLCByZGV2KTsKKwluZnNfZW5kX2RhdGFfdXBkYXRlKGRpcik7CisJaWYgKHN0YXR1cyAhPSAwKQorCQlnb3RvIG91dF9lcnI7CisJbmZzX3JlbmV3X3RpbWVzKGRlbnRyeSk7CisJbmZzX3NldF92ZXJpZmllcihkZW50cnksIG5mc19zYXZlX2NoYW5nZV9hdHRyaWJ1dGUoZGlyKSk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworb3V0X2VycjoKKwl1bmxvY2tfa2VybmVsKCk7CisJZF9kcm9wKGRlbnRyeSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIFNlZSBjb21tZW50cyBmb3IgbmZzX3Byb2NfY3JlYXRlIHJlZ2FyZGluZyBmYWlsZWQgb3BlcmF0aW9ucy4KKyAqLworc3RhdGljIGludCBuZnNfbWtkaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpCit7CisJc3RydWN0IGlhdHRyIGF0dHI7CisJaW50IGVycm9yOworCisJZGZwcmludGsoVkZTLCAiTkZTOiBta2Rpciglcy8lbGQsICVzXG4iLCBkaXItPmlfc2ItPnNfaWQsCisJCWRpci0+aV9pbm8sIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJYXR0ci5pYV92YWxpZCA9IEFUVFJfTU9ERTsKKwlhdHRyLmlhX21vZGUgPSBtb2RlIHwgU19JRkRJUjsKKworCWxvY2tfa2VybmVsKCk7CisJbmZzX2JlZ2luX2RhdGFfdXBkYXRlKGRpcik7CisJZXJyb3IgPSBORlNfUFJPVE8oZGlyKS0+bWtkaXIoZGlyLCBkZW50cnksICZhdHRyKTsKKwluZnNfZW5kX2RhdGFfdXBkYXRlKGRpcik7CisJaWYgKGVycm9yICE9IDApCisJCWdvdG8gb3V0X2VycjsKKwluZnNfcmVuZXdfdGltZXMoZGVudHJ5KTsKKwluZnNfc2V0X3ZlcmlmaWVyKGRlbnRyeSwgbmZzX3NhdmVfY2hhbmdlX2F0dHJpYnV0ZShkaXIpKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7CitvdXRfZXJyOgorCWRfZHJvcChkZW50cnkpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgbmZzX3JtZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJaW50IGVycm9yOworCisJZGZwcmludGsoVkZTLCAiTkZTOiBybWRpciglcy8lbGQsICVzXG4iLCBkaXItPmlfc2ItPnNfaWQsCisJCWRpci0+aV9pbm8sIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJbG9ja19rZXJuZWwoKTsKKwluZnNfYmVnaW5fZGF0YV91cGRhdGUoZGlyKTsKKwllcnJvciA9IE5GU19QUk9UTyhkaXIpLT5ybWRpcihkaXIsICZkZW50cnktPmRfbmFtZSk7CisJLyogRW5zdXJlIHRoZSBWRlMgZGVsZXRlcyB0aGlzIGlub2RlICovCisJaWYgKGVycm9yID09IDAgJiYgZGVudHJ5LT5kX2lub2RlICE9IE5VTEwpCisJCWRlbnRyeS0+ZF9pbm9kZS0+aV9ubGluayA9IDA7CisJbmZzX2VuZF9kYXRhX3VwZGF0ZShkaXIpOworCXVubG9ja19rZXJuZWwoKTsKKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBuZnNfc2lsbHlyZW5hbWUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdGF0aWMgdW5zaWduZWQgaW50IHNpbGx5Y291bnRlcjsKKwljb25zdCBpbnQgICAgICBpX2lub3NpemUgID0gc2l6ZW9mKGRpci0+aV9pbm8pKjI7CisJY29uc3QgaW50ICAgICAgY291bnRlcnNpemUgPSBzaXplb2Yoc2lsbHljb3VudGVyKSoyOworCWNvbnN0IGludCAgICAgIHNsZW4gICAgICAgPSBzaXplb2YoIi5uZnMiKSArIGlfaW5vc2l6ZSArIGNvdW50ZXJzaXplIC0gMTsKKwljaGFyICAgICAgICAgICBzaWxseVtzbGVuKzFdOworCXN0cnVjdCBxc3RyICAgIHFzaWxseTsKKwlzdHJ1Y3QgZGVudHJ5ICpzZGVudHJ5OworCWludCAgICAgICAgICAgIGVycm9yID0gLUVJTzsKKworCWRmcHJpbnRrKFZGUywgIk5GUzogc2lsbHktcmVuYW1lKCVzLyVzLCBjdD0lZClcbiIsCisJCWRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lLCAKKwkJYXRvbWljX3JlYWQoJmRlbnRyeS0+ZF9jb3VudCkpOworCisjaWZkZWYgTkZTX1BBUkFOT0lBCitpZiAoIWRlbnRyeS0+ZF9pbm9kZSkKK3ByaW50aygiTkZTOiBzaWxseS1yZW5hbWluZyAlcy8lcywgbmVnYXRpdmUgZGVudHJ5Pz9cbiIsCitkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisjZW5kaWYKKwkvKgorCSAqIFdlIGRvbid0IGFsbG93IGEgZGVudHJ5IHRvIGJlIHNpbGx5LXJlbmFtZWQgdHdpY2UuCisJICovCisJZXJyb3IgPSAtRUJVU1k7CisJaWYgKGRlbnRyeS0+ZF9mbGFncyAmIERDQUNIRV9ORlNGU19SRU5BTUVEKQorCQlnb3RvIG91dDsKKworCXNwcmludGYoc2lsbHksICIubmZzJSouKmx4IiwKKwkJaV9pbm9zaXplLCBpX2lub3NpemUsIGRlbnRyeS0+ZF9pbm9kZS0+aV9pbm8pOworCisJc2RlbnRyeSA9IE5VTEw7CisJZG8geworCQljaGFyICpzdWZmaXggPSBzaWxseSArIHNsZW4gLSBjb3VudGVyc2l6ZTsKKworCQlkcHV0KHNkZW50cnkpOworCQlzaWxseWNvdW50ZXIrKzsKKwkJc3ByaW50ZihzdWZmaXgsICIlKi4qeCIsIGNvdW50ZXJzaXplLCBjb3VudGVyc2l6ZSwgc2lsbHljb3VudGVyKTsKKworCQlkZnByaW50ayhWRlMsICJ0cnlpbmcgdG8gcmVuYW1lICVzIHRvICVzXG4iLAorCQkJIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIHNpbGx5KTsKKwkJCisJCXNkZW50cnkgPSBsb29rdXBfb25lX2xlbihzaWxseSwgZGVudHJ5LT5kX3BhcmVudCwgc2xlbik7CisJCS8qCisJCSAqIE4uQi4gQmV0dGVyIHRvIHJldHVybiBFQlVTWSBoZXJlIC4uLiBpdCBjb3VsZCBiZQorCQkgKiBkYW5nZXJvdXMgdG8gZGVsZXRlIHRoZSBmaWxlIHdoaWxlIGl0J3MgaW4gdXNlLgorCQkgKi8KKwkJaWYgKElTX0VSUihzZGVudHJ5KSkKKwkJCWdvdG8gb3V0OworCX0gd2hpbGUoc2RlbnRyeS0+ZF9pbm9kZSAhPSBOVUxMKTsgLyogbmVlZCBuZWdhdGl2ZSBsb29rdXAgKi8KKworCXFzaWxseS5uYW1lID0gc2lsbHk7CisJcXNpbGx5LmxlbiAgPSBzdHJsZW4oc2lsbHkpOworCW5mc19iZWdpbl9kYXRhX3VwZGF0ZShkaXIpOworCWlmIChkZW50cnktPmRfaW5vZGUpIHsKKwkJbmZzX2JlZ2luX2RhdGFfdXBkYXRlKGRlbnRyeS0+ZF9pbm9kZSk7CisJCWVycm9yID0gTkZTX1BST1RPKGRpciktPnJlbmFtZShkaXIsICZkZW50cnktPmRfbmFtZSwKKwkJCQlkaXIsICZxc2lsbHkpOworCQluZnNfZW5kX2RhdGFfdXBkYXRlKGRlbnRyeS0+ZF9pbm9kZSk7CisJfSBlbHNlCisJCWVycm9yID0gTkZTX1BST1RPKGRpciktPnJlbmFtZShkaXIsICZkZW50cnktPmRfbmFtZSwKKwkJCQlkaXIsICZxc2lsbHkpOworCW5mc19lbmRfZGF0YV91cGRhdGUoZGlyKTsKKwlpZiAoIWVycm9yKSB7CisJCW5mc19yZW5ld190aW1lcyhkZW50cnkpOworCQluZnNfc2V0X3ZlcmlmaWVyKGRlbnRyeSwgbmZzX3NhdmVfY2hhbmdlX2F0dHJpYnV0ZShkaXIpKTsKKwkJZF9tb3ZlKGRlbnRyeSwgc2RlbnRyeSk7CisJCWVycm9yID0gbmZzX2FzeW5jX3VubGluayhkZW50cnkpOworIAkJLyogSWYgd2UgcmV0dXJuIDAgd2UgZG9uJ3QgdW5saW5rICovCisJfQorCWRwdXQoc2RlbnRyeSk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogUmVtb3ZlIGEgZmlsZSBhZnRlciBtYWtpbmcgc3VyZSB0aGVyZSBhcmUgbm8gcGVuZGluZyB3cml0ZXMsCisgKiBhbmQgYWZ0ZXIgY2hlY2tpbmcgdGhhdCB0aGUgZmlsZSBoYXMgb25seSBvbmUgdXNlci4gCisgKgorICogV2UgaW52YWxpZGF0ZSB0aGUgYXR0cmlidXRlIGNhY2hlIGFuZCBmcmVlIHRoZSBpbm9kZSBwcmlvciB0byB0aGUgb3BlcmF0aW9uCisgKiB0byBhdm9pZCBwb3NzaWJsZSByYWNlcyBpZiB0aGUgc2VydmVyIHJldXNlcyB0aGUgaW5vZGUuCisgKi8KK3N0YXRpYyBpbnQgbmZzX3NhZmVfcmVtb3ZlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmRpciA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgZXJyb3IgPSAtRUJVU1k7CisJCQorCWRmcHJpbnRrKFZGUywgIk5GUzogc2FmZV9yZW1vdmUoJXMvJXMpXG4iLAorCQlkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwkvKiBJZiB0aGUgZGVudHJ5IHdhcyBzaWxseXJlbmFtZWQsIHdlIHNpbXBseSBjYWxsIGRfZGVsZXRlKCkgKi8KKwlpZiAoZGVudHJ5LT5kX2ZsYWdzICYgRENBQ0hFX05GU0ZTX1JFTkFNRUQpIHsKKwkJZXJyb3IgPSAwOworCQlnb3RvIG91dDsKKwl9CisKKwluZnNfYmVnaW5fZGF0YV91cGRhdGUoZGlyKTsKKwlpZiAoaW5vZGUgIT0gTlVMTCkgeworCQluZnNfYmVnaW5fZGF0YV91cGRhdGUoaW5vZGUpOworCQllcnJvciA9IE5GU19QUk9UTyhkaXIpLT5yZW1vdmUoZGlyLCAmZGVudHJ5LT5kX25hbWUpOworCQkvKiBUaGUgVkZTIG1heSB3YW50IHRvIGRlbGV0ZSB0aGlzIGlub2RlICovCisJCWlmIChlcnJvciA9PSAwKQorCQkJaW5vZGUtPmlfbmxpbmstLTsKKwkJbmZzX2VuZF9kYXRhX3VwZGF0ZShpbm9kZSk7CisJfSBlbHNlCisJCWVycm9yID0gTkZTX1BST1RPKGRpciktPnJlbW92ZShkaXIsICZkZW50cnktPmRfbmFtZSk7CisJbmZzX2VuZF9kYXRhX3VwZGF0ZShkaXIpOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworLyogIFdlIGRvIHNpbGx5IHJlbmFtZS4gSW4gY2FzZSBzaWxseXJlbmFtZSgpIHJldHVybnMgLUVCVVNZLCB0aGUgaW5vZGUKKyAqICBiZWxvbmdzIHRvIGFuIGFjdGl2ZSAiLm5mcy4uLiIgZmlsZSBhbmQgd2UgcmV0dXJuIC1FQlVTWS4KKyAqCisgKiAgSWYgc2lsbHlyZW5hbWUoKSByZXR1cm5zIDAsIHdlIGRvIG5vdGhpbmcsIG90aGVyd2lzZSB3ZSB1bmxpbmsuCisgKi8KK3N0YXRpYyBpbnQgbmZzX3VubGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWludCBlcnJvcjsKKwlpbnQgbmVlZF9yZWhhc2ggPSAwOworCisJZGZwcmludGsoVkZTLCAiTkZTOiB1bmxpbmsoJXMvJWxkLCAlcylcbiIsIGRpci0+aV9zYi0+c19pZCwKKwkJZGlyLT5pX2lubywgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwlsb2NrX2tlcm5lbCgpOworCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCXNwaW5fbG9jaygmZGVudHJ5LT5kX2xvY2spOworCWlmIChhdG9taWNfcmVhZCgmZGVudHJ5LT5kX2NvdW50KSA+IDEpIHsKKwkJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwkJZXJyb3IgPSBuZnNfc2lsbHlyZW5hbWUoZGlyLCBkZW50cnkpOworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiBlcnJvcjsKKwl9CisJaWYgKCFkX3VuaGFzaGVkKGRlbnRyeSkpIHsKKwkJX19kX2Ryb3AoZGVudHJ5KTsKKwkJbmVlZF9yZWhhc2ggPSAxOworCX0KKwlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisJZXJyb3IgPSBuZnNfc2FmZV9yZW1vdmUoZGVudHJ5KTsKKwlpZiAoIWVycm9yKSB7CisJCW5mc19yZW5ld190aW1lcyhkZW50cnkpOworCQluZnNfc2V0X3ZlcmlmaWVyKGRlbnRyeSwgbmZzX3NhdmVfY2hhbmdlX2F0dHJpYnV0ZShkaXIpKTsKKwl9IGVsc2UgaWYgKG5lZWRfcmVoYXNoKQorCQlkX3JlaGFzaChkZW50cnkpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQKK25mc19zeW1saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKnN5bW5hbWUpCit7CisJc3RydWN0IGlhdHRyIGF0dHI7CisJc3RydWN0IG5mc19mYXR0ciBzeW1fYXR0cjsKKwlzdHJ1Y3QgbmZzX2ZoIHN5bV9maDsKKwlzdHJ1Y3QgcXN0ciBxc3ltbmFtZTsKKwlpbnQgZXJyb3I7CisKKwlkZnByaW50ayhWRlMsICJORlM6IHN5bWxpbmsoJXMvJWxkLCAlcywgJXMpXG4iLCBkaXItPmlfc2ItPnNfaWQsCisJCWRpci0+aV9pbm8sIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIHN5bW5hbWUpOworCisjaWZkZWYgTkZTX1BBUkFOT0lBCitpZiAoZGVudHJ5LT5kX2lub2RlKQorcHJpbnRrKCJuZnNfcHJvY19zeW1saW5rOiAlcy8lcyBub3QgbmVnYXRpdmUhXG4iLAorZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworI2VuZGlmCisJLyoKKwkgKiBGaWxsIGluIHRoZSBzYXR0ciBmb3IgdGhlIGNhbGwuCisgCSAqIE5vdGU6IFN1bk9TIDQuMS4yIGNyYXNoZXMgaWYgdGhlIG1vZGUgaXNuJ3QgaW5pdGlhbGl6ZWQhCisJICovCisJYXR0ci5pYV92YWxpZCA9IEFUVFJfTU9ERTsKKwlhdHRyLmlhX21vZGUgPSBTX0lGTE5LIHwgU19JUldYVUdPOworCisJcXN5bW5hbWUubmFtZSA9IHN5bW5hbWU7CisJcXN5bW5hbWUubGVuICA9IHN0cmxlbihzeW1uYW1lKTsKKworCWxvY2tfa2VybmVsKCk7CisJbmZzX2JlZ2luX2RhdGFfdXBkYXRlKGRpcik7CisJZXJyb3IgPSBORlNfUFJPVE8oZGlyKS0+c3ltbGluayhkaXIsICZkZW50cnktPmRfbmFtZSwgJnFzeW1uYW1lLAorCQkJCQkgICZhdHRyLCAmc3ltX2ZoLCAmc3ltX2F0dHIpOworCW5mc19lbmRfZGF0YV91cGRhdGUoZGlyKTsKKwlpZiAoIWVycm9yKSB7CisJCWVycm9yID0gbmZzX2luc3RhbnRpYXRlKGRlbnRyeSwgJnN5bV9maCwgJnN5bV9hdHRyKTsKKwl9IGVsc2UgeworCQlpZiAoZXJyb3IgPT0gLUVFWElTVCkKKwkJCXByaW50aygibmZzX3Byb2Nfc3ltbGluazogJXMvJXMgYWxyZWFkeSBleGlzdHM/P1xuIiwKKwkJCSAgICAgICBkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisJCWRfZHJvcChkZW50cnkpOworCX0KKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IAorbmZzX2xpbmsoc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwgc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gb2xkX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgZXJyb3I7CisKKwlkZnByaW50ayhWRlMsICJORlM6IGxpbmsoJXMvJXMgLT4gJXMvJXMpXG4iLAorCQlvbGRfZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIG9sZF9kZW50cnktPmRfbmFtZS5uYW1lLAorCQlkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisKKwkvKgorCSAqIERyb3AgdGhlIGRlbnRyeSBpbiBhZHZhbmNlIHRvIGZvcmNlIGEgbmV3IGxvb2t1cC4KKwkgKiBTaW5jZSBuZnNfcHJvY19saW5rIGRvZXNuJ3QgcmV0dXJuIGEgZmlsZSBoYW5kbGUsCisJICogd2UgY2FuJ3QgdXNlIHRoZSBleGlzdGluZyBkZW50cnkuCisJICovCisJbG9ja19rZXJuZWwoKTsKKwlkX2Ryb3AoZGVudHJ5KTsKKworCW5mc19iZWdpbl9kYXRhX3VwZGF0ZShkaXIpOworCW5mc19iZWdpbl9kYXRhX3VwZGF0ZShpbm9kZSk7CisJZXJyb3IgPSBORlNfUFJPVE8oZGlyKS0+bGluayhpbm9kZSwgZGlyLCAmZGVudHJ5LT5kX25hbWUpOworCW5mc19lbmRfZGF0YV91cGRhdGUoaW5vZGUpOworCW5mc19lbmRfZGF0YV91cGRhdGUoZGlyKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogUkVOQU1FCisgKiBGSVhNRTogU29tZSBuZnNkcywgbGlrZSB0aGUgTGludXggdXNlciBzcGFjZSBuZnNkLCBtYXkgZ2VuZXJhdGUgYQorICogZGlmZmVyZW50IGZpbGUgaGFuZGxlIGZvciB0aGUgc2FtZSBpbm9kZSBhZnRlciBhIHJlbmFtZSAoZS5nLiB3aGVuCisgKiBtb3ZpbmcgdG8gYSBkaWZmZXJlbnQgZGlyZWN0b3J5KS4gQSBmYWlsLXNhZmUgbWV0aG9kIHRvIGRvIHNvIHdvdWxkCisgKiBiZSB0byBsb29rIHVwIG9sZF9kaXIvb2xkX25hbWUsIGNyZWF0ZSBhIGxpbmsgdG8gbmV3X2Rpci9uZXdfbmFtZSBhbmQKKyAqIHJlbmFtZSB0aGUgb2xkIGZpbGUgdXNpbmcgdGhlIHNpbGx5cmVuYW1lIHN0dWZmLiBUaGlzIHdheSwgdGhlIG9yaWdpbmFsCisgKiBmaWxlIGluIG9sZF9kaXIgd2lsbCBnbyBhd2F5IHdoZW4gdGhlIGxhc3QgcHJvY2VzcyBpcHV0KClzIHRoZSBpbm9kZS4KKyAqCisgKiBGSVhFRC4KKyAqIAorICogSXQgYWN0dWFsbHkgd29ya3MgcXVpdGUgd2VsbC4gT25lIG5lZWRzIHRvIGhhdmUgdGhlIHBvc3NpYmlsaXR5IGZvcgorICogYXQgbGVhc3Qgb25lICIubmZzLi4uIiBmaWxlIGluIGVhY2ggZGlyZWN0b3J5IHRoZSBmaWxlIGV2ZXIgZ2V0cworICogbW92ZWQgb3IgbGlua2VkIHRvIHdoaWNoIGhhcHBlbnMgYXV0b21hZ2ljYWxseSB3aXRoIHRoZSBuZXcKKyAqIGltcGxlbWVudGF0aW9uIHRoYXQgb25seSBkZXBlbmRzIG9uIHRoZSBkY2FjaGUgc3R1ZmYgaW5zdGVhZCBvZgorICogdXNpbmcgdGhlIGlub2RlIGxheWVyCisgKgorICogVW5mb3J0dW5hdGVseSwgdGhpbmdzIGFyZSBhIGxpdHRsZSBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gaW5kaWNhdGVkCisgKiBhYm92ZS4gRm9yIGEgY3Jvc3MtZGlyZWN0b3J5IG1vdmUsIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHdlIGNhbiBnZXQKKyAqIHJpZCBvZiB0aGUgb2xkIGlub2RlIGFmdGVyIHRoZSBvcGVyYXRpb24uICBUaGlzIG1lYW5zIHRoZXJlIG11c3QgYmUKKyAqIG5vIHBlbmRpbmcgd3JpdGVzIChpZiBpdCdzIGEgZmlsZSksIGFuZCB0aGUgdXNlIGNvdW50IG11c3QgYmUgMS4KKyAqIElmIHRoZXNlIGNvbmRpdGlvbnMgYXJlIG1ldCwgd2UgY2FuIGRyb3AgdGhlIGRlbnRyaWVzIGJlZm9yZSBkb2luZworICogdGhlIHJlbmFtZS4KKyAqLworc3RhdGljIGludCBuZnNfcmVuYW1lKHN0cnVjdCBpbm9kZSAqb2xkX2Rpciwgc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwKKwkJICAgICAgc3RydWN0IGlub2RlICpuZXdfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqb2xkX2lub2RlID0gb2xkX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKm5ld19pbm9kZSA9IG5ld19kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gTlVMTCwgKnJlaGFzaCA9IE5VTEw7CisJaW50IGVycm9yID0gLUVCVVNZOworCisJLyoKKwkgKiBUbyBwcmV2ZW50IGFueSBuZXcgcmVmZXJlbmNlcyB0byB0aGUgdGFyZ2V0IGR1cmluZyB0aGUgcmVuYW1lLAorCSAqIHdlIHVuaGFzaCB0aGUgZGVudHJ5IGFuZCBmcmVlIHRoZSBpbm9kZSBpbiBhZHZhbmNlLgorCSAqLworCWxvY2tfa2VybmVsKCk7CisJaWYgKCFkX3VuaGFzaGVkKG5ld19kZW50cnkpKSB7CisJCWRfZHJvcChuZXdfZGVudHJ5KTsKKwkJcmVoYXNoID0gbmV3X2RlbnRyeTsKKwl9CisKKwlkZnByaW50ayhWRlMsICJORlM6IHJlbmFtZSglcy8lcyAtPiAlcy8lcywgY3Q9JWQpXG4iLAorCQkgb2xkX2RlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBvbGRfZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJIG5ld19kZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCSBhdG9taWNfcmVhZCgmbmV3X2RlbnRyeS0+ZF9jb3VudCkpOworCisJLyoKKwkgKiBGaXJzdCBjaGVjayB3aGV0aGVyIHRoZSB0YXJnZXQgaXMgYnVzeSAuLi4gd2UgY2FuJ3QKKwkgKiBzYWZlbHkgZG8gX2FueV8gcmVuYW1lIGlmIHRoZSB0YXJnZXQgaXMgaW4gdXNlLgorCSAqCisJICogRm9yIGZpbGVzLCBtYWtlIGEgY29weSBvZiB0aGUgZGVudHJ5IGFuZCB0aGVuIGRvIGEgCisJICogc2lsbHktcmVuYW1lLiBJZiB0aGUgc2lsbHktcmVuYW1lIHN1Y2NlZWRzLCB0aGUKKwkgKiBjb3BpZWQgZGVudHJ5IGlzIGhhc2hlZCBhbmQgYmVjb21lcyB0aGUgbmV3IHRhcmdldC4KKwkgKi8KKwlpZiAoIW5ld19pbm9kZSkKKwkJZ290byBnb19haGVhZDsKKwlpZiAoU19JU0RJUihuZXdfaW5vZGUtPmlfbW9kZSkpCisJCWdvdG8gb3V0OworCWVsc2UgaWYgKGF0b21pY19yZWFkKCZuZXdfZGVudHJ5LT5kX2NvdW50KSA+IDIpIHsKKwkJaW50IGVycjsKKwkJLyogY29weSB0aGUgdGFyZ2V0IGRlbnRyeSdzIG5hbWUgKi8KKwkJZGVudHJ5ID0gZF9hbGxvYyhuZXdfZGVudHJ5LT5kX3BhcmVudCwKKwkJCQkgJm5ld19kZW50cnktPmRfbmFtZSk7CisJCWlmICghZGVudHJ5KQorCQkJZ290byBvdXQ7CisKKwkJLyogc2lsbHktcmVuYW1lIHRoZSBleGlzdGluZyB0YXJnZXQgLi4uICovCisJCWVyciA9IG5mc19zaWxseXJlbmFtZShuZXdfZGlyLCBuZXdfZGVudHJ5KTsKKwkJaWYgKCFlcnIpIHsKKwkJCW5ld19kZW50cnkgPSByZWhhc2ggPSBkZW50cnk7CisJCQluZXdfaW5vZGUgPSBOVUxMOworCQkJLyogaW5zdGFudGlhdGUgdGhlIHJlcGxhY2VtZW50IHRhcmdldCAqLworCQkJZF9pbnN0YW50aWF0ZShuZXdfZGVudHJ5LCBOVUxMKTsKKwkJfSBlbHNlIGlmIChhdG9taWNfcmVhZCgmbmV3X2RlbnRyeS0+ZF9jb3VudCkgPiAxKSB7CisJCS8qIGRlbnRyeSBzdGlsbCBidXN5PyAqLworI2lmZGVmIE5GU19QQVJBTk9JQQorCQkJcHJpbnRrKCJuZnNfcmVuYW1lOiB0YXJnZXQgJXMvJXMgYnVzeSwgZF9jb3VudD0lZFxuIiwKKwkJCSAgICAgICBuZXdfZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsCisJCQkgICAgICAgbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkgICAgICAgYXRvbWljX3JlYWQoJm5ld19kZW50cnktPmRfY291bnQpKTsKKyNlbmRpZgorCQkJZ290byBvdXQ7CisJCX0KKwl9CisKK2dvX2FoZWFkOgorCS8qCisJICogLi4uIHBydW5lIGNoaWxkIGRlbnRyaWVzIGFuZCB3cml0ZWJhY2tzIGlmIG5lZWRlZC4KKwkgKi8KKwlpZiAoYXRvbWljX3JlYWQoJm9sZF9kZW50cnktPmRfY291bnQpID4gMSkgeworCQluZnNfd2JfYWxsKG9sZF9pbm9kZSk7CisJCXNocmlua19kY2FjaGVfcGFyZW50KG9sZF9kZW50cnkpOworCX0KKworCWlmIChuZXdfaW5vZGUpCisJCWRfZGVsZXRlKG5ld19kZW50cnkpOworCisJbmZzX2JlZ2luX2RhdGFfdXBkYXRlKG9sZF9kaXIpOworCW5mc19iZWdpbl9kYXRhX3VwZGF0ZShuZXdfZGlyKTsKKwluZnNfYmVnaW5fZGF0YV91cGRhdGUob2xkX2lub2RlKTsKKwllcnJvciA9IE5GU19QUk9UTyhvbGRfZGlyKS0+cmVuYW1lKG9sZF9kaXIsICZvbGRfZGVudHJ5LT5kX25hbWUsCisJCQkJCSAgIG5ld19kaXIsICZuZXdfZGVudHJ5LT5kX25hbWUpOworCW5mc19lbmRfZGF0YV91cGRhdGUob2xkX2lub2RlKTsKKwluZnNfZW5kX2RhdGFfdXBkYXRlKG5ld19kaXIpOworCW5mc19lbmRfZGF0YV91cGRhdGUob2xkX2Rpcik7CitvdXQ6CisJaWYgKHJlaGFzaCkKKwkJZF9yZWhhc2gocmVoYXNoKTsKKwlpZiAoIWVycm9yKSB7CisJCWlmICghU19JU0RJUihvbGRfaW5vZGUtPmlfbW9kZSkpCisJCQlkX21vdmUob2xkX2RlbnRyeSwgbmV3X2RlbnRyeSk7CisJCW5mc19yZW5ld190aW1lcyhuZXdfZGVudHJ5KTsKKwkJbmZzX3NldF92ZXJpZmllcihuZXdfZGVudHJ5LCBuZnNfc2F2ZV9jaGFuZ2VfYXR0cmlidXRlKG5ld19kaXIpKTsKKwl9CisKKwkvKiBuZXcgZGVudHJ5IGNyZWF0ZWQ/ICovCisJaWYgKGRlbnRyeSkKKwkJZHB1dChkZW50cnkpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2ludCBuZnNfYWNjZXNzX2dldF9jYWNoZWQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHJwY19jcmVkICpjcmVkLCBzdHJ1Y3QgbmZzX2FjY2Vzc19lbnRyeSAqcmVzKQoreworCXN0cnVjdCBuZnNfYWNjZXNzX2VudHJ5ICpjYWNoZSA9ICZORlNfSShpbm9kZSktPmNhY2hlX2FjY2VzczsKKworCWlmIChjYWNoZS0+Y3JlZCAhPSBjcmVkCisJCQl8fCB0aW1lX2FmdGVyKGppZmZpZXMsIGNhY2hlLT5qaWZmaWVzICsgTkZTX0FUVFJUSU1FTyhpbm9kZSkpCisJCQl8fCAoTkZTX0ZMQUdTKGlub2RlKSAmIE5GU19JTk9fSU5WQUxJRF9BQ0NFU1MpKQorCQlyZXR1cm4gLUVOT0VOVDsKKwltZW1jcHkocmVzLCBjYWNoZSwgc2l6ZW9mKCpyZXMpKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBuZnNfYWNjZXNzX2FkZF9jYWNoZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbmZzX2FjY2Vzc19lbnRyeSAqc2V0KQoreworCXN0cnVjdCBuZnNfYWNjZXNzX2VudHJ5ICpjYWNoZSA9ICZORlNfSShpbm9kZSktPmNhY2hlX2FjY2VzczsKKworCWlmIChjYWNoZS0+Y3JlZCAhPSBzZXQtPmNyZWQpIHsKKwkJaWYgKGNhY2hlLT5jcmVkKQorCQkJcHV0X3JwY2NyZWQoY2FjaGUtPmNyZWQpOworCQljYWNoZS0+Y3JlZCA9IGdldF9ycGNjcmVkKHNldC0+Y3JlZCk7CisJfQorCU5GU19GTEFHUyhpbm9kZSkgJj0gfk5GU19JTk9fSU5WQUxJRF9BQ0NFU1M7CisJY2FjaGUtPmppZmZpZXMgPSBzZXQtPmppZmZpZXM7CisJY2FjaGUtPm1hc2sgPSBzZXQtPm1hc2s7Cit9CisKK3N0YXRpYyBpbnQgbmZzX2RvX2FjY2VzcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQsIGludCBtYXNrKQoreworCXN0cnVjdCBuZnNfYWNjZXNzX2VudHJ5IGNhY2hlOworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBuZnNfYWNjZXNzX2dldF9jYWNoZWQoaW5vZGUsIGNyZWQsICZjYWNoZSk7CisJaWYgKHN0YXR1cyA9PSAwKQorCQlnb3RvIG91dDsKKworCS8qIEJlIGNsZXZlcjogYXNrIHNlcnZlciB0byBjaGVjayBmb3IgYWxsIHBvc3NpYmxlIHJpZ2h0cyAqLworCWNhY2hlLm1hc2sgPSBNQVlfRVhFQyB8IE1BWV9XUklURSB8IE1BWV9SRUFEOworCWNhY2hlLmNyZWQgPSBjcmVkOworCWNhY2hlLmppZmZpZXMgPSBqaWZmaWVzOworCXN0YXR1cyA9IE5GU19QUk9UTyhpbm9kZSktPmFjY2Vzcyhpbm9kZSwgJmNhY2hlKTsKKwlpZiAoc3RhdHVzICE9IDApCisJCXJldHVybiBzdGF0dXM7CisJbmZzX2FjY2Vzc19hZGRfY2FjaGUoaW5vZGUsICZjYWNoZSk7CitvdXQ6CisJaWYgKChjYWNoZS5tYXNrICYgbWFzaykgPT0gbWFzaykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQUNDRVM7Cit9CisKK2ludCBuZnNfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IHJwY19jcmVkICpjcmVkOworCWludCByZXMgPSAwOworCisJaWYgKG1hc2sgPT0gMCkKKwkJZ290byBvdXQ7CisJLyogSXMgdGhpcyBzeXNfYWNjZXNzKCkgPyAqLworCWlmIChuZCAhPSBOVUxMICYmIChuZC0+ZmxhZ3MgJiBMT09LVVBfQUNDRVNTKSkKKwkJZ290byBmb3JjZV9sb29rdXA7CisKKwlzd2l0Y2ggKGlub2RlLT5pX21vZGUgJiBTX0lGTVQpIHsKKwkJY2FzZSBTX0lGTE5LOgorCQkJZ290byBvdXQ7CisJCWNhc2UgU19JRlJFRzoKKwkJCS8qIE5GU3Y0IGhhcyBhdG9taWNfb3Blbi4uLiAqLworCQkJaWYgKG5mc19zZXJ2ZXJfY2FwYWJsZShpbm9kZSwgTkZTX0NBUF9BVE9NSUNfT1BFTikKKwkJCQkJJiYgbmQgIT0gTlVMTAorCQkJCQkmJiAobmQtPmZsYWdzICYgTE9PS1VQX09QRU4pKQorCQkJCWdvdG8gb3V0OworCQkJYnJlYWs7CisJCWNhc2UgU19JRkRJUjoKKwkJCS8qCisJCQkgKiBPcHRpbWl6ZSBhd2F5IGFsbCB3cml0ZSBvcGVyYXRpb25zLCBzaW5jZSB0aGUgc2VydmVyCisJCQkgKiB3aWxsIGNoZWNrIHBlcm1pc3Npb25zIHdoZW4gd2UgcGVyZm9ybSB0aGUgb3AuCisJCQkgKi8KKwkJCWlmICgobWFzayAmIE1BWV9XUklURSkgJiYgIShtYXNrICYgTUFZX1JFQUQpKQorCQkJCWdvdG8gb3V0OworCX0KKworZm9yY2VfbG9va3VwOgorCWxvY2tfa2VybmVsKCk7CisKKwlpZiAoIU5GU19QUk9UTyhpbm9kZSktPmFjY2VzcykKKwkJZ290byBvdXRfbm90c3VwOworCisJY3JlZCA9IHJwY2F1dGhfbG9va3VwY3JlZChORlNfQ0xJRU5UKGlub2RlKS0+Y2xfYXV0aCwgMCk7CisJaWYgKCFJU19FUlIoY3JlZCkpIHsKKwkJcmVzID0gbmZzX2RvX2FjY2Vzcyhpbm9kZSwgY3JlZCwgbWFzayk7CisJCXB1dF9ycGNjcmVkKGNyZWQpOworCX0gZWxzZQorCQlyZXMgPSBQVFJfRVJSKGNyZWQpOworCXVubG9ja19rZXJuZWwoKTsKK291dDoKKwlyZXR1cm4gcmVzOworb3V0X25vdHN1cDoKKwlyZXMgPSBuZnNfcmV2YWxpZGF0ZV9pbm9kZShORlNfU0VSVkVSKGlub2RlKSwgaW5vZGUpOworCWlmIChyZXMgPT0gMCkKKwkJcmVzID0gZ2VuZXJpY19wZXJtaXNzaW9uKGlub2RlLCBtYXNrLCBOVUxMKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJlczsKK30KKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICB2ZXJzaW9uLWNvbnRyb2w6IHQKKyAqICBrZXB0LW5ldy12ZXJzaW9uczogNQorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9mcy9uZnMvZGlyZWN0LmMgYi9mcy9uZnMvZGlyZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhkZjgwMwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25mcy9kaXJlY3QuYwpAQCAtMCwwICsxLDgwOCBAQAorLyoKKyAqIGxpbnV4L2ZzL25mcy9kaXJlY3QuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBieSBDaHVjayBMZXZlciA8Y2VsQG5ldGFwcC5jb20+CisgKgorICogSGlnaC1wZXJmb3JtYW5jZSB1bmNhY2hlZCBJL08gZm9yIHRoZSBMaW51eCBORlMgY2xpZW50CisgKgorICogVGhlcmUgYXJlIGltcG9ydGFudCBhcHBsaWNhdGlvbnMgd2hvc2UgcGVyZm9ybWFuY2Ugb3IgY29ycmVjdG5lc3MKKyAqIGRlcGVuZHMgb24gdW5jYWNoZWQgYWNjZXNzIHRvIGZpbGUgZGF0YS4gIERhdGFiYXNlIGNsdXN0ZXJzCisgKiAobXVsdGlwbGUgY29waWVzIG9mIHRoZSBzYW1lIGluc3RhbmNlIHJ1bm5pbmcgb24gc2VwYXJhdGUgaG9zdHMpIAorICogaW1wbGVtZW50IHRoZWlyIG93biBjYWNoZSBjb2hlcmVuY3kgcHJvdG9jb2wgdGhhdCBzdWJzdW1lcyBmaWxlCisgKiBzeXN0ZW0gY2FjaGUgcHJvdG9jb2xzLiAgQXBwbGljYXRpb25zIHRoYXQgcHJvY2VzcyBkYXRhc2V0cyAKKyAqIGNvbnNpZGVyYWJseSBsYXJnZXIgdGhhbiB0aGUgY2xpZW50J3MgbWVtb3J5IGRvIG5vdCBhbHdheXMgYmVuZWZpdCAKKyAqIGZyb20gYSBsb2NhbCBjYWNoZS4gIEEgc3RyZWFtaW5nIHZpZGVvIHNlcnZlciwgZm9yIGluc3RhbmNlLCBoYXMgbm8gCisgKiBuZWVkIHRvIGNhY2hlIHRoZSBjb250ZW50cyBvZiBhIGZpbGUuCisgKgorICogV2hlbiBhbiBhcHBsaWNhdGlvbiByZXF1ZXN0cyB1bmNhY2hlZCBJL08sIGFsbCByZWFkIGFuZCB3cml0ZSByZXF1ZXN0cworICogYXJlIG1hZGUgZGlyZWN0bHkgdG8gdGhlIHNlcnZlcjsgZGF0YSBzdG9yZWQgb3IgZmV0Y2hlZCB2aWEgdGhlc2UKKyAqIHJlcXVlc3RzIGlzIG5vdCBjYWNoZWQgaW4gdGhlIExpbnV4IHBhZ2UgY2FjaGUuICBUaGUgY2xpZW50IGRvZXMgbm90CisgKiBjb3JyZWN0IHVuYWxpZ25lZCByZXF1ZXN0cyBmcm9tIGFwcGxpY2F0aW9ucy4gIEFsbCByZXF1ZXN0ZWQgYnl0ZXMgYXJlCisgKiBoZWxkIG9uIHBlcm1hbmVudCBzdG9yYWdlIGJlZm9yZSBhIGRpcmVjdCB3cml0ZSBzeXN0ZW0gY2FsbCByZXR1cm5zIHRvCisgKiBhbiBhcHBsaWNhdGlvbi4KKyAqCisgKiBTb2xhcmlzIGltcGxlbWVudHMgYW4gdW5jYWNoZWQgSS9PIGZhY2lsaXR5IGNhbGxlZCBkaXJlY3RpbygpIHRoYXQKKyAqIGlzIHVzZWQgZm9yIGJhY2t1cHMgYW5kIHNlcXVlbnRpYWwgSS9PIHRvIHZlcnkgbGFyZ2UgZmlsZXMuICBTb2xhcmlzCisgKiBhbHNvIHN1cHBvcnRzIHVuY2FjaGluZyB3aG9sZSBORlMgcGFydGl0aW9ucyB3aXRoICItbyBmb3JjZWRpcmVjdGlvLCIKKyAqIGFuIHVuZG9jdW1lbnRlZCBtb3VudCBvcHRpb24uCisgKgorICogRGVzaWduZWQgYnkgSmVmZiBLaW1tZWwsIENodWNrIExldmVyLCBhbmQgVHJvbmQgTXlrbGVidXN0LCB3aXRoCisgKiBoZWxwIGZyb20gQW5kcmV3IE1vcnRvbi4KKyAqCisgKiAxOCBEZWMgMjAwMQlJbml0aWFsIGltcGxlbWVudGF0aW9uIGZvciAyLjQgIC0tY2VsCisgKiAwOCBKdWwgMjAwMglWZXJzaW9uIGZvciAyLjQuMTksIHdpdGggYnVnIGZpeGVzIC0tdHJvbmRteQorICogMDggSnVuIDIwMDMJUG9ydCB0byAyLjUgQVBJcyAgLS1jZWwKKyAqIDMxIE1hciAyMDA0CUhhbmRsZSBkaXJlY3QgSS9PIHdpdGhvdXQgVkZTIHN1cHBvcnQgIC0tY2VsCisgKiAxNSBTZXAgMjAwNAlQYXJhbGxlbCBhc3luYyByZWFkcyAgLS1jZWwKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgva3JlZi5oPgorCisjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbmZzX3BhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorCisjZGVmaW5lIE5GU0RCR19GQUNJTElUWQkJTkZTREJHX1ZGUworI2RlZmluZSBNQVhfRElSRUNUSU9fU0laRQkoNDA5NlVMIDw8IFBBR0VfU0hJRlQpCisKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKm5mc19kaXJlY3RfY2FjaGVwOworCisvKgorICogVGhpcyByZXByZXNlbnRzIGEgc2V0IG9mIGFzeW5jaHJvbm91cyByZXF1ZXN0cyB0aGF0IHdlJ3JlIHdhaXRpbmcgb24KKyAqLworc3RydWN0IG5mc19kaXJlY3RfcmVxIHsKKwlzdHJ1Y3Qga3JlZgkJa3JlZjsJCS8qIHJlbGVhc2UgbWFuYWdlciAqLworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsJCS8qIG5mc19yZWFkX2RhdGEgc3RydWN0cyAqLworCXdhaXRfcXVldWVfaGVhZF90CXdhaXQ7CQkvKiB3YWl0IGZvciBpL28gY29tcGxldGlvbiAqLworCXN0cnVjdCBwYWdlICoqCQlwYWdlczsJCS8qIHBhZ2VzIGluIG91ciBidWZmZXIgKi8KKwl1bnNpZ25lZCBpbnQJCW5wYWdlczsJCS8qIGNvdW50IG9mIHBhZ2VzICovCisJYXRvbWljX3QJCWNvbXBsZXRlLAkvKiBpL29zIHdlJ3JlIHdhaXRpbmcgZm9yICovCisJCQkJY291bnQsCQkvKiBieXRlcyBhY3R1YWxseSBwcm9jZXNzZWQgKi8KKwkJCQllcnJvcjsJCS8qIGFueSByZXBvcnRlZCBlcnJvciAqLworfTsKKworCisvKioKKyAqIG5mc19nZXRfdXNlcl9wYWdlcyAtIGZpbmQgYW5kIHNldCB1cCBwYWdlcyB1bmRlcmx5aW5nIHVzZXIncyBidWZmZXIKKyAqIHJ3OiBkaXJlY3Rpb24gKHJlYWQgb3Igd3JpdGUpCisgKiB1c2VyX2FkZHI6IHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhpcyBzZWdtZW50IG9mIHVzZXIncyBidWZmZXIKKyAqIGNvdW50OiBzaXplIG9mIHRoaXMgc2VnbWVudAorICogQHBhZ2VzOiByZXR1cm5lZCBhcnJheSBvZiBwYWdlIHN0cnVjdCBwb2ludGVycyB1bmRlcmx5aW5nIHVzZXIncyBidWZmZXIKKyAqLworc3RhdGljIGlubGluZSBpbnQKK25mc19nZXRfdXNlcl9wYWdlcyhpbnQgcncsIHVuc2lnbmVkIGxvbmcgdXNlcl9hZGRyLCBzaXplX3Qgc2l6ZSwKKwkJc3RydWN0IHBhZ2UgKioqcGFnZXMpCit7CisJaW50IHJlc3VsdCA9IC1FTk9NRU07CisJdW5zaWduZWQgbG9uZyBwYWdlX2NvdW50OworCXNpemVfdCBhcnJheV9zaXplOworCisJLyogc2V0IGFuIGFyYml0cmFyeSBsaW1pdCB0byBwcmV2ZW50IHR5cGUgb3ZlcmZsb3cgKi8KKwkvKiBYWFg6IHRoaXMgY2FuIHByb2JhYmx5IGJlIGFzIGxhcmdlIGFzIElOVF9NQVggKi8KKwlpZiAoc2l6ZSA+IE1BWF9ESVJFQ1RJT19TSVpFKSB7CisJCSpwYWdlcyA9IE5VTEw7CisJCXJldHVybiAtRUZCSUc7CisJfQorCisJcGFnZV9jb3VudCA9ICh1c2VyX2FkZHIgKyBzaXplICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVDsKKwlwYWdlX2NvdW50IC09IHVzZXJfYWRkciA+PiBQQUdFX1NISUZUOworCisJYXJyYXlfc2l6ZSA9IChwYWdlX2NvdW50ICogc2l6ZW9mKHN0cnVjdCBwYWdlICopKTsKKwkqcGFnZXMgPSBrbWFsbG9jKGFycmF5X3NpemUsIEdGUF9LRVJORUwpOworCWlmICgqcGFnZXMpIHsKKwkJZG93bl9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOworCQlyZXN1bHQgPSBnZXRfdXNlcl9wYWdlcyhjdXJyZW50LCBjdXJyZW50LT5tbSwgdXNlcl9hZGRyLAorCQkJCQlwYWdlX2NvdW50LCAocncgPT0gUkVBRCksIDAsCisJCQkJCSpwYWdlcywgTlVMTCk7CisJCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogbmZzX2ZyZWVfdXNlcl9wYWdlcyAtIHRlYXIgZG93biBwYWdlIHN0cnVjdCBhcnJheQorICogQHBhZ2VzOiBhcnJheSBvZiBwYWdlIHN0cnVjdCBwb2ludGVycyB1bmRlcmx5aW5nIHRhcmdldCBidWZmZXIKKyAqIEBucGFnZXM6IG51bWJlciBvZiBwYWdlcyBpbiB0aGUgYXJyYXkKKyAqIEBkb19kaXJ0eTogZGlydHkgdGhlIHBhZ2VzIGFzIHdlIHJlbGVhc2UgdGhlbQorICovCitzdGF0aWMgdm9pZAorbmZzX2ZyZWVfdXNlcl9wYWdlcyhzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBpbnQgbnBhZ2VzLCBpbnQgZG9fZGlydHkpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgaSsrKSB7CisJCWlmIChkb19kaXJ0eSkKKwkJCXNldF9wYWdlX2RpcnR5X2xvY2socGFnZXNbaV0pOworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZXNbaV0pOworCX0KKwlrZnJlZShwYWdlcyk7Cit9CisKKy8qKgorICogbmZzX2RpcmVjdF9yZXFfcmVsZWFzZSAtIHJlbGVhc2UgIG5mc19kaXJlY3RfcmVxIHN0cnVjdHVyZSBmb3IgZGlyZWN0IHJlYWQKKyAqIEBrcmVmOiBrcmVmIG9iamVjdCBlbWJlZGRlZCBpbiBhbiBuZnNfZGlyZWN0X3JlcSBzdHJ1Y3R1cmUKKyAqCisgKi8KK3N0YXRpYyB2b2lkIG5mc19kaXJlY3RfcmVxX3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IG5mc19kaXJlY3RfcmVxICpkcmVxID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBuZnNfZGlyZWN0X3JlcSwga3JlZik7CisJa21lbV9jYWNoZV9mcmVlKG5mc19kaXJlY3RfY2FjaGVwLCBkcmVxKTsKK30KKworLyoqCisgKiBuZnNfZGlyZWN0X3JlYWRfYWxsb2MgLSBhbGxvY2F0ZSBuZnNfcmVhZF9kYXRhIHN0cnVjdHVyZXMgZm9yIGRpcmVjdCByZWFkCisgKiBAY291bnQ6IGNvdW50IG9mIGJ5dGVzIGZvciB0aGUgcmVhZCByZXF1ZXN0CisgKiBAcnNpemU6IGxvY2FsIHJzaXplIHNldHRpbmcKKyAqCisgKiBOb3RlIHdlIGFsc28gc2V0IHRoZSBudW1iZXIgb2YgcmVxdWVzdHMgd2UgaGF2ZSBpbiB0aGUgZHJlcSB3aGVuIHdlIGFyZQorICogZG9uZS4gIFRoaXMgcHJldmVudHMgcmFjZXMgd2l0aCBJL08gY29tcGxldGlvbiBzbyB3ZSB3aWxsIGFsd2F5cyB3YWl0CisgKiB1bnRpbCBhbGwgcmVxdWVzdHMgaGF2ZSBiZWVuIGRpc3BhdGNoZWQgYW5kIGNvbXBsZXRlZC4KKyAqLworc3RhdGljIHN0cnVjdCBuZnNfZGlyZWN0X3JlcSAqbmZzX2RpcmVjdF9yZWFkX2FsbG9jKHNpemVfdCBuYnl0ZXMsIHVuc2lnbmVkIGludCByc2l6ZSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBuZnNfZGlyZWN0X3JlcSAqZHJlcTsKKwl1bnNpZ25lZCBpbnQgcmVhZHMgPSAwOworCisJZHJlcSA9IGttZW1fY2FjaGVfYWxsb2MobmZzX2RpcmVjdF9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwlpZiAoIWRyZXEpCisJCXJldHVybiBOVUxMOworCisJa3JlZl9pbml0KCZkcmVxLT5rcmVmKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkcmVxLT53YWl0KTsKKwlJTklUX0xJU1RfSEVBRCgmZHJlcS0+bGlzdCk7CisJYXRvbWljX3NldCgmZHJlcS0+Y291bnQsIDApOworCWF0b21pY19zZXQoJmRyZXEtPmVycm9yLCAwKTsKKworCWxpc3QgPSAmZHJlcS0+bGlzdDsKKwlmb3IoOzspIHsKKwkJc3RydWN0IG5mc19yZWFkX2RhdGEgKmRhdGEgPSBuZnNfcmVhZGRhdGFfYWxsb2MoKTsKKworCQlpZiAodW5saWtlbHkoIWRhdGEpKSB7CisJCQl3aGlsZSAoIWxpc3RfZW1wdHkobGlzdCkpIHsKKwkJCQlkYXRhID0gbGlzdF9lbnRyeShsaXN0LT5uZXh0LAorCQkJCQkJICBzdHJ1Y3QgbmZzX3JlYWRfZGF0YSwgcGFnZXMpOworCQkJCWxpc3RfZGVsKCZkYXRhLT5wYWdlcyk7CisJCQkJbmZzX3JlYWRkYXRhX2ZyZWUoZGF0YSk7CisJCQl9CisJCQlrcmVmX3B1dCgmZHJlcS0+a3JlZiwgbmZzX2RpcmVjdF9yZXFfcmVsZWFzZSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCUlOSVRfTElTVF9IRUFEKCZkYXRhLT5wYWdlcyk7CisJCWxpc3RfYWRkKCZkYXRhLT5wYWdlcywgbGlzdCk7CisKKwkJZGF0YS0+cmVxID0gKHN0cnVjdCBuZnNfcGFnZSAqKSBkcmVxOworCQlyZWFkcysrOworCQlpZiAobmJ5dGVzIDw9IHJzaXplKQorCQkJYnJlYWs7CisJCW5ieXRlcyAtPSByc2l6ZTsKKwl9CisJa3JlZl9nZXQoJmRyZXEtPmtyZWYpOworCWF0b21pY19zZXQoJmRyZXEtPmNvbXBsZXRlLCByZWFkcyk7CisJcmV0dXJuIGRyZXE7Cit9CisKKy8qKgorICogbmZzX2RpcmVjdF9yZWFkX3Jlc3VsdCAtIGhhbmRsZSBhIHJlYWQgcmVwbHkgZm9yIGEgZGlyZWN0IHJlYWQgcmVxdWVzdAorICogQGRhdGE6IGFkZHJlc3Mgb2YgTkZTIFJFQUQgb3BlcmF0aW9uIGNvbnRyb2wgYmxvY2sKKyAqIEBzdGF0dXM6IHN0YXR1cyBvZiB0aGlzIE5GUyBSRUFEIG9wZXJhdGlvbgorICoKKyAqIFdlIG11c3QgaG9sZCBhIHJlZmVyZW5jZSB0byBhbGwgdGhlIHBhZ2VzIGluIHRoaXMgZGlyZWN0IHJlYWQgcmVxdWVzdAorICogdW50aWwgdGhlIFJQQ3MgY29tcGxldGUuICBUaGlzIGNvdWxkIGJlIGxvbmcgKmFmdGVyKiB3ZSBhcmUgd29rZW4gdXAgaW4KKyAqIG5mc19kaXJlY3RfcmVhZF93YWl0IChmb3IgaW5zdGFuY2UsIGlmIHNvbWVvbmUgaGl0cyBeQyBvbiBhIHNsb3cgc2VydmVyKS4KKyAqLworc3RhdGljIHZvaWQgbmZzX2RpcmVjdF9yZWFkX3Jlc3VsdChzdHJ1Y3QgbmZzX3JlYWRfZGF0YSAqZGF0YSwgaW50IHN0YXR1cykKK3sKKwlzdHJ1Y3QgbmZzX2RpcmVjdF9yZXEgKmRyZXEgPSAoc3RydWN0IG5mc19kaXJlY3RfcmVxICopIGRhdGEtPnJlcTsKKworCWlmIChsaWtlbHkoc3RhdHVzID49IDApKQorCQlhdG9taWNfYWRkKGRhdGEtPnJlcy5jb3VudCwgJmRyZXEtPmNvdW50KTsKKwllbHNlCisJCWF0b21pY19zZXQoJmRyZXEtPmVycm9yLCBzdGF0dXMpOworCisJaWYgKHVubGlrZWx5KGF0b21pY19kZWNfYW5kX3Rlc3QoJmRyZXEtPmNvbXBsZXRlKSkpIHsKKwkJbmZzX2ZyZWVfdXNlcl9wYWdlcyhkcmVxLT5wYWdlcywgZHJlcS0+bnBhZ2VzLCAxKTsKKwkJd2FrZV91cCgmZHJlcS0+d2FpdCk7CisJCWtyZWZfcHV0KCZkcmVxLT5rcmVmLCBuZnNfZGlyZWN0X3JlcV9yZWxlYXNlKTsKKwl9Cit9CisKKy8qKgorICogbmZzX2RpcmVjdF9yZWFkX3NjaGVkdWxlIC0gZGlzcGF0Y2ggTkZTIFJFQUQgb3BlcmF0aW9ucyBmb3IgYSBkaXJlY3QgcmVhZAorICogQGRyZXE6IGFkZHJlc3Mgb2YgbmZzX2RpcmVjdF9yZXEgc3RydWN0IGZvciB0aGlzIHJlcXVlc3QKKyAqIEBpbm9kZTogdGFyZ2V0IGlub2RlCisgKiBAY3R4OiB0YXJnZXQgZmlsZSBvcGVuIGNvbnRleHQKKyAqIEB1c2VyX2FkZHI6IHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhpcyBzZWdtZW50IG9mIHVzZXIncyBidWZmZXIKKyAqIEBjb3VudDogc2l6ZSBvZiB0aGlzIHNlZ21lbnQKKyAqIEBmaWxlX29mZnNldDogb2Zmc2V0IGluIGZpbGUgdG8gYmVnaW4gdGhlIG9wZXJhdGlvbgorICoKKyAqIEZvciBlYWNoIG5mc19yZWFkX2RhdGEgc3RydWN0IHRoYXQgd2FzIGFsbG9jYXRlZCBvbiB0aGUgbGlzdCwgZGlzcGF0Y2gKKyAqIGFuIE5GUyBSRUFEIG9wZXJhdGlvbgorICovCitzdGF0aWMgdm9pZCBuZnNfZGlyZWN0X3JlYWRfc2NoZWR1bGUoc3RydWN0IG5mc19kaXJlY3RfcmVxICpkcmVxLAorCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4LAorCQl1bnNpZ25lZCBsb25nIHVzZXJfYWRkciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgZmlsZV9vZmZzZXQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdCA9ICZkcmVxLT5saXN0OworCXN0cnVjdCBwYWdlICoqcGFnZXMgPSBkcmVxLT5wYWdlczsKKwl1bnNpZ25lZCBpbnQgY3VycGFnZSwgcGdiYXNlOworCXVuc2lnbmVkIGludCByc2l6ZSA9IE5GU19TRVJWRVIoaW5vZGUpLT5yc2l6ZTsKKworCWN1cnBhZ2UgPSAwOworCXBnYmFzZSA9IHVzZXJfYWRkciAmIH5QQUdFX01BU0s7CisJZG8geworCQlzdHJ1Y3QgbmZzX3JlYWRfZGF0YSAqZGF0YTsKKwkJdW5zaWduZWQgaW50IGJ5dGVzOworCisJCWJ5dGVzID0gcnNpemU7CisJCWlmIChjb3VudCA8IHJzaXplKQorCQkJYnl0ZXMgPSBjb3VudDsKKworCQlkYXRhID0gbGlzdF9lbnRyeShsaXN0LT5uZXh0LCBzdHJ1Y3QgbmZzX3JlYWRfZGF0YSwgcGFnZXMpOworCQlsaXN0X2RlbF9pbml0KCZkYXRhLT5wYWdlcyk7CisKKwkJZGF0YS0+aW5vZGUgPSBpbm9kZTsKKwkJZGF0YS0+Y3JlZCA9IGN0eC0+Y3JlZDsKKwkJZGF0YS0+YXJncy5maCA9IE5GU19GSChpbm9kZSk7CisJCWRhdGEtPmFyZ3MuY29udGV4dCA9IGN0eDsKKwkJZGF0YS0+YXJncy5vZmZzZXQgPSBmaWxlX29mZnNldDsKKwkJZGF0YS0+YXJncy5wZ2Jhc2UgPSBwZ2Jhc2U7CisJCWRhdGEtPmFyZ3MucGFnZXMgPSAmcGFnZXNbY3VycGFnZV07CisJCWRhdGEtPmFyZ3MuY291bnQgPSBieXRlczsKKwkJZGF0YS0+cmVzLmZhdHRyID0gJmRhdGEtPmZhdHRyOworCQlkYXRhLT5yZXMuZW9mID0gMDsKKwkJZGF0YS0+cmVzLmNvdW50ID0gYnl0ZXM7CisKKwkJTkZTX1BST1RPKGlub2RlKS0+cmVhZF9zZXR1cChkYXRhKTsKKworCQlkYXRhLT50YXNrLnRrX2Nvb2tpZSA9ICh1bnNpZ25lZCBsb25nKSBpbm9kZTsKKwkJZGF0YS0+dGFzay50a19jYWxsZGF0YSA9IGRhdGE7CisJCWRhdGEtPnRhc2sudGtfcmVsZWFzZSA9IG5mc19yZWFkZGF0YV9yZWxlYXNlOworCQlkYXRhLT5jb21wbGV0ZSA9IG5mc19kaXJlY3RfcmVhZF9yZXN1bHQ7CisKKwkJbG9ja19rZXJuZWwoKTsKKwkJcnBjX2V4ZWN1dGUoJmRhdGEtPnRhc2spOworCQl1bmxvY2tfa2VybmVsKCk7CisKKwkJZGZwcmludGsoVkZTLCAiTkZTOiAlNGQgaW5pdGlhdGVkIGRpcmVjdCByZWFkIGNhbGwgKHJlcSAlcy8lTGQsICV1IGJ5dGVzIEAgb2Zmc2V0ICVMdSlcbiIsCisJCQkJZGF0YS0+dGFzay50a19waWQsCisJCQkJaW5vZGUtPmlfc2ItPnNfaWQsCisJCQkJKGxvbmcgbG9uZylORlNfRklMRUlEKGlub2RlKSwKKwkJCQlieXRlcywKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKWRhdGEtPmFyZ3Mub2Zmc2V0KTsKKworCQlmaWxlX29mZnNldCArPSBieXRlczsKKwkJcGdiYXNlICs9IGJ5dGVzOworCQljdXJwYWdlICs9IHBnYmFzZSA+PiBQQUdFX1NISUZUOworCQlwZ2Jhc2UgJj0gflBBR0VfTUFTSzsKKworCQljb3VudCAtPSBieXRlczsKKwl9IHdoaWxlIChjb3VudCAhPSAwKTsKK30KKworLyoqCisgKiBuZnNfZGlyZWN0X3JlYWRfd2FpdCAtIHdhaXQgZm9yIEkvTyBjb21wbGV0aW9uIGZvciBkaXJlY3QgcmVhZHMKKyAqIEBkcmVxOiByZXF1ZXN0IG9uIHdoaWNoIHdlIGFyZSB0byB3YWl0CisgKiBAaW50cjogd2hldGhlciBvciBub3QgdGhpcyB3YWl0IGNhbiBiZSBpbnRlcnJ1cHRlZAorICoKKyAqIENvbGxlY3RzIGFuZCByZXR1cm5zIHRoZSBmaW5hbCBlcnJvciB2YWx1ZS9ieXRlLWNvdW50LgorICovCitzdGF0aWMgc3NpemVfdCBuZnNfZGlyZWN0X3JlYWRfd2FpdChzdHJ1Y3QgbmZzX2RpcmVjdF9yZXEgKmRyZXEsIGludCBpbnRyKQoreworCWludCByZXN1bHQgPSAwOworCisJaWYgKGludHIpIHsKKwkJcmVzdWx0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGRyZXEtPndhaXQsCisJCQkJCShhdG9taWNfcmVhZCgmZHJlcS0+Y29tcGxldGUpID09IDApKTsKKwl9IGVsc2UgeworCQl3YWl0X2V2ZW50KGRyZXEtPndhaXQsIChhdG9taWNfcmVhZCgmZHJlcS0+Y29tcGxldGUpID09IDApKTsKKwl9CisKKwlpZiAoIXJlc3VsdCkKKwkJcmVzdWx0ID0gYXRvbWljX3JlYWQoJmRyZXEtPmVycm9yKTsKKwlpZiAoIXJlc3VsdCkKKwkJcmVzdWx0ID0gYXRvbWljX3JlYWQoJmRyZXEtPmNvdW50KTsKKworCWtyZWZfcHV0KCZkcmVxLT5rcmVmLCBuZnNfZGlyZWN0X3JlcV9yZWxlYXNlKTsKKwlyZXR1cm4gKHNzaXplX3QpIHJlc3VsdDsKK30KKworLyoqCisgKiBuZnNfZGlyZWN0X3JlYWRfc2VnIC0gUmVhZCBpbiBvbmUgaW92IHNlZ21lbnQuICBHZW5lcmF0ZSBzZXBhcmF0ZQorICogICAgICAgICAgICAgICAgICAgICAgICByZWFkIFJQQ3MgZm9yIGVhY2ggInJzaXplIiBieXRlcy4KKyAqIEBpbm9kZTogdGFyZ2V0IGlub2RlCisgKiBAY3R4OiB0YXJnZXQgZmlsZSBvcGVuIGNvbnRleHQKKyAqIEB1c2VyX2FkZHI6IHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhpcyBzZWdtZW50IG9mIHVzZXIncyBidWZmZXIKKyAqIEBjb3VudDogc2l6ZSBvZiB0aGlzIHNlZ21lbnQKKyAqIEBmaWxlX29mZnNldDogb2Zmc2V0IGluIGZpbGUgdG8gYmVnaW4gdGhlIG9wZXJhdGlvbgorICogQHBhZ2VzOiBhcnJheSBvZiBhZGRyZXNzZXMgb2YgcGFnZSBzdHJ1Y3RzIGRlZmluaW5nIHVzZXIncyBidWZmZXIKKyAqIEBucl9wYWdlczogbnVtYmVyIG9mIHBhZ2VzIGluIHRoZSBhcnJheQorICoKKyAqLworc3RhdGljIHNzaXplX3QgbmZzX2RpcmVjdF9yZWFkX3NlZyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQlzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4LCB1bnNpZ25lZCBsb25nIHVzZXJfYWRkciwKKwkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgZmlsZV9vZmZzZXQsIHN0cnVjdCBwYWdlICoqcGFnZXMsCisJCXVuc2lnbmVkIGludCBucl9wYWdlcykKK3sKKwlzc2l6ZV90IHJlc3VsdDsKKwlzaWdzZXRfdCBvbGRzZXQ7CisJc3RydWN0IHJwY19jbG50ICpjbG50ID0gTkZTX0NMSUVOVChpbm9kZSk7CisJc3RydWN0IG5mc19kaXJlY3RfcmVxICpkcmVxOworCisJZHJlcSA9IG5mc19kaXJlY3RfcmVhZF9hbGxvYyhjb3VudCwgTkZTX1NFUlZFUihpbm9kZSktPnJzaXplKTsKKwlpZiAoIWRyZXEpCisJCXJldHVybiAtRU5PTUVNOworCisJZHJlcS0+cGFnZXMgPSBwYWdlczsKKwlkcmVxLT5ucGFnZXMgPSBucl9wYWdlczsKKworCXJwY19jbG50X3NpZ21hc2soY2xudCwgJm9sZHNldCk7CisJbmZzX2RpcmVjdF9yZWFkX3NjaGVkdWxlKGRyZXEsIGlub2RlLCBjdHgsIHVzZXJfYWRkciwgY291bnQsCisJCQkJIGZpbGVfb2Zmc2V0KTsKKwlyZXN1bHQgPSBuZnNfZGlyZWN0X3JlYWRfd2FpdChkcmVxLCBjbG50LT5jbF9pbnRyKTsKKwlycGNfY2xudF9zaWd1bm1hc2soY2xudCwgJm9sZHNldCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIG5mc19kaXJlY3RfcmVhZCAtIEZvciBlYWNoIGlvdiBzZWdtZW50LCBtYXAgdGhlIHVzZXIncyBidWZmZXIKKyAqICAgICAgICAgICAgICAgICAgIHRoZW4gZ2VuZXJhdGUgcmVhZCBSUENzLgorICogQGlub2RlOiB0YXJnZXQgaW5vZGUKKyAqIEBjdHg6IHRhcmdldCBmaWxlIG9wZW4gY29udGV4dAorICogQGlvdjogYXJyYXkgb2YgdmVjdG9ycyB0aGF0IGRlZmluZSBJL08gYnVmZmVyCisgKiBmaWxlX29mZnNldDogb2Zmc2V0IGluIGZpbGUgdG8gYmVnaW4gdGhlIG9wZXJhdGlvbgorICogbnJfc2Vnczogc2l6ZSBvZiBpb3ZlYyBhcnJheQorICoKKyAqIFdlJ3ZlIGFscmVhZHkgcHVzaGVkIG91dCBhbnkgbm9uLWRpcmVjdCB3cml0ZXMgc28gdGhhdCB0aGlzIHJlYWQKKyAqIHdpbGwgc2VlIHRoZW0gd2hlbiB3ZSByZWFkIGZyb20gdGhlIHNlcnZlci4KKyAqLworc3RhdGljIHNzaXplX3QKK25mc19kaXJlY3RfcmVhZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4LAorCQljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgbG9mZl90IGZpbGVfb2Zmc2V0LAorCQl1bnNpZ25lZCBsb25nIG5yX3NlZ3MpCit7CisJc3NpemVfdCB0b3RfYnl0ZXMgPSAwOworCXVuc2lnbmVkIGxvbmcgc2VnID0gMDsKKworCXdoaWxlICgoc2VnIDwgbnJfc2VncykgJiYgKHRvdF9ieXRlcyA+PSAwKSkgeworCQlzc2l6ZV90IHJlc3VsdDsKKwkJaW50IHBhZ2VfY291bnQ7CisJCXN0cnVjdCBwYWdlICoqcGFnZXM7CisJCWNvbnN0IHN0cnVjdCBpb3ZlYyAqdmVjID0gJmlvdltzZWcrK107CisJCXVuc2lnbmVkIGxvbmcgdXNlcl9hZGRyID0gKHVuc2lnbmVkIGxvbmcpIHZlYy0+aW92X2Jhc2U7CisJCXNpemVfdCBzaXplID0gdmVjLT5pb3ZfbGVuOworCisgICAgICAgICAgICAgICAgcGFnZV9jb3VudCA9IG5mc19nZXRfdXNlcl9wYWdlcyhSRUFELCB1c2VyX2FkZHIsIHNpemUsICZwYWdlcyk7CisgICAgICAgICAgICAgICAgaWYgKHBhZ2VfY291bnQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZnNfZnJlZV91c2VyX3BhZ2VzKHBhZ2VzLCAwLCAwKTsKKwkJCWlmICh0b3RfYnl0ZXMgPiAwKQorCQkJCWJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhZ2VfY291bnQ7CisgICAgICAgICAgICAgICAgfQorCisJCXJlc3VsdCA9IG5mc19kaXJlY3RfcmVhZF9zZWcoaW5vZGUsIGN0eCwgdXNlcl9hZGRyLCBzaXplLAorCQkJCWZpbGVfb2Zmc2V0LCBwYWdlcywgcGFnZV9jb3VudCk7CisKKwkJaWYgKHJlc3VsdCA8PSAwKSB7CisJCQlpZiAodG90X2J5dGVzID4gMCkKKwkJCQlicmVhazsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJdG90X2J5dGVzICs9IHJlc3VsdDsKKwkJZmlsZV9vZmZzZXQgKz0gcmVzdWx0OworCQlpZiAocmVzdWx0IDwgc2l6ZSkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiB0b3RfYnl0ZXM7Cit9CisKKy8qKgorICogbmZzX2RpcmVjdF93cml0ZV9zZWcgLSBXcml0ZSBvdXQgb25lIGlvdiBzZWdtZW50LiAgR2VuZXJhdGUgc2VwYXJhdGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGUgUlBDcyBmb3IgZWFjaCAid3NpemUiIGJ5dGVzLCB0aGVuIGNvbW1pdC4KKyAqIEBpbm9kZTogdGFyZ2V0IGlub2RlCisgKiBAY3R4OiB0YXJnZXQgZmlsZSBvcGVuIGNvbnRleHQKKyAqIHVzZXJfYWRkcjogc3RhcnRpbmcgYWRkcmVzcyBvZiB0aGlzIHNlZ21lbnQgb2YgdXNlcidzIGJ1ZmZlcgorICogY291bnQ6IHNpemUgb2YgdGhpcyBzZWdtZW50CisgKiBmaWxlX29mZnNldDogb2Zmc2V0IGluIGZpbGUgdG8gYmVnaW4gdGhlIG9wZXJhdGlvbgorICogQHBhZ2VzOiBhcnJheSBvZiBhZGRyZXNzZXMgb2YgcGFnZSBzdHJ1Y3RzIGRlZmluaW5nIHVzZXIncyBidWZmZXIKKyAqIG5yX3BhZ2VzOiBzaXplIG9mIHBhZ2VzIGFycmF5CisgKi8KK3N0YXRpYyBzc2l6ZV90IG5mc19kaXJlY3Rfd3JpdGVfc2VnKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCXN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHgsIHVuc2lnbmVkIGxvbmcgdXNlcl9hZGRyLAorCQlzaXplX3QgY291bnQsIGxvZmZfdCBmaWxlX29mZnNldCwgc3RydWN0IHBhZ2UgKipwYWdlcywKKwkJaW50IG5yX3BhZ2VzKQoreworCWNvbnN0IHVuc2lnbmVkIGludCB3c2l6ZSA9IE5GU19TRVJWRVIoaW5vZGUpLT53c2l6ZTsKKwlzaXplX3QgcmVxdWVzdDsKKwlpbnQgY3VycGFnZSwgbmVlZF9jb21taXQ7CisJc3NpemVfdCByZXN1bHQsIHRvdF9ieXRlczsKKwlzdHJ1Y3QgbmZzX3dyaXRldmVyZiBmaXJzdF92ZXJmOworCXN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqd2RhdGE7CisKKwl3ZGF0YSA9IG5mc193cml0ZWRhdGFfYWxsb2MoKTsKKwlpZiAoIXdkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXdkYXRhLT5pbm9kZSA9IGlub2RlOworCXdkYXRhLT5jcmVkID0gY3R4LT5jcmVkOworCXdkYXRhLT5hcmdzLmZoID0gTkZTX0ZIKGlub2RlKTsKKwl3ZGF0YS0+YXJncy5jb250ZXh0ID0gY3R4OworCXdkYXRhLT5hcmdzLnN0YWJsZSA9IE5GU19VTlNUQUJMRTsKKwlpZiAoSVNfU1lOQyhpbm9kZSkgfHwgTkZTX1BST1RPKGlub2RlKS0+dmVyc2lvbiA9PSAyIHx8IGNvdW50IDw9IHdzaXplKQorCQl3ZGF0YS0+YXJncy5zdGFibGUgPSBORlNfRklMRV9TWU5DOworCXdkYXRhLT5yZXMuZmF0dHIgPSAmd2RhdGEtPmZhdHRyOworCXdkYXRhLT5yZXMudmVyZiA9ICZ3ZGF0YS0+dmVyZjsKKworCW5mc19iZWdpbl9kYXRhX3VwZGF0ZShpbm9kZSk7CityZXRyeToKKwluZWVkX2NvbW1pdCA9IDA7CisJdG90X2J5dGVzID0gMDsKKwljdXJwYWdlID0gMDsKKwlyZXF1ZXN0ID0gY291bnQ7CisJd2RhdGEtPmFyZ3MucGdiYXNlID0gdXNlcl9hZGRyICYgflBBR0VfTUFTSzsKKwl3ZGF0YS0+YXJncy5vZmZzZXQgPSBmaWxlX29mZnNldDsKKwlkbyB7CisJCXdkYXRhLT5hcmdzLmNvdW50ID0gcmVxdWVzdDsKKwkJaWYgKHdkYXRhLT5hcmdzLmNvdW50ID4gd3NpemUpCisJCQl3ZGF0YS0+YXJncy5jb3VudCA9IHdzaXplOworCQl3ZGF0YS0+YXJncy5wYWdlcyA9ICZwYWdlc1tjdXJwYWdlXTsKKworCQlkcHJpbnRrKCJORlM6IGRpcmVjdCB3cml0ZTogYz0ldSBvPSVMZCB1YT0lbHUsIHBiPSV1LCBjcD0ldVxuIiwKKwkJCXdkYXRhLT5hcmdzLmNvdW50LCAobG9uZyBsb25nKSB3ZGF0YS0+YXJncy5vZmZzZXQsCisJCQl1c2VyX2FkZHIgKyB0b3RfYnl0ZXMsIHdkYXRhLT5hcmdzLnBnYmFzZSwgY3VycGFnZSk7CisKKwkJbG9ja19rZXJuZWwoKTsKKwkJcmVzdWx0ID0gTkZTX1BST1RPKGlub2RlKS0+d3JpdGUod2RhdGEpOworCQl1bmxvY2tfa2VybmVsKCk7CisKKwkJaWYgKHJlc3VsdCA8PSAwKSB7CisJCQlpZiAodG90X2J5dGVzID4gMCkKKwkJCQlicmVhazsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKHRvdF9ieXRlcyA9PSAwKQorCQkJbWVtY3B5KCZmaXJzdF92ZXJmLnZlcmlmaWVyLCAmd2RhdGEtPnZlcmYudmVyaWZpZXIsCisJCQkJCQlzaXplb2YoZmlyc3RfdmVyZi52ZXJpZmllcikpOworCQlpZiAod2RhdGEtPnZlcmYuY29tbWl0dGVkICE9IE5GU19GSUxFX1NZTkMpIHsKKwkJCW5lZWRfY29tbWl0ID0gMTsKKwkJCWlmIChtZW1jbXAoJmZpcnN0X3ZlcmYudmVyaWZpZXIsICZ3ZGF0YS0+dmVyZi52ZXJpZmllciwKKwkJCQkJc2l6ZW9mKGZpcnN0X3ZlcmYudmVyaWZpZXIpKSk7CisJCQkJZ290byBzeW5jX3JldHJ5OworCQl9CisKKwkJdG90X2J5dGVzICs9IHJlc3VsdDsKKworCQkvKiBpbiBjYXNlIG9mIGEgc2hvcnQgd3JpdGU6IHN0b3Agbm93LCBsZXQgdGhlIGFwcCByZWNvdmVyICovCisJCWlmIChyZXN1bHQgPCB3ZGF0YS0+YXJncy5jb3VudCkKKwkJCWJyZWFrOworCisJCXdkYXRhLT5hcmdzLm9mZnNldCArPSByZXN1bHQ7CisJCXdkYXRhLT5hcmdzLnBnYmFzZSArPSByZXN1bHQ7CisJCWN1cnBhZ2UgKz0gd2RhdGEtPmFyZ3MucGdiYXNlID4+IFBBR0VfU0hJRlQ7CisJCXdkYXRhLT5hcmdzLnBnYmFzZSAmPSB+UEFHRV9NQVNLOworCQlyZXF1ZXN0IC09IHJlc3VsdDsKKwl9IHdoaWxlIChyZXF1ZXN0ICE9IDApOworCisJLyoKKwkgKiBDb21taXQgZGF0YSB3cml0dGVuIHNvIGZhciwgZXZlbiBpbiB0aGUgZXZlbnQgb2YgYW4gZXJyb3IKKwkgKi8KKwlpZiAobmVlZF9jb21taXQpIHsKKwkJd2RhdGEtPmFyZ3MuY291bnQgPSB0b3RfYnl0ZXM7CisJCXdkYXRhLT5hcmdzLm9mZnNldCA9IGZpbGVfb2Zmc2V0OworCisJCWxvY2tfa2VybmVsKCk7CisJCXJlc3VsdCA9IE5GU19QUk9UTyhpbm9kZSktPmNvbW1pdCh3ZGF0YSk7CisJCXVubG9ja19rZXJuZWwoKTsKKworCQlpZiAocmVzdWx0IDwgMCB8fCBtZW1jbXAoJmZpcnN0X3ZlcmYudmVyaWZpZXIsCisJCQkJCSAmd2RhdGEtPnZlcmYudmVyaWZpZXIsCisJCQkJCSBzaXplb2YoZmlyc3RfdmVyZi52ZXJpZmllcikpICE9IDApCisJCQlnb3RvIHN5bmNfcmV0cnk7CisJfQorCXJlc3VsdCA9IHRvdF9ieXRlczsKKworb3V0OgorCW5mc19lbmRfZGF0YV91cGRhdGVfZGVmZXIoaW5vZGUpOworCW5mc193cml0ZWRhdGFfZnJlZSh3ZGF0YSk7CisJcmV0dXJuIHJlc3VsdDsKKworc3luY19yZXRyeToKKwl3ZGF0YS0+YXJncy5zdGFibGUgPSBORlNfRklMRV9TWU5DOworCWdvdG8gcmV0cnk7Cit9CisKKy8qKgorICogbmZzX2RpcmVjdF93cml0ZSAtIEZvciBlYWNoIGlvdiBzZWdtZW50LCBtYXAgdGhlIHVzZXIncyBidWZmZXIKKyAqICAgICAgICAgICAgICAgICAgICB0aGVuIGdlbmVyYXRlIHdyaXRlIGFuZCBjb21taXQgUlBDcy4KKyAqIEBpbm9kZTogdGFyZ2V0IGlub2RlCisgKiBAY3R4OiB0YXJnZXQgZmlsZSBvcGVuIGNvbnRleHQKKyAqIEBpb3Y6IGFycmF5IG9mIHZlY3RvcnMgdGhhdCBkZWZpbmUgSS9PIGJ1ZmZlcgorICogZmlsZV9vZmZzZXQ6IG9mZnNldCBpbiBmaWxlIHRvIGJlZ2luIHRoZSBvcGVyYXRpb24KKyAqIG5yX3NlZ3M6IHNpemUgb2YgaW92ZWMgYXJyYXkKKyAqCisgKiBVcG9uIHJldHVybiwgZ2VuZXJpY19maWxlX2RpcmVjdF9JTyBpbnZhbGlkYXRlcyBhbnkgY2FjaGVkIHBhZ2VzCisgKiB0aGF0IG5vbi1kaXJlY3QgcmVhZGVycyBtaWdodCBhY2Nlc3MsIHNvIHRoZXkgd2lsbCBwaWNrIHVwIHRoZXNlCisgKiB3cml0ZXMgaW1tZWRpYXRlbHkuCisgKi8KK3N0YXRpYyBzc2l6ZV90IG5mc19kaXJlY3Rfd3JpdGUoc3RydWN0IGlub2RlICppbm9kZSwKKwkJc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCisJCWxvZmZfdCBmaWxlX29mZnNldCwgdW5zaWduZWQgbG9uZyBucl9zZWdzKQoreworCXNzaXplX3QgdG90X2J5dGVzID0gMDsKKwl1bnNpZ25lZCBsb25nIHNlZyA9IDA7CisKKwl3aGlsZSAoKHNlZyA8IG5yX3NlZ3MpICYmICh0b3RfYnl0ZXMgPj0gMCkpIHsKKwkJc3NpemVfdCByZXN1bHQ7CisJCWludCBwYWdlX2NvdW50OworCQlzdHJ1Y3QgcGFnZSAqKnBhZ2VzOworCQljb25zdCBzdHJ1Y3QgaW92ZWMgKnZlYyA9ICZpb3Zbc2VnKytdOworCQl1bnNpZ25lZCBsb25nIHVzZXJfYWRkciA9ICh1bnNpZ25lZCBsb25nKSB2ZWMtPmlvdl9iYXNlOworCQlzaXplX3Qgc2l6ZSA9IHZlYy0+aW92X2xlbjsKKworICAgICAgICAgICAgICAgIHBhZ2VfY291bnQgPSBuZnNfZ2V0X3VzZXJfcGFnZXMoV1JJVEUsIHVzZXJfYWRkciwgc2l6ZSwgJnBhZ2VzKTsKKyAgICAgICAgICAgICAgICBpZiAocGFnZV9jb3VudCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5mc19mcmVlX3VzZXJfcGFnZXMocGFnZXMsIDAsIDApOworCQkJaWYgKHRvdF9ieXRlcyA+IDApCisJCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFnZV9jb3VudDsKKyAgICAgICAgICAgICAgICB9CisKKwkJcmVzdWx0ID0gbmZzX2RpcmVjdF93cml0ZV9zZWcoaW5vZGUsIGN0eCwgdXNlcl9hZGRyLCBzaXplLAorCQkJCWZpbGVfb2Zmc2V0LCBwYWdlcywgcGFnZV9jb3VudCk7CisJCW5mc19mcmVlX3VzZXJfcGFnZXMocGFnZXMsIHBhZ2VfY291bnQsIDApOworCisJCWlmIChyZXN1bHQgPD0gMCkgeworCQkJaWYgKHRvdF9ieXRlcyA+IDApCisJCQkJYnJlYWs7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCXRvdF9ieXRlcyArPSByZXN1bHQ7CisJCWZpbGVfb2Zmc2V0ICs9IHJlc3VsdDsKKwkJaWYgKHJlc3VsdCA8IHNpemUpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIHRvdF9ieXRlczsKK30KKworLyoqCisgKiBuZnNfZGlyZWN0X0lPIC0gTkZTIGFkZHJlc3Mgc3BhY2Ugb3BlcmF0aW9uIGZvciBkaXJlY3QgSS9PCisgKiBydzogZGlyZWN0aW9uIChyZWFkIG9yIHdyaXRlKQorICogQGlvY2I6IHRhcmdldCBJL08gY29udHJvbCBibG9jaworICogQGlvdjogYXJyYXkgb2YgdmVjdG9ycyB0aGF0IGRlZmluZSBJL08gYnVmZmVyCisgKiBmaWxlX29mZnNldDogb2Zmc2V0IGluIGZpbGUgdG8gYmVnaW4gdGhlIG9wZXJhdGlvbgorICogbnJfc2Vnczogc2l6ZSBvZiBpb3ZlYyBhcnJheQorICoKKyAqLworc3NpemVfdAorbmZzX2RpcmVjdF9JTyhpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCisJCWxvZmZfdCBmaWxlX29mZnNldCwgdW5zaWduZWQgbG9uZyBucl9zZWdzKQoreworCXNzaXplX3QgcmVzdWx0ID0gLUVJTlZBTDsKKwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CisJc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCisJLyoKKwkgKiBObyBzdXBwb3J0IGZvciBhc3luYyB5ZXQKKwkgKi8KKwlpZiAoIWlzX3N5bmNfa2lvY2IoaW9jYikpCisJCXJldHVybiByZXN1bHQ7CisKKwljdHggPSAoc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3dpdGNoIChydykgeworCWNhc2UgUkVBRDoKKwkJZHByaW50aygiTkZTOiBkaXJlY3RfSU8ocmVhZCkgKCVzKSBvZmYvbm8oJUx1LyVsdSlcbiIsCisJCQkJZGVudHJ5LT5kX25hbWUubmFtZSwgZmlsZV9vZmZzZXQsIG5yX3NlZ3MpOworCisJCXJlc3VsdCA9IG5mc19kaXJlY3RfcmVhZChpbm9kZSwgY3R4LCBpb3YsCisJCQkJCQlmaWxlX29mZnNldCwgbnJfc2Vncyk7CisJCWJyZWFrOworCWNhc2UgV1JJVEU6CisJCWRwcmludGsoIk5GUzogZGlyZWN0X0lPKHdyaXRlKSAoJXMpIG9mZi9ubyglTHUvJWx1KVxuIiwKKwkJCQlkZW50cnktPmRfbmFtZS5uYW1lLCBmaWxlX29mZnNldCwgbnJfc2Vncyk7CisKKwkJcmVzdWx0ID0gbmZzX2RpcmVjdF93cml0ZShpbm9kZSwgY3R4LCBpb3YsCisJCQkJCQlmaWxlX29mZnNldCwgbnJfc2Vncyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIG5mc19maWxlX2RpcmVjdF9yZWFkIC0gZmlsZSBkaXJlY3QgcmVhZCBvcGVyYXRpb24gZm9yIE5GUyBmaWxlcworICogQGlvY2I6IHRhcmdldCBJL08gY29udHJvbCBibG9jaworICogQGJ1ZjogdXNlcidzIGJ1ZmZlciBpbnRvIHdoaWNoIHRvIHJlYWQgZGF0YQorICogY291bnQ6IG51bWJlciBvZiBieXRlcyB0byByZWFkCisgKiBwb3M6IGJ5dGUgb2Zmc2V0IGluIGZpbGUgd2hlcmUgcmVhZGluZyBzdGFydHMKKyAqCisgKiBXZSB1c2UgdGhpcyBmdW5jdGlvbiBmb3IgZGlyZWN0IHJlYWRzIGluc3RlYWQgb2YgY2FsbGluZworICogZ2VuZXJpY19maWxlX2Fpb19yZWFkKCkgaW4gb3JkZXIgdG8gYXZvaWQgZ2ZhcidzIGNoZWNrIHRvIHNlZSBpZgorICogdGhlIHJlcXVlc3Qgc3RhcnRzIGJlZm9yZSB0aGUgZW5kIG9mIHRoZSBmaWxlLiAgRm9yIHRoYXQgY2hlY2sKKyAqIHRvIHdvcmssIHdlIG11c3QgZ2VuZXJhdGUgYSBHRVRBVFRSIGJlZm9yZSBlYWNoIGRpcmVjdCByZWFkLCBhbmQKKyAqIGV2ZW4gdGhlbiB0aGVyZSBpcyBhIHdpbmRvdyBiZXR3ZWVuIHRoZSBHRVRBVFRSIGFuZCB0aGUgc3Vic2VxdWVudAorICogUkVBRCB3aGVyZSB0aGUgZmlsZSBzaXplIGNvdWxkIGNoYW5nZS4gIFNvIG91ciBwcmVmZXJlbmNlIGlzIHNpbXBseQorICogdG8gZG8gYWxsIHJlYWRzIHRoZSBhcHBsaWNhdGlvbiB3YW50cywgYW5kIHRoZSBzZXJ2ZXIgd2lsbCB0YWtlCisgKiBjYXJlIG9mIG1hbmFnaW5nIHRoZSBlbmQgb2YgZmlsZSBib3VuZGFyeS4KKyAqIAorICogVGhpcyBmdW5jdGlvbiBhbHNvIGVsaW1pbmF0ZXMgdW5uZWNlc3NhcmlseSB1cGRhdGluZyB0aGUgZmlsZSdzCisgKiBhdGltZSBsb2NhbGx5LCBhcyB0aGUgTkZTIHNlcnZlciBzZXRzIHRoZSBmaWxlJ3MgYXRpbWUsIGFuZCB0aGlzCisgKiBjbGllbnQgbXVzdCByZWFkIHRoZSB1cGRhdGVkIGF0aW1lIGZyb20gdGhlIHNlcnZlciBiYWNrIGludG8gaXRzCisgKiBjYWNoZS4KKyAqLworc3NpemVfdAorbmZzX2ZpbGVfZGlyZWN0X3JlYWQoc3RydWN0IGtpb2NiICppb2NiLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCBwb3MpCit7CisJc3NpemVfdCByZXR2YWwgPSAtRUlOVkFMOworCWxvZmZfdCAqcHBvcyA9ICZpb2NiLT5raV9wb3M7CisJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOworCXN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHggPQorCQkJKHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZpbGUtPmZfbWFwcGluZzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3QgaW92ZWMgaW92ID0geworCQkuaW92X2Jhc2UgPSBidWYsCisJCS5pb3ZfbGVuID0gY291bnQsCisJfTsKKworCWRwcmludGsoIm5mczogZGlyZWN0IHJlYWQoJXMvJXMsICVsdUAlbHUpXG4iLAorCQlkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJKHVuc2lnbmVkIGxvbmcpIGNvdW50LCAodW5zaWduZWQgbG9uZykgcG9zKTsKKworCWlmICghaXNfc3luY19raW9jYihpb2NiKSkKKwkJZ290byBvdXQ7CisJaWYgKGNvdW50IDwgMCkKKwkJZ290byBvdXQ7CisJcmV0dmFsID0gLUVGQVVMVDsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGlvdi5pb3ZfYmFzZSwgaW92Lmlvdl9sZW4pKQorCQlnb3RvIG91dDsKKwlyZXR2YWwgPSAwOworCWlmICghY291bnQpCisJCWdvdG8gb3V0OworCisJaWYgKG1hcHBpbmctPm5ycGFnZXMpIHsKKwkJcmV0dmFsID0gZmlsZW1hcF9mZGF0YXdyaXRlKG1hcHBpbmcpOworCQlpZiAocmV0dmFsID09IDApCisJCQlyZXR2YWwgPSBuZnNfd2JfYWxsKGlub2RlKTsKKwkJaWYgKHJldHZhbCA9PSAwKQorCQkJcmV0dmFsID0gZmlsZW1hcF9mZGF0YXdhaXQobWFwcGluZyk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIG91dDsKKwl9CisKKwlyZXR2YWwgPSBuZnNfZGlyZWN0X3JlYWQoaW5vZGUsIGN0eCwgJmlvdiwgcG9zLCAxKTsKKwlpZiAocmV0dmFsID4gMCkKKwkJKnBwb3MgPSBwb3MgKyByZXR2YWw7CisKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIG5mc19maWxlX2RpcmVjdF93cml0ZSAtIGZpbGUgZGlyZWN0IHdyaXRlIG9wZXJhdGlvbiBmb3IgTkZTIGZpbGVzCisgKiBAaW9jYjogdGFyZ2V0IEkvTyBjb250cm9sIGJsb2NrCisgKiBAYnVmOiB1c2VyJ3MgYnVmZmVyIGZyb20gd2hpY2ggdG8gd3JpdGUgZGF0YQorICogY291bnQ6IG51bWJlciBvZiBieXRlcyB0byB3cml0ZQorICogcG9zOiBieXRlIG9mZnNldCBpbiBmaWxlIHdoZXJlIHdyaXRpbmcgc3RhcnRzCisgKgorICogV2UgdXNlIHRoaXMgZnVuY3Rpb24gZm9yIGRpcmVjdCB3cml0ZXMgaW5zdGVhZCBvZiBjYWxsaW5nCisgKiBnZW5lcmljX2ZpbGVfYWlvX3dyaXRlKCkgaW4gb3JkZXIgdG8gYXZvaWQgdGFraW5nIHRoZSBpbm9kZQorICogc2VtYXBob3JlIGFuZCB1cGRhdGluZyB0aGUgaV9zaXplLiAgVGhlIE5GUyBzZXJ2ZXIgd2lsbCBzZXQKKyAqIHRoZSBuZXcgaV9zaXplIGFuZCB0aGlzIGNsaWVudCBtdXN0IHJlYWQgdGhlIHVwZGF0ZWQgc2l6ZQorICogYmFjayBpbnRvIGl0cyBjYWNoZS4gIFdlIGxldCB0aGUgc2VydmVyIGRvIGdlbmVyaWMgd3JpdGUKKyAqIHBhcmFtZXRlciBjaGVja2luZyBhbmQgcmVwb3J0IHByb2JsZW1zLgorICoKKyAqIFdlIGFsc28gYXZvaWQgYW4gdW5uZWNlc3NhcnkgaW52b2NhdGlvbiBvZiBnZW5lcmljX29zeW5jX2lub2RlKCksCisgKiBhcyBpdCBpcyBmYWlybHkgbWVhbmluZ2xlc3MgdG8gc3luYyB0aGUgbWV0YWRhdGEgb2YgYW4gTkZTIGZpbGUuCisgKgorICogV2UgZWxpbWluYXRlIGxvY2FsIGF0aW1lIHVwZGF0ZXMsIHNlZSBkaXJlY3QgcmVhZCBhYm92ZS4KKyAqCisgKiBXZSBhdm9pZCB1bm5lY2Vzc2FyeSBwYWdlIGNhY2hlIGludmFsaWRhdGlvbnMgZm9yIG5vcm1hbCBjYWNoZWQKKyAqIHJlYWRlcnMgb2YgdGhpcyBmaWxlLgorICoKKyAqIE5vdGUgdGhhdCBPX0FQUEVORCBpcyBub3Qgc3VwcG9ydGVkIGZvciBORlMgZGlyZWN0IHdyaXRlcywgYXMgdGhlcmUKKyAqIGlzIG5vIGF0b21pYyBPX0FQUEVORCB3cml0ZSBmYWNpbGl0eSBpbiB0aGUgTkZTIHByb3RvY29sLgorICovCitzc2l6ZV90CituZnNfZmlsZV9kaXJlY3Rfd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCBwb3MpCit7CisJc3NpemVfdCByZXR2YWwgPSAtRUlOVkFMOworCWxvZmZfdCAqcHBvcyA9ICZpb2NiLT5raV9wb3M7CisJdW5zaWduZWQgbG9uZyBsaW1pdCA9IGN1cnJlbnQtPnNpZ25hbC0+cmxpbVtSTElNSVRfRlNJWkVdLnJsaW1fY3VyOworCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKKwlzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4ID0KKwkJCShzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmaWxlLT5mX21hcHBpbmc7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisJc3RydWN0IGlvdmVjIGlvdiA9IHsKKwkJLmlvdl9iYXNlID0gKGNoYXIgX191c2VyICopYnVmLAorCQkuaW92X2xlbiA9IGNvdW50LAorCX07CisKKwlkZnByaW50ayhWRlMsICJuZnM6IGRpcmVjdCB3cml0ZSglcy8lcyglbGQpLCAlbHVAJWx1KVxuIiwKKwkJZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCWlub2RlLT5pX2lubywgKHVuc2lnbmVkIGxvbmcpIGNvdW50LCAodW5zaWduZWQgbG9uZykgcG9zKTsKKworCWlmICghaXNfc3luY19raW9jYihpb2NiKSkKKwkJZ290byBvdXQ7CisJaWYgKGNvdW50IDwgMCkKKwkJZ290byBvdXQ7CisgICAgICAgIGlmIChwb3MgPCAwKQorCQlnb3RvIG91dDsKKwlyZXR2YWwgPSAtRUZBVUxUOworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBpb3YuaW92X2Jhc2UsIGlvdi5pb3ZfbGVuKSkKKwkJZ290byBvdXQ7CisgICAgICAgIGlmIChmaWxlLT5mX2Vycm9yKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gZmlsZS0+Zl9lcnJvcjsKKyAgICAgICAgICAgICAgICBmaWxlLT5mX2Vycm9yID0gMDsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCXJldHZhbCA9IC1FRkJJRzsKKwlpZiAobGltaXQgIT0gUkxJTV9JTkZJTklUWSkgeworCQlpZiAocG9zID49IGxpbWl0KSB7CisJCQlzZW5kX3NpZyhTSUdYRlNaLCBjdXJyZW50LCAwKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChjb3VudCA+IGxpbWl0IC0gKHVuc2lnbmVkIGxvbmcpIHBvcykKKwkJCWNvdW50ID0gbGltaXQgLSAodW5zaWduZWQgbG9uZykgcG9zOworCX0KKwlyZXR2YWwgPSAwOworCWlmICghY291bnQpCisJCWdvdG8gb3V0OworCisJaWYgKG1hcHBpbmctPm5ycGFnZXMpIHsKKwkJcmV0dmFsID0gZmlsZW1hcF9mZGF0YXdyaXRlKG1hcHBpbmcpOworCQlpZiAocmV0dmFsID09IDApCisJCQlyZXR2YWwgPSBuZnNfd2JfYWxsKGlub2RlKTsKKwkJaWYgKHJldHZhbCA9PSAwKQorCQkJcmV0dmFsID0gZmlsZW1hcF9mZGF0YXdhaXQobWFwcGluZyk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIG91dDsKKwl9CisKKwlyZXR2YWwgPSBuZnNfZGlyZWN0X3dyaXRlKGlub2RlLCBjdHgsICZpb3YsIHBvcywgMSk7CisJaWYgKG1hcHBpbmctPm5ycGFnZXMpCisJCWludmFsaWRhdGVfaW5vZGVfcGFnZXMyKG1hcHBpbmcpOworCWlmIChyZXR2YWwgPiAwKQorCQkqcHBvcyA9IHBvcyArIHJldHZhbDsKKworb3V0OgorCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBuZnNfaW5pdF9kaXJlY3RjYWNoZSh2b2lkKQoreworCW5mc19kaXJlY3RfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoIm5mc19kaXJlY3RfY2FjaGUiLAorCQkJCQkJc2l6ZW9mKHN0cnVjdCBuZnNfZGlyZWN0X3JlcSksCisJCQkJCQkwLCBTTEFCX1JFQ0xBSU1fQUNDT1VOVCwKKwkJCQkJCU5VTEwsIE5VTEwpOworCWlmIChuZnNfZGlyZWN0X2NhY2hlcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCit2b2lkIG5mc19kZXN0cm95X2RpcmVjdGNhY2hlKHZvaWQpCit7CisJaWYgKGttZW1fY2FjaGVfZGVzdHJveShuZnNfZGlyZWN0X2NhY2hlcCkpCisJCXByaW50ayhLRVJOX0lORk8gIm5mc19kaXJlY3RfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKK30KZGlmZiAtLWdpdCBhL2ZzL25mcy9maWxlLmMgYi9mcy9uZnMvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNmVlZTYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnMvZmlsZS5jCkBAIC0wLDAgKzEsNDg0IEBACisvKgorICogIGxpbnV4L2ZzL25mcy9maWxlLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkyICBSaWNrIFNsYWRrZXkKKyAqCisgKiAgQ2hhbmdlcyBDb3B5cmlnaHQgKEMpIDE5OTQgYnkgRmxvcmlhbiBMYSBSb2NoZQorICogICAtIERvIG5vdCBjb3B5IGRhdGEgdG9vIG9mdGVuIGFyb3VuZCBpbiB0aGUga2VybmVsLgorICogICAtIEluIG5mc19maWxlX3JlYWQgdGhlIHJldHVybiB2YWx1ZSBvZiBrbWFsbG9jIHdhc24ndCBjaGVja2VkLgorICogICAtIFB1dCBpbiBhIGJldHRlciB2ZXJzaW9uIG9mIHJlYWQgbG9vay1haGVhZCBidWZmZXJpbmcuIE9yaWdpbmFsIGlkZWEKKyAqICAgICBhbmQgaW1wbGVtZW50YXRpb24gYnkgV2FpIFMgS29rIGVsZWtva3dzQGVlLm51cy5zZy4KKyAqCisgKiAgRXhwaXJlIGNhY2hlIG9uIHdyaXRlIHRvIGEgZmlsZSBieSBXYWkgUyBLb2sgKE9jdCAxOTk0KS4KKyAqCisgKiAgVG90YWwgcmV3cml0ZSBvZiByZWFkIHNpZGUgZm9yIG5ldyBORlMgYnVmZmVyIGNhY2hlLi4gTGludXMuCisgKgorICogIG5mcyByZWd1bGFyIGZpbGUgaGFuZGxpbmcgZnVuY3Rpb25zCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlICJkZWxlZ2F0aW9uLmgiCisKKyNkZWZpbmUgTkZTREJHX0ZBQ0lMSVRZCQlORlNEQkdfRklMRQorCitzdGF0aWMgaW50IG5mc19maWxlX29wZW4oc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOworc3RhdGljIGludCBuZnNfZmlsZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKK3N0YXRpYyBpbnQgIG5mc19maWxlX21tYXAoc3RydWN0IGZpbGUgKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOworc3RhdGljIHNzaXplX3QgbmZzX2ZpbGVfc2VuZGZpbGUoc3RydWN0IGZpbGUgKiwgbG9mZl90ICosIHNpemVfdCwgcmVhZF9hY3Rvcl90LCB2b2lkICopOworc3RhdGljIHNzaXplX3QgbmZzX2ZpbGVfcmVhZChzdHJ1Y3Qga2lvY2IgKiwgY2hhciBfX3VzZXIgKiwgc2l6ZV90LCBsb2ZmX3QpOworc3RhdGljIHNzaXplX3QgbmZzX2ZpbGVfd3JpdGUoc3RydWN0IGtpb2NiICosIGNvbnN0IGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90KTsKK3N0YXRpYyBpbnQgIG5mc19maWxlX2ZsdXNoKHN0cnVjdCBmaWxlICopOworc3RhdGljIGludCAgbmZzX2ZzeW5jKHN0cnVjdCBmaWxlICosIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGRhdGFzeW5jKTsKK3N0YXRpYyBpbnQgbmZzX2NoZWNrX2ZsYWdzKGludCBmbGFncyk7CitzdGF0aWMgaW50IG5mc19sb2NrKHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgY21kLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCk7CitzdGF0aWMgaW50IG5mc19mbG9jayhzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IGNtZCwgc3RydWN0IGZpbGVfbG9jayAqZmwpOworCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG5mc19maWxlX29wZXJhdGlvbnMgPSB7CisJLmxsc2VlawkJPSByZW1vdGVfbGxzZWVrLAorCS5yZWFkCQk9IGRvX3N5bmNfcmVhZCwKKwkud3JpdGUJCT0gZG9fc3luY193cml0ZSwKKwkuYWlvX3JlYWQJCT0gbmZzX2ZpbGVfcmVhZCwKKwkuYWlvX3dyaXRlCQk9IG5mc19maWxlX3dyaXRlLAorCS5tbWFwCQk9IG5mc19maWxlX21tYXAsCisJLm9wZW4JCT0gbmZzX2ZpbGVfb3BlbiwKKwkuZmx1c2gJCT0gbmZzX2ZpbGVfZmx1c2gsCisJLnJlbGVhc2UJPSBuZnNfZmlsZV9yZWxlYXNlLAorCS5mc3luYwkJPSBuZnNfZnN5bmMsCisJLmxvY2sJCT0gbmZzX2xvY2ssCisJLmZsb2NrCQk9IG5mc19mbG9jaywKKwkuc2VuZGZpbGUJPSBuZnNfZmlsZV9zZW5kZmlsZSwKKwkuY2hlY2tfZmxhZ3MJPSBuZnNfY2hlY2tfZmxhZ3MsCit9OworCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBuZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zID0geworCS5wZXJtaXNzaW9uCT0gbmZzX3Blcm1pc3Npb24sCisJLmdldGF0dHIJPSBuZnNfZ2V0YXR0ciwKKwkuc2V0YXR0cgk9IG5mc19zZXRhdHRyLAorfTsKKworLyogSGFjayBmb3IgZnV0dXJlIE5GUyBzd2FwIHN1cHBvcnQgKi8KKyNpZm5kZWYgSVNfU1dBUEZJTEUKKyMgZGVmaW5lIElTX1NXQVBGSUxFKGlub2RlKQkoMCkKKyNlbmRpZgorCitzdGF0aWMgaW50IG5mc19jaGVja19mbGFncyhpbnQgZmxhZ3MpCit7CisJaWYgKChmbGFncyAmIChPX0FQUEVORCB8IE9fRElSRUNUKSkgPT0gKE9fQVBQRU5EIHwgT19ESVJFQ1QpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCisvKgorICogT3BlbiBmaWxlCisgKi8KK3N0YXRpYyBpbnQKK25mc19maWxlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IE5GU19TRVJWRVIoaW5vZGUpOworCWludCAoKm9wZW4pKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKKwlpbnQgcmVzOworCisJcmVzID0gbmZzX2NoZWNrX2ZsYWdzKGZpbHAtPmZfZmxhZ3MpOworCWlmIChyZXMpCisJCXJldHVybiByZXM7CisKKwlsb2NrX2tlcm5lbCgpOworCS8qIERvIE5GU3Y0IG9wZW4oKSBjYWxsICovCisJaWYgKChvcGVuID0gc2VydmVyLT5ycGNfb3BzLT5maWxlX29wZW4pICE9IE5VTEwpCisJCXJlcyA9IG9wZW4oaW5vZGUsIGZpbHApOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50CituZnNfZmlsZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCS8qIEVuc3VyZSB0aGF0IGRpcnR5IHBhZ2VzIGFyZSBmbHVzaGVkIG91dCB3aXRoIHRoZSByaWdodCBjcmVkcyAqLworCWlmIChmaWxwLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJZmlsZW1hcF9mZGF0YXdyaXRlKGZpbHAtPmZfbWFwcGluZyk7CisJcmV0dXJuIE5GU19QUk9UTyhpbm9kZSktPmZpbGVfcmVsZWFzZShpbm9kZSwgZmlscCk7Cit9CisKKy8qCisgKiBGbHVzaCBhbGwgZGlydHkgcGFnZXMsIGFuZCBjaGVjayBmb3Igd3JpdGUgZXJyb3JzLgorICoKKyAqLworc3RhdGljIGludAorbmZzX2ZpbGVfZmx1c2goc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCA9IChzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJaW50CQlzdGF0dXM7CisKKwlkZnByaW50ayhWRlMsICJuZnM6IGZsdXNoKCVzLyVsZClcbiIsIGlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8pOworCisJaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgPT0gMCkKKwkJcmV0dXJuIDA7CisJbG9ja19rZXJuZWwoKTsKKwkvKiBFbnN1cmUgdGhhdCBkYXRhK2F0dHJpYnV0ZSBjYWNoZXMgYXJlIHVwIHRvIGRhdGUgYWZ0ZXIgY2xvc2UoKSAqLworCXN0YXR1cyA9IG5mc193Yl9hbGwoaW5vZGUpOworCWlmICghc3RhdHVzKSB7CisJCXN0YXR1cyA9IGN0eC0+ZXJyb3I7CisJCWN0eC0+ZXJyb3IgPSAwOworCQlpZiAoIXN0YXR1cyAmJiAhbmZzX2hhdmVfZGVsZWdhdGlvbihpbm9kZSwgRk1PREVfUkVBRCkpCisJCQlfX25mc19yZXZhbGlkYXRlX2lub2RlKE5GU19TRVJWRVIoaW5vZGUpLCBpbm9kZSk7CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgc3NpemVfdAorbmZzX2ZpbGVfcmVhZChzdHJ1Y3Qga2lvY2IgKmlvY2IsIGNoYXIgX191c2VyICogYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCBwb3MpCit7CisJc3RydWN0IGRlbnRyeSAqIGRlbnRyeSA9IGlvY2ItPmtpX2ZpbHAtPmZfZGVudHJ5OworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXNzaXplX3QgcmVzdWx0OworCisjaWZkZWYgQ09ORklHX05GU19ESVJFQ1RJTworCWlmIChpb2NiLT5raV9maWxwLT5mX2ZsYWdzICYgT19ESVJFQ1QpCisJCXJldHVybiBuZnNfZmlsZV9kaXJlY3RfcmVhZChpb2NiLCBidWYsIGNvdW50LCBwb3MpOworI2VuZGlmCisKKwlkZnByaW50ayhWRlMsICJuZnM6IHJlYWQoJXMvJXMsICVsdUAlbHUpXG4iLAorCQlkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJKHVuc2lnbmVkIGxvbmcpIGNvdW50LCAodW5zaWduZWQgbG9uZykgcG9zKTsKKworCXJlc3VsdCA9IG5mc19yZXZhbGlkYXRlX2lub2RlKE5GU19TRVJWRVIoaW5vZGUpLCBpbm9kZSk7CisJaWYgKCFyZXN1bHQpCisJCXJlc3VsdCA9IGdlbmVyaWNfZmlsZV9haW9fcmVhZChpb2NiLCBidWYsIGNvdW50LCBwb3MpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CituZnNfZmlsZV9zZW5kZmlsZShzdHJ1Y3QgZmlsZSAqZmlscCwgbG9mZl90ICpwcG9zLCBzaXplX3QgY291bnQsCisJCXJlYWRfYWN0b3JfdCBhY3Rvciwgdm9pZCAqdGFyZ2V0KQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbHAtPmZfZGVudHJ5OworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3NpemVfdCByZXM7CisKKwlkZnByaW50ayhWRlMsICJuZnM6IHNlbmRmaWxlKCVzLyVzLCAlbHVAJUx1KVxuIiwKKwkJZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCSh1bnNpZ25lZCBsb25nKSBjb3VudCwgKHVuc2lnbmVkIGxvbmcgbG9uZykgKnBwb3MpOworCisJcmVzID0gbmZzX3JldmFsaWRhdGVfaW5vZGUoTkZTX1NFUlZFUihpbm9kZSksIGlub2RlKTsKKwlpZiAoIXJlcykKKwkJcmVzID0gZ2VuZXJpY19maWxlX3NlbmRmaWxlKGZpbHAsIHBwb3MsIGNvdW50LCBhY3RvciwgdGFyZ2V0KTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50CituZnNfZmlsZV9tbWFwKHN0cnVjdCBmaWxlICogZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50CXN0YXR1czsKKworCWRmcHJpbnRrKFZGUywgIm5mczogbW1hcCglcy8lcylcbiIsCisJCWRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKworCXN0YXR1cyA9IG5mc19yZXZhbGlkYXRlX2lub2RlKE5GU19TRVJWRVIoaW5vZGUpLCBpbm9kZSk7CisJaWYgKCFzdGF0dXMpCisJCXN0YXR1cyA9IGdlbmVyaWNfZmlsZV9tbWFwKGZpbGUsIHZtYSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEZsdXNoIGFueSBkaXJ0eSBwYWdlcyBmb3IgdGhpcyBwcm9jZXNzLCBhbmQgY2hlY2sgZm9yIHdyaXRlIGVycm9ycy4KKyAqIFRoZSByZXR1cm4gc3RhdHVzIGZyb20gdGhpcyBjYWxsIHByb3ZpZGVzIGEgcmVsaWFibGUgaW5kaWNhdGlvbiBvZgorICogd2hldGhlciBhbnkgd3JpdGUgZXJyb3JzIG9jY3VycmVkIGZvciB0aGlzIHByb2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQKK25mc19mc3luYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgZGF0YXN5bmMpCit7CisJc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCA9IChzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludCBzdGF0dXM7CisKKwlkZnByaW50ayhWRlMsICJuZnM6IGZzeW5jKCVzLyVsZClcbiIsIGlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8pOworCisJbG9ja19rZXJuZWwoKTsKKwlzdGF0dXMgPSBuZnNfd2JfYWxsKGlub2RlKTsKKwlpZiAoIXN0YXR1cykgeworCQlzdGF0dXMgPSBjdHgtPmVycm9yOworCQljdHgtPmVycm9yID0gMDsKKwl9CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBUaGlzIGRvZXMgdGhlICJyZWFsIiB3b3JrIG9mIHRoZSB3cml0ZS4gVGhlIGdlbmVyaWMgcm91dGluZSBoYXMKKyAqIGFsbG9jYXRlZCB0aGUgcGFnZSwgbG9ja2VkIGl0LCBkb25lIGFsbCB0aGUgcGFnZSBhbGlnbm1lbnQgc3R1ZmYKKyAqIGNhbGN1bGF0aW9ucyBldGMuIE5vdyB3ZSBzaG91bGQganVzdCBjb3B5IHRoZSBkYXRhIGZyb20gdXNlcgorICogc3BhY2UgYW5kIHdyaXRlIGl0IGJhY2sgdG8gdGhlIHJlYWwgbWVkaXVtLi4KKyAqCisgKiBJZiB0aGUgd3JpdGVyIGVuZHMgdXAgZGVsYXlpbmcgdGhlIHdyaXRlLCB0aGUgd3JpdGVyIG5lZWRzIHRvCisgKiBpbmNyZW1lbnQgdGhlIHBhZ2UgdXNlIGNvdW50cyB1bnRpbCBoZSBpcyBkb25lIHdpdGggdGhlIHBhZ2UuCisgKi8KK3N0YXRpYyBpbnQgbmZzX3ByZXBhcmVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIHRvKQoreworCXJldHVybiBuZnNfZmx1c2hfaW5jb21wYXRpYmxlKGZpbGUsIHBhZ2UpOworfQorCitzdGF0aWMgaW50IG5mc19jb21taXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIHRvKQoreworCWxvbmcgc3RhdHVzOworCisJbG9ja19rZXJuZWwoKTsKKwlzdGF0dXMgPSBuZnNfdXBkYXRlcGFnZShmaWxlLCBwYWdlLCBvZmZzZXQsIHRvLW9mZnNldCk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgbmZzX2ZpbGVfYW9wcyA9IHsKKwkucmVhZHBhZ2UgPSBuZnNfcmVhZHBhZ2UsCisJLnJlYWRwYWdlcyA9IG5mc19yZWFkcGFnZXMsCisJLnNldF9wYWdlX2RpcnR5ID0gX19zZXRfcGFnZV9kaXJ0eV9ub2J1ZmZlcnMsCisJLndyaXRlcGFnZSA9IG5mc193cml0ZXBhZ2UsCisJLndyaXRlcGFnZXMgPSBuZnNfd3JpdGVwYWdlcywKKwkucHJlcGFyZV93cml0ZSA9IG5mc19wcmVwYXJlX3dyaXRlLAorCS5jb21taXRfd3JpdGUgPSBuZnNfY29tbWl0X3dyaXRlLAorI2lmZGVmIENPTkZJR19ORlNfRElSRUNUSU8KKwkuZGlyZWN0X0lPID0gbmZzX2RpcmVjdF9JTywKKyNlbmRpZgorfTsKKworLyogCisgKiBXcml0ZSB0byBhIGZpbGUgKHRocm91Z2ggdGhlIHBhZ2UgY2FjaGUpLgorICovCitzdGF0aWMgc3NpemVfdAorbmZzX2ZpbGVfd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCBwb3MpCit7CisJc3RydWN0IGRlbnRyeSAqIGRlbnRyeSA9IGlvY2ItPmtpX2ZpbHAtPmZfZGVudHJ5OworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXNzaXplX3QgcmVzdWx0OworCisjaWZkZWYgQ09ORklHX05GU19ESVJFQ1RJTworCWlmIChpb2NiLT5raV9maWxwLT5mX2ZsYWdzICYgT19ESVJFQ1QpCisJCXJldHVybiBuZnNfZmlsZV9kaXJlY3Rfd3JpdGUoaW9jYiwgYnVmLCBjb3VudCwgcG9zKTsKKyNlbmRpZgorCisJZGZwcmludGsoVkZTLCAibmZzOiB3cml0ZSglcy8lcyglbGQpLCAlbHVAJWx1KVxuIiwKKwkJZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCWlub2RlLT5pX2lubywgKHVuc2lnbmVkIGxvbmcpIGNvdW50LCAodW5zaWduZWQgbG9uZykgcG9zKTsKKworCXJlc3VsdCA9IC1FQlVTWTsKKwlpZiAoSVNfU1dBUEZJTEUoaW5vZGUpKQorCQlnb3RvIG91dF9zd2FwZmlsZTsKKwlyZXN1bHQgPSBuZnNfcmV2YWxpZGF0ZV9pbm9kZShORlNfU0VSVkVSKGlub2RlKSwgaW5vZGUpOworCWlmIChyZXN1bHQpCisJCWdvdG8gb3V0OworCisJcmVzdWx0ID0gY291bnQ7CisJaWYgKCFjb3VudCkKKwkJZ290byBvdXQ7CisKKwlyZXN1bHQgPSBnZW5lcmljX2ZpbGVfYWlvX3dyaXRlKGlvY2IsIGJ1ZiwgY291bnQsIHBvcyk7CitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKKworb3V0X3N3YXBmaWxlOgorCXByaW50ayhLRVJOX0lORk8gIk5GUzogYXR0ZW1wdCB0byB3cml0ZSB0byBhY3RpdmUgc3dhcCBmaWxlIVxuIik7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyBpbnQgZG9fZ2V0bGsoc3RydWN0IGZpbGUgKmZpbHAsIGludCBjbWQsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX21hcHBpbmctPmhvc3Q7CisJaW50IHN0YXR1cyA9IDA7CisKKwlsb2NrX2tlcm5lbCgpOworCS8qIFVzZSBsb2NhbCBsb2NraW5nIGlmIG1vdW50ZWQgd2l0aCAiLW9ub2xvY2siICovCisJaWYgKCEoTkZTX1NFUlZFUihpbm9kZSktPmZsYWdzICYgTkZTX01PVU5UX05PTkxNKSkKKwkJc3RhdHVzID0gTkZTX1BST1RPKGlub2RlKS0+bG9jayhmaWxwLCBjbWQsIGZsKTsKKwllbHNlIHsKKwkJc3RydWN0IGZpbGVfbG9jayAqY2ZsID0gcG9zaXhfdGVzdF9sb2NrKGZpbHAsIGZsKTsKKworCQlmbC0+ZmxfdHlwZSA9IEZfVU5MQ0s7CisJCWlmIChjZmwgIT0gTlVMTCkKKwkJCW1lbWNweShmbCwgY2ZsLCBzaXplb2YoKmZsKSk7CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGRvX3Zmc19sb2NrKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwlpbnQgcmVzID0gMDsKKwlzd2l0Y2ggKGZsLT5mbF9mbGFncyAmIChGTF9QT1NJWHxGTF9GTE9DSykpIHsKKwkJY2FzZSBGTF9QT1NJWDoKKwkJCXJlcyA9IHBvc2l4X2xvY2tfZmlsZV93YWl0KGZpbGUsIGZsKTsKKwkJCWJyZWFrOworCQljYXNlIEZMX0ZMT0NLOgorCQkJcmVzID0gZmxvY2tfbG9ja19maWxlX3dhaXQoZmlsZSwgZmwpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlCVUcoKTsKKwl9CisJaWYgKHJlcyA8IDApCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBWRlMgaXMgb3V0IG9mIHN5bmMgd2l0aCBsb2NrIG1hbmFnZXIhXG4iLAorCQkJCV9fRlVOQ1RJT05fXyk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBkb191bmxrKHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgY21kLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9tYXBwaW5nLT5ob3N0OworCXNpZ3NldF90IG9sZHNldDsKKwlpbnQgc3RhdHVzOworCisJcnBjX2NsbnRfc2lnbWFzayhORlNfQ0xJRU5UKGlub2RlKSwgJm9sZHNldCk7CisJLyoKKwkgKiBGbHVzaCBhbGwgcGVuZGluZyB3cml0ZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nCisJICogd2l0aCBsb2Nrcy4uCisJICovCisJZmlsZW1hcF9mZGF0YXdyaXRlKGZpbHAtPmZfbWFwcGluZyk7CisJZG93bigmaW5vZGUtPmlfc2VtKTsKKwluZnNfd2JfYWxsKGlub2RlKTsKKwl1cCgmaW5vZGUtPmlfc2VtKTsKKwlmaWxlbWFwX2ZkYXRhd2FpdChmaWxwLT5mX21hcHBpbmcpOworCisJLyogTk9URTogc3BlY2lhbCBjYXNlCisJICogCUlmIHdlJ3JlIHNpZ25hbGxlZCB3aGlsZSBjbGVhbmluZyB1cCBsb2NrcyBvbiBwcm9jZXNzIGV4aXQsIHdlCisJICogCXN0aWxsIG5lZWQgdG8gY29tcGxldGUgdGhlIHVubG9jay4KKwkgKi8KKwlsb2NrX2tlcm5lbCgpOworCS8qIFVzZSBsb2NhbCBsb2NraW5nIGlmIG1vdW50ZWQgd2l0aCAiLW9ub2xvY2siICovCisJaWYgKCEoTkZTX1NFUlZFUihpbm9kZSktPmZsYWdzICYgTkZTX01PVU5UX05PTkxNKSkKKwkJc3RhdHVzID0gTkZTX1BST1RPKGlub2RlKS0+bG9jayhmaWxwLCBjbWQsIGZsKTsKKwllbHNlCisJCXN0YXR1cyA9IGRvX3Zmc19sb2NrKGZpbHAsIGZsKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcnBjX2NsbnRfc2lndW5tYXNrKE5GU19DTElFTlQoaW5vZGUpLCAmb2xkc2V0KTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGRvX3NldGxrKHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgY21kLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9tYXBwaW5nLT5ob3N0OworCXNpZ3NldF90IG9sZHNldDsKKwlpbnQgc3RhdHVzOworCisJcnBjX2NsbnRfc2lnbWFzayhORlNfQ0xJRU5UKGlub2RlKSwgJm9sZHNldCk7CisJLyoKKwkgKiBGbHVzaCBhbGwgcGVuZGluZyB3cml0ZXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nCisJICogd2l0aCBsb2Nrcy4uCisJICovCisJc3RhdHVzID0gZmlsZW1hcF9mZGF0YXdyaXRlKGZpbHAtPmZfbWFwcGluZyk7CisJaWYgKHN0YXR1cyA9PSAwKSB7CisJCWRvd24oJmlub2RlLT5pX3NlbSk7CisJCXN0YXR1cyA9IG5mc193Yl9hbGwoaW5vZGUpOworCQl1cCgmaW5vZGUtPmlfc2VtKTsKKwkJaWYgKHN0YXR1cyA9PSAwKQorCQkJc3RhdHVzID0gZmlsZW1hcF9mZGF0YXdhaXQoZmlscC0+Zl9tYXBwaW5nKTsKKwl9CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gb3V0OworCisJbG9ja19rZXJuZWwoKTsKKwkvKiBVc2UgbG9jYWwgbG9ja2luZyBpZiBtb3VudGVkIHdpdGggIi1vbm9sb2NrIiAqLworCWlmICghKE5GU19TRVJWRVIoaW5vZGUpLT5mbGFncyAmIE5GU19NT1VOVF9OT05MTSkpIHsKKwkJc3RhdHVzID0gTkZTX1BST1RPKGlub2RlKS0+bG9jayhmaWxwLCBjbWQsIGZsKTsKKwkJLyogSWYgd2Ugd2VyZSBzaWduYWxsZWQgd2Ugc3RpbGwgbmVlZCB0byBlbnN1cmUgdGhhdAorCQkgKiB3ZSBjbGVhbiB1cCBhbnkgc3RhdGUgb24gdGhlIHNlcnZlci4gV2UgdGhlcmVmb3JlCisJCSAqIHJlY29yZCB0aGUgbG9jayBjYWxsIGFzIGhhdmluZyBzdWNjZWVkZWQgaW4gb3JkZXIgdG8KKwkJICogZW5zdXJlIHRoYXQgbG9ja3NfcmVtb3ZlX3Bvc2l4KCkgY2xlYW5zIGl0IG91dCB3aGVuCisJCSAqIHRoZSBwcm9jZXNzIGV4aXRzLgorCQkgKi8KKwkJaWYgKHN0YXR1cyA9PSAtRUlOVFIgfHwgc3RhdHVzID09IC1FUkVTVEFSVFNZUykKKwkJCWRvX3Zmc19sb2NrKGZpbHAsIGZsKTsKKwl9IGVsc2UKKwkJc3RhdHVzID0gZG9fdmZzX2xvY2soZmlscCwgZmwpOworCXVubG9ja19rZXJuZWwoKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBvdXQ7CisJLyoKKwkgKiBNYWtlIHN1cmUgd2UgY2xlYXIgdGhlIGNhY2hlIHdoZW5ldmVyIHdlIHRyeSB0byBnZXQgdGhlIGxvY2suCisJICogVGhpcyBtYWtlcyBsb2NraW5nIGFjdCBhcyBhIGNhY2hlIGNvaGVyZW5jeSBwb2ludC4KKwkgKi8KKwlmaWxlbWFwX2ZkYXRhd3JpdGUoZmlscC0+Zl9tYXBwaW5nKTsKKwlkb3duKCZpbm9kZS0+aV9zZW0pOworCW5mc193Yl9hbGwoaW5vZGUpOwkvKiB3ZSBtYXkgaGF2ZSBzbGVwdCAqLworCXVwKCZpbm9kZS0+aV9zZW0pOworCWZpbGVtYXBfZmRhdGF3YWl0KGZpbHAtPmZfbWFwcGluZyk7CisJbmZzX3phcF9jYWNoZXMoaW5vZGUpOworb3V0OgorCXJwY19jbG50X3NpZ3VubWFzayhORlNfQ0xJRU5UKGlub2RlKSwgJm9sZHNldCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIExvY2sgYSAocG9ydGlvbiBvZikgYSBmaWxlCisgKi8KK3N0YXRpYyBpbnQgbmZzX2xvY2soc3RydWN0IGZpbGUgKmZpbHAsIGludCBjbWQsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZmlscC0+Zl9tYXBwaW5nLT5ob3N0OworCisJZHByaW50aygiTkZTOiBuZnNfbG9jayhmPSVzLyVsZCwgdD0leCwgZmw9JXgsIHI9JUxkOiVMZClcbiIsCisJCQlpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vLAorCQkJZmwtPmZsX3R5cGUsIGZsLT5mbF9mbGFncywKKwkJCShsb25nIGxvbmcpZmwtPmZsX3N0YXJ0LCAobG9uZyBsb25nKWZsLT5mbF9lbmQpOworCisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBObyBtYW5kYXRvcnkgbG9ja3Mgb3ZlciBORlMgKi8KKwlpZiAoKGlub2RlLT5pX21vZGUgJiAoU19JU0dJRCB8IFNfSVhHUlApKSA9PSBTX0lTR0lEKQorCQlyZXR1cm4gLUVOT0xDSzsKKworCWlmIChJU19HRVRMSyhjbWQpKQorCQlyZXR1cm4gZG9fZ2V0bGsoZmlscCwgY21kLCBmbCk7CisJaWYgKGZsLT5mbF90eXBlID09IEZfVU5MQ0spCisJCXJldHVybiBkb191bmxrKGZpbHAsIGNtZCwgZmwpOworCXJldHVybiBkb19zZXRsayhmaWxwLCBjbWQsIGZsKTsKK30KKworLyoKKyAqIExvY2sgYSAocG9ydGlvbiBvZikgYSBmaWxlCisgKi8KK3N0YXRpYyBpbnQgbmZzX2Zsb2NrKHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgY21kLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGZpbHAtPmZfbWFwcGluZy0+aG9zdDsKKworCWRwcmludGsoIk5GUzogbmZzX2Zsb2NrKGY9JXMvJWxkLCB0PSV4LCBmbD0leClcbiIsCisJCQlpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vLAorCQkJZmwtPmZsX3R5cGUsIGZsLT5mbF9mbGFncyk7CisKKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qCisJICogTm8gQlNEIGZsb2NrcyBvdmVyIE5GUyBhbGxvd2VkLgorCSAqIE5vdGU6IHdlIGNvdWxkIHRyeSB0byBmYWtlIGEgUE9TSVggbG9jayByZXF1ZXN0IGhlcmUgYnkKKwkgKiB1c2luZyAoKHUzMikgZmlscCB8IDB4ODAwMDAwMDApIG9yIHNvbWUgc3VjaCBhcyB0aGUgcGlkLgorCSAqIE5vdCBzdXJlIHdoZXRoZXIgdGhhdCB3b3VsZCBiZSB1bmlxdWUsIHRob3VnaCwgb3Igd2hldGhlcgorCSAqIHRoYXQgd291bGQgYnJlYWsgaW4gb3RoZXIgcGxhY2VzLgorCSAqLworCWlmICghKGZsLT5mbF9mbGFncyAmIEZMX0ZMT0NLKSkKKwkJcmV0dXJuIC1FTk9MQ0s7CisKKwkvKiBXZSdyZSBzaW11bGF0aW5nIGZsb2NrKCkgbG9ja3MgdXNpbmcgcG9zaXggbG9ja3Mgb24gdGhlIHNlcnZlciAqLworCWZsLT5mbF9vd25lciA9IChmbF9vd25lcl90KWZpbHA7CisJZmwtPmZsX3N0YXJ0ID0gMDsKKwlmbC0+ZmxfZW5kID0gT0ZGU0VUX01BWDsKKworCWlmIChmbC0+ZmxfdHlwZSA9PSBGX1VOTENLKQorCQlyZXR1cm4gZG9fdW5sayhmaWxwLCBjbWQsIGZsKTsKKwlyZXR1cm4gZG9fc2V0bGsoZmlscCwgY21kLCBmbCk7Cit9CmRpZmYgLS1naXQgYS9mcy9uZnMvaWRtYXAuYyBiL2ZzL25mcy9pZG1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NGM0ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnMvaWRtYXAuYwpAQCAtMCwwICsxLDQ5OCBAQAorLyoKKyAqIGZzL25mcy9pZG1hcC5jCisgKgorICogIFVJRCBhbmQgR0lEIHRvIG5hbWUgbWFwcGluZyBmb3IgY2xpZW50cy4KKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuLgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIE1hcml1cyBBYW1vZHQgRXJpa3NlbiA8bWFyaXVzQHVtaWNoLmVkdT4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqCisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqICBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiAgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqICBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiAgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqICBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3JwY19waXBlX2ZzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZnNfZnNfc2IuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KKworI2luY2x1ZGUgPGxpbnV4L25mc19pZG1hcC5oPgorCisjZGVmaW5lIElETUFQX0hBU0hfU1ogICAgICAgICAgMTI4CisKK3N0cnVjdCBpZG1hcF9oYXNoZW50IHsKKwlfX3UzMiBpaF9pZDsKKwlpbnQgaWhfbmFtZWxlbjsKKwljaGFyIGloX25hbWVbSURNQVBfTkFNRVNaXTsKK307CisKK3N0cnVjdCBpZG1hcF9oYXNodGFibGUgeworCV9fdTggaF90eXBlOworCXN0cnVjdCBpZG1hcF9oYXNoZW50IGhfZW50cmllc1tJRE1BUF9IQVNIX1NaXTsKK307CisKK3N0cnVjdCBpZG1hcCB7CisJY2hhciAgICAgICAgICAgICAgICAgIGlkbWFwX3BhdGhbNDhdOworCXN0cnVjdCBkZW50cnkgICAgICAgICppZG1hcF9kZW50cnk7CisJd2FpdF9xdWV1ZV9oZWFkX3QgICAgIGlkbWFwX3dxOworCXN0cnVjdCBpZG1hcF9tc2cgICAgICBpZG1hcF9pbTsKKwlzdHJ1Y3Qgc2VtYXBob3JlICAgICAgaWRtYXBfbG9jazsgICAgLyogU2VyaWFsaXplcyB1cGNhbGxzICovCisJc3RydWN0IHNlbWFwaG9yZSAgICAgIGlkbWFwX2ltX2xvY2s7IC8qIFByb3RlY3RzIHRoZSBoYXNodGFibGUgKi8KKwlzdHJ1Y3QgaWRtYXBfaGFzaHRhYmxlIGlkbWFwX3VzZXJfaGFzaDsKKwlzdHJ1Y3QgaWRtYXBfaGFzaHRhYmxlIGlkbWFwX2dyb3VwX2hhc2g7Cit9OworCitzdGF0aWMgc3NpemVfdCAgIGlkbWFwX3BpcGVfdXBjYWxsKHN0cnVjdCBmaWxlICosIHN0cnVjdCBycGNfcGlwZV9tc2cgKiwKKwkJICAgICBjaGFyIF9fdXNlciAqLCBzaXplX3QpOworc3RhdGljIHNzaXplX3QgICBpZG1hcF9waXBlX2Rvd25jYWxsKHN0cnVjdCBmaWxlICosIGNvbnN0IGNoYXIgX191c2VyICosCisJCSAgICAgc2l6ZV90KTsKK3ZvaWQgICAgICAgICAgICAgaWRtYXBfcGlwZV9kZXN0cm95X21zZyhzdHJ1Y3QgcnBjX3BpcGVfbXNnICopOworCitzdGF0aWMgdW5zaWduZWQgaW50IGZudmhhc2gzMihjb25zdCB2b2lkICosIHNpemVfdCk7CisKK3N0YXRpYyBzdHJ1Y3QgcnBjX3BpcGVfb3BzIGlkbWFwX3VwY2FsbF9vcHMgPSB7CisgICAgICAgIC51cGNhbGwgICAgICAgICA9IGlkbWFwX3BpcGVfdXBjYWxsLAorICAgICAgICAuZG93bmNhbGwgICAgICAgPSBpZG1hcF9waXBlX2Rvd25jYWxsLAorICAgICAgICAuZGVzdHJveV9tc2cgICAgPSBpZG1hcF9waXBlX2Rlc3Ryb3lfbXNnLAorfTsKKwordm9pZAorbmZzX2lkbWFwX25ldyhzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCkKK3sKKwlzdHJ1Y3QgaWRtYXAgKmlkbWFwOworCisJaWYgKGNscC0+Y2xfaWRtYXAgIT0gTlVMTCkKKwkJcmV0dXJuOworICAgICAgICBpZiAoKGlkbWFwID0ga21hbGxvYyhzaXplb2YoKmlkbWFwKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisJbWVtc2V0KGlkbWFwLCAwLCBzaXplb2YoKmlkbWFwKSk7CisKKwlzbnByaW50ZihpZG1hcC0+aWRtYXBfcGF0aCwgc2l6ZW9mKGlkbWFwLT5pZG1hcF9wYXRoKSwKKwkgICAgIiVzL2lkbWFwIiwgY2xwLT5jbF9ycGNjbGllbnQtPmNsX3BhdGhuYW1lKTsKKworICAgICAgICBpZG1hcC0+aWRtYXBfZGVudHJ5ID0gcnBjX21rcGlwZShpZG1hcC0+aWRtYXBfcGF0aCwKKwkgICAgaWRtYXAsICZpZG1hcF91cGNhbGxfb3BzLCAwKTsKKyAgICAgICAgaWYgKElTX0VSUihpZG1hcC0+aWRtYXBfZGVudHJ5KSkgeworCQlrZnJlZShpZG1hcCk7CisJCXJldHVybjsKKwl9CisKKyAgICAgICAgaW5pdF9NVVRFWCgmaWRtYXAtPmlkbWFwX2xvY2spOworICAgICAgICBpbml0X01VVEVYKCZpZG1hcC0+aWRtYXBfaW1fbG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaWRtYXAtPmlkbWFwX3dxKTsKKwlpZG1hcC0+aWRtYXBfdXNlcl9oYXNoLmhfdHlwZSA9IElETUFQX1RZUEVfVVNFUjsKKwlpZG1hcC0+aWRtYXBfZ3JvdXBfaGFzaC5oX3R5cGUgPSBJRE1BUF9UWVBFX0dST1VQOworCisJY2xwLT5jbF9pZG1hcCA9IGlkbWFwOworfQorCit2b2lkCituZnNfaWRtYXBfZGVsZXRlKHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwKQoreworCXN0cnVjdCBpZG1hcCAqaWRtYXAgPSBjbHAtPmNsX2lkbWFwOworCisJaWYgKCFpZG1hcCkKKwkJcmV0dXJuOworCXJwY191bmxpbmsoaWRtYXAtPmlkbWFwX3BhdGgpOworCWNscC0+Y2xfaWRtYXAgPSBOVUxMOworCWtmcmVlKGlkbWFwKTsKK30KKworLyoKKyAqIEhlbHBlciByb3V0aW5lcyBmb3IgbWFuaXB1bGF0aW5nIHRoZSBoYXNodGFibGUKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgaWRtYXBfaGFzaGVudCAqCitpZG1hcF9uYW1lX2hhc2goc3RydWN0IGlkbWFwX2hhc2h0YWJsZSogaCwgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gJmgtPmhfZW50cmllc1tmbnZoYXNoMzIobmFtZSwgbGVuKSAlIElETUFQX0hBU0hfU1pdOworfQorCitzdGF0aWMgc3RydWN0IGlkbWFwX2hhc2hlbnQgKgoraWRtYXBfbG9va3VwX25hbWUoc3RydWN0IGlkbWFwX2hhc2h0YWJsZSAqaCwgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgaWRtYXBfaGFzaGVudCAqaGUgPSBpZG1hcF9uYW1lX2hhc2goaCwgbmFtZSwgbGVuKTsKKworCWlmIChoZS0+aWhfbmFtZWxlbiAhPSBsZW4gfHwgbWVtY21wKGhlLT5paF9uYW1lLCBuYW1lLCBsZW4pICE9IDApCisJCXJldHVybiBOVUxMOworCXJldHVybiBoZTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaWRtYXBfaGFzaGVudCAqCitpZG1hcF9pZF9oYXNoKHN0cnVjdCBpZG1hcF9oYXNodGFibGUqIGgsIF9fdTMyIGlkKQoreworCXJldHVybiAmaC0+aF9lbnRyaWVzW2Zudmhhc2gzMigmaWQsIHNpemVvZihpZCkpICUgSURNQVBfSEFTSF9TWl07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWRtYXBfaGFzaGVudCAqCitpZG1hcF9sb29rdXBfaWQoc3RydWN0IGlkbWFwX2hhc2h0YWJsZSAqaCwgX191MzIgaWQpCit7CisJc3RydWN0IGlkbWFwX2hhc2hlbnQgKmhlID0gaWRtYXBfaWRfaGFzaChoLCBpZCk7CisJaWYgKGhlLT5paF9pZCAhPSBpZCB8fCBoZS0+aWhfbmFtZWxlbiA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gaGU7Cit9CisKKy8qCisgKiBSb3V0aW5lcyBmb3IgYWxsb2NhdGluZyBuZXcgZW50cmllcyBpbiB0aGUgaGFzaHRhYmxlLgorICogRm9yIG5vdywgd2UganVzdCBoYXZlIDEgZW50cnkgcGVyIGJ1Y2tldCwgc28gaXQncyBhbGwKKyAqIHByZXR0eSB0cml2aWFsLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpZG1hcF9oYXNoZW50ICoKK2lkbWFwX2FsbG9jX25hbWUoc3RydWN0IGlkbWFwX2hhc2h0YWJsZSAqaCwgY2hhciAqbmFtZSwgdW5zaWduZWQgbGVuKQoreworCXJldHVybiBpZG1hcF9uYW1lX2hhc2goaCwgbmFtZSwgbGVuKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaWRtYXBfaGFzaGVudCAqCitpZG1hcF9hbGxvY19pZChzdHJ1Y3QgaWRtYXBfaGFzaHRhYmxlICpoLCBfX3UzMiBpZCkKK3sKKwlyZXR1cm4gaWRtYXBfaWRfaGFzaChoLCBpZCk7Cit9CisKK3N0YXRpYyB2b2lkCitpZG1hcF91cGRhdGVfZW50cnkoc3RydWN0IGlkbWFwX2hhc2hlbnQgKmhlLCBjb25zdCBjaGFyICpuYW1lLAorCQlzaXplX3QgbmFtZWxlbiwgX191MzIgaWQpCit7CisJaGUtPmloX2lkID0gaWQ7CisJbWVtY3B5KGhlLT5paF9uYW1lLCBuYW1lLCBuYW1lbGVuKTsKKwloZS0+aWhfbmFtZVtuYW1lbGVuXSA9ICdcMCc7CisJaGUtPmloX25hbWVsZW4gPSBuYW1lbGVuOworfQorCisvKgorICogTmFtZSAtPiBJRAorICovCitzdGF0aWMgaW50CituZnNfaWRtYXBfaWQoc3RydWN0IGlkbWFwICppZG1hcCwgc3RydWN0IGlkbWFwX2hhc2h0YWJsZSAqaCwKKwkJY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IG5hbWVsZW4sIF9fdTMyICppZCkKK3sKKwlzdHJ1Y3QgcnBjX3BpcGVfbXNnIG1zZzsKKwlzdHJ1Y3QgaWRtYXBfbXNnICppbTsKKwlzdHJ1Y3QgaWRtYXBfaGFzaGVudCAqaGU7CisJREVDTEFSRV9XQUlUUVVFVUUod3EsIGN1cnJlbnQpOworCWludCByZXQgPSAtRUlPOworCisJaW0gPSAmaWRtYXAtPmlkbWFwX2ltOworCisJLyoKKwkgKiBTdHJpbmcgc2FuaXR5IGNoZWNrcworCSAqIE5vdGUgdGhhdCB0aGUgdXNlcmxhbmQgZGFlbW9uIGV4cGVjdHMgTlVMIHRlcm1pbmF0ZWQgc3RyaW5ncworCSAqLworCWZvciAoOzspIHsKKwkJaWYgKG5hbWVsZW4gPT0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAobmFtZVtuYW1lbGVuLTFdICE9ICdcMCcpCisJCQlicmVhazsKKwkJbmFtZWxlbi0tOworCX0KKwlpZiAobmFtZWxlbiA+PSBJRE1BUF9OQU1FU1opCisJCXJldHVybiAtRUlOVkFMOworCisJZG93bigmaWRtYXAtPmlkbWFwX2xvY2spOworCWRvd24oJmlkbWFwLT5pZG1hcF9pbV9sb2NrKTsKKworCWhlID0gaWRtYXBfbG9va3VwX25hbWUoaCwgbmFtZSwgbmFtZWxlbik7CisJaWYgKGhlICE9IE5VTEwpIHsKKwkJKmlkID0gaGUtPmloX2lkOworCQlyZXQgPSAwOworCQlnb3RvIG91dDsKKwl9CisKKwltZW1zZXQoaW0sIDAsIHNpemVvZigqaW0pKTsKKwltZW1jcHkoaW0tPmltX25hbWUsIG5hbWUsIG5hbWVsZW4pOworCisJaW0tPmltX3R5cGUgPSBoLT5oX3R5cGU7CisJaW0tPmltX2NvbnYgPSBJRE1BUF9DT05WX05BTUVUT0lEOworCisJbWVtc2V0KCZtc2csIDAsIHNpemVvZihtc2cpKTsKKwltc2cuZGF0YSA9IGltOworCW1zZy5sZW4gPSBzaXplb2YoKmltKTsKKworCWFkZF93YWl0X3F1ZXVlKCZpZG1hcC0+aWRtYXBfd3EsICZ3cSk7CisJaWYgKHJwY19xdWV1ZV91cGNhbGwoaWRtYXAtPmlkbWFwX2RlbnRyeS0+ZF9pbm9kZSwgJm1zZykgPCAwKSB7CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZpZG1hcC0+aWRtYXBfd3EsICZ3cSk7CisJCWdvdG8gb3V0OworCX0KKworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwl1cCgmaWRtYXAtPmlkbWFwX2ltX2xvY2spOworCXNjaGVkdWxlKCk7CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJcmVtb3ZlX3dhaXRfcXVldWUoJmlkbWFwLT5pZG1hcF93cSwgJndxKTsKKwlkb3duKCZpZG1hcC0+aWRtYXBfaW1fbG9jayk7CisKKwlpZiAoaW0tPmltX3N0YXR1cyAmIElETUFQX1NUQVRVU19TVUNDRVNTKSB7CisJCSppZCA9IGltLT5pbV9pZDsKKwkJcmV0ID0gMDsKKwl9CisKKyBvdXQ6CisJbWVtc2V0KGltLCAwLCBzaXplb2YoKmltKSk7CisJdXAoJmlkbWFwLT5pZG1hcF9pbV9sb2NrKTsKKwl1cCgmaWRtYXAtPmlkbWFwX2xvY2spOworCXJldHVybiAocmV0KTsKK30KKworLyoKKyAqIElEIC0+IE5hbWUKKyAqLworc3RhdGljIGludAorbmZzX2lkbWFwX25hbWUoc3RydWN0IGlkbWFwICppZG1hcCwgc3RydWN0IGlkbWFwX2hhc2h0YWJsZSAqaCwKKwkJX191MzIgaWQsIGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHJwY19waXBlX21zZyBtc2c7CisJc3RydWN0IGlkbWFwX21zZyAqaW07CisJc3RydWN0IGlkbWFwX2hhc2hlbnQgKmhlOworCURFQ0xBUkVfV0FJVFFVRVVFKHdxLCBjdXJyZW50KTsKKwlpbnQgcmV0ID0gLUVJTzsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJaW0gPSAmaWRtYXAtPmlkbWFwX2ltOworCisJZG93bigmaWRtYXAtPmlkbWFwX2xvY2spOworCWRvd24oJmlkbWFwLT5pZG1hcF9pbV9sb2NrKTsKKworCWhlID0gaWRtYXBfbG9va3VwX2lkKGgsIGlkKTsKKwlpZiAoaGUgIT0gMCkgeworCQltZW1jcHkobmFtZSwgaGUtPmloX25hbWUsIGhlLT5paF9uYW1lbGVuKTsKKwkJcmV0ID0gaGUtPmloX25hbWVsZW47CisJCWdvdG8gb3V0OworCX0KKworCW1lbXNldChpbSwgMCwgc2l6ZW9mKCppbSkpOworCWltLT5pbV90eXBlID0gaC0+aF90eXBlOworCWltLT5pbV9jb252ID0gSURNQVBfQ09OVl9JRFRPTkFNRTsKKwlpbS0+aW1faWQgPSBpZDsKKworCW1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7CisJbXNnLmRhdGEgPSBpbTsKKwltc2cubGVuID0gc2l6ZW9mKCppbSk7CisKKwlhZGRfd2FpdF9xdWV1ZSgmaWRtYXAtPmlkbWFwX3dxLCAmd3EpOworCisJaWYgKHJwY19xdWV1ZV91cGNhbGwoaWRtYXAtPmlkbWFwX2RlbnRyeS0+ZF9pbm9kZSwgJm1zZykgPCAwKSB7CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZpZG1hcC0+aWRtYXBfd3EsICZ3cSk7CisJCWdvdG8gb3V0OworCX0KKworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwl1cCgmaWRtYXAtPmlkbWFwX2ltX2xvY2spOworCXNjaGVkdWxlKCk7CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJcmVtb3ZlX3dhaXRfcXVldWUoJmlkbWFwLT5pZG1hcF93cSwgJndxKTsKKwlkb3duKCZpZG1hcC0+aWRtYXBfaW1fbG9jayk7CisKKwlpZiAoaW0tPmltX3N0YXR1cyAmIElETUFQX1NUQVRVU19TVUNDRVNTKSB7CisJCWlmICgobGVuID0gc3RybmxlbihpbS0+aW1fbmFtZSwgSURNQVBfTkFNRVNaKSkgPT0gMCkKKwkJCWdvdG8gb3V0OworCQltZW1jcHkobmFtZSwgaW0tPmltX25hbWUsIGxlbik7CisJCXJldCA9IGxlbjsKKwl9CisKKyBvdXQ6CisJbWVtc2V0KGltLCAwLCBzaXplb2YoKmltKSk7CisJdXAoJmlkbWFwLT5pZG1hcF9pbV9sb2NrKTsKKwl1cCgmaWRtYXAtPmlkbWFwX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qIFJQQyBwaXBlZnMgdXBjYWxsL2Rvd25jYWxsIHJvdXRpbmVzICovCitzdGF0aWMgc3NpemVfdAoraWRtYXBfcGlwZV91cGNhbGwoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBycGNfcGlwZV9tc2cgKm1zZywKKyAgICBjaGFyIF9fdXNlciAqZHN0LCBzaXplX3QgYnVmbGVuKQoreworICAgICAgICBjaGFyICpkYXRhID0gKGNoYXIgKiltc2ctPmRhdGEgKyBtc2ctPmNvcGllZDsKKyAgICAgICAgc3NpemVfdCBtbGVuID0gbXNnLT5sZW4gLSBtc2ctPmNvcGllZDsKKyAgICAgICAgc3NpemVfdCBsZWZ0OworCisgICAgICAgIGlmIChtbGVuID4gYnVmbGVuKQorICAgICAgICAgICAgICAgIG1sZW4gPSBidWZsZW47CisKKyAgICAgICAgbGVmdCA9IGNvcHlfdG9fdXNlcihkc3QsIGRhdGEsIG1sZW4pOworCWlmIChsZWZ0IDwgMCkgeworCQltc2ctPmVycm5vID0gbGVmdDsKKwkJcmV0dXJuIGxlZnQ7CisJfQorCW1sZW4gLT0gbGVmdDsKKwltc2ctPmNvcGllZCArPSBtbGVuOworCW1zZy0+ZXJybm8gPSAwOworICAgICAgICByZXR1cm4gbWxlbjsKK30KKworc3RhdGljIHNzaXplX3QKK2lkbWFwX3BpcGVfZG93bmNhbGwoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICpzcmMsIHNpemVfdCBtbGVuKQoreworICAgICAgICBzdHJ1Y3QgcnBjX2lub2RlICpycGNpID0gUlBDX0koZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpOworCXN0cnVjdCBpZG1hcCAqaWRtYXAgPSAoc3RydWN0IGlkbWFwICopcnBjaS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgaWRtYXBfbXNnIGltX2luLCAqaW0gPSAmaWRtYXAtPmlkbWFwX2ltOworCXN0cnVjdCBpZG1hcF9oYXNodGFibGUgKmg7CisJc3RydWN0IGlkbWFwX2hhc2hlbnQgKmhlID0gTlVMTDsKKwlpbnQgbmFtZWxlbl9pbjsKKwlpbnQgcmV0OworCisgICAgICAgIGlmIChtbGVuICE9IHNpemVvZihpbV9pbikpCisgICAgICAgICAgICAgICAgcmV0dXJuICgtRU5PU1BDKTsKKworICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoJmltX2luLCBzcmMsIG1sZW4pICE9IDApCisJCXJldHVybiAoLUVGQVVMVCk7CisKKwlkb3duKCZpZG1hcC0+aWRtYXBfaW1fbG9jayk7CisKKwlyZXQgPSBtbGVuOworCWltLT5pbV9zdGF0dXMgPSBpbV9pbi5pbV9zdGF0dXM7CisJLyogSWYgd2UgZ290IGFuIGVycm9yLCB0ZXJtaW5hdGUgbm93LCBhbmQgd2FrZSB1cCBwZW5kaW5nIHVwY2FsbHMgKi8KKwlpZiAoIShpbV9pbi5pbV9zdGF0dXMgJiBJRE1BUF9TVEFUVVNfU1VDQ0VTUykpIHsKKwkJd2FrZV91cCgmaWRtYXAtPmlkbWFwX3dxKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogU2FuaXR5IGNoZWNraW5nIG9mIHN0cmluZ3MgKi8KKwlyZXQgPSAtRUlOVkFMOworCW5hbWVsZW5faW4gPSBzdHJubGVuKGltX2luLmltX25hbWUsIElETUFQX05BTUVTWik7CisJaWYgKG5hbWVsZW5faW4gPT0gMCB8fCBuYW1lbGVuX2luID09IElETUFQX05BTUVTWikKKwkJZ290byBvdXQ7CisKKwlzd2l0Y2ggKGltX2luLmltX3R5cGUpIHsKKwkJY2FzZSBJRE1BUF9UWVBFX1VTRVI6CisJCQloID0gJmlkbWFwLT5pZG1hcF91c2VyX2hhc2g7CisJCQlicmVhazsKKwkJY2FzZSBJRE1BUF9UWVBFX0dST1VQOgorCQkJaCA9ICZpZG1hcC0+aWRtYXBfZ3JvdXBfaGFzaDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBvdXQ7CisJfQorCisJc3dpdGNoIChpbV9pbi5pbV9jb252KSB7CisJY2FzZSBJRE1BUF9DT05WX0lEVE9OQU1FOgorCQkvKiBEaWQgd2UgbWF0Y2ggdGhlIGN1cnJlbnQgdXBjYWxsPyAqLworCQlpZiAoaW0tPmltX2NvbnYgPT0gSURNQVBfQ09OVl9JRFRPTkFNRQorCQkJCSYmIGltLT5pbV90eXBlID09IGltX2luLmltX3R5cGUKKwkJCQkmJiBpbS0+aW1faWQgPT0gaW1faW4uaW1faWQpIHsKKwkJCS8qIFllczogY29weSBzdHJpbmcsIGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgJ1wwJyAgKi8KKwkJCW1lbWNweShpbS0+aW1fbmFtZSwgaW1faW4uaW1fbmFtZSwgbmFtZWxlbl9pbik7CisJCQlpbS0+aW1fbmFtZVtuYW1lbGVuX2luXSA9ICdcMCc7CisJCQl3YWtlX3VwKCZpZG1hcC0+aWRtYXBfd3EpOworCQl9CisJCWhlID0gaWRtYXBfYWxsb2NfaWQoaCwgaW1faW4uaW1faWQpOworCQlicmVhazsKKwljYXNlIElETUFQX0NPTlZfTkFNRVRPSUQ6CisJCS8qIERpZCB3ZSBtYXRjaCB0aGUgY3VycmVudCB1cGNhbGw/ICovCisJCWlmIChpbS0+aW1fY29udiA9PSBJRE1BUF9DT05WX05BTUVUT0lECisJCQkJJiYgaW0tPmltX3R5cGUgPT0gaW1faW4uaW1fdHlwZQorCQkJCSYmIHN0cm5sZW4oaW0tPmltX25hbWUsIElETUFQX05BTUVTWikgPT0gbmFtZWxlbl9pbgorCQkJCSYmIG1lbWNtcChpbS0+aW1fbmFtZSwgaW1faW4uaW1fbmFtZSwgbmFtZWxlbl9pbikgPT0gMCkgeworCQkJaW0tPmltX2lkID0gaW1faW4uaW1faWQ7CisJCQl3YWtlX3VwKCZpZG1hcC0+aWRtYXBfd3EpOworCQl9CisJCWhlID0gaWRtYXBfYWxsb2NfbmFtZShoLCBpbV9pbi5pbV9uYW1lLCBuYW1lbGVuX2luKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byBvdXQ7CisJfQorCisJLyogSWYgdGhlIGVudHJ5IGlzIHZhbGlkLCBhbHNvIGNvcHkgaXQgdG8gdGhlIGNhY2hlICovCisJaWYgKGhlICE9IE5VTEwpCisJCWlkbWFwX3VwZGF0ZV9lbnRyeShoZSwgaW1faW4uaW1fbmFtZSwgbmFtZWxlbl9pbiwgaW1faW4uaW1faWQpOworCXJldCA9IG1sZW47CitvdXQ6CisJdXAoJmlkbWFwLT5pZG1hcF9pbV9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkCitpZG1hcF9waXBlX2Rlc3Ryb3lfbXNnKHN0cnVjdCBycGNfcGlwZV9tc2cgKm1zZykKK3sKKwlzdHJ1Y3QgaWRtYXBfbXNnICppbSA9IG1zZy0+ZGF0YTsKKwlzdHJ1Y3QgaWRtYXAgKmlkbWFwID0gY29udGFpbmVyX29mKGltLCBzdHJ1Y3QgaWRtYXAsIGlkbWFwX2ltKTsgCisKKwlpZiAobXNnLT5lcnJubyA+PSAwKQorCQlyZXR1cm47CisJZG93bigmaWRtYXAtPmlkbWFwX2ltX2xvY2spOworCWltLT5pbV9zdGF0dXMgPSBJRE1BUF9TVEFUVVNfTE9PS1VQRkFJTDsKKwl3YWtlX3VwKCZpZG1hcC0+aWRtYXBfd3EpOworCXVwKCZpZG1hcC0+aWRtYXBfaW1fbG9jayk7Cit9CisKKy8qIAorICogRm93bGVyL05vbGwvVm8gaGFzaAorICogICAgaHR0cDovL3d3dy5pc3RoZS5jb20vY2hvbmdvL3RlY2gvY29tcC9mbnYvCisgKi8KKworI2RlZmluZSBGTlZfUF8zMiAoKHVuc2lnbmVkIGludCkweDAxMDAwMTkzKSAvKiAxNjc3NzYxOSAqLworI2RlZmluZSBGTlZfMV8zMiAoKHVuc2lnbmVkIGludCkweDgxMWM5ZGM1KSAvKiAyMTY2MTM2MjYxICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZm52aGFzaDMyKGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbikKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwLCAqZW5kID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilidWYgKyBidWZsZW47CisJdW5zaWduZWQgaW50IGhhc2ggPSBGTlZfMV8zMjsKKworCWZvciAocCA9IGJ1ZjsgcCA8IGVuZDsgcCsrKSB7CisJCWhhc2ggKj0gRk5WX1BfMzI7CisJCWhhc2ggXj0gKHVuc2lnbmVkIGludCkqcDsKKwl9CisKKwlyZXR1cm4gKGhhc2gpOworfQorCitpbnQgbmZzX21hcF9uYW1lX3RvX3VpZChzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCwgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IG5hbWVsZW4sIF9fdTMyICp1aWQpCit7CisJc3RydWN0IGlkbWFwICppZG1hcCA9IGNscC0+Y2xfaWRtYXA7CisKKwlyZXR1cm4gbmZzX2lkbWFwX2lkKGlkbWFwLCAmaWRtYXAtPmlkbWFwX3VzZXJfaGFzaCwgbmFtZSwgbmFtZWxlbiwgdWlkKTsKK30KKworaW50IG5mc19tYXBfZ3JvdXBfdG9fZ2lkKHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwLCBjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbmFtZWxlbiwgX191MzIgKnVpZCkKK3sKKwlzdHJ1Y3QgaWRtYXAgKmlkbWFwID0gY2xwLT5jbF9pZG1hcDsKKworCXJldHVybiBuZnNfaWRtYXBfaWQoaWRtYXAsICZpZG1hcC0+aWRtYXBfZ3JvdXBfaGFzaCwgbmFtZSwgbmFtZWxlbiwgdWlkKTsKK30KKworaW50IG5mc19tYXBfdWlkX3RvX25hbWUoc3RydWN0IG5mczRfY2xpZW50ICpjbHAsIF9fdTMyIHVpZCwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpZG1hcCAqaWRtYXAgPSBjbHAtPmNsX2lkbWFwOworCisJcmV0dXJuIG5mc19pZG1hcF9uYW1lKGlkbWFwLCAmaWRtYXAtPmlkbWFwX3VzZXJfaGFzaCwgdWlkLCBidWYpOworfQoraW50IG5mc19tYXBfZ2lkX3RvX2dyb3VwKHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwLCBfX3UzMiB1aWQsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWRtYXAgKmlkbWFwID0gY2xwLT5jbF9pZG1hcDsKKworCXJldHVybiBuZnNfaWRtYXBfbmFtZShpZG1hcCwgJmlkbWFwLT5pZG1hcF9ncm91cF9oYXNoLCB1aWQsIGJ1Zik7Cit9CisKZGlmZiAtLWdpdCBhL2ZzL25mcy9pbm9kZS5jIGIvZnMvbmZzL2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM0NWYyNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25mcy9pbm9kZS5jCkBAIC0wLDAgKzEsMjAwMyBAQAorLyoKKyAqICBsaW51eC9mcy9uZnMvaW5vZGUuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTIgIFJpY2sgU2xhZGtleQorICoKKyAqICBuZnMgaW5vZGUgYW5kIHN1cGVyYmxvY2sgaGFuZGxpbmcgZnVuY3Rpb25zCisgKgorICogIE1vZHVsYXJpc2VkIGJ5IEFsYW4gQ294IDxBbGFuLkNveEBsaW51eC5vcmc+LCB3aGlsZSBoYWNraW5nIHNvbWUKKyAqICBleHBlcmltZW50YWwgTkZTIGNoYW5nZXMuIE1vZHVsYXJpc2F0aW9uIHRha2VuIHN0cmFpZ2h0IGZyb20gU1lTNSBmcy4KKyAqCisgKiAgQ2hhbmdlIHRvIG5mc19yZWFkX3N1cGVyKCkgdG8gcGVybWl0IE5GUyBtb3VudHMgdG8gbXVsdGktaG9tZWQgaG9zdHMuCisgKiAgSi5TLlBlYXRmaWVsZEBkYW10cC5jYW0uYWMudWsKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N0YXRzLmg+CisjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbmZzX21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvbmZzNF9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2JpbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfaWRtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiZGVsZWdhdGlvbi5oIgorCisjZGVmaW5lIE5GU0RCR19GQUNJTElUWQkJTkZTREJHX1ZGUworI2RlZmluZSBORlNfUEFSQU5PSUEgMQorCisvKiBNYXhpbXVtIG51bWJlciBvZiByZWFkYWhlYWQgcmVxdWVzdHMKKyAqIEZJWE1FOiB0aGlzIHNob3VsZCByZWFsbHkgYmUgYSBzeXNjdGwgc28gdGhhdCB1c2VycyBtYXkgdHVuZSBpdCB0byBzdWl0CisgKiAgICAgICAgdGhlaXIgbmVlZHMuIFBlb3BsZSB0aGF0IGRvIE5GUyBvdmVyIGEgc2xvdyBuZXR3b3JrLCBtaWdodCBmb3IKKyAqICAgICAgICBpbnN0YW5jZSB3YW50IHRvIHJlZHVjZSBpdCB0byBzb21ldGhpbmcgY2xvc2VyIHRvIDEgZm9yIGltcHJvdmVkCisgKiAgICAgICAgaW50ZXJhY3RpdmUgcmVzcG9uc2UuCisgKi8KKyNkZWZpbmUgTkZTX01BWF9SRUFEQUhFQUQJKFJQQ19ERUZfU0xPVF9UQUJMRSAtIDEpCisKK3N0YXRpYyB2b2lkIG5mc19pbnZhbGlkYXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKK3N0YXRpYyBpbnQgbmZzX3VwZGF0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IG5mc19mYXR0ciAqLCB1bnNpZ25lZCBsb25nKTsKKworc3RhdGljIHN0cnVjdCBpbm9kZSAqbmZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworc3RhdGljIHZvaWQgbmZzX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICopOworc3RhdGljIGludCBuZnNfd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICosaW50KTsKK3N0YXRpYyB2b2lkIG5mc19kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICopOworc3RhdGljIHZvaWQgbmZzX2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKK3N0YXRpYyB2b2lkIG5mc191bW91bnRfYmVnaW4oc3RydWN0IHN1cGVyX2Jsb2NrICopOworc3RhdGljIGludCAgbmZzX3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGtzdGF0ZnMgKik7CitzdGF0aWMgaW50ICBuZnNfc2hvd19vcHRpb25zKHN0cnVjdCBzZXFfZmlsZSAqLCBzdHJ1Y3QgdmZzbW91bnQgKik7CisKK3N0YXRpYyBzdHJ1Y3QgcnBjX3Byb2dyYW0JbmZzX3Byb2dyYW07CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBuZnNfc29wcyA9IHsgCisJLmFsbG9jX2lub2RlCT0gbmZzX2FsbG9jX2lub2RlLAorCS5kZXN0cm95X2lub2RlCT0gbmZzX2Rlc3Ryb3lfaW5vZGUsCisJLndyaXRlX2lub2RlCT0gbmZzX3dyaXRlX2lub2RlLAorCS5kZWxldGVfaW5vZGUJPSBuZnNfZGVsZXRlX2lub2RlLAorCS5zdGF0ZnMJCT0gbmZzX3N0YXRmcywKKwkuY2xlYXJfaW5vZGUJPSBuZnNfY2xlYXJfaW5vZGUsCisJLnVtb3VudF9iZWdpbgk9IG5mc191bW91bnRfYmVnaW4sCisJLnNob3dfb3B0aW9ucwk9IG5mc19zaG93X29wdGlvbnMsCit9OworCisvKgorICogUlBDIGNydWZ0IGZvciBORlMKKyAqLworc3RhdGljIHN0cnVjdCBycGNfc3RhdAkJbmZzX3JwY3N0YXQgPSB7CisJLnByb2dyYW0JCT0gJm5mc19wcm9ncmFtCit9Oworc3RhdGljIHN0cnVjdCBycGNfdmVyc2lvbiAqCW5mc192ZXJzaW9uW10gPSB7CisJTlVMTCwKKwlOVUxMLAorCSZuZnNfdmVyc2lvbjIsCisjaWYgZGVmaW5lZChDT05GSUdfTkZTX1YzKQorCSZuZnNfdmVyc2lvbjMsCisjZWxpZiBkZWZpbmVkKENPTkZJR19ORlNfVjQpCisJTlVMTCwKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX05GU19WNCkKKwkmbmZzX3ZlcnNpb240LAorI2VuZGlmCit9OworCitzdGF0aWMgc3RydWN0IHJwY19wcm9ncmFtCW5mc19wcm9ncmFtID0geworCS5uYW1lCQkJPSAibmZzIiwKKwkubnVtYmVyCQkJPSBORlNfUFJPR1JBTSwKKwkubnJ2ZXJzCQkJPSBzaXplb2YobmZzX3ZlcnNpb24pIC8gc2l6ZW9mKG5mc192ZXJzaW9uWzBdKSwKKwkudmVyc2lvbgkJPSBuZnNfdmVyc2lvbiwKKwkuc3RhdHMJCQk9ICZuZnNfcnBjc3RhdCwKKwkucGlwZV9kaXJfbmFtZQkJPSAiL25mcyIsCit9OworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK25mc19mYXR0cl90b19pbm9fdChzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK3sKKwlyZXR1cm4gbmZzX2ZpbGVpZF90b19pbm9fdChmYXR0ci0+ZmlsZWlkKTsKK30KKworc3RhdGljIGludAorbmZzX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBzeW5jKQoreworCWludCBmbGFncyA9IHN5bmMgPyBGTFVTSF9XQUlUIDogMDsKKwlpbnQgcmV0OworCisJcmV0ID0gbmZzX2NvbW1pdF9pbm9kZShpbm9kZSwgMCwgMCwgZmxhZ3MpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorbmZzX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwlkcHJpbnRrKCJORlM6IGRlbGV0ZV9pbm9kZSglcy8lbGQpXG4iLCBpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vKTsKKworCW5mc193Yl9hbGwoaW5vZGUpOworCS8qCisJICogVGhlIGZvbGxvd2luZyBzaG91bGQgbmV2ZXIgaGFwcGVuLi4uCisJICovCisJaWYgKG5mc19oYXZlX3dyaXRlYmFja3MoaW5vZGUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAibmZzX2RlbGV0ZV9pbm9kZTogaW5vZGUgJWxkIGhhcyBwZW5kaW5nIFJQQyByZXF1ZXN0c1xuIiwgaW5vZGUtPmlfaW5vKTsKKwl9CisKKwljbGVhcl9pbm9kZShpbm9kZSk7Cit9CisKKy8qCisgKiBGb3IgdGhlIG1vbWVudCwgdGhlIG9ubHkgdGFzayBmb3IgdGhlIE5GUyBjbGVhcl9pbm9kZSBtZXRob2QgaXMgdG8KKyAqIHJlbGVhc2UgdGhlIG1tYXAgY3JlZGVudGlhbAorICovCitzdGF0aWMgdm9pZAorbmZzX2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKKwlzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQ7CisKKwluZnNfd2JfYWxsKGlub2RlKTsKKwlCVUdfT04gKCFsaXN0X2VtcHR5KCZuZnNpLT5vcGVuX2ZpbGVzKSk7CisJY3JlZCA9IG5mc2ktPmNhY2hlX2FjY2Vzcy5jcmVkOworCWlmIChjcmVkKQorCQlwdXRfcnBjY3JlZChjcmVkKTsKKwlCVUdfT04oYXRvbWljX3JlYWQoJm5mc2ktPmRhdGFfdXBkYXRlcykgIT0gMCk7Cit9CisKK3ZvaWQKK25mc191bW91bnRfYmVnaW4oc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NCKHNiKTsKKwlzdHJ1Y3QgcnBjX2NsbnQJKnJwYzsKKworCS8qIC1FSU8gYWxsIHBlbmRpbmcgSS9PICovCisJaWYgKChycGMgPSBzZXJ2ZXItPmNsaWVudCkgIT0gTlVMTCkKKwkJcnBjX2tpbGxhbGxfdGFza3MocnBjKTsKK30KKworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK25mc19ibG9ja19iaXRzKHVuc2lnbmVkIGxvbmcgYnNpemUsIHVuc2lnbmVkIGNoYXIgKm5yYml0c3ApCit7CisJLyogbWFrZSBzdXJlIGJsb2Nrc2l6ZSBpcyBhIHBvd2VyIG9mIHR3byAqLworCWlmICgoYnNpemUgJiAoYnNpemUgLSAxKSkgfHwgbnJiaXRzcCkgeworCQl1bnNpZ25lZCBjaGFyCW5yYml0czsKKworCQlmb3IgKG5yYml0cyA9IDMxOyBucmJpdHMgJiYgIShic2l6ZSAmICgxIDw8IG5yYml0cykpOyBucmJpdHMtLSkKKwkJCTsKKwkJYnNpemUgPSAxIDw8IG5yYml0czsKKwkJaWYgKG5yYml0c3ApCisJCQkqbnJiaXRzcCA9IG5yYml0czsKKwl9CisKKwlyZXR1cm4gYnNpemU7Cit9CisKKy8qCisgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiA1MTJieXRlIGJsb2NrcyB1c2VkLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK25mc19jYWxjX2Jsb2NrX3NpemUodTY0IHRzaXplKQoreworCWxvZmZfdCB1c2VkID0gKHRzaXplICsgNTExKSA+PiA5OworCXJldHVybiAodXNlZCA+IFVMT05HX01BWCkgPyBVTE9OR19NQVggOiB1c2VkOworfQorCisvKgorICogQ29tcHV0ZSBhbmQgc2V0IE5GUyBzZXJ2ZXIgYmxvY2tzaXplCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworbmZzX2Jsb2NrX3NpemUodW5zaWduZWQgbG9uZyBic2l6ZSwgdW5zaWduZWQgY2hhciAqbnJiaXRzcCkKK3sKKwlpZiAoYnNpemUgPCAxMDI0KQorCQlic2l6ZSA9IE5GU19ERUZfRklMRV9JT19CVUZGRVJfU0laRTsKKwllbHNlIGlmIChic2l6ZSA+PSBORlNfTUFYX0ZJTEVfSU9fQlVGRkVSX1NJWkUpCisJCWJzaXplID0gTkZTX01BWF9GSUxFX0lPX0JVRkZFUl9TSVpFOworCisJcmV0dXJuIG5mc19ibG9ja19iaXRzKGJzaXplLCBucmJpdHNwKTsKK30KKworLyoKKyAqIE9idGFpbiB0aGUgcm9vdCBpbm9kZSBvZiB0aGUgZmlsZSBzeXN0ZW0uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKgorbmZzX2dldF9yb290KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBuZnNfZmggKnJvb3RmaCwgc3RydWN0IG5mc19mc2luZm8gKmZzaW5mbykKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlcgkqc2VydmVyID0gTkZTX1NCKHNiKTsKKwlzdHJ1Y3QgaW5vZGUgKnJvb3RpOworCWludAkJCWVycm9yOworCisJZXJyb3IgPSBzZXJ2ZXItPnJwY19vcHMtPmdldHJvb3Qoc2VydmVyLCByb290ZmgsIGZzaW5mbyk7CisJaWYgKGVycm9yIDwgMCkgeworCQlkcHJpbnRrKCJuZnNfZ2V0X3Jvb3Q6IGdldGF0dHIgZXJyb3IgPSAlZFxuIiwgLWVycm9yKTsKKwkJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOworCX0KKworCXJvb3RpID0gbmZzX2ZoZ2V0KHNiLCByb290ZmgsIGZzaW5mby0+ZmF0dHIpOworCWlmICghcm9vdGkpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCXJldHVybiByb290aTsKK30KKworLyoKKyAqIERvIE5GUyB2ZXJzaW9uLWluZGVwZW5kZW50IG1vdW50IHByb2Nlc3NpbmcsIGFuZCBzYW5pdHkgY2hlY2tpbmcKKyAqLworc3RhdGljIGludAorbmZzX3NiX2luaXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgcnBjX2F1dGhmbGF2b3JfdCBhdXRoZmxhdm9yKQoreworCXN0cnVjdCBuZnNfc2VydmVyCSpzZXJ2ZXI7CisJc3RydWN0IGlub2RlCQkqcm9vdF9pbm9kZTsKKwlzdHJ1Y3QgbmZzX2ZhdHRyCWZhdHRyOworCXN0cnVjdCBuZnNfZnNpbmZvCWZzaW5mbyA9IHsKKwkJCQkJLmZhdHRyID0gJmZhdHRyLAorCQkJCX07CisJc3RydWN0IG5mc19wYXRoY29uZiBwYXRoaW5mbyA9IHsKKwkJCS5mYXR0ciA9ICZmYXR0ciwKKwl9OworCWludCBub19yb290X2Vycm9yID0gMDsKKwl1bnNpZ25lZCBsb25nIG1heF9ycGNfcGF5bG9hZDsKKworCS8qIFdlIHByb2JhYmx5IHdhbnQgc29tZXRoaW5nIG1vcmUgaW5mb3JtYXRpdmUgaGVyZSAqLworCXNucHJpbnRmKHNiLT5zX2lkLCBzaXplb2Yoc2ItPnNfaWQpLCAiJXg6JXgiLCBNQUpPUihzYi0+c19kZXYpLCBNSU5PUihzYi0+c19kZXYpKTsKKworCXNlcnZlciA9IE5GU19TQihzYik7CisKKwlzYi0+c19tYWdpYyAgICAgID0gTkZTX1NVUEVSX01BR0lDOworCisJcm9vdF9pbm9kZSA9IG5mc19nZXRfcm9vdChzYiwgJnNlcnZlci0+ZmgsICZmc2luZm8pOworCS8qIERpZCBnZXR0aW5nIHRoZSByb290IGlub2RlIGZhaWw/ICovCisJaWYgKElTX0VSUihyb290X2lub2RlKSkgeworCQlub19yb290X2Vycm9yID0gUFRSX0VSUihyb290X2lub2RlKTsKKwkJZ290byBvdXRfbm9fcm9vdDsKKwl9CisJc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290X2lub2RlKTsKKwlpZiAoIXNiLT5zX3Jvb3QpIHsKKwkJbm9fcm9vdF9lcnJvciA9IC1FTk9NRU07CisJCWdvdG8gb3V0X25vX3Jvb3Q7CisJfQorCXNiLT5zX3Jvb3QtPmRfb3AgPSBzZXJ2ZXItPnJwY19vcHMtPmRlbnRyeV9vcHM7CisKKwkvKiBHZXQgc29tZSBnZW5lcmFsIGZpbGUgc3lzdGVtIGluZm8gKi8KKwlpZiAoc2VydmVyLT5uYW1lbGVuID09IDAgJiYKKwkgICAgc2VydmVyLT5ycGNfb3BzLT5wYXRoY29uZihzZXJ2ZXIsICZzZXJ2ZXItPmZoLCAmcGF0aGluZm8pID49IDApCisJCXNlcnZlci0+bmFtZWxlbiA9IHBhdGhpbmZvLm1heF9uYW1lbGVuOworCS8qIFdvcmsgb3V0IGEgbG90IG9mIHBhcmFtZXRlcnMgKi8KKwlpZiAoc2VydmVyLT5yc2l6ZSA9PSAwKQorCQlzZXJ2ZXItPnJzaXplID0gbmZzX2Jsb2NrX3NpemUoZnNpbmZvLnJ0cHJlZiwgTlVMTCk7CisJaWYgKHNlcnZlci0+d3NpemUgPT0gMCkKKwkJc2VydmVyLT53c2l6ZSA9IG5mc19ibG9ja19zaXplKGZzaW5mby53dHByZWYsIE5VTEwpOworCisJaWYgKGZzaW5mby5ydG1heCA+PSA1MTIgJiYgc2VydmVyLT5yc2l6ZSA+IGZzaW5mby5ydG1heCkKKwkJc2VydmVyLT5yc2l6ZSA9IG5mc19ibG9ja19zaXplKGZzaW5mby5ydG1heCwgTlVMTCk7CisJaWYgKGZzaW5mby53dG1heCA+PSA1MTIgJiYgc2VydmVyLT53c2l6ZSA+IGZzaW5mby53dG1heCkKKwkJc2VydmVyLT53c2l6ZSA9IG5mc19ibG9ja19zaXplKGZzaW5mby53dG1heCwgTlVMTCk7CisKKwltYXhfcnBjX3BheWxvYWQgPSBuZnNfYmxvY2tfc2l6ZShycGNfbWF4X3BheWxvYWQoc2VydmVyLT5jbGllbnQpLCBOVUxMKTsKKwlpZiAoc2VydmVyLT5yc2l6ZSA+IG1heF9ycGNfcGF5bG9hZCkKKwkJc2VydmVyLT5yc2l6ZSA9IG1heF9ycGNfcGF5bG9hZDsKKwlpZiAoc2VydmVyLT53c2l6ZSA+IG1heF9ycGNfcGF5bG9hZCkKKwkJc2VydmVyLT53c2l6ZSA9IG1heF9ycGNfcGF5bG9hZDsKKworCXNlcnZlci0+cnBhZ2VzID0gKHNlcnZlci0+cnNpemUgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCWlmIChzZXJ2ZXItPnJwYWdlcyA+IE5GU19SRUFEX01BWElPVikgeworCQlzZXJ2ZXItPnJwYWdlcyA9IE5GU19SRUFEX01BWElPVjsKKwkJc2VydmVyLT5yc2l6ZSA9IHNlcnZlci0+cnBhZ2VzIDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisJfQorCisJc2VydmVyLT53cGFnZXMgPSAoc2VydmVyLT53c2l6ZSArIFBBR0VfQ0FDSEVfU0laRSAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisgICAgICAgIGlmIChzZXJ2ZXItPndwYWdlcyA+IE5GU19XUklURV9NQVhJT1YpIHsKKwkJc2VydmVyLT53cGFnZXMgPSBORlNfV1JJVEVfTUFYSU9WOworICAgICAgICAgICAgICAgIHNlcnZlci0+d3NpemUgPSBzZXJ2ZXItPndwYWdlcyA8PCBQQUdFX0NBQ0hFX1NISUZUOworCX0KKworCWlmIChzYi0+c19ibG9ja3NpemUgPT0gMCkKKwkJc2ItPnNfYmxvY2tzaXplID0gbmZzX2Jsb2NrX2JpdHMoc2VydmVyLT53c2l6ZSwKKwkJCQkJCQkgJnNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwlzZXJ2ZXItPnd0bXVsdCA9IG5mc19ibG9ja19iaXRzKGZzaW5mby53dG11bHQsIE5VTEwpOworCisJc2VydmVyLT5kdHNpemUgPSBuZnNfYmxvY2tfc2l6ZShmc2luZm8uZHRwcmVmLCBOVUxMKTsKKwlpZiAoc2VydmVyLT5kdHNpemUgPiBQQUdFX0NBQ0hFX1NJWkUpCisJCXNlcnZlci0+ZHRzaXplID0gUEFHRV9DQUNIRV9TSVpFOworCWlmIChzZXJ2ZXItPmR0c2l6ZSA+IHNlcnZlci0+cnNpemUpCisJCXNlcnZlci0+ZHRzaXplID0gc2VydmVyLT5yc2l6ZTsKKworCWlmIChzZXJ2ZXItPmZsYWdzICYgTkZTX01PVU5UX05PQUMpIHsKKwkJc2VydmVyLT5hY3JlZ21pbiA9IHNlcnZlci0+YWNyZWdtYXggPSAwOworCQlzZXJ2ZXItPmFjZGlybWluID0gc2VydmVyLT5hY2Rpcm1heCA9IDA7CisJCXNiLT5zX2ZsYWdzIHw9IE1TX1NZTkNIUk9OT1VTOworCX0KKwlzZXJ2ZXItPmJhY2tpbmdfZGV2X2luZm8ucmFfcGFnZXMgPSBzZXJ2ZXItPnJwYWdlcyAqIE5GU19NQVhfUkVBREFIRUFEOworCisJc2ItPnNfbWF4Ynl0ZXMgPSBmc2luZm8ubWF4ZmlsZXNpemU7CisJaWYgKHNiLT5zX21heGJ5dGVzID4gTUFYX0xGU19GSUxFU0laRSkgCisJCXNiLT5zX21heGJ5dGVzID0gTUFYX0xGU19GSUxFU0laRTsgCisKKwlzZXJ2ZXItPmNsaWVudC0+Y2xfaW50ciA9IChzZXJ2ZXItPmZsYWdzICYgTkZTX01PVU5UX0lOVFIpID8gMSA6IDA7CisJc2VydmVyLT5jbGllbnQtPmNsX3NvZnRydHJ5ID0gKHNlcnZlci0+ZmxhZ3MgJiBORlNfTU9VTlRfU09GVCkgPyAxIDogMDsKKworCS8qIFdlJ3JlIGFpcmJvcm5lIFNldCBzb2NrZXQgYnVmZmVyc2l6ZSAqLworCXJwY19zZXRidWZzaXplKHNlcnZlci0+Y2xpZW50LCBzZXJ2ZXItPndzaXplICsgMTAwLCBzZXJ2ZXItPnJzaXplICsgMTAwKTsKKwlyZXR1cm4gMDsKKwkvKiBZYXJncy4gSXQgZGlkbid0IHdvcmsgb3V0LiAqLworb3V0X25vX3Jvb3Q6CisJZHByaW50aygibmZzX3NiX2luaXQ6IGdldCByb290IGlub2RlIGZhaWxlZDogZXJybm8gJWRcbiIsIC1ub19yb290X2Vycm9yKTsKKwlpZiAoIUlTX0VSUihyb290X2lub2RlKSkKKwkJaXB1dChyb290X2lub2RlKTsKKwlyZXR1cm4gbm9fcm9vdF9lcnJvcjsKK30KKworLyoKKyAqIENyZWF0ZSBhbiBSUEMgY2xpZW50IGhhbmRsZS4KKyAqLworc3RhdGljIHN0cnVjdCBycGNfY2xudCAqCituZnNfY3JlYXRlX2NsaWVudChzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBjb25zdCBzdHJ1Y3QgbmZzX21vdW50X2RhdGEgKmRhdGEpCit7CisJc3RydWN0IHJwY190aW1lb3V0CXRpbWVwYXJtczsKKwlzdHJ1Y3QgcnBjX3hwcnQJCSp4cHJ0ID0gTlVMTDsKKwlzdHJ1Y3QgcnBjX2NsbnQJCSpjbG50ID0gTlVMTDsKKwlpbnQJCQl0Y3AgICA9IChkYXRhLT5mbGFncyAmIE5GU19NT1VOVF9UQ1ApOworCisJLyogSW5pdGlhbGl6ZSB0aW1lb3V0IHZhbHVlcyAqLworCXRpbWVwYXJtcy50b19pbml0dmFsID0gZGF0YS0+dGltZW8gKiBIWiAvIDEwOworCXRpbWVwYXJtcy50b19yZXRyaWVzID0gZGF0YS0+cmV0cmFuczsKKwl0aW1lcGFybXMudG9fbWF4dmFsICA9IHRjcCA/IFJQQ19NQVhfVENQX1RJTUVPVVQgOiBSUENfTUFYX1VEUF9USU1FT1VUOworCXRpbWVwYXJtcy50b19leHBvbmVudGlhbCA9IDE7CisKKwlpZiAoIXRpbWVwYXJtcy50b19pbml0dmFsKQorCQl0aW1lcGFybXMudG9faW5pdHZhbCA9ICh0Y3AgPyA2MDAgOiAxMSkgKiBIWiAvIDEwOworCWlmICghdGltZXBhcm1zLnRvX3JldHJpZXMpCisJCXRpbWVwYXJtcy50b19yZXRyaWVzID0gNTsKKworCS8qIGNyZWF0ZSB0cmFuc3BvcnQgYW5kIGNsaWVudCAqLworCXhwcnQgPSB4cHJ0X2NyZWF0ZV9wcm90byh0Y3AgPyBJUFBST1RPX1RDUCA6IElQUFJPVE9fVURQLAorCQkJCSAmc2VydmVyLT5hZGRyLCAmdGltZXBhcm1zKTsKKwlpZiAoSVNfRVJSKHhwcnQpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5GUzogY2Fubm90IGNyZWF0ZSBSUEMgdHJhbnNwb3J0LlxuIik7CisJCXJldHVybiAoc3RydWN0IHJwY19jbG50ICopeHBydDsKKwl9CisJY2xudCA9IHJwY19jcmVhdGVfY2xpZW50KHhwcnQsIHNlcnZlci0+aG9zdG5hbWUsICZuZnNfcHJvZ3JhbSwKKwkJCQkgc2VydmVyLT5ycGNfb3BzLT52ZXJzaW9uLCBkYXRhLT5wc2V1ZG9mbGF2b3IpOworCWlmIChJU19FUlIoY2xudCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTkZTOiBjYW5ub3QgY3JlYXRlIFJQQyBjbGllbnQuXG4iKTsKKwkJZ290byBvdXRfZmFpbDsKKwl9CisKKwljbG50LT5jbF9pbnRyICAgICA9IDE7CisJY2xudC0+Y2xfc29mdHJ0cnkgPSAxOworCWNsbnQtPmNsX2NoYXR0eSAgID0gMTsKKworCXJldHVybiBjbG50OworCitvdXRfZmFpbDoKKwl4cHJ0X2Rlc3Ryb3koeHBydCk7CisJcmV0dXJuIGNsbnQ7Cit9CisKKy8qCisgKiBUaGUgd2F5IHRoaXMgd29ya3MgaXMgdGhhdCB0aGUgbW91bnQgcHJvY2VzcyBwYXNzZXMgYSBzdHJ1Y3R1cmUKKyAqIGluIHRoZSBkYXRhIGFyZ3VtZW50IHdoaWNoIGNvbnRhaW5zIHRoZSBzZXJ2ZXIncyBJUCBhZGRyZXNzCisgKiBhbmQgdGhlIHJvb3QgZmlsZSBoYW5kbGUgb2J0YWluZWQgZnJvbSB0aGUgc2VydmVyJ3MgbW91bnQKKyAqIGRhZW1vbi4gV2Ugc3Rhc2ggdGhlc2UgYXdheSBpbiB0aGUgcHJpdmF0ZSBzdXBlcmJsb2NrIGZpZWxkcy4KKyAqLworc3RhdGljIGludAorbmZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IG5mc19tb3VudF9kYXRhICpkYXRhLCBpbnQgc2lsZW50KQoreworCXN0cnVjdCBuZnNfc2VydmVyCSpzZXJ2ZXI7CisJcnBjX2F1dGhmbGF2b3JfdAlhdXRoZmxhdm9yOworCisJc2VydmVyICAgICAgICAgICA9IE5GU19TQihzYik7CisJc2ItPnNfYmxvY2tzaXplX2JpdHMgPSAwOworCXNiLT5zX2Jsb2Nrc2l6ZSA9IDA7CisJaWYgKGRhdGEtPmJzaXplKQorCQlzYi0+c19ibG9ja3NpemUgPSBuZnNfYmxvY2tfc2l6ZShkYXRhLT5ic2l6ZSwgJnNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwlpZiAoZGF0YS0+cnNpemUpCisJCXNlcnZlci0+cnNpemUgPSBuZnNfYmxvY2tfc2l6ZShkYXRhLT5yc2l6ZSwgTlVMTCk7CisJaWYgKGRhdGEtPndzaXplKQorCQlzZXJ2ZXItPndzaXplID0gbmZzX2Jsb2NrX3NpemUoZGF0YS0+d3NpemUsIE5VTEwpOworCXNlcnZlci0+ZmxhZ3MgICAgPSBkYXRhLT5mbGFncyAmIE5GU19NT1VOVF9GTEFHTUFTSzsKKworCXNlcnZlci0+YWNyZWdtaW4gPSBkYXRhLT5hY3JlZ21pbipIWjsKKwlzZXJ2ZXItPmFjcmVnbWF4ID0gZGF0YS0+YWNyZWdtYXgqSFo7CisJc2VydmVyLT5hY2Rpcm1pbiA9IGRhdGEtPmFjZGlybWluKkhaOworCXNlcnZlci0+YWNkaXJtYXggPSBkYXRhLT5hY2Rpcm1heCpIWjsKKworCS8qIFN0YXJ0IGxvY2tkIGhlcmUsIGJlZm9yZSB3ZSBtaWdodCBlcnJvciBvdXQgKi8KKwlpZiAoIShzZXJ2ZXItPmZsYWdzICYgTkZTX01PVU5UX05PTkxNKSkKKwkJbG9ja2RfdXAoKTsKKworCXNlcnZlci0+bmFtZWxlbiAgPSBkYXRhLT5uYW1sZW47CisJc2VydmVyLT5ob3N0bmFtZSA9IGttYWxsb2Moc3RybGVuKGRhdGEtPmhvc3RuYW1lKSArIDEsIEdGUF9LRVJORUwpOworCWlmICghc2VydmVyLT5ob3N0bmFtZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJc3RyY3B5KHNlcnZlci0+aG9zdG5hbWUsIGRhdGEtPmhvc3RuYW1lKTsKKworCS8qIENoZWNrIE5GUyBwcm90b2NvbCByZXZpc2lvbiBhbmQgaW5pdGlhbGl6ZSBSUEMgb3AgdmVjdG9yCisJICogYW5kIGZpbGUgaGFuZGxlIHBvb2wuICovCisJaWYgKHNlcnZlci0+ZmxhZ3MgJiBORlNfTU9VTlRfVkVSMykgeworI2lmZGVmIENPTkZJR19ORlNfVjMKKwkJc2VydmVyLT5ycGNfb3BzID0gJm5mc192M19jbGllbnRvcHM7CisJCXNlcnZlci0+Y2FwcyB8PSBORlNfQ0FQX1JFQURESVJQTFVTOworCQlpZiAoZGF0YS0+dmVyc2lvbiA8IDQpIHsKKwkJCXByaW50ayhLRVJOX05PVElDRSAiTkZTOiBORlN2MyBub3Qgc3VwcG9ydGVkIGJ5IG1vdW50IHByb2dyYW0uXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisjZWxzZQorCQlwcmludGsoS0VSTl9OT1RJQ0UgIk5GUzogTkZTdjMgbm90IHN1cHBvcnRlZC5cbiIpOworCQlyZXR1cm4gLUVJTzsKKyNlbmRpZgorCX0gZWxzZSB7CisJCXNlcnZlci0+cnBjX29wcyA9ICZuZnNfdjJfY2xpZW50b3BzOworCX0KKworCS8qIEZpbGwgaW4gcHNldWRvZmxhdm9yIGZvciBtb3VudCB2ZXJzaW9uIDwgNSAqLworCWlmICghKGRhdGEtPmZsYWdzICYgTkZTX01PVU5UX1NFQ0ZMQVZPVVIpKQorCQlkYXRhLT5wc2V1ZG9mbGF2b3IgPSBSUENfQVVUSF9VTklYOworCWF1dGhmbGF2b3IgPSBkYXRhLT5wc2V1ZG9mbGF2b3I7CS8qIHNhdmUgZm9yIHNiX2luaXQoKSAqLworCS8qIFhYWCBtYXliZSB3ZSB3YW50IHRvIGFkZCBhIHNlcnZlci0+cHNldWRvZmxhdm9yIGZpZWxkICovCisKKwkvKiBDcmVhdGUgUlBDIGNsaWVudCBoYW5kbGVzICovCisJc2VydmVyLT5jbGllbnQgPSBuZnNfY3JlYXRlX2NsaWVudChzZXJ2ZXIsIGRhdGEpOworCWlmIChJU19FUlIoc2VydmVyLT5jbGllbnQpKQorCQlyZXR1cm4gUFRSX0VSUihzZXJ2ZXItPmNsaWVudCk7CisJLyogUkZDIDI2MjMsIHNlYyAyLjMuMiAqLworCWlmIChhdXRoZmxhdm9yICE9IFJQQ19BVVRIX1VOSVgpIHsKKwkJc2VydmVyLT5jbGllbnRfc3lzID0gcnBjX2Nsb25lX2NsaWVudChzZXJ2ZXItPmNsaWVudCk7CisJCWlmIChJU19FUlIoc2VydmVyLT5jbGllbnRfc3lzKSkKKwkJCXJldHVybiBQVFJfRVJSKHNlcnZlci0+Y2xpZW50X3N5cyk7CisJCWlmICghcnBjYXV0aF9jcmVhdGUoUlBDX0FVVEhfVU5JWCwgc2VydmVyLT5jbGllbnRfc3lzKSkKKwkJCXJldHVybiAtRU5PTUVNOworCX0gZWxzZSB7CisJCWF0b21pY19pbmMoJnNlcnZlci0+Y2xpZW50LT5jbF9jb3VudCk7CisJCXNlcnZlci0+Y2xpZW50X3N5cyA9IHNlcnZlci0+Y2xpZW50OworCX0KKworCWlmIChzZXJ2ZXItPmZsYWdzICYgTkZTX01PVU5UX1ZFUjMpIHsKKwkJaWYgKHNlcnZlci0+bmFtZWxlbiA9PSAwIHx8IHNlcnZlci0+bmFtZWxlbiA+IE5GUzNfTUFYTkFNTEVOKQorCQkJc2VydmVyLT5uYW1lbGVuID0gTkZTM19NQVhOQU1MRU47CisJCXNiLT5zX3RpbWVfZ3JhbiA9IDE7CisJfSBlbHNlIHsKKwkJaWYgKHNlcnZlci0+bmFtZWxlbiA9PSAwIHx8IHNlcnZlci0+bmFtZWxlbiA+IE5GUzJfTUFYTkFNTEVOKQorCQkJc2VydmVyLT5uYW1lbGVuID0gTkZTMl9NQVhOQU1MRU47CisJfQorCisJc2ItPnNfb3AgPSAmbmZzX3NvcHM7CisJcmV0dXJuIG5mc19zYl9pbml0KHNiLCBhdXRoZmxhdm9yKTsKK30KKworc3RhdGljIGludAorbmZzX3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQoreworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0Ioc2IpOworCXVuc2lnbmVkIGNoYXIgYmxvY2tiaXRzOworCXVuc2lnbmVkIGxvbmcgYmxvY2tyZXM7CisJc3RydWN0IG5mc19maCAqcm9vdGZoID0gTkZTX0ZIKHNiLT5zX3Jvb3QtPmRfaW5vZGUpOworCXN0cnVjdCBuZnNfZmF0dHIgZmF0dHI7CisJc3RydWN0IG5mc19mc3N0YXQgcmVzID0geworCQkJLmZhdHRyID0gJmZhdHRyLAorCX07CisJaW50IGVycm9yOworCisJbG9ja19rZXJuZWwoKTsKKworCWVycm9yID0gc2VydmVyLT5ycGNfb3BzLT5zdGF0ZnMoc2VydmVyLCByb290ZmgsICZyZXMpOworCWJ1Zi0+Zl90eXBlID0gTkZTX1NVUEVSX01BR0lDOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0X2VycjsKKworCS8qCisJICogQ3VycmVudCB2ZXJzaW9ucyBvZiBnbGliYyBkbyBub3QgY29ycmVjdGx5IGhhbmRsZSB0aGUKKwkgKiBjYXNlIHdoZXJlIGZfZnJzaXplICE9IGZfYnNpemUuICBFdmVudHVhbGx5IHdlIHdhbnQgdG8KKwkgKiByZXBvcnQgdGhlIHZhbHVlIG9mIHd0bXVsdCBpbiB0aGlzIGZpZWxkLgorCSAqLworCWJ1Zi0+Zl9mcnNpemUgPSBzYi0+c19ibG9ja3NpemU7CisKKwkvKgorCSAqIE9uIG1vc3QgKm5peCBzeXN0ZW1zLCBmX2Jsb2NrcywgZl9iZnJlZSwgYW5kIGZfYmF2YWlsCisJICogYXJlIHJlcG9ydGVkIGluIHVuaXRzIG9mIGZfZnJzaXplLiAgTGludXggaGFzbid0IGhhZAorCSAqIGFuIGZfZnJzaXplIGZpZWxkIGluIGl0cyBzdGF0ZnMgc3RydWN0IHVudGlsIHJlY2VudGx5LAorCSAqIHRodXMgaGlzdG9yaWNhbGx5IExpbnV4J3Mgc3lzX3N0YXRmcyByZXBvcnRzIHRoZXNlCisJICogZmllbGRzIGluIHVuaXRzIG9mIGZfYnNpemUuCisJICovCisJYnVmLT5mX2JzaXplID0gc2ItPnNfYmxvY2tzaXplOworCWJsb2NrYml0cyA9IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCWJsb2NrcmVzID0gKDEgPDwgYmxvY2tiaXRzKSAtIDE7CisJYnVmLT5mX2Jsb2NrcyA9IChyZXMudGJ5dGVzICsgYmxvY2tyZXMpID4+IGJsb2NrYml0czsKKwlidWYtPmZfYmZyZWUgPSAocmVzLmZieXRlcyArIGJsb2NrcmVzKSA+PiBibG9ja2JpdHM7CisJYnVmLT5mX2JhdmFpbCA9IChyZXMuYWJ5dGVzICsgYmxvY2tyZXMpID4+IGJsb2NrYml0czsKKworCWJ1Zi0+Zl9maWxlcyA9IHJlcy50ZmlsZXM7CisJYnVmLT5mX2ZmcmVlID0gcmVzLmFmaWxlczsKKworCWJ1Zi0+Zl9uYW1lbGVuID0gc2VydmVyLT5uYW1lbGVuOworIG91dDoKKwl1bmxvY2tfa2VybmVsKCk7CisKKwlyZXR1cm4gMDsKKworIG91dF9lcnI6CisJcHJpbnRrKEtFUk5fV0FSTklORyAibmZzX3N0YXRmczogc3RhdGZzIGVycm9yID0gJWRcbiIsIC1lcnJvcik7CisJYnVmLT5mX2JzaXplID0gYnVmLT5mX2Jsb2NrcyA9IGJ1Zi0+Zl9iZnJlZSA9IGJ1Zi0+Zl9iYXZhaWwgPSAtMTsKKwlnb3RvIG91dDsKKworfQorCitzdGF0aWMgaW50IG5mc19zaG93X29wdGlvbnMoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCkKK3sKKwlzdGF0aWMgc3RydWN0IHByb2NfbmZzX2luZm8geworCQlpbnQgZmxhZzsKKwkJY2hhciAqc3RyOworCQljaGFyICpub3N0cjsKKwl9IG5mc19pbmZvW10gPSB7CisJCXsgTkZTX01PVU5UX1NPRlQsICIsc29mdCIsICIsaGFyZCIgfSwKKwkJeyBORlNfTU9VTlRfSU5UUiwgIixpbnRyIiwgIiIgfSwKKwkJeyBORlNfTU9VTlRfUE9TSVgsICIscG9zaXgiLCAiIiB9LAorCQl7IE5GU19NT1VOVF9UQ1AsICIsdGNwIiwgIix1ZHAiIH0sCisJCXsgTkZTX01PVU5UX05PQ1RPLCAiLG5vY3RvIiwgIiIgfSwKKwkJeyBORlNfTU9VTlRfTk9BQywgIixub2FjIiwgIiIgfSwKKwkJeyBORlNfTU9VTlRfTk9OTE0sICIsbm9sb2NrIiwgIixsb2NrIiB9LAorCQl7IDAsIE5VTEwsIE5VTEwgfQorCX07CisJc3RydWN0IHByb2NfbmZzX2luZm8gKm5mc19pbmZvcDsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqbmZzcyA9IE5GU19TQihtbnQtPm1udF9zYik7CisKKwlzZXFfcHJpbnRmKG0sICIsdiVkIiwgbmZzcy0+cnBjX29wcy0+dmVyc2lvbik7CisJc2VxX3ByaW50ZihtLCAiLHJzaXplPSVkIiwgbmZzcy0+cnNpemUpOworCXNlcV9wcmludGYobSwgIix3c2l6ZT0lZCIsIG5mc3MtPndzaXplKTsKKwlpZiAobmZzcy0+YWNyZWdtaW4gIT0gMypIWikKKwkJc2VxX3ByaW50ZihtLCAiLGFjcmVnbWluPSVkIiwgbmZzcy0+YWNyZWdtaW4vSFopOworCWlmIChuZnNzLT5hY3JlZ21heCAhPSA2MCpIWikKKwkJc2VxX3ByaW50ZihtLCAiLGFjcmVnbWF4PSVkIiwgbmZzcy0+YWNyZWdtYXgvSFopOworCWlmIChuZnNzLT5hY2Rpcm1pbiAhPSAzMCpIWikKKwkJc2VxX3ByaW50ZihtLCAiLGFjZGlybWluPSVkIiwgbmZzcy0+YWNkaXJtaW4vSFopOworCWlmIChuZnNzLT5hY2Rpcm1heCAhPSA2MCpIWikKKwkJc2VxX3ByaW50ZihtLCAiLGFjZGlybWF4PSVkIiwgbmZzcy0+YWNkaXJtYXgvSFopOworCWZvciAobmZzX2luZm9wID0gbmZzX2luZm87IG5mc19pbmZvcC0+ZmxhZzsgbmZzX2luZm9wKyspIHsKKwkJaWYgKG5mc3MtPmZsYWdzICYgbmZzX2luZm9wLT5mbGFnKQorCQkJc2VxX3B1dHMobSwgbmZzX2luZm9wLT5zdHIpOworCQllbHNlCisJCQlzZXFfcHV0cyhtLCBuZnNfaW5mb3AtPm5vc3RyKTsKKwl9CisJc2VxX3B1dHMobSwgIixhZGRyPSIpOworCXNlcV9lc2NhcGUobSwgbmZzcy0+aG9zdG5hbWUsICIgXHRcblxcIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJbnZhbGlkYXRlIHRoZSBsb2NhbCBjYWNoZXMKKyAqLwordm9pZAorbmZzX3phcF9jYWNoZXMoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOworCWludCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKKworCU5GU19BVFRSVElNRU8oaW5vZGUpID0gTkZTX01JTkFUVFJUSU1FTyhpbm9kZSk7CisJTkZTX0FUVFJUSU1FT19VUERBVEUoaW5vZGUpID0gamlmZmllczsKKworCW1lbXNldChORlNfQ09PS0lFVkVSRihpbm9kZSksIDAsIHNpemVvZihORlNfQ09PS0lFVkVSRihpbm9kZSkpKTsKKwlpZiAoU19JU1JFRyhtb2RlKSB8fCBTX0lTRElSKG1vZGUpIHx8IFNfSVNMTksobW9kZSkpCisJCW5mc2ktPmZsYWdzIHw9IE5GU19JTk9fSU5WQUxJRF9BVFRSfE5GU19JTk9fSU5WQUxJRF9EQVRBfE5GU19JTk9fSU5WQUxJRF9BQ0NFU1M7CisJZWxzZQorCQluZnNpLT5mbGFncyB8PSBORlNfSU5PX0lOVkFMSURfQVRUUnxORlNfSU5PX0lOVkFMSURfQUNDRVNTOworfQorCisvKgorICogSW52YWxpZGF0ZSwgYnV0IGRvIG5vdCB1bmhhc2gsIHRoZSBpbm9kZQorICovCitzdGF0aWMgdm9pZAorbmZzX2ludmFsaWRhdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwl1bW9kZV90IHNhdmVfbW9kZSA9IGlub2RlLT5pX21vZGU7CisKKwltYWtlX2JhZF9pbm9kZShpbm9kZSk7CisJaW5vZGUtPmlfbW9kZSA9IHNhdmVfbW9kZTsKKwluZnNfemFwX2NhY2hlcyhpbm9kZSk7Cit9CisKK3N0cnVjdCBuZnNfZmluZF9kZXNjIHsKKwlzdHJ1Y3QgbmZzX2ZoCQkqZmg7CisJc3RydWN0IG5mc19mYXR0cgkqZmF0dHI7Cit9OworCisvKgorICogSW4gTkZTdjMgd2UgY2FuIGhhdmUgNjRiaXQgaW5vZGUgbnVtYmVycy4gSW4gb3JkZXIgdG8gc3VwcG9ydAorICogdGhpcywgYW5kIHJlLWV4cG9ydGVkIGRpcmVjdG9yaWVzIChhbHNvIHNlZW4gaW4gTkZTdjIpCisgKiB3ZSBhcmUgZm9yY2VkIHRvIGFsbG93IDIgZGlmZmVyZW50IGlub2RlcyB0byBoYXZlIHRoZSBzYW1lCisgKiBpX2luby4KKyAqLworc3RhdGljIGludAorbmZzX2ZpbmRfYWN0b3Ioc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqb3BhcXVlKQoreworCXN0cnVjdCBuZnNfZmluZF9kZXNjCSpkZXNjID0gKHN0cnVjdCBuZnNfZmluZF9kZXNjICopb3BhcXVlOworCXN0cnVjdCBuZnNfZmgJCSpmaCA9IGRlc2MtPmZoOworCXN0cnVjdCBuZnNfZmF0dHIJKmZhdHRyID0gZGVzYy0+ZmF0dHI7CisKKwlpZiAoTkZTX0ZJTEVJRChpbm9kZSkgIT0gZmF0dHItPmZpbGVpZCkKKwkJcmV0dXJuIDA7CisJaWYgKG5mc19jb21wYXJlX2ZoKE5GU19GSChpbm9kZSksIGZoKSkKKwkJcmV0dXJuIDA7CisJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkgfHwgTkZTX1NUQUxFKGlub2RlKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK25mc19pbml0X2xvY2tlZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB2b2lkICpvcGFxdWUpCit7CisJc3RydWN0IG5mc19maW5kX2Rlc2MJKmRlc2MgPSAoc3RydWN0IG5mc19maW5kX2Rlc2MgKilvcGFxdWU7CisJc3RydWN0IG5mc19mYXR0cgkqZmF0dHIgPSBkZXNjLT5mYXR0cjsKKworCU5GU19GSUxFSUQoaW5vZGUpID0gZmF0dHItPmZpbGVpZDsKKwluZnNfY29weV9maChORlNfRkgoaW5vZGUpLCBkZXNjLT5maCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIERvbid0IHVzZSBSRUFERElSUExVUyBvbiBkaXJlY3RvcmllcyB0aGF0IHdlIGJlbGlldmUgYXJlIHRvbyBsYXJnZSAqLworI2RlZmluZSBORlNfTElNSVRfUkVBRERJUlBMVVMgKDgqUEFHRV9TSVpFKQorCisvKgorICogVGhpcyBpcyBvdXIgZnJvbnQtZW5kIHRvIGlnZXQgdGhhdCBsb29rcyB1cCBpbm9kZXMgYnkgZmlsZSBoYW5kbGUKKyAqIGluc3RlYWQgb2YgaW5vZGUgbnVtYmVyLgorICovCitzdHJ1Y3QgaW5vZGUgKgorbmZzX2ZoZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBuZnNfZmggKmZoLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK3sKKwlzdHJ1Y3QgbmZzX2ZpbmRfZGVzYyBkZXNjID0geworCQkuZmgJPSBmaCwKKwkJLmZhdHRyCT0gZmF0dHIKKwl9OworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgaGFzaDsKKworCWlmICgoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFIpID09IDApCisJCWdvdG8gb3V0X25vX2lub2RlOworCisJaWYgKCFmYXR0ci0+bmxpbmspIHsKKwkJcHJpbnRrKCJORlM6IEJ1Z2d5IHNlcnZlciAtIG5saW5rID09IDAhXG4iKTsKKwkJZ290byBvdXRfbm9faW5vZGU7CisJfQorCisJaGFzaCA9IG5mc19mYXR0cl90b19pbm9fdChmYXR0cik7CisKKwlpZiAoIShpbm9kZSA9IGlnZXQ1X2xvY2tlZChzYiwgaGFzaCwgbmZzX2ZpbmRfYWN0b3IsIG5mc19pbml0X2xvY2tlZCwgJmRlc2MpKSkKKwkJZ290byBvdXRfbm9faW5vZGU7CisKKwlpZiAoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykgeworCQlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOworCisJCS8qIFdlIHNldCBpX2lubyBmb3IgdGhlIGZldyB0aGluZ3MgdGhhdCBzdGlsbCByZWx5IG9uIGl0LAorCQkgKiBzdWNoIGFzIHN0YXQoMikgKi8KKwkJaW5vZGUtPmlfaW5vID0gaGFzaDsKKworCQkvKiBXZSBjYW4ndCBzdXBwb3J0IHVwZGF0ZV9hdGltZSgpLCBzaW5jZSB0aGUgc2VydmVyIHdpbGwgcmVzZXQgaXQgKi8KKwkJaW5vZGUtPmlfZmxhZ3MgfD0gU19OT0FUSU1FfFNfTk9DTVRJTUU7CisJCWlub2RlLT5pX21vZGUgPSBmYXR0ci0+bW9kZTsKKwkJLyogV2h5IHNvPyBCZWNhdXNlIHdlIHdhbnQgcmV2YWxpZGF0ZSBmb3IgZGV2aWNlcy9GSUZPcywgYW5kCisJCSAqIHRoYXQncyBwcmVjaXNlbHkgd2hhdCB3ZSBoYXZlIGluIG5mc19maWxlX2lub2RlX29wZXJhdGlvbnMuCisJCSAqLworCQlpbm9kZS0+aV9vcCA9ICZuZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCQlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgeworCQkJaW5vZGUtPmlfZm9wID0gJm5mc19maWxlX29wZXJhdGlvbnM7CisJCQlpbm9kZS0+aV9kYXRhLmFfb3BzID0gJm5mc19maWxlX2FvcHM7CisJCQlpbm9kZS0+aV9kYXRhLmJhY2tpbmdfZGV2X2luZm8gPSAmTkZTX1NCKHNiKS0+YmFja2luZ19kZXZfaW5mbzsKKwkJfSBlbHNlIGlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCQlpbm9kZS0+aV9vcCA9IE5GU19TQihzYiktPnJwY19vcHMtPmRpcl9pbm9kZV9vcHM7CisJCQlpbm9kZS0+aV9mb3AgPSAmbmZzX2Rpcl9vcGVyYXRpb25zOworCQkJaWYgKG5mc19zZXJ2ZXJfY2FwYWJsZShpbm9kZSwgTkZTX0NBUF9SRUFERElSUExVUykKKwkJCSAgICAmJiBmYXR0ci0+c2l6ZSA8PSBORlNfTElNSVRfUkVBRERJUlBMVVMpCisJCQkJTkZTX0ZMQUdTKGlub2RlKSB8PSBORlNfSU5PX0FEVklTRV9SRFBMVVM7CisJCX0gZWxzZSBpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKKwkJCWlub2RlLT5pX29wID0gJm5mc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJCWVsc2UKKwkJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwgZmF0dHItPnJkZXYpOworCisJCW5mc2ktPnJlYWRfY2FjaGVfamlmZmllcyA9IGZhdHRyLT50aW1lc3RhbXA7CisJCWlub2RlLT5pX2F0aW1lID0gZmF0dHItPmF0aW1lOworCQlpbm9kZS0+aV9tdGltZSA9IGZhdHRyLT5tdGltZTsKKwkJaW5vZGUtPmlfY3RpbWUgPSBmYXR0ci0+Y3RpbWU7CisJCWlmIChmYXR0ci0+dmFsaWQgJiBORlNfQVRUUl9GQVRUUl9WNCkKKwkJCW5mc2ktPmNoYW5nZV9hdHRyID0gZmF0dHItPmNoYW5nZV9hdHRyOworCQlpbm9kZS0+aV9zaXplID0gbmZzX3NpemVfdG9fbG9mZl90KGZhdHRyLT5zaXplKTsKKwkJaW5vZGUtPmlfbmxpbmsgPSBmYXR0ci0+bmxpbms7CisJCWlub2RlLT5pX3VpZCA9IGZhdHRyLT51aWQ7CisJCWlub2RlLT5pX2dpZCA9IGZhdHRyLT5naWQ7CisJCWlmIChmYXR0ci0+dmFsaWQgJiAoTkZTX0FUVFJfRkFUVFJfVjMgfCBORlNfQVRUUl9GQVRUUl9WNCkpIHsKKwkJCS8qCisJCQkgKiByZXBvcnQgdGhlIGJsb2NrcyBpbiA1MTJieXRlIHVuaXRzCisJCQkgKi8KKwkJCWlub2RlLT5pX2Jsb2NrcyA9IG5mc19jYWxjX2Jsb2NrX3NpemUoZmF0dHItPmR1Lm5mczMudXNlZCk7CisJCQlpbm9kZS0+aV9ibGtzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCQl9IGVsc2UgeworCQkJaW5vZGUtPmlfYmxvY2tzID0gZmF0dHItPmR1Lm5mczIuYmxvY2tzOworCQkJaW5vZGUtPmlfYmxrc2l6ZSA9IGZhdHRyLT5kdS5uZnMyLmJsb2Nrc2l6ZTsKKwkJfQorCQluZnNpLT5hdHRydGltZW8gPSBORlNfTUlOQVRUUlRJTUVPKGlub2RlKTsKKwkJbmZzaS0+YXR0cnRpbWVvX3RpbWVzdGFtcCA9IGppZmZpZXM7CisJCW1lbXNldChuZnNpLT5jb29raWV2ZXJmLCAwLCBzaXplb2YobmZzaS0+Y29va2lldmVyZikpOworCQluZnNpLT5jYWNoZV9hY2Nlc3MuY3JlZCA9IE5VTEw7CisKKwkJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CisJfSBlbHNlCisJCW5mc19yZWZyZXNoX2lub2RlKGlub2RlLCBmYXR0cik7CisJZHByaW50aygiTkZTOiBuZnNfZmhnZXQoJXMvJUxkIGN0PSVkKVxuIiwKKwkJaW5vZGUtPmlfc2ItPnNfaWQsCisJCShsb25nIGxvbmcpTkZTX0ZJTEVJRChpbm9kZSksCisJCWF0b21pY19yZWFkKCZpbm9kZS0+aV9jb3VudCkpOworCitvdXQ6CisJcmV0dXJuIGlub2RlOworCitvdXRfbm9faW5vZGU6CisJcHJpbnRrKCJuZnNfZmhnZXQ6IGlnZXQgZmFpbGVkXG4iKTsKKwlnb3RvIG91dDsKK30KKworI2RlZmluZSBORlNfVkFMSURfQVRUUlMgKEFUVFJfTU9ERXxBVFRSX1VJRHxBVFRSX0dJRHxBVFRSX1NJWkV8QVRUUl9BVElNRXxBVFRSX0FUSU1FX1NFVHxBVFRSX01USU1FfEFUVFJfTVRJTUVfU0VUKQorCitpbnQKK25mc19zZXRhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICphdHRyKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IG5mc19mYXR0ciBmYXR0cjsKKwlpbnQgZXJyb3I7CisKKwlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpIHsKKwkJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpIHx8IGF0dHItPmlhX3NpemUgPT0gaV9zaXplX3JlYWQoaW5vZGUpKQorCQkJYXR0ci0+aWFfdmFsaWQgJj0gfkFUVFJfU0laRTsKKwl9CisKKwkvKiBPcHRpbWl6YXRpb246IGlmIHRoZSBlbmQgcmVzdWx0IGlzIG5vIGNoYW5nZSwgZG9uJ3QgUlBDICovCisJYXR0ci0+aWFfdmFsaWQgJj0gTkZTX1ZBTElEX0FUVFJTOworCWlmIChhdHRyLT5pYV92YWxpZCA9PSAwKQorCQlyZXR1cm4gMDsKKworCWxvY2tfa2VybmVsKCk7CisJbmZzX2JlZ2luX2RhdGFfdXBkYXRlKGlub2RlKTsKKwkvKiBXcml0ZSBhbGwgZGlydHkgZGF0YSBpZiB3ZSdyZSBjaGFuZ2luZyBmaWxlIHBlcm1pc3Npb25zIG9yIHNpemUgKi8KKwlpZiAoKGF0dHItPmlhX3ZhbGlkICYgKEFUVFJfTU9ERXxBVFRSX1VJRHxBVFRSX0dJRHxBVFRSX1NJWkUpKSAhPSAwKSB7CisJCWlmIChmaWxlbWFwX2ZkYXRhd3JpdGUoaW5vZGUtPmlfbWFwcGluZykgPT0gMCkKKwkJCWZpbGVtYXBfZmRhdGF3YWl0KGlub2RlLT5pX21hcHBpbmcpOworCQluZnNfd2JfYWxsKGlub2RlKTsKKwl9CisJZXJyb3IgPSBORlNfUFJPVE8oaW5vZGUpLT5zZXRhdHRyKGRlbnRyeSwgJmZhdHRyLCBhdHRyKTsKKwlpZiAoZXJyb3IgPT0gMCkgeworCQluZnNfcmVmcmVzaF9pbm9kZShpbm9kZSwgJmZhdHRyKTsKKwkJaWYgKChhdHRyLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkgIT0gMCkgeworCQkJaW50IG1vZGU7CisJCQltb2RlID0gaW5vZGUtPmlfbW9kZSAmIH5TX0lBTExVR087CisJCQltb2RlIHw9IGF0dHItPmlhX21vZGUgJiBTX0lBTExVR087CisJCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKKwkJfQorCQlpZiAoKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9VSUQpICE9IDApCisJCQlpbm9kZS0+aV91aWQgPSBhdHRyLT5pYV91aWQ7CisJCWlmICgoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0dJRCkgIT0gMCkKKwkJCWlub2RlLT5pX2dpZCA9IGF0dHItPmlhX2dpZDsKKwkJaWYgKChhdHRyLT5pYV92YWxpZCAmIEFUVFJfU0laRSkgIT0gMCkgeworCQkJaW5vZGUtPmlfc2l6ZSA9IGF0dHItPmlhX3NpemU7CisJCQl2bXRydW5jYXRlKGlub2RlLCBhdHRyLT5pYV9zaXplKTsKKwkJfQorCX0KKwlpZiAoKGF0dHItPmlhX3ZhbGlkICYgKEFUVFJfTU9ERXxBVFRSX1VJRHxBVFRSX0dJRCkpICE9IDApCisJCU5GU19GTEFHUyhpbm9kZSkgfD0gTkZTX0lOT19JTlZBTElEX0FDQ0VTUzsKKwluZnNfZW5kX2RhdGFfdXBkYXRlKGlub2RlKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogV2FpdCBmb3IgdGhlIGlub2RlIHRvIGdldCB1bmxvY2tlZC4KKyAqIChVc2VkIGZvciBORlNfSU5PX0xPQ0tFRCBhbmQgTkZTX0lOT19SRVZBTElEQVRJTkcpLgorICovCitzdGF0aWMgaW50CituZnNfd2FpdF9vbl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZmxhZykKK3sKKwlzdHJ1Y3QgcnBjX2NsbnQJKmNsbnQgPSBORlNfQ0xJRU5UKGlub2RlKTsKKwlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOworCisJaW50IGVycm9yOworCWlmICghKE5GU19GTEFHUyhpbm9kZSkgJiBmbGFnKSkKKwkJcmV0dXJuIDA7CisJYXRvbWljX2luYygmaW5vZGUtPmlfY291bnQpOworCWVycm9yID0gbmZzX3dhaXRfZXZlbnQoY2xudCwgbmZzaS0+bmZzX2lfd2FpdCwKKwkJCQkhKE5GU19GTEFHUyhpbm9kZSkgJiBmbGFnKSk7CisJaXB1dChpbm9kZSk7CisJcmV0dXJuIGVycm9yOworfQorCitpbnQgbmZzX2dldGF0dHIoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGtzdGF0ICpzdGF0KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKKwlpbnQgbmVlZF9hdGltZSA9IG5mc2ktPmZsYWdzICYgTkZTX0lOT19JTlZBTElEX0FUSU1FOworCWludCBlcnI7CisKKwlpZiAoX19JU19GTEcoaW5vZGUsIE1TX05PQVRJTUUpKQorCQluZWVkX2F0aW1lID0gMDsKKwllbHNlIGlmIChfX0lTX0ZMRyhpbm9kZSwgTVNfTk9ESVJBVElNRSkgJiYgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJbmVlZF9hdGltZSA9IDA7CisJLyogV2UgbWF5IGZvcmNlIGEgZ2V0YXR0ciBpZiB0aGUgdXNlciBjYXJlcyBhYm91dCBhdGltZSAqLworCWlmIChuZWVkX2F0aW1lKQorCQllcnIgPSBfX25mc19yZXZhbGlkYXRlX2lub2RlKE5GU19TRVJWRVIoaW5vZGUpLCBpbm9kZSk7CisJZWxzZQorCQllcnIgPSBuZnNfcmV2YWxpZGF0ZV9pbm9kZShORlNfU0VSVkVSKGlub2RlKSwgaW5vZGUpOworCWlmICghZXJyKQorCQlnZW5lcmljX2ZpbGxhdHRyKGlub2RlLCBzdGF0KTsKKwlyZXR1cm4gZXJyOworfQorCitzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqYWxsb2NfbmZzX29wZW5fY29udGV4dChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBycGNfY3JlZCAqY3JlZCkKK3sKKwlzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4OworCisJY3R4ID0gKHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICopa21hbGxvYyhzaXplb2YoKmN0eCksIEdGUF9LRVJORUwpOworCWlmIChjdHggIT0gTlVMTCkgeworCQlhdG9taWNfc2V0KCZjdHgtPmNvdW50LCAxKTsKKwkJY3R4LT5kZW50cnkgPSBkZ2V0KGRlbnRyeSk7CisJCWN0eC0+Y3JlZCA9IGdldF9ycGNjcmVkKGNyZWQpOworCQljdHgtPnN0YXRlID0gTlVMTDsKKwkJY3R4LT5sb2Nrb3duZXIgPSBjdXJyZW50LT5maWxlczsKKwkJY3R4LT5lcnJvciA9IDA7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmN0eC0+d2FpdHEpOworCX0KKwlyZXR1cm4gY3R4OworfQorCitzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqZ2V0X25mc19vcGVuX2NvbnRleHQoc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCkKK3sKKwlpZiAoY3R4ICE9IE5VTEwpCisJCWF0b21pY19pbmMoJmN0eC0+Y291bnQpOworCXJldHVybiBjdHg7Cit9CisKK3ZvaWQgcHV0X25mc19vcGVuX2NvbnRleHQoc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCkKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmY3R4LT5jb3VudCkpIHsKKwkJaWYgKCFsaXN0X2VtcHR5KCZjdHgtPmxpc3QpKSB7CisJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gY3R4LT5kZW50cnktPmRfaW5vZGU7CisJCQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCQkJbGlzdF9kZWwoJmN0eC0+bGlzdCk7CisJCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJCX0KKwkJaWYgKGN0eC0+c3RhdGUgIT0gTlVMTCkKKwkJCW5mczRfY2xvc2Vfc3RhdGUoY3R4LT5zdGF0ZSwgY3R4LT5tb2RlKTsKKwkJaWYgKGN0eC0+Y3JlZCAhPSBOVUxMKQorCQkJcHV0X3JwY2NyZWQoY3R4LT5jcmVkKTsKKwkJZHB1dChjdHgtPmRlbnRyeSk7CisJCWtmcmVlKGN0eCk7CisJfQorfQorCisvKgorICogRW5zdXJlIHRoYXQgbW1hcCBoYXMgYSByZWNlbnQgUlBDIGNyZWRlbnRpYWwgZm9yIHVzZSB3aGVuIHdyaXRpbmcgb3V0CisgKiBzaGFyZWQgcGFnZXMKKyAqLwordm9pZCBuZnNfZmlsZV9zZXRfb3Blbl9jb250ZXh0KHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOworCisJZmlscC0+cHJpdmF0ZV9kYXRhID0gZ2V0X25mc19vcGVuX2NvbnRleHQoY3R4KTsKKwlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCWxpc3RfYWRkKCZjdHgtPmxpc3QsICZuZnNpLT5vcGVuX2ZpbGVzKTsKKwlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7Cit9CisKK3N0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpuZnNfZmluZF9vcGVuX2NvbnRleHQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1vZGUpCit7CisJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKKwlzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqcG9zLCAqY3R4ID0gTlVMTDsKKworCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsICZuZnNpLT5vcGVuX2ZpbGVzLCBsaXN0KSB7CisJCWlmICgocG9zLT5tb2RlICYgbW9kZSkgPT0gbW9kZSkgeworCQkJY3R4ID0gZ2V0X25mc19vcGVuX2NvbnRleHQocG9zKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlyZXR1cm4gY3R4OworfQorCit2b2lkIG5mc19maWxlX2NsZWFyX29wZW5fY29udGV4dChzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCA9IChzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqKWZpbHAtPnByaXZhdGVfZGF0YTsKKworCWlmIChjdHgpIHsKKwkJZmlscC0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwkJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkJbGlzdF9tb3ZlX3RhaWwoJmN0eC0+bGlzdCwgJk5GU19JKGlub2RlKS0+b3Blbl9maWxlcyk7CisJCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkJcHV0X25mc19vcGVuX2NvbnRleHQoY3R4KTsKKwl9Cit9CisKKy8qCisgKiBUaGVzZSBhbGxvY2F0ZSBhbmQgcmVsZWFzZSBmaWxlIHJlYWQvd3JpdGUgY29udGV4dCBpbmZvcm1hdGlvbi4KKyAqLworaW50IG5mc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHg7CisJc3RydWN0IHJwY19jcmVkICpjcmVkOworCisJY3JlZCA9IHJwY2F1dGhfbG9va3VwY3JlZChORlNfQ0xJRU5UKGlub2RlKS0+Y2xfYXV0aCwgMCk7CisJaWYgKElTX0VSUihjcmVkKSkKKwkJcmV0dXJuIFBUUl9FUlIoY3JlZCk7CisJY3R4ID0gYWxsb2NfbmZzX29wZW5fY29udGV4dChmaWxwLT5mX2RlbnRyeSwgY3JlZCk7CisJcHV0X3JwY2NyZWQoY3JlZCk7CisJaWYgKGN0eCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwljdHgtPm1vZGUgPSBmaWxwLT5mX21vZGU7CisJbmZzX2ZpbGVfc2V0X29wZW5fY29udGV4dChmaWxwLCBjdHgpOworCXB1dF9uZnNfb3Blbl9jb250ZXh0KGN0eCk7CisJaWYgKChmaWxwLT5mX21vZGUgJiBGTU9ERV9XUklURSkgIT0gMCkKKwkJbmZzX2JlZ2luX2RhdGFfdXBkYXRlKGlub2RlKTsKKwlyZXR1cm4gMDsKK30KKworaW50IG5mc19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWlmICgoZmlscC0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICE9IDApCisJCW5mc19lbmRfZGF0YV91cGRhdGUoaW5vZGUpOworCW5mc19maWxlX2NsZWFyX29wZW5fY29udGV4dChmaWxwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW5ldmVyIHNvbWUgcGFydCBvZiBORlMgbm90aWNlcyB0aGF0CisgKiB0aGUgY2FjaGVkIGF0dHJpYnV0ZXMgaGF2ZSB0byBiZSByZWZyZXNoZWQuCisgKi8KK2ludAorX19uZnNfcmV2YWxpZGF0ZV9pbm9kZShzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWludAkJIHN0YXR1cyA9IC1FU1RBTEU7CisJc3RydWN0IG5mc19mYXR0ciBmYXR0cjsKKwlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOworCXVuc2lnbmVkIGxvbmcgdmVyaWZpZXI7CisJdW5zaWduZWQgaW50IGZsYWdzOworCisJZGZwcmludGsoUEFHRUNBQ0hFLCAiTkZTOiByZXZhbGlkYXRpbmcgKCVzLyVMZClcbiIsCisJCWlub2RlLT5pX3NiLT5zX2lkLCAobG9uZyBsb25nKU5GU19GSUxFSUQoaW5vZGUpKTsKKworCWxvY2tfa2VybmVsKCk7CisJaWYgKCFpbm9kZSB8fCBpc19iYWRfaW5vZGUoaW5vZGUpKQorIAkJZ290byBvdXRfbm93YWl0OworCWlmIChORlNfU1RBTEUoaW5vZGUpKQorIAkJZ290byBvdXRfbm93YWl0OworCisJd2hpbGUgKE5GU19SRVZBTElEQVRJTkcoaW5vZGUpKSB7CisJCXN0YXR1cyA9IG5mc193YWl0X29uX2lub2RlKGlub2RlLCBORlNfSU5PX1JFVkFMSURBVElORyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBvdXRfbm93YWl0OworCQlpZiAoTkZTX0FUVFJUSU1FTyhpbm9kZSkgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoTkZTX0ZMQUdTKGlub2RlKSAmIChORlNfSU5PX0lOVkFMSURfQVRUUnxORlNfSU5PX0lOVkFMSURfREFUQXxORlNfSU5PX0lOVkFMSURfQVRJTUUpKQorCQkJY29udGludWU7CisJCXN0YXR1cyA9IE5GU19TVEFMRShpbm9kZSkgPyAtRVNUQUxFIDogMDsKKwkJZ290byBvdXRfbm93YWl0OworCX0KKwlORlNfRkxBR1MoaW5vZGUpIHw9IE5GU19JTk9fUkVWQUxJREFUSU5HOworCisJLyogUHJvdGVjdCBhZ2FpbnN0IFJQQyByYWNlcyBieSBzYXZpbmcgdGhlIGNoYW5nZSBhdHRyaWJ1dGUgKi8KKwl2ZXJpZmllciA9IG5mc19zYXZlX2NoYW5nZV9hdHRyaWJ1dGUoaW5vZGUpOworCXN0YXR1cyA9IE5GU19QUk9UTyhpbm9kZSktPmdldGF0dHIoc2VydmVyLCBORlNfRkgoaW5vZGUpLCAmZmF0dHIpOworCWlmIChzdGF0dXMgIT0gMCkgeworCQlkZnByaW50ayhQQUdFQ0FDSEUsICJuZnNfcmV2YWxpZGF0ZV9pbm9kZTogKCVzLyVMZCkgZ2V0YXR0ciBmYWlsZWQsIGVycm9yPSVkXG4iLAorCQkJIGlub2RlLT5pX3NiLT5zX2lkLAorCQkJIChsb25nIGxvbmcpTkZTX0ZJTEVJRChpbm9kZSksIHN0YXR1cyk7CisJCWlmIChzdGF0dXMgPT0gLUVTVEFMRSkgeworCQkJbmZzX3phcF9jYWNoZXMoaW5vZGUpOworCQkJaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQkJCU5GU19GTEFHUyhpbm9kZSkgfD0gTkZTX0lOT19TVEFMRTsKKwkJfQorCQlnb3RvIG91dDsKKwl9CisKKwlzdGF0dXMgPSBuZnNfdXBkYXRlX2lub2RlKGlub2RlLCAmZmF0dHIsIHZlcmlmaWVyKTsKKwlpZiAoc3RhdHVzKSB7CisJCWRmcHJpbnRrKFBBR0VDQUNIRSwgIm5mc19yZXZhbGlkYXRlX2lub2RlOiAoJXMvJUxkKSByZWZyZXNoIGZhaWxlZCwgZXJyb3I9JWRcbiIsCisJCQkgaW5vZGUtPmlfc2ItPnNfaWQsCisJCQkgKGxvbmcgbG9uZylORlNfRklMRUlEKGlub2RlKSwgc3RhdHVzKTsKKwkJZ290byBvdXQ7CisJfQorCWZsYWdzID0gbmZzaS0+ZmxhZ3M7CisJLyoKKwkgKiBXZSBtYXkgbmVlZCB0byBrZWVwIHRoZSBhdHRyaWJ1dGVzIG1hcmtlZCBhcyBpbnZhbGlkIGlmCisJICogd2UgcmFjZWQgd2l0aCBuZnNfZW5kX2F0dHJfdXBkYXRlKCkuCisJICovCisJaWYgKHZlcmlmaWVyID09IG5mc2ktPmNhY2hlX2NoYW5nZV9hdHRyaWJ1dGUpCisJCW5mc2ktPmZsYWdzICY9IH4oTkZTX0lOT19JTlZBTElEX0FUVFJ8TkZTX0lOT19JTlZBTElEX0FUSU1FKTsKKwkvKiBEbyB0aGUgcGFnZSBjYWNoZSBpbnZhbGlkYXRpb24gKi8KKwlpZiAoZmxhZ3MgJiBORlNfSU5PX0lOVkFMSURfREFUQSkgeworCQlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgeworCQkJaWYgKGZpbGVtYXBfZmRhdGF3cml0ZShpbm9kZS0+aV9tYXBwaW5nKSA9PSAwKQorCQkJCWZpbGVtYXBfZmRhdGF3YWl0KGlub2RlLT5pX21hcHBpbmcpOworCQkJbmZzX3diX2FsbChpbm9kZSk7CisJCX0KKwkJbmZzaS0+ZmxhZ3MgJj0gfk5GU19JTk9fSU5WQUxJRF9EQVRBOworCQlpbnZhbGlkYXRlX2lub2RlX3BhZ2VzMihpbm9kZS0+aV9tYXBwaW5nKTsKKwkJbWVtc2V0KE5GU19DT09LSUVWRVJGKGlub2RlKSwgMCwgc2l6ZW9mKE5GU19DT09LSUVWRVJGKGlub2RlKSkpOworCQlkZnByaW50ayhQQUdFQ0FDSEUsICJORlM6ICglcy8lTGQpIGRhdGEgY2FjaGUgaW52YWxpZGF0ZWRcbiIsCisJCQkJaW5vZGUtPmlfc2ItPnNfaWQsCisJCQkJKGxvbmcgbG9uZylORlNfRklMRUlEKGlub2RlKSk7CisJCS8qIFRoaXMgZW5zdXJlcyB3ZSByZXZhbGlkYXRlIGRlbnRyaWVzICovCisJCW5mc2ktPmNhY2hlX2NoYW5nZV9hdHRyaWJ1dGUrKzsKKwl9CisJZGZwcmludGsoUEFHRUNBQ0hFLCAiTkZTOiAoJXMvJUxkKSByZXZhbGlkYXRpb24gY29tcGxldGVcbiIsCisJCWlub2RlLT5pX3NiLT5zX2lkLAorCQkobG9uZyBsb25nKU5GU19GSUxFSUQoaW5vZGUpKTsKKworb3V0OgorCU5GU19GTEFHUyhpbm9kZSkgJj0gfk5GU19JTk9fUkVWQUxJREFUSU5HOworCXdha2VfdXAoJm5mc2ktPm5mc19pX3dhaXQpOworIG91dF9ub3dhaXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBzdGF0dXM7Cit9CisKK2ludCBuZnNfYXR0cmlidXRlX3RpbWVvdXQoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOworCisJaWYgKG5mc19oYXZlX2RlbGVnYXRpb24oaW5vZGUsIEZNT0RFX1JFQUQpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gdGltZV9hZnRlcihqaWZmaWVzLCBuZnNpLT5yZWFkX2NhY2hlX2ppZmZpZXMrbmZzaS0+YXR0cnRpbWVvKTsKK30KKworLyoqCisgKiBuZnNfcmV2YWxpZGF0ZV9pbm9kZSAtIFJldmFsaWRhdGUgdGhlIGlub2RlIGF0dHJpYnV0ZXMKKyAqIEBzZXJ2ZXIgLSBwb2ludGVyIHRvIG5mc19zZXJ2ZXIgc3RydWN0CisgKiBAaW5vZGUgLSBwb2ludGVyIHRvIGlub2RlIHN0cnVjdAorICoKKyAqIFVwZGF0ZXMgaW5vZGUgYXR0cmlidXRlIGluZm9ybWF0aW9uIGJ5IHJldHJpZXZpbmcgdGhlIGRhdGEgZnJvbSB0aGUgc2VydmVyLgorICovCitpbnQgbmZzX3JldmFsaWRhdGVfaW5vZGUoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpZiAoIShORlNfRkxBR1MoaW5vZGUpICYgKE5GU19JTk9fSU5WQUxJRF9BVFRSfE5GU19JTk9fSU5WQUxJRF9EQVRBKSkKKwkJCSYmICFuZnNfYXR0cmlidXRlX3RpbWVvdXQoaW5vZGUpKQorCQlyZXR1cm4gTkZTX1NUQUxFKGlub2RlKSA/IC1FU1RBTEUgOiAwOworCXJldHVybiBfX25mc19yZXZhbGlkYXRlX2lub2RlKHNlcnZlciwgaW5vZGUpOworfQorCisvKioKKyAqIG5mc19iZWdpbl9kYXRhX3VwZGF0ZQorICogQGlub2RlIC0gcG9pbnRlciB0byBpbm9kZQorICogRGVjbGFyZSB0aGF0IGEgc2V0IG9mIG9wZXJhdGlvbnMgd2lsbCB1cGRhdGUgZmlsZSBkYXRhIG9uIHRoZSBzZXJ2ZXIKKyAqLwordm9pZCBuZnNfYmVnaW5fZGF0YV91cGRhdGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlhdG9taWNfaW5jKCZORlNfSShpbm9kZSktPmRhdGFfdXBkYXRlcyk7Cit9CisKKy8qKgorICogbmZzX2VuZF9kYXRhX3VwZGF0ZQorICogQGlub2RlIC0gcG9pbnRlciB0byBpbm9kZQorICogRGVjbGFyZSBlbmQgb2YgdGhlIG9wZXJhdGlvbnMgdGhhdCB3aWxsIHVwZGF0ZSBmaWxlIGRhdGEKKyAqIFRoaXMgd2lsbCBtYXJrIHRoZSBpbm9kZSBhcyBpbW1lZGlhdGVseSBuZWVkaW5nIHJldmFsaWRhdGlvbgorICogb2YgaXRzIGF0dHJpYnV0ZSBjYWNoZS4KKyAqLwordm9pZCBuZnNfZW5kX2RhdGFfdXBkYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKKworCWlmICghbmZzX2hhdmVfZGVsZWdhdGlvbihpbm9kZSwgRk1PREVfUkVBRCkpIHsKKwkJLyogTWFyayB0aGUgYXR0cmlidXRlIGNhY2hlIGZvciByZXZhbGlkYXRpb24gKi8KKwkJbmZzaS0+ZmxhZ3MgfD0gTkZTX0lOT19JTlZBTElEX0FUVFI7CisJCS8qIERpcmVjdG9yaWVzIGFuZCBzeW1saW5rczogaW52YWxpZGF0ZSBwYWdlIGNhY2hlIHRvbyAqLworCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSB8fCBTX0lTTE5LKGlub2RlLT5pX21vZGUpKQorCQkJbmZzaS0+ZmxhZ3MgfD0gTkZTX0lOT19JTlZBTElEX0RBVEE7CisJfQorCW5mc2ktPmNhY2hlX2NoYW5nZV9hdHRyaWJ1dGUgKys7CisJYXRvbWljX2RlYygmbmZzaS0+ZGF0YV91cGRhdGVzKTsKK30KKworLyoqCisgKiBuZnNfZW5kX2RhdGFfdXBkYXRlX2RlZmVyCisgKiBAaW5vZGUgLSBwb2ludGVyIHRvIGlub2RlCisgKiBEZWNsYXJlIGVuZCBvZiB0aGUgb3BlcmF0aW9ucyB0aGF0IHdpbGwgdXBkYXRlIGZpbGUgZGF0YQorICogVGhpcyB3aWxsIGRlZmVyIG1hcmtpbmcgdGhlIGlub2RlIGFzIG5lZWRpbmcgcmV2YWxpZGF0aW9uCisgKiB1bmxlc3MgdGhlcmUgYXJlIG5vIG90aGVyIHBlbmRpbmcgdXBkYXRlcy4KKyAqLwordm9pZCBuZnNfZW5kX2RhdGFfdXBkYXRlX2RlZmVyKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKKworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZuZnNpLT5kYXRhX3VwZGF0ZXMpKSB7CisJCS8qIE1hcmsgdGhlIGF0dHJpYnV0ZSBjYWNoZSBmb3IgcmV2YWxpZGF0aW9uICovCisJCW5mc2ktPmZsYWdzIHw9IE5GU19JTk9fSU5WQUxJRF9BVFRSOworCQkvKiBEaXJlY3RvcmllcyBhbmQgc3ltbGlua3M6IGludmFsaWRhdGUgcGFnZSBjYWNoZSB0b28gKi8KKwkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKKwkJCW5mc2ktPmZsYWdzIHw9IE5GU19JTk9fSU5WQUxJRF9EQVRBOworCQluZnNpLT5jYWNoZV9jaGFuZ2VfYXR0cmlidXRlICsrOworCX0KK30KKworLyoqCisgKiBuZnNfcmVmcmVzaF9pbm9kZSAtIHZlcmlmeSBjb25zaXN0ZW5jeSBvZiB0aGUgaW5vZGUgYXR0cmlidXRlIGNhY2hlCisgKiBAaW5vZGUgLSBwb2ludGVyIHRvIGlub2RlCisgKiBAZmF0dHIgLSB1cGRhdGVkIGF0dHJpYnV0ZXMKKyAqCisgKiBWZXJpZmllcyB0aGUgYXR0cmlidXRlIGNhY2hlLiBJZiB3ZSBoYXZlIGp1c3QgY2hhbmdlZCB0aGUgYXR0cmlidXRlcywKKyAqIHNvIHRoYXQgZmF0dHIgY2FycmllcyB3ZWFrIGNhY2hlIGNvbnNpc3RlbmN5IGRhdGEsIHRoZW4gaXQgbWF5CisgKiBhbHNvIHVwZGF0ZSB0aGUgY3RpbWUvbXRpbWUvY2hhbmdlX2F0dHJpYnV0ZS4KKyAqLworaW50IG5mc19yZWZyZXNoX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQoreworCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CisJbG9mZl90IGN1cl9zaXplLCBuZXdfaXNpemU7CisJaW50IGRhdGFfdW5zdGFibGU7CisKKwkvKiBEbyB3ZSBob2xkIGEgZGVsZWdhdGlvbj8gKi8KKwlpZiAobmZzX2hhdmVfZGVsZWdhdGlvbihpbm9kZSwgRk1PREVfUkVBRCkpCisJCXJldHVybiAwOworCisJLyogQXJlIHdlIGluIHRoZSBwcm9jZXNzIG9mIHVwZGF0aW5nIGRhdGEgb24gdGhlIHNlcnZlcj8gKi8KKwlkYXRhX3Vuc3RhYmxlID0gbmZzX2NhY2hlc191bnN0YWJsZShpbm9kZSk7CisKKwlpZiAoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFJfVjQpIHsKKwkJaWYgKChmYXR0ci0+dmFsaWQgJiBORlNfQVRUUl9QUkVfQ0hBTkdFKSAhPSAwCisJCQkJJiYgbmZzaS0+Y2hhbmdlX2F0dHIgPT0gZmF0dHItPnByZV9jaGFuZ2VfYXR0cikKKwkJCW5mc2ktPmNoYW5nZV9hdHRyID0gZmF0dHItPmNoYW5nZV9hdHRyOworCQlpZiAoIWRhdGFfdW5zdGFibGUgJiYgbmZzaS0+Y2hhbmdlX2F0dHIgIT0gZmF0dHItPmNoYW5nZV9hdHRyKQorCQkJbmZzaS0+ZmxhZ3MgfD0gTkZTX0lOT19JTlZBTElEX0FUVFI7CisJfQorCisJaWYgKChmYXR0ci0+dmFsaWQgJiBORlNfQVRUUl9GQVRUUikgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBIYXMgdGhlIGlub2RlIGdvbmUgYW5kIGNoYW5nZWQgYmVoaW5kIG91ciBiYWNrPyAqLworCWlmIChuZnNpLT5maWxlaWQgIT0gZmF0dHItPmZpbGVpZAorCQkJfHwgKGlub2RlLT5pX21vZGUgJiBTX0lGTVQpICE9IChmYXR0ci0+bW9kZSAmIFNfSUZNVCkpCisJCXJldHVybiAtRUlPOworCisJY3VyX3NpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CisgCW5ld19pc2l6ZSA9IG5mc19zaXplX3RvX2xvZmZfdChmYXR0ci0+c2l6ZSk7CisKKwkvKiBJZiB3ZSBoYXZlIGF0b21pYyBXQ0MgZGF0YSwgd2UgbWF5IHVwZGF0ZSBzb21lIGF0dHJpYnV0ZXMgKi8KKwlpZiAoKGZhdHRyLT52YWxpZCAmIE5GU19BVFRSX1dDQykgIT0gMCkgeworCQlpZiAodGltZXNwZWNfZXF1YWwoJmlub2RlLT5pX2N0aW1lLCAmZmF0dHItPnByZV9jdGltZSkpCisJCQltZW1jcHkoJmlub2RlLT5pX2N0aW1lLCAmZmF0dHItPmN0aW1lLCBzaXplb2YoaW5vZGUtPmlfY3RpbWUpKTsKKwkJaWYgKHRpbWVzcGVjX2VxdWFsKCZpbm9kZS0+aV9tdGltZSwgJmZhdHRyLT5wcmVfbXRpbWUpKQorCQkJbWVtY3B5KCZpbm9kZS0+aV9tdGltZSwgJmZhdHRyLT5tdGltZSwgc2l6ZW9mKGlub2RlLT5pX210aW1lKSk7CisJfQorCisJLyogVmVyaWZ5IGEgZmV3IG9mIHRoZSBtb3JlIGltcG9ydGFudCBhdHRyaWJ1dGVzICovCisJaWYgKCFkYXRhX3Vuc3RhYmxlKSB7CisJCWlmICghdGltZXNwZWNfZXF1YWwoJmlub2RlLT5pX210aW1lLCAmZmF0dHItPm10aW1lKQorCQkJCXx8IGN1cl9zaXplICE9IG5ld19pc2l6ZSkKKwkJCW5mc2ktPmZsYWdzIHw9IE5GU19JTk9fSU5WQUxJRF9BVFRSOworCX0gZWxzZSBpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJiBuZXdfaXNpemUgPiBjdXJfc2l6ZSkKKwkJCW5mc2ktPmZsYWdzIHw9IE5GU19JTk9fSU5WQUxJRF9BVFRSOworCisJLyogSGF2ZSBhbnkgZmlsZSBwZXJtaXNzaW9ucyBjaGFuZ2VkPyAqLworCWlmICgoaW5vZGUtPmlfbW9kZSAmIFNfSUFMTFVHTykgIT0gKGZhdHRyLT5tb2RlICYgU19JQUxMVUdPKQorCQkJfHwgaW5vZGUtPmlfdWlkICE9IGZhdHRyLT51aWQKKwkJCXx8IGlub2RlLT5pX2dpZCAhPSBmYXR0ci0+Z2lkKQorCQluZnNpLT5mbGFncyB8PSBORlNfSU5PX0lOVkFMSURfQVRUUiB8IE5GU19JTk9fSU5WQUxJRF9BQ0NFU1M7CisKKwkvKiBIYXMgdGhlIGxpbmsgY291bnQgY2hhbmdlZD8gKi8KKwlpZiAoaW5vZGUtPmlfbmxpbmsgIT0gZmF0dHItPm5saW5rKQorCQluZnNpLT5mbGFncyB8PSBORlNfSU5PX0lOVkFMSURfQVRUUjsKKworCWlmICghdGltZXNwZWNfZXF1YWwoJmlub2RlLT5pX2F0aW1lLCAmZmF0dHItPmF0aW1lKSkKKwkJbmZzaS0+ZmxhZ3MgfD0gTkZTX0lOT19JTlZBTElEX0FUSU1FOworCisJbmZzaS0+cmVhZF9jYWNoZV9qaWZmaWVzID0gZmF0dHItPnRpbWVzdGFtcDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE1hbnkgbmZzIHByb3RvY29sIGNhbGxzIHJldHVybiB0aGUgbmV3IGZpbGUgYXR0cmlidXRlcyBhZnRlcgorICogYW4gb3BlcmF0aW9uLiAgSGVyZSB3ZSB1cGRhdGUgdGhlIGlub2RlIHRvIHJlZmxlY3QgdGhlIHN0YXRlCisgKiBvZiB0aGUgc2VydmVyJ3MgaW5vZGUuCisgKgorICogVGhpcyBpcyBhIGJpdCB0cmlja3kgYmVjYXVzZSB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSBhbGwgZGlydHkgcGFnZXMKKyAqIGhhdmUgYmVlbiBzZW50IG9mZiB0byB0aGUgc2VydmVyIGJlZm9yZSBjYWxsaW5nIGludmFsaWRhdGVfaW5vZGVfcGFnZXMuCisgKiBUbyBtYWtlIHN1cmUgbm8gb3RoZXIgcHJvY2VzcyBhZGRzIG1vcmUgd3JpdGUgcmVxdWVzdHMgd2hpbGUgd2UgdHJ5CisgKiBvdXIgYmVzdCB0byBmbHVzaCB0aGVtLCB3ZSBtYWtlIHRoZW0gc2xlZXAgZHVyaW5nIHRoZSBhdHRyaWJ1dGUgcmVmcmVzaC4KKyAqCisgKiBBIHZlcnkgc2ltaWxhciBzY2VuYXJpbyBob2xkcyBmb3IgdGhlIGRpciBjYWNoZS4KKyAqLworc3RhdGljIGludCBuZnNfdXBkYXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyLCB1bnNpZ25lZCBsb25nIHZlcmlmaWVyKQoreworCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CisJX191NjQJCW5ld19zaXplOworCWxvZmZfdAkJbmV3X2lzaXplOworCXVuc2lnbmVkIGludAlpbnZhbGlkID0gMDsKKwlsb2ZmX3QJCWN1cl9pc2l6ZTsKKwlpbnQgZGF0YV91bnN0YWJsZTsKKworCWRmcHJpbnRrKFZGUywgIk5GUzogJXMoJXMvJWxkIGN0PSVkIGluZm89MHgleClcbiIsCisJCQlfX0ZVTkNUSU9OX18sIGlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8sCisJCQlhdG9taWNfcmVhZCgmaW5vZGUtPmlfY291bnQpLCBmYXR0ci0+dmFsaWQpOworCisJaWYgKChmYXR0ci0+dmFsaWQgJiBORlNfQVRUUl9GQVRUUikgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAobmZzaS0+ZmlsZWlkICE9IGZhdHRyLT5maWxlaWQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogaW5vZGUgbnVtYmVyIG1pc21hdGNoXG4iCisJCSAgICAgICAiZXhwZWN0ZWQgKCVzLzB4JUx4KSwgZ290ICglcy8weCVMeClcbiIsCisJCSAgICAgICBfX0ZVTkNUSU9OX18sCisJCSAgICAgICBpbm9kZS0+aV9zYi0+c19pZCwgKGxvbmcgbG9uZyluZnNpLT5maWxlaWQsCisJCSAgICAgICBpbm9kZS0+aV9zYi0+c19pZCwgKGxvbmcgbG9uZylmYXR0ci0+ZmlsZWlkKTsKKwkJZ290byBvdXRfZXJyOworCX0KKworCS8qCisJICogTWFrZSBzdXJlIHRoZSBpbm9kZSdzIHR5cGUgaGFzbid0IGNoYW5nZWQuCisJICovCisJaWYgKChpbm9kZS0+aV9tb2RlICYgU19JRk1UKSAhPSAoZmF0dHItPm1vZGUgJiBTX0lGTVQpKQorCQlnb3RvIG91dF9jaGFuZ2VkOworCisJLyoKKwkgKiBVcGRhdGUgdGhlIHJlYWQgdGltZSBzbyB3ZSBkb24ndCByZXZhbGlkYXRlIHRvbyBvZnRlbi4KKwkgKi8KKwluZnNpLT5yZWFkX2NhY2hlX2ppZmZpZXMgPSBmYXR0ci0+dGltZXN0YW1wOworCisJLyogQXJlIHdlIHJhY2luZyB3aXRoIGtub3duIHVwZGF0ZXMgb2YgdGhlIG1ldGFkYXRhIG9uIHRoZSBzZXJ2ZXI/ICovCisJZGF0YV91bnN0YWJsZSA9ICEgbmZzX3ZlcmlmeV9jaGFuZ2VfYXR0cmlidXRlKGlub2RlLCB2ZXJpZmllcik7CisKKwkvKiBDaGVjayBpZiB0aGUgZmlsZSBzaXplIGFncmVlcyAqLworCW5ld19zaXplID0gZmF0dHItPnNpemU7CisgCW5ld19pc2l6ZSA9IG5mc19zaXplX3RvX2xvZmZfdChmYXR0ci0+c2l6ZSk7CisJY3VyX2lzaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOworCWlmIChjdXJfaXNpemUgIT0gbmV3X3NpemUpIHsKKyNpZmRlZiBORlNfREVCVUdfVkVSQk9TRQorCQlwcmludGsoS0VSTl9ERUJVRyAiTkZTOiBpc2l6ZSBjaGFuZ2Ugb24gJXMvJWxkXG4iLCBpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vKTsKKyNlbmRpZgorCQkvKgorCQkgKiBJZiB3ZSBoYXZlIHBlbmRpbmcgd3JpdGViYWNrcywgdGhpbmdzIGNhbiBnZXQKKwkJICogbWVzc3kuCisJCSAqLworCQlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJiBkYXRhX3Vuc3RhYmxlKSB7CisJCQlpZiAobmV3X2lzaXplID4gY3VyX2lzaXplKSB7CisJCQkJaW5vZGUtPmlfc2l6ZSA9IG5ld19pc2l6ZTsKKwkJCQlpbnZhbGlkIHw9IE5GU19JTk9fSU5WQUxJRF9BVFRSfE5GU19JTk9fSU5WQUxJRF9EQVRBOworCQkJfQorCQl9IGVsc2UgeworCQkJaW5vZGUtPmlfc2l6ZSA9IG5ld19pc2l6ZTsKKwkJCWludmFsaWQgfD0gTkZTX0lOT19JTlZBTElEX0FUVFJ8TkZTX0lOT19JTlZBTElEX0RBVEE7CisJCX0KKwl9CisKKwkvKgorCSAqIE5vdGU6IHdlIGRvbid0IGNoZWNrIGlub2RlLT5pX210aW1lIHNpbmNlIHBpcGVzIGV0Yy4KKwkgKiAgICAgICBjYW4gY2hhbmdlIHRoaXMgdmFsdWUgaW4gVkZTIHdpdGhvdXQgcmVxdWlyaW5nIGEKKwkgKgkgY2FjaGUgcmV2YWxpZGF0aW9uLgorCSAqLworCWlmICghdGltZXNwZWNfZXF1YWwoJmlub2RlLT5pX210aW1lLCAmZmF0dHItPm10aW1lKSkgeworCQltZW1jcHkoJmlub2RlLT5pX210aW1lLCAmZmF0dHItPm10aW1lLCBzaXplb2YoaW5vZGUtPmlfbXRpbWUpKTsKKyNpZmRlZiBORlNfREVCVUdfVkVSQk9TRQorCQlwcmludGsoS0VSTl9ERUJVRyAiTkZTOiBtdGltZSBjaGFuZ2Ugb24gJXMvJWxkXG4iLCBpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vKTsKKyNlbmRpZgorCQlpZiAoIWRhdGFfdW5zdGFibGUpCisJCQlpbnZhbGlkIHw9IE5GU19JTk9fSU5WQUxJRF9BVFRSfE5GU19JTk9fSU5WQUxJRF9EQVRBOworCX0KKworCWlmICgoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFJfVjQpCisJICAgICYmIG5mc2ktPmNoYW5nZV9hdHRyICE9IGZhdHRyLT5jaGFuZ2VfYXR0cikgeworI2lmZGVmIE5GU19ERUJVR19WRVJCT1NFCisJCXByaW50ayhLRVJOX0RFQlVHICJORlM6IGNoYW5nZV9hdHRyIGNoYW5nZSBvbiAlcy8lbGRcbiIsCisJCSAgICAgICBpbm9kZS0+aV9zYi0+c19pZCwgaW5vZGUtPmlfaW5vKTsKKyNlbmRpZgorCQluZnNpLT5jaGFuZ2VfYXR0ciA9IGZhdHRyLT5jaGFuZ2VfYXR0cjsKKwkJaWYgKCFkYXRhX3Vuc3RhYmxlKQorCQkJaW52YWxpZCB8PSBORlNfSU5PX0lOVkFMSURfQVRUUnxORlNfSU5PX0lOVkFMSURfREFUQXxORlNfSU5PX0lOVkFMSURfQUNDRVNTOworCX0KKworCW1lbWNweSgmaW5vZGUtPmlfY3RpbWUsICZmYXR0ci0+Y3RpbWUsIHNpemVvZihpbm9kZS0+aV9jdGltZSkpOworCW1lbWNweSgmaW5vZGUtPmlfYXRpbWUsICZmYXR0ci0+YXRpbWUsIHNpemVvZihpbm9kZS0+aV9hdGltZSkpOworCisJaWYgKChpbm9kZS0+aV9tb2RlICYgU19JQUxMVUdPKSAhPSAoZmF0dHItPm1vZGUgJiBTX0lBTExVR08pIHx8CisJICAgIGlub2RlLT5pX3VpZCAhPSBmYXR0ci0+dWlkIHx8CisJICAgIGlub2RlLT5pX2dpZCAhPSBmYXR0ci0+Z2lkKQorCQlpbnZhbGlkIHw9IE5GU19JTk9fSU5WQUxJRF9BVFRSfE5GU19JTk9fSU5WQUxJRF9BQ0NFU1M7CisKKwlpbm9kZS0+aV9tb2RlID0gZmF0dHItPm1vZGU7CisJaW5vZGUtPmlfbmxpbmsgPSBmYXR0ci0+bmxpbms7CisJaW5vZGUtPmlfdWlkID0gZmF0dHItPnVpZDsKKwlpbm9kZS0+aV9naWQgPSBmYXR0ci0+Z2lkOworCisJaWYgKGZhdHRyLT52YWxpZCAmIChORlNfQVRUUl9GQVRUUl9WMyB8IE5GU19BVFRSX0ZBVFRSX1Y0KSkgeworCQkvKgorCQkgKiByZXBvcnQgdGhlIGJsb2NrcyBpbiA1MTJieXRlIHVuaXRzCisJCSAqLworCQlpbm9kZS0+aV9ibG9ja3MgPSBuZnNfY2FsY19ibG9ja19zaXplKGZhdHRyLT5kdS5uZnMzLnVzZWQpOworCQlpbm9kZS0+aV9ibGtzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworIAl9IGVsc2UgeworIAkJaW5vZGUtPmlfYmxvY2tzID0gZmF0dHItPmR1Lm5mczIuYmxvY2tzOworIAkJaW5vZGUtPmlfYmxrc2l6ZSA9IGZhdHRyLT5kdS5uZnMyLmJsb2Nrc2l6ZTsKKyAJfQorCisJLyogVXBkYXRlIGF0dHJ0aW1lbyB2YWx1ZSBpZiB3ZSdyZSBvdXQgb2YgdGhlIHVuc3RhYmxlIHBlcmlvZCAqLworCWlmIChpbnZhbGlkICYgTkZTX0lOT19JTlZBTElEX0FUVFIpIHsKKwkJbmZzaS0+YXR0cnRpbWVvID0gTkZTX01JTkFUVFJUSU1FTyhpbm9kZSk7CisJCW5mc2ktPmF0dHJ0aW1lb190aW1lc3RhbXAgPSBqaWZmaWVzOworCX0gZWxzZSBpZiAodGltZV9hZnRlcihqaWZmaWVzLCBuZnNpLT5hdHRydGltZW9fdGltZXN0YW1wK25mc2ktPmF0dHJ0aW1lbykpIHsKKwkJaWYgKChuZnNpLT5hdHRydGltZW8gPDw9IDEpID4gTkZTX01BWEFUVFJUSU1FTyhpbm9kZSkpCisJCQluZnNpLT5hdHRydGltZW8gPSBORlNfTUFYQVRUUlRJTUVPKGlub2RlKTsKKwkJbmZzaS0+YXR0cnRpbWVvX3RpbWVzdGFtcCA9IGppZmZpZXM7CisJfQorCS8qIERvbid0IGludmFsaWRhdGUgdGhlIGRhdGEgaWYgd2Ugd2VyZSB0byBibGFtZSAqLworCWlmICghKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0RJUihpbm9kZS0+aV9tb2RlKQorCQkJCXx8IFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpKQorCQlpbnZhbGlkICY9IH5ORlNfSU5PX0lOVkFMSURfREFUQTsKKwlpZiAoIW5mc19oYXZlX2RlbGVnYXRpb24oaW5vZGUsIEZNT0RFX1JFQUQpKQorCQluZnNpLT5mbGFncyB8PSBpbnZhbGlkOworCisJcmV0dXJuIDA7Cisgb3V0X2NoYW5nZWQ6CisJLyoKKwkgKiBCaWcgdHJvdWJsZSEgVGhlIGlub2RlIGhhcyBiZWNvbWUgYSBkaWZmZXJlbnQgb2JqZWN0LgorCSAqLworI2lmZGVmIE5GU19QQVJBTk9JQQorCXByaW50ayhLRVJOX0RFQlVHICIlczogaW5vZGUgJWxkIG1vZGUgY2hhbmdlZCwgJTA3byB0byAlMDdvXG4iLAorCQkJX19GVU5DVElPTl9fLCBpbm9kZS0+aV9pbm8sIGlub2RlLT5pX21vZGUsIGZhdHRyLT5tb2RlKTsKKyNlbmRpZgorCS8qCisJICogTm8gbmVlZCB0byB3b3JyeSBhYm91dCB1bmhhc2hpbmcgdGhlIGRlbnRyeSwgYXMgdGhlCisJICogbG9va3VwIHZhbGlkYXRpb24gd2lsbCBrbm93IHRoYXQgdGhlIGlub2RlIGlzIGJhZC4KKwkgKiAoQnV0IHdlIGZhbGwgdGhyb3VnaCB0byBpbnZhbGlkYXRlIHRoZSBjYWNoZXMuKQorCSAqLworCW5mc19pbnZhbGlkYXRlX2lub2RlKGlub2RlKTsKKyBvdXRfZXJyOgorCU5GU19GTEFHUyhpbm9kZSkgfD0gTkZTX0lOT19TVEFMRTsKKwlyZXR1cm4gLUVTVEFMRTsKK30KKworLyoKKyAqIEZpbGUgc3lzdGVtIGluZm9ybWF0aW9uCisgKi8KKworc3RhdGljIGludCBuZnNfc2V0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdm9pZCAqZGF0YSkKK3sKKwlzLT5zX2ZzX2luZm8gPSBkYXRhOworCXJldHVybiBzZXRfYW5vbl9zdXBlcihzLCBkYXRhKTsKK30KKyAKK3N0YXRpYyBpbnQgbmZzX2NvbXBhcmVfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gZGF0YTsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqb2xkID0gTkZTX1NCKHNiKTsKKworCWlmIChvbGQtPmFkZHIuc2luX2FkZHIuc19hZGRyICE9IHNlcnZlci0+YWRkci5zaW5fYWRkci5zX2FkZHIpCisJCXJldHVybiAwOworCWlmIChvbGQtPmFkZHIuc2luX3BvcnQgIT0gc2VydmVyLT5hZGRyLnNpbl9wb3J0KQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gIW5mc19jb21wYXJlX2ZoKCZvbGQtPmZoLCAmc2VydmVyLT5maCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKm5mc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqcmF3X2RhdGEpCit7CisJaW50IGVycm9yOworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXI7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzOworCXN0cnVjdCBuZnNfZmggKnJvb3Q7CisJc3RydWN0IG5mc19tb3VudF9kYXRhICpkYXRhID0gcmF3X2RhdGE7CisKKwlpZiAoIWRhdGEpIHsKKwkJcHJpbnRrKCJuZnNfcmVhZF9zdXBlcjogbWlzc2luZyBkYXRhIGFyZ3VtZW50XG4iKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJc2VydmVyID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG5mc19zZXJ2ZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNlcnZlcikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJbWVtc2V0KHNlcnZlciwgMCwgc2l6ZW9mKHN0cnVjdCBuZnNfc2VydmVyKSk7CisJLyogWmVybyBvdXQgdGhlIE5GUyBzdGF0ZSBzdHVmZiAqLworCWluaXRfbmZzdjRfc3RhdGUoc2VydmVyKTsKKworCWlmIChkYXRhLT52ZXJzaW9uICE9IE5GU19NT1VOVF9WRVJTSU9OKSB7CisJCXByaW50aygibmZzIHdhcm5pbmc6IG1vdW50IHZlcnNpb24gJXMgdGhhbiBrZXJuZWxcbiIsCisJCQlkYXRhLT52ZXJzaW9uIDwgTkZTX01PVU5UX1ZFUlNJT04gPyAib2xkZXIiIDogIm5ld2VyIik7CisJCWlmIChkYXRhLT52ZXJzaW9uIDwgMikKKwkJCWRhdGEtPm5hbWxlbiA9IDA7CisJCWlmIChkYXRhLT52ZXJzaW9uIDwgMykKKwkJCWRhdGEtPmJzaXplICA9IDA7CisJCWlmIChkYXRhLT52ZXJzaW9uIDwgNCkgeworCQkJZGF0YS0+ZmxhZ3MgJj0gfk5GU19NT1VOVF9WRVIzOworCQkJZGF0YS0+cm9vdC5zaXplID0gTkZTMl9GSFNJWkU7CisJCQltZW1jcHkoZGF0YS0+cm9vdC5kYXRhLCBkYXRhLT5vbGRfcm9vdC5kYXRhLCBORlMyX0ZIU0laRSk7CisJCX0KKwkJaWYgKGRhdGEtPnZlcnNpb24gPCA1KQorCQkJZGF0YS0+ZmxhZ3MgJj0gfk5GU19NT1VOVF9TRUNGTEFWT1VSOworCX0KKworCXJvb3QgPSAmc2VydmVyLT5maDsKKwlpZiAoZGF0YS0+ZmxhZ3MgJiBORlNfTU9VTlRfVkVSMykKKwkJcm9vdC0+c2l6ZSA9IGRhdGEtPnJvb3Quc2l6ZTsKKwllbHNlCisJCXJvb3QtPnNpemUgPSBORlMyX0ZIU0laRTsKKwlpZiAocm9vdC0+c2l6ZSA+IHNpemVvZihyb290LT5kYXRhKSkgeworCQlwcmludGsoIm5mc19nZXRfc2I6IGludmFsaWQgcm9vdCBmaWxlaGFuZGxlXG4iKTsKKwkJa2ZyZWUoc2VydmVyKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCW1lbWNweShyb290LT5kYXRhLCBkYXRhLT5yb290LmRhdGEsIHJvb3QtPnNpemUpOworCisJLyogV2Ugbm93IHJlcXVpcmUgdGhhdCB0aGUgbW91bnQgcHJvY2VzcyBwYXNzZXMgdGhlIHJlbW90ZSBhZGRyZXNzICovCisJbWVtY3B5KCZzZXJ2ZXItPmFkZHIsICZkYXRhLT5hZGRyLCBzaXplb2Yoc2VydmVyLT5hZGRyKSk7CisJaWYgKHNlcnZlci0+YWRkci5zaW5fYWRkci5zX2FkZHIgPT0gSU5BRERSX0FOWSkgeworCQlwcmludGsoIk5GUzogbW91bnQgcHJvZ3JhbSBkaWRuJ3QgcGFzcyByZW1vdGUgYWRkcmVzcyFcbiIpOworCQlrZnJlZShzZXJ2ZXIpOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisKKwlzID0gc2dldChmc190eXBlLCBuZnNfY29tcGFyZV9zdXBlciwgbmZzX3NldF9zdXBlciwgc2VydmVyKTsKKworCWlmIChJU19FUlIocykgfHwgcy0+c19yb290KSB7CisJCWtmcmVlKHNlcnZlcik7CisJCXJldHVybiBzOworCX0KKworCXMtPnNfZmxhZ3MgPSBmbGFnczsKKworCS8qIEZpcmUgdXAgcnBjaW9kIGlmIG5vdCB5ZXQgcnVubmluZyAqLworCWlmIChycGNpb2RfdXAoKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5GUzogY291bGRuJ3Qgc3RhcnQgcnBjaW9kIVxuIik7CisJCWtmcmVlKHNlcnZlcik7CisJCXJldHVybiBFUlJfUFRSKC1FSU8pOworCX0KKworCWVycm9yID0gbmZzX2ZpbGxfc3VwZXIocywgZGF0YSwgZmxhZ3MgJiBNU19WRVJCT1NFID8gMSA6IDApOworCWlmIChlcnJvcikgeworCQl1cF93cml0ZSgmcy0+c191bW91bnQpOworCQlkZWFjdGl2YXRlX3N1cGVyKHMpOworCQlyZXR1cm4gRVJSX1BUUihlcnJvcik7CisJfQorCXMtPnNfZmxhZ3MgfD0gTVNfQUNUSVZFOworCXJldHVybiBzOworfQorCitzdGF0aWMgdm9pZCBuZnNfa2lsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCit7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IE5GU19TQihzKTsKKworCWtpbGxfYW5vbl9zdXBlcihzKTsKKworCWlmIChzZXJ2ZXItPmNsaWVudCAhPSBOVUxMICYmICFJU19FUlIoc2VydmVyLT5jbGllbnQpKQorCQlycGNfc2h1dGRvd25fY2xpZW50KHNlcnZlci0+Y2xpZW50KTsKKwlpZiAoc2VydmVyLT5jbGllbnRfc3lzICE9IE5VTEwgJiYgIUlTX0VSUihzZXJ2ZXItPmNsaWVudF9zeXMpKQorCQlycGNfc2h1dGRvd25fY2xpZW50KHNlcnZlci0+Y2xpZW50X3N5cyk7CisKKwlpZiAoIShzZXJ2ZXItPmZsYWdzICYgTkZTX01PVU5UX05PTkxNKSkKKwkJbG9ja2RfZG93bigpOwkvKiByZWxlYXNlIHJwYy5sb2NrZCAqLworCisJcnBjaW9kX2Rvd24oKTsJCS8qIHJlbGVhc2UgcnBjaW9kICovCisKKwlpZiAoc2VydmVyLT5ob3N0bmFtZSAhPSBOVUxMKQorCQlrZnJlZShzZXJ2ZXItPmhvc3RuYW1lKTsKKwlrZnJlZShzZXJ2ZXIpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgbmZzX2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJuZnMiLAorCS5nZXRfc2IJCT0gbmZzX2dldF9zYiwKKwkua2lsbF9zYgk9IG5mc19raWxsX3N1cGVyLAorCS5mc19mbGFncwk9IEZTX09ERF9SRU5BTUV8RlNfUkVWQUxfRE9UfEZTX0JJTkFSWV9NT1VOVERBVEEsCit9OworCisjaWZkZWYgQ09ORklHX05GU19WNAorCitzdGF0aWMgdm9pZCBuZnM0X2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKKworCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgbmZzNF9zb3BzID0geyAKKwkuYWxsb2NfaW5vZGUJPSBuZnNfYWxsb2NfaW5vZGUsCisJLmRlc3Ryb3lfaW5vZGUJPSBuZnNfZGVzdHJveV9pbm9kZSwKKwkud3JpdGVfaW5vZGUJPSBuZnNfd3JpdGVfaW5vZGUsCisJLmRlbGV0ZV9pbm9kZQk9IG5mc19kZWxldGVfaW5vZGUsCisJLnN0YXRmcwkJPSBuZnNfc3RhdGZzLAorCS5jbGVhcl9pbm9kZQk9IG5mczRfY2xlYXJfaW5vZGUsCisJLnVtb3VudF9iZWdpbgk9IG5mc191bW91bnRfYmVnaW4sCisJLnNob3dfb3B0aW9ucwk9IG5mc19zaG93X29wdGlvbnMsCit9OworCisvKgorICogQ2xlYW4gb3V0IGFueSByZW1haW5pbmcgTkZTdjQgc3RhdGUgdGhhdCBtaWdodCBiZSBsZWZ0IG92ZXIgZHVlCisgKiB0byBvcGVuKCkgY2FsbHMgdGhhdCBwYXNzZWQgbmZzX2F0b21pY19sb29rdXAsIGJ1dCBmYWlsZWQgdG8gY2FsbAorICogbmZzX29wZW4oKS4KKyAqLworc3RhdGljIHZvaWQgbmZzNF9jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CisKKwkvKiBJZiB3ZSBhcmUgaG9sZGluZyBhIGRlbGVnYXRpb24sIHJldHVybiBpdCEgKi8KKwlpZiAobmZzaS0+ZGVsZWdhdGlvbiAhPSBOVUxMKQorCQluZnNfaW5vZGVfcmV0dXJuX2RlbGVnYXRpb24oaW5vZGUpOworCS8qIEZpcnN0IGNhbGwgc3RhbmRhcmQgTkZTIGNsZWFyX2lub2RlKCkgY29kZSAqLworCW5mc19jbGVhcl9pbm9kZShpbm9kZSk7CisJLyogTm93IGNsZWFyIG91dCBhbnkgcmVtYWluaW5nIHN0YXRlICovCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZuZnNpLT5vcGVuX3N0YXRlcykpIHsKKwkJc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlOworCQkKKwkJc3RhdGUgPSBsaXN0X2VudHJ5KG5mc2ktPm9wZW5fc3RhdGVzLm5leHQsCisJCQkJc3RydWN0IG5mczRfc3RhdGUsCisJCQkJaW5vZGVfc3RhdGVzKTsKKwkJZHByaW50aygiJXMoJXMvJUxkKTogZm91bmQgdW5jbGFpbWVkIE5GU3Y0IHN0YXRlICVwXG4iLAorCQkJCV9fRlVOQ1RJT05fXywKKwkJCQlpbm9kZS0+aV9zYi0+c19pZCwKKwkJCQkobG9uZyBsb25nKU5GU19GSUxFSUQoaW5vZGUpLAorCQkJCXN0YXRlKTsKKwkJQlVHX09OKGF0b21pY19yZWFkKCZzdGF0ZS0+Y291bnQpICE9IDEpOworCQluZnM0X2Nsb3NlX3N0YXRlKHN0YXRlLCBzdGF0ZS0+c3RhdGUpOworCX0KK30KKworCitzdGF0aWMgaW50IG5mczRfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgbmZzNF9tb3VudF9kYXRhICpkYXRhLCBpbnQgc2lsZW50KQoreworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXI7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHAgPSBOVUxMOworCXN0cnVjdCBycGNfeHBydCAqeHBydCA9IE5VTEw7CisJc3RydWN0IHJwY19jbG50ICpjbG50ID0gTlVMTDsKKwlzdHJ1Y3QgcnBjX3RpbWVvdXQgdGltZXBhcm1zOworCXJwY19hdXRoZmxhdm9yX3QgYXV0aGZsYXZvdXI7CisJaW50IHByb3RvLCBlcnIgPSAtRUlPOworCisJc2ItPnNfYmxvY2tzaXplX2JpdHMgPSAwOworCXNiLT5zX2Jsb2Nrc2l6ZSA9IDA7CisJc2VydmVyID0gTkZTX1NCKHNiKTsKKwlpZiAoZGF0YS0+cnNpemUgIT0gMCkKKwkJc2VydmVyLT5yc2l6ZSA9IG5mc19ibG9ja19zaXplKGRhdGEtPnJzaXplLCBOVUxMKTsKKwlpZiAoZGF0YS0+d3NpemUgIT0gMCkKKwkJc2VydmVyLT53c2l6ZSA9IG5mc19ibG9ja19zaXplKGRhdGEtPndzaXplLCBOVUxMKTsKKwlzZXJ2ZXItPmZsYWdzID0gZGF0YS0+ZmxhZ3MgJiBORlNfTU9VTlRfRkxBR01BU0s7CisJc2VydmVyLT5jYXBzID0gTkZTX0NBUF9BVE9NSUNfT1BFTjsKKworCXNlcnZlci0+YWNyZWdtaW4gPSBkYXRhLT5hY3JlZ21pbipIWjsKKwlzZXJ2ZXItPmFjcmVnbWF4ID0gZGF0YS0+YWNyZWdtYXgqSFo7CisJc2VydmVyLT5hY2Rpcm1pbiA9IGRhdGEtPmFjZGlybWluKkhaOworCXNlcnZlci0+YWNkaXJtYXggPSBkYXRhLT5hY2Rpcm1heCpIWjsKKworCXNlcnZlci0+cnBjX29wcyA9ICZuZnNfdjRfY2xpZW50b3BzOworCS8qIEluaXRpYWxpemUgdGltZW91dCB2YWx1ZXMgKi8KKworCXRpbWVwYXJtcy50b19pbml0dmFsID0gZGF0YS0+dGltZW8gKiBIWiAvIDEwOworCXRpbWVwYXJtcy50b19yZXRyaWVzID0gZGF0YS0+cmV0cmFuczsKKwl0aW1lcGFybXMudG9fZXhwb25lbnRpYWwgPSAxOworCWlmICghdGltZXBhcm1zLnRvX3JldHJpZXMpCisJCXRpbWVwYXJtcy50b19yZXRyaWVzID0gNTsKKworCXByb3RvID0gZGF0YS0+cHJvdG87CisJLyogV2hpY2ggSVAgcHJvdG9jb2wgZG8gd2UgdXNlPyAqLworCXN3aXRjaCAocHJvdG8pIHsKKwljYXNlIElQUFJPVE9fVENQOgorCQl0aW1lcGFybXMudG9fbWF4dmFsICA9IFJQQ19NQVhfVENQX1RJTUVPVVQ7CisJCWlmICghdGltZXBhcm1zLnRvX2luaXR2YWwpCisJCQl0aW1lcGFybXMudG9faW5pdHZhbCA9IDYwMCAqIEhaIC8gMTA7CisJCWJyZWFrOworCWNhc2UgSVBQUk9UT19VRFA6CisJCXRpbWVwYXJtcy50b19tYXh2YWwgID0gUlBDX01BWF9VRFBfVElNRU9VVDsKKwkJaWYgKCF0aW1lcGFybXMudG9faW5pdHZhbCkKKwkJCXRpbWVwYXJtcy50b19pbml0dmFsID0gMTEgKiBIWiAvIDEwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljbHAgPSBuZnM0X2dldF9jbGllbnQoJnNlcnZlci0+YWRkci5zaW5fYWRkcik7CisJaWYgKCFjbHApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTkZTOiBmYWlsZWQgdG8gY3JlYXRlIE5GUzQgY2xpZW50LlxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIE5vdyBjcmVhdGUgdHJhbnNwb3J0IGFuZCBjbGllbnQgKi8KKwlhdXRoZmxhdm91ciA9IFJQQ19BVVRIX1VOSVg7CisJaWYgKGRhdGEtPmF1dGhfZmxhdm91cmxlbiAhPSAwKSB7CisJCWlmIChkYXRhLT5hdXRoX2ZsYXZvdXJsZW4gPiAxKQorCQkJcHJpbnRrKEtFUk5fSU5GTyAiTkZTOiBjYW5ub3QgeWV0IGRlYWwgd2l0aCBtdWx0aXBsZSBhdXRoIGZsYXZvdXJzLlxuIik7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmYXV0aGZsYXZvdXIsIGRhdGEtPmF1dGhfZmxhdm91cnMsIHNpemVvZihhdXRoZmxhdm91cikpKSB7CisJCQllcnIgPSAtRUZBVUxUOworCQkJZ290byBvdXRfZmFpbDsKKwkJfQorCX0KKworCWRvd25fd3JpdGUoJmNscC0+Y2xfc2VtKTsKKwlpZiAoY2xwLT5jbF9ycGNjbGllbnQgPT0gTlVMTCkgeworCQl4cHJ0ID0geHBydF9jcmVhdGVfcHJvdG8ocHJvdG8sICZzZXJ2ZXItPmFkZHIsICZ0aW1lcGFybXMpOworCQlpZiAoSVNfRVJSKHhwcnQpKSB7CisJCQl1cF93cml0ZSgmY2xwLT5jbF9zZW0pOworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTkZTOiBjYW5ub3QgY3JlYXRlIFJQQyB0cmFuc3BvcnQuXG4iKTsKKwkJCWVyciA9IFBUUl9FUlIoeHBydCk7CisJCQlnb3RvIG91dF9mYWlsOworCQl9CisJCWNsbnQgPSBycGNfY3JlYXRlX2NsaWVudCh4cHJ0LCBzZXJ2ZXItPmhvc3RuYW1lLCAmbmZzX3Byb2dyYW0sCisJCQkJc2VydmVyLT5ycGNfb3BzLT52ZXJzaW9uLCBhdXRoZmxhdm91cik7CisJCWlmIChJU19FUlIoY2xudCkpIHsKKwkJCXVwX3dyaXRlKCZjbHAtPmNsX3NlbSk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJORlM6IGNhbm5vdCBjcmVhdGUgUlBDIGNsaWVudC5cbiIpOworCQkJeHBydF9kZXN0cm95KHhwcnQpOworCQkJZXJyID0gUFRSX0VSUihjbG50KTsKKwkJCWdvdG8gb3V0X2ZhaWw7CisJCX0KKwkJY2xudC0+Y2xfaW50ciAgICAgPSAxOworCQljbG50LT5jbF9zb2Z0cnRyeSA9IDE7CisJCWNsbnQtPmNsX2NoYXR0eSAgID0gMTsKKwkJY2xwLT5jbF9ycGNjbGllbnQgPSBjbG50OworCQljbHAtPmNsX2NyZWQgPSBycGNhdXRoX2xvb2t1cGNyZWQoY2xudC0+Y2xfYXV0aCwgMCk7CisJCWlmIChJU19FUlIoY2xwLT5jbF9jcmVkKSkgeworCQkJdXBfd3JpdGUoJmNscC0+Y2xfc2VtKTsKKwkJCWVyciA9IFBUUl9FUlIoY2xwLT5jbF9jcmVkKTsKKwkJCWNscC0+Y2xfY3JlZCA9IE5VTEw7CisJCQlnb3RvIG91dF9mYWlsOworCQl9CisJCW1lbWNweShjbHAtPmNsX2lwYWRkciwgc2VydmVyLT5pcF9hZGRyLCBzaXplb2YoY2xwLT5jbF9pcGFkZHIpKTsKKwkJbmZzX2lkbWFwX25ldyhjbHApOworCX0KKwlpZiAobGlzdF9lbXB0eSgmY2xwLT5jbF9zdXBlcmJsb2NrcykpIHsKKwkJZXJyID0gbmZzNF9pbml0X2NsaWVudChjbHApOworCQlpZiAoZXJyICE9IDApIHsKKwkJCXVwX3dyaXRlKCZjbHAtPmNsX3NlbSk7CisJCQlnb3RvIG91dF9mYWlsOworCQl9CisJfQorCWxpc3RfYWRkX3RhaWwoJnNlcnZlci0+bmZzNF9zaWJsaW5ncywgJmNscC0+Y2xfc3VwZXJibG9ja3MpOworCWNsbnQgPSBycGNfY2xvbmVfY2xpZW50KGNscC0+Y2xfcnBjY2xpZW50KTsKKwlpZiAoIUlTX0VSUihjbG50KSkKKwkJCXNlcnZlci0+bmZzNF9zdGF0ZSA9IGNscDsKKwl1cF93cml0ZSgmY2xwLT5jbF9zZW0pOworCWNscCA9IE5VTEw7CisKKwlpZiAoSVNfRVJSKGNsbnQpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5GUzogY2Fubm90IGNyZWF0ZSBSUEMgY2xpZW50LlxuIik7CisJCXJldHVybiBQVFJfRVJSKGNsbnQpOworCX0KKworCXNlcnZlci0+Y2xpZW50ICAgID0gY2xudDsKKworCWlmIChzZXJ2ZXItPm5mczRfc3RhdGUtPmNsX2lkbWFwID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTkZTOiBmYWlsZWQgdG8gY3JlYXRlIGlkbWFwcGVyLlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChjbG50LT5jbF9hdXRoLT5hdV9mbGF2b3IgIT0gYXV0aGZsYXZvdXIpIHsKKwkJaWYgKHJwY2F1dGhfY3JlYXRlKGF1dGhmbGF2b3VyLCBjbG50KSA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJORlM6IGNvdWxkbid0IGNyZWF0ZSBjcmVkY2FjaGUhXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCisJc2ItPnNfdGltZV9ncmFuID0gMTsKKworCXNiLT5zX29wID0gJm5mczRfc29wczsKKwllcnIgPSBuZnNfc2JfaW5pdChzYiwgYXV0aGZsYXZvdXIpOworCWlmIChlcnIgPT0gMCkKKwkJcmV0dXJuIDA7CitvdXRfZmFpbDoKKwlpZiAoY2xwKQorCQluZnM0X3B1dF9jbGllbnQoY2xwKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG5mczRfY29tcGFyZV9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBkYXRhOworCXN0cnVjdCBuZnNfc2VydmVyICpvbGQgPSBORlNfU0Ioc2IpOworCisJaWYgKHN0cmNtcChzZXJ2ZXItPmhvc3RuYW1lLCBvbGQtPmhvc3RuYW1lKSAhPSAwKQorCQlyZXR1cm4gMDsKKwlpZiAoc3RyY21wKHNlcnZlci0+bW50X3BhdGgsIG9sZC0+bW50X3BhdGgpICE9IDApCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCAqCituZnNfY29weV91c2VyX3N0cmluZyhjaGFyICpkc3QsIHN0cnVjdCBuZnNfc3RyaW5nICpzcmMsIGludCBtYXhsZW4pCit7CisJdm9pZCAqcCA9IE5VTEw7CisKKwlpZiAoIXNyYy0+bGVuKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwlpZiAoc3JjLT5sZW4gPCBtYXhsZW4pCisJCW1heGxlbiA9IHNyYy0+bGVuOworCWlmIChkc3QgPT0gTlVMTCkgeworCQlwID0gZHN0ID0ga21hbGxvYyhtYXhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHAgPT0gTlVMTCkKKwkJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKwlpZiAoY29weV9mcm9tX3VzZXIoZHN0LCBzcmMtPmRhdGEsIG1heGxlbikpIHsKKwkJaWYgKHAgIT0gTlVMTCkKKwkJCWtmcmVlKHApOworCQlyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTsKKwl9CisJZHN0W21heGxlbl0gPSAnXDAnOworCXJldHVybiBkc3Q7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKm5mczRfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKnJhd19kYXRhKQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyOworCXN0cnVjdCBzdXBlcl9ibG9jayAqczsKKwlzdHJ1Y3QgbmZzNF9tb3VudF9kYXRhICpkYXRhID0gcmF3X2RhdGE7CisJdm9pZCAqcDsKKworCWlmICghZGF0YSkgeworCQlwcmludGsoIm5mc19yZWFkX3N1cGVyOiBtaXNzaW5nIGRhdGEgYXJndW1lbnRcbiIpOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisKKwlzZXJ2ZXIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbmZzX3NlcnZlciksIEdGUF9LRVJORUwpOworCWlmICghc2VydmVyKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwltZW1zZXQoc2VydmVyLCAwLCBzaXplb2Yoc3RydWN0IG5mc19zZXJ2ZXIpKTsKKwkvKiBaZXJvIG91dCB0aGUgTkZTIHN0YXRlIHN0dWZmICovCisJaW5pdF9uZnN2NF9zdGF0ZShzZXJ2ZXIpOworCisJaWYgKGRhdGEtPnZlcnNpb24gIT0gTkZTNF9NT1VOVF9WRVJTSU9OKSB7CisJCXByaW50aygibmZzIHdhcm5pbmc6IG1vdW50IHZlcnNpb24gJXMgdGhhbiBrZXJuZWxcbiIsCisJCQlkYXRhLT52ZXJzaW9uIDwgTkZTNF9NT1VOVF9WRVJTSU9OID8gIm9sZGVyIiA6ICJuZXdlciIpOworCX0KKworCXAgPSBuZnNfY29weV91c2VyX3N0cmluZyhOVUxMLCAmZGF0YS0+aG9zdG5hbWUsIDI1Nik7CisJaWYgKElTX0VSUihwKSkKKwkJZ290byBvdXRfZXJyOworCXNlcnZlci0+aG9zdG5hbWUgPSBwOworCisJcCA9IG5mc19jb3B5X3VzZXJfc3RyaW5nKE5VTEwsICZkYXRhLT5tbnRfcGF0aCwgMTAyNCk7CisJaWYgKElTX0VSUihwKSkKKwkJZ290byBvdXRfZXJyOworCXNlcnZlci0+bW50X3BhdGggPSBwOworCisJcCA9IG5mc19jb3B5X3VzZXJfc3RyaW5nKHNlcnZlci0+aXBfYWRkciwgJmRhdGEtPmNsaWVudF9hZGRyLAorCQkJc2l6ZW9mKHNlcnZlci0+aXBfYWRkcikgLSAxKTsKKwlpZiAoSVNfRVJSKHApKQorCQlnb3RvIG91dF9lcnI7CisKKwkvKiBXZSBub3cgcmVxdWlyZSB0aGF0IHRoZSBtb3VudCBwcm9jZXNzIHBhc3NlcyB0aGUgcmVtb3RlIGFkZHJlc3MgKi8KKwlpZiAoZGF0YS0+aG9zdF9hZGRybGVuICE9IHNpemVvZihzZXJ2ZXItPmFkZHIpKSB7CisJCXMgPSBFUlJfUFRSKC1FSU5WQUwpOworCQlnb3RvIG91dF9mcmVlOworCX0KKwlpZiAoY29weV9mcm9tX3VzZXIoJnNlcnZlci0+YWRkciwgZGF0YS0+aG9zdF9hZGRyLCBzaXplb2Yoc2VydmVyLT5hZGRyKSkpIHsKKwkJcyA9IEVSUl9QVFIoLUVGQVVMVCk7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCWlmIChzZXJ2ZXItPmFkZHIuc2luX2ZhbWlseSAhPSBBRl9JTkVUIHx8CisJICAgIHNlcnZlci0+YWRkci5zaW5fYWRkci5zX2FkZHIgPT0gSU5BRERSX0FOWSkgeworCQlwcmludGsoIk5GUzogbW91bnQgcHJvZ3JhbSBkaWRuJ3QgcGFzcyByZW1vdGUgSVAgYWRkcmVzcyFcbiIpOworCQlzID0gRVJSX1BUUigtRUlOVkFMKTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlzID0gc2dldChmc190eXBlLCBuZnM0X2NvbXBhcmVfc3VwZXIsIG5mc19zZXRfc3VwZXIsIHNlcnZlcik7CisKKwlpZiAoSVNfRVJSKHMpIHx8IHMtPnNfcm9vdCkKKwkJZ290byBvdXRfZnJlZTsKKworCXMtPnNfZmxhZ3MgPSBmbGFnczsKKworCS8qIEZpcmUgdXAgcnBjaW9kIGlmIG5vdCB5ZXQgcnVubmluZyAqLworCWlmIChycGNpb2RfdXAoKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5GUzogY291bGRuJ3Qgc3RhcnQgcnBjaW9kIVxuIik7CisJCXMgPSBFUlJfUFRSKC1FSU8pOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCWVycm9yID0gbmZzNF9maWxsX3N1cGVyKHMsIGRhdGEsIGZsYWdzICYgTVNfVkVSQk9TRSA/IDEgOiAwKTsKKwlpZiAoZXJyb3IpIHsKKwkJdXBfd3JpdGUoJnMtPnNfdW1vdW50KTsKKwkJZGVhY3RpdmF0ZV9zdXBlcihzKTsKKwkJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOworCX0KKwlzLT5zX2ZsYWdzIHw9IE1TX0FDVElWRTsKKwlyZXR1cm4gczsKK291dF9lcnI6CisJcyA9IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKilwOworb3V0X2ZyZWU6CisJaWYgKHNlcnZlci0+bW50X3BhdGgpCisJCWtmcmVlKHNlcnZlci0+bW50X3BhdGgpOworCWlmIChzZXJ2ZXItPmhvc3RuYW1lKQorCQlrZnJlZShzZXJ2ZXItPmhvc3RuYW1lKTsKKwlrZnJlZShzZXJ2ZXIpOworCXJldHVybiBzOworfQorCitzdGF0aWMgdm9pZCBuZnM0X2tpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NCKHNiKTsKKworCW5mc19yZXR1cm5fYWxsX2RlbGVnYXRpb25zKHNiKTsKKwlraWxsX2Fub25fc3VwZXIoc2IpOworCisJbmZzNF9yZW5ld2RfcHJlcGFyZV9zaHV0ZG93bihzZXJ2ZXIpOworCisJaWYgKHNlcnZlci0+Y2xpZW50ICE9IE5VTEwgJiYgIUlTX0VSUihzZXJ2ZXItPmNsaWVudCkpCisJCXJwY19zaHV0ZG93bl9jbGllbnQoc2VydmVyLT5jbGllbnQpOworCXJwY2lvZF9kb3duKCk7CQkvKiByZWxlYXNlIHJwY2lvZCAqLworCisJZGVzdHJveV9uZnN2NF9zdGF0ZShzZXJ2ZXIpOworCisJaWYgKHNlcnZlci0+aG9zdG5hbWUgIT0gTlVMTCkKKwkJa2ZyZWUoc2VydmVyLT5ob3N0bmFtZSk7CisJa2ZyZWUoc2VydmVyKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIG5mczRfZnNfdHlwZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gIm5mczQiLAorCS5nZXRfc2IJCT0gbmZzNF9nZXRfc2IsCisJLmtpbGxfc2IJPSBuZnM0X2tpbGxfc3VwZXIsCisJLmZzX2ZsYWdzCT0gRlNfT0REX1JFTkFNRXxGU19SRVZBTF9ET1R8RlNfQklOQVJZX01PVU5UREFUQSwKK307CisKKyNkZWZpbmUgbmZzNF9pbml0X29uY2UobmZzaSkgXAorCWRvIHsgXAorCQlJTklUX0xJU1RfSEVBRCgmKG5mc2kpLT5vcGVuX3N0YXRlcyk7IFwKKwkJbmZzaS0+ZGVsZWdhdGlvbiA9IE5VTEw7IFwKKwkJbmZzaS0+ZGVsZWdhdGlvbl9zdGF0ZSA9IDA7IFwKKwkJaW5pdF9yd3NlbSgmbmZzaS0+cndzZW0pOyBcCisJfSB3aGlsZSgwKQorI2RlZmluZSByZWdpc3Rlcl9uZnM0ZnMoKSByZWdpc3Rlcl9maWxlc3lzdGVtKCZuZnM0X2ZzX3R5cGUpCisjZGVmaW5lIHVucmVnaXN0ZXJfbmZzNGZzKCkgdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZuZnM0X2ZzX3R5cGUpCisjZWxzZQorI2RlZmluZSBuZnM0X2luaXRfb25jZShuZnNpKSBcCisJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSByZWdpc3Rlcl9uZnM0ZnMoKSAoMCkKKyNkZWZpbmUgdW5yZWdpc3Rlcl9uZnM0ZnMoKQorI2VuZGlmCisKK2V4dGVybiBpbnQgbmZzX2luaXRfbmZzcGFnZWNhY2hlKHZvaWQpOworZXh0ZXJuIHZvaWQgbmZzX2Rlc3Ryb3lfbmZzcGFnZWNhY2hlKHZvaWQpOworZXh0ZXJuIGludCBuZnNfaW5pdF9yZWFkcGFnZWNhY2hlKHZvaWQpOworZXh0ZXJuIHZvaWQgbmZzX2Rlc3Ryb3lfcmVhZHBhZ2VjYWNoZSh2b2lkKTsKK2V4dGVybiBpbnQgbmZzX2luaXRfd3JpdGVwYWdlY2FjaGUodm9pZCk7CitleHRlcm4gdm9pZCBuZnNfZGVzdHJveV93cml0ZXBhZ2VjYWNoZSh2b2lkKTsKKyNpZmRlZiBDT05GSUdfTkZTX0RJUkVDVElPCitleHRlcm4gaW50IG5mc19pbml0X2RpcmVjdGNhY2hlKHZvaWQpOworZXh0ZXJuIHZvaWQgbmZzX2Rlc3Ryb3lfZGlyZWN0Y2FjaGUodm9pZCk7CisjZW5kaWYKKworc3RhdGljIGttZW1fY2FjaGVfdCAqIG5mc19pbm9kZV9jYWNoZXA7CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKm5mc19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2k7CisJbmZzaSA9IChzdHJ1Y3QgbmZzX2lub2RlICopa21lbV9jYWNoZV9hbGxvYyhuZnNfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJaWYgKCFuZnNpKQorCQlyZXR1cm4gTlVMTDsKKwluZnNpLT5mbGFncyA9IDA7CisJcmV0dXJuICZuZnNpLT52ZnNfaW5vZGU7Cit9CisKK3N0YXRpYyB2b2lkIG5mc19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJa21lbV9jYWNoZV9mcmVlKG5mc19pbm9kZV9jYWNoZXAsIE5GU19JKGlub2RlKSk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICogZm9vLCBrbWVtX2NhY2hlX3QgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IChzdHJ1Y3QgbmZzX2lub2RlICopIGZvbzsKKworCWlmICgoZmxhZ3MgJiAoU0xBQl9DVE9SX1ZFUklGWXxTTEFCX0NUT1JfQ09OU1RSVUNUT1IpKSA9PQorCSAgICBTTEFCX0NUT1JfQ09OU1RSVUNUT1IpIHsKKwkJaW5vZGVfaW5pdF9vbmNlKCZuZnNpLT52ZnNfaW5vZGUpOworCQlzcGluX2xvY2tfaW5pdCgmbmZzaS0+cmVxX2xvY2spOworCQlJTklUX0xJU1RfSEVBRCgmbmZzaS0+ZGlydHkpOworCQlJTklUX0xJU1RfSEVBRCgmbmZzaS0+Y29tbWl0KTsKKwkJSU5JVF9MSVNUX0hFQUQoJm5mc2ktPm9wZW5fZmlsZXMpOworCQlJTklUX1JBRElYX1RSRUUoJm5mc2ktPm5mc19wYWdlX3RyZWUsIEdGUF9BVE9NSUMpOworCQlhdG9taWNfc2V0KCZuZnNpLT5kYXRhX3VwZGF0ZXMsIDApOworCQluZnNpLT5uZGlydHkgPSAwOworCQluZnNpLT5uY29tbWl0ID0gMDsKKwkJbmZzaS0+bnBhZ2VzID0gMDsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmbmZzaS0+bmZzX2lfd2FpdCk7CisJCW5mczRfaW5pdF9vbmNlKG5mc2kpOworCX0KK30KKyAKK2ludCBuZnNfaW5pdF9pbm9kZWNhY2hlKHZvaWQpCit7CisJbmZzX2lub2RlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJuZnNfaW5vZGVfY2FjaGUiLAorCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgbmZzX2lub2RlKSwKKwkJCQkJICAgICAwLCBTTEFCX1JFQ0xBSU1fQUNDT1VOVCwKKwkJCQkJICAgICBpbml0X29uY2UsIE5VTEwpOworCWlmIChuZnNfaW5vZGVfY2FjaGVwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbmZzX2Rlc3Ryb3lfaW5vZGVjYWNoZSh2b2lkKQoreworCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3kobmZzX2lub2RlX2NhY2hlcCkpCisJCXByaW50ayhLRVJOX0lORk8gIm5mc19pbm9kZV9jYWNoZTogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOworfQorCisvKgorICogSW5pdGlhbGl6ZSBORlMKKyAqLworc3RhdGljIGludCBfX2luaXQgaW5pdF9uZnNfZnModm9pZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gbmZzX2luaXRfbmZzcGFnZWNhY2hlKCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ0OworCisJZXJyID0gbmZzX2luaXRfaW5vZGVjYWNoZSgpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MzsKKworCWVyciA9IG5mc19pbml0X3JlYWRwYWdlY2FjaGUoKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDI7CisKKwllcnIgPSBuZnNfaW5pdF93cml0ZXBhZ2VjYWNoZSgpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MTsKKworI2lmZGVmIENPTkZJR19ORlNfRElSRUNUSU8KKwllcnIgPSBuZnNfaW5pdF9kaXJlY3RjYWNoZSgpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MDsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwlycGNfcHJvY19yZWdpc3RlcigmbmZzX3JwY3N0YXQpOworI2VuZGlmCisgICAgICAgIGVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJm5mc19mc190eXBlKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwlpZiAoKGVyciA9IHJlZ2lzdGVyX25mczRmcygpKSAhPSAwKQorCQlnb3RvIG91dDsKKwlyZXR1cm4gMDsKK291dDoKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCXJwY19wcm9jX3VucmVnaXN0ZXIoIm5mcyIpOworI2VuZGlmCisJbmZzX2Rlc3Ryb3lfd3JpdGVwYWdlY2FjaGUoKTsKKyNpZmRlZiBDT05GSUdfTkZTX0RJUkVDVElPCitvdXQwOgorCW5mc19kZXN0cm95X2RpcmVjdGNhY2hlKCk7CisjZW5kaWYKK291dDE6CisJbmZzX2Rlc3Ryb3lfcmVhZHBhZ2VjYWNoZSgpOworb3V0MjoKKwluZnNfZGVzdHJveV9pbm9kZWNhY2hlKCk7CitvdXQzOgorCW5mc19kZXN0cm95X25mc3BhZ2VjYWNoZSgpOworb3V0NDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9uZnNfZnModm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfTkZTX0RJUkVDVElPCisJbmZzX2Rlc3Ryb3lfZGlyZWN0Y2FjaGUoKTsKKyNlbmRpZgorCW5mc19kZXN0cm95X3dyaXRlcGFnZWNhY2hlKCk7CisJbmZzX2Rlc3Ryb3lfcmVhZHBhZ2VjYWNoZSgpOworCW5mc19kZXN0cm95X2lub2RlY2FjaGUoKTsKKwluZnNfZGVzdHJveV9uZnNwYWdlY2FjaGUoKTsKKyNpZmRlZiBDT05GSUdfUFJPQ19GUworCXJwY19wcm9jX3VucmVnaXN0ZXIoIm5mcyIpOworI2VuZGlmCisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZuZnNfZnNfdHlwZSk7CisJdW5yZWdpc3Rlcl9uZnM0ZnMoKTsKK30KKworLyogTm90IHF1aXRlIHRydWU7IEkganVzdCBtYWludGFpbiBpdCAqLworTU9EVUxFX0FVVEhPUigiT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGluaXRfbmZzX2ZzKQorbW9kdWxlX2V4aXQoZXhpdF9uZnNfZnMpCmRpZmYgLS1naXQgYS9mcy9uZnMvbW91bnRfY2xudC5jIGIvZnMvbmZzL21vdW50X2NsbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDNkZGFkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzL21vdW50X2NsbnQuYwpAQCAtMCwwICsxLDE4MyBAQAorLyoKKyAqIGxpbnV4L2ZzL25mcy9tb3VudF9jbG50LmMKKyAqCisgKiBNT1VOVCBjbGllbnQgdG8gc3VwcG9ydCBORlNyb290LgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NywgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3hwcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KKworI2lmZGVmIFJQQ19ERUJVRworIyBkZWZpbmUgTkZTREJHX0ZBQ0lMSVRZCU5GU0RCR19ST09UCisjZW5kaWYKKworLyoKKyNkZWZpbmUgTU9VTlRfUFJPR1JBTQkJMTAwMDA1CisjZGVmaW5lIE1PVU5UX1ZFUlNJT04JCTEKKyNkZWZpbmUgTU9VTlRfTU5UCQkxCisjZGVmaW5lIE1PVU5UX1VNTlQJCTMKKyAqLworCitzdGF0aWMgc3RydWN0IHJwY19jbG50ICoJbW50X2NyZWF0ZShjaGFyICosIHN0cnVjdCBzb2NrYWRkcl9pbiAqLAorCQkJCQkJCQlpbnQsIGludCk7CitzdGF0aWMgc3RydWN0IHJwY19wcm9ncmFtCW1udF9wcm9ncmFtOworCitzdHJ1Y3QgbW50X2Zoc3RhdHVzIHsKKwl1bnNpZ25lZCBpbnQJCXN0YXR1czsKKwlzdHJ1Y3QgbmZzX2ZoICoJCWZoOworfTsKKworLyoKKyAqIE9idGFpbiBhbiBORlMgZmlsZSBoYW5kbGUgZm9yIHRoZSBnaXZlbiBob3N0IGFuZCBwYXRoCisgKi8KK2ludAorbmZzcm9vdF9tb3VudChzdHJ1Y3Qgc29ja2FkZHJfaW4gKmFkZHIsIGNoYXIgKnBhdGgsIHN0cnVjdCBuZnNfZmggKmZoLAorCQlpbnQgdmVyc2lvbiwgaW50IHByb3RvY29sKQoreworCXN0cnVjdCBycGNfY2xudAkJKm1udF9jbG50OworCXN0cnVjdCBtbnRfZmhzdGF0dXMJcmVzdWx0ID0geworCQkuZmgJCT0gZmgKKwl9OworCWNoYXIJCQlob3N0bmFtZVszMl07CisJaW50CQkJc3RhdHVzOworCWludAkJCWNhbGw7CisKKwlkcHJpbnRrKCJORlM6ICAgICAgbmZzX21vdW50KCUwOHg6JXMpXG4iLAorCQkJKHVuc2lnbmVkKW50b2hsKGFkZHItPnNpbl9hZGRyLnNfYWRkciksIHBhdGgpOworCisJc3ByaW50Zihob3N0bmFtZSwgIiV1LiV1LiV1LiV1IiwgTklQUVVBRChhZGRyLT5zaW5fYWRkci5zX2FkZHIpKTsKKwltbnRfY2xudCA9IG1udF9jcmVhdGUoaG9zdG5hbWUsIGFkZHIsIHZlcnNpb24sIHByb3RvY29sKTsKKwlpZiAoSVNfRVJSKG1udF9jbG50KSkKKwkJcmV0dXJuIFBUUl9FUlIobW50X2NsbnQpOworCisJY2FsbCA9ICh2ZXJzaW9uID09IE5GU19NTlQzX1ZFUlNJT04pID8gTU9VTlRQUk9DM19NTlQgOiBNTlRQUk9DX01OVDsKKwlzdGF0dXMgPSBycGNfY2FsbChtbnRfY2xudCwgY2FsbCwgcGF0aCwgJnJlc3VsdCwgMCk7CisJcmV0dXJuIHN0YXR1cyA8IDA/IHN0YXR1cyA6IChyZXN1bHQuc3RhdHVzPyAtRUFDQ0VTIDogMCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcnBjX2NsbnQgKgorbW50X2NyZWF0ZShjaGFyICpob3N0bmFtZSwgc3RydWN0IHNvY2thZGRyX2luICpzcnZhZGRyLCBpbnQgdmVyc2lvbiwKKwkJaW50IHByb3RvY29sKQoreworCXN0cnVjdCBycGNfeHBydAkqeHBydDsKKwlzdHJ1Y3QgcnBjX2NsbnQJKmNsbnQ7CisKKwl4cHJ0ID0geHBydF9jcmVhdGVfcHJvdG8ocHJvdG9jb2wsIHNydmFkZHIsIE5VTEwpOworCWlmIChJU19FUlIoeHBydCkpCisJCXJldHVybiAoc3RydWN0IHJwY19jbG50ICopeHBydDsKKworCWNsbnQgPSBycGNfY3JlYXRlX2NsaWVudCh4cHJ0LCBob3N0bmFtZSwKKwkJCQkmbW50X3Byb2dyYW0sIHZlcnNpb24sCisJCQkJUlBDX0FVVEhfVU5JWCk7CisJaWYgKElTX0VSUihjbG50KSkgeworCQl4cHJ0X2Rlc3Ryb3koeHBydCk7CisJfSBlbHNlIHsKKwkJY2xudC0+Y2xfc29mdHJ0cnkgPSAxOworCQljbG50LT5jbF9jaGF0dHkgICA9IDE7CisJCWNsbnQtPmNsX29uZXNob3QgID0gMTsKKwkJY2xudC0+Y2xfaW50ciA9IDE7CisJfQorCXJldHVybiBjbG50OworfQorCisvKgorICogWERSIGVuY29kZS9kZWNvZGUgZnVuY3Rpb25zIGZvciBNT1VOVAorICovCitzdGF0aWMgaW50Cit4ZHJfZW5jb2RlX2RpcnBhdGgoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgY29uc3QgY2hhciAqcGF0aCkKK3sKKwlwID0geGRyX2VuY29kZV9zdHJpbmcocCwgcGF0aCk7CisKKwlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3hkcl9kZWNvZGVfZmhzdGF0dXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG1udF9maHN0YXR1cyAqcmVzKQoreworCXN0cnVjdCBuZnNfZmggKmZoID0gcmVzLT5maDsKKworCWlmICgocmVzLT5zdGF0dXMgPSBudG9obCgqcCsrKSkgPT0gMCkgeworCQlmaC0+c2l6ZSA9IE5GUzJfRkhTSVpFOworCQltZW1jcHkoZmgtPmRhdGEsIHAsIE5GUzJfRkhTSVpFKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3hkcl9kZWNvZGVfZmhzdGF0dXMzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBtbnRfZmhzdGF0dXMgKnJlcykKK3sKKwlzdHJ1Y3QgbmZzX2ZoICpmaCA9IHJlcy0+Zmg7CisKKwlpZiAoKHJlcy0+c3RhdHVzID0gbnRvaGwoKnArKykpID09IDApIHsKKwkJaW50IHNpemUgPSBudG9obCgqcCsrKTsKKwkJaWYgKHNpemUgPD0gTkZTM19GSFNJWkUpIHsKKwkJCWZoLT5zaXplID0gc2l6ZTsKKwkJCW1lbWNweShmaC0+ZGF0YSwgcCwgc2l6ZSk7CisJCX0gZWxzZQorCQkJcmVzLT5zdGF0dXMgPSAtRUJBREhBTkRMRTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTU5UX2RpcnBhdGhfc3oJCSgxICsgMjU2KQorI2RlZmluZSBNTlRfZmhzdGF0dXNfc3oJCSgxICsgOCkKKworc3RhdGljIHN0cnVjdCBycGNfcHJvY2luZm8JbW50X3Byb2NlZHVyZXNbXSA9IHsKK1tNTlRQUk9DX01OVF0gPSB7CisJICAucF9wcm9jCQk9IE1OVFBST0NfTU5ULAorCSAgLnBfZW5jb2RlCQk9IChreGRycHJvY190KSB4ZHJfZW5jb2RlX2RpcnBhdGgsCQorCSAgLnBfZGVjb2RlCQk9IChreGRycHJvY190KSB4ZHJfZGVjb2RlX2Zoc3RhdHVzLAorCSAgLnBfYnVmc2l6CQk9IE1OVF9kaXJwYXRoX3N6IDw8IDIsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcnBjX3Byb2NpbmZvIG1udDNfcHJvY2VkdXJlc1tdID0geworW01PVU5UUFJPQzNfTU5UXSA9IHsKKwkgIC5wX3Byb2MJCT0gTU9VTlRQUk9DM19NTlQsCisJICAucF9lbmNvZGUJCT0gKGt4ZHJwcm9jX3QpIHhkcl9lbmNvZGVfZGlycGF0aCwKKwkgIC5wX2RlY29kZQkJPSAoa3hkcnByb2NfdCkgeGRyX2RlY29kZV9maHN0YXR1czMsCisJICAucF9idWZzaXoJCT0gTU5UX2RpcnBhdGhfc3ogPDwgMiwKKwl9LAorfTsKKworCitzdGF0aWMgc3RydWN0IHJwY192ZXJzaW9uCW1udF92ZXJzaW9uMSA9IHsKKwkJLm51bWJlcgkJPSAxLAorCQkubnJwcm9jcyAJPSAyLAorCQkucHJvY3MgCQk9IG1udF9wcm9jZWR1cmVzCit9OworCitzdGF0aWMgc3RydWN0IHJwY192ZXJzaW9uICAgICAgIG1udF92ZXJzaW9uMyA9IHsKKwkJLm51bWJlcgkJPSAzLAorCQkubnJwcm9jcwk9IDIsCisJCS5wcm9jcwkJPSBtbnQzX3Byb2NlZHVyZXMKK307CisKK3N0YXRpYyBzdHJ1Y3QgcnBjX3ZlcnNpb24gKgltbnRfdmVyc2lvbltdID0geworCU5VTEwsCisJJm1udF92ZXJzaW9uMSwKKwlOVUxMLAorCSZtbnRfdmVyc2lvbjMsCit9OworCitzdGF0aWMgc3RydWN0IHJwY19zdGF0CQltbnRfc3RhdHM7CisKK3N0YXRpYyBzdHJ1Y3QgcnBjX3Byb2dyYW0JbW50X3Byb2dyYW0gPSB7CisJLm5hbWUJCT0gIm1vdW50IiwKKwkubnVtYmVyCQk9IE5GU19NTlRfUFJPR1JBTSwKKwkubnJ2ZXJzCQk9IHNpemVvZihtbnRfdmVyc2lvbikvc2l6ZW9mKG1udF92ZXJzaW9uWzBdKSwKKwkudmVyc2lvbgk9IG1udF92ZXJzaW9uLAorCS5zdGF0cwkJPSAmbW50X3N0YXRzLAorfTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnMyeGRyLmMgYi9mcy9uZnMvbmZzMnhkci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MWI2OTAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnMvbmZzMnhkci5jCkBAIC0wLDAgKzEsNzExIEBACisvKgorICogbGludXgvZnMvbmZzL25mczJ4ZHIuYworICoKKyAqIFhEUiBmdW5jdGlvbnMgdG8gZW5jb2RlL2RlY29kZSBORlMgUlBDIGFyZ3VtZW50cyBhbmQgcmVzdWx0cy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQgIFJpY2sgU2xhZGtleQorICogQ29weXJpZ2h0IChDKSAxOTk2IE9sYWYgS2lyY2gKKyAqIDA0IEF1ZyAxOTk4ICBJb24gQmFkdWxlc2N1IDxpb251dEBjcy5jb2x1bWJpYS5lZHU+CisgKiAJCUZJRk8ncyBuZWVkIHNwZWNpYWwgaGFuZGxpbmcgaW4gTkZTdjIKKyAqLworCisjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CisjaW5jbHVkZSA8bGludXgvbmZzLmg+CisjaW5jbHVkZSA8bGludXgvbmZzMi5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgorCisjZGVmaW5lIE5GU0RCR19GQUNJTElUWQkJTkZTREJHX1hEUgorLyogI2RlZmluZSBORlNfUEFSQU5PSUEgMSAqLworCitleHRlcm4gaW50CQkJbmZzX3N0YXRfdG9fZXJybm8oaW50IHN0YXQpOworCisvKiBNYXBwaW5nIGZyb20gTkZTIGVycm9yIGNvZGUgdG8gImVycm5vIiBlcnJvciBjb2RlLiAqLworI2RlZmluZSBlcnJub19ORlNFUlJfSU8JCUVJTworCisvKgorICogRGVjbGFyZSB0aGUgc3BhY2UgcmVxdWlyZW1lbnRzIGZvciBORlMgYXJndW1lbnRzIGFuZCByZXBsaWVzIGFzCisgKiBudW1iZXIgb2YgMzJiaXQtd29yZHMKKyAqLworI2RlZmluZSBORlNfZmhhbmRsZV9zegkJKDgpCisjZGVmaW5lIE5GU19zYXR0cl9zegkJKDgpCisjZGVmaW5lIE5GU19maWxlbmFtZV9zegkJKDErKE5GUzJfTUFYTkFNTEVOPj4yKSkKKyNkZWZpbmUgTkZTX3BhdGhfc3oJCSgxKyhORlMyX01BWFBBVEhMRU4+PjIpKQorI2RlZmluZSBORlNfZmF0dHJfc3oJCSgxNykKKyNkZWZpbmUgTkZTX2luZm9fc3oJCSg1KQorI2RlZmluZSBORlNfZW50cnlfc3oJCShORlNfZmlsZW5hbWVfc3orMykKKworI2RlZmluZSBORlNfZGlyb3BhcmdzX3N6CShORlNfZmhhbmRsZV9zeitORlNfZmlsZW5hbWVfc3opCisjZGVmaW5lIE5GU19zYXR0cmFyZ3Nfc3oJKE5GU19maGFuZGxlX3N6K05GU19zYXR0cl9zeikKKyNkZWZpbmUgTkZTX3JlYWRsaW5rYXJnc19zegkoTkZTX2ZoYW5kbGVfc3opCisjZGVmaW5lIE5GU19yZWFkYXJnc19zegkJKE5GU19maGFuZGxlX3N6KzMpCisjZGVmaW5lIE5GU193cml0ZWFyZ3Nfc3oJKE5GU19maGFuZGxlX3N6KzQpCisjZGVmaW5lIE5GU19jcmVhdGVhcmdzX3N6CShORlNfZGlyb3BhcmdzX3N6K05GU19zYXR0cl9zeikKKyNkZWZpbmUgTkZTX3JlbmFtZWFyZ3Nfc3oJKE5GU19kaXJvcGFyZ3Nfc3orTkZTX2Rpcm9wYXJnc19zeikKKyNkZWZpbmUgTkZTX2xpbmthcmdzX3N6CQkoTkZTX2ZoYW5kbGVfc3orTkZTX2Rpcm9wYXJnc19zeikKKyNkZWZpbmUgTkZTX3N5bWxpbmthcmdzX3N6CShORlNfZGlyb3BhcmdzX3N6K05GU19wYXRoX3N6K05GU19zYXR0cl9zeikKKyNkZWZpbmUgTkZTX3JlYWRkaXJhcmdzX3N6CShORlNfZmhhbmRsZV9zeisyKQorCisjZGVmaW5lIE5GU19hdHRyc3RhdF9zegkJKDErTkZTX2ZhdHRyX3N6KQorI2RlZmluZSBORlNfZGlyb3ByZXNfc3oJCSgxK05GU19maGFuZGxlX3N6K05GU19mYXR0cl9zeikKKyNkZWZpbmUgTkZTX3JlYWRsaW5rcmVzX3N6CSgyKQorI2RlZmluZSBORlNfcmVhZHJlc19zegkJKDErTkZTX2ZhdHRyX3N6KzEpCisjZGVmaW5lIE5GU193cml0ZXJlc19zeiAgICAgICAgIChORlNfYXR0cnN0YXRfc3opCisjZGVmaW5lIE5GU19zdGF0X3N6CQkoMSkKKyNkZWZpbmUgTkZTX3JlYWRkaXJyZXNfc3oJKDEpCisjZGVmaW5lIE5GU19zdGF0ZnNyZXNfc3oJKDErTkZTX2luZm9fc3opCisKKy8qCisgKiBDb21tb24gTkZTIFhEUiBmdW5jdGlvbnMgYXMgaW5saW5lcworICovCitzdGF0aWMgaW5saW5lIHUzMiAqCit4ZHJfZW5jb2RlX2ZoYW5kbGUodTMyICpwLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlKQoreworCW1lbWNweShwLCBmaGFuZGxlLT5kYXRhLCBORlMyX0ZIU0laRSk7CisJcmV0dXJuIHAgKyBYRFJfUVVBRExFTihORlMyX0ZIU0laRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyICoKK3hkcl9kZWNvZGVfZmhhbmRsZSh1MzIgKnAsIHN0cnVjdCBuZnNfZmggKmZoYW5kbGUpCit7CisJLyogTkZTdjIgaGFuZGxlcyBoYXZlIGEgZml4ZWQgbGVuZ3RoICovCisJZmhhbmRsZS0+c2l6ZSA9IE5GUzJfRkhTSVpFOworCW1lbWNweShmaGFuZGxlLT5kYXRhLCBwLCBORlMyX0ZIU0laRSk7CisJcmV0dXJuIHAgKyBYRFJfUVVBRExFTihORlMyX0ZIU0laRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyKgoreGRyX2VuY29kZV90aW1lKHUzMiAqcCwgc3RydWN0IHRpbWVzcGVjICp0aW1lcCkKK3sKKwkqcCsrID0gaHRvbmwodGltZXAtPnR2X3NlYyk7CisJLyogQ29udmVydCBuYW5vc2Vjb25kcyBpbnRvIG1pY3Jvc2Vjb25kcyAqLworCSpwKysgPSBodG9ubCh0aW1lcC0+dHZfbnNlYyA/IHRpbWVwLT50dl9uc2VjIC8gMTAwMCA6IDApOworCXJldHVybiBwOworfQorCitzdGF0aWMgaW5saW5lIHUzMioKK3hkcl9lbmNvZGVfY3VycmVudF9zZXJ2ZXJfdGltZSh1MzIgKnAsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXApCit7CisJLyoKKwkgKiBQYXNzaW5nIHRoZSBpbnZhbGlkIHZhbHVlIHVzZWNvbmRzPTEwMDAwMDAgaXMgYQorCSAqIFN1biBjb252ZW50aW9uIGZvciAic2V0IHRvIGN1cnJlbnQgc2VydmVyIHRpbWUiLgorCSAqIEl0J3MgbmVlZGVkIHRvIG1ha2UgcGVybWlzc2lvbnMgY2hlY2tzIGZvciB0aGUKKwkgKiAidG91Y2giIHByb2dyYW0gYWNyb3NzIHYyIG1vdW50cyB0byBTb2xhcmlzIGFuZAorCSAqIElyaXggYm94ZXMgd29yayBjb3JyZWN0bHkuIFNlZSBkZXNjcmlwdGlvbiBvZgorCSAqIHNhdHRyIGluIHNlY3Rpb24gNi4xIG9mICJORlMgSWxsdXN0cmF0ZWQiIGJ5CisJICogQnJlbnQgQ2FsbGFnaGFuLCBBZGRpc29uLVdlc2xleSwgSVNCTiAwLTIwMS0zMjc1MC01CisJICovCisJKnArKyA9IGh0b25sKHRpbWVwLT50dl9zZWMpOworCSpwKysgPSBodG9ubCgxMDAwMDAwKTsKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIGlubGluZSB1MzIqCit4ZHJfZGVjb2RlX3RpbWUodTMyICpwLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVwKQoreworCXRpbWVwLT50dl9zZWMgPSBudG9obCgqcCsrKTsKKwkvKiBDb252ZXJ0IG1pY3Jvc2Vjb25kcyBpbnRvIG5hbm9zZWNvbmRzICovCisJdGltZXAtPnR2X25zZWMgPSBudG9obCgqcCsrKSAqIDEwMDA7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyB1MzIgKgoreGRyX2RlY29kZV9mYXR0cih1MzIgKnAsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQoreworCXUzMiByZGV2OworCWZhdHRyLT50eXBlID0gKGVudW0gbmZzX2Z0eXBlKSBudG9obCgqcCsrKTsKKwlmYXR0ci0+bW9kZSA9IG50b2hsKCpwKyspOworCWZhdHRyLT5ubGluayA9IG50b2hsKCpwKyspOworCWZhdHRyLT51aWQgPSBudG9obCgqcCsrKTsKKwlmYXR0ci0+Z2lkID0gbnRvaGwoKnArKyk7CisJZmF0dHItPnNpemUgPSBudG9obCgqcCsrKTsKKwlmYXR0ci0+ZHUubmZzMi5ibG9ja3NpemUgPSBudG9obCgqcCsrKTsKKwlyZGV2ID0gbnRvaGwoKnArKyk7CisJZmF0dHItPmR1Lm5mczIuYmxvY2tzID0gbnRvaGwoKnArKyk7CisJZmF0dHItPmZzaWRfdS5uZnMzID0gbnRvaGwoKnArKyk7CisJZmF0dHItPmZpbGVpZCA9IG50b2hsKCpwKyspOworCXAgPSB4ZHJfZGVjb2RlX3RpbWUocCwgJmZhdHRyLT5hdGltZSk7CisJcCA9IHhkcl9kZWNvZGVfdGltZShwLCAmZmF0dHItPm10aW1lKTsKKwlwID0geGRyX2RlY29kZV90aW1lKHAsICZmYXR0ci0+Y3RpbWUpOworCWZhdHRyLT52YWxpZCB8PSBORlNfQVRUUl9GQVRUUjsKKwlmYXR0ci0+cmRldiA9IG5ld19kZWNvZGVfZGV2KHJkZXYpOworCWlmIChmYXR0ci0+dHlwZSA9PSBORkNIUiAmJiByZGV2ID09IE5GUzJfRklGT19ERVYpIHsKKwkJZmF0dHItPnR5cGUgPSBORkZJRk87CisJCWZhdHRyLT5tb2RlID0gKGZhdHRyLT5tb2RlICYgflNfSUZNVCkgfCBTX0lGSUZPOworCQlmYXR0ci0+cmRldiA9IDA7CisJfQorCWZhdHRyLT50aW1lc3RhbXAgPSBqaWZmaWVzOworCXJldHVybiBwOworfQorCisjZGVmaW5lIFNBVFRSKHAsIGF0dHIsIGZsYWcsIGZpZWxkKSBcCisgICAgICAgICpwKysgPSAoYXR0ci0+aWFfdmFsaWQgJiBmbGFnKSA/IGh0b25sKGF0dHItPmZpZWxkKSA6IH4odTMyKSAwCitzdGF0aWMgaW5saW5lIHUzMiAqCit4ZHJfZW5jb2RlX3NhdHRyKHUzMiAqcCwgc3RydWN0IGlhdHRyICphdHRyKQoreworCVNBVFRSKHAsIGF0dHIsIEFUVFJfTU9ERSwgaWFfbW9kZSk7CisJU0FUVFIocCwgYXR0ciwgQVRUUl9VSUQsIGlhX3VpZCk7CisJU0FUVFIocCwgYXR0ciwgQVRUUl9HSUQsIGlhX2dpZCk7CisJU0FUVFIocCwgYXR0ciwgQVRUUl9TSVpFLCBpYV9zaXplKTsKKworCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfQVRJTUVfU0VUKSB7CisJCXAgPSB4ZHJfZW5jb2RlX3RpbWUocCwgJmF0dHItPmlhX2F0aW1lKTsKKwl9IGVsc2UgaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9BVElNRSkgeworCQlwID0geGRyX2VuY29kZV9jdXJyZW50X3NlcnZlcl90aW1lKHAsICZhdHRyLT5pYV9hdGltZSk7CisJfSBlbHNlIHsKKwkJKnArKyA9IH4odTMyKSAwOworCQkqcCsrID0gfih1MzIpIDA7CisJfQorCisJaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9NVElNRV9TRVQpIHsKKwkJcCA9IHhkcl9lbmNvZGVfdGltZShwLCAmYXR0ci0+aWFfbXRpbWUpOworCX0gZWxzZSBpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01USU1FKSB7CisJCXAgPSB4ZHJfZW5jb2RlX2N1cnJlbnRfc2VydmVyX3RpbWUocCwgJmF0dHItPmlhX210aW1lKTsKKwl9IGVsc2UgeworCQkqcCsrID0gfih1MzIpIDA7CQorCQkqcCsrID0gfih1MzIpIDA7CisJfQorICAJcmV0dXJuIHA7Cit9CisjdW5kZWYgU0FUVFIKKworLyoKKyAqIE5GUyBlbmNvZGUgZnVuY3Rpb25zCisgKi8KKy8qCisgKiBFbmNvZGUgZmlsZSBoYW5kbGUgYXJndW1lbnQKKyAqIEdFVEFUVFIsIFJFQURMSU5LLCBTVEFURlMKKyAqLworc3RhdGljIGludAorbmZzX3hkcl9maGFuZGxlKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfZmggKmZoKQoreworCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgZmgpOworCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEVuY29kZSBTRVRBVFRSIGFyZ3VtZW50cworICovCitzdGF0aWMgaW50CituZnNfeGRyX3NhdHRyYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX3NhdHRyYXJncyAqYXJncykKK3sKKwlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKKwlwID0geGRyX2VuY29kZV9zYXR0cihwLCBhcmdzLT5zYXR0cik7CisJcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOworCXJldHVybiAwOworfQorCisvKgorICogRW5jb2RlIGRpcmVjdG9yeSBvcHMgYXJndW1lbnQKKyAqIExPT0tVUCwgUkVNT1ZFLCBSTURJUgorICovCitzdGF0aWMgaW50CituZnNfeGRyX2Rpcm9wYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX2Rpcm9wYXJncyAqYXJncykKK3sKKwlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKKwlwID0geGRyX2VuY29kZV9hcnJheShwLCBhcmdzLT5uYW1lLCBhcmdzLT5sZW4pOworCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEFyZ3VtZW50cyB0byBhIFJFQUQgY2FsbC4gU2luY2Ugd2UgcmVhZCBkYXRhIGRpcmVjdGx5IGludG8gdGhlIHBhZ2UKKyAqIGNhY2hlLCB3ZSBhbHNvIHNldCB1cCB0aGUgcmVwbHkgaW92ZWMgaGVyZSBzbyB0aGF0IGlvdlsxXSBwb2ludHMKKyAqIGV4YWN0bHkgdG8gdGhlIHBhZ2Ugd2Ugd2FudCB0byBmZXRjaC4KKyAqLworc3RhdGljIGludAorbmZzX3hkcl9yZWFkYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX3JlYWRhcmdzICphcmdzKQoreworCXN0cnVjdCBycGNfYXV0aAkqYXV0aCA9IHJlcS0+cnFfdGFzay0+dGtfYXV0aDsKKwl1bnNpZ25lZCBpbnQgcmVwbGVuOworCXUzMiBvZmZzZXQgPSAodTMyKWFyZ3MtPm9mZnNldDsKKwl1MzIgY291bnQgPSBhcmdzLT5jb3VudDsKKworCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZmgpOworCSpwKysgPSBodG9ubChvZmZzZXQpOworCSpwKysgPSBodG9ubChjb3VudCk7CisJKnArKyA9IGh0b25sKGNvdW50KTsKKwlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7CisKKwkvKiBJbmxpbmUgdGhlIHBhZ2UgYXJyYXkgKi8KKwlyZXBsZW4gPSAoUlBDX1JFUEhEUlNJWkUgKyBhdXRoLT5hdV9yc2xhY2sgKyBORlNfcmVhZHJlc19zeikgPDwgMjsKKwl4ZHJfaW5saW5lX3BhZ2VzKCZyZXEtPnJxX3Jjdl9idWYsIHJlcGxlbiwKKwkJCSBhcmdzLT5wYWdlcywgYXJncy0+cGdiYXNlLCBjb3VudCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEZWNvZGUgUkVBRCByZXBseQorICovCitzdGF0aWMgaW50CituZnNfeGRyX3JlYWRyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19yZWFkcmVzICpyZXMpCit7CisJc3RydWN0IGt2ZWMgKmlvdiA9IHJlcS0+cnFfcmN2X2J1Zi5oZWFkOworCWludAlzdGF0dXMsIGNvdW50LCByZWN2ZCwgaGRybGVuOworCisJaWYgKChzdGF0dXMgPSBudG9obCgqcCsrKSkpCisJCXJldHVybiAtbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKKwlwID0geGRyX2RlY29kZV9mYXR0cihwLCByZXMtPmZhdHRyKTsKKworCWNvdW50ID0gbnRvaGwoKnArKyk7CisJcmVzLT5lb2YgPSAwOworCWhkcmxlbiA9ICh1OCAqKSBwIC0gKHU4ICopIGlvdi0+aW92X2Jhc2U7CisJaWYgKGlvdi0+aW92X2xlbiA8IGhkcmxlbikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJORlM6IFJFQUQgcmVwbHkgaGVhZGVyIG92ZXJmbG93ZWQ6IgorCQkJCSJsZW5ndGggJWQgPiAlWnVcbiIsIGhkcmxlbiwgaW92LT5pb3ZfbGVuKTsKKwkJcmV0dXJuIC1lcnJub19ORlNFUlJfSU87CisJfSBlbHNlIGlmIChpb3YtPmlvdl9sZW4gIT0gaGRybGVuKSB7CisJCWRwcmludGsoIk5GUzogUkVBRCBoZWFkZXIgaXMgc2hvcnQuIGlvdmVjIHdpbGwgYmUgc2hpZnRlZC5cbiIpOworCQl4ZHJfc2hpZnRfYnVmKCZyZXEtPnJxX3Jjdl9idWYsIGlvdi0+aW92X2xlbiAtIGhkcmxlbik7CisJfQorCisJcmVjdmQgPSByZXEtPnJxX3Jjdl9idWYubGVuIC0gaGRybGVuOworCWlmIChjb3VudCA+IHJlY3ZkKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5GUzogc2VydmVyIGNoZWF0aW5nIGluIHJlYWQgcmVwbHk6ICIKKwkJCSJjb3VudCAlZCA+IHJlY3ZkICVkXG4iLCBjb3VudCwgcmVjdmQpOworCQljb3VudCA9IHJlY3ZkOworCX0KKworCWRwcmludGsoIlJQQzogICAgICByZWFkcmVzIE9LIGNvdW50ICVkXG4iLCBjb3VudCk7CisJaWYgKGNvdW50IDwgcmVzLT5jb3VudCkKKwkJcmVzLT5jb3VudCA9IGNvdW50OworCisJcmV0dXJuIGNvdW50OworfQorCisKKy8qCisgKiBXcml0ZSBhcmd1bWVudHMuIFNwbGljZSB0aGUgYnVmZmVyIHRvIGJlIHdyaXR0ZW4gaW50byB0aGUgaW92ZWMuCisgKi8KK3N0YXRpYyBpbnQKK25mc194ZHJfd3JpdGVhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfd3JpdGVhcmdzICphcmdzKQoreworCXN0cnVjdCB4ZHJfYnVmICpzbmRidWYgPSAmcmVxLT5ycV9zbmRfYnVmOworCXUzMiBvZmZzZXQgPSAodTMyKWFyZ3MtPm9mZnNldDsKKwl1MzIgY291bnQgPSBhcmdzLT5jb3VudDsKKworCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZmgpOworCSpwKysgPSBodG9ubChvZmZzZXQpOworCSpwKysgPSBodG9ubChvZmZzZXQpOworCSpwKysgPSBodG9ubChjb3VudCk7CisJKnArKyA9IGh0b25sKGNvdW50KTsKKwlzbmRidWYtPmxlbiA9IHhkcl9hZGp1c3RfaW92ZWMoc25kYnVmLT5oZWFkLCBwKTsKKworCS8qIENvcHkgdGhlIHBhZ2UgYXJyYXkgKi8KKwl4ZHJfZW5jb2RlX3BhZ2VzKHNuZGJ1ZiwgYXJncy0+cGFnZXMsIGFyZ3MtPnBnYmFzZSwgY291bnQpOworCXJldHVybiAwOworfQorCisvKgorICogRW5jb2RlIGNyZWF0ZSBhcmd1bWVudHMKKyAqIENSRUFURSwgTUtESVIKKyAqLworc3RhdGljIGludAorbmZzX3hkcl9jcmVhdGVhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfY3JlYXRlYXJncyAqYXJncykKK3sKKwlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKKwlwID0geGRyX2VuY29kZV9hcnJheShwLCBhcmdzLT5uYW1lLCBhcmdzLT5sZW4pOworCXAgPSB4ZHJfZW5jb2RlX3NhdHRyKHAsIGFyZ3MtPnNhdHRyKTsKKwlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBFbmNvZGUgUkVOQU1FIGFyZ3VtZW50cworICovCitzdGF0aWMgaW50CituZnNfeGRyX3JlbmFtZWFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19yZW5hbWVhcmdzICphcmdzKQoreworCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZnJvbWZoKTsKKwlwID0geGRyX2VuY29kZV9hcnJheShwLCBhcmdzLT5mcm9tbmFtZSwgYXJncy0+ZnJvbWxlbik7CisJcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT50b2ZoKTsKKwlwID0geGRyX2VuY29kZV9hcnJheShwLCBhcmdzLT50b25hbWUsIGFyZ3MtPnRvbGVuKTsKKwlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBFbmNvZGUgTElOSyBhcmd1bWVudHMKKyAqLworc3RhdGljIGludAorbmZzX3hkcl9saW5rYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX2xpbmthcmdzICphcmdzKQoreworCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZnJvbWZoKTsKKwlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPnRvZmgpOworCXAgPSB4ZHJfZW5jb2RlX2FycmF5KHAsIGFyZ3MtPnRvbmFtZSwgYXJncy0+dG9sZW4pOworCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEVuY29kZSBTWU1MSU5LIGFyZ3VtZW50cworICovCitzdGF0aWMgaW50CituZnNfeGRyX3N5bWxpbmthcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfc3ltbGlua2FyZ3MgKmFyZ3MpCit7CisJcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5mcm9tZmgpOworCXAgPSB4ZHJfZW5jb2RlX2FycmF5KHAsIGFyZ3MtPmZyb21uYW1lLCBhcmdzLT5mcm9tbGVuKTsKKwlwID0geGRyX2VuY29kZV9hcnJheShwLCBhcmdzLT50b3BhdGgsIGFyZ3MtPnRvbGVuKTsKKwlwID0geGRyX2VuY29kZV9zYXR0cihwLCBhcmdzLT5zYXR0cik7CisJcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOworCXJldHVybiAwOworfQorCisvKgorICogRW5jb2RlIGFyZ3VtZW50cyB0byByZWFkZGlyIGNhbGwKKyAqLworc3RhdGljIGludAorbmZzX3hkcl9yZWFkZGlyYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX3JlYWRkaXJhcmdzICphcmdzKQoreworCXN0cnVjdCBycGNfdGFzawkqdGFzayA9IHJlcS0+cnFfdGFzazsKKwlzdHJ1Y3QgcnBjX2F1dGgJKmF1dGggPSB0YXNrLT50a19hdXRoOworCXVuc2lnbmVkIGludCByZXBsZW47CisJdTMyIGNvdW50ID0gYXJncy0+Y291bnQ7CisKKwlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKKwkqcCsrID0gaHRvbmwoYXJncy0+Y29va2llKTsKKwkqcCsrID0gaHRvbmwoY291bnQpOyAvKiBzZWUgYWJvdmUgKi8KKwlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7CisKKwkvKiBJbmxpbmUgdGhlIHBhZ2UgYXJyYXkgKi8KKwlyZXBsZW4gPSAoUlBDX1JFUEhEUlNJWkUgKyBhdXRoLT5hdV9yc2xhY2sgKyBORlNfcmVhZGRpcnJlc19zeikgPDwgMjsKKwl4ZHJfaW5saW5lX3BhZ2VzKCZyZXEtPnJxX3Jjdl9idWYsIHJlcGxlbiwgYXJncy0+cGFnZXMsIDAsIGNvdW50KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERlY29kZSB0aGUgcmVzdWx0IG9mIGEgcmVhZGRpciBjYWxsLgorICogV2UncmUgbm90IHJlYWxseSBkZWNvZGluZyBhbnltb3JlLCB3ZSBqdXN0IGxlYXZlIHRoZSBidWZmZXIgdW50b3VjaGVkCisgKiBhbmQgb25seSBjaGVjayB0aGF0IGl0IGlzIHN5bnRhY3RpY2FsbHkgY29ycmVjdC4KKyAqIFRoZSByZWFsIGRlY29kaW5nIGhhcHBlbnMgaW4gbmZzX2RlY29kZV9lbnRyeSBiZWxvdywgY2FsbGVkIGRpcmVjdGx5CisgKiBmcm9tIG5mc19yZWFkZGlyIGZvciBlYWNoIGVudHJ5LgorICovCitzdGF0aWMgaW50CituZnNfeGRyX3JlYWRkaXJyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgdm9pZCAqZHVtbXkpCit7CisJc3RydWN0IHhkcl9idWYgKnJjdmJ1ZiA9ICZyZXEtPnJxX3Jjdl9idWY7CisJc3RydWN0IGt2ZWMgKmlvdiA9IHJjdmJ1Zi0+aGVhZDsKKwlzdHJ1Y3QgcGFnZSAqKnBhZ2U7CisJaW50IGhkcmxlbiwgcmVjdmQ7CisJaW50IHN0YXR1cywgbnI7CisJdW5zaWduZWQgaW50IGxlbiwgcGdsZW47CisJdTMyICplbmQsICplbnRyeSwgKmthZGRyOworCisJaWYgKChzdGF0dXMgPSBudG9obCgqcCsrKSkpCisJCXJldHVybiAtbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKKworCWhkcmxlbiA9ICh1OCAqKSBwIC0gKHU4ICopIGlvdi0+aW92X2Jhc2U7CisJaWYgKGlvdi0+aW92X2xlbiA8IGhkcmxlbikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJORlM6IFJFQURESVIgcmVwbHkgaGVhZGVyIG92ZXJmbG93ZWQ6IgorCQkJCSJsZW5ndGggJWQgPiAlWnVcbiIsIGhkcmxlbiwgaW92LT5pb3ZfbGVuKTsKKwkJcmV0dXJuIC1lcnJub19ORlNFUlJfSU87CisJfSBlbHNlIGlmIChpb3YtPmlvdl9sZW4gIT0gaGRybGVuKSB7CisJCWRwcmludGsoIk5GUzogUkVBRERJUiBoZWFkZXIgaXMgc2hvcnQuIGlvdmVjIHdpbGwgYmUgc2hpZnRlZC5cbiIpOworCQl4ZHJfc2hpZnRfYnVmKHJjdmJ1ZiwgaW92LT5pb3ZfbGVuIC0gaGRybGVuKTsKKwl9CisKKwlwZ2xlbiA9IHJjdmJ1Zi0+cGFnZV9sZW47CisJcmVjdmQgPSByY3ZidWYtPmxlbiAtIGhkcmxlbjsKKwlpZiAocGdsZW4gPiByZWN2ZCkKKwkJcGdsZW4gPSByZWN2ZDsKKwlwYWdlID0gcmN2YnVmLT5wYWdlczsKKwlrYWRkciA9IHAgPSAodTMyICopa21hcF9hdG9taWMoKnBhZ2UsIEtNX1VTRVIwKTsKKwllbmQgPSAodTMyICopKChjaGFyICopcCArIHBnbGVuKTsKKwllbnRyeSA9IHA7CisJZm9yIChuciA9IDA7ICpwKys7IG5yKyspIHsKKwkJaWYgKHAgKyAyID4gZW5kKQorCQkJZ290byBzaG9ydF9wa3Q7CisJCXArKzsgLyogZmlsZWlkICovCisJCWxlbiA9IG50b2hsKCpwKyspOworCQlwICs9IFhEUl9RVUFETEVOKGxlbikgKyAxOwkvKiBuYW1lIHBsdXMgY29va2llICovCisJCWlmIChsZW4gPiBORlMyX01BWE5BTUxFTikgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTkZTOiBnaWFudCBmaWxlbmFtZSBpbiByZWFkZGlyIChsZW4gMHgleCkhXG4iLAorCQkJCQkJbGVuKTsKKwkJCWdvdG8gZXJyX3VubWFwOworCQl9CisJCWlmIChwICsgMiA+IGVuZCkKKwkJCWdvdG8gc2hvcnRfcGt0OworCQllbnRyeSA9IHA7CisJfQorCWlmICghbnIgJiYgKGVudHJ5WzBdICE9IDAgfHwgZW50cnlbMV0gPT0gMCkpCisJCWdvdG8gc2hvcnRfcGt0OworIG91dDoKKwlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJcmV0dXJuIG5yOworIHNob3J0X3BrdDoKKwllbnRyeVswXSA9IGVudHJ5WzFdID0gMDsKKwkvKiB0cnVuY2F0ZSBsaXN0aW5nID8gKi8KKwlpZiAoIW5yKSB7CisJCXByaW50ayhLRVJOX05PVElDRSAiTkZTOiByZWFkZGlyIHJlcGx5IHRydW5jYXRlZCFcbiIpOworCQllbnRyeVsxXSA9IDE7CisJfQorCWdvdG8gb3V0OworZXJyX3VubWFwOgorCW5yID0gLWVycm5vX05GU0VSUl9JTzsKKwlnb3RvIG91dDsKK30KKwordTMyICoKK25mc19kZWNvZGVfZGlyZW50KHUzMiAqcCwgc3RydWN0IG5mc19lbnRyeSAqZW50cnksIGludCBwbHVzKQoreworCWlmICghKnArKykgeworCQlpZiAoISpwKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7CisJCWVudHJ5LT5lb2YgPSAxOworCQlyZXR1cm4gRVJSX1BUUigtRUJBRENPT0tJRSk7CisJfQorCisJZW50cnktPmlubwkgID0gbnRvaGwoKnArKyk7CisJZW50cnktPmxlbgkgID0gbnRvaGwoKnArKyk7CisJZW50cnktPm5hbWUJICA9IChjb25zdCBjaGFyICopIHA7CisJcAkJICs9IFhEUl9RVUFETEVOKGVudHJ5LT5sZW4pOworCWVudHJ5LT5wcmV2X2Nvb2tpZQkgID0gZW50cnktPmNvb2tpZTsKKwllbnRyeS0+Y29va2llCSAgPSBudG9obCgqcCsrKTsKKwllbnRyeS0+ZW9mCSAgPSAhcFswXSAmJiBwWzFdOworCisJcmV0dXJuIHA7Cit9CisKKy8qCisgKiBORlMgWERSIGRlY29kZSBmdW5jdGlvbnMKKyAqLworLyoKKyAqIERlY29kZSBzaW1wbGUgc3RhdHVzIHJlcGx5CisgKi8KK3N0YXRpYyBpbnQKK25mc194ZHJfc3RhdChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCB2b2lkICpkdW1teSkKK3sKKwlpbnQJc3RhdHVzOworCisJaWYgKChzdGF0dXMgPSBudG9obCgqcCsrKSkgIT0gMCkKKwkJc3RhdHVzID0gLW5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIERlY29kZSBhdHRyc3RhdCByZXBseQorICogR0VUQVRUUiwgU0VUQVRUUiwgV1JJVEUKKyAqLworc3RhdGljIGludAorbmZzX3hkcl9hdHRyc3RhdChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK3sKKwlpbnQJc3RhdHVzOworCisJaWYgKChzdGF0dXMgPSBudG9obCgqcCsrKSkpCisJCXJldHVybiAtbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKKwl4ZHJfZGVjb2RlX2ZhdHRyKHAsIGZhdHRyKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERlY29kZSBkaXJvcHJlcyByZXBseQorICogTE9PS1VQLCBDUkVBVEUsIE1LRElSCisgKi8KK3N0YXRpYyBpbnQKK25mc194ZHJfZGlyb3ByZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19kaXJvcG9rICpyZXMpCit7CisJaW50CXN0YXR1czsKKworCWlmICgoc3RhdHVzID0gbnRvaGwoKnArKykpKQorCQlyZXR1cm4gLW5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7CisJcCA9IHhkcl9kZWNvZGVfZmhhbmRsZShwLCByZXMtPmZoKTsKKwl4ZHJfZGVjb2RlX2ZhdHRyKHAsIHJlcy0+ZmF0dHIpOworCXJldHVybiAwOworfQorCisvKgorICogRW5jb2RlIFJFQURMSU5LIGFyZ3MKKyAqLworc3RhdGljIGludAorbmZzX3hkcl9yZWFkbGlua2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19yZWFkbGlua2FyZ3MgKmFyZ3MpCit7CisJc3RydWN0IHJwY19hdXRoICphdXRoID0gcmVxLT5ycV90YXNrLT50a19hdXRoOworCXVuc2lnbmVkIGludCByZXBsZW47CisKKwlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKKwlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7CisKKwkvKiBJbmxpbmUgdGhlIHBhZ2UgYXJyYXkgKi8KKwlyZXBsZW4gPSAoUlBDX1JFUEhEUlNJWkUgKyBhdXRoLT5hdV9yc2xhY2sgKyBORlNfcmVhZGxpbmtyZXNfc3opIDw8IDI7CisJeGRyX2lubGluZV9wYWdlcygmcmVxLT5ycV9yY3ZfYnVmLCByZXBsZW4sIGFyZ3MtPnBhZ2VzLCBhcmdzLT5wZ2Jhc2UsIGFyZ3MtPnBnbGVuKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERlY29kZSBSRUFETElOSyByZXBseQorICovCitzdGF0aWMgaW50CituZnNfeGRyX3JlYWRsaW5rcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHZvaWQgKmR1bW15KQoreworCXN0cnVjdCB4ZHJfYnVmICpyY3ZidWYgPSAmcmVxLT5ycV9yY3ZfYnVmOworCXN0cnVjdCBrdmVjICppb3YgPSByY3ZidWYtPmhlYWQ7CisJaW50IGhkcmxlbiwgbGVuLCByZWN2ZDsKKwljaGFyCSprYWRkcjsKKwlpbnQJc3RhdHVzOworCisJaWYgKChzdGF0dXMgPSBudG9obCgqcCsrKSkpCisJCXJldHVybiAtbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKKwkvKiBDb252ZXJ0IGxlbmd0aCBvZiBzeW1saW5rICovCisJbGVuID0gbnRvaGwoKnArKyk7CisJaWYgKGxlbiA+PSByY3ZidWYtPnBhZ2VfbGVuIHx8IGxlbiA8PSAwKSB7CisJCWRwcmludGsoS0VSTl9XQVJOSU5HICJuZnM6IHNlcnZlciByZXR1cm5lZCBnaWFudCBzeW1saW5rIVxuIik7CisJCXJldHVybiAtRU5BTUVUT09MT05HOworCX0KKwloZHJsZW4gPSAodTggKikgcCAtICh1OCAqKSBpb3YtPmlvdl9iYXNlOworCWlmIChpb3YtPmlvdl9sZW4gPCBoZHJsZW4pIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTkZTOiBSRUFETElOSyByZXBseSBoZWFkZXIgb3ZlcmZsb3dlZDoiCisJCQkJImxlbmd0aCAlZCA+ICVadVxuIiwgaGRybGVuLCBpb3YtPmlvdl9sZW4pOworCQlyZXR1cm4gLWVycm5vX05GU0VSUl9JTzsKKwl9IGVsc2UgaWYgKGlvdi0+aW92X2xlbiAhPSBoZHJsZW4pIHsKKwkJZHByaW50aygiTkZTOiBSRUFETElOSyBoZWFkZXIgaXMgc2hvcnQuIGlvdmVjIHdpbGwgYmUgc2hpZnRlZC5cbiIpOworCQl4ZHJfc2hpZnRfYnVmKHJjdmJ1ZiwgaW92LT5pb3ZfbGVuIC0gaGRybGVuKTsKKwl9CisJcmVjdmQgPSByZXEtPnJxX3Jjdl9idWYubGVuIC0gaGRybGVuOworCWlmIChyZWN2ZCA8IGxlbikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJORlM6IHNlcnZlciBjaGVhdGluZyBpbiByZWFkbGluayByZXBseTogIgorCQkJCSJjb3VudCAldSA+IHJlY3ZkICV1XG4iLCBsZW4sIHJlY3ZkKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogTlVMTCB0ZXJtaW5hdGUgdGhlIHN0cmluZyB3ZSBnb3QgKi8KKwlrYWRkciA9IChjaGFyICopa21hcF9hdG9taWMocmN2YnVmLT5wYWdlc1swXSwgS01fVVNFUjApOworCWthZGRyW2xlbityY3ZidWYtPnBhZ2VfYmFzZV0gPSAnXDAnOworCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERlY29kZSBXUklURSByZXBseQorICovCitzdGF0aWMgaW50CituZnNfeGRyX3dyaXRlcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfd3JpdGVyZXMgKnJlcykKK3sKKwlyZXMtPnZlcmYtPmNvbW1pdHRlZCA9IE5GU19GSUxFX1NZTkM7CisJcmV0dXJuIG5mc194ZHJfYXR0cnN0YXQocmVxLCBwLCByZXMtPmZhdHRyKTsKK30KKworLyoKKyAqIERlY29kZSBTVEFURlMgcmVwbHkKKyAqLworc3RhdGljIGludAorbmZzX3hkcl9zdGF0ZnNyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mczJfZnNzdGF0ICpyZXMpCit7CisJaW50CXN0YXR1czsKKworCWlmICgoc3RhdHVzID0gbnRvaGwoKnArKykpKQorCQlyZXR1cm4gLW5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7CisKKwlyZXMtPnRzaXplICA9IG50b2hsKCpwKyspOworCXJlcy0+YnNpemUgID0gbnRvaGwoKnArKyk7CisJcmVzLT5ibG9ja3MgPSBudG9obCgqcCsrKTsKKwlyZXMtPmJmcmVlICA9IG50b2hsKCpwKyspOworCXJlcy0+YmF2YWlsID0gbnRvaGwoKnArKyk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXZSBuZWVkIHRvIHRyYW5zbGF0ZSBiZXR3ZWVuIG5mcyBzdGF0dXMgcmV0dXJuIHZhbHVlcyBhbmQKKyAqIHRoZSBsb2NhbCBlcnJubyB2YWx1ZXMgd2hpY2ggbWF5IG5vdCBiZSB0aGUgc2FtZS4KKyAqLworc3RhdGljIHN0cnVjdCB7CisJaW50IHN0YXQ7CisJaW50IGVycm5vOworfSBuZnNfZXJydGJsW10gPSB7CisJeyBORlNfT0ssCQkwCQl9LAorCXsgTkZTRVJSX1BFUk0sCQlFUEVSTQkJfSwKKwl7IE5GU0VSUl9OT0VOVCwJCUVOT0VOVAkJfSwKKwl7IE5GU0VSUl9JTywJCWVycm5vX05GU0VSUl9JTwl9LAorCXsgTkZTRVJSX05YSU8sCQlFTlhJTwkJfSwKKy8qCXsgTkZTRVJSX0VBR0FJTiwJRUFHQUlOCQl9LCAqLworCXsgTkZTRVJSX0FDQ0VTLAkJRUFDQ0VTCQl9LAorCXsgTkZTRVJSX0VYSVNULAkJRUVYSVNUCQl9LAorCXsgTkZTRVJSX1hERVYsCQlFWERFVgkJfSwKKwl7IE5GU0VSUl9OT0RFViwJCUVOT0RFVgkJfSwKKwl7IE5GU0VSUl9OT1RESVIsCUVOT1RESVIJCX0sCisJeyBORlNFUlJfSVNESVIsCQlFSVNESVIJCX0sCisJeyBORlNFUlJfSU5WQUwsCQlFSU5WQUwJCX0sCisJeyBORlNFUlJfRkJJRywJCUVGQklHCQl9LAorCXsgTkZTRVJSX05PU1BDLAkJRU5PU1BDCQl9LAorCXsgTkZTRVJSX1JPRlMsCQlFUk9GUwkJfSwKKwl7IE5GU0VSUl9NTElOSywJCUVNTElOSwkJfSwKKwl7IE5GU0VSUl9OQU1FVE9PTE9ORywJRU5BTUVUT09MT05HCX0sCisJeyBORlNFUlJfTk9URU1QVFksCUVOT1RFTVBUWQl9LAorCXsgTkZTRVJSX0RRVU9ULAkJRURRVU9UCQl9LAorCXsgTkZTRVJSX1NUQUxFLAkJRVNUQUxFCQl9LAorCXsgTkZTRVJSX1JFTU9URSwJRVJFTU9URQkJfSwKKyNpZmRlZiBFV0ZMVVNICisJeyBORlNFUlJfV0ZMVVNILAlFV0ZMVVNICQl9LAorI2VuZGlmCisJeyBORlNFUlJfQkFESEFORExFLAlFQkFESEFORExFCX0sCisJeyBORlNFUlJfTk9UX1NZTkMsCUVOT1RTWU5DCX0sCisJeyBORlNFUlJfQkFEX0NPT0tJRSwJRUJBRENPT0tJRQl9LAorCXsgTkZTRVJSX05PVFNVUFAsCUVOT1RTVVBQCX0sCisJeyBORlNFUlJfVE9PU01BTEwsCUVUT09TTUFMTAl9LAorCXsgTkZTRVJSX1NFUlZFUkZBVUxULAlFU0VSVkVSRkFVTFQJfSwKKwl7IE5GU0VSUl9CQURUWVBFLAlFQkFEVFlQRQl9LAorCXsgTkZTRVJSX0pVS0VCT1gsCUVKVUtFQk9YCX0sCisJeyAtMSwJCQlFSU8JCX0KK307CisKKy8qCisgKiBDb252ZXJ0IGFuIE5GUyBlcnJvciBjb2RlIHRvIGEgbG9jYWwgb25lLgorICogVGhpcyBvbmUgaXMgdXNlZCBqb2ludGx5IGJ5IE5GU3YyIGFuZCBORlN2My4KKyAqLworaW50CituZnNfc3RhdF90b19lcnJubyhpbnQgc3RhdCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IG5mc19lcnJ0YmxbaV0uc3RhdCAhPSAtMTsgaSsrKSB7CisJCWlmIChuZnNfZXJydGJsW2ldLnN0YXQgPT0gc3RhdCkKKwkJCXJldHVybiBuZnNfZXJydGJsW2ldLmVycm5vOworCX0KKwlwcmludGsoS0VSTl9FUlIgIm5mc19zdGF0X3RvX2Vycm5vOiBiYWQgbmZzIHN0YXR1cyByZXR1cm4gdmFsdWU6ICVkXG4iLCBzdGF0KTsKKwlyZXR1cm4gbmZzX2VycnRibFtpXS5lcnJubzsKK30KKworI2lmbmRlZiBNQVgKKyMgZGVmaW5lIE1BWChhLCBiKQkoKChhKSA+IChiKSk/IChhKSA6IChiKSkKKyNlbmRpZgorCisjZGVmaW5lIFBST0MocHJvYywgYXJndHlwZSwgcmVzdHlwZSwgdGltZXIpCQkJCVwKK1tORlNQUk9DXyMjcHJvY10gPSB7CQkJCQkJCVwKKwkucF9wcm9jCSAgICA9ICBORlNQUk9DXyMjcHJvYywJCQkJCVwKKwkucF9lbmNvZGUgICA9ICAoa3hkcnByb2NfdCkgbmZzX3hkcl8jI2FyZ3R5cGUsCQkJXAorCS5wX2RlY29kZSAgID0gIChreGRycHJvY190KSBuZnNfeGRyXyMjcmVzdHlwZSwJCQlcCisJLnBfYnVmc2l6ICAgPSAgTUFYKE5GU18jI2FyZ3R5cGUjI19zeixORlNfIyNyZXN0eXBlIyNfc3opIDw8IDIsCVwKKwkucF90aW1lciAgICA9ICB0aW1lcgkJCQkJCVwKKwl9CitzdHJ1Y3QgcnBjX3Byb2NpbmZvCW5mc19wcm9jZWR1cmVzW10gPSB7CisgICAgUFJPQyhHRVRBVFRSLAlmaGFuZGxlLAlhdHRyc3RhdCwgMSksCisgICAgUFJPQyhTRVRBVFRSLAlzYXR0cmFyZ3MsCWF0dHJzdGF0LCAwKSwKKyAgICBQUk9DKExPT0tVUCwJZGlyb3BhcmdzLAlkaXJvcHJlcywgMiksCisgICAgUFJPQyhSRUFETElOSywJcmVhZGxpbmthcmdzLAlyZWFkbGlua3JlcywgMyksCisgICAgUFJPQyhSRUFELAkJcmVhZGFyZ3MsCXJlYWRyZXMsIDMpLAorICAgIFBST0MoV1JJVEUsCQl3cml0ZWFyZ3MsCXdyaXRlcmVzLCA0KSwKKyAgICBQUk9DKENSRUFURSwJY3JlYXRlYXJncywJZGlyb3ByZXMsIDApLAorICAgIFBST0MoUkVNT1ZFLAlkaXJvcGFyZ3MsCXN0YXQsIDApLAorICAgIFBST0MoUkVOQU1FLAlyZW5hbWVhcmdzLAlzdGF0LCAwKSwKKyAgICBQUk9DKExJTkssCQlsaW5rYXJncywJc3RhdCwgMCksCisgICAgUFJPQyhTWU1MSU5LLAlzeW1saW5rYXJncywJc3RhdCwgMCksCisgICAgUFJPQyhNS0RJUiwJCWNyZWF0ZWFyZ3MsCWRpcm9wcmVzLCAwKSwKKyAgICBQUk9DKFJNRElSLAkJZGlyb3BhcmdzLAlzdGF0LCAwKSwKKyAgICBQUk9DKFJFQURESVIsCXJlYWRkaXJhcmdzLAlyZWFkZGlycmVzLCAzKSwKKyAgICBQUk9DKFNUQVRGUywJZmhhbmRsZSwJc3RhdGZzcmVzLCAwKSwKK307CisKK3N0cnVjdCBycGNfdmVyc2lvbgkJbmZzX3ZlcnNpb24yID0geworCS5udW1iZXIJCQk9IDIsCisJLm5ycHJvY3MJCT0gc2l6ZW9mKG5mc19wcm9jZWR1cmVzKS9zaXplb2YobmZzX3Byb2NlZHVyZXNbMF0pLAorCS5wcm9jcwkJCT0gbmZzX3Byb2NlZHVyZXMKK307CmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzM3Byb2MuYyBiL2ZzL25mcy9uZnMzcHJvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4Nzg0OTQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnMvbmZzM3Byb2MuYwpAQCAtMCwwICsxLDg1OSBAQAorLyoKKyAqICBsaW51eC9mcy9uZnMvbmZzM3Byb2MuYworICoKKyAqICBDbGllbnQtc2lkZSBORlN2MyBwcm9jZWR1cmVzIHN0dWJzLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTcsIE9sYWYgS2lyY2gKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L25mcy5oPgorI2luY2x1ZGUgPGxpbnV4L25mczMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfcGFnZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xvY2tkL2JpbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCisjZGVmaW5lIE5GU0RCR19GQUNJTElUWQkJTkZTREJHX1BST0MKKworZXh0ZXJuIHN0cnVjdCBycGNfcHJvY2luZm8gbmZzM19wcm9jZWR1cmVzW107CisKKy8qIEEgd3JhcHBlciB0byBoYW5kbGUgdGhlIEVKVUtFQk9YIGVycm9yIG1lc3NhZ2UgKi8KK3N0YXRpYyBpbnQKK25mczNfcnBjX3dyYXBwZXIoc3RydWN0IHJwY19jbG50ICpjbG50LCBzdHJ1Y3QgcnBjX21lc3NhZ2UgKm1zZywgaW50IGZsYWdzKQoreworCXNpZ3NldF90IG9sZHNldDsKKwlpbnQgcmVzOworCXJwY19jbG50X3NpZ21hc2soY2xudCwgJm9sZHNldCk7CisJZG8geworCQlyZXMgPSBycGNfY2FsbF9zeW5jKGNsbnQsIG1zZywgZmxhZ3MpOworCQlpZiAocmVzICE9IC1FSlVLRUJPWCkKKwkJCWJyZWFrOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KE5GU19KVUtFQk9YX1JFVFJZX1RJTUUpOworCQlyZXMgPSAtRVJFU1RBUlRTWVM7CisJfSB3aGlsZSAoIXNpZ25hbGxlZCgpKTsKKwlycGNfY2xudF9zaWd1bm1hc2soY2xudCwgJm9sZHNldCk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGlubGluZSBpbnQKK25mczNfcnBjX2NhbGxfd3JhcHBlcihzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQsIHUzMiBwcm9jLCB2b2lkICphcmdwLCB2b2lkICpyZXNwLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHJwY19tZXNzYWdlIG1zZyA9IHsKKwkJLnJwY19wcm9jCT0gJm5mczNfcHJvY2VkdXJlc1twcm9jXSwKKwkJLnJwY19hcmdwCT0gYXJncCwKKwkJLnJwY19yZXNwCT0gcmVzcCwKKwl9OworCXJldHVybiBuZnMzX3JwY193cmFwcGVyKGNsbnQsICZtc2csIGZsYWdzKTsKK30KKworI2RlZmluZSBycGNfY2FsbChjbG50LCBwcm9jLCBhcmdwLCByZXNwLCBmbGFncykgXAorCQluZnMzX3JwY19jYWxsX3dyYXBwZXIoY2xudCwgcHJvYywgYXJncCwgcmVzcCwgZmxhZ3MpCisjZGVmaW5lIHJwY19jYWxsX3N5bmMoY2xudCwgbXNnLCBmbGFncykgXAorCQluZnMzX3JwY193cmFwcGVyKGNsbnQsIG1zZywgZmxhZ3MpCisKK3N0YXRpYyBpbnQKK25mczNfYXN5bmNfaGFuZGxlX2p1a2Vib3goc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCWlmICh0YXNrLT50a19zdGF0dXMgIT0gLUVKVUtFQk9YKQorCQlyZXR1cm4gMDsKKwl0YXNrLT50a19zdGF0dXMgPSAwOworCXJwY19yZXN0YXJ0X2NhbGwodGFzayk7CisJcnBjX2RlbGF5KHRhc2ssIE5GU19KVUtFQk9YX1JFVFJZX1RJTUUpOworCXJldHVybiAxOworfQorCisvKgorICogQmFyZS1ib25lcyBhY2Nlc3MgdG8gZ2V0YXR0cjogdGhpcyBpcyBmb3IgbmZzX3JlYWRfc3VwZXIuCisgKi8KK3N0YXRpYyBpbnQKK25mczNfcHJvY19nZXRfcm9vdChzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlLAorCQkgICBzdHJ1Y3QgbmZzX2ZzaW5mbyAqaW5mbykKK3sKKwlpbnQJc3RhdHVzOworCisJZHByaW50aygiJXM6IGNhbGwgIGZzaW5mb1xuIiwgX19GVU5DVElPTl9fKTsKKwlpbmZvLT5mYXR0ci0+dmFsaWQgPSAwOworCXN0YXR1cyA9IHJwY19jYWxsKHNlcnZlci0+Y2xpZW50X3N5cywgTkZTM1BST0NfRlNJTkZPLCBmaGFuZGxlLCBpbmZvLCAwKTsKKwlkcHJpbnRrKCIlczogcmVwbHkgZnNpbmZvOiAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCWlmICghKGluZm8tPmZhdHRyLT52YWxpZCAmIE5GU19BVFRSX0ZBVFRSKSkgeworCQlzdGF0dXMgPSBycGNfY2FsbChzZXJ2ZXItPmNsaWVudF9zeXMsIE5GUzNQUk9DX0dFVEFUVFIsIGZoYW5kbGUsIGluZm8tPmZhdHRyLCAwKTsKKwkJZHByaW50aygiJXM6IHJlcGx5IGdldGF0dHI6ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBPbmUgZnVuY3Rpb24gZm9yIGVhY2ggcHJvY2VkdXJlIGluIHRoZSBORlMgcHJvdG9jb2wuCisgKi8KK3N0YXRpYyBpbnQKK25mczNfcHJvY19nZXRhdHRyKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBuZnNfZmggKmZoYW5kbGUsCisJCXN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQoreworCWludAlzdGF0dXM7CisKKwlkcHJpbnRrKCJORlMgY2FsbCAgZ2V0YXR0clxuIik7CisJZmF0dHItPnZhbGlkID0gMDsKKwlzdGF0dXMgPSBycGNfY2FsbChzZXJ2ZXItPmNsaWVudCwgTkZTM1BST0NfR0VUQVRUUiwKKwkJCSAgZmhhbmRsZSwgZmF0dHIsIDApOworCWRwcmludGsoIk5GUyByZXBseSBnZXRhdHRyOiAlZFxuIiwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50CituZnMzX3Byb2Nfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyLAorCQkJc3RydWN0IGlhdHRyICpzYXR0cikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBuZnMzX3NhdHRyYXJncwlhcmcgPSB7CisJCS5maAkJPSBORlNfRkgoaW5vZGUpLAorCQkuc2F0dHIJCT0gc2F0dHIsCisJfTsKKwlpbnQJc3RhdHVzOworCisJZHByaW50aygiTkZTIGNhbGwgIHNldGF0dHJcbiIpOworCWZhdHRyLT52YWxpZCA9IDA7CisJc3RhdHVzID0gcnBjX2NhbGwoTkZTX0NMSUVOVChpbm9kZSksIE5GUzNQUk9DX1NFVEFUVFIsICZhcmcsIGZhdHRyLCAwKTsKKwlkcHJpbnRrKCJORlMgcmVwbHkgc2V0YXR0cjogJWRcbiIsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludAorbmZzM19wcm9jX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHFzdHIgKm5hbWUsCisJCSBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK3sKKwlzdHJ1Y3QgbmZzX2ZhdHRyCWRpcl9hdHRyOworCXN0cnVjdCBuZnMzX2Rpcm9wYXJncwlhcmcgPSB7CisJCS5maAkJPSBORlNfRkgoZGlyKSwKKwkJLm5hbWUJCT0gbmFtZS0+bmFtZSwKKwkJLmxlbgkJPSBuYW1lLT5sZW4KKwl9OworCXN0cnVjdCBuZnMzX2Rpcm9wcmVzCXJlcyA9IHsKKwkJLmRpcl9hdHRyCT0gJmRpcl9hdHRyLAorCQkuZmgJCT0gZmhhbmRsZSwKKwkJLmZhdHRyCQk9IGZhdHRyCisJfTsKKwlpbnQJCQlzdGF0dXM7CisKKwlkcHJpbnRrKCJORlMgY2FsbCAgbG9va3VwICVzXG4iLCBuYW1lLT5uYW1lKTsKKwlkaXJfYXR0ci52YWxpZCA9IDA7CisJZmF0dHItPnZhbGlkID0gMDsKKwlzdGF0dXMgPSBycGNfY2FsbChORlNfQ0xJRU5UKGRpciksIE5GUzNQUk9DX0xPT0tVUCwgJmFyZywgJnJlcywgMCk7CisJaWYgKHN0YXR1cyA+PSAwICYmICEoZmF0dHItPnZhbGlkICYgTkZTX0FUVFJfRkFUVFIpKQorCQlzdGF0dXMgPSBycGNfY2FsbChORlNfQ0xJRU5UKGRpciksIE5GUzNQUk9DX0dFVEFUVFIsCisJCQkgZmhhbmRsZSwgZmF0dHIsIDApOworCWRwcmludGsoIk5GUyByZXBseSBsb29rdXA6ICVkXG4iLCBzdGF0dXMpOworCWlmIChzdGF0dXMgPj0gMCkKKwkJc3RhdHVzID0gbmZzX3JlZnJlc2hfaW5vZGUoZGlyLCAmZGlyX2F0dHIpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgbmZzM19wcm9jX2FjY2VzcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbmZzX2FjY2Vzc19lbnRyeSAqZW50cnkpCit7CisJc3RydWN0IG5mc19mYXR0cglmYXR0cjsKKwlzdHJ1Y3QgbmZzM19hY2Nlc3NhcmdzCWFyZyA9IHsKKwkJLmZoCQk9IE5GU19GSChpbm9kZSksCisJfTsKKwlzdHJ1Y3QgbmZzM19hY2Nlc3NyZXMJcmVzID0geworCQkuZmF0dHIJCT0gJmZhdHRyLAorCX07CisJc3RydWN0IHJwY19tZXNzYWdlIG1zZyA9IHsKKwkJLnJwY19wcm9jCT0gJm5mczNfcHJvY2VkdXJlc1tORlMzUFJPQ19BQ0NFU1NdLAorCQkucnBjX2FyZ3AJPSAmYXJnLAorCQkucnBjX3Jlc3AJPSAmcmVzLAorCQkucnBjX2NyZWQJPSBlbnRyeS0+Y3JlZAorCX07CisJaW50IG1vZGUgPSBlbnRyeS0+bWFzazsKKwlpbnQgc3RhdHVzOworCisJZHByaW50aygiTkZTIGNhbGwgIGFjY2Vzc1xuIik7CisJZmF0dHIudmFsaWQgPSAwOworCisJaWYgKG1vZGUgJiBNQVlfUkVBRCkKKwkJYXJnLmFjY2VzcyB8PSBORlMzX0FDQ0VTU19SRUFEOworCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCWlmIChtb2RlICYgTUFZX1dSSVRFKQorCQkJYXJnLmFjY2VzcyB8PSBORlMzX0FDQ0VTU19NT0RJRlkgfCBORlMzX0FDQ0VTU19FWFRFTkQgfCBORlMzX0FDQ0VTU19ERUxFVEU7CisJCWlmIChtb2RlICYgTUFZX0VYRUMpCisJCQlhcmcuYWNjZXNzIHw9IE5GUzNfQUNDRVNTX0xPT0tVUDsKKwl9IGVsc2UgeworCQlpZiAobW9kZSAmIE1BWV9XUklURSkKKwkJCWFyZy5hY2Nlc3MgfD0gTkZTM19BQ0NFU1NfTU9ESUZZIHwgTkZTM19BQ0NFU1NfRVhURU5EOworCQlpZiAobW9kZSAmIE1BWV9FWEVDKQorCQkJYXJnLmFjY2VzcyB8PSBORlMzX0FDQ0VTU19FWEVDVVRFOworCX0KKwlzdGF0dXMgPSBycGNfY2FsbF9zeW5jKE5GU19DTElFTlQoaW5vZGUpLCAmbXNnLCAwKTsKKwluZnNfcmVmcmVzaF9pbm9kZShpbm9kZSwgJmZhdHRyKTsKKwlpZiAoc3RhdHVzID09IDApIHsKKwkJZW50cnktPm1hc2sgPSAwOworCQlpZiAocmVzLmFjY2VzcyAmIE5GUzNfQUNDRVNTX1JFQUQpCisJCQllbnRyeS0+bWFzayB8PSBNQVlfUkVBRDsKKwkJaWYgKHJlcy5hY2Nlc3MgJiAoTkZTM19BQ0NFU1NfTU9ESUZZIHwgTkZTM19BQ0NFU1NfRVhURU5EIHwgTkZTM19BQ0NFU1NfREVMRVRFKSkKKwkJCWVudHJ5LT5tYXNrIHw9IE1BWV9XUklURTsKKwkJaWYgKHJlcy5hY2Nlc3MgJiAoTkZTM19BQ0NFU1NfTE9PS1VQfE5GUzNfQUNDRVNTX0VYRUNVVEUpKQorCQkJZW50cnktPm1hc2sgfD0gTUFZX0VYRUM7CisJfQorCWRwcmludGsoIk5GUyByZXBseSBhY2Nlc3M6ICVkXG4iLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgbmZzM19wcm9jX3JlYWRsaW5rKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlICpwYWdlLAorCQl1bnNpZ25lZCBpbnQgcGdiYXNlLCB1bnNpZ25lZCBpbnQgcGdsZW4pCit7CisJc3RydWN0IG5mc19mYXR0cglmYXR0cjsKKwlzdHJ1Y3QgbmZzM19yZWFkbGlua2FyZ3MgYXJncyA9IHsKKwkJLmZoCQk9IE5GU19GSChpbm9kZSksCisJCS5wZ2Jhc2UJCT0gcGdiYXNlLAorCQkucGdsZW4JCT0gcGdsZW4sCisJCS5wYWdlcwkJPSAmcGFnZQorCX07CisJaW50CQkJc3RhdHVzOworCisJZHByaW50aygiTkZTIGNhbGwgIHJlYWRsaW5rXG4iKTsKKwlmYXR0ci52YWxpZCA9IDA7CisJc3RhdHVzID0gcnBjX2NhbGwoTkZTX0NMSUVOVChpbm9kZSksIE5GUzNQUk9DX1JFQURMSU5LLAorCQkJICAmYXJncywgJmZhdHRyLCAwKTsKKwluZnNfcmVmcmVzaF9pbm9kZShpbm9kZSwgJmZhdHRyKTsKKwlkcHJpbnRrKCJORlMgcmVwbHkgcmVhZGxpbms6ICVkXG4iLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgbmZzM19wcm9jX3JlYWQoc3RydWN0IG5mc19yZWFkX2RhdGEgKnJkYXRhKQoreworCWludAkJCWZsYWdzID0gcmRhdGEtPmZsYWdzOworCXN0cnVjdCBpbm9kZSAqCQlpbm9kZSA9IHJkYXRhLT5pbm9kZTsKKwlzdHJ1Y3QgbmZzX2ZhdHRyICoJZmF0dHIgPSByZGF0YS0+cmVzLmZhdHRyOworCXN0cnVjdCBycGNfbWVzc2FnZQltc2cgPSB7CisJCS5ycGNfcHJvYwk9ICZuZnMzX3Byb2NlZHVyZXNbTkZTM1BST0NfUkVBRF0sCisJCS5ycGNfYXJncAk9ICZyZGF0YS0+YXJncywKKwkJLnJwY19yZXNwCT0gJnJkYXRhLT5yZXMsCisJCS5ycGNfY3JlZAk9IHJkYXRhLT5jcmVkLAorCX07CisJaW50CQkJc3RhdHVzOworCisJZHByaW50aygiTkZTIGNhbGwgIHJlYWQgJWQgQCAlTGRcbiIsIHJkYXRhLT5hcmdzLmNvdW50LAorCQkJKGxvbmcgbG9uZykgcmRhdGEtPmFyZ3Mub2Zmc2V0KTsKKwlmYXR0ci0+dmFsaWQgPSAwOworCXN0YXR1cyA9IHJwY19jYWxsX3N5bmMoTkZTX0NMSUVOVChpbm9kZSksICZtc2csIGZsYWdzKTsKKwlpZiAoc3RhdHVzID49IDApCisJCW5mc19yZWZyZXNoX2lub2RlKGlub2RlLCBmYXR0cik7CisJZHByaW50aygiTkZTIHJlcGx5IHJlYWQ6ICVkXG4iLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgbmZzM19wcm9jX3dyaXRlKHN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqd2RhdGEpCit7CisJaW50CQkJcnBjZmxhZ3MgPSB3ZGF0YS0+ZmxhZ3M7CisJc3RydWN0IGlub2RlICoJCWlub2RlID0gd2RhdGEtPmlub2RlOworCXN0cnVjdCBuZnNfZmF0dHIgKglmYXR0ciA9IHdkYXRhLT5yZXMuZmF0dHI7CisJc3RydWN0IHJwY19tZXNzYWdlCW1zZyA9IHsKKwkJLnJwY19wcm9jCT0gJm5mczNfcHJvY2VkdXJlc1tORlMzUFJPQ19XUklURV0sCisJCS5ycGNfYXJncAk9ICZ3ZGF0YS0+YXJncywKKwkJLnJwY19yZXNwCT0gJndkYXRhLT5yZXMsCisJCS5ycGNfY3JlZAk9IHdkYXRhLT5jcmVkLAorCX07CisJaW50CQkJc3RhdHVzOworCisJZHByaW50aygiTkZTIGNhbGwgIHdyaXRlICVkIEAgJUxkXG4iLCB3ZGF0YS0+YXJncy5jb3VudCwKKwkJCShsb25nIGxvbmcpIHdkYXRhLT5hcmdzLm9mZnNldCk7CisJZmF0dHItPnZhbGlkID0gMDsKKwlzdGF0dXMgPSBycGNfY2FsbF9zeW5jKE5GU19DTElFTlQoaW5vZGUpLCAmbXNnLCBycGNmbGFncyk7CisJaWYgKHN0YXR1cyA+PSAwKQorCQluZnNfcmVmcmVzaF9pbm9kZShpbm9kZSwgZmF0dHIpOworCWRwcmludGsoIk5GUyByZXBseSB3cml0ZTogJWRcbiIsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1cyA8IDA/IHN0YXR1cyA6IHdkYXRhLT5yZXMuY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgbmZzM19wcm9jX2NvbW1pdChzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKmNkYXRhKQoreworCXN0cnVjdCBpbm9kZSAqCQlpbm9kZSA9IGNkYXRhLT5pbm9kZTsKKwlzdHJ1Y3QgbmZzX2ZhdHRyICoJZmF0dHIgPSBjZGF0YS0+cmVzLmZhdHRyOworCXN0cnVjdCBycGNfbWVzc2FnZQltc2cgPSB7CisJCS5ycGNfcHJvYwk9ICZuZnMzX3Byb2NlZHVyZXNbTkZTM1BST0NfQ09NTUlUXSwKKwkJLnJwY19hcmdwCT0gJmNkYXRhLT5hcmdzLAorCQkucnBjX3Jlc3AJPSAmY2RhdGEtPnJlcywKKwkJLnJwY19jcmVkCT0gY2RhdGEtPmNyZWQsCisJfTsKKwlpbnQJCQlzdGF0dXM7CisKKwlkcHJpbnRrKCJORlMgY2FsbCAgY29tbWl0ICVkIEAgJUxkXG4iLCBjZGF0YS0+YXJncy5jb3VudCwKKwkJCShsb25nIGxvbmcpIGNkYXRhLT5hcmdzLm9mZnNldCk7CisJZmF0dHItPnZhbGlkID0gMDsKKwlzdGF0dXMgPSBycGNfY2FsbF9zeW5jKE5GU19DTElFTlQoaW5vZGUpLCAmbXNnLCAwKTsKKwlpZiAoc3RhdHVzID49IDApCisJCW5mc19yZWZyZXNoX2lub2RlKGlub2RlLCBmYXR0cik7CisJZHByaW50aygiTkZTIHJlcGx5IGNvbW1pdDogJWRcbiIsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIENyZWF0ZSBhIHJlZ3VsYXIgZmlsZS4KKyAqIEZvciBub3csIHdlIGRvbid0IGltcGxlbWVudCBPX0VYQ0wuCisgKi8KK3N0YXRpYyBpbnQKK25mczNfcHJvY19jcmVhdGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICpzYXR0ciwKKwkJIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgbmZzX2ZoCQlmaGFuZGxlOworCXN0cnVjdCBuZnNfZmF0dHIJZmF0dHI7CisJc3RydWN0IG5mc19mYXR0cglkaXJfYXR0cjsKKwlzdHJ1Y3QgbmZzM19jcmVhdGVhcmdzCWFyZyA9IHsKKwkJLmZoCQk9IE5GU19GSChkaXIpLAorCQkubmFtZQkJPSBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkubGVuCQk9IGRlbnRyeS0+ZF9uYW1lLmxlbiwKKwkJLnNhdHRyCQk9IHNhdHRyLAorCX07CisJc3RydWN0IG5mczNfZGlyb3ByZXMJcmVzID0geworCQkuZGlyX2F0dHIJPSAmZGlyX2F0dHIsCisJCS5maAkJPSAmZmhhbmRsZSwKKwkJLmZhdHRyCQk9ICZmYXR0cgorCX07CisJaW50CQkJc3RhdHVzOworCisJZHByaW50aygiTkZTIGNhbGwgIGNyZWF0ZSAlc1xuIiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisJYXJnLmNyZWF0ZW1vZGUgPSBORlMzX0NSRUFURV9VTkNIRUNLRUQ7CisJaWYgKGZsYWdzICYgT19FWENMKSB7CisJCWFyZy5jcmVhdGVtb2RlICA9IE5GUzNfQ1JFQVRFX0VYQ0xVU0lWRTsKKwkJYXJnLnZlcmlmaWVyWzBdID0gamlmZmllczsKKwkJYXJnLnZlcmlmaWVyWzFdID0gY3VycmVudC0+cGlkOworCX0KKworYWdhaW46CisJZGlyX2F0dHIudmFsaWQgPSAwOworCWZhdHRyLnZhbGlkID0gMDsKKwlzdGF0dXMgPSBycGNfY2FsbChORlNfQ0xJRU5UKGRpciksIE5GUzNQUk9DX0NSRUFURSwgJmFyZywgJnJlcywgMCk7CisJbmZzX3JlZnJlc2hfaW5vZGUoZGlyLCAmZGlyX2F0dHIpOworCisJLyogSWYgdGhlIHNlcnZlciBkb2Vzbid0IHN1cHBvcnQgdGhlIGV4Y2x1c2l2ZSBjcmVhdGlvbiBzZW1hbnRpY3MsCisJICogdHJ5IGFnYWluIHdpdGggc2ltcGxlICdndWFyZGVkJyBtb2RlLiAqLworCWlmIChzdGF0dXMgPT0gTkZTRVJSX05PVFNVUFApIHsKKwkJc3dpdGNoIChhcmcuY3JlYXRlbW9kZSkgeworCQkJY2FzZSBORlMzX0NSRUFURV9FWENMVVNJVkU6CisJCQkJYXJnLmNyZWF0ZW1vZGUgPSBORlMzX0NSRUFURV9HVUFSREVEOworCQkJCWJyZWFrOworCisJCQljYXNlIE5GUzNfQ1JFQVRFX0dVQVJERUQ6CisJCQkJYXJnLmNyZWF0ZW1vZGUgPSBORlMzX0NSRUFURV9VTkNIRUNLRUQ7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgTkZTM19DUkVBVEVfVU5DSEVDS0VEOgorCQkJCWdvdG8gb3V0OworCQl9CisJCWdvdG8gYWdhaW47CisJfQorCisJaWYgKHN0YXR1cyA9PSAwKQorCQlzdGF0dXMgPSBuZnNfaW5zdGFudGlhdGUoZGVudHJ5LCAmZmhhbmRsZSwgJmZhdHRyKTsKKwlpZiAoc3RhdHVzICE9IDApCisJCWdvdG8gb3V0OworCisJLyogV2hlbiB3ZSBjcmVhdGVkIHRoZSBmaWxlIHdpdGggZXhjbHVzaXZlIHNlbWFudGljcywgbWFrZQorCSAqIHN1cmUgd2Ugc2V0IHRoZSBhdHRyaWJ1dGVzIGFmdGVyd2FyZHMuICovCisJaWYgKGFyZy5jcmVhdGVtb2RlID09IE5GUzNfQ1JFQVRFX0VYQ0xVU0lWRSkgeworCQlkcHJpbnRrKCJORlMgY2FsbCAgc2V0YXR0ciAocG9zdC1jcmVhdGUpXG4iKTsKKworCQlpZiAoIShzYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0FUSU1FX1NFVCkpCisJCQlzYXR0ci0+aWFfdmFsaWQgfD0gQVRUUl9BVElNRTsKKwkJaWYgKCEoc2F0dHItPmlhX3ZhbGlkICYgQVRUUl9NVElNRV9TRVQpKQorCQkJc2F0dHItPmlhX3ZhbGlkIHw9IEFUVFJfTVRJTUU7CisKKwkJLyogTm90ZTogd2UgY291bGQgdXNlIGEgZ3VhcmRlZCBzZXRhdHRyIGhlcmUsIGJ1dCBJJ20KKwkJICogbm90IHN1cmUgdGhpcyBidXlzIHVzIGFueXRoaW5nIChhbmQgSSdkIGhhdmUKKwkJICogdG8gcmV2YW1wIHRoZSBORlN2MyBYRFIgY29kZSkgKi8KKwkJc3RhdHVzID0gbmZzM19wcm9jX3NldGF0dHIoZGVudHJ5LCAmZmF0dHIsIHNhdHRyKTsKKwkJbmZzX3JlZnJlc2hfaW5vZGUoZGVudHJ5LT5kX2lub2RlLCAmZmF0dHIpOworCQlkcHJpbnRrKCJORlMgcmVwbHkgc2V0YXR0ciAocG9zdC1jcmVhdGUpOiAlZFxuIiwgc3RhdHVzKTsKKwl9CitvdXQ6CisJZHByaW50aygiTkZTIHJlcGx5IGNyZWF0ZTogJWRcbiIsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludAorbmZzM19wcm9jX3JlbW92ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHFzdHIgKm5hbWUpCit7CisJc3RydWN0IG5mc19mYXR0cglkaXJfYXR0cjsKKwlzdHJ1Y3QgbmZzM19kaXJvcGFyZ3MJYXJnID0geworCQkuZmgJCT0gTkZTX0ZIKGRpciksCisJCS5uYW1lCQk9IG5hbWUtPm5hbWUsCisJCS5sZW4JCT0gbmFtZS0+bGVuCisJfTsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UJbXNnID0geworCQkucnBjX3Byb2MJPSAmbmZzM19wcm9jZWR1cmVzW05GUzNQUk9DX1JFTU9WRV0sCisJCS5ycGNfYXJncAk9ICZhcmcsCisJCS5ycGNfcmVzcAk9ICZkaXJfYXR0ciwKKwl9OworCWludAkJCXN0YXR1czsKKworCWRwcmludGsoIk5GUyBjYWxsICByZW1vdmUgJXNcbiIsIG5hbWUtPm5hbWUpOworCWRpcl9hdHRyLnZhbGlkID0gMDsKKwlzdGF0dXMgPSBycGNfY2FsbF9zeW5jKE5GU19DTElFTlQoZGlyKSwgJm1zZywgMCk7CisJbmZzX3JlZnJlc2hfaW5vZGUoZGlyLCAmZGlyX2F0dHIpOworCWRwcmludGsoIk5GUyByZXBseSByZW1vdmU6ICVkXG4iLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQKK25mczNfcHJvY191bmxpbmtfc2V0dXAoc3RydWN0IHJwY19tZXNzYWdlICptc2csIHN0cnVjdCBkZW50cnkgKmRpciwgc3RydWN0IHFzdHIgKm5hbWUpCit7CisJc3RydWN0IHVubGlua3hkciB7CisJCXN0cnVjdCBuZnMzX2Rpcm9wYXJncyBhcmc7CisJCXN0cnVjdCBuZnNfZmF0dHIgcmVzOworCX0gKnB0cjsKKworCXB0ciA9IChzdHJ1Y3QgdW5saW5reGRyICopa21hbGxvYyhzaXplb2YoKnB0ciksIEdGUF9LRVJORUwpOworCWlmICghcHRyKQorCQlyZXR1cm4gLUVOT01FTTsKKwlwdHItPmFyZy5maCA9IE5GU19GSChkaXItPmRfaW5vZGUpOworCXB0ci0+YXJnLm5hbWUgPSBuYW1lLT5uYW1lOworCXB0ci0+YXJnLmxlbiA9IG5hbWUtPmxlbjsKKwlwdHItPnJlcy52YWxpZCA9IDA7CisJbXNnLT5ycGNfcHJvYyA9ICZuZnMzX3Byb2NlZHVyZXNbTkZTM1BST0NfUkVNT1ZFXTsKKwltc2ctPnJwY19hcmdwID0gJnB0ci0+YXJnOworCW1zZy0+cnBjX3Jlc3AgPSAmcHRyLT5yZXM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25mczNfcHJvY191bmxpbmtfZG9uZShzdHJ1Y3QgZGVudHJ5ICpkaXIsIHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UgKm1zZyA9ICZ0YXNrLT50a19tc2c7CisJc3RydWN0IG5mc19mYXR0cgkqZGlyX2F0dHI7CisKKwlpZiAobmZzM19hc3luY19oYW5kbGVfanVrZWJveCh0YXNrKSkKKwkJcmV0dXJuIDE7CisJaWYgKG1zZy0+cnBjX2FyZ3ApIHsKKwkJZGlyX2F0dHIgPSAoc3RydWN0IG5mc19mYXR0ciopbXNnLT5ycGNfcmVzcDsKKwkJbmZzX3JlZnJlc2hfaW5vZGUoZGlyLT5kX2lub2RlLCBkaXJfYXR0cik7CisJCWtmcmVlKG1zZy0+cnBjX2FyZ3ApOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbmZzM19wcm9jX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBxc3RyICpvbGRfbmFtZSwKKwkJIHN0cnVjdCBpbm9kZSAqbmV3X2Rpciwgc3RydWN0IHFzdHIgKm5ld19uYW1lKQoreworCXN0cnVjdCBuZnNfZmF0dHIJb2xkX2Rpcl9hdHRyLCBuZXdfZGlyX2F0dHI7CisJc3RydWN0IG5mczNfcmVuYW1lYXJncwlhcmcgPSB7CisJCS5mcm9tZmgJCT0gTkZTX0ZIKG9sZF9kaXIpLAorCQkuZnJvbW5hbWUJPSBvbGRfbmFtZS0+bmFtZSwKKwkJLmZyb21sZW4JPSBvbGRfbmFtZS0+bGVuLAorCQkudG9maAkJPSBORlNfRkgobmV3X2RpciksCisJCS50b25hbWUJCT0gbmV3X25hbWUtPm5hbWUsCisJCS50b2xlbgkJPSBuZXdfbmFtZS0+bGVuCisJfTsKKwlzdHJ1Y3QgbmZzM19yZW5hbWVyZXMJcmVzID0geworCQkuZnJvbWF0dHIJPSAmb2xkX2Rpcl9hdHRyLAorCQkudG9hdHRyCQk9ICZuZXdfZGlyX2F0dHIKKwl9OworCWludAkJCXN0YXR1czsKKworCWRwcmludGsoIk5GUyBjYWxsICByZW5hbWUgJXMgLT4gJXNcbiIsIG9sZF9uYW1lLT5uYW1lLCBuZXdfbmFtZS0+bmFtZSk7CisJb2xkX2Rpcl9hdHRyLnZhbGlkID0gMDsKKwluZXdfZGlyX2F0dHIudmFsaWQgPSAwOworCXN0YXR1cyA9IHJwY19jYWxsKE5GU19DTElFTlQob2xkX2RpciksIE5GUzNQUk9DX1JFTkFNRSwgJmFyZywgJnJlcywgMCk7CisJbmZzX3JlZnJlc2hfaW5vZGUob2xkX2RpciwgJm9sZF9kaXJfYXR0cik7CisJbmZzX3JlZnJlc2hfaW5vZGUobmV3X2RpciwgJm5ld19kaXJfYXR0cik7CisJZHByaW50aygiTkZTIHJlcGx5IHJlbmFtZTogJWRcbiIsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludAorbmZzM19wcm9jX2xpbmsoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBxc3RyICpuYW1lKQoreworCXN0cnVjdCBuZnNfZmF0dHIJZGlyX2F0dHIsIGZhdHRyOworCXN0cnVjdCBuZnMzX2xpbmthcmdzCWFyZyA9IHsKKwkJLmZyb21maAkJPSBORlNfRkgoaW5vZGUpLAorCQkudG9maAkJPSBORlNfRkgoZGlyKSwKKwkJLnRvbmFtZQkJPSBuYW1lLT5uYW1lLAorCQkudG9sZW4JCT0gbmFtZS0+bGVuCisJfTsKKwlzdHJ1Y3QgbmZzM19saW5rcmVzCXJlcyA9IHsKKwkJLmRpcl9hdHRyCT0gJmRpcl9hdHRyLAorCQkuZmF0dHIJCT0gJmZhdHRyCisJfTsKKwlpbnQJCQlzdGF0dXM7CisKKwlkcHJpbnRrKCJORlMgY2FsbCAgbGluayAlc1xuIiwgbmFtZS0+bmFtZSk7CisJZGlyX2F0dHIudmFsaWQgPSAwOworCWZhdHRyLnZhbGlkID0gMDsKKwlzdGF0dXMgPSBycGNfY2FsbChORlNfQ0xJRU5UKGlub2RlKSwgTkZTM1BST0NfTElOSywgJmFyZywgJnJlcywgMCk7CisJbmZzX3JlZnJlc2hfaW5vZGUoZGlyLCAmZGlyX2F0dHIpOworCW5mc19yZWZyZXNoX2lub2RlKGlub2RlLCAmZmF0dHIpOworCWRwcmludGsoIk5GUyByZXBseSBsaW5rOiAlZFxuIiwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50CituZnMzX3Byb2Nfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHFzdHIgKm5hbWUsIHN0cnVjdCBxc3RyICpwYXRoLAorCQkgIHN0cnVjdCBpYXR0ciAqc2F0dHIsIHN0cnVjdCBuZnNfZmggKmZoYW5kbGUsCisJCSAgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCit7CisJc3RydWN0IG5mc19mYXR0cglkaXJfYXR0cjsKKwlzdHJ1Y3QgbmZzM19zeW1saW5rYXJncwlhcmcgPSB7CisJCS5mcm9tZmgJCT0gTkZTX0ZIKGRpciksCisJCS5mcm9tbmFtZQk9IG5hbWUtPm5hbWUsCisJCS5mcm9tbGVuCT0gbmFtZS0+bGVuLAorCQkudG9wYXRoCQk9IHBhdGgtPm5hbWUsCisJCS50b2xlbgkJPSBwYXRoLT5sZW4sCisJCS5zYXR0cgkJPSBzYXR0cgorCX07CisJc3RydWN0IG5mczNfZGlyb3ByZXMJcmVzID0geworCQkuZGlyX2F0dHIJPSAmZGlyX2F0dHIsCisJCS5maAkJPSBmaGFuZGxlLAorCQkuZmF0dHIJCT0gZmF0dHIKKwl9OworCWludAkJCXN0YXR1czsKKworCWlmIChwYXRoLT5sZW4gPiBORlMzX01BWFBBVEhMRU4pCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCWRwcmludGsoIk5GUyBjYWxsICBzeW1saW5rICVzIC0+ICVzXG4iLCBuYW1lLT5uYW1lLCBwYXRoLT5uYW1lKTsKKwlkaXJfYXR0ci52YWxpZCA9IDA7CisJZmF0dHItPnZhbGlkID0gMDsKKwlzdGF0dXMgPSBycGNfY2FsbChORlNfQ0xJRU5UKGRpciksIE5GUzNQUk9DX1NZTUxJTkssICZhcmcsICZyZXMsIDApOworCW5mc19yZWZyZXNoX2lub2RlKGRpciwgJmRpcl9hdHRyKTsKKwlkcHJpbnRrKCJORlMgcmVwbHkgc3ltbGluazogJWRcbiIsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludAorbmZzM19wcm9jX21rZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqc2F0dHIpCit7CisJc3RydWN0IG5mc19maCBmaGFuZGxlOworCXN0cnVjdCBuZnNfZmF0dHIgZmF0dHIsIGRpcl9hdHRyOworCXN0cnVjdCBuZnMzX21rZGlyYXJncwlhcmcgPSB7CisJCS5maAkJPSBORlNfRkgoZGlyKSwKKwkJLm5hbWUJCT0gZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJLmxlbgkJPSBkZW50cnktPmRfbmFtZS5sZW4sCisJCS5zYXR0cgkJPSBzYXR0cgorCX07CisJc3RydWN0IG5mczNfZGlyb3ByZXMJcmVzID0geworCQkuZGlyX2F0dHIJPSAmZGlyX2F0dHIsCisJCS5maAkJPSAmZmhhbmRsZSwKKwkJLmZhdHRyCQk9ICZmYXR0cgorCX07CisJaW50CQkJc3RhdHVzOworCisJZHByaW50aygiTkZTIGNhbGwgIG1rZGlyICVzXG4iLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwlkaXJfYXR0ci52YWxpZCA9IDA7CisJZmF0dHIudmFsaWQgPSAwOworCXN0YXR1cyA9IHJwY19jYWxsKE5GU19DTElFTlQoZGlyKSwgTkZTM1BST0NfTUtESVIsICZhcmcsICZyZXMsIDApOworCW5mc19yZWZyZXNoX2lub2RlKGRpciwgJmRpcl9hdHRyKTsKKwlpZiAoc3RhdHVzID09IDApCisJCXN0YXR1cyA9IG5mc19pbnN0YW50aWF0ZShkZW50cnksICZmaGFuZGxlLCAmZmF0dHIpOworCWRwcmludGsoIk5GUyByZXBseSBta2RpcjogJWRcbiIsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludAorbmZzM19wcm9jX3JtZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgcXN0ciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbmZzX2ZhdHRyCWRpcl9hdHRyOworCXN0cnVjdCBuZnMzX2Rpcm9wYXJncwlhcmcgPSB7CisJCS5maAkJPSBORlNfRkgoZGlyKSwKKwkJLm5hbWUJCT0gbmFtZS0+bmFtZSwKKwkJLmxlbgkJPSBuYW1lLT5sZW4KKwl9OworCWludAkJCXN0YXR1czsKKworCWRwcmludGsoIk5GUyBjYWxsICBybWRpciAlc1xuIiwgbmFtZS0+bmFtZSk7CisJZGlyX2F0dHIudmFsaWQgPSAwOworCXN0YXR1cyA9IHJwY19jYWxsKE5GU19DTElFTlQoZGlyKSwgTkZTM1BST0NfUk1ESVIsICZhcmcsICZkaXJfYXR0ciwgMCk7CisJbmZzX3JlZnJlc2hfaW5vZGUoZGlyLCAmZGlyX2F0dHIpOworCWRwcmludGsoIk5GUyByZXBseSBybWRpcjogJWRcbiIsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIFRoZSBSRUFERElSIGltcGxlbWVudGF0aW9uIGlzIHNvbWV3aGF0IGhhY2tpc2ggLSB3ZSBwYXNzIHRoZSB1c2VyIGJ1ZmZlcgorICogdG8gdGhlIGVuY29kZSBmdW5jdGlvbiwgd2hpY2ggaW5zdGFsbHMgaXQgaW4gdGhlIHJlY2VpdmUgaW92ZWMuCisgKiBUaGUgZGVjb2RlIGZ1bmN0aW9uIGl0c2VsZiBkb2Vzbid0IHBlcmZvcm0gYW55IGRlY29kaW5nLCBpdCBqdXN0IG1ha2VzCisgKiBzdXJlIHRoZSByZXBseSBpcyBzeW50YWN0aWNhbGx5IGNvcnJlY3QuCisgKgorICogQWxzbyBub3RlIHRoYXQgdGhpcyBpbXBsZW1lbnRhdGlvbiBoYW5kbGVzIGJvdGggcGxhaW4gcmVhZGRpciBhbmQKKyAqIHJlYWRkaXJwbHVzLgorICovCitzdGF0aWMgaW50CituZnMzX3Byb2NfcmVhZGRpcihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBycGNfY3JlZCAqY3JlZCwKKwkJICB1NjQgY29va2llLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgaW50IGNvdW50LCBpbnQgcGx1cykKK3sKKwlzdHJ1Y3QgaW5vZGUJCSpkaXIgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IG5mc19mYXR0cglkaXJfYXR0cjsKKwl1MzIJCQkqdmVyZiA9IE5GU19DT09LSUVWRVJGKGRpcik7CisJc3RydWN0IG5mczNfcmVhZGRpcmFyZ3MJYXJnID0geworCQkuZmgJCT0gTkZTX0ZIKGRpciksCisJCS5jb29raWUJCT0gY29va2llLAorCQkudmVyZgkJPSB7dmVyZlswXSwgdmVyZlsxXX0sCisJCS5wbHVzCQk9IHBsdXMsCisJCS5jb3VudAkJPSBjb3VudCwKKwkJLnBhZ2VzCQk9ICZwYWdlCisJfTsKKwlzdHJ1Y3QgbmZzM19yZWFkZGlycmVzCXJlcyA9IHsKKwkJLmRpcl9hdHRyCT0gJmRpcl9hdHRyLAorCQkudmVyZgkJPSB2ZXJmLAorCQkucGx1cwkJPSBwbHVzCisJfTsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UJbXNnID0geworCQkucnBjX3Byb2MJPSAmbmZzM19wcm9jZWR1cmVzW05GUzNQUk9DX1JFQURESVJdLAorCQkucnBjX2FyZ3AJPSAmYXJnLAorCQkucnBjX3Jlc3AJPSAmcmVzLAorCQkucnBjX2NyZWQJPSBjcmVkCisJfTsKKwlpbnQJCQlzdGF0dXM7CisKKwlsb2NrX2tlcm5lbCgpOworCisJaWYgKHBsdXMpCisJCW1zZy5ycGNfcHJvYyA9ICZuZnMzX3Byb2NlZHVyZXNbTkZTM1BST0NfUkVBRERJUlBMVVNdOworCisJZHByaW50aygiTkZTIGNhbGwgIHJlYWRkaXIlcyAlZFxuIiwKKwkJCXBsdXM/ICJwbHVzIiA6ICIiLCAodW5zaWduZWQgaW50KSBjb29raWUpOworCisJZGlyX2F0dHIudmFsaWQgPSAwOworCXN0YXR1cyA9IHJwY19jYWxsX3N5bmMoTkZTX0NMSUVOVChkaXIpLCAmbXNnLCAwKTsKKwluZnNfcmVmcmVzaF9pbm9kZShkaXIsICZkaXJfYXR0cik7CisJZHByaW50aygiTkZTIHJlcGx5IHJlYWRkaXI6ICVkXG4iLCBzdGF0dXMpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50CituZnMzX3Byb2NfbWtub2Qoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICpzYXR0ciwKKwkJZGV2X3QgcmRldikKK3sKKwlzdHJ1Y3QgbmZzX2ZoIGZoOworCXN0cnVjdCBuZnNfZmF0dHIgZmF0dHIsIGRpcl9hdHRyOworCXN0cnVjdCBuZnMzX21rbm9kYXJncwlhcmcgPSB7CisJCS5maAkJPSBORlNfRkgoZGlyKSwKKwkJLm5hbWUJCT0gZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJLmxlbgkJPSBkZW50cnktPmRfbmFtZS5sZW4sCisJCS5zYXR0cgkJPSBzYXR0ciwKKwkJLnJkZXYJCT0gcmRldgorCX07CisJc3RydWN0IG5mczNfZGlyb3ByZXMJcmVzID0geworCQkuZGlyX2F0dHIJPSAmZGlyX2F0dHIsCisJCS5maAkJPSAmZmgsCisJCS5mYXR0cgkJPSAmZmF0dHIKKwl9OworCWludCBzdGF0dXM7CisKKwlzd2l0Y2ggKHNhdHRyLT5pYV9tb2RlICYgU19JRk1UKSB7CisJY2FzZSBTX0lGQkxLOglhcmcudHlwZSA9IE5GM0JMSzsgIGJyZWFrOworCWNhc2UgU19JRkNIUjoJYXJnLnR5cGUgPSBORjNDSFI7ICBicmVhazsKKwljYXNlIFNfSUZJRk86CWFyZy50eXBlID0gTkYzRklGTzsgYnJlYWs7CisJY2FzZSBTX0lGU09DSzoJYXJnLnR5cGUgPSBORjNTT0NLOyBicmVhazsKKwlkZWZhdWx0OglyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkcHJpbnRrKCJORlMgY2FsbCAgbWtub2QgJXMgJXU6JXVcbiIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQlNQUpPUihyZGV2KSwgTUlOT1IocmRldikpOworCWRpcl9hdHRyLnZhbGlkID0gMDsKKwlmYXR0ci52YWxpZCA9IDA7CisJc3RhdHVzID0gcnBjX2NhbGwoTkZTX0NMSUVOVChkaXIpLCBORlMzUFJPQ19NS05PRCwgJmFyZywgJnJlcywgMCk7CisJbmZzX3JlZnJlc2hfaW5vZGUoZGlyLCAmZGlyX2F0dHIpOworCWlmIChzdGF0dXMgPT0gMCkKKwkJc3RhdHVzID0gbmZzX2luc3RhbnRpYXRlKGRlbnRyeSwgJmZoLCAmZmF0dHIpOworCWRwcmludGsoIk5GUyByZXBseSBta25vZDogJWRcbiIsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludAorbmZzM19wcm9jX3N0YXRmcyhzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlLAorCQkgc3RydWN0IG5mc19mc3N0YXQgKnN0YXQpCit7CisJaW50CXN0YXR1czsKKworCWRwcmludGsoIk5GUyBjYWxsICBmc3N0YXRcbiIpOworCXN0YXQtPmZhdHRyLT52YWxpZCA9IDA7CisJc3RhdHVzID0gcnBjX2NhbGwoc2VydmVyLT5jbGllbnQsIE5GUzNQUk9DX0ZTU1RBVCwgZmhhbmRsZSwgc3RhdCwgMCk7CisJZHByaW50aygiTkZTIHJlcGx5IHN0YXRmczogJWRcbiIsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludAorbmZzM19wcm9jX2ZzaW5mbyhzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlLAorCQkgc3RydWN0IG5mc19mc2luZm8gKmluZm8pCit7CisJaW50CXN0YXR1czsKKworCWRwcmludGsoIk5GUyBjYWxsICBmc2luZm9cbiIpOworCWluZm8tPmZhdHRyLT52YWxpZCA9IDA7CisJc3RhdHVzID0gcnBjX2NhbGwoc2VydmVyLT5jbGllbnRfc3lzLCBORlMzUFJPQ19GU0lORk8sIGZoYW5kbGUsIGluZm8sIDApOworCWRwcmludGsoIk5GUyByZXBseSBmc2luZm86ICVkXG4iLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQKK25mczNfcHJvY19wYXRoY29uZihzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlLAorCQkgICBzdHJ1Y3QgbmZzX3BhdGhjb25mICppbmZvKQoreworCWludAlzdGF0dXM7CisKKwlkcHJpbnRrKCJORlMgY2FsbCAgcGF0aGNvbmZcbiIpOworCWluZm8tPmZhdHRyLT52YWxpZCA9IDA7CisJc3RhdHVzID0gcnBjX2NhbGwoc2VydmVyLT5jbGllbnQsIE5GUzNQUk9DX1BBVEhDT05GLCBmaGFuZGxlLCBpbmZvLCAwKTsKKwlkcHJpbnRrKCJORlMgcmVwbHkgcGF0aGNvbmY6ICVkXG4iLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK2V4dGVybiB1MzIgKm5mczNfZGVjb2RlX2RpcmVudCh1MzIgKiwgc3RydWN0IG5mc19lbnRyeSAqLCBpbnQpOworCitzdGF0aWMgdm9pZAorbmZzM19yZWFkX2RvbmUoc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCXN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqZGF0YSA9IChzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKikgdGFzay0+dGtfY2FsbGRhdGE7CisKKwlpZiAobmZzM19hc3luY19oYW5kbGVfanVrZWJveCh0YXNrKSkKKwkJcmV0dXJuOworCS8qIENhbGwgYmFjayBjb21tb24gTkZTIHJlYWRwYWdlIHByb2Nlc3NpbmcgKi8KKwlpZiAodGFzay0+dGtfc3RhdHVzID49IDApCisJCW5mc19yZWZyZXNoX2lub2RlKGRhdGEtPmlub2RlLCAmZGF0YS0+ZmF0dHIpOworCW5mc19yZWFkcGFnZV9yZXN1bHQodGFzayk7Cit9CisKK3N0YXRpYyB2b2lkCituZnMzX3Byb2NfcmVhZF9zZXR1cChzdHJ1Y3QgbmZzX3JlYWRfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgcnBjX3Rhc2sJCSp0YXNrID0gJmRhdGEtPnRhc2s7CisJc3RydWN0IGlub2RlCQkqaW5vZGUgPSBkYXRhLT5pbm9kZTsKKwlpbnQJCQlmbGFnczsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UJbXNnID0geworCQkucnBjX3Byb2MJPSAmbmZzM19wcm9jZWR1cmVzW05GUzNQUk9DX1JFQURdLAorCQkucnBjX2FyZ3AJPSAmZGF0YS0+YXJncywKKwkJLnJwY19yZXNwCT0gJmRhdGEtPnJlcywKKwkJLnJwY19jcmVkCT0gZGF0YS0+Y3JlZCwKKwl9OworCisJLyogTi5CLiBEbyB3ZSBuZWVkIHRvIHRlc3Q/IE5ldmVyIGNhbGxlZCBmb3Igc3dhcGZpbGUgaW5vZGUgKi8KKwlmbGFncyA9IFJQQ19UQVNLX0FTWU5DIHwgKElTX1NXQVBGSUxFKGlub2RlKT8gTkZTX1JQQ19TV0FQRkxBR1MgOiAwKTsKKworCS8qIEZpbmFsaXplIHRoZSB0YXNrLiAqLworCXJwY19pbml0X3Rhc2sodGFzaywgTkZTX0NMSUVOVChpbm9kZSksIG5mczNfcmVhZF9kb25lLCBmbGFncyk7CisJcnBjX2NhbGxfc2V0dXAodGFzaywgJm1zZywgMCk7Cit9CisKK3N0YXRpYyB2b2lkCituZnMzX3dyaXRlX2RvbmUoc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCXN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqZGF0YTsKKworCWlmIChuZnMzX2FzeW5jX2hhbmRsZV9qdWtlYm94KHRhc2spKQorCQlyZXR1cm47CisJZGF0YSA9IChzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKil0YXNrLT50a19jYWxsZGF0YTsKKwlpZiAodGFzay0+dGtfc3RhdHVzID49IDApCisJCW5mc19yZWZyZXNoX2lub2RlKGRhdGEtPmlub2RlLCBkYXRhLT5yZXMuZmF0dHIpOworCW5mc193cml0ZWJhY2tfZG9uZSh0YXNrKTsKK30KKworc3RhdGljIHZvaWQKK25mczNfcHJvY193cml0ZV9zZXR1cChzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKmRhdGEsIGludCBob3cpCit7CisJc3RydWN0IHJwY190YXNrCQkqdGFzayA9ICZkYXRhLT50YXNrOworCXN0cnVjdCBpbm9kZQkJKmlub2RlID0gZGF0YS0+aW5vZGU7CisJaW50CQkJc3RhYmxlOworCWludAkJCWZsYWdzOworCXN0cnVjdCBycGNfbWVzc2FnZQltc2cgPSB7CisJCS5ycGNfcHJvYwk9ICZuZnMzX3Byb2NlZHVyZXNbTkZTM1BST0NfV1JJVEVdLAorCQkucnBjX2FyZ3AJPSAmZGF0YS0+YXJncywKKwkJLnJwY19yZXNwCT0gJmRhdGEtPnJlcywKKwkJLnJwY19jcmVkCT0gZGF0YS0+Y3JlZCwKKwl9OworCisJaWYgKGhvdyAmIEZMVVNIX1NUQUJMRSkgeworCQlpZiAoIU5GU19JKGlub2RlKS0+bmNvbW1pdCkKKwkJCXN0YWJsZSA9IE5GU19GSUxFX1NZTkM7CisJCWVsc2UKKwkJCXN0YWJsZSA9IE5GU19EQVRBX1NZTkM7CisJfSBlbHNlCisJCXN0YWJsZSA9IE5GU19VTlNUQUJMRTsKKwlkYXRhLT5hcmdzLnN0YWJsZSA9IHN0YWJsZTsKKworCS8qIFNldCB0aGUgaW5pdGlhbCBmbGFncyBmb3IgdGhlIHRhc2suICAqLworCWZsYWdzID0gKGhvdyAmIEZMVVNIX1NZTkMpID8gMCA6IFJQQ19UQVNLX0FTWU5DOworCisJLyogRmluYWxpemUgdGhlIHRhc2suICovCisJcnBjX2luaXRfdGFzayh0YXNrLCBORlNfQ0xJRU5UKGlub2RlKSwgbmZzM193cml0ZV9kb25lLCBmbGFncyk7CisJcnBjX2NhbGxfc2V0dXAodGFzaywgJm1zZywgMCk7Cit9CisKK3N0YXRpYyB2b2lkCituZnMzX2NvbW1pdF9kb25lKHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKmRhdGE7CisKKwlpZiAobmZzM19hc3luY19oYW5kbGVfanVrZWJveCh0YXNrKSkKKwkJcmV0dXJuOworCWRhdGEgPSAoc3RydWN0IG5mc193cml0ZV9kYXRhICopdGFzay0+dGtfY2FsbGRhdGE7CisJaWYgKHRhc2stPnRrX3N0YXR1cyA+PSAwKQorCQluZnNfcmVmcmVzaF9pbm9kZShkYXRhLT5pbm9kZSwgZGF0YS0+cmVzLmZhdHRyKTsKKwluZnNfY29tbWl0X2RvbmUodGFzayk7Cit9CisKK3N0YXRpYyB2b2lkCituZnMzX3Byb2NfY29tbWl0X3NldHVwKHN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqZGF0YSwgaW50IGhvdykKK3sKKwlzdHJ1Y3QgcnBjX3Rhc2sJCSp0YXNrID0gJmRhdGEtPnRhc2s7CisJc3RydWN0IGlub2RlCQkqaW5vZGUgPSBkYXRhLT5pbm9kZTsKKwlpbnQJCQlmbGFnczsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UJbXNnID0geworCQkucnBjX3Byb2MJPSAmbmZzM19wcm9jZWR1cmVzW05GUzNQUk9DX0NPTU1JVF0sCisJCS5ycGNfYXJncAk9ICZkYXRhLT5hcmdzLAorCQkucnBjX3Jlc3AJPSAmZGF0YS0+cmVzLAorCQkucnBjX2NyZWQJPSBkYXRhLT5jcmVkLAorCX07CisKKwkvKiBTZXQgdGhlIGluaXRpYWwgZmxhZ3MgZm9yIHRoZSB0YXNrLiAgKi8KKwlmbGFncyA9IChob3cgJiBGTFVTSF9TWU5DKSA/IDAgOiBSUENfVEFTS19BU1lOQzsKKworCS8qIEZpbmFsaXplIHRoZSB0YXNrLiAqLworCXJwY19pbml0X3Rhc2sodGFzaywgTkZTX0NMSUVOVChpbm9kZSksIG5mczNfY29tbWl0X2RvbmUsIGZsYWdzKTsKKwlycGNfY2FsbF9zZXR1cCh0YXNrLCAmbXNnLCAwKTsKK30KKworc3RhdGljIGludAorbmZzM19wcm9jX2xvY2soc3RydWN0IGZpbGUgKmZpbHAsIGludCBjbWQsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCXJldHVybiBubG1jbG50X3Byb2MoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUsIGNtZCwgZmwpOworfQorCitzdHJ1Y3QgbmZzX3JwY19vcHMJbmZzX3YzX2NsaWVudG9wcyA9IHsKKwkudmVyc2lvbgk9IDMsCQkJLyogcHJvdG9jb2wgdmVyc2lvbiAqLworCS5kZW50cnlfb3BzCT0gJm5mc19kZW50cnlfb3BlcmF0aW9ucywKKwkuZGlyX2lub2RlX29wcwk9ICZuZnNfZGlyX2lub2RlX29wZXJhdGlvbnMsCisJLmdldHJvb3QJPSBuZnMzX3Byb2NfZ2V0X3Jvb3QsCisJLmdldGF0dHIJPSBuZnMzX3Byb2NfZ2V0YXR0ciwKKwkuc2V0YXR0cgk9IG5mczNfcHJvY19zZXRhdHRyLAorCS5sb29rdXAJCT0gbmZzM19wcm9jX2xvb2t1cCwKKwkuYWNjZXNzCQk9IG5mczNfcHJvY19hY2Nlc3MsCisJLnJlYWRsaW5rCT0gbmZzM19wcm9jX3JlYWRsaW5rLAorCS5yZWFkCQk9IG5mczNfcHJvY19yZWFkLAorCS53cml0ZQkJPSBuZnMzX3Byb2Nfd3JpdGUsCisJLmNvbW1pdAkJPSBuZnMzX3Byb2NfY29tbWl0LAorCS5jcmVhdGUJCT0gbmZzM19wcm9jX2NyZWF0ZSwKKwkucmVtb3ZlCQk9IG5mczNfcHJvY19yZW1vdmUsCisJLnVubGlua19zZXR1cAk9IG5mczNfcHJvY191bmxpbmtfc2V0dXAsCisJLnVubGlua19kb25lCT0gbmZzM19wcm9jX3VubGlua19kb25lLAorCS5yZW5hbWUJCT0gbmZzM19wcm9jX3JlbmFtZSwKKwkubGluawkJPSBuZnMzX3Byb2NfbGluaywKKwkuc3ltbGluawk9IG5mczNfcHJvY19zeW1saW5rLAorCS5ta2RpcgkJPSBuZnMzX3Byb2NfbWtkaXIsCisJLnJtZGlyCQk9IG5mczNfcHJvY19ybWRpciwKKwkucmVhZGRpcgk9IG5mczNfcHJvY19yZWFkZGlyLAorCS5ta25vZAkJPSBuZnMzX3Byb2NfbWtub2QsCisJLnN0YXRmcwkJPSBuZnMzX3Byb2Nfc3RhdGZzLAorCS5mc2luZm8JCT0gbmZzM19wcm9jX2ZzaW5mbywKKwkucGF0aGNvbmYJPSBuZnMzX3Byb2NfcGF0aGNvbmYsCisJLmRlY29kZV9kaXJlbnQJPSBuZnMzX2RlY29kZV9kaXJlbnQsCisJLnJlYWRfc2V0dXAJPSBuZnMzX3Byb2NfcmVhZF9zZXR1cCwKKwkud3JpdGVfc2V0dXAJPSBuZnMzX3Byb2Nfd3JpdGVfc2V0dXAsCisJLmNvbW1pdF9zZXR1cAk9IG5mczNfcHJvY19jb21taXRfc2V0dXAsCisJLmZpbGVfb3Blbgk9IG5mc19vcGVuLAorCS5maWxlX3JlbGVhc2UJPSBuZnNfcmVsZWFzZSwKKwkubG9jawkJPSBuZnMzX3Byb2NfbG9jaywKK307CmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzM3hkci5jIGIvZnMvbmZzL25mczN4ZHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzU5M2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzL25mczN4ZHIuYwpAQCAtMCwwICsxLDEwMjMgQEAKKy8qCisgKiBsaW51eC9mcy9uZnMvbmZzM3hkci5jCisgKgorICogWERSIGZ1bmN0aW9ucyB0byBlbmNvZGUvZGVjb2RlIE5GU3YzIFJQQyBhcmd1bWVudHMgYW5kIHJlc3VsdHMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3IE9sYWYgS2lyY2gKKyAqLworCisjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CisjaW5jbHVkZSA8bGludXgvbmZzLmg+CisjaW5jbHVkZSA8bGludXgvbmZzMy5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgorCisjZGVmaW5lIE5GU0RCR19GQUNJTElUWQkJTkZTREJHX1hEUgorCisvKiBNYXBwaW5nIGZyb20gTkZTIGVycm9yIGNvZGUgdG8gImVycm5vIiBlcnJvciBjb2RlLiAqLworI2RlZmluZSBlcnJub19ORlNFUlJfSU8JCUVJTworCitleHRlcm4gaW50CQkJbmZzX3N0YXRfdG9fZXJybm8oaW50KTsKKworLyoKKyAqIERlY2xhcmUgdGhlIHNwYWNlIHJlcXVpcmVtZW50cyBmb3IgTkZTIGFyZ3VtZW50cyBhbmQgcmVwbGllcyBhcworICogbnVtYmVyIG9mIDMyYml0LXdvcmRzCisgKi8KKyNkZWZpbmUgTkZTM19maGFuZGxlX3N6CQkoMSsxNikKKyNkZWZpbmUgTkZTM19maF9zegkJKE5GUzNfZmhhbmRsZV9zeikJLyogc2hvcnRoYW5kICovCisjZGVmaW5lIE5GUzNfc2F0dHJfc3oJCSgxNSkKKyNkZWZpbmUgTkZTM19maWxlbmFtZV9zegkoMSsoTkZTM19NQVhOQU1MRU4+PjIpKQorI2RlZmluZSBORlMzX3BhdGhfc3oJCSgxKyhORlMzX01BWFBBVEhMRU4+PjIpKQorI2RlZmluZSBORlMzX2ZhdHRyX3N6CQkoMjEpCisjZGVmaW5lIE5GUzNfd2NjX2F0dHJfc3oJCSg2KQorI2RlZmluZSBORlMzX3ByZV9vcF9hdHRyX3N6CSgxK05GUzNfd2NjX2F0dHJfc3opCisjZGVmaW5lIE5GUzNfcG9zdF9vcF9hdHRyX3N6CSgxK05GUzNfZmF0dHJfc3opCisjZGVmaW5lIE5GUzNfd2NjX2RhdGFfc3oJCShORlMzX3ByZV9vcF9hdHRyX3N6K05GUzNfcG9zdF9vcF9hdHRyX3N6KQorI2RlZmluZSBORlMzX2Zzc3RhdF9zegkJCisjZGVmaW5lIE5GUzNfZnNpbmZvX3N6CQkKKyNkZWZpbmUgTkZTM19wYXRoY29uZl9zegkJCisjZGVmaW5lIE5GUzNfZW50cnlfc3oJCShORlMzX2ZpbGVuYW1lX3N6KzMpCisKKyNkZWZpbmUgTkZTM19zYXR0cmFyZ3Nfc3oJKE5GUzNfZmhfc3orTkZTM19zYXR0cl9zeiszKQorI2RlZmluZSBORlMzX2Rpcm9wYXJnc19zegkoTkZTM19maF9zeitORlMzX2ZpbGVuYW1lX3N6KQorI2RlZmluZSBORlMzX2FjY2Vzc2FyZ3Nfc3oJKE5GUzNfZmhfc3orMSkKKyNkZWZpbmUgTkZTM19yZWFkbGlua2FyZ3Nfc3oJKE5GUzNfZmhfc3opCisjZGVmaW5lIE5GUzNfcmVhZGFyZ3Nfc3oJKE5GUzNfZmhfc3orMykKKyNkZWZpbmUgTkZTM193cml0ZWFyZ3Nfc3oJKE5GUzNfZmhfc3orNSkKKyNkZWZpbmUgTkZTM19jcmVhdGVhcmdzX3N6CShORlMzX2Rpcm9wYXJnc19zeitORlMzX3NhdHRyX3N6KQorI2RlZmluZSBORlMzX21rZGlyYXJnc19zegkoTkZTM19kaXJvcGFyZ3Nfc3orTkZTM19zYXR0cl9zeikKKyNkZWZpbmUgTkZTM19zeW1saW5rYXJnc19zegkoTkZTM19kaXJvcGFyZ3Nfc3orTkZTM19wYXRoX3N6K05GUzNfc2F0dHJfc3opCisjZGVmaW5lIE5GUzNfbWtub2RhcmdzX3N6CShORlMzX2Rpcm9wYXJnc19zeisyK05GUzNfc2F0dHJfc3opCisjZGVmaW5lIE5GUzNfcmVuYW1lYXJnc19zegkoTkZTM19kaXJvcGFyZ3Nfc3orTkZTM19kaXJvcGFyZ3Nfc3opCisjZGVmaW5lIE5GUzNfbGlua2FyZ3Nfc3oJCShORlMzX2ZoX3N6K05GUzNfZGlyb3BhcmdzX3N6KQorI2RlZmluZSBORlMzX3JlYWRkaXJhcmdzX3N6CShORlMzX2ZoX3N6KzIpCisjZGVmaW5lIE5GUzNfY29tbWl0YXJnc19zegkoTkZTM19maF9zeiszKQorCisjZGVmaW5lIE5GUzNfYXR0cnN0YXRfc3oJKDErTkZTM19mYXR0cl9zeikKKyNkZWZpbmUgTkZTM193Y2NzdGF0X3N6CQkoMStORlMzX3djY19kYXRhX3N6KQorI2RlZmluZSBORlMzX2xvb2t1cHJlc19zegkoMStORlMzX2ZoX3N6KygyICogTkZTM19wb3N0X29wX2F0dHJfc3opKQorI2RlZmluZSBORlMzX2FjY2Vzc3Jlc19zegkoMStORlMzX3Bvc3Rfb3BfYXR0cl9zeisxKQorI2RlZmluZSBORlMzX3JlYWRsaW5rcmVzX3N6CSgxK05GUzNfcG9zdF9vcF9hdHRyX3N6KzEpCisjZGVmaW5lIE5GUzNfcmVhZHJlc19zegkJKDErTkZTM19wb3N0X29wX2F0dHJfc3orMykKKyNkZWZpbmUgTkZTM193cml0ZXJlc19zegkoMStORlMzX3djY19kYXRhX3N6KzQpCisjZGVmaW5lIE5GUzNfY3JlYXRlcmVzX3N6CSgxK05GUzNfZmhfc3orTkZTM19wb3N0X29wX2F0dHJfc3orTkZTM193Y2NfZGF0YV9zeikKKyNkZWZpbmUgTkZTM19yZW5hbWVyZXNfc3oJKDErKDIgKiBORlMzX3djY19kYXRhX3N6KSkKKyNkZWZpbmUgTkZTM19saW5rcmVzX3N6CQkoMStORlMzX3Bvc3Rfb3BfYXR0cl9zeitORlMzX3djY19kYXRhX3N6KQorI2RlZmluZSBORlMzX3JlYWRkaXJyZXNfc3oJKDErTkZTM19wb3N0X29wX2F0dHJfc3orMikKKyNkZWZpbmUgTkZTM19mc3N0YXRyZXNfc3oJKDErTkZTM19wb3N0X29wX2F0dHJfc3orMTMpCisjZGVmaW5lIE5GUzNfZnNpbmZvcmVzX3N6CSgxK05GUzNfcG9zdF9vcF9hdHRyX3N6KzEyKQorI2RlZmluZSBORlMzX3BhdGhjb25mcmVzX3N6CSgxK05GUzNfcG9zdF9vcF9hdHRyX3N6KzYpCisjZGVmaW5lIE5GUzNfY29tbWl0cmVzX3N6CSgxK05GUzNfd2NjX2RhdGFfc3orMikKKworLyoKKyAqIE1hcCBmaWxlIHR5cGUgdG8gU19JRk1UIGJpdHMKKyAqLworc3RhdGljIHN0cnVjdCB7CisJdW5zaWduZWQgaW50CW1vZGU7CisJdW5zaWduZWQgaW50CW5mczJ0eXBlOworfSBuZnNfdHlwZTJmbXRbXSA9IHsKKyAgICAgIHsgMCwJCU5GTk9OCX0sCisgICAgICB7IFNfSUZSRUcsCU5GUkVHCX0sCisgICAgICB7IFNfSUZESVIsCU5GRElSCX0sCisgICAgICB7IFNfSUZCTEssCU5GQkxLCX0sCisgICAgICB7IFNfSUZDSFIsCU5GQ0hSCX0sCisgICAgICB7IFNfSUZMTkssCU5GTE5LCX0sCisgICAgICB7IFNfSUZTT0NLLAlORlNPQ0sJfSwKKyAgICAgIHsgU19JRklGTywJTkZGSUZPCX0sCisgICAgICB7IDAsCQlORkJBRAl9Cit9OworCisvKgorICogQ29tbW9uIE5GUyBYRFIgZnVuY3Rpb25zIGFzIGlubGluZXMKKyAqLworc3RhdGljIGlubGluZSB1MzIgKgoreGRyX2VuY29kZV9maGFuZGxlKHUzMiAqcCwgc3RydWN0IG5mc19maCAqZmgpCit7CisJcmV0dXJuIHhkcl9lbmNvZGVfYXJyYXkocCwgZmgtPmRhdGEsIGZoLT5zaXplKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgKgoreGRyX2RlY29kZV9maGFuZGxlKHUzMiAqcCwgc3RydWN0IG5mc19maCAqZmgpCit7CisJaWYgKChmaC0+c2l6ZSA9IG50b2hsKCpwKyspKSA8PSBORlMzX0ZIU0laRSkgeworCQltZW1jcHkoZmgtPmRhdGEsIHAsIGZoLT5zaXplKTsKKwkJcmV0dXJuIHAgKyBYRFJfUVVBRExFTihmaC0+c2l6ZSk7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKgorICogRW5jb2RlL2RlY29kZSB0aW1lLgorICovCitzdGF0aWMgaW5saW5lIHUzMiAqCit4ZHJfZW5jb2RlX3RpbWUzKHUzMiAqcCwgc3RydWN0IHRpbWVzcGVjICp0aW1lcCkKK3sKKwkqcCsrID0gaHRvbmwodGltZXAtPnR2X3NlYyk7CisJKnArKyA9IGh0b25sKHRpbWVwLT50dl9uc2VjKTsKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIGlubGluZSB1MzIgKgoreGRyX2RlY29kZV90aW1lMyh1MzIgKnAsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXApCit7CisJdGltZXAtPnR2X3NlYyA9IG50b2hsKCpwKyspOworCXRpbWVwLT50dl9uc2VjID0gbnRvaGwoKnArKyk7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyB1MzIgKgoreGRyX2RlY29kZV9mYXR0cih1MzIgKnAsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQoreworCXVuc2lnbmVkIGludAl0eXBlLCBtYWpvciwgbWlub3I7CisJaW50CQlmbW9kZTsKKworCXR5cGUgPSBudG9obCgqcCsrKTsKKwlpZiAodHlwZSA+PSBORjNCQUQpCisJCXR5cGUgPSBORjNCQUQ7CisJZm1vZGUgPSBuZnNfdHlwZTJmbXRbdHlwZV0ubW9kZTsKKwlmYXR0ci0+dHlwZSA9IG5mc190eXBlMmZtdFt0eXBlXS5uZnMydHlwZTsKKwlmYXR0ci0+bW9kZSA9IChudG9obCgqcCsrKSAmIH5TX0lGTVQpIHwgZm1vZGU7CisJZmF0dHItPm5saW5rID0gbnRvaGwoKnArKyk7CisJZmF0dHItPnVpZCA9IG50b2hsKCpwKyspOworCWZhdHRyLT5naWQgPSBudG9obCgqcCsrKTsKKwlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmZmF0dHItPnNpemUpOworCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZmYXR0ci0+ZHUubmZzMy51c2VkKTsKKworCS8qIFR1cm4gcmVtb3RlIGRldmljZSBpbmZvIGludG8gTGludXgtc3BlY2lmaWMgZGV2X3QgKi8KKwltYWpvciA9IG50b2hsKCpwKyspOworCW1pbm9yID0gbnRvaGwoKnArKyk7CisJZmF0dHItPnJkZXYgPSBNS0RFVihtYWpvciwgbWlub3IpOworCWlmIChNQUpPUihmYXR0ci0+cmRldikgIT0gbWFqb3IgfHwgTUlOT1IoZmF0dHItPnJkZXYpICE9IG1pbm9yKQorCQlmYXR0ci0+cmRldiA9IDA7CisKKwlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmZmF0dHItPmZzaWRfdS5uZnMzKTsKKwlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmZmF0dHItPmZpbGVpZCk7CisJcCA9IHhkcl9kZWNvZGVfdGltZTMocCwgJmZhdHRyLT5hdGltZSk7CisJcCA9IHhkcl9kZWNvZGVfdGltZTMocCwgJmZhdHRyLT5tdGltZSk7CisJcCA9IHhkcl9kZWNvZGVfdGltZTMocCwgJmZhdHRyLT5jdGltZSk7CisKKwkvKiBVcGRhdGUgdGhlIG1vZGUgYml0cyAqLworCWZhdHRyLT52YWxpZCB8PSAoTkZTX0FUVFJfRkFUVFIgfCBORlNfQVRUUl9GQVRUUl9WMyk7CisJZmF0dHItPnRpbWVzdGFtcCA9IGppZmZpZXM7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyICoKK3hkcl9lbmNvZGVfc2F0dHIodTMyICpwLCBzdHJ1Y3QgaWF0dHIgKmF0dHIpCit7CisJaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9NT0RFKSB7CisJCSpwKysgPSB4ZHJfb25lOworCQkqcCsrID0gaHRvbmwoYXR0ci0+aWFfbW9kZSk7CisJfSBlbHNlIHsKKwkJKnArKyA9IHhkcl96ZXJvOworCX0KKwlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1VJRCkgeworCQkqcCsrID0geGRyX29uZTsKKwkJKnArKyA9IGh0b25sKGF0dHItPmlhX3VpZCk7CisJfSBlbHNlIHsKKwkJKnArKyA9IHhkcl96ZXJvOworCX0KKwlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0dJRCkgeworCQkqcCsrID0geGRyX29uZTsKKwkJKnArKyA9IGh0b25sKGF0dHItPmlhX2dpZCk7CisJfSBlbHNlIHsKKwkJKnArKyA9IHhkcl96ZXJvOworCX0KKwlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpIHsKKwkJKnArKyA9IHhkcl9vbmU7CisJCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsIChfX3U2NCkgYXR0ci0+aWFfc2l6ZSk7CisJfSBlbHNlIHsKKwkJKnArKyA9IHhkcl96ZXJvOworCX0KKwlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX0FUSU1FX1NFVCkgeworCQkqcCsrID0geGRyX3R3bzsKKwkJcCA9IHhkcl9lbmNvZGVfdGltZTMocCwgJmF0dHItPmlhX2F0aW1lKTsKKwl9IGVsc2UgaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9BVElNRSkgeworCQkqcCsrID0geGRyX29uZTsKKwl9IGVsc2UgeworCQkqcCsrID0geGRyX3plcm87CisJfQorCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfTVRJTUVfU0VUKSB7CisJCSpwKysgPSB4ZHJfdHdvOworCQlwID0geGRyX2VuY29kZV90aW1lMyhwLCAmYXR0ci0+aWFfbXRpbWUpOworCX0gZWxzZSBpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01USU1FKSB7CisJCSpwKysgPSB4ZHJfb25lOworCX0gZWxzZSB7CisJCSpwKysgPSB4ZHJfemVybzsKKwl9CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyICoKK3hkcl9kZWNvZGVfd2NjX2F0dHIodTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK3sKKwlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmZmF0dHItPnByZV9zaXplKTsKKwlwID0geGRyX2RlY29kZV90aW1lMyhwLCAmZmF0dHItPnByZV9tdGltZSk7CisJcCA9IHhkcl9kZWNvZGVfdGltZTMocCwgJmZhdHRyLT5wcmVfY3RpbWUpOworCWZhdHRyLT52YWxpZCB8PSBORlNfQVRUUl9XQ0M7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyICoKK3hkcl9kZWNvZGVfcG9zdF9vcF9hdHRyKHUzMiAqcCwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCit7CisJaWYgKCpwKyspCisJCXAgPSB4ZHJfZGVjb2RlX2ZhdHRyKHAsIGZhdHRyKTsKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIGlubGluZSB1MzIgKgoreGRyX2RlY29kZV9wcmVfb3BfYXR0cih1MzIgKnAsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQoreworCWlmICgqcCsrKQorCQlyZXR1cm4geGRyX2RlY29kZV93Y2NfYXR0cihwLCBmYXR0cik7CisJcmV0dXJuIHA7Cit9CisKKworc3RhdGljIGlubGluZSB1MzIgKgoreGRyX2RlY29kZV93Y2NfZGF0YSh1MzIgKnAsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQoreworCXAgPSB4ZHJfZGVjb2RlX3ByZV9vcF9hdHRyKHAsIGZhdHRyKTsKKwlyZXR1cm4geGRyX2RlY29kZV9wb3N0X29wX2F0dHIocCwgZmF0dHIpOworfQorCisvKgorICogTkZTIGVuY29kZSBmdW5jdGlvbnMKKyAqLworCisvKgorICogRW5jb2RlIGZpbGUgaGFuZGxlIGFyZ3VtZW50CisgKi8KK3N0YXRpYyBpbnQKK25mczNfeGRyX2ZoYW5kbGUoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19maCAqZmgpCit7CisJcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBmaCk7CisJcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOworCXJldHVybiAwOworfQorCisvKgorICogRW5jb2RlIFNFVEFUVFIgYXJndW1lbnRzCisgKi8KK3N0YXRpYyBpbnQKK25mczNfeGRyX3NhdHRyYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzM19zYXR0cmFyZ3MgKmFyZ3MpCit7CisJcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5maCk7CisJcCA9IHhkcl9lbmNvZGVfc2F0dHIocCwgYXJncy0+c2F0dHIpOworCSpwKysgPSBodG9ubChhcmdzLT5ndWFyZCk7CisJaWYgKGFyZ3MtPmd1YXJkKQorCQlwID0geGRyX2VuY29kZV90aW1lMyhwLCAmYXJncy0+Z3VhcmR0aW1lKTsKKwlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBFbmNvZGUgZGlyZWN0b3J5IG9wcyBhcmd1bWVudAorICovCitzdGF0aWMgaW50CituZnMzX3hkcl9kaXJvcGFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mczNfZGlyb3BhcmdzICphcmdzKQoreworCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZmgpOworCXAgPSB4ZHJfZW5jb2RlX2FycmF5KHAsIGFyZ3MtPm5hbWUsIGFyZ3MtPmxlbik7CisJcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOworCXJldHVybiAwOworfQorCisvKgorICogRW5jb2RlIGFjY2VzcygpIGFyZ3VtZW50CisgKi8KK3N0YXRpYyBpbnQKK25mczNfeGRyX2FjY2Vzc2FyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mczNfYWNjZXNzYXJncyAqYXJncykKK3sKKwlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKKwkqcCsrID0gaHRvbmwoYXJncy0+YWNjZXNzKTsKKwlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBcmd1bWVudHMgdG8gYSBSRUFEIGNhbGwuIFNpbmNlIHdlIHJlYWQgZGF0YSBkaXJlY3RseSBpbnRvIHRoZSBwYWdlCisgKiBjYWNoZSwgd2UgYWxzbyBzZXQgdXAgdGhlIHJlcGx5IGlvdmVjIGhlcmUgc28gdGhhdCBpb3ZbMV0gcG9pbnRzCisgKiBleGFjdGx5IHRvIHRoZSBwYWdlIHdlIHdhbnQgdG8gZmV0Y2guCisgKi8KK3N0YXRpYyBpbnQKK25mczNfeGRyX3JlYWRhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfcmVhZGFyZ3MgKmFyZ3MpCit7CisJc3RydWN0IHJwY19hdXRoCSphdXRoID0gcmVxLT5ycV90YXNrLT50a19hdXRoOworCXVuc2lnbmVkIGludCByZXBsZW47CisJdTMyIGNvdW50ID0gYXJncy0+Y291bnQ7CisKKwlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKKwlwID0geGRyX2VuY29kZV9oeXBlcihwLCBhcmdzLT5vZmZzZXQpOworCSpwKysgPSBodG9ubChjb3VudCk7CisJcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOworCisJLyogSW5saW5lIHRoZSBwYWdlIGFycmF5ICovCisJcmVwbGVuID0gKFJQQ19SRVBIRFJTSVpFICsgYXV0aC0+YXVfcnNsYWNrICsgTkZTM19yZWFkcmVzX3N6KSA8PCAyOworCXhkcl9pbmxpbmVfcGFnZXMoJnJlcS0+cnFfcmN2X2J1ZiwgcmVwbGVuLAorCQkJIGFyZ3MtPnBhZ2VzLCBhcmdzLT5wZ2Jhc2UsIGNvdW50KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdyaXRlIGFyZ3VtZW50cy4gU3BsaWNlIHRoZSBidWZmZXIgdG8gYmUgd3JpdHRlbiBpbnRvIHRoZSBpb3ZlYy4KKyAqLworc3RhdGljIGludAorbmZzM194ZHJfd3JpdGVhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfd3JpdGVhcmdzICphcmdzKQoreworCXN0cnVjdCB4ZHJfYnVmICpzbmRidWYgPSAmcmVxLT5ycV9zbmRfYnVmOworCXUzMiBjb3VudCA9IGFyZ3MtPmNvdW50OworCisJcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5maCk7CisJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgYXJncy0+b2Zmc2V0KTsKKwkqcCsrID0gaHRvbmwoY291bnQpOworCSpwKysgPSBodG9ubChhcmdzLT5zdGFibGUpOworCSpwKysgPSBodG9ubChjb3VudCk7CisJc25kYnVmLT5sZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHNuZGJ1Zi0+aGVhZCwgcCk7CisKKwkvKiBDb3B5IHRoZSBwYWdlIGFycmF5ICovCisJeGRyX2VuY29kZV9wYWdlcyhzbmRidWYsIGFyZ3MtPnBhZ2VzLCBhcmdzLT5wZ2Jhc2UsIGNvdW50KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEVuY29kZSBDUkVBVEUgYXJndW1lbnRzCisgKi8KK3N0YXRpYyBpbnQKK25mczNfeGRyX2NyZWF0ZWFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mczNfY3JlYXRlYXJncyAqYXJncykKK3sKKwlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKKwlwID0geGRyX2VuY29kZV9hcnJheShwLCBhcmdzLT5uYW1lLCBhcmdzLT5sZW4pOworCisJKnArKyA9IGh0b25sKGFyZ3MtPmNyZWF0ZW1vZGUpOworCWlmIChhcmdzLT5jcmVhdGVtb2RlID09IE5GUzNfQ1JFQVRFX0VYQ0xVU0lWRSkgeworCQkqcCsrID0gYXJncy0+dmVyaWZpZXJbMF07CisJCSpwKysgPSBhcmdzLT52ZXJpZmllclsxXTsKKwl9IGVsc2UKKwkJcCA9IHhkcl9lbmNvZGVfc2F0dHIocCwgYXJncy0+c2F0dHIpOworCisJcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOworCXJldHVybiAwOworfQorCisvKgorICogRW5jb2RlIE1LRElSIGFyZ3VtZW50cworICovCitzdGF0aWMgaW50CituZnMzX3hkcl9ta2RpcmFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mczNfbWtkaXJhcmdzICphcmdzKQoreworCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZmgpOworCXAgPSB4ZHJfZW5jb2RlX2FycmF5KHAsIGFyZ3MtPm5hbWUsIGFyZ3MtPmxlbik7CisJcCA9IHhkcl9lbmNvZGVfc2F0dHIocCwgYXJncy0+c2F0dHIpOworCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEVuY29kZSBTWU1MSU5LIGFyZ3VtZW50cworICovCitzdGF0aWMgaW50CituZnMzX3hkcl9zeW1saW5rYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzM19zeW1saW5rYXJncyAqYXJncykKK3sKKwlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZyb21maCk7CisJcCA9IHhkcl9lbmNvZGVfYXJyYXkocCwgYXJncy0+ZnJvbW5hbWUsIGFyZ3MtPmZyb21sZW4pOworCXAgPSB4ZHJfZW5jb2RlX3NhdHRyKHAsIGFyZ3MtPnNhdHRyKTsKKwlwID0geGRyX2VuY29kZV9hcnJheShwLCBhcmdzLT50b3BhdGgsIGFyZ3MtPnRvbGVuKTsKKwlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBFbmNvZGUgTUtOT0QgYXJndW1lbnRzCisgKi8KK3N0YXRpYyBpbnQKK25mczNfeGRyX21rbm9kYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzM19ta25vZGFyZ3MgKmFyZ3MpCit7CisJcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5maCk7CisJcCA9IHhkcl9lbmNvZGVfYXJyYXkocCwgYXJncy0+bmFtZSwgYXJncy0+bGVuKTsKKwkqcCsrID0gaHRvbmwoYXJncy0+dHlwZSk7CisJcCA9IHhkcl9lbmNvZGVfc2F0dHIocCwgYXJncy0+c2F0dHIpOworCWlmIChhcmdzLT50eXBlID09IE5GM0NIUiB8fCBhcmdzLT50eXBlID09IE5GM0JMSykgeworCQkqcCsrID0gaHRvbmwoTUFKT1IoYXJncy0+cmRldikpOworCQkqcCsrID0gaHRvbmwoTUlOT1IoYXJncy0+cmRldikpOworCX0KKworCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEVuY29kZSBSRU5BTUUgYXJndW1lbnRzCisgKi8KK3N0YXRpYyBpbnQKK25mczNfeGRyX3JlbmFtZWFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mczNfcmVuYW1lYXJncyAqYXJncykKK3sKKwlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZyb21maCk7CisJcCA9IHhkcl9lbmNvZGVfYXJyYXkocCwgYXJncy0+ZnJvbW5hbWUsIGFyZ3MtPmZyb21sZW4pOworCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+dG9maCk7CisJcCA9IHhkcl9lbmNvZGVfYXJyYXkocCwgYXJncy0+dG9uYW1lLCBhcmdzLT50b2xlbik7CisJcmVxLT5ycV9zbGVuID0geGRyX2FkanVzdF9pb3ZlYyhyZXEtPnJxX3N2ZWMsIHApOworCXJldHVybiAwOworfQorCisvKgorICogRW5jb2RlIExJTksgYXJndW1lbnRzCisgKi8KK3N0YXRpYyBpbnQKK25mczNfeGRyX2xpbmthcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnMzX2xpbmthcmdzICphcmdzKQoreworCXAgPSB4ZHJfZW5jb2RlX2ZoYW5kbGUocCwgYXJncy0+ZnJvbWZoKTsKKwlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPnRvZmgpOworCXAgPSB4ZHJfZW5jb2RlX2FycmF5KHAsIGFyZ3MtPnRvbmFtZSwgYXJncy0+dG9sZW4pOworCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEVuY29kZSBhcmd1bWVudHMgdG8gcmVhZGRpciBjYWxsCisgKi8KK3N0YXRpYyBpbnQKK25mczNfeGRyX3JlYWRkaXJhcmdzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnMzX3JlYWRkaXJhcmdzICphcmdzKQoreworCXN0cnVjdCBycGNfYXV0aAkqYXV0aCA9IHJlcS0+cnFfdGFzay0+dGtfYXV0aDsKKwl1bnNpZ25lZCBpbnQgcmVwbGVuOworCXUzMiBjb3VudCA9IGFyZ3MtPmNvdW50OworCisJcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5maCk7CisJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgYXJncy0+Y29va2llKTsKKwkqcCsrID0gYXJncy0+dmVyZlswXTsKKwkqcCsrID0gYXJncy0+dmVyZlsxXTsKKwlpZiAoYXJncy0+cGx1cykgeworCQkvKiByZWFkZGlycGx1czogbmVlZCBkaXJjb3VudCArIGJ1ZmZlciBzaXplLgorCQkgKiBXZSBqdXN0IG1ha2Ugc3VyZSB3ZSBtYWtlIGRpcmNvdW50IGJpZyBlbm91Z2ggKi8KKwkJKnArKyA9IGh0b25sKGNvdW50ID4+IDMpOworCX0KKwkqcCsrID0gaHRvbmwoY291bnQpOworCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKKworCS8qIElubGluZSB0aGUgcGFnZSBhcnJheSAqLworCXJlcGxlbiA9IChSUENfUkVQSERSU0laRSArIGF1dGgtPmF1X3JzbGFjayArIE5GUzNfcmVhZGRpcnJlc19zeikgPDwgMjsKKwl4ZHJfaW5saW5lX3BhZ2VzKCZyZXEtPnJxX3Jjdl9idWYsIHJlcGxlbiwgYXJncy0+cGFnZXMsIDAsIGNvdW50KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERlY29kZSB0aGUgcmVzdWx0IG9mIGEgcmVhZGRpciBjYWxsLgorICogV2UganVzdCBjaGVjayBmb3Igc3ludGFjdGljYWwgY29ycmVjdG5lc3MuCisgKi8KK3N0YXRpYyBpbnQKK25mczNfeGRyX3JlYWRkaXJyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mczNfcmVhZGRpcnJlcyAqcmVzKQoreworCXN0cnVjdCB4ZHJfYnVmICpyY3ZidWYgPSAmcmVxLT5ycV9yY3ZfYnVmOworCXN0cnVjdCBrdmVjICppb3YgPSByY3ZidWYtPmhlYWQ7CisJc3RydWN0IHBhZ2UgKipwYWdlOworCWludCBoZHJsZW4sIHJlY3ZkOworCWludCBzdGF0dXMsIG5yOworCXVuc2lnbmVkIGludCBsZW4sIHBnbGVuOworCXUzMiAqZW50cnksICplbmQsICprYWRkcjsKKworCXN0YXR1cyA9IG50b2hsKCpwKyspOworCS8qIERlY29kZSBwb3N0X29wX2F0dHJzICovCisJcCA9IHhkcl9kZWNvZGVfcG9zdF9vcF9hdHRyKHAsIHJlcy0+ZGlyX2F0dHIpOworCWlmIChzdGF0dXMpCisJCXJldHVybiAtbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKKwkvKiBEZWNvZGUgdmVyaWZpZXIgY29va2llICovCisJaWYgKHJlcy0+dmVyZikgeworCQlyZXMtPnZlcmZbMF0gPSAqcCsrOworCQlyZXMtPnZlcmZbMV0gPSAqcCsrOworCX0gZWxzZSB7CisJCXAgKz0gMjsKKwl9CisKKwloZHJsZW4gPSAodTggKikgcCAtICh1OCAqKSBpb3YtPmlvdl9iYXNlOworCWlmIChpb3YtPmlvdl9sZW4gPCBoZHJsZW4pIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTkZTOiBSRUFERElSIHJlcGx5IGhlYWRlciBvdmVyZmxvd2VkOiIKKwkJCQkibGVuZ3RoICVkID4gJVp1XG4iLCBoZHJsZW4sIGlvdi0+aW92X2xlbik7CisJCXJldHVybiAtZXJybm9fTkZTRVJSX0lPOworCX0gZWxzZSBpZiAoaW92LT5pb3ZfbGVuICE9IGhkcmxlbikgeworCQlkcHJpbnRrKCJORlM6IFJFQURESVIgaGVhZGVyIGlzIHNob3J0LiBpb3ZlYyB3aWxsIGJlIHNoaWZ0ZWQuXG4iKTsKKwkJeGRyX3NoaWZ0X2J1ZihyY3ZidWYsIGlvdi0+aW92X2xlbiAtIGhkcmxlbik7CisJfQorCisJcGdsZW4gPSByY3ZidWYtPnBhZ2VfbGVuOworCXJlY3ZkID0gcmN2YnVmLT5sZW4gLSBoZHJsZW47CisJaWYgKHBnbGVuID4gcmVjdmQpCisJCXBnbGVuID0gcmVjdmQ7CisJcGFnZSA9IHJjdmJ1Zi0+cGFnZXM7CisJa2FkZHIgPSBwID0gKHUzMiAqKWttYXBfYXRvbWljKCpwYWdlLCBLTV9VU0VSMCk7CisJZW5kID0gKHUzMiAqKSgoY2hhciAqKXAgKyBwZ2xlbik7CisJZW50cnkgPSBwOworCWZvciAobnIgPSAwOyAqcCsrOyBucisrKSB7CisJCWlmIChwICsgMyA+IGVuZCkKKwkJCWdvdG8gc2hvcnRfcGt0OworCQlwICs9IDI7CQkJCS8qIGlub2RlICMgKi8KKwkJbGVuID0gbnRvaGwoKnArKyk7CQkvKiBzdHJpbmcgbGVuZ3RoICovCisJCXAgKz0gWERSX1FVQURMRU4obGVuKSArIDI7CS8qIG5hbWUgKyBjb29raWUgKi8KKwkJaWYgKGxlbiA+IE5GUzNfTUFYTkFNTEVOKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJORlM6IGdpYW50IGZpbGVuYW1lIGluIHJlYWRkaXIgKGxlbiAleCkhXG4iLAorCQkJCQkJbGVuKTsKKwkJCWdvdG8gZXJyX3VubWFwOworCQl9CisKKwkJaWYgKHJlcy0+cGx1cykgeworCQkJLyogcG9zdF9vcF9hdHRyICovCisJCQlpZiAocCArIDIgPiBlbmQpCisJCQkJZ290byBzaG9ydF9wa3Q7CisJCQlpZiAoKnArKykgeworCQkJCXAgKz0gMjE7CisJCQkJaWYgKHAgKyAxID4gZW5kKQorCQkJCQlnb3RvIHNob3J0X3BrdDsKKwkJCX0KKwkJCS8qIHBvc3Rfb3BfZmgzICovCisJCQlpZiAoKnArKykgeworCQkJCWlmIChwICsgMSA+IGVuZCkKKwkJCQkJZ290byBzaG9ydF9wa3Q7CisJCQkJbGVuID0gbnRvaGwoKnArKyk7CisJCQkJaWYgKGxlbiA+IE5GUzNfRkhTSVpFKSB7CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5GUzogZ2lhbnQgZmlsZWhhbmRsZSBpbiAiCisJCQkJCQkicmVhZGRpciAobGVuICV4KSFcbiIsIGxlbik7CisJCQkJCWdvdG8gZXJyX3VubWFwOworCQkJCX0KKwkJCQlwICs9IFhEUl9RVUFETEVOKGxlbik7CisJCQl9CisJCX0KKworCQlpZiAocCArIDIgPiBlbmQpCisJCQlnb3RvIHNob3J0X3BrdDsKKwkJZW50cnkgPSBwOworCX0KKwlpZiAoIW5yICYmIChlbnRyeVswXSAhPSAwIHx8IGVudHJ5WzFdID09IDApKQorCQlnb3RvIHNob3J0X3BrdDsKKyBvdXQ6CisJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCXJldHVybiBucjsKKyBzaG9ydF9wa3Q6CisJZW50cnlbMF0gPSBlbnRyeVsxXSA9IDA7CisJLyogdHJ1bmNhdGUgbGlzdGluZyA/ICovCisJaWYgKCFucikgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIk5GUzogcmVhZGRpciByZXBseSB0cnVuY2F0ZWQhXG4iKTsKKwkJZW50cnlbMV0gPSAxOworCX0KKwlnb3RvIG91dDsKK2Vycl91bm1hcDoKKwluciA9IC1lcnJub19ORlNFUlJfSU87CisJZ290byBvdXQ7Cit9CisKK3UzMiAqCituZnMzX2RlY29kZV9kaXJlbnQodTMyICpwLCBzdHJ1Y3QgbmZzX2VudHJ5ICplbnRyeSwgaW50IHBsdXMpCit7CisJc3RydWN0IG5mc19lbnRyeSBvbGQgPSAqZW50cnk7CisKKwlpZiAoISpwKyspIHsKKwkJaWYgKCEqcCkKKwkJCXJldHVybiBFUlJfUFRSKC1FQUdBSU4pOworCQllbnRyeS0+ZW9mID0gMTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVCQURDT09LSUUpOworCX0KKworCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZlbnRyeS0+aW5vKTsKKwllbnRyeS0+bGVuICA9IG50b2hsKCpwKyspOworCWVudHJ5LT5uYW1lID0gKGNvbnN0IGNoYXIgKikgcDsKKwlwICs9IFhEUl9RVUFETEVOKGVudHJ5LT5sZW4pOworCWVudHJ5LT5wcmV2X2Nvb2tpZSA9IGVudHJ5LT5jb29raWU7CisJcCA9IHhkcl9kZWNvZGVfaHlwZXIocCwgJmVudHJ5LT5jb29raWUpOworCisJaWYgKHBsdXMpIHsKKwkJZW50cnktPmZhdHRyLT52YWxpZCA9IDA7CisJCXAgPSB4ZHJfZGVjb2RlX3Bvc3Rfb3BfYXR0cihwLCBlbnRyeS0+ZmF0dHIpOworCQkvKiBJbiBmYWN0LCBhIHBvc3Rfb3BfZmgzOiAqLworCQlpZiAoKnArKykgeworCQkJcCA9IHhkcl9kZWNvZGVfZmhhbmRsZShwLCBlbnRyeS0+ZmgpOworCQkJLyogVWdoIC0tIHNlcnZlciByZXBseSB3YXMgdHJ1bmNhdGVkICovCisJCQlpZiAocCA9PSBOVUxMKSB7CisJCQkJZHByaW50aygiTkZTOiBGSCB0cnVuY2F0ZWRcbiIpOworCQkJCSplbnRyeSA9IG9sZDsKKwkJCQlyZXR1cm4gRVJSX1BUUigtRUFHQUlOKTsKKwkJCX0KKwkJfSBlbHNlCisJCQltZW1zZXQoKHU4KikoZW50cnktPmZoKSwgMCwgc2l6ZW9mKCplbnRyeS0+ZmgpKTsKKwl9CisKKwllbnRyeS0+ZW9mID0gIXBbMF0gJiYgcFsxXTsKKwlyZXR1cm4gcDsKK30KKworLyoKKyAqIEVuY29kZSBDT01NSVQgYXJndW1lbnRzCisgKi8KK3N0YXRpYyBpbnQKK25mczNfeGRyX2NvbW1pdGFyZ3Moc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc193cml0ZWFyZ3MgKmFyZ3MpCit7CisJcCA9IHhkcl9lbmNvZGVfZmhhbmRsZShwLCBhcmdzLT5maCk7CisJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgYXJncy0+b2Zmc2V0KTsKKwkqcCsrID0gaHRvbmwoYXJncy0+Y291bnQpOworCXJlcS0+cnFfc2xlbiA9IHhkcl9hZGp1c3RfaW92ZWMocmVxLT5ycV9zdmVjLCBwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE5GUyBYRFIgZGVjb2RlIGZ1bmN0aW9ucworICovCisKKy8qCisgKiBEZWNvZGUgYXR0cnN0YXQgcmVwbHkuCisgKi8KK3N0YXRpYyBpbnQKK25mczNfeGRyX2F0dHJzdGF0KHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQoreworCWludAlzdGF0dXM7CisKKwlpZiAoKHN0YXR1cyA9IG50b2hsKCpwKyspKSkKKwkJcmV0dXJuIC1uZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOworCXhkcl9kZWNvZGVfZmF0dHIocCwgZmF0dHIpOworCXJldHVybiAwOworfQorCisvKgorICogRGVjb2RlIHN0YXR1cyt3Y2NfZGF0YSByZXBseQorICogU0FUVFIsIFJFTU9WRSwgUk1ESVIKKyAqLworc3RhdGljIGludAorbmZzM194ZHJfd2Njc3RhdChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK3sKKwlpbnQJc3RhdHVzOworCisJaWYgKChzdGF0dXMgPSBudG9obCgqcCsrKSkpCisJCXN0YXR1cyA9IC1uZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOworCXhkcl9kZWNvZGVfd2NjX2RhdGEocCwgZmF0dHIpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBEZWNvZGUgTE9PS1VQIHJlcGx5CisgKi8KK3N0YXRpYyBpbnQKK25mczNfeGRyX2xvb2t1cHJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzM19kaXJvcHJlcyAqcmVzKQoreworCWludAlzdGF0dXM7CisKKwlpZiAoKHN0YXR1cyA9IG50b2hsKCpwKyspKSkgeworCQlzdGF0dXMgPSAtbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKKwl9IGVsc2UgeworCQlpZiAoIShwID0geGRyX2RlY29kZV9maGFuZGxlKHAsIHJlcy0+ZmgpKSkKKwkJCXJldHVybiAtZXJybm9fTkZTRVJSX0lPOworCQlwID0geGRyX2RlY29kZV9wb3N0X29wX2F0dHIocCwgcmVzLT5mYXR0cik7CisJfQorCXhkcl9kZWNvZGVfcG9zdF9vcF9hdHRyKHAsIHJlcy0+ZGlyX2F0dHIpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBEZWNvZGUgQUNDRVNTIHJlcGx5CisgKi8KK3N0YXRpYyBpbnQKK25mczNfeGRyX2FjY2Vzc3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzM19hY2Nlc3NyZXMgKnJlcykKK3sKKwlpbnQJc3RhdHVzID0gbnRvaGwoKnArKyk7CisKKwlwID0geGRyX2RlY29kZV9wb3N0X29wX2F0dHIocCwgcmVzLT5mYXR0cik7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIC1uZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOworCXJlcy0+YWNjZXNzID0gbnRvaGwoKnArKyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25mczNfeGRyX3JlYWRsaW5rYXJncyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzM19yZWFkbGlua2FyZ3MgKmFyZ3MpCit7CisJc3RydWN0IHJwY19hdXRoICphdXRoID0gcmVxLT5ycV90YXNrLT50a19hdXRoOworCXVuc2lnbmVkIGludCByZXBsZW47CisKKwlwID0geGRyX2VuY29kZV9maGFuZGxlKHAsIGFyZ3MtPmZoKTsKKwlyZXEtPnJxX3NsZW4gPSB4ZHJfYWRqdXN0X2lvdmVjKHJlcS0+cnFfc3ZlYywgcCk7CisKKwkvKiBJbmxpbmUgdGhlIHBhZ2UgYXJyYXkgKi8KKwlyZXBsZW4gPSAoUlBDX1JFUEhEUlNJWkUgKyBhdXRoLT5hdV9yc2xhY2sgKyBORlMzX3JlYWRsaW5rcmVzX3N6KSA8PCAyOworCXhkcl9pbmxpbmVfcGFnZXMoJnJlcS0+cnFfcmN2X2J1ZiwgcmVwbGVuLCBhcmdzLT5wYWdlcywgYXJncy0+cGdiYXNlLCBhcmdzLT5wZ2xlbik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEZWNvZGUgUkVBRExJTksgcmVwbHkKKyAqLworc3RhdGljIGludAorbmZzM194ZHJfcmVhZGxpbmtyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCit7CisJc3RydWN0IHhkcl9idWYgKnJjdmJ1ZiA9ICZyZXEtPnJxX3Jjdl9idWY7CisJc3RydWN0IGt2ZWMgKmlvdiA9IHJjdmJ1Zi0+aGVhZDsKKwlpbnQgaGRybGVuLCBsZW4sIHJlY3ZkOworCWNoYXIJKmthZGRyOworCWludAlzdGF0dXM7CisKKwlzdGF0dXMgPSBudG9obCgqcCsrKTsKKwlwID0geGRyX2RlY29kZV9wb3N0X29wX2F0dHIocCwgZmF0dHIpOworCisJaWYgKHN0YXR1cyAhPSAwKQorCQlyZXR1cm4gLW5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7CisKKwkvKiBDb252ZXJ0IGxlbmd0aCBvZiBzeW1saW5rICovCisJbGVuID0gbnRvaGwoKnArKyk7CisJaWYgKGxlbiA+PSByY3ZidWYtPnBhZ2VfbGVuIHx8IGxlbiA8PSAwKSB7CisJCWRwcmludGsoS0VSTl9XQVJOSU5HICJuZnM6IHNlcnZlciByZXR1cm5lZCBnaWFudCBzeW1saW5rIVxuIik7CisJCXJldHVybiAtRU5BTUVUT09MT05HOworCX0KKworCWhkcmxlbiA9ICh1OCAqKSBwIC0gKHU4ICopIGlvdi0+aW92X2Jhc2U7CisJaWYgKGlvdi0+aW92X2xlbiA8IGhkcmxlbikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJORlM6IFJFQURMSU5LIHJlcGx5IGhlYWRlciBvdmVyZmxvd2VkOiIKKwkJCQkibGVuZ3RoICVkID4gJVp1XG4iLCBoZHJsZW4sIGlvdi0+aW92X2xlbik7CisJCXJldHVybiAtZXJybm9fTkZTRVJSX0lPOworCX0gZWxzZSBpZiAoaW92LT5pb3ZfbGVuICE9IGhkcmxlbikgeworCQlkcHJpbnRrKCJORlM6IFJFQURMSU5LIGhlYWRlciBpcyBzaG9ydC4gaW92ZWMgd2lsbCBiZSBzaGlmdGVkLlxuIik7CisJCXhkcl9zaGlmdF9idWYocmN2YnVmLCBpb3YtPmlvdl9sZW4gLSBoZHJsZW4pOworCX0KKwlyZWN2ZCA9IHJlcS0+cnFfcmN2X2J1Zi5sZW4gLSBoZHJsZW47CisJaWYgKHJlY3ZkIDwgbGVuKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5GUzogc2VydmVyIGNoZWF0aW5nIGluIHJlYWRsaW5rIHJlcGx5OiAiCisJCQkJImNvdW50ICV1ID4gcmVjdmQgJXVcbiIsIGxlbiwgcmVjdmQpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBOVUxMIHRlcm1pbmF0ZSB0aGUgc3RyaW5nIHdlIGdvdCAqLworCWthZGRyID0gKGNoYXIqKWttYXBfYXRvbWljKHJjdmJ1Zi0+cGFnZXNbMF0sIEtNX1VTRVIwKTsKKwlrYWRkcltsZW4rcmN2YnVmLT5wYWdlX2Jhc2VdID0gJ1wwJzsKKwlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEZWNvZGUgUkVBRCByZXBseQorICovCitzdGF0aWMgaW50CituZnMzX3hkcl9yZWFkcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfcmVhZHJlcyAqcmVzKQoreworCXN0cnVjdCBrdmVjICppb3YgPSByZXEtPnJxX3Jjdl9idWYuaGVhZDsKKwlpbnQJc3RhdHVzLCBjb3VudCwgb2NvdW50LCByZWN2ZCwgaGRybGVuOworCisJc3RhdHVzID0gbnRvaGwoKnArKyk7CisJcCA9IHhkcl9kZWNvZGVfcG9zdF9vcF9hdHRyKHAsIHJlcy0+ZmF0dHIpOworCisJaWYgKHN0YXR1cyAhPSAwKQorCQlyZXR1cm4gLW5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7CisKKwkvKiBEZWNvZGUgcmVwbHkgY291bGQgYW5kIEVPRiBmbGFnLiBORlN2MyBpcyBzb21ld2hhdCByZWR1bmRhbnQKKwkgKiBpbiB0aGF0IGl0IHB1dHMgdGhlIGNvdW50IGJvdGggaW4gdGhlIHJlcyBzdHJ1Y3QgYW5kIGluIHRoZQorCSAqIG9wYXF1ZSBkYXRhIGNvdW50LiAqLworCWNvdW50ICAgID0gbnRvaGwoKnArKyk7CisJcmVzLT5lb2YgPSBudG9obCgqcCsrKTsKKwlvY291bnQgICA9IG50b2hsKCpwKyspOworCisJaWYgKG9jb3VudCAhPSBjb3VudCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJORlM6IFJFQUQgY291bnQgZG9lc24ndCBtYXRjaCBSUEMgb3BhcXVlIGNvdW50LlxuIik7CisJCXJldHVybiAtZXJybm9fTkZTRVJSX0lPOworCX0KKworCWhkcmxlbiA9ICh1OCAqKSBwIC0gKHU4ICopIGlvdi0+aW92X2Jhc2U7CisJaWYgKGlvdi0+aW92X2xlbiA8IGhkcmxlbikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJORlM6IFJFQUQgcmVwbHkgaGVhZGVyIG92ZXJmbG93ZWQ6IgorCQkJCSJsZW5ndGggJWQgPiAlWnVcbiIsIGhkcmxlbiwgaW92LT5pb3ZfbGVuKTsKKyAgICAgICAJCXJldHVybiAtZXJybm9fTkZTRVJSX0lPOworCX0gZWxzZSBpZiAoaW92LT5pb3ZfbGVuICE9IGhkcmxlbikgeworCQlkcHJpbnRrKCJORlM6IFJFQUQgaGVhZGVyIGlzIHNob3J0LiBpb3ZlYyB3aWxsIGJlIHNoaWZ0ZWQuXG4iKTsKKwkJeGRyX3NoaWZ0X2J1ZigmcmVxLT5ycV9yY3ZfYnVmLCBpb3YtPmlvdl9sZW4gLSBoZHJsZW4pOworCX0KKworCXJlY3ZkID0gcmVxLT5ycV9yY3ZfYnVmLmxlbiAtIGhkcmxlbjsKKwlpZiAoY291bnQgPiByZWN2ZCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJORlM6IHNlcnZlciBjaGVhdGluZyBpbiByZWFkIHJlcGx5OiAiCisJCQkiY291bnQgJWQgPiByZWN2ZCAlZFxuIiwgY291bnQsIHJlY3ZkKTsKKwkJY291bnQgPSByZWN2ZDsKKwkJcmVzLT5lb2YgPSAwOworCX0KKworCWlmIChjb3VudCA8IHJlcy0+Y291bnQpCisJCXJlcy0+Y291bnQgPSBjb3VudDsKKworCXJldHVybiBjb3VudDsKK30KKworLyoKKyAqIERlY29kZSBXUklURSByZXNwb25zZQorICovCitzdGF0aWMgaW50CituZnMzX3hkcl93cml0ZXJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX3dyaXRlcmVzICpyZXMpCit7CisJaW50CXN0YXR1czsKKworCXN0YXR1cyA9IG50b2hsKCpwKyspOworCXAgPSB4ZHJfZGVjb2RlX3djY19kYXRhKHAsIHJlcy0+ZmF0dHIpOworCisJaWYgKHN0YXR1cyAhPSAwKQorCQlyZXR1cm4gLW5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7CisKKwlyZXMtPmNvdW50ID0gbnRvaGwoKnArKyk7CisJcmVzLT52ZXJmLT5jb21taXR0ZWQgPSAoZW51bSBuZnMzX3N0YWJsZV9ob3cpbnRvaGwoKnArKyk7CisJcmVzLT52ZXJmLT52ZXJpZmllclswXSA9ICpwKys7CisJcmVzLT52ZXJmLT52ZXJpZmllclsxXSA9ICpwKys7CisKKwlyZXR1cm4gcmVzLT5jb3VudDsKK30KKworLyoKKyAqIERlY29kZSBhIENSRUFURSByZXNwb25zZQorICovCitzdGF0aWMgaW50CituZnMzX3hkcl9jcmVhdGVyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mczNfZGlyb3ByZXMgKnJlcykKK3sKKwlpbnQJc3RhdHVzOworCisJc3RhdHVzID0gbnRvaGwoKnArKyk7CisJaWYgKHN0YXR1cyA9PSAwKSB7CisJCWlmICgqcCsrKSB7CisJCQlpZiAoIShwID0geGRyX2RlY29kZV9maGFuZGxlKHAsIHJlcy0+ZmgpKSkKKwkJCQlyZXR1cm4gLWVycm5vX05GU0VSUl9JTzsKKwkJCXAgPSB4ZHJfZGVjb2RlX3Bvc3Rfb3BfYXR0cihwLCByZXMtPmZhdHRyKTsKKwkJfSBlbHNlIHsKKwkJCW1lbXNldChyZXMtPmZoLCAwLCBzaXplb2YoKnJlcy0+ZmgpKTsKKwkJCS8qIERvIGRlY29kZSBwb3N0X29wX2F0dHIgYnV0IHNldCBpdCB0byBOVUxMICovCisJCQlwID0geGRyX2RlY29kZV9wb3N0X29wX2F0dHIocCwgcmVzLT5mYXR0cik7CisJCQlyZXMtPmZhdHRyLT52YWxpZCA9IDA7CisJCX0KKwl9IGVsc2UgeworCQlzdGF0dXMgPSAtbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKKwl9CisJcCA9IHhkcl9kZWNvZGVfd2NjX2RhdGEocCwgcmVzLT5kaXJfYXR0cik7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIERlY29kZSBSRU5BTUUgcmVwbHkKKyAqLworc3RhdGljIGludAorbmZzM194ZHJfcmVuYW1lcmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnMzX3JlbmFtZXJlcyAqcmVzKQoreworCWludAlzdGF0dXM7CisKKwlpZiAoKHN0YXR1cyA9IG50b2hsKCpwKyspKSAhPSAwKQorCQlzdGF0dXMgPSAtbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKKwlwID0geGRyX2RlY29kZV93Y2NfZGF0YShwLCByZXMtPmZyb21hdHRyKTsKKwlwID0geGRyX2RlY29kZV93Y2NfZGF0YShwLCByZXMtPnRvYXR0cik7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIERlY29kZSBMSU5LIHJlcGx5CisgKi8KK3N0YXRpYyBpbnQKK25mczNfeGRyX2xpbmtyZXMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHUzMiAqcCwgc3RydWN0IG5mczNfbGlua3JlcyAqcmVzKQoreworCWludAlzdGF0dXM7CisKKwlpZiAoKHN0YXR1cyA9IG50b2hsKCpwKyspKSAhPSAwKQorCQlzdGF0dXMgPSAtbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKKwlwID0geGRyX2RlY29kZV9wb3N0X29wX2F0dHIocCwgcmVzLT5mYXR0cik7CisJcCA9IHhkcl9kZWNvZGVfd2NjX2RhdGEocCwgcmVzLT5kaXJfYXR0cik7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIERlY29kZSBGU1NUQVQgcmVwbHkKKyAqLworc3RhdGljIGludAorbmZzM194ZHJfZnNzdGF0cmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfZnNzdGF0ICpyZXMpCit7CisJaW50CQlzdGF0dXM7CisKKwlzdGF0dXMgPSBudG9obCgqcCsrKTsKKworCXAgPSB4ZHJfZGVjb2RlX3Bvc3Rfb3BfYXR0cihwLCByZXMtPmZhdHRyKTsKKwlpZiAoc3RhdHVzICE9IDApCisJCXJldHVybiAtbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKKworCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZyZXMtPnRieXRlcyk7CisJcCA9IHhkcl9kZWNvZGVfaHlwZXIocCwgJnJlcy0+ZmJ5dGVzKTsKKwlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmcmVzLT5hYnl0ZXMpOworCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZyZXMtPnRmaWxlcyk7CisJcCA9IHhkcl9kZWNvZGVfaHlwZXIocCwgJnJlcy0+ZmZpbGVzKTsKKwlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmcmVzLT5hZmlsZXMpOworCisJLyogaWdub3JlIGludmFyc2VjICovCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEZWNvZGUgRlNJTkZPIHJlcGx5CisgKi8KK3N0YXRpYyBpbnQKK25mczNfeGRyX2ZzaW5mb3JlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX2ZzaW5mbyAqcmVzKQoreworCWludAkJc3RhdHVzOworCisJc3RhdHVzID0gbnRvaGwoKnArKyk7CisKKwlwID0geGRyX2RlY29kZV9wb3N0X29wX2F0dHIocCwgcmVzLT5mYXR0cik7CisJaWYgKHN0YXR1cyAhPSAwKQorCQlyZXR1cm4gLW5mc19zdGF0X3RvX2Vycm5vKHN0YXR1cyk7CisKKwlyZXMtPnJ0bWF4ICA9IG50b2hsKCpwKyspOworCXJlcy0+cnRwcmVmID0gbnRvaGwoKnArKyk7CisJcmVzLT5ydG11bHQgPSBudG9obCgqcCsrKTsKKwlyZXMtPnd0bWF4ICA9IG50b2hsKCpwKyspOworCXJlcy0+d3RwcmVmID0gbnRvaGwoKnArKyk7CisJcmVzLT53dG11bHQgPSBudG9obCgqcCsrKTsKKwlyZXMtPmR0cHJlZiA9IG50b2hsKCpwKyspOworCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZyZXMtPm1heGZpbGVzaXplKTsKKworCS8qIGlnbm9yZSB0aW1lX2RlbHRhIGFuZCBwcm9wZXJ0aWVzICovCisJcmVzLT5sZWFzZV90aW1lID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERlY29kZSBQQVRIQ09ORiByZXBseQorICovCitzdGF0aWMgaW50CituZnMzX3hkcl9wYXRoY29uZnJlcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzX3BhdGhjb25mICpyZXMpCit7CisJaW50CQlzdGF0dXM7CisKKwlzdGF0dXMgPSBudG9obCgqcCsrKTsKKworCXAgPSB4ZHJfZGVjb2RlX3Bvc3Rfb3BfYXR0cihwLCByZXMtPmZhdHRyKTsKKwlpZiAoc3RhdHVzICE9IDApCisJCXJldHVybiAtbmZzX3N0YXRfdG9fZXJybm8oc3RhdHVzKTsKKwlyZXMtPm1heF9saW5rID0gbnRvaGwoKnArKyk7CisJcmVzLT5tYXhfbmFtZWxlbiA9IG50b2hsKCpwKyspOworCisJLyogaWdub3JlIHJlbWFpbmluZyBmaWVsZHMgKi8KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERlY29kZSBDT01NSVQgcmVwbHkKKyAqLworc3RhdGljIGludAorbmZzM194ZHJfY29tbWl0cmVzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnAsIHN0cnVjdCBuZnNfd3JpdGVyZXMgKnJlcykKK3sKKwlpbnQJCXN0YXR1czsKKworCXN0YXR1cyA9IG50b2hsKCpwKyspOworCXAgPSB4ZHJfZGVjb2RlX3djY19kYXRhKHAsIHJlcy0+ZmF0dHIpOworCWlmIChzdGF0dXMgIT0gMCkKKwkJcmV0dXJuIC1uZnNfc3RhdF90b19lcnJubyhzdGF0dXMpOworCisJcmVzLT52ZXJmLT52ZXJpZmllclswXSA9ICpwKys7CisJcmVzLT52ZXJmLT52ZXJpZmllclsxXSA9ICpwKys7CisJcmV0dXJuIDA7Cit9CisKKyNpZm5kZWYgTUFYCisjIGRlZmluZSBNQVgoYSwgYikJKCgoYSkgPiAoYikpPyAoYSkgOiAoYikpCisjZW5kaWYKKworI2RlZmluZSBQUk9DKHByb2MsIGFyZ3R5cGUsIHJlc3R5cGUsIHRpbWVyKQkJCQlcCitbTkZTM1BST0NfIyNwcm9jXSA9IHsJCQkJCQkJXAorCS5wX3Byb2MgICAgICA9IE5GUzNQUk9DXyMjcHJvYywJCQkJCVwKKwkucF9lbmNvZGUgICAgPSAoa3hkcnByb2NfdCkgbmZzM194ZHJfIyNhcmd0eXBlLAkJCVwKKwkucF9kZWNvZGUgICAgPSAoa3hkcnByb2NfdCkgbmZzM194ZHJfIyNyZXN0eXBlLAkJCVwKKwkucF9idWZzaXogICAgPSBNQVgoTkZTM18jI2FyZ3R5cGUjI19zeixORlMzXyMjcmVzdHlwZSMjX3N6KSA8PCAyLAlcCisJLnBfdGltZXIgICAgID0gdGltZXIJCQkJCQlcCisJfQorCitzdHJ1Y3QgcnBjX3Byb2NpbmZvCW5mczNfcHJvY2VkdXJlc1tdID0geworICBQUk9DKEdFVEFUVFIsCQlmaGFuZGxlLAlhdHRyc3RhdCwgMSksCisgIFBST0MoU0VUQVRUUiwgCXNhdHRyYXJncywJd2Njc3RhdCwgMCksCisgIFBST0MoTE9PS1VQLAkJZGlyb3BhcmdzLAlsb29rdXByZXMsIDIpLAorICBQUk9DKEFDQ0VTUywJCWFjY2Vzc2FyZ3MsCWFjY2Vzc3JlcywgMSksCisgIFBST0MoUkVBRExJTkssCXJlYWRsaW5rYXJncywJcmVhZGxpbmtyZXMsIDMpLAorICBQUk9DKFJFQUQsCQlyZWFkYXJncywJcmVhZHJlcywgMyksCisgIFBST0MoV1JJVEUsCQl3cml0ZWFyZ3MsCXdyaXRlcmVzLCA0KSwKKyAgUFJPQyhDUkVBVEUsCQljcmVhdGVhcmdzLAljcmVhdGVyZXMsIDApLAorICBQUk9DKE1LRElSLAkJbWtkaXJhcmdzLAljcmVhdGVyZXMsIDApLAorICBQUk9DKFNZTUxJTkssCQlzeW1saW5rYXJncywJY3JlYXRlcmVzLCAwKSwKKyAgUFJPQyhNS05PRCwJCW1rbm9kYXJncywJY3JlYXRlcmVzLCAwKSwKKyAgUFJPQyhSRU1PVkUsCQlkaXJvcGFyZ3MsCXdjY3N0YXQsIDApLAorICBQUk9DKFJNRElSLAkJZGlyb3BhcmdzLAl3Y2NzdGF0LCAwKSwKKyAgUFJPQyhSRU5BTUUsCQlyZW5hbWVhcmdzLAlyZW5hbWVyZXMsIDApLAorICBQUk9DKExJTkssCQlsaW5rYXJncywJbGlua3JlcywgMCksCisgIFBST0MoUkVBRERJUiwJCXJlYWRkaXJhcmdzLAlyZWFkZGlycmVzLCAzKSwKKyAgUFJPQyhSRUFERElSUExVUywJcmVhZGRpcmFyZ3MsCXJlYWRkaXJyZXMsIDMpLAorICBQUk9DKEZTU1RBVCwJCWZoYW5kbGUsCWZzc3RhdHJlcywgMCksCisgIFBST0MoRlNJTkZPLCAgCWZoYW5kbGUsCWZzaW5mb3JlcywgMCksCisgIFBST0MoUEFUSENPTkYsCWZoYW5kbGUsCXBhdGhjb25mcmVzLCAwKSwKKyAgUFJPQyhDT01NSVQsCQljb21taXRhcmdzLAljb21taXRyZXMsIDUpLAorfTsKKworc3RydWN0IHJwY192ZXJzaW9uCQluZnNfdmVyc2lvbjMgPSB7CisJLm51bWJlcgkJCT0gMywKKwkubnJwcm9jcwkJPSBzaXplb2YobmZzM19wcm9jZWR1cmVzKS9zaXplb2YobmZzM19wcm9jZWR1cmVzWzBdKSwKKwkucHJvY3MJCQk9IG5mczNfcHJvY2VkdXJlcworfTsKKwpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczRwcm9jLmMgYi9mcy9uZnMvbmZzNHByb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDVjYjNlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzL25mczRwcm9jLmMKQEAgLTAsMCArMSwyNzg2IEBACisvKgorICogIGZzL25mcy9uZnM0cHJvYy5jCisgKgorICogIENsaWVudC1zaWRlIHByb2NlZHVyZSBkZWNsYXJhdGlvbnMgZm9yIE5GU3Y0LgorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4uCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgS2VuZHJpY2sgU21pdGggPGttc21pdGhAdW1pY2guZWR1PgorICogIEFuZHkgQWRhbXNvbiAgIDxhbmRyb3NAdW1pY2guZWR1PgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqICBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqICBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnM0Lmg+CisjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbmZzX3BhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisKKyNpbmNsdWRlICJkZWxlZ2F0aW9uLmgiCisKKyNkZWZpbmUgTkZTREJHX0ZBQ0lMSVRZCQlORlNEQkdfUFJPQworCisjZGVmaW5lIE5GUzRfUE9MTF9SRVRSWV9NSU4JKDEqSFopCisjZGVmaW5lIE5GUzRfUE9MTF9SRVRSWV9NQVgJKDE1KkhaKQorCitzdGF0aWMgaW50IG5mczRfZG9fZnNpbmZvKHN0cnVjdCBuZnNfc2VydmVyICosIHN0cnVjdCBuZnNfZmggKiwgc3RydWN0IG5mc19mc2luZm8gKik7CitzdGF0aWMgaW50IG5mczRfYXN5bmNfaGFuZGxlX2Vycm9yKHN0cnVjdCBycGNfdGFzayAqLCBzdHJ1Y3QgbmZzX3NlcnZlciAqKTsKK3N0YXRpYyBpbnQgX25mczRfcHJvY19hY2Nlc3Moc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG5mc19hY2Nlc3NfZW50cnkgKmVudHJ5KTsKK3N0YXRpYyBpbnQgbmZzNF9oYW5kbGVfZXhjZXB0aW9uKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIGludCBlcnJvcmNvZGUsIHN0cnVjdCBuZnM0X2V4Y2VwdGlvbiAqZXhjZXB0aW9uKTsKK2V4dGVybiB1MzIgKm5mczRfZGVjb2RlX2RpcmVudCh1MzIgKnAsIHN0cnVjdCBuZnNfZW50cnkgKmVudHJ5LCBpbnQgcGx1cyk7CitleHRlcm4gc3RydWN0IHJwY19wcm9jaW5mbyBuZnM0X3Byb2NlZHVyZXNbXTsKKworZXh0ZXJuIG5mczRfc3RhdGVpZCB6ZXJvX3N0YXRlaWQ7CisKKy8qIFByZXZlbnQgbGVha3Mgb2YgTkZTdjQgZXJyb3JzIGludG8gdXNlcmxhbmQgKi8KK2ludCBuZnM0X21hcF9lcnJvcnMoaW50IGVycikKK3sKKwlpZiAoZXJyIDwgLTEwMDApIHsKKwkJZHByaW50aygiJXMgY291bGQgbm90IGhhbmRsZSBORlN2NCBlcnJvciAlZFxuIiwKKwkJCQlfX0ZVTkNUSU9OX18sIC1lcnIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFRoaXMgaXMgb3VyIHN0YW5kYXJkIGJpdG1hcCBmb3IgR0VUQVRUUiByZXF1ZXN0cy4KKyAqLworY29uc3QgdTMyIG5mczRfZmF0dHJfYml0bWFwWzJdID0geworCUZBVFRSNF9XT1JEMF9UWVBFCisJfCBGQVRUUjRfV09SRDBfQ0hBTkdFCisJfCBGQVRUUjRfV09SRDBfU0laRQorCXwgRkFUVFI0X1dPUkQwX0ZTSUQKKwl8IEZBVFRSNF9XT1JEMF9GSUxFSUQsCisJRkFUVFI0X1dPUkQxX01PREUKKwl8IEZBVFRSNF9XT1JEMV9OVU1MSU5LUworCXwgRkFUVFI0X1dPUkQxX09XTkVSCisJfCBGQVRUUjRfV09SRDFfT1dORVJfR1JPVVAKKwl8IEZBVFRSNF9XT1JEMV9SQVdERVYKKwl8IEZBVFRSNF9XT1JEMV9TUEFDRV9VU0VECisJfCBGQVRUUjRfV09SRDFfVElNRV9BQ0NFU1MKKwl8IEZBVFRSNF9XT1JEMV9USU1FX01FVEFEQVRBCisJfCBGQVRUUjRfV09SRDFfVElNRV9NT0RJRlkKK307CisKK2NvbnN0IHUzMiBuZnM0X3N0YXRmc19iaXRtYXBbMl0gPSB7CisJRkFUVFI0X1dPUkQwX0ZJTEVTX0FWQUlMCisJfCBGQVRUUjRfV09SRDBfRklMRVNfRlJFRQorCXwgRkFUVFI0X1dPUkQwX0ZJTEVTX1RPVEFMLAorCUZBVFRSNF9XT1JEMV9TUEFDRV9BVkFJTAorCXwgRkFUVFI0X1dPUkQxX1NQQUNFX0ZSRUUKKwl8IEZBVFRSNF9XT1JEMV9TUEFDRV9UT1RBTAorfTsKKwordTMyIG5mczRfcGF0aGNvbmZfYml0bWFwWzJdID0geworCUZBVFRSNF9XT1JEMF9NQVhMSU5LCisJfCBGQVRUUjRfV09SRDBfTUFYTkFNRSwKKwkwCit9OworCitjb25zdCB1MzIgbmZzNF9mc2luZm9fYml0bWFwWzJdID0geyBGQVRUUjRfV09SRDBfTUFYRklMRVNJWkUKKwkJCXwgRkFUVFI0X1dPUkQwX01BWFJFQUQKKwkJCXwgRkFUVFI0X1dPUkQwX01BWFdSSVRFCisJCQl8IEZBVFRSNF9XT1JEMF9MRUFTRV9USU1FLAorCQkJMAorfTsKKworc3RhdGljIHZvaWQgbmZzNF9zZXR1cF9yZWFkZGlyKHU2NCBjb29raWUsIHUzMiAqdmVyaWZpZXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJc3RydWN0IG5mczRfcmVhZGRpcl9hcmcgKnJlYWRkaXIpCit7CisJdTMyICpzdGFydCwgKnA7CisKKwlCVUdfT04ocmVhZGRpci0+Y291bnQgPCA4MCk7CisJaWYgKGNvb2tpZSA+IDIpIHsKKwkJcmVhZGRpci0+Y29va2llID0gKGNvb2tpZSA+IDIpID8gY29va2llIDogMDsKKwkJbWVtY3B5KCZyZWFkZGlyLT52ZXJpZmllciwgdmVyaWZpZXIsIHNpemVvZihyZWFkZGlyLT52ZXJpZmllcikpOworCQlyZXR1cm47CisJfQorCisJcmVhZGRpci0+Y29va2llID0gMDsKKwltZW1zZXQoJnJlYWRkaXItPnZlcmlmaWVyLCAwLCBzaXplb2YocmVhZGRpci0+dmVyaWZpZXIpKTsKKwlpZiAoY29va2llID09IDIpCisJCXJldHVybjsKKwkKKwkvKgorCSAqIE5GU3Y0IHNlcnZlcnMgZG8gbm90IHJldHVybiBlbnRyaWVzIGZvciAnLicgYW5kICcuLicKKwkgKiBUaGVyZWZvcmUsIHdlIGZha2UgdGhlc2UgZW50cmllcyBoZXJlLiAgV2UgbGV0ICcuJworCSAqIGhhdmUgY29va2llIDAgYW5kICcuLicgaGF2ZSBjb29raWUgMS4gIE5vdGUgdGhhdAorCSAqIHdoZW4gdGFsa2luZyB0byB0aGUgc2VydmVyLCB3ZSBhbHdheXMgc2VuZCBjb29raWUgMAorCSAqIGluc3RlYWQgb2YgMSBvciAyLgorCSAqLworCXN0YXJ0ID0gcCA9ICh1MzIgKilrbWFwX2F0b21pYygqcmVhZGRpci0+cGFnZXMsIEtNX1VTRVIwKTsKKwkKKwlpZiAoY29va2llID09IDApIHsKKwkJKnArKyA9IHhkcl9vbmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgKi8KKwkJKnArKyA9IHhkcl96ZXJvOyAgICAgICAgICAgICAgICAgICAvKiBjb29raWUsIGZpcnN0IHdvcmQgKi8KKwkJKnArKyA9IHhkcl9vbmU7ICAgICAgICAgICAgICAgICAgIC8qIGNvb2tpZSwgc2Vjb25kIHdvcmQgKi8KKwkJKnArKyA9IHhkcl9vbmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbnRyeSBsZW4gKi8KKwkJbWVtY3B5KHAsICIuXDBcMFwwIiwgNCk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZW50cnkgKi8KKwkJcCsrOworCQkqcCsrID0geGRyX29uZTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogYml0bWFwIGxlbmd0aCAqLworCQkqcCsrID0gaHRvbmwoRkFUVFI0X1dPUkQwX0ZJTEVJRCk7ICAgICAgICAgICAgIC8qIGJpdG1hcCAqLworCQkqcCsrID0gaHRvbmwoOCk7ICAgICAgICAgICAgICAvKiBhdHRyaWJ1dGUgYnVmZmVyIGxlbmd0aCAqLworCQlwID0geGRyX2VuY29kZV9oeXBlcihwLCBkZW50cnktPmRfaW5vZGUtPmlfaW5vKTsKKwl9CisJCisJKnArKyA9IHhkcl9vbmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgKi8KKwkqcCsrID0geGRyX3plcm87ICAgICAgICAgICAgICAgICAgIC8qIGNvb2tpZSwgZmlyc3Qgd29yZCAqLworCSpwKysgPSB4ZHJfdHdvOyAgICAgICAgICAgICAgICAgICAvKiBjb29raWUsIHNlY29uZCB3b3JkICovCisJKnArKyA9IHhkcl90d287ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbnRyeSBsZW4gKi8KKwltZW1jcHkocCwgIi4uXDBcMCIsIDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbnRyeSAqLworCXArKzsKKwkqcCsrID0geGRyX29uZTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogYml0bWFwIGxlbmd0aCAqLworCSpwKysgPSBodG9ubChGQVRUUjRfV09SRDBfRklMRUlEKTsgICAgICAgICAgICAgLyogYml0bWFwICovCisJKnArKyA9IGh0b25sKDgpOyAgICAgICAgICAgICAgLyogYXR0cmlidXRlIGJ1ZmZlciBsZW5ndGggKi8KKwlwID0geGRyX2VuY29kZV9oeXBlcihwLCBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlLT5pX2lubyk7CisKKwlyZWFkZGlyLT5wZ2Jhc2UgPSAoY2hhciAqKXAgLSAoY2hhciAqKXN0YXJ0OworCXJlYWRkaXItPmNvdW50IC09IHJlYWRkaXItPnBnYmFzZTsKKwlrdW5tYXBfYXRvbWljKHN0YXJ0LCBLTV9VU0VSMCk7Cit9CisKK3N0YXRpYyB2b2lkCityZW5ld19sZWFzZShzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCB1bnNpZ25lZCBsb25nIHRpbWVzdGFtcCkKK3sKKwlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCA9IHNlcnZlci0+bmZzNF9zdGF0ZTsKKwlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7CisJaWYgKHRpbWVfYmVmb3JlKGNscC0+Y2xfbGFzdF9yZW5ld2FsLHRpbWVzdGFtcCkpCisJCWNscC0+Y2xfbGFzdF9yZW5ld2FsID0gdGltZXN0YW1wOworCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfY2hhbmdlYXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbmZzNF9jaGFuZ2VfaW5mbyAqY2luZm8pCit7CisJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKKworCWlmIChjaW5mby0+YmVmb3JlID09IG5mc2ktPmNoYW5nZV9hdHRyICYmIGNpbmZvLT5hdG9taWMpCisJCW5mc2ktPmNoYW5nZV9hdHRyID0gY2luZm8tPmFmdGVyOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfb3Blbl9zdGF0ZWlkKHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwgbmZzNF9zdGF0ZWlkICpzdGF0ZWlkLCBpbnQgb3Blbl9mbGFncykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gc3RhdGUtPmlub2RlOworCisJb3Blbl9mbGFncyAmPSAoRk1PREVfUkVBRHxGTU9ERV9XUklURSk7CisJLyogUHJvdGVjdCBhZ2FpbnN0IG5mczRfZmluZF9zdGF0ZSgpICovCisJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlzdGF0ZS0+c3RhdGUgfD0gb3Blbl9mbGFnczsKKwkvKiBOQiEgTGlzdCByZW9yZGVyaW5nIC0gc2VlIHRoZSByZWNsYWltIGNvZGUgZm9yIHdoeS4gICovCisJaWYgKChvcGVuX2ZsYWdzICYgRk1PREVfV1JJVEUpICYmIDAgPT0gc3RhdGUtPm53cml0ZXJzKyspCisJCWxpc3RfbW92ZSgmc3RhdGUtPm9wZW5fc3RhdGVzLCAmc3RhdGUtPm93bmVyLT5zb19zdGF0ZXMpOworCWlmIChvcGVuX2ZsYWdzICYgRk1PREVfUkVBRCkKKwkJc3RhdGUtPm5yZWFkZXJzKys7CisJbWVtY3B5KCZzdGF0ZS0+c3RhdGVpZCwgc3RhdGVpZCwgc2l6ZW9mKHN0YXRlLT5zdGF0ZWlkKSk7CisJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworfQorCisvKgorICogT1BFTl9SRUNMQUlNOgorICogCXJlY2xhaW0gc3RhdGUgb24gdGhlIHNlcnZlciBhZnRlciBhIHJlYm9vdC4KKyAqIAlBc3N1bWVzIGNhbGxlciBpcyBob2xkaW5nIHRoZSBzcC0+c29fc2VtCisgKi8KK3N0YXRpYyBpbnQgX25mczRfb3Blbl9yZWNsYWltKHN0cnVjdCBuZnM0X3N0YXRlX293bmVyICpzcCwgc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBzdGF0ZS0+aW5vZGU7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IE5GU19TRVJWRVIoaW5vZGUpOworCXN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbiA9IE5GU19JKGlub2RlKS0+ZGVsZWdhdGlvbjsKKwlzdHJ1Y3QgbmZzX29wZW5hcmdzIG9fYXJnID0geworCQkuZmggPSBORlNfRkgoaW5vZGUpLAorCQkuc2VxaWQgPSBzcC0+c29fc2VxaWQsCisJCS5pZCA9IHNwLT5zb19pZCwKKwkJLm9wZW5fZmxhZ3MgPSBzdGF0ZS0+c3RhdGUsCisJCS5jbGllbnRpZCA9IHNlcnZlci0+bmZzNF9zdGF0ZS0+Y2xfY2xpZW50aWQsCisJCS5jbGFpbSA9IE5GUzRfT1BFTl9DTEFJTV9QUkVWSU9VUywKKwkJLmJpdG1hc2sgPSBzZXJ2ZXItPmF0dHJfYml0bWFzaywKKwl9OworCXN0cnVjdCBuZnNfb3BlbnJlcyBvX3JlcyA9IHsKKwkJLnNlcnZlciA9IHNlcnZlciwJLyogR3JyciAqLworCX07CisJc3RydWN0IHJwY19tZXNzYWdlIG1zZyA9IHsKKwkJLnJwY19wcm9jICAgICAgID0gJm5mczRfcHJvY2VkdXJlc1tORlNQUk9DNF9DTE5UX09QRU5fTk9BVFRSXSwKKwkJLnJwY19hcmdwICAgICAgID0gJm9fYXJnLAorCQkucnBjX3Jlc3AJPSAmb19yZXMsCisJCS5ycGNfY3JlZAk9IHNwLT5zb19jcmVkLAorCX07CisJaW50IHN0YXR1czsKKworCWlmIChkZWxlZ2F0aW9uICE9IE5VTEwpIHsKKwkJaWYgKCEoZGVsZWdhdGlvbi0+ZmxhZ3MgJiBORlNfREVMRUdBVElPTl9ORUVEX1JFQ0xBSU0pKSB7CisJCQltZW1jcHkoJnN0YXRlLT5zdGF0ZWlkLCAmZGVsZWdhdGlvbi0+c3RhdGVpZCwKKwkJCQkJc2l6ZW9mKHN0YXRlLT5zdGF0ZWlkKSk7CisJCQlzZXRfYml0KE5GU19ERUxFR0FURURfU1RBVEUsICZzdGF0ZS0+ZmxhZ3MpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJb19hcmcudS5kZWxlZ2F0aW9uX3R5cGUgPSBkZWxlZ2F0aW9uLT50eXBlOworCX0KKwlzdGF0dXMgPSBycGNfY2FsbF9zeW5jKHNlcnZlci0+Y2xpZW50LCAmbXNnLCBSUENfVEFTS19OT0lOVFIpOworCW5mczRfaW5jcmVtZW50X3NlcWlkKHN0YXR1cywgc3ApOworCWlmIChzdGF0dXMgPT0gMCkgeworCQltZW1jcHkoJnN0YXRlLT5zdGF0ZWlkLCAmb19yZXMuc3RhdGVpZCwgc2l6ZW9mKHN0YXRlLT5zdGF0ZWlkKSk7CisJCWlmIChvX3Jlcy5kZWxlZ2F0aW9uX3R5cGUgIT0gMCkgeworCQkJbmZzX2lub2RlX3JlY2xhaW1fZGVsZWdhdGlvbihpbm9kZSwgc3AtPnNvX2NyZWQsICZvX3Jlcyk7CisJCQkvKiBEaWQgdGhlIHNlcnZlciBpc3N1ZSBhbiBpbW1lZGlhdGUgZGVsZWdhdGlvbiByZWNhbGw/ICovCisJCQlpZiAob19yZXMuZG9fcmVjYWxsKQorCQkJCW5mc19hc3luY19pbm9kZV9yZXR1cm5fZGVsZWdhdGlvbihpbm9kZSwgJm9fcmVzLnN0YXRlaWQpOworCQl9CisJfQorCWNsZWFyX2JpdChORlNfREVMRUdBVEVEX1NUQVRFLCAmc3RhdGUtPmZsYWdzKTsKKwkvKiBFbnN1cmUgd2UgdXBkYXRlIHRoZSBpbm9kZSBhdHRyaWJ1dGVzICovCisJTkZTX0NBQ0hFSU5WKGlub2RlKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IG5mczRfb3Blbl9yZWNsYWltKHN0cnVjdCBuZnM0X3N0YXRlX293bmVyICpzcCwgc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0VSVkVSKHN0YXRlLT5pbm9kZSk7CisJc3RydWN0IG5mczRfZXhjZXB0aW9uIGV4Y2VwdGlvbiA9IHsgfTsKKwlpbnQgZXJyOworCWRvIHsKKwkJZXJyID0gX25mczRfb3Blbl9yZWNsYWltKHNwLCBzdGF0ZSk7CisJCXN3aXRjaCAoZXJyKSB7CisJCQljYXNlIDA6CisJCQljYXNlIC1ORlM0RVJSX1NUQUxFX0NMSUVOVElEOgorCQkJY2FzZSAtTkZTNEVSUl9TVEFMRV9TVEFURUlEOgorCQkJY2FzZSAtTkZTNEVSUl9FWFBJUkVEOgorCQkJCXJldHVybiBlcnI7CisJCX0KKwkJZXJyID0gbmZzNF9oYW5kbGVfZXhjZXB0aW9uKHNlcnZlciwgZXJyLCAmZXhjZXB0aW9uKTsKKwl9IHdoaWxlIChleGNlcHRpb24ucmV0cnkpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX25mczRfb3Blbl9kZWxlZ2F0aW9uX3JlY2FsbChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAgKnNwICA9IHN0YXRlLT5vd25lcjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0VSVkVSKGlub2RlKTsKKwlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQgPSBkZ2V0X3BhcmVudChkZW50cnkpOworCXN0cnVjdCBuZnNfb3BlbmFyZ3MgYXJnID0geworCQkuZmggPSBORlNfRkgocGFyZW50LT5kX2lub2RlKSwKKwkJLmNsaWVudGlkID0gc2VydmVyLT5uZnM0X3N0YXRlLT5jbF9jbGllbnRpZCwKKwkJLm5hbWUgPSAmZGVudHJ5LT5kX25hbWUsCisJCS5pZCA9IHNwLT5zb19pZCwKKwkJLnNlcnZlciA9IHNlcnZlciwKKwkJLmJpdG1hc2sgPSBzZXJ2ZXItPmF0dHJfYml0bWFzaywKKwkJLmNsYWltID0gTkZTNF9PUEVOX0NMQUlNX0RFTEVHQVRFX0NVUiwKKwl9OworCXN0cnVjdCBuZnNfb3BlbnJlcyByZXMgPSB7CisJCS5zZXJ2ZXIgPSBzZXJ2ZXIsCisJfTsKKwlzdHJ1Y3QgCXJwY19tZXNzYWdlIG1zZyA9IHsKKwkJLnJwY19wcm9jICAgICAgID0gJm5mczRfcHJvY2VkdXJlc1tORlNQUk9DNF9DTE5UX09QRU5fTk9BVFRSXSwKKwkJLnJwY19hcmdwICAgICAgID0gJmFyZywKKwkJLnJwY19yZXNwICAgICAgID0gJnJlcywKKwkJLnJwY19jcmVkCT0gc3AtPnNvX2NyZWQsCisJfTsKKwlpbnQgc3RhdHVzID0gMDsKKworCWRvd24oJnNwLT5zb19zZW1hKTsKKwlpZiAoIXRlc3RfYml0KE5GU19ERUxFR0FURURfU1RBVEUsICZzdGF0ZS0+ZmxhZ3MpKQorCQlnb3RvIG91dDsKKwlpZiAoc3RhdGUtPnN0YXRlID09IDApCisJCWdvdG8gb3V0OworCWFyZy5zZXFpZCA9IHNwLT5zb19zZXFpZDsKKwlhcmcub3Blbl9mbGFncyA9IHN0YXRlLT5zdGF0ZTsKKwltZW1jcHkoYXJnLnUuZGVsZWdhdGlvbi5kYXRhLCBzdGF0ZS0+c3RhdGVpZC5kYXRhLCBzaXplb2YoYXJnLnUuZGVsZWdhdGlvbi5kYXRhKSk7CisJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhzZXJ2ZXItPmNsaWVudCwgJm1zZywgUlBDX1RBU0tfTk9JTlRSKTsKKwluZnM0X2luY3JlbWVudF9zZXFpZChzdGF0dXMsIHNwKTsKKwlpZiAoc3RhdHVzID49IDApIHsKKwkJbWVtY3B5KHN0YXRlLT5zdGF0ZWlkLmRhdGEsIHJlcy5zdGF0ZWlkLmRhdGEsCisJCQkJc2l6ZW9mKHN0YXRlLT5zdGF0ZWlkLmRhdGEpKTsKKwkJY2xlYXJfYml0KE5GU19ERUxFR0FURURfU1RBVEUsICZzdGF0ZS0+ZmxhZ3MpOworCX0KK291dDoKKwl1cCgmc3AtPnNvX3NlbWEpOworCWRwdXQocGFyZW50KTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgbmZzNF9vcGVuX2RlbGVnYXRpb25fcmVjYWxsKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBuZnM0X2V4Y2VwdGlvbiBleGNlcHRpb24gPSB7IH07CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IE5GU19TRVJWRVIoZGVudHJ5LT5kX2lub2RlKTsKKwlpbnQgZXJyOworCWRvIHsKKwkJZXJyID0gX25mczRfb3Blbl9kZWxlZ2F0aW9uX3JlY2FsbChkZW50cnksIHN0YXRlKTsKKwkJc3dpdGNoIChlcnIpIHsKKwkJCWNhc2UgMDoKKwkJCQlyZXR1cm4gZXJyOworCQkJY2FzZSAtTkZTNEVSUl9TVEFMRV9DTElFTlRJRDoKKwkJCWNhc2UgLU5GUzRFUlJfU1RBTEVfU1RBVEVJRDoKKwkJCWNhc2UgLU5GUzRFUlJfRVhQSVJFRDoKKwkJCQkvKiBEb24ndCByZWNhbGwgYSBkZWxlZ2F0aW9uIGlmIGl0IHdhcyBsb3N0ICovCisJCQkJbmZzNF9zY2hlZHVsZV9zdGF0ZV9yZWNvdmVyeShzZXJ2ZXItPm5mczRfc3RhdGUpOworCQkJCXJldHVybiBlcnI7CisJCX0KKwkJZXJyID0gbmZzNF9oYW5kbGVfZXhjZXB0aW9uKHNlcnZlciwgZXJyLCAmZXhjZXB0aW9uKTsKKwl9IHdoaWxlIChleGNlcHRpb24ucmV0cnkpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IF9uZnM0X3Byb2Nfb3Blbl9jb25maXJtKHN0cnVjdCBycGNfY2xudCAqY2xudCwgY29uc3Qgc3RydWN0IG5mc19maCAqZmgsIHN0cnVjdCBuZnM0X3N0YXRlX293bmVyICpzcCwgbmZzNF9zdGF0ZWlkICpzdGF0ZWlkKQoreworCXN0cnVjdCBuZnNfb3Blbl9jb25maXJtYXJncyBhcmcgPSB7CisJCS5maCAgICAgICAgICAgICA9IGZoLAorCQkuc2VxaWQgICAgICAgICAgPSBzcC0+c29fc2VxaWQsCisJCS5zdGF0ZWlkCT0gKnN0YXRlaWQsCisJfTsKKwlzdHJ1Y3QgbmZzX29wZW5fY29uZmlybXJlcyByZXM7CisJc3RydWN0IAlycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfcHJvYyAgICAgICA9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9PUEVOX0NPTkZJUk1dLAorCQkucnBjX2FyZ3AgICAgICAgPSAmYXJnLAorCQkucnBjX3Jlc3AgICAgICAgPSAmcmVzLAorCQkucnBjX2NyZWQJPSBzcC0+c29fY3JlZCwKKwl9OworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBycGNfY2FsbF9zeW5jKGNsbnQsICZtc2csIFJQQ19UQVNLX05PSU5UUik7CisJbmZzNF9pbmNyZW1lbnRfc2VxaWQoc3RhdHVzLCBzcCk7CisJaWYgKHN0YXR1cyA+PSAwKQorCQltZW1jcHkoc3RhdGVpZCwgJnJlcy5zdGF0ZWlkLCBzaXplb2YoKnN0YXRlaWQpKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IF9uZnM0X3Byb2Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IG5mczRfc3RhdGVfb3duZXIgICpzcCwgc3RydWN0IG5mc19vcGVuYXJncyAqb19hcmcsIHN0cnVjdCBuZnNfb3BlbnJlcyAqb19yZXMpCit7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IE5GU19TRVJWRVIoZGlyKTsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0geworCQkucnBjX3Byb2MgPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfT1BFTl0sCisJCS5ycGNfYXJncCA9IG9fYXJnLAorCQkucnBjX3Jlc3AgPSBvX3JlcywKKwkJLnJwY19jcmVkID0gc3AtPnNvX2NyZWQsCisJfTsKKwlpbnQgc3RhdHVzOworCisJLyogVXBkYXRlIHNlcXVlbmNlIGlkLiBUaGUgY2FsbGVyIG11c3Qgc2VyaWFsaXplISAqLworCW9fYXJnLT5zZXFpZCA9IHNwLT5zb19zZXFpZDsKKwlvX2FyZy0+aWQgPSBzcC0+c29faWQ7CisJb19hcmctPmNsaWVudGlkID0gc3AtPnNvX2NsaWVudC0+Y2xfY2xpZW50aWQ7CisKKwlzdGF0dXMgPSBycGNfY2FsbF9zeW5jKHNlcnZlci0+Y2xpZW50LCAmbXNnLCBSUENfVEFTS19OT0lOVFIpOworCW5mczRfaW5jcmVtZW50X3NlcWlkKHN0YXR1cywgc3ApOworCWlmIChzdGF0dXMgIT0gMCkKKwkJZ290byBvdXQ7CisJdXBkYXRlX2NoYW5nZWF0dHIoZGlyLCAmb19yZXMtPmNpbmZvKTsKKwlpZihvX3Jlcy0+cmZsYWdzICYgTkZTNF9PUEVOX1JFU1VMVF9DT05GSVJNKSB7CisJCXN0YXR1cyA9IF9uZnM0X3Byb2Nfb3Blbl9jb25maXJtKHNlcnZlci0+Y2xpZW50LCAmb19yZXMtPmZoLAorCQkJCXNwLCAmb19yZXMtPnN0YXRlaWQpOworCQlpZiAoc3RhdHVzICE9IDApCisJCQlnb3RvIG91dDsKKwl9CisJaWYgKCEob19yZXMtPmZfYXR0ci0+dmFsaWQgJiBORlNfQVRUUl9GQVRUUikpCisJCXN0YXR1cyA9IHNlcnZlci0+cnBjX29wcy0+Z2V0YXR0cihzZXJ2ZXIsICZvX3Jlcy0+ZmgsIG9fcmVzLT5mX2F0dHIpOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgX25mczRfZG9fYWNjZXNzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBycGNfY3JlZCAqY3JlZCwgaW50IG9wZW5mbGFncykKK3sKKwlzdHJ1Y3QgbmZzX2FjY2Vzc19lbnRyeSBjYWNoZTsKKwlpbnQgbWFzayA9IDA7CisJaW50IHN0YXR1czsKKworCWlmIChvcGVuZmxhZ3MgJiBGTU9ERV9SRUFEKQorCQltYXNrIHw9IE1BWV9SRUFEOworCWlmIChvcGVuZmxhZ3MgJiBGTU9ERV9XUklURSkKKwkJbWFzayB8PSBNQVlfV1JJVEU7CisJc3RhdHVzID0gbmZzX2FjY2Vzc19nZXRfY2FjaGVkKGlub2RlLCBjcmVkLCAmY2FjaGUpOworCWlmIChzdGF0dXMgPT0gMCkKKwkJZ290byBvdXQ7CisKKwkvKiBCZSBjbGV2ZXI6IGFzayBzZXJ2ZXIgdG8gY2hlY2sgZm9yIGFsbCBwb3NzaWJsZSByaWdodHMgKi8KKwljYWNoZS5tYXNrID0gTUFZX0VYRUMgfCBNQVlfV1JJVEUgfCBNQVlfUkVBRDsKKwljYWNoZS5jcmVkID0gY3JlZDsKKwljYWNoZS5qaWZmaWVzID0gamlmZmllczsKKwlzdGF0dXMgPSBfbmZzNF9wcm9jX2FjY2Vzcyhpbm9kZSwgJmNhY2hlKTsKKwlpZiAoc3RhdHVzICE9IDApCisJCXJldHVybiBzdGF0dXM7CisJbmZzX2FjY2Vzc19hZGRfY2FjaGUoaW5vZGUsICZjYWNoZSk7CitvdXQ6CisJaWYgKChjYWNoZS5tYXNrICYgbWFzaykgPT0gbWFzaykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FQUNDRVM7Cit9CisKKy8qCisgKiBPUEVOX0VYUElSRUQ6CisgKiAJcmVjbGFpbSBzdGF0ZSBvbiB0aGUgc2VydmVyIGFmdGVyIGEgbmV0d29yayBwYXJ0aXRpb24uCisgKiAJQXNzdW1lcyBjYWxsZXIgaG9sZHMgdGhlIGFwcHJvcHJpYXRlIGxvY2sKKyAqLworc3RhdGljIGludCBfbmZzNF9vcGVuX2V4cGlyZWQoc3RydWN0IG5mczRfc3RhdGVfb3duZXIgKnNwLCBzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQgPSBkZ2V0X3BhcmVudChkZW50cnkpOworCXN0cnVjdCBpbm9kZSAqZGlyID0gcGFyZW50LT5kX2lub2RlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBzdGF0ZS0+aW5vZGU7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IE5GU19TRVJWRVIoZGlyKTsKKwlzdHJ1Y3QgbmZzX2RlbGVnYXRpb24gKmRlbGVnYXRpb24gPSBORlNfSShpbm9kZSktPmRlbGVnYXRpb247CisJc3RydWN0IG5mc19mYXR0ciAgICAgICAgZl9hdHRyID0geworCQkudmFsaWQgPSAwLAorCX07CisJc3RydWN0IG5mc19vcGVuYXJncyBvX2FyZyA9IHsKKwkJLmZoID0gTkZTX0ZIKGRpciksCisJCS5vcGVuX2ZsYWdzID0gc3RhdGUtPnN0YXRlLAorCQkubmFtZSA9ICZkZW50cnktPmRfbmFtZSwKKwkJLmJpdG1hc2sgPSBzZXJ2ZXItPmF0dHJfYml0bWFzaywKKwkJLmNsYWltID0gTkZTNF9PUEVOX0NMQUlNX05VTEwsCisJfTsKKwlzdHJ1Y3QgbmZzX29wZW5yZXMgb19yZXMgPSB7CisJCS5mX2F0dHIgPSAmZl9hdHRyLAorCQkuc2VydmVyID0gc2VydmVyLAorCX07CisJaW50IHN0YXR1cyA9IDA7CisKKwlpZiAoZGVsZWdhdGlvbiAhPSBOVUxMICYmICEoZGVsZWdhdGlvbi0+ZmxhZ3MgJiBORlNfREVMRUdBVElPTl9ORUVEX1JFQ0xBSU0pKSB7CisJCXN0YXR1cyA9IF9uZnM0X2RvX2FjY2Vzcyhpbm9kZSwgc3AtPnNvX2NyZWQsIHN0YXRlLT5zdGF0ZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBvdXQ7CisJCW1lbWNweSgmc3RhdGUtPnN0YXRlaWQsICZkZWxlZ2F0aW9uLT5zdGF0ZWlkLCBzaXplb2Yoc3RhdGUtPnN0YXRlaWQpKTsKKwkJc2V0X2JpdChORlNfREVMRUdBVEVEX1NUQVRFLCAmc3RhdGUtPmZsYWdzKTsKKwkJZ290byBvdXQ7CisJfQorCXN0YXR1cyA9IF9uZnM0X3Byb2Nfb3BlbihkaXIsIHNwLCAmb19hcmcsICZvX3Jlcyk7CisJaWYgKHN0YXR1cyAhPSAwKQorCQlnb3RvIG91dF9ub2RlbGVnOworCS8qIENoZWNrIGlmIGZpbGVzIGRpZmZlciAqLworCWlmICgoZl9hdHRyLm1vZGUgJiBTX0lGTVQpICE9IChpbm9kZS0+aV9tb2RlICYgU19JRk1UKSkKKwkJZ290byBvdXRfc3RhbGU7CisJLyogSGFzIHRoZSBmaWxlIGhhbmRsZSBjaGFuZ2VkPyAqLworCWlmIChuZnNfY29tcGFyZV9maCgmb19yZXMuZmgsIE5GU19GSChpbm9kZSkpICE9IDApIHsKKwkJLyogVmVyaWZ5IGlmIHRoZSBjaGFuZ2UgYXR0cmlidXRlcyBhcmUgdGhlIHNhbWUgKi8KKwkJaWYgKGZfYXR0ci5jaGFuZ2VfYXR0ciAhPSBORlNfSShpbm9kZSktPmNoYW5nZV9hdHRyKQorCQkJZ290byBvdXRfc3RhbGU7CisJCWlmIChuZnNfc2l6ZV90b19sb2ZmX3QoZl9hdHRyLnNpemUpICE9IGlub2RlLT5pX3NpemUpCisJCQlnb3RvIG91dF9zdGFsZTsKKwkJLyogTGV0cyBqdXN0IHByZXRlbmQgdGhhdCB0aGlzIGlzIHRoZSBzYW1lIGZpbGUgKi8KKwkJbmZzX2NvcHlfZmgoTkZTX0ZIKGlub2RlKSwgJm9fcmVzLmZoKTsKKwkJTkZTX0koaW5vZGUpLT5maWxlaWQgPSBmX2F0dHIuZmlsZWlkOworCX0KKwltZW1jcHkoJnN0YXRlLT5zdGF0ZWlkLCAmb19yZXMuc3RhdGVpZCwgc2l6ZW9mKHN0YXRlLT5zdGF0ZWlkKSk7CisJaWYgKG9fcmVzLmRlbGVnYXRpb25fdHlwZSAhPSAwKSB7CisJCWlmICghKGRlbGVnYXRpb24tPmZsYWdzICYgTkZTX0RFTEVHQVRJT05fTkVFRF9SRUNMQUlNKSkKKwkJCW5mc19pbm9kZV9zZXRfZGVsZWdhdGlvbihpbm9kZSwgc3AtPnNvX2NyZWQsICZvX3Jlcyk7CisJCWVsc2UKKwkJCW5mc19pbm9kZV9yZWNsYWltX2RlbGVnYXRpb24oaW5vZGUsIHNwLT5zb19jcmVkLCAmb19yZXMpOworCX0KK291dF9ub2RlbGVnOgorCWNsZWFyX2JpdChORlNfREVMRUdBVEVEX1NUQVRFLCAmc3RhdGUtPmZsYWdzKTsKK291dDoKKwlkcHV0KHBhcmVudCk7CisJcmV0dXJuIHN0YXR1czsKK291dF9zdGFsZToKKwlzdGF0dXMgPSAtRVNUQUxFOworCS8qIEludmFsaWRhdGUgdGhlIHN0YXRlIG93bmVyIHNvIHdlIGRvbid0IGV2ZXIgdXNlIGl0IGFnYWluICovCisJbmZzNF9kcm9wX3N0YXRlX293bmVyKHNwKTsKKwlkX2Ryb3AoZGVudHJ5KTsKKwkvKiBTaG91bGQgd2UgYmUgdHJ5aW5nIHRvIGNsb3NlIHRoYXQgc3RhdGVpZD8gKi8KKwlnb3RvIG91dF9ub2RlbGVnOworfQorCitzdGF0aWMgaW50IG5mczRfb3Blbl9leHBpcmVkKHN0cnVjdCBuZnM0X3N0YXRlX293bmVyICpzcCwgc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShzdGF0ZS0+aW5vZGUpOworCXN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHg7CisJaW50IHN0YXR1czsKKworCXNwaW5fbG9jaygmc3RhdGUtPmlub2RlLT5pX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3R4LCAmbmZzaS0+b3Blbl9maWxlcywgbGlzdCkgeworCQlpZiAoY3R4LT5zdGF0ZSAhPSBzdGF0ZSkKKwkJCWNvbnRpbnVlOworCQlnZXRfbmZzX29wZW5fY29udGV4dChjdHgpOworCQlzcGluX3VubG9jaygmc3RhdGUtPmlub2RlLT5pX2xvY2spOworCQlzdGF0dXMgPSBfbmZzNF9vcGVuX2V4cGlyZWQoc3AsIHN0YXRlLCBjdHgtPmRlbnRyeSk7CisJCXB1dF9uZnNfb3Blbl9jb250ZXh0KGN0eCk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCXNwaW5fdW5sb2NrKCZzdGF0ZS0+aW5vZGUtPmlfbG9jayk7CisJcmV0dXJuIC1FTk9FTlQ7Cit9CisKKy8qCisgKiBSZXR1cm5zIGFuIG5mczRfc3RhdGUgKyBhbiBleHRyYSByZWZlcmVuY2UgdG8gdGhlIGlub2RlCisgKi8KK3N0YXRpYyBpbnQgX25mczRfb3Blbl9kZWxlZ2F0ZWQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZsYWdzLCBzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQsIHN0cnVjdCBuZnM0X3N0YXRlICoqcmVzKQoreworCXN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbjsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NFUlZFUihpbm9kZSk7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHAgPSBzZXJ2ZXItPm5mczRfc3RhdGU7CisJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKKwlzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqc3AgPSBOVUxMOworCXN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSA9IE5VTEw7CisJaW50IG9wZW5fZmxhZ3MgPSBmbGFncyAmIChGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKTsKKwlpbnQgZXJyOworCisJLyogUHJvdGVjdCBhZ2FpbnN0IHJlYm9vdCByZWNvdmVyeSAtIE5PVEUgT1JERVIhICovCisJZG93bl9yZWFkKCZjbHAtPmNsX3NlbSk7CisJLyogUHJvdGVjdCBhZ2FpbnN0IGRlbGVnYXRpb24gcmVjYWxsICovCisJZG93bl9yZWFkKCZuZnNpLT5yd3NlbSk7CisJZGVsZWdhdGlvbiA9IE5GU19JKGlub2RlKS0+ZGVsZWdhdGlvbjsKKwllcnIgPSAtRU5PRU5UOworCWlmIChkZWxlZ2F0aW9uID09IE5VTEwgfHwgKGRlbGVnYXRpb24tPnR5cGUgJiBvcGVuX2ZsYWdzKSAhPSBvcGVuX2ZsYWdzKQorCQlnb3RvIG91dF9lcnI7CisJZXJyID0gLUVOT01FTTsKKwlpZiAoIShzcCA9IG5mczRfZ2V0X3N0YXRlX293bmVyKHNlcnZlciwgY3JlZCkpKSB7CisJCWRwcmludGsoIiVzOiBuZnM0X2dldF9zdGF0ZV9vd25lciBmYWlsZWQhXG4iLCBfX0ZVTkNUSU9OX18pOworCQlnb3RvIG91dF9lcnI7CisJfQorCWRvd24oJnNwLT5zb19zZW1hKTsKKwlzdGF0ZSA9IG5mczRfZ2V0X29wZW5fc3RhdGUoaW5vZGUsIHNwKTsKKwlpZiAoc3RhdGUgPT0gTlVMTCkKKwkJZ290byBvdXRfZXJyOworCisJZXJyID0gLUVOT0VOVDsKKwlpZiAoKHN0YXRlLT5zdGF0ZSAmIG9wZW5fZmxhZ3MpID09IG9wZW5fZmxhZ3MpIHsKKwkJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkJaWYgKG9wZW5fZmxhZ3MgJiBGTU9ERV9SRUFEKQorCQkJc3RhdGUtPm5yZWFkZXJzKys7CisJCWlmIChvcGVuX2ZsYWdzICYgRk1PREVfV1JJVEUpCisJCQlzdGF0ZS0+bndyaXRlcnMrKzsKKwkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCQlnb3RvIG91dF9vazsKKwl9IGVsc2UgaWYgKHN0YXRlLT5zdGF0ZSAhPSAwKQorCQlnb3RvIG91dF9lcnI7CisKKwlsb2NrX2tlcm5lbCgpOworCWVyciA9IF9uZnM0X2RvX2FjY2Vzcyhpbm9kZSwgY3JlZCwgb3Blbl9mbGFncyk7CisJdW5sb2NrX2tlcm5lbCgpOworCWlmIChlcnIgIT0gMCkKKwkJZ290byBvdXRfZXJyOworCXNldF9iaXQoTkZTX0RFTEVHQVRFRF9TVEFURSwgJnN0YXRlLT5mbGFncyk7CisJdXBkYXRlX29wZW5fc3RhdGVpZChzdGF0ZSwgJmRlbGVnYXRpb24tPnN0YXRlaWQsIG9wZW5fZmxhZ3MpOworb3V0X29rOgorCXVwKCZzcC0+c29fc2VtYSk7CisJbmZzNF9wdXRfc3RhdGVfb3duZXIoc3ApOworCXVwX3JlYWQoJm5mc2ktPnJ3c2VtKTsKKwl1cF9yZWFkKCZjbHAtPmNsX3NlbSk7CisJaWdyYWIoaW5vZGUpOworCSpyZXMgPSBzdGF0ZTsKKwlyZXR1cm4gMDsgCitvdXRfZXJyOgorCWlmIChzcCAhPSBOVUxMKSB7CisJCWlmIChzdGF0ZSAhPSBOVUxMKQorCQkJbmZzNF9wdXRfb3Blbl9zdGF0ZShzdGF0ZSk7CisJCXVwKCZzcC0+c29fc2VtYSk7CisJCW5mczRfcHV0X3N0YXRlX293bmVyKHNwKTsKKwl9CisJdXBfcmVhZCgmbmZzaS0+cndzZW0pOworCXVwX3JlYWQoJmNscC0+Y2xfc2VtKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IG5mczRfc3RhdGUgKm5mczRfb3Blbl9kZWxlZ2F0ZWQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZsYWdzLCBzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQpCit7CisJc3RydWN0IG5mczRfZXhjZXB0aW9uIGV4Y2VwdGlvbiA9IHsgfTsKKwlzdHJ1Y3QgbmZzNF9zdGF0ZSAqcmVzOworCWludCBlcnI7CisKKwlkbyB7CisJCWVyciA9IF9uZnM0X29wZW5fZGVsZWdhdGVkKGlub2RlLCBmbGFncywgY3JlZCwgJnJlcyk7CisJCWlmIChlcnIgPT0gMCkKKwkJCWJyZWFrOworCQlyZXMgPSBFUlJfUFRSKG5mczRfaGFuZGxlX2V4Y2VwdGlvbihORlNfU0VSVkVSKGlub2RlKSwKKwkJCQkJZXJyLCAmZXhjZXB0aW9uKSk7CisJfSB3aGlsZSAoZXhjZXB0aW9uLnJldHJ5KTsKKwlyZXR1cm4gcmVzOworfQorCisvKgorICogUmV0dXJucyBhbiBuZnM0X3N0YXRlICsgYW4gcmVmZXJlbmNlZCBpbm9kZQorICovCitzdGF0aWMgaW50IF9uZnM0X2RvX29wZW4oc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGZsYWdzLCBzdHJ1Y3QgaWF0dHIgKnNhdHRyLCBzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQsIHN0cnVjdCBuZnM0X3N0YXRlICoqcmVzKQoreworCXN0cnVjdCBuZnM0X3N0YXRlX293bmVyICAqc3A7CisJc3RydWN0IG5mczRfc3RhdGUgICAgICpzdGF0ZSA9IE5VTEw7CisJc3RydWN0IG5mc19zZXJ2ZXIgICAgICAgKnNlcnZlciA9IE5GU19TRVJWRVIoZGlyKTsKKwlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCA9IHNlcnZlci0+bmZzNF9zdGF0ZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTlVMTDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBzdGF0dXM7CisJc3RydWN0IG5mc19mYXR0ciAgICAgICAgZl9hdHRyID0geworCQkudmFsaWQgICAgICAgICAgPSAwLAorCX07CisJc3RydWN0IG5mc19vcGVuYXJncyBvX2FyZyA9IHsKKwkJLmZoICAgICAgICAgICAgID0gTkZTX0ZIKGRpciksCisJCS5vcGVuX2ZsYWdzCT0gZmxhZ3MsCisJCS5uYW1lICAgICAgICAgICA9ICZkZW50cnktPmRfbmFtZSwKKwkJLnNlcnZlciAgICAgICAgID0gc2VydmVyLAorCQkuYml0bWFzayA9IHNlcnZlci0+YXR0cl9iaXRtYXNrLAorCQkuY2xhaW0gPSBORlM0X09QRU5fQ0xBSU1fTlVMTCwKKwl9OworCXN0cnVjdCBuZnNfb3BlbnJlcyBvX3JlcyA9IHsKKwkJLmZfYXR0ciAgICAgICAgID0gJmZfYXR0ciwKKwkJLnNlcnZlciAgICAgICAgID0gc2VydmVyLAorCX07CisKKwkvKiBQcm90ZWN0IGFnYWluc3QgcmVib290IHJlY292ZXJ5IGNvbmZsaWN0cyAqLworCWRvd25fcmVhZCgmY2xwLT5jbF9zZW0pOworCXN0YXR1cyA9IC1FTk9NRU07CisJaWYgKCEoc3AgPSBuZnM0X2dldF9zdGF0ZV9vd25lcihzZXJ2ZXIsIGNyZWQpKSkgeworCQlkcHJpbnRrKCJuZnM0X2RvX29wZW46IG5mczRfZ2V0X3N0YXRlX293bmVyIGZhaWxlZCFcbiIpOworCQlnb3RvIG91dF9lcnI7CisJfQorCWlmIChmbGFncyAmIE9fRVhDTCkgeworCQl1MzIgKnAgPSAodTMyICopIG9fYXJnLnUudmVyaWZpZXIuZGF0YTsKKwkJcFswXSA9IGppZmZpZXM7CisJCXBbMV0gPSBjdXJyZW50LT5waWQ7CisJfSBlbHNlCisJCW9fYXJnLnUuYXR0cnMgPSBzYXR0cjsKKwkvKiBTZXJpYWxpemF0aW9uIGZvciB0aGUgc2VxdWVuY2UgaWQgKi8KKwlkb3duKCZzcC0+c29fc2VtYSk7CisKKwlzdGF0dXMgPSBfbmZzNF9wcm9jX29wZW4oZGlyLCBzcCwgJm9fYXJnLCAmb19yZXMpOworCWlmIChzdGF0dXMgIT0gMCkKKwkJZ290byBvdXRfZXJyOworCisJc3RhdHVzID0gLUVOT01FTTsKKwlpbm9kZSA9IG5mc19maGdldChkaXItPmlfc2IsICZvX3Jlcy5maCwgJmZfYXR0cik7CisJaWYgKCFpbm9kZSkKKwkJZ290byBvdXRfZXJyOworCXN0YXRlID0gbmZzNF9nZXRfb3Blbl9zdGF0ZShpbm9kZSwgc3ApOworCWlmICghc3RhdGUpCisJCWdvdG8gb3V0X2VycjsKKwl1cGRhdGVfb3Blbl9zdGF0ZWlkKHN0YXRlLCAmb19yZXMuc3RhdGVpZCwgZmxhZ3MpOworCWlmIChvX3Jlcy5kZWxlZ2F0aW9uX3R5cGUgIT0gMCkKKwkJbmZzX2lub2RlX3NldF9kZWxlZ2F0aW9uKGlub2RlLCBjcmVkLCAmb19yZXMpOworCXVwKCZzcC0+c29fc2VtYSk7CisJbmZzNF9wdXRfc3RhdGVfb3duZXIoc3ApOworCXVwX3JlYWQoJmNscC0+Y2xfc2VtKTsKKwkqcmVzID0gc3RhdGU7CisJcmV0dXJuIDA7CitvdXRfZXJyOgorCWlmIChzcCAhPSBOVUxMKSB7CisJCWlmIChzdGF0ZSAhPSBOVUxMKQorCQkJbmZzNF9wdXRfb3Blbl9zdGF0ZShzdGF0ZSk7CisJCXVwKCZzcC0+c29fc2VtYSk7CisJCW5mczRfcHV0X3N0YXRlX293bmVyKHNwKTsKKwl9CisJLyogTm90ZTogY2xwLT5jbF9zZW0gbXVzdCBiZSByZWxlYXNlZCBiZWZvcmUgbmZzNF9wdXRfb3Blbl9zdGF0ZSgpISAqLworCXVwX3JlYWQoJmNscC0+Y2xfc2VtKTsKKwlpZiAoaW5vZGUgIT0gTlVMTCkKKwkJaXB1dChpbm9kZSk7CisJKnJlcyA9IE5VTEw7CisJcmV0dXJuIHN0YXR1czsKK30KKworCitzdGF0aWMgc3RydWN0IG5mczRfc3RhdGUgKm5mczRfZG9fb3BlbihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgZmxhZ3MsIHN0cnVjdCBpYXR0ciAqc2F0dHIsIHN0cnVjdCBycGNfY3JlZCAqY3JlZCkKK3sKKwlzdHJ1Y3QgbmZzNF9leGNlcHRpb24gZXhjZXB0aW9uID0geyB9OworCXN0cnVjdCBuZnM0X3N0YXRlICpyZXM7CisJaW50IHN0YXR1czsKKworCWRvIHsKKwkJc3RhdHVzID0gX25mczRfZG9fb3BlbihkaXIsIGRlbnRyeSwgZmxhZ3MsIHNhdHRyLCBjcmVkLCAmcmVzKTsKKwkJaWYgKHN0YXR1cyA9PSAwKQorCQkJYnJlYWs7CisJCS8qIE5PVEU6IEJBRF9TRVFJRCBtZWFucyB0aGUgc2VydmVyIGFuZCBjbGllbnQgZGlzYWdyZWUgYWJvdXQgdGhlCisJCSAqIGJvb2sta2VlcGluZyB3LnIudC4gc3RhdGUtY2hhbmdpbmcgb3BlcmF0aW9ucworCQkgKiAoT1BFTi9DTE9TRS9MT0NLL0xPQ0tVLi4uKQorCQkgKiBJdCBpcyBhY3R1YWxseSBhIHNpZ24gb2YgYSBidWcgb24gdGhlIGNsaWVudCBvciBvbiB0aGUgc2VydmVyLgorCQkgKgorCQkgKiBJZiB3ZSByZWNlaXZlIGEgQkFEX1NFUUlEIGVycm9yIGluIHRoZSBwYXJ0aWN1bGFyIGNhc2Ugb2YKKwkJICogZG9pbmcgYW4gT1BFTiwgd2UgYXNzdW1lIHRoYXQgbmZzNF9pbmNyZW1lbnRfc2VxaWQoKSB3aWxsCisJCSAqIGhhdmUgdW5oYXNoZWQgdGhlIG9sZCBzdGF0ZV9vd25lciBmb3IgdXMsIGFuZCB0aGF0IHdlIGNhbgorCQkgKiB0aGVyZWZvcmUgc2FmZWx5IHJldHJ5IHVzaW5nIGEgbmV3IG9uZS4gV2Ugc2hvdWxkIHN0aWxsIHdhcm4KKwkJICogdGhlIHVzZXIgdGhvdWdoLi4uCisJCSAqLworCQlpZiAoc3RhdHVzID09IC1ORlM0RVJSX0JBRF9TRVFJRCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTkZTOiB2NCBzZXJ2ZXIgcmV0dXJuZWQgYSBiYWQgc2VxdWVuY2UtaWQgZXJyb3IhXG4iKTsKKwkJCWV4Y2VwdGlvbi5yZXRyeSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlyZXMgPSBFUlJfUFRSKG5mczRfaGFuZGxlX2V4Y2VwdGlvbihORlNfU0VSVkVSKGRpciksCisJCQkJCXN0YXR1cywgJmV4Y2VwdGlvbikpOworCX0gd2hpbGUgKGV4Y2VwdGlvbi5yZXRyeSk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBfbmZzNF9kb19zZXRhdHRyKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyLAorICAgICAgICAgICAgICAgIHN0cnVjdCBuZnNfZmggKmZoYW5kbGUsIHN0cnVjdCBpYXR0ciAqc2F0dHIsCisgICAgICAgICAgICAgICAgc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlKQoreworICAgICAgICBzdHJ1Y3QgbmZzX3NldGF0dHJhcmdzICBhcmcgPSB7CisgICAgICAgICAgICAgICAgLmZoICAgICAgICAgICAgID0gZmhhbmRsZSwKKyAgICAgICAgICAgICAgICAuaWFwICAgICAgICAgICAgPSBzYXR0ciwKKwkJLnNlcnZlcgkJPSBzZXJ2ZXIsCisJCS5iaXRtYXNrID0gc2VydmVyLT5hdHRyX2JpdG1hc2ssCisgICAgICAgIH07CisgICAgICAgIHN0cnVjdCBuZnNfc2V0YXR0cnJlcyAgcmVzID0geworCQkuZmF0dHIJCT0gZmF0dHIsCisJCS5zZXJ2ZXIJCT0gc2VydmVyLAorICAgICAgICB9OworICAgICAgICBzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0geworICAgICAgICAgICAgICAgIC5ycGNfcHJvYyAgICAgICA9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9TRVRBVFRSXSwKKyAgICAgICAgICAgICAgICAucnBjX2FyZ3AgICAgICAgPSAmYXJnLAorICAgICAgICAgICAgICAgIC5ycGNfcmVzcCAgICAgICA9ICZyZXMsCisgICAgICAgIH07CisKKyAgICAgICAgZmF0dHItPnZhbGlkID0gMDsKKworCWlmIChzdGF0ZSAhPSBOVUxMKQorCQltc2cucnBjX2NyZWQgPSBzdGF0ZS0+b3duZXItPnNvX2NyZWQ7CisJaWYgKHNhdHRyLT5pYV92YWxpZCAmIEFUVFJfU0laRSkKKwkJbmZzNF9jb3B5X3N0YXRlaWQoJmFyZy5zdGF0ZWlkLCBzdGF0ZSwgTlVMTCk7CisJZWxzZQorCQltZW1jcHkoJmFyZy5zdGF0ZWlkLCAmemVyb19zdGF0ZWlkLCBzaXplb2YoYXJnLnN0YXRlaWQpKTsKKworCXJldHVybiBycGNfY2FsbF9zeW5jKHNlcnZlci0+Y2xpZW50LCAmbXNnLCAwKTsKK30KKworc3RhdGljIGludCBuZnM0X2RvX3NldGF0dHIoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIsCisgICAgICAgICAgICAgICAgc3RydWN0IG5mc19maCAqZmhhbmRsZSwgc3RydWN0IGlhdHRyICpzYXR0ciwKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IG5mczRfZXhjZXB0aW9uIGV4Y2VwdGlvbiA9IHsgfTsKKwlpbnQgZXJyOworCWRvIHsKKwkJZXJyID0gbmZzNF9oYW5kbGVfZXhjZXB0aW9uKHNlcnZlciwKKwkJCQlfbmZzNF9kb19zZXRhdHRyKHNlcnZlciwgZmF0dHIsIGZoYW5kbGUsIHNhdHRyLAorCQkJCQlzdGF0ZSksCisJCQkJJmV4Y2VwdGlvbik7CisJfSB3aGlsZSAoZXhjZXB0aW9uLnJldHJ5KTsKKwlyZXR1cm4gZXJyOworfQorCitzdHJ1Y3QgbmZzNF9jbG9zZWRhdGEgeworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlOworCXN0cnVjdCBuZnNfY2xvc2VhcmdzIGFyZzsKKwlzdHJ1Y3QgbmZzX2Nsb3NlcmVzIHJlczsKK307CisKK3N0YXRpYyB2b2lkIG5mczRfY2xvc2VfZG9uZShzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IG5mczRfY2xvc2VkYXRhICpjYWxsZGF0YSA9IChzdHJ1Y3QgbmZzNF9jbG9zZWRhdGEgKil0YXNrLT50a19jYWxsZGF0YTsKKwlzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUgPSBjYWxsZGF0YS0+c3RhdGU7CisJc3RydWN0IG5mczRfc3RhdGVfb3duZXIgKnNwID0gc3RhdGUtPm93bmVyOworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0VSVkVSKGNhbGxkYXRhLT5pbm9kZSk7CisKKyAgICAgICAgLyogaG1tLiB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBpbm9kZSwgYW5kIGluIHRoZSBwcm9jZXNzIG9mIGZyZWVpbmcKKwkgKiB0aGUgc3RhdGVfb3duZXIuIHdlIGtlZXAgdGhpcyBhcm91bmQgdG8gcHJvY2VzcyBlcnJvcnMKKwkgKi8KKwluZnM0X2luY3JlbWVudF9zZXFpZCh0YXNrLT50a19zdGF0dXMsIHNwKTsKKwlzd2l0Y2ggKHRhc2stPnRrX3N0YXR1cykgeworCQljYXNlIDA6CisJCQltZW1jcHkoJnN0YXRlLT5zdGF0ZWlkLCAmY2FsbGRhdGEtPnJlcy5zdGF0ZWlkLAorCQkJCQlzaXplb2Yoc3RhdGUtPnN0YXRlaWQpKTsKKwkJCWJyZWFrOworCQljYXNlIC1ORlM0RVJSX1NUQUxFX1NUQVRFSUQ6CisJCWNhc2UgLU5GUzRFUlJfRVhQSVJFRDoKKwkJCXN0YXRlLT5zdGF0ZSA9IGNhbGxkYXRhLT5hcmcub3Blbl9mbGFnczsKKwkJCW5mczRfc2NoZWR1bGVfc3RhdGVfcmVjb3Zlcnkoc2VydmVyLT5uZnM0X3N0YXRlKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKG5mczRfYXN5bmNfaGFuZGxlX2Vycm9yKHRhc2ssIHNlcnZlcikgPT0gLUVBR0FJTikgeworCQkJCXJwY19yZXN0YXJ0X2NhbGwodGFzayk7CisJCQkJcmV0dXJuOworCQkJfQorCX0KKwlzdGF0ZS0+c3RhdGUgPSBjYWxsZGF0YS0+YXJnLm9wZW5fZmxhZ3M7CisJbmZzNF9wdXRfb3Blbl9zdGF0ZShzdGF0ZSk7CisJdXAoJnNwLT5zb19zZW1hKTsKKwluZnM0X3B1dF9zdGF0ZV9vd25lcihzcCk7CisJdXBfcmVhZCgmc2VydmVyLT5uZnM0X3N0YXRlLT5jbF9zZW0pOworCWtmcmVlKGNhbGxkYXRhKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbmZzNF9jbG9zZV9jYWxsKHN0cnVjdCBycGNfY2xudCAqY2xudCwgc3RydWN0IG5mczRfY2xvc2VkYXRhICpjYWxsZGF0YSkKK3sKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0geworCQkucnBjX3Byb2MgPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfQ0xPU0VdLAorCQkucnBjX2FyZ3AgPSAmY2FsbGRhdGEtPmFyZywKKwkJLnJwY19yZXNwID0gJmNhbGxkYXRhLT5yZXMsCisJCS5ycGNfY3JlZCA9IGNhbGxkYXRhLT5zdGF0ZS0+b3duZXItPnNvX2NyZWQsCisJfTsKKwlpZiAoY2FsbGRhdGEtPmFyZy5vcGVuX2ZsYWdzICE9IDApCisJCW1zZy5ycGNfcHJvYyA9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9PUEVOX0RPV05HUkFERV07CisJcmV0dXJuIHJwY19jYWxsX2FzeW5jKGNsbnQsICZtc2csIDAsIG5mczRfY2xvc2VfZG9uZSwgY2FsbGRhdGEpOworfQorCisvKiAKKyAqIEl0IGlzIHBvc3NpYmxlIGZvciBkYXRhIHRvIGJlIHJlYWQvd3JpdHRlbiBmcm9tIGEgbWVtLW1hcHBlZCBmaWxlIAorICogYWZ0ZXIgdGhlIHN5c19jbG9zZSBjYWxsICh3aGljaCBoaXRzIHRoZSB2ZnMgbGF5ZXIgYXMgYSBmbHVzaCkuCisgKiBUaGlzIG1lYW5zIHRoYXQgd2UgY2FuJ3Qgc2FmZWx5IGNhbGwgbmZzdjQgY2xvc2Ugb24gYSBmaWxlIHVudGlsIAorICogdGhlIGlub2RlIGlzIGNsZWFyZWQuIFRoaXMgaW4gdHVybiBtZWFucyB0aGF0IHdlIGFyZSBub3QgZ29vZAorICogTkZTdjQgY2l0aXplbnMgLSB3ZSBkbyBub3QgaW5kaWNhdGUgdG8gdGhlIHNlcnZlciB0byB1cGRhdGUgdGhlIGZpbGUncyAKKyAqIHNoYXJlIHN0YXRlIGV2ZW4gd2hlbiB3ZSBhcmUgZG9uZSB3aXRoIG9uZSBvZiB0aGUgdGhyZWUgc2hhcmUgCisgKiBzdGF0ZWlkJ3MgaW4gdGhlIGlub2RlLgorICoKKyAqIE5PVEU6IENhbGxlciBtdXN0IGJlIGhvbGRpbmcgdGhlIHNwLT5zb19vd25lciBzZW1hcGhvcmUhCisgKi8KK2ludCBuZnM0X2RvX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwgbW9kZV90IG1vZGUpIAoreworCXN0cnVjdCBuZnM0X2Nsb3NlZGF0YSAqY2FsbGRhdGE7CisJaW50IHN0YXR1czsKKworCS8qIFRlbGwgY2FsbGVyIHdlJ3JlIGRvbmUgKi8KKwlpZiAodGVzdF9iaXQoTkZTX0RFTEVHQVRFRF9TVEFURSwgJnN0YXRlLT5mbGFncykpIHsKKwkJc3RhdGUtPnN0YXRlID0gbW9kZTsKKwkJcmV0dXJuIDA7CisJfQorCWNhbGxkYXRhID0gKHN0cnVjdCBuZnM0X2Nsb3NlZGF0YSAqKWttYWxsb2Moc2l6ZW9mKCpjYWxsZGF0YSksIEdGUF9LRVJORUwpOworCWlmIChjYWxsZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwljYWxsZGF0YS0+aW5vZGUgPSBpbm9kZTsKKwljYWxsZGF0YS0+c3RhdGUgPSBzdGF0ZTsKKwljYWxsZGF0YS0+YXJnLmZoID0gTkZTX0ZIKGlub2RlKTsKKwkvKiBTZXJpYWxpemF0aW9uIGZvciB0aGUgc2VxdWVuY2UgaWQgKi8KKwljYWxsZGF0YS0+YXJnLnNlcWlkID0gc3RhdGUtPm93bmVyLT5zb19zZXFpZDsKKwljYWxsZGF0YS0+YXJnLm9wZW5fZmxhZ3MgPSBtb2RlOworCW1lbWNweSgmY2FsbGRhdGEtPmFyZy5zdGF0ZWlkLCAmc3RhdGUtPnN0YXRlaWQsCisJCQlzaXplb2YoY2FsbGRhdGEtPmFyZy5zdGF0ZWlkKSk7CisJc3RhdHVzID0gbmZzNF9jbG9zZV9jYWxsKE5GU19TRVJWRVIoaW5vZGUpLT5jbGllbnQsIGNhbGxkYXRhKTsKKwkvKgorCSAqIFJldHVybiAtRUlOUFJPR1JFU1Mgb24gc3VjY2VzcyBpbiBvcmRlciB0byBpbmRpY2F0ZSB0byB0aGUKKwkgKiBjYWxsZXIgdGhhdCBhbiBhc3luY2hyb25vdXMgUlBDIGNhbGwgaGFzIGJlZW4gbGF1bmNoZWQsIGFuZAorCSAqIHRoYXQgaXQgd2lsbCByZWxlYXNlIHRoZSBzZW1hcGhvcmVzIG9uIGNvbXBsZXRpb24uCisJICovCisJcmV0dXJuIChzdGF0dXMgPT0gMCkgPyAtRUlOUFJPR1JFU1MgOiBzdGF0dXM7Cit9CisKK3N0cnVjdCBpbm9kZSAqCituZnM0X2F0b21pY19vcGVuKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpYXR0ciBhdHRyOworCXN0cnVjdCBycGNfY3JlZCAqY3JlZDsKKwlzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGU7CisKKwlpZiAobmQtPmZsYWdzICYgTE9PS1VQX0NSRUFURSkgeworCQlhdHRyLmlhX21vZGUgPSBuZC0+aW50ZW50Lm9wZW4uY3JlYXRlX21vZGU7CisJCWF0dHIuaWFfdmFsaWQgPSBBVFRSX01PREU7CisJCWlmICghSVNfUE9TSVhBQ0woZGlyKSkKKwkJCWF0dHIuaWFfbW9kZSAmPSB+Y3VycmVudC0+ZnMtPnVtYXNrOworCX0gZWxzZSB7CisJCWF0dHIuaWFfdmFsaWQgPSAwOworCQlCVUdfT04obmQtPmludGVudC5vcGVuLmZsYWdzICYgT19DUkVBVCk7CisJfQorCisJY3JlZCA9IHJwY2F1dGhfbG9va3VwY3JlZChORlNfU0VSVkVSKGRpciktPmNsaWVudC0+Y2xfYXV0aCwgMCk7CisJaWYgKElTX0VSUihjcmVkKSkKKwkJcmV0dXJuIChzdHJ1Y3QgaW5vZGUgKiljcmVkOworCXN0YXRlID0gbmZzNF9kb19vcGVuKGRpciwgZGVudHJ5LCBuZC0+aW50ZW50Lm9wZW4uZmxhZ3MsICZhdHRyLCBjcmVkKTsKKwlwdXRfcnBjY3JlZChjcmVkKTsKKwlpZiAoSVNfRVJSKHN0YXRlKSkKKwkJcmV0dXJuIChzdHJ1Y3QgaW5vZGUgKilzdGF0ZTsKKwlyZXR1cm4gc3RhdGUtPmlub2RlOworfQorCitpbnQKK25mczRfb3Blbl9yZXZhbGlkYXRlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBvcGVuZmxhZ3MpCit7CisJc3RydWN0IHJwY19jcmVkICpjcmVkOworCXN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJY3JlZCA9IHJwY2F1dGhfbG9va3VwY3JlZChORlNfU0VSVkVSKGRpciktPmNsaWVudC0+Y2xfYXV0aCwgMCk7CisJaWYgKElTX0VSUihjcmVkKSkKKwkJcmV0dXJuIFBUUl9FUlIoY3JlZCk7CisJc3RhdGUgPSBuZnM0X29wZW5fZGVsZWdhdGVkKGRlbnRyeS0+ZF9pbm9kZSwgb3BlbmZsYWdzLCBjcmVkKTsKKwlpZiAoSVNfRVJSKHN0YXRlKSkKKwkJc3RhdGUgPSBuZnM0X2RvX29wZW4oZGlyLCBkZW50cnksIG9wZW5mbGFncywgTlVMTCwgY3JlZCk7CisJcHV0X3JwY2NyZWQoY3JlZCk7CisJaWYgKHN0YXRlID09IEVSUl9QVFIoLUVOT0VOVCkgJiYgZGVudHJ5LT5kX2lub2RlID09IDApCisJCXJldHVybiAxOworCWlmIChJU19FUlIoc3RhdGUpKQorCQlyZXR1cm4gMDsKKwlpbm9kZSA9IHN0YXRlLT5pbm9kZTsKKwlpZiAoaW5vZGUgPT0gZGVudHJ5LT5kX2lub2RlKSB7CisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gMTsKKwl9CisJZF9kcm9wKGRlbnRyeSk7CisJbmZzNF9jbG9zZV9zdGF0ZShzdGF0ZSwgb3BlbmZsYWdzKTsKKwlpcHV0KGlub2RlKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IF9uZnM0X3NlcnZlcl9jYXBhYmlsaXRpZXMoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgc3RydWN0IG5mc19maCAqZmhhbmRsZSkKK3sKKwlzdHJ1Y3QgbmZzNF9zZXJ2ZXJfY2Fwc19yZXMgcmVzID0ge307CisJc3RydWN0IHJwY19tZXNzYWdlIG1zZyA9IHsKKwkJLnJwY19wcm9jID0gJm5mczRfcHJvY2VkdXJlc1tORlNQUk9DNF9DTE5UX1NFUlZFUl9DQVBTXSwKKwkJLnJwY19hcmdwID0gZmhhbmRsZSwKKwkJLnJwY19yZXNwID0gJnJlcywKKwl9OworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBycGNfY2FsbF9zeW5jKHNlcnZlci0+Y2xpZW50LCAmbXNnLCAwKTsKKwlpZiAoc3RhdHVzID09IDApIHsKKwkJbWVtY3B5KHNlcnZlci0+YXR0cl9iaXRtYXNrLCByZXMuYXR0cl9iaXRtYXNrLCBzaXplb2Yoc2VydmVyLT5hdHRyX2JpdG1hc2spKTsKKwkJaWYgKHJlcy5hdHRyX2JpdG1hc2tbMF0gJiBGQVRUUjRfV09SRDBfQUNMKQorCQkJc2VydmVyLT5jYXBzIHw9IE5GU19DQVBfQUNMUzsKKwkJaWYgKHJlcy5oYXNfbGlua3MgIT0gMCkKKwkJCXNlcnZlci0+Y2FwcyB8PSBORlNfQ0FQX0hBUkRMSU5LUzsKKwkJaWYgKHJlcy5oYXNfc3ltbGlua3MgIT0gMCkKKwkJCXNlcnZlci0+Y2FwcyB8PSBORlNfQ0FQX1NZTUxJTktTOworCQlzZXJ2ZXItPmFjbF9iaXRtYXNrID0gcmVzLmFjbF9iaXRtYXNrOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IG5mczRfc2VydmVyX2NhcGFiaWxpdGllcyhzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlKQoreworCXN0cnVjdCBuZnM0X2V4Y2VwdGlvbiBleGNlcHRpb24gPSB7IH07CisJaW50IGVycjsKKwlkbyB7CisJCWVyciA9IG5mczRfaGFuZGxlX2V4Y2VwdGlvbihzZXJ2ZXIsCisJCQkJX25mczRfc2VydmVyX2NhcGFiaWxpdGllcyhzZXJ2ZXIsIGZoYW5kbGUpLAorCQkJCSZleGNlcHRpb24pOworCX0gd2hpbGUgKGV4Y2VwdGlvbi5yZXRyeSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfbmZzNF9sb29rdXBfcm9vdChzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlLAorCQlzdHJ1Y3QgbmZzX2ZzaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgbmZzX2ZhdHRyICoJZmF0dHIgPSBpbmZvLT5mYXR0cjsKKwlzdHJ1Y3QgbmZzNF9sb29rdXBfcm9vdF9hcmcgYXJncyA9IHsKKwkJLmJpdG1hc2sgPSBuZnM0X2ZhdHRyX2JpdG1hcCwKKwl9OworCXN0cnVjdCBuZnM0X2xvb2t1cF9yZXMgcmVzID0geworCQkuc2VydmVyID0gc2VydmVyLAorCQkuZmF0dHIgPSBmYXR0ciwKKwkJLmZoID0gZmhhbmRsZSwKKwl9OworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfcHJvYyA9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9MT09LVVBfUk9PVF0sCisJCS5ycGNfYXJncCA9ICZhcmdzLAorCQkucnBjX3Jlc3AgPSAmcmVzLAorCX07CisJZmF0dHItPnZhbGlkID0gMDsKKwlyZXR1cm4gcnBjX2NhbGxfc3luYyhzZXJ2ZXItPmNsaWVudCwgJm1zZywgMCk7Cit9CisKK3N0YXRpYyBpbnQgbmZzNF9sb29rdXBfcm9vdChzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlLAorCQlzdHJ1Y3QgbmZzX2ZzaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgbmZzNF9leGNlcHRpb24gZXhjZXB0aW9uID0geyB9OworCWludCBlcnI7CisJZG8geworCQllcnIgPSBuZnM0X2hhbmRsZV9leGNlcHRpb24oc2VydmVyLAorCQkJCV9uZnM0X2xvb2t1cF9yb290KHNlcnZlciwgZmhhbmRsZSwgaW5mbyksCisJCQkJJmV4Y2VwdGlvbik7CisJfSB3aGlsZSAoZXhjZXB0aW9uLnJldHJ5KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG5mczRfcHJvY19nZXRfcm9vdChzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlLAorCQlzdHJ1Y3QgbmZzX2ZzaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgbmZzX2ZhdHRyICoJZmF0dHIgPSBpbmZvLT5mYXR0cjsKKwl1bnNpZ25lZCBjaGFyICoJCXA7CisJc3RydWN0IHFzdHIJCXE7CisJc3RydWN0IG5mczRfbG9va3VwX2FyZyBhcmdzID0geworCQkuZGlyX2ZoID0gZmhhbmRsZSwKKwkJLm5hbWUgPSAmcSwKKwkJLmJpdG1hc2sgPSBuZnM0X2ZhdHRyX2JpdG1hcCwKKwl9OworCXN0cnVjdCBuZnM0X2xvb2t1cF9yZXMgcmVzID0geworCQkuc2VydmVyID0gc2VydmVyLAorCQkuZmF0dHIgPSBmYXR0ciwKKwkJLmZoID0gZmhhbmRsZSwKKwl9OworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfcHJvYyA9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9MT09LVVBdLAorCQkucnBjX2FyZ3AgPSAmYXJncywKKwkJLnJwY19yZXNwID0gJnJlcywKKwl9OworCWludCBzdGF0dXM7CisKKwkvKgorCSAqIE5vdyB3ZSBkbyBhIHNlcGFyYXRlIExPT0tVUCBmb3IgZWFjaCBjb21wb25lbnQgb2YgdGhlIG1vdW50IHBhdGguCisJICogVGhlIExPT0tVUHMgYXJlIGRvbmUgc2VwYXJhdGVseSBzbyB0aGF0IHdlIGNhbiBjb252ZW5pZW50bHkKKwkgKiBjYXRjaCBhbiBFUlJfV1JPTkdTRUMgaWYgaXQgb2NjdXJzIGFsb25nIHRoZSB3YXkuLi4KKwkgKi8KKwlzdGF0dXMgPSBuZnM0X2xvb2t1cF9yb290KHNlcnZlciwgZmhhbmRsZSwgaW5mbyk7CisJaWYgKHN0YXR1cykKKwkJZ290byBvdXQ7CisKKwlwID0gc2VydmVyLT5tbnRfcGF0aDsKKwlmb3IgKDs7KSB7CisJCXN0cnVjdCBuZnM0X2V4Y2VwdGlvbiBleGNlcHRpb24gPSB7IH07CisKKwkJd2hpbGUgKCpwID09ICcvJykKKwkJCXArKzsKKwkJaWYgKCEqcCkKKwkJCWJyZWFrOworCQlxLm5hbWUgPSBwOworCQl3aGlsZSAoKnAgJiYgKCpwICE9ICcvJykpCisJCQlwKys7CisJCXEubGVuID0gcCAtIHEubmFtZTsKKworCQlkbyB7CisJCQlmYXR0ci0+dmFsaWQgPSAwOworCQkJc3RhdHVzID0gbmZzNF9oYW5kbGVfZXhjZXB0aW9uKHNlcnZlciwKKwkJCQkJcnBjX2NhbGxfc3luYyhzZXJ2ZXItPmNsaWVudCwgJm1zZywgMCksCisJCQkJCSZleGNlcHRpb24pOworCQl9IHdoaWxlIChleGNlcHRpb24ucmV0cnkpOworCQlpZiAoc3RhdHVzID09IDApCisJCQljb250aW51ZTsKKwkJaWYgKHN0YXR1cyA9PSAtRU5PRU5UKSB7CisJCQlwcmludGsoS0VSTl9OT1RJQ0UgIk5GUzogbW91bnQgcGF0aCAlcyBkb2VzIG5vdCBleGlzdCFcbiIsIHNlcnZlci0+bW50X3BhdGgpOworCQkJcHJpbnRrKEtFUk5fTk9USUNFICJORlM6IHN1Z2dlc3Rpb246IHRyeSBtb3VudGluZyAnLycgaW5zdGVhZC5cbiIpOworCQl9CisJCWJyZWFrOworCX0KKwlpZiAoc3RhdHVzID09IDApCisJCXN0YXR1cyA9IG5mczRfc2VydmVyX2NhcGFiaWxpdGllcyhzZXJ2ZXIsIGZoYW5kbGUpOworCWlmIChzdGF0dXMgPT0gMCkKKwkJc3RhdHVzID0gbmZzNF9kb19mc2luZm8oc2VydmVyLCBmaGFuZGxlLCBpbmZvKTsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IF9uZnM0X3Byb2NfZ2V0YXR0cihzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK3sKKwlzdHJ1Y3QgbmZzNF9nZXRhdHRyX2FyZyBhcmdzID0geworCQkuZmggPSBmaGFuZGxlLAorCQkuYml0bWFzayA9IHNlcnZlci0+YXR0cl9iaXRtYXNrLAorCX07CisJc3RydWN0IG5mczRfZ2V0YXR0cl9yZXMgcmVzID0geworCQkuZmF0dHIgPSBmYXR0ciwKKwkJLnNlcnZlciA9IHNlcnZlciwKKwl9OworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfcHJvYyA9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9HRVRBVFRSXSwKKwkJLnJwY19hcmdwID0gJmFyZ3MsCisJCS5ycGNfcmVzcCA9ICZyZXMsCisJfTsKKwkKKwlmYXR0ci0+dmFsaWQgPSAwOworCXJldHVybiBycGNfY2FsbF9zeW5jKHNlcnZlci0+Y2xpZW50LCAmbXNnLCAwKTsKK30KKworc3RhdGljIGludCBuZnM0X3Byb2NfZ2V0YXR0cihzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlLCBzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK3sKKwlzdHJ1Y3QgbmZzNF9leGNlcHRpb24gZXhjZXB0aW9uID0geyB9OworCWludCBlcnI7CisJZG8geworCQllcnIgPSBuZnM0X2hhbmRsZV9leGNlcHRpb24oc2VydmVyLAorCQkJCV9uZnM0X3Byb2NfZ2V0YXR0cihzZXJ2ZXIsIGZoYW5kbGUsIGZhdHRyKSwKKwkJCQkmZXhjZXB0aW9uKTsKKwl9IHdoaWxlIChleGNlcHRpb24ucmV0cnkpOworCXJldHVybiBlcnI7Cit9CisKKy8qIAorICogVGhlIGZpbGUgaXMgbm90IGNsb3NlZCBpZiBpdCBpcyBvcGVuZWQgZHVlIHRvIHRoZSBhIHJlcXVlc3QgdG8gY2hhbmdlCisgKiB0aGUgc2l6ZSBvZiB0aGUgZmlsZS4gVGhlIG9wZW4gY2FsbCB3aWxsIG5vdCBiZSBuZWVkZWQgb25jZSB0aGUKKyAqIFZGUyBsYXllciBsb29rdXAtaW50ZW50cyBhcmUgaW1wbGVtZW50ZWQuCisgKgorICogQ2xvc2UgaXMgY2FsbGVkIHdoZW4gdGhlIGlub2RlIGlzIGRlc3Ryb3llZC4KKyAqIElmIHdlIGhhdmVuJ3Qgb3BlbmVkIHRoZSBmaWxlIGZvciBPX1dST05MWSwgd2UKKyAqIG5lZWQgdG8gaW4gdGhlIHNpemVfY2hhbmdlIGNhc2UgdG8gb2J0YWluIGEgc3RhdGVpZC4KKyAqCisgKiBHb3QgcmFjZT8KKyAqIEJlY2F1c2UgT1BFTiBpcyBhbHdheXMgZG9uZSBieSBuYW1lIGluIG5mc3Y0LCBpdCBpcworICogcG9zc2libGUgdGhhdCB3ZSBvcGVuZWQgYSBkaWZmZXJlbnQgZmlsZSBieSB0aGUgc2FtZQorICogbmFtZS4gIFdlIGNhbiByZWNvZ25pemUgdGhpcyByYWNlIGNvbmRpdGlvbiwgYnV0IHdlCisgKiBjYW4ndCBkbyBhbnl0aGluZyBhYm91dCBpdCBiZXNpZGVzIHJldHVybmluZyBhbiBlcnJvci4KKyAqCisgKiBUaGlzIHdpbGwgYmUgZml4ZWQgd2l0aCBWRlMgY2hhbmdlcyAobG9va3VwLWludGVudCkuCisgKi8KK3N0YXRpYyBpbnQKK25mczRfcHJvY19zZXRhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIsCisJCSAgc3RydWN0IGlhdHRyICpzYXR0cikKK3sKKwlzdHJ1Y3QgaW5vZGUgKgkJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50CQkJc2l6ZV9jaGFuZ2UgPSBzYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1NJWkU7CisJc3RydWN0IG5mczRfc3RhdGUJKnN0YXRlID0gTlVMTDsKKwlpbnQgbmVlZF9pcHV0ID0gMDsKKwlpbnQgc3RhdHVzOworCisJZmF0dHItPnZhbGlkID0gMDsKKwkKKwlpZiAoc2l6ZV9jaGFuZ2UpIHsKKwkJc3RydWN0IHJwY19jcmVkICpjcmVkID0gcnBjYXV0aF9sb29rdXBjcmVkKE5GU19TRVJWRVIoaW5vZGUpLT5jbGllbnQtPmNsX2F1dGgsIDApOworCQlpZiAoSVNfRVJSKGNyZWQpKQorCQkJcmV0dXJuIFBUUl9FUlIoY3JlZCk7CisJCXN0YXRlID0gbmZzNF9maW5kX3N0YXRlKGlub2RlLCBjcmVkLCBGTU9ERV9XUklURSk7CisJCWlmIChzdGF0ZSA9PSBOVUxMKSB7CisJCQlzdGF0ZSA9IG5mczRfb3Blbl9kZWxlZ2F0ZWQoZGVudHJ5LT5kX2lub2RlLAorCQkJCQlGTU9ERV9XUklURSwgY3JlZCk7CisJCQlpZiAoSVNfRVJSKHN0YXRlKSkKKwkJCQlzdGF0ZSA9IG5mczRfZG9fb3BlbihkZW50cnktPmRfcGFyZW50LT5kX2lub2RlLAorCQkJCQkJZGVudHJ5LCBGTU9ERV9XUklURSwKKwkJCQkJCU5VTEwsIGNyZWQpOworCQkJbmVlZF9pcHV0ID0gMTsKKwkJfQorCQlwdXRfcnBjY3JlZChjcmVkKTsKKwkJaWYgKElTX0VSUihzdGF0ZSkpCisJCQlyZXR1cm4gUFRSX0VSUihzdGF0ZSk7CisKKwkJaWYgKHN0YXRlLT5pbm9kZSAhPSBpbm9kZSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibmZzOiByYWNlZCBpbiBzZXRhdHRyICglcCAhPSAlcCksIHJldHVybmluZyAtRUlPXG4iLCBpbm9kZSwgc3RhdGUtPmlub2RlKTsKKwkJCXN0YXR1cyA9IC1FSU87CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwlzdGF0dXMgPSBuZnM0X2RvX3NldGF0dHIoTkZTX1NFUlZFUihpbm9kZSksIGZhdHRyLAorCQkJTkZTX0ZIKGlub2RlKSwgc2F0dHIsIHN0YXRlKTsKK291dDoKKwlpZiAoc3RhdGUpIHsKKwkJaW5vZGUgPSBzdGF0ZS0+aW5vZGU7CisJCW5mczRfY2xvc2Vfc3RhdGUoc3RhdGUsIEZNT0RFX1dSSVRFKTsKKwkJaWYgKG5lZWRfaXB1dCkKKwkJCWlwdXQoaW5vZGUpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IF9uZnM0X3Byb2NfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgcXN0ciAqbmFtZSwKKwkJc3RydWN0IG5mc19maCAqZmhhbmRsZSwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCit7CisJaW50CQkgICAgICAgc3RhdHVzOworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0VSVkVSKGRpcik7CisJc3RydWN0IG5mczRfbG9va3VwX2FyZyBhcmdzID0geworCQkuYml0bWFzayA9IHNlcnZlci0+YXR0cl9iaXRtYXNrLAorCQkuZGlyX2ZoID0gTkZTX0ZIKGRpciksCisJCS5uYW1lID0gbmFtZSwKKwl9OworCXN0cnVjdCBuZnM0X2xvb2t1cF9yZXMgcmVzID0geworCQkuc2VydmVyID0gc2VydmVyLAorCQkuZmF0dHIgPSBmYXR0ciwKKwkJLmZoID0gZmhhbmRsZSwKKwl9OworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfcHJvYyA9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9MT09LVVBdLAorCQkucnBjX2FyZ3AgPSAmYXJncywKKwkJLnJwY19yZXNwID0gJnJlcywKKwl9OworCQorCWZhdHRyLT52YWxpZCA9IDA7CisJCisJZHByaW50aygiTkZTIGNhbGwgIGxvb2t1cCAlc1xuIiwgbmFtZS0+bmFtZSk7CisJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhORlNfQ0xJRU5UKGRpciksICZtc2csIDApOworCWRwcmludGsoIk5GUyByZXBseSBsb29rdXA6ICVkXG4iLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgbmZzNF9wcm9jX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHFzdHIgKm5hbWUsIHN0cnVjdCBuZnNfZmggKmZoYW5kbGUsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQoreworCXN0cnVjdCBuZnM0X2V4Y2VwdGlvbiBleGNlcHRpb24gPSB7IH07CisJaW50IGVycjsKKwlkbyB7CisJCWVyciA9IG5mczRfaGFuZGxlX2V4Y2VwdGlvbihORlNfU0VSVkVSKGRpciksCisJCQkJX25mczRfcHJvY19sb29rdXAoZGlyLCBuYW1lLCBmaGFuZGxlLCBmYXR0ciksCisJCQkJJmV4Y2VwdGlvbik7CisJfSB3aGlsZSAoZXhjZXB0aW9uLnJldHJ5KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9uZnM0X3Byb2NfYWNjZXNzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBuZnNfYWNjZXNzX2VudHJ5ICplbnRyeSkKK3sKKwlzdHJ1Y3QgbmZzNF9hY2Nlc3NhcmdzIGFyZ3MgPSB7CisJCS5maCA9IE5GU19GSChpbm9kZSksCisJfTsKKwlzdHJ1Y3QgbmZzNF9hY2Nlc3NyZXMgcmVzID0geyAwIH07CisJc3RydWN0IHJwY19tZXNzYWdlIG1zZyA9IHsKKwkJLnJwY19wcm9jID0gJm5mczRfcHJvY2VkdXJlc1tORlNQUk9DNF9DTE5UX0FDQ0VTU10sCisJCS5ycGNfYXJncCA9ICZhcmdzLAorCQkucnBjX3Jlc3AgPSAmcmVzLAorCQkucnBjX2NyZWQgPSBlbnRyeS0+Y3JlZCwKKwl9OworCWludCBtb2RlID0gZW50cnktPm1hc2s7CisJaW50IHN0YXR1czsKKworCS8qCisJICogRGV0ZXJtaW5lIHdoaWNoIGFjY2VzcyBiaXRzIHdlIHdhbnQgdG8gYXNrIGZvci4uLgorCSAqLworCWlmIChtb2RlICYgTUFZX1JFQUQpCisJCWFyZ3MuYWNjZXNzIHw9IE5GUzRfQUNDRVNTX1JFQUQ7CisJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaWYgKG1vZGUgJiBNQVlfV1JJVEUpCisJCQlhcmdzLmFjY2VzcyB8PSBORlM0X0FDQ0VTU19NT0RJRlkgfCBORlM0X0FDQ0VTU19FWFRFTkQgfCBORlM0X0FDQ0VTU19ERUxFVEU7CisJCWlmIChtb2RlICYgTUFZX0VYRUMpCisJCQlhcmdzLmFjY2VzcyB8PSBORlM0X0FDQ0VTU19MT09LVVA7CisJfSBlbHNlIHsKKwkJaWYgKG1vZGUgJiBNQVlfV1JJVEUpCisJCQlhcmdzLmFjY2VzcyB8PSBORlM0X0FDQ0VTU19NT0RJRlkgfCBORlM0X0FDQ0VTU19FWFRFTkQ7CisJCWlmIChtb2RlICYgTUFZX0VYRUMpCisJCQlhcmdzLmFjY2VzcyB8PSBORlM0X0FDQ0VTU19FWEVDVVRFOworCX0KKwlzdGF0dXMgPSBycGNfY2FsbF9zeW5jKE5GU19DTElFTlQoaW5vZGUpLCAmbXNnLCAwKTsKKwlpZiAoIXN0YXR1cykgeworCQllbnRyeS0+bWFzayA9IDA7CisJCWlmIChyZXMuYWNjZXNzICYgTkZTNF9BQ0NFU1NfUkVBRCkKKwkJCWVudHJ5LT5tYXNrIHw9IE1BWV9SRUFEOworCQlpZiAocmVzLmFjY2VzcyAmIChORlM0X0FDQ0VTU19NT0RJRlkgfCBORlM0X0FDQ0VTU19FWFRFTkQgfCBORlM0X0FDQ0VTU19ERUxFVEUpKQorCQkJZW50cnktPm1hc2sgfD0gTUFZX1dSSVRFOworCQlpZiAocmVzLmFjY2VzcyAmIChORlM0X0FDQ0VTU19MT09LVVB8TkZTNF9BQ0NFU1NfRVhFQ1VURSkpCisJCQllbnRyeS0+bWFzayB8PSBNQVlfRVhFQzsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBuZnM0X3Byb2NfYWNjZXNzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBuZnNfYWNjZXNzX2VudHJ5ICplbnRyeSkKK3sKKwlzdHJ1Y3QgbmZzNF9leGNlcHRpb24gZXhjZXB0aW9uID0geyB9OworCWludCBlcnI7CisJZG8geworCQllcnIgPSBuZnM0X2hhbmRsZV9leGNlcHRpb24oTkZTX1NFUlZFUihpbm9kZSksCisJCQkJX25mczRfcHJvY19hY2Nlc3MoaW5vZGUsIGVudHJ5KSwKKwkJCQkmZXhjZXB0aW9uKTsKKwl9IHdoaWxlIChleGNlcHRpb24ucmV0cnkpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBUT0RPOiBGb3IgdGhlIHRpbWUgYmVpbmcsIHdlIGRvbid0IHRyeSB0byBnZXQgYW55IGF0dHJpYnV0ZXMKKyAqIGFsb25nIHdpdGggYW55IG9mIHRoZSB6ZXJvLWNvcHkgb3BlcmF0aW9ucyBSRUFELCBSRUFERElSLAorICogUkVBRExJTkssIFdSSVRFLgorICoKKyAqIEluIHRoZSBjYXNlIG9mIHRoZSBmaXJzdCB0aHJlZSwgd2Ugd2FudCB0byBwdXQgdGhlIEdFVEFUVFIKKyAqIGFmdGVyIHRoZSByZWFkLXR5cGUgb3BlcmF0aW9uIC0tIHRoaXMgaXMgYmVjYXVzZSBpdCBpcyBoYXJkCisgKiB0byBwcmVkaWN0IHRoZSBsZW5ndGggb2YgYSBHRVRBVFRSIHJlc3BvbnNlIGluIHY0LCBhbmQgdGh1cworICogYWxpZ24gdGhlIFJFQUQgZGF0YSBjb3JyZWN0bHkuICBUaGlzIG1lYW5zIHRoYXQgdGhlIEdFVEFUVFIKKyAqIG1heSBlbmQgdXAgcGFydGlhbGx5IGZhbGxpbmcgaW50byB0aGUgcGFnZSBjYWNoZSwgYW5kIHdlIHNob3VsZAorICogc2hpZnQgaXQgaW50byB0aGUgJ3RhaWwnIG9mIHRoZSB4ZHJfYnVmIGJlZm9yZSBwcm9jZXNzaW5nLgorICogVG8gZG8gdGhpcyBlZmZpY2llbnRseSwgd2UgbmVlZCB0byBrbm93IHRoZSB0b3RhbCBsZW5ndGgKKyAqIG9mIGRhdGEgcmVjZWl2ZWQsIHdoaWNoIGRvZXNuJ3Qgc2VlbSB0byBiZSBhdmFpbGFibGUgb3V0c2lkZQorICogb2YgdGhlIFJQQyBsYXllci4KKyAqCisgKiBJbiB0aGUgY2FzZSBvZiBXUklURSwgd2UgYWxzbyB3YW50IHRvIHB1dCB0aGUgR0VUQVRUUiBhZnRlcgorICogdGhlIG9wZXJhdGlvbiAtLSBpbiB0aGlzIGNhc2UgYmVjYXVzZSB3ZSB3YW50IHRvIG1ha2Ugc3VyZQorICogd2UgZ2V0IHRoZSBwb3N0LW9wZXJhdGlvbiBtdGltZSBhbmQgc2l6ZS4gIFRoaXMgbWVhbnMgdGhhdAorICogd2UgY2FuJ3QgdXNlIHhkcl9lbmNvZGVfcGFnZXMoKSBhcyB3cml0dGVuOiB3ZSBuZWVkIGEgdmFyaWFudAorICogb2YgaXQgd2hpY2ggd291bGQgbGVhdmUgcm9vbSBpbiB0aGUgJ3RhaWwnIGlvdmVjLgorICoKKyAqIEJvdGggb2YgdGhlc2UgY2hhbmdlcyB0byB0aGUgWERSIGxheWVyIHdvdWxkIGluIGZhY3QgYmUgcXVpdGUKKyAqIG1pbm9yLCBidXQgSSBkZWNpZGVkIHRvIGxlYXZlIHRoZW0gZm9yIGEgc3Vic2VxdWVudCBwYXRjaC4KKyAqLworc3RhdGljIGludCBfbmZzNF9wcm9jX3JlYWRsaW5rKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlICpwYWdlLAorCQl1bnNpZ25lZCBpbnQgcGdiYXNlLCB1bnNpZ25lZCBpbnQgcGdsZW4pCit7CisJc3RydWN0IG5mczRfcmVhZGxpbmsgYXJncyA9IHsKKwkJLmZoICAgICAgID0gTkZTX0ZIKGlub2RlKSwKKwkJLnBnYmFzZQkgID0gcGdiYXNlLAorCQkucGdsZW4gICAgPSBwZ2xlbiwKKwkJLnBhZ2VzICAgID0gJnBhZ2UsCisJfTsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0geworCQkucnBjX3Byb2MgPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfUkVBRExJTktdLAorCQkucnBjX2FyZ3AgPSAmYXJncywKKwkJLnJwY19yZXNwID0gTlVMTCwKKwl9OworCisJcmV0dXJuIHJwY19jYWxsX3N5bmMoTkZTX0NMSUVOVChpbm9kZSksICZtc2csIDApOworfQorCitzdGF0aWMgaW50IG5mczRfcHJvY19yZWFkbGluayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJdW5zaWduZWQgaW50IHBnYmFzZSwgdW5zaWduZWQgaW50IHBnbGVuKQoreworCXN0cnVjdCBuZnM0X2V4Y2VwdGlvbiBleGNlcHRpb24gPSB7IH07CisJaW50IGVycjsKKwlkbyB7CisJCWVyciA9IG5mczRfaGFuZGxlX2V4Y2VwdGlvbihORlNfU0VSVkVSKGlub2RlKSwKKwkJCQlfbmZzNF9wcm9jX3JlYWRsaW5rKGlub2RlLCBwYWdlLCBwZ2Jhc2UsIHBnbGVuKSwKKwkJCQkmZXhjZXB0aW9uKTsKKwl9IHdoaWxlIChleGNlcHRpb24ucmV0cnkpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX25mczRfcHJvY19yZWFkKHN0cnVjdCBuZnNfcmVhZF9kYXRhICpyZGF0YSkKK3sKKwlpbnQgZmxhZ3MgPSByZGF0YS0+ZmxhZ3M7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHJkYXRhLT5pbm9kZTsKKwlzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0ciA9IHJkYXRhLT5yZXMuZmF0dHI7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IE5GU19TRVJWRVIoaW5vZGUpOworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfcHJvYwk9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9SRUFEXSwKKwkJLnJwY19hcmdwCT0gJnJkYXRhLT5hcmdzLAorCQkucnBjX3Jlc3AJPSAmcmRhdGEtPnJlcywKKwkJLnJwY19jcmVkCT0gcmRhdGEtPmNyZWQsCisJfTsKKwl1bnNpZ25lZCBsb25nIHRpbWVzdGFtcCA9IGppZmZpZXM7CisJaW50IHN0YXR1czsKKworCWRwcmludGsoIk5GUyBjYWxsICByZWFkICVkIEAgJUxkXG4iLCByZGF0YS0+YXJncy5jb3VudCwKKwkJCShsb25nIGxvbmcpIHJkYXRhLT5hcmdzLm9mZnNldCk7CisKKwlmYXR0ci0+dmFsaWQgPSAwOworCXN0YXR1cyA9IHJwY19jYWxsX3N5bmMoc2VydmVyLT5jbGllbnQsICZtc2csIGZsYWdzKTsKKwlpZiAoIXN0YXR1cykKKwkJcmVuZXdfbGVhc2Uoc2VydmVyLCB0aW1lc3RhbXApOworCWRwcmludGsoIk5GUyByZXBseSByZWFkOiAlZFxuIiwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IG5mczRfcHJvY19yZWFkKHN0cnVjdCBuZnNfcmVhZF9kYXRhICpyZGF0YSkKK3sKKwlzdHJ1Y3QgbmZzNF9leGNlcHRpb24gZXhjZXB0aW9uID0geyB9OworCWludCBlcnI7CisJZG8geworCQllcnIgPSBuZnM0X2hhbmRsZV9leGNlcHRpb24oTkZTX1NFUlZFUihyZGF0YS0+aW5vZGUpLAorCQkJCV9uZnM0X3Byb2NfcmVhZChyZGF0YSksCisJCQkJJmV4Y2VwdGlvbik7CisJfSB3aGlsZSAoZXhjZXB0aW9uLnJldHJ5KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9uZnM0X3Byb2Nfd3JpdGUoc3RydWN0IG5mc193cml0ZV9kYXRhICp3ZGF0YSkKK3sKKwlpbnQgcnBjZmxhZ3MgPSB3ZGF0YS0+ZmxhZ3M7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHdkYXRhLT5pbm9kZTsKKwlzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0ciA9IHdkYXRhLT5yZXMuZmF0dHI7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IE5GU19TRVJWRVIoaW5vZGUpOworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfcHJvYwk9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9XUklURV0sCisJCS5ycGNfYXJncAk9ICZ3ZGF0YS0+YXJncywKKwkJLnJwY19yZXNwCT0gJndkYXRhLT5yZXMsCisJCS5ycGNfY3JlZAk9IHdkYXRhLT5jcmVkLAorCX07CisJaW50IHN0YXR1czsKKworCWRwcmludGsoIk5GUyBjYWxsICB3cml0ZSAlZCBAICVMZFxuIiwgd2RhdGEtPmFyZ3MuY291bnQsCisJCQkobG9uZyBsb25nKSB3ZGF0YS0+YXJncy5vZmZzZXQpOworCisJZmF0dHItPnZhbGlkID0gMDsKKwlzdGF0dXMgPSBycGNfY2FsbF9zeW5jKHNlcnZlci0+Y2xpZW50LCAmbXNnLCBycGNmbGFncyk7CisJZHByaW50aygiTkZTIHJlcGx5IHdyaXRlOiAlZFxuIiwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IG5mczRfcHJvY193cml0ZShzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKndkYXRhKQoreworCXN0cnVjdCBuZnM0X2V4Y2VwdGlvbiBleGNlcHRpb24gPSB7IH07CisJaW50IGVycjsKKwlkbyB7CisJCWVyciA9IG5mczRfaGFuZGxlX2V4Y2VwdGlvbihORlNfU0VSVkVSKHdkYXRhLT5pbm9kZSksCisJCQkJX25mczRfcHJvY193cml0ZSh3ZGF0YSksCisJCQkJJmV4Y2VwdGlvbik7CisJfSB3aGlsZSAoZXhjZXB0aW9uLnJldHJ5KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9uZnM0X3Byb2NfY29tbWl0KHN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqY2RhdGEpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGNkYXRhLT5pbm9kZTsKKwlzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0ciA9IGNkYXRhLT5yZXMuZmF0dHI7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IE5GU19TRVJWRVIoaW5vZGUpOworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfcHJvYwk9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9DT01NSVRdLAorCQkucnBjX2FyZ3AJPSAmY2RhdGEtPmFyZ3MsCisJCS5ycGNfcmVzcAk9ICZjZGF0YS0+cmVzLAorCQkucnBjX2NyZWQJPSBjZGF0YS0+Y3JlZCwKKwl9OworCWludCBzdGF0dXM7CisKKwlkcHJpbnRrKCJORlMgY2FsbCAgY29tbWl0ICVkIEAgJUxkXG4iLCBjZGF0YS0+YXJncy5jb3VudCwKKwkJCShsb25nIGxvbmcpIGNkYXRhLT5hcmdzLm9mZnNldCk7CisKKwlmYXR0ci0+dmFsaWQgPSAwOworCXN0YXR1cyA9IHJwY19jYWxsX3N5bmMoc2VydmVyLT5jbGllbnQsICZtc2csIDApOworCWRwcmludGsoIk5GUyByZXBseSBjb21taXQ6ICVkXG4iLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgbmZzNF9wcm9jX2NvbW1pdChzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKmNkYXRhKQoreworCXN0cnVjdCBuZnM0X2V4Y2VwdGlvbiBleGNlcHRpb24gPSB7IH07CisJaW50IGVycjsKKwlkbyB7CisJCWVyciA9IG5mczRfaGFuZGxlX2V4Y2VwdGlvbihORlNfU0VSVkVSKGNkYXRhLT5pbm9kZSksCisJCQkJX25mczRfcHJvY19jb21taXQoY2RhdGEpLAorCQkJCSZleGNlcHRpb24pOworCX0gd2hpbGUgKGV4Y2VwdGlvbi5yZXRyeSk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIEdvdCByYWNlPworICogV2Ugd2lsbCBuZWVkIHRvIGFycmFuZ2UgZm9yIHRoZSBWRlMgbGF5ZXIgdG8gcHJvdmlkZSBhbiBhdG9taWMgb3Blbi4KKyAqIFVudGlsIHRoZW4sIHRoaXMgY3JlYXRlL29wZW4gbWV0aG9kIGlzIHByb25lIHRvIGluZWZmaWNpZW5jeSBhbmQgcmFjZQorICogY29uZGl0aW9ucyBkdWUgdG8gdGhlIGxvb2t1cCwgY3JlYXRlLCBhbmQgb3BlbiBWRlMgY2FsbHMgZnJvbSBzeXNfb3BlbigpCisgKiBwbGFjZWQgb24gdGhlIHdpcmUuCisgKgorICogR2l2ZW4gdGhlIGFib3ZlIHNvcnJ5IHN0YXRlIG9mIGFmZmFpcnMsIEknbSBzaW1wbHkgc2VuZGluZyBhbiBPUEVOLgorICogVGhlIGZpbGUgd2lsbCBiZSBvcGVuZWQgYWdhaW4gaW4gdGhlIHN1YnNlcXVlbnQgVkZTIG9wZW4gY2FsbAorICogKG5mczRfcHJvY19maWxlX29wZW4pLgorICoKKyAqIFRoZSBvcGVuIGZvciByZWFkIHdpbGwganVzdCBoYW5nIGFyb3VuZCB0byBiZSB1c2VkIGJ5IGFueSBwcm9jZXNzIHRoYXQKKyAqIG9wZW5zIHRoZSBmaWxlIE9fUkRPTkxZLiBUaGlzIHdpbGwgYWxsIGJlIHJlc29sdmVkIHdpdGggdGhlIFZGUyBjaGFuZ2VzLgorICovCisKK3N0YXRpYyBpbnQKK25mczRfcHJvY19jcmVhdGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICpzYXR0ciwKKyAgICAgICAgICAgICAgICAgaW50IGZsYWdzKQoreworCXN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZTsKKwlzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQ7CisJaW50IHN0YXR1cyA9IDA7CisKKwljcmVkID0gcnBjYXV0aF9sb29rdXBjcmVkKE5GU19TRVJWRVIoZGlyKS0+Y2xpZW50LT5jbF9hdXRoLCAwKTsKKwlpZiAoSVNfRVJSKGNyZWQpKSB7CisJCXN0YXR1cyA9IFBUUl9FUlIoY3JlZCk7CisJCWdvdG8gb3V0OworCX0KKwlzdGF0ZSA9IG5mczRfZG9fb3BlbihkaXIsIGRlbnRyeSwgZmxhZ3MsIHNhdHRyLCBjcmVkKTsKKwlwdXRfcnBjY3JlZChjcmVkKTsKKwlpZiAoSVNfRVJSKHN0YXRlKSkgeworCQlzdGF0dXMgPSBQVFJfRVJSKHN0YXRlKTsKKwkJZ290byBvdXQ7CisJfQorCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBzdGF0ZS0+aW5vZGUpOworCWlmIChmbGFncyAmIE9fRVhDTCkgeworCQlzdHJ1Y3QgbmZzX2ZhdHRyIGZhdHRyOworCQlzdGF0dXMgPSBuZnM0X2RvX3NldGF0dHIoTkZTX1NFUlZFUihkaXIpLCAmZmF0dHIsCisJCSAgICAgICAgICAgICAgICAgICAgIE5GU19GSChzdGF0ZS0+aW5vZGUpLCBzYXR0ciwgc3RhdGUpOworCQlpZiAoc3RhdHVzID09IDApCisJCQlnb3RvIG91dDsKKwl9IGVsc2UgaWYgKGZsYWdzICE9IDApCisJCWdvdG8gb3V0OworCW5mczRfY2xvc2Vfc3RhdGUoc3RhdGUsIGZsYWdzKTsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IF9uZnM0X3Byb2NfcmVtb3ZlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgcXN0ciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbmZzNF9yZW1vdmVfYXJnIGFyZ3MgPSB7CisJCS5maCA9IE5GU19GSChkaXIpLAorCQkubmFtZSA9IG5hbWUsCisJfTsKKwlzdHJ1Y3QgbmZzNF9jaGFuZ2VfaW5mbwlyZXM7CisJc3RydWN0IHJwY19tZXNzYWdlIG1zZyA9IHsKKwkJLnJwY19wcm9jCT0gJm5mczRfcHJvY2VkdXJlc1tORlNQUk9DNF9DTE5UX1JFTU9WRV0sCisJCS5ycGNfYXJncAk9ICZhcmdzLAorCQkucnBjX3Jlc3AJPSAmcmVzLAorCX07CisJaW50CQkJc3RhdHVzOworCisJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhORlNfQ0xJRU5UKGRpciksICZtc2csIDApOworCWlmIChzdGF0dXMgPT0gMCkKKwkJdXBkYXRlX2NoYW5nZWF0dHIoZGlyLCAmcmVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IG5mczRfcHJvY19yZW1vdmUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBxc3RyICpuYW1lKQoreworCXN0cnVjdCBuZnM0X2V4Y2VwdGlvbiBleGNlcHRpb24gPSB7IH07CisJaW50IGVycjsKKwlkbyB7CisJCWVyciA9IG5mczRfaGFuZGxlX2V4Y2VwdGlvbihORlNfU0VSVkVSKGRpciksCisJCQkJX25mczRfcHJvY19yZW1vdmUoZGlyLCBuYW1lKSwKKwkJCQkmZXhjZXB0aW9uKTsKKwl9IHdoaWxlIChleGNlcHRpb24ucmV0cnkpOworCXJldHVybiBlcnI7Cit9CisKK3N0cnVjdCB1bmxpbmtfZGVzYyB7CisJc3RydWN0IG5mczRfcmVtb3ZlX2FyZwlhcmdzOworCXN0cnVjdCBuZnM0X2NoYW5nZV9pbmZvCXJlczsKK307CisKK3N0YXRpYyBpbnQgbmZzNF9wcm9jX3VubGlua19zZXR1cChzdHJ1Y3QgcnBjX21lc3NhZ2UgKm1zZywgc3RydWN0IGRlbnRyeSAqZGlyLAorCQlzdHJ1Y3QgcXN0ciAqbmFtZSkKK3sKKwlzdHJ1Y3QgdW5saW5rX2Rlc2MgKnVwOworCisJdXAgPSAoc3RydWN0IHVubGlua19kZXNjICopIGttYWxsb2Moc2l6ZW9mKCp1cCksIEdGUF9LRVJORUwpOworCWlmICghdXApCisJCXJldHVybiAtRU5PTUVNOworCQorCXVwLT5hcmdzLmZoID0gTkZTX0ZIKGRpci0+ZF9pbm9kZSk7CisJdXAtPmFyZ3MubmFtZSA9IG5hbWU7CisJCisJbXNnLT5ycGNfcHJvYyA9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9SRU1PVkVdOworCW1zZy0+cnBjX2FyZ3AgPSAmdXAtPmFyZ3M7CisJbXNnLT5ycGNfcmVzcCA9ICZ1cC0+cmVzOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5mczRfcHJvY191bmxpbmtfZG9uZShzdHJ1Y3QgZGVudHJ5ICpkaXIsIHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UgKm1zZyA9ICZ0YXNrLT50a19tc2c7CisJc3RydWN0IHVubGlua19kZXNjICp1cDsKKwkKKwlpZiAobXNnLT5ycGNfcmVzcCAhPSBOVUxMKSB7CisJCXVwID0gY29udGFpbmVyX29mKG1zZy0+cnBjX3Jlc3AsIHN0cnVjdCB1bmxpbmtfZGVzYywgcmVzKTsKKwkJdXBkYXRlX2NoYW5nZWF0dHIoZGlyLT5kX2lub2RlLCAmdXAtPnJlcyk7CisJCWtmcmVlKHVwKTsKKwkJbXNnLT5ycGNfcmVzcCA9IE5VTEw7CisJCW1zZy0+cnBjX2FyZ3AgPSBOVUxMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfbmZzNF9wcm9jX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBxc3RyICpvbGRfbmFtZSwKKwkJc3RydWN0IGlub2RlICpuZXdfZGlyLCBzdHJ1Y3QgcXN0ciAqbmV3X25hbWUpCit7CisJc3RydWN0IG5mczRfcmVuYW1lX2FyZyBhcmcgPSB7CisJCS5vbGRfZGlyID0gTkZTX0ZIKG9sZF9kaXIpLAorCQkubmV3X2RpciA9IE5GU19GSChuZXdfZGlyKSwKKwkJLm9sZF9uYW1lID0gb2xkX25hbWUsCisJCS5uZXdfbmFtZSA9IG5ld19uYW1lLAorCX07CisJc3RydWN0IG5mczRfcmVuYW1lX3JlcyByZXMgPSB7IH07CisJc3RydWN0IHJwY19tZXNzYWdlIG1zZyA9IHsKKwkJLnJwY19wcm9jID0gJm5mczRfcHJvY2VkdXJlc1tORlNQUk9DNF9DTE5UX1JFTkFNRV0sCisJCS5ycGNfYXJncCA9ICZhcmcsCisJCS5ycGNfcmVzcCA9ICZyZXMsCisJfTsKKwlpbnQJCQlzdGF0dXM7CisJCisJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhORlNfQ0xJRU5UKG9sZF9kaXIpLCAmbXNnLCAwKTsKKworCWlmICghc3RhdHVzKSB7CisJCXVwZGF0ZV9jaGFuZ2VhdHRyKG9sZF9kaXIsICZyZXMub2xkX2NpbmZvKTsKKwkJdXBkYXRlX2NoYW5nZWF0dHIobmV3X2RpciwgJnJlcy5uZXdfY2luZm8pOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IG5mczRfcHJvY19yZW5hbWUoc3RydWN0IGlub2RlICpvbGRfZGlyLCBzdHJ1Y3QgcXN0ciAqb2xkX25hbWUsCisJCXN0cnVjdCBpbm9kZSAqbmV3X2Rpciwgc3RydWN0IHFzdHIgKm5ld19uYW1lKQoreworCXN0cnVjdCBuZnM0X2V4Y2VwdGlvbiBleGNlcHRpb24gPSB7IH07CisJaW50IGVycjsKKwlkbyB7CisJCWVyciA9IG5mczRfaGFuZGxlX2V4Y2VwdGlvbihORlNfU0VSVkVSKG9sZF9kaXIpLAorCQkJCV9uZnM0X3Byb2NfcmVuYW1lKG9sZF9kaXIsIG9sZF9uYW1lLAorCQkJCQluZXdfZGlyLCBuZXdfbmFtZSksCisJCQkJJmV4Y2VwdGlvbik7CisJfSB3aGlsZSAoZXhjZXB0aW9uLnJldHJ5KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9uZnM0X3Byb2NfbGluayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHFzdHIgKm5hbWUpCit7CisJc3RydWN0IG5mczRfbGlua19hcmcgYXJnID0geworCQkuZmggICAgID0gTkZTX0ZIKGlub2RlKSwKKwkJLmRpcl9maCA9IE5GU19GSChkaXIpLAorCQkubmFtZSAgID0gbmFtZSwKKwl9OworCXN0cnVjdCBuZnM0X2NoYW5nZV9pbmZvCWNpbmZvID0geyB9OworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfcHJvYyA9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9MSU5LXSwKKwkJLnJwY19hcmdwID0gJmFyZywKKwkJLnJwY19yZXNwID0gJmNpbmZvLAorCX07CisJaW50CQkJc3RhdHVzOworCisJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhORlNfQ0xJRU5UKGlub2RlKSwgJm1zZywgMCk7CisJaWYgKCFzdGF0dXMpCisJCXVwZGF0ZV9jaGFuZ2VhdHRyKGRpciwgJmNpbmZvKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgbmZzNF9wcm9jX2xpbmsoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBxc3RyICpuYW1lKQoreworCXN0cnVjdCBuZnM0X2V4Y2VwdGlvbiBleGNlcHRpb24gPSB7IH07CisJaW50IGVycjsKKwlkbyB7CisJCWVyciA9IG5mczRfaGFuZGxlX2V4Y2VwdGlvbihORlNfU0VSVkVSKGlub2RlKSwKKwkJCQlfbmZzNF9wcm9jX2xpbmsoaW5vZGUsIGRpciwgbmFtZSksCisJCQkJJmV4Y2VwdGlvbik7CisJfSB3aGlsZSAoZXhjZXB0aW9uLnJldHJ5KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9uZnM0X3Byb2Nfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHFzdHIgKm5hbWUsCisJCXN0cnVjdCBxc3RyICpwYXRoLCBzdHJ1Y3QgaWF0dHIgKnNhdHRyLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlLAorCQlzdHJ1Y3QgbmZzX2ZhdHRyICpmYXR0cikKK3sKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NFUlZFUihkaXIpOworCXN0cnVjdCBuZnM0X2NyZWF0ZV9hcmcgYXJnID0geworCQkuZGlyX2ZoID0gTkZTX0ZIKGRpciksCisJCS5zZXJ2ZXIgPSBzZXJ2ZXIsCisJCS5uYW1lID0gbmFtZSwKKwkJLmF0dHJzID0gc2F0dHIsCisJCS5mdHlwZSA9IE5GNExOSywKKwkJLmJpdG1hc2sgPSBzZXJ2ZXItPmF0dHJfYml0bWFzaywKKwl9OworCXN0cnVjdCBuZnM0X2NyZWF0ZV9yZXMgcmVzID0geworCQkuc2VydmVyID0gc2VydmVyLAorCQkuZmggPSBmaGFuZGxlLAorCQkuZmF0dHIgPSBmYXR0ciwKKwl9OworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfcHJvYyA9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9TWU1MSU5LXSwKKwkJLnJwY19hcmdwID0gJmFyZywKKwkJLnJwY19yZXNwID0gJnJlcywKKwl9OworCWludAkJCXN0YXR1czsKKworCWlmIChwYXRoLT5sZW4gPiBORlM0X01BWFBBVEhMRU4pCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCWFyZy51LnN5bWxpbmsgPSBwYXRoOworCWZhdHRyLT52YWxpZCA9IDA7CisJCisJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhORlNfQ0xJRU5UKGRpciksICZtc2csIDApOworCWlmICghc3RhdHVzKQorCQl1cGRhdGVfY2hhbmdlYXR0cihkaXIsICZyZXMuZGlyX2NpbmZvKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IG5mczRfcHJvY19zeW1saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgcXN0ciAqbmFtZSwKKwkJc3RydWN0IHFzdHIgKnBhdGgsIHN0cnVjdCBpYXR0ciAqc2F0dHIsIHN0cnVjdCBuZnNfZmggKmZoYW5kbGUsCisJCXN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQoreworCXN0cnVjdCBuZnM0X2V4Y2VwdGlvbiBleGNlcHRpb24gPSB7IH07CisJaW50IGVycjsKKwlkbyB7CisJCWVyciA9IG5mczRfaGFuZGxlX2V4Y2VwdGlvbihORlNfU0VSVkVSKGRpciksCisJCQkJX25mczRfcHJvY19zeW1saW5rKGRpciwgbmFtZSwgcGF0aCwgc2F0dHIsCisJCQkJCWZoYW5kbGUsIGZhdHRyKSwKKwkJCQkmZXhjZXB0aW9uKTsKKwl9IHdoaWxlIChleGNlcHRpb24ucmV0cnkpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX25mczRfcHJvY19ta2RpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQlzdHJ1Y3QgaWF0dHIgKnNhdHRyKQoreworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0VSVkVSKGRpcik7CisJc3RydWN0IG5mc19maCBmaGFuZGxlOworCXN0cnVjdCBuZnNfZmF0dHIgZmF0dHI7CisJc3RydWN0IG5mczRfY3JlYXRlX2FyZyBhcmcgPSB7CisJCS5kaXJfZmggPSBORlNfRkgoZGlyKSwKKwkJLnNlcnZlciA9IHNlcnZlciwKKwkJLm5hbWUgPSAmZGVudHJ5LT5kX25hbWUsCisJCS5hdHRycyA9IHNhdHRyLAorCQkuZnR5cGUgPSBORjRESVIsCisJCS5iaXRtYXNrID0gc2VydmVyLT5hdHRyX2JpdG1hc2ssCisJfTsKKwlzdHJ1Y3QgbmZzNF9jcmVhdGVfcmVzIHJlcyA9IHsKKwkJLnNlcnZlciA9IHNlcnZlciwKKwkJLmZoID0gJmZoYW5kbGUsCisJCS5mYXR0ciA9ICZmYXR0ciwKKwl9OworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfcHJvYyA9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9DUkVBVEVdLAorCQkucnBjX2FyZ3AgPSAmYXJnLAorCQkucnBjX3Jlc3AgPSAmcmVzLAorCX07CisJaW50CQkJc3RhdHVzOworCisJZmF0dHIudmFsaWQgPSAwOworCQorCXN0YXR1cyA9IHJwY19jYWxsX3N5bmMoTkZTX0NMSUVOVChkaXIpLCAmbXNnLCAwKTsKKwlpZiAoIXN0YXR1cykgeworCQl1cGRhdGVfY2hhbmdlYXR0cihkaXIsICZyZXMuZGlyX2NpbmZvKTsKKwkJc3RhdHVzID0gbmZzX2luc3RhbnRpYXRlKGRlbnRyeSwgJmZoYW5kbGUsICZmYXR0cik7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgbmZzNF9wcm9jX21rZGlyKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCXN0cnVjdCBpYXR0ciAqc2F0dHIpCit7CisJc3RydWN0IG5mczRfZXhjZXB0aW9uIGV4Y2VwdGlvbiA9IHsgfTsKKwlpbnQgZXJyOworCWRvIHsKKwkJZXJyID0gbmZzNF9oYW5kbGVfZXhjZXB0aW9uKE5GU19TRVJWRVIoZGlyKSwKKwkJCQlfbmZzNF9wcm9jX21rZGlyKGRpciwgZGVudHJ5LCBzYXR0ciksCisJCQkJJmV4Y2VwdGlvbik7CisJfSB3aGlsZSAoZXhjZXB0aW9uLnJldHJ5KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9uZnM0X3Byb2NfcmVhZGRpcihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBycGNfY3JlZCAqY3JlZCwKKyAgICAgICAgICAgICAgICAgIHU2NCBjb29raWUsIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBpbnQgY291bnQsIGludCBwbHVzKQoreworCXN0cnVjdCBpbm9kZQkJKmRpciA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgbmZzNF9yZWFkZGlyX2FyZyBhcmdzID0geworCQkuZmggPSBORlNfRkgoZGlyKSwKKwkJLnBhZ2VzID0gJnBhZ2UsCisJCS5wZ2Jhc2UgPSAwLAorCQkuY291bnQgPSBjb3VudCwKKwkJLmJpdG1hc2sgPSBORlNfU0VSVkVSKGRlbnRyeS0+ZF9pbm9kZSktPmF0dHJfYml0bWFzaywKKwl9OworCXN0cnVjdCBuZnM0X3JlYWRkaXJfcmVzIHJlczsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0geworCQkucnBjX3Byb2MgPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfUkVBRERJUl0sCisJCS5ycGNfYXJncCA9ICZhcmdzLAorCQkucnBjX3Jlc3AgPSAmcmVzLAorCQkucnBjX2NyZWQgPSBjcmVkLAorCX07CisJaW50CQkJc3RhdHVzOworCisJbG9ja19rZXJuZWwoKTsKKwluZnM0X3NldHVwX3JlYWRkaXIoY29va2llLCBORlNfQ09PS0lFVkVSRihkaXIpLCBkZW50cnksICZhcmdzKTsKKwlyZXMucGdiYXNlID0gYXJncy5wZ2Jhc2U7CisJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhORlNfQ0xJRU5UKGRpciksICZtc2csIDApOworCWlmIChzdGF0dXMgPT0gMCkKKwkJbWVtY3B5KE5GU19DT09LSUVWRVJGKGRpciksIHJlcy52ZXJpZmllci5kYXRhLCBORlM0X1ZFUklGSUVSX1NJWkUpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IG5mczRfcHJvY19yZWFkZGlyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHJwY19jcmVkICpjcmVkLAorICAgICAgICAgICAgICAgICAgdTY0IGNvb2tpZSwgc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGludCBjb3VudCwgaW50IHBsdXMpCit7CisJc3RydWN0IG5mczRfZXhjZXB0aW9uIGV4Y2VwdGlvbiA9IHsgfTsKKwlpbnQgZXJyOworCWRvIHsKKwkJZXJyID0gbmZzNF9oYW5kbGVfZXhjZXB0aW9uKE5GU19TRVJWRVIoZGVudHJ5LT5kX2lub2RlKSwKKwkJCQlfbmZzNF9wcm9jX3JlYWRkaXIoZGVudHJ5LCBjcmVkLCBjb29raWUsCisJCQkJCXBhZ2UsIGNvdW50LCBwbHVzKSwKKwkJCQkmZXhjZXB0aW9uKTsKKwl9IHdoaWxlIChleGNlcHRpb24ucmV0cnkpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX25mczRfcHJvY19ta25vZChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQlzdHJ1Y3QgaWF0dHIgKnNhdHRyLCBkZXZfdCByZGV2KQoreworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0VSVkVSKGRpcik7CisJc3RydWN0IG5mc19maCBmaDsKKwlzdHJ1Y3QgbmZzX2ZhdHRyIGZhdHRyOworCXN0cnVjdCBuZnM0X2NyZWF0ZV9hcmcgYXJnID0geworCQkuZGlyX2ZoID0gTkZTX0ZIKGRpciksCisJCS5zZXJ2ZXIgPSBzZXJ2ZXIsCisJCS5uYW1lID0gJmRlbnRyeS0+ZF9uYW1lLAorCQkuYXR0cnMgPSBzYXR0ciwKKwkJLmJpdG1hc2sgPSBzZXJ2ZXItPmF0dHJfYml0bWFzaywKKwl9OworCXN0cnVjdCBuZnM0X2NyZWF0ZV9yZXMgcmVzID0geworCQkuc2VydmVyID0gc2VydmVyLAorCQkuZmggPSAmZmgsCisJCS5mYXR0ciA9ICZmYXR0ciwKKwl9OworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfcHJvYyA9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9DUkVBVEVdLAorCQkucnBjX2FyZ3AgPSAmYXJnLAorCQkucnBjX3Jlc3AgPSAmcmVzLAorCX07CisJaW50CQkJc3RhdHVzOworCWludCAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBzYXR0ci0+aWFfbW9kZTsKKworCWZhdHRyLnZhbGlkID0gMDsKKworCUJVR19PTighKHNhdHRyLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkpOworCUJVR19PTighU19JU0ZJRk8obW9kZSkgJiYgIVNfSVNCTEsobW9kZSkgJiYgIVNfSVNDSFIobW9kZSkgJiYgIVNfSVNTT0NLKG1vZGUpKTsKKwlpZiAoU19JU0ZJRk8obW9kZSkpCisJCWFyZy5mdHlwZSA9IE5GNEZJRk87CisJZWxzZSBpZiAoU19JU0JMSyhtb2RlKSkgeworCQlhcmcuZnR5cGUgPSBORjRCTEs7CisJCWFyZy51LmRldmljZS5zcGVjZGF0YTEgPSBNQUpPUihyZGV2KTsKKwkJYXJnLnUuZGV2aWNlLnNwZWNkYXRhMiA9IE1JTk9SKHJkZXYpOworCX0KKwllbHNlIGlmIChTX0lTQ0hSKG1vZGUpKSB7CisJCWFyZy5mdHlwZSA9IE5GNENIUjsKKwkJYXJnLnUuZGV2aWNlLnNwZWNkYXRhMSA9IE1BSk9SKHJkZXYpOworCQlhcmcudS5kZXZpY2Uuc3BlY2RhdGEyID0gTUlOT1IocmRldik7CisJfQorCWVsc2UKKwkJYXJnLmZ0eXBlID0gTkY0U09DSzsKKwkKKwlzdGF0dXMgPSBycGNfY2FsbF9zeW5jKE5GU19DTElFTlQoZGlyKSwgJm1zZywgMCk7CisJaWYgKHN0YXR1cyA9PSAwKSB7CisJCXVwZGF0ZV9jaGFuZ2VhdHRyKGRpciwgJnJlcy5kaXJfY2luZm8pOworCQlzdGF0dXMgPSBuZnNfaW5zdGFudGlhdGUoZGVudHJ5LCAmZmgsICZmYXR0cik7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgbmZzNF9wcm9jX21rbm9kKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCXN0cnVjdCBpYXR0ciAqc2F0dHIsIGRldl90IHJkZXYpCit7CisJc3RydWN0IG5mczRfZXhjZXB0aW9uIGV4Y2VwdGlvbiA9IHsgfTsKKwlpbnQgZXJyOworCWRvIHsKKwkJZXJyID0gbmZzNF9oYW5kbGVfZXhjZXB0aW9uKE5GU19TRVJWRVIoZGlyKSwKKwkJCQlfbmZzNF9wcm9jX21rbm9kKGRpciwgZGVudHJ5LCBzYXR0ciwgcmRldiksCisJCQkJJmV4Y2VwdGlvbik7CisJfSB3aGlsZSAoZXhjZXB0aW9uLnJldHJ5KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9uZnM0X3Byb2Nfc3RhdGZzKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBuZnNfZmggKmZoYW5kbGUsCisJCSBzdHJ1Y3QgbmZzX2Zzc3RhdCAqZnNzdGF0KQoreworCXN0cnVjdCBuZnM0X3N0YXRmc19hcmcgYXJncyA9IHsKKwkJLmZoID0gZmhhbmRsZSwKKwkJLmJpdG1hc2sgPSBzZXJ2ZXItPmF0dHJfYml0bWFzaywKKwl9OworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfcHJvYyA9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9TVEFURlNdLAorCQkucnBjX2FyZ3AgPSAmYXJncywKKwkJLnJwY19yZXNwID0gZnNzdGF0LAorCX07CisKKwlmc3N0YXQtPmZhdHRyLT52YWxpZCA9IDA7CisJcmV0dXJuIHJwY19jYWxsX3N5bmMoc2VydmVyLT5jbGllbnQsICZtc2csIDApOworfQorCitzdGF0aWMgaW50IG5mczRfcHJvY19zdGF0ZnMoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgc3RydWN0IG5mc19maCAqZmhhbmRsZSwgc3RydWN0IG5mc19mc3N0YXQgKmZzc3RhdCkKK3sKKwlzdHJ1Y3QgbmZzNF9leGNlcHRpb24gZXhjZXB0aW9uID0geyB9OworCWludCBlcnI7CisJZG8geworCQllcnIgPSBuZnM0X2hhbmRsZV9leGNlcHRpb24oc2VydmVyLAorCQkJCV9uZnM0X3Byb2Nfc3RhdGZzKHNlcnZlciwgZmhhbmRsZSwgZnNzdGF0KSwKKwkJCQkmZXhjZXB0aW9uKTsKKwl9IHdoaWxlIChleGNlcHRpb24ucmV0cnkpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX25mczRfZG9fZnNpbmZvKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBuZnNfZmggKmZoYW5kbGUsCisJCXN0cnVjdCBuZnNfZnNpbmZvICpmc2luZm8pCit7CisJc3RydWN0IG5mczRfZnNpbmZvX2FyZyBhcmdzID0geworCQkuZmggPSBmaGFuZGxlLAorCQkuYml0bWFzayA9IHNlcnZlci0+YXR0cl9iaXRtYXNrLAorCX07CisJc3RydWN0IHJwY19tZXNzYWdlIG1zZyA9IHsKKwkJLnJwY19wcm9jID0gJm5mczRfcHJvY2VkdXJlc1tORlNQUk9DNF9DTE5UX0ZTSU5GT10sCisJCS5ycGNfYXJncCA9ICZhcmdzLAorCQkucnBjX3Jlc3AgPSBmc2luZm8sCisJfTsKKworCXJldHVybiBycGNfY2FsbF9zeW5jKHNlcnZlci0+Y2xpZW50LCAmbXNnLCAwKTsKK30KKworc3RhdGljIGludCBuZnM0X2RvX2ZzaW5mbyhzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlLCBzdHJ1Y3QgbmZzX2ZzaW5mbyAqZnNpbmZvKQoreworCXN0cnVjdCBuZnM0X2V4Y2VwdGlvbiBleGNlcHRpb24gPSB7IH07CisJaW50IGVycjsKKworCWRvIHsKKwkJZXJyID0gbmZzNF9oYW5kbGVfZXhjZXB0aW9uKHNlcnZlciwKKwkJCQlfbmZzNF9kb19mc2luZm8oc2VydmVyLCBmaGFuZGxlLCBmc2luZm8pLAorCQkJCSZleGNlcHRpb24pOworCX0gd2hpbGUgKGV4Y2VwdGlvbi5yZXRyeSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBuZnM0X3Byb2NfZnNpbmZvKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBuZnNfZmggKmZoYW5kbGUsIHN0cnVjdCBuZnNfZnNpbmZvICpmc2luZm8pCit7CisJZnNpbmZvLT5mYXR0ci0+dmFsaWQgPSAwOworCXJldHVybiBuZnM0X2RvX2ZzaW5mbyhzZXJ2ZXIsIGZoYW5kbGUsIGZzaW5mbyk7Cit9CisKK3N0YXRpYyBpbnQgX25mczRfcHJvY19wYXRoY29uZihzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlLAorCQlzdHJ1Y3QgbmZzX3BhdGhjb25mICpwYXRoY29uZikKK3sKKwlzdHJ1Y3QgbmZzNF9wYXRoY29uZl9hcmcgYXJncyA9IHsKKwkJLmZoID0gZmhhbmRsZSwKKwkJLmJpdG1hc2sgPSBzZXJ2ZXItPmF0dHJfYml0bWFzaywKKwl9OworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfcHJvYyA9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9QQVRIQ09ORl0sCisJCS5ycGNfYXJncCA9ICZhcmdzLAorCQkucnBjX3Jlc3AgPSBwYXRoY29uZiwKKwl9OworCisJLyogTm9uZSBvZiB0aGUgcGF0aGNvbmYgYXR0cmlidXRlcyBhcmUgbWFuZGF0b3J5IHRvIGltcGxlbWVudCAqLworCWlmICgoYXJncy5iaXRtYXNrWzBdICYgbmZzNF9wYXRoY29uZl9iaXRtYXBbMF0pID09IDApIHsKKwkJbWVtc2V0KHBhdGhjb25mLCAwLCBzaXplb2YoKnBhdGhjb25mKSk7CisJCXJldHVybiAwOworCX0KKworCXBhdGhjb25mLT5mYXR0ci0+dmFsaWQgPSAwOworCXJldHVybiBycGNfY2FsbF9zeW5jKHNlcnZlci0+Y2xpZW50LCAmbXNnLCAwKTsKK30KKworc3RhdGljIGludCBuZnM0X3Byb2NfcGF0aGNvbmYoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgc3RydWN0IG5mc19maCAqZmhhbmRsZSwKKwkJc3RydWN0IG5mc19wYXRoY29uZiAqcGF0aGNvbmYpCit7CisJc3RydWN0IG5mczRfZXhjZXB0aW9uIGV4Y2VwdGlvbiA9IHsgfTsKKwlpbnQgZXJyOworCisJZG8geworCQllcnIgPSBuZnM0X2hhbmRsZV9leGNlcHRpb24oc2VydmVyLAorCQkJCV9uZnM0X3Byb2NfcGF0aGNvbmYoc2VydmVyLCBmaGFuZGxlLCBwYXRoY29uZiksCisJCQkJJmV4Y2VwdGlvbik7CisJfSB3aGlsZSAoZXhjZXB0aW9uLnJldHJ5KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZAorbmZzNF9yZWFkX2RvbmUoc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCXN0cnVjdCBuZnNfcmVhZF9kYXRhICpkYXRhID0gKHN0cnVjdCBuZnNfcmVhZF9kYXRhICopIHRhc2stPnRrX2NhbGxkYXRhOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkYXRhLT5pbm9kZTsKKworCWlmIChuZnM0X2FzeW5jX2hhbmRsZV9lcnJvcih0YXNrLCBORlNfU0VSVkVSKGlub2RlKSkgPT0gLUVBR0FJTikgeworCQlycGNfcmVzdGFydF9jYWxsKHRhc2spOworCQlyZXR1cm47CisJfQorCWlmICh0YXNrLT50a19zdGF0dXMgPiAwKQorCQlyZW5ld19sZWFzZShORlNfU0VSVkVSKGlub2RlKSwgZGF0YS0+dGltZXN0YW1wKTsKKwkvKiBDYWxsIGJhY2sgY29tbW9uIE5GUyByZWFkcGFnZSBwcm9jZXNzaW5nICovCisJbmZzX3JlYWRwYWdlX3Jlc3VsdCh0YXNrKTsKK30KKworc3RhdGljIHZvaWQKK25mczRfcHJvY19yZWFkX3NldHVwKHN0cnVjdCBuZnNfcmVhZF9kYXRhICpkYXRhKQoreworCXN0cnVjdCBycGNfdGFzawkqdGFzayA9ICZkYXRhLT50YXNrOworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfcHJvYyA9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9SRUFEXSwKKwkJLnJwY19hcmdwID0gJmRhdGEtPmFyZ3MsCisJCS5ycGNfcmVzcCA9ICZkYXRhLT5yZXMsCisJCS5ycGNfY3JlZCA9IGRhdGEtPmNyZWQsCisJfTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGF0YS0+aW5vZGU7CisJaW50IGZsYWdzOworCisJZGF0YS0+dGltZXN0YW1wICAgPSBqaWZmaWVzOworCisJLyogTi5CLiBEbyB3ZSBuZWVkIHRvIHRlc3Q/IE5ldmVyIGNhbGxlZCBmb3Igc3dhcGZpbGUgaW5vZGUgKi8KKwlmbGFncyA9IFJQQ19UQVNLX0FTWU5DIHwgKElTX1NXQVBGSUxFKGlub2RlKT8gTkZTX1JQQ19TV0FQRkxBR1MgOiAwKTsKKworCS8qIEZpbmFsaXplIHRoZSB0YXNrLiAqLworCXJwY19pbml0X3Rhc2sodGFzaywgTkZTX0NMSUVOVChpbm9kZSksIG5mczRfcmVhZF9kb25lLCBmbGFncyk7CisJcnBjX2NhbGxfc2V0dXAodGFzaywgJm1zZywgMCk7Cit9CisKK3N0YXRpYyB2b2lkCituZnM0X3dyaXRlX2RvbmUoc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCXN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqZGF0YSA9IChzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKikgdGFzay0+dGtfY2FsbGRhdGE7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRhdGEtPmlub2RlOworCQorCWlmIChuZnM0X2FzeW5jX2hhbmRsZV9lcnJvcih0YXNrLCBORlNfU0VSVkVSKGlub2RlKSkgPT0gLUVBR0FJTikgeworCQlycGNfcmVzdGFydF9jYWxsKHRhc2spOworCQlyZXR1cm47CisJfQorCWlmICh0YXNrLT50a19zdGF0dXMgPj0gMCkKKwkJcmVuZXdfbGVhc2UoTkZTX1NFUlZFUihpbm9kZSksIGRhdGEtPnRpbWVzdGFtcCk7CisJLyogQ2FsbCBiYWNrIGNvbW1vbiBORlMgd3JpdGViYWNrIHByb2Nlc3NpbmcgKi8KKwluZnNfd3JpdGViYWNrX2RvbmUodGFzayk7Cit9CisKK3N0YXRpYyB2b2lkCituZnM0X3Byb2Nfd3JpdGVfc2V0dXAoc3RydWN0IG5mc193cml0ZV9kYXRhICpkYXRhLCBpbnQgaG93KQoreworCXN0cnVjdCBycGNfdGFzawkqdGFzayA9ICZkYXRhLT50YXNrOworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfcHJvYyA9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9XUklURV0sCisJCS5ycGNfYXJncCA9ICZkYXRhLT5hcmdzLAorCQkucnBjX3Jlc3AgPSAmZGF0YS0+cmVzLAorCQkucnBjX2NyZWQgPSBkYXRhLT5jcmVkLAorCX07CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRhdGEtPmlub2RlOworCWludCBzdGFibGU7CisJaW50IGZsYWdzOworCQorCWlmIChob3cgJiBGTFVTSF9TVEFCTEUpIHsKKwkJaWYgKCFORlNfSShpbm9kZSktPm5jb21taXQpCisJCQlzdGFibGUgPSBORlNfRklMRV9TWU5DOworCQllbHNlCisJCQlzdGFibGUgPSBORlNfREFUQV9TWU5DOworCX0gZWxzZQorCQlzdGFibGUgPSBORlNfVU5TVEFCTEU7CisJZGF0YS0+YXJncy5zdGFibGUgPSBzdGFibGU7CisKKwlkYXRhLT50aW1lc3RhbXAgICA9IGppZmZpZXM7CisKKwkvKiBTZXQgdGhlIGluaXRpYWwgZmxhZ3MgZm9yIHRoZSB0YXNrLiAgKi8KKwlmbGFncyA9IChob3cgJiBGTFVTSF9TWU5DKSA/IDAgOiBSUENfVEFTS19BU1lOQzsKKworCS8qIEZpbmFsaXplIHRoZSB0YXNrLiAqLworCXJwY19pbml0X3Rhc2sodGFzaywgTkZTX0NMSUVOVChpbm9kZSksIG5mczRfd3JpdGVfZG9uZSwgZmxhZ3MpOworCXJwY19jYWxsX3NldHVwKHRhc2ssICZtc2csIDApOworfQorCitzdGF0aWMgdm9pZAorbmZzNF9jb21taXRfZG9uZShzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IG5mc193cml0ZV9kYXRhICpkYXRhID0gKHN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqKSB0YXNrLT50a19jYWxsZGF0YTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGF0YS0+aW5vZGU7CisJCisJaWYgKG5mczRfYXN5bmNfaGFuZGxlX2Vycm9yKHRhc2ssIE5GU19TRVJWRVIoaW5vZGUpKSA9PSAtRUFHQUlOKSB7CisJCXJwY19yZXN0YXJ0X2NhbGwodGFzayk7CisJCXJldHVybjsKKwl9CisJLyogQ2FsbCBiYWNrIGNvbW1vbiBORlMgd3JpdGViYWNrIHByb2Nlc3NpbmcgKi8KKwluZnNfY29tbWl0X2RvbmUodGFzayk7Cit9CisKK3N0YXRpYyB2b2lkCituZnM0X3Byb2NfY29tbWl0X3NldHVwKHN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqZGF0YSwgaW50IGhvdykKK3sKKwlzdHJ1Y3QgcnBjX3Rhc2sJKnRhc2sgPSAmZGF0YS0+dGFzazsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0geworCQkucnBjX3Byb2MgPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfQ09NTUlUXSwKKwkJLnJwY19hcmdwID0gJmRhdGEtPmFyZ3MsCisJCS5ycGNfcmVzcCA9ICZkYXRhLT5yZXMsCisJCS5ycGNfY3JlZCA9IGRhdGEtPmNyZWQsCisJfTsJCisJc3RydWN0IGlub2RlICppbm9kZSA9IGRhdGEtPmlub2RlOworCWludCBmbGFnczsKKwkKKwkvKiBTZXQgdGhlIGluaXRpYWwgZmxhZ3MgZm9yIHRoZSB0YXNrLiAgKi8KKwlmbGFncyA9IChob3cgJiBGTFVTSF9TWU5DKSA/IDAgOiBSUENfVEFTS19BU1lOQzsKKworCS8qIEZpbmFsaXplIHRoZSB0YXNrLiAqLworCXJwY19pbml0X3Rhc2sodGFzaywgTkZTX0NMSUVOVChpbm9kZSksIG5mczRfY29tbWl0X2RvbmUsIGZsYWdzKTsKKwlycGNfY2FsbF9zZXR1cCh0YXNrLCAmbXNnLCAwKTsJCit9CisKKy8qCisgKiBuZnM0X3Byb2NfYXN5bmNfcmVuZXcoKTogVGhpcyBpcyBub3Qgb25lIG9mIHRoZSBuZnNfcnBjX29wczsgaXQgaXMgYSBzcGVjaWFsCisgKiBzdGFuZGFsb25lIHByb2NlZHVyZSBmb3IgcXVldWVpbmcgYW4gYXN5bmNocm9ub3VzIFJFTkVXLgorICovCitzdGF0aWMgdm9pZAorcmVuZXdfZG9uZShzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHAgPSAoc3RydWN0IG5mczRfY2xpZW50ICopdGFzay0+dGtfbXNnLnJwY19hcmdwOworCXVuc2lnbmVkIGxvbmcgdGltZXN0YW1wID0gKHVuc2lnbmVkIGxvbmcpdGFzay0+dGtfY2FsbGRhdGE7CisKKwlpZiAodGFzay0+dGtfc3RhdHVzIDwgMCkgeworCQlzd2l0Y2ggKHRhc2stPnRrX3N0YXR1cykgeworCQkJY2FzZSAtTkZTNEVSUl9TVEFMRV9DTElFTlRJRDoKKwkJCWNhc2UgLU5GUzRFUlJfRVhQSVJFRDoKKwkJCWNhc2UgLU5GUzRFUlJfQ0JfUEFUSF9ET1dOOgorCQkJCW5mczRfc2NoZWR1bGVfc3RhdGVfcmVjb3ZlcnkoY2xwKTsKKwkJfQorCQlyZXR1cm47CisJfQorCXNwaW5fbG9jaygmY2xwLT5jbF9sb2NrKTsKKwlpZiAodGltZV9iZWZvcmUoY2xwLT5jbF9sYXN0X3JlbmV3YWwsdGltZXN0YW1wKSkKKwkJY2xwLT5jbF9sYXN0X3JlbmV3YWwgPSB0aW1lc3RhbXA7CisJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7Cit9CisKK2ludAorbmZzNF9wcm9jX2FzeW5jX3JlbmV3KHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwKQoreworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfcHJvYwk9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9SRU5FV10sCisJCS5ycGNfYXJncAk9IGNscCwKKwkJLnJwY19jcmVkCT0gY2xwLT5jbF9jcmVkLAorCX07CisKKwlyZXR1cm4gcnBjX2NhbGxfYXN5bmMoY2xwLT5jbF9ycGNjbGllbnQsICZtc2csIFJQQ19UQVNLX1NPRlQsCisJCQlyZW5ld19kb25lLCAodm9pZCAqKWppZmZpZXMpOworfQorCitpbnQKK25mczRfcHJvY19yZW5ldyhzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCkKK3sKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0geworCQkucnBjX3Byb2MJPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfUkVORVddLAorCQkucnBjX2FyZ3AJPSBjbHAsCisJCS5ycGNfY3JlZAk9IGNscC0+Y2xfY3JlZCwKKwl9OworCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhjbHAtPmNsX3JwY2NsaWVudCwgJm1zZywgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCXJldHVybiBzdGF0dXM7CisJc3Bpbl9sb2NrKCZjbHAtPmNsX2xvY2spOworCWlmICh0aW1lX2JlZm9yZShjbHAtPmNsX2xhc3RfcmVuZXdhbCxub3cpKQorCQljbHAtPmNsX2xhc3RfcmVuZXdhbCA9IG5vdzsKKwlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdlIHdpbGwgbmVlZCB0byBhcnJhbmdlIGZvciB0aGUgVkZTIGxheWVyIHRvIHByb3ZpZGUgYW4gYXRvbWljIG9wZW4uCisgKiBVbnRpbCB0aGVuLCB0aGlzIG9wZW4gbWV0aG9kIGlzIHByb25lIHRvIGluZWZmaWNpZW5jeSBhbmQgcmFjZSBjb25kaXRpb25zCisgKiBkdWUgdG8gdGhlIGxvb2t1cCwgcG90ZW50aWFsIGNyZWF0ZSwgYW5kIG9wZW4gVkZTIGNhbGxzIGZyb20gc3lzX29wZW4oKQorICogcGxhY2VkIG9uIHRoZSB3aXJlLgorICovCitzdGF0aWMgaW50CituZnM0X3Byb2NfZmlsZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbHAtPmZfZGVudHJ5OworCXN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHg7CisJc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlID0gTlVMTDsKKwlzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQ7CisJaW50IHN0YXR1cyA9IC1FTk9NRU07CisKKwlkcHJpbnRrKCJuZnM0X3Byb2NfZmlsZV9vcGVuOiBzdGFydGluZyBvbiAoJS4qcy8lLipzKVxuIiwKKwkgICAgICAgICAgICAgICAgICAgICAgIChpbnQpZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLmxlbiwKKwkgICAgICAgICAgICAgICAgICAgICAgIGRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLAorCSAgICAgICAgICAgICAgICAgICAgICAgKGludClkZW50cnktPmRfbmFtZS5sZW4sIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisKKwkvKiBGaW5kIG91ciBvcGVuIHN0YXRlaWQgKi8KKwljcmVkID0gcnBjYXV0aF9sb29rdXBjcmVkKE5GU19TRVJWRVIoaW5vZGUpLT5jbGllbnQtPmNsX2F1dGgsIDApOworCWlmIChJU19FUlIoY3JlZCkpCisJCXJldHVybiBQVFJfRVJSKGNyZWQpOworCWN0eCA9IGFsbG9jX25mc19vcGVuX2NvbnRleHQoZGVudHJ5LCBjcmVkKTsKKwlwdXRfcnBjY3JlZChjcmVkKTsKKwlpZiAodW5saWtlbHkoY3R4ID09IE5VTEwpKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzdGF0dXMgPSAtRUlPOyAvKiBFUkFDRSBhY3R1YWxseSAqLworCXN0YXRlID0gbmZzNF9maW5kX3N0YXRlKGlub2RlLCBjcmVkLCBmaWxwLT5mX21vZGUpOworCWlmICh1bmxpa2VseShzdGF0ZSA9PSBOVUxMKSkKKwkJZ290byBub19zdGF0ZTsKKwljdHgtPnN0YXRlID0gc3RhdGU7CisJbmZzNF9jbG9zZV9zdGF0ZShzdGF0ZSwgZmlscC0+Zl9tb2RlKTsKKwljdHgtPm1vZGUgPSBmaWxwLT5mX21vZGU7CisJbmZzX2ZpbGVfc2V0X29wZW5fY29udGV4dChmaWxwLCBjdHgpOworCXB1dF9uZnNfb3Blbl9jb250ZXh0KGN0eCk7CisJaWYgKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQluZnNfYmVnaW5fZGF0YV91cGRhdGUoaW5vZGUpOworCXJldHVybiAwOworbm9fc3RhdGU6CisJcHJpbnRrKEtFUk5fV0FSTklORyAiTkZTOiB2NCByYWNlZCBpbiBmdW5jdGlvbiAlc1xuIiwgX19GVU5DVElPTl9fKTsKKwlwdXRfbmZzX29wZW5fY29udGV4dChjdHgpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBSZWxlYXNlIG91ciBzdGF0ZQorICovCitzdGF0aWMgaW50CituZnM0X3Byb2NfZmlsZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWlmIChmaWxwLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJbmZzX2VuZF9kYXRhX3VwZGF0ZShpbm9kZSk7CisJbmZzX2ZpbGVfY2xlYXJfb3Blbl9jb250ZXh0KGZpbHApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CituZnM0X2FzeW5jX2hhbmRsZV9lcnJvcihzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2ssIHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIpCit7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHAgPSBzZXJ2ZXItPm5mczRfc3RhdGU7CisKKwlpZiAoIWNscCB8fCB0YXNrLT50a19zdGF0dXMgPj0gMCkKKwkJcmV0dXJuIDA7CisJc3dpdGNoKHRhc2stPnRrX3N0YXR1cykgeworCQljYXNlIC1ORlM0RVJSX1NUQUxFX0NMSUVOVElEOgorCQljYXNlIC1ORlM0RVJSX1NUQUxFX1NUQVRFSUQ6CisJCWNhc2UgLU5GUzRFUlJfRVhQSVJFRDoKKwkJCXJwY19zbGVlcF9vbigmY2xwLT5jbF9ycGN3YWl0cSwgdGFzaywgTlVMTCwgTlVMTCk7CisJCQluZnM0X3NjaGVkdWxlX3N0YXRlX3JlY292ZXJ5KGNscCk7CisJCQlpZiAodGVzdF9iaXQoTkZTNENMTlRfT0ssICZjbHAtPmNsX3N0YXRlKSkKKwkJCQlycGNfd2FrZV91cF90YXNrKHRhc2spOworCQkJdGFzay0+dGtfc3RhdHVzID0gMDsKKwkJCXJldHVybiAtRUFHQUlOOworCQljYXNlIC1ORlM0RVJSX0dSQUNFOgorCQljYXNlIC1ORlM0RVJSX0RFTEFZOgorCQkJcnBjX2RlbGF5KHRhc2ssIE5GUzRfUE9MTF9SRVRSWV9NQVgpOworCQkJdGFzay0+dGtfc3RhdHVzID0gMDsKKwkJCXJldHVybiAtRUFHQUlOOworCQljYXNlIC1ORlM0RVJSX09MRF9TVEFURUlEOgorCQkJdGFzay0+dGtfc3RhdHVzID0gMDsKKwkJCXJldHVybiAtRUFHQUlOOworCX0KKwl0YXNrLT50a19zdGF0dXMgPSBuZnM0X21hcF9lcnJvcnModGFzay0+dGtfc3RhdHVzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZnM0X3dhaXRfY2xudF9yZWNvdmVyKHN0cnVjdCBycGNfY2xudCAqY2xudCwgc3RydWN0IG5mczRfY2xpZW50ICpjbHApCit7CisJREVGSU5FX1dBSVQod2FpdCk7CisJc2lnc2V0X3Qgb2xkc2V0OworCWludCBpbnRlcnJ1cHRpYmxlLCByZXMgPSAwOworCisJbWlnaHRfc2xlZXAoKTsKKworCXJwY19jbG50X3NpZ21hc2soY2xudCwgJm9sZHNldCk7CisJaW50ZXJydXB0aWJsZSA9IFRBU0tfVU5JTlRFUlJVUFRJQkxFOworCWlmIChjbG50LT5jbF9pbnRyKQorCQlpbnRlcnJ1cHRpYmxlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCXByZXBhcmVfdG9fd2FpdCgmY2xwLT5jbF93YWl0cSwgJndhaXQsIGludGVycnVwdGlibGUpOworCW5mczRfc2NoZWR1bGVfc3RhdGVfcmVjb3ZlcnkoY2xwKTsKKwlpZiAoY2xudC0+Y2xfaW50ciAmJiBzaWduYWxsZWQoKSkKKwkJcmVzID0gLUVSRVNUQVJUU1lTOworCWVsc2UgaWYgKCF0ZXN0X2JpdChORlM0Q0xOVF9PSywgJmNscC0+Y2xfc3RhdGUpKQorCQlzY2hlZHVsZSgpOworCWZpbmlzaF93YWl0KCZjbHAtPmNsX3dhaXRxLCAmd2FpdCk7CisJcnBjX2NsbnRfc2lndW5tYXNrKGNsbnQsICZvbGRzZXQpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgbmZzNF9kZWxheShzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQsIGxvbmcgKnRpbWVvdXQpCit7CisJc2lnc2V0X3Qgb2xkc2V0OworCWludCByZXMgPSAwOworCisJbWlnaHRfc2xlZXAoKTsKKworCWlmICgqdGltZW91dCA8PSAwKQorCQkqdGltZW91dCA9IE5GUzRfUE9MTF9SRVRSWV9NSU47CisJaWYgKCp0aW1lb3V0ID4gTkZTNF9QT0xMX1JFVFJZX01BWCkKKwkJKnRpbWVvdXQgPSBORlM0X1BPTExfUkVUUllfTUFYOworCXJwY19jbG50X3NpZ21hc2soY2xudCwgJm9sZHNldCk7CisJaWYgKGNsbnQtPmNsX2ludHIpIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dCgqdGltZW91dCk7CisJCWlmIChzaWduYWxsZWQoKSkKKwkJCXJlcyA9IC1FUkVTVEFSVFNZUzsKKwl9IGVsc2UgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoKnRpbWVvdXQpOworCX0KKwlycGNfY2xudF9zaWd1bm1hc2soY2xudCwgJm9sZHNldCk7CisJKnRpbWVvdXQgPDw9IDE7CisJcmV0dXJuIHJlczsKK30KKworLyogVGhpcyBpcyB0aGUgZXJyb3IgaGFuZGxpbmcgcm91dGluZSBmb3IgcHJvY2Vzc2VzIHRoYXQgYXJlIGFsbG93ZWQKKyAqIHRvIHNsZWVwLgorICovCitpbnQgbmZzNF9oYW5kbGVfZXhjZXB0aW9uKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIGludCBlcnJvcmNvZGUsIHN0cnVjdCBuZnM0X2V4Y2VwdGlvbiAqZXhjZXB0aW9uKQoreworCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwID0gc2VydmVyLT5uZnM0X3N0YXRlOworCWludCByZXQgPSBlcnJvcmNvZGU7CisKKwlleGNlcHRpb24tPnJldHJ5ID0gMDsKKwlzd2l0Y2goZXJyb3Jjb2RlKSB7CisJCWNhc2UgMDoKKwkJCXJldHVybiAwOworCQljYXNlIC1ORlM0RVJSX1NUQUxFX0NMSUVOVElEOgorCQljYXNlIC1ORlM0RVJSX1NUQUxFX1NUQVRFSUQ6CisJCWNhc2UgLU5GUzRFUlJfRVhQSVJFRDoKKwkJCXJldCA9IG5mczRfd2FpdF9jbG50X3JlY292ZXIoc2VydmVyLT5jbGllbnQsIGNscCk7CisJCQlpZiAocmV0ID09IDApCisJCQkJZXhjZXB0aW9uLT5yZXRyeSA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAtTkZTNEVSUl9HUkFDRToKKwkJY2FzZSAtTkZTNEVSUl9ERUxBWToKKwkJCXJldCA9IG5mczRfZGVsYXkoc2VydmVyLT5jbGllbnQsICZleGNlcHRpb24tPnRpbWVvdXQpOworCQkJaWYgKHJldCA9PSAwKQorCQkJCWV4Y2VwdGlvbi0+cmV0cnkgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgLU5GUzRFUlJfT0xEX1NUQVRFSUQ6CisJCQlpZiAocmV0ID09IDApCisJCQkJZXhjZXB0aW9uLT5yZXRyeSA9IDE7CisJfQorCS8qIFdlIGZhaWxlZCB0byBoYW5kbGUgdGhlIGVycm9yICovCisJcmV0dXJuIG5mczRfbWFwX2Vycm9ycyhyZXQpOworfQorCitpbnQgbmZzNF9wcm9jX3NldGNsaWVudGlkKHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwLCB1MzIgcHJvZ3JhbSwgdW5zaWduZWQgc2hvcnQgcG9ydCkKK3sKKwluZnM0X3ZlcmlmaWVyIHNjX3ZlcmlmaWVyOworCXN0cnVjdCBuZnM0X3NldGNsaWVudGlkIHNldGNsaWVudGlkID0geworCQkuc2NfdmVyaWZpZXIgPSAmc2NfdmVyaWZpZXIsCisJCS5zY19wcm9nID0gcHJvZ3JhbSwKKwl9OworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfcHJvYyA9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9TRVRDTElFTlRJRF0sCisJCS5ycGNfYXJncCA9ICZzZXRjbGllbnRpZCwKKwkJLnJwY19yZXNwID0gY2xwLAorCQkucnBjX2NyZWQgPSBjbHAtPmNsX2NyZWQsCisJfTsKKwl1MzIgKnA7CisJaW50IGxvb3AgPSAwOworCWludCBzdGF0dXM7CisKKwlwID0gKHUzMiopc2NfdmVyaWZpZXIuZGF0YTsKKwkqcCsrID0gaHRvbmwoKHUzMiljbHAtPmNsX2Jvb3RfdGltZS50dl9zZWMpOworCSpwID0gaHRvbmwoKHUzMiljbHAtPmNsX2Jvb3RfdGltZS50dl9uc2VjKTsKKworCWZvcig7OykgeworCQlzZXRjbGllbnRpZC5zY19uYW1lX2xlbiA9IHNjbnByaW50ZihzZXRjbGllbnRpZC5zY19uYW1lLAorCQkJCXNpemVvZihzZXRjbGllbnRpZC5zY19uYW1lKSwgIiVzLyV1LiV1LiV1LiV1ICVzICV1IiwKKwkJCQljbHAtPmNsX2lwYWRkciwgTklQUVVBRChjbHAtPmNsX2FkZHIuc19hZGRyKSwKKwkJCQljbHAtPmNsX2NyZWQtPmNyX29wcy0+Y3JfbmFtZSwKKwkJCQljbHAtPmNsX2lkX3VuaXF1aWZpZXIpOworCQlzZXRjbGllbnRpZC5zY19uZXRpZF9sZW4gPSBzY25wcmludGYoc2V0Y2xpZW50aWQuc2NfbmV0aWQsCisJCQkJc2l6ZW9mKHNldGNsaWVudGlkLnNjX25ldGlkKSwgInRjcCIpOworCQlzZXRjbGllbnRpZC5zY191YWRkcl9sZW4gPSBzY25wcmludGYoc2V0Y2xpZW50aWQuc2NfdWFkZHIsCisJCQkJc2l6ZW9mKHNldGNsaWVudGlkLnNjX3VhZGRyKSwgIiVzLiVkLiVkIiwKKwkJCQljbHAtPmNsX2lwYWRkciwgcG9ydCA+PiA4LCBwb3J0ICYgMjU1KTsKKworCQlzdGF0dXMgPSBycGNfY2FsbF9zeW5jKGNscC0+Y2xfcnBjY2xpZW50LCAmbXNnLCAwKTsKKwkJaWYgKHN0YXR1cyAhPSAtTkZTNEVSUl9DTElEX0lOVVNFKQorCQkJYnJlYWs7CisJCWlmIChzaWduYWxsZWQoKSkKKwkJCWJyZWFrOworCQlpZiAobG9vcCsrICYgMSkKKwkJCXNzbGVlcChjbHAtPmNsX2xlYXNlX3RpbWUgKyAxKTsKKwkJZWxzZQorCQkJaWYgKCsrY2xwLT5jbF9pZF91bmlxdWlmaWVyID09IDApCisJCQkJYnJlYWs7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK2ludAorbmZzNF9wcm9jX3NldGNsaWVudGlkX2NvbmZpcm0oc3RydWN0IG5mczRfY2xpZW50ICpjbHApCit7CisJc3RydWN0IG5mc19mc2luZm8gZnNpbmZvOworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfcHJvYyA9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9TRVRDTElFTlRJRF9DT05GSVJNXSwKKwkJLnJwY19hcmdwID0gY2xwLAorCQkucnBjX3Jlc3AgPSAmZnNpbmZvLAorCQkucnBjX2NyZWQgPSBjbHAtPmNsX2NyZWQsCisJfTsKKwl1bnNpZ25lZCBsb25nIG5vdzsKKwlpbnQgc3RhdHVzOworCisJbm93ID0gamlmZmllczsKKwlzdGF0dXMgPSBycGNfY2FsbF9zeW5jKGNscC0+Y2xfcnBjY2xpZW50LCAmbXNnLCAwKTsKKwlpZiAoc3RhdHVzID09IDApIHsKKwkJc3Bpbl9sb2NrKCZjbHAtPmNsX2xvY2spOworCQljbHAtPmNsX2xlYXNlX3RpbWUgPSBmc2luZm8ubGVhc2VfdGltZSAqIEhaOworCQljbHAtPmNsX2xhc3RfcmVuZXdhbCA9IG5vdzsKKwkJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgX25mczRfcHJvY19kZWxlZ3JldHVybihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQsIGNvbnN0IG5mczRfc3RhdGVpZCAqc3RhdGVpZCkKK3sKKwlzdHJ1Y3QgbmZzNF9kZWxlZ3JldHVybmFyZ3MgYXJncyA9IHsKKwkJLmZoYW5kbGUgPSBORlNfRkgoaW5vZGUpLAorCQkuc3RhdGVpZCA9IHN0YXRlaWQsCisJfTsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0geworCQkucnBjX3Byb2MgPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfREVMRUdSRVRVUk5dLAorCQkucnBjX2FyZ3AgPSAmYXJncywKKwkJLnJwY19jcmVkID0gY3JlZCwKKwl9OworCisJcmV0dXJuIHJwY19jYWxsX3N5bmMoTkZTX0NMSUVOVChpbm9kZSksICZtc2csIDApOworfQorCitpbnQgbmZzNF9wcm9jX2RlbGVncmV0dXJuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBycGNfY3JlZCAqY3JlZCwgY29uc3QgbmZzNF9zdGF0ZWlkICpzdGF0ZWlkKQoreworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0VSVkVSKGlub2RlKTsKKwlzdHJ1Y3QgbmZzNF9leGNlcHRpb24gZXhjZXB0aW9uID0geyB9OworCWludCBlcnI7CisJZG8geworCQllcnIgPSBfbmZzNF9wcm9jX2RlbGVncmV0dXJuKGlub2RlLCBjcmVkLCBzdGF0ZWlkKTsKKwkJc3dpdGNoIChlcnIpIHsKKwkJCWNhc2UgLU5GUzRFUlJfU1RBTEVfU1RBVEVJRDoKKwkJCWNhc2UgLU5GUzRFUlJfRVhQSVJFRDoKKwkJCQluZnM0X3NjaGVkdWxlX3N0YXRlX3JlY292ZXJ5KHNlcnZlci0+bmZzNF9zdGF0ZSk7CisJCQljYXNlIDA6CisJCQkJcmV0dXJuIDA7CisJCX0KKwkJZXJyID0gbmZzNF9oYW5kbGVfZXhjZXB0aW9uKHNlcnZlciwgZXJyLCAmZXhjZXB0aW9uKTsKKwl9IHdoaWxlIChleGNlcHRpb24ucmV0cnkpOworCXJldHVybiBlcnI7Cit9CisKKyNkZWZpbmUgTkZTNF9MT0NLX01JTlRJTUVPVVQgKDEgKiBIWikKKyNkZWZpbmUgTkZTNF9MT0NLX01BWFRJTUVPVVQgKDMwICogSFopCisKKy8qIAorICogc2xlZXAsIHdpdGggZXhwb25lbnRpYWwgYmFja29mZiwgYW5kIHJldHJ5IHRoZSBMT0NLIG9wZXJhdGlvbi4gCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nCituZnM0X3NldF9sb2NrX3Rhc2tfcmV0cnkodW5zaWduZWQgbG9uZyB0aW1lb3V0KQoreworCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCXNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7CisJdGltZW91dCA8PD0gMTsKKwlpZiAodGltZW91dCA+IE5GUzRfTE9DS19NQVhUSU1FT1VUKQorCQlyZXR1cm4gTkZTNF9MT0NLX01BWFRJTUVPVVQ7CisJcmV0dXJuIHRpbWVvdXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CituZnM0X2xja190eXBlKGludCBjbWQsIHN0cnVjdCBmaWxlX2xvY2sgKnJlcXVlc3QpCit7CisJLyogc2V0IGxvY2sgdHlwZSAqLworCXN3aXRjaCAocmVxdWVzdC0+ZmxfdHlwZSkgeworCQljYXNlIEZfUkRMQ0s6CisJCQlyZXR1cm4gSVNfU0VUTEtXKGNtZCkgPyBORlM0X1JFQURXX0xUIDogTkZTNF9SRUFEX0xUOworCQljYXNlIEZfV1JMQ0s6CisJCQlyZXR1cm4gSVNfU0VUTEtXKGNtZCkgPyBORlM0X1dSSVRFV19MVCA6IE5GUzRfV1JJVEVfTFQ7CisJCWNhc2UgRl9VTkxDSzoKKwkJCXJldHVybiBORlM0X1dSSVRFX0xUOyAKKwl9CisJQlVHKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDY0X3QKK25mczRfbGNrX2xlbmd0aChzdHJ1Y3QgZmlsZV9sb2NrICpyZXF1ZXN0KQoreworCWlmIChyZXF1ZXN0LT5mbF9lbmQgPT0gT0ZGU0VUX01BWCkKKwkJcmV0dXJuIH4odWludDY0X3QpMDsKKwlyZXR1cm4gcmVxdWVzdC0+ZmxfZW5kIC0gcmVxdWVzdC0+Zmxfc3RhcnQgKyAxOworfQorCitzdGF0aWMgaW50IF9uZnM0X3Byb2NfZ2V0bGsoc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlLCBpbnQgY21kLCBzdHJ1Y3QgZmlsZV9sb2NrICpyZXF1ZXN0KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBzdGF0ZS0+aW5vZGU7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IE5GU19TRVJWRVIoaW5vZGUpOworCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwID0gc2VydmVyLT5uZnM0X3N0YXRlOworCXN0cnVjdCBuZnNfbG9ja2FyZ3MgYXJnID0geworCQkuZmggPSBORlNfRkgoaW5vZGUpLAorCQkudHlwZSA9IG5mczRfbGNrX3R5cGUoY21kLCByZXF1ZXN0KSwKKwkJLm9mZnNldCA9IHJlcXVlc3QtPmZsX3N0YXJ0LAorCQkubGVuZ3RoID0gbmZzNF9sY2tfbGVuZ3RoKHJlcXVlc3QpLAorCX07CisJc3RydWN0IG5mc19sb2NrcmVzIHJlcyA9IHsKKwkJLnNlcnZlciA9IHNlcnZlciwKKwl9OworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfcHJvYwk9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9MT0NLVF0sCisJCS5ycGNfYXJncCAgICAgICA9ICZhcmcsCisJCS5ycGNfcmVzcCAgICAgICA9ICZyZXMsCisJCS5ycGNfY3JlZAk9IHN0YXRlLT5vd25lci0+c29fY3JlZCwKKwl9OworCXN0cnVjdCBuZnNfbG93bmVyIG5sbzsKKwlzdHJ1Y3QgbmZzNF9sb2NrX3N0YXRlICpsc3A7CisJaW50IHN0YXR1czsKKworCWRvd25fcmVhZCgmY2xwLT5jbF9zZW0pOworCW5sby5jbGllbnRpZCA9IGNscC0+Y2xfY2xpZW50aWQ7CisJZG93bigmc3RhdGUtPmxvY2tfc2VtYSk7CisJbHNwID0gbmZzNF9maW5kX2xvY2tfc3RhdGUoc3RhdGUsIHJlcXVlc3QtPmZsX293bmVyKTsKKwlpZiAobHNwKQorCQlubG8uaWQgPSBsc3AtPmxzX2lkOyAKKwllbHNlIHsKKwkJc3Bpbl9sb2NrKCZjbHAtPmNsX2xvY2spOworCQlubG8uaWQgPSBuZnM0X2FsbG9jX2xvY2tvd25lcl9pZChjbHApOworCQlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKKwl9CisJYXJnLnUubG9ja3QgPSAmbmxvOworCXN0YXR1cyA9IHJwY19jYWxsX3N5bmMoc2VydmVyLT5jbGllbnQsICZtc2csIDApOworCWlmICghc3RhdHVzKSB7CisJCXJlcXVlc3QtPmZsX3R5cGUgPSBGX1VOTENLOworCX0gZWxzZSBpZiAoc3RhdHVzID09IC1ORlM0RVJSX0RFTklFRCkgeworCQlpbnQ2NF90IGxlbiwgc3RhcnQsIGVuZDsKKwkJc3RhcnQgPSByZXMudS5kZW5pZWQub2Zmc2V0OworCQlsZW4gPSByZXMudS5kZW5pZWQubGVuZ3RoOworCQllbmQgPSBzdGFydCArIGxlbiAtIDE7CisJCWlmIChlbmQgPCAwIHx8IGxlbiA9PSAwKQorCQkJcmVxdWVzdC0+ZmxfZW5kID0gT0ZGU0VUX01BWDsKKwkJZWxzZQorCQkJcmVxdWVzdC0+ZmxfZW5kID0gKGxvZmZfdCllbmQ7CisJCXJlcXVlc3QtPmZsX3N0YXJ0ID0gKGxvZmZfdClzdGFydDsKKwkJcmVxdWVzdC0+ZmxfdHlwZSA9IEZfV1JMQ0s7CisJCWlmIChyZXMudS5kZW5pZWQudHlwZSAmIDEpCisJCQlyZXF1ZXN0LT5mbF90eXBlID0gRl9SRExDSzsKKwkJcmVxdWVzdC0+ZmxfcGlkID0gMDsKKwkJc3RhdHVzID0gMDsKKwl9CisJaWYgKGxzcCkKKwkJbmZzNF9wdXRfbG9ja19zdGF0ZShsc3ApOworCXVwKCZzdGF0ZS0+bG9ja19zZW1hKTsKKwl1cF9yZWFkKCZjbHAtPmNsX3NlbSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBuZnM0X3Byb2NfZ2V0bGsoc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlLCBpbnQgY21kLCBzdHJ1Y3QgZmlsZV9sb2NrICpyZXF1ZXN0KQoreworCXN0cnVjdCBuZnM0X2V4Y2VwdGlvbiBleGNlcHRpb24gPSB7IH07CisJaW50IGVycjsKKworCWRvIHsKKwkJZXJyID0gbmZzNF9oYW5kbGVfZXhjZXB0aW9uKE5GU19TRVJWRVIoc3RhdGUtPmlub2RlKSwKKwkJCQlfbmZzNF9wcm9jX2dldGxrKHN0YXRlLCBjbWQsIHJlcXVlc3QpLAorCQkJCSZleGNlcHRpb24pOworCX0gd2hpbGUgKGV4Y2VwdGlvbi5yZXRyeSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBkb192ZnNfbG9jayhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGZpbGVfbG9jayAqZmwpCit7CisJaW50IHJlcyA9IDA7CisJc3dpdGNoIChmbC0+ZmxfZmxhZ3MgJiAoRkxfUE9TSVh8RkxfRkxPQ0spKSB7CisJCWNhc2UgRkxfUE9TSVg6CisJCQlyZXMgPSBwb3NpeF9sb2NrX2ZpbGVfd2FpdChmaWxlLCBmbCk7CisJCQlicmVhazsKKwkJY2FzZSBGTF9GTE9DSzoKKwkJCXJlcyA9IGZsb2NrX2xvY2tfZmlsZV93YWl0KGZpbGUsIGZsKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQlVHKCk7CisJfQorCWlmIChyZXMgPCAwKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVkZTIGlzIG91dCBvZiBzeW5jIHdpdGggbG9jayBtYW5hZ2VyIVxuIiwKKwkJCQlfX0ZVTkNUSU9OX18pOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgX25mczRfcHJvY191bmxjayhzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUsIGludCBjbWQsIHN0cnVjdCBmaWxlX2xvY2sgKnJlcXVlc3QpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHN0YXRlLT5pbm9kZTsKKwlzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyID0gTkZTX1NFUlZFUihpbm9kZSk7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHAgPSBzZXJ2ZXItPm5mczRfc3RhdGU7CisJc3RydWN0IG5mc19sb2NrYXJncyBhcmcgPSB7CisJCS5maCA9IE5GU19GSChpbm9kZSksCisJCS50eXBlID0gbmZzNF9sY2tfdHlwZShjbWQsIHJlcXVlc3QpLAorCQkub2Zmc2V0ID0gcmVxdWVzdC0+Zmxfc3RhcnQsCisJCS5sZW5ndGggPSBuZnM0X2xja19sZW5ndGgocmVxdWVzdCksCisJfTsKKwlzdHJ1Y3QgbmZzX2xvY2tyZXMgcmVzID0geworCQkuc2VydmVyID0gc2VydmVyLAorCX07CisJc3RydWN0IHJwY19tZXNzYWdlIG1zZyA9IHsKKwkJLnJwY19wcm9jCT0gJm5mczRfcHJvY2VkdXJlc1tORlNQUk9DNF9DTE5UX0xPQ0tVXSwKKwkJLnJwY19hcmdwICAgICAgID0gJmFyZywKKwkJLnJwY19yZXNwICAgICAgID0gJnJlcywKKwkJLnJwY19jcmVkCT0gc3RhdGUtPm93bmVyLT5zb19jcmVkLAorCX07CisJc3RydWN0IG5mczRfbG9ja19zdGF0ZSAqbHNwOworCXN0cnVjdCBuZnNfbG9ja3Vfb3BhcmdzIGx1YXJnczsKKwlpbnQgc3RhdHVzID0gMDsKKwkJCQorCWRvd25fcmVhZCgmY2xwLT5jbF9zZW0pOworCWRvd24oJnN0YXRlLT5sb2NrX3NlbWEpOworCWxzcCA9IG5mczRfZmluZF9sb2NrX3N0YXRlKHN0YXRlLCByZXF1ZXN0LT5mbF9vd25lcik7CisJaWYgKCFsc3ApCisJCWdvdG8gb3V0OworCS8qIFdlIG1pZ2h0IGhhdmUgbG9zdCB0aGUgbG9ja3MhICovCisJaWYgKChsc3AtPmxzX2ZsYWdzICYgTkZTX0xPQ0tfSU5JVElBTElaRUQpICE9IDApIHsKKwkJbHVhcmdzLnNlcWlkID0gbHNwLT5sc19zZXFpZDsKKwkJbWVtY3B5KCZsdWFyZ3Muc3RhdGVpZCwgJmxzcC0+bHNfc3RhdGVpZCwgc2l6ZW9mKGx1YXJncy5zdGF0ZWlkKSk7CisJCWFyZy51LmxvY2t1ID0gJmx1YXJnczsKKwkJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhzZXJ2ZXItPmNsaWVudCwgJm1zZywgUlBDX1RBU0tfTk9JTlRSKTsKKwkJbmZzNF9pbmNyZW1lbnRfbG9ja19zZXFpZChzdGF0dXMsIGxzcCk7CisJfQorCisJaWYgKHN0YXR1cyA9PSAwKSB7CisJCW1lbWNweSgmbHNwLT5sc19zdGF0ZWlkLCAgJnJlcy51LnN0YXRlaWQsIAorCQkJCXNpemVvZihsc3AtPmxzX3N0YXRlaWQpKTsKKwkJbmZzNF9ub3RpZnlfdW5sY2soc3RhdGUsIHJlcXVlc3QsIGxzcCk7CisJfQorCW5mczRfcHV0X2xvY2tfc3RhdGUobHNwKTsKK291dDoKKwl1cCgmc3RhdGUtPmxvY2tfc2VtYSk7CisJaWYgKHN0YXR1cyA9PSAwKQorCQlkb192ZnNfbG9jayhyZXF1ZXN0LT5mbF9maWxlLCByZXF1ZXN0KTsKKwl1cF9yZWFkKCZjbHAtPmNsX3NlbSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBuZnM0X3Byb2NfdW5sY2soc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlLCBpbnQgY21kLCBzdHJ1Y3QgZmlsZV9sb2NrICpyZXF1ZXN0KQoreworCXN0cnVjdCBuZnM0X2V4Y2VwdGlvbiBleGNlcHRpb24gPSB7IH07CisJaW50IGVycjsKKworCWRvIHsKKwkJZXJyID0gbmZzNF9oYW5kbGVfZXhjZXB0aW9uKE5GU19TRVJWRVIoc3RhdGUtPmlub2RlKSwKKwkJCQlfbmZzNF9wcm9jX3VubGNrKHN0YXRlLCBjbWQsIHJlcXVlc3QpLAorCQkJCSZleGNlcHRpb24pOworCX0gd2hpbGUgKGV4Y2VwdGlvbi5yZXRyeSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfbmZzNF9kb19zZXRsayhzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUsIGludCBjbWQsIHN0cnVjdCBmaWxlX2xvY2sgKnJlcXVlc3QsIGludCByZWNsYWltKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBzdGF0ZS0+aW5vZGU7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IE5GU19TRVJWRVIoaW5vZGUpOworCXN0cnVjdCBuZnM0X2xvY2tfc3RhdGUgKmxzcDsKKwlzdHJ1Y3QgbmZzX2xvY2thcmdzIGFyZyA9IHsKKwkJLmZoID0gTkZTX0ZIKGlub2RlKSwKKwkJLnR5cGUgPSBuZnM0X2xja190eXBlKGNtZCwgcmVxdWVzdCksCisJCS5vZmZzZXQgPSByZXF1ZXN0LT5mbF9zdGFydCwKKwkJLmxlbmd0aCA9IG5mczRfbGNrX2xlbmd0aChyZXF1ZXN0KSwKKwl9OworCXN0cnVjdCBuZnNfbG9ja3JlcyByZXMgPSB7CisJCS5zZXJ2ZXIgPSBzZXJ2ZXIsCisJfTsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UgbXNnID0geworCQkucnBjX3Byb2MJPSAmbmZzNF9wcm9jZWR1cmVzW05GU1BST0M0X0NMTlRfTE9DS10sCisJCS5ycGNfYXJncCAgICAgICA9ICZhcmcsCisJCS5ycGNfcmVzcCAgICAgICA9ICZyZXMsCisJCS5ycGNfY3JlZAk9IHN0YXRlLT5vd25lci0+c29fY3JlZCwKKwl9OworCXN0cnVjdCBuZnNfbG9ja19vcGFyZ3MgbGFyZ3MgPSB7CisJCS5yZWNsYWltID0gcmVjbGFpbSwKKwkJLm5ld19sb2NrX293bmVyID0gMCwKKwl9OworCWludCBzdGF0dXM7CisKKwlsc3AgPSBuZnM0X2dldF9sb2NrX3N0YXRlKHN0YXRlLCByZXF1ZXN0LT5mbF9vd25lcik7CisJaWYgKGxzcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoIShsc3AtPmxzX2ZsYWdzICYgTkZTX0xPQ0tfSU5JVElBTElaRUQpKSB7CisJCXN0cnVjdCBuZnM0X3N0YXRlX293bmVyICpvd25lciA9IHN0YXRlLT5vd25lcjsKKwkJc3RydWN0IG5mc19vcGVuX3RvX2xvY2sgb3RsID0geworCQkJLmxvY2tfb3duZXIgPSB7CisJCQkJLmNsaWVudGlkID0gc2VydmVyLT5uZnM0X3N0YXRlLT5jbF9jbGllbnRpZCwKKwkJCX0sCisJCX07CisKKwkJb3RsLmxvY2tfc2VxaWQgPSBsc3AtPmxzX3NlcWlkOworCQlvdGwubG9ja19vd25lci5pZCA9IGxzcC0+bHNfaWQ7CisJCW1lbWNweSgmb3RsLm9wZW5fc3RhdGVpZCwgJnN0YXRlLT5zdGF0ZWlkLCBzaXplb2Yob3RsLm9wZW5fc3RhdGVpZCkpOworCQlsYXJncy51Lm9wZW5fbG9jayA9ICZvdGw7CisJCWxhcmdzLm5ld19sb2NrX293bmVyID0gMTsKKwkJYXJnLnUubG9jayA9ICZsYXJnczsKKwkJZG93bigmb3duZXItPnNvX3NlbWEpOworCQlvdGwub3Blbl9zZXFpZCA9IG93bmVyLT5zb19zZXFpZDsKKwkJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhzZXJ2ZXItPmNsaWVudCwgJm1zZywgUlBDX1RBU0tfTk9JTlRSKTsKKwkJLyogaW5jcmVtZW50IG9wZW5fb3duZXIgc2VxaWQgb24gc3VjY2VzcywgYW5kIAorCQkqIHNlcWlkIG11dGF0aW5nIGVycm9ycyAqLworCQluZnM0X2luY3JlbWVudF9zZXFpZChzdGF0dXMsIG93bmVyKTsKKwkJdXAoJm93bmVyLT5zb19zZW1hKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgbmZzX2V4aXN0X2xvY2sgZWwgPSB7CisJCQkuc2VxaWQgPSBsc3AtPmxzX3NlcWlkLAorCQl9OworCQltZW1jcHkoJmVsLnN0YXRlaWQsICZsc3AtPmxzX3N0YXRlaWQsIHNpemVvZihlbC5zdGF0ZWlkKSk7CisJCWxhcmdzLnUuZXhpc3RfbG9jayA9ICZlbDsKKwkJbGFyZ3MubmV3X2xvY2tfb3duZXIgPSAwOworCQlhcmcudS5sb2NrID0gJmxhcmdzOworCQlzdGF0dXMgPSBycGNfY2FsbF9zeW5jKHNlcnZlci0+Y2xpZW50LCAmbXNnLCBSUENfVEFTS19OT0lOVFIpOworCX0KKwkvKiBpbmNyZW1lbnQgc2VxaWQgb24gc3VjY2VzcywgYW5kICogc2VxaWQgbXV0YXRpbmcgZXJyb3JzKi8KKwluZnM0X2luY3JlbWVudF9sb2NrX3NlcWlkKHN0YXR1cywgbHNwKTsKKwkvKiBzYXZlIHRoZSByZXR1cm5lZCBzdGF0ZWlkLiAqLworCWlmIChzdGF0dXMgPT0gMCkgeworCQltZW1jcHkoJmxzcC0+bHNfc3RhdGVpZCwgJnJlcy51LnN0YXRlaWQsIHNpemVvZihuZnM0X3N0YXRlaWQpKTsKKwkJbHNwLT5sc19mbGFncyB8PSBORlNfTE9DS19JTklUSUFMSVpFRDsKKwkJaWYgKCFyZWNsYWltKQorCQkJbmZzNF9ub3RpZnlfc2V0bGsoc3RhdGUsIHJlcXVlc3QsIGxzcCk7CisJfSBlbHNlIGlmIChzdGF0dXMgPT0gLU5GUzRFUlJfREVOSUVEKQorCQlzdGF0dXMgPSAtRUFHQUlOOworCW5mczRfcHV0X2xvY2tfc3RhdGUobHNwKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IG5mczRfbG9ja19yZWNsYWltKHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwgc3RydWN0IGZpbGVfbG9jayAqcmVxdWVzdCkKK3sKKwlyZXR1cm4gX25mczRfZG9fc2V0bGsoc3RhdGUsIEZfU0VUTEssIHJlcXVlc3QsIDEpOworfQorCitzdGF0aWMgaW50IG5mczRfbG9ja19leHBpcmVkKHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwgc3RydWN0IGZpbGVfbG9jayAqcmVxdWVzdCkKK3sKKwlyZXR1cm4gX25mczRfZG9fc2V0bGsoc3RhdGUsIEZfU0VUTEssIHJlcXVlc3QsIDApOworfQorCitzdGF0aWMgaW50IF9uZnM0X3Byb2Nfc2V0bGsoc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlLCBpbnQgY21kLCBzdHJ1Y3QgZmlsZV9sb2NrICpyZXF1ZXN0KQoreworCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwID0gc3RhdGUtPm93bmVyLT5zb19jbGllbnQ7CisJaW50IHN0YXR1czsKKworCWRvd25fcmVhZCgmY2xwLT5jbF9zZW0pOworCWRvd24oJnN0YXRlLT5sb2NrX3NlbWEpOworCXN0YXR1cyA9IF9uZnM0X2RvX3NldGxrKHN0YXRlLCBjbWQsIHJlcXVlc3QsIDApOworCXVwKCZzdGF0ZS0+bG9ja19zZW1hKTsKKwlpZiAoc3RhdHVzID09IDApIHsKKwkJLyogTm90ZTogd2UgYWx3YXlzIHdhbnQgdG8gc2xlZXAgaGVyZSEgKi8KKwkJcmVxdWVzdC0+ZmxfZmxhZ3MgfD0gRkxfU0xFRVA7CisJCWlmIChkb192ZnNfbG9jayhyZXF1ZXN0LT5mbF9maWxlLCByZXF1ZXN0KSA8IDApCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogVkZTIGlzIG91dCBvZiBzeW5jIHdpdGggbG9jayBtYW5hZ2VyIVxuIiwgX19GVU5DVElPTl9fKTsKKwl9CisJdXBfcmVhZCgmY2xwLT5jbF9zZW0pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgbmZzNF9wcm9jX3NldGxrKHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwgaW50IGNtZCwgc3RydWN0IGZpbGVfbG9jayAqcmVxdWVzdCkKK3sKKwlzdHJ1Y3QgbmZzNF9leGNlcHRpb24gZXhjZXB0aW9uID0geyB9OworCWludCBlcnI7CisKKwlkbyB7CisJCWVyciA9IG5mczRfaGFuZGxlX2V4Y2VwdGlvbihORlNfU0VSVkVSKHN0YXRlLT5pbm9kZSksCisJCQkJX25mczRfcHJvY19zZXRsayhzdGF0ZSwgY21kLCByZXF1ZXN0KSwKKwkJCQkmZXhjZXB0aW9uKTsKKwl9IHdoaWxlIChleGNlcHRpb24ucmV0cnkpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQKK25mczRfcHJvY19sb2NrKHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgY21kLCBzdHJ1Y3QgZmlsZV9sb2NrICpyZXF1ZXN0KQoreworCXN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHg7CisJc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlOworCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IE5GUzRfTE9DS19NSU5USU1FT1VUOworCWludCBzdGF0dXM7CisKKwkvKiB2ZXJpZnkgb3BlbiBzdGF0ZSAqLworCWN0eCA9IChzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqKWZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdGF0ZSA9IGN0eC0+c3RhdGU7CisKKwlpZiAocmVxdWVzdC0+Zmxfc3RhcnQgPCAwIHx8IHJlcXVlc3QtPmZsX2VuZCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKElTX0dFVExLKGNtZCkpCisJCXJldHVybiBuZnM0X3Byb2NfZ2V0bGsoc3RhdGUsIEZfR0VUTEssIHJlcXVlc3QpOworCisJaWYgKCEoSVNfU0VUTEsoY21kKSB8fCBJU19TRVRMS1coY21kKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHJlcXVlc3QtPmZsX3R5cGUgPT0gRl9VTkxDSykKKwkJcmV0dXJuIG5mczRfcHJvY191bmxjayhzdGF0ZSwgY21kLCByZXF1ZXN0KTsKKworCWRvIHsKKwkJc3RhdHVzID0gbmZzNF9wcm9jX3NldGxrKHN0YXRlLCBjbWQsIHJlcXVlc3QpOworCQlpZiAoKHN0YXR1cyAhPSAtRUFHQUlOKSB8fCBJU19TRVRMSyhjbWQpKQorCQkJYnJlYWs7CisJCXRpbWVvdXQgPSBuZnM0X3NldF9sb2NrX3Rhc2tfcmV0cnkodGltZW91dCk7CisJCXN0YXR1cyA9IC1FUkVTVEFSVFNZUzsKKwkJaWYgKHNpZ25hbGxlZCgpKQorCQkJYnJlYWs7CisJfSB3aGlsZShzdGF0dXMgPCAwKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0cnVjdCBuZnM0X3N0YXRlX3JlY292ZXJ5X29wcyBuZnM0X3JlYm9vdF9yZWNvdmVyeV9vcHMgPSB7CisJLnJlY292ZXJfb3Blbgk9IG5mczRfb3Blbl9yZWNsYWltLAorCS5yZWNvdmVyX2xvY2sJPSBuZnM0X2xvY2tfcmVjbGFpbSwKK307CisKK3N0cnVjdCBuZnM0X3N0YXRlX3JlY292ZXJ5X29wcyBuZnM0X25ldHdvcmtfcGFydGl0aW9uX3JlY292ZXJ5X29wcyA9IHsKKwkucmVjb3Zlcl9vcGVuCT0gbmZzNF9vcGVuX2V4cGlyZWQsCisJLnJlY292ZXJfbG9jawk9IG5mczRfbG9ja19leHBpcmVkLAorfTsKKworc3RydWN0IG5mc19ycGNfb3BzCW5mc192NF9jbGllbnRvcHMgPSB7CisJLnZlcnNpb24JPSA0LAkJCS8qIHByb3RvY29sIHZlcnNpb24gKi8KKwkuZGVudHJ5X29wcwk9ICZuZnM0X2RlbnRyeV9vcGVyYXRpb25zLAorCS5kaXJfaW5vZGVfb3BzCT0gJm5mczRfZGlyX2lub2RlX29wZXJhdGlvbnMsCisJLmdldHJvb3QJPSBuZnM0X3Byb2NfZ2V0X3Jvb3QsCisJLmdldGF0dHIJPSBuZnM0X3Byb2NfZ2V0YXR0ciwKKwkuc2V0YXR0cgk9IG5mczRfcHJvY19zZXRhdHRyLAorCS5sb29rdXAJCT0gbmZzNF9wcm9jX2xvb2t1cCwKKwkuYWNjZXNzCQk9IG5mczRfcHJvY19hY2Nlc3MsCisJLnJlYWRsaW5rCT0gbmZzNF9wcm9jX3JlYWRsaW5rLAorCS5yZWFkCQk9IG5mczRfcHJvY19yZWFkLAorCS53cml0ZQkJPSBuZnM0X3Byb2Nfd3JpdGUsCisJLmNvbW1pdAkJPSBuZnM0X3Byb2NfY29tbWl0LAorCS5jcmVhdGUJCT0gbmZzNF9wcm9jX2NyZWF0ZSwKKwkucmVtb3ZlCQk9IG5mczRfcHJvY19yZW1vdmUsCisJLnVubGlua19zZXR1cAk9IG5mczRfcHJvY191bmxpbmtfc2V0dXAsCisJLnVubGlua19kb25lCT0gbmZzNF9wcm9jX3VubGlua19kb25lLAorCS5yZW5hbWUJCT0gbmZzNF9wcm9jX3JlbmFtZSwKKwkubGluawkJPSBuZnM0X3Byb2NfbGluaywKKwkuc3ltbGluawk9IG5mczRfcHJvY19zeW1saW5rLAorCS5ta2RpcgkJPSBuZnM0X3Byb2NfbWtkaXIsCisJLnJtZGlyCQk9IG5mczRfcHJvY19yZW1vdmUsCisJLnJlYWRkaXIJPSBuZnM0X3Byb2NfcmVhZGRpciwKKwkubWtub2QJCT0gbmZzNF9wcm9jX21rbm9kLAorCS5zdGF0ZnMJCT0gbmZzNF9wcm9jX3N0YXRmcywKKwkuZnNpbmZvCQk9IG5mczRfcHJvY19mc2luZm8sCisJLnBhdGhjb25mCT0gbmZzNF9wcm9jX3BhdGhjb25mLAorCS5kZWNvZGVfZGlyZW50CT0gbmZzNF9kZWNvZGVfZGlyZW50LAorCS5yZWFkX3NldHVwCT0gbmZzNF9wcm9jX3JlYWRfc2V0dXAsCisJLndyaXRlX3NldHVwCT0gbmZzNF9wcm9jX3dyaXRlX3NldHVwLAorCS5jb21taXRfc2V0dXAJPSBuZnM0X3Byb2NfY29tbWl0X3NldHVwLAorCS5maWxlX29wZW4gICAgICA9IG5mczRfcHJvY19maWxlX29wZW4sCisJLmZpbGVfcmVsZWFzZSAgID0gbmZzNF9wcm9jX2ZpbGVfcmVsZWFzZSwKKwkubG9jawkJPSBuZnM0X3Byb2NfbG9jaywKK307CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczRyZW5ld2QuYyBiL2ZzL25mcy9uZnM0cmVuZXdkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY3ZTA2ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25mcy9uZnM0cmVuZXdkLmMKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiAgZnMvbmZzL25mczRyZW5ld2QuYworICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4uCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgS2VuZHJpY2sgU21pdGggPGttc21pdGhAdW1pY2guZWR1PgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqICBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqICBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBORlN2NCAicmVuZXcgZGFlbW9uIiwgd2hpY2ggd2FrZXMgdXAgcGVyaW9kaWNhbGx5IHRvCisgKiBzZW5kIGEgUkVORVcsIHRvIGtlZXAgc3RhdGUgYWxpdmUgb24gdGhlIHNlcnZlci4gIFRoZSBkYWVtb24gaXMgaW1wbGVtZW50ZWQKKyAqIGFzIGFuIHJwY190YXNrLCBub3QgYSByZWFsIGtlcm5lbCB0aHJlYWQsIHNvIGl0IGFsd2F5cyBydW5zIGluIHJwY2lvZCdzCisgKiBjb250ZXh0LiAgVGhlcmUgaXMgb25lIHJlbmV3ZCBwZXIgbmZzX3NlcnZlci4KKyAqCisgKiBUT0RPOiBJZiB0aGUgc2VuZCBxdWV1ZSBnZXRzIGJhY2tsb2dnZWQgKGUuZy4sIGlmIHRoZSBzZXJ2ZXIgZ29lcyBkb3duKSwKKyAqIHdlIHdpbGwga2VlcCBmaWxsaW5nIHRoZSBxdWV1ZSB3aXRoIHBlcmlvZGljIFJFTkVXIHJlcXVlc3RzLiAgV2UgbmVlZCBhCisgKiBtZWNoYW5pc20gZm9yIGVuc3VyaW5nIHRoYXQgaWYgcmVuZXdkIHN1Y2Nlc3NmdWxseSBzZW5kcyBvZmYgYSByZXF1ZXN0LAorICogdGhlbiBpdCBvbmx5IHdha2VzIHVwIHdoZW4gdGhlIHJlcXVlc3QgaXMgZmluaXNoZWQuICBNYXliZSB1c2UgdGhlCisgKiBjaGlsZCB0YXNrIGZyYW1ld29yayBvZiB0aGUgUlBDIGxheWVyPworICovCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KKworI2luY2x1ZGUgPGxpbnV4L25mcy5oPgorI2luY2x1ZGUgPGxpbnV4L25mczQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KKworI2RlZmluZSBORlNEQkdfRkFDSUxJVFkJTkZTREJHX1BST0MKKwordm9pZAorbmZzNF9yZW5ld19zdGF0ZSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwID0gKHN0cnVjdCBuZnM0X2NsaWVudCAqKWRhdGE7CisJbG9uZyBsZWFzZSwgdGltZW91dDsKKwl1bnNpZ25lZCBsb25nIGxhc3QsIG5vdzsKKworCWRvd25fcmVhZCgmY2xwLT5jbF9zZW0pOworCWRwcmludGsoIiVzOiBzdGFydFxuIiwgX19GVU5DVElPTl9fKTsKKwkvKiBBcmUgdGhlcmUgYW55IGFjdGl2ZSBzdXBlcmJsb2Nrcz8gKi8KKwlpZiAobGlzdF9lbXB0eSgmY2xwLT5jbF9zdXBlcmJsb2NrcykpCisJCWdvdG8gb3V0OyAKKwlzcGluX2xvY2soJmNscC0+Y2xfbG9jayk7CisJbGVhc2UgPSBjbHAtPmNsX2xlYXNlX3RpbWU7CisJbGFzdCA9IGNscC0+Y2xfbGFzdF9yZW5ld2FsOworCW5vdyA9IGppZmZpZXM7CisJdGltZW91dCA9ICgyICogbGVhc2UpIC8gMyArIChsb25nKWxhc3QgLSAobG9uZylub3c7CisJLyogQXJlIHdlIGNsb3NlIHRvIGEgbGVhc2UgdGltZW91dD8gKi8KKwlpZiAodGltZV9hZnRlcihub3csIGxhc3QgKyBsZWFzZS8zKSkgeworCQlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKKwkJLyogUXVldWUgYW4gYXN5bmNocm9ub3VzIFJFTkVXLiAqLworCQluZnM0X3Byb2NfYXN5bmNfcmVuZXcoY2xwKTsKKwkJdGltZW91dCA9ICgyICogbGVhc2UpIC8gMzsKKwkJc3Bpbl9sb2NrKCZjbHAtPmNsX2xvY2spOworCX0gZWxzZQorCQlkcHJpbnRrKCIlczogZmFpbGVkIHRvIGNhbGwgcmVuZXdkLiBSZWFzb246IGxlYXNlIG5vdCBleHBpcmVkIFxuIiwKKwkJCQlfX0ZVTkNUSU9OX18pOworCWlmICh0aW1lb3V0IDwgNSAqIEhaKSAgICAvKiBzYWZlZ3VhcmQgKi8KKwkJdGltZW91dCA9IDUgKiBIWjsKKwlkcHJpbnRrKCIlczogcmVxdWV1ZWluZyB3b3JrLiBMZWFzZSBwZXJpb2QgPSAlbGRcbiIsCisJCQlfX0ZVTkNUSU9OX18sICh0aW1lb3V0ICsgSFogLSAxKSAvIEhaKTsKKwljYW5jZWxfZGVsYXllZF93b3JrKCZjbHAtPmNsX3JlbmV3ZCk7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjbHAtPmNsX3JlbmV3ZCwgdGltZW91dCk7CisJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7CitvdXQ6CisJdXBfcmVhZCgmY2xwLT5jbF9zZW0pOworCWRwcmludGsoIiVzOiBkb25lXG4iLCBfX0ZVTkNUSU9OX18pOworfQorCisvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGNscC0+Y2xfc2VtIGxvY2tlZCBmb3Igd3JpdGVzICovCit2b2lkCituZnM0X3NjaGVkdWxlX3N0YXRlX3JlbmV3YWwoc3RydWN0IG5mczRfY2xpZW50ICpjbHApCit7CisJbG9uZyB0aW1lb3V0OworCisJc3Bpbl9sb2NrKCZjbHAtPmNsX2xvY2spOworCXRpbWVvdXQgPSAoMiAqIGNscC0+Y2xfbGVhc2VfdGltZSkgLyAzICsgKGxvbmcpY2xwLT5jbF9sYXN0X3JlbmV3YWwKKwkJLSAobG9uZylqaWZmaWVzOworCWlmICh0aW1lb3V0IDwgNSAqIEhaKQorCQl0aW1lb3V0ID0gNSAqIEhaOworCWRwcmludGsoIiVzOiByZXF1ZXVlaW5nIHdvcmsuIExlYXNlIHBlcmlvZCA9ICVsZFxuIiwKKwkJCV9fRlVOQ1RJT05fXywgKHRpbWVvdXQgKyBIWiAtIDEpIC8gSFopOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmNscC0+Y2xfcmVuZXdkKTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNscC0+Y2xfcmVuZXdkLCB0aW1lb3V0KTsKKwlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKK30KKwordm9pZAorbmZzNF9yZW5ld2RfcHJlcGFyZV9zaHV0ZG93bihzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyKQoreworCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwID0gc2VydmVyLT5uZnM0X3N0YXRlOworCisJaWYgKCFjbHApCisJCXJldHVybjsKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCWRvd25fd3JpdGUoJmNscC0+Y2xfc2VtKTsKKwlpZiAoIWxpc3RfZW1wdHkoJnNlcnZlci0+bmZzNF9zaWJsaW5ncykpCisJCWxpc3RfZGVsX2luaXQoJnNlcnZlci0+bmZzNF9zaWJsaW5ncyk7CisJdXBfd3JpdGUoJmNscC0+Y2xfc2VtKTsKK30KKworLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBjbHAtPmNsX3NlbSBsb2NrZWQgZm9yIHdyaXRlcyAqLwordm9pZAorbmZzNF9raWxsX3JlbmV3ZChzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCkKK3sKKwlkb3duX3JlYWQoJmNscC0+Y2xfc2VtKTsKKwlpZiAoIWxpc3RfZW1wdHkoJmNscC0+Y2xfc3VwZXJibG9ja3MpKSB7CisJCXVwX3JlYWQoJmNscC0+Y2xfc2VtKTsKKwkJcmV0dXJuOworCX0KKwljYW5jZWxfZGVsYXllZF93b3JrKCZjbHAtPmNsX3JlbmV3ZCk7CisJdXBfcmVhZCgmY2xwLT5jbF9zZW0pOworCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7Cit9CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0c3RhdGUuYyBiL2ZzL25mcy9uZnM0c3RhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzFjZWJjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzL25mczRzdGF0ZS5jCkBAIC0wLDAgKzEsOTMyIEBACisvKgorICogIGZzL25mcy9uZnM0c3RhdGUuYworICoKKyAqICBDbGllbnQtc2lkZSBYRFIgZm9yIE5GU3Y0LgorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4uCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgS2VuZHJpY2sgU21pdGggPGttc21pdGhAdW1pY2guZWR1PgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqICBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqICBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBORlN2NCBzdGF0ZSBtb2RlbC4gIEZvciB0aGUgdGltZSBiZWluZywKKyAqIHRoaXMgaXMgbWluaW1hbCwgYnV0IHdpbGwgYmUgbWFkZSBtdWNoIG1vcmUgY29tcGxleCBpbiBhCisgKiBzdWJzZXF1ZW50IHBhdGNoLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfaWRtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgImNhbGxiYWNrLmgiCisjaW5jbHVkZSAiZGVsZWdhdGlvbi5oIgorCisjZGVmaW5lIE9QRU5PV05FUl9QT09MX1NJWkUJOAorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHN0YXRlX3NwaW5sb2NrKTsKKworbmZzNF9zdGF0ZWlkIHplcm9fc3RhdGVpZDsKKworI2lmIDAKK25mczRfc3RhdGVpZCBvbmVfc3RhdGVpZCA9CisJeyAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmIH07CisjZW5kaWYKKworc3RhdGljIExJU1RfSEVBRChuZnM0X2NsaWVudGlkX2xpc3QpOworCitzdGF0aWMgdm9pZCBuZnM0X3JlY292ZXJfc3RhdGUodm9pZCAqKTsKK2V4dGVybiB2b2lkIG5mczRfcmVuZXdfc3RhdGUodm9pZCAqKTsKKwordm9pZAoraW5pdF9uZnN2NF9zdGF0ZShzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyKQoreworCXNlcnZlci0+bmZzNF9zdGF0ZSA9IE5VTEw7CisJSU5JVF9MSVNUX0hFQUQoJnNlcnZlci0+bmZzNF9zaWJsaW5ncyk7Cit9CisKK3ZvaWQKK2Rlc3Ryb3lfbmZzdjRfc3RhdGUoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcikKK3sKKwlpZiAoc2VydmVyLT5tbnRfcGF0aCkgeworCQlrZnJlZShzZXJ2ZXItPm1udF9wYXRoKTsKKwkJc2VydmVyLT5tbnRfcGF0aCA9IE5VTEw7CisJfQorCWlmIChzZXJ2ZXItPm5mczRfc3RhdGUpIHsKKwkJbmZzNF9wdXRfY2xpZW50KHNlcnZlci0+bmZzNF9zdGF0ZSk7CisJCXNlcnZlci0+bmZzNF9zdGF0ZSA9IE5VTEw7CisJfQorfQorCisvKgorICogbmZzNF9nZXRfY2xpZW50KCk6IHJldHVybnMgYW4gZW1wdHkgY2xpZW50IHN0cnVjdHVyZQorICogbmZzNF9wdXRfY2xpZW50KCk6IGRyb3BzIHJlZmVyZW5jZSB0byBjbGllbnQgc3RydWN0dXJlCisgKgorICogU2luY2UgdGhlc2UgYXJlIGFsbG9jYXRlZC9kZWFsbG9jYXRlZCB2ZXJ5IHJhcmVseSwgd2UgZG9uJ3QKKyAqIGJvdGhlciBwdXR0aW5nIHRoZW0gaW4gYSBzbGFiIGNhY2hlLi4uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmZzNF9jbGllbnQgKgorbmZzNF9hbGxvY19jbGllbnQoc3RydWN0IGluX2FkZHIgKmFkZHIpCit7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHA7CisKKwlpZiAobmZzX2NhbGxiYWNrX3VwKCkgPCAwKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoKGNscCA9IGttYWxsb2Moc2l6ZW9mKCpjbHApLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQluZnNfY2FsbGJhY2tfZG93bigpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtc2V0KGNscCwgMCwgc2l6ZW9mKCpjbHApKTsKKwltZW1jcHkoJmNscC0+Y2xfYWRkciwgYWRkciwgc2l6ZW9mKGNscC0+Y2xfYWRkcikpOworCWluaXRfcndzZW0oJmNscC0+Y2xfc2VtKTsKKwlJTklUX0xJU1RfSEVBRCgmY2xwLT5jbF9kZWxlZ2F0aW9ucyk7CisJSU5JVF9MSVNUX0hFQUQoJmNscC0+Y2xfc3RhdGVfb3duZXJzKTsKKwlJTklUX0xJU1RfSEVBRCgmY2xwLT5jbF91bnVzZWQpOworCXNwaW5fbG9ja19pbml0KCZjbHAtPmNsX2xvY2spOworCWF0b21pY19zZXQoJmNscC0+Y2xfY291bnQsIDEpOworCUlOSVRfV09SSygmY2xwLT5jbF9yZWNvdmVyZCwgbmZzNF9yZWNvdmVyX3N0YXRlLCBjbHApOworCUlOSVRfV09SSygmY2xwLT5jbF9yZW5ld2QsIG5mczRfcmVuZXdfc3RhdGUsIGNscCk7CisJSU5JVF9MSVNUX0hFQUQoJmNscC0+Y2xfc3VwZXJibG9ja3MpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNscC0+Y2xfd2FpdHEpOworCXJwY19pbml0X3dhaXRfcXVldWUoJmNscC0+Y2xfcnBjd2FpdHEsICJORlM0IGNsaWVudCIpOworCWNscC0+Y2xfYm9vdF90aW1lID0gQ1VSUkVOVF9USU1FOworCWNscC0+Y2xfc3RhdGUgPSAxIDw8IE5GUzRDTE5UX09LOworCXJldHVybiBjbHA7Cit9CisKK3N0YXRpYyB2b2lkCituZnM0X2ZyZWVfY2xpZW50KHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwKQoreworCXN0cnVjdCBuZnM0X3N0YXRlX293bmVyICpzcDsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmY2xwLT5jbF91bnVzZWQpKSB7CisJCXNwID0gbGlzdF9lbnRyeShjbHAtPmNsX3VudXNlZC5uZXh0LAorCQkJCXN0cnVjdCBuZnM0X3N0YXRlX293bmVyLAorCQkJCXNvX2xpc3QpOworCQlsaXN0X2RlbCgmc3AtPnNvX2xpc3QpOworCQlrZnJlZShzcCk7CisJfQorCUJVR19PTighbGlzdF9lbXB0eSgmY2xwLT5jbF9zdGF0ZV9vd25lcnMpKTsKKwlpZiAoY2xwLT5jbF9jcmVkKQorCQlwdXRfcnBjY3JlZChjbHAtPmNsX2NyZWQpOworCW5mc19pZG1hcF9kZWxldGUoY2xwKTsKKwlpZiAoY2xwLT5jbF9ycGNjbGllbnQpCisJCXJwY19zaHV0ZG93bl9jbGllbnQoY2xwLT5jbF9ycGNjbGllbnQpOworCWtmcmVlKGNscCk7CisJbmZzX2NhbGxiYWNrX2Rvd24oKTsKK30KKworc3RhdGljIHN0cnVjdCBuZnM0X2NsaWVudCAqX19uZnM0X2ZpbmRfY2xpZW50KHN0cnVjdCBpbl9hZGRyICphZGRyKQoreworCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2xwLCAmbmZzNF9jbGllbnRpZF9saXN0LCBjbF9zZXJ2ZXJzKSB7CisJCWlmIChtZW1jbXAoJmNscC0+Y2xfYWRkciwgYWRkciwgc2l6ZW9mKGNscC0+Y2xfYWRkcikpID09IDApIHsKKwkJCWF0b21pY19pbmMoJmNscC0+Y2xfY291bnQpOworCQkJcmV0dXJuIGNscDsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IG5mczRfY2xpZW50ICpuZnM0X2ZpbmRfY2xpZW50KHN0cnVjdCBpbl9hZGRyICphZGRyKQoreworCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwOworCXNwaW5fbG9jaygmc3RhdGVfc3BpbmxvY2spOworCWNscCA9IF9fbmZzNF9maW5kX2NsaWVudChhZGRyKTsKKwlzcGluX3VubG9jaygmc3RhdGVfc3BpbmxvY2spOworCXJldHVybiBjbHA7Cit9CisKK3N0cnVjdCBuZnM0X2NsaWVudCAqCituZnM0X2dldF9jbGllbnQoc3RydWN0IGluX2FkZHIgKmFkZHIpCit7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHAsICpuZXcgPSBOVUxMOworCisJc3Bpbl9sb2NrKCZzdGF0ZV9zcGlubG9jayk7CisJZm9yICg7OykgeworCQljbHAgPSBfX25mczRfZmluZF9jbGllbnQoYWRkcik7CisJCWlmIChjbHAgIT0gTlVMTCkKKwkJCWJyZWFrOworCQljbHAgPSBuZXc7CisJCWlmIChjbHAgIT0gTlVMTCkgeworCQkJbGlzdF9hZGQoJmNscC0+Y2xfc2VydmVycywgJm5mczRfY2xpZW50aWRfbGlzdCk7CisJCQluZXcgPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJc3Bpbl91bmxvY2soJnN0YXRlX3NwaW5sb2NrKTsKKwkJbmV3ID0gbmZzNF9hbGxvY19jbGllbnQoYWRkcik7CisJCXNwaW5fbG9jaygmc3RhdGVfc3BpbmxvY2spOworCQlpZiAobmV3ID09IE5VTEwpCisJCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soJnN0YXRlX3NwaW5sb2NrKTsKKwlpZiAobmV3KQorCQluZnM0X2ZyZWVfY2xpZW50KG5ldyk7CisJcmV0dXJuIGNscDsKK30KKwordm9pZAorbmZzNF9wdXRfY2xpZW50KHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwKQoreworCWlmICghYXRvbWljX2RlY19hbmRfbG9jaygmY2xwLT5jbF9jb3VudCwgJnN0YXRlX3NwaW5sb2NrKSkKKwkJcmV0dXJuOworCWxpc3RfZGVsKCZjbHAtPmNsX3NlcnZlcnMpOworCXNwaW5fdW5sb2NrKCZzdGF0ZV9zcGlubG9jayk7CisJQlVHX09OKCFsaXN0X2VtcHR5KCZjbHAtPmNsX3N1cGVyYmxvY2tzKSk7CisJd2FrZV91cF9hbGwoJmNscC0+Y2xfd2FpdHEpOworCXJwY193YWtlX3VwKCZjbHAtPmNsX3JwY3dhaXRxKTsKKwluZnM0X2tpbGxfcmVuZXdkKGNscCk7CisJbmZzNF9mcmVlX2NsaWVudChjbHApOworfQorCitzdGF0aWMgaW50IF9fbmZzNF9pbml0X2NsaWVudChzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCkKK3sKKwlpbnQgc3RhdHVzID0gbmZzNF9wcm9jX3NldGNsaWVudGlkKGNscCwgTkZTNF9DQUxMQkFDSywgbmZzX2NhbGxiYWNrX3RjcHBvcnQpOworCWlmIChzdGF0dXMgPT0gMCkKKwkJc3RhdHVzID0gbmZzNF9wcm9jX3NldGNsaWVudGlkX2NvbmZpcm0oY2xwKTsKKwlpZiAoc3RhdHVzID09IDApCisJCW5mczRfc2NoZWR1bGVfc3RhdGVfcmVuZXdhbChjbHApOworCXJldHVybiBzdGF0dXM7Cit9CisKK2ludCBuZnM0X2luaXRfY2xpZW50KHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwKQoreworCXJldHVybiBuZnM0X21hcF9lcnJvcnMoX19uZnM0X2luaXRfY2xpZW50KGNscCkpOworfQorCit1MzIKK25mczRfYWxsb2NfbG9ja293bmVyX2lkKHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwKQoreworCXJldHVybiBjbHAtPmNsX2xvY2tvd25lcl9pZCArKzsKK30KKworc3RhdGljIHN0cnVjdCBuZnM0X3N0YXRlX293bmVyICoKK25mczRfY2xpZW50X2dyYWJfdW51c2VkKHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwLCBzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQpCit7CisJc3RydWN0IG5mczRfc3RhdGVfb3duZXIgKnNwID0gTlVMTDsKKworCWlmICghbGlzdF9lbXB0eSgmY2xwLT5jbF91bnVzZWQpKSB7CisJCXNwID0gbGlzdF9lbnRyeShjbHAtPmNsX3VudXNlZC5uZXh0LCBzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciwgc29fbGlzdCk7CisJCWF0b21pY19pbmMoJnNwLT5zb19jb3VudCk7CisJCXNwLT5zb19jcmVkID0gY3JlZDsKKwkJbGlzdF9tb3ZlKCZzcC0+c29fbGlzdCwgJmNscC0+Y2xfc3RhdGVfb3duZXJzKTsKKwkJY2xwLT5jbF9udW51c2VkLS07CisJfQorCXJldHVybiBzcDsKK30KKworc3RhdGljIHN0cnVjdCBuZnM0X3N0YXRlX293bmVyICoKK25mczRfZmluZF9zdGF0ZV9vd25lcihzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCwgc3RydWN0IHJwY19jcmVkICpjcmVkKQoreworCXN0cnVjdCBuZnM0X3N0YXRlX293bmVyICpzcCwgKnJlcyA9IE5VTEw7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNwLCAmY2xwLT5jbF9zdGF0ZV9vd25lcnMsIHNvX2xpc3QpIHsKKwkJaWYgKHNwLT5zb19jcmVkICE9IGNyZWQpCisJCQljb250aW51ZTsKKwkJYXRvbWljX2luYygmc3AtPnNvX2NvdW50KTsKKwkJLyogTW92ZSB0byB0aGUgaGVhZCBvZiB0aGUgbGlzdCAqLworCQlsaXN0X21vdmUoJnNwLT5zb19saXN0LCAmY2xwLT5jbF9zdGF0ZV9vd25lcnMpOworCQlyZXMgPSBzcDsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXM7Cit9CisKKy8qCisgKiBuZnM0X2FsbG9jX3N0YXRlX293bmVyKCk6IHRoaXMgaXMgY2FsbGVkIG9uIHRoZSBPUEVOIG9yIENSRUFURSBwYXRoIHRvCisgKiBjcmVhdGUgYSBuZXcgc3RhdGVfb3duZXIuCisgKgorICovCitzdGF0aWMgc3RydWN0IG5mczRfc3RhdGVfb3duZXIgKgorbmZzNF9hbGxvY19zdGF0ZV9vd25lcih2b2lkKQoreworCXN0cnVjdCBuZnM0X3N0YXRlX293bmVyICpzcDsKKworCXNwID0ga21hbGxvYyhzaXplb2YoKnNwKSxHRlBfS0VSTkVMKTsKKwlpZiAoIXNwKQorCQlyZXR1cm4gTlVMTDsKKwlpbml0X01VVEVYKCZzcC0+c29fc2VtYSk7CisJc3AtPnNvX3NlcWlkID0gMDsgICAgICAgICAgICAgICAgIC8qIGFyYml0cmFyeSAqLworCUlOSVRfTElTVF9IRUFEKCZzcC0+c29fc3RhdGVzKTsKKwlJTklUX0xJU1RfSEVBRCgmc3AtPnNvX2RlbGVnYXRpb25zKTsKKwlhdG9taWNfc2V0KCZzcC0+c29fY291bnQsIDEpOworCXJldHVybiBzcDsKK30KKwordm9pZAorbmZzNF9kcm9wX3N0YXRlX293bmVyKHN0cnVjdCBuZnM0X3N0YXRlX293bmVyICpzcCkKK3sKKwlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCA9IHNwLT5zb19jbGllbnQ7CisJc3Bpbl9sb2NrKCZjbHAtPmNsX2xvY2spOworCWxpc3RfZGVsX2luaXQoJnNwLT5zb19saXN0KTsKKwlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKK30KKworLyoKKyAqIE5vdGU6IG11c3QgYmUgY2FsbGVkIHdpdGggY2xwLT5jbF9zZW0gaGVsZCBpbiBvcmRlciB0byBwcmV2ZW50IHJhY2VzCisgKiAgICAgICB3aXRoIHJlYm9vdCByZWNvdmVyeSEKKyAqLworc3RydWN0IG5mczRfc3RhdGVfb3duZXIgKm5mczRfZ2V0X3N0YXRlX293bmVyKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBycGNfY3JlZCAqY3JlZCkKK3sKKwlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCA9IHNlcnZlci0+bmZzNF9zdGF0ZTsKKwlzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqc3AsICpuZXc7CisKKwlnZXRfcnBjY3JlZChjcmVkKTsKKwluZXcgPSBuZnM0X2FsbG9jX3N0YXRlX293bmVyKCk7CisJc3Bpbl9sb2NrKCZjbHAtPmNsX2xvY2spOworCXNwID0gbmZzNF9maW5kX3N0YXRlX293bmVyKGNscCwgY3JlZCk7CisJaWYgKHNwID09IE5VTEwpCisJCXNwID0gbmZzNF9jbGllbnRfZ3JhYl91bnVzZWQoY2xwLCBjcmVkKTsKKwlpZiAoc3AgPT0gTlVMTCAmJiBuZXcgIT0gTlVMTCkgeworCQlsaXN0X2FkZCgmbmV3LT5zb19saXN0LCAmY2xwLT5jbF9zdGF0ZV9vd25lcnMpOworCQluZXctPnNvX2NsaWVudCA9IGNscDsKKwkJbmV3LT5zb19pZCA9IG5mczRfYWxsb2NfbG9ja293bmVyX2lkKGNscCk7CisJCW5ldy0+c29fY3JlZCA9IGNyZWQ7CisJCXNwID0gbmV3OworCQluZXcgPSBOVUxMOworCX0KKwlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKKwlpZiAobmV3KQorCQlrZnJlZShuZXcpOworCWlmIChzcCAhPSBOVUxMKQorCQlyZXR1cm4gc3A7CisJcHV0X3JwY2NyZWQoY3JlZCk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGNscC0+Y2xfc2VtIGhlbGQgaW4gb3JkZXIgdG8gYXZvaWQgcmFjZXMKKyAqIHdpdGggc3RhdGUgcmVjb3ZlcnkuLi4KKyAqLwordm9pZCBuZnM0X3B1dF9zdGF0ZV9vd25lcihzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqc3ApCit7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHAgPSBzcC0+c29fY2xpZW50OworCXN0cnVjdCBycGNfY3JlZCAqY3JlZCA9IHNwLT5zb19jcmVkOworCisJaWYgKCFhdG9taWNfZGVjX2FuZF9sb2NrKCZzcC0+c29fY291bnQsICZjbHAtPmNsX2xvY2spKQorCQlyZXR1cm47CisJaWYgKGNscC0+Y2xfbnVudXNlZCA+PSBPUEVOT1dORVJfUE9PTF9TSVpFKQorCQlnb3RvIG91dF9mcmVlOworCWlmIChsaXN0X2VtcHR5KCZzcC0+c29fbGlzdCkpCisJCWdvdG8gb3V0X2ZyZWU7CisJbGlzdF9tb3ZlKCZzcC0+c29fbGlzdCwgJmNscC0+Y2xfdW51c2VkKTsKKwljbHAtPmNsX251bnVzZWQrKzsKKwlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKKwlwdXRfcnBjY3JlZChjcmVkKTsKKwljcmVkID0gTlVMTDsKKwlyZXR1cm47CitvdXRfZnJlZToKKwlsaXN0X2RlbCgmc3AtPnNvX2xpc3QpOworCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOworCXB1dF9ycGNjcmVkKGNyZWQpOworCWtmcmVlKHNwKTsKK30KKworc3RhdGljIHN0cnVjdCBuZnM0X3N0YXRlICoKK25mczRfYWxsb2Nfb3Blbl9zdGF0ZSh2b2lkKQoreworCXN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZTsKKworCXN0YXRlID0ga21hbGxvYyhzaXplb2YoKnN0YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdGF0ZSkKKwkJcmV0dXJuIE5VTEw7CisJc3RhdGUtPnN0YXRlID0gMDsKKwlzdGF0ZS0+bnJlYWRlcnMgPSAwOworCXN0YXRlLT5ud3JpdGVycyA9IDA7CisJc3RhdGUtPmZsYWdzID0gMDsKKwltZW1zZXQoc3RhdGUtPnN0YXRlaWQuZGF0YSwgMCwgc2l6ZW9mKHN0YXRlLT5zdGF0ZWlkLmRhdGEpKTsKKwlhdG9taWNfc2V0KCZzdGF0ZS0+Y291bnQsIDEpOworCUlOSVRfTElTVF9IRUFEKCZzdGF0ZS0+bG9ja19zdGF0ZXMpOworCWluaXRfTVVURVgoJnN0YXRlLT5sb2NrX3NlbWEpOworCXJ3bG9ja19pbml0KCZzdGF0ZS0+c3RhdGVfbG9jayk7CisJcmV0dXJuIHN0YXRlOworfQorCitzdGF0aWMgc3RydWN0IG5mczRfc3RhdGUgKgorX19uZnM0X2ZpbmRfc3RhdGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHJwY19jcmVkICpjcmVkLCBtb2RlX3QgbW9kZSkKK3sKKwlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOworCXN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZTsKKworCW1vZGUgJj0gKEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoc3RhdGUsICZuZnNpLT5vcGVuX3N0YXRlcywgaW5vZGVfc3RhdGVzKSB7CisJCWlmIChzdGF0ZS0+b3duZXItPnNvX2NyZWQgIT0gY3JlZCkKKwkJCWNvbnRpbnVlOworCQlpZiAoKG1vZGUgJiBGTU9ERV9SRUFEKSAhPSAwICYmIHN0YXRlLT5ucmVhZGVycyA9PSAwKQorCQkJY29udGludWU7CisJCWlmICgobW9kZSAmIEZNT0RFX1dSSVRFKSAhPSAwICYmIHN0YXRlLT5ud3JpdGVycyA9PSAwKQorCQkJY29udGludWU7CisJCWlmICgoc3RhdGUtPnN0YXRlICYgbW9kZSkgIT0gbW9kZSkKKwkJCWNvbnRpbnVlOworCQlhdG9taWNfaW5jKCZzdGF0ZS0+Y291bnQpOworCQlpZiAobW9kZSAmIEZNT0RFX1JFQUQpCisJCQlzdGF0ZS0+bnJlYWRlcnMrKzsKKwkJaWYgKG1vZGUgJiBGTU9ERV9XUklURSkKKwkJCXN0YXRlLT5ud3JpdGVycysrOworCQlyZXR1cm4gc3RhdGU7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IG5mczRfc3RhdGUgKgorX19uZnM0X2ZpbmRfc3RhdGVfYnlvd25lcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqb3duZXIpCit7CisJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKKwlzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGU7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN0YXRlLCAmbmZzaS0+b3Blbl9zdGF0ZXMsIGlub2RlX3N0YXRlcykgeworCQkvKiBJcyB0aGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGZyZWVkPyAqLworCQlpZiAoc3RhdGUtPm5yZWFkZXJzID09IDAgJiYgc3RhdGUtPm53cml0ZXJzID09IDApCisJCQljb250aW51ZTsKKwkJaWYgKHN0YXRlLT5vd25lciA9PSBvd25lcikgeworCQkJYXRvbWljX2luYygmc3RhdGUtPmNvdW50KTsKKwkJCXJldHVybiBzdGF0ZTsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IG5mczRfc3RhdGUgKgorbmZzNF9maW5kX3N0YXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBycGNfY3JlZCAqY3JlZCwgbW9kZV90IG1vZGUpCit7CisJc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlOworCisJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlzdGF0ZSA9IF9fbmZzNF9maW5kX3N0YXRlKGlub2RlLCBjcmVkLCBtb2RlKTsKKwlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJcmV0dXJuIHN0YXRlOworfQorCitzdGF0aWMgdm9pZAorbmZzNF9mcmVlX29wZW5fc3RhdGUoc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlKQoreworCWtmcmVlKHN0YXRlKTsKK30KKworc3RydWN0IG5mczRfc3RhdGUgKgorbmZzNF9nZXRfb3Blbl9zdGF0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqb3duZXIpCit7CisJc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlLCAqbmV3OworCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CisKKwlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCXN0YXRlID0gX19uZnM0X2ZpbmRfc3RhdGVfYnlvd25lcihpbm9kZSwgb3duZXIpOworCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlpZiAoc3RhdGUpCisJCWdvdG8gb3V0OworCW5ldyA9IG5mczRfYWxsb2Nfb3Blbl9zdGF0ZSgpOworCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3RhdGUgPSBfX25mczRfZmluZF9zdGF0ZV9ieW93bmVyKGlub2RlLCBvd25lcik7CisJaWYgKHN0YXRlID09IE5VTEwgJiYgbmV3ICE9IE5VTEwpIHsKKwkJc3RhdGUgPSBuZXc7CisJCS8qIENhbGxlciAqbXVzdCogYmUgaG9sZGluZyBvd25lci0+c29fc2VtICovCisJCS8qIE5vdGU6IFRoZSByZWNsYWltIGNvZGUgZGljdGF0ZXMgdGhhdCB3ZSBhZGQgc3RhdGVsZXNzCisJCSAqIGFuZCByZWFkLW9ubHkgc3RhdGVpZHMgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCAqLworCQlsaXN0X2FkZF90YWlsKCZzdGF0ZS0+b3Blbl9zdGF0ZXMsICZvd25lci0+c29fc3RhdGVzKTsKKwkJc3RhdGUtPm93bmVyID0gb3duZXI7CisJCWF0b21pY19pbmMoJm93bmVyLT5zb19jb3VudCk7CisJCWxpc3RfYWRkKCZzdGF0ZS0+aW5vZGVfc3RhdGVzLCAmbmZzaS0+b3Blbl9zdGF0ZXMpOworCQlzdGF0ZS0+aW5vZGUgPSBpZ3JhYihpbm9kZSk7CisJCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwl9IGVsc2UgeworCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJCWlmIChuZXcpCisJCQluZnM0X2ZyZWVfb3Blbl9zdGF0ZShuZXcpOworCX0KK291dDoKKwlyZXR1cm4gc3RhdGU7Cit9CisKKy8qCisgKiBCZXdhcmUhIENhbGxlciBtdXN0IGJlIGhvbGRpbmcgZXhhY3RseSBvbmUKKyAqIHJlZmVyZW5jZSB0byBjbHAtPmNsX3NlbSBhbmQgb3duZXItPnNvX3NlbWEhCisgKi8KK3ZvaWQgbmZzNF9wdXRfb3Blbl9zdGF0ZShzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHN0YXRlLT5pbm9kZTsKKwlzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqb3duZXIgPSBzdGF0ZS0+b3duZXI7CisKKwlpZiAoIWF0b21pY19kZWNfYW5kX2xvY2soJnN0YXRlLT5jb3VudCwgJmlub2RlLT5pX2xvY2spKQorCQlyZXR1cm47CisJaWYgKCFsaXN0X2VtcHR5KCZzdGF0ZS0+aW5vZGVfc3RhdGVzKSkKKwkJbGlzdF9kZWwoJnN0YXRlLT5pbm9kZV9zdGF0ZXMpOworCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlsaXN0X2RlbCgmc3RhdGUtPm9wZW5fc3RhdGVzKTsKKwlpcHV0KGlub2RlKTsKKwlCVUdfT04gKHN0YXRlLT5zdGF0ZSAhPSAwKTsKKwluZnM0X2ZyZWVfb3Blbl9zdGF0ZShzdGF0ZSk7CisJbmZzNF9wdXRfc3RhdGVfb3duZXIob3duZXIpOworfQorCisvKgorICogQmV3YXJlISBDYWxsZXIgbXVzdCBiZSBob2xkaW5nIG5vIHJlZmVyZW5jZXMgdG8gY2xwLT5jbF9zZW0hCisgKiBvZiBvd25lci0+c29fc2VtYSEKKyAqLwordm9pZCBuZnM0X2Nsb3NlX3N0YXRlKHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwgbW9kZV90IG1vZGUpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHN0YXRlLT5pbm9kZTsKKwlzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqb3duZXIgPSBzdGF0ZS0+b3duZXI7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHAgPSBvd25lci0+c29fY2xpZW50OworCWludCBuZXdzdGF0ZTsKKworCWF0b21pY19pbmMoJm93bmVyLT5zb19jb3VudCk7CisJZG93bl9yZWFkKCZjbHAtPmNsX3NlbSk7CisJZG93bigmb3duZXItPnNvX3NlbWEpOworCS8qIFByb3RlY3QgYWdhaW5zdCBuZnM0X2ZpbmRfc3RhdGUoKSAqLworCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJaWYgKG1vZGUgJiBGTU9ERV9SRUFEKQorCQlzdGF0ZS0+bnJlYWRlcnMtLTsKKwlpZiAobW9kZSAmIEZNT0RFX1dSSVRFKQorCQlzdGF0ZS0+bndyaXRlcnMtLTsKKwlpZiAoc3RhdGUtPm53cml0ZXJzID09IDApIHsKKwkJaWYgKHN0YXRlLT5ucmVhZGVycyA9PSAwKQorCQkJbGlzdF9kZWxfaW5pdCgmc3RhdGUtPmlub2RlX3N0YXRlcyk7CisJCS8qIFNlZSByZWNsYWltIGNvZGUgKi8KKwkJbGlzdF9tb3ZlX3RhaWwoJnN0YXRlLT5vcGVuX3N0YXRlcywgJm93bmVyLT5zb19zdGF0ZXMpOworCX0KKwlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJbmV3c3RhdGUgPSAwOworCWlmIChzdGF0ZS0+c3RhdGUgIT0gMCkgeworCQlpZiAoc3RhdGUtPm5yZWFkZXJzKQorCQkJbmV3c3RhdGUgfD0gRk1PREVfUkVBRDsKKwkJaWYgKHN0YXRlLT5ud3JpdGVycykKKwkJCW5ld3N0YXRlIHw9IEZNT0RFX1dSSVRFOworCQlpZiAoc3RhdGUtPnN0YXRlID09IG5ld3N0YXRlKQorCQkJZ290byBvdXQ7CisJCWlmIChuZnM0X2RvX2Nsb3NlKGlub2RlLCBzdGF0ZSwgbmV3c3RhdGUpID09IC1FSU5QUk9HUkVTUykKKwkJCXJldHVybjsKKwl9CitvdXQ6CisJbmZzNF9wdXRfb3Blbl9zdGF0ZShzdGF0ZSk7CisJdXAoJm93bmVyLT5zb19zZW1hKTsKKwluZnM0X3B1dF9zdGF0ZV9vd25lcihvd25lcik7CisJdXBfcmVhZCgmY2xwLT5jbF9zZW0pOworfQorCisvKgorICogU2VhcmNoIHRoZSBzdGF0ZS0+bG9ja19zdGF0ZXMgZm9yIGFuIGV4aXN0aW5nIGxvY2tfb3duZXIKKyAqIHRoYXQgaXMgY29tcGF0aWJsZSB3aXRoIGN1cnJlbnQtPmZpbGVzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbmZzNF9sb2NrX3N0YXRlICoKK19fbmZzNF9maW5kX2xvY2tfc3RhdGUoc3RydWN0IG5mczRfc3RhdGUgKnN0YXRlLCBmbF9vd25lcl90IGZsX293bmVyKQoreworCXN0cnVjdCBuZnM0X2xvY2tfc3RhdGUgKnBvczsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgJnN0YXRlLT5sb2NrX3N0YXRlcywgbHNfbG9ja3MpIHsKKwkJaWYgKHBvcy0+bHNfb3duZXIgIT0gZmxfb3duZXIpCisJCQljb250aW51ZTsKKwkJYXRvbWljX2luYygmcG9zLT5sc19jb3VudCk7CisJCXJldHVybiBwb3M7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgbmZzNF9sb2NrX3N0YXRlICoKK25mczRfZmluZF9sb2NrX3N0YXRlKHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwgZmxfb3duZXJfdCBmbF9vd25lcikKK3sKKwlzdHJ1Y3QgbmZzNF9sb2NrX3N0YXRlICpsc3A7CisJcmVhZF9sb2NrKCZzdGF0ZS0+c3RhdGVfbG9jayk7CisJbHNwID0gX19uZnM0X2ZpbmRfbG9ja19zdGF0ZShzdGF0ZSwgZmxfb3duZXIpOworCXJlYWRfdW5sb2NrKCZzdGF0ZS0+c3RhdGVfbG9jayk7CisJcmV0dXJuIGxzcDsKK30KKworLyoKKyAqIFJldHVybiBhIGNvbXBhdGlibGUgbG9ja19zdGF0ZS4gSWYgbm8gaW5pdGlhbGl6ZWQgbG9ja19zdGF0ZSBzdHJ1Y3R1cmUKKyAqIGV4aXN0cywgcmV0dXJuIGFuIHVuaW5pdGlhbGl6ZWQgb25lLgorICoKKyAqIFRoZSBjYWxsZXIgbXVzdCBiZSBob2xkaW5nIHN0YXRlLT5sb2NrX3NlbWEKKyAqLworc3RhdGljIHN0cnVjdCBuZnM0X2xvY2tfc3RhdGUgKm5mczRfYWxsb2NfbG9ja19zdGF0ZShzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUsIGZsX293bmVyX3QgZmxfb3duZXIpCit7CisJc3RydWN0IG5mczRfbG9ja19zdGF0ZSAqbHNwOworCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwID0gc3RhdGUtPm93bmVyLT5zb19jbGllbnQ7CisKKwlsc3AgPSBrbWFsbG9jKHNpemVvZigqbHNwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGxzcCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwlsc3AtPmxzX2ZsYWdzID0gMDsKKwlsc3AtPmxzX3NlcWlkID0gMDsJLyogYXJiaXRyYXJ5ICovCisJbHNwLT5sc19pZCA9IC0xOyAKKwltZW1zZXQobHNwLT5sc19zdGF0ZWlkLmRhdGEsIDAsIHNpemVvZihsc3AtPmxzX3N0YXRlaWQuZGF0YSkpOworCWF0b21pY19zZXQoJmxzcC0+bHNfY291bnQsIDEpOworCWxzcC0+bHNfb3duZXIgPSBmbF9vd25lcjsKKwlJTklUX0xJU1RfSEVBRCgmbHNwLT5sc19sb2Nrcyk7CisJc3Bpbl9sb2NrKCZjbHAtPmNsX2xvY2spOworCWxzcC0+bHNfaWQgPSBuZnM0X2FsbG9jX2xvY2tvd25lcl9pZChjbHApOworCXNwaW5fdW5sb2NrKCZjbHAtPmNsX2xvY2spOworCXJldHVybiBsc3A7Cit9CisKKy8qCisgKiBSZXR1cm4gYSBjb21wYXRpYmxlIGxvY2tfc3RhdGUuIElmIG5vIGluaXRpYWxpemVkIGxvY2tfc3RhdGUgc3RydWN0dXJlCisgKiBleGlzdHMsIHJldHVybiBhbiB1bmluaXRpYWxpemVkIG9uZS4KKyAqCisgKiBUaGUgY2FsbGVyIG11c3QgYmUgaG9sZGluZyBzdGF0ZS0+bG9ja19zZW1hIGFuZCBjbHAtPmNsX3NlbQorICovCitzdHJ1Y3QgbmZzNF9sb2NrX3N0YXRlICpuZnM0X2dldF9sb2NrX3N0YXRlKHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwgZmxfb3duZXJfdCBvd25lcikKK3sKKwlzdHJ1Y3QgbmZzNF9sb2NrX3N0YXRlICogbHNwOworCQorCWxzcCA9IG5mczRfZmluZF9sb2NrX3N0YXRlKHN0YXRlLCBvd25lcik7CisJaWYgKGxzcCA9PSBOVUxMKQorCQlsc3AgPSBuZnM0X2FsbG9jX2xvY2tfc3RhdGUoc3RhdGUsIG93bmVyKTsKKwlyZXR1cm4gbHNwOworfQorCisvKgorICogQnl0ZS1yYW5nZSBsb2NrIGF3YXJlIHV0aWxpdHkgdG8gaW5pdGlhbGl6ZSB0aGUgc3RhdGVpZCBvZiByZWFkL3dyaXRlCisgKiByZXF1ZXN0cy4KKyAqLwordm9pZAorbmZzNF9jb3B5X3N0YXRlaWQobmZzNF9zdGF0ZWlkICpkc3QsIHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwgZmxfb3duZXJfdCBmbF9vd25lcikKK3sKKwlpZiAodGVzdF9iaXQoTEtfU1RBVEVfSU5fVVNFLCAmc3RhdGUtPmZsYWdzKSkgeworCQlzdHJ1Y3QgbmZzNF9sb2NrX3N0YXRlICpsc3A7CisKKwkJbHNwID0gbmZzNF9maW5kX2xvY2tfc3RhdGUoc3RhdGUsIGZsX293bmVyKTsKKwkJaWYgKGxzcCkgeworCQkJbWVtY3B5KGRzdCwgJmxzcC0+bHNfc3RhdGVpZCwgc2l6ZW9mKCpkc3QpKTsKKwkJCW5mczRfcHV0X2xvY2tfc3RhdGUobHNwKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwltZW1jcHkoZHN0LCAmc3RhdGUtPnN0YXRlaWQsIHNpemVvZigqZHN0KSk7Cit9CisKKy8qCisqIENhbGxlZCB3aXRoIHN0YXRlLT5sb2NrX3NlbWEgYW5kIGNscC0+Y2xfc2VtIGhlbGQuCisqLwordm9pZCBuZnM0X2luY3JlbWVudF9sb2NrX3NlcWlkKGludCBzdGF0dXMsIHN0cnVjdCBuZnM0X2xvY2tfc3RhdGUgKmxzcCkKK3sKKwlpZiAoc3RhdHVzID09IE5GU19PSyB8fCBzZXFpZF9tdXRhdGluZ19lcnIoLXN0YXR1cykpCisJCWxzcC0+bHNfc2VxaWQrKzsKK30KKworLyogCisqIENoZWNrIHRvIHNlZSBpZiB0aGUgcmVxdWVzdCBsb2NrICh0eXBlIEZMX1VOTEspIGVmZmVjdHMgdGhlIGZsIGxvY2suCisqCisqIGZsIGFuZCByZXF1ZXN0IG11c3QgaGF2ZSB0aGUgc2FtZSBwb3NpeCBvd25lcgorKgorKiByZXR1cm46IAorKiAwIC0+IGZsIG5vdCBlZmZlY3RlZCBieSByZXF1ZXN0CisqIDEgLT4gZmwgY29uc3VtZWQgYnkgcmVxdWVzdAorKi8KKworc3RhdGljIGludAorbmZzNF9jaGVja191bmxvY2soc3RydWN0IGZpbGVfbG9jayAqZmwsIHN0cnVjdCBmaWxlX2xvY2sgKnJlcXVlc3QpCit7CisJaWYgKGZsLT5mbF9zdGFydCA+PSByZXF1ZXN0LT5mbF9zdGFydCAmJiBmbC0+ZmxfZW5kIDw9IHJlcXVlc3QtPmZsX2VuZCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQb3N0IGFuIGluaXRpYWxpemVkIGxvY2tfc3RhdGUgb24gdGhlIHN0YXRlLT5sb2NrX3N0YXRlcyBsaXN0LgorICovCit2b2lkIG5mczRfbm90aWZ5X3NldGxrKHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSwgc3RydWN0IGZpbGVfbG9jayAqcmVxdWVzdCwgc3RydWN0IG5mczRfbG9ja19zdGF0ZSAqbHNwKQoreworCWlmICghbGlzdF9lbXB0eSgmbHNwLT5sc19sb2NrcykpCisJCXJldHVybjsKKwlhdG9taWNfaW5jKCZsc3AtPmxzX2NvdW50KTsKKwl3cml0ZV9sb2NrKCZzdGF0ZS0+c3RhdGVfbG9jayk7CisJbGlzdF9hZGQoJmxzcC0+bHNfbG9ja3MsICZzdGF0ZS0+bG9ja19zdGF0ZXMpOworCXNldF9iaXQoTEtfU1RBVEVfSU5fVVNFLCAmc3RhdGUtPmZsYWdzKTsKKwl3cml0ZV91bmxvY2soJnN0YXRlLT5zdGF0ZV9sb2NrKTsKK30KKworLyogCisgKiB0byBkZWNpZGUgdG8gJ3JlYXAnIGxvY2sgc3RhdGU6CisgKiAxKSBzZWFyY2ggaV9mbG9jayBmb3IgZmlsZV9sb2NrcyB3aXRoIGZsLmxvY2tfc3RhdGUgPSB0byBscy4KKyAqIDIpIGRldGVybWluZSBpZiB1bmxvY2sgd2lsbCBjb25zdW1lIGZvdW5kIGxvY2suIAorICogCWlmIHNvLCByZWFwCisgKgorICogCWVsc2UsIGRvbid0IHJlYXAuCisgKgorICovCit2b2lkCituZnM0X25vdGlmeV91bmxjayhzdHJ1Y3QgbmZzNF9zdGF0ZSAqc3RhdGUsIHN0cnVjdCBmaWxlX2xvY2sgKnJlcXVlc3QsIHN0cnVjdCBuZnM0X2xvY2tfc3RhdGUgKmxzcCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gc3RhdGUtPmlub2RlOworCXN0cnVjdCBmaWxlX2xvY2sgKmZsOworCisJZm9yIChmbCA9IGlub2RlLT5pX2Zsb2NrOyBmbCAhPSBOVUxMOyBmbCA9IGZsLT5mbF9uZXh0KSB7CisJCWlmICghKGZsLT5mbF9mbGFncyAmIEZMX1BPU0lYKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoZmwtPmZsX293bmVyICE9IGxzcC0+bHNfb3duZXIpCisJCQljb250aW51ZTsKKwkJLyogRXhpdCBpZiB3ZSBmaW5kIGF0IGxlYXN0IG9uZSBsb2NrIHdoaWNoIGlzIG5vdCBjb25zdW1lZCAqLworCQlpZiAobmZzNF9jaGVja191bmxvY2soZmwscmVxdWVzdCkgPT0gMCkKKwkJCXJldHVybjsKKwl9CisKKwl3cml0ZV9sb2NrKCZzdGF0ZS0+c3RhdGVfbG9jayk7CisJbGlzdF9kZWxfaW5pdCgmbHNwLT5sc19sb2Nrcyk7CisJaWYgKGxpc3RfZW1wdHkoJnN0YXRlLT5sb2NrX3N0YXRlcykpCisJCWNsZWFyX2JpdChMS19TVEFURV9JTl9VU0UsICZzdGF0ZS0+ZmxhZ3MpOworCXdyaXRlX3VubG9jaygmc3RhdGUtPnN0YXRlX2xvY2spOworCW5mczRfcHV0X2xvY2tfc3RhdGUobHNwKTsKK30KKworLyoKKyAqIFJlbGVhc2UgcmVmZXJlbmNlIHRvIGxvY2tfc3RhdGUsIGFuZCBmcmVlIGl0IGlmIHdlIHNlZSB0aGF0CisgKiBpdCBpcyBubyBsb25nZXIgaW4gdXNlCisgKi8KK3ZvaWQKK25mczRfcHV0X2xvY2tfc3RhdGUoc3RydWN0IG5mczRfbG9ja19zdGF0ZSAqbHNwKQoreworCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmbHNwLT5sc19jb3VudCkpCisJCXJldHVybjsKKwlCVUdfT04gKCFsaXN0X2VtcHR5KCZsc3AtPmxzX2xvY2tzKSk7CisJa2ZyZWUobHNwKTsKK30KKworLyoKKyogQ2FsbGVkIHdpdGggc3AtPnNvX3NlbWEgYW5kIGNscC0+Y2xfc2VtIGhlbGQuCisqCisqIEluY3JlbWVudCB0aGUgc2VxaWQgaWYgdGhlIE9QRU4vT1BFTl9ET1dOR1JBREUvQ0xPU0Ugc3VjY2VlZGVkLCBvcgorKiBmYWlsZWQgd2l0aCBhIHNlcWlkIGluY3JlbWVudGluZyBlcnJvciAtCisqIHNlZSBjb21tZW50cyBuZnNfZnMuaDpzZXFpZF9tdXRhdGluZ19lcnJvcigpCisqLwordm9pZCBuZnM0X2luY3JlbWVudF9zZXFpZChpbnQgc3RhdHVzLCBzdHJ1Y3QgbmZzNF9zdGF0ZV9vd25lciAqc3ApCit7CisJaWYgKHN0YXR1cyA9PSBORlNfT0sgfHwgc2VxaWRfbXV0YXRpbmdfZXJyKC1zdGF0dXMpKQorCQlzcC0+c29fc2VxaWQrKzsKKwkvKiBJZiB0aGUgc2VydmVyIHJldHVybnMgQkFEX1NFUUlELCB1bmhhc2ggc3RhdGVfb3duZXIgaGVyZSAqLworCWlmIChzdGF0dXMgPT0gLU5GUzRFUlJfQkFEX1NFUUlEKQorCQluZnM0X2Ryb3Bfc3RhdGVfb3duZXIoc3ApOworfQorCitzdGF0aWMgaW50IHJlY2xhaW1lcih2b2lkICopOworc3RydWN0IHJlY2xhaW1lcl9hcmdzIHsKKwlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscDsKKwlzdHJ1Y3QgY29tcGxldGlvbiBjb21wbGV0ZTsKK307CisKKy8qCisgKiBTdGF0ZSByZWNvdmVyeSByb3V0aW5lCisgKi8KK3ZvaWQKK25mczRfcmVjb3Zlcl9zdGF0ZSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwID0gKHN0cnVjdCBuZnM0X2NsaWVudCAqKWRhdGE7CisJc3RydWN0IHJlY2xhaW1lcl9hcmdzIGFyZ3MgPSB7CisJCS5jbHAgPSBjbHAsCisJfTsKKwltaWdodF9zbGVlcCgpOworCisJaW5pdF9jb21wbGV0aW9uKCZhcmdzLmNvbXBsZXRlKTsKKworCWlmIChrZXJuZWxfdGhyZWFkKHJlY2xhaW1lciwgJmFyZ3MsIENMT05FX0tFUk5FTCkgPCAwKQorCQlnb3RvIG91dF9mYWlsZWRfY2xlYXI7CisJd2FpdF9mb3JfY29tcGxldGlvbigmYXJncy5jb21wbGV0ZSk7CisJcmV0dXJuOworb3V0X2ZhaWxlZF9jbGVhcjoKKwlzZXRfYml0KE5GUzRDTE5UX09LLCAmY2xwLT5jbF9zdGF0ZSk7CisJd2FrZV91cF9hbGwoJmNscC0+Y2xfd2FpdHEpOworCXJwY193YWtlX3VwKCZjbHAtPmNsX3JwY3dhaXRxKTsKK30KKworLyoKKyAqIFNjaGVkdWxlIGEgc3RhdGUgcmVjb3ZlcnkgYXR0ZW1wdAorICovCit2b2lkCituZnM0X3NjaGVkdWxlX3N0YXRlX3JlY292ZXJ5KHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwKQoreworCWlmICghY2xwKQorCQlyZXR1cm47CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChORlM0Q0xOVF9PSywgJmNscC0+Y2xfc3RhdGUpKQorCQlzY2hlZHVsZV93b3JrKCZjbHAtPmNsX3JlY292ZXJkKTsKK30KKworc3RhdGljIGludCBuZnM0X3JlY2xhaW1fbG9ja3Moc3RydWN0IG5mczRfc3RhdGVfcmVjb3Zlcnlfb3BzICpvcHMsIHN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gc3RhdGUtPmlub2RlOworCXN0cnVjdCBmaWxlX2xvY2sgKmZsOworCWludCBzdGF0dXMgPSAwOworCisJZm9yIChmbCA9IGlub2RlLT5pX2Zsb2NrOyBmbCAhPSAwOyBmbCA9IGZsLT5mbF9uZXh0KSB7CisJCWlmICghKGZsLT5mbF9mbGFncyAmIEZMX1BPU0lYKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoKChzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqKWZsLT5mbF9maWxlLT5wcml2YXRlX2RhdGEpLT5zdGF0ZSAhPSBzdGF0ZSkKKwkJCWNvbnRpbnVlOworCQlzdGF0dXMgPSBvcHMtPnJlY292ZXJfbG9jayhzdGF0ZSwgZmwpOworCQlpZiAoc3RhdHVzID49IDApCisJCQljb250aW51ZTsKKwkJc3dpdGNoIChzdGF0dXMpIHsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5oYW5kbGVkIGVycm9yICVkLiBaZXJvaW5nIHN0YXRlXG4iLAorCQkJCQkJX19GVU5DVElPTl9fLCBzdGF0dXMpOworCQkJY2FzZSAtTkZTNEVSUl9FWFBJUkVEOgorCQkJY2FzZSAtTkZTNEVSUl9OT19HUkFDRToKKwkJCWNhc2UgLU5GUzRFUlJfUkVDTEFJTV9CQUQ6CisJCQljYXNlIC1ORlM0RVJSX1JFQ0xBSU1fQ09ORkxJQ1Q6CisJCQkJLyoga2lsbF9wcm9jKGZsLT5mbF9vd25lciwgU0lHTE9TVCwgMSk7ICovCisJCQkJYnJlYWs7CisJCQljYXNlIC1ORlM0RVJSX1NUQUxFX0NMSUVOVElEOgorCQkJCWdvdG8gb3V0X2VycjsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK291dF9lcnI6CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBuZnM0X3JlY2xhaW1fb3Blbl9zdGF0ZShzdHJ1Y3QgbmZzNF9zdGF0ZV9yZWNvdmVyeV9vcHMgKm9wcywgc3RydWN0IG5mczRfc3RhdGVfb3duZXIgKnNwKQoreworCXN0cnVjdCBuZnM0X3N0YXRlICpzdGF0ZTsKKwlzdHJ1Y3QgbmZzNF9sb2NrX3N0YXRlICpsb2NrOworCWludCBzdGF0dXMgPSAwOworCisJLyogTm90ZTogd2UgcmVseSBvbiB0aGUgc3AtPnNvX3N0YXRlcyBsaXN0IGJlaW5nIG9yZGVyZWQgCisJICogc28gdGhhdCB3ZSBhbHdheXMgcmVjbGFpbSBvcGVuKE9fUkRXUikgYW5kL29yIG9wZW4oT19XUklURSkKKwkgKiBzdGF0ZXMgZmlyc3QuCisJICogVGhpcyBpcyBuZWVkZWQgdG8gZW5zdXJlIHRoYXQgdGhlIHNlcnZlciB3b24ndCBnaXZlIHVzIGFueQorCSAqIHJlYWQgZGVsZWdhdGlvbnMgdGhhdCB3ZSBoYXZlIHRvIHJldHVybiBpZiwgc2F5LCB3ZSBhcmUKKwkgKiByZWNvdmVyaW5nIGFmdGVyIGEgbmV0d29yayBwYXJ0aXRpb24gb3IgYSByZWJvb3QgZnJvbSBhCisJICogc2VydmVyIHRoYXQgZG9lc24ndCBzdXBwb3J0IGEgZ3JhY2UgcGVyaW9kLgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoc3RhdGUsICZzcC0+c29fc3RhdGVzLCBvcGVuX3N0YXRlcykgeworCQlpZiAoc3RhdGUtPnN0YXRlID09IDApCisJCQljb250aW51ZTsKKwkJc3RhdHVzID0gb3BzLT5yZWNvdmVyX29wZW4oc3AsIHN0YXRlKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShsb2NrLCAmc3RhdGUtPmxvY2tfc3RhdGVzLCBsc19sb2NrcykKKwkJCWxvY2stPmxzX2ZsYWdzICY9IH5ORlNfTE9DS19JTklUSUFMSVpFRDsKKwkJaWYgKHN0YXR1cyA+PSAwKSB7CisJCQlzdGF0dXMgPSBuZnM0X3JlY2xhaW1fbG9ja3Mob3BzLCBzdGF0ZSk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIG91dF9lcnI7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvY2ssICZzdGF0ZS0+bG9ja19zdGF0ZXMsIGxzX2xvY2tzKSB7CisJCQkJaWYgKCEobG9jay0+bHNfZmxhZ3MgJiBORlNfTE9DS19JTklUSUFMSVpFRCkpCisJCQkJCXByaW50aygiJXM6IExvY2sgcmVjbGFpbSBmYWlsZWQhXG4iLAorCQkJCQkJCV9fRlVOQ1RJT05fXyk7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlzd2l0Y2ggKHN0YXR1cykgeworCQkJZGVmYXVsdDoKKwkJCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmhhbmRsZWQgZXJyb3IgJWQuIFplcm9pbmcgc3RhdGVcbiIsCisJCQkJCQlfX0ZVTkNUSU9OX18sIHN0YXR1cyk7CisJCQljYXNlIC1FTk9FTlQ6CisJCQljYXNlIC1ORlM0RVJSX1JFQ0xBSU1fQkFEOgorCQkJY2FzZSAtTkZTNEVSUl9SRUNMQUlNX0NPTkZMSUNUOgorCQkJCS8qCisJCQkJICogT3BlbiBzdGF0ZSBvbiB0aGlzIGZpbGUgY2Fubm90IGJlIHJlY292ZXJlZAorCQkJCSAqIEFsbCB3ZSBjYW4gZG8gaXMgcmV2ZXJ0IHRvIHVzaW5nIHRoZSB6ZXJvIHN0YXRlaWQuCisJCQkJICovCisJCQkJbWVtc2V0KHN0YXRlLT5zdGF0ZWlkLmRhdGEsIDAsCisJCQkJCXNpemVvZihzdGF0ZS0+c3RhdGVpZC5kYXRhKSk7CisJCQkJLyogTWFyayB0aGUgZmlsZSBhcyBiZWluZyAnY2xvc2VkJyAqLworCQkJCXN0YXRlLT5zdGF0ZSA9IDA7CisJCQkJYnJlYWs7CisJCQljYXNlIC1ORlM0RVJSX0VYUElSRUQ6CisJCQljYXNlIC1ORlM0RVJSX05PX0dSQUNFOgorCQkJY2FzZSAtTkZTNEVSUl9TVEFMRV9DTElFTlRJRDoKKwkJCQlnb3RvIG91dF9lcnI7CisJCX0KKwl9CisJcmV0dXJuIDA7CitvdXRfZXJyOgorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgcmVjbGFpbWVyKHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgcmVjbGFpbWVyX2FyZ3MgKmFyZ3MgPSAoc3RydWN0IHJlY2xhaW1lcl9hcmdzICopcHRyOworCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwID0gYXJncy0+Y2xwOworCXN0cnVjdCBuZnM0X3N0YXRlX293bmVyICpzcDsKKwlzdHJ1Y3QgbmZzNF9zdGF0ZV9yZWNvdmVyeV9vcHMgKm9wczsKKwlpbnQgc3RhdHVzID0gMDsKKworCWRhZW1vbml6ZSgiJXUuJXUuJXUuJXUtcmVjbGFpbSIsIE5JUFFVQUQoY2xwLT5jbF9hZGRyKSk7CisJYWxsb3dfc2lnbmFsKFNJR0tJTEwpOworCisJYXRvbWljX2luYygmY2xwLT5jbF9jb3VudCk7CisJY29tcGxldGUoJmFyZ3MtPmNvbXBsZXRlKTsKKworCS8qIEVuc3VyZSBleGNsdXNpdmUgYWNjZXNzIHRvIE5GU3Y0IHN0YXRlICovCisJbG9ja19rZXJuZWwoKTsKKwlkb3duX3dyaXRlKCZjbHAtPmNsX3NlbSk7CisJLyogQXJlIHRoZXJlIGFueSBORlMgbW91bnRzIG91dCB0aGVyZT8gKi8KKwlpZiAobGlzdF9lbXB0eSgmY2xwLT5jbF9zdXBlcmJsb2NrcykpCisJCWdvdG8gb3V0OworcmVzdGFydF9sb29wOgorCXN0YXR1cyA9IG5mczRfcHJvY19yZW5ldyhjbHApOworCXN3aXRjaCAoc3RhdHVzKSB7CisJCWNhc2UgMDoKKwkJY2FzZSAtTkZTNEVSUl9DQl9QQVRIX0RPV046CisJCQlnb3RvIG91dDsKKwkJY2FzZSAtTkZTNEVSUl9TVEFMRV9DTElFTlRJRDoKKwkJY2FzZSAtTkZTNEVSUl9MRUFTRV9NT1ZFRDoKKwkJCW9wcyA9ICZuZnM0X3JlYm9vdF9yZWNvdmVyeV9vcHM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCW9wcyA9ICZuZnM0X25ldHdvcmtfcGFydGl0aW9uX3JlY292ZXJ5X29wczsKKwl9OworCXN0YXR1cyA9IF9fbmZzNF9pbml0X2NsaWVudChjbHApOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0X2Vycm9yOworCS8qIE1hcmsgYWxsIGRlbGVnYXRpb25zIGZvciByZWNsYWltICovCisJbmZzX2RlbGVnYXRpb25fbWFya19yZWNsYWltKGNscCk7CisJLyogTm90ZTogbGlzdCBpcyBwcm90ZWN0ZWQgYnkgZXhjbHVzaXZlIGxvY2sgb24gY2wtPmNsX3NlbSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoc3AsICZjbHAtPmNsX3N0YXRlX293bmVycywgc29fbGlzdCkgeworCQlzdGF0dXMgPSBuZnM0X3JlY2xhaW1fb3Blbl9zdGF0ZShvcHMsIHNwKTsKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCWlmIChzdGF0dXMgPT0gLU5GUzRFUlJfTk9fR1JBQ0UpIHsKKwkJCQlvcHMgPSAmbmZzNF9uZXR3b3JrX3BhcnRpdGlvbl9yZWNvdmVyeV9vcHM7CisJCQkJc3RhdHVzID0gbmZzNF9yZWNsYWltX29wZW5fc3RhdGUob3BzLCBzcCk7CisJCQl9CisJCQlpZiAoc3RhdHVzID09IC1ORlM0RVJSX1NUQUxFX0NMSUVOVElEKQorCQkJCWdvdG8gcmVzdGFydF9sb29wOworCQkJaWYgKHN0YXR1cyA9PSAtTkZTNEVSUl9FWFBJUkVEKQorCQkJCWdvdG8gcmVzdGFydF9sb29wOworCQl9CisJfQorCW5mc19kZWxlZ2F0aW9uX3JlYXBfdW5jbGFpbWVkKGNscCk7CitvdXQ6CisJc2V0X2JpdChORlM0Q0xOVF9PSywgJmNscC0+Y2xfc3RhdGUpOworCXVwX3dyaXRlKCZjbHAtPmNsX3NlbSk7CisJdW5sb2NrX2tlcm5lbCgpOworCXdha2VfdXBfYWxsKCZjbHAtPmNsX3dhaXRxKTsKKwlycGNfd2FrZV91cCgmY2xwLT5jbF9ycGN3YWl0cSk7CisJaWYgKHN0YXR1cyA9PSAtTkZTNEVSUl9DQl9QQVRIX0RPV04pCisJCW5mc19oYW5kbGVfY2JfcGF0aGRvd24oY2xwKTsKKwluZnM0X3B1dF9jbGllbnQoY2xwKTsKKwlyZXR1cm4gMDsKK291dF9lcnJvcjoKKwlwcmludGsoS0VSTl9XQVJOSU5HICJFcnJvcjogc3RhdGUgcmVjb3ZlcnkgZmFpbGVkIG9uIE5GU3Y0IHNlcnZlciAldS4ldS4ldS4ldSB3aXRoIGVycm9yICVkXG4iLAorCQkJCU5JUFFVQUQoY2xwLT5jbF9hZGRyLnNfYWRkciksIC1zdGF0dXMpOworCWdvdG8gb3V0OworfQorCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0eGRyLmMgYi9mcy9uZnMvbmZzNHhkci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNGRlMDUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnMvbmZzNHhkci5jCkBAIC0wLDAgKzEsNDAzNCBAQAorLyoKKyAqICBmcy9uZnMvbmZzNHhkci5jCisgKgorICogIENsaWVudC1zaWRlIFhEUiBmb3IgTkZTdjQuCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBNaWNoaWdhbi4KKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBLZW5kcmljayBTbWl0aCA8a21zbWl0aEB1bWljaC5lZHU+CisgKiAgQW5keSBBZGFtc29uICAgPGFuZHJvc0B1bWljaC5lZHU+CisgKiAKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqICBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqICBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnM0Lmg+CisjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbmZzX2lkbWFwLmg+CisKKyNkZWZpbmUgTkZTREJHX0ZBQ0lMSVRZCQlORlNEQkdfWERSCisKKy8qIE1hcHBpbmcgZnJvbSBORlMgZXJyb3IgY29kZSB0byAiZXJybm8iIGVycm9yIGNvZGUuICovCisjZGVmaW5lIGVycm5vX05GU0VSUl9JTwkJRUlPCisKK3N0YXRpYyBpbnQgbmZzX3N0YXRfdG9fZXJybm8oaW50KTsKKworLyogTkZTdjQgQ09NUE9VTkQgdGFncyBhcmUgb25seSB3YW50ZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyAqLworI2lmZGVmIERFQlVHCisjZGVmaW5lIE5GUzRfTUFYVEFHTEVOCQkyMAorI2Vsc2UKKyNkZWZpbmUgTkZTNF9NQVhUQUdMRU4JCTAKKyNlbmRpZgorCisvKiBsb2NrLG9wZW4gb3duZXIgaWQ6IAorICogd2UgY3VycmVudGx5IHVzZSBzaXplIDEgKHUzMikgb3V0IG9mIChORlM0X09QQVFVRV9MSU1JVCAgPj4gMikKKyAqLworI2RlZmluZSBvd25lcl9pZF9tYXhzeiAgICAgICAgICAoMSArIDEpCisjZGVmaW5lIGNvbXBvdW5kX2VuY29kZV9oZHJfbWF4c3oJKDMgKyAoTkZTNF9NQVhUQUdMRU4gPj4gMikpCisjZGVmaW5lIGNvbXBvdW5kX2RlY29kZV9oZHJfbWF4c3oJKDMgKyAoTkZTNF9NQVhUQUdMRU4gPj4gMikpCisjZGVmaW5lIG9wX2VuY29kZV9oZHJfbWF4c3oJKDEpCisjZGVmaW5lIG9wX2RlY29kZV9oZHJfbWF4c3oJKDIpCisjZGVmaW5lIGVuY29kZV9wdXRmaF9tYXhzegkob3BfZW5jb2RlX2hkcl9tYXhzeiArIDEgKyBcCisJCQkJKE5GUzRfRkhTSVpFID4+IDIpKQorI2RlZmluZSBkZWNvZGVfcHV0ZmhfbWF4c3oJKG9wX2RlY29kZV9oZHJfbWF4c3opCisjZGVmaW5lIGVuY29kZV9wdXRyb290ZmhfbWF4c3oJKG9wX2VuY29kZV9oZHJfbWF4c3opCisjZGVmaW5lIGRlY29kZV9wdXRyb290ZmhfbWF4c3oJKG9wX2RlY29kZV9oZHJfbWF4c3opCisjZGVmaW5lIGVuY29kZV9nZXRmaF9tYXhzeiAgICAgIChvcF9lbmNvZGVfaGRyX21heHN6KQorI2RlZmluZSBkZWNvZGVfZ2V0ZmhfbWF4c3ogICAgICAob3BfZGVjb2RlX2hkcl9tYXhzeiArIDEgKyBcCisJCQkJKCgzK05GUzRfRkhTSVpFKSA+PiAyKSkKKyNkZWZpbmUgZW5jb2RlX2dldGF0dHJfbWF4c3ogICAgKG9wX2VuY29kZV9oZHJfbWF4c3ogKyAzKQorI2RlZmluZSBuZnM0X25hbWVfbWF4c3oJCSgxICsgKCgzICsgTkZTNF9NQVhOQU1MRU4pID4+IDIpKQorI2RlZmluZSBuZnM0X3BhdGhfbWF4c3oJCSgxICsgKCgzICsgTkZTNF9NQVhQQVRITEVOKSA+PiAyKSkKKyNkZWZpbmUgbmZzNF9mYXR0cl9iaXRtYXBfbWF4c3ogKDM2ICsgMiAqIG5mczRfbmFtZV9tYXhzeikKKyNkZWZpbmUgZGVjb2RlX2dldGF0dHJfbWF4c3ogICAgKG9wX2RlY29kZV9oZHJfbWF4c3ogKyAzICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZnM0X2ZhdHRyX2JpdG1hcF9tYXhzeikKKyNkZWZpbmUgZW5jb2RlX3NhdmVmaF9tYXhzeiAgICAgKG9wX2VuY29kZV9oZHJfbWF4c3opCisjZGVmaW5lIGRlY29kZV9zYXZlZmhfbWF4c3ogICAgIChvcF9kZWNvZGVfaGRyX21heHN6KQorI2RlZmluZSBlbmNvZGVfZnNpbmZvX21heHN6CShvcF9lbmNvZGVfaGRyX21heHN6ICsgMikKKyNkZWZpbmUgZGVjb2RlX2ZzaW5mb19tYXhzegkob3BfZGVjb2RlX2hkcl9tYXhzeiArIDExKQorI2RlZmluZSBlbmNvZGVfcmVuZXdfbWF4c3oJKG9wX2VuY29kZV9oZHJfbWF4c3ogKyAzKQorI2RlZmluZSBkZWNvZGVfcmVuZXdfbWF4c3oJKG9wX2RlY29kZV9oZHJfbWF4c3opCisjZGVmaW5lIGVuY29kZV9zZXRjbGllbnRpZF9tYXhzeiBcCisJCQkJKG9wX2VuY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJNCAvKnNlcnZlci0+aXBfYWRkciovICsgXAorCQkJCTEgLypOZXRpZCovICsgXAorCQkJCTYgLyp1YWRkciovICsgXAorCQkJCTYgKyAoTkZTNF9WRVJJRklFUl9TSVpFID4+IDIpKQorI2RlZmluZSBkZWNvZGVfc2V0Y2xpZW50aWRfbWF4c3ogXAorCQkJCShvcF9kZWNvZGVfaGRyX21heHN6ICsgXAorCQkJCTIgKyBcCisJCQkJMTAyNCkgLyogbGFyZ2UgdmFsdWUgZm9yIENMSURfSU5VU0UgKi8KKyNkZWZpbmUgZW5jb2RlX3NldGNsaWVudGlkX2NvbmZpcm1fbWF4c3ogXAorCQkJCShvcF9lbmNvZGVfaGRyX21heHN6ICsgXAorCQkJCTMgKyAoTkZTNF9WRVJJRklFUl9TSVpFID4+IDIpKQorI2RlZmluZSBkZWNvZGVfc2V0Y2xpZW50aWRfY29uZmlybV9tYXhzeiBcCisJCQkJKG9wX2RlY29kZV9oZHJfbWF4c3opCisjZGVmaW5lIGVuY29kZV9sb29rdXBfbWF4c3oJKG9wX2VuY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJMSArICgoMyArIE5GUzRfRkhTSVpFKSA+PiAyKSkKKyNkZWZpbmUgZW5jb2RlX3JlbW92ZV9tYXhzegkob3BfZW5jb2RlX2hkcl9tYXhzeiArIFwKKwkJCQluZnM0X25hbWVfbWF4c3opCisjZGVmaW5lIGVuY29kZV9yZW5hbWVfbWF4c3oJKG9wX2VuY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJMiAqIG5mczRfbmFtZV9tYXhzeikKKyNkZWZpbmUgZGVjb2RlX3JlbmFtZV9tYXhzegkob3BfZGVjb2RlX2hkcl9tYXhzeiArIDUgKyA1KQorI2RlZmluZSBlbmNvZGVfbGlua19tYXhzegkob3BfZW5jb2RlX2hkcl9tYXhzeiArIFwKKwkJCQluZnM0X25hbWVfbWF4c3opCisjZGVmaW5lIGRlY29kZV9saW5rX21heHN6CShvcF9kZWNvZGVfaGRyX21heHN6ICsgNSkKKyNkZWZpbmUgZW5jb2RlX3N5bWxpbmtfbWF4c3oJKG9wX2VuY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJMSArIG5mczRfbmFtZV9tYXhzeiArIFwKKwkJCQluZnM0X3BhdGhfbWF4c3ogKyBcCisJCQkJbmZzNF9mYXR0cl9iaXRtYXBfbWF4c3opCisjZGVmaW5lIGRlY29kZV9zeW1saW5rX21heHN6CShvcF9kZWNvZGVfaGRyX21heHN6ICsgOCkKKyNkZWZpbmUgZW5jb2RlX2NyZWF0ZV9tYXhzegkob3BfZW5jb2RlX2hkcl9tYXhzeiArIFwKKwkJCQkyICsgbmZzNF9uYW1lX21heHN6ICsgXAorCQkJCW5mczRfZmF0dHJfYml0bWFwX21heHN6KQorI2RlZmluZSBkZWNvZGVfY3JlYXRlX21heHN6CShvcF9kZWNvZGVfaGRyX21heHN6ICsgOCkKKyNkZWZpbmUgZW5jb2RlX2RlbGVncmV0dXJuX21heHN6IChvcF9lbmNvZGVfaGRyX21heHN6ICsgNCkKKyNkZWZpbmUgZGVjb2RlX2RlbGVncmV0dXJuX21heHN6IChvcF9kZWNvZGVfaGRyX21heHN6KQorI2RlZmluZSBORlM0X2VuY19jb21wb3VuZF9zegkoMTAyNCkgIC8qIFhYWDogbGFyZ2UgZW5vdWdoPyAqLworI2RlZmluZSBORlM0X2RlY19jb21wb3VuZF9zegkoMTAyNCkgIC8qIFhYWDogbGFyZ2UgZW5vdWdoPyAqLworI2RlZmluZSBORlM0X2VuY19yZWFkX3N6CShjb21wb3VuZF9lbmNvZGVfaGRyX21heHN6ICsgXAorCQkJCWVuY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQlvcF9lbmNvZGVfaGRyX21heHN6ICsgNykKKyNkZWZpbmUgTkZTNF9kZWNfcmVhZF9zegkoY29tcG91bmRfZGVjb2RlX2hkcl9tYXhzeiArIFwKKwkJCQlkZWNvZGVfcHV0ZmhfbWF4c3ogKyBcCisJCQkJb3BfZGVjb2RlX2hkcl9tYXhzeiArIDIpCisjZGVmaW5lIE5GUzRfZW5jX3JlYWRsaW5rX3N6CShjb21wb3VuZF9lbmNvZGVfaGRyX21heHN6ICsgXAorCQkJCWVuY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQlvcF9lbmNvZGVfaGRyX21heHN6KQorI2RlZmluZSBORlM0X2RlY19yZWFkbGlua19zegkoY29tcG91bmRfZGVjb2RlX2hkcl9tYXhzeiArIFwKKwkJCQlkZWNvZGVfcHV0ZmhfbWF4c3ogKyBcCisJCQkJb3BfZGVjb2RlX2hkcl9tYXhzeikKKyNkZWZpbmUgTkZTNF9lbmNfcmVhZGRpcl9zegkoY29tcG91bmRfZW5jb2RlX2hkcl9tYXhzeiArIFwKKwkJCQllbmNvZGVfcHV0ZmhfbWF4c3ogKyBcCisJCQkJb3BfZW5jb2RlX2hkcl9tYXhzeiArIDkpCisjZGVmaW5lIE5GUzRfZGVjX3JlYWRkaXJfc3oJKGNvbXBvdW5kX2RlY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJZGVjb2RlX3B1dGZoX21heHN6ICsgXAorCQkJCW9wX2RlY29kZV9oZHJfbWF4c3ogKyAyKQorI2RlZmluZSBORlM0X2VuY193cml0ZV9zegkoY29tcG91bmRfZW5jb2RlX2hkcl9tYXhzeiArIFwKKwkJCQllbmNvZGVfcHV0ZmhfbWF4c3ogKyBcCisJCQkJb3BfZW5jb2RlX2hkcl9tYXhzeiArIDgpCisjZGVmaW5lIE5GUzRfZGVjX3dyaXRlX3N6CShjb21wb3VuZF9kZWNvZGVfaGRyX21heHN6ICsgXAorCQkJCWRlY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQlvcF9kZWNvZGVfaGRyX21heHN6ICsgNCkKKyNkZWZpbmUgTkZTNF9lbmNfY29tbWl0X3N6CShjb21wb3VuZF9lbmNvZGVfaGRyX21heHN6ICsgXAorCQkJCWVuY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQlvcF9lbmNvZGVfaGRyX21heHN6ICsgMykKKyNkZWZpbmUgTkZTNF9kZWNfY29tbWl0X3N6CShjb21wb3VuZF9kZWNvZGVfaGRyX21heHN6ICsgXAorCQkJCWRlY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQlvcF9kZWNvZGVfaGRyX21heHN6ICsgMikKKyNkZWZpbmUgTkZTNF9lbmNfb3Blbl9zeiAgICAgICAgKGNvbXBvdW5kX2VuY29kZV9oZHJfbWF4c3ogKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZV9wdXRmaF9tYXhzeiArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfZW5jb2RlX2hkcl9tYXhzeiArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMgKyAzICsgMiArIDY0ICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVfZ2V0YXR0cl9tYXhzeiArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlX2dldGZoX21heHN6KQorI2RlZmluZSBORlM0X2RlY19vcGVuX3N6ICAgICAgICAoY29tcG91bmRfZGVjb2RlX2hkcl9tYXhzeiArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlX3B1dGZoX21heHN6ICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9kZWNvZGVfaGRyX21heHN6ICsgNCArIDUgKyAyICsgMyArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2dldGF0dHJfbWF4c3ogKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9nZXRmaF9tYXhzeikKKyNkZWZpbmUgTkZTNF9lbmNfb3Blbl9jb25maXJtX3N6ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29tcG91bmRfZW5jb2RlX2hkcl9tYXhzeiArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlX3B1dGZoX21heHN6ICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9lbmNvZGVfaGRyX21heHN6ICsgNSkKKyNkZWZpbmUgTkZTNF9kZWNfb3Blbl9jb25maXJtX3N6ICAgICAgICAoY29tcG91bmRfZGVjb2RlX2hkcl9tYXhzeiArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVfcHV0ZmhfbWF4c3ogKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfZGVjb2RlX2hkcl9tYXhzeiArIDQpCisjZGVmaW5lIE5GUzRfZW5jX29wZW5fbm9hdHRyX3N6CShjb21wb3VuZF9lbmNvZGVfaGRyX21heHN6ICsgXAorCQkJCQllbmNvZGVfcHV0ZmhfbWF4c3ogKyBcCisJCQkJCW9wX2VuY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJCTExKQorI2RlZmluZSBORlM0X2RlY19vcGVuX25vYXR0cl9zegkoY29tcG91bmRfZGVjb2RlX2hkcl9tYXhzeiArIFwKKwkJCQkJZGVjb2RlX3B1dGZoX21heHN6ICsgXAorCQkJCQlvcF9kZWNvZGVfaGRyX21heHN6ICsgXAorCQkJCQk0ICsgNSArIDIgKyAzKQorI2RlZmluZSBORlM0X2VuY19vcGVuX2Rvd25ncmFkZV9zeiBcCisJCQkJKGNvbXBvdW5kX2VuY29kZV9oZHJfbWF4c3ogKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZV9wdXRmaF9tYXhzeiArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfZW5jb2RlX2hkcl9tYXhzeiArIDcpCisjZGVmaW5lIE5GUzRfZGVjX29wZW5fZG93bmdyYWRlX3N6IFwKKwkJCQkoY29tcG91bmRfZGVjb2RlX2hkcl9tYXhzeiArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlX3B1dGZoX21heHN6ICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9kZWNvZGVfaGRyX21heHN6ICsgNCkKKyNkZWZpbmUgTkZTNF9lbmNfY2xvc2Vfc3ogICAgICAgKGNvbXBvdW5kX2VuY29kZV9oZHJfbWF4c3ogKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZV9wdXRmaF9tYXhzeiArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfZW5jb2RlX2hkcl9tYXhzeiArIDUpCisjZGVmaW5lIE5GUzRfZGVjX2Nsb3NlX3N6ICAgICAgIChjb21wb3VuZF9kZWNvZGVfaGRyX21heHN6ICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVfcHV0ZmhfbWF4c3ogKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX2RlY29kZV9oZHJfbWF4c3ogKyA0KQorI2RlZmluZSBORlM0X2VuY19zZXRhdHRyX3N6ICAgICAoY29tcG91bmRfZW5jb2RlX2hkcl9tYXhzeiArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlX3B1dGZoX21heHN6ICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9lbmNvZGVfaGRyX21heHN6ICsgNCArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmZzNF9mYXR0cl9iaXRtYXBfbWF4c3ogKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZV9nZXRhdHRyX21heHN6KQorI2RlZmluZSBORlM0X2RlY19zZXRhdHRyX3N6ICAgICAoY29tcG91bmRfZGVjb2RlX2hkcl9tYXhzeiArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlX3B1dGZoX21heHN6ICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9kZWNvZGVfaGRyX21heHN6ICsgMykKKyNkZWZpbmUgTkZTNF9lbmNfZnNpbmZvX3N6CShjb21wb3VuZF9lbmNvZGVfaGRyX21heHN6ICsgXAorCQkJCWVuY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQllbmNvZGVfZnNpbmZvX21heHN6KQorI2RlZmluZSBORlM0X2RlY19mc2luZm9fc3oJKGNvbXBvdW5kX2RlY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJZGVjb2RlX3B1dGZoX21heHN6ICsgXAorCQkJCWRlY29kZV9mc2luZm9fbWF4c3opCisjZGVmaW5lIE5GUzRfZW5jX3JlbmV3X3N6CShjb21wb3VuZF9lbmNvZGVfaGRyX21heHN6ICsgXAorCQkJCWVuY29kZV9yZW5ld19tYXhzeikKKyNkZWZpbmUgTkZTNF9kZWNfcmVuZXdfc3oJKGNvbXBvdW5kX2RlY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJZGVjb2RlX3JlbmV3X21heHN6KQorI2RlZmluZSBORlM0X2VuY19zZXRjbGllbnRpZF9zegkoY29tcG91bmRfZW5jb2RlX2hkcl9tYXhzeiArIFwKKwkJCQllbmNvZGVfc2V0Y2xpZW50aWRfbWF4c3opCisjZGVmaW5lIE5GUzRfZGVjX3NldGNsaWVudGlkX3N6CShjb21wb3VuZF9kZWNvZGVfaGRyX21heHN6ICsgXAorCQkJCWRlY29kZV9zZXRjbGllbnRpZF9tYXhzeikKKyNkZWZpbmUgTkZTNF9lbmNfc2V0Y2xpZW50aWRfY29uZmlybV9zeiBcCisJCQkJKGNvbXBvdW5kX2VuY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJZW5jb2RlX3NldGNsaWVudGlkX2NvbmZpcm1fbWF4c3ogKyBcCisJCQkJZW5jb2RlX3B1dHJvb3RmaF9tYXhzeiArIFwKKwkJCQllbmNvZGVfZnNpbmZvX21heHN6KQorI2RlZmluZSBORlM0X2RlY19zZXRjbGllbnRpZF9jb25maXJtX3N6IFwKKwkJCQkoY29tcG91bmRfZGVjb2RlX2hkcl9tYXhzeiArIFwKKwkJCQlkZWNvZGVfc2V0Y2xpZW50aWRfY29uZmlybV9tYXhzeiArIFwKKwkJCQlkZWNvZGVfcHV0cm9vdGZoX21heHN6ICsgXAorCQkJCWRlY29kZV9mc2luZm9fbWF4c3opCisjZGVmaW5lIE5GUzRfZW5jX2xvY2tfc3ogICAgICAgIChjb21wb3VuZF9lbmNvZGVfaGRyX21heHN6ICsgXAorCQkJCWVuY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQllbmNvZGVfZ2V0YXR0cl9tYXhzeiArIFwKKwkJCQlvcF9lbmNvZGVfaGRyX21heHN6ICsgXAorCQkJCTEgKyAxICsgMiArIDIgKyBcCisJCQkJMSArIDQgKyAxICsgMiArIFwKKwkJCQlvd25lcl9pZF9tYXhzeikKKyNkZWZpbmUgTkZTNF9kZWNfbG9ja19zeiAgICAgICAgKGNvbXBvdW5kX2RlY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJZGVjb2RlX3B1dGZoX21heHN6ICsgXAorCQkJCWRlY29kZV9nZXRhdHRyX21heHN6ICsgXAorCQkJCW9wX2RlY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJMiArIDIgKyAxICsgMiArIFwKKwkJCQlvd25lcl9pZF9tYXhzeikKKyNkZWZpbmUgTkZTNF9lbmNfbG9ja3Rfc3ogICAgICAgKGNvbXBvdW5kX2VuY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJZW5jb2RlX3B1dGZoX21heHN6ICsgXAorCQkJCWVuY29kZV9nZXRhdHRyX21heHN6ICsgXAorCQkJCW9wX2VuY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJMSArIDIgKyAyICsgMiArIFwKKwkJCQlvd25lcl9pZF9tYXhzeikKKyNkZWZpbmUgTkZTNF9kZWNfbG9ja3Rfc3ogICAgICAgKE5GUzRfZGVjX2xvY2tfc3opCisjZGVmaW5lIE5GUzRfZW5jX2xvY2t1X3N6ICAgICAgIChjb21wb3VuZF9lbmNvZGVfaGRyX21heHN6ICsgXAorCQkJCWVuY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQllbmNvZGVfZ2V0YXR0cl9tYXhzeiArIFwKKwkJCQlvcF9lbmNvZGVfaGRyX21heHN6ICsgXAorCQkJCTEgKyAxICsgNCArIDIgKyAyKQorI2RlZmluZSBORlM0X2RlY19sb2NrdV9zeiAgICAgICAoY29tcG91bmRfZGVjb2RlX2hkcl9tYXhzeiArIFwKKwkJCQlkZWNvZGVfcHV0ZmhfbWF4c3ogKyBcCisJCQkJZGVjb2RlX2dldGF0dHJfbWF4c3ogKyBcCisJCQkJb3BfZGVjb2RlX2hkcl9tYXhzeiArIDQpCisjZGVmaW5lIE5GUzRfZW5jX2FjY2Vzc19zegkoY29tcG91bmRfZW5jb2RlX2hkcl9tYXhzeiArIFwKKwkJCQllbmNvZGVfcHV0ZmhfbWF4c3ogKyBcCisJCQkJb3BfZW5jb2RlX2hkcl9tYXhzeiArIDEpCisjZGVmaW5lIE5GUzRfZGVjX2FjY2Vzc19zegkoY29tcG91bmRfZGVjb2RlX2hkcl9tYXhzeiArIFwKKwkJCQlkZWNvZGVfcHV0ZmhfbWF4c3ogKyBcCisJCQkJb3BfZGVjb2RlX2hkcl9tYXhzeiArIDIpCisjZGVmaW5lIE5GUzRfZW5jX2dldGF0dHJfc3oJKGNvbXBvdW5kX2VuY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJZW5jb2RlX3B1dGZoX21heHN6ICsgXAorCQkJCWVuY29kZV9nZXRhdHRyX21heHN6KQorI2RlZmluZSBORlM0X2RlY19nZXRhdHRyX3N6CShjb21wb3VuZF9kZWNvZGVfaGRyX21heHN6ICsgXAorCQkJCWRlY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQlkZWNvZGVfZ2V0YXR0cl9tYXhzeikKKyNkZWZpbmUgTkZTNF9lbmNfbG9va3VwX3N6CShjb21wb3VuZF9lbmNvZGVfaGRyX21heHN6ICsgXAorCQkJCWVuY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQllbmNvZGVfbG9va3VwX21heHN6ICsgXAorCQkJCWVuY29kZV9nZXRhdHRyX21heHN6ICsgXAorCQkJCWVuY29kZV9nZXRmaF9tYXhzeikKKyNkZWZpbmUgTkZTNF9kZWNfbG9va3VwX3N6CShjb21wb3VuZF9kZWNvZGVfaGRyX21heHN6ICsgXAorCQkJCWRlY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQlvcF9kZWNvZGVfaGRyX21heHN6ICsgXAorCQkJCWRlY29kZV9nZXRhdHRyX21heHN6ICsgXAorCQkJCWRlY29kZV9nZXRmaF9tYXhzeikKKyNkZWZpbmUgTkZTNF9lbmNfbG9va3VwX3Jvb3Rfc3ogKGNvbXBvdW5kX2VuY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJZW5jb2RlX3B1dHJvb3RmaF9tYXhzeiArIFwKKwkJCQllbmNvZGVfZ2V0YXR0cl9tYXhzeiArIFwKKwkJCQllbmNvZGVfZ2V0ZmhfbWF4c3opCisjZGVmaW5lIE5GUzRfZGVjX2xvb2t1cF9yb290X3N6IChjb21wb3VuZF9kZWNvZGVfaGRyX21heHN6ICsgXAorCQkJCWRlY29kZV9wdXRyb290ZmhfbWF4c3ogKyBcCisJCQkJZGVjb2RlX2dldGF0dHJfbWF4c3ogKyBcCisJCQkJZGVjb2RlX2dldGZoX21heHN6KQorI2RlZmluZSBORlM0X2VuY19yZW1vdmVfc3oJKGNvbXBvdW5kX2VuY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJZW5jb2RlX3B1dGZoX21heHN6ICsgXAorCQkJCWVuY29kZV9yZW1vdmVfbWF4c3opCisjZGVmaW5lIE5GUzRfZGVjX3JlbW92ZV9zegkoY29tcG91bmRfZGVjb2RlX2hkcl9tYXhzeiArIFwKKwkJCQlkZWNvZGVfcHV0ZmhfbWF4c3ogKyBcCisJCQkJb3BfZGVjb2RlX2hkcl9tYXhzeiArIDUpCisjZGVmaW5lIE5GUzRfZW5jX3JlbmFtZV9zegkoY29tcG91bmRfZW5jb2RlX2hkcl9tYXhzeiArIFwKKwkJCQllbmNvZGVfcHV0ZmhfbWF4c3ogKyBcCisJCQkJZW5jb2RlX3NhdmVmaF9tYXhzeiArIFwKKwkJCQllbmNvZGVfcHV0ZmhfbWF4c3ogKyBcCisJCQkJZW5jb2RlX3JlbmFtZV9tYXhzeikKKyNkZWZpbmUgTkZTNF9kZWNfcmVuYW1lX3N6CShjb21wb3VuZF9kZWNvZGVfaGRyX21heHN6ICsgXAorCQkJCWRlY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQlkZWNvZGVfc2F2ZWZoX21heHN6ICsgXAorCQkJCWRlY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQlkZWNvZGVfcmVuYW1lX21heHN6KQorI2RlZmluZSBORlM0X2VuY19saW5rX3N6CShjb21wb3VuZF9lbmNvZGVfaGRyX21heHN6ICsgXAorCQkJCWVuY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQllbmNvZGVfc2F2ZWZoX21heHN6ICsgXAorCQkJCWVuY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQllbmNvZGVfbGlua19tYXhzeikKKyNkZWZpbmUgTkZTNF9kZWNfbGlua19zegkoY29tcG91bmRfZGVjb2RlX2hkcl9tYXhzeiArIFwKKwkJCQlkZWNvZGVfcHV0ZmhfbWF4c3ogKyBcCisJCQkJZGVjb2RlX3NhdmVmaF9tYXhzeiArIFwKKwkJCQlkZWNvZGVfcHV0ZmhfbWF4c3ogKyBcCisJCQkJZGVjb2RlX2xpbmtfbWF4c3opCisjZGVmaW5lIE5GUzRfZW5jX3N5bWxpbmtfc3oJKGNvbXBvdW5kX2VuY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJZW5jb2RlX3B1dGZoX21heHN6ICsgXAorCQkJCWVuY29kZV9zeW1saW5rX21heHN6ICsgXAorCQkJCWVuY29kZV9nZXRhdHRyX21heHN6ICsgXAorCQkJCWVuY29kZV9nZXRmaF9tYXhzeikKKyNkZWZpbmUgTkZTNF9kZWNfc3ltbGlua19zegkoY29tcG91bmRfZGVjb2RlX2hkcl9tYXhzeiArIFwKKwkJCQlkZWNvZGVfcHV0ZmhfbWF4c3ogKyBcCisJCQkJZGVjb2RlX3N5bWxpbmtfbWF4c3ogKyBcCisJCQkJZGVjb2RlX2dldGF0dHJfbWF4c3ogKyBcCisJCQkJZGVjb2RlX2dldGZoX21heHN6KQorI2RlZmluZSBORlM0X2VuY19jcmVhdGVfc3oJKGNvbXBvdW5kX2VuY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJZW5jb2RlX3B1dGZoX21heHN6ICsgXAorCQkJCWVuY29kZV9jcmVhdGVfbWF4c3ogKyBcCisJCQkJZW5jb2RlX2dldGF0dHJfbWF4c3ogKyBcCisJCQkJZW5jb2RlX2dldGZoX21heHN6KQorI2RlZmluZSBORlM0X2RlY19jcmVhdGVfc3oJKGNvbXBvdW5kX2RlY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJZGVjb2RlX3B1dGZoX21heHN6ICsgXAorCQkJCWRlY29kZV9jcmVhdGVfbWF4c3ogKyBcCisJCQkJZGVjb2RlX2dldGF0dHJfbWF4c3ogKyBcCisJCQkJZGVjb2RlX2dldGZoX21heHN6KQorI2RlZmluZSBORlM0X2VuY19wYXRoY29uZl9zegkoY29tcG91bmRfZW5jb2RlX2hkcl9tYXhzeiArIFwKKwkJCQllbmNvZGVfcHV0ZmhfbWF4c3ogKyBcCisJCQkJZW5jb2RlX2dldGF0dHJfbWF4c3opCisjZGVmaW5lIE5GUzRfZGVjX3BhdGhjb25mX3N6CShjb21wb3VuZF9kZWNvZGVfaGRyX21heHN6ICsgXAorCQkJCWRlY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQlkZWNvZGVfZ2V0YXR0cl9tYXhzeikKKyNkZWZpbmUgTkZTNF9lbmNfc3RhdGZzX3N6CShjb21wb3VuZF9lbmNvZGVfaGRyX21heHN6ICsgXAorCQkJCWVuY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQllbmNvZGVfZ2V0YXR0cl9tYXhzeikKKyNkZWZpbmUgTkZTNF9kZWNfc3RhdGZzX3N6CShjb21wb3VuZF9kZWNvZGVfaGRyX21heHN6ICsgXAorCQkJCWRlY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQlvcF9kZWNvZGVfaGRyX21heHN6ICsgMTIpCisjZGVmaW5lIE5GUzRfZW5jX3NlcnZlcl9jYXBzX3N6IChjb21wb3VuZF9lbmNvZGVfaGRyX21heHN6ICsgXAorCQkJCWVuY29kZV9nZXRhdHRyX21heHN6KQorI2RlZmluZSBORlM0X2RlY19zZXJ2ZXJfY2Fwc19zeiAoY29tcG91bmRfZGVjb2RlX2hkcl9tYXhzeiArIFwKKwkJCQlkZWNvZGVfZ2V0YXR0cl9tYXhzeikKKyNkZWZpbmUgTkZTNF9lbmNfZGVsZWdyZXR1cm5fc3oJKGNvbXBvdW5kX2VuY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJZW5jb2RlX3B1dGZoX21heHN6ICsgXAorCQkJCWVuY29kZV9kZWxlZ3JldHVybl9tYXhzeikKKyNkZWZpbmUgTkZTNF9kZWNfZGVsZWdyZXR1cm5fc3ogKGNvbXBvdW5kX2RlY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJZGVjb2RlX2RlbGVncmV0dXJuX21heHN6KQorCitzdGF0aWMgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQJbW9kZTsKKwl1bnNpZ25lZCBpbnQJbmZzMnR5cGU7Cit9IG5mc190eXBlMmZtdFtdID0geworCXsgMCwJCU5GTk9OCSAgICAgfSwKKwl7IFNfSUZSRUcsCU5GUkVHCSAgICAgfSwKKwl7IFNfSUZESVIsCU5GRElSCSAgICAgfSwKKwl7IFNfSUZCTEssCU5GQkxLCSAgICAgfSwKKwl7IFNfSUZDSFIsCU5GQ0hSCSAgICAgfSwKKwl7IFNfSUZMTkssCU5GTE5LCSAgICAgfSwKKwl7IFNfSUZTT0NLLAlORlNPQ0sJICAgICB9LAorCXsgU19JRklGTywJTkZGSUZPCSAgICAgfSwKKwl7IDAsCQlORk5PTgkgICAgIH0sCisJeyAwLAkJTkZOT04JICAgICB9LAorfTsKKworc3RydWN0IGNvbXBvdW5kX2hkciB7CisJaW50MzJfdAkJc3RhdHVzOworCXVpbnQzMl90CW5vcHM7CisJdWludDMyX3QJdGFnbGVuOworCWNoYXIgKgkJdGFnOworfTsKKworLyoKKyAqIFNUQVJUIE9GICJHRU5FUklDIiBFTkNPREUgUk9VVElORVMuCisgKiAgIFRoZXNlIG1heSBsb29rIGEgbGl0dGxlIHVnbHkgc2luY2UgdGhleSBhcmUgaW1wb3J0ZWQgZnJvbSBhICJnZW5lcmljIgorICogc2V0IG9mIFhEUiBlbmNvZGUvZGVjb2RlIHJvdXRpbmVzIHdoaWNoIGFyZSBpbnRlbmRlZCB0byBiZSBzaGFyZWQgYnkKKyAqIGFsbCBvZiBvdXIgTkZTdjQgaW1wbGVtZW50YXRpb25zIChPcGVuQlNELCBNYWNPUyBYLi4uKS4KKyAqCisgKiBJZiB0aGUgcGFpbiBvZiByZWFkaW5nIHRoZXNlIGlzIHRvbyBncmVhdCwgaXQgc2hvdWxkIGJlIGEgc3RyYWlnaHRmb3J3YXJkCisgKiB0YXNrIHRvIHRyYW5zbGF0ZSB0aGVtIGludG8gTGludXgtc3BlY2lmaWMgdmVyc2lvbnMgd2hpY2ggYXJlIG1vcmUKKyAqIGNvbnNpc3RlbnQgd2l0aCB0aGUgc3R5bGUgdXNlZCBpbiBORlN2Mi92My4uLgorICovCisjZGVmaW5lIFdSSVRFMzIobikgICAgICAgICAgICAgICAqcCsrID0gaHRvbmwobikKKyNkZWZpbmUgV1JJVEU2NChuKSAgICAgICAgICAgICAgIGRvIHsJCQkJXAorCSpwKysgPSBodG9ubCgodWludDMyX3QpKChuKSA+PiAzMikpOwkJCQlcCisJKnArKyA9IGh0b25sKCh1aW50MzJfdCkobikpOwkJCQkJXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgV1JJVEVNRU0ocHRyLG5ieXRlcykgICAgIGRvIHsJCQkJXAorCXAgPSB4ZHJfZW5jb2RlX29wYXF1ZV9maXhlZChwLCBwdHIsIG5ieXRlcyk7CQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFJFU0VSVkVfU1BBQ0UobmJ5dGVzKQlkbyB7CQkJCVwKKwlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCBuYnl0ZXMpOwkJCVwKKwlpZiAoIXApIHByaW50aygiUkVTRVJWRV9TUEFDRSglZCkgZmFpbGVkIGluIGZ1bmN0aW9uICVzXG4iLCAoaW50KSAobmJ5dGVzKSwgX19GVU5DVElPTl9fKTsgXAorCUJVR19PTighcCk7CQkJCQkJXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgZW5jb2RlX3N0cmluZyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1bnNpZ25lZCBpbnQgbGVuLCBjb25zdCBjaGFyICpzdHIpCit7CisJdWludDMyX3QgKnA7CisKKwlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCA0ICsgbGVuKTsKKwlCVUdfT04ocCA9PSBOVUxMKTsKKwl4ZHJfZW5jb2RlX29wYXF1ZShwLCBzdHIsIGxlbik7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX2NvbXBvdW5kX2hkcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgY29tcG91bmRfaGRyICpoZHIpCit7CisJdWludDMyX3QgKnA7CisKKwlkcHJpbnRrKCJlbmNvZGVfY29tcG91bmQ6IHRhZz0lLipzXG4iLCAoaW50KWhkci0+dGFnbGVuLCBoZHItPnRhZyk7CisJQlVHX09OKGhkci0+dGFnbGVuID4gTkZTNF9NQVhUQUdMRU4pOworCVJFU0VSVkVfU1BBQ0UoMTIrKFhEUl9RVUFETEVOKGhkci0+dGFnbGVuKTw8MikpOworCVdSSVRFMzIoaGRyLT50YWdsZW4pOworCVdSSVRFTUVNKGhkci0+dGFnLCBoZHItPnRhZ2xlbik7CisJV1JJVEUzMihORlM0X01JTk9SX1ZFUlNJT04pOworCVdSSVRFMzIoaGRyLT5ub3BzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZW5jb2RlX25mczRfdmVyaWZpZXIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3QgbmZzNF92ZXJpZmllciAqdmVyZikKK3sKKwl1aW50MzJfdCAqcDsKKworCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIE5GUzRfVkVSSUZJRVJfU0laRSk7CisJQlVHX09OKHAgPT0gTlVMTCk7CisJeGRyX2VuY29kZV9vcGFxdWVfZml4ZWQocCwgdmVyZi0+ZGF0YSwgTkZTNF9WRVJJRklFUl9TSVpFKTsKK30KKworc3RhdGljIGludCBlbmNvZGVfYXR0cnMoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IGlhdHRyICppYXAsIGNvbnN0IHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIpCit7CisJY2hhciBvd25lcl9uYW1lW0lETUFQX05BTUVTWl07CisJY2hhciBvd25lcl9ncm91cFtJRE1BUF9OQU1FU1pdOworCWludCBvd25lcl9uYW1lbGVuID0gMDsKKwlpbnQgb3duZXJfZ3JvdXBsZW4gPSAwOworCXVpbnQzMl90ICpwOworCXVpbnQzMl90ICpxOworCWludCBsZW47CisJdWludDMyX3QgYm12YWwwID0gMDsKKwl1aW50MzJfdCBibXZhbDEgPSAwOworCWludCBzdGF0dXM7CisKKwkvKgorCSAqIFdlIHJlc2VydmUgZW5vdWdoIHNwYWNlIHRvIHdyaXRlIHRoZSBlbnRpcmUgYXR0cmlidXRlIGJ1ZmZlciBhdCBvbmNlLgorCSAqIEluIHRoZSB3b3JzdC1jYXNlLCB0aGlzIHdvdWxkIGJlCisJICogICAxMihiaXRtYXApICsgNChhdHRybGVuKSArIDgoc2l6ZSkgKyA0KG1vZGUpICsgNChhdGltZSkgKyA0KG10aW1lKQorCSAqICAgICAgICAgID0gMzYgYnl0ZXMsIHBsdXMgYW55IGNvbnRyaWJ1dGlvbiBmcm9tIHZhcmlhYmxlLWxlbmd0aCBmaWVsZHMKKwkgKiAgICAgICAgICAgIHN1Y2ggYXMgb3duZXIvZ3JvdXAvYWNsJ3MuCisJICovCisJbGVuID0gMTY7CisKKwkvKiBTaWdoICovCisJaWYgKGlhcC0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpCisJCWxlbiArPSA4OworCWlmIChpYXAtPmlhX3ZhbGlkICYgQVRUUl9NT0RFKQorCQlsZW4gKz0gNDsKKwlpZiAoaWFwLT5pYV92YWxpZCAmIEFUVFJfVUlEKSB7CisJCW93bmVyX25hbWVsZW4gPSBuZnNfbWFwX3VpZF90b19uYW1lKHNlcnZlci0+bmZzNF9zdGF0ZSwgaWFwLT5pYV91aWQsIG93bmVyX25hbWUpOworCQlpZiAob3duZXJfbmFtZWxlbiA8IDApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm5mczogY291bGRuJ3QgcmVzb2x2ZSB1aWQgJWQgdG8gc3RyaW5nXG4iLAorCQkJICAgICAgIGlhcC0+aWFfdWlkKTsKKwkJCS8qIFhYWCAqLworCQkJc3RyY3B5KG93bmVyX25hbWUsICJub2JvZHkiKTsKKwkJCW93bmVyX25hbWVsZW4gPSBzaXplb2YoIm5vYm9keSIpIC0gMTsKKwkJCS8qIGdvdG8gb3V0OyAqLworCQl9CisJCWxlbiArPSA0ICsgKFhEUl9RVUFETEVOKG93bmVyX25hbWVsZW4pIDw8IDIpOworCX0KKwlpZiAoaWFwLT5pYV92YWxpZCAmIEFUVFJfR0lEKSB7CisJCW93bmVyX2dyb3VwbGVuID0gbmZzX21hcF9naWRfdG9fZ3JvdXAoc2VydmVyLT5uZnM0X3N0YXRlLCBpYXAtPmlhX2dpZCwgb3duZXJfZ3JvdXApOworCQlpZiAob3duZXJfZ3JvdXBsZW4gPCAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJuZnM0OiBjb3VsZG4ndCByZXNvbHZlIGdpZCAlZCB0byBzdHJpbmdcbiIsCisJCQkgICAgICAgaWFwLT5pYV9naWQpOworCQkJc3RyY3B5KG93bmVyX2dyb3VwLCAibm9ib2R5Iik7CisJCQlvd25lcl9ncm91cGxlbiA9IHNpemVvZigibm9ib2R5IikgLSAxOworCQkJLyogZ290byBvdXQ7ICovCisJCX0KKwkJbGVuICs9IDQgKyAoWERSX1FVQURMRU4ob3duZXJfZ3JvdXBsZW4pIDw8IDIpOworCX0KKwlpZiAoaWFwLT5pYV92YWxpZCAmIEFUVFJfQVRJTUVfU0VUKQorCQlsZW4gKz0gMTY7CisJZWxzZSBpZiAoaWFwLT5pYV92YWxpZCAmIEFUVFJfQVRJTUUpCisJCWxlbiArPSA0OworCWlmIChpYXAtPmlhX3ZhbGlkICYgQVRUUl9NVElNRV9TRVQpCisJCWxlbiArPSAxNjsKKwllbHNlIGlmIChpYXAtPmlhX3ZhbGlkICYgQVRUUl9NVElNRSkKKwkJbGVuICs9IDQ7CisJUkVTRVJWRV9TUEFDRShsZW4pOworCisJLyoKKwkgKiBXZSB3cml0ZSB0aGUgYml0bWFwIGxlbmd0aCBub3csIGJ1dCBsZWF2ZSB0aGUgYml0bWFwIGFuZCB0aGUgYXR0cmlidXRlCisJICogYnVmZmVyIGxlbmd0aCB0byBiZSBiYWNrZmlsbGVkIGF0IHRoZSBlbmQgb2YgdGhpcyByb3V0aW5lLgorCSAqLworCVdSSVRFMzIoMik7CisJcSA9IHA7CisJcCArPSAzOworCisJaWYgKGlhcC0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpIHsKKwkJYm12YWwwIHw9IEZBVFRSNF9XT1JEMF9TSVpFOworCQlXUklURTY0KGlhcC0+aWFfc2l6ZSk7CisJfQorCWlmIChpYXAtPmlhX3ZhbGlkICYgQVRUUl9NT0RFKSB7CisJCWJtdmFsMSB8PSBGQVRUUjRfV09SRDFfTU9ERTsKKwkJV1JJVEUzMihpYXAtPmlhX21vZGUpOworCX0KKwlpZiAoaWFwLT5pYV92YWxpZCAmIEFUVFJfVUlEKSB7CisJCWJtdmFsMSB8PSBGQVRUUjRfV09SRDFfT1dORVI7CisJCVdSSVRFMzIob3duZXJfbmFtZWxlbik7CisJCVdSSVRFTUVNKG93bmVyX25hbWUsIG93bmVyX25hbWVsZW4pOworCX0KKwlpZiAoaWFwLT5pYV92YWxpZCAmIEFUVFJfR0lEKSB7CisJCWJtdmFsMSB8PSBGQVRUUjRfV09SRDFfT1dORVJfR1JPVVA7CisJCVdSSVRFMzIob3duZXJfZ3JvdXBsZW4pOworCQlXUklURU1FTShvd25lcl9ncm91cCwgb3duZXJfZ3JvdXBsZW4pOworCX0KKwlpZiAoaWFwLT5pYV92YWxpZCAmIEFUVFJfQVRJTUVfU0VUKSB7CisJCWJtdmFsMSB8PSBGQVRUUjRfV09SRDFfVElNRV9BQ0NFU1NfU0VUOworCQlXUklURTMyKE5GUzRfU0VUX1RPX0NMSUVOVF9USU1FKTsKKwkJV1JJVEUzMigwKTsKKwkJV1JJVEUzMihpYXAtPmlhX210aW1lLnR2X3NlYyk7CisJCVdSSVRFMzIoaWFwLT5pYV9tdGltZS50dl9uc2VjKTsKKwl9CisJZWxzZSBpZiAoaWFwLT5pYV92YWxpZCAmIEFUVFJfQVRJTUUpIHsKKwkJYm12YWwxIHw9IEZBVFRSNF9XT1JEMV9USU1FX0FDQ0VTU19TRVQ7CisJCVdSSVRFMzIoTkZTNF9TRVRfVE9fU0VSVkVSX1RJTUUpOworCX0KKwlpZiAoaWFwLT5pYV92YWxpZCAmIEFUVFJfTVRJTUVfU0VUKSB7CisJCWJtdmFsMSB8PSBGQVRUUjRfV09SRDFfVElNRV9NT0RJRllfU0VUOworCQlXUklURTMyKE5GUzRfU0VUX1RPX0NMSUVOVF9USU1FKTsKKwkJV1JJVEUzMigwKTsKKwkJV1JJVEUzMihpYXAtPmlhX210aW1lLnR2X3NlYyk7CisJCVdSSVRFMzIoaWFwLT5pYV9tdGltZS50dl9uc2VjKTsKKwl9CisJZWxzZSBpZiAoaWFwLT5pYV92YWxpZCAmIEFUVFJfTVRJTUUpIHsKKwkJYm12YWwxIHw9IEZBVFRSNF9XT1JEMV9USU1FX01PRElGWV9TRVQ7CisJCVdSSVRFMzIoTkZTNF9TRVRfVE9fU0VSVkVSX1RJTUUpOworCX0KKwkKKwkvKgorCSAqIE5vdyB3ZSBiYWNrZmlsbCB0aGUgYml0bWFwIGFuZCB0aGUgYXR0cmlidXRlIGJ1ZmZlciBsZW5ndGguCisJICovCisJaWYgKGxlbiAhPSAoKGNoYXIgKilwIC0gKGNoYXIgKilxKSArIDQpIHsKKwkJcHJpbnRrICgiZW5jb2RlX2F0dHI6IEF0dHIgbGVuZ3RoIGNhbGN1bGF0aW9uIGVycm9yISAldSAhPSAlWnVcbiIsCisJCQkJbGVuLCAoKGNoYXIgKilwIC0gKGNoYXIgKilxKSArIDQpOworCQlCVUcoKTsKKwl9CisJbGVuID0gKGNoYXIgKilwIC0gKGNoYXIgKilxIC0gMTI7CisJKnErKyA9IGh0b25sKGJtdmFsMCk7CisJKnErKyA9IGh0b25sKGJtdmFsMSk7CisJKnErKyA9IGh0b25sKGxlbik7CisKKwlzdGF0dXMgPSAwOworLyogb3V0OiAqLworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX2FjY2VzcyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1MzIgYWNjZXNzKQoreworCXVpbnQzMl90ICpwOworCisJUkVTRVJWRV9TUEFDRSg4KTsKKwlXUklURTMyKE9QX0FDQ0VTUyk7CisJV1JJVEUzMihhY2Nlc3MpOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuY29kZV9jbG9zZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX2Nsb3NlYXJncyAqYXJnKQoreworCXVpbnQzMl90ICpwOworCisJUkVTRVJWRV9TUEFDRSg4K3NpemVvZihhcmctPnN0YXRlaWQuZGF0YSkpOworCVdSSVRFMzIoT1BfQ0xPU0UpOworCVdSSVRFMzIoYXJnLT5zZXFpZCk7CisJV1JJVEVNRU0oYXJnLT5zdGF0ZWlkLmRhdGEsIHNpemVvZihhcmctPnN0YXRlaWQuZGF0YSkpOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuY29kZV9jb21taXQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc193cml0ZWFyZ3MgKmFyZ3MpCit7CisJdWludDMyX3QgKnA7CisgICAgICAgIAorICAgICAgICBSRVNFUlZFX1NQQUNFKDE2KTsKKyAgICAgICAgV1JJVEUzMihPUF9DT01NSVQpOworICAgICAgICBXUklURTY0KGFyZ3MtPm9mZnNldCk7CisgICAgICAgIFdSSVRFMzIoYXJncy0+Y291bnQpOworCisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuY29kZV9jcmVhdGUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mczRfY3JlYXRlX2FyZyAqY3JlYXRlKQoreworCXVpbnQzMl90ICpwOworCQorCVJFU0VSVkVfU1BBQ0UoOCk7CisJV1JJVEUzMihPUF9DUkVBVEUpOworCVdSSVRFMzIoY3JlYXRlLT5mdHlwZSk7CisKKwlzd2l0Y2ggKGNyZWF0ZS0+ZnR5cGUpIHsKKwljYXNlIE5GNExOSzoKKwkJUkVTRVJWRV9TUEFDRSg0ICsgY3JlYXRlLT51LnN5bWxpbmstPmxlbik7CisJCVdSSVRFMzIoY3JlYXRlLT51LnN5bWxpbmstPmxlbik7CisJCVdSSVRFTUVNKGNyZWF0ZS0+dS5zeW1saW5rLT5uYW1lLCBjcmVhdGUtPnUuc3ltbGluay0+bGVuKTsKKwkJYnJlYWs7CisKKwljYXNlIE5GNEJMSzogY2FzZSBORjRDSFI6CisJCVJFU0VSVkVfU1BBQ0UoOCk7CisJCVdSSVRFMzIoY3JlYXRlLT51LmRldmljZS5zcGVjZGF0YTEpOworCQlXUklURTMyKGNyZWF0ZS0+dS5kZXZpY2Uuc3BlY2RhdGEyKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlSRVNFUlZFX1NQQUNFKDQgKyBjcmVhdGUtPm5hbWUtPmxlbik7CisJV1JJVEUzMihjcmVhdGUtPm5hbWUtPmxlbik7CisJV1JJVEVNRU0oY3JlYXRlLT5uYW1lLT5uYW1lLCBjcmVhdGUtPm5hbWUtPmxlbik7CisKKwlyZXR1cm4gZW5jb2RlX2F0dHJzKHhkciwgY3JlYXRlLT5hdHRycywgY3JlYXRlLT5zZXJ2ZXIpOworfQorCitzdGF0aWMgaW50IGVuY29kZV9nZXRhdHRyX29uZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCBiaXRtYXApCit7CisgICAgICAgIHVpbnQzMl90ICpwOworCisgICAgICAgIFJFU0VSVkVfU1BBQ0UoMTIpOworICAgICAgICBXUklURTMyKE9QX0dFVEFUVFIpOworICAgICAgICBXUklURTMyKDEpOworICAgICAgICBXUklURTMyKGJpdG1hcCk7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuY29kZV9nZXRhdHRyX3R3byhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCBibTAsIHVpbnQzMl90IGJtMSkKK3sKKyAgICAgICAgdWludDMyX3QgKnA7CisKKyAgICAgICAgUkVTRVJWRV9TUEFDRSgxNik7CisgICAgICAgIFdSSVRFMzIoT1BfR0VUQVRUUik7CisgICAgICAgIFdSSVRFMzIoMik7CisgICAgICAgIFdSSVRFMzIoYm0wKTsKKyAgICAgICAgV1JJVEUzMihibTEpOworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmNvZGVfZ2V0ZmF0dHIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3QgdTMyKiBiaXRtYXNrKQoreworCWV4dGVybiB1MzIgbmZzNF9mYXR0cl9iaXRtYXBbXTsKKworCXJldHVybiBlbmNvZGVfZ2V0YXR0cl90d28oeGRyLAorCQkJYml0bWFza1swXSAmIG5mczRfZmF0dHJfYml0bWFwWzBdLAorCQkJYml0bWFza1sxXSAmIG5mczRfZmF0dHJfYml0bWFwWzFdKTsKK30KKworc3RhdGljIGludCBlbmNvZGVfZnNpbmZvKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHUzMiogYml0bWFzaykKK3sKKwlleHRlcm4gdTMyIG5mczRfZnNpbmZvX2JpdG1hcFtdOworCisJcmV0dXJuIGVuY29kZV9nZXRhdHRyX3R3byh4ZHIsIGJpdG1hc2tbMF0gJiBuZnM0X2ZzaW5mb19iaXRtYXBbMF0sCisJCQliaXRtYXNrWzFdICYgbmZzNF9mc2luZm9fYml0bWFwWzFdKTsKK30KKworc3RhdGljIGludCBlbmNvZGVfZ2V0Zmgoc3RydWN0IHhkcl9zdHJlYW0gKnhkcikKK3sKKwl1aW50MzJfdCAqcDsKKworCVJFU0VSVkVfU1BBQ0UoNCk7CisJV1JJVEUzMihPUF9HRVRGSCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmNvZGVfbGluayhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSkKK3sKKwl1aW50MzJfdCAqcDsKKworCVJFU0VSVkVfU1BBQ0UoOCArIG5hbWUtPmxlbik7CisJV1JJVEUzMihPUF9MSU5LKTsKKwlXUklURTMyKG5hbWUtPmxlbik7CisJV1JJVEVNRU0obmFtZS0+bmFtZSwgbmFtZS0+bGVuKTsKKwkKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIG9wY29kZSx0eXBlLHJlY2xhaW0sb2Zmc2V0LGxlbmd0aCxuZXdfbG9ja19vd25lciA9IDMyCisgKiBvcGVuX3NlcWlkLG9wZW5fc3RhdGVpZCxsb2NrX3NlcWlkLGxvY2tfb3duZXIuY2xpZW50aWQsIGxvY2tfb3duZXIuaWQgPSA0MAorICovCitzdGF0aWMgaW50IGVuY29kZV9sb2NrKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnNfbG9ja2FyZ3MgKmFyZykKK3sKKwl1aW50MzJfdCAqcDsKKwlzdHJ1Y3QgbmZzX2xvY2tfb3BhcmdzICpvcGFyZ3MgPSBhcmctPnUubG9jazsKKworCVJFU0VSVkVfU1BBQ0UoMzIpOworCVdSSVRFMzIoT1BfTE9DSyk7CisJV1JJVEUzMihhcmctPnR5cGUpOyAKKwlXUklURTMyKG9wYXJncy0+cmVjbGFpbSk7CisJV1JJVEU2NChhcmctPm9mZnNldCk7CisJV1JJVEU2NChhcmctPmxlbmd0aCk7CisJV1JJVEUzMihvcGFyZ3MtPm5ld19sb2NrX293bmVyKTsKKwlpZiAob3BhcmdzLT5uZXdfbG9ja19vd25lcil7CisJCXN0cnVjdCBuZnNfb3Blbl90b19sb2NrICpvbCA9IG9wYXJncy0+dS5vcGVuX2xvY2s7CisKKwkJUkVTRVJWRV9TUEFDRSg0MCk7CisJCVdSSVRFMzIob2wtPm9wZW5fc2VxaWQpOworCQlXUklURU1FTSgmb2wtPm9wZW5fc3RhdGVpZCwgc2l6ZW9mKG9sLT5vcGVuX3N0YXRlaWQpKTsKKwkJV1JJVEUzMihvbC0+bG9ja19zZXFpZCk7CisJCVdSSVRFNjQob2wtPmxvY2tfb3duZXIuY2xpZW50aWQpOworCQlXUklURTMyKDQpOworCQlXUklURTMyKG9sLT5sb2NrX293bmVyLmlkKTsKKwl9CisJZWxzZSB7CisJCXN0cnVjdCBuZnNfZXhpc3RfbG9jayAqZWwgPSBvcGFyZ3MtPnUuZXhpc3RfbG9jazsKKworCQlSRVNFUlZFX1NQQUNFKDIwKTsKKwkJV1JJVEVNRU0oJmVsLT5zdGF0ZWlkLCBzaXplb2YoZWwtPnN0YXRlaWQpKTsKKwkJV1JJVEUzMihlbC0+c2VxaWQpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuY29kZV9sb2NrdChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX2xvY2thcmdzICphcmcpCit7CisJdWludDMyX3QgKnA7CisJc3RydWN0IG5mc19sb3duZXIgKm9wYXJncyA9IGFyZy0+dS5sb2NrdDsKKworCVJFU0VSVkVfU1BBQ0UoNDApOworCVdSSVRFMzIoT1BfTE9DS1QpOworCVdSSVRFMzIoYXJnLT50eXBlKTsKKwlXUklURTY0KGFyZy0+b2Zmc2V0KTsKKwlXUklURTY0KGFyZy0+bGVuZ3RoKTsKKwlXUklURTY0KG9wYXJncy0+Y2xpZW50aWQpOworCVdSSVRFMzIoNCk7CisJV1JJVEUzMihvcGFyZ3MtPmlkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuY29kZV9sb2NrdShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX2xvY2thcmdzICphcmcpCit7CisJdWludDMyX3QgKnA7CisJc3RydWN0IG5mc19sb2NrdV9vcGFyZ3MgKm9wYXJncyA9IGFyZy0+dS5sb2NrdTsKKworCVJFU0VSVkVfU1BBQ0UoNDQpOworCVdSSVRFMzIoT1BfTE9DS1UpOworCVdSSVRFMzIoYXJnLT50eXBlKTsKKwlXUklURTMyKG9wYXJncy0+c2VxaWQpOworCVdSSVRFTUVNKCZvcGFyZ3MtPnN0YXRlaWQsIHNpemVvZihvcGFyZ3MtPnN0YXRlaWQpKTsKKwlXUklURTY0KGFyZy0+b2Zmc2V0KTsKKwlXUklURTY0KGFyZy0+bGVuZ3RoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuY29kZV9sb29rdXAoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUpCit7CisJaW50IGxlbiA9IG5hbWUtPmxlbjsKKwl1aW50MzJfdCAqcDsKKworCVJFU0VSVkVfU1BBQ0UoOCArIGxlbik7CisJV1JJVEUzMihPUF9MT09LVVApOworCVdSSVRFMzIobGVuKTsKKwlXUklURU1FTShuYW1lLT5uYW1lLCBsZW4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVuY29kZV9zaGFyZV9hY2Nlc3Moc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgaW50IG9wZW5fZmxhZ3MpCit7CisJdWludDMyX3QgKnA7CisKKwlSRVNFUlZFX1NQQUNFKDgpOworCXN3aXRjaCAob3Blbl9mbGFncyAmIChGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKSkgeworCQljYXNlIEZNT0RFX1JFQUQ6CisJCQlXUklURTMyKE5GUzRfU0hBUkVfQUNDRVNTX1JFQUQpOworCQkJYnJlYWs7CisJCWNhc2UgRk1PREVfV1JJVEU6CisJCQlXUklURTMyKE5GUzRfU0hBUkVfQUNDRVNTX1dSSVRFKTsKKwkJCWJyZWFrOworCQljYXNlIEZNT0RFX1JFQUR8Rk1PREVfV1JJVEU6CisJCQlXUklURTMyKE5GUzRfU0hBUkVfQUNDRVNTX0JPVEgpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlCVUcoKTsKKwl9CisJV1JJVEUzMigwKTsJCS8qIGZvciBsaW51eCwgc2hhcmVfZGVueSA9IDAgYWx3YXlzICovCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmNvZGVfb3BlbmhkcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX29wZW5hcmdzICphcmcpCit7CisJdWludDMyX3QgKnA7CisgLyoKKyAqIG9wY29kZSA0LCBzZXFpZCA0LCBzaGFyZV9hY2Nlc3MgNCwgc2hhcmVfZGVueSA0LCBjbGllbnRpZCA4LCBvd25lcmxlbiA0LAorICogb3duZXIgNCA9IDMyCisgKi8KKwlSRVNFUlZFX1NQQUNFKDgpOworCVdSSVRFMzIoT1BfT1BFTik7CisJV1JJVEUzMihhcmctPnNlcWlkKTsKKwllbmNvZGVfc2hhcmVfYWNjZXNzKHhkciwgYXJnLT5vcGVuX2ZsYWdzKTsKKwlSRVNFUlZFX1NQQUNFKDE2KTsKKwlXUklURTY0KGFyZy0+Y2xpZW50aWQpOworCVdSSVRFMzIoNCk7CisJV1JJVEUzMihhcmctPmlkKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGVuY29kZV9jcmVhdGVtb2RlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnNfb3BlbmFyZ3MgKmFyZykKK3sKKwl1aW50MzJfdCAqcDsKKworCVJFU0VSVkVfU1BBQ0UoNCk7CisJc3dpdGNoKGFyZy0+b3Blbl9mbGFncyAmIE9fRVhDTCkgeworCQljYXNlIDA6CisJCQlXUklURTMyKE5GUzRfQ1JFQVRFX1VOQ0hFQ0tFRCk7CisJCQllbmNvZGVfYXR0cnMoeGRyLCBhcmctPnUuYXR0cnMsIGFyZy0+c2VydmVyKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJV1JJVEUzMihORlM0X0NSRUFURV9FWENMVVNJVkUpOworCQkJZW5jb2RlX25mczRfdmVyaWZpZXIoeGRyLCAmYXJnLT51LnZlcmlmaWVyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVuY29kZV9vcGVudHlwZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX29wZW5hcmdzICphcmcpCit7CisJdWludDMyX3QgKnA7CisKKwlSRVNFUlZFX1NQQUNFKDQpOworCXN3aXRjaCAoYXJnLT5vcGVuX2ZsYWdzICYgT19DUkVBVCkgeworCQljYXNlIDA6CisJCQlXUklURTMyKE5GUzRfT1BFTl9OT0NSRUFURSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUJVR19PTihhcmctPmNsYWltICE9IE5GUzRfT1BFTl9DTEFJTV9OVUxMKTsKKwkJCVdSSVRFMzIoTkZTNF9PUEVOX0NSRUFURSk7CisJCQllbmNvZGVfY3JlYXRlbW9kZSh4ZHIsIGFyZyk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZW5jb2RlX2RlbGVnYXRpb25fdHlwZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBpbnQgZGVsZWdhdGlvbl90eXBlKQoreworCXVpbnQzMl90ICpwOworCisJUkVTRVJWRV9TUEFDRSg0KTsKKwlzd2l0Y2ggKGRlbGVnYXRpb25fdHlwZSkgeworCQljYXNlIDA6CisJCQlXUklURTMyKE5GUzRfT1BFTl9ERUxFR0FURV9OT05FKTsKKwkJCWJyZWFrOworCQljYXNlIEZNT0RFX1JFQUQ6CisJCQlXUklURTMyKE5GUzRfT1BFTl9ERUxFR0FURV9SRUFEKTsKKwkJCWJyZWFrOworCQljYXNlIEZNT0RFX1dSSVRFfEZNT0RFX1JFQUQ6CisJCQlXUklURTMyKE5GUzRfT1BFTl9ERUxFR0FURV9XUklURSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUJVRygpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGVuY29kZV9jbGFpbV9udWxsKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBxc3RyICpuYW1lKQoreworCXVpbnQzMl90ICpwOworCisJUkVTRVJWRV9TUEFDRSg0KTsKKwlXUklURTMyKE5GUzRfT1BFTl9DTEFJTV9OVUxMKTsKKwllbmNvZGVfc3RyaW5nKHhkciwgbmFtZS0+bGVuLCBuYW1lLT5uYW1lKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGVuY29kZV9jbGFpbV9wcmV2aW91cyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBpbnQgdHlwZSkKK3sKKwl1aW50MzJfdCAqcDsKKworCVJFU0VSVkVfU1BBQ0UoNCk7CisJV1JJVEUzMihORlM0X09QRU5fQ0xBSU1fUFJFVklPVVMpOworCWVuY29kZV9kZWxlZ2F0aW9uX3R5cGUoeGRyLCB0eXBlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGVuY29kZV9jbGFpbV9kZWxlZ2F0ZV9jdXIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IHFzdHIgKm5hbWUsIGNvbnN0IG5mczRfc3RhdGVpZCAqc3RhdGVpZCkKK3sKKwl1aW50MzJfdCAqcDsKKworCVJFU0VSVkVfU1BBQ0UoNCtzaXplb2Yoc3RhdGVpZC0+ZGF0YSkpOworCVdSSVRFMzIoTkZTNF9PUEVOX0NMQUlNX0RFTEVHQVRFX0NVUik7CisJV1JJVEVNRU0oc3RhdGVpZC0+ZGF0YSwgc2l6ZW9mKHN0YXRlaWQtPmRhdGEpKTsKKwllbmNvZGVfc3RyaW5nKHhkciwgbmFtZS0+bGVuLCBuYW1lLT5uYW1lKTsKK30KKworc3RhdGljIGludCBlbmNvZGVfb3BlbihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX29wZW5hcmdzICphcmcpCit7CisJZW5jb2RlX29wZW5oZHIoeGRyLCBhcmcpOworCWVuY29kZV9vcGVudHlwZSh4ZHIsIGFyZyk7CisJc3dpdGNoIChhcmctPmNsYWltKSB7CisJCWNhc2UgTkZTNF9PUEVOX0NMQUlNX05VTEw6CisJCQllbmNvZGVfY2xhaW1fbnVsbCh4ZHIsIGFyZy0+bmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSBORlM0X09QRU5fQ0xBSU1fUFJFVklPVVM6CisJCQllbmNvZGVfY2xhaW1fcHJldmlvdXMoeGRyLCBhcmctPnUuZGVsZWdhdGlvbl90eXBlKTsKKwkJCWJyZWFrOworCQljYXNlIE5GUzRfT1BFTl9DTEFJTV9ERUxFR0FURV9DVVI6CisJCQllbmNvZGVfY2xhaW1fZGVsZWdhdGVfY3VyKHhkciwgYXJnLT5uYW1lLCAmYXJnLT51LmRlbGVnYXRpb24pOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlCVUcoKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX29wZW5fY29uZmlybShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX29wZW5fY29uZmlybWFyZ3MgKmFyZykKK3sKKwl1aW50MzJfdCAqcDsKKworCVJFU0VSVkVfU1BBQ0UoOCtzaXplb2YoYXJnLT5zdGF0ZWlkLmRhdGEpKTsKKwlXUklURTMyKE9QX09QRU5fQ09ORklSTSk7CisJV1JJVEVNRU0oYXJnLT5zdGF0ZWlkLmRhdGEsIHNpemVvZihhcmctPnN0YXRlaWQuZGF0YSkpOworCVdSSVRFMzIoYXJnLT5zZXFpZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmNvZGVfb3Blbl9kb3duZ3JhZGUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc19jbG9zZWFyZ3MgKmFyZykKK3sKKwl1aW50MzJfdCAqcDsKKworCVJFU0VSVkVfU1BBQ0UoOCtzaXplb2YoYXJnLT5zdGF0ZWlkLmRhdGEpKTsKKwlXUklURTMyKE9QX09QRU5fRE9XTkdSQURFKTsKKwlXUklURU1FTShhcmctPnN0YXRlaWQuZGF0YSwgc2l6ZW9mKGFyZy0+c3RhdGVpZC5kYXRhKSk7CisJV1JJVEUzMihhcmctPnNlcWlkKTsKKwllbmNvZGVfc2hhcmVfYWNjZXNzKHhkciwgYXJnLT5vcGVuX2ZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZW5jb2RlX3B1dGZoKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnNfZmggKmZoKQoreworCWludCBsZW4gPSBmaC0+c2l6ZTsKKwl1aW50MzJfdCAqcDsKKworCVJFU0VSVkVfU1BBQ0UoOCArIGxlbik7CisJV1JJVEUzMihPUF9QVVRGSCk7CisJV1JJVEUzMihsZW4pOworCVdSSVRFTUVNKGZoLT5kYXRhLCBsZW4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX3B1dHJvb3RmaChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyKQoreworICAgICAgICB1aW50MzJfdCAqcDsKKyAgICAgICAgCisgICAgICAgIFJFU0VSVkVfU1BBQ0UoNCk7CisgICAgICAgIFdSSVRFMzIoT1BfUFVUUk9PVEZIKTsKKworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZW5jb2RlX3N0YXRlaWQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCkKK3sKKwlleHRlcm4gbmZzNF9zdGF0ZWlkIHplcm9fc3RhdGVpZDsKKwluZnM0X3N0YXRlaWQgc3RhdGVpZDsKKwl1aW50MzJfdCAqcDsKKworCVJFU0VSVkVfU1BBQ0UoMTYpOworCWlmIChjdHgtPnN0YXRlICE9IE5VTEwpIHsKKwkJbmZzNF9jb3B5X3N0YXRlaWQoJnN0YXRlaWQsIGN0eC0+c3RhdGUsIGN0eC0+bG9ja293bmVyKTsKKwkJV1JJVEVNRU0oc3RhdGVpZC5kYXRhLCBzaXplb2Yoc3RhdGVpZC5kYXRhKSk7CisJfSBlbHNlCisJCVdSSVRFTUVNKHplcm9fc3RhdGVpZC5kYXRhLCBzaXplb2YoemVyb19zdGF0ZWlkLmRhdGEpKTsKK30KKworc3RhdGljIGludCBlbmNvZGVfcmVhZChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX3JlYWRhcmdzICphcmdzKQoreworCXVpbnQzMl90ICpwOworCisJUkVTRVJWRV9TUEFDRSg0KTsKKwlXUklURTMyKE9QX1JFQUQpOworCisJZW5jb2RlX3N0YXRlaWQoeGRyLCBhcmdzLT5jb250ZXh0KTsKKworCVJFU0VSVkVfU1BBQ0UoMTIpOworCVdSSVRFNjQoYXJncy0+b2Zmc2V0KTsKKwlXUklURTMyKGFyZ3MtPmNvdW50KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuY29kZV9yZWFkZGlyKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnM0X3JlYWRkaXJfYXJnICpyZWFkZGlyLCBzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgcnBjX2F1dGggKmF1dGggPSByZXEtPnJxX3Rhc2stPnRrX2F1dGg7CisJaW50IHJlcGxlbjsKKwl1aW50MzJfdCAqcDsKKworCVJFU0VSVkVfU1BBQ0UoMzIrc2l6ZW9mKG5mczRfdmVyaWZpZXIpKTsKKwlXUklURTMyKE9QX1JFQURESVIpOworCVdSSVRFNjQocmVhZGRpci0+Y29va2llKTsKKwlXUklURU1FTShyZWFkZGlyLT52ZXJpZmllci5kYXRhLCBzaXplb2YocmVhZGRpci0+dmVyaWZpZXIuZGF0YSkpOworCVdSSVRFMzIocmVhZGRpci0+Y291bnQgPj4gMSk7ICAvKiBXZSdyZSBub3QgZG9pbmcgcmVhZGRpcnBsdXMgKi8KKwlXUklURTMyKHJlYWRkaXItPmNvdW50KTsKKwlXUklURTMyKDIpOworCWlmIChyZWFkZGlyLT5iaXRtYXNrWzFdICYgRkFUVFI0X1dPUkQxX01PVU5URURfT05fRklMRUlEKSB7CisJCVdSSVRFMzIoMCk7CisJCVdSSVRFMzIoRkFUVFI0X1dPUkQxX01PVU5URURfT05fRklMRUlEKTsKKwl9IGVsc2UgeworCQlXUklURTMyKEZBVFRSNF9XT1JEMF9GSUxFSUQpOworCQlXUklURTMyKDApOworCX0KKworCS8qIHNldCB1cCByZXBseSBrdmVjCisJICogICAgdG9wbGV2ZWxfc3RhdHVzICsgdGFnbGVuICsgcmVzY291bnQgKyBPUF9QVVRGSCArIHN0YXR1cworCSAqICAgICAgKyBPUF9SRUFERElSICsgc3RhdHVzICsgdmVyaWZlcigyKSAgPSA5CisJICovCisJcmVwbGVuID0gKFJQQ19SRVBIRFJTSVpFICsgYXV0aC0+YXVfcnNsYWNrICsgOSkgPDwgMjsKKwl4ZHJfaW5saW5lX3BhZ2VzKCZyZXEtPnJxX3Jjdl9idWYsIHJlcGxlbiwgcmVhZGRpci0+cGFnZXMsCisJCQkgcmVhZGRpci0+cGdiYXNlLCByZWFkZGlyLT5jb3VudCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmNvZGVfcmVhZGxpbmsoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mczRfcmVhZGxpbmsgKnJlYWRsaW5rLCBzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgcnBjX2F1dGggKmF1dGggPSByZXEtPnJxX3Rhc2stPnRrX2F1dGg7CisJdW5zaWduZWQgaW50IHJlcGxlbjsKKwl1aW50MzJfdCAqcDsKKworCVJFU0VSVkVfU1BBQ0UoNCk7CisJV1JJVEUzMihPUF9SRUFETElOSyk7CisKKwkvKiBzZXQgdXAgcmVwbHkga3ZlYworCSAqICAgIHRvcGxldmVsX3N0YXR1cyArIHRhZ2xlbiArIHJlc2NvdW50ICsgT1BfUFVURkggKyBzdGF0dXMKKwkgKiAgICAgICsgT1BfUkVBRExJTksgKyBzdGF0dXMgKyBzdHJpbmcgbGVuZ3RoID0gOAorCSAqLworCXJlcGxlbiA9IChSUENfUkVQSERSU0laRSArIGF1dGgtPmF1X3JzbGFjayArIDgpIDw8IDI7CisJeGRyX2lubGluZV9wYWdlcygmcmVxLT5ycV9yY3ZfYnVmLCByZXBsZW4sIHJlYWRsaW5rLT5wYWdlcywKKwkJCXJlYWRsaW5rLT5wZ2Jhc2UsIHJlYWRsaW5rLT5wZ2xlbik7CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX3JlbW92ZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqbmFtZSkKK3sKKwl1aW50MzJfdCAqcDsKKworCVJFU0VSVkVfU1BBQ0UoOCArIG5hbWUtPmxlbik7CisJV1JJVEUzMihPUF9SRU1PVkUpOworCVdSSVRFMzIobmFtZS0+bGVuKTsKKwlXUklURU1FTShuYW1lLT5uYW1lLCBuYW1lLT5sZW4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX3JlbmFtZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgcXN0ciAqb2xkbmFtZSwgY29uc3Qgc3RydWN0IHFzdHIgKm5ld25hbWUpCit7CisJdWludDMyX3QgKnA7CisKKwlSRVNFUlZFX1NQQUNFKDggKyBvbGRuYW1lLT5sZW4pOworCVdSSVRFMzIoT1BfUkVOQU1FKTsKKwlXUklURTMyKG9sZG5hbWUtPmxlbik7CisJV1JJVEVNRU0ob2xkbmFtZS0+bmFtZSwgb2xkbmFtZS0+bGVuKTsKKwkKKwlSRVNFUlZFX1NQQUNFKDQgKyBuZXduYW1lLT5sZW4pOworCVdSSVRFMzIobmV3bmFtZS0+bGVuKTsKKwlXUklURU1FTShuZXduYW1lLT5uYW1lLCBuZXduYW1lLT5sZW4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX3JlbmV3KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnM0X2NsaWVudCAqY2xpZW50X3N0YXRlaWQpCit7CisJdWludDMyX3QgKnA7CisKKwlSRVNFUlZFX1NQQUNFKDEyKTsKKwlXUklURTMyKE9QX1JFTkVXKTsKKwlXUklURTY0KGNsaWVudF9zdGF0ZWlkLT5jbF9jbGllbnRpZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZW5jb2RlX3NhdmVmaChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyKQoreworCXVpbnQzMl90ICpwOworCisJUkVTRVJWRV9TUEFDRSg0KTsKKwlXUklURTMyKE9QX1NBVkVGSCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmNvZGVfc2V0YXR0cihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzX3NldGF0dHJhcmdzICphcmcsIGNvbnN0IHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIpCit7CisJaW50IHN0YXR1czsKKwl1aW50MzJfdCAqcDsKKwkKKyAgICAgICAgUkVTRVJWRV9TUEFDRSg0K3NpemVvZihhcmctPnN0YXRlaWQuZGF0YSkpOworICAgICAgICBXUklURTMyKE9QX1NFVEFUVFIpOworCVdSSVRFTUVNKGFyZy0+c3RhdGVpZC5kYXRhLCBzaXplb2YoYXJnLT5zdGF0ZWlkLmRhdGEpKTsKKworICAgICAgICBpZiAoKHN0YXR1cyA9IGVuY29kZV9hdHRycyh4ZHIsIGFyZy0+aWFwLCBzZXJ2ZXIpKSkKKwkJcmV0dXJuIHN0YXR1czsKKworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmNvZGVfc2V0Y2xpZW50aWQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3Qgc3RydWN0IG5mczRfc2V0Y2xpZW50aWQgKnNldGNsaWVudGlkKQoreworCXVpbnQzMl90ICpwOworCisJUkVTRVJWRV9TUEFDRSg0ICsgc2l6ZW9mKHNldGNsaWVudGlkLT5zY192ZXJpZmllci0+ZGF0YSkpOworCVdSSVRFMzIoT1BfU0VUQ0xJRU5USUQpOworCVdSSVRFTUVNKHNldGNsaWVudGlkLT5zY192ZXJpZmllci0+ZGF0YSwgc2l6ZW9mKHNldGNsaWVudGlkLT5zY192ZXJpZmllci0+ZGF0YSkpOworCisJZW5jb2RlX3N0cmluZyh4ZHIsIHNldGNsaWVudGlkLT5zY19uYW1lX2xlbiwgc2V0Y2xpZW50aWQtPnNjX25hbWUpOworCVJFU0VSVkVfU1BBQ0UoNCk7CisJV1JJVEUzMihzZXRjbGllbnRpZC0+c2NfcHJvZyk7CisJZW5jb2RlX3N0cmluZyh4ZHIsIHNldGNsaWVudGlkLT5zY19uZXRpZF9sZW4sIHNldGNsaWVudGlkLT5zY19uZXRpZCk7CisJZW5jb2RlX3N0cmluZyh4ZHIsIHNldGNsaWVudGlkLT5zY191YWRkcl9sZW4sIHNldGNsaWVudGlkLT5zY191YWRkcik7CisJUkVTRVJWRV9TUEFDRSg0KTsKKwlXUklURTMyKHNldGNsaWVudGlkLT5zY19jYl9pZGVudCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmNvZGVfc2V0Y2xpZW50aWRfY29uZmlybShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBjb25zdCBzdHJ1Y3QgbmZzNF9jbGllbnQgKmNsaWVudF9zdGF0ZSkKK3sKKyAgICAgICAgdWludDMyX3QgKnA7CisKKyAgICAgICAgUkVTRVJWRV9TUEFDRSgxMiArIHNpemVvZihjbGllbnRfc3RhdGUtPmNsX2NvbmZpcm0uZGF0YSkpOworICAgICAgICBXUklURTMyKE9QX1NFVENMSUVOVElEX0NPTkZJUk0pOworICAgICAgICBXUklURTY0KGNsaWVudF9zdGF0ZS0+Y2xfY2xpZW50aWQpOworICAgICAgICBXUklURU1FTShjbGllbnRfc3RhdGUtPmNsX2NvbmZpcm0uZGF0YSwgc2l6ZW9mKGNsaWVudF9zdGF0ZS0+Y2xfY29uZmlybS5kYXRhKSk7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX3dyaXRlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHN0cnVjdCBuZnNfd3JpdGVhcmdzICphcmdzKQoreworCXVpbnQzMl90ICpwOworCisJUkVTRVJWRV9TUEFDRSg0KTsKKwlXUklURTMyKE9QX1dSSVRFKTsKKworCWVuY29kZV9zdGF0ZWlkKHhkciwgYXJncy0+Y29udGV4dCk7CisKKwlSRVNFUlZFX1NQQUNFKDE2KTsKKwlXUklURTY0KGFyZ3MtPm9mZnNldCk7CisJV1JJVEUzMihhcmdzLT5zdGFibGUpOworCVdSSVRFMzIoYXJncy0+Y291bnQpOworCisJeGRyX3dyaXRlX3BhZ2VzKHhkciwgYXJncy0+cGFnZXMsIGFyZ3MtPnBnYmFzZSwgYXJncy0+Y291bnQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX2RlbGVncmV0dXJuKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IG5mczRfc3RhdGVpZCAqc3RhdGVpZCkKK3sKKwl1aW50MzJfdCAqcDsKKworCVJFU0VSVkVfU1BBQ0UoMjApOworCisJV1JJVEUzMihPUF9ERUxFR1JFVFVSTik7CisJV1JJVEVNRU0oc3RhdGVpZC0+ZGF0YSwgc2l6ZW9mKHN0YXRlaWQtPmRhdGEpKTsKKwlyZXR1cm4gMDsKKworfQorLyoKKyAqIEVORCBPRiAiR0VORVJJQyIgRU5DT0RFIFJPVVRJTkVTLgorICovCisKKy8qCisgKiBFbmNvZGUgYW4gQUNDRVNTIHJlcXVlc3QKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9lbmNfYWNjZXNzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgY29uc3Qgc3RydWN0IG5mczRfYWNjZXNzYXJncyAqYXJncykKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CisJCS5ub3BzID0gMiwKKwl9OworCWludCBzdGF0dXM7CisKKwl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7CisJZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlpZiAoKHN0YXR1cyA9IGVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCkpID09IDApCisJCXN0YXR1cyA9IGVuY29kZV9hY2Nlc3MoJnhkciwgYXJncy0+YWNjZXNzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRW5jb2RlIExPT0tVUCByZXF1ZXN0CisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2xvb2t1cChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X2xvb2t1cF9hcmcgKmFyZ3MpCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0geworCQkubm9wcyA9IDQsCisJfTsKKwlpbnQgc3RhdHVzOworCisJeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOworCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJaWYgKChzdGF0dXMgPSBlbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZGlyX2ZoKSkgIT0gMCkKKwkJZ290byBvdXQ7CisJaWYgKChzdGF0dXMgPSBlbmNvZGVfbG9va3VwKCZ4ZHIsIGFyZ3MtPm5hbWUpKSAhPSAwKQorCQlnb3RvIG91dDsKKwlpZiAoKHN0YXR1cyA9IGVuY29kZV9nZXRmaCgmeGRyKSkgIT0gMCkKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZW5jb2RlX2dldGZhdHRyKCZ4ZHIsIGFyZ3MtPmJpdG1hc2spOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBFbmNvZGUgTE9PS1VQX1JPT1QgcmVxdWVzdAorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19sb29rdXBfcm9vdChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X2xvb2t1cF9yb290X2FyZyAqYXJncykKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CisJCS5ub3BzID0gMywKKwl9OworCWludCBzdGF0dXM7CisKKwl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7CisJZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlpZiAoKHN0YXR1cyA9IGVuY29kZV9wdXRyb290ZmgoJnhkcikpICE9IDApCisJCWdvdG8gb3V0OworCWlmICgoc3RhdHVzID0gZW5jb2RlX2dldGZoKCZ4ZHIpKSA9PSAwKQorCQlzdGF0dXMgPSBlbmNvZGVfZ2V0ZmF0dHIoJnhkciwgYXJncy0+Yml0bWFzayk7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEVuY29kZSBSRU1PVkUgcmVxdWVzdAorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19yZW1vdmUoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBjb25zdCBzdHJ1Y3QgbmZzNF9yZW1vdmVfYXJnICphcmdzKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKKwkJLm5vcHMgPSAyLAorCX07CisJaW50IHN0YXR1czsKKworCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCWlmICgoc3RhdHVzID0gZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoKSkgPT0gMCkKKwkJc3RhdHVzID0gZW5jb2RlX3JlbW92ZSgmeGRyLCBhcmdzLT5uYW1lKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRW5jb2RlIFJFTkFNRSByZXF1ZXN0CisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3JlbmFtZShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X3JlbmFtZV9hcmcgKmFyZ3MpCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0geworCQkubm9wcyA9IDQsCisJfTsKKwlpbnQgc3RhdHVzOworCisJeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOworCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJaWYgKChzdGF0dXMgPSBlbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+b2xkX2RpcikpICE9IDApCisJCWdvdG8gb3V0OworCWlmICgoc3RhdHVzID0gZW5jb2RlX3NhdmVmaCgmeGRyKSkgIT0gMCkKKwkJZ290byBvdXQ7CisJaWYgKChzdGF0dXMgPSBlbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+bmV3X2RpcikpICE9IDApCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGVuY29kZV9yZW5hbWUoJnhkciwgYXJncy0+b2xkX25hbWUsIGFyZ3MtPm5ld19uYW1lKTsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRW5jb2RlIExJTksgcmVxdWVzdAorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19saW5rKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgY29uc3Qgc3RydWN0IG5mczRfbGlua19hcmcgKmFyZ3MpCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0geworCQkubm9wcyA9IDQsCisJfTsKKwlpbnQgc3RhdHVzOworCisJeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOworCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJaWYgKChzdGF0dXMgPSBlbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgpKSAhPSAwKQorCQlnb3RvIG91dDsKKwlpZiAoKHN0YXR1cyA9IGVuY29kZV9zYXZlZmgoJnhkcikpICE9IDApCisJCWdvdG8gb3V0OworCWlmICgoc3RhdHVzID0gZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmRpcl9maCkpICE9IDApCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGVuY29kZV9saW5rKCZ4ZHIsIGFyZ3MtPm5hbWUpOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBFbmNvZGUgQ1JFQVRFIHJlcXVlc3QKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9lbmNfY3JlYXRlKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgY29uc3Qgc3RydWN0IG5mczRfY3JlYXRlX2FyZyAqYXJncykKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CisJCS5ub3BzID0gNCwKKwl9OworCWludCBzdGF0dXM7CisKKwl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7CisJZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlpZiAoKHN0YXR1cyA9IGVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5kaXJfZmgpKSAhPSAwKQorCQlnb3RvIG91dDsKKwlpZiAoKHN0YXR1cyA9IGVuY29kZV9jcmVhdGUoJnhkciwgYXJncykpICE9IDApCisJCWdvdG8gb3V0OworCWlmICgoc3RhdHVzID0gZW5jb2RlX2dldGZoKCZ4ZHIpKSAhPSAwKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBlbmNvZGVfZ2V0ZmF0dHIoJnhkciwgYXJncy0+Yml0bWFzayk7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEVuY29kZSBTWU1MSU5LIHJlcXVlc3QKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9lbmNfc3ltbGluayhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X2NyZWF0ZV9hcmcgKmFyZ3MpCit7CisJcmV0dXJuIG5mczRfeGRyX2VuY19jcmVhdGUocmVxLCBwLCBhcmdzKTsKK30KKworLyoKKyAqIEVuY29kZSBHRVRBVFRSIHJlcXVlc3QKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9lbmNfZ2V0YXR0cihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X2dldGF0dHJfYXJnICphcmdzKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKKwkJLm5vcHMgPSAyLAorCX07CisJaW50IHN0YXR1czsKKworCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCWlmICgoc3RhdHVzID0gZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoKSkgPT0gMCkKKwkJc3RhdHVzID0gZW5jb2RlX2dldGZhdHRyKCZ4ZHIsIGFyZ3MtPmJpdG1hc2spOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBFbmNvZGUgYSBDTE9TRSByZXF1ZXN0CisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2Nsb3NlKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19jbG9zZWFyZ3MgKmFyZ3MpCit7CisgICAgICAgIHN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKyAgICAgICAgc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CisgICAgICAgICAgICAgICAgLm5vcHMgICA9IDIsCisgICAgICAgIH07CisgICAgICAgIGludCBzdGF0dXM7CisKKyAgICAgICAgeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOworICAgICAgICBlbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworICAgICAgICBzdGF0dXMgPSBlbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgpOworICAgICAgICBpZihzdGF0dXMpCisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIHN0YXR1cyA9IGVuY29kZV9jbG9zZSgmeGRyLCBhcmdzKTsKK291dDoKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEVuY29kZSBhbiBPUEVOIHJlcXVlc3QKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9lbmNfb3BlbihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfb3BlbmFyZ3MgKmFyZ3MpCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0geworCQkubm9wcyA9IDQsCisJfTsKKwlpbnQgc3RhdHVzOworCisJeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOworCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBlbmNvZGVfb3BlbigmeGRyLCBhcmdzKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBlbmNvZGVfZ2V0ZmgoJnhkcik7CisJaWYgKHN0YXR1cykKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZW5jb2RlX2dldGZhdHRyKCZ4ZHIsIGFyZ3MtPmJpdG1hc2spOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBFbmNvZGUgYW4gT1BFTl9DT05GSVJNIHJlcXVlc3QKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9lbmNfb3Blbl9jb25maXJtKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19vcGVuX2NvbmZpcm1hcmdzICphcmdzKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKKwkJLm5vcHMgICA9IDIsCisJfTsKKwlpbnQgc3RhdHVzOworCisJeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOworCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoKTsKKwlpZihzdGF0dXMpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGVuY29kZV9vcGVuX2NvbmZpcm0oJnhkciwgYXJncyk7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEVuY29kZSBhbiBPUEVOIHJlcXVlc3Qgd2l0aCBubyBhdHRyaWJ1dGVzLgorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19vcGVuX25vYXR0cihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfb3BlbmFyZ3MgKmFyZ3MpCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0geworCQkubm9wcyAgID0gMiwKKwl9OworCWludCBzdGF0dXM7CisKKwl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7CisJZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBlbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgpOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGVuY29kZV9vcGVuKCZ4ZHIsIGFyZ3MpOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBFbmNvZGUgYW4gT1BFTl9ET1dOR1JBREUgcmVxdWVzdAorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19vcGVuX2Rvd25ncmFkZShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfY2xvc2VhcmdzICphcmdzKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKKwkJLm5vcHMJPSAyLAorCX07CisJaW50IHN0YXR1czsKKworCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCk7CisJaWYgKHN0YXR1cykKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZW5jb2RlX29wZW5fZG93bmdyYWRlKCZ4ZHIsIGFyZ3MpOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBFbmNvZGUgYSBMT0NLIHJlcXVlc3QKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9lbmNfbG9jayhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfbG9ja2FyZ3MgKmFyZ3MpCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0geworCQkubm9wcyAgID0gMiwKKwl9OworCWludCBzdGF0dXM7CisKKwl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7CisJZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBlbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgpOworCWlmKHN0YXR1cykKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZW5jb2RlX2xvY2soJnhkciwgYXJncyk7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEVuY29kZSBhIExPQ0tUIHJlcXVlc3QKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9lbmNfbG9ja3Qoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX2xvY2thcmdzICphcmdzKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKKwkJLm5vcHMgICA9IDIsCisJfTsKKwlpbnQgc3RhdHVzOworCisJeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOworCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoKTsKKwlpZihzdGF0dXMpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGVuY29kZV9sb2NrdCgmeGRyLCBhcmdzKTsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRW5jb2RlIGEgTE9DS1UgcmVxdWVzdAorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19sb2NrdShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfbG9ja2FyZ3MgKmFyZ3MpCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0geworCQkubm9wcyAgID0gMiwKKwl9OworCWludCBzdGF0dXM7CisKKwl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7CisJZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBlbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgpOworCWlmKHN0YXR1cykKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZW5jb2RlX2xvY2t1KCZ4ZHIsIGFyZ3MpOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBFbmNvZGUgYSBSRUFETElOSyByZXF1ZXN0CisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3JlYWRsaW5rKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgY29uc3Qgc3RydWN0IG5mczRfcmVhZGxpbmsgKmFyZ3MpCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0geworCQkubm9wcyA9IDIsCisJfTsKKwlpbnQgc3RhdHVzOworCisJeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOworCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoKTsKKwlpZihzdGF0dXMpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGVuY29kZV9yZWFkbGluaygmeGRyLCBhcmdzLCByZXEpOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBFbmNvZGUgYSBSRUFERElSIHJlcXVlc3QKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9lbmNfcmVhZGRpcihzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIGNvbnN0IHN0cnVjdCBuZnM0X3JlYWRkaXJfYXJnICphcmdzKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKKwkJLm5vcHMgPSAyLAorCX07CisJaW50IHN0YXR1czsKKworCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCk7CisJaWYoc3RhdHVzKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBlbmNvZGVfcmVhZGRpcigmeGRyLCBhcmdzLCByZXEpOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBFbmNvZGUgYSBSRUFEIHJlcXVlc3QKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9lbmNfcmVhZChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfcmVhZGFyZ3MgKmFyZ3MpCit7CisJc3RydWN0IHJwY19hdXRoCSphdXRoID0gcmVxLT5ycV90YXNrLT50a19hdXRoOworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKKwkJLm5vcHMgPSAyLAorCX07CisJaW50IHJlcGxlbiwgc3RhdHVzOworCisJeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOworCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBlbmNvZGVfcmVhZCgmeGRyLCBhcmdzKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKworCS8qIHNldCB1cCByZXBseSBrdmVjCisJICogICAgdG9wbGV2ZWwgc3RhdHVzICsgdGFnbGVuPTAgKyByZXNjb3VudCArIE9QX1BVVEZIICsgc3RhdHVzCisJICogICAgICAgKyBPUF9SRUFEICsgc3RhdHVzICsgZW9mICsgZGF0YWxlbiA9IDkKKwkgKi8KKwlyZXBsZW4gPSAoUlBDX1JFUEhEUlNJWkUgKyBhdXRoLT5hdV9yc2xhY2sgKyBORlM0X2RlY19yZWFkX3N6KSA8PCAyOworCXhkcl9pbmxpbmVfcGFnZXMoJnJlcS0+cnFfcmN2X2J1ZiwgcmVwbGVuLAorCQkJIGFyZ3MtPnBhZ2VzLCBhcmdzLT5wZ2Jhc2UsIGFyZ3MtPmNvdW50KTsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRW5jb2RlIGFuIFNFVEFUVFIgcmVxdWVzdAorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19zZXRhdHRyKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19zZXRhdHRyYXJncyAqYXJncykKKworeworICAgICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisgICAgICAgIHN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0geworICAgICAgICAgICAgICAgIC5ub3BzICAgPSAzLAorICAgICAgICB9OworICAgICAgICBpbnQgc3RhdHVzOworCisgICAgICAgIHhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKKyAgICAgICAgZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKyAgICAgICAgc3RhdHVzID0gZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoKTsKKyAgICAgICAgaWYoc3RhdHVzKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICBzdGF0dXMgPSBlbmNvZGVfc2V0YXR0cigmeGRyLCBhcmdzLCBhcmdzLT5zZXJ2ZXIpOworICAgICAgICBpZihzdGF0dXMpCisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisJc3RhdHVzID0gZW5jb2RlX2dldGZhdHRyKCZ4ZHIsIGFyZ3MtPmJpdG1hc2spOworb3V0OgorICAgICAgICByZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRW5jb2RlIGEgV1JJVEUgcmVxdWVzdAorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY193cml0ZShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfd3JpdGVhcmdzICphcmdzKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKKwkJLm5vcHMgPSAyLAorCX07CisJaW50IHN0YXR1czsKKworCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGVuY29kZV9wdXRmaCgmeGRyLCBhcmdzLT5maCk7CisJaWYgKHN0YXR1cykKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZW5jb2RlX3dyaXRlKCZ4ZHIsIGFyZ3MpOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgYSBDT01NSVQgcmVxdWVzdAorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19jb21taXQoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX3dyaXRlYXJncyAqYXJncykKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CisJCS5ub3BzID0gMiwKKwl9OworCWludCBzdGF0dXM7CisKKwl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7CisJZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlzdGF0dXMgPSBlbmNvZGVfcHV0ZmgoJnhkciwgYXJncy0+ZmgpOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGVuY29kZV9jb21taXQoJnhkciwgYXJncyk7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEZTSU5GTyByZXF1ZXN0CisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2ZzaW5mbyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnM0X2ZzaW5mb19hcmcgKmFyZ3MpCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0geworCQkubm9wcwk9IDIsCisJfTsKKwlpbnQgc3RhdHVzOworCisJeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOworCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoKTsKKwlpZiAoIXN0YXR1cykKKwkJc3RhdHVzID0gZW5jb2RlX2ZzaW5mbygmeGRyLCBhcmdzLT5iaXRtYXNrKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogYSBQQVRIQ09ORiByZXF1ZXN0CisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX3BhdGhjb25mKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgY29uc3Qgc3RydWN0IG5mczRfcGF0aGNvbmZfYXJnICphcmdzKQoreworCWV4dGVybiB1MzIgbmZzNF9wYXRoY29uZl9iaXRtYXBbMl07CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0geworCQkubm9wcyA9IDIsCisJfTsKKwlpbnQgc3RhdHVzOworCisJeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOworCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoKTsKKwlpZiAoIXN0YXR1cykKKwkJc3RhdHVzID0gZW5jb2RlX2dldGF0dHJfb25lKCZ4ZHIsCisJCQkJYXJncy0+Yml0bWFza1swXSAmIG5mczRfcGF0aGNvbmZfYml0bWFwWzBdKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogYSBTVEFURlMgcmVxdWVzdAorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19zdGF0ZnMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBjb25zdCBzdHJ1Y3QgbmZzNF9zdGF0ZnNfYXJnICphcmdzKQoreworCWV4dGVybiB1MzIgbmZzNF9zdGF0ZnNfYml0bWFwW107CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0geworCQkubm9wcyA9IDIsCisJfTsKKwlpbnQgc3RhdHVzOworCisJeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOworCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoKTsKKwlpZiAoc3RhdHVzID09IDApCisJCXN0YXR1cyA9IGVuY29kZV9nZXRhdHRyX3R3bygmeGRyLAorCQkJCWFyZ3MtPmJpdG1hc2tbMF0gJiBuZnM0X3N0YXRmc19iaXRtYXBbMF0sCisJCQkJYXJncy0+Yml0bWFza1sxXSAmIG5mczRfc3RhdGZzX2JpdG1hcFsxXSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEdFVEFUVFJfQklUTUFQIHJlcXVlc3QKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9lbmNfc2VydmVyX2NhcHMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBjb25zdCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKKwkJLm5vcHMgPSAyLAorCX07CisJaW50IHN0YXR1czsKKworCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXN0YXR1cyA9IGVuY29kZV9wdXRmaCgmeGRyLCBmaGFuZGxlKTsKKwlpZiAoc3RhdHVzID09IDApCisJCXN0YXR1cyA9IGVuY29kZV9nZXRhdHRyX29uZSgmeGRyLCBGQVRUUjRfV09SRDBfU1VQUE9SVEVEX0FUVFJTfAorCQkJCUZBVFRSNF9XT1JEMF9MSU5LX1NVUFBPUlR8CisJCQkJRkFUVFI0X1dPUkQwX1NZTUxJTktfU1VQUE9SVHwKKwkJCQlGQVRUUjRfV09SRDBfQUNMU1VQUE9SVCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIGEgUkVORVcgcmVxdWVzdAorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2VuY19yZW5ldyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKKwkJLm5vcHMJPSAxLAorCX07CisKKwl4ZHJfaW5pdF9lbmNvZGUoJnhkciwgJnJlcS0+cnFfc25kX2J1ZiwgcCk7CisJZW5jb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlyZXR1cm4gZW5jb2RlX3JlbmV3KCZ4ZHIsIGNscCk7Cit9CisKKy8qCisgKiBhIFNFVENMSUVOVElEIHJlcXVlc3QKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9lbmNfc2V0Y2xpZW50aWQoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzNF9zZXRjbGllbnRpZCAqc2MpCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyID0geworCQkubm9wcwk9IDEsCisJfTsKKworCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXJldHVybiBlbmNvZGVfc2V0Y2xpZW50aWQoJnhkciwgc2MpOworfQorCisvKgorICogYSBTRVRDTElFTlRJRF9DT05GSVJNIHJlcXVlc3QKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9lbmNfc2V0Y2xpZW50aWRfY29uZmlybShzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKKwkJLm5vcHMJPSAzLAorCX07CisJY29uc3QgdTMyIGxlYXNlX2JpdG1hcFsyXSA9IHsgRkFUVFI0X1dPUkQwX0xFQVNFX1RJTUUsIDAgfTsKKwlpbnQgc3RhdHVzOworCisJeGRyX2luaXRfZW5jb2RlKCZ4ZHIsICZyZXEtPnJxX3NuZF9idWYsIHApOworCWVuY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJc3RhdHVzID0gZW5jb2RlX3NldGNsaWVudGlkX2NvbmZpcm0oJnhkciwgY2xwKTsKKwlpZiAoIXN0YXR1cykKKwkJc3RhdHVzID0gZW5jb2RlX3B1dHJvb3RmaCgmeGRyKTsKKwlpZiAoIXN0YXR1cykKKwkJc3RhdHVzID0gZW5jb2RlX2ZzaW5mbygmeGRyLCBsZWFzZV9iaXRtYXApOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBERUxFR1JFVFVSTiByZXF1ZXN0CisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZW5jX2RlbGVncmV0dXJuKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgY29uc3Qgc3RydWN0IG5mczRfZGVsZWdyZXR1cm5hcmdzICphcmdzKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKKwkJLm5vcHMgPSAyLAorCX07CisJaW50IHN0YXR1czsKKworCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKKwllbmNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCWlmICgoc3RhdHVzID0gZW5jb2RlX3B1dGZoKCZ4ZHIsIGFyZ3MtPmZoYW5kbGUpKSA9PSAwKQorCQlzdGF0dXMgPSBlbmNvZGVfZGVsZWdyZXR1cm4oJnhkciwgYXJncy0+c3RhdGVpZCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIFNUQVJUIE9GICJHRU5FUklDIiBERUNPREUgUk9VVElORVMuCisgKiAgIFRoZXNlIG1heSBsb29rIGEgbGl0dGxlIHVnbHkgc2luY2UgdGhleSBhcmUgaW1wb3J0ZWQgZnJvbSBhICJnZW5lcmljIgorICogc2V0IG9mIFhEUiBlbmNvZGUvZGVjb2RlIHJvdXRpbmVzIHdoaWNoIGFyZSBpbnRlbmRlZCB0byBiZSBzaGFyZWQgYnkKKyAqIGFsbCBvZiBvdXIgTkZTdjQgaW1wbGVtZW50YXRpb25zIChPcGVuQlNELCBNYWNPUyBYLi4uKS4KKyAqCisgKiBJZiB0aGUgcGFpbiBvZiByZWFkaW5nIHRoZXNlIGlzIHRvbyBncmVhdCwgaXQgc2hvdWxkIGJlIGEgc3RyYWlnaHRmb3J3YXJkCisgKiB0YXNrIHRvIHRyYW5zbGF0ZSB0aGVtIGludG8gTGludXgtc3BlY2lmaWMgdmVyc2lvbnMgd2hpY2ggYXJlIG1vcmUKKyAqIGNvbnNpc3RlbnQgd2l0aCB0aGUgc3R5bGUgdXNlZCBpbiBORlN2Mi92My4uLgorICovCisjZGVmaW5lIFJFQUQzMih4KSAgICAgICAgICh4KSA9IG50b2hsKCpwKyspCisjZGVmaW5lIFJFQUQ2NCh4KSAgICAgICAgIGRvIHsJCQlcCisJKHgpID0gKHU2NCludG9obCgqcCsrKSA8PCAzMjsJCVwKKwkoeCkgfD0gbnRvaGwoKnArKyk7CQkJXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgUkVBRFRJTUUoeCkgICAgICAgZG8gewkJCVwKKwlwKys7CQkJCQlcCisJKHgudHZfc2VjKSA9IG50b2hsKCpwKyspOwkJXAorCSh4LnR2X25zZWMpID0gbnRvaGwoKnArKyk7CQlcCit9IHdoaWxlICgwKQorI2RlZmluZSBDT1BZTUVNKHgsbmJ5dGVzKSBkbyB7CQkJXAorCW1lbWNweSgoeCksIHAsIG5ieXRlcyk7CQkJXAorCXAgKz0gWERSX1FVQURMRU4obmJ5dGVzKTsJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgUkVBRF9CVUYobmJ5dGVzKSAgZG8geyBcCisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgbmJ5dGVzKTsgXAorCWlmICghcCkgeyBcCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiByZXBseSBidWZmZXIgb3ZlcmZsb3dlZCBpbiBsaW5lICVkLiIsIFwKKwkJCSAgICAgICAJX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IFwKKwkJcmV0dXJuIC1FSU87IFwKKwl9IFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBpbnQgZGVjb2RlX29wYXF1ZV9pbmxpbmUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmxlbiwgY2hhciAqKnN0cmluZykKK3sKKwl1aW50MzJfdCAqcDsKKworCVJFQURfQlVGKDQpOworCVJFQUQzMigqbGVuKTsKKwlSRUFEX0JVRigqbGVuKTsKKwkqc3RyaW5nID0gKGNoYXIgKilwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9jb21wb3VuZF9oZHIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IGNvbXBvdW5kX2hkciAqaGRyKQoreworCXVpbnQzMl90ICpwOworCisJUkVBRF9CVUYoOCk7CisJUkVBRDMyKGhkci0+c3RhdHVzKTsKKwlSRUFEMzIoaGRyLT50YWdsZW4pOworCQorCVJFQURfQlVGKGhkci0+dGFnbGVuICsgNCk7CisJaGRyLT50YWcgPSAoY2hhciAqKXA7CisJcCArPSBYRFJfUVVBRExFTihoZHItPnRhZ2xlbik7CisJUkVBRDMyKGhkci0+bm9wcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX29wX2hkcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBlbnVtIG5mc19vcG51bTQgZXhwZWN0ZWQpCit7CisJdWludDMyX3QgKnA7CisJdWludDMyX3Qgb3BudW07CisJaW50MzJfdCBuZnNlcnI7CisKKwlSRUFEX0JVRig4KTsKKwlSRUFEMzIob3BudW0pOworCWlmIChvcG51bSAhPSBleHBlY3RlZCkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UKKwkJCQkibmZzNF9kZWNvZGVfb3BfaGRyOiBTZXJ2ZXIgcmV0dXJuZWQgb3BlcmF0aW9uIgorCQkJICAgICAgIAkiICVkIGJ1dCB3ZSBpc3N1ZWQgYSByZXF1ZXN0IGZvciAlZFxuIiwKKwkJCQlvcG51bSwgZXhwZWN0ZWQpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJUkVBRDMyKG5mc2Vycik7CisJaWYgKG5mc2VyciAhPSBORlNfT0spCisJCXJldHVybiAtbmZzX3N0YXRfdG9fZXJybm8obmZzZXJyKTsKKwlyZXR1cm4gMDsKK30KKworLyogRHVtbXkgcm91dGluZSAqLworc3RhdGljIGludCBkZWNvZGVfYWNlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHZvaWQgKmFjZSwgc3RydWN0IG5mczRfY2xpZW50ICpjbHApCit7CisJdWludDMyX3QgKnA7CisJdWludDMyX3Qgc3RybGVuOworCWNoYXIgKnN0cjsKKworCVJFQURfQlVGKDEyKTsKKwlyZXR1cm4gZGVjb2RlX29wYXF1ZV9pbmxpbmUoeGRyLCAmc3RybGVuLCAmc3RyKTsKK30KKworc3RhdGljIGludCBkZWNvZGVfYXR0cl9iaXRtYXAoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCkKK3sKKwl1aW50MzJfdCBibWxlbiwgKnA7CisKKwlSRUFEX0JVRig0KTsKKwlSRUFEMzIoYm1sZW4pOworCisJYml0bWFwWzBdID0gYml0bWFwWzFdID0gMDsKKwlSRUFEX0JVRigoYm1sZW4gPDwgMikpOworCWlmIChibWxlbiA+IDApIHsKKwkJUkVBRDMyKGJpdG1hcFswXSk7CisJCWlmIChibWxlbiA+IDEpCisJCQlSRUFEMzIoYml0bWFwWzFdKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRlY29kZV9hdHRyX2xlbmd0aChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYXR0cmxlbiwgdWludDMyX3QgKipzYXZlcCkKK3sKKwl1aW50MzJfdCAqcDsKKworCVJFQURfQlVGKDQpOworCVJFQUQzMigqYXR0cmxlbik7CisJKnNhdmVwID0geGRyLT5wOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9hdHRyX3N1cHBvcnRlZChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCB1aW50MzJfdCAqYml0bWFzaykKK3sKKwlpZiAobGlrZWx5KGJpdG1hcFswXSAmIEZBVFRSNF9XT1JEMF9TVVBQT1JURURfQVRUUlMpKSB7CisJCWRlY29kZV9hdHRyX2JpdG1hcCh4ZHIsIGJpdG1hc2spOworCQliaXRtYXBbMF0gJj0gfkZBVFRSNF9XT1JEMF9TVVBQT1JURURfQVRUUlM7CisJfSBlbHNlCisJCWJpdG1hc2tbMF0gPSBiaXRtYXNrWzFdID0gMDsKKwlkcHJpbnRrKCIlczogYml0bWFzaz0weCV4JXhcbiIsIF9fRlVOQ1RJT05fXywgYml0bWFza1swXSwgYml0bWFza1sxXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2F0dHJfdHlwZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCB1aW50MzJfdCAqdHlwZSkKK3sKKwl1aW50MzJfdCAqcDsKKworCSp0eXBlID0gMDsKKwlpZiAodW5saWtlbHkoYml0bWFwWzBdICYgKEZBVFRSNF9XT1JEMF9UWVBFIC0gMVUpKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKGxpa2VseShiaXRtYXBbMF0gJiBGQVRUUjRfV09SRDBfVFlQRSkpIHsKKwkJUkVBRF9CVUYoNCk7CisJCVJFQUQzMigqdHlwZSk7CisJCWlmICgqdHlwZSA8IE5GNFJFRyB8fCAqdHlwZSA+IE5GNE5BTUVEQVRUUikgeworCQkJZHByaW50aygiJXM6IGJhZCB0eXBlICVkXG4iLCBfX0ZVTkNUSU9OX18sICp0eXBlKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCWJpdG1hcFswXSAmPSB+RkFUVFI0X1dPUkQwX1RZUEU7CisJfQorCWRwcmludGsoIiVzOiB0eXBlPTAlb1xuIiwgX19GVU5DVElPTl9fLCBuZnNfdHlwZTJmbXRbKnR5cGVdLm5mczJ0eXBlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfYXR0cl9jaGFuZ2Uoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDY0X3QgKmNoYW5nZSkKK3sKKwl1aW50MzJfdCAqcDsKKworCSpjaGFuZ2UgPSAwOworCWlmICh1bmxpa2VseShiaXRtYXBbMF0gJiAoRkFUVFI0X1dPUkQwX0NIQU5HRSAtIDFVKSkpCisJCXJldHVybiAtRUlPOworCWlmIChsaWtlbHkoYml0bWFwWzBdICYgRkFUVFI0X1dPUkQwX0NIQU5HRSkpIHsKKwkJUkVBRF9CVUYoOCk7CisJCVJFQUQ2NCgqY2hhbmdlKTsKKwkJYml0bWFwWzBdICY9IH5GQVRUUjRfV09SRDBfQ0hBTkdFOworCX0KKwlkcHJpbnRrKCIlczogY2hhbmdlIGF0dHJpYnV0ZT0lTHVcbiIsIF9fRlVOQ1RJT05fXywKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpKmNoYW5nZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2F0dHJfc2l6ZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCB1aW50NjRfdCAqc2l6ZSkKK3sKKwl1aW50MzJfdCAqcDsKKworCSpzaXplID0gMDsKKwlpZiAodW5saWtlbHkoYml0bWFwWzBdICYgKEZBVFRSNF9XT1JEMF9TSVpFIC0gMVUpKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKGxpa2VseShiaXRtYXBbMF0gJiBGQVRUUjRfV09SRDBfU0laRSkpIHsKKwkJUkVBRF9CVUYoOCk7CisJCVJFQUQ2NCgqc2l6ZSk7CisJCWJpdG1hcFswXSAmPSB+RkFUVFI0X1dPUkQwX1NJWkU7CisJfQorCWRwcmludGsoIiVzOiBmaWxlIHNpemU9JUx1XG4iLCBfX0ZVTkNUSU9OX18sICh1bnNpZ25lZCBsb25nIGxvbmcpKnNpemUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9hdHRyX2xpbmtfc3VwcG9ydChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCB1aW50MzJfdCAqcmVzKQoreworCXVpbnQzMl90ICpwOworCisJKnJlcyA9IDA7CisJaWYgKHVubGlrZWx5KGJpdG1hcFswXSAmIChGQVRUUjRfV09SRDBfTElOS19TVVBQT1JUIC0gMVUpKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKGxpa2VseShiaXRtYXBbMF0gJiBGQVRUUjRfV09SRDBfTElOS19TVVBQT1JUKSkgeworCQlSRUFEX0JVRig0KTsKKwkJUkVBRDMyKCpyZXMpOworCQliaXRtYXBbMF0gJj0gfkZBVFRSNF9XT1JEMF9MSU5LX1NVUFBPUlQ7CisJfQorCWRwcmludGsoIiVzOiBsaW5rIHN1cHBvcnQ9JXNcbiIsIF9fRlVOQ1RJT05fXywgKnJlcyA9PSAwID8gImZhbHNlIiA6ICJ0cnVlIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2F0dHJfc3ltbGlua19zdXBwb3J0KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHVpbnQzMl90ICpyZXMpCit7CisJdWludDMyX3QgKnA7CisKKwkqcmVzID0gMDsKKwlpZiAodW5saWtlbHkoYml0bWFwWzBdICYgKEZBVFRSNF9XT1JEMF9TWU1MSU5LX1NVUFBPUlQgLSAxVSkpKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAobGlrZWx5KGJpdG1hcFswXSAmIEZBVFRSNF9XT1JEMF9TWU1MSU5LX1NVUFBPUlQpKSB7CisJCVJFQURfQlVGKDQpOworCQlSRUFEMzIoKnJlcyk7CisJCWJpdG1hcFswXSAmPSB+RkFUVFI0X1dPUkQwX1NZTUxJTktfU1VQUE9SVDsKKwl9CisJZHByaW50aygiJXM6IHN5bWxpbmsgc3VwcG9ydD0lc1xuIiwgX19GVU5DVElPTl9fLCAqcmVzID09IDAgPyAiZmFsc2UiIDogInRydWUiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfYXR0cl9mc2lkKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHN0cnVjdCBuZnM0X2ZzaWQgKmZzaWQpCit7CisJdWludDMyX3QgKnA7CisKKwlmc2lkLT5tYWpvciA9IDA7CisJZnNpZC0+bWlub3IgPSAwOworCWlmICh1bmxpa2VseShiaXRtYXBbMF0gJiAoRkFUVFI0X1dPUkQwX0ZTSUQgLSAxVSkpKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAobGlrZWx5KGJpdG1hcFswXSAmIEZBVFRSNF9XT1JEMF9GU0lEKSkgeworCQlSRUFEX0JVRigxNik7CisJCVJFQUQ2NChmc2lkLT5tYWpvcik7CisJCVJFQUQ2NChmc2lkLT5taW5vcik7CisJCWJpdG1hcFswXSAmPSB+RkFUVFI0X1dPUkQwX0ZTSUQ7CisJfQorCWRwcmludGsoIiVzOiBmc2lkPSgweCVMeC8weCVMeClcbiIsIF9fRlVOQ1RJT05fXywKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpZnNpZC0+bWFqb3IsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWZzaWQtPm1pbm9yKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfYXR0cl9sZWFzZV90aW1lKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHVpbnQzMl90ICpyZXMpCit7CisJdWludDMyX3QgKnA7CisKKwkqcmVzID0gNjA7CisJaWYgKHVubGlrZWx5KGJpdG1hcFswXSAmIChGQVRUUjRfV09SRDBfTEVBU0VfVElNRSAtIDFVKSkpCisJCXJldHVybiAtRUlPOworCWlmIChsaWtlbHkoYml0bWFwWzBdICYgRkFUVFI0X1dPUkQwX0xFQVNFX1RJTUUpKSB7CisJCVJFQURfQlVGKDQpOworCQlSRUFEMzIoKnJlcyk7CisJCWJpdG1hcFswXSAmPSB+RkFUVFI0X1dPUkQwX0xFQVNFX1RJTUU7CisJfQorCWRwcmludGsoIiVzOiBmaWxlIHNpemU9JXVcbiIsIF9fRlVOQ1RJT05fXywgKHVuc2lnbmVkIGludCkqcmVzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfYXR0cl9hY2xzdXBwb3J0KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHVpbnQzMl90ICpyZXMpCit7CisJdWludDMyX3QgKnA7CisKKwkqcmVzID0gQUNMNF9TVVBQT1JUX0FMTE9XX0FDTHxBQ0w0X1NVUFBPUlRfREVOWV9BQ0w7CisJaWYgKHVubGlrZWx5KGJpdG1hcFswXSAmIChGQVRUUjRfV09SRDBfQUNMU1VQUE9SVCAtIDFVKSkpCisJCXJldHVybiAtRUlPOworCWlmIChsaWtlbHkoYml0bWFwWzBdICYgRkFUVFI0X1dPUkQwX0FDTFNVUFBPUlQpKSB7CisJCVJFQURfQlVGKDQpOworCQlSRUFEMzIoKnJlcyk7CisJCWJpdG1hcFswXSAmPSB+RkFUVFI0X1dPUkQwX0FDTFNVUFBPUlQ7CisJfQorCWRwcmludGsoIiVzOiBBQ0xzIHN1cHBvcnRlZD0ldVxuIiwgX19GVU5DVElPTl9fLCAodW5zaWduZWQgaW50KSpyZXMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9hdHRyX2ZpbGVpZChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCB1aW50NjRfdCAqZmlsZWlkKQoreworCXVpbnQzMl90ICpwOworCisJKmZpbGVpZCA9IDA7CisJaWYgKHVubGlrZWx5KGJpdG1hcFswXSAmIChGQVRUUjRfV09SRDBfRklMRUlEIC0gMVUpKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKGxpa2VseShiaXRtYXBbMF0gJiBGQVRUUjRfV09SRDBfRklMRUlEKSkgeworCQlSRUFEX0JVRig4KTsKKwkJUkVBRDY0KCpmaWxlaWQpOworCQliaXRtYXBbMF0gJj0gfkZBVFRSNF9XT1JEMF9GSUxFSUQ7CisJfQorCWRwcmludGsoIiVzOiBmaWxlaWQ9JUx1XG4iLCBfX0ZVTkNUSU9OX18sICh1bnNpZ25lZCBsb25nIGxvbmcpKmZpbGVpZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2F0dHJfZmlsZXNfYXZhaWwoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDY0X3QgKnJlcykKK3sKKwl1aW50MzJfdCAqcDsKKwlpbnQgc3RhdHVzID0gMDsKKworCSpyZXMgPSAwOworCWlmICh1bmxpa2VseShiaXRtYXBbMF0gJiAoRkFUVFI0X1dPUkQwX0ZJTEVTX0FWQUlMIC0gMVUpKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKGxpa2VseShiaXRtYXBbMF0gJiBGQVRUUjRfV09SRDBfRklMRVNfQVZBSUwpKSB7CisJCVJFQURfQlVGKDgpOworCQlSRUFENjQoKnJlcyk7CisJCWJpdG1hcFswXSAmPSB+RkFUVFI0X1dPUkQwX0ZJTEVTX0FWQUlMOworCX0KKwlkcHJpbnRrKCIlczogZmlsZXMgYXZhaWw9JUx1XG4iLCBfX0ZVTkNUSU9OX18sICh1bnNpZ25lZCBsb25nIGxvbmcpKnJlcyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBkZWNvZGVfYXR0cl9maWxlc19mcmVlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHVpbnQ2NF90ICpyZXMpCit7CisJdWludDMyX3QgKnA7CisJaW50IHN0YXR1cyA9IDA7CisKKwkqcmVzID0gMDsKKwlpZiAodW5saWtlbHkoYml0bWFwWzBdICYgKEZBVFRSNF9XT1JEMF9GSUxFU19GUkVFIC0gMVUpKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKGxpa2VseShiaXRtYXBbMF0gJiBGQVRUUjRfV09SRDBfRklMRVNfRlJFRSkpIHsKKwkJUkVBRF9CVUYoOCk7CisJCVJFQUQ2NCgqcmVzKTsKKwkJYml0bWFwWzBdICY9IH5GQVRUUjRfV09SRDBfRklMRVNfRlJFRTsKKwl9CisJZHByaW50aygiJXM6IGZpbGVzIGZyZWU9JUx1XG4iLCBfX0ZVTkNUSU9OX18sICh1bnNpZ25lZCBsb25nIGxvbmcpKnJlcyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBkZWNvZGVfYXR0cl9maWxlc190b3RhbChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCB1aW50NjRfdCAqcmVzKQoreworCXVpbnQzMl90ICpwOworCWludCBzdGF0dXMgPSAwOworCisJKnJlcyA9IDA7CisJaWYgKHVubGlrZWx5KGJpdG1hcFswXSAmIChGQVRUUjRfV09SRDBfRklMRVNfVE9UQUwgLSAxVSkpKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAobGlrZWx5KGJpdG1hcFswXSAmIEZBVFRSNF9XT1JEMF9GSUxFU19UT1RBTCkpIHsKKwkJUkVBRF9CVUYoOCk7CisJCVJFQUQ2NCgqcmVzKTsKKwkJYml0bWFwWzBdICY9IH5GQVRUUjRfV09SRDBfRklMRVNfVE9UQUw7CisJfQorCWRwcmludGsoIiVzOiBmaWxlcyB0b3RhbD0lTHVcbiIsIF9fRlVOQ1RJT05fXywgKHVuc2lnbmVkIGxvbmcgbG9uZykqcmVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGRlY29kZV9hdHRyX21heGZpbGVzaXplKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHVpbnQ2NF90ICpyZXMpCit7CisJdWludDMyX3QgKnA7CisJaW50IHN0YXR1cyA9IDA7CisKKwkqcmVzID0gMDsKKwlpZiAodW5saWtlbHkoYml0bWFwWzBdICYgKEZBVFRSNF9XT1JEMF9NQVhGSUxFU0laRSAtIDFVKSkpCisJCXJldHVybiAtRUlPOworCWlmIChsaWtlbHkoYml0bWFwWzBdICYgRkFUVFI0X1dPUkQwX01BWEZJTEVTSVpFKSkgeworCQlSRUFEX0JVRig4KTsKKwkJUkVBRDY0KCpyZXMpOworCQliaXRtYXBbMF0gJj0gfkZBVFRSNF9XT1JEMF9NQVhGSUxFU0laRTsKKwl9CisJZHByaW50aygiJXM6IG1heGZpbGVzaXplPSVMdVxuIiwgX19GVU5DVElPTl9fLCAodW5zaWduZWQgbG9uZyBsb25nKSpyZXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2F0dHJfbWF4bGluayhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCB1aW50MzJfdCAqbWF4bGluaykKK3sKKwl1aW50MzJfdCAqcDsKKwlpbnQgc3RhdHVzID0gMDsKKworCSptYXhsaW5rID0gMTsKKwlpZiAodW5saWtlbHkoYml0bWFwWzBdICYgKEZBVFRSNF9XT1JEMF9NQVhMSU5LIC0gMVUpKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKGxpa2VseShiaXRtYXBbMF0gJiBGQVRUUjRfV09SRDBfTUFYTElOSykpIHsKKwkJUkVBRF9CVUYoNCk7CisJCVJFQUQzMigqbWF4bGluayk7CisJCWJpdG1hcFswXSAmPSB+RkFUVFI0X1dPUkQwX01BWExJTks7CisJfQorCWRwcmludGsoIiVzOiBtYXhsaW5rPSV1XG4iLCBfX0ZVTkNUSU9OX18sICptYXhsaW5rKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGRlY29kZV9hdHRyX21heG5hbWUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDMyX3QgKm1heG5hbWUpCit7CisJdWludDMyX3QgKnA7CisJaW50IHN0YXR1cyA9IDA7CisKKwkqbWF4bmFtZSA9IDEwMjQ7CisJaWYgKHVubGlrZWx5KGJpdG1hcFswXSAmIChGQVRUUjRfV09SRDBfTUFYTkFNRSAtIDFVKSkpCisJCXJldHVybiAtRUlPOworCWlmIChsaWtlbHkoYml0bWFwWzBdICYgRkFUVFI0X1dPUkQwX01BWE5BTUUpKSB7CisJCVJFQURfQlVGKDQpOworCQlSRUFEMzIoKm1heG5hbWUpOworCQliaXRtYXBbMF0gJj0gfkZBVFRSNF9XT1JEMF9NQVhOQU1FOworCX0KKwlkcHJpbnRrKCIlczogbWF4bmFtZT0ldVxuIiwgX19GVU5DVElPTl9fLCAqbWF4bmFtZSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBkZWNvZGVfYXR0cl9tYXhyZWFkKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHVpbnQzMl90ICpyZXMpCit7CisJdWludDMyX3QgKnA7CisJaW50IHN0YXR1cyA9IDA7CisKKwkqcmVzID0gMTAyNDsKKwlpZiAodW5saWtlbHkoYml0bWFwWzBdICYgKEZBVFRSNF9XT1JEMF9NQVhSRUFEIC0gMVUpKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKGxpa2VseShiaXRtYXBbMF0gJiBGQVRUUjRfV09SRDBfTUFYUkVBRCkpIHsKKwkJdWludDY0X3QgbWF4cmVhZDsKKwkJUkVBRF9CVUYoOCk7CisJCVJFQUQ2NChtYXhyZWFkKTsKKwkJaWYgKG1heHJlYWQgPiAweDdGRkZGRkZGKQorCQkJbWF4cmVhZCA9IDB4N0ZGRkZGRkY7CisJCSpyZXMgPSAodWludDMyX3QpbWF4cmVhZDsKKwkJYml0bWFwWzBdICY9IH5GQVRUUjRfV09SRDBfTUFYUkVBRDsKKwl9CisJZHByaW50aygiJXM6IG1heHJlYWQ9JWx1XG4iLCBfX0ZVTkNUSU9OX18sICh1bnNpZ25lZCBsb25nKSpyZXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2F0dHJfbWF4d3JpdGUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDMyX3QgKnJlcykKK3sKKwl1aW50MzJfdCAqcDsKKwlpbnQgc3RhdHVzID0gMDsKKworCSpyZXMgPSAxMDI0OworCWlmICh1bmxpa2VseShiaXRtYXBbMF0gJiAoRkFUVFI0X1dPUkQwX01BWFdSSVRFIC0gMVUpKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKGxpa2VseShiaXRtYXBbMF0gJiBGQVRUUjRfV09SRDBfTUFYV1JJVEUpKSB7CisJCXVpbnQ2NF90IG1heHdyaXRlOworCQlSRUFEX0JVRig4KTsKKwkJUkVBRDY0KG1heHdyaXRlKTsKKwkJaWYgKG1heHdyaXRlID4gMHg3RkZGRkZGRikKKwkJCW1heHdyaXRlID0gMHg3RkZGRkZGRjsKKwkJKnJlcyA9ICh1aW50MzJfdCltYXh3cml0ZTsKKwkJYml0bWFwWzBdICY9IH5GQVRUUjRfV09SRDBfTUFYV1JJVEU7CisJfQorCWRwcmludGsoIiVzOiBtYXh3cml0ZT0lbHVcbiIsIF9fRlVOQ1RJT05fXywgKHVuc2lnbmVkIGxvbmcpKnJlcyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBkZWNvZGVfYXR0cl9tb2RlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHVpbnQzMl90ICptb2RlKQoreworCXVpbnQzMl90ICpwOworCisJKm1vZGUgPSAwOworCWlmICh1bmxpa2VseShiaXRtYXBbMV0gJiAoRkFUVFI0X1dPUkQxX01PREUgLSAxVSkpKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAobGlrZWx5KGJpdG1hcFsxXSAmIEZBVFRSNF9XT1JEMV9NT0RFKSkgeworCQlSRUFEX0JVRig0KTsKKwkJUkVBRDMyKCptb2RlKTsKKwkJKm1vZGUgJj0gflNfSUZNVDsKKwkJYml0bWFwWzFdICY9IH5GQVRUUjRfV09SRDFfTU9ERTsKKwl9CisJZHByaW50aygiJXM6IGZpbGUgbW9kZT0wJW9cbiIsIF9fRlVOQ1RJT05fXywgKHVuc2lnbmVkIGludCkqbW9kZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2F0dHJfbmxpbmsoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDMyX3QgKm5saW5rKQoreworCXVpbnQzMl90ICpwOworCisJKm5saW5rID0gMTsKKwlpZiAodW5saWtlbHkoYml0bWFwWzFdICYgKEZBVFRSNF9XT1JEMV9OVU1MSU5LUyAtIDFVKSkpCisJCXJldHVybiAtRUlPOworCWlmIChsaWtlbHkoYml0bWFwWzFdICYgRkFUVFI0X1dPUkQxX05VTUxJTktTKSkgeworCQlSRUFEX0JVRig0KTsKKwkJUkVBRDMyKCpubGluayk7CisJCWJpdG1hcFsxXSAmPSB+RkFUVFI0X1dPUkQxX05VTUxJTktTOworCX0KKwlkcHJpbnRrKCIlczogbmxpbms9JXVcbiIsIF9fRlVOQ1RJT05fXywgKHVuc2lnbmVkIGludCkqbmxpbmspOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9hdHRyX293bmVyKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwLCBpbnQzMl90ICp1aWQpCit7CisJdWludDMyX3QgbGVuLCAqcDsKKworCSp1aWQgPSAtMjsKKwlpZiAodW5saWtlbHkoYml0bWFwWzFdICYgKEZBVFRSNF9XT1JEMV9PV05FUiAtIDFVKSkpCisJCXJldHVybiAtRUlPOworCWlmIChsaWtlbHkoYml0bWFwWzFdICYgRkFUVFI0X1dPUkQxX09XTkVSKSkgeworCQlSRUFEX0JVRig0KTsKKwkJUkVBRDMyKGxlbik7CisJCVJFQURfQlVGKGxlbik7CisJCWlmIChsZW4gPCBYRFJfTUFYX05FVE9CSikgeworCQkJaWYgKG5mc19tYXBfbmFtZV90b191aWQoY2xwLCAoY2hhciAqKXAsIGxlbiwgdWlkKSAhPSAwKQorCQkJCWRwcmludGsoIiVzOiBuZnNfbWFwX25hbWVfdG9fdWlkIGZhaWxlZCFcbiIsCisJCQkJCQlfX0ZVTkNUSU9OX18pOworCQl9IGVsc2UKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBuYW1lIHRvbyBsb25nICgldSkhXG4iLAorCQkJCQlfX0ZVTkNUSU9OX18sIGxlbik7CisJCWJpdG1hcFsxXSAmPSB+RkFUVFI0X1dPUkQxX09XTkVSOworCX0KKwlkcHJpbnRrKCIlczogdWlkPSVkXG4iLCBfX0ZVTkNUSU9OX18sIChpbnQpKnVpZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2F0dHJfZ3JvdXAoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgc3RydWN0IG5mczRfY2xpZW50ICpjbHAsIGludDMyX3QgKmdpZCkKK3sKKwl1aW50MzJfdCBsZW4sICpwOworCisJKmdpZCA9IC0yOworCWlmICh1bmxpa2VseShiaXRtYXBbMV0gJiAoRkFUVFI0X1dPUkQxX09XTkVSX0dST1VQIC0gMVUpKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKGxpa2VseShiaXRtYXBbMV0gJiBGQVRUUjRfV09SRDFfT1dORVJfR1JPVVApKSB7CisJCVJFQURfQlVGKDQpOworCQlSRUFEMzIobGVuKTsKKwkJUkVBRF9CVUYobGVuKTsKKwkJaWYgKGxlbiA8IFhEUl9NQVhfTkVUT0JKKSB7CisJCQlpZiAobmZzX21hcF9ncm91cF90b19naWQoY2xwLCAoY2hhciAqKXAsIGxlbiwgZ2lkKSAhPSAwKQorCQkJCWRwcmludGsoIiVzOiBuZnNfbWFwX2dyb3VwX3RvX2dpZCBmYWlsZWQhXG4iLAorCQkJCQkJX19GVU5DVElPTl9fKTsKKwkJfSBlbHNlCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogbmFtZSB0b28gbG9uZyAoJXUpIVxuIiwKKwkJCQkJX19GVU5DVElPTl9fLCBsZW4pOworCQliaXRtYXBbMV0gJj0gfkZBVFRSNF9XT1JEMV9PV05FUl9HUk9VUDsKKwl9CisJZHByaW50aygiJXM6IGdpZD0lZFxuIiwgX19GVU5DVElPTl9fLCAoaW50KSpnaWQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9hdHRyX3JkZXYoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgZGV2X3QgKnJkZXYpCit7CisJdWludDMyX3QgbWFqb3IgPSAwLCBtaW5vciA9IDAsICpwOworCisJKnJkZXYgPSBNS0RFVigwLDApOworCWlmICh1bmxpa2VseShiaXRtYXBbMV0gJiAoRkFUVFI0X1dPUkQxX1JBV0RFViAtIDFVKSkpCisJCXJldHVybiAtRUlPOworCWlmIChsaWtlbHkoYml0bWFwWzFdICYgRkFUVFI0X1dPUkQxX1JBV0RFVikpIHsKKwkJZGV2X3QgdG1wOworCisJCVJFQURfQlVGKDgpOworCQlSRUFEMzIobWFqb3IpOworCQlSRUFEMzIobWlub3IpOworCQl0bXAgPSBNS0RFVihtYWpvciwgbWlub3IpOworCQlpZiAoTUFKT1IodG1wKSA9PSBtYWpvciAmJiBNSU5PUih0bXApID09IG1pbm9yKQorCQkJKnJkZXYgPSB0bXA7CisJCWJpdG1hcFsxXSAmPSB+IEZBVFRSNF9XT1JEMV9SQVdERVY7CisJfQorCWRwcmludGsoIiVzOiByZGV2PSgweCV4OjB4JXgpXG4iLCBfX0ZVTkNUSU9OX18sIG1ham9yLCBtaW5vcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2F0dHJfc3BhY2VfYXZhaWwoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDY0X3QgKnJlcykKK3sKKwl1aW50MzJfdCAqcDsKKwlpbnQgc3RhdHVzID0gMDsKKworCSpyZXMgPSAwOworCWlmICh1bmxpa2VseShiaXRtYXBbMV0gJiAoRkFUVFI0X1dPUkQxX1NQQUNFX0FWQUlMIC0gMVUpKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKGxpa2VseShiaXRtYXBbMV0gJiBGQVRUUjRfV09SRDFfU1BBQ0VfQVZBSUwpKSB7CisJCVJFQURfQlVGKDgpOworCQlSRUFENjQoKnJlcyk7CisJCWJpdG1hcFsxXSAmPSB+RkFUVFI0X1dPUkQxX1NQQUNFX0FWQUlMOworCX0KKwlkcHJpbnRrKCIlczogc3BhY2UgYXZhaWw9JUx1XG4iLCBfX0ZVTkNUSU9OX18sICh1bnNpZ25lZCBsb25nIGxvbmcpKnJlcyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBkZWNvZGVfYXR0cl9zcGFjZV9mcmVlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHVpbnQzMl90ICpiaXRtYXAsIHVpbnQ2NF90ICpyZXMpCit7CisJdWludDMyX3QgKnA7CisJaW50IHN0YXR1cyA9IDA7CisKKwkqcmVzID0gMDsKKwlpZiAodW5saWtlbHkoYml0bWFwWzFdICYgKEZBVFRSNF9XT1JEMV9TUEFDRV9GUkVFIC0gMVUpKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKGxpa2VseShiaXRtYXBbMV0gJiBGQVRUUjRfV09SRDFfU1BBQ0VfRlJFRSkpIHsKKwkJUkVBRF9CVUYoOCk7CisJCVJFQUQ2NCgqcmVzKTsKKwkJYml0bWFwWzFdICY9IH5GQVRUUjRfV09SRDFfU1BBQ0VfRlJFRTsKKwl9CisJZHByaW50aygiJXM6IHNwYWNlIGZyZWU9JUx1XG4iLCBfX0ZVTkNUSU9OX18sICh1bnNpZ25lZCBsb25nIGxvbmcpKnJlcyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBkZWNvZGVfYXR0cl9zcGFjZV90b3RhbChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCB1aW50NjRfdCAqcmVzKQoreworCXVpbnQzMl90ICpwOworCWludCBzdGF0dXMgPSAwOworCisJKnJlcyA9IDA7CisJaWYgKHVubGlrZWx5KGJpdG1hcFsxXSAmIChGQVRUUjRfV09SRDFfU1BBQ0VfVE9UQUwgLSAxVSkpKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAobGlrZWx5KGJpdG1hcFsxXSAmIEZBVFRSNF9XT1JEMV9TUEFDRV9UT1RBTCkpIHsKKwkJUkVBRF9CVUYoOCk7CisJCVJFQUQ2NCgqcmVzKTsKKwkJYml0bWFwWzFdICY9IH5GQVRUUjRfV09SRDFfU1BBQ0VfVE9UQUw7CisJfQorCWRwcmludGsoIiVzOiBzcGFjZSB0b3RhbD0lTHVcbiIsIF9fRlVOQ1RJT05fXywgKHVuc2lnbmVkIGxvbmcgbG9uZykqcmVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGRlY29kZV9hdHRyX3NwYWNlX3VzZWQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgdWludDY0X3QgKnVzZWQpCit7CisJdWludDMyX3QgKnA7CisKKwkqdXNlZCA9IDA7CisJaWYgKHVubGlrZWx5KGJpdG1hcFsxXSAmIChGQVRUUjRfV09SRDFfU1BBQ0VfVVNFRCAtIDFVKSkpCisJCXJldHVybiAtRUlPOworCWlmIChsaWtlbHkoYml0bWFwWzFdICYgRkFUVFI0X1dPUkQxX1NQQUNFX1VTRUQpKSB7CisJCVJFQURfQlVGKDgpOworCQlSRUFENjQoKnVzZWQpOworCQliaXRtYXBbMV0gJj0gfkZBVFRSNF9XT1JEMV9TUEFDRV9VU0VEOworCX0KKwlkcHJpbnRrKCIlczogc3BhY2UgdXNlZD0lTHVcbiIsIF9fRlVOQ1RJT05fXywKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpKnVzZWQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9hdHRyX3RpbWUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IHRpbWVzcGVjICp0aW1lKQoreworCXVpbnQzMl90ICpwOworCXVpbnQ2NF90IHNlYzsKKwl1aW50MzJfdCBuc2VjOworCisJUkVBRF9CVUYoMTIpOworCVJFQUQ2NChzZWMpOworCVJFQUQzMihuc2VjKTsKKwl0aW1lLT50dl9zZWMgPSAodGltZV90KXNlYzsKKwl0aW1lLT50dl9uc2VjID0gKGxvbmcpbnNlYzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfYXR0cl90aW1lX2FjY2VzcyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWUpCit7CisJaW50IHN0YXR1cyA9IDA7CisKKwl0aW1lLT50dl9zZWMgPSAwOworCXRpbWUtPnR2X25zZWMgPSAwOworCWlmICh1bmxpa2VseShiaXRtYXBbMV0gJiAoRkFUVFI0X1dPUkQxX1RJTUVfQUNDRVNTIC0gMVUpKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKGxpa2VseShiaXRtYXBbMV0gJiBGQVRUUjRfV09SRDFfVElNRV9BQ0NFU1MpKSB7CisJCXN0YXR1cyA9IGRlY29kZV9hdHRyX3RpbWUoeGRyLCB0aW1lKTsKKwkJYml0bWFwWzFdICY9IH5GQVRUUjRfV09SRDFfVElNRV9BQ0NFU1M7CisJfQorCWRwcmludGsoIiVzOiBhdGltZT0lbGRcbiIsIF9fRlVOQ1RJT05fXywgKGxvbmcpdGltZS0+dHZfc2VjKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGRlY29kZV9hdHRyX3RpbWVfbWV0YWRhdGEoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdWludDMyX3QgKmJpdG1hcCwgc3RydWN0IHRpbWVzcGVjICp0aW1lKQoreworCWludCBzdGF0dXMgPSAwOworCisJdGltZS0+dHZfc2VjID0gMDsKKwl0aW1lLT50dl9uc2VjID0gMDsKKwlpZiAodW5saWtlbHkoYml0bWFwWzFdICYgKEZBVFRSNF9XT1JEMV9USU1FX01FVEFEQVRBIC0gMVUpKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKGxpa2VseShiaXRtYXBbMV0gJiBGQVRUUjRfV09SRDFfVElNRV9NRVRBREFUQSkpIHsKKwkJc3RhdHVzID0gZGVjb2RlX2F0dHJfdGltZSh4ZHIsIHRpbWUpOworCQliaXRtYXBbMV0gJj0gfkZBVFRSNF9XT1JEMV9USU1FX01FVEFEQVRBOworCX0KKwlkcHJpbnRrKCIlczogY3RpbWU9JWxkXG4iLCBfX0ZVTkNUSU9OX18sIChsb25nKXRpbWUtPnR2X3NlYyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBkZWNvZGVfYXR0cl90aW1lX21vZGlmeShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWUpCit7CisJaW50IHN0YXR1cyA9IDA7CisKKwl0aW1lLT50dl9zZWMgPSAwOworCXRpbWUtPnR2X25zZWMgPSAwOworCWlmICh1bmxpa2VseShiaXRtYXBbMV0gJiAoRkFUVFI0X1dPUkQxX1RJTUVfTU9ESUZZIC0gMVUpKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKGxpa2VseShiaXRtYXBbMV0gJiBGQVRUUjRfV09SRDFfVElNRV9NT0RJRlkpKSB7CisJCXN0YXR1cyA9IGRlY29kZV9hdHRyX3RpbWUoeGRyLCB0aW1lKTsKKwkJYml0bWFwWzFdICY9IH5GQVRUUjRfV09SRDFfVElNRV9NT0RJRlk7CisJfQorCWRwcmludGsoIiVzOiBtdGltZT0lbGRcbiIsIF9fRlVOQ1RJT05fXywgKGxvbmcpdGltZS0+dHZfc2VjKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IHZlcmlmeV9hdHRyX2xlbihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqc2F2ZXAsIHVpbnQzMl90IGF0dHJsZW4pCit7CisJdW5zaWduZWQgaW50IGF0dHJ3b3JkcyA9IFhEUl9RVUFETEVOKGF0dHJsZW4pOworCXVuc2lnbmVkIGludCBud29yZHMgPSB4ZHItPnAgLSBzYXZlcDsKKworCWlmICh1bmxpa2VseShhdHRyd29yZHMgIT0gbndvcmRzKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogc2VydmVyIHJldHVybmVkIGluY29ycmVjdCBhdHRyaWJ1dGUgbGVuZ3RoOiAldSAlYyAldVxuIiwKKwkJCQlfX0ZVTkNUSU9OX18sCisJCQkJYXR0cndvcmRzIDw8IDIsCisJCQkJKGF0dHJ3b3JkcyA8IG53b3JkcykgPyAnPCcgOiAnPicsCisJCQkJbndvcmRzIDw8IDIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2NoYW5nZV9pbmZvKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnM0X2NoYW5nZV9pbmZvICpjaW5mbykKK3sKKwl1aW50MzJfdCAqcDsKKworCVJFQURfQlVGKDIwKTsKKwlSRUFEMzIoY2luZm8tPmF0b21pYyk7CisJUkVBRDY0KGNpbmZvLT5iZWZvcmUpOworCVJFQUQ2NChjaW5mby0+YWZ0ZXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9hY2Nlc3Moc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mczRfYWNjZXNzcmVzICphY2Nlc3MpCit7CisJdWludDMyX3QgKnA7CisJdWludDMyX3Qgc3VwcCwgYWNjOworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBkZWNvZGVfb3BfaGRyKHhkciwgT1BfQUNDRVNTKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCVJFQURfQlVGKDgpOworCVJFQUQzMihzdXBwKTsKKwlSRUFEMzIoYWNjKTsKKwlhY2Nlc3MtPnN1cHBvcnRlZCA9IHN1cHA7CisJYWNjZXNzLT5hY2Nlc3MgPSBhY2M7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2Nsb3NlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfY2xvc2VyZXMgKnJlcykKK3sKKwl1aW50MzJfdCAqcDsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gZGVjb2RlX29wX2hkcih4ZHIsIE9QX0NMT1NFKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCVJFQURfQlVGKHNpemVvZihyZXMtPnN0YXRlaWQuZGF0YSkpOworCUNPUFlNRU0ocmVzLT5zdGF0ZWlkLmRhdGEsIHNpemVvZihyZXMtPnN0YXRlaWQuZGF0YSkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9jb21taXQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc193cml0ZXJlcyAqcmVzKQoreworCXVpbnQzMl90ICpwOworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBkZWNvZGVfb3BfaGRyKHhkciwgT1BfQ09NTUlUKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCVJFQURfQlVGKDgpOworCUNPUFlNRU0ocmVzLT52ZXJmLT52ZXJpZmllciwgOCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2NyZWF0ZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzNF9jaGFuZ2VfaW5mbyAqY2luZm8pCit7CisJdWludDMyX3QgKnA7CisJdWludDMyX3QgYm1sZW47CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGRlY29kZV9vcF9oZHIoeGRyLCBPUF9DUkVBVEUpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfY2hhbmdlX2luZm8oeGRyLCBjaW5mbykpKQorCQlyZXR1cm4gc3RhdHVzOworCVJFQURfQlVGKDQpOworCVJFQUQzMihibWxlbik7CisJUkVBRF9CVUYoYm1sZW4gPDwgMik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3NlcnZlcl9jYXBzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnM0X3NlcnZlcl9jYXBzX3JlcyAqcmVzKQoreworCXVpbnQzMl90ICpzYXZlcDsKKwl1aW50MzJfdCBhdHRybGVuLCAKKwkJIGJpdG1hcFsyXSA9IHswfTsKKwlpbnQgc3RhdHVzOworCisJaWYgKChzdGF0dXMgPSBkZWNvZGVfb3BfaGRyKHhkciwgT1BfR0VUQVRUUikpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfYml0bWFwKHhkciwgYml0bWFwKSkgIT0gMCkKKwkJZ290byB4ZHJfZXJyb3I7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfYXR0cl9sZW5ndGgoeGRyLCAmYXR0cmxlbiwgJnNhdmVwKSkgIT0gMCkKKwkJZ290byB4ZHJfZXJyb3I7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfYXR0cl9zdXBwb3J0ZWQoeGRyLCBiaXRtYXAsIHJlcy0+YXR0cl9iaXRtYXNrKSkgIT0gMCkKKwkJZ290byB4ZHJfZXJyb3I7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfYXR0cl9saW5rX3N1cHBvcnQoeGRyLCBiaXRtYXAsICZyZXMtPmhhc19saW5rcykpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfc3ltbGlua19zdXBwb3J0KHhkciwgYml0bWFwLCAmcmVzLT5oYXNfc3ltbGlua3MpKSAhPSAwKQorCQlnb3RvIHhkcl9lcnJvcjsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9hdHRyX2FjbHN1cHBvcnQoeGRyLCBiaXRtYXAsICZyZXMtPmFjbF9iaXRtYXNrKSkgIT0gMCkKKwkJZ290byB4ZHJfZXJyb3I7CisJc3RhdHVzID0gdmVyaWZ5X2F0dHJfbGVuKHhkciwgc2F2ZXAsIGF0dHJsZW4pOworeGRyX2Vycm9yOgorCWlmIChzdGF0dXMgIT0gMCkKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogeGRyIGVycm9yICVkIVxuIiwgX19GVU5DVElPTl9fLCAtc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCQorc3RhdGljIGludCBkZWNvZGVfc3RhdGZzKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfZnNzdGF0ICpmc3N0YXQpCit7CisJdWludDMyX3QgKnNhdmVwOworCXVpbnQzMl90IGF0dHJsZW4sIAorCQkgYml0bWFwWzJdID0gezB9OworCWludCBzdGF0dXM7CisJCisJaWYgKChzdGF0dXMgPSBkZWNvZGVfb3BfaGRyKHhkciwgT1BfR0VUQVRUUikpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfYml0bWFwKHhkciwgYml0bWFwKSkgIT0gMCkKKwkJZ290byB4ZHJfZXJyb3I7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfYXR0cl9sZW5ndGgoeGRyLCAmYXR0cmxlbiwgJnNhdmVwKSkgIT0gMCkKKwkJZ290byB4ZHJfZXJyb3I7CisKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9hdHRyX2ZpbGVzX2F2YWlsKHhkciwgYml0bWFwLCAmZnNzdGF0LT5hZmlsZXMpKSAhPSAwKQorCQlnb3RvIHhkcl9lcnJvcjsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9hdHRyX2ZpbGVzX2ZyZWUoeGRyLCBiaXRtYXAsICZmc3N0YXQtPmZmaWxlcykpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfZmlsZXNfdG90YWwoeGRyLCBiaXRtYXAsICZmc3N0YXQtPnRmaWxlcykpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfc3BhY2VfYXZhaWwoeGRyLCBiaXRtYXAsICZmc3N0YXQtPmFieXRlcykpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfc3BhY2VfZnJlZSh4ZHIsIGJpdG1hcCwgJmZzc3RhdC0+ZmJ5dGVzKSkgIT0gMCkKKwkJZ290byB4ZHJfZXJyb3I7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfYXR0cl9zcGFjZV90b3RhbCh4ZHIsIGJpdG1hcCwgJmZzc3RhdC0+dGJ5dGVzKSkgIT0gMCkKKwkJZ290byB4ZHJfZXJyb3I7CisKKwlzdGF0dXMgPSB2ZXJpZnlfYXR0cl9sZW4oeGRyLCBzYXZlcCwgYXR0cmxlbik7Cit4ZHJfZXJyb3I6CisJaWYgKHN0YXR1cyAhPSAwKQorCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiB4ZHIgZXJyb3IgJWQhXG4iLCBfX0ZVTkNUSU9OX18sIC1zdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3BhdGhjb25mKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfcGF0aGNvbmYgKnBhdGhjb25mKQoreworCXVpbnQzMl90ICpzYXZlcDsKKwl1aW50MzJfdCBhdHRybGVuLCAKKwkJIGJpdG1hcFsyXSA9IHswfTsKKwlpbnQgc3RhdHVzOworCQorCWlmICgoc3RhdHVzID0gZGVjb2RlX29wX2hkcih4ZHIsIE9QX0dFVEFUVFIpKSAhPSAwKQorCQlnb3RvIHhkcl9lcnJvcjsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9hdHRyX2JpdG1hcCh4ZHIsIGJpdG1hcCkpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfbGVuZ3RoKHhkciwgJmF0dHJsZW4sICZzYXZlcCkpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCisJaWYgKChzdGF0dXMgPSBkZWNvZGVfYXR0cl9tYXhsaW5rKHhkciwgYml0bWFwLCAmcGF0aGNvbmYtPm1heF9saW5rKSkgIT0gMCkKKwkJZ290byB4ZHJfZXJyb3I7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfYXR0cl9tYXhuYW1lKHhkciwgYml0bWFwLCAmcGF0aGNvbmYtPm1heF9uYW1lbGVuKSkgIT0gMCkKKwkJZ290byB4ZHJfZXJyb3I7CisKKwlzdGF0dXMgPSB2ZXJpZnlfYXR0cl9sZW4oeGRyLCBzYXZlcCwgYXR0cmxlbik7Cit4ZHJfZXJyb3I6CisJaWYgKHN0YXR1cyAhPSAwKQorCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiB4ZHIgZXJyb3IgJWQhXG4iLCBfX0ZVTkNUSU9OX18sIC1zdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2dldGZhdHRyKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyLCBjb25zdCBzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyKQoreworCXVpbnQzMl90ICpzYXZlcDsKKwl1aW50MzJfdCBhdHRybGVuLAorCQkgYml0bWFwWzJdID0gezB9LAorCQkgdHlwZTsKKwlpbnQgc3RhdHVzLCBmbW9kZSA9IDA7CisKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9vcF9oZHIoeGRyLCBPUF9HRVRBVFRSKSkgIT0gMCkKKwkJZ290byB4ZHJfZXJyb3I7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfYXR0cl9iaXRtYXAoeGRyLCBiaXRtYXApKSAhPSAwKQorCQlnb3RvIHhkcl9lcnJvcjsKKworCWZhdHRyLT5iaXRtYXBbMF0gPSBiaXRtYXBbMF07CisJZmF0dHItPmJpdG1hcFsxXSA9IGJpdG1hcFsxXTsKKworCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfbGVuZ3RoKHhkciwgJmF0dHJsZW4sICZzYXZlcCkpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCisKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9hdHRyX3R5cGUoeGRyLCBiaXRtYXAsICZ0eXBlKSkgIT0gMCkKKwkJZ290byB4ZHJfZXJyb3I7CisJZmF0dHItPnR5cGUgPSBuZnNfdHlwZTJmbXRbdHlwZV0ubmZzMnR5cGU7CisJZm1vZGUgPSBuZnNfdHlwZTJmbXRbdHlwZV0ubW9kZTsKKworCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfY2hhbmdlKHhkciwgYml0bWFwLCAmZmF0dHItPmNoYW5nZV9hdHRyKSkgIT0gMCkKKwkJZ290byB4ZHJfZXJyb3I7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfYXR0cl9zaXplKHhkciwgYml0bWFwLCAmZmF0dHItPnNpemUpKSAhPSAwKQorCQlnb3RvIHhkcl9lcnJvcjsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9hdHRyX2ZzaWQoeGRyLCBiaXRtYXAsICZmYXR0ci0+ZnNpZF91Lm5mczQpKSAhPSAwKQorCQlnb3RvIHhkcl9lcnJvcjsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9hdHRyX2ZpbGVpZCh4ZHIsIGJpdG1hcCwgJmZhdHRyLT5maWxlaWQpKSAhPSAwKQorCQlnb3RvIHhkcl9lcnJvcjsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9hdHRyX21vZGUoeGRyLCBiaXRtYXAsICZmYXR0ci0+bW9kZSkpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCWZhdHRyLT5tb2RlIHw9IGZtb2RlOworCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfbmxpbmsoeGRyLCBiaXRtYXAsICZmYXR0ci0+bmxpbmspKSAhPSAwKQorCQlnb3RvIHhkcl9lcnJvcjsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9hdHRyX293bmVyKHhkciwgYml0bWFwLCBzZXJ2ZXItPm5mczRfc3RhdGUsICZmYXR0ci0+dWlkKSkgIT0gMCkKKwkJZ290byB4ZHJfZXJyb3I7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfYXR0cl9ncm91cCh4ZHIsIGJpdG1hcCwgc2VydmVyLT5uZnM0X3N0YXRlLCAmZmF0dHItPmdpZCkpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfcmRldih4ZHIsIGJpdG1hcCwgJmZhdHRyLT5yZGV2KSkgIT0gMCkKKwkJZ290byB4ZHJfZXJyb3I7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfYXR0cl9zcGFjZV91c2VkKHhkciwgYml0bWFwLCAmZmF0dHItPmR1Lm5mczMudXNlZCkpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfdGltZV9hY2Nlc3MoeGRyLCBiaXRtYXAsICZmYXR0ci0+YXRpbWUpKSAhPSAwKQorCQlnb3RvIHhkcl9lcnJvcjsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9hdHRyX3RpbWVfbWV0YWRhdGEoeGRyLCBiaXRtYXAsICZmYXR0ci0+Y3RpbWUpKSAhPSAwKQorCQlnb3RvIHhkcl9lcnJvcjsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9hdHRyX3RpbWVfbW9kaWZ5KHhkciwgYml0bWFwLCAmZmF0dHItPm10aW1lKSkgIT0gMCkKKwkJZ290byB4ZHJfZXJyb3I7CisJaWYgKChzdGF0dXMgPSB2ZXJpZnlfYXR0cl9sZW4oeGRyLCBzYXZlcCwgYXR0cmxlbikpID09IDApIHsKKwkJZmF0dHItPnZhbGlkID0gTkZTX0FUVFJfRkFUVFIgfCBORlNfQVRUUl9GQVRUUl9WMyB8IE5GU19BVFRSX0ZBVFRSX1Y0OworCQlmYXR0ci0+dGltZXN0YW1wID0gamlmZmllczsKKwl9Cit4ZHJfZXJyb3I6CisJaWYgKHN0YXR1cyAhPSAwKQorCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiB4ZHIgZXJyb3IgJWQhXG4iLCBfX0ZVTkNUSU9OX18sIC1zdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKKworc3RhdGljIGludCBkZWNvZGVfZnNpbmZvKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfZnNpbmZvICpmc2luZm8pCit7CisJdWludDMyX3QgKnNhdmVwOworCXVpbnQzMl90IGF0dHJsZW4sIGJpdG1hcFsyXTsKKwlpbnQgc3RhdHVzOworCisJaWYgKChzdGF0dXMgPSBkZWNvZGVfb3BfaGRyKHhkciwgT1BfR0VUQVRUUikpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfYml0bWFwKHhkciwgYml0bWFwKSkgIT0gMCkKKwkJZ290byB4ZHJfZXJyb3I7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfYXR0cl9sZW5ndGgoeGRyLCAmYXR0cmxlbiwgJnNhdmVwKSkgIT0gMCkKKwkJZ290byB4ZHJfZXJyb3I7CisKKwlmc2luZm8tPnJ0bXVsdCA9IGZzaW5mby0+d3RtdWx0ID0gNTEyOwkvKiA/Pz8gKi8KKworCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfbGVhc2VfdGltZSh4ZHIsIGJpdG1hcCwgJmZzaW5mby0+bGVhc2VfdGltZSkpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfbWF4ZmlsZXNpemUoeGRyLCBiaXRtYXAsICZmc2luZm8tPm1heGZpbGVzaXplKSkgIT0gMCkKKwkJZ290byB4ZHJfZXJyb3I7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfYXR0cl9tYXhyZWFkKHhkciwgYml0bWFwLCAmZnNpbmZvLT5ydG1heCkpICE9IDApCisJCWdvdG8geGRyX2Vycm9yOworCWZzaW5mby0+cnRwcmVmID0gZnNpbmZvLT5kdHByZWYgPSBmc2luZm8tPnJ0bWF4OworCWlmICgoc3RhdHVzID0gZGVjb2RlX2F0dHJfbWF4d3JpdGUoeGRyLCBiaXRtYXAsICZmc2luZm8tPnd0bWF4KSkgIT0gMCkKKwkJZ290byB4ZHJfZXJyb3I7CisJZnNpbmZvLT53dHByZWYgPSBmc2luZm8tPnd0bWF4OworCisJc3RhdHVzID0gdmVyaWZ5X2F0dHJfbGVuKHhkciwgc2F2ZXAsIGF0dHJsZW4pOworeGRyX2Vycm9yOgorCWlmIChzdGF0dXMgIT0gMCkKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogeGRyIGVycm9yICVkIVxuIiwgX19GVU5DVElPTl9fLCAtc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGRlY29kZV9nZXRmaChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX2ZoICpmaCkKK3sKKwl1aW50MzJfdCAqcDsKKwl1aW50MzJfdCBsZW47CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGRlY29kZV9vcF9oZHIoeGRyLCBPUF9HRVRGSCk7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKwkvKiBaZXJvIGhhbmRsZSBmaXJzdCB0byBhbGxvdyBjb21wYXJpc29ucyAqLworCW1lbXNldChmaCwgMCwgc2l6ZW9mKCpmaCkpOworCisJUkVBRF9CVUYoNCk7CisJUkVBRDMyKGxlbik7CisJaWYgKGxlbiA+IE5GUzRfRkhTSVpFKQorCQlyZXR1cm4gLUVJTzsKKwlmaC0+c2l6ZSA9IGxlbjsKKwlSRUFEX0JVRihsZW4pOworCUNPUFlNRU0oZmgtPmRhdGEsIGxlbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2xpbmsoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mczRfY2hhbmdlX2luZm8gKmNpbmZvKQoreworCWludCBzdGF0dXM7CisJCisJc3RhdHVzID0gZGVjb2RlX29wX2hkcih4ZHIsIE9QX0xJTkspOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisJcmV0dXJuIGRlY29kZV9jaGFuZ2VfaW5mbyh4ZHIsIGNpbmZvKTsKK30KKworLyoKKyAqIFdlIGNyZWF0ZSB0aGUgb3duZXIsIHNvIHdlIGtub3cgYSBwcm9wZXIgb3duZXIuaWQgbGVuZ3RoIGlzIDQuCisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX2xvY2tfZGVuaWVkIChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX2xvY2tfZGVuaWVkICpkZW5pZWQpCit7CisJdWludDMyX3QgKnA7CisJdWludDMyX3QgbmFtZWxlbjsKKworCVJFQURfQlVGKDMyKTsKKwlSRUFENjQoZGVuaWVkLT5vZmZzZXQpOworCVJFQUQ2NChkZW5pZWQtPmxlbmd0aCk7CisJUkVBRDMyKGRlbmllZC0+dHlwZSk7CisJUkVBRDY0KGRlbmllZC0+b3duZXIuY2xpZW50aWQpOworCVJFQUQzMihuYW1lbGVuKTsKKwlSRUFEX0JVRihuYW1lbGVuKTsKKwlpZiAobmFtZWxlbiA9PSA0KQorCQlSRUFEMzIoZGVuaWVkLT5vd25lci5pZCk7CisJcmV0dXJuIC1ORlM0RVJSX0RFTklFRDsKK30KKworc3RhdGljIGludCBkZWNvZGVfbG9jayhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX2xvY2tyZXMgKnJlcykKK3sKKwl1aW50MzJfdCAqcDsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gZGVjb2RlX29wX2hkcih4ZHIsIE9QX0xPQ0spOworCWlmIChzdGF0dXMgPT0gMCkgeworCQlSRUFEX0JVRihzaXplb2YobmZzNF9zdGF0ZWlkKSk7CisJCUNPUFlNRU0oJnJlcy0+dS5zdGF0ZWlkLCBzaXplb2YocmVzLT51LnN0YXRlaWQpKTsKKwl9IGVsc2UgaWYgKHN0YXR1cyA9PSAtTkZTNEVSUl9ERU5JRUQpCisJCXJldHVybiBkZWNvZGVfbG9ja19kZW5pZWQoeGRyLCAmcmVzLT51LmRlbmllZCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBkZWNvZGVfbG9ja3Qoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19sb2NrcmVzICpyZXMpCit7CisJaW50IHN0YXR1czsKKwlzdGF0dXMgPSBkZWNvZGVfb3BfaGRyKHhkciwgT1BfTE9DS1QpOworCWlmIChzdGF0dXMgPT0gLU5GUzRFUlJfREVOSUVEKQorCQlyZXR1cm4gZGVjb2RlX2xvY2tfZGVuaWVkKHhkciwgJnJlcy0+dS5kZW5pZWQpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2xvY2t1KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfbG9ja3JlcyAqcmVzKQoreworCXVpbnQzMl90ICpwOworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBkZWNvZGVfb3BfaGRyKHhkciwgT1BfTE9DS1UpOworCWlmIChzdGF0dXMgPT0gMCkgeworCQlSRUFEX0JVRihzaXplb2YobmZzNF9zdGF0ZWlkKSk7CisJCUNPUFlNRU0oJnJlcy0+dS5zdGF0ZWlkLCBzaXplb2YocmVzLT51LnN0YXRlaWQpKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBkZWNvZGVfbG9va3VwKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIpCit7CisJcmV0dXJuIGRlY29kZV9vcF9oZHIoeGRyLCBPUF9MT09LVVApOworfQorCisvKiBUaGlzIGlzIHRvbyBzaWNrISAqLworc3RhdGljIGludCBkZWNvZGVfc3BhY2VfbGltaXQoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgdTY0ICptYXhzaXplKQoreworICAgICAgICB1aW50MzJfdCAqcDsKKwl1aW50MzJfdCBsaW1pdF90eXBlLCBuYmxvY2tzLCBibG9ja3NpemU7CisKKwlSRUFEX0JVRigxMik7CisJUkVBRDMyKGxpbWl0X3R5cGUpOworCXN3aXRjaCAobGltaXRfdHlwZSkgeworCQljYXNlIDE6CisJCQlSRUFENjQoKm1heHNpemUpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCVJFQUQzMihuYmxvY2tzKTsKKwkJCVJFQUQzMihibG9ja3NpemUpOworCQkJKm1heHNpemUgPSAodWludDY0X3QpbmJsb2NrcyAqICh1aW50NjRfdClibG9ja3NpemU7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9kZWxlZ2F0aW9uKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfb3BlbnJlcyAqcmVzKQoreworICAgICAgICB1aW50MzJfdCAqcDsKKyAgICAgICAgdWludDMyX3QgZGVsZWdhdGlvbl90eXBlOworCisJUkVBRF9CVUYoNCk7CisJUkVBRDMyKGRlbGVnYXRpb25fdHlwZSk7CisJaWYgKGRlbGVnYXRpb25fdHlwZSA9PSBORlM0X09QRU5fREVMRUdBVEVfTk9ORSkgeworCQlyZXMtPmRlbGVnYXRpb25fdHlwZSA9IDA7CisJCXJldHVybiAwOworCX0KKwlSRUFEX0JVRigyMCk7CisJQ09QWU1FTShyZXMtPmRlbGVnYXRpb24uZGF0YSwgc2l6ZW9mKHJlcy0+ZGVsZWdhdGlvbi5kYXRhKSk7CisJUkVBRDMyKHJlcy0+ZG9fcmVjYWxsKTsKKwlzd2l0Y2ggKGRlbGVnYXRpb25fdHlwZSkgeworCQljYXNlIE5GUzRfT1BFTl9ERUxFR0FURV9SRUFEOgorCQkJcmVzLT5kZWxlZ2F0aW9uX3R5cGUgPSBGTU9ERV9SRUFEOworCQkJYnJlYWs7CisJCWNhc2UgTkZTNF9PUEVOX0RFTEVHQVRFX1dSSVRFOgorCQkJcmVzLT5kZWxlZ2F0aW9uX3R5cGUgPSBGTU9ERV9XUklURXxGTU9ERV9SRUFEOworCQkJaWYgKGRlY29kZV9zcGFjZV9saW1pdCh4ZHIsICZyZXMtPm1heHNpemUpIDwgMCkKKwkJCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIGRlY29kZV9hY2UoeGRyLCBOVUxMLCByZXMtPnNlcnZlci0+bmZzNF9zdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX29wZW4oc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19vcGVucmVzICpyZXMpCit7CisgICAgICAgIHVpbnQzMl90ICpwOworICAgICAgICB1aW50MzJfdCBibWxlbjsKKyAgICAgICAgaW50IHN0YXR1czsKKworICAgICAgICBzdGF0dXMgPSBkZWNvZGVfb3BfaGRyKHhkciwgT1BfT1BFTik7CisgICAgICAgIGlmIChzdGF0dXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgUkVBRF9CVUYoc2l6ZW9mKHJlcy0+c3RhdGVpZC5kYXRhKSk7CisgICAgICAgIENPUFlNRU0ocmVzLT5zdGF0ZWlkLmRhdGEsIHNpemVvZihyZXMtPnN0YXRlaWQuZGF0YSkpOworCisgICAgICAgIGRlY29kZV9jaGFuZ2VfaW5mbyh4ZHIsICZyZXMtPmNpbmZvKTsKKworICAgICAgICBSRUFEX0JVRig4KTsKKyAgICAgICAgUkVBRDMyKHJlcy0+cmZsYWdzKTsKKyAgICAgICAgUkVBRDMyKGJtbGVuKTsKKyAgICAgICAgaWYgKGJtbGVuID4gMTApCisgICAgICAgICAgICAgICAgZ290byB4ZHJfZXJyb3I7CisKKyAgICAgICAgUkVBRF9CVUYoYm1sZW4gPDwgMik7CisgICAgICAgIHAgKz0gYm1sZW47CisJcmV0dXJuIGRlY29kZV9kZWxlZ2F0aW9uKHhkciwgcmVzKTsKK3hkcl9lcnJvcjoKKwlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiB4ZHIgZXJyb3IhXG4iLCBfX0ZVTkNUSU9OX18pOworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaW50IGRlY29kZV9vcGVuX2NvbmZpcm0oc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19vcGVuX2NvbmZpcm1yZXMgKnJlcykKK3sKKyAgICAgICAgdWludDMyX3QgKnA7CisJaW50IHN0YXR1czsKKworICAgICAgICBzdGF0dXMgPSBkZWNvZGVfb3BfaGRyKHhkciwgT1BfT1BFTl9DT05GSVJNKTsKKyAgICAgICAgaWYgKHN0YXR1cykKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICBSRUFEX0JVRihzaXplb2YocmVzLT5zdGF0ZWlkLmRhdGEpKTsKKyAgICAgICAgQ09QWU1FTShyZXMtPnN0YXRlaWQuZGF0YSwgc2l6ZW9mKHJlcy0+c3RhdGVpZC5kYXRhKSk7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9vcGVuX2Rvd25ncmFkZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX2Nsb3NlcmVzICpyZXMpCit7CisJdWludDMyX3QgKnA7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGRlY29kZV9vcF9oZHIoeGRyLCBPUF9PUEVOX0RPV05HUkFERSk7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKwlSRUFEX0JVRihzaXplb2YocmVzLT5zdGF0ZWlkLmRhdGEpKTsKKwlDT1BZTUVNKHJlcy0+c3RhdGVpZC5kYXRhLCBzaXplb2YocmVzLT5zdGF0ZWlkLmRhdGEpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfcHV0Zmgoc3RydWN0IHhkcl9zdHJlYW0gKnhkcikKK3sKKwlyZXR1cm4gZGVjb2RlX29wX2hkcih4ZHIsIE9QX1BVVEZIKTsKK30KKworc3RhdGljIGludCBkZWNvZGVfcHV0cm9vdGZoKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIpCit7CisJcmV0dXJuIGRlY29kZV9vcF9oZHIoeGRyLCBPUF9QVVRST09URkgpOworfQorCitzdGF0aWMgaW50IGRlY29kZV9yZWFkKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBycGNfcnFzdCAqcmVxLCBzdHJ1Y3QgbmZzX3JlYWRyZXMgKnJlcykKK3sKKwlzdHJ1Y3Qga3ZlYyAqaW92ID0gcmVxLT5ycV9yY3ZfYnVmLmhlYWQ7CisJdWludDMyX3QgKnA7CisJdWludDMyX3QgY291bnQsIGVvZiwgcmVjdmQsIGhkcmxlbjsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gZGVjb2RlX29wX2hkcih4ZHIsIE9QX1JFQUQpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisJUkVBRF9CVUYoOCk7CisJUkVBRDMyKGVvZik7CisJUkVBRDMyKGNvdW50KTsKKwloZHJsZW4gPSAodTggKikgcCAtICh1OCAqKSBpb3YtPmlvdl9iYXNlOworCXJlY3ZkID0gcmVxLT5ycV9yY3ZfYnVmLmxlbiAtIGhkcmxlbjsKKwlpZiAoY291bnQgPiByZWN2ZCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJORlM6IHNlcnZlciBjaGVhdGluZyBpbiByZWFkIHJlcGx5OiAiCisJCQkJImNvdW50ICV1ID4gcmVjdmQgJXVcbiIsIGNvdW50LCByZWN2ZCk7CisJCWNvdW50ID0gcmVjdmQ7CisJCWVvZiA9IDA7CisJfQorCXhkcl9yZWFkX3BhZ2VzKHhkciwgY291bnQpOworCXJlcy0+ZW9mID0gZW9mOworCXJlcy0+Y291bnQgPSBjb3VudDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfcmVhZGRpcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgc3RydWN0IG5mczRfcmVhZGRpcl9yZXMgKnJlYWRkaXIpCit7CisJc3RydWN0IHhkcl9idWYJKnJjdmJ1ZiA9ICZyZXEtPnJxX3Jjdl9idWY7CisJc3RydWN0IHBhZ2UJKnBhZ2UgPSAqcmN2YnVmLT5wYWdlczsKKwlzdHJ1Y3Qga3ZlYwkqaW92ID0gcmN2YnVmLT5oZWFkOworCXVuc2lnbmVkIGludAluciwgcGdsZW4gPSByY3ZidWYtPnBhZ2VfbGVuOworCXVpbnQzMl90CSplbmQsICplbnRyeSwgKnAsICprYWRkcjsKKwl1aW50MzJfdAlsZW4sIGF0dHJsZW47CisJaW50IAkJaGRybGVuLCByZWN2ZCwgc3RhdHVzOworCisJc3RhdHVzID0gZGVjb2RlX29wX2hkcih4ZHIsIE9QX1JFQURESVIpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisJUkVBRF9CVUYoOCk7CisJQ09QWU1FTShyZWFkZGlyLT52ZXJpZmllci5kYXRhLCA4KTsKKworCWhkcmxlbiA9IChjaGFyICopIHAgLSAoY2hhciAqKSBpb3YtPmlvdl9iYXNlOworCXJlY3ZkID0gcmN2YnVmLT5sZW4gLSBoZHJsZW47CisJaWYgKHBnbGVuID4gcmVjdmQpCisJCXBnbGVuID0gcmVjdmQ7CisJeGRyX3JlYWRfcGFnZXMoeGRyLCBwZ2xlbik7CisKKwlCVUdfT04ocGdsZW4gKyByZWFkZGlyLT5wZ2Jhc2UgPiBQQUdFX0NBQ0hFX1NJWkUpOworCWthZGRyID0gcCA9ICh1aW50MzJfdCAqKSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJZW5kID0gKHVpbnQzMl90ICopICgoY2hhciAqKXAgKyBwZ2xlbiArIHJlYWRkaXItPnBnYmFzZSk7CisJZW50cnkgPSBwOworCWZvciAobnIgPSAwOyAqcCsrOyBucisrKSB7CisJCWlmIChwICsgMyA+IGVuZCkKKwkJCWdvdG8gc2hvcnRfcGt0OworCQlwICs9IDI7CQkJLyogY29va2llICovCisJCWxlbiA9IG50b2hsKCpwKyspOwkvKiBmaWxlbmFtZSBsZW5ndGggKi8KKwkJaWYgKGxlbiA+IE5GUzRfTUFYTkFNTEVOKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJORlM6IGdpYW50IGZpbGVuYW1lIGluIHJlYWRkaXIgKGxlbiAweCV4KVxuIiwgbGVuKTsKKwkJCWdvdG8gZXJyX3VubWFwOworCQl9CisJCXAgKz0gWERSX1FVQURMRU4obGVuKTsKKwkJaWYgKHAgKyAxID4gZW5kKQorCQkJZ290byBzaG9ydF9wa3Q7CisJCWxlbiA9IG50b2hsKCpwKyspOwkvKiBiaXRtYXAgbGVuZ3RoICovCisJCXAgKz0gbGVuOworCQlpZiAocCArIDEgPiBlbmQpCisJCQlnb3RvIHNob3J0X3BrdDsKKwkJYXR0cmxlbiA9IFhEUl9RVUFETEVOKG50b2hsKCpwKyspKTsKKwkJcCArPSBhdHRybGVuOwkJLyogYXR0cmlidXRlcyAqLworCQlpZiAocCArIDIgPiBlbmQpCisJCQlnb3RvIHNob3J0X3BrdDsKKwkJZW50cnkgPSBwOworCX0KKwlpZiAoIW5yICYmIChlbnRyeVswXSAhPSAwIHx8IGVudHJ5WzFdID09IDApKQorCQlnb3RvIHNob3J0X3BrdDsKK291dDoJCisJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCXJldHVybiAwOworc2hvcnRfcGt0OgorCWVudHJ5WzBdID0gZW50cnlbMV0gPSAwOworCS8qIHRydW5jYXRlIGxpc3RpbmcgPyAqLworCWlmICghbnIpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJORlM6IHJlYWRkaXIgcmVwbHkgdHJ1bmNhdGVkIVxuIik7CisJCWVudHJ5WzFdID0gMTsKKwl9CisJZ290byBvdXQ7CitlcnJfdW5tYXA6CisJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCXJldHVybiAtZXJybm9fTkZTRVJSX0lPOworfQorCitzdGF0aWMgaW50IGRlY29kZV9yZWFkbGluayhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgeGRyX2J1ZiAqcmN2YnVmID0gJnJlcS0+cnFfcmN2X2J1ZjsKKwlzdHJ1Y3Qga3ZlYyAqaW92ID0gcmN2YnVmLT5oZWFkOworCWludCBoZHJsZW4sIGxlbiwgcmVjdmQ7CisJdWludDMyX3QgKnA7CisJY2hhciAqa2FkZHI7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGRlY29kZV9vcF9oZHIoeGRyLCBPUF9SRUFETElOSyk7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKworCS8qIENvbnZlcnQgbGVuZ3RoIG9mIHN5bWxpbmsgKi8KKwlSRUFEX0JVRig0KTsKKwlSRUFEMzIobGVuKTsKKwlpZiAobGVuID49IHJjdmJ1Zi0+cGFnZV9sZW4gfHwgbGVuIDw9IDApIHsKKwkJZHByaW50ayhLRVJOX1dBUk5JTkcgIm5mczogc2VydmVyIHJldHVybmVkIGdpYW50IHN5bWxpbmshXG4iKTsKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisJfQorCWhkcmxlbiA9IChjaGFyICopIHhkci0+cCAtIChjaGFyICopIGlvdi0+aW92X2Jhc2U7CisJcmVjdmQgPSByZXEtPnJxX3Jjdl9idWYubGVuIC0gaGRybGVuOworCWlmIChyZWN2ZCA8IGxlbikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJORlM6IHNlcnZlciBjaGVhdGluZyBpbiByZWFkbGluayByZXBseTogIgorCQkJCSJjb3VudCAldSA+IHJlY3ZkICV1XG4iLCBsZW4sIHJlY3ZkKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXhkcl9yZWFkX3BhZ2VzKHhkciwgbGVuKTsKKwkvKgorCSAqIFRoZSBYRFIgZW5jb2RlIHJvdXRpbmUgaGFzIHNldCB0aGluZ3MgdXAgc28gdGhhdAorCSAqIHRoZSBsaW5rIHRleHQgd2lsbCBiZSBjb3BpZWQgZGlyZWN0bHkgaW50byB0aGUKKwkgKiBidWZmZXIuICBXZSBqdXN0IGhhdmUgdG8gZG8gb3ZlcmZsb3ctY2hlY2tpbmcsCisJICogYW5kIGFuZCBudWxsLXRlcm1pbmF0ZSB0aGUgdGV4dCAodGhlIFZGUyBleHBlY3RzCisJICogbnVsbC10ZXJtaW5hdGlvbikuCisJICovCisJa2FkZHIgPSAoY2hhciAqKWttYXBfYXRvbWljKHJjdmJ1Zi0+cGFnZXNbMF0sIEtNX1VTRVIwKTsKKwlrYWRkcltsZW4rcmN2YnVmLT5wYWdlX2Jhc2VdID0gJ1wwJzsKKwlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3JlbW92ZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzNF9jaGFuZ2VfaW5mbyAqY2luZm8pCit7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGRlY29kZV9vcF9oZHIoeGRyLCBPUF9SRU1PVkUpOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGRlY29kZV9jaGFuZ2VfaW5mbyh4ZHIsIGNpbmZvKTsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGRlY29kZV9yZW5hbWUoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mczRfY2hhbmdlX2luZm8gKm9sZF9jaW5mbywKKwkgICAgICBzdHJ1Y3QgbmZzNF9jaGFuZ2VfaW5mbyAqbmV3X2NpbmZvKQoreworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBkZWNvZGVfb3BfaGRyKHhkciwgT1BfUkVOQU1FKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9jaGFuZ2VfaW5mbyh4ZHIsIG9sZF9jaW5mbykpKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBkZWNvZGVfY2hhbmdlX2luZm8oeGRyLCBuZXdfY2luZm8pOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3JlbmV3KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIpCit7CisJcmV0dXJuIGRlY29kZV9vcF9oZHIoeGRyLCBPUF9SRU5FVyk7Cit9CisKK3N0YXRpYyBpbnQKK2RlY29kZV9zYXZlZmgoc3RydWN0IHhkcl9zdHJlYW0gKnhkcikKK3sKKwlyZXR1cm4gZGVjb2RlX29wX2hkcih4ZHIsIE9QX1NBVkVGSCk7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3NldGF0dHIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19zZXRhdHRycmVzICpyZXMpCit7CisJdWludDMyX3QgKnA7CisJdWludDMyX3QgYm1sZW47CisJaW50IHN0YXR1czsKKworICAgICAgICAKKwlzdGF0dXMgPSBkZWNvZGVfb3BfaGRyKHhkciwgT1BfU0VUQVRUUik7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKwlSRUFEX0JVRig0KTsKKwlSRUFEMzIoYm1sZW4pOworCVJFQURfQlVGKGJtbGVuIDw8IDIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9zZXRjbGllbnRpZChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCkKK3sKKwl1aW50MzJfdCAqcDsKKwl1aW50MzJfdCBvcG51bTsKKwlpbnQzMl90IG5mc2VycjsKKworCVJFQURfQlVGKDgpOworCVJFQUQzMihvcG51bSk7CisJaWYgKG9wbnVtICE9IE9QX1NFVENMSUVOVElEKSB7CisJCXByaW50ayhLRVJOX05PVElDRQorCQkJCSJuZnM0X2RlY29kZV9zZXRjbGllbnRpZDogU2VydmVyIHJldHVybmVkIG9wZXJhdGlvbiIKKwkJCSAgICAgICAJIiAlZFxuIiwgb3BudW0pOworCQlyZXR1cm4gLUVJTzsKKwl9CisJUkVBRDMyKG5mc2Vycik7CisJaWYgKG5mc2VyciA9PSBORlNfT0spIHsKKwkJUkVBRF9CVUYoOCArIHNpemVvZihjbHAtPmNsX2NvbmZpcm0uZGF0YSkpOworCQlSRUFENjQoY2xwLT5jbF9jbGllbnRpZCk7CisJCUNPUFlNRU0oY2xwLT5jbF9jb25maXJtLmRhdGEsIHNpemVvZihjbHAtPmNsX2NvbmZpcm0uZGF0YSkpOworCX0gZWxzZSBpZiAobmZzZXJyID09IE5GU0VSUl9DTElEX0lOVVNFKSB7CisJCXVpbnQzMl90IGxlbjsKKworCQkvKiBza2lwIG5ldGlkIHN0cmluZyAqLworCQlSRUFEX0JVRig0KTsKKwkJUkVBRDMyKGxlbik7CisJCVJFQURfQlVGKGxlbik7CisKKwkJLyogc2tpcCB1YWRkciBzdHJpbmcgKi8KKwkJUkVBRF9CVUYoNCk7CisJCVJFQUQzMihsZW4pOworCQlSRUFEX0JVRihsZW4pOworCQlyZXR1cm4gLU5GU0VSUl9DTElEX0lOVVNFOworCX0gZWxzZQorCQlyZXR1cm4gLW5mc19zdGF0X3RvX2Vycm5vKG5mc2Vycik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfc2V0Y2xpZW50aWRfY29uZmlybShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyKQoreworCXJldHVybiBkZWNvZGVfb3BfaGRyKHhkciwgT1BfU0VUQ0xJRU5USURfQ09ORklSTSk7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3dyaXRlKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfd3JpdGVyZXMgKnJlcykKK3sKKwl1aW50MzJfdCAqcDsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gZGVjb2RlX29wX2hkcih4ZHIsIE9QX1dSSVRFKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCisJUkVBRF9CVUYoMTYpOworCVJFQUQzMihyZXMtPmNvdW50KTsKKwlSRUFEMzIocmVzLT52ZXJmLT5jb21taXR0ZWQpOworCUNPUFlNRU0ocmVzLT52ZXJmLT52ZXJpZmllciwgOCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2RlbGVncmV0dXJuKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIpCit7CisJcmV0dXJuIGRlY29kZV9vcF9oZHIoeGRyLCBPUF9ERUxFR1JFVFVSTik7Cit9CisKKy8qCisgKiBEZWNvZGUgT1BFTl9ET1dOR1JBREUgcmVzcG9uc2UKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9kZWNfb3Blbl9kb3duZ3JhZGUoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfY2xvc2VyZXMgKnJlcykKK3sKKyAgICAgICAgc3RydWN0IHhkcl9zdHJlYW0geGRyOworICAgICAgICBzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKKyAgICAgICAgaW50IHN0YXR1czsKKworICAgICAgICB4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKKyAgICAgICAgc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKyAgICAgICAgaWYgKHN0YXR1cykKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpOworICAgICAgICBpZiAoc3RhdHVzKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICBzdGF0dXMgPSBkZWNvZGVfb3Blbl9kb3duZ3JhZGUoJnhkciwgcmVzKTsKK291dDoKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIEVORCBPRiAiR0VORVJJQyIgREVDT0RFIFJPVVRJTkVTLgorICovCisKKy8qCisgKiBEZWNvZGUgQUNDRVNTIHJlc3BvbnNlCisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2FjY2VzcyhzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mczRfYWNjZXNzcmVzICpyZXMpCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOworCWludCBzdGF0dXM7CisJCisJeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpKSAhPSAwKQorCQlnb3RvIG91dDsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKSkgPT0gMCkKKwkJc3RhdHVzID0gZGVjb2RlX2FjY2VzcygmeGRyLCByZXMpOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBEZWNvZGUgTE9PS1VQIHJlc3BvbnNlCisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2xvb2t1cChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mczRfbG9va3VwX3JlcyAqcmVzKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKKwlpbnQgc3RhdHVzOworCQorCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOworCWlmICgoc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKSkgIT0gMCkKKwkJZ290byBvdXQ7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcikpICE9IDApCisJCWdvdG8gb3V0OworCWlmICgoc3RhdHVzID0gZGVjb2RlX2xvb2t1cCgmeGRyKSkgIT0gMCkKKwkJZ290byBvdXQ7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfZ2V0ZmgoJnhkciwgcmVzLT5maCkpICE9IDApCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGRlY29kZV9nZXRmYXR0cigmeGRyLCByZXMtPmZhdHRyLCByZXMtPnNlcnZlcik7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIERlY29kZSBMT09LVVBfUk9PVCByZXNwb25zZQorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19sb29rdXBfcm9vdChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mczRfbG9va3VwX3JlcyAqcmVzKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKKwlpbnQgc3RhdHVzOworCQorCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOworCWlmICgoc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKSkgIT0gMCkKKwkJZ290byBvdXQ7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfcHV0cm9vdGZoKCZ4ZHIpKSAhPSAwKQorCQlnb3RvIG91dDsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9nZXRmaCgmeGRyLCByZXMtPmZoKSkgPT0gMCkKKwkJc3RhdHVzID0gZGVjb2RlX2dldGZhdHRyKCZ4ZHIsIHJlcy0+ZmF0dHIsIHJlcy0+c2VydmVyKTsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRGVjb2RlIFJFTU9WRSByZXNwb25zZQorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19yZW1vdmUoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnM0X2NoYW5nZV9pbmZvICpjaW5mbykKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CisJaW50IHN0YXR1czsKKwkKKwl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcikpICE9IDApCisJCWdvdG8gb3V0OworCWlmICgoc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpKSA9PSAwKQorCQlzdGF0dXMgPSBkZWNvZGVfcmVtb3ZlKCZ4ZHIsIGNpbmZvKTsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRGVjb2RlIFJFTkFNRSByZXNwb25zZQorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19yZW5hbWUoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnM0X3JlbmFtZV9yZXMgKnJlcykKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CisJaW50IHN0YXR1czsKKwkKKwl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcikpICE9IDApCisJCWdvdG8gb3V0OworCWlmICgoc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpKSAhPSAwKQorCQlnb3RvIG91dDsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9zYXZlZmgoJnhkcikpICE9IDApCisJCWdvdG8gb3V0OworCWlmICgoc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpKSAhPSAwKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBkZWNvZGVfcmVuYW1lKCZ4ZHIsICZyZXMtPm9sZF9jaW5mbywgJnJlcy0+bmV3X2NpbmZvKTsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRGVjb2RlIExJTksgcmVzcG9uc2UKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9kZWNfbGluayhzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mczRfY2hhbmdlX2luZm8gKmNpbmZvKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKKwlpbnQgc3RhdHVzOworCQorCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOworCWlmICgoc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKSkgIT0gMCkKKwkJZ290byBvdXQ7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcikpICE9IDApCisJCWdvdG8gb3V0OworCWlmICgoc3RhdHVzID0gZGVjb2RlX3NhdmVmaCgmeGRyKSkgIT0gMCkKKwkJZ290byBvdXQ7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcikpICE9IDApCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGRlY29kZV9saW5rKCZ4ZHIsIGNpbmZvKTsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRGVjb2RlIENSRUFURSByZXNwb25zZQorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19jcmVhdGUoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnM0X2NyZWF0ZV9yZXMgKnJlcykKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CisJaW50IHN0YXR1czsKKwkKKwl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcikpICE9IDApCisJCWdvdG8gb3V0OworCWlmICgoc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpKSAhPSAwKQorCQlnb3RvIG91dDsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9jcmVhdGUoJnhkciwmcmVzLT5kaXJfY2luZm8pKSAhPSAwKQorCQlnb3RvIG91dDsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9nZXRmaCgmeGRyLCByZXMtPmZoKSkgIT0gMCkKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZGVjb2RlX2dldGZhdHRyKCZ4ZHIsIHJlcy0+ZmF0dHIsIHJlcy0+c2VydmVyKTsKKwlpZiAoc3RhdHVzID09IE5GUzRFUlJfREVMQVkpCisJCXN0YXR1cyA9IDA7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIERlY29kZSBTWU1MSU5LIHJlc3BvbnNlCisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3N5bWxpbmsoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnM0X2NyZWF0ZV9yZXMgKnJlcykKK3sKKwlyZXR1cm4gbmZzNF94ZHJfZGVjX2NyZWF0ZShycXN0cCwgcCwgcmVzKTsKK30KKworLyoKKyAqIERlY29kZSBHRVRBVFRSIHJlc3BvbnNlCisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2dldGF0dHIoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnM0X2dldGF0dHJfcmVzICpyZXMpCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOworCWludCBzdGF0dXM7CisJCisJeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcik7CisJaWYgKHN0YXR1cykKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZGVjb2RlX2dldGZhdHRyKCZ4ZHIsIHJlcy0+ZmF0dHIsIHJlcy0+c2VydmVyKTsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworCit9CisKKworLyoKKyAqIERlY29kZSBDTE9TRSByZXNwb25zZQorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19jbG9zZShzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19jbG9zZXJlcyAqcmVzKQoreworICAgICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisgICAgICAgIHN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOworICAgICAgICBpbnQgc3RhdHVzOworCisgICAgICAgIHhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOworICAgICAgICBzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworICAgICAgICBpZiAoc3RhdHVzKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICBzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcik7CisgICAgICAgIGlmIChzdGF0dXMpCisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIHN0YXR1cyA9IGRlY29kZV9jbG9zZSgmeGRyLCByZXMpOworb3V0OgorICAgICAgICByZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRGVjb2RlIE9QRU4gcmVzcG9uc2UKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9kZWNfb3BlbihzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19vcGVucmVzICpyZXMpCit7CisgICAgICAgIHN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKyAgICAgICAgc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CisgICAgICAgIGludCBzdGF0dXM7CisKKyAgICAgICAgeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7CisgICAgICAgIHN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisgICAgICAgIGlmIChzdGF0dXMpCisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIHN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKKyAgICAgICAgaWYgKHN0YXR1cykKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgc3RhdHVzID0gZGVjb2RlX29wZW4oJnhkciwgcmVzKTsKKyAgICAgICAgaWYgKHN0YXR1cykKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKwlzdGF0dXMgPSBkZWNvZGVfZ2V0ZmgoJnhkciwgJnJlcy0+ZmgpOworICAgICAgICBpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBkZWNvZGVfZ2V0ZmF0dHIoJnhkciwgcmVzLT5mX2F0dHIsIHJlcy0+c2VydmVyKTsKKwlpZiAoc3RhdHVzID09IE5GUzRFUlJfREVMQVkpCisJCXN0YXR1cyA9IDA7CitvdXQ6CisgICAgICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBEZWNvZGUgT1BFTl9DT05GSVJNIHJlc3BvbnNlCisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX29wZW5fY29uZmlybShzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19vcGVuX2NvbmZpcm1yZXMgKnJlcykKK3sKKyAgICAgICAgc3RydWN0IHhkcl9zdHJlYW0geGRyOworICAgICAgICBzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKKyAgICAgICAgaW50IHN0YXR1czsKKworICAgICAgICB4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKKyAgICAgICAgc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKyAgICAgICAgaWYgKHN0YXR1cykKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpOworICAgICAgICBpZiAoc3RhdHVzKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICBzdGF0dXMgPSBkZWNvZGVfb3Blbl9jb25maXJtKCZ4ZHIsIHJlcyk7CitvdXQ6CisgICAgICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBEZWNvZGUgT1BFTiByZXNwb25zZQorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19vcGVuX25vYXR0cihzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19vcGVucmVzICpyZXMpCit7CisgICAgICAgIHN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKyAgICAgICAgc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CisgICAgICAgIGludCBzdGF0dXM7CisKKyAgICAgICAgeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7CisgICAgICAgIHN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisgICAgICAgIGlmIChzdGF0dXMpCisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIHN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKKyAgICAgICAgaWYgKHN0YXR1cykKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgc3RhdHVzID0gZGVjb2RlX29wZW4oJnhkciwgcmVzKTsKK291dDoKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIERlY29kZSBTRVRBVFRSIHJlc3BvbnNlCisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3NldGF0dHIoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfc2V0YXR0cnJlcyAqcmVzKQoreworICAgICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisgICAgICAgIHN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOworICAgICAgICBpbnQgc3RhdHVzOworCisgICAgICAgIHhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOworICAgICAgICBzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworICAgICAgICBpZiAoc3RhdHVzKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICBzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcik7CisgICAgICAgIGlmIChzdGF0dXMpCisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIHN0YXR1cyA9IGRlY29kZV9zZXRhdHRyKCZ4ZHIsIHJlcyk7CisgICAgICAgIGlmIChzdGF0dXMpCisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisJc3RhdHVzID0gZGVjb2RlX2dldGZhdHRyKCZ4ZHIsIHJlcy0+ZmF0dHIsIHJlcy0+c2VydmVyKTsKKwlpZiAoc3RhdHVzID09IE5GUzRFUlJfREVMQVkpCisJCXN0YXR1cyA9IDA7CitvdXQ6CisgICAgICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBEZWNvZGUgTE9DSyByZXNwb25zZQorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19sb2NrKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX2xvY2tyZXMgKnJlcykKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CisJaW50IHN0YXR1czsKKworCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJaWYgKHN0YXR1cykKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGRlY29kZV9sb2NrKCZ4ZHIsIHJlcyk7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIERlY29kZSBMT0NLVCByZXNwb25zZQorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19sb2NrdChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19sb2NrcmVzICpyZXMpCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOworCWludCBzdGF0dXM7CisKKwl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBkZWNvZGVfbG9ja3QoJnhkciwgcmVzKTsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRGVjb2RlIExPQ0tVIHJlc3BvbnNlCisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2xvY2t1KHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX2xvY2tyZXMgKnJlcykKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CisJaW50IHN0YXR1czsKKworCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJaWYgKHN0YXR1cykKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGRlY29kZV9sb2NrdSgmeGRyLCByZXMpOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBEZWNvZGUgUkVBRExJTksgcmVzcG9uc2UKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9kZWNfcmVhZGxpbmsoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHZvaWQgKnJlcykKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CisJaW50IHN0YXR1czsKKworCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJaWYgKHN0YXR1cykKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGRlY29kZV9yZWFkbGluaygmeGRyLCBycXN0cCk7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIERlY29kZSBSRUFERElSIHJlc3BvbnNlCisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3JlYWRkaXIoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnM0X3JlYWRkaXJfcmVzICpyZXMpCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOworCWludCBzdGF0dXM7CisKKwl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBkZWNvZGVfcmVhZGRpcigmeGRyLCBycXN0cCwgcmVzKTsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRGVjb2RlIFJlYWQgcmVzcG9uc2UKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9kZWNfcmVhZChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19yZWFkcmVzICpyZXMpCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOworCWludCBzdGF0dXM7CisKKwl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBkZWNvZGVfcmVhZCgmeGRyLCBycXN0cCwgcmVzKTsKKwlpZiAoIXN0YXR1cykKKwkJc3RhdHVzID0gcmVzLT5jb3VudDsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRGVjb2RlIFdSSVRFIHJlc3BvbnNlCisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3dyaXRlKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX3dyaXRlcmVzICpyZXMpCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOworCWludCBzdGF0dXM7CisKKwl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBkZWNvZGVfd3JpdGUoJnhkciwgcmVzKTsKKwlpZiAoIXN0YXR1cykKKwkJc3RhdHVzID0gcmVzLT5jb3VudDsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRGVjb2RlIENPTU1JVCByZXNwb25zZQorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19jb21taXQoc3RydWN0IHJwY19ycXN0ICpycXN0cCwgdWludDMyX3QgKnAsIHN0cnVjdCBuZnNfd3JpdGVyZXMgKnJlcykKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CisJaW50IHN0YXR1czsKKworCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcnFzdHAtPnJxX3Jjdl9idWYsIHApOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJaWYgKHN0YXR1cykKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IGRlY29kZV9jb21taXQoJnhkciwgcmVzKTsKK291dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRlNJTkZPIHJlcXVlc3QKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9kZWNfZnNpbmZvKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19mc2luZm8gKmZzaW5mbykKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJc3RydWN0IGNvbXBvdW5kX2hkciBoZHI7CisJaW50IHN0YXR1czsKKworCXhkcl9pbml0X2RlY29kZSgmeGRyLCAmcmVxLT5ycV9yY3ZfYnVmLCBwKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCWlmICghc3RhdHVzKQorCQlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcik7CisJaWYgKCFzdGF0dXMpCisJCXN0YXR1cyA9IGRlY29kZV9mc2luZm8oJnhkciwgZnNpbmZvKTsKKwlpZiAoIXN0YXR1cykKKwkJc3RhdHVzID0gLW5mc19zdGF0X3RvX2Vycm5vKGhkci5zdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBQQVRIQ09ORiByZXF1ZXN0CisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3BhdGhjb25mKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mc19wYXRoY29uZiAqcGF0aGNvbmYpCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOworCWludCBzdGF0dXM7CisKKwl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJlcS0+cnFfcmN2X2J1ZiwgcCk7CisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlpZiAoIXN0YXR1cykKKwkJc3RhdHVzID0gZGVjb2RlX3B1dGZoKCZ4ZHIpOworCWlmICghc3RhdHVzKQorCQlzdGF0dXMgPSBkZWNvZGVfcGF0aGNvbmYoJnhkciwgcGF0aGNvbmYpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBTVEFURlMgcmVxdWVzdAorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19zdGF0ZnMoc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX2Zzc3RhdCAqZnNzdGF0KQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKKwlpbnQgc3RhdHVzOworCisJeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZyZXEtPnJxX3Jjdl9idWYsIHApOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJaWYgKCFzdGF0dXMpCisJCXN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKTsKKwlpZiAoIXN0YXR1cykKKwkJc3RhdHVzID0gZGVjb2RlX3N0YXRmcygmeGRyLCBmc3N0YXQpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBHRVRBVFRSX0JJVE1BUCByZXF1ZXN0CisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3NlcnZlcl9jYXBzKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1aW50MzJfdCAqcCwgc3RydWN0IG5mczRfc2VydmVyX2NhcHNfcmVzICpyZXMpCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOworCWludCBzdGF0dXM7CisKKwl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJlcS0+cnFfcmN2X2J1ZiwgcCk7CisJaWYgKChzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpKSAhPSAwKQorCQlnb3RvIG91dDsKKwlpZiAoKHN0YXR1cyA9IGRlY29kZV9wdXRmaCgmeGRyKSkgIT0gMCkKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZGVjb2RlX3NlcnZlcl9jYXBzKCZ4ZHIsIHJlcyk7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIERlY29kZSBSRU5FVyByZXNwb25zZQorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19yZW5ldyhzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgdm9pZCAqZHVtbXkpCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOworCWludCBzdGF0dXM7CisKKwl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCWlmICghc3RhdHVzKQorCQlzdGF0dXMgPSBkZWNvZGVfcmVuZXcoJnhkcik7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIGEgU0VUQ0xJRU5USUQgcmVxdWVzdAorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19zZXRjbGllbnRpZChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdWludDMyX3QgKnAsCisJCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKKwlpbnQgc3RhdHVzOworCisJeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZyZXEtPnJxX3Jjdl9idWYsIHApOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJaWYgKCFzdGF0dXMpCisJCXN0YXR1cyA9IGRlY29kZV9zZXRjbGllbnRpZCgmeGRyLCBjbHApOworCWlmICghc3RhdHVzKQorCQlzdGF0dXMgPSAtbmZzX3N0YXRfdG9fZXJybm8oaGRyLnN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIGEgU0VUQ0xJRU5USURfQ09ORklSTSByZXF1ZXN0CisgKi8KK3N0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX3NldGNsaWVudGlkX2NvbmZpcm0oc3RydWN0IHJwY19ycXN0ICpyZXEsIHVpbnQzMl90ICpwLCBzdHJ1Y3QgbmZzX2ZzaW5mbyAqZnNpbmZvKQoreworCXN0cnVjdCB4ZHJfc3RyZWFtIHhkcjsKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKKwlpbnQgc3RhdHVzOworCisJeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZyZXEtPnJxX3Jjdl9idWYsIHApOworCXN0YXR1cyA9IGRlY29kZV9jb21wb3VuZF9oZHIoJnhkciwgJmhkcik7CisJaWYgKCFzdGF0dXMpCisJCXN0YXR1cyA9IGRlY29kZV9zZXRjbGllbnRpZF9jb25maXJtKCZ4ZHIpOworCWlmICghc3RhdHVzKQorCQlzdGF0dXMgPSBkZWNvZGVfcHV0cm9vdGZoKCZ4ZHIpOworCWlmICghc3RhdHVzKQorCQlzdGF0dXMgPSBkZWNvZGVfZnNpbmZvKCZ4ZHIsIGZzaW5mbyk7CisJaWYgKCFzdGF0dXMpCisJCXN0YXR1cyA9IC1uZnNfc3RhdF90b19lcnJubyhoZHIuc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogREVMRUdSRVRVUk4gcmVxdWVzdAorICovCitzdGF0aWMgaW50IG5mczRfeGRyX2RlY19kZWxlZ3JldHVybihzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLCB1aW50MzJfdCAqcCwgdm9pZCAqZHVtbXkpCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBjb21wb3VuZF9oZHIgaGRyOworCWludCBzdGF0dXM7CisKKwl4ZHJfaW5pdF9kZWNvZGUoJnhkciwgJnJxc3RwLT5ycV9yY3ZfYnVmLCBwKTsKKwlzdGF0dXMgPSBkZWNvZGVfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCWlmIChzdGF0dXMgPT0gMCkgeworCQlzdGF0dXMgPSBkZWNvZGVfcHV0ZmgoJnhkcik7CisJCWlmIChzdGF0dXMgPT0gMCkKKwkJCXN0YXR1cyA9IGRlY29kZV9kZWxlZ3JldHVybigmeGRyKTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKwordWludDMyX3QgKm5mczRfZGVjb2RlX2RpcmVudCh1aW50MzJfdCAqcCwgc3RydWN0IG5mc19lbnRyeSAqZW50cnksIGludCBwbHVzKQoreworCXVpbnQzMl90IGJpdG1hcFsyXSA9IHswfTsKKwl1aW50MzJfdCBsZW47CisKKwlpZiAoISpwKyspIHsKKwkJaWYgKCEqcCkKKwkJCXJldHVybiBFUlJfUFRSKC1FQUdBSU4pOworCQllbnRyeS0+ZW9mID0gMTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVCQURDT09LSUUpOworCX0KKworCWVudHJ5LT5wcmV2X2Nvb2tpZSA9IGVudHJ5LT5jb29raWU7CisJcCA9IHhkcl9kZWNvZGVfaHlwZXIocCwgJmVudHJ5LT5jb29raWUpOworCWVudHJ5LT5sZW4gPSBudG9obCgqcCsrKTsKKwllbnRyeS0+bmFtZSA9IChjb25zdCBjaGFyICopIHA7CisJcCArPSBYRFJfUVVBRExFTihlbnRyeS0+bGVuKTsKKworCS8qCisJICogSW4gY2FzZSB0aGUgc2VydmVyIGRvZXNuJ3QgcmV0dXJuIGFuIGlub2RlIG51bWJlciwKKwkgKiB3ZSBmYWtlIG9uZSBoZXJlLiAgKFdlIGRvbid0IHVzZSBpbm9kZSBudW1iZXIgMCwKKwkgKiBzaW5jZSBnbGliYyBzZWVtcyB0byBjaG9rZSBvbiBpdC4uLikKKwkgKi8KKwllbnRyeS0+aW5vID0gMTsKKworCWxlbiA9IG50b2hsKCpwKyspOwkJLyogYml0bWFwIGxlbmd0aCAqLworCWlmIChsZW4tLSA+IDApIHsKKwkJYml0bWFwWzBdID0gbnRvaGwoKnArKyk7CisJCWlmIChsZW4tLSA+IDApIHsKKwkJCWJpdG1hcFsxXSA9IG50b2hsKCpwKyspOworCQkJcCArPSBsZW47CisJCX0KKwl9CisJbGVuID0gWERSX1FVQURMRU4obnRvaGwoKnArKykpOwkvKiBhdHRyaWJ1dGUgYnVmZmVyIGxlbmd0aCAqLworCWlmIChsZW4gPiAwKSB7CisJCWlmIChiaXRtYXBbMF0gPT0gMCAmJiBiaXRtYXBbMV0gPT0gRkFUVFI0X1dPUkQxX01PVU5URURfT05fRklMRUlEKQorCQkJeGRyX2RlY29kZV9oeXBlcihwLCAmZW50cnktPmlubyk7CisJCWVsc2UgaWYgKGJpdG1hcFswXSA9PSBGQVRUUjRfV09SRDBfRklMRUlEKQorCQkJeGRyX2RlY29kZV9oeXBlcihwLCAmZW50cnktPmlubyk7CisJCXAgKz0gbGVuOworCX0KKworCWVudHJ5LT5lb2YgPSAhcFswXSAmJiBwWzFdOworCXJldHVybiBwOworfQorCisvKgorICogV2UgbmVlZCB0byB0cmFuc2xhdGUgYmV0d2VlbiBuZnMgc3RhdHVzIHJldHVybiB2YWx1ZXMgYW5kCisgKiB0aGUgbG9jYWwgZXJybm8gdmFsdWVzIHdoaWNoIG1heSBub3QgYmUgdGhlIHNhbWUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgeworCWludCBzdGF0OworCWludCBlcnJubzsKK30gbmZzX2VycnRibFtdID0geworCXsgTkZTNF9PSywJCTAJCX0sCisJeyBORlM0RVJSX1BFUk0sCQlFUEVSTQkJfSwKKwl7IE5GUzRFUlJfTk9FTlQsCUVOT0VOVAkJfSwKKwl7IE5GUzRFUlJfSU8sCQllcnJub19ORlNFUlJfSU8JfSwKKwl7IE5GUzRFUlJfTlhJTywJCUVOWElPCQl9LAorCXsgTkZTNEVSUl9BQ0NFU1MsCUVBQ0NFUwkJfSwKKwl7IE5GUzRFUlJfRVhJU1QsCUVFWElTVAkJfSwKKwl7IE5GUzRFUlJfWERFViwJCUVYREVWCQl9LAorCXsgTkZTNEVSUl9OT1RESVIsCUVOT1RESVIJCX0sCisJeyBORlM0RVJSX0lTRElSLAlFSVNESVIJCX0sCisJeyBORlM0RVJSX0lOVkFMLAlFSU5WQUwJCX0sCisJeyBORlM0RVJSX0ZCSUcsCQlFRkJJRwkJfSwKKwl7IE5GUzRFUlJfTk9TUEMsCUVOT1NQQwkJfSwKKwl7IE5GUzRFUlJfUk9GUywJCUVST0ZTCQl9LAorCXsgTkZTNEVSUl9NTElOSywJRU1MSU5LCQl9LAorCXsgTkZTNEVSUl9OQU1FVE9PTE9ORywJRU5BTUVUT09MT05HCX0sCisJeyBORlM0RVJSX05PVEVNUFRZLAlFTk9URU1QVFkJfSwKKwl7IE5GUzRFUlJfRFFVT1QsCUVEUVVPVAkJfSwKKwl7IE5GUzRFUlJfU1RBTEUsCUVTVEFMRQkJfSwKKwl7IE5GUzRFUlJfQkFESEFORExFLAlFQkFESEFORExFCX0sCisJeyBORlM0RVJSX0JBRF9DT09LSUUsCUVCQURDT09LSUUJfSwKKwl7IE5GUzRFUlJfTk9UU1VQUCwJRU5PVFNVUFAJfSwKKwl7IE5GUzRFUlJfVE9PU01BTEwsCUVUT09TTUFMTAl9LAorCXsgTkZTNEVSUl9TRVJWRVJGQVVMVCwJRVNFUlZFUkZBVUxUCX0sCisJeyBORlM0RVJSX0JBRFRZUEUsCUVCQURUWVBFCX0sCisJeyBORlM0RVJSX0xPQ0tFRCwJRUFHQUlOCQl9LAorCXsgTkZTNEVSUl9SRVNPVVJDRSwJRVJFTU9URUlPCX0sCisJeyBORlM0RVJSX1NZTUxJTkssCUVMT09QCQl9LAorCXsgTkZTNEVSUl9PUF9JTExFR0FMLAlFT1BOT1RTVVBQCX0sCisJeyBORlM0RVJSX0RFQURMT0NLLAlFREVBRExLCQl9LAorCXsgTkZTNEVSUl9XUk9OR1NFQywJRVBFUk0JCX0sIC8qIEZJWE1FOiB0aGlzIG5lZWRzCisJCQkJCQkgICAgKiB0byBiZSBoYW5kbGVkIGJ5IGEKKwkJCQkJCSAgICAqIG1pZGRsZS1sYXllci4KKwkJCQkJCSAgICAqLworCXsgLTEsCQkJRUlPCQl9Cit9OworCisvKgorICogQ29udmVydCBhbiBORlMgZXJyb3IgY29kZSB0byBhIGxvY2FsIG9uZS4KKyAqIFRoaXMgb25lIGlzIHVzZWQgam9pbnRseSBieSBORlN2MiBhbmQgTkZTdjMuCisgKi8KK3N0YXRpYyBpbnQKK25mc19zdGF0X3RvX2Vycm5vKGludCBzdGF0KQoreworCWludCBpOworCWZvciAoaSA9IDA7IG5mc19lcnJ0YmxbaV0uc3RhdCAhPSAtMTsgaSsrKSB7CisJCWlmIChuZnNfZXJydGJsW2ldLnN0YXQgPT0gc3RhdCkKKwkJCXJldHVybiBuZnNfZXJydGJsW2ldLmVycm5vOworCX0KKwlpZiAoc3RhdCA8PSAxMDAwMCB8fCBzdGF0ID4gMTAxMDApIHsKKwkJLyogVGhlIHNlcnZlciBpcyBsb29uZXkgdHVuZXMuICovCisJCXJldHVybiBFU0VSVkVSRkFVTFQ7CisJfQorCS8qIElmIHdlIGNhbm5vdCB0cmFuc2xhdGUgdGhlIGVycm9yLCB0aGUgcmVjb3Zlcnkgcm91dGluZXMgc2hvdWxkCisJICogaGFuZGxlIGl0LgorCSAqIE5vdGU6IHJlbWFpbmluZyBORlN2NCBlcnJvciBjb2RlcyBoYXZlIHZhbHVlcyA+IDEwMDAwLCBzbyBzaG91bGQKKwkgKiBub3QgY29uZmxpY3Qgd2l0aCBuYXRpdmUgTGludXggZXJyb3IgY29kZXMuCisJICovCisJcmV0dXJuIHN0YXQ7Cit9CisKKyNpZm5kZWYgTUFYCisjIGRlZmluZSBNQVgoYSwgYikJKCgoYSkgPiAoYikpPyAoYSkgOiAoYikpCisjZW5kaWYKKworI2RlZmluZSBQUk9DKHByb2MsIGFyZ3R5cGUsIHJlc3R5cGUpCQkJCVwKK1tORlNQUk9DNF9DTE5UXyMjcHJvY10gPSB7CQkJCQlcCisJLnBfcHJvYyAgID0gTkZTUFJPQzRfQ09NUE9VTkQsCQkJCVwKKwkucF9lbmNvZGUgPSAoa3hkcnByb2NfdCkgbmZzNF94ZHJfIyNhcmd0eXBlLAkJXAorCS5wX2RlY29kZSA9IChreGRycHJvY190KSBuZnM0X3hkcl8jI3Jlc3R5cGUsCQlcCisJLnBfYnVmc2l6ID0gTUFYKE5GUzRfIyNhcmd0eXBlIyNfc3osTkZTNF8jI3Jlc3R5cGUjI19zeikgPDwgMiwJXAorICAgIH0KKworc3RydWN0IHJwY19wcm9jaW5mbwluZnM0X3Byb2NlZHVyZXNbXSA9IHsKKyAgUFJPQyhSRUFELAkJZW5jX3JlYWQsCWRlY19yZWFkKSwKKyAgUFJPQyhXUklURSwJCWVuY193cml0ZSwJZGVjX3dyaXRlKSwKKyAgUFJPQyhDT01NSVQsCQllbmNfY29tbWl0LAlkZWNfY29tbWl0KSwKKyAgUFJPQyhPUEVOLAkJZW5jX29wZW4sCWRlY19vcGVuKSwKKyAgUFJPQyhPUEVOX0NPTkZJUk0sCWVuY19vcGVuX2NvbmZpcm0sCWRlY19vcGVuX2NvbmZpcm0pLAorICBQUk9DKE9QRU5fTk9BVFRSLAllbmNfb3Blbl9ub2F0dHIsCWRlY19vcGVuX25vYXR0ciksCisgIFBST0MoT1BFTl9ET1dOR1JBREUsCWVuY19vcGVuX2Rvd25ncmFkZSwJZGVjX29wZW5fZG93bmdyYWRlKSwKKyAgUFJPQyhDTE9TRSwJCWVuY19jbG9zZSwJZGVjX2Nsb3NlKSwKKyAgUFJPQyhTRVRBVFRSLAkJZW5jX3NldGF0dHIsCWRlY19zZXRhdHRyKSwKKyAgUFJPQyhGU0lORk8sCQllbmNfZnNpbmZvLAlkZWNfZnNpbmZvKSwKKyAgUFJPQyhSRU5FVywJCWVuY19yZW5ldywJZGVjX3JlbmV3KSwKKyAgUFJPQyhTRVRDTElFTlRJRCwJZW5jX3NldGNsaWVudGlkLAlkZWNfc2V0Y2xpZW50aWQpLAorICBQUk9DKFNFVENMSUVOVElEX0NPTkZJUk0sCWVuY19zZXRjbGllbnRpZF9jb25maXJtLAlkZWNfc2V0Y2xpZW50aWRfY29uZmlybSksCisgIFBST0MoTE9DSywgICAgICAgICAgICBlbmNfbG9jaywgICAgICAgZGVjX2xvY2spLAorICBQUk9DKExPQ0tULCAgICAgICAgICAgZW5jX2xvY2t0LCAgICAgIGRlY19sb2NrdCksCisgIFBST0MoTE9DS1UsICAgICAgICAgICBlbmNfbG9ja3UsICAgICAgZGVjX2xvY2t1KSwKKyAgUFJPQyhBQ0NFU1MsCQllbmNfYWNjZXNzLAlkZWNfYWNjZXNzKSwKKyAgUFJPQyhHRVRBVFRSLAkJZW5jX2dldGF0dHIsCWRlY19nZXRhdHRyKSwKKyAgUFJPQyhMT09LVVAsCQllbmNfbG9va3VwLAlkZWNfbG9va3VwKSwKKyAgUFJPQyhMT09LVVBfUk9PVCwJZW5jX2xvb2t1cF9yb290LAlkZWNfbG9va3VwX3Jvb3QpLAorICBQUk9DKFJFTU9WRSwJCWVuY19yZW1vdmUsCWRlY19yZW1vdmUpLAorICBQUk9DKFJFTkFNRSwJCWVuY19yZW5hbWUsCWRlY19yZW5hbWUpLAorICBQUk9DKExJTkssCQllbmNfbGluaywJZGVjX2xpbmspLAorICBQUk9DKFNZTUxJTkssCQllbmNfc3ltbGluaywJZGVjX3N5bWxpbmspLAorICBQUk9DKENSRUFURSwJCWVuY19jcmVhdGUsCWRlY19jcmVhdGUpLAorICBQUk9DKFBBVEhDT05GLAllbmNfcGF0aGNvbmYsCWRlY19wYXRoY29uZiksCisgIFBST0MoU1RBVEZTLAkJZW5jX3N0YXRmcywJZGVjX3N0YXRmcyksCisgIFBST0MoUkVBRExJTkssCWVuY19yZWFkbGluaywJZGVjX3JlYWRsaW5rKSwKKyAgUFJPQyhSRUFERElSLAkJZW5jX3JlYWRkaXIsCWRlY19yZWFkZGlyKSwKKyAgUFJPQyhTRVJWRVJfQ0FQUywJZW5jX3NlcnZlcl9jYXBzLCBkZWNfc2VydmVyX2NhcHMpLAorICBQUk9DKERFTEVHUkVUVVJOLAllbmNfZGVsZWdyZXR1cm4sIGRlY19kZWxlZ3JldHVybiksCit9OworCitzdHJ1Y3QgcnBjX3ZlcnNpb24JCW5mc192ZXJzaW9uNCA9IHsKKwkubnVtYmVyCQkJPSA0LAorCS5ucnByb2NzCQk9IHNpemVvZihuZnM0X3Byb2NlZHVyZXMpL3NpemVvZihuZnM0X3Byb2NlZHVyZXNbMF0pLAorCS5wcm9jcwkJCT0gbmZzNF9wcm9jZWR1cmVzCit9OworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnNyb290LmMgYi9mcy9uZnMvbmZzcm9vdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNWJjNTkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnMvbmZzcm9vdC5jCkBAIC0wLDAgKzEsNTEzIEBACisvKgorICogICRJZDogbmZzcm9vdC5jLHYgMS40NSAxOTk4LzAzLzA3IDEwOjQ0OjQ2IG1qIEV4cCAkCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiAgR2VybyBLdWhsbWFubiA8Z2Vyb0Bna21pbml4Lmhhbi5kZT4KKyAqCisgKiAgQWxsb3cgYW4gTkZTIGZpbGVzeXN0ZW0gdG8gYmUgbW91bnRlZCBhcyByb290LiBUaGUgd2F5IHRoaXMgd29ya3MgaXM6CisgKiAgICAgKDEpIFVzZSB0aGUgSVAgYXV0b2NvbmZpZyBtZWNoYW5pc20gdG8gc2V0IGxvY2FsIElQIGFkZHJlc3NlcyBhbmQgcm91dGVzLgorICogICAgICgyKSBIYW5kbGUgUlBDIG5lZ290aWF0aW9uIHdpdGggdGhlIHN5c3RlbSB3aGljaCByZXBsaWVkIHRvIFJBUlAgb3IKKyAqICAgICAgICAgd2FzIHJlcG9ydGVkIGFzIGEgYm9vdCBzZXJ2ZXIgYnkgQk9PVFAgb3IgbWFudWFsbHkuCisgKiAgICAgKDMpIFRoZSBhY3R1YWwgbW91bnRpbmcgaXMgZG9uZSBsYXRlciwgd2hlbiBpbml0KCkgaXMgcnVubmluZy4KKyAqCisgKgorICoJQ2hhbmdlczoKKyAqCisgKglBbGFuIENveAk6CVJlbW92ZWQgZ2V0X2FkZHJlc3MgbmFtZSBjbGFzaCB3aXRoIEZQVS4KKyAqCUFsYW4gQ294CToJUmVmb3JtYXR0ZWQgYSBiaXQuCisgKglHZXJvIEt1aGxtYW5uCToJQ29kZSBjbGVhbnVwCisgKglNaWNoYWVsIFJhdXNjaCAgOglGaXhlZCByZWNvZ25pdGlvbiBvZiBhbiBpbmNvbWluZyBSQVJQIGFuc3dlci4KKyAqCU1hcnRpbiBNYXJlcwk6ICgyLjApCUF1dG8tY29uZmlndXJhdGlvbiB2aWEgQk9PVFAgc3VwcG9ydGVkLgorICoJTWFydGluIE1hcmVzCToJTWFudWFsIHNlbGVjdGlvbiBvZiBpbnRlcmZhY2UgJiBCT09UUC9SQVJQLgorICoJTWFydGluIE1hcmVzCToJVXNpbmcgbmV0d29yayByb3V0ZXMgaW5zdGVhZCBvZiBob3N0IHJvdXRlcywKKyAqCQkJCWFsbG93aW5nIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gdG8gYmUgdXNlZAorICoJCQkJZm9yIG5vcm1hbCBvcGVyYXRpb24gb2YgdGhlIGhvc3QuCisgKglNYXJ0aW4gTWFyZXMJOglSYW5kb21pemVkIHRpbWVyIHdpdGggZXhwb25lbnRpYWwgYmFja29mZgorICoJCQkJaW5zdGFsbGVkIHRvIG1pbmltaXplIG5ldHdvcmsgY29uZ2VzdGlvbi4KKyAqCU1hcnRpbiBNYXJlcwk6CUNvZGUgY2xlYW51cC4KKyAqCU1hcnRpbiBNYXJlcwk6ICgyLjEpCUJPT1RQIGFuZCBSQVJQIG1hZGUgY29uZmlndXJhdGlvbiBvcHRpb25zLgorICoJTWFydGluIE1hcmVzCToJU2VydmVyIGhvc3RuYW1lIGdlbmVyYXRpb24gZml4ZWQuCisgKglHZXJkIEtub3JyCToJRml4ZWQgd2lyZWQgaW5vZGUgaGFuZGxpbmcKKyAqCU1hcnRpbiBNYXJlcwk6ICgyLjIpCSIwLjAuMC4wIiBhZGRyZXNzZXMgZnJvbSBjb21tYW5kIGxpbmUgaWdub3JlZC4KKyAqCU1hcnRpbiBNYXJlcwk6CVJBUlAgcmVwbGllcyBub3QgdGVzdGVkIGZvciBzZXJ2ZXIgYWRkcmVzcy4KKyAqCUdlcm8gS3VobG1hbm4JOiAoMi4zKSBTb21lIGJ1ZyBmaXhlcyBhbmQgY29kZSBjbGVhbnVwIGFnYWluIChwbGVhc2UKKyAqCQkJCXNlbmQgbWUgeW91ciBuZXcgcGF0Y2hlcyBfYmVmb3JlXyBib3RoZXJpbmcKKyAqCQkJCUxpbnVzIHNvIHRoYXQgSSBkb24nIGFsd2F5cyBoYXZlIHRvIGNsZWFudXAKKyAqCQkJCV9hZnRlcndhcmRzXyAtIHRoYW5rcykKKyAqCUdlcm8gS3VobG1hbm4JOglMYXN0IGNoYW5nZXMgb2YgTWFydGluIE1hcmVzIHVuZG9uZS4KKyAqCUdlcm8gS3VobG1hbm4JOiAJUkFSUCByZXBsaWVzIGFyZSB0ZXN0ZWQgZm9yIHNwZWNpZmllZCBzZXJ2ZXIKKyAqCQkJCWFnYWluLiBIb3dldmVyLCBpdCdzIG5vdyBwb3NzaWJsZSB0byBoYXZlCisgKgkJCQlkaWZmZXJlbnQgUkFSUCBhbmQgTkZTIHNlcnZlcnMuCisgKglHZXJvIEt1aGxtYW5uCToJIjAuMC4wLjAiIGFkZHJlc3NlcyBmcm9tIGNvbW1hbmQgbGluZSBhcmUKKyAqCQkJCW5vdyBtYXBwZWQgdG8gSU5BRERSX05PTkUuCisgKglHZXJvIEt1aGxtYW5uCToJRml4ZWQgYSBidWcgd2hpY2ggcHJldmVudGVkIEJPT1RQIHBhdGggbmFtZQorICoJCQkJZnJvbSBiZWluZyB1c2VkICh0aGFua3MgdG8gTGVvIFNwaWVrbWFuKQorICoJQW5keSBXYWxrZXIJOglBbGxvdyB0byBzcGVjaWZ5IHRoZSBORlMgc2VydmVyIGluIG5mc19yb290CisgKgkJCQl3aXRob3V0IGdpdmluZyBhIHBhdGggbmFtZQorICoJU3dlbiBUaPxtbWxlcgk6CUFsbG93IHRvIHNwZWNpZnkgdGhlIE5GUyBvcHRpb25zIGluIG5mc19yb290CisgKgkJCQl3aXRob3V0IGdpdmluZyBhIHBhdGggbmFtZS4gRml4IEJPT1RQIHJlcXVlc3QKKyAqCQkJCWZvciBkb21haW5uYW1lIChkb21haW5uYW1lIGlzIE5JUyBkb21haW4sIG5vdAorICoJCQkJRE5TIGRvbWFpbiEpLiBTa2lwIGR1bW15IGRldmljZXMgZm9yIEJPT1RQLgorICoJSmFjZWsgWmFwYWxhCToJRml4ZWQgYSBidWcgd2hpY2ggcHJldmVudGVkIHNlcnZlci1pcCBhZGRyZXNzCisgKgkJCQlmcm9tIG5mc3Jvb3QgcGFyYW1ldGVyIGZyb20gYmVpbmcgdXNlZC4KKyAqCU9sYWYgS2lyY2gJOglBZGFwdGVkIHRvIG5ldyBORlMgY29kZS4KKyAqCUpha3ViIEplbGluZWsJOglGcmVlIHVzZWQgY29kZSBzZWdtZW50LgorICoJTWFya28gS29odGFsYQk6CUZpeGVkIHNvbWUgYnVncy4KKyAqCU1hcnRpbiBNYXJlcwk6CURlYnVnIG1lc3NhZ2UgY2xlYW51cAorICoJTWFydGluIE1hcmVzCToJQ2hhbmdlZCB0byB1c2UgdGhlIG5ldyBnZW5lcmljIElQIGxheWVyIGF1dG9jb25maWcKKyAqCQkJCWNvZGUuIEJPT1RQIGFuZCBSQVJQIG1vdmVkIHRoZXJlLgorICoJTWFydGluIE1hcmVzCToJRGVmYXVsdCBwYXRoIG5vdyBjb250YWlucyBob3N0IG5hbWUgaW5zdGVhZCBvZgorICoJCQkJaG9zdCBJUCBhZGRyZXNzIChidXQgaG9zdCBuYW1lIGRlZmF1bHRzIHRvIElQCisgKgkJCQlhZGRyZXNzIGFueXdheSkuCisgKglNYXJ0aW4gTWFyZXMJOglVc2Ugcm9vdF9zZXJ2ZXJfYWRkciBhcHByb3ByaWF0ZWx5IGR1cmluZyBzZXR1cC4KKyAqCU1hcnRpbiBNYXJlcwk6CVJld3JvdGUgcGFyYW1ldGVyIHBhcnNpbmcsIG5vdyBob3BlZnVsbHkgZ2l2aW5nCisgKgkJCQljb3JyZWN0IG92ZXJyaWRpbmcuCisgKglUcm9uZCBNeWtsZWJ1c3QgOglBZGQgaW4gcHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgTkZTdjMgYW5kIFRDUC4KKyAqCQkJCUZpeCBidWcgaW4gcm9vdF9uZnNfYWRkcigpLiBuZnNfZGF0YS5uYW1sZW4KKyAqCQkJCWlzIE5PVCBmb3IgdGhlIGxlbmd0aCBvZiB0aGUgaG9zdG5hbWUuCisgKglIdWEgUWluCQk6CVN1cHBvcnQgZm9yIG1vdW50aW5nIHJvb3QgZmlsZSBzeXN0ZW0gdmlhCisgKgkJCQlORlMgb3ZlciBUQ1AuCisgKglGYWJpYW4gRnJlZGVyaWNrOglPcHRpb24gcGFyc2VyIHJlYnVpbHQgKHVzaW5nIHBhcnNlciBsaWIpCisqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9yb290X2Rldi5oPgorI2luY2x1ZGUgPG5ldC9pcGNvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgorCisvKiBEZWZpbmUgdGhpcyB0byBhbGxvdyBkZWJ1Z2dpbmcgb3V0cHV0ICovCisjdW5kZWYgTkZTUk9PVF9ERUJVRworI2RlZmluZSBORlNEQkdfRkFDSUxJVFkgTkZTREJHX1JPT1QKKworLyogRGVmYXVsdCBwYXRoIHdlIHRyeSB0byBtb3VudC4gIiVzIiBnZXRzIHJlcGxhY2VkIGJ5IG91ciBJUCBhZGRyZXNzICovCisjZGVmaW5lIE5GU19ST09UCQkiL3RmdHBib290LyVzIgorCisvKiBQYXJhbWV0ZXJzIHBhc3NlZCBmcm9tIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lICovCitzdGF0aWMgY2hhciBuZnNfcm9vdF9uYW1lWzI1Nl0gX19pbml0ZGF0YSA9ICIiOworCisvKiBBZGRyZXNzIG9mIE5GUyBzZXJ2ZXIgKi8KK3N0YXRpYyBfX3UzMiBzZXJ2YWRkciBfX2luaXRkYXRhID0gMDsKKworLyogTmFtZSBvZiBkaXJlY3RvcnkgdG8gbW91bnQgKi8KK3N0YXRpYyBjaGFyIG5mc19wYXRoW05GU19NQVhQQVRITEVOXSBfX2luaXRkYXRhID0geyAwLCB9OworCisvKiBORlMtcmVsYXRlZCBkYXRhICovCitzdGF0aWMgc3RydWN0IG5mc19tb3VudF9kYXRhIG5mc19kYXRhIF9faW5pdGRhdGEgPSB7IDAsIH07LyogTkZTIG1vdW50IGluZm8gKi8KK3N0YXRpYyBpbnQgbmZzX3BvcnQgX19pbml0ZGF0YSA9IDA7CQkvKiBQb3J0IHRvIGNvbm5lY3QgdG8gZm9yIE5GUyAqLworc3RhdGljIGludCBtb3VudF9wb3J0IF9faW5pdGRhdGEgPSAwOwkJLyogTW91bnQgZGFlbW9uIHBvcnQgbnVtYmVyICovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJCQkgICAgIFBhcnNpbmcgb2Ygb3B0aW9ucworCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitlbnVtIHsKKwkvKiBPcHRpb25zIHRoYXQgdGFrZSBpbnRlZ2VyIGFyZ3VtZW50cyAqLworCU9wdF9wb3J0LCBPcHRfcnNpemUsIE9wdF93c2l6ZSwgT3B0X3RpbWVvLCBPcHRfcmV0cmFucywgT3B0X2FjcmVnbWluLAorCU9wdF9hY3JlZ21heCwgT3B0X2FjZGlybWluLCBPcHRfYWNkaXJtYXgsCisJLyogT3B0aW9ucyB0aGF0IHRha2Ugbm8gYXJndW1lbnRzICovCisJT3B0X3NvZnQsIE9wdF9oYXJkLCBPcHRfaW50ciwKKwlPcHRfbm9pbnRyLCBPcHRfcG9zaXgsIE9wdF9ub3Bvc2l4LCBPcHRfY3RvLCBPcHRfbm9jdG8sIE9wdF9hYywgCisJT3B0X25vYWMsIE9wdF9sb2NrLCBPcHRfbm9sb2NrLCBPcHRfdjIsIE9wdF92MywgT3B0X3VkcCwgT3B0X3RjcCwKKwkvKiBFcnJvciB0b2tlbiAqLworCU9wdF9lcnIKK307CisKK3N0YXRpYyBtYXRjaF90YWJsZV90IF9faW5pdGRhdGEgdG9rZW5zID0geworCXtPcHRfcG9ydCwgInBvcnQ9JXUifSwKKwl7T3B0X3JzaXplLCAicnNpemU9JXUifSwKKwl7T3B0X3dzaXplLCAid3NpemU9JXUifSwKKwl7T3B0X3RpbWVvLCAidGltZW89JXUifSwKKwl7T3B0X3JldHJhbnMsICJyZXRyYW5zPSV1In0sCisJe09wdF9hY3JlZ21pbiwgImFjcmVnbWluPSV1In0sCisJe09wdF9hY3JlZ21heCwgImFjcmVnbWF4PSV1In0sCisJe09wdF9hY2Rpcm1pbiwgImFjZGlybWluPSV1In0sCisJe09wdF9hY2Rpcm1heCwgImFjZGlybWF4PSV1In0sCisJe09wdF9zb2Z0LCAic29mdCJ9LAorCXtPcHRfaGFyZCwgImhhcmQifSwKKwl7T3B0X2ludHIsICJpbnRyIn0sCisJe09wdF9ub2ludHIsICJub2ludHIifSwKKwl7T3B0X3Bvc2l4LCAicG9zaXgifSwKKwl7T3B0X25vcG9zaXgsICJub3Bvc2l4In0sCisJe09wdF9jdG8sICJjdG8ifSwKKwl7T3B0X25vY3RvLCAibm9jdG8ifSwKKwl7T3B0X2FjLCAiYWMifSwKKwl7T3B0X25vYWMsICJub2FjIn0sCisJe09wdF9sb2NrLCAibG9jayJ9LAorCXtPcHRfbm9sb2NrLCAibm9sb2NrIn0sCisJe09wdF92MiwgIm5mc3ZlcnM9MiJ9LAorCXtPcHRfdjIsICJ2MiJ9LAorCXtPcHRfdjMsICJuZnN2ZXJzPTMifSwKKwl7T3B0X3YzLCAidjMifSwKKwl7T3B0X3VkcCwgInByb3RvPXVkcCJ9LAorCXtPcHRfdWRwLCAidWRwIn0sCisJe09wdF90Y3AsICJwcm90bz10Y3AifSwKKwl7T3B0X3RjcCwgInRjcCJ9LAorCXtPcHRfZXJyLCBOVUxMfQorCQorfTsKKworLyoKKyAqICBQYXJzZSBvcHRpb24gc3RyaW5nLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IHJvb3RfbmZzX3BhcnNlKGNoYXIgKm5hbWUsIGNoYXIgKmJ1ZikKK3sKKworCWNoYXIgKnA7CisJc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOworCWludCBvcHRpb247CisKKwlpZiAoIW5hbWUpCisJCXJldHVybiAxOworCisJLyogU2V0IHRoZSBORlMgcmVtb3RlIHBhdGggKi8KKwlwID0gc3Ryc2VwKCZuYW1lLCAiLCIpOworCWlmIChwWzBdICE9ICdcMCcgJiYgc3RyY21wKHAsICJkZWZhdWx0IikgIT0gMCkKKwkJc3RybGNweShidWYsIHAsIE5GU19NQVhQQVRITEVOKTsKKworCXdoaWxlICgocCA9IHN0cnNlcCAoJm5hbWUsICIsIikpICE9IE5VTEwpIHsKKwkJaW50IHRva2VuOyAKKwkJaWYgKCEqcCkKKwkJCWNvbnRpbnVlOworCQl0b2tlbiA9IG1hdGNoX3Rva2VuKHAsIHRva2VucywgYXJncyk7CisKKwkJLyogJXUgdG9rZW5zIG9ubHkuIEJld2FyZSBpZiB5b3UgYWRkIG5ldyB0b2tlbnMhICovCisJCWlmICh0b2tlbiA8IE9wdF9zb2Z0ICYmIG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpCisJCQlyZXR1cm4gMDsKKwkJc3dpdGNoICh0b2tlbikgeworCQkJY2FzZSBPcHRfcG9ydDoKKwkJCQluZnNfcG9ydCA9IG9wdGlvbjsKKwkJCQlicmVhazsKKwkJCWNhc2UgT3B0X3JzaXplOgorCQkJCW5mc19kYXRhLnJzaXplID0gb3B0aW9uOworCQkJCWJyZWFrOworCQkJY2FzZSBPcHRfd3NpemU6CisJCQkJbmZzX2RhdGEud3NpemUgPSBvcHRpb247CisJCQkJYnJlYWs7CisJCQljYXNlIE9wdF90aW1lbzoKKwkJCQluZnNfZGF0YS50aW1lbyA9IG9wdGlvbjsKKwkJCQlicmVhazsKKwkJCWNhc2UgT3B0X3JldHJhbnM6CisJCQkJbmZzX2RhdGEucmV0cmFucyA9IG9wdGlvbjsKKwkJCQlicmVhazsKKwkJCWNhc2UgT3B0X2FjcmVnbWluOgorCQkJCW5mc19kYXRhLmFjcmVnbWluID0gb3B0aW9uOworCQkJCWJyZWFrOworCQkJY2FzZSBPcHRfYWNyZWdtYXg6CisJCQkJbmZzX2RhdGEuYWNyZWdtYXggPSBvcHRpb247CisJCQkJYnJlYWs7CisJCQljYXNlIE9wdF9hY2Rpcm1pbjoKKwkJCQluZnNfZGF0YS5hY2Rpcm1pbiA9IG9wdGlvbjsKKwkJCQlicmVhazsKKwkJCWNhc2UgT3B0X2FjZGlybWF4OgorCQkJCW5mc19kYXRhLmFjZGlybWF4ID0gb3B0aW9uOworCQkJCWJyZWFrOworCQkJY2FzZSBPcHRfc29mdDoKKwkJCQluZnNfZGF0YS5mbGFncyB8PSBORlNfTU9VTlRfU09GVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgT3B0X2hhcmQ6CisJCQkJbmZzX2RhdGEuZmxhZ3MgJj0gfk5GU19NT1VOVF9TT0ZUOworCQkJCWJyZWFrOworCQkJY2FzZSBPcHRfaW50cjoKKwkJCQluZnNfZGF0YS5mbGFncyB8PSBORlNfTU9VTlRfSU5UUjsKKwkJCQlicmVhazsKKwkJCWNhc2UgT3B0X25vaW50cjoKKwkJCQluZnNfZGF0YS5mbGFncyAmPSB+TkZTX01PVU5UX0lOVFI7CisJCQkJYnJlYWs7CisJCQljYXNlIE9wdF9wb3NpeDoKKwkJCQluZnNfZGF0YS5mbGFncyB8PSBORlNfTU9VTlRfUE9TSVg7CisJCQkJYnJlYWs7CisJCQljYXNlIE9wdF9ub3Bvc2l4OgorCQkJCW5mc19kYXRhLmZsYWdzICY9IH5ORlNfTU9VTlRfUE9TSVg7CisJCQkJYnJlYWs7CisJCQljYXNlIE9wdF9jdG86CisJCQkJbmZzX2RhdGEuZmxhZ3MgJj0gfk5GU19NT1VOVF9OT0NUTzsKKwkJCQlicmVhazsKKwkJCWNhc2UgT3B0X25vY3RvOgorCQkJCW5mc19kYXRhLmZsYWdzIHw9IE5GU19NT1VOVF9OT0NUTzsKKwkJCQlicmVhazsKKwkJCWNhc2UgT3B0X2FjOgorCQkJCW5mc19kYXRhLmZsYWdzICY9IH5ORlNfTU9VTlRfTk9BQzsKKwkJCQlicmVhazsKKwkJCWNhc2UgT3B0X25vYWM6CisJCQkJbmZzX2RhdGEuZmxhZ3MgfD0gTkZTX01PVU5UX05PQUM7CisJCQkJYnJlYWs7CisJCQljYXNlIE9wdF9sb2NrOgorCQkJCW5mc19kYXRhLmZsYWdzICY9IH5ORlNfTU9VTlRfTk9OTE07CisJCQkJYnJlYWs7CisJCQljYXNlIE9wdF9ub2xvY2s6CisJCQkJbmZzX2RhdGEuZmxhZ3MgfD0gTkZTX01PVU5UX05PTkxNOworCQkJCWJyZWFrOworCQkJY2FzZSBPcHRfdjI6CisJCQkJbmZzX2RhdGEuZmxhZ3MgJj0gfk5GU19NT1VOVF9WRVIzOworCQkJCWJyZWFrOworCQkJY2FzZSBPcHRfdjM6CisJCQkJbmZzX2RhdGEuZmxhZ3MgfD0gTkZTX01PVU5UX1ZFUjM7CisJCQkJYnJlYWs7CisJCQljYXNlIE9wdF91ZHA6CisJCQkJbmZzX2RhdGEuZmxhZ3MgJj0gfk5GU19NT1VOVF9UQ1A7CisJCQkJYnJlYWs7CisJCQljYXNlIE9wdF90Y3A6CisJCQkJbmZzX2RhdGEuZmxhZ3MgfD0gTkZTX01PVU5UX1RDUDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQgOiAKKwkJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAxOworfQorCisvKgorICogIFByZXBhcmUgdGhlIE5GUyBkYXRhIHN0cnVjdHVyZSBhbmQgcGFyc2UgYWxsIG9wdGlvbnMuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHJvb3RfbmZzX25hbWUoY2hhciAqbmFtZSkKK3sKKwlzdGF0aWMgY2hhciBidWZbTkZTX01BWFBBVEhMRU5dIF9faW5pdGRhdGE7CisJY2hhciAqY3A7CisKKwkvKiBTZXQgc29tZSBkZWZhdWx0IHZhbHVlcyAqLworCW1lbXNldCgmbmZzX2RhdGEsIDAsIHNpemVvZihuZnNfZGF0YSkpOworCW5mc19wb3J0ICAgICAgICAgID0gLTE7CisJbmZzX2RhdGEudmVyc2lvbiAgPSBORlNfTU9VTlRfVkVSU0lPTjsKKwluZnNfZGF0YS5mbGFncyAgICA9IE5GU19NT1VOVF9OT05MTTsJLyogTm8gbG9ja2QgaW4gbmZzIHJvb3QgeWV0ICovCisJbmZzX2RhdGEucnNpemUgICAgPSBORlNfREVGX0ZJTEVfSU9fQlVGRkVSX1NJWkU7CisJbmZzX2RhdGEud3NpemUgICAgPSBORlNfREVGX0ZJTEVfSU9fQlVGRkVSX1NJWkU7CisJbmZzX2RhdGEuYWNyZWdtaW4gPSAzOworCW5mc19kYXRhLmFjcmVnbWF4ID0gNjA7CisJbmZzX2RhdGEuYWNkaXJtaW4gPSAzMDsKKwluZnNfZGF0YS5hY2Rpcm1heCA9IDYwOworCXN0cmNweShidWYsIE5GU19ST09UKTsKKworCS8qIFByb2Nlc3Mgb3B0aW9ucyByZWNlaXZlZCBmcm9tIHRoZSByZW1vdGUgc2VydmVyICovCisJcm9vdF9uZnNfcGFyc2Uocm9vdF9zZXJ2ZXJfcGF0aCwgYnVmKTsKKworCS8qIE92ZXJyaWRlIHRoZW0gYnkgb3B0aW9ucyBzZXQgb24ga2VybmVsIGNvbW1hbmQtbGluZSAqLworCXJvb3RfbmZzX3BhcnNlKG5hbWUsIGJ1Zik7CisKKwljcCA9IHN5c3RlbV91dHNuYW1lLm5vZGVuYW1lOworCWlmIChzdHJsZW4oYnVmKSArIHN0cmxlbihjcCkgPiBORlNfTUFYUEFUSExFTikgeworCQlwcmludGsoS0VSTl9FUlIgIlJvb3QtTkZTOiBQYXRobmFtZSBmb3IgcmVtb3RlIGRpcmVjdG9yeSB0b28gbG9uZy5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXNwcmludGYobmZzX3BhdGgsIGJ1ZiwgY3ApOworCisJcmV0dXJuIDE7Cit9CisKKworLyoKKyAqICBHZXQgTkZTIHNlcnZlciBhZGRyZXNzLgorICovCitzdGF0aWMgaW50IF9faW5pdCByb290X25mc19hZGRyKHZvaWQpCit7CisJaWYgKChzZXJ2YWRkciA9IHJvb3Rfc2VydmVyX2FkZHIpID09IElOQUREUl9OT05FKSB7CisJCXByaW50ayhLRVJOX0VSUiAiUm9vdC1ORlM6IE5vIE5GUyBzZXJ2ZXIgYXZhaWxhYmxlLCBnaXZpbmcgdXAuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXNucHJpbnRmKG5mc19kYXRhLmhvc3RuYW1lLCBzaXplb2YobmZzX2RhdGEuaG9zdG5hbWUpLAorCQkgIiV1LiV1LiV1LiV1IiwgTklQUVVBRChzZXJ2YWRkcikpOworCXJldHVybiAwOworfQorCisvKgorICogIFRlbGwgdGhlIHVzZXIgd2hhdCdzIGdvaW5nIG9uLgorICovCisjaWZkZWYgTkZTUk9PVF9ERUJVRworc3RhdGljIHZvaWQgX19pbml0IHJvb3RfbmZzX3ByaW50KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fTk9USUNFICJSb290LU5GUzogTW91bnRpbmcgJXMgb24gc2VydmVyICVzIGFzIHJvb3RcbiIsCisJCW5mc19wYXRoLCBuZnNfZGF0YS5ob3N0bmFtZSk7CisJcHJpbnRrKEtFUk5fTk9USUNFICJSb290LU5GUzogICAgIHJzaXplID0gJWQsIHdzaXplID0gJWQsIHRpbWVvID0gJWQsIHJldHJhbnMgPSAlZFxuIiwKKwkJbmZzX2RhdGEucnNpemUsIG5mc19kYXRhLndzaXplLCBuZnNfZGF0YS50aW1lbywgbmZzX2RhdGEucmV0cmFucyk7CisJcHJpbnRrKEtFUk5fTk9USUNFICJSb290LU5GUzogICAgIGFjcmVnIChtaW4sbWF4KSA9ICglZCwlZCksIGFjZGlyIChtaW4sbWF4KSA9ICglZCwlZClcbiIsCisJCW5mc19kYXRhLmFjcmVnbWluLCBuZnNfZGF0YS5hY3JlZ21heCwKKwkJbmZzX2RhdGEuYWNkaXJtaW4sIG5mc19kYXRhLmFjZGlybWF4KTsKKwlwcmludGsoS0VSTl9OT1RJQ0UgIlJvb3QtTkZTOiAgICAgbmZzZCBwb3J0ID0gJWQsIG1vdW50ZCBwb3J0ID0gJWQsIGZsYWdzID0gJTA4eFxuIiwKKwkJbmZzX3BvcnQsIG1vdW50X3BvcnQsIG5mc19kYXRhLmZsYWdzKTsKK30KKyNlbmRpZgorCisKK3N0YXRpYyBpbnQgX19pbml0IHJvb3RfbmZzX2luaXQodm9pZCkKK3sKKyNpZmRlZiBORlNST09UX0RFQlVHCisJbmZzX2RlYnVnIHw9IE5GU0RCR19ST09UOworI2VuZGlmCisKKwkvKgorCSAqIERlY29kZSB0aGUgcm9vdCBkaXJlY3RvcnkgcGF0aCBuYW1lIGFuZCBORlMgb3B0aW9ucyBmcm9tCisJICogdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUuIFRoaXMgaGFzIHRvIGdvIGhlcmUgaW4gb3JkZXIgdG8KKwkgKiBiZSBhYmxlIHRvIHVzZSB0aGUgY2xpZW50IElQIGFkZHJlc3MgZm9yIHRoZSByZW1vdGUgcm9vdAorCSAqIGRpcmVjdG9yeSAobmVjZXNzYXJ5IGZvciBwdXJlIFJBUlAgYm9vdGluZykuCisJICovCisJaWYgKHJvb3RfbmZzX25hbWUobmZzX3Jvb3RfbmFtZSkgPCAwIHx8CisJICAgIHJvb3RfbmZzX2FkZHIoKSA8IDApCisJCXJldHVybiAtMTsKKworI2lmZGVmIE5GU1JPT1RfREVCVUcKKwlyb290X25mc19wcmludCgpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogIFBhcnNlIE5GUyBzZXJ2ZXIgYW5kIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiBwYXNzZWQgb24gdGhlIGtlcm5lbAorICogIGNvbW1hbmQgbGluZS4KKyAqLworc3RhdGljIGludCBfX2luaXQgbmZzX3Jvb3Rfc2V0dXAoY2hhciAqbGluZSkKK3sKKwlST09UX0RFViA9IFJvb3RfTkZTOworCWlmIChsaW5lWzBdID09ICcvJyB8fCBsaW5lWzBdID09ICcsJyB8fCAobGluZVswXSA+PSAnMCcgJiYgbGluZVswXSA8PSAnOScpKSB7CisJCXN0cmxjcHkobmZzX3Jvb3RfbmFtZSwgbGluZSwgc2l6ZW9mKG5mc19yb290X25hbWUpKTsKKwl9IGVsc2UgeworCQlpbnQgbiA9IHN0cmxlbihsaW5lKSArIHNpemVvZihORlNfUk9PVCkgLSAxOworCQlpZiAobiA+PSBzaXplb2YobmZzX3Jvb3RfbmFtZSkpCisJCQlsaW5lW3NpemVvZihuZnNfcm9vdF9uYW1lKSAtIHNpemVvZihORlNfUk9PVCkgLSAyXSA9ICdcMCc7CisJCXNwcmludGYobmZzX3Jvb3RfbmFtZSwgTkZTX1JPT1QsIGxpbmUpOworCX0KKwlyb290X3NlcnZlcl9hZGRyID0gcm9vdF9uZnNfcGFyc2VfYWRkcihuZnNfcm9vdF9uYW1lKTsKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgibmZzcm9vdD0iLCBuZnNfcm9vdF9zZXR1cCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCSAgICAgICBSb3V0aW5lcyB0byBhY3R1YWxseSBtb3VudCB0aGUgcm9vdCBkaXJlY3RvcnkKKworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqICBDb25zdHJ1Y3Qgc29ja2FkZHJfaW4gZnJvbSBhZGRyZXNzIGFuZCBwb3J0IG51bWJlci4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitzZXRfc29ja2FkZHIoc3RydWN0IHNvY2thZGRyX2luICpzaW4sIF9fdTMyIGFkZHIsIF9fdTE2IHBvcnQpCit7CisJc2luLT5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlzaW4tPnNpbl9hZGRyLnNfYWRkciA9IGFkZHI7CisJc2luLT5zaW5fcG9ydCA9IHBvcnQ7Cit9CisKKy8qCisgKiAgUXVlcnkgc2VydmVyIHBvcnRtYXBwZXIgZm9yIHRoZSBwb3J0IG9mIGEgZGFlbW9uIHByb2dyYW0uCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHJvb3RfbmZzX2dldHBvcnQoaW50IHByb2dyYW0sIGludCB2ZXJzaW9uLCBpbnQgcHJvdG8pCit7CisJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKKworCXByaW50ayhLRVJOX05PVElDRSAiTG9va2luZyB1cCBwb3J0IG9mIFJQQyAlZC8lZCBvbiAldS4ldS4ldS4ldVxuIiwKKwkJcHJvZ3JhbSwgdmVyc2lvbiwgTklQUVVBRChzZXJ2YWRkcikpOworCXNldF9zb2NrYWRkcigmc2luLCBzZXJ2YWRkciwgMCk7CisJcmV0dXJuIHJwY19nZXRwb3J0X2V4dGVybmFsKCZzaW4sIHByb2dyYW0sIHZlcnNpb24sIHByb3RvKTsKK30KKworCisvKgorICogIFVzZSBwb3J0bWFwcGVyIHRvIGZpbmQgbW91bnRkIGFuZCBuZnNkIHBvcnQgbnVtYmVycyBpZiBub3Qgb3ZlcnJpZGVuCisgKiAgYnkgdGhlIHVzZXIuIFVzZSBkZWZhdWx0cyBpZiBwb3J0bWFwcGVyIGlzIG5vdCBhdmFpbGFibGUuCisgKiAgWFhYOiBJcyB0aGVyZSBhbnkgbmZzIHNlcnZlciB3aXRoIG5vIHBvcnRtYXBwZXI/CisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHJvb3RfbmZzX3BvcnRzKHZvaWQpCit7CisJaW50IHBvcnQ7CisJaW50IG5mc2RfdmVyLCBtb3VudGRfdmVyOworCWludCBuZnNkX3BvcnQsIG1vdW50ZF9wb3J0OworCWludCBwcm90bzsKKworCWlmIChuZnNfZGF0YS5mbGFncyAmIE5GU19NT1VOVF9WRVIzKSB7CisJCW5mc2RfdmVyID0gTkZTM19WRVJTSU9OOworCQltb3VudGRfdmVyID0gTkZTX01OVDNfVkVSU0lPTjsKKwkJbmZzZF9wb3J0ID0gTkZTX1BPUlQ7CisJCW1vdW50ZF9wb3J0ID0gTkZTX01OVF9QT1JUOworCX0gZWxzZSB7CisJCW5mc2RfdmVyID0gTkZTMl9WRVJTSU9OOworCQltb3VudGRfdmVyID0gTkZTX01OVF9WRVJTSU9OOworCQluZnNkX3BvcnQgPSBORlNfUE9SVDsKKwkJbW91bnRkX3BvcnQgPSBORlNfTU5UX1BPUlQ7CisJfQorCisJcHJvdG8gPSAobmZzX2RhdGEuZmxhZ3MgJiBORlNfTU9VTlRfVENQKSA/IElQUFJPVE9fVENQIDogSVBQUk9UT19VRFA7CisKKwlpZiAobmZzX3BvcnQgPCAwKSB7CisJCWlmICgocG9ydCA9IHJvb3RfbmZzX2dldHBvcnQoTkZTX1BST0dSQU0sIG5mc2RfdmVyLCBwcm90bykpIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJSb290LU5GUzogVW5hYmxlIHRvIGdldCBuZnNkIHBvcnQgIgorCQkJCQkibnVtYmVyIGZyb20gc2VydmVyLCB1c2luZyBkZWZhdWx0XG4iKTsKKwkJCXBvcnQgPSBuZnNkX3BvcnQ7CisJCX0KKwkJbmZzX3BvcnQgPSBodG9ucyhwb3J0KTsKKwkJZHByaW50aygiUm9vdC1ORlM6IFBvcnRtYXBwZXIgb24gc2VydmVyIHJldHVybmVkICVkICIKKwkJCSJhcyBuZnNkIHBvcnRcbiIsIHBvcnQpOworCX0KKworCWlmICgocG9ydCA9IHJvb3RfbmZzX2dldHBvcnQoTkZTX01OVF9QUk9HUkFNLCBtb3VudGRfdmVyLCBwcm90bykpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIlJvb3QtTkZTOiBVbmFibGUgdG8gZ2V0IG1vdW50ZCBwb3J0ICIKKwkJCQkibnVtYmVyIGZyb20gc2VydmVyLCB1c2luZyBkZWZhdWx0XG4iKTsKKwkJcG9ydCA9IG1vdW50ZF9wb3J0OworCX0KKwltb3VudF9wb3J0ID0gaHRvbnMocG9ydCk7CisJZHByaW50aygiUm9vdC1ORlM6IG1vdW50ZCBwb3J0IGlzICVkXG4iLCBwb3J0KTsKKworCXJldHVybiAwOworfQorCisKKy8qCisgKiAgR2V0IGEgZmlsZSBoYW5kbGUgZnJvbSB0aGUgc2VydmVyIGZvciB0aGUgZGlyZWN0b3J5IHdoaWNoIGlzIHRvIGJlCisgKiAgbW91bnRlZC4KKyAqLworc3RhdGljIGludCBfX2luaXQgcm9vdF9uZnNfZ2V0X2hhbmRsZSh2b2lkKQoreworCXN0cnVjdCBuZnNfZmggZmg7CisJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKKwlpbnQgc3RhdHVzOworCWludCBwcm90b2NvbCA9IChuZnNfZGF0YS5mbGFncyAmIE5GU19NT1VOVF9UQ1ApID8KKwkJCQkJSVBQUk9UT19UQ1AgOiBJUFBST1RPX1VEUDsKKwlpbnQgdmVyc2lvbiA9IChuZnNfZGF0YS5mbGFncyAmIE5GU19NT1VOVF9WRVIzKSA/CisJCQkJCU5GU19NTlQzX1ZFUlNJT04gOiBORlNfTU5UX1ZFUlNJT047CisKKwlzZXRfc29ja2FkZHIoJnNpbiwgc2VydmFkZHIsIG1vdW50X3BvcnQpOworCXN0YXR1cyA9IG5mc3Jvb3RfbW91bnQoJnNpbiwgbmZzX3BhdGgsICZmaCwgdmVyc2lvbiwgcHJvdG9jb2wpOworCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgIlJvb3QtTkZTOiBTZXJ2ZXIgcmV0dXJuZWQgZXJyb3IgJWQgIgorCQkJCSJ3aGlsZSBtb3VudGluZyAlc1xuIiwgc3RhdHVzLCBuZnNfcGF0aCk7CisJZWxzZSB7CisJCW5mc19kYXRhLnJvb3Quc2l6ZSA9IGZoLnNpemU7CisJCW1lbWNweShuZnNfZGF0YS5yb290LmRhdGEsIGZoLmRhdGEsIGZoLnNpemUpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiAgR2V0IHRoZSBORlMgcG9ydCBudW1iZXJzIGFuZCBmaWxlIGhhbmRsZSwgYW5kIHJldHVybiB0aGUgcHJlcGFyZWQgJ2RhdGEnCisgKiAgYXJndW1lbnQgZm9yIG1vdW50KCkgaWYgZXZlcnl0aGluZyB3ZW50IE9LLiBSZXR1cm4gTlVMTCBvdGhlcndpc2UuCisgKi8KK3ZvaWQgKiBfX2luaXQgbmZzX3Jvb3RfZGF0YSh2b2lkKQoreworCWlmIChyb290X25mc19pbml0KCkgPCAwCisJIHx8IHJvb3RfbmZzX3BvcnRzKCkgPCAwCisJIHx8IHJvb3RfbmZzX2dldF9oYW5kbGUoKSA8IDApCisJCXJldHVybiBOVUxMOworCXNldF9zb2NrYWRkcigoc3RydWN0IHNvY2thZGRyX2luICopICZuZnNfZGF0YS5hZGRyLCBzZXJ2YWRkciwgbmZzX3BvcnQpOworCXJldHVybiAodm9pZCopJm5mc19kYXRhOworfQpkaWZmIC0tZ2l0IGEvZnMvbmZzL3BhZ2VsaXN0LmMgYi9mcy9uZnMvcGFnZWxpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjFiYTcyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzL3BhZ2VsaXN0LmMKQEAgLTAsMCArMSwzMDkgQEAKKy8qCisgKiBsaW51eC9mcy9uZnMvcGFnZWxpc3QuYworICoKKyAqIEEgc2V0IG9mIGhlbHBlciBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIE5GUyByZWFkIGFuZCB3cml0ZSByZXF1ZXN0cy4KKyAqIFRoZSBtYWluIHB1cnBvc2Ugb2YgdGhlc2Ugcm91dGluZXMgaXMgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciB0aGUKKyAqIGNvYWxlc2Npbmcgb2Ygc2V2ZXJhbCByZXF1ZXN0cyBpbnRvIGEgc2luZ2xlIFJQQyBjYWxsLgorICoKKyAqIENvcHlyaWdodCAyMDAwLCAyMDAxIChjKSBUcm9uZCBNeWtsZWJ1c3QgPHRyb25kLm15a2xlYnVzdEBmeXMudWlvLm5vPgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L25mczMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnM0Lmg+CisjaW5jbHVkZSA8bGludXgvbmZzX3BhZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfbW91bnQuaD4KKworI2RlZmluZSBORlNfUEFSQU5PSUEgMQorCitzdGF0aWMga21lbV9jYWNoZV90ICpuZnNfcGFnZV9jYWNoZXA7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5mc19wYWdlICoKK25mc19wYWdlX2FsbG9jKHZvaWQpCit7CisJc3RydWN0IG5mc19wYWdlCSpwOworCXAgPSBrbWVtX2NhY2hlX2FsbG9jKG5mc19wYWdlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCWlmIChwKSB7CisJCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKKwkJSU5JVF9MSVNUX0hFQUQoJnAtPndiX2xpc3QpOworCX0KKwlyZXR1cm4gcDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCituZnNfcGFnZV9mcmVlKHN0cnVjdCBuZnNfcGFnZSAqcCkKK3sKKwlrbWVtX2NhY2hlX2ZyZWUobmZzX3BhZ2VfY2FjaGVwLCBwKTsKK30KKworLyoqCisgKiBuZnNfY3JlYXRlX3JlcXVlc3QgLSBDcmVhdGUgYW4gTkZTIHJlYWQvd3JpdGUgcmVxdWVzdC4KKyAqIEBmaWxlOiBmaWxlIGRlc2NyaXB0b3IgdG8gdXNlCisgKiBAaW5vZGU6IGlub2RlIHRvIHdoaWNoIHRoZSByZXF1ZXN0IGlzIGF0dGFjaGVkCisgKiBAcGFnZTogcGFnZSB0byB3cml0ZQorICogQG9mZnNldDogc3RhcnRpbmcgb2Zmc2V0IHdpdGhpbiB0aGUgcGFnZSBmb3IgdGhlIHdyaXRlCisgKiBAY291bnQ6IG51bWJlciBvZiBieXRlcyB0byByZWFkL3dyaXRlCisgKgorICogVGhlIHBhZ2UgbXVzdCBiZSBsb2NrZWQgYnkgdGhlIGNhbGxlci4gVGhpcyBtYWtlcyBzdXJlIHdlIG5ldmVyCisgKiBjcmVhdGUgdHdvIGRpZmZlcmVudCByZXF1ZXN0cyBmb3IgdGhlIHNhbWUgcGFnZSwgYW5kIGF2b2lkcworICogYSBwb3NzaWJsZSBkZWFkbG9jayB3aGVuIHdlIHJlYWNoIHRoZSBoYXJkIGxpbWl0IG9uIHRoZSBudW1iZXIKKyAqIG9mIGRpcnR5IHBhZ2VzLgorICogVXNlciBzaG91bGQgZW5zdXJlIGl0IGlzIHNhZmUgdG8gc2xlZXAgaW4gdGhpcyBmdW5jdGlvbi4KKyAqLworc3RydWN0IG5mc19wYWdlICoKK25mc19jcmVhdGVfcmVxdWVzdChzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4LCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkgICBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJICAgdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IGNvdW50KQoreworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0VSVkVSKGlub2RlKTsKKwlzdHJ1Y3QgbmZzX3BhZ2UJCSpyZXE7CisKKwkvKiBEZWFsIHdpdGggaGFyZCBsaW1pdHMuICAqLworCWZvciAoOzspIHsKKwkJLyogdHJ5IHRvIGFsbG9jYXRlIHRoZSByZXF1ZXN0IHN0cnVjdCAqLworCQlyZXEgPSBuZnNfcGFnZV9hbGxvYygpOworCQlpZiAocmVxICE9IE5VTEwpCisJCQlicmVhazsKKworCQkvKiBUcnkgdG8gZnJlZSB1cCBhdCBsZWFzdCBvbmUgcmVxdWVzdCBpbiBvcmRlciB0byBzdGF5CisJCSAqIGJlbG93IHRoZSBoYXJkIGxpbWl0CisJCSAqLworCQlpZiAoc2lnbmFsbGVkKCkgJiYgKHNlcnZlci0+ZmxhZ3MgJiBORlNfTU9VTlRfSU5UUikpCisJCQlyZXR1cm4gRVJSX1BUUigtRVJFU1RBUlRTWVMpOworCQl5aWVsZCgpOworCX0KKworCS8qIEluaXRpYWxpemUgdGhlIHJlcXVlc3Qgc3RydWN0LiBJbml0aWFsbHksIHdlIGFzc3VtZSBhCisJICogbG9uZyB3cml0ZS1iYWNrIGRlbGF5LiBUaGlzIHdpbGwgYmUgYWRqdXN0ZWQgaW4KKwkgKiB1cGRhdGVfbmZzX3JlcXVlc3QgYmVsb3cgaWYgdGhlIHJlZ2lvbiBpcyBub3QgbG9ja2VkLiAqLworCXJlcS0+d2JfcGFnZSAgICA9IHBhZ2U7CisJYXRvbWljX3NldCgmcmVxLT53Yl9jb21wbGV0ZSwgMCk7CisJcmVxLT53Yl9pbmRleAk9IHBhZ2UtPmluZGV4OworCXBhZ2VfY2FjaGVfZ2V0KHBhZ2UpOworCXJlcS0+d2Jfb2Zmc2V0ICA9IG9mZnNldDsKKwlyZXEtPndiX3BnYmFzZQk9IG9mZnNldDsKKwlyZXEtPndiX2J5dGVzICAgPSBjb3VudDsKKwlhdG9taWNfc2V0KCZyZXEtPndiX2NvdW50LCAxKTsKKwlyZXEtPndiX2NvbnRleHQgPSBnZXRfbmZzX29wZW5fY29udGV4dChjdHgpOworCisJcmV0dXJuIHJlcTsKK30KKworLyoqCisgKiBuZnNfdW5sb2NrX3JlcXVlc3QgLSBVbmxvY2sgcmVxdWVzdCBhbmQgd2FrZSB1cCBzbGVlcGVycy4KKyAqIEByZXE6CisgKi8KK3ZvaWQgbmZzX3VubG9ja19yZXF1ZXN0KHN0cnVjdCBuZnNfcGFnZSAqcmVxKQoreworCWlmICghTkZTX1dCQUNLX0JVU1kocmVxKSkgeworCQlwcmludGsoS0VSTl9FUlIgIk5GUzogSW52YWxpZCB1bmxvY2sgYXR0ZW1wdGVkXG4iKTsKKwkJQlVHKCk7CisJfQorCXNtcF9tYl9fYmVmb3JlX2NsZWFyX2JpdCgpOworCWNsZWFyX2JpdChQR19CVVNZLCAmcmVxLT53Yl9mbGFncyk7CisJc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKTsKKwl3YWtlX3VwX2FsbCgmcmVxLT53Yl9jb250ZXh0LT53YWl0cSk7CisJbmZzX3JlbGVhc2VfcmVxdWVzdChyZXEpOworfQorCisvKioKKyAqIG5mc19jbGVhcl9yZXF1ZXN0IC0gRnJlZSB1cCBhbGwgcmVzb3VyY2VzIGFsbG9jYXRlZCB0byB0aGUgcmVxdWVzdAorICogQHJlcToKKyAqCisgKiBSZWxlYXNlIHBhZ2UgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhIHdyaXRlIHJlcXVlc3QgYWZ0ZXIgaXQKKyAqIGhhcyBjb21wbGV0ZWQuCisgKi8KK3ZvaWQgbmZzX2NsZWFyX3JlcXVlc3Qoc3RydWN0IG5mc19wYWdlICpyZXEpCit7CisJaWYgKHJlcS0+d2JfcGFnZSkgeworCQlwYWdlX2NhY2hlX3JlbGVhc2UocmVxLT53Yl9wYWdlKTsKKwkJcmVxLT53Yl9wYWdlID0gTlVMTDsKKwl9Cit9CisKKworLyoqCisgKiBuZnNfcmVsZWFzZV9yZXF1ZXN0IC0gUmVsZWFzZSB0aGUgY291bnQgb24gYW4gTkZTIHJlYWQvd3JpdGUgcmVxdWVzdAorICogQHJlcTogcmVxdWVzdCB0byByZWxlYXNlCisgKgorICogTm90ZTogU2hvdWxkIG5ldmVyIGJlIGNhbGxlZCB3aXRoIHRoZSBzcGlubG9jayBoZWxkIQorICovCit2b2lkCituZnNfcmVsZWFzZV9yZXF1ZXN0KHN0cnVjdCBuZnNfcGFnZSAqcmVxKQoreworCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmcmVxLT53Yl9jb3VudCkpCisJCXJldHVybjsKKworI2lmZGVmIE5GU19QQVJBTk9JQQorCUJVR19PTiAoIWxpc3RfZW1wdHkoJnJlcS0+d2JfbGlzdCkpOworCUJVR19PTiAoTkZTX1dCQUNLX0JVU1kocmVxKSk7CisjZW5kaWYKKworCS8qIFJlbGVhc2Ugc3RydWN0IGZpbGUgb3IgY2FjaGVkIGNyZWRlbnRpYWwgKi8KKwluZnNfY2xlYXJfcmVxdWVzdChyZXEpOworCXB1dF9uZnNfb3Blbl9jb250ZXh0KHJlcS0+d2JfY29udGV4dCk7CisJbmZzX3BhZ2VfZnJlZShyZXEpOworfQorCisvKioKKyAqIG5mc19saXN0X2FkZF9yZXF1ZXN0IC0gSW5zZXJ0IGEgcmVxdWVzdCBpbnRvIGEgc29ydGVkIGxpc3QKKyAqIEByZXE6IHJlcXVlc3QKKyAqIEBoZWFkOiBoZWFkIG9mIGxpc3QgaW50byB3aGljaCB0byBpbnNlcnQgdGhlIHJlcXVlc3QuCisgKgorICogTm90ZSB0aGF0IHRoZSB3Yl9saXN0IGlzIHNvcnRlZCBieSBwYWdlIGluZGV4IGluIG9yZGVyIHRvIGZhY2lsaXRhdGUKKyAqIGNvYWxlc2Npbmcgb2YgcmVxdWVzdHMuCisgKiBXZSB1c2UgYW4gaW5zZXJ0aW9uIHNvcnQgdGhhdCBpcyBvcHRpbWl6ZWQgZm9yIHRoZSBjYXNlIG9mIGFwcGVuZGVkCisgKiB3cml0ZXMuCisgKi8KK3ZvaWQKK25mc19saXN0X2FkZF9yZXF1ZXN0KHN0cnVjdCBuZnNfcGFnZSAqcmVxLCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKworI2lmZGVmIE5GU19QQVJBTk9JQQorCWlmICghbGlzdF9lbXB0eSgmcmVxLT53Yl9saXN0KSkgeworCQlwcmludGsoS0VSTl9FUlIgIk5GUzogQWRkIHRvIGxpc3QgZmFpbGVkIVxuIik7CisJCUJVRygpOworCX0KKyNlbmRpZgorCWxpc3RfZm9yX2VhY2hfcHJldihwb3MsIGhlYWQpIHsKKwkJc3RydWN0IG5mc19wYWdlCSpwID0gbmZzX2xpc3RfZW50cnkocG9zKTsKKwkJaWYgKHAtPndiX2luZGV4IDwgcmVxLT53Yl9pbmRleCkKKwkJCWJyZWFrOworCX0KKwlsaXN0X2FkZCgmcmVxLT53Yl9saXN0LCBwb3MpOworCXJlcS0+d2JfbGlzdF9oZWFkID0gaGVhZDsKK30KKworLyoqCisgKiBuZnNfd2FpdF9vbl9yZXF1ZXN0IC0gV2FpdCBmb3IgYSByZXF1ZXN0IHRvIGNvbXBsZXRlLgorICogQHJlcTogcmVxdWVzdCB0byB3YWl0IHVwb24uCisgKgorICogSW50ZXJydXB0aWJsZSBieSBzaWduYWxzIG9ubHkgaWYgbW91bnRlZCB3aXRoIGludHIgZmxhZy4KKyAqIFRoZSB1c2VyIGlzIHJlc3BvbnNpYmxlIGZvciBob2xkaW5nIGEgY291bnQgb24gdGhlIHJlcXVlc3QuCisgKi8KK2ludAorbmZzX3dhaXRfb25fcmVxdWVzdChzdHJ1Y3QgbmZzX3BhZ2UgKnJlcSkKK3sKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gcmVxLT53Yl9jb250ZXh0LT5kZW50cnktPmRfaW5vZGU7CisgICAgICAgIHN0cnVjdCBycGNfY2xudAkqY2xudCA9IE5GU19DTElFTlQoaW5vZGUpOworCisJaWYgKCFORlNfV0JBQ0tfQlVTWShyZXEpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gbmZzX3dhaXRfZXZlbnQoY2xudCwgcmVxLT53Yl9jb250ZXh0LT53YWl0cSwgIU5GU19XQkFDS19CVVNZKHJlcSkpOworfQorCisvKioKKyAqIG5mc19jb2FsZXNjZV9yZXF1ZXN0cyAtIFNwbGl0IGNvYWxlc2NlZCByZXF1ZXN0cyBvdXQgZnJvbSBhIGxpc3QuCisgKiBAaGVhZDogc291cmNlIGxpc3QKKyAqIEBkc3Q6IGRlc3RpbmF0aW9uIGxpc3QKKyAqIEBubWF4OiBtYXhpbXVtIG51bWJlciBvZiByZXF1ZXN0cyB0byBjb2FsZXNjZQorICoKKyAqIE1vdmVzIGEgbWF4aW11bSBvZiAnbm1heCcgZWxlbWVudHMgZnJvbSBvbmUgbGlzdCB0byBhbm90aGVyLgorICogVGhlIGVsZW1lbnRzIGFyZSBjaGVja2VkIHRvIGVuc3VyZSB0aGF0IHRoZXkgZm9ybSBhIGNvbnRpZ3VvdXMgc2V0CisgKiBvZiBwYWdlcywgYW5kIHRoYXQgdGhlIFJQQyBjcmVkZW50aWFscyBhcmUgdGhlIHNhbWUuCisgKi8KK2ludAorbmZzX2NvYWxlc2NlX3JlcXVlc3RzKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHN0cnVjdCBsaXN0X2hlYWQgKmRzdCwKKwkJICAgICAgdW5zaWduZWQgaW50IG5tYXgpCit7CisJc3RydWN0IG5mc19wYWdlCQkqcmVxID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQJCW5wYWdlcyA9IDA7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoaGVhZCkpIHsKKwkJc3RydWN0IG5mc19wYWdlCSpwcmV2ID0gcmVxOworCisJCXJlcSA9IG5mc19saXN0X2VudHJ5KGhlYWQtPm5leHQpOworCQlpZiAocHJldikgeworCQkJaWYgKHJlcS0+d2JfY29udGV4dC0+Y3JlZCAhPSBwcmV2LT53Yl9jb250ZXh0LT5jcmVkKQorCQkJCWJyZWFrOworCQkJaWYgKHJlcS0+d2JfY29udGV4dC0+bG9ja293bmVyICE9IHByZXYtPndiX2NvbnRleHQtPmxvY2tvd25lcikKKwkJCQlicmVhazsKKwkJCWlmIChyZXEtPndiX2NvbnRleHQtPnN0YXRlICE9IHByZXYtPndiX2NvbnRleHQtPnN0YXRlKQorCQkJCWJyZWFrOworCQkJaWYgKHJlcS0+d2JfaW5kZXggIT0gKHByZXYtPndiX2luZGV4ICsgMSkpCisJCQkJYnJlYWs7CisKKwkJCWlmIChyZXEtPndiX3BnYmFzZSAhPSAwKQorCQkJCWJyZWFrOworCQl9CisJCW5mc19saXN0X3JlbW92ZV9yZXF1ZXN0KHJlcSk7CisJCW5mc19saXN0X2FkZF9yZXF1ZXN0KHJlcSwgZHN0KTsKKwkJbnBhZ2VzKys7CisJCWlmIChyZXEtPndiX3BnYmFzZSArIHJlcS0+d2JfYnl0ZXMgIT0gUEFHRV9DQUNIRV9TSVpFKQorCQkJYnJlYWs7CisJCWlmIChucGFnZXMgPj0gbm1heCkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gbnBhZ2VzOworfQorCisvKioKKyAqIG5mc19zY2FuX2xpc3QgLSBTY2FuIGEgbGlzdCBmb3IgbWF0Y2hpbmcgcmVxdWVzdHMKKyAqIEBoZWFkOiBPbmUgb2YgdGhlIE5GUyBpbm9kZSByZXF1ZXN0IGxpc3RzCisgKiBAZHN0OiBEZXN0aW5hdGlvbiBsaXN0CisgKiBAaWR4X3N0YXJ0OiBsb3dlciBib3VuZCBvZiBwYWdlLT5pbmRleCB0byBzY2FuCisgKiBAbnBhZ2VzOiBpZHhfc3RhcnQgKyBucGFnZXMgc2V0cyB0aGUgdXBwZXIgYm91bmQgdG8gc2Nhbi4KKyAqCisgKiBNb3ZlcyBlbGVtZW50cyBmcm9tIG9uZSBvZiB0aGUgaW5vZGUgcmVxdWVzdCBsaXN0cy4KKyAqIElmIHRoZSBudW1iZXIgb2YgcmVxdWVzdHMgaXMgc2V0IHRvIDAsIHRoZSBlbnRpcmUgYWRkcmVzc19zcGFjZQorICogc3RhcnRpbmcgYXQgaW5kZXggaWR4X3N0YXJ0LCBpcyBzY2FubmVkLgorICogVGhlIHJlcXVlc3RzIGFyZSAqbm90KiBjaGVja2VkIHRvIGVuc3VyZSB0aGF0IHRoZXkgZm9ybSBhIGNvbnRpZ3VvdXMgc2V0LgorICogWW91IG11c3QgYmUgaG9sZGluZyB0aGUgaW5vZGUncyByZXFfbG9jayB3aGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbgorICovCitpbnQKK25mc19zY2FuX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgc3RydWN0IGxpc3RfaGVhZCAqZHN0LAorCSAgICAgIHVuc2lnbmVkIGxvbmcgaWR4X3N0YXJ0LCB1bnNpZ25lZCBpbnQgbnBhZ2VzKQoreworCXN0cnVjdCBsaXN0X2hlYWQJKnBvcywgKnRtcDsKKwlzdHJ1Y3QgbmZzX3BhZ2UJCSpyZXE7CisJdW5zaWduZWQgbG9uZwkJaWR4X2VuZDsKKwlpbnQJCQlyZXM7CisKKwlyZXMgPSAwOworCWlmIChucGFnZXMgPT0gMCkKKwkJaWR4X2VuZCA9IH4wOworCWVsc2UKKwkJaWR4X2VuZCA9IGlkeF9zdGFydCArIG5wYWdlcyAtIDE7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCB0bXAsIGhlYWQpIHsKKworCQlyZXEgPSBuZnNfbGlzdF9lbnRyeShwb3MpOworCisJCWlmIChyZXEtPndiX2luZGV4IDwgaWR4X3N0YXJ0KQorCQkJY29udGludWU7CisJCWlmIChyZXEtPndiX2luZGV4ID4gaWR4X2VuZCkKKwkJCWJyZWFrOworCisJCWlmICghbmZzX2xvY2tfcmVxdWVzdChyZXEpKQorCQkJY29udGludWU7CisJCW5mc19saXN0X3JlbW92ZV9yZXF1ZXN0KHJlcSk7CisJCW5mc19saXN0X2FkZF9yZXF1ZXN0KHJlcSwgZHN0KTsKKwkJcmVzKys7CisJfQorCXJldHVybiByZXM7Cit9CisKK2ludCBuZnNfaW5pdF9uZnNwYWdlY2FjaGUodm9pZCkKK3sKKwluZnNfcGFnZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgibmZzX3BhZ2UiLAorCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBuZnNfcGFnZSksCisJCQkJCSAgICAwLCBTTEFCX0hXQ0FDSEVfQUxJR04sCisJCQkJCSAgICBOVUxMLCBOVUxMKTsKKwlpZiAobmZzX3BhZ2VfY2FjaGVwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbmZzX2Rlc3Ryb3lfbmZzcGFnZWNhY2hlKHZvaWQpCit7CisJaWYgKGttZW1fY2FjaGVfZGVzdHJveShuZnNfcGFnZV9jYWNoZXApKQorCQlwcmludGsoS0VSTl9JTkZPICJuZnNfcGFnZTogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOworfQorCmRpZmYgLS1naXQgYS9mcy9uZnMvcHJvYy5jIGIvZnMvbmZzL3Byb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzFiNGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzL3Byb2MuYwpAQCAtMCwwICsxLDY1NSBAQAorLyoKKyAqICBsaW51eC9mcy9uZnMvcHJvYy5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCAgUmljayBTbGFka2V5CisgKgorICogIE9TLWluZGVwZW5kZW50IG5mcyByZW1vdGUgcHJvY2VkdXJlIGNhbGwgZnVuY3Rpb25zCisgKgorICogIFR1bmVkIGJ5IEFsYW4gQ294IDxBLkNveEBzd2Fuc2VhLmFjLnVrPiBmb3IgPjNLIGJ1ZmZlcnMKKyAqICBzbyBhdCBsYXN0IHdlIGNhbiBoYXZlIGRlY2VudChpc2gpIHRocm91Z2hwdXQgb2ZmIGEgCisgKiAgU3VuIHNlcnZlci4KKyAqCisgKiAgQ29kaW5nIG9wdGltaXplZCBhbmQgY2xlYW5lZCB1cCBieSBGbG9yaWFuIExhIFJvY2hlLgorICogIE5vdGU6IEVycm9yIHJldHVybnMgYXJlIG9wdGltaXplZCBmb3IgTkZTX09LLCB3aGljaCBpc24ndCB0cmFuc2xhdGVkIHZpYQorICogIG5mc19zdGF0X3RvX2Vycm5vKCksIGJ1dCBoYXBwZW5zIHRvIGJlIGFscmVhZHkgdGhlIHJpZ2h0IHJldHVybiBjb2RlLgorICoKKyAqICBBbHNvLCB0aGUgY29kZSBjdXJyZW50bHkgZG9lc24ndCBjaGVjayB0aGUgc2l6ZSBvZiB0aGUgcGFja2V0LCB3aGVuCisgKiAgaXQgZGVjb2RlcyB0aGUgcGFja2V0LgorICoKKyAqICBGZWVsIGZyZWUgdG8gZml4IGl0IGFuZCBtYWlsIG1lIHRoZSBkaWZmcyBpZiBpdCB3b3JyaWVzIHlvdS4KKyAqCisgKiAgQ29tcGxldGVseSByZXdyaXR0ZW4gdG8gc3VwcG9ydCB0aGUgbmV3IFJQQyBjYWxsIGludGVyZmFjZTsKKyAqICByZXdyb3RlIGFuZCBtb3ZlZCB0aGUgZW50aXJlIFhEUiBzdHVmZiB0byB4ZHIuYworICogIC0tT2xhZiBLaXJjaCBKdW5lIDE5OTYKKyAqCisgKiAgVGhlIGNvZGUgYmVsb3cgaW5pdGlhbGl6ZXMgYWxsIGF1dG8gdmFyaWFibGVzIGV4cGxpY2l0bHksIG90aGVyd2lzZQorICogIGl0IHdpbGwgZmFpbCB0byB3b3JrIGFzIGEgbW9kdWxlIChnY2MgZ2VuZXJhdGVzIGEgbWVtc2V0IGNhbGwgZm9yIGFuCisgKiAgaW5jb21wbGV0ZSBzdHJ1Y3QpLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CisjaW5jbHVkZSA8bGludXgvbmZzLmg+CisjaW5jbHVkZSA8bGludXgvbmZzMi5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19wYWdlLmg+CisjaW5jbHVkZSA8bGludXgvbG9ja2QvYmluZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisKKyNkZWZpbmUgTkZTREJHX0ZBQ0lMSVRZCQlORlNEQkdfUFJPQworCitleHRlcm4gc3RydWN0IHJwY19wcm9jaW5mbyBuZnNfcHJvY2VkdXJlc1tdOworCisvKgorICogQmFyZS1ib25lcyBhY2Nlc3MgdG8gZ2V0YXR0cjogdGhpcyBpcyBmb3IgbmZzX3JlYWRfc3VwZXIuCisgKi8KK3N0YXRpYyBpbnQKK25mc19wcm9jX2dldF9yb290KHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBuZnNfZmggKmZoYW5kbGUsCisJCSAgc3RydWN0IG5mc19mc2luZm8gKmluZm8pCit7CisJc3RydWN0IG5mc19mYXR0ciAqZmF0dHIgPSBpbmZvLT5mYXR0cjsKKwlzdHJ1Y3QgbmZzMl9mc3N0YXQgZnNpbmZvOworCWludCBzdGF0dXM7CisKKwlkcHJpbnRrKCIlczogY2FsbCBnZXRhdHRyXG4iLCBfX0ZVTkNUSU9OX18pOworCWZhdHRyLT52YWxpZCA9IDA7CisJc3RhdHVzID0gcnBjX2NhbGwoc2VydmVyLT5jbGllbnRfc3lzLCBORlNQUk9DX0dFVEFUVFIsIGZoYW5kbGUsIGZhdHRyLCAwKTsKKwlkcHJpbnRrKCIlczogcmVwbHkgZ2V0YXR0cjogJWRcbiIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCWRwcmludGsoIiVzOiBjYWxsIHN0YXRmc1xuIiwgX19GVU5DVElPTl9fKTsKKwlzdGF0dXMgPSBycGNfY2FsbChzZXJ2ZXItPmNsaWVudF9zeXMsIE5GU1BST0NfU1RBVEZTLCBmaGFuZGxlLCAmZnNpbmZvLCAwKTsKKwlkcHJpbnRrKCIlczogcmVwbHkgc3RhdGZzOiAlZFxuIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisJaW5mby0+cnRtYXggID0gTkZTX01BWERBVEE7CisJaW5mby0+cnRwcmVmID0gZnNpbmZvLnRzaXplOworCWluZm8tPnJ0bXVsdCA9IGZzaW5mby5ic2l6ZTsKKwlpbmZvLT53dG1heCAgPSBORlNfTUFYREFUQTsKKwlpbmZvLT53dHByZWYgPSBmc2luZm8udHNpemU7CisJaW5mby0+d3RtdWx0ID0gZnNpbmZvLmJzaXplOworCWluZm8tPmR0cHJlZiA9IGZzaW5mby50c2l6ZTsKKwlpbmZvLT5tYXhmaWxlc2l6ZSA9IDB4N0ZGRkZGRkY7CisJaW5mby0+bGVhc2VfdGltZSA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBPbmUgZnVuY3Rpb24gZm9yIGVhY2ggcHJvY2VkdXJlIGluIHRoZSBORlMgcHJvdG9jb2wuCisgKi8KK3N0YXRpYyBpbnQKK25mc19wcm9jX2dldGF0dHIoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgc3RydWN0IG5mc19maCAqZmhhbmRsZSwKKwkJc3RydWN0IG5mc19mYXR0ciAqZmF0dHIpCit7CisJaW50CXN0YXR1czsKKworCWRwcmludGsoIk5GUyBjYWxsICBnZXRhdHRyXG4iKTsKKwlmYXR0ci0+dmFsaWQgPSAwOworCXN0YXR1cyA9IHJwY19jYWxsKHNlcnZlci0+Y2xpZW50LCBORlNQUk9DX0dFVEFUVFIsCisJCQkJZmhhbmRsZSwgZmF0dHIsIDApOworCWRwcmludGsoIk5GUyByZXBseSBnZXRhdHRyOiAlZFxuIiwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50CituZnNfcHJvY19zZXRhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5mc19mYXR0ciAqZmF0dHIsCisJCSBzdHJ1Y3QgaWF0dHIgKnNhdHRyKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IG5mc19zYXR0cmFyZ3MJYXJnID0geyAKKwkJLmZoCT0gTkZTX0ZIKGlub2RlKSwKKwkJLnNhdHRyCT0gc2F0dHIKKwl9OworCWludAlzdGF0dXM7CisKKwlkcHJpbnRrKCJORlMgY2FsbCAgc2V0YXR0clxuIik7CisJZmF0dHItPnZhbGlkID0gMDsKKwlzdGF0dXMgPSBycGNfY2FsbChORlNfQ0xJRU5UKGlub2RlKSwgTkZTUFJPQ19TRVRBVFRSLCAmYXJnLCBmYXR0ciwgMCk7CisJZHByaW50aygiTkZTIHJlcGx5IHNldGF0dHI6ICVkXG4iLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQKK25mc19wcm9jX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHFzdHIgKm5hbWUsCisJCXN0cnVjdCBuZnNfZmggKmZoYW5kbGUsIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQoreworCXN0cnVjdCBuZnNfZGlyb3BhcmdzCWFyZyA9IHsKKwkJLmZoCQk9IE5GU19GSChkaXIpLAorCQkubmFtZQkJPSBuYW1lLT5uYW1lLAorCQkubGVuCQk9IG5hbWUtPmxlbgorCX07CisJc3RydWN0IG5mc19kaXJvcG9rCXJlcyA9IHsKKwkJLmZoCQk9IGZoYW5kbGUsCisJCS5mYXR0cgkJPSBmYXR0cgorCX07CisJaW50CQkJc3RhdHVzOworCisJZHByaW50aygiTkZTIGNhbGwgIGxvb2t1cCAlc1xuIiwgbmFtZS0+bmFtZSk7CisJZmF0dHItPnZhbGlkID0gMDsKKwlzdGF0dXMgPSBycGNfY2FsbChORlNfQ0xJRU5UKGRpciksIE5GU1BST0NfTE9PS1VQLCAmYXJnLCAmcmVzLCAwKTsKKwlkcHJpbnRrKCJORlMgcmVwbHkgbG9va3VwOiAlZFxuIiwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IG5mc19wcm9jX3JlYWRsaW5rKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlICpwYWdlLAorCQl1bnNpZ25lZCBpbnQgcGdiYXNlLCB1bnNpZ25lZCBpbnQgcGdsZW4pCit7CisJc3RydWN0IG5mc19yZWFkbGlua2FyZ3MJYXJncyA9IHsKKwkJLmZoCQk9IE5GU19GSChpbm9kZSksCisJCS5wZ2Jhc2UJCT0gcGdiYXNlLAorCQkucGdsZW4JCT0gcGdsZW4sCisJCS5wYWdlcwkJPSAmcGFnZQorCX07CisJaW50CQkJc3RhdHVzOworCisJZHByaW50aygiTkZTIGNhbGwgIHJlYWRsaW5rXG4iKTsKKwlzdGF0dXMgPSBycGNfY2FsbChORlNfQ0xJRU5UKGlub2RlKSwgTkZTUFJPQ19SRUFETElOSywgJmFyZ3MsIE5VTEwsIDApOworCWRwcmludGsoIk5GUyByZXBseSByZWFkbGluazogJWRcbiIsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBuZnNfcHJvY19yZWFkKHN0cnVjdCBuZnNfcmVhZF9kYXRhICpyZGF0YSkKK3sKKwlpbnQJCQlmbGFncyA9IHJkYXRhLT5mbGFnczsKKwlzdHJ1Y3QgaW5vZGUgKgkJaW5vZGUgPSByZGF0YS0+aW5vZGU7CisJc3RydWN0IG5mc19mYXR0ciAqCWZhdHRyID0gcmRhdGEtPnJlcy5mYXR0cjsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UJbXNnID0geworCQkucnBjX3Byb2MJPSAmbmZzX3Byb2NlZHVyZXNbTkZTUFJPQ19SRUFEXSwKKwkJLnJwY19hcmdwCT0gJnJkYXRhLT5hcmdzLAorCQkucnBjX3Jlc3AJPSAmcmRhdGEtPnJlcywKKwkJLnJwY19jcmVkCT0gcmRhdGEtPmNyZWQsCisJfTsKKwlpbnQJCQlzdGF0dXM7CisKKwlkcHJpbnRrKCJORlMgY2FsbCAgcmVhZCAlZCBAICVMZFxuIiwgcmRhdGEtPmFyZ3MuY291bnQsCisJCQkobG9uZyBsb25nKSByZGF0YS0+YXJncy5vZmZzZXQpOworCWZhdHRyLT52YWxpZCA9IDA7CisJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhORlNfQ0xJRU5UKGlub2RlKSwgJm1zZywgZmxhZ3MpOworCWlmIChzdGF0dXMgPj0gMCkgeworCQluZnNfcmVmcmVzaF9pbm9kZShpbm9kZSwgZmF0dHIpOworCQkvKiBFbXVsYXRlIHRoZSBlb2YgZmxhZywgd2hpY2ggaXNuJ3Qgbm9ybWFsbHkgbmVlZGVkIGluIE5GU3YyCisJCSAqIGFzIGl0IGlzIGd1YXJhbnRlZWQgdG8gYWx3YXlzIHJldHVybiB0aGUgZmlsZSBhdHRyaWJ1dGVzCisJCSAqLworCQlpZiAocmRhdGEtPmFyZ3Mub2Zmc2V0ICsgcmRhdGEtPmFyZ3MuY291bnQgPj0gZmF0dHItPnNpemUpCisJCQlyZGF0YS0+cmVzLmVvZiA9IDE7CisJfQorCWRwcmludGsoIk5GUyByZXBseSByZWFkOiAlZFxuIiwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IG5mc19wcm9jX3dyaXRlKHN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqd2RhdGEpCit7CisJaW50CQkJZmxhZ3MgPSB3ZGF0YS0+ZmxhZ3M7CisJc3RydWN0IGlub2RlICoJCWlub2RlID0gd2RhdGEtPmlub2RlOworCXN0cnVjdCBuZnNfZmF0dHIgKglmYXR0ciA9IHdkYXRhLT5yZXMuZmF0dHI7CisJc3RydWN0IHJwY19tZXNzYWdlCW1zZyA9IHsKKwkJLnJwY19wcm9jCT0gJm5mc19wcm9jZWR1cmVzW05GU1BST0NfV1JJVEVdLAorCQkucnBjX2FyZ3AJPSAmd2RhdGEtPmFyZ3MsCisJCS5ycGNfcmVzcAk9ICZ3ZGF0YS0+cmVzLAorCQkucnBjX2NyZWQJPSB3ZGF0YS0+Y3JlZCwKKwl9OworCWludAkJCXN0YXR1czsKKworCWRwcmludGsoIk5GUyBjYWxsICB3cml0ZSAlZCBAICVMZFxuIiwgd2RhdGEtPmFyZ3MuY291bnQsCisJCQkobG9uZyBsb25nKSB3ZGF0YS0+YXJncy5vZmZzZXQpOworCWZhdHRyLT52YWxpZCA9IDA7CisJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhORlNfQ0xJRU5UKGlub2RlKSwgJm1zZywgZmxhZ3MpOworCWlmIChzdGF0dXMgPj0gMCkgeworCQluZnNfcmVmcmVzaF9pbm9kZShpbm9kZSwgZmF0dHIpOworCQl3ZGF0YS0+cmVzLmNvdW50ID0gd2RhdGEtPmFyZ3MuY291bnQ7CisJCXdkYXRhLT52ZXJmLmNvbW1pdHRlZCA9IE5GU19GSUxFX1NZTkM7CisJfQorCWRwcmludGsoIk5GUyByZXBseSB3cml0ZTogJWRcbiIsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1cyA8IDA/IHN0YXR1cyA6IHdkYXRhLT5yZXMuY291bnQ7Cit9CisKK3N0YXRpYyBpbnQKK25mc19wcm9jX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKnNhdHRyLAorCQlpbnQgZmxhZ3MpCit7CisJc3RydWN0IG5mc19maAkJZmhhbmRsZTsKKwlzdHJ1Y3QgbmZzX2ZhdHRyCWZhdHRyOworCXN0cnVjdCBuZnNfY3JlYXRlYXJncwlhcmcgPSB7CisJCS5maAkJPSBORlNfRkgoZGlyKSwKKwkJLm5hbWUJCT0gZGVudHJ5LT5kX25hbWUubmFtZSwKKwkJLmxlbgkJPSBkZW50cnktPmRfbmFtZS5sZW4sCisJCS5zYXR0cgkJPSBzYXR0cgorCX07CisJc3RydWN0IG5mc19kaXJvcG9rCXJlcyA9IHsKKwkJLmZoCQk9ICZmaGFuZGxlLAorCQkuZmF0dHIJCT0gJmZhdHRyCisJfTsKKwlpbnQJCQlzdGF0dXM7CisKKwlmYXR0ci52YWxpZCA9IDA7CisJZHByaW50aygiTkZTIGNhbGwgIGNyZWF0ZSAlc1xuIiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisJc3RhdHVzID0gcnBjX2NhbGwoTkZTX0NMSUVOVChkaXIpLCBORlNQUk9DX0NSRUFURSwgJmFyZywgJnJlcywgMCk7CisJaWYgKHN0YXR1cyA9PSAwKQorCQlzdGF0dXMgPSBuZnNfaW5zdGFudGlhdGUoZGVudHJ5LCAmZmhhbmRsZSwgJmZhdHRyKTsKKwlkcHJpbnRrKCJORlMgcmVwbHkgY3JlYXRlOiAlZFxuIiwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogSW4gTkZTdjIsIG1rbm9kIGlzIGdyYWZ0ZWQgb250byB0aGUgY3JlYXRlIGNhbGwuCisgKi8KK3N0YXRpYyBpbnQKK25mc19wcm9jX21rbm9kKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqc2F0dHIsCisJICAgICAgIGRldl90IHJkZXYpCit7CisJc3RydWN0IG5mc19maCBmaGFuZGxlOworCXN0cnVjdCBuZnNfZmF0dHIgZmF0dHI7CisJc3RydWN0IG5mc19jcmVhdGVhcmdzCWFyZyA9IHsKKwkJLmZoCQk9IE5GU19GSChkaXIpLAorCQkubmFtZQkJPSBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkubGVuCQk9IGRlbnRyeS0+ZF9uYW1lLmxlbiwKKwkJLnNhdHRyCQk9IHNhdHRyCisJfTsKKwlzdHJ1Y3QgbmZzX2Rpcm9wb2sJcmVzID0geworCQkuZmgJCT0gJmZoYW5kbGUsCisJCS5mYXR0cgkJPSAmZmF0dHIKKwl9OworCWludCBzdGF0dXMsIG1vZGU7CisKKwlkcHJpbnRrKCJORlMgY2FsbCAgbWtub2QgJXNcbiIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJbW9kZSA9IHNhdHRyLT5pYV9tb2RlOworCWlmIChTX0lTRklGTyhtb2RlKSkgeworCQlzYXR0ci0+aWFfbW9kZSA9IChtb2RlICYgflNfSUZNVCkgfCBTX0lGQ0hSOworCQlzYXR0ci0+aWFfdmFsaWQgJj0gfkFUVFJfU0laRTsKKwl9IGVsc2UgaWYgKFNfSVNDSFIobW9kZSkgfHwgU19JU0JMSyhtb2RlKSkgeworCQlzYXR0ci0+aWFfdmFsaWQgfD0gQVRUUl9TSVpFOworCQlzYXR0ci0+aWFfc2l6ZSA9IG5ld19lbmNvZGVfZGV2KHJkZXYpOy8qIGdldCBvdXQgeW91ciBiYXJmIGJhZyAqLworCX0KKworCWZhdHRyLnZhbGlkID0gMDsKKwlzdGF0dXMgPSBycGNfY2FsbChORlNfQ0xJRU5UKGRpciksIE5GU1BST0NfQ1JFQVRFLCAmYXJnLCAmcmVzLCAwKTsKKworCWlmIChzdGF0dXMgPT0gLUVJTlZBTCAmJiBTX0lTRklGTyhtb2RlKSkgeworCQlzYXR0ci0+aWFfbW9kZSA9IG1vZGU7CisJCWZhdHRyLnZhbGlkID0gMDsKKwkJc3RhdHVzID0gcnBjX2NhbGwoTkZTX0NMSUVOVChkaXIpLCBORlNQUk9DX0NSRUFURSwgJmFyZywgJnJlcywgMCk7CisJfQorCWlmIChzdGF0dXMgPT0gMCkKKwkJc3RhdHVzID0gbmZzX2luc3RhbnRpYXRlKGRlbnRyeSwgJmZoYW5kbGUsICZmYXR0cik7CisJZHByaW50aygiTkZTIHJlcGx5IG1rbm9kOiAlZFxuIiwgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorICAKK3N0YXRpYyBpbnQKK25mc19wcm9jX3JlbW92ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHFzdHIgKm5hbWUpCit7CisJc3RydWN0IG5mc19kaXJvcGFyZ3MJYXJnID0geworCQkuZmgJCT0gTkZTX0ZIKGRpciksCisJCS5uYW1lCQk9IG5hbWUtPm5hbWUsCisJCS5sZW4JCT0gbmFtZS0+bGVuCisJfTsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UJbXNnID0geyAKKwkJLnJwY19wcm9jCT0gJm5mc19wcm9jZWR1cmVzW05GU1BST0NfUkVNT1ZFXSwKKwkJLnJwY19hcmdwCT0gJmFyZywKKwkJLnJwY19yZXNwCT0gTlVMTCwKKwkJLnJwY19jcmVkCT0gTlVMTAorCX07CisJaW50CQkJc3RhdHVzOworCisJZHByaW50aygiTkZTIGNhbGwgIHJlbW92ZSAlc1xuIiwgbmFtZS0+bmFtZSk7CisJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhORlNfQ0xJRU5UKGRpciksICZtc2csIDApOworCisJZHByaW50aygiTkZTIHJlcGx5IHJlbW92ZTogJWRcbiIsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludAorbmZzX3Byb2NfdW5saW5rX3NldHVwKHN0cnVjdCBycGNfbWVzc2FnZSAqbXNnLCBzdHJ1Y3QgZGVudHJ5ICpkaXIsIHN0cnVjdCBxc3RyICpuYW1lKQoreworCXN0cnVjdCBuZnNfZGlyb3BhcmdzCSphcmc7CisKKwlhcmcgPSAoc3RydWN0IG5mc19kaXJvcGFyZ3MgKilrbWFsbG9jKHNpemVvZigqYXJnKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhcmcpCisJCXJldHVybiAtRU5PTUVNOworCWFyZy0+ZmggPSBORlNfRkgoZGlyLT5kX2lub2RlKTsKKwlhcmctPm5hbWUgPSBuYW1lLT5uYW1lOworCWFyZy0+bGVuID0gbmFtZS0+bGVuOworCW1zZy0+cnBjX3Byb2MgPSAmbmZzX3Byb2NlZHVyZXNbTkZTUFJPQ19SRU1PVkVdOworCW1zZy0+cnBjX2FyZ3AgPSBhcmc7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25mc19wcm9jX3VubGlua19kb25lKHN0cnVjdCBkZW50cnkgKmRpciwgc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCXN0cnVjdCBycGNfbWVzc2FnZSAqbXNnID0gJnRhc2stPnRrX21zZzsKKwkKKwlpZiAobXNnLT5ycGNfYXJncCkKKwkJa2ZyZWUobXNnLT5ycGNfYXJncCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25mc19wcm9jX3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBxc3RyICpvbGRfbmFtZSwKKwkJc3RydWN0IGlub2RlICpuZXdfZGlyLCBzdHJ1Y3QgcXN0ciAqbmV3X25hbWUpCit7CisJc3RydWN0IG5mc19yZW5hbWVhcmdzCWFyZyA9IHsKKwkJLmZyb21maAkJPSBORlNfRkgob2xkX2RpciksCisJCS5mcm9tbmFtZQk9IG9sZF9uYW1lLT5uYW1lLAorCQkuZnJvbWxlbgk9IG9sZF9uYW1lLT5sZW4sCisJCS50b2ZoCQk9IE5GU19GSChuZXdfZGlyKSwKKwkJLnRvbmFtZQkJPSBuZXdfbmFtZS0+bmFtZSwKKwkJLnRvbGVuCQk9IG5ld19uYW1lLT5sZW4KKwl9OworCWludAkJCXN0YXR1czsKKworCWRwcmludGsoIk5GUyBjYWxsICByZW5hbWUgJXMgLT4gJXNcbiIsIG9sZF9uYW1lLT5uYW1lLCBuZXdfbmFtZS0+bmFtZSk7CisJc3RhdHVzID0gcnBjX2NhbGwoTkZTX0NMSUVOVChvbGRfZGlyKSwgTkZTUFJPQ19SRU5BTUUsICZhcmcsIE5VTEwsIDApOworCWRwcmludGsoIk5GUyByZXBseSByZW5hbWU6ICVkXG4iLCBzdGF0dXMpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQKK25mc19wcm9jX2xpbmsoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBxc3RyICpuYW1lKQoreworCXN0cnVjdCBuZnNfbGlua2FyZ3MJYXJnID0geworCQkuZnJvbWZoCQk9IE5GU19GSChpbm9kZSksCisJCS50b2ZoCQk9IE5GU19GSChkaXIpLAorCQkudG9uYW1lCQk9IG5hbWUtPm5hbWUsCisJCS50b2xlbgkJPSBuYW1lLT5sZW4KKwl9OworCWludAkJCXN0YXR1czsKKworCWRwcmludGsoIk5GUyBjYWxsICBsaW5rICVzXG4iLCBuYW1lLT5uYW1lKTsKKwlzdGF0dXMgPSBycGNfY2FsbChORlNfQ0xJRU5UKGlub2RlKSwgTkZTUFJPQ19MSU5LLCAmYXJnLCBOVUxMLCAwKTsKKwlkcHJpbnRrKCJORlMgcmVwbHkgbGluazogJWRcbiIsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludAorbmZzX3Byb2Nfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHFzdHIgKm5hbWUsIHN0cnVjdCBxc3RyICpwYXRoLAorCQkgc3RydWN0IGlhdHRyICpzYXR0ciwgc3RydWN0IG5mc19maCAqZmhhbmRsZSwKKwkJIHN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyKQoreworCXN0cnVjdCBuZnNfc3ltbGlua2FyZ3MJYXJnID0geworCQkuZnJvbWZoCQk9IE5GU19GSChkaXIpLAorCQkuZnJvbW5hbWUJPSBuYW1lLT5uYW1lLAorCQkuZnJvbWxlbgk9IG5hbWUtPmxlbiwKKwkJLnRvcGF0aAkJPSBwYXRoLT5uYW1lLAorCQkudG9sZW4JCT0gcGF0aC0+bGVuLAorCQkuc2F0dHIJCT0gc2F0dHIKKwl9OworCWludAkJCXN0YXR1czsKKworCWlmIChwYXRoLT5sZW4gPiBORlMyX01BWFBBVEhMRU4pCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCWRwcmludGsoIk5GUyBjYWxsICBzeW1saW5rICVzIC0+ICVzXG4iLCBuYW1lLT5uYW1lLCBwYXRoLT5uYW1lKTsKKwlmYXR0ci0+dmFsaWQgPSAwOworCWZoYW5kbGUtPnNpemUgPSAwOworCXN0YXR1cyA9IHJwY19jYWxsKE5GU19DTElFTlQoZGlyKSwgTkZTUFJPQ19TWU1MSU5LLCAmYXJnLCBOVUxMLCAwKTsKKwlkcHJpbnRrKCJORlMgcmVwbHkgc3ltbGluazogJWRcbiIsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludAorbmZzX3Byb2NfbWtkaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICpzYXR0cikKK3sKKwlzdHJ1Y3QgbmZzX2ZoIGZoYW5kbGU7CisJc3RydWN0IG5mc19mYXR0ciBmYXR0cjsKKwlzdHJ1Y3QgbmZzX2NyZWF0ZWFyZ3MJYXJnID0geworCQkuZmgJCT0gTkZTX0ZIKGRpciksCisJCS5uYW1lCQk9IGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCS5sZW4JCT0gZGVudHJ5LT5kX25hbWUubGVuLAorCQkuc2F0dHIJCT0gc2F0dHIKKwl9OworCXN0cnVjdCBuZnNfZGlyb3BvawlyZXMgPSB7CisJCS5maAkJPSAmZmhhbmRsZSwKKwkJLmZhdHRyCQk9ICZmYXR0cgorCX07CisJaW50CQkJc3RhdHVzOworCisJZHByaW50aygiTkZTIGNhbGwgIG1rZGlyICVzXG4iLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwlmYXR0ci52YWxpZCA9IDA7CisJc3RhdHVzID0gcnBjX2NhbGwoTkZTX0NMSUVOVChkaXIpLCBORlNQUk9DX01LRElSLCAmYXJnLCAmcmVzLCAwKTsKKwlpZiAoc3RhdHVzID09IDApCisJCXN0YXR1cyA9IG5mc19pbnN0YW50aWF0ZShkZW50cnksICZmaGFuZGxlLCAmZmF0dHIpOworCWRwcmludGsoIk5GUyByZXBseSBta2RpcjogJWRcbiIsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludAorbmZzX3Byb2Nfcm1kaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBxc3RyICpuYW1lKQoreworCXN0cnVjdCBuZnNfZGlyb3BhcmdzCWFyZyA9IHsKKwkJLmZoCQk9IE5GU19GSChkaXIpLAorCQkubmFtZQkJPSBuYW1lLT5uYW1lLAorCQkubGVuCQk9IG5hbWUtPmxlbgorCX07CisJaW50CQkJc3RhdHVzOworCisJZHByaW50aygiTkZTIGNhbGwgIHJtZGlyICVzXG4iLCBuYW1lLT5uYW1lKTsKKwlzdGF0dXMgPSBycGNfY2FsbChORlNfQ0xJRU5UKGRpciksIE5GU1BST0NfUk1ESVIsICZhcmcsIE5VTEwsIDApOworCWRwcmludGsoIk5GUyByZXBseSBybWRpcjogJWRcbiIsIHN0YXR1cyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIFRoZSBSRUFERElSIGltcGxlbWVudGF0aW9uIGlzIHNvbWV3aGF0IGhhY2tpc2ggLSB3ZSBwYXNzIGEgdGVtcG9yYXJ5CisgKiBidWZmZXIgdG8gdGhlIGVuY29kZSBmdW5jdGlvbiwgd2hpY2ggaW5zdGFsbHMgaXQgaW4gdGhlIHJlY2VpdmUKKyAqIHRoZSByZWNlaXZlIGlvdmVjLiBUaGUgZGVjb2RlIGZ1bmN0aW9uIGp1c3QgcGFyc2VzIHRoZSByZXBseSB0byBtYWtlCisgKiBzdXJlIGl0IGlzIHN5bnRhY3RpY2FsbHkgY29ycmVjdDsgdGhlIGVudHJpZXMgaXRzZWxmIGFyZSBkZWNvZGVkCisgKiBmcm9tIG5mc19yZWFkZGlyIGJ5IGNhbGxpbmcgdGhlIGRlY29kZV9lbnRyeSBmdW5jdGlvbiBkaXJlY3RseS4KKyAqLworc3RhdGljIGludAorbmZzX3Byb2NfcmVhZGRpcihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBycGNfY3JlZCAqY3JlZCwKKwkJIHU2NCBjb29raWUsIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBpbnQgY291bnQsIGludCBwbHVzKQoreworCXN0cnVjdCBpbm9kZQkJKmRpciA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgbmZzX3JlYWRkaXJhcmdzCWFyZyA9IHsKKwkJLmZoCQk9IE5GU19GSChkaXIpLAorCQkuY29va2llCQk9IGNvb2tpZSwKKwkJLmNvdW50CQk9IGNvdW50LAorCQkucGFnZXMJCT0gJnBhZ2UKKwl9OworCXN0cnVjdCBycGNfbWVzc2FnZQltc2cgPSB7CisJCS5ycGNfcHJvYwk9ICZuZnNfcHJvY2VkdXJlc1tORlNQUk9DX1JFQURESVJdLAorCQkucnBjX2FyZ3AJPSAmYXJnLAorCQkucnBjX3Jlc3AJPSBOVUxMLAorCQkucnBjX2NyZWQJPSBjcmVkCisJfTsKKwlpbnQJCQlzdGF0dXM7CisKKwlsb2NrX2tlcm5lbCgpOworCisJZHByaW50aygiTkZTIGNhbGwgIHJlYWRkaXIgJWRcbiIsICh1bnNpZ25lZCBpbnQpY29va2llKTsKKwlzdGF0dXMgPSBycGNfY2FsbF9zeW5jKE5GU19DTElFTlQoZGlyKSwgJm1zZywgMCk7CisKKwlkcHJpbnRrKCJORlMgcmVwbHkgcmVhZGRpcjogJWRcbiIsIHN0YXR1cyk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQKK25mc19wcm9jX3N0YXRmcyhzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlLAorCQkJc3RydWN0IG5mc19mc3N0YXQgKnN0YXQpCit7CisJc3RydWN0IG5mczJfZnNzdGF0IGZzaW5mbzsKKwlpbnQJc3RhdHVzOworCisJZHByaW50aygiTkZTIGNhbGwgIHN0YXRmc1xuIik7CisJc3RhdC0+ZmF0dHItPnZhbGlkID0gMDsKKwlzdGF0dXMgPSBycGNfY2FsbChzZXJ2ZXItPmNsaWVudCwgTkZTUFJPQ19TVEFURlMsIGZoYW5kbGUsICZmc2luZm8sIDApOworCWRwcmludGsoIk5GUyByZXBseSBzdGF0ZnM6ICVkXG4iLCBzdGF0dXMpOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0OworCXN0YXQtPnRieXRlcyA9ICh1NjQpZnNpbmZvLmJsb2NrcyAqIGZzaW5mby5ic2l6ZTsKKwlzdGF0LT5mYnl0ZXMgPSAodTY0KWZzaW5mby5iZnJlZSAgKiBmc2luZm8uYnNpemU7CisJc3RhdC0+YWJ5dGVzID0gKHU2NClmc2luZm8uYmF2YWlsICogZnNpbmZvLmJzaXplOworCXN0YXQtPnRmaWxlcyA9IDA7CisJc3RhdC0+ZmZpbGVzID0gMDsKKwlzdGF0LT5hZmlsZXMgPSAwOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQKK25mc19wcm9jX2ZzaW5mbyhzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmZzX2ZoICpmaGFuZGxlLAorCQkJc3RydWN0IG5mc19mc2luZm8gKmluZm8pCit7CisJc3RydWN0IG5mczJfZnNzdGF0IGZzaW5mbzsKKwlpbnQJc3RhdHVzOworCisJZHByaW50aygiTkZTIGNhbGwgIGZzaW5mb1xuIik7CisJaW5mby0+ZmF0dHItPnZhbGlkID0gMDsKKwlzdGF0dXMgPSBycGNfY2FsbChzZXJ2ZXItPmNsaWVudCwgTkZTUFJPQ19TVEFURlMsIGZoYW5kbGUsICZmc2luZm8sIDApOworCWRwcmludGsoIk5GUyByZXBseSBmc2luZm86ICVkXG4iLCBzdGF0dXMpOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0OworCWluZm8tPnJ0bWF4ICA9IE5GU19NQVhEQVRBOworCWluZm8tPnJ0cHJlZiA9IGZzaW5mby50c2l6ZTsKKwlpbmZvLT5ydG11bHQgPSBmc2luZm8uYnNpemU7CisJaW5mby0+d3RtYXggID0gTkZTX01BWERBVEE7CisJaW5mby0+d3RwcmVmID0gZnNpbmZvLnRzaXplOworCWluZm8tPnd0bXVsdCA9IGZzaW5mby5ic2l6ZTsKKwlpbmZvLT5kdHByZWYgPSBmc2luZm8udHNpemU7CisJaW5mby0+bWF4ZmlsZXNpemUgPSAweDdGRkZGRkZGOworCWluZm8tPmxlYXNlX3RpbWUgPSAwOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQKK25mc19wcm9jX3BhdGhjb25mKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBuZnNfZmggKmZoYW5kbGUsCisJCSAgc3RydWN0IG5mc19wYXRoY29uZiAqaW5mbykKK3sKKwlpbmZvLT5tYXhfbGluayA9IDA7CisJaW5mby0+bWF4X25hbWVsZW4gPSBORlMyX01BWE5BTUxFTjsKKwlyZXR1cm4gMDsKK30KKworZXh0ZXJuIHUzMiAqIG5mc19kZWNvZGVfZGlyZW50KHUzMiAqLCBzdHJ1Y3QgbmZzX2VudHJ5ICosIGludCk7CisKK3N0YXRpYyB2b2lkCituZnNfcmVhZF9kb25lKHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgbmZzX3JlYWRfZGF0YSAqZGF0YSA9IChzdHJ1Y3QgbmZzX3JlYWRfZGF0YSAqKSB0YXNrLT50a19jYWxsZGF0YTsKKworCWlmICh0YXNrLT50a19zdGF0dXMgPj0gMCkgeworCQluZnNfcmVmcmVzaF9pbm9kZShkYXRhLT5pbm9kZSwgZGF0YS0+cmVzLmZhdHRyKTsKKwkJLyogRW11bGF0ZSB0aGUgZW9mIGZsYWcsIHdoaWNoIGlzbid0IG5vcm1hbGx5IG5lZWRlZCBpbiBORlN2MgorCQkgKiBhcyBpdCBpcyBndWFyYW50ZWVkIHRvIGFsd2F5cyByZXR1cm4gdGhlIGZpbGUgYXR0cmlidXRlcworCQkgKi8KKwkJaWYgKGRhdGEtPmFyZ3Mub2Zmc2V0ICsgZGF0YS0+YXJncy5jb3VudCA+PSBkYXRhLT5yZXMuZmF0dHItPnNpemUpCisJCQlkYXRhLT5yZXMuZW9mID0gMTsKKwl9CisJbmZzX3JlYWRwYWdlX3Jlc3VsdCh0YXNrKTsKK30KKworc3RhdGljIHZvaWQKK25mc19wcm9jX3JlYWRfc2V0dXAoc3RydWN0IG5mc19yZWFkX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IHJwY190YXNrCQkqdGFzayA9ICZkYXRhLT50YXNrOworCXN0cnVjdCBpbm9kZQkJKmlub2RlID0gZGF0YS0+aW5vZGU7CisJaW50CQkJZmxhZ3M7CisJc3RydWN0IHJwY19tZXNzYWdlCW1zZyA9IHsKKwkJLnJwY19wcm9jCT0gJm5mc19wcm9jZWR1cmVzW05GU1BST0NfUkVBRF0sCisJCS5ycGNfYXJncAk9ICZkYXRhLT5hcmdzLAorCQkucnBjX3Jlc3AJPSAmZGF0YS0+cmVzLAorCQkucnBjX2NyZWQJPSBkYXRhLT5jcmVkLAorCX07CisKKwkvKiBOLkIuIERvIHdlIG5lZWQgdG8gdGVzdD8gTmV2ZXIgY2FsbGVkIGZvciBzd2FwZmlsZSBpbm9kZSAqLworCWZsYWdzID0gUlBDX1RBU0tfQVNZTkMgfCAoSVNfU1dBUEZJTEUoaW5vZGUpPyBORlNfUlBDX1NXQVBGTEFHUyA6IDApOworCisJLyogRmluYWxpemUgdGhlIHRhc2suICovCisJcnBjX2luaXRfdGFzayh0YXNrLCBORlNfQ0xJRU5UKGlub2RlKSwgbmZzX3JlYWRfZG9uZSwgZmxhZ3MpOworCXJwY19jYWxsX3NldHVwKHRhc2ssICZtc2csIDApOworfQorCitzdGF0aWMgdm9pZAorbmZzX3dyaXRlX2RvbmUoc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCXN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqZGF0YSA9IChzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKikgdGFzay0+dGtfY2FsbGRhdGE7CisKKwlpZiAodGFzay0+dGtfc3RhdHVzID49IDApCisJCW5mc19yZWZyZXNoX2lub2RlKGRhdGEtPmlub2RlLCBkYXRhLT5yZXMuZmF0dHIpOworCW5mc193cml0ZWJhY2tfZG9uZSh0YXNrKTsKK30KKworc3RhdGljIHZvaWQKK25mc19wcm9jX3dyaXRlX3NldHVwKHN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqZGF0YSwgaW50IGhvdykKK3sKKwlzdHJ1Y3QgcnBjX3Rhc2sJCSp0YXNrID0gJmRhdGEtPnRhc2s7CisJc3RydWN0IGlub2RlCQkqaW5vZGUgPSBkYXRhLT5pbm9kZTsKKwlpbnQJCQlmbGFnczsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UJbXNnID0geworCQkucnBjX3Byb2MJPSAmbmZzX3Byb2NlZHVyZXNbTkZTUFJPQ19XUklURV0sCisJCS5ycGNfYXJncAk9ICZkYXRhLT5hcmdzLAorCQkucnBjX3Jlc3AJPSAmZGF0YS0+cmVzLAorCQkucnBjX2NyZWQJPSBkYXRhLT5jcmVkLAorCX07CisKKwkvKiBOb3RlOiBORlN2MiBpZ25vcmVzIEBzdGFibGUgYW5kIGFsd2F5cyB1c2VzIE5GU19GSUxFX1NZTkMgKi8KKwlkYXRhLT5hcmdzLnN0YWJsZSA9IE5GU19GSUxFX1NZTkM7CisKKwkvKiBTZXQgdGhlIGluaXRpYWwgZmxhZ3MgZm9yIHRoZSB0YXNrLiAgKi8KKwlmbGFncyA9IChob3cgJiBGTFVTSF9TWU5DKSA/IDAgOiBSUENfVEFTS19BU1lOQzsKKworCS8qIEZpbmFsaXplIHRoZSB0YXNrLiAqLworCXJwY19pbml0X3Rhc2sodGFzaywgTkZTX0NMSUVOVChpbm9kZSksIG5mc193cml0ZV9kb25lLCBmbGFncyk7CisJcnBjX2NhbGxfc2V0dXAodGFzaywgJm1zZywgMCk7Cit9CisKK3N0YXRpYyB2b2lkCituZnNfcHJvY19jb21taXRfc2V0dXAoc3RydWN0IG5mc193cml0ZV9kYXRhICpkYXRhLCBpbnQgaG93KQoreworCUJVRygpOworfQorCitzdGF0aWMgaW50CituZnNfcHJvY19sb2NrKHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgY21kLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwlyZXR1cm4gbmxtY2xudF9wcm9jKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlLCBjbWQsIGZsKTsKK30KKworCitzdHJ1Y3QgbmZzX3JwY19vcHMJbmZzX3YyX2NsaWVudG9wcyA9IHsKKwkudmVyc2lvbgk9IDIsCQkgICAgICAgLyogcHJvdG9jb2wgdmVyc2lvbiAqLworCS5kZW50cnlfb3BzCT0gJm5mc19kZW50cnlfb3BlcmF0aW9ucywKKwkuZGlyX2lub2RlX29wcwk9ICZuZnNfZGlyX2lub2RlX29wZXJhdGlvbnMsCisJLmdldHJvb3QJPSBuZnNfcHJvY19nZXRfcm9vdCwKKwkuZ2V0YXR0cgk9IG5mc19wcm9jX2dldGF0dHIsCisJLnNldGF0dHIJPSBuZnNfcHJvY19zZXRhdHRyLAorCS5sb29rdXAJCT0gbmZzX3Byb2NfbG9va3VwLAorCS5hY2Nlc3MJCT0gTlVMTCwJCSAgICAgICAvKiBhY2Nlc3MgKi8KKwkucmVhZGxpbmsJPSBuZnNfcHJvY19yZWFkbGluaywKKwkucmVhZAkJPSBuZnNfcHJvY19yZWFkLAorCS53cml0ZQkJPSBuZnNfcHJvY193cml0ZSwKKwkuY29tbWl0CQk9IE5VTEwsCQkgICAgICAgLyogY29tbWl0ICovCisJLmNyZWF0ZQkJPSBuZnNfcHJvY19jcmVhdGUsCisJLnJlbW92ZQkJPSBuZnNfcHJvY19yZW1vdmUsCisJLnVubGlua19zZXR1cAk9IG5mc19wcm9jX3VubGlua19zZXR1cCwKKwkudW5saW5rX2RvbmUJPSBuZnNfcHJvY191bmxpbmtfZG9uZSwKKwkucmVuYW1lCQk9IG5mc19wcm9jX3JlbmFtZSwKKwkubGluawkJPSBuZnNfcHJvY19saW5rLAorCS5zeW1saW5rCT0gbmZzX3Byb2Nfc3ltbGluaywKKwkubWtkaXIJCT0gbmZzX3Byb2NfbWtkaXIsCisJLnJtZGlyCQk9IG5mc19wcm9jX3JtZGlyLAorCS5yZWFkZGlyCT0gbmZzX3Byb2NfcmVhZGRpciwKKwkubWtub2QJCT0gbmZzX3Byb2NfbWtub2QsCisJLnN0YXRmcwkJPSBuZnNfcHJvY19zdGF0ZnMsCisJLmZzaW5mbwkJPSBuZnNfcHJvY19mc2luZm8sCisJLnBhdGhjb25mCT0gbmZzX3Byb2NfcGF0aGNvbmYsCisJLmRlY29kZV9kaXJlbnQJPSBuZnNfZGVjb2RlX2RpcmVudCwKKwkucmVhZF9zZXR1cAk9IG5mc19wcm9jX3JlYWRfc2V0dXAsCisJLndyaXRlX3NldHVwCT0gbmZzX3Byb2Nfd3JpdGVfc2V0dXAsCisJLmNvbW1pdF9zZXR1cAk9IG5mc19wcm9jX2NvbW1pdF9zZXR1cCwKKwkuZmlsZV9vcGVuCT0gbmZzX29wZW4sCisJLmZpbGVfcmVsZWFzZQk9IG5mc19yZWxlYXNlLAorCS5sb2NrCQk9IG5mc19wcm9jX2xvY2ssCit9OwpkaWZmIC0tZ2l0IGEvZnMvbmZzL3JlYWQuYyBiL2ZzL25mcy9yZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAwNDJmYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25mcy9yZWFkLmMKQEAgLTAsMCArMSw2MTggQEAKKy8qCisgKiBsaW51eC9mcy9uZnMvcmVhZC5jCisgKgorICogQmxvY2sgSS9PIGZvciBORlMKKyAqCisgKiBQYXJ0aWFsIGNvcHkgb2YgTGludXMnIHJlYWQgY2FjaGUgbW9kaWZpY2F0aW9ucyB0byBmcy9uZnMvZmlsZS5jCisgKiBtb2RpZmllZCBmb3IgYXN5bmMgUlBDIGJ5IG9raXJAbW9uYWQuc3diLmRlCisgKgorICogV2UgZG8gYW4gdWdseSBoYWNrIGhlcmUgaW4gb3JkZXIgdG8gcmV0dXJuIHByb3BlciBlcnJvciBjb2RlcyB0byB0aGUKKyAqIHVzZXIgcHJvZ3JhbSB3aGVuIGEgcmVhZCByZXF1ZXN0IGZhaWxlZDogc2luY2UgZ2VuZXJpY19maWxlX3JlYWQKKyAqIG9ubHkgY2hlY2tzIHRoZSByZXR1cm4gdmFsdWUgb2YgaW5vZGUtPmlfb3AtPnJlYWRwYWdlKCkgd2hpY2ggaXMgYWx3YXlzIDAKKyAqIGZvciBhc3luYyBSUEMsIHdlIHNldCB0aGUgZXJyb3IgYml0IG9mIHRoZSBwYWdlIHRvIDEgd2hlbiBhbiBlcnJvciBvY2N1cnMsCisgKiBhbmQgbWFrZSBuZnNfcmVhZHBhZ2UgdHJhbnNtaXQgcmVxdWVzdHMgc3luY2hyb25vdXNseSB3aGVuIGVuY291bnRlcmluZyB0aGlzLgorICogVGhpcyBpcyBvbmx5IGEgc21hbGwgcHJvYmxlbSwgdGhvdWdoLCBzaW5jZSB3ZSBub3cgcmV0cnkgYWxsIG9wZXJhdGlvbnMKKyAqIHdpdGhpbiB0aGUgUlBDIGNvZGUgd2hlbiByb290IHNxdWFzaGluZyBpcyBzdXNwZWN0ZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19wYWdlLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2RlZmluZSBORlNEQkdfRkFDSUxJVFkJCU5GU0RCR19QQUdFQ0FDSEUKKworc3RhdGljIGludCBuZnNfcGFnZWluX29uZShzdHJ1Y3QgbGlzdF9oZWFkICosIHN0cnVjdCBpbm9kZSAqKTsKK3N0YXRpYyB2b2lkIG5mc19yZWFkcGFnZV9yZXN1bHRfcGFydGlhbChzdHJ1Y3QgbmZzX3JlYWRfZGF0YSAqLCBpbnQpOworc3RhdGljIHZvaWQgbmZzX3JlYWRwYWdlX3Jlc3VsdF9mdWxsKHN0cnVjdCBuZnNfcmVhZF9kYXRhICosIGludCk7CisKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKm5mc19yZGF0YV9jYWNoZXA7CittZW1wb29sX3QgKm5mc19yZGF0YV9tZW1wb29sOworCisjZGVmaW5lIE1JTl9QT09MX1JFQUQJKDMyKQorCit2b2lkIG5mc19yZWFkZGF0YV9yZWxlYXNlKHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKyAgICAgICAgc3RydWN0IG5mc19yZWFkX2RhdGEgICAqZGF0YSA9IChzdHJ1Y3QgbmZzX3JlYWRfZGF0YSAqKXRhc2stPnRrX2NhbGxkYXRhOworICAgICAgICBuZnNfcmVhZGRhdGFfZnJlZShkYXRhKTsKK30KKworc3RhdGljCit1bnNpZ25lZCBpbnQgbmZzX3BhZ2VfbGVuZ3RoKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCWxvZmZfdCBpX3NpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CisJdW5zaWduZWQgbG9uZyBpZHg7CisKKwlpZiAoaV9zaXplIDw9IDApCisJCXJldHVybiAwOworCWlkeCA9IChpX3NpemUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCWlmIChwYWdlLT5pbmRleCA+IGlkeCkKKwkJcmV0dXJuIDA7CisJaWYgKHBhZ2UtPmluZGV4ICE9IGlkeCkKKwkJcmV0dXJuIFBBR0VfQ0FDSEVfU0laRTsKKwlyZXR1cm4gMSArICgoaV9zaXplIC0gMSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpOworfQorCitzdGF0aWMKK2ludCBuZnNfcmV0dXJuX2VtcHR5X3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJbWVtY2xlYXJfaGlnaHBhZ2VfZmx1c2gocGFnZSwgMCwgUEFHRV9DQUNIRV9TSVpFKTsKKwlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkIGEgcGFnZSBzeW5jaHJvbm91c2x5LgorICovCitzdGF0aWMgaW50IG5mc19yZWFkcGFnZV9zeW5jKHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHgsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCXN0cnVjdCBwYWdlICpwYWdlKQoreworCXVuc2lnbmVkIGludAlyc2l6ZSA9IE5GU19TRVJWRVIoaW5vZGUpLT5yc2l6ZTsKKwl1bnNpZ25lZCBpbnQJY291bnQgPSBQQUdFX0NBQ0hFX1NJWkU7CisJaW50CQlyZXN1bHQ7CisJc3RydWN0IG5mc19yZWFkX2RhdGEgKnJkYXRhOworCisJcmRhdGEgPSBuZnNfcmVhZGRhdGFfYWxsb2MoKTsKKwlpZiAoIXJkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldChyZGF0YSwgMCwgc2l6ZW9mKCpyZGF0YSkpOworCXJkYXRhLT5mbGFncyA9IChJU19TV0FQRklMRShpbm9kZSk/IE5GU19SUENfU1dBUEZMQUdTIDogMCk7CisJcmRhdGEtPmNyZWQgPSBjdHgtPmNyZWQ7CisJcmRhdGEtPmlub2RlID0gaW5vZGU7CisJSU5JVF9MSVNUX0hFQUQoJnJkYXRhLT5wYWdlcyk7CisJcmRhdGEtPmFyZ3MuZmggPSBORlNfRkgoaW5vZGUpOworCXJkYXRhLT5hcmdzLmNvbnRleHQgPSBjdHg7CisJcmRhdGEtPmFyZ3MucGFnZXMgPSAmcGFnZTsKKwlyZGF0YS0+YXJncy5wZ2Jhc2UgPSAwVUw7CisJcmRhdGEtPmFyZ3MuY291bnQgPSByc2l6ZTsKKwlyZGF0YS0+cmVzLmZhdHRyID0gJnJkYXRhLT5mYXR0cjsKKworCWRwcmludGsoIk5GUzogbmZzX3JlYWRwYWdlX3N5bmMoJXApXG4iLCBwYWdlKTsKKworCS8qCisJICogVGhpcyB3b3JrcyBub3cgYmVjYXVzZSB0aGUgc29ja2V0IGxheWVyIG5ldmVyIHRyaWVzIHRvIERNQQorCSAqIGludG8gdGhpcyBidWZmZXIgZGlyZWN0bHkuCisJICovCisJZG8geworCQlpZiAoY291bnQgPCByc2l6ZSkKKwkJCXJkYXRhLT5hcmdzLmNvdW50ID0gY291bnQ7CisJCXJkYXRhLT5yZXMuY291bnQgPSByZGF0YS0+YXJncy5jb3VudDsKKwkJcmRhdGEtPmFyZ3Mub2Zmc2V0ID0gcGFnZV9vZmZzZXQocGFnZSkgKyByZGF0YS0+YXJncy5wZ2Jhc2U7CisKKwkJZHByaW50aygiTkZTOiBuZnNfcHJvY19yZWFkKCVzLCAoJXMvJUxkKSwgJUx1LCAldSlcbiIsCisJCQlORlNfU0VSVkVSKGlub2RlKS0+aG9zdG5hbWUsCisJCQlpbm9kZS0+aV9zYi0+c19pZCwKKwkJCShsb25nIGxvbmcpTkZTX0ZJTEVJRChpbm9kZSksCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXJkYXRhLT5hcmdzLnBnYmFzZSwKKwkJCXJkYXRhLT5hcmdzLmNvdW50KTsKKworCQlsb2NrX2tlcm5lbCgpOworCQlyZXN1bHQgPSBORlNfUFJPVE8oaW5vZGUpLT5yZWFkKHJkYXRhKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCisJCS8qCisJCSAqIEV2ZW4gaWYgd2UgaGFkIGEgcGFydGlhbCBzdWNjZXNzIHdlIGNhbid0IG1hcmsgdGhlIHBhZ2UKKwkJICogY2FjaGUgdmFsaWQuCisJCSAqLworCQlpZiAocmVzdWx0IDwgMCkgeworCQkJaWYgKHJlc3VsdCA9PSAtRUlTRElSKQorCQkJCXJlc3VsdCA9IC1FSU5WQUw7CisJCQlnb3RvIGlvX2Vycm9yOworCQl9CisJCWNvdW50IC09IHJlc3VsdDsKKwkJcmRhdGEtPmFyZ3MucGdiYXNlICs9IHJlc3VsdDsKKwkJLyogTm90ZTogcmVzdWx0ID09IDAgc2hvdWxkIG9ubHkgaGFwcGVuIGlmIHdlJ3JlIGNhY2hpbmcKKwkJICogYSB3cml0ZSB0aGF0IGV4dGVuZHMgdGhlIGZpbGUgYW5kIHB1bmNoZXMgYSBob2xlLgorCQkgKi8KKwkJaWYgKHJkYXRhLT5yZXMuZW9mICE9IDAgfHwgcmVzdWx0ID09IDApCisJCQlicmVhazsKKwl9IHdoaWxlIChjb3VudCk7CisJTkZTX0ZMQUdTKGlub2RlKSB8PSBORlNfSU5PX0lOVkFMSURfQVRJTUU7CisKKwlpZiAoY291bnQpCisJCW1lbWNsZWFyX2hpZ2hwYWdlX2ZsdXNoKHBhZ2UsIHJkYXRhLT5hcmdzLnBnYmFzZSwgY291bnQpOworCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwlpZiAoUGFnZUVycm9yKHBhZ2UpKQorCQlDbGVhclBhZ2VFcnJvcihwYWdlKTsKKwlyZXN1bHQgPSAwOworCitpb19lcnJvcjoKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwluZnNfcmVhZGRhdGFfZnJlZShyZGF0YSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBuZnNfcmVhZHBhZ2VfYXN5bmMoc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJTElTVF9IRUFEKG9uZV9yZXF1ZXN0KTsKKwlzdHJ1Y3QgbmZzX3BhZ2UJKm5ldzsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJbGVuID0gbmZzX3BhZ2VfbGVuZ3RoKGlub2RlLCBwYWdlKTsKKwlpZiAobGVuID09IDApCisJCXJldHVybiBuZnNfcmV0dXJuX2VtcHR5X3BhZ2UocGFnZSk7CisJbmV3ID0gbmZzX2NyZWF0ZV9yZXF1ZXN0KGN0eCwgaW5vZGUsIHBhZ2UsIDAsIGxlbik7CisJaWYgKElTX0VSUihuZXcpKSB7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQlyZXR1cm4gUFRSX0VSUihuZXcpOworCX0KKwlpZiAobGVuIDwgUEFHRV9DQUNIRV9TSVpFKQorCQltZW1jbGVhcl9oaWdocGFnZV9mbHVzaChwYWdlLCBsZW4sIFBBR0VfQ0FDSEVfU0laRSAtIGxlbik7CisKKwluZnNfbG9ja19yZXF1ZXN0KG5ldyk7CisJbmZzX2xpc3RfYWRkX3JlcXVlc3QobmV3LCAmb25lX3JlcXVlc3QpOworCW5mc19wYWdlaW5fb25lKCZvbmVfcmVxdWVzdCwgaW5vZGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBuZnNfcmVhZHBhZ2VfcmVsZWFzZShzdHJ1Y3QgbmZzX3BhZ2UgKnJlcSkKK3sKKwl1bmxvY2tfcGFnZShyZXEtPndiX3BhZ2UpOworCisJbmZzX2NsZWFyX3JlcXVlc3QocmVxKTsKKwluZnNfcmVsZWFzZV9yZXF1ZXN0KHJlcSk7CisJbmZzX3VubG9ja19yZXF1ZXN0KHJlcSk7CisKKwlkcHJpbnRrKCJORlM6IHJlYWQgZG9uZSAoJXMvJUxkICVkQCVMZClcbiIsCisJCQlyZXEtPndiX2NvbnRleHQtPmRlbnRyeS0+ZF9pbm9kZS0+aV9zYi0+c19pZCwKKwkJCShsb25nIGxvbmcpTkZTX0ZJTEVJRChyZXEtPndiX2NvbnRleHQtPmRlbnRyeS0+ZF9pbm9kZSksCisJCQlyZXEtPndiX2J5dGVzLAorCQkJKGxvbmcgbG9uZylyZXFfb2Zmc2V0KHJlcSkpOworfQorCisvKgorICogU2V0IHVwIHRoZSBORlMgcmVhZCByZXF1ZXN0IHN0cnVjdAorICovCitzdGF0aWMgdm9pZCBuZnNfcmVhZF9ycGNzZXR1cChzdHJ1Y3QgbmZzX3BhZ2UgKnJlcSwgc3RydWN0IG5mc19yZWFkX2RhdGEgKmRhdGEsCisJCXVuc2lnbmVkIGludCBjb3VudCwgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZTsKKworCWRhdGEtPnJlcQkgID0gcmVxOworCWRhdGEtPmlub2RlCSAgPSBpbm9kZSA9IHJlcS0+d2JfY29udGV4dC0+ZGVudHJ5LT5kX2lub2RlOworCWRhdGEtPmNyZWQJICA9IHJlcS0+d2JfY29udGV4dC0+Y3JlZDsKKworCWRhdGEtPmFyZ3MuZmggICAgID0gTkZTX0ZIKGlub2RlKTsKKwlkYXRhLT5hcmdzLm9mZnNldCA9IHJlcV9vZmZzZXQocmVxKSArIG9mZnNldDsKKwlkYXRhLT5hcmdzLnBnYmFzZSA9IHJlcS0+d2JfcGdiYXNlICsgb2Zmc2V0OworCWRhdGEtPmFyZ3MucGFnZXMgID0gZGF0YS0+cGFnZXZlYzsKKwlkYXRhLT5hcmdzLmNvdW50ICA9IGNvdW50OworCWRhdGEtPmFyZ3MuY29udGV4dCA9IHJlcS0+d2JfY29udGV4dDsKKworCWRhdGEtPnJlcy5mYXR0ciAgID0gJmRhdGEtPmZhdHRyOworCWRhdGEtPnJlcy5jb3VudCAgID0gY291bnQ7CisJZGF0YS0+cmVzLmVvZiAgICAgPSAwOworCisJTkZTX1BST1RPKGlub2RlKS0+cmVhZF9zZXR1cChkYXRhKTsKKworCWRhdGEtPnRhc2sudGtfY29va2llID0gKHVuc2lnbmVkIGxvbmcpaW5vZGU7CisJZGF0YS0+dGFzay50a19jYWxsZGF0YSA9IGRhdGE7CisJLyogUmVsZWFzZSByZXF1ZXN0cyAqLworCWRhdGEtPnRhc2sudGtfcmVsZWFzZSA9IG5mc19yZWFkZGF0YV9yZWxlYXNlOworCisJZHByaW50aygiTkZTOiAlNGQgaW5pdGlhdGVkIHJlYWQgY2FsbCAocmVxICVzLyVMZCwgJXUgYnl0ZXMgQCBvZmZzZXQgJUx1KVxuIiwKKwkJCWRhdGEtPnRhc2sudGtfcGlkLAorCQkJaW5vZGUtPmlfc2ItPnNfaWQsCisJCQkobG9uZyBsb25nKU5GU19GSUxFSUQoaW5vZGUpLAorCQkJY291bnQsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWRhdGEtPmFyZ3Mub2Zmc2V0KTsKK30KKworc3RhdGljIHZvaWQKK25mc19hc3luY19yZWFkX2Vycm9yKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IG5mc19wYWdlCSpyZXE7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoaGVhZCkpIHsKKwkJcmVxID0gbmZzX2xpc3RfZW50cnkoaGVhZC0+bmV4dCk7CisJCW5mc19saXN0X3JlbW92ZV9yZXF1ZXN0KHJlcSk7CisJCVNldFBhZ2VFcnJvcihyZXEtPndiX3BhZ2UpOworCQluZnNfcmVhZHBhZ2VfcmVsZWFzZShyZXEpOworCX0KK30KKworLyoKKyAqIFN0YXJ0IGFuIGFzeW5jIHJlYWQgb3BlcmF0aW9uCisgKi8KK3N0YXRpYyB2b2lkIG5mc19leGVjdXRlX3JlYWQoc3RydWN0IG5mc19yZWFkX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IHJwY19jbG50ICpjbG50ID0gTkZTX0NMSUVOVChkYXRhLT5pbm9kZSk7CisJc2lnc2V0X3Qgb2xkc2V0OworCisJcnBjX2NsbnRfc2lnbWFzayhjbG50LCAmb2xkc2V0KTsKKwlsb2NrX2tlcm5lbCgpOworCXJwY19leGVjdXRlKCZkYXRhLT50YXNrKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcnBjX2NsbnRfc2lndW5tYXNrKGNsbnQsICZvbGRzZXQpOworfQorCisvKgorICogR2VuZXJhdGUgbXVsdGlwbGUgcmVxdWVzdHMgdG8gZmlsbCBhIHNpbmdsZSBwYWdlLgorICoKKyAqIFdlIG9wdGltaXplIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHJlYWQgb3BlcmF0aW9ucyBvbiB0aGUgd2lyZS4gIElmIHdlCisgKiBkZXRlY3QgdGhhdCB3ZSdyZSByZWFkaW5nIGEgcGFnZSwgb3IgYW4gYXJlYSBvZiBhIHBhZ2UsIHRoYXQgaXMgcGFzdCB0aGUKKyAqIGVuZCBvZiBmaWxlLCB3ZSBkbyBub3QgZ2VuZXJhdGUgTkZTIHJlYWQgb3BlcmF0aW9ucyBidXQganVzdCBjbGVhciB0aGUKKyAqIHBhcnRzIG9mIHRoZSBwYWdlIHRoYXQgd291bGQgaGF2ZSBjb21lIGJhY2sgemVybyBmcm9tIHRoZSBzZXJ2ZXIgYW55d2F5LgorICoKKyAqIFdlIHJlbHkgb24gdGhlIGNhY2hlZCB2YWx1ZSBvZiBpX3NpemUgdG8gbWFrZSB0aGlzIGRldGVybWluYXRpb247IGFub3RoZXIKKyAqIGNsaWVudCBjYW4gZmlsbCBwYWdlcyBvbiB0aGUgc2VydmVyIHBhc3Qgb3VyIGNhY2hlZCBlbmQtb2YtZmlsZSwgYnV0IHdlCisgKiB3b24ndCBzZWUgdGhlIG5ldyBkYXRhIHVudGlsIG91ciBhdHRyaWJ1dGUgY2FjaGUgaXMgdXBkYXRlZC4gIFRoaXMgaXMgbW9yZQorICogb3IgbGVzcyBjb252ZW50aW9uYWwgTkZTIGNsaWVudCBiZWhhdmlvci4KKyAqLworc3RhdGljIGludCBuZnNfcGFnZWluX211bHRpKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IG5mc19wYWdlICpyZXEgPSBuZnNfbGlzdF9lbnRyeShoZWFkLT5uZXh0KTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHJlcS0+d2JfcGFnZTsKKwlzdHJ1Y3QgbmZzX3JlYWRfZGF0YSAqZGF0YTsKKwl1bnNpZ25lZCBpbnQgcnNpemUgPSBORlNfU0VSVkVSKGlub2RlKS0+cnNpemU7CisJdW5zaWduZWQgaW50IG5ieXRlcywgb2Zmc2V0OworCWludCByZXF1ZXN0cyA9IDA7CisJTElTVF9IRUFEKGxpc3QpOworCisJbmZzX2xpc3RfcmVtb3ZlX3JlcXVlc3QocmVxKTsKKworCW5ieXRlcyA9IHJlcS0+d2JfYnl0ZXM7CisJZm9yKDs7KSB7CisJCWRhdGEgPSBuZnNfcmVhZGRhdGFfYWxsb2MoKTsKKwkJaWYgKCFkYXRhKQorCQkJZ290byBvdXRfYmFkOworCQlJTklUX0xJU1RfSEVBRCgmZGF0YS0+cGFnZXMpOworCQlsaXN0X2FkZCgmZGF0YS0+cGFnZXMsICZsaXN0KTsKKwkJcmVxdWVzdHMrKzsKKwkJaWYgKG5ieXRlcyA8PSByc2l6ZSkKKwkJCWJyZWFrOworCQluYnl0ZXMgLT0gcnNpemU7CisJfQorCWF0b21pY19zZXQoJnJlcS0+d2JfY29tcGxldGUsIHJlcXVlc3RzKTsKKworCUNsZWFyUGFnZUVycm9yKHBhZ2UpOworCW9mZnNldCA9IDA7CisJbmJ5dGVzID0gcmVxLT53Yl9ieXRlczsKKwlkbyB7CisJCWRhdGEgPSBsaXN0X2VudHJ5KGxpc3QubmV4dCwgc3RydWN0IG5mc19yZWFkX2RhdGEsIHBhZ2VzKTsKKwkJbGlzdF9kZWxfaW5pdCgmZGF0YS0+cGFnZXMpOworCisJCWRhdGEtPnBhZ2V2ZWNbMF0gPSBwYWdlOworCQlkYXRhLT5jb21wbGV0ZSA9IG5mc19yZWFkcGFnZV9yZXN1bHRfcGFydGlhbDsKKworCQlpZiAobmJ5dGVzID4gcnNpemUpIHsKKwkJCW5mc19yZWFkX3JwY3NldHVwKHJlcSwgZGF0YSwgcnNpemUsIG9mZnNldCk7CisJCQlvZmZzZXQgKz0gcnNpemU7CisJCQluYnl0ZXMgLT0gcnNpemU7CisJCX0gZWxzZSB7CisJCQluZnNfcmVhZF9ycGNzZXR1cChyZXEsIGRhdGEsIG5ieXRlcywgb2Zmc2V0KTsKKwkJCW5ieXRlcyA9IDA7CisJCX0KKwkJbmZzX2V4ZWN1dGVfcmVhZChkYXRhKTsKKwl9IHdoaWxlIChuYnl0ZXMgIT0gMCk7CisKKwlyZXR1cm4gMDsKKworb3V0X2JhZDoKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmxpc3QpKSB7CisJCWRhdGEgPSBsaXN0X2VudHJ5KGxpc3QubmV4dCwgc3RydWN0IG5mc19yZWFkX2RhdGEsIHBhZ2VzKTsKKwkJbGlzdF9kZWwoJmRhdGEtPnBhZ2VzKTsKKwkJbmZzX3JlYWRkYXRhX2ZyZWUoZGF0YSk7CisJfQorCVNldFBhZ2VFcnJvcihwYWdlKTsKKwluZnNfcmVhZHBhZ2VfcmVsZWFzZShyZXEpOworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgaW50IG5mc19wYWdlaW5fb25lKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IG5mc19wYWdlCQkqcmVxOworCXN0cnVjdCBwYWdlCQkqKnBhZ2VzOworCXN0cnVjdCBuZnNfcmVhZF9kYXRhCSpkYXRhOworCXVuc2lnbmVkIGludAkJY291bnQ7CisKKwlpZiAoTkZTX1NFUlZFUihpbm9kZSktPnJzaXplIDwgUEFHRV9DQUNIRV9TSVpFKQorCQlyZXR1cm4gbmZzX3BhZ2Vpbl9tdWx0aShoZWFkLCBpbm9kZSk7CisKKwlkYXRhID0gbmZzX3JlYWRkYXRhX2FsbG9jKCk7CisJaWYgKCFkYXRhKQorCQlnb3RvIG91dF9iYWQ7CisKKwlJTklUX0xJU1RfSEVBRCgmZGF0YS0+cGFnZXMpOworCXBhZ2VzID0gZGF0YS0+cGFnZXZlYzsKKwljb3VudCA9IDA7CisJd2hpbGUgKCFsaXN0X2VtcHR5KGhlYWQpKSB7CisJCXJlcSA9IG5mc19saXN0X2VudHJ5KGhlYWQtPm5leHQpOworCQluZnNfbGlzdF9yZW1vdmVfcmVxdWVzdChyZXEpOworCQluZnNfbGlzdF9hZGRfcmVxdWVzdChyZXEsICZkYXRhLT5wYWdlcyk7CisJCUNsZWFyUGFnZUVycm9yKHJlcS0+d2JfcGFnZSk7CisJCSpwYWdlcysrID0gcmVxLT53Yl9wYWdlOworCQljb3VudCArPSByZXEtPndiX2J5dGVzOworCX0KKwlyZXEgPSBuZnNfbGlzdF9lbnRyeShkYXRhLT5wYWdlcy5uZXh0KTsKKworCWRhdGEtPmNvbXBsZXRlID0gbmZzX3JlYWRwYWdlX3Jlc3VsdF9mdWxsOworCW5mc19yZWFkX3JwY3NldHVwKHJlcSwgZGF0YSwgY291bnQsIDApOworCisJbmZzX2V4ZWN1dGVfcmVhZChkYXRhKTsKKwlyZXR1cm4gMDsKK291dF9iYWQ6CisJbmZzX2FzeW5jX3JlYWRfZXJyb3IoaGVhZCk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyBpbnQKK25mc19wYWdlaW5fbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCBpbnQgcnBhZ2VzKQoreworCUxJU1RfSEVBRChvbmVfcmVxdWVzdCk7CisJc3RydWN0IG5mc19wYWdlCQkqcmVxOworCWludAkJCWVycm9yID0gMDsKKwl1bnNpZ25lZCBpbnQJCXBhZ2VzID0gMDsKKworCXdoaWxlICghbGlzdF9lbXB0eShoZWFkKSkgeworCQlwYWdlcyArPSBuZnNfY29hbGVzY2VfcmVxdWVzdHMoaGVhZCwgJm9uZV9yZXF1ZXN0LCBycGFnZXMpOworCQlyZXEgPSBuZnNfbGlzdF9lbnRyeShvbmVfcmVxdWVzdC5uZXh0KTsKKwkJZXJyb3IgPSBuZnNfcGFnZWluX29uZSgmb25lX3JlcXVlc3QsIHJlcS0+d2JfY29udGV4dC0+ZGVudHJ5LT5kX2lub2RlKTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCWJyZWFrOworCX0KKwlpZiAoZXJyb3IgPj0gMCkKKwkJcmV0dXJuIHBhZ2VzOworCisJbmZzX2FzeW5jX3JlYWRfZXJyb3IoaGVhZCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogSGFuZGxlIGEgcmVhZCByZXBseSB0aGF0IGZpbGxzIHBhcnQgb2YgYSBwYWdlLgorICovCitzdGF0aWMgdm9pZCBuZnNfcmVhZHBhZ2VfcmVzdWx0X3BhcnRpYWwoc3RydWN0IG5mc19yZWFkX2RhdGEgKmRhdGEsIGludCBzdGF0dXMpCit7CisJc3RydWN0IG5mc19wYWdlICpyZXEgPSBkYXRhLT5yZXE7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSByZXEtPndiX3BhZ2U7CisgCisJaWYgKHN0YXR1cyA+PSAwKSB7CisJCXVuc2lnbmVkIGludCByZXF1ZXN0ID0gZGF0YS0+YXJncy5jb3VudDsKKwkJdW5zaWduZWQgaW50IHJlc3VsdCA9IGRhdGEtPnJlcy5jb3VudDsKKworCQlpZiAocmVzdWx0IDwgcmVxdWVzdCkgeworCQkJbWVtY2xlYXJfaGlnaHBhZ2VfZmx1c2gocGFnZSwKKwkJCQkJCWRhdGEtPmFyZ3MucGdiYXNlICsgcmVzdWx0LAorCQkJCQkJcmVxdWVzdCAtIHJlc3VsdCk7CisJCX0KKwl9IGVsc2UKKwkJU2V0UGFnZUVycm9yKHBhZ2UpOworCisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnJlcS0+d2JfY29tcGxldGUpKSB7CisJCWlmICghUGFnZUVycm9yKHBhZ2UpKQorCQkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCQluZnNfcmVhZHBhZ2VfcmVsZWFzZShyZXEpOworCX0KK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIGNhbGxiYWNrIGZyb20gUlBDIHRlbGxpbmcgdXMgd2hldGhlciBhIHJlcGx5IHdhcworICogcmVjZWl2ZWQgb3Igc29tZSBlcnJvciBvY2N1cnJlZCAodGltZW91dCBvciBzb2NrZXQgc2h1dGRvd24pLgorICovCitzdGF0aWMgdm9pZCBuZnNfcmVhZHBhZ2VfcmVzdWx0X2Z1bGwoc3RydWN0IG5mc19yZWFkX2RhdGEgKmRhdGEsIGludCBzdGF0dXMpCit7CisJdW5zaWduZWQgaW50IGNvdW50ID0gZGF0YS0+cmVzLmNvdW50OworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZkYXRhLT5wYWdlcykpIHsKKwkJc3RydWN0IG5mc19wYWdlICpyZXEgPSBuZnNfbGlzdF9lbnRyeShkYXRhLT5wYWdlcy5uZXh0KTsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSByZXEtPndiX3BhZ2U7CisJCW5mc19saXN0X3JlbW92ZV9yZXF1ZXN0KHJlcSk7CisKKwkJaWYgKHN0YXR1cyA+PSAwKSB7CisJCQlpZiAoY291bnQgPCBQQUdFX0NBQ0hFX1NJWkUpIHsKKwkJCQlpZiAoY291bnQgPCByZXEtPndiX2J5dGVzKQorCQkJCQltZW1jbGVhcl9oaWdocGFnZV9mbHVzaChwYWdlLAorCQkJCQkJCXJlcS0+d2JfcGdiYXNlICsgY291bnQsCisJCQkJCQkJcmVxLT53Yl9ieXRlcyAtIGNvdW50KTsKKwkJCQljb3VudCA9IDA7CisJCQl9IGVsc2UKKwkJCQljb3VudCAtPSBQQUdFX0NBQ0hFX1NJWkU7CisJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJCX0gZWxzZQorCQkJU2V0UGFnZUVycm9yKHBhZ2UpOworCQluZnNfcmVhZHBhZ2VfcmVsZWFzZShyZXEpOworCX0KK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIGNhbGxiYWNrIGZyb20gUlBDIHRlbGxpbmcgdXMgd2hldGhlciBhIHJlcGx5IHdhcworICogcmVjZWl2ZWQgb3Igc29tZSBlcnJvciBvY2N1cnJlZCAodGltZW91dCBvciBzb2NrZXQgc2h1dGRvd24pLgorICovCit2b2lkIG5mc19yZWFkcGFnZV9yZXN1bHQoc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCXN0cnVjdCBuZnNfcmVhZF9kYXRhICpkYXRhID0gKHN0cnVjdCBuZnNfcmVhZF9kYXRhICopdGFzay0+dGtfY2FsbGRhdGE7CisJc3RydWN0IG5mc19yZWFkYXJncyAqYXJncCA9ICZkYXRhLT5hcmdzOworCXN0cnVjdCBuZnNfcmVhZHJlcyAqcmVzcCA9ICZkYXRhLT5yZXM7CisJaW50IHN0YXR1cyA9IHRhc2stPnRrX3N0YXR1czsKKworCWRwcmludGsoIk5GUzogJTRkIG5mc19yZWFkcGFnZV9yZXN1bHQsIChzdGF0dXMgJWQpXG4iLAorCQl0YXNrLT50a19waWQsIHN0YXR1cyk7CisKKwkvKiBJcyB0aGlzIGEgc2hvcnQgcmVhZD8gKi8KKwlpZiAodGFzay0+dGtfc3RhdHVzID49IDAgJiYgcmVzcC0+Y291bnQgPCBhcmdwLT5jb3VudCAmJiAhcmVzcC0+ZW9mKSB7CisJCS8qIEhhcyB0aGUgc2VydmVyIGF0IGxlYXN0IG1hZGUgc29tZSBwcm9ncmVzcz8gKi8KKwkJaWYgKHJlc3AtPmNvdW50ICE9IDApIHsKKwkJCS8qIFllcywgc28gcmV0cnkgdGhlIHJlYWQgYXQgdGhlIGVuZCBvZiB0aGUgZGF0YSAqLworCQkJYXJncC0+b2Zmc2V0ICs9IHJlc3AtPmNvdW50OworCQkJYXJncC0+cGdiYXNlICs9IHJlc3AtPmNvdW50OworCQkJYXJncC0+Y291bnQgLT0gcmVzcC0+Y291bnQ7CisJCQlycGNfcmVzdGFydF9jYWxsKHRhc2spOworCQkJcmV0dXJuOworCQl9CisJCXRhc2stPnRrX3N0YXR1cyA9IC1FSU87CisJfQorCU5GU19GTEFHUyhkYXRhLT5pbm9kZSkgfD0gTkZTX0lOT19JTlZBTElEX0FUSU1FOworCWRhdGEtPmNvbXBsZXRlKGRhdGEsIHN0YXR1cyk7Cit9CisKKy8qCisgKiBSZWFkIGEgcGFnZSBvdmVyIE5GUy4KKyAqIFdlIHJlYWQgdGhlIHBhZ2Ugc3luY2hyb25vdXNseSBpbiB0aGUgZm9sbG93aW5nIGNhc2U6CisgKiAgLQlUaGUgZXJyb3IgZmxhZyBpcyBzZXQgZm9yIHRoaXMgcGFnZS4gVGhpcyBoYXBwZW5zIG9ubHkgd2hlbiBhCisgKglwcmV2aW91cyBhc3luYyByZWFkIG9wZXJhdGlvbiBmYWlsZWQuCisgKi8KK2ludCBuZnNfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHg7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJaW50CQllcnJvcjsKKworCWRwcmludGsoIk5GUzogbmZzX3JlYWRwYWdlICglcCAlbGRAJWx1KVxuIiwKKwkJcGFnZSwgUEFHRV9DQUNIRV9TSVpFLCBwYWdlLT5pbmRleCk7CisJLyoKKwkgKiBUcnkgdG8gZmx1c2ggYW55IHBlbmRpbmcgd3JpdGVzIHRvIHRoZSBmaWxlLi4KKwkgKgorCSAqIE5PVEUhIEJlY2F1c2Ugd2Ugb3duIHRoZSBwYWdlIGxvY2ssIHRoZXJlIGNhbm5vdAorCSAqIGJlIGFueSBuZXcgcGVuZGluZyB3cml0ZXMgZ2VuZXJhdGVkIGF0IHRoaXMgcG9pbnQKKwkgKiBmb3IgdGhpcyBwYWdlIChvdGhlciBwYWdlcyBjYW4gYmUgd3JpdHRlbiB0bykuCisJICovCisJZXJyb3IgPSBuZnNfd2JfcGFnZShpbm9kZSwgcGFnZSk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dF9lcnJvcjsKKworCWlmIChmaWxlID09IE5VTEwpIHsKKwkJY3R4ID0gbmZzX2ZpbmRfb3Blbl9jb250ZXh0KGlub2RlLCBGTU9ERV9SRUFEKTsKKwkJaWYgKGN0eCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FQkFERjsKKwl9IGVsc2UKKwkJY3R4ID0gZ2V0X25mc19vcGVuX2NvbnRleHQoKHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICopCisJCQkJZmlsZS0+cHJpdmF0ZV9kYXRhKTsKKwlpZiAoIUlTX1NZTkMoaW5vZGUpKSB7CisJCWVycm9yID0gbmZzX3JlYWRwYWdlX2FzeW5jKGN0eCwgaW5vZGUsIHBhZ2UpOworCQlnb3RvIG91dDsKKwl9CisKKwllcnJvciA9IG5mc19yZWFkcGFnZV9zeW5jKGN0eCwgaW5vZGUsIHBhZ2UpOworCWlmIChlcnJvciA8IDAgJiYgSVNfU1dBUEZJTEUoaW5vZGUpKQorCQlwcmludGsoIkFpZWUuLiBuZnMgc3dhcC1pbiBvZiBwYWdlIGZhaWxlZCFcbiIpOworb3V0OgorCXB1dF9uZnNfb3Blbl9jb250ZXh0KGN0eCk7CisJcmV0dXJuIGVycm9yOworCitvdXRfZXJyb3I6CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIGVycm9yOworfQorCitzdHJ1Y3QgbmZzX3JlYWRkZXNjIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkOworCXN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHg7Cit9OworCitzdGF0aWMgaW50CityZWFkcGFnZV9hc3luY19maWxsZXIodm9pZCAqZGF0YSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJc3RydWN0IG5mc19yZWFkZGVzYyAqZGVzYyA9IChzdHJ1Y3QgbmZzX3JlYWRkZXNjICopZGF0YTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3QgbmZzX3BhZ2UgKm5ldzsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJbmZzX3diX3BhZ2UoaW5vZGUsIHBhZ2UpOworCWxlbiA9IG5mc19wYWdlX2xlbmd0aChpbm9kZSwgcGFnZSk7CisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm4gbmZzX3JldHVybl9lbXB0eV9wYWdlKHBhZ2UpOworCW5ldyA9IG5mc19jcmVhdGVfcmVxdWVzdChkZXNjLT5jdHgsIGlub2RlLCBwYWdlLCAwLCBsZW4pOworCWlmIChJU19FUlIobmV3KSkgeworCQkJU2V0UGFnZUVycm9yKHBhZ2UpOworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQlyZXR1cm4gUFRSX0VSUihuZXcpOworCX0KKwlpZiAobGVuIDwgUEFHRV9DQUNIRV9TSVpFKQorCQltZW1jbGVhcl9oaWdocGFnZV9mbHVzaChwYWdlLCBsZW4sIFBBR0VfQ0FDSEVfU0laRSAtIGxlbik7CisJbmZzX2xvY2tfcmVxdWVzdChuZXcpOworCW5mc19saXN0X2FkZF9yZXF1ZXN0KG5ldywgZGVzYy0+aGVhZCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBuZnNfcmVhZHBhZ2VzKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJc3RydWN0IGxpc3RfaGVhZCAqcGFnZXMsIHVuc2lnbmVkIG5yX3BhZ2VzKQoreworCUxJU1RfSEVBRChoZWFkKTsKKwlzdHJ1Y3QgbmZzX3JlYWRkZXNjIGRlc2MgPSB7CisJCS5oZWFkCQk9ICZoZWFkLAorCX07CisJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisJc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciA9IE5GU19TRVJWRVIoaW5vZGUpOworCWludCByZXQ7CisKKwlkcHJpbnRrKCJORlM6IG5mc19yZWFkcGFnZXMgKCVzLyVMZCAlZClcbiIsCisJCQlpbm9kZS0+aV9zYi0+c19pZCwKKwkJCShsb25nIGxvbmcpTkZTX0ZJTEVJRChpbm9kZSksCisJCQlucl9wYWdlcyk7CisKKwlpZiAoZmlscCA9PSBOVUxMKSB7CisJCWRlc2MuY3R4ID0gbmZzX2ZpbmRfb3Blbl9jb250ZXh0KGlub2RlLCBGTU9ERV9SRUFEKTsKKwkJaWYgKGRlc2MuY3R4ID09IE5VTEwpCisJCQlyZXR1cm4gLUVCQURGOworCX0gZWxzZQorCQlkZXNjLmN0eCA9IGdldF9uZnNfb3Blbl9jb250ZXh0KChzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqKQorCQkJCWZpbHAtPnByaXZhdGVfZGF0YSk7CisJcmV0ID0gcmVhZF9jYWNoZV9wYWdlcyhtYXBwaW5nLCBwYWdlcywgcmVhZHBhZ2VfYXN5bmNfZmlsbGVyLCAmZGVzYyk7CisJaWYgKCFsaXN0X2VtcHR5KCZoZWFkKSkgeworCQlpbnQgZXJyID0gbmZzX3BhZ2Vpbl9saXN0KCZoZWFkLCBzZXJ2ZXItPnJwYWdlcyk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gZXJyOworCX0KKwlwdXRfbmZzX29wZW5fY29udGV4dChkZXNjLmN0eCk7CisJcmV0dXJuIHJldDsKK30KKworaW50IG5mc19pbml0X3JlYWRwYWdlY2FjaGUodm9pZCkKK3sKKwluZnNfcmRhdGFfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoIm5mc19yZWFkX2RhdGEiLAorCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgbmZzX3JlYWRfZGF0YSksCisJCQkJCSAgICAgMCwgU0xBQl9IV0NBQ0hFX0FMSUdOLAorCQkJCQkgICAgIE5VTEwsIE5VTEwpOworCWlmIChuZnNfcmRhdGFfY2FjaGVwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJbmZzX3JkYXRhX21lbXBvb2wgPSBtZW1wb29sX2NyZWF0ZShNSU5fUE9PTF9SRUFELAorCQkJCQkgICBtZW1wb29sX2FsbG9jX3NsYWIsCisJCQkJCSAgIG1lbXBvb2xfZnJlZV9zbGFiLAorCQkJCQkgICBuZnNfcmRhdGFfY2FjaGVwKTsKKwlpZiAobmZzX3JkYXRhX21lbXBvb2wgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBuZnNfZGVzdHJveV9yZWFkcGFnZWNhY2hlKHZvaWQpCit7CisJbWVtcG9vbF9kZXN0cm95KG5mc19yZGF0YV9tZW1wb29sKTsKKwlpZiAoa21lbV9jYWNoZV9kZXN0cm95KG5mc19yZGF0YV9jYWNoZXApKQorCQlwcmludGsoS0VSTl9JTkZPICJuZnNfcmVhZF9kYXRhOiBub3QgYWxsIHN0cnVjdHVyZXMgd2VyZSBmcmVlZFxuIik7Cit9CmRpZmYgLS1naXQgYS9mcy9uZnMvc3ltbGluay5jIGIvZnMvbmZzL3N5bWxpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWYxMDY1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzL3N5bWxpbmsuYwpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqICBsaW51eC9mcy9uZnMvc3ltbGluay5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MiAgUmljayBTbGFka2V5CisgKgorICogIE9wdGltaXphdGlvbiBjaGFuZ2VzIENvcHlyaWdodCAoQykgMTk5NCBGbG9yaWFuIExhIFJvY2hlCisgKgorICogIEp1biA3IDE5OTksIGNhY2hlIHN5bWxpbmsgbG9va3VwcyBpbiB0aGUgcGFnZSBjYWNoZS4gIC1EYXZlTQorICoKKyAqICBuZnMgc3ltbGluayBoYW5kbGluZyBjb2RlCisgKi8KKworI2RlZmluZSBORlNfTkVFRF9YRFJfVFlQRVMKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L25mcy5oPgorI2luY2x1ZGUgPGxpbnV4L25mczIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKworLyogU3ltbGluayBjYWNoaW5nIGluIHRoZSBwYWdlIGNhY2hlIGlzIGV2ZW4gbW9yZSBzaW1wbGlzdGljCisgKiBhbmQgc3RyYWlnaHQtZm9yd2FyZCB0aGFuIHJlYWRkaXIgY2FjaGluZy4KKyAqCisgKiBBdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWdlIHdlIHN0b3JlIHBvaW50ZXIgdG8gc3RydWN0IHBhZ2UgaW4gcXVlc3Rpb24sCisgKiBzaW1wbGlmeWluZyBuZnNfcHV0X2xpbmsoKSAoaWYgaW5vZGUgZ290IGludmFsaWRhdGVkIHdlIGNhbid0IGZpbmQgdGhlIHBhZ2UKKyAqIHRvIGJlIGZyZWVkIHZpYSBwYWdlY2FjaGUgbG9va3VwKS4KKyAqIFRoZSBOVUwtdGVybWluYXRlZCBzdHJpbmcgZm9sbG93cyBpbW1lZGlhdGVseSB0aGVyZWFmdGVyLgorICovCisKK3N0cnVjdCBuZnNfc3ltbGluayB7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJY2hhciBib2R5WzBdOworfTsKKworc3RhdGljIGludCBuZnNfc3ltbGlua19maWxsZXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJY29uc3QgdW5zaWduZWQgaW50IHBnYmFzZSA9IG9mZnNldG9mKHN0cnVjdCBuZnNfc3ltbGluaywgYm9keSk7CisJY29uc3QgdW5zaWduZWQgaW50IHBnbGVuID0gUEFHRV9TSVpFIC0gcGdiYXNlOworCWludCBlcnJvcjsKKworCWxvY2tfa2VybmVsKCk7CisJZXJyb3IgPSBORlNfUFJPVE8oaW5vZGUpLT5yZWFkbGluayhpbm9kZSwgcGFnZSwgcGdiYXNlLCBwZ2xlbik7CisJdW5sb2NrX2tlcm5lbCgpOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gZXJyb3I7CisJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCXJldHVybiAwOworCitlcnJvcjoKKwlTZXRQYWdlRXJyb3IocGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQgbmZzX2ZvbGxvd19saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3QgbmZzX3N5bWxpbmsgKnA7CisJdm9pZCAqZXJyID0gRVJSX1BUUihuZnNfcmV2YWxpZGF0ZV9pbm9kZShORlNfU0VSVkVSKGlub2RlKSwgaW5vZGUpKTsKKwlpZiAoZXJyKQorCQlnb3RvIHJlYWRfZmFpbGVkOworCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UoJmlub2RlLT5pX2RhdGEsIDAsCisJCQkJKGZpbGxlcl90ICopbmZzX3N5bWxpbmtfZmlsbGVyLCBpbm9kZSk7CisJaWYgKElTX0VSUihwYWdlKSkgeworCQllcnIgPSBwYWdlOworCQlnb3RvIHJlYWRfZmFpbGVkOworCX0KKwlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkgeworCQllcnIgPSBFUlJfUFRSKC1FSU8pOworCQlnb3RvIGdldGxpbmtfcmVhZF9lcnJvcjsKKwl9CisJcCA9IGttYXAocGFnZSk7CisJcC0+cGFnZSA9IHBhZ2U7CisJbmRfc2V0X2xpbmsobmQsIHAtPmJvZHkpOworCXJldHVybiAwOworCitnZXRsaW5rX3JlYWRfZXJyb3I6CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworcmVhZF9mYWlsZWQ6CisJbmRfc2V0X2xpbmsobmQsIGVycik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG5mc19wdXRfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWNoYXIgKnMgPSBuZF9nZXRfbGluayhuZCk7CisJaWYgKCFJU19FUlIocykpIHsKKwkJc3RydWN0IG5mc19zeW1saW5rICpwOworCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCQlwID0gY29udGFpbmVyX29mKHMsIHN0cnVjdCBuZnNfc3ltbGluaywgYm9keVswXSk7CisJCXBhZ2UgPSBwLT5wYWdlOworCisJCWt1bm1hcChwYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCX0KK30KKworLyoKKyAqIHN5bWxpbmtzIGNhbid0IGRvIG11Y2guLi4KKyAqLworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgbmZzX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkucmVhZGxpbmsJPSBnZW5lcmljX3JlYWRsaW5rLAorCS5mb2xsb3dfbGluawk9IG5mc19mb2xsb3dfbGluaywKKwkucHV0X2xpbmsJPSBuZnNfcHV0X2xpbmssCisJLmdldGF0dHIJPSBuZnNfZ2V0YXR0ciwKKwkuc2V0YXR0cgk9IG5mc19zZXRhdHRyLAorfTsKZGlmZiAtLWdpdCBhL2ZzL25mcy91bmxpbmsuYyBiL2ZzL25mcy91bmxpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzMyNTQxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzL3VubGluay5jCkBAIC0wLDAgKzEsMjI3IEBACisvKgorICogIGxpbnV4L2ZzL25mcy91bmxpbmsuYworICoKKyAqIG5mcyBzaWxseWRlbGV0ZSBoYW5kbGluZworICoKKyAqIE5PVEU6IHdlIHJlbHkgb24gaG9sZGluZyB0aGUgQktMIGZvciBsaXN0IG1hbmlwdWxhdGlvbiBwcm90ZWN0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNfZnMuaD4KKworCitzdHJ1Y3QgbmZzX3VubGlua2RhdGEgeworCXN0cnVjdCBuZnNfdW5saW5rZGF0YQkqbmV4dDsKKwlzdHJ1Y3QgZGVudHJ5CSpkaXIsICpkZW50cnk7CisJc3RydWN0IHFzdHIJbmFtZTsKKwlzdHJ1Y3QgcnBjX3Rhc2sJdGFzazsKKwlzdHJ1Y3QgcnBjX2NyZWQJKmNyZWQ7CisJdW5zaWduZWQgaW50CWNvdW50OworfTsKKworc3RhdGljIHN0cnVjdCBuZnNfdW5saW5rZGF0YQkqbmZzX2RlbGV0ZXM7CitzdGF0aWMgUlBDX1dBSVRRKG5mc19kZWxldGVfcXVldWUsICJuZnNfZGVsZXRlX3F1ZXVlIik7CisKKy8qKgorICogbmZzX2RldGFjaF91bmxpbmtkYXRhIC0gUmVtb3ZlIGFzeW5jaHJvbm91cyB1bmxpbmsgZnJvbSBnbG9iYWwgbGlzdAorICogQGRhdGE6IHBvaW50ZXIgdG8gZGVzY3JpcHRvcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK25mc19kZXRhY2hfdW5saW5rZGF0YShzdHJ1Y3QgbmZzX3VubGlua2RhdGEgKmRhdGEpCit7CisJc3RydWN0IG5mc191bmxpbmtkYXRhCSoqcTsKKworCWZvciAocSA9ICZuZnNfZGVsZXRlczsgKnEgIT0gTlVMTDsgcSA9ICYoKCpxKS0+bmV4dCkpIHsKKwkJaWYgKCpxID09IGRhdGEpIHsKKwkJCSpxID0gZGF0YS0+bmV4dDsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKioKKyAqIG5mc19wdXRfdW5saW5rZGF0YSAtIHJlbGVhc2UgZGF0YSBmcm9tIGEgc2lsbHlkZWxldGUgb3BlcmF0aW9uLgorICogQGRhdGE6IHBvaW50ZXIgdG8gdW5saW5rIHN0cnVjdHVyZS4KKyAqLworc3RhdGljIHZvaWQKK25mc19wdXRfdW5saW5rZGF0YShzdHJ1Y3QgbmZzX3VubGlua2RhdGEgKmRhdGEpCit7CisJaWYgKC0tZGF0YS0+Y291bnQgPT0gMCkgeworCQluZnNfZGV0YWNoX3VubGlua2RhdGEoZGF0YSk7CisJCWlmIChkYXRhLT5uYW1lLm5hbWUgIT0gTlVMTCkKKwkJCWtmcmVlKGRhdGEtPm5hbWUubmFtZSk7CisJCWtmcmVlKGRhdGEpOworCX0KK30KKworI2RlZmluZSBOQU1FX0FMTE9DX0xFTihsZW4pCSgobGVuKzE2KSAmIH4xNSkKKy8qKgorICogbmZzX2NvcHlfZG5hbWUgLSBjb3B5IGRlbnRyeSBuYW1lIHRvIGRhdGEgc3RydWN0dXJlCisgKiBAZGVudHJ5OiBwb2ludGVyIHRvIGRlbnRyeQorICogQGRhdGE6IG5mc191bmxpbmtkYXRhCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorbmZzX2NvcHlfZG5hbWUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmZzX3VubGlua2RhdGEgKmRhdGEpCit7CisJY2hhcgkJKnN0cjsKKwlpbnQJCWxlbiA9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKKworCXN0ciA9IGttYWxsb2MoTkFNRV9BTExPQ19MRU4obGVuKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdHIpCisJCXJldHVybjsKKwltZW1jcHkoc3RyLCBkZW50cnktPmRfbmFtZS5uYW1lLCBsZW4pOworCWlmICghZGF0YS0+bmFtZS5sZW4pIHsKKwkJZGF0YS0+bmFtZS5sZW4gPSBsZW47CisJCWRhdGEtPm5hbWUubmFtZSA9IHN0cjsKKwl9IGVsc2UKKwkJa2ZyZWUoc3RyKTsKK30KKworLyoqCisgKiBuZnNfYXN5bmNfdW5saW5rX2luaXQgLSBJbml0aWFsaXplIHRoZSBSUEMgaW5mbworICogQHRhc2s6IHJwY190YXNrIG9mIHRoZSBzaWxseWRlbGV0ZQorICoKKyAqIFdlIGRlbGF5IGluaXRpYWxpemluZyBSUEMgaW5mbyB1bnRpbCBhZnRlciB0aGUgY2FsbCB0byBkZW50cnlfaXB1dCgpCisgKiBpbiBvcmRlciB0byBtaW5pbWl6ZSByYWNlcyBhZ2FpbnN0IHJlbmFtZSgpLgorICovCitzdGF0aWMgdm9pZAorbmZzX2FzeW5jX3VubGlua19pbml0KHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgbmZzX3VubGlua2RhdGEJKmRhdGEgPSAoc3RydWN0IG5mc191bmxpbmtkYXRhICopdGFzay0+dGtfY2FsbGRhdGE7CisJc3RydWN0IGRlbnRyeQkJKmRpciA9IGRhdGEtPmRpcjsKKwlzdHJ1Y3QgcnBjX21lc3NhZ2UJbXNnID0geworCQkucnBjX2NyZWQJPSBkYXRhLT5jcmVkLAorCX07CisJaW50CQkJc3RhdHVzID0gLUVOT0VOVDsKKworCWlmICghZGF0YS0+bmFtZS5sZW4pCisJCWdvdG8gb3V0X2VycjsKKworCXN0YXR1cyA9IE5GU19QUk9UTyhkaXItPmRfaW5vZGUpLT51bmxpbmtfc2V0dXAoJm1zZywgZGlyLCAmZGF0YS0+bmFtZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gb3V0X2VycjsKKwluZnNfYmVnaW5fZGF0YV91cGRhdGUoZGlyLT5kX2lub2RlKTsKKwlycGNfY2FsbF9zZXR1cCh0YXNrLCAmbXNnLCAwKTsKKwlyZXR1cm47Cisgb3V0X2VycjoKKwlycGNfZXhpdCh0YXNrLCBzdGF0dXMpOworfQorCisvKioKKyAqIG5mc19hc3luY191bmxpbmtfZG9uZSAtIFNpbGx5ZGVsZXRlIHBvc3QtcHJvY2Vzc2luZworICogQHRhc2s6IHJwY190YXNrIG9mIHRoZSBzaWxseWRlbGV0ZQorICoKKyAqIERvIHRoZSBkaXJlY3RvcnkgYXR0cmlidXRlIHVwZGF0ZS4KKyAqLworc3RhdGljIHZvaWQKK25mc19hc3luY191bmxpbmtfZG9uZShzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IG5mc191bmxpbmtkYXRhCSpkYXRhID0gKHN0cnVjdCBuZnNfdW5saW5rZGF0YSAqKXRhc2stPnRrX2NhbGxkYXRhOworCXN0cnVjdCBkZW50cnkJCSpkaXIgPSBkYXRhLT5kaXI7CisJc3RydWN0IGlub2RlCQkqZGlyX2k7CisKKwlpZiAoIWRpcikKKwkJcmV0dXJuOworCWRpcl9pID0gZGlyLT5kX2lub2RlOworCW5mc19lbmRfZGF0YV91cGRhdGUoZGlyX2kpOworCWlmIChORlNfUFJPVE8oZGlyX2kpLT51bmxpbmtfZG9uZShkaXIsIHRhc2spKQorCQlyZXR1cm47CisJcHV0X3JwY2NyZWQoZGF0YS0+Y3JlZCk7CisJZGF0YS0+Y3JlZCA9IE5VTEw7CisJZHB1dChkaXIpOworfQorCisvKioKKyAqIG5mc19hc3luY191bmxpbmtfcmVsZWFzZSAtIFJlbGVhc2UgdGhlIHNpbGx5ZGVsZXRlIGRhdGEuCisgKiBAdGFzazogcnBjX3Rhc2sgb2YgdGhlIHNpbGx5ZGVsZXRlCisgKgorICogV2UgbmVlZCB0byBjYWxsIG5mc19wdXRfdW5saW5rZGF0YSBhcyBhICd0a19yZWxlYXNlJyB0YXNrIHNpbmNlIHRoZQorICogcnBjX3Rhc2sgd291bGQgYmUgZnJlZWQgdG9vLgorICovCitzdGF0aWMgdm9pZAorbmZzX2FzeW5jX3VubGlua19yZWxlYXNlKHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgbmZzX3VubGlua2RhdGEJKmRhdGEgPSAoc3RydWN0IG5mc191bmxpbmtkYXRhICopdGFzay0+dGtfY2FsbGRhdGE7CisJbmZzX3B1dF91bmxpbmtkYXRhKGRhdGEpOworfQorCisvKioKKyAqIG5mc19hc3luY191bmxpbmsgLSBhc3luY2hyb25vdXMgdW5saW5raW5nIG9mIGEgZmlsZQorICogQGRlbnRyeTogZGVudHJ5IHRvIHVubGluaworICovCitpbnQKK25mc19hc3luY191bmxpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBkZW50cnkJKmRpciA9IGRlbnRyeS0+ZF9wYXJlbnQ7CisJc3RydWN0IG5mc191bmxpbmtkYXRhCSpkYXRhOworCXN0cnVjdCBycGNfdGFzawkqdGFzazsKKwlzdHJ1Y3QgcnBjX2NsbnQJKmNsbnQgPSBORlNfQ0xJRU5UKGRpci0+ZF9pbm9kZSk7CisJaW50CQlzdGF0dXMgPSAtRU5PTUVNOworCisJZGF0YSA9IGttYWxsb2Moc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKQorCQlnb3RvIG91dDsKKwltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKCpkYXRhKSk7CisKKwlkYXRhLT5jcmVkID0gcnBjYXV0aF9sb29rdXBjcmVkKGNsbnQtPmNsX2F1dGgsIDApOworCWlmIChJU19FUlIoZGF0YS0+Y3JlZCkpIHsKKwkJc3RhdHVzID0gUFRSX0VSUihkYXRhLT5jcmVkKTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisJZGF0YS0+ZGlyID0gZGdldChkaXIpOworCWRhdGEtPmRlbnRyeSA9IGRlbnRyeTsKKworCWRhdGEtPm5leHQgPSBuZnNfZGVsZXRlczsKKwluZnNfZGVsZXRlcyA9IGRhdGE7CisJZGF0YS0+Y291bnQgPSAxOworCisJdGFzayA9ICZkYXRhLT50YXNrOworCXJwY19pbml0X3Rhc2sodGFzaywgY2xudCwgbmZzX2FzeW5jX3VubGlua19kb25lICwgUlBDX1RBU0tfQVNZTkMpOworCXRhc2stPnRrX2NhbGxkYXRhID0gZGF0YTsKKwl0YXNrLT50a19hY3Rpb24gPSBuZnNfYXN5bmNfdW5saW5rX2luaXQ7CisJdGFzay0+dGtfcmVsZWFzZSA9IG5mc19hc3luY191bmxpbmtfcmVsZWFzZTsKKworCXNwaW5fbG9jaygmZGVudHJ5LT5kX2xvY2spOworCWRlbnRyeS0+ZF9mbGFncyB8PSBEQ0FDSEVfTkZTRlNfUkVOQU1FRDsKKwlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCisJcnBjX3NsZWVwX29uKCZuZnNfZGVsZXRlX3F1ZXVlLCB0YXNrLCBOVUxMLCBOVUxMKTsKKwlzdGF0dXMgPSAwOworIG91dDoKKwlyZXR1cm4gc3RhdHVzOworb3V0X2ZyZWU6CisJa2ZyZWUoZGF0YSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBuZnNfY29tcGxldGVfdW5saW5rIC0gSW5pdGlhbGl6ZSBjb21wbGV0aW9uIG9mIHRoZSBzaWxseWRlbGV0ZQorICogQGRlbnRyeTogZGVudHJ5IHRvIGRlbGV0ZQorICoKKyAqIFNpbmNlIHdlJ3JlIG1vc3QgbGlrZWx5IHRvIGJlIGNhbGxlZCBieSBkZW50cnlfaXB1dCgpLCB3ZQorICogb25seSB1c2UgdGhlIGRlbnRyeSB0byBmaW5kIHRoZSBzaWxseWRlbGV0ZS4gV2UgdGhlbiBjb3B5IHRoZSBuYW1lCisgKiBpbnRvIHRoZSBxc3RyLgorICovCit2b2lkCituZnNfY29tcGxldGVfdW5saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgbmZzX3VubGlua2RhdGEJKmRhdGE7CisKKwlmb3IoZGF0YSA9IG5mc19kZWxldGVzOyBkYXRhICE9IE5VTEw7IGRhdGEgPSBkYXRhLT5uZXh0KSB7CisJCWlmIChkZW50cnkgPT0gZGF0YS0+ZGVudHJ5KQorCQkJYnJlYWs7CisJfQorCWlmICghZGF0YSkKKwkJcmV0dXJuOworCWRhdGEtPmNvdW50Kys7CisJbmZzX2NvcHlfZG5hbWUoZGVudHJ5LCBkYXRhKTsKKwlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwlkZW50cnktPmRfZmxhZ3MgJj0gfkRDQUNIRV9ORlNGU19SRU5BTUVEOworCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CisJcnBjX3dha2VfdXBfdGFzaygmZGF0YS0+dGFzayk7CisJbmZzX3B1dF91bmxpbmtkYXRhKGRhdGEpOworfQpkaWZmIC0tZ2l0IGEvZnMvbmZzL3dyaXRlLmMgYi9mcy9uZnMvd3JpdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjdhNGFmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzL3dyaXRlLmMKQEAgLTAsMCArMSwxNDMxIEBACisvKgorICogbGludXgvZnMvbmZzL3dyaXRlLmMKKyAqCisgKiBXcml0aW5nIGZpbGUgZGF0YSBvdmVyIE5GUy4KKyAqCisgKiBXZSBkbyBpdCBsaWtlIHRoaXM6IFdoZW4gYSAodXNlcikgcHJvY2VzcyB3aXNoZXMgdG8gd3JpdGUgZGF0YSB0byBhbgorICogTkZTIGZpbGUsIGEgd3JpdGUgcmVxdWVzdCBpcyBhbGxvY2F0ZWQgdGhhdCBjb250YWlucyB0aGUgUlBDIHRhc2sgZGF0YQorICogcGx1cyBzb21lIGluZm8gb24gdGhlIHBhZ2UgdG8gYmUgd3JpdHRlbiwgYW5kIGFkZGVkIHRvIHRoZSBpbm9kZSdzCisgKiB3cml0ZSBjaGFpbi4gSWYgdGhlIHByb2Nlc3Mgd3JpdGVzIHBhc3QgdGhlIGVuZCBvZiB0aGUgcGFnZSwgYW4gYXN5bmMKKyAqIFJQQyBjYWxsIHRvIHdyaXRlIHRoZSBwYWdlIGlzIHNjaGVkdWxlZCBpbW1lZGlhdGVseTsgb3RoZXJ3aXNlLCB0aGUgY2FsbAorICogaXMgZGVsYXllZCBmb3IgYSBmZXcgc2Vjb25kcy4KKyAqCisgKiBKdXN0IGxpa2UgcmVhZGFoZWFkLCBubyBhc3luYyBJL08gaXMgcGVyZm9ybWVkIGlmIHdzaXplIDwgUEFHRV9TSVpFLgorICoKKyAqIFdyaXRlIHJlcXVlc3RzIGFyZSBrZXB0IG9uIHRoZSBpbm9kZSdzIHdyaXRlYmFjayBsaXN0LiBFYWNoIGVudHJ5IGluCisgKiB0aGF0IGxpc3QgcmVmZXJlbmNlcyB0aGUgcGFnZSAocG9ydGlvbikgdG8gYmUgd3JpdHRlbi4gV2hlbiB0aGUKKyAqIGNhY2hlIHRpbWVvdXQgaGFzIGV4cGlyZWQsIHRoZSBSUEMgdGFzayBpcyB3b2tlbiB1cCwgYW5kIHRyaWVzIHRvCisgKiBsb2NrIHRoZSBwYWdlLiBBcyBzb29uIGFzIGl0IG1hbmFnZXMgdG8gZG8gc28sIHRoZSByZXF1ZXN0IGlzIG1vdmVkCisgKiBmcm9tIHRoZSB3cml0ZWJhY2sgbGlzdCB0byB0aGUgd3JpdGVsb2NrIGxpc3QuCisgKgorICogTm90ZTogd2UgbXVzdCBtYWtlIHN1cmUgbmV2ZXIgdG8gY29uZnVzZSB0aGUgaW5vZGUgcGFzc2VkIGluIHRoZQorICogd3JpdGVfcGFnZSByZXF1ZXN0IHdpdGggdGhlIG9uZSBpbiBwYWdlLT5pbm9kZS4gQXMgZmFyIGFzIEkgdW5kZXJzdGFuZAorICogaXQsIHRoZXNlIGFyZSBkaWZmZXJlbnQgd2hlbiBkb2luZyBhIHN3YXAtb3V0LgorICoKKyAqIFRvIHVuZGVyc3RhbmQgZXZlcnl0aGluZyB0aGF0IGdvZXMgb24gaGVyZSBhbmQgaW4gdGhlIE5GUyByZWFkIGNvZGUsCisgKiBvbmUgc2hvdWxkIGJlIGF3YXJlIHRoYXQgYSBwYWdlIGlzIGxvY2tlZCBpbiBleGFjdGx5IG9uZSBvZiB0aGUgZm9sbG93aW5nCisgKiBjYXNlczoKKyAqCisgKiAgLQlBIHdyaXRlIHJlcXVlc3QgaXMgaW4gcHJvZ3Jlc3MuCisgKiAgLQlBIHVzZXIgcHJvY2VzcyBpcyBpbiBnZW5lcmljX2ZpbGVfd3JpdGUvbmZzX3VwZGF0ZV9wYWdlCisgKiAgLQlBIHVzZXIgcHJvY2VzcyBpcyBpbiBnZW5lcmljX2ZpbGVfcmVhZAorICoKKyAqIEFsc28gbm90ZSB0aGF0IGJlY2F1c2Ugb2YgdGhlIHdheSBwYWdlcyBhcmUgaW52YWxpZGF0ZWQgaW4KKyAqIG5mc19yZXZhbGlkYXRlX2lub2RlLCB0aGUgZm9sbG93aW5nIGFzc2VydGlvbnMgaG9sZDoKKyAqCisgKiAgLQlJZiBhIHBhZ2UgaXMgZGlydHksIHRoZXJlIHdpbGwgYmUgbm8gcmVhZCByZXF1ZXN0cyAoYSBwYWdlIHdpbGwKKyAqCW5vdCBiZSByZS1yZWFkIHVubGVzcyBpbnZhbGlkYXRlZCBieSBuZnNfcmV2YWxpZGF0ZV9pbm9kZSkuCisgKiAgLQlJZiB0aGUgcGFnZSBpcyBub3QgdXB0b2RhdGUsIHRoZXJlIHdpbGwgYmUgbm8gcGVuZGluZyB3cml0ZQorICoJcmVxdWVzdHMsIGFuZCBubyBwcm9jZXNzIHdpbGwgYmUgaW4gbmZzX3VwZGF0ZV9wYWdlLgorICoKKyAqIEZJWE1FOiBJbnRlcmFjdGlvbiB3aXRoIHRoZSB2bXNjYW4gcm91dGluZXMgaXMgbm90IG9wdGltYWwgeWV0LgorICogRWl0aGVyIHZtc2NhbiBtdXN0IGJlIG1hZGUgbmZzLXNhdnZ5LCBvciB3ZSBuZWVkIGEgZGlmZmVyZW50IHBhZ2UKKyAqIHJlY2xhaW0gY29uY2VwdCB0aGF0IHN1cHBvcnRzIHNvbWV0aGluZyBsaWtlIEZTLWluZGVwZW5kZW50CisgKiBidWZmZXJfaGVhZHMgd2l0aCBhIGJfb3BzLT4gZmllbGQuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21wYWdlLmg+CisjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCisjaW5jbHVkZSAiZGVsZWdhdGlvbi5oIgorCisjZGVmaW5lIE5GU0RCR19GQUNJTElUWQkJTkZTREJHX1BBR0VDQUNIRQorCisjZGVmaW5lIE1JTl9QT09MX1dSSVRFCQkoMzIpCisjZGVmaW5lIE1JTl9QT09MX0NPTU1JVAkJKDQpCisKKy8qCisgKiBMb2NhbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKKyAqLworc3RhdGljIHN0cnVjdCBuZnNfcGFnZSAqIG5mc191cGRhdGVfcmVxdWVzdChzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCosCisJCQkJCSAgICBzdHJ1Y3QgaW5vZGUgKiwKKwkJCQkJICAgIHN0cnVjdCBwYWdlICosCisJCQkJCSAgICB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGludCk7CitzdGF0aWMgdm9pZCBuZnNfd3JpdGViYWNrX2RvbmVfcGFydGlhbChzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKiwgaW50KTsKK3N0YXRpYyB2b2lkIG5mc193cml0ZWJhY2tfZG9uZV9mdWxsKHN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqLCBpbnQpOworc3RhdGljIGludCBuZnNfd2FpdF9vbl93cml0ZV9jb25nZXN0aW9uKHN0cnVjdCBhZGRyZXNzX3NwYWNlICosIGludCk7CitzdGF0aWMgaW50IG5mc193YWl0X29uX3JlcXVlc3RzKHN0cnVjdCBpbm9kZSAqLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBpbnQpOworc3RhdGljIGludCBuZnNfZmx1c2hfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgbG9uZyBpZHhfc3RhcnQsCisJCQkgICB1bnNpZ25lZCBpbnQgbnBhZ2VzLCBpbnQgaG93KTsKKworc3RhdGljIGttZW1fY2FjaGVfdCAqbmZzX3dkYXRhX2NhY2hlcDsKK21lbXBvb2xfdCAqbmZzX3dkYXRhX21lbXBvb2w7CitzdGF0aWMgbWVtcG9vbF90ICpuZnNfY29tbWl0X21lbXBvb2w7CisKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChuZnNfd3JpdGVfY29uZ2VzdGlvbik7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5mc193cml0ZV9kYXRhICpuZnNfY29tbWl0X2FsbG9jKHZvaWQpCit7CisJc3RydWN0IG5mc193cml0ZV9kYXRhICpwID0gbWVtcG9vbF9hbGxvYyhuZnNfY29tbWl0X21lbXBvb2wsIFNMQUJfTk9GUyk7CisJaWYgKHApIHsKKwkJbWVtc2V0KHAsIDAsIHNpemVvZigqcCkpOworCQlJTklUX0xJU1RfSEVBRCgmcC0+cGFnZXMpOworCX0KKwlyZXR1cm4gcDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5mc19jb21taXRfZnJlZShzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKnApCit7CisJbWVtcG9vbF9mcmVlKHAsIG5mc19jb21taXRfbWVtcG9vbCk7Cit9CisKK3N0YXRpYyB2b2lkIG5mc193cml0ZWRhdGFfcmVsZWFzZShzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IG5mc193cml0ZV9kYXRhCSp3ZGF0YSA9IChzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKil0YXNrLT50a19jYWxsZGF0YTsKKwluZnNfd3JpdGVkYXRhX2ZyZWUod2RhdGEpOworfQorCisvKiBBZGp1c3QgdGhlIGZpbGUgbGVuZ3RoIGlmIHdlJ3JlIHdyaXRpbmcgYmV5b25kIHRoZSBlbmQgKi8KK3N0YXRpYyB2b2lkIG5mc19ncm93X2ZpbGUoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlsb2ZmX3QgZW5kLCBpX3NpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CisJdW5zaWduZWQgbG9uZyBlbmRfaW5kZXggPSAoaV9zaXplIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKKworCWlmIChpX3NpemUgPiAwICYmIHBhZ2UtPmluZGV4IDwgZW5kX2luZGV4KQorCQlyZXR1cm47CisJZW5kID0gKChsb2ZmX3QpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgKyAoKGxvZmZfdClvZmZzZXQrY291bnQpOworCWlmIChpX3NpemUgPj0gZW5kKQorCQlyZXR1cm47CisJaV9zaXplX3dyaXRlKGlub2RlLCBlbmQpOworfQorCisvKiBXZSBjYW4gc2V0IHRoZSBQR191cHRvZGF0ZSBmbGFnIGlmIHdlIHNlZSB0aGF0IGEgd3JpdGUgcmVxdWVzdAorICogY292ZXJzIHRoZSBmdWxsIHBhZ2UuCisgKi8KK3N0YXRpYyB2b2lkIG5mc19tYXJrX3VwdG9kYXRlKHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBpbnQgYmFzZSwgdW5zaWduZWQgaW50IGNvdW50KQoreworCWxvZmZfdCBlbmRfb2ZmczsKKworCWlmIChQYWdlVXB0b2RhdGUocGFnZSkpCisJCXJldHVybjsKKwlpZiAoYmFzZSAhPSAwKQorCQlyZXR1cm47CisJaWYgKGNvdW50ID09IFBBR0VfQ0FDSEVfU0laRSkgeworCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJCXJldHVybjsKKwl9CisKKwllbmRfb2ZmcyA9IGlfc2l6ZV9yZWFkKHBhZ2UtPm1hcHBpbmctPmhvc3QpIC0gMTsKKwlpZiAoZW5kX29mZnMgPCAwKQorCQlyZXR1cm47CisJLyogSXMgdGhpcyB0aGUgbGFzdCBwYWdlPyAqLworCWlmIChwYWdlLT5pbmRleCAhPSAodW5zaWduZWQgbG9uZykoZW5kX29mZnMgPj4gUEFHRV9DQUNIRV9TSElGVCkpCisJCXJldHVybjsKKwkvKiBUaGlzIGlzIHRoZSBsYXN0IHBhZ2U6IHNldCBQR191cHRvZGF0ZSBpZiB3ZSBjb3ZlciB0aGUgZW50aXJlCisJICogZXh0ZW50IG9mIHRoZSBkYXRhLCB0aGVuIHplcm8gdGhlIHJlc3Qgb2YgdGhlIHBhZ2UuCisJICovCisJaWYgKGNvdW50ID09ICh1bnNpZ25lZCBpbnQpKGVuZF9vZmZzICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKSArIDEpIHsKKwkJbWVtY2xlYXJfaGlnaHBhZ2VfZmx1c2gocGFnZSwgY291bnQsIFBBR0VfQ0FDSEVfU0laRSAtIGNvdW50KTsKKwkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCX0KK30KKworLyoKKyAqIFdyaXRlIGEgcGFnZSBzeW5jaHJvbm91c2x5LgorICogT2Zmc2V0IGlzIHRoZSBkYXRhIG9mZnNldCB3aXRoaW4gdGhlIHBhZ2UuCisgKi8KK3N0YXRpYyBpbnQgbmZzX3dyaXRlcGFnZV9zeW5jKHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHgsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCXN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgY291bnQsCisJCWludCBob3cpCit7CisJdW5zaWduZWQgaW50CXdzaXplID0gTkZTX1NFUlZFUihpbm9kZSktPndzaXplOworCWludAkJcmVzdWx0LCB3cml0dGVuID0gMDsKKwlzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKndkYXRhOworCisJd2RhdGEgPSBuZnNfd3JpdGVkYXRhX2FsbG9jKCk7CisJaWYgKCF3ZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl3ZGF0YS0+ZmxhZ3MgPSBob3c7CisJd2RhdGEtPmNyZWQgPSBjdHgtPmNyZWQ7CisJd2RhdGEtPmlub2RlID0gaW5vZGU7CisJd2RhdGEtPmFyZ3MuZmggPSBORlNfRkgoaW5vZGUpOworCXdkYXRhLT5hcmdzLmNvbnRleHQgPSBjdHg7CisJd2RhdGEtPmFyZ3MucGFnZXMgPSAmcGFnZTsKKwl3ZGF0YS0+YXJncy5zdGFibGUgPSBORlNfRklMRV9TWU5DOworCXdkYXRhLT5hcmdzLnBnYmFzZSA9IG9mZnNldDsKKwl3ZGF0YS0+YXJncy5jb3VudCA9IHdzaXplOworCXdkYXRhLT5yZXMuZmF0dHIgPSAmd2RhdGEtPmZhdHRyOworCXdkYXRhLT5yZXMudmVyZiA9ICZ3ZGF0YS0+dmVyZjsKKworCWRwcmludGsoIk5GUzogICAgICBuZnNfd3JpdGVwYWdlX3N5bmMoJXMvJUxkICVkQCVMZClcbiIsCisJCWlub2RlLT5pX3NiLT5zX2lkLAorCQkobG9uZyBsb25nKU5GU19GSUxFSUQoaW5vZGUpLAorCQljb3VudCwgKGxvbmcgbG9uZykocGFnZV9vZmZzZXQocGFnZSkgKyBvZmZzZXQpKTsKKworCW5mc19iZWdpbl9kYXRhX3VwZGF0ZShpbm9kZSk7CisJZG8geworCQlpZiAoY291bnQgPCB3c2l6ZSkKKwkJCXdkYXRhLT5hcmdzLmNvdW50ID0gY291bnQ7CisJCXdkYXRhLT5hcmdzLm9mZnNldCA9IHBhZ2Vfb2Zmc2V0KHBhZ2UpICsgd2RhdGEtPmFyZ3MucGdiYXNlOworCisJCXJlc3VsdCA9IE5GU19QUk9UTyhpbm9kZSktPndyaXRlKHdkYXRhKTsKKworCQlpZiAocmVzdWx0IDwgMCkgeworCQkJLyogTXVzdCBtYXJrIHRoZSBwYWdlIGludmFsaWQgYWZ0ZXIgSS9PIGVycm9yICovCisJCQlDbGVhclBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJCWdvdG8gaW9fZXJyb3I7CisJCX0KKwkJaWYgKHJlc3VsdCA8IHdkYXRhLT5hcmdzLmNvdW50KQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTkZTOiBzaG9ydCB3cml0ZSwgY291bnQ9JXUsIHJlc3VsdD0lZFxuIiwKKwkJCQkJd2RhdGEtPmFyZ3MuY291bnQsIHJlc3VsdCk7CisKKwkJd2RhdGEtPmFyZ3Mub2Zmc2V0ICs9IHJlc3VsdDsKKwkgICAgICAgIHdkYXRhLT5hcmdzLnBnYmFzZSArPSByZXN1bHQ7CisJCXdyaXR0ZW4gKz0gcmVzdWx0OworCQljb3VudCAtPSByZXN1bHQ7CisJfSB3aGlsZSAoY291bnQpOworCS8qIFVwZGF0ZSBmaWxlIGxlbmd0aCAqLworCW5mc19ncm93X2ZpbGUocGFnZSwgb2Zmc2V0LCB3cml0dGVuKTsKKwkvKiBTZXQgdGhlIFBHX3VwdG9kYXRlIGZsYWc/ICovCisJbmZzX21hcmtfdXB0b2RhdGUocGFnZSwgb2Zmc2V0LCB3cml0dGVuKTsKKworCWlmIChQYWdlRXJyb3IocGFnZSkpCisJCUNsZWFyUGFnZUVycm9yKHBhZ2UpOworCitpb19lcnJvcjoKKwluZnNfZW5kX2RhdGFfdXBkYXRlX2RlZmVyKGlub2RlKTsKKwluZnNfd3JpdGVkYXRhX2ZyZWUod2RhdGEpOworCXJldHVybiB3cml0dGVuID8gd3JpdHRlbiA6IHJlc3VsdDsKK30KKworc3RhdGljIGludCBuZnNfd3JpdGVwYWdlX2FzeW5jKHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHgsCisJCXN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlICpwYWdlLAorCQl1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJc3RydWN0IG5mc19wYWdlCSpyZXE7CisJaW50CQlzdGF0dXM7CisKKwlyZXEgPSBuZnNfdXBkYXRlX3JlcXVlc3QoY3R4LCBpbm9kZSwgcGFnZSwgb2Zmc2V0LCBjb3VudCk7CisJc3RhdHVzID0gKElTX0VSUihyZXEpKSA/IFBUUl9FUlIocmVxKSA6IDA7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gb3V0OworCS8qIFVwZGF0ZSBmaWxlIGxlbmd0aCAqLworCW5mc19ncm93X2ZpbGUocGFnZSwgb2Zmc2V0LCBjb3VudCk7CisJLyogU2V0IHRoZSBQR191cHRvZGF0ZSBmbGFnPyAqLworCW5mc19tYXJrX3VwdG9kYXRlKHBhZ2UsIG9mZnNldCwgY291bnQpOworCW5mc191bmxvY2tfcmVxdWVzdChyZXEpOworIG91dDoKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IHdiX3ByaW9yaXR5KHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCWlmICh3YmMtPmZvcl9yZWNsYWltKQorCQlyZXR1cm4gRkxVU0hfSElHSFBSSTsKKwlpZiAod2JjLT5mb3Jfa3VwZGF0ZSkKKwkJcmV0dXJuIEZMVVNIX0xPV1BSSTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdyaXRlIGFuIG1tYXBwZWQgcGFnZSB0byB0aGUgc2VydmVyLgorICovCitpbnQgbmZzX3dyaXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7CisJc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwl1bnNpZ25lZCBsb25nIGVuZF9pbmRleDsKKwl1bnNpZ25lZCBvZmZzZXQgPSBQQUdFX0NBQ0hFX1NJWkU7CisJbG9mZl90IGlfc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKwlpbnQgaW5vZGVfcmVmZXJlbmNlZCA9IDA7CisJaW50IHByaW9yaXR5ID0gd2JfcHJpb3JpdHkod2JjKTsKKwlpbnQgZXJyOworCisJLyoKKwkgKiBOb3RlOiBXZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHdlIGhhdmUgYSByZWZlcmVuY2UgdG8gdGhlIGlub2RlCisJICogICAgICAgaWYgd2UgYXJlIHRvIGRvIGFzeW5jaHJvbm91cyB3cml0ZXMuIElmIG5vdCwgd2FpdGluZworCSAqICAgICAgIGluIG5mc193YWl0X29uX3JlcXVlc3QoKSBtYXkgZGVhZGxvY2sgd2l0aCBjbGVhcl9pbm9kZSgpLgorCSAqCisJICogICAgICAgSWYgaWdyYWIoKSBmYWlscyBoZXJlLCB0aGVuIGl0IGlzIGluIGFueSBjYXNlIHNhZmUgdG8KKwkgKiAgICAgICBjYWxsIG5mc193Yl9wYWdlKCksIHNpbmNlIHRoZXJlIHdpbGwgYmUgbm8gcGVuZGluZyB3cml0ZXMuCisJICovCisJaWYgKGlncmFiKGlub2RlKSAhPSAwKQorCQlpbm9kZV9yZWZlcmVuY2VkID0gMTsKKwllbmRfaW5kZXggPSBpX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKKworCS8qIEVuc3VyZSB3ZSd2ZSBmbHVzaGVkIG91dCBhbnkgcHJldmlvdXMgd3JpdGVzICovCisJbmZzX3diX3BhZ2VfcHJpb3JpdHkoaW5vZGUsIHBhZ2UsIHByaW9yaXR5KTsKKworCS8qIGVhc3kgY2FzZSAqLworCWlmIChwYWdlLT5pbmRleCA8IGVuZF9pbmRleCkKKwkJZ290byBkb19pdDsKKwkvKiB0aGluZ3MgZ290IGNvbXBsaWNhdGVkLi4uICovCisJb2Zmc2V0ID0gaV9zaXplICYgKFBBR0VfQ0FDSEVfU0laRS0xKTsKKworCS8qIE9LLCBhcmUgd2UgY29tcGxldGVseSBvdXQ/ICovCisJZXJyID0gMDsgLyogcG90ZW50aWFsIHJhY2Ugd2l0aCB0cnVuY2F0ZSAtIGlnbm9yZSAqLworCWlmIChwYWdlLT5pbmRleCA+PSBlbmRfaW5kZXgrMSB8fCAhb2Zmc2V0KQorCQlnb3RvIG91dDsKK2RvX2l0OgorCWN0eCA9IG5mc19maW5kX29wZW5fY29udGV4dChpbm9kZSwgRk1PREVfV1JJVEUpOworCWlmIChjdHggPT0gTlVMTCkgeworCQllcnIgPSAtRUJBREY7CisJCWdvdG8gb3V0OworCX0KKwlsb2NrX2tlcm5lbCgpOworCWlmICghSVNfU1lOQyhpbm9kZSkgJiYgaW5vZGVfcmVmZXJlbmNlZCkgeworCQllcnIgPSBuZnNfd3JpdGVwYWdlX2FzeW5jKGN0eCwgaW5vZGUsIHBhZ2UsIDAsIG9mZnNldCk7CisJCWlmIChlcnIgPj0gMCkgeworCQkJZXJyID0gMDsKKwkJCWlmICh3YmMtPmZvcl9yZWNsYWltKQorCQkJCW5mc19mbHVzaF9pbm9kZShpbm9kZSwgMCwgMCwgRkxVU0hfU1RBQkxFKTsKKwkJfQorCX0gZWxzZSB7CisJCWVyciA9IG5mc193cml0ZXBhZ2Vfc3luYyhjdHgsIGlub2RlLCBwYWdlLCAwLAorCQkJCQkJb2Zmc2V0LCBwcmlvcml0eSk7CisJCWlmIChlcnIgPj0gMCkgeworCQkJaWYgKGVyciAhPSBvZmZzZXQpCisJCQkJcmVkaXJ0eV9wYWdlX2Zvcl93cml0ZXBhZ2Uod2JjLCBwYWdlKTsKKwkJCWVyciA9IDA7CisJCX0KKwl9CisJdW5sb2NrX2tlcm5lbCgpOworCXB1dF9uZnNfb3Blbl9jb250ZXh0KGN0eCk7CitvdXQ6CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJaWYgKGlub2RlX3JlZmVyZW5jZWQpCisJCWlwdXQoaW5vZGUpOworCXJldHVybiBlcnI7IAorfQorCisvKgorICogTm90ZTogY2F1c2VzIG5mc191cGRhdGVfcmVxdWVzdCgpIHRvIGJsb2NrIG9uIHRoZSBhc3N1bXB0aW9uCisgKiAJIHRoYXQgdGhlIHdyaXRlYmFjayBpcyBnZW5lcmF0ZWQgZHVlIHRvIG1lbW9yeSBwcmVzc3VyZS4KKyAqLworaW50IG5mc193cml0ZXBhZ2VzKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlzdHJ1Y3QgYmFja2luZ19kZXZfaW5mbyAqYmRpID0gbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKKwlpbnQgZXJyOworCisJZXJyID0gZ2VuZXJpY193cml0ZXBhZ2VzKG1hcHBpbmcsIHdiYyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwl3aGlsZSAodGVzdF9hbmRfc2V0X2JpdChCRElfd3JpdGVfY29uZ2VzdGVkLCAmYmRpLT5zdGF0ZSkgIT0gMCkgeworCQlpZiAod2JjLT5ub25ibG9ja2luZykKKwkJCXJldHVybiAwOworCQluZnNfd2FpdF9vbl93cml0ZV9jb25nZXN0aW9uKG1hcHBpbmcsIDApOworCX0KKwllcnIgPSBuZnNfZmx1c2hfaW5vZGUoaW5vZGUsIDAsIDAsIHdiX3ByaW9yaXR5KHdiYykpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dDsKKwl3YmMtPm5yX3RvX3dyaXRlIC09IGVycjsKKwlpZiAoIXdiYy0+bm9uYmxvY2tpbmcgJiYgd2JjLT5zeW5jX21vZGUgPT0gV0JfU1lOQ19BTEwpIHsKKwkJZXJyID0gbmZzX3dhaXRfb25fcmVxdWVzdHMoaW5vZGUsIDAsIDApOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gb3V0OworCX0KKwllcnIgPSBuZnNfY29tbWl0X2lub2RlKGlub2RlLCAwLCAwLCB3Yl9wcmlvcml0eSh3YmMpKTsKKwlpZiAoZXJyID4gMCkgeworCQl3YmMtPm5yX3RvX3dyaXRlIC09IGVycjsKKwkJZXJyID0gMDsKKwl9CitvdXQ6CisJY2xlYXJfYml0KEJESV93cml0ZV9jb25nZXN0ZWQsICZiZGktPnN0YXRlKTsKKwl3YWtlX3VwX2FsbCgmbmZzX3dyaXRlX2Nvbmdlc3Rpb24pOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBJbnNlcnQgYSB3cml0ZSByZXF1ZXN0IGludG8gYW4gaW5vZGUKKyAqLworc3RhdGljIGludCBuZnNfaW5vZGVfYWRkX3JlcXVlc3Qoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IG5mc19wYWdlICpyZXEpCit7CisJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IHJhZGl4X3RyZWVfaW5zZXJ0KCZuZnNpLT5uZnNfcGFnZV90cmVlLCByZXEtPndiX2luZGV4LCByZXEpOworCUJVR19PTihlcnJvciA9PSAtRUVYSVNUKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwlpZiAoIW5mc2ktPm5wYWdlcykgeworCQlpZ3JhYihpbm9kZSk7CisJCW5mc19iZWdpbl9kYXRhX3VwZGF0ZShpbm9kZSk7CisJCWlmIChuZnNfaGF2ZV9kZWxlZ2F0aW9uKGlub2RlLCBGTU9ERV9XUklURSkpCisJCQluZnNpLT5jaGFuZ2VfYXR0cisrOworCX0KKwluZnNpLT5ucGFnZXMrKzsKKwlhdG9taWNfaW5jKCZyZXEtPndiX2NvdW50KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEluc2VydCBhIHdyaXRlIHJlcXVlc3QgaW50byBhbiBpbm9kZQorICovCitzdGF0aWMgdm9pZCBuZnNfaW5vZGVfcmVtb3ZlX3JlcXVlc3Qoc3RydWN0IG5mc19wYWdlICpyZXEpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHJlcS0+d2JfY29udGV4dC0+ZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CisKKwlCVUdfT04gKCFORlNfV0JBQ0tfQlVTWShyZXEpKTsKKworCXNwaW5fbG9jaygmbmZzaS0+cmVxX2xvY2spOworCXJhZGl4X3RyZWVfZGVsZXRlKCZuZnNpLT5uZnNfcGFnZV90cmVlLCByZXEtPndiX2luZGV4KTsKKwluZnNpLT5ucGFnZXMtLTsKKwlpZiAoIW5mc2ktPm5wYWdlcykgeworCQlzcGluX3VubG9jaygmbmZzaS0+cmVxX2xvY2spOworCQluZnNfZW5kX2RhdGFfdXBkYXRlX2RlZmVyKGlub2RlKTsKKwkJaXB1dChpbm9kZSk7CisJfSBlbHNlCisJCXNwaW5fdW5sb2NrKCZuZnNpLT5yZXFfbG9jayk7CisJbmZzX2NsZWFyX3JlcXVlc3QocmVxKTsKKwluZnNfcmVsZWFzZV9yZXF1ZXN0KHJlcSk7Cit9CisKKy8qCisgKiBGaW5kIGEgcmVxdWVzdAorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZnNfcGFnZSAqCitfbmZzX2ZpbmRfcmVxdWVzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIGluZGV4KQoreworCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CisJc3RydWN0IG5mc19wYWdlICpyZXE7CisKKwlyZXEgPSAoc3RydWN0IG5mc19wYWdlKilyYWRpeF90cmVlX2xvb2t1cCgmbmZzaS0+bmZzX3BhZ2VfdHJlZSwgaW5kZXgpOworCWlmIChyZXEpCisJCWF0b21pY19pbmMoJnJlcS0+d2JfY291bnQpOworCXJldHVybiByZXE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZzX3BhZ2UgKgorbmZzX2ZpbmRfcmVxdWVzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIGluZGV4KQoreworCXN0cnVjdCBuZnNfcGFnZQkJKnJlcTsKKwlzdHJ1Y3QgbmZzX2lub2RlCSpuZnNpID0gTkZTX0koaW5vZGUpOworCisJc3Bpbl9sb2NrKCZuZnNpLT5yZXFfbG9jayk7CisJcmVxID0gX25mc19maW5kX3JlcXVlc3QoaW5vZGUsIGluZGV4KTsKKwlzcGluX3VubG9jaygmbmZzaS0+cmVxX2xvY2spOworCXJldHVybiByZXE7Cit9CisKKy8qCisgKiBBZGQgYSByZXF1ZXN0IHRvIHRoZSBpbm9kZSdzIGRpcnR5IGxpc3QuCisgKi8KK3N0YXRpYyB2b2lkCituZnNfbWFya19yZXF1ZXN0X2RpcnR5KHN0cnVjdCBuZnNfcGFnZSAqcmVxKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSByZXEtPndiX2NvbnRleHQtPmRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOworCisJc3Bpbl9sb2NrKCZuZnNpLT5yZXFfbG9jayk7CisJbmZzX2xpc3RfYWRkX3JlcXVlc3QocmVxLCAmbmZzaS0+ZGlydHkpOworCW5mc2ktPm5kaXJ0eSsrOworCXNwaW5fdW5sb2NrKCZuZnNpLT5yZXFfbG9jayk7CisJaW5jX3BhZ2Vfc3RhdGUobnJfZGlydHkpOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworfQorCisvKgorICogQ2hlY2sgaWYgYSByZXF1ZXN0IGlzIGRpcnR5CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CituZnNfZGlydHlfcmVxdWVzdChzdHJ1Y3QgbmZzX3BhZ2UgKnJlcSkKK3sKKwlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0kocmVxLT53Yl9jb250ZXh0LT5kZW50cnktPmRfaW5vZGUpOworCXJldHVybiAhbGlzdF9lbXB0eSgmcmVxLT53Yl9saXN0KSAmJiByZXEtPndiX2xpc3RfaGVhZCA9PSAmbmZzaS0+ZGlydHk7Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19ORlNfVjMpIHx8IGRlZmluZWQoQ09ORklHX05GU19WNCkKKy8qCisgKiBBZGQgYSByZXF1ZXN0IHRvIHRoZSBpbm9kZSdzIGNvbW1pdCBsaXN0LgorICovCitzdGF0aWMgdm9pZAorbmZzX21hcmtfcmVxdWVzdF9jb21taXQoc3RydWN0IG5mc19wYWdlICpyZXEpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHJlcS0+d2JfY29udGV4dC0+ZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CisKKwlzcGluX2xvY2soJm5mc2ktPnJlcV9sb2NrKTsKKwluZnNfbGlzdF9hZGRfcmVxdWVzdChyZXEsICZuZnNpLT5jb21taXQpOworCW5mc2ktPm5jb21taXQrKzsKKwlzcGluX3VubG9jaygmbmZzaS0+cmVxX2xvY2spOworCWluY19wYWdlX3N0YXRlKG5yX3Vuc3RhYmxlKTsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKK30KKyNlbmRpZgorCisvKgorICogV2FpdCBmb3IgYSByZXF1ZXN0IHRvIGNvbXBsZXRlLgorICoKKyAqIEludGVycnVwdGlibGUgYnkgc2lnbmFscyBvbmx5IGlmIG1vdW50ZWQgd2l0aCBpbnRyIGZsYWcuCisgKi8KK3N0YXRpYyBpbnQKK25mc193YWl0X29uX3JlcXVlc3RzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGxvbmcgaWR4X3N0YXJ0LCB1bnNpZ25lZCBpbnQgbnBhZ2VzKQoreworCXN0cnVjdCBuZnNfaW5vZGUgKm5mc2kgPSBORlNfSShpbm9kZSk7CisJc3RydWN0IG5mc19wYWdlICpyZXE7CisJdW5zaWduZWQgbG9uZwkJaWR4X2VuZCwgbmV4dDsKKwl1bnNpZ25lZCBpbnQJCXJlcyA9IDA7CisJaW50CQkJZXJyb3I7CisKKwlpZiAobnBhZ2VzID09IDApCisJCWlkeF9lbmQgPSB+MDsKKwllbHNlCisJCWlkeF9lbmQgPSBpZHhfc3RhcnQgKyBucGFnZXMgLSAxOworCisJc3Bpbl9sb2NrKCZuZnNpLT5yZXFfbG9jayk7CisJbmV4dCA9IGlkeF9zdGFydDsKKwl3aGlsZSAocmFkaXhfdHJlZV9nYW5nX2xvb2t1cCgmbmZzaS0+bmZzX3BhZ2VfdHJlZSwgKHZvaWQgKiopJnJlcSwgbmV4dCwgMSkpIHsKKwkJaWYgKHJlcS0+d2JfaW5kZXggPiBpZHhfZW5kKQorCQkJYnJlYWs7CisKKwkJbmV4dCA9IHJlcS0+d2JfaW5kZXggKyAxOworCQlpZiAoIU5GU19XQkFDS19CVVNZKHJlcSkpCisJCQljb250aW51ZTsKKworCQlhdG9taWNfaW5jKCZyZXEtPndiX2NvdW50KTsKKwkJc3Bpbl91bmxvY2soJm5mc2ktPnJlcV9sb2NrKTsKKwkJZXJyb3IgPSBuZnNfd2FpdF9vbl9yZXF1ZXN0KHJlcSk7CisJCW5mc19yZWxlYXNlX3JlcXVlc3QocmVxKTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCXJldHVybiBlcnJvcjsKKwkJc3Bpbl9sb2NrKCZuZnNpLT5yZXFfbG9jayk7CisJCXJlcysrOworCX0KKwlzcGluX3VubG9jaygmbmZzaS0+cmVxX2xvY2spOworCXJldHVybiByZXM7Cit9CisKKy8qCisgKiBuZnNfc2Nhbl9kaXJ0eSAtIFNjYW4gYW4gaW5vZGUgZm9yIGRpcnR5IHJlcXVlc3RzCisgKiBAaW5vZGU6IE5GUyBpbm9kZSB0byBzY2FuCisgKiBAZHN0OiBkZXN0aW5hdGlvbiBsaXN0CisgKiBAaWR4X3N0YXJ0OiBsb3dlciBib3VuZCBvZiBwYWdlLT5pbmRleCB0byBzY2FuLgorICogQG5wYWdlczogaWR4X3N0YXJ0ICsgbnBhZ2VzIHNldHMgdGhlIHVwcGVyIGJvdW5kIHRvIHNjYW4uCisgKgorICogTW92ZXMgcmVxdWVzdHMgZnJvbSB0aGUgaW5vZGUncyBkaXJ0eSBwYWdlIGxpc3QuCisgKiBUaGUgcmVxdWVzdHMgYXJlICpub3QqIGNoZWNrZWQgdG8gZW5zdXJlIHRoYXQgdGhleSBmb3JtIGEgY29udGlndW91cyBzZXQuCisgKi8KK3N0YXRpYyBpbnQKK25mc19zY2FuX2RpcnR5KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBsaXN0X2hlYWQgKmRzdCwgdW5zaWduZWQgbG9uZyBpZHhfc3RhcnQsIHVuc2lnbmVkIGludCBucGFnZXMpCit7CisJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKKwlpbnQJcmVzOworCXJlcyA9IG5mc19zY2FuX2xpc3QoJm5mc2ktPmRpcnR5LCBkc3QsIGlkeF9zdGFydCwgbnBhZ2VzKTsKKwluZnNpLT5uZGlydHkgLT0gcmVzOworCXN1Yl9wYWdlX3N0YXRlKG5yX2RpcnR5LHJlcyk7CisJaWYgKChuZnNpLT5uZGlydHkgPT0gMCkgIT0gbGlzdF9lbXB0eSgmbmZzaS0+ZGlydHkpKQorCQlwcmludGsoS0VSTl9FUlIgIk5GUzogZGVzeW5jaHJvbml6ZWQgdmFsdWUgb2YgbmZzX2kubmRpcnR5LlxuIik7CisJcmV0dXJuIHJlczsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX05GU19WMykgfHwgZGVmaW5lZChDT05GSUdfTkZTX1Y0KQorLyoKKyAqIG5mc19zY2FuX2NvbW1pdCAtIFNjYW4gYW4gaW5vZGUgZm9yIGNvbW1pdCByZXF1ZXN0cworICogQGlub2RlOiBORlMgaW5vZGUgdG8gc2NhbgorICogQGRzdDogZGVzdGluYXRpb24gbGlzdAorICogQGlkeF9zdGFydDogbG93ZXIgYm91bmQgb2YgcGFnZS0+aW5kZXggdG8gc2Nhbi4KKyAqIEBucGFnZXM6IGlkeF9zdGFydCArIG5wYWdlcyBzZXRzIHRoZSB1cHBlciBib3VuZCB0byBzY2FuLgorICoKKyAqIE1vdmVzIHJlcXVlc3RzIGZyb20gdGhlIGlub2RlJ3MgJ2NvbW1pdCcgcmVxdWVzdCBsaXN0LgorICogVGhlIHJlcXVlc3RzIGFyZSAqbm90KiBjaGVja2VkIHRvIGVuc3VyZSB0aGF0IHRoZXkgZm9ybSBhIGNvbnRpZ3VvdXMgc2V0LgorICovCitzdGF0aWMgaW50CituZnNfc2Nhbl9jb21taXQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGxpc3RfaGVhZCAqZHN0LCB1bnNpZ25lZCBsb25nIGlkeF9zdGFydCwgdW5zaWduZWQgaW50IG5wYWdlcykKK3sKKwlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOworCWludAlyZXM7CisJcmVzID0gbmZzX3NjYW5fbGlzdCgmbmZzaS0+Y29tbWl0LCBkc3QsIGlkeF9zdGFydCwgbnBhZ2VzKTsKKwluZnNpLT5uY29tbWl0IC09IHJlczsKKwlpZiAoKG5mc2ktPm5jb21taXQgPT0gMCkgIT0gbGlzdF9lbXB0eSgmbmZzaS0+Y29tbWl0KSkKKwkJcHJpbnRrKEtFUk5fRVJSICJORlM6IGRlc3luY2hyb25pemVkIHZhbHVlIG9mIG5mc19pLm5jb21taXQuXG4iKTsKKwlyZXR1cm4gcmVzOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgbmZzX3dhaXRfb25fd3JpdGVfY29uZ2VzdGlvbihzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgaW50IGludHIpCit7CisJc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaSA9IG1hcHBpbmctPmJhY2tpbmdfZGV2X2luZm87CisJREVGSU5FX1dBSVQod2FpdCk7CisJaW50IHJldCA9IDA7CisKKwltaWdodF9zbGVlcCgpOworCisJaWYgKCFiZGlfd3JpdGVfY29uZ2VzdGVkKGJkaSkpCisJCXJldHVybiAwOworCWlmIChpbnRyKSB7CisJCXN0cnVjdCBycGNfY2xudCAqY2xudCA9IE5GU19DTElFTlQobWFwcGluZy0+aG9zdCk7CisJCXNpZ3NldF90IG9sZHNldDsKKworCQlycGNfY2xudF9zaWdtYXNrKGNsbnQsICZvbGRzZXQpOworCQlwcmVwYXJlX3RvX3dhaXQoJm5mc193cml0ZV9jb25nZXN0aW9uLCAmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKGJkaV93cml0ZV9jb25nZXN0ZWQoYmRpKSkgeworCQkJaWYgKHNpZ25hbGxlZCgpKQorCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCWVsc2UKKwkJCQlzY2hlZHVsZSgpOworCQl9CisJCXJwY19jbG50X3NpZ3VubWFzayhjbG50LCAmb2xkc2V0KTsKKwl9IGVsc2UgeworCQlwcmVwYXJlX3RvX3dhaXQoJm5mc193cml0ZV9jb25nZXN0aW9uLCAmd2FpdCwgVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlpZiAoYmRpX3dyaXRlX2Nvbmdlc3RlZChiZGkpKQorCQkJc2NoZWR1bGUoKTsKKwl9CisJZmluaXNoX3dhaXQoJm5mc193cml0ZV9jb25nZXN0aW9uLCAmd2FpdCk7CisJcmV0dXJuIHJldDsKK30KKworCisvKgorICogVHJ5IHRvIHVwZGF0ZSBhbnkgZXhpc3Rpbmcgd3JpdGUgcmVxdWVzdCwgb3IgY3JlYXRlIG9uZSBpZiB0aGVyZSBpcyBub25lLgorICogSW4gb3JkZXIgdG8gbWF0Y2gsIHRoZSByZXF1ZXN0J3MgY3JlZGVudGlhbHMgbXVzdCBtYXRjaCB0aG9zZSBvZgorICogdGhlIGNhbGxpbmcgcHJvY2Vzcy4KKyAqCisgKiBOb3RlOiBTaG91bGQgYWx3YXlzIGJlIGNhbGxlZCB3aXRoIHRoZSBQYWdlIExvY2sgaGVsZCEKKyAqLworc3RhdGljIHN0cnVjdCBuZnNfcGFnZSAqIG5mc191cGRhdGVfcmVxdWVzdChzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCogY3R4LAorCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IGJ5dGVzKQoreworCXN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIgPSBORlNfU0VSVkVSKGlub2RlKTsKKwlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOworCXN0cnVjdCBuZnNfcGFnZQkJKnJlcSwgKm5ldyA9IE5VTEw7CisJdW5zaWduZWQgbG9uZwkJcnFlbmQsIGVuZDsKKworCWVuZCA9IG9mZnNldCArIGJ5dGVzOworCisJaWYgKG5mc193YWl0X29uX3dyaXRlX2Nvbmdlc3Rpb24ocGFnZS0+bWFwcGluZywgc2VydmVyLT5mbGFncyAmIE5GU19NT1VOVF9JTlRSKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVSRVNUQVJUU1lTKTsKKwlmb3IgKDs7KSB7CisJCS8qIExvb3Agb3ZlciBhbGwgaW5vZGUgZW50cmllcyBhbmQgc2VlIGlmIHdlIGZpbmQKKwkJICogQSByZXF1ZXN0IGZvciB0aGUgcGFnZSB3ZSB3aXNoIHRvIHVwZGF0ZQorCQkgKi8KKwkJc3Bpbl9sb2NrKCZuZnNpLT5yZXFfbG9jayk7CisJCXJlcSA9IF9uZnNfZmluZF9yZXF1ZXN0KGlub2RlLCBwYWdlLT5pbmRleCk7CisJCWlmIChyZXEpIHsKKwkJCWlmICghbmZzX2xvY2tfcmVxdWVzdF9kb250Z2V0KHJlcSkpIHsKKwkJCQlpbnQgZXJyb3I7CisJCQkJc3Bpbl91bmxvY2soJm5mc2ktPnJlcV9sb2NrKTsKKwkJCQllcnJvciA9IG5mc193YWl0X29uX3JlcXVlc3QocmVxKTsKKwkJCQluZnNfcmVsZWFzZV9yZXF1ZXN0KHJlcSk7CisJCQkJaWYgKGVycm9yIDwgMCkKKwkJCQkJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJc3Bpbl91bmxvY2soJm5mc2ktPnJlcV9sb2NrKTsKKwkJCWlmIChuZXcpCisJCQkJbmZzX3JlbGVhc2VfcmVxdWVzdChuZXcpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAobmV3KSB7CisJCQlpbnQgZXJyb3I7CisJCQluZnNfbG9ja19yZXF1ZXN0X2RvbnRnZXQobmV3KTsKKwkJCWVycm9yID0gbmZzX2lub2RlX2FkZF9yZXF1ZXN0KGlub2RlLCBuZXcpOworCQkJaWYgKGVycm9yKSB7CisJCQkJc3Bpbl91bmxvY2soJm5mc2ktPnJlcV9sb2NrKTsKKwkJCQluZnNfdW5sb2NrX3JlcXVlc3QobmV3KTsKKwkJCQlyZXR1cm4gRVJSX1BUUihlcnJvcik7CisJCQl9CisJCQlzcGluX3VubG9jaygmbmZzaS0+cmVxX2xvY2spOworCQkJbmZzX21hcmtfcmVxdWVzdF9kaXJ0eShuZXcpOworCQkJcmV0dXJuIG5ldzsKKwkJfQorCQlzcGluX3VubG9jaygmbmZzaS0+cmVxX2xvY2spOworCisJCW5ldyA9IG5mc19jcmVhdGVfcmVxdWVzdChjdHgsIGlub2RlLCBwYWdlLCBvZmZzZXQsIGJ5dGVzKTsKKwkJaWYgKElTX0VSUihuZXcpKQorCQkJcmV0dXJuIG5ldzsKKwl9CisKKwkvKiBXZSBoYXZlIGEgcmVxdWVzdCBmb3Igb3VyIHBhZ2UuCisJICogSWYgdGhlIGNyZWRzIGRvbid0IG1hdGNoLCBvciB0aGUKKwkgKiBwYWdlIGFkZHJlc3NlcyBkb24ndCBtYXRjaCwKKwkgKiB0ZWxsIHRoZSBjYWxsZXIgdG8gd2FpdCBvbiB0aGUgY29uZmxpY3RpbmcKKwkgKiByZXF1ZXN0LgorCSAqLworCXJxZW5kID0gcmVxLT53Yl9vZmZzZXQgKyByZXEtPndiX2J5dGVzOworCWlmIChyZXEtPndiX2NvbnRleHQgIT0gY3R4CisJICAgIHx8IHJlcS0+d2JfcGFnZSAhPSBwYWdlCisJICAgIHx8ICFuZnNfZGlydHlfcmVxdWVzdChyZXEpCisJICAgIHx8IG9mZnNldCA+IHJxZW5kIHx8IGVuZCA8IHJlcS0+d2Jfb2Zmc2V0KSB7CisJCW5mc191bmxvY2tfcmVxdWVzdChyZXEpOworCQlyZXR1cm4gRVJSX1BUUigtRUJVU1kpOworCX0KKworCS8qIE9rYXksIHRoZSByZXF1ZXN0IG1hdGNoZXMuIFVwZGF0ZSB0aGUgcmVnaW9uICovCisJaWYgKG9mZnNldCA8IHJlcS0+d2Jfb2Zmc2V0KSB7CisJCXJlcS0+d2Jfb2Zmc2V0ID0gb2Zmc2V0OworCQlyZXEtPndiX3BnYmFzZSA9IG9mZnNldDsKKwkJcmVxLT53Yl9ieXRlcyA9IHJxZW5kIC0gcmVxLT53Yl9vZmZzZXQ7CisJfQorCisJaWYgKGVuZCA+IHJxZW5kKQorCQlyZXEtPndiX2J5dGVzID0gZW5kIC0gcmVxLT53Yl9vZmZzZXQ7CisKKwlyZXR1cm4gcmVxOworfQorCitpbnQgbmZzX2ZsdXNoX2luY29tcGF0aWJsZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKmN0eCA9IChzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3QgbmZzX3BhZ2UJKnJlcTsKKwlpbnQJCXN0YXR1cyA9IDA7CisJLyoKKwkgKiBMb29rIGZvciBhIHJlcXVlc3QgY29ycmVzcG9uZGluZyB0byB0aGlzIHBhZ2UuIElmIHRoZXJlCisJICogaXMgb25lLCBhbmQgaXQgYmVsb25ncyB0byBhbm90aGVyIGZpbGUsIHdlIGZsdXNoIGl0IG91dAorCSAqIGJlZm9yZSB3ZSB0cnkgdG8gY29weSBhbnl0aGluZyBpbnRvIHRoZSBwYWdlLiBEbyB0aGlzCisJICogZHVlIHRvIHRoZSBsYWNrIG9mIGFuIEFDQ0VTUy10eXBlIGNhbGwgaW4gTkZTdjIuCisJICogQWxzbyBkbyB0aGUgc2FtZSBpZiB3ZSBmaW5kIGEgcmVxdWVzdCBmcm9tIGFuIGV4aXN0aW5nCisJICogZHJvcHBlZCBwYWdlLgorCSAqLworCXJlcSA9IG5mc19maW5kX3JlcXVlc3QoaW5vZGUsIHBhZ2UtPmluZGV4KTsKKwlpZiAocmVxKSB7CisJCWlmIChyZXEtPndiX3BhZ2UgIT0gcGFnZSB8fCBjdHggIT0gcmVxLT53Yl9jb250ZXh0KQorCQkJc3RhdHVzID0gbmZzX3diX3BhZ2UoaW5vZGUsIHBhZ2UpOworCQluZnNfcmVsZWFzZV9yZXF1ZXN0KHJlcSk7CisJfQorCXJldHVybiAoc3RhdHVzIDwgMCkgPyBzdGF0dXMgOiAwOworfQorCisvKgorICogVXBkYXRlIGFuZCBwb3NzaWJseSB3cml0ZSBhIGNhY2hlZCBwYWdlIG9mIGFuIE5GUyBmaWxlLgorICoKKyAqIFhYWDogS2VlcCBhbiBleWUgb24gZ2VuZXJpY19maWxlX3JlYWQgdG8gbWFrZSBzdXJlIGl0IGRvZXNuJ3QgZG8gYmFkCisgKiB0aGluZ3Mgd2l0aCBhIHBhZ2Ugc2NoZWR1bGVkIGZvciBhbiBSUEMgY2FsbCAoZS5nLiBpbnZhbGlkYXRlIGl0KS4KKyAqLworaW50IG5mc191cGRhdGVwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJdW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IGNvdW50KQoreworCXN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHggPSAoc3RydWN0IG5mc19vcGVuX2NvbnRleHQgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRlbnRyeQkqZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJc3RydWN0IGlub2RlCSppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJc3RydWN0IG5mc19wYWdlCSpyZXE7CisJaW50CQlzdGF0dXMgPSAwOworCisJZHByaW50aygiTkZTOiAgICAgIG5mc191cGRhdGVwYWdlKCVzLyVzICVkQCVMZClcbiIsCisJCWRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQljb3VudCwgKGxvbmcgbG9uZykocGFnZV9vZmZzZXQocGFnZSkgK29mZnNldCkpOworCisJaWYgKElTX1NZTkMoaW5vZGUpKSB7CisJCXN0YXR1cyA9IG5mc193cml0ZXBhZ2Vfc3luYyhjdHgsIGlub2RlLCBwYWdlLCBvZmZzZXQsIGNvdW50LCAwKTsKKwkJaWYgKHN0YXR1cyA+IDApIHsKKwkJCWlmIChvZmZzZXQgPT0gMCAmJiBzdGF0dXMgPT0gUEFHRV9DQUNIRV9TSVpFKQorCQkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJCXJldHVybiAwOworCQl9CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJLyogSWYgd2UncmUgbm90IHVzaW5nIGJ5dGUgcmFuZ2UgbG9ja3MsIGFuZCB3ZSBrbm93IHRoZSBwYWdlCisJICogaXMgZW50aXJlbHkgaW4gY2FjaGUsIGl0IG1heSBiZSBtb3JlIGVmZmljaWVudCB0byBhdm9pZAorCSAqIGZyYWdtZW50aW5nIHdyaXRlIHJlcXVlc3RzLgorCSAqLworCWlmIChQYWdlVXB0b2RhdGUocGFnZSkgJiYgaW5vZGUtPmlfZmxvY2sgPT0gTlVMTCkgeworCQlsb2ZmX3QgZW5kX29mZnMgPSBpX3NpemVfcmVhZChpbm9kZSkgLSAxOworCQl1bnNpZ25lZCBsb25nIGVuZF9pbmRleCA9IGVuZF9vZmZzID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisKKwkJY291bnQgKz0gb2Zmc2V0OworCQlvZmZzZXQgPSAwOworCQlpZiAodW5saWtlbHkoZW5kX29mZnMgPCAwKSkgeworCQkJLyogRG8gbm90aGluZyAqLworCQl9IGVsc2UgaWYgKHBhZ2UtPmluZGV4ID09IGVuZF9pbmRleCkgeworCQkJdW5zaWduZWQgaW50IHBnbGVuOworCQkJcGdsZW4gPSAodW5zaWduZWQgaW50KShlbmRfb2ZmcyAmIChQQUdFX0NBQ0hFX1NJWkUtMSkpICsgMTsKKwkJCWlmIChjb3VudCA8IHBnbGVuKQorCQkJCWNvdW50ID0gcGdsZW47CisJCX0gZWxzZSBpZiAocGFnZS0+aW5kZXggPCBlbmRfaW5kZXgpCisJCQljb3VudCA9IFBBR0VfQ0FDSEVfU0laRTsKKwl9CisKKwkvKgorCSAqIFRyeSB0byBmaW5kIGFuIE5GUyByZXF1ZXN0IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBwYWdlCisJICogYW5kIHVwZGF0ZSBpdC4KKwkgKiBJZiB0aGUgZXhpc3RpbmcgcmVxdWVzdCBjYW5ub3QgYmUgdXBkYXRlZCwgd2UgbXVzdCBmbHVzaAorCSAqIGl0IG91dCBub3cuCisJICovCisJZG8geworCQlyZXEgPSBuZnNfdXBkYXRlX3JlcXVlc3QoY3R4LCBpbm9kZSwgcGFnZSwgb2Zmc2V0LCBjb3VudCk7CisJCXN0YXR1cyA9IChJU19FUlIocmVxKSkgPyBQVFJfRVJSKHJlcSkgOiAwOworCQlpZiAoc3RhdHVzICE9IC1FQlVTWSkKKwkJCWJyZWFrOworCQkvKiBSZXF1ZXN0IGNvdWxkIG5vdCBiZSB1cGRhdGVkLiBGbHVzaCBpdCBvdXQgYW5kIHRyeSBhZ2FpbiAqLworCQlzdGF0dXMgPSBuZnNfd2JfcGFnZShpbm9kZSwgcGFnZSk7CisJfSB3aGlsZSAoc3RhdHVzID49IDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGRvbmU7CisKKwlzdGF0dXMgPSAwOworCisJLyogVXBkYXRlIGZpbGUgbGVuZ3RoICovCisJbmZzX2dyb3dfZmlsZShwYWdlLCBvZmZzZXQsIGNvdW50KTsKKwkvKiBTZXQgdGhlIFBHX3VwdG9kYXRlIGZsYWc/ICovCisJbmZzX21hcmtfdXB0b2RhdGUocGFnZSwgcmVxLT53Yl9wZ2Jhc2UsIHJlcS0+d2JfYnl0ZXMpOworCW5mc191bmxvY2tfcmVxdWVzdChyZXEpOworZG9uZToKKyAgICAgICAgZHByaW50aygiTkZTOiAgICAgIG5mc191cGRhdGVwYWdlIHJldHVybnMgJWQgKGlzaXplICVMZClcbiIsCisJCQlzdGF0dXMsIChsb25nIGxvbmcpaV9zaXplX3JlYWQoaW5vZGUpKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJQ2xlYXJQYWdlVXB0b2RhdGUocGFnZSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHZvaWQgbmZzX3dyaXRlcGFnZV9yZWxlYXNlKHN0cnVjdCBuZnNfcGFnZSAqcmVxKQoreworCWVuZF9wYWdlX3dyaXRlYmFjayhyZXEtPndiX3BhZ2UpOworCisjaWYgZGVmaW5lZChDT05GSUdfTkZTX1YzKSB8fCBkZWZpbmVkKENPTkZJR19ORlNfVjQpCisJaWYgKCFQYWdlRXJyb3IocmVxLT53Yl9wYWdlKSkgeworCQlpZiAoTkZTX05FRURfUkVTQ0hFRChyZXEpKSB7CisJCQluZnNfbWFya19yZXF1ZXN0X2RpcnR5KHJlcSk7CisJCQlnb3RvIG91dDsKKwkJfSBlbHNlIGlmIChORlNfTkVFRF9DT01NSVQocmVxKSkgeworCQkJbmZzX21hcmtfcmVxdWVzdF9jb21taXQocmVxKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCW5mc19pbm9kZV9yZW1vdmVfcmVxdWVzdChyZXEpOworCitvdXQ6CisJbmZzX2NsZWFyX2NvbW1pdChyZXEpOworCW5mc19jbGVhcl9yZXNjaGVkdWxlKHJlcSk7CisjZWxzZQorCW5mc19pbm9kZV9yZW1vdmVfcmVxdWVzdChyZXEpOworI2VuZGlmCisJbmZzX3VubG9ja19yZXF1ZXN0KHJlcSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZsdXNoX3Rhc2tfcHJpb3JpdHkoaW50IGhvdykKK3sKKwlzd2l0Y2ggKGhvdyAmIChGTFVTSF9ISUdIUFJJfEZMVVNIX0xPV1BSSSkpIHsKKwkJY2FzZSBGTFVTSF9ISUdIUFJJOgorCQkJcmV0dXJuIFJQQ19QUklPUklUWV9ISUdIOworCQljYXNlIEZMVVNIX0xPV1BSSToKKwkJCXJldHVybiBSUENfUFJJT1JJVFlfTE9XOworCX0KKwlyZXR1cm4gUlBDX1BSSU9SSVRZX05PUk1BTDsKK30KKworLyoKKyAqIFNldCB1cCB0aGUgYXJndW1lbnQvcmVzdWx0IHN0b3JhZ2UgcmVxdWlyZWQgZm9yIHRoZSBSUEMgY2FsbC4KKyAqLworc3RhdGljIHZvaWQgbmZzX3dyaXRlX3JwY3NldHVwKHN0cnVjdCBuZnNfcGFnZSAqcmVxLAorCQlzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKmRhdGEsCisJCXVuc2lnbmVkIGludCBjb3VudCwgdW5zaWduZWQgaW50IG9mZnNldCwKKwkJaW50IGhvdykKK3sKKwlzdHJ1Y3QgcnBjX3Rhc2sJCSp0YXNrID0gJmRhdGEtPnRhc2s7CisJc3RydWN0IGlub2RlCQkqaW5vZGU7CisKKwkvKiBTZXQgdXAgdGhlIFJQQyBhcmd1bWVudCBhbmQgcmVwbHkgc3RydWN0cworCSAqIE5COiB0YWtlIGNhcmUgbm90IHRvIG1lc3MgYWJvdXQgd2l0aCBkYXRhLT5jb21taXQgZXQgYWwuICovCisKKwlkYXRhLT5yZXEgPSByZXE7CisJZGF0YS0+aW5vZGUgPSBpbm9kZSA9IHJlcS0+d2JfY29udGV4dC0+ZGVudHJ5LT5kX2lub2RlOworCWRhdGEtPmNyZWQgPSByZXEtPndiX2NvbnRleHQtPmNyZWQ7CisKKwlkYXRhLT5hcmdzLmZoICAgICA9IE5GU19GSChpbm9kZSk7CisJZGF0YS0+YXJncy5vZmZzZXQgPSByZXFfb2Zmc2V0KHJlcSkgKyBvZmZzZXQ7CisJZGF0YS0+YXJncy5wZ2Jhc2UgPSByZXEtPndiX3BnYmFzZSArIG9mZnNldDsKKwlkYXRhLT5hcmdzLnBhZ2VzICA9IGRhdGEtPnBhZ2V2ZWM7CisJZGF0YS0+YXJncy5jb3VudCAgPSBjb3VudDsKKwlkYXRhLT5hcmdzLmNvbnRleHQgPSByZXEtPndiX2NvbnRleHQ7CisKKwlkYXRhLT5yZXMuZmF0dHIgICA9ICZkYXRhLT5mYXR0cjsKKwlkYXRhLT5yZXMuY291bnQgICA9IGNvdW50OworCWRhdGEtPnJlcy52ZXJmICAgID0gJmRhdGEtPnZlcmY7CisKKwlORlNfUFJPVE8oaW5vZGUpLT53cml0ZV9zZXR1cChkYXRhLCBob3cpOworCisJZGF0YS0+dGFzay50a19wcmlvcml0eSA9IGZsdXNoX3Rhc2tfcHJpb3JpdHkoaG93KTsKKwlkYXRhLT50YXNrLnRrX2Nvb2tpZSA9ICh1bnNpZ25lZCBsb25nKWlub2RlOworCWRhdGEtPnRhc2sudGtfY2FsbGRhdGEgPSBkYXRhOworCS8qIFJlbGVhc2UgcmVxdWVzdHMgKi8KKwlkYXRhLT50YXNrLnRrX3JlbGVhc2UgPSBuZnNfd3JpdGVkYXRhX3JlbGVhc2U7CisKKwlkcHJpbnRrKCJORlM6ICU0ZCBpbml0aWF0ZWQgd3JpdGUgY2FsbCAocmVxICVzLyVMZCwgJXUgYnl0ZXMgQCBvZmZzZXQgJUx1KVxuIiwKKwkJdGFzay0+dGtfcGlkLAorCQlpbm9kZS0+aV9zYi0+c19pZCwKKwkJKGxvbmcgbG9uZylORlNfRklMRUlEKGlub2RlKSwKKwkJY291bnQsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpZGF0YS0+YXJncy5vZmZzZXQpOworfQorCitzdGF0aWMgdm9pZCBuZnNfZXhlY3V0ZV93cml0ZShzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IHJwY19jbG50ICpjbG50ID0gTkZTX0NMSUVOVChkYXRhLT5pbm9kZSk7CisJc2lnc2V0X3Qgb2xkc2V0OworCisJcnBjX2NsbnRfc2lnbWFzayhjbG50LCAmb2xkc2V0KTsKKwlsb2NrX2tlcm5lbCgpOworCXJwY19leGVjdXRlKCZkYXRhLT50YXNrKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcnBjX2NsbnRfc2lndW5tYXNrKGNsbnQsICZvbGRzZXQpOworfQorCisvKgorICogR2VuZXJhdGUgbXVsdGlwbGUgc21hbGwgcmVxdWVzdHMgdG8gd3JpdGUgb3V0IGEgc2luZ2xlCisgKiBjb250aWd1b3VzIGRpcnR5IGFyZWEgb24gb25lIHBhZ2UuCisgKi8KK3N0YXRpYyBpbnQgbmZzX2ZsdXNoX211bHRpKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBob3cpCit7CisJc3RydWN0IG5mc19wYWdlICpyZXEgPSBuZnNfbGlzdF9lbnRyeShoZWFkLT5uZXh0KTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHJlcS0+d2JfcGFnZTsKKwlzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKmRhdGE7CisJdW5zaWduZWQgaW50IHdzaXplID0gTkZTX1NFUlZFUihpbm9kZSktPndzaXplOworCXVuc2lnbmVkIGludCBuYnl0ZXMsIG9mZnNldDsKKwlpbnQgcmVxdWVzdHMgPSAwOworCUxJU1RfSEVBRChsaXN0KTsKKworCW5mc19saXN0X3JlbW92ZV9yZXF1ZXN0KHJlcSk7CisKKwluYnl0ZXMgPSByZXEtPndiX2J5dGVzOworCWZvciAoOzspIHsKKwkJZGF0YSA9IG5mc193cml0ZWRhdGFfYWxsb2MoKTsKKwkJaWYgKCFkYXRhKQorCQkJZ290byBvdXRfYmFkOworCQlsaXN0X2FkZCgmZGF0YS0+cGFnZXMsICZsaXN0KTsKKwkJcmVxdWVzdHMrKzsKKwkJaWYgKG5ieXRlcyA8PSB3c2l6ZSkKKwkJCWJyZWFrOworCQluYnl0ZXMgLT0gd3NpemU7CisJfQorCWF0b21pY19zZXQoJnJlcS0+d2JfY29tcGxldGUsIHJlcXVlc3RzKTsKKworCUNsZWFyUGFnZUVycm9yKHBhZ2UpOworCVNldFBhZ2VXcml0ZWJhY2socGFnZSk7CisJb2Zmc2V0ID0gMDsKKwluYnl0ZXMgPSByZXEtPndiX2J5dGVzOworCWRvIHsKKwkJZGF0YSA9IGxpc3RfZW50cnkobGlzdC5uZXh0LCBzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEsIHBhZ2VzKTsKKwkJbGlzdF9kZWxfaW5pdCgmZGF0YS0+cGFnZXMpOworCisJCWRhdGEtPnBhZ2V2ZWNbMF0gPSBwYWdlOworCQlkYXRhLT5jb21wbGV0ZSA9IG5mc193cml0ZWJhY2tfZG9uZV9wYXJ0aWFsOworCisJCWlmIChuYnl0ZXMgPiB3c2l6ZSkgeworCQkJbmZzX3dyaXRlX3JwY3NldHVwKHJlcSwgZGF0YSwgd3NpemUsIG9mZnNldCwgaG93KTsKKwkJCW9mZnNldCArPSB3c2l6ZTsKKwkJCW5ieXRlcyAtPSB3c2l6ZTsKKwkJfSBlbHNlIHsKKwkJCW5mc193cml0ZV9ycGNzZXR1cChyZXEsIGRhdGEsIG5ieXRlcywgb2Zmc2V0LCBob3cpOworCQkJbmJ5dGVzID0gMDsKKwkJfQorCQluZnNfZXhlY3V0ZV93cml0ZShkYXRhKTsKKwl9IHdoaWxlIChuYnl0ZXMgIT0gMCk7CisKKwlyZXR1cm4gMDsKKworb3V0X2JhZDoKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmxpc3QpKSB7CisJCWRhdGEgPSBsaXN0X2VudHJ5KGxpc3QubmV4dCwgc3RydWN0IG5mc193cml0ZV9kYXRhLCBwYWdlcyk7CisJCWxpc3RfZGVsKCZkYXRhLT5wYWdlcyk7CisJCW5mc193cml0ZWRhdGFfZnJlZShkYXRhKTsKKwl9CisJbmZzX21hcmtfcmVxdWVzdF9kaXJ0eShyZXEpOworCW5mc191bmxvY2tfcmVxdWVzdChyZXEpOworCXJldHVybiAtRU5PTUVNOworfQorCisvKgorICogQ3JlYXRlIGFuIFJQQyB0YXNrIGZvciB0aGUgZ2l2ZW4gd3JpdGUgcmVxdWVzdCBhbmQga2ljayBpdC4KKyAqIFRoZSBwYWdlIG11c3QgaGF2ZSBiZWVuIGxvY2tlZCBieSB0aGUgY2FsbGVyLgorICoKKyAqIEl0IG1heSBoYXBwZW4gdGhhdCB0aGUgcGFnZSB3ZSdyZSBwYXNzZWQgaXMgbm90IG1hcmtlZCBkaXJ0eS4KKyAqIFRoaXMgaXMgdGhlIGNhc2UgaWYgbmZzX3VwZGF0ZXBhZ2UgZGV0ZWN0cyBhIGNvbmZsaWN0aW5nIHJlcXVlc3QKKyAqIHRoYXQgaGFzIGJlZW4gd3JpdHRlbiBidXQgbm90IGNvbW1pdHRlZC4KKyAqLworc3RhdGljIGludCBuZnNfZmx1c2hfb25lKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBob3cpCit7CisJc3RydWN0IG5mc19wYWdlCQkqcmVxOworCXN0cnVjdCBwYWdlCQkqKnBhZ2VzOworCXN0cnVjdCBuZnNfd3JpdGVfZGF0YQkqZGF0YTsKKwl1bnNpZ25lZCBpbnQJCWNvdW50OworCisJaWYgKE5GU19TRVJWRVIoaW5vZGUpLT53c2l6ZSA8IFBBR0VfQ0FDSEVfU0laRSkKKwkJcmV0dXJuIG5mc19mbHVzaF9tdWx0aShoZWFkLCBpbm9kZSwgaG93KTsKKworCWRhdGEgPSBuZnNfd3JpdGVkYXRhX2FsbG9jKCk7CisJaWYgKCFkYXRhKQorCQlnb3RvIG91dF9iYWQ7CisKKwlwYWdlcyA9IGRhdGEtPnBhZ2V2ZWM7CisJY291bnQgPSAwOworCXdoaWxlICghbGlzdF9lbXB0eShoZWFkKSkgeworCQlyZXEgPSBuZnNfbGlzdF9lbnRyeShoZWFkLT5uZXh0KTsKKwkJbmZzX2xpc3RfcmVtb3ZlX3JlcXVlc3QocmVxKTsKKwkJbmZzX2xpc3RfYWRkX3JlcXVlc3QocmVxLCAmZGF0YS0+cGFnZXMpOworCQlDbGVhclBhZ2VFcnJvcihyZXEtPndiX3BhZ2UpOworCQlTZXRQYWdlV3JpdGViYWNrKHJlcS0+d2JfcGFnZSk7CisJCSpwYWdlcysrID0gcmVxLT53Yl9wYWdlOworCQljb3VudCArPSByZXEtPndiX2J5dGVzOworCX0KKwlyZXEgPSBuZnNfbGlzdF9lbnRyeShkYXRhLT5wYWdlcy5uZXh0KTsKKworCWRhdGEtPmNvbXBsZXRlID0gbmZzX3dyaXRlYmFja19kb25lX2Z1bGw7CisJLyogU2V0IHVwIHRoZSBhcmd1bWVudCBzdHJ1Y3QgKi8KKwluZnNfd3JpdGVfcnBjc2V0dXAocmVxLCBkYXRhLCBjb3VudCwgMCwgaG93KTsKKworCW5mc19leGVjdXRlX3dyaXRlKGRhdGEpOworCXJldHVybiAwOworIG91dF9iYWQ6CisJd2hpbGUgKCFsaXN0X2VtcHR5KGhlYWQpKSB7CisJCXN0cnVjdCBuZnNfcGFnZSAqcmVxID0gbmZzX2xpc3RfZW50cnkoaGVhZC0+bmV4dCk7CisJCW5mc19saXN0X3JlbW92ZV9yZXF1ZXN0KHJlcSk7CisJCW5mc19tYXJrX3JlcXVlc3RfZGlydHkocmVxKTsKKwkJbmZzX3VubG9ja19yZXF1ZXN0KHJlcSk7CisJfQorCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgaW50CituZnNfZmx1c2hfbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCBpbnQgd3BhZ2VzLCBpbnQgaG93KQoreworCUxJU1RfSEVBRChvbmVfcmVxdWVzdCk7CisJc3RydWN0IG5mc19wYWdlCQkqcmVxOworCWludAkJCWVycm9yID0gMDsKKwl1bnNpZ25lZCBpbnQJCXBhZ2VzID0gMDsKKworCXdoaWxlICghbGlzdF9lbXB0eShoZWFkKSkgeworCQlwYWdlcyArPSBuZnNfY29hbGVzY2VfcmVxdWVzdHMoaGVhZCwgJm9uZV9yZXF1ZXN0LCB3cGFnZXMpOworCQlyZXEgPSBuZnNfbGlzdF9lbnRyeShvbmVfcmVxdWVzdC5uZXh0KTsKKwkJZXJyb3IgPSBuZnNfZmx1c2hfb25lKCZvbmVfcmVxdWVzdCwgcmVxLT53Yl9jb250ZXh0LT5kZW50cnktPmRfaW5vZGUsIGhvdyk7CisJCWlmIChlcnJvciA8IDApCisJCQlicmVhazsKKwl9CisJaWYgKGVycm9yID49IDApCisJCXJldHVybiBwYWdlczsKKworCXdoaWxlICghbGlzdF9lbXB0eShoZWFkKSkgeworCQlyZXEgPSBuZnNfbGlzdF9lbnRyeShoZWFkLT5uZXh0KTsKKwkJbmZzX2xpc3RfcmVtb3ZlX3JlcXVlc3QocmVxKTsKKwkJbmZzX21hcmtfcmVxdWVzdF9kaXJ0eShyZXEpOworCQluZnNfdW5sb2NrX3JlcXVlc3QocmVxKTsKKwl9CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogSGFuZGxlIGEgd3JpdGUgcmVwbHkgdGhhdCBmbHVzaGVkIHBhcnQgb2YgYSBwYWdlLgorICovCitzdGF0aWMgdm9pZCBuZnNfd3JpdGViYWNrX2RvbmVfcGFydGlhbChzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKmRhdGEsIGludCBzdGF0dXMpCit7CisJc3RydWN0IG5mc19wYWdlCQkqcmVxID0gZGF0YS0+cmVxOworCXN0cnVjdCBwYWdlCQkqcGFnZSA9IHJlcS0+d2JfcGFnZTsKKworCWRwcmludGsoIk5GUzogd3JpdGUgKCVzLyVMZCAlZEAlTGQpIiwKKwkJcmVxLT53Yl9jb250ZXh0LT5kZW50cnktPmRfaW5vZGUtPmlfc2ItPnNfaWQsCisJCShsb25nIGxvbmcpTkZTX0ZJTEVJRChyZXEtPndiX2NvbnRleHQtPmRlbnRyeS0+ZF9pbm9kZSksCisJCXJlcS0+d2JfYnl0ZXMsCisJCShsb25nIGxvbmcpcmVxX29mZnNldChyZXEpKTsKKworCWlmIChzdGF0dXMgPCAwKSB7CisJCUNsZWFyUGFnZVVwdG9kYXRlKHBhZ2UpOworCQlTZXRQYWdlRXJyb3IocGFnZSk7CisJCXJlcS0+d2JfY29udGV4dC0+ZXJyb3IgPSBzdGF0dXM7CisJCWRwcmludGsoIiwgZXJyb3IgPSAlZFxuIiwgc3RhdHVzKTsKKwl9IGVsc2UgeworI2lmIGRlZmluZWQoQ09ORklHX05GU19WMykgfHwgZGVmaW5lZChDT05GSUdfTkZTX1Y0KQorCQlpZiAoZGF0YS0+dmVyZi5jb21taXR0ZWQgPCBORlNfRklMRV9TWU5DKSB7CisJCQlpZiAoIU5GU19ORUVEX0NPTU1JVChyZXEpKSB7CisJCQkJbmZzX2RlZmVyX2NvbW1pdChyZXEpOworCQkJCW1lbWNweSgmcmVxLT53Yl92ZXJmLCAmZGF0YS0+dmVyZiwgc2l6ZW9mKHJlcS0+d2JfdmVyZikpOworCQkJCWRwcmludGsoIiBkZWZlciBjb21taXRcbiIpOworCQkJfSBlbHNlIGlmIChtZW1jbXAoJnJlcS0+d2JfdmVyZiwgJmRhdGEtPnZlcmYsIHNpemVvZihyZXEtPndiX3ZlcmYpKSkgeworCQkJCW5mc19kZWZlcl9yZXNjaGVkdWxlKHJlcSk7CisJCQkJZHByaW50aygiIHNlcnZlciByZWJvb3QgZGV0ZWN0ZWRcbiIpOworCQkJfQorCQl9IGVsc2UKKyNlbmRpZgorCQkJZHByaW50aygiIE9LXG4iKTsKKwl9CisKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcmVxLT53Yl9jb21wbGV0ZSkpCisJCW5mc193cml0ZXBhZ2VfcmVsZWFzZShyZXEpOworfQorCisvKgorICogSGFuZGxlIGEgd3JpdGUgcmVwbHkgdGhhdCBmbHVzaGVzIGEgd2hvbGUgcGFnZS4KKyAqCisgKiBGSVhNRTogVGhlcmUgaXMgYW4gaW5oZXJlbnQgcmFjZSB3aXRoIGludmFsaWRhdGVfaW5vZGVfcGFnZXMgYW5kCisgKgkgIHdyaXRlYmFja3Mgc2luY2UgdGhlIHBhZ2UtPmNvdW50IGlzIGtlcHQgPiAxIGZvciBhcyBsb25nCisgKgkgIGFzIHRoZSBwYWdlIGhhcyBhIHdyaXRlIHJlcXVlc3QgcGVuZGluZy4KKyAqLworc3RhdGljIHZvaWQgbmZzX3dyaXRlYmFja19kb25lX2Z1bGwoc3RydWN0IG5mc193cml0ZV9kYXRhICpkYXRhLCBpbnQgc3RhdHVzKQoreworCXN0cnVjdCBuZnNfcGFnZQkJKnJlcTsKKwlzdHJ1Y3QgcGFnZQkJKnBhZ2U7CisKKwkvKiBVcGRhdGUgYXR0cmlidXRlcyBhcyByZXN1bHQgb2Ygd3JpdGViYWNrLiAqLworCXdoaWxlICghbGlzdF9lbXB0eSgmZGF0YS0+cGFnZXMpKSB7CisJCXJlcSA9IG5mc19saXN0X2VudHJ5KGRhdGEtPnBhZ2VzLm5leHQpOworCQluZnNfbGlzdF9yZW1vdmVfcmVxdWVzdChyZXEpOworCQlwYWdlID0gcmVxLT53Yl9wYWdlOworCisJCWRwcmludGsoIk5GUzogd3JpdGUgKCVzLyVMZCAlZEAlTGQpIiwKKwkJCXJlcS0+d2JfY29udGV4dC0+ZGVudHJ5LT5kX2lub2RlLT5pX3NiLT5zX2lkLAorCQkJKGxvbmcgbG9uZylORlNfRklMRUlEKHJlcS0+d2JfY29udGV4dC0+ZGVudHJ5LT5kX2lub2RlKSwKKwkJCXJlcS0+d2JfYnl0ZXMsCisJCQkobG9uZyBsb25nKXJlcV9vZmZzZXQocmVxKSk7CisKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCUNsZWFyUGFnZVVwdG9kYXRlKHBhZ2UpOworCQkJU2V0UGFnZUVycm9yKHBhZ2UpOworCQkJcmVxLT53Yl9jb250ZXh0LT5lcnJvciA9IHN0YXR1czsKKwkJCWVuZF9wYWdlX3dyaXRlYmFjayhwYWdlKTsKKwkJCW5mc19pbm9kZV9yZW1vdmVfcmVxdWVzdChyZXEpOworCQkJZHByaW50aygiLCBlcnJvciA9ICVkXG4iLCBzdGF0dXMpOworCQkJZ290byBuZXh0OworCQl9CisJCWVuZF9wYWdlX3dyaXRlYmFjayhwYWdlKTsKKworI2lmIGRlZmluZWQoQ09ORklHX05GU19WMykgfHwgZGVmaW5lZChDT05GSUdfTkZTX1Y0KQorCQlpZiAoZGF0YS0+YXJncy5zdGFibGUgIT0gTkZTX1VOU1RBQkxFIHx8IGRhdGEtPnZlcmYuY29tbWl0dGVkID09IE5GU19GSUxFX1NZTkMpIHsKKwkJCW5mc19pbm9kZV9yZW1vdmVfcmVxdWVzdChyZXEpOworCQkJZHByaW50aygiIE9LXG4iKTsKKwkJCWdvdG8gbmV4dDsKKwkJfQorCQltZW1jcHkoJnJlcS0+d2JfdmVyZiwgJmRhdGEtPnZlcmYsIHNpemVvZihyZXEtPndiX3ZlcmYpKTsKKwkJbmZzX21hcmtfcmVxdWVzdF9jb21taXQocmVxKTsKKwkJZHByaW50aygiIG1hcmtlZCBmb3IgY29tbWl0XG4iKTsKKyNlbHNlCisJCW5mc19pbm9kZV9yZW1vdmVfcmVxdWVzdChyZXEpOworI2VuZGlmCisJbmV4dDoKKwkJbmZzX3VubG9ja19yZXF1ZXN0KHJlcSk7CisJfQorfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgV1JJVEUgY2FsbCBpcyBjb21wbGV0ZS4KKyAqLwordm9pZCBuZnNfd3JpdGViYWNrX2RvbmUoc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCXN0cnVjdCBuZnNfd3JpdGVfZGF0YQkqZGF0YSA9IChzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKikgdGFzay0+dGtfY2FsbGRhdGE7CisJc3RydWN0IG5mc193cml0ZWFyZ3MJKmFyZ3AgPSAmZGF0YS0+YXJnczsKKwlzdHJ1Y3QgbmZzX3dyaXRlcmVzCSpyZXNwID0gJmRhdGEtPnJlczsKKworCWRwcmludGsoIk5GUzogJTRkIG5mc193cml0ZWJhY2tfZG9uZSAoc3RhdHVzICVkKVxuIiwKKwkJdGFzay0+dGtfcGlkLCB0YXNrLT50a19zdGF0dXMpOworCisjaWYgZGVmaW5lZChDT05GSUdfTkZTX1YzKSB8fCBkZWZpbmVkKENPTkZJR19ORlNfVjQpCisJaWYgKHJlc3AtPnZlcmYtPmNvbW1pdHRlZCA8IGFyZ3AtPnN0YWJsZSAmJiB0YXNrLT50a19zdGF0dXMgPj0gMCkgeworCQkvKiBXZSB0cmllZCBhIHdyaXRlIGNhbGwsIGJ1dCB0aGUgc2VydmVyIGRpZCBub3QKKwkJICogY29tbWl0IGRhdGEgdG8gc3RhYmxlIHN0b3JhZ2UgZXZlbiB0aG91Z2ggd2UKKwkJICogcmVxdWVzdGVkIGl0LgorCQkgKiBOb3RlOiBUaGVyZSBpcyBhIGtub3duIGJ1ZyBpbiBUcnU2NCA8IDUuMCBpbiB3aGljaAorCQkgKgkgdGhlIHNlcnZlciByZXBvcnRzIE5GU19EQVRBX1NZTkMsIGJ1dCBwZXJmb3JtcworCQkgKgkgTkZTX0ZJTEVfU1lOQy4gV2UgdGhlcmVmb3JlIGltcGxlbWVudCB0aGlzIGNoZWNraW5nCisJCSAqCSBhcyBhIGRwcmludGsoKSBpbiBvcmRlciB0byBhdm9pZCBmaWxsaW5nIHN5c2xvZy4KKwkJICovCisJCXN0YXRpYyB1bnNpZ25lZCBsb25nICAgIGNvbXBsYWluOworCisJCWlmICh0aW1lX2JlZm9yZShjb21wbGFpbiwgamlmZmllcykpIHsKKwkJCWRwcmludGsoIk5GUzogZmF1bHR5IE5GUyBzZXJ2ZXIgJXM6IgorCQkJCSIgKGNvbW1pdHRlZCA9ICVkKSAhPSAoc3RhYmxlID0gJWQpXG4iLAorCQkJCU5GU19TRVJWRVIoZGF0YS0+aW5vZGUpLT5ob3N0bmFtZSwKKwkJCQlyZXNwLT52ZXJmLT5jb21taXR0ZWQsIGFyZ3AtPnN0YWJsZSk7CisJCQljb21wbGFpbiA9IGppZmZpZXMgKyAzMDAgKiBIWjsKKwkJfQorCX0KKyNlbmRpZgorCS8qIElzIHRoaXMgYSBzaG9ydCB3cml0ZT8gKi8KKwlpZiAodGFzay0+dGtfc3RhdHVzID49IDAgJiYgcmVzcC0+Y291bnQgPCBhcmdwLT5jb3VudCkgeworCQlzdGF0aWMgdW5zaWduZWQgbG9uZyAgICBjb21wbGFpbjsKKworCQkvKiBIYXMgdGhlIHNlcnZlciBhdCBsZWFzdCBtYWRlIHNvbWUgcHJvZ3Jlc3M/ICovCisJCWlmIChyZXNwLT5jb3VudCAhPSAwKSB7CisJCQkvKiBXYXMgdGhpcyBhbiBORlN2MiB3cml0ZSBvciBhbiBORlN2MyBzdGFibGUgd3JpdGU/ICovCisJCQlpZiAocmVzcC0+dmVyZi0+Y29tbWl0dGVkICE9IE5GU19VTlNUQUJMRSkgeworCQkJCS8qIFJlc2VuZCBmcm9tIHdoZXJlIHRoZSBzZXJ2ZXIgbGVmdCBvZmYgKi8KKwkJCQlhcmdwLT5vZmZzZXQgKz0gcmVzcC0+Y291bnQ7CisJCQkJYXJncC0+cGdiYXNlICs9IHJlc3AtPmNvdW50OworCQkJCWFyZ3AtPmNvdW50IC09IHJlc3AtPmNvdW50OworCQkJfSBlbHNlIHsKKwkJCQkvKiBSZXNlbmQgYXMgYSBzdGFibGUgd3JpdGUgaW4gb3JkZXIgdG8gYXZvaWQKKwkJCQkgKiBoZWFkYWNoZXMgaW4gdGhlIGNhc2Ugb2YgYSBzZXJ2ZXIgY3Jhc2guCisJCQkJICovCisJCQkJYXJncC0+c3RhYmxlID0gTkZTX0ZJTEVfU1lOQzsKKwkJCX0KKwkJCXJwY19yZXN0YXJ0X2NhbGwodGFzayk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKHRpbWVfYmVmb3JlKGNvbXBsYWluLCBqaWZmaWVzKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJORlM6IFNlcnZlciB3cm90ZSB6ZXJvIGJ5dGVzLCBleHBlY3RlZCAldS5cbiIsCisJCQkJCWFyZ3AtPmNvdW50KTsKKwkJCWNvbXBsYWluID0gamlmZmllcyArIDMwMCAqIEhaOworCQl9CisJCS8qIENhbid0IGRvIGFueXRoaW5nIGFib3V0IGl0IGV4Y2VwdCB0aHJvdyBhbiBlcnJvci4gKi8KKwkJdGFzay0+dGtfc3RhdHVzID0gLUVJTzsKKwl9CisKKwkvKgorCSAqIFByb2Nlc3MgdGhlIG5mc19wYWdlIGxpc3QKKwkgKi8KKwlkYXRhLT5jb21wbGV0ZShkYXRhLCB0YXNrLT50a19zdGF0dXMpOworfQorCisKKyNpZiBkZWZpbmVkKENPTkZJR19ORlNfVjMpIHx8IGRlZmluZWQoQ09ORklHX05GU19WNCkKK3N0YXRpYyB2b2lkIG5mc19jb21taXRfcmVsZWFzZShzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2spCit7CisJc3RydWN0IG5mc193cml0ZV9kYXRhCSp3ZGF0YSA9IChzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKil0YXNrLT50a19jYWxsZGF0YTsKKwluZnNfY29tbWl0X2ZyZWUod2RhdGEpOworfQorCisvKgorICogU2V0IHVwIHRoZSBhcmd1bWVudC9yZXN1bHQgc3RvcmFnZSByZXF1aXJlZCBmb3IgdGhlIFJQQyBjYWxsLgorICovCitzdGF0aWMgdm9pZCBuZnNfY29tbWl0X3JwY3NldHVwKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCisJCXN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqZGF0YSwgaW50IGhvdykKK3sKKwlzdHJ1Y3QgcnBjX3Rhc2sJCSp0YXNrID0gJmRhdGEtPnRhc2s7CisJc3RydWN0IG5mc19wYWdlCQkqZmlyc3QsICpsYXN0OworCXN0cnVjdCBpbm9kZQkJKmlub2RlOworCWxvZmZfdAkJCXN0YXJ0LCBlbmQsIGxlbjsKKworCS8qIFNldCB1cCB0aGUgUlBDIGFyZ3VtZW50IGFuZCByZXBseSBzdHJ1Y3RzCisJICogTkI6IHRha2UgY2FyZSBub3QgdG8gbWVzcyBhYm91dCB3aXRoIGRhdGEtPmNvbW1pdCBldCBhbC4gKi8KKworCWxpc3Rfc3BsaWNlX2luaXQoaGVhZCwgJmRhdGEtPnBhZ2VzKTsKKwlmaXJzdCA9IG5mc19saXN0X2VudHJ5KGRhdGEtPnBhZ2VzLm5leHQpOworCWxhc3QgPSBuZnNfbGlzdF9lbnRyeShkYXRhLT5wYWdlcy5wcmV2KTsKKwlpbm9kZSA9IGZpcnN0LT53Yl9jb250ZXh0LT5kZW50cnktPmRfaW5vZGU7CisKKwkvKgorCSAqIERldGVybWluZSB0aGUgb2Zmc2V0IHJhbmdlIG9mIHJlcXVlc3RzIGluIHRoZSBDT01NSVQgY2FsbC4KKwkgKiBXZSByZWx5IG9uIHRoZSBmYWN0IHRoYXQgZGF0YS0+cGFnZXMgaXMgYW4gb3JkZXJlZCBsaXN0Li4uCisJICovCisJc3RhcnQgPSByZXFfb2Zmc2V0KGZpcnN0KTsKKwllbmQgPSByZXFfb2Zmc2V0KGxhc3QpICsgbGFzdC0+d2JfYnl0ZXM7CisJbGVuID0gZW5kIC0gc3RhcnQ7CisJLyogSWYgJ2xlbicgaXMgbm90IGEgMzItYml0IHF1YW50aXR5LCBwYXNzICcwJyBpbiB0aGUgQ09NTUlUIGNhbGwgKi8KKwlpZiAoZW5kID49IGlfc2l6ZV9yZWFkKGlub2RlKSB8fCBsZW4gPCAwIHx8IGxlbiA+ICh+KCh1MzIpMCkgPj4gMSkpCisJCWxlbiA9IDA7CisKKwlkYXRhLT5pbm9kZQkgID0gaW5vZGU7CisJZGF0YS0+Y3JlZAkgID0gZmlyc3QtPndiX2NvbnRleHQtPmNyZWQ7CisKKwlkYXRhLT5hcmdzLmZoICAgICA9IE5GU19GSChkYXRhLT5pbm9kZSk7CisJZGF0YS0+YXJncy5vZmZzZXQgPSBzdGFydDsKKwlkYXRhLT5hcmdzLmNvdW50ICA9IGxlbjsKKwlkYXRhLT5yZXMuY291bnQgICA9IGxlbjsKKwlkYXRhLT5yZXMuZmF0dHIgICA9ICZkYXRhLT5mYXR0cjsKKwlkYXRhLT5yZXMudmVyZiAgICA9ICZkYXRhLT52ZXJmOworCQorCU5GU19QUk9UTyhpbm9kZSktPmNvbW1pdF9zZXR1cChkYXRhLCBob3cpOworCisJZGF0YS0+dGFzay50a19wcmlvcml0eSA9IGZsdXNoX3Rhc2tfcHJpb3JpdHkoaG93KTsKKwlkYXRhLT50YXNrLnRrX2Nvb2tpZSA9ICh1bnNpZ25lZCBsb25nKWlub2RlOworCWRhdGEtPnRhc2sudGtfY2FsbGRhdGEgPSBkYXRhOworCS8qIFJlbGVhc2UgcmVxdWVzdHMgKi8KKwlkYXRhLT50YXNrLnRrX3JlbGVhc2UgPSBuZnNfY29tbWl0X3JlbGVhc2U7CisJCisJZHByaW50aygiTkZTOiAlNGQgaW5pdGlhdGVkIGNvbW1pdCBjYWxsXG4iLCB0YXNrLT50a19waWQpOworfQorCisvKgorICogQ29tbWl0IGRpcnR5IHBhZ2VzCisgKi8KK3N0YXRpYyBpbnQKK25mc19jb21taXRfbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCBpbnQgaG93KQoreworCXN0cnVjdCBuZnNfd3JpdGVfZGF0YQkqZGF0YTsKKwlzdHJ1Y3QgbmZzX3BhZ2UgICAgICAgICAqcmVxOworCisJZGF0YSA9IG5mc19jb21taXRfYWxsb2MoKTsKKworCWlmICghZGF0YSkKKwkJZ290byBvdXRfYmFkOworCisJLyogU2V0IHVwIHRoZSBhcmd1bWVudCBzdHJ1Y3QgKi8KKwluZnNfY29tbWl0X3JwY3NldHVwKGhlYWQsIGRhdGEsIGhvdyk7CisKKwluZnNfZXhlY3V0ZV93cml0ZShkYXRhKTsKKwlyZXR1cm4gMDsKKyBvdXRfYmFkOgorCXdoaWxlICghbGlzdF9lbXB0eShoZWFkKSkgeworCQlyZXEgPSBuZnNfbGlzdF9lbnRyeShoZWFkLT5uZXh0KTsKKwkJbmZzX2xpc3RfcmVtb3ZlX3JlcXVlc3QocmVxKTsKKwkJbmZzX21hcmtfcmVxdWVzdF9jb21taXQocmVxKTsKKwkJbmZzX3VubG9ja19yZXF1ZXN0KHJlcSk7CisJfQorCXJldHVybiAtRU5PTUVNOworfQorCisvKgorICogQ09NTUlUIGNhbGwgcmV0dXJuZWQKKyAqLwordm9pZAorbmZzX2NvbW1pdF9kb25lKHN0cnVjdCBycGNfdGFzayAqdGFzaykKK3sKKwlzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEJKmRhdGEgPSAoc3RydWN0IG5mc193cml0ZV9kYXRhICopdGFzay0+dGtfY2FsbGRhdGE7CisJc3RydWN0IG5mc19wYWdlCQkqcmVxOworCWludCByZXMgPSAwOworCisgICAgICAgIGRwcmludGsoIk5GUzogJTRkIG5mc19jb21taXRfZG9uZSAoc3RhdHVzICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay0+dGtfcGlkLCB0YXNrLT50a19zdGF0dXMpOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZkYXRhLT5wYWdlcykpIHsKKwkJcmVxID0gbmZzX2xpc3RfZW50cnkoZGF0YS0+cGFnZXMubmV4dCk7CisJCW5mc19saXN0X3JlbW92ZV9yZXF1ZXN0KHJlcSk7CisKKwkJZHByaW50aygiTkZTOiBjb21taXQgKCVzLyVMZCAlZEAlTGQpIiwKKwkJCXJlcS0+d2JfY29udGV4dC0+ZGVudHJ5LT5kX2lub2RlLT5pX3NiLT5zX2lkLAorCQkJKGxvbmcgbG9uZylORlNfRklMRUlEKHJlcS0+d2JfY29udGV4dC0+ZGVudHJ5LT5kX2lub2RlKSwKKwkJCXJlcS0+d2JfYnl0ZXMsCisJCQkobG9uZyBsb25nKXJlcV9vZmZzZXQocmVxKSk7CisJCWlmICh0YXNrLT50a19zdGF0dXMgPCAwKSB7CisJCQlyZXEtPndiX2NvbnRleHQtPmVycm9yID0gdGFzay0+dGtfc3RhdHVzOworCQkJbmZzX2lub2RlX3JlbW92ZV9yZXF1ZXN0KHJlcSk7CisJCQlkcHJpbnRrKCIsIGVycm9yID0gJWRcbiIsIHRhc2stPnRrX3N0YXR1cyk7CisJCQlnb3RvIG5leHQ7CisJCX0KKworCQkvKiBPa2F5LCBDT01NSVQgc3VjY2VlZGVkLCBhcHBhcmVudGx5LiBDaGVjayB0aGUgdmVyaWZpZXIKKwkJICogcmV0dXJuZWQgYnkgdGhlIHNlcnZlciBhZ2FpbnN0IGFsbCBzdG9yZWQgdmVyZnMuICovCisJCWlmICghbWVtY21wKHJlcS0+d2JfdmVyZi52ZXJpZmllciwgZGF0YS0+dmVyZi52ZXJpZmllciwgc2l6ZW9mKGRhdGEtPnZlcmYudmVyaWZpZXIpKSkgeworCQkJLyogV2UgaGF2ZSBhIG1hdGNoICovCisJCQluZnNfaW5vZGVfcmVtb3ZlX3JlcXVlc3QocmVxKTsKKwkJCWRwcmludGsoIiBPS1xuIik7CisJCQlnb3RvIG5leHQ7CisJCX0KKwkJLyogV2UgaGF2ZSBhIG1pc21hdGNoLiBXcml0ZSB0aGUgcGFnZSBhZ2FpbiAqLworCQlkcHJpbnRrKCIgbWlzbWF0Y2hcbiIpOworCQluZnNfbWFya19yZXF1ZXN0X2RpcnR5KHJlcSk7CisJbmV4dDoKKwkJbmZzX3VubG9ja19yZXF1ZXN0KHJlcSk7CisJCXJlcysrOworCX0KKwlzdWJfcGFnZV9zdGF0ZShucl91bnN0YWJsZSxyZXMpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgbmZzX2ZsdXNoX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGxvbmcgaWR4X3N0YXJ0LAorCQkJICAgdW5zaWduZWQgaW50IG5wYWdlcywgaW50IGhvdykKK3sKKwlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOworCUxJU1RfSEVBRChoZWFkKTsKKwlpbnQJCQlyZXMsCisJCQkJZXJyb3IgPSAwOworCisJc3Bpbl9sb2NrKCZuZnNpLT5yZXFfbG9jayk7CisJcmVzID0gbmZzX3NjYW5fZGlydHkoaW5vZGUsICZoZWFkLCBpZHhfc3RhcnQsIG5wYWdlcyk7CisJc3Bpbl91bmxvY2soJm5mc2ktPnJlcV9sb2NrKTsKKwlpZiAocmVzKQorCQllcnJvciA9IG5mc19mbHVzaF9saXN0KCZoZWFkLCBORlNfU0VSVkVSKGlub2RlKS0+d3BhZ2VzLCBob3cpOworCWlmIChlcnJvciA8IDApCisJCXJldHVybiBlcnJvcjsKKwlyZXR1cm4gcmVzOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfTkZTX1YzKSB8fCBkZWZpbmVkKENPTkZJR19ORlNfVjQpCitpbnQgbmZzX2NvbW1pdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBsb25nIGlkeF9zdGFydCwKKwkJICAgIHVuc2lnbmVkIGludCBucGFnZXMsIGludCBob3cpCit7CisJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlub2RlKTsKKwlMSVNUX0hFQUQoaGVhZCk7CisJaW50CQkJcmVzLAorCQkJCWVycm9yID0gMDsKKworCXNwaW5fbG9jaygmbmZzaS0+cmVxX2xvY2spOworCXJlcyA9IG5mc19zY2FuX2NvbW1pdChpbm9kZSwgJmhlYWQsIGlkeF9zdGFydCwgbnBhZ2VzKTsKKwlpZiAocmVzKSB7CisJCXJlcyArPSBuZnNfc2Nhbl9jb21taXQoaW5vZGUsICZoZWFkLCAwLCAwKTsKKwkJc3Bpbl91bmxvY2soJm5mc2ktPnJlcV9sb2NrKTsKKwkJZXJyb3IgPSBuZnNfY29tbWl0X2xpc3QoJmhlYWQsIGhvdyk7CisJfSBlbHNlCisJCXNwaW5fdW5sb2NrKCZuZnNpLT5yZXFfbG9jayk7CisJaWYgKGVycm9yIDwgMCkKKwkJcmV0dXJuIGVycm9yOworCXJldHVybiByZXM7Cit9CisjZW5kaWYKKworaW50IG5mc19zeW5jX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGxvbmcgaWR4X3N0YXJ0LAorCQkgIHVuc2lnbmVkIGludCBucGFnZXMsIGludCBob3cpCit7CisJaW50CWVycm9yLAorCQl3YWl0OworCisJd2FpdCA9IGhvdyAmIEZMVVNIX1dBSVQ7CisJaG93ICY9IH5GTFVTSF9XQUlUOworCisJZG8geworCQllcnJvciA9IDA7CisJCWlmICh3YWl0KQorCQkJZXJyb3IgPSBuZnNfd2FpdF9vbl9yZXF1ZXN0cyhpbm9kZSwgaWR4X3N0YXJ0LCBucGFnZXMpOworCQlpZiAoZXJyb3IgPT0gMCkKKwkJCWVycm9yID0gbmZzX2ZsdXNoX2lub2RlKGlub2RlLCBpZHhfc3RhcnQsIG5wYWdlcywgaG93KTsKKyNpZiBkZWZpbmVkKENPTkZJR19ORlNfVjMpIHx8IGRlZmluZWQoQ09ORklHX05GU19WNCkKKwkJaWYgKGVycm9yID09IDApCisJCQllcnJvciA9IG5mc19jb21taXRfaW5vZGUoaW5vZGUsIGlkeF9zdGFydCwgbnBhZ2VzLCBob3cpOworI2VuZGlmCisJfSB3aGlsZSAoZXJyb3IgPiAwKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2ludCBuZnNfaW5pdF93cml0ZXBhZ2VjYWNoZSh2b2lkKQoreworCW5mc193ZGF0YV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgibmZzX3dyaXRlX2RhdGEiLAorCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEpLAorCQkJCQkgICAgIDAsIFNMQUJfSFdDQUNIRV9BTElHTiwKKwkJCQkJICAgICBOVUxMLCBOVUxMKTsKKwlpZiAobmZzX3dkYXRhX2NhY2hlcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW5mc193ZGF0YV9tZW1wb29sID0gbWVtcG9vbF9jcmVhdGUoTUlOX1BPT0xfV1JJVEUsCisJCQkJCSAgIG1lbXBvb2xfYWxsb2Nfc2xhYiwKKwkJCQkJICAgbWVtcG9vbF9mcmVlX3NsYWIsCisJCQkJCSAgIG5mc193ZGF0YV9jYWNoZXApOworCWlmIChuZnNfd2RhdGFfbWVtcG9vbCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW5mc19jb21taXRfbWVtcG9vbCA9IG1lbXBvb2xfY3JlYXRlKE1JTl9QT09MX0NPTU1JVCwKKwkJCQkJICAgbWVtcG9vbF9hbGxvY19zbGFiLAorCQkJCQkgICBtZW1wb29sX2ZyZWVfc2xhYiwKKwkJCQkJICAgbmZzX3dkYXRhX2NhY2hlcCk7CisJaWYgKG5mc19jb21taXRfbWVtcG9vbCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCit2b2lkIG5mc19kZXN0cm95X3dyaXRlcGFnZWNhY2hlKHZvaWQpCit7CisJbWVtcG9vbF9kZXN0cm95KG5mc19jb21taXRfbWVtcG9vbCk7CisJbWVtcG9vbF9kZXN0cm95KG5mc193ZGF0YV9tZW1wb29sKTsKKwlpZiAoa21lbV9jYWNoZV9kZXN0cm95KG5mc193ZGF0YV9jYWNoZXApKQorCQlwcmludGsoS0VSTl9JTkZPICJuZnNfd3JpdGVfZGF0YTogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOworfQorCmRpZmYgLS1naXQgYS9mcy9uZnNjdGwuYyBiL2ZzL25mc2N0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMTQ5MzgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnNjdGwuYwpAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqCWZzL25mc2N0bC5jCisgKgorICoJVGhpcyBzaG91bGQgZXZlbnR1YWxseSBtb3ZlIHRvIHVzZXJsYW5kLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL25mc2QuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworLyoKKyAqIG9wZW4gYSBmaWxlIG9uIG5mc2QgZnMKKyAqLworCitzdGF0aWMgc3RydWN0IGZpbGUgKmRvX29wZW4oY2hhciAqbmFtZSwgaW50IGZsYWdzKQoreworCXN0cnVjdCBuYW1laWRhdGEgbmQ7CisJaW50IGVycm9yOworCisJbmQubW50ID0gZG9fa2Vybl9tb3VudCgibmZzZCIsIDAsICJuZnNkIiwgTlVMTCk7CisKKwlpZiAoSVNfRVJSKG5kLm1udCkpCisJCXJldHVybiAoc3RydWN0IGZpbGUgKiluZC5tbnQ7CisKKwluZC5kZW50cnkgPSBkZ2V0KG5kLm1udC0+bW50X3Jvb3QpOworCW5kLmxhc3RfdHlwZSA9IExBU1RfUk9PVDsKKwluZC5mbGFncyA9IDA7CisJbmQuZGVwdGggPSAwOworCisJZXJyb3IgPSBwYXRoX3dhbGsobmFtZSwgJm5kKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBFUlJfUFRSKGVycm9yKTsKKworCWlmIChmbGFncyA9PSBPX1JEV1IpCisJCWVycm9yID0gbWF5X29wZW4oJm5kLE1BWV9SRUFEfE1BWV9XUklURSxGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKTsKKwllbHNlCisJCWVycm9yID0gbWF5X29wZW4oJm5kLCBNQVlfV1JJVEUsIEZNT0RFX1dSSVRFKTsKKworCWlmICghZXJyb3IpCisJCXJldHVybiBkZW50cnlfb3BlbihuZC5kZW50cnksIG5kLm1udCwgZmxhZ3MpOworCisJcGF0aF9yZWxlYXNlKCZuZCk7CisJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOworfQorCitzdGF0aWMgc3RydWN0IHsKKwljaGFyICpuYW1lOyBpbnQgd3NpemU7IGludCByc2l6ZTsKK30gbWFwW10gPSB7CisJW05GU0NUTF9TVkNdID0geworCQkubmFtZQk9ICIuc3ZjIiwKKwkJLndzaXplCT0gc2l6ZW9mKHN0cnVjdCBuZnNjdGxfc3ZjKQorCX0sCisJW05GU0NUTF9BRERDTElFTlRdID0geworCQkubmFtZQk9ICIuYWRkIiwKKwkJLndzaXplCT0gc2l6ZW9mKHN0cnVjdCBuZnNjdGxfY2xpZW50KQorCX0sCisJW05GU0NUTF9ERUxDTElFTlRdID0geworCQkubmFtZQk9ICIuZGVsIiwKKwkJLndzaXplCT0gc2l6ZW9mKHN0cnVjdCBuZnNjdGxfY2xpZW50KQorCX0sCisJW05GU0NUTF9FWFBPUlRdID0geworCQkubmFtZQk9ICIuZXhwb3J0IiwKKwkJLndzaXplCT0gc2l6ZW9mKHN0cnVjdCBuZnNjdGxfZXhwb3J0KQorCX0sCisJW05GU0NUTF9VTkVYUE9SVF0gPSB7CisJCS5uYW1lCT0gIi51bmV4cG9ydCIsCisJCS53c2l6ZQk9IHNpemVvZihzdHJ1Y3QgbmZzY3RsX2V4cG9ydCkKKwl9LAorCVtORlNDVExfR0VURkRdID0geworCQkubmFtZQk9ICIuZ2V0ZmQiLAorCQkud3NpemUJPSBzaXplb2Yoc3RydWN0IG5mc2N0bF9mZHBhcm0pLAorCQkucnNpemUJPSBORlNfRkhTSVpFCisJfSwKKwlbTkZTQ1RMX0dFVEZTXSA9IHsKKwkJLm5hbWUJPSAiLmdldGZzIiwKKwkJLndzaXplCT0gc2l6ZW9mKHN0cnVjdCBuZnNjdGxfZnNwYXJtKSwKKwkJLnJzaXplCT0gc2l6ZW9mKHN0cnVjdCBrbmZzZF9maCkKKwl9LAorfTsKKworbG9uZworYXNtbGlua2FnZSBzeXNfbmZzc2VydmN0bChpbnQgY21kLCBzdHJ1Y3QgbmZzY3RsX2FyZyBfX3VzZXIgKmFyZywgdm9pZCBfX3VzZXIgKnJlcykKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwl2b2lkIF9fdXNlciAqcCA9ICZhcmctPnU7CisJaW50IHZlcnNpb247CisJaW50IGVycjsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmdmVyc2lvbiwgJmFyZy0+Y2FfdmVyc2lvbiwgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICh2ZXJzaW9uICE9IE5GU0NUTF9WRVJTSU9OKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm5mc2Q6IGluY29tcGF0aWJsZSB2ZXJzaW9uIGluIHN5c2NhbGwuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNtZCA8IDAgfHwgY21kID49IHNpemVvZihtYXApL3NpemVvZihtYXBbMF0pIHx8ICFtYXBbY21kXS5uYW1lKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZpbGUgPSBkb19vcGVuKG1hcFtjbWRdLm5hbWUsIG1hcFtjbWRdLnJzaXplID8gT19SRFdSIDogT19XUk9OTFkpOwkKKwlpZiAoSVNfRVJSKGZpbGUpKQorCQlyZXR1cm4gUFRSX0VSUihmaWxlKTsKKwllcnIgPSBmaWxlLT5mX29wLT53cml0ZShmaWxlLCBwLCBtYXBbY21kXS53c2l6ZSwgJmZpbGUtPmZfcG9zKTsKKwlpZiAoZXJyID49IDAgJiYgbWFwW2NtZF0ucnNpemUpCisJCWVyciA9IGZpbGUtPmZfb3AtPnJlYWQoZmlsZSwgcmVzLCBtYXBbY21kXS5yc2l6ZSwgJmZpbGUtPmZfcG9zKTsKKwlpZiAoZXJyID49IDApCisJCWVyciA9IDA7CisJZnB1dChmaWxlKTsKKwlyZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9NYWtlZmlsZSBiL2ZzL25mc2QvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg2ODBhMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25mc2QvTWFrZWZpbGUKQEAgLTAsMCArMSwxMiBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IG5mcyBzZXJ2ZXIKKyMKKworb2JqLSQoQ09ORklHX05GU0QpCSs9IG5mc2QubworCituZnNkLXkgCQkJOj0gbmZzc3ZjLm8gbmZzY3RsLm8gbmZzcHJvYy5vIG5mc2ZoLm8gdmZzLm8gXAorCQkJICAgZXhwb3J0Lm8gYXV0aC5vIGxvY2tkLm8gbmZzY2FjaGUubyBuZnN4ZHIubyBzdGF0cy5vCituZnNkLSQoQ09ORklHX05GU0RfVjMpCSs9IG5mczNwcm9jLm8gbmZzM3hkci5vCituZnNkLSQoQ09ORklHX05GU0RfVjQpCSs9IG5mczRwcm9jLm8gbmZzNHhkci5vIG5mczRzdGF0ZS5vIG5mczRpZG1hcC5vIFwKKwkJCSAgIG5mczRhY2wubyBuZnM0Y2FsbGJhY2subworbmZzZC1vYmpzCQk6PSAkKG5mc2QteSkKZGlmZiAtLWdpdCBhL2ZzL25mc2QvYXV0aC5jIGIvZnMvbmZzZC9hdXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZlOWNlOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25mc2QvYXV0aC5jCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBsaW51eC9mcy9uZnNkL2F1dGguYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjYXV0aC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2QvbmZzZC5oPgorCisjZGVmaW5lCUNBUF9ORlNEX01BU0sgKENBUF9GU19NQVNLfENBUF9UT19NQVNLKENBUF9TWVNfUkVTT1VSQ0UpKQorCitpbnQgbmZzZF9zZXR1c2VyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZXhwb3J0ICpleHApCit7CisJc3RydWN0IHN2Y19jcmVkCSpjcmVkID0gJnJxc3RwLT5ycV9jcmVkOworCWludCBpOworCWludCByZXQ7CisKKwlpZiAoZXhwLT5leF9mbGFncyAmIE5GU0VYUF9BTExTUVVBU0gpIHsKKwkJY3JlZC0+Y3JfdWlkID0gZXhwLT5leF9hbm9uX3VpZDsKKwkJY3JlZC0+Y3JfZ2lkID0gZXhwLT5leF9hbm9uX2dpZDsKKwkJcHV0X2dyb3VwX2luZm8oY3JlZC0+Y3JfZ3JvdXBfaW5mbyk7CisJCWNyZWQtPmNyX2dyb3VwX2luZm8gPSBncm91cHNfYWxsb2MoMCk7CisJfSBlbHNlIGlmIChleHAtPmV4X2ZsYWdzICYgTkZTRVhQX1JPT1RTUVVBU0gpIHsKKwkJc3RydWN0IGdyb3VwX2luZm8gKmdpOworCQlpZiAoIWNyZWQtPmNyX3VpZCkKKwkJCWNyZWQtPmNyX3VpZCA9IGV4cC0+ZXhfYW5vbl91aWQ7CisJCWlmICghY3JlZC0+Y3JfZ2lkKQorCQkJY3JlZC0+Y3JfZ2lkID0gZXhwLT5leF9hbm9uX2dpZDsKKwkJZ2kgPSBncm91cHNfYWxsb2MoY3JlZC0+Y3JfZ3JvdXBfaW5mby0+bmdyb3Vwcyk7CisJCWlmIChnaSkKKwkJCWZvciAoaSA9IDA7IGkgPCBjcmVkLT5jcl9ncm91cF9pbmZvLT5uZ3JvdXBzOyBpKyspIHsKKwkJCQlpZiAoIUdST1VQX0FUKGNyZWQtPmNyX2dyb3VwX2luZm8sIGkpKQorCQkJCQlHUk9VUF9BVChnaSwgaSkgPSBleHAtPmV4X2Fub25fZ2lkOworCQkJCWVsc2UKKwkJCQkJR1JPVVBfQVQoZ2ksIGkpID0gR1JPVVBfQVQoY3JlZC0+Y3JfZ3JvdXBfaW5mbywgaSk7CisJCQl9CisJCXB1dF9ncm91cF9pbmZvKGNyZWQtPmNyX2dyb3VwX2luZm8pOworCQljcmVkLT5jcl9ncm91cF9pbmZvID0gZ2k7CisJfQorCisJaWYgKGNyZWQtPmNyX3VpZCAhPSAodWlkX3QpIC0xKQorCQljdXJyZW50LT5mc3VpZCA9IGNyZWQtPmNyX3VpZDsKKwllbHNlCisJCWN1cnJlbnQtPmZzdWlkID0gZXhwLT5leF9hbm9uX3VpZDsKKwlpZiAoY3JlZC0+Y3JfZ2lkICE9IChnaWRfdCkgLTEpCisJCWN1cnJlbnQtPmZzZ2lkID0gY3JlZC0+Y3JfZ2lkOworCWVsc2UKKwkJY3VycmVudC0+ZnNnaWQgPSBleHAtPmV4X2Fub25fZ2lkOworCisJaWYgKCFjcmVkLT5jcl9ncm91cF9pbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXQgPSBzZXRfY3VycmVudF9ncm91cHMoY3JlZC0+Y3JfZ3JvdXBfaW5mbyk7CisJaWYgKChjcmVkLT5jcl91aWQpKSB7CisJCWNhcF90KGN1cnJlbnQtPmNhcF9lZmZlY3RpdmUpICY9IH5DQVBfTkZTRF9NQVNLOworCX0gZWxzZSB7CisJCWNhcF90KGN1cnJlbnQtPmNhcF9lZmZlY3RpdmUpIHw9IChDQVBfTkZTRF9NQVNLICYKKwkJCQkJCSAgY3VycmVudC0+Y2FwX3Blcm1pdHRlZCk7CisJfQorCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9mcy9uZnNkL2V4cG9ydC5jIGIvZnMvbmZzZC9leHBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTExYWEzCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzZC9leHBvcnQuYwpAQCAtMCwwICsxLDEyMDAgQEAKKyNkZWZpbmUgTVNORlMJLyogSEFDSyBIQUNLICovCisvKgorICogbGludXgvZnMvbmZzZC9leHBvcnQuYworICoKKyAqIE5GUyBleHBvcnRpbmcgYW5kIHZhbGlkYXRpb24uCisgKgorICogV2UgbWFpbnRhaW4gYSBsaXN0IG9mIGNsaWVudHMsIGVhY2ggb2Ygd2hpY2ggaGFzIGEgbGlzdCBvZgorICogZXhwb3J0cy4gVG8gZXhwb3J0IGFuIGZzIHRvIGEgZ2l2ZW4gY2xpZW50LCB5b3UgZmlyc3QgaGF2ZQorICogdG8gY3JlYXRlIHRoZSBjbGllbnQgZW50cnkgd2l0aCBORlNDVExfQUREQ0xJRU5ULCB3aGljaAorICogY3JlYXRlcyBhIGNsaWVudCBjb250cm9sIGJsb2NrIGFuZCBhZGRzIGl0IHRvIHRoZSBoYXNoCisgKiB0YWJsZS4gVGhlbiwgeW91IGNhbGwgTkZTQ1RMX0VYUE9SVCBmb3IgZWFjaCBmcy4KKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IE9sYWYgS2lyY2gsIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CisjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KKworI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL25mc2QuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL25mc2ZoLmg+CisjaW5jbHVkZSA8bGludXgvbmZzZC9zeXNjYWxsLmg+CisjaW5jbHVkZSA8bGludXgvbG9ja2QvYmluZC5oPgorCisjZGVmaW5lIE5GU0REQkdfRkFDSUxJVFkJTkZTRERCR19FWFBPUlQKKyNkZWZpbmUgTkZTRF9QQVJBTk9JQSAxCisKK3R5cGVkZWYgc3RydWN0IGF1dGhfZG9tYWluCXN2Y19jbGllbnQ7Cit0eXBlZGVmIHN0cnVjdCBzdmNfZXhwb3J0CXN2Y19leHBvcnQ7CisKK3N0YXRpYyB2b2lkCQlleHBfZG9fdW5leHBvcnQoc3ZjX2V4cG9ydCAqdW5leHApOworc3RhdGljIGludAkJZXhwX3ZlcmlmeV9zdHJpbmcoY2hhciAqY3AsIGludCBtYXgpOworCisvKgorICogV2UgaGF2ZSB0d28gY2FjaGVzLgorICogT25lIG1hcHMgY2xpZW50K3Zmc21udCtkZW50cnkgdG8gZXhwb3J0IG9wdGlvbnMgLSB0aGUgZXhwb3J0IG1hcAorICogVGhlIG90aGVyIG1hcHMgY2xpZW50K2ZpbGVoYW5kbGUtZnJhZ21lbnQgdG8gZXhwb3J0IG9wdGlvbnMuIC0gdGhlIGV4cGtleSBtYXAKKyAqCisgKiBUaGUgZXhwb3J0IG9wdGlvbnMgYXJlIGFjdHVhbGx5IHN0b3JlZCBpbiB0aGUgZmlyc3QgbWFwLCBhbmQgdGhlCisgKiBzZWNvbmQgbWFwIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIHRoZSBlbnRyeSBpbiB0aGUgZmlyc3QgbWFwLgorICovCisKKyNkZWZpbmUJRVhQS0VZX0hBU0hCSVRTCQk4CisjZGVmaW5lCUVYUEtFWV9IQVNITUFYCQkoMSA8PCBFWFBLRVlfSEFTSEJJVFMpCisjZGVmaW5lCUVYUEtFWV9IQVNITUFTSwkJKEVYUEtFWV9IQVNITUFYIC0xKQorc3RhdGljIHN0cnVjdCBjYWNoZV9oZWFkICpleHBrZXlfdGFibGVbRVhQS0VZX0hBU0hNQVhdOworCitzdGF0aWMgaW5saW5lIGludCBzdmNfZXhwa2V5X2hhc2goc3RydWN0IHN2Y19leHBrZXkgKml0ZW0pCit7CisJaW50IGhhc2ggPSBpdGVtLT5la19mc2lkdHlwZTsKKwljaGFyICogY3AgPSAoY2hhciopaXRlbS0+ZWtfZnNpZDsKKwlpbnQgbGVuID0ga2V5X2xlbihpdGVtLT5la19mc2lkdHlwZSk7CisKKwloYXNoIF49IGhhc2hfbWVtKGNwLCBsZW4sIEVYUEtFWV9IQVNIQklUUyk7CisJaGFzaCBePSBoYXNoX3B0cihpdGVtLT5la19jbGllbnQsIEVYUEtFWV9IQVNIQklUUyk7CisJcmV0dXJuIGhhc2ggJiBFWFBLRVlfSEFTSE1BU0s7Cit9CisKK3ZvaWQgZXhwa2V5X3B1dChzdHJ1Y3QgY2FjaGVfaGVhZCAqaXRlbSwgc3RydWN0IGNhY2hlX2RldGFpbCAqY2QpCit7CisJaWYgKGNhY2hlX3B1dChpdGVtLCBjZCkpIHsKKwkJc3RydWN0IHN2Y19leHBrZXkgKmtleSA9IGNvbnRhaW5lcl9vZihpdGVtLCBzdHJ1Y3Qgc3ZjX2V4cGtleSwgaCk7CisJCWlmICh0ZXN0X2JpdChDQUNIRV9WQUxJRCwgJml0ZW0tPmZsYWdzKSAmJgorCQkgICAgIXRlc3RfYml0KENBQ0hFX05FR0FUSVZFLCAmaXRlbS0+ZmxhZ3MpKQorCQkJZXhwX3B1dChrZXktPmVrX2V4cG9ydCk7CisJCWF1dGhfZG9tYWluX3B1dChrZXktPmVrX2NsaWVudCk7CisJCWtmcmVlKGtleSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBleHBrZXlfcmVxdWVzdChzdHJ1Y3QgY2FjaGVfZGV0YWlsICpjZCwKKwkJCSAgIHN0cnVjdCBjYWNoZV9oZWFkICpoLAorCQkJICAgY2hhciAqKmJwcCwgaW50ICpibGVuKQoreworCS8qIGNsaWVudCBmc2lkdHlwZSBceGZzaWQgKi8KKwlzdHJ1Y3Qgc3ZjX2V4cGtleSAqZWsgPSBjb250YWluZXJfb2YoaCwgc3RydWN0IHN2Y19leHBrZXksIGgpOworCWNoYXIgdHlwZVs1XTsKKworCXF3b3JkX2FkZChicHAsIGJsZW4sIGVrLT5la19jbGllbnQtPm5hbWUpOworCXNucHJpbnRmKHR5cGUsIDUsICIlZCIsIGVrLT5la19mc2lkdHlwZSk7CisJcXdvcmRfYWRkKGJwcCwgYmxlbiwgdHlwZSk7CisJcXdvcmRfYWRkaGV4KGJwcCwgYmxlbiwgKGNoYXIqKWVrLT5la19mc2lkLCBrZXlfbGVuKGVrLT5la19mc2lkdHlwZSkpOworCSgqYnBwKVstMV0gPSAnXG4nOworfQorCitzdGF0aWMgc3RydWN0IHN2Y19leHBrZXkgKnN2Y19leHBrZXlfbG9va3VwKHN0cnVjdCBzdmNfZXhwa2V5ICosIGludCk7CitzdGF0aWMgaW50IGV4cGtleV9wYXJzZShzdHJ1Y3QgY2FjaGVfZGV0YWlsICpjZCwgY2hhciAqbWVzZywgaW50IG1sZW4pCit7CisJLyogY2xpZW50IGZzaWR0eXBlIGZzaWQgW3BhdGhdICovCisJY2hhciAqYnVmOworCWludCBsZW47CisJc3RydWN0IGF1dGhfZG9tYWluICpkb20gPSBOVUxMOworCWludCBlcnI7CisJaW50IGZzaWR0eXBlOworCWNoYXIgKmVwOworCXN0cnVjdCBzdmNfZXhwa2V5IGtleTsKKworCWlmIChtZXNnW21sZW4tMV0gIT0gJ1xuJykKKwkJcmV0dXJuIC1FSU5WQUw7CisJbWVzZ1ttbGVuLTFdID0gMDsKKworCWJ1ZiA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwllcnIgPSAtRU5PTUVNOworCWlmICghYnVmKSBnb3RvIG91dDsKKworCWVyciA9IC1FSU5WQUw7CisJaWYgKChsZW49cXdvcmRfZ2V0KCZtZXNnLCBidWYsIFBBR0VfU0laRSkpIDw9IDApCisJCWdvdG8gb3V0OworCisJZXJyID0gLUVOT0VOVDsKKwlkb20gPSBhdXRoX2RvbWFpbl9maW5kKGJ1Zik7CisJaWYgKCFkb20pCisJCWdvdG8gb3V0OworCWRwcmludGsoImZvdW5kIGRvbWFpbiAlc1xuIiwgYnVmKTsKKworCWVyciA9IC1FSU5WQUw7CisJaWYgKChsZW49cXdvcmRfZ2V0KCZtZXNnLCBidWYsIFBBR0VfU0laRSkpIDw9IDApCisJCWdvdG8gb3V0OworCWZzaWR0eXBlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCAmZXAsIDEwKTsKKwlpZiAoKmVwKQorCQlnb3RvIG91dDsKKwlkcHJpbnRrKCJmb3VuZCBmc2lkdHlwZSAlZFxuIiwgZnNpZHR5cGUpOworCWlmIChmc2lkdHlwZSA+IDIpCisJCWdvdG8gb3V0OworCWlmICgobGVuPXF3b3JkX2dldCgmbWVzZywgYnVmLCBQQUdFX1NJWkUpKSA8PSAwKQorCQlnb3RvIG91dDsKKwlkcHJpbnRrKCJmb3VuZCBmc2lkIGxlbmd0aCAlZFxuIiwgbGVuKTsKKwlpZiAobGVuICE9IGtleV9sZW4oZnNpZHR5cGUpKQorCQlnb3RvIG91dDsKKworCS8qIE9LLCB3ZSBzZWVtIHRvIGhhdmUgYSB2YWxpZCBrZXkgKi8KKwlrZXkuaC5mbGFncyA9IDA7CisJa2V5LmguZXhwaXJ5X3RpbWUgPSBnZXRfZXhwaXJ5KCZtZXNnKTsKKwlpZiAoa2V5LmguZXhwaXJ5X3RpbWUgPT0gMCkKKwkJZ290byBvdXQ7CisKKwlrZXkuZWtfY2xpZW50ID0gZG9tOwkKKwlrZXkuZWtfZnNpZHR5cGUgPSBmc2lkdHlwZTsKKwltZW1jcHkoa2V5LmVrX2ZzaWQsIGJ1ZiwgbGVuKTsKKworCS8qIG5vdyB3ZSB3YW50IGEgcGF0aG5hbWUsIG9yIGVtcHR5IG1lYW5pbmcgTkVHQVRJVkUgICovCisJaWYgKChsZW49cXdvcmRfZ2V0KCZtZXNnLCBidWYsIFBBR0VfU0laRSkpIDwgMCkKKwkJZ290byBvdXQ7CisJZHByaW50aygiUGF0aCBzZWVtcyB0byBiZSA8JXM+XG4iLCBidWYpOworCWVyciA9IDA7CisJaWYgKGxlbiA9PSAwKSB7CisJCXN0cnVjdCBzdmNfZXhwa2V5ICplazsKKwkJc2V0X2JpdChDQUNIRV9ORUdBVElWRSwgJmtleS5oLmZsYWdzKTsKKwkJZWsgPSBzdmNfZXhwa2V5X2xvb2t1cCgma2V5LCAxKTsKKwkJaWYgKGVrKQorCQkJZXhwa2V5X3B1dCgmZWstPmgsICZzdmNfZXhwa2V5X2NhY2hlKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCQlzdHJ1Y3Qgc3ZjX2V4cGtleSAqZWs7CisJCXN0cnVjdCBzdmNfZXhwb3J0ICpleHA7CisJCWVyciA9IHBhdGhfbG9va3VwKGJ1ZiwgMCwgJm5kKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCisJCWRwcmludGsoIkZvdW5kIHRoZSBwYXRoICVzXG4iLCBidWYpOworCQlleHAgPSBleHBfZ2V0X2J5X25hbWUoZG9tLCBuZC5tbnQsIG5kLmRlbnRyeSwgTlVMTCk7CisKKwkJZXJyID0gLUVOT0VOVDsKKwkJaWYgKCFleHApCisJCQlnb3RvIG91dF9uZDsKKwkJa2V5LmVrX2V4cG9ydCA9IGV4cDsKKwkJZHByaW50aygiQW5kIGZvdW5kIGV4cG9ydFxuIik7CisJCQorCQllayA9IHN2Y19leHBrZXlfbG9va3VwKCZrZXksIDEpOworCQlpZiAoZWspCisJCQlleHBrZXlfcHV0KCZlay0+aCwgJnN2Y19leHBrZXlfY2FjaGUpOworCQlleHBfcHV0KGV4cCk7CisJCWVyciA9IDA7CisJb3V0X25kOgorCQlwYXRoX3JlbGVhc2UoJm5kKTsKKwl9CisJY2FjaGVfZmx1c2goKTsKKyBvdXQ6CisJaWYgKGRvbSkKKwkJYXV0aF9kb21haW5fcHV0KGRvbSk7CisJaWYgKGJ1ZikKKwkJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGV4cGtleV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwKKwkJICAgICAgIHN0cnVjdCBjYWNoZV9kZXRhaWwgKmNkLAorCQkgICAgICAgc3RydWN0IGNhY2hlX2hlYWQgKmgpCit7CisJc3RydWN0IHN2Y19leHBrZXkgKmVrIDsKKworCWlmIChoID09TlVMTCkgeworCQlzZXFfcHV0cyhtLCAiI2RvbWFpbiBmc2lkdHlwZSBmc2lkIFtwYXRoXVxuIik7CisJCXJldHVybiAwOworCX0KKwllayA9IGNvbnRhaW5lcl9vZihoLCBzdHJ1Y3Qgc3ZjX2V4cGtleSwgaCk7CisJc2VxX3ByaW50ZihtLCAiJXMgJWQgMHglMDh4IiwgZWstPmVrX2NsaWVudC0+bmFtZSwKKwkJICAgZWstPmVrX2ZzaWR0eXBlLCBlay0+ZWtfZnNpZFswXSk7CisJaWYgKGVrLT5la19mc2lkdHlwZSAhPSAxKQorCQlzZXFfcHJpbnRmKG0sICIlMDh4IiwgZWstPmVrX2ZzaWRbMV0pOworCWlmIChlay0+ZWtfZnNpZHR5cGUgPT0gMikKKwkJc2VxX3ByaW50ZihtLCAiJTA4eCIsIGVrLT5la19mc2lkWzJdKTsKKwlpZiAodGVzdF9iaXQoQ0FDSEVfVkFMSUQsICZoLT5mbGFncykgJiYgCisJICAgICF0ZXN0X2JpdChDQUNIRV9ORUdBVElWRSwgJmgtPmZsYWdzKSkgeworCQlzZXFfcHJpbnRmKG0sICIgIik7CisJCXNlcV9wYXRoKG0sIGVrLT5la19leHBvcnQtPmV4X21udCwgZWstPmVrX2V4cG9ydC0+ZXhfZGVudHJ5LCAiXFwgXHRcbiIpOworCX0KKwlzZXFfcHJpbnRmKG0sICJcbiIpOworCXJldHVybiAwOworfQorCQorc3RydWN0IGNhY2hlX2RldGFpbCBzdmNfZXhwa2V5X2NhY2hlID0geworCS5oYXNoX3NpemUJPSBFWFBLRVlfSEFTSE1BWCwKKwkuaGFzaF90YWJsZQk9IGV4cGtleV90YWJsZSwKKwkubmFtZQkJPSAibmZzZC5maCIsCisJLmNhY2hlX3B1dAk9IGV4cGtleV9wdXQsCisJLmNhY2hlX3JlcXVlc3QJPSBleHBrZXlfcmVxdWVzdCwKKwkuY2FjaGVfcGFyc2UJPSBleHBrZXlfcGFyc2UsCisJLmNhY2hlX3Nob3cJPSBleHBrZXlfc2hvdywKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IHN2Y19leHBrZXlfbWF0Y2ggKHN0cnVjdCBzdmNfZXhwa2V5ICphLCBzdHJ1Y3Qgc3ZjX2V4cGtleSAqYikKK3sKKwlpZiAoYS0+ZWtfZnNpZHR5cGUgIT0gYi0+ZWtfZnNpZHR5cGUgfHwKKwkgICAgYS0+ZWtfY2xpZW50ICE9IGItPmVrX2NsaWVudCB8fAorCSAgICBtZW1jbXAoYS0+ZWtfZnNpZCwgYi0+ZWtfZnNpZCwga2V5X2xlbihhLT5la19mc2lkdHlwZSkpICE9IDApCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3ZjX2V4cGtleV9pbml0KHN0cnVjdCBzdmNfZXhwa2V5ICpuZXcsIHN0cnVjdCBzdmNfZXhwa2V5ICppdGVtKQoreworCWNhY2hlX2dldCgmaXRlbS0+ZWtfY2xpZW50LT5oKTsKKwluZXctPmVrX2NsaWVudCA9IGl0ZW0tPmVrX2NsaWVudDsKKwluZXctPmVrX2ZzaWR0eXBlID0gaXRlbS0+ZWtfZnNpZHR5cGU7CisJbmV3LT5la19mc2lkWzBdID0gaXRlbS0+ZWtfZnNpZFswXTsKKwluZXctPmVrX2ZzaWRbMV0gPSBpdGVtLT5la19mc2lkWzFdOworCW5ldy0+ZWtfZnNpZFsyXSA9IGl0ZW0tPmVrX2ZzaWRbMl07Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdmNfZXhwa2V5X3VwZGF0ZShzdHJ1Y3Qgc3ZjX2V4cGtleSAqbmV3LCBzdHJ1Y3Qgc3ZjX2V4cGtleSAqaXRlbSkKK3sKKwljYWNoZV9nZXQoJml0ZW0tPmVrX2V4cG9ydC0+aCk7CisJbmV3LT5la19leHBvcnQgPSBpdGVtLT5la19leHBvcnQ7Cit9CisKK3N0YXRpYyBEZWZpbmVTaW1wbGVDYWNoZUxvb2t1cChzdmNfZXhwa2V5LDApIC8qIG5vIGlucGxhY2UgdXBkYXRlcyAqLworCisjZGVmaW5lCUVYUE9SVF9IQVNIQklUUwkJOAorI2RlZmluZQlFWFBPUlRfSEFTSE1BWAkJKDE8PCBFWFBPUlRfSEFTSEJJVFMpCisjZGVmaW5lCUVYUE9SVF9IQVNITUFTSwkJKEVYUE9SVF9IQVNITUFYIC0xKQorCitzdGF0aWMgc3RydWN0IGNhY2hlX2hlYWQgKmV4cG9ydF90YWJsZVtFWFBPUlRfSEFTSE1BWF07CisKK3N0YXRpYyBpbmxpbmUgaW50IHN2Y19leHBvcnRfaGFzaChzdHJ1Y3Qgc3ZjX2V4cG9ydCAqaXRlbSkKK3sKKwlpbnQgcnY7CisKKwlydiA9IGhhc2hfcHRyKGl0ZW0tPmV4X2NsaWVudCwgRVhQT1JUX0hBU0hCSVRTKTsKKwlydiBePSBoYXNoX3B0cihpdGVtLT5leF9kZW50cnksIEVYUE9SVF9IQVNIQklUUyk7CisJcnYgXj0gaGFzaF9wdHIoaXRlbS0+ZXhfbW50LCBFWFBPUlRfSEFTSEJJVFMpOworCXJldHVybiBydjsKK30KKwordm9pZCBzdmNfZXhwb3J0X3B1dChzdHJ1Y3QgY2FjaGVfaGVhZCAqaXRlbSwgc3RydWN0IGNhY2hlX2RldGFpbCAqY2QpCit7CisJaWYgKGNhY2hlX3B1dChpdGVtLCBjZCkpIHsKKwkJc3RydWN0IHN2Y19leHBvcnQgKmV4cCA9IGNvbnRhaW5lcl9vZihpdGVtLCBzdHJ1Y3Qgc3ZjX2V4cG9ydCwgaCk7CisJCWRwdXQoZXhwLT5leF9kZW50cnkpOworCQltbnRwdXQoZXhwLT5leF9tbnQpOworCQlhdXRoX2RvbWFpbl9wdXQoZXhwLT5leF9jbGllbnQpOworCQlrZnJlZShleHApOworCX0KK30KKworc3RhdGljIHZvaWQgc3ZjX2V4cG9ydF9yZXF1ZXN0KHN0cnVjdCBjYWNoZV9kZXRhaWwgKmNkLAorCQkJICAgICAgIHN0cnVjdCBjYWNoZV9oZWFkICpoLAorCQkJICAgICAgIGNoYXIgKipicHAsIGludCAqYmxlbikKK3sKKwkvKiAgY2xpZW50IHBhdGggKi8KKwlzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwID0gY29udGFpbmVyX29mKGgsIHN0cnVjdCBzdmNfZXhwb3J0LCBoKTsKKwljaGFyICpwdGg7CisKKwlxd29yZF9hZGQoYnBwLCBibGVuLCBleHAtPmV4X2NsaWVudC0+bmFtZSk7CisJcHRoID0gZF9wYXRoKGV4cC0+ZXhfZGVudHJ5LCBleHAtPmV4X21udCwgKmJwcCwgKmJsZW4pOworCWlmIChJU19FUlIocHRoKSkgeworCQkvKiBpcyB0aGlzIGNvcnJlY3Q/ICovCisJCSgqYnBwKVswXSA9ICdcbic7CisJCXJldHVybjsKKwl9CisJcXdvcmRfYWRkKGJwcCwgYmxlbiwgcHRoKTsKKwkoKmJwcClbLTFdID0gJ1xuJzsKK30KKworc3RhdGljIHN0cnVjdCBzdmNfZXhwb3J0ICpzdmNfZXhwb3J0X2xvb2t1cChzdHJ1Y3Qgc3ZjX2V4cG9ydCAqLCBpbnQpOworCitzdGF0aWMgaW50IGNoZWNrX2V4cG9ydChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZmxhZ3MpCit7CisKKwkvKiBXZSBjdXJyZW50bHkgZXhwb3J0IG9ubHkgZGlycyBhbmQgcmVndWxhciBmaWxlcy4KKwkgKiBUaGlzIGlzIHdoYXQgdW1vdW50ZCBkb2VzLgorCSAqLworCWlmICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSAmJgorCSAgICAhU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKKwkJcmV0dXJuIC1FTk9URElSOworCisJLyogVGhlcmUgYXJlIHR3byByZXF1aXJlbWVudHMgb24gYSBmaWxlc3lzdGVtIHRvIGJlIGV4cG9ydGFibGUuCisJICogMTogIFdlIG11c3QgYmUgYWJsZSB0byBpZGVudGlmeSB0aGUgZmlsZXN5c3RlbSBmcm9tIGEgbnVtYmVyLgorCSAqICAgICAgIGVpdGhlciBhIGRldmljZSBudW1iZXIgKHNvIEZTX1JFUVVJUkVTX0RFViBuZWVkZWQpCisJICogICAgICAgb3IgYW4gRlNJRCBudW1iZXIgKHNvIE5GU0VYUF9GU0lEIG5lZWRlZCkuCisJICogMjogIFdlIG11c3QgYmUgYWJsZSB0byBmaW5kIGFuIGlub2RlIGZyb20gYSBmaWxlaGFuZGxlLgorCSAqICAgICAgIFRoaXMgbWVhbnMgdGhhdCBzX2V4cG9ydF9vcCBtdXN0IGJlIHNldC4KKwkgKi8KKwlpZiAoIShpbm9kZS0+aV9zYi0+c190eXBlLT5mc19mbGFncyAmIEZTX1JFUVVJUkVTX0RFVikgJiYKKwkgICAgIShmbGFncyAmIE5GU0VYUF9GU0lEKSkgeworCQlkcHJpbnRrKCJleHBfZXhwb3J0OiBleHBvcnQgb2Ygbm9uLWRldiBmcyB3aXRob3V0IGZzaWQiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICghaW5vZGUtPmlfc2ItPnNfZXhwb3J0X29wKSB7CisJCWRwcmludGsoImV4cF9leHBvcnQ6IGV4cG9ydCBvZiBpbnZhbGlkIGZzIHR5cGUuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogT2ssIHdlIGNhbiBleHBvcnQgaXQgKi87CisJaWYgKCFpbm9kZS0+aV9zYi0+c19leHBvcnRfb3AtPmZpbmRfZXhwb3J0ZWRfZGVudHJ5KQorCQlpbm9kZS0+aV9zYi0+c19leHBvcnRfb3AtPmZpbmRfZXhwb3J0ZWRfZGVudHJ5ID0KKwkJCWZpbmRfZXhwb3J0ZWRfZGVudHJ5OworCXJldHVybiAwOworCit9CisKK3N0YXRpYyBpbnQgc3ZjX2V4cG9ydF9wYXJzZShzdHJ1Y3QgY2FjaGVfZGV0YWlsICpjZCwgY2hhciAqbWVzZywgaW50IG1sZW4pCit7CisJLyogY2xpZW50IHBhdGggZXhwaXJ5IFtmbGFncyBhbm9udWlkIGFub25naWQgZnNpZF0gKi8KKwljaGFyICpidWY7CisJaW50IGxlbjsKKwlpbnQgZXJyOworCXN0cnVjdCBhdXRoX2RvbWFpbiAqZG9tID0gTlVMTDsKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCXN0cnVjdCBzdmNfZXhwb3J0IGV4cCwgKmV4cHA7CisJaW50IGFuX2ludDsKKworCW5kLmRlbnRyeSA9IE5VTEw7CisKKwlpZiAobWVzZ1ttbGVuLTFdICE9ICdcbicpCisJCXJldHVybiAtRUlOVkFMOworCW1lc2dbbWxlbi0xXSA9IDA7CisKKwlidWYgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CisJZXJyID0gLUVOT01FTTsKKwlpZiAoIWJ1ZikgZ290byBvdXQ7CisKKwkvKiBjbGllbnQgKi8KKwlsZW4gPSBxd29yZF9nZXQoJm1lc2csIGJ1ZiwgUEFHRV9TSVpFKTsKKwllcnIgPSAtRUlOVkFMOworCWlmIChsZW4gPD0gMCkgZ290byBvdXQ7CisKKwllcnIgPSAtRU5PRU5UOworCWRvbSA9IGF1dGhfZG9tYWluX2ZpbmQoYnVmKTsKKwlpZiAoIWRvbSkKKwkJZ290byBvdXQ7CisKKwkvKiBwYXRoICovCisJZXJyID0gLUVJTlZBTDsKKwlpZiAoKGxlbj1xd29yZF9nZXQoJm1lc2csIGJ1ZiwgUEFHRV9TSVpFKSkgPD0gMCkKKwkJZ290byBvdXQ7CisJZXJyID0gcGF0aF9sb29rdXAoYnVmLCAwLCAmbmQpOworCWlmIChlcnIpIGdvdG8gb3V0OworCisJZXhwLmguZmxhZ3MgPSAwOworCWV4cC5leF9jbGllbnQgPSBkb207CisJZXhwLmV4X21udCA9IG5kLm1udDsKKwlleHAuZXhfZGVudHJ5ID0gbmQuZGVudHJ5OworCisJLyogZXhwaXJ5ICovCisJZXJyID0gLUVJTlZBTDsKKwlleHAuaC5leHBpcnlfdGltZSA9IGdldF9leHBpcnkoJm1lc2cpOworCWlmIChleHAuaC5leHBpcnlfdGltZSA9PSAwKQorCQlnb3RvIG91dDsKKworCS8qIGZsYWdzICovCisJZXJyID0gZ2V0X2ludCgmbWVzZywgJmFuX2ludCk7CisJaWYgKGVyciA9PSAtRU5PRU5UKQorCQlzZXRfYml0KENBQ0hFX05FR0FUSVZFLCAmZXhwLmguZmxhZ3MpOworCWVsc2UgeworCQlpZiAoZXJyIHx8IGFuX2ludCA8IDApIGdvdG8gb3V0OwkKKwkJZXhwLmV4X2ZsYWdzPSBhbl9pbnQ7CisJCisJCS8qIGFub24gdWlkICovCisJCWVyciA9IGdldF9pbnQoJm1lc2csICZhbl9pbnQpOworCQlpZiAoZXJyKSBnb3RvIG91dDsKKwkJZXhwLmV4X2Fub25fdWlkPSBhbl9pbnQ7CisKKwkJLyogYW5vbiBnaWQgKi8KKwkJZXJyID0gZ2V0X2ludCgmbWVzZywgJmFuX2ludCk7CisJCWlmIChlcnIpIGdvdG8gb3V0OworCQlleHAuZXhfYW5vbl9naWQ9IGFuX2ludDsKKworCQkvKiBmc2lkICovCisJCWVyciA9IGdldF9pbnQoJm1lc2csICZhbl9pbnQpOworCQlpZiAoZXJyKSBnb3RvIG91dDsKKwkJZXhwLmV4X2ZzaWQgPSBhbl9pbnQ7CisKKwkJZXJyID0gY2hlY2tfZXhwb3J0KG5kLmRlbnRyeS0+ZF9pbm9kZSwgZXhwLmV4X2ZsYWdzKTsKKwkJaWYgKGVycikgZ290byBvdXQ7CisJfQorCisJZXhwcCA9IHN2Y19leHBvcnRfbG9va3VwKCZleHAsIDEpOworCWlmIChleHBwKQorCQlleHBfcHV0KGV4cHApOworCWVyciA9IDA7CisJY2FjaGVfZmx1c2goKTsKKyBvdXQ6CisJaWYgKG5kLmRlbnRyeSkKKwkJcGF0aF9yZWxlYXNlKCZuZCk7CisJaWYgKGRvbSkKKwkJYXV0aF9kb21haW5fcHV0KGRvbSk7CisJaWYgKGJ1ZikKKwkJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBleHBfZmxhZ3Moc3RydWN0IHNlcV9maWxlICptLCBpbnQgZmxhZywgaW50IGZzaWQsIHVpZF90IGFub251LCB1aWRfdCBhbm9uZyk7CisKK3N0YXRpYyBpbnQgc3ZjX2V4cG9ydF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwKKwkJCSAgIHN0cnVjdCBjYWNoZV9kZXRhaWwgKmNkLAorCQkJICAgc3RydWN0IGNhY2hlX2hlYWQgKmgpCit7CisJc3RydWN0IHN2Y19leHBvcnQgKmV4cCA7CisKKwlpZiAoaCA9PU5VTEwpIHsKKwkJc2VxX3B1dHMobSwgIiNwYXRoIGRvbWFpbihmbGFncylcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJZXhwID0gY29udGFpbmVyX29mKGgsIHN0cnVjdCBzdmNfZXhwb3J0LCBoKTsKKwlzZXFfcGF0aChtLCBleHAtPmV4X21udCwgZXhwLT5leF9kZW50cnksICIgXHRcblxcIik7CisJc2VxX3B1dGMobSwgJ1x0Jyk7CisJc2VxX2VzY2FwZShtLCBleHAtPmV4X2NsaWVudC0+bmFtZSwgIiBcdFxuXFwiKTsKKwlzZXFfcHV0YyhtLCAnKCcpOworCWlmICh0ZXN0X2JpdChDQUNIRV9WQUxJRCwgJmgtPmZsYWdzKSAmJiAKKwkgICAgIXRlc3RfYml0KENBQ0hFX05FR0FUSVZFLCAmaC0+ZmxhZ3MpKQorCQlleHBfZmxhZ3MobSwgZXhwLT5leF9mbGFncywgZXhwLT5leF9mc2lkLCAKKwkJCSAgZXhwLT5leF9hbm9uX3VpZCwgZXhwLT5leF9hbm9uX2dpZCk7CisJc2VxX3B1dHMobSwgIilcbiIpOworCXJldHVybiAwOworfQorc3RydWN0IGNhY2hlX2RldGFpbCBzdmNfZXhwb3J0X2NhY2hlID0geworCS5oYXNoX3NpemUJPSBFWFBPUlRfSEFTSE1BWCwKKwkuaGFzaF90YWJsZQk9IGV4cG9ydF90YWJsZSwKKwkubmFtZQkJPSAibmZzZC5leHBvcnQiLAorCS5jYWNoZV9wdXQJPSBzdmNfZXhwb3J0X3B1dCwKKwkuY2FjaGVfcmVxdWVzdAk9IHN2Y19leHBvcnRfcmVxdWVzdCwKKwkuY2FjaGVfcGFyc2UJPSBzdmNfZXhwb3J0X3BhcnNlLAorCS5jYWNoZV9zaG93CT0gc3ZjX2V4cG9ydF9zaG93LAorfTsKKworc3RhdGljIGlubGluZSBpbnQgc3ZjX2V4cG9ydF9tYXRjaChzdHJ1Y3Qgc3ZjX2V4cG9ydCAqYSwgc3RydWN0IHN2Y19leHBvcnQgKmIpCit7CisJcmV0dXJuIGEtPmV4X2NsaWVudCA9PSBiLT5leF9jbGllbnQgJiYKKwkJYS0+ZXhfZGVudHJ5ID09IGItPmV4X2RlbnRyeSAmJgorCQlhLT5leF9tbnQgPT0gYi0+ZXhfbW50OworfQorc3RhdGljIGlubGluZSB2b2lkIHN2Y19leHBvcnRfaW5pdChzdHJ1Y3Qgc3ZjX2V4cG9ydCAqbmV3LCBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqaXRlbSkKK3sKKwljYWNoZV9nZXQoJml0ZW0tPmV4X2NsaWVudC0+aCk7CisJbmV3LT5leF9jbGllbnQgPSBpdGVtLT5leF9jbGllbnQ7CisJbmV3LT5leF9kZW50cnkgPSBkZ2V0KGl0ZW0tPmV4X2RlbnRyeSk7CisJbmV3LT5leF9tbnQgPSBtbnRnZXQoaXRlbS0+ZXhfbW50KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN2Y19leHBvcnRfdXBkYXRlKHN0cnVjdCBzdmNfZXhwb3J0ICpuZXcsIHN0cnVjdCBzdmNfZXhwb3J0ICppdGVtKQoreworCW5ldy0+ZXhfZmxhZ3MgPSBpdGVtLT5leF9mbGFnczsKKwluZXctPmV4X2Fub25fdWlkID0gaXRlbS0+ZXhfYW5vbl91aWQ7CisJbmV3LT5leF9hbm9uX2dpZCA9IGl0ZW0tPmV4X2Fub25fZ2lkOworCW5ldy0+ZXhfZnNpZCA9IGl0ZW0tPmV4X2ZzaWQ7Cit9CisKK3N0YXRpYyBEZWZpbmVTaW1wbGVDYWNoZUxvb2t1cChzdmNfZXhwb3J0LDEpIC8qIGFsbG93IGlucGxhY2UgdXBkYXRlcyAqLworCisKK3N0cnVjdCBzdmNfZXhwa2V5ICoKK2V4cF9maW5kX2tleShzdmNfY2xpZW50ICpjbHAsIGludCBmc2lkX3R5cGUsIHUzMiAqZnNpZHYsIHN0cnVjdCBjYWNoZV9yZXEgKnJlcXApCit7CisJc3RydWN0IHN2Y19leHBrZXkga2V5LCAqZWs7CisJaW50IGVycjsKKwkKKwlpZiAoIWNscCkKKwkJcmV0dXJuIE5VTEw7CisKKwlrZXkuZWtfY2xpZW50ID0gY2xwOworCWtleS5la19mc2lkdHlwZSA9IGZzaWRfdHlwZTsKKwltZW1jcHkoa2V5LmVrX2ZzaWQsIGZzaWR2LCBrZXlfbGVuKGZzaWRfdHlwZSkpOworCisJZWsgPSBzdmNfZXhwa2V5X2xvb2t1cCgma2V5LCAwKTsKKwlpZiAoZWsgIT0gTlVMTCkKKwkJaWYgKChlcnIgPSBjYWNoZV9jaGVjaygmc3ZjX2V4cGtleV9jYWNoZSwgJmVrLT5oLCByZXFwKSkpCisJCQllayA9IEVSUl9QVFIoZXJyKTsKKwlyZXR1cm4gZWs7Cit9CisKK3N0YXRpYyBpbnQgZXhwX3NldF9rZXkoc3ZjX2NsaWVudCAqY2xwLCBpbnQgZnNpZF90eXBlLCB1MzIgKmZzaWR2LAorCQkgICAgICAgc3RydWN0IHN2Y19leHBvcnQgKmV4cCkKK3sKKwlzdHJ1Y3Qgc3ZjX2V4cGtleSBrZXksICplazsKKworCWtleS5la19jbGllbnQgPSBjbHA7CisJa2V5LmVrX2ZzaWR0eXBlID0gZnNpZF90eXBlOworCW1lbWNweShrZXkuZWtfZnNpZCwgZnNpZHYsIGtleV9sZW4oZnNpZF90eXBlKSk7CisJa2V5LmVrX2V4cG9ydCA9IGV4cDsKKwlrZXkuaC5leHBpcnlfdGltZSA9IE5FVkVSOworCWtleS5oLmZsYWdzID0gMDsKKworCWVrID0gc3ZjX2V4cGtleV9sb29rdXAoJmtleSwgMSk7CisJaWYgKGVrKSB7CisJCWV4cGtleV9wdXQoJmVrLT5oLCAmc3ZjX2V4cGtleV9jYWNoZSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyoKKyAqIEZpbmQgdGhlIGNsaWVudCdzIGV4cG9ydCBlbnRyeSBtYXRjaGluZyB4ZGV2L3hpbm8uCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHN2Y19leHBrZXkgKgorZXhwX2dldF9rZXkoc3ZjX2NsaWVudCAqY2xwLCBkZXZfdCBkZXYsIGlub190IGlubykKK3sKKwl1MzIgZnNpZHZbM107CisJCisJaWYgKG9sZF92YWxpZF9kZXYoZGV2KSkgeworCQlta19mc2lkX3YwKGZzaWR2LCBkZXYsIGlubyk7CisJCXJldHVybiBleHBfZmluZF9rZXkoY2xwLCAwLCBmc2lkdiwgTlVMTCk7CisJfQorCW1rX2ZzaWRfdjMoZnNpZHYsIGRldiwgaW5vKTsKKwlyZXR1cm4gZXhwX2ZpbmRfa2V5KGNscCwgMywgZnNpZHYsIE5VTEwpOworfQorCisvKgorICogRmluZCB0aGUgY2xpZW50J3MgZXhwb3J0IGVudHJ5IG1hdGNoaW5nIGZzaWQKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3ZjX2V4cGtleSAqCitleHBfZ2V0X2ZzaWRfa2V5KHN2Y19jbGllbnQgKmNscCwgaW50IGZzaWQpCit7CisJdTMyIGZzaWR2WzJdOworCisJbWtfZnNpZF92MShmc2lkdiwgZnNpZCk7CisKKwlyZXR1cm4gZXhwX2ZpbmRfa2V5KGNscCwgMSwgZnNpZHYsIE5VTEwpOworfQorCitzdmNfZXhwb3J0ICoKK2V4cF9nZXRfYnlfbmFtZShzdmNfY2xpZW50ICpjbHAsIHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCXN0cnVjdCBjYWNoZV9yZXEgKnJlcXApCit7CisJc3RydWN0IHN2Y19leHBvcnQgKmV4cCwga2V5OworCQorCWlmICghY2xwKQorCQlyZXR1cm4gTlVMTDsKKworCWtleS5leF9jbGllbnQgPSBjbHA7CisJa2V5LmV4X21udCA9IG1udDsKKwlrZXkuZXhfZGVudHJ5ID0gZGVudHJ5OworCisJZXhwID0gc3ZjX2V4cG9ydF9sb29rdXAoJmtleSwgMCk7CisJaWYgKGV4cCAhPSBOVUxMKSAKKwkJc3dpdGNoIChjYWNoZV9jaGVjaygmc3ZjX2V4cG9ydF9jYWNoZSwgJmV4cC0+aCwgcmVxcCkpIHsKKwkJY2FzZSAwOiBicmVhazsKKwkJY2FzZSAtRUFHQUlOOgorCQkJZXhwID0gRVJSX1BUUigtRUFHQUlOKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZXhwID0gTlVMTDsKKwkJfQorCisJcmV0dXJuIGV4cDsKK30KKworLyoKKyAqIEZpbmQgdGhlIGV4cG9ydCBlbnRyeSBmb3IgYSBnaXZlbiBkZW50cnkuCisgKi8KK3N0cnVjdCBzdmNfZXhwb3J0ICoKK2V4cF9wYXJlbnQoc3ZjX2NsaWVudCAqY2xwLCBzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCSAgIHN0cnVjdCBjYWNoZV9yZXEgKnJlcXApCit7CisJc3ZjX2V4cG9ydCAqZXhwOworCisJZGdldChkZW50cnkpOworCWV4cCA9IGV4cF9nZXRfYnlfbmFtZShjbHAsIG1udCwgZGVudHJ5LCByZXFwKTsKKworCXdoaWxlIChleHAgPT0gTlVMTCAmJiAhSVNfUk9PVChkZW50cnkpKSB7CisJCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKKworCQlwYXJlbnQgPSBkZ2V0X3BhcmVudChkZW50cnkpOworCQlkcHV0KGRlbnRyeSk7CisJCWRlbnRyeSA9IHBhcmVudDsKKwkJZXhwID0gZXhwX2dldF9ieV9uYW1lKGNscCwgbW50LCBkZW50cnksIHJlcXApOworCX0KKwlkcHV0KGRlbnRyeSk7CisJcmV0dXJuIGV4cDsKK30KKworLyoKKyAqIEhhc2h0YWJsZSBsb2NraW5nLiBXcml0ZSBsb2NrcyBhcmUgcGxhY2VkIG9ubHkgYnkgdXNlciBwcm9jZXNzZXMKKyAqIHdhbnRpbmcgdG8gbW9kaWZ5IGV4cG9ydCBpbmZvcm1hdGlvbi4KKyAqIFdyaXRlIGxvY2tpbmcgb25seSBkb25lIGluIHRoaXMgZmlsZS4gIFJlYWQgbG9ja2luZworICogbmVlZGVkIGV4dGVybmFsbHkuCisgKi8KKworc3RhdGljIERFQ0xBUkVfUldTRU0oaGFzaF9zZW0pOworCit2b2lkCitleHBfcmVhZGxvY2sodm9pZCkKK3sKKwlkb3duX3JlYWQoJmhhc2hfc2VtKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitleHBfd3JpdGVsb2NrKHZvaWQpCit7CisJZG93bl93cml0ZSgmaGFzaF9zZW0pOworfQorCit2b2lkCitleHBfcmVhZHVubG9jayh2b2lkKQoreworCXVwX3JlYWQoJmhhc2hfc2VtKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitleHBfd3JpdGV1bmxvY2sodm9pZCkKK3sKKwl1cF93cml0ZSgmaGFzaF9zZW0pOworfQorCitzdGF0aWMgdm9pZCBleHBfZnNpZF91bmhhc2goc3RydWN0IHN2Y19leHBvcnQgKmV4cCkKK3sKKwlzdHJ1Y3Qgc3ZjX2V4cGtleSAqZWs7CisKKwlpZiAoKGV4cC0+ZXhfZmxhZ3MgJiBORlNFWFBfRlNJRCkgPT0gMCkKKwkJcmV0dXJuOworCisJZWsgPSBleHBfZ2V0X2ZzaWRfa2V5KGV4cC0+ZXhfY2xpZW50LCBleHAtPmV4X2ZzaWQpOworCWlmIChlayAmJiAhSVNfRVJSKGVrKSkgeworCQllay0+aC5leHBpcnlfdGltZSA9IGdldF9zZWNvbmRzKCktMTsKKwkJZXhwa2V5X3B1dCgmZWstPmgsICZzdmNfZXhwa2V5X2NhY2hlKTsKKwl9CisJc3ZjX2V4cGtleV9jYWNoZS5uZXh0Y2hlY2sgPSBnZXRfc2Vjb25kcygpOworfQorCitzdGF0aWMgaW50IGV4cF9mc2lkX2hhc2goc3ZjX2NsaWVudCAqY2xwLCBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwKQoreworCXUzMiBmc2lkWzJdOworIAorCWlmICgoZXhwLT5leF9mbGFncyAmIE5GU0VYUF9GU0lEKSA9PSAwKQorCQlyZXR1cm4gMDsKKworCW1rX2ZzaWRfdjEoZnNpZCwgZXhwLT5leF9mc2lkKTsKKwlyZXR1cm4gZXhwX3NldF9rZXkoY2xwLCAxLCBmc2lkLCBleHApOworfQorCitzdGF0aWMgaW50IGV4cF9oYXNoKHN0cnVjdCBhdXRoX2RvbWFpbiAqY2xwLCBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwKQoreworCXUzMiBmc2lkWzJdOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBleHAtPmV4X2RlbnRyeS0+ZF9pbm9kZTsKKwlkZXZfdCBkZXYgPSBpbm9kZS0+aV9zYi0+c19kZXY7CisKKwlpZiAob2xkX3ZhbGlkX2RldihkZXYpKSB7CisJCW1rX2ZzaWRfdjAoZnNpZCwgZGV2LCBpbm9kZS0+aV9pbm8pOworCQlyZXR1cm4gZXhwX3NldF9rZXkoY2xwLCAwLCBmc2lkLCBleHApOworCX0KKwlta19mc2lkX3YzKGZzaWQsIGRldiwgaW5vZGUtPmlfaW5vKTsKKwlyZXR1cm4gZXhwX3NldF9rZXkoY2xwLCAzLCBmc2lkLCBleHApOworfQorCitzdGF0aWMgdm9pZCBleHBfdW5oYXNoKHN0cnVjdCBzdmNfZXhwb3J0ICpleHApCit7CisJc3RydWN0IHN2Y19leHBrZXkgKmVrOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBleHAtPmV4X2RlbnRyeS0+ZF9pbm9kZTsKKworCWVrID0gZXhwX2dldF9rZXkoZXhwLT5leF9jbGllbnQsIGlub2RlLT5pX3NiLT5zX2RldiwgaW5vZGUtPmlfaW5vKTsKKwlpZiAoZWsgJiYgIUlTX0VSUihlaykpIHsKKwkJZWstPmguZXhwaXJ5X3RpbWUgPSBnZXRfc2Vjb25kcygpLTE7CisJCWV4cGtleV9wdXQoJmVrLT5oLCAmc3ZjX2V4cGtleV9jYWNoZSk7CisJfQorCXN2Y19leHBrZXlfY2FjaGUubmV4dGNoZWNrID0gZ2V0X3NlY29uZHMoKTsKK30KKwkKKy8qCisgKiBFeHBvcnQgYSBmaWxlIHN5c3RlbS4KKyAqLworaW50CitleHBfZXhwb3J0KHN0cnVjdCBuZnNjdGxfZXhwb3J0ICpueHApCit7CisJc3ZjX2NsaWVudAkqY2xwOworCXN0cnVjdCBzdmNfZXhwb3J0CSpleHAgPSBOVUxMOworCXN0cnVjdCBzdmNfZXhwb3J0CW5ldzsKKwlzdHJ1Y3Qgc3ZjX2V4cGtleQkqZnNpZF9rZXkgPSBOVUxMOworCXN0cnVjdCBuYW1laWRhdGEgbmQ7CisJaW50CQllcnI7CisKKwkvKiBDb25zaXN0ZW5jeSBjaGVjayAqLworCWVyciA9IC1FSU5WQUw7CisJaWYgKCFleHBfdmVyaWZ5X3N0cmluZyhueHAtPmV4X3BhdGgsIE5GU19NQVhQQVRITEVOKSB8fAorCSAgICAhZXhwX3ZlcmlmeV9zdHJpbmcobnhwLT5leF9jbGllbnQsIE5GU0NMTlRfSURNQVgpKQorCQlnb3RvIG91dDsKKworCWRwcmludGsoImV4cF9leHBvcnQgY2FsbGVkIGZvciAlczolcyAoJXgvJWxkIGZsICV4KS5cbiIsCisJCQlueHAtPmV4X2NsaWVudCwgbnhwLT5leF9wYXRoLAorCQkJKHVuc2lnbmVkKW54cC0+ZXhfZGV2LCAobG9uZylueHAtPmV4X2lubywKKwkJCW54cC0+ZXhfZmxhZ3MpOworCisJLyogVHJ5IHRvIGxvY2sgdGhlIGV4cG9ydCB0YWJsZSBmb3IgdXBkYXRlICovCisJZXhwX3dyaXRlbG9jaygpOworCisJLyogTG9vayB1cCBjbGllbnQgaW5mbyAqLworCWlmICghKGNscCA9IGF1dGhfZG9tYWluX2ZpbmQobnhwLT5leF9jbGllbnQpKSkKKwkJZ290byBvdXRfdW5sb2NrOworCisKKwkvKiBMb29rIHVwIHRoZSBkZW50cnkgKi8KKwllcnIgPSBwYXRoX2xvb2t1cChueHAtPmV4X3BhdGgsIDAsICZuZCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfdW5sb2NrOworCWVyciA9IC1FSU5WQUw7CisKKwlleHAgPSBleHBfZ2V0X2J5X25hbWUoY2xwLCBuZC5tbnQsIG5kLmRlbnRyeSwgTlVMTCk7CisKKwkvKiBtdXN0IG1ha2Ugc3VyZSB0aGVyZSB3b24ndCBiZSBhbiBleF9mc2lkIGNsYXNoICovCisJaWYgKChueHAtPmV4X2ZsYWdzICYgTkZTRVhQX0ZTSUQpICYmCisJICAgIChmc2lkX2tleSA9IGV4cF9nZXRfZnNpZF9rZXkoY2xwLCBueHAtPmV4X2RldikpICYmCisJICAgICFJU19FUlIoZnNpZF9rZXkpICYmCisJICAgIGZzaWRfa2V5LT5la19leHBvcnQgJiYKKwkgICAgZnNpZF9rZXktPmVrX2V4cG9ydCAhPSBleHApCisJCWdvdG8gZmluaXNoOworCisJaWYgKGV4cCkgeworCQkvKiBqdXN0IGEgZmxhZ3MvaWQvZnNpZCB1cGRhdGUgKi8KKworCQlleHBfZnNpZF91bmhhc2goZXhwKTsKKwkJZXhwLT5leF9mbGFncyAgICA9IG54cC0+ZXhfZmxhZ3M7CisJCWV4cC0+ZXhfYW5vbl91aWQgPSBueHAtPmV4X2Fub25fdWlkOworCQlleHAtPmV4X2Fub25fZ2lkID0gbnhwLT5leF9hbm9uX2dpZDsKKwkJZXhwLT5leF9mc2lkICAgICA9IG54cC0+ZXhfZGV2OworCisJCWVyciA9IGV4cF9mc2lkX2hhc2goY2xwLCBleHApOworCQlnb3RvIGZpbmlzaDsKKwl9CisKKwllcnIgPSBjaGVja19leHBvcnQobmQuZGVudHJ5LT5kX2lub2RlLCBueHAtPmV4X2ZsYWdzKTsKKwlpZiAoZXJyKSBnb3RvIGZpbmlzaDsKKworCWVyciA9IC1FTk9NRU07CisKKwlkcHJpbnRrKCJuZnNkOiBjcmVhdGluZyBleHBvcnQgZW50cnkgJXAgZm9yIGNsaWVudCAlcFxuIiwgZXhwLCBjbHApOworCisJbmV3LmguZXhwaXJ5X3RpbWUgPSBORVZFUjsKKwluZXcuaC5mbGFncyA9IDA7CisJbmV3LmV4X2NsaWVudCA9IGNscDsKKwluZXcuZXhfbW50ID0gbmQubW50OworCW5ldy5leF9kZW50cnkgPSBuZC5kZW50cnk7CisJbmV3LmV4X2ZsYWdzID0gbnhwLT5leF9mbGFnczsKKwluZXcuZXhfYW5vbl91aWQgPSBueHAtPmV4X2Fub25fdWlkOworCW5ldy5leF9hbm9uX2dpZCA9IG54cC0+ZXhfYW5vbl9naWQ7CisJbmV3LmV4X2ZzaWQgPSBueHAtPmV4X2RldjsKKworCWV4cCA9IHN2Y19leHBvcnRfbG9va3VwKCZuZXcsIDEpOworCisJaWYgKGV4cCA9PSBOVUxMKQorCQlnb3RvIGZpbmlzaDsKKworCWVyciA9IDA7CisKKwlpZiAoZXhwX2hhc2goY2xwLCBleHApIHx8CisJICAgIGV4cF9mc2lkX2hhc2goY2xwLCBleHApKSB7CisJCS8qIGZhaWxlZCB0byBjcmVhdGUgYXQgbGVhc3Qgb25lIGluZGV4ICovCisJCWV4cF9kb191bmV4cG9ydChleHApOworCQljYWNoZV9mbHVzaCgpOworCQllcnIgPSAtRU5PTUVNOworCX0KKworZmluaXNoOgorCWlmIChleHApCisJCWV4cF9wdXQoZXhwKTsKKwlpZiAoZnNpZF9rZXkgJiYgIUlTX0VSUihmc2lkX2tleSkpCisJCWV4cGtleV9wdXQoJmZzaWRfa2V5LT5oLCAmc3ZjX2V4cGtleV9jYWNoZSk7CisJaWYgKGNscCkKKwkJYXV0aF9kb21haW5fcHV0KGNscCk7CisJcGF0aF9yZWxlYXNlKCZuZCk7CitvdXRfdW5sb2NrOgorCWV4cF93cml0ZXVubG9jaygpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBVbmV4cG9ydCBhIGZpbGUgc3lzdGVtLiBUaGUgZXhwb3J0IGVudHJ5IGhhcyBhbHJlYWR5CisgKiBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgY2xpZW50J3MgbGlzdCBvZiBleHBvcnRlZCBmcydzLgorICovCitzdGF0aWMgdm9pZAorZXhwX2RvX3VuZXhwb3J0KHN2Y19leHBvcnQgKnVuZXhwKQoreworCXVuZXhwLT5oLmV4cGlyeV90aW1lID0gZ2V0X3NlY29uZHMoKS0xOworCXN2Y19leHBvcnRfY2FjaGUubmV4dGNoZWNrID0gZ2V0X3NlY29uZHMoKTsKKwlleHBfdW5oYXNoKHVuZXhwKTsKKwlleHBfZnNpZF91bmhhc2godW5leHApOworfQorCisKKy8qCisgKiB1bmV4cG9ydCBzeXNjYWxsLgorICovCitpbnQKK2V4cF91bmV4cG9ydChzdHJ1Y3QgbmZzY3RsX2V4cG9ydCAqbnhwKQoreworCXN0cnVjdCBhdXRoX2RvbWFpbiAqZG9tOworCXN2Y19leHBvcnQgKmV4cDsKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCWludAkJZXJyOworCisJLyogQ29uc2lzdGVuY3kgY2hlY2sgKi8KKwlpZiAoIWV4cF92ZXJpZnlfc3RyaW5nKG54cC0+ZXhfcGF0aCwgTkZTX01BWFBBVEhMRU4pIHx8CisJICAgICFleHBfdmVyaWZ5X3N0cmluZyhueHAtPmV4X2NsaWVudCwgTkZTQ0xOVF9JRE1BWCkpCisJCXJldHVybiAtRUlOVkFMOworCisJZXhwX3dyaXRlbG9jaygpOworCisJZXJyID0gLUVJTlZBTDsKKwlkb20gPSBhdXRoX2RvbWFpbl9maW5kKG54cC0+ZXhfY2xpZW50KTsKKwlpZiAoIWRvbSkgeworCQlkcHJpbnRrKCJuZnNkOiB1bmV4cG9ydCBjb3VsZG4ndCBmaW5kICVzXG4iLCBueHAtPmV4X2NsaWVudCk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwllcnIgPSBwYXRoX2xvb2t1cChueHAtPmV4X3BhdGgsIDAsICZuZCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZG9tYWluOworCisJZXJyID0gLUVJTlZBTDsKKwlleHAgPSBleHBfZ2V0X2J5X25hbWUoZG9tLCBuZC5tbnQsIG5kLmRlbnRyeSwgTlVMTCk7CisJcGF0aF9yZWxlYXNlKCZuZCk7CisJaWYgKCFleHApCisJCWdvdG8gb3V0X2RvbWFpbjsKKworCWV4cF9kb191bmV4cG9ydChleHApOworCWV4cF9wdXQoZXhwKTsKKwllcnIgPSAwOworCitvdXRfZG9tYWluOgorCWF1dGhfZG9tYWluX3B1dChkb20pOworCWNhY2hlX2ZsdXNoKCk7CitvdXRfdW5sb2NrOgorCWV4cF93cml0ZXVubG9jaygpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBPYnRhaW4gdGhlIHJvb3QgZmggb24gYmVoYWxmIG9mIGEgY2xpZW50LgorICogVGhpcyBjb3VsZCBiZSBkb25lIGluIHVzZXIgc3BhY2UsIGJ1dCBJIGZlZWwgdGhhdCBpdCBhZGRzIHNvbWUgc2FmZXR5CisgKiBzaW5jZSBpdHMgaGFyZGVyIHRvIGZvb2wgYSBrZXJuZWwgbW9kdWxlIHRoYW4gYSB1c2VyIHNwYWNlIHByb2dyYW0uCisgKi8KK2ludAorZXhwX3Jvb3RmaChzdmNfY2xpZW50ICpjbHAsIGNoYXIgKnBhdGgsIHN0cnVjdCBrbmZzZF9maCAqZiwgaW50IG1heHNpemUpCit7CisJc3RydWN0IHN2Y19leHBvcnQJKmV4cDsKKwlzdHJ1Y3QgbmFtZWlkYXRhCW5kOworCXN0cnVjdCBpbm9kZQkJKmlub2RlOworCXN0cnVjdCBzdmNfZmgJCWZoOworCWludAkJCWVycjsKKworCWVyciA9IC1FUEVSTTsKKwkvKiBOQjogd2UgcHJvYmFibHkgb3VnaHQgdG8gY2hlY2sgdGhhdCBpdCdzIE5VTC10ZXJtaW5hdGVkICovCisJaWYgKHBhdGhfbG9va3VwKHBhdGgsIDAsICZuZCkpIHsKKwkJcHJpbnRrKCJuZnNkOiBleHBfcm9vdGZoIHBhdGggbm90IGZvdW5kICVzIiwgcGF0aCk7CisJCXJldHVybiBlcnI7CisJfQorCWlub2RlID0gbmQuZGVudHJ5LT5kX2lub2RlOworCisJZHByaW50aygibmZzZDogZXhwX3Jvb3RmaCglcyBbJXBdICVzOiVzLyVsZClcbiIsCisJCSBwYXRoLCBuZC5kZW50cnksIGNscC0+bmFtZSwKKwkJIGlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8pOworCWV4cCA9IGV4cF9wYXJlbnQoY2xwLCBuZC5tbnQsIG5kLmRlbnRyeSwgTlVMTCk7CisJaWYgKCFleHApIHsKKwkJZHByaW50aygibmZzZDogZXhwX3Jvb3RmaCBleHBvcnQgbm90IGZvdW5kLlxuIik7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogZmggbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgY2FsbGluZyBmaF9jb21wb3NlCisJICovCisJZmhfaW5pdCgmZmgsIG1heHNpemUpOworCWlmIChmaF9jb21wb3NlKCZmaCwgZXhwLCBuZC5kZW50cnksIE5VTEwpKQorCQllcnIgPSAtRUlOVkFMOworCWVsc2UKKwkJZXJyID0gMDsKKwltZW1jcHkoZiwgJmZoLmZoX2hhbmRsZSwgc2l6ZW9mKHN0cnVjdCBrbmZzZF9maCkpOworCWZoX3B1dCgmZmgpOworCWV4cF9wdXQoZXhwKTsKK291dDoKKwlwYXRoX3JlbGVhc2UoJm5kKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogQ2FsbGVkIHdoZW4gd2UgbmVlZCB0aGUgZmlsZWhhbmRsZSBmb3IgdGhlIHJvb3Qgb2YgdGhlIHBzZXVkb2ZzLAorICogZm9yIGEgZ2l2ZW4gTkZTdjQgY2xpZW50LiAgIFRoZSByb290IGlzIGRlZmluZWQgdG8gYmUgdGhlCisgKiBleHBvcnQgcG9pbnQgd2l0aCBmc2lkPT0wCisgKi8KK2ludAorZXhwX3BzZXVkb3Jvb3Qoc3RydWN0IGF1dGhfZG9tYWluICpjbHAsIHN0cnVjdCBzdmNfZmggKmZocCwKKwkgICAgICAgc3RydWN0IGNhY2hlX3JlcSAqY3JlcSkKK3sKKwlzdHJ1Y3Qgc3ZjX2V4cGtleSAqZnNpZF9rZXk7CisJaW50IHJ2OworCXUzMiBmc2lkdlsyXTsKKworCW1rX2ZzaWRfdjEoZnNpZHYsIDApOworCisJZnNpZF9rZXkgPSBleHBfZmluZF9rZXkoY2xwLCAxLCBmc2lkdiwgY3JlcSk7CisJaWYgKElTX0VSUihmc2lkX2tleSkgJiYgUFRSX0VSUihmc2lkX2tleSkgPT0gLUVBR0FJTikKKwkJcmV0dXJuIG5mc2Vycl9kcm9waXQ7CisJaWYgKCFmc2lkX2tleSB8fCBJU19FUlIoZnNpZF9rZXkpKQorCQlyZXR1cm4gbmZzZXJyX3Blcm07CisKKwlydiA9IGZoX2NvbXBvc2UoZmhwLCBmc2lkX2tleS0+ZWtfZXhwb3J0LCAKKwkJCSAgZnNpZF9rZXktPmVrX2V4cG9ydC0+ZXhfZGVudHJ5LCBOVUxMKTsKKwlleHBrZXlfcHV0KCZmc2lkX2tleS0+aCwgJnN2Y19leHBrZXlfY2FjaGUpOworCXJldHVybiBydjsKK30KKworLyogSXRlcmF0b3IgKi8KKworc3RhdGljIHZvaWQgKmVfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcykKK3sKKwlsb2ZmX3QgbiA9ICpwb3M7CisJdW5zaWduZWQgaGFzaCwgZXhwb3J0OworCXN0cnVjdCBjYWNoZV9oZWFkICpjaDsKKwkKKwlleHBfcmVhZGxvY2soKTsKKwlyZWFkX2xvY2soJnN2Y19leHBvcnRfY2FjaGUuaGFzaF9sb2NrKTsKKwlpZiAoIW4tLSkKKwkJcmV0dXJuICh2b2lkICopMTsKKwloYXNoID0gbiA+PiAzMjsKKwlleHBvcnQgPSBuICYgKCgxTEw8PDMyKSAtIDEpOworCisJCisJZm9yIChjaD1leHBvcnRfdGFibGVbaGFzaF07IGNoOyBjaD1jaC0+bmV4dCkKKwkJaWYgKCFleHBvcnQtLSkKKwkJCXJldHVybiBjaDsKKwluICY9IH4oKDFMTDw8MzIpIC0gMSk7CisJZG8geworCQloYXNoKys7CisJCW4gKz0gMUxMPDwzMjsKKwl9IHdoaWxlKGhhc2ggPCBFWFBPUlRfSEFTSE1BWCAmJiBleHBvcnRfdGFibGVbaGFzaF09PU5VTEwpOworCWlmIChoYXNoID49IEVYUE9SVF9IQVNITUFYKQorCQlyZXR1cm4gTlVMTDsKKwkqcG9zID0gbisxOworCXJldHVybiBleHBvcnRfdGFibGVbaGFzaF07Cit9CisKK3N0YXRpYyB2b2lkICplX25leHQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgY2FjaGVfaGVhZCAqY2ggPSBwOworCWludCBoYXNoID0gKCpwb3MgPj4gMzIpOworCisJaWYgKHAgPT0gKHZvaWQgKikxKQorCQloYXNoID0gMDsKKwllbHNlIGlmIChjaC0+bmV4dCA9PSBOVUxMKSB7CisJCWhhc2grKzsKKwkJKnBvcyArPSAxTEw8PDMyOworCX0gZWxzZSB7CisJCSsrKnBvczsKKwkJcmV0dXJuIGNoLT5uZXh0OworCX0KKwkqcG9zICY9IH4oKDFMTDw8MzIpIC0gMSk7CisJd2hpbGUgKGhhc2ggPCBFWFBPUlRfSEFTSE1BWCAmJiBleHBvcnRfdGFibGVbaGFzaF0gPT0gTlVMTCkgeworCQloYXNoKys7CisJCSpwb3MgKz0gMUxMPDwzMjsKKwl9CisJaWYgKGhhc2ggPj0gRVhQT1JUX0hBU0hNQVgpCisJCXJldHVybiBOVUxMOworCSsrKnBvczsKKwlyZXR1cm4gZXhwb3J0X3RhYmxlW2hhc2hdOworfQorCitzdGF0aWMgdm9pZCBlX3N0b3Aoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwKQoreworCXJlYWRfdW5sb2NrKCZzdmNfZXhwb3J0X2NhY2hlLmhhc2hfbG9jayk7CisJZXhwX3JlYWR1bmxvY2soKTsKK30KKworc3RhdGljIHN0cnVjdCBmbGFncyB7CisJaW50IGZsYWc7CisJY2hhciAqbmFtZVsyXTsKK30gZXhwZmxhZ3NbXSA9IHsKKwl7IE5GU0VYUF9SRUFET05MWSwgeyJybyIsICJydyJ9fSwKKwl7IE5GU0VYUF9JTlNFQ1VSRV9QT1JULCB7Imluc2VjdXJlIiwgIiJ9fSwKKwl7IE5GU0VYUF9ST09UU1FVQVNILCB7InJvb3Rfc3F1YXNoIiwgIm5vX3Jvb3Rfc3F1YXNoIn19LAorCXsgTkZTRVhQX0FMTFNRVUFTSCwgeyJhbGxfc3F1YXNoIiwgIiJ9fSwKKwl7IE5GU0VYUF9BU1lOQywgeyJhc3luYyIsICJzeW5jIn19LAorCXsgTkZTRVhQX0dBVEhFUkVEX1dSSVRFUywgeyJ3ZGVsYXkiLCAibm9fd2RlbGF5In19LAorCXsgTkZTRVhQX05PSElERSwgeyJub2hpZGUiLCAiIn19LAorCXsgTkZTRVhQX0NST1NTTU9VTlQsIHsiY3Jvc3NtbnQiLCAiIn19LAorCXsgTkZTRVhQX05PU1VCVFJFRUNIRUNLLCB7Im5vX3N1YnRyZWVfY2hlY2siLCAiIn19LAorCXsgTkZTRVhQX05PQVVUSE5MTSwgeyJpbnNlY3VyZV9sb2NrcyIsICIifX0sCisjaWZkZWYgTVNORlMKKwl7IE5GU0VYUF9NU05GUywgeyJtc25mcyIsICIifX0sCisjZW5kaWYKKwl7IDAsIHsiIiwgIiJ9fQorfTsKKworc3RhdGljIHZvaWQgZXhwX2ZsYWdzKHN0cnVjdCBzZXFfZmlsZSAqbSwgaW50IGZsYWcsIGludCBmc2lkLCB1aWRfdCBhbm9udSwgdWlkX3QgYW5vbmcpCit7CisJaW50IGZpcnN0ID0gMDsKKwlzdHJ1Y3QgZmxhZ3MgKmZsZzsKKworCWZvciAoZmxnID0gZXhwZmxhZ3M7IGZsZy0+ZmxhZzsgZmxnKyspIHsKKwkJaW50IHN0YXRlID0gKGZsZy0+ZmxhZyAmIGZsYWcpPzA6MTsKKwkJaWYgKCpmbGctPm5hbWVbc3RhdGVdKQorCQkJc2VxX3ByaW50ZihtLCAiJXMlcyIsIGZpcnN0Kys/IiwiOiIiLCBmbGctPm5hbWVbc3RhdGVdKTsKKwl9CisJaWYgKGZsYWcgJiBORlNFWFBfRlNJRCkKKwkJc2VxX3ByaW50ZihtLCAiJXNmc2lkPSVkIiwgZmlyc3QrKz8iLCI6IiIsIGZzaWQpOworCWlmIChhbm9udSAhPSAodWlkX3QpLTIgJiYgYW5vbnUgIT0gKDB4MTAwMDAtMikpCisJCXNlcV9wcmludGYobSwgIiVzYW5vbnVpZD0lZCIsIGZpcnN0Kys/IiwiOiIiLCBhbm9udSk7CisJaWYgKGFub25nICE9IChnaWRfdCktMiAmJiBhbm9uZyAhPSAoMHgxMDAwMC0yKSkKKwkJc2VxX3ByaW50ZihtLCAiJXNhbm9uZ2lkPSVkIiwgZmlyc3QrKz8iLCI6IiIsIGFub25nKTsKK30KKworc3RhdGljIGludCBlX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwKQoreworCXN0cnVjdCBjYWNoZV9oZWFkICpjcCA9IHA7CisJc3RydWN0IHN2Y19leHBvcnQgKmV4cCA9IGNvbnRhaW5lcl9vZihjcCwgc3RydWN0IHN2Y19leHBvcnQsIGgpOworCXN2Y19jbGllbnQgKmNscDsKKworCWlmIChwID09ICh2b2lkICopMSkgeworCQlzZXFfcHV0cyhtLCAiIyBWZXJzaW9uIDEuMVxuIik7CisJCXNlcV9wdXRzKG0sICIjIFBhdGggQ2xpZW50KEZsYWdzKSAjIElQc1xuIik7CisJCXJldHVybiAwOworCX0KKworCWNscCA9IGV4cC0+ZXhfY2xpZW50OworCWNhY2hlX2dldCgmZXhwLT5oKTsKKwlpZiAoY2FjaGVfY2hlY2soJnN2Y19leHBvcnRfY2FjaGUsICZleHAtPmgsIE5VTEwpKQorCQlyZXR1cm4gMDsKKwlpZiAoY2FjaGVfcHV0KCZleHAtPmgsICZzdmNfZXhwb3J0X2NhY2hlKSkgQlVHKCk7CisJcmV0dXJuIHN2Y19leHBvcnRfc2hvdyhtLCAmc3ZjX2V4cG9ydF9jYWNoZSwgY3ApOworfQorCitzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgbmZzX2V4cG9ydHNfb3AgPSB7CisJLnN0YXJ0CT0gZV9zdGFydCwKKwkubmV4dAk9IGVfbmV4dCwKKwkuc3RvcAk9IGVfc3RvcCwKKwkuc2hvdwk9IGVfc2hvdywKK307CisKKy8qCisgKiBBZGQgb3IgbW9kaWZ5IGEgY2xpZW50LgorICogQ2hhbmdlIHJlcXVlc3RzIG1heSBpbnZvbHZlIHRoZSBsaXN0IG9mIGhvc3QgYWRkcmVzc2VzLiBUaGUgbGlzdCBvZgorICogZXhwb3J0cyBhbmQgcG9zc2libHkgZXhpc3RpbmcgdWlkIG1hcHMgYXJlIGxlZnQgdW50b3VjaGVkLgorICovCitpbnQKK2V4cF9hZGRjbGllbnQoc3RydWN0IG5mc2N0bF9jbGllbnQgKm5jcCkKK3sKKwlzdHJ1Y3QgYXV0aF9kb21haW4JKmRvbTsKKwlpbnQJCQlpLCBlcnI7CisKKwkvKiBGaXJzdCwgY29uc2lzdGVuY3kgY2hlY2suICovCisJZXJyID0gLUVJTlZBTDsKKwlpZiAoISBleHBfdmVyaWZ5X3N0cmluZyhuY3AtPmNsX2lkZW50LCBORlNDTE5UX0lETUFYKSkKKwkJZ290byBvdXQ7CisJaWYgKG5jcC0+Y2xfbmFkZHIgPiBORlNDTE5UX0FERFJNQVgpCisJCWdvdG8gb3V0OworCisJLyogTG9jayB0aGUgaGFzaHRhYmxlICovCisJZXhwX3dyaXRlbG9jaygpOworCisJZG9tID0gdW5peF9kb21haW5fZmluZChuY3AtPmNsX2lkZW50KTsKKworCWVyciA9IC1FTk9NRU07CisJaWYgKCFkb20pCisJCWdvdG8gb3V0X3VubG9jazsKKworCS8qIEluc2VydCBjbGllbnQgaW50byBoYXNodGFibGUuICovCisJZm9yIChpID0gMDsgaSA8IG5jcC0+Y2xfbmFkZHI7IGkrKykKKwkJYXV0aF91bml4X2FkZF9hZGRyKG5jcC0+Y2xfYWRkcmxpc3RbaV0sIGRvbSk7CisKKwlhdXRoX3VuaXhfZm9yZ2V0X29sZChkb20pOworCWF1dGhfZG9tYWluX3B1dChkb20pOworCisJZXJyID0gMDsKKworb3V0X3VubG9jazoKKwlleHBfd3JpdGV1bmxvY2soKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogRGVsZXRlIGEgY2xpZW50IGdpdmVuIGFuIGlkZW50aWZpZXIuCisgKi8KK2ludAorZXhwX2RlbGNsaWVudChzdHJ1Y3QgbmZzY3RsX2NsaWVudCAqbmNwKQoreworCWludAkJZXJyOworCXN0cnVjdCBhdXRoX2RvbWFpbiAqZG9tOworCisJZXJyID0gLUVJTlZBTDsKKwlpZiAoIWV4cF92ZXJpZnlfc3RyaW5nKG5jcC0+Y2xfaWRlbnQsIE5GU0NMTlRfSURNQVgpKQorCQlnb3RvIG91dDsKKworCS8qIExvY2sgdGhlIGhhc2h0YWJsZSAqLworCWV4cF93cml0ZWxvY2soKTsKKworCWRvbSA9IGF1dGhfZG9tYWluX2ZpbmQobmNwLT5jbF9pZGVudCk7CisJLyoganVzdCBtYWtlIHN1cmUgdGhhdCBubyBhZGRyZXNzZXMgd29yayAKKwkgKiBhbmQgdGhhdCBpdCB3aWxsIGV4cGlyZSBzb29uIAorCSAqLworCWlmIChkb20pIHsKKwkJZXJyID0gYXV0aF91bml4X2ZvcmdldF9vbGQoZG9tKTsKKwkJZG9tLT5oLmV4cGlyeV90aW1lID0gZ2V0X3NlY29uZHMoKTsKKwkJYXV0aF9kb21haW5fcHV0KGRvbSk7CisJfQorCisJZXhwX3dyaXRldW5sb2NrKCk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIFZlcmlmeSB0aGF0IHN0cmluZyBpcyBub24tZW1wdHkgYW5kIGRvZXMgbm90IGV4Y2VlZCBtYXggbGVuZ3RoLgorICovCitzdGF0aWMgaW50CitleHBfdmVyaWZ5X3N0cmluZyhjaGFyICpjcCwgaW50IG1heCkKK3sKKwlpbnQJaTsKKworCWZvciAoaSA9IDA7IGkgPCBtYXg7IGkrKykKKwkJaWYgKCFjcFtpXSkKKwkJCXJldHVybiBpOworCWNwW2ldID0gMDsKKwlwcmludGsoS0VSTl9OT1RJQ0UgIm5mc2Q6IGNvdWxkbid0IHZhbGlkYXRlIHN0cmluZyAlc1xuIiwgY3ApOworCXJldHVybiAwOworfQorCisvKgorICogSW5pdGlhbGl6ZSB0aGUgZXhwb3J0cyBtb2R1bGUuCisgKi8KK3ZvaWQKK25mc2RfZXhwb3J0X2luaXQodm9pZCkKK3sKKwlkcHJpbnRrKCJuZnNkOiBpbml0aWFsaXppbmcgZXhwb3J0IG1vZHVsZS5cbiIpOworCisJY2FjaGVfcmVnaXN0ZXIoJnN2Y19leHBvcnRfY2FjaGUpOworCWNhY2hlX3JlZ2lzdGVyKCZzdmNfZXhwa2V5X2NhY2hlKTsKKworfQorCisvKgorICogRmx1c2ggZXhwb3J0cyB0YWJsZSAtIGNhbGxlZCB3aGVuIGxhc3QgbmZzZCB0aHJlYWQgaXMga2lsbGVkCisgKi8KK3ZvaWQKK25mc2RfZXhwb3J0X2ZsdXNoKHZvaWQpCit7CisJZXhwX3dyaXRlbG9jaygpOworCWNhY2hlX3B1cmdlKCZzdmNfZXhwa2V5X2NhY2hlKTsKKwljYWNoZV9wdXJnZSgmc3ZjX2V4cG9ydF9jYWNoZSk7CisJZXhwX3dyaXRldW5sb2NrKCk7Cit9CisKKy8qCisgKiBTaHV0ZG93biB0aGUgZXhwb3J0cyBtb2R1bGUuCisgKi8KK3ZvaWQKK25mc2RfZXhwb3J0X3NodXRkb3duKHZvaWQpCit7CisKKwlkcHJpbnRrKCJuZnNkOiBzaHV0dGluZyBkb3duIGV4cG9ydCBtb2R1bGUuXG4iKTsKKworCWV4cF93cml0ZWxvY2soKTsKKworCWlmIChjYWNoZV91bnJlZ2lzdGVyKCZzdmNfZXhwa2V5X2NhY2hlKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJuZnNkOiBmYWlsZWQgdG8gdW5yZWdpc3RlciBleHBrZXkgY2FjaGVcbiIpOworCWlmIChjYWNoZV91bnJlZ2lzdGVyKCZzdmNfZXhwb3J0X2NhY2hlKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJuZnNkOiBmYWlsZWQgdG8gdW5yZWdpc3RlciBleHBvcnQgY2FjaGVcbiIpOworCXN2Y2F1dGhfdW5peF9wdXJnZSgpOworCisJZXhwX3dyaXRldW5sb2NrKCk7CisJZHByaW50aygibmZzZDogZXhwb3J0IHNodXRkb3duIGNvbXBsZXRlLlxuIik7Cit9CmRpZmYgLS1naXQgYS9mcy9uZnNkL2xvY2tkLmMgYi9mcy9uZnNkL2xvY2tkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I4ODlmZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25mc2QvbG9ja2QuYwpAQCAtMCwwICsxLDc5IEBACisvKgorICogbGludXgvZnMvbmZzZC9sb2NrZC5jCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCB0aGUgc3R1YnMgbmVlZGVkIHdoZW4gY29tbXVuaWNhdGluZyB3aXRoIGxvY2tkLgorICogVGhpcyBsZXZlbCBvZiBpbmRpcmVjdGlvbiBpcyBuZWNlc3Nhcnkgc28gd2UgY2FuIHJ1biBuZnNkK2xvY2tkIHdpdGhvdXQKKyAqIHJlcXVpcmluZyB0aGUgbmZzIGNsaWVudCB0byBiZSBjb21waWxlZCBpbi9sb2FkZWQsIGFuZCB2aWNlIHZlcnNhLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NiwgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2xudC5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL25mc2QuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2NrZC9iaW5kLmg+CisKKyNkZWZpbmUgTkZTRERCR19GQUNJTElUWQkJTkZTRERCR19MT0NLRAorCisvKgorICogTm90ZTogd2UgaG9sZCB0aGUgZGVudHJ5IHVzZSBjb3VudCB3aGlsZSB0aGUgZmlsZSBpcyBvcGVuLgorICovCitzdGF0aWMgdTMyCitubG1fZm9wZW4oc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc19maCAqZiwgc3RydWN0IGZpbGUgKipmaWxwKQoreworCXUzMgkJbmZzZXJyOworCXN0cnVjdCBzdmNfZmgJZmg7CisKKwkvKiBtdXN0IGluaXRpYWxpemUgYmVmb3JlIHVzaW5nISBidXQgbWF4c2l6ZSBkb2Vzbid0IG1hdHRlciAqLworCWZoX2luaXQoJmZoLDApOworCWZoLmZoX2hhbmRsZS5maF9zaXplID0gZi0+c2l6ZTsKKwltZW1jcHkoKGNoYXIqKSZmaC5maF9oYW5kbGUuZmhfYmFzZSwgZi0+ZGF0YSwgZi0+c2l6ZSk7CisJZmguZmhfZXhwb3J0ID0gTlVMTDsKKworCWV4cF9yZWFkbG9jaygpOworCW5mc2VyciA9IG5mc2Rfb3BlbihycXN0cCwgJmZoLCBTX0lGUkVHLCBNQVlfTE9DSywgZmlscCk7CisJZmhfcHV0KCZmaCk7CisJcnFzdHAtPnJxX2NsaWVudCA9IE5VTEw7CisJZXhwX3JlYWR1bmxvY2soKTsKKyAJLyogbmxtIGFuZCBuZnNkIGRvbid0IHNoYXJlIGVycm9yIGNvZGVzLgorCSAqIHdlIGludmVudDogMCA9IG5vIGVycm9yCisJICogICAgICAgICAgICAxID0gc3RhbGUgZmlsZSBoYW5kbGUKKwkgKgkgICAgICAyID0gb3RoZXIgZXJyb3IKKwkgKi8KKwlzd2l0Y2ggKG5mc2VycikgeworCWNhc2UgbmZzX29rOgorCQlyZXR1cm4gMDsKKwljYXNlIG5mc2Vycl9zdGFsZToKKwkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDI7CisJfQorfQorCitzdGF0aWMgdm9pZAorbmxtX2ZjbG9zZShzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlmcHV0KGZpbHApOworfQorCitzdGF0aWMgc3RydWN0IG5sbXN2Y19iaW5kaW5nCW5mc2RfbmxtX29wcyA9IHsKKwkuZm9wZW4JCT0gbmxtX2ZvcGVuLAkJLyogb3BlbiBmaWxlIGZvciBsb2NraW5nICovCisJLmZjbG9zZQkJPSBubG1fZmNsb3NlLAkJLyogY2xvc2UgZmlsZSAqLworfTsKKwordm9pZAorbmZzZF9sb2NrZF9pbml0KHZvaWQpCit7CisJZHByaW50aygibmZzZDogaW5pdGlhbGl6aW5nIGxvY2tkXG4iKTsKKwlubG1zdmNfb3BzID0gJm5mc2RfbmxtX29wczsKK30KKwordm9pZAorbmZzZF9sb2NrZF9zaHV0ZG93bih2b2lkKQoreworCW5sbXN2Y19vcHMgPSBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnMzcHJvYy5jIGIvZnMvbmZzZC9uZnMzcHJvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MTM4MGYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnNkL25mczNwcm9jLmMKQEAgLTAsMCArMSw3MDIgQEAKKy8qCisgKiBsaW51eC9mcy9uZnNkL25mczNwcm9jLmMKKyAqCisgKiBQcm9jZXNzIHZlcnNpb24gMyBORlMgcmVxdWVzdHMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LCAxOTk3LCAxOTk4IE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9leHQyX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKworI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL25mc2QuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL2NhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvbmZzZC94ZHIzLmg+CisjaW5jbHVkZSA8bGludXgvbmZzMy5oPgorCisjZGVmaW5lIE5GU0REQkdfRkFDSUxJVFkJCU5GU0REQkdfUFJPQworCisjZGVmaW5lIFJFVFVSTl9TVEFUVVMoc3QpCXsgcmVzcC0+c3RhdHVzID0gKHN0KTsgcmV0dXJuIChzdCk7IH0KKworc3RhdGljIGludAluZnMzX2Z0eXBlc1tdID0geworCTAsCQkJLyogTkYzTk9OICovCisJU19JRlJFRywJCS8qIE5GM1JFRyAqLworCVNfSUZESVIsCQkvKiBORjNESVIgKi8KKwlTX0lGQkxLLAkJLyogTkYzQkxLICovCisJU19JRkNIUiwJCS8qIE5GM0NIUiAqLworCVNfSUZMTkssCQkvKiBORjNMTksgKi8KKwlTX0lGU09DSywJCS8qIE5GM1NPQ0sgKi8KKwlTX0lGSUZPLAkJLyogTkYzRklGTyAqLworfTsKKworLyoKKyAqIE5VTEwgY2FsbC4KKyAqLworc3RhdGljIGludAorbmZzZDNfcHJvY19udWxsKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHZvaWQgKmFyZ3AsIHZvaWQgKnJlc3ApCit7CisJcmV0dXJuIG5mc19vazsKK30KKworLyoKKyAqIEdldCBhIGZpbGUncyBhdHRyaWJ1dGVzCisgKi8KK3N0YXRpYyBpbnQKK25mc2QzX3Byb2NfZ2V0YXR0cihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZF9maGFuZGxlICAqYXJncCwKKwkJCQkJICAgc3RydWN0IG5mc2QzX2F0dHJzdGF0ICpyZXNwKQoreworCWludAluZnNlcnI7CisKKwlkcHJpbnRrKCJuZnNkOiBHRVRBVFRSKDMpICAlc1xuIiwKKwkJCQlTVkNGSF9mbXQoJmFyZ3AtPmZoKSk7CisKKwlmaF9jb3B5KCZyZXNwLT5maCwgJmFyZ3AtPmZoKTsKKwluZnNlcnIgPSBmaF92ZXJpZnkocnFzdHAsICZyZXNwLT5maCwgMCwgTUFZX05PUCk7CisJUkVUVVJOX1NUQVRVUyhuZnNlcnIpOworfQorCisvKgorICogU2V0IGEgZmlsZSdzIGF0dHJpYnV0ZXMKKyAqLworc3RhdGljIGludAorbmZzZDNfcHJvY19zZXRhdHRyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkM19zYXR0cmFyZ3MgKmFyZ3AsCisJCQkJCSAgIHN0cnVjdCBuZnNkM19hdHRyc3RhdCAgKnJlc3ApCit7CisJaW50CW5mc2VycjsKKworCWRwcmludGsoIm5mc2Q6IFNFVEFUVFIoMykgICVzXG4iLAorCQkJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmgpKTsKKworCWZoX2NvcHkoJnJlc3AtPmZoLCAmYXJncC0+ZmgpOworCW5mc2VyciA9IG5mc2Rfc2V0YXR0cihycXN0cCwgJnJlc3AtPmZoLCAmYXJncC0+YXR0cnMsCisJCQkgICAgICBhcmdwLT5jaGVja19ndWFyZCwgYXJncC0+Z3VhcmR0aW1lKTsKKwlSRVRVUk5fU1RBVFVTKG5mc2Vycik7Cit9CisKKy8qCisgKiBMb29rIHVwIGEgcGF0aCBuYW1lIGNvbXBvbmVudAorICovCitzdGF0aWMgaW50CituZnNkM19wcm9jX2xvb2t1cChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDNfZGlyb3BhcmdzICphcmdwLAorCQkJCQkgIHN0cnVjdCBuZnNkM19kaXJvcHJlcyAgKnJlc3ApCit7CisJaW50CW5mc2VycjsKKworCWRwcmludGsoIm5mc2Q6IExPT0tVUCgzKSAgICVzICUuKnNcbiIsCisJCQkJU1ZDRkhfZm10KCZhcmdwLT5maCksCisJCQkJYXJncC0+bGVuLAorCQkJCWFyZ3AtPm5hbWUpOworCisJZmhfY29weSgmcmVzcC0+ZGlyZmgsICZhcmdwLT5maCk7CisJZmhfaW5pdCgmcmVzcC0+ZmgsIE5GUzNfRkhTSVpFKTsKKworCW5mc2VyciA9IG5mc2RfbG9va3VwKHJxc3RwLCAmcmVzcC0+ZGlyZmgsCisJCQkJICAgIGFyZ3AtPm5hbWUsCisJCQkJICAgIGFyZ3AtPmxlbiwKKwkJCQkgICAgJnJlc3AtPmZoKTsKKwlSRVRVUk5fU1RBVFVTKG5mc2Vycik7Cit9CisKKy8qCisgKiBDaGVjayBmaWxlIGFjY2VzcworICovCitzdGF0aWMgaW50CituZnNkM19wcm9jX2FjY2VzcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDNfYWNjZXNzYXJncyAqYXJncCwKKwkJCQkJICBzdHJ1Y3QgbmZzZDNfYWNjZXNzcmVzICpyZXNwKQoreworCWludAluZnNlcnI7CisKKwlkcHJpbnRrKCJuZnNkOiBBQ0NFU1MoMykgICAlcyAweCV4XG4iLAorCQkJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmgpLAorCQkJCWFyZ3AtPmFjY2Vzcyk7CisKKwlmaF9jb3B5KCZyZXNwLT5maCwgJmFyZ3AtPmZoKTsKKwlyZXNwLT5hY2Nlc3MgPSBhcmdwLT5hY2Nlc3M7CisJbmZzZXJyID0gbmZzZF9hY2Nlc3MocnFzdHAsICZyZXNwLT5maCwgJnJlc3AtPmFjY2VzcywgTlVMTCk7CisJUkVUVVJOX1NUQVRVUyhuZnNlcnIpOworfQorCisvKgorICogUmVhZCBhIHN5bWxpbmsuCisgKi8KK3N0YXRpYyBpbnQKK25mc2QzX3Byb2NfcmVhZGxpbmsoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2QzX3JlYWRsaW5rYXJncyAqYXJncCwKKwkJCQkJICAgc3RydWN0IG5mc2QzX3JlYWRsaW5rcmVzICpyZXNwKQoreworCWludCBuZnNlcnI7CisKKwlkcHJpbnRrKCJuZnNkOiBSRUFETElOSygzKSAlc1xuIiwgU1ZDRkhfZm10KCZhcmdwLT5maCkpOworCisJLyogUmVhZCB0aGUgc3ltbGluay4gKi8KKwlmaF9jb3B5KCZyZXNwLT5maCwgJmFyZ3AtPmZoKTsKKwlyZXNwLT5sZW4gPSBORlMzX01BWFBBVEhMRU47CisJbmZzZXJyID0gbmZzZF9yZWFkbGluayhycXN0cCwgJnJlc3AtPmZoLCBhcmdwLT5idWZmZXIsICZyZXNwLT5sZW4pOworCVJFVFVSTl9TVEFUVVMobmZzZXJyKTsKK30KKworLyoKKyAqIFJlYWQgYSBwb3J0aW9uIG9mIGEgZmlsZS4KKyAqLworc3RhdGljIGludAorbmZzZDNfcHJvY19yZWFkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkM19yZWFkYXJncyAqYXJncCwKKwkJCQkgICAgICAgIHN0cnVjdCBuZnNkM19yZWFkcmVzICAqcmVzcCkKK3sKKwlpbnQJbmZzZXJyOworCisJZHByaW50aygibmZzZDogUkVBRCgzKSAlcyAlbHUgYnl0ZXMgYXQgJWx1XG4iLAorCQkJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmgpLAorCQkJCSh1bnNpZ25lZCBsb25nKSBhcmdwLT5jb3VudCwKKwkJCQkodW5zaWduZWQgbG9uZykgYXJncC0+b2Zmc2V0KTsKKworCS8qIE9idGFpbiBidWZmZXIgcG9pbnRlciBmb3IgcGF5bG9hZC4KKwkgKiAxIChzdGF0dXMpICsgMjIgKHBvc3Rfb3BfYXR0cikgKyAxIChjb3VudCkgKyAxIChlb2YpCisJICogKyAxICh4ZHIgb3BhcXVlIGJ5dGUgY291bnQpID0gMjYKKwkgKi8KKworCXJlc3AtPmNvdW50ID0gYXJncC0+Y291bnQ7CisJaWYgKE5GU1NWQ19NQVhCTEtTSVpFIDwgcmVzcC0+Y291bnQpCisJCXJlc3AtPmNvdW50ID0gTkZTU1ZDX01BWEJMS1NJWkU7CisKKwlzdmNfcmVzZXJ2ZShycXN0cCwgKCgxICsgTkZTM19QT1NUX09QX0FUVFJfV09SRFMgKyAzKTw8MikgKyByZXNwLT5jb3VudCArNCk7CisKKwlmaF9jb3B5KCZyZXNwLT5maCwgJmFyZ3AtPmZoKTsKKwluZnNlcnIgPSBuZnNkX3JlYWQocnFzdHAsICZyZXNwLT5maCwgTlVMTCwKKwkJCQkgIGFyZ3AtPm9mZnNldCwKKwkJCSAgIAkgIGFyZ3AtPnZlYywgYXJncC0+dmxlbiwKKwkJCQkgICZyZXNwLT5jb3VudCk7CisJaWYgKG5mc2VyciA9PSAwKSB7CisJCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSByZXNwLT5maC5maF9kZW50cnktPmRfaW5vZGU7CisKKwkJcmVzcC0+ZW9mID0gKGFyZ3AtPm9mZnNldCArIHJlc3AtPmNvdW50KSA+PSBpbm9kZS0+aV9zaXplOworCX0KKworCVJFVFVSTl9TVEFUVVMobmZzZXJyKTsKK30KKworLyoKKyAqIFdyaXRlIGRhdGEgdG8gYSBmaWxlCisgKi8KK3N0YXRpYyBpbnQKK25mc2QzX3Byb2Nfd3JpdGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2QzX3dyaXRlYXJncyAqYXJncCwKKwkJCQkJIHN0cnVjdCBuZnNkM193cml0ZXJlcyAgKnJlc3ApCit7CisJaW50CW5mc2VycjsKKworCWRwcmludGsoIm5mc2Q6IFdSSVRFKDMpICAgICVzICVkIGJ5dGVzIGF0ICVsZCVzXG4iLAorCQkJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmgpLAorCQkJCWFyZ3AtPmxlbiwKKwkJCQkodW5zaWduZWQgbG9uZykgYXJncC0+b2Zmc2V0LAorCQkJCWFyZ3AtPnN0YWJsZT8gIiBzdGFibGUiIDogIiIpOworCisJZmhfY29weSgmcmVzcC0+ZmgsICZhcmdwLT5maCk7CisJcmVzcC0+Y29tbWl0dGVkID0gYXJncC0+c3RhYmxlOworCW5mc2VyciA9IG5mc2Rfd3JpdGUocnFzdHAsICZyZXNwLT5maCwgTlVMTCwKKwkJCQkgICBhcmdwLT5vZmZzZXQsCisJCQkJICAgYXJncC0+dmVjLCBhcmdwLT52bGVuLAorCQkJCSAgIGFyZ3AtPmxlbiwKKwkJCQkgICAmcmVzcC0+Y29tbWl0dGVkKTsKKwlyZXNwLT5jb3VudCA9IGFyZ3AtPmNvdW50OworCVJFVFVSTl9TVEFUVVMobmZzZXJyKTsKK30KKworLyoKKyAqIFdpdGggTkZTdjMsIENSRUFURSBwcm9jZXNzaW5nIGlzIGEgbG90IGVhc2llciB0aGFuIHdpdGggTkZTdjIuCisgKiBBdCBsZWFzdCBpbiB0aGVvcnk7IHdlJ2xsIHNlZSBob3cgaXQgZmFyZXMgaW4gcHJhY3RpY2Ugd2hlbiB0aGUKKyAqIGZpcnN0IHJlcG9ydHMgYWJvdXQgU3VuT1MgY29tcGF0aWJpbGl0eSBwcm9ibGVtcyBzdGFydCB0byBwb3VyIGluLi4uCisgKi8KK3N0YXRpYyBpbnQKK25mc2QzX3Byb2NfY3JlYXRlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkM19jcmVhdGVhcmdzICphcmdwLAorCQkJCQkgIHN0cnVjdCBuZnNkM19kaXJvcHJlcyAgICpyZXNwKQoreworCXN2Y19maAkJKmRpcmZocCwgKm5ld2ZocCA9IE5VTEw7CisJc3RydWN0IGlhdHRyCSphdHRyOworCXUzMgkJbmZzZXJyOworCisJZHByaW50aygibmZzZDogQ1JFQVRFKDMpICAgJXMgJS4qc1xuIiwKKwkJCQlTVkNGSF9mbXQoJmFyZ3AtPmZoKSwKKwkJCQlhcmdwLT5sZW4sCisJCQkJYXJncC0+bmFtZSk7CisKKwlkaXJmaHAgPSBmaF9jb3B5KCZyZXNwLT5kaXJmaCwgJmFyZ3AtPmZoKTsKKwluZXdmaHAgPSBmaF9pbml0KCZyZXNwLT5maCwgTkZTM19GSFNJWkUpOworCWF0dHIgICA9ICZhcmdwLT5hdHRyczsKKworCS8qIEdldCB0aGUgZGlyZWN0b3J5IGlub2RlICovCisJbmZzZXJyID0gZmhfdmVyaWZ5KHJxc3RwLCBkaXJmaHAsIFNfSUZESVIsIE1BWV9DUkVBVEUpOworCWlmIChuZnNlcnIpCisJCVJFVFVSTl9TVEFUVVMobmZzZXJyKTsKKworCS8qIFVuZnVkZ2UgdGhlIG1vZGUgYml0cyAqLworCWF0dHItPmlhX21vZGUgJj0gflNfSUZNVDsKKwlpZiAoIShhdHRyLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkpIHsgCisJCWF0dHItPmlhX3ZhbGlkIHw9IEFUVFJfTU9ERTsKKwkJYXR0ci0+aWFfbW9kZSA9IFNfSUZSRUc7CisJfSBlbHNlIHsKKwkJYXR0ci0+aWFfbW9kZSA9IChhdHRyLT5pYV9tb2RlICYgflNfSUZNVCkgfCBTX0lGUkVHOworCX0KKworCS8qIE5vdyBjcmVhdGUgdGhlIGZpbGUgYW5kIHNldCBhdHRyaWJ1dGVzICovCisJbmZzZXJyID0gbmZzZF9jcmVhdGVfdjMocnFzdHAsIGRpcmZocCwgYXJncC0+bmFtZSwgYXJncC0+bGVuLAorCQkJCWF0dHIsIG5ld2ZocCwKKwkJCQlhcmdwLT5jcmVhdGVtb2RlLCBhcmdwLT52ZXJmLCBOVUxMKTsKKworCVJFVFVSTl9TVEFUVVMobmZzZXJyKTsKK30KKworLyoKKyAqIE1ha2UgZGlyZWN0b3J5LiBUaGlzIG9wZXJhdGlvbiBpcyBub3QgaWRlbXBvdGVudC4KKyAqLworc3RhdGljIGludAorbmZzZDNfcHJvY19ta2RpcihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDNfY3JlYXRlYXJncyAqYXJncCwKKwkJCQkJIHN0cnVjdCBuZnNkM19kaXJvcHJlcyAgICpyZXNwKQoreworCWludAluZnNlcnI7CisKKwlkcHJpbnRrKCJuZnNkOiBNS0RJUigzKSAgICAlcyAlLipzXG4iLAorCQkJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmgpLAorCQkJCWFyZ3AtPmxlbiwKKwkJCQlhcmdwLT5uYW1lKTsKKworCWFyZ3AtPmF0dHJzLmlhX3ZhbGlkICY9IH5BVFRSX1NJWkU7CisJZmhfY29weSgmcmVzcC0+ZGlyZmgsICZhcmdwLT5maCk7CisJZmhfaW5pdCgmcmVzcC0+ZmgsIE5GUzNfRkhTSVpFKTsKKwluZnNlcnIgPSBuZnNkX2NyZWF0ZShycXN0cCwgJnJlc3AtPmRpcmZoLCBhcmdwLT5uYW1lLCBhcmdwLT5sZW4sCisJCQkJICAgICZhcmdwLT5hdHRycywgU19JRkRJUiwgMCwgJnJlc3AtPmZoKTsKKworCVJFVFVSTl9TVEFUVVMobmZzZXJyKTsKK30KKworc3RhdGljIGludAorbmZzZDNfcHJvY19zeW1saW5rKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkM19zeW1saW5rYXJncyAqYXJncCwKKwkJCQkJICAgc3RydWN0IG5mc2QzX2Rpcm9wcmVzICAgICpyZXNwKQoreworCWludAluZnNlcnI7CisKKwlkcHJpbnRrKCJuZnNkOiBTWU1MSU5LKDMpICAlcyAlLipzIC0+ICUuKnNcbiIsCisJCQkJU1ZDRkhfZm10KCZhcmdwLT5mZmgpLAorCQkJCWFyZ3AtPmZsZW4sIGFyZ3AtPmZuYW1lLAorCQkJCWFyZ3AtPnRsZW4sIGFyZ3AtPnRuYW1lKTsKKworCWZoX2NvcHkoJnJlc3AtPmRpcmZoLCAmYXJncC0+ZmZoKTsKKwlmaF9pbml0KCZyZXNwLT5maCwgTkZTM19GSFNJWkUpOworCW5mc2VyciA9IG5mc2Rfc3ltbGluayhycXN0cCwgJnJlc3AtPmRpcmZoLCBhcmdwLT5mbmFtZSwgYXJncC0+ZmxlbiwKKwkJCQkJCSAgIGFyZ3AtPnRuYW1lLCBhcmdwLT50bGVuLAorCQkJCQkJICAgJnJlc3AtPmZoLCAmYXJncC0+YXR0cnMpOworCVJFVFVSTl9TVEFUVVMobmZzZXJyKTsKK30KKworLyoKKyAqIE1ha2Ugc29ja2V0L2ZpZm8vZGV2aWNlLgorICovCitzdGF0aWMgaW50CituZnNkM19wcm9jX21rbm9kKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkM19ta25vZGFyZ3MgKmFyZ3AsCisJCQkJCSBzdHJ1Y3QgbmZzZDNfZGlyb3ByZXMgICpyZXNwKQoreworCWludAluZnNlcnIsIHR5cGU7CisJZGV2X3QJcmRldiA9IDA7CisKKwlkcHJpbnRrKCJuZnNkOiBNS05PRCgzKSAgICAlcyAlLipzXG4iLAorCQkJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmgpLAorCQkJCWFyZ3AtPmxlbiwKKwkJCQlhcmdwLT5uYW1lKTsKKworCWZoX2NvcHkoJnJlc3AtPmRpcmZoLCAmYXJncC0+ZmgpOworCWZoX2luaXQoJnJlc3AtPmZoLCBORlMzX0ZIU0laRSk7CisKKwlpZiAoYXJncC0+ZnR5cGUgPT0gMCB8fCBhcmdwLT5mdHlwZSA+PSBORjNCQUQpCisJCVJFVFVSTl9TVEFUVVMobmZzZXJyX2ludmFsKTsKKwlpZiAoYXJncC0+ZnR5cGUgPT0gTkYzQ0hSIHx8IGFyZ3AtPmZ0eXBlID09IE5GM0JMSykgeworCQlyZGV2ID0gTUtERVYoYXJncC0+bWFqb3IsIGFyZ3AtPm1pbm9yKTsKKwkJaWYgKE1BSk9SKHJkZXYpICE9IGFyZ3AtPm1ham9yIHx8CisJCSAgICBNSU5PUihyZGV2KSAhPSBhcmdwLT5taW5vcikKKwkJCVJFVFVSTl9TVEFUVVMobmZzZXJyX2ludmFsKTsKKwl9IGVsc2UKKwkJaWYgKGFyZ3AtPmZ0eXBlICE9IE5GM1NPQ0sgJiYgYXJncC0+ZnR5cGUgIT0gTkYzRklGTykKKwkJCVJFVFVSTl9TVEFUVVMobmZzZXJyX2ludmFsKTsKKworCXR5cGUgPSBuZnMzX2Z0eXBlc1thcmdwLT5mdHlwZV07CisJbmZzZXJyID0gbmZzZF9jcmVhdGUocnFzdHAsICZyZXNwLT5kaXJmaCwgYXJncC0+bmFtZSwgYXJncC0+bGVuLAorCQkJCSAgICAmYXJncC0+YXR0cnMsIHR5cGUsIHJkZXYsICZyZXNwLT5maCk7CisKKwlSRVRVUk5fU1RBVFVTKG5mc2Vycik7Cit9CisKKy8qCisgKiBSZW1vdmUgZmlsZS9maWZvL3NvY2tldCBldGMuCisgKi8KK3N0YXRpYyBpbnQKK25mc2QzX3Byb2NfcmVtb3ZlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkM19kaXJvcGFyZ3MgKmFyZ3AsCisJCQkJCSAgc3RydWN0IG5mc2QzX2F0dHJzdGF0ICAqcmVzcCkKK3sKKwlpbnQJbmZzZXJyOworCisJZHByaW50aygibmZzZDogUkVNT1ZFKDMpICAgJXMgJS4qc1xuIiwKKwkJCQlTVkNGSF9mbXQoJmFyZ3AtPmZoKSwKKwkJCQlhcmdwLT5sZW4sCisJCQkJYXJncC0+bmFtZSk7CisKKwkvKiBVbmxpbmsuIC1TX0lGRElSIG1lYW5zIGZpbGUgbXVzdCBub3QgYmUgYSBkaXJlY3RvcnkgKi8KKwlmaF9jb3B5KCZyZXNwLT5maCwgJmFyZ3AtPmZoKTsKKwluZnNlcnIgPSBuZnNkX3VubGluayhycXN0cCwgJnJlc3AtPmZoLCAtU19JRkRJUiwgYXJncC0+bmFtZSwgYXJncC0+bGVuKTsKKwlSRVRVUk5fU1RBVFVTKG5mc2Vycik7Cit9CisKKy8qCisgKiBSZW1vdmUgYSBkaXJlY3RvcnkKKyAqLworc3RhdGljIGludAorbmZzZDNfcHJvY19ybWRpcihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDNfZGlyb3BhcmdzICphcmdwLAorCQkJCQkgc3RydWN0IG5mc2QzX2F0dHJzdGF0ICAqcmVzcCkKK3sKKwlpbnQJbmZzZXJyOworCisJZHByaW50aygibmZzZDogUk1ESVIoMykgICAgJXMgJS4qc1xuIiwKKwkJCQlTVkNGSF9mbXQoJmFyZ3AtPmZoKSwKKwkJCQlhcmdwLT5sZW4sCisJCQkJYXJncC0+bmFtZSk7CisKKwlmaF9jb3B5KCZyZXNwLT5maCwgJmFyZ3AtPmZoKTsKKwluZnNlcnIgPSBuZnNkX3VubGluayhycXN0cCwgJnJlc3AtPmZoLCBTX0lGRElSLCBhcmdwLT5uYW1lLCBhcmdwLT5sZW4pOworCVJFVFVSTl9TVEFUVVMobmZzZXJyKTsKK30KKworc3RhdGljIGludAorbmZzZDNfcHJvY19yZW5hbWUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2QzX3JlbmFtZWFyZ3MgKmFyZ3AsCisJCQkJCSAgc3RydWN0IG5mc2QzX3JlbmFtZXJlcyAgKnJlc3ApCit7CisJaW50CW5mc2VycjsKKworCWRwcmludGsoIm5mc2Q6IFJFTkFNRSgzKSAgICVzICUuKnMgLT5cbiIsCisJCQkJU1ZDRkhfZm10KCZhcmdwLT5mZmgpLAorCQkJCWFyZ3AtPmZsZW4sCisJCQkJYXJncC0+Zm5hbWUpOworCWRwcmludGsoIm5mc2Q6IC0+ICVzICUuKnNcbiIsCisJCQkJU1ZDRkhfZm10KCZhcmdwLT50ZmgpLAorCQkJCWFyZ3AtPnRsZW4sCisJCQkJYXJncC0+dG5hbWUpOworCisJZmhfY29weSgmcmVzcC0+ZmZoLCAmYXJncC0+ZmZoKTsKKwlmaF9jb3B5KCZyZXNwLT50ZmgsICZhcmdwLT50ZmgpOworCW5mc2VyciA9IG5mc2RfcmVuYW1lKHJxc3RwLCAmcmVzcC0+ZmZoLCBhcmdwLT5mbmFtZSwgYXJncC0+ZmxlbiwKKwkJCQkgICAgJnJlc3AtPnRmaCwgYXJncC0+dG5hbWUsIGFyZ3AtPnRsZW4pOworCVJFVFVSTl9TVEFUVVMobmZzZXJyKTsKK30KKworc3RhdGljIGludAorbmZzZDNfcHJvY19saW5rKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkM19saW5rYXJncyAqYXJncCwKKwkJCQkJc3RydWN0IG5mc2QzX2xpbmtyZXMgICpyZXNwKQoreworCWludAluZnNlcnI7CisKKwlkcHJpbnRrKCJuZnNkOiBMSU5LKDMpICAgICAlcyAtPlxuIiwKKwkJCQlTVkNGSF9mbXQoJmFyZ3AtPmZmaCkpOworCWRwcmludGsoIm5mc2Q6ICAgLT4gJXMgJS4qc1xuIiwKKwkJCQlTVkNGSF9mbXQoJmFyZ3AtPnRmaCksCisJCQkJYXJncC0+dGxlbiwKKwkJCQlhcmdwLT50bmFtZSk7CisKKwlmaF9jb3B5KCZyZXNwLT5maCwgICZhcmdwLT5mZmgpOworCWZoX2NvcHkoJnJlc3AtPnRmaCwgJmFyZ3AtPnRmaCk7CisJbmZzZXJyID0gbmZzZF9saW5rKHJxc3RwLCAmcmVzcC0+dGZoLCBhcmdwLT50bmFtZSwgYXJncC0+dGxlbiwKKwkJCQkgICZyZXNwLT5maCk7CisJUkVUVVJOX1NUQVRVUyhuZnNlcnIpOworfQorCisvKgorICogUmVhZCBhIHBvcnRpb24gb2YgYSBkaXJlY3RvcnkuCisgKi8KK3N0YXRpYyBpbnQKK25mc2QzX3Byb2NfcmVhZGRpcihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZDNfcmVhZGRpcmFyZ3MgKmFyZ3AsCisJCQkJCSAgIHN0cnVjdCBuZnNkM19yZWFkZGlycmVzICAqcmVzcCkKK3sKKwlpbnQJCW5mc2VyciwgY291bnQ7CisKKwlkcHJpbnRrKCJuZnNkOiBSRUFERElSKDMpICAlcyAlZCBieXRlcyBhdCAlZFxuIiwKKwkJCQlTVkNGSF9mbXQoJmFyZ3AtPmZoKSwKKwkJCQlhcmdwLT5jb3VudCwgKHUzMikgYXJncC0+Y29va2llKTsKKworCS8qIE1ha2Ugc3VyZSB3ZSd2ZSByb29tIGZvciB0aGUgTlVMTCBwdHIgJiBlb2YgZmxhZywgYW5kIHNocmluayB0bworCSAqIGNsaWVudCByZWFkIHNpemUgKi8KKwljb3VudCA9IChhcmdwLT5jb3VudCA+PiAyKSAtIDI7CisKKwkvKiBSZWFkIGRpcmVjdG9yeSBhbmQgZW5jb2RlIGVudHJpZXMgb24gdGhlIGZseSAqLworCWZoX2NvcHkoJnJlc3AtPmZoLCAmYXJncC0+ZmgpOworCisJcmVzcC0+YnVmbGVuID0gY291bnQ7CisJcmVzcC0+Y29tbW9uLmVyciA9IG5mc19vazsKKwlyZXNwLT5idWZmZXIgPSBhcmdwLT5idWZmZXI7CisJcmVzcC0+cnFzdHAgPSBycXN0cDsKKwluZnNlcnIgPSBuZnNkX3JlYWRkaXIocnFzdHAsICZyZXNwLT5maCwgKGxvZmZfdCopICZhcmdwLT5jb29raWUsIAorCQkJCQkmcmVzcC0+Y29tbW9uLCBuZnMzc3ZjX2VuY29kZV9lbnRyeSk7CisJbWVtY3B5KHJlc3AtPnZlcmYsIGFyZ3AtPnZlcmYsIDgpOworCXJlc3AtPmNvdW50ID0gcmVzcC0+YnVmZmVyIC0gYXJncC0+YnVmZmVyOworCWlmIChyZXNwLT5vZmZzZXQpCisJCXhkcl9lbmNvZGVfaHlwZXIocmVzcC0+b2Zmc2V0LCBhcmdwLT5jb29raWUpOworCisJUkVUVVJOX1NUQVRVUyhuZnNlcnIpOworfQorCisvKgorICogUmVhZCBhIHBvcnRpb24gb2YgYSBkaXJlY3RvcnksIGluY2x1ZGluZyBmaWxlIGhhbmRsZXMgYW5kIGF0dHJzLgorICogRm9yIG5vdywgd2UgY2hvb3NlIHRvIGlnbm9yZSB0aGUgZGlyY291bnQgcGFyYW1ldGVyLgorICovCitzdGF0aWMgaW50CituZnNkM19wcm9jX3JlYWRkaXJwbHVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkM19yZWFkZGlyYXJncyAqYXJncCwKKwkJCQkJICAgICAgIHN0cnVjdCBuZnNkM19yZWFkZGlycmVzICAqcmVzcCkKK3sKKwlpbnQJbmZzZXJyLCBjb3VudCA9IDA7CisJbG9mZl90CW9mZnNldDsKKwlpbnQJaTsKKwljYWRkcl90CXBhZ2VfYWRkciA9IE5VTEw7CisKKwlkcHJpbnRrKCJuZnNkOiBSRUFERElSKygzKSAlcyAlZCBieXRlcyBhdCAlZFxuIiwKKwkJCQlTVkNGSF9mbXQoJmFyZ3AtPmZoKSwKKwkJCQlhcmdwLT5jb3VudCwgKHUzMikgYXJncC0+Y29va2llKTsKKworCS8qIENvbnZlcnQgYnl0ZSBjb3VudCB0byBudW1iZXIgb2Ygd29yZHMgKGkuZS4gPj4gMiksCisJICogYW5kIHJlc2VydmUgcm9vbSBmb3IgdGhlIE5VTEwgcHRyICYgZW9mIGZsYWcgKC0yIHdvcmRzKSAqLworCXJlc3AtPmNvdW50ID0gKGFyZ3AtPmNvdW50ID4+IDIpIC0gMjsKKworCS8qIFJlYWQgZGlyZWN0b3J5IGFuZCBlbmNvZGUgZW50cmllcyBvbiB0aGUgZmx5ICovCisJZmhfY29weSgmcmVzcC0+ZmgsICZhcmdwLT5maCk7CisKKwlyZXNwLT5jb21tb24uZXJyID0gbmZzX29rOworCXJlc3AtPmJ1ZmZlciA9IGFyZ3AtPmJ1ZmZlcjsKKwlyZXNwLT5idWZsZW4gPSByZXNwLT5jb3VudDsKKwlyZXNwLT5ycXN0cCA9IHJxc3RwOworCW9mZnNldCA9IGFyZ3AtPmNvb2tpZTsKKwluZnNlcnIgPSBuZnNkX3JlYWRkaXIocnFzdHAsICZyZXNwLT5maCwKKwkJCQkgICAgICZvZmZzZXQsCisJCQkJICAgICAmcmVzcC0+Y29tbW9uLAorCQkJCSAgICAgbmZzM3N2Y19lbmNvZGVfZW50cnlfcGx1cyk7CisJbWVtY3B5KHJlc3AtPnZlcmYsIGFyZ3AtPnZlcmYsIDgpOworCWZvciAoaT0xOyBpPHJxc3RwLT5ycV9yZXN1c2VkIDsgaSsrKSB7CisJCXBhZ2VfYWRkciA9IHBhZ2VfYWRkcmVzcyhycXN0cC0+cnFfcmVzcGFnZXNbaV0pOworCisJCWlmICgoKGNhZGRyX3QpcmVzcC0+YnVmZmVyID49IHBhZ2VfYWRkcikgJiYKKwkJICAgICgoY2FkZHJfdClyZXNwLT5idWZmZXIgPCBwYWdlX2FkZHIgKyBQQUdFX1NJWkUpKSB7CisJCQljb3VudCArPSAoY2FkZHJfdClyZXNwLT5idWZmZXIgLSBwYWdlX2FkZHI7CisJCQlicmVhazsKKwkJfQorCQljb3VudCArPSBQQUdFX1NJWkU7CisJfQorCXJlc3AtPmNvdW50ID0gY291bnQgPj4gMjsKKwlpZiAocmVzcC0+b2Zmc2V0KSB7CisJCWlmICh1bmxpa2VseShyZXNwLT5vZmZzZXQxKSkgeworCQkJLyogd2UgZW5kZWQgdXAgd2l0aCBvZmZzZXQgb24gYSBwYWdlIGJvdW5kYXJ5ICovCisJCQkqcmVzcC0+b2Zmc2V0ID0gaHRvbmwob2Zmc2V0ID4+IDMyKTsKKwkJCSpyZXNwLT5vZmZzZXQxID0gaHRvbmwob2Zmc2V0ICYgMHhmZmZmZmZmZik7CisJCQlyZXNwLT5vZmZzZXQxID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCXhkcl9lbmNvZGVfaHlwZXIocmVzcC0+b2Zmc2V0LCBvZmZzZXQpOworCQl9CisJfQorCisJUkVUVVJOX1NUQVRVUyhuZnNlcnIpOworfQorCisvKgorICogR2V0IGZpbGUgc3lzdGVtIHN0YXRzCisgKi8KK3N0YXRpYyBpbnQKK25mc2QzX3Byb2NfZnNzdGF0KHN0cnVjdCBzdmNfcnFzdCAqIHJxc3RwLCBzdHJ1Y3QgbmZzZF9maGFuZGxlICAgICphcmdwLAorCQkJCQkgICBzdHJ1Y3QgbmZzZDNfZnNzdGF0cmVzICpyZXNwKQoreworCWludAluZnNlcnI7CisKKwlkcHJpbnRrKCJuZnNkOiBGU1NUQVQoMykgICAlc1xuIiwKKwkJCQlTVkNGSF9mbXQoJmFyZ3AtPmZoKSk7CisKKwluZnNlcnIgPSBuZnNkX3N0YXRmcyhycXN0cCwgJmFyZ3AtPmZoLCAmcmVzcC0+c3RhdHMpOworCWZoX3B1dCgmYXJncC0+ZmgpOworCVJFVFVSTl9TVEFUVVMobmZzZXJyKTsKK30KKworLyoKKyAqIEdldCBmaWxlIHN5c3RlbSBpbmZvCisgKi8KK3N0YXRpYyBpbnQKK25mc2QzX3Byb2NfZnNpbmZvKHN0cnVjdCBzdmNfcnFzdCAqIHJxc3RwLCBzdHJ1Y3QgbmZzZF9maGFuZGxlICAgICphcmdwLAorCQkJCQkgICBzdHJ1Y3QgbmZzZDNfZnNpbmZvcmVzICpyZXNwKQoreworCWludAluZnNlcnI7CisKKwlkcHJpbnRrKCJuZnNkOiBGU0lORk8oMykgICAlc1xuIiwKKwkJCQlTVkNGSF9mbXQoJmFyZ3AtPmZoKSk7CisKKwlyZXNwLT5mX3J0bWF4ICA9IE5GU1NWQ19NQVhCTEtTSVpFOworCXJlc3AtPmZfcnRwcmVmID0gTkZTU1ZDX01BWEJMS1NJWkU7CisJcmVzcC0+Zl9ydG11bHQgPSBQQUdFX1NJWkU7CisJcmVzcC0+Zl93dG1heCAgPSBORlNTVkNfTUFYQkxLU0laRTsKKwlyZXNwLT5mX3d0cHJlZiA9IE5GU1NWQ19NQVhCTEtTSVpFOworCXJlc3AtPmZfd3RtdWx0ID0gUEFHRV9TSVpFOworCXJlc3AtPmZfZHRwcmVmID0gUEFHRV9TSVpFOworCXJlc3AtPmZfbWF4ZmlsZXNpemUgPSB+KHUzMikgMDsKKwlyZXNwLT5mX3Byb3BlcnRpZXMgPSBORlMzX0ZTRl9ERUZBVUxUOworCisJbmZzZXJyID0gZmhfdmVyaWZ5KHJxc3RwLCAmYXJncC0+ZmgsIDAsIE1BWV9OT1ApOworCisJLyogQ2hlY2sgc3BlY2lhbCBmZWF0dXJlcyBvZiB0aGUgZmlsZSBzeXN0ZW0uIE1heSByZXF1ZXN0CisJICogZGlmZmVyZW50IHJlYWQvd3JpdGUgc2l6ZXMgZm9yIGZpbGUgc3lzdGVtcyBrbm93biB0byBoYXZlCisJICogcHJvYmxlbXMgd2l0aCBsYXJnZSBibG9ja3MgKi8KKwlpZiAobmZzZXJyID09IDApIHsKKwkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGFyZ3AtPmZoLmZoX2RlbnRyeS0+ZF9pbm9kZS0+aV9zYjsKKworCQkvKiBOb3RlIHRoYXQgd2UgZG9uJ3QgY2FyZSBmb3IgcmVtb3RlIGZzJ3MgaGVyZSAqLworCQlpZiAoc2ItPnNfbWFnaWMgPT0gMHg0ZDQ0IC8qIE1TRE9TX1NVUEVSX01BR0lDICovKSB7CisJCQlyZXNwLT5mX3Byb3BlcnRpZXMgPSBORlMzX0ZTRl9CSUxMWUJPWTsKKwkJfQorCQlyZXNwLT5mX21heGZpbGVzaXplID0gc2ItPnNfbWF4Ynl0ZXM7CisJfQorCisJZmhfcHV0KCZhcmdwLT5maCk7CisJUkVUVVJOX1NUQVRVUyhuZnNlcnIpOworfQorCisvKgorICogR2V0IHBhdGhjb25mIGluZm8gZm9yIHRoZSBzcGVjaWZpZWQgZmlsZQorICovCitzdGF0aWMgaW50CituZnNkM19wcm9jX3BhdGhjb25mKHN0cnVjdCBzdmNfcnFzdCAqIHJxc3RwLCBzdHJ1Y3QgbmZzZF9maGFuZGxlICAgICAgKmFyZ3AsCisJCQkJCSAgICAgc3RydWN0IG5mc2QzX3BhdGhjb25mcmVzICpyZXNwKQoreworCWludAluZnNlcnI7CisKKwlkcHJpbnRrKCJuZnNkOiBQQVRIQ09ORigzKSAlc1xuIiwKKwkJCQlTVkNGSF9mbXQoJmFyZ3AtPmZoKSk7CisKKwkvKiBTZXQgZGVmYXVsdCBwYXRoY29uZiAqLworCXJlc3AtPnBfbGlua19tYXggPSAyNTU7CQkvKiBhdCBsZWFzdCAqLworCXJlc3AtPnBfbmFtZV9tYXggPSAyNTU7CQkvKiBhdCBsZWFzdCAqLworCXJlc3AtPnBfbm9fdHJ1bmMgPSAwOworCXJlc3AtPnBfY2hvd25fcmVzdHJpY3RlZCA9IDE7CisJcmVzcC0+cF9jYXNlX2luc2Vuc2l0aXZlID0gMDsKKwlyZXNwLT5wX2Nhc2VfcHJlc2VydmluZyA9IDE7CisKKwluZnNlcnIgPSBmaF92ZXJpZnkocnFzdHAsICZhcmdwLT5maCwgMCwgTUFZX05PUCk7CisKKwlpZiAobmZzZXJyID09IDApIHsKKwkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGFyZ3AtPmZoLmZoX2RlbnRyeS0+ZF9pbm9kZS0+aV9zYjsKKworCQkvKiBOb3RlIHRoYXQgd2UgZG9uJ3QgY2FyZSBmb3IgcmVtb3RlIGZzJ3MgaGVyZSAqLworCQlzd2l0Y2ggKHNiLT5zX21hZ2ljKSB7CisJCWNhc2UgRVhUMl9TVVBFUl9NQUdJQzoKKwkJCXJlc3AtPnBfbGlua19tYXggPSBFWFQyX0xJTktfTUFYOworCQkJcmVzcC0+cF9uYW1lX21heCA9IEVYVDJfTkFNRV9MRU47CisJCQlicmVhazsKKwkJY2FzZSAweDRkNDQ6CS8qIE1TRE9TX1NVUEVSX01BR0lDICovCisJCQlyZXNwLT5wX2Nhc2VfaW5zZW5zaXRpdmUgPSAxOworCQkJcmVzcC0+cF9jYXNlX3ByZXNlcnZpbmcgID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJZmhfcHV0KCZhcmdwLT5maCk7CisJUkVUVVJOX1NUQVRVUyhuZnNlcnIpOworfQorCisKKy8qCisgKiBDb21taXQgYSBmaWxlIChyYW5nZSkgdG8gc3RhYmxlIHN0b3JhZ2UuCisgKi8KK3N0YXRpYyBpbnQKK25mc2QzX3Byb2NfY29tbWl0KHN0cnVjdCBzdmNfcnFzdCAqIHJxc3RwLCBzdHJ1Y3QgbmZzZDNfY29tbWl0YXJncyAqYXJncCwKKwkJCQkJICAgc3RydWN0IG5mc2QzX2NvbW1pdHJlcyAgKnJlc3ApCit7CisJaW50CW5mc2VycjsKKworCWRwcmludGsoIm5mc2Q6IENPTU1JVCgzKSAgICVzICV1QCVMdVxuIiwKKwkJCQlTVkNGSF9mbXQoJmFyZ3AtPmZoKSwKKwkJCQlhcmdwLT5jb3VudCwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKSBhcmdwLT5vZmZzZXQpOworCisJaWYgKGFyZ3AtPm9mZnNldCA+IE5GU19PRkZTRVRfTUFYKQorCQlSRVRVUk5fU1RBVFVTKG5mc2Vycl9pbnZhbCk7CisKKwlmaF9jb3B5KCZyZXNwLT5maCwgJmFyZ3AtPmZoKTsKKwluZnNlcnIgPSBuZnNkX2NvbW1pdChycXN0cCwgJnJlc3AtPmZoLCBhcmdwLT5vZmZzZXQsIGFyZ3AtPmNvdW50KTsKKworCVJFVFVSTl9TVEFUVVMobmZzZXJyKTsKK30KKworCisvKgorICogTkZTdjMgU2VydmVyIHByb2NlZHVyZXMuCisgKiBPbmx5IHRoZSByZXN1bHRzIG9mIG5vbi1pZGVtcG90ZW50IG9wZXJhdGlvbnMgYXJlIGNhY2hlZC4KKyAqLworI2RlZmluZSBuZnMzc3ZjX2RlY29kZV92b2lkYXJncwkJTlVMTAorI2RlZmluZSBuZnMzc3ZjX3JlbGVhc2Vfdm9pZAkJTlVMTAorI2RlZmluZSBuZnMzc3ZjX2RlY29kZV9maGFuZGxlYXJncwluZnMzc3ZjX2RlY29kZV9maGFuZGxlCisjZGVmaW5lIG5mczNzdmNfZW5jb2RlX2F0dHJzdGF0cmVzCW5mczNzdmNfZW5jb2RlX2F0dHJzdGF0CisjZGVmaW5lIG5mczNzdmNfZW5jb2RlX3djY3N0YXRyZXMJbmZzM3N2Y19lbmNvZGVfd2Njc3RhdAorI2RlZmluZSBuZnNkM19ta2RpcmFyZ3MJCQluZnNkM19jcmVhdGVhcmdzCisjZGVmaW5lIG5mc2QzX3JlYWRkaXJwbHVzYXJncwkJbmZzZDNfcmVhZGRpcmFyZ3MKKyNkZWZpbmUgbmZzZDNfZmhhbmRsZWFyZ3MJCW5mc2RfZmhhbmRsZQorI2RlZmluZSBuZnNkM19maGFuZGxlcmVzCQluZnNkM19hdHRyc3RhdAorI2RlZmluZSBuZnNkM19hdHRyc3RhdHJlcwkJbmZzZDNfYXR0cnN0YXQKKyNkZWZpbmUgbmZzZDNfd2Njc3RhdHJlcwkJbmZzZDNfYXR0cnN0YXQKKyNkZWZpbmUgbmZzZDNfY3JlYXRlcmVzCQkJbmZzZDNfZGlyb3ByZXMKKyNkZWZpbmUgbmZzZDNfdm9pZHJlcwkJCW5mc2QzX3ZvaWRhcmdzCitzdHJ1Y3QgbmZzZDNfdm9pZGFyZ3MgeyBpbnQgZHVtbXk7IH07CisKKyNkZWZpbmUgUFJPQyhuYW1lLCBhcmd0LCByZXN0LCByZWx0LCBjYWNoZSwgcmVzcHNpemUpCVwKKyB7IChzdmNfcHJvY2Z1bmMpIG5mc2QzX3Byb2NfIyNuYW1lLAkJXAorICAgKGt4ZHJwcm9jX3QpIG5mczNzdmNfZGVjb2RlXyMjYXJndCMjYXJncywJXAorICAgKGt4ZHJwcm9jX3QpIG5mczNzdmNfZW5jb2RlXyMjcmVzdCMjcmVzLAlcCisgICAoa3hkcnByb2NfdCkgbmZzM3N2Y19yZWxlYXNlXyMjcmVsdCwJCVwKKyAgIHNpemVvZihzdHJ1Y3QgbmZzZDNfIyNhcmd0IyNhcmdzKSwJCVwKKyAgIHNpemVvZihzdHJ1Y3QgbmZzZDNfIyNyZXN0IyNyZXMpLAkJXAorICAgMCwJCQkJCQlcCisgICBjYWNoZSwJCQkJCVwKKyAgIHJlc3BzaXplLAkJCQkJXAorIH0KKworI2RlZmluZSBTVCAxCQkvKiBzdGF0dXMqLworI2RlZmluZSBGSCAxNwkJLyogZmlsZWhhbmRsZSB3aXRoIGxlbmd0aCAqLworI2RlZmluZSBBVCAyMQkJLyogYXR0cmlidXRlcyAqLworI2RlZmluZSBwQVQgKDErQVQpCS8qIHBvc3QgYXR0cmlidXRlcyAtIGNvbmRpdGlvbmFsICovCisjZGVmaW5lIFdDICg3K3BBVCkJLyogV0NDIGF0dHJpYnV0ZXMgKi8KKworc3RhdGljIHN0cnVjdCBzdmNfcHJvY2VkdXJlCQluZnNkX3Byb2NlZHVyZXMzWzIyXSA9IHsKKyAgUFJPQyhudWxsLAkgdm9pZCwJCXZvaWQsCQl2b2lkLAkgIFJDX05PQ0FDSEUsIFNUKSwKKyAgUFJPQyhnZXRhdHRyLAkgZmhhbmRsZSwJYXR0cnN0YXQsCWZoYW5kbGUsICBSQ19OT0NBQ0hFLCBTVCtBVCksCisgIFBST0Moc2V0YXR0ciwgIHNhdHRyLAkJd2Njc3RhdCwJZmhhbmRsZSwgIFJDX1JFUExCVUZGLCBTVCtXQyksCisgIFBST0MobG9va3VwLAkgZGlyb3AsCQlkaXJvcCwJCWZoYW5kbGUyLCBSQ19OT0NBQ0hFLCBTVCtGSCtwQVQrcEFUKSwKKyAgUFJPQyhhY2Nlc3MsCSBhY2Nlc3MsCWFjY2VzcywJCWZoYW5kbGUsICBSQ19OT0NBQ0hFLCBTVCtwQVQrMSksCisgIFBST0MocmVhZGxpbmssIHJlYWRsaW5rLAlyZWFkbGluaywJZmhhbmRsZSwgIFJDX05PQ0FDSEUsIFNUK3BBVCsxK05GUzNfTUFYUEFUSExFTi80KSwKKyAgUFJPQyhyZWFkLAkgcmVhZCwJCXJlYWQsCQlmaGFuZGxlLCAgUkNfTk9DQUNIRSwgU1QrcEFUKzQrTkZTU1ZDX01BWEJMS1NJWkUpLAorICBQUk9DKHdyaXRlLAkgd3JpdGUsCQl3cml0ZSwJCWZoYW5kbGUsICBSQ19SRVBMQlVGRiwgU1QrV0MrNCksCisgIFBST0MoY3JlYXRlLAkgY3JlYXRlLAljcmVhdGUsCQlmaGFuZGxlMiwgUkNfUkVQTEJVRkYsIFNUKygxK0ZIK3BBVCkrV0MpLAorICBQUk9DKG1rZGlyLAkgbWtkaXIsCQljcmVhdGUsCQlmaGFuZGxlMiwgUkNfUkVQTEJVRkYsIFNUKygxK0ZIK3BBVCkrV0MpLAorICBQUk9DKHN5bWxpbmssCSBzeW1saW5rLAljcmVhdGUsCQlmaGFuZGxlMiwgUkNfUkVQTEJVRkYsIFNUKygxK0ZIK3BBVCkrV0MpLAorICBQUk9DKG1rbm9kLAkgbWtub2QsCQljcmVhdGUsCQlmaGFuZGxlMiwgUkNfUkVQTEJVRkYsIFNUKygxK0ZIK3BBVCkrV0MpLAorICBQUk9DKHJlbW92ZSwJIGRpcm9wLAkJd2Njc3RhdCwJZmhhbmRsZSwgIFJDX1JFUExCVUZGLCBTVCtXQyksCisgIFBST0Mocm1kaXIsCSBkaXJvcCwJCXdjY3N0YXQsCWZoYW5kbGUsICBSQ19SRVBMQlVGRiwgU1QrV0MpLAorICBQUk9DKHJlbmFtZSwJIHJlbmFtZSwJcmVuYW1lLAkJZmhhbmRsZTIsIFJDX1JFUExCVUZGLCBTVCtXQytXQyksCisgIFBST0MobGluaywJIGxpbmssCQlsaW5rLAkJZmhhbmRsZTIsIFJDX1JFUExCVUZGLCBTVCtwQVQrV0MpLAorICBQUk9DKHJlYWRkaXIsCSByZWFkZGlyLAlyZWFkZGlyLAlmaGFuZGxlLCAgUkNfTk9DQUNIRSwgMCksCisgIFBST0MocmVhZGRpcnBsdXMscmVhZGRpcnBsdXMsCXJlYWRkaXIsCWZoYW5kbGUsICBSQ19OT0NBQ0hFLCAwKSwKKyAgUFJPQyhmc3N0YXQsCSBmaGFuZGxlLAlmc3N0YXQsCQl2b2lkLCAgICAgUkNfTk9DQUNIRSwgU1QrcEFUKzIqNisxKSwKKyAgUFJPQyhmc2luZm8sICAgZmhhbmRsZSwJZnNpbmZvLAkJdm9pZCwgICAgIFJDX05PQ0FDSEUsIFNUK3BBVCsxMiksCisgIFBST0MocGF0aGNvbmYsIGZoYW5kbGUsCXBhdGhjb25mLAl2b2lkLCAgICAgUkNfTk9DQUNIRSwgU1QrcEFUKzYpLAorICBQUk9DKGNvbW1pdCwJIGNvbW1pdCwJY29tbWl0LAkJZmhhbmRsZSwgIFJDX05PQ0FDSEUsIFNUK1dDKzIpLAorfTsKKworc3RydWN0IHN2Y192ZXJzaW9uCW5mc2RfdmVyc2lvbjMgPSB7CisJCS52c192ZXJzCT0gMywKKwkJLnZzX25wcm9jCT0gMjIsCisJCS52c19wcm9jCT0gbmZzZF9wcm9jZWR1cmVzMywKKwkJLnZzX2Rpc3BhdGNoCT0gbmZzZF9kaXNwYXRjaCwKKwkJLnZzX3hkcnNpemUJPSBORlMzX1NWQ19YRFJTSVpFLAorfTsKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzM3hkci5jIGIvZnMvbmZzZC9uZnMzeGRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFmODA2OAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25mc2QvbmZzM3hkci5jCkBAIC0wLDAgKzEsMTA5MiBAQAorLyoKKyAqIGxpbnV4L2ZzL25mc2QvbmZzM3hkci5jCisgKgorICogWERSIHN1cHBvcnQgZm9yIG5mc2QvcHJvdG9jb2wgdmVyc2lvbiAzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4KKyAqCisgKiAyMDAzLTA4LTA5IEphbWllIExva2llcjogVXNlIGh0b25sKCkgZm9yIG5hbm9zZWNvbmRzLCBub3QgaHRvbnMoKSEKKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvbmZzMy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RjYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMveGRyLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Yy5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2QvbmZzZC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2QveGRyMy5oPgorCisjZGVmaW5lIE5GU0REQkdfRkFDSUxJVFkJCU5GU0REQkdfWERSCisKKyNpZmRlZiBORlNEX09QVElNSVpFX1NQQUNFCisjIGRlZmluZSBpbmxpbmUKKyNlbmRpZgorCisKKy8qCisgKiBNYXBwaW5nIG9mIFNfSUYqIHR5cGVzIHRvIE5GUyBmaWxlIHR5cGVzCisgKi8KK3N0YXRpYyB1MzIJbmZzM19mdHlwZXNbXSA9IHsKKwlORjNOT04sICBORjNGSUZPLCBORjNDSFIsIE5GM0JBRCwKKwlORjNESVIsICBORjNCQUQsICBORjNCTEssIE5GM0JBRCwKKwlORjNSRUcsICBORjNCQUQsICBORjNMTkssIE5GM0JBRCwKKwlORjNTT0NLLCBORjNCQUQsICBORjNMTkssIE5GM0JBRCwKK307CisKKy8qCisgKiBYRFIgZnVuY3Rpb25zIGZvciBiYXNpYyBORlMgdHlwZXMKKyAqLworc3RhdGljIGlubGluZSB1MzIgKgorZW5jb2RlX3RpbWUzKHUzMiAqcCwgc3RydWN0IHRpbWVzcGVjICp0aW1lKQoreworCSpwKysgPSBodG9ubCgodTMyKSB0aW1lLT50dl9zZWMpOyAqcCsrID0gaHRvbmwodGltZS0+dHZfbnNlYyk7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyICoKK2RlY29kZV90aW1lMyh1MzIgKnAsIHN0cnVjdCB0aW1lc3BlYyAqdGltZSkKK3sKKwl0aW1lLT50dl9zZWMgPSBudG9obCgqcCsrKTsKKwl0aW1lLT50dl9uc2VjID0gbnRvaGwoKnArKyk7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyICoKK2RlY29kZV9maCh1MzIgKnAsIHN0cnVjdCBzdmNfZmggKmZocCkKK3sKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwlmaF9pbml0KGZocCwgTkZTM19GSFNJWkUpOworCXNpemUgPSBudG9obCgqcCsrKTsKKwlpZiAoc2l6ZSA+IE5GUzNfRkhTSVpFKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbWNweSgmZmhwLT5maF9oYW5kbGUuZmhfYmFzZSwgcCwgc2l6ZSk7CisJZmhwLT5maF9oYW5kbGUuZmhfc2l6ZSA9IHNpemU7CisJcmV0dXJuIHAgKyBYRFJfUVVBRExFTihzaXplKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgKgorZW5jb2RlX2ZoKHUzMiAqcCwgc3RydWN0IHN2Y19maCAqZmhwKQoreworCXVuc2lnbmVkIGludCBzaXplID0gZmhwLT5maF9oYW5kbGUuZmhfc2l6ZTsKKwkqcCsrID0gaHRvbmwoc2l6ZSk7CisJaWYgKHNpemUpIHBbWERSX1FVQURMRU4oc2l6ZSktMV09MDsKKwltZW1jcHkocCwgJmZocC0+ZmhfaGFuZGxlLmZoX2Jhc2UsIHNpemUpOworCXJldHVybiBwICsgWERSX1FVQURMRU4oc2l6ZSk7Cit9CisKKy8qCisgKiBEZWNvZGUgYSBmaWxlIG5hbWUgYW5kIG1ha2Ugc3VyZSB0aGF0IHRoZSBwYXRoIGNvbnRhaW5zCisgKiBubyBzbGFzaGVzIG9yIG51bGwgYnl0ZXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyICoKK2RlY29kZV9maWxlbmFtZSh1MzIgKnAsIGNoYXIgKipuYW1wLCBpbnQgKmxlbnApCit7CisJY2hhcgkJKm5hbWU7CisJaW50CQlpOworCisJaWYgKChwID0geGRyX2RlY29kZV9zdHJpbmdfaW5wbGFjZShwLCBuYW1wLCBsZW5wLCBORlMzX01BWE5BTUxFTikpICE9IE5VTEwpIHsKKwkJZm9yIChpID0gMCwgbmFtZSA9ICpuYW1wOyBpIDwgKmxlbnA7IGkrKywgbmFtZSsrKSB7CisJCQlpZiAoKm5hbWUgPT0gJ1wwJyB8fCAqbmFtZSA9PSAnLycpCisJCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIGlubGluZSB1MzIgKgorZGVjb2RlX3NhdHRyMyh1MzIgKnAsIHN0cnVjdCBpYXR0ciAqaWFwKQoreworCXUzMgl0bXA7CisKKwlpYXAtPmlhX3ZhbGlkID0gMDsKKworCWlmICgqcCsrKSB7CisJCWlhcC0+aWFfdmFsaWQgfD0gQVRUUl9NT0RFOworCQlpYXAtPmlhX21vZGUgPSBudG9obCgqcCsrKTsKKwl9CisJaWYgKCpwKyspIHsKKwkJaWFwLT5pYV92YWxpZCB8PSBBVFRSX1VJRDsKKwkJaWFwLT5pYV91aWQgPSBudG9obCgqcCsrKTsKKwl9CisJaWYgKCpwKyspIHsKKwkJaWFwLT5pYV92YWxpZCB8PSBBVFRSX0dJRDsKKwkJaWFwLT5pYV9naWQgPSBudG9obCgqcCsrKTsKKwl9CisJaWYgKCpwKyspIHsKKwkJdTY0CW5ld3NpemU7CisKKwkJaWFwLT5pYV92YWxpZCB8PSBBVFRSX1NJWkU7CisJCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZuZXdzaXplKTsKKwkJaWYgKG5ld3NpemUgPD0gTkZTX09GRlNFVF9NQVgpCisJCQlpYXAtPmlhX3NpemUgPSBuZXdzaXplOworCQllbHNlCisJCQlpYXAtPmlhX3NpemUgPSBORlNfT0ZGU0VUX01BWDsKKwl9CisJaWYgKCh0bXAgPSBudG9obCgqcCsrKSkgPT0gMSkgewkvKiBzZXQgdG8gc2VydmVyIHRpbWUgKi8KKwkJaWFwLT5pYV92YWxpZCB8PSBBVFRSX0FUSU1FOworCX0gZWxzZSBpZiAodG1wID09IDIpIHsJCS8qIHNldCB0byBjbGllbnQgdGltZSAqLworCQlpYXAtPmlhX3ZhbGlkIHw9IEFUVFJfQVRJTUUgfCBBVFRSX0FUSU1FX1NFVDsKKwkJaWFwLT5pYV9hdGltZS50dl9zZWMgPSBudG9obCgqcCsrKTsKKwkJaWFwLT5pYV9hdGltZS50dl9uc2VjID0gbnRvaGwoKnArKyk7CisJfQorCWlmICgodG1wID0gbnRvaGwoKnArKykpID09IDEpIHsJLyogc2V0IHRvIHNlcnZlciB0aW1lICovCisJCWlhcC0+aWFfdmFsaWQgfD0gQVRUUl9NVElNRTsKKwl9IGVsc2UgaWYgKHRtcCA9PSAyKSB7CQkvKiBzZXQgdG8gY2xpZW50IHRpbWUgKi8KKwkJaWFwLT5pYV92YWxpZCB8PSBBVFRSX01USU1FIHwgQVRUUl9NVElNRV9TRVQ7CisJCWlhcC0+aWFfbXRpbWUudHZfc2VjID0gbnRvaGwoKnArKyk7CisJCWlhcC0+aWFfbXRpbWUudHZfbnNlYyA9IG50b2hsKCpwKyspOworCX0KKwlyZXR1cm4gcDsKK30KKworc3RhdGljIGlubGluZSB1MzIgKgorZW5jb2RlX2ZhdHRyMyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBzdmNfZmggKmZocCkKK3sKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IGZocC0+ZmhfZXhwb3J0LT5leF9tbnQ7CisJc3RydWN0IGRlbnRyeQkqZGVudHJ5ID0gZmhwLT5maF9kZW50cnk7CisJc3RydWN0IGtzdGF0IHN0YXQ7CisJc3RydWN0IHRpbWVzcGVjIHRpbWU7CisKKwl2ZnNfZ2V0YXR0cihtbnQsIGRlbnRyeSwgJnN0YXQpOworCisJKnArKyA9IGh0b25sKG5mczNfZnR5cGVzWyhzdGF0Lm1vZGUgJiBTX0lGTVQpID4+IDEyXSk7CisJKnArKyA9IGh0b25sKCh1MzIpIHN0YXQubW9kZSk7CisJKnArKyA9IGh0b25sKCh1MzIpIHN0YXQubmxpbmspOworCSpwKysgPSBodG9ubCgodTMyKSBuZnNkX3J1aWQocnFzdHAsIHN0YXQudWlkKSk7CisJKnArKyA9IGh0b25sKCh1MzIpIG5mc2RfcmdpZChycXN0cCwgc3RhdC5naWQpKTsKKwlpZiAoU19JU0xOSyhzdGF0Lm1vZGUpICYmIHN0YXQuc2l6ZSA+IE5GUzNfTUFYUEFUSExFTikgeworCQlwID0geGRyX2VuY29kZV9oeXBlcihwLCAodTY0KSBORlMzX01BWFBBVEhMRU4pOworCX0gZWxzZSB7CisJCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsICh1NjQpIHN0YXQuc2l6ZSk7CisJfQorCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsICgodTY0KXN0YXQuYmxvY2tzKSA8PCA5KTsKKwkqcCsrID0gaHRvbmwoKHUzMikgTUFKT1Ioc3RhdC5yZGV2KSk7CisJKnArKyA9IGh0b25sKCh1MzIpIE1JTk9SKHN0YXQucmRldikpOworCWlmIChpc19mc2lkKGZocCwgcnFzdHAtPnJxX3JlZmZoKSkKKwkJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgKHU2NCkgZmhwLT5maF9leHBvcnQtPmV4X2ZzaWQpOworCWVsc2UKKwkJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgKHU2NCkgaHVnZV9lbmNvZGVfZGV2KHN0YXQuZGV2KSk7CisJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgKHU2NCkgc3RhdC5pbm8pOworCXAgPSBlbmNvZGVfdGltZTMocCwgJnN0YXQuYXRpbWUpOworCWxlYXNlX2dldF9tdGltZShkZW50cnktPmRfaW5vZGUsICZ0aW1lKTsgCisJcCA9IGVuY29kZV90aW1lMyhwLCAmdGltZSk7CisJcCA9IGVuY29kZV90aW1lMyhwLCAmc3RhdC5jdGltZSk7CisKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIGlubGluZSB1MzIgKgorZW5jb2RlX3NhdmVkX3Bvc3RfYXR0cihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBzdmNfZmggKmZocCkKK3sKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gZmhwLT5maF9kZW50cnktPmRfaW5vZGU7CisKKwkvKiBBdHRyaWJ1dGVzIHRvIGZvbGxvdyAqLworCSpwKysgPSB4ZHJfb25lOworCisJKnArKyA9IGh0b25sKG5mczNfZnR5cGVzWyhmaHAtPmZoX3Bvc3RfbW9kZSAmIFNfSUZNVCkgPj4gMTJdKTsKKwkqcCsrID0gaHRvbmwoKHUzMikgZmhwLT5maF9wb3N0X21vZGUpOworCSpwKysgPSBodG9ubCgodTMyKSBmaHAtPmZoX3Bvc3RfbmxpbmspOworCSpwKysgPSBodG9ubCgodTMyKSBuZnNkX3J1aWQocnFzdHAsIGZocC0+ZmhfcG9zdF91aWQpKTsKKwkqcCsrID0gaHRvbmwoKHUzMikgbmZzZF9yZ2lkKHJxc3RwLCBmaHAtPmZoX3Bvc3RfZ2lkKSk7CisJaWYgKFNfSVNMTksoZmhwLT5maF9wb3N0X21vZGUpICYmIGZocC0+ZmhfcG9zdF9zaXplID4gTkZTM19NQVhQQVRITEVOKSB7CisJCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsICh1NjQpIE5GUzNfTUFYUEFUSExFTik7CisJfSBlbHNlIHsKKwkJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgKHU2NCkgZmhwLT5maF9wb3N0X3NpemUpOworCX0KKwlwID0geGRyX2VuY29kZV9oeXBlcihwLCAoKHU2NClmaHAtPmZoX3Bvc3RfYmxvY2tzKSA8PCA5KTsKKwkqcCsrID0gZmhwLT5maF9wb3N0X3JkZXZbMF07CisJKnArKyA9IGZocC0+ZmhfcG9zdF9yZGV2WzFdOworCWlmIChpc19mc2lkKGZocCwgcnFzdHAtPnJxX3JlZmZoKSkKKwkJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgKHU2NCkgZmhwLT5maF9leHBvcnQtPmV4X2ZzaWQpOworCWVsc2UKKwkJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgKHU2NClodWdlX2VuY29kZV9kZXYoaW5vZGUtPmlfc2ItPnNfZGV2KSk7CisJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgKHU2NCkgaW5vZGUtPmlfaW5vKTsKKwlwID0gZW5jb2RlX3RpbWUzKHAsICZmaHAtPmZoX3Bvc3RfYXRpbWUpOworCXAgPSBlbmNvZGVfdGltZTMocCwgJmZocC0+ZmhfcG9zdF9tdGltZSk7CisJcCA9IGVuY29kZV90aW1lMyhwLCAmZmhwLT5maF9wb3N0X2N0aW1lKTsKKworCXJldHVybiBwOworfQorCisvKgorICogRW5jb2RlIHBvc3Qtb3BlcmF0aW9uIGF0dHJpYnV0ZXMuCisgKiBUaGUgaW5vZGUgbWF5IGJlIE5VTEwgaWYgdGhlIGNhbGwgZmFpbGVkIGJlY2F1c2Ugb2YgYSBzdGFsZSBmaWxlCisgKiBoYW5kbGUuIEluIHRoaXMgY2FzZSwgbm8gYXR0cmlidXRlcyBhcmUgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyB1MzIgKgorZW5jb2RlX3Bvc3Rfb3BfYXR0cihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBzdmNfZmggKmZocCkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaHAtPmZoX2RlbnRyeTsKKwlpZiAoZGVudHJ5ICYmIGRlbnRyeS0+ZF9pbm9kZSAhPSBOVUxMKSB7CisJCSpwKysgPSB4ZHJfb25lOwkJLyogYXR0cmlidXRlcyBmb2xsb3cgKi8KKwkJcmV0dXJuIGVuY29kZV9mYXR0cjMocnFzdHAsIHAsIGZocCk7CisJfQorCSpwKysgPSB4ZHJfemVybzsKKwlyZXR1cm4gcDsKK30KKworLyoKKyAqIEVub2NkZSB3ZWFrIGNhY2hlIGNvbnNpc3RlbmN5IGRhdGEKKyAqLworc3RhdGljIHUzMiAqCitlbmNvZGVfd2NjX2RhdGEoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHApCit7CisJc3RydWN0IGRlbnRyeQkqZGVudHJ5ID0gZmhwLT5maF9kZW50cnk7CisKKwlpZiAoZGVudHJ5ICYmIGRlbnRyeS0+ZF9pbm9kZSAmJiBmaHAtPmZoX3Bvc3Rfc2F2ZWQpIHsKKwkJaWYgKGZocC0+ZmhfcHJlX3NhdmVkKSB7CisJCQkqcCsrID0geGRyX29uZTsKKwkJCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsICh1NjQpIGZocC0+ZmhfcHJlX3NpemUpOworCQkJcCA9IGVuY29kZV90aW1lMyhwLCAmZmhwLT5maF9wcmVfbXRpbWUpOworCQkJcCA9IGVuY29kZV90aW1lMyhwLCAmZmhwLT5maF9wcmVfY3RpbWUpOworCQl9IGVsc2UgeworCQkJKnArKyA9IHhkcl96ZXJvOworCQl9CisJCXJldHVybiBlbmNvZGVfc2F2ZWRfcG9zdF9hdHRyKHJxc3RwLCBwLCBmaHApOworCX0KKwkvKiBubyBwcmUtIG9yIHBvc3QtYXR0cnMgKi8KKwkqcCsrID0geGRyX3plcm87CisJcmV0dXJuIGVuY29kZV9wb3N0X29wX2F0dHIocnFzdHAsIHAsIGZocCk7Cit9CisKKworLyoKKyAqIFhEUiBkZWNvZGUgZnVuY3Rpb25zCisgKi8KK2ludAorbmZzM3N2Y19kZWNvZGVfZmhhbmRsZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsIHN0cnVjdCBuZnNkX2ZoYW5kbGUgKmFyZ3MpCit7CisJaWYgKCEocCA9IGRlY29kZV9maChwLCAmYXJncy0+ZmgpKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CituZnMzc3ZjX2RlY29kZV9zYXR0cmFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZDNfc2F0dHJhcmdzICphcmdzKQoreworCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZoKSkKKwkgfHwgIShwID0gZGVjb2RlX3NhdHRyMyhwLCAmYXJncy0+YXR0cnMpKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoKGFyZ3MtPmNoZWNrX2d1YXJkID0gbnRvaGwoKnArKykpICE9IDApIHsgCisJCXN0cnVjdCB0aW1lc3BlYyB0aW1lOyAKKwkJcCA9IGRlY29kZV90aW1lMyhwLCAmdGltZSk7CisJCWFyZ3MtPmd1YXJkdGltZSA9IHRpbWUudHZfc2VjOworCX0KKworCXJldHVybiB4ZHJfYXJnc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKK2ludAorbmZzM3N2Y19kZWNvZGVfZGlyb3BhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKKwkJCQkJc3RydWN0IG5mc2QzX2Rpcm9wYXJncyAqYXJncykKK3sKKwlpZiAoIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT5maCkpCisJIHx8ICEocCA9IGRlY29kZV9maWxlbmFtZShwLCAmYXJncy0+bmFtZSwgJmFyZ3MtPmxlbikpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiB4ZHJfYXJnc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKK2ludAorbmZzM3N2Y19kZWNvZGVfYWNjZXNzYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCisJCQkJCXN0cnVjdCBuZnNkM19hY2Nlc3NhcmdzICphcmdzKQoreworCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZoKSkpCisJCXJldHVybiAwOworCWFyZ3MtPmFjY2VzcyA9IG50b2hsKCpwKyspOworCisJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CituZnMzc3ZjX2RlY29kZV9yZWFkYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCisJCQkJCXN0cnVjdCBuZnNkM19yZWFkYXJncyAqYXJncykKK3sKKwl1bnNpZ25lZCBpbnQgbGVuOworCWludCB2LHBuOworCisJaWYgKCEocCA9IGRlY29kZV9maChwLCAmYXJncy0+ZmgpKQorCSB8fCAhKHAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZhcmdzLT5vZmZzZXQpKSkKKwkJcmV0dXJuIDA7CisKKwlsZW4gPSBhcmdzLT5jb3VudCA9IG50b2hsKCpwKyspOworCisJaWYgKGxlbiA+IE5GU1NWQ19NQVhCTEtTSVpFKQorCQlsZW4gPSBORlNTVkNfTUFYQkxLU0laRTsKKworCS8qIHNldCB1cCB0aGUga3ZlYyAqLworCXY9MDsKKwl3aGlsZSAobGVuID4gMCkgeworCQlwbiA9IHJxc3RwLT5ycV9yZXN1c2VkOworCQlzdmNfdGFrZV9wYWdlKHJxc3RwKTsKKwkJYXJncy0+dmVjW3ZdLmlvdl9iYXNlID0gcGFnZV9hZGRyZXNzKHJxc3RwLT5ycV9yZXNwYWdlc1twbl0pOworCQlhcmdzLT52ZWNbdl0uaW92X2xlbiA9IGxlbiA8IFBBR0VfU0laRT8gbGVuIDogUEFHRV9TSVpFOworCQlsZW4gLT0gYXJncy0+dmVjW3ZdLmlvdl9sZW47CisJCXYrKzsKKwl9CisJYXJncy0+dmxlbiA9IHY7CisJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CituZnMzc3ZjX2RlY29kZV93cml0ZWFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZDNfd3JpdGVhcmdzICphcmdzKQoreworCXVuc2lnbmVkIGludCBsZW4sIHYsIGhkcjsKKworCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZoKSkKKwkgfHwgIShwID0geGRyX2RlY29kZV9oeXBlcihwLCAmYXJncy0+b2Zmc2V0KSkpCisJCXJldHVybiAwOworCisJYXJncy0+Y291bnQgPSBudG9obCgqcCsrKTsKKwlhcmdzLT5zdGFibGUgPSBudG9obCgqcCsrKTsKKwlsZW4gPSBhcmdzLT5sZW4gPSBudG9obCgqcCsrKTsKKworCWhkciA9ICh2b2lkKilwIC0gcnFzdHAtPnJxX2FyZy5oZWFkWzBdLmlvdl9iYXNlOworCWlmIChycXN0cC0+cnFfYXJnLmxlbiA8IGxlbiArIGhkcikKKwkJcmV0dXJuIDA7CisKKwlhcmdzLT52ZWNbMF0uaW92X2Jhc2UgPSAodm9pZCopcDsKKwlhcmdzLT52ZWNbMF0uaW92X2xlbiA9IHJxc3RwLT5ycV9hcmcuaGVhZFswXS5pb3ZfbGVuIC0gaGRyOworCisJaWYgKGxlbiA+IE5GU1NWQ19NQVhCTEtTSVpFKQorCQlsZW4gPSBORlNTVkNfTUFYQkxLU0laRTsKKwl2PSAgMDsKKwl3aGlsZSAobGVuID4gYXJncy0+dmVjW3ZdLmlvdl9sZW4pIHsKKwkJbGVuIC09IGFyZ3MtPnZlY1t2XS5pb3ZfbGVuOworCQl2Kys7CisJCWFyZ3MtPnZlY1t2XS5pb3ZfYmFzZSA9IHBhZ2VfYWRkcmVzcyhycXN0cC0+cnFfYXJncGFnZXNbdl0pOworCQlhcmdzLT52ZWNbdl0uaW92X2xlbiA9IFBBR0VfU0laRTsKKwl9CisJYXJncy0+dmVjW3ZdLmlvdl9sZW4gPSBsZW47CisJYXJncy0+dmxlbiA9IHYrMTsKKworCXJldHVybiBhcmdzLT5jb3VudCA9PSBhcmdzLT5sZW4gJiYgYXJncy0+dmVjWzBdLmlvdl9sZW4gPiAwOworfQorCitpbnQKK25mczNzdmNfZGVjb2RlX2NyZWF0ZWFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZDNfY3JlYXRlYXJncyAqYXJncykKK3sKKwlpZiAoIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT5maCkpCisJIHx8ICEocCA9IGRlY29kZV9maWxlbmFtZShwLCAmYXJncy0+bmFtZSwgJmFyZ3MtPmxlbikpKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoYXJncy0+Y3JlYXRlbW9kZSA9IG50b2hsKCpwKyspKSB7CisJY2FzZSBORlMzX0NSRUFURV9VTkNIRUNLRUQ6CisJY2FzZSBORlMzX0NSRUFURV9HVUFSREVEOgorCQlpZiAoIShwID0gZGVjb2RlX3NhdHRyMyhwLCAmYXJncy0+YXR0cnMpKSkKKwkJCXJldHVybiAwOworCQlicmVhazsKKwljYXNlIE5GUzNfQ1JFQVRFX0VYQ0xVU0lWRToKKwkJYXJncy0+dmVyZiA9IHA7CisJCXAgKz0gMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KK2ludAorbmZzM3N2Y19kZWNvZGVfbWtkaXJhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKKwkJCQkJc3RydWN0IG5mc2QzX2NyZWF0ZWFyZ3MgKmFyZ3MpCit7CisJaWYgKCEocCA9IGRlY29kZV9maChwLCAmYXJncy0+ZmgpKQorCSB8fCAhKHAgPSBkZWNvZGVfZmlsZW5hbWUocCwgJmFyZ3MtPm5hbWUsICZhcmdzLT5sZW4pKQorCSB8fCAhKHAgPSBkZWNvZGVfc2F0dHIzKHAsICZhcmdzLT5hdHRycykpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiB4ZHJfYXJnc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKK2ludAorbmZzM3N2Y19kZWNvZGVfc3ltbGlua2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZDNfc3ltbGlua2FyZ3MgKmFyZ3MpCit7CisJdW5zaWduZWQgaW50IGxlbjsKKwlpbnQgYXZhaWw7CisJY2hhciAqb2xkLCAqbmV3OworCXN0cnVjdCBrdmVjICp2ZWM7CisKKwlpZiAoIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT5mZmgpKQorCSB8fCAhKHAgPSBkZWNvZGVfZmlsZW5hbWUocCwgJmFyZ3MtPmZuYW1lLCAmYXJncy0+ZmxlbikpCisJIHx8ICEocCA9IGRlY29kZV9zYXR0cjMocCwgJmFyZ3MtPmF0dHJzKSkKKwkJKQorCQlyZXR1cm4gMDsKKwkvKiBub3cgZGVjb2RlIHRoZSBwYXRobmFtZSwgd2hpY2ggbWlnaHQgYmUgbGFyZ2VyIHRoYW4gdGhlIGZpcnN0IHBhZ2UuCisJICogQXMgd2UgaGF2ZSB0byBjaGVjayBmb3IgbnVsJ3MgYW55d2F5LCB3ZSBjb3B5IGl0IGludG8gYSBuZXcgcGFnZQorCSAqIFRoaXMgcGFnZSBhcHBlYXJzIGluIHRoZSBycV9yZXMucGFnZXMgbGlzdCwgYnV0IGFzIHBhZ2VzX2xlbiBpcyBhbHdheXMKKwkgKiAwLCBpdCB3b24ndCBnZXQgaW4gdGhlIHdheQorCSAqLworCXN2Y190YWtlX3BhZ2UocnFzdHApOworCWxlbiA9IG50b2hsKCpwKyspOworCWlmIChsZW4gPT0gMCB8fCBsZW4gPiBORlMzX01BWFBBVEhMRU4gfHwgbGVuID49IFBBR0VfU0laRSkKKwkJcmV0dXJuIDA7CisJYXJncy0+dG5hbWUgPSBuZXcgPSBwYWdlX2FkZHJlc3MocnFzdHAtPnJxX3Jlc3BhZ2VzW3Jxc3RwLT5ycV9yZXN1c2VkLTFdKTsKKwlhcmdzLT50bGVuID0gbGVuOworCS8qIGZpcnN0IGNvcHkgYW5kIGNoZWNrIGZyb20gdGhlIGZpcnN0IHBhZ2UgKi8KKwlvbGQgPSAoY2hhciopcDsKKwl2ZWMgPSAmcnFzdHAtPnJxX2FyZy5oZWFkWzBdOworCWF2YWlsID0gdmVjLT5pb3ZfbGVuIC0gKG9sZCAtIChjaGFyKil2ZWMtPmlvdl9iYXNlKTsKKwl3aGlsZSAobGVuICYmIGF2YWlsICYmICpvbGQpIHsKKwkJKm5ldysrID0gKm9sZCsrOworCQlsZW4tLTsKKwkJYXZhaWwtLTsKKwl9CisJLyogbm93IGNvcHkgbmV4dCBwYWdlIGlmIHRoZXJlIGlzIG9uZSAqLworCWlmIChsZW4gJiYgIWF2YWlsICYmIHJxc3RwLT5ycV9hcmcucGFnZV9sZW4pIHsKKwkJYXZhaWwgPSBycXN0cC0+cnFfYXJnLnBhZ2VfbGVuOworCQlpZiAoYXZhaWwgPiBQQUdFX1NJWkUpIGF2YWlsID0gUEFHRV9TSVpFOworCQlvbGQgPSBwYWdlX2FkZHJlc3MocnFzdHAtPnJxX2FyZy5wYWdlc1swXSk7CisJfQorCXdoaWxlIChsZW4gJiYgYXZhaWwgJiYgKm9sZCkgeworCQkqbmV3KysgPSAqb2xkKys7CisJCWxlbi0tOworCQlhdmFpbC0tOworCX0KKwkqbmV3ID0gJ1wwJzsKKwlpZiAobGVuKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitpbnQKK25mczNzdmNfZGVjb2RlX21rbm9kYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCisJCQkJCXN0cnVjdCBuZnNkM19ta25vZGFyZ3MgKmFyZ3MpCit7CisJaWYgKCEocCA9IGRlY29kZV9maChwLCAmYXJncy0+ZmgpKQorCSB8fCAhKHAgPSBkZWNvZGVfZmlsZW5hbWUocCwgJmFyZ3MtPm5hbWUsICZhcmdzLT5sZW4pKSkKKwkJcmV0dXJuIDA7CisKKwlhcmdzLT5mdHlwZSA9IG50b2hsKCpwKyspOworCisJaWYgKGFyZ3MtPmZ0eXBlID09IE5GM0JMSyAgfHwgYXJncy0+ZnR5cGUgPT0gTkYzQ0hSCisJIHx8IGFyZ3MtPmZ0eXBlID09IE5GM1NPQ0sgfHwgYXJncy0+ZnR5cGUgPT0gTkYzRklGTykgeworCQlpZiAoIShwID0gZGVjb2RlX3NhdHRyMyhwLCAmYXJncy0+YXR0cnMpKSkKKwkJCXJldHVybiAwOworCX0KKworCWlmIChhcmdzLT5mdHlwZSA9PSBORjNCTEsgfHwgYXJncy0+ZnR5cGUgPT0gTkYzQ0hSKSB7CisJCWFyZ3MtPm1ham9yID0gbnRvaGwoKnArKyk7CisJCWFyZ3MtPm1pbm9yID0gbnRvaGwoKnArKyk7CisJfQorCisJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CituZnMzc3ZjX2RlY29kZV9yZW5hbWVhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKKwkJCQkJc3RydWN0IG5mc2QzX3JlbmFtZWFyZ3MgKmFyZ3MpCit7CisJaWYgKCEocCA9IGRlY29kZV9maChwLCAmYXJncy0+ZmZoKSkKKwkgfHwgIShwID0gZGVjb2RlX2ZpbGVuYW1lKHAsICZhcmdzLT5mbmFtZSwgJmFyZ3MtPmZsZW4pKQorCSB8fCAhKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPnRmaCkpCisJIHx8ICEocCA9IGRlY29kZV9maWxlbmFtZShwLCAmYXJncy0+dG5hbWUsICZhcmdzLT50bGVuKSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CituZnMzc3ZjX2RlY29kZV9yZWFkbGlua2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZDNfcmVhZGxpbmthcmdzICphcmdzKQoreworCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZoKSkpCisJCXJldHVybiAwOworCXN2Y190YWtlX3BhZ2UocnFzdHApOworCWFyZ3MtPmJ1ZmZlciA9IHBhZ2VfYWRkcmVzcyhycXN0cC0+cnFfcmVzcGFnZXNbcnFzdHAtPnJxX3Jlc3VzZWQtMV0pOworCisJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CituZnMzc3ZjX2RlY29kZV9saW5rYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCisJCQkJCXN0cnVjdCBuZnNkM19saW5rYXJncyAqYXJncykKK3sKKwlpZiAoIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT5mZmgpKQorCSB8fCAhKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPnRmaCkpCisJIHx8ICEocCA9IGRlY29kZV9maWxlbmFtZShwLCAmYXJncy0+dG5hbWUsICZhcmdzLT50bGVuKSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CituZnMzc3ZjX2RlY29kZV9yZWFkZGlyYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCisJCQkJCXN0cnVjdCBuZnNkM19yZWFkZGlyYXJncyAqYXJncykKK3sKKwlpZiAoIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT5maCkpKQorCQlyZXR1cm4gMDsKKwlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmYXJncy0+Y29va2llKTsKKwlhcmdzLT52ZXJmICAgPSBwOyBwICs9IDI7CisJYXJncy0+ZGlyY291bnQgPSB+MDsKKwlhcmdzLT5jb3VudCAgPSBudG9obCgqcCsrKTsKKworCWlmIChhcmdzLT5jb3VudCA+IFBBR0VfU0laRSkKKwkJYXJncy0+Y291bnQgPSBQQUdFX1NJWkU7CisKKwlzdmNfdGFrZV9wYWdlKHJxc3RwKTsKKwlhcmdzLT5idWZmZXIgPSBwYWdlX2FkZHJlc3MocnFzdHAtPnJxX3Jlc3BhZ2VzW3Jxc3RwLT5ycV9yZXN1c2VkLTFdKTsKKworCXJldHVybiB4ZHJfYXJnc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKK2ludAorbmZzM3N2Y19kZWNvZGVfcmVhZGRpcnBsdXNhcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKKwkJCQkJc3RydWN0IG5mc2QzX3JlYWRkaXJhcmdzICphcmdzKQoreworCWludCBsZW4sIHBuOworCisJaWYgKCEocCA9IGRlY29kZV9maChwLCAmYXJncy0+ZmgpKSkKKwkJcmV0dXJuIDA7CisJcCA9IHhkcl9kZWNvZGVfaHlwZXIocCwgJmFyZ3MtPmNvb2tpZSk7CisJYXJncy0+dmVyZiAgICAgPSBwOyBwICs9IDI7CisJYXJncy0+ZGlyY291bnQgPSBudG9obCgqcCsrKTsKKwlhcmdzLT5jb3VudCAgICA9IG50b2hsKCpwKyspOworCisJbGVuID0gKGFyZ3MtPmNvdW50ID4gTkZTU1ZDX01BWEJMS1NJWkUpID8gTkZTU1ZDX01BWEJMS1NJWkUgOgorCQkJCQkJICBhcmdzLT5jb3VudDsKKwlhcmdzLT5jb3VudCA9IGxlbjsKKworCXdoaWxlIChsZW4gPiAwKSB7CisJCXBuID0gcnFzdHAtPnJxX3Jlc3VzZWQ7CisJCXN2Y190YWtlX3BhZ2UocnFzdHApOworCQlpZiAoIWFyZ3MtPmJ1ZmZlcikKKwkJCWFyZ3MtPmJ1ZmZlciA9IHBhZ2VfYWRkcmVzcyhycXN0cC0+cnFfcmVzcGFnZXNbcG5dKTsKKwkJbGVuIC09IFBBR0VfU0laRTsKKwl9CisKKwlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitpbnQKK25mczNzdmNfZGVjb2RlX2NvbW1pdGFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZDNfY29tbWl0YXJncyAqYXJncykKK3sKKwlpZiAoIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT5maCkpKQorCQlyZXR1cm4gMDsKKwlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmYXJncy0+b2Zmc2V0KTsKKwlhcmdzLT5jb3VudCA9IG50b2hsKCpwKyspOworCisJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworLyoKKyAqIFhEUiBlbmNvZGUgZnVuY3Rpb25zCisgKi8KKy8qCisgKiBUaGVyZSBtdXN0IGJlIGFuIGVuY29kaW5nIGZ1bmN0aW9uIGZvciB2b2lkIHJlc3VsdHMgc28gc3ZjX3Byb2Nlc3MKKyAqIHdpbGwgd29yayBwcm9wZXJseS4KKyAqLworaW50CituZnMzc3ZjX2VuY29kZV92b2lkcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgdm9pZCAqZHVtbXkpCit7CisJcmV0dXJuIHhkcl9yZXNzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworLyogR0VUQVRUUiAqLworaW50CituZnMzc3ZjX2VuY29kZV9hdHRyc3RhdChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCisJCQkJCXN0cnVjdCBuZnNkM19hdHRyc3RhdCAqcmVzcCkKK3sKKwlpZiAocmVzcC0+c3RhdHVzID09IDApCisJCXAgPSBlbmNvZGVfZmF0dHIzKHJxc3RwLCBwLCAmcmVzcC0+ZmgpOworCXJldHVybiB4ZHJfcmVzc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKKy8qIFNFVEFUVFIsIFJFTU9WRSwgUk1ESVIgKi8KK2ludAorbmZzM3N2Y19lbmNvZGVfd2Njc3RhdChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCisJCQkJCXN0cnVjdCBuZnNkM19hdHRyc3RhdCAqcmVzcCkKK3sKKwlwID0gZW5jb2RlX3djY19kYXRhKHJxc3RwLCBwLCAmcmVzcC0+ZmgpOworCXJldHVybiB4ZHJfcmVzc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKKy8qIExPT0tVUCAqLworaW50CituZnMzc3ZjX2VuY29kZV9kaXJvcHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCisJCQkJCXN0cnVjdCBuZnNkM19kaXJvcHJlcyAqcmVzcCkKK3sKKwlpZiAocmVzcC0+c3RhdHVzID09IDApIHsKKwkJcCA9IGVuY29kZV9maChwLCAmcmVzcC0+ZmgpOworCQlwID0gZW5jb2RlX3Bvc3Rfb3BfYXR0cihycXN0cCwgcCwgJnJlc3AtPmZoKTsKKwl9CisJcCA9IGVuY29kZV9wb3N0X29wX2F0dHIocnFzdHAsIHAsICZyZXNwLT5kaXJmaCk7CisJcmV0dXJuIHhkcl9yZXNzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworLyogQUNDRVNTICovCitpbnQKK25mczNzdmNfZW5jb2RlX2FjY2Vzc3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCisJCQkJCXN0cnVjdCBuZnNkM19hY2Nlc3NyZXMgKnJlc3ApCit7CisJcCA9IGVuY29kZV9wb3N0X29wX2F0dHIocnFzdHAsIHAsICZyZXNwLT5maCk7CisJaWYgKHJlc3AtPnN0YXR1cyA9PSAwKQorCQkqcCsrID0gaHRvbmwocmVzcC0+YWNjZXNzKTsKKwlyZXR1cm4geGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOworfQorCisvKiBSRUFETElOSyAqLworaW50CituZnMzc3ZjX2VuY29kZV9yZWFkbGlua3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCisJCQkJCXN0cnVjdCBuZnNkM19yZWFkbGlua3JlcyAqcmVzcCkKK3sKKwlwID0gZW5jb2RlX3Bvc3Rfb3BfYXR0cihycXN0cCwgcCwgJnJlc3AtPmZoKTsKKwlpZiAocmVzcC0+c3RhdHVzID09IDApIHsKKwkJKnArKyA9IGh0b25sKHJlc3AtPmxlbik7CisJCXhkcl9yZXNzaXplX2NoZWNrKHJxc3RwLCBwKTsKKwkJcnFzdHAtPnJxX3Jlcy5wYWdlX2xlbiA9IHJlc3AtPmxlbjsKKwkJaWYgKHJlc3AtPmxlbiAmIDMpIHsKKwkJCS8qIG5lZWQgdG8gcGFkIHRoZSB0YWlsICovCisJCQlycXN0cC0+cnFfcmVzdGFpbHBhZ2UgPSAwOworCQkJcnFzdHAtPnJxX3Jlcy50YWlsWzBdLmlvdl9iYXNlID0gcDsKKwkJCSpwID0gMDsKKwkJCXJxc3RwLT5ycV9yZXMudGFpbFswXS5pb3ZfbGVuID0gNCAtIChyZXNwLT5sZW4mMyk7CisJCX0KKwkJcmV0dXJuIDE7CisJfSBlbHNlCisJCXJldHVybiB4ZHJfcmVzc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKKy8qIFJFQUQgKi8KK2ludAorbmZzM3N2Y19lbmNvZGVfcmVhZHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCisJCQkJCXN0cnVjdCBuZnNkM19yZWFkcmVzICpyZXNwKQoreworCXAgPSBlbmNvZGVfcG9zdF9vcF9hdHRyKHJxc3RwLCBwLCAmcmVzcC0+ZmgpOworCWlmIChyZXNwLT5zdGF0dXMgPT0gMCkgeworCQkqcCsrID0gaHRvbmwocmVzcC0+Y291bnQpOworCQkqcCsrID0gaHRvbmwocmVzcC0+ZW9mKTsKKwkJKnArKyA9IGh0b25sKHJlc3AtPmNvdW50KTsJLyogeGRyIG9wYXF1ZSBjb3VudCAqLworCQl4ZHJfcmVzc2l6ZV9jaGVjayhycXN0cCwgcCk7CisJCS8qIG5vdyB1cGRhdGUgcnFzdHAtPnJxX3JlcyB0byByZWZsZWN0IGRhdGEgYXN3ZWxsICovCisJCXJxc3RwLT5ycV9yZXMucGFnZV9sZW4gPSByZXNwLT5jb3VudDsKKwkJaWYgKHJlc3AtPmNvdW50ICYgMykgeworCQkJLyogbmVlZCB0byBwYWQgdGhlIHRhaWwgKi8KKwkJCXJxc3RwLT5ycV9yZXN0YWlscGFnZSA9IDA7CisJCQlycXN0cC0+cnFfcmVzLnRhaWxbMF0uaW92X2Jhc2UgPSBwOworCQkJKnAgPSAwOworCQkJcnFzdHAtPnJxX3Jlcy50YWlsWzBdLmlvdl9sZW4gPSA0IC0gKHJlc3AtPmNvdW50ICYgMyk7CisJCX0KKwkJcmV0dXJuIDE7CisJfSBlbHNlCisJCXJldHVybiB4ZHJfcmVzc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKKy8qIFdSSVRFICovCitpbnQKK25mczNzdmNfZW5jb2RlX3dyaXRlcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKKwkJCQkJc3RydWN0IG5mc2QzX3dyaXRlcmVzICpyZXNwKQoreworCXAgPSBlbmNvZGVfd2NjX2RhdGEocnFzdHAsIHAsICZyZXNwLT5maCk7CisJaWYgKHJlc3AtPnN0YXR1cyA9PSAwKSB7CisJCSpwKysgPSBodG9ubChyZXNwLT5jb3VudCk7CisJCSpwKysgPSBodG9ubChyZXNwLT5jb21taXR0ZWQpOworCQkqcCsrID0gaHRvbmwobmZzc3ZjX2Jvb3QudHZfc2VjKTsKKwkJKnArKyA9IGh0b25sKG5mc3N2Y19ib290LnR2X3VzZWMpOworCX0KKwlyZXR1cm4geGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOworfQorCisvKiBDUkVBVEUsIE1LRElSLCBTWU1MSU5LLCBNS05PRCAqLworaW50CituZnMzc3ZjX2VuY29kZV9jcmVhdGVyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZDNfZGlyb3ByZXMgKnJlc3ApCit7CisJaWYgKHJlc3AtPnN0YXR1cyA9PSAwKSB7CisJCSpwKysgPSB4ZHJfb25lOworCQlwID0gZW5jb2RlX2ZoKHAsICZyZXNwLT5maCk7CisJCXAgPSBlbmNvZGVfcG9zdF9vcF9hdHRyKHJxc3RwLCBwLCAmcmVzcC0+ZmgpOworCX0KKwlwID0gZW5jb2RlX3djY19kYXRhKHJxc3RwLCBwLCAmcmVzcC0+ZGlyZmgpOworCXJldHVybiB4ZHJfcmVzc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKKy8qIFJFTkFNRSAqLworaW50CituZnMzc3ZjX2VuY29kZV9yZW5hbWVyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZDNfcmVuYW1lcmVzICpyZXNwKQoreworCXAgPSBlbmNvZGVfd2NjX2RhdGEocnFzdHAsIHAsICZyZXNwLT5mZmgpOworCXAgPSBlbmNvZGVfd2NjX2RhdGEocnFzdHAsIHAsICZyZXNwLT50ZmgpOworCXJldHVybiB4ZHJfcmVzc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKKy8qIExJTksgKi8KK2ludAorbmZzM3N2Y19lbmNvZGVfbGlua3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCisJCQkJCXN0cnVjdCBuZnNkM19saW5rcmVzICpyZXNwKQoreworCXAgPSBlbmNvZGVfcG9zdF9vcF9hdHRyKHJxc3RwLCBwLCAmcmVzcC0+ZmgpOworCXAgPSBlbmNvZGVfd2NjX2RhdGEocnFzdHAsIHAsICZyZXNwLT50ZmgpOworCXJldHVybiB4ZHJfcmVzc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKKy8qIFJFQURESVIgKi8KK2ludAorbmZzM3N2Y19lbmNvZGVfcmVhZGRpcnJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCisJCQkJCXN0cnVjdCBuZnNkM19yZWFkZGlycmVzICpyZXNwKQoreworCXAgPSBlbmNvZGVfcG9zdF9vcF9hdHRyKHJxc3RwLCBwLCAmcmVzcC0+ZmgpOworCisJaWYgKHJlc3AtPnN0YXR1cyA9PSAwKSB7CisJCS8qIHN0dXBpZCByZWFkZGlyIGNvb2tpZSAqLworCQltZW1jcHkocCwgcmVzcC0+dmVyZiwgOCk7IHAgKz0gMjsKKwkJeGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOworCQlpZiAocnFzdHAtPnJxX3Jlcy5oZWFkWzBdLmlvdl9sZW4gKyAoMjw8MikgPiBQQUdFX1NJWkUpCisJCQlyZXR1cm4gMTsgLypObyByb29tIGZvciB0cmFpbGVyICovCisJCXJxc3RwLT5ycV9yZXMucGFnZV9sZW4gPSAocmVzcC0+Y291bnQpIDw8IDI7CisKKwkJLyogYWRkIHRoZSAndGFpbCcgdG8gdGhlIGVuZCBvZiB0aGUgJ2hlYWQnIHBhZ2UgLSBwYWdlIDAuICovCisJCXJxc3RwLT5ycV9yZXN0YWlscGFnZSA9IDA7CisJCXJxc3RwLT5ycV9yZXMudGFpbFswXS5pb3ZfYmFzZSA9IHA7CisJCSpwKysgPSAwOwkJLyogbm8gbW9yZSBlbnRyaWVzICovCisJCSpwKysgPSBodG9ubChyZXNwLT5jb21tb24uZXJyID09IG5mc2Vycl9lb2YpOworCQlycXN0cC0+cnFfcmVzLnRhaWxbMF0uaW92X2xlbiA9IDI8PDI7CisJCXJldHVybiAxOworCX0gZWxzZQorCQlyZXR1cm4geGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitzdGF0aWMgaW5saW5lIHUzMiAqCitlbmNvZGVfZW50cnlfYmFnZ2FnZShzdHJ1Y3QgbmZzZDNfcmVhZGRpcnJlcyAqY2QsIHUzMiAqcCwgY29uc3QgY2hhciAqbmFtZSwKKwkgICAgIGludCBuYW1sZW4sIGlub190IGlubykKK3sKKwkqcCsrID0geGRyX29uZTsJCQkJIC8qIG1hcmsgZW50cnkgcHJlc2VudCAqLworCXAgICAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsIGlubyk7CSAvKiBmaWxlIGlkICovCisJcCAgICA9IHhkcl9lbmNvZGVfYXJyYXkocCwgbmFtZSwgbmFtbGVuKTsvKiBuYW1lIGxlbmd0aCAmIG5hbWUgKi8KKworCWNkLT5vZmZzZXQgPSBwOwkJCQkvKiByZW1lbWJlciBwb2ludGVyICovCisJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgTkZTX09GRlNFVF9NQVgpOy8qIG9mZnNldCBvZiBuZXh0IGVudHJ5ICovCisKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIGlubGluZSB1MzIgKgorZW5jb2RlX2VudHJ5cGx1c19iYWdnYWdlKHN0cnVjdCBuZnNkM19yZWFkZGlycmVzICpjZCwgdTMyICpwLAorCQlzdHJ1Y3Qgc3ZjX2ZoICpmaHApCit7CisJCXAgPSBlbmNvZGVfcG9zdF9vcF9hdHRyKGNkLT5ycXN0cCwgcCwgZmhwKTsKKwkJKnArKyA9IHhkcl9vbmU7CQkJLyogeWVzLCBhIGZpbGUgaGFuZGxlIGZvbGxvd3MgKi8KKwkJcCA9IGVuY29kZV9maChwLCBmaHApOworCQlmaF9wdXQoZmhwKTsKKwkJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbnQKK2NvbXBvc2VfZW50cnlfZmgoc3RydWN0IG5mc2QzX3JlYWRkaXJyZXMgKmNkLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsCisJCWNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1sZW4pCit7CisJc3RydWN0IHN2Y19leHBvcnQJKmV4cDsKKwlzdHJ1Y3QgZGVudHJ5CQkqZHBhcmVudCwgKmRjaGlsZDsKKwlpbnQgcnYgPSAwOworCisJZHBhcmVudCA9IGNkLT5maC5maF9kZW50cnk7CisJZXhwICA9IGNkLT5maC5maF9leHBvcnQ7CisKKwlmaF9pbml0KGZocCwgTkZTM19GSFNJWkUpOworCWlmIChpc2RvdGVudChuYW1lLCBuYW1sZW4pKSB7CisJCWlmIChuYW1sZW4gPT0gMikgeworCQkJZGNoaWxkID0gZGdldF9wYXJlbnQoZHBhcmVudCk7CisJCQlpZiAoZGNoaWxkID09IGRwYXJlbnQpIHsKKwkJCQkvKiBmaWxlc3lzdGVtIHJvb3QgLSBjYW5ub3QgcmV0dXJuIGZpbGVoYW5kbGUgZm9yICIuLiIgKi8KKwkJCQlkcHV0KGRjaGlsZCk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0gZWxzZQorCQkJZGNoaWxkID0gZGdldChkcGFyZW50KTsKKwl9IGVsc2UKKwkJZGNoaWxkID0gbG9va3VwX29uZV9sZW4obmFtZSwgZHBhcmVudCwgbmFtbGVuKTsKKwlpZiAoSVNfRVJSKGRjaGlsZCkpCisJCXJldHVybiAxOworCWlmIChkX21vdW50cG9pbnQoZGNoaWxkKSB8fAorCSAgICBmaF9jb21wb3NlKGZocCwgZXhwLCBkY2hpbGQsICZjZC0+ZmgpICE9IDAgfHwKKwkgICAgIWRjaGlsZC0+ZF9pbm9kZSkKKwkJcnYgPSAxOworCWRwdXQoZGNoaWxkKTsKKwlyZXR1cm4gcnY7Cit9CisKKy8qCisgKiBFbmNvZGUgYSBkaXJlY3RvcnkgZW50cnkuIFRoaXMgb25lIHdvcmtzIGZvciBib3RoIG5vcm1hbCByZWFkZGlyCisgKiBhbmQgcmVhZGRpcnBsdXMuCisgKiBUaGUgbm9ybWFsIHJlYWRkaXIgcmVwbHkgcmVxdWlyZXMgMiAoZmlsZWlkKSArIDEgKHN0cmluZ2xlbikKKyAqICsgc3RyaW5nICsgMiAoY29va2llKSArIDEgKG5leHQpIHdvcmRzLCBpLmUuIDYgKyBzdHJsZW4uCisgKiAKKyAqIFRoZSByZWFkZGlycGx1cyBiYWdnYWdlIGlzIDErMjEgd29yZHMgZm9yIHBvc3Rfb3BfYXR0ciwgcGx1cyB0aGUKKyAqIGZpbGUgaGFuZGxlLgorICovCisKKyNkZWZpbmUgTkZTM19FTlRSWV9CQUdHQUdFCSgyICsgMSArIDIgKyAxKQorI2RlZmluZSBORlMzX0VOVFJZUExVU19CQUdHQUdFCSgxICsgMjEgKyAxICsgKE5GUzNfRkhTSVpFID4+IDIpKQorc3RhdGljIGludAorZW5jb2RlX2VudHJ5KHN0cnVjdCByZWFkZGlyX2NkICpjY2QsIGNvbnN0IGNoYXIgKm5hbWUsCisJICAgICBpbnQgbmFtbGVuLCBvZmZfdCBvZmZzZXQsIGlub190IGlubywgdW5zaWduZWQgaW50IGRfdHlwZSwgaW50IHBsdXMpCit7CisJc3RydWN0IG5mc2QzX3JlYWRkaXJyZXMgKmNkID0gY29udGFpbmVyX29mKGNjZCwgc3RydWN0IG5mc2QzX3JlYWRkaXJyZXMsCisJCSAgICAgICAJCQkJCWNvbW1vbik7CisJdTMyCQkqcCA9IGNkLT5idWZmZXI7CisJY2FkZHJfdAkJY3Vycl9wYWdlX2FkZHIgPSBOVUxMOworCWludAkJcG47CQkvKiBjdXJyZW50IHBhZ2UgbnVtYmVyICovCisJaW50CQlzbGVuOwkJLyogc3RyaW5nIChuYW1lKSBsZW5ndGggKi8KKwlpbnQJCWVsZW47CQkvKiBlc3RpbWF0ZWQgZW50cnkgbGVuZ3RoIGluIHdvcmRzICovCisJaW50CQludW1fZW50cnlfd29yZHMgPSAwOwkvKiBhY3R1YWwgbnVtYmVyIG9mIHdvcmRzICovCisKKwlpZiAoY2QtPm9mZnNldCkgeworCQl1NjQgb2Zmc2V0NjQgPSBvZmZzZXQ7CisKKwkJaWYgKHVubGlrZWx5KGNkLT5vZmZzZXQxKSkgeworCQkJLyogd2UgZW5kZWQgdXAgd2l0aCBvZmZzZXQgb24gYSBwYWdlIGJvdW5kYXJ5ICovCisJCQkqY2QtPm9mZnNldCA9IGh0b25sKG9mZnNldDY0ID4+IDMyKTsKKwkJCSpjZC0+b2Zmc2V0MSA9IGh0b25sKG9mZnNldDY0ICYgMHhmZmZmZmZmZik7CisJCQljZC0+b2Zmc2V0MSA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQl4ZHJfZW5jb2RlX2h5cGVyKGNkLT5vZmZzZXQsICh1NjQpIG9mZnNldCk7CisJCX0KKwl9CisKKwkvKgorCWRwcmludGsoImVuY29kZV9lbnRyeSglLipzIEAlbGQlcylcbiIsCisJCW5hbWxlbiwgbmFtZSwgKGxvbmcpIG9mZnNldCwgcGx1cz8gIiBwbHVzIiA6ICIiKTsKKwkgKi8KKworCS8qIHRydW5jYXRlIGZpbGVuYW1lIGlmIHRvbyBsb25nICovCisJaWYgKG5hbWxlbiA+IE5GUzNfTUFYTkFNTEVOKQorCQluYW1sZW4gPSBORlMzX01BWE5BTUxFTjsKKworCXNsZW4gPSBYRFJfUVVBRExFTihuYW1sZW4pOworCWVsZW4gPSBzbGVuICsgTkZTM19FTlRSWV9CQUdHQUdFCisJCSsgKHBsdXM/IE5GUzNfRU5UUllQTFVTX0JBR0dBR0UgOiAwKTsKKworCWlmIChjZC0+YnVmbGVuIDwgZWxlbikgeworCQljZC0+Y29tbW9uLmVyciA9IG5mc2Vycl90b29zbWFsbDsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogZGV0ZXJtaW5lIHdoaWNoIHBhZ2UgaW4gcnFfcmVzcGFnZXNbXSB3ZSBhcmUgY3VycmVudGx5IGZpbGxpbmcgKi8KKwlmb3IgKHBuPTE7IHBuIDwgY2QtPnJxc3RwLT5ycV9yZXN1c2VkOyBwbisrKSB7CisJCWN1cnJfcGFnZV9hZGRyID0gcGFnZV9hZGRyZXNzKGNkLT5ycXN0cC0+cnFfcmVzcGFnZXNbcG5dKTsKKworCQlpZiAoKChjYWRkcl90KWNkLT5idWZmZXIgPj0gY3Vycl9wYWdlX2FkZHIpICYmCisJCSAgICAoKGNhZGRyX3QpY2QtPmJ1ZmZlciA8ICBjdXJyX3BhZ2VfYWRkciArIFBBR0VfU0laRSkpCisJCQlicmVhazsKKwl9CisKKwlpZiAoKGNhZGRyX3QpKGNkLT5idWZmZXIgKyBlbGVuKSA8IChjdXJyX3BhZ2VfYWRkciArIFBBR0VfU0laRSkpIHsKKwkJLyogZW5jb2RlIGVudHJ5IGluIGN1cnJlbnQgcGFnZSAqLworCisJCXAgPSBlbmNvZGVfZW50cnlfYmFnZ2FnZShjZCwgcCwgbmFtZSwgbmFtbGVuLCBpbm8pOworCisJCS8qIHRocm93IGluIHJlYWRkaXJwbHVzIGJhZ2dhZ2UgKi8KKwkJaWYgKHBsdXMpIHsKKwkJCXN0cnVjdCBzdmNfZmgJZmg7CisKKwkJCWlmIChjb21wb3NlX2VudHJ5X2ZoKGNkLCAmZmgsIG5hbWUsIG5hbWxlbikgPiAwKSB7CisJCQkJKnArKyA9IDA7CisJCQkJKnArKyA9IDA7CisJCQl9IGVsc2UKKwkJCQlwID0gZW5jb2RlX2VudHJ5cGx1c19iYWdnYWdlKGNkLCBwLCAmZmgpOworCQl9CisJCW51bV9lbnRyeV93b3JkcyA9IHAgLSBjZC0+YnVmZmVyOworCX0gZWxzZSBpZiAoY2QtPnJxc3RwLT5ycV9yZXNwYWdlc1twbisxXSAhPSBOVUxMKSB7CisJCS8qIHRlbXBvcmFyaWx5IGVuY29kZSBlbnRyeSBpbnRvIG5leHQgcGFnZSwgdGhlbiBtb3ZlIGJhY2sgdG8KKwkJICogY3VycmVudCBhbmQgbmV4dCBwYWdlIGluIHJxX3Jlc3BhZ2VzW10gKi8KKwkJdTMyICpwMSwgKnRtcDsKKwkJaW50IGxlbjEsIGxlbjI7CisKKwkJLyogZ3JhYiBuZXh0IHBhZ2UgZm9yIHRlbXBvcmFyeSBzdG9yYWdlIG9mIGVudHJ5ICovCisJCXAxID0gdG1wID0gcGFnZV9hZGRyZXNzKGNkLT5ycXN0cC0+cnFfcmVzcGFnZXNbcG4rMV0pOworCisJCXAxID0gZW5jb2RlX2VudHJ5X2JhZ2dhZ2UoY2QsIHAxLCBuYW1lLCBuYW1sZW4sIGlubyk7CisKKwkJLyogdGhyb3cgaW4gcmVhZGRpcnBsdXMgYmFnZ2FnZSAqLworCQlpZiAocGx1cykgeworCQkJc3RydWN0IHN2Y19maAlmaDsKKworCQkJaWYgKGNvbXBvc2VfZW50cnlfZmgoY2QsICZmaCwgbmFtZSwgbmFtbGVuKSA+IDApIHsKKwkJCQkvKiB6ZXJvIG91dCB0aGUgZmlsZWhhbmRsZSAqLworCQkJCSpwMSsrID0gMDsKKwkJCQkqcDErKyA9IDA7CisJCQl9IGVsc2UKKwkJCQlwMSA9IGVuY29kZV9lbnRyeXBsdXNfYmFnZ2FnZShjZCwgcDEsICZmaCk7CisJCX0KKworCQkvKiBkZXRlcm1pbmUgZW50cnkgd29yZCBsZW5ndGggYW5kIGxlbmd0aHMgdG8gZ28gaW4gcGFnZXMgKi8KKwkJbnVtX2VudHJ5X3dvcmRzID0gcDEgLSB0bXA7CisJCWxlbjEgPSBjdXJyX3BhZ2VfYWRkciArIFBBR0VfU0laRSAtIChjYWRkcl90KWNkLT5idWZmZXI7CisJCWlmICgobnVtX2VudHJ5X3dvcmRzIDw8IDIpIDwgbGVuMSkgeworCQkJLyogdGhlIGFjdHVhbCBudW1iZXIgb2Ygd29yZHMgaW4gdGhlIGVudHJ5IGlzIGxlc3MKKwkJCSAqIHRoYW4gZWxlbiBhbmQgY2FuIHN0aWxsIGZpdCBpbiB0aGUgY3VycmVudCBwYWdlCisJCQkgKi8KKwkJCW1lbW1vdmUocCwgdG1wLCBudW1fZW50cnlfd29yZHMgPDwgMik7CisJCQlwICs9IG51bV9lbnRyeV93b3JkczsKKworCQkJLyogdXBkYXRlIG9mZnNldCAqLworCQkJY2QtPm9mZnNldCA9IGNkLT5idWZmZXIgKyAoY2QtPm9mZnNldCAtIHRtcCk7CisJCX0gZWxzZSB7CisJCQl1bnNpZ25lZCBpbnQgb2Zmc2V0X3IgPSAoY2QtPm9mZnNldCAtIHRtcCkgPDwgMjsKKworCQkJLyogdXBkYXRlIHBvaW50ZXIgdG8gb2Zmc2V0IGxvY2F0aW9uLgorCQkJICogVGhpcyBpcyBhIDY0Yml0IHF1YW50aXR5LCBzbyB3ZSBuZWVkIHRvCisJCQkgKiBkZWFsIHdpdGggMyBjYXNlczoKKwkJCSAqICAtCWVudGlyZWx5IGluIGZpcnN0IHBhZ2UKKwkJCSAqICAtCWVudGlyZWx5IGluIHNlY29uZCBwYWdlCisJCQkgKiAgLQk0IGJ5dGVzIGluIGVhY2ggcGFnZQorCQkJICovCisJCQlpZiAob2Zmc2V0X3IgKyA4IDw9IGxlbjEpIHsKKwkJCQljZC0+b2Zmc2V0ID0gcCArIChjZC0+b2Zmc2V0IC0gdG1wKTsKKwkJCX0gZWxzZSBpZiAob2Zmc2V0X3IgPj0gbGVuMSkgeworCQkJCWNkLT5vZmZzZXQgLT0gbGVuMSA+PiAyOworCQkJfSBlbHNlIHsKKwkJCQkvKiBzaXR0aW5nIG9uIHRoZSBmZW5jZSAqLworCQkJCUJVR19PTihvZmZzZXRfciAhPSBsZW4xIC0gNCk7CisJCQkJY2QtPm9mZnNldCA9IHAgKyAoY2QtPm9mZnNldCAtIHRtcCk7CisJCQkJY2QtPm9mZnNldDEgPSB0bXA7CisJCQl9CisKKwkJCWxlbjIgPSAobnVtX2VudHJ5X3dvcmRzIDw8IDIpIC0gbGVuMTsKKworCQkJLyogbW92ZSBmcm9tIHRlbXAgcGFnZSB0byBjdXJyZW50IGFuZCBuZXh0IHBhZ2VzICovCisJCQltZW1tb3ZlKHAsIHRtcCwgbGVuMSk7CisJCQltZW1tb3ZlKHRtcCwgKGNhZGRyX3QpdG1wK2xlbjEsIGxlbjIpOworCisJCQlwID0gdG1wICsgKGxlbjIgPj4gMik7CisJCX0KKwl9CisJZWxzZSB7CisJCWNkLT5jb21tb24uZXJyID0gbmZzZXJyX3Rvb3NtYWxsOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljZC0+YnVmbGVuIC09IG51bV9lbnRyeV93b3JkczsKKwljZC0+YnVmZmVyID0gcDsKKwljZC0+Y29tbW9uLmVyciA9IG5mc19vazsKKwlyZXR1cm4gMDsKKworfQorCitpbnQKK25mczNzdmNfZW5jb2RlX2VudHJ5KHN0cnVjdCByZWFkZGlyX2NkICpjZCwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICBpbnQgbmFtbGVuLCBsb2ZmX3Qgb2Zmc2V0LCBpbm9fdCBpbm8sIHVuc2lnbmVkIGludCBkX3R5cGUpCit7CisJcmV0dXJuIGVuY29kZV9lbnRyeShjZCwgbmFtZSwgbmFtbGVuLCBvZmZzZXQsIGlubywgZF90eXBlLCAwKTsKK30KKworaW50CituZnMzc3ZjX2VuY29kZV9lbnRyeV9wbHVzKHN0cnVjdCByZWFkZGlyX2NkICpjZCwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgaW50IG5hbWxlbiwgbG9mZl90IG9mZnNldCwgaW5vX3QgaW5vLCB1bnNpZ25lZCBpbnQgZF90eXBlKQoreworCXJldHVybiBlbmNvZGVfZW50cnkoY2QsIG5hbWUsIG5hbWxlbiwgb2Zmc2V0LCBpbm8sIGRfdHlwZSwgMSk7Cit9CisKKy8qIEZTU1RBVCAqLworaW50CituZnMzc3ZjX2VuY29kZV9mc3N0YXRyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZDNfZnNzdGF0cmVzICpyZXNwKQoreworCXN0cnVjdCBrc3RhdGZzCSpzID0gJnJlc3AtPnN0YXRzOworCXU2NAkJYnMgPSBzLT5mX2JzaXplOworCisJKnArKyA9IHhkcl96ZXJvOwkvKiBubyBwb3N0X29wX2F0dHIgKi8KKworCWlmIChyZXNwLT5zdGF0dXMgPT0gMCkgeworCQlwID0geGRyX2VuY29kZV9oeXBlcihwLCBicyAqIHMtPmZfYmxvY2tzKTsJLyogdG90YWwgYnl0ZXMgKi8KKwkJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgYnMgKiBzLT5mX2JmcmVlKTsJLyogZnJlZSBieXRlcyAqLworCQlwID0geGRyX2VuY29kZV9oeXBlcihwLCBicyAqIHMtPmZfYmF2YWlsKTsJLyogdXNlciBhdmFpbGFibGUgYnl0ZXMgKi8KKwkJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgcy0+Zl9maWxlcyk7CS8qIHRvdGFsIGlub2RlcyAqLworCQlwID0geGRyX2VuY29kZV9oeXBlcihwLCBzLT5mX2ZmcmVlKTsJLyogZnJlZSBpbm9kZXMgKi8KKwkJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgcy0+Zl9mZnJlZSk7CS8qIHVzZXIgYXZhaWxhYmxlIGlub2RlcyAqLworCQkqcCsrID0gaHRvbmwocmVzcC0+aW52YXJzZWMpOwkvKiBtZWFuIHVuY2hhbmdlZCB0aW1lICovCisJfQorCXJldHVybiB4ZHJfcmVzc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKKy8qIEZTSU5GTyAqLworaW50CituZnMzc3ZjX2VuY29kZV9mc2luZm9yZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZDNfZnNpbmZvcmVzICpyZXNwKQoreworCSpwKysgPSB4ZHJfemVybzsJLyogbm8gcG9zdF9vcF9hdHRyICovCisKKwlpZiAocmVzcC0+c3RhdHVzID09IDApIHsKKwkJKnArKyA9IGh0b25sKHJlc3AtPmZfcnRtYXgpOworCQkqcCsrID0gaHRvbmwocmVzcC0+Zl9ydHByZWYpOworCQkqcCsrID0gaHRvbmwocmVzcC0+Zl9ydG11bHQpOworCQkqcCsrID0gaHRvbmwocmVzcC0+Zl93dG1heCk7CisJCSpwKysgPSBodG9ubChyZXNwLT5mX3d0cHJlZik7CisJCSpwKysgPSBodG9ubChyZXNwLT5mX3d0bXVsdCk7CisJCSpwKysgPSBodG9ubChyZXNwLT5mX2R0cHJlZik7CisJCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsIHJlc3AtPmZfbWF4ZmlsZXNpemUpOworCQkqcCsrID0geGRyX29uZTsKKwkJKnArKyA9IHhkcl96ZXJvOworCQkqcCsrID0gaHRvbmwocmVzcC0+Zl9wcm9wZXJ0aWVzKTsKKwl9CisKKwlyZXR1cm4geGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOworfQorCisvKiBQQVRIQ09ORiAqLworaW50CituZnMzc3ZjX2VuY29kZV9wYXRoY29uZnJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCisJCQkJCXN0cnVjdCBuZnNkM19wYXRoY29uZnJlcyAqcmVzcCkKK3sKKwkqcCsrID0geGRyX3plcm87CS8qIG5vIHBvc3Rfb3BfYXR0ciAqLworCisJaWYgKHJlc3AtPnN0YXR1cyA9PSAwKSB7CisJCSpwKysgPSBodG9ubChyZXNwLT5wX2xpbmtfbWF4KTsKKwkJKnArKyA9IGh0b25sKHJlc3AtPnBfbmFtZV9tYXgpOworCQkqcCsrID0gaHRvbmwocmVzcC0+cF9ub190cnVuYyk7CisJCSpwKysgPSBodG9ubChyZXNwLT5wX2Nob3duX3Jlc3RyaWN0ZWQpOworCQkqcCsrID0gaHRvbmwocmVzcC0+cF9jYXNlX2luc2Vuc2l0aXZlKTsKKwkJKnArKyA9IGh0b25sKHJlc3AtPnBfY2FzZV9wcmVzZXJ2aW5nKTsKKwl9CisKKwlyZXR1cm4geGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOworfQorCisvKiBDT01NSVQgKi8KK2ludAorbmZzM3N2Y19lbmNvZGVfY29tbWl0cmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKKwkJCQkJc3RydWN0IG5mc2QzX2NvbW1pdHJlcyAqcmVzcCkKK3sKKwlwID0gZW5jb2RlX3djY19kYXRhKHJxc3RwLCBwLCAmcmVzcC0+ZmgpOworCS8qIFdyaXRlIHZlcmlmaWVyICovCisJaWYgKHJlc3AtPnN0YXR1cyA9PSAwKSB7CisJCSpwKysgPSBodG9ubChuZnNzdmNfYm9vdC50dl9zZWMpOworCQkqcCsrID0gaHRvbmwobmZzc3ZjX2Jvb3QudHZfdXNlYyk7CisJfQorCXJldHVybiB4ZHJfcmVzc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKKy8qCisgKiBYRFIgcmVsZWFzZSBmdW5jdGlvbnMKKyAqLworaW50CituZnMzc3ZjX3JlbGVhc2VfZmhhbmRsZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCisJCQkJCXN0cnVjdCBuZnNkM19hdHRyc3RhdCAqcmVzcCkKK3sKKwlmaF9wdXQoJnJlc3AtPmZoKTsKKwlyZXR1cm4gMTsKK30KKworaW50CituZnMzc3ZjX3JlbGVhc2VfZmhhbmRsZTIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZDNfZmhhbmRsZV9wYWlyICpyZXNwKQoreworCWZoX3B1dCgmcmVzcC0+ZmgxKTsKKwlmaF9wdXQoJnJlc3AtPmZoMik7CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRhY2wuYyBiL2ZzL25mc2QvbmZzNGFjbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZWJmNmMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnNkL25mczRhY2wuYwpAQCAtMCwwICsxLDk1NCBAQAorLyoKKyAqICBmcy9uZnM0YWNsL2FjbC5jCisgKgorICogIENvbW1vbiBORlN2NCBBQ0wgaGFuZGxpbmcgY29kZS4KKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAyLCAyMDAzIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuLgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIE1hcml1cyBBYW1vZHQgRXJpa3NlbiA8bWFyaXVzQHVtaWNoLmVkdT4KKyAqICBKZWZmIFNlZGxhayA8anNlZGxha0B1bWljaC5lZHU+CisgKiAgSi4gQnJ1Y2UgRmllbGRzIDxiZmllbGRzQHVtaWNoLmVkdT4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqCisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqICBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiAgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqICBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiAgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqICBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcG9zaXhfYWNsLmg+CisjaW5jbHVkZSA8bGludXgvbmZzNC5oPgorI2luY2x1ZGUgPGxpbnV4L25mczRfYWNsLmg+CisKKworLyogbW9kZSBiaXQgdHJhbnNsYXRpb25zOiAqLworI2RlZmluZSBORlM0X1JFQURfTU9ERSAoTkZTNF9BQ0VfUkVBRF9EQVRBKQorI2RlZmluZSBORlM0X1dSSVRFX01PREUgKE5GUzRfQUNFX1dSSVRFX0RBVEEgfCBORlM0X0FDRV9BUFBFTkRfREFUQSkKKyNkZWZpbmUgTkZTNF9FWEVDVVRFX01PREUgTkZTNF9BQ0VfRVhFQ1VURQorI2RlZmluZSBORlM0X0FOWU9ORV9NT0RFIChORlM0X0FDRV9SRUFEX0FUVFJJQlVURVMgfCBORlM0X0FDRV9SRUFEX0FDTCB8IE5GUzRfQUNFX1NZTkNIUk9OSVpFKQorI2RlZmluZSBORlM0X09XTkVSX01PREUgKE5GUzRfQUNFX1dSSVRFX0FUVFJJQlVURVMgfCBORlM0X0FDRV9XUklURV9BQ0wpCisKKy8qIFdlIGRvbid0IHN1cHBvcnQgdGhlc2UgYml0czsgaW5zaXN0IHRoZXkgYmUgbmVpdGhlciBhbGxvd2VkIG5vciBkZW5pZWQgKi8KKyNkZWZpbmUgTkZTNF9NQVNLX1VOU1VQUCAoTkZTNF9BQ0VfREVMRVRFIHwgTkZTNF9BQ0VfV1JJVEVfT1dORVIgXAorCQl8IE5GUzRfQUNFX1JFQURfTkFNRURfQVRUUlMgfCBORlM0X0FDRV9XUklURV9OQU1FRF9BVFRSUykKKworLyogZmxhZ3MgdXNlZCB0byBzaW11bGF0ZSBwb3NpeCBkZWZhdWx0IEFDTHMgKi8KKyNkZWZpbmUgTkZTNF9JTkhFUklUQU5DRV9GTEFHUyAoTkZTNF9BQ0VfRklMRV9JTkhFUklUX0FDRSBcCisJCXwgTkZTNF9BQ0VfRElSRUNUT1JZX0lOSEVSSVRfQUNFIHwgTkZTNF9BQ0VfSU5IRVJJVF9PTkxZX0FDRSkKKworI2RlZmluZSBNQVNLX0VRVUFMKG1hc2sxLCBtYXNrMikgXAorCSggKChtYXNrMSkgJiBORlM0X0FDRV9NQVNLX0FMTCkgPT0gKChtYXNrMikgJiBORlM0X0FDRV9NQVNLX0FMTCkgKQorCitzdGF0aWMgdTMyCittYXNrX2Zyb21fcG9zaXgodW5zaWduZWQgc2hvcnQgcGVybSwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCWludCBtYXNrID0gTkZTNF9BTllPTkVfTU9ERTsKKworCWlmIChmbGFncyAmIE5GUzRfQUNMX09XTkVSKQorCQltYXNrIHw9IE5GUzRfT1dORVJfTU9ERTsKKwlpZiAocGVybSAmIEFDTF9SRUFEKQorCQltYXNrIHw9IE5GUzRfUkVBRF9NT0RFOworCWlmIChwZXJtICYgQUNMX1dSSVRFKQorCQltYXNrIHw9IE5GUzRfV1JJVEVfTU9ERTsKKwlpZiAoKHBlcm0gJiBBQ0xfV1JJVEUpICYmIChmbGFncyAmIE5GUzRfQUNMX0RJUikpCisJCW1hc2sgfD0gTkZTNF9BQ0VfREVMRVRFX0NISUxEOworCWlmIChwZXJtICYgQUNMX0VYRUNVVEUpCisJCW1hc2sgfD0gTkZTNF9FWEVDVVRFX01PREU7CisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyB1MzIKK2RlbnlfbWFzayh1MzIgYWxsb3dfbWFzaywgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXUzMiByZXQgPSB+YWxsb3dfbWFzayAmIH5ORlM0X01BU0tfVU5TVVBQOworCWlmICghKGZsYWdzICYgTkZTNF9BQ0xfRElSKSkKKwkJcmV0ICY9IH5ORlM0X0FDRV9ERUxFVEVfQ0hJTEQ7CisJcmV0dXJuIHJldDsKK30KKworLyogWFhYOiBtb2RpZnkgZnVuY3Rpb25zIHRvIHJldHVybiBORlMgZXJyb3JzOyB0aGV5J3JlIG9ubHkgZXZlcgorICogdXNlZCBieSBuZnMgY29kZSwgYWZ0ZXIgYWxsLi4uLiAqLworCitzdGF0aWMgaW50Cittb2RlX2Zyb21fbmZzNCh1MzIgcGVybSwgdW5zaWduZWQgc2hvcnQgKm1vZGUsIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwl1MzIgaWdub3JlID0gMDsKKworCWlmICghKGZsYWdzICYgTkZTNF9BQ0xfRElSKSkKKwkJaWdub3JlIHw9IE5GUzRfQUNFX0RFTEVURV9DSElMRDsgLyogaWdub3JlIGl0ICovCisJcGVybSB8PSBpZ25vcmU7CisJKm1vZGUgPSAwOworCWlmICgocGVybSAmIE5GUzRfUkVBRF9NT0RFKSA9PSBORlM0X1JFQURfTU9ERSkKKwkJKm1vZGUgfD0gQUNMX1JFQUQ7CisJaWYgKChwZXJtICYgTkZTNF9XUklURV9NT0RFKSA9PSBORlM0X1dSSVRFX01PREUpCisJCSptb2RlIHw9IEFDTF9XUklURTsKKwlpZiAoKHBlcm0gJiBORlM0X0VYRUNVVEVfTU9ERSkgPT0gTkZTNF9FWEVDVVRFX01PREUpCisJCSptb2RlIHw9IEFDTF9FWEVDVVRFOworCWlmICghTUFTS19FUVVBTChwZXJtLCBpZ25vcmV8bWFza19mcm9tX3Bvc2l4KCptb2RlLCBmbGFncykpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGFjZV9jb250YWluZXIgeworCXN0cnVjdCBuZnM0X2FjZSAgKmFjZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICBhY2VfbDsKK307CisKK3N0YXRpYyBzaG9ydCBhY2UydHlwZShzdHJ1Y3QgbmZzNF9hY2UgKik7CitzdGF0aWMgaW50IF9wb3NpeF90b19uZnN2NF9vbmUoc3RydWN0IHBvc2l4X2FjbCAqLCBzdHJ1Y3QgbmZzNF9hY2wgKiwgdW5zaWduZWQgaW50KTsKK3N0YXRpYyBzdHJ1Y3QgcG9zaXhfYWNsICpfbmZzdjRfdG9fcG9zaXhfb25lKHN0cnVjdCBuZnM0X2FjbCAqLCB1bnNpZ25lZCBpbnQpOworaW50IG5mczRfYWNsX2FkZF9hY2Uoc3RydWN0IG5mczRfYWNsICosIHUzMiwgdTMyLCB1MzIsIGludCwgdWlkX3QpOworaW50IG5mczRfYWNsX3NwbGl0KHN0cnVjdCBuZnM0X2FjbCAqLCBzdHJ1Y3QgbmZzNF9hY2wgKik7CisKK3N0cnVjdCBuZnM0X2FjbCAqCituZnM0X2FjbF9wb3NpeF90b19uZnN2NChzdHJ1Y3QgcG9zaXhfYWNsICpwYWNsLCBzdHJ1Y3QgcG9zaXhfYWNsICpkcGFjbCwKKwkJCXVuc2lnbmVkIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgbmZzNF9hY2wgKmFjbDsKKwlpbnQgZXJyb3IgPSAtRUlOVkFMOworCisJaWYgKChwYWNsICE9IE5VTEwgJiYKKwkJKHBvc2l4X2FjbF92YWxpZChwYWNsKSA8IDAgfHwgcGFjbC0+YV9jb3VudCA9PSAwKSkgfHwKKwkgICAgKGRwYWNsICE9IE5VTEwgJiYKKwkJKHBvc2l4X2FjbF92YWxpZChkcGFjbCkgPCAwIHx8IGRwYWNsLT5hX2NvdW50ID09IDApKSkKKwkJZ290byBvdXRfZXJyOworCisJYWNsID0gbmZzNF9hY2xfbmV3KCk7CisJaWYgKGFjbCA9PSBOVUxMKSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBvdXRfZXJyOworCX0KKworCWlmIChwYWNsICE9IE5VTEwpIHsKKwkJZXJyb3IgPSBfcG9zaXhfdG9fbmZzdjRfb25lKHBhY2wsIGFjbCwKKwkJCQkJCWZsYWdzICYgfk5GUzRfQUNMX1RZUEVfREVGQVVMVCk7CisJCWlmIChlcnJvciA8IDApCisJCQlnb3RvIG91dF9hY2w7CisJfQorCisJaWYgKGRwYWNsICE9IE5VTEwpIHsKKwkJZXJyb3IgPSBfcG9zaXhfdG9fbmZzdjRfb25lKGRwYWNsLCBhY2wsCisJCQkJCQlmbGFncyB8IE5GUzRfQUNMX1RZUEVfREVGQVVMVCk7CisJCWlmIChlcnJvciA8IDApCisJCQlnb3RvIG91dF9hY2w7CisJfQorCisJcmV0dXJuIGFjbDsKKworb3V0X2FjbDoKKwluZnM0X2FjbF9mcmVlKGFjbCk7CitvdXRfZXJyOgorCWFjbCA9IEVSUl9QVFIoZXJyb3IpOworCisJcmV0dXJuIGFjbDsKK30KKworc3RhdGljIGludAorbmZzNF9hY2xfYWRkX3BhaXIoc3RydWN0IG5mczRfYWNsICphY2wsIGludCBlZmxhZywgdTMyIG1hc2ssIGludCB3aG90eXBlLAorCQl1aWRfdCBvd25lciwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCWludCBlcnJvcjsKKworCWVycm9yID0gbmZzNF9hY2xfYWRkX2FjZShhY2wsIE5GUzRfQUNFX0FDQ0VTU19BTExPV0VEX0FDRV9UWVBFLAorCQkJCSBlZmxhZywgbWFzaywgd2hvdHlwZSwgb3duZXIpOworCWlmIChlcnJvciA8IDApCisJCXJldHVybiBlcnJvcjsKKwllcnJvciA9IG5mczRfYWNsX2FkZF9hY2UoYWNsLCBORlM0X0FDRV9BQ0NFU1NfREVOSUVEX0FDRV9UWVBFLAorCQkJCWVmbGFnLCBkZW55X21hc2sobWFzaywgZmxhZ3MpLCB3aG90eXBlLCBvd25lcik7CisJcmV0dXJuIGVycm9yOworfQorCisvKiBXZSBhc3N1bWUgdGhlIGFjbCBoYXMgYmVlbiB2ZXJpZmllZCB3aXRoIHBvc2l4X2FjbF92YWxpZC4gKi8KK3N0YXRpYyBpbnQKK19wb3NpeF90b19uZnN2NF9vbmUoc3RydWN0IHBvc2l4X2FjbCAqcGFjbCwgc3RydWN0IG5mczRfYWNsICphY2wsCisJCQkJCQl1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHBvc2l4X2FjbF9lbnRyeSAqcGEsICpwZSwgKmdyb3VwX293bmVyX2VudHJ5OworCWludCBlcnJvciA9IC1FSU5WQUw7CisJdTMyIG1hc2ssIG1hc2tfbWFzazsKKwlpbnQgZWZsYWcgPSAoKGZsYWdzICYgTkZTNF9BQ0xfVFlQRV9ERUZBVUxUKSA/CisJCQkJCU5GUzRfSU5IRVJJVEFOQ0VfRkxBR1MgOiAwKTsKKworCUJVR19PTihwYWNsLT5hX2NvdW50IDwgMyk7CisJcGUgPSBwYWNsLT5hX2VudHJpZXMgKyBwYWNsLT5hX2NvdW50OworCXBhID0gcGUgLSAyOyAvKiBpZiBtYXNrIGVudHJ5IGV4aXN0cywgaXQncyBzZWNvbmQgZnJvbSB0aGUgbGFzdC4gKi8KKwlpZiAocGEtPmVfdGFnID09IEFDTF9NQVNLKQorCQltYXNrX21hc2sgPSBkZW55X21hc2sobWFza19mcm9tX3Bvc2l4KHBhLT5lX3Blcm0sIGZsYWdzKSwgZmxhZ3MpOworCWVsc2UKKwkJbWFza19tYXNrID0gMDsKKworCXBhID0gcGFjbC0+YV9lbnRyaWVzOworCUJVR19PTihwYS0+ZV90YWcgIT0gQUNMX1VTRVJfT0JKKTsKKwltYXNrID0gbWFza19mcm9tX3Bvc2l4KHBhLT5lX3Blcm0sIGZsYWdzIHwgTkZTNF9BQ0xfT1dORVIpOworCWVycm9yID0gbmZzNF9hY2xfYWRkX3BhaXIoYWNsLCBlZmxhZywgbWFzaywgTkZTNF9BQ0xfV0hPX09XTkVSLCAwLCBmbGFncyk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CisJcGErKzsKKworCXdoaWxlIChwYS0+ZV90YWcgPT0gQUNMX1VTRVIpIHsKKwkJbWFzayA9IG1hc2tfZnJvbV9wb3NpeChwYS0+ZV9wZXJtLCBmbGFncyk7CisJCWVycm9yID0gbmZzNF9hY2xfYWRkX2FjZShhY2wsIE5GUzRfQUNFX0FDQ0VTU19ERU5JRURfQUNFX1RZUEUsCisJCQkJZWZsYWcsICBtYXNrX21hc2ssIE5GUzRfQUNMX1dIT19OQU1FRCwgcGEtPmVfaWQpOworCQlpZiAoZXJyb3IgPCAwKQorCQkJZ290byBvdXQ7CisKKworCQllcnJvciA9IG5mczRfYWNsX2FkZF9wYWlyKGFjbCwgZWZsYWcsIG1hc2ssCisJCQkJTkZTNF9BQ0xfV0hPX05BTUVELCBwYS0+ZV9pZCwgZmxhZ3MpOworCQlpZiAoZXJyb3IgPCAwKQorCQkJZ290byBvdXQ7CisJCXBhKys7CisJfQorCisJLyogSW4gdGhlIGNhc2Ugb2YgZ3JvdXBzLCB3ZSBhcHBseSBhbGxvdyBBQ0VzIGZpcnN0LCB0aGVuIGRlbnkgQUNFcywKKwkgKiBzaW5jZSBhIHVzZXIgY2FuIGJlIGluIG1vcmUgdGhhbiBvbmUgZ3JvdXAuICAqLworCisJLyogYWxsb3cgQUNFcyAqLworCisJaWYgKHBhY2wtPmFfY291bnQgPiAzKSB7CisJCUJVR19PTihwYS0+ZV90YWcgIT0gQUNMX0dST1VQX09CSik7CisJCWVycm9yID0gbmZzNF9hY2xfYWRkX2FjZShhY2wsIE5GUzRfQUNFX0FDQ0VTU19ERU5JRURfQUNFX1RZUEUsCisJCQkJTkZTNF9BQ0VfSURFTlRJRklFUl9HUk9VUCB8IGVmbGFnLCBtYXNrX21hc2ssCisJCQkJTkZTNF9BQ0xfV0hPX0dST1VQLCAwKTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCWdvdG8gb3V0OworCX0KKwlncm91cF9vd25lcl9lbnRyeSA9IHBhOworCW1hc2sgPSBtYXNrX2Zyb21fcG9zaXgocGEtPmVfcGVybSwgZmxhZ3MpOworCWVycm9yID0gbmZzNF9hY2xfYWRkX2FjZShhY2wsIE5GUzRfQUNFX0FDQ0VTU19BTExPV0VEX0FDRV9UWVBFLAorCQkJTkZTNF9BQ0VfSURFTlRJRklFUl9HUk9VUCB8IGVmbGFnLCBtYXNrLAorCQkJTkZTNF9BQ0xfV0hPX0dST1VQLCAwKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIG91dDsKKwlwYSsrOworCisJd2hpbGUgKHBhLT5lX3RhZyA9PSBBQ0xfR1JPVVApIHsKKwkJbWFzayA9IG1hc2tfZnJvbV9wb3NpeChwYS0+ZV9wZXJtLCBmbGFncyk7CisJCWVycm9yID0gbmZzNF9hY2xfYWRkX2FjZShhY2wsIE5GUzRfQUNFX0FDQ0VTU19ERU5JRURfQUNFX1RZUEUsCisJCQkJTkZTNF9BQ0VfSURFTlRJRklFUl9HUk9VUCB8IGVmbGFnLCBtYXNrX21hc2ssCisJCQkJTkZTNF9BQ0xfV0hPX05BTUVELCBwYS0+ZV9pZCk7CisJCWlmIChlcnJvciA8IDApCisJCQlnb3RvIG91dDsKKworCQllcnJvciA9IG5mczRfYWNsX2FkZF9hY2UoYWNsLCBORlM0X0FDRV9BQ0NFU1NfQUxMT1dFRF9BQ0VfVFlQRSwKKwkJICAgIAkJTkZTNF9BQ0VfSURFTlRJRklFUl9HUk9VUCB8IGVmbGFnLCBtYXNrLAorCQkgICAgCQlORlM0X0FDTF9XSE9fTkFNRUQsIHBhLT5lX2lkKTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCWdvdG8gb3V0OworCQlwYSsrOworCX0KKworCS8qIGRlbnkgQUNFcyAqLworCisJcGEgPSBncm91cF9vd25lcl9lbnRyeTsKKwltYXNrID0gbWFza19mcm9tX3Bvc2l4KHBhLT5lX3Blcm0sIGZsYWdzKTsKKwllcnJvciA9IG5mczRfYWNsX2FkZF9hY2UoYWNsLCBORlM0X0FDRV9BQ0NFU1NfREVOSUVEX0FDRV9UWVBFLAorCQkJTkZTNF9BQ0VfSURFTlRJRklFUl9HUk9VUCB8IGVmbGFnLAorCQkJZGVueV9tYXNrKG1hc2ssIGZsYWdzKSwgTkZTNF9BQ0xfV0hPX0dST1VQLCAwKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIG91dDsKKwlwYSsrOworCXdoaWxlIChwYS0+ZV90YWcgPT0gQUNMX0dST1VQKSB7CisJCW1hc2sgPSBtYXNrX2Zyb21fcG9zaXgocGEtPmVfcGVybSwgZmxhZ3MpOworCQllcnJvciA9IG5mczRfYWNsX2FkZF9hY2UoYWNsLCBORlM0X0FDRV9BQ0NFU1NfREVOSUVEX0FDRV9UWVBFLAorCQkgICAgCQlORlM0X0FDRV9JREVOVElGSUVSX0dST1VQIHwgZWZsYWcsCisJCSAgICAJCWRlbnlfbWFzayhtYXNrLCBmbGFncyksIE5GUzRfQUNMX1dIT19OQU1FRCwgcGEtPmVfaWQpOworCQlpZiAoZXJyb3IgPCAwKQorCQkJZ290byBvdXQ7CisJCXBhKys7CisJfQorCisJaWYgKHBhLT5lX3RhZyA9PSBBQ0xfTUFTSykKKwkJcGErKzsKKwlCVUdfT04ocGEtPmVfdGFnICE9IEFDTF9PVEhFUik7CisJbWFzayA9IG1hc2tfZnJvbV9wb3NpeChwYS0+ZV9wZXJtLCBmbGFncyk7CisJZXJyb3IgPSBuZnM0X2FjbF9hZGRfcGFpcihhY2wsIGVmbGFnLCBtYXNrLCBORlM0X0FDTF9XSE9fRVZFUllPTkUsIDAsIGZsYWdzKTsKKworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHZvaWQKK3NvcnRfcGFjbF9yYW5nZShzdHJ1Y3QgcG9zaXhfYWNsICpwYWNsLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKKwlpbnQgc29ydGVkID0gMCwgaTsKKwlzdHJ1Y3QgcG9zaXhfYWNsX2VudHJ5IHRtcDsKKworCS8qIFdlIGp1c3QgZG8gYSBidWJibGUgc29ydDsgZWFzeSB0byBkbyBpbiBwbGFjZSwgYW5kIHdlJ3JlIG5vdAorCSAqIGV4cGVjdGluZyBhY2wncyB0byBiZSBsb25nIGVub3VnaCB0byBqdXN0aWZ5IGFueXRoaW5nIG1vcmUuICovCisJd2hpbGUgKCFzb3J0ZWQpIHsKKwkJc29ydGVkID0gMTsKKwkJZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgeworCQkJaWYgKHBhY2wtPmFfZW50cmllc1tpXS5lX2lkCisJCQkJCT4gcGFjbC0+YV9lbnRyaWVzW2krMV0uZV9pZCkgeworCQkJCXNvcnRlZCA9IDA7CisJCQkJdG1wID0gcGFjbC0+YV9lbnRyaWVzW2ldOworCQkJCXBhY2wtPmFfZW50cmllc1tpXSA9IHBhY2wtPmFfZW50cmllc1tpKzFdOworCQkJCXBhY2wtPmFfZW50cmllc1tpKzFdID0gdG1wOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAorc29ydF9wYWNsKHN0cnVjdCBwb3NpeF9hY2wgKnBhY2wpCit7CisJLyogcG9zaXhfYWNsX3ZhbGlkIHJlcXVpcmVzIHRoYXQgdXNlcnMgYW5kIGdyb3VwcyBiZSBpbiBvcmRlcgorCSAqIGJ5IHVpZC9naWQuICovCisJaW50IGksIGo7CisKKwlpZiAocGFjbC0+YV9jb3VudCA8PSA0KQorCQlyZXR1cm47IC8qIG5vIHVzZXJzIG9yIGdyb3VwcyAqLworCWkgPSAxOworCXdoaWxlIChwYWNsLT5hX2VudHJpZXNbaV0uZV90YWcgPT0gQUNMX1VTRVIpCisJCWkrKzsKKwlzb3J0X3BhY2xfcmFuZ2UocGFjbCwgMSwgaS0xKTsKKworCUJVR19PTihwYWNsLT5hX2VudHJpZXNbaV0uZV90YWcgIT0gQUNMX0dST1VQX09CSik7CisJaiA9IGkrKzsKKwl3aGlsZSAocGFjbC0+YV9lbnRyaWVzW2pdLmVfdGFnID09IEFDTF9HUk9VUCkKKwkJaisrOworCXNvcnRfcGFjbF9yYW5nZShwYWNsLCBpLCBqLTEpOworCXJldHVybjsKK30KKworc3RhdGljIGludAord3JpdGVfcGFjZShzdHJ1Y3QgbmZzNF9hY2UgKmFjZSwgc3RydWN0IHBvc2l4X2FjbCAqcGFjbCwKKwkJc3RydWN0IHBvc2l4X2FjbF9lbnRyeSAqKnBhY2UsIHNob3J0IHRhZywgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXN0cnVjdCBwb3NpeF9hY2xfZW50cnkgKnRoaXMgPSAqcGFjZTsKKworCWlmICgqcGFjZSA9PSBwYWNsLT5hX2VudHJpZXMgKyBwYWNsLT5hX2NvdW50KQorCQlyZXR1cm4gLUVJTlZBTDsgLyogZmVsbCBvZmYgdGhlIGVuZCAqLworCSgqcGFjZSkrKzsKKwl0aGlzLT5lX3RhZyA9IHRhZzsKKwlpZiAodGFnID09IEFDTF9VU0VSX09CSikKKwkJZmxhZ3MgfD0gTkZTNF9BQ0xfT1dORVI7CisJaWYgKG1vZGVfZnJvbV9uZnM0KGFjZS0+YWNjZXNzX21hc2ssICZ0aGlzLT5lX3Blcm0sIGZsYWdzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJdGhpcy0+ZV9pZCA9ICh0YWcgPT0gQUNMX1VTRVIgfHwgdGFnID09IEFDTF9HUk9VUCA/CisJCQlhY2UtPndobyA6IEFDTF9VTkRFRklORURfSUQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5mczRfYWNlICoKK2dldF9uZXh0X3Y0X2FjZShzdHJ1Y3QgbGlzdF9oZWFkICoqcCwgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgbmZzNF9hY2UgKmFjZTsKKworCSpwID0gKCpwKS0+bmV4dDsKKwlpZiAoKnAgPT0gaGVhZCkKKwkJcmV0dXJuIE5VTEw7CisJYWNlID0gbGlzdF9lbnRyeSgqcCwgc3RydWN0IG5mczRfYWNlLCBsX2FjZSk7CisKKwlyZXR1cm4gYWNlOworfQorCitpbnQKK25mczRfYWNsX25mc3Y0X3RvX3Bvc2l4KHN0cnVjdCBuZnM0X2FjbCAqYWNsLCBzdHJ1Y3QgcG9zaXhfYWNsICoqcGFjbCwKKwkJc3RydWN0IHBvc2l4X2FjbCAqKmRwYWNsLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IG5mczRfYWNsICpkYWNsOworCWludCBlcnJvciA9IC1FTk9NRU07CisKKwkqcGFjbCA9IE5VTEw7CisJKmRwYWNsID0gTlVMTDsKKworCWRhY2wgPSBuZnM0X2FjbF9uZXcoKTsKKwlpZiAoZGFjbCA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCWVycm9yID0gbmZzNF9hY2xfc3BsaXQoYWNsLCBkYWNsKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIG91dF9hY2w7CisKKwlpZiAocGFjbCAhPSBOVUxMKSB7CisJCWlmIChhY2wtPm5hY2VzID09IDApIHsKKwkJCWVycm9yID0gLUVOT0RBVEE7CisJCQlnb3RvIHRyeV9kcGFjbDsKKwkJfQorCisJCSpwYWNsID0gX25mc3Y0X3RvX3Bvc2l4X29uZShhY2wsIGZsYWdzKTsKKwkJaWYgKElTX0VSUigqcGFjbCkpIHsKKwkJCWVycm9yID0gUFRSX0VSUigqcGFjbCk7CisJCQkqcGFjbCA9IE5VTEw7CisJCQlnb3RvIG91dF9hY2w7CisJCX0KKwl9CisKK3RyeV9kcGFjbDoKKwlpZiAoZHBhY2wgIT0gTlVMTCkgeworCQlpZiAoZGFjbC0+bmFjZXMgPT0gMCkgeworCQkJaWYgKHBhY2wgPT0gTlVMTCB8fCAqcGFjbCA9PSBOVUxMKQorCQkJCWVycm9yID0gLUVOT0RBVEE7CisJCQlnb3RvIG91dF9hY2w7CisJCX0KKworCQllcnJvciA9IDA7CisJCSpkcGFjbCA9IF9uZnN2NF90b19wb3NpeF9vbmUoZGFjbCwgZmxhZ3MpOworCQlpZiAoSVNfRVJSKCpkcGFjbCkpIHsKKwkJCWVycm9yID0gUFRSX0VSUigqZHBhY2wpOworCQkJKmRwYWNsID0gTlVMTDsKKwkJCWdvdG8gb3V0X2FjbDsKKwkJfQorCX0KKworb3V0X2FjbDoKKwlpZiAoZXJyb3IgJiYgcGFjbCkgeworCQlwb3NpeF9hY2xfcmVsZWFzZSgqcGFjbCk7CisJCSpwYWNsID0gTlVMTDsKKwl9CisJbmZzNF9hY2xfZnJlZShkYWNsKTsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQKK3NhbWVfd2hvKHN0cnVjdCBuZnM0X2FjZSAqYSwgc3RydWN0IG5mczRfYWNlICpiKQoreworCXJldHVybiBhLT53aG90eXBlID09IGItPndob3R5cGUgJiYKKwkJKGEtPndob3R5cGUgIT0gTkZTNF9BQ0xfV0hPX05BTUVEIHx8IGEtPndobyA9PSBiLT53aG8pOworfQorCitzdGF0aWMgaW50Citjb21wbGVtZW50YXJ5X2FjZV9wYWlyKHN0cnVjdCBuZnM0X2FjZSAqYWxsb3csIHN0cnVjdCBuZnM0X2FjZSAqZGVueSwKKwkJdW5zaWduZWQgaW50IGZsYWdzKQoreworCWludCBpZ25vcmUgPSAwOworCWlmICghKGZsYWdzICYgTkZTNF9BQ0xfRElSKSkKKwkJaWdub3JlIHw9IE5GUzRfQUNFX0RFTEVURV9DSElMRDsKKwlyZXR1cm4gTUFTS19FUVVBTChpZ25vcmV8ZGVueV9tYXNrKGFsbG93LT5hY2Nlc3NfbWFzaywgZmxhZ3MpLAorCQkJICBpZ25vcmV8ZGVueS0+YWNjZXNzX21hc2spICYmCisJCWFsbG93LT50eXBlID09IE5GUzRfQUNFX0FDQ0VTU19BTExPV0VEX0FDRV9UWVBFICYmCisJCWRlbnktPnR5cGUgPT0gTkZTNF9BQ0VfQUNDRVNTX0RFTklFRF9BQ0VfVFlQRSAmJgorCQlhbGxvdy0+ZmxhZyA9PSBkZW55LT5mbGFnICYmCisJCXNhbWVfd2hvKGFsbG93LCBkZW55KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3VzZXJfb2JqX2Zyb21fdjQoc3RydWN0IG5mczRfYWNsICpuNGFjbCwgc3RydWN0IGxpc3RfaGVhZCAqKnAsCisJCXN0cnVjdCBwb3NpeF9hY2wgKnBhY2wsIHN0cnVjdCBwb3NpeF9hY2xfZW50cnkgKipwYWNlLAorCQl1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJaW50IGVycm9yID0gLUVJTlZBTDsKKwlzdHJ1Y3QgbmZzNF9hY2UgKmFjZSwgKmFjZTI7CisKKwlhY2UgPSBnZXRfbmV4dF92NF9hY2UocCwgJm40YWNsLT5hY2VfaGVhZCk7CisJaWYgKGFjZSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwlpZiAoYWNlMnR5cGUoYWNlKSAhPSBBQ0xfVVNFUl9PQkopCisJCWdvdG8gb3V0OworCWVycm9yID0gd3JpdGVfcGFjZShhY2UsIHBhY2wsIHBhY2UsIEFDTF9VU0VSX09CSiwgZmxhZ3MpOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0OworCWVycm9yID0gLUVJTlZBTDsKKwlhY2UyID0gZ2V0X25leHRfdjRfYWNlKHAsICZuNGFjbC0+YWNlX2hlYWQpOworCWlmIChhY2UyID09IE5VTEwpCisJCWdvdG8gb3V0OworCWlmICghY29tcGxlbWVudGFyeV9hY2VfcGFpcihhY2UsIGFjZTIsIGZsYWdzKSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSAwOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3VzZXJzX2Zyb21fdjQoc3RydWN0IG5mczRfYWNsICpuNGFjbCwgc3RydWN0IGxpc3RfaGVhZCAqKnAsCisJCXN0cnVjdCBuZnM0X2FjZSAqKm1hc2tfYWNlLAorCQlzdHJ1Y3QgcG9zaXhfYWNsICpwYWNsLCBzdHJ1Y3QgcG9zaXhfYWNsX2VudHJ5ICoqcGFjZSwKKwkJdW5zaWduZWQgaW50IGZsYWdzKQoreworCWludCBlcnJvciA9IC1FSU5WQUw7CisJc3RydWN0IG5mczRfYWNlICphY2UsICphY2UyOworCisJYWNlID0gZ2V0X25leHRfdjRfYWNlKHAsICZuNGFjbC0+YWNlX2hlYWQpOworCWlmIChhY2UgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisJd2hpbGUgKGFjZTJ0eXBlKGFjZSkgPT0gQUNMX1VTRVIpIHsKKwkJaWYgKGFjZS0+dHlwZSAhPSBORlM0X0FDRV9BQ0NFU1NfREVOSUVEX0FDRV9UWVBFKQorCQkJZ290byBvdXQ7CisJCWlmICgqbWFza19hY2UgJiYKKwkJCSFNQVNLX0VRVUFMKGFjZS0+YWNjZXNzX21hc2ssICgqbWFza19hY2UpLT5hY2Nlc3NfbWFzaykpCisJCQlnb3RvIG91dDsKKwkJKm1hc2tfYWNlID0gYWNlOworCQlhY2UgPSBnZXRfbmV4dF92NF9hY2UocCwgJm40YWNsLT5hY2VfaGVhZCk7CisJCWlmIChhY2UgPT0gTlVMTCkKKwkJCWdvdG8gb3V0OworCQlpZiAoYWNlLT50eXBlICE9IE5GUzRfQUNFX0FDQ0VTU19BTExPV0VEX0FDRV9UWVBFKQorCQkJZ290byBvdXQ7CisJCWVycm9yID0gd3JpdGVfcGFjZShhY2UsIHBhY2wsIHBhY2UsIEFDTF9VU0VSLCBmbGFncyk7CisJCWlmIChlcnJvciA8IDApCisJCQlnb3RvIG91dDsKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlhY2UyID0gZ2V0X25leHRfdjRfYWNlKHAsICZuNGFjbC0+YWNlX2hlYWQpOworCQlpZiAoYWNlMiA9PSBOVUxMKQorCQkJZ290byBvdXQ7CisJCWlmICghY29tcGxlbWVudGFyeV9hY2VfcGFpcihhY2UsIGFjZTIsIGZsYWdzKSkKKwkJCWdvdG8gb3V0OworCQlpZiAoKCptYXNrX2FjZSktPmZsYWcgIT0gYWNlMi0+ZmxhZyB8fAorCQkJCSFzYW1lX3dobygqbWFza19hY2UsIGFjZTIpKQorCQkJZ290byBvdXQ7CisJCWFjZSA9IGdldF9uZXh0X3Y0X2FjZShwLCAmbjRhY2wtPmFjZV9oZWFkKTsKKwkJaWYgKGFjZSA9PSBOVUxMKQorCQkJZ290byBvdXQ7CisJfQorCWVycm9yID0gMDsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Citncm91cF9vYmpfYW5kX2dyb3Vwc19mcm9tX3Y0KHN0cnVjdCBuZnM0X2FjbCAqbjRhY2wsIHN0cnVjdCBsaXN0X2hlYWQgKipwLAorCQlzdHJ1Y3QgbmZzNF9hY2UgKiptYXNrX2FjZSwKKwkJc3RydWN0IHBvc2l4X2FjbCAqcGFjbCwgc3RydWN0IHBvc2l4X2FjbF9lbnRyeSAqKnBhY2UsCisJCXVuc2lnbmVkIGludCBmbGFncykKK3sKKwlpbnQgZXJyb3IgPSAtRUlOVkFMOworCXN0cnVjdCBuZnM0X2FjZSAqYWNlLCAqYWNlMjsKKwlzdHJ1Y3QgYWNlX2NvbnRhaW5lciAqYWM7CisJc3RydWN0IGxpc3RfaGVhZCBncm91cF9sOworCisJSU5JVF9MSVNUX0hFQUQoJmdyb3VwX2wpOworCWFjZSA9IGxpc3RfZW50cnkoKnAsIHN0cnVjdCBuZnM0X2FjZSwgbF9hY2UpOworCisJLyogZ3JvdXAgb3duZXIgKG1hc2sgYW5kIGFsbG93IGFjZXMpICovCisKKwlpZiAocGFjbC0+YV9jb3VudCAhPSAzKSB7CisJCS8qIHRoZW4gdGhlIGdyb3VwIG93bmVyIHNob3VsZCBiZSBwcmVjZWRlZCBieSBtYXNrICovCisJCWlmIChhY2UtPnR5cGUgIT0gTkZTNF9BQ0VfQUNDRVNTX0RFTklFRF9BQ0VfVFlQRSkKKwkJCWdvdG8gb3V0OworCQlpZiAoKm1hc2tfYWNlICYmCisJCQkhTUFTS19FUVVBTChhY2UtPmFjY2Vzc19tYXNrLCAoKm1hc2tfYWNlKS0+YWNjZXNzX21hc2spKQorCQkJZ290byBvdXQ7CisJCSptYXNrX2FjZSA9IGFjZTsKKwkJYWNlID0gZ2V0X25leHRfdjRfYWNlKHAsICZuNGFjbC0+YWNlX2hlYWQpOworCQlpZiAoYWNlID09IE5VTEwpCisJCQlnb3RvIG91dDsKKworCQlpZiAoKCptYXNrX2FjZSktPmZsYWcgIT0gYWNlLT5mbGFnIHx8ICFzYW1lX3dobygqbWFza19hY2UsIGFjZSkpCisJCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoYWNlMnR5cGUoYWNlKSAhPSBBQ0xfR1JPVVBfT0JKKQorCQlnb3RvIG91dDsKKworCWFjID0ga21hbGxvYyhzaXplb2YoKmFjKSwgR0ZQX0tFUk5FTCk7CisJZXJyb3IgPSAtRU5PTUVNOworCWlmIChhYyA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwlhYy0+YWNlID0gYWNlOworCWxpc3RfYWRkX3RhaWwoJmFjLT5hY2VfbCwgJmdyb3VwX2wpOworCisJZXJyb3IgPSAtRUlOVkFMOworCWlmIChhY2UtPnR5cGUgIT0gTkZTNF9BQ0VfQUNDRVNTX0FMTE9XRURfQUNFX1RZUEUpCisJCWdvdG8gb3V0OworCisJZXJyb3IgPSB3cml0ZV9wYWNlKGFjZSwgcGFjbCwgcGFjZSwgQUNMX0dST1VQX09CSiwgZmxhZ3MpOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0OworCisJZXJyb3IgPSAtRUlOVkFMOworCWFjZSA9IGdldF9uZXh0X3Y0X2FjZShwLCAmbjRhY2wtPmFjZV9oZWFkKTsKKwlpZiAoYWNlID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJLyogZ3JvdXBzIChtYXNrIGFuZCBhbGxvdyBhY2VzKSAqLworCisJd2hpbGUgKGFjZTJ0eXBlKGFjZSkgPT0gQUNMX0dST1VQKSB7CisJCWlmICgqbWFza19hY2UgPT0gTlVMTCkKKwkJCWdvdG8gb3V0OworCisJCWlmIChhY2UtPnR5cGUgIT0gTkZTNF9BQ0VfQUNDRVNTX0RFTklFRF9BQ0VfVFlQRSB8fAorCQkJIU1BU0tfRVFVQUwoYWNlLT5hY2Nlc3NfbWFzaywgKCptYXNrX2FjZSktPmFjY2Vzc19tYXNrKSkKKwkJCWdvdG8gb3V0OworCQkqbWFza19hY2UgPSBhY2U7CisKKwkJYWNlID0gZ2V0X25leHRfdjRfYWNlKHAsICZuNGFjbC0+YWNlX2hlYWQpOworCQlpZiAoYWNlID09IE5VTEwpCisJCQlnb3RvIG91dDsKKwkJYWMgPSBrbWFsbG9jKHNpemVvZigqYWMpLCBHRlBfS0VSTkVMKTsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlpZiAoYWMgPT0gTlVMTCkKKwkJCWdvdG8gb3V0OworCQllcnJvciA9IC1FSU5WQUw7CisJCWlmIChhY2UtPnR5cGUgIT0gTkZTNF9BQ0VfQUNDRVNTX0FMTE9XRURfQUNFX1RZUEUgfHwKKwkJCQkhc2FtZV93aG8oYWNlLCAqbWFza19hY2UpKQorCQkJZ290byBvdXQ7CisKKwkJYWMtPmFjZSA9IGFjZTsKKwkJbGlzdF9hZGRfdGFpbCgmYWMtPmFjZV9sLCAmZ3JvdXBfbCk7CisKKwkJZXJyb3IgPSB3cml0ZV9wYWNlKGFjZSwgcGFjbCwgcGFjZSwgQUNMX0dST1VQLCBmbGFncyk7CisJCWlmIChlcnJvciA8IDApCisJCQlnb3RvIG91dDsKKwkJZXJyb3IgPSAtRUlOVkFMOworCQlhY2UgPSBnZXRfbmV4dF92NF9hY2UocCwgJm40YWNsLT5hY2VfaGVhZCk7CisJCWlmIChhY2UgPT0gTlVMTCkKKwkJCWdvdG8gb3V0OworCX0KKworCS8qIGdyb3VwIG93bmVyIChkZW55IGFjZSkgKi8KKworCWlmIChhY2UydHlwZShhY2UpICE9IEFDTF9HUk9VUF9PQkopCisJCWdvdG8gb3V0OworCWFjID0gbGlzdF9lbnRyeShncm91cF9sLm5leHQsIHN0cnVjdCBhY2VfY29udGFpbmVyLCBhY2VfbCk7CisJYWNlMiA9IGFjLT5hY2U7CisJaWYgKCFjb21wbGVtZW50YXJ5X2FjZV9wYWlyKGFjZTIsIGFjZSwgZmxhZ3MpKQorCQlnb3RvIG91dDsKKwlsaXN0X2RlbChncm91cF9sLm5leHQpOworCWtmcmVlKGFjKTsKKworCS8qIGdyb3VwcyAoZGVueSBhY2VzKSAqLworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZncm91cF9sKSkgeworCQlhY2UgPSBnZXRfbmV4dF92NF9hY2UocCwgJm40YWNsLT5hY2VfaGVhZCk7CisJCWlmIChhY2UgPT0gTlVMTCkKKwkJCWdvdG8gb3V0OworCQlpZiAoYWNlMnR5cGUoYWNlKSAhPSBBQ0xfR1JPVVApCisJCQlnb3RvIG91dDsKKwkJYWMgPSBsaXN0X2VudHJ5KGdyb3VwX2wubmV4dCwgc3RydWN0IGFjZV9jb250YWluZXIsIGFjZV9sKTsKKwkJYWNlMiA9IGFjLT5hY2U7CisJCWlmICghY29tcGxlbWVudGFyeV9hY2VfcGFpcihhY2UyLCBhY2UsIGZsYWdzKSkKKwkJCWdvdG8gb3V0OworCQlsaXN0X2RlbChncm91cF9sLm5leHQpOworCQlrZnJlZShhYyk7CisJfQorCisJYWNlID0gZ2V0X25leHRfdjRfYWNlKHAsICZuNGFjbC0+YWNlX2hlYWQpOworCWlmIChhY2UgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisJaWYgKGFjZTJ0eXBlKGFjZSkgIT0gQUNMX09USEVSKQorCQlnb3RvIG91dDsKKwllcnJvciA9IDA7CitvdXQ6CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZncm91cF9sKSkgeworCQlhYyA9IGxpc3RfZW50cnkoZ3JvdXBfbC5uZXh0LCBzdHJ1Y3QgYWNlX2NvbnRhaW5lciwgYWNlX2wpOworCQlsaXN0X2RlbChncm91cF9sLm5leHQpOworCQlrZnJlZShhYyk7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGlubGluZSBpbnQKK21hc2tfZnJvbV92NChzdHJ1Y3QgbmZzNF9hY2wgKm40YWNsLCBzdHJ1Y3QgbGlzdF9oZWFkICoqcCwKKwkJc3RydWN0IG5mczRfYWNlICoqbWFza19hY2UsCisJCXN0cnVjdCBwb3NpeF9hY2wgKnBhY2wsIHN0cnVjdCBwb3NpeF9hY2xfZW50cnkgKipwYWNlLAorCQl1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJaW50IGVycm9yID0gLUVJTlZBTDsKKwlzdHJ1Y3QgbmZzNF9hY2UgKmFjZTsKKworCWFjZSA9IGxpc3RfZW50cnkoKnAsIHN0cnVjdCBuZnM0X2FjZSwgbF9hY2UpOworCWlmIChwYWNsLT5hX2NvdW50ICE9IDMpIHsKKwkJaWYgKCptYXNrX2FjZSA9PSBOVUxMKQorCQkJZ290byBvdXQ7CisJCSgqbWFza19hY2UpLT5hY2Nlc3NfbWFzayA9IGRlbnlfbWFzaygoKm1hc2tfYWNlKS0+YWNjZXNzX21hc2ssIGZsYWdzKTsKKwkJd3JpdGVfcGFjZSgqbWFza19hY2UsIHBhY2wsIHBhY2UsIEFDTF9NQVNLLCBmbGFncyk7CisJfQorCWVycm9yID0gMDsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitvdGhlcl9mcm9tX3Y0KHN0cnVjdCBuZnM0X2FjbCAqbjRhY2wsIHN0cnVjdCBsaXN0X2hlYWQgKipwLAorCQlzdHJ1Y3QgcG9zaXhfYWNsICpwYWNsLCBzdHJ1Y3QgcG9zaXhfYWNsX2VudHJ5ICoqcGFjZSwKKwkJdW5zaWduZWQgaW50IGZsYWdzKQoreworCWludCBlcnJvciA9IC1FSU5WQUw7CisJc3RydWN0IG5mczRfYWNlICphY2UsICphY2UyOworCisJYWNlID0gbGlzdF9lbnRyeSgqcCwgc3RydWN0IG5mczRfYWNlLCBsX2FjZSk7CisJaWYgKGFjZS0+dHlwZSAhPSBORlM0X0FDRV9BQ0NFU1NfQUxMT1dFRF9BQ0VfVFlQRSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSB3cml0ZV9wYWNlKGFjZSwgcGFjbCwgcGFjZSwgQUNMX09USEVSLCBmbGFncyk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSAtRUlOVkFMOworCWFjZTIgPSBnZXRfbmV4dF92NF9hY2UocCwgJm40YWNsLT5hY2VfaGVhZCk7CisJaWYgKGFjZTIgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisJaWYgKCFjb21wbGVtZW50YXJ5X2FjZV9wYWlyKGFjZSwgYWNlMiwgZmxhZ3MpKQorCQlnb3RvIG91dDsKKwllcnJvciA9IDA7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50CitjYWxjdWxhdGVfcG9zaXhfYWNlX2NvdW50KHN0cnVjdCBuZnM0X2FjbCAqbjRhY2wpCit7CisJaWYgKG40YWNsLT5uYWNlcyA9PSA2KSAvKiBvd25lciwgb3duZXIgZ3JvdXAsIGFuZCBvdGhlciBvbmx5ICovCisJCXJldHVybiAzOworCWVsc2UgeyAvKiBPdGhlcndpc2UgdGhlcmUgbXVzdCBiZSBhIG1hc2sgZW50cnkuICovCisJCS8qIEFsc28sIHRoZSByZW1haW5pbmcgZW50cmllcyBhcmUgZm9yIG5hbWVkIHVzZXJzIGFuZAorCQkgKiBncm91cHMsIGFuZCBjb21lIGluIHRocmVlcyAobWFzaywgYWxsb3csIGRlbnkpOiAqLworCQlpZiAobjRhY2wtPm5hY2VzIDwgNykKKwkJCXJldHVybiAtMTsKKwkJaWYgKChuNGFjbC0+bmFjZXMgLSA3KSAlIDMpCisJCQlyZXR1cm4gLTE7CisJCXJldHVybiA0ICsgKG40YWNsLT5uYWNlcyAtIDcpLzM7CisJfQorfQorCisKK3N0YXRpYyBzdHJ1Y3QgcG9zaXhfYWNsICoKK19uZnN2NF90b19wb3NpeF9vbmUoc3RydWN0IG5mczRfYWNsICpuNGFjbCwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXN0cnVjdCBwb3NpeF9hY2wgKnBhY2w7CisJaW50IGVycm9yID0gLUVJTlZBTCwgbmFjZSA9IDA7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3QgbmZzNF9hY2UgKm1hc2tfYWNlID0gTlVMTDsKKwlzdHJ1Y3QgcG9zaXhfYWNsX2VudHJ5ICpwYWNlOworCisJbmFjZSA9IGNhbGN1bGF0ZV9wb3NpeF9hY2VfY291bnQobjRhY2wpOworCWlmIChuYWNlIDwgMCkKKwkJZ290byBvdXRfZXJyOworCisJcGFjbCA9IHBvc2l4X2FjbF9hbGxvYyhuYWNlLCBHRlBfS0VSTkVMKTsKKwllcnJvciA9IC1FTk9NRU07CisJaWYgKHBhY2wgPT0gTlVMTCkKKwkJZ290byBvdXRfZXJyOworCisJcGFjZSA9ICZwYWNsLT5hX2VudHJpZXNbMF07CisJcCA9ICZuNGFjbC0+YWNlX2hlYWQ7CisKKwllcnJvciA9IHVzZXJfb2JqX2Zyb21fdjQobjRhY2wsICZwLCBwYWNsLCAmcGFjZSwgZmxhZ3MpOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfYWNsOworCisJZXJyb3IgPSB1c2Vyc19mcm9tX3Y0KG40YWNsLCAmcCwgJm1hc2tfYWNlLCBwYWNsLCAmcGFjZSwgZmxhZ3MpOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfYWNsOworCisJZXJyb3IgPSBncm91cF9vYmpfYW5kX2dyb3Vwc19mcm9tX3Y0KG40YWNsLCAmcCwgJm1hc2tfYWNlLCBwYWNsLCAmcGFjZSwKKwkJCQkJCWZsYWdzKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0X2FjbDsKKworCWVycm9yID0gbWFza19mcm9tX3Y0KG40YWNsLCAmcCwgJm1hc2tfYWNlLCBwYWNsLCAmcGFjZSwgZmxhZ3MpOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfYWNsOworCWVycm9yID0gb3RoZXJfZnJvbV92NChuNGFjbCwgJnAsIHBhY2wsICZwYWNlLCBmbGFncyk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dF9hY2w7CisKKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKHAtPm5leHQgIT0gJm40YWNsLT5hY2VfaGVhZCkKKwkJZ290byBvdXRfYWNsOworCWlmIChwYWNlICE9IHBhY2wtPmFfZW50cmllcyArIHBhY2wtPmFfY291bnQpCisJCWdvdG8gb3V0X2FjbDsKKworCXNvcnRfcGFjbChwYWNsKTsKKworCXJldHVybiBwYWNsOworb3V0X2FjbDoKKwlwb3NpeF9hY2xfcmVsZWFzZShwYWNsKTsKK291dF9lcnI6CisJcGFjbCA9IEVSUl9QVFIoZXJyb3IpOworCXJldHVybiBwYWNsOworfQorCitpbnQKK25mczRfYWNsX3NwbGl0KHN0cnVjdCBuZnM0X2FjbCAqYWNsLCBzdHJ1Y3QgbmZzNF9hY2wgKmRhY2wpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqaCwgKm47CisJc3RydWN0IG5mczRfYWNlICphY2U7CisJaW50IGVycm9yID0gMDsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShoLCBuLCAmYWNsLT5hY2VfaGVhZCkgeworCQlhY2UgPSBsaXN0X2VudHJ5KGgsIHN0cnVjdCBuZnM0X2FjZSwgbF9hY2UpOworCisJCWlmICgoYWNlLT5mbGFnICYgTkZTNF9JTkhFUklUQU5DRV9GTEFHUykKKwkJCQkhPSBORlM0X0lOSEVSSVRBTkNFX0ZMQUdTKQorCQkJY29udGludWU7CisKKwkJZXJyb3IgPSBuZnM0X2FjbF9hZGRfYWNlKGRhY2wsIGFjZS0+dHlwZSwgYWNlLT5mbGFnLAorCQkJCWFjZS0+YWNjZXNzX21hc2ssIGFjZS0+d2hvdHlwZSwgYWNlLT53aG8pID09IC0xOworCQlpZiAoZXJyb3IgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJbGlzdF9kZWwoaCk7CisJCWtmcmVlKGFjZSk7CisJCWFjbC0+bmFjZXMtLTsKKwl9CisKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBzaG9ydAorYWNlMnR5cGUoc3RydWN0IG5mczRfYWNlICphY2UpCit7CisJc3dpdGNoIChhY2UtPndob3R5cGUpIHsKKwkJY2FzZSBORlM0X0FDTF9XSE9fTkFNRUQ6CisJCQlyZXR1cm4gKGFjZS0+ZmxhZyAmIE5GUzRfQUNFX0lERU5USUZJRVJfR1JPVVAgPworCQkJCQlBQ0xfR1JPVVAgOiBBQ0xfVVNFUik7CisJCWNhc2UgTkZTNF9BQ0xfV0hPX09XTkVSOgorCQkJcmV0dXJuIEFDTF9VU0VSX09CSjsKKwkJY2FzZSBORlM0X0FDTF9XSE9fR1JPVVA6CisJCQlyZXR1cm4gQUNMX0dST1VQX09CSjsKKwkJY2FzZSBORlM0X0FDTF9XSE9fRVZFUllPTkU6CisJCQlyZXR1cm4gQUNMX09USEVSOworCX0KKwlCVUcoKTsKKwlyZXR1cm4gLTE7Cit9CisKK0VYUE9SVF9TWU1CT0wobmZzNF9hY2xfcG9zaXhfdG9fbmZzdjQpOworRVhQT1JUX1NZTUJPTChuZnM0X2FjbF9uZnN2NF90b19wb3NpeCk7CisKK3N0cnVjdCBuZnM0X2FjbCAqCituZnM0X2FjbF9uZXcodm9pZCkKK3sKKwlzdHJ1Y3QgbmZzNF9hY2wgKmFjbDsKKworCWlmICgoYWNsID0ga21hbGxvYyhzaXplb2YoKmFjbCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWFjbC0+bmFjZXMgPSAwOworCUlOSVRfTElTVF9IRUFEKCZhY2wtPmFjZV9oZWFkKTsKKworCXJldHVybiBhY2w7Cit9CisKK3ZvaWQKK25mczRfYWNsX2ZyZWUoc3RydWN0IG5mczRfYWNsICphY2wpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqaDsKKwlzdHJ1Y3QgbmZzNF9hY2UgKmFjZTsKKworCWlmICghYWNsKQorCQlyZXR1cm47CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmFjbC0+YWNlX2hlYWQpKSB7CisJCWggPSBhY2wtPmFjZV9oZWFkLm5leHQ7CisJCWxpc3RfZGVsKGgpOworCQlhY2UgPSBsaXN0X2VudHJ5KGgsIHN0cnVjdCBuZnM0X2FjZSwgbF9hY2UpOworCQlrZnJlZShhY2UpOworCX0KKworCWtmcmVlKGFjbCk7CisKKwlyZXR1cm47Cit9CisKK2ludAorbmZzNF9hY2xfYWRkX2FjZShzdHJ1Y3QgbmZzNF9hY2wgKmFjbCwgdTMyIHR5cGUsIHUzMiBmbGFnLCB1MzIgYWNjZXNzX21hc2ssCisJCWludCB3aG90eXBlLCB1aWRfdCB3aG8pCit7CisJc3RydWN0IG5mczRfYWNlICphY2U7CisKKwlpZiAoKGFjZSA9IGttYWxsb2Moc2l6ZW9mKCphY2UpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJYWNlLT50eXBlID0gdHlwZTsKKwlhY2UtPmZsYWcgPSBmbGFnOworCWFjZS0+YWNjZXNzX21hc2sgPSBhY2Nlc3NfbWFzazsKKwlhY2UtPndob3R5cGUgPSB3aG90eXBlOworCWFjZS0+d2hvID0gd2hvOworCisJbGlzdF9hZGRfdGFpbCgmYWNlLT5sX2FjZSwgJmFjbC0+YWNlX2hlYWQpOworCWFjbC0+bmFjZXMrKzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHsKKwljaGFyICpzdHJpbmc7CisJaW50ICAgc3RyaW5nbGVuOworCWludCB0eXBlOworfSBzMnRfbWFwW10gPSB7CisJeworCQkuc3RyaW5nICAgID0gIk9XTkVSQCIsCisJCS5zdHJpbmdsZW4gPSBzaXplb2YoIk9XTkVSQCIpIC0gMSwKKwkJLnR5cGUgICAgICA9IE5GUzRfQUNMX1dIT19PV05FUiwKKwl9LAorCXsKKwkJLnN0cmluZyAgICA9ICJHUk9VUEAiLAorCQkuc3RyaW5nbGVuID0gc2l6ZW9mKCJHUk9VUEAiKSAtIDEsCisJCS50eXBlICAgICAgPSBORlM0X0FDTF9XSE9fR1JPVVAsCisJfSwKKwl7CisJCS5zdHJpbmcgICAgPSAiRVZFUllPTkVAIiwKKwkJLnN0cmluZ2xlbiA9IHNpemVvZigiRVZFUllPTkVAIikgLSAxLAorCQkudHlwZSAgICAgID0gTkZTNF9BQ0xfV0hPX0VWRVJZT05FLAorCX0sCit9OworCitpbnQKK25mczRfYWNsX2dldF93aG90eXBlKGNoYXIgKnAsIHUzMiBsZW4pCit7CisJaW50IGk7CisKKwlmb3IgKGk9MDsgaSA8IHNpemVvZihzMnRfbWFwKSAvIHNpemVvZigqczJ0X21hcCk7IGkrKykgeworCQlpZiAoczJ0X21hcFtpXS5zdHJpbmdsZW4gPT0gbGVuICYmCisJCQkJMCA9PSBtZW1jbXAoczJ0X21hcFtpXS5zdHJpbmcsIHAsIGxlbikpCisJCQlyZXR1cm4gczJ0X21hcFtpXS50eXBlOworCX0KKwlyZXR1cm4gTkZTNF9BQ0xfV0hPX05BTUVEOworfQorCitpbnQKK25mczRfYWNsX3dyaXRlX3dobyhpbnQgd2hvLCBjaGFyICpwKQoreworCWludCBpOworCisJZm9yIChpPTA7IGkgPCBzaXplb2YoczJ0X21hcCkgLyBzaXplb2YoKnMydF9tYXApOyBpKyspIHsKKwkJaWYgKHMydF9tYXBbaV0udHlwZSA9PSB3aG8pIHsKKwkJCW1lbWNweShwLCBzMnRfbWFwW2ldLnN0cmluZywgczJ0X21hcFtpXS5zdHJpbmdsZW4pOworCQkJcmV0dXJuIHMydF9tYXBbaV0uc3RyaW5nbGVuOworCQl9CisJfQorCUJVRygpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK21hdGNoX3dobyhzdHJ1Y3QgbmZzNF9hY2UgKmFjZSwgdWlkX3Qgb3duZXIsIGdpZF90IGdyb3VwLCB1aWRfdCB3aG8pCit7CisJc3dpdGNoIChhY2UtPndob3R5cGUpIHsKKwkJY2FzZSBORlM0X0FDTF9XSE9fTkFNRUQ6CisJCQlyZXR1cm4gd2hvID09IGFjZS0+d2hvOworCQljYXNlIE5GUzRfQUNMX1dIT19PV05FUjoKKwkJCXJldHVybiB3aG8gPT0gb3duZXI7CisJCWNhc2UgTkZTNF9BQ0xfV0hPX0dST1VQOgorCQkJcmV0dXJuIHdobyA9PSBncm91cDsKKwkJY2FzZSBORlM0X0FDTF9XSE9fRVZFUllPTkU6CisJCQlyZXR1cm4gMTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCX0KK30KKworRVhQT1JUX1NZTUJPTChuZnM0X2FjbF9uZXcpOworRVhQT1JUX1NZTUJPTChuZnM0X2FjbF9mcmVlKTsKK0VYUE9SVF9TWU1CT0wobmZzNF9hY2xfYWRkX2FjZSk7CitFWFBPUlRfU1lNQk9MKG5mczRfYWNsX2dldF93aG90eXBlKTsKK0VYUE9SVF9TWU1CT0wobmZzNF9hY2xfd3JpdGVfd2hvKTsKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNGNhbGxiYWNrLmMgYi9mcy9uZnNkL25mczRjYWxsYmFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MGRlOWMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnNkL25mczRjYWxsYmFjay5jCkBAIC0wLDAgKzEsNTQ3IEBACisvKgorICogIGxpbnV4L2ZzL25mc2QvbmZzNGNhbGxiYWNrLmMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuLgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIEtlbmRyaWNrIFNtaXRoIDxrbXNtaXRoQHVtaWNoLmVkdT4KKyAqICBBbmR5IEFkYW1zb24gPGFuZHJvc0B1bWljaC5lZHU+CisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiAgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiAgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiAgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy94ZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL25mc2QuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL3N0YXRlLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbmZzNC5oPgorCisjZGVmaW5lIE5GU0REQkdfRkFDSUxJVFkgICAgICAgICAgICAgICAgTkZTRERCR19QUk9DCisKKyNkZWZpbmUgTkZTUFJPQzRfQ0JfTlVMTCAwCisjZGVmaW5lIE5GU1BST0M0X0NCX0NPTVBPVU5EIDEKKworLyogZGVjbGFyYXRpb25zICovCitzdGF0aWMgdm9pZCBuZnM0X2NiX251bGwoc3RydWN0IHJwY190YXNrICp0YXNrKTsKK2V4dGVybiBzcGlubG9ja190IHJlY2FsbF9sb2NrOworCisvKiBJbmRleCBvZiBwcmVkZWZpbmVkIExpbnV4IGNhbGxiYWNrIGNsaWVudCBvcGVyYXRpb25zICovCisKK2VudW0geworICAgICAgICBORlNQUk9DNF9DTE5UX0NCX05VTEwgPSAwLAorCU5GU1BST0M0X0NMTlRfQ0JfUkVDQUxMLAorfTsKKworZW51bSBuZnNfY2Jfb3BudW00IHsKKwlPUF9DQl9SRUNBTEwgICAgICAgICAgICA9IDQsCit9OworCisjZGVmaW5lIE5GUzRfTUFYVEFHTEVOCQkyMAorCisjZGVmaW5lIE5GUzRfZW5jX2NiX251bGxfc3oJCTAKKyNkZWZpbmUgTkZTNF9kZWNfY2JfbnVsbF9zegkJMAorI2RlZmluZSBjYl9jb21wb3VuZF9lbmNfaGRyX3N6CQk0CisjZGVmaW5lIGNiX2NvbXBvdW5kX2RlY19oZHJfc3oJCSgzICsgKE5GUzRfTUFYVEFHTEVOID4+IDIpKQorI2RlZmluZSBvcF9lbmNfc3oJCQkxCisjZGVmaW5lIG9wX2RlY19zegkJCTIKKyNkZWZpbmUgZW5jX25mczRfZmhfc3oJCQkoMSArIChORlM0X0ZIU0laRSA+PiAyKSkKKyNkZWZpbmUgZW5jX3N0YXRlaWRfc3oJCQkxNgorI2RlZmluZSBORlM0X2VuY19jYl9yZWNhbGxfc3oJCShjYl9jb21wb3VuZF9lbmNfaGRyX3N6ICsgICAgICAgXAorCQkJCQkxICsgZW5jX3N0YXRlaWRfc3ogKyAgICAgICAgICAgIFwKKwkJCQkJZW5jX25mczRfZmhfc3opCisKKyNkZWZpbmUgTkZTNF9kZWNfY2JfcmVjYWxsX3N6CQkoY2JfY29tcG91bmRfZGVjX2hkcl9zeiAgKyAgICAgIFwKKwkJCQkJb3BfZGVjX3N6KQorCisvKgorKiBHZW5lcmljIGVuY29kZSByb3V0aW5lcyBmcm9tIGZzL25mcy9uZnM0eGRyLmMKKyovCitzdGF0aWMgaW5saW5lIHUzMiAqCit4ZHJfd3JpdGVtZW0odTMyICpwLCBjb25zdCB2b2lkICpwdHIsIGludCBuYnl0ZXMpCit7CisJaW50IHRtcCA9IFhEUl9RVUFETEVOKG5ieXRlcyk7CisJaWYgKCF0bXApCisJCXJldHVybiBwOworCXBbdG1wLTFdID0gMDsKKwltZW1jcHkocCwgcHRyLCBuYnl0ZXMpOworCXJldHVybiBwICsgdG1wOworfQorCisjZGVmaW5lIFdSSVRFMzIobikgICAgICAgICAgICAgICAqcCsrID0gaHRvbmwobikKKyNkZWZpbmUgV1JJVEVNRU0ocHRyLG5ieXRlcykgICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJcCA9IHhkcl93cml0ZW1lbShwLCBwdHIsIG5ieXRlcyk7ICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBSRVNFUlZFX1NQQUNFKG5ieXRlcykgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlwID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCBuYnl0ZXMpOyAgICAgICAgICAgICAgICAgICAgIFwKKwlpZiAoIXApIGRwcmludGsoIk5GU0Q6IFJFU0VSVkVfU1BBQ0UoJWQpIGZhaWxlZCBpbiBmdW5jdGlvbiAlc1xuIiwgKGludCkgKG5ieXRlcyksIF9fRlVOQ1RJT05fXyk7IFwKKwlCVUdfT04oIXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8qCisgKiBHZW5lcmljIGRlY29kZSByb3V0aW5lcyBmcm9tIGZzL25mcy9uZnM0eGRyLmMKKyAqLworI2RlZmluZSBERUNPREVfVEFJTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXN0YXR1cyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitvdXQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJcmV0dXJuIHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3hkcl9lcnJvcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlkcHJpbnRrKCJORlNEOiB4ZHIgZXJyb3IhICglczolZClcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyk7IFwKKwlzdGF0dXMgPSAtRUlPOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWdvdG8gb3V0CisKKyNkZWZpbmUgUkVBRDMyKHgpICAgICAgICAgKHgpID0gbnRvaGwoKnArKykKKyNkZWZpbmUgUkVBRDY0KHgpICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgIFwKKwkoeCkgPSAodTY0KW50b2hsKCpwKyspIDw8IDMyOyAgICAgICAgICAgXAorCSh4KSB8PSBudG9obCgqcCsrKTsgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBSRUFEVElNRSh4KSAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgXAorCXArKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKHgudHZfc2VjKSA9IG50b2hsKCpwKyspOyAgICAgICAgICAgICAgIFwKKwkoeC50dl9uc2VjKSA9IG50b2hsKCpwKyspOyAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgUkVBRF9CVUYobmJ5dGVzKSAgZG8geyBcCisJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgbmJ5dGVzKTsgXAorCWlmICghcCkgeyBcCisJCWRwcmludGsoIk5GU0Q6ICVzOiByZXBseSBidWZmZXIgb3ZlcmZsb3dlZCBpbiBsaW5lICVkLiIsIFwKKwkJCV9fRlVOQ1RJT05fXywgX19MSU5FX18pOyBcCisJCXJldHVybiAtRUlPOyBcCisJfSBcCit9IHdoaWxlICgwKQorCitzdHJ1Y3QgbmZzNF9jYl9jb21wb3VuZF9oZHIgeworCWludAkJc3RhdHVzOworCXUzMgkJaWRlbnQ7CisJdTMyCQlub3BzOworCXUzMgkJdGFnbGVuOworCWNoYXIgKgkJdGFnOworfTsKKworc3RhdGljIHN0cnVjdCB7CitpbnQgc3RhdDsKK2ludCBlcnJubzsKK30gbmZzX2NiX2VycnRibFtdID0geworCXsgTkZTNF9PSywJCTAgICAgICAgICAgICAgICB9LAorCXsgTkZTNEVSUl9QRVJNLAkJRVBFUk0gICAgICAgICAgIH0sCisJeyBORlM0RVJSX05PRU5ULAlFTk9FTlQgICAgICAgICAgfSwKKwl7IE5GUzRFUlJfSU8sCQlFSU8gICAgICAgICAgICAgfSwKKwl7IE5GUzRFUlJfTlhJTywJCUVOWElPICAgICAgICAgICB9LAorCXsgTkZTNEVSUl9BQ0NFU1MsCUVBQ0NFUyAgICAgICAgICB9LAorCXsgTkZTNEVSUl9FWElTVCwJRUVYSVNUICAgICAgICAgIH0sCisJeyBORlM0RVJSX1hERVYsCQlFWERFViAgICAgICAgICAgfSwKKwl7IE5GUzRFUlJfTk9URElSLAlFTk9URElSICAgICAgICAgfSwKKwl7IE5GUzRFUlJfSVNESVIsCUVJU0RJUiAgICAgICAgICB9LAorCXsgTkZTNEVSUl9JTlZBTCwJRUlOVkFMICAgICAgICAgIH0sCisJeyBORlM0RVJSX0ZCSUcsCQlFRkJJRyAgICAgICAgICAgfSwKKwl7IE5GUzRFUlJfTk9TUEMsCUVOT1NQQyAgICAgICAgICB9LAorCXsgTkZTNEVSUl9ST0ZTLAkJRVJPRlMgICAgICAgICAgIH0sCisJeyBORlM0RVJSX01MSU5LLAlFTUxJTksgICAgICAgICAgfSwKKwl7IE5GUzRFUlJfTkFNRVRPT0xPTkcsCUVOQU1FVE9PTE9ORyAgICB9LAorCXsgTkZTNEVSUl9OT1RFTVBUWSwJRU5PVEVNUFRZICAgICAgIH0sCisJeyBORlM0RVJSX0RRVU9ULAlFRFFVT1QgICAgICAgICAgfSwKKwl7IE5GUzRFUlJfU1RBTEUsCUVTVEFMRSAgICAgICAgICB9LAorCXsgTkZTNEVSUl9CQURIQU5ETEUsCUVCQURIQU5ETEUgICAgICB9LAorCXsgTkZTNEVSUl9CQURfQ09PS0lFLAlFQkFEQ09PS0lFICAgICAgfSwKKwl7IE5GUzRFUlJfTk9UU1VQUCwJRU5PVFNVUFAgICAgICAgIH0sCisJeyBORlM0RVJSX1RPT1NNQUxMLAlFVE9PU01BTEwgICAgICAgfSwKKwl7IE5GUzRFUlJfU0VSVkVSRkFVTFQsCUVTRVJWRVJGQVVMVCAgICB9LAorCXsgTkZTNEVSUl9CQURUWVBFLAlFQkFEVFlQRSAgICAgICAgfSwKKwl7IE5GUzRFUlJfTE9DS0VELAlFQUdBSU4gICAgICAgICAgfSwKKwl7IE5GUzRFUlJfUkVTT1VSQ0UsCUVSRU1PVEVJTyAgICAgICB9LAorCXsgTkZTNEVSUl9TWU1MSU5LLAlFTE9PUCAgICAgICAgICAgfSwKKwl7IE5GUzRFUlJfT1BfSUxMRUdBTCwJRU9QTk9UU1VQUCAgICAgIH0sCisJeyBORlM0RVJSX0RFQURMT0NLLAlFREVBRExLICAgICAgICAgfSwKKwl7IC0xLCAgICAgICAgICAgICAgICAgICBFSU8gICAgICAgICAgICAgfQorfTsKKworc3RhdGljIGludAorbmZzX2NiX3N0YXRfdG9fZXJybm8oaW50IHN0YXQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgbmZzX2NiX2VycnRibFtpXS5zdGF0ICE9IC0xOyBpKyspIHsKKwkJaWYgKG5mc19jYl9lcnJ0YmxbaV0uc3RhdCA9PSBzdGF0KQorCQkJcmV0dXJuIG5mc19jYl9lcnJ0YmxbaV0uZXJybm87CisJfQorCS8qIElmIHdlIGNhbm5vdCB0cmFuc2xhdGUgdGhlIGVycm9yLCB0aGUgcmVjb3Zlcnkgcm91dGluZXMgc2hvdWxkCisJKiBoYW5kbGUgaXQuCisJKiBOb3RlOiByZW1haW5pbmcgTkZTdjQgZXJyb3IgY29kZXMgaGF2ZSB2YWx1ZXMgPiAxMDAwMCwgc28gc2hvdWxkCisJKiBub3QgY29uZmxpY3Qgd2l0aCBuYXRpdmUgTGludXggZXJyb3IgY29kZXMuCisJKi8KKwlyZXR1cm4gc3RhdDsKK30KKworLyoKKyAqIFhEUiBlbmNvZGUKKyAqLworCitzdGF0aWMgaW50CitlbmNvZGVfY2JfY29tcG91bmRfaGRyKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnM0X2NiX2NvbXBvdW5kX2hkciAqaGRyKQoreworCXUzMiAqIHA7CisKKwlSRVNFUlZFX1NQQUNFKDE2KTsKKwlXUklURTMyKDApOyAgICAgICAgICAgIC8qIHRhZyBsZW5ndGggaXMgYWx3YXlzIDAgKi8KKwlXUklURTMyKE5GUzRfTUlOT1JfVkVSU0lPTik7CisJV1JJVEUzMihoZHItPmlkZW50KTsKKwlXUklURTMyKGhkci0+bm9wcyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2VuY29kZV9jYl9yZWNhbGwoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mczRfY2JfcmVjYWxsICpjYl9yZWMpCit7CisJdTMyICpwOworCWludCBsZW4gPSBjYl9yZWMtPmNicl9maGxlbjsKKworCVJFU0VSVkVfU1BBQ0UoMTIrc2l6ZW9mKGNiX3JlYy0+Y2JyX3N0YXRlaWQpICsgbGVuKTsKKwlXUklURTMyKE9QX0NCX1JFQ0FMTCk7CisJV1JJVEVNRU0oJmNiX3JlYy0+Y2JyX3N0YXRlaWQsIHNpemVvZihzdGF0ZWlkX3QpKTsKKwlXUklURTMyKGNiX3JlYy0+Y2JyX3RydW5jKTsKKwlXUklURTMyKGxlbik7CisJV1JJVEVNRU0oY2JfcmVjLT5jYnJfZmh2YWwsIGxlbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK25mczRfeGRyX2VuY19jYl9udWxsKHN0cnVjdCBycGNfcnFzdCAqcmVxLCB1MzIgKnApCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRycywgKnhkciA9ICZ4ZHJzOworCisJeGRyX2luaXRfZW5jb2RlKCZ4ZHJzLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKKyAgICAgICAgUkVTRVJWRV9TUEFDRSgwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbmZzNF94ZHJfZW5jX2NiX3JlY2FsbChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwLCBzdHJ1Y3QgbmZzNF9jYl9yZWNhbGwgKmFyZ3MpCit7CisJc3RydWN0IHhkcl9zdHJlYW0geGRyOworCXN0cnVjdCBuZnM0X2NiX2NvbXBvdW5kX2hkciBoZHIgPSB7CisJCS5pZGVudCA9IGFyZ3MtPmNicl9pZGVudCwKKwkJLm5vcHMgICA9IDEsCisJfTsKKworCXhkcl9pbml0X2VuY29kZSgmeGRyLCAmcmVxLT5ycV9zbmRfYnVmLCBwKTsKKwllbmNvZGVfY2JfY29tcG91bmRfaGRyKCZ4ZHIsICZoZHIpOworCXJldHVybiAoZW5jb2RlX2NiX3JlY2FsbCgmeGRyLCBhcmdzKSk7Cit9CisKKworc3RhdGljIGludAorZGVjb2RlX2NiX2NvbXBvdW5kX2hkcihzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzNF9jYl9jb21wb3VuZF9oZHIgKmhkcil7CisgICAgICAgIHUzMiAqcDsKKworICAgICAgICBSRUFEX0JVRig4KTsKKyAgICAgICAgUkVBRDMyKGhkci0+c3RhdHVzKTsKKyAgICAgICAgUkVBRDMyKGhkci0+dGFnbGVuKTsKKyAgICAgICAgUkVBRF9CVUYoaGRyLT50YWdsZW4gKyA0KTsKKyAgICAgICAgaGRyLT50YWcgPSAoY2hhciAqKXA7CisgICAgICAgIHAgKz0gWERSX1FVQURMRU4oaGRyLT50YWdsZW4pOworICAgICAgICBSRUFEMzIoaGRyLT5ub3BzKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2RlY29kZV9jYl9vcF9oZHIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgZW51bSBuZnNfb3BudW00IGV4cGVjdGVkKQoreworCXUzMiAqcDsKKwl1MzIgb3A7CisJaW50MzJfdCBuZnNlcnI7CisKKwlSRUFEX0JVRig4KTsKKwlSRUFEMzIob3ApOworCWlmIChvcCAhPSBleHBlY3RlZCkgeworCQlkcHJpbnRrKCJORlNEOiBkZWNvZGVfY2Jfb3BfaGRyOiBDYWxsYmFjayBzZXJ2ZXIgcmV0dXJuZWQgIgorCQkgICAgICAgICAiIG9wZXJhdGlvbiAlZCBidXQgd2UgaXNzdWVkIGEgcmVxdWVzdCBmb3IgJWRcbiIsCisJCSAgICAgICAgIG9wLCBleHBlY3RlZCk7CisJCXJldHVybiAtRUlPOworCX0KKwlSRUFEMzIobmZzZXJyKTsKKwlpZiAobmZzZXJyICE9IE5GU19PSykKKwkJcmV0dXJuIC1uZnNfY2Jfc3RhdF90b19lcnJubyhuZnNlcnIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CituZnM0X3hkcl9kZWNfY2JfbnVsbChzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwgdTMyICpwKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CituZnM0X3hkcl9kZWNfY2JfcmVjYWxsKHN0cnVjdCBycGNfcnFzdCAqcnFzdHAsIHUzMiAqcCkKK3sKKwlzdHJ1Y3QgeGRyX3N0cmVhbSB4ZHI7CisJc3RydWN0IG5mczRfY2JfY29tcG91bmRfaGRyIGhkcjsKKwlpbnQgc3RhdHVzOworCisJeGRyX2luaXRfZGVjb2RlKCZ4ZHIsICZycXN0cC0+cnFfcmN2X2J1ZiwgcCk7CisJc3RhdHVzID0gZGVjb2RlX2NiX2NvbXBvdW5kX2hkcigmeGRyLCAmaGRyKTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBkZWNvZGVfY2Jfb3BfaGRyKCZ4ZHIsIE9QX0NCX1JFQ0FMTCk7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIFJQQyBwcm9jZWR1cmUgdGFibGVzCisgKi8KKyNpZm5kZWYgTUFYCisjIGRlZmluZSBNQVgoYSwgYikgICAgICAoKChhKSA+IChiKSk/IChhKSA6IChiKSkKKyNlbmRpZgorCisjZGVmaW5lIFBST0MocHJvYywgY2FsbCwgYXJndHlwZSwgcmVzdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitbTkZTUFJPQzRfQ0xOVF8jI3Byb2NdID0geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCVwKKyAgICAgICAgLnBfcHJvYyAgID0gTkZTUFJPQzRfQ0JfIyNjYWxsLAkJCQkJXAorICAgICAgICAucF9lbmNvZGUgPSAoa3hkcnByb2NfdCkgbmZzNF94ZHJfIyNhcmd0eXBlLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAucF9kZWNvZGUgPSAoa3hkcnByb2NfdCkgbmZzNF94ZHJfIyNyZXN0eXBlLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAucF9idWZzaXogPSBNQVgoTkZTNF8jI2FyZ3R5cGUjI19zeixORlM0XyMjcmVzdHlwZSMjX3N6KSA8PCAyLCAgXAorfQorCitzdHJ1Y3QgcnBjX3Byb2NpbmZvICAgICBuZnM0X2NiX3Byb2NlZHVyZXNbXSA9IHsKKyAgICBQUk9DKENCX05VTEwsICAgICAgTlVMTCwgICAgIGVuY19jYl9udWxsLCAgICAgZGVjX2NiX251bGwpLAorICAgIFBST0MoQ0JfUkVDQUxMLCAgICBDT01QT1VORCwgICBlbmNfY2JfcmVjYWxsLCAgICAgIGRlY19jYl9yZWNhbGwpLAorfTsKKworc3RydWN0IHJwY192ZXJzaW9uICAgICAgICAgICAgICBuZnNfY2JfdmVyc2lvbjQgPSB7CisgICAgICAgIC5udW1iZXIgICAgICAgICAgICAgICAgID0gMSwKKyAgICAgICAgLm5ycHJvY3MgICAgICAgICAgICAgICAgPSBzaXplb2YobmZzNF9jYl9wcm9jZWR1cmVzKS9zaXplb2YobmZzNF9jYl9wcm9jZWR1cmVzWzBdKSwKKyAgICAgICAgLnByb2NzICAgICAgICAgICAgICAgICAgPSBuZnM0X2NiX3Byb2NlZHVyZXMKK307CisKK3N0YXRpYyBzdHJ1Y3QgcnBjX3ZlcnNpb24gKgluZnNfY2JfdmVyc2lvbltdID0geworCU5VTEwsCisJJm5mc19jYl92ZXJzaW9uNCwKK307CisKKy8qCisgKiBVc2UgdGhlIFNFVENMSUVOVElEIGNyZWRlbnRpYWwKKyAqLworc3RydWN0IHJwY19jcmVkICoKK25mc2Q0X2xvb2t1cGNyZWQoc3RydWN0IG5mczRfY2xpZW50ICpjbHAsIGludCB0YXNrZmxhZ3MpCit7CisgICAgICAgIHN0cnVjdCBhdXRoX2NyZWQgYWNyZWQ7CisJc3RydWN0IHJwY19jbG50ICpjbG50ID0gY2xwLT5jbF9jYWxsYmFjay5jYl9jbGllbnQ7CisJc3RydWN0IHJwY19jcmVkICpyZXQ7CisKKyAgICAgICAgZ2V0X2dyb3VwX2luZm8oY2xwLT5jbF9jcmVkLmNyX2dyb3VwX2luZm8pOworICAgICAgICBhY3JlZC51aWQgPSBjbHAtPmNsX2NyZWQuY3JfdWlkOworICAgICAgICBhY3JlZC5naWQgPSBjbHAtPmNsX2NyZWQuY3JfZ2lkOworICAgICAgICBhY3JlZC5ncm91cF9pbmZvID0gY2xwLT5jbF9jcmVkLmNyX2dyb3VwX2luZm87CisKKyAgICAgICAgZHByaW50aygiTkZTRDogICAgIGxvb2tpbmcgdXAgJXMgY3JlZFxuIiwKKyAgICAgICAgICAgICAgICBjbG50LT5jbF9hdXRoLT5hdV9vcHMtPmF1X25hbWUpOworICAgICAgICByZXQgPSBycGNhdXRoX2xvb2t1cF9jcmVkY2FjaGUoY2xudC0+Y2xfYXV0aCwgJmFjcmVkLCB0YXNrZmxhZ3MpOworICAgICAgICBwdXRfZ3JvdXBfaW5mbyhjbHAtPmNsX2NyZWQuY3JfZ3JvdXBfaW5mbyk7CisgICAgICAgIHJldHVybiByZXQ7Cit9CisKKy8qCisgKiBTZXQgdXAgdGhlIGNhbGxiYWNrIGNsaWVudCBhbmQgcHV0IGEgTkZTUFJPQzRfQ0JfTlVMTCBvbiB0aGUgd2lyZS4uLgorICovCit2b2lkCituZnNkNF9wcm9iZV9jYWxsYmFjayhzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4JYWRkcjsKKwlzdHJ1Y3QgbmZzNF9jYWxsYmFjayAgICAqY2IgPSAmY2xwLT5jbF9jYWxsYmFjazsKKwlzdHJ1Y3QgcnBjX3RpbWVvdXQJdGltZXBhcm1zOworCXN0cnVjdCBycGNfeHBydCAqCXhwcnQ7CisJc3RydWN0IHJwY19wcm9ncmFtICoJcHJvZ3JhbSA9ICZjYi0+Y2JfcHJvZ3JhbTsKKwlzdHJ1Y3QgcnBjX3N0YXQgKglzdGF0ID0gJmNiLT5jYl9zdGF0OworCXN0cnVjdCBycGNfY2xudCAqCWNsbnQ7CisJc3RydWN0IHJwY19tZXNzYWdlIG1zZyA9IHsKKwkJLnJwY19wcm9jICAgICAgID0gJm5mczRfY2JfcHJvY2VkdXJlc1tORlNQUk9DNF9DTE5UX0NCX05VTExdLAorCQkucnBjX2FyZ3AgICAgICAgPSBjbHAsCisJfTsKKwljaGFyICAgICAgICAgICAgICAgICAgICBob3N0bmFtZVszMl07CisJaW50IHN0YXR1czsKKworCWRwcmludGsoIk5GU0Q6IHByb2JlX2NhbGxiYWNrLiBjYl9wYXJzZWQgJWQgY2Jfc2V0ICVkXG4iLAorCQkJY2ItPmNiX3BhcnNlZCwgYXRvbWljX3JlYWQoJmNiLT5jYl9zZXQpKTsKKwlpZiAoIWNiLT5jYl9wYXJzZWQgfHwgYXRvbWljX3JlYWQoJmNiLT5jYl9zZXQpKQorCQlyZXR1cm47CisKKwkvKiBJbml0aWFsaXplIGFkZHJlc3MgKi8KKwltZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisJYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlhZGRyLnNpbl9wb3J0ID0gaHRvbnMoY2ItPmNiX3BvcnQpOworCWFkZHIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoY2ItPmNiX2FkZHIpOworCisJLyogSW5pdGlhbGl6ZSB0aW1lb3V0ICovCisJdGltZXBhcm1zLnRvX2luaXR2YWwgPSAoTkZTRF9MRUFTRV9USU1FLzQpICogSFo7CisJdGltZXBhcm1zLnRvX3JldHJpZXMgPSAwOworCXRpbWVwYXJtcy50b19tYXh2YWwgPSAoTkZTRF9MRUFTRV9USU1FLzIpICogSFo7CisJdGltZXBhcm1zLnRvX2V4cG9uZW50aWFsID0gMTsKKworCS8qIENyZWF0ZSBSUEMgdHJhbnNwb3J0ICovCisJaWYgKCEoeHBydCA9IHhwcnRfY3JlYXRlX3Byb3RvKElQUFJPVE9fVENQLCAmYWRkciwgJnRpbWVwYXJtcykpKSB7CisJCWRwcmludGsoIk5GU0Q6IGNvdWxkbid0IGNyZWF0ZSBjYWxsYmFjayB0cmFuc3BvcnQhXG4iKTsKKwkJZ290byBvdXRfZXJyOworCX0KKworCS8qIEluaXRpYWxpemUgcnBjX3Byb2dyYW0gKi8KKwlwcm9ncmFtLT5uYW1lID0gIm5mczRfY2IiOworCXByb2dyYW0tPm51bWJlciA9IGNiLT5jYl9wcm9nOworCXByb2dyYW0tPm5ydmVycyA9IHNpemVvZihuZnNfY2JfdmVyc2lvbikvc2l6ZW9mKG5mc19jYl92ZXJzaW9uWzBdKTsKKwlwcm9ncmFtLT52ZXJzaW9uID0gbmZzX2NiX3ZlcnNpb247CisJcHJvZ3JhbS0+c3RhdHMgPSBzdGF0OworCisJLyogSW5pdGlhbGl6ZSBycGNfc3RhdCAqLworCW1lbXNldChzdGF0LCAwLCBzaXplb2Yoc3RydWN0IHJwY19zdGF0KSk7CisJc3RhdC0+cHJvZ3JhbSA9IHByb2dyYW07CisKKwkvKiBDcmVhdGUgUlBDIGNsaWVudAorIAkgKgorCSAqIFhYWCBBVVRIX1VOSVggb25seSAtIG5lZWQgQVVUSF9HU1MuLi4uCisJICovCisJc3ByaW50Zihob3N0bmFtZSwgIiV1LiV1LiV1LiV1IiwgTklQUVVBRChhZGRyLnNpbl9hZGRyLnNfYWRkcikpOworCWlmICghKGNsbnQgPSBycGNfY3JlYXRlX2NsaWVudCh4cHJ0LCBob3N0bmFtZSwgcHJvZ3JhbSwgMSwgUlBDX0FVVEhfVU5JWCkpKSB7CisJCWRwcmludGsoIk5GU0Q6IGNvdWxkbid0IGNyZWF0ZSBjYWxsYmFjayBjbGllbnRcbiIpOworCQlnb3RvIG91dF94cHJ0OworCX0KKwljbG50LT5jbF9pbnRyID0gMDsKKwljbG50LT5jbF9zb2Z0cnRyeSA9IDE7CisJY2xudC0+Y2xfY2hhdHR5ID0gMTsKKworCS8qIEtpY2sgcnBjaW9kLCBwdXQgdGhlIGNhbGwgb24gdGhlIHdpcmUuICovCisKKwlpZiAocnBjaW9kX3VwKCkgIT0gMCkgeworCQlkcHJpbnRrKCJuZnNkOiBjb3VsZG4ndCBzdGFydCBycGNpb2QgZm9yIGNhbGxiYWNrcyFcbiIpOworCQlnb3RvIG91dF9jbG50OworCX0KKworCS8qIHRoZSB0YXNrIGhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZSBuZnM0X2NsaWVudCBzdHJ1Y3QgKi8KKwljYi0+Y2JfY2xpZW50ID0gY2xudDsKKwlhdG9taWNfaW5jKCZjbHAtPmNsX2NvdW50KTsKKworCW1zZy5ycGNfY3JlZCA9IG5mc2Q0X2xvb2t1cGNyZWQoY2xwLDApOworCWlmIChJU19FUlIobXNnLnJwY19jcmVkKSkKKwkJZ290byBvdXRfcnBjaW9kOworCXN0YXR1cyA9IHJwY19jYWxsX2FzeW5jKGNsbnQsICZtc2csIFJQQ19UQVNLX0FTWU5DLCBuZnM0X2NiX251bGwsIE5VTEwpOworCXB1dF9ycGNjcmVkKG1zZy5ycGNfY3JlZCk7CisKKwlpZiAoc3RhdHVzICE9IDApIHsKKwkJZHByaW50aygiTkZTRDogYXN5bmNocm9ub3VzIE5GU1BST0M0X0NCX05VTEwgZmFpbGVkIVxuIik7CisJCWdvdG8gb3V0X3JwY2lvZDsKKwl9CisJcmV0dXJuOworCitvdXRfcnBjaW9kOgorCWF0b21pY19kZWMoJmNscC0+Y2xfY291bnQpOworCXJwY2lvZF9kb3duKCk7CitvdXRfY2xudDoKKwlycGNfc2h1dGRvd25fY2xpZW50KGNsbnQpOworCWdvdG8gb3V0X2VycjsKK291dF94cHJ0OgorCXhwcnRfZGVzdHJveSh4cHJ0KTsKK291dF9lcnI6CisJZHByaW50aygiTkZTRDogd2FybmluZzogbm8gY2FsbGJhY2sgcGF0aCB0byBjbGllbnQgJS4qc1xuIiwKKwkJKGludCljbHAtPmNsX25hbWUubGVuLCBjbHAtPmNsX25hbWUuZGF0YSk7CisJY2ItPmNiX2NsaWVudCA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCituZnM0X2NiX251bGwoc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwID0gKHN0cnVjdCBuZnM0X2NsaWVudCAqKXRhc2stPnRrX21zZy5ycGNfYXJncDsKKwlzdHJ1Y3QgbmZzNF9jYWxsYmFjayAqY2IgPSAmY2xwLT5jbF9jYWxsYmFjazsKKwl1MzIgYWRkciA9IGh0b25sKGNiLT5jYl9hZGRyKTsKKworCWRwcmludGsoIk5GU0Q6IG5mczRfY2JfbnVsbCB0YXNrLT50a19zdGF0dXMgJWRcbiIsIHRhc2stPnRrX3N0YXR1cyk7CisKKwlpZiAodGFzay0+dGtfc3RhdHVzIDwgMCkgeworCQlkcHJpbnRrKCJORlNEOiBjYWxsYmFjayBlc3RhYmxpc2htZW50IHRvIGNsaWVudCAlLipzIGZhaWxlZFxuIiwKKwkJCShpbnQpY2xwLT5jbF9uYW1lLmxlbiwgY2xwLT5jbF9uYW1lLmRhdGEpOworCQlnb3RvIG91dDsKKwl9CisJYXRvbWljX3NldCgmY2ItPmNiX3NldCwgMSk7CisJZHByaW50aygiTkZTRDogY2FsbGJhY2sgc2V0IHRvIGNsaWVudCAldS4ldS4ldS4ldVxuIiwgTklQUVVBRChhZGRyKSk7CitvdXQ6CisJcHV0X25mczRfY2xpZW50KGNscCk7Cit9CisKKy8qCisgKiBjYWxsZWQgd2l0aCBkcC0+ZGxfY291bnQgaW5jJ2VkLgorICogbmZzNF9sb2NrX3N0YXRlKCkgbWF5IG9yIG1heSBub3QgaGF2ZSBiZWVuIGNhbGxlZC4KKyAqLwordm9pZAorbmZzZDRfY2JfcmVjYWxsKHN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKmRwKQoreworCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwID0gZHAtPmRsX2NsaWVudDsKKwlzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQgPSBjbHAtPmNsX2NhbGxiYWNrLmNiX2NsaWVudDsKKwlzdHJ1Y3QgbmZzNF9jYl9yZWNhbGwgKmNiciA9ICZkcC0+ZGxfcmVjYWxsOworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfcHJvYyA9ICZuZnM0X2NiX3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9DQl9SRUNBTExdLAorCQkucnBjX2FyZ3AgPSBjYnIsCisJfTsKKwlpbnQgcmV0cmllcyA9IDE7CisJaW50IHN0YXR1cyA9IDA7CisKKwlpZiAoKCFhdG9taWNfcmVhZCgmY2xwLT5jbF9jYWxsYmFjay5jYl9zZXQpKSB8fCAhY2xudCkKKwkJcmV0dXJuOworCisJbXNnLnJwY19jcmVkID0gbmZzZDRfbG9va3VwY3JlZChjbHAsIDApOworCWlmIChJU19FUlIobXNnLnJwY19jcmVkKSkKKwkJZ290byBvdXQ7CisKKwljYnItPmNicl90cnVuYyA9IDA7IC8qIFhYWCBuZWVkIHRvIGltcGxlbWVudCB0cnVuY2F0ZSBvcHRpbWl6YXRpb24gKi8KKwljYnItPmNicl9kcCA9IGRwOworCisJc3RhdHVzID0gcnBjX2NhbGxfc3luYyhjbG50LCAmbXNnLCBSUENfVEFTS19TT0ZUKTsKKwl3aGlsZSAocmV0cmllcy0tKSB7CisJCXN3aXRjaCAoc3RhdHVzKSB7CisJCQljYXNlIC1FSU86CisJCQkJLyogTmV0d29yayBwYXJ0aXRpb24/ICovCisJCQljYXNlIC1FQkFESEFORExFOgorCQkJY2FzZSAtTkZTNEVSUl9CQURfU1RBVEVJRDoKKwkJCQkvKiBSYWNlOiBjbGllbnQgcHJvYmFibHkgZ290IGNiX3JlY2FsbAorCQkJCSAqIGJlZm9yZSBvcGVuIHJlcGx5IGdyYW50aW5nIGRlbGVnYXRpb24gKi8KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZ290byBvdXRfcHV0X2NyZWQ7CisJCX0KKwkJc3NsZWVwKDIpOworCQlzdGF0dXMgPSBycGNfY2FsbF9zeW5jKGNsbnQsICZtc2csIFJQQ19UQVNLX1NPRlQpOworCX0KK291dF9wdXRfY3JlZDoKKwlwdXRfcnBjY3JlZChtc2cucnBjX2NyZWQpOworb3V0OgorCWlmIChzdGF0dXMgPT0gLUVJTykKKwkJYXRvbWljX3NldCgmY2xwLT5jbF9jYWxsYmFjay5jYl9zZXQsIDApOworCS8qIFN1Y2Nlc3Mgb3IgZmFpbHVyZSwgbm93IHdlJ3JlIGVpdGhlciB3YWl0aW5nIGZvciBsZWFzZSBleHBpcmF0aW9uCisJICogb3IgZGVsZWdfcmV0dXJuLiAqLworCWRwcmludGsoIk5GU0Q6IG5mczRfY2JfcmVjYWxsOiBkcCAlcCBkbF9mbG9jayAlcCBkbF9jb3VudCAlZFxuIixkcCwgZHAtPmRsX2Zsb2NrLCBhdG9taWNfcmVhZCgmZHAtPmRsX2NvdW50KSk7CisJbmZzNF9wdXRfZGVsZWdhdGlvbihkcCk7CisJcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0aWRtYXAuYyBiL2ZzL25mc2QvbmZzNGlkbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJhNTQwOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25mc2QvbmZzNGlkbWFwLmMKQEAgLTAsMCArMSw1ODggQEAKKy8qCisgKiAgZnMvbmZzZC9uZnM0aWRtYXAuYworICoKKyAqICBNYXBwaW5nIG9mIFVJRC9HSURzIHRvIG5hbWUgYW5kIHZpY2UgdmVyc2EuCisgKgorICogIENvcHlyaWdodCAoYykgMjAwMiwgMjAwMyBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZgorICogIE1pY2hpZ2FuLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgTWFyaXVzIEFhbW9kdCBFcmlrc2VuIDxtYXJpdXNAdW1pY2guZWR1PgorICoKKyAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqICBhcmUgbWV0OgorICoKKyAqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiAgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqICBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqICBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqICBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorICogIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CisjaW5jbHVkZSA8bGludXgvbmZzLmg+CisjaW5jbHVkZSA8bGludXgvbmZzNC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19wYWdlLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkX2lkbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Y2F1dGguaD4KKworLyoKKyAqIENhY2hlIGVudHJ5CisgKi8KKworLyoKKyAqIFhYWCB3ZSBrbm93IHRoYXQgSURNQVBfTkFNRVNaIDwgUEFHRV9TSVpFLCBidXQgaXQncyB1Z2x5IHRvIHJlbHkgb24KKyAqIHRoYXQuCisgKi8KKworI2RlZmluZSBJRE1BUF9UWVBFX1VTRVIgIDAKKyNkZWZpbmUgSURNQVBfVFlQRV9HUk9VUCAxCisKK3N0cnVjdCBlbnQgeworCXN0cnVjdCBjYWNoZV9oZWFkIGg7CisJaW50ICAgICAgICAgICAgICAgdHlwZTsJCSAgICAgICAvKiBVc2VyIC8gR3JvdXAgKi8KKwl1aWRfdCAgICAgICAgICAgICBpZDsKKwljaGFyICAgICAgICAgICAgICBuYW1lW0lETUFQX05BTUVTWl07CisJY2hhciAgICAgICAgICAgICAgYXV0aG5hbWVbSURNQVBfTkFNRVNaXTsKK307CisKKyNkZWZpbmUgRGVmaW5lU2ltcGxlQ2FjaGVMb29rdXBNYXAoU1RSVUNULCBGVU5DKQkJCVwKKyAgICAgICAgRGVmaW5lQ2FjaGVMb29rdXAoc3RydWN0IFNUUlVDVCwgaCwgRlVOQyMjX2xvb2t1cCwJCVwKKyAgICAgICAgKHN0cnVjdCBTVFJVQ1QgKml0ZW0sIGludCBzZXQpLCAvKm5vIHNldHVwICovLAkJCVwKKwkmIEZVTkMjI19jYWNoZSwgRlVOQyMjX2hhc2goaXRlbSksIEZVTkMjI19tYXRjaChpdGVtLCB0bXApLAlcCisJU1RSVUNUIyNfaW5pdChuZXcsIGl0ZW0pLCBTVFJVQ1QjI191cGRhdGUodG1wLCBpdGVtKSwgMCkKKworLyogQ29tbW9uIGVudHJ5IGhhbmRsaW5nICovCisKKyNkZWZpbmUgRU5UX0hBU0hCSVRTICAgICAgICAgIDgKKyNkZWZpbmUgRU5UX0hBU0hNQVggICAgICAgICAgICgxIDw8IEVOVF9IQVNIQklUUykKKyNkZWZpbmUgRU5UX0hBU0hNQVNLICAgICAgICAgIChFTlRfSEFTSE1BWCAtIDEpCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZW50X2luaXQoc3RydWN0IGVudCAqbmV3LCBzdHJ1Y3QgZW50ICppdG0pCit7CisJbmV3LT5pZCA9IGl0bS0+aWQ7CisJbmV3LT50eXBlID0gaXRtLT50eXBlOworCisJc3RybGNweShuZXctPm5hbWUsIGl0bS0+bmFtZSwgc2l6ZW9mKG5ldy0+bmFtZSkpOworCXN0cmxjcHkobmV3LT5hdXRobmFtZSwgaXRtLT5hdXRobmFtZSwgc2l6ZW9mKG5ldy0+bmFtZSkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2VudF91cGRhdGUoc3RydWN0IGVudCAqbmV3LCBzdHJ1Y3QgZW50ICppdG0pCit7CisJZW50X2luaXQobmV3LCBpdG0pOworfQorCit2b2lkCitlbnRfcHV0KHN0cnVjdCBjYWNoZV9oZWFkICpjaCwgc3RydWN0IGNhY2hlX2RldGFpbCAqY2QpCit7CisJaWYgKGNhY2hlX3B1dChjaCwgY2QpKSB7CisJCXN0cnVjdCBlbnQgKm1hcCA9IGNvbnRhaW5lcl9vZihjaCwgc3RydWN0IGVudCwgaCk7CisJCWtmcmVlKG1hcCk7CisJfQorfQorCisvKgorICogSUQgLT4gTmFtZSBjYWNoZQorICovCisKK3N0YXRpYyBzdHJ1Y3QgY2FjaGVfaGVhZCAqaWR0b25hbWVfdGFibGVbRU5UX0hBU0hNQVhdOworCitzdGF0aWMgdWludDMyX3QKK2lkdG9uYW1lX2hhc2goc3RydWN0IGVudCAqZW50KQoreworCXVpbnQzMl90IGhhc2g7CisKKwloYXNoID0gaGFzaF9zdHIoZW50LT5hdXRobmFtZSwgRU5UX0hBU0hCSVRTKTsKKwloYXNoID0gaGFzaF9sb25nKGhhc2ggXiBlbnQtPmlkLCBFTlRfSEFTSEJJVFMpOworCisJLyogRmxpcCBMU0IgZm9yIHVzZXIvZ3JvdXAgKi8KKwlpZiAoZW50LT50eXBlID09IElETUFQX1RZUEVfR1JPVVApCisJCWhhc2ggXj0gMTsKKworCXJldHVybiBoYXNoOworfQorCitzdGF0aWMgdm9pZAoraWR0b25hbWVfcmVxdWVzdChzdHJ1Y3QgY2FjaGVfZGV0YWlsICpjZCwgc3RydWN0IGNhY2hlX2hlYWQgKmNoLCBjaGFyICoqYnBwLAorICAgIGludCAqYmxlbikKK3sKKyAJc3RydWN0IGVudCAqZW50ID0gY29udGFpbmVyX29mKGNoLCBzdHJ1Y3QgZW50LCBoKTsKKwljaGFyIGlkc3RyWzExXTsKKworCXF3b3JkX2FkZChicHAsIGJsZW4sIGVudC0+YXV0aG5hbWUpOworCXNucHJpbnRmKGlkc3RyLCBzaXplb2YoaWRzdHIpLCAiJWQiLCBlbnQtPmlkKTsKKwlxd29yZF9hZGQoYnBwLCBibGVuLCBlbnQtPnR5cGUgPT0gSURNQVBfVFlQRV9HUk9VUCA/ICJncm91cCIgOiAidXNlciIpOworCXF3b3JkX2FkZChicHAsIGJsZW4sIGlkc3RyKTsKKworCSgqYnBwKVstMV0gPSAnXG4nOworfQorCitzdGF0aWMgaW5saW5lIGludAoraWR0b25hbWVfbWF0Y2goc3RydWN0IGVudCAqYSwgc3RydWN0IGVudCAqYikKK3sKKwlyZXR1cm4gKGEtPmlkID09IGItPmlkICYmIGEtPnR5cGUgPT0gYi0+dHlwZSAmJgorCSAgICBzdHJjbXAoYS0+YXV0aG5hbWUsIGItPmF1dGhuYW1lKSA9PSAwKTsKK30KKworc3RhdGljIGludAoraWR0b25hbWVfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBjYWNoZV9kZXRhaWwgKmNkLCBzdHJ1Y3QgY2FjaGVfaGVhZCAqaCkKK3sKKwlzdHJ1Y3QgZW50ICplbnQ7CisKKwlpZiAoaCA9PSBOVUxMKSB7CisJCXNlcV9wdXRzKG0sICIjZG9tYWluIHR5cGUgaWQgW25hbWVdXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWVudCA9IGNvbnRhaW5lcl9vZihoLCBzdHJ1Y3QgZW50LCBoKTsKKwlzZXFfcHJpbnRmKG0sICIlcyAlcyAlZCIsIGVudC0+YXV0aG5hbWUsCisJCQllbnQtPnR5cGUgPT0gSURNQVBfVFlQRV9HUk9VUCA/ICJncm91cCIgOiAidXNlciIsCisJCQllbnQtPmlkKTsKKwlpZiAodGVzdF9iaXQoQ0FDSEVfVkFMSUQsICZoLT5mbGFncykpCisJCXNlcV9wcmludGYobSwgIiAlcyIsIGVudC0+bmFtZSk7CisJc2VxX3ByaW50ZihtLCAiXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3dhcm5fbm9faWRtYXBkKHN0cnVjdCBjYWNoZV9kZXRhaWwgKmRldGFpbCkKK3sKKwlwcmludGsoIm5mc2Q6IG5mc3Y0IGlkbWFwcGluZyBmYWlsaW5nOiBoYXMgaWRtYXBkICVzP1xuIiwKKwkJCWRldGFpbC0+bGFzdF9jbG9zZT8gImRpZWQiIDogIm5vdCBiZWVuIHN0YXJ0ZWQiKTsKK30KKworCitzdGF0aWMgaW50ICAgICAgICAgaWR0b25hbWVfcGFyc2Uoc3RydWN0IGNhY2hlX2RldGFpbCAqLCBjaGFyICosIGludCk7CitzdGF0aWMgc3RydWN0IGVudCAqaWR0b25hbWVfbG9va3VwKHN0cnVjdCBlbnQgKiwgaW50KTsKKworc3RydWN0IGNhY2hlX2RldGFpbCBpZHRvbmFtZV9jYWNoZSA9IHsKKwkuaGFzaF9zaXplCT0gRU5UX0hBU0hNQVgsCisJLmhhc2hfdGFibGUJPSBpZHRvbmFtZV90YWJsZSwKKwkubmFtZQkJPSAibmZzNC5pZHRvbmFtZSIsCisJLmNhY2hlX3B1dAk9IGVudF9wdXQsCisJLmNhY2hlX3JlcXVlc3QJPSBpZHRvbmFtZV9yZXF1ZXN0LAorCS5jYWNoZV9wYXJzZQk9IGlkdG9uYW1lX3BhcnNlLAorCS5jYWNoZV9zaG93CT0gaWR0b25hbWVfc2hvdywKKwkud2Fybl9ub19saXN0ZW5lciA9IHdhcm5fbm9faWRtYXBkLAorfTsKKworaW50CitpZHRvbmFtZV9wYXJzZShzdHJ1Y3QgY2FjaGVfZGV0YWlsICpjZCwgY2hhciAqYnVmLCBpbnQgYnVmbGVuKQoreworCXN0cnVjdCBlbnQgZW50LCAqcmVzOworCWNoYXIgKmJ1ZjEsICpicDsKKwlpbnQgZXJyb3IgPSAtRUlOVkFMOworCisJaWYgKGJ1ZltidWZsZW4gLSAxXSAhPSAnXG4nKQorCQlyZXR1cm4gKC1FSU5WQUwpOworCWJ1ZltidWZsZW4gLSAxXT0gJ1wwJzsKKworCWJ1ZjEgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKGJ1ZjEgPT0gTlVMTCkKKwkJcmV0dXJuICgtRU5PTUVNKTsKKworCW1lbXNldCgmZW50LCAwLCBzaXplb2YoZW50KSk7CisKKwkvKiBBdXRoZW50aWNhdGlvbiBuYW1lICovCisJaWYgKHF3b3JkX2dldCgmYnVmLCBidWYxLCBQQUdFX1NJWkUpIDw9IDApCisJCWdvdG8gb3V0OworCW1lbWNweShlbnQuYXV0aG5hbWUsIGJ1ZjEsIHNpemVvZihlbnQuYXV0aG5hbWUpKTsKKworCS8qIFR5cGUgKi8KKwlpZiAocXdvcmRfZ2V0KCZidWYsIGJ1ZjEsIFBBR0VfU0laRSkgPD0gMCkKKwkJZ290byBvdXQ7CisJZW50LnR5cGUgPSBzdHJjbXAoYnVmMSwgInVzZXIiKSA9PSAwID8KKwkJSURNQVBfVFlQRV9VU0VSIDogSURNQVBfVFlQRV9HUk9VUDsKKworCS8qIElEICovCisJaWYgKHF3b3JkX2dldCgmYnVmLCBidWYxLCBQQUdFX1NJWkUpIDw9IDApCisJCWdvdG8gb3V0OworCWVudC5pZCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZjEsICZicCwgMTApOworCWlmIChicCA9PSBidWYxKQorCQlnb3RvIG91dDsKKworCS8qIGV4cGlyeSAqLworCWVudC5oLmV4cGlyeV90aW1lID0gZ2V0X2V4cGlyeSgmYnVmKTsKKwlpZiAoZW50LmguZXhwaXJ5X3RpbWUgPT0gMCkKKwkJZ290byBvdXQ7CisKKwkvKiBOYW1lICovCisJZXJyb3IgPSBxd29yZF9nZXQoJmJ1ZiwgYnVmMSwgUEFHRV9TSVpFKTsKKwlpZiAoZXJyb3IgPT0gLUVJTlZBTCkKKwkJZ290byBvdXQ7CisJaWYgKGVycm9yID09IC1FTk9FTlQpCisJCXNldF9iaXQoQ0FDSEVfTkVHQVRJVkUsICZlbnQuaC5mbGFncyk7CisJZWxzZSB7CisJCWlmIChlcnJvciA+PSBJRE1BUF9OQU1FU1opIHsKKwkJCWVycm9yID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisJCW1lbWNweShlbnQubmFtZSwgYnVmMSwgc2l6ZW9mKGVudC5uYW1lKSk7CisJfQorCWVycm9yID0gLUVOT01FTTsKKwlpZiAoKHJlcyA9IGlkdG9uYW1lX2xvb2t1cCgmZW50LCAxKSkgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwllbnRfcHV0KCZyZXMtPmgsICZpZHRvbmFtZV9jYWNoZSk7CisKKwllcnJvciA9IDA7CitvdXQ6CisJa2ZyZWUoYnVmMSk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBEZWZpbmVTaW1wbGVDYWNoZUxvb2t1cE1hcChlbnQsIGlkdG9uYW1lKTsKKworLyoKKyAqIE5hbWUgLT4gSUQgY2FjaGUKKyAqLworCitzdGF0aWMgc3RydWN0IGNhY2hlX2hlYWQgKm5hbWV0b2lkX3RhYmxlW0VOVF9IQVNITUFYXTsKKworc3RhdGljIGlubGluZSBpbnQKK25hbWV0b2lkX2hhc2goc3RydWN0IGVudCAqZW50KQoreworCXJldHVybiBoYXNoX3N0cihlbnQtPm5hbWUsIEVOVF9IQVNIQklUUyk7Cit9CisKK3ZvaWQKK25hbWV0b2lkX3JlcXVlc3Qoc3RydWN0IGNhY2hlX2RldGFpbCAqY2QsIHN0cnVjdCBjYWNoZV9oZWFkICpjaCwgY2hhciAqKmJwcCwKKyAgICBpbnQgKmJsZW4pCit7CisgCXN0cnVjdCBlbnQgKmVudCA9IGNvbnRhaW5lcl9vZihjaCwgc3RydWN0IGVudCwgaCk7CisKKwlxd29yZF9hZGQoYnBwLCBibGVuLCBlbnQtPmF1dGhuYW1lKTsKKwlxd29yZF9hZGQoYnBwLCBibGVuLCBlbnQtPnR5cGUgPT0gSURNQVBfVFlQRV9HUk9VUCA/ICJncm91cCIgOiAidXNlciIpOworCXF3b3JkX2FkZChicHAsIGJsZW4sIGVudC0+bmFtZSk7CisKKwkoKmJwcClbLTFdID0gJ1xuJzsKK30KKworc3RhdGljIGlubGluZSBpbnQKK25hbWV0b2lkX21hdGNoKHN0cnVjdCBlbnQgKmEsIHN0cnVjdCBlbnQgKmIpCit7CisJcmV0dXJuIChhLT50eXBlID09IGItPnR5cGUgJiYgc3RyY21wKGEtPm5hbWUsIGItPm5hbWUpID09IDAgJiYKKwkgICAgc3RyY21wKGEtPmF1dGhuYW1lLCBiLT5hdXRobmFtZSkgPT0gMCk7Cit9CisKK3N0YXRpYyBpbnQKK25hbWV0b2lkX3Nob3coc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgY2FjaGVfZGV0YWlsICpjZCwgc3RydWN0IGNhY2hlX2hlYWQgKmgpCit7CisJc3RydWN0IGVudCAqZW50OworCisJaWYgKGggPT0gTlVMTCkgeworCQlzZXFfcHV0cyhtLCAiI2RvbWFpbiB0eXBlIG5hbWUgW2lkXVxuIik7CisJCXJldHVybiAwOworCX0KKwllbnQgPSBjb250YWluZXJfb2YoaCwgc3RydWN0IGVudCwgaCk7CisJc2VxX3ByaW50ZihtLCAiJXMgJXMgJXMiLCBlbnQtPmF1dGhuYW1lLAorCQkJZW50LT50eXBlID09IElETUFQX1RZUEVfR1JPVVAgPyAiZ3JvdXAiIDogInVzZXIiLAorCQkJZW50LT5uYW1lKTsKKwlpZiAodGVzdF9iaXQoQ0FDSEVfVkFMSUQsICZoLT5mbGFncykpCisJCXNlcV9wcmludGYobSwgIiAlZCIsIGVudC0+aWQpOworCXNlcV9wcmludGYobSwgIlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZW50ICpuYW1ldG9pZF9sb29rdXAoc3RydWN0IGVudCAqLCBpbnQpOworaW50ICAgICAgICAgICAgICAgIG5hbWV0b2lkX3BhcnNlKHN0cnVjdCBjYWNoZV9kZXRhaWwgKiwgY2hhciAqLCBpbnQpOworCitzdHJ1Y3QgY2FjaGVfZGV0YWlsIG5hbWV0b2lkX2NhY2hlID0geworCS5oYXNoX3NpemUJPSBFTlRfSEFTSE1BWCwKKwkuaGFzaF90YWJsZQk9IG5hbWV0b2lkX3RhYmxlLAorCS5uYW1lCQk9ICJuZnM0Lm5hbWV0b2lkIiwKKwkuY2FjaGVfcHV0CT0gZW50X3B1dCwKKwkuY2FjaGVfcmVxdWVzdAk9IG5hbWV0b2lkX3JlcXVlc3QsCisJLmNhY2hlX3BhcnNlCT0gbmFtZXRvaWRfcGFyc2UsCisJLmNhY2hlX3Nob3cJPSBuYW1ldG9pZF9zaG93LAorCS53YXJuX25vX2xpc3RlbmVyID0gd2Fybl9ub19pZG1hcGQsCit9OworCitpbnQKK25hbWV0b2lkX3BhcnNlKHN0cnVjdCBjYWNoZV9kZXRhaWwgKmNkLCBjaGFyICpidWYsIGludCBidWZsZW4pCit7CisJc3RydWN0IGVudCBlbnQsICpyZXM7CisJY2hhciAqYnVmMTsKKwlpbnQgZXJyb3IgPSAtRUlOVkFMOworCisJaWYgKGJ1ZltidWZsZW4gLSAxXSAhPSAnXG4nKQorCQlyZXR1cm4gKC1FSU5WQUwpOworCWJ1ZltidWZsZW4gLSAxXT0gJ1wwJzsKKworCWJ1ZjEgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKGJ1ZjEgPT0gTlVMTCkKKwkJcmV0dXJuICgtRU5PTUVNKTsKKworCW1lbXNldCgmZW50LCAwLCBzaXplb2YoZW50KSk7CisKKwkvKiBBdXRoZW50aWNhdGlvbiBuYW1lICovCisJaWYgKHF3b3JkX2dldCgmYnVmLCBidWYxLCBQQUdFX1NJWkUpIDw9IDApCisJCWdvdG8gb3V0OworCW1lbWNweShlbnQuYXV0aG5hbWUsIGJ1ZjEsIHNpemVvZihlbnQuYXV0aG5hbWUpKTsKKworCS8qIFR5cGUgKi8KKwlpZiAocXdvcmRfZ2V0KCZidWYsIGJ1ZjEsIFBBR0VfU0laRSkgPD0gMCkKKwkJZ290byBvdXQ7CisJZW50LnR5cGUgPSBzdHJjbXAoYnVmMSwgInVzZXIiKSA9PSAwID8KKwkJSURNQVBfVFlQRV9VU0VSIDogSURNQVBfVFlQRV9HUk9VUDsKKworCS8qIE5hbWUgKi8KKwllcnJvciA9IHF3b3JkX2dldCgmYnVmLCBidWYxLCBQQUdFX1NJWkUpOworCWlmIChlcnJvciA8PSAwIHx8IGVycm9yID49IElETUFQX05BTUVTWikKKwkJZ290byBvdXQ7CisJbWVtY3B5KGVudC5uYW1lLCBidWYxLCBzaXplb2YoZW50Lm5hbWUpKTsKKworCS8qIGV4cGlyeSAqLworCWVudC5oLmV4cGlyeV90aW1lID0gZ2V0X2V4cGlyeSgmYnVmKTsKKwlpZiAoZW50LmguZXhwaXJ5X3RpbWUgPT0gMCkKKwkJZ290byBvdXQ7CisKKwkvKiBJRCAqLworCWVycm9yID0gZ2V0X2ludCgmYnVmLCAmZW50LmlkKTsKKwlpZiAoZXJyb3IgPT0gLUVJTlZBTCkKKwkJZ290byBvdXQ7CisJaWYgKGVycm9yID09IC1FTk9FTlQpCisJCXNldF9iaXQoQ0FDSEVfTkVHQVRJVkUsICZlbnQuaC5mbGFncyk7CisKKwllcnJvciA9IC1FTk9NRU07CisJaWYgKChyZXMgPSBuYW1ldG9pZF9sb29rdXAoJmVudCwgMSkpID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJZW50X3B1dCgmcmVzLT5oLCAmbmFtZXRvaWRfY2FjaGUpOworCWVycm9yID0gMDsKK291dDoKKwlrZnJlZShidWYxKTsKKworCXJldHVybiAoZXJyb3IpOworfQorCitzdGF0aWMgRGVmaW5lU2ltcGxlQ2FjaGVMb29rdXBNYXAoZW50LCBuYW1ldG9pZCk7CisKKy8qCisgKiBFeHBvcnRlZCBBUEkKKyAqLworCit2b2lkCituZnNkX2lkbWFwX2luaXQodm9pZCkKK3sKKwljYWNoZV9yZWdpc3RlcigmaWR0b25hbWVfY2FjaGUpOworCWNhY2hlX3JlZ2lzdGVyKCZuYW1ldG9pZF9jYWNoZSk7Cit9CisKK3ZvaWQKK25mc2RfaWRtYXBfc2h1dGRvd24odm9pZCkKK3sKKwljYWNoZV91bnJlZ2lzdGVyKCZpZHRvbmFtZV9jYWNoZSk7CisJY2FjaGVfdW5yZWdpc3RlcigmbmFtZXRvaWRfY2FjaGUpOworfQorCisvKgorICogRGVmZXJyZWQgcmVxdWVzdCBoYW5kbGluZworICovCisKK3N0cnVjdCBpZG1hcF9kZWZlcl9yZXEgeworICAgICAgIHN0cnVjdCBjYWNoZV9yZXEJCXJlcTsKKyAgICAgICBzdHJ1Y3QgY2FjaGVfZGVmZXJyZWRfcmVxIGRlZmVycmVkX3JlcTsKKyAgICAgICB3YWl0X3F1ZXVlX2hlYWRfdAl3YWl0cTsKKyAgICAgICBhdG9taWNfdAkJCWNvdW50OworfTsKKworc3RhdGljIGlubGluZSB2b2lkCitwdXRfbWRyKHN0cnVjdCBpZG1hcF9kZWZlcl9yZXEgKm1kcikKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmbWRyLT5jb3VudCkpCisJCWtmcmVlKG1kcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZ2V0X21kcihzdHJ1Y3QgaWRtYXBfZGVmZXJfcmVxICptZHIpCit7CisJYXRvbWljX2luYygmbWRyLT5jb3VudCk7Cit9CisKK3N0YXRpYyB2b2lkCitpZG1hcF9yZXZpc2l0KHN0cnVjdCBjYWNoZV9kZWZlcnJlZF9yZXEgKmRyZXEsIGludCB0b29tYW55KQoreworCXN0cnVjdCBpZG1hcF9kZWZlcl9yZXEgKm1kciA9CisJCWNvbnRhaW5lcl9vZihkcmVxLCBzdHJ1Y3QgaWRtYXBfZGVmZXJfcmVxLCBkZWZlcnJlZF9yZXEpOworCisJd2FrZV91cCgmbWRyLT53YWl0cSk7CisJcHV0X21kcihtZHIpOworfQorCitzdGF0aWMgc3RydWN0IGNhY2hlX2RlZmVycmVkX3JlcSAqCitpZG1hcF9kZWZlcihzdHJ1Y3QgY2FjaGVfcmVxICpyZXEpCit7CisJc3RydWN0IGlkbWFwX2RlZmVyX3JlcSAqbWRyID0KKwkJY29udGFpbmVyX29mKHJlcSwgc3RydWN0IGlkbWFwX2RlZmVyX3JlcSwgcmVxKTsKKworCW1kci0+ZGVmZXJyZWRfcmVxLnJldmlzaXQgPSBpZG1hcF9yZXZpc2l0OworCWdldF9tZHIobWRyKTsKKwlyZXR1cm4gKCZtZHItPmRlZmVycmVkX3JlcSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Citkb19pZG1hcF9sb29rdXAoc3RydWN0IGVudCAqKCpsb29rdXBfZm4pKHN0cnVjdCBlbnQgKiwgaW50KSwgc3RydWN0IGVudCAqa2V5LAorCQlzdHJ1Y3QgY2FjaGVfZGV0YWlsICpkZXRhaWwsIHN0cnVjdCBlbnQgKippdGVtLAorCQlzdHJ1Y3QgaWRtYXBfZGVmZXJfcmVxICptZHIpCit7CisJKml0ZW0gPSBsb29rdXBfZm4oa2V5LCAwKTsKKwlpZiAoISppdGVtKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gY2FjaGVfY2hlY2soZGV0YWlsLCAmKCppdGVtKS0+aCwgJm1kci0+cmVxKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2RvX2lkbWFwX2xvb2t1cF9ub3dhaXQoc3RydWN0IGVudCAqKCpsb29rdXBfZm4pKHN0cnVjdCBlbnQgKiwgaW50KSwKKwkJCXN0cnVjdCBlbnQgKmtleSwgc3RydWN0IGNhY2hlX2RldGFpbCAqZGV0YWlsLAorCQkJc3RydWN0IGVudCAqKml0ZW0pCit7CisJaW50IHJldCA9IC1FTk9NRU07CisKKwkqaXRlbSA9IGxvb2t1cF9mbihrZXksIDApOworCWlmICghKml0ZW0pCisJCWdvdG8gb3V0X2VycjsKKwlyZXQgPSAtRVRJTUVET1VUOworCWlmICghdGVzdF9iaXQoQ0FDSEVfVkFMSUQsICYoKml0ZW0pLT5oLmZsYWdzKQorCQkJfHwgKCppdGVtKS0+aC5leHBpcnlfdGltZSA8IGdldF9zZWNvbmRzKCkKKwkJCXx8IGRldGFpbC0+Zmx1c2hfdGltZSA+ICgqaXRlbSktPmgubGFzdF9yZWZyZXNoKQorCQlnb3RvIG91dF9wdXQ7CisJcmV0ID0gLUVOT0VOVDsKKwlpZiAodGVzdF9iaXQoQ0FDSEVfTkVHQVRJVkUsICYoKml0ZW0pLT5oLmZsYWdzKSkKKwkJZ290byBvdXRfcHV0OworCXJldHVybiAwOworb3V0X3B1dDoKKwllbnRfcHV0KCYoKml0ZW0pLT5oLCBkZXRhaWwpOworb3V0X2VycjoKKwkqaXRlbSA9IE5VTEw7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAoraWRtYXBfbG9va3VwKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsCisJCXN0cnVjdCBlbnQgKigqbG9va3VwX2ZuKShzdHJ1Y3QgZW50ICosIGludCksIHN0cnVjdCBlbnQgKmtleSwKKwkJc3RydWN0IGNhY2hlX2RldGFpbCAqZGV0YWlsLCBzdHJ1Y3QgZW50ICoqaXRlbSkKK3sKKwlzdHJ1Y3QgaWRtYXBfZGVmZXJfcmVxICptZHI7CisJaW50IHJldDsKKworCW1kciA9IGttYWxsb2Moc2l6ZW9mKCptZHIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1kcikKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KG1kciwgMCwgc2l6ZW9mKCptZHIpKTsKKwlhdG9taWNfc2V0KCZtZHItPmNvdW50LCAxKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZtZHItPndhaXRxKTsKKwltZHItPnJlcS5kZWZlciA9IGlkbWFwX2RlZmVyOworCXJldCA9IGRvX2lkbWFwX2xvb2t1cChsb29rdXBfZm4sIGtleSwgZGV0YWlsLCBpdGVtLCBtZHIpOworCWlmIChyZXQgPT0gLUVBR0FJTikgeworCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChtZHItPndhaXRxLAorCQkJdGVzdF9iaXQoQ0FDSEVfVkFMSUQsICYoKml0ZW0pLT5oLmZsYWdzKSwgMSAqIEhaKTsKKwkJcmV0ID0gZG9faWRtYXBfbG9va3VwX25vd2FpdChsb29rdXBfZm4sIGtleSwgZGV0YWlsLCBpdGVtKTsKKwl9CisJcHV0X21kcihtZHIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2lkbWFwX25hbWVfdG9faWQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgaW50IHR5cGUsIGNvbnN0IGNoYXIgKm5hbWUsIHUzMiBuYW1lbGVuLAorCQl1aWRfdCAqaWQpCit7CisJc3RydWN0IGVudCAqaXRlbSwga2V5ID0geworCQkudHlwZSA9IHR5cGUsCisJfTsKKwlpbnQgcmV0OworCisJaWYgKG5hbWVsZW4gKyAxID4gc2l6ZW9mKGtleS5uYW1lKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbWVtY3B5KGtleS5uYW1lLCBuYW1lLCBuYW1lbGVuKTsKKwlrZXkubmFtZVtuYW1lbGVuXSA9ICdcMCc7CisJc3RybGNweShrZXkuYXV0aG5hbWUsIHJxc3RwLT5ycV9jbGllbnQtPm5hbWUsIHNpemVvZihrZXkuYXV0aG5hbWUpKTsKKwlyZXQgPSBpZG1hcF9sb29rdXAocnFzdHAsIG5hbWV0b2lkX2xvb2t1cCwgJmtleSwgJm5hbWV0b2lkX2NhY2hlLCAmaXRlbSk7CisJaWYgKHJldCA9PSAtRU5PRU5UKQorCQlyZXQgPSAtRVNSQ0g7IC8qIG5mc2Vycl9iYWRuYW1lICovCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwkqaWQgPSBpdGVtLT5pZDsKKwllbnRfcHV0KCZpdGVtLT5oLCAmbmFtZXRvaWRfY2FjaGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitpZG1hcF9pZF90b19uYW1lKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIGludCB0eXBlLCB1aWRfdCBpZCwgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZW50ICppdGVtLCBrZXkgPSB7CisJCS5pZCA9IGlkLAorCQkudHlwZSA9IHR5cGUsCisJfTsKKwlpbnQgcmV0OworCisJc3RybGNweShrZXkuYXV0aG5hbWUsIHJxc3RwLT5ycV9jbGllbnQtPm5hbWUsIHNpemVvZihrZXkuYXV0aG5hbWUpKTsKKwlyZXQgPSBpZG1hcF9sb29rdXAocnFzdHAsIGlkdG9uYW1lX2xvb2t1cCwgJmtleSwgJmlkdG9uYW1lX2NhY2hlLCAmaXRlbSk7CisJaWYgKHJldCA9PSAtRU5PRU5UKQorCQlyZXR1cm4gc3ByaW50ZihuYW1lLCAiJXUiLCBpZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSBzdHJsZW4oaXRlbS0+bmFtZSk7CisJQlVHX09OKHJldCA+IElETUFQX05BTUVTWik7CisJbWVtY3B5KG5hbWUsIGl0ZW0tPm5hbWUsIHJldCk7CisJZW50X3B1dCgmaXRlbS0+aCwgJmlkdG9uYW1lX2NhY2hlKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQKK25mc2RfbWFwX25hbWVfdG9fdWlkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lbGVuLAorCQlfX3UzMiAqaWQpCit7CisJcmV0dXJuIGlkbWFwX25hbWVfdG9faWQocnFzdHAsIElETUFQX1RZUEVfVVNFUiwgbmFtZSwgbmFtZWxlbiwgaWQpOworfQorCitpbnQKK25mc2RfbWFwX25hbWVfdG9fZ2lkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lbGVuLAorCQlfX3UzMiAqaWQpCit7CisJcmV0dXJuIGlkbWFwX25hbWVfdG9faWQocnFzdHAsIElETUFQX1RZUEVfR1JPVVAsIG5hbWUsIG5hbWVsZW4sIGlkKTsKK30KKworaW50CituZnNkX21hcF91aWRfdG9fbmFtZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBfX3UzMiBpZCwgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gaWRtYXBfaWRfdG9fbmFtZShycXN0cCwgSURNQVBfVFlQRV9VU0VSLCBpZCwgbmFtZSk7Cit9CisKK2ludAorbmZzZF9tYXBfZ2lkX3RvX25hbWUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgX191MzIgaWQsIGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIGlkbWFwX2lkX3RvX25hbWUocnFzdHAsIElETUFQX1RZUEVfR1JPVVAsIGlkLCBuYW1lKTsKK30KZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNHByb2MuYyBiL2ZzL25mc2QvbmZzNHByb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODE1ODc0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzZC9uZnM0cHJvYy5jCkBAIC0wLDAgKzEsOTg0IEBACisvKgorICogIGZzL25mc2QvbmZzNHByb2MuYworICoKKyAqICBTZXJ2ZXItc2lkZSBwcm9jZWR1cmVzIGZvciBORlN2NC4KKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuLgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIEtlbmRyaWNrIFNtaXRoIDxrbXNtaXRoQHVtaWNoLmVkdT4KKyAqICBBbmR5IEFkYW1zb24gICA8YW5kcm9zQHVtaWNoLmVkdT4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiAgYXJlIG1ldDoKKyAqCisgKiAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqICBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiAgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqICBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKKyAqICBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgKiAgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqICBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBOb3RlOiBzb21lIHJvdXRpbmVzIGluIHRoaXMgZmlsZSBhcmUganVzdCB0cml2aWFsIHdyYXBwZXJzCisgKiAoZS5nLiBuZnNkNF9sb29rdXAoKSkgZGVmaW5lZCBzb2xlbHkgZm9yIHRoZSBzYWtlIG9mIGNvbnNpc3RlbnQKKyAqIG5hbWluZy4gIFNpbmNlIGFsbCBzdWNoIHJvdXRpbmVzIGhhdmUgYmVlbiBkZWNsYXJlZCAiaW5saW5lIiwKKyAqIHRoZXJlIHNob3VsZG4ndCBiZSBhbnkgYXNzb2NpYXRlZCBvdmVyaGVhZC4gIEF0IHNvbWUgcG9pbnQgaW4KKyAqIHRoZSBmdXR1cmUsIEkgbWlnaHQgaW5saW5lIHRoZXNlICJieSBoYW5kIiB0byBjbGVhbiB1cCBhCisgKiBsaXR0bGUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CisjaW5jbHVkZSA8bGludXgvbmZzZC9uZnNkLmg+CisjaW5jbHVkZSA8bGludXgvbmZzZC9jYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L25mczQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL3N0YXRlLmg+CisjaW5jbHVkZSA8bGludXgvbmZzZC94ZHI0Lmg+CisjaW5jbHVkZSA8bGludXgvbmZzNF9hY2wuaD4KKworI2RlZmluZSBORlNEREJHX0ZBQ0lMSVRZCQlORlNEREJHX1BST0MKKworc3RhdGljIGlubGluZSB2b2lkCitmaF9kdXAyKHN0cnVjdCBzdmNfZmggKmRzdCwgc3RydWN0IHN2Y19maCAqc3JjKQoreworCWZoX3B1dChkc3QpOworCWRnZXQoc3JjLT5maF9kZW50cnkpOworCWlmIChzcmMtPmZoX2V4cG9ydCkKKwkJY2FjaGVfZ2V0KCZzcmMtPmZoX2V4cG9ydC0+aCk7CisJKmRzdCA9ICpzcmM7Cit9CisKK3N0YXRpYyBpbnQKK2RvX29wZW5fcGVybWlzc2lvbihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfb3BlbiAqb3BlbikKK3sKKwlpbnQgYWNjbW9kZSwgc3RhdHVzOworCisJaWYgKG9wZW4tPm9wX3RydW5jYXRlICYmCisJCSEob3Blbi0+b3Bfc2hhcmVfYWNjZXNzICYgTkZTNF9TSEFSRV9BQ0NFU1NfV1JJVEUpKQorCQlyZXR1cm4gbmZzZXJyX2ludmFsOworCisJYWNjbW9kZSA9IE1BWV9OT1A7CisJaWYgKG9wZW4tPm9wX3NoYXJlX2FjY2VzcyAmIE5GUzRfU0hBUkVfQUNDRVNTX1JFQUQpCisJCWFjY21vZGUgPSBNQVlfUkVBRDsKKwlpZiAob3Blbi0+b3Bfc2hhcmVfZGVueSAmIE5GUzRfU0hBUkVfQUNDRVNTX1dSSVRFKQorCQlhY2Ntb2RlIHw9IChNQVlfV1JJVEUgfCBNQVlfVFJVTkMpOworCWFjY21vZGUgfD0gTUFZX09XTkVSX09WRVJSSURFOworCisJc3RhdHVzID0gZmhfdmVyaWZ5KHJxc3RwLCBjdXJyZW50X2ZoLCBTX0lGUkVHLCBhY2Ntb2RlKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQKK2RvX29wZW5fbG9va3VwKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9vcGVuICpvcGVuKQoreworCXN0cnVjdCBzdmNfZmggcmVzZmg7CisJaW50IHN0YXR1czsKKworCWZoX2luaXQoJnJlc2ZoLCBORlM0X0ZIU0laRSk7CisJb3Blbi0+b3BfdHJ1bmNhdGUgPSAwOworCisJaWYgKG9wZW4tPm9wX2NyZWF0ZSkgeworCQkvKgorCQkgKiBOb3RlOiBjcmVhdGUgbW9kZXMgKFVOQ0hFQ0tFRCxHVUFSREVELi4uKSBhcmUgdGhlIHNhbWUKKwkJICogaW4gTkZTdjQgYXMgaW4gdjMuCisJCSAqLworCQlzdGF0dXMgPSBuZnNkX2NyZWF0ZV92MyhycXN0cCwgY3VycmVudF9maCwgb3Blbi0+b3BfZm5hbWUuZGF0YSwKKwkJCQkJb3Blbi0+b3BfZm5hbWUubGVuLCAmb3Blbi0+b3BfaWF0dHIsCisJCQkJCSZyZXNmaCwgb3Blbi0+b3BfY3JlYXRlbW9kZSwKKwkJCQkJKHUzMiAqKW9wZW4tPm9wX3ZlcmYuZGF0YSwgJm9wZW4tPm9wX3RydW5jYXRlKTsKKwl9CisJZWxzZSB7CisJCXN0YXR1cyA9IG5mc2RfbG9va3VwKHJxc3RwLCBjdXJyZW50X2ZoLAorCQkJCSAgICAgb3Blbi0+b3BfZm5hbWUuZGF0YSwgb3Blbi0+b3BfZm5hbWUubGVuLCAmcmVzZmgpOworCQlmaF91bmxvY2soY3VycmVudF9maCk7CisJfQorCisJaWYgKCFzdGF0dXMpIHsKKwkJc2V0X2NoYW5nZV9pbmZvKCZvcGVuLT5vcF9jaW5mbywgY3VycmVudF9maCk7CisKKwkJLyogc2V0IHJlcGx5IGNhY2hlICovCisJCWZoX2R1cDIoY3VycmVudF9maCwgJnJlc2ZoKTsKKwkJb3Blbi0+b3Bfc3RhdGVvd25lci0+c29fcmVwbGF5LnJwX29wZW5maF9sZW4gPQorCQkJcmVzZmguZmhfaGFuZGxlLmZoX3NpemU7CisJCW1lbWNweShvcGVuLT5vcF9zdGF0ZW93bmVyLT5zb19yZXBsYXkucnBfb3BlbmZoLAorCQkJCSZyZXNmaC5maF9oYW5kbGUuZmhfYmFzZSwKKwkJCQlyZXNmaC5maF9oYW5kbGUuZmhfc2l6ZSk7CisKKwkJc3RhdHVzID0gZG9fb3Blbl9wZXJtaXNzaW9uKHJxc3RwLCBjdXJyZW50X2ZoLCBvcGVuKTsKKwl9CisKKwlmaF9wdXQoJnJlc2ZoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50Citkb19vcGVuX2ZoYW5kbGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X29wZW4gKm9wZW4pCit7CisJaW50IHN0YXR1czsKKworCS8qIE9ubHkgcmVjbGFpbXMgZnJvbSBwcmV2aW91c2x5IGNvbmZpcm1lZCBjbGllbnRzIGFyZSB2YWxpZCAqLworCWlmICgoc3RhdHVzID0gbmZzNF9jaGVja19vcGVuX3JlY2xhaW0oJm9wZW4tPm9wX2NsaWVudGlkKSkpCisJCXJldHVybiBzdGF0dXM7CisKKwkvKiBXZSBkb24ndCBrbm93IHRoZSB0YXJnZXQgZGlyZWN0b3J5LCBhbmQgdGhlcmVmb3JlIGNhbiBub3QKKwkqIHNldCB0aGUgY2hhbmdlIGluZm8KKwkqLworCisJbWVtc2V0KCZvcGVuLT5vcF9jaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBuZnNkNF9jaGFuZ2VfaW5mbykpOworCisJLyogc2V0IHJlcGxheSBjYWNoZSAqLworCW9wZW4tPm9wX3N0YXRlb3duZXItPnNvX3JlcGxheS5ycF9vcGVuZmhfbGVuID0gY3VycmVudF9maC0+ZmhfaGFuZGxlLmZoX3NpemU7CisJbWVtY3B5KG9wZW4tPm9wX3N0YXRlb3duZXItPnNvX3JlcGxheS5ycF9vcGVuZmgsCisJCSZjdXJyZW50X2ZoLT5maF9oYW5kbGUuZmhfYmFzZSwKKwkJY3VycmVudF9maC0+ZmhfaGFuZGxlLmZoX3NpemUpOworCisJb3Blbi0+b3BfdHJ1bmNhdGUgPSAob3Blbi0+b3BfaWF0dHIuaWFfdmFsaWQgJiBBVFRSX1NJWkUpICYmCisJCShvcGVuLT5vcF9pYXR0ci5pYV9zaXplID09IDApOworCisJc3RhdHVzID0gZG9fb3Blbl9wZXJtaXNzaW9uKHJxc3RwLCBjdXJyZW50X2ZoLCBvcGVuKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKworc3RhdGljIGlubGluZSBpbnQKK25mc2Q0X29wZW4oc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X29wZW4gKm9wZW4pCit7CisJaW50IHN0YXR1czsKKwlkcHJpbnRrKCJORlNEOiBuZnNkNF9vcGVuIGZpbGVuYW1lICUuKnMgb3Bfc3RhdGVvd25lciAlcFxuIiwKKwkJKGludClvcGVuLT5vcF9mbmFtZS5sZW4sIG9wZW4tPm9wX2ZuYW1lLmRhdGEsCisJCW9wZW4tPm9wX3N0YXRlb3duZXIpOworCisJaWYgKG5mczRfaW5fZ3JhY2UoKSAmJiBvcGVuLT5vcF9jbGFpbV90eXBlICE9IE5GUzRfT1BFTl9DTEFJTV9QUkVWSU9VUykKKwkJcmV0dXJuIG5mc2Vycl9ncmFjZTsKKworCWlmICghbmZzNF9pbl9ncmFjZSgpICYmIG9wZW4tPm9wX2NsYWltX3R5cGUgPT0gTkZTNF9PUEVOX0NMQUlNX1BSRVZJT1VTKQorCQlyZXR1cm4gbmZzZXJyX25vX2dyYWNlOworCisJLyogVGhpcyBjaGVjayByZXF1aXJlZCBieSBzcGVjLiAqLworCWlmIChvcGVuLT5vcF9jcmVhdGUgJiYgb3Blbi0+b3BfY2xhaW1fdHlwZSAhPSBORlM0X09QRU5fQ0xBSU1fTlVMTCkKKwkJcmV0dXJuIG5mc2Vycl9pbnZhbDsKKworCW5mczRfbG9ja19zdGF0ZSgpOworCisJLyogY2hlY2sgc2VxaWQgZm9yIHJlcGxheS4gc2V0IG5mczRfb3duZXIgKi8KKwlzdGF0dXMgPSBuZnNkNF9wcm9jZXNzX29wZW4xKG9wZW4pOworCWlmIChzdGF0dXMgPT0gTkZTRVJSX1JFUExBWV9NRSkgeworCQlzdHJ1Y3QgbmZzNF9yZXBsYXkgKnJwID0gJm9wZW4tPm9wX3N0YXRlb3duZXItPnNvX3JlcGxheTsKKwkJZmhfcHV0KGN1cnJlbnRfZmgpOworCQljdXJyZW50X2ZoLT5maF9oYW5kbGUuZmhfc2l6ZSA9IHJwLT5ycF9vcGVuZmhfbGVuOworCQltZW1jcHkoJmN1cnJlbnRfZmgtPmZoX2hhbmRsZS5maF9iYXNlLCBycC0+cnBfb3BlbmZoLAorCQkJCXJwLT5ycF9vcGVuZmhfbGVuKTsKKwkJc3RhdHVzID0gZmhfdmVyaWZ5KHJxc3RwLCBjdXJyZW50X2ZoLCAwLCBNQVlfTk9QKTsKKwkJaWYgKHN0YXR1cykKKwkJCWRwcmludGsoIm5mc2Q0X29wZW46IHJlcGxheSBmYWlsZWQiCisJCQkJIiByZXN0b3JpbmcgcHJldmlvdXMgZmlsZWhhbmRsZVxuIik7CisJCWVsc2UKKwkJCXN0YXR1cyA9IE5GU0VSUl9SRVBMQVlfTUU7CisJfQorCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0OworCXN3aXRjaCAob3Blbi0+b3BfY2xhaW1fdHlwZSkgeworCQljYXNlIE5GUzRfT1BFTl9DTEFJTV9OVUxMOgorCQkJLyoKKwkJCSAqICgxKSBzZXQgQ1VSUkVOVF9GSCB0byB0aGUgZmlsZSBiZWluZyBvcGVuZWQsCisJCQkgKiBjcmVhdGluZyBpdCBpZiBuZWNlc3NhcnksICgyKSBzZXQgb3Blbi0+b3BfY2luZm8sCisJCQkgKiAoMykgc2V0IG9wZW4tPm9wX3RydW5jYXRlIGlmIHRoZSBmaWxlIGlzIHRvIGJlCisJCQkgKiB0cnVuY2F0ZWQgYWZ0ZXIgb3BlbmluZywgKDQpIGRvIHBlcm1pc3Npb24gY2hlY2tpbmcuCisJCQkgKi8KKwkJCXN0YXR1cyA9IGRvX29wZW5fbG9va3VwKHJxc3RwLCBjdXJyZW50X2ZoLCBvcGVuKTsKKwkJCWlmIChzdGF0dXMpCisJCQkJZ290byBvdXQ7CisJCQlicmVhazsKKwkJY2FzZSBORlM0X09QRU5fQ0xBSU1fUFJFVklPVVM6CisJCQkvKgorCQkJICogVGhlIENVUlJFTlRfRkggaXMgYWxyZWFkeSBzZXQgdG8gdGhlIGZpbGUgYmVpbmcKKwkJCSAqIG9wZW5lZC4gICgxKSBzZXQgb3Blbi0+b3BfY2luZm8sICgyKSBzZXQKKwkJCSAqIG9wZW4tPm9wX3RydW5jYXRlIGlmIHRoZSBmaWxlIGlzIHRvIGJlIHRydW5jYXRlZAorCQkJICogYWZ0ZXIgb3BlbmluZywgKDMpIGRvIHBlcm1pc3Npb24gY2hlY2tpbmcuCisJCQkqLworCQkJc3RhdHVzID0gZG9fb3Blbl9maGFuZGxlKHJxc3RwLCBjdXJyZW50X2ZoLCBvcGVuKTsKKwkJCWlmIChzdGF0dXMpCisJCQkJZ290byBvdXQ7CisJCQlicmVhazsKKwkJY2FzZSBORlM0X09QRU5fQ0xBSU1fREVMRUdBVEVfQ1VSOgorICAgICAgICAgICAgIAljYXNlIE5GUzRfT1BFTl9DTEFJTV9ERUxFR0FURV9QUkVWOgorCQkJcHJpbnRrKCJORlNEOiB1bnN1cHBvcnRlZCBPUEVOIGNsYWltIHR5cGUgJWRcbiIsCisJCQkJb3Blbi0+b3BfY2xhaW1fdHlwZSk7CisJCQlzdGF0dXMgPSBuZnNlcnJfbm90c3VwcDsKKwkJCWdvdG8gb3V0OworCQlkZWZhdWx0OgorCQkJcHJpbnRrKCJORlNEOiBJbnZhbGlkIE9QRU4gY2xhaW0gdHlwZSAlZFxuIiwKKwkJCQlvcGVuLT5vcF9jbGFpbV90eXBlKTsKKwkJCXN0YXR1cyA9IG5mc2Vycl9pbnZhbDsKKwkJCWdvdG8gb3V0OworCX0KKwkvKgorCSAqIG5mc2Q0X3Byb2Nlc3Nfb3BlbjIoKSBkb2VzIHRoZSBhY3R1YWwgb3BlbmluZyBvZiB0aGUgZmlsZS4gIElmCisJICogc3VjY2Vzc2Z1bCwgaXQgKDEpIHRydW5jYXRlcyB0aGUgZmlsZSBpZiBvcGVuLT5vcF90cnVuY2F0ZSB3YXMKKwkgKiBzZXQsICgyKSBzZXRzIG9wZW4tPm9wX3N0YXRlaWQsICgzKSBzZXRzIG9wZW4tPm9wX2RlbGVnYXRpb24uCisJICovCisJc3RhdHVzID0gbmZzZDRfcHJvY2Vzc19vcGVuMihycXN0cCwgY3VycmVudF9maCwgb3Blbik7CitvdXQ6CisJaWYgKG9wZW4tPm9wX3N0YXRlb3duZXIpCisJCW5mczRfZ2V0X3N0YXRlb3duZXIob3Blbi0+b3Bfc3RhdGVvd25lcik7CisJbmZzNF91bmxvY2tfc3RhdGUoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogZmlsZWhhbmRsZS1tYW5pcHVsYXRpbmcgb3BzLgorICovCitzdGF0aWMgaW5saW5lIGludAorbmZzZDRfZ2V0Zmgoc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IHN2Y19maCAqKmdldGZoKQoreworCWlmICghY3VycmVudF9maC0+ZmhfZGVudHJ5KQorCQlyZXR1cm4gbmZzZXJyX25vZmlsZWhhbmRsZTsKKworCSpnZXRmaCA9IGN1cnJlbnRfZmg7CisJcmV0dXJuIG5mc19vazsKK30KKworc3RhdGljIGlubGluZSBpbnQKK25mc2Q0X3B1dGZoKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9wdXRmaCAqcHV0ZmgpCit7CisJZmhfcHV0KGN1cnJlbnRfZmgpOworCWN1cnJlbnRfZmgtPmZoX2hhbmRsZS5maF9zaXplID0gcHV0ZmgtPnBmX2ZobGVuOworCW1lbWNweSgmY3VycmVudF9maC0+ZmhfaGFuZGxlLmZoX2Jhc2UsIHB1dGZoLT5wZl9maHZhbCwgcHV0ZmgtPnBmX2ZobGVuKTsKKwlyZXR1cm4gZmhfdmVyaWZ5KHJxc3RwLCBjdXJyZW50X2ZoLCAwLCBNQVlfTk9QKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK25mc2Q0X3B1dHJvb3RmaChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoKQoreworCWludCBzdGF0dXM7CisKKwlmaF9wdXQoY3VycmVudF9maCk7CisJc3RhdHVzID0gZXhwX3BzZXVkb3Jvb3QocnFzdHAtPnJxX2NsaWVudCwgY3VycmVudF9maCwKKwkJCSAgICAgICZycXN0cC0+cnFfY2hhbmRsZSk7CisJaWYgKCFzdGF0dXMpCisJCXN0YXR1cyA9IG5mc2Vycm5vKG5mc2Rfc2V0dXNlcihycXN0cCwgY3VycmVudF9maC0+ZmhfZXhwb3J0KSk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGlubGluZSBpbnQKK25mc2Q0X3Jlc3RvcmVmaChzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3Qgc3ZjX2ZoICpzYXZlX2ZoKQoreworCWlmICghc2F2ZV9maC0+ZmhfZGVudHJ5KQorCQlyZXR1cm4gbmZzZXJyX3Jlc3RvcmVmaDsKKworCWZoX2R1cDIoY3VycmVudF9maCwgc2F2ZV9maCk7CisJcmV0dXJuIG5mc19vazsKK30KKworc3RhdGljIGlubGluZSBpbnQKK25mc2Q0X3NhdmVmaChzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3Qgc3ZjX2ZoICpzYXZlX2ZoKQoreworCWlmICghY3VycmVudF9maC0+ZmhfZGVudHJ5KQorCQlyZXR1cm4gbmZzZXJyX25vZmlsZWhhbmRsZTsKKworCWZoX2R1cDIoc2F2ZV9maCwgY3VycmVudF9maCk7CisJcmV0dXJuIG5mc19vazsKK30KKworLyoKKyAqIG1pc2MgbmZzdjQgb3BzCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CituZnNkNF9hY2Nlc3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X2FjY2VzcyAqYWNjZXNzKQoreworCWlmIChhY2Nlc3MtPmFjX3JlcV9hY2Nlc3MgJiB+TkZTM19BQ0NFU1NfRlVMTCkKKwkJcmV0dXJuIG5mc2Vycl9pbnZhbDsKKworCWFjY2Vzcy0+YWNfcmVzcF9hY2Nlc3MgPSBhY2Nlc3MtPmFjX3JlcV9hY2Nlc3M7CisJcmV0dXJuIG5mc2RfYWNjZXNzKHJxc3RwLCBjdXJyZW50X2ZoLCAmYWNjZXNzLT5hY19yZXNwX2FjY2VzcywgJmFjY2Vzcy0+YWNfc3VwcG9ydGVkKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK25mc2Q0X2NvbW1pdChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfY29tbWl0ICpjb21taXQpCit7CisJaW50IHN0YXR1czsKKworCXUzMiAqcCA9ICh1MzIgKiljb21taXQtPmNvX3ZlcmYuZGF0YTsKKwkqcCsrID0gbmZzc3ZjX2Jvb3QudHZfc2VjOworCSpwKysgPSBuZnNzdmNfYm9vdC50dl91c2VjOworCisJc3RhdHVzID0gbmZzZF9jb21taXQocnFzdHAsIGN1cnJlbnRfZmgsIGNvbW1pdC0+Y29fb2Zmc2V0LCBjb21taXQtPmNvX2NvdW50KTsKKwlpZiAoc3RhdHVzID09IG5mc2Vycl9zeW1saW5rKQorCQlzdGF0dXMgPSBuZnNlcnJfaW52YWw7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludAorbmZzZDRfY3JlYXRlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9jcmVhdGUgKmNyZWF0ZSkKK3sKKwlzdHJ1Y3Qgc3ZjX2ZoIHJlc2ZoOworCWludCBzdGF0dXM7CisJZGV2X3QgcmRldjsKKworCWZoX2luaXQoJnJlc2ZoLCBORlM0X0ZIU0laRSk7CisKKwlzdGF0dXMgPSBmaF92ZXJpZnkocnFzdHAsIGN1cnJlbnRfZmgsIFNfSUZESVIsIE1BWV9DUkVBVEUpOworCWlmIChzdGF0dXMgPT0gbmZzZXJyX3N5bWxpbmspCisJCXN0YXR1cyA9IG5mc2Vycl9ub3RkaXI7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKworCXN3aXRjaCAoY3JlYXRlLT5jcl90eXBlKSB7CisJY2FzZSBORjRMTks6CisJCS8qIHVnaCEgd2UgaGF2ZSB0byBudWxsLXRlcm1pbmF0ZSB0aGUgbGlua3RleHQsIG9yCisJCSAqIHZmc19zeW1saW5rKCkgd2lsbCBjaG9rZS4gIGl0IGlzIGFsd2F5cyBzYWZlIHRvCisJCSAqIG51bGwtdGVybWluYXRlIGJ5IGJydXRlIGZvcmNlLCBzaW5jZSBhdCB3b3JzdCB3ZQorCQkgKiB3aWxsIG92ZXJ3cml0ZSB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgY3JlYXRlIG5hbWVsZW4KKwkJICogaW4gdGhlIFhEUiBidWZmZXIsIHdoaWNoIGhhcyBhbHJlYWR5IGJlZW4gZXh0cmFjdGVkCisJCSAqIGR1cmluZyBYRFIgZGVjb2RlLgorCQkgKi8KKwkJY3JlYXRlLT5jcl9saW5rbmFtZVtjcmVhdGUtPmNyX2xpbmtsZW5dID0gMDsKKworCQlzdGF0dXMgPSBuZnNkX3N5bWxpbmsocnFzdHAsIGN1cnJlbnRfZmgsIGNyZWF0ZS0+Y3JfbmFtZSwKKwkJCQkgICAgICBjcmVhdGUtPmNyX25hbWVsZW4sIGNyZWF0ZS0+Y3JfbGlua25hbWUsCisJCQkJICAgICAgY3JlYXRlLT5jcl9saW5rbGVuLCAmcmVzZmgsICZjcmVhdGUtPmNyX2lhdHRyKTsKKwkJYnJlYWs7CisKKwljYXNlIE5GNEJMSzoKKwkJcmRldiA9IE1LREVWKGNyZWF0ZS0+Y3Jfc3BlY2RhdGExLCBjcmVhdGUtPmNyX3NwZWNkYXRhMik7CisJCWlmIChNQUpPUihyZGV2KSAhPSBjcmVhdGUtPmNyX3NwZWNkYXRhMSB8fAorCQkgICAgTUlOT1IocmRldikgIT0gY3JlYXRlLT5jcl9zcGVjZGF0YTIpCisJCQlyZXR1cm4gbmZzZXJyX2ludmFsOworCQlzdGF0dXMgPSBuZnNkX2NyZWF0ZShycXN0cCwgY3VycmVudF9maCwgY3JlYXRlLT5jcl9uYW1lLAorCQkJCSAgICAgY3JlYXRlLT5jcl9uYW1lbGVuLCAmY3JlYXRlLT5jcl9pYXR0ciwKKwkJCQkgICAgIFNfSUZCTEssIHJkZXYsICZyZXNmaCk7CisJCWJyZWFrOworCisJY2FzZSBORjRDSFI6CisJCXJkZXYgPSBNS0RFVihjcmVhdGUtPmNyX3NwZWNkYXRhMSwgY3JlYXRlLT5jcl9zcGVjZGF0YTIpOworCQlpZiAoTUFKT1IocmRldikgIT0gY3JlYXRlLT5jcl9zcGVjZGF0YTEgfHwKKwkJICAgIE1JTk9SKHJkZXYpICE9IGNyZWF0ZS0+Y3Jfc3BlY2RhdGEyKQorCQkJcmV0dXJuIG5mc2Vycl9pbnZhbDsKKwkJc3RhdHVzID0gbmZzZF9jcmVhdGUocnFzdHAsIGN1cnJlbnRfZmgsIGNyZWF0ZS0+Y3JfbmFtZSwKKwkJCQkgICAgIGNyZWF0ZS0+Y3JfbmFtZWxlbiwgJmNyZWF0ZS0+Y3JfaWF0dHIsCisJCQkJICAgICBTX0lGQ0hSLCByZGV2LCAmcmVzZmgpOworCQlicmVhazsKKworCWNhc2UgTkY0U09DSzoKKwkJc3RhdHVzID0gbmZzZF9jcmVhdGUocnFzdHAsIGN1cnJlbnRfZmgsIGNyZWF0ZS0+Y3JfbmFtZSwKKwkJCQkgICAgIGNyZWF0ZS0+Y3JfbmFtZWxlbiwgJmNyZWF0ZS0+Y3JfaWF0dHIsCisJCQkJICAgICBTX0lGU09DSywgMCwgJnJlc2ZoKTsKKwkJYnJlYWs7CisKKwljYXNlIE5GNEZJRk86CisJCXN0YXR1cyA9IG5mc2RfY3JlYXRlKHJxc3RwLCBjdXJyZW50X2ZoLCBjcmVhdGUtPmNyX25hbWUsCisJCQkJICAgICBjcmVhdGUtPmNyX25hbWVsZW4sICZjcmVhdGUtPmNyX2lhdHRyLAorCQkJCSAgICAgU19JRklGTywgMCwgJnJlc2ZoKTsKKwkJYnJlYWs7CisKKwljYXNlIE5GNERJUjoKKwkJY3JlYXRlLT5jcl9pYXR0ci5pYV92YWxpZCAmPSB+QVRUUl9TSVpFOworCQlzdGF0dXMgPSBuZnNkX2NyZWF0ZShycXN0cCwgY3VycmVudF9maCwgY3JlYXRlLT5jcl9uYW1lLAorCQkJCSAgICAgY3JlYXRlLT5jcl9uYW1lbGVuLCAmY3JlYXRlLT5jcl9pYXR0ciwKKwkJCQkgICAgIFNfSUZESVIsIDAsICZyZXNmaCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJc3RhdHVzID0gbmZzZXJyX2JhZHR5cGU7CisJfQorCisJaWYgKCFzdGF0dXMpIHsKKwkJZmhfdW5sb2NrKGN1cnJlbnRfZmgpOworCQlzZXRfY2hhbmdlX2luZm8oJmNyZWF0ZS0+Y3JfY2luZm8sIGN1cnJlbnRfZmgpOworCQlmaF9kdXAyKGN1cnJlbnRfZmgsICZyZXNmaCk7CisJfQorCisJZmhfcHV0KCZyZXNmaCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGlubGluZSBpbnQKK25mc2Q0X2dldGF0dHIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X2dldGF0dHIgKmdldGF0dHIpCit7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IGZoX3ZlcmlmeShycXN0cCwgY3VycmVudF9maCwgMCwgTUFZX05PUCk7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKworCWlmIChnZXRhdHRyLT5nYV9ibXZhbFsxXSAmIE5GU0RfV1JJVEVPTkxZX0FUVFJTX1dPUkQxKQorCQlyZXR1cm4gbmZzZXJyX2ludmFsOworCisJZ2V0YXR0ci0+Z2FfYm12YWxbMF0gJj0gTkZTRF9TVVBQT1JURURfQVRUUlNfV09SRDA7CisJZ2V0YXR0ci0+Z2FfYm12YWxbMV0gJj0gTkZTRF9TVVBQT1JURURfQVRUUlNfV09SRDE7CisKKwlnZXRhdHRyLT5nYV9maHAgPSBjdXJyZW50X2ZoOworCXJldHVybiBuZnNfb2s7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CituZnNkNF9saW5rKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsCisJICAgc3RydWN0IHN2Y19maCAqc2F2ZV9maCwgc3RydWN0IG5mc2Q0X2xpbmsgKmxpbmspCit7CisJaW50IHN0YXR1cyA9IG5mc2Vycl9ub2ZpbGVoYW5kbGU7CisKKwlpZiAoIXNhdmVfZmgtPmZoX2RlbnRyeSkKKwkJcmV0dXJuIHN0YXR1czsKKwlzdGF0dXMgPSBuZnNkX2xpbmsocnFzdHAsIGN1cnJlbnRfZmgsIGxpbmstPmxpX25hbWUsIGxpbmstPmxpX25hbWVsZW4sIHNhdmVfZmgpOworCWlmICghc3RhdHVzKQorCQlzZXRfY2hhbmdlX2luZm8oJmxpbmstPmxpX2NpbmZvLCBjdXJyZW50X2ZoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50CituZnNkNF9sb29rdXBwKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgpCit7CisJc3RydWN0IHN2Y19maCB0bXBfZmg7CisJaW50IHJldDsKKworCWZoX2luaXQoJnRtcF9maCwgTkZTNF9GSFNJWkUpOworCWlmKChyZXQgPSBleHBfcHNldWRvcm9vdChycXN0cC0+cnFfY2xpZW50LCAmdG1wX2ZoLAorCQkJICAgICAgJnJxc3RwLT5ycV9jaGFuZGxlKSkgIT0gMCkKKwkJcmV0dXJuIHJldDsKKwlpZiAodG1wX2ZoLmZoX2RlbnRyeSA9PSBjdXJyZW50X2ZoLT5maF9kZW50cnkpIHsKKwkJZmhfcHV0KCZ0bXBfZmgpOworCQlyZXR1cm4gbmZzZXJyX25vZW50OworCX0KKwlmaF9wdXQoJnRtcF9maCk7CisJcmV0dXJuIG5mc2RfbG9va3VwKHJxc3RwLCBjdXJyZW50X2ZoLCAiLi4iLCAyLCBjdXJyZW50X2ZoKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK25mc2Q0X2xvb2t1cChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfbG9va3VwICpsb29rdXApCit7CisJcmV0dXJuIG5mc2RfbG9va3VwKHJxc3RwLCBjdXJyZW50X2ZoLCBsb29rdXAtPmxvX25hbWUsIGxvb2t1cC0+bG9fbGVuLCBjdXJyZW50X2ZoKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK25mc2Q0X3JlYWQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X3JlYWQgKnJlYWQpCit7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgZmlsZSAqZmlscCA9IE5VTEw7CisKKwkvKiBubyBuZWVkIHRvIGNoZWNrIHBlcm1pc3Npb24gLSB0aGlzIHdpbGwgYmUgZG9uZSBpbiBuZnNkX3JlYWQoKSAqLworCisJaWYgKHJlYWQtPnJkX29mZnNldCA+PSBPRkZTRVRfTUFYKQorCQlyZXR1cm4gbmZzZXJyX2ludmFsOworCisJbmZzNF9sb2NrX3N0YXRlKCk7CisJLyogY2hlY2sgc3RhdGVpZCAqLworCWlmICgoc3RhdHVzID0gbmZzNF9wcmVwcm9jZXNzX3N0YXRlaWRfb3AoY3VycmVudF9maCwgJnJlYWQtPnJkX3N0YXRlaWQsCisJCQkJCUNIRUNLX0ZIIHwgUkRfU1RBVEUsICZmaWxwKSkpIHsKKwkJZHByaW50aygiTkZTRDogbmZzZDRfcmVhZDogY291bGRuJ3QgcHJvY2VzcyBzdGF0ZWlkIVxuIik7CisJCWdvdG8gb3V0OworCX0KKwlzdGF0dXMgPSBuZnNfb2s7CitvdXQ6CisJbmZzNF91bmxvY2tfc3RhdGUoKTsKKwlyZWFkLT5yZF9ycXN0cCA9IHJxc3RwOworCXJlYWQtPnJkX2ZocCA9IGN1cnJlbnRfZmg7CisJcmVhZC0+cmRfZmlscCA9IGZpbHA7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGlubGluZSBpbnQKK25mc2Q0X3JlYWRkaXIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X3JlYWRkaXIgKnJlYWRkaXIpCit7CisJdTY0IGNvb2tpZSA9IHJlYWRkaXItPnJkX2Nvb2tpZTsKKwlzdGF0aWMgY29uc3QgbmZzNF92ZXJpZmllciB6ZXJvdmVyZjsKKworCS8qIG5vIG5lZWQgdG8gY2hlY2sgcGVybWlzc2lvbiAtIHRoaXMgd2lsbCBiZSBkb25lIGluIG5mc2RfcmVhZGRpcigpICovCisKKwlpZiAocmVhZGRpci0+cmRfYm12YWxbMV0gJiBORlNEX1dSSVRFT05MWV9BVFRSU19XT1JEMSkKKwkJcmV0dXJuIG5mc2Vycl9pbnZhbDsKKworCXJlYWRkaXItPnJkX2JtdmFsWzBdICY9IE5GU0RfU1VQUE9SVEVEX0FUVFJTX1dPUkQwOworCXJlYWRkaXItPnJkX2JtdmFsWzFdICY9IE5GU0RfU1VQUE9SVEVEX0FUVFJTX1dPUkQxOworCisJaWYgKChjb29raWUgPiB+KHUzMikwKSB8fCAoY29va2llID09IDEpIHx8IChjb29raWUgPT0gMikgfHwKKwkgICAgKGNvb2tpZSA9PSAwICYmIG1lbWNtcChyZWFkZGlyLT5yZF92ZXJmLmRhdGEsIHplcm92ZXJmLmRhdGEsIE5GUzRfVkVSSUZJRVJfU0laRSkpKQorCQlyZXR1cm4gbmZzZXJyX2JhZF9jb29raWU7CisKKwlyZWFkZGlyLT5yZF9ycXN0cCA9IHJxc3RwOworCXJlYWRkaXItPnJkX2ZocCA9IGN1cnJlbnRfZmg7CisJcmV0dXJuIG5mc19vazsKK30KKworc3RhdGljIGlubGluZSBpbnQKK25mc2Q0X3JlYWRsaW5rKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9yZWFkbGluayAqcmVhZGxpbmspCit7CisJcmVhZGxpbmstPnJsX3Jxc3RwID0gcnFzdHA7CisJcmVhZGxpbmstPnJsX2ZocCA9IGN1cnJlbnRfZmg7CisJcmV0dXJuIG5mc19vazsKK30KKworc3RhdGljIGlubGluZSBpbnQKK25mc2Q0X3JlbW92ZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfcmVtb3ZlICpyZW1vdmUpCit7CisJaW50IHN0YXR1czsKKworCXN0YXR1cyA9IG5mc2RfdW5saW5rKHJxc3RwLCBjdXJyZW50X2ZoLCAwLCByZW1vdmUtPnJtX25hbWUsIHJlbW92ZS0+cm1fbmFtZWxlbik7CisJaWYgKHN0YXR1cyA9PSBuZnNlcnJfc3ltbGluaykKKwkJcmV0dXJuIG5mc2Vycl9ub3RkaXI7CisJaWYgKCFzdGF0dXMpIHsKKwkJZmhfdW5sb2NrKGN1cnJlbnRfZmgpOworCQlzZXRfY2hhbmdlX2luZm8oJnJlbW92ZS0+cm1fY2luZm8sIGN1cnJlbnRfZmgpOworCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW5saW5lIGludAorbmZzZDRfcmVuYW1lKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsCisJICAgICBzdHJ1Y3Qgc3ZjX2ZoICpzYXZlX2ZoLCBzdHJ1Y3QgbmZzZDRfcmVuYW1lICpyZW5hbWUpCit7CisJaW50IHN0YXR1cyA9IG5mc2Vycl9ub2ZpbGVoYW5kbGU7CisKKwlpZiAoIXNhdmVfZmgtPmZoX2RlbnRyeSkKKwkJcmV0dXJuIHN0YXR1czsKKwlzdGF0dXMgPSBuZnNkX3JlbmFtZShycXN0cCwgc2F2ZV9maCwgcmVuYW1lLT5ybl9zbmFtZSwKKwkJCSAgICAgcmVuYW1lLT5ybl9zbmFtZWxlbiwgY3VycmVudF9maCwKKwkJCSAgICAgcmVuYW1lLT5ybl90bmFtZSwgcmVuYW1lLT5ybl90bmFtZWxlbik7CisKKwkvKiB0aGUgdW5kZXJseWluZyBmaWxlc3lzdGVtIHJldHVybnMgZGlmZmVyZW50IGVycm9yJ3MgdGhhbiByZXF1aXJlZAorCSAqIGJ5IE5GU3Y0LiBib3RoIHNhdmVfZmggYW5kIGN1cnJlbnRfZmggaGF2ZSBiZWVuIHZlcmlmaWVkLi4gKi8KKwlpZiAoc3RhdHVzID09IG5mc2Vycl9pc2RpcikKKwkJc3RhdHVzID0gbmZzZXJyX2V4aXN0OworCWVsc2UgaWYgKChzdGF0dXMgPT0gbmZzZXJyX25vdGRpcikgJiYKKyAgICAgICAgICAgICAgICAgIChTX0lTRElSKHNhdmVfZmgtPmZoX2RlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSAmJgorICAgICAgICAgICAgICAgICAgIFNfSVNESVIoY3VycmVudF9maC0+ZmhfZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKSkKKwkJc3RhdHVzID0gbmZzZXJyX2V4aXN0OworCWVsc2UgaWYgKHN0YXR1cyA9PSBuZnNlcnJfc3ltbGluaykKKwkJc3RhdHVzID0gbmZzZXJyX25vdGRpcjsKKworCWlmICghc3RhdHVzKSB7CisJCXNldF9jaGFuZ2VfaW5mbygmcmVuYW1lLT5ybl9zaW5mbywgY3VycmVudF9maCk7CisJCXNldF9jaGFuZ2VfaW5mbygmcmVuYW1lLT5ybl90aW5mbywgc2F2ZV9maCk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CituZnNkNF9zZXRhdHRyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9zZXRhdHRyICpzZXRhdHRyKQoreworCWludCBzdGF0dXMgPSBuZnNfb2s7CisKKwlpZiAoIWN1cnJlbnRfZmgtPmZoX2RlbnRyeSkKKwkJcmV0dXJuIG5mc2Vycl9ub2ZpbGVoYW5kbGU7CisKKwlzdGF0dXMgPSBuZnNfb2s7CisJaWYgKHNldGF0dHItPnNhX2lhdHRyLmlhX3ZhbGlkICYgQVRUUl9TSVpFKSB7CisJCW5mczRfbG9ja19zdGF0ZSgpOworCQlpZiAoKHN0YXR1cyA9IG5mczRfcHJlcHJvY2Vzc19zdGF0ZWlkX29wKGN1cnJlbnRfZmgsCisJCQkJCQkmc2V0YXR0ci0+c2Ffc3RhdGVpZCwKKwkJCQkJCUNIRUNLX0ZIIHwgV1JfU1RBVEUsIE5VTEwpKSkgeworCQkJZHByaW50aygiTkZTRDogbmZzZDRfc2V0YXR0cjogY291bGRuJ3QgcHJvY2VzcyBzdGF0ZWlkIVxuIik7CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKwkJbmZzNF91bmxvY2tfc3RhdGUoKTsKKwl9CisJc3RhdHVzID0gbmZzX29rOworCWlmIChzZXRhdHRyLT5zYV9hY2wgIT0gTlVMTCkKKwkJc3RhdHVzID0gbmZzZDRfc2V0X25mczRfYWNsKHJxc3RwLCBjdXJyZW50X2ZoLCBzZXRhdHRyLT5zYV9hY2wpOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0OworCXN0YXR1cyA9IG5mc2Rfc2V0YXR0cihycXN0cCwgY3VycmVudF9maCwgJnNldGF0dHItPnNhX2lhdHRyLAorCQkJCTAsICh0aW1lX3QpMCk7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK291dF91bmxvY2s6CisJbmZzNF91bmxvY2tfc3RhdGUoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW5saW5lIGludAorbmZzZDRfd3JpdGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X3dyaXRlICp3cml0ZSkKK3sKKwlzdGF0ZWlkX3QgKnN0YXRlaWQgPSAmd3JpdGUtPndyX3N0YXRlaWQ7CisJc3RydWN0IGZpbGUgKmZpbHAgPSBOVUxMOworCXUzMiAqcDsKKwlpbnQgc3RhdHVzID0gbmZzX29rOworCisJLyogbm8gbmVlZCB0byBjaGVjayBwZXJtaXNzaW9uIC0gdGhpcyB3aWxsIGJlIGRvbmUgaW4gbmZzZF93cml0ZSgpICovCisKKwlpZiAod3JpdGUtPndyX29mZnNldCA+PSBPRkZTRVRfTUFYKQorCQlyZXR1cm4gbmZzZXJyX2ludmFsOworCisJbmZzNF9sb2NrX3N0YXRlKCk7CisJaWYgKChzdGF0dXMgPSBuZnM0X3ByZXByb2Nlc3Nfc3RhdGVpZF9vcChjdXJyZW50X2ZoLCBzdGF0ZWlkLAorCQkJCQlDSEVDS19GSCB8IFdSX1NUQVRFLCAmZmlscCkpKSB7CisJCWRwcmludGsoIk5GU0Q6IG5mc2Q0X3dyaXRlOiBjb3VsZG4ndCBwcm9jZXNzIHN0YXRlaWQhXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCW5mczRfdW5sb2NrX3N0YXRlKCk7CisKKwl3cml0ZS0+d3JfYnl0ZXNfd3JpdHRlbiA9IHdyaXRlLT53cl9idWZsZW47CisJd3JpdGUtPndyX2hvd193cml0dGVuID0gd3JpdGUtPndyX3N0YWJsZV9ob3c7CisJcCA9ICh1MzIgKil3cml0ZS0+d3JfdmVyaWZpZXIuZGF0YTsKKwkqcCsrID0gbmZzc3ZjX2Jvb3QudHZfc2VjOworCSpwKysgPSBuZnNzdmNfYm9vdC50dl91c2VjOworCisJc3RhdHVzID0gIG5mc2Rfd3JpdGUocnFzdHAsIGN1cnJlbnRfZmgsIGZpbHAsIHdyaXRlLT53cl9vZmZzZXQsCisJCQl3cml0ZS0+d3JfdmVjLCB3cml0ZS0+d3Jfdmxlbiwgd3JpdGUtPndyX2J1ZmxlbiwKKwkJCSZ3cml0ZS0+d3JfaG93X3dyaXR0ZW4pOworCisJaWYgKHN0YXR1cyA9PSBuZnNlcnJfc3ltbGluaykKKwkJc3RhdHVzID0gbmZzZXJyX2ludmFsOworCXJldHVybiBzdGF0dXM7CitvdXQ6CisJbmZzNF91bmxvY2tfc3RhdGUoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKiBUaGlzIHJvdXRpbmUgbmV2ZXIgcmV0dXJucyBORlNfT0shICBJZiB0aGVyZSBhcmUgbm8gb3RoZXIgZXJyb3JzLCBpdAorICogd2lsbCByZXR1cm4gTkZTRVJSX1NBTUUgb3IgTkZTRVJSX05PVF9TQU1FIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZQorICogYXR0cmlidXRlcyBtYXRjaGVkLiAgVkVSSUZZIGlzIGltcGxlbWVudGVkIGJ5IG1hcHBpbmcgTkZTRVJSX1NBTUUKKyAqIHRvIE5GU19PSyBhZnRlciB0aGUgY2FsbDsgTlZFUklGWSBieSBtYXBwaW5nIE5GU0VSUl9OT1RfU0FNRSB0byBORlNfT0suCisgKi8KK3N0YXRpYyBpbnQKK25mc2Q0X3ZlcmlmeShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfdmVyaWZ5ICp2ZXJpZnkpCit7CisJdTMyICpidWYsICpwOworCWludCBjb3VudDsKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gZmhfdmVyaWZ5KHJxc3RwLCBjdXJyZW50X2ZoLCAwLCBNQVlfTk9QKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCisJaWYgKCh2ZXJpZnktPnZlX2JtdmFsWzBdICYgfk5GU0RfU1VQUE9SVEVEX0FUVFJTX1dPUkQwKQorCSAgICB8fCAodmVyaWZ5LT52ZV9ibXZhbFsxXSAmIH5ORlNEX1NVUFBPUlRFRF9BVFRSU19XT1JEMSkpCisJCXJldHVybiBuZnNlcnJfYXR0cm5vdHN1cHA7CisJaWYgKCh2ZXJpZnktPnZlX2JtdmFsWzBdICYgRkFUVFI0X1dPUkQwX1JEQVRUUl9FUlJPUikKKwkgICAgfHwgKHZlcmlmeS0+dmVfYm12YWxbMV0gJiBORlNEX1dSSVRFT05MWV9BVFRSU19XT1JEMSkpCisJCXJldHVybiBuZnNlcnJfaW52YWw7CisJaWYgKHZlcmlmeS0+dmVfYXR0cmxlbiAmIDMpCisJCXJldHVybiBuZnNlcnJfaW52YWw7CisKKwkvKiBjb3VudCBpbiB3b3JkczoKKwkgKiAgIGJpdG1hcF9sZW4oMSkgKyBiaXRtYXAoMikgKyBhdHRyX2xlbigxKSA9IDQKKwkgKi8KKwljb3VudCA9IDQgKyAodmVyaWZ5LT52ZV9hdHRybGVuID4+IDIpOworCWJ1ZiA9IGttYWxsb2MoY291bnQgPDwgMiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVybiBuZnNlcnJfcmVzb3VyY2U7CisKKwlzdGF0dXMgPSBuZnNkNF9lbmNvZGVfZmF0dHIoY3VycmVudF9maCwgY3VycmVudF9maC0+ZmhfZXhwb3J0LAorCQkJCSAgICBjdXJyZW50X2ZoLT5maF9kZW50cnksIGJ1ZiwKKwkJCQkgICAgJmNvdW50LCB2ZXJpZnktPnZlX2JtdmFsLAorCQkJCSAgICBycXN0cCk7CisKKwkvKiB0aGlzIG1lYW5zIHRoYXQgbmZzZDRfZW5jb2RlX2ZhdHRyKCkgcmFuIG91dCBvZiBzcGFjZSAqLworCWlmIChzdGF0dXMgPT0gbmZzZXJyX3Jlc291cmNlICYmIGNvdW50ID09IDApCisJCXN0YXR1cyA9IG5mc2Vycl9ub3Rfc2FtZTsKKwlpZiAoc3RhdHVzKQorCQlnb3RvIG91dF9rZnJlZTsKKworCXAgPSBidWYgKyAzOworCXN0YXR1cyA9IG5mc2Vycl9ub3Rfc2FtZTsKKwlpZiAobnRvaGwoKnArKykgIT0gdmVyaWZ5LT52ZV9hdHRybGVuKQorCQlnb3RvIG91dF9rZnJlZTsKKwlpZiAoIW1lbWNtcChwLCB2ZXJpZnktPnZlX2F0dHJ2YWwsIHZlcmlmeS0+dmVfYXR0cmxlbikpCisJCXN0YXR1cyA9IG5mc2Vycl9zYW1lOworCitvdXRfa2ZyZWU6CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogTlVMTCBjYWxsLgorICovCitzdGF0aWMgaW50CituZnNkNF9wcm9jX251bGwoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdm9pZCAqYXJncCwgdm9pZCAqcmVzcCkKK3sKKwlyZXR1cm4gbmZzX29rOworfQorCisKKy8qCisgKiBDT01QT1VORCBjYWxsLgorICovCitzdGF0aWMgaW50CituZnNkNF9wcm9jX2NvbXBvdW5kKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsCisJCSAgICBzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdzLAorCQkgICAgc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwKQoreworCXN0cnVjdCBuZnNkNF9vcAkqb3A7CisJc3RydWN0IHN2Y19maAkqY3VycmVudF9maCA9IE5VTEw7CisJc3RydWN0IHN2Y19maAkqc2F2ZV9maCA9IE5VTEw7CisJc3RydWN0IG5mczRfc3RhdGVvd25lciAqcmVwbGF5X293bmVyID0gTlVMTDsKKwlpbnQJCXNsYWNrX3NwYWNlOyAgICAvKiBpbiB3b3Jkcywgbm90IGJ5dGVzISAqLworCWludAkJc3RhdHVzOworCisJc3RhdHVzID0gbmZzZXJyX3Jlc291cmNlOworCWN1cnJlbnRfZmggPSBrbWFsbG9jKHNpemVvZigqY3VycmVudF9maCksIEdGUF9LRVJORUwpOworCWlmIChjdXJyZW50X2ZoID09IE5VTEwpCisJCWdvdG8gb3V0OworCWZoX2luaXQoY3VycmVudF9maCwgTkZTNF9GSFNJWkUpOworCXNhdmVfZmggPSBrbWFsbG9jKHNpemVvZigqc2F2ZV9maCksIEdGUF9LRVJORUwpOworCWlmIChzYXZlX2ZoID09IE5VTEwpCisJCWdvdG8gb3V0OworCWZoX2luaXQoc2F2ZV9maCwgTkZTNF9GSFNJWkUpOworCisJcmVzcC0+eGJ1ZiA9ICZycXN0cC0+cnFfcmVzOworCXJlc3AtPnAgPSBycXN0cC0+cnFfcmVzLmhlYWRbMF0uaW92X2Jhc2UgKyBycXN0cC0+cnFfcmVzLmhlYWRbMF0uaW92X2xlbjsKKwlyZXNwLT50YWdwID0gcmVzcC0+cDsKKwkvKiByZXNlcnZlIHNwYWNlIGZvcjogdGFnbGVuLCB0YWcsIGFuZCBvcGNudCAqLworCXJlc3AtPnAgKz0gMiArIFhEUl9RVUFETEVOKGFyZ3MtPnRhZ2xlbik7CisJcmVzcC0+ZW5kID0gcnFzdHAtPnJxX3Jlcy5oZWFkWzBdLmlvdl9iYXNlICsgUEFHRV9TSVpFOworCXJlc3AtPnRhZ2xlbiA9IGFyZ3MtPnRhZ2xlbjsKKwlyZXNwLT50YWcgPSBhcmdzLT50YWc7CisJcmVzcC0+b3BjbnQgPSAwOworCXJlc3AtPnJxc3RwID0gcnFzdHA7CisKKwkvKgorCSAqIEFjY29yZGluZyB0byBSRkMzMDEwLCB0aGlzIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBhbGwgb3RoZXIgZXJyb3JzLgorCSAqLworCXN0YXR1cyA9IG5mc2Vycl9taW5vcl92ZXJzX21pc21hdGNoOworCWlmIChhcmdzLT5taW5vcnZlcnNpb24gPiBORlNEX1NVUFBPUlRFRF9NSU5PUl9WRVJTSU9OKQorCQlnb3RvIG91dDsKKworCXN0YXR1cyA9IG5mc19vazsKKwl3aGlsZSAoIXN0YXR1cyAmJiByZXNwLT5vcGNudCA8IGFyZ3MtPm9wY250KSB7CisJCW9wID0gJmFyZ3MtPm9wc1tyZXNwLT5vcGNudCsrXTsKKworCQkvKgorCQkgKiBUaGUgWERSIGRlY29kZSByb3V0aW5lcyBtYXkgaGF2ZSBwcmUtc2V0IG9wLT5zdGF0dXM7CisJCSAqIGZvciBleGFtcGxlLCBpZiB0aGVyZSBpcyBhIG1pc2NlbGxhbmVvdXMgWERSIGVycm9yCisJCSAqIGl0IHdpbGwgYmUgc2V0IHRvIG5mc2Vycl9iYWRfeGRyLgorCQkgKi8KKwkJaWYgKG9wLT5zdGF0dXMpCisJCQlnb3RvIGVuY29kZV9vcDsKKworCQkvKiBXZSBtdXN0IGJlIGFibGUgdG8gZW5jb2RlIGEgc3VjY2Vzc2Z1bCByZXNwb25zZSB0bworCQkgKiB0aGlzIG9wZXJhdGlvbiwgd2l0aCBlbm91Z2ggcm9vbSBsZWZ0IG92ZXIgdG8gZW5jb2RlIGEKKwkJICogZmFpbGVkIHJlc3BvbnNlIHRvIHRoZSBuZXh0IG9wZXJhdGlvbi4gIElmIHdlIGRvbid0CisJCSAqIGhhdmUgZW5vdWdoIHJvb20sIGZhaWwgd2l0aCBFUlJfUkVTT1VSQ0UuCisJCSAqLworLyogRklYTUUgLSBpcyBzbGFja19zcGFjZSAqcmVhbGx5KiB3b3Jkcywgb3IgYnl0ZXM/Pz8gLSBuZWlsYiAqLworCQlzbGFja19zcGFjZSA9IChjaGFyICopcmVzcC0+ZW5kIC0gKGNoYXIgKilyZXNwLT5wOworCQlpZiAoc2xhY2tfc3BhY2UgPCBDT01QT1VORF9TTEFDS19TUEFDRSArIENPTVBPVU5EX0VSUl9TTEFDS19TUEFDRSkgeworCQkJQlVHX09OKHNsYWNrX3NwYWNlIDwgQ09NUE9VTkRfRVJSX1NMQUNLX1NQQUNFKTsKKwkJCW9wLT5zdGF0dXMgPSBuZnNlcnJfcmVzb3VyY2U7CisJCQlnb3RvIGVuY29kZV9vcDsKKwkJfQorCisJCS8qIEFsbCBvcGVyYXRpb25zIGV4Y2VwdCBSRU5FVywgU0VUQ0xJRU5USUQsIFJFU1RPUkVGSAorCQkqIFNFVENMSUVOVElEX0NPTkZJUk0sIFBVVEZIIGFuZCBQVVRST09URkgKKwkJKiByZXF1aXJlIGEgdmFsaWQgY3VycmVudCBmaWxlaGFuZGxlCisJCSoKKwkJKiBTRVRBVFRSIE5PRklMRUhBTkRMRSBlcnJvciBoYW5kbGVkIGluIG5mc2Q0X3NldGF0dHIKKwkJKiBkdWUgdG8gcmVxdWlyZWQgcmV0dXJuZWQgYml0bWFwIGFyZ3VtZW50CisJCSovCisJCWlmICgoIWN1cnJlbnRfZmgtPmZoX2RlbnRyeSkgJiYKKwkJICAgISgob3AtPm9wbnVtID09IE9QX1BVVEZIKSB8fCAob3AtPm9wbnVtID09IE9QX1BVVFJPT1RGSCkgfHwKKwkJICAgKG9wLT5vcG51bSA9PSBPUF9TRVRDTElFTlRJRCkgfHwKKwkJICAgKG9wLT5vcG51bSA9PSBPUF9TRVRDTElFTlRJRF9DT05GSVJNKSB8fAorCQkgICAob3AtPm9wbnVtID09IE9QX1JFTkVXKSB8fCAob3AtPm9wbnVtID09IE9QX1JFU1RPUkVGSCkgfHwKKwkJICAgKG9wLT5vcG51bSA9PSBPUF9SRUxFQVNFX0xPQ0tPV05FUikgfHwKKwkJICAgKG9wLT5vcG51bSA9PSBPUF9TRVRBVFRSKSkpIHsKKwkJCW9wLT5zdGF0dXMgPSBuZnNlcnJfbm9maWxlaGFuZGxlOworCQkJZ290byBlbmNvZGVfb3A7CisJCX0KKwkJc3dpdGNoIChvcC0+b3BudW0pIHsKKwkJY2FzZSBPUF9BQ0NFU1M6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfYWNjZXNzKHJxc3RwLCBjdXJyZW50X2ZoLCAmb3AtPnUuYWNjZXNzKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX0NMT1NFOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X2Nsb3NlKHJxc3RwLCBjdXJyZW50X2ZoLCAmb3AtPnUuY2xvc2UpOworCQkJcmVwbGF5X293bmVyID0gb3AtPnUuY2xvc2UuY2xfc3RhdGVvd25lcjsKKwkJCWJyZWFrOworCQljYXNlIE9QX0NPTU1JVDoKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9jb21taXQocnFzdHAsIGN1cnJlbnRfZmgsICZvcC0+dS5jb21taXQpOworCQkJYnJlYWs7CisJCWNhc2UgT1BfQ1JFQVRFOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X2NyZWF0ZShycXN0cCwgY3VycmVudF9maCwgJm9wLT51LmNyZWF0ZSk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9ERUxFR1JFVFVSTjoKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9kZWxlZ3JldHVybihycXN0cCwgY3VycmVudF9maCwgJm9wLT51LmRlbGVncmV0dXJuKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX0dFVEFUVFI6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfZ2V0YXR0cihycXN0cCwgY3VycmVudF9maCwgJm9wLT51LmdldGF0dHIpOworCQkJYnJlYWs7CisJCWNhc2UgT1BfR0VURkg6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfZ2V0ZmgoY3VycmVudF9maCwgJm9wLT51LmdldGZoKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX0xJTks6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfbGluayhycXN0cCwgY3VycmVudF9maCwgc2F2ZV9maCwgJm9wLT51LmxpbmspOworCQkJYnJlYWs7CisJCWNhc2UgT1BfTE9DSzoKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9sb2NrKHJxc3RwLCBjdXJyZW50X2ZoLCAmb3AtPnUubG9jayk7CisJCQlyZXBsYXlfb3duZXIgPSBvcC0+dS5sb2NrLmxrX3N0YXRlb3duZXI7CisJCQlicmVhazsKKwkJY2FzZSBPUF9MT0NLVDoKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9sb2NrdChycXN0cCwgY3VycmVudF9maCwgJm9wLT51LmxvY2t0KTsKKwkJCWJyZWFrOworCQljYXNlIE9QX0xPQ0tVOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X2xvY2t1KHJxc3RwLCBjdXJyZW50X2ZoLCAmb3AtPnUubG9ja3UpOworCQkJcmVwbGF5X293bmVyID0gb3AtPnUubG9ja3UubHVfc3RhdGVvd25lcjsKKwkJCWJyZWFrOworCQljYXNlIE9QX0xPT0tVUDoKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9sb29rdXAocnFzdHAsIGN1cnJlbnRfZmgsICZvcC0+dS5sb29rdXApOworCQkJYnJlYWs7CisJCWNhc2UgT1BfTE9PS1VQUDoKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9sb29rdXBwKHJxc3RwLCBjdXJyZW50X2ZoKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX05WRVJJRlk6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfdmVyaWZ5KHJxc3RwLCBjdXJyZW50X2ZoLCAmb3AtPnUubnZlcmlmeSk7CisJCQlpZiAob3AtPnN0YXR1cyA9PSBuZnNlcnJfbm90X3NhbWUpCisJCQkJb3AtPnN0YXR1cyA9IG5mc19vazsKKwkJCWJyZWFrOworCQljYXNlIE9QX09QRU46CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfb3BlbihycXN0cCwgY3VycmVudF9maCwgJm9wLT51Lm9wZW4pOworCQkJcmVwbGF5X293bmVyID0gb3AtPnUub3Blbi5vcF9zdGF0ZW93bmVyOworCQkJYnJlYWs7CisJCWNhc2UgT1BfT1BFTl9DT05GSVJNOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X29wZW5fY29uZmlybShycXN0cCwgY3VycmVudF9maCwgJm9wLT51Lm9wZW5fY29uZmlybSk7CisJCQlyZXBsYXlfb3duZXIgPSBvcC0+dS5vcGVuX2NvbmZpcm0ub2Nfc3RhdGVvd25lcjsKKwkJCWJyZWFrOworCQljYXNlIE9QX09QRU5fRE9XTkdSQURFOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X29wZW5fZG93bmdyYWRlKHJxc3RwLCBjdXJyZW50X2ZoLCAmb3AtPnUub3Blbl9kb3duZ3JhZGUpOworCQkJcmVwbGF5X293bmVyID0gb3AtPnUub3Blbl9kb3duZ3JhZGUub2Rfc3RhdGVvd25lcjsKKwkJCWJyZWFrOworCQljYXNlIE9QX1BVVEZIOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X3B1dGZoKHJxc3RwLCBjdXJyZW50X2ZoLCAmb3AtPnUucHV0ZmgpOworCQkJYnJlYWs7CisJCWNhc2UgT1BfUFVUUk9PVEZIOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X3B1dHJvb3RmaChycXN0cCwgY3VycmVudF9maCk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9SRUFEOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X3JlYWQocnFzdHAsIGN1cnJlbnRfZmgsICZvcC0+dS5yZWFkKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX1JFQURESVI6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfcmVhZGRpcihycXN0cCwgY3VycmVudF9maCwgJm9wLT51LnJlYWRkaXIpOworCQkJYnJlYWs7CisJCWNhc2UgT1BfUkVBRExJTks6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfcmVhZGxpbmsocnFzdHAsIGN1cnJlbnRfZmgsICZvcC0+dS5yZWFkbGluayk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9SRU1PVkU6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfcmVtb3ZlKHJxc3RwLCBjdXJyZW50X2ZoLCAmb3AtPnUucmVtb3ZlKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX1JFTkFNRToKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9yZW5hbWUocnFzdHAsIGN1cnJlbnRfZmgsIHNhdmVfZmgsICZvcC0+dS5yZW5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgT1BfUkVORVc6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfcmVuZXcoJm9wLT51LnJlbmV3KTsKKwkJCWJyZWFrOworCQljYXNlIE9QX1JFU1RPUkVGSDoKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9yZXN0b3JlZmgoY3VycmVudF9maCwgc2F2ZV9maCk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9TQVZFRkg6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfc2F2ZWZoKGN1cnJlbnRfZmgsIHNhdmVfZmgpOworCQkJYnJlYWs7CisJCWNhc2UgT1BfU0VUQVRUUjoKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9zZXRhdHRyKHJxc3RwLCBjdXJyZW50X2ZoLCAmb3AtPnUuc2V0YXR0cik7CisJCQlicmVhazsKKwkJY2FzZSBPUF9TRVRDTElFTlRJRDoKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9zZXRjbGllbnRpZChycXN0cCwgJm9wLT51LnNldGNsaWVudGlkKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX1NFVENMSUVOVElEX0NPTkZJUk06CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfc2V0Y2xpZW50aWRfY29uZmlybShycXN0cCwgJm9wLT51LnNldGNsaWVudGlkX2NvbmZpcm0pOworCQkJYnJlYWs7CisJCWNhc2UgT1BfVkVSSUZZOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X3ZlcmlmeShycXN0cCwgY3VycmVudF9maCwgJm9wLT51LnZlcmlmeSk7CisJCQlpZiAob3AtPnN0YXR1cyA9PSBuZnNlcnJfc2FtZSkKKwkJCQlvcC0+c3RhdHVzID0gbmZzX29rOworCQkJYnJlYWs7CisJCWNhc2UgT1BfV1JJVEU6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfd3JpdGUocnFzdHAsIGN1cnJlbnRfZmgsICZvcC0+dS53cml0ZSk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9SRUxFQVNFX0xPQ0tPV05FUjoKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9yZWxlYXNlX2xvY2tvd25lcihycXN0cCwgJm9wLT51LnJlbGVhc2VfbG9ja293bmVyKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQlVHX09OKG9wLT5zdGF0dXMgPT0gbmZzX29rKTsKKwkJCWJyZWFrOworCQl9CisKK2VuY29kZV9vcDoKKwkJaWYgKG9wLT5zdGF0dXMgPT0gTkZTRVJSX1JFUExBWV9NRSkgeworCQkJb3AtPnJlcGxheSA9ICZyZXBsYXlfb3duZXItPnNvX3JlcGxheTsKKwkJCW5mc2Q0X2VuY29kZV9yZXBsYXkocmVzcCwgb3ApOworCQkJc3RhdHVzID0gb3AtPnN0YXR1cyA9IG9wLT5yZXBsYXktPnJwX3N0YXR1czsKKwkJfSBlbHNlIHsKKwkJCW5mc2Q0X2VuY29kZV9vcGVyYXRpb24ocmVzcCwgb3ApOworCQkJc3RhdHVzID0gb3AtPnN0YXR1czsKKwkJfQorCQlpZiAocmVwbGF5X293bmVyICYmIChyZXBsYXlfb3duZXIgIT0gKHZvaWQgKikoLTEpKSkgeworCQkJbmZzNF9wdXRfc3RhdGVvd25lcihyZXBsYXlfb3duZXIpOworCQkJcmVwbGF5X293bmVyID0gTlVMTDsKKwkJfQorCX0KKworb3V0OgorCW5mc2Q0X3JlbGVhc2VfY29tcG91bmRhcmdzKGFyZ3MpOworCWlmIChjdXJyZW50X2ZoKQorCQlmaF9wdXQoY3VycmVudF9maCk7CisJa2ZyZWUoY3VycmVudF9maCk7CisJaWYgKHNhdmVfZmgpCisJCWZoX3B1dChzYXZlX2ZoKTsKKwlrZnJlZShzYXZlX2ZoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisjZGVmaW5lIG5mczRzdmNfZGVjb2RlX3ZvaWRhcmdzCQlOVUxMCisjZGVmaW5lIG5mczRzdmNfcmVsZWFzZV92b2lkCQlOVUxMCisjZGVmaW5lIG5mc2Q0X3ZvaWRyZXMJCQluZnNkNF92b2lkYXJncworI2RlZmluZSBuZnM0c3ZjX3JlbGVhc2VfY29tcG91bmQJTlVMTAorc3RydWN0IG5mc2Q0X3ZvaWRhcmdzIHsgaW50IGR1bW15OyB9OworCisjZGVmaW5lIFBST0MobmFtZSwgYXJndCwgcmVzdCwgcmVsdCwgY2FjaGUsIHJlc3BzaXplKQlcCisgeyAoc3ZjX3Byb2NmdW5jKSBuZnNkNF9wcm9jXyMjbmFtZSwJCVwKKyAgIChreGRycHJvY190KSBuZnM0c3ZjX2RlY29kZV8jI2FyZ3QjI2FyZ3MsCVwKKyAgIChreGRycHJvY190KSBuZnM0c3ZjX2VuY29kZV8jI3Jlc3QjI3JlcywJXAorICAgKGt4ZHJwcm9jX3QpIG5mczRzdmNfcmVsZWFzZV8jI3JlbHQsCQlcCisgICBzaXplb2Yoc3RydWN0IG5mc2Q0XyMjYXJndCMjYXJncyksCQlcCisgICBzaXplb2Yoc3RydWN0IG5mc2Q0XyMjcmVzdCMjcmVzKSwJCVwKKyAgIDAsCQkJCQkJXAorICAgY2FjaGUsCQkJCQlcCisgICByZXNwc2l6ZSwJCQkJCVwKKyB9CisKKy8qCisgKiBUT0RPOiBBdCB0aGUgcHJlc2VudCB0aW1lLCB0aGUgTkZTdjQgc2VydmVyIGRvZXMgbm90IGRvIFhJRCBjYWNoaW5nCisgKiBvZiByZXF1ZXN0cy4gIEltcGxlbWVudGluZyBYSUQgY2FjaGluZyB3b3VsZCBub3QgYmUgYSBzZXJpb3VzIHByb2JsZW0sCisgKiBhbHRob3VnaCBpdCB3b3VsZCByZXF1aXJlIGEgbWlsZCBjaGFuZ2UgaW4gaW50ZXJmYWNlcyBzaW5jZSBvbmUKKyAqIGRvZXNuJ3Qga25vdyB3aGV0aGVyIGFuIE5GU3Y0IHJlcXVlc3QgaXMgaWRlbXBvdGVudCB1bnRpbCBhZnRlciB0aGUKKyAqIFhEUiBkZWNvZGUuICBIb3dldmVyLCBYSUQgY2FjaGluZyB0b3RhbGx5IGNvbmZ1c2VzIHB5bmZzIChQZXRlcgorICogQXN0cmFuZCdzIHJlZ3Jlc3Npb24gdGVzdHN1aXRlIGZvciBORlN2NCBzZXJ2ZXJzKSwgd2hpY2ggcmV1c2VzCisgKiBYSUQncyBsaWJlcmFsbHksIHNvIEkndmUgbGVmdCBpdCB1bmltcGxlbWVudGVkIHVudGlsIHB5bmZzIGdlbmVyYXRlcworICogYmV0dGVyIFhJRCdzLgorICovCitzdGF0aWMgc3RydWN0IHN2Y19wcm9jZWR1cmUJCW5mc2RfcHJvY2VkdXJlczRbMl0gPSB7CisgIFBST0MobnVsbCwJIHZvaWQsCQl2b2lkLAkJdm9pZCwJICBSQ19OT0NBQ0hFLCAxKSwKKyAgUFJPQyhjb21wb3VuZCwgY29tcG91bmQsCWNvbXBvdW5kLAljb21wb3VuZCwgUkNfTk9DQUNIRSwgTkZTRF9CVUZTSVpFKQorfTsKKworc3RydWN0IHN2Y192ZXJzaW9uCW5mc2RfdmVyc2lvbjQgPSB7CisJCS52c192ZXJzCT0gNCwKKwkJLnZzX25wcm9jCT0gMiwKKwkJLnZzX3Byb2MJPSBuZnNkX3Byb2NlZHVyZXM0LAorCQkudnNfZGlzcGF0Y2gJPSBuZnNkX2Rpc3BhdGNoLAorCQkudnNfeGRyc2l6ZQk9IE5GUzRfU1ZDX1hEUlNJWkUsCit9OworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNHN0YXRlLmMgYi9mcy9uZnNkL25mczRzdGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3OWY3ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnNkL25mczRzdGF0ZS5jCkBAIC0wLDAgKzEsMzMyMCBAQAorLyoKKyogIGxpbnV4L2ZzL25mc2QvbmZzNHN0YXRlLmMKKyoKKyogIENvcHlyaWdodCAoYykgMjAwMSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBNaWNoaWdhbi4KKyogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqICBLZW5kcmljayBTbWl0aCA8a21zbWl0aEB1bWljaC5lZHU+CisqICBBbmR5IEFkYW1zb24gPGthbmRyb3NAdW1pY2guZWR1PgorKgorKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyogIGFyZSBtZXQ6CisqCisqICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorKiAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqICAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzCisqICAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyogIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisqICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyogIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyogIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorKiAgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyogIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgorKiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorKiAgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyogIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworKiAgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqCisqLworCisjaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL25mc2QuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL2NhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnM0Lmg+CisjaW5jbHVkZSA8bGludXgvbmZzZC9zdGF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2QveGRyNC5oPgorCisjZGVmaW5lIE5GU0REQkdfRkFDSUxJVFkgICAgICAgICAgICAgICAgTkZTRERCR19QUk9DCisKKy8qIEdsb2JhbHMgKi8KK3N0YXRpYyB0aW1lX3QgbGVhc2VfdGltZSA9IDkwOyAgICAgLyogZGVmYXVsdCBsZWFzZSB0aW1lICovCitzdGF0aWMgdGltZV90IG9sZF9sZWFzZV90aW1lID0gOTA7IC8qIHBhc3QgaW5jYXJuYXRpb24gbGVhc2UgdGltZSAqLworc3RhdGljIHUzMiBuZnM0X3JlY2xhaW1faW5pdCA9IDA7Cit0aW1lX3QgYm9vdF90aW1lOworc3RhdGljIHRpbWVfdCBncmFjZV9lbmQgPSAwOworc3RhdGljIHUzMiBjdXJyZW50X2NsaWVudGlkID0gMTsKK3N0YXRpYyB1MzIgY3VycmVudF9vd25lcmlkID0gMTsKK3N0YXRpYyB1MzIgY3VycmVudF9maWxlaWQgPSAxOworc3RhdGljIHUzMiBjdXJyZW50X2RlbGVnaWQgPSAxOworc3RhdGljIHUzMiBuZnM0X2luaXQ7CitzdGF0ZWlkX3QgemVyb3N0YXRlaWQ7ICAgICAgICAgICAgIC8qIGJpdHMgYWxsIDAgKi8KK3N0YXRlaWRfdCBvbmVzdGF0ZWlkOyAgICAgICAgICAgICAgLyogYml0cyBhbGwgMSAqLworCisvKiBkZWJ1ZyBjb3VudGVycyAqLwordTMyIGxpc3RfYWRkX3BlcmZpbGUgPSAwOyAKK3UzMiBsaXN0X2RlbF9wZXJmaWxlID0gMDsKK3UzMiBhZGRfcGVyY2xpZW50ID0gMDsKK3UzMiBkZWxfcGVyY2xpZW50ID0gMDsKK3UzMiBhbGxvY19maWxlID0gMDsKK3UzMiBmcmVlX2ZpbGUgPSAwOwordTMyIHZmc29wZW4gPSAwOwordTMyIHZmc2Nsb3NlID0gMDsKK3UzMiBhbGxvY19kZWxlZ2F0aW9uPSAwOwordTMyIGZyZWVfZGVsZWdhdGlvbj0gMDsKKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KK3N0cnVjdCBuZnM0X3N0YXRlaWQgKiBmaW5kX3N0YXRlaWQoc3RhdGVpZF90ICpzdGlkLCBpbnQgZmxhZ3MpOworc3RhdGljIHN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKiBmaW5kX2RlbGVnYXRpb25fc3RhdGVpZChzdHJ1Y3QgaW5vZGUgKmlubywgc3RhdGVpZF90ICpzdGlkKTsKK3N0YXRpYyB2b2lkIHJlbGVhc2Vfc3RhdGVpZF9sb2Nrb3duZXJzKHN0cnVjdCBuZnM0X3N0YXRlaWQgKm9wZW5fc3RwKTsKKworLyogTG9ja2luZzoKKyAqCisgKiBjbGllbnRfc2VtYTogCisgKiAJcHJvdGVjdHMgY2xpZW50aWRfaGFzaHRibFtdLCBjbGllbnRzdHJfaGFzaHRibFtdLAorICogCXVuY29uZnN0cl9oYXNodGJsW10sIHVuY29maWRfaGFzaHRibFtdLgorICovCitzdGF0aWMgREVDTEFSRV9NVVRFWChjbGllbnRfc2VtYSk7CisKK3ZvaWQKK25mczRfbG9ja19zdGF0ZSh2b2lkKQoreworCWRvd24oJmNsaWVudF9zZW1hKTsKK30KKwordm9pZAorbmZzNF91bmxvY2tfc3RhdGUodm9pZCkKK3sKKwl1cCgmY2xpZW50X3NlbWEpOworfQorCitzdGF0aWMgaW5saW5lIHUzMgorb3BhcXVlX2hhc2h2YWwoY29uc3Qgdm9pZCAqcHRyLCBpbnQgbmJ5dGVzKQoreworCXVuc2lnbmVkIGNoYXIgKmNwdHIgPSAodW5zaWduZWQgY2hhciAqKSBwdHI7CisKKwl1MzIgeCA9IDA7CisJd2hpbGUgKG5ieXRlcy0tKSB7CisJCXggKj0gMzc7CisJCXggKz0gKmNwdHIrKzsKKwl9CisJcmV0dXJuIHg7Cit9CisKKy8qIGZvcndhcmQgZGVjbGFyYXRpb25zICovCitzdGF0aWMgdm9pZCByZWxlYXNlX3N0YXRlb3duZXIoc3RydWN0IG5mczRfc3RhdGVvd25lciAqc29wKTsKK3N0YXRpYyB2b2lkIHJlbGVhc2Vfc3RhdGVpZChzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpzdHAsIGludCBmbGFncyk7CitzdGF0aWMgdm9pZCByZWxlYXNlX2ZpbGUoc3RydWN0IG5mczRfZmlsZSAqZnApOworCisvKgorICogRGVsZWdhdGlvbiBzdGF0ZQorICovCisKKy8qIHJlY2FsbF9sb2NrIHByb3RlY3RzIHRoZSBkZWxfcmVjYWxsX2xydSAqLworc3BpbmxvY2tfdCByZWNhbGxfbG9jazsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIGRlbF9yZWNhbGxfbHJ1OworCitzdGF0aWMgc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqCithbGxvY19pbml0X2RlbGVnKHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwLCBzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHUzMiB0eXBlKQoreworCXN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKmRwOworCXN0cnVjdCBuZnM0X2ZpbGUgKmZwID0gc3RwLT5zdF9maWxlOworCXN0cnVjdCBuZnM0X2NhbGxiYWNrICpjYiA9ICZzdHAtPnN0X3N0YXRlb3duZXItPnNvX2NsaWVudC0+Y2xfY2FsbGJhY2s7CisKKwlkcHJpbnRrKCJORlNEIGFsbG9jX2luaXRfZGVsZWdcbiIpOworCWlmICgoZHAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uKSwKKwkJR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCXJldHVybiBkcDsKKwlJTklUX0xJU1RfSEVBRCgmZHAtPmRsX2RlbF9wZXJmaWxlKTsKKwlJTklUX0xJU1RfSEVBRCgmZHAtPmRsX2RlbF9wZXJjbG50KTsKKwlJTklUX0xJU1RfSEVBRCgmZHAtPmRsX3JlY2FsbF9scnUpOworCWRwLT5kbF9jbGllbnQgPSBjbHA7CisJZHAtPmRsX2ZpbGUgPSBmcDsKKwlkcC0+ZGxfZmxvY2sgPSBOVUxMOworCWdldF9maWxlKHN0cC0+c3RfdmZzX2ZpbGUpOworCWRwLT5kbF92ZnNfZmlsZSA9IHN0cC0+c3RfdmZzX2ZpbGU7CisJZHAtPmRsX3R5cGUgPSB0eXBlOworCWRwLT5kbF9yZWNhbGwuY2JyX2RwID0gTlVMTDsKKwlkcC0+ZGxfcmVjYWxsLmNicl9pZGVudCA9IGNiLT5jYl9pZGVudDsKKwlkcC0+ZGxfcmVjYWxsLmNicl90cnVuYyA9IDA7CisJZHAtPmRsX3N0YXRlaWQuc2lfYm9vdCA9IGJvb3RfdGltZTsKKwlkcC0+ZGxfc3RhdGVpZC5zaV9zdGF0ZW93bmVyaWQgPSBjdXJyZW50X2RlbGVnaWQrKzsKKwlkcC0+ZGxfc3RhdGVpZC5zaV9maWxlaWQgPSAwOworCWRwLT5kbF9zdGF0ZWlkLnNpX2dlbmVyYXRpb24gPSAwOworCWRwLT5kbF9maGxlbiA9IGN1cnJlbnRfZmgtPmZoX2hhbmRsZS5maF9zaXplOworCW1lbWNweShkcC0+ZGxfZmh2YWwsICZjdXJyZW50X2ZoLT5maF9oYW5kbGUuZmhfYmFzZSwKKwkJICAgICAgICBjdXJyZW50X2ZoLT5maF9oYW5kbGUuZmhfc2l6ZSk7CisJZHAtPmRsX3RpbWUgPSAwOworCWF0b21pY19zZXQoJmRwLT5kbF9jb3VudCwgMSk7CisJbGlzdF9hZGQoJmRwLT5kbF9kZWxfcGVyZmlsZSwgJmZwLT5maV9kZWxfcGVyZmlsZSk7CisJbGlzdF9hZGQoJmRwLT5kbF9kZWxfcGVyY2xudCwgJmNscC0+Y2xfZGVsX3BlcmNsbnQpOworCWFsbG9jX2RlbGVnYXRpb24rKzsKKwlyZXR1cm4gZHA7Cit9CisKK3ZvaWQKK25mczRfcHV0X2RlbGVnYXRpb24oc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqZHApCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmRwLT5kbF9jb3VudCkpIHsKKwkJZHByaW50aygiTkZTRDogZnJlZWluZyBkcCAlcFxuIixkcCk7CisJCWtmcmVlKGRwKTsKKwkJZnJlZV9kZWxlZ2F0aW9uKys7CisJfQorfQorCisvKiBSZW1vdmUgdGhlIGFzc29jaWF0ZWQgZmlsZV9sb2NrIGZpcnN0LCB0aGVuIHJlbW92ZSB0aGUgZGVsZWdhdGlvbi4KKyAqIGxlYXNlX21vZGlmeSgpIGlzIGNhbGxlZCB0byByZW1vdmUgdGhlIEZTX0xFQVNFIGZpbGVfbG9jayBmcm9tCisgKiB0aGUgaV9mbG9jayBsaXN0LCBldmVudHVhbGx5IGNhbGxpbmcgbmZzZCdzIGxvY2tfbWFuYWdlcgorICogZmxfcmVsZWFzZV9jYWxsYmFjay4KKyAqLworc3RhdGljIHZvaWQKK25mczRfY2xvc2VfZGVsZWdhdGlvbihzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICpkcCkKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlscCA9IGRwLT5kbF92ZnNfZmlsZTsKKworCWRwcmludGsoIk5GU0Q6IGNsb3NlX2RlbGVnYXRpb24gZHAgJXBcbiIsZHApOworCWRwLT5kbF92ZnNfZmlsZSA9IE5VTEw7CisJLyogVGhlIGZvbGxvd2luZyBuZnNkX2Nsb3NlIG1heSBub3QgYWN0dWFsbHkgY2xvc2UgdGhlIGZpbGUsCisJICogYnV0IHdlIHdhbnQgdG8gcmVtb3ZlIHRoZSBsZWFzZSBpbiBhbnkgY2FzZS4gKi8KKwlzZXRsZWFzZShmaWxwLCBGX1VOTENLLCAmZHAtPmRsX2Zsb2NrKTsKKwluZnNkX2Nsb3NlKGZpbHApOworCXZmc2Nsb3NlKys7Cit9CisKKy8qIENhbGxlZCB1bmRlciB0aGUgc3RhdGUgbG9jay4gKi8KK3N0YXRpYyB2b2lkCit1bmhhc2hfZGVsZWdhdGlvbihzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICpkcCkKK3sKKwlsaXN0X2RlbF9pbml0KCZkcC0+ZGxfZGVsX3BlcmZpbGUpOworCWxpc3RfZGVsX2luaXQoJmRwLT5kbF9kZWxfcGVyY2xudCk7CisJc3Bpbl9sb2NrKCZyZWNhbGxfbG9jayk7CisJbGlzdF9kZWxfaW5pdCgmZHAtPmRsX3JlY2FsbF9scnUpOworCXNwaW5fdW5sb2NrKCZyZWNhbGxfbG9jayk7CisJbmZzNF9jbG9zZV9kZWxlZ2F0aW9uKGRwKTsKKwluZnM0X3B1dF9kZWxlZ2F0aW9uKGRwKTsKK30KKworLyogCisgKiBTRVRDTElFTlRJRCBzdGF0ZSAKKyAqLworCisvKiBIYXNoIHRhYmxlcyBmb3IgbmZzNF9jbGllbnRpZCBzdGF0ZSAqLworI2RlZmluZSBDTElFTlRfSEFTSF9CSVRTICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIENMSUVOVF9IQVNIX1NJWkUgICAgICAgICAgICAgICAgKDEgPDwgQ0xJRU5UX0hBU0hfQklUUykKKyNkZWZpbmUgQ0xJRU5UX0hBU0hfTUFTSyAgICAgICAgICAgICAgICAoQ0xJRU5UX0hBU0hfU0laRSAtIDEpCisKKyNkZWZpbmUgY2xpZW50aWRfaGFzaHZhbChpZCkgXAorCSgoaWQpICYgQ0xJRU5UX0hBU0hfTUFTSykKKyNkZWZpbmUgY2xpZW50c3RyX2hhc2h2YWwobmFtZSwgbmFtZWxlbikgXAorCShvcGFxdWVfaGFzaHZhbCgobmFtZSksIChuYW1lbGVuKSkgJiBDTElFTlRfSEFTSF9NQVNLKQorLyoKKyAqIHJlY2xhaW1fc3RyX2hhc2h0YmxbXSBob2xkcyBrbm93biBjbGllbnQgaW5mbyBmcm9tIHByZXZpb3VzIHJlc2V0L3JlYm9vdAorICogdXNlZCBpbiByZWJvb3QvcmVzZXQgbGVhc2UgZ3JhY2UgcGVyaW9kIHByb2Nlc3NpbmcKKyAqCisgKiBjb25mX2lkX2hhc2h0YmxbXSwgYW5kIGNvbmZfc3RyX2hhc2h0YmxbXSBob2xkIGNvbmZpcm1lZAorICogc2V0Y2xpZW50aWRfY29uZmlybWVkIGluZm8uIAorICoKKyAqIHVuY29uZl9zdHJfaGFzdGJsW10gYW5kIHVuY29uZl9pZF9oYXNodGJsW10gaG9sZCB1bmNvbmZpcm1lZCAKKyAqIHNldGNsaWVudGlkIGluZm8uCisgKgorICogY2xpZW50X2xydSBob2xkcyBjbGllbnQgcXVldWUgb3JkZXJlZCBieSBuZnM0X2NsaWVudC5jbF90aW1lCisgKiBmb3IgbGVhc2UgcmVuZXdhbC4KKyAqCisgKiBjbG9zZV9scnUgaG9sZHMgKG9wZW4pIHN0YXRlb3duZXIgcXVldWUgb3JkZXJlZCBieSBuZnM0X3N0YXRlb3duZXIuc29fdGltZQorICogZm9yIGxhc3QgY2xvc2UgcmVwbGF5LgorICovCitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZAlyZWNsYWltX3N0cl9oYXNodGJsW0NMSUVOVF9IQVNIX1NJWkVdOworc3RhdGljIGludCByZWNsYWltX3N0cl9oYXNodGJsX3NpemUgPSAwOworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQJY29uZl9pZF9oYXNodGJsW0NMSUVOVF9IQVNIX1NJWkVdOworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQJY29uZl9zdHJfaGFzaHRibFtDTElFTlRfSEFTSF9TSVpFXTsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkCXVuY29uZl9zdHJfaGFzaHRibFtDTElFTlRfSEFTSF9TSVpFXTsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkCXVuY29uZl9pZF9oYXNodGJsW0NMSUVOVF9IQVNIX1NJWkVdOworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgY2xpZW50X2xydTsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIGNsb3NlX2xydTsKKworc3RhdGljIGlubGluZSB2b2lkCityZW5ld19jbGllbnQoc3RydWN0IG5mczRfY2xpZW50ICpjbHApCit7CisJLyoKKwkqIE1vdmUgY2xpZW50IHRvIHRoZSBlbmQgdG8gdGhlIExSVSBsaXN0LgorCSovCisJZHByaW50aygicmVuZXdpbmcgY2xpZW50IChjbGllbnRpZCAlMDh4LyUwOHgpXG4iLCAKKwkJCWNscC0+Y2xfY2xpZW50aWQuY2xfYm9vdCwgCisJCQljbHAtPmNsX2NsaWVudGlkLmNsX2lkKTsKKwlsaXN0X21vdmVfdGFpbCgmY2xwLT5jbF9scnUsICZjbGllbnRfbHJ1KTsKKwljbHAtPmNsX3RpbWUgPSBnZXRfc2Vjb25kcygpOworfQorCisvKiBTRVRDTElFTlRJRCBhbmQgU0VUQ0xJRU5USURfQ09ORklSTSBIZWxwZXIgZnVuY3Rpb25zICovCitzdGF0aWMgaW50CitTVEFMRV9DTElFTlRJRChjbGllbnRpZF90ICpjbGlkKQoreworCWlmIChjbGlkLT5jbF9ib290ID09IGJvb3RfdGltZSkKKwkJcmV0dXJuIDA7CisJZHByaW50aygiTkZTRCBzdGFsZSBjbGllbnRpZCAoJTA4eC8lMDh4KVxuIiwgCisJCQljbGlkLT5jbF9ib290LCBjbGlkLT5jbF9pZCk7CisJcmV0dXJuIDE7Cit9CisKKy8qIAorICogWFhYIFNob3VsZCB3ZSB1c2UgYSBzbGFiIGNhY2hlID8KKyAqIFRoaXMgdHlwZSBvZiBtZW1vcnkgbWFuYWdlbWVudCBpcyBzb21ld2hhdCBpbmVmZmljaWVudCwgYnV0IHdlIHVzZSBpdAorICogYW55d2F5IHNpbmNlIFNFVENMSUVOVElEIGlzIG5vdCBhIGNvbW1vbiBvcGVyYXRpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5mczRfY2xpZW50ICoKK2FsbG9jX2NsaWVudChzdHJ1Y3QgeGRyX25ldG9iaiBuYW1lKQoreworCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwOworCisJaWYgKChjbHAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbmZzNF9jbGllbnQpLCBHRlBfS0VSTkVMKSkhPSBOVUxMKSB7CisJCW1lbXNldChjbHAsIDAsIHNpemVvZigqY2xwKSk7CisJCWlmICgoY2xwLT5jbF9uYW1lLmRhdGEgPSBrbWFsbG9jKG5hbWUubGVuLCBHRlBfS0VSTkVMKSkgIT0gTlVMTCkgeworCQkJbWVtY3B5KGNscC0+Y2xfbmFtZS5kYXRhLCBuYW1lLmRhdGEsIG5hbWUubGVuKTsKKwkJCWNscC0+Y2xfbmFtZS5sZW4gPSBuYW1lLmxlbjsKKwkJfQorCQllbHNlIHsKKwkJCWtmcmVlKGNscCk7CisJCQljbHAgPSBOVUxMOworCQl9CisJfQorCXJldHVybiBjbHA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZnJlZV9jbGllbnQoc3RydWN0IG5mczRfY2xpZW50ICpjbHApCit7CisJaWYgKGNscC0+Y2xfY3JlZC5jcl9ncm91cF9pbmZvKQorCQlwdXRfZ3JvdXBfaW5mbyhjbHAtPmNsX2NyZWQuY3JfZ3JvdXBfaW5mbyk7CisJa2ZyZWUoY2xwLT5jbF9uYW1lLmRhdGEpOworCWtmcmVlKGNscCk7Cit9CisKK3ZvaWQKK3B1dF9uZnM0X2NsaWVudChzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCkKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmY2xwLT5jbF9jb3VudCkpCisJCWZyZWVfY2xpZW50KGNscCk7Cit9CisKK3N0YXRpYyB2b2lkCitleHBpcmVfY2xpZW50KHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwKQoreworCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKnNvcDsKKwlzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICpkcDsKKwlzdHJ1Y3QgbmZzNF9jYWxsYmFjayAqY2IgPSAmY2xwLT5jbF9jYWxsYmFjazsKKwlzdHJ1Y3QgcnBjX2NsbnQgKmNsbnQgPSBjbHAtPmNsX2NhbGxiYWNrLmNiX2NsaWVudDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHJlYXBsaXN0OworCisJZHByaW50aygiTkZTRDogZXhwaXJlX2NsaWVudCBjbF9jb3VudCAlZFxuIiwKKwkgICAgICAgICAgICAgICAgICAgIGF0b21pY19yZWFkKCZjbHAtPmNsX2NvdW50KSk7CisKKwkvKiBzaHV0ZG93biBycGMgY2xpZW50LCBlbmRpbmcgYW55IG91dHN0YW5kaW5nIHJlY2FsbCBycGNzICovCisJaWYgKGF0b21pY19yZWFkKCZjYi0+Y2Jfc2V0KSA9PSAxICYmIGNsbnQpIHsKKwkJcnBjX3NodXRkb3duX2NsaWVudChjbG50KTsKKwkJY2xudCA9IGNscC0+Y2xfY2FsbGJhY2suY2JfY2xpZW50ID0gTlVMTDsKKwl9CisKKwlJTklUX0xJU1RfSEVBRCgmcmVhcGxpc3QpOworCXNwaW5fbG9jaygmcmVjYWxsX2xvY2spOworCXdoaWxlICghbGlzdF9lbXB0eSgmY2xwLT5jbF9kZWxfcGVyY2xudCkpIHsKKwkJZHAgPSBsaXN0X2VudHJ5KGNscC0+Y2xfZGVsX3BlcmNsbnQubmV4dCwgc3RydWN0IG5mczRfZGVsZWdhdGlvbiwgZGxfZGVsX3BlcmNsbnQpOworCQlkcHJpbnRrKCJORlNEOiBleHBpcmUgY2xpZW50LiBkcCAlcCwgZnAgJXBcbiIsIGRwLAorCQkJCWRwLT5kbF9mbG9jayk7CisJCWxpc3RfZGVsX2luaXQoJmRwLT5kbF9kZWxfcGVyY2xudCk7CisJCWxpc3RfbW92ZSgmZHAtPmRsX3JlY2FsbF9scnUsICZyZWFwbGlzdCk7CisJfQorCXNwaW5fdW5sb2NrKCZyZWNhbGxfbG9jayk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZyZWFwbGlzdCkpIHsKKwkJZHAgPSBsaXN0X2VudHJ5KHJlYXBsaXN0Lm5leHQsIHN0cnVjdCBuZnM0X2RlbGVnYXRpb24sIGRsX3JlY2FsbF9scnUpOworCQlsaXN0X2RlbF9pbml0KCZkcC0+ZGxfcmVjYWxsX2xydSk7CisJCXVuaGFzaF9kZWxlZ2F0aW9uKGRwKTsKKwl9CisJbGlzdF9kZWwoJmNscC0+Y2xfaWRoYXNoKTsKKwlsaXN0X2RlbCgmY2xwLT5jbF9zdHJoYXNoKTsKKwlsaXN0X2RlbCgmY2xwLT5jbF9scnUpOworCXdoaWxlICghbGlzdF9lbXB0eSgmY2xwLT5jbF9wZXJjbGllbnQpKSB7CisJCXNvcCA9IGxpc3RfZW50cnkoY2xwLT5jbF9wZXJjbGllbnQubmV4dCwgc3RydWN0IG5mczRfc3RhdGVvd25lciwgc29fcGVyY2xpZW50KTsKKwkJcmVsZWFzZV9zdGF0ZW93bmVyKHNvcCk7CisJfQorCXB1dF9uZnM0X2NsaWVudChjbHApOworfQorCitzdGF0aWMgc3RydWN0IG5mczRfY2xpZW50ICoKK2NyZWF0ZV9jbGllbnQoc3RydWN0IHhkcl9uZXRvYmogbmFtZSkgeworCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwOworCisJaWYgKCEoY2xwID0gYWxsb2NfY2xpZW50KG5hbWUpKSkKKwkJZ290byBvdXQ7CisJYXRvbWljX3NldCgmY2xwLT5jbF9jb3VudCwgMSk7CisJYXRvbWljX3NldCgmY2xwLT5jbF9jYWxsYmFjay5jYl9zZXQsIDApOworCWNscC0+Y2xfY2FsbGJhY2suY2JfcGFyc2VkID0gMDsKKwlJTklUX0xJU1RfSEVBRCgmY2xwLT5jbF9pZGhhc2gpOworCUlOSVRfTElTVF9IRUFEKCZjbHAtPmNsX3N0cmhhc2gpOworCUlOSVRfTElTVF9IRUFEKCZjbHAtPmNsX3BlcmNsaWVudCk7CisJSU5JVF9MSVNUX0hFQUQoJmNscC0+Y2xfZGVsX3BlcmNsbnQpOworCUlOSVRfTElTVF9IRUFEKCZjbHAtPmNsX2xydSk7CitvdXQ6CisJcmV0dXJuIGNscDsKK30KKworc3RhdGljIHZvaWQKK2NvcHlfdmVyZihzdHJ1Y3QgbmZzNF9jbGllbnQgKnRhcmdldCwgbmZzNF92ZXJpZmllciAqc291cmNlKSB7CisJbWVtY3B5KHRhcmdldC0+Y2xfdmVyaWZpZXIuZGF0YSwgc291cmNlLT5kYXRhLCBzaXplb2YodGFyZ2V0LT5jbF92ZXJpZmllci5kYXRhKSk7Cit9CisKK3N0YXRpYyB2b2lkCitjb3B5X2NsaWQoc3RydWN0IG5mczRfY2xpZW50ICp0YXJnZXQsIHN0cnVjdCBuZnM0X2NsaWVudCAqc291cmNlKSB7CisJdGFyZ2V0LT5jbF9jbGllbnRpZC5jbF9ib290ID0gc291cmNlLT5jbF9jbGllbnRpZC5jbF9ib290OyAKKwl0YXJnZXQtPmNsX2NsaWVudGlkLmNsX2lkID0gc291cmNlLT5jbF9jbGllbnRpZC5jbF9pZDsgCit9CisKK3N0YXRpYyB2b2lkCitjb3B5X2NyZWQoc3RydWN0IHN2Y19jcmVkICp0YXJnZXQsIHN0cnVjdCBzdmNfY3JlZCAqc291cmNlKSB7CisKKwl0YXJnZXQtPmNyX3VpZCA9IHNvdXJjZS0+Y3JfdWlkOworCXRhcmdldC0+Y3JfZ2lkID0gc291cmNlLT5jcl9naWQ7CisJdGFyZ2V0LT5jcl9ncm91cF9pbmZvID0gc291cmNlLT5jcl9ncm91cF9pbmZvOworCWdldF9ncm91cF9pbmZvKHRhcmdldC0+Y3JfZ3JvdXBfaW5mbyk7Cit9CisKK3N0YXRpYyBpbnQKK2NtcF9uYW1lKHN0cnVjdCB4ZHJfbmV0b2JqICpuMSwgc3RydWN0IHhkcl9uZXRvYmogKm4yKSB7CisJaWYgKCFuMSB8fCAhbjIpCisJCXJldHVybiAwOworCXJldHVybigobjEtPmxlbiA9PSBuMi0+bGVuKSAmJiAhbWVtY21wKG4xLT5kYXRhLCBuMi0+ZGF0YSwgbjItPmxlbikpOworfQorCitzdGF0aWMgaW50CitjbXBfdmVyZihuZnM0X3ZlcmlmaWVyICp2MSwgbmZzNF92ZXJpZmllciAqdjIpIHsKKwlyZXR1cm4oIW1lbWNtcCh2MS0+ZGF0YSx2Mi0+ZGF0YSxzaXplb2YodjEtPmRhdGEpKSk7Cit9CisKK3N0YXRpYyBpbnQKK2NtcF9jbGlkKGNsaWVudGlkX3QgKiBjbDEsIGNsaWVudGlkX3QgKiBjbDIpIHsKKwlyZXR1cm4oKGNsMS0+Y2xfYm9vdCA9PSBjbDItPmNsX2Jvb3QpICYmCisJICAgCShjbDEtPmNsX2lkID09IGNsMi0+Y2xfaWQpKTsKK30KKworLyogWFhYIHdoYXQgYWJvdXQgTkdST1VQICovCitzdGF0aWMgaW50CitjbXBfY3JlZHMoc3RydWN0IHN2Y19jcmVkICpjcjEsIHN0cnVjdCBzdmNfY3JlZCAqY3IyKXsKKwlyZXR1cm4oY3IxLT5jcl91aWQgPT0gY3IyLT5jcl91aWQpOworCit9CisKK3N0YXRpYyB2b2lkCitnZW5fY2xpZChzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCkgeworCWNscC0+Y2xfY2xpZW50aWQuY2xfYm9vdCA9IGJvb3RfdGltZTsKKwljbHAtPmNsX2NsaWVudGlkLmNsX2lkID0gY3VycmVudF9jbGllbnRpZCsrOyAKK30KKworc3RhdGljIHZvaWQKK2dlbl9jb25maXJtKHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwKSB7CisJc3RydWN0IHRpbWVzcGVjIAl0djsKKwl1MzIgKgkJCXA7CisKKwl0diA9IENVUlJFTlRfVElNRTsKKwlwID0gKHUzMiAqKWNscC0+Y2xfY29uZmlybS5kYXRhOworCSpwKysgPSB0di50dl9zZWM7CisJKnArKyA9IHR2LnR2X25zZWM7Cit9CisKK3N0YXRpYyBpbnQKK2NoZWNrX25hbWUoc3RydWN0IHhkcl9uZXRvYmogbmFtZSkgeworCisJaWYgKG5hbWUubGVuID09IDApIAorCQlyZXR1cm4gMDsKKwlpZiAobmFtZS5sZW4gPiBORlM0X09QQVFVRV9MSU1JVCkgeworCQlwcmludGsoIk5GU0Q6IGNoZWNrX25hbWU6IG5hbWUgdG9vIGxvbmcoJWQpIVxuIiwgbmFtZS5sZW4pOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3ZvaWQKK2FkZF90b191bmNvbmZpcm1lZChzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCwgdW5zaWduZWQgaW50IHN0cmhhc2h2YWwpCit7CisJdW5zaWduZWQgaW50IGlkaGFzaHZhbDsKKworCWxpc3RfYWRkKCZjbHAtPmNsX3N0cmhhc2gsICZ1bmNvbmZfc3RyX2hhc2h0Ymxbc3RyaGFzaHZhbF0pOworCWlkaGFzaHZhbCA9IGNsaWVudGlkX2hhc2h2YWwoY2xwLT5jbF9jbGllbnRpZC5jbF9pZCk7CisJbGlzdF9hZGQoJmNscC0+Y2xfaWRoYXNoLCAmdW5jb25mX2lkX2hhc2h0YmxbaWRoYXNodmFsXSk7CisJbGlzdF9hZGRfdGFpbCgmY2xwLT5jbF9scnUsICZjbGllbnRfbHJ1KTsKKwljbHAtPmNsX3RpbWUgPSBnZXRfc2Vjb25kcygpOworfQorCit2b2lkCittb3ZlX3RvX2NvbmZpcm1lZChzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCkKK3sKKwl1bnNpZ25lZCBpbnQgaWRoYXNodmFsID0gY2xpZW50aWRfaGFzaHZhbChjbHAtPmNsX2NsaWVudGlkLmNsX2lkKTsKKwl1bnNpZ25lZCBpbnQgc3RyaGFzaHZhbDsKKworCWRwcmludGsoIk5GU0Q6IG1vdmVfdG9fY29uZmlybSBuZnM0X2NsaWVudCAlcFxuIiwgY2xwKTsKKwlsaXN0X2RlbF9pbml0KCZjbHAtPmNsX3N0cmhhc2gpOworCWxpc3RfZGVsX2luaXQoJmNscC0+Y2xfaWRoYXNoKTsKKwlsaXN0X2FkZCgmY2xwLT5jbF9pZGhhc2gsICZjb25mX2lkX2hhc2h0YmxbaWRoYXNodmFsXSk7CisJc3RyaGFzaHZhbCA9IGNsaWVudHN0cl9oYXNodmFsKGNscC0+Y2xfbmFtZS5kYXRhLCAKKwkJCWNscC0+Y2xfbmFtZS5sZW4pOworCWxpc3RfYWRkKCZjbHAtPmNsX3N0cmhhc2gsICZjb25mX3N0cl9oYXNodGJsW3N0cmhhc2h2YWxdKTsKKwlyZW5ld19jbGllbnQoY2xwKTsKK30KKworc3RhdGljIHN0cnVjdCBuZnM0X2NsaWVudCAqCitmaW5kX2NvbmZpcm1lZF9jbGllbnQoY2xpZW50aWRfdCAqY2xpZCkKK3sKKwlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscDsKKwl1bnNpZ25lZCBpbnQgaWRoYXNodmFsID0gY2xpZW50aWRfaGFzaHZhbChjbGlkLT5jbF9pZCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNscCwgJmNvbmZfaWRfaGFzaHRibFtpZGhhc2h2YWxdLCBjbF9pZGhhc2gpIHsKKwkJaWYgKGNtcF9jbGlkKCZjbHAtPmNsX2NsaWVudGlkLCBjbGlkKSkKKwkJCXJldHVybiBjbHA7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IG5mczRfY2xpZW50ICoKK2ZpbmRfdW5jb25maXJtZWRfY2xpZW50KGNsaWVudGlkX3QgKmNsaWQpCit7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHA7CisJdW5zaWduZWQgaW50IGlkaGFzaHZhbCA9IGNsaWVudGlkX2hhc2h2YWwoY2xpZC0+Y2xfaWQpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbHAsICZ1bmNvbmZfaWRfaGFzaHRibFtpZGhhc2h2YWxdLCBjbF9pZGhhc2gpIHsKKwkJaWYgKGNtcF9jbGlkKCZjbHAtPmNsX2NsaWVudGlkLCBjbGlkKSkKKwkJCXJldHVybiBjbHA7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiBhIGhlbHBlciBmdW5jdGlvbiBmb3IgcGFyc2VfY2FsbGJhY2sgKi8KK3N0YXRpYyBpbnQKK3BhcnNlX29jdGV0KHVuc2lnbmVkIGludCAqbGVucCwgY2hhciAqKmFkZHJwKQoreworCXVuc2lnbmVkIGludCBsZW4gPSAqbGVucDsKKwljaGFyICpwID0gKmFkZHJwOworCWludCBuID0gLTE7CisJY2hhciBjOworCisJZm9yICg7OykgeworCQlpZiAoIWxlbikKKwkJCWJyZWFrOworCQlsZW4tLTsKKwkJYyA9ICpwKys7CisJCWlmIChjID09ICcuJykKKwkJCWJyZWFrOworCQlpZiAoKGMgPCAnMCcpIHx8IChjID4gJzknKSkgeworCQkJbiA9IC0xOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKG4gPCAwKQorCQkJbiA9IDA7CisJCW4gPSAobiAqIDEwKSArIChjIC0gJzAnKTsKKwkJaWYgKG4gPiAyNTUpIHsKKwkJCW4gPSAtMTsKKwkJCWJyZWFrOworCQl9CisJfQorCSpsZW5wID0gbGVuOworCSphZGRycCA9IHA7CisJcmV0dXJuIG47Cit9CisKKy8qIHBhcnNlIGFuZCBzZXQgdGhlIHNldGNsaWVudGlkIGlwdjQgY2FsbGJhY2sgYWRkcmVzcyAqLworaW50CitwYXJzZV9pcHY0KHVuc2lnbmVkIGludCBhZGRyX2xlbiwgY2hhciAqYWRkcl92YWwsIHVuc2lnbmVkIGludCAqY2JhZGRycCwgdW5zaWduZWQgc2hvcnQgKmNicG9ydHApCit7CisJaW50IHRlbXAgPSAwOworCXUzMiBjYmFkZHIgPSAwOworCXUxNiBjYnBvcnQgPSAwOworCXUzMiBhZGRybGVuID0gYWRkcl9sZW47CisJY2hhciAqYWRkciA9IGFkZHJfdmFsOworCWludCBpLCBzaGlmdDsKKworCS8qIGlwYWRkcmVzcyAqLworCXNoaWZ0ID0gMjQ7CisJZm9yKGkgPSA0OyBpID4gMCAgOyBpLS0pIHsKKwkJaWYgKCh0ZW1wID0gcGFyc2Vfb2N0ZXQoJmFkZHJsZW4sICZhZGRyKSkgPCAwKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljYmFkZHIgfD0gKHRlbXAgPDwgc2hpZnQpOworCQlpZiAoc2hpZnQgPiAwKQorCQlzaGlmdCAtPSA4OworCX0KKwkqY2JhZGRycCA9IGNiYWRkcjsKKworCS8qIHBvcnQgKi8KKwlzaGlmdCA9IDg7CisJZm9yKGkgPSAyOyBpID4gMCAgOyBpLS0pIHsKKwkJaWYgKCh0ZW1wID0gcGFyc2Vfb2N0ZXQoJmFkZHJsZW4sICZhZGRyKSkgPCAwKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljYnBvcnQgfD0gKHRlbXAgPDwgc2hpZnQpOworCQlpZiAoc2hpZnQgPiAwKQorCQkJc2hpZnQgLT0gODsKKwl9CisJKmNicG9ydHAgPSBjYnBvcnQ7CisJcmV0dXJuIDE7Cit9CisKK3ZvaWQKK2dlbl9jYWxsYmFjayhzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCwgc3RydWN0IG5mc2Q0X3NldGNsaWVudGlkICpzZSkKK3sKKwlzdHJ1Y3QgbmZzNF9jYWxsYmFjayAqY2IgPSAmY2xwLT5jbF9jYWxsYmFjazsKKworCS8qIEN1cnJlbnRseSwgd2Ugb25seSBzdXBwb3J0IHRjcCBmb3IgdGhlIGNhbGxiYWNrIGNoYW5uZWwgKi8KKwlpZiAoKHNlLT5zZV9jYWxsYmFja19uZXRpZF9sZW4gIT0gMykgfHwgbWVtY21wKChjaGFyICopc2UtPnNlX2NhbGxiYWNrX25ldGlkX3ZhbCwgInRjcCIsIDMpKQorCQlnb3RvIG91dF9lcnI7CisKKwlpZiAoICEocGFyc2VfaXB2NChzZS0+c2VfY2FsbGJhY2tfYWRkcl9sZW4sIHNlLT5zZV9jYWxsYmFja19hZGRyX3ZhbCwKKwkgICAgICAgICAgICAgICAgICZjYi0+Y2JfYWRkciwgJmNiLT5jYl9wb3J0KSkpCisJCWdvdG8gb3V0X2VycjsKKwljYi0+Y2JfcHJvZyA9IHNlLT5zZV9jYWxsYmFja19wcm9nOworCWNiLT5jYl9pZGVudCA9IHNlLT5zZV9jYWxsYmFja19pZGVudDsKKwljYi0+Y2JfcGFyc2VkID0gMTsKKwlyZXR1cm47CitvdXRfZXJyOgorCXByaW50ayhLRVJOX0lORk8gIk5GU0Q6IHRoaXMgY2xpZW50IChjbGllbnRpZCAlMDh4LyUwOHgpICIKKwkJIndpbGwgbm90IHJlY2VpdmUgZGVsZWdhdGlvbnNcbiIsCisJCWNscC0+Y2xfY2xpZW50aWQuY2xfYm9vdCwgY2xwLT5jbF9jbGllbnRpZC5jbF9pZCk7CisKKwljYi0+Y2JfcGFyc2VkID0gMDsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBSRkMgMzAxMCBoYXMgYSBjb21wbGV4IGltcGxtZW50YXRpb24gZGVzY3JpcHRpb24gb2YgcHJvY2Vzc2luZyBhIAorICogU0VUQ0xJRU5USUQgcmVxdWVzdCBjb25zaXN0aW5nIG9mIDUgYnVsbGV0cywgbGFiZWxlZCBhcyAKKyAqIENBU0UwIC0gQ0FTRTQgYmVsb3cuCisgKgorICogTk9URVM6CisgKiAJY2FsbGJhY2sgaW5mb3JtYXRpb24gd2lsbCBiZSBwcm9jZXNzZWQgaW4gYSBmdXR1cmUgcGF0Y2gKKyAqCisgKglhbiB1bmNvbmZpcm1lZCByZWNvcmQgaXMgYWRkZWQgd2hlbjoKKyAqICAgICAgTk9STUFMIChwYXJ0IG9mIENBU0UgNCk6IHRoZXJlIGlzIG5vIGNvbmZpcm1lZCBub3IgdW5jb25maXJtZWQgcmVjb3JkLgorICoJQ0FTRSAxOiBjb25maXJtZWQgcmVjb3JkIGZvdW5kIHdpdGggbWF0Y2hpbmcgbmFtZSwgcHJpbmNpcGFsLAorICoJCXZlcmlmaWVyLCBhbmQgY2xpZW50aWQuCisgKglDQVNFIDI6IGNvbmZpcm1lZCByZWNvcmQgZm91bmQgd2l0aCBtYXRjaGluZyBuYW1lLCBwcmluY2lwYWwsCisgKgkJYW5kIHRoZXJlIGlzIG5vIHVuY29uZmlybWVkIHJlY29yZCB3aXRoIG1hdGNoaW5nCisgKgkJbmFtZSBhbmQgcHJpbmNpcGFsCisgKgorICogICAgICBhbiB1bmNvbmZpcm1lZCByZWNvcmQgaXMgcmVwbGFjZWQgd2hlbjoKKyAqCUNBU0UgMzogY29uZmlybWVkIHJlY29yZCBmb3VuZCB3aXRoIG1hdGNoaW5nIG5hbWUsIHByaW5jaXBhbCwKKyAqCQlhbmQgYW4gdW5jb25maXJtZWQgcmVjb3JkIGlzIGZvdW5kIHdpdGggbWF0Y2hpbmcgCisgKgkJbmFtZSwgcHJpbmNpcGFsLCBhbmQgd2l0aCBjbGllbnRpZCBhbmQKKyAqCQljb25maXJtIHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhlIGNvbmZpcm1lZCByZWNvcmQuCisgKglDQVNFIDQ6IHRoZXJlIGlzIG5vIGNvbmZpcm1lZCByZWNvcmQgd2l0aCBtYXRjaGluZyBuYW1lIGFuZCAKKyAqCQlwcmluY2lwYWwuIHRoZXJlIGlzIGFuIHVuY29uZmlybWVkIHJlY29yZCB3aXRoIAorICoJCW1hdGNoaW5nIG5hbWUsIHByaW5jaXBhbC4KKyAqCisgKglhbiB1bmNvbmZpcm1lZCByZWNvcmQgaXMgZGVsZXRlZCB3aGVuOgorICoJQ0FTRSAxOiBhbiB1bmNvbmZpcm1lZCByZWNvcmQgdGhhdCBtYXRjaGVzIGlucHV0IG5hbWUsIHZlcmlmaWVyLAorICoJCWFuZCBjb25maXJtZWQgY2xpZW50aWQuCisgKglDQVNFIDQ6IGFueSB1bmNvbmZpcm1lZCByZWNvcmRzIHdpdGggbWF0Y2hpbmcgbmFtZSBhbmQgcHJpbmNpcGFsCisgKgkJdGhhdCBleGlzdCBhZnRlciBhbiB1bmNvbmZpcm1lZCByZWNvcmQgaGFzIGJlZW4gcmVwbGFjZWQKKyAqCQlhcyBkZXNjcmliZWQgYWJvdmUuCisgKgorICovCitpbnQKK25mc2Q0X3NldGNsaWVudGlkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkNF9zZXRjbGllbnRpZCAqc2V0Y2xpZCkKK3sKKwl1MzIgCQkJaXBfYWRkciA9IHJxc3RwLT5ycV9hZGRyLnNpbl9hZGRyLnNfYWRkcjsKKwlzdHJ1Y3QgeGRyX25ldG9iaiAJY2xuYW1lID0geyAKKwkJLmxlbiA9IHNldGNsaWQtPnNlX25hbWVsZW4sCisJCS5kYXRhID0gc2V0Y2xpZC0+c2VfbmFtZSwKKwl9OworCW5mczRfdmVyaWZpZXIJCWNsdmVyaWZpZXIgPSBzZXRjbGlkLT5zZV92ZXJmOworCXVuc2lnbmVkIGludCAJCXN0cmhhc2h2YWw7CisJc3RydWN0IG5mczRfY2xpZW50ICoJY29uZiwgKiB1bmNvbmYsICogbmV3LCAqIGNscDsKKwlpbnQgCQkJc3RhdHVzOworCQorCXN0YXR1cyA9IG5mc2Vycl9pbnZhbDsKKwlpZiAoIWNoZWNrX25hbWUoY2xuYW1lKSkKKwkJZ290byBvdXQ7CisKKwkvKiAKKwkgKiBYWFggVGhlIER1cGxpY2F0ZSBSZXF1ZXN0IENhY2hlIChEUkMpIGhhcyBiZWVuIGNoZWNrZWQgKD8/KQorCSAqIFdlIGdldCBoZXJlIG9uIGEgRFJDIG1pc3MuCisJICovCisKKwlzdHJoYXNodmFsID0gY2xpZW50c3RyX2hhc2h2YWwoY2xuYW1lLmRhdGEsIGNsbmFtZS5sZW4pOworCisJY29uZiA9IE5VTEw7CisJbmZzNF9sb2NrX3N0YXRlKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbHAsICZjb25mX3N0cl9oYXNodGJsW3N0cmhhc2h2YWxdLCBjbF9zdHJoYXNoKSB7CisJCWlmICghY21wX25hbWUoJmNscC0+Y2xfbmFtZSwgJmNsbmFtZSkpCisJCQljb250aW51ZTsKKwkJLyogCisJCSAqIENBU0UgMDoKKwkJICogY2xuYW1lIG1hdGNoLCBjb25maXJtZWQsIGRpZmZlcmVudCBwcmluY2lwYWwKKwkJICogb3IgZGlmZmVyZW50IGlwX2FkZHJlc3MKKwkJICovCisJCXN0YXR1cyA9IG5mc2Vycl9jbGlkX2ludXNlOworCQlpZiAoIWNtcF9jcmVkcygmY2xwLT5jbF9jcmVkLCZycXN0cC0+cnFfY3JlZCkpIHsKKwkJCXByaW50aygiTkZTRDogc2V0Y2xpZW50aWQ6IHN0cmluZyBpbiB1c2UgYnkgY2xpZW50IgorCQkJIihjbGllbnRpZCAlMDh4LyUwOHgpXG4iLAorCQkJY2xwLT5jbF9jbGllbnRpZC5jbF9ib290LCBjbHAtPmNsX2NsaWVudGlkLmNsX2lkKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChjbHAtPmNsX2FkZHIgIT0gaXBfYWRkcikgeyAKKwkJCXByaW50aygiTkZTRDogc2V0Y2xpZW50aWQ6IHN0cmluZyBpbiB1c2UgYnkgY2xpZW50IgorCQkJIihjbGllbnRpZCAlMDh4LyUwOHgpXG4iLAorCQkJY2xwLT5jbF9jbGllbnRpZC5jbF9ib290LCBjbHAtPmNsX2NsaWVudGlkLmNsX2lkKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogCisJIAkgKiBjbF9uYW1lIG1hdGNoIGZyb20gYSBwcmV2aW91cyBTRVRDTElFTlRJRCBvcGVyYXRpb24KKwkgCSAqIFhYWCBjaGVjayBmb3IgYWRkaXRpb25hbCBtYXRjaGVzPworCQkgKi8KKwkJY29uZiA9IGNscDsKKwkJYnJlYWs7CisJfQorCXVuY29uZiA9IE5VTEw7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbHAsICZ1bmNvbmZfc3RyX2hhc2h0Ymxbc3RyaGFzaHZhbF0sIGNsX3N0cmhhc2gpIHsKKwkJaWYgKCFjbXBfbmFtZSgmY2xwLT5jbF9uYW1lLCAmY2xuYW1lKSkKKwkJCWNvbnRpbnVlOworCQkvKiBjbF9uYW1lIG1hdGNoIGZyb20gYSBwcmV2aW91cyBTRVRDTElFTlRJRCBvcGVyYXRpb24gKi8KKwkJdW5jb25mID0gY2xwOworCQlicmVhazsKKwl9CisJc3RhdHVzID0gbmZzZXJyX3Jlc291cmNlOworCWlmICghY29uZikgeworCQkvKiAKKwkJICogQ0FTRSA0OgorCQkgKiBwbGFjZWQgZmlyc3QsIGJlY2F1c2UgaXQgaXMgdGhlIG5vcm1hbCBjYXNlLgorCQkgKi8KKwkJaWYgKHVuY29uZikKKwkJCWV4cGlyZV9jbGllbnQodW5jb25mKTsKKwkJaWYgKCEobmV3ID0gY3JlYXRlX2NsaWVudChjbG5hbWUpKSkKKwkJCWdvdG8gb3V0OworCQljb3B5X3ZlcmYobmV3LCAmY2x2ZXJpZmllcik7CisJCW5ldy0+Y2xfYWRkciA9IGlwX2FkZHI7CisJCWNvcHlfY3JlZCgmbmV3LT5jbF9jcmVkLCZycXN0cC0+cnFfY3JlZCk7CisJCWdlbl9jbGlkKG5ldyk7CisJCWdlbl9jb25maXJtKG5ldyk7CisJCWdlbl9jYWxsYmFjayhuZXcsIHNldGNsaWQpOworCQlhZGRfdG9fdW5jb25maXJtZWQobmV3LCBzdHJoYXNodmFsKTsKKwl9IGVsc2UgaWYgKGNtcF92ZXJmKCZjb25mLT5jbF92ZXJpZmllciwgJmNsdmVyaWZpZXIpKSB7CisJCS8qCisJCSAqIENBU0UgMToKKwkJICogY2xfbmFtZSBtYXRjaCwgY29uZmlybWVkLCBwcmluY2lwYWwgbWF0Y2gKKwkJICogdmVyaWZpZXIgbWF0Y2g6IHByb2JhYmxlIGNhbGxiYWNrIHVwZGF0ZQorCQkgKgorCQkgKiByZW1vdmUgYW55IHVuY29uZmlybWVkIG5mczRfY2xpZW50IHdpdGggCisJCSAqIG1hdGNoaW5nIGNsX25hbWUsIGNsX3ZlcmlmaWVyLCBhbmQgY2xfY2xpZW50aWQKKwkJICoKKwkJICogY3JlYXRlIGFuZCBpbnNlcnQgYW4gdW5jb25maXJtZWQgbmZzNF9jbGllbnQgd2l0aCBzYW1lIAorCQkgKiBjbF9uYW1lLCBjbF92ZXJpZmllciwgYW5kIGNsX2NsaWVudGlkIGFzIGV4aXN0aW5nIAorCQkgKiBuZnM0X2NsaWVudCwgIGJ1dCB3aXRoIHRoZSBuZXcgY2FsbGJhY2sgaW5mbyBhbmQgYSAKKwkJICogbmV3IGNsX2NvbmZpcm0KKwkJICovCisJCWlmICgodW5jb25mKSAmJiAKKwkJICAgIGNtcF92ZXJmKCZ1bmNvbmYtPmNsX3ZlcmlmaWVyLCAmY29uZi0+Y2xfdmVyaWZpZXIpICYmCisJCSAgICAgY21wX2NsaWQoJnVuY29uZi0+Y2xfY2xpZW50aWQsICZjb25mLT5jbF9jbGllbnRpZCkpIHsKKwkJCQlleHBpcmVfY2xpZW50KHVuY29uZik7CisJCX0KKwkJaWYgKCEobmV3ID0gY3JlYXRlX2NsaWVudChjbG5hbWUpKSkKKwkJCWdvdG8gb3V0OworCQljb3B5X3ZlcmYobmV3LCZjb25mLT5jbF92ZXJpZmllcik7CisJCW5ldy0+Y2xfYWRkciA9IGlwX2FkZHI7CisJCWNvcHlfY3JlZCgmbmV3LT5jbF9jcmVkLCZycXN0cC0+cnFfY3JlZCk7CisJCWNvcHlfY2xpZChuZXcsIGNvbmYpOworCQlnZW5fY29uZmlybShuZXcpOworCQlnZW5fY2FsbGJhY2sobmV3LCBzZXRjbGlkKTsKKwkJYWRkX3RvX3VuY29uZmlybWVkKG5ldyxzdHJoYXNodmFsKTsKKwl9IGVsc2UgaWYgKCF1bmNvbmYpIHsKKwkJLyoKKwkJICogQ0FTRSAyOgorCQkgKiBjbG5hbWUgbWF0Y2gsIGNvbmZpcm1lZCwgcHJpbmNpcGFsIG1hdGNoCisJCSAqIHZlcmZpZXIgZG9lcyBub3QgbWF0Y2gKKwkJICogbm8gdW5jb25maXJtZWQuIGNyZWF0ZSBhIG5ldyB1bmNvbmZpcm1lZCBuZnM0X2NsaWVudAorCQkgKiB1c2luZyBpbnB1dCBjbHZlcmlmaWVyLCBjbG5hbWUsIGFuZCBjYWxsYmFjayBpbmZvCisJCSAqIGFuZCBnZW5lcmF0ZSBhIG5ldyBjbF9jbGllbnRpZCBhbmQgY2xfY29uZmlybS4KKwkJICovCisJCWlmICghKG5ldyA9IGNyZWF0ZV9jbGllbnQoY2xuYW1lKSkpCisJCQlnb3RvIG91dDsKKwkJY29weV92ZXJmKG5ldywmY2x2ZXJpZmllcik7CisJCW5ldy0+Y2xfYWRkciA9IGlwX2FkZHI7CisJCWNvcHlfY3JlZCgmbmV3LT5jbF9jcmVkLCZycXN0cC0+cnFfY3JlZCk7CisJCWdlbl9jbGlkKG5ldyk7CisJCWdlbl9jb25maXJtKG5ldyk7CisJCWdlbl9jYWxsYmFjayhuZXcsIHNldGNsaWQpOworCQlhZGRfdG9fdW5jb25maXJtZWQobmV3LCBzdHJoYXNodmFsKTsKKwl9IGVsc2UgaWYgKCFjbXBfdmVyZigmY29uZi0+Y2xfY29uZmlybSwgJnVuY29uZi0+Y2xfY29uZmlybSkpIHsKKwkJLyoJCisJCSAqIENBU0UzOgorCQkgKiBjb25maXJtZWQgZm91bmQgKG5hbWUsIHByaW5jaXBhbCBtYXRjaCkKKwkJICogY29uZmlybWVkIHZlcmlmaWVyIGRvZXMgbm90IG1hdGNoIGlucHV0IGNsdmVyaWZpZXIKKwkJICoKKwkJICogdW5jb25maXJtZWQgZm91bmQgKG5hbWUgbWF0Y2gpCisJCSAqIGNvbmZpcm1lZC0+Y2xfY29uZmlybSAhPSB1bmNvbmZpcm1lZC0+Y2xfY29uZmlybQorCQkgKgorCQkgKiByZW1vdmUgdW5jb25maXJtZWQuCisJCSAqCisJCSAqIGNyZWF0ZSBhbiB1bmNvbmZpcm1lZCBuZnM0X2NsaWVudCAKKwkJICogd2l0aCBzYW1lIGNsX25hbWUgYXMgZXhpc3RpbmcgY29uZmlybWVkIG5mczRfY2xpZW50LCAKKwkJICogYnV0IHdpdGggbmV3IGNhbGxiYWNrIGluZm8sIG5ldyBjbF9jbGllbnRpZCwKKwkJICogbmV3IGNsX3ZlcmlmaWVyIGFuZCBhIG5ldyBjbF9jb25maXJtCisJCSAqLworCQlleHBpcmVfY2xpZW50KHVuY29uZik7CisJCWlmICghKG5ldyA9IGNyZWF0ZV9jbGllbnQoY2xuYW1lKSkpCisJCQlnb3RvIG91dDsKKwkJY29weV92ZXJmKG5ldywmY2x2ZXJpZmllcik7CisJCW5ldy0+Y2xfYWRkciA9IGlwX2FkZHI7CisJCWNvcHlfY3JlZCgmbmV3LT5jbF9jcmVkLCZycXN0cC0+cnFfY3JlZCk7CisJCWdlbl9jbGlkKG5ldyk7CisJCWdlbl9jb25maXJtKG5ldyk7CisJCWdlbl9jYWxsYmFjayhuZXcsIHNldGNsaWQpOworCQlhZGRfdG9fdW5jb25maXJtZWQobmV3LCBzdHJoYXNodmFsKTsKKwl9IGVsc2UgeworCQkvKiBObyBjYXNlcyBoaXQgISEhICovCisJCXN0YXR1cyA9IG5mc2Vycl9pbnZhbDsKKwkJZ290byBvdXQ7CisKKwl9CisJc2V0Y2xpZC0+c2VfY2xpZW50aWQuY2xfYm9vdCA9IG5ldy0+Y2xfY2xpZW50aWQuY2xfYm9vdDsKKwlzZXRjbGlkLT5zZV9jbGllbnRpZC5jbF9pZCA9IG5ldy0+Y2xfY2xpZW50aWQuY2xfaWQ7CisJbWVtY3B5KHNldGNsaWQtPnNlX2NvbmZpcm0uZGF0YSwgbmV3LT5jbF9jb25maXJtLmRhdGEsIHNpemVvZihzZXRjbGlkLT5zZV9jb25maXJtLmRhdGEpKTsKKwlzdGF0dXMgPSBuZnNfb2s7CitvdXQ6CisJbmZzNF91bmxvY2tfc3RhdGUoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisKKy8qCisgKiBSRkMgMzAxMCBoYXMgYSBjb21wbGV4IGltcGxtZW50YXRpb24gZGVzY3JpcHRpb24gb2YgcHJvY2Vzc2luZyBhIAorICogU0VUQ0xJRU5USURfQ09ORklSTSByZXF1ZXN0IGNvbnNpc3Rpbmcgb2YgNCBidWxsZXRzIGRlc2NyaWJpbmcKKyAqIHByb2Nlc3Npbmcgb24gYSBEUkMgbWlzcywgbGFiZWxlZCBhcyBDQVNFMSAtIENBU0U0IGJlbG93LgorICoKKyAqIE5PVEU6IGNhbGxiYWNrIGluZm9ybWF0aW9uIHdpbGwgYmUgcHJvY2Vzc2VkIGhlcmUgaW4gYSBmdXR1cmUgcGF0Y2gKKyAqLworaW50CituZnNkNF9zZXRjbGllbnRpZF9jb25maXJtKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkNF9zZXRjbGllbnRpZF9jb25maXJtICpzZXRjbGllbnRpZF9jb25maXJtKQoreworCXUzMiBpcF9hZGRyID0gcnFzdHAtPnJxX2FkZHIuc2luX2FkZHIuc19hZGRyOworCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwLCAqY29uZiA9IE5VTEwsICp1bmNvbmYgPSBOVUxMOworCW5mczRfdmVyaWZpZXIgY29uZmlybSA9IHNldGNsaWVudGlkX2NvbmZpcm0tPnNjX2NvbmZpcm07IAorCWNsaWVudGlkX3QgKiBjbGlkID0gJnNldGNsaWVudGlkX2NvbmZpcm0tPnNjX2NsaWVudGlkOworCWludCBzdGF0dXM7CisKKwlpZiAoU1RBTEVfQ0xJRU5USUQoY2xpZCkpCisJCXJldHVybiBuZnNlcnJfc3RhbGVfY2xpZW50aWQ7CisJLyogCisJICogWFhYIFRoZSBEdXBsaWNhdGUgUmVxdWVzdCBDYWNoZSAoRFJDKSBoYXMgYmVlbiBjaGVja2VkICg/PykKKwkgKiBXZSBnZXQgaGVyZSBvbiBhIERSQyBtaXNzLgorCSAqLworCisJbmZzNF9sb2NrX3N0YXRlKCk7CisJY2xwID0gZmluZF9jb25maXJtZWRfY2xpZW50KGNsaWQpOworCWlmIChjbHApIHsKKwkJc3RhdHVzID0gbmZzZXJyX2ludmFsOworCQkvKiAKKwkJICogRm91bmQgYSByZWNvcmQgZm9yIHRoaXMgY2xpZW50aWQuIElmIHRoZSBJUCBhZGRyZXNzZXMKKwkJICogZG9uJ3QgbWF0Y2gsIHJldHVybiBFUlJfSU5WQUwganVzdCBhcyBpZiB0aGUgcmVjb3JkIGhhZAorCQkgKiBub3QgYmVlbiBmb3VuZC4KKwkJICovCisJCWlmIChjbHAtPmNsX2FkZHIgIT0gaXBfYWRkcikgeyAKKwkJCXByaW50aygiTkZTRDogc2V0Y2xpZW50aWQ6IHN0cmluZyBpbiB1c2UgYnkgY2xpZW50IgorCQkJIihjbGllbnRpZCAlMDh4LyUwOHgpXG4iLAorCQkJY2xwLT5jbF9jbGllbnRpZC5jbF9ib290LCBjbHAtPmNsX2NsaWVudGlkLmNsX2lkKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWNvbmYgPSBjbHA7CisJfQorCWNscCA9IGZpbmRfdW5jb25maXJtZWRfY2xpZW50KGNsaWQpOworCWlmIChjbHApIHsKKwkJc3RhdHVzID0gbmZzZXJyX2ludmFsOworCQlpZiAoY2xwLT5jbF9hZGRyICE9IGlwX2FkZHIpIHsgCisJCQlwcmludGsoIk5GU0Q6IHNldGNsaWVudGlkOiBzdHJpbmcgaW4gdXNlIGJ5IGNsaWVudCIKKwkJCSIoY2xpZW50aWQgJTA4eC8lMDh4KVxuIiwKKwkJCWNscC0+Y2xfY2xpZW50aWQuY2xfYm9vdCwgY2xwLT5jbF9jbGllbnRpZC5jbF9pZCk7CisJCQlnb3RvIG91dDsKKwkJfQorCQl1bmNvbmYgPSBjbHA7CisJfQorCS8qIENBU0UgMTogCisJKiB1bmNvbmYgcmVjb3JkIHRoYXQgbWF0Y2hlcyBpbnB1dCBjbGllbnRpZCBhbmQgaW5wdXQgY29uZmlybS4KKwkqIGNvbmYgcmVjb3JkIHRoYXQgbWF0Y2hlcyBpbnB1dCBjbGllbnRpZC4KKwkqIGNvbmYgIGFuZCB1bmNvbmYgcmVjb3JkcyBtYXRjaCBuYW1lcywgdmVyaWZpZXJzIAorCSovCisJaWYgKChjb25mICYmIHVuY29uZikgJiYgCisJICAgIChjbXBfdmVyZigmdW5jb25mLT5jbF9jb25maXJtLCAmY29uZmlybSkpICYmCisJICAgIChjbXBfdmVyZigmY29uZi0+Y2xfdmVyaWZpZXIsICZ1bmNvbmYtPmNsX3ZlcmlmaWVyKSkgJiYKKwkgICAgKGNtcF9uYW1lKCZjb25mLT5jbF9uYW1lLCZ1bmNvbmYtPmNsX25hbWUpKSAgJiYKKwkgICAgKCFjbXBfdmVyZigmY29uZi0+Y2xfY29uZmlybSwgJnVuY29uZi0+Y2xfY29uZmlybSkpKSB7CisJCWlmICghY21wX2NyZWRzKCZjb25mLT5jbF9jcmVkLCAmdW5jb25mLT5jbF9jcmVkKSkgCisJCQlzdGF0dXMgPSBuZnNlcnJfY2xpZF9pbnVzZTsKKwkJZWxzZSB7CisJCQlleHBpcmVfY2xpZW50KGNvbmYpOworCQkJY2xwID0gdW5jb25mOworCQkJbW92ZV90b19jb25maXJtZWQodW5jb25mKTsKKwkJCXN0YXR1cyA9IG5mc19vazsKKwkJfQorCQlnb3RvIG91dDsKKwl9IAorCS8qIENBU0UgMjoKKwkgKiBjb25mIHJlY29yZCB0aGF0IG1hdGNoZXMgaW5wdXQgY2xpZW50aWQuCisJICogaWYgdW5jb25mIHJlY29yZCB0aGF0IG1hdGNoZXMgaW5wdXQgY2xpZW50aWQsIHRoZW4gdW5jb25mLT5jbF9uYW1lCisJICogb3IgdW5jb25mLT5jbF92ZXJpZmllciBkb24ndCBtYXRjaCB0aGUgY29uZiByZWNvcmQuCisJICovCisJaWYgKChjb25mICYmICF1bmNvbmYpIHx8IAorCSAgICAoKGNvbmYgJiYgdW5jb25mKSAmJiAKKwkgICAgICghY21wX3ZlcmYoJmNvbmYtPmNsX3ZlcmlmaWVyLCAmdW5jb25mLT5jbF92ZXJpZmllcikgfHwKKwkgICAgICAhY21wX25hbWUoJmNvbmYtPmNsX25hbWUsICZ1bmNvbmYtPmNsX25hbWUpKSkpIHsKKwkJaWYgKCFjbXBfY3JlZHMoJmNvbmYtPmNsX2NyZWQsJnJxc3RwLT5ycV9jcmVkKSkgeworCQkJc3RhdHVzID0gbmZzZXJyX2NsaWRfaW51c2U7CisJCX0gZWxzZSB7CisJCQljbHAgPSBjb25mOworCQkJc3RhdHVzID0gbmZzX29rOworCQl9CisJCWdvdG8gb3V0OworCX0KKwkvKiBDQVNFIDM6CisJICogY29uZiByZWNvcmQgbm90IGZvdW5kLgorCSAqIHVuY29uZiByZWNvcmQgZm91bmQuIAorCSAqIHVuY29uZi0+Y2xfY29uZmlybSBtYXRjaGVzIGlucHV0IGNvbmZpcm0KKwkgKi8gCisJaWYgKCFjb25mICYmIHVuY29uZiAmJiBjbXBfdmVyZigmdW5jb25mLT5jbF9jb25maXJtLCAmY29uZmlybSkpIHsKKwkJaWYgKCFjbXBfY3JlZHMoJnVuY29uZi0+Y2xfY3JlZCwgJnJxc3RwLT5ycV9jcmVkKSkgeworCQkJc3RhdHVzID0gbmZzZXJyX2NsaWRfaW51c2U7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSBuZnNfb2s7CisJCQljbHAgPSB1bmNvbmY7CisJCQltb3ZlX3RvX2NvbmZpcm1lZCh1bmNvbmYpOworCQl9CisJCWdvdG8gb3V0OworCX0KKwkvKiBDQVNFIDQ6CisJICogY29uZiByZWNvcmQgbm90IGZvdW5kLCBvciBpZiBjb25mLCB0aGVuIGNvbmYtPmNsX2NvbmZpcm0gZG9lcyBub3QKKwkgKiBtYXRjaCBpbnB1dCBjb25maXJtLgorCSAqIHVuY29uZiByZWNvcmQgbm90IGZvdW5kLCBvciBpZiB1bmNvbmYsIHRoZW4gdW5jb25mLT5jbF9jb25maXJtIAorCSAqIGRvZXMgbm90IG1hdGNoIGlucHV0IGNvbmZpcm0uCisJICovCisJaWYgKCghY29uZiB8fCAoY29uZiAmJiAhY21wX3ZlcmYoJmNvbmYtPmNsX2NvbmZpcm0sICZjb25maXJtKSkpICYmCisJICAgICghdW5jb25mIHx8ICh1bmNvbmYgJiYgIWNtcF92ZXJmKCZ1bmNvbmYtPmNsX2NvbmZpcm0sICZjb25maXJtKSkpKSB7CisJCXN0YXR1cyA9IG5mc2Vycl9zdGFsZV9jbGllbnRpZDsKKwkJZ290byBvdXQ7CisJfQorCS8qIGNoZWNrIHRoYXQgd2UgaGF2ZSBoaXQgb25lIG9mIHRoZSBjYXNlcy4uLiovCisJc3RhdHVzID0gbmZzZXJyX2ludmFsOworCWdvdG8gb3V0Oworb3V0OgorCWlmICghc3RhdHVzKQorCQluZnNkNF9wcm9iZV9jYWxsYmFjayhjbHApOworCW5mczRfdW5sb2NrX3N0YXRlKCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogCisgKiBPcGVuIG93bmVyIHN0YXRlIChzaGFyZSBsb2NrcykKKyAqLworCisvKiBoYXNoIHRhYmxlcyBmb3IgbmZzNF9zdGF0ZW93bmVyICovCisjZGVmaW5lIE9XTkVSX0hBU0hfQklUUyAgICAgICAgICAgICAgOAorI2RlZmluZSBPV05FUl9IQVNIX1NJWkUgICAgICAgICAgICAgKDEgPDwgT1dORVJfSEFTSF9CSVRTKQorI2RlZmluZSBPV05FUl9IQVNIX01BU0sgICAgICAgICAgICAgKE9XTkVSX0hBU0hfU0laRSAtIDEpCisKKyNkZWZpbmUgb3duZXJpZF9oYXNodmFsKGlkKSBcCisgICAgICAgICgoaWQpICYgT1dORVJfSEFTSF9NQVNLKQorI2RlZmluZSBvd25lcnN0cl9oYXNodmFsKGNsaWVudGlkLCBvd25lcm5hbWUpIFwKKyAgICAgICAgKCgoY2xpZW50aWQpICsgb3BhcXVlX2hhc2h2YWwoKG93bmVybmFtZS5kYXRhKSwgKG93bmVybmFtZS5sZW4pKSkgJiBPV05FUl9IQVNIX01BU0spCisKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkCW93bmVyaWRfaGFzaHRibFtPV05FUl9IQVNIX1NJWkVdOworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQJb3duZXJzdHJfaGFzaHRibFtPV05FUl9IQVNIX1NJWkVdOworCisvKiBoYXNoIHRhYmxlIGZvciBuZnM0X2ZpbGUgKi8KKyNkZWZpbmUgRklMRV9IQVNIX0JJVFMgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBGSUxFX0hBU0hfU0laRSAgICAgICAgICAgICAgICAgICgxIDw8IEZJTEVfSEFTSF9CSVRTKQorI2RlZmluZSBGSUxFX0hBU0hfTUFTSyAgICAgICAgICAgICAgICAgIChGSUxFX0hBU0hfU0laRSAtIDEpCisvKiBoYXNoIHRhYmxlIGZvciAob3BlbiluZnM0X3N0YXRlaWQgKi8KKyNkZWZpbmUgU1RBVEVJRF9IQVNIX0JJVFMgICAgICAgICAgICAgIDEwCisjZGVmaW5lIFNUQVRFSURfSEFTSF9TSVpFICAgICAgICAgICAgICAoMSA8PCBTVEFURUlEX0hBU0hfQklUUykKKyNkZWZpbmUgU1RBVEVJRF9IQVNIX01BU0sgICAgICAgICAgICAgIChTVEFURUlEX0hBU0hfU0laRSAtIDEpCisKKyNkZWZpbmUgZmlsZV9oYXNodmFsKHgpIFwKKyAgICAgICAgaGFzaF9wdHIoeCwgRklMRV9IQVNIX0JJVFMpCisjZGVmaW5lIHN0YXRlaWRfaGFzaHZhbChvd25lcl9pZCwgZmlsZV9pZCkgIFwKKyAgICAgICAgKCgob3duZXJfaWQpICsgKGZpbGVfaWQpKSAmIFNUQVRFSURfSEFTSF9NQVNLKQorCitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBmaWxlX2hhc2h0YmxbRklMRV9IQVNIX1NJWkVdOworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgc3RhdGVpZF9oYXNodGJsW1NUQVRFSURfSEFTSF9TSVpFXTsKKworLyogT1BFTiBTaGFyZSBzdGF0ZSBoZWxwZXIgZnVuY3Rpb25zICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZnM0X2ZpbGUgKgorYWxsb2NfaW5pdF9maWxlKHN0cnVjdCBpbm9kZSAqaW5vKQoreworCXN0cnVjdCBuZnM0X2ZpbGUgKmZwOworCXVuc2lnbmVkIGludCBoYXNodmFsID0gZmlsZV9oYXNodmFsKGlubyk7CisKKwlpZiAoKGZwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG5mczRfZmlsZSksR0ZQX0tFUk5FTCkpKSB7CisJCUlOSVRfTElTVF9IRUFEKCZmcC0+ZmlfaGFzaCk7CisJCUlOSVRfTElTVF9IRUFEKCZmcC0+ZmlfcGVyZmlsZSk7CisJCUlOSVRfTElTVF9IRUFEKCZmcC0+ZmlfZGVsX3BlcmZpbGUpOworCQlsaXN0X2FkZCgmZnAtPmZpX2hhc2gsICZmaWxlX2hhc2h0YmxbaGFzaHZhbF0pOworCQlmcC0+ZmlfaW5vZGUgPSBpZ3JhYihpbm8pOworCQlmcC0+ZmlfaWQgPSBjdXJyZW50X2ZpbGVpZCsrOworCQlhbGxvY19maWxlKys7CisJCXJldHVybiBmcDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCityZWxlYXNlX2FsbF9maWxlcyh2b2lkKQoreworCWludCBpOworCXN0cnVjdCBuZnM0X2ZpbGUgKmZwOworCisJZm9yIChpPTA7aTxGSUxFX0hBU0hfU0laRTtpKyspIHsKKwkJd2hpbGUgKCFsaXN0X2VtcHR5KCZmaWxlX2hhc2h0YmxbaV0pKSB7CisJCQlmcCA9IGxpc3RfZW50cnkoZmlsZV9oYXNodGJsW2ldLm5leHQsIHN0cnVjdCBuZnM0X2ZpbGUsIGZpX2hhc2gpOworCQkJLyogdGhpcyBzaG91bGQgbmV2ZXIgYmUgbW9yZSB0aGFuIG9uY2UuLi4gKi8KKwkJCWlmICghbGlzdF9lbXB0eSgmZnAtPmZpX3BlcmZpbGUpIHx8ICFsaXN0X2VtcHR5KCZmcC0+ZmlfZGVsX3BlcmZpbGUpKSB7CisJCQkJcHJpbnRrKCJFUlJPUjogcmVsZWFzZV9hbGxfZmlsZXM6IGZpbGUgJXAgaXMgb3BlbiwgY3JlYXRpbmcgZGFuZ2xpbmcgc3RhdGUgISEhXG4iLGZwKTsKKwkJCX0KKwkJCXJlbGVhc2VfZmlsZShmcCk7CisJCX0KKwl9Cit9CisKK2ttZW1fY2FjaGVfdCAqc3RhdGVvd25lcl9zbGFiID0gTlVMTDsKKworc3RhdGljIGludAorbmZzZDRfaW5pdF9zbGFicyh2b2lkKQoreworCXN0YXRlb3duZXJfc2xhYiA9IGttZW1fY2FjaGVfY3JlYXRlKCJuZnNkNF9zdGF0ZW93bmVycyIsCisJCQlzaXplb2Yoc3RydWN0IG5mczRfc3RhdGVvd25lciksIDAsIDAsIE5VTEwsIE5VTEwpOworCWlmIChzdGF0ZW93bmVyX3NsYWIgPT0gTlVMTCkgeworCQlkcHJpbnRrKCJuZnNkNDogb3V0IG9mIG1lbW9yeSB3aGlsZSBpbml0aWFsaXppbmcgbmZzdjRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCituZnNkNF9mcmVlX3NsYWJzKHZvaWQpCit7CisJaW50IHN0YXR1cyA9IDA7CisKKwlpZiAoc3RhdGVvd25lcl9zbGFiKQorCQlzdGF0dXMgPSBrbWVtX2NhY2hlX2Rlc3Ryb3koc3RhdGVvd25lcl9zbGFiKTsKKwlzdGF0ZW93bmVyX3NsYWIgPSBOVUxMOworCUJVR19PTihzdGF0dXMpOworfQorCit2b2lkCituZnM0X2ZyZWVfc3RhdGVvd25lcihzdHJ1Y3Qga3JlZiAqa3JlZikKK3sKKwlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpzb3AgPQorCQljb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IG5mczRfc3RhdGVvd25lciwgc29fcmVmKTsKKwlrZnJlZShzb3AtPnNvX293bmVyLmRhdGEpOworCWttZW1fY2FjaGVfZnJlZShzdGF0ZW93bmVyX3NsYWIsIHNvcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5mczRfc3RhdGVvd25lciAqCithbGxvY19zdGF0ZW93bmVyKHN0cnVjdCB4ZHJfbmV0b2JqICpvd25lcikKK3sKKwlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpzb3A7CisKKwlpZiAoKHNvcCA9IGttZW1fY2FjaGVfYWxsb2Moc3RhdGVvd25lcl9zbGFiLCBHRlBfS0VSTkVMKSkpIHsKKwkJaWYgKChzb3AtPnNvX293bmVyLmRhdGEgPSBrbWFsbG9jKG93bmVyLT5sZW4sIEdGUF9LRVJORUwpKSkgeworCQkJbWVtY3B5KHNvcC0+c29fb3duZXIuZGF0YSwgb3duZXItPmRhdGEsIG93bmVyLT5sZW4pOworCQkJc29wLT5zb19vd25lci5sZW4gPSBvd25lci0+bGVuOworCQkJa3JlZl9pbml0KCZzb3AtPnNvX3JlZik7CisJCQlyZXR1cm4gc29wOworCQl9IAorCQlrbWVtX2NhY2hlX2ZyZWUoc3RhdGVvd25lcl9zbGFiLCBzb3ApOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKgorYWxsb2NfaW5pdF9vcGVuX3N0YXRlb3duZXIodW5zaWduZWQgaW50IHN0cmhhc2h2YWwsIHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwLCBzdHJ1Y3QgbmZzZDRfb3BlbiAqb3BlbikgeworCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKnNvcDsKKwlzdHJ1Y3QgbmZzNF9yZXBsYXkgKnJwOworCXVuc2lnbmVkIGludCBpZGhhc2h2YWw7CisKKwlpZiAoIShzb3AgPSBhbGxvY19zdGF0ZW93bmVyKCZvcGVuLT5vcF9vd25lcikpKQorCQlyZXR1cm4gTlVMTDsKKwlpZGhhc2h2YWwgPSBvd25lcmlkX2hhc2h2YWwoY3VycmVudF9vd25lcmlkKTsKKwlJTklUX0xJU1RfSEVBRCgmc29wLT5zb19pZGhhc2gpOworCUlOSVRfTElTVF9IRUFEKCZzb3AtPnNvX3N0cmhhc2gpOworCUlOSVRfTElTVF9IRUFEKCZzb3AtPnNvX3BlcmNsaWVudCk7CisJSU5JVF9MSVNUX0hFQUQoJnNvcC0+c29fcGVyZmlsZXN0YXRlKTsKKwlJTklUX0xJU1RfSEVBRCgmc29wLT5zb19wZXJsb2Nrb3duZXIpOyAgLyogbm90IHVzZWQgKi8KKwlJTklUX0xJU1RfSEVBRCgmc29wLT5zb19jbG9zZV9scnUpOworCXNvcC0+c29fdGltZSA9IDA7CisJbGlzdF9hZGQoJnNvcC0+c29faWRoYXNoLCAmb3duZXJpZF9oYXNodGJsW2lkaGFzaHZhbF0pOworCWxpc3RfYWRkKCZzb3AtPnNvX3N0cmhhc2gsICZvd25lcnN0cl9oYXNodGJsW3N0cmhhc2h2YWxdKTsKKwlsaXN0X2FkZCgmc29wLT5zb19wZXJjbGllbnQsICZjbHAtPmNsX3BlcmNsaWVudCk7CisJYWRkX3BlcmNsaWVudCsrOworCXNvcC0+c29faXNfb3Blbl9vd25lciA9IDE7CisJc29wLT5zb19pZCA9IGN1cnJlbnRfb3duZXJpZCsrOworCXNvcC0+c29fY2xpZW50ID0gY2xwOworCXNvcC0+c29fc2VxaWQgPSBvcGVuLT5vcF9zZXFpZDsKKwlzb3AtPnNvX2NvbmZpcm1lZCA9IDA7CisJcnAgPSAmc29wLT5zb19yZXBsYXk7CisJcnAtPnJwX3N0YXR1cyA9IE5GU0VSUl9TRVJWRVJGQVVMVDsKKwlycC0+cnBfYnVmbGVuID0gMDsKKwlycC0+cnBfYnVmID0gcnAtPnJwX2lidWY7CisJcmV0dXJuIHNvcDsKK30KKworc3RhdGljIHZvaWQKK3JlbGVhc2Vfc3RhdGVpZF9sb2Nrb3duZXJzKHN0cnVjdCBuZnM0X3N0YXRlaWQgKm9wZW5fc3RwKQoreworCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKmxvY2tfc29wOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZvcGVuX3N0cC0+c3RfcGVybG9ja293bmVyKSkgeworCQlsb2NrX3NvcCA9IGxpc3RfZW50cnkob3Blbl9zdHAtPnN0X3BlcmxvY2tvd25lci5uZXh0LAorCQkJCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIsIHNvX3BlcmxvY2tvd25lcik7CisJCS8qIGxpc3RfZGVsKCZvcGVuX3N0cC0+c3RfcGVybG9ja293bmVyKTsgICovCisJCUJVR19PTihsb2NrX3NvcC0+c29faXNfb3Blbl9vd25lcik7CisJCXJlbGVhc2Vfc3RhdGVvd25lcihsb2NrX3NvcCk7CisJfQorfQorCitzdGF0aWMgdm9pZAordW5oYXNoX3N0YXRlb3duZXIoc3RydWN0IG5mczRfc3RhdGVvd25lciAqc29wKQoreworCXN0cnVjdCBuZnM0X3N0YXRlaWQgKnN0cDsKKworCWxpc3RfZGVsKCZzb3AtPnNvX2lkaGFzaCk7CisJbGlzdF9kZWwoJnNvcC0+c29fc3RyaGFzaCk7CisJaWYgKHNvcC0+c29faXNfb3Blbl9vd25lcikgeworCQlsaXN0X2RlbCgmc29wLT5zb19wZXJjbGllbnQpOworCQlkZWxfcGVyY2xpZW50Kys7CisJfQorCWxpc3RfZGVsKCZzb3AtPnNvX3BlcmxvY2tvd25lcik7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZzb3AtPnNvX3BlcmZpbGVzdGF0ZSkpIHsKKwkJc3RwID0gbGlzdF9lbnRyeShzb3AtPnNvX3BlcmZpbGVzdGF0ZS5uZXh0LCAKKwkJCXN0cnVjdCBuZnM0X3N0YXRlaWQsIHN0X3BlcmZpbGVzdGF0ZSk7CisJCWlmIChzb3AtPnNvX2lzX29wZW5fb3duZXIpCisJCQlyZWxlYXNlX3N0YXRlaWQoc3RwLCBPUEVOX1NUQVRFKTsKKwkJZWxzZQorCQkJcmVsZWFzZV9zdGF0ZWlkKHN0cCwgTE9DS19TVEFURSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorcmVsZWFzZV9zdGF0ZW93bmVyKHN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKnNvcCkKK3sKKwl1bmhhc2hfc3RhdGVvd25lcihzb3ApOworCWxpc3RfZGVsKCZzb3AtPnNvX2Nsb3NlX2xydSk7CisJbmZzNF9wdXRfc3RhdGVvd25lcihzb3ApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2luaXRfc3RhdGVpZChzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpzdHAsIHN0cnVjdCBuZnM0X2ZpbGUgKmZwLCBzdHJ1Y3QgbmZzZDRfb3BlbiAqb3BlbikgeworCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKnNvcCA9IG9wZW4tPm9wX3N0YXRlb3duZXI7CisJdW5zaWduZWQgaW50IGhhc2h2YWwgPSBzdGF0ZWlkX2hhc2h2YWwoc29wLT5zb19pZCwgZnAtPmZpX2lkKTsKKworCUlOSVRfTElTVF9IRUFEKCZzdHAtPnN0X2hhc2gpOworCUlOSVRfTElTVF9IRUFEKCZzdHAtPnN0X3BlcmZpbGVzdGF0ZSk7CisJSU5JVF9MSVNUX0hFQUQoJnN0cC0+c3RfcGVybG9ja293bmVyKTsKKwlJTklUX0xJU1RfSEVBRCgmc3RwLT5zdF9wZXJmaWxlKTsKKwlsaXN0X2FkZCgmc3RwLT5zdF9oYXNoLCAmc3RhdGVpZF9oYXNodGJsW2hhc2h2YWxdKTsKKwlsaXN0X2FkZCgmc3RwLT5zdF9wZXJmaWxlc3RhdGUsICZzb3AtPnNvX3BlcmZpbGVzdGF0ZSk7CisJbGlzdF9hZGRfcGVyZmlsZSsrOworCWxpc3RfYWRkKCZzdHAtPnN0X3BlcmZpbGUsICZmcC0+ZmlfcGVyZmlsZSk7CisJc3RwLT5zdF9zdGF0ZW93bmVyID0gc29wOworCXN0cC0+c3RfZmlsZSA9IGZwOworCXN0cC0+c3Rfc3RhdGVpZC5zaV9ib290ID0gYm9vdF90aW1lOworCXN0cC0+c3Rfc3RhdGVpZC5zaV9zdGF0ZW93bmVyaWQgPSBzb3AtPnNvX2lkOworCXN0cC0+c3Rfc3RhdGVpZC5zaV9maWxlaWQgPSBmcC0+ZmlfaWQ7CisJc3RwLT5zdF9zdGF0ZWlkLnNpX2dlbmVyYXRpb24gPSAwOworCXN0cC0+c3RfYWNjZXNzX2JtYXAgPSAwOworCXN0cC0+c3RfZGVueV9ibWFwID0gMDsKKwlfX3NldF9iaXQob3Blbi0+b3Bfc2hhcmVfYWNjZXNzLCAmc3RwLT5zdF9hY2Nlc3NfYm1hcCk7CisJX19zZXRfYml0KG9wZW4tPm9wX3NoYXJlX2RlbnksICZzdHAtPnN0X2RlbnlfYm1hcCk7Cit9CisKK3N0YXRpYyB2b2lkCityZWxlYXNlX3N0YXRlaWQoc3RydWN0IG5mczRfc3RhdGVpZCAqc3RwLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGZpbGUgKmZpbHAgPSBzdHAtPnN0X3Zmc19maWxlOworCisJbGlzdF9kZWwoJnN0cC0+c3RfaGFzaCk7CisJbGlzdF9kZWxfcGVyZmlsZSsrOworCWxpc3RfZGVsKCZzdHAtPnN0X3BlcmZpbGUpOworCWxpc3RfZGVsKCZzdHAtPnN0X3BlcmZpbGVzdGF0ZSk7CisJaWYgKGZsYWdzICYgT1BFTl9TVEFURSkgeworCQlyZWxlYXNlX3N0YXRlaWRfbG9ja293bmVycyhzdHApOworCQlzdHAtPnN0X3Zmc19maWxlID0gTlVMTDsKKwkJbmZzZF9jbG9zZShmaWxwKTsKKwkJdmZzY2xvc2UrKzsKKwl9IGVsc2UgaWYgKGZsYWdzICYgTE9DS19TVEFURSkKKwkJbG9ja3NfcmVtb3ZlX3Bvc2l4KGZpbHAsIChmbF9vd25lcl90KSBzdHAtPnN0X3N0YXRlb3duZXIpOworCWtmcmVlKHN0cCk7CisJc3RwID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK3JlbGVhc2VfZmlsZShzdHJ1Y3QgbmZzNF9maWxlICpmcCkKK3sKKwlmcmVlX2ZpbGUrKzsKKwlsaXN0X2RlbCgmZnAtPmZpX2hhc2gpOworCWlwdXQoZnAtPmZpX2lub2RlKTsKKwlrZnJlZShmcCk7Cit9CQorCit2b2lkCittb3ZlX3RvX2Nsb3NlX2xydShzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpzb3ApCit7CisJZHByaW50aygiTkZTRDogbW92ZV90b19jbG9zZV9scnUgbmZzNF9zdGF0ZW93bmVyICVwXG4iLCBzb3ApOworCisJdW5oYXNoX3N0YXRlb3duZXIoc29wKTsKKwlsaXN0X2FkZF90YWlsKCZzb3AtPnNvX2Nsb3NlX2xydSwgJmNsb3NlX2xydSk7CisJc29wLT5zb190aW1lID0gZ2V0X3NlY29uZHMoKTsKK30KKwordm9pZAorcmVsZWFzZV9zdGF0ZV9vd25lcihzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpzdHAsIGludCBmbGFnKQoreworCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKnNvcCA9IHN0cC0+c3Rfc3RhdGVvd25lcjsKKwlzdHJ1Y3QgbmZzNF9maWxlICpmcCA9IHN0cC0+c3RfZmlsZTsKKworCWRwcmludGsoIk5GU0Q6IHJlbGVhc2Vfc3RhdGVfb3duZXJcbiIpOworCXJlbGVhc2Vfc3RhdGVpZChzdHAsIGZsYWcpOworCisJLyogcGxhY2UgdW51c2VkIG5mczRfc3RhdGVvd25lcnMgb24gc29fY2xvc2VfbHJ1IGxpc3QgdG8gYmUKKwkgKiByZWxlYXNlZCBieSB0aGUgbGF1bmRyb21hdCBzZXJ2aWNlIGFmdGVyIHRoZSBsZWFzZSBwZXJpb2QKKwkgKiB0byBlbmFibGUgdXMgdG8gaGFuZGxlIENMT1NFIHJlcGxheQorCSAqLworCWlmIChzb3AtPnNvX2NvbmZpcm1lZCAmJiBsaXN0X2VtcHR5KCZzb3AtPnNvX3BlcmZpbGVzdGF0ZSkpCisJCW1vdmVfdG9fY2xvc2VfbHJ1KHNvcCk7CisJLyogdW51c2VkIG5mczRfZmlsZSdzIGFyZSByZWxlc2VlZC4gWFhYIHNsYWIgY2FjaGU/ICovCisJaWYgKGxpc3RfZW1wdHkoJmZwLT5maV9wZXJmaWxlKSAmJiBsaXN0X2VtcHR5KCZmcC0+ZmlfZGVsX3BlcmZpbGUpKSB7CisJCXJlbGVhc2VfZmlsZShmcCk7CisJfQorfQorCitzdGF0aWMgaW50CitjbXBfb3duZXJfc3RyKHN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKnNvcCwgc3RydWN0IHhkcl9uZXRvYmogKm93bmVyLCBjbGllbnRpZF90ICpjbGlkKSB7CisJcmV0dXJuICgoc29wLT5zb19vd25lci5sZW4gPT0gb3duZXItPmxlbikgJiYgCisJICFtZW1jbXAoc29wLT5zb19vd25lci5kYXRhLCBvd25lci0+ZGF0YSwgb3duZXItPmxlbikgJiYgCisJICAoc29wLT5zb19jbGllbnQtPmNsX2NsaWVudGlkLmNsX2lkID09IGNsaWQtPmNsX2lkKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICoKK2ZpbmRfb3BlbnN0YXRlb3duZXJfc3RyKHVuc2lnbmVkIGludCBoYXNodmFsLCBzdHJ1Y3QgbmZzZDRfb3BlbiAqb3BlbikKK3sKKwlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpzbyA9IE5VTEw7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNvLCAmb3duZXJzdHJfaGFzaHRibFtoYXNodmFsXSwgc29fc3RyaGFzaCkgeworCQlpZiAoY21wX293bmVyX3N0cihzbywgJm9wZW4tPm9wX293bmVyLCAmb3Blbi0+b3BfY2xpZW50aWQpKQorCQkJcmV0dXJuIHNvOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogc2VhcmNoIGZpbGVfaGFzaHRibFtdIGZvciBmaWxlICovCitzdGF0aWMgc3RydWN0IG5mczRfZmlsZSAqCitmaW5kX2ZpbGUoc3RydWN0IGlub2RlICppbm8pCit7CisJdW5zaWduZWQgaW50IGhhc2h2YWwgPSBmaWxlX2hhc2h2YWwoaW5vKTsKKwlzdHJ1Y3QgbmZzNF9maWxlICpmcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZnAsICZmaWxlX2hhc2h0YmxbaGFzaHZhbF0sIGZpX2hhc2gpIHsKKwkJaWYgKGZwLT5maV9pbm9kZSA9PSBpbm8pCisJCQlyZXR1cm4gZnA7CisJfQorCXJldHVybiBOVUxMOworfQorCisjZGVmaW5lIFRFU1RfQUNDRVNTKHgpICgoeCA+IDAgfHwgeCA8IDQpPzE6MCkKKyNkZWZpbmUgVEVTVF9ERU5ZKHgpICgoeCA+PSAwIHx8IHggPCA1KT8xOjApCisKK3ZvaWQKK3NldF9hY2Nlc3ModW5zaWduZWQgaW50ICphY2Nlc3MsIHVuc2lnbmVkIGxvbmcgYm1hcCkgeworCWludCBpOworCisJKmFjY2VzcyA9IDA7CisJZm9yIChpID0gMTsgaSA8IDQ7IGkrKykgeworCQlpZiAodGVzdF9iaXQoaSwgJmJtYXApKQorCQkJKmFjY2VzcyB8PSBpOworCX0KK30KKwordm9pZAorc2V0X2RlbnkodW5zaWduZWQgaW50ICpkZW55LCB1bnNpZ25lZCBsb25nIGJtYXApIHsKKwlpbnQgaTsKKworCSpkZW55ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWlmICh0ZXN0X2JpdChpLCAmYm1hcCkpCisJCQkqZGVueSB8PSBpIDsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK3Rlc3Rfc2hhcmUoc3RydWN0IG5mczRfc3RhdGVpZCAqc3RwLCBzdHJ1Y3QgbmZzZDRfb3BlbiAqb3BlbikgeworCXVuc2lnbmVkIGludCBhY2Nlc3MsIGRlbnk7CisKKwlzZXRfYWNjZXNzKCZhY2Nlc3MsIHN0cC0+c3RfYWNjZXNzX2JtYXApOworCXNldF9kZW55KCZkZW55LCBzdHAtPnN0X2RlbnlfYm1hcCk7CisJaWYgKChhY2Nlc3MgJiBvcGVuLT5vcF9zaGFyZV9kZW55KSB8fCAoZGVueSAmIG9wZW4tPm9wX3NoYXJlX2FjY2VzcykpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKgorICogQ2FsbGVkIHRvIGNoZWNrIGRlbnkgd2hlbiBSRUFEIHdpdGggYWxsIHplcm8gc3RhdGVpZCBvcgorICogV1JJVEUgd2l0aCBhbGwgemVybyBvciBhbGwgb25lIHN0YXRlaWQKKyAqLworaW50CituZnM0X3NoYXJlX2NvbmZsaWN0KHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHVuc2lnbmVkIGludCBkZW55X3R5cGUpCit7CisJc3RydWN0IGlub2RlICppbm8gPSBjdXJyZW50X2ZoLT5maF9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IG5mczRfZmlsZSAqZnA7CisJc3RydWN0IG5mczRfc3RhdGVpZCAqc3RwOworCisJZHByaW50aygiTkZTRDogbmZzNF9zaGFyZV9jb25mbGljdFxuIik7CisKKwlmcCA9IGZpbmRfZmlsZShpbm8pOworCWlmIChmcCkgeworCS8qIFNlYXJjaCBmb3IgY29uZmxpY3Rpbmcgc2hhcmUgcmVzZXJ2YXRpb25zICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoc3RwLCAmZnAtPmZpX3BlcmZpbGUsIHN0X3BlcmZpbGUpIHsKKwkJCWlmICh0ZXN0X2JpdChkZW55X3R5cGUsICZzdHAtPnN0X2RlbnlfYm1hcCkgfHwKKwkJCSAgICB0ZXN0X2JpdChORlM0X1NIQVJFX0RFTllfQk9USCwgJnN0cC0+c3RfZGVueV9ibWFwKSkKKwkJCQlyZXR1cm4gbmZzZXJyX3NoYXJlX2RlbmllZDsKKwkJfQorCX0KKwlyZXR1cm4gbmZzX29rOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK25mczRfZmlsZV9kb3duZ3JhZGUoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBzaGFyZV9hY2Nlc3MpCit7CisJaWYgKHNoYXJlX2FjY2VzcyAmIE5GUzRfU0hBUkVfQUNDRVNTX1dSSVRFKSB7CisJCXB1dF93cml0ZV9hY2Nlc3MoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpOworCQlmaWxwLT5mX21vZGUgPSAoZmlscC0+Zl9tb2RlIHwgRk1PREVfUkVBRCkgJiB+Rk1PREVfV1JJVEU7CisJfQorfQorCisvKgorICogUmVjYWxsIGEgZGVsZWdhdGlvbgorICovCitzdGF0aWMgaW50Citkb19yZWNhbGwodm9pZCAqX19kcCkKK3sKKwlzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICpkcCA9IF9fZHA7CisKKwlkYWVtb25pemUoIm5mc3Y0LXJlY2FsbCIpOworCisJbmZzZDRfY2JfcmVjYWxsKGRwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNwYXduIGEgdGhyZWFkIHRvIHBlcmZvcm0gYSByZWNhbGwgb24gdGhlIGRlbGVnYXRpb24gcmVwcmVzZW50ZWQKKyAqIGJ5IHRoZSBsZWFzZSAoZmlsZV9sb2NrKQorICoKKyAqIENhbGxlZCBmcm9tIGJyZWFrX2xlYXNlKCkgd2l0aCBsb2NrX2tlcm5lbCgpIGhlbGQuCisgKiBOb3RlOiB3ZSBhc3N1bWUgYnJlYWtfbGVhc2Ugd2lsbCBvbmx5IGNhbGwgdGhpcyAqb25jZSogZm9yIGFueSBnaXZlbgorICogbGVhc2UuCisgKi8KK3N0YXRpYwordm9pZCBuZnNkX2JyZWFrX2RlbGVnX2NiKHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCXN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKmRwPSAgKHN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKilmbC0+Zmxfb3duZXI7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0OworCisJZHByaW50aygiTkZTRCBuZnNkX2JyZWFrX2RlbGVnX2NiOiBkcCAlcCBmbCAlcFxuIixkcCxmbCk7CisJaWYgKCFkcCkKKwkJcmV0dXJuOworCisJLyogV2UncmUgYXNzdW1pbmcgdGhlIHN0YXRlIGNvZGUgbmV2ZXIgZHJvcHMgaXRzIHJlZmVyZW5jZQorCSAqIHdpdGhvdXQgZmlyc3QgcmVtb3ZpbmcgdGhlIGxlYXNlLiAgU2luY2Ugd2UncmUgaW4gdGhpcyBsZWFzZQorCSAqIGNhbGxiYWNrIChhbmQgc2luY2UgdGhlIGxlYXNlIGNvZGUgaXMgc2VyaWFsaXplZCBieSB0aGUga2VybmVsCisJICogbG9jaykgd2Uga25vdyB0aGUgc2VydmVyIGhhc24ndCByZW1vdmVkIHRoZSBsZWFzZSB5ZXQsIHdlIGtub3cKKwkgKiBpdCdzIHNhZmUgdG8gdGFrZSBhIHJlZmVyZW5jZTogKi8KKwlhdG9taWNfaW5jKCZkcC0+ZGxfY291bnQpOworCisJc3Bpbl9sb2NrKCZyZWNhbGxfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmZHAtPmRsX3JlY2FsbF9scnUsICZkZWxfcmVjYWxsX2xydSk7CisJc3Bpbl91bmxvY2soJnJlY2FsbF9sb2NrKTsKKworCS8qIG9ubHkgcGxhY2UgZGxfdGltZSBpcyBzZXQuIHByb3RlY3RlZCBieSBsb2NrX2tlcm5lbCovCisJZHAtPmRsX3RpbWUgPSBnZXRfc2Vjb25kcygpOworCisJLyogWFhYIG5lZWQgdG8gbWVyZ2UgTkZTRF9MRUFTRV9USU1FIHdpdGggZnMvbG9ja3MuYzpsZWFzZV9icmVha190aW1lICovCisJZmwtPmZsX2JyZWFrX3RpbWUgPSBqaWZmaWVzICsgTkZTRF9MRUFTRV9USU1FICogSFo7CisKKwl0ID0ga3RocmVhZF9ydW4oZG9fcmVjYWxsLCBkcCwgIiVzIiwgIm5mczRfY2JfcmVjYWxsIik7CisJaWYgKElTX0VSUih0KSkgeworCQlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCA9IGRwLT5kbF9jbGllbnQ7CisKKwkJcHJpbnRrKEtFUk5fSU5GTyAiTkZTRDogQ2FsbGJhY2sgdGhyZWFkIGZhaWxlZCBmb3IgIgorCQkJImZvciBjbGllbnQgKGNsaWVudGlkICUwOHgvJTA4eClcbiIsCisJCQljbHAtPmNsX2NsaWVudGlkLmNsX2Jvb3QsIGNscC0+Y2xfY2xpZW50aWQuY2xfaWQpOworCQluZnM0X3B1dF9kZWxlZ2F0aW9uKGRwKTsKKwl9Cit9CisKKy8qCisgKiBUaGUgZmlsZV9sb2NrIGlzIGJlaW5nIHJlYXBkLgorICoKKyAqIENhbGxlZCBieSBsb2Nrc19mcmVlX2xvY2soKSB3aXRoIGxvY2tfa2VybmVsKCkgaGVsZC4KKyAqLworc3RhdGljCit2b2lkIG5mc2RfcmVsZWFzZV9kZWxlZ19jYihzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3sKKwlzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICpkcCA9IChzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICopZmwtPmZsX293bmVyOworCisJZHByaW50aygiTkZTRCBuZnNkX3JlbGVhc2VfZGVsZWdfY2I6IGZsICVwIGRwICVwIGRsX2NvdW50ICVkXG4iLCBmbCxkcCwgYXRvbWljX3JlYWQoJmRwLT5kbF9jb3VudCkpOworCisJaWYgKCEoZmwtPmZsX2ZsYWdzICYgRkxfTEVBU0UpIHx8ICFkcCkKKwkJcmV0dXJuOworCWRwLT5kbF9mbG9jayA9IE5VTEw7Cit9CisKKy8qCisgKiBTZXQgdGhlIGRlbGVnYXRpb24gZmlsZV9sb2NrIGJhY2sgcG9pbnRlci4KKyAqCisgKiBDYWxsZWQgZnJvbSBfX3NldGxlYXNlKCkgd2l0aCBsb2NrX2tlcm5lbCgpIGhlbGQuCisgKi8KK3N0YXRpYwordm9pZCBuZnNkX2NvcHlfbG9ja19kZWxlZ19jYihzdHJ1Y3QgZmlsZV9sb2NrICpuZXcsIHN0cnVjdCBmaWxlX2xvY2sgKmZsKQoreworCXN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKmRwID0gKHN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKiluZXctPmZsX293bmVyOworCisJZHByaW50aygiTkZTRDogbmZzZF9jb3B5X2xvY2tfZGVsZWdfY2I6IG5ldyBmbCAlcCBkcCAlcFxuIiwgbmV3LCBkcCk7CisJaWYgKCFkcCkKKwkJcmV0dXJuOworCWRwLT5kbF9mbG9jayA9IG5ldzsKK30KKworLyoKKyAqIENhbGxlZCBmcm9tIF9fc2V0bGVhc2UoKSB3aXRoIGxvY2tfa2VybmVsKCkgaGVsZAorICovCitzdGF0aWMKK2ludCBuZnNkX3NhbWVfY2xpZW50X2RlbGVnX2NiKHN0cnVjdCBmaWxlX2xvY2sgKm9ubGlzdCwgc3RydWN0IGZpbGVfbG9jayAqdHJ5KQoreworCXN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKm9ubGlzdGQgPQorCQkoc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqKW9ubGlzdC0+Zmxfb3duZXI7CisJc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqdHJ5ZCA9CisJCShzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICopdHJ5LT5mbF9vd25lcjsKKworCWlmIChvbmxpc3QtPmZsX2xtb3BzICE9IHRyeS0+ZmxfbG1vcHMpCisJCXJldHVybiAwOworCisJcmV0dXJuIG9ubGlzdGQtPmRsX2NsaWVudCA9PSB0cnlkLT5kbF9jbGllbnQ7Cit9CisKKworc3RhdGljCitpbnQgbmZzZF9jaGFuZ2VfZGVsZWdfY2Ioc3RydWN0IGZpbGVfbG9jayAqKm9ubGlzdCwgaW50IGFyZykKK3sKKwlpZiAoYXJnICYgRl9VTkxDSykKKwkJcmV0dXJuIGxlYXNlX21vZGlmeShvbmxpc3QsIGFyZyk7CisJZWxzZQorCQlyZXR1cm4gLUVBR0FJTjsKK30KKworc3RydWN0IGxvY2tfbWFuYWdlcl9vcGVyYXRpb25zIG5mc2RfbGVhc2VfbW5nX29wcyA9IHsKKwkuZmxfYnJlYWsgPSBuZnNkX2JyZWFrX2RlbGVnX2NiLAorCS5mbF9yZWxlYXNlX3ByaXZhdGUgPSBuZnNkX3JlbGVhc2VfZGVsZWdfY2IsCisJLmZsX2NvcHlfbG9jayA9IG5mc2RfY29weV9sb2NrX2RlbGVnX2NiLAorCS5mbF9teWxlYXNlID0gbmZzZF9zYW1lX2NsaWVudF9kZWxlZ19jYiwKKwkuZmxfY2hhbmdlID0gbmZzZF9jaGFuZ2VfZGVsZWdfY2IsCit9OworCisKKy8qCisgKiBuZnNkNF9wcm9jZXNzX29wZW4xKCkKKyAqIAlsb29rdXAgc3RhdGVvd25lci4KKyAqIAkJZm91bmQ6CisgKiAJCQljaGVjayBjb25maXJtZWQgCisgKiAJCQkJY29uZmlybWVkOgorICogCQkJCQljaGVjayBzZXFpZAorICogCQkJCW5vdCBjb25maXJtZWQ6CisgKiAJCQkJCWRlbGV0ZSBvd25lcgorICogCQkJCQljcmVhdGUgbmV3IG93bmVyCisgKiAJCW5vdGZvdW5kOgorICogCQkJdmVyaWZ5IGNsaWVudGlkCisgKiAJCQljcmVhdGUgbmV3IG93bmVyCisgKgorICogY2FsbGVkIHdpdGggbmZzNF9sb2NrX3N0YXRlKCkgaGVsZC4KKyAqLworaW50CituZnNkNF9wcm9jZXNzX29wZW4xKHN0cnVjdCBuZnNkNF9vcGVuICpvcGVuKQoreworCWludCBzdGF0dXM7CisJY2xpZW50aWRfdCAqY2xpZW50aWQgPSAmb3Blbi0+b3BfY2xpZW50aWQ7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHAgPSBOVUxMOworCXVuc2lnbmVkIGludCBzdHJoYXNodmFsOworCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKnNvcCA9IE5VTEw7CisKKwlzdGF0dXMgPSBuZnNlcnJfaW52YWw7CisJaWYgKCFjaGVja19uYW1lKG9wZW4tPm9wX293bmVyKSkKKwkJZ290byBvdXQ7CisKKwlpZiAoU1RBTEVfQ0xJRU5USUQoJm9wZW4tPm9wX2NsaWVudGlkKSkKKwkJcmV0dXJuIG5mc2Vycl9zdGFsZV9jbGllbnRpZDsKKworCXN0cmhhc2h2YWwgPSBvd25lcnN0cl9oYXNodmFsKGNsaWVudGlkLT5jbF9pZCwgb3Blbi0+b3Bfb3duZXIpOworCXNvcCA9IGZpbmRfb3BlbnN0YXRlb3duZXJfc3RyKHN0cmhhc2h2YWwsIG9wZW4pOworCWlmIChzb3ApIHsKKwkJb3Blbi0+b3Bfc3RhdGVvd25lciA9IHNvcDsKKwkJLyogY2hlY2sgZm9yIHJlcGxheSAqLworCQlpZiAob3Blbi0+b3Bfc2VxaWQgPT0gc29wLT5zb19zZXFpZCl7CisJCQlpZiAoc29wLT5zb19yZXBsYXkucnBfYnVmbGVuKQorCQkJCXJldHVybiBORlNFUlJfUkVQTEFZX01FOworCQkJZWxzZSB7CisJCQkJLyogVGhlIG9yaWdpbmFsIE9QRU4gZmFpbGVkIHNvIHNwZWN0YWN1bGFybHkKKwkJCQkgKiB0aGF0IHdlIGRvbid0IGV2ZW4gaGF2ZSByZXBsYXkgZGF0YSBzYXZlZCEKKwkJCQkgKiBUaGVyZWZvcmUsIHdlIGhhdmUgbm8gY2hvaWNlIGJ1dCB0byBjb250aW51ZQorCQkJCSAqIHByb2Nlc3NpbmcgdGhpcyBPUEVOOyBwcmVzdW1hYmx5LCB3ZSdsbAorCQkJCSAqIGZhaWwgYWdhaW4gZm9yIHRoZSBzYW1lIHJlYXNvbi4KKwkJCQkgKi8KKwkJCQlkcHJpbnRrKCJuZnNkNF9wcm9jZXNzX29wZW4xOiIKKwkJCQkJIiByZXBsYXkgd2l0aCBubyByZXBsYXkgY2FjaGVcbiIpOworCQkJCWdvdG8gcmVuZXc7CisJCQl9CisJCX0gZWxzZSBpZiAoc29wLT5zb19jb25maXJtZWQpIHsKKwkJCWlmIChvcGVuLT5vcF9zZXFpZCA9PSBzb3AtPnNvX3NlcWlkICsgMSkKKwkJCQlnb3RvIHJlbmV3OworCQkJc3RhdHVzID0gbmZzZXJyX2JhZF9zZXFpZDsKKwkJCWdvdG8gb3V0OworCQl9IGVsc2UgeworCQkJLyogSWYgd2UgZ2V0IGhlcmUsIHdlIHJlY2VpdmVkIGFuIE9QRU4gZm9yIGFuCisJCQkgKiB1bmNvbmZpcm1lZCBuZnM0X3N0YXRlb3duZXIuIFNpbmNlIHRoZSBzZXFpZCdzIGFyZQorCQkJICogZGlmZmVyZW50LCBwdXJnZSB0aGUgZXhpc3RpbmcgbmZzNF9zdGF0ZW93bmVyLCBhbmQKKwkJCSAqIGluc3RhbnRpYXRlIGEgbmV3IG9uZS4KKwkJCSAqLworCQkJY2xwID0gc29wLT5zb19jbGllbnQ7CisJCQlyZWxlYXNlX3N0YXRlb3duZXIoc29wKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIG5mczRfc3RhdGVvd25lciBub3QgZm91bmQuCisJCSAqIFZlcmlmeSBjbGllbnRpZCBhbmQgaW5zdGFudGlhdGUgbmV3IG5mczRfc3RhdGVvd25lci4KKwkJICogSWYgdmVyaWZ5IGZhaWxzIHRoaXMgaXMgcHJlc3VtYWJseSB0aGUgcmVzdWx0IG9mIHRoZQorCQkgKiBjbGllbnQncyBsZWFzZSBleHBpcmluZy4KKwkJICovCisJCXN0YXR1cyA9IG5mc2Vycl9leHBpcmVkOworCQljbHAgPSBmaW5kX2NvbmZpcm1lZF9jbGllbnQoY2xpZW50aWQpOworCQlpZiAoY2xwID09IE5VTEwpCisJCQlnb3RvIG91dDsKKwl9CisJc3RhdHVzID0gbmZzZXJyX3Jlc291cmNlOworCXNvcCA9IGFsbG9jX2luaXRfb3Blbl9zdGF0ZW93bmVyKHN0cmhhc2h2YWwsIGNscCwgb3Blbik7CisJaWYgKHNvcCA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwlvcGVuLT5vcF9zdGF0ZW93bmVyID0gc29wOworcmVuZXc6CisJc3RhdHVzID0gbmZzX29rOworCXJlbmV3X2NsaWVudChzb3AtPnNvX2NsaWVudCk7CitvdXQ6CisJaWYgKHN0YXR1cyAmJiBvcGVuLT5vcF9jbGFpbV90eXBlID09IE5GUzRfT1BFTl9DTEFJTV9QUkVWSU9VUykKKwkJc3RhdHVzID0gbmZzZXJyX3JlY2xhaW1fYmFkOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQKK25mczRfY2hlY2tfb3BlbihzdHJ1Y3QgbmZzNF9maWxlICpmcCwgc3RydWN0IG5mc2Q0X29wZW4gKm9wZW4sIHN0cnVjdCBuZnM0X3N0YXRlaWQgKipzdHBwKQoreworCXN0cnVjdCBuZnM0X3N0YXRlaWQgKmxvY2FsOworCWludCBzdGF0dXMgPSBuZnNlcnJfc2hhcmVfZGVuaWVkOworCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKnNvcCA9IG9wZW4tPm9wX3N0YXRlb3duZXI7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvY2FsLCAmZnAtPmZpX3BlcmZpbGUsIHN0X3BlcmZpbGUpIHsKKwkJLyogaWdub3JlIGxvY2sgb3duZXJzICovCisJCWlmIChsb2NhbC0+c3Rfc3RhdGVvd25lci0+c29faXNfb3Blbl9vd25lciA9PSAwKQorCQkJY29udGludWU7CisJCS8qIHJlbWVtYmVyIGlmIHdlIGhhdmUgc2VlbiB0aGlzIG9wZW4gb3duZXIgKi8KKwkJaWYgKGxvY2FsLT5zdF9zdGF0ZW93bmVyID09IHNvcCkKKwkJCSpzdHBwID0gbG9jYWw7CisJCS8qIGNoZWNrIGZvciBjb25mbGljdGluZyBzaGFyZSByZXNlcnZhdGlvbnMgKi8KKwkJaWYgKCF0ZXN0X3NoYXJlKGxvY2FsLCBvcGVuKSkKKwkJCWdvdG8gb3V0OworCX0KKwlzdGF0dXMgPSAwOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQKK25mczRfbmV3X29wZW4oc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mczRfc3RhdGVpZCAqKnN0cHAsCisJCXN0cnVjdCBzdmNfZmggKmN1cl9maCwgaW50IGZsYWdzKQoreworCXN0cnVjdCBuZnM0X3N0YXRlaWQgKnN0cDsKKwlpbnQgc3RhdHVzOworCisJc3RwID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG5mczRfc3RhdGVpZCksIEdGUF9LRVJORUwpOworCWlmIChzdHAgPT0gTlVMTCkKKwkJcmV0dXJuIG5mc2Vycl9yZXNvdXJjZTsKKworCXN0YXR1cyA9IG5mc2Rfb3BlbihycXN0cCwgY3VyX2ZoLCBTX0lGUkVHLCBmbGFncywgJnN0cC0+c3RfdmZzX2ZpbGUpOworCWlmIChzdGF0dXMpIHsKKwkJaWYgKHN0YXR1cyA9PSBuZnNlcnJfZHJvcGl0KQorCQkJc3RhdHVzID0gbmZzZXJyX2p1a2Vib3g7CisJCWtmcmVlKHN0cCk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCXZmc29wZW4rKzsKKwkqc3RwcCA9IHN0cDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK25mc2Q0X3RydW5jYXRlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZoLAorCQlzdHJ1Y3QgbmZzZDRfb3BlbiAqb3BlbikKK3sKKwlzdHJ1Y3QgaWF0dHIgaWF0dHIgPSB7CisJCS5pYV92YWxpZCA9IEFUVFJfU0laRSwKKwkJLmlhX3NpemUgPSAwLAorCX07CisJaWYgKCFvcGVuLT5vcF90cnVuY2F0ZSkKKwkJcmV0dXJuIDA7CisJaWYgKCEob3Blbi0+b3Bfc2hhcmVfYWNjZXNzICYgTkZTNF9TSEFSRV9BQ0NFU1NfV1JJVEUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gbmZzZF9zZXRhdHRyKHJxc3RwLCBmaCwgJmlhdHRyLCAwLCAodGltZV90KTApOworfQorCitzdGF0aWMgaW50CituZnM0X3VwZ3JhZGVfb3BlbihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJfZmgsIHN0cnVjdCBuZnM0X3N0YXRlaWQgKnN0cCwgc3RydWN0IG5mc2Q0X29wZW4gKm9wZW4pCit7CisJc3RydWN0IGZpbGUgKmZpbHAgPSBzdHAtPnN0X3Zmc19maWxlOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwl1bnNpZ25lZCBpbnQgc2hhcmVfYWNjZXNzOworCWludCBzdGF0dXM7CisKKwlzZXRfYWNjZXNzKCZzaGFyZV9hY2Nlc3MsIHN0cC0+c3RfYWNjZXNzX2JtYXApOworCXNoYXJlX2FjY2VzcyA9IH5zaGFyZV9hY2Nlc3M7CisJc2hhcmVfYWNjZXNzICY9IG9wZW4tPm9wX3NoYXJlX2FjY2VzczsKKworCWlmICghKHNoYXJlX2FjY2VzcyAmIE5GUzRfU0hBUkVfQUNDRVNTX1dSSVRFKSkKKwkJcmV0dXJuIG5mc2Q0X3RydW5jYXRlKHJxc3RwLCBjdXJfZmgsIG9wZW4pOworCisJc3RhdHVzID0gZ2V0X3dyaXRlX2FjY2Vzcyhpbm9kZSk7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIG5mc2Vycm5vKHN0YXR1cyk7CisJc3RhdHVzID0gbmZzZDRfdHJ1bmNhdGUocnFzdHAsIGN1cl9maCwgb3Blbik7CisJaWYgKHN0YXR1cykgeworCQlwdXRfd3JpdGVfYWNjZXNzKGlub2RlKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisJLyogcmVtZW1iZXIgdGhlIG9wZW4gKi8KKwlmaWxwLT5mX21vZGUgPSAoZmlscC0+Zl9tb2RlIHwgRk1PREVfV1JJVEUpICYgfkZNT0RFX1JFQUQ7CisJc2V0X2JpdChvcGVuLT5vcF9zaGFyZV9hY2Nlc3MsICZzdHAtPnN0X2FjY2Vzc19ibWFwKTsKKwlzZXRfYml0KG9wZW4tPm9wX3NoYXJlX2RlbnksICZzdHAtPnN0X2RlbnlfYm1hcCk7CisKKwlyZXR1cm4gbmZzX29rOworfQorCisKKy8qIGRlY3JlbWVudCBzZXFpZCBvbiBzdWNjZXNzZnVsIHJlY2xhaW0sIGl0IHdpbGwgYmUgYnVtcGVkIGluIGVuY29kZV9vcGVuICovCitzdGF0aWMgdm9pZAorbmZzNF9zZXRfY2xhaW1fcHJldihzdHJ1Y3QgbmZzZDRfb3BlbiAqb3BlbiwgaW50ICpzdGF0dXMpCit7CisJaWYgKG9wZW4tPm9wX2NsYWltX3R5cGUgPT0gTkZTNF9PUEVOX0NMQUlNX1BSRVZJT1VTKSB7CisJCWlmICgqc3RhdHVzKQorCQkJKnN0YXR1cyA9IG5mc2Vycl9yZWNsYWltX2JhZDsKKwkJZWxzZSB7CisJCQlvcGVuLT5vcF9zdGF0ZW93bmVyLT5zb19jb25maXJtZWQgPSAxOworCQkJb3Blbi0+b3Bfc3RhdGVvd25lci0+c29fc2VxaWQtLTsKKwkJfQorCX0KK30KKworLyoKKyAqIEF0dGVtcHQgdG8gaGFuZCBvdXQgYSBkZWxlZ2F0aW9uLgorICovCitzdGF0aWMgdm9pZAorbmZzNF9vcGVuX2RlbGVnYXRpb24oc3RydWN0IHN2Y19maCAqZmgsIHN0cnVjdCBuZnNkNF9vcGVuICpvcGVuLCBzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpzdHApCit7CisJc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqZHA7CisJc3RydWN0IG5mczRfc3RhdGVvd25lciAqc29wID0gc3RwLT5zdF9zdGF0ZW93bmVyOworCXN0cnVjdCBuZnM0X2NhbGxiYWNrICpjYiA9ICZzb3AtPnNvX2NsaWVudC0+Y2xfY2FsbGJhY2s7CisJc3RydWN0IGZpbGVfbG9jayBmbCwgKmZscCA9ICZmbDsKKwlpbnQgc3RhdHVzLCBmbGFnID0gMDsKKworCWZsYWcgPSBORlM0X09QRU5fREVMRUdBVEVfTk9ORTsKKwlpZiAob3Blbi0+b3BfY2xhaW1fdHlwZSAhPSBORlM0X09QRU5fQ0xBSU1fTlVMTAorCSAgICAgfHwgIWF0b21pY19yZWFkKCZjYi0+Y2Jfc2V0KSB8fCAhc29wLT5zb19jb25maXJtZWQpCisJCWdvdG8gb3V0OworCisJaWYgKG9wZW4tPm9wX3NoYXJlX2FjY2VzcyAmIE5GUzRfU0hBUkVfQUNDRVNTX1dSSVRFKQorCQlmbGFnID0gTkZTNF9PUEVOX0RFTEVHQVRFX1dSSVRFOworCWVsc2UKKwkJZmxhZyA9IE5GUzRfT1BFTl9ERUxFR0FURV9SRUFEOworCisJZHAgPSBhbGxvY19pbml0X2RlbGVnKHNvcC0+c29fY2xpZW50LCBzdHAsIGZoLCBmbGFnKTsKKwlpZiAoZHAgPT0gTlVMTCkgeworCQlmbGFnID0gTkZTNF9PUEVOX0RFTEVHQVRFX05PTkU7CisJCWdvdG8gb3V0OworCX0KKwlsb2Nrc19pbml0X2xvY2soJmZsKTsKKwlmbC5mbF9sbW9wcyA9ICZuZnNkX2xlYXNlX21uZ19vcHM7CisJZmwuZmxfZmxhZ3MgPSBGTF9MRUFTRTsKKwlmbC5mbF9lbmQgPSBPRkZTRVRfTUFYOworCWZsLmZsX293bmVyID0gIChmbF9vd25lcl90KWRwOworCWZsLmZsX2ZpbGUgPSBzdHAtPnN0X3Zmc19maWxlOworCWZsLmZsX3BpZCA9IGN1cnJlbnQtPnRnaWQ7CisKKwkvKiBzZXRsZWFzZSBjaGVja3MgdG8gc2VlIGlmIGRlbGVnYXRpb24gc2hvdWxkIGJlIGhhbmRlZCBvdXQuCisJICogdGhlIGxvY2tfbWFuYWdlciBjYWxsYmFja3MgZmxfbXlsZWFzZSBhbmQgZmxfY2hhbmdlIGFyZSB1c2VkCisJICovCisJaWYgKChzdGF0dXMgPSBzZXRsZWFzZShzdHAtPnN0X3Zmc19maWxlLAorCQlmbGFnID09IE5GUzRfT1BFTl9ERUxFR0FURV9SRUFEPyBGX1JETENLOiBGX1dSTENLLCAmZmxwKSkpIHsKKwkJZHByaW50aygiTkZTRDogc2V0bGVhc2UgZmFpbGVkIFslZF0sIG5vIGRlbGVnYXRpb25cbiIsIHN0YXR1cyk7CisJCWxpc3RfZGVsKCZkcC0+ZGxfZGVsX3BlcmZpbGUpOworCQlsaXN0X2RlbCgmZHAtPmRsX2RlbF9wZXJjbG50KTsKKwkJbmZzNF9wdXRfZGVsZWdhdGlvbihkcCk7CisJCWZyZWVfZGVsZWdhdGlvbisrOworCQlmbGFnID0gTkZTNF9PUEVOX0RFTEVHQVRFX05PTkU7CisJCWdvdG8gb3V0OworCX0KKworCW1lbWNweSgmb3Blbi0+b3BfZGVsZWdhdGVfc3RhdGVpZCwgJmRwLT5kbF9zdGF0ZWlkLCBzaXplb2YoZHAtPmRsX3N0YXRlaWQpKTsKKworCWRwcmludGsoIk5GU0Q6IGRlbGVnYXRpb24gc3RhdGVpZD0oJTA4eC8lMDh4LyUwOHgvJTA4eClcblxuIiwKKwkgICAgICAgICAgICAgZHAtPmRsX3N0YXRlaWQuc2lfYm9vdCwKKwkgICAgICAgICAgICAgZHAtPmRsX3N0YXRlaWQuc2lfc3RhdGVvd25lcmlkLAorCSAgICAgICAgICAgICBkcC0+ZGxfc3RhdGVpZC5zaV9maWxlaWQsCisJICAgICAgICAgICAgIGRwLT5kbF9zdGF0ZWlkLnNpX2dlbmVyYXRpb24pOworb3V0OgorCW9wZW4tPm9wX2RlbGVnYXRlX3R5cGUgPSBmbGFnOworfQorCisvKgorICogY2FsbGVkIHdpdGggbmZzNF9sb2NrX3N0YXRlKCkgaGVsZC4KKyAqLworaW50CituZnNkNF9wcm9jZXNzX29wZW4yKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9vcGVuICpvcGVuKQoreworCXN0cnVjdCBuZnM0X2ZpbGUgKmZwID0gTlVMTDsKKwlzdHJ1Y3QgaW5vZGUgKmlubyA9IGN1cnJlbnRfZmgtPmZoX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpzdHAgPSBOVUxMOworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBuZnNlcnJfaW52YWw7CisJaWYgKCFURVNUX0FDQ0VTUyhvcGVuLT5vcF9zaGFyZV9hY2Nlc3MpIHx8ICFURVNUX0RFTlkob3Blbi0+b3Bfc2hhcmVfZGVueSkpCisJCWdvdG8gb3V0OworCS8qCisJICogTG9va3VwIGZpbGU7IGlmIGZvdW5kLCBsb29rdXAgc3RhdGVpZCBhbmQgY2hlY2sgb3BlbiByZXF1ZXN0LAorCSAqIGFuZCBjaGVjayBmb3IgZGVsZWdhdGlvbnMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgcmVjYWxsZWQuCisJICogSWYgbm90IGZvdW5kLCBjcmVhdGUgdGhlIG5mczRfZmlsZSBzdHJ1Y3QKKwkgKi8KKwlmcCA9IGZpbmRfZmlsZShpbm8pOworCWlmIChmcCkgeworCQlpZiAoKHN0YXR1cyA9IG5mczRfY2hlY2tfb3BlbihmcCwgb3BlbiwgJnN0cCkpKQorCQkJZ290byBvdXQ7CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gbmZzZXJyX3Jlc291cmNlOworCQlmcCA9IGFsbG9jX2luaXRfZmlsZShpbm8pOworCQlpZiAoZnAgPT0gTlVMTCkKKwkJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogT1BFTiB0aGUgZmlsZSwgb3IgdXBncmFkZSBhbiBleGlzdGluZyBPUEVOLgorCSAqIElmIHRydW5jYXRlIGZhaWxzLCB0aGUgT1BFTiBmYWlscy4KKwkgKi8KKwlpZiAoc3RwKSB7CisJCS8qIFN0YXRlaWQgd2FzIGZvdW5kLCB0aGlzIGlzIGFuIE9QRU4gdXBncmFkZSAqLworCQlzdGF0dXMgPSBuZnM0X3VwZ3JhZGVfb3BlbihycXN0cCwgY3VycmVudF9maCwgc3RwLCBvcGVuKTsKKwkJaWYgKHN0YXR1cykKKwkJCWdvdG8gb3V0OworCX0gZWxzZSB7CisJCS8qIFN0YXRlaWQgd2FzIG5vdCBmb3VuZCwgdGhpcyBpcyBhIG5ldyBPUEVOICovCisJCWludCBmbGFncyA9IDA7CisJCWlmIChvcGVuLT5vcF9zaGFyZV9hY2Nlc3MgJiBORlM0X1NIQVJFX0FDQ0VTU19XUklURSkKKwkJCWZsYWdzID0gTUFZX1dSSVRFOworCQllbHNlCisJCQlmbGFncyA9IE1BWV9SRUFEOworCQlpZiAoKHN0YXR1cyA9IG5mczRfbmV3X29wZW4ocnFzdHAsICZzdHAsIGN1cnJlbnRfZmgsIGZsYWdzKSkpCisJCQlnb3RvIG91dDsKKwkJaW5pdF9zdGF0ZWlkKHN0cCwgZnAsIG9wZW4pOworCQlzdGF0dXMgPSBuZnNkNF90cnVuY2F0ZShycXN0cCwgY3VycmVudF9maCwgb3Blbik7CisJCWlmIChzdGF0dXMpIHsKKwkJCXJlbGVhc2Vfc3RhdGVpZChzdHAsIE9QRU5fU1RBVEUpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJbWVtY3B5KCZvcGVuLT5vcF9zdGF0ZWlkLCAmc3RwLT5zdF9zdGF0ZWlkLCBzaXplb2Yoc3RhdGVpZF90KSk7CisKKwkvKgorCSogQXR0ZW1wdCB0byBoYW5kIG91dCBhIGRlbGVnYXRpb24uIE5vIGVycm9yIHJldHVybiwgYmVjYXVzZSB0aGUKKwkqIE9QRU4gc3VjY2VlZHMgZXZlbiBpZiB3ZSBmYWlsLgorCSovCisJbmZzNF9vcGVuX2RlbGVnYXRpb24oY3VycmVudF9maCwgb3Blbiwgc3RwKTsKKworCXN0YXR1cyA9IG5mc19vazsKKworCWRwcmludGsoIm5mczRfcHJvY2Vzc19vcGVuMjogc3RhdGVpZD0oJTA4eC8lMDh4LyUwOHgvJTA4eClcbiIsCisJICAgICAgICAgICAgc3RwLT5zdF9zdGF0ZWlkLnNpX2Jvb3QsIHN0cC0+c3Rfc3RhdGVpZC5zaV9zdGF0ZW93bmVyaWQsCisJICAgICAgICAgICAgc3RwLT5zdF9zdGF0ZWlkLnNpX2ZpbGVpZCwgc3RwLT5zdF9zdGF0ZWlkLnNpX2dlbmVyYXRpb24pOworb3V0OgorCS8qIHRha2UgdGhlIG9wcG9ydHVuaXR5IHRvIGNsZWFuIHVwIHVudXNlZCBzdGF0ZSAqLworCWlmIChmcCAmJiBsaXN0X2VtcHR5KCZmcC0+ZmlfcGVyZmlsZSkgJiYgbGlzdF9lbXB0eSgmZnAtPmZpX2RlbF9wZXJmaWxlKSkKKwkJcmVsZWFzZV9maWxlKGZwKTsKKworCS8qIENMQUlNX1BSRVZJT1VTIGhhcyBkaWZmZXJlbnQgZXJyb3IgcmV0dXJucyAqLworCW5mczRfc2V0X2NsYWltX3ByZXYob3BlbiwgJnN0YXR1cyk7CisJLyoKKwkqIFRvIGZpbmlzaCB0aGUgb3BlbiByZXNwb25zZSwgd2UganVzdCBuZWVkIHRvIHNldCB0aGUgcmZsYWdzLgorCSovCisJb3Blbi0+b3BfcmZsYWdzID0gTkZTNF9PUEVOX1JFU1VMVF9MT0NLVFlQRV9QT1NJWDsKKwlpZiAoIW9wZW4tPm9wX3N0YXRlb3duZXItPnNvX2NvbmZpcm1lZCkKKwkJb3Blbi0+b3BfcmZsYWdzIHw9IE5GUzRfT1BFTl9SRVNVTFRfQ09ORklSTTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3QgbGF1bmRyb21hdF93b3JrOworc3RhdGljIHZvaWQgbGF1bmRyb21hdF9tYWluKHZvaWQgKik7CitzdGF0aWMgREVDTEFSRV9XT1JLKGxhdW5kcm9tYXRfd29yaywgbGF1bmRyb21hdF9tYWluLCBOVUxMKTsKKworaW50IAorbmZzZDRfcmVuZXcoY2xpZW50aWRfdCAqY2xpZCkKK3sKKwlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscDsKKwlpbnQgc3RhdHVzOworCisJbmZzNF9sb2NrX3N0YXRlKCk7CisJZHByaW50aygicHJvY2Vzc19yZW5ldyglMDh4LyUwOHgpOiBzdGFydGluZ1xuIiwgCisJCQljbGlkLT5jbF9ib290LCBjbGlkLT5jbF9pZCk7CisJc3RhdHVzID0gbmZzZXJyX3N0YWxlX2NsaWVudGlkOworCWlmIChTVEFMRV9DTElFTlRJRChjbGlkKSkKKwkJZ290byBvdXQ7CisJY2xwID0gZmluZF9jb25maXJtZWRfY2xpZW50KGNsaWQpOworCXN0YXR1cyA9IG5mc2Vycl9leHBpcmVkOworCWlmIChjbHAgPT0gTlVMTCkgeworCQkvKiBXZSBhc3N1bWUgdGhlIGNsaWVudCB0b29rIHRvbyBsb25nIHRvIFJFTkVXLiAqLworCQlkcHJpbnRrKCJuZnNkNF9yZW5ldzogY2xpZW50aWQgbm90IGZvdW5kIVxuIik7CisJCWdvdG8gb3V0OworCX0KKwlyZW5ld19jbGllbnQoY2xwKTsKKwlzdGF0dXMgPSBuZnNlcnJfY2JfcGF0aF9kb3duOworCWlmICghbGlzdF9lbXB0eSgmY2xwLT5jbF9kZWxfcGVyY2xudCkKKwkJCSYmICFhdG9taWNfcmVhZCgmY2xwLT5jbF9jYWxsYmFjay5jYl9zZXQpKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBuZnNfb2s7CitvdXQ6CisJbmZzNF91bmxvY2tfc3RhdGUoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCit0aW1lX3QKK25mczRfbGF1bmRyb21hdCh2b2lkKQoreworCXN0cnVjdCBuZnM0X2NsaWVudCAqY2xwOworCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKnNvcDsKKwlzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICpkcDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICpuZXh0LCByZWFwbGlzdDsKKwl0aW1lX3QgY3V0b2ZmID0gZ2V0X3NlY29uZHMoKSAtIE5GU0RfTEVBU0VfVElNRTsKKwl0aW1lX3QgdCwgY2xpZW50aWRfdmFsID0gTkZTRF9MRUFTRV9USU1FOworCXRpbWVfdCB1LCB0ZXN0X3ZhbCA9IE5GU0RfTEVBU0VfVElNRTsKKworCW5mczRfbG9ja19zdGF0ZSgpOworCisJZHByaW50aygiTkZTRDogbGF1bmRyb21hdCBzZXJ2aWNlIC0gc3RhcnRpbmdcbiIpOworCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIG5leHQsICZjbGllbnRfbHJ1KSB7CisJCWNscCA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgbmZzNF9jbGllbnQsIGNsX2xydSk7CisJCWlmICh0aW1lX2FmdGVyKCh1bnNpZ25lZCBsb25nKWNscC0+Y2xfdGltZSwgKHVuc2lnbmVkIGxvbmcpY3V0b2ZmKSkgeworCQkJdCA9IGNscC0+Y2xfdGltZSAtIGN1dG9mZjsKKwkJCWlmIChjbGllbnRpZF92YWwgPiB0KQorCQkJCWNsaWVudGlkX3ZhbCA9IHQ7CisJCQlicmVhazsKKwkJfQorCQlkcHJpbnRrKCJORlNEOiBwdXJnaW5nIHVudXNlZCBjbGllbnQgKGNsaWVudGlkICUwOHgpXG4iLAorCQkJY2xwLT5jbF9jbGllbnRpZC5jbF9pZCk7CisJCWV4cGlyZV9jbGllbnQoY2xwKTsKKwl9CisJSU5JVF9MSVNUX0hFQUQoJnJlYXBsaXN0KTsKKwlzcGluX2xvY2soJnJlY2FsbF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBuZXh0LCAmZGVsX3JlY2FsbF9scnUpIHsKKwkJZHAgPSBsaXN0X2VudHJ5IChwb3MsIHN0cnVjdCBuZnM0X2RlbGVnYXRpb24sIGRsX3JlY2FsbF9scnUpOworCQlpZiAodGltZV9hZnRlcigodW5zaWduZWQgbG9uZylkcC0+ZGxfdGltZSwgKHVuc2lnbmVkIGxvbmcpY3V0b2ZmKSkgeworCQkJdSA9IGRwLT5kbF90aW1lIC0gY3V0b2ZmOworCQkJaWYgKHRlc3RfdmFsID4gdSkKKwkJCQl0ZXN0X3ZhbCA9IHU7CisJCQlicmVhazsKKwkJfQorCQlkcHJpbnRrKCJORlNEOiBwdXJnaW5nIHVudXNlZCBkZWxlZ2F0aW9uIGRwICVwLCBmcCAlcFxuIiwKKwkJCSAgICAgICAgICAgIGRwLCBkcC0+ZGxfZmxvY2spOworCQlsaXN0X21vdmUoJmRwLT5kbF9yZWNhbGxfbHJ1LCAmcmVhcGxpc3QpOworCX0KKwlzcGluX3VubG9jaygmcmVjYWxsX2xvY2spOworCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIG5leHQsICZyZWFwbGlzdCkgeworCQlkcCA9IGxpc3RfZW50cnkgKHBvcywgc3RydWN0IG5mczRfZGVsZWdhdGlvbiwgZGxfcmVjYWxsX2xydSk7CisJCWxpc3RfZGVsX2luaXQoJmRwLT5kbF9yZWNhbGxfbHJ1KTsKKwkJdW5oYXNoX2RlbGVnYXRpb24oZHApOworCX0KKwl0ZXN0X3ZhbCA9IE5GU0RfTEVBU0VfVElNRTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBuZXh0LCAmY2xvc2VfbHJ1KSB7CisJCXNvcCA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyLCBzb19jbG9zZV9scnUpOworCQlpZiAodGltZV9hZnRlcigodW5zaWduZWQgbG9uZylzb3AtPnNvX3RpbWUsICh1bnNpZ25lZCBsb25nKWN1dG9mZikpIHsKKwkJCXUgPSBzb3AtPnNvX3RpbWUgLSBjdXRvZmY7CisJCQlpZiAodGVzdF92YWwgPiB1KQorCQkJCXRlc3RfdmFsID0gdTsKKwkJCWJyZWFrOworCQl9CisJCWRwcmludGsoIk5GU0Q6IHB1cmdpbmcgdW51c2VkIG9wZW4gc3RhdGVvd25lciAoc29faWQgJWQpXG4iLAorCQkJc29wLT5zb19pZCk7CisJCWxpc3RfZGVsKCZzb3AtPnNvX2Nsb3NlX2xydSk7CisJCW5mczRfcHV0X3N0YXRlb3duZXIoc29wKTsKKwl9CisJaWYgKGNsaWVudGlkX3ZhbCA8IE5GU0RfTEFVTkRST01BVF9NSU5USU1FT1VUKQorCQljbGllbnRpZF92YWwgPSBORlNEX0xBVU5EUk9NQVRfTUlOVElNRU9VVDsKKwluZnM0X3VubG9ja19zdGF0ZSgpOworCXJldHVybiBjbGllbnRpZF92YWw7Cit9CisKK3ZvaWQKK2xhdW5kcm9tYXRfbWFpbih2b2lkICpub3RfdXNlZCkKK3sKKwl0aW1lX3QgdDsKKworCXQgPSBuZnM0X2xhdW5kcm9tYXQoKTsKKwlkcHJpbnRrKCJORlNEOiBsYXVuZHJvbWF0X21haW4gLSBzbGVlcGluZyBmb3IgJWxkIHNlY29uZHNcbiIsIHQpOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmbGF1bmRyb21hdF93b3JrLCB0KkhaKTsKK30KKworLyogc2VhcmNoIG93bmVyaWRfaGFzaHRibFtdIGFuZCBjbG9zZV9scnUgZm9yIHN0YXRlaWQgb3duZXIKKyAqIChzdGF0ZWlkLT5zaV9zdGF0ZW93bmVyaWQpCisgKi8KK3N0cnVjdCBuZnM0X3N0YXRlb3duZXIgKgorZmluZF9vcGVuc3RhdGVvd25lcl9pZCh1MzIgc3RfaWQsIGludCBmbGFncykgeworCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKmxvY2FsID0gTlVMTDsKKworCWRwcmludGsoIk5GU0Q6IGZpbmRfb3BlbnN0YXRlb3duZXJfaWQgJWRcbiIsIHN0X2lkKTsKKwlpZiAoZmxhZ3MgJiBDTE9TRV9TVEFURSkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvY2FsLCAmY2xvc2VfbHJ1LCBzb19jbG9zZV9scnUpIHsKKwkJCWlmIChsb2NhbC0+c29faWQgPT0gc3RfaWQpCisJCQkJcmV0dXJuIGxvY2FsOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIGludAorbmZzNF9jaGVja19maChzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIHN0cnVjdCBuZnM0X3N0YXRlaWQgKnN0cCkKK3sKKwlyZXR1cm4gZmhwLT5maF9kZW50cnktPmRfaW5vZGUgIT0gc3RwLT5zdF92ZnNfZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7Cit9CisKK3N0YXRpYyBpbnQKK1NUQUxFX1NUQVRFSUQoc3RhdGVpZF90ICpzdGF0ZWlkKQoreworCWlmIChzdGF0ZWlkLT5zaV9ib290ID09IGJvb3RfdGltZSkKKwkJcmV0dXJuIDA7CisJcHJpbnRrKCJORlNEOiBzdGFsZSBzdGF0ZWlkICglMDh4LyUwOHgvJTA4eC8lMDh4KSFcbiIsCisJCXN0YXRlaWQtPnNpX2Jvb3QsIHN0YXRlaWQtPnNpX3N0YXRlb3duZXJpZCwgc3RhdGVpZC0+c2lfZmlsZWlkLAorCQlzdGF0ZWlkLT5zaV9nZW5lcmF0aW9uKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2FjY2Vzc19wZXJtaXRfcmVhZCh1bnNpZ25lZCBsb25nIGFjY2Vzc19ibWFwKQoreworCXJldHVybiB0ZXN0X2JpdChORlM0X1NIQVJFX0FDQ0VTU19SRUFELCAmYWNjZXNzX2JtYXApIHx8CisJCXRlc3RfYml0KE5GUzRfU0hBUkVfQUNDRVNTX0JPVEgsICZhY2Nlc3NfYm1hcCkgfHwKKwkJdGVzdF9iaXQoTkZTNF9TSEFSRV9BQ0NFU1NfV1JJVEUsICZhY2Nlc3NfYm1hcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CithY2Nlc3NfcGVybWl0X3dyaXRlKHVuc2lnbmVkIGxvbmcgYWNjZXNzX2JtYXApCit7CisJcmV0dXJuIHRlc3RfYml0KE5GUzRfU0hBUkVfQUNDRVNTX1dSSVRFLCAmYWNjZXNzX2JtYXApIHx8CisJCXRlc3RfYml0KE5GUzRfU0hBUkVfQUNDRVNTX0JPVEgsICZhY2Nlc3NfYm1hcCk7Cit9CisKK3N0YXRpYworaW50IG5mczRfY2hlY2tfb3Blbm1vZGUoc3RydWN0IG5mczRfc3RhdGVpZCAqc3RwLCBpbnQgZmxhZ3MpCit7CisgICAgICAgIGludCBzdGF0dXMgPSBuZnNlcnJfb3Blbm1vZGU7CisKKwlpZiAoKGZsYWdzICYgV1JfU1RBVEUpICYmICghYWNjZXNzX3Blcm1pdF93cml0ZShzdHAtPnN0X2FjY2Vzc19ibWFwKSkpCisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisJaWYgKChmbGFncyAmIFJEX1NUQVRFKSAmJiAoIWFjY2Vzc19wZXJtaXRfcmVhZChzdHAtPnN0X2FjY2Vzc19ibWFwKSkpCisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisJc3RhdHVzID0gbmZzX29rOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CituZnM0X2NoZWNrX2RlbGVnbW9kZShzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICpkcCwgaW50IGZsYWdzKQoreworCWlmICgoZmxhZ3MgJiBXUl9TVEFURSkgJiYgKGRwLT5kbF90eXBlID09IE5GUzRfT1BFTl9ERUxFR0FURV9SRUFEKSkKKwkJcmV0dXJuIG5mc2Vycl9vcGVubW9kZTsKKwllbHNlCisJCXJldHVybiBuZnNfb2s7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitjaGVja19zcGVjaWFsX3N0YXRlaWRzKHN2Y19maCAqY3VycmVudF9maCwgc3RhdGVpZF90ICpzdGF0ZWlkLCBpbnQgZmxhZ3MpCit7CisJLyogVHJ5aW5nIHRvIGNhbGwgZGVsZWdyZXR1cm4gd2l0aCBhIHNwZWNpYWwgc3RhdGVpZD8gWXVjaDogKi8KKwlpZiAoIShmbGFncyAmIChSRF9TVEFURSB8IFdSX1NUQVRFKSkpCisJCXJldHVybiBuZnNlcnJfYmFkX3N0YXRlaWQ7CisJZWxzZSBpZiAoT05FX1NUQVRFSUQoc3RhdGVpZCkgJiYgKGZsYWdzICYgUkRfU1RBVEUpKQorCQlyZXR1cm4gbmZzX29rOworCWVsc2UgaWYgKG5mczRfaW5fZ3JhY2UoKSkgeworCQkvKiBBbnN3ZXIgaW4gcmVtYWluaW5nIGNhc2VzIGRlcGVuZHMgb24gZXhpc3RhbmNlIG9mCisJCSAqIGNvbmZsaWN0aW5nIHN0YXRlOyBzbyB3ZSBtdXN0IHdhaXQgb3V0IHRoZSBncmFjZSBwZXJpb2QuICovCisJCXJldHVybiBuZnNlcnJfZ3JhY2U7CisJfSBlbHNlIGlmIChmbGFncyAmIFdSX1NUQVRFKQorCQlyZXR1cm4gbmZzNF9zaGFyZV9jb25mbGljdChjdXJyZW50X2ZoLAorCQkJCU5GUzRfU0hBUkVfREVOWV9XUklURSk7CisJZWxzZSAvKiAoZmxhZ3MgJiBSRF9TVEFURSkgJiYgWkVST19TVEFURUlEKHN0YXRlaWQpICovCisJCXJldHVybiBuZnM0X3NoYXJlX2NvbmZsaWN0KGN1cnJlbnRfZmgsCisJCQkJTkZTNF9TSEFSRV9ERU5ZX1JFQUQpOworfQorCisvKgorICogQWxsb3cgUkVBRC9XUklURSBkdXJpbmcgZ3JhY2UgcGVyaW9kIG9uIHJlY292ZXJlZCBzdGF0ZSBvbmx5IGZvciBmaWxlcworICogdGhhdCBhcmUgbm90IGFibGUgdG8gcHJvdmlkZSBtYW5kYXRvcnkgbG9ja2luZy4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK2lvX2R1cmluZ19ncmFjZV9kaXNhbGxvd2VkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmbGFncykKK3sKKwlyZXR1cm4gbmZzNF9pbl9ncmFjZSgpICYmIChmbGFncyAmIChSRF9TVEFURSB8IFdSX1NUQVRFKSkKKwkJJiYgTUFOREFUT1JZX0xPQ0soaW5vZGUpOworfQorCisvKgorKiBDaGVja3MgZm9yIHN0YXRlaWQgb3BlcmF0aW9ucworKi8KK2ludAorbmZzNF9wcmVwcm9jZXNzX3N0YXRlaWRfb3Aoc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RhdGVpZF90ICpzdGF0ZWlkLCBpbnQgZmxhZ3MsIHN0cnVjdCBmaWxlICoqZmlscHApCit7CisJc3RydWN0IG5mczRfc3RhdGVpZCAqc3RwID0gTlVMTDsKKwlzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICpkcCA9IE5VTEw7CisJc3RhdGVpZF90ICpzdGlkcDsKKwlzdHJ1Y3QgaW5vZGUgKmlubyA9IGN1cnJlbnRfZmgtPmZoX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgc3RhdHVzOworCisJZHByaW50aygiTkZTRDogcHJlcHJvY2Vzc19zdGF0ZWlkX29wOiBzdGF0ZWlkID0gKCUwOHgvJTA4eC8lMDh4LyUwOHgpXG4iLAorCQlzdGF0ZWlkLT5zaV9ib290LCBzdGF0ZWlkLT5zaV9zdGF0ZW93bmVyaWQsIAorCQlzdGF0ZWlkLT5zaV9maWxlaWQsIHN0YXRlaWQtPnNpX2dlbmVyYXRpb24pOyAKKwlpZiAoZmlscHApCisJCSpmaWxwcCA9IE5VTEw7CisKKwlpZiAoaW9fZHVyaW5nX2dyYWNlX2Rpc2FsbG93ZWQoaW5vLCBmbGFncykpCisJCXJldHVybiBuZnNlcnJfZ3JhY2U7CisKKwlpZiAoWkVST19TVEFURUlEKHN0YXRlaWQpIHx8IE9ORV9TVEFURUlEKHN0YXRlaWQpKQorCQlyZXR1cm4gY2hlY2tfc3BlY2lhbF9zdGF0ZWlkcyhjdXJyZW50X2ZoLCBzdGF0ZWlkLCBmbGFncyk7CisKKwkvKiBTVEFMRSBTVEFURUlEICovCisJc3RhdHVzID0gbmZzZXJyX3N0YWxlX3N0YXRlaWQ7CisJaWYgKFNUQUxFX1NUQVRFSUQoc3RhdGVpZCkpIAorCQlnb3RvIG91dDsKKworCS8qIEJBRCBTVEFURUlEICovCisJc3RhdHVzID0gbmZzZXJyX2JhZF9zdGF0ZWlkOworCWlmICghc3RhdGVpZC0+c2lfZmlsZWlkKSB7IC8qIGRlbGVnYXRpb24gc3RhdGVpZCAqLworCQlpZighKGRwID0gZmluZF9kZWxlZ2F0aW9uX3N0YXRlaWQoaW5vLCBzdGF0ZWlkKSkpIHsKKwkJCWRwcmludGsoIk5GU0Q6IGRlbGVnYXRpb24gc3RhdGVpZCBub3QgZm91bmRcbiIpOworCQkJaWYgKG5mczRfaW5fZ3JhY2UoKSkKKwkJCQlzdGF0dXMgPSBuZnNlcnJfZ3JhY2U7CisJCQlnb3RvIG91dDsKKwkJfQorCQlzdGlkcCA9ICZkcC0+ZGxfc3RhdGVpZDsKKwl9IGVsc2UgeyAvKiBvcGVuIG9yIGxvY2sgc3RhdGVpZCAqLworCQlpZiAoIShzdHAgPSBmaW5kX3N0YXRlaWQoc3RhdGVpZCwgZmxhZ3MpKSkgeworCQkJZHByaW50aygiTkZTRDogb3BlbiBvciBsb2NrIHN0YXRlaWQgbm90IGZvdW5kXG4iKTsKKwkJCWlmIChuZnM0X2luX2dyYWNlKCkpCisJCQkJc3RhdHVzID0gbmZzZXJyX2dyYWNlOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKChmbGFncyAmIENIRUNLX0ZIKSAmJiBuZnM0X2NoZWNrX2ZoKGN1cnJlbnRfZmgsIHN0cCkpCisJCQlnb3RvIG91dDsKKwkJaWYgKCFzdHAtPnN0X3N0YXRlb3duZXItPnNvX2NvbmZpcm1lZCkKKwkJCWdvdG8gb3V0OworCQlzdGlkcCA9ICZzdHAtPnN0X3N0YXRlaWQ7CisJfQorCWlmIChzdGF0ZWlkLT5zaV9nZW5lcmF0aW9uID4gc3RpZHAtPnNpX2dlbmVyYXRpb24pCisJCWdvdG8gb3V0OworCisJLyogT0xEIFNUQVRFSUQgKi8KKwlzdGF0dXMgPSBuZnNlcnJfb2xkX3N0YXRlaWQ7CisJaWYgKHN0YXRlaWQtPnNpX2dlbmVyYXRpb24gPCBzdGlkcC0+c2lfZ2VuZXJhdGlvbikKKwkJZ290byBvdXQ7CisJaWYgKHN0cCkgeworCQlpZiAoKHN0YXR1cyA9IG5mczRfY2hlY2tfb3Blbm1vZGUoc3RwLGZsYWdzKSkpCisJCQlnb3RvIG91dDsKKwkJcmVuZXdfY2xpZW50KHN0cC0+c3Rfc3RhdGVvd25lci0+c29fY2xpZW50KTsKKwkJaWYgKGZpbHBwKQorCQkJKmZpbHBwID0gc3RwLT5zdF92ZnNfZmlsZTsKKwl9IGVsc2UgaWYgKGRwKSB7CisJCWlmICgoc3RhdHVzID0gbmZzNF9jaGVja19kZWxlZ21vZGUoZHAsIGZsYWdzKSkpCisJCQlnb3RvIG91dDsKKwkJcmVuZXdfY2xpZW50KGRwLT5kbF9jbGllbnQpOworCQlpZiAoZmxhZ3MgJiBERUxFR19SRVQpCisJCQl1bmhhc2hfZGVsZWdhdGlvbihkcCk7CisJCWlmIChmaWxwcCkKKwkJCSpmaWxwcCA9IGRwLT5kbF92ZnNfZmlsZTsKKwl9CisJc3RhdHVzID0gbmZzX29rOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKworLyogCisgKiBDaGVja3MgZm9yIHNlcXVlbmNlIGlkIG11dGF0aW5nIG9wZXJhdGlvbnMuIAorICovCitpbnQKK25mczRfcHJlcHJvY2Vzc19zZXFpZF9vcChzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCB1MzIgc2VxaWQsIHN0YXRlaWRfdCAqc3RhdGVpZCwgaW50IGZsYWdzLCBzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICoqc29wcCwgc3RydWN0IG5mczRfc3RhdGVpZCAqKnN0cHAsIGNsaWVudGlkX3QgKmxvY2tjbGlkKQoreworCWludCBzdGF0dXM7CisJc3RydWN0IG5mczRfc3RhdGVpZCAqc3RwOworCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKnNvcDsKKworCWRwcmludGsoIk5GU0Q6IHByZXByb2Nlc3Nfc2VxaWRfb3A6IHNlcWlkPSVkICIgCisJCQkic3RhdGVpZCA9ICglMDh4LyUwOHgvJTA4eC8lMDh4KVxuIiwgc2VxaWQsCisJCXN0YXRlaWQtPnNpX2Jvb3QsIHN0YXRlaWQtPnNpX3N0YXRlb3duZXJpZCwgc3RhdGVpZC0+c2lfZmlsZWlkLAorCQlzdGF0ZWlkLT5zaV9nZW5lcmF0aW9uKTsKKwkJCSAgICAgICAgCisJKnN0cHAgPSBOVUxMOworCSpzb3BwID0gTlVMTDsKKworCXN0YXR1cyA9IG5mc2Vycl9iYWRfc3RhdGVpZDsKKwlpZiAoWkVST19TVEFURUlEKHN0YXRlaWQpIHx8IE9ORV9TVEFURUlEKHN0YXRlaWQpKSB7CisJCXByaW50aygiTkZTRDogcHJlcHJvY2Vzc19zZXFpZF9vcDogbWFnaWMgc3RhdGVpZCFcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlzdGF0dXMgPSBuZnNlcnJfc3RhbGVfc3RhdGVpZDsKKwlpZiAoU1RBTEVfU1RBVEVJRChzdGF0ZWlkKSkKKwkJZ290byBvdXQ7CisJLyoKKwkqIFdlIHJldHVybiBCQURfU1RBVEVJRCBpZiBmaWxlaGFuZGxlIGRvZXNuJ3QgbWF0Y2ggc3RhdGVpZCwgCisJKiB0aGUgY29uZmlybWVkIGZsYWcgaXMgaW5jb3JyZWNseSBzZXQsIG9yIHRoZSBnZW5lcmF0aW9uIAorCSogbnVtYmVyIGlzIGluY29ycmVjdC4gIAorCSogSWYgdGhlcmUgaXMgbm8gZW50cnkgaW4gdGhlIG9wZW5maWxlIHRhYmxlIGZvciB0aGlzIGlkLCAKKwkqIHdlIGNhbid0IGFsd2F5cyByZXR1cm4gQkFEX1NUQVRFSUQ7CisJKiB0aGlzIG1pZ2h0IGJlIGEgcmV0cmFuc21pdHRlZCBDTE9TRSB3aGljaCBoYXMgYXJyaXZlZCBhZnRlciAKKwkqIHRoZSBvcGVuZmlsZSBoYXMgYmVlbiByZWxlYXNlZC4KKwkqLworCWlmICghKHN0cCA9IGZpbmRfc3RhdGVpZChzdGF0ZWlkLCBmbGFncykpKQorCQlnb3RvIG5vX25mczRfc3RhdGVpZDsKKworCXN0YXR1cyA9IG5mc2Vycl9iYWRfc3RhdGVpZDsKKworCS8qIGZvciBuZXcgbG9jayBzdGF0ZW93bmVyczoKKwkgKiBjaGVjayB0aGF0IHRoZSBsb2NrLT52Lm5ldy5vcGVuX3N0YXRlaWQKKwkgKiByZWZlcnMgdG8gYW4gb3BlbiBzdGF0ZW93bmVyCisJICoKKwkgKiBjaGVjayB0aGF0IHRoZSBsb2NrY2xpZCAobmZzNF9sb2NrLT52Lm5ldy5jbGllbnRpZCkgaXMgdGhlIHNhbWUKKwkgKiBhcyB0aGUgb3Blbl9zdGF0ZWlkLT5zdF9zdGF0ZW93bmVyLT5zb19jbGllbnQtPmNsaWVudGlkCisJICovCisJaWYgKGxvY2tjbGlkKSB7CisJCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKnNvcCA9IHN0cC0+c3Rfc3RhdGVvd25lcjsKKwkJc3RydWN0IG5mczRfY2xpZW50ICpjbHAgPSBzb3AtPnNvX2NsaWVudDsKKworCQlpZiAoIXNvcC0+c29faXNfb3Blbl9vd25lcikKKwkJCWdvdG8gb3V0OworCQlpZiAoIWNtcF9jbGlkKCZjbHAtPmNsX2NsaWVudGlkLCBsb2NrY2xpZCkpCisJCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoKGZsYWdzICYgQ0hFQ0tfRkgpICYmIG5mczRfY2hlY2tfZmgoY3VycmVudF9maCwgc3RwKSkgeworCQlwcmludGsoIk5GU0Q6IHByZXByb2Nlc3Nfc2VxaWRfb3A6IGZoLXN0YXRlaWQgbWlzbWF0Y2ghXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJKnN0cHAgPSBzdHA7CisJKnNvcHAgPSBzb3AgPSBzdHAtPnN0X3N0YXRlb3duZXI7CisKKwkvKgorCSogIFdlIG5vdyB2YWxpZGF0ZSB0aGUgc2VxaWQgYW5kIHN0YXRlaWQgZ2VuZXJhdGlvbiBudW1iZXJzLgorCSogIEZvciB0aGUgbW9tZW50LCB3ZSBpZ25vcmUgdGhlIHBvc3NpYmlsaXR5IG9mIAorCSogIGdlbmVyYXRpb24gbnVtYmVyIHdyYXBhcm91bmQuCisJKi8KKwlpZiAoc2VxaWQgIT0gc29wLT5zb19zZXFpZCArIDEpCisJCWdvdG8gY2hlY2tfcmVwbGF5OworCisJaWYgKHNvcC0+c29fY29uZmlybWVkKSB7CisJCWlmIChmbGFncyAmIENPTkZJUk0pIHsKKwkJCXByaW50aygiTkZTRDogcHJlcHJvY2Vzc19zZXFpZF9vcDogZXhwZWN0ZWQgdW5jb25maXJtZWQgc3RhdGVvd25lciFcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJZWxzZSB7CisJCWlmICghKGZsYWdzICYgQ09ORklSTSkpIHsKKwkJCXByaW50aygiTkZTRDogcHJlcHJvY2Vzc19zZXFpZF9vcDogc3RhdGVvd25lciBub3QgY29uZmlybWVkIHlldCFcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJaWYgKHN0YXRlaWQtPnNpX2dlbmVyYXRpb24gPiBzdHAtPnN0X3N0YXRlaWQuc2lfZ2VuZXJhdGlvbikgeworCQlwcmludGsoIk5GU0Q6IHByZXByb2Nlc3Nfc2VxaWRfb3A6IGZ1dHVyZSBzdGF0ZWlkPyFcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlzdGF0dXMgPSBuZnNlcnJfb2xkX3N0YXRlaWQ7CisJaWYgKHN0YXRlaWQtPnNpX2dlbmVyYXRpb24gPCBzdHAtPnN0X3N0YXRlaWQuc2lfZ2VuZXJhdGlvbikgeworCQlwcmludGsoIk5GU0Q6IHByZXByb2Nlc3Nfc2VxaWRfb3A6IG9sZCBzdGF0ZWlkIVxuIik7CisJCWdvdG8gb3V0OworCX0KKwkvKiBYWFggcmVuZXcgdGhlIGNsaWVudCBsZWFzZSBoZXJlICovCisJc3RhdHVzID0gbmZzX29rOworCitvdXQ6CisJcmV0dXJuIHN0YXR1czsKKworbm9fbmZzNF9zdGF0ZWlkOgorCisJLyoKKwkqIFdlIGRldGVybWluZSB3aGV0aGVyIHRoaXMgaXMgYSBiYWQgc3RhdGVpZCBvciBhIHJlcGxheSwgCisJKiBzdGFydGluZyBieSB0cnlpbmcgdG8gbG9vayB1cCB0aGUgc3RhdGVvd25lci4KKwkqIElmIHN0YXRlb3duZXIgaXMgbm90IGZvdW5kIC0gc3RhdGVpZCBpcyBiYWQuCisJKi8KKwlpZiAoIShzb3AgPSBmaW5kX29wZW5zdGF0ZW93bmVyX2lkKHN0YXRlaWQtPnNpX3N0YXRlb3duZXJpZCwgZmxhZ3MpKSkgeworCQlwcmludGsoIk5GU0Q6IHByZXByb2Nlc3Nfc2VxaWRfb3A6IG5vIHN0YXRlb3duZXIgb3IgbmZzNF9zdGF0ZWlkIVxuIik7CisJCXN0YXR1cyA9IG5mc2Vycl9iYWRfc3RhdGVpZDsKKwkJZ290byBvdXQ7CisJfQorCSpzb3BwID0gc29wOworCitjaGVja19yZXBsYXk6CisJaWYgKHNlcWlkID09IHNvcC0+c29fc2VxaWQpIHsKKwkJcHJpbnRrKCJORlNEOiBwcmVwcm9jZXNzX3NlcWlkX29wOiByZXRyYW5zbWlzc2lvbj9cbiIpOworCQkvKiBpbmRpY2F0ZSByZXBsYXkgdG8gY2FsbGluZyBmdW5jdGlvbiAqLworCQlzdGF0dXMgPSBORlNFUlJfUkVQTEFZX01FOworCX0gZWxzZSAgeworCQlwcmludGsoIk5GU0Q6IHByZXByb2Nlc3Nfc2VxaWRfb3A6IGJhZCBzZXFpZCAoZXhwZWN0ZWQgJWQsIGdvdCAlZFxuIiwgc29wLT5zb19zZXFpZCArMSwgc2VxaWQpOworCisJCSpzb3BwID0gTlVMTDsKKwkJc3RhdHVzID0gbmZzZXJyX2JhZF9zZXFpZDsKKwl9CisJZ290byBvdXQ7Cit9CisKK2ludAorbmZzZDRfb3Blbl9jb25maXJtKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9vcGVuX2NvbmZpcm0gKm9jKQoreworCWludCBzdGF0dXM7CisJc3RydWN0IG5mczRfc3RhdGVvd25lciAqc29wOworCXN0cnVjdCBuZnM0X3N0YXRlaWQgKnN0cDsKKworCWRwcmludGsoIk5GU0Q6IG5mc2Q0X29wZW5fY29uZmlybSBvbiBmaWxlICUuKnNcbiIsCisJCQkoaW50KWN1cnJlbnRfZmgtPmZoX2RlbnRyeS0+ZF9uYW1lLmxlbiwKKwkJCWN1cnJlbnRfZmgtPmZoX2RlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJaWYgKChzdGF0dXMgPSBmaF92ZXJpZnkocnFzdHAsIGN1cnJlbnRfZmgsIFNfSUZSRUcsIDApKSkKKwkJZ290byBvdXQ7CisKKwluZnM0X2xvY2tfc3RhdGUoKTsKKworCWlmICgoc3RhdHVzID0gbmZzNF9wcmVwcm9jZXNzX3NlcWlkX29wKGN1cnJlbnRfZmgsIG9jLT5vY19zZXFpZCwKKwkJCQkJJm9jLT5vY19yZXFfc3RhdGVpZCwKKwkJCQkJQ0hFQ0tfRkggfCBDT05GSVJNIHwgT1BFTl9TVEFURSwKKwkJCQkJJm9jLT5vY19zdGF0ZW93bmVyLCAmc3RwLCBOVUxMKSkpCisJCWdvdG8gb3V0OyAKKworCXNvcCA9IG9jLT5vY19zdGF0ZW93bmVyOworCXNvcC0+c29fY29uZmlybWVkID0gMTsKKwl1cGRhdGVfc3RhdGVpZCgmc3RwLT5zdF9zdGF0ZWlkKTsKKwltZW1jcHkoJm9jLT5vY19yZXNwX3N0YXRlaWQsICZzdHAtPnN0X3N0YXRlaWQsIHNpemVvZihzdGF0ZWlkX3QpKTsKKwlkcHJpbnRrKCJORlNEOiBuZnNkNF9vcGVuX2NvbmZpcm06IHN1Y2Nlc3MsIHNlcWlkPSVkICIgCisJCSJzdGF0ZWlkPSglMDh4LyUwOHgvJTA4eC8lMDh4KVxuIiwgb2MtPm9jX3NlcWlkLAorCQkgICAgICAgICBzdHAtPnN0X3N0YXRlaWQuc2lfYm9vdCwKKwkJICAgICAgICAgc3RwLT5zdF9zdGF0ZWlkLnNpX3N0YXRlb3duZXJpZCwKKwkJICAgICAgICAgc3RwLT5zdF9zdGF0ZWlkLnNpX2ZpbGVpZCwKKwkJICAgICAgICAgc3RwLT5zdF9zdGF0ZWlkLnNpX2dlbmVyYXRpb24pOworb3V0OgorCWlmIChvYy0+b2Nfc3RhdGVvd25lcikKKwkJbmZzNF9nZXRfc3RhdGVvd25lcihvYy0+b2Nfc3RhdGVvd25lcik7CisJbmZzNF91bmxvY2tfc3RhdGUoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisKKy8qCisgKiB1bnNldCBhbGwgYml0cyBpbiB1bmlvbiBiaXRtYXAgKGJtYXApIHRoYXQKKyAqIGRvIG5vdCBleGlzdCBpbiBzaGFyZSAoZnJvbSBzdWNjZXNzZnVsIE9QRU5fRE9XTkdSQURFKQorICovCitzdGF0aWMgdm9pZAorcmVzZXRfdW5pb25fYm1hcF9hY2Nlc3ModW5zaWduZWQgbG9uZyBhY2Nlc3MsIHVuc2lnbmVkIGxvbmcgKmJtYXApCit7CisJaW50IGk7CisJZm9yIChpID0gMTsgaSA8IDQ7IGkrKykgeworCQlpZiAoKGkgJiBhY2Nlc3MpICE9IGkpCisJCQlfX2NsZWFyX2JpdChpLCBibWFwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCityZXNldF91bmlvbl9ibWFwX2RlbnkodW5zaWduZWQgbG9uZyBkZW55LCB1bnNpZ25lZCBsb25nICpibWFwKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJaWYgKChpICYgZGVueSkgIT0gaSkKKwkJCV9fY2xlYXJfYml0KGksIGJtYXApOworCX0KK30KKworaW50CituZnNkNF9vcGVuX2Rvd25ncmFkZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfb3Blbl9kb3duZ3JhZGUgKm9kKQoreworCWludCBzdGF0dXM7CisJc3RydWN0IG5mczRfc3RhdGVpZCAqc3RwOworCXVuc2lnbmVkIGludCBzaGFyZV9hY2Nlc3M7CisKKwlkcHJpbnRrKCJORlNEOiBuZnNkNF9vcGVuX2Rvd25ncmFkZSBvbiBmaWxlICUuKnNcbiIsIAorCQkJKGludCljdXJyZW50X2ZoLT5maF9kZW50cnktPmRfbmFtZS5sZW4sCisJCQljdXJyZW50X2ZoLT5maF9kZW50cnktPmRfbmFtZS5uYW1lKTsKKworCWlmICghVEVTVF9BQ0NFU1Mob2QtPm9kX3NoYXJlX2FjY2VzcykgfHwgIVRFU1RfREVOWShvZC0+b2Rfc2hhcmVfZGVueSkpCisJCXJldHVybiBuZnNlcnJfaW52YWw7CisKKwluZnM0X2xvY2tfc3RhdGUoKTsKKwlpZiAoKHN0YXR1cyA9IG5mczRfcHJlcHJvY2Vzc19zZXFpZF9vcChjdXJyZW50X2ZoLCBvZC0+b2Rfc2VxaWQsIAorCQkJCQkmb2QtPm9kX3N0YXRlaWQsIAorCQkJCQlDSEVDS19GSCB8IE9QRU5fU1RBVEUsIAorCQkJCQkmb2QtPm9kX3N0YXRlb3duZXIsICZzdHAsIE5VTEwpKSkKKwkJZ290byBvdXQ7IAorCisJc3RhdHVzID0gbmZzZXJyX2ludmFsOworCWlmICghdGVzdF9iaXQob2QtPm9kX3NoYXJlX2FjY2VzcywgJnN0cC0+c3RfYWNjZXNzX2JtYXApKSB7CisJCWRwcmludGsoIk5GU0Q6YWNjZXNzIG5vdCBhIHN1YnNldCBjdXJyZW50IGJpdG1hcDogMHglbHgsIGlucHV0IGFjY2Vzcz0lMDh4XG4iLAorCQkJc3RwLT5zdF9hY2Nlc3NfYm1hcCwgb2QtPm9kX3NoYXJlX2FjY2Vzcyk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoIXRlc3RfYml0KG9kLT5vZF9zaGFyZV9kZW55LCAmc3RwLT5zdF9kZW55X2JtYXApKSB7CisJCWRwcmludGsoIk5GU0Q6ZGVueSBub3QgYSBzdWJzZXQgY3VycmVudCBiaXRtYXA6IDB4JWx4LCBpbnB1dCBkZW55PSUwOHhcbiIsCisJCQlzdHAtPnN0X2RlbnlfYm1hcCwgb2QtPm9kX3NoYXJlX2RlbnkpOworCQlnb3RvIG91dDsKKwl9CisJc2V0X2FjY2Vzcygmc2hhcmVfYWNjZXNzLCBzdHAtPnN0X2FjY2Vzc19ibWFwKTsKKwluZnM0X2ZpbGVfZG93bmdyYWRlKHN0cC0+c3RfdmZzX2ZpbGUsCisJICAgICAgICAgICAgICAgICAgICBzaGFyZV9hY2Nlc3MgJiB+b2QtPm9kX3NoYXJlX2FjY2Vzcyk7CisKKwlyZXNldF91bmlvbl9ibWFwX2FjY2VzcyhvZC0+b2Rfc2hhcmVfYWNjZXNzLCAmc3RwLT5zdF9hY2Nlc3NfYm1hcCk7CisJcmVzZXRfdW5pb25fYm1hcF9kZW55KG9kLT5vZF9zaGFyZV9kZW55LCAmc3RwLT5zdF9kZW55X2JtYXApOworCisJdXBkYXRlX3N0YXRlaWQoJnN0cC0+c3Rfc3RhdGVpZCk7CisJbWVtY3B5KCZvZC0+b2Rfc3RhdGVpZCwgJnN0cC0+c3Rfc3RhdGVpZCwgc2l6ZW9mKHN0YXRlaWRfdCkpOworCXN0YXR1cyA9IG5mc19vazsKK291dDoKKwlpZiAob2QtPm9kX3N0YXRlb3duZXIpCisJCW5mczRfZ2V0X3N0YXRlb3duZXIob2QtPm9kX3N0YXRlb3duZXIpOworCW5mczRfdW5sb2NrX3N0YXRlKCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKKyAqIG5mczRfdW5sb2NrX3N0YXRlKCkgY2FsbGVkIGFmdGVyIGVuY29kZQorICovCitpbnQKK25mc2Q0X2Nsb3NlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmN1cnJlbnRfZmgsIHN0cnVjdCBuZnNkNF9jbG9zZSAqY2xvc2UpCit7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpzdHA7CisKKwlkcHJpbnRrKCJORlNEOiBuZnNkNF9jbG9zZSBvbiBmaWxlICUuKnNcbiIsIAorCQkJKGludCljdXJyZW50X2ZoLT5maF9kZW50cnktPmRfbmFtZS5sZW4sCisJCQljdXJyZW50X2ZoLT5maF9kZW50cnktPmRfbmFtZS5uYW1lKTsKKworCW5mczRfbG9ja19zdGF0ZSgpOworCS8qIGNoZWNrIGNsb3NlX2xydSBmb3IgcmVwbGF5ICovCisJaWYgKChzdGF0dXMgPSBuZnM0X3ByZXByb2Nlc3Nfc2VxaWRfb3AoY3VycmVudF9maCwgY2xvc2UtPmNsX3NlcWlkLCAKKwkJCQkJJmNsb3NlLT5jbF9zdGF0ZWlkLCAKKwkJCQkJQ0hFQ0tfRkggfCBPUEVOX1NUQVRFIHwgQ0xPU0VfU1RBVEUsCisJCQkJCSZjbG9zZS0+Y2xfc3RhdGVvd25lciwgJnN0cCwgTlVMTCkpKQorCQlnb3RvIG91dDsgCisJLyoKKwkqICBSZXR1cm4gc3VjY2VzcywgYnV0IGZpcnN0IHVwZGF0ZSB0aGUgc3RhdGVpZC4KKwkqLworCXN0YXR1cyA9IG5mc19vazsKKwl1cGRhdGVfc3RhdGVpZCgmc3RwLT5zdF9zdGF0ZWlkKTsKKwltZW1jcHkoJmNsb3NlLT5jbF9zdGF0ZWlkLCAmc3RwLT5zdF9zdGF0ZWlkLCBzaXplb2Yoc3RhdGVpZF90KSk7CisKKwkvKiByZWxlYXNlX3N0YXRlX293bmVyKCkgY2FsbHMgbmZzZF9jbG9zZSgpIGlmIG5lZWRlZCAqLworCXJlbGVhc2Vfc3RhdGVfb3duZXIoc3RwLCBPUEVOX1NUQVRFKTsKK291dDoKKwlpZiAoY2xvc2UtPmNsX3N0YXRlb3duZXIpCisJCW5mczRfZ2V0X3N0YXRlb3duZXIoY2xvc2UtPmNsX3N0YXRlb3duZXIpOworCW5mczRfdW5sb2NrX3N0YXRlKCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworaW50CituZnNkNF9kZWxlZ3JldHVybihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfZGVsZWdyZXR1cm4gKmRyKQoreworCWludCBzdGF0dXM7CisKKwlpZiAoKHN0YXR1cyA9IGZoX3ZlcmlmeShycXN0cCwgY3VycmVudF9maCwgU19JRlJFRywgMCkpKQorCQlnb3RvIG91dDsKKworCW5mczRfbG9ja19zdGF0ZSgpOworCXN0YXR1cyA9IG5mczRfcHJlcHJvY2Vzc19zdGF0ZWlkX29wKGN1cnJlbnRfZmgsICZkci0+ZHJfc3RhdGVpZCwgREVMRUdfUkVULCBOVUxMKTsKKwluZnM0X3VubG9ja19zdGF0ZSgpOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKworLyogCisgKiBMb2NrIG93bmVyIHN0YXRlIChieXRlLXJhbmdlIGxvY2tzKQorICovCisjZGVmaW5lIExPRkZfT1ZFUkZMT1coc3RhcnQsIGxlbikgICAgICAoKHU2NCkobGVuKSA+IH4odTY0KShzdGFydCkpCisjZGVmaW5lIExPQ0tfSEFTSF9CSVRTICAgICAgICAgICAgICA4CisjZGVmaW5lIExPQ0tfSEFTSF9TSVpFICAgICAgICAgICAgICgxIDw8IExPQ0tfSEFTSF9CSVRTKQorI2RlZmluZSBMT0NLX0hBU0hfTUFTSyAgICAgICAgICAgICAoTE9DS19IQVNIX1NJWkUgLSAxKQorCisjZGVmaW5lIGxvY2tvd25lcmlkX2hhc2h2YWwoaWQpIFwKKyAgICAgICAgKChpZCkgJiBMT0NLX0hBU0hfTUFTSykKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKK2xvY2tfb3duZXJzdHJfaGFzaHZhbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1MzIgY2xfaWQsCisJCXN0cnVjdCB4ZHJfbmV0b2JqICpvd25lcm5hbWUpCit7CisJcmV0dXJuIChmaWxlX2hhc2h2YWwoaW5vZGUpICsgY2xfaWQKKwkJCSsgb3BhcXVlX2hhc2h2YWwob3duZXJuYW1lLT5kYXRhLCBvd25lcm5hbWUtPmxlbikpCisJCSYgTE9DS19IQVNIX01BU0s7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIGxvY2tfb3duZXJpZF9oYXNodGJsW0xPQ0tfSEFTSF9TSVpFXTsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkCWxvY2tfb3duZXJzdHJfaGFzaHRibFtMT0NLX0hBU0hfU0laRV07CitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBsb2Nrc3RhdGVpZF9oYXNodGJsW1NUQVRFSURfSEFTSF9TSVpFXTsKKworc3RydWN0IG5mczRfc3RhdGVpZCAqCitmaW5kX3N0YXRlaWQoc3RhdGVpZF90ICpzdGlkLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IG5mczRfc3RhdGVpZCAqbG9jYWwgPSBOVUxMOworCXUzMiBzdF9pZCA9IHN0aWQtPnNpX3N0YXRlb3duZXJpZDsKKwl1MzIgZl9pZCA9IHN0aWQtPnNpX2ZpbGVpZDsKKwl1bnNpZ25lZCBpbnQgaGFzaHZhbDsKKworCWRwcmludGsoIk5GU0Q6IGZpbmRfc3RhdGVpZCBmbGFncyAweCV4XG4iLGZsYWdzKTsKKwlpZiAoKGZsYWdzICYgTE9DS19TVEFURSkgfHwgKGZsYWdzICYgUkRfU1RBVEUpIHx8IChmbGFncyAmIFdSX1NUQVRFKSkgeworCQloYXNodmFsID0gc3RhdGVpZF9oYXNodmFsKHN0X2lkLCBmX2lkKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShsb2NhbCwgJmxvY2tzdGF0ZWlkX2hhc2h0YmxbaGFzaHZhbF0sIHN0X2hhc2gpIHsKKwkJCWlmICgobG9jYWwtPnN0X3N0YXRlaWQuc2lfc3RhdGVvd25lcmlkID09IHN0X2lkKSAmJgorCQkJICAgIChsb2NhbC0+c3Rfc3RhdGVpZC5zaV9maWxlaWQgPT0gZl9pZCkpCisJCQkJcmV0dXJuIGxvY2FsOworCQl9CisJfSAKKwlpZiAoKGZsYWdzICYgT1BFTl9TVEFURSkgfHwgKGZsYWdzICYgUkRfU1RBVEUpIHx8IChmbGFncyAmIFdSX1NUQVRFKSkgeworCQloYXNodmFsID0gc3RhdGVpZF9oYXNodmFsKHN0X2lkLCBmX2lkKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShsb2NhbCwgJnN0YXRlaWRfaGFzaHRibFtoYXNodmFsXSwgc3RfaGFzaCkgeworCQkJaWYgKChsb2NhbC0+c3Rfc3RhdGVpZC5zaV9zdGF0ZW93bmVyaWQgPT0gc3RfaWQpICYmCisJCQkgICAgKGxvY2FsLT5zdF9zdGF0ZWlkLnNpX2ZpbGVpZCA9PSBmX2lkKSkKKwkJCQlyZXR1cm4gbG9jYWw7CisJCX0KKwl9IGVsc2UKKwkJcHJpbnRrKCJORlNEOiBmaW5kX3N0YXRlaWQ6IEVSUk9SOiBubyBzdGF0ZSBmbGFnXG4iKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBuZnM0X2RlbGVnYXRpb24gKgorZmluZF9kZWxlZ2F0aW9uX3N0YXRlaWQoc3RydWN0IGlub2RlICppbm8sIHN0YXRlaWRfdCAqc3RpZCkKK3sKKwlzdHJ1Y3QgbmZzNF9kZWxlZ2F0aW9uICpkcCA9IE5VTEw7CisJc3RydWN0IG5mczRfZmlsZSAqZnAgPSBOVUxMOworCXUzMiBzdF9pZDsKKworCWRwcmludGsoIk5GU0Q6ZmluZF9kZWxlZ2F0aW9uX3N0YXRlaWQgc3RhdGVpZD0oJTA4eC8lMDh4LyUwOHgvJTA4eClcbiIsCisgICAgICAgICAgICAgICAgICAgIHN0aWQtPnNpX2Jvb3QsIHN0aWQtPnNpX3N0YXRlb3duZXJpZCwKKyAgICAgICAgICAgICAgICAgICAgc3RpZC0+c2lfZmlsZWlkLCBzdGlkLT5zaV9nZW5lcmF0aW9uKTsKKworCXN0X2lkID0gc3RpZC0+c2lfc3RhdGVvd25lcmlkOworCWZwID0gZmluZF9maWxlKGlubyk7CisJaWYgKGZwKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZHAsICZmcC0+ZmlfZGVsX3BlcmZpbGUsIGRsX2RlbF9wZXJmaWxlKSB7CisJCQlpZihkcC0+ZGxfc3RhdGVpZC5zaV9zdGF0ZW93bmVyaWQgPT0gc3RfaWQpIHsKKwkJCQlkcHJpbnRrKCJORlNEOiBmaW5kX2RlbGVnYXRpb24gZHAgJXBcbiIsZHApOworCQkJCXJldHVybiBkcDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIFRPRE86IExpbnV4IGZpbGUgb2Zmc2V0cyBhcmUgX3NpZ25lZF8gNjQtYml0IHF1YW50aXRpZXMsIHdoaWNoIG1lYW5zIHRoYXQKKyAqIHdlIGNhbid0IHByb3Blcmx5IGhhbmRsZSBsb2NrIHJlcXVlc3RzIHRoYXQgZ28gYmV5b25kIHRoZSAoMl42MyAtIDEpLXRoCisgKiBieXRlLCBiZWNhdXNlIG9mIHNpZ24gZXh0ZW5zaW9uIHByb2JsZW1zLiAgU2luY2UgTkZTdjQgY2FsbHMgZm9yIDY0LWJpdAorICogbG9ja2luZywgdGhpcyBwcmV2ZW50cyB1cyBmcm9tIGJlaW5nIGNvbXBsZXRlbHkgcHJvdG9jb2wtY29tcGxpYW50LiAgVGhlCisgKiByZWFsIHNvbHV0aW9uIHRvIHRoaXMgcHJvYmxlbSBpcyB0byBzdGFydCB1c2luZyB1bnNpZ25lZCBmaWxlIG9mZnNldHMgaW4KKyAqIHRoZSBWRlMsIGJ1dCB0aGlzIGlzIGEgdmVyeSBkZWVwIGNoYW5nZSEKKyAqLworc3RhdGljIGlubGluZSB2b2lkCituZnM0X3RyYW5zZm9ybV9sb2NrX29mZnNldChzdHJ1Y3QgZmlsZV9sb2NrICpsb2NrKQoreworCWlmIChsb2NrLT5mbF9zdGFydCA8IDApCisJCWxvY2stPmZsX3N0YXJ0ID0gT0ZGU0VUX01BWDsKKwlpZiAobG9jay0+ZmxfZW5kIDwgMCkKKwkJbG9jay0+ZmxfZW5kID0gT0ZGU0VUX01BWDsKK30KKworaW50CituZnM0X3ZlcmlmeV9sb2NrX3N0YXRlb3duZXIoc3RydWN0IG5mczRfc3RhdGVvd25lciAqc29wLCB1bnNpZ25lZCBpbnQgaGFzaHZhbCkKK3sKKwlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpsb2NhbCA9IE5VTEw7CisJaW50IHN0YXR1cyA9IDA7CisJCQkgICAgICAgIAorCWlmIChoYXNodmFsID49IExPQ0tfSEFTSF9TSVpFKQorCQlnb3RvIG91dDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvY2FsLCAmbG9ja19vd25lcmlkX2hhc2h0YmxbaGFzaHZhbF0sIHNvX2lkaGFzaCkgeworCQlpZiAobG9jYWwgPT0gc29wKSB7CisJCQlzdGF0dXMgPSAxOworCQkJZ290byBvdXQ7CisJCX0KKwl9CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQKK25mczRfc2V0X2xvY2tfZGVuaWVkKHN0cnVjdCBmaWxlX2xvY2sgKmZsLCBzdHJ1Y3QgbmZzZDRfbG9ja19kZW5pZWQgKmRlbnkpCit7CisJc3RydWN0IG5mczRfc3RhdGVvd25lciAqc29wID0gKHN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKikgZmwtPmZsX293bmVyOworCXVuc2lnbmVkIGludCBodmFsID0gbG9ja293bmVyaWRfaGFzaHZhbChzb3AtPnNvX2lkKTsKKworCWRlbnktPmxkX3NvcCA9IE5VTEw7CisJaWYgKG5mczRfdmVyaWZ5X2xvY2tfc3RhdGVvd25lcihzb3AsIGh2YWwpKSB7CisJCWtyZWZfZ2V0KCZzb3AtPnNvX3JlZik7CisJCWRlbnktPmxkX3NvcCA9IHNvcDsKKwkJZGVueS0+bGRfY2xpZW50aWQgPSBzb3AtPnNvX2NsaWVudC0+Y2xfY2xpZW50aWQ7CisJfQorCWRlbnktPmxkX3N0YXJ0ID0gZmwtPmZsX3N0YXJ0OworCWRlbnktPmxkX2xlbmd0aCA9IH4odTY0KTA7CisJaWYgKGZsLT5mbF9lbmQgIT0gfih1NjQpMCkKKwkJZGVueS0+bGRfbGVuZ3RoID0gZmwtPmZsX2VuZCAtIGZsLT5mbF9zdGFydCArIDE7ICAgICAgICAKKwlkZW55LT5sZF90eXBlID0gTkZTNF9SRUFEX0xUOworCWlmIChmbC0+ZmxfdHlwZSAhPSBGX1JETENLKQorCQlkZW55LT5sZF90eXBlID0gTkZTNF9XUklURV9MVDsKK30KKworc3RhdGljIHN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKgorZmluZF9sb2Nrc3RhdGVvd25lcihzdHJ1Y3QgeGRyX25ldG9iaiAqb3duZXIsIGNsaWVudGlkX3QgKmNsaWQpCit7CisJc3RydWN0IG5mczRfc3RhdGVvd25lciAqbG9jYWwgPSBOVUxMOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IExPQ0tfSEFTSF9TSVpFOyBpKyspIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShsb2NhbCwgJmxvY2tfb3duZXJpZF9oYXNodGJsW2ldLCBzb19pZGhhc2gpIHsKKwkJCWlmICghY21wX293bmVyX3N0cihsb2NhbCwgb3duZXIsIGNsaWQpKQorCQkJCWNvbnRpbnVlOworCQkJcmV0dXJuIGxvY2FsOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IG5mczRfc3RhdGVvd25lciAqCitmaW5kX2xvY2tzdGF0ZW93bmVyX3N0cihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjbGllbnRpZF90ICpjbGlkLAorCQlzdHJ1Y3QgeGRyX25ldG9iaiAqb3duZXIpCit7CisJdW5zaWduZWQgaW50IGhhc2h2YWwgPSBsb2NrX293bmVyc3RyX2hhc2h2YWwoaW5vZGUsIGNsaWQtPmNsX2lkLCBvd25lcik7CisJc3RydWN0IG5mczRfc3RhdGVvd25lciAqb3A7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9wLCAmbG9ja19vd25lcnN0cl9oYXNodGJsW2hhc2h2YWxdLCBzb19zdHJoYXNoKSB7CisJCWlmIChjbXBfb3duZXJfc3RyKG9wLCBvd25lciwgY2xpZCkpCisJCQlyZXR1cm4gb3A7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKgorICogQWxsb2MgYSBsb2NrIG93bmVyIHN0cnVjdHVyZS4KKyAqIENhbGxlZCBpbiBuZnNkNF9sb2NrIC0gdGhlcmVmb3JlLCBPUEVOIGFuZCBPUEVOX0NPTkZJUk0gKGlmIG5lZWRlZCkgaGFzIAorICogb2NjdXJlZC4gCisgKgorICogc3RyaGFzaHZhbCA9IGxvY2tfb3duZXJzdHJfaGFzaHZhbCAKKyAqIHNvX3NlcWlkID0gbG9jay0+bGtfbmV3X2xvY2tfc2VxaWQgLSAxOiBpdCBnZXRzIGJ1bXBlZCBpbiBlbmNvZGUgCisgKi8KKworc3RhdGljIHN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKgorYWxsb2NfaW5pdF9sb2NrX3N0YXRlb3duZXIodW5zaWduZWQgaW50IHN0cmhhc2h2YWwsIHN0cnVjdCBuZnM0X2NsaWVudCAqY2xwLCBzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpvcGVuX3N0cCwgc3RydWN0IG5mc2Q0X2xvY2sgKmxvY2spIHsKKwlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpzb3A7CisJc3RydWN0IG5mczRfcmVwbGF5ICpycDsKKwl1bnNpZ25lZCBpbnQgaWRoYXNodmFsOworCisJaWYgKCEoc29wID0gYWxsb2Nfc3RhdGVvd25lcigmbG9jay0+bGtfbmV3X293bmVyKSkpCisJCXJldHVybiBOVUxMOworCWlkaGFzaHZhbCA9IGxvY2tvd25lcmlkX2hhc2h2YWwoY3VycmVudF9vd25lcmlkKTsKKwlJTklUX0xJU1RfSEVBRCgmc29wLT5zb19pZGhhc2gpOworCUlOSVRfTElTVF9IRUFEKCZzb3AtPnNvX3N0cmhhc2gpOworCUlOSVRfTElTVF9IRUFEKCZzb3AtPnNvX3BlcmNsaWVudCk7CisJSU5JVF9MSVNUX0hFQUQoJnNvcC0+c29fcGVyZmlsZXN0YXRlKTsKKwlJTklUX0xJU1RfSEVBRCgmc29wLT5zb19wZXJsb2Nrb3duZXIpOworCUlOSVRfTElTVF9IRUFEKCZzb3AtPnNvX2Nsb3NlX2xydSk7IC8qIG5vdCB1c2VkICovCisJc29wLT5zb190aW1lID0gMDsKKwlsaXN0X2FkZCgmc29wLT5zb19pZGhhc2gsICZsb2NrX293bmVyaWRfaGFzaHRibFtpZGhhc2h2YWxdKTsKKwlsaXN0X2FkZCgmc29wLT5zb19zdHJoYXNoLCAmbG9ja19vd25lcnN0cl9oYXNodGJsW3N0cmhhc2h2YWxdKTsKKwlsaXN0X2FkZCgmc29wLT5zb19wZXJsb2Nrb3duZXIsICZvcGVuX3N0cC0+c3RfcGVybG9ja293bmVyKTsKKwlzb3AtPnNvX2lzX29wZW5fb3duZXIgPSAwOworCXNvcC0+c29faWQgPSBjdXJyZW50X293bmVyaWQrKzsKKwlzb3AtPnNvX2NsaWVudCA9IGNscDsKKwlzb3AtPnNvX3NlcWlkID0gbG9jay0+bGtfbmV3X2xvY2tfc2VxaWQgLSAxOworCXNvcC0+c29fY29uZmlybWVkID0gMTsKKwlycCA9ICZzb3AtPnNvX3JlcGxheTsKKwlycC0+cnBfc3RhdHVzID0gTkZTRVJSX1NFUlZFUkZBVUxUOworCXJwLT5ycF9idWZsZW4gPSAwOworCXJwLT5ycF9idWYgPSBycC0+cnBfaWJ1ZjsKKwlyZXR1cm4gc29wOworfQorCitzdHJ1Y3QgbmZzNF9zdGF0ZWlkICoKK2FsbG9jX2luaXRfbG9ja19zdGF0ZWlkKHN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKnNvcCwgc3RydWN0IG5mczRfZmlsZSAqZnAsIHN0cnVjdCBuZnM0X3N0YXRlaWQgKm9wZW5fc3RwKQoreworCXN0cnVjdCBuZnM0X3N0YXRlaWQgKnN0cDsKKwl1bnNpZ25lZCBpbnQgaGFzaHZhbCA9IHN0YXRlaWRfaGFzaHZhbChzb3AtPnNvX2lkLCBmcC0+ZmlfaWQpOworCisJaWYgKChzdHAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbmZzNF9zdGF0ZWlkKSwgCisJCQkJCUdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwlJTklUX0xJU1RfSEVBRCgmc3RwLT5zdF9oYXNoKTsKKwlJTklUX0xJU1RfSEVBRCgmc3RwLT5zdF9wZXJmaWxlKTsKKwlJTklUX0xJU1RfSEVBRCgmc3RwLT5zdF9wZXJmaWxlc3RhdGUpOworCUlOSVRfTElTVF9IRUFEKCZzdHAtPnN0X3BlcmxvY2tvd25lcik7IC8qIG5vdCB1c2VkICovCisJbGlzdF9hZGQoJnN0cC0+c3RfaGFzaCwgJmxvY2tzdGF0ZWlkX2hhc2h0YmxbaGFzaHZhbF0pOworCWxpc3RfYWRkKCZzdHAtPnN0X3BlcmZpbGUsICZmcC0+ZmlfcGVyZmlsZSk7CisJbGlzdF9hZGRfcGVyZmlsZSsrOworCWxpc3RfYWRkKCZzdHAtPnN0X3BlcmZpbGVzdGF0ZSwgJnNvcC0+c29fcGVyZmlsZXN0YXRlKTsKKwlzdHAtPnN0X3N0YXRlb3duZXIgPSBzb3A7CisJc3RwLT5zdF9maWxlID0gZnA7CisJc3RwLT5zdF9zdGF0ZWlkLnNpX2Jvb3QgPSBib290X3RpbWU7CisJc3RwLT5zdF9zdGF0ZWlkLnNpX3N0YXRlb3duZXJpZCA9IHNvcC0+c29faWQ7CisJc3RwLT5zdF9zdGF0ZWlkLnNpX2ZpbGVpZCA9IGZwLT5maV9pZDsKKwlzdHAtPnN0X3N0YXRlaWQuc2lfZ2VuZXJhdGlvbiA9IDA7CisJc3RwLT5zdF92ZnNfZmlsZSA9IG9wZW5fc3RwLT5zdF92ZnNfZmlsZTsgLyogRklYTUUgcmVmY291bnQ/PyAqLworCXN0cC0+c3RfYWNjZXNzX2JtYXAgPSBvcGVuX3N0cC0+c3RfYWNjZXNzX2JtYXA7CisJc3RwLT5zdF9kZW55X2JtYXAgPSBvcGVuX3N0cC0+c3RfZGVueV9ibWFwOworCitvdXQ6CisJcmV0dXJuIHN0cDsKK30KKworaW50CitjaGVja19sb2NrX2xlbmd0aCh1NjQgb2Zmc2V0LCB1NjQgbGVuZ3RoKQoreworCXJldHVybiAoKGxlbmd0aCA9PSAwKSAgfHwgKChsZW5ndGggIT0gfih1NjQpMCkgJiYKKwkgICAgIExPRkZfT1ZFUkZMT1cob2Zmc2V0LCBsZW5ndGgpKSk7Cit9CisKKy8qCisgKiAgTE9DSyBvcGVyYXRpb24gCisgKi8KK2ludAorbmZzZDRfbG9jayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpjdXJyZW50X2ZoLCBzdHJ1Y3QgbmZzZDRfbG9jayAqbG9jaykKK3sKKwlzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyICpsb2NrX3NvcCA9IE5VTEwsICpvcGVuX3NvcCA9IE5VTEw7CisJc3RydWN0IG5mczRfc3RhdGVpZCAqbG9ja19zdHA7CisJc3RydWN0IGZpbGUgKmZpbHA7CisJc3RydWN0IGZpbGVfbG9jayBmaWxlX2xvY2s7CisJc3RydWN0IGZpbGVfbG9jayAqY29uZmxvY2s7CisJaW50IHN0YXR1cyA9IDA7CisJdW5zaWduZWQgaW50IHN0cmhhc2h2YWw7CisKKwlkcHJpbnRrKCJORlNEOiBuZnNkNF9sb2NrOiBzdGFydD0lTGQgbGVuZ3RoPSVMZFxuIiwKKwkJKGxvbmcgbG9uZykgbG9jay0+bGtfb2Zmc2V0LAorCQkobG9uZyBsb25nKSBsb2NrLT5sa19sZW5ndGgpOworCisJaWYgKG5mczRfaW5fZ3JhY2UoKSAmJiAhbG9jay0+bGtfcmVjbGFpbSkKKwkJcmV0dXJuIG5mc2Vycl9ncmFjZTsKKwlpZiAoIW5mczRfaW5fZ3JhY2UoKSAmJiBsb2NrLT5sa19yZWNsYWltKQorCQlyZXR1cm4gbmZzZXJyX25vX2dyYWNlOworCisJaWYgKGNoZWNrX2xvY2tfbGVuZ3RoKGxvY2stPmxrX29mZnNldCwgbG9jay0+bGtfbGVuZ3RoKSkKKwkJIHJldHVybiBuZnNlcnJfaW52YWw7CisKKwluZnM0X2xvY2tfc3RhdGUoKTsKKworCWlmIChsb2NrLT5sa19pc19uZXcpIHsKKwkvKgorCSAqIENsaWVudCBpbmRpY2F0ZXMgdGhhdCB0aGlzIGlzIGEgbmV3IGxvY2tvd25lci4KKwkgKiBVc2Ugb3BlbiBvd25lciBhbmQgb3BlbiBzdGF0ZWlkIHRvIGNyZWF0ZSBsb2NrIG93bmVyIGFuZCBsb2NrIAorCSAqIHN0YXRlaWQuCisJICovCisJCXN0cnVjdCBuZnM0X3N0YXRlaWQgKm9wZW5fc3RwID0gTlVMTDsKKwkJc3RydWN0IG5mczRfZmlsZSAqZnA7CisJCQorCQlzdGF0dXMgPSBuZnNlcnJfc3RhbGVfY2xpZW50aWQ7CisJCWlmIChTVEFMRV9DTElFTlRJRCgmbG9jay0+bGtfbmV3X2NsaWVudGlkKSkgeworCQkJcHJpbnRrKCJORlNEOiBuZnNkNF9sb2NrOiBjbGllbnRpZCBpcyBzdGFsZSFcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKiBpcyB0aGUgbmV3IGxvY2sgc2VxaWQgcHJlc2VudGVkIGJ5IHRoZSBjbGllbnQgemVybz8gKi8KKwkJc3RhdHVzID0gbmZzZXJyX2JhZF9zZXFpZDsKKwkJaWYgKGxvY2stPnYubmV3LmxvY2tfc2VxaWQgIT0gMCkKKwkJCWdvdG8gb3V0OworCisJCS8qIHZhbGlkYXRlIGFuZCB1cGRhdGUgb3BlbiBzdGF0ZWlkIGFuZCBvcGVuIHNlcWlkICovCisJCXN0YXR1cyA9IG5mczRfcHJlcHJvY2Vzc19zZXFpZF9vcChjdXJyZW50X2ZoLCAKKwkJCQkgICAgICAgIGxvY2stPmxrX25ld19vcGVuX3NlcWlkLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAmbG9jay0+bGtfbmV3X29wZW5fc3RhdGVpZCwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRkggfCBPUEVOX1NUQVRFLAorCQkgICAgICAgICAgICAgICAgICAgICAgICAmb3Blbl9zb3AsICZvcGVuX3N0cCwKKwkJCQkJJmxvY2stPnYubmV3LmNsaWVudGlkKTsKKwkJaWYgKHN0YXR1cykgeworCQkJaWYgKGxvY2stPmxrX3JlY2xhaW0pCisJCQkJc3RhdHVzID0gbmZzZXJyX3JlY2xhaW1fYmFkOworCQkJZ290byBvdXQ7CisJCX0KKwkJLyogY3JlYXRlIGxvY2tvd25lciBhbmQgbG9jayBzdGF0ZWlkICovCisJCWZwID0gb3Blbl9zdHAtPnN0X2ZpbGU7CisJCXN0cmhhc2h2YWwgPSBsb2NrX293bmVyc3RyX2hhc2h2YWwoZnAtPmZpX2lub2RlLCAKKwkJCQlvcGVuX3NvcC0+c29fY2xpZW50LT5jbF9jbGllbnRpZC5jbF9pZCwgCisJCQkJJmxvY2stPnYubmV3Lm93bmVyKTsKKwkJLyogCisJCSAqIElmIHdlIGFscmVhZHkgaGF2ZSB0aGlzIGxvY2sgb3duZXIsIHRoZSBjbGllbnQgaXMgaW4gCisJCSAqIGVycm9yIChvciBvdXIgYm9va2VlcGluZyBpcyB3cm9uZyEpIAorCQkgKiBmb3IgYXNraW5nIGZvciBhICduZXcgbG9jaycuCisJCSAqLworCQlzdGF0dXMgPSBuZnNlcnJfYmFkX3N0YXRlaWQ7CisJCWxvY2tfc29wID0gZmluZF9sb2Nrc3RhdGVvd25lcigmbG9jay0+di5uZXcub3duZXIsCisJCQkJCQkmbG9jay0+di5uZXcuY2xpZW50aWQpOworCQlpZiAobG9ja19zb3ApCisJCQlnb3RvIG91dDsKKwkJc3RhdHVzID0gbmZzZXJyX3Jlc291cmNlOworCQlpZiAoIShsb2NrLT5sa19zdGF0ZW93bmVyID0gYWxsb2NfaW5pdF9sb2NrX3N0YXRlb3duZXIoc3RyaGFzaHZhbCwgb3Blbl9zb3AtPnNvX2NsaWVudCwgb3Blbl9zdHAsIGxvY2spKSkKKwkJCWdvdG8gb3V0OworCQlpZiAoKGxvY2tfc3RwID0gYWxsb2NfaW5pdF9sb2NrX3N0YXRlaWQobG9jay0+bGtfc3RhdGVvd25lciwgCisJCQkJCQlmcCwgb3Blbl9zdHApKSA9PSBOVUxMKSB7CisJCQlyZWxlYXNlX3N0YXRlb3duZXIobG9jay0+bGtfc3RhdGVvd25lcik7CisJCQlsb2NrLT5sa19zdGF0ZW93bmVyID0gTlVMTDsKKwkJCWdvdG8gb3V0OworCQl9CisJCS8qIGJ1bXAgdGhlIG9wZW4gc2VxaWQgdXNlZCB0byBjcmVhdGUgdGhlIGxvY2sgKi8KKwkJb3Blbl9zb3AtPnNvX3NlcWlkKys7CisJfSBlbHNlIHsKKwkJLyogbG9jayAobG9jayBvd25lciArIGxvY2sgc3RhdGVpZCkgYWxyZWFkeSBleGlzdHMgKi8KKwkJc3RhdHVzID0gbmZzNF9wcmVwcm9jZXNzX3NlcWlkX29wKGN1cnJlbnRfZmgsCisJCQkJICAgICAgIGxvY2stPmxrX29sZF9sb2NrX3NlcWlkLCAKKwkJCQkgICAgICAgJmxvY2stPmxrX29sZF9sb2NrX3N0YXRlaWQsIAorCQkJCSAgICAgICBDSEVDS19GSCB8IExPQ0tfU1RBVEUsIAorCQkJCSAgICAgICAmbG9jay0+bGtfc3RhdGVvd25lciwgJmxvY2tfc3RwLCBOVUxMKTsKKwkJaWYgKHN0YXR1cykKKwkJCWdvdG8gb3V0OworCX0KKwkvKiBsb2NrLT5sa19zdGF0ZW93bmVyIGFuZCBsb2NrX3N0cCBoYXZlIGJlZW4gY3JlYXRlZCBvciBmb3VuZCAqLworCWZpbHAgPSBsb2NrX3N0cC0+c3RfdmZzX2ZpbGU7CisKKwlpZiAoKHN0YXR1cyA9IGZoX3ZlcmlmeShycXN0cCwgY3VycmVudF9maCwgU19JRlJFRywgTUFZX0xPQ0spKSkgeworCQlwcmludGsoIk5GU0Q6IG5mc2Q0X2xvY2s6IHBlcm1pc3Npb24gZGVuaWVkIVxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWxvY2tzX2luaXRfbG9jaygmZmlsZV9sb2NrKTsKKwlzd2l0Y2ggKGxvY2stPmxrX3R5cGUpIHsKKwkJY2FzZSBORlM0X1JFQURfTFQ6CisJCWNhc2UgTkZTNF9SRUFEV19MVDoKKwkJCWZpbGVfbG9jay5mbF90eXBlID0gRl9SRExDSzsKKwkJYnJlYWs7CisJCWNhc2UgTkZTNF9XUklURV9MVDoKKwkJY2FzZSBORlM0X1dSSVRFV19MVDoKKwkJCWZpbGVfbG9jay5mbF90eXBlID0gRl9XUkxDSzsKKwkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzdGF0dXMgPSBuZnNlcnJfaW52YWw7CisJCWdvdG8gb3V0OworCX0KKwlmaWxlX2xvY2suZmxfb3duZXIgPSAoZmxfb3duZXJfdCkgbG9jay0+bGtfc3RhdGVvd25lcjsKKwlmaWxlX2xvY2suZmxfcGlkID0gY3VycmVudC0+dGdpZDsKKwlmaWxlX2xvY2suZmxfZmlsZSA9IGZpbHA7CisJZmlsZV9sb2NrLmZsX2ZsYWdzID0gRkxfUE9TSVg7CisKKwlmaWxlX2xvY2suZmxfc3RhcnQgPSBsb2NrLT5sa19vZmZzZXQ7CisJaWYgKChsb2NrLT5sa19sZW5ndGggPT0gfih1NjQpMCkgfHwgCisJCQlMT0ZGX09WRVJGTE9XKGxvY2stPmxrX29mZnNldCwgbG9jay0+bGtfbGVuZ3RoKSkKKwkJZmlsZV9sb2NrLmZsX2VuZCA9IH4odTY0KTA7CisJZWxzZQorCQlmaWxlX2xvY2suZmxfZW5kID0gbG9jay0+bGtfb2Zmc2V0ICsgbG9jay0+bGtfbGVuZ3RoIC0gMTsKKwluZnM0X3RyYW5zZm9ybV9sb2NrX29mZnNldCgmZmlsZV9sb2NrKTsKKworCS8qCisJKiBUcnkgdG8gbG9jayB0aGUgZmlsZSBpbiB0aGUgVkZTLgorCSogTm90ZTogbG9ja3MuYyB1c2VzIHRoZSBCS0wgdG8gcHJvdGVjdCB0aGUgaW5vZGUncyBsb2NrIGxpc3QuCisJKi8KKworCXN0YXR1cyA9IHBvc2l4X2xvY2tfZmlsZShmaWxwLCAmZmlsZV9sb2NrKTsKKwlpZiAoZmlsZV9sb2NrLmZsX29wcyAmJiBmaWxlX2xvY2suZmxfb3BzLT5mbF9yZWxlYXNlX3ByaXZhdGUpCisJCWZpbGVfbG9jay5mbF9vcHMtPmZsX3JlbGVhc2VfcHJpdmF0ZSgmZmlsZV9sb2NrKTsKKwlkcHJpbnRrKCJORlNEOiBuZnNkNF9sb2NrOiBwb3NpeF9sb2NrX2ZpbGUgc3RhdHVzICVkXG4iLHN0YXR1cyk7CisJc3dpdGNoICgtc3RhdHVzKSB7CisJY2FzZSAwOiAvKiBzdWNjZXNzISAqLworCQl1cGRhdGVfc3RhdGVpZCgmbG9ja19zdHAtPnN0X3N0YXRlaWQpOworCQltZW1jcHkoJmxvY2stPmxrX3Jlc3Bfc3RhdGVpZCwgJmxvY2tfc3RwLT5zdF9zdGF0ZWlkLCAKKwkJCQlzaXplb2Yoc3RhdGVpZF90KSk7CisJCWdvdG8gb3V0OworCWNhc2UgKEVBR0FJTik6CisJCWdvdG8gY29uZmxpY3RpbmdfbG9jazsKKwljYXNlIChFREVBRExLKToKKwkJc3RhdHVzID0gbmZzZXJyX2RlYWRsb2NrOworCWRlZmF1bHQ6ICAgICAgICAKKwkJZHByaW50aygiTkZTRDogbmZzZDRfbG9jazogcG9zaXhfbG9ja19maWxlKCkgZmFpbGVkISBzdGF0dXMgJWRcbiIsc3RhdHVzKTsKKwkJZ290byBvdXRfZGVzdHJveV9uZXdfc3RhdGVpZDsKKwl9CisKK2NvbmZsaWN0aW5nX2xvY2s6CisJZHByaW50aygiTkZTRDogbmZzZDRfbG9jazogY29uZmxpY3RpbmcgbG9jayBmb3VuZCFcbiIpOworCXN0YXR1cyA9IG5mc2Vycl9kZW5pZWQ7CisJLyogWFhYIFRoZXJlIGlzIGEgcmFjZSBoZXJlLiBGdXR1cmUgcGF0Y2ggbmVlZGVkIHRvIHByb3ZpZGUgCisJICogYW4gYXRvbWljIHBvc2l4X2xvY2tfYW5kX3Rlc3RfZmlsZQorCSAqLworCWlmICghKGNvbmZsb2NrID0gcG9zaXhfdGVzdF9sb2NrKGZpbHAsICZmaWxlX2xvY2spKSkgeworCQlzdGF0dXMgPSBuZnNlcnJfc2VydmVyZmF1bHQ7CisJCWdvdG8gb3V0OworCX0KKwluZnM0X3NldF9sb2NrX2RlbmllZChjb25mbG9jaywgJmxvY2stPmxrX2RlbmllZCk7CisKK291dF9kZXN0cm95X25ld19zdGF0ZWlkOgorCWlmIChsb2NrLT5sa19pc19uZXcpIHsKKwkJZHByaW50aygiTkZTRDogbmZzZDRfbG9jazogZGVzdHJveSBuZXcgc3RhdGVpZCFcbiIpOworCS8qCisJKiBBbiBlcnJvciBlbmNvdW50ZXJlZCBhZnRlciBpbnN0YW50aWF0aW9uIG9mIHRoZSBuZXcKKwkqIHN0YXRlaWQgaGFzIGZvcmNlZCB1cyB0byBkZXN0cm95IGl0LgorCSovCisJCWlmICghc2VxaWRfbXV0YXRpbmdfZXJyKHN0YXR1cykpCisJCQlvcGVuX3NvcC0+c29fc2VxaWQtLTsKKworCQlyZWxlYXNlX3N0YXRlX293bmVyKGxvY2tfc3RwLCBMT0NLX1NUQVRFKTsKKwl9CitvdXQ6CisJaWYgKGxvY2stPmxrX3N0YXRlb3duZXIpCisJCW5mczRfZ2V0X3N0YXRlb3duZXIobG9jay0+bGtfc3RhdGVvd25lcik7CisJbmZzNF91bmxvY2tfc3RhdGUoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogTE9DS1Qgb3BlcmF0aW9uCisgKi8KK2ludAorbmZzZDRfbG9ja3Qoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X2xvY2t0ICpsb2NrdCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBmaWxlIGZpbGU7CisJc3RydWN0IGZpbGVfbG9jayBmaWxlX2xvY2s7CisJc3RydWN0IGZpbGVfbG9jayAqY29uZmxpY3RpbmdfbG9jazsKKwlpbnQgc3RhdHVzOworCisJaWYgKG5mczRfaW5fZ3JhY2UoKSkKKwkJcmV0dXJuIG5mc2Vycl9ncmFjZTsKKworCWlmIChjaGVja19sb2NrX2xlbmd0aChsb2NrdC0+bHRfb2Zmc2V0LCBsb2NrdC0+bHRfbGVuZ3RoKSkKKwkJIHJldHVybiBuZnNlcnJfaW52YWw7CisKKwlsb2NrdC0+bHRfc3RhdGVvd25lciA9IE5VTEw7CisJbmZzNF9sb2NrX3N0YXRlKCk7CisKKwlzdGF0dXMgPSBuZnNlcnJfc3RhbGVfY2xpZW50aWQ7CisJaWYgKFNUQUxFX0NMSUVOVElEKCZsb2NrdC0+bHRfY2xpZW50aWQpKSB7CisJCXByaW50aygiTkZTRDogbmZzZDRfbG9ja3Q6IGNsaWVudGlkIGlzIHN0YWxlIVxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWlmICgoc3RhdHVzID0gZmhfdmVyaWZ5KHJxc3RwLCBjdXJyZW50X2ZoLCBTX0lGUkVHLCAwKSkpIHsKKwkJcHJpbnRrKCJORlNEOiBuZnNkNF9sb2NrdDogZmhfdmVyaWZ5KCkgZmFpbGVkIVxuIik7CisJCWlmIChzdGF0dXMgPT0gbmZzZXJyX3N5bWxpbmspCisJCQlzdGF0dXMgPSBuZnNlcnJfaW52YWw7CisJCWdvdG8gb3V0OworCX0KKworCWlub2RlID0gY3VycmVudF9maC0+ZmhfZGVudHJ5LT5kX2lub2RlOworCWxvY2tzX2luaXRfbG9jaygmZmlsZV9sb2NrKTsKKwlzd2l0Y2ggKGxvY2t0LT5sdF90eXBlKSB7CisJCWNhc2UgTkZTNF9SRUFEX0xUOgorCQljYXNlIE5GUzRfUkVBRFdfTFQ6CisJCQlmaWxlX2xvY2suZmxfdHlwZSA9IEZfUkRMQ0s7CisJCWJyZWFrOworCQljYXNlIE5GUzRfV1JJVEVfTFQ6CisJCWNhc2UgTkZTNF9XUklURVdfTFQ6CisJCQlmaWxlX2xvY2suZmxfdHlwZSA9IEZfV1JMQ0s7CisJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKCJORlNEOiBuZnM0X2xvY2t0OiBiYWQgbG9jayB0eXBlIVxuIik7CisJCQlzdGF0dXMgPSBuZnNlcnJfaW52YWw7CisJCWdvdG8gb3V0OworCX0KKworCWxvY2t0LT5sdF9zdGF0ZW93bmVyID0gZmluZF9sb2Nrc3RhdGVvd25lcl9zdHIoaW5vZGUsCisJCQkmbG9ja3QtPmx0X2NsaWVudGlkLCAmbG9ja3QtPmx0X293bmVyKTsKKwlpZiAobG9ja3QtPmx0X3N0YXRlb3duZXIpCisJCWZpbGVfbG9jay5mbF9vd25lciA9IChmbF9vd25lcl90KWxvY2t0LT5sdF9zdGF0ZW93bmVyOworCWZpbGVfbG9jay5mbF9waWQgPSBjdXJyZW50LT50Z2lkOworCWZpbGVfbG9jay5mbF9mbGFncyA9IEZMX1BPU0lYOworCisJZmlsZV9sb2NrLmZsX3N0YXJ0ID0gbG9ja3QtPmx0X29mZnNldDsKKwlpZiAoKGxvY2t0LT5sdF9sZW5ndGggPT0gfih1NjQpMCkgfHwgTE9GRl9PVkVSRkxPVyhsb2NrdC0+bHRfb2Zmc2V0LCBsb2NrdC0+bHRfbGVuZ3RoKSkKKwkJZmlsZV9sb2NrLmZsX2VuZCA9IH4odTY0KTA7CisJZWxzZQorCQlmaWxlX2xvY2suZmxfZW5kID0gbG9ja3QtPmx0X29mZnNldCArIGxvY2t0LT5sdF9sZW5ndGggLSAxOworCisJbmZzNF90cmFuc2Zvcm1fbG9ja19vZmZzZXQoJmZpbGVfbG9jayk7CisKKwkvKiBwb3NpeF90ZXN0X2xvY2sgdXNlcyB0aGUgc3RydWN0IGZpbGUgX29ubHlfIHRvIHJlc29sdmUgdGhlIGlub2RlLgorCSAqIHNpbmNlIExPQ0tUIGRvZXNuJ3QgcmVxdWlyZSBhbiBPUEVOLCBhbmQgdGhlcmVmb3JlIGEgc3RydWN0CisJICogZmlsZSBtYXkgbm90IGV4aXN0LCBwYXNzIHBvc2l4X3Rlc3RfbG9jayBhIHN0cnVjdCBmaWxlIHdpdGgKKwkgKiBvbmx5IHRoZSBkZW50cnk6aW5vZGUgc2V0LgorCSAqLworCW1lbXNldCgmZmlsZSwgMCwgc2l6ZW9mIChzdHJ1Y3QgZmlsZSkpOworCWZpbGUuZl9kZW50cnkgPSBjdXJyZW50X2ZoLT5maF9kZW50cnk7CisKKwlzdGF0dXMgPSBuZnNfb2s7CisJY29uZmxpY3RpbmdfbG9jayA9IHBvc2l4X3Rlc3RfbG9jaygmZmlsZSwgJmZpbGVfbG9jayk7CisJaWYgKGNvbmZsaWN0aW5nX2xvY2spIHsKKwkJc3RhdHVzID0gbmZzZXJyX2RlbmllZDsKKwkJbmZzNF9zZXRfbG9ja19kZW5pZWQoY29uZmxpY3RpbmdfbG9jaywgJmxvY2t0LT5sdF9kZW5pZWQpOworCX0KK291dDoKKwluZnM0X3VubG9ja19zdGF0ZSgpOworCXJldHVybiBzdGF0dXM7Cit9CisKK2ludAorbmZzZDRfbG9ja3Uoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqY3VycmVudF9maCwgc3RydWN0IG5mc2Q0X2xvY2t1ICpsb2NrdSkKK3sKKwlzdHJ1Y3QgbmZzNF9zdGF0ZWlkICpzdHA7CisJc3RydWN0IGZpbGUgKmZpbHAgPSBOVUxMOworCXN0cnVjdCBmaWxlX2xvY2sgZmlsZV9sb2NrOworCWludCBzdGF0dXM7CisJCQkJCQkgICAgICAgIAorCWRwcmludGsoIk5GU0Q6IG5mc2Q0X2xvY2t1OiBzdGFydD0lTGQgbGVuZ3RoPSVMZFxuIiwKKwkJKGxvbmcgbG9uZykgbG9ja3UtPmx1X29mZnNldCwKKwkJKGxvbmcgbG9uZykgbG9ja3UtPmx1X2xlbmd0aCk7CisKKwlpZiAoY2hlY2tfbG9ja19sZW5ndGgobG9ja3UtPmx1X29mZnNldCwgbG9ja3UtPmx1X2xlbmd0aCkpCisJCSByZXR1cm4gbmZzZXJyX2ludmFsOworCisJbmZzNF9sb2NrX3N0YXRlKCk7CisJCQkJCQkJCQkgICAgICAgIAorCWlmICgoc3RhdHVzID0gbmZzNF9wcmVwcm9jZXNzX3NlcWlkX29wKGN1cnJlbnRfZmgsIAorCQkJCQlsb2NrdS0+bHVfc2VxaWQsIAorCQkJCQkmbG9ja3UtPmx1X3N0YXRlaWQsIAorCQkJCQlDSEVDS19GSCB8IExPQ0tfU1RBVEUsIAorCQkJCQkmbG9ja3UtPmx1X3N0YXRlb3duZXIsICZzdHAsIE5VTEwpKSkKKwkJZ290byBvdXQ7CisKKwlmaWxwID0gc3RwLT5zdF92ZnNfZmlsZTsKKwlCVUdfT04oIWZpbHApOworCWxvY2tzX2luaXRfbG9jaygmZmlsZV9sb2NrKTsKKwlmaWxlX2xvY2suZmxfdHlwZSA9IEZfVU5MQ0s7CisJZmlsZV9sb2NrLmZsX293bmVyID0gKGZsX293bmVyX3QpIGxvY2t1LT5sdV9zdGF0ZW93bmVyOworCWZpbGVfbG9jay5mbF9waWQgPSBjdXJyZW50LT50Z2lkOworCWZpbGVfbG9jay5mbF9maWxlID0gZmlscDsKKwlmaWxlX2xvY2suZmxfZmxhZ3MgPSBGTF9QT1NJWDsgCisJZmlsZV9sb2NrLmZsX3N0YXJ0ID0gbG9ja3UtPmx1X29mZnNldDsKKworCWlmICgobG9ja3UtPmx1X2xlbmd0aCA9PSB+KHU2NCkwKSB8fCBMT0ZGX09WRVJGTE9XKGxvY2t1LT5sdV9vZmZzZXQsIGxvY2t1LT5sdV9sZW5ndGgpKQorCQlmaWxlX2xvY2suZmxfZW5kID0gfih1NjQpMDsKKwllbHNlCisJCWZpbGVfbG9jay5mbF9lbmQgPSBsb2NrdS0+bHVfb2Zmc2V0ICsgbG9ja3UtPmx1X2xlbmd0aCAtIDE7CisJbmZzNF90cmFuc2Zvcm1fbG9ja19vZmZzZXQoJmZpbGVfbG9jayk7CisKKwkvKgorCSogIFRyeSB0byB1bmxvY2sgdGhlIGZpbGUgaW4gdGhlIFZGUy4KKwkqLworCXN0YXR1cyA9IHBvc2l4X2xvY2tfZmlsZShmaWxwLCAmZmlsZV9sb2NrKTsgCisJaWYgKGZpbGVfbG9jay5mbF9vcHMgJiYgZmlsZV9sb2NrLmZsX29wcy0+ZmxfcmVsZWFzZV9wcml2YXRlKQorCQlmaWxlX2xvY2suZmxfb3BzLT5mbF9yZWxlYXNlX3ByaXZhdGUoJmZpbGVfbG9jayk7CisJaWYgKHN0YXR1cykgeworCQlwcmludGsoIk5GU0Q6IG5mczRfbG9ja3U6IHBvc2l4X2xvY2tfZmlsZSBmYWlsZWQhXG4iKTsKKwkJZ290byBvdXRfbmZzZXJyOworCX0KKwkvKgorCSogT0ssIHVubG9jayBzdWNjZWVkZWQ7IHRoZSBvbmx5IHRoaW5nIGxlZnQgdG8gZG8gaXMgdXBkYXRlIHRoZSBzdGF0ZWlkLgorCSovCisJdXBkYXRlX3N0YXRlaWQoJnN0cC0+c3Rfc3RhdGVpZCk7CisJbWVtY3B5KCZsb2NrdS0+bHVfc3RhdGVpZCwgJnN0cC0+c3Rfc3RhdGVpZCwgc2l6ZW9mKHN0YXRlaWRfdCkpOworCitvdXQ6CisJaWYgKGxvY2t1LT5sdV9zdGF0ZW93bmVyKQorCQluZnM0X2dldF9zdGF0ZW93bmVyKGxvY2t1LT5sdV9zdGF0ZW93bmVyKTsKKwluZnM0X3VubG9ja19zdGF0ZSgpOworCXJldHVybiBzdGF0dXM7CisKK291dF9uZnNlcnI6CisJc3RhdHVzID0gbmZzZXJybm8oc3RhdHVzKTsKKwlnb3RvIG91dDsKK30KKworLyoKKyAqIHJldHVybnMKKyAqIAkxOiBsb2NrcyBoZWxkIGJ5IGxvY2tvd25lcgorICogCTA6IG5vIGxvY2tzIGhlbGQgYnkgbG9ja293bmVyCisgKi8KK3N0YXRpYyBpbnQKK2NoZWNrX2Zvcl9sb2NrcyhzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IG5mczRfc3RhdGVvd25lciAqbG93bmVyKQoreworCXN0cnVjdCBmaWxlX2xvY2sgKipmbHBwOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgc3RhdHVzID0gMDsKKworCWxvY2tfa2VybmVsKCk7CisJZm9yIChmbHBwID0gJmlub2RlLT5pX2Zsb2NrOyAqZmxwcCAhPSBOVUxMOyBmbHBwID0gJigqZmxwcCktPmZsX25leHQpIHsKKwkJaWYgKCgqZmxwcCktPmZsX293bmVyID09IChmbF9vd25lcl90KWxvd25lcikKKwkJCXN0YXR1cyA9IDE7CisJCQlnb3RvIG91dDsKKwl9CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBzdGF0dXM7Cit9CisKK2ludAorbmZzZDRfcmVsZWFzZV9sb2Nrb3duZXIoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2Q0X3JlbGVhc2VfbG9ja293bmVyICpybG9ja293bmVyKQoreworCWNsaWVudGlkX3QgKmNsaWQgPSAmcmxvY2tvd25lci0+cmxfY2xpZW50aWQ7CisJc3RydWN0IG5mczRfc3RhdGVvd25lciAqbG9jYWwgPSBOVUxMOworCXN0cnVjdCB4ZHJfbmV0b2JqICpvd25lciA9ICZybG9ja293bmVyLT5ybF9vd25lcjsKKwlpbnQgc3RhdHVzOworCisJZHByaW50aygibmZzZDRfcmVsZWFzZV9sb2Nrb3duZXIgY2xpZW50aWQ6ICglMDh4LyUwOHgpOlxuIiwKKwkJY2xpZC0+Y2xfYm9vdCwgY2xpZC0+Y2xfaWQpOworCisJLyogWFhYIGNoZWNrIGZvciBsZWFzZSBleHBpcmF0aW9uICovCisKKwlzdGF0dXMgPSBuZnNlcnJfc3RhbGVfY2xpZW50aWQ7CisJaWYgKFNUQUxFX0NMSUVOVElEKGNsaWQpKSB7CisJCXByaW50aygiTkZTRDogbmZzZDRfcmVsZWFzZV9sb2Nrb3duZXI6IGNsaWVudGlkIGlzIHN0YWxlIVxuIik7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJbmZzNF9sb2NrX3N0YXRlKCk7CisKKwlzdGF0dXMgPSBuZnNfb2s7CisJbG9jYWwgPSBmaW5kX2xvY2tzdGF0ZW93bmVyKG93bmVyLCBjbGlkKTsKKwlpZiAobG9jYWwpIHsKKwkJc3RydWN0IG5mczRfc3RhdGVpZCAqc3RwOworCisJCS8qIGNoZWNrIGZvciBhbnkgbG9ja3MgaGVsZCBieSBhbnkgc3RhdGVpZAorCQkgKiBhc3NvY2lhdGVkIHdpdGggdGhlIChsb2NrKSBzdGF0ZW93bmVyICovCisJCXN0YXR1cyA9IG5mc2Vycl9sb2Nrc19oZWxkOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN0cCwgJmxvY2FsLT5zb19wZXJmaWxlc3RhdGUsCisJCQkJc3RfcGVyZmlsZXN0YXRlKSB7CisJCQlpZiAoY2hlY2tfZm9yX2xvY2tzKHN0cC0+c3RfdmZzX2ZpbGUsIGxvY2FsKSkKKwkJCQlnb3RvIG91dDsKKwkJfQorCQkvKiBubyBsb2NrcyBoZWxkIGJ5IChsb2NrKSBzdGF0ZW93bmVyICovCisJCXN0YXR1cyA9IG5mc19vazsKKwkJcmVsZWFzZV9zdGF0ZW93bmVyKGxvY2FsKTsKKwl9CitvdXQ6CisJbmZzNF91bmxvY2tfc3RhdGUoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZnM0X2NsaWVudF9yZWNsYWltICoKK2FsbG9jX3JlY2xhaW0oaW50IG5hbWVsZW4pCit7CisJc3RydWN0IG5mczRfY2xpZW50X3JlY2xhaW0gKmNycCA9IE5VTEw7CisKKwljcnAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbmZzNF9jbGllbnRfcmVjbGFpbSksIEdGUF9LRVJORUwpOworCWlmICghY3JwKQorCQlyZXR1cm4gTlVMTDsKKwljcnAtPmNyX25hbWUuZGF0YSA9IGttYWxsb2MobmFtZWxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjcnAtPmNyX25hbWUuZGF0YSkgeworCQlrZnJlZShjcnApOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGNycDsKK30KKworLyoKKyAqIGZhaWx1cmUgPT4gYWxsIHJlc2V0IGJldHMgYXJlIG9mZiwgbmZzZXJyX25vX2dyYWNlLi4uCisgKi8KK3N0YXRpYyBpbnQKK25mczRfY2xpZW50X3RvX3JlY2xhaW0oY2hhciAqbmFtZSwgaW50IG5hbWxlbikKK3sKKwl1bnNpZ25lZCBpbnQgc3RyaGFzaHZhbDsKKwlzdHJ1Y3QgbmZzNF9jbGllbnRfcmVjbGFpbSAqY3JwID0gTlVMTDsKKworCWRwcmludGsoIk5GU0QgbmZzNF9jbGllbnRfdG9fcmVjbGFpbSBOQU1FOiAlLipzXG4iLCBuYW1sZW4sIG5hbWUpOworCWNycCA9IGFsbG9jX3JlY2xhaW0obmFtbGVuKTsKKwlpZiAoIWNycCkKKwkJcmV0dXJuIDA7CisJc3RyaGFzaHZhbCA9IGNsaWVudHN0cl9oYXNodmFsKG5hbWUsIG5hbWxlbik7CisJSU5JVF9MSVNUX0hFQUQoJmNycC0+Y3Jfc3RyaGFzaCk7CisJbGlzdF9hZGQoJmNycC0+Y3Jfc3RyaGFzaCwgJnJlY2xhaW1fc3RyX2hhc2h0Ymxbc3RyaGFzaHZhbF0pOworCW1lbWNweShjcnAtPmNyX25hbWUuZGF0YSwgbmFtZSwgbmFtbGVuKTsKKwljcnAtPmNyX25hbWUubGVuID0gbmFtbGVuOworCXJlY2xhaW1fc3RyX2hhc2h0Ymxfc2l6ZSsrOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAorbmZzNF9yZWxlYXNlX3JlY2xhaW0odm9pZCkKK3sKKwlzdHJ1Y3QgbmZzNF9jbGllbnRfcmVjbGFpbSAqY3JwID0gTlVMTDsKKwlpbnQgaTsKKworCUJVR19PTighbmZzNF9yZWNsYWltX2luaXQpOworCWZvciAoaSA9IDA7IGkgPCBDTElFTlRfSEFTSF9TSVpFOyBpKyspIHsKKwkJd2hpbGUgKCFsaXN0X2VtcHR5KCZyZWNsYWltX3N0cl9oYXNodGJsW2ldKSkgeworCQkJY3JwID0gbGlzdF9lbnRyeShyZWNsYWltX3N0cl9oYXNodGJsW2ldLm5leHQsCisJCQkgICAgICAgICAgICAgICAgc3RydWN0IG5mczRfY2xpZW50X3JlY2xhaW0sIGNyX3N0cmhhc2gpOworCQkJbGlzdF9kZWwoJmNycC0+Y3Jfc3RyaGFzaCk7CisJCQlrZnJlZShjcnAtPmNyX25hbWUuZGF0YSk7CisJCQlrZnJlZShjcnApOworCQkJcmVjbGFpbV9zdHJfaGFzaHRibF9zaXplLS07CisJCX0KKwl9CisJQlVHX09OKHJlY2xhaW1fc3RyX2hhc2h0Ymxfc2l6ZSk7Cit9CisKKy8qCisgKiBjYWxsZWQgZnJvbSBPUEVOLCBDTEFJTV9QUkVWSU9VUyB3aXRoIGEgbmV3IGNsaWVudGlkLiAqLworc3RydWN0IG5mczRfY2xpZW50X3JlY2xhaW0gKgorbmZzNF9maW5kX3JlY2xhaW1fY2xpZW50KGNsaWVudGlkX3QgKmNsaWQpCit7CisJdW5zaWduZWQgaW50IHN0cmhhc2h2YWw7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHA7CisJc3RydWN0IG5mczRfY2xpZW50X3JlY2xhaW0gKmNycCA9IE5VTEw7CisKKworCS8qIGZpbmQgY2xpZW50aWQgaW4gY29uZl9pZF9oYXNodGJsICovCisJY2xwID0gZmluZF9jb25maXJtZWRfY2xpZW50KGNsaWQpOworCWlmIChjbHAgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlkcHJpbnRrKCJORlNEOiBuZnM0X2ZpbmRfcmVjbGFpbV9jbGllbnQgZm9yICUuKnNcbiIsCisJCSAgICAgICAgICAgIGNscC0+Y2xfbmFtZS5sZW4sIGNscC0+Y2xfbmFtZS5kYXRhKTsKKworCS8qIGZpbmQgY2xwLT5jbF9uYW1lIGluIHJlY2xhaW1fc3RyX2hhc2h0YmwgKi8KKwlzdHJoYXNodmFsID0gY2xpZW50c3RyX2hhc2h2YWwoY2xwLT5jbF9uYW1lLmRhdGEsIGNscC0+Y2xfbmFtZS5sZW4pOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3JwLCAmcmVjbGFpbV9zdHJfaGFzaHRibFtzdHJoYXNodmFsXSwgY3Jfc3RyaGFzaCkgeworCQlpZiAoY21wX25hbWUoJmNycC0+Y3JfbmFtZSwgJmNscC0+Y2xfbmFtZSkpIHsKKwkJCXJldHVybiBjcnA7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisqIENhbGxlZCBmcm9tIE9QRU4uIExvb2sgZm9yIGNsaWVudGlkIGluIHJlY2xhaW0gbGlzdC4KKyovCitpbnQKK25mczRfY2hlY2tfb3Blbl9yZWNsYWltKGNsaWVudGlkX3QgKmNsaWQpCit7CisJc3RydWN0IG5mczRfY2xpZW50X3JlY2xhaW0gKmNycDsKKworCWlmICgoY3JwID0gbmZzNF9maW5kX3JlY2xhaW1fY2xpZW50KGNsaWQpKSA9PSBOVUxMKQorCQlyZXR1cm4gbmZzZXJyX3JlY2xhaW1fYmFkOworCXJldHVybiBuZnNfb2s7Cit9CisKKworLyogCisgKiBTdGFydCBhbmQgc3RvcCByb3V0aW5lcworICovCisKK3N0YXRpYyB2b2lkCitfX25mczRfc3RhdGVfaW5pdCh2b2lkKQoreworCWludCBpOworCXRpbWVfdCBncmFjZV90aW1lOworCisJaWYgKCFuZnM0X3JlY2xhaW1faW5pdCkgeworCQlmb3IgKGkgPSAwOyBpIDwgQ0xJRU5UX0hBU0hfU0laRTsgaSsrKQorCQkJSU5JVF9MSVNUX0hFQUQoJnJlY2xhaW1fc3RyX2hhc2h0YmxbaV0pOworCQlyZWNsYWltX3N0cl9oYXNodGJsX3NpemUgPSAwOworCQluZnM0X3JlY2xhaW1faW5pdCA9IDE7CisJfQorCWZvciAoaSA9IDA7IGkgPCBDTElFTlRfSEFTSF9TSVpFOyBpKyspIHsKKwkJSU5JVF9MSVNUX0hFQUQoJmNvbmZfaWRfaGFzaHRibFtpXSk7CisJCUlOSVRfTElTVF9IRUFEKCZjb25mX3N0cl9oYXNodGJsW2ldKTsKKwkJSU5JVF9MSVNUX0hFQUQoJnVuY29uZl9zdHJfaGFzaHRibFtpXSk7CisJCUlOSVRfTElTVF9IRUFEKCZ1bmNvbmZfaWRfaGFzaHRibFtpXSk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBGSUxFX0hBU0hfU0laRTsgaSsrKSB7CisJCUlOSVRfTElTVF9IRUFEKCZmaWxlX2hhc2h0YmxbaV0pOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgT1dORVJfSEFTSF9TSVpFOyBpKyspIHsKKwkJSU5JVF9MSVNUX0hFQUQoJm93bmVyc3RyX2hhc2h0YmxbaV0pOworCQlJTklUX0xJU1RfSEVBRCgmb3duZXJpZF9oYXNodGJsW2ldKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IFNUQVRFSURfSEFTSF9TSVpFOyBpKyspIHsKKwkJSU5JVF9MSVNUX0hFQUQoJnN0YXRlaWRfaGFzaHRibFtpXSk7CisJCUlOSVRfTElTVF9IRUFEKCZsb2Nrc3RhdGVpZF9oYXNodGJsW2ldKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IExPQ0tfSEFTSF9TSVpFOyBpKyspIHsKKwkJSU5JVF9MSVNUX0hFQUQoJmxvY2tfb3duZXJpZF9oYXNodGJsW2ldKTsKKwkJSU5JVF9MSVNUX0hFQUQoJmxvY2tfb3duZXJzdHJfaGFzaHRibFtpXSk7CisJfQorCW1lbXNldCgmemVyb3N0YXRlaWQsIDAsIHNpemVvZihzdGF0ZWlkX3QpKTsKKwltZW1zZXQoJm9uZXN0YXRlaWQsIH4wLCBzaXplb2Yoc3RhdGVpZF90KSk7CisKKwlJTklUX0xJU1RfSEVBRCgmY2xvc2VfbHJ1KTsKKwlJTklUX0xJU1RfSEVBRCgmY2xpZW50X2xydSk7CisJSU5JVF9MSVNUX0hFQUQoJmRlbF9yZWNhbGxfbHJ1KTsKKwlzcGluX2xvY2tfaW5pdCgmcmVjYWxsX2xvY2spOworCWJvb3RfdGltZSA9IGdldF9zZWNvbmRzKCk7CisJZ3JhY2VfdGltZSA9IG1heChvbGRfbGVhc2VfdGltZSwgbGVhc2VfdGltZSk7CisJaWYgKHJlY2xhaW1fc3RyX2hhc2h0Ymxfc2l6ZSA9PSAwKQorCQlncmFjZV90aW1lID0gMDsKKwlpZiAoZ3JhY2VfdGltZSkKKwkJcHJpbnRrKCJORlNEOiBzdGFydGluZyAlbGQtc2Vjb25kIGdyYWNlIHBlcmlvZFxuIiwgZ3JhY2VfdGltZSk7CisJZ3JhY2VfZW5kID0gYm9vdF90aW1lICsgZ3JhY2VfdGltZTsKKwlJTklUX1dPUksoJmxhdW5kcm9tYXRfd29yayxsYXVuZHJvbWF0X21haW4sIE5VTEwpOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmbGF1bmRyb21hdF93b3JrLCBORlNEX0xFQVNFX1RJTUUqSFopOworfQorCitpbnQKK25mczRfc3RhdGVfaW5pdCh2b2lkKQoreworCWludCBzdGF0dXM7CisKKwlpZiAobmZzNF9pbml0KQorCQlyZXR1cm4gMDsKKwlzdGF0dXMgPSBuZnNkNF9pbml0X3NsYWJzKCk7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKwlfX25mczRfc3RhdGVfaW5pdCgpOworCW5mczRfaW5pdCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK2ludAorbmZzNF9pbl9ncmFjZSh2b2lkKQoreworCXJldHVybiBnZXRfc2Vjb25kcygpIDwgZ3JhY2VfZW5kOworfQorCit2b2lkCitzZXRfbm9fZ3JhY2Uodm9pZCkKK3sKKwlwcmludGsoIk5GU0Q6IEVSUk9SIGluIHJlYm9vdCByZWNvdmVyeS4gIFN0YXRlIHJlY2xhaW1zIHdpbGwgZmFpbC5cbiIpOworCWdyYWNlX2VuZCA9IGdldF9zZWNvbmRzKCk7Cit9CisKK3RpbWVfdAorbmZzNF9sZWFzZV90aW1lKHZvaWQpCit7CisJcmV0dXJuIGxlYXNlX3RpbWU7Cit9CisKK3N0YXRpYyB2b2lkCitfX25mczRfc3RhdGVfc2h1dGRvd24odm9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgbmZzNF9jbGllbnQgKmNscCA9IE5VTEw7CisJc3RydWN0IG5mczRfZGVsZWdhdGlvbiAqZHAgPSBOVUxMOworCXN0cnVjdCBuZnM0X3N0YXRlb3duZXIgKnNvcCA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqcG9zLCAqbmV4dCwgcmVhcGxpc3Q7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBuZXh0LCAmY2xvc2VfbHJ1KSB7CisJCXNvcCA9IGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgbmZzNF9zdGF0ZW93bmVyLCBzb19jbG9zZV9scnUpOworCQlsaXN0X2RlbCgmc29wLT5zb19jbG9zZV9scnUpOworCQluZnM0X3B1dF9zdGF0ZW93bmVyKHNvcCk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IENMSUVOVF9IQVNIX1NJWkU7IGkrKykgeworCQl3aGlsZSAoIWxpc3RfZW1wdHkoJmNvbmZfaWRfaGFzaHRibFtpXSkpIHsKKwkJCWNscCA9IGxpc3RfZW50cnkoY29uZl9pZF9oYXNodGJsW2ldLm5leHQsIHN0cnVjdCBuZnM0X2NsaWVudCwgY2xfaWRoYXNoKTsKKwkJCWV4cGlyZV9jbGllbnQoY2xwKTsKKwkJfQorCQl3aGlsZSAoIWxpc3RfZW1wdHkoJnVuY29uZl9zdHJfaGFzaHRibFtpXSkpIHsKKwkJCWNscCA9IGxpc3RfZW50cnkodW5jb25mX3N0cl9oYXNodGJsW2ldLm5leHQsIHN0cnVjdCBuZnM0X2NsaWVudCwgY2xfc3RyaGFzaCk7CisJCQlleHBpcmVfY2xpZW50KGNscCk7CisJCX0KKwl9CisJSU5JVF9MSVNUX0hFQUQoJnJlYXBsaXN0KTsKKwlzcGluX2xvY2soJnJlY2FsbF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBuZXh0LCAmZGVsX3JlY2FsbF9scnUpIHsKKwkJZHAgPSBsaXN0X2VudHJ5IChwb3MsIHN0cnVjdCBuZnM0X2RlbGVnYXRpb24sIGRsX3JlY2FsbF9scnUpOworCQlsaXN0X21vdmUoJmRwLT5kbF9yZWNhbGxfbHJ1LCAmcmVhcGxpc3QpOworCX0KKwlzcGluX3VubG9jaygmcmVjYWxsX2xvY2spOworCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIG5leHQsICZyZWFwbGlzdCkgeworCQlkcCA9IGxpc3RfZW50cnkgKHBvcywgc3RydWN0IG5mczRfZGVsZWdhdGlvbiwgZGxfcmVjYWxsX2xydSk7CisJCWxpc3RfZGVsX2luaXQoJmRwLT5kbF9yZWNhbGxfbHJ1KTsKKwkJdW5oYXNoX2RlbGVnYXRpb24oZHApOworCX0KKworCXJlbGVhc2VfYWxsX2ZpbGVzKCk7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmbGF1bmRyb21hdF93b3JrKTsKKwlmbHVzaF9zY2hlZHVsZWRfd29yaygpOworCW5mczRfaW5pdCA9IDA7CisJZHByaW50aygiTkZTRDogbGlzdF9hZGRfcGVyZmlsZSAlZCBsaXN0X2RlbF9wZXJmaWxlICVkXG4iLAorCQkJbGlzdF9hZGRfcGVyZmlsZSwgbGlzdF9kZWxfcGVyZmlsZSk7CisJZHByaW50aygiTkZTRDogYWRkX3BlcmNsaWVudCAlZCBkZWxfcGVyY2xpZW50ICVkXG4iLAorCQkJYWRkX3BlcmNsaWVudCwgZGVsX3BlcmNsaWVudCk7CisJZHByaW50aygiTkZTRDogYWxsb2NfZmlsZSAlZCBmcmVlX2ZpbGUgJWRcbiIsCisJCQlhbGxvY19maWxlLCBmcmVlX2ZpbGUpOworCWRwcmludGsoIk5GU0Q6IHZmc29wZW4gJWQgdmZzY2xvc2UgJWRcbiIsCisJCQl2ZnNvcGVuLCB2ZnNjbG9zZSk7CisJZHByaW50aygiTkZTRDogYWxsb2NfZGVsZWdhdGlvbiAlZCBmcmVlX2RlbGVnYXRpb24gJWRcbiIsCisJCQlhbGxvY19kZWxlZ2F0aW9uLCBmcmVlX2RlbGVnYXRpb24pOworCit9CisKK3ZvaWQKK25mczRfc3RhdGVfc2h1dGRvd24odm9pZCkKK3sKKwluZnM0X2xvY2tfc3RhdGUoKTsKKwluZnM0X3JlbGVhc2VfcmVjbGFpbSgpOworCV9fbmZzNF9zdGF0ZV9zaHV0ZG93bigpOworCW5mc2Q0X2ZyZWVfc2xhYnMoKTsKKwluZnM0X3VubG9ja19zdGF0ZSgpOworfQorCisvKgorICogQ2FsbGVkIHdoZW4gbGVhc2V0aW1lIGlzIGNoYW5nZWQuCisgKgorICogaWYgbmZzZCBpcyBub3Qgc3RhcnRlZCwgc2ltcGx5IHNldCB0aGUgZ2xvYmFsIGxlYXNlLgorICoKKyAqIGlmIG5mc2QocykgYXJlIHJ1bm5pbmcsIGxlYXNlIGNoYW5nZSByZXF1aXJlcyBuZnN2NCBzdGF0ZSB0byBiZSByZXNldC4KKyAqIGUuZzogYm9vdF90aW1lIGlzIHJlc2V0LCBleGlzdGluZyBuZnM0X2NsaWVudCBzdHJ1Y3RzIGFyZQorICogdXNlZCB0byBmaWxsIHJlY2xhaW1fc3RyX2hhc2h0YmwsIHRoZW4gYWxsIHN0YXRlIChleGNlcHQgZm9yIHRoZQorICogcmVjbGFpbV9zdHJfaGFzaHRibCkgaXMgcmUtaW5pdGlhbGl6ZWQuCisgKgorICogaWYgdGhlIG9sZCBsZWFzZSB0aW1lIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbmV3IGxlYXNlIHRpbWUsIHRoZSBncmFjZQorICogcGVyaW9kIG5lZWRzIHRvIGJlIHNldCB0byB0aGUgb2xkIGxlYXNlIHRpbWUgdG8gYWxsb3cgY2xpZW50cyB0byByZWNsYWltCisgKiB0aGVpciBzdGF0ZS4gWFhYIC0gd2UgbWF5IHdhbnQgdG8gc2V0IHRoZSBncmFjZSBwZXJpb2QgPT0gbGVhc2UgdGltZQorICogYWZ0ZXIgYW4gaW5pdGlhbCBncmFjZSBwZXJpb2QgPT0gb2xkIGxlYXNlIHRpbWUKKyAqCisgKiBpZiBhbiBlcnJvciBvY2N1cnMgaW4gdGhpcyBwcm9jZXNzLCB0aGUgbmV3IGxlYXNlIGlzIHNldCwgYnV0IHRoZSBzZXJ2ZXIKKyAqIHdpbGwgbm90IGhvbm9yIE9QRU4gb3IgTE9DSyByZWNsYWltcywgYW5kIHdpbGwgcmV0dXJuIG5mc2Vycl9ub19ncmFjZQorICogd2hpY2ggbWVhbnMgT1BFTi9MT0NLL1JFQUQvV1JJVEUgd2lsbCBmYWlsIGR1cmluZyBncmFjZSBwZXJpb2QuCisgKgorICogY2xpZW50cyB3aWxsIGF0dGVtcHQgdG8gcmVzZXQgYWxsIHN0YXRlIHdpdGggU0VUQ0xJRU5USUQvQ09ORklSTSwgYW5kCisgKiBPUEVOIGFuZCBMT0NLIHJlY2xhaW1zLgorICovCit2b2lkCituZnM0X3Jlc2V0X2xlYXNlKHRpbWVfdCBsZWFzZXRpbWUpCit7CisJc3RydWN0IG5mczRfY2xpZW50ICpjbHA7CisJaW50IGk7CisKKwlwcmludGsoIk5GU0Q6IE5ldyBsZWFzZXRpbWUgJWxkXG4iLGxlYXNldGltZSk7CisJaWYgKCFuZnM0X2luaXQpCisJCXJldHVybjsKKwluZnM0X2xvY2tfc3RhdGUoKTsKKwlvbGRfbGVhc2VfdGltZSA9IGxlYXNlX3RpbWU7CisJbGVhc2VfdGltZSA9IGxlYXNldGltZTsKKworCW5mczRfcmVsZWFzZV9yZWNsYWltKCk7CisKKwkvKiBwb3B1bGF0ZSByZWNsYWltX3N0cl9oYXNodGJsIHdpdGggY3VycmVudCBjb25maXJtZWQgbmZzNF9jbGllbnRpZCAqLworCWZvciAoaSA9IDA7IGkgPCBDTElFTlRfSEFTSF9TSVpFOyBpKyspIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShjbHAsICZjb25mX2lkX2hhc2h0YmxbaV0sIGNsX2lkaGFzaCkgeworCQkJaWYgKCFuZnM0X2NsaWVudF90b19yZWNsYWltKGNscC0+Y2xfbmFtZS5kYXRhLAorCQkJCQkJY2xwLT5jbF9uYW1lLmxlbikpIHsKKwkJCQluZnM0X3JlbGVhc2VfcmVjbGFpbSgpOworCQkJCWdvdG8gaW5pdF9zdGF0ZTsKKwkJCX0KKwkJfQorCX0KK2luaXRfc3RhdGU6CisJX19uZnM0X3N0YXRlX3NodXRkb3duKCk7CisJX19uZnM0X3N0YXRlX2luaXQoKTsKKwluZnM0X3VubG9ja19zdGF0ZSgpOworfQorCmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczR4ZHIuYyBiL2ZzL25mc2QvbmZzNHhkci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YTA1OGEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnNkL25mczR4ZHIuYwpAQCAtMCwwICsxLDI1MzYgQEAKKy8qCisgKiAgZnMvbmZzL25mczR4ZHIuYworICoKKyAqICBTZXJ2ZXItc2lkZSBYRFIgZm9yIE5GU3Y0CisgKgorICogIENvcHlyaWdodCAoYykgMjAwMiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBNaWNoaWdhbi4KKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBLZW5kcmljayBTbWl0aCA8a21zbWl0aEB1bWljaC5lZHU+CisgKiAgQW5keSBBZGFtc29uICAgPGFuZHJvc0B1bWljaC5lZHU+CisgKgorICogIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogIGFyZSBtZXQ6CisgKgorICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKKyAqICBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiAgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiAgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCisgKiAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiAgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogVE9ETzogTmVpbCBCcm93biBtYWRlIHRoZSBmb2xsb3dpbmcgb2JzZXJ2YXRpb246ICBXZSBjdXJyZW50bHkKKyAqIGluaXRpYWxseSByZXNlcnZlIE5GU0RfQlVGU0laRSBzcGFjZSBvbiB0aGUgdHJhbnNtaXQgcXVldWUgYW5kCisgKiBuZXZlciByZWxlYXNlIGFueSBvZiB0aGF0IHVudGlsIHRoZSByZXF1ZXN0IGlzIGNvbXBsZXRlLgorICogSXQgd291bGQgYmUgZ29vZCB0byBjYWxjdWxhdGUgYSBuZXcgbWF4aW11bSByZXNwb25zZSBzaXplIHdoaWxlCisgKiBkZWNvZGluZyB0aGUgQ09NUE9VTkQsIGFuZCBjYWxsIHN2Y19yZXNlcnZlIHdpdGggdGhpcyBudW1iZXIKKyAqIGF0IHRoZSBlbmQgb2YgbmZzNHN2Y19kZWNvZGVfY29tcG91bmRhcmdzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy94ZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL25mc2QuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL3N0YXRlLmg+CisjaW5jbHVkZSA8bGludXgvbmZzZC94ZHI0Lmg+CisjaW5jbHVkZSA8bGludXgvbmZzZF9pZG1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L25mczQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnM0X2FjbC5oPgorCisjZGVmaW5lIE5GU0REQkdfRkFDSUxJVFkJCU5GU0REQkdfWERSCisKK3N0YXRpYyBpbnQKK2NoZWNrX2ZpbGVuYW1lKGNoYXIgKnN0ciwgaW50IGxlbiwgaW50IGVycikKK3sKKwlpbnQgaTsKKworCWlmIChsZW4gPT0gMCkKKwkJcmV0dXJuIG5mc2Vycl9pbnZhbDsKKwlpZiAoaXNkb3RlbnQoc3RyLCBsZW4pKQorCQlyZXR1cm4gZXJyOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJaWYgKHN0cltpXSA9PSAnLycpCisJCQlyZXR1cm4gZXJyOworCXJldHVybiAwOworfQorCisvKgorICogU1RBUlQgT0YgIkdFTkVSSUMiIERFQ09ERSBST1VUSU5FUy4KKyAqICAgVGhlc2UgbWF5IGxvb2sgYSBsaXR0bGUgdWdseSBzaW5jZSB0aGV5IGFyZSBpbXBvcnRlZCBmcm9tIGEgImdlbmVyaWMiCisgKiBzZXQgb2YgWERSIGVuY29kZS9kZWNvZGUgcm91dGluZXMgd2hpY2ggYXJlIGludGVuZGVkIHRvIGJlIHNoYXJlZCBieQorICogYWxsIG9mIG91ciBORlN2NCBpbXBsZW1lbnRhdGlvbnMgKE9wZW5CU0QsIE1hY09TIFguLi4pLgorICoKKyAqIElmIHRoZSBwYWluIG9mIHJlYWRpbmcgdGhlc2UgaXMgdG9vIGdyZWF0LCBpdCBzaG91bGQgYmUgYSBzdHJhaWdodGZvcndhcmQKKyAqIHRhc2sgdG8gdHJhbnNsYXRlIHRoZW0gaW50byBMaW51eC1zcGVjaWZpYyB2ZXJzaW9ucyB3aGljaCBhcmUgbW9yZQorICogY29uc2lzdGVudCB3aXRoIHRoZSBzdHlsZSB1c2VkIGluIE5GU3YyL3YzLi4uCisgKi8KKyNkZWZpbmUgREVDT0RFX0hFQUQJCQkJXAorCXUzMiAqcDsJCQkJCVwKKwlpbnQgc3RhdHVzCisjZGVmaW5lIERFQ09ERV9UQUlMCQkJCVwKKwlzdGF0dXMgPSAwOwkJCQlcCitvdXQ6CQkJCQkJXAorCXJldHVybiBzdGF0dXM7CQkJCVwKK3hkcl9lcnJvcjoJCQkJCVwKKwlwcmludGsoS0VSTl9OT1RJQ0UgInhkciBlcnJvciEgKCVzOiVkKVxuIiwgX19GSUxFX18sIF9fTElORV9fKTsJXAorCXN0YXR1cyA9IG5mc2Vycl9iYWRfeGRyOwkJXAorCWdvdG8gb3V0CisKKyNkZWZpbmUgUkVBRDMyKHgpICAgICAgICAgKHgpID0gbnRvaGwoKnArKykKKyNkZWZpbmUgUkVBRDY0KHgpICAgICAgICAgZG8gewkJCVwKKwkoeCkgPSAodTY0KW50b2hsKCpwKyspIDw8IDMyOwkJXAorCSh4KSB8PSBudG9obCgqcCsrKTsJCQlcCit9IHdoaWxlICgwKQorI2RlZmluZSBSRUFEVElNRSh4KSAgICAgICBkbyB7CQkJXAorCXArKzsJCQkJCVwKKwkoeCkgPSBudG9obCgqcCsrKTsJCQlcCisJcCsrOwkJCQkJXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgUkVBRE1FTSh4LG5ieXRlcykgZG8gewkJCVwKKwl4ID0gKGNoYXIgKilwOwkJCQlcCisJcCArPSBYRFJfUVVBRExFTihuYnl0ZXMpOwkJXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgU0FWRU1FTSh4LG5ieXRlcykgZG8gewkJCVwKKwlpZiAoISh4ID0gKHA9PWFyZ3AtPnRtcCB8fCBwID09IGFyZ3AtPnRtcHApID8gXAorIAkJc2F2ZW1lbShhcmdwLCBwLCBuYnl0ZXMpIDoJXAorIAkJKGNoYXIgKilwKSkgewkJCVwKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJ4ZHIgZXJyb3IhICglczolZClcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyk7IFwKKwkJZ290byB4ZHJfZXJyb3I7CQkJXAorCQl9CQkJCVwKKwlwICs9IFhEUl9RVUFETEVOKG5ieXRlcyk7CQlcCit9IHdoaWxlICgwKQorI2RlZmluZSBDT1BZTUVNKHgsbmJ5dGVzKSBkbyB7CQkJXAorCW1lbWNweSgoeCksIHAsIG5ieXRlcyk7CQkJXAorCXAgKz0gWERSX1FVQURMRU4obmJ5dGVzKTsJCVwKK30gd2hpbGUgKDApCisKKy8qIFJFQURfQlVGLCByZWFkX2J1ZigpOiBuYnl0ZXMgbXVzdCBiZSA8PSBQQUdFX1NJWkUgKi8KKyNkZWZpbmUgUkVBRF9CVUYobmJ5dGVzKSAgZG8gewkJCVwKKwlpZiAobmJ5dGVzIDw9ICh1MzIpKChjaGFyICopYXJncC0+ZW5kIC0gKGNoYXIgKilhcmdwLT5wKSkgewlcCisJCXAgPSBhcmdwLT5wOwkJCVwKKwkJYXJncC0+cCArPSBYRFJfUVVBRExFTihuYnl0ZXMpOwlcCisJfSBlbHNlIGlmICghKHAgPSByZWFkX2J1ZihhcmdwLCBuYnl0ZXMpKSkgeyBcCisJCXByaW50ayhLRVJOX05PVElDRSAieGRyIGVycm9yISAoJXM6JWQpXG4iLCBfX0ZJTEVfXywgX19MSU5FX18pOyBcCisJCWdvdG8geGRyX2Vycm9yOwkJCVwKKwl9CQkJCQlcCit9IHdoaWxlICgwKQorCit1MzIgKnJlYWRfYnVmKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIGludCBuYnl0ZXMpCit7CisJLyogV2Ugd2FudCBtb3JlIGJ5dGVzIHRoYW4gc2VlbSB0byBiZSBhdmFpbGFibGUuCisJICogTWF5YmUgd2UgbmVlZCBhIG5ldyBwYWdlLCBtYXliZSB3ZSBoYXZlIGp1c3QgcnVuIG91dAorCSAqLworCWludCBhdmFpbCA9IChjaGFyKilhcmdwLT5lbmQgLSAoY2hhciopYXJncC0+cDsKKwl1MzIgKnA7CisJaWYgKGF2YWlsICsgYXJncC0+cGFnZWxlbiA8IG5ieXRlcykKKwkJcmV0dXJuIE5VTEw7CisJaWYgKGF2YWlsICsgUEFHRV9TSVpFIDwgbmJ5dGVzKSAvKiBuZWVkIG1vcmUgdGhhbiBhIHBhZ2UgISEgKi8KKwkJcmV0dXJuIE5VTEw7CisJLyogb2ssIHdlIGNhbiBkbyBpdCB3aXRoIHRoZSBjdXJyZW50IHBsdXMgdGhlIG5leHQgcGFnZSAqLworCWlmIChuYnl0ZXMgPD0gc2l6ZW9mKGFyZ3AtPnRtcCkpCisJCXAgPSBhcmdwLT50bXA7CisJZWxzZSB7CisJCWlmIChhcmdwLT50bXBwKQorCQkJa2ZyZWUoYXJncC0+dG1wcCk7CisJCXAgPSBhcmdwLT50bXBwID0ga21hbGxvYyhuYnl0ZXMsIEdGUF9LRVJORUwpOworCQlpZiAoIXApCisJCQlyZXR1cm4gTlVMTDsKKwkJCisJfQorCW1lbWNweShwLCBhcmdwLT5wLCBhdmFpbCk7CisJLyogc3RlcCB0byBuZXh0IHBhZ2UgKi8KKwlhcmdwLT5wID0gcGFnZV9hZGRyZXNzKGFyZ3AtPnBhZ2VsaXN0WzBdKTsKKwlhcmdwLT5wYWdlbGlzdCsrOworCWlmIChhcmdwLT5wYWdlbGVuIDwgUEFHRV9TSVpFKSB7CisJCWFyZ3AtPmVuZCA9IHAgKyAoYXJncC0+cGFnZWxlbj4+Mik7CisJCWFyZ3AtPnBhZ2VsZW4gPSAwOworCX0gZWxzZSB7CisJCWFyZ3AtPmVuZCA9IHAgKyAoUEFHRV9TSVpFPj4yKTsKKwkJYXJncC0+cGFnZWxlbiAtPSBQQUdFX1NJWkU7CisJfQorCW1lbWNweSgoKGNoYXIqKXApK2F2YWlsLCBhcmdwLT5wLCAobmJ5dGVzIC0gYXZhaWwpKTsKKwlhcmdwLT5wICs9IFhEUl9RVUFETEVOKG5ieXRlcyAtIGF2YWlsKTsKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIGludAorZGVmZXJfZnJlZShzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLAorCQl2b2lkICgqcmVsZWFzZSkoY29uc3Qgdm9pZCAqKSwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgdG1wYnVmICp0YjsKKworCXRiID0ga21hbGxvYyhzaXplb2YoKnRiKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0YikKKwkJcmV0dXJuIC1FTk9NRU07CisJdGItPmJ1ZiA9IHA7CisJdGItPnJlbGVhc2UgPSByZWxlYXNlOworCXRiLT5uZXh0ID0gYXJncC0+dG9fZnJlZTsKKwlhcmdwLT50b19mcmVlID0gdGI7CisJcmV0dXJuIDA7Cit9CisKK2NoYXIgKnNhdmVtZW0oc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgdTMyICpwLCBpbnQgbmJ5dGVzKQoreworCXZvaWQgKm5ldyA9IE5VTEw7CisJaWYgKHAgPT0gYXJncC0+dG1wKSB7CisJCW5ldyA9IGttYWxsb2MobmJ5dGVzLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFuZXcpIHJldHVybiBOVUxMOworCQlwID0gbmV3OworCQltZW1jcHkocCwgYXJncC0+dG1wLCBuYnl0ZXMpOworCX0gZWxzZSB7CisJCWlmIChwICE9IGFyZ3AtPnRtcHApCisJCQlCVUcoKTsKKwkJYXJncC0+dG1wcCA9IE5VTEw7CisJfQorCWlmIChkZWZlcl9mcmVlKGFyZ3AsIGtmcmVlLCBwKSkgeworCQlrZnJlZShuZXcpOworCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UKKwkJcmV0dXJuIChjaGFyICopcDsKK30KKworCitzdGF0aWMgaW50CituZnNkNF9kZWNvZGVfYml0bWFwKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHUzMiAqYm12YWwpCit7CisJdTMyIGJtbGVuOworCURFQ09ERV9IRUFEOworCisJYm12YWxbMF0gPSAwOworCWJtdmFsWzFdID0gMDsKKworCVJFQURfQlVGKDQpOworCVJFQUQzMihibWxlbik7CisJaWYgKGJtbGVuID4gMTAwMCkKKwkJZ290byB4ZHJfZXJyb3I7CisKKwlSRUFEX0JVRihibWxlbiA8PCAyKTsKKwlpZiAoYm1sZW4gPiAwKQorCQlSRUFEMzIoYm12YWxbMF0pOworCWlmIChibWxlbiA+IDEpCisJCVJFQUQzMihibXZhbFsxXSk7CisKKwlERUNPREVfVEFJTDsKK30KKworc3RhdGljIGludAorbmZzZDRfZGVjb2RlX2ZhdHRyKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHUzMiAqYm12YWwsIHN0cnVjdCBpYXR0ciAqaWF0dHIsCisgICAgc3RydWN0IG5mczRfYWNsICoqYWNsKQoreworCWludCBleHBlY3RlZF9sZW4sIGxlbiA9IDA7CisJdTMyIGR1bW15MzI7CisJY2hhciAqYnVmOworCisJREVDT0RFX0hFQUQ7CisJaWF0dHItPmlhX3ZhbGlkID0gMDsKKwlpZiAoKHN0YXR1cyA9IG5mc2Q0X2RlY29kZV9iaXRtYXAoYXJncCwgYm12YWwpKSkKKwkJcmV0dXJuIHN0YXR1czsKKworCS8qCisJICogQWNjb3JkaW5nIHRvIHNwZWMsIHVuc3VwcG9ydGVkIGF0dHJpYnV0ZXMgcmV0dXJuIEVSUl9OT1RTVVBQOworCSAqIHJlYWQtb25seSBhdHRyaWJ1dGVzIHJldHVybiBFUlJfSU5WQUwuCisJICovCisJaWYgKChibXZhbFswXSAmIH5ORlNEX1NVUFBPUlRFRF9BVFRSU19XT1JEMCkgfHwgKGJtdmFsWzFdICYgfk5GU0RfU1VQUE9SVEVEX0FUVFJTX1dPUkQxKSkKKwkJcmV0dXJuIG5mc2Vycl9hdHRybm90c3VwcDsKKwlpZiAoKGJtdmFsWzBdICYgfk5GU0RfV1JJVEVBQkxFX0FUVFJTX1dPUkQwKSB8fCAoYm12YWxbMV0gJiB+TkZTRF9XUklURUFCTEVfQVRUUlNfV09SRDEpKQorCQlyZXR1cm4gbmZzZXJyX2ludmFsOworCisJUkVBRF9CVUYoNCk7CisJUkVBRDMyKGV4cGVjdGVkX2xlbik7CisKKwlpZiAoYm12YWxbMF0gJiBGQVRUUjRfV09SRDBfU0laRSkgeworCQlSRUFEX0JVRig4KTsKKwkJbGVuICs9IDg7CisJCVJFQUQ2NChpYXR0ci0+aWFfc2l6ZSk7CisJCWlhdHRyLT5pYV92YWxpZCB8PSBBVFRSX1NJWkU7CisJfQorCWlmIChibXZhbFswXSAmIEZBVFRSNF9XT1JEMF9BQ0wpIHsKKwkJaW50IG5hY2UsIGk7CisJCXN0cnVjdCBuZnM0X2FjZSBhY2U7CisKKwkJUkVBRF9CVUYoNCk7IGxlbiArPSA0OworCQlSRUFEMzIobmFjZSk7CisKKwkJKmFjbCA9IG5mczRfYWNsX25ldygpOworCQlpZiAoKmFjbCA9PSBOVUxMKSB7CisJCQlzdGF0dXMgPSAtRU5PTUVNOworCQkJZ290byBvdXRfbmZzZXJyOworCQl9CisJCWRlZmVyX2ZyZWUoYXJncCwgKHZvaWQgKCopKGNvbnN0IHZvaWQgKikpbmZzNF9hY2xfZnJlZSwgKmFjbCk7CisKKwkJZm9yIChpID0gMDsgaSA8IG5hY2U7IGkrKykgeworCQkJUkVBRF9CVUYoMTYpOyBsZW4gKz0gMTY7CisJCQlSRUFEMzIoYWNlLnR5cGUpOworCQkJUkVBRDMyKGFjZS5mbGFnKTsKKwkJCVJFQUQzMihhY2UuYWNjZXNzX21hc2spOworCQkJUkVBRDMyKGR1bW15MzIpOworCQkJUkVBRF9CVUYoZHVtbXkzMik7CisJCQlsZW4gKz0gWERSX1FVQURMRU4oZHVtbXkzMikgPDwgMjsKKwkJCVJFQURNRU0oYnVmLCBkdW1teTMyKTsKKwkJCWFjZS53aG90eXBlID0gbmZzNF9hY2xfZ2V0X3dob3R5cGUoYnVmLCBkdW1teTMyKTsKKwkJCXN0YXR1cyA9IDA7CisJCQlpZiAoYWNlLndob3R5cGUgIT0gTkZTNF9BQ0xfV0hPX05BTUVEKQorCQkJCWFjZS53aG8gPSAwOworCQkJZWxzZSBpZiAoYWNlLmZsYWcgJiBORlM0X0FDRV9JREVOVElGSUVSX0dST1VQKQorCQkJCXN0YXR1cyA9IG5mc2RfbWFwX25hbWVfdG9fZ2lkKGFyZ3AtPnJxc3RwLAorCQkJCQkJYnVmLCBkdW1teTMyLCAmYWNlLndobyk7CisJCQllbHNlCisJCQkJc3RhdHVzID0gbmZzZF9tYXBfbmFtZV90b191aWQoYXJncC0+cnFzdHAsCisJCQkJCQlidWYsIGR1bW15MzIsICZhY2Uud2hvKTsKKwkJCWlmIChzdGF0dXMpCisJCQkJZ290byBvdXRfbmZzZXJyOworCQkJaWYgKG5mczRfYWNsX2FkZF9hY2UoKmFjbCwgYWNlLnR5cGUsIGFjZS5mbGFnLAorCQkJCSBhY2UuYWNjZXNzX21hc2ssIGFjZS53aG90eXBlLCBhY2Uud2hvKSAhPSAwKSB7CisJCQkJc3RhdHVzID0gLUVOT01FTTsKKwkJCQlnb3RvIG91dF9uZnNlcnI7CisJCQl9CisJCX0KKwl9IGVsc2UKKwkJKmFjbCA9IE5VTEw7CisJaWYgKGJtdmFsWzFdICYgRkFUVFI0X1dPUkQxX01PREUpIHsKKwkJUkVBRF9CVUYoNCk7CisJCWxlbiArPSA0OworCQlSRUFEMzIoaWF0dHItPmlhX21vZGUpOworCQlpYXR0ci0+aWFfbW9kZSAmPSAoU19JRk1UIHwgU19JQUxMVUdPKTsKKwkJaWF0dHItPmlhX3ZhbGlkIHw9IEFUVFJfTU9ERTsKKwl9CisJaWYgKGJtdmFsWzFdICYgRkFUVFI0X1dPUkQxX09XTkVSKSB7CisJCVJFQURfQlVGKDQpOworCQlsZW4gKz0gNDsKKwkJUkVBRDMyKGR1bW15MzIpOworCQlSRUFEX0JVRihkdW1teTMyKTsKKwkJbGVuICs9IChYRFJfUVVBRExFTihkdW1teTMyKSA8PCAyKTsKKwkJUkVBRE1FTShidWYsIGR1bW15MzIpOworCQlpZiAoKHN0YXR1cyA9IG5mc2RfbWFwX25hbWVfdG9fdWlkKGFyZ3AtPnJxc3RwLCBidWYsIGR1bW15MzIsICZpYXR0ci0+aWFfdWlkKSkpCisJCQlnb3RvIG91dF9uZnNlcnI7CisJCWlhdHRyLT5pYV92YWxpZCB8PSBBVFRSX1VJRDsKKwl9CisJaWYgKGJtdmFsWzFdICYgRkFUVFI0X1dPUkQxX09XTkVSX0dST1VQKSB7CisJCVJFQURfQlVGKDQpOworCQlsZW4gKz0gNDsKKwkJUkVBRDMyKGR1bW15MzIpOworCQlSRUFEX0JVRihkdW1teTMyKTsKKwkJbGVuICs9IChYRFJfUVVBRExFTihkdW1teTMyKSA8PCAyKTsKKwkJUkVBRE1FTShidWYsIGR1bW15MzIpOworCQlpZiAoKHN0YXR1cyA9IG5mc2RfbWFwX25hbWVfdG9fZ2lkKGFyZ3AtPnJxc3RwLCBidWYsIGR1bW15MzIsICZpYXR0ci0+aWFfZ2lkKSkpCisJCQlnb3RvIG91dF9uZnNlcnI7CisJCWlhdHRyLT5pYV92YWxpZCB8PSBBVFRSX0dJRDsKKwl9CisJaWYgKGJtdmFsWzFdICYgRkFUVFI0X1dPUkQxX1RJTUVfQUNDRVNTX1NFVCkgeworCQlSRUFEX0JVRig0KTsKKwkJbGVuICs9IDQ7CisJCVJFQUQzMihkdW1teTMyKTsKKwkJc3dpdGNoIChkdW1teTMyKSB7CisJCWNhc2UgTkZTNF9TRVRfVE9fQ0xJRU5UX1RJTUU6CisJCQkvKiBXZSByZXF1aXJlIHRoZSBoaWdoIDMyIGJpdHMgb2YgJ3NlY29uZHMnIHRvIGJlIDAsIGFuZCB3ZSBpZ25vcmUKKwkJCSAgIGFsbCAzMiBiaXRzIG9mICduc2Vjb25kcycuICovCisJCQlSRUFEX0JVRigxMik7CisJCQlsZW4gKz0gMTI7CisJCQlSRUFEMzIoZHVtbXkzMik7CisJCQlpZiAoZHVtbXkzMikKKwkJCQlyZXR1cm4gbmZzZXJyX2ludmFsOworCQkJUkVBRDMyKGlhdHRyLT5pYV9hdGltZS50dl9zZWMpOworCQkJUkVBRDMyKGlhdHRyLT5pYV9hdGltZS50dl9uc2VjKTsKKwkJCWlmIChpYXR0ci0+aWFfYXRpbWUudHZfbnNlYyA+PSAodTMyKTEwMDAwMDAwMDApCisJCQkJcmV0dXJuIG5mc2Vycl9pbnZhbDsKKwkJCWlhdHRyLT5pYV92YWxpZCB8PSAoQVRUUl9BVElNRSB8IEFUVFJfQVRJTUVfU0VUKTsKKwkJCWJyZWFrOworCQljYXNlIE5GUzRfU0VUX1RPX1NFUlZFUl9USU1FOgorCQkJaWF0dHItPmlhX3ZhbGlkIHw9IEFUVFJfQVRJTUU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8geGRyX2Vycm9yOworCQl9CisJfQorCWlmIChibXZhbFsxXSAmIEZBVFRSNF9XT1JEMV9USU1FX01FVEFEQVRBKSB7CisJCS8qIFdlIHJlcXVpcmUgdGhlIGhpZ2ggMzIgYml0cyBvZiAnc2Vjb25kcycgdG8gYmUgMCwgYW5kIHdlIGlnbm9yZQorCQkgICBhbGwgMzIgYml0cyBvZiAnbnNlY29uZHMnLiAqLworCQlSRUFEX0JVRigxMik7CisJCWxlbiArPSAxMjsKKwkJUkVBRDMyKGR1bW15MzIpOworCQlpZiAoZHVtbXkzMikKKwkJCXJldHVybiBuZnNlcnJfaW52YWw7CisJCVJFQUQzMihpYXR0ci0+aWFfY3RpbWUudHZfc2VjKTsKKwkJUkVBRDMyKGlhdHRyLT5pYV9jdGltZS50dl9uc2VjKTsKKwkJaWYgKGlhdHRyLT5pYV9jdGltZS50dl9uc2VjID49ICh1MzIpMTAwMDAwMDAwMCkKKwkJCXJldHVybiBuZnNlcnJfaW52YWw7CisJCWlhdHRyLT5pYV92YWxpZCB8PSBBVFRSX0NUSU1FOworCX0KKwlpZiAoYm12YWxbMV0gJiBGQVRUUjRfV09SRDFfVElNRV9NT0RJRllfU0VUKSB7CisJCVJFQURfQlVGKDQpOworCQlsZW4gKz0gNDsKKwkJUkVBRDMyKGR1bW15MzIpOworCQlzd2l0Y2ggKGR1bW15MzIpIHsKKwkJY2FzZSBORlM0X1NFVF9UT19DTElFTlRfVElNRToKKwkJCS8qIFdlIHJlcXVpcmUgdGhlIGhpZ2ggMzIgYml0cyBvZiAnc2Vjb25kcycgdG8gYmUgMCwgYW5kIHdlIGlnbm9yZQorCQkJICAgYWxsIDMyIGJpdHMgb2YgJ25zZWNvbmRzJy4gKi8KKwkJCVJFQURfQlVGKDEyKTsKKwkJCWxlbiArPSAxMjsKKwkJCVJFQUQzMihkdW1teTMyKTsKKwkJCWlmIChkdW1teTMyKQorCQkJCXJldHVybiBuZnNlcnJfaW52YWw7CisJCQlSRUFEMzIoaWF0dHItPmlhX210aW1lLnR2X3NlYyk7CisJCQlSRUFEMzIoaWF0dHItPmlhX210aW1lLnR2X25zZWMpOworCQkJaWYgKGlhdHRyLT5pYV9tdGltZS50dl9uc2VjID49ICh1MzIpMTAwMDAwMDAwMCkKKwkJCQlyZXR1cm4gbmZzZXJyX2ludmFsOworCQkJaWF0dHItPmlhX3ZhbGlkIHw9IChBVFRSX01USU1FIHwgQVRUUl9NVElNRV9TRVQpOworCQkJYnJlYWs7CisJCWNhc2UgTkZTNF9TRVRfVE9fU0VSVkVSX1RJTUU6CisJCQlpYXR0ci0+aWFfdmFsaWQgfD0gQVRUUl9NVElNRTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byB4ZHJfZXJyb3I7CisJCX0KKwl9CisJaWYgKGxlbiAhPSBleHBlY3RlZF9sZW4pCisJCWdvdG8geGRyX2Vycm9yOworCisJREVDT0RFX1RBSUw7CisKK291dF9uZnNlcnI6CisJc3RhdHVzID0gbmZzZXJybm8oc3RhdHVzKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIGludAorbmZzZDRfZGVjb2RlX2FjY2VzcyhzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfYWNjZXNzICphY2Nlc3MpCit7CisJREVDT0RFX0hFQUQ7CisKKwlSRUFEX0JVRig0KTsKKwlSRUFEMzIoYWNjZXNzLT5hY19yZXFfYWNjZXNzKTsKKworCURFQ09ERV9UQUlMOworfQorCitzdGF0aWMgaW50CituZnNkNF9kZWNvZGVfY2xvc2Uoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X2Nsb3NlICpjbG9zZSkKK3sKKwlERUNPREVfSEVBRDsKKworCWNsb3NlLT5jbF9zdGF0ZW93bmVyID0gTlVMTDsKKwlSRUFEX0JVRig0ICsgc2l6ZW9mKHN0YXRlaWRfdCkpOworCVJFQUQzMihjbG9zZS0+Y2xfc2VxaWQpOworCVJFQUQzMihjbG9zZS0+Y2xfc3RhdGVpZC5zaV9nZW5lcmF0aW9uKTsKKwlDT1BZTUVNKCZjbG9zZS0+Y2xfc3RhdGVpZC5zaV9vcGFxdWUsIHNpemVvZihzdGF0ZWlkX29wYXF1ZV90KSk7CisKKwlERUNPREVfVEFJTDsKK30KKworCitzdGF0aWMgaW50CituZnNkNF9kZWNvZGVfY29tbWl0KHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9jb21taXQgKmNvbW1pdCkKK3sKKwlERUNPREVfSEVBRDsKKworCVJFQURfQlVGKDEyKTsKKwlSRUFENjQoY29tbWl0LT5jb19vZmZzZXQpOworCVJFQUQzMihjb21taXQtPmNvX2NvdW50KTsKKworCURFQ09ERV9UQUlMOworfQorCitzdGF0aWMgaW50CituZnNkNF9kZWNvZGVfY3JlYXRlKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9jcmVhdGUgKmNyZWF0ZSkKK3sKKwlERUNPREVfSEVBRDsKKworCVJFQURfQlVGKDQpOworCVJFQUQzMihjcmVhdGUtPmNyX3R5cGUpOworCXN3aXRjaCAoY3JlYXRlLT5jcl90eXBlKSB7CisJY2FzZSBORjRMTks6CisJCVJFQURfQlVGKDQpOworCQlSRUFEMzIoY3JlYXRlLT5jcl9saW5rbGVuKTsKKwkJUkVBRF9CVUYoY3JlYXRlLT5jcl9saW5rbGVuKTsKKwkJU0FWRU1FTShjcmVhdGUtPmNyX2xpbmtuYW1lLCBjcmVhdGUtPmNyX2xpbmtsZW4pOworCQlicmVhazsKKwljYXNlIE5GNEJMSzoKKwljYXNlIE5GNENIUjoKKwkJUkVBRF9CVUYoOCk7CisJCVJFQUQzMihjcmVhdGUtPmNyX3NwZWNkYXRhMSk7CisJCVJFQUQzMihjcmVhdGUtPmNyX3NwZWNkYXRhMik7CisJCWJyZWFrOworCWNhc2UgTkY0U09DSzoKKwljYXNlIE5GNEZJRk86CisJY2FzZSBORjRESVI6CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJUkVBRF9CVUYoNCk7CisJUkVBRDMyKGNyZWF0ZS0+Y3JfbmFtZWxlbik7CisJUkVBRF9CVUYoY3JlYXRlLT5jcl9uYW1lbGVuKTsKKwlTQVZFTUVNKGNyZWF0ZS0+Y3JfbmFtZSwgY3JlYXRlLT5jcl9uYW1lbGVuKTsKKwlpZiAoKHN0YXR1cyA9IGNoZWNrX2ZpbGVuYW1lKGNyZWF0ZS0+Y3JfbmFtZSwgY3JlYXRlLT5jcl9uYW1lbGVuLCBuZnNlcnJfaW52YWwpKSkKKwkJcmV0dXJuIHN0YXR1czsKKworCWlmICgoc3RhdHVzID0gbmZzZDRfZGVjb2RlX2ZhdHRyKGFyZ3AsIGNyZWF0ZS0+Y3JfYm12YWwsICZjcmVhdGUtPmNyX2lhdHRyLCAmY3JlYXRlLT5jcl9hY2wpKSkKKwkJZ290byBvdXQ7CisKKwlERUNPREVfVEFJTDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK25mc2Q0X2RlY29kZV9kZWxlZ3JldHVybihzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfZGVsZWdyZXR1cm4gKmRyKQoreworCURFQ09ERV9IRUFEOworCisJUkVBRF9CVUYoc2l6ZW9mKHN0YXRlaWRfdCkpOworCVJFQUQzMihkci0+ZHJfc3RhdGVpZC5zaV9nZW5lcmF0aW9uKTsKKwlDT1BZTUVNKCZkci0+ZHJfc3RhdGVpZC5zaV9vcGFxdWUsIHNpemVvZihzdGF0ZWlkX29wYXF1ZV90KSk7CisKKwlERUNPREVfVEFJTDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK25mc2Q0X2RlY29kZV9nZXRhdHRyKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9nZXRhdHRyICpnZXRhdHRyKQoreworCXJldHVybiBuZnNkNF9kZWNvZGVfYml0bWFwKGFyZ3AsIGdldGF0dHItPmdhX2JtdmFsKTsKK30KKworc3RhdGljIGludAorbmZzZDRfZGVjb2RlX2xpbmsoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X2xpbmsgKmxpbmspCit7CisJREVDT0RFX0hFQUQ7CisKKwlSRUFEX0JVRig0KTsKKwlSRUFEMzIobGluay0+bGlfbmFtZWxlbik7CisJUkVBRF9CVUYobGluay0+bGlfbmFtZWxlbik7CisJU0FWRU1FTShsaW5rLT5saV9uYW1lLCBsaW5rLT5saV9uYW1lbGVuKTsKKwlpZiAoKHN0YXR1cyA9IGNoZWNrX2ZpbGVuYW1lKGxpbmstPmxpX25hbWUsIGxpbmstPmxpX25hbWVsZW4sIG5mc2Vycl9pbnZhbCkpKQorCQlyZXR1cm4gc3RhdHVzOworCisJREVDT0RFX1RBSUw7Cit9CisKK3N0YXRpYyBpbnQKK25mc2Q0X2RlY29kZV9sb2NrKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9sb2NrICpsb2NrKQoreworCURFQ09ERV9IRUFEOworCisJbG9jay0+bGtfc3RhdGVvd25lciA9IE5VTEw7CisJLyoKKwkqIHR5cGUsIHJlY2xhaW0oYm9vbGVhbiksIG9mZnNldCwgbGVuZ3RoLCBuZXdfbG9ja19vd25lcihib29sZWFuKQorCSovCisJUkVBRF9CVUYoMjgpOworCVJFQUQzMihsb2NrLT5sa190eXBlKTsKKwlpZiAoKGxvY2stPmxrX3R5cGUgPCBORlM0X1JFQURfTFQpIHx8IChsb2NrLT5sa190eXBlID4gTkZTNF9XUklURVdfTFQpKQorCQlnb3RvIHhkcl9lcnJvcjsKKwlSRUFEMzIobG9jay0+bGtfcmVjbGFpbSk7CisJUkVBRDY0KGxvY2stPmxrX29mZnNldCk7CisJUkVBRDY0KGxvY2stPmxrX2xlbmd0aCk7CisJUkVBRDMyKGxvY2stPmxrX2lzX25ldyk7CisKKwlpZiAobG9jay0+bGtfaXNfbmV3KSB7CisJCVJFQURfQlVGKDM2KTsKKwkJUkVBRDMyKGxvY2stPmxrX25ld19vcGVuX3NlcWlkKTsKKwkJUkVBRDMyKGxvY2stPmxrX25ld19vcGVuX3N0YXRlaWQuc2lfZ2VuZXJhdGlvbik7CisKKwkJQ09QWU1FTSgmbG9jay0+bGtfbmV3X29wZW5fc3RhdGVpZC5zaV9vcGFxdWUsIHNpemVvZihzdGF0ZWlkX29wYXF1ZV90KSk7CisJCVJFQUQzMihsb2NrLT5sa19uZXdfbG9ja19zZXFpZCk7CisJCUNPUFlNRU0oJmxvY2stPmxrX25ld19jbGllbnRpZCwgc2l6ZW9mKGNsaWVudGlkX3QpKTsKKwkJUkVBRDMyKGxvY2stPmxrX25ld19vd25lci5sZW4pOworCQlSRUFEX0JVRihsb2NrLT5sa19uZXdfb3duZXIubGVuKTsKKwkJUkVBRE1FTShsb2NrLT5sa19uZXdfb3duZXIuZGF0YSwgbG9jay0+bGtfbmV3X293bmVyLmxlbik7CisJfSBlbHNlIHsKKwkJUkVBRF9CVUYoMjApOworCQlSRUFEMzIobG9jay0+bGtfb2xkX2xvY2tfc3RhdGVpZC5zaV9nZW5lcmF0aW9uKTsKKwkJQ09QWU1FTSgmbG9jay0+bGtfb2xkX2xvY2tfc3RhdGVpZC5zaV9vcGFxdWUsIHNpemVvZihzdGF0ZWlkX29wYXF1ZV90KSk7CisJCVJFQUQzMihsb2NrLT5sa19vbGRfbG9ja19zZXFpZCk7CisJfQorCisJREVDT0RFX1RBSUw7Cit9CisKK3N0YXRpYyBpbnQKK25mc2Q0X2RlY29kZV9sb2NrdChzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfbG9ja3QgKmxvY2t0KQoreworCURFQ09ERV9IRUFEOworCQkgICAgICAgIAorCVJFQURfQlVGKDMyKTsKKwlSRUFEMzIobG9ja3QtPmx0X3R5cGUpOworCWlmKChsb2NrdC0+bHRfdHlwZSA8IE5GUzRfUkVBRF9MVCkgfHwgKGxvY2t0LT5sdF90eXBlID4gTkZTNF9XUklURVdfTFQpKQorCQlnb3RvIHhkcl9lcnJvcjsKKwlSRUFENjQobG9ja3QtPmx0X29mZnNldCk7CisJUkVBRDY0KGxvY2t0LT5sdF9sZW5ndGgpOworCUNPUFlNRU0oJmxvY2t0LT5sdF9jbGllbnRpZCwgOCk7CisJUkVBRDMyKGxvY2t0LT5sdF9vd25lci5sZW4pOworCVJFQURfQlVGKGxvY2t0LT5sdF9vd25lci5sZW4pOworCVJFQURNRU0obG9ja3QtPmx0X293bmVyLmRhdGEsIGxvY2t0LT5sdF9vd25lci5sZW4pOworCisJREVDT0RFX1RBSUw7Cit9CisKK3N0YXRpYyBpbnQKK25mc2Q0X2RlY29kZV9sb2NrdShzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfbG9ja3UgKmxvY2t1KQoreworCURFQ09ERV9IRUFEOworCisJbG9ja3UtPmx1X3N0YXRlb3duZXIgPSBOVUxMOworCVJFQURfQlVGKDI0ICsgc2l6ZW9mKHN0YXRlaWRfdCkpOworCVJFQUQzMihsb2NrdS0+bHVfdHlwZSk7CisJaWYgKChsb2NrdS0+bHVfdHlwZSA8IE5GUzRfUkVBRF9MVCkgfHwgKGxvY2t1LT5sdV90eXBlID4gTkZTNF9XUklURVdfTFQpKQorCQlnb3RvIHhkcl9lcnJvcjsKKwlSRUFEMzIobG9ja3UtPmx1X3NlcWlkKTsKKwlSRUFEMzIobG9ja3UtPmx1X3N0YXRlaWQuc2lfZ2VuZXJhdGlvbik7CisJQ09QWU1FTSgmbG9ja3UtPmx1X3N0YXRlaWQuc2lfb3BhcXVlLCBzaXplb2Yoc3RhdGVpZF9vcGFxdWVfdCkpOworCVJFQUQ2NChsb2NrdS0+bHVfb2Zmc2V0KTsKKwlSRUFENjQobG9ja3UtPmx1X2xlbmd0aCk7CisKKwlERUNPREVfVEFJTDsKK30KKworc3RhdGljIGludAorbmZzZDRfZGVjb2RlX2xvb2t1cChzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfbG9va3VwICpsb29rdXApCit7CisJREVDT0RFX0hFQUQ7CisKKwlSRUFEX0JVRig0KTsKKwlSRUFEMzIobG9va3VwLT5sb19sZW4pOworCVJFQURfQlVGKGxvb2t1cC0+bG9fbGVuKTsKKwlTQVZFTUVNKGxvb2t1cC0+bG9fbmFtZSwgbG9va3VwLT5sb19sZW4pOworCWlmICgoc3RhdHVzID0gY2hlY2tfZmlsZW5hbWUobG9va3VwLT5sb19uYW1lLCBsb29rdXAtPmxvX2xlbiwgbmZzZXJyX25vZW50KSkpCisJCXJldHVybiBzdGF0dXM7CisKKwlERUNPREVfVEFJTDsKK30KKworc3RhdGljIGludAorbmZzZDRfZGVjb2RlX29wZW4oc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X29wZW4gKm9wZW4pCit7CisJREVDT0RFX0hFQUQ7CisKKwltZW1zZXQob3Blbi0+b3BfYm12YWwsIDAsIHNpemVvZihvcGVuLT5vcF9ibXZhbCkpOworCW9wZW4tPm9wX2lhdHRyLmlhX3ZhbGlkID0gMDsKKwlvcGVuLT5vcF9zdGF0ZW93bmVyID0gTlVMTDsKKworCS8qIHNlcWlkLCBzaGFyZV9hY2Nlc3MsIHNoYXJlX2RlbnksIGNsaWVudGlkLCBvd25lcmxlbiAqLworCVJFQURfQlVGKDE2ICsgc2l6ZW9mKGNsaWVudGlkX3QpKTsKKwlSRUFEMzIob3Blbi0+b3Bfc2VxaWQpOworCVJFQUQzMihvcGVuLT5vcF9zaGFyZV9hY2Nlc3MpOworCVJFQUQzMihvcGVuLT5vcF9zaGFyZV9kZW55KTsKKwlDT1BZTUVNKCZvcGVuLT5vcF9jbGllbnRpZCwgc2l6ZW9mKGNsaWVudGlkX3QpKTsKKwlSRUFEMzIob3Blbi0+b3Bfb3duZXIubGVuKTsKKworCS8qIG93bmVyLCBvcGVuX2ZsYWcgKi8KKwlSRUFEX0JVRihvcGVuLT5vcF9vd25lci5sZW4gKyA0KTsKKwlTQVZFTUVNKG9wZW4tPm9wX293bmVyLmRhdGEsIG9wZW4tPm9wX293bmVyLmxlbik7CisJUkVBRDMyKG9wZW4tPm9wX2NyZWF0ZSk7CisJc3dpdGNoIChvcGVuLT5vcF9jcmVhdGUpIHsKKwljYXNlIE5GUzRfT1BFTl9OT0NSRUFURToKKwkJYnJlYWs7CisJY2FzZSBORlM0X09QRU5fQ1JFQVRFOgorCQlSRUFEX0JVRig0KTsKKwkJUkVBRDMyKG9wZW4tPm9wX2NyZWF0ZW1vZGUpOworCQlzd2l0Y2ggKG9wZW4tPm9wX2NyZWF0ZW1vZGUpIHsKKwkJY2FzZSBORlM0X0NSRUFURV9VTkNIRUNLRUQ6CisJCWNhc2UgTkZTNF9DUkVBVEVfR1VBUkRFRDoKKwkJCWlmICgoc3RhdHVzID0gbmZzZDRfZGVjb2RlX2ZhdHRyKGFyZ3AsIG9wZW4tPm9wX2JtdmFsLCAmb3Blbi0+b3BfaWF0dHIsICZvcGVuLT5vcF9hY2wpKSkKKwkJCQlnb3RvIG91dDsKKwkJCWJyZWFrOworCQljYXNlIE5GUzRfQ1JFQVRFX0VYQ0xVU0lWRToKKwkJCVJFQURfQlVGKDgpOworCQkJQ09QWU1FTShvcGVuLT5vcF92ZXJmLmRhdGEsIDgpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIHhkcl9lcnJvcjsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlnb3RvIHhkcl9lcnJvcjsKKwl9CisKKwkvKiBvcGVuX2NsYWltICovCisJUkVBRF9CVUYoNCk7CisJUkVBRDMyKG9wZW4tPm9wX2NsYWltX3R5cGUpOworCXN3aXRjaCAob3Blbi0+b3BfY2xhaW1fdHlwZSkgeworCWNhc2UgTkZTNF9PUEVOX0NMQUlNX05VTEw6CisJY2FzZSBORlM0X09QRU5fQ0xBSU1fREVMRUdBVEVfUFJFVjoKKwkJUkVBRF9CVUYoNCk7CisJCVJFQUQzMihvcGVuLT5vcF9mbmFtZS5sZW4pOworCQlSRUFEX0JVRihvcGVuLT5vcF9mbmFtZS5sZW4pOworCQlTQVZFTUVNKG9wZW4tPm9wX2ZuYW1lLmRhdGEsIG9wZW4tPm9wX2ZuYW1lLmxlbik7CisJCWlmICgoc3RhdHVzID0gY2hlY2tfZmlsZW5hbWUob3Blbi0+b3BfZm5hbWUuZGF0YSwgb3Blbi0+b3BfZm5hbWUubGVuLCBuZnNlcnJfaW52YWwpKSkKKwkJCXJldHVybiBzdGF0dXM7CisJCWJyZWFrOworCWNhc2UgTkZTNF9PUEVOX0NMQUlNX1BSRVZJT1VTOgorCQlSRUFEX0JVRig0KTsKKwkJUkVBRDMyKG9wZW4tPm9wX2RlbGVnYXRlX3R5cGUpOworCQlicmVhazsKKwljYXNlIE5GUzRfT1BFTl9DTEFJTV9ERUxFR0FURV9DVVI6CisJCVJFQURfQlVGKHNpemVvZihzdGF0ZWlkX3QpICsgNCk7CisJCUNPUFlNRU0oJm9wZW4tPm9wX2RlbGVnYXRlX3N0YXRlaWQsIHNpemVvZihzdGF0ZWlkX3QpKTsKKwkJUkVBRDMyKG9wZW4tPm9wX2ZuYW1lLmxlbik7CisJCVJFQURfQlVGKG9wZW4tPm9wX2ZuYW1lLmxlbik7CisJCVNBVkVNRU0ob3Blbi0+b3BfZm5hbWUuZGF0YSwgb3Blbi0+b3BfZm5hbWUubGVuKTsKKwkJaWYgKChzdGF0dXMgPSBjaGVja19maWxlbmFtZShvcGVuLT5vcF9mbmFtZS5kYXRhLCBvcGVuLT5vcF9mbmFtZS5sZW4sIG5mc2Vycl9pbnZhbCkpKQorCQkJcmV0dXJuIHN0YXR1czsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byB4ZHJfZXJyb3I7CisJfQorCisJREVDT0RFX1RBSUw7Cit9CisKK3N0YXRpYyBpbnQKK25mc2Q0X2RlY29kZV9vcGVuX2NvbmZpcm0oc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X29wZW5fY29uZmlybSAqb3Blbl9jb25mKQoreworCURFQ09ERV9IRUFEOworCQkgICAgCisJb3Blbl9jb25mLT5vY19zdGF0ZW93bmVyID0gTlVMTDsKKwlSRUFEX0JVRig0ICsgc2l6ZW9mKHN0YXRlaWRfdCkpOworCVJFQUQzMihvcGVuX2NvbmYtPm9jX3JlcV9zdGF0ZWlkLnNpX2dlbmVyYXRpb24pOworCUNPUFlNRU0oJm9wZW5fY29uZi0+b2NfcmVxX3N0YXRlaWQuc2lfb3BhcXVlLCBzaXplb2Yoc3RhdGVpZF9vcGFxdWVfdCkpOworCVJFQUQzMihvcGVuX2NvbmYtPm9jX3NlcWlkKTsKKwkJCQkJCSAgICAgICAgCisJREVDT0RFX1RBSUw7Cit9CisKK3N0YXRpYyBpbnQKK25mc2Q0X2RlY29kZV9vcGVuX2Rvd25ncmFkZShzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfb3Blbl9kb3duZ3JhZGUgKm9wZW5fZG93bikKK3sKKwlERUNPREVfSEVBRDsKKwkJICAgIAorCW9wZW5fZG93bi0+b2Rfc3RhdGVvd25lciA9IE5VTEw7CisJUkVBRF9CVUYoMTIgKyBzaXplb2Yoc3RhdGVpZF90KSk7CisJUkVBRDMyKG9wZW5fZG93bi0+b2Rfc3RhdGVpZC5zaV9nZW5lcmF0aW9uKTsKKwlDT1BZTUVNKCZvcGVuX2Rvd24tPm9kX3N0YXRlaWQuc2lfb3BhcXVlLCBzaXplb2Yoc3RhdGVpZF9vcGFxdWVfdCkpOworCVJFQUQzMihvcGVuX2Rvd24tPm9kX3NlcWlkKTsKKwlSRUFEMzIob3Blbl9kb3duLT5vZF9zaGFyZV9hY2Nlc3MpOworCVJFQUQzMihvcGVuX2Rvd24tPm9kX3NoYXJlX2RlbnkpOworCQkJCQkJICAgICAgICAKKwlERUNPREVfVEFJTDsKK30KKworc3RhdGljIGludAorbmZzZDRfZGVjb2RlX3B1dGZoKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9wdXRmaCAqcHV0ZmgpCit7CisJREVDT0RFX0hFQUQ7CisKKwlSRUFEX0JVRig0KTsKKwlSRUFEMzIocHV0ZmgtPnBmX2ZobGVuKTsKKwlpZiAocHV0ZmgtPnBmX2ZobGVuID4gTkZTNF9GSFNJWkUpCisJCWdvdG8geGRyX2Vycm9yOworCVJFQURfQlVGKHB1dGZoLT5wZl9maGxlbik7CisJU0FWRU1FTShwdXRmaC0+cGZfZmh2YWwsIHB1dGZoLT5wZl9maGxlbik7CisKKwlERUNPREVfVEFJTDsKK30KKworc3RhdGljIGludAorbmZzZDRfZGVjb2RlX3JlYWQoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X3JlYWQgKnJlYWQpCit7CisJREVDT0RFX0hFQUQ7CisKKwlSRUFEX0JVRihzaXplb2Yoc3RhdGVpZF90KSArIDEyKTsKKwlSRUFEMzIocmVhZC0+cmRfc3RhdGVpZC5zaV9nZW5lcmF0aW9uKTsKKwlDT1BZTUVNKCZyZWFkLT5yZF9zdGF0ZWlkLnNpX29wYXF1ZSwgc2l6ZW9mKHN0YXRlaWRfb3BhcXVlX3QpKTsKKwlSRUFENjQocmVhZC0+cmRfb2Zmc2V0KTsKKwlSRUFEMzIocmVhZC0+cmRfbGVuZ3RoKTsKKworCURFQ09ERV9UQUlMOworfQorCitzdGF0aWMgaW50CituZnNkNF9kZWNvZGVfcmVhZGRpcihzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfcmVhZGRpciAqcmVhZGRpcikKK3sKKwlERUNPREVfSEVBRDsKKworCVJFQURfQlVGKDI0KTsKKwlSRUFENjQocmVhZGRpci0+cmRfY29va2llKTsKKwlDT1BZTUVNKHJlYWRkaXItPnJkX3ZlcmYuZGF0YSwgc2l6ZW9mKHJlYWRkaXItPnJkX3ZlcmYuZGF0YSkpOworCVJFQUQzMihyZWFkZGlyLT5yZF9kaXJjb3VudCk7ICAgIC8qIGp1c3QgaW4gY2FzZSB5b3UgbmVlZGVkIGEgdXNlbGVzcyBmaWVsZC4uLiAqLworCVJFQUQzMihyZWFkZGlyLT5yZF9tYXhjb3VudCk7CisJaWYgKChzdGF0dXMgPSBuZnNkNF9kZWNvZGVfYml0bWFwKGFyZ3AsIHJlYWRkaXItPnJkX2JtdmFsKSkpCisJCWdvdG8gb3V0OworCisJREVDT0RFX1RBSUw7Cit9CisKK3N0YXRpYyBpbnQKK25mc2Q0X2RlY29kZV9yZW1vdmUoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgc3RydWN0IG5mc2Q0X3JlbW92ZSAqcmVtb3ZlKQoreworCURFQ09ERV9IRUFEOworCisJUkVBRF9CVUYoNCk7CisJUkVBRDMyKHJlbW92ZS0+cm1fbmFtZWxlbik7CisJUkVBRF9CVUYocmVtb3ZlLT5ybV9uYW1lbGVuKTsKKwlTQVZFTUVNKHJlbW92ZS0+cm1fbmFtZSwgcmVtb3ZlLT5ybV9uYW1lbGVuKTsKKwlpZiAoKHN0YXR1cyA9IGNoZWNrX2ZpbGVuYW1lKHJlbW92ZS0+cm1fbmFtZSwgcmVtb3ZlLT5ybV9uYW1lbGVuLCBuZnNlcnJfbm9lbnQpKSkKKwkJcmV0dXJuIHN0YXR1czsKKworCURFQ09ERV9UQUlMOworfQorCitzdGF0aWMgaW50CituZnNkNF9kZWNvZGVfcmVuYW1lKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9yZW5hbWUgKnJlbmFtZSkKK3sKKwlERUNPREVfSEVBRDsKKworCVJFQURfQlVGKDQpOworCVJFQUQzMihyZW5hbWUtPnJuX3NuYW1lbGVuKTsKKwlSRUFEX0JVRihyZW5hbWUtPnJuX3NuYW1lbGVuICsgNCk7CisJU0FWRU1FTShyZW5hbWUtPnJuX3NuYW1lLCByZW5hbWUtPnJuX3NuYW1lbGVuKTsKKwlSRUFEMzIocmVuYW1lLT5ybl90bmFtZWxlbik7CisJUkVBRF9CVUYocmVuYW1lLT5ybl90bmFtZWxlbik7CisJU0FWRU1FTShyZW5hbWUtPnJuX3RuYW1lLCByZW5hbWUtPnJuX3RuYW1lbGVuKTsKKwlpZiAoKHN0YXR1cyA9IGNoZWNrX2ZpbGVuYW1lKHJlbmFtZS0+cm5fc25hbWUsIHJlbmFtZS0+cm5fc25hbWVsZW4sIG5mc2Vycl9ub2VudCkpKQorCQlyZXR1cm4gc3RhdHVzOworCWlmICgoc3RhdHVzID0gY2hlY2tfZmlsZW5hbWUocmVuYW1lLT5ybl90bmFtZSwgcmVuYW1lLT5ybl90bmFtZWxlbiwgbmZzZXJyX2ludmFsKSkpCisJCXJldHVybiBzdGF0dXM7CisKKwlERUNPREVfVEFJTDsKK30KKworc3RhdGljIGludAorbmZzZDRfZGVjb2RlX3JlbmV3KHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIGNsaWVudGlkX3QgKmNsaWVudGlkKQoreworCURFQ09ERV9IRUFEOworCisJUkVBRF9CVUYoc2l6ZW9mKGNsaWVudGlkX3QpKTsKKwlDT1BZTUVNKGNsaWVudGlkLCBzaXplb2YoY2xpZW50aWRfdCkpOworCisJREVDT0RFX1RBSUw7Cit9CisKK3N0YXRpYyBpbnQKK25mc2Q0X2RlY29kZV9zZXRhdHRyKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9zZXRhdHRyICpzZXRhdHRyKQoreworCURFQ09ERV9IRUFEOworCisJUkVBRF9CVUYoc2l6ZW9mKHN0YXRlaWRfdCkpOworCVJFQUQzMihzZXRhdHRyLT5zYV9zdGF0ZWlkLnNpX2dlbmVyYXRpb24pOworCUNPUFlNRU0oJnNldGF0dHItPnNhX3N0YXRlaWQuc2lfb3BhcXVlLCBzaXplb2Yoc3RhdGVpZF9vcGFxdWVfdCkpOworCWlmICgoc3RhdHVzID0gbmZzZDRfZGVjb2RlX2ZhdHRyKGFyZ3AsIHNldGF0dHItPnNhX2JtdmFsLCAmc2V0YXR0ci0+c2FfaWF0dHIsICZzZXRhdHRyLT5zYV9hY2wpKSkKKwkJZ290byBvdXQ7CisKKwlERUNPREVfVEFJTDsKK30KKworc3RhdGljIGludAorbmZzZDRfZGVjb2RlX3NldGNsaWVudGlkKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9zZXRjbGllbnRpZCAqc2V0Y2xpZW50aWQpCit7CisJREVDT0RFX0hFQUQ7CisKKwlSRUFEX0JVRigxMik7CisJQ09QWU1FTShzZXRjbGllbnRpZC0+c2VfdmVyZi5kYXRhLCA4KTsKKwlSRUFEMzIoc2V0Y2xpZW50aWQtPnNlX25hbWVsZW4pOworCisJUkVBRF9CVUYoc2V0Y2xpZW50aWQtPnNlX25hbWVsZW4gKyA4KTsKKwlTQVZFTUVNKHNldGNsaWVudGlkLT5zZV9uYW1lLCBzZXRjbGllbnRpZC0+c2VfbmFtZWxlbik7CisJUkVBRDMyKHNldGNsaWVudGlkLT5zZV9jYWxsYmFja19wcm9nKTsKKwlSRUFEMzIoc2V0Y2xpZW50aWQtPnNlX2NhbGxiYWNrX25ldGlkX2xlbik7CisKKwlSRUFEX0JVRihzZXRjbGllbnRpZC0+c2VfY2FsbGJhY2tfbmV0aWRfbGVuICsgNCk7CisJU0FWRU1FTShzZXRjbGllbnRpZC0+c2VfY2FsbGJhY2tfbmV0aWRfdmFsLCBzZXRjbGllbnRpZC0+c2VfY2FsbGJhY2tfbmV0aWRfbGVuKTsKKwlSRUFEMzIoc2V0Y2xpZW50aWQtPnNlX2NhbGxiYWNrX2FkZHJfbGVuKTsKKworCVJFQURfQlVGKHNldGNsaWVudGlkLT5zZV9jYWxsYmFja19hZGRyX2xlbiArIDQpOworCVNBVkVNRU0oc2V0Y2xpZW50aWQtPnNlX2NhbGxiYWNrX2FkZHJfdmFsLCBzZXRjbGllbnRpZC0+c2VfY2FsbGJhY2tfYWRkcl9sZW4pOworCVJFQUQzMihzZXRjbGllbnRpZC0+c2VfY2FsbGJhY2tfaWRlbnQpOworCisJREVDT0RFX1RBSUw7Cit9CisKK3N0YXRpYyBpbnQKK25mc2Q0X2RlY29kZV9zZXRjbGllbnRpZF9jb25maXJtKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9zZXRjbGllbnRpZF9jb25maXJtICpzY2RfYykKK3sKKwlERUNPREVfSEVBRDsKKworCVJFQURfQlVGKDggKyBzaXplb2YobmZzNF92ZXJpZmllcikpOworCUNPUFlNRU0oJnNjZF9jLT5zY19jbGllbnRpZCwgOCk7CisJQ09QWU1FTSgmc2NkX2MtPnNjX2NvbmZpcm0sIHNpemVvZihuZnM0X3ZlcmlmaWVyKSk7CisKKwlERUNPREVfVEFJTDsKK30KKworLyogQWxzbyB1c2VkIGZvciBOVkVSSUZZICovCitzdGF0aWMgaW50CituZnNkNF9kZWNvZGVfdmVyaWZ5KHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF92ZXJpZnkgKnZlcmlmeSkKK3sKKyNpZiAwCisJc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyBzYXZlID0geworCQkucCA9IGFyZ3AtPnAsCisJCS5lbmQgPSBhcmdwLT5lbmQsCisJCS5ycXN0cCA9IGFyZ3AtPnJxc3RwLAorCX07CisJdTMyICAgICAgICAgICAgIHZlX2JtdmFsWzJdOworCXN0cnVjdCBpYXR0ciAgICB2ZV9pYXR0cjsgICAgICAgICAgIC8qIHJlcXVlc3QgKi8KKwlzdHJ1Y3QgbmZzNF9hY2wgKnZlX2FjbDsgICAgICAgICAgICAvKiByZXF1ZXN0ICovCisjZW5kaWYKKwlERUNPREVfSEVBRDsKKworCWlmICgoc3RhdHVzID0gbmZzZDRfZGVjb2RlX2JpdG1hcChhcmdwLCB2ZXJpZnktPnZlX2JtdmFsKSkpCisJCWdvdG8gb3V0OworCisJLyogRm9yIGNvbnZlbmllbmNlJ3Mgc2FrZSwgd2UgY29tcGFyZSByYXcgeGRyJ2QgYXR0cmlidXRlcyBpbgorCSAqIG5mc2Q0X3Byb2NfdmVyaWZ5OyBob3dldmVyIHdlIHN0aWxsIGRlY29kZSBoZXJlIGp1c3QgdG8gcmV0dXJuCisJICogY29ycmVjdCBlcnJvciBpbiBjYXNlIG9mIGJhZCB4ZHIuICovCisjaWYgMAorCXN0YXR1cyA9IG5mc2Q0X2RlY29kZV9mYXR0cih2ZV9ibXZhbCwgJnZlX2lhdHRyLCAmdmVfYWNsKTsKKwlpZiAoc3RhdHVzID09IG5mc2Vycl9pbnZhbCkgeworCQlzdGF0dXMgPSBuZnNlcnJubyhzdGF0dXMpOworCQlnb3RvIG91dDsKKwl9CisjZW5kaWYKKwlSRUFEX0JVRig0KTsKKwlSRUFEMzIodmVyaWZ5LT52ZV9hdHRybGVuKTsKKwlSRUFEX0JVRih2ZXJpZnktPnZlX2F0dHJsZW4pOworCVNBVkVNRU0odmVyaWZ5LT52ZV9hdHRydmFsLCB2ZXJpZnktPnZlX2F0dHJsZW4pOworCisJREVDT0RFX1RBSUw7Cit9CisKK3N0YXRpYyBpbnQKK25mc2Q0X2RlY29kZV93cml0ZShzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCBzdHJ1Y3QgbmZzZDRfd3JpdGUgKndyaXRlKQoreworCWludCBhdmFpbDsKKwlpbnQgdjsKKwlpbnQgbGVuOworCURFQ09ERV9IRUFEOworCisJUkVBRF9CVUYoc2l6ZW9mKHN0YXRlaWRfb3BhcXVlX3QpICsgMjApOworCVJFQUQzMih3cml0ZS0+d3Jfc3RhdGVpZC5zaV9nZW5lcmF0aW9uKTsKKwlDT1BZTUVNKCZ3cml0ZS0+d3Jfc3RhdGVpZC5zaV9vcGFxdWUsIHNpemVvZihzdGF0ZWlkX29wYXF1ZV90KSk7CisJUkVBRDY0KHdyaXRlLT53cl9vZmZzZXQpOworCVJFQUQzMih3cml0ZS0+d3Jfc3RhYmxlX2hvdyk7CisJaWYgKHdyaXRlLT53cl9zdGFibGVfaG93ID4gMikKKwkJZ290byB4ZHJfZXJyb3I7CisJUkVBRDMyKHdyaXRlLT53cl9idWZsZW4pOworCisJLyogU29ycnkgLi4gbm8gbWFnaWMgbWFjcm9zIGZvciB0aGlzLi4gKgorCSAqIFJFQURfQlVGKHdyaXRlLT53cl9idWZsZW4pOworCSAqIFNBVkVNRU0od3JpdGUtPndyX2J1Ziwgd3JpdGUtPndyX2J1Zmxlbik7CisJICovCisJYXZhaWwgPSAoY2hhciopYXJncC0+ZW5kIC0gKGNoYXIqKWFyZ3AtPnA7CisJaWYgKGF2YWlsICsgYXJncC0+cGFnZWxlbiA8IHdyaXRlLT53cl9idWZsZW4pIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJ4ZHIgZXJyb3IhICglczolZClcbiIsIF9fRklMRV9fLCBfX0xJTkVfXyk7IAorCQlnb3RvIHhkcl9lcnJvcjsKKwl9CisJd3JpdGUtPndyX3ZlY1swXS5pb3ZfYmFzZSA9IHA7CisJd3JpdGUtPndyX3ZlY1swXS5pb3ZfbGVuID0gYXZhaWw7CisJdiA9IDA7CisJbGVuID0gd3JpdGUtPndyX2J1ZmxlbjsKKwl3aGlsZSAobGVuID4gd3JpdGUtPndyX3ZlY1t2XS5pb3ZfbGVuKSB7CisJCWxlbiAtPSB3cml0ZS0+d3JfdmVjW3ZdLmlvdl9sZW47CisJCXYrKzsKKwkJd3JpdGUtPndyX3ZlY1t2XS5pb3ZfYmFzZSA9IHBhZ2VfYWRkcmVzcyhhcmdwLT5wYWdlbGlzdFswXSk7CisJCWFyZ3AtPnBhZ2VsaXN0Kys7CisJCWlmIChhcmdwLT5wYWdlbGVuID49IFBBR0VfU0laRSkgeworCQkJd3JpdGUtPndyX3ZlY1t2XS5pb3ZfbGVuID0gUEFHRV9TSVpFOworCQkJYXJncC0+cGFnZWxlbiAtPSBQQUdFX1NJWkU7CisJCX0gZWxzZSB7CisJCQl3cml0ZS0+d3JfdmVjW3ZdLmlvdl9sZW4gPSBhcmdwLT5wYWdlbGVuOworCQkJYXJncC0+cGFnZWxlbiAtPSBsZW47CisJCX0KKwl9CisJYXJncC0+ZW5kID0gKHUzMiopICh3cml0ZS0+d3JfdmVjW3ZdLmlvdl9iYXNlICsgd3JpdGUtPndyX3ZlY1t2XS5pb3ZfbGVuKTsKKwlhcmdwLT5wID0gKHUzMiopICAod3JpdGUtPndyX3ZlY1t2XS5pb3ZfYmFzZSArIChYRFJfUVVBRExFTihsZW4pIDw8IDIpKTsKKwl3cml0ZS0+d3JfdmVjW3ZdLmlvdl9sZW4gPSBsZW47CisJd3JpdGUtPndyX3ZsZW4gPSB2KzE7CisKKwlERUNPREVfVEFJTDsKK30KKworc3RhdGljIGludAorbmZzZDRfZGVjb2RlX3JlbGVhc2VfbG9ja293bmVyKHN0cnVjdCBuZnNkNF9jb21wb3VuZGFyZ3MgKmFyZ3AsIHN0cnVjdCBuZnNkNF9yZWxlYXNlX2xvY2tvd25lciAqcmxvY2tvd25lcikKK3sKKwlERUNPREVfSEVBRDsKKworCVJFQURfQlVGKDEyKTsKKwlDT1BZTUVNKCZybG9ja293bmVyLT5ybF9jbGllbnRpZCwgc2l6ZW9mKGNsaWVudGlkX3QpKTsKKwlSRUFEMzIocmxvY2tvd25lci0+cmxfb3duZXIubGVuKTsKKwlSRUFEX0JVRihybG9ja293bmVyLT5ybF9vd25lci5sZW4pOworCVJFQURNRU0ocmxvY2tvd25lci0+cmxfb3duZXIuZGF0YSwgcmxvY2tvd25lci0+cmxfb3duZXIubGVuKTsKKworCURFQ09ERV9UQUlMOworfQorCitzdGF0aWMgaW50CituZnNkNF9kZWNvZGVfY29tcG91bmQoc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCkKK3sKKwlERUNPREVfSEVBRDsKKwlzdHJ1Y3QgbmZzZDRfb3AgKm9wOworCWludCBpOworCisJLyoKKwkgKiBYWFg6IEFjY29yZGluZyB0byBzcGVjLCB3ZSBzaG91bGQgY2hlY2sgdGhlIHRhZworCSAqIGZvciBVVEYtOCBjb21wbGlhbmNlLiAgSSdtIHBvc3Rwb25pbmcgdGhpcyBmb3IKKwkgKiBub3cgYmVjYXVzZSBpdCBzZWVtcyB0aGF0IHNvbWUgY2xpZW50cyBkbyB1c2UKKwkgKiBiaW5hcnkgdGFncy4KKwkgKi8KKwlSRUFEX0JVRig0KTsKKwlSRUFEMzIoYXJncC0+dGFnbGVuKTsKKwlSRUFEX0JVRihhcmdwLT50YWdsZW4gKyA4KTsKKwlTQVZFTUVNKGFyZ3AtPnRhZywgYXJncC0+dGFnbGVuKTsKKwlSRUFEMzIoYXJncC0+bWlub3J2ZXJzaW9uKTsKKwlSRUFEMzIoYXJncC0+b3BjbnQpOworCisJaWYgKGFyZ3AtPnRhZ2xlbiA+IE5GU0Q0X01BWF9UQUdMRU4pCisJCWdvdG8geGRyX2Vycm9yOworCWlmIChhcmdwLT5vcGNudCA+IDEwMCkKKwkJZ290byB4ZHJfZXJyb3I7CisKKwlpZiAoYXJncC0+b3BjbnQgPiBzaXplb2YoYXJncC0+aW9wcykvc2l6ZW9mKGFyZ3AtPmlvcHNbMF0pKSB7CisJCWFyZ3AtPm9wcyA9IGttYWxsb2MoYXJncC0+b3BjbnQgKiBzaXplb2YoKmFyZ3AtPm9wcyksIEdGUF9LRVJORUwpOworCQlpZiAoIWFyZ3AtPm9wcykgeworCQkJYXJncC0+b3BzID0gYXJncC0+aW9wczsKKwkJCXByaW50ayhLRVJOX0lORk8gIm5mc2Q6IGNvdWxkbid0IGFsbG9jYXRlIHJvb20gZm9yIENPTVBPVU5EXG4iKTsKKwkJCWdvdG8geGRyX2Vycm9yOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IGFyZ3AtPm9wY250OyBpKyspIHsKKwkJb3AgPSAmYXJncC0+b3BzW2ldOworCQlvcC0+cmVwbGF5ID0gTlVMTDsKKworCQkvKgorCQkgKiBXZSBjYW4ndCB1c2UgUkVBRF9CVUYoKSBoZXJlIGJlY2F1c2Ugd2UgbmVlZCB0byBoYW5kbGUKKwkJICogYSBtaXNzaW5nIG9wY29kZSBhcyBhbiBPUF9XUklURSArIDEuIFNvIHdlIG5lZWQgdG8gY2hlY2sKKwkJICogdG8gc2VlIGlmIHdlJ3JlIHRydWx5IGF0IHRoZSBlbmQgb2Ygb3VyIGJ1ZmZlciBvciBpZiB0aGVyZQorCQkgKiBpcyBhbm90aGVyIHBhZ2Ugd2UgbmVlZCB0byBmbGlwIHRvLgorCQkgKi8KKworCQlpZiAoYXJncC0+cCA9PSBhcmdwLT5lbmQpIHsKKwkJCWlmIChhcmdwLT5wYWdlbGVuIDwgNCkgeworCQkJCS8qIFRoZXJlIGlzbid0IGFuIG9wY29kZSBzdGlsbCBvbiB0aGUgd2lyZSAqLworCQkJCW9wLT5vcG51bSA9IE9QX1dSSVRFICsgMTsKKwkJCQlvcC0+c3RhdHVzID0gbmZzZXJyX2JhZF94ZHI7CisJCQkJYXJncC0+b3BjbnQgPSBpKzE7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qCisJCQkgKiBGYWxzZSBhbGFybS4gV2UganVzdCBoaXQgYSBwYWdlIGJvdW5kYXJ5LCBidXQgdGhlcmUKKwkJCSAqIGlzIHN0aWxsIGRhdGEgYXZhaWxhYmxlLiAgTW92ZSBwb2ludGVyIGFjcm9zcyBwYWdlCisJCQkgKiBib3VuZGFyeS4gICpzbmlwIGZyb20gUkVBRF9CVUYqCisJCQkgKi8KKwkJCWFyZ3AtPnAgPSBwYWdlX2FkZHJlc3MoYXJncC0+cGFnZWxpc3RbMF0pOworCQkJYXJncC0+cGFnZWxpc3QrKzsKKwkJCWlmIChhcmdwLT5wYWdlbGVuIDwgUEFHRV9TSVpFKSB7CisJCQkJYXJncC0+ZW5kID0gcCArIChhcmdwLT5wYWdlbGVuPj4yKTsKKwkJCQlhcmdwLT5wYWdlbGVuID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJYXJncC0+ZW5kID0gcCArIChQQUdFX1NJWkU+PjIpOworCQkJCWFyZ3AtPnBhZ2VsZW4gLT0gUEFHRV9TSVpFOworCQkJfQorCQl9CisJCW9wLT5vcG51bSA9IG50b2hsKCphcmdwLT5wKyspOworCisJCXN3aXRjaCAob3AtPm9wbnVtKSB7CisJCWNhc2UgMjogLyogUmVzZXJ2ZWQgb3BlcmF0aW9uICovCisJCQlvcC0+b3BudW0gPSBPUF9JTExFR0FMOworCQkJaWYgKGFyZ3AtPm1pbm9ydmVyc2lvbiA9PSAwKQorCQkJCW9wLT5zdGF0dXMgPSBuZnNlcnJfb3BfaWxsZWdhbDsKKwkJCWVsc2UKKwkJCQlvcC0+c3RhdHVzID0gbmZzZXJyX21pbm9yX3ZlcnNfbWlzbWF0Y2g7CisJCQlicmVhazsKKwkJY2FzZSBPUF9BQ0NFU1M6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfZGVjb2RlX2FjY2VzcyhhcmdwLCAmb3AtPnUuYWNjZXNzKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX0NMT1NFOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X2RlY29kZV9jbG9zZShhcmdwLCAmb3AtPnUuY2xvc2UpOworCQkJYnJlYWs7CisJCWNhc2UgT1BfQ09NTUlUOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X2RlY29kZV9jb21taXQoYXJncCwgJm9wLT51LmNvbW1pdCk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9DUkVBVEU6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfZGVjb2RlX2NyZWF0ZShhcmdwLCAmb3AtPnUuY3JlYXRlKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX0RFTEVHUkVUVVJOOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X2RlY29kZV9kZWxlZ3JldHVybihhcmdwLCAmb3AtPnUuZGVsZWdyZXR1cm4pOworCQkJYnJlYWs7CisJCWNhc2UgT1BfR0VUQVRUUjoKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9kZWNvZGVfZ2V0YXR0cihhcmdwLCAmb3AtPnUuZ2V0YXR0cik7CisJCQlicmVhazsKKwkJY2FzZSBPUF9HRVRGSDoKKwkJCW9wLT5zdGF0dXMgPSBuZnNfb2s7CisJCQlicmVhazsKKwkJY2FzZSBPUF9MSU5LOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X2RlY29kZV9saW5rKGFyZ3AsICZvcC0+dS5saW5rKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX0xPQ0s6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfZGVjb2RlX2xvY2soYXJncCwgJm9wLT51LmxvY2spOworCQkJYnJlYWs7CisJCWNhc2UgT1BfTE9DS1Q6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfZGVjb2RlX2xvY2t0KGFyZ3AsICZvcC0+dS5sb2NrdCk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9MT0NLVToKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9kZWNvZGVfbG9ja3UoYXJncCwgJm9wLT51LmxvY2t1KTsKKwkJCWJyZWFrOworCQljYXNlIE9QX0xPT0tVUDoKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9kZWNvZGVfbG9va3VwKGFyZ3AsICZvcC0+dS5sb29rdXApOworCQkJYnJlYWs7CisJCWNhc2UgT1BfTE9PS1VQUDoKKwkJCW9wLT5zdGF0dXMgPSBuZnNfb2s7CisJCQlicmVhazsKKwkJY2FzZSBPUF9OVkVSSUZZOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X2RlY29kZV92ZXJpZnkoYXJncCwgJm9wLT51Lm52ZXJpZnkpOworCQkJYnJlYWs7CisJCWNhc2UgT1BfT1BFTjoKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9kZWNvZGVfb3BlbihhcmdwLCAmb3AtPnUub3Blbik7CisJCQlicmVhazsKKwkJY2FzZSBPUF9PUEVOX0NPTkZJUk06CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfZGVjb2RlX29wZW5fY29uZmlybShhcmdwLCAmb3AtPnUub3Blbl9jb25maXJtKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX09QRU5fRE9XTkdSQURFOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X2RlY29kZV9vcGVuX2Rvd25ncmFkZShhcmdwLCAmb3AtPnUub3Blbl9kb3duZ3JhZGUpOworCQkJYnJlYWs7CisJCWNhc2UgT1BfUFVURkg6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfZGVjb2RlX3B1dGZoKGFyZ3AsICZvcC0+dS5wdXRmaCk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9QVVRST09URkg6CisJCQlvcC0+c3RhdHVzID0gbmZzX29rOworCQkJYnJlYWs7CisJCWNhc2UgT1BfUkVBRDoKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9kZWNvZGVfcmVhZChhcmdwLCAmb3AtPnUucmVhZCk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9SRUFERElSOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X2RlY29kZV9yZWFkZGlyKGFyZ3AsICZvcC0+dS5yZWFkZGlyKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX1JFQURMSU5LOgorCQkJb3AtPnN0YXR1cyA9IG5mc19vazsKKwkJCWJyZWFrOworCQljYXNlIE9QX1JFTU9WRToKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9kZWNvZGVfcmVtb3ZlKGFyZ3AsICZvcC0+dS5yZW1vdmUpOworCQkJYnJlYWs7CisJCWNhc2UgT1BfUkVOQU1FOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X2RlY29kZV9yZW5hbWUoYXJncCwgJm9wLT51LnJlbmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9SRVNUT1JFRkg6CisJCQlvcC0+c3RhdHVzID0gbmZzX29rOworCQkJYnJlYWs7CisJCWNhc2UgT1BfUkVORVc6CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfZGVjb2RlX3JlbmV3KGFyZ3AsICZvcC0+dS5yZW5ldyk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9TQVZFRkg6CisJCQlvcC0+c3RhdHVzID0gbmZzX29rOworCQkJYnJlYWs7CisJCWNhc2UgT1BfU0VUQVRUUjoKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9kZWNvZGVfc2V0YXR0cihhcmdwLCAmb3AtPnUuc2V0YXR0cik7CisJCQlicmVhazsKKwkJY2FzZSBPUF9TRVRDTElFTlRJRDoKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9kZWNvZGVfc2V0Y2xpZW50aWQoYXJncCwgJm9wLT51LnNldGNsaWVudGlkKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX1NFVENMSUVOVElEX0NPTkZJUk06CisJCQlvcC0+c3RhdHVzID0gbmZzZDRfZGVjb2RlX3NldGNsaWVudGlkX2NvbmZpcm0oYXJncCwgJm9wLT51LnNldGNsaWVudGlkX2NvbmZpcm0pOworCQkJYnJlYWs7CisJCWNhc2UgT1BfVkVSSUZZOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X2RlY29kZV92ZXJpZnkoYXJncCwgJm9wLT51LnZlcmlmeSk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9XUklURToKKwkJCW9wLT5zdGF0dXMgPSBuZnNkNF9kZWNvZGVfd3JpdGUoYXJncCwgJm9wLT51LndyaXRlKTsKKwkJCWJyZWFrOworCQljYXNlIE9QX1JFTEVBU0VfTE9DS09XTkVSOgorCQkJb3AtPnN0YXR1cyA9IG5mc2Q0X2RlY29kZV9yZWxlYXNlX2xvY2tvd25lcihhcmdwLCAmb3AtPnUucmVsZWFzZV9sb2Nrb3duZXIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlvcC0+b3BudW0gPSBPUF9JTExFR0FMOworCQkJb3AtPnN0YXR1cyA9IG5mc2Vycl9vcF9pbGxlZ2FsOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAob3AtPnN0YXR1cykgeworCQkJYXJncC0+b3BjbnQgPSBpKzE7CisJCQlicmVhazsKKwkJfQorCX0KKworCURFQ09ERV9UQUlMOworfQorLyoKKyAqIEVORCBPRiAiR0VORVJJQyIgREVDT0RFIFJPVVRJTkVTLgorICovCisKKy8qCisgKiBTVEFSVCBPRiAiR0VORVJJQyIgRU5DT0RFIFJPVVRJTkVTLgorICogICBUaGVzZSBtYXkgbG9vayBhIGxpdHRsZSB1Z2x5IHNpbmNlIHRoZXkgYXJlIGltcG9ydGVkIGZyb20gYSAiZ2VuZXJpYyIKKyAqIHNldCBvZiBYRFIgZW5jb2RlL2RlY29kZSByb3V0aW5lcyB3aGljaCBhcmUgaW50ZW5kZWQgdG8gYmUgc2hhcmVkIGJ5CisgKiBhbGwgb2Ygb3VyIE5GU3Y0IGltcGxlbWVudGF0aW9ucyAoT3BlbkJTRCwgTWFjT1MgWC4uLikuCisgKgorICogSWYgdGhlIHBhaW4gb2YgcmVhZGluZyB0aGVzZSBpcyB0b28gZ3JlYXQsIGl0IHNob3VsZCBiZSBhIHN0cmFpZ2h0Zm9yd2FyZAorICogdGFzayB0byB0cmFuc2xhdGUgdGhlbSBpbnRvIExpbnV4LXNwZWNpZmljIHZlcnNpb25zIHdoaWNoIGFyZSBtb3JlCisgKiBjb25zaXN0ZW50IHdpdGggdGhlIHN0eWxlIHVzZWQgaW4gTkZTdjIvdjMuLi4KKyAqLworI2RlZmluZSBFTkNPREVfSEVBRCAgICAgICAgICAgICAgdTMyICpwCisKKyNkZWZpbmUgV1JJVEUzMihuKSAgICAgICAgICAgICAgICpwKysgPSBodG9ubChuKQorI2RlZmluZSBXUklURTY0KG4pICAgICAgICAgICAgICAgZG8gewkJCQlcCisJKnArKyA9IGh0b25sKCh1MzIpKChuKSA+PiAzMikpOwkJCQlcCisJKnArKyA9IGh0b25sKCh1MzIpKG4pKTsJCQkJCVwKK30gd2hpbGUgKDApCisjZGVmaW5lIFdSSVRFTUVNKHB0cixuYnl0ZXMpICAgICBkbyB7CQkJCVwKKwkqKHAgKyBYRFJfUVVBRExFTihuYnl0ZXMpIC0xKSA9IDA7ICAgICAgICAgICAgICAgICAgICAgIFwKKwltZW1jcHkocCwgcHRyLCBuYnl0ZXMpOwkJCQkJXAorCXAgKz0gWERSX1FVQURMRU4obmJ5dGVzKTsJCQkJXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgV1JJVEVDSU5GTyhjKQkJZG8gewkJCQlcCisJKnArKyA9IGh0b25sKGMuYXRvbWljKTsJCQkJCVwKKwkqcCsrID0gaHRvbmwoYy5iZWZvcmVfY3RpbWVfc2VjKTsJCQkJXAorCSpwKysgPSBodG9ubChjLmJlZm9yZV9jdGltZV9uc2VjKTsJCQkJXAorCSpwKysgPSBodG9ubChjLmFmdGVyX2N0aW1lX3NlYyk7CQkJCVwKKwkqcCsrID0gaHRvbmwoYy5hZnRlcl9jdGltZV9uc2VjKTsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBSRVNFUlZFX1NQQUNFKG5ieXRlcykJZG8gewkJCQlcCisJcCA9IHJlc3AtPnA7CQkJCQkJXAorCUJVR19PTihwICsgWERSX1FVQURMRU4obmJ5dGVzKSA+IHJlc3AtPmVuZCk7CQlcCit9IHdoaWxlICgwKQorI2RlZmluZSBBREpVU1RfQVJHUygpCQlyZXNwLT5wID0gcAorCisvKgorICogSGVhZGVyIHJvdXRpbmUgdG8gc2V0dXAgc2VxaWQgb3BlcmF0aW9uIHJlcGxheSBjYWNoZQorICovCisjZGVmaW5lIEVOQ09ERV9TRVFJRF9PUF9IRUFECQkJCQlcCisJdTMyICpwOwkJCQkJCQlcCisJdTMyICpzYXZlOwkJCQkJCVwKKwkJCQkJCQkJXAorCXNhdmUgPSByZXNwLT5wOworCisvKgorICogUm91dGluZSBmb3IgZW5jb2RpbmcgdGhlIHJlc3VsdCBvZiBhCisgKiAic2VxaWQtbXV0YXRpbmciIE5GU3Y0IG9wZXJhdGlvbi4gIFRoaXMgaXMKKyAqIHdoZXJlIHNlcWlkcyBhcmUgaW5jcmVtZW50ZWQsIGFuZCB0aGUKKyAqIHJlcGxheSBjYWNoZSBpcyBmaWxsZWQuCisgKi8KKworI2RlZmluZSBFTkNPREVfU0VRSURfT1BfVEFJTChzdGF0ZW93bmVyKSBkbyB7CQkJXAorCWlmIChzZXFpZF9tdXRhdGluZ19lcnIobmZzZXJyKSAmJiBzdGF0ZW93bmVyKSB7IAlcCisJCWlmIChzdGF0ZW93bmVyLT5zb19jb25maXJtZWQpCQkJXAorCQkJc3RhdGVvd25lci0+c29fc2VxaWQrKzsJCQlcCisJCXN0YXRlb3duZXItPnNvX3JlcGxheS5ycF9zdGF0dXMgPSBuZnNlcnI7ICAgCVwKKwkJc3RhdGVvd25lci0+c29fcmVwbGF5LnJwX2J1ZmxlbiA9IAkJXAorCQkJICAoKChjaGFyICopKHJlc3ApLT5wIC0gKGNoYXIgKilzYXZlKSk7IFwKKwkJbWVtY3B5KHN0YXRlb3duZXItPnNvX3JlcGxheS5ycF9idWYsIHNhdmUsICAgICAgXAorIAkJCXN0YXRlb3duZXItPnNvX3JlcGxheS5ycF9idWZsZW4pOyAJXAorCX0gfSB3aGlsZSAoMCk7CisKKworc3RhdGljIHUzMiBuZnM0X2Z0eXBlc1sxNl0gPSB7CisgICAgICAgIE5GNEJBRCwgIE5GNEZJRk8sIE5GNENIUiwgTkY0QkFELAorICAgICAgICBORjRESVIsICBORjRCQUQsICBORjRCTEssIE5GNEJBRCwKKyAgICAgICAgTkY0UkVHLCAgTkY0QkFELCAgTkY0TE5LLCBORjRCQUQsCisgICAgICAgIE5GNFNPQ0ssIE5GNEJBRCwgIE5GNExOSywgTkY0QkFELAorfTsKKworc3RhdGljIGludAorbmZzZDRfZW5jb2RlX25hbWUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgaW50IHdob3R5cGUsIHVpZF90IGlkLCBpbnQgZ3JvdXAsCisJCQl1MzIgKipwLCBpbnQgKmJ1ZmxlbikKK3sKKwlpbnQgc3RhdHVzOworCisJaWYgKCpidWZsZW4gPCAoWERSX1FVQURMRU4oSURNQVBfTkFNRVNaKSA8PCAyKSArIDQpCisJCXJldHVybiBuZnNlcnJfcmVzb3VyY2U7CisJaWYgKHdob3R5cGUgIT0gTkZTNF9BQ0xfV0hPX05BTUVEKQorCQlzdGF0dXMgPSBuZnM0X2FjbF93cml0ZV93aG8od2hvdHlwZSwgKHU4ICopKCpwICsgMSkpOworCWVsc2UgaWYgKGdyb3VwKQorCQlzdGF0dXMgPSBuZnNkX21hcF9naWRfdG9fbmFtZShycXN0cCwgaWQsICh1OCAqKSgqcCArIDEpKTsKKwllbHNlCisJCXN0YXR1cyA9IG5mc2RfbWFwX3VpZF90b19uYW1lKHJxc3RwLCBpZCwgKHU4ICopKCpwICsgMSkpOworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm4gbmZzZXJybm8oc3RhdHVzKTsKKwkqcCA9IHhkcl9lbmNvZGVfb3BhcXVlKCpwLCBOVUxMLCBzdGF0dXMpOworCSpidWZsZW4gLT0gKFhEUl9RVUFETEVOKHN0YXR1cykgPDwgMikgKyA0OworCUJVR19PTigqYnVmbGVuIDwgMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CituZnNkNF9lbmNvZGVfdXNlcihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1aWRfdCB1aWQsIHUzMiAqKnAsIGludCAqYnVmbGVuKQoreworCXJldHVybiBuZnNkNF9lbmNvZGVfbmFtZShycXN0cCwgTkZTNF9BQ0xfV0hPX05BTUVELCB1aWQsIDAsIHAsIGJ1Zmxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CituZnNkNF9lbmNvZGVfZ3JvdXAoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdWlkX3QgZ2lkLCB1MzIgKipwLCBpbnQgKmJ1ZmxlbikKK3sKKwlyZXR1cm4gbmZzZDRfZW5jb2RlX25hbWUocnFzdHAsIE5GUzRfQUNMX1dIT19OQU1FRCwgZ2lkLCAxLCBwLCBidWZsZW4pOworfQorCitzdGF0aWMgaW5saW5lIGludAorbmZzZDRfZW5jb2RlX2FjbG5hbWUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgaW50IHdob3R5cGUsIHVpZF90IGlkLCBpbnQgZ3JvdXAsCisJCXUzMiAqKnAsIGludCAqYnVmbGVuKQoreworCXJldHVybiBuZnNkNF9lbmNvZGVfbmFtZShycXN0cCwgd2hvdHlwZSwgaWQsIGdyb3VwLCBwLCBidWZsZW4pOworfQorCisKKy8qCisgKiBOb3RlOiBAZmhwIGNhbiBiZSBOVUxMOyBpbiB0aGlzIGNhc2UsIHdlIG1pZ2h0IGhhdmUgdG8gY29tcG9zZSB0aGUgZmlsZWhhbmRsZQorICogb3Vyc2VsdmVzLgorICoKKyAqIEBjb3VudHAgaXMgdGhlIGJ1ZmZlciBzaXplIGluIF93b3Jkc187IHVwb24gc3VjY2Vzc2Z1bCByZXR1cm4gdGhpcyBiZWNvbWVzCisgKiByZXBsYWNlZCB3aXRoIHRoZSBudW1iZXIgb2Ygd29yZHMgd3JpdHRlbi4KKyAqLworaW50CituZnNkNF9lbmNvZGVfZmF0dHIoc3RydWN0IHN2Y19maCAqZmhwLCBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwLAorCQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHUzMiAqYnVmZmVyLCBpbnQgKmNvdW50cCwgdTMyICpibXZhbCwKKwkJc3RydWN0IHN2Y19ycXN0ICpycXN0cCkKK3sKKwl1MzIgYm12YWwwID0gYm12YWxbMF07CisJdTMyIGJtdmFsMSA9IGJtdmFsWzFdOworCXN0cnVjdCBrc3RhdCBzdGF0OworCXN0cnVjdCBzdmNfZmggdGVtcGZoOworCXN0cnVjdCBrc3RhdGZzIHN0YXRmczsKKwlpbnQgYnVmbGVuID0gKmNvdW50cCA8PCAyOworCXUzMiAqYXR0cmxlbnA7CisJdTMyIGR1bW15OworCXU2NCBkdW1teTY0OworCXUzMiAqcCA9IGJ1ZmZlcjsKKwlpbnQgc3RhdHVzOworCWludCBhY2xzdXBwb3J0ID0gMDsKKwlzdHJ1Y3QgbmZzNF9hY2wgKmFjbCA9IE5VTEw7CisKKwlCVUdfT04oYm12YWwxICYgTkZTRF9XUklURU9OTFlfQVRUUlNfV09SRDEpOworCUJVR19PTihibXZhbDAgJiB+TkZTRF9TVVBQT1JURURfQVRUUlNfV09SRDApOworCUJVR19PTihibXZhbDEgJiB+TkZTRF9TVVBQT1JURURfQVRUUlNfV09SRDEpOworCisJc3RhdHVzID0gdmZzX2dldGF0dHIoZXhwLT5leF9tbnQsIGRlbnRyeSwgJnN0YXQpOworCWlmIChzdGF0dXMpCisJCWdvdG8gb3V0X25mc2VycjsKKwlpZiAoKGJtdmFsMCAmIChGQVRUUjRfV09SRDBfRklMRVNfRlJFRSB8IEZBVFRSNF9XT1JEMF9GSUxFU19UT1RBTCkpIHx8CisJICAgIChibXZhbDEgJiAoRkFUVFI0X1dPUkQxX1NQQUNFX0FWQUlMIHwgRkFUVFI0X1dPUkQxX1NQQUNFX0ZSRUUgfAorCQkgICAgICAgRkFUVFI0X1dPUkQxX1NQQUNFX1RPVEFMKSkpIHsKKwkJc3RhdHVzID0gdmZzX3N0YXRmcyhkZW50cnktPmRfaW5vZGUtPmlfc2IsICZzdGF0ZnMpOworCQlpZiAoc3RhdHVzKQorCQkJZ290byBvdXRfbmZzZXJyOworCX0KKwlpZiAoKGJtdmFsMCAmIChGQVRUUjRfV09SRDBfRklMRUhBTkRMRSB8IEZBVFRSNF9XT1JEMF9GU0lEKSkgJiYgIWZocCkgeworCQlmaF9pbml0KCZ0ZW1wZmgsIE5GUzRfRkhTSVpFKTsKKwkJc3RhdHVzID0gZmhfY29tcG9zZSgmdGVtcGZoLCBleHAsIGRlbnRyeSwgTlVMTCk7CisJCWlmIChzdGF0dXMpCisJCQlnb3RvIG91dDsKKwkJZmhwID0gJnRlbXBmaDsKKwl9CisJaWYgKGJtdmFsMCAmIChGQVRUUjRfV09SRDBfQUNMIHwgRkFUVFI0X1dPUkQwX0FDTFNVUFBPUlQKKwkJCXwgRkFUVFI0X1dPUkQwX1NVUFBPUlRFRF9BVFRSUykpIHsKKwkJc3RhdHVzID0gbmZzZDRfZ2V0X25mczRfYWNsKHJxc3RwLCBkZW50cnksICZhY2wpOworCQlhY2xzdXBwb3J0ID0gKHN0YXR1cyA9PSAwKTsKKwkJaWYgKGJtdmFsMCAmIEZBVFRSNF9XT1JEMF9BQ0wpIHsKKwkJCWlmIChzdGF0dXMgPT0gLUVPUE5PVFNVUFApCisJCQkJYm12YWwwICY9IH5GQVRUUjRfV09SRDBfQUNMOworCQkJZWxzZSBpZiAoc3RhdHVzID09IC1FSU5WQUwpIHsKKwkJCQlzdGF0dXMgPSBuZnNlcnJfYXR0cm5vdHN1cHA7CisJCQkJZ290byBvdXQ7CisJCQl9IGVsc2UgaWYgKHN0YXR1cyAhPSAwKQorCQkJCWdvdG8gb3V0X25mc2VycjsKKwkJfQorCX0KKwlpZiAoKGJ1ZmxlbiAtPSAxNikgPCAwKQorCQlnb3RvIG91dF9yZXNvdXJjZTsKKworCVdSSVRFMzIoMik7CisJV1JJVEUzMihibXZhbDApOworCVdSSVRFMzIoYm12YWwxKTsKKwlhdHRybGVucCA9IHArKzsgICAgICAgICAgICAgICAgLyogdG8gYmUgYmFja2ZpbGxlZCBsYXRlciAqLworCisJaWYgKGJtdmFsMCAmIEZBVFRSNF9XT1JEMF9TVVBQT1JURURfQVRUUlMpIHsKKwkJaWYgKChidWZsZW4gLT0gMTIpIDwgMCkKKwkJCWdvdG8gb3V0X3Jlc291cmNlOworCQlXUklURTMyKDIpOworCQlXUklURTMyKGFjbHN1cHBvcnQgPworCQkJTkZTRF9TVVBQT1JURURfQVRUUlNfV09SRDAgOgorCQkJTkZTRF9TVVBQT1JURURfQVRUUlNfV09SRDAgJiB+RkFUVFI0X1dPUkQwX0FDTCk7CisJCVdSSVRFMzIoTkZTRF9TVVBQT1JURURfQVRUUlNfV09SRDEpOworCX0KKwlpZiAoYm12YWwwICYgRkFUVFI0X1dPUkQwX1RZUEUpIHsKKwkJaWYgKChidWZsZW4gLT0gNCkgPCAwKQorCQkJZ290byBvdXRfcmVzb3VyY2U7CisJCWR1bW15ID0gbmZzNF9mdHlwZXNbKHN0YXQubW9kZSAmIFNfSUZNVCkgPj4gMTJdOworCQlpZiAoZHVtbXkgPT0gTkY0QkFEKQorCQkJZ290byBvdXRfc2VydmVyZmF1bHQ7CisJCVdSSVRFMzIoZHVtbXkpOworCX0KKwlpZiAoYm12YWwwICYgRkFUVFI0X1dPUkQwX0ZIX0VYUElSRV9UWVBFKSB7CisJCWlmICgoYnVmbGVuIC09IDQpIDwgMCkKKwkJCWdvdG8gb3V0X3Jlc291cmNlOworCQlXUklURTMyKCBORlM0X0ZIX05PRVhQSVJFX1dJVEhfT1BFTiB8IE5GUzRfRkhfVk9MX1JFTkFNRSApOworCX0KKwlpZiAoYm12YWwwICYgRkFUVFI0X1dPUkQwX0NIQU5HRSkgeworCQkvKgorCQkgKiBOb3RlOiBUaGlzIF9tdXN0XyBiZSBjb25zaXN0ZW50IHdpdGggdGhlIHNjaGVtZSBmb3Igd3JpdGluZworCQkgKiBjaGFuZ2VfaW5mbywgc28gYW55IGNoYW5nZXMgbWFkZSBoZXJlIG11c3QgYmUgcmVmbGVjdGVkIHRoZXJlCisJCSAqIGFzIHdlbGwuICAoU2VlIHhkcjQuaDpzZXRfY2hhbmdlX2luZm8oKSBhbmQgdGhlIFdSSVRFQ0lORk8oKQorCQkgKiBtYWNybyBhYm92ZS4pCisJCSAqLworCQlpZiAoKGJ1ZmxlbiAtPSA4KSA8IDApCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJV1JJVEUzMihzdGF0LmN0aW1lLnR2X3NlYyk7CisJCVdSSVRFMzIoc3RhdC5jdGltZS50dl9uc2VjKTsKKwl9CisJaWYgKGJtdmFsMCAmIEZBVFRSNF9XT1JEMF9TSVpFKSB7CisJCWlmICgoYnVmbGVuIC09IDgpIDwgMCkKKwkJCWdvdG8gb3V0X3Jlc291cmNlOworCQlXUklURTY0KHN0YXQuc2l6ZSk7CisJfQorCWlmIChibXZhbDAgJiBGQVRUUjRfV09SRDBfTElOS19TVVBQT1JUKSB7CisJCWlmICgoYnVmbGVuIC09IDQpIDwgMCkKKwkJCWdvdG8gb3V0X3Jlc291cmNlOworCQlXUklURTMyKDEpOworCX0KKwlpZiAoYm12YWwwICYgRkFUVFI0X1dPUkQwX1NZTUxJTktfU1VQUE9SVCkgeworCQlpZiAoKGJ1ZmxlbiAtPSA0KSA8IDApCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJV1JJVEUzMigxKTsKKwl9CisJaWYgKGJtdmFsMCAmIEZBVFRSNF9XT1JEMF9OQU1FRF9BVFRSKSB7CisJCWlmICgoYnVmbGVuIC09IDQpIDwgMCkKKwkJCWdvdG8gb3V0X3Jlc291cmNlOworCQlXUklURTMyKDApOworCX0KKwlpZiAoYm12YWwwICYgRkFUVFI0X1dPUkQwX0ZTSUQpIHsKKwkJaWYgKChidWZsZW4gLT0gMTYpIDwgMCkKKwkJCWdvdG8gb3V0X3Jlc291cmNlOworCQlpZiAoaXNfZnNpZChmaHAsIHJxc3RwLT5ycV9yZWZmaCkpIHsKKwkJCVdSSVRFNjQoKHU2NClleHAtPmV4X2ZzaWQpOworCQkJV1JJVEU2NCgodTY0KTApOworCQl9IGVsc2UgeworCQkJV1JJVEUzMigwKTsKKwkJCVdSSVRFMzIoTUFKT1Ioc3RhdC5kZXYpKTsKKwkJCVdSSVRFMzIoMCk7CisJCQlXUklURTMyKE1JTk9SKHN0YXQuZGV2KSk7CisJCX0KKwl9CisJaWYgKGJtdmFsMCAmIEZBVFRSNF9XT1JEMF9VTklRVUVfSEFORExFUykgeworCQlpZiAoKGJ1ZmxlbiAtPSA0KSA8IDApCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJV1JJVEUzMigwKTsKKwl9CisJaWYgKGJtdmFsMCAmIEZBVFRSNF9XT1JEMF9MRUFTRV9USU1FKSB7CisJCWlmICgoYnVmbGVuIC09IDQpIDwgMCkKKwkJCWdvdG8gb3V0X3Jlc291cmNlOworCQlXUklURTMyKE5GU0RfTEVBU0VfVElNRSk7CisJfQorCWlmIChibXZhbDAgJiBGQVRUUjRfV09SRDBfUkRBVFRSX0VSUk9SKSB7CisJCWlmICgoYnVmbGVuIC09IDQpIDwgMCkKKwkJCWdvdG8gb3V0X3Jlc291cmNlOworCQlXUklURTMyKDApOworCX0KKwlpZiAoYm12YWwwICYgRkFUVFI0X1dPUkQwX0FDTCkgeworCQlzdHJ1Y3QgbmZzNF9hY2UgKmFjZTsKKwkJc3RydWN0IGxpc3RfaGVhZCAqaDsKKworCQlpZiAoYWNsID09IE5VTEwpIHsKKwkJCWlmICgoYnVmbGVuIC09IDQpIDwgMCkKKwkJCQlnb3RvIG91dF9yZXNvdXJjZTsKKworCQkJV1JJVEUzMigwKTsKKwkJCWdvdG8gb3V0X2FjbDsKKwkJfQorCQlpZiAoKGJ1ZmxlbiAtPSA0KSA8IDApCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJV1JJVEUzMihhY2wtPm5hY2VzKTsKKworCQlsaXN0X2Zvcl9lYWNoKGgsICZhY2wtPmFjZV9oZWFkKSB7CisJCQlhY2UgPSBsaXN0X2VudHJ5KGgsIHN0cnVjdCBuZnM0X2FjZSwgbF9hY2UpOworCisJCQlpZiAoKGJ1ZmxlbiAtPSA0KjMpIDwgMCkKKwkJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJCVdSSVRFMzIoYWNlLT50eXBlKTsKKwkJCVdSSVRFMzIoYWNlLT5mbGFnKTsKKwkJCVdSSVRFMzIoYWNlLT5hY2Nlc3NfbWFzayAmIE5GUzRfQUNFX01BU0tfQUxMKTsKKwkJCXN0YXR1cyA9IG5mc2Q0X2VuY29kZV9hY2xuYW1lKHJxc3RwLCBhY2UtPndob3R5cGUsCisJCQkJYWNlLT53aG8sIGFjZS0+ZmxhZyAmIE5GUzRfQUNFX0lERU5USUZJRVJfR1JPVVAsCisJCQkJJnAsICZidWZsZW4pOworCQkJaWYgKHN0YXR1cyA9PSBuZnNlcnJfcmVzb3VyY2UpCisJCQkJZ290byBvdXRfcmVzb3VyY2U7CisJCQlpZiAoc3RhdHVzKQorCQkJCWdvdG8gb3V0OworCQl9CisJfQorb3V0X2FjbDoKKwlpZiAoYm12YWwwICYgRkFUVFI0X1dPUkQwX0FDTFNVUFBPUlQpIHsKKwkJaWYgKChidWZsZW4gLT0gNCkgPCAwKQorCQkJZ290byBvdXRfcmVzb3VyY2U7CisJCVdSSVRFMzIoYWNsc3VwcG9ydCA/CisJCQlBQ0w0X1NVUFBPUlRfQUxMT1dfQUNMfEFDTDRfU1VQUE9SVF9ERU5ZX0FDTCA6IDApOworCX0KKwlpZiAoYm12YWwwICYgRkFUVFI0X1dPUkQwX0NBTlNFVFRJTUUpIHsKKwkJaWYgKChidWZsZW4gLT0gNCkgPCAwKQorCQkJZ290byBvdXRfcmVzb3VyY2U7CisJCVdSSVRFMzIoMSk7CisJfQorCWlmIChibXZhbDAgJiBGQVRUUjRfV09SRDBfQ0FTRV9JTlNFTlNJVElWRSkgeworCQlpZiAoKGJ1ZmxlbiAtPSA0KSA8IDApCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJV1JJVEUzMigxKTsKKwl9CisJaWYgKGJtdmFsMCAmIEZBVFRSNF9XT1JEMF9DQVNFX1BSRVNFUlZJTkcpIHsKKwkJaWYgKChidWZsZW4gLT0gNCkgPCAwKQorCQkJZ290byBvdXRfcmVzb3VyY2U7CisJCVdSSVRFMzIoMSk7CisJfQorCWlmIChibXZhbDAgJiBGQVRUUjRfV09SRDBfQ0hPV05fUkVTVFJJQ1RFRCkgeworCQlpZiAoKGJ1ZmxlbiAtPSA0KSA8IDApCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJV1JJVEUzMigxKTsKKwl9CisJaWYgKGJtdmFsMCAmIEZBVFRSNF9XT1JEMF9GSUxFSEFORExFKSB7CisJCWJ1ZmxlbiAtPSAoWERSX1FVQURMRU4oZmhwLT5maF9oYW5kbGUuZmhfc2l6ZSkgPDwgMikgKyA0OworCQlpZiAoYnVmbGVuIDwgMCkKKwkJCWdvdG8gb3V0X3Jlc291cmNlOworCQlXUklURTMyKGZocC0+ZmhfaGFuZGxlLmZoX3NpemUpOworCQlXUklURU1FTSgmZmhwLT5maF9oYW5kbGUuZmhfYmFzZSwgZmhwLT5maF9oYW5kbGUuZmhfc2l6ZSk7CisJfQorCWlmIChibXZhbDAgJiBGQVRUUjRfV09SRDBfRklMRUlEKSB7CisJCWlmICgoYnVmbGVuIC09IDgpIDwgMCkKKwkJCWdvdG8gb3V0X3Jlc291cmNlOworCQlXUklURTY0KCh1NjQpIHN0YXQuaW5vKTsKKwl9CisJaWYgKGJtdmFsMCAmIEZBVFRSNF9XT1JEMF9GSUxFU19BVkFJTCkgeworCQlpZiAoKGJ1ZmxlbiAtPSA4KSA8IDApCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJV1JJVEU2NCgodTY0KSBzdGF0ZnMuZl9mZnJlZSk7CisJfQorCWlmIChibXZhbDAgJiBGQVRUUjRfV09SRDBfRklMRVNfRlJFRSkgeworCQlpZiAoKGJ1ZmxlbiAtPSA4KSA8IDApCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJV1JJVEU2NCgodTY0KSBzdGF0ZnMuZl9mZnJlZSk7CisJfQorCWlmIChibXZhbDAgJiBGQVRUUjRfV09SRDBfRklMRVNfVE9UQUwpIHsKKwkJaWYgKChidWZsZW4gLT0gOCkgPCAwKQorCQkJZ290byBvdXRfcmVzb3VyY2U7CisJCVdSSVRFNjQoKHU2NCkgc3RhdGZzLmZfZmlsZXMpOworCX0KKwlpZiAoYm12YWwwICYgRkFUVFI0X1dPUkQwX0hPTU9HRU5FT1VTKSB7CisJCWlmICgoYnVmbGVuIC09IDQpIDwgMCkKKwkJCWdvdG8gb3V0X3Jlc291cmNlOworCQlXUklURTMyKDEpOworCX0KKwlpZiAoYm12YWwwICYgRkFUVFI0X1dPUkQwX01BWEZJTEVTSVpFKSB7CisJCWlmICgoYnVmbGVuIC09IDgpIDwgMCkKKwkJCWdvdG8gb3V0X3Jlc291cmNlOworCQlXUklURTY0KH4odTY0KTApOworCX0KKwlpZiAoYm12YWwwICYgRkFUVFI0X1dPUkQwX01BWExJTkspIHsKKwkJaWYgKChidWZsZW4gLT0gNCkgPCAwKQorCQkJZ290byBvdXRfcmVzb3VyY2U7CisJCVdSSVRFMzIoMjU1KTsKKwl9CisJaWYgKGJtdmFsMCAmIEZBVFRSNF9XT1JEMF9NQVhOQU1FKSB7CisJCWlmICgoYnVmbGVuIC09IDQpIDwgMCkKKwkJCWdvdG8gb3V0X3Jlc291cmNlOworCQlXUklURTMyKH4odTMyKSAwKTsKKwl9CisJaWYgKGJtdmFsMCAmIEZBVFRSNF9XT1JEMF9NQVhSRUFEKSB7CisJCWlmICgoYnVmbGVuIC09IDgpIDwgMCkKKwkJCWdvdG8gb3V0X3Jlc291cmNlOworCQlXUklURTY0KCh1NjQpIE5GU1NWQ19NQVhCTEtTSVpFKTsKKwl9CisJaWYgKGJtdmFsMCAmIEZBVFRSNF9XT1JEMF9NQVhXUklURSkgeworCQlpZiAoKGJ1ZmxlbiAtPSA4KSA8IDApCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJV1JJVEU2NCgodTY0KSBORlNTVkNfTUFYQkxLU0laRSk7CisJfQorCWlmIChibXZhbDEgJiBGQVRUUjRfV09SRDFfTU9ERSkgeworCQlpZiAoKGJ1ZmxlbiAtPSA0KSA8IDApCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJV1JJVEUzMihzdGF0Lm1vZGUgJiBTX0lBTExVR08pOworCX0KKwlpZiAoYm12YWwxICYgRkFUVFI0X1dPUkQxX05PX1RSVU5DKSB7CisJCWlmICgoYnVmbGVuIC09IDQpIDwgMCkKKwkJCWdvdG8gb3V0X3Jlc291cmNlOworCQlXUklURTMyKDEpOworCX0KKwlpZiAoYm12YWwxICYgRkFUVFI0X1dPUkQxX05VTUxJTktTKSB7CisJCWlmICgoYnVmbGVuIC09IDQpIDwgMCkKKwkJCWdvdG8gb3V0X3Jlc291cmNlOworCQlXUklURTMyKHN0YXQubmxpbmspOworCX0KKwlpZiAoYm12YWwxICYgRkFUVFI0X1dPUkQxX09XTkVSKSB7CisJCXN0YXR1cyA9IG5mc2Q0X2VuY29kZV91c2VyKHJxc3RwLCBzdGF0LnVpZCwgJnAsICZidWZsZW4pOworCQlpZiAoc3RhdHVzID09IG5mc2Vycl9yZXNvdXJjZSkKKwkJCWdvdG8gb3V0X3Jlc291cmNlOworCQlpZiAoc3RhdHVzKQorCQkJZ290byBvdXQ7CisJfQorCWlmIChibXZhbDEgJiBGQVRUUjRfV09SRDFfT1dORVJfR1JPVVApIHsKKwkJc3RhdHVzID0gbmZzZDRfZW5jb2RlX2dyb3VwKHJxc3RwLCBzdGF0LmdpZCwgJnAsICZidWZsZW4pOworCQlpZiAoc3RhdHVzID09IG5mc2Vycl9yZXNvdXJjZSkKKwkJCWdvdG8gb3V0X3Jlc291cmNlOworCQlpZiAoc3RhdHVzKQorCQkJZ290byBvdXQ7CisJfQorCWlmIChibXZhbDEgJiBGQVRUUjRfV09SRDFfUkFXREVWKSB7CisJCWlmICgoYnVmbGVuIC09IDgpIDwgMCkKKwkJCWdvdG8gb3V0X3Jlc291cmNlOworCQlXUklURTMyKCh1MzIpIE1BSk9SKHN0YXQucmRldikpOworCQlXUklURTMyKCh1MzIpIE1JTk9SKHN0YXQucmRldikpOworCX0KKwlpZiAoYm12YWwxICYgRkFUVFI0X1dPUkQxX1NQQUNFX0FWQUlMKSB7CisJCWlmICgoYnVmbGVuIC09IDgpIDwgMCkKKwkJCWdvdG8gb3V0X3Jlc291cmNlOworCQlkdW1teTY0ID0gKHU2NClzdGF0ZnMuZl9iYXZhaWwgKiAodTY0KXN0YXRmcy5mX2JzaXplOworCQlXUklURTY0KGR1bW15NjQpOworCX0KKwlpZiAoYm12YWwxICYgRkFUVFI0X1dPUkQxX1NQQUNFX0ZSRUUpIHsKKwkJaWYgKChidWZsZW4gLT0gOCkgPCAwKQorCQkJZ290byBvdXRfcmVzb3VyY2U7CisJCWR1bW15NjQgPSAodTY0KXN0YXRmcy5mX2JmcmVlICogKHU2NClzdGF0ZnMuZl9ic2l6ZTsKKwkJV1JJVEU2NChkdW1teTY0KTsKKwl9CisJaWYgKGJtdmFsMSAmIEZBVFRSNF9XT1JEMV9TUEFDRV9UT1RBTCkgeworCQlpZiAoKGJ1ZmxlbiAtPSA4KSA8IDApCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJZHVtbXk2NCA9ICh1NjQpc3RhdGZzLmZfYmxvY2tzICogKHU2NClzdGF0ZnMuZl9ic2l6ZTsKKwkJV1JJVEU2NChkdW1teTY0KTsKKwl9CisJaWYgKGJtdmFsMSAmIEZBVFRSNF9XT1JEMV9TUEFDRV9VU0VEKSB7CisJCWlmICgoYnVmbGVuIC09IDgpIDwgMCkKKwkJCWdvdG8gb3V0X3Jlc291cmNlOworCQlkdW1teTY0ID0gKHU2NClzdGF0LmJsb2NrcyA8PCA5OworCQlXUklURTY0KGR1bW15NjQpOworCX0KKwlpZiAoYm12YWwxICYgRkFUVFI0X1dPUkQxX1RJTUVfQUNDRVNTKSB7CisJCWlmICgoYnVmbGVuIC09IDEyKSA8IDApCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJV1JJVEUzMigwKTsKKwkJV1JJVEUzMihzdGF0LmF0aW1lLnR2X3NlYyk7CisJCVdSSVRFMzIoc3RhdC5hdGltZS50dl9uc2VjKTsKKwl9CisJaWYgKGJtdmFsMSAmIEZBVFRSNF9XT1JEMV9USU1FX0RFTFRBKSB7CisJCWlmICgoYnVmbGVuIC09IDEyKSA8IDApCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJV1JJVEUzMigwKTsKKwkJV1JJVEUzMigxKTsKKwkJV1JJVEUzMigwKTsKKwl9CisJaWYgKGJtdmFsMSAmIEZBVFRSNF9XT1JEMV9USU1FX01FVEFEQVRBKSB7CisJCWlmICgoYnVmbGVuIC09IDEyKSA8IDApCisJCQlnb3RvIG91dF9yZXNvdXJjZTsKKwkJV1JJVEUzMigwKTsKKwkJV1JJVEUzMihzdGF0LmN0aW1lLnR2X3NlYyk7CisJCVdSSVRFMzIoc3RhdC5jdGltZS50dl9uc2VjKTsKKwl9CisJaWYgKGJtdmFsMSAmIEZBVFRSNF9XT1JEMV9USU1FX01PRElGWSkgeworCQlpZiAoKGJ1ZmxlbiAtPSAxMikgPCAwKQorCQkJZ290byBvdXRfcmVzb3VyY2U7CisJCVdSSVRFMzIoMCk7CisJCVdSSVRFMzIoc3RhdC5tdGltZS50dl9zZWMpOworCQlXUklURTMyKHN0YXQubXRpbWUudHZfbnNlYyk7CisJfQorCWlmIChibXZhbDEgJiBGQVRUUjRfV09SRDFfTU9VTlRFRF9PTl9GSUxFSUQpIHsKKwkJc3RydWN0IGRlbnRyeSAqbW50X3BudCwgKm1udF9yb290OworCisJCWlmICgoYnVmbGVuIC09IDgpIDwgMCkKKyAgICAgICAgICAgICAgICAJZ290byBvdXRfcmVzb3VyY2U7CisJCW1udF9yb290ID0gZXhwLT5leF9tbnQtPm1udF9yb290OworCQlpZiAobW50X3Jvb3QtPmRfaW5vZGUgPT0gZGVudHJ5LT5kX2lub2RlKSB7CisJCQltbnRfcG50ID0gZXhwLT5leF9tbnQtPm1udF9tb3VudHBvaW50OworCQkJV1JJVEU2NCgodTY0KSBtbnRfcG50LT5kX2lub2RlLT5pX2lubyk7CisJCX0gZWxzZQorICAgICAgICAgICAgICAgIAlXUklURTY0KCh1NjQpIHN0YXQuaW5vKTsKKwl9CisJKmF0dHJsZW5wID0gaHRvbmwoKGNoYXIgKilwIC0gKGNoYXIgKilhdHRybGVucCAtIDQpOworCSpjb3VudHAgPSBwIC0gYnVmZmVyOworCXN0YXR1cyA9IG5mc19vazsKKworb3V0OgorCW5mczRfYWNsX2ZyZWUoYWNsKTsKKwlpZiAoZmhwID09ICZ0ZW1wZmgpCisJCWZoX3B1dCgmdGVtcGZoKTsKKwlyZXR1cm4gc3RhdHVzOworb3V0X25mc2VycjoKKwlzdGF0dXMgPSBuZnNlcnJubyhzdGF0dXMpOworCWdvdG8gb3V0Oworb3V0X3Jlc291cmNlOgorCSpjb3VudHAgPSAwOworCXN0YXR1cyA9IG5mc2Vycl9yZXNvdXJjZTsKKwlnb3RvIG91dDsKK291dF9zZXJ2ZXJmYXVsdDoKKwlzdGF0dXMgPSBuZnNlcnJfc2VydmVyZmF1bHQ7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyBpbnQKK25mc2Q0X2VuY29kZV9kaXJlbnRfZmF0dHIoc3RydWN0IG5mc2Q0X3JlYWRkaXIgKmNkLAorCQljb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtbGVuLCB1MzIgKnAsIGludCAqYnVmbGVuKQoreworCXN0cnVjdCBzdmNfZXhwb3J0ICpleHAgPSBjZC0+cmRfZmhwLT5maF9leHBvcnQ7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCWludCBuZnNlcnI7CisKKwlkZW50cnkgPSBsb29rdXBfb25lX2xlbihuYW1lLCBjZC0+cmRfZmhwLT5maF9kZW50cnksIG5hbWxlbik7CisJaWYgKElTX0VSUihkZW50cnkpKQorCQlyZXR1cm4gbmZzZXJybm8oUFRSX0VSUihkZW50cnkpKTsKKworCWV4cF9nZXQoZXhwKTsKKwlpZiAoZF9tb3VudHBvaW50KGRlbnRyeSkpIHsKKwkJaWYgKG5mc2RfY3Jvc3NfbW50KGNkLT5yZF9ycXN0cCwgJmRlbnRyeSwgJmV4cCkpIHsKKwkJLyoKKwkJICogLUVBR0FJTiBpcyB0aGUgb25seSBlcnJvciByZXR1cm5lZCBmcm9tCisJCSAqIG5mc2RfY3Jvc3NfbW50KCkgYW5kIGl0IGluZGljYXRlcyB0aGF0IGFuCisJCSAqIHVwLWNhbGwgaGFzICBiZWVuIGluaXRpYXRlZCB0byBmaWxsIGluIHRoZSBleHBvcnQKKwkJICogb3B0aW9ucyBvbiBleHAuICBXaGVuIHRoZSBhbnN3ZXIgY29tZXMgYmFjaywKKwkJICogdGhpcyBjYWxsIHdpbGwgYmUgcmV0cmllZC4KKwkJICovCisJCQluZnNlcnIgPSBuZnNlcnJfZHJvcGl0OworCQkJZ290byBvdXRfcHV0OworCQl9CisKKwl9CisJbmZzZXJyID0gbmZzZDRfZW5jb2RlX2ZhdHRyKE5VTEwsIGV4cCwgZGVudHJ5LCBwLCBidWZsZW4sIGNkLT5yZF9ibXZhbCwKKwkJCQkJY2QtPnJkX3Jxc3RwKTsKK291dF9wdXQ6CisJZHB1dChkZW50cnkpOworCWV4cF9wdXQoZXhwKTsKKwlyZXR1cm4gbmZzZXJyOworfQorCitzdGF0aWMgdTMyICoKK25mc2Q0X2VuY29kZV9yZGF0dHJfZXJyb3IodTMyICpwLCBpbnQgYnVmbGVuLCBpbnQgbmZzZXJyKQoreworCXUzMiAqYXR0cmxlbnA7CisKKwlpZiAoYnVmbGVuIDwgNikKKwkJcmV0dXJuIE5VTEw7CisJKnArKyA9IGh0b25sKDIpOworCSpwKysgPSBodG9ubChGQVRUUjRfV09SRDBfUkRBVFRSX0VSUk9SKTsgLyogYm12YWwwICovCisJKnArKyA9IGh0b25sKDApOwkJCSAvKiBibXZhbDEgKi8KKworCWF0dHJsZW5wID0gcCsrOworCSpwKysgPSBuZnNlcnI7ICAgICAgIC8qIG5vIGh0b25sICovCisJKmF0dHJsZW5wID0gaHRvbmwoKGNoYXIgKilwIC0gKGNoYXIgKilhdHRybGVucCAtIDQpOworCXJldHVybiBwOworfQorCitzdGF0aWMgaW50CituZnNkNF9lbmNvZGVfZGlyZW50KHN0cnVjdCByZWFkZGlyX2NkICpjY2QsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1sZW4sCisJCSAgICBsb2ZmX3Qgb2Zmc2V0LCBpbm9fdCBpbm8sIHVuc2lnbmVkIGludCBkX3R5cGUpCit7CisJc3RydWN0IG5mc2Q0X3JlYWRkaXIgKmNkID0gY29udGFpbmVyX29mKGNjZCwgc3RydWN0IG5mc2Q0X3JlYWRkaXIsIGNvbW1vbik7CisJaW50IGJ1ZmxlbjsKKwl1MzIgKnAgPSBjZC0+YnVmZmVyOworCWludCBuZnNlcnIgPSBuZnNlcnJfdG9vc21hbGw7CisKKwkvKiBJbiBuZnN2NCwgIi4iIGFuZCAiLi4iIG5ldmVyIG1ha2UgaXQgb250byB0aGUgd2lyZS4uICovCisJaWYgKG5hbWUgJiYgaXNkb3RlbnQobmFtZSwgbmFtbGVuKSkgeworCQljZC0+Y29tbW9uLmVyciA9IG5mc19vazsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGNkLT5vZmZzZXQpCisJCXhkcl9lbmNvZGVfaHlwZXIoY2QtPm9mZnNldCwgKHU2NCkgb2Zmc2V0KTsKKworCWJ1ZmxlbiA9IGNkLT5idWZsZW4gLSA0IC0gWERSX1FVQURMRU4obmFtbGVuKTsKKwlpZiAoYnVmbGVuIDwgMCkKKwkJZ290byBmYWlsOworCisJKnArKyA9IHhkcl9vbmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXJrIGVudHJ5IHByZXNlbnQgKi8KKwljZC0+b2Zmc2V0ID0gcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlbWVtYmVyIHBvaW50ZXIgKi8KKwlwID0geGRyX2VuY29kZV9oeXBlcihwLCBORlNfT0ZGU0VUX01BWCk7ICAgIC8qIG9mZnNldCBvZiBuZXh0IGVudHJ5ICovCisJcCA9IHhkcl9lbmNvZGVfYXJyYXkocCwgbmFtZSwgbmFtbGVuKTsgICAgICAvKiBuYW1lIGxlbmd0aCAmIG5hbWUgKi8KKworCW5mc2VyciA9IG5mc2Q0X2VuY29kZV9kaXJlbnRfZmF0dHIoY2QsIG5hbWUsIG5hbWxlbiwgcCwgJmJ1Zmxlbik7CisJc3dpdGNoIChuZnNlcnIpIHsKKwljYXNlIG5mc19vazoKKwkJcCArPSBidWZsZW47CisJCWJyZWFrOworCWNhc2UgbmZzZXJyX3Jlc291cmNlOgorCQluZnNlcnIgPSBuZnNlcnJfdG9vc21hbGw7CisJCWdvdG8gZmFpbDsKKwljYXNlIG5mc2Vycl9kcm9waXQ6CisJCWdvdG8gZmFpbDsKKwlkZWZhdWx0OgorCQkvKgorCQkgKiBJZiB0aGUgY2xpZW50IHJlcXVlc3RlZCB0aGUgUkRBVFRSX0VSUk9SIGF0dHJpYnV0ZSwKKwkJICogd2Ugc3R1ZmYgdGhlIGVycm9yIGNvZGUgaW50byB0aGlzIGF0dHJpYnV0ZQorCQkgKiBhbmQgY29udGludWUuICBJZiB0aGlzIGF0dHJpYnV0ZSB3YXMgbm90IHJlcXVlc3RlZCwKKwkJICogdGhlbiBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIHNwZWMsIHdlIGZhaWwgdGhlCisJCSAqIGVudGlyZSBSRUFERElSIG9wZXJhdGlvbighKQorCQkgKi8KKwkJaWYgKCEoY2QtPnJkX2JtdmFsWzBdICYgRkFUVFI0X1dPUkQwX1JEQVRUUl9FUlJPUikpCisJCQlnb3RvIGZhaWw7CisJCW5mc2VyciA9IG5mc2Vycl90b29zbWFsbDsKKwkJcCA9IG5mc2Q0X2VuY29kZV9yZGF0dHJfZXJyb3IocCwgYnVmbGVuLCBuZnNlcnIpOworCQlpZiAocCA9PSBOVUxMKQorCQkJZ290byBmYWlsOworCX0KKwljZC0+YnVmbGVuIC09IChwIC0gY2QtPmJ1ZmZlcik7CisJY2QtPmJ1ZmZlciA9IHA7CisJY2QtPmNvbW1vbi5lcnIgPSBuZnNfb2s7CisJcmV0dXJuIDA7CitmYWlsOgorCWNkLT5jb21tb24uZXJyID0gbmZzZXJyOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgdm9pZAorbmZzZDRfZW5jb2RlX2FjY2VzcyhzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIGludCBuZnNlcnIsIHN0cnVjdCBuZnNkNF9hY2Nlc3MgKmFjY2VzcykKK3sKKwlFTkNPREVfSEVBRDsKKworCWlmICghbmZzZXJyKSB7CisJCVJFU0VSVkVfU1BBQ0UoOCk7CisJCVdSSVRFMzIoYWNjZXNzLT5hY19zdXBwb3J0ZWQpOworCQlXUklURTMyKGFjY2Vzcy0+YWNfcmVzcF9hY2Nlc3MpOworCQlBREpVU1RfQVJHUygpOworCX0KK30KKworc3RhdGljIHZvaWQKK25mc2Q0X2VuY29kZV9jbG9zZShzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIGludCBuZnNlcnIsIHN0cnVjdCBuZnNkNF9jbG9zZSAqY2xvc2UpCit7CisJRU5DT0RFX1NFUUlEX09QX0hFQUQ7CisKKwlpZiAoIW5mc2VycikgeworCQlSRVNFUlZFX1NQQUNFKHNpemVvZihzdGF0ZWlkX3QpKTsKKwkJV1JJVEUzMihjbG9zZS0+Y2xfc3RhdGVpZC5zaV9nZW5lcmF0aW9uKTsKKwkJV1JJVEVNRU0oJmNsb3NlLT5jbF9zdGF0ZWlkLnNpX29wYXF1ZSwgc2l6ZW9mKHN0YXRlaWRfb3BhcXVlX3QpKTsKKwkJQURKVVNUX0FSR1MoKTsKKwl9CisJRU5DT0RFX1NFUUlEX09QX1RBSUwoY2xvc2UtPmNsX3N0YXRlb3duZXIpOworfQorCisKK3N0YXRpYyB2b2lkCituZnNkNF9lbmNvZGVfY29tbWl0KHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgaW50IG5mc2Vyciwgc3RydWN0IG5mc2Q0X2NvbW1pdCAqY29tbWl0KQoreworCUVOQ09ERV9IRUFEOworCisJaWYgKCFuZnNlcnIpIHsKKwkJUkVTRVJWRV9TUEFDRSg4KTsKKwkJV1JJVEVNRU0oY29tbWl0LT5jb192ZXJmLmRhdGEsIDgpOworCQlBREpVU1RfQVJHUygpOworCX0KK30KKworc3RhdGljIHZvaWQKK25mc2Q0X2VuY29kZV9jcmVhdGUoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBpbnQgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfY3JlYXRlICpjcmVhdGUpCit7CisJRU5DT0RFX0hFQUQ7CisKKwlpZiAoIW5mc2VycikgeworCQlSRVNFUlZFX1NQQUNFKDMyKTsKKwkJV1JJVEVDSU5GTyhjcmVhdGUtPmNyX2NpbmZvKTsKKwkJV1JJVEUzMigyKTsKKwkJV1JJVEUzMihjcmVhdGUtPmNyX2JtdmFsWzBdKTsKKwkJV1JJVEUzMihjcmVhdGUtPmNyX2JtdmFsWzFdKTsKKwkJQURKVVNUX0FSR1MoKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK25mc2Q0X2VuY29kZV9nZXRhdHRyKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgaW50IG5mc2Vyciwgc3RydWN0IG5mc2Q0X2dldGF0dHIgKmdldGF0dHIpCit7CisJc3RydWN0IHN2Y19maCAqZmhwID0gZ2V0YXR0ci0+Z2FfZmhwOworCWludCBidWZsZW47CisKKwlpZiAobmZzZXJyKQorCQlyZXR1cm4gbmZzZXJyOworCisJYnVmbGVuID0gcmVzcC0+ZW5kIC0gcmVzcC0+cCAtIChDT01QT1VORF9FUlJfU0xBQ0tfU1BBQ0UgPj4gMik7CisJbmZzZXJyID0gbmZzZDRfZW5jb2RlX2ZhdHRyKGZocCwgZmhwLT5maF9leHBvcnQsIGZocC0+ZmhfZGVudHJ5LAorCQkJCSAgICByZXNwLT5wLCAmYnVmbGVuLCBnZXRhdHRyLT5nYV9ibXZhbCwKKwkJCQkgICAgcmVzcC0+cnFzdHApOworCisJaWYgKCFuZnNlcnIpCisJCXJlc3AtPnAgKz0gYnVmbGVuOworCXJldHVybiBuZnNlcnI7Cit9CisKK3N0YXRpYyB2b2lkCituZnNkNF9lbmNvZGVfZ2V0Zmgoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBpbnQgbmZzZXJyLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHApCit7CisJdW5zaWduZWQgaW50IGxlbjsKKwlFTkNPREVfSEVBRDsKKworCWlmICghbmZzZXJyKSB7CisJCWxlbiA9IGZocC0+ZmhfaGFuZGxlLmZoX3NpemU7CisJCVJFU0VSVkVfU1BBQ0UobGVuICsgNCk7CisJCVdSSVRFMzIobGVuKTsKKwkJV1JJVEVNRU0oJmZocC0+ZmhfaGFuZGxlLmZoX2Jhc2UsIGxlbik7CisJCUFESlVTVF9BUkdTKCk7CisJfQorfQorCisvKgorKiBJbmNsdWRpbmcgYWxsIGZpZWxkcyBvdGhlciB0aGFuIHRoZSBuYW1lLCBhIExPQ0s0ZGVuaWVkIHN0cnVjdHVyZSByZXF1aXJlcworKiAgIDgoY2xpZW50aWQpICsgNChuYW1lbGVuKSArIDgob2Zmc2V0KSArIDgobGVuZ3RoKSArIDQodHlwZSkgPSAzMiBieXRlcy4KKyovCitzdGF0aWMgdm9pZAorbmZzZDRfZW5jb2RlX2xvY2tfZGVuaWVkKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgc3RydWN0IG5mc2Q0X2xvY2tfZGVuaWVkICpsZCkKK3sKKwlFTkNPREVfSEVBRDsKKworCVJFU0VSVkVfU1BBQ0UoMzIgKyBYRFJfTEVOKGxkLT5sZF9zb3AgPyBsZC0+bGRfc29wLT5zb19vd25lci5sZW4gOiAwKSk7CisJV1JJVEU2NChsZC0+bGRfc3RhcnQpOworCVdSSVRFNjQobGQtPmxkX2xlbmd0aCk7CisJV1JJVEUzMihsZC0+bGRfdHlwZSk7CisJaWYgKGxkLT5sZF9zb3ApIHsKKwkJV1JJVEVNRU0oJmxkLT5sZF9jbGllbnRpZCwgOCk7CisJCVdSSVRFMzIobGQtPmxkX3NvcC0+c29fb3duZXIubGVuKTsKKwkJV1JJVEVNRU0obGQtPmxkX3NvcC0+c29fb3duZXIuZGF0YSwgbGQtPmxkX3NvcC0+c29fb3duZXIubGVuKTsKKwkJa3JlZl9wdXQoJmxkLT5sZF9zb3AtPnNvX3JlZiwgbmZzNF9mcmVlX3N0YXRlb3duZXIpOworCX0gIGVsc2UgeyAgLyogbm9uIC0gbmZzdjQgbG9jayBpbiBjb25mbGljdCwgbm8gY2xpZW50aWQgbm9yIG93bmVyICovCisJCVdSSVRFNjQoKHU2NCkwKTsgLyogY2xpZW50aWQgKi8KKwkJV1JJVEUzMigwKTsgLyogbGVuZ3RoIG9mIG93bmVyIG5hbWUgKi8KKwl9CisJQURKVVNUX0FSR1MoKTsKK30KKworc3RhdGljIHZvaWQKK25mc2Q0X2VuY29kZV9sb2NrKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgaW50IG5mc2Vyciwgc3RydWN0IG5mc2Q0X2xvY2sgKmxvY2spCit7CisKKwlFTkNPREVfU0VRSURfT1BfSEVBRDsKKworCWlmICghbmZzZXJyKSB7CisJCVJFU0VSVkVfU1BBQ0UoNCArIHNpemVvZihzdGF0ZWlkX3QpKTsKKwkJV1JJVEUzMihsb2NrLT5sa19yZXNwX3N0YXRlaWQuc2lfZ2VuZXJhdGlvbik7CisJCVdSSVRFTUVNKCZsb2NrLT5sa19yZXNwX3N0YXRlaWQuc2lfb3BhcXVlLCBzaXplb2Yoc3RhdGVpZF9vcGFxdWVfdCkpOworCQlBREpVU1RfQVJHUygpOworCX0gZWxzZSBpZiAobmZzZXJyID09IG5mc2Vycl9kZW5pZWQpCisJCW5mc2Q0X2VuY29kZV9sb2NrX2RlbmllZChyZXNwLCAmbG9jay0+bGtfZGVuaWVkKTsKKworCUVOQ09ERV9TRVFJRF9PUF9UQUlMKGxvY2stPmxrX3N0YXRlb3duZXIpOworfQorCitzdGF0aWMgdm9pZAorbmZzZDRfZW5jb2RlX2xvY2t0KHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgaW50IG5mc2Vyciwgc3RydWN0IG5mc2Q0X2xvY2t0ICpsb2NrdCkKK3sKKwlpZiAobmZzZXJyID09IG5mc2Vycl9kZW5pZWQpCisJCW5mc2Q0X2VuY29kZV9sb2NrX2RlbmllZChyZXNwLCAmbG9ja3QtPmx0X2RlbmllZCk7Cit9CisKK3N0YXRpYyB2b2lkCituZnNkNF9lbmNvZGVfbG9ja3Uoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBpbnQgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfbG9ja3UgKmxvY2t1KQoreworCUVOQ09ERV9TRVFJRF9PUF9IRUFEOworCisJaWYgKCFuZnNlcnIpIHsKKwkJUkVTRVJWRV9TUEFDRShzaXplb2Yoc3RhdGVpZF90KSk7CisJCVdSSVRFMzIobG9ja3UtPmx1X3N0YXRlaWQuc2lfZ2VuZXJhdGlvbik7CisJCVdSSVRFTUVNKCZsb2NrdS0+bHVfc3RhdGVpZC5zaV9vcGFxdWUsIHNpemVvZihzdGF0ZWlkX29wYXF1ZV90KSk7CisJCUFESlVTVF9BUkdTKCk7CisJfQorCQkJCSAgICAgICAgCisJRU5DT0RFX1NFUUlEX09QX1RBSUwobG9ja3UtPmx1X3N0YXRlb3duZXIpOworfQorCisKK3N0YXRpYyB2b2lkCituZnNkNF9lbmNvZGVfbGluayhzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIGludCBuZnNlcnIsIHN0cnVjdCBuZnNkNF9saW5rICpsaW5rKQoreworCUVOQ09ERV9IRUFEOworCisJaWYgKCFuZnNlcnIpIHsKKwkJUkVTRVJWRV9TUEFDRSgyMCk7CisJCVdSSVRFQ0lORk8obGluay0+bGlfY2luZm8pOworCQlBREpVU1RfQVJHUygpOworCX0KK30KKworCitzdGF0aWMgdm9pZAorbmZzZDRfZW5jb2RlX29wZW4oc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBpbnQgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfb3BlbiAqb3BlbikKK3sKKwlFTkNPREVfU0VRSURfT1BfSEVBRDsKKworCWlmIChuZnNlcnIpCisJCWdvdG8gb3V0OworCisJUkVTRVJWRV9TUEFDRSgzNiArIHNpemVvZihzdGF0ZWlkX3QpKTsKKwlXUklURTMyKG9wZW4tPm9wX3N0YXRlaWQuc2lfZ2VuZXJhdGlvbik7CisJV1JJVEVNRU0oJm9wZW4tPm9wX3N0YXRlaWQuc2lfb3BhcXVlLCBzaXplb2Yoc3RhdGVpZF9vcGFxdWVfdCkpOworCVdSSVRFQ0lORk8ob3Blbi0+b3BfY2luZm8pOworCVdSSVRFMzIob3Blbi0+b3BfcmZsYWdzKTsKKwlXUklURTMyKDIpOworCVdSSVRFMzIob3Blbi0+b3BfYm12YWxbMF0pOworCVdSSVRFMzIob3Blbi0+b3BfYm12YWxbMV0pOworCVdSSVRFMzIob3Blbi0+b3BfZGVsZWdhdGVfdHlwZSk7CisJQURKVVNUX0FSR1MoKTsKKworCXN3aXRjaCAob3Blbi0+b3BfZGVsZWdhdGVfdHlwZSkgeworCWNhc2UgTkZTNF9PUEVOX0RFTEVHQVRFX05PTkU6CisJCWJyZWFrOworCWNhc2UgTkZTNF9PUEVOX0RFTEVHQVRFX1JFQUQ6CisJCVJFU0VSVkVfU1BBQ0UoMjAgKyBzaXplb2Yoc3RhdGVpZF90KSk7CisJCVdSSVRFTUVNKCZvcGVuLT5vcF9kZWxlZ2F0ZV9zdGF0ZWlkLCBzaXplb2Yoc3RhdGVpZF90KSk7CisJCVdSSVRFMzIoMCk7CisKKwkJLyoKKwkJICogVE9ETzogQUNFJ3MgaW4gZGVsZWdhdGlvbnMKKwkJICovCisJCVdSSVRFMzIoTkZTNF9BQ0VfQUNDRVNTX0FMTE9XRURfQUNFX1RZUEUpOworCQlXUklURTMyKDApOworCQlXUklURTMyKDApOworCQlXUklURTMyKDApOyAgIC8qIFhYWDogaXMgTlVMTCBwcmluY2lwYWwgb2s/ICovCisJCUFESlVTVF9BUkdTKCk7CisJCWJyZWFrOworCWNhc2UgTkZTNF9PUEVOX0RFTEVHQVRFX1dSSVRFOgorCQlSRVNFUlZFX1NQQUNFKDMyICsgc2l6ZW9mKHN0YXRlaWRfdCkpOworCQlXUklURU1FTSgmb3Blbi0+b3BfZGVsZWdhdGVfc3RhdGVpZCwgc2l6ZW9mKHN0YXRlaWRfdCkpOworCQlXUklURTMyKDApOworCisJCS8qCisJCSAqIFRPRE86IHNwYWNlX2xpbWl0J3MgaW4gZGVsZWdhdGlvbnMKKwkJICovCisJCVdSSVRFMzIoTkZTNF9MSU1JVF9TSVpFKTsKKwkJV1JJVEUzMih+KHUzMikwKTsKKwkJV1JJVEUzMih+KHUzMikwKTsKKworCQkvKgorCQkgKiBUT0RPOiBBQ0UncyBpbiBkZWxlZ2F0aW9ucworCQkgKi8KKwkJV1JJVEUzMihORlM0X0FDRV9BQ0NFU1NfQUxMT1dFRF9BQ0VfVFlQRSk7CisJCVdSSVRFMzIoMCk7CisJCVdSSVRFMzIoMCk7CisJCVdSSVRFMzIoMCk7ICAgLyogWFhYOiBpcyBOVUxMIHByaW5jaXBhbCBvaz8gKi8KKwkJQURKVVNUX0FSR1MoKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCS8qIFhYWCBzYXZlIGZpbGVoYW5kbGUgaGVyZSAqLworb3V0OgorCUVOQ09ERV9TRVFJRF9PUF9UQUlMKG9wZW4tPm9wX3N0YXRlb3duZXIpOworfQorCitzdGF0aWMgdm9pZAorbmZzZDRfZW5jb2RlX29wZW5fY29uZmlybShzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIGludCBuZnNlcnIsIHN0cnVjdCBuZnNkNF9vcGVuX2NvbmZpcm0gKm9jKQoreworCUVOQ09ERV9TRVFJRF9PUF9IRUFEOworCQkJCSAgICAgICAgCisJaWYgKCFuZnNlcnIpIHsKKwkJUkVTRVJWRV9TUEFDRShzaXplb2Yoc3RhdGVpZF90KSk7CisJCVdSSVRFMzIob2MtPm9jX3Jlc3Bfc3RhdGVpZC5zaV9nZW5lcmF0aW9uKTsKKwkJV1JJVEVNRU0oJm9jLT5vY19yZXNwX3N0YXRlaWQuc2lfb3BhcXVlLCBzaXplb2Yoc3RhdGVpZF9vcGFxdWVfdCkpOworCQlBREpVU1RfQVJHUygpOworCX0KKworCUVOQ09ERV9TRVFJRF9PUF9UQUlMKG9jLT5vY19zdGF0ZW93bmVyKTsKK30KKworc3RhdGljIHZvaWQKK25mc2Q0X2VuY29kZV9vcGVuX2Rvd25ncmFkZShzdHJ1Y3QgbmZzZDRfY29tcG91bmRyZXMgKnJlc3AsIGludCBuZnNlcnIsIHN0cnVjdCBuZnNkNF9vcGVuX2Rvd25ncmFkZSAqb2QpCit7CisJRU5DT0RFX1NFUUlEX09QX0hFQUQ7CisJCQkJICAgICAgICAKKwlpZiAoIW5mc2VycikgeworCQlSRVNFUlZFX1NQQUNFKHNpemVvZihzdGF0ZWlkX3QpKTsKKwkJV1JJVEUzMihvZC0+b2Rfc3RhdGVpZC5zaV9nZW5lcmF0aW9uKTsKKwkJV1JJVEVNRU0oJm9kLT5vZF9zdGF0ZWlkLnNpX29wYXF1ZSwgc2l6ZW9mKHN0YXRlaWRfb3BhcXVlX3QpKTsKKwkJQURKVVNUX0FSR1MoKTsKKwl9CisKKwlFTkNPREVfU0VRSURfT1BfVEFJTChvZC0+b2Rfc3RhdGVvd25lcik7Cit9CisKK3N0YXRpYyBpbnQKK25mc2Q0X2VuY29kZV9yZWFkKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgaW50IG5mc2Vyciwgc3RydWN0IG5mc2Q0X3JlYWQgKnJlYWQpCit7CisJdTMyIGVvZjsKKwlpbnQgdiwgcG47CisJdW5zaWduZWQgbG9uZyBtYXhjb3VudDsgCisJbG9uZyBsZW47CisJRU5DT0RFX0hFQUQ7CisKKwlpZiAobmZzZXJyKQorCQlyZXR1cm4gbmZzZXJyOworCWlmIChyZXNwLT54YnVmLT5wYWdlX2xlbikKKwkJcmV0dXJuIG5mc2Vycl9yZXNvdXJjZTsKKworCVJFU0VSVkVfU1BBQ0UoOCk7IC8qIGVvZiBmbGFnIGFuZCBieXRlIGNvdW50ICovCisKKwltYXhjb3VudCA9IE5GU1NWQ19NQVhCTEtTSVpFOworCWlmIChtYXhjb3VudCA+IHJlYWQtPnJkX2xlbmd0aCkKKwkJbWF4Y291bnQgPSByZWFkLT5yZF9sZW5ndGg7CisKKwlsZW4gPSBtYXhjb3VudDsKKwl2ID0gMDsKKwl3aGlsZSAobGVuID4gMCkgeworCQlwbiA9IHJlc3AtPnJxc3RwLT5ycV9yZXN1c2VkOworCQlzdmNfdGFrZV9wYWdlKHJlc3AtPnJxc3RwKTsKKwkJcmVhZC0+cmRfaW92W3ZdLmlvdl9iYXNlID0gcGFnZV9hZGRyZXNzKHJlc3AtPnJxc3RwLT5ycV9yZXNwYWdlc1twbl0pOworCQlyZWFkLT5yZF9pb3Zbdl0uaW92X2xlbiA9IGxlbiA8IFBBR0VfU0laRSA/IGxlbiA6IFBBR0VfU0laRTsKKwkJdisrOworCQlsZW4gLT0gUEFHRV9TSVpFOworCX0KKwlyZWFkLT5yZF92bGVuID0gdjsKKworCW5mc2VyciA9IG5mc2RfcmVhZChyZWFkLT5yZF9ycXN0cCwgcmVhZC0+cmRfZmhwLCByZWFkLT5yZF9maWxwLAorCQkJcmVhZC0+cmRfb2Zmc2V0LCByZWFkLT5yZF9pb3YsIHJlYWQtPnJkX3ZsZW4sCisJCQkmbWF4Y291bnQpOworCisJaWYgKG5mc2VyciA9PSBuZnNlcnJfc3ltbGluaykKKwkJbmZzZXJyID0gbmZzZXJyX2ludmFsOworCWlmIChuZnNlcnIpCisJCXJldHVybiBuZnNlcnI7CisJZW9mID0gKHJlYWQtPnJkX29mZnNldCArIG1heGNvdW50ID49IHJlYWQtPnJkX2ZocC0+ZmhfZGVudHJ5LT5kX2lub2RlLT5pX3NpemUpOworCisJV1JJVEUzMihlb2YpOworCVdSSVRFMzIobWF4Y291bnQpOworCUFESlVTVF9BUkdTKCk7CisJcmVzcC0+eGJ1Zi0+aGVhZFswXS5pb3ZfbGVuID0gKChjaGFyKilyZXNwLT5wKSAtIChjaGFyKilyZXNwLT54YnVmLT5oZWFkWzBdLmlvdl9iYXNlOworCisJcmVzcC0+eGJ1Zi0+cGFnZV9sZW4gPSBtYXhjb3VudDsKKworCS8qIHJlYWQgemVybyBieXRlcyAtPiBkb24ndCBzZXQgdXAgdGFpbCAqLworCWlmKCFtYXhjb3VudCkKKwkJcmV0dXJuIDA7ICAgICAgICAKKworCS8qIHNldCB1cCBwYWdlIGZvciByZW1haW5pbmcgcmVzcG9uc2VzICovCisJc3ZjX3Rha2VfcGFnZShyZXNwLT5ycXN0cCk7CisJcmVzcC0+eGJ1Zi0+dGFpbFswXS5pb3ZfYmFzZSA9IAorCQlwYWdlX2FkZHJlc3MocmVzcC0+cnFzdHAtPnJxX3Jlc3BhZ2VzW3Jlc3AtPnJxc3RwLT5ycV9yZXN1c2VkLTFdKTsKKwlyZXNwLT5ycXN0cC0+cnFfcmVzdGFpbHBhZ2UgPSByZXNwLT5ycXN0cC0+cnFfcmVzdXNlZC0xOworCXJlc3AtPnhidWYtPnRhaWxbMF0uaW92X2xlbiA9IDA7CisJcmVzcC0+cCA9IHJlc3AtPnhidWYtPnRhaWxbMF0uaW92X2Jhc2U7CisJcmVzcC0+ZW5kID0gcmVzcC0+cCArIFBBR0VfU0laRS80OworCisJaWYgKG1heGNvdW50JjMpIHsKKwkJKihyZXNwLT5wKSsrID0gMDsKKwkJcmVzcC0+eGJ1Zi0+dGFpbFswXS5pb3ZfYmFzZSArPSBtYXhjb3VudCYzOworCQlyZXNwLT54YnVmLT50YWlsWzBdLmlvdl9sZW4gPSA0IC0gKG1heGNvdW50JjMpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbmZzZDRfZW5jb2RlX3JlYWRsaW5rKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgaW50IG5mc2Vyciwgc3RydWN0IG5mc2Q0X3JlYWRsaW5rICpyZWFkbGluaykKK3sKKwlpbnQgbWF4Y291bnQ7CisJY2hhciAqcGFnZTsKKwlFTkNPREVfSEVBRDsKKworCWlmIChuZnNlcnIpCisJCXJldHVybiBuZnNlcnI7CisJaWYgKHJlc3AtPnhidWYtPnBhZ2VfbGVuKQorCQlyZXR1cm4gbmZzZXJyX3Jlc291cmNlOworCisJc3ZjX3Rha2VfcGFnZShyZXNwLT5ycXN0cCk7CisJcGFnZSA9IHBhZ2VfYWRkcmVzcyhyZXNwLT5ycXN0cC0+cnFfcmVzcGFnZXNbcmVzcC0+cnFzdHAtPnJxX3Jlc3VzZWQtMV0pOworCisJbWF4Y291bnQgPSBQQUdFX1NJWkU7CisJUkVTRVJWRV9TUEFDRSg0KTsKKworCS8qCisJICogWFhYOiBCeSBkZWZhdWx0LCB0aGUgLT5yZWFkbGluaygpIFZGUyBvcCB3aWxsIHRydW5jYXRlIHN5bWxpbmtzCisJICogaWYgdGhleSB3b3VsZCBvdmVyZmxvdyB0aGUgYnVmZmVyLiAgSXMgdGhpcyBrb3NoZXIgaW4gTkZTdjQ/ICBJZgorCSAqIG5vdCwgb25lIGVhc3kgZml4IGlzOiBpZiAtPnJlYWRsaW5rKCkgcHJlY2lzZWx5IGZpbGxzIHRoZSBidWZmZXIsCisJICogYXNzdW1lIHRoYXQgdHJ1bmNhdGlvbiBvY2N1cnJlZCwgYW5kIHJldHVybiBORlM0RVJSX1JFU09VUkNFLgorCSAqLworCW5mc2VyciA9IG5mc2RfcmVhZGxpbmsocmVhZGxpbmstPnJsX3Jxc3RwLCByZWFkbGluay0+cmxfZmhwLCBwYWdlLCAmbWF4Y291bnQpOworCWlmIChuZnNlcnIgPT0gbmZzZXJyX2lzZGlyKQorCQlyZXR1cm4gbmZzZXJyX2ludmFsOworCWlmIChuZnNlcnIpCisJCXJldHVybiBuZnNlcnI7CisKKwlXUklURTMyKG1heGNvdW50KTsKKwlBREpVU1RfQVJHUygpOworCXJlc3AtPnhidWYtPmhlYWRbMF0uaW92X2xlbiA9ICgoY2hhciopcmVzcC0+cCkgLSAoY2hhciopcmVzcC0+eGJ1Zi0+aGVhZFswXS5pb3ZfYmFzZTsKKworCXN2Y190YWtlX3BhZ2UocmVzcC0+cnFzdHApOworCXJlc3AtPnhidWYtPnRhaWxbMF0uaW92X2Jhc2UgPSAKKwkJcGFnZV9hZGRyZXNzKHJlc3AtPnJxc3RwLT5ycV9yZXNwYWdlc1tyZXNwLT5ycXN0cC0+cnFfcmVzdXNlZC0xXSk7CisJcmVzcC0+cnFzdHAtPnJxX3Jlc3RhaWxwYWdlID0gcmVzcC0+cnFzdHAtPnJxX3Jlc3VzZWQtMTsKKwlyZXNwLT54YnVmLT50YWlsWzBdLmlvdl9sZW4gPSAwOworCXJlc3AtPnAgPSByZXNwLT54YnVmLT50YWlsWzBdLmlvdl9iYXNlOworCXJlc3AtPmVuZCA9IHJlc3AtPnAgKyBQQUdFX1NJWkUvNDsKKworCXJlc3AtPnhidWYtPnBhZ2VfbGVuID0gbWF4Y291bnQ7CisJaWYgKG1heGNvdW50JjMpIHsKKwkJKihyZXNwLT5wKSsrID0gMDsKKwkJcmVzcC0+eGJ1Zi0+dGFpbFswXS5pb3ZfYmFzZSArPSBtYXhjb3VudCYzOworCQlyZXNwLT54YnVmLT50YWlsWzBdLmlvdl9sZW4gPSA0IC0gKG1heGNvdW50JjMpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorbmZzZDRfZW5jb2RlX3JlYWRkaXIoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBpbnQgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfcmVhZGRpciAqcmVhZGRpcikKK3sKKwlpbnQgbWF4Y291bnQ7CisJbG9mZl90IG9mZnNldDsKKwl1MzIgKnBhZ2UsICpzYXZlcDsKKwlFTkNPREVfSEVBRDsKKworCWlmIChuZnNlcnIpCisJCXJldHVybiBuZnNlcnI7CisJaWYgKHJlc3AtPnhidWYtPnBhZ2VfbGVuKQorCQlyZXR1cm4gbmZzZXJyX3Jlc291cmNlOworCisJUkVTRVJWRV9TUEFDRSg4KTsgIC8qIHZlcmlmaWVyICovCisJc2F2ZXAgPSBwOworCisJLyogWFhYOiBGb2xsb3dpbmcgTkZTdjMsIHdlIGlnbm9yZSB0aGUgUkVBRERJUiB2ZXJpZmllciBmb3Igbm93LiAqLworCVdSSVRFMzIoMCk7CisJV1JJVEUzMigwKTsKKwlBREpVU1RfQVJHUygpOworCXJlc3AtPnhidWYtPmhlYWRbMF0uaW92X2xlbiA9ICgoY2hhciopcmVzcC0+cCkgLSAoY2hhciopcmVzcC0+eGJ1Zi0+aGVhZFswXS5pb3ZfYmFzZTsKKworCW1heGNvdW50ID0gUEFHRV9TSVpFOworCWlmIChtYXhjb3VudCA+IHJlYWRkaXItPnJkX21heGNvdW50KQorCQltYXhjb3VudCA9IHJlYWRkaXItPnJkX21heGNvdW50OworCisJLyoKKwkgKiBDb252ZXJ0IGZyb20gYnl0ZXMgdG8gd29yZHMsIGFjY291bnQgZm9yIHRoZSB0d28gd29yZHMgYWxyZWFkeQorCSAqIHdyaXR0ZW4sIG1ha2Ugc3VyZSB0byBsZWF2ZSB0d28gd29yZHMgYXQgdGhlIGVuZCBmb3IgdGhlIG5leHQKKwkgKiBwb2ludGVyIGFuZCBlb2YgZmllbGQuCisJICovCisJbWF4Y291bnQgPSAobWF4Y291bnQgPj4gMikgLSA0OworCWlmIChtYXhjb3VudCA8IDApIHsKKwkJbmZzZXJyID0gIG5mc2Vycl90b29zbWFsbDsKKwkJZ290byBlcnJfbm9fdmVyZjsKKwl9CisKKwlzdmNfdGFrZV9wYWdlKHJlc3AtPnJxc3RwKTsKKwlwYWdlID0gcGFnZV9hZGRyZXNzKHJlc3AtPnJxc3RwLT5ycV9yZXNwYWdlc1tyZXNwLT5ycXN0cC0+cnFfcmVzdXNlZC0xXSk7CisJcmVhZGRpci0+Y29tbW9uLmVyciA9IDA7CisJcmVhZGRpci0+YnVmbGVuID0gbWF4Y291bnQ7CisJcmVhZGRpci0+YnVmZmVyID0gcGFnZTsKKwlyZWFkZGlyLT5vZmZzZXQgPSBOVUxMOworCisJb2Zmc2V0ID0gcmVhZGRpci0+cmRfY29va2llOworCW5mc2VyciA9IG5mc2RfcmVhZGRpcihyZWFkZGlyLT5yZF9ycXN0cCwgcmVhZGRpci0+cmRfZmhwLAorCQkJICAgICAgJm9mZnNldCwKKwkJCSAgICAgICZyZWFkZGlyLT5jb21tb24sIG5mc2Q0X2VuY29kZV9kaXJlbnQpOworCWlmIChuZnNlcnIgPT0gbmZzX29rICYmCisJICAgIHJlYWRkaXItPmNvbW1vbi5lcnIgPT0gbmZzZXJyX3Rvb3NtYWxsICYmCisJICAgIHJlYWRkaXItPmJ1ZmZlciA9PSBwYWdlKSAKKwkJbmZzZXJyID0gbmZzZXJyX3Rvb3NtYWxsOworCWlmIChuZnNlcnIgPT0gbmZzZXJyX3N5bWxpbmspCisJCW5mc2VyciA9IG5mc2Vycl9ub3RkaXI7CisJaWYgKG5mc2VycikKKwkJZ290byBlcnJfbm9fdmVyZjsKKworCWlmIChyZWFkZGlyLT5vZmZzZXQpCisJCXhkcl9lbmNvZGVfaHlwZXIocmVhZGRpci0+b2Zmc2V0LCBvZmZzZXQpOworCisJcCA9IHJlYWRkaXItPmJ1ZmZlcjsKKwkqcCsrID0gMDsJLyogbm8gbW9yZSBlbnRyaWVzICovCisJKnArKyA9IGh0b25sKHJlYWRkaXItPmNvbW1vbi5lcnIgPT0gbmZzZXJyX2VvZik7CisJcmVzcC0+eGJ1Zi0+cGFnZV9sZW4gPSAoKGNoYXIqKXApIC0gKGNoYXIqKXBhZ2VfYWRkcmVzcyhyZXNwLT5ycXN0cC0+cnFfcmVzcGFnZXNbcmVzcC0+cnFzdHAtPnJxX3Jlc3VzZWQtMV0pOworCisJLyogYWxsb2NhdGUgYSBwYWdlIGZvciB0aGUgdGFpbCAqLworCXN2Y190YWtlX3BhZ2UocmVzcC0+cnFzdHApOworCXJlc3AtPnhidWYtPnRhaWxbMF0uaW92X2Jhc2UgPSAKKwkJcGFnZV9hZGRyZXNzKHJlc3AtPnJxc3RwLT5ycV9yZXNwYWdlc1tyZXNwLT5ycXN0cC0+cnFfcmVzdXNlZC0xXSk7CisJcmVzcC0+cnFzdHAtPnJxX3Jlc3RhaWxwYWdlID0gcmVzcC0+cnFzdHAtPnJxX3Jlc3VzZWQtMTsKKwlyZXNwLT54YnVmLT50YWlsWzBdLmlvdl9sZW4gPSAwOworCXJlc3AtPnAgPSByZXNwLT54YnVmLT50YWlsWzBdLmlvdl9iYXNlOworCXJlc3AtPmVuZCA9IHJlc3AtPnAgKyBQQUdFX1NJWkUvNDsKKworCXJldHVybiAwOworZXJyX25vX3ZlcmY6CisJcCA9IHNhdmVwOworCUFESlVTVF9BUkdTKCk7CisJcmV0dXJuIG5mc2VycjsKK30KKworc3RhdGljIHZvaWQKK25mc2Q0X2VuY29kZV9yZW1vdmUoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBpbnQgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfcmVtb3ZlICpyZW1vdmUpCit7CisJRU5DT0RFX0hFQUQ7CisKKwlpZiAoIW5mc2VycikgeworCQlSRVNFUlZFX1NQQUNFKDIwKTsKKwkJV1JJVEVDSU5GTyhyZW1vdmUtPnJtX2NpbmZvKTsKKwkJQURKVVNUX0FSR1MoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCituZnNkNF9lbmNvZGVfcmVuYW1lKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgaW50IG5mc2Vyciwgc3RydWN0IG5mc2Q0X3JlbmFtZSAqcmVuYW1lKQoreworCUVOQ09ERV9IRUFEOworCisJaWYgKCFuZnNlcnIpIHsKKwkJUkVTRVJWRV9TUEFDRSg0MCk7CisJCVdSSVRFQ0lORk8ocmVuYW1lLT5ybl9zaW5mbyk7CisJCVdSSVRFQ0lORk8ocmVuYW1lLT5ybl90aW5mbyk7CisJCUFESlVTVF9BUkdTKCk7CisJfQorfQorCisvKgorICogVGhlIFNFVEFUVFIgZW5jb2RlIHJvdXRpbmUgaXMgc3BlY2lhbCAtLSBpdCBhbHdheXMgZW5jb2RlcyBhIGJpdG1hcCwKKyAqIHJlZ2FyZGxlc3Mgb2YgdGhlIGVycm9yIHN0YXR1cy4KKyAqLworc3RhdGljIHZvaWQKK25mc2Q0X2VuY29kZV9zZXRhdHRyKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgaW50IG5mc2Vyciwgc3RydWN0IG5mc2Q0X3NldGF0dHIgKnNldGF0dHIpCit7CisJRU5DT0RFX0hFQUQ7CisKKwlSRVNFUlZFX1NQQUNFKDEyKTsKKwlpZiAobmZzZXJyKSB7CisJCVdSSVRFMzIoMik7CisJCVdSSVRFMzIoMCk7CisJCVdSSVRFMzIoMCk7CisJfQorCWVsc2UgeworCQlXUklURTMyKDIpOworCQlXUklURTMyKHNldGF0dHItPnNhX2JtdmFsWzBdKTsKKwkJV1JJVEUzMihzZXRhdHRyLT5zYV9ibXZhbFsxXSk7CisJfQorCUFESlVTVF9BUkdTKCk7Cit9CisKK3N0YXRpYyB2b2lkCituZnNkNF9lbmNvZGVfc2V0Y2xpZW50aWQoc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwLCBpbnQgbmZzZXJyLCBzdHJ1Y3QgbmZzZDRfc2V0Y2xpZW50aWQgKnNjZCkKK3sKKwlFTkNPREVfSEVBRDsKKworCWlmICghbmZzZXJyKSB7CisJCVJFU0VSVkVfU1BBQ0UoOCArIHNpemVvZihuZnM0X3ZlcmlmaWVyKSk7CisJCVdSSVRFTUVNKCZzY2QtPnNlX2NsaWVudGlkLCA4KTsKKwkJV1JJVEVNRU0oJnNjZC0+c2VfY29uZmlybSwgc2l6ZW9mKG5mczRfdmVyaWZpZXIpKTsKKwkJQURKVVNUX0FSR1MoKTsKKwl9CisJZWxzZSBpZiAobmZzZXJyID09IG5mc2Vycl9jbGlkX2ludXNlKSB7CisJCVJFU0VSVkVfU1BBQ0UoOCk7CisJCVdSSVRFMzIoMCk7CisJCVdSSVRFMzIoMCk7CisJCUFESlVTVF9BUkdTKCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorbmZzZDRfZW5jb2RlX3dyaXRlKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgaW50IG5mc2Vyciwgc3RydWN0IG5mc2Q0X3dyaXRlICp3cml0ZSkKK3sKKwlFTkNPREVfSEVBRDsKKworCWlmICghbmZzZXJyKSB7CisJCVJFU0VSVkVfU1BBQ0UoMTYpOworCQlXUklURTMyKHdyaXRlLT53cl9ieXRlc193cml0dGVuKTsKKwkJV1JJVEUzMih3cml0ZS0+d3JfaG93X3dyaXR0ZW4pOworCQlXUklURU1FTSh3cml0ZS0+d3JfdmVyaWZpZXIuZGF0YSwgOCk7CisJCUFESlVTVF9BUkdTKCk7CisJfQorfQorCit2b2lkCituZnNkNF9lbmNvZGVfb3BlcmF0aW9uKHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgc3RydWN0IG5mc2Q0X29wICpvcCkKK3sKKwl1MzIgKnN0YXRwOworCUVOQ09ERV9IRUFEOworCisJUkVTRVJWRV9TUEFDRSg4KTsKKwlXUklURTMyKG9wLT5vcG51bSk7CisJc3RhdHAgPSBwKys7CS8qIHRvIGJlIGJhY2tmaWxsZWQgYXQgdGhlIGVuZCAqLworCUFESlVTVF9BUkdTKCk7CisKKwlzd2l0Y2ggKG9wLT5vcG51bSkgeworCWNhc2UgT1BfQUNDRVNTOgorCQluZnNkNF9lbmNvZGVfYWNjZXNzKHJlc3AsIG9wLT5zdGF0dXMsICZvcC0+dS5hY2Nlc3MpOworCQlicmVhazsKKwljYXNlIE9QX0NMT1NFOgorCQluZnNkNF9lbmNvZGVfY2xvc2UocmVzcCwgb3AtPnN0YXR1cywgJm9wLT51LmNsb3NlKTsKKwkJYnJlYWs7CisJY2FzZSBPUF9DT01NSVQ6CisJCW5mc2Q0X2VuY29kZV9jb21taXQocmVzcCwgb3AtPnN0YXR1cywgJm9wLT51LmNvbW1pdCk7CisJCWJyZWFrOworCWNhc2UgT1BfQ1JFQVRFOgorCQluZnNkNF9lbmNvZGVfY3JlYXRlKHJlc3AsIG9wLT5zdGF0dXMsICZvcC0+dS5jcmVhdGUpOworCQlicmVhazsKKwljYXNlIE9QX0RFTEVHUkVUVVJOOgorCQlicmVhazsKKwljYXNlIE9QX0dFVEFUVFI6CisJCW9wLT5zdGF0dXMgPSBuZnNkNF9lbmNvZGVfZ2V0YXR0cihyZXNwLCBvcC0+c3RhdHVzLCAmb3AtPnUuZ2V0YXR0cik7CisJCWJyZWFrOworCWNhc2UgT1BfR0VURkg6CisJCW5mc2Q0X2VuY29kZV9nZXRmaChyZXNwLCBvcC0+c3RhdHVzLCBvcC0+dS5nZXRmaCk7CisJCWJyZWFrOworCWNhc2UgT1BfTElOSzoKKwkJbmZzZDRfZW5jb2RlX2xpbmsocmVzcCwgb3AtPnN0YXR1cywgJm9wLT51LmxpbmspOworCQlicmVhazsKKwljYXNlIE9QX0xPQ0s6CisJCW5mc2Q0X2VuY29kZV9sb2NrKHJlc3AsIG9wLT5zdGF0dXMsICZvcC0+dS5sb2NrKTsKKwkJYnJlYWs7CisJY2FzZSBPUF9MT0NLVDoKKwkJbmZzZDRfZW5jb2RlX2xvY2t0KHJlc3AsIG9wLT5zdGF0dXMsICZvcC0+dS5sb2NrdCk7CisJCWJyZWFrOworCWNhc2UgT1BfTE9DS1U6CisJCW5mc2Q0X2VuY29kZV9sb2NrdShyZXNwLCBvcC0+c3RhdHVzLCAmb3AtPnUubG9ja3UpOworCQlicmVhazsKKwljYXNlIE9QX0xPT0tVUDoKKwkJYnJlYWs7CisJY2FzZSBPUF9MT09LVVBQOgorCQlicmVhazsKKwljYXNlIE9QX05WRVJJRlk6CisJCWJyZWFrOworCWNhc2UgT1BfT1BFTjoKKwkJbmZzZDRfZW5jb2RlX29wZW4ocmVzcCwgb3AtPnN0YXR1cywgJm9wLT51Lm9wZW4pOworCQlicmVhazsKKwljYXNlIE9QX09QRU5fQ09ORklSTToKKwkJbmZzZDRfZW5jb2RlX29wZW5fY29uZmlybShyZXNwLCBvcC0+c3RhdHVzLCAmb3AtPnUub3Blbl9jb25maXJtKTsKKwkJYnJlYWs7CisJY2FzZSBPUF9PUEVOX0RPV05HUkFERToKKwkJbmZzZDRfZW5jb2RlX29wZW5fZG93bmdyYWRlKHJlc3AsIG9wLT5zdGF0dXMsICZvcC0+dS5vcGVuX2Rvd25ncmFkZSk7CisJCWJyZWFrOworCWNhc2UgT1BfUFVURkg6CisJCWJyZWFrOworCWNhc2UgT1BfUFVUUk9PVEZIOgorCQlicmVhazsKKwljYXNlIE9QX1JFQUQ6CisJCW9wLT5zdGF0dXMgPSBuZnNkNF9lbmNvZGVfcmVhZChyZXNwLCBvcC0+c3RhdHVzLCAmb3AtPnUucmVhZCk7CisJCWJyZWFrOworCWNhc2UgT1BfUkVBRERJUjoKKwkJb3AtPnN0YXR1cyA9IG5mc2Q0X2VuY29kZV9yZWFkZGlyKHJlc3AsIG9wLT5zdGF0dXMsICZvcC0+dS5yZWFkZGlyKTsKKwkJYnJlYWs7CisJY2FzZSBPUF9SRUFETElOSzoKKwkJb3AtPnN0YXR1cyA9IG5mc2Q0X2VuY29kZV9yZWFkbGluayhyZXNwLCBvcC0+c3RhdHVzLCAmb3AtPnUucmVhZGxpbmspOworCQlicmVhazsKKwljYXNlIE9QX1JFTU9WRToKKwkJbmZzZDRfZW5jb2RlX3JlbW92ZShyZXNwLCBvcC0+c3RhdHVzLCAmb3AtPnUucmVtb3ZlKTsKKwkJYnJlYWs7CisJY2FzZSBPUF9SRU5BTUU6CisJCW5mc2Q0X2VuY29kZV9yZW5hbWUocmVzcCwgb3AtPnN0YXR1cywgJm9wLT51LnJlbmFtZSk7CisJCWJyZWFrOworCWNhc2UgT1BfUkVORVc6CisJCWJyZWFrOworCWNhc2UgT1BfUkVTVE9SRUZIOgorCQlicmVhazsKKwljYXNlIE9QX1NBVkVGSDoKKwkJYnJlYWs7CisJY2FzZSBPUF9TRVRBVFRSOgorCQluZnNkNF9lbmNvZGVfc2V0YXR0cihyZXNwLCBvcC0+c3RhdHVzLCAmb3AtPnUuc2V0YXR0cik7CisJCWJyZWFrOworCWNhc2UgT1BfU0VUQ0xJRU5USUQ6CisJCW5mc2Q0X2VuY29kZV9zZXRjbGllbnRpZChyZXNwLCBvcC0+c3RhdHVzLCAmb3AtPnUuc2V0Y2xpZW50aWQpOworCQlicmVhazsKKwljYXNlIE9QX1NFVENMSUVOVElEX0NPTkZJUk06CisJCWJyZWFrOworCWNhc2UgT1BfVkVSSUZZOgorCQlicmVhazsKKwljYXNlIE9QX1dSSVRFOgorCQluZnNkNF9lbmNvZGVfd3JpdGUocmVzcCwgb3AtPnN0YXR1cywgJm9wLT51LndyaXRlKTsKKwkJYnJlYWs7CisJY2FzZSBPUF9SRUxFQVNFX0xPQ0tPV05FUjoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBOb3RlOiBXZSB3cml0ZSB0aGUgc3RhdHVzIGRpcmVjdGx5LCBpbnN0ZWFkIG9mIHVzaW5nIFdSSVRFMzIoKSwKKwkgKiBzaW5jZSBpdCBpcyBhbHJlYWR5IGluIG5ldHdvcmsgYnl0ZSBvcmRlci4KKwkgKi8KKwkqc3RhdHAgPSBvcC0+c3RhdHVzOworfQorCisvKiAKKyAqIEVuY29kZSB0aGUgcmVwbHkgc3RvcmVkIGluIHRoZSBzdGF0ZW93bmVyIHJlcGx5IGNhY2hlIAorICogCisgKiBYRFIgbm90ZTogZG8gbm90IGVuY29kZSBycC0+cnBfYnVmbGVuOiB0aGUgYnVmZmVyIGNvbnRhaW5zIHRoZQorICogcHJldmlvdXNseSBzZW50IGFscmVhZHkgZW5jb2RlZCBvcGVyYXRpb24uCisgKgorICogY2FsbGVkIHdpdGggbmZzNF9sb2NrX3N0YXRlKCkgaGVsZAorICovCit2b2lkCituZnNkNF9lbmNvZGVfcmVwbGF5KHN0cnVjdCBuZnNkNF9jb21wb3VuZHJlcyAqcmVzcCwgc3RydWN0IG5mc2Q0X29wICpvcCkKK3sKKwlFTkNPREVfSEVBRDsKKwlzdHJ1Y3QgbmZzNF9yZXBsYXkgKnJwID0gb3AtPnJlcGxheTsKKworCUJVR19PTighcnApOworCisJUkVTRVJWRV9TUEFDRSg4KTsKKwlXUklURTMyKG9wLT5vcG51bSk7CisJKnArKyA9IHJwLT5ycF9zdGF0dXM7ICAvKiBhbHJlYWR5IHhkcidlZCAqLworCUFESlVTVF9BUkdTKCk7CisKKwlSRVNFUlZFX1NQQUNFKHJwLT5ycF9idWZsZW4pOworCVdSSVRFTUVNKHJwLT5ycF9idWYsIHJwLT5ycF9idWZsZW4pOworCUFESlVTVF9BUkdTKCk7Cit9CisKKy8qCisgKiBFTkQgT0YgIkdFTkVSSUMiIEVOQ09ERSBST1VUSU5FUy4KKyAqLworCitpbnQKK25mczRzdmNfZW5jb2RlX3ZvaWRyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCB2b2lkICpkdW1teSkKK3sKKyAgICAgICAgcmV0dXJuIHhkcl9yZXNzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKwordm9pZCBuZnNkNF9yZWxlYXNlX2NvbXBvdW5kYXJncyhzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdzKQoreworCWlmIChhcmdzLT5vcHMgIT0gYXJncy0+aW9wcykgeworCQlrZnJlZShhcmdzLT5vcHMpOworCQlhcmdzLT5vcHMgPSBhcmdzLT5pb3BzOworCX0KKwlpZiAoYXJncy0+dG1wcCkgeworCQlrZnJlZShhcmdzLT50bXBwKTsKKwkJYXJncy0+dG1wcCA9IE5VTEw7CisJfQorCXdoaWxlIChhcmdzLT50b19mcmVlKSB7CisJCXN0cnVjdCB0bXBidWYgKnRiID0gYXJncy0+dG9fZnJlZTsKKwkJYXJncy0+dG9fZnJlZSA9IHRiLT5uZXh0OworCQl0Yi0+cmVsZWFzZSh0Yi0+YnVmKTsKKwkJa2ZyZWUodGIpOworCX0KK30KKworaW50CituZnM0c3ZjX2RlY29kZV9jb21wb3VuZGFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdzKQoreworCWludCBzdGF0dXM7CisKKwlhcmdzLT5wID0gcDsKKwlhcmdzLT5lbmQgPSBycXN0cC0+cnFfYXJnLmhlYWRbMF0uaW92X2Jhc2UgKyBycXN0cC0+cnFfYXJnLmhlYWRbMF0uaW92X2xlbjsKKwlhcmdzLT5wYWdlbGlzdCA9IHJxc3RwLT5ycV9hcmcucGFnZXM7CisJYXJncy0+cGFnZWxlbiA9IHJxc3RwLT5ycV9hcmcucGFnZV9sZW47CisJYXJncy0+dG1wcCA9IE5VTEw7CisJYXJncy0+dG9fZnJlZSA9IE5VTEw7CisJYXJncy0+b3BzID0gYXJncy0+aW9wczsKKwlhcmdzLT5ycXN0cCA9IHJxc3RwOworCisJc3RhdHVzID0gbmZzZDRfZGVjb2RlX2NvbXBvdW5kKGFyZ3MpOworCWlmIChzdGF0dXMpIHsKKwkJbmZzZDRfcmVsZWFzZV9jb21wb3VuZGFyZ3MoYXJncyk7CisJfQorCXJldHVybiAhc3RhdHVzOworfQorCitpbnQKK25mczRzdmNfZW5jb2RlX2NvbXBvdW5kcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgc3RydWN0IG5mc2Q0X2NvbXBvdW5kcmVzICpyZXNwKQoreworCS8qCisJICogQWxsIHRoYXQgcmVtYWlucyBpcyB0byB3cml0ZSB0aGUgdGFnIGFuZCBvcGVyYXRpb24gY291bnQuLi4KKwkgKi8KKwlzdHJ1Y3Qga3ZlYyAqaW92OworCXAgPSByZXNwLT50YWdwOworCSpwKysgPSBodG9ubChyZXNwLT50YWdsZW4pOworCW1lbWNweShwLCByZXNwLT50YWcsIHJlc3AtPnRhZ2xlbik7CisJcCArPSBYRFJfUVVBRExFTihyZXNwLT50YWdsZW4pOworCSpwKysgPSBodG9ubChyZXNwLT5vcGNudCk7CisKKwlpZiAocnFzdHAtPnJxX3Jlcy5wYWdlX2xlbikgCisJCWlvdiA9ICZycXN0cC0+cnFfcmVzLnRhaWxbMF07CisJZWxzZQorCQlpb3YgPSAmcnFzdHAtPnJxX3Jlcy5oZWFkWzBdOworCWlvdi0+aW92X2xlbiA9ICgoY2hhciopcmVzcC0+cCkgLSAoY2hhciopaW92LT5pb3ZfYmFzZTsKKwlCVUdfT04oaW92LT5pb3ZfbGVuID4gUEFHRV9TSVpFKTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqICBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9mcy9uZnNkL25mc2NhY2hlLmMgYi9mcy9uZnNkL25mc2NhY2hlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE5ZTRkNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25mc2QvbmZzY2FjaGUuYwpAQCAtMCwwICsxLDMyOCBAQAorLyoKKyAqIGxpbnV4L2ZzL25mc2QvbmZzY2FjaGUuYworICoKKyAqIFJlcXVlc3QgcmVwbHkgY2FjaGUuIFRoaXMgaXMgY3VycmVudGx5IGEgZ2xvYmFsIGNhY2hlLCBidXQgdGhpcyBtYXkKKyAqIGNoYW5nZSBpbiB0aGUgZnV0dXJlIGFuZCBiZSBhIHBlci1jbGllbnQgY2FjaGUuCisgKgorICogVGhpcyBjb2RlIGlzIGhlYXZpbHkgaW5zcGlyZWQgYnkgdGhlIDQ0QlNEIGltcGxlbWVudGF0aW9uLCBhbHRob3VnaAorICogaXQgZG9lcyB0aGluZ3MgYSBiaXQgZGlmZmVyZW50bHkuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Yy5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2QvbmZzZC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2QvY2FjaGUuaD4KKworLyogU2l6ZSBvZiByZXBseSBjYWNoZS4gQ29tbW9uIHZhbHVlcyBhcmU6CisgKiA0LjNCU0Q6CTEyOAorICogNC40QlNEOgkyNTYKKyAqIFNvbGFyaXMyOgkxMDI0CisgKiBERUMgVW5peDoJNTEyLTQwOTYKKyAqLworI2RlZmluZSBDQUNIRVNJWkUJCTEwMjQKKyNkZWZpbmUgSEFTSFNJWkUJCTY0CisjZGVmaW5lIFJFUUhBU0goeGlkKQkJKCgoKHhpZCkgPj4gMjQpIF4gKHhpZCkpICYgKEhBU0hTSVpFLTEpKQorCitzdGF0aWMgc3RydWN0IGhsaXN0X2hlYWQgKgloYXNoX2xpc3Q7CitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAJbHJ1X2hlYWQ7CitzdGF0aWMgaW50CQkJY2FjaGVfZGlzYWJsZWQgPSAxOworCitzdGF0aWMgaW50CW5mc2RfY2FjaGVfYXBwZW5kKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBrdmVjICp2ZWMpOworCisvKiAKKyAqIGxvY2tpbmcgZm9yIHRoZSByZXBseSBjYWNoZToKKyAqIEEgY2FjaGUgZW50cnkgaXMgInNpbmdsZSB1c2UiIGlmIGNfc3RhdGUgPT0gUkNfSU5QUk9HCisgKiBPdGhlcndpc2UsIGl0IHdoZW4gYWNjZXNzaW5nIF9wcmV2IG9yIF9uZXh0LCB0aGUgbG9jayBtdXN0IGJlIGhlbGQuCisgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soY2FjaGVfbG9jayk7CisKK3ZvaWQKK25mc2RfY2FjaGVfaW5pdCh2b2lkKQoreworCXN0cnVjdCBzdmNfY2FjaGVyZXAJKnJwOworCWludAkJCWk7CisKKwlJTklUX0xJU1RfSEVBRCgmbHJ1X2hlYWQpOworCWkgPSBDQUNIRVNJWkU7CisJd2hpbGUoaSkgeworCQlycCA9IGttYWxsb2Moc2l6ZW9mKCpycCksIEdGUF9LRVJORUwpOworCQlpZiAoIXJwKSBicmVhazsKKwkJbGlzdF9hZGQoJnJwLT5jX2xydSwgJmxydV9oZWFkKTsKKwkJcnAtPmNfc3RhdGUgPSBSQ19VTlVTRUQ7CisJCXJwLT5jX3R5cGUgPSBSQ19OT0NBQ0hFOworCQlJTklUX0hMSVNUX05PREUoJnJwLT5jX2hhc2gpOworCQlpLS07CisJfQorCisJaWYgKGkpCisJCXByaW50ayAoS0VSTl9FUlIgIm5mc2Q6IGNhbm5vdCBhbGxvY2F0ZSBhbGwgJWQgY2FjaGUgZW50cmllcywgb25seSBnb3QgJWRcbiIsCisJCQlDQUNIRVNJWkUsIENBQ0hFU0laRS1pKTsKKworCWhhc2hfbGlzdCA9IGttYWxsb2MgKEhBU0hTSVpFICogc2l6ZW9mKHN0cnVjdCBobGlzdF9oZWFkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFoYXNoX2xpc3QpIHsKKwkJbmZzZF9jYWNoZV9zaHV0ZG93bigpOworCQlwcmludGsgKEtFUk5fRVJSICJuZnNkOiBjYW5ub3QgYWxsb2NhdGUgJVpkIGJ5dGVzIGZvciBoYXNoIGxpc3RcbiIsCisJCQlIQVNIU0laRSAqIHNpemVvZihzdHJ1Y3QgaGxpc3RfaGVhZCkpOworCQlyZXR1cm47CisJfQorCW1lbXNldChoYXNoX2xpc3QsIDAsIEhBU0hTSVpFICogc2l6ZW9mKHN0cnVjdCBobGlzdF9oZWFkKSk7CisKKwljYWNoZV9kaXNhYmxlZCA9IDA7Cit9CisKK3ZvaWQKK25mc2RfY2FjaGVfc2h1dGRvd24odm9pZCkKK3sKKwlzdHJ1Y3Qgc3ZjX2NhY2hlcmVwCSpycDsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmbHJ1X2hlYWQpKSB7CisJCXJwID0gbGlzdF9lbnRyeShscnVfaGVhZC5uZXh0LCBzdHJ1Y3Qgc3ZjX2NhY2hlcmVwLCBjX2xydSk7CisJCWlmIChycC0+Y19zdGF0ZSA9PSBSQ19ET05FICYmIHJwLT5jX3R5cGUgPT0gUkNfUkVQTEJVRkYpCisJCQlrZnJlZShycC0+Y19yZXBsdmVjLmlvdl9iYXNlKTsKKwkJbGlzdF9kZWwoJnJwLT5jX2xydSk7CisJCWtmcmVlKHJwKTsKKwl9CisKKwljYWNoZV9kaXNhYmxlZCA9IDE7CisKKwlpZiAoaGFzaF9saXN0KQorCQlrZnJlZSAoaGFzaF9saXN0KTsKKwloYXNoX2xpc3QgPSBOVUxMOworfQorCisvKgorICogTW92ZSBjYWNoZSBlbnRyeSB0byBlbmQgb2YgTFJVIGxpc3QKKyAqLworc3RhdGljIHZvaWQKK2xydV9wdXRfZW5kKHN0cnVjdCBzdmNfY2FjaGVyZXAgKnJwKQoreworCWxpc3RfZGVsKCZycC0+Y19scnUpOworCWxpc3RfYWRkX3RhaWwoJnJwLT5jX2xydSwgJmxydV9oZWFkKTsKK30KKworLyoKKyAqIE1vdmUgYSBjYWNoZSBlbnRyeSBmcm9tIG9uZSBoYXNoIGxpc3QgdG8gYW5vdGhlcgorICovCitzdGF0aWMgdm9pZAoraGFzaF9yZWZpbGUoc3RydWN0IHN2Y19jYWNoZXJlcCAqcnApCit7CisJaGxpc3RfZGVsX2luaXQoJnJwLT5jX2hhc2gpOworCWhsaXN0X2FkZF9oZWFkKCZycC0+Y19oYXNoLCBoYXNoX2xpc3QgKyBSRVFIQVNIKHJwLT5jX3hpZCkpOworfQorCisvKgorICogVHJ5IHRvIGZpbmQgYW4gZW50cnkgbWF0Y2hpbmcgdGhlIGN1cnJlbnQgY2FsbCBpbiB0aGUgY2FjaGUuIFdoZW4gbm9uZQorICogaXMgZm91bmQsIHdlIGdyYWIgdGhlIG9sZGVzdCB1bmxvY2tlZCBlbnRyeSBvZmYgdGhlIExSVSBsaXN0LgorICogTm90ZSB0aGF0IG5vIG9wZXJhdGlvbiB3aXRoaW4gdGhlIGxvb3AgbWF5IHNsZWVwLgorICovCitpbnQKK25mc2RfY2FjaGVfbG9va3VwKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIGludCB0eXBlKQoreworCXN0cnVjdCBobGlzdF9ub2RlCSpobjsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAJKnJoOworCXN0cnVjdCBzdmNfY2FjaGVyZXAJKnJwOworCXUzMgkJCXhpZCA9IHJxc3RwLT5ycV94aWQsCisJCQkJcHJvdG8gPSAgcnFzdHAtPnJxX3Byb3QsCisJCQkJdmVycyA9IHJxc3RwLT5ycV92ZXJzLAorCQkJCXByb2MgPSBycXN0cC0+cnFfcHJvYzsKKwl1bnNpZ25lZCBsb25nCQlhZ2U7CisJaW50IHJ0bjsKKworCXJxc3RwLT5ycV9jYWNoZXJlcCA9IE5VTEw7CisJaWYgKGNhY2hlX2Rpc2FibGVkIHx8IHR5cGUgPT0gUkNfTk9DQUNIRSkgeworCQluZnNkc3RhdHMucmNub2NhY2hlKys7CisJCXJldHVybiBSQ19ET0lUOworCX0KKworCXNwaW5fbG9jaygmY2FjaGVfbG9jayk7CisJcnRuID0gUkNfRE9JVDsKKworCXJoID0gJmhhc2hfbGlzdFtSRVFIQVNIKHhpZCldOworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHJwLCBobiwgcmgsIGNfaGFzaCkgeworCQlpZiAocnAtPmNfc3RhdGUgIT0gUkNfVU5VU0VEICYmCisJCSAgICB4aWQgPT0gcnAtPmNfeGlkICYmIHByb2MgPT0gcnAtPmNfcHJvYyAmJgorCQkgICAgcHJvdG8gPT0gcnAtPmNfcHJvdCAmJiB2ZXJzID09IHJwLT5jX3ZlcnMgJiYKKwkJICAgIHRpbWVfYmVmb3JlKGppZmZpZXMsIHJwLT5jX3RpbWVzdGFtcCArIDEyMCpIWikgJiYKKwkJICAgIG1lbWNtcCgoY2hhciopJnJxc3RwLT5ycV9hZGRyLCAoY2hhciopJnJwLT5jX2FkZHIsIHNpemVvZihycC0+Y19hZGRyKSk9PTApIHsKKwkJCW5mc2RzdGF0cy5yY2hpdHMrKzsKKwkJCWdvdG8gZm91bmRfZW50cnk7CisJCX0KKwl9CisJbmZzZHN0YXRzLnJjbWlzc2VzKys7CisKKwkvKiBUaGlzIGxvb3Agc2hvdWxkbid0IHRha2UgbW9yZSB0aGFuIGEgZmV3IGl0ZXJhdGlvbnMgbm9ybWFsbHkgKi8KKwl7CisJaW50CXNhZmUgPSAwOworCWxpc3RfZm9yX2VhY2hfZW50cnkocnAsICZscnVfaGVhZCwgY19scnUpIHsKKwkJaWYgKHJwLT5jX3N0YXRlICE9IFJDX0lOUFJPRykKKwkJCWJyZWFrOworCQlpZiAoc2FmZSsrID4gQ0FDSEVTSVpFKSB7CisJCQlwcmludGsoIm5mc2Q6IGxvb3AgaW4gcmVwY2FjaGUgTFJVIGxpc3RcbiIpOworCQkJY2FjaGVfZGlzYWJsZWQgPSAxOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJfQorCisJLyogVGhpcyBzaG91bGQgbm90IGhhcHBlbiAqLworCWlmIChycCA9PSBOVUxMKSB7CisJCXN0YXRpYyBpbnQJY29tcGxhaW50czsKKworCQlwcmludGsoS0VSTl9XQVJOSU5HICJuZnNkOiBhbGwgcmVwY2FjaGUgZW50cmllcyBsb2NrZWQhXG4iKTsKKwkJaWYgKCsrY29tcGxhaW50cyA+IDUpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm5mc2Q6IGRpc2FibGluZyByZXBjYWNoZS5cbiIpOworCQkJY2FjaGVfZGlzYWJsZWQgPSAxOworCQl9CisJCWdvdG8gb3V0OworCX0KKworCXJxc3RwLT5ycV9jYWNoZXJlcCA9IHJwOworCXJwLT5jX3N0YXRlID0gUkNfSU5QUk9HOworCXJwLT5jX3hpZCA9IHhpZDsKKwlycC0+Y19wcm9jID0gcHJvYzsKKwlycC0+Y19hZGRyID0gcnFzdHAtPnJxX2FkZHI7CisJcnAtPmNfcHJvdCA9IHByb3RvOworCXJwLT5jX3ZlcnMgPSB2ZXJzOworCXJwLT5jX3RpbWVzdGFtcCA9IGppZmZpZXM7CisKKwloYXNoX3JlZmlsZShycCk7CisKKwkvKiByZWxlYXNlIGFueSBidWZmZXIgKi8KKwlpZiAocnAtPmNfdHlwZSA9PSBSQ19SRVBMQlVGRikgeworCQlrZnJlZShycC0+Y19yZXBsdmVjLmlvdl9iYXNlKTsKKwkJcnAtPmNfcmVwbHZlYy5pb3ZfYmFzZSA9IE5VTEw7CisJfQorCXJwLT5jX3R5cGUgPSBSQ19OT0NBQ0hFOworIG91dDoKKwlzcGluX3VubG9jaygmY2FjaGVfbG9jayk7CisJcmV0dXJuIHJ0bjsKKworZm91bmRfZW50cnk6CisJLyogV2UgZm91bmQgYSBtYXRjaGluZyBlbnRyeSB3aGljaCBpcyBlaXRoZXIgaW4gcHJvZ3Jlc3Mgb3IgZG9uZS4gKi8KKwlhZ2UgPSBqaWZmaWVzIC0gcnAtPmNfdGltZXN0YW1wOworCXJwLT5jX3RpbWVzdGFtcCA9IGppZmZpZXM7CisJbHJ1X3B1dF9lbmQocnApOworCisJcnRuID0gUkNfRFJPUElUOworCS8qIFJlcXVlc3QgYmVpbmcgcHJvY2Vzc2VkIG9yIGV4Y2Vzc2l2ZSByZXhtaXRzICovCisJaWYgKHJwLT5jX3N0YXRlID09IFJDX0lOUFJPRyB8fCBhZ2UgPCBSQ19ERUxBWSkKKwkJZ290byBvdXQ7CisKKwkvKiBGcm9tIHRoZSBoYWxsIG9mIGZhbWUgb2YgaW1wcmFjdGljYWwgYXR0YWNrczoKKwkgKiBJcyB0aGlzIGEgdXNlciB3aG8gdHJpZXMgdG8gc25vb3Agb24gdGhlIGNhY2hlPyAqLworCXJ0biA9IFJDX0RPSVQ7CisJaWYgKCFycXN0cC0+cnFfc2VjdXJlICYmIHJwLT5jX3NlY3VyZSkKKwkJZ290byBvdXQ7CisKKwkvKiBDb21wb3NlIFJQQyByZXBseSBoZWFkZXIgKi8KKwlzd2l0Y2ggKHJwLT5jX3R5cGUpIHsKKwljYXNlIFJDX05PQ0FDSEU6CisJCWJyZWFrOworCWNhc2UgUkNfUkVQTFNUQVQ6CisJCXN2Y19wdXR1MzIoJnJxc3RwLT5ycV9yZXMuaGVhZFswXSwgcnAtPmNfcmVwbHN0YXQpOworCQlydG4gPSBSQ19SRVBMWTsKKwkJYnJlYWs7CisJY2FzZSBSQ19SRVBMQlVGRjoKKwkJaWYgKCFuZnNkX2NhY2hlX2FwcGVuZChycXN0cCwgJnJwLT5jX3JlcGx2ZWMpKQorCQkJZ290byBvdXQ7CS8qIHNob3VsZCBub3QgaGFwcGVuICovCisJCXJ0biA9IFJDX1JFUExZOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9XQVJOSU5HICJuZnNkOiBiYWQgcmVwY2FjaGUgdHlwZSAlZFxuIiwgcnAtPmNfdHlwZSk7CisJCXJwLT5jX3N0YXRlID0gUkNfVU5VU0VEOworCX0KKworCWdvdG8gb3V0OworfQorCisvKgorICogVXBkYXRlIGEgY2FjaGUgZW50cnkuIFRoaXMgaXMgY2FsbGVkIGZyb20gbmZzZF9kaXNwYXRjaCB3aGVuCisgKiB0aGUgcHJvY2VkdXJlIGhhcyBiZWVuIGV4ZWN1dGVkIGFuZCB0aGUgY29tcGxldGUgcmVwbHkgaXMgaW4KKyAqIHJxc3RwLT5ycV9yZXMuCisgKgorICogV2UncmUgY29weWluZyBhcm91bmQgZGF0YSBoZXJlIHJhdGhlciB0aGFuIHN3YXBwaW5nIGJ1ZmZlcnMgYmVjYXVzZQorICogdGhlIHRvcGxldmVsIGxvb3AgcmVxdWlyZXMgbWF4LXNpemVkIGJ1ZmZlcnMsIHdoaWNoIHdvdWxkIGJlIGEgd2FzdGUKKyAqIG9mIG1lbW9yeSBmb3IgYSBjYWNoZSB3aXRoIGEgbWF4IHJlcGx5IHNpemUgb2YgMTAwIGJ5dGVzIChkaXJvcG9rcmVzKS4KKyAqCisgKiBJZiB3ZSBzaG91bGQgc3RhcnQgdG8gdXNlIGRpZmZlcmVudCB0eXBlcyBvZiBjYWNoZSBlbnRyaWVzIHRhaWxvcmVkCisgKiBzcGVjaWZpY2FsbHkgZm9yIGF0dHJzdGF0IGFuZCBmaCdzLCB3ZSBtYXkgc2F2ZSBldmVuIG1vcmUgc3BhY2UuCisgKgorICogQWxzbyBub3RlIHRoYXQgYSBjYWNoZXR5cGUgb2YgUkNfTk9DQUNIRSBjYW4gbGVnYWxseSBiZSBwYXNzZWQgd2hlbgorICogbmZzZCBmYWlsZWQgdG8gZW5jb2RlIGEgcmVwbHkgdGhhdCBvdGhlcndpc2Ugd291bGQgaGF2ZSBiZWVuIGNhY2hlZC4KKyAqIEluIHRoaXMgY2FzZSwgbmZzZF9jYWNoZV91cGRhdGUgaXMgY2FsbGVkIHdpdGggc3RhdHAgPT0gTlVMTC4KKyAqLwordm9pZAorbmZzZF9jYWNoZV91cGRhdGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgaW50IGNhY2hldHlwZSwgdTMyICpzdGF0cCkKK3sKKwlzdHJ1Y3Qgc3ZjX2NhY2hlcmVwICpycDsKKwlzdHJ1Y3Qga3ZlYwkqcmVzdiA9ICZycXN0cC0+cnFfcmVzLmhlYWRbMF0sICpjYWNodjsKKwlpbnQJCWxlbjsKKworCWlmICghKHJwID0gcnFzdHAtPnJxX2NhY2hlcmVwKSB8fCBjYWNoZV9kaXNhYmxlZCkKKwkJcmV0dXJuOworCisJbGVuID0gcmVzdi0+aW92X2xlbiAtICgoY2hhciopc3RhdHAgLSAoY2hhciopcmVzdi0+aW92X2Jhc2UpOworCWxlbiA+Pj0gMjsKKwkKKwkvKiBEb24ndCBjYWNoZSBleGNlc3NpdmUgYW1vdW50cyBvZiBkYXRhIGFuZCBYRFIgZmFpbHVyZXMgKi8KKwlpZiAoIXN0YXRwIHx8IGxlbiA+ICgyNTYgPj4gMikpIHsKKwkJcnAtPmNfc3RhdGUgPSBSQ19VTlVTRUQ7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKGNhY2hldHlwZSkgeworCWNhc2UgUkNfUkVQTFNUQVQ6CisJCWlmIChsZW4gIT0gMSkKKwkJCXByaW50aygibmZzZDogUkNfUkVQTFNUQVQvcmVwbHkgbGVuICVkIVxuIixsZW4pOworCQlycC0+Y19yZXBsc3RhdCA9ICpzdGF0cDsKKwkJYnJlYWs7CisJY2FzZSBSQ19SRVBMQlVGRjoKKwkJY2FjaHYgPSAmcnAtPmNfcmVwbHZlYzsKKwkJY2FjaHYtPmlvdl9iYXNlID0ga21hbGxvYyhsZW4gPDwgMiwgR0ZQX0tFUk5FTCk7CisJCWlmICghY2FjaHYtPmlvdl9iYXNlKSB7CisJCQlzcGluX2xvY2soJmNhY2hlX2xvY2spOworCQkJcnAtPmNfc3RhdGUgPSBSQ19VTlVTRUQ7CisJCQlzcGluX3VubG9jaygmY2FjaGVfbG9jayk7CisJCQlyZXR1cm47CisJCX0KKwkJY2FjaHYtPmlvdl9sZW4gPSBsZW4gPDwgMjsKKwkJbWVtY3B5KGNhY2h2LT5pb3ZfYmFzZSwgc3RhdHAsIGxlbiA8PCAyKTsKKwkJYnJlYWs7CisJfQorCXNwaW5fbG9jaygmY2FjaGVfbG9jayk7CisJbHJ1X3B1dF9lbmQocnApOworCXJwLT5jX3NlY3VyZSA9IHJxc3RwLT5ycV9zZWN1cmU7CisJcnAtPmNfdHlwZSA9IGNhY2hldHlwZTsKKwlycC0+Y19zdGF0ZSA9IFJDX0RPTkU7CisJcnAtPmNfdGltZXN0YW1wID0gamlmZmllczsKKwlzcGluX3VubG9jaygmY2FjaGVfbG9jayk7CisJcmV0dXJuOworfQorCisvKgorICogQ29weSBjYWNoZWQgcmVwbHkgdG8gY3VycmVudCByZXBseSBidWZmZXIuIFNob3VsZCBhbHdheXMgZml0LgorICogRklYTUUgYXMgcmVwbHkgaXMgaW4gYSBwYWdlLCB3ZSBzaG91bGQganVzdCBhdHRhY2ggdGhlIHBhZ2UsIGFuZAorICoga2VlcCBhIHJlZmNvdW50Li4uLgorICovCitzdGF0aWMgaW50CituZnNkX2NhY2hlX2FwcGVuZChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qga3ZlYyAqZGF0YSkKK3sKKwlzdHJ1Y3Qga3ZlYwkqdmVjID0gJnJxc3RwLT5ycV9yZXMuaGVhZFswXTsKKworCWlmICh2ZWMtPmlvdl9sZW4gKyBkYXRhLT5pb3ZfbGVuID4gUEFHRV9TSVpFKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm5mc2Q6IGNhY2hlZCByZXBseSB0b28gbGFyZ2UgKCVaZCkuXG4iLAorCQkJCWRhdGEtPmlvdl9sZW4pOworCQlyZXR1cm4gMDsKKwl9CisJbWVtY3B5KChjaGFyKil2ZWMtPmlvdl9iYXNlICsgdmVjLT5pb3ZfbGVuLCBkYXRhLT5pb3ZfYmFzZSwgZGF0YS0+aW92X2xlbik7CisJdmVjLT5pb3ZfbGVuICs9IGRhdGEtPmlvdl9sZW47CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mc2N0bC5jIGIvZnMvbmZzZC9uZnNjdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjFhZmRjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzZC9uZnNjdGwuYwpAQCAtMCwwICsxLDQzOCBAQAorLyoKKyAqIGxpbnV4L2ZzL25mc2QvbmZzY3RsLmMKKyAqCisgKiBTeXNjYWxsIGludGVyZmFjZSB0byBrbmZzZC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkX2lkbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Yy5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2QvbmZzZC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2QvY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL3hkci5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2Qvc3lzY2FsbC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2QvaW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisvKgorICoJV2UgaGF2ZSBhIHNpbmdsZSBkaXJlY3Rvcnkgd2l0aCA5IG5vZGVzIGluIGl0LgorICovCitlbnVtIHsKKwlORlNEX1Jvb3QgPSAxLAorCU5GU0RfU3ZjLAorCU5GU0RfQWRkLAorCU5GU0RfRGVsLAorCU5GU0RfRXhwb3J0LAorCU5GU0RfVW5leHBvcnQsCisJTkZTRF9HZXRmZCwKKwlORlNEX0dldGZzLAorCU5GU0RfTGlzdCwKKwlORlNEX0ZoLAorCU5GU0RfVGhyZWFkcywKKwlORlNEX0xlYXNldGltZSwKK307CisKKy8qCisgKiB3cml0ZSgpIGZvciB0aGVzZSBub2Rlcy4KKyAqLworc3RhdGljIHNzaXplX3Qgd3JpdGVfc3ZjKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKTsKK3N0YXRpYyBzc2l6ZV90IHdyaXRlX2FkZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSk7CitzdGF0aWMgc3NpemVfdCB3cml0ZV9kZWwoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpOworc3RhdGljIHNzaXplX3Qgd3JpdGVfZXhwb3J0KHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKTsKK3N0YXRpYyBzc2l6ZV90IHdyaXRlX3VuZXhwb3J0KHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKTsKK3N0YXRpYyBzc2l6ZV90IHdyaXRlX2dldGZkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKTsKK3N0YXRpYyBzc2l6ZV90IHdyaXRlX2dldGZzKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKTsKK3N0YXRpYyBzc2l6ZV90IHdyaXRlX2ZpbGVoYW5kbGUoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpOworc3RhdGljIHNzaXplX3Qgd3JpdGVfdGhyZWFkcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSk7CitzdGF0aWMgc3NpemVfdCB3cml0ZV9sZWFzZXRpbWUoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpOworCitzdGF0aWMgc3NpemVfdCAoKndyaXRlX29wW10pKHN0cnVjdCBmaWxlICosIGNoYXIgKiwgc2l6ZV90KSA9IHsKKwlbTkZTRF9TdmNdID0gd3JpdGVfc3ZjLAorCVtORlNEX0FkZF0gPSB3cml0ZV9hZGQsCisJW05GU0RfRGVsXSA9IHdyaXRlX2RlbCwKKwlbTkZTRF9FeHBvcnRdID0gd3JpdGVfZXhwb3J0LAorCVtORlNEX1VuZXhwb3J0XSA9IHdyaXRlX3VuZXhwb3J0LAorCVtORlNEX0dldGZkXSA9IHdyaXRlX2dldGZkLAorCVtORlNEX0dldGZzXSA9IHdyaXRlX2dldGZzLAorCVtORlNEX0ZoXSA9IHdyaXRlX2ZpbGVoYW5kbGUsCisJW05GU0RfVGhyZWFkc10gPSB3cml0ZV90aHJlYWRzLAorCVtORlNEX0xlYXNldGltZV0gPSB3cml0ZV9sZWFzZXRpbWUsCit9OworCitzdGF0aWMgc3NpemVfdCBuZnNjdGxfdHJhbnNhY3Rpb25fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBzaXplLCBsb2ZmX3QgKnBvcykKK3sKKwlpbm9fdCBpbm8gPSAgZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfaW5vOworCWNoYXIgKmRhdGE7CisJc3NpemVfdCBydjsKKworCWlmIChpbm8gPj0gc2l6ZW9mKHdyaXRlX29wKS9zaXplb2Yod3JpdGVfb3BbMF0pIHx8ICF3cml0ZV9vcFtpbm9dKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRhdGEgPSBzaW1wbGVfdHJhbnNhY3Rpb25fZ2V0KGZpbGUsIGJ1Ziwgc2l6ZSk7CisJaWYgKElTX0VSUihkYXRhKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGF0YSk7CisKKwlydiA9ICB3cml0ZV9vcFtpbm9dKGZpbGUsIGRhdGEsIHNpemUpOworCWlmIChydj4wKSB7CisJCXNpbXBsZV90cmFuc2FjdGlvbl9zZXQoZmlsZSwgcnYpOworCQlydiA9IHNpemU7CisJfQorCXJldHVybiBydjsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdHJhbnNhY3Rpb25fb3BzID0geworCS53cml0ZQkJPSBuZnNjdGxfdHJhbnNhY3Rpb25fd3JpdGUsCisJLnJlYWQJCT0gc2ltcGxlX3RyYW5zYWN0aW9uX3JlYWQsCisJLnJlbGVhc2UJPSBzaW1wbGVfdHJhbnNhY3Rpb25fcmVsZWFzZSwKK307CisKK2V4dGVybiBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgbmZzX2V4cG9ydHNfb3A7CitzdGF0aWMgaW50IGV4cG9ydHNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJm5mc19leHBvcnRzX29wKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXhwb3J0c19vcGVyYXRpb25zID0geworCS5vcGVuCQk9IGV4cG9ydHNfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAorfTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBwYXlsb2FkIC0gd3JpdGUgbWV0aG9kcworICogSWYgdGhlIG1ldGhvZCBoYXMgYSByZXNwb25zZSwgdGhlIHJlc3BvbnNlIHNob3VsZCBiZSBwdXQgaW4gYnVmLAorICogYW5kIHRoZSBsZW5ndGggcmV0dXJuZWQuICBPdGhlcndpc2UgcmV0dXJuIDAgb3IgYW5kIC1lcnJvci4KKyAqLworCitzdGF0aWMgc3NpemVfdCB3cml0ZV9zdmMoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IG5mc2N0bF9zdmMgKmRhdGE7CisJaWYgKHNpemUgPCBzaXplb2YoKmRhdGEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlkYXRhID0gKHN0cnVjdCBuZnNjdGxfc3ZjKikgYnVmOworCXJldHVybiBuZnNkX3N2YyhkYXRhLT5zdmNfcG9ydCwgZGF0YS0+c3ZjX250aHJlYWRzKTsKK30KKworc3RhdGljIHNzaXplX3Qgd3JpdGVfYWRkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBuZnNjdGxfY2xpZW50ICpkYXRhOworCWlmIChzaXplIDwgc2l6ZW9mKCpkYXRhKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGF0YSA9IChzdHJ1Y3QgbmZzY3RsX2NsaWVudCAqKWJ1ZjsKKwlyZXR1cm4gZXhwX2FkZGNsaWVudChkYXRhKTsKK30KKworc3RhdGljIHNzaXplX3Qgd3JpdGVfZGVsKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBuZnNjdGxfY2xpZW50ICpkYXRhOworCWlmIChzaXplIDwgc2l6ZW9mKCpkYXRhKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGF0YSA9IChzdHJ1Y3QgbmZzY3RsX2NsaWVudCAqKWJ1ZjsKKwlyZXR1cm4gZXhwX2RlbGNsaWVudChkYXRhKTsKK30KKworc3RhdGljIHNzaXplX3Qgd3JpdGVfZXhwb3J0KHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBuZnNjdGxfZXhwb3J0ICpkYXRhOworCWlmIChzaXplIDwgc2l6ZW9mKCpkYXRhKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGF0YSA9IChzdHJ1Y3QgbmZzY3RsX2V4cG9ydCopYnVmOworCXJldHVybiBleHBfZXhwb3J0KGRhdGEpOworfQorCitzdGF0aWMgc3NpemVfdCB3cml0ZV91bmV4cG9ydChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgbmZzY3RsX2V4cG9ydCAqZGF0YTsKKworCWlmIChzaXplIDwgc2l6ZW9mKCpkYXRhKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGF0YSA9IChzdHJ1Y3QgbmZzY3RsX2V4cG9ydCopYnVmOworCXJldHVybiBleHBfdW5leHBvcnQoZGF0YSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHdyaXRlX2dldGZzKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBuZnNjdGxfZnNwYXJtICpkYXRhOworCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luOworCXN0cnVjdCBhdXRoX2RvbWFpbiAqY2xwOworCWludCBlcnIgPSAwOworCXN0cnVjdCBrbmZzZF9maCAqcmVzOworCisJaWYgKHNpemUgPCBzaXplb2YoKmRhdGEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlkYXRhID0gKHN0cnVjdCBuZnNjdGxfZnNwYXJtKilidWY7CisJZXJyID0gLUVQUk9UT05PU1VQUE9SVDsKKwlpZiAoZGF0YS0+Z2RfYWRkci5zYV9mYW1pbHkgIT0gQUZfSU5FVCkKKwkJZ290byBvdXQ7CisJc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZkYXRhLT5nZF9hZGRyOworCWlmIChkYXRhLT5nZF9tYXhsZW4gPiBORlMzX0ZIU0laRSkKKwkJZGF0YS0+Z2RfbWF4bGVuID0gTkZTM19GSFNJWkU7CisKKwlyZXMgPSAoc3RydWN0IGtuZnNkX2ZoKilidWY7CisKKwlleHBfcmVhZGxvY2soKTsKKwlpZiAoIShjbHAgPSBhdXRoX3VuaXhfbG9va3VwKHNpbi0+c2luX2FkZHIpKSkKKwkJZXJyID0gLUVQRVJNOworCWVsc2UgeworCQllcnIgPSBleHBfcm9vdGZoKGNscCwgZGF0YS0+Z2RfcGF0aCwgcmVzLCBkYXRhLT5nZF9tYXhsZW4pOworCQlhdXRoX2RvbWFpbl9wdXQoY2xwKTsKKwl9CisJZXhwX3JlYWR1bmxvY2soKTsKKwlpZiAoZXJyID09IDApCisJCWVyciA9IHJlcy0+Zmhfc2l6ZSArIChpbnQpJigoc3RydWN0IGtuZnNkX2ZoKikwKS0+ZmhfYmFzZTsKKyBvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHNzaXplX3Qgd3JpdGVfZ2V0ZmQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IG5mc2N0bF9mZHBhcm0gKmRhdGE7CisJc3RydWN0IHNvY2thZGRyX2luICpzaW47CisJc3RydWN0IGF1dGhfZG9tYWluICpjbHA7CisJaW50IGVyciA9IDA7CisJc3RydWN0IGtuZnNkX2ZoIGZoOworCWNoYXIgKnJlczsKKworCWlmIChzaXplIDwgc2l6ZW9mKCpkYXRhKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGF0YSA9IChzdHJ1Y3QgbmZzY3RsX2ZkcGFybSopYnVmOworCWVyciA9IC1FUFJPVE9OT1NVUFBPUlQ7CisJaWYgKGRhdGEtPmdkX2FkZHIuc2FfZmFtaWx5ICE9IEFGX0lORVQpCisJCWdvdG8gb3V0OworCWVyciA9IC1FSU5WQUw7CisJaWYgKGRhdGEtPmdkX3ZlcnNpb24gPCAyIHx8IGRhdGEtPmdkX3ZlcnNpb24gPiBORlNTVkNfTUFYVkVSUykKKwkJZ290byBvdXQ7CisKKwlyZXMgPSBidWY7CisJc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZkYXRhLT5nZF9hZGRyOworCWV4cF9yZWFkbG9jaygpOworCWlmICghKGNscCA9IGF1dGhfdW5peF9sb29rdXAoc2luLT5zaW5fYWRkcikpKQorCQllcnIgPSAtRVBFUk07CisJZWxzZSB7CisJCWVyciA9IGV4cF9yb290ZmgoY2xwLCBkYXRhLT5nZF9wYXRoLCAmZmgsIE5GU19GSFNJWkUpOworCQlhdXRoX2RvbWFpbl9wdXQoY2xwKTsKKwl9CisJZXhwX3JlYWR1bmxvY2soKTsKKworCWlmIChlcnIgPT0gMCkgeworCQltZW1zZXQocmVzLDAsIE5GU19GSFNJWkUpOworCQltZW1jcHkocmVzLCAmZmguZmhfYmFzZSwgZmguZmhfc2l6ZSk7CisJCWVyciA9IE5GU19GSFNJWkU7CisJfQorIG91dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3NpemVfdCB3cml0ZV9maWxlaGFuZGxlKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCS8qIHJlcXVlc3QgaXM6CisJICogICBkb21haW4gcGF0aCBtYXhzaXplCisJICogcmVzcG9uc2UgaXMKKwkgKiAgIGZpbGVoYW5kbGUKKwkgKgorCSAqIHF3b3JkIHF1b3RpbmcgaXMgdXNlZCwgc28gZmlsZWhhbmRsZSB3aWxsIGJlIFx4Li4uLgorCSAqLworCWNoYXIgKmRuYW1lLCAqcGF0aDsKKwlpbnQgbWF4c2l6ZTsKKwljaGFyICptZXNnID0gYnVmOworCWludCBsZW47CisJc3RydWN0IGF1dGhfZG9tYWluICpkb207CisJc3RydWN0IGtuZnNkX2ZoIGZoOworCisJaWYgKGJ1ZltzaXplLTFdICE9ICdcbicpCisJCXJldHVybiAtRUlOVkFMOworCWJ1ZltzaXplLTFdID0gMDsKKworCWRuYW1lID0gbWVzZzsKKwlsZW4gPSBxd29yZF9nZXQoJm1lc2csIGRuYW1lLCBzaXplKTsKKwlpZiAobGVuIDw9IDApIHJldHVybiAtRUlOVkFMOworCQorCXBhdGggPSBkbmFtZStsZW4rMTsKKwlsZW4gPSBxd29yZF9nZXQoJm1lc2csIHBhdGgsIHNpemUpOworCWlmIChsZW4gPD0gMCkgcmV0dXJuIC1FSU5WQUw7CisKKwlsZW4gPSBnZXRfaW50KCZtZXNnLCAmbWF4c2l6ZSk7CisJaWYgKGxlbikKKwkJcmV0dXJuIGxlbjsKKworCWlmIChtYXhzaXplIDwgTkZTX0ZIU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKG1heHNpemUgPiBORlMzX0ZIU0laRSkKKwkJbWF4c2l6ZSA9IE5GUzNfRkhTSVpFOworCisJaWYgKHF3b3JkX2dldCgmbWVzZywgbWVzZywgc2l6ZSk+MCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiB3ZSBoYXZlIGFsbCB0aGUgd29yZHMsIHRoZXkgYXJlIGluIGJ1Zi4uICovCisJZG9tID0gdW5peF9kb21haW5fZmluZChkbmFtZSk7CisJaWYgKCFkb20pCisJCXJldHVybiAtRU5PTUVNOworCisJbGVuID0gZXhwX3Jvb3RmaChkb20sIHBhdGgsICZmaCwgIG1heHNpemUpOworCWF1dGhfZG9tYWluX3B1dChkb20pOworCWlmIChsZW4pCisJCXJldHVybiBsZW47CisJCisJbWVzZyA9IGJ1ZjsgbGVuID0gU0lNUExFX1RSQU5TQUNUSU9OX0xJTUlUOworCXF3b3JkX2FkZGhleCgmbWVzZywgJmxlbiwgKGNoYXIqKSZmaC5maF9iYXNlLCBmaC5maF9zaXplKTsKKwltZXNnWy0xXSA9ICdcbic7CisJcmV0dXJuIG1lc2cgLSBidWY7CQorfQorCitleHRlcm4gaW50IG5mc2RfbnJ0aHJlYWRzKHZvaWQpOworCitzdGF0aWMgc3NpemVfdCB3cml0ZV90aHJlYWRzKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCS8qIGlmIHNpemUgPiAwLCBsb29rIGZvciBhIG51bWJlciBvZiB0aHJlYWRzIGFuZCBjYWxsIG5mc2Rfc3ZjCisJICogdGhlbiB3cml0ZSBvdXQgbnVtYmVyIG9mIHRocmVhZHMgYXMgcmVwbHkKKwkgKi8KKwljaGFyICptZXNnID0gYnVmOworCWludCBydjsKKwlpZiAoc2l6ZSA+IDApIHsKKwkJaW50IG5ld3RocmVhZHM7CisJCXJ2ID0gZ2V0X2ludCgmbWVzZywgJm5ld3RocmVhZHMpOworCQlpZiAocnYpCisJCQlyZXR1cm4gcnY7CisJCWlmIChuZXd0aHJlYWRzIDwwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJ2ID0gbmZzZF9zdmMoMjA0OSwgbmV3dGhyZWFkcyk7CisJCWlmIChydikKKwkJCXJldHVybiBydjsKKwl9CisJc3ByaW50ZihidWYsICIlZFxuIiwgbmZzZF9ucnRocmVhZHMoKSk7CisJcmV0dXJuIHN0cmxlbihidWYpOworfQorCitleHRlcm4gdGltZV90IG5mczRfbGVhc2V0aW1lKHZvaWQpOworCitzdGF0aWMgc3NpemVfdCB3cml0ZV9sZWFzZXRpbWUoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJLyogaWYgc2l6ZSA+IDEwIHNlY29uZHMsIGNhbGwKKwkgKiBuZnM0X3Jlc2V0X2xlYXNlKCkgdGhlbiB3cml0ZSBvdXQgdGhlIG5ldyBsZWFzZSAoc2Vjb25kcykgYXMgcmVwbHkKKwkgKi8KKwljaGFyICptZXNnID0gYnVmOworCWludCBydjsKKworCWlmIChzaXplID4gMCkgeworCQlpbnQgbGVhc2U7CisJCXJ2ID0gZ2V0X2ludCgmbWVzZywgJmxlYXNlKTsKKwkJaWYgKHJ2KQorCQkJcmV0dXJuIHJ2OworCQlpZiAobGVhc2UgPCAxMCB8fCBsZWFzZSA+IDM2MDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbmZzNF9yZXNldF9sZWFzZShsZWFzZSk7CisJfQorCXNwcmludGYoYnVmLCAiJWxkXG4iLCBuZnM0X2xlYXNlX3RpbWUoKSk7CisJcmV0dXJuIHN0cmxlbihidWYpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqCXBvcHVsYXRpbmcgdGhlIGZpbGVzeXN0ZW0uCisgKi8KKworc3RhdGljIGludCBuZnNkX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIHZvaWQgKiBkYXRhLCBpbnQgc2lsZW50KQoreworCXN0YXRpYyBzdHJ1Y3QgdHJlZV9kZXNjciBuZnNkX2ZpbGVzW10gPSB7CisJCVtORlNEX1N2Y10gPSB7Ii5zdmMiLCAmdHJhbnNhY3Rpb25fb3BzLCBTX0lXVVNSfSwKKwkJW05GU0RfQWRkXSA9IHsiLmFkZCIsICZ0cmFuc2FjdGlvbl9vcHMsIFNfSVdVU1J9LAorCQlbTkZTRF9EZWxdID0geyIuZGVsIiwgJnRyYW5zYWN0aW9uX29wcywgU19JV1VTUn0sCisJCVtORlNEX0V4cG9ydF0gPSB7Ii5leHBvcnQiLCAmdHJhbnNhY3Rpb25fb3BzLCBTX0lXVVNSfSwKKwkJW05GU0RfVW5leHBvcnRdID0geyIudW5leHBvcnQiLCAmdHJhbnNhY3Rpb25fb3BzLCBTX0lXVVNSfSwKKwkJW05GU0RfR2V0ZmRdID0geyIuZ2V0ZmQiLCAmdHJhbnNhY3Rpb25fb3BzLCBTX0lXVVNSfFNfSVJVU1J9LAorCQlbTkZTRF9HZXRmc10gPSB7Ii5nZXRmcyIsICZ0cmFuc2FjdGlvbl9vcHMsIFNfSVdVU1J8U19JUlVTUn0sCisJCVtORlNEX0xpc3RdID0geyJleHBvcnRzIiwgJmV4cG9ydHNfb3BlcmF0aW9ucywgU19JUlVHT30sCisJCVtORlNEX0ZoXSA9IHsiZmlsZWhhbmRsZSIsICZ0cmFuc2FjdGlvbl9vcHMsIFNfSVdVU1J8U19JUlVTUn0sCisJCVtORlNEX1RocmVhZHNdID0geyJ0aHJlYWRzIiwgJnRyYW5zYWN0aW9uX29wcywgU19JV1VTUnxTX0lSVVNSfSwKKyNpZmRlZiBDT05GSUdfTkZTRF9WNAorCQlbTkZTRF9MZWFzZXRpbWVdID0geyJuZnN2NGxlYXNldGltZSIsICZ0cmFuc2FjdGlvbl9vcHMsIFNfSVdVU1J8U19JUlVTUn0sCisjZW5kaWYKKwkJLyogbGFzdCBvbmUgKi8geyIifQorCX07CisJcmV0dXJuIHNpbXBsZV9maWxsX3N1cGVyKHNiLCAweDZlNjY3MzY0LCBuZnNkX2ZpbGVzKTsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqbmZzZF9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZ2V0X3NiX3NpbmdsZShmc190eXBlLCBmbGFncywgZGF0YSwgbmZzZF9maWxsX3N1cGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIG5mc2RfZnNfdHlwZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gIm5mc2QiLAorCS5nZXRfc2IJCT0gbmZzZF9nZXRfc2IsCisJLmtpbGxfc2IJPSBraWxsX2xpdHRlcl9zdXBlciwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmZzZCh2b2lkKQoreworCWludCByZXR2YWw7CisJcHJpbnRrKEtFUk5fSU5GTyAiSW5zdGFsbGluZyBrbmZzZCAoY29weXJpZ2h0IChDKSAxOTk2IG9raXJAbW9uYWQuc3diLmRlKS5cbiIpOworCisJbmZzZF9zdGF0X2luaXQoKTsJLyogU3RhdGlzdGljcyAqLworCW5mc2RfY2FjaGVfaW5pdCgpOwkvKiBSUEMgcmVwbHkgY2FjaGUgKi8KKwluZnNkX2V4cG9ydF9pbml0KCk7CS8qIEV4cG9ydHMgdGFibGUgKi8KKwluZnNkX2xvY2tkX2luaXQoKTsJLyogbG9ja2QtPm5mc2QgY2FsbGJhY2tzICovCisjaWZkZWYgQ09ORklHX05GU0RfVjQKKwluZnNkX2lkbWFwX2luaXQoKTsgICAgICAvKiBOYW1lIHRvIElEIG1hcHBpbmcgKi8KKyNlbmRpZiAvKiBDT05GSUdfTkZTRF9WNCAqLworCWlmIChwcm9jX21rZGlyKCJmcy9uZnMiLCBOVUxMKSkgeworCQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5OworCQllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJmcy9uZnMvZXhwb3J0cyIsIDAsIE5VTEwpOworCQlpZiAoZW50cnkpCisJCQllbnRyeS0+cHJvY19mb3BzID0gICZleHBvcnRzX29wZXJhdGlvbnM7CisJfQorCXJldHZhbCA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJm5mc2RfZnNfdHlwZSk7CisJaWYgKHJldHZhbCkgeworCQluZnNkX2V4cG9ydF9zaHV0ZG93bigpOworCQluZnNkX2NhY2hlX3NodXRkb3duKCk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJmcy9uZnMvZXhwb3J0cyIsIE5VTEwpOworCQlyZW1vdmVfcHJvY19lbnRyeSgiZnMvbmZzIiwgTlVMTCk7CisJCW5mc2Rfc3RhdF9zaHV0ZG93bigpOworCQluZnNkX2xvY2tkX3NodXRkb3duKCk7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X25mc2Qodm9pZCkKK3sKKwluZnNkX2V4cG9ydF9zaHV0ZG93bigpOworCW5mc2RfY2FjaGVfc2h1dGRvd24oKTsKKwlyZW1vdmVfcHJvY19lbnRyeSgiZnMvbmZzL2V4cG9ydHMiLCBOVUxMKTsKKwlyZW1vdmVfcHJvY19lbnRyeSgiZnMvbmZzIiwgTlVMTCk7CisJbmZzZF9zdGF0X3NodXRkb3duKCk7CisJbmZzZF9sb2NrZF9zaHV0ZG93bigpOworI2lmZGVmIENPTkZJR19ORlNEX1Y0CisJbmZzZF9pZG1hcF9zaHV0ZG93bigpOworI2VuZGlmIC8qIENPTkZJR19ORlNEX1Y0ICovCisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZuZnNkX2ZzX3R5cGUpOworfQorCitNT0RVTEVfQVVUSE9SKCJPbGFmIEtpcmNoIDxva2lyQG1vbmFkLnN3Yi5kZT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK21vZHVsZV9pbml0KGluaXRfbmZzZCkKK21vZHVsZV9leGl0KGV4aXRfbmZzZCkKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzZmguYyBiL2ZzL25mc2QvbmZzZmguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTNlMzk3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzZC9uZnNmaC5jCkBAIC0wLDAgKzEsNTMyIEBACisvKgorICogbGludXgvZnMvbmZzZC9uZnNmaC5jCisgKgorICogTkZTIHNlcnZlciBmaWxlIGhhbmRsZSB0cmVhdG1lbnQuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICogUG9ydGlvbnMgQ29weXJpZ2h0IChDKSAxOTk5IEcuIEFsbGVuIE1vcnJpcyBJSUkgPGdhbTNAYWNtLm9yZz4KKyAqIEV4dGVuc2l2ZSByZXdyaXRlIGJ5IE5laWwgQnJvd24gPG5laWxiQGNzZS51bnN3LmVkdS5hdT4gU291dGhlcm4tU3ByaW5nIDE5OTkKKyAqIC4uLiBhbmQgYWdhaW4gU291dGhlcm4tV2ludGVyIDIwMDEgdG8gc3VwcG9ydCBleHBvcnRfb3BlcmF0aW9ucworICovCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RjYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL25mc2QuaD4KKworI2RlZmluZSBORlNEREJHX0ZBQ0lMSVRZCQlORlNEREJHX0ZICisjZGVmaW5lIE5GU0RfUEFSQU5PSUEgMQorLyogI2RlZmluZSBORlNEX0RFQlVHX1ZFUkJPU0UgMSAqLworCisKK3N0YXRpYyBpbnQgbmZzZF9ucl92ZXJpZmllZDsKK3N0YXRpYyBpbnQgbmZzZF9ucl9wdXQ7CisKK2V4dGVybiBzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgZXhwb3J0X29wX2RlZmF1bHQ7CisKKyNkZWZpbmUJQ0FMTChvcHMsZnVuKSAoKG9wcy0+ZnVuKT8ob3BzLT5mdW4pOmV4cG9ydF9vcF9kZWZhdWx0LmZ1bikKKworLyoKKyAqIG91ciBhY2NlcHRhYmlsaXR5IGZ1bmN0aW9uLgorICogaWYgTk9TVUJUUkVFQ0hFQ0ssIGFjY2VwdCBhbnl0aGluZworICogaWYgbm90LCByZXF1aXJlIHRoYXQgd2UgY2FuIHdhbGsgdXAgdG8gZXhwLT5leF9kZW50cnkKKyAqIGRvaW5nIHNvbWUgY2hlY2tzIG9uIHRoZSAneCcgYml0cworICovCitzdGF0aWMgaW50IG5mc2RfYWNjZXB0YWJsZSh2b2lkICpleHB2LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IHN2Y19leHBvcnQgKmV4cCA9IGV4cHY7CisJaW50IHJ2OworCXN0cnVjdCBkZW50cnkgKnRkZW50cnk7CisJc3RydWN0IGRlbnRyeSAqcGFyZW50OworCisJaWYgKGV4cC0+ZXhfZmxhZ3MgJiBORlNFWFBfTk9TVUJUUkVFQ0hFQ0spCisJCXJldHVybiAxOworCisJdGRlbnRyeSA9IGRnZXQoZGVudHJ5KTsKKwl3aGlsZSAodGRlbnRyeSAhPSBleHAtPmV4X2RlbnRyeSAmJiAhIElTX1JPT1QodGRlbnRyeSkpIHsKKwkJLyogbWFrZSBzdXJlIHBhcmVudHMgZ2l2ZSB4IHBlcm1pc3Npb24gdG8gdXNlciAqLworCQlpbnQgZXJyOworCQlwYXJlbnQgPSBkZ2V0X3BhcmVudCh0ZGVudHJ5KTsKKwkJZXJyID0gcGVybWlzc2lvbihwYXJlbnQtPmRfaW5vZGUsIE1BWV9FWEVDLCBOVUxMKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWRwdXQocGFyZW50KTsKKwkJCWJyZWFrOworCQl9CisJCWRwdXQodGRlbnRyeSk7CisJCXRkZW50cnkgPSBwYXJlbnQ7CisJfQorCWlmICh0ZGVudHJ5ICE9IGV4cC0+ZXhfZGVudHJ5KQorCQlkcHJpbnRrKCJuZnNkX2FjY2VwdGFibGUgZmFpbGVkIGF0ICVwICVzXG4iLCB0ZGVudHJ5LCB0ZGVudHJ5LT5kX25hbWUubmFtZSk7CisJcnYgPSAodGRlbnRyeSA9PSBleHAtPmV4X2RlbnRyeSk7CisJZHB1dCh0ZGVudHJ5KTsKKwlyZXR1cm4gcnY7Cit9CisKKy8qIFR5cGUgY2hlY2suIFRoZSBjb3JyZWN0IGVycm9yIHJldHVybiBmb3IgdHlwZSBtaXNtYXRjaGVzIGRvZXMgbm90IHNlZW0gdG8gYmUKKyAqIGdlbmVyYWxseSBhZ3JlZWQgdXBvbi4gU3VuT1Mgc2VlbXMgdG8gdXNlIEVJU0RJUiBpZiBmaWxlIGlzbid0IFNfSUZSRUc7IGEKKyAqIGNvbW1lbnQgaW4gdGhlIE5GU3YzIHNwZWMgc2F5cyB0aGlzIGlzIGluY29ycmVjdCAoaW1wbGVtZW50YXRpb24gbm90ZXMgZm9yCisgKiB0aGUgd3JpdGUgY2FsbCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CituZnNkX21vZGVfY2hlY2soc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdW1vZGVfdCBtb2RlLCBpbnQgdHlwZSkKK3sKKwkvKiBUeXBlIGNhbiBiZSBuZWdhdGl2ZSB3aGVuIGNyZWF0aW5nIGhhcmRsaW5rcyAtIG5vdCB0byBhIGRpciAqLworCWlmICh0eXBlID4gMCAmJiAobW9kZSAmIFNfSUZNVCkgIT0gdHlwZSkgeworCQlpZiAocnFzdHAtPnJxX3ZlcnMgPT0gNCAmJiAobW9kZSAmIFNfSUZNVCkgPT0gU19JRkxOSykKKwkJCXJldHVybiBuZnNlcnJfc3ltbGluazsKKwkJZWxzZSBpZiAodHlwZSA9PSBTX0lGRElSKQorCQkJcmV0dXJuIG5mc2Vycl9ub3RkaXI7CisJCWVsc2UgaWYgKChtb2RlICYgU19JRk1UKSA9PSBTX0lGRElSKQorCQkJcmV0dXJuIG5mc2Vycl9pc2RpcjsKKwkJZWxzZQorCQkJcmV0dXJuIG5mc2Vycl9pbnZhbDsKKwl9CisJaWYgKHR5cGUgPCAwICYmIChtb2RlICYgU19JRk1UKSA9PSAtdHlwZSkgeworCQlpZiAocnFzdHAtPnJxX3ZlcnMgPT0gNCAmJiAobW9kZSAmIFNfSUZNVCkgPT0gU19JRkxOSykKKwkJCXJldHVybiBuZnNlcnJfc3ltbGluazsKKwkJZWxzZSBpZiAodHlwZSA9PSAtU19JRkRJUikKKwkJCXJldHVybiBuZnNlcnJfaXNkaXI7CisJCWVsc2UKKwkJCXJldHVybiBuZnNlcnJfbm90ZGlyOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFBlcmZvcm0gc2FuaXR5IGNoZWNrcyBvbiB0aGUgZGVudHJ5IGluIGEgY2xpZW50J3MgZmlsZSBoYW5kbGUuCisgKgorICogTm90ZSB0aGF0IHRoZSBmaWxlIGhhbmRsZSBkZW50cnkgbWF5IG5lZWQgdG8gYmUgZnJlZWQgZXZlbiBhZnRlcgorICogYW4gZXJyb3IgcmV0dXJuLgorICoKKyAqIFRoaXMgaXMgb25seSBjYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIGFuIG5mc3Byb2MgY2FsbCwgc28gZmhwIHBvaW50cyB0bworICogYSBzdmNfZmggd2hpY2ggaXMgYWxsIDAgZXhjZXB0IGZvciB0aGUgb3Zlci10aGUtd2lyZSBmaWxlIGhhbmRsZS4KKyAqLwordTMyCitmaF92ZXJpZnkoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmhwLCBpbnQgdHlwZSwgaW50IGFjY2VzcykKK3sKKwlzdHJ1Y3Qga25mc2RfZmgJKmZoID0gJmZocC0+ZmhfaGFuZGxlOworCXN0cnVjdCBzdmNfZXhwb3J0ICpleHAgPSBOVUxMOworCXN0cnVjdCBkZW50cnkJKmRlbnRyeTsKKwl1MzIJCWVycm9yID0gMDsKKworCWRwcmludGsoIm5mc2Q6IGZoX3ZlcmlmeSglcylcbiIsIFNWQ0ZIX2ZtdChmaHApKTsKKworCS8qIGtlZXAgdGhpcyBmaWxlaGFuZGxlIGZvciBwb3NzaWJsZSByZWZlcmVuY2UgIHdoZW4gZW5jb2RpbmcgYXR0cmlidXRlcyAqLworCXJxc3RwLT5ycV9yZWZmaCA9IGZoOworCisJaWYgKCFmaHAtPmZoX2RlbnRyeSkgeworCQlfX3UzMiAqZGF0YXA9TlVMTDsKKwkJX191MzIgdGZoWzNdOwkJLyogZmlsZWhhbmRsZSBmcmFnbWVudCBmb3Igb2xkc3R5bGUgZmlsZWhhbmRsZXMgKi8KKwkJaW50IGZpbGVpZF90eXBlOworCQlpbnQgZGF0YV9sZWZ0ID0gZmgtPmZoX3NpemUvNDsKKworCQllcnJvciA9IG5mc2Vycl9zdGFsZTsKKwkJaWYgKHJxc3RwLT5ycV9jbGllbnQgPT0gTlVMTCkKKwkJCWdvdG8gb3V0OworCQlpZiAocnFzdHAtPnJxX3ZlcnMgPiAyKQorCQkJZXJyb3IgPSBuZnNlcnJfYmFkaGFuZGxlOworCQlpZiAocnFzdHAtPnJxX3ZlcnMgPT0gNCAmJiBmaC0+Zmhfc2l6ZSA9PSAwKQorCQkJcmV0dXJuIG5mc2Vycl9ub2ZpbGVoYW5kbGU7CisKKwkJaWYgKGZoLT5maF92ZXJzaW9uID09IDEpIHsKKwkJCWludCBsZW47CisJCQlkYXRhcCA9IGZoLT5maF9hdXRoOworCQkJaWYgKC0tZGF0YV9sZWZ0PDApIGdvdG8gb3V0OworCQkJc3dpdGNoIChmaC0+ZmhfYXV0aF90eXBlKSB7CisJCQljYXNlIDA6IGJyZWFrOworCQkJZGVmYXVsdDogZ290byBvdXQ7CisJCQl9CisJCQlsZW4gPSBrZXlfbGVuKGZoLT5maF9mc2lkX3R5cGUpIC8gNDsKKwkJCWlmIChsZW4gPT0gMCkgZ290byBvdXQ7CisJCQlpZiAgKGZoLT5maF9mc2lkX3R5cGUgPT0gMikgeworCQkJCS8qIGRlcHJlY2F0ZWQsIGNvbnZlcnQgdG8gdHlwZSAzICovCisJCQkJbGVuID0gMzsKKwkJCQlmaC0+ZmhfZnNpZF90eXBlID0gMzsKKwkJCQlmaC0+ZmhfZnNpZFswXSA9IG5ld19lbmNvZGVfZGV2KE1LREVWKG50b2hsKGZoLT5maF9mc2lkWzBdKSwgbnRvaGwoZmgtPmZoX2ZzaWRbMV0pKSk7CisJCQkJZmgtPmZoX2ZzaWRbMV0gPSBmaC0+ZmhfZnNpZFsyXTsKKwkJCX0KKwkJCWlmICgoZGF0YV9sZWZ0IC09IGxlbik8MCkgZ290byBvdXQ7CisJCQlleHAgPSBleHBfZmluZChycXN0cC0+cnFfY2xpZW50LCBmaC0+ZmhfZnNpZF90eXBlLCBkYXRhcCwgJnJxc3RwLT5ycV9jaGFuZGxlKTsKKwkJCWRhdGFwICs9IGxlbjsKKwkJfSBlbHNlIHsKKwkJCWRldl90IHhkZXY7CisJCQlpbm9fdCB4aW5vOworCQkJaWYgKGZoLT5maF9zaXplICE9IE5GU19GSFNJWkUpCisJCQkJZ290byBvdXQ7CisJCQkvKiBhc3N1bWUgb2xkIGZpbGVoYW5kbGUgZm9ybWF0ICovCisJCQl4ZGV2ID0gb2xkX2RlY29kZV9kZXYoZmgtPm9maF94ZGV2KTsKKwkJCXhpbm8gPSB1MzJfdG9faW5vX3QoZmgtPm9maF94aW5vKTsKKwkJCW1rX2ZzaWRfdjAodGZoLCB4ZGV2LCB4aW5vKTsKKwkJCWV4cCA9IGV4cF9maW5kKHJxc3RwLT5ycV9jbGllbnQsIDAsIHRmaCwgJnJxc3RwLT5ycV9jaGFuZGxlKTsKKwkJfQorCisJCWVycm9yID0gbmZzZXJyX2Ryb3BpdDsKKwkJaWYgKElTX0VSUihleHApICYmIFBUUl9FUlIoZXhwKSA9PSAtRUFHQUlOKQorCQkJZ290byBvdXQ7CisKKwkJZXJyb3IgPSBuZnNlcnJfc3RhbGU7IAorCQlpZiAoIWV4cCB8fCBJU19FUlIoZXhwKSkKKwkJCWdvdG8gb3V0OworCisJCS8qIENoZWNrIGlmIHRoZSByZXF1ZXN0IG9yaWdpbmF0ZWQgZnJvbSBhIHNlY3VyZSBwb3J0LiAqLworCQllcnJvciA9IG5mc2Vycl9wZXJtOworCQlpZiAoIXJxc3RwLT5ycV9zZWN1cmUgJiYgRVhfU0VDVVJFKGV4cCkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAibmZzZDogcmVxdWVzdCBmcm9tIGluc2VjdXJlIHBvcnQgKCV1LiV1LiV1LiV1OiVkKSFcbiIsCisJCQkgICAgICAgTklQUVVBRChycXN0cC0+cnFfYWRkci5zaW5fYWRkci5zX2FkZHIpLAorCQkJICAgICAgIG50b2hzKHJxc3RwLT5ycV9hZGRyLnNpbl9wb3J0KSk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qIFNldCB1c2VyIGNyZWRzIGZvciB0aGlzIGV4cG9ydHBvaW50ICovCisJCWVycm9yID0gbmZzZF9zZXR1c2VyKHJxc3RwLCBleHApOworCQlpZiAoZXJyb3IpIHsKKwkJCWVycm9yID0gbmZzZXJybm8oZXJyb3IpOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKgorCQkgKiBMb29rIHVwIHRoZSBkZW50cnkgdXNpbmcgdGhlIE5GUyBmaWxlIGhhbmRsZS4KKwkJICovCisJCWVycm9yID0gbmZzZXJyX3N0YWxlOworCQlpZiAocnFzdHAtPnJxX3ZlcnMgPiAyKQorCQkJZXJyb3IgPSBuZnNlcnJfYmFkaGFuZGxlOworCisJCWlmIChmaC0+ZmhfdmVyc2lvbiAhPSAxKSB7CisJCQl0ZmhbMF0gPSBmaC0+b2ZoX2lubzsKKwkJCXRmaFsxXSA9IGZoLT5vZmhfZ2VuZXJhdGlvbjsKKwkJCXRmaFsyXSA9IGZoLT5vZmhfZGlyaW5vOworCQkJZGF0YXAgPSB0Zmg7CisJCQlkYXRhX2xlZnQgPSAzOworCQkJaWYgKGZoLT5vZmhfZGlyaW5vID09IDApCisJCQkJZmlsZWlkX3R5cGUgPSAxOworCQkJZWxzZQorCQkJCWZpbGVpZF90eXBlID0gMjsKKwkJfSBlbHNlCisJCQlmaWxlaWRfdHlwZSA9IGZoLT5maF9maWxlaWRfdHlwZTsKKwkJCisJCWlmIChmaWxlaWRfdHlwZSA9PSAwKQorCQkJZGVudHJ5ID0gZGdldChleHAtPmV4X2RlbnRyeSk7CisJCWVsc2UgeworCQkJc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zICpub3AgPSBleHAtPmV4X21udC0+bW50X3NiLT5zX2V4cG9ydF9vcDsKKwkJCWRlbnRyeSA9IENBTEwobm9wLGRlY29kZV9maCkoZXhwLT5leF9tbnQtPm1udF9zYiwKKwkJCQkJCSAgICAgZGF0YXAsIGRhdGFfbGVmdCwKKwkJCQkJCSAgICAgZmlsZWlkX3R5cGUsCisJCQkJCQkgICAgIG5mc2RfYWNjZXB0YWJsZSwgZXhwKTsKKwkJfQorCQlpZiAoZGVudHJ5ID09IE5VTEwpCisJCQlnb3RvIG91dDsKKwkJaWYgKElTX0VSUihkZW50cnkpKSB7CisJCQlpZiAoUFRSX0VSUihkZW50cnkpICE9IC1FSU5WQUwpCisJCQkJZXJyb3IgPSBuZnNlcnJubyhQVFJfRVJSKGRlbnRyeSkpOworCQkJZ290byBvdXQ7CisJCX0KKyNpZmRlZiBORlNEX1BBUkFOT0lBCisJCWlmIChTX0lTRElSKGRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSAmJgorCQkgICAgKGRlbnRyeS0+ZF9mbGFncyAmIERDQUNIRV9ESVNDT05ORUNURUQpKSB7CisJCQlwcmludGsoIm5mc2Q6IGZpbmRfZmhfZGVudHJ5IHJldHVybmVkIGEgRElTQ09OTkVDVEVEIGRpcmVjdG9yeTogJXMvJXNcbiIsCisJCQkgICAgICAgZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCQl9CisjZW5kaWYKKworCQlmaHAtPmZoX2RlbnRyeSA9IGRlbnRyeTsKKwkJZmhwLT5maF9leHBvcnQgPSBleHA7CisJCW5mc2RfbnJfdmVyaWZpZWQrKzsKKwl9IGVsc2UgeworCQkvKiBqdXN0IHJlY2hlY2tpbmcgcGVybWlzc2lvbnMKKwkJICogKGUuZy4gbmZzcHJvY19jcmVhdGUgY2FsbHMgZmhfdmVyaWZ5LCB0aGVuIG5mc2RfY3JlYXRlIGRvZXMgYXMgd2VsbCkKKwkJICovCisJCWRwcmludGsoIm5mc2Q6IGZoX3ZlcmlmeSAtIGp1c3QgY2hlY2tpbmdcbiIpOworCQlkZW50cnkgPSBmaHAtPmZoX2RlbnRyeTsKKwkJZXhwID0gZmhwLT5maF9leHBvcnQ7CisJfQorCWNhY2hlX2dldCgmZXhwLT5oKTsKKworCWVycm9yID0gbmZzZF9tb2RlX2NoZWNrKHJxc3RwLCBkZW50cnktPmRfaW5vZGUtPmlfbW9kZSwgdHlwZSk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKworCS8qIEZpbmFsbHksIGNoZWNrIGFjY2VzcyBwZXJtaXNzaW9ucy4gKi8KKwllcnJvciA9IG5mc2RfcGVybWlzc2lvbihleHAsIGRlbnRyeSwgYWNjZXNzKTsKKworI2lmZGVmIE5GU0RfUEFSQU5PSUFfRVhUUkVNRQorCWlmIChlcnJvcikgeworCQlwcmludGsoImZoX3ZlcmlmeTogJXMvJXMgcGVybWlzc2lvbiBmYWlsdXJlLCBhY2M9JXgsIGVycm9yPSVkXG4iLAorCQkgICAgICAgZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGFjY2VzcywgKGVycm9yID4+IDI0KSk7CisJfQorI2VuZGlmCitvdXQ6CisJaWYgKGV4cCAmJiAhSVNfRVJSKGV4cCkpCisJCWV4cF9wdXQoZXhwKTsKKwlpZiAoZXJyb3IgPT0gbmZzZXJyX3N0YWxlKQorCQluZnNkc3RhdHMuZmhfc3RhbGUrKzsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworLyoKKyAqIENvbXBvc2UgYSBmaWxlIGhhbmRsZSBmb3IgYW4gTkZTIHJlcGx5LgorICoKKyAqIE5vdGUgdGhhdCB3aGVuIGZpcnN0IGNvbXBvc2VkLCB0aGUgZGVudHJ5IG1heSBub3QgeWV0IGhhdmUKKyAqIGFuIGlub2RlLiAgSW4gdGhpcyBjYXNlIGEgY2FsbCB0byBmaF91cGRhdGUgc2hvdWxkIGJlIG1hZGUKKyAqIGJlZm9yZSB0aGUgZmggZ29lcyBvdXQgb24gdGhlIHdpcmUgLi4uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IF9maF91cGRhdGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qgc3ZjX2V4cG9ydCAqZXhwLAorCQkJICAgICBfX3UzMiAqZGF0YXAsIGludCAqbWF4c2l6ZSkKK3sKKwlzdHJ1Y3QgZXhwb3J0X29wZXJhdGlvbnMgKm5vcCA9IGV4cC0+ZXhfbW50LT5tbnRfc2ItPnNfZXhwb3J0X29wOworCQorCWlmIChkZW50cnkgPT0gZXhwLT5leF9kZW50cnkpIHsKKwkJKm1heHNpemUgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gQ0FMTChub3AsZW5jb2RlX2ZoKShkZW50cnksIGRhdGFwLCBtYXhzaXplLAorCQkJICAhKGV4cC0+ZXhfZmxhZ3MmTkZTRVhQX05PU1VCVFJFRUNIRUNLKSk7Cit9CisKKy8qCisgKiBmb3IgY29tcG9zaW5nIG9sZCBzdHlsZSBmaWxlIGhhbmRsZXMKKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9maF91cGRhdGVfb2xkKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCQkgIHN0cnVjdCBzdmNfZXhwb3J0ICpleHAsCisJCQkJICBzdHJ1Y3Qga25mc2RfZmggKmZoKQoreworCWZoLT5vZmhfaW5vID0gaW5vX3RfdG9fdTMyKGRlbnRyeS0+ZF9pbm9kZS0+aV9pbm8pOworCWZoLT5vZmhfZ2VuZXJhdGlvbiA9IGRlbnRyeS0+ZF9pbm9kZS0+aV9nZW5lcmF0aW9uOworCWlmIChTX0lTRElSKGRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSB8fAorCSAgICAoZXhwLT5leF9mbGFncyAmIE5GU0VYUF9OT1NVQlRSRUVDSEVDSykpCisJCWZoLT5vZmhfZGlyaW5vID0gMDsKK30KKworaW50CitmaF9jb21wb3NlKHN0cnVjdCBzdmNfZmggKmZocCwgc3RydWN0IHN2Y19leHBvcnQgKmV4cCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qgc3ZjX2ZoICpyZWZfZmgpCit7CisJLyogcmVmX2ZoIGlzIGEgcmVmZXJlbmNlIGZpbGUgaGFuZGxlLgorCSAqIGlmIGl0IGlzIG5vbi1udWxsLCB0aGVuIHdlIHNob3VsZCBjb21wb3NlIGEgZmlsZWhhbmRsZSB3aGljaCBpcworCSAqIG9mIHRoZSBzYW1lIHZlcnNpb24sIHdoZXJlIHBvc3NpYmxlLgorCSAqIEN1cnJlbnRseSwgdGhhdCBtZWFucyB0aGF0IGlmIHJlZl9maC0+ZmhfaGFuZGxlLmZoX3ZlcnNpb24gPT0gMHhjYQorCSAqIFRoZW4gY3JlYXRlIGEgMzJieXRlIGZpbGVoYW5kbGUgdXNpbmcgbmZzX2ZoYmFzZV9vbGQKKwkgKgorCSAqLworCisJdTggcmVmX2ZoX3ZlcnNpb24gPSAwOworCXU4IHJlZl9maF9mc2lkX3R5cGUgPSAwOworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBkZW50cnkgKnBhcmVudCA9IGRlbnRyeS0+ZF9wYXJlbnQ7CisJX191MzIgKmRhdGFwOworCWRldl90IGV4X2RldiA9IGV4cC0+ZXhfZGVudHJ5LT5kX2lub2RlLT5pX3NiLT5zX2RldjsKKworCWRwcmludGsoIm5mc2Q6IGZoX2NvbXBvc2UoZXhwICUwMng6JTAyeC8lbGQgJXMvJXMsIGlubz0lbGQpXG4iLAorCQlNQUpPUihleF9kZXYpLCBNSU5PUihleF9kZXYpLAorCQkobG9uZykgZXhwLT5leF9kZW50cnktPmRfaW5vZGUtPmlfaW5vLAorCQlwYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lLAorCQkoaW5vZGUgPyBpbm9kZS0+aV9pbm8gOiAwKSk7CisKKwlpZiAocmVmX2ZoKSB7CisJCXJlZl9maF92ZXJzaW9uID0gcmVmX2ZoLT5maF9oYW5kbGUuZmhfdmVyc2lvbjsKKwkJaWYgKHJlZl9maF92ZXJzaW9uID09IDB4Y2EpCisJCQlyZWZfZmhfZnNpZF90eXBlID0gMDsKKwkJZWxzZQorCQkJcmVmX2ZoX2ZzaWRfdHlwZSA9IHJlZl9maC0+ZmhfaGFuZGxlLmZoX2ZzaWRfdHlwZTsKKwkJaWYgKHJlZl9maF9mc2lkX3R5cGUgPiAzKQorCQkJcmVmX2ZoX2ZzaWRfdHlwZSA9IDA7CisKKwkJLyogbWFrZSBzdXJlIHJlZl9maCB0eXBlIHdvcmtzIGZvciBnaXZlbiBleHBvcnQgKi8KKwkJaWYgKHJlZl9maF9mc2lkX3R5cGUgPT0gMSAmJgorCQkgICAgIShleHAtPmV4X2ZsYWdzICYgTkZTRVhQX0ZTSUQpKSB7CisJCQkvKiBpZiB3ZSBkb24ndCBoYXZlIGFuIGZzaWQsIHdlIGNhbm5vdCBwcm92aWRlIG9uZS4uLiAqLworCQkJcmVmX2ZoX2ZzaWRfdHlwZSA9IDA7CisJCX0KKwl9IGVsc2UgaWYgKGV4cC0+ZXhfZmxhZ3MgJiBORlNFWFBfRlNJRCkKKwkJcmVmX2ZoX2ZzaWRfdHlwZSA9IDE7CisKKwlpZiAoIW9sZF92YWxpZF9kZXYoZXhfZGV2KSAmJiByZWZfZmhfZnNpZF90eXBlID09IDApIHsKKwkJLyogZm9yIG5ld2VyIGRldmljZSBudW1iZXJzLCB3ZSBtdXN0IHVzZSBhIG5ld2VyIGZzaWQgZm9ybWF0ICovCisJCXJlZl9maF92ZXJzaW9uID0gMTsKKwkJcmVmX2ZoX2ZzaWRfdHlwZSA9IDM7CisJfQorCWlmIChvbGRfdmFsaWRfZGV2KGV4X2RldikgJiYKKwkgICAgKHJlZl9maF9mc2lkX3R5cGUgPT0gMiB8fCByZWZfZmhfZnNpZF90eXBlID09IDMpKQorCQkvKiBtdXN0IHVzZSB0eXBlMSBmb3Igc21hbGxlciBkZXZpY2UgbnVtYmVycyAqLworCQlyZWZfZmhfZnNpZF90eXBlID0gMDsKKworCWlmIChyZWZfZmggPT0gZmhwKQorCQlmaF9wdXQocmVmX2ZoKTsKKworCWlmIChmaHAtPmZoX2xvY2tlZCB8fCBmaHAtPmZoX2RlbnRyeSkgeworCQlwcmludGsoS0VSTl9FUlIgImZoX2NvbXBvc2U6IGZoICVzLyVzIG5vdCBpbml0aWFsaXplZCFcbiIsCisJCQlwYXJlbnQtPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5uYW1lKTsKKwl9CisJaWYgKGZocC0+ZmhfbWF4c2l6ZSA8IE5GU19GSFNJWkUpCisJCXByaW50ayhLRVJOX0VSUiAiZmhfY29tcG9zZTogY2FsbGVkIHdpdGggbWF4c2l6ZSAlZCEgJXMvJXNcbiIsCisJCSAgICAgICBmaHAtPmZoX21heHNpemUsIHBhcmVudC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJZmhwLT5maF9kZW50cnkgPSBkZ2V0KGRlbnRyeSk7IC8qIG91ciBpbnRlcm5hbCBjb3B5ICovCisJZmhwLT5maF9leHBvcnQgPSBleHA7CisJY2FjaGVfZ2V0KCZleHAtPmgpOworCisJaWYgKHJlZl9maF92ZXJzaW9uID09IDB4Y2EpIHsKKwkJLyogb2xkIHN0eWxlIGZpbGVoYW5kbGUgcGxlYXNlICovCisJCW1lbXNldCgmZmhwLT5maF9oYW5kbGUuZmhfYmFzZSwgMCwgTkZTX0ZIU0laRSk7CisJCWZocC0+ZmhfaGFuZGxlLmZoX3NpemUgPSBORlNfRkhTSVpFOworCQlmaHAtPmZoX2hhbmRsZS5vZmhfZGNvb2tpZSA9IDB4ZmVlYmJhY2E7CisJCWZocC0+ZmhfaGFuZGxlLm9maF9kZXYgPSAgb2xkX2VuY29kZV9kZXYoZXhfZGV2KTsKKwkJZmhwLT5maF9oYW5kbGUub2ZoX3hkZXYgPSBmaHAtPmZoX2hhbmRsZS5vZmhfZGV2OworCQlmaHAtPmZoX2hhbmRsZS5vZmhfeGlubyA9IGlub190X3RvX3UzMihleHAtPmV4X2RlbnRyeS0+ZF9pbm9kZS0+aV9pbm8pOworCQlmaHAtPmZoX2hhbmRsZS5vZmhfZGlyaW5vID0gaW5vX3RfdG9fdTMyKHBhcmVudF9pbm8oZGVudHJ5KSk7CisJCWlmIChpbm9kZSkKKwkJCV9maF91cGRhdGVfb2xkKGRlbnRyeSwgZXhwLCAmZmhwLT5maF9oYW5kbGUpOworCX0gZWxzZSB7CisJCWludCBsZW47CisJCWZocC0+ZmhfaGFuZGxlLmZoX3ZlcnNpb24gPSAxOworCQlmaHAtPmZoX2hhbmRsZS5maF9hdXRoX3R5cGUgPSAwOworCQlkYXRhcCA9IGZocC0+ZmhfaGFuZGxlLmZoX2F1dGgrMDsKKwkJZmhwLT5maF9oYW5kbGUuZmhfZnNpZF90eXBlID0gcmVmX2ZoX2ZzaWRfdHlwZTsKKwkJc3dpdGNoIChyZWZfZmhfZnNpZF90eXBlKSB7CisJCQljYXNlIDA6CisJCQkJLyoKKwkJCQkgKiBmc2lkX3R5cGUgMDoKKwkJCQkgKiAyYnl0ZSBtYWpvciwgMmJ5dGUgbWlub3IsIDRieXRlIGlub2RlCisJCQkJICovCisJCQkJbWtfZnNpZF92MChkYXRhcCwgZXhfZGV2LAorCQkJCQlleHAtPmV4X2RlbnRyeS0+ZF9pbm9kZS0+aV9pbm8pOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCS8qIGZzaWRfdHlwZSAxID09IDQgYnl0ZXMgZmlsZXN5c3RlbSBpZCAqLworCQkJCW1rX2ZzaWRfdjEoZGF0YXAsIGV4cC0+ZXhfZnNpZCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJLyoKKwkJCQkgKiBmc2lkX3R5cGUgMjoKKwkJCQkgKiA0Ynl0ZSBtYWpvciwgNGJ5dGUgbWlub3IsIDRieXRlIGlub2RlCisJCQkJICovCisJCQkJbWtfZnNpZF92MihkYXRhcCwgZXhfZGV2LAorCQkJCQlleHAtPmV4X2RlbnRyeS0+ZF9pbm9kZS0+aV9pbm8pOworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCS8qCisJCQkJICogZnNpZF90eXBlIDM6CisJCQkJICogNGJ5dGUgZGV2aWNlbnVtYmVyLCA0Ynl0ZSBpbm9kZQorCQkJCSAqLworCQkJCW1rX2ZzaWRfdjMoZGF0YXAsIGV4X2RldiwKKwkJCQkJZXhwLT5leF9kZW50cnktPmRfaW5vZGUtPmlfaW5vKTsKKwkJCQlicmVhazsKKwkJfQorCQlsZW4gPSBrZXlfbGVuKHJlZl9maF9mc2lkX3R5cGUpOworCQlkYXRhcCArPSBsZW4vNDsKKwkJZmhwLT5maF9oYW5kbGUuZmhfc2l6ZSA9IDQgKyBsZW47CisKKwkJaWYgKGlub2RlKSB7CisJCQlpbnQgc2l6ZSA9IChmaHAtPmZoX21heHNpemUtbGVuLTQpLzQ7CisJCQlmaHAtPmZoX2hhbmRsZS5maF9maWxlaWRfdHlwZSA9CisJCQkJX2ZoX3VwZGF0ZShkZW50cnksIGV4cCwgZGF0YXAsICZzaXplKTsKKwkJCWZocC0+ZmhfaGFuZGxlLmZoX3NpemUgKz0gc2l6ZSo0OworCQl9CisJCWlmIChmaHAtPmZoX2hhbmRsZS5maF9maWxlaWRfdHlwZSA9PSAyNTUpCisJCQlyZXR1cm4gbmZzZXJyX29wbm90c3VwcDsKKwl9CisKKwluZnNkX25yX3ZlcmlmaWVkKys7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBVcGRhdGUgZmlsZSBoYW5kbGUgaW5mb3JtYXRpb24gYWZ0ZXIgY2hhbmdpbmcgYSBkZW50cnkuCisgKiBUaGlzIGlzIG9ubHkgY2FsbGVkIGJ5IG5mc2RfY3JlYXRlLCBuZnNkX2NyZWF0ZV92MyBhbmQgbmZzZF9wcm9jX2NyZWF0ZQorICovCitpbnQKK2ZoX3VwZGF0ZShzdHJ1Y3Qgc3ZjX2ZoICpmaHApCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCV9fdTMyICpkYXRhcDsKKwkKKwlpZiAoIWZocC0+ZmhfZGVudHJ5KQorCQlnb3RvIG91dF9iYWQ7CisKKwlkZW50cnkgPSBmaHAtPmZoX2RlbnRyeTsKKwlpZiAoIWRlbnRyeS0+ZF9pbm9kZSkKKwkJZ290byBvdXRfbmVnYXRpdmU7CisJaWYgKGZocC0+ZmhfaGFuZGxlLmZoX3ZlcnNpb24gIT0gMSkgeworCQlfZmhfdXBkYXRlX29sZChkZW50cnksIGZocC0+ZmhfZXhwb3J0LCAmZmhwLT5maF9oYW5kbGUpOworCX0gZWxzZSB7CisJCWludCBzaXplOworCQlpZiAoZmhwLT5maF9oYW5kbGUuZmhfZmlsZWlkX3R5cGUgIT0gMCkKKwkJCWdvdG8gb3V0X3VwdG9kYXRlOworCQlkYXRhcCA9IGZocC0+ZmhfaGFuZGxlLmZoX2F1dGgrCisJCQlmaHAtPmZoX2hhbmRsZS5maF9zaXplLzQgLTE7CisJCXNpemUgPSAoZmhwLT5maF9tYXhzaXplIC0gZmhwLT5maF9oYW5kbGUuZmhfc2l6ZSkvNDsKKwkJZmhwLT5maF9oYW5kbGUuZmhfZmlsZWlkX3R5cGUgPQorCQkJX2ZoX3VwZGF0ZShkZW50cnksIGZocC0+ZmhfZXhwb3J0LCBkYXRhcCwgJnNpemUpOworCQlmaHAtPmZoX2hhbmRsZS5maF9zaXplICs9IHNpemUqNDsKKwkJaWYgKGZocC0+ZmhfaGFuZGxlLmZoX2ZpbGVpZF90eXBlID09IDI1NSkKKwkJCXJldHVybiBuZnNlcnJfb3Bub3RzdXBwOworCX0KK291dDoKKwlyZXR1cm4gMDsKKworb3V0X2JhZDoKKwlwcmludGsoS0VSTl9FUlIgImZoX3VwZGF0ZTogZmggbm90IHZlcmlmaWVkIVxuIik7CisJZ290byBvdXQ7CitvdXRfbmVnYXRpdmU6CisJcHJpbnRrKEtFUk5fRVJSICJmaF91cGRhdGU6ICVzLyVzIHN0aWxsIG5lZ2F0aXZlIVxuIiwKKwkJZGVudHJ5LT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLm5hbWUpOworCWdvdG8gb3V0Oworb3V0X3VwdG9kYXRlOgorCXByaW50ayhLRVJOX0VSUiAiZmhfdXBkYXRlOiAlcy8lcyBhbHJlYWR5IHVwLXRvLWRhdGUhXG4iLAorCQlkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSk7CisJZ290byBvdXQ7Cit9CisKKy8qCisgKiBSZWxlYXNlIGEgZmlsZSBoYW5kbGUuCisgKi8KK3ZvaWQKK2ZoX3B1dChzdHJ1Y3Qgc3ZjX2ZoICpmaHApCit7CisJc3RydWN0IGRlbnRyeSAqIGRlbnRyeSA9IGZocC0+ZmhfZGVudHJ5OworCXN0cnVjdCBzdmNfZXhwb3J0ICogZXhwID0gZmhwLT5maF9leHBvcnQ7CisJaWYgKGRlbnRyeSkgeworCQlmaF91bmxvY2soZmhwKTsKKwkJZmhwLT5maF9kZW50cnkgPSBOVUxMOworCQlkcHV0KGRlbnRyeSk7CisjaWZkZWYgQ09ORklHX05GU0RfVjMKKwkJZmhwLT5maF9wcmVfc2F2ZWQgPSAwOworCQlmaHAtPmZoX3Bvc3Rfc2F2ZWQgPSAwOworI2VuZGlmCisJCW5mc2RfbnJfcHV0Kys7CisJfQorCWlmIChleHApIHsKKwkJc3ZjX2V4cG9ydF9wdXQoJmV4cC0+aCwgJnN2Y19leHBvcnRfY2FjaGUpOworCQlmaHAtPmZoX2V4cG9ydCA9IE5VTEw7CisJfQorCXJldHVybjsKK30KKworLyoKKyAqIFNob3J0aGFuZCBmb3IgZHByaW50aygpJ3MKKyAqLworY2hhciAqIFNWQ0ZIX2ZtdChzdHJ1Y3Qgc3ZjX2ZoICpmaHApCit7CisJc3RydWN0IGtuZnNkX2ZoICpmaCA9ICZmaHAtPmZoX2hhbmRsZTsKKworCXN0YXRpYyBjaGFyIGJ1Zls4MF07CisJc3ByaW50ZihidWYsICIlZDogJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHgiLAorCQlmaC0+Zmhfc2l6ZSwKKwkJZmgtPmZoX2Jhc2UuZmhfcGFkWzBdLAorCQlmaC0+ZmhfYmFzZS5maF9wYWRbMV0sCisJCWZoLT5maF9iYXNlLmZoX3BhZFsyXSwKKwkJZmgtPmZoX2Jhc2UuZmhfcGFkWzNdLAorCQlmaC0+ZmhfYmFzZS5maF9wYWRbNF0sCisJCWZoLT5maF9iYXNlLmZoX3BhZFs1XSk7CisJcmV0dXJuIGJ1ZjsKK30KZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzcHJvYy5jIGIvZnMvbmZzZC9uZnNwcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU3ZjlkMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25mc2QvbmZzcHJvYy5jCkBAIC0wLDAgKzEsNjA1IEBACisvKgorICogbmZzcHJvYzIuYwlQcm9jZXNzIHZlcnNpb24gMiBORlMgcmVxdWVzdHMuCisgKiBsaW51eC9mcy9uZnNkL25mczJwcm9jLmMKKyAqIAorICogUHJvY2VzcyB2ZXJzaW9uIDIgTkZTIHJlcXVlc3RzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk3IE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Yy5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2QvbmZzZC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2QvY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL3hkci5oPgorCit0eXBlZGVmIHN0cnVjdCBzdmNfcnFzdAlzdmNfcnFzdDsKK3R5cGVkZWYgc3RydWN0IHN2Y19idWYJc3ZjX2J1ZjsKKworI2RlZmluZSBORlNEREJHX0ZBQ0lMSVRZCQlORlNEREJHX1BST0MKKworCitzdGF0aWMgaW50CituZnNkX3Byb2NfbnVsbChzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB2b2lkICphcmdwLCB2b2lkICpyZXNwKQoreworCXJldHVybiBuZnNfb2s7Cit9CisKKy8qCisgKiBHZXQgYSBmaWxlJ3MgYXR0cmlidXRlcworICogTi5CLiBBZnRlciB0aGlzIGNhbGwgcmVzcC0+ZmggbmVlZHMgYW4gZmhfcHV0CisgKi8KK3N0YXRpYyBpbnQKK25mc2RfcHJvY19nZXRhdHRyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkX2ZoYW5kbGUgICphcmdwLAorCQkJCQkgIHN0cnVjdCBuZnNkX2F0dHJzdGF0ICpyZXNwKQoreworCWRwcmludGsoIm5mc2Q6IEdFVEFUVFIgICVzXG4iLCBTVkNGSF9mbXQoJmFyZ3AtPmZoKSk7CisKKwlmaF9jb3B5KCZyZXNwLT5maCwgJmFyZ3AtPmZoKTsKKwlyZXR1cm4gZmhfdmVyaWZ5KHJxc3RwLCAmcmVzcC0+ZmgsIDAsIE1BWV9OT1ApOworfQorCisvKgorICogU2V0IGEgZmlsZSdzIGF0dHJpYnV0ZXMKKyAqIE4uQi4gQWZ0ZXIgdGhpcyBjYWxsIHJlc3AtPmZoIG5lZWRzIGFuIGZoX3B1dAorICovCitzdGF0aWMgaW50CituZnNkX3Byb2Nfc2V0YXR0cihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZF9zYXR0cmFyZ3MgKmFyZ3AsCisJCQkJCSAgc3RydWN0IG5mc2RfYXR0cnN0YXQgICpyZXNwKQoreworCWRwcmludGsoIm5mc2Q6IFNFVEFUVFIgICVzLCB2YWxpZD0leCwgc2l6ZT0lbGRcbiIsCisJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmgpLAorCQlhcmdwLT5hdHRycy5pYV92YWxpZCwgKGxvbmcpIGFyZ3AtPmF0dHJzLmlhX3NpemUpOworCisJZmhfY29weSgmcmVzcC0+ZmgsICZhcmdwLT5maCk7CisJcmV0dXJuIG5mc2Rfc2V0YXR0cihycXN0cCwgJnJlc3AtPmZoLCAmYXJncC0+YXR0cnMsMCwgKHRpbWVfdCkwKTsKK30KKworLyoKKyAqIExvb2sgdXAgYSBwYXRoIG5hbWUgY29tcG9uZW50CisgKiBOb3RlOiB0aGUgZGVudHJ5IGluIHRoZSByZXNwLT5maCBtYXkgYmUgbmVnYXRpdmUgaWYgdGhlIGZpbGUKKyAqIGRvZXNuJ3QgZXhpc3QgeWV0LgorICogTi5CLiBBZnRlciB0aGlzIGNhbGwgcmVzcC0+ZmggbmVlZHMgYW4gZmhfcHV0CisgKi8KK3N0YXRpYyBpbnQKK25mc2RfcHJvY19sb29rdXAoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2RfZGlyb3BhcmdzICphcmdwLAorCQkJCQkgc3RydWN0IG5mc2RfZGlyb3ByZXMgICpyZXNwKQoreworCWludAluZnNlcnI7CisKKwlkcHJpbnRrKCJuZnNkOiBMT09LVVAgICAlcyAlLipzXG4iLAorCQlTVkNGSF9mbXQoJmFyZ3AtPmZoKSwgYXJncC0+bGVuLCBhcmdwLT5uYW1lKTsKKworCWZoX2luaXQoJnJlc3AtPmZoLCBORlNfRkhTSVpFKTsKKwluZnNlcnIgPSBuZnNkX2xvb2t1cChycXN0cCwgJmFyZ3AtPmZoLCBhcmdwLT5uYW1lLCBhcmdwLT5sZW4sCisJCQkJICZyZXNwLT5maCk7CisKKwlmaF9wdXQoJmFyZ3AtPmZoKTsKKwlyZXR1cm4gbmZzZXJyOworfQorCisvKgorICogUmVhZCBhIHN5bWxpbmsuCisgKi8KK3N0YXRpYyBpbnQKK25mc2RfcHJvY19yZWFkbGluayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZF9yZWFkbGlua2FyZ3MgKmFyZ3AsCisJCQkJCSAgIHN0cnVjdCBuZnNkX3JlYWRsaW5rcmVzICpyZXNwKQoreworCWludAluZnNlcnI7CisKKwlkcHJpbnRrKCJuZnNkOiBSRUFETElOSyAlc1xuIiwgU1ZDRkhfZm10KCZhcmdwLT5maCkpOworCisJLyogUmVhZCB0aGUgc3ltbGluay4gKi8KKwlyZXNwLT5sZW4gPSBORlNfTUFYUEFUSExFTjsKKwluZnNlcnIgPSBuZnNkX3JlYWRsaW5rKHJxc3RwLCAmYXJncC0+ZmgsIGFyZ3AtPmJ1ZmZlciwgJnJlc3AtPmxlbik7CisKKwlmaF9wdXQoJmFyZ3AtPmZoKTsKKwlyZXR1cm4gbmZzZXJyOworfQorCisvKgorICogUmVhZCBhIHBvcnRpb24gb2YgYSBmaWxlLgorICogTi5CLiBBZnRlciB0aGlzIGNhbGwgcmVzcC0+ZmggbmVlZHMgYW4gZmhfcHV0CisgKi8KK3N0YXRpYyBpbnQKK25mc2RfcHJvY19yZWFkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkX3JlYWRhcmdzICphcmdwLAorCQkJCSAgICAgICBzdHJ1Y3QgbmZzZF9yZWFkcmVzICAqcmVzcCkKK3sKKwlpbnQJbmZzZXJyOworCisJZHByaW50aygibmZzZDogUkVBRCAgICAlcyAlZCBieXRlcyBhdCAlZFxuIiwKKwkJU1ZDRkhfZm10KCZhcmdwLT5maCksCisJCWFyZ3AtPmNvdW50LCBhcmdwLT5vZmZzZXQpOworCisJLyogT2J0YWluIGJ1ZmZlciBwb2ludGVyIGZvciBwYXlsb2FkLiAxOSBpcyAxIHdvcmQgZm9yCisJICogc3RhdHVzLCAxNyB3b3JkcyBmb3IgZmF0dHIsIGFuZCAxIHdvcmQgZm9yIHRoZSBieXRlIGNvdW50LgorCSAqLworCisJaWYgKE5GU1NWQ19NQVhCTEtTSVpFIDwgYXJncC0+Y291bnQpIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFCisJCQkib3ZlcnNpemVkIHJlYWQgcmVxdWVzdCBmcm9tICV1LiV1LiV1LiV1OiVkICglZCBieXRlcylcbiIsCisJCQkJTklQUVVBRChycXN0cC0+cnFfYWRkci5zaW5fYWRkci5zX2FkZHIpLAorCQkJCW50b2hzKHJxc3RwLT5ycV9hZGRyLnNpbl9wb3J0KSwKKwkJCQlhcmdwLT5jb3VudCk7CisJCWFyZ3AtPmNvdW50ID0gTkZTU1ZDX01BWEJMS1NJWkU7CisJfQorCXN2Y19yZXNlcnZlKHJxc3RwLCAoMTk8PDIpICsgYXJncC0+Y291bnQgKyA0KTsKKworCXJlc3AtPmNvdW50ID0gYXJncC0+Y291bnQ7CisJbmZzZXJyID0gbmZzZF9yZWFkKHJxc3RwLCBmaF9jb3B5KCZyZXNwLT5maCwgJmFyZ3AtPmZoKSwgTlVMTCwKKwkJCQkgIGFyZ3AtPm9mZnNldCwKKwkJCSAgIAkgIGFyZ3AtPnZlYywgYXJncC0+dmxlbiwKKwkJCQkgICZyZXNwLT5jb3VudCk7CisKKwlyZXR1cm4gbmZzZXJyOworfQorCisvKgorICogV3JpdGUgZGF0YSB0byBhIGZpbGUKKyAqIE4uQi4gQWZ0ZXIgdGhpcyBjYWxsIHJlc3AtPmZoIG5lZWRzIGFuIGZoX3B1dAorICovCitzdGF0aWMgaW50CituZnNkX3Byb2Nfd3JpdGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2Rfd3JpdGVhcmdzICphcmdwLAorCQkJCQlzdHJ1Y3QgbmZzZF9hdHRyc3RhdCAgKnJlc3ApCit7CisJaW50CW5mc2VycjsKKwlpbnQJc3RhYmxlID0gMTsKKworCWRwcmludGsoIm5mc2Q6IFdSSVRFICAgICVzICVkIGJ5dGVzIGF0ICVkXG4iLAorCQlTVkNGSF9mbXQoJmFyZ3AtPmZoKSwKKwkJYXJncC0+bGVuLCBhcmdwLT5vZmZzZXQpOworCisJbmZzZXJyID0gbmZzZF93cml0ZShycXN0cCwgZmhfY29weSgmcmVzcC0+ZmgsICZhcmdwLT5maCksIE5VTEwsCisJCQkJICAgYXJncC0+b2Zmc2V0LAorCQkJCSAgIGFyZ3AtPnZlYywgYXJncC0+dmxlbiwKKwkJCQkgICBhcmdwLT5sZW4sCisJCQkJICAgJnN0YWJsZSk7CisJcmV0dXJuIG5mc2VycjsKK30KKworLyoKKyAqIENSRUFURSBwcm9jZXNzaW5nIGlzIGNvbXBsaWNhdGVkLiBUaGUga2V5d29yZCBoZXJlIGlzIGBvdmVybG9hZGVkLicKKyAqIFRoZSBwYXJlbnQgZGlyZWN0b3J5IGlzIGtlcHQgbG9ja2VkIGJldHdlZW4gdGhlIGNoZWNrIGZvciBleGlzdGVuY2UKKyAqIGFuZCB0aGUgYWN0dWFsIGNyZWF0ZSgpIGNhbGwgaW4gY29tcGxpYW5jZSB3aXRoIFZGUyBwcm90b2NvbHMuCisgKiBOLkIuIEFmdGVyIHRoaXMgY2FsbCBfYm90aF8gYXJncC0+ZmggYW5kIHJlc3AtPmZoIG5lZWQgYW4gZmhfcHV0CisgKi8KK3N0YXRpYyBpbnQKK25mc2RfcHJvY19jcmVhdGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2RfY3JlYXRlYXJncyAqYXJncCwKKwkJCQkJIHN0cnVjdCBuZnNkX2Rpcm9wcmVzICAgKnJlc3ApCit7CisJc3ZjX2ZoCQkqZGlyZmhwID0gJmFyZ3AtPmZoOworCXN2Y19maAkJKm5ld2ZocCA9ICZyZXNwLT5maDsKKwlzdHJ1Y3QgaWF0dHIJKmF0dHIgPSAmYXJncC0+YXR0cnM7CisJc3RydWN0IGlub2RlCSppbm9kZTsKKwlzdHJ1Y3QgZGVudHJ5CSpkY2hpbGQ7CisJaW50CQluZnNlcnIsIHR5cGUsIG1vZGU7CisJZGV2X3QJCXJkZXYgPSAwLCB3YW50ZWQgPSBuZXdfZGVjb2RlX2RldihhdHRyLT5pYV9zaXplKTsKKworCWRwcmludGsoIm5mc2Q6IENSRUFURSAgICVzICUuKnNcbiIsCisJCVNWQ0ZIX2ZtdChkaXJmaHApLCBhcmdwLT5sZW4sIGFyZ3AtPm5hbWUpOworCisJLyogRmlyc3QgdmVyaWZ5IHRoZSBwYXJlbnQgZmlsZSBoYW5kbGUgKi8KKwluZnNlcnIgPSBmaF92ZXJpZnkocnFzdHAsIGRpcmZocCwgU19JRkRJUiwgTUFZX0VYRUMpOworCWlmIChuZnNlcnIpCisJCWdvdG8gZG9uZTsgLyogbXVzdCBmaF9wdXQgZGlyZmhwIGV2ZW4gb24gZXJyb3IgKi8KKworCS8qIENoZWNrIGZvciBNQVlfV1JJVEUgaW4gbmZzZF9jcmVhdGUgaWYgbmVjZXNzYXJ5ICovCisKKwluZnNlcnIgPSBuZnNlcnJfYWNjZXM7CisJaWYgKCFhcmdwLT5sZW4pCisJCWdvdG8gZG9uZTsKKwluZnNlcnIgPSBuZnNlcnJfZXhpc3Q7CisJaWYgKGlzZG90ZW50KGFyZ3AtPm5hbWUsIGFyZ3AtPmxlbikpCisJCWdvdG8gZG9uZTsKKwlmaF9sb2NrKGRpcmZocCk7CisJZGNoaWxkID0gbG9va3VwX29uZV9sZW4oYXJncC0+bmFtZSwgZGlyZmhwLT5maF9kZW50cnksIGFyZ3AtPmxlbik7CisJaWYgKElTX0VSUihkY2hpbGQpKSB7CisJCW5mc2VyciA9IG5mc2Vycm5vKFBUUl9FUlIoZGNoaWxkKSk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisJZmhfaW5pdChuZXdmaHAsIE5GU19GSFNJWkUpOworCW5mc2VyciA9IGZoX2NvbXBvc2UobmV3ZmhwLCBkaXJmaHAtPmZoX2V4cG9ydCwgZGNoaWxkLCBkaXJmaHApOworCWlmICghbmZzZXJyICYmICFkY2hpbGQtPmRfaW5vZGUpCisJCW5mc2VyciA9IG5mc2Vycl9ub2VudDsKKwlkcHV0KGRjaGlsZCk7CisJaWYgKG5mc2VycikgeworCQlpZiAobmZzZXJyICE9IG5mc2Vycl9ub2VudCkKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJLyoKKwkJICogSWYgdGhlIG5ldyBmaWxlIGhhbmRsZSB3YXNuJ3QgdmVyaWZpZWQsIHdlIGNhbid0IHRlbGwKKwkJICogd2hldGhlciB0aGUgZmlsZSBleGlzdHMgb3Igbm90LiBUaW1lIHRvIGJhaWwgLi4uCisJCSAqLworCQluZnNlcnIgPSBuZnNlcnJfYWNjZXM7CisJCWlmICghbmV3ZmhwLT5maF9kZW50cnkpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgCisJCQkJIm5mc2RfcHJvY19jcmVhdGU6IGZpbGUgaGFuZGxlIG5vdCB2ZXJpZmllZFxuIik7CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKwl9CisKKwlpbm9kZSA9IG5ld2ZocC0+ZmhfZGVudHJ5LT5kX2lub2RlOworCisJLyogVW5mdWRnZSB0aGUgbW9kZSBiaXRzICovCisJaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9NT0RFKSB7CisJCXR5cGUgPSBhdHRyLT5pYV9tb2RlICYgU19JRk1UOworCQltb2RlID0gYXR0ci0+aWFfbW9kZSAmIH5TX0lGTVQ7CisJCWlmICghdHlwZSkgeworCQkJLyogbm8gdHlwZSwgc28gaWYgdGFyZ2V0IGV4aXN0cywgYXNzdW1lIHNhbWUgYXMgdGhhdCwKKwkJCSAqIGVsc2UgYXNzdW1lIGEgZmlsZSAqLworCQkJaWYgKGlub2RlKSB7CisJCQkJdHlwZSA9IGlub2RlLT5pX21vZGUgJiBTX0lGTVQ7CisJCQkJc3dpdGNoKHR5cGUpIHsKKwkJCQljYXNlIFNfSUZDSFI6CisJCQkJY2FzZSBTX0lGQkxLOgorCQkJCQkvKiByZXNlcnZlIHJkZXYgZm9yIGxhdGVyIGNoZWNraW5nICovCisJCQkJCXJkZXYgPSBpbm9kZS0+aV9yZGV2OworCQkJCQlhdHRyLT5pYV92YWxpZCB8PSBBVFRSX1NJWkU7CisKKwkJCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJCQljYXNlIFNfSUZJRk86CisJCQkJCS8qIHRoaXMgaXMgcHJvYmFibHkgYSBwZXJtaXNzaW9uIGNoZWNrLi4KKwkJCQkJICogYXQgbGVhc3QgSVJJWCBpbXBsZW1lbnRzIHBlcm0gY2hlY2tpbmcgb24KKwkJCQkJICogICBlY2hvIHRoaW5nID4gZGV2aWNlLXNwZWNpYWwtZmlsZS1vci1waXBlCisJCQkJCSAqIGJ5IGRvaW5nIGEgQ1JFQVRFIHdpdGggdHlwZT09MAorCQkJCQkgKi8KKwkJCQkJbmZzZXJyID0gbmZzZF9wZXJtaXNzaW9uKG5ld2ZocC0+ZmhfZXhwb3J0LAorCQkJCQkJCQkgbmV3ZmhwLT5maF9kZW50cnksCisJCQkJCQkJCSBNQVlfV1JJVEV8TUFZX0xPQ0FMX0FDQ0VTUyk7CisJCQkJCWlmIChuZnNlcnIgJiYgbmZzZXJyICE9IG5mc2Vycl9yb2ZzKQorCQkJCQkJZ290byBvdXRfdW5sb2NrOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCXR5cGUgPSBTX0lGUkVHOworCQl9CisJfSBlbHNlIGlmIChpbm9kZSkgeworCQl0eXBlID0gaW5vZGUtPmlfbW9kZSAmIFNfSUZNVDsKKwkJbW9kZSA9IGlub2RlLT5pX21vZGUgJiB+U19JRk1UOworCX0gZWxzZSB7CisJCXR5cGUgPSBTX0lGUkVHOworCQltb2RlID0gMDsJLyogPz8/ICovCisJfQorCisJYXR0ci0+aWFfdmFsaWQgfD0gQVRUUl9NT0RFOworCWF0dHItPmlhX21vZGUgPSBtb2RlOworCisJLyogU3BlY2lhbCB0cmVhdG1lbnQgZm9yIG5vbi1yZWd1bGFyIGZpbGVzIGFjY29yZGluZyB0byB0aGUKKwkgKiBnb3NwZWwgb2Ygc3VuIG1pY3JvCisJICovCisJaWYgKHR5cGUgIT0gU19JRlJFRykgeworCQlpbnQJaXNfYm9yYyA9IDA7CisJCWlmICh0eXBlICE9IFNfSUZCTEsgJiYgdHlwZSAhPSBTX0lGQ0hSKSB7CisJCQlyZGV2ID0gMDsKKwkJfSBlbHNlIGlmICh0eXBlID09IFNfSUZDSFIgJiYgIShhdHRyLT5pYV92YWxpZCAmIEFUVFJfU0laRSkpIHsKKwkJCS8qIElmIHlvdSB0aGluayB5b3UndmUgc2VlbiB0aGUgd29yc3QsIGdyb2sgdGhpcy4gKi8KKwkJCXR5cGUgPSBTX0lGSUZPOworCQl9IGVsc2UgeworCQkJLyogT2theSwgY2hhciBvciBibG9jayBzcGVjaWFsICovCisJCQlpc19ib3JjID0gMTsKKwkJCWlmICghcmRldikKKwkJCQlyZGV2ID0gd2FudGVkOworCQl9CisKKwkJLyogd2UndmUgdXNlZCB0aGUgU0laRSBpbmZvcm1hdGlvbiwgc28gZGlzY2FyZCBpdCAqLworCQlhdHRyLT5pYV92YWxpZCAmPSB+QVRUUl9TSVpFOworCisJCS8qIE1ha2Ugc3VyZSB0aGUgdHlwZSBhbmQgZGV2aWNlIG1hdGNoZXMgKi8KKwkJbmZzZXJyID0gbmZzZXJyX2V4aXN0OworCQlpZiAoaW5vZGUgJiYgdHlwZSAhPSAoaW5vZGUtPmlfbW9kZSAmIFNfSUZNVCkpCisJCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJbmZzZXJyID0gMDsKKwlpZiAoIWlub2RlKSB7CisJCS8qIEZpbGUgZG9lc24ndCBleGlzdC4gQ3JlYXRlIGl0IGFuZCBzZXQgYXR0cnMgKi8KKwkJbmZzZXJyID0gbmZzZF9jcmVhdGUocnFzdHAsIGRpcmZocCwgYXJncC0+bmFtZSwgYXJncC0+bGVuLAorCQkJCQlhdHRyLCB0eXBlLCByZGV2LCBuZXdmaHApOworCX0gZWxzZSBpZiAodHlwZSA9PSBTX0lGUkVHKSB7CisJCWRwcmludGsoIm5mc2Q6ICAgZXhpc3RpbmcgJXMsIHZhbGlkPSV4LCBzaXplPSVsZFxuIiwKKwkJCWFyZ3AtPm5hbWUsIGF0dHItPmlhX3ZhbGlkLCAobG9uZykgYXR0ci0+aWFfc2l6ZSk7CisJCS8qIEZpbGUgYWxyZWFkeSBleGlzdHMuIFdlIGlnbm9yZSBhbGwgYXR0cmlidXRlcyBleGNlcHQKKwkJICogc2l6ZSwgc28gdGhhdCBjcmVhdCgpIGJlaGF2ZXMgZXhhY3RseSBsaWtlCisJCSAqIG9wZW4oLi4uLCBPX0NSRUFUfE9fVFJVTkN8T19XUk9OTFkpLgorCQkgKi8KKwkJYXR0ci0+aWFfdmFsaWQgJj0gQVRUUl9TSVpFOworCQlpZiAoYXR0ci0+aWFfdmFsaWQpCisJCQluZnNlcnIgPSBuZnNkX3NldGF0dHIocnFzdHAsIG5ld2ZocCwgYXR0ciwgMCwgKHRpbWVfdCkwKTsKKwl9CisKK291dF91bmxvY2s6CisJLyogV2UgZG9uJ3QgcmVhbGx5IG5lZWQgdG8gdW5sb2NrLCBhcyBmaF9wdXQgZG9lcyBpdC4gKi8KKwlmaF91bmxvY2soZGlyZmhwKTsKKworZG9uZToKKwlmaF9wdXQoZGlyZmhwKTsKKwlyZXR1cm4gbmZzZXJyOworfQorCitzdGF0aWMgaW50CituZnNkX3Byb2NfcmVtb3ZlKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkX2Rpcm9wYXJncyAqYXJncCwKKwkJCQkJIHZvaWQJCSAgICAgICAqcmVzcCkKK3sKKwlpbnQJbmZzZXJyOworCisJZHByaW50aygibmZzZDogUkVNT1ZFICAgJXMgJS4qc1xuIiwgU1ZDRkhfZm10KCZhcmdwLT5maCksCisJCWFyZ3AtPmxlbiwgYXJncC0+bmFtZSk7CisKKwkvKiBVbmxpbmsuIC1TSUZESVIgbWVhbnMgZmlsZSBtdXN0IG5vdCBiZSBhIGRpcmVjdG9yeSAqLworCW5mc2VyciA9IG5mc2RfdW5saW5rKHJxc3RwLCAmYXJncC0+ZmgsIC1TX0lGRElSLCBhcmdwLT5uYW1lLCBhcmdwLT5sZW4pOworCWZoX3B1dCgmYXJncC0+ZmgpOworCXJldHVybiBuZnNlcnI7Cit9CisKK3N0YXRpYyBpbnQKK25mc2RfcHJvY19yZW5hbWUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2RfcmVuYW1lYXJncyAqYXJncCwKKwkJCQkgIAkgdm9pZAkJICAgICAgICAqcmVzcCkKK3sKKwlpbnQJbmZzZXJyOworCisJZHByaW50aygibmZzZDogUkVOQU1FICAgJXMgJS4qcyAtPiBcbiIsCisJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmZoKSwgYXJncC0+ZmxlbiwgYXJncC0+Zm5hbWUpOworCWRwcmludGsoIm5mc2Q6ICAgICAgICAtPiAgJXMgJS4qc1xuIiwKKwkJU1ZDRkhfZm10KCZhcmdwLT50ZmgpLCBhcmdwLT50bGVuLCBhcmdwLT50bmFtZSk7CisKKwluZnNlcnIgPSBuZnNkX3JlbmFtZShycXN0cCwgJmFyZ3AtPmZmaCwgYXJncC0+Zm5hbWUsIGFyZ3AtPmZsZW4sCisJCQkJICAgICZhcmdwLT50ZmgsIGFyZ3AtPnRuYW1lLCBhcmdwLT50bGVuKTsKKwlmaF9wdXQoJmFyZ3AtPmZmaCk7CisJZmhfcHV0KCZhcmdwLT50ZmgpOworCXJldHVybiBuZnNlcnI7Cit9CisKK3N0YXRpYyBpbnQKK25mc2RfcHJvY19saW5rKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkX2xpbmthcmdzICphcmdwLAorCQkJCXZvaWQJCQkgICAgKnJlc3ApCit7CisJaW50CW5mc2VycjsKKworCWRwcmludGsoIm5mc2Q6IExJTksgICAgICVzIC0+XG4iLAorCQlTVkNGSF9mbXQoJmFyZ3AtPmZmaCkpOworCWRwcmludGsoIm5mc2Q6ICAgICVzICUuKnNcbiIsCisJCVNWQ0ZIX2ZtdCgmYXJncC0+dGZoKSwKKwkJYXJncC0+dGxlbiwKKwkJYXJncC0+dG5hbWUpOworCisJbmZzZXJyID0gbmZzZF9saW5rKHJxc3RwLCAmYXJncC0+dGZoLCBhcmdwLT50bmFtZSwgYXJncC0+dGxlbiwKKwkJCQkgICZhcmdwLT5mZmgpOworCWZoX3B1dCgmYXJncC0+ZmZoKTsKKwlmaF9wdXQoJmFyZ3AtPnRmaCk7CisJcmV0dXJuIG5mc2VycjsKK30KKworc3RhdGljIGludAorbmZzZF9wcm9jX3N5bWxpbmsoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IG5mc2Rfc3ltbGlua2FyZ3MgKmFyZ3AsCisJCQkJICAgICAgICAgIHZvaWQJCQkgICpyZXNwKQoreworCXN0cnVjdCBzdmNfZmgJbmV3Zmg7CisJaW50CQluZnNlcnI7CisKKwlkcHJpbnRrKCJuZnNkOiBTWU1MSU5LICAlcyAlLipzIC0+ICUuKnNcbiIsCisJCVNWQ0ZIX2ZtdCgmYXJncC0+ZmZoKSwgYXJncC0+ZmxlbiwgYXJncC0+Zm5hbWUsCisJCWFyZ3AtPnRsZW4sIGFyZ3AtPnRuYW1lKTsKKworCWZoX2luaXQoJm5ld2ZoLCBORlNfRkhTSVpFKTsKKwkvKgorCSAqIENyZWF0ZSB0aGUgbGluaywgbG9vayB1cCBuZXcgZmlsZSBhbmQgc2V0IGF0dHJzLgorCSAqLworCW5mc2VyciA9IG5mc2Rfc3ltbGluayhycXN0cCwgJmFyZ3AtPmZmaCwgYXJncC0+Zm5hbWUsIGFyZ3AtPmZsZW4sCisJCQkJCQkgYXJncC0+dG5hbWUsIGFyZ3AtPnRsZW4sCisJCQkJIAkJICZuZXdmaCwgJmFyZ3AtPmF0dHJzKTsKKworCisJZmhfcHV0KCZhcmdwLT5mZmgpOworCWZoX3B1dCgmbmV3ZmgpOworCXJldHVybiBuZnNlcnI7Cit9CisKKy8qCisgKiBNYWtlIGRpcmVjdG9yeS4gVGhpcyBvcGVyYXRpb24gaXMgbm90IGlkZW1wb3RlbnQuCisgKiBOLkIuIEFmdGVyIHRoaXMgY2FsbCByZXNwLT5maCBuZWVkcyBhbiBmaF9wdXQKKyAqLworc3RhdGljIGludAorbmZzZF9wcm9jX21rZGlyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkX2NyZWF0ZWFyZ3MgKmFyZ3AsCisJCQkJCXN0cnVjdCBuZnNkX2Rpcm9wcmVzICAgKnJlc3ApCit7CisJaW50CW5mc2VycjsKKworCWRwcmludGsoIm5mc2Q6IE1LRElSICAgICVzICUuKnNcbiIsIFNWQ0ZIX2ZtdCgmYXJncC0+ZmgpLCBhcmdwLT5sZW4sIGFyZ3AtPm5hbWUpOworCisJaWYgKHJlc3AtPmZoLmZoX2RlbnRyeSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkibmZzZF9wcm9jX21rZGlyOiByZXNwb25zZSBhbHJlYWR5IHZlcmlmaWVkPz9cbiIpOworCX0KKworCWFyZ3AtPmF0dHJzLmlhX3ZhbGlkICY9IH5BVFRSX1NJWkU7CisJZmhfaW5pdCgmcmVzcC0+ZmgsIE5GU19GSFNJWkUpOworCW5mc2VyciA9IG5mc2RfY3JlYXRlKHJxc3RwLCAmYXJncC0+ZmgsIGFyZ3AtPm5hbWUsIGFyZ3AtPmxlbiwKKwkJCQkgICAgJmFyZ3AtPmF0dHJzLCBTX0lGRElSLCAwLCAmcmVzcC0+ZmgpOworCWZoX3B1dCgmYXJncC0+ZmgpOworCXJldHVybiBuZnNlcnI7Cit9CisKKy8qCisgKiBSZW1vdmUgYSBkaXJlY3RvcnkKKyAqLworc3RhdGljIGludAorbmZzZF9wcm9jX3JtZGlyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBuZnNkX2Rpcm9wYXJncyAqYXJncCwKKwkJCQkgCXZvaWQJCSAgICAgICpyZXNwKQoreworCWludAluZnNlcnI7CisKKwlkcHJpbnRrKCJuZnNkOiBSTURJUiAgICAlcyAlLipzXG4iLCBTVkNGSF9mbXQoJmFyZ3AtPmZoKSwgYXJncC0+bGVuLCBhcmdwLT5uYW1lKTsKKworCW5mc2VyciA9IG5mc2RfdW5saW5rKHJxc3RwLCAmYXJncC0+ZmgsIFNfSUZESVIsIGFyZ3AtPm5hbWUsIGFyZ3AtPmxlbik7CisJZmhfcHV0KCZhcmdwLT5maCk7CisJcmV0dXJuIG5mc2VycjsKK30KKworLyoKKyAqIFJlYWQgYSBwb3J0aW9uIG9mIGEgZGlyZWN0b3J5LgorICovCitzdGF0aWMgaW50CituZnNkX3Byb2NfcmVhZGRpcihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3QgbmZzZF9yZWFkZGlyYXJncyAqYXJncCwKKwkJCQkJICBzdHJ1Y3QgbmZzZF9yZWFkZGlycmVzICAqcmVzcCkKK3sKKwlpbnQJCW5mc2VyciwgY291bnQ7CisJbG9mZl90CQlvZmZzZXQ7CisKKwlkcHJpbnRrKCJuZnNkOiBSRUFERElSICAlcyAlZCBieXRlcyBhdCAlZFxuIiwKKwkJU1ZDRkhfZm10KCZhcmdwLT5maCksCQkKKwkJYXJncC0+Y291bnQsIGFyZ3AtPmNvb2tpZSk7CisKKwkvKiBTaHJpbmsgdG8gdGhlIGNsaWVudCByZWFkIHNpemUgKi8KKwljb3VudCA9IChhcmdwLT5jb3VudCA+PiAyKSAtIDI7CisKKwkvKiBNYWtlIHN1cmUgd2UndmUgcm9vbSBmb3IgdGhlIE5VTEwgcHRyICYgZW9mIGZsYWcgKi8KKwljb3VudCAtPSAyOworCWlmIChjb3VudCA8IDApCisJCWNvdW50ID0gMDsKKworCXJlc3AtPmJ1ZmZlciA9IGFyZ3AtPmJ1ZmZlcjsKKwlyZXNwLT5vZmZzZXQgPSBOVUxMOworCXJlc3AtPmJ1ZmxlbiA9IGNvdW50OworCXJlc3AtPmNvbW1vbi5lcnIgPSBuZnNfb2s7CisJLyogUmVhZCBkaXJlY3RvcnkgYW5kIGVuY29kZSBlbnRyaWVzIG9uIHRoZSBmbHkgKi8KKwlvZmZzZXQgPSBhcmdwLT5jb29raWU7CisJbmZzZXJyID0gbmZzZF9yZWFkZGlyKHJxc3RwLCAmYXJncC0+ZmgsICZvZmZzZXQsIAorCQkJICAgICAgJnJlc3AtPmNvbW1vbiwgbmZzc3ZjX2VuY29kZV9lbnRyeSk7CisKKwlyZXNwLT5jb3VudCA9IHJlc3AtPmJ1ZmZlciAtIGFyZ3AtPmJ1ZmZlcjsKKwlpZiAocmVzcC0+b2Zmc2V0KQorCQkqcmVzcC0+b2Zmc2V0ID0gaHRvbmwob2Zmc2V0KTsKKworCWZoX3B1dCgmYXJncC0+ZmgpOworCXJldHVybiBuZnNlcnI7Cit9CisKKy8qCisgKiBHZXQgZmlsZSBzeXN0ZW0gaW5mbworICovCitzdGF0aWMgaW50CituZnNkX3Byb2Nfc3RhdGZzKHN0cnVjdCBzdmNfcnFzdCAqIHJxc3RwLCBzdHJ1Y3QgbmZzZF9maGFuZGxlICAgKmFyZ3AsCisJCQkJCSAgc3RydWN0IG5mc2Rfc3RhdGZzcmVzICpyZXNwKQoreworCWludAluZnNlcnI7CisKKwlkcHJpbnRrKCJuZnNkOiBTVEFURlMgICAlc1xuIiwgU1ZDRkhfZm10KCZhcmdwLT5maCkpOworCisJbmZzZXJyID0gbmZzZF9zdGF0ZnMocnFzdHAsICZhcmdwLT5maCwgJnJlc3AtPnN0YXRzKTsKKwlmaF9wdXQoJmFyZ3AtPmZoKTsKKwlyZXR1cm4gbmZzZXJyOworfQorCisvKgorICogTkZTdjIgU2VydmVyIHByb2NlZHVyZXMuCisgKiBPbmx5IHRoZSByZXN1bHRzIG9mIG5vbi1pZGVtcG90ZW50IG9wZXJhdGlvbnMgYXJlIGNhY2hlZC4KKyAqLworI2RlZmluZSBuZnNkX3Byb2Nfbm9uZQkJTlVMTAorI2RlZmluZSBuZnNzdmNfcmVsZWFzZV9ub25lCU5VTEwKK3N0cnVjdCBuZnNkX3ZvaWQgeyBpbnQgZHVtbXk7IH07CisKKyNkZWZpbmUgUFJPQyhuYW1lLCBhcmd0LCByZXN0LCByZWx0LCBjYWNoZSwgcmVzcHNpemUpCVwKKyB7IChzdmNfcHJvY2Z1bmMpIG5mc2RfcHJvY18jI25hbWUsCQlcCisgICAoa3hkcnByb2NfdCkgbmZzc3ZjX2RlY29kZV8jI2FyZ3QsCQlcCisgICAoa3hkcnByb2NfdCkgbmZzc3ZjX2VuY29kZV8jI3Jlc3QsCQlcCisgICAoa3hkcnByb2NfdCkgbmZzc3ZjX3JlbGVhc2VfIyNyZWx0LAkJXAorICAgc2l6ZW9mKHN0cnVjdCBuZnNkXyMjYXJndCksCQkJXAorICAgc2l6ZW9mKHN0cnVjdCBuZnNkXyMjcmVzdCksCQkJXAorICAgMCwJCQkJCQlcCisgICBjYWNoZSwJCQkJCVwKKyAgIHJlc3BzaXplLAkJCQkgICAgICAgCVwKKyB9CisKKyNkZWZpbmUgU1QgMQkJLyogc3RhdHVzICovCisjZGVmaW5lIEZIIDgJCS8qIGZpbGVoYW5kbGUgKi8KKyNkZWZpbmUJQVQgMTgJCS8qIGF0dHJpYnV0ZXMgKi8KKworc3RhdGljIHN0cnVjdCBzdmNfcHJvY2VkdXJlCQluZnNkX3Byb2NlZHVyZXMyWzE4XSA9IHsKKyAgUFJPQyhudWxsLAkgdm9pZCwJCXZvaWQsCQlub25lLAkJUkNfTk9DQUNIRSwgU1QpLAorICBQUk9DKGdldGF0dHIsCSBmaGFuZGxlLAlhdHRyc3RhdCwJZmhhbmRsZSwJUkNfTk9DQUNIRSwgU1QrQVQpLAorICBQUk9DKHNldGF0dHIsICBzYXR0cmFyZ3MsCWF0dHJzdGF0LAlmaGFuZGxlLAlSQ19SRVBMQlVGRiwgU1QrQVQpLAorICBQUk9DKG5vbmUsCSB2b2lkLAkJdm9pZCwJCW5vbmUsCQlSQ19OT0NBQ0hFLCBTVCksCisgIFBST0MobG9va3VwLAkgZGlyb3BhcmdzLAlkaXJvcHJlcywJZmhhbmRsZSwJUkNfTk9DQUNIRSwgU1QrRkgrQVQpLAorICBQUk9DKHJlYWRsaW5rLCByZWFkbGlua2FyZ3MsCXJlYWRsaW5rcmVzLAlub25lLAkJUkNfTk9DQUNIRSwgU1QrMStORlNfTUFYUEFUSExFTi80KSwKKyAgUFJPQyhyZWFkLAkgcmVhZGFyZ3MsCXJlYWRyZXMsCWZoYW5kbGUsCVJDX05PQ0FDSEUsIFNUK0FUKzErTkZTU1ZDX01BWEJMS1NJWkUpLAorICBQUk9DKG5vbmUsCSB2b2lkLAkJdm9pZCwJCW5vbmUsCQlSQ19OT0NBQ0hFLCBTVCksCisgIFBST0Mod3JpdGUsCSB3cml0ZWFyZ3MsCWF0dHJzdGF0LAlmaGFuZGxlLAlSQ19SRVBMQlVGRiwgU1QrQVQpLAorICBQUk9DKGNyZWF0ZSwJIGNyZWF0ZWFyZ3MsCWRpcm9wcmVzLAlmaGFuZGxlLAlSQ19SRVBMQlVGRiwgU1QrRkgrQVQpLAorICBQUk9DKHJlbW92ZSwJIGRpcm9wYXJncywJdm9pZCwJCW5vbmUsCQlSQ19SRVBMU1RBVCwgU1QpLAorICBQUk9DKHJlbmFtZSwJIHJlbmFtZWFyZ3MsCXZvaWQsCQlub25lLAkJUkNfUkVQTFNUQVQsIFNUKSwKKyAgUFJPQyhsaW5rLAkgbGlua2FyZ3MsCXZvaWQsCQlub25lLAkJUkNfUkVQTFNUQVQsIFNUKSwKKyAgUFJPQyhzeW1saW5rLAkgc3ltbGlua2FyZ3MsCXZvaWQsCQlub25lLAkJUkNfUkVQTFNUQVQsIFNUKSwKKyAgUFJPQyhta2RpciwJIGNyZWF0ZWFyZ3MsCWRpcm9wcmVzLAlmaGFuZGxlLAlSQ19SRVBMQlVGRiwgU1QrRkgrQVQpLAorICBQUk9DKHJtZGlyLAkgZGlyb3BhcmdzLAl2b2lkLAkJbm9uZSwJCVJDX1JFUExTVEFULCBTVCksCisgIFBST0MocmVhZGRpciwJIHJlYWRkaXJhcmdzLAlyZWFkZGlycmVzLAlub25lLAkJUkNfTk9DQUNIRSwgMCksCisgIFBST0Moc3RhdGZzLAkgZmhhbmRsZSwJc3RhdGZzcmVzLAlub25lLAkJUkNfTk9DQUNIRSwgU1QrNSksCit9OworCisKK3N0cnVjdCBzdmNfdmVyc2lvbgluZnNkX3ZlcnNpb24yID0geworCQkudnNfdmVycwk9IDIsCisJCS52c19ucHJvYwk9IDE4LAorCQkudnNfcHJvYwk9IG5mc2RfcHJvY2VkdXJlczIsCisJCS52c19kaXNwYXRjaAk9IG5mc2RfZGlzcGF0Y2gsCisJCS52c194ZHJzaXplCT0gTkZTMl9TVkNfWERSU0laRSwKK307CisKKy8qCisgKiBNYXAgZXJybm9zIHRvIE5GUyBlcnJub3MuCisgKi8KK2ludAorbmZzZXJybm8gKGludCBlcnJubykKK3sKKwlzdGF0aWMgc3RydWN0IHsKKwkJaW50CW5mc2VycjsKKwkJaW50CXN5c2VycjsKKwl9IG5mc19lcnJ0YmxbXSA9IHsKKwkJeyBuZnNfb2ssIDAgfSwKKwkJeyBuZnNlcnJfcGVybSwgLUVQRVJNIH0sCisJCXsgbmZzZXJyX25vZW50LCAtRU5PRU5UIH0sCisJCXsgbmZzZXJyX2lvLCAtRUlPIH0sCisJCXsgbmZzZXJyX254aW8sIC1FTlhJTyB9LAorCQl7IG5mc2Vycl9hY2NlcywgLUVBQ0NFUyB9LAorCQl7IG5mc2Vycl9leGlzdCwgLUVFWElTVCB9LAorCQl7IG5mc2Vycl94ZGV2LCAtRVhERVYgfSwKKwkJeyBuZnNlcnJfbWxpbmssIC1FTUxJTksgfSwKKwkJeyBuZnNlcnJfbm9kZXYsIC1FTk9ERVYgfSwKKwkJeyBuZnNlcnJfbm90ZGlyLCAtRU5PVERJUiB9LAorCQl7IG5mc2Vycl9pc2RpciwgLUVJU0RJUiB9LAorCQl7IG5mc2Vycl9pbnZhbCwgLUVJTlZBTCB9LAorCQl7IG5mc2Vycl9mYmlnLCAtRUZCSUcgfSwKKwkJeyBuZnNlcnJfbm9zcGMsIC1FTk9TUEMgfSwKKwkJeyBuZnNlcnJfcm9mcywgLUVST0ZTIH0sCisJCXsgbmZzZXJyX21saW5rLCAtRU1MSU5LIH0sCisJCXsgbmZzZXJyX25hbWV0b29sb25nLCAtRU5BTUVUT09MT05HIH0sCisJCXsgbmZzZXJyX25vdGVtcHR5LCAtRU5PVEVNUFRZIH0sCisjaWZkZWYgRURRVU9UCisJCXsgbmZzZXJyX2RxdW90LCAtRURRVU9UIH0sCisjZW5kaWYKKwkJeyBuZnNlcnJfc3RhbGUsIC1FU1RBTEUgfSwKKwkJeyBuZnNlcnJfanVrZWJveCwgLUVUSU1FRE9VVCB9LAorCQl7IG5mc2Vycl9kcm9waXQsIC1FQUdBSU4gfSwKKwkJeyBuZnNlcnJfZHJvcGl0LCAtRU5PTUVNIH0sCisJCXsgbmZzZXJyX2JhZG5hbWUsIC1FU1JDSCB9LAorCQl7IG5mc2Vycl9pbywgLUVUWFRCU1kgfSwKKwkJeyAtMSwgLUVJTyB9CisJfTsKKwlpbnQJaTsKKworCWZvciAoaSA9IDA7IG5mc19lcnJ0YmxbaV0ubmZzZXJyICE9IC0xOyBpKyspIHsKKwkJaWYgKG5mc19lcnJ0YmxbaV0uc3lzZXJyID09IGVycm5vKQorCQkJcmV0dXJuIG5mc19lcnJ0YmxbaV0ubmZzZXJyOworCX0KKwlwcmludGsgKEtFUk5fSU5GTyAibmZzZDogbm9uLXN0YW5kYXJkIGVycm5vOiAlZFxuIiwgZXJybm8pOworCXJldHVybiBuZnNlcnJfaW87Cit9CisKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzc3ZjLmMgYi9mcy9uZnNkL25mc3N2Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NTUxNjUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnNkL25mc3N2Yy5jCkBAIC0wLDAgKzEsMzg1IEBACisvKgorICogbGludXgvZnMvbmZzZC9uZnNzdmMuYworICoKKyAqIENlbnRyYWwgcHJvY2Vzc2luZyBmb3IgbmZzZC4KKyAqCisgKiBBdXRob3JzOglPbGFmIEtpcmNoIChva2lyQG1vbmFkLnN3Yi5kZSkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbmZzLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KKyNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9mc19zdHJ1Y3QuaD4KKworI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdGF0cy5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9zdmMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3Zjc29jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2QvbmZzZC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2Qvc3RhdHMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnNkL2NhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvbG9ja2QvYmluZC5oPgorCisjZGVmaW5lIE5GU0REQkdfRkFDSUxJVFkJTkZTRERCR19TVkMKKworLyogdGhlc2Ugc2lnbmFscyB3aWxsIGJlIGRlbGl2ZXJlZCB0byBhbiBuZnNkIHRocmVhZCAKKyAqIHdoZW4gaGFuZGxpbmcgYSByZXF1ZXN0CisgKi8KKyNkZWZpbmUgQUxMT1dFRF9TSUdTCShzaWdtYXNrKFNJR0tJTEwpKQorLyogdGhlc2Ugc2lnbmFscyB3aWxsIGJlIGRlbGl2ZXJlZCB0byBhbiBuZnNkIHRocmVhZAorICogd2hlbiBub3QgaGFuZGxpbmcgYSByZXF1ZXN0LiBpLmUuIHdoZW4gd2FpdGluZworICovCisjZGVmaW5lIFNIVVRET1dOX1NJR1MJKHNpZ21hc2soU0lHS0lMTCkgfCBzaWdtYXNrKFNJR0hVUCkgfCBzaWdtYXNrKFNJR0lOVCkgfCBzaWdtYXNrKFNJR1FVSVQpKQorLyogaWYgdGhlIGxhc3QgdGhyZWFkIGRpZXMgd2l0aCBTSUdIVVAsIHRoZW4gdGhlIGV4cG9ydHMgdGFibGUgaXMKKyAqIGxlZnQgdW5jaGFuZ2VkICggbGlrZSAyLjQtezAtOX0gKS4gIEFueSBvdGhlciBzaWduYWwgd2lsbCBjbGVhcgorICogdGhlIGV4cG9ydHMgdGFibGUgKGxpa2UgMi4yKS4KKyAqLworI2RlZmluZQlTSUdfTk9DTEVBTglTSUdIVVAKKworZXh0ZXJuIHN0cnVjdCBzdmNfcHJvZ3JhbQluZnNkX3Byb2dyYW07CitzdGF0aWMgdm9pZAkJCW5mc2Qoc3RydWN0IHN2Y19ycXN0ICpycXN0cCk7CitzdHJ1Y3QgdGltZXZhbAkJCW5mc3N2Y19ib290Oworc3RhdGljIHN0cnVjdCBzdmNfc2VydiAJCSpuZnNkX3NlcnY7CitzdGF0aWMgYXRvbWljX3QJCQluZnNkX2J1c3k7CitzdGF0aWMgdW5zaWduZWQgbG9uZwkJbmZzZF9sYXN0X2NhbGw7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG5mc2RfY2FsbF9sb2NrKTsKKworc3RydWN0IG5mc2RfbGlzdCB7CisJc3RydWN0IGxpc3RfaGVhZCAJbGlzdDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnRhc2s7Cit9Oworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgbmZzZF9saXN0ID0gTElTVF9IRUFEX0lOSVQobmZzZF9saXN0KTsKKworLyoKKyAqIE1heGltdW0gbnVtYmVyIG9mIG5mc2QgcHJvY2Vzc2VzCisgKi8KKyNkZWZpbmUJTkZTRF9NQVhTRVJWUwkJODE5MgorCitpbnQgbmZzZF9ucnRocmVhZHModm9pZCkKK3sKKwlpZiAobmZzZF9zZXJ2ID09IE5VTEwpCisJCXJldHVybiAwOworCWVsc2UKKwkJcmV0dXJuIG5mc2Rfc2Vydi0+c3ZfbnJ0aHJlYWRzOworfQorCitpbnQKK25mc2Rfc3ZjKHVuc2lnbmVkIHNob3J0IHBvcnQsIGludCBucnNlcnZzKQoreworCWludAllcnJvcjsKKwlpbnQJbm9uZV9sZWZ0OwkKKwlzdHJ1Y3QgbGlzdF9oZWFkICp2aWN0aW07CisJCisJbG9ja19rZXJuZWwoKTsKKwlkcHJpbnRrKCJuZnNkOiBjcmVhdGluZyBzZXJ2aWNlXG4iKTsKKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKG5yc2VydnMgPD0gMCkKKwkJbnJzZXJ2cyA9IDA7CisJaWYgKG5yc2VydnMgPiBORlNEX01BWFNFUlZTKQorCQlucnNlcnZzID0gTkZTRF9NQVhTRVJWUzsKKwkKKwkvKiBSZWFkYWhlYWQgcGFyYW0gY2FjaGUgLSB3aWxsIG5vLW9wIGlmIGl0IGFscmVhZHkgZXhpc3RzICovCisJZXJyb3IgPQluZnNkX3JhY2FjaGVfaW5pdCgyKm5yc2VydnMpOworCWlmIChlcnJvcjwwKQorCQlnb3RvIG91dDsKKwllcnJvciA9IG5mczRfc3RhdGVfaW5pdCgpOworCWlmIChlcnJvcjwwKQorCQlnb3RvIG91dDsKKwlpZiAoIW5mc2Rfc2VydikgeworCQlhdG9taWNfc2V0KCZuZnNkX2J1c3ksIDApOworCQllcnJvciA9IC1FTk9NRU07CisJCW5mc2Rfc2VydiA9IHN2Y19jcmVhdGUoJm5mc2RfcHJvZ3JhbSwgTkZTRF9CVUZTSVpFKTsKKwkJaWYgKG5mc2Rfc2VydiA9PSBOVUxMKQorCQkJZ290byBvdXQ7CisJCWVycm9yID0gc3ZjX21ha2Vzb2NrKG5mc2Rfc2VydiwgSVBQUk9UT19VRFAsIHBvcnQpOworCQlpZiAoZXJyb3IgPCAwKQorCQkJZ290byBmYWlsdXJlOworCisjaWZkZWYgQ09ORklHX05GU0RfVENQCisJCWVycm9yID0gc3ZjX21ha2Vzb2NrKG5mc2Rfc2VydiwgSVBQUk9UT19UQ1AsIHBvcnQpOworCQlpZiAoZXJyb3IgPCAwKQorCQkJZ290byBmYWlsdXJlOworI2VuZGlmCisJCWRvX2dldHRpbWVvZmRheSgmbmZzc3ZjX2Jvb3QpOwkJLyogcmVjb3JkIGJvb3QgdGltZSAqLworCX0gZWxzZQorCQluZnNkX3NlcnYtPnN2X25ydGhyZWFkcysrOworCW5yc2VydnMgLT0gKG5mc2Rfc2Vydi0+c3ZfbnJ0aHJlYWRzLTEpOworCXdoaWxlIChucnNlcnZzID4gMCkgeworCQlucnNlcnZzLS07CisJCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisJCWVycm9yID0gc3ZjX2NyZWF0ZV90aHJlYWQobmZzZCwgbmZzZF9zZXJ2KTsKKwkJaWYgKGVycm9yIDwgMCkgeworCQkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisJCQlicmVhazsKKwkJfQorCX0KKwl2aWN0aW0gPSBuZnNkX2xpc3QubmV4dDsKKwl3aGlsZSAobnJzZXJ2cyA8IDAgJiYgdmljdGltICE9ICZuZnNkX2xpc3QpIHsKKwkJc3RydWN0IG5mc2RfbGlzdCAqbmwgPQorCQkJbGlzdF9lbnRyeSh2aWN0aW0sc3RydWN0IG5mc2RfbGlzdCwgbGlzdCk7CisJCXZpY3RpbSA9IHZpY3RpbS0+bmV4dDsKKwkJc2VuZF9zaWcoU0lHX05PQ0xFQU4sIG5sLT50YXNrLCAxKTsKKwkJbnJzZXJ2cysrOworCX0KKyBmYWlsdXJlOgorCW5vbmVfbGVmdCA9IChuZnNkX3NlcnYtPnN2X25ydGhyZWFkcyA9PSAxKTsKKwlzdmNfZGVzdHJveShuZnNkX3NlcnYpOwkJLyogUmVsZWFzZSBzZXJ2ZXIgKi8KKwlpZiAobm9uZV9sZWZ0KSB7CisJCW5mc2Rfc2VydiA9IE5VTEw7CisJCW5mc2RfcmFjYWNoZV9zaHV0ZG93bigpOworCQluZnM0X3N0YXRlX3NodXRkb3duKCk7CisJfQorIG91dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3VwZGF0ZV90aHJlYWRfdXNhZ2UoaW50IGJ1c3lfdGhyZWFkcykKK3sKKwl1bnNpZ25lZCBsb25nIHByZXZfY2FsbDsKKwl1bnNpZ25lZCBsb25nIGRpZmY7CisJaW50IGRlY2lsZTsKKworCXNwaW5fbG9jaygmbmZzZF9jYWxsX2xvY2spOworCXByZXZfY2FsbCA9IG5mc2RfbGFzdF9jYWxsOworCW5mc2RfbGFzdF9jYWxsID0gamlmZmllczsKKwlkZWNpbGUgPSBidXN5X3RocmVhZHMqMTAvbmZzZHN0YXRzLnRoX2NudDsKKwlpZiAoZGVjaWxlPjAgJiYgZGVjaWxlIDw9IDEwKSB7CisJCWRpZmYgPSBuZnNkX2xhc3RfY2FsbCAtIHByZXZfY2FsbDsKKwkJaWYgKCAobmZzZHN0YXRzLnRoX3VzYWdlW2RlY2lsZS0xXSArPSBkaWZmKSA+PSBORlNEX1VTQUdFX1dSQVApCisJCQluZnNkc3RhdHMudGhfdXNhZ2VbZGVjaWxlLTFdIC09IE5GU0RfVVNBR0VfV1JBUDsKKwkJaWYgKGRlY2lsZSA9PSAxMCkKKwkJCW5mc2RzdGF0cy50aF9mdWxsY250Kys7CisJfQorCXNwaW5fdW5sb2NrKCZuZnNkX2NhbGxfbG9jayk7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBORlMgc2VydmVyIGtlcm5lbCB0aHJlYWQKKyAqLworc3RhdGljIHZvaWQKK25mc2Qoc3RydWN0IHN2Y19ycXN0ICpycXN0cCkKK3sKKwlzdHJ1Y3Qgc3ZjX3NlcnYJKnNlcnYgPSBycXN0cC0+cnFfc2VydmVyOworCXN0cnVjdCBmc19zdHJ1Y3QgKmZzcDsKKwlpbnQJCWVycjsKKwlzdHJ1Y3QgbmZzZF9saXN0IG1lOworCXNpZ3NldF90IHNodXRkb3duX21hc2ssIGFsbG93ZWRfbWFzazsKKworCS8qIExvY2sgbW9kdWxlIGFuZCBzZXQgdXAga2VybmVsIHRocmVhZCAqLworCWxvY2tfa2VybmVsKCk7CisJZGFlbW9uaXplKCJuZnNkIik7CisKKwkvKiBBZnRlciBkYWVtb25pemUoKSB0aGlzIGtlcm5lbCB0aHJlYWQgc2hhcmVzIGN1cnJlbnQtPmZzCisJICogd2l0aCB0aGUgaW5pdCBwcm9jZXNzLiBXZSBuZWVkIHRvIGNyZWF0ZSBmaWxlcyB3aXRoIGEKKwkgKiB1bWFzayBvZiAwIGluc3RlYWQgb2YgaW5pdCdzIHVtYXNrLiAqLworCWZzcCA9IGNvcHlfZnNfc3RydWN0KGN1cnJlbnQtPmZzKTsKKwlpZiAoIWZzcCkgeworCQlwcmludGsoIlVuYWJsZSB0byBzdGFydCBuZnNkIHRocmVhZDogb3V0IG9mIG1lbW9yeVxuIik7CisJCWdvdG8gb3V0OworCX0KKwlleGl0X2ZzKGN1cnJlbnQpOworCWN1cnJlbnQtPmZzID0gZnNwOworCWN1cnJlbnQtPmZzLT51bWFzayA9IDA7CisKKwlzaWdpbml0c2V0aW52KCZzaHV0ZG93bl9tYXNrLCBTSFVURE9XTl9TSUdTKTsKKwlzaWdpbml0c2V0aW52KCZhbGxvd2VkX21hc2ssIEFMTE9XRURfU0lHUyk7CisKKwluZnNkc3RhdHMudGhfY250Kys7CisKKwlsb2NrZF91cCgpOwkJCQkvKiBzdGFydCBsb2NrZCAqLworCisJbWUudGFzayA9IGN1cnJlbnQ7CisJbGlzdF9hZGQoJm1lLmxpc3QsICZuZnNkX2xpc3QpOworCisJdW5sb2NrX2tlcm5lbCgpOworCisJLyoKKwkgKiBXZSB3YW50IGxlc3MgdGhyb3R0bGluZyBpbiBiYWxhbmNlX2RpcnR5X3BhZ2VzKCkgc28gdGhhdCBuZnMgdG8KKwkgKiBsb2NhbGhvc3QgZG9lc24ndCBjYXVzZSBuZnNkIHRvIGxvY2sgdXAgZHVlIHRvIGFsbCB0aGUgY2xpZW50J3MKKwkgKiBkaXJ0eSBwYWdlcy4KKwkgKi8KKwljdXJyZW50LT5mbGFncyB8PSBQRl9MRVNTX1RIUk9UVExFOworCisJLyoKKwkgKiBUaGUgbWFpbiByZXF1ZXN0IGxvb3AKKwkgKi8KKwlmb3IgKDs7KSB7CisJCS8qIEJsb2NrIGFsbCBidXQgdGhlIHNodXRkb3duIHNpZ25hbHMgKi8KKwkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZzaHV0ZG93bl9tYXNrLCBOVUxMKTsKKworCQkvKgorCQkgKiBGaW5kIGEgc29ja2V0IHdpdGggZGF0YSBhdmFpbGFibGUgYW5kIGNhbGwgaXRzCisJCSAqIHJlY3Zmcm9tIHJvdXRpbmUuCisJCSAqLworCQl3aGlsZSAoKGVyciA9IHN2Y19yZWN2KHNlcnYsIHJxc3RwLAorCQkJCSAgICAgICA2MCo2MCpIWikpID09IC1FQUdBSU4pCisJCQk7CisJCWlmIChlcnIgPCAwKQorCQkJYnJlYWs7CisJCXVwZGF0ZV90aHJlYWRfdXNhZ2UoYXRvbWljX3JlYWQoJm5mc2RfYnVzeSkpOworCQlhdG9taWNfaW5jKCZuZnNkX2J1c3kpOworCisJCS8qIExvY2sgdGhlIGV4cG9ydCBoYXNoIHRhYmxlcyBmb3IgcmVhZGluZy4gKi8KKwkJZXhwX3JlYWRsb2NrKCk7CisKKwkJLyogUHJvY2VzcyByZXF1ZXN0IHdpdGggc2lnbmFscyBibG9ja2VkLiAgKi8KKwkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZhbGxvd2VkX21hc2ssIE5VTEwpOworCisJCXN2Y19wcm9jZXNzKHNlcnYsIHJxc3RwKTsKKworCQkvKiBVbmxvY2sgZXhwb3J0IGhhc2ggdGFibGVzICovCisJCWV4cF9yZWFkdW5sb2NrKCk7CisJCXVwZGF0ZV90aHJlYWRfdXNhZ2UoYXRvbWljX3JlYWQoJm5mc2RfYnVzeSkpOworCQlhdG9taWNfZGVjKCZuZnNkX2J1c3kpOworCX0KKworCWlmIChlcnIgIT0gLUVJTlRSKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm5mc2Q6IHRlcm1pbmF0aW5nIG9uIGVycm9yICVkXG4iLCAtZXJyKTsKKwl9IGVsc2UgeworCQl1bnNpZ25lZCBpbnQJc2lnbm87CisKKwkJZm9yIChzaWdubyA9IDE7IHNpZ25vIDw9IF9OU0lHOyBzaWdubysrKQorCQkJaWYgKHNpZ2lzbWVtYmVyKCZjdXJyZW50LT5wZW5kaW5nLnNpZ25hbCwgc2lnbm8pICYmCisJCQkgICAgIXNpZ2lzbWVtYmVyKCZjdXJyZW50LT5ibG9ja2VkLCBzaWdubykpCisJCQkJYnJlYWs7CisJCWVyciA9IHNpZ25vOworCX0KKworCWxvY2tfa2VybmVsKCk7CisKKwkvKiBSZWxlYXNlIGxvY2tkICovCisJbG9ja2RfZG93bigpOworCisJLyogQ2hlY2sgaWYgdGhpcyBpcyBsYXN0IHRocmVhZCAqLworCWlmIChzZXJ2LT5zdl9ucnRocmVhZHM9PTEpIHsKKwkJCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm5mc2Q6IGxhc3Qgc2VydmVyIGhhcyBleGl0ZWRcbiIpOworCQlpZiAoZXJyICE9IFNJR19OT0NMRUFOKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJuZnNkOiB1bmV4cG9ydGluZyBhbGwgZmlsZXN5c3RlbXNcbiIpOworCQkJbmZzZF9leHBvcnRfZmx1c2goKTsKKwkJfQorCQluZnNkX3NlcnYgPSBOVUxMOworCSAgICAgICAgbmZzZF9yYWNhY2hlX3NodXRkb3duKCk7CS8qIHJlbGVhc2UgcmVhZC1haGVhZCBjYWNoZSAqLworCQluZnM0X3N0YXRlX3NodXRkb3duKCk7CisJfQorCWxpc3RfZGVsKCZtZS5saXN0KTsKKwluZnNkc3RhdHMudGhfY250IC0tOworCitvdXQ6CisJLyogUmVsZWFzZSB0aGUgdGhyZWFkICovCisJc3ZjX2V4aXRfdGhyZWFkKHJxc3RwKTsKKworCS8qIFJlbGVhc2UgbW9kdWxlICovCisJbW9kdWxlX3B1dF9hbmRfZXhpdCgwKTsKK30KKworaW50CituZnNkX2Rpc3BhdGNoKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqc3RhdHApCit7CisJc3RydWN0IHN2Y19wcm9jZWR1cmUJKnByb2M7CisJa3hkcnByb2NfdAkJeGRyOworCXUzMgkJCW5mc2VycjsKKwl1MzIJCQkqbmZzZXJycDsKKworCWRwcmludGsoIm5mc2RfZGlzcGF0Y2g6IHZlcnMgJWQgcHJvYyAlZFxuIiwKKwkJCQlycXN0cC0+cnFfdmVycywgcnFzdHAtPnJxX3Byb2MpOworCXByb2MgPSBycXN0cC0+cnFfcHJvY2luZm87CisKKwkvKiBDaGVjayB3aGV0aGVyIHdlIGhhdmUgdGhpcyBjYWxsIGluIHRoZSBjYWNoZS4gKi8KKwlzd2l0Y2ggKG5mc2RfY2FjaGVfbG9va3VwKHJxc3RwLCBwcm9jLT5wY19jYWNoZXR5cGUpKSB7CisJY2FzZSBSQ19JTlRSOgorCWNhc2UgUkNfRFJPUElUOgorCQlyZXR1cm4gMDsKKwljYXNlIFJDX1JFUExZOgorCQlyZXR1cm4gMTsKKwljYXNlIFJDX0RPSVQ6OworCQkvKiBkbyBpdCAqLworCX0KKworCS8qIERlY29kZSBhcmd1bWVudHMgKi8KKwl4ZHIgPSBwcm9jLT5wY19kZWNvZGU7CisJaWYgKHhkciAmJiAheGRyKHJxc3RwLCAodTMyKilycXN0cC0+cnFfYXJnLmhlYWRbMF0uaW92X2Jhc2UsCisJCQlycXN0cC0+cnFfYXJncCkpIHsKKwkJZHByaW50aygibmZzZDogZmFpbGVkIHRvIGRlY29kZSBhcmd1bWVudHMhXG4iKTsKKwkJbmZzZF9jYWNoZV91cGRhdGUocnFzdHAsIFJDX05PQ0FDSEUsIE5VTEwpOworCQkqc3RhdHAgPSBycGNfZ2FyYmFnZV9hcmdzOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBuZWVkIHRvIGdyYWIgdGhlIGxvY2F0aW9uIHRvIHN0b3JlIHRoZSBzdGF0dXMsIGFzCisJICogbmZzdjQgZG9lcyBzb21lIGVuY29kaW5nIHdoaWxlIHByb2Nlc3NpbmcgCisJICovCisJbmZzZXJycCA9IHJxc3RwLT5ycV9yZXMuaGVhZFswXS5pb3ZfYmFzZQorCQkrIHJxc3RwLT5ycV9yZXMuaGVhZFswXS5pb3ZfbGVuOworCXJxc3RwLT5ycV9yZXMuaGVhZFswXS5pb3ZfbGVuICs9IHNpemVvZih1MzIpOworCisJLyogTm93IGNhbGwgdGhlIHByb2NlZHVyZSBoYW5kbGVyLCBhbmQgZW5jb2RlIE5GUyBzdGF0dXMuICovCisJbmZzZXJyID0gcHJvYy0+cGNfZnVuYyhycXN0cCwgcnFzdHAtPnJxX2FyZ3AsIHJxc3RwLT5ycV9yZXNwKTsKKwlpZiAobmZzZXJyID09IG5mc2Vycl9qdWtlYm94ICYmIHJxc3RwLT5ycV92ZXJzID09IDIpCisJCW5mc2VyciA9IG5mc2Vycl9kcm9waXQ7CisJaWYgKG5mc2VyciA9PSBuZnNlcnJfZHJvcGl0KSB7CisJCWRwcmludGsoIm5mc2Q6IERyb3BwaW5nIHJlcXVlc3QgZHVlIHRvIG1hbGxvYyBmYWlsdXJlIVxuIik7CisJCW5mc2RfY2FjaGVfdXBkYXRlKHJxc3RwLCBSQ19OT0NBQ0hFLCBOVUxMKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHJxc3RwLT5ycV9wcm9jICE9IDApCisJCSpuZnNlcnJwKysgPSBuZnNlcnI7CisKKwkvKiBFbmNvZGUgcmVzdWx0LgorCSAqIEZvciBORlN2MiwgYWRkaXRpb25hbCBpbmZvIGlzIG5ldmVyIHJldHVybmVkIGluIGNhc2Ugb2YgYW4gZXJyb3IuCisJICovCisJaWYgKCEobmZzZXJyICYmIHJxc3RwLT5ycV92ZXJzID09IDIpKSB7CisJCXhkciA9IHByb2MtPnBjX2VuY29kZTsKKwkJaWYgKHhkciAmJiAheGRyKHJxc3RwLCBuZnNlcnJwLAorCQkJCXJxc3RwLT5ycV9yZXNwKSkgeworCQkJLyogRmFpbGVkIHRvIGVuY29kZSByZXN1bHQuIFJlbGVhc2UgY2FjaGUgZW50cnkgKi8KKwkJCWRwcmludGsoIm5mc2Q6IGZhaWxlZCB0byBlbmNvZGUgcmVzdWx0IVxuIik7CisJCQluZnNkX2NhY2hlX3VwZGF0ZShycXN0cCwgUkNfTk9DQUNIRSwgTlVMTCk7CisJCQkqc3RhdHAgPSBycGNfc3lzdGVtX2VycjsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJLyogU3RvcmUgcmVwbHkgaW4gY2FjaGUuICovCisJbmZzZF9jYWNoZV91cGRhdGUocnFzdHAsIHByb2MtPnBjX2NhY2hldHlwZSwgc3RhdHAgKyAxKTsKKwlyZXR1cm4gMTsKK30KKworZXh0ZXJuIHN0cnVjdCBzdmNfdmVyc2lvbiBuZnNkX3ZlcnNpb24yLCBuZnNkX3ZlcnNpb24zLCBuZnNkX3ZlcnNpb240OworCitzdGF0aWMgc3RydWN0IHN2Y192ZXJzaW9uICoJbmZzZF92ZXJzaW9uW10gPSB7CisJWzJdID0gJm5mc2RfdmVyc2lvbjIsCisjaWYgZGVmaW5lZChDT05GSUdfTkZTRF9WMykKKwlbM10gPSAmbmZzZF92ZXJzaW9uMywKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX05GU0RfVjQpCisJWzRdID0gJm5mc2RfdmVyc2lvbjQsCisjZW5kaWYKK307CisKKyNkZWZpbmUgTkZTRF9OUlZFUlMJCShzaXplb2YobmZzZF92ZXJzaW9uKS9zaXplb2YobmZzZF92ZXJzaW9uWzBdKSkKK3N0cnVjdCBzdmNfcHJvZ3JhbQkJbmZzZF9wcm9ncmFtID0geworCS5wZ19wcm9nCQk9IE5GU19QUk9HUkFNLAkJLyogcHJvZ3JhbSBudW1iZXIgKi8KKwkucGdfbnZlcnMJCT0gTkZTRF9OUlZFUlMsCQkvKiBuciBvZiBlbnRyaWVzIGluIG5mc2RfdmVyc2lvbiAqLworCS5wZ192ZXJzCQk9IG5mc2RfdmVyc2lvbiwJCS8qIHZlcnNpb24gdGFibGUgKi8KKwkucGdfbmFtZQkJPSAibmZzZCIsCQkvKiBwcm9ncmFtIG5hbWUgKi8KKwkucGdfY2xhc3MJCT0gIm5mc2QiLAkJLyogYXV0aGVudGljYXRpb24gY2xhc3MgKi8KKwkucGdfc3RhdHMJCT0gJm5mc2Rfc3Zjc3RhdHMsCS8qIHZlcnNpb24gdGFibGUgKi8KKwkucGdfYXV0aGVudGljYXRlCT0gJnN2Y19zZXRfY2xpZW50LAkvKiBleHBvcnQgYXV0aGVudGljYXRpb24gKi8KKworfTsKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzeGRyLmMgYi9mcy9uZnNkL25mc3hkci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OGIwODIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnNkL25mc3hkci5jCkBAIC0wLDAgKzEsNTExIEBACisvKgorICogbGludXgvZnMvbmZzZC94ZHIuYworICoKKyAqIFhEUiBzdXBwb3J0IGZvciBuZnNkCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnMuaD4KKyNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMveGRyLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N2Yy5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2QvbmZzZC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2QveGRyLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKworI2RlZmluZSBORlNEREJHX0ZBQ0lMSVRZCQlORlNEREJHX1hEUgorCisKKyNpZmRlZiBORlNEX09QVElNSVpFX1NQQUNFCisjIGRlZmluZSBpbmxpbmUKKyNlbmRpZgorCisvKgorICogTWFwcGluZyBvZiBTX0lGKiB0eXBlcyB0byBORlMgZmlsZSB0eXBlcworICovCitzdGF0aWMgdTMyCW5mc19mdHlwZXNbXSA9IHsKKwlORk5PTiwgIE5GQ0hSLCAgTkZDSFIsIE5GQkFELAorCU5GRElSLCAgTkZCQUQsICBORkJMSywgTkZCQUQsCisJTkZSRUcsICBORkJBRCwgIE5GTE5LLCBORkJBRCwKKwlORlNPQ0ssIE5GQkFELCAgTkZMTkssIE5GQkFELAorfTsKKworCisvKgorICogWERSIGZ1bmN0aW9ucyBmb3IgYmFzaWMgTkZTIHR5cGVzCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyICoKK2RlY29kZV9maCh1MzIgKnAsIHN0cnVjdCBzdmNfZmggKmZocCkKK3sKKwlmaF9pbml0KGZocCwgTkZTX0ZIU0laRSk7CisJbWVtY3B5KCZmaHAtPmZoX2hhbmRsZS5maF9iYXNlLCBwLCBORlNfRkhTSVpFKTsKKwlmaHAtPmZoX2hhbmRsZS5maF9zaXplID0gTkZTX0ZIU0laRTsKKworCS8qIEZJWE1FOiBMb29rIHVwIGV4cG9ydCBwb2ludGVyIGhlcmUgYW5kIHZlcmlmeQorCSAqIFN1biBTZWN1cmUgUlBDIGlmIHJlcXVlc3RlZCAqLworCXJldHVybiBwICsgKE5GU19GSFNJWkUgPj4gMik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyICoKK2VuY29kZV9maCh1MzIgKnAsIHN0cnVjdCBzdmNfZmggKmZocCkKK3sKKwltZW1jcHkocCwgJmZocC0+ZmhfaGFuZGxlLmZoX2Jhc2UsIE5GU19GSFNJWkUpOworCXJldHVybiBwICsgKE5GU19GSFNJWkU+PiAyKTsKK30KKworLyoKKyAqIERlY29kZSBhIGZpbGUgbmFtZSBhbmQgbWFrZSBzdXJlIHRoYXQgdGhlIHBhdGggY29udGFpbnMKKyAqIG5vIHNsYXNoZXMgb3IgbnVsbCBieXRlcy4KKyAqLworc3RhdGljIGlubGluZSB1MzIgKgorZGVjb2RlX2ZpbGVuYW1lKHUzMiAqcCwgY2hhciAqKm5hbXAsIGludCAqbGVucCkKK3sKKwljaGFyCQkqbmFtZTsKKwlpbnQJCWk7CisKKwlpZiAoKHAgPSB4ZHJfZGVjb2RlX3N0cmluZ19pbnBsYWNlKHAsIG5hbXAsIGxlbnAsIE5GU19NQVhOQU1MRU4pKSAhPSBOVUxMKSB7CisJCWZvciAoaSA9IDAsIG5hbWUgPSAqbmFtcDsgaSA8ICpsZW5wOyBpKyssIG5hbWUrKykgeworCQkJaWYgKCpuYW1lID09ICdcMCcgfHwgKm5hbWUgPT0gJy8nKQorCQkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyICoKK2RlY29kZV9wYXRobmFtZSh1MzIgKnAsIGNoYXIgKipuYW1wLCBpbnQgKmxlbnApCit7CisJY2hhcgkJKm5hbWU7CisJaW50CQlpOworCisJaWYgKChwID0geGRyX2RlY29kZV9zdHJpbmdfaW5wbGFjZShwLCBuYW1wLCBsZW5wLCBORlNfTUFYUEFUSExFTikpICE9IE5VTEwpIHsKKwkJZm9yIChpID0gMCwgbmFtZSA9ICpuYW1wOyBpIDwgKmxlbnA7IGkrKywgbmFtZSsrKSB7CisJCQlpZiAoKm5hbWUgPT0gJ1wwJykKKwkJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKworCXJldHVybiBwOworfQorCitzdGF0aWMgaW5saW5lIHUzMiAqCitkZWNvZGVfc2F0dHIodTMyICpwLCBzdHJ1Y3QgaWF0dHIgKmlhcCkKK3sKKwl1MzIJdG1wLCB0bXAxOworCisJaWFwLT5pYV92YWxpZCA9IDA7CisKKwkvKiBTdW4gY2xpZW50IGJ1ZyBjb21wYXRpYmlsaXR5IGNoZWNrOiBzb21lIHN1biBjbGllbnRzIHNlZW0gdG8KKwkgKiBwdXQgMHhmZmZmIGluIHRoZSBtb2RlIGZpZWxkIHdoZW4gdGhleSBtZWFuIDB4ZmZmZmZmZmYuCisJICogUXVvdGluZyB0aGUgNC40QlNEIG5mcyBzZXJ2ZXIgY29kZTogTmFoIG5haCBuYWggbmFoIG5hIG5haC4KKwkgKi8KKwlpZiAoKHRtcCA9IG50b2hsKCpwKyspKSAhPSAodTMyKS0xICYmIHRtcCAhPSAweGZmZmYpIHsKKwkJaWFwLT5pYV92YWxpZCB8PSBBVFRSX01PREU7CisJCWlhcC0+aWFfbW9kZSA9IHRtcDsKKwl9CisJaWYgKCh0bXAgPSBudG9obCgqcCsrKSkgIT0gKHUzMiktMSkgeworCQlpYXAtPmlhX3ZhbGlkIHw9IEFUVFJfVUlEOworCQlpYXAtPmlhX3VpZCA9IHRtcDsKKwl9CisJaWYgKCh0bXAgPSBudG9obCgqcCsrKSkgIT0gKHUzMiktMSkgeworCQlpYXAtPmlhX3ZhbGlkIHw9IEFUVFJfR0lEOworCQlpYXAtPmlhX2dpZCA9IHRtcDsKKwl9CisJaWYgKCh0bXAgPSBudG9obCgqcCsrKSkgIT0gKHUzMiktMSkgeworCQlpYXAtPmlhX3ZhbGlkIHw9IEFUVFJfU0laRTsKKwkJaWFwLT5pYV9zaXplID0gdG1wOworCX0KKwl0bXAgID0gbnRvaGwoKnArKyk7IHRtcDEgPSBudG9obCgqcCsrKTsKKwlpZiAodG1wICE9ICh1MzIpLTEgJiYgdG1wMSAhPSAodTMyKS0xKSB7CisJCWlhcC0+aWFfdmFsaWQgfD0gQVRUUl9BVElNRSB8IEFUVFJfQVRJTUVfU0VUOworCQlpYXAtPmlhX2F0aW1lLnR2X3NlYyA9IHRtcDsKKwkJaWFwLT5pYV9hdGltZS50dl9uc2VjID0gdG1wMSAqIDEwMDA7IAorCX0KKwl0bXAgID0gbnRvaGwoKnArKyk7IHRtcDEgPSBudG9obCgqcCsrKTsKKwlpZiAodG1wICE9ICh1MzIpLTEgJiYgdG1wMSAhPSAodTMyKS0xKSB7CisJCWlhcC0+aWFfdmFsaWQgfD0gQVRUUl9NVElNRSB8IEFUVFJfTVRJTUVfU0VUOworCQlpYXAtPmlhX210aW1lLnR2X3NlYyA9IHRtcDsKKwkJaWFwLT5pYV9tdGltZS50dl9uc2VjID0gdG1wMSAqIDEwMDA7IAorCQkvKgorCQkgKiBQYXNzaW5nIHRoZSBpbnZhbGlkIHZhbHVlIHVzZWNvbmRzPTEwMDAwMDAgZm9yIG10aW1lCisJCSAqIGlzIGEgU3VuIGNvbnZlbnRpb24gZm9yICJzZXQgYm90aCBtdGltZSBhbmQgYXRpbWUgdG8KKwkJICogY3VycmVudCBzZXJ2ZXIgdGltZSIuICBJdCdzIG5lZWRlZCB0byBtYWtlIHBlcm1pc3Npb25zCisJCSAqIGNoZWNrcyBmb3IgdGhlICJ0b3VjaCIgcHJvZ3JhbSBhY3Jvc3MgdjIgbW91bnRzIHRvCisJCSAqIFNvbGFyaXMgYW5kIElyaXggYm94ZXMgd29yayBjb3JyZWN0bHkuIFNlZSBkZXNjcmlwdGlvbiBvZgorCQkgKiBzYXR0ciBpbiBzZWN0aW9uIDYuMSBvZiAiTkZTIElsbHVzdHJhdGVkIiBieQorCQkgKiBCcmVudCBDYWxsYWdoYW4sIEFkZGlzb24tV2VzbGV5LCBJU0JOIDAtMjAxLTMyNzUwLTUKKwkJICovCisJCWlmICh0bXAxID09IDEwMDAwMDApCisJCQlpYXAtPmlhX3ZhbGlkICY9IH4oQVRUUl9BVElNRV9TRVR8QVRUUl9NVElNRV9TRVQpOworCX0KKwlyZXR1cm4gcDsKK30KKworc3RhdGljIGlubGluZSB1MzIgKgorZW5jb2RlX2ZhdHRyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgc3RydWN0IHN2Y19maCAqZmhwKQoreworCXN0cnVjdCB2ZnNtb3VudCAqbW50ID0gZmhwLT5maF9leHBvcnQtPmV4X21udDsKKwlzdHJ1Y3QgZGVudHJ5CSpkZW50cnkgPSBmaHAtPmZoX2RlbnRyeTsKKwlzdHJ1Y3Qga3N0YXQgc3RhdDsKKwlpbnQgdHlwZTsKKwlzdHJ1Y3QgdGltZXNwZWMgdGltZTsKKworCXZmc19nZXRhdHRyKG1udCwgZGVudHJ5LCAmc3RhdCk7CisJdHlwZSA9IChzdGF0Lm1vZGUgJiBTX0lGTVQpOworCisJKnArKyA9IGh0b25sKG5mc19mdHlwZXNbdHlwZSA+PiAxMl0pOworCSpwKysgPSBodG9ubCgodTMyKSBzdGF0Lm1vZGUpOworCSpwKysgPSBodG9ubCgodTMyKSBzdGF0Lm5saW5rKTsKKwkqcCsrID0gaHRvbmwoKHUzMikgbmZzZF9ydWlkKHJxc3RwLCBzdGF0LnVpZCkpOworCSpwKysgPSBodG9ubCgodTMyKSBuZnNkX3JnaWQocnFzdHAsIHN0YXQuZ2lkKSk7CisKKwlpZiAoU19JU0xOSyh0eXBlKSAmJiBzdGF0LnNpemUgPiBORlNfTUFYUEFUSExFTikgeworCQkqcCsrID0gaHRvbmwoTkZTX01BWFBBVEhMRU4pOworCX0gZWxzZSB7CisJCSpwKysgPSBodG9ubCgodTMyKSBzdGF0LnNpemUpOworCX0KKwkqcCsrID0gaHRvbmwoKHUzMikgc3RhdC5ibGtzaXplKTsKKwlpZiAoU19JU0NIUih0eXBlKSB8fCBTX0lTQkxLKHR5cGUpKQorCQkqcCsrID0gaHRvbmwobmV3X2VuY29kZV9kZXYoc3RhdC5yZGV2KSk7CisJZWxzZQorCQkqcCsrID0gaHRvbmwoMHhmZmZmZmZmZik7CisJKnArKyA9IGh0b25sKCh1MzIpIHN0YXQuYmxvY2tzKTsKKwlpZiAoaXNfZnNpZChmaHAsIHJxc3RwLT5ycV9yZWZmaCkpCisJCSpwKysgPSBodG9ubCgodTMyKSBmaHAtPmZoX2V4cG9ydC0+ZXhfZnNpZCk7CisJZWxzZQorCQkqcCsrID0gaHRvbmwobmV3X2VuY29kZV9kZXYoc3RhdC5kZXYpKTsKKwkqcCsrID0gaHRvbmwoKHUzMikgc3RhdC5pbm8pOworCSpwKysgPSBodG9ubCgodTMyKSBzdGF0LmF0aW1lLnR2X3NlYyk7CisJKnArKyA9IGh0b25sKHN0YXQuYXRpbWUudHZfbnNlYyA/IHN0YXQuYXRpbWUudHZfbnNlYyAvIDEwMDAgOiAwKTsKKwlsZWFzZV9nZXRfbXRpbWUoZGVudHJ5LT5kX2lub2RlLCAmdGltZSk7IAorCSpwKysgPSBodG9ubCgodTMyKSB0aW1lLnR2X3NlYyk7CisJKnArKyA9IGh0b25sKHRpbWUudHZfbnNlYyA/IHRpbWUudHZfbnNlYyAvIDEwMDAgOiAwKTsgCisJKnArKyA9IGh0b25sKCh1MzIpIHN0YXQuY3RpbWUudHZfc2VjKTsKKwkqcCsrID0gaHRvbmwoc3RhdC5jdGltZS50dl9uc2VjID8gc3RhdC5jdGltZS50dl9uc2VjIC8gMTAwMCA6IDApOworCisJcmV0dXJuIHA7Cit9CisKKworLyoKKyAqIFhEUiBkZWNvZGUgZnVuY3Rpb25zCisgKi8KK2ludAorbmZzc3ZjX2RlY29kZV92b2lkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwgdm9pZCAqZHVtbXkpCit7CisJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CituZnNzdmNfZGVjb2RlX2ZoYW5kbGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3QgbmZzZF9maGFuZGxlICphcmdzKQoreworCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZoKSkpCisJCXJldHVybiAwOworCXJldHVybiB4ZHJfYXJnc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKK2ludAorbmZzc3ZjX2RlY29kZV9zYXR0cmFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZF9zYXR0cmFyZ3MgKmFyZ3MpCit7CisJaWYgKCEocCA9IGRlY29kZV9maChwLCAmYXJncy0+ZmgpKQorCSB8fCAhKHAgPSBkZWNvZGVfc2F0dHIocCwgJmFyZ3MtPmF0dHJzKSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CituZnNzdmNfZGVjb2RlX2Rpcm9wYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCisJCQkJCXN0cnVjdCBuZnNkX2Rpcm9wYXJncyAqYXJncykKK3sKKwlpZiAoIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT5maCkpCisJIHx8ICEocCA9IGRlY29kZV9maWxlbmFtZShwLCAmYXJncy0+bmFtZSwgJmFyZ3MtPmxlbikpKQorCQlyZXR1cm4gMDsKKworCSByZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitpbnQKK25mc3N2Y19kZWNvZGVfcmVhZGFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZF9yZWFkYXJncyAqYXJncykKK3sKKwl1bnNpZ25lZCBpbnQgbGVuOworCWludCB2LHBuOworCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZoKSkpCisJCXJldHVybiAwOworCisJYXJncy0+b2Zmc2V0ICAgID0gbnRvaGwoKnArKyk7CisJbGVuID0gYXJncy0+Y291bnQgICAgID0gbnRvaGwoKnArKyk7CisJcCsrOyAvKiB0b3RhbGNvdW50IC0gdW51c2VkICovCisKKwlpZiAobGVuID4gTkZTU1ZDX01BWEJMS1NJWkUpCisJCWxlbiA9IE5GU1NWQ19NQVhCTEtTSVpFOworCisJLyogc2V0IHVwIHNvbWV3aGVyZSB0byBzdG9yZSByZXNwb25zZS4KKwkgKiBXZSB0YWtlIHBhZ2VzLCBwdXQgdGhlbSBvbiByZXNsaXN0IGFuZCBpbmNsdWRlIGluIGlvdmVjCisJICovCisJdj0wOworCXdoaWxlIChsZW4gPiAwKSB7CisJCXBuPXJxc3RwLT5ycV9yZXN1c2VkOworCQlzdmNfdGFrZV9wYWdlKHJxc3RwKTsKKwkJYXJncy0+dmVjW3ZdLmlvdl9iYXNlID0gcGFnZV9hZGRyZXNzKHJxc3RwLT5ycV9yZXNwYWdlc1twbl0pOworCQlhcmdzLT52ZWNbdl0uaW92X2xlbiA9IGxlbiA8IFBBR0VfU0laRT9sZW46UEFHRV9TSVpFOworCQlsZW4gLT0gYXJncy0+dmVjW3ZdLmlvdl9sZW47CisJCXYrKzsKKwl9CisJYXJncy0+dmxlbiA9IHY7CisJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CituZnNzdmNfZGVjb2RlX3dyaXRlYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCisJCQkJCXN0cnVjdCBuZnNkX3dyaXRlYXJncyAqYXJncykKK3sKKwl1bnNpZ25lZCBpbnQgbGVuOworCWludCB2OworCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZoKSkpCisJCXJldHVybiAwOworCisJcCsrOwkJCQkvKiBiZWdpbm9mZnNldCAqLworCWFyZ3MtPm9mZnNldCA9IG50b2hsKCpwKyspOwkvKiBvZmZzZXQgKi8KKwlwKys7CQkJCS8qIHRvdGFsY291bnQgKi8KKwlsZW4gPSBhcmdzLT5sZW4gPSBudG9obCgqcCsrKTsKKwlhcmdzLT52ZWNbMF0uaW92X2Jhc2UgPSAodm9pZCopcDsKKwlhcmdzLT52ZWNbMF0uaW92X2xlbiA9IHJxc3RwLT5ycV9hcmcuaGVhZFswXS5pb3ZfbGVuIC0KKwkJCQkoKCh2b2lkKilwKSAtIHJxc3RwLT5ycV9hcmcuaGVhZFswXS5pb3ZfYmFzZSk7CisJaWYgKGxlbiA+IE5GU1NWQ19NQVhCTEtTSVpFKQorCQlsZW4gPSBORlNTVkNfTUFYQkxLU0laRTsKKwl2ID0gMDsKKwl3aGlsZSAobGVuID4gYXJncy0+dmVjW3ZdLmlvdl9sZW4pIHsKKwkJbGVuIC09IGFyZ3MtPnZlY1t2XS5pb3ZfbGVuOworCQl2Kys7CisJCWFyZ3MtPnZlY1t2XS5pb3ZfYmFzZSA9IHBhZ2VfYWRkcmVzcyhycXN0cC0+cnFfYXJncGFnZXNbdl0pOworCQlhcmdzLT52ZWNbdl0uaW92X2xlbiA9IFBBR0VfU0laRTsKKwl9CisJYXJncy0+dmVjW3ZdLmlvdl9sZW4gPSBsZW47CisJYXJncy0+dmxlbiA9IHYrMTsKKwlyZXR1cm4gYXJncy0+dmVjWzBdLmlvdl9sZW4gPiAwOworfQorCitpbnQKK25mc3N2Y19kZWNvZGVfY3JlYXRlYXJncyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCisJCQkJCXN0cnVjdCBuZnNkX2NyZWF0ZWFyZ3MgKmFyZ3MpCit7CisJaWYgKCEocCA9IGRlY29kZV9maChwLCAmYXJncy0+ZmgpKQorCSB8fCAhKHAgPSBkZWNvZGVfZmlsZW5hbWUocCwgJmFyZ3MtPm5hbWUsICZhcmdzLT5sZW4pKQorCSB8fCAhKHAgPSBkZWNvZGVfc2F0dHIocCwgJmFyZ3MtPmF0dHJzKSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CituZnNzdmNfZGVjb2RlX3JlbmFtZWFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZF9yZW5hbWVhcmdzICphcmdzKQoreworCWlmICghKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPmZmaCkpCisJIHx8ICEocCA9IGRlY29kZV9maWxlbmFtZShwLCAmYXJncy0+Zm5hbWUsICZhcmdzLT5mbGVuKSkKKwkgfHwgIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT50ZmgpKQorCSB8fCAhKHAgPSBkZWNvZGVfZmlsZW5hbWUocCwgJmFyZ3MtPnRuYW1lLCAmYXJncy0+dGxlbikpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiB4ZHJfYXJnc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKK2ludAorbmZzc3ZjX2RlY29kZV9yZWFkbGlua2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCBzdHJ1Y3QgbmZzZF9yZWFkbGlua2FyZ3MgKmFyZ3MpCit7CisJaWYgKCEocCA9IGRlY29kZV9maChwLCAmYXJncy0+ZmgpKSkKKwkJcmV0dXJuIDA7CisJc3ZjX3Rha2VfcGFnZShycXN0cCk7CisJYXJncy0+YnVmZmVyID0gcGFnZV9hZGRyZXNzKHJxc3RwLT5ycV9yZXNwYWdlc1tycXN0cC0+cnFfcmVzdXNlZC0xXSk7CisKKwlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitpbnQKK25mc3N2Y19kZWNvZGVfbGlua2FyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZF9saW5rYXJncyAqYXJncykKK3sKKwlpZiAoIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT5mZmgpKQorCSB8fCAhKHAgPSBkZWNvZGVfZmgocCwgJmFyZ3MtPnRmaCkpCisJIHx8ICEocCA9IGRlY29kZV9maWxlbmFtZShwLCAmYXJncy0+dG5hbWUsICZhcmdzLT50bGVuKSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIHhkcl9hcmdzaXplX2NoZWNrKHJxc3RwLCBwKTsKK30KKworaW50CituZnNzdmNfZGVjb2RlX3N5bWxpbmthcmdzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKKwkJCQkJc3RydWN0IG5mc2Rfc3ltbGlua2FyZ3MgKmFyZ3MpCit7CisJaWYgKCEocCA9IGRlY29kZV9maChwLCAmYXJncy0+ZmZoKSkKKwkgfHwgIShwID0gZGVjb2RlX2ZpbGVuYW1lKHAsICZhcmdzLT5mbmFtZSwgJmFyZ3MtPmZsZW4pKQorCSB8fCAhKHAgPSBkZWNvZGVfcGF0aG5hbWUocCwgJmFyZ3MtPnRuYW1lLCAmYXJncy0+dGxlbikpCisJIHx8ICEocCA9IGRlY29kZV9zYXR0cihwLCAmYXJncy0+YXR0cnMpKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitpbnQKK25mc3N2Y19kZWNvZGVfcmVhZGRpcmFyZ3Moc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZF9yZWFkZGlyYXJncyAqYXJncykKK3sKKwlpZiAoIShwID0gZGVjb2RlX2ZoKHAsICZhcmdzLT5maCkpKQorCQlyZXR1cm4gMDsKKwlhcmdzLT5jb29raWUgPSBudG9obCgqcCsrKTsKKwlhcmdzLT5jb3VudCAgPSBudG9obCgqcCsrKTsKKwlpZiAoYXJncy0+Y291bnQgPiBQQUdFX1NJWkUpCisJCWFyZ3MtPmNvdW50ID0gUEFHRV9TSVpFOworCisJc3ZjX3Rha2VfcGFnZShycXN0cCk7CisJYXJncy0+YnVmZmVyID0gcGFnZV9hZGRyZXNzKHJxc3RwLT5ycV9yZXNwYWdlc1tycXN0cC0+cnFfcmVzdXNlZC0xXSk7CisKKwlyZXR1cm4geGRyX2FyZ3NpemVfY2hlY2socnFzdHAsIHApOworfQorCisvKgorICogWERSIGVuY29kZSBmdW5jdGlvbnMKKyAqLworaW50CituZnNzdmNfZW5jb2RlX3ZvaWQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLCB2b2lkICpkdW1teSkKK3sKKwlyZXR1cm4geGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOworfQorCitpbnQKK25mc3N2Y19lbmNvZGVfYXR0cnN0YXQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZF9hdHRyc3RhdCAqcmVzcCkKK3sKKwlwID0gZW5jb2RlX2ZhdHRyKHJxc3RwLCBwLCAmcmVzcC0+ZmgpOworCXJldHVybiB4ZHJfcmVzc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKK2ludAorbmZzc3ZjX2VuY29kZV9kaXJvcHJlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCisJCQkJCXN0cnVjdCBuZnNkX2Rpcm9wcmVzICpyZXNwKQoreworCXAgPSBlbmNvZGVfZmgocCwgJnJlc3AtPmZoKTsKKwlwID0gZW5jb2RlX2ZhdHRyKHJxc3RwLCBwLCAmcmVzcC0+ZmgpOworCXJldHVybiB4ZHJfcmVzc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKK2ludAorbmZzc3ZjX2VuY29kZV9yZWFkbGlua3JlcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCB1MzIgKnAsCisJCQkJCXN0cnVjdCBuZnNkX3JlYWRsaW5rcmVzICpyZXNwKQoreworCSpwKysgPSBodG9ubChyZXNwLT5sZW4pOworCXhkcl9yZXNzaXplX2NoZWNrKHJxc3RwLCBwKTsKKwlycXN0cC0+cnFfcmVzLnBhZ2VfbGVuID0gcmVzcC0+bGVuOworCWlmIChyZXNwLT5sZW4gJiAzKSB7CisJCS8qIG5lZWQgdG8gcGFkIHRoZSB0YWlsICovCisJCXJxc3RwLT5ycV9yZXN0YWlscGFnZSA9IDA7CisJCXJxc3RwLT5ycV9yZXMudGFpbFswXS5pb3ZfYmFzZSA9IHA7CisJCSpwID0gMDsKKwkJcnFzdHAtPnJxX3Jlcy50YWlsWzBdLmlvdl9sZW4gPSA0IC0gKHJlc3AtPmxlbiYzKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKK2ludAorbmZzc3ZjX2VuY29kZV9yZWFkcmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKKwkJCQkJc3RydWN0IG5mc2RfcmVhZHJlcyAqcmVzcCkKK3sKKwlwID0gZW5jb2RlX2ZhdHRyKHJxc3RwLCBwLCAmcmVzcC0+ZmgpOworCSpwKysgPSBodG9ubChyZXNwLT5jb3VudCk7CisJeGRyX3Jlc3NpemVfY2hlY2socnFzdHAsIHApOworCisJLyogbm93IHVwZGF0ZSBycXN0cC0+cnFfcmVzIHRvIHJlZmxlY3QgZGF0YSBhc3dlbGwgKi8KKwlycXN0cC0+cnFfcmVzLnBhZ2VfbGVuID0gcmVzcC0+Y291bnQ7CisJaWYgKHJlc3AtPmNvdW50ICYgMykgeworCQkvKiBuZWVkIHRvIHBhZCB0aGUgdGFpbCAqLworCQlycXN0cC0+cnFfcmVzdGFpbHBhZ2UgPSAwOworCQlycXN0cC0+cnFfcmVzLnRhaWxbMF0uaW92X2Jhc2UgPSBwOworCQkqcCA9IDA7CisJCXJxc3RwLT5ycV9yZXMudGFpbFswXS5pb3ZfbGVuID0gNCAtIChyZXNwLT5jb3VudCYzKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKK2ludAorbmZzc3ZjX2VuY29kZV9yZWFkZGlycmVzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHUzMiAqcCwKKwkJCQkJc3RydWN0IG5mc2RfcmVhZGRpcnJlcyAqcmVzcCkKK3sKKwl4ZHJfcmVzc2l6ZV9jaGVjayhycXN0cCwgcCk7CisJcCA9IHJlc3AtPmJ1ZmZlcjsKKwkqcCsrID0gMDsJCQkvKiBubyBtb3JlIGVudHJpZXMgKi8KKwkqcCsrID0gaHRvbmwoKHJlc3AtPmNvbW1vbi5lcnIgPT0gbmZzZXJyX2VvZikpOworCXJxc3RwLT5ycV9yZXMucGFnZV9sZW4gPSAoKCh1bnNpZ25lZCBsb25nKXAtMSkgJiB+UEFHRV9NQVNLKSsxOworCisJcmV0dXJuIDE7Cit9CisKK2ludAorbmZzc3ZjX2VuY29kZV9zdGF0ZnNyZXMoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZF9zdGF0ZnNyZXMgKnJlc3ApCit7CisJc3RydWN0IGtzdGF0ZnMJKnN0YXQgPSAmcmVzcC0+c3RhdHM7CisKKwkqcCsrID0gaHRvbmwoTkZTU1ZDX01BWEJMS1NJWkUpOwkvKiBtYXggdHJhbnNmZXIgc2l6ZSAqLworCSpwKysgPSBodG9ubChzdGF0LT5mX2JzaXplKTsKKwkqcCsrID0gaHRvbmwoc3RhdC0+Zl9ibG9ja3MpOworCSpwKysgPSBodG9ubChzdGF0LT5mX2JmcmVlKTsKKwkqcCsrID0gaHRvbmwoc3RhdC0+Zl9iYXZhaWwpOworCXJldHVybiB4ZHJfcmVzc2l6ZV9jaGVjayhycXN0cCwgcCk7Cit9CisKK2ludAorbmZzc3ZjX2VuY29kZV9lbnRyeShzdHJ1Y3QgcmVhZGRpcl9jZCAqY2NkLCBjb25zdCBjaGFyICpuYW1lLAorCQkgICAgaW50IG5hbWxlbiwgbG9mZl90IG9mZnNldCwgaW5vX3QgaW5vLCB1bnNpZ25lZCBpbnQgZF90eXBlKQoreworCXN0cnVjdCBuZnNkX3JlYWRkaXJyZXMgKmNkID0gY29udGFpbmVyX29mKGNjZCwgc3RydWN0IG5mc2RfcmVhZGRpcnJlcywgY29tbW9uKTsKKwl1MzIJKnAgPSBjZC0+YnVmZmVyOworCWludAlidWZsZW4sIHNsZW47CisKKwkvKgorCWRwcmludGsoIm5mc2Q6IGVudHJ5KCUuKnMgb2ZmICVsZCBpbm8gJWxkKVxuIiwKKwkJCW5hbWxlbiwgbmFtZSwgb2Zmc2V0LCBpbm8pOworCSAqLworCisJaWYgKG9mZnNldCA+IH4oKHUzMikgMCkpIHsKKwkJY2QtPmNvbW1vbi5lcnIgPSBuZnNlcnJfZmJpZzsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChjZC0+b2Zmc2V0KQorCQkqY2QtPm9mZnNldCA9IGh0b25sKG9mZnNldCk7CisJaWYgKG5hbWxlbiA+IE5GUzJfTUFYTkFNTEVOKQorCQluYW1sZW4gPSBORlMyX01BWE5BTUxFTjsvKiB0cnVuY2F0ZSBmaWxlbmFtZSAqLworCisJc2xlbiA9IFhEUl9RVUFETEVOKG5hbWxlbik7CisJaWYgKChidWZsZW4gPSBjZC0+YnVmbGVuIC0gc2xlbiAtIDQpIDwgMCkgeworCQljZC0+Y29tbW9uLmVyciA9IG5mc2Vycl90b29zbWFsbDsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCSpwKysgPSB4ZHJfb25lOwkJCQkvKiBtYXJrIGVudHJ5IHByZXNlbnQgKi8KKwkqcCsrID0gaHRvbmwoKHUzMikgaW5vKTsJCS8qIGZpbGUgaWQgKi8KKwlwICAgID0geGRyX2VuY29kZV9hcnJheShwLCBuYW1lLCBuYW1sZW4pOy8qIG5hbWUgbGVuZ3RoICYgbmFtZSAqLworCWNkLT5vZmZzZXQgPSBwOwkJCS8qIHJlbWVtYmVyIHBvaW50ZXIgKi8KKwkqcCsrID0gfih1MzIpIDA7CQkvKiBvZmZzZXQgb2YgbmV4dCBlbnRyeSAqLworCisJY2QtPmJ1ZmxlbiA9IGJ1ZmxlbjsKKwljZC0+YnVmZmVyID0gcDsKKwljZC0+Y29tbW9uLmVyciA9IG5mc19vazsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFhEUiByZWxlYXNlIGZ1bmN0aW9ucworICovCitpbnQKK25mc3N2Y19yZWxlYXNlX2ZoYW5kbGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgdTMyICpwLAorCQkJCQlzdHJ1Y3QgbmZzZF9maGFuZGxlICpyZXNwKQoreworCWZoX3B1dCgmcmVzcC0+ZmgpOworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9zdGF0cy5jIGIvZnMvbmZzZC9zdGF0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZjk1NWIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnNkL3N0YXRzLmMKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBsaW51eC9mcy9uZnNkL3N0YXRzLmMKKyAqCisgKiBwcm9jZnMtYmFzZWQgdXNlciBhY2Nlc3MgdG8ga25mc2Qgc3RhdGlzdGljcworICoKKyAqIC9wcm9jL25ldC9ycGMvbmZzZAorICoKKyAqIEZvcm1hdDoKKyAqCXJjIDxoaXRzPiA8bWlzc2VzPiA8bm9jYWNoZT4KKyAqCQkJU3RhdGlzdHNpY3MgZm9yIHRoZSByZXBseSBjYWNoZQorICoJZmggPHN0YWxlPiA8dG90YWwtbG9va3Vwcz4gPGFub25sb29rdXBzPiA8ZGlyLW5vdC1pbi1kY2FjaGU+IDxub25kaXItbm90LWluLWRjYWNoZT4KKyAqCQkJc3RhdGlzdGljcyBmb3IgZmlsZWhhbmRsZSBsb29rdXAKKyAqCWlvIDxieXRlcy1yZWFkPiA8Ynl0ZXMtd3JpdHR0ZW4+CisgKgkJCXN0YXRpc3RpY3MgZm9yIElPIHRocm91Z2hwdXQKKyAqCXRoIDx0aHJlYWRzPiA8ZnVsbGNudD4gPDEwJS0yMCU+IDwyMCUtMzAlPiAuLi4gPDkwJS0xMDAlPiA8MTAwJT4gCisgKgkJCXRpbWUgKHNlY29uZHMpIHdoZW4gbmZzZCB0aHJlYWQgdXNhZ2UgYWJvdmUgdGhyZXNob2xkcworICoJCQlhbmQgbnVtYmVyIG9mIHRpbWVzIHRoYXQgYWxsIHRocmVhZHMgd2VyZSBpbiB1c2UKKyAqCXJhIGNhY2hlLXNpemUgIDwxMCUgIDwyMCUgIDwzMCUgLi4uIDwxMDAlIG5vdC1mb3VuZAorICoJCQludW1iZXIgb2YgdGltZXMgdGhhdCByZWFkLWFoZWFkIGVudHJ5IHdhcyBmb3VuZCB0aGF0IGRlZXAgaW4KKyAqCQkJdGhlIGNhY2hlLgorICoJcGx1cyBnZW5lcmljIFJQQyBzdGF0cyAoc2VlIG5ldC9zdW5ycGMvc3RhdHMuYykKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYsIDE5OTcgT2xhZiBLaXJjaCA8b2tpckBtb25hZC5zd2IuZGU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CisjaW5jbHVkZSA8bGludXgvc3VucnBjL3N0YXRzLmg+CisjaW5jbHVkZSA8bGludXgvbmZzZC9uZnNkLmg+CisjaW5jbHVkZSA8bGludXgvbmZzZC9zdGF0cy5oPgorCitzdHJ1Y3QgbmZzZF9zdGF0cwluZnNkc3RhdHM7CitzdHJ1Y3Qgc3ZjX3N0YXQJCW5mc2Rfc3Zjc3RhdHMgPSB7CisJLnByb2dyYW0JPSAmbmZzZF9wcm9ncmFtLAorfTsKKworc3RhdGljIGludCBuZnNkX3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlpbnQgaTsKKworCXNlcV9wcmludGYoc2VxLCAicmMgJXUgJXUgJXVcbmZoICV1ICV1ICV1ICV1ICV1XG5pbyAldSAldVxuIiwKKwkJICAgICAgbmZzZHN0YXRzLnJjaGl0cywKKwkJICAgICAgbmZzZHN0YXRzLnJjbWlzc2VzLAorCQkgICAgICBuZnNkc3RhdHMucmNub2NhY2hlLAorCQkgICAgICBuZnNkc3RhdHMuZmhfc3RhbGUsCisJCSAgICAgIG5mc2RzdGF0cy5maF9sb29rdXAsCisJCSAgICAgIG5mc2RzdGF0cy5maF9hbm9uLAorCQkgICAgICBuZnNkc3RhdHMuZmhfbm9jYWNoZV9kaXIsCisJCSAgICAgIG5mc2RzdGF0cy5maF9ub2NhY2hlX25vbmRpciwKKwkJICAgICAgbmZzZHN0YXRzLmlvX3JlYWQsCisJCSAgICAgIG5mc2RzdGF0cy5pb193cml0ZSk7CisJLyogdGhyZWFkIHVzYWdlOiAqLworCXNlcV9wcmludGYoc2VxLCAidGggJXUgJXUiLCBuZnNkc3RhdHMudGhfY250LCBuZnNkc3RhdHMudGhfZnVsbGNudCk7CisJZm9yIChpPTA7IGk8MTA7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgamlmcyA9IG5mc2RzdGF0cy50aF91c2FnZVtpXTsKKwkJdW5zaWduZWQgaW50IHNlYyA9IGppZnMgLyBIWiwgbXNlYyA9IChqaWZzICUgSFopKjEwMDAvSFo7CisJCXNlcV9wcmludGYoc2VxLCAiICV1LiUwM3UiLCBzZWMsIG1zZWMpOworCX0KKworCS8qIG5ld2xpbmUgYW5kIHJhLWNhY2hlICovCisJc2VxX3ByaW50ZihzZXEsICJcbnJhICV1IiwgbmZzZHN0YXRzLnJhX3NpemUpOworCWZvciAoaT0wOyBpPDExOyBpKyspCisJCXNlcV9wcmludGYoc2VxLCAiICV1IiwgbmZzZHN0YXRzLnJhX2RlcHRoW2ldKTsKKwlzZXFfcHV0YyhzZXEsICdcbicpOworCQorCS8qIHNob3cgbXkgcnBjIGluZm8gKi8KKwlzdmNfc2VxX3Nob3coc2VxLCAmbmZzZF9zdmNzdGF0cyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZnNkX3Byb2Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgbmZzZF9wcm9jX3Nob3csIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBuZnNkX3Byb2NfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IG5mc2RfcHJvY19vcGVuLAorCS5yZWFkICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3ZvaWQKK25mc2Rfc3RhdF9pbml0KHZvaWQpCit7CisJc3ZjX3Byb2NfcmVnaXN0ZXIoJm5mc2Rfc3Zjc3RhdHMsICZuZnNkX3Byb2NfZm9wcyk7Cit9CisKK3ZvaWQKK25mc2Rfc3RhdF9zaHV0ZG93bih2b2lkKQoreworCXN2Y19wcm9jX3VucmVnaXN0ZXIoIm5mc2QiKTsKK30KZGlmZiAtLWdpdCBhL2ZzL25mc2QvdmZzLmMgYi9mcy9uZnNkL3Zmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZTlkMjEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnNkL3Zmcy5jCkBAIC0wLDAgKzEsMTg1OSBAQAorI2RlZmluZSBNU05GUwkvKiBIQUNLIEhBQ0sgKi8KKy8qCisgKiBsaW51eC9mcy9uZnNkL3Zmcy5jCisgKgorICogRmlsZSBvcGVyYXRpb25zIHVzZWQgYnkgbmZzZC4gU29tZSBvZiB0aGVzZSBoYXZlIGJlZW4gcmlwcGVkIGZyb20KKyAqIG90aGVyIHBhcnRzIG9mIHRoZSBrZXJuZWwgYmVjYXVzZSB0aGV5IHdlcmVuJ3QgZXhwb3J0ZWQsIG90aGVycworICogYXJlIHBhcnRpYWwgZHVwbGljYXRlcyB3aXRoIGFkZGVkIG9yIGNoYW5nZWQgZnVuY3Rpb25hbGl0eS4KKyAqCisgKiBOb3RlIHRoYXQgc2V2ZXJhbCBmdW5jdGlvbnMgZGdldCgpIHRoZSBkZW50cnkgdXBvbiB3aGljaCB0aGV5IHdhbnQKKyAqIHRvIGFjdCwgbW9zdCBub3RhYmx5IHRob3NlIHRoYXQgY3JlYXRlIGRpcmVjdG9yeSBlbnRyaWVzLiBSZXNwb25zZQorICogZGVudHJ5J3MgYXJlIGRwdXQoKSdkIGlmIG5lY2Vzc2FyeSBpbiB0aGUgcmVsZWFzZSBjYWxsYmFjay4KKyAqIFNvIGlmIHlvdSBub3RpY2UgY29kZSBwYXRocyB0aGF0IGFwcGFyZW50bHkgZmFpbCB0byBkcHV0KCkgdGhlCisgKiBkZW50cnksIGRvbid0IHdvcnJ5LS10aGV5IGhhdmUgYmVlbiB0YWtlbiBjYXJlIG9mLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk5IE9sYWYgS2lyY2ggPG9raXJAbW9uYWQuc3diLmRlPgorICogWmVyb2NweSBORlMgc3VwcG9ydCAoQykgMjAwMiBIaXJva2F6dSBUYWthaGFzaGkgPHRha2FAdmFsaW51eC5jby5qcD4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tYWpvci5oPgorI2luY2x1ZGUgPGxpbnV4L2V4dDJfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zdW5ycGMvc3ZjLmg+CisjaW5jbHVkZSA8bGludXgvbmZzZC9uZnNkLmg+CisjaWZkZWYgQ09ORklHX05GU0RfVjMKKyNpbmNsdWRlIDxsaW51eC9uZnMzLmg+CisjaW5jbHVkZSA8bGludXgvbmZzZC94ZHIzLmg+CisjZW5kaWYgLyogQ09ORklHX05GU0RfVjMgKi8KKyNpbmNsdWRlIDxsaW51eC9uZnNkL25mc2ZoLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9kbm90aWZ5Lmg+CisjaWZkZWYgQ09ORklHX05GU0RfVjQKKyNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2wuaD4KKyNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2xfeGF0dHIuaD4KKyNpbmNsdWRlIDxsaW51eC94YXR0cl9hY2wuaD4KKyNpbmNsdWRlIDxsaW51eC94YXR0ci5oPgorI2luY2x1ZGUgPGxpbnV4L25mczQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZnM0X2FjbC5oPgorI2luY2x1ZGUgPGxpbnV4L25mc2RfaWRtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorI2VuZGlmIC8qIENPTkZJR19ORlNEX1Y0ICovCisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjZGVmaW5lIE5GU0REQkdfRkFDSUxJVFkJCU5GU0REQkdfRklMRU9QCisjZGVmaW5lIE5GU0RfUEFSQU5PSUEKKworCisvKiBXZSBtdXN0IGlnbm9yZSBmaWxlcyAoYnV0IG9ubHkgZmlsZXMpIHdoaWNoIG1pZ2h0IGhhdmUgbWFuZGF0b3J5CisgKiBsb2NrcyBvbiB0aGVtIGJlY2F1c2UgdGhlcmUgaXMgbm8gd2F5IHRvIGtub3cgaWYgdGhlIGFjY2Vzc2VyIGhhcworICogdGhlIGxvY2suCisgKi8KKyNkZWZpbmUgSVNfSVNNTkRMSyhpKQkoU19JU1JFRygoaSktPmlfbW9kZSkgJiYgTUFOREFUT1JZX0xPQ0soaSkpCisKKy8qCisgKiBUaGlzIGlzIGEgY2FjaGUgb2YgcmVhZGFoZWFkIHBhcmFtcyB0aGF0IGhlbHAgdXMgY2hvb3NlIHRoZSBwcm9wZXIKKyAqIHJlYWRhaGVhZCBzdHJhdGVneS4gSW5pdGlhbGx5LCB3ZSBzZXQgYWxsIHJlYWRhaGVhZCBwYXJhbWV0ZXJzIHRvIDAKKyAqIGFuZCBsZXQgdGhlIFZGUyBoYW5kbGUgdGhpbmdzLgorICogSWYgeW91IGluY3JlYXNlIHRoZSBudW1iZXIgb2YgY2FjaGVkIGZpbGVzIHZlcnkgbXVjaCwgeW91J2xsIG5lZWQgdG8KKyAqIGFkZCBhIGhhc2ggdGFibGUgaGVyZS4KKyAqLworc3RydWN0IHJhcGFybXMgeworCXN0cnVjdCByYXBhcm1zCQkqcF9uZXh0OworCXVuc2lnbmVkIGludAkJcF9jb3VudDsKKwlpbm9fdAkJCXBfaW5vOworCWRldl90CQkJcF9kZXY7CisJaW50CQkJcF9zZXQ7CisJc3RydWN0IGZpbGVfcmFfc3RhdGUJcF9yYTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmFwYXJtcyAqCQlyYXBhcm1sOworc3RhdGljIHN0cnVjdCByYXBhcm1zICoJCXJhcGFybV9jYWNoZTsKKworLyogCisgKiBDYWxsZWQgZnJvbSBuZnNkX2xvb2t1cCBhbmQgZW5jb2RlX2RpcmVudC4gQ2hlY2sgaWYgd2UgaGF2ZSBjcm9zc2VkIAorICogYSBtb3VudCBwb2ludC4KKyAqIFJldHVybnMgLUVBR0FJTiBsZWF2aW5nICpkcHAgYW5kICpleHBwIHVuY2hhbmdlZCwgCisgKiAgb3IgbmZzX29rIGhhdmluZyBwb3NzaWJseSBjaGFuZ2VkICpkcHAgYW5kICpleHBwCisgKi8KK2ludAorbmZzZF9jcm9zc19tbnQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IGRlbnRyeSAqKmRwcCwgCisJCSAgICAgICAgc3RydWN0IHN2Y19leHBvcnQgKipleHBwKQoreworCXN0cnVjdCBzdmNfZXhwb3J0ICpleHAgPSAqZXhwcCwgKmV4cDIgPSBOVUxMOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9ICpkcHA7CisJc3RydWN0IHZmc21vdW50ICptbnQgPSBtbnRnZXQoZXhwLT5leF9tbnQpOworCXN0cnVjdCBkZW50cnkgKm1vdW50cyA9IGRnZXQoZGVudHJ5KTsKKwlpbnQgZXJyID0gbmZzX29rOworCisJd2hpbGUgKGZvbGxvd19kb3duKCZtbnQsJm1vdW50cykmJmRfbW91bnRwb2ludChtb3VudHMpKTsKKworCWV4cDIgPSBleHBfZ2V0X2J5X25hbWUoZXhwLT5leF9jbGllbnQsIG1udCwgbW91bnRzLCAmcnFzdHAtPnJxX2NoYW5kbGUpOworCWlmIChJU19FUlIoZXhwMikpIHsKKwkJZXJyID0gUFRSX0VSUihleHAyKTsKKwkJZHB1dChtb3VudHMpOworCQltbnRwdXQobW50KTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChleHAyICYmICgoZXhwLT5leF9mbGFncyAmIE5GU0VYUF9DUk9TU01PVU5UKSB8fCBFWF9OT0hJREUoZXhwMikpKSB7CisJCS8qIHN1Y2Nlc3NmdWxseSBjcm9zc2VkIG1vdW50IHBvaW50ICovCisJCWV4cF9wdXQoZXhwKTsKKwkJKmV4cHAgPSBleHAyOworCQlkcHV0KGRlbnRyeSk7CisJCSpkcHAgPSBtb3VudHM7CisJfSBlbHNlIHsKKwkJaWYgKGV4cDIpIGV4cF9wdXQoZXhwMik7CisJCWRwdXQobW91bnRzKTsKKwl9CisJbW50cHV0KG1udCk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIExvb2sgdXAgb25lIGNvbXBvbmVudCBvZiBhIHBhdGhuYW1lLgorICogTi5CLiBBZnRlciB0aGlzIGNhbGwgX2JvdGhfIGZocCBhbmQgcmVzZmggbmVlZCBhbiBmaF9wdXQKKyAqCisgKiBJZiB0aGUgbG9va3VwIHdvdWxkIGNyb3NzIGEgbW91bnRwb2ludCwgYW5kIHRoZSBtb3VudGVkIGZpbGVzeXN0ZW0KKyAqIGlzIGV4cG9ydGVkIHRvIHRoZSBjbGllbnQgd2l0aCBORlNFWFBfTk9ISURFLCB0aGVuIHRoZSBsb29rdXAgaXMKKyAqIGFjY2VwdGVkIGFzIGl0IHN0YW5kcyBhbmQgdGhlIG1vdW50ZWQgZGlyZWN0b3J5IGlzCisgKiByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSBjb3ZlcmVkIGRpcmVjdG9yeSBpcyByZXR1cm5lZC4KKyAqIE5PVEU6IHRoaXMgbW91bnRwb2ludCBjcm9zc2luZyBpcyBub3Qgc3VwcG9ydGVkIHByb3Blcmx5IGJ5IGFsbAorICogICBjbGllbnRzIGFuZCBpcyBleHBsaWNpdGx5IGRpc2FsbG93ZWQgZm9yIE5GU3YzCisgKiAgICAgIE5laWxCcm93biA8bmVpbGJAY3NlLnVuc3cuZWR1LmF1PgorICovCitpbnQKK25mc2RfbG9va3VwKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZocCwgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJaW50IGxlbiwgc3RydWN0IHN2Y19maCAqcmVzZmgpCit7CisJc3RydWN0IHN2Y19leHBvcnQJKmV4cDsKKwlzdHJ1Y3QgZGVudHJ5CQkqZHBhcmVudDsKKwlzdHJ1Y3QgZGVudHJ5CQkqZGVudHJ5OworCWludAkJCWVycjsKKworCWRwcmludGsoIm5mc2Q6IG5mc2RfbG9va3VwKGZoICVzLCAlLipzKVxuIiwgU1ZDRkhfZm10KGZocCksIGxlbixuYW1lKTsKKworCS8qIE9idGFpbiBkZW50cnkgYW5kIGV4cG9ydC4gKi8KKwllcnIgPSBmaF92ZXJpZnkocnFzdHAsIGZocCwgU19JRkRJUiwgTUFZX0VYRUMpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlkcGFyZW50ID0gZmhwLT5maF9kZW50cnk7CisJZXhwICA9IGZocC0+ZmhfZXhwb3J0OworCWV4cF9nZXQoZXhwKTsKKworCWVyciA9IG5mc2Vycl9hY2NlczsKKworCS8qIExvb2t1cCB0aGUgbmFtZSwgYnV0IGRvbid0IGZvbGxvdyBsaW5rcyAqLworCWlmIChpc2RvdGVudChuYW1lLCBsZW4pKSB7CisJCWlmIChsZW49PTEpCisJCQlkZW50cnkgPSBkZ2V0KGRwYXJlbnQpOworCQllbHNlIGlmIChkcGFyZW50ICE9IGV4cC0+ZXhfZGVudHJ5KSB7CisJCQlkZW50cnkgPSBkZ2V0X3BhcmVudChkcGFyZW50KTsKKwkJfSBlbHNlICBpZiAoIUVYX05PSElERShleHApKQorCQkJZGVudHJ5ID0gZGdldChkcGFyZW50KTsgLyogLi4gPT0gLiBqdXN0IGxpa2UgYXQgLyAqLworCQllbHNlIHsKKwkJCS8qIGNoZWNraW5nIG1vdW50cG9pbnQgY3Jvc3NpbmcgaXMgdmVyeSBkaWZmZXJlbnQgd2hlbiBzdGVwcGluZyB1cCAqLworCQkJc3RydWN0IHN2Y19leHBvcnQgKmV4cDIgPSBOVUxMOworCQkJc3RydWN0IGRlbnRyeSAqZHA7CisJCQlzdHJ1Y3QgdmZzbW91bnQgKm1udCA9IG1udGdldChleHAtPmV4X21udCk7CisJCQlkZW50cnkgPSBkZ2V0KGRwYXJlbnQpOworCQkJd2hpbGUoZGVudHJ5ID09IG1udC0+bW50X3Jvb3QgJiYgZm9sbG93X3VwKCZtbnQsICZkZW50cnkpKQorCQkJCTsKKwkJCWRwID0gZGdldF9wYXJlbnQoZGVudHJ5KTsKKwkJCWRwdXQoZGVudHJ5KTsKKwkJCWRlbnRyeSA9IGRwOworCisJCQlleHAyID0gZXhwX3BhcmVudChleHAtPmV4X2NsaWVudCwgbW50LCBkZW50cnksCisJCQkJCSAgJnJxc3RwLT5ycV9jaGFuZGxlKTsKKwkJCWlmIChJU19FUlIoZXhwMikpIHsKKwkJCQllcnIgPSBQVFJfRVJSKGV4cDIpOworCQkJCWRwdXQoZGVudHJ5KTsKKwkJCQltbnRwdXQobW50KTsKKwkJCQlnb3RvIG91dF9uZnNlcnI7CisJCQl9CisJCQlpZiAoIWV4cDIpIHsKKwkJCQlkcHV0KGRlbnRyeSk7CisJCQkJZGVudHJ5ID0gZGdldChkcGFyZW50KTsKKwkJCX0gZWxzZSB7CisJCQkJZXhwX3B1dChleHApOworCQkJCWV4cCA9IGV4cDI7CisJCQl9CisJCQltbnRwdXQobW50KTsKKwkJfQorCX0gZWxzZSB7CisJCWZoX2xvY2soZmhwKTsKKwkJZGVudHJ5ID0gbG9va3VwX29uZV9sZW4obmFtZSwgZHBhcmVudCwgbGVuKTsKKwkJZXJyID0gUFRSX0VSUihkZW50cnkpOworCQlpZiAoSVNfRVJSKGRlbnRyeSkpCisJCQlnb3RvIG91dF9uZnNlcnI7CisJCS8qCisJCSAqIGNoZWNrIGlmIHdlIGhhdmUgY3Jvc3NlZCBhIG1vdW50IHBvaW50IC4uLgorCQkgKi8KKwkJaWYgKGRfbW91bnRwb2ludChkZW50cnkpKSB7CisJCQlpZiAoKGVyciA9IG5mc2RfY3Jvc3NfbW50KHJxc3RwLCAmZGVudHJ5LCAmZXhwKSkpIHsKKwkJCQlkcHV0KGRlbnRyeSk7CisJCQkJZ290byBvdXRfbmZzZXJyOworCQkJfQorCQl9CisJfQorCS8qCisJICogTm90ZTogd2UgY29tcG9zZSB0aGUgZmlsZSBoYW5kbGUgbm93LCBidXQgYXMgdGhlCisJICogZGVudHJ5IG1heSBiZSBuZWdhdGl2ZSwgaXQgbWF5IG5lZWQgdG8gYmUgdXBkYXRlZC4KKwkgKi8KKwllcnIgPSBmaF9jb21wb3NlKHJlc2ZoLCBleHAsIGRlbnRyeSwgZmhwKTsKKwlpZiAoIWVyciAmJiAhZGVudHJ5LT5kX2lub2RlKQorCQllcnIgPSBuZnNlcnJfbm9lbnQ7CisJZHB1dChkZW50cnkpOworb3V0OgorCWV4cF9wdXQoZXhwKTsKKwlyZXR1cm4gZXJyOworCitvdXRfbmZzZXJyOgorCWVyciA9IG5mc2Vycm5vKGVycik7CisJZ290byBvdXQ7Cit9CisKKy8qCisgKiBTZXQgdmFyaW91cyBmaWxlIGF0dHJpYnV0ZXMuCisgKiBOLkIuIEFmdGVyIHRoaXMgY2FsbCBmaHAgbmVlZHMgYW4gZmhfcHV0CisgKi8KK2ludAorbmZzZF9zZXRhdHRyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZocCwgc3RydWN0IGlhdHRyICppYXAsCisJICAgICBpbnQgY2hlY2tfZ3VhcmQsIHRpbWVfdCBndWFyZHRpbWUpCit7CisJc3RydWN0IGRlbnRyeQkqZGVudHJ5OworCXN0cnVjdCBpbm9kZQkqaW5vZGU7CisJaW50CQlhY2Ntb2RlID0gTUFZX1NBVFRSOworCWludAkJZnR5cGUgPSAwOworCWludAkJaW1vZGU7CisJaW50CQllcnI7CisJaW50CQlzaXplX2NoYW5nZSA9IDA7CisKKwlpZiAoaWFwLT5pYV92YWxpZCAmIChBVFRSX0FUSU1FIHwgQVRUUl9NVElNRSB8IEFUVFJfU0laRSkpCisJCWFjY21vZGUgfD0gTUFZX1dSSVRFfE1BWV9PV05FUl9PVkVSUklERTsKKwlpZiAoaWFwLT5pYV92YWxpZCAmIEFUVFJfU0laRSkKKwkJZnR5cGUgPSBTX0lGUkVHOworCisJLyogR2V0IGlub2RlICovCisJZXJyID0gZmhfdmVyaWZ5KHJxc3RwLCBmaHAsIGZ0eXBlLCBhY2Ntb2RlKTsKKwlpZiAoZXJyIHx8ICFpYXAtPmlhX3ZhbGlkKQorCQlnb3RvIG91dDsKKworCWRlbnRyeSA9IGZocC0+ZmhfZGVudHJ5OworCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCisJLyogTkZTdjIgZG9lcyBub3QgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuICJzZXQtW2FjXXRpbWUtdG8tbm93IgorCSAqIHdoaWNoIG9ubHkgcmVxdWlyZXMgYWNjZXNzLCBhbmQgInNldC1bYWNddGltZS10by1YIiB3aGljaAorCSAqIHJlcXVpcmVzIG93bmVyc2hpcC4KKwkgKiBTbyBpZiBpdCBsb29rcyBsaWtlIGl0IG1pZ2h0IGJlICJzZXQgYm90aCB0byB0aGUgc2FtZSB0aW1lIHdoaWNoCisJICogaXMgY2xvc2UgdG8gbm93IiwgYW5kIGlmIGlub2RlX2NoYW5nZV9vayBmYWlscywgdGhlbiB3ZQorCSAqIGNvbnZlcnQgdG8gInNldCB0byBub3ciIGluc3RlYWQgb2YgInNldCB0byBleHBsaWNpdCB0aW1lIgorCSAqCisJICogV2Ugb25seSBjYWxsIGlub2RlX2NoYW5nZV9vayBhcyB0aGUgbGFzdCB0ZXN0IGFzIHRlY2huaWNhbGx5CisJICogaXQgaXMgbm90IGFuIGludGVyZmFjZSB0aGF0IHdlIHNob3VsZCBiZSB1c2luZy4gIEl0IGlzIG9ubHkKKwkgKiB2YWxpZCBpZiB0aGUgZmlsZXN5c3RlbSBkb2VzIG5vdCBkZWZpbmUgaXQncyBvd24gaV9vcC0+c2V0YXR0ci4KKwkgKi8KKyNkZWZpbmUgQk9USF9USU1FX1NFVCAoQVRUUl9BVElNRV9TRVQgfCBBVFRSX01USU1FX1NFVCkKKyNkZWZpbmUJTUFYX1RPVUNIX1RJTUVfRVJST1IgKDMwKjYwKQorCWlmICgoaWFwLT5pYV92YWxpZCAmIEJPVEhfVElNRV9TRVQpID09IEJPVEhfVElNRV9TRVQKKwkgICAgJiYgaWFwLT5pYV9tdGltZS50dl9zZWMgPT0gaWFwLT5pYV9hdGltZS50dl9zZWMKKwkgICAgKSB7CisJICAgIC8qIExvb2tzIHByb2JhYmxlLiAgTm93IGp1c3QgbWFrZSBzdXJlIHRpbWUgaXMgaW4gdGhlIHJpZ2h0IGJhbGxwYXJrLgorCSAgICAgKiBTb2xhcmlzLCBhdCBsZWFzdCwgZG9lc24ndCBzZWVtIHRvIGNhcmUgd2hhdCB0aGUgdGltZSByZXF1ZXN0IGlzLgorCSAgICAgKiBXZSByZXF1aXJlIGl0IGJlIHdpdGhpbiAzMCBtaW51dGVzIG9mIG5vdy4KKwkgICAgICovCisJICAgIHRpbWVfdCBkZWx0YSA9IGlhcC0+aWFfYXRpbWUudHZfc2VjIC0gZ2V0X3NlY29uZHMoKTsKKwkgICAgaWYgKGRlbHRhPDApIGRlbHRhID0gLWRlbHRhOworCSAgICBpZiAoZGVsdGEgPCBNQVhfVE9VQ0hfVElNRV9FUlJPUiAmJgorCQlpbm9kZV9jaGFuZ2Vfb2soaW5vZGUsIGlhcCkgIT0gMCkgeworCQkvKiB0dXJuIG9mZiBBVFRSX1tBTV1USU1FX1NFVCBidXQgbGVhdmUgQVRUUl9bQU1dVElNRQorCQkgKiB0aGlzIHdpbGwgY2F1c2Ugbm90aWZ5X2NoYW5nZSB0byBzZXQgdGhlc2UgdGltZXMgdG8gIm5vdyIKKwkJICovCisJCWlhcC0+aWFfdmFsaWQgJj0gfkJPVEhfVElNRV9TRVQ7CisJICAgIH0KKwl9CisJICAgIAorCS8qIFRoZSBzaXplIGNhc2UgaXMgc3BlY2lhbC4gSXQgY2hhbmdlcyB0aGUgZmlsZSBhcyB3ZWxsIGFzIHRoZSBhdHRyaWJ1dGVzLiAgKi8KKwlpZiAoaWFwLT5pYV92YWxpZCAmIEFUVFJfU0laRSkgeworCQlpZiAoaWFwLT5pYV9zaXplIDwgaW5vZGUtPmlfc2l6ZSkgeworCQkJZXJyID0gbmZzZF9wZXJtaXNzaW9uKGZocC0+ZmhfZXhwb3J0LCBkZW50cnksIE1BWV9UUlVOQ3xNQVlfT1dORVJfT1ZFUlJJREUpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qCisJCSAqIElmIHdlIGFyZSBjaGFuZ2luZyB0aGUgc2l6ZSBvZiB0aGUgZmlsZSwgdGhlbgorCQkgKiB3ZSBuZWVkIHRvIGJyZWFrIGFsbCBsZWFzZXMuCisJCSAqLworCQllcnIgPSBicmVha19sZWFzZShpbm9kZSwgRk1PREVfV1JJVEUgfCBPX05PTkJMT0NLKTsKKwkJaWYgKGVyciA9PSAtRVdPVUxEQkxPQ0spCisJCQllcnIgPSAtRVRJTUVET1VUOworCQlpZiAoZXJyKSAvKiBFTk9NRU0gb3IgRVdPVUxEQkxPQ0sgKi8KKwkJCWdvdG8gb3V0X25mc2VycjsKKworCQllcnIgPSBnZXRfd3JpdGVfYWNjZXNzKGlub2RlKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X25mc2VycjsKKworCQlzaXplX2NoYW5nZSA9IDE7CisJCWVyciA9IGxvY2tzX3ZlcmlmeV90cnVuY2F0ZShpbm9kZSwgTlVMTCwgaWFwLT5pYV9zaXplKTsKKwkJaWYgKGVycikgeworCQkJcHV0X3dyaXRlX2FjY2Vzcyhpbm9kZSk7CisJCQlnb3RvIG91dF9uZnNlcnI7CisJCX0KKwkJRFFVT1RfSU5JVChpbm9kZSk7CisJfQorCisJaW1vZGUgPSBpbm9kZS0+aV9tb2RlOworCWlmIChpYXAtPmlhX3ZhbGlkICYgQVRUUl9NT0RFKSB7CisJCWlhcC0+aWFfbW9kZSAmPSBTX0lBTExVR087CisJCWltb2RlID0gaWFwLT5pYV9tb2RlIHw9IChpbW9kZSAmIH5TX0lBTExVR08pOworCX0KKworCS8qIFJldm9rZSBzZXR1aWQvc2V0Z2lkIGJpdCBvbiBjaG93bi9jaGdycCAqLworCWlmICgoaWFwLT5pYV92YWxpZCAmIEFUVFJfVUlEKSAmJiBpYXAtPmlhX3VpZCAhPSBpbm9kZS0+aV91aWQpCisJCWlhcC0+aWFfdmFsaWQgfD0gQVRUUl9LSUxMX1NVSUQ7CisJaWYgKChpYXAtPmlhX3ZhbGlkICYgQVRUUl9HSUQpICYmIGlhcC0+aWFfZ2lkICE9IGlub2RlLT5pX2dpZCkKKwkJaWFwLT5pYV92YWxpZCB8PSBBVFRSX0tJTExfU0dJRDsKKworCS8qIENoYW5nZSB0aGUgYXR0cmlidXRlcy4gKi8KKworCWlhcC0+aWFfdmFsaWQgfD0gQVRUUl9DVElNRTsKKworCWVyciA9IG5mc2Vycl9ub3RzeW5jOworCWlmICghY2hlY2tfZ3VhcmQgfHwgZ3VhcmR0aW1lID09IGlub2RlLT5pX2N0aW1lLnR2X3NlYykgeworCQlmaF9sb2NrKGZocCk7CisJCWVyciA9IG5vdGlmeV9jaGFuZ2UoZGVudHJ5LCBpYXApOworCQllcnIgPSBuZnNlcnJubyhlcnIpOworCQlmaF91bmxvY2soZmhwKTsKKwl9CisJaWYgKHNpemVfY2hhbmdlKQorCQlwdXRfd3JpdGVfYWNjZXNzKGlub2RlKTsKKwlpZiAoIWVycikKKwkJaWYgKEVYX0lTU1lOQyhmaHAtPmZoX2V4cG9ydCkpCisJCQl3cml0ZV9pbm9kZV9ub3coaW5vZGUsIDEpOworb3V0OgorCXJldHVybiBlcnI7CisKK291dF9uZnNlcnI6CisJZXJyID0gbmZzZXJybm8oZXJyKTsKKwlnb3RvIG91dDsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX05GU0RfVjQpCisKK3N0YXRpYyBpbnQKK3NldF9uZnN2NF9hY2xfb25lKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHBvc2l4X2FjbCAqcGFjbCwgY2hhciAqa2V5KQoreworCWludCBsZW47CisJc2l6ZV90IGJ1ZmxlbjsKKwljaGFyICpidWYgPSBOVUxMOworCWludCBlcnJvciA9IDA7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKworCWJ1ZmxlbiA9IHBvc2l4X2FjbF94YXR0cl9zaXplKHBhY2wtPmFfY291bnQpOworCWJ1ZiA9IGttYWxsb2MoYnVmbGVuLCBHRlBfS0VSTkVMKTsKKwllcnJvciA9IC1FTk9NRU07CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCWxlbiA9IHBvc2l4X2FjbF90b194YXR0cihwYWNsLCBidWYsIGJ1Zmxlbik7CisJaWYgKGxlbiA8IDApIHsKKwkJZXJyb3IgPSBsZW47CisJCWdvdG8gb3V0OworCX0KKworCWVycm9yID0gLUVPUE5PVFNVUFA7CisJaWYgKGlub2RlLT5pX29wICYmIGlub2RlLT5pX29wLT5zZXR4YXR0cikgeworCQlkb3duKCZpbm9kZS0+aV9zZW0pOworCQlzZWN1cml0eV9pbm9kZV9zZXR4YXR0cihkZW50cnksIGtleSwgYnVmLCBsZW4sIDApOworCQllcnJvciA9IGlub2RlLT5pX29wLT5zZXR4YXR0cihkZW50cnksIGtleSwgYnVmLCBsZW4sIDApOworCQlpZiAoIWVycm9yKQorCQkJc2VjdXJpdHlfaW5vZGVfcG9zdF9zZXR4YXR0cihkZW50cnksIGtleSwgYnVmLCBsZW4sIDApOworCQl1cCgmaW5vZGUtPmlfc2VtKTsKKwl9CitvdXQ6CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2ludAorbmZzZDRfc2V0X25mczRfYWNsKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZocCwKKyAgICBzdHJ1Y3QgbmZzNF9hY2wgKmFjbCkKK3sKKwlpbnQgZXJyb3I7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IHBvc2l4X2FjbCAqcGFjbCA9IE5VTEwsICpkcGFjbCA9IE5VTEw7CisJdW5zaWduZWQgaW50IGZsYWdzID0gMDsKKworCS8qIEdldCBpbm9kZSAqLworCWVycm9yID0gZmhfdmVyaWZ5KHJxc3RwLCBmaHAsIDAgLyogU19JRlJFRyAqLywgTUFZX1NBVFRSKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCisJZGVudHJ5ID0gZmhwLT5maF9kZW50cnk7CisJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCWZsYWdzID0gTkZTNF9BQ0xfRElSOworCisJZXJyb3IgPSBuZnM0X2FjbF9uZnN2NF90b19wb3NpeChhY2wsICZwYWNsLCAmZHBhY2wsIGZsYWdzKTsKKwlpZiAoZXJyb3IgPT0gLUVJTlZBTCkgeworCQllcnJvciA9IG5mc2Vycl9hdHRybm90c3VwcDsKKwkJZ290byBvdXQ7CisJfSBlbHNlIGlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0X25mc2VycjsKKworCWlmIChwYWNsKSB7CisJCWVycm9yID0gc2V0X25mc3Y0X2FjbF9vbmUoZGVudHJ5LCBwYWNsLCBYQVRUUl9OQU1FX0FDTF9BQ0NFU1MpOworCQlpZiAoZXJyb3IgPCAwKQorCQkJZ290byBvdXRfbmZzZXJyOworCX0KKworCWlmIChkcGFjbCkgeworCQllcnJvciA9IHNldF9uZnN2NF9hY2xfb25lKGRlbnRyeSwgZHBhY2wsIFhBVFRSX05BTUVfQUNMX0RFRkFVTFQpOworCQlpZiAoZXJyb3IgPCAwKQorCQkJZ290byBvdXRfbmZzZXJyOworCX0KKworCWVycm9yID0gbmZzX29rOworCitvdXQ6CisJcG9zaXhfYWNsX3JlbGVhc2UocGFjbCk7CisJcG9zaXhfYWNsX3JlbGVhc2UoZHBhY2wpOworCXJldHVybiAoZXJyb3IpOworb3V0X25mc2VycjoKKwllcnJvciA9IG5mc2Vycm5vKGVycm9yKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHN0cnVjdCBwb3NpeF9hY2wgKgorX2dldF9wb3NpeF9hY2woc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyICprZXkpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwljaGFyICpidWYgPSBOVUxMOworCWludCBidWZsZW4sIGVycm9yID0gMDsKKwlzdHJ1Y3QgcG9zaXhfYWNsICpwYWNsID0gTlVMTDsKKworCWVycm9yID0gLUVPUE5PVFNVUFA7CisJaWYgKGlub2RlLT5pX29wID09IE5VTEwpCisJCWdvdG8gb3V0X2VycjsKKwlpZiAoaW5vZGUtPmlfb3AtPmdldHhhdHRyID09IE5VTEwpCisJCWdvdG8gb3V0X2VycjsKKworCWVycm9yID0gc2VjdXJpdHlfaW5vZGVfZ2V0eGF0dHIoZGVudHJ5LCBrZXkpOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfZXJyOworCisJYnVmbGVuID0gaW5vZGUtPmlfb3AtPmdldHhhdHRyKGRlbnRyeSwga2V5LCBOVUxMLCAwKTsKKwlpZiAoYnVmbGVuIDw9IDApIHsKKwkJZXJyb3IgPSBidWZsZW4gPCAwID8gYnVmbGVuIDogLUVOT0RBVEE7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlidWYgPSBrbWFsbG9jKGJ1ZmxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKGJ1ZiA9PSBOVUxMKSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBvdXRfZXJyOworCX0KKworCWVycm9yID0gaW5vZGUtPmlfb3AtPmdldHhhdHRyKGRlbnRyeSwga2V5LCBidWYsIGJ1Zmxlbik7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXRfZXJyOworCisJcGFjbCA9IHBvc2l4X2FjbF9mcm9tX3hhdHRyKGJ1ZiwgYnVmbGVuKTsKKyBvdXQ6CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gcGFjbDsKKyBvdXRfZXJyOgorCXBhY2wgPSBFUlJfUFRSKGVycm9yKTsKKwlnb3RvIG91dDsKK30KKworaW50CituZnNkNF9nZXRfbmZzNF9hY2woc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmZzNF9hY2wgKiphY2wpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgZXJyb3IgPSAwOworCXN0cnVjdCBwb3NpeF9hY2wgKnBhY2wgPSBOVUxMLCAqZHBhY2wgPSBOVUxMOworCXVuc2lnbmVkIGludCBmbGFncyA9IDA7CisKKwlwYWNsID0gX2dldF9wb3NpeF9hY2woZGVudHJ5LCBYQVRUUl9OQU1FX0FDTF9BQ0NFU1MpOworCWlmIChJU19FUlIocGFjbCkgJiYgUFRSX0VSUihwYWNsKSA9PSAtRU5PREFUQSkKKwkJcGFjbCA9IHBvc2l4X2FjbF9mcm9tX21vZGUoaW5vZGUtPmlfbW9kZSwgR0ZQX0tFUk5FTCk7CisJaWYgKElTX0VSUihwYWNsKSkgeworCQllcnJvciA9IFBUUl9FUlIocGFjbCk7CisJCXBhY2wgPSBOVUxMOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgeworCQlkcGFjbCA9IF9nZXRfcG9zaXhfYWNsKGRlbnRyeSwgWEFUVFJfTkFNRV9BQ0xfREVGQVVMVCk7CisJCWlmIChJU19FUlIoZHBhY2wpICYmIFBUUl9FUlIoZHBhY2wpID09IC1FTk9EQVRBKQorCQkJZHBhY2wgPSBOVUxMOworCQllbHNlIGlmIChJU19FUlIoZHBhY2wpKSB7CisJCQllcnJvciA9IFBUUl9FUlIoZHBhY2wpOworCQkJZHBhY2wgPSBOVUxMOworCQkJZ290byBvdXQ7CisJCX0KKwkJZmxhZ3MgPSBORlM0X0FDTF9ESVI7CisJfQorCisJKmFjbCA9IG5mczRfYWNsX3Bvc2l4X3RvX25mc3Y0KHBhY2wsIGRwYWNsLCBmbGFncyk7CisJaWYgKElTX0VSUigqYWNsKSkgeworCQllcnJvciA9IFBUUl9FUlIoKmFjbCk7CisJCSphY2wgPSBOVUxMOworCX0KKyBvdXQ6CisJcG9zaXhfYWNsX3JlbGVhc2UocGFjbCk7CisJcG9zaXhfYWNsX3JlbGVhc2UoZHBhY2wpOworCXJldHVybiBlcnJvcjsKK30KKworI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX05GU19WNCkgKi8KKworI2lmZGVmIENPTkZJR19ORlNEX1YzCisvKgorICogQ2hlY2sgc2VydmVyIGFjY2VzcyByaWdodHMgdG8gYSBmaWxlIHN5c3RlbSBvYmplY3QKKyAqLworc3RydWN0IGFjY2Vzc21hcCB7CisJdTMyCQlhY2Nlc3M7CisJaW50CQlob3c7Cit9Oworc3RhdGljIHN0cnVjdCBhY2Nlc3NtYXAJbmZzM19yZWdhY2Nlc3NbXSA9IHsKKyAgICB7CU5GUzNfQUNDRVNTX1JFQUQsCU1BWV9SRUFECQkJfSwKKyAgICB7CU5GUzNfQUNDRVNTX0VYRUNVVEUsCU1BWV9FWEVDCQkJfSwKKyAgICB7CU5GUzNfQUNDRVNTX01PRElGWSwJTUFZX1dSSVRFfE1BWV9UUlVOQwkJfSwKKyAgICB7CU5GUzNfQUNDRVNTX0VYVEVORCwJTUFZX1dSSVRFCQkJfSwKKworICAgIHsJMCwJCQkwCQkJCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgYWNjZXNzbWFwCW5mczNfZGlyYWNjZXNzW10gPSB7CisgICAgewlORlMzX0FDQ0VTU19SRUFELAlNQVlfUkVBRAkJCX0sCisgICAgewlORlMzX0FDQ0VTU19MT09LVVAsCU1BWV9FWEVDCQkJfSwKKyAgICB7CU5GUzNfQUNDRVNTX01PRElGWSwJTUFZX0VYRUN8TUFZX1dSSVRFfE1BWV9UUlVOQwl9LAorICAgIHsJTkZTM19BQ0NFU1NfRVhURU5ELAlNQVlfRVhFQ3xNQVlfV1JJVEUJCX0sCisgICAgewlORlMzX0FDQ0VTU19ERUxFVEUsCU1BWV9SRU1PVkUJCQl9LAorCisgICAgewkwLAkJCTAJCQkJfQorfTsKKworc3RhdGljIHN0cnVjdCBhY2Nlc3NtYXAJbmZzM19hbnlhY2Nlc3NbXSA9IHsKKwkvKiBTb21lIGNsaWVudHMgLSBTb2xhcmlzIDIuNiBhdCBsZWFzdCwgbWFrZSBhbiBhY2Nlc3MgY2FsbAorCSAqIHRvIHRoZSBzZXJ2ZXIgdG8gY2hlY2sgZm9yIGFjY2VzcyBmb3IgdGhpbmdzIGxpa2UgL2Rldi9udWxsCisJICogKHdoaWNoIHJlYWxseSwgdGhlIHNlcnZlciBkb2Vzbid0IGNhcmUgYWJvdXQpLiAgU28KKwkgKiBXZSBwcm92aWRlIHNpbXBsZSBhY2Nlc3MgY2hlY2tpbmcgZm9yIHRoZW0sIGxvb2tpbmcKKwkgKiBtYWlubHkgYXQgbW9kZSBiaXRzLCBhbmQgd2UgbWFrZSBzdXJlIHRvIGlnbm9yZSByZWFkLW9ubHkKKwkgKiBmaWxlc3lzdGVtIGNoZWNrcworCSAqLworICAgIHsJTkZTM19BQ0NFU1NfUkVBRCwJTUFZX1JFQUQJCQl9LAorICAgIHsJTkZTM19BQ0NFU1NfRVhFQ1VURSwJTUFZX0VYRUMJCQl9LAorICAgIHsJTkZTM19BQ0NFU1NfTU9ESUZZLAlNQVlfV1JJVEV8TUFZX0xPQ0FMX0FDQ0VTUwl9LAorICAgIHsJTkZTM19BQ0NFU1NfRVhURU5ELAlNQVlfV1JJVEV8TUFZX0xPQ0FMX0FDQ0VTUwl9LAorCisgICAgewkwLAkJCTAJCQkJfQorfTsKKworaW50CituZnNkX2FjY2VzcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIHUzMiAqYWNjZXNzLCB1MzIgKnN1cHBvcnRlZCkKK3sKKwlzdHJ1Y3QgYWNjZXNzbWFwCSptYXA7CisJc3RydWN0IHN2Y19leHBvcnQJKmV4cG9ydDsKKwlzdHJ1Y3QgZGVudHJ5CQkqZGVudHJ5OworCXUzMgkJCXF1ZXJ5LCByZXN1bHQgPSAwLCBzcmVzdWx0ID0gMDsKKwl1bnNpZ25lZCBpbnQJCWVycm9yOworCisJZXJyb3IgPSBmaF92ZXJpZnkocnFzdHAsIGZocCwgMCwgTUFZX05PUCk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKworCWV4cG9ydCA9IGZocC0+ZmhfZXhwb3J0OworCWRlbnRyeSA9IGZocC0+ZmhfZGVudHJ5OworCisJaWYgKFNfSVNSRUcoZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKQorCQltYXAgPSBuZnMzX3JlZ2FjY2VzczsKKwllbHNlIGlmIChTX0lTRElSKGRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlKSkKKwkJbWFwID0gbmZzM19kaXJhY2Nlc3M7CisJZWxzZQorCQltYXAgPSBuZnMzX2FueWFjY2VzczsKKworCisJcXVlcnkgPSAqYWNjZXNzOworCWZvciAgKDsgbWFwLT5hY2Nlc3M7IG1hcCsrKSB7CisJCWlmIChtYXAtPmFjY2VzcyAmIHF1ZXJ5KSB7CisJCQl1bnNpZ25lZCBpbnQgZXJyMjsKKworCQkJc3Jlc3VsdCB8PSBtYXAtPmFjY2VzczsKKworCQkJZXJyMiA9IG5mc2RfcGVybWlzc2lvbihleHBvcnQsIGRlbnRyeSwgbWFwLT5ob3cpOworCQkJc3dpdGNoIChlcnIyKSB7CisJCQljYXNlIG5mc19vazoKKwkJCQlyZXN1bHQgfD0gbWFwLT5hY2Nlc3M7CisJCQkJYnJlYWs7CisJCQkJCisJCQkvKiB0aGUgZm9sbG93aW5nIGVycm9yIGNvZGVzIGp1c3QgbWVhbiB0aGUgYWNjZXNzIHdhcyBub3QgYWxsb3dlZCwKKwkJCSAqIHJhdGhlciB0aGFuIGFuIGVycm9yIG9jY3VycmVkICovCisJCQljYXNlIG5mc2Vycl9yb2ZzOgorCQkJY2FzZSBuZnNlcnJfYWNjZXM6CisJCQljYXNlIG5mc2Vycl9wZXJtOgorCQkJCS8qIHNpbXBseSBkb24ndCAib3IiIGluIHRoZSBhY2Nlc3MgYml0LiAqLworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQllcnJvciA9IGVycjI7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwl9CisJKmFjY2VzcyA9IHJlc3VsdDsKKwlpZiAoc3VwcG9ydGVkKQorCQkqc3VwcG9ydGVkID0gc3Jlc3VsdDsKKworIG91dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisjZW5kaWYgLyogQ09ORklHX05GU0RfVjMgKi8KKworCisKKy8qCisgKiBPcGVuIGFuIGV4aXN0aW5nIGZpbGUgb3IgZGlyZWN0b3J5LgorICogVGhlIGFjY2VzcyBhcmd1bWVudCBpbmRpY2F0ZXMgdGhlIHR5cGUgb2Ygb3BlbiAocmVhZC93cml0ZS9sb2NrKQorICogTi5CLiBBZnRlciB0aGlzIGNhbGwgZmhwIG5lZWRzIGFuIGZoX3B1dAorICovCitpbnQKK25mc2Rfb3BlbihzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIGludCB0eXBlLAorCQkJaW50IGFjY2Vzcywgc3RydWN0IGZpbGUgKipmaWxwKQoreworCXN0cnVjdCBkZW50cnkJKmRlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlOworCWludAkJZmxhZ3MgPSBPX1JET05MWXxPX0xBUkdFRklMRSwgZXJyOworCisJLyoKKwkgKiBJZiB3ZSBnZXQgaGVyZSwgdGhlbiB0aGUgY2xpZW50IGhhcyBhbHJlYWR5IGRvbmUgYW4gIm9wZW4iLAorCSAqIGFuZCAoaG9wZWZ1bGx5KSBjaGVja2VkIHBlcm1pc3Npb24gLSBzbyBhbGxvdyBPV05FUl9PVkVSUklERQorCSAqIGluIGNhc2UgYSBjaG1vZCBoYXMgbm93IHJldm9rZWQgcGVybWlzc2lvbi4KKwkgKi8KKwllcnIgPSBmaF92ZXJpZnkocnFzdHAsIGZocCwgdHlwZSwgYWNjZXNzIHwgTUFZX09XTkVSX09WRVJSSURFKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWRlbnRyeSA9IGZocC0+ZmhfZGVudHJ5OworCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCisJLyogRGlzYWxsb3cgd3JpdGUgYWNjZXNzIHRvIGZpbGVzIHdpdGggdGhlIGFwcGVuZC1vbmx5IGJpdCBzZXQKKwkgKiBvciBhbnkgYWNjZXNzIHdoZW4gbWFuZGF0b3J5IGxvY2tpbmcgZW5hYmxlZAorCSAqLworCWVyciA9IG5mc2Vycl9wZXJtOworCWlmIChJU19BUFBFTkQoaW5vZGUpICYmIChhY2Nlc3MgJiBNQVlfV1JJVEUpKQorCQlnb3RvIG91dDsKKwlpZiAoSVNfSVNNTkRMSyhpbm9kZSkpCisJCWdvdG8gb3V0OworCisJaWYgKCFpbm9kZS0+aV9mb3ApCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBDaGVjayB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBsZWFzZXMgb24gdGhpcyBmaWxlLgorCSAqIFRoaXMgbWF5IGJsb2NrIHdoaWxlIGxlYXNlcyBhcmUgYnJva2VuLgorCSAqLworCWVyciA9IGJyZWFrX2xlYXNlKGlub2RlLCBPX05PTkJMT0NLIHwgKChhY2Nlc3MgJiBNQVlfV1JJVEUpID8gRk1PREVfV1JJVEUgOiAwKSk7CisJaWYgKGVyciA9PSAtRVdPVUxEQkxPQ0spCisJCWVyciA9IC1FVElNRURPVVQ7CisJaWYgKGVycikgLyogTk9NRU0gb3IgV09VTERCTE9DSyAqLworCQlnb3RvIG91dF9uZnNlcnI7CisKKwlpZiAoYWNjZXNzICYgTUFZX1dSSVRFKSB7CisJCWZsYWdzID0gT19XUk9OTFl8T19MQVJHRUZJTEU7CisKKwkJRFFVT1RfSU5JVChpbm9kZSk7CisJfQorCSpmaWxwID0gZGVudHJ5X29wZW4oZGdldChkZW50cnkpLCBtbnRnZXQoZmhwLT5maF9leHBvcnQtPmV4X21udCksIGZsYWdzKTsKKwlpZiAoSVNfRVJSKCpmaWxwKSkKKwkJZXJyID0gUFRSX0VSUigqZmlscCk7CitvdXRfbmZzZXJyOgorCWlmIChlcnIpCisJCWVyciA9IG5mc2Vycm5vKGVycik7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIENsb3NlIGEgZmlsZS4KKyAqLwordm9pZAorbmZzZF9jbG9zZShzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlmcHV0KGZpbHApOworfQorCisvKgorICogU3luYyBhIGZpbGUKKyAqIEFzIHRoaXMgY2FsbHMgZnN5bmMgKG5vdCBmZGF0YXN5bmMpIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGEgd3JpdGVfaW5vZGUKKyAqIGFmdGVyIGl0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbmZzZF9kb3N5bmMoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBkZW50cnkgKmRwLAorCQkJICAgICAgIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZHAtPmRfaW5vZGU7CisJaW50ICgqZnN5bmMpIChzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCk7CisKKwlmaWxlbWFwX2ZkYXRhd3JpdGUoaW5vZGUtPmlfbWFwcGluZyk7CisJaWYgKGZvcCAmJiAoZnN5bmMgPSBmb3AtPmZzeW5jKSkKKwkJZnN5bmMoZmlscCwgZHAsIDApOworCWZpbGVtYXBfZmRhdGF3YWl0KGlub2RlLT5pX21hcHBpbmcpOworfQorCQorCitzdGF0aWMgdm9pZAorbmZzZF9zeW5jKHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlkcHJpbnRrKCJuZnNkOiBzeW5jIGZpbGUgJXNcbiIsIGZpbHAtPmZfZGVudHJ5LT5kX25hbWUubmFtZSk7CisJZG93bigmaW5vZGUtPmlfc2VtKTsKKwluZnNkX2Rvc3luYyhmaWxwLCBmaWxwLT5mX2RlbnRyeSwgZmlscC0+Zl9vcCk7CisJdXAoJmlub2RlLT5pX3NlbSk7Cit9CisKK3N0YXRpYyB2b2lkCituZnNkX3N5bmNfZGlyKHN0cnVjdCBkZW50cnkgKmRwKQoreworCW5mc2RfZG9zeW5jKE5VTEwsIGRwLCBkcC0+ZF9pbm9kZS0+aV9mb3ApOworfQorCisvKgorICogT2J0YWluIHRoZSByZWFkYWhlYWQgcGFyYW1ldGVycyBmb3IgdGhlIGZpbGUKKyAqIHNwZWNpZmllZCBieSAoZGV2LCBpbm8pLgorICovCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJhX2xvY2spOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCByYXBhcm1zICoKK25mc2RfZ2V0X3JhcGFybXMoZGV2X3QgZGV2LCBpbm9fdCBpbm8pCit7CisJc3RydWN0IHJhcGFybXMJKnJhLCAqKnJhcCwgKipmcmFwID0gTlVMTDsKKwlpbnQgZGVwdGggPSAwOworCisJc3Bpbl9sb2NrKCZyYV9sb2NrKTsKKwlmb3IgKHJhcCA9ICZyYXBhcm1fY2FjaGU7IChyYSA9ICpyYXApOyByYXAgPSAmcmEtPnBfbmV4dCkgeworCQlpZiAocmEtPnBfaW5vID09IGlubyAmJiByYS0+cF9kZXYgPT0gZGV2KQorCQkJZ290byBmb3VuZDsKKwkJZGVwdGgrKzsKKwkJaWYgKHJhLT5wX2NvdW50ID09IDApCisJCQlmcmFwID0gcmFwOworCX0KKwlkZXB0aCA9IG5mc2RzdGF0cy5yYV9zaXplKjExLzEwOworCWlmICghZnJhcCkgewkKKwkJc3Bpbl91bmxvY2soJnJhX2xvY2spOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmFwID0gZnJhcDsKKwlyYSA9ICpmcmFwOworCXJhLT5wX2RldiA9IGRldjsKKwlyYS0+cF9pbm8gPSBpbm87CisJcmEtPnBfc2V0ID0gMDsKK2ZvdW5kOgorCWlmIChyYXAgIT0gJnJhcGFybV9jYWNoZSkgeworCQkqcmFwID0gcmEtPnBfbmV4dDsKKwkJcmEtPnBfbmV4dCAgID0gcmFwYXJtX2NhY2hlOworCQlyYXBhcm1fY2FjaGUgPSByYTsKKwl9CisJcmEtPnBfY291bnQrKzsKKwluZnNkc3RhdHMucmFfZGVwdGhbZGVwdGgqMTAvbmZzZHN0YXRzLnJhX3NpemVdKys7CisJc3Bpbl91bmxvY2soJnJhX2xvY2spOworCXJldHVybiByYTsKK30KKworLyoKKyAqIEdyYWIgYW5kIGtlZXAgY2FjaGVkIHBhZ2VzIGFzc29zaWF0ZWQgd2l0aCBhIGZpbGUgaW4gdGhlIHN2Y19ycXN0CisgKiBzbyB0aGF0IHRoZXkgY2FuIGJlIHBhc3NlZCB0byB0aGUgbmV0b3dvcmsgc2VuZG1zZy9zZW5kcGFnZSByb3V0aW5lcworICogZGlyZWN0cmx5LiBUaGV5IHdpbGwgYmUgcmVsZWFzZWQgYWZ0ZXIgdGhlIHNlbmRpbmcgaGFzIGNvbXBsZXRlZC4KKyAqLworc3RhdGljIGludAorbmZzZF9yZWFkX2FjdG9yKHJlYWRfZGVzY3JpcHRvcl90ICpkZXNjLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQgLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBjb3VudCA9IGRlc2MtPmNvdW50OworCXN0cnVjdCBzdmNfcnFzdCAqcnFzdHAgPSBkZXNjLT5hcmcuZGF0YTsKKworCWlmIChzaXplID4gY291bnQpCisJCXNpemUgPSBjb3VudDsKKworCWlmIChycXN0cC0+cnFfcmVzLnBhZ2VfbGVuID09IDApIHsKKwkJZ2V0X3BhZ2UocGFnZSk7CisJCXJxc3RwLT5ycV9yZXNwYWdlc1tycXN0cC0+cnFfcmVzdXNlZCsrXSA9IHBhZ2U7CisJCXJxc3RwLT5ycV9yZXMucGFnZV9iYXNlID0gb2Zmc2V0OworCQlycXN0cC0+cnFfcmVzLnBhZ2VfbGVuID0gc2l6ZTsKKwl9IGVsc2UgaWYgKHBhZ2UgIT0gcnFzdHAtPnJxX3Jlc3BhZ2VzW3Jxc3RwLT5ycV9yZXN1c2VkLTFdKSB7CisJCWdldF9wYWdlKHBhZ2UpOworCQlycXN0cC0+cnFfcmVzcGFnZXNbcnFzdHAtPnJxX3Jlc3VzZWQrK10gPSBwYWdlOworCQlycXN0cC0+cnFfcmVzLnBhZ2VfbGVuICs9IHNpemU7CisJfSBlbHNlIHsKKwkJcnFzdHAtPnJxX3Jlcy5wYWdlX2xlbiArPSBzaXplOworCX0KKworCWRlc2MtPmNvdW50ID0gY291bnQgLSBzaXplOworCWRlc2MtPndyaXR0ZW4gKz0gc2l6ZTsKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK25mc2RfdmZzX3JlYWQoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmhwLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKyAgICAgICAgICAgICAgbG9mZl90IG9mZnNldCwgc3RydWN0IGt2ZWMgKnZlYywgaW50IHZsZW4sIHVuc2lnbmVkIGxvbmcgKmNvdW50KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IHJhcGFybXMJKnJhOworCW1tX3NlZ21lbnRfdAlvbGRmczsKKwlpbnQJCWVycjsKKworCWVyciA9IG5mc2Vycl9wZXJtOworCWlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisjaWZkZWYgTVNORlMKKwlpZiAoKGZocC0+ZmhfZXhwb3J0LT5leF9mbGFncyAmIE5GU0VYUF9NU05GUykgJiYKKwkJKCFsb2NrX21heV9yZWFkKGlub2RlLCBvZmZzZXQsICpjb3VudCkpKQorCQlnb3RvIG91dDsKKyNlbmRpZgorCisJLyogR2V0IHJlYWRhaGVhZCBwYXJhbWV0ZXJzICovCisJcmEgPSBuZnNkX2dldF9yYXBhcm1zKGlub2RlLT5pX3NiLT5zX2RldiwgaW5vZGUtPmlfaW5vKTsKKworCWlmIChyYSAmJiByYS0+cF9zZXQpCisJCWZpbGUtPmZfcmEgPSByYS0+cF9yYTsKKworCWlmIChmaWxlLT5mX29wLT5zZW5kZmlsZSkgeworCQlzdmNfcHVzaGJhY2tfdW51c2VkX3BhZ2VzKHJxc3RwKTsKKwkJZXJyID0gZmlsZS0+Zl9vcC0+c2VuZGZpbGUoZmlsZSwgJm9mZnNldCwgKmNvdW50LAorCQkJCQkJIG5mc2RfcmVhZF9hY3RvciwgcnFzdHApOworCX0gZWxzZSB7CisJCW9sZGZzID0gZ2V0X2ZzKCk7CisJCXNldF9mcyhLRVJORUxfRFMpOworCQllcnIgPSB2ZnNfcmVhZHYoZmlsZSwgKHN0cnVjdCBpb3ZlYyBfX3VzZXIgKil2ZWMsIHZsZW4sICZvZmZzZXQpOworCQlzZXRfZnMob2xkZnMpOworCX0KKworCS8qIFdyaXRlIGJhY2sgcmVhZGFoZWFkIHBhcmFtcyAqLworCWlmIChyYSkgeworCQlzcGluX2xvY2soJnJhX2xvY2spOworCQlyYS0+cF9yYSA9IGZpbGUtPmZfcmE7CisJCXJhLT5wX3NldCA9IDE7CisJCXJhLT5wX2NvdW50LS07CisJCXNwaW5fdW5sb2NrKCZyYV9sb2NrKTsKKwl9CisKKwlpZiAoZXJyID49IDApIHsKKwkJbmZzZHN0YXRzLmlvX3JlYWQgKz0gZXJyOworCQkqY291bnQgPSBlcnI7CisJCWVyciA9IDA7CisJCWRub3RpZnlfcGFyZW50KGZpbGUtPmZfZGVudHJ5LCBETl9BQ0NFU1MpOworCX0gZWxzZSAKKwkJZXJyID0gbmZzZXJybm8oZXJyKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW5saW5lIGludAorbmZzZF92ZnNfd3JpdGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmhwLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQlsb2ZmX3Qgb2Zmc2V0LCBzdHJ1Y3Qga3ZlYyAqdmVjLCBpbnQgdmxlbiwKKwkgICAJCQl1bnNpZ25lZCBsb25nIGNudCwgaW50ICpzdGFibGVwKQoreworCXN0cnVjdCBzdmNfZXhwb3J0CSpleHA7CisJc3RydWN0IGRlbnRyeQkJKmRlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZTsKKwltbV9zZWdtZW50X3QJCW9sZGZzOworCWludAkJCWVyciA9IDA7CisJaW50CQkJc3RhYmxlID0gKnN0YWJsZXA7CisKKwllcnIgPSBuZnNlcnJfcGVybTsKKworI2lmZGVmIE1TTkZTCisJaWYgKChmaHAtPmZoX2V4cG9ydC0+ZXhfZmxhZ3MgJiBORlNFWFBfTVNORlMpICYmCisJCSghbG9ja19tYXlfd3JpdGUoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUsIG9mZnNldCwgY250KSkpCisJCWdvdG8gb3V0OworI2VuZGlmCisKKwlkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlleHAgICA9IGZocC0+ZmhfZXhwb3J0OworCisJLyoKKwkgKiBSZXF1ZXN0IHN5bmMgd3JpdGVzIGlmCisJICogIC0JdGhlIHN5bmMgZXhwb3J0IG9wdGlvbiBoYXMgYmVlbiBzZXQsIG9yCisJICogIC0JdGhlIGNsaWVudCByZXF1ZXN0ZWQgT19TWU5DIGJlaGF2aW9yIChORlN2MyBmZWF0dXJlKS4KKwkgKiAgLSAgIFRoZSBmaWxlIHN5c3RlbSBkb2Vzbid0IHN1cHBvcnQgZnN5bmMoKS4KKwkgKiBXaGVuIGdhdGhlcmVkIHdyaXRlcyBoYXZlIGJlZW4gY29uZmlndXJlZCBmb3IgdGhpcyB2b2x1bWUsCisJICogZmx1c2hpbmcgdGhlIGRhdGEgdG8gZGlzayBpcyBoYW5kbGVkIHNlcGFyYXRlbHkgYmVsb3cuCisJICovCisKKwlpZiAoZmlsZS0+Zl9vcC0+ZnN5bmMgPT0gMCkgey8qIENPTU1JVDMgY2Fubm90IHdvcmsgKi8KKwkgICAgICAgc3RhYmxlID0gMjsKKwkgICAgICAgKnN0YWJsZXAgPSAyOyAvKiBGSUxFX1NZTkMgKi8KKwl9CisKKwlpZiAoIUVYX0lTU1lOQyhleHApKQorCQlzdGFibGUgPSAwOworCWlmIChzdGFibGUgJiYgIUVYX1dHQVRIRVIoZXhwKSkKKwkJZmlsZS0+Zl9mbGFncyB8PSBPX1NZTkM7CisKKwkvKiBXcml0ZSB0aGUgZGF0YS4gKi8KKwlvbGRmcyA9IGdldF9mcygpOyBzZXRfZnMoS0VSTkVMX0RTKTsKKwllcnIgPSB2ZnNfd3JpdGV2KGZpbGUsIChzdHJ1Y3QgaW92ZWMgX191c2VyICopdmVjLCB2bGVuLCAmb2Zmc2V0KTsKKwlzZXRfZnMob2xkZnMpOworCWlmIChlcnIgPj0gMCkgeworCQluZnNkc3RhdHMuaW9fd3JpdGUgKz0gY250OworCQlkbm90aWZ5X3BhcmVudChmaWxlLT5mX2RlbnRyeSwgRE5fTU9ESUZZKTsKKwl9CisKKwkvKiBjbGVhciBzZXR1aWQvc2V0Z2lkIGZsYWcgYWZ0ZXIgd3JpdGUgKi8KKwlpZiAoZXJyID49IDAgJiYgKGlub2RlLT5pX21vZGUgJiAoU19JU1VJRCB8IFNfSVNHSUQpKSkgeworCQlzdHJ1Y3QgaWF0dHIJaWE7CisJCWlhLmlhX3ZhbGlkID0gQVRUUl9LSUxMX1NVSUQgfCBBVFRSX0tJTExfU0dJRDsKKworCQlkb3duKCZpbm9kZS0+aV9zZW0pOworCQlub3RpZnlfY2hhbmdlKGRlbnRyeSwgJmlhKTsKKwkJdXAoJmlub2RlLT5pX3NlbSk7CisJfQorCisJaWYgKGVyciA+PSAwICYmIHN0YWJsZSkgeworCQlzdGF0aWMgaW5vX3QJbGFzdF9pbm87CisJCXN0YXRpYyBkZXZfdAlsYXN0X2RldjsKKworCQkvKgorCQkgKiBHYXRoZXJlZCB3cml0ZXM6IElmIGFub3RoZXIgcHJvY2VzcyBpcyBjdXJyZW50bHkKKwkJICogd3JpdGluZyB0byB0aGUgZmlsZSwgdGhlcmUncyBhIGhpZ2ggY2hhbmNlCisJCSAqIHRoaXMgaXMgYW5vdGhlciBuZnNkICh0cmlnZ2VyZWQgYnkgYSBidWxrIHdyaXRlCisJCSAqIGZyb20gYSBjbGllbnQncyBiaW9kKS4gUmF0aGVyIHRoYW4gc3luY2luZyB0aGUKKwkJICogZmlsZSB3aXRoIGVhY2ggd3JpdGUgcmVxdWVzdCwgd2Ugc2xlZXAgZm9yIDEwIG1zZWMuCisJCSAqCisJCSAqIEkgZG9uJ3Qga25vdyBpZiB0aGlzIHJvdWdobHkgYXBwcm94aW1hdGVzCisJCSAqIEMuIEp1c3phaydzIGlkZWEgb2YgZ2F0aGVyZWQgd3JpdGVzLCBidXQgaXQncyBhCisJCSAqIG5pY2UgYW5kIHNpbXBsZSBzb2x1dGlvbiAoSU1ITyksIGFuZCBpdCBzZWVtcyB0bworCQkgKiB3b3JrOi0pCisJCSAqLworCQlpZiAoRVhfV0dBVEhFUihleHApKSB7CisJCQlpZiAoYXRvbWljX3JlYWQoJmlub2RlLT5pX3dyaXRlY291bnQpID4gMQorCQkJICAgIHx8IChsYXN0X2lubyA9PSBpbm9kZS0+aV9pbm8gJiYgbGFzdF9kZXYgPT0gaW5vZGUtPmlfc2ItPnNfZGV2KSkgeworCQkJCWRwcmludGsoIm5mc2Q6IHdyaXRlIGRlZmVyICVkXG4iLCBjdXJyZW50LT5waWQpOworCQkJCW1zbGVlcCgxMCk7CisJCQkJZHByaW50aygibmZzZDogd3JpdGUgcmVzdW1lICVkXG4iLCBjdXJyZW50LT5waWQpOworCQkJfQorCisJCQlpZiAoaW5vZGUtPmlfc3RhdGUgJiBJX0RJUlRZKSB7CisJCQkJZHByaW50aygibmZzZDogd3JpdGUgc3luYyAlZFxuIiwgY3VycmVudC0+cGlkKTsKKwkJCQluZnNkX3N5bmMoZmlsZSk7CisJCQl9CisjaWYgMAorCQkJd2FrZV91cCgmaW5vZGUtPmlfd2FpdCk7CisjZW5kaWYKKwkJfQorCQlsYXN0X2lubyA9IGlub2RlLT5pX2lubzsKKwkJbGFzdF9kZXYgPSBpbm9kZS0+aV9zYi0+c19kZXY7CisJfQorCisJZHByaW50aygibmZzZDogd3JpdGUgY29tcGxldGUgZXJyPSVkXG4iLCBlcnIpOworCWlmIChlcnIgPj0gMCkKKwkJZXJyID0gMDsKKwllbHNlIAorCQllcnIgPSBuZnNlcnJubyhlcnIpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBSZWFkIGRhdGEgZnJvbSBhIGZpbGUuIGNvdW50IG11c3QgY29udGFpbiB0aGUgcmVxdWVzdGVkIHJlYWQgY291bnQKKyAqIG9uIGVudHJ5LiBPbiByZXR1cm4sICpjb3VudCBjb250YWlucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQuCisgKiBOLkIuIEFmdGVyIHRoaXMgY2FsbCBmaHAgbmVlZHMgYW4gZmhfcHV0CisgKi8KK2ludAorbmZzZF9yZWFkKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZocCwgc3RydWN0IGZpbGUgKmZpbGUsCisJCWxvZmZfdCBvZmZzZXQsIHN0cnVjdCBrdmVjICp2ZWMsIGludCB2bGVuLAorCQl1bnNpZ25lZCBsb25nICpjb3VudCkKK3sKKwlpbnQJCWVycjsKKworCWlmIChmaWxlKSB7CisJCWVyciA9IG5mc2RfcGVybWlzc2lvbihmaHAtPmZoX2V4cG9ydCwgZmhwLT5maF9kZW50cnksCisJCQkJTUFZX1JFQUR8TUFZX09XTkVSX09WRVJSSURFKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCQllcnIgPSBuZnNkX3Zmc19yZWFkKHJxc3RwLCBmaHAsIGZpbGUsIG9mZnNldCwgdmVjLCB2bGVuLCBjb3VudCk7CisJfSBlbHNlIHsKKwkJZXJyID0gbmZzZF9vcGVuKHJxc3RwLCBmaHAsIFNfSUZSRUcsIE1BWV9SRUFELCAmZmlsZSk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwkJZXJyID0gbmZzZF92ZnNfcmVhZChycXN0cCwgZmhwLCBmaWxlLCBvZmZzZXQsIHZlYywgdmxlbiwgY291bnQpOworCQluZnNkX2Nsb3NlKGZpbGUpOworCX0KK291dDoKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogV3JpdGUgZGF0YSB0byBhIGZpbGUuCisgKiBUaGUgc3RhYmxlIGZsYWcgcmVxdWVzdHMgc3luY2hyb25vdXMgd3JpdGVzLgorICogTi5CLiBBZnRlciB0aGlzIGNhbGwgZmhwIG5lZWRzIGFuIGZoX3B1dAorICovCitpbnQKK25mc2Rfd3JpdGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmhwLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJbG9mZl90IG9mZnNldCwgc3RydWN0IGt2ZWMgKnZlYywgaW50IHZsZW4sIHVuc2lnbmVkIGxvbmcgY250LAorCQlpbnQgKnN0YWJsZXApCit7CisJaW50CQkJZXJyID0gMDsKKworCWlmIChmaWxlKSB7CisJCWVyciA9IG5mc2RfcGVybWlzc2lvbihmaHAtPmZoX2V4cG9ydCwgZmhwLT5maF9kZW50cnksCisJCQkJTUFZX1dSSVRFfE1BWV9PV05FUl9PVkVSUklERSk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwkJZXJyID0gbmZzZF92ZnNfd3JpdGUocnFzdHAsIGZocCwgZmlsZSwgb2Zmc2V0LCB2ZWMsIHZsZW4sIGNudCwKKwkJCQlzdGFibGVwKTsKKwl9IGVsc2UgeworCQllcnIgPSBuZnNkX29wZW4ocnFzdHAsIGZocCwgU19JRlJFRywgTUFZX1dSSVRFLCAmZmlsZSk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKworCQlpZiAoY250KQorCQkJZXJyID0gbmZzZF92ZnNfd3JpdGUocnFzdHAsIGZocCwgZmlsZSwgb2Zmc2V0LCB2ZWMsIHZsZW4sCisJCQkJCSAgICAgY250LCBzdGFibGVwKTsKKwkJbmZzZF9jbG9zZShmaWxlKTsKKwl9CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworI2lmZGVmIENPTkZJR19ORlNEX1YzCisvKgorICogQ29tbWl0IGFsbCBwZW5kaW5nIHdyaXRlcyB0byBzdGFibGUgc3RvcmFnZS4KKyAqIFN0cmljdGx5IHNwZWFraW5nLCB3ZSBjb3VsZCBzeW5jIGp1c3QgdGhlIGluZGljYXRlZCBmaWxlIHJlZ2lvbiBoZXJlLAorICogYnV0IHRoZXJlJ3MgY3VycmVudGx5IG5vIHdheSB3ZSBjYW4gYXNrIHRoZSBWRlMgdG8gZG8gc28uCisgKgorICogVW5mb3J0dW5hdGVseSB3ZSBjYW5ub3QgbG9jayB0aGUgZmlsZSB0byBtYWtlIHN1cmUgd2UgcmV0dXJuIGZ1bGwgV0NDCisgKiBkYXRhIHRvIHRoZSBjbGllbnQsIGFzIGxvY2tpbmcgaGFwcGVucyBsb3dlciBkb3duIGluIHRoZSBmaWxlc3lzdGVtLgorICovCitpbnQKK25mc2RfY29tbWl0KHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZocCwKKyAgICAgICAgICAgICAgIGxvZmZfdCBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJc3RydWN0IGZpbGUJKmZpbGU7CisJaW50CQllcnI7CisKKwlpZiAoKHU2NCljb3VudCA+IH4odTY0KW9mZnNldCkKKwkJcmV0dXJuIG5mc2Vycl9pbnZhbDsKKworCWlmICgoZXJyID0gbmZzZF9vcGVuKHJxc3RwLCBmaHAsIFNfSUZSRUcsIE1BWV9XUklURSwgJmZpbGUpKSAhPSAwKQorCQlyZXR1cm4gZXJyOworCWlmIChFWF9JU1NZTkMoZmhwLT5maF9leHBvcnQpKSB7CisJCWlmIChmaWxlLT5mX29wICYmIGZpbGUtPmZfb3AtPmZzeW5jKSB7CisJCQluZnNkX3N5bmMoZmlsZSk7CisJCX0gZWxzZSB7CisJCQllcnIgPSBuZnNlcnJfbm90c3VwcDsKKwkJfQorCX0KKworCW5mc2RfY2xvc2UoZmlsZSk7CisJcmV0dXJuIGVycjsKK30KKyNlbmRpZiAvKiBDT05GSUdfTkZTRF9WMyAqLworCisvKgorICogQ3JlYXRlIGEgZmlsZSAocmVndWxhciwgZGlyZWN0b3J5LCBkZXZpY2UsIGZpZm8pOyBVTklYIHNvY2tldHMgCisgKiBub3QgeWV0IGltcGxlbWVudGVkLgorICogSWYgdGhlIHJlc3BvbnNlIGZoIGhhcyBiZWVuIHZlcmlmaWVkLCB0aGUgcGFyZW50IGRpcmVjdG9yeSBzaG91bGQKKyAqIGFscmVhZHkgYmUgbG9ja2VkLiBOb3RlIHRoYXQgdGhlIHBhcmVudCBkaXJlY3RvcnkgaXMgbGVmdCBsb2NrZWQuCisgKgorICogTi5CLiBFdmVyeSBjYWxsIHRvIG5mc2RfY3JlYXRlIG5lZWRzIGFuIGZoX3B1dCBmb3IgX2JvdGhfIGZocCBhbmQgcmVzZmhwCisgKi8KK2ludAorbmZzZF9jcmVhdGUoc3RydWN0IHN2Y19ycXN0ICpycXN0cCwgc3RydWN0IHN2Y19maCAqZmhwLAorCQljaGFyICpmbmFtZSwgaW50IGZsZW4sIHN0cnVjdCBpYXR0ciAqaWFwLAorCQlpbnQgdHlwZSwgZGV2X3QgcmRldiwgc3RydWN0IHN2Y19maCAqcmVzZmhwKQoreworCXN0cnVjdCBkZW50cnkJKmRlbnRyeSwgKmRjaGlsZCA9IE5VTEw7CisJc3RydWN0IGlub2RlCSpkaXJwOworCWludAkJZXJyOworCisJZXJyID0gbmZzZXJyX3Blcm07CisJaWYgKCFmbGVuKQorCQlnb3RvIG91dDsKKwllcnIgPSBuZnNlcnJfZXhpc3Q7CisJaWYgKGlzZG90ZW50KGZuYW1lLCBmbGVuKSkKKwkJZ290byBvdXQ7CisKKwllcnIgPSBmaF92ZXJpZnkocnFzdHAsIGZocCwgU19JRkRJUiwgTUFZX0NSRUFURSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlkZW50cnkgPSBmaHAtPmZoX2RlbnRyeTsKKwlkaXJwID0gZGVudHJ5LT5kX2lub2RlOworCisJZXJyID0gbmZzZXJyX25vdGRpcjsKKwlpZighZGlycC0+aV9vcCB8fCAhZGlycC0+aV9vcC0+bG9va3VwKQorCQlnb3RvIG91dDsKKwkvKgorCSAqIENoZWNrIHdoZXRoZXIgdGhlIHJlc3BvbnNlIGZpbGUgaGFuZGxlIGhhcyBiZWVuIHZlcmlmaWVkIHlldC4KKwkgKiBJZiBpdCBoYXMsIHRoZSBwYXJlbnQgZGlyZWN0b3J5IHNob3VsZCBhbHJlYWR5IGJlIGxvY2tlZC4KKwkgKi8KKwlpZiAoIXJlc2ZocC0+ZmhfZGVudHJ5KSB7CisJCS8qIGNhbGxlZCBmcm9tIG5mc2RfcHJvY19ta2Rpciwgb3IgcG9zc2libHkgbmZzZDNfcHJvY19jcmVhdGUgKi8KKwkJZmhfbG9jayhmaHApOworCQlkY2hpbGQgPSBsb29rdXBfb25lX2xlbihmbmFtZSwgZGVudHJ5LCBmbGVuKTsKKwkJZXJyID0gUFRSX0VSUihkY2hpbGQpOworCQlpZiAoSVNfRVJSKGRjaGlsZCkpCisJCQlnb3RvIG91dF9uZnNlcnI7CisJCWVyciA9IGZoX2NvbXBvc2UocmVzZmhwLCBmaHAtPmZoX2V4cG9ydCwgZGNoaWxkLCBmaHApOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJfSBlbHNlIHsKKwkJLyogY2FsbGVkIGZyb20gbmZzZF9wcm9jX2NyZWF0ZSAqLworCQlkY2hpbGQgPSBkZ2V0KHJlc2ZocC0+ZmhfZGVudHJ5KTsKKwkJaWYgKCFmaHAtPmZoX2xvY2tlZCkgeworCQkJLyogbm90IGFjdHVhbGx5IHBvc3NpYmxlICovCisJCQlwcmludGsoS0VSTl9FUlIKKwkJCQkibmZzZF9jcmVhdGU6IHBhcmVudCAlcy8lcyBub3QgbG9ja2VkIVxuIiwKKwkJCQlkZW50cnktPmRfcGFyZW50LT5kX25hbWUubmFtZSwKKwkJCQlkZW50cnktPmRfbmFtZS5uYW1lKTsKKwkJCWVyciA9IC1FSU87CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGUgY2hpbGQgZGVudHJ5IGlzIHN0aWxsIG5lZ2F0aXZlIC4uLgorCSAqLworCWVyciA9IG5mc2Vycl9leGlzdDsKKwlpZiAoZGNoaWxkLT5kX2lub2RlKSB7CisJCWRwcmludGsoIm5mc2RfY3JlYXRlOiBkZW50cnkgJXMvJXMgbm90IG5lZ2F0aXZlIVxuIiwKKwkJCWRlbnRyeS0+ZF9uYW1lLm5hbWUsIGRjaGlsZC0+ZF9uYW1lLm5hbWUpOworCQlnb3RvIG91dDsgCisJfQorCisJaWYgKCEoaWFwLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkpCisJCWlhcC0+aWFfbW9kZSA9IDA7CisJaWFwLT5pYV9tb2RlID0gKGlhcC0+aWFfbW9kZSAmIFNfSUFMTFVHTykgfCB0eXBlOworCisJLyoKKwkgKiBHZXQgdGhlIGRpciBvcCBmdW5jdGlvbiBwb2ludGVyLgorCSAqLworCWVyciA9IG5mc2Vycl9wZXJtOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgU19JRlJFRzoKKwkJZXJyID0gdmZzX2NyZWF0ZShkaXJwLCBkY2hpbGQsIGlhcC0+aWFfbW9kZSwgTlVMTCk7CisJCWJyZWFrOworCWNhc2UgU19JRkRJUjoKKwkJZXJyID0gdmZzX21rZGlyKGRpcnAsIGRjaGlsZCwgaWFwLT5pYV9tb2RlKTsKKwkJYnJlYWs7CisJY2FzZSBTX0lGQ0hSOgorCWNhc2UgU19JRkJMSzoKKwljYXNlIFNfSUZJRk86CisJY2FzZSBTX0lGU09DSzoKKwkJZXJyID0gdmZzX21rbm9kKGRpcnAsIGRjaGlsZCwgaWFwLT5pYV9tb2RlLCByZGV2KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkgICAgICAgIHByaW50aygibmZzZDogYmFkIGZpbGUgdHlwZSAlbyBpbiBuZnNkX2NyZWF0ZVxuIiwgdHlwZSk7CisJCWVyciA9IC1FSU5WQUw7CisJfQorCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dF9uZnNlcnI7CisKKwlpZiAoRVhfSVNTWU5DKGZocC0+ZmhfZXhwb3J0KSkgeworCQluZnNkX3N5bmNfZGlyKGRlbnRyeSk7CisJCXdyaXRlX2lub2RlX25vdyhkY2hpbGQtPmRfaW5vZGUsIDEpOworCX0KKworCisJLyogU2V0IGZpbGUgYXR0cmlidXRlcy4gTW9kZSBoYXMgYWxyZWFkeSBiZWVuIHNldCBhbmQKKwkgKiBzZXR0aW5nIHVpZC9naWQgd29ya3Mgb25seSBmb3Igcm9vdC4gSXJpeCBhcHBlYXJzIHRvCisJICogc2VuZCBhbG9uZyB0aGUgZ2lkIHdoZW4gaXQgdHJpZXMgdG8gaW1wbGVtZW50IHNldGdpZAorCSAqIGRpcmVjdG9yaWVzIHZpYSBORlMuCisJICovCisJZXJyID0gMDsKKwlpZiAoKGlhcC0+aWFfdmFsaWQgJj0gfihBVFRSX1VJRHxBVFRSX0dJRHxBVFRSX01PREUpKSAhPSAwKQorCQllcnIgPSBuZnNkX3NldGF0dHIocnFzdHAsIHJlc2ZocCwgaWFwLCAwLCAodGltZV90KTApOworCS8qCisJICogVXBkYXRlIHRoZSBmaWxlIGhhbmRsZSB0byBnZXQgdGhlIG5ldyBpbm9kZSBpbmZvLgorCSAqLworCWlmICghZXJyKQorCQllcnIgPSBmaF91cGRhdGUocmVzZmhwKTsKK291dDoKKwlpZiAoZGNoaWxkICYmICFJU19FUlIoZGNoaWxkKSkKKwkJZHB1dChkY2hpbGQpOworCXJldHVybiBlcnI7CisKK291dF9uZnNlcnI6CisJZXJyID0gbmZzZXJybm8oZXJyKTsKKwlnb3RvIG91dDsKK30KKworI2lmZGVmIENPTkZJR19ORlNEX1YzCisvKgorICogTkZTdjMgdmVyc2lvbiBvZiBuZnNkX2NyZWF0ZQorICovCitpbnQKK25mc2RfY3JlYXRlX3YzKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZocCwKKwkJY2hhciAqZm5hbWUsIGludCBmbGVuLCBzdHJ1Y3QgaWF0dHIgKmlhcCwKKwkJc3RydWN0IHN2Y19maCAqcmVzZmhwLCBpbnQgY3JlYXRlbW9kZSwgdTMyICp2ZXJpZmllciwKKwkgICAgICAgIGludCAqdHJ1bmNwKQoreworCXN0cnVjdCBkZW50cnkJKmRlbnRyeSwgKmRjaGlsZCA9IE5VTEw7CisJc3RydWN0IGlub2RlCSpkaXJwOworCWludAkJZXJyOworCV9fdTMyCQl2X210aW1lPTAsIHZfYXRpbWU9MDsKKwlpbnQJCXZfbW9kZT0wOworCisJZXJyID0gbmZzZXJyX3Blcm07CisJaWYgKCFmbGVuKQorCQlnb3RvIG91dDsKKwllcnIgPSBuZnNlcnJfZXhpc3Q7CisJaWYgKGlzZG90ZW50KGZuYW1lLCBmbGVuKSkKKwkJZ290byBvdXQ7CisJaWYgKCEoaWFwLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkpCisJCWlhcC0+aWFfbW9kZSA9IDA7CisJZXJyID0gZmhfdmVyaWZ5KHJxc3RwLCBmaHAsIFNfSUZESVIsIE1BWV9DUkVBVEUpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZGVudHJ5ID0gZmhwLT5maF9kZW50cnk7CisJZGlycCA9IGRlbnRyeS0+ZF9pbm9kZTsKKworCS8qIEdldCBhbGwgdGhlIHNhbml0eSBjaGVja3Mgb3V0IG9mIHRoZSB3YXkgYmVmb3JlCisJICogd2UgbG9jayB0aGUgcGFyZW50LiAqLworCWVyciA9IG5mc2Vycl9ub3RkaXI7CisJaWYoIWRpcnAtPmlfb3AgfHwgIWRpcnAtPmlfb3AtPmxvb2t1cCkKKwkJZ290byBvdXQ7CisJZmhfbG9jayhmaHApOworCisJLyoKKwkgKiBDb21wb3NlIHRoZSByZXNwb25zZSBmaWxlIGhhbmRsZS4KKwkgKi8KKwlkY2hpbGQgPSBsb29rdXBfb25lX2xlbihmbmFtZSwgZGVudHJ5LCBmbGVuKTsKKwllcnIgPSBQVFJfRVJSKGRjaGlsZCk7CisJaWYgKElTX0VSUihkY2hpbGQpKQorCQlnb3RvIG91dF9uZnNlcnI7CisKKwllcnIgPSBmaF9jb21wb3NlKHJlc2ZocCwgZmhwLT5maF9leHBvcnQsIGRjaGlsZCwgZmhwKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWlmIChjcmVhdGVtb2RlID09IE5GUzNfQ1JFQVRFX0VYQ0xVU0lWRSkgeworCQkvKiB3aGlsZSB0aGUgdmVyaWZpZXIgd291bGQgZml0IGluIG10aW1lK2F0aW1lLAorCQkgKiBzb2xhcmlzNyBnZXRzIGNvbmZ1c2VkIChidWdpZCA0MjE4NTA4KSBpZiB0aGVzZSBoYXZlCisJCSAqIHRoZSBoaWdoIGJpdCBzZXQsIHNvIHdlIHVzZSB0aGUgbW9kZSBhcyB3ZWxsCisJCSAqLworCQl2X210aW1lID0gdmVyaWZpZXJbMF0mMHg3ZmZmZmZmZjsKKwkJdl9hdGltZSA9IHZlcmlmaWVyWzFdJjB4N2ZmZmZmZmY7CisJCXZfbW9kZSAgPSBTX0lGUkVHCisJCQl8ICgodmVyaWZpZXJbMF0mMHg4MDAwMDAwMCkgPj4gKDMyLTcpKSAvKiB1K3ggKi8KKwkJCXwgKCh2ZXJpZmllclsxXSYweDgwMDAwMDAwKSA+PiAoMzItOSkpIC8qIHUrciAqLworCQkJOworCX0KKwkKKwlpZiAoZGNoaWxkLT5kX2lub2RlKSB7CisJCWVyciA9IDA7CisKKwkJc3dpdGNoIChjcmVhdGVtb2RlKSB7CisJCWNhc2UgTkZTM19DUkVBVEVfVU5DSEVDS0VEOgorCQkJaWYgKCEgU19JU1JFRyhkY2hpbGQtPmRfaW5vZGUtPmlfbW9kZSkpCisJCQkJZXJyID0gbmZzZXJyX2V4aXN0OworCQkJZWxzZSBpZiAodHJ1bmNwKSB7CisJCQkJLyogaW4gbmZzdjQsIHdlIG5lZWQgdG8gdHJlYXQgdGhpcyBjYXNlIGEgbGl0dGxlCisJCQkJICogZGlmZmVyZW50bHkuICB3ZSBkb24ndCB3YW50IHRvIHRydW5jYXRlIHRoZQorCQkJCSAqIGZpbGUgbm93OyB0aGlzIHdvdWxkIGJlIHdyb25nIGlmIHRoZSBPUEVOCisJCQkJICogZmFpbHMgZm9yIHNvbWUgb3RoZXIgcmVhc29uLiAgZnVydGhlcm1vcmUsCisJCQkJICogaWYgdGhlIHNpemUgaXMgbm9uemVybywgd2Ugc2hvdWxkIGlnbm9yZSBpdAorCQkJCSAqIGFjY29yZGluZyB0byBzcGVjIQorCQkJCSAqLworCQkJCSp0cnVuY3AgPSAoaWFwLT5pYV92YWxpZCAmIEFUVFJfU0laRSkgJiYgIWlhcC0+aWFfc2l6ZTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWlhcC0+aWFfdmFsaWQgJj0gQVRUUl9TSVpFOworCQkJCWdvdG8gc2V0X2F0dHI7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBORlMzX0NSRUFURV9FWENMVVNJVkU6CisJCQlpZiAoICAgZGNoaWxkLT5kX2lub2RlLT5pX210aW1lLnR2X3NlYyA9PSB2X210aW1lCisJCQkgICAgJiYgZGNoaWxkLT5kX2lub2RlLT5pX2F0aW1lLnR2X3NlYyA9PSB2X2F0aW1lCisJCQkgICAgJiYgZGNoaWxkLT5kX2lub2RlLT5pX21vZGUgID09IHZfbW9kZQorCQkJICAgICYmIGRjaGlsZC0+ZF9pbm9kZS0+aV9zaXplICA9PSAwICkKKwkJCQlicmVhazsKKwkJCSAvKiBmYWxsdGhydSAqLworCQljYXNlIE5GUzNfQ1JFQVRFX0dVQVJERUQ6CisJCQllcnIgPSBuZnNlcnJfZXhpc3Q7CisJCX0KKwkJZ290byBvdXQ7CisJfQorCisJZXJyID0gdmZzX2NyZWF0ZShkaXJwLCBkY2hpbGQsIGlhcC0+aWFfbW9kZSwgTlVMTCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0X25mc2VycjsKKworCWlmIChFWF9JU1NZTkMoZmhwLT5maF9leHBvcnQpKSB7CisJCW5mc2Rfc3luY19kaXIoZGVudHJ5KTsKKwkJLyogc2V0YXR0ciB3aWxsIHN5bmMgdGhlIGNoaWxkIChvciBub3QpICovCisJfQorCisJLyoKKwkgKiBVcGRhdGUgdGhlIGZpbGVoYW5kbGUgdG8gZ2V0IHRoZSBuZXcgaW5vZGUgaW5mby4KKwkgKi8KKwllcnIgPSBmaF91cGRhdGUocmVzZmhwKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWlmIChjcmVhdGVtb2RlID09IE5GUzNfQ1JFQVRFX0VYQ0xVU0lWRSkgeworCQkvKiBDcmFtIHRoZSB2ZXJpZmllciBpbnRvIGF0aW1lL210aW1lL21vZGUgKi8KKwkJaWFwLT5pYV92YWxpZCA9IEFUVFJfTVRJTUV8QVRUUl9BVElNRQorCQkJfCBBVFRSX01USU1FX1NFVHxBVFRSX0FUSU1FX1NFVAorCQkJfCBBVFRSX01PREU7CisJCS8qIFhYWCBzb21lb25lIHdobyBrbm93cyB0aGlzIGJldHRlciBwbGVhc2UgZml4IGl0IGZvciBuc2VjICovIAorCQlpYXAtPmlhX210aW1lLnR2X3NlYyA9IHZfbXRpbWU7CisJCWlhcC0+aWFfYXRpbWUudHZfc2VjID0gdl9hdGltZTsKKwkJaWFwLT5pYV9tdGltZS50dl9uc2VjID0gMDsKKwkJaWFwLT5pYV9hdGltZS50dl9uc2VjID0gMDsKKwkJaWFwLT5pYV9tb2RlICA9IHZfbW9kZTsKKwl9CisKKwkvKiBTZXQgZmlsZSBhdHRyaWJ1dGVzLgorCSAqIE1vZGUgaGFzIGFscmVhZHkgYmVlbiBzZXQgYnV0IHdlIG1pZ2h0IG5lZWQgdG8gcmVzZXQgaXQKKwkgKiBmb3IgQ1JFQVRFX0VYQ0xVU0lWRQorCSAqIElyaXggYXBwZWFycyB0byBzZW5kIGFsb25nIHRoZSBnaWQgd2hlbiBpdCB0cmllcyB0bworCSAqIGltcGxlbWVudCBzZXRnaWQgZGlyZWN0b3JpZXMgdmlhIE5GUy4gQ2xlYXIgb3V0IGFsbCB0aGF0IGNydWZ0LgorCSAqLworIHNldF9hdHRyOgorCWlmICgoaWFwLT5pYV92YWxpZCAmPSB+KEFUVFJfVUlEfEFUVFJfR0lEKSkgIT0gMCkKKyAJCWVyciA9IG5mc2Rfc2V0YXR0cihycXN0cCwgcmVzZmhwLCBpYXAsIDAsICh0aW1lX3QpMCk7CisKKyBvdXQ6CisJZmhfdW5sb2NrKGZocCk7CisJaWYgKGRjaGlsZCAmJiAhSVNfRVJSKGRjaGlsZCkpCisJCWRwdXQoZGNoaWxkKTsKKyAJcmV0dXJuIGVycjsKKyAKKyBvdXRfbmZzZXJyOgorCWVyciA9IG5mc2Vycm5vKGVycik7CisJZ290byBvdXQ7Cit9CisjZW5kaWYgLyogQ09ORklHX05GU0RfVjMgKi8KKworLyoKKyAqIFJlYWQgYSBzeW1saW5rLiBPbiBlbnRyeSwgKmxlbnAgbXVzdCBjb250YWluIHRoZSBtYXhpbXVtIHBhdGggbGVuZ3RoIHRoYXQKKyAqIGZpdHMgaW50byB0aGUgYnVmZmVyLiBPbiByZXR1cm4sIGl0IGNvbnRhaW5zIHRoZSB0cnVlIGxlbmd0aC4KKyAqIE4uQi4gQWZ0ZXIgdGhpcyBjYWxsIGZocCBuZWVkcyBhbiBmaF9wdXQKKyAqLworaW50CituZnNkX3JlYWRsaW5rKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZocCwgY2hhciAqYnVmLCBpbnQgKmxlbnApCit7CisJc3RydWN0IGRlbnRyeQkqZGVudHJ5OworCXN0cnVjdCBpbm9kZQkqaW5vZGU7CisJbW1fc2VnbWVudF90CW9sZGZzOworCWludAkJZXJyOworCisJZXJyID0gZmhfdmVyaWZ5KHJxc3RwLCBmaHAsIFNfSUZMTkssIE1BWV9OT1ApOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZGVudHJ5ID0gZmhwLT5maF9kZW50cnk7CisJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisKKwllcnIgPSBuZnNlcnJfaW52YWw7CisJaWYgKCFpbm9kZS0+aV9vcCB8fCAhaW5vZGUtPmlfb3AtPnJlYWRsaW5rKQorCQlnb3RvIG91dDsKKworCXRvdWNoX2F0aW1lKGZocC0+ZmhfZXhwb3J0LT5leF9tbnQsIGRlbnRyeSk7CisJLyogTi5CLiBXaHkgZG9lcyB0aGlzIGNhbGwgbmVlZCBhIGdldF9mcygpPz8KKwkgKiBSZW1vdmUgdGhlIHNldF9mcyBhbmQgd2F0Y2ggdGhlIGZpcmV3b3JrczotKSAtLW9raXIKKwkgKi8KKworCW9sZGZzID0gZ2V0X2ZzKCk7IHNldF9mcyhLRVJORUxfRFMpOworCWVyciA9IGlub2RlLT5pX29wLT5yZWFkbGluayhkZW50cnksIGJ1ZiwgKmxlbnApOworCXNldF9mcyhvbGRmcyk7CisKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXRfbmZzZXJyOworCSpsZW5wID0gZXJyOworCWVyciA9IDA7CitvdXQ6CisJcmV0dXJuIGVycjsKKworb3V0X25mc2VycjoKKwllcnIgPSBuZnNlcnJubyhlcnIpOworCWdvdG8gb3V0OworfQorCisvKgorICogQ3JlYXRlIGEgc3ltbGluayBhbmQgbG9vayB1cCBpdHMgaW5vZGUKKyAqIE4uQi4gQWZ0ZXIgdGhpcyBjYWxsIF9ib3RoXyBmaHAgYW5kIHJlc2ZocCBuZWVkIGFuIGZoX3B1dAorICovCitpbnQKK25mc2Rfc3ltbGluayhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsCisJCQkJY2hhciAqZm5hbWUsIGludCBmbGVuLAorCQkJCWNoYXIgKnBhdGgsICBpbnQgcGxlbiwKKwkJCQlzdHJ1Y3Qgc3ZjX2ZoICpyZXNmaHAsCisJCQkJc3RydWN0IGlhdHRyICppYXApCit7CisJc3RydWN0IGRlbnRyeQkqZGVudHJ5LCAqZG5ldzsKKwlpbnQJCWVyciwgY2VycjsKKwl1bW9kZV90CQltb2RlOworCisJZXJyID0gbmZzZXJyX25vZW50OworCWlmICghZmxlbiB8fCAhcGxlbikKKwkJZ290byBvdXQ7CisJZXJyID0gbmZzZXJyX2V4aXN0OworCWlmIChpc2RvdGVudChmbmFtZSwgZmxlbikpCisJCWdvdG8gb3V0OworCisJZXJyID0gZmhfdmVyaWZ5KHJxc3RwLCBmaHAsIFNfSUZESVIsIE1BWV9DUkVBVEUpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWZoX2xvY2soZmhwKTsKKwlkZW50cnkgPSBmaHAtPmZoX2RlbnRyeTsKKwlkbmV3ID0gbG9va3VwX29uZV9sZW4oZm5hbWUsIGRlbnRyeSwgZmxlbik7CisJZXJyID0gUFRSX0VSUihkbmV3KTsKKwlpZiAoSVNfRVJSKGRuZXcpKQorCQlnb3RvIG91dF9uZnNlcnI7CisKKwltb2RlID0gU19JQUxMVUdPOworCS8qIE9ubHkgdGhlIE1PREUgQVRUUmlidXRlIGlzIGV2ZW4gdmFndWVseSBtZWFuaW5nZnVsICovCisJaWYgKGlhcCAmJiAoaWFwLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkpCisJCW1vZGUgPSBpYXAtPmlhX21vZGUgJiBTX0lBTExVR087CisKKwlpZiAodW5saWtlbHkocGF0aFtwbGVuXSAhPSAwKSkgeworCQljaGFyICpwYXRoX2FsbG9jZWQgPSBrbWFsbG9jKHBsZW4rMSwgR0ZQX0tFUk5FTCk7CisJCWlmIChwYXRoX2FsbG9jZWQgPT0gTlVMTCkKKwkJCWVyciA9IC1FTk9NRU07CisJCWVsc2UgeworCQkJc3RybmNweShwYXRoX2FsbG9jZWQsIHBhdGgsIHBsZW4pOworCQkJcGF0aF9hbGxvY2VkW3BsZW5dID0gMDsKKwkJCWVyciA9IHZmc19zeW1saW5rKGRlbnRyeS0+ZF9pbm9kZSwgZG5ldywgcGF0aF9hbGxvY2VkLCBtb2RlKTsKKwkJCWtmcmVlKHBhdGhfYWxsb2NlZCk7CisJCX0KKwl9IGVsc2UKKwkJZXJyID0gdmZzX3N5bWxpbmsoZGVudHJ5LT5kX2lub2RlLCBkbmV3LCBwYXRoLCBtb2RlKTsKKworCWlmICghZXJyKSB7CisJCWlmIChFWF9JU1NZTkMoZmhwLT5maF9leHBvcnQpKQorCQkJbmZzZF9zeW5jX2RpcihkZW50cnkpOworCX0gZWxzZQorCQllcnIgPSBuZnNlcnJubyhlcnIpOworCWZoX3VubG9jayhmaHApOworCisJY2VyciA9IGZoX2NvbXBvc2UocmVzZmhwLCBmaHAtPmZoX2V4cG9ydCwgZG5ldywgZmhwKTsKKwlkcHV0KGRuZXcpOworCWlmIChlcnI9PTApIGVyciA9IGNlcnI7CitvdXQ6CisJcmV0dXJuIGVycjsKKworb3V0X25mc2VycjoKKwllcnIgPSBuZnNlcnJubyhlcnIpOworCWdvdG8gb3V0OworfQorCisvKgorICogQ3JlYXRlIGEgaGFyZGxpbmsKKyAqIE4uQi4gQWZ0ZXIgdGhpcyBjYWxsIF9ib3RoXyBmZmhwIGFuZCB0ZmhwIG5lZWQgYW4gZmhfcHV0CisgKi8KK2ludAorbmZzZF9saW5rKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZmaHAsCisJCQkJY2hhciAqbmFtZSwgaW50IGxlbiwgc3RydWN0IHN2Y19maCAqdGZocCkKK3sKKwlzdHJ1Y3QgZGVudHJ5CSpkZGlyLCAqZG5ldywgKmRvbGQ7CisJc3RydWN0IGlub2RlCSpkaXJwLCAqZGVzdDsKKwlpbnQJCWVycjsKKworCWVyciA9IGZoX3ZlcmlmeShycXN0cCwgZmZocCwgU19JRkRJUiwgTUFZX0NSRUFURSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJZXJyID0gZmhfdmVyaWZ5KHJxc3RwLCB0ZmhwLCAtU19JRkRJUiwgTUFZX05PUCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwllcnIgPSBuZnNlcnJfcGVybTsKKwlpZiAoIWxlbikKKwkJZ290byBvdXQ7CisJZXJyID0gbmZzZXJyX2V4aXN0OworCWlmIChpc2RvdGVudChuYW1lLCBsZW4pKQorCQlnb3RvIG91dDsKKworCWZoX2xvY2soZmZocCk7CisJZGRpciA9IGZmaHAtPmZoX2RlbnRyeTsKKwlkaXJwID0gZGRpci0+ZF9pbm9kZTsKKworCWRuZXcgPSBsb29rdXBfb25lX2xlbihuYW1lLCBkZGlyLCBsZW4pOworCWVyciA9IFBUUl9FUlIoZG5ldyk7CisJaWYgKElTX0VSUihkbmV3KSkKKwkJZ290byBvdXRfbmZzZXJyOworCisJZG9sZCA9IHRmaHAtPmZoX2RlbnRyeTsKKwlkZXN0ID0gZG9sZC0+ZF9pbm9kZTsKKworCWVyciA9IHZmc19saW5rKGRvbGQsIGRpcnAsIGRuZXcpOworCWlmICghZXJyKSB7CisJCWlmIChFWF9JU1NZTkMoZmZocC0+ZmhfZXhwb3J0KSkgeworCQkJbmZzZF9zeW5jX2RpcihkZGlyKTsKKwkJCXdyaXRlX2lub2RlX25vdyhkZXN0LCAxKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChlcnIgPT0gLUVYREVWICYmIHJxc3RwLT5ycV92ZXJzID09IDIpCisJCQllcnIgPSBuZnNlcnJfYWNjZXM7CisJCWVsc2UKKwkJCWVyciA9IG5mc2Vycm5vKGVycik7CisJfQorCisJZmhfdW5sb2NrKGZmaHApOworCWRwdXQoZG5ldyk7CitvdXQ6CisJcmV0dXJuIGVycjsKKworb3V0X25mc2VycjoKKwllcnIgPSBuZnNlcnJubyhlcnIpOworCWdvdG8gb3V0OworfQorCisvKgorICogUmVuYW1lIGEgZmlsZQorICogTi5CLiBBZnRlciB0aGlzIGNhbGwgX2JvdGhfIGZmaHAgYW5kIHRmaHAgbmVlZCBhbiBmaF9wdXQKKyAqLworaW50CituZnNkX3JlbmFtZShzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmZmhwLCBjaGFyICpmbmFtZSwgaW50IGZsZW4sCisJCQkgICAgc3RydWN0IHN2Y19maCAqdGZocCwgY2hhciAqdG5hbWUsIGludCB0bGVuKQoreworCXN0cnVjdCBkZW50cnkJKmZkZW50cnksICp0ZGVudHJ5LCAqb2RlbnRyeSwgKm5kZW50cnksICp0cmFwOworCXN0cnVjdCBpbm9kZQkqZmRpciwgKnRkaXI7CisJaW50CQllcnI7CisKKwllcnIgPSBmaF92ZXJpZnkocnFzdHAsIGZmaHAsIFNfSUZESVIsIE1BWV9SRU1PVkUpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWVyciA9IGZoX3ZlcmlmeShycXN0cCwgdGZocCwgU19JRkRJUiwgTUFZX0NSRUFURSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlmZGVudHJ5ID0gZmZocC0+ZmhfZGVudHJ5OworCWZkaXIgPSBmZGVudHJ5LT5kX2lub2RlOworCisJdGRlbnRyeSA9IHRmaHAtPmZoX2RlbnRyeTsKKwl0ZGlyID0gdGRlbnRyeS0+ZF9pbm9kZTsKKworCWVyciA9IChycXN0cC0+cnFfdmVycyA9PSAyKSA/IG5mc2Vycl9hY2NlcyA6IG5mc2Vycl94ZGV2OworCWlmIChmZGlyLT5pX3NiICE9IHRkaXItPmlfc2IpCisJCWdvdG8gb3V0OworCisJZXJyID0gbmZzZXJyX3Blcm07CisJaWYgKCFmbGVuIHx8IGlzZG90ZW50KGZuYW1lLCBmbGVuKSB8fCAhdGxlbiB8fCBpc2RvdGVudCh0bmFtZSwgdGxlbikpCisJCWdvdG8gb3V0OworCisJLyogY2Fubm90IHVzZSBmaF9sb2NrIGFzIHdlIG5lZWQgZGVhZGxvY2sgcHJvdGVjdGl2ZSBvcmRlcmluZworCSAqIHNvIGRvIGl0IGJ5IGhhbmQgKi8KKwl0cmFwID0gbG9ja19yZW5hbWUodGRlbnRyeSwgZmRlbnRyeSk7CisJZmZocC0+ZmhfbG9ja2VkID0gdGZocC0+ZmhfbG9ja2VkID0gMTsKKwlmaWxsX3ByZV93Y2MoZmZocCk7CisJZmlsbF9wcmVfd2NjKHRmaHApOworCisJb2RlbnRyeSA9IGxvb2t1cF9vbmVfbGVuKGZuYW1lLCBmZGVudHJ5LCBmbGVuKTsKKwllcnIgPSBQVFJfRVJSKG9kZW50cnkpOworCWlmIChJU19FUlIob2RlbnRyeSkpCisJCWdvdG8gb3V0X25mc2VycjsKKworCWVyciA9IC1FTk9FTlQ7CisJaWYgKCFvZGVudHJ5LT5kX2lub2RlKQorCQlnb3RvIG91dF9kcHV0X29sZDsKKwllcnIgPSAtRUlOVkFMOworCWlmIChvZGVudHJ5ID09IHRyYXApCisJCWdvdG8gb3V0X2RwdXRfb2xkOworCisJbmRlbnRyeSA9IGxvb2t1cF9vbmVfbGVuKHRuYW1lLCB0ZGVudHJ5LCB0bGVuKTsKKwllcnIgPSBQVFJfRVJSKG5kZW50cnkpOworCWlmIChJU19FUlIobmRlbnRyeSkpCisJCWdvdG8gb3V0X2RwdXRfb2xkOworCWVyciA9IC1FTk9URU1QVFk7CisJaWYgKG5kZW50cnkgPT0gdHJhcCkKKwkJZ290byBvdXRfZHB1dF9uZXc7CisKKyNpZmRlZiBNU05GUworCWlmICgoZmZocC0+ZmhfZXhwb3J0LT5leF9mbGFncyAmIE5GU0VYUF9NU05GUykgJiYKKwkJKChhdG9taWNfcmVhZCgmb2RlbnRyeS0+ZF9jb3VudCkgPiAxKQorCQkgfHwgKGF0b21pY19yZWFkKCZuZGVudHJ5LT5kX2NvdW50KSA+IDEpKSkgeworCQkJZXJyID0gbmZzZXJyX3Blcm07CisJfSBlbHNlCisjZW5kaWYKKwllcnIgPSB2ZnNfcmVuYW1lKGZkaXIsIG9kZW50cnksIHRkaXIsIG5kZW50cnkpOworCWlmICghZXJyICYmIEVYX0lTU1lOQyh0ZmhwLT5maF9leHBvcnQpKSB7CisJCW5mc2Rfc3luY19kaXIodGRlbnRyeSk7CisJCW5mc2Rfc3luY19kaXIoZmRlbnRyeSk7CisJfQorCisgb3V0X2RwdXRfbmV3OgorCWRwdXQobmRlbnRyeSk7Cisgb3V0X2RwdXRfb2xkOgorCWRwdXQob2RlbnRyeSk7Cisgb3V0X25mc2VycjoKKwlpZiAoZXJyKQorCQllcnIgPSBuZnNlcnJubyhlcnIpOworCisJLyogd2UgY2Fubm90IHJlcGx5IG9uIGZoX3VubG9jayBvbiB0aGUgdHdvIGZpbGVoYW5kbGVzLAorCSAqIGFzIHRoYXQgd291bGQgZG8gdGhlIHdyb25nIHRoaW5nIGlmIHRoZSB0d28gZGlyZWN0b3JpZXMKKwkgKiB3ZXJlIHRoZSBzYW1lLCBzbyBhZ2FpbiB3ZSBkbyBpdCBieSBoYW5kCisJICovCisJZmlsbF9wb3N0X3djYyhmZmhwKTsKKwlmaWxsX3Bvc3Rfd2NjKHRmaHApOworCXVubG9ja19yZW5hbWUodGRlbnRyeSwgZmRlbnRyeSk7CisJZmZocC0+ZmhfbG9ja2VkID0gdGZocC0+ZmhfbG9ja2VkID0gMDsKKworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBVbmxpbmsgYSBmaWxlIG9yIGRpcmVjdG9yeQorICogTi5CLiBBZnRlciB0aGlzIGNhbGwgZmhwIG5lZWRzIGFuIGZoX3B1dAorICovCitpbnQKK25mc2RfdW5saW5rKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZocCwgaW50IHR5cGUsCisJCQkJY2hhciAqZm5hbWUsIGludCBmbGVuKQoreworCXN0cnVjdCBkZW50cnkJKmRlbnRyeSwgKnJkZW50cnk7CisJc3RydWN0IGlub2RlCSpkaXJwOworCWludAkJZXJyOworCisJZXJyID0gbmZzZXJyX2FjY2VzOworCWlmICghZmxlbiB8fCBpc2RvdGVudChmbmFtZSwgZmxlbikpCisJCWdvdG8gb3V0OworCWVyciA9IGZoX3ZlcmlmeShycXN0cCwgZmhwLCBTX0lGRElSLCBNQVlfUkVNT1ZFKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWZoX2xvY2soZmhwKTsKKwlkZW50cnkgPSBmaHAtPmZoX2RlbnRyeTsKKwlkaXJwID0gZGVudHJ5LT5kX2lub2RlOworCisJcmRlbnRyeSA9IGxvb2t1cF9vbmVfbGVuKGZuYW1lLCBkZW50cnksIGZsZW4pOworCWVyciA9IFBUUl9FUlIocmRlbnRyeSk7CisJaWYgKElTX0VSUihyZGVudHJ5KSkKKwkJZ290byBvdXRfbmZzZXJyOworCisJaWYgKCFyZGVudHJ5LT5kX2lub2RlKSB7CisJCWRwdXQocmRlbnRyeSk7CisJCWVyciA9IG5mc2Vycl9ub2VudDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCF0eXBlKQorCQl0eXBlID0gcmRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlICYgU19JRk1UOworCisJaWYgKHR5cGUgIT0gU19JRkRJUikgeyAvKiBJdCdzIFVOTElOSyAqLworI2lmZGVmIE1TTkZTCisJCWlmICgoZmhwLT5maF9leHBvcnQtPmV4X2ZsYWdzICYgTkZTRVhQX01TTkZTKSAmJgorCQkJKGF0b21pY19yZWFkKCZyZGVudHJ5LT5kX2NvdW50KSA+IDEpKSB7CisJCQllcnIgPSBuZnNlcnJfcGVybTsKKwkJfSBlbHNlCisjZW5kaWYKKwkJZXJyID0gdmZzX3VubGluayhkaXJwLCByZGVudHJ5KTsKKwl9IGVsc2UgeyAvKiBJdCdzIFJNRElSICovCisJCWVyciA9IHZmc19ybWRpcihkaXJwLCByZGVudHJ5KTsKKwl9CisKKwlkcHV0KHJkZW50cnkpOworCisJaWYgKGVycikKKwkJZ290byBvdXRfbmZzZXJyOworCWlmIChFWF9JU1NZTkMoZmhwLT5maF9leHBvcnQpKSAKKwkJbmZzZF9zeW5jX2RpcihkZW50cnkpOworCitvdXQ6CisJcmV0dXJuIGVycjsKKworb3V0X25mc2VycjoKKwllcnIgPSBuZnNlcnJubyhlcnIpOworCWdvdG8gb3V0OworfQorCisvKgorICogUmVhZCBlbnRyaWVzIGZyb20gYSBkaXJlY3RvcnkuCisgKiBUaGUgIE5GU3YzLzQgdmVyaWZpZXIgd2UgaWdub3JlIGZvciBub3cuCisgKi8KK2ludAorbmZzZF9yZWFkZGlyKHN0cnVjdCBzdmNfcnFzdCAqcnFzdHAsIHN0cnVjdCBzdmNfZmggKmZocCwgbG9mZl90ICpvZmZzZXRwLCAKKwkgICAgIHN0cnVjdCByZWFkZGlyX2NkICpjZHAsIGVuY29kZV9kZW50X2ZuIGZ1bmMpCit7CisJaW50CQllcnI7CisJc3RydWN0IGZpbGUJKmZpbGU7CisJbG9mZl90CQlvZmZzZXQgPSAqb2Zmc2V0cDsKKworCWVyciA9IG5mc2Rfb3BlbihycXN0cCwgZmhwLCBTX0lGRElSLCBNQVlfUkVBRCwgJmZpbGUpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJb2Zmc2V0ID0gdmZzX2xsc2VlayhmaWxlLCBvZmZzZXQsIDApOworCWlmIChvZmZzZXQgPCAwKSB7CisJCWVyciA9IG5mc2Vycm5vKChpbnQpb2Zmc2V0KTsKKwkJZ290byBvdXRfY2xvc2U7CisJfQorCisJLyoKKwkgKiBSZWFkIHRoZSBkaXJlY3RvcnkgZW50cmllcy4gVGhpcyBzaWxseSBsb29wIGlzIG5lY2Vzc2FyeSBiZWNhdXNlCisJICogcmVhZGRpcigpIGlzIG5vdCBndWFyYW50ZWVkIHRvIGZpbGwgdXAgdGhlIGVudGlyZSBidWZmZXIsIGJ1dAorCSAqIG1heSBjaG9vc2UgdG8gZG8gbGVzcy4KKwkgKi8KKworCWRvIHsKKwkJY2RwLT5lcnIgPSBuZnNlcnJfZW9mOyAvKiB3aWxsIGJlIGNsZWFyZWQgb24gc3VjY2Vzc2Z1bCByZWFkICovCisJCWVyciA9IHZmc19yZWFkZGlyKGZpbGUsIChmaWxsZGlyX3QpIGZ1bmMsIGNkcCk7CisJfSB3aGlsZSAoZXJyID49MCAmJiBjZHAtPmVyciA9PSBuZnNfb2spOworCWlmIChlcnIpCisJCWVyciA9IG5mc2Vycm5vKGVycik7CisJZWxzZQorCQllcnIgPSBjZHAtPmVycjsKKwkqb2Zmc2V0cCA9IHZmc19sbHNlZWsoZmlsZSwgMCwgMSk7CisKKwlpZiAoZXJyID09IG5mc2Vycl9lb2YgfHwgZXJyID09IG5mc2Vycl90b29zbWFsbCkKKwkJZXJyID0gbmZzX29rOyAvKiBjYW4gc3RpbGwgYmUgZm91bmQgaW4gLT5lcnIgKi8KK291dF9jbG9zZToKKwluZnNkX2Nsb3NlKGZpbGUpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBHZXQgZmlsZSBzeXN0ZW0gc3RhdHMKKyAqIE4uQi4gQWZ0ZXIgdGhpcyBjYWxsIGZocCBuZWVkcyBhbiBmaF9wdXQKKyAqLworaW50CituZnNkX3N0YXRmcyhzdHJ1Y3Qgc3ZjX3Jxc3QgKnJxc3RwLCBzdHJ1Y3Qgc3ZjX2ZoICpmaHAsIHN0cnVjdCBrc3RhdGZzICpzdGF0KQoreworCWludCBlcnIgPSBmaF92ZXJpZnkocnFzdHAsIGZocCwgMCwgTUFZX05PUCk7CisJaWYgKCFlcnIgJiYgdmZzX3N0YXRmcyhmaHAtPmZoX2RlbnRyeS0+ZF9pbm9kZS0+aV9zYixzdGF0KSkKKwkJZXJyID0gbmZzZXJyX2lvOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBDaGVjayBmb3IgYSB1c2VyJ3MgYWNjZXNzIHBlcm1pc3Npb25zIHRvIHRoaXMgaW5vZGUuCisgKi8KK2ludAorbmZzZF9wZXJtaXNzaW9uKHN0cnVjdCBzdmNfZXhwb3J0ICpleHAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGFjYykKK3sKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludAkJZXJyOworCisJaWYgKGFjYyA9PSBNQVlfTk9QKQorCQlyZXR1cm4gMDsKKyNpZiAwCisJZHByaW50aygibmZzZDogcGVybWlzc2lvbiAweCV4JXMlcyVzJXMlcyVzJXMgbW9kZSAwJW8lcyVzJXNcbiIsCisJCWFjYywKKwkJKGFjYyAmIE1BWV9SRUFEKT8JIiByZWFkIiAgOiAiIiwKKwkJKGFjYyAmIE1BWV9XUklURSk/CSIgd3JpdGUiIDogIiIsCisJCShhY2MgJiBNQVlfRVhFQyk/CSIgZXhlYyIgIDogIiIsCisJCShhY2MgJiBNQVlfU0FUVFIpPwkiIHNhdHRyIiA6ICIiLAorCQkoYWNjICYgTUFZX1RSVU5DKT8JIiB0cnVuYyIgOiAiIiwKKwkJKGFjYyAmIE1BWV9MT0NLKT8JIiBsb2NrIiAgOiAiIiwKKwkJKGFjYyAmIE1BWV9PV05FUl9PVkVSUklERSk/ICIgb3duZXJvdmVycmlkZSIgOiAiIiwKKwkJaW5vZGUtPmlfbW9kZSwKKwkJSVNfSU1NVVRBQkxFKGlub2RlKT8JIiBpbW11dCIgOiAiIiwKKwkJSVNfQVBQRU5EKGlub2RlKT8JIiBhcHBlbmQiIDogIiIsCisJCUlTX1JET05MWShpbm9kZSk/CSIgcm8iIDogIiIpOworCWRwcmludGsoIiAgICAgIG93bmVyICVkLyVkIHVzZXIgJWQvJWRcbiIsCisJCWlub2RlLT5pX3VpZCwgaW5vZGUtPmlfZ2lkLCBjdXJyZW50LT5mc3VpZCwgY3VycmVudC0+ZnNnaWQpOworI2VuZGlmCisKKwkvKiBOb3JtYWxseSB3ZSByZWplY3QgYW55IHdyaXRlL3NhdHRyIGV0YyBhY2Nlc3Mgb24gYSByZWFkLW9ubHkgZmlsZQorCSAqIHN5c3RlbS4gIEJ1dCBpZiBpdCBpcyBJUklYIGRvaW5nIGNoZWNrIG9uIHdyaXRlLWFjY2VzcyBmb3IgYSAKKwkgKiBkZXZpY2Ugc3BlY2lhbCBmaWxlLCB3ZSBpZ25vcmUgcm9mcy4KKwkgKi8KKwlpZiAoIShhY2MgJiBNQVlfTE9DQUxfQUNDRVNTKSkKKwkJaWYgKGFjYyAmIChNQVlfV1JJVEUgfCBNQVlfU0FUVFIgfCBNQVlfVFJVTkMpKSB7CisJCQlpZiAoRVhfUkRPTkxZKGV4cCkgfHwgSVNfUkRPTkxZKGlub2RlKSkKKwkJCQlyZXR1cm4gbmZzZXJyX3JvZnM7CisJCQlpZiAoLyogKGFjYyAmIE1BWV9XUklURSkgJiYgKi8gSVNfSU1NVVRBQkxFKGlub2RlKSkKKwkJCQlyZXR1cm4gbmZzZXJyX3Blcm07CisJCX0KKwlpZiAoKGFjYyAmIE1BWV9UUlVOQykgJiYgSVNfQVBQRU5EKGlub2RlKSkKKwkJcmV0dXJuIG5mc2Vycl9wZXJtOworCisJaWYgKGFjYyAmIE1BWV9MT0NLKSB7CisJCS8qIElmIHdlIGNhbm5vdCByZWx5IG9uIGF1dGhlbnRpY2F0aW9uIGluIE5MTSByZXF1ZXN0cywKKwkJICoganVzdCBhbGxvdyBsb2Nrcywgb3RoZXJ3aXNlIHJlcXVpcmUgcmVhZCBwZXJtaXNzaW9uLCBvcgorCQkgKiBvd25lcnNoaXAKKwkJICovCisJCWlmIChleHAtPmV4X2ZsYWdzICYgTkZTRVhQX05PQVVUSE5MTSkKKwkJCXJldHVybiAwOworCQllbHNlCisJCQlhY2MgPSBNQVlfUkVBRCB8IE1BWV9PV05FUl9PVkVSUklERTsKKwl9CisJLyoKKwkgKiBUaGUgZmlsZSBvd25lciBhbHdheXMgZ2V0cyBhY2Nlc3MgcGVybWlzc2lvbiBmb3IgYWNjZXNzZXMgdGhhdAorCSAqIHdvdWxkIG5vcm1hbGx5IGJlIGNoZWNrZWQgYXQgb3BlbiB0aW1lLiBUaGlzIGlzIHRvIG1ha2UKKwkgKiBmaWxlIGFjY2VzcyB3b3JrIGV2ZW4gd2hlbiB0aGUgY2xpZW50IGhhcyBkb25lIGEgZmNobW9kKGZkLCAwKS4KKwkgKgorCSAqIEhvd2V2ZXIsIGBjcCBmb28gYmFyJyBzaG91bGQgZmFpbCBuZXZlcnRoZWxlc3Mgd2hlbiBiYXIgaXMKKwkgKiByZWFkb25seS4gQSBzZW5zaWJsZSB3YXkgdG8gZG8gdGhpcyBtaWdodCBiZSB0byByZWplY3QgYWxsCisJICogYXR0ZW1wdHMgdG8gdHJ1bmNhdGUgYSByZWFkLW9ubHkgZmlsZSwgYmVjYXVzZSBhIGNyZWF0KCkgY2FsbAorCSAqIGFsd2F5cyBpbXBsaWVzIGZpbGUgdHJ1bmNhdGlvbi4KKwkgKiAuLi4gYnV0IHRoaXMgaXNuJ3QgcmVhbGx5IGZhaXIuICBBIHByb2Nlc3MgbWF5IHJlYXNvbmFibHkgY2FsbAorCSAqIGZ0cnVuY2F0ZSBvbiBhbiBvcGVuIGZpbGUgZGVzY3JpcHRvciBvbiBhIGZpbGUgd2l0aCBwZXJtIDAwMC4KKwkgKiBXZSBtdXN0IHRydXN0IHRoZSBjbGllbnQgdG8gZG8gcGVybWlzc2lvbiBjaGVja2luZyAtIHVzaW5nICJBQ0NFU1MiCisJICogd2l0aCBORlN2My4KKwkgKi8KKwlpZiAoKGFjYyAmIE1BWV9PV05FUl9PVkVSUklERSkgJiYKKwkgICAgaW5vZGUtPmlfdWlkID09IGN1cnJlbnQtPmZzdWlkKQorCQlyZXR1cm4gMDsKKworCWVyciA9IHBlcm1pc3Npb24oaW5vZGUsIGFjYyAmIChNQVlfUkVBRHxNQVlfV1JJVEV8TUFZX0VYRUMpLCBOVUxMKTsKKworCS8qIEFsbG93IHJlYWQgYWNjZXNzIHRvIGJpbmFyaWVzIGV2ZW4gd2hlbiBtb2RlIDExMSAqLworCWlmIChlcnIgPT0gLUVBQ0NFUyAmJiBTX0lTUkVHKGlub2RlLT5pX21vZGUpICYmCisJICAgIGFjYyA9PSAoTUFZX1JFQUQgfCBNQVlfT1dORVJfT1ZFUlJJREUpKQorCQllcnIgPSBwZXJtaXNzaW9uKGlub2RlLCBNQVlfRVhFQywgTlVMTCk7CisKKwlyZXR1cm4gZXJyPyBuZnNlcnJubyhlcnIpIDogMDsKK30KKwordm9pZAorbmZzZF9yYWNhY2hlX3NodXRkb3duKHZvaWQpCit7CisJaWYgKCFyYXBhcm1fY2FjaGUpCisJCXJldHVybjsKKwlkcHJpbnRrKCJuZnNkOiBmcmVlaW5nIHJlYWRhaGVhZCBidWZmZXJzLlxuIik7CisJa2ZyZWUocmFwYXJtbCk7CisJcmFwYXJtX2NhY2hlID0gcmFwYXJtbCA9IE5VTEw7Cit9CisvKgorICogSW5pdGlhbGl6ZSByZWFkYWhlYWQgcGFyYW0gY2FjaGUKKyAqLworaW50CituZnNkX3JhY2FjaGVfaW5pdChpbnQgY2FjaGVfc2l6ZSkKK3sKKwlpbnQJaTsKKworCWlmIChyYXBhcm1fY2FjaGUpCisJCXJldHVybiAwOworCXJhcGFybWwgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmFwYXJtcykgKiBjYWNoZV9zaXplLCBHRlBfS0VSTkVMKTsKKworCWlmIChyYXBhcm1sICE9IE5VTEwpIHsKKwkJZHByaW50aygibmZzZDogYWxsb2NhdGluZyAlZCByZWFkYWhlYWQgYnVmZmVycy5cbiIsCisJCQljYWNoZV9zaXplKTsKKwkJbWVtc2V0KHJhcGFybWwsIDAsIHNpemVvZihzdHJ1Y3QgcmFwYXJtcykgKiBjYWNoZV9zaXplKTsKKwkJZm9yIChpID0gMDsgaSA8IGNhY2hlX3NpemUgLSAxOyBpKyspIHsKKwkJCXJhcGFybWxbaV0ucF9uZXh0ID0gcmFwYXJtbCArIGkgKyAxOworCQl9CisJCXJhcGFybV9jYWNoZSA9IHJhcGFybWw7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIm5mc2Q6IENvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgcmVhZC1haGVhZCBjYWNoZS5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbmZzZHN0YXRzLnJhX3NpemUgPSBjYWNoZV9zaXplOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMvbmxzL0tjb25maWcgYi9mcy9ubHMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWI4ZjAwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmxzL0tjb25maWcKQEAgLTAsMCArMSw1MDQgQEAKKyMKKyMgTmF0aXZlIGxhbmd1YWdlIHN1cHBvcnQgY29uZmlndXJhdGlvbgorIworCittZW51ICJOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydCIKKworY29uZmlnIE5MUworCXRyaXN0YXRlICJCYXNlIG5hdGl2ZSBsYW5ndWFnZSBzdXBwb3J0IgorCS0tLWhlbHAtLS0KKwkgIFRoZSBiYXNlIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0LiBBIG51bWJlciBvZiBmaWxlc3lzdGVtcworCSAgZGVwZW5kIG9uIGl0IChlLmcuIEZBVCwgSk9MSUVULCBOVCwgQkVPUyBmaWxlc3lzdGVtcyksIGFzIHdlbGwKKwkgIGFzIHRoZSBhYmlsaXR5IG9mIHNvbWUgZmlsZXN5c3RlbXMgdG8gdXNlIG5hdGl2ZSBsYW5ndWFnZXMKKwkgIChOQ1AsIFNNQikuCisKKwkgIElmIHVuc3VyZSwgc2F5IFkuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBubHNfYmFzZS4KKworY29uZmlnIE5MU19ERUZBVUxUCisJc3RyaW5nICJEZWZhdWx0IE5MUyBPcHRpb24iCisJZGVwZW5kcyBvbiBOTFMKKwlkZWZhdWx0ICJpc284ODU5LTEiCisJLS0taGVscC0tLQorCSAgVGhlIGRlZmF1bHQgTkxTIHVzZWQgd2hlbiBtb3VudGluZyBmaWxlIHN5c3RlbS4gTm90ZSwgdGhhdCB0aGlzIGlzCisJICB0aGUgTkxTIHVzZWQgYnkgeW91ciBjb25zb2xlLCBub3QgdGhlIE5MUyB1c2VkIGJ5IGEgc3BlY2lmaWMgZmlsZQorCSAgc3lzdGVtIChpZiBkaWZmZXJlbnQpIHRvIHN0b3JlIGRhdGEgKGZpbGVuYW1lcykgb24gYSBkaXNrLgorCSAgQ3VycmVudGx5LCB0aGUgdmFsaWQgdmFsdWVzIGFyZToKKwkgIGJpZzUsIGNwNDM3LCBjcDczNywgY3A3NzUsIGNwODUwLCBjcDg1MiwgY3A4NTUsIGNwODU3LCBjcDg2MCwgY3A4NjEsCisJICBjcDg2MiwgY3A4NjMsIGNwODY0LCBjcDg2NSwgY3A4NjYsIGNwODY5LCBjcDg3NCwgY3A5MzIsIGNwOTM2LAorCSAgY3A5NDksIGNwOTUwLCBjcDEyNTEsIGNwMTI1NSwgZXVjLWpwLCBldWMta3IsIGdiMjMxMiwgaXNvODg1OS0xLAorCSAgaXNvODg1OS0yLCBpc284ODU5LTMsIGlzbzg4NTktNCwgaXNvODg1OS01LCBpc284ODU5LTYsIGlzbzg4NTktNywKKwkgIGlzbzg4NTktOCwgaXNvODg1OS05LCBpc284ODU5LTEzLCBpc284ODU5LTE0LCBpc284ODU5LTE1LAorCSAga29pOC1yLCBrb2k4LXJ1LCBrb2k4LXUsIHNqaXMsIHRpcy02MjAsIHV0ZjguCisJICBJZiB5b3Ugc3BlY2lmeSBhIHdyb25nIHZhbHVlLCBpdCB3aWxsIHVzZSB0aGUgYnVpbHQtaW4gTkxTOworCSAgY29tcGF0aWJsZSB3aXRoIGlzbzg4NTktMS4KKworCSAgSWYgdW5zdXJlLCBzcGVjaWZ5IGl0IGFzICJpc284ODU5LTEiLgorCitjb25maWcgTkxTX0NPREVQQUdFXzQzNworCXRyaXN0YXRlICJDb2RlcGFnZSA0MzcgKFVuaXRlZCBTdGF0ZXMsIENhbmFkYSkiCisJZGVwZW5kcyBvbiBOTFMKKwloZWxwCisJICBUaGUgTWljcm9zb2Z0IEZBVCBmaWxlIHN5c3RlbSBmYW1pbHkgY2FuIGRlYWwgd2l0aCBmaWxlbmFtZXMgaW4KKwkgIG5hdGl2ZSBsYW5ndWFnZSBjaGFyYWN0ZXIgc2V0cy4gVGhlc2UgY2hhcmFjdGVyIHNldHMgYXJlIHN0b3JlZAorCSAgaW4gc28tY2FsbGVkIERPUyBjb2RlcGFnZXMuIFlvdSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlCisJICBjb2RlcGFnZSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHJlYWQvd3JpdGUgdGhlc2UgZmlsZW5hbWVzIG9uCisJICBET1MvV2luZG93cyBwYXJ0aXRpb25zIGNvcnJlY3RseS4gVGhpcyBkb2VzIGFwcGx5IHRvIHRoZSBmaWxlbmFtZXMKKwkgIG9ubHksIG5vdCB0byB0aGUgZmlsZSBjb250ZW50cy4gWW91IGNhbiBpbmNsdWRlIHNldmVyYWwgY29kZXBhZ2VzOworCSAgc2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIHRoZSBET1MgY29kZXBhZ2UgdGhhdCBpcyB1c2VkIGluCisJICB0aGUgVW5pdGVkIFN0YXRlcyBhbmQgcGFydHMgb2YgQ2FuYWRhLiBUaGlzIGlzIHJlY29tbWVuZGVkLgorCitjb25maWcgTkxTX0NPREVQQUdFXzczNworCXRyaXN0YXRlICJDb2RlcGFnZSA3MzcgKEdyZWVrKSIKKwlkZXBlbmRzIG9uIE5MUworCWhlbHAKKwkgIFRoZSBNaWNyb3NvZnQgRkFUIGZpbGUgc3lzdGVtIGZhbWlseSBjYW4gZGVhbCB3aXRoIGZpbGVuYW1lcyBpbgorCSAgbmF0aXZlIGxhbmd1YWdlIGNoYXJhY3RlciBzZXRzLiBUaGVzZSBjaGFyYWN0ZXIgc2V0cyBhcmUgc3RvcmVkCisJICBpbiBzby1jYWxsZWQgRE9TIGNvZGVwYWdlcy4gWW91IG5lZWQgdG8gaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUKKwkgIGNvZGVwYWdlIGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gcmVhZC93cml0ZSB0aGVzZSBmaWxlbmFtZXMgb24KKwkgIERPUy9XaW5kb3dzIHBhcnRpdGlvbnMgY29ycmVjdGx5LiBUaGlzIGRvZXMgYXBwbHkgdG8gdGhlIGZpbGVuYW1lcworCSAgb25seSwgbm90IHRvIHRoZSBmaWxlIGNvbnRlbnRzLiBZb3UgY2FuIGluY2x1ZGUgc2V2ZXJhbCBjb2RlcGFnZXM7CisJICBzYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgdGhlIERPUyBjb2RlcGFnZSB0aGF0IGlzIHVzZWQgZm9yCisJICBHcmVlay4gSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIE5MU19DT0RFUEFHRV83NzUKKwl0cmlzdGF0ZSAiQ29kZXBhZ2UgNzc1IChCYWx0aWMgUmltKSIKKwlkZXBlbmRzIG9uIE5MUworCWhlbHAKKwkgIFRoZSBNaWNyb3NvZnQgRkFUIGZpbGUgc3lzdGVtIGZhbWlseSBjYW4gZGVhbCB3aXRoIGZpbGVuYW1lcyBpbgorCSAgbmF0aXZlIGxhbmd1YWdlIGNoYXJhY3RlciBzZXRzLiBUaGVzZSBjaGFyYWN0ZXIgc2V0cyBhcmUgc3RvcmVkCisJICBpbiBzby1jYWxsZWQgRE9TIGNvZGVwYWdlcy4gWW91IG5lZWQgdG8gaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUKKwkgIGNvZGVwYWdlIGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gcmVhZC93cml0ZSB0aGVzZSBmaWxlbmFtZXMgb24KKwkgIERPUy9XaW5kb3dzIHBhcnRpdGlvbnMgY29ycmVjdGx5LiBUaGlzIGRvZXMgYXBwbHkgdG8gdGhlIGZpbGVuYW1lcworCSAgb25seSwgbm90IHRvIHRoZSBmaWxlIGNvbnRlbnRzLiBZb3UgY2FuIGluY2x1ZGUgc2V2ZXJhbCBjb2RlcGFnZXM7CisJICBzYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgdGhlIERPUyBjb2RlcGFnZSB0aGF0IGlzIHVzZWQKKwkgIGZvciB0aGUgQmFsdGljIFJpbSBMYW5ndWFnZXMgKExhdHZpYW4gYW5kIExpdGh1YW5pYW4pLiBJZiB1bnN1cmUsCisJICBzYXkgTi4KKworY29uZmlnIE5MU19DT0RFUEFHRV84NTAKKwl0cmlzdGF0ZSAiQ29kZXBhZ2UgODUwIChFdXJvcGUpIgorCWRlcGVuZHMgb24gTkxTCisJLS0taGVscC0tLQorCSAgVGhlIE1pY3Jvc29mdCBGQVQgZmlsZSBzeXN0ZW0gZmFtaWx5IGNhbiBkZWFsIHdpdGggZmlsZW5hbWVzIGluCisJICBuYXRpdmUgbGFuZ3VhZ2UgY2hhcmFjdGVyIHNldHMuIFRoZXNlIGNoYXJhY3RlciBzZXRzIGFyZSBzdG9yZWQgaW4KKwkgIHNvLWNhbGxlZCBET1MgY29kZXBhZ2VzLiBZb3UgbmVlZCB0byBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZQorCSAgY29kZXBhZ2UgaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byByZWFkL3dyaXRlIHRoZXNlIGZpbGVuYW1lcyBvbgorCSAgRE9TL1dpbmRvd3MgcGFydGl0aW9ucyBjb3JyZWN0bHkuIFRoaXMgZG9lcyBhcHBseSB0byB0aGUgZmlsZW5hbWVzCisJICBvbmx5LCBub3QgdG8gdGhlIGZpbGUgY29udGVudHMuIFlvdSBjYW4gaW5jbHVkZSBzZXZlcmFsIGNvZGVwYWdlczsKKwkgIHNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gaW5jbHVkZSB0aGUgRE9TIGNvZGVwYWdlIHRoYXQgaXMgdXNlZCBmb3IKKwkgIG11Y2ggb2YgRXVyb3BlIC0tIFVuaXRlZCBLaW5nZG9tLCBHZXJtYW55LCBTcGFpbiwgSXRhbHksIGFuZCBbYWRkCisJICBtb3JlIGNvdW50cmllcyBoZXJlXS4gSXQgaGFzIHNvbWUgY2hhcmFjdGVycyB1c2VmdWwgdG8gbWFueSBFdXJvcGVhbgorCSAgbGFuZ3VhZ2VzIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBVUyBjb2RlcGFnZSA0MzcuCisKKwkgIElmIHVuc3VyZSwgc2F5IFkuCisKK2NvbmZpZyBOTFNfQ09ERVBBR0VfODUyCisJdHJpc3RhdGUgIkNvZGVwYWdlIDg1MiAoQ2VudHJhbC9FYXN0ZXJuIEV1cm9wZSkiCisJZGVwZW5kcyBvbiBOTFMKKwktLS1oZWxwLS0tCisJICBUaGUgTWljcm9zb2Z0IEZBVCBmaWxlIHN5c3RlbSBmYW1pbHkgY2FuIGRlYWwgd2l0aCBmaWxlbmFtZXMgaW4KKwkgIG5hdGl2ZSBsYW5ndWFnZSBjaGFyYWN0ZXIgc2V0cy4gVGhlc2UgY2hhcmFjdGVyIHNldHMgYXJlIHN0b3JlZCBpbgorCSAgc28tY2FsbGVkIERPUyBjb2RlcGFnZXMuIFlvdSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlCisJICBjb2RlcGFnZSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHJlYWQvd3JpdGUgdGhlc2UgZmlsZW5hbWVzIG9uCisJICBET1MvV2luZG93cyBwYXJ0aXRpb25zIGNvcnJlY3RseS4gVGhpcyBkb2VzIGFwcGx5IHRvIHRoZSBmaWxlbmFtZXMKKwkgIG9ubHksIG5vdCB0byB0aGUgZmlsZSBjb250ZW50cy4gWW91IGNhbiBpbmNsdWRlIHNldmVyYWwgY29kZXBhZ2VzOworCSAgc2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIHRoZSBMYXRpbiAyIGNvZGVwYWdlIHVzZWQgYnkgRE9TCisJICBmb3IgbXVjaCBvZiBDZW50cmFsIGFuZCBFYXN0ZXJuIEV1cm9wZS4gSXQgaGFzIGFsbCB0aGUgcmVxdWlyZWQKKwkgIGNoYXJhY3RlcnMgZm9yIHRoZXNlIGxhbmd1YWdlczogQWxiYW5pYW4sIENyb2F0aWFuLCBDemVjaCwgRW5nbGlzaCwKKwkgIEZpbm5pc2gsIEh1bmdhcmlhbiwgSXJpc2gsIEdlcm1hbiwgUG9saXNoLCBSb21hbmlhbiwgU2VyYmlhbiAoTGF0aW4KKwkgIHRyYW5zY3JpcHRpb24pLCBTbG92YWssIFNsb3ZlbmlhbiwgYW5kIFNvcmJpYW4uCisKK2NvbmZpZyBOTFNfQ09ERVBBR0VfODU1CisJdHJpc3RhdGUgIkNvZGVwYWdlIDg1NSAoQ3lyaWxsaWMpIgorCWRlcGVuZHMgb24gTkxTCisJaGVscAorCSAgVGhlIE1pY3Jvc29mdCBGQVQgZmlsZSBzeXN0ZW0gZmFtaWx5IGNhbiBkZWFsIHdpdGggZmlsZW5hbWVzIGluCisJICBuYXRpdmUgbGFuZ3VhZ2UgY2hhcmFjdGVyIHNldHMuIFRoZXNlIGNoYXJhY3RlciBzZXRzIGFyZSBzdG9yZWQgaW4KKwkgIHNvLWNhbGxlZCBET1MgY29kZXBhZ2VzLiBZb3UgbmVlZCB0byBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZQorCSAgY29kZXBhZ2UgaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byByZWFkL3dyaXRlIHRoZXNlIGZpbGVuYW1lcyBvbgorCSAgRE9TL1dpbmRvd3MgcGFydGl0aW9ucyBjb3JyZWN0bHkuIFRoaXMgZG9lcyBhcHBseSB0byB0aGUgZmlsZW5hbWVzCisJICBvbmx5LCBub3QgdG8gdGhlIGZpbGUgY29udGVudHMuIFlvdSBjYW4gaW5jbHVkZSBzZXZlcmFsIGNvZGVwYWdlczsKKwkgIHNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gaW5jbHVkZSB0aGUgRE9TIGNvZGVwYWdlIGZvciBDeXJpbGxpYy4KKworY29uZmlnIE5MU19DT0RFUEFHRV84NTcKKwl0cmlzdGF0ZSAiQ29kZXBhZ2UgODU3IChUdXJraXNoKSIKKwlkZXBlbmRzIG9uIE5MUworCWhlbHAKKwkgIFRoZSBNaWNyb3NvZnQgRkFUIGZpbGUgc3lzdGVtIGZhbWlseSBjYW4gZGVhbCB3aXRoIGZpbGVuYW1lcyBpbgorCSAgbmF0aXZlIGxhbmd1YWdlIGNoYXJhY3RlciBzZXRzLiBUaGVzZSBjaGFyYWN0ZXIgc2V0cyBhcmUgc3RvcmVkIGluCisJICBzby1jYWxsZWQgRE9TIGNvZGVwYWdlcy4gWW91IG5lZWQgdG8gaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUKKwkgIGNvZGVwYWdlIGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gcmVhZC93cml0ZSB0aGVzZSBmaWxlbmFtZXMgb24KKwkgIERPUy9XaW5kb3dzIHBhcnRpdGlvbnMgY29ycmVjdGx5LiBUaGlzIGRvZXMgYXBwbHkgdG8gdGhlIGZpbGVuYW1lcworCSAgb25seSwgbm90IHRvIHRoZSBmaWxlIGNvbnRlbnRzLiBZb3UgY2FuIGluY2x1ZGUgc2V2ZXJhbCBjb2RlcGFnZXM7CisJICBzYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgdGhlIERPUyBjb2RlcGFnZSBmb3IgVHVya2lzaC4KKworY29uZmlnIE5MU19DT0RFUEFHRV84NjAKKwl0cmlzdGF0ZSAiQ29kZXBhZ2UgODYwIChQb3J0dWd1ZXNlKSIKKwlkZXBlbmRzIG9uIE5MUworCWhlbHAKKwkgIFRoZSBNaWNyb3NvZnQgRkFUIGZpbGUgc3lzdGVtIGZhbWlseSBjYW4gZGVhbCB3aXRoIGZpbGVuYW1lcyBpbgorCSAgbmF0aXZlIGxhbmd1YWdlIGNoYXJhY3RlciBzZXRzLiBUaGVzZSBjaGFyYWN0ZXIgc2V0cyBhcmUgc3RvcmVkIGluCisJICBzby1jYWxsZWQgRE9TIGNvZGVwYWdlcy4gWW91IG5lZWQgdG8gaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUKKwkgIGNvZGVwYWdlIGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gcmVhZC93cml0ZSB0aGVzZSBmaWxlbmFtZXMgb24KKwkgIERPUy9XaW5kb3dzIHBhcnRpdGlvbnMgY29ycmVjdGx5LiBUaGlzIGRvZXMgYXBwbHkgdG8gdGhlIGZpbGVuYW1lcworCSAgb25seSwgbm90IHRvIHRoZSBmaWxlIGNvbnRlbnRzLiBZb3UgY2FuIGluY2x1ZGUgc2V2ZXJhbCBjb2RlcGFnZXM7CisJICBzYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgdGhlIERPUyBjb2RlcGFnZSBmb3IgUG9ydHVndWVzZS4KKworY29uZmlnIE5MU19DT0RFUEFHRV84NjEKKwl0cmlzdGF0ZSAiQ29kZXBhZ2UgODYxIChJY2VsYW5kaWMpIgorCWRlcGVuZHMgb24gTkxTCisJaGVscAorCSAgVGhlIE1pY3Jvc29mdCBGQVQgZmlsZSBzeXN0ZW0gZmFtaWx5IGNhbiBkZWFsIHdpdGggZmlsZW5hbWVzIGluCisJICBuYXRpdmUgbGFuZ3VhZ2UgY2hhcmFjdGVyIHNldHMuIFRoZXNlIGNoYXJhY3RlciBzZXRzIGFyZSBzdG9yZWQgaW4KKwkgIHNvLWNhbGxlZCBET1MgY29kZXBhZ2VzLiBZb3UgbmVlZCB0byBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZQorCSAgY29kZXBhZ2UgaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byByZWFkL3dyaXRlIHRoZXNlIGZpbGVuYW1lcyBvbgorCSAgRE9TL1dpbmRvd3MgcGFydGl0aW9ucyBjb3JyZWN0bHkuIFRoaXMgZG9lcyBhcHBseSB0byB0aGUgZmlsZW5hbWVzCisJICBvbmx5LCBub3QgdG8gdGhlIGZpbGUgY29udGVudHMuIFlvdSBjYW4gaW5jbHVkZSBzZXZlcmFsIGNvZGVwYWdlczsKKwkgIHNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gaW5jbHVkZSB0aGUgRE9TIGNvZGVwYWdlIGZvciBJY2VsYW5kaWMuCisKK2NvbmZpZyBOTFNfQ09ERVBBR0VfODYyCisJdHJpc3RhdGUgIkNvZGVwYWdlIDg2MiAoSGVicmV3KSIKKwlkZXBlbmRzIG9uIE5MUworCWhlbHAKKwkgIFRoZSBNaWNyb3NvZnQgRkFUIGZpbGUgc3lzdGVtIGZhbWlseSBjYW4gZGVhbCB3aXRoIGZpbGVuYW1lcyBpbgorCSAgbmF0aXZlIGxhbmd1YWdlIGNoYXJhY3RlciBzZXRzLiBUaGVzZSBjaGFyYWN0ZXIgc2V0cyBhcmUgc3RvcmVkIGluCisJICBzby1jYWxsZWQgRE9TIGNvZGVwYWdlcy4gWW91IG5lZWQgdG8gaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUKKwkgIGNvZGVwYWdlIGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gcmVhZC93cml0ZSB0aGVzZSBmaWxlbmFtZXMgb24KKwkgIERPUy9XaW5kb3dzIHBhcnRpdGlvbnMgY29ycmVjdGx5LiBUaGlzIGRvZXMgYXBwbHkgdG8gdGhlIGZpbGVuYW1lcworCSAgb25seSwgbm90IHRvIHRoZSBmaWxlIGNvbnRlbnRzLiBZb3UgY2FuIGluY2x1ZGUgc2V2ZXJhbCBjb2RlcGFnZXM7CisJICBzYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgdGhlIERPUyBjb2RlcGFnZSBmb3IgSGVicmV3LgorCitjb25maWcgTkxTX0NPREVQQUdFXzg2MworCXRyaXN0YXRlICJDb2RlcGFnZSA4NjMgKENhbmFkaWFuIEZyZW5jaCkiCisJZGVwZW5kcyBvbiBOTFMKKwloZWxwCisJICBUaGUgTWljcm9zb2Z0IEZBVCBmaWxlIHN5c3RlbSBmYW1pbHkgY2FuIGRlYWwgd2l0aCBmaWxlbmFtZXMgaW4KKwkgIG5hdGl2ZSBsYW5ndWFnZSBjaGFyYWN0ZXIgc2V0cy4gVGhlc2UgY2hhcmFjdGVyIHNldHMgYXJlIHN0b3JlZCBpbgorCSAgc28tY2FsbGVkIERPUyBjb2RlcGFnZXMuIFlvdSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlCisJICBjb2RlcGFnZSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHJlYWQvd3JpdGUgdGhlc2UgZmlsZW5hbWVzIG9uCisJICBET1MvV2luZG93cyBwYXJ0aXRpb25zIGNvcnJlY3RseS4gVGhpcyBkb2VzIGFwcGx5IHRvIHRoZSBmaWxlbmFtZXMKKwkgIG9ubHksIG5vdCB0byB0aGUgZmlsZSBjb250ZW50cy4gWW91IGNhbiBpbmNsdWRlIHNldmVyYWwgY29kZXBhZ2VzOworCSAgc2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIHRoZSBET1MgY29kZXBhZ2UgZm9yIENhbmFkaWFuCisJICBGcmVuY2guCisKK2NvbmZpZyBOTFNfQ09ERVBBR0VfODY0CisJdHJpc3RhdGUgIkNvZGVwYWdlIDg2NCAoQXJhYmljKSIKKwlkZXBlbmRzIG9uIE5MUworCWhlbHAKKwkgIFRoZSBNaWNyb3NvZnQgRkFUIGZpbGUgc3lzdGVtIGZhbWlseSBjYW4gZGVhbCB3aXRoIGZpbGVuYW1lcyBpbgorCSAgbmF0aXZlIGxhbmd1YWdlIGNoYXJhY3RlciBzZXRzLiBUaGVzZSBjaGFyYWN0ZXIgc2V0cyBhcmUgc3RvcmVkIGluCisJICBzby1jYWxsZWQgRE9TIGNvZGVwYWdlcy4gWW91IG5lZWQgdG8gaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUKKwkgIGNvZGVwYWdlIGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gcmVhZC93cml0ZSB0aGVzZSBmaWxlbmFtZXMgb24KKwkgIERPUy9XaW5kb3dzIHBhcnRpdGlvbnMgY29ycmVjdGx5LiBUaGlzIGRvZXMgYXBwbHkgdG8gdGhlIGZpbGVuYW1lcworCSAgb25seSwgbm90IHRvIHRoZSBmaWxlIGNvbnRlbnRzLiBZb3UgY2FuIGluY2x1ZGUgc2V2ZXJhbCBjb2RlcGFnZXM7CisJICBzYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgdGhlIERPUyBjb2RlcGFnZSBmb3IgQXJhYmljLgorCitjb25maWcgTkxTX0NPREVQQUdFXzg2NQorCXRyaXN0YXRlICJDb2RlcGFnZSA4NjUgKE5vcndlZ2lhbiwgRGFuaXNoKSIKKwlkZXBlbmRzIG9uIE5MUworCWhlbHAKKwkgIFRoZSBNaWNyb3NvZnQgRkFUIGZpbGUgc3lzdGVtIGZhbWlseSBjYW4gZGVhbCB3aXRoIGZpbGVuYW1lcyBpbgorCSAgbmF0aXZlIGxhbmd1YWdlIGNoYXJhY3RlciBzZXRzLiBUaGVzZSBjaGFyYWN0ZXIgc2V0cyBhcmUgc3RvcmVkIGluCisJICBzby1jYWxsZWQgRE9TIGNvZGVwYWdlcy4gWW91IG5lZWQgdG8gaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUKKwkgIGNvZGVwYWdlIGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gcmVhZC93cml0ZSB0aGVzZSBmaWxlbmFtZXMgb24KKwkgIERPUy9XaW5kb3dzIHBhcnRpdGlvbnMgY29ycmVjdGx5LiBUaGlzIGRvZXMgYXBwbHkgdG8gdGhlIGZpbGVuYW1lcworCSAgb25seSwgbm90IHRvIHRoZSBmaWxlIGNvbnRlbnRzLiBZb3UgY2FuIGluY2x1ZGUgc2V2ZXJhbCBjb2RlcGFnZXM7CisJICBzYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgdGhlIERPUyBjb2RlcGFnZSBmb3IgdGhlIE5vcmRpYworCSAgRXVyb3BlYW4gY291bnRyaWVzLgorCitjb25maWcgTkxTX0NPREVQQUdFXzg2NgorCXRyaXN0YXRlICJDb2RlcGFnZSA4NjYgKEN5cmlsbGljL1J1c3NpYW4pIgorCWRlcGVuZHMgb24gTkxTCisJaGVscAorCSAgVGhlIE1pY3Jvc29mdCBGQVQgZmlsZSBzeXN0ZW0gZmFtaWx5IGNhbiBkZWFsIHdpdGggZmlsZW5hbWVzIGluCisJICBuYXRpdmUgbGFuZ3VhZ2UgY2hhcmFjdGVyIHNldHMuIFRoZXNlIGNoYXJhY3RlciBzZXRzIGFyZSBzdG9yZWQgaW4KKwkgIHNvLWNhbGxlZCBET1MgY29kZXBhZ2VzLiBZb3UgbmVlZCB0byBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZQorCSAgY29kZXBhZ2UgaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byByZWFkL3dyaXRlIHRoZXNlIGZpbGVuYW1lcyBvbgorCSAgRE9TL1dpbmRvd3MgcGFydGl0aW9ucyBjb3JyZWN0bHkuIFRoaXMgZG9lcyBhcHBseSB0byB0aGUgZmlsZW5hbWVzCisJICBvbmx5LCBub3QgdG8gdGhlIGZpbGUgY29udGVudHMuIFlvdSBjYW4gaW5jbHVkZSBzZXZlcmFsIGNvZGVwYWdlczsKKwkgIHNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gaW5jbHVkZSB0aGUgRE9TIGNvZGVwYWdlIGZvcgorCSAgQ3lyaWxsaWMvUnVzc2lhbi4KKworY29uZmlnIE5MU19DT0RFUEFHRV84NjkKKwl0cmlzdGF0ZSAiQ29kZXBhZ2UgODY5IChHcmVlaykiCisJZGVwZW5kcyBvbiBOTFMKKwloZWxwCisJICBUaGUgTWljcm9zb2Z0IEZBVCBmaWxlIHN5c3RlbSBmYW1pbHkgY2FuIGRlYWwgd2l0aCBmaWxlbmFtZXMgaW4KKwkgIG5hdGl2ZSBsYW5ndWFnZSBjaGFyYWN0ZXIgc2V0cy4gVGhlc2UgY2hhcmFjdGVyIHNldHMgYXJlIHN0b3JlZCBpbgorCSAgc28tY2FsbGVkIERPUyBjb2RlcGFnZXMuIFlvdSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlCisJICBjb2RlcGFnZSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHJlYWQvd3JpdGUgdGhlc2UgZmlsZW5hbWVzIG9uCisJICBET1MvV2luZG93cyBwYXJ0aXRpb25zIGNvcnJlY3RseS4gVGhpcyBkb2VzIGFwcGx5IHRvIHRoZSBmaWxlbmFtZXMKKwkgIG9ubHksIG5vdCB0byB0aGUgZmlsZSBjb250ZW50cy4gWW91IGNhbiBpbmNsdWRlIHNldmVyYWwgY29kZXBhZ2VzOworCSAgc2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIHRoZSBET1MgY29kZXBhZ2UgZm9yIEdyZWVrLgorCitjb25maWcgTkxTX0NPREVQQUdFXzkzNgorCXRyaXN0YXRlICJTaW1wbGlmaWVkIENoaW5lc2UgY2hhcnNldCAoQ1A5MzYsIEdCMjMxMikiCisJZGVwZW5kcyBvbiBOTFMKKwloZWxwCisJICBUaGUgTWljcm9zb2Z0IEZBVCBmaWxlIHN5c3RlbSBmYW1pbHkgY2FuIGRlYWwgd2l0aCBmaWxlbmFtZXMgaW4KKwkgIG5hdGl2ZSBsYW5ndWFnZSBjaGFyYWN0ZXIgc2V0cy4gVGhlc2UgY2hhcmFjdGVyIHNldHMgYXJlIHN0b3JlZCBpbgorCSAgc28tY2FsbGVkIERPUyBjb2RlcGFnZXMuIFlvdSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlCisJICBjb2RlcGFnZSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHJlYWQvd3JpdGUgdGhlc2UgZmlsZW5hbWVzIG9uCisJICBET1MvV2luZG93cyBwYXJ0aXRpb25zIGNvcnJlY3RseS4gVGhpcyBkb2VzIGFwcGx5IHRvIHRoZSBmaWxlbmFtZXMKKwkgIG9ubHksIG5vdCB0byB0aGUgZmlsZSBjb250ZW50cy4gWW91IGNhbiBpbmNsdWRlIHNldmVyYWwgY29kZXBhZ2VzOworCSAgc2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIHRoZSBET1MgY29kZXBhZ2UgZm9yIFNpbXBsaWZpZWQKKwkgIENoaW5lc2UoR0JLKS4KKworY29uZmlnIE5MU19DT0RFUEFHRV85NTAKKwl0cmlzdGF0ZSAiVHJhZGl0aW9uYWwgQ2hpbmVzZSBjaGFyc2V0IChCaWc1KSIKKwlkZXBlbmRzIG9uIE5MUworCWhlbHAKKwkgIFRoZSBNaWNyb3NvZnQgRkFUIGZpbGUgc3lzdGVtIGZhbWlseSBjYW4gZGVhbCB3aXRoIGZpbGVuYW1lcyBpbgorCSAgbmF0aXZlIGxhbmd1YWdlIGNoYXJhY3RlciBzZXRzLiBUaGVzZSBjaGFyYWN0ZXIgc2V0cyBhcmUgc3RvcmVkIGluCisJICBzby1jYWxsZWQgRE9TIGNvZGVwYWdlcy4gWW91IG5lZWQgdG8gaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUKKwkgIGNvZGVwYWdlIGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gcmVhZC93cml0ZSB0aGVzZSBmaWxlbmFtZXMgb24KKwkgIERPUy9XaW5kb3dzIHBhcnRpdGlvbnMgY29ycmVjdGx5LiBUaGlzIGRvZXMgYXBwbHkgdG8gdGhlIGZpbGVuYW1lcworCSAgb25seSwgbm90IHRvIHRoZSBmaWxlIGNvbnRlbnRzLiBZb3UgY2FuIGluY2x1ZGUgc2V2ZXJhbCBjb2RlcGFnZXM7CisJICBzYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgdGhlIERPUyBjb2RlcGFnZSBmb3IgVHJhZGl0aW9uYWwKKwkgIENoaW5lc2UoQmlnNSkuCisKK2NvbmZpZyBOTFNfQ09ERVBBR0VfOTMyCisJdHJpc3RhdGUgIkphcGFuZXNlIGNoYXJzZXRzIChTaGlmdC1KSVMsIEVVQy1KUCkiCisJZGVwZW5kcyBvbiBOTFMKKwloZWxwCisJICBUaGUgTWljcm9zb2Z0IEZBVCBmaWxlIHN5c3RlbSBmYW1pbHkgY2FuIGRlYWwgd2l0aCBmaWxlbmFtZXMgaW4KKwkgIG5hdGl2ZSBsYW5ndWFnZSBjaGFyYWN0ZXIgc2V0cy4gVGhlc2UgY2hhcmFjdGVyIHNldHMgYXJlIHN0b3JlZCBpbgorCSAgc28tY2FsbGVkIERPUyBjb2RlcGFnZXMuIFlvdSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlCisJICBjb2RlcGFnZSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHJlYWQvd3JpdGUgdGhlc2UgZmlsZW5hbWVzIG9uCisJICBET1MvV2luZG93cyBwYXJ0aXRpb25zIGNvcnJlY3RseS4gVGhpcyBkb2VzIGFwcGx5IHRvIHRoZSBmaWxlbmFtZXMKKwkgIG9ubHksIG5vdCB0byB0aGUgZmlsZSBjb250ZW50cy4gWW91IGNhbiBpbmNsdWRlIHNldmVyYWwgY29kZXBhZ2VzOworCSAgc2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIHRoZSBET1MgY29kZXBhZ2UgZm9yIFNoaWZ0LUpJUworCSAgb3IgRVVDLUpQLiBUbyB1c2UgRVVDLUpQLCB5b3UgY2FuIHVzZSAnZXVjLWpwJyBhcyBtb3VudCBvcHRpb24gb3IKKwkgIE5MUyBEZWZhdWx0IHZhbHVlIGR1cmluZyBrZXJuZWwgY29uZmlndXJhdGlvbiwgaW5zdGVhZCBvZiAnY3A5MzInLgorCitjb25maWcgTkxTX0NPREVQQUdFXzk0OQorCXRyaXN0YXRlICJLb3JlYW4gY2hhcnNldCAoQ1A5NDksIEVVQy1LUikiCisJZGVwZW5kcyBvbiBOTFMKKwloZWxwCisJICBUaGUgTWljcm9zb2Z0IEZBVCBmaWxlIHN5c3RlbSBmYW1pbHkgY2FuIGRlYWwgd2l0aCBmaWxlbmFtZXMgaW4KKwkgIG5hdGl2ZSBsYW5ndWFnZSBjaGFyYWN0ZXIgc2V0cy4gVGhlc2UgY2hhcmFjdGVyIHNldHMgYXJlIHN0b3JlZCBpbgorCSAgc28tY2FsbGVkIERPUyBjb2RlcGFnZXMuIFlvdSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlCisJICBjb2RlcGFnZSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHJlYWQvd3JpdGUgdGhlc2UgZmlsZW5hbWVzIG9uCisJICBET1MvV2luZG93cyBwYXJ0aXRpb25zIGNvcnJlY3RseS4gVGhpcyBkb2VzIGFwcGx5IHRvIHRoZSBmaWxlbmFtZXMKKwkgIG9ubHksIG5vdCB0byB0aGUgZmlsZSBjb250ZW50cy4gWW91IGNhbiBpbmNsdWRlIHNldmVyYWwgY29kZXBhZ2VzOworCSAgc2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIHRoZSBET1MgY29kZXBhZ2UgZm9yIFVIQy4KKworY29uZmlnIE5MU19DT0RFUEFHRV84NzQKKwl0cmlzdGF0ZSAiVGhhaSBjaGFyc2V0IChDUDg3NCwgVElTLTYyMCkiCisJZGVwZW5kcyBvbiBOTFMKKwloZWxwCisJICBUaGUgTWljcm9zb2Z0IEZBVCBmaWxlIHN5c3RlbSBmYW1pbHkgY2FuIGRlYWwgd2l0aCBmaWxlbmFtZXMgaW4KKwkgIG5hdGl2ZSBsYW5ndWFnZSBjaGFyYWN0ZXIgc2V0cy4gVGhlc2UgY2hhcmFjdGVyIHNldHMgYXJlIHN0b3JlZCBpbgorCSAgc28tY2FsbGVkIERPUyBjb2RlcGFnZXMuIFlvdSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlCisJICBjb2RlcGFnZSBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHJlYWQvd3JpdGUgdGhlc2UgZmlsZW5hbWVzIG9uCisJICBET1MvV2luZG93cyBwYXJ0aXRpb25zIGNvcnJlY3RseS4gVGhpcyBkb2VzIGFwcGx5IHRvIHRoZSBmaWxlbmFtZXMKKwkgIG9ubHksIG5vdCB0byB0aGUgZmlsZSBjb250ZW50cy4gWW91IGNhbiBpbmNsdWRlIHNldmVyYWwgY29kZXBhZ2VzOworCSAgc2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIHRoZSBET1MgY29kZXBhZ2UgZm9yIFRoYWkuCisKK2NvbmZpZyBOTFNfSVNPODg1OV84CisJdHJpc3RhdGUgIkhlYnJldyBjaGFyc2V0cyAoSVNPLTg4NTktOCwgQ1AxMjU1KSIKKwlkZXBlbmRzIG9uIE5MUworCWhlbHAKKwkgIElmIHlvdSB3YW50IHRvIGRpc3BsYXkgZmlsZW5hbWVzIHdpdGggbmF0aXZlIGxhbmd1YWdlIGNoYXJhY3RlcnMKKwkgIGZyb20gdGhlIE1pY3Jvc29mdCBGQVQgZmlsZSBzeXN0ZW0gZmFtaWx5IG9yIGZyb20gSk9MSUVUIENELVJPTXMKKwkgIGNvcnJlY3RseSBvbiB0aGUgc2NyZWVuLCB5b3UgbmVlZCB0byBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZQorCSAgaW5wdXQvb3V0cHV0IGNoYXJhY3RlciBzZXRzLiBTYXkgWSBoZXJlIGZvciBJU084ODU5LTgsIHRoZSBIZWJyZXcKKwkgIGNoYXJhY3RlciBzZXQuCisKK2NvbmZpZyBOTFNfQ09ERVBBR0VfMTI1MAorCXRyaXN0YXRlICJXaW5kb3dzIENQMTI1MCAoU2xhdmljL0NlbnRyYWwgRXVyb3BlYW4gTGFuZ3VhZ2VzKSIKKwlkZXBlbmRzIG9uIE5MUworCWhlbHAKKwkgIElmIHlvdSB3YW50IHRvIGRpc3BsYXkgZmlsZW5hbWVzIHdpdGggbmF0aXZlIGxhbmd1YWdlIGNoYXJhY3RlcnMKKwkgIGZyb20gdGhlIE1pY3Jvc29mdCBGQVQgZmlsZSBzeXN0ZW0gZmFtaWx5IG9yIGZyb20gSk9MSUVUIENEUk9NcworCSAgY29ycmVjdGx5IG9uIHRoZSBzY3JlZW4sIHlvdSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlCisJICBpbnB1dC9vdXRwdXQgY2hhcmFjdGVyIHNldHMuIFNheSBZIGhlcmUgZm9yIHRoZSBXaW5kb3dzIENQLTEyNTAKKwkgIGNoYXJhY3RlciBzZXQsIHdoaWNoIHdvcmtzIGZvciBtb3N0IExhdGluLXdyaXR0ZW4gU2xhdmljIGFuZCBDZW50cmFsCisJICBFdXJvcGVhbiBsYW5ndWFnZXM6IEN6ZWNoLCBHZXJtYW4sIEh1bmdhcmlhbiwgUG9saXNoLCBSdW1hbmlhbiwgQ3JvYXRpYW4sCisJICBTbG92YWssIFNsb3ZlbmUuCisKK2NvbmZpZyBOTFNfQ09ERVBBR0VfMTI1MQorCXRyaXN0YXRlICJXaW5kb3dzIENQMTI1MSAoQnVsZ2FyaWFuLCBCZWxhcnVzaWFuKSIKKwlkZXBlbmRzIG9uIE5MUworCWhlbHAKKwkgIFRoZSBNaWNyb3NvZnQgRkFUIGZpbGUgc3lzdGVtIGZhbWlseSBjYW4gZGVhbCB3aXRoIGZpbGVuYW1lcyBpbgorCSAgbmF0aXZlIGxhbmd1YWdlIGNoYXJhY3RlciBzZXRzLiBUaGVzZSBjaGFyYWN0ZXIgc2V0cyBhcmUgc3RvcmVkIGluCisJICBzby1jYWxsZWQgRE9TIGNvZGVwYWdlcy4gWW91IG5lZWQgdG8gaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUKKwkgIGNvZGVwYWdlIGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gcmVhZC93cml0ZSB0aGVzZSBmaWxlbmFtZXMgb24KKwkgIERPUy9XaW5kb3dzIHBhcnRpdGlvbnMgY29ycmVjdGx5LiBUaGlzIGRvZXMgYXBwbHkgdG8gdGhlIGZpbGVuYW1lcworCSAgb25seSwgbm90IHRvIHRoZSBmaWxlIGNvbnRlbnRzLiBZb3UgY2FuIGluY2x1ZGUgc2V2ZXJhbCBjb2RlcGFnZXM7CisJICBzYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgdGhlIERPUyBjb2RlcGFnZSBmb3IgUnVzc2lhbiBhbmQKKwkgIEJ1bGdhcmlhbiBhbmQgQmVsYXJ1c2lhbi4KKworY29uZmlnIE5MU19BU0NJSQorCXRyaXN0YXRlICJBU0NJSSAoVW5pdGVkIFN0YXRlcykiCisJZGVwZW5kcyBvbiBOTFMKKwloZWxwCisJICBBbiBBU0NJSSBOTFMgbW9kdWxlIGlzIG5lZWRlZCBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKKwkgIERFRkFVTFQgTkxTIHdpdGggdGhpcyB2ZXJ5IGJhc2ljIGNoYXJzZXQgYW5kIGRvbid0IHdhbnQgYW55CisJICBub24tQVNDSUkgY2hhcmFjdGVycyB0byBiZSB0cmFuc2xhdGVkLgorCitjb25maWcgTkxTX0lTTzg4NTlfMQorCXRyaXN0YXRlICJOTFMgSVNPIDg4NTktMSAgKExhdGluIDE7IFdlc3Rlcm4gRXVyb3BlYW4gTGFuZ3VhZ2VzKSIKKwlkZXBlbmRzIG9uIE5MUworCWhlbHAKKwkgIElmIHlvdSB3YW50IHRvIGRpc3BsYXkgZmlsZW5hbWVzIHdpdGggbmF0aXZlIGxhbmd1YWdlIGNoYXJhY3RlcnMKKwkgIGZyb20gdGhlIE1pY3Jvc29mdCBGQVQgZmlsZSBzeXN0ZW0gZmFtaWx5IG9yIGZyb20gSk9MSUVUIENELVJPTXMKKwkgIGNvcnJlY3RseSBvbiB0aGUgc2NyZWVuLCB5b3UgbmVlZCB0byBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZQorCSAgaW5wdXQvb3V0cHV0IGNoYXJhY3RlciBzZXRzLiBTYXkgWSBoZXJlIGZvciB0aGUgTGF0aW4gMSBjaGFyYWN0ZXIKKwkgIHNldCwgd2hpY2ggY292ZXJzIG1vc3QgV2VzdCBFdXJvcGVhbiBsYW5ndWFnZXMgc3VjaCBhcyBBbGJhbmlhbiwKKwkgIENhdGFsYW4sIERhbmlzaCwgRHV0Y2gsIEVuZ2xpc2gsIEZhZXJvZXNlLCBGaW5uaXNoLCBGcmVuY2gsIEdlcm1hbiwKKwkgIEdhbGljaWFuLCBJcmlzaCwgSWNlbGFuZGljLCBJdGFsaWFuLCBOb3J3ZWdpYW4sIFBvcnR1Z3Vlc2UsIFNwYW5pc2gsCisJICBhbmQgU3dlZGlzaC4gSXQgaXMgYWxzbyB0aGUgZGVmYXVsdCBmb3IgdGhlIFVTLiBJZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgTkxTX0lTTzg4NTlfMgorCXRyaXN0YXRlICJOTFMgSVNPIDg4NTktMiAgKExhdGluIDI7IFNsYXZpYy9DZW50cmFsIEV1cm9wZWFuIExhbmd1YWdlcykiCisJZGVwZW5kcyBvbiBOTFMKKwloZWxwCisJICBJZiB5b3Ugd2FudCB0byBkaXNwbGF5IGZpbGVuYW1lcyB3aXRoIG5hdGl2ZSBsYW5ndWFnZSBjaGFyYWN0ZXJzCisJICBmcm9tIHRoZSBNaWNyb3NvZnQgRkFUIGZpbGUgc3lzdGVtIGZhbWlseSBvciBmcm9tIEpPTElFVCBDRC1ST01zCisJICBjb3JyZWN0bHkgb24gdGhlIHNjcmVlbiwgeW91IG5lZWQgdG8gaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUKKwkgIGlucHV0L291dHB1dCBjaGFyYWN0ZXIgc2V0cy4gU2F5IFkgaGVyZSBmb3IgdGhlIExhdGluIDIgY2hhcmFjdGVyCisJICBzZXQsIHdoaWNoIHdvcmtzIGZvciBtb3N0IExhdGluLXdyaXR0ZW4gU2xhdmljIGFuZCBDZW50cmFsIEV1cm9wZWFuCisJICBsYW5ndWFnZXM6IEN6ZWNoLCBHZXJtYW4sIEh1bmdhcmlhbiwgUG9saXNoLCBSdW1hbmlhbiwgQ3JvYXRpYW4sCisJICBTbG92YWssIFNsb3ZlbmUuCisKK2NvbmZpZyBOTFNfSVNPODg1OV8zCisJdHJpc3RhdGUgIk5MUyBJU08gODg1OS0zICAoTGF0aW4gMzsgRXNwZXJhbnRvLCBHYWxpY2lhbiwgTWFsdGVzZSwgVHVya2lzaCkiCisJZGVwZW5kcyBvbiBOTFMKKwloZWxwCisJICBJZiB5b3Ugd2FudCB0byBkaXNwbGF5IGZpbGVuYW1lcyB3aXRoIG5hdGl2ZSBsYW5ndWFnZSBjaGFyYWN0ZXJzCisJICBmcm9tIHRoZSBNaWNyb3NvZnQgRkFUIGZpbGUgc3lzdGVtIGZhbWlseSBvciBmcm9tIEpPTElFVCBDRC1ST01zCisJICBjb3JyZWN0bHkgb24gdGhlIHNjcmVlbiwgeW91IG5lZWQgdG8gaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUKKwkgIGlucHV0L291dHB1dCBjaGFyYWN0ZXIgc2V0cy4gU2F5IFkgaGVyZSBmb3IgdGhlIExhdGluIDMgY2hhcmFjdGVyCisJICBzZXQsIHdoaWNoIGlzIHBvcHVsYXIgd2l0aCBhdXRob3JzIG9mIEVzcGVyYW50bywgR2FsaWNpYW4sIE1hbHRlc2UsCisJICBhbmQgVHVya2lzaC4KKworY29uZmlnIE5MU19JU084ODU5XzQKKwl0cmlzdGF0ZSAiTkxTIElTTyA4ODU5LTQgIChMYXRpbiA0OyBvbGQgQmFsdGljIGNoYXJzZXQpIgorCWRlcGVuZHMgb24gTkxTCisJaGVscAorCSAgSWYgeW91IHdhbnQgdG8gZGlzcGxheSBmaWxlbmFtZXMgd2l0aCBuYXRpdmUgbGFuZ3VhZ2UgY2hhcmFjdGVycworCSAgZnJvbSB0aGUgTWljcm9zb2Z0IEZBVCBmaWxlIHN5c3RlbSBmYW1pbHkgb3IgZnJvbSBKT0xJRVQgQ0QtUk9NcworCSAgY29ycmVjdGx5IG9uIHRoZSBzY3JlZW4sIHlvdSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlCisJICBpbnB1dC9vdXRwdXQgY2hhcmFjdGVyIHNldHMuIFNheSBZIGhlcmUgZm9yIHRoZSBMYXRpbiA0IGNoYXJhY3RlcgorCSAgc2V0IHdoaWNoIGludHJvZHVjZXMgbGV0dGVycyBmb3IgRXN0b25pYW4sIExhdHZpYW4sIGFuZAorCSAgTGl0aHVhbmlhbi4gSXQgaXMgYW4gaW5jb21wbGV0ZSBwcmVkZWNlc3NvciBvZiBMYXRpbiA3LgorCitjb25maWcgTkxTX0lTTzg4NTlfNQorCXRyaXN0YXRlICJOTFMgSVNPIDg4NTktNSAgKEN5cmlsbGljKSIKKwlkZXBlbmRzIG9uIE5MUworCWhlbHAKKwkgIElmIHlvdSB3YW50IHRvIGRpc3BsYXkgZmlsZW5hbWVzIHdpdGggbmF0aXZlIGxhbmd1YWdlIGNoYXJhY3RlcnMKKwkgIGZyb20gdGhlIE1pY3Jvc29mdCBGQVQgZmlsZSBzeXN0ZW0gZmFtaWx5IG9yIGZyb20gSk9MSUVUIENELVJPTXMKKwkgIGNvcnJlY3RseSBvbiB0aGUgc2NyZWVuLCB5b3UgbmVlZCB0byBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZQorCSAgaW5wdXQvb3V0cHV0IGNoYXJhY3RlciBzZXRzLiBTYXkgWSBoZXJlIGZvciBJU084ODU5LTUsIGEgQ3lyaWxsaWMKKwkgIGNoYXJhY3RlciBzZXQgd2l0aCB3aGljaCB5b3UgY2FuIHR5cGUgQnVsZ2FyaWFuLCBCZWxhcnVzaWFuLAorCSAgTWFjZWRvbmlhbiwgUnVzc2lhbiwgU2VyYmlhbiwgYW5kIFVrcmFpbmlhbi4gTm90ZSB0aGF0IHRoZSBjaGFyc2V0CisJICBLT0k4LVIgaXMgcHJlZmVycmVkIGluIFJ1c3NpYS4KKworY29uZmlnIE5MU19JU084ODU5XzYKKwl0cmlzdGF0ZSAiTkxTIElTTyA4ODU5LTYgIChBcmFiaWMpIgorCWRlcGVuZHMgb24gTkxTCisJaGVscAorCSAgSWYgeW91IHdhbnQgdG8gZGlzcGxheSBmaWxlbmFtZXMgd2l0aCBuYXRpdmUgbGFuZ3VhZ2UgY2hhcmFjdGVycworCSAgZnJvbSB0aGUgTWljcm9zb2Z0IEZBVCBmaWxlIHN5c3RlbSBmYW1pbHkgb3IgZnJvbSBKT0xJRVQgQ0QtUk9NcworCSAgY29ycmVjdGx5IG9uIHRoZSBzY3JlZW4sIHlvdSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlCisJICBpbnB1dC9vdXRwdXQgY2hhcmFjdGVyIHNldHMuIFNheSBZIGhlcmUgZm9yIElTTzg4NTktNiwgdGhlIEFyYWJpYworCSAgY2hhcmFjdGVyIHNldC4KKworY29uZmlnIE5MU19JU084ODU5XzcKKwl0cmlzdGF0ZSAiTkxTIElTTyA4ODU5LTcgIChNb2Rlcm4gR3JlZWspIgorCWRlcGVuZHMgb24gTkxTCisJaGVscAorCSAgSWYgeW91IHdhbnQgdG8gZGlzcGxheSBmaWxlbmFtZXMgd2l0aCBuYXRpdmUgbGFuZ3VhZ2UgY2hhcmFjdGVycworCSAgZnJvbSB0aGUgTWljcm9zb2Z0IEZBVCBmaWxlIHN5c3RlbSBmYW1pbHkgb3IgZnJvbSBKT0xJRVQgQ0QtUk9NcworCSAgY29ycmVjdGx5IG9uIHRoZSBzY3JlZW4sIHlvdSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlCisJICBpbnB1dC9vdXRwdXQgY2hhcmFjdGVyIHNldHMuIFNheSBZIGhlcmUgZm9yIElTTzg4NTktNywgdGhlIE1vZGVybgorCSAgR3JlZWsgY2hhcmFjdGVyIHNldC4KKworY29uZmlnIE5MU19JU084ODU5XzkKKwl0cmlzdGF0ZSAiTkxTIElTTyA4ODU5LTkgIChMYXRpbiA1OyBUdXJraXNoKSIKKwlkZXBlbmRzIG9uIE5MUworCWhlbHAKKwkgIElmIHlvdSB3YW50IHRvIGRpc3BsYXkgZmlsZW5hbWVzIHdpdGggbmF0aXZlIGxhbmd1YWdlIGNoYXJhY3RlcnMKKwkgIGZyb20gdGhlIE1pY3Jvc29mdCBGQVQgZmlsZSBzeXN0ZW0gZmFtaWx5IG9yIGZyb20gSk9MSUVUIENELVJPTXMKKwkgIGNvcnJlY3RseSBvbiB0aGUgc2NyZWVuLCB5b3UgbmVlZCB0byBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZQorCSAgaW5wdXQvb3V0cHV0IGNoYXJhY3RlciBzZXRzLiBTYXkgWSBoZXJlIGZvciB0aGUgTGF0aW4gNSBjaGFyYWN0ZXIKKwkgIHNldCwgYW5kIGl0IHJlcGxhY2VzIHRoZSByYXJlbHkgbmVlZGVkIEljZWxhbmRpYyBsZXR0ZXJzIGluIExhdGluIDEKKwkgIHdpdGggdGhlIFR1cmtpc2ggb25lcy4gVXNlZnVsIGluIFR1cmtleS4KKworY29uZmlnIE5MU19JU084ODU5XzEzCisJdHJpc3RhdGUgIk5MUyBJU08gODg1OS0xMyAoTGF0aW4gNzsgQmFsdGljKSIKKwlkZXBlbmRzIG9uIE5MUworCWhlbHAKKwkgIElmIHlvdSB3YW50IHRvIGRpc3BsYXkgZmlsZW5hbWVzIHdpdGggbmF0aXZlIGxhbmd1YWdlIGNoYXJhY3RlcnMKKwkgIGZyb20gdGhlIE1pY3Jvc29mdCBGQVQgZmlsZSBzeXN0ZW0gZmFtaWx5IG9yIGZyb20gSk9MSUVUIENELVJPTXMKKwkgIGNvcnJlY3RseSBvbiB0aGUgc2NyZWVuLCB5b3UgbmVlZCB0byBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZQorCSAgaW5wdXQvb3V0cHV0IGNoYXJhY3RlciBzZXRzLiBTYXkgWSBoZXJlIGZvciB0aGUgTGF0aW4gNyBjaGFyYWN0ZXIKKwkgIHNldCwgd2hpY2ggc3VwcG9ydHMgbW9kZXJuIEJhbHRpYyBsYW5ndWFnZXMgaW5jbHVkaW5nIExhdHZpYW4KKwkgIGFuZCBMaXRodWFuaWFuLgorCitjb25maWcgTkxTX0lTTzg4NTlfMTQKKwl0cmlzdGF0ZSAiTkxTIElTTyA4ODU5LTE0IChMYXRpbiA4OyBDZWx0aWMpIgorCWRlcGVuZHMgb24gTkxTCisJaGVscAorCSAgSWYgeW91IHdhbnQgdG8gZGlzcGxheSBmaWxlbmFtZXMgd2l0aCBuYXRpdmUgbGFuZ3VhZ2UgY2hhcmFjdGVycworCSAgZnJvbSB0aGUgTWljcm9zb2Z0IEZBVCBmaWxlIHN5c3RlbSBmYW1pbHkgb3IgZnJvbSBKT0xJRVQgQ0QtUk9NcworCSAgY29ycmVjdGx5IG9uIHRoZSBzY3JlZW4sIHlvdSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlCisJICBpbnB1dC9vdXRwdXQgY2hhcmFjdGVyIHNldHMuIFNheSBZIGhlcmUgZm9yIHRoZSBMYXRpbiA4IGNoYXJhY3RlcgorCSAgc2V0LCB3aGljaCBhZGRzIHRoZSBsYXN0IGFjY2VudGVkIHZvd2VscyBmb3IgV2Vsc2ggKGFrYSBDeW1yYWVnKQorCSAgKGFuZCBNYW54IEdhZWxpYykgdGhhdCB3ZXJlIG1pc3NpbmcgaW4gTGF0aW4gMS4KKwkgIDxodHRwOi8vbGludXguc3BlZWNoLmN5bXJ1Lm9yZy8+IGhhcyBmdXJ0aGVyIGluZm9ybWF0aW9uLgorCitjb25maWcgTkxTX0lTTzg4NTlfMTUKKwl0cmlzdGF0ZSAiTkxTIElTTyA4ODU5LTE1IChMYXRpbiA5OyBXZXN0ZXJuIEV1cm9wZWFuIExhbmd1YWdlcyB3aXRoIEV1cm8pIgorCWRlcGVuZHMgb24gTkxTCisJLS0taGVscC0tLQorCSAgSWYgeW91IHdhbnQgdG8gZGlzcGxheSBmaWxlbmFtZXMgd2l0aCBuYXRpdmUgbGFuZ3VhZ2UgY2hhcmFjdGVycworCSAgZnJvbSB0aGUgTWljcm9zb2Z0IEZBVCBmaWxlIHN5c3RlbSBmYW1pbHkgb3IgZnJvbSBKT0xJRVQgQ0QtUk9NcworCSAgY29ycmVjdGx5IG9uIHRoZSBzY3JlZW4sIHlvdSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlCisJICBpbnB1dC9vdXRwdXQgY2hhcmFjdGVyIHNldHMuIFNheSBZIGhlcmUgZm9yIHRoZSBMYXRpbiA5IGNoYXJhY3RlcgorCSAgc2V0LCB3aGljaCBjb3ZlcnMgbW9zdCBXZXN0IEV1cm9wZWFuIGxhbmd1YWdlcyBzdWNoIGFzIEFsYmFuaWFuLAorCSAgQ2F0YWxhbiwgRGFuaXNoLCBEdXRjaCwgRW5nbGlzaCwgRXN0b25pYW4sIEZhZXJvZXNlLCBGaW5uaXNoLAorCSAgRnJlbmNoLCBHZXJtYW4sIEdhbGljaWFuLCBJcmlzaCwgSWNlbGFuZGljLCBJdGFsaWFuLCBOb3J3ZWdpYW4sCisJICBQb3J0dWd1ZXNlLCBTcGFuaXNoLCBhbmQgU3dlZGlzaC4gTGF0aW4gOSBpcyBhbiB1cGRhdGUgdG8KKwkgIExhdGluIDEgKElTTyA4ODU5LTEpIHRoYXQgcmVtb3ZlcyBhIGhhbmRmdWwgb2YgcmFyZWx5IHVzZWQKKwkgIGNoYXJhY3RlcnMgYW5kIGluc3RlYWQgYWRkcyBzdXBwb3J0IGZvciBFc3RvbmlhbiwgY29ycmVjdHMgdGhlCisJICBzdXBwb3J0IGZvciBGcmVuY2ggYW5kIEZpbm5pc2gsIGFuZCBhZGRzIHRoZSBuZXcgRXVybyBjaGFyYWN0ZXIuCisJICBJZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgTkxTX0tPSThfUgorCXRyaXN0YXRlICJOTFMgS09JOC1SIChSdXNzaWFuKSIKKwlkZXBlbmRzIG9uIE5MUworCWhlbHAKKwkgIElmIHlvdSB3YW50IHRvIGRpc3BsYXkgZmlsZW5hbWVzIHdpdGggbmF0aXZlIGxhbmd1YWdlIGNoYXJhY3RlcnMKKwkgIGZyb20gdGhlIE1pY3Jvc29mdCBGQVQgZmlsZSBzeXN0ZW0gZmFtaWx5IG9yIGZyb20gSk9MSUVUIENELVJPTXMKKwkgIGNvcnJlY3RseSBvbiB0aGUgc2NyZWVuLCB5b3UgbmVlZCB0byBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZQorCSAgaW5wdXQvb3V0cHV0IGNoYXJhY3RlciBzZXRzLiBTYXkgWSBoZXJlIGZvciB0aGUgcHJlZmVycmVkIFJ1c3NpYW4KKwkgIGNoYXJhY3RlciBzZXQuCisKK2NvbmZpZyBOTFNfS09JOF9VCisJdHJpc3RhdGUgIk5MUyBLT0k4LVUvUlUgKFVrcmFpbmlhbiwgQmVsYXJ1c2lhbikiCisJZGVwZW5kcyBvbiBOTFMKKwloZWxwCisJICBJZiB5b3Ugd2FudCB0byBkaXNwbGF5IGZpbGVuYW1lcyB3aXRoIG5hdGl2ZSBsYW5ndWFnZSBjaGFyYWN0ZXJzCisJICBmcm9tIHRoZSBNaWNyb3NvZnQgRkFUIGZpbGUgc3lzdGVtIGZhbWlseSBvciBmcm9tIEpPTElFVCBDRC1ST01zCisJICBjb3JyZWN0bHkgb24gdGhlIHNjcmVlbiwgeW91IG5lZWQgdG8gaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUKKwkgIGlucHV0L291dHB1dCBjaGFyYWN0ZXIgc2V0cy4gU2F5IFkgaGVyZSBmb3IgdGhlIHByZWZlcnJlZCBVa3JhaW5pYW4KKwkgIChrb2k4LXUpIGFuZCBCZWxhcnVzaWFuIChrb2k4LXJ1KSBjaGFyYWN0ZXIgc2V0cy4KKworY29uZmlnIE5MU19VVEY4CisJdHJpc3RhdGUgIk5MUyBVVEY4IgorCWRlcGVuZHMgb24gTkxTCisJaGVscAorCSAgSWYgeW91IHdhbnQgdG8gZGlzcGxheSBmaWxlbmFtZXMgd2l0aCBuYXRpdmUgbGFuZ3VhZ2UgY2hhcmFjdGVycworCSAgZnJvbSB0aGUgTWljcm9zb2Z0IEZBVCBmaWxlIHN5c3RlbSBmYW1pbHkgb3IgZnJvbSBKT0xJRVQgQ0QtUk9NcworCSAgY29ycmVjdGx5IG9uIHRoZSBzY3JlZW4sIHlvdSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlCisJICBpbnB1dC9vdXRwdXQgY2hhcmFjdGVyIHNldHMuIFNheSBZIGhlcmUgZm9yIHRoZSBVVEYtOCBlbmNvZGluZyBvZgorCSAgdGhlIFVuaWNvZGUvSVNPOTY0NiB1bml2ZXJzYWwgY2hhcmFjdGVyIHNldC4KKworZW5kbWVudQorCmRpZmYgLS1naXQgYS9mcy9ubHMvTWFrZWZpbGUgYi9mcy9ubHMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdhZGUxMwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25scy9NYWtlZmlsZQpAQCAtMCwwICsxLDQ2IEBACisjCisjIE1ha2VmaWxlIGZvciBuYXRpdmUgbGFuZ3VhZ2Ugc3VwcG9ydAorIworCitvYmotJChDT05GSUdfTkxTKQkJKz0gbmxzX2Jhc2UubworCitvYmotJChDT05GSUdfTkxTX0NPREVQQUdFXzQzNykJKz0gbmxzX2NwNDM3Lm8KK29iai0kKENPTkZJR19OTFNfQ09ERVBBR0VfNzM3KQkrPSBubHNfY3A3Mzcubworb2JqLSQoQ09ORklHX05MU19DT0RFUEFHRV83NzUpCSs9IG5sc19jcDc3NS5vCitvYmotJChDT05GSUdfTkxTX0NPREVQQUdFXzg1MCkJKz0gbmxzX2NwODUwLm8KK29iai0kKENPTkZJR19OTFNfQ09ERVBBR0VfODUyKQkrPSBubHNfY3A4NTIubworb2JqLSQoQ09ORklHX05MU19DT0RFUEFHRV84NTUpCSs9IG5sc19jcDg1NS5vCitvYmotJChDT05GSUdfTkxTX0NPREVQQUdFXzg1NykJKz0gbmxzX2NwODU3Lm8KK29iai0kKENPTkZJR19OTFNfQ09ERVBBR0VfODYwKQkrPSBubHNfY3A4NjAubworb2JqLSQoQ09ORklHX05MU19DT0RFUEFHRV84NjEpCSs9IG5sc19jcDg2MS5vCitvYmotJChDT05GSUdfTkxTX0NPREVQQUdFXzg2MikJKz0gbmxzX2NwODYyLm8KK29iai0kKENPTkZJR19OTFNfQ09ERVBBR0VfODYzKQkrPSBubHNfY3A4NjMubworb2JqLSQoQ09ORklHX05MU19DT0RFUEFHRV84NjQpCSs9IG5sc19jcDg2NC5vCitvYmotJChDT05GSUdfTkxTX0NPREVQQUdFXzg2NSkJKz0gbmxzX2NwODY1Lm8KK29iai0kKENPTkZJR19OTFNfQ09ERVBBR0VfODY2KQkrPSBubHNfY3A4NjYubworb2JqLSQoQ09ORklHX05MU19DT0RFUEFHRV84NjkpCSs9IG5sc19jcDg2OS5vCitvYmotJChDT05GSUdfTkxTX0NPREVQQUdFXzg3NCkJKz0gbmxzX2NwODc0Lm8KK29iai0kKENPTkZJR19OTFNfQ09ERVBBR0VfOTMyKQkrPSBubHNfY3A5MzIubyBubHNfZXVjLWpwLm8KK29iai0kKENPTkZJR19OTFNfQ09ERVBBR0VfOTM2KQkrPSBubHNfY3A5MzYubworb2JqLSQoQ09ORklHX05MU19DT0RFUEFHRV85NDkpCSs9IG5sc19jcDk0OS5vCitvYmotJChDT05GSUdfTkxTX0NPREVQQUdFXzk1MCkJKz0gbmxzX2NwOTUwLm8KK29iai0kKENPTkZJR19OTFNfQ09ERVBBR0VfMTI1MCkgKz0gbmxzX2NwMTI1MC5vCitvYmotJChDT05GSUdfTkxTX0NPREVQQUdFXzEyNTEpCSs9IG5sc19jcDEyNTEubworb2JqLSQoQ09ORklHX05MU19BU0NJSSkJCSs9IG5sc19hc2NpaS5vCitvYmotJChDT05GSUdfTkxTX0lTTzg4NTlfMSkJKz0gbmxzX2lzbzg4NTktMS5vCitvYmotJChDT05GSUdfTkxTX0lTTzg4NTlfMikJKz0gbmxzX2lzbzg4NTktMi5vCitvYmotJChDT05GSUdfTkxTX0lTTzg4NTlfMykJKz0gbmxzX2lzbzg4NTktMy5vCitvYmotJChDT05GSUdfTkxTX0lTTzg4NTlfNCkJKz0gbmxzX2lzbzg4NTktNC5vCitvYmotJChDT05GSUdfTkxTX0lTTzg4NTlfNSkJKz0gbmxzX2lzbzg4NTktNS5vCitvYmotJChDT05GSUdfTkxTX0lTTzg4NTlfNikJKz0gbmxzX2lzbzg4NTktNi5vCitvYmotJChDT05GSUdfTkxTX0lTTzg4NTlfNykJKz0gbmxzX2lzbzg4NTktNy5vCitvYmotJChDT05GSUdfTkxTX0lTTzg4NTlfOCkJKz0gbmxzX2NwMTI1NS5vCitvYmotJChDT05GSUdfTkxTX0lTTzg4NTlfOSkJKz0gbmxzX2lzbzg4NTktOS5vCitvYmotJChDT05GSUdfTkxTX0lTTzg4NTlfMTApCSs9IG5sc19pc284ODU5LTEwLm8KK29iai0kKENPTkZJR19OTFNfSVNPODg1OV8xMykJKz0gbmxzX2lzbzg4NTktMTMubworb2JqLSQoQ09ORklHX05MU19JU084ODU5XzE0KQkrPSBubHNfaXNvODg1OS0xNC5vCitvYmotJChDT05GSUdfTkxTX0lTTzg4NTlfMTUpCSs9IG5sc19pc284ODU5LTE1Lm8KK29iai0kKENPTkZJR19OTFNfS09JOF9SKQkrPSBubHNfa29pOC1yLm8KK29iai0kKENPTkZJR19OTFNfS09JOF9VKQkrPSBubHNfa29pOC11Lm8gbmxzX2tvaTgtcnUubworb2JqLSQoQ09ORklHX05MU19BQkMpCQkrPSBubHNfYWJjLm8KK29iai0kKENPTkZJR19OTFNfVVRGOCkJCSs9IG5sc191dGY4Lm8KZGlmZiAtLWdpdCBhL2ZzL25scy9ubHNfYXNjaWkuYyBiL2ZzL25scy9ubHNfYXNjaWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODMzODFjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmxzL25sc19hc2NpaS5jCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICogbGludXgvZnMvbmxzX2FzY2lpLmMKKyAqCisgKiBDaGFyc2V0IGFzY2lpIHRyYW5zbGF0aW9uIHRhYmxlcy4KKyAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIFVuaWNvZGUgYW5kIGNoYXJzZXQKKyAqIHRhYmxlcyBmcm9tIHRoZSBVbmljb2RlIE9yZ2FuaXphdGlvbiAod3d3LnVuaWNvZGUub3JnKS4KKyAqIFRoZSBVbmljb2RlIHRvIGNoYXJzZXQgdGFibGUgaGFzIG9ubHkgZXhhY3QgbWFwcGluZ3MuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKK3N0YXRpYyB3Y2hhcl90IGNoYXJzZXQydW5pWzI1Nl0gPSB7CisJLyogMHgwMCovCisJMHgwMDAwLCAweDAwMDEsIDB4MDAwMiwgMHgwMDAzLAorCTB4MDAwNCwgMHgwMDA1LCAweDAwMDYsIDB4MDAwNywKKwkweDAwMDgsIDB4MDAwOSwgMHgwMDBhLCAweDAwMGIsCisJMHgwMDBjLCAweDAwMGQsIDB4MDAwZSwgMHgwMDBmLAorCS8qIDB4MTAqLworCTB4MDAxMCwgMHgwMDExLCAweDAwMTIsIDB4MDAxMywKKwkweDAwMTQsIDB4MDAxNSwgMHgwMDE2LCAweDAwMTcsCisJMHgwMDE4LCAweDAwMTksIDB4MDAxYSwgMHgwMDFiLAorCTB4MDAxYywgMHgwMDFkLCAweDAwMWUsIDB4MDAxZiwKKwkvKiAweDIwKi8KKwkweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsCisJMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LAorCTB4MDAyOCwgMHgwMDI5LCAweDAwMmEsIDB4MDAyYiwKKwkweDAwMmMsIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsCisJLyogMHgzMCovCisJMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLAorCTB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKwkweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsCisJMHgwMDNjLCAweDAwM2QsIDB4MDAzZSwgMHgwMDNmLAorCS8qIDB4NDAqLworCTB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywKKwkweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCisJMHgwMDQ4LCAweDAwNDksIDB4MDA0YSwgMHgwMDRiLAorCTB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKKwkvKiAweDUwKi8KKwkweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsCisJMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LAorCTB4MDA1OCwgMHgwMDU5LCAweDAwNWEsIDB4MDA1YiwKKwkweDAwNWMsIDB4MDA1ZCwgMHgwMDVlLCAweDAwNWYsCisJLyogMHg2MCovCisJMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLAorCTB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywKKwkweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsCisJMHgwMDZjLCAweDAwNmQsIDB4MDA2ZSwgMHgwMDZmLAorCS8qIDB4NzAqLworCTB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywKKwkweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCisJMHgwMDc4LCAweDAwNzksIDB4MDA3YSwgMHgwMDdiLAorCTB4MDA3YywgMHgwMDdkLCAweDAwN2UsIDB4MDA3ZiwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMFsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnBhZ2VfdW5pMmNoYXJzZXRbMjU2XSA9IHsKKwlwYWdlMDAsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0Mmxvd2VyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg0MC0weDQ3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg0OC0weDRmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg1MC0weDU3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0MnVwcGVyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg2MC0weDY3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg2OC0weDZmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg3MC0weDc3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCit9OworCitzdGF0aWMgaW50IHVuaTJjaGFyKHdjaGFyX3QgdW5pLCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCBib3VuZGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICp1bmkyY2hhcnNldDsKKwl1bnNpZ25lZCBjaGFyIGNsID0gdW5pICYgMHgwMGZmOworCXVuc2lnbmVkIGNoYXIgY2ggPSAodW5pICYgMHhmZjAwKSA+PiA4OworCisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJdW5pMmNoYXJzZXQgPSBwYWdlX3VuaTJjaGFyc2V0W2NoXTsKKwlpZiAodW5pMmNoYXJzZXQgJiYgdW5pMmNoYXJzZXRbY2xdKQorCQlvdXRbMF0gPSB1bmkyY2hhcnNldFtjbF07CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGFyMnVuaShjb25zdCB1bnNpZ25lZCBjaGFyICpyYXdzdHJpbmcsIGludCBib3VuZGxlbiwgd2NoYXJfdCAqdW5pKQoreworCSp1bmkgPSBjaGFyc2V0MnVuaVsqcmF3c3RyaW5nXTsKKwlpZiAoKnVuaSA9PSAweDAwMDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSB0YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJhc2NpaSIsCisJLnVuaTJjaGFyCT0gdW5pMmNoYXIsCisJLmNoYXIydW5pCT0gY2hhcjJ1bmksCisJLmNoYXJzZXQybG93ZXIJPSBjaGFyc2V0Mmxvd2VyLAorCS5jaGFyc2V0MnVwcGVyCT0gY2hhcnNldDJ1cHBlciwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X25sc19hc2NpaSh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmxzX2FzY2lpKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ubHNfYXNjaWkpCittb2R1bGVfZXhpdChleGl0X25sc19hc2NpaSkKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvbmxzL25sc19iYXNlLmMgYi9mcy9ubHMvbmxzX2Jhc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTc1MTI3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbmxzL25sc19iYXNlLmMKQEAgLTAsMCArMSw0OTcgQEAKKy8qCisgKiBsaW51eC9mcy9ubHNfYmFzZS5jCisgKgorICogTmF0aXZlIGxhbmd1YWdlIHN1cHBvcnQtLWNoYXJzZXRzIGFuZCB1bmljb2RlIHRyYW5zbGF0aW9ucy4KKyAqIEJ5IEdvcmRvbiBDaGFmZmVlIDE5OTYsIDE5OTcKKyAqCisgKiBVbmljb2RlIGJhc2VkIGNhc2UgY29udmVyc2lvbiAxOTk5IGJ5IFdvbGZyYW0gUGllbmtvc3MKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaWZkZWYgQ09ORklHX0tNT0QKKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSBkZWZhdWx0X3RhYmxlOworc3RhdGljIHN0cnVjdCBubHNfdGFibGUgKnRhYmxlcyA9ICZkZWZhdWx0X3RhYmxlOworc3RhdGljIERFRklORV9TUElOTE9DSyhubHNfbG9jayk7CisKKy8qCisgKiBTYW1wbGUgaW1wbGVtZW50YXRpb24gZnJvbSBVbmljb2RlIGhvbWUgcGFnZS4KKyAqIGh0dHA6Ly93d3cuc3RvbmVoYW5kLmNvbS91bmljb2RlL3N0YW5kYXJkL2Zzcy11dGYuaHRtbAorICovCitzdHJ1Y3QgdXRmOF90YWJsZSB7CisJaW50ICAgICBjbWFzazsKKwlpbnQgICAgIGN2YWw7CisJaW50ICAgICBzaGlmdDsKKwlsb25nICAgIGxtYXNrOworCWxvbmcgICAgbHZhbDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgdXRmOF90YWJsZSB1dGY4X3RhYmxlW10gPQoreworICAgIHsweDgwLCAgMHgwMCwgICAwKjYsICAgIDB4N0YsICAgICAgICAgICAwLCAgICAgICAgIC8qIDEgYnl0ZSBzZXF1ZW5jZSAqL30sCisgICAgezB4RTAsICAweEMwLCAgIDEqNiwgICAgMHg3RkYsICAgICAgICAgIDB4ODAsICAgICAgLyogMiBieXRlIHNlcXVlbmNlICovfSwKKyAgICB7MHhGMCwgIDB4RTAsICAgMio2LCAgICAweEZGRkYsICAgICAgICAgMHg4MDAsICAgICAvKiAzIGJ5dGUgc2VxdWVuY2UgKi99LAorICAgIHsweEY4LCAgMHhGMCwgICAzKjYsICAgIDB4MUZGRkZGLCAgICAgICAweDEwMDAwLCAgIC8qIDQgYnl0ZSBzZXF1ZW5jZSAqL30sCisgICAgezB4RkMsICAweEY4LCAgIDQqNiwgICAgMHgzRkZGRkZGLCAgICAgIDB4MjAwMDAwLCAgLyogNSBieXRlIHNlcXVlbmNlICovfSwKKyAgICB7MHhGRSwgIDB4RkMsICAgNSo2LCAgICAweDdGRkZGRkZGLCAgICAgMHg0MDAwMDAwLCAvKiA2IGJ5dGUgc2VxdWVuY2UgKi99LAorICAgIHswLAkJCQkJCSAgICAgICAvKiBlbmQgb2YgdGFibGUgICAgKi99Cit9OworCitpbnQKK3V0ZjhfbWJ0b3djKHdjaGFyX3QgKnAsIGNvbnN0IF9fdTggKnMsIGludCBuKQoreworCWxvbmcgbDsKKwlpbnQgYzAsIGMsIG5jOworCXN0cnVjdCB1dGY4X3RhYmxlICp0OworICAKKwluYyA9IDA7CisJYzAgPSAqczsKKwlsID0gYzA7CisJZm9yICh0ID0gdXRmOF90YWJsZTsgdC0+Y21hc2s7IHQrKykgeworCQluYysrOworCQlpZiAoKGMwICYgdC0+Y21hc2spID09IHQtPmN2YWwpIHsKKwkJCWwgJj0gdC0+bG1hc2s7CisJCQlpZiAobCA8IHQtPmx2YWwpCisJCQkJcmV0dXJuIC0xOworCQkJKnAgPSBsOworCQkJcmV0dXJuIG5jOworCQl9CisJCWlmIChuIDw9IG5jKQorCQkJcmV0dXJuIC0xOworCQlzKys7CisJCWMgPSAoKnMgXiAweDgwKSAmIDB4RkY7CisJCWlmIChjICYgMHhDMCkKKwkJCXJldHVybiAtMTsKKwkJbCA9IChsIDw8IDYpIHwgYzsKKwl9CisJcmV0dXJuIC0xOworfQorCitpbnQKK3V0ZjhfbWJzdG93Y3Mod2NoYXJfdCAqcHdjcywgY29uc3QgX191OCAqcywgaW50IG4pCit7CisJX191MTYgKm9wOworCWNvbnN0IF9fdTggKmlwOworCWludCBzaXplOworCisJb3AgPSBwd2NzOworCWlwID0gczsKKwl3aGlsZSAoKmlwICYmIG4gPiAwKSB7CisJCWlmICgqaXAgJiAweDgwKSB7CisJCQlzaXplID0gdXRmOF9tYnRvd2Mob3AsIGlwLCBuKTsKKwkJCWlmIChzaXplID09IC0xKSB7CisJCQkJLyogSWdub3JlIGNoYXJhY3RlciBhbmQgbW92ZSBvbiAqLworCQkJCWlwKys7CisJCQkJbi0tOworCQkJfSBlbHNlIHsKKwkJCQlvcCsrOworCQkJCWlwICs9IHNpemU7CisJCQkJbiAtPSBzaXplOworCQkJfQorCQl9IGVsc2UgeworCQkJKm9wKysgPSAqaXArKzsKKwkJCW4tLTsKKwkJfQorCX0KKwlyZXR1cm4gKG9wIC0gcHdjcyk7Cit9CisKK2ludAordXRmOF93Y3RvbWIoX191OCAqcywgd2NoYXJfdCB3YywgaW50IG1heGxlbikKK3sKKwlsb25nIGw7CisJaW50IGMsIG5jOworCXN0cnVjdCB1dGY4X3RhYmxlICp0OworICAKKwlpZiAocyA9PSAwKQorCQlyZXR1cm4gMDsKKyAgCisJbCA9IHdjOworCW5jID0gMDsKKwlmb3IgKHQgPSB1dGY4X3RhYmxlOyB0LT5jbWFzayAmJiBtYXhsZW47IHQrKywgbWF4bGVuLS0pIHsKKwkJbmMrKzsKKwkJaWYgKGwgPD0gdC0+bG1hc2spIHsKKwkJCWMgPSB0LT5zaGlmdDsKKwkJCSpzID0gdC0+Y3ZhbCB8IChsID4+IGMpOworCQkJd2hpbGUgKGMgPiAwKSB7CisJCQkJYyAtPSA2OworCQkJCXMrKzsKKwkJCQkqcyA9IDB4ODAgfCAoKGwgPj4gYykgJiAweDNGKTsKKwkJCX0KKwkJCXJldHVybiBuYzsKKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisKK2ludAordXRmOF93Y3N0b21icyhfX3U4ICpzLCBjb25zdCB3Y2hhcl90ICpwd2NzLCBpbnQgbWF4bGVuKQoreworCWNvbnN0IF9fdTE2ICppcDsKKwlfX3U4ICpvcDsKKwlpbnQgc2l6ZTsKKworCW9wID0gczsKKwlpcCA9IHB3Y3M7CisJd2hpbGUgKCppcCAmJiBtYXhsZW4gPiAwKSB7CisJCWlmICgqaXAgPiAweDdmKSB7CisJCQlzaXplID0gdXRmOF93Y3RvbWIob3AsICppcCwgbWF4bGVuKTsKKwkJCWlmIChzaXplID09IC0xKSB7CisJCQkJLyogSWdub3JlIGNoYXJhY3RlciBhbmQgbW92ZSBvbiAqLworCQkJCW1heGxlbi0tOworCQkJfSBlbHNlIHsKKwkJCQlvcCArPSBzaXplOworCQkJCW1heGxlbiAtPSBzaXplOworCQkJfQorCQl9IGVsc2UgeworCQkJKm9wKysgPSAoX191OCkgKmlwOworCQl9CisJCWlwKys7CisJfQorCXJldHVybiAob3AgLSBzKTsKK30KKworaW50IHJlZ2lzdGVyX25scyhzdHJ1Y3QgbmxzX3RhYmxlICogbmxzKQoreworCXN0cnVjdCBubHNfdGFibGUgKiogdG1wID0gJnRhYmxlczsKKworCWlmICghbmxzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAobmxzLT5uZXh0KQorCQlyZXR1cm4gLUVCVVNZOworCisJc3Bpbl9sb2NrKCZubHNfbG9jayk7CisJd2hpbGUgKCp0bXApIHsKKwkJaWYgKG5scyA9PSAqdG1wKSB7CisJCQlzcGluX3VubG9jaygmbmxzX2xvY2spOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQl0bXAgPSAmKCp0bXApLT5uZXh0OworCX0KKwlubHMtPm5leHQgPSB0YWJsZXM7CisJdGFibGVzID0gbmxzOworCXNwaW5fdW5sb2NrKCZubHNfbG9jayk7CisJcmV0dXJuIDA7CQorfQorCitpbnQgdW5yZWdpc3Rlcl9ubHMoc3RydWN0IG5sc190YWJsZSAqIG5scykKK3sKKwlzdHJ1Y3QgbmxzX3RhYmxlICoqIHRtcCA9ICZ0YWJsZXM7CisKKwlzcGluX2xvY2soJm5sc19sb2NrKTsKKwl3aGlsZSAoKnRtcCkgeworCQlpZiAobmxzID09ICp0bXApIHsKKwkJCSp0bXAgPSBubHMtPm5leHQ7CisJCQlzcGluX3VubG9jaygmbmxzX2xvY2spOworCQkJcmV0dXJuIDA7CisJCX0KKwkJdG1wID0gJigqdG1wKS0+bmV4dDsKKwl9CisJc3Bpbl91bmxvY2soJm5sc19sb2NrKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHN0cnVjdCBubHNfdGFibGUgKmZpbmRfbmxzKGNoYXIgKmNoYXJzZXQpCit7CisJc3RydWN0IG5sc190YWJsZSAqbmxzOworCXNwaW5fbG9jaygmbmxzX2xvY2spOworCWZvciAobmxzID0gdGFibGVzOyBubHM7IG5scyA9IG5scy0+bmV4dCkgeworCQlpZiAoIXN0cmNtcChubHMtPmNoYXJzZXQsIGNoYXJzZXQpKQorCQkJYnJlYWs7CisJCWlmIChubHMtPmFsaWFzICYmICFzdHJjbXAobmxzLT5hbGlhcywgY2hhcnNldCkpCisJCQlicmVhazsKKwl9CisJaWYgKG5scyAmJiAhdHJ5X21vZHVsZV9nZXQobmxzLT5vd25lcikpCisJCW5scyA9IE5VTEw7CisJc3Bpbl91bmxvY2soJm5sc19sb2NrKTsKKwlyZXR1cm4gbmxzOworfQorCitzdHJ1Y3QgbmxzX3RhYmxlICpsb2FkX25scyhjaGFyICpjaGFyc2V0KQoreworCXN0cnVjdCBubHNfdGFibGUgKm5sczsKKyNpZmRlZiBDT05GSUdfS01PRAorCWludCByZXQ7CisjZW5kaWYKKworCW5scyA9IGZpbmRfbmxzKGNoYXJzZXQpOworCWlmIChubHMpCisJCXJldHVybiBubHM7CisKKyNpZmRlZiBDT05GSUdfS01PRAorCXJldCA9IHJlcXVlc3RfbW9kdWxlKCJubHNfJXMiLCBjaGFyc2V0KTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcHJpbnRrKCJVbmFibGUgdG8gbG9hZCBOTFMgY2hhcnNldCAlc1xuIiwgY2hhcnNldCk7CisJCXJldHVybiBOVUxMOworCX0KKwlubHMgPSBmaW5kX25scyhjaGFyc2V0KTsKKyNlbmRpZgorCXJldHVybiBubHM7Cit9CisKK3ZvaWQgdW5sb2FkX25scyhzdHJ1Y3QgbmxzX3RhYmxlICpubHMpCit7CisJbW9kdWxlX3B1dChubHMtPm93bmVyKTsKK30KKword2NoYXJfdCBjaGFyc2V0MnVuaVsyNTZdID0geworCS8qIDB4MDAqLworCTB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywKKwkweDAwMDQsIDB4MDAwNSwgMHgwMDA2LCAweDAwMDcsCisJMHgwMDA4LCAweDAwMDksIDB4MDAwYSwgMHgwMDBiLAorCTB4MDAwYywgMHgwMDBkLCAweDAwMGUsIDB4MDAwZiwKKwkvKiAweDEwKi8KKwkweDAwMTAsIDB4MDAxMSwgMHgwMDEyLCAweDAwMTMsCisJMHgwMDE0LCAweDAwMTUsIDB4MDAxNiwgMHgwMDE3LAorCTB4MDAxOCwgMHgwMDE5LCAweDAwMWEsIDB4MDAxYiwKKwkweDAwMWMsIDB4MDAxZCwgMHgwMDFlLCAweDAwMWYsCisJLyogMHgyMCovCisJMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLAorCTB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKwkweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsCisJMHgwMDJjLCAweDAwMmQsIDB4MDAyZSwgMHgwMDJmLAorCS8qIDB4MzAqLworCTB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywKKwkweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisJMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLAorCTB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKwkvKiAweDQwKi8KKwkweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsCisJMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAorCTB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwKKwkweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsCisJLyogMHg1MCovCisJMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLAorCTB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKwkweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsCisJMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLAorCS8qIDB4NjAqLworCTB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywKKwkweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisJMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLAorCTB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKKwkvKiAweDcwKi8KKwkweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsCisJMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LAorCTB4MDA3OCwgMHgwMDc5LCAweDAwN2EsIDB4MDA3YiwKKwkweDAwN2MsIDB4MDA3ZCwgMHgwMDdlLCAweDAwN2YsCisJLyogMHg4MCovCisJMHgwMDgwLCAweDAwODEsIDB4MDA4MiwgMHgwMDgzLAorCTB4MDA4NCwgMHgwMDg1LCAweDAwODYsIDB4MDA4NywKKwkweDAwODgsIDB4MDA4OSwgMHgwMDhhLCAweDAwOGIsCisJMHgwMDhjLCAweDAwOGQsIDB4MDA4ZSwgMHgwMDhmLAorCS8qIDB4OTAqLworCTB4MDA5MCwgMHgwMDkxLCAweDAwOTIsIDB4MDA5MywKKwkweDAwOTQsIDB4MDA5NSwgMHgwMDk2LCAweDAwOTcsCisJMHgwMDk4LCAweDAwOTksIDB4MDA5YSwgMHgwMDliLAorCTB4MDA5YywgMHgwMDlkLCAweDAwOWUsIDB4MDA5ZiwKKwkvKiAweGEwKi8KKwkweDAwYTAsIDB4MDBhMSwgMHgwMGEyLCAweDAwYTMsCisJMHgwMGE0LCAweDAwYTUsIDB4MDBhNiwgMHgwMGE3LAorCTB4MDBhOCwgMHgwMGE5LCAweDAwYWEsIDB4MDBhYiwKKwkweDAwYWMsIDB4MDBhZCwgMHgwMGFlLCAweDAwYWYsCisJLyogMHhiMCovCisJMHgwMGIwLCAweDAwYjEsIDB4MDBiMiwgMHgwMGIzLAorCTB4MDBiNCwgMHgwMGI1LCAweDAwYjYsIDB4MDBiNywKKwkweDAwYjgsIDB4MDBiOSwgMHgwMGJhLCAweDAwYmIsCisJMHgwMGJjLCAweDAwYmQsIDB4MDBiZSwgMHgwMGJmLAorCS8qIDB4YzAqLworCTB4MDBjMCwgMHgwMGMxLCAweDAwYzIsIDB4MDBjMywKKwkweDAwYzQsIDB4MDBjNSwgMHgwMGM2LCAweDAwYzcsCisJMHgwMGM4LCAweDAwYzksIDB4MDBjYSwgMHgwMGNiLAorCTB4MDBjYywgMHgwMGNkLCAweDAwY2UsIDB4MDBjZiwKKwkvKiAweGQwKi8KKwkweDAwZDAsIDB4MDBkMSwgMHgwMGQyLCAweDAwZDMsCisJMHgwMGQ0LCAweDAwZDUsIDB4MDBkNiwgMHgwMGQ3LAorCTB4MDBkOCwgMHgwMGQ5LCAweDAwZGEsIDB4MDBkYiwKKwkweDAwZGMsIDB4MDBkZCwgMHgwMGRlLCAweDAwZGYsCisJLyogMHhlMCovCisJMHgwMGUwLCAweDAwZTEsIDB4MDBlMiwgMHgwMGUzLAorCTB4MDBlNCwgMHgwMGU1LCAweDAwZTYsIDB4MDBlNywKKwkweDAwZTgsIDB4MDBlOSwgMHgwMGVhLCAweDAwZWIsCisJMHgwMGVjLCAweDAwZWQsIDB4MDBlZSwgMHgwMGVmLAorCS8qIDB4ZjAqLworCTB4MDBmMCwgMHgwMGYxLCAweDAwZjIsIDB4MDBmMywKKwkweDAwZjQsIDB4MDBmNSwgMHgwMGY2LCAweDAwZjcsCisJMHgwMGY4LCAweDAwZjksIDB4MDBmYSwgMHgwMGZiLAorCTB4MDBmYywgMHgwMGZkLCAweDAwZmUsIDB4MDBmZiwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMFsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciAqcGFnZV91bmkyY2hhcnNldFsyNTZdID0geworCXBhZ2UwMAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJsb3dlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NDAtMHg0NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NTAtMHg1NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0MnVwcGVyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg2MC0weDY3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg2OC0weDZmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg3MC0weDc3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweGExLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKKworc3RhdGljIGludCB1bmkyY2hhcih3Y2hhcl90IHVuaSwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgYm91bmRsZW4pCit7CisJdW5zaWduZWQgY2hhciAqdW5pMmNoYXJzZXQ7CisJdW5zaWduZWQgY2hhciBjbCA9IHVuaSAmIDB4MDBmZjsKKwl1bnNpZ25lZCBjaGFyIGNoID0gKHVuaSAmIDB4ZmYwMCkgPj4gODsKKworCWlmIChib3VuZGxlbiA8PSAwKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCXVuaTJjaGFyc2V0ID0gcGFnZV91bmkyY2hhcnNldFtjaF07CisJaWYgKHVuaTJjaGFyc2V0ICYmIHVuaTJjaGFyc2V0W2NsXSkKKwkJb3V0WzBdID0gdW5pMmNoYXJzZXRbY2xdOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY2hhcjJ1bmkoY29uc3QgdW5zaWduZWQgY2hhciAqcmF3c3RyaW5nLCBpbnQgYm91bmRsZW4sIHdjaGFyX3QgKnVuaSkKK3sKKwkqdW5pID0gY2hhcnNldDJ1bmlbKnJhd3N0cmluZ107CisJaWYgKCp1bmkgPT0gMHgwMDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBubHNfdGFibGUgZGVmYXVsdF90YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJkZWZhdWx0IiwKKwkudW5pMmNoYXIJPSB1bmkyY2hhciwKKwkuY2hhcjJ1bmkJPSBjaGFyMnVuaSwKKwkuY2hhcnNldDJsb3dlcgk9IGNoYXJzZXQybG93ZXIsCisJLmNoYXJzZXQydXBwZXIJPSBjaGFyc2V0MnVwcGVyLAorfTsKKworLyogUmV0dXJucyBhIHNpbXBsZSBkZWZhdWx0IHRyYW5zbGF0aW9uIHRhYmxlICovCitzdHJ1Y3QgbmxzX3RhYmxlICpsb2FkX25sc19kZWZhdWx0KHZvaWQpCit7CisJc3RydWN0IG5sc190YWJsZSAqZGVmYXVsdF9ubHM7CisJCisJZGVmYXVsdF9ubHMgPSBsb2FkX25scyhDT05GSUdfTkxTX0RFRkFVTFQpOworCWlmIChkZWZhdWx0X25scyAhPSBOVUxMKQorCQlyZXR1cm4gZGVmYXVsdF9ubHM7CisJZWxzZQorCQlyZXR1cm4gJmRlZmF1bHRfdGFibGU7Cit9CisKK0VYUE9SVF9TWU1CT0wocmVnaXN0ZXJfbmxzKTsKK0VYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl9ubHMpOworRVhQT1JUX1NZTUJPTCh1bmxvYWRfbmxzKTsKK0VYUE9SVF9TWU1CT0wobG9hZF9ubHMpOworRVhQT1JUX1NZTUJPTChsb2FkX25sc19kZWZhdWx0KTsKK0VYUE9SVF9TWU1CT0wodXRmOF9tYnRvd2MpOworRVhQT1JUX1NZTUJPTCh1dGY4X21ic3Rvd2NzKTsKK0VYUE9SVF9TWU1CT0wodXRmOF93Y3RvbWIpOworRVhQT1JUX1NZTUJPTCh1dGY4X3djc3RvbWJzKTsKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvbmxzL25sc19jcDEyNTAuYyBiL2ZzL25scy9ubHNfY3AxMjUwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJlNzhjZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25scy9ubHNfY3AxMjUwLmMKQEAgLTAsMCArMSwzNDcgQEAKKy8qCisgKiBsaW51eC9mcy9ubHNfY3AxMjUwLmMKKyAqCisgKiBDaGFyc2V0IGNwMTI1MCB0cmFuc2xhdGlvbiB0YWJsZXMuCisgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBVbmljb2RlIGFuZCBjaGFyc2V0CisgKiB0YWJsZXMgZnJvbSB0aGUgVW5pY29kZSBPcmdhbml6YXRpb24gKHd3dy51bmljb2RlLm9yZykuCisgKiBUaGUgVW5pY29kZSB0byBjaGFyc2V0IHRhYmxlIGhhcyBvbmx5IGV4YWN0IG1hcHBpbmdzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCitzdGF0aWMgd2NoYXJfdCBjaGFyc2V0MnVuaVsyNTZdID0geworCS8qIDB4MDAqLworCTB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywgCisJMHgwMDA0LCAweDAwMDUsIDB4MDAwNiwgMHgwMDA3LCAKKwkweDAwMDgsIDB4MDAwOSwgMHgwMDBhLCAweDAwMGIsIAorCTB4MDAwYywgMHgwMDBkLCAweDAwMGUsIDB4MDAwZiwgCisJLyogMHgxMCovCisJMHgwMDEwLCAweDAwMTEsIDB4MDAxMiwgMHgwMDEzLCAKKwkweDAwMTQsIDB4MDAxNSwgMHgwMDE2LCAweDAwMTcsIAorCTB4MDAxOCwgMHgwMDE5LCAweDAwMWEsIDB4MDAxYiwgCisJMHgwMDFjLCAweDAwMWQsIDB4MDAxZSwgMHgwMDFmLCAKKwkvKiAweDIwKi8KKwkweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsIAorCTB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywgCisJMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLCAKKwkweDAwMmMsIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsIAorCS8qIDB4MzAqLworCTB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywgCisJMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LCAKKwkweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsIAorCTB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwgCisJLyogMHg0MCovCisJMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLCAKKwkweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsIAorCTB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwgCisJMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLCAKKwkvKiAweDUwKi8KKwkweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIAorCTB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywgCisJMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMDViLCAKKwkweDAwNWMsIDB4MDA1ZCwgMHgwMDVlLCAweDAwNWYsIAorCS8qIDB4NjAqLworCTB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywgCisJMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LCAKKwkweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsIAorCTB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwgCisJLyogMHg3MCovCisJMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLCAKKwkweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsIAorCTB4MDA3OCwgMHgwMDc5LCAweDAwN2EsIDB4MDA3YiwgCisJMHgwMDdjLCAweDAwN2QsIDB4MDA3ZSwgMHgwMDdmLCAKKwkvKiAweDgwKi8KKwkweDIwYWMsIDB4MDAwMCwgMHgyMDFhLCAweDAwMDAsIAorCTB4MjAxZSwgMHgyMDI2LCAweDIwMjAsIDB4MjAyMSwgCisJMHgwMDAwLCAweDIwMzAsIDB4MDE2MCwgMHgyMDM5LCAKKwkweDAxNWEsIDB4MDE2NCwgMHgwMTdkLCAweDAxNzksIAorCS8qIDB4OTAqLworCTB4MDAwMCwgMHgyMDE4LCAweDIwMTksIDB4MjAxYywgCisJMHgyMDFkLCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LCAKKwkweDAwMDAsIDB4MjEyMiwgMHgwMTYxLCAweDIwM2EsIAorCTB4MDE1YiwgMHgwMTY1LCAweDAxN2UsIDB4MDE3YSwgCisJLyogMHhhMCovCisJMHgwMGEwLCAweDAyYzcsIDB4MDJkOCwgMHgwMTQxLCAKKwkweDAwYTQsIDB4MDEwNCwgMHgwMGE2LCAweDAwYTcsIAorCTB4MDBhOCwgMHgwMGE5LCAweDAxNWUsIDB4MDBhYiwgCisJMHgwMGFjLCAweDAwYWQsIDB4MDBhZSwgMHgwMTdiLCAKKwkvKiAweGIwKi8KKwkweDAwYjAsIDB4MDBiMSwgMHgwMmRiLCAweDAxNDIsIAorCTB4MDBiNCwgMHgwMGI1LCAweDAwYjYsIDB4MDBiNywgCisJMHgwMGI4LCAweDAxMDUsIDB4MDE1ZiwgMHgwMGJiLCAKKwkweDAxM2QsIDB4MDJkZCwgMHgwMTNlLCAweDAxN2MsIAorCS8qIDB4YzAqLworCTB4MDE1NCwgMHgwMGMxLCAweDAwYzIsIDB4MDEwMiwgCisJMHgwMGM0LCAweDAxMzksIDB4MDEwNiwgMHgwMGM3LCAKKwkweDAxMGMsIDB4MDBjOSwgMHgwMTE4LCAweDAwY2IsIAorCTB4MDExYSwgMHgwMGNkLCAweDAwY2UsIDB4MDEwZSwgCisJLyogMHhkMCovCisJMHgwMTEwLCAweDAxNDMsIDB4MDE0NywgMHgwMGQzLCAKKwkweDAwZDQsIDB4MDE1MCwgMHgwMGQ2LCAweDAwZDcsIAorCTB4MDE1OCwgMHgwMTZlLCAweDAwZGEsIDB4MDE3MCwgCisJMHgwMGRjLCAweDAwZGQsIDB4MDE2MiwgMHgwMGRmLCAKKwkvKiAweGUwKi8KKwkweDAxNTUsIDB4MDBlMSwgMHgwMGUyLCAweDAxMDMsIAorCTB4MDBlNCwgMHgwMTNhLCAweDAxMDcsIDB4MDBlNywgCisJMHgwMTBkLCAweDAwZTksIDB4MDExOSwgMHgwMGViLCAKKwkweDAxMWIsIDB4MDBlZCwgMHgwMGVlLCAweDAxMGYsIAorCS8qIDB4ZjAqLworCTB4MDExMSwgMHgwMTQ0LCAweDAxNDgsIDB4MDBmMywgCisJMHgwMGY0LCAweDAxNTEsIDB4MDBmNiwgMHgwMGY3LCAKKwkweDAxNTksIDB4MDE2ZiwgMHgwMGZhLCAweDAxNzEsIAorCTB4MDBmYywgMHgwMGZkLCAweDAxNjMsIDB4MDJkOSwgCisJfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAwWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweDAwLCAweDAwLCAweDAwLCAweGE0LCAweDAwLCAweGE2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE5LCAweDAwLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweDAwLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweDAwLCAweDAwLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweDAwLCAweDAwLCAweGJiLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGI4LTB4YmYgKi8KKwkweDAwLCAweGMxLCAweGMyLCAweDAwLCAweGM0LCAweDAwLCAweDAwLCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweDAwLCAweGM5LCAweDAwLCAweGNiLCAweDAwLCAweGNkLCAweGNlLCAweDAwLCAvKiAweGM4LTB4Y2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweGQzLCAweGQ0LCAweDAwLCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweDAwLCAweDAwLCAweGRhLCAweDAwLCAweGRjLCAweGRkLCAweDAwLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweDAwLCAweGUxLCAweGUyLCAweDAwLCAweGU0LCAweDAwLCAweDAwLCAweGU3LCAvKiAweGUwLTB4ZTcgKi8KKwkweDAwLCAweGU5LCAweDAwLCAweGViLCAweDAwLCAweGVkLCAweGVlLCAweDAwLCAvKiAweGU4LTB4ZWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweGYzLCAweGY0LCAweDAwLCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweDAwLCAweDAwLCAweGZhLCAweDAwLCAweGZjLCAweGZkLCAweDAwLCAweDAwLCAvKiAweGY4LTB4ZmYgKi8KKwl9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDFbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweGMzLCAweGUzLCAweGE1LCAweGI5LCAweGM2LCAweGU2LCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGM4LCAweGU4LCAweGNmLCAweGVmLCAvKiAweDA4LTB4MGYgKi8KKwkweGQwLCAweGYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweGNhLCAweGVhLCAweGNjLCAweGVjLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweGM1LCAweGU1LCAweDAwLCAweDAwLCAweGJjLCAweGJlLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweGEzLCAweGIzLCAweGQxLCAweGYxLCAweDAwLCAweDAwLCAweGQyLCAvKiAweDQwLTB4NDcgKi8KKwkweGYyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweGQ1LCAweGY1LCAweDAwLCAweDAwLCAweGMwLCAweGUwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweGQ4LCAweGY4LCAweDhjLCAweDljLCAweDAwLCAweDAwLCAweGFhLCAweGJhLCAvKiAweDU4LTB4NWYgKi8KKwkweDhhLCAweDlhLCAweGRlLCAweGZlLCAweDhkLCAweDlkLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGQ5LCAweGY5LCAvKiAweDY4LTB4NmYgKi8KKwkweGRiLCAweGZiLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDhmLCAweDlmLCAweGFmLCAweGJmLCAweDhlLCAweDllLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCX07CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMlsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhMC0weGE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhOC0weGFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhiMC0weGI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhiOC0weGJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhMSwgLyogMHhjMC0weGM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhjOC0weGNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhkMC0weGQ3ICovCisJMHhhMiwgMHhmZiwgMHgwMCwgMHhiMiwgMHgwMCwgMHhiZCwgMHgwMCwgMHgwMCwgLyogMHhkOC0weGRmICovCisJfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTIwWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHg5NiwgMHg5NywgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHg5MSwgMHg5MiwgMHg4MiwgMHgwMCwgMHg5MywgMHg5NCwgMHg4NCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHg4NiwgMHg4NywgMHg5NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4NSwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHg4OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHg4YiwgMHg5YiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGE4LTB4YWYgKi8KKwl9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjFbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDk5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwl9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciAqcGFnZV91bmkyY2hhcnNldFsyNTZdID0geworCXBhZ2UwMCwJcGFnZTAxLAlwYWdlMDIsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCisJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwKKwlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAorCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCisJcGFnZTIwLAlwYWdlMjEsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCisJfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJsb3dlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NDAtMHg0NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NTAtMHg1NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHgwMCwgMHg4MiwgMHgwMCwgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHg4OSwgMHg5YSwgMHg4YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhiMywgMHhhNCwgMHhiOSwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhiYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhiZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiZSwgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhjMC0weGM3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhjOC0weGNmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCisJfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJ1cHBlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NjAtMHg2NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NzAtMHg3NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHgwMCwgMHg4MiwgMHgwMCwgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHg5OSwgMHg4YSwgMHg5YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhhMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhhNSwgMHhhYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiYywgMHhhZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHgwMCwgLyogMHhkOC0weGRmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhlMC0weGU3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhlOC0weGVmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhmZiwgLyogMHhmOC0weGZmICovCisJfTsKKworc3RhdGljIGludCB1bmkyY2hhcih3Y2hhcl90IHVuaSwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgYm91bmRsZW4pCit7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgKnVuaTJjaGFyc2V0OworICAgICAgICB1bnNpZ25lZCBjaGFyIGNsID0gdW5pICYgMHgwMGZmOworICAgICAgICB1bnNpZ25lZCBjaGFyIGNoID0gKHVuaSAmIDB4ZmYwMCkgPj4gODsKKworICAgICAgICBpZiAoYm91bmRsZW4gPD0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworICAgICAgICB1bmkyY2hhcnNldCA9IHBhZ2VfdW5pMmNoYXJzZXRbY2hdOworICAgICAgICBpZiAodW5pMmNoYXJzZXQgJiYgdW5pMmNoYXJzZXRbY2xdKQorICAgICAgICAgICAgICAgIG91dFswXSA9IHVuaTJjaGFyc2V0W2NsXTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGFyMnVuaShjb25zdCB1bnNpZ25lZCBjaGFyICpyYXdzdHJpbmcsIGludCBib3VuZGxlbiwgd2NoYXJfdCAqdW5pKQoreworICAgICAgICAqdW5pID0gY2hhcnNldDJ1bmlbKnJhd3N0cmluZ107CisgICAgICAgIGlmICgqdW5pID09IDB4MDAwMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmxzX3RhYmxlIHRhYmxlID0geworCS5jaGFyc2V0CT0gImNwMTI1MCIsCisJLnVuaTJjaGFyCT0gdW5pMmNoYXIsCisJLmNoYXIydW5pCT0gY2hhcjJ1bmksCisJLmNoYXJzZXQybG93ZXIJPSBjaGFyc2V0Mmxvd2VyLAorCS5jaGFyc2V0MnVwcGVyCT0gY2hhcnNldDJ1cHBlciwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X25sc19jcDEyNTAodm9pZCkKK3sKKyAgICAgICAgcmV0dXJuIHJlZ2lzdGVyX25scygmdGFibGUpOworfQorc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmxzX2NwMTI1MCh2b2lkKQoreworICAgICAgICB1bnJlZ2lzdGVyX25scygmdGFibGUpOworfQorCittb2R1bGVfaW5pdChpbml0X25sc19jcDEyNTApCittb2R1bGVfZXhpdChleGl0X25sc19jcDEyNTApCisKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL25scy9ubHNfY3AxMjUxLmMgYi9mcy9ubHMvbmxzX2NwMTI1MS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNDFjOGEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ubHMvbmxzX2NwMTI1MS5jCkBAIC0wLDAgKzEsMzAyIEBACisvKgorICogbGludXgvZnMvbmxzX2NwMTI1MS5jCisgKgorICogQ2hhcnNldCBjcDEyNTEgdHJhbnNsYXRpb24gdGFibGVzLgorICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgVW5pY29kZSBhbmQgY2hhcnNldAorICogdGFibGVzIGZyb20gdGhlIFVuaWNvZGUgT3JnYW5pemF0aW9uICh3d3cudW5pY29kZS5vcmcpLgorICogVGhlIFVuaWNvZGUgdG8gY2hhcnNldCB0YWJsZSBoYXMgb25seSBleGFjdCBtYXBwaW5ncy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworc3RhdGljIHdjaGFyX3QgY2hhcnNldDJ1bmlbMjU2XSA9IHsKKwkvKiAweDAwKi8KKwkweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsIAorCTB4MDAwNCwgMHgwMDA1LCAweDAwMDYsIDB4MDAwNywgCisJMHgwMDA4LCAweDAwMDksIDB4MDAwYSwgMHgwMDBiLCAKKwkweDAwMGMsIDB4MDAwZCwgMHgwMDBlLCAweDAwMGYsIAorCS8qIDB4MTAqLworCTB4MDAxMCwgMHgwMDExLCAweDAwMTIsIDB4MDAxMywgCisJMHgwMDE0LCAweDAwMTUsIDB4MDAxNiwgMHgwMDE3LCAKKwkweDAwMTgsIDB4MDAxOSwgMHgwMDFhLCAweDAwMWIsIAorCTB4MDAxYywgMHgwMDFkLCAweDAwMWUsIDB4MDAxZiwgCisJLyogMHgyMCovCisJMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLCAKKwkweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsIAorCTB4MDAyOCwgMHgwMDI5LCAweDAwMmEsIDB4MDAyYiwgCisJMHgwMDJjLCAweDAwMmQsIDB4MDAyZSwgMHgwMDJmLCAKKwkvKiAweDMwKi8KKwkweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsIAorCTB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywgCisJMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLCAKKwkweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsIAorCS8qIDB4NDAqLworCTB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywgCisJMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LCAKKwkweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsIAorCTB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwgCisJLyogMHg1MCovCisJMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLCAKKwkweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsIAorCTB4MDA1OCwgMHgwMDU5LCAweDAwNWEsIDB4MDA1YiwgCisJMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLCAKKwkvKiAweDYwKi8KKwkweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsIAorCTB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywgCisJMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLCAKKwkweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsIAorCS8qIDB4NzAqLworCTB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywgCisJMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LCAKKwkweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsIAorCTB4MDA3YywgMHgwMDdkLCAweDAwN2UsIDB4MDA3ZiwgCisJLyogMHg4MCovCisJMHgwNDAyLCAweDA0MDMsIDB4MjAxYSwgMHgwNDUzLCAKKwkweDIwMWUsIDB4MjAyNiwgMHgyMDIwLCAweDIwMjEsIAorCTB4MjBhYywgMHgyMDMwLCAweDA0MDksIDB4MjAzOSwgCisJMHgwNDBhLCAweDA0MGMsIDB4MDQwYiwgMHgwNDBmLCAKKwkvKiAweDkwKi8KKwkweDA0NTIsIDB4MjAxOCwgMHgyMDE5LCAweDIwMWMsIAorCTB4MjAxZCwgMHgyMDIyLCAweDIwMTMsIDB4MjAxNCwgCisJMHgwMDAwLCAweDIxMjIsIDB4MDQ1OSwgMHgyMDNhLCAKKwkweDA0NWEsIDB4MDQ1YywgMHgwNDViLCAweDA0NWYsIAorCS8qIDB4YTAqLworCTB4MDBhMCwgMHgwNDBlLCAweDA0NWUsIDB4MDQwOCwgCisJMHgwMGE0LCAweDA0OTAsIDB4MDBhNiwgMHgwMGE3LCAKKwkweDA0MDEsIDB4MDBhOSwgMHgwNDA0LCAweDAwYWIsIAorCTB4MDBhYywgMHgwMGFkLCAweDAwYWUsIDB4MDQwNywgCisJLyogMHhiMCovCisJMHgwMGIwLCAweDAwYjEsIDB4MDQwNiwgMHgwNDU2LCAKKwkweDA0OTEsIDB4MDBiNSwgMHgwMGI2LCAweDAwYjcsIAorCTB4MDQ1MSwgMHgyMTE2LCAweDA0NTQsIDB4MDBiYiwgCisJMHgwNDU4LCAweDA0MDUsIDB4MDQ1NSwgMHgwNDU3LCAKKwkvKiAweGMwKi8KKwkweDA0MTAsIDB4MDQxMSwgMHgwNDEyLCAweDA0MTMsIAorCTB4MDQxNCwgMHgwNDE1LCAweDA0MTYsIDB4MDQxNywgCisJMHgwNDE4LCAweDA0MTksIDB4MDQxYSwgMHgwNDFiLCAKKwkweDA0MWMsIDB4MDQxZCwgMHgwNDFlLCAweDA0MWYsIAorCS8qIDB4ZDAqLworCTB4MDQyMCwgMHgwNDIxLCAweDA0MjIsIDB4MDQyMywgCisJMHgwNDI0LCAweDA0MjUsIDB4MDQyNiwgMHgwNDI3LCAKKwkweDA0MjgsIDB4MDQyOSwgMHgwNDJhLCAweDA0MmIsIAorCTB4MDQyYywgMHgwNDJkLCAweDA0MmUsIDB4MDQyZiwgCisJLyogMHhlMCovCisJMHgwNDMwLCAweDA0MzEsIDB4MDQzMiwgMHgwNDMzLCAKKwkweDA0MzQsIDB4MDQzNSwgMHgwNDM2LCAweDA0MzcsIAorCTB4MDQzOCwgMHgwNDM5LCAweDA0M2EsIDB4MDQzYiwgCisJMHgwNDNjLCAweDA0M2QsIDB4MDQzZSwgMHgwNDNmLCAKKwkvKiAweGYwKi8KKwkweDA0NDAsIDB4MDQ0MSwgMHgwNDQyLCAweDA0NDMsIAorCTB4MDQ0NCwgMHgwNDQ1LCAweDA0NDYsIDB4MDQ0NywgCisJMHgwNDQ4LCAweDA0NDksIDB4MDQ0YSwgMHgwNDRiLCAKKwkweDA0NGMsIDB4MDQ0ZCwgMHgwNDRlLCAweDA0NGYsIAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAwWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweDAwLCAweDAwLCAweDAwLCAweGE0LCAweDAwLCAweGE2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweDAwLCAweGE5LCAweDAwLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweDAwLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweDAwLCAweDAwLCAweDAwLCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweGJiLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGI4LTB4YmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweGJiLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGMwLTB4YzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweGJiLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGM4LTB4Y2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweGJiLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGQwLTB4ZDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweGJiLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGQ4LTB4ZGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweGJiLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGUwLTB4ZTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweGJiLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGU4LTB4ZWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweGJiLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGYwLTB4ZjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweGJiLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwNFsyNTZdID0geworCTB4MDAsIDB4YTgsIDB4ODAsIDB4ODEsIDB4YWEsIDB4YmQsIDB4YjIsIDB4YWYsIC8qIDB4MDAtMHgwNyAqLworCTB4YTMsIDB4OGEsIDB4OGMsIDB4OGUsIDB4OGQsIDB4MDAsIDB4YTEsIDB4OGYsIC8qIDB4MDgtMHgwZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4MTAtMHgxNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4MTgtMHgxZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4MjAtMHgyNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4MjgtMHgyZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4MzAtMHgzNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4MzgtMHgzZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4NDAtMHg0NyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4YjgsIDB4OTAsIDB4ODMsIDB4YmEsIDB4YmUsIDB4YjMsIDB4YmYsIC8qIDB4NTAtMHg1NyAqLworCTB4YmMsIDB4OWEsIDB4OWMsIDB4OWUsIDB4OWQsIDB4MDAsIDB4YTIsIDB4OWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHhhNSwgMHhiNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjBbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDk2LCAweDk3LCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDkxLCAweDkyLCAweDgyLCAweDAwLCAweDkzLCAweDk0LCAweDg0LCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDg2LCAweDg3LCAweDk1LCAweDAwLCAweDAwLCAweDAwLCAweDg1LCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDg5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDhiLCAweDliLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyMVsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YjksIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4OTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnBhZ2VfdW5pMmNoYXJzZXRbMjU2XSA9IHsKKwlwYWdlMDAsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIHBhZ2UwNCwgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJcGFnZTIwLCBwYWdlMjEsIE5VTEwsCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQybG93ZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDYwLTB4NjcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDY4LTB4NmYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDcwLTB4NzcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKwkweDkwLCAweDgzLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDlhLCAweDhiLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweGEyLCAweGEyLCAweGJjLCAweGE0LCAweGI0LCAweGE2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGI4LCAweGE5LCAweGJhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGJmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIzLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJlLCAweGJlLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGMwLTB4YzcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQydXBwZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDYwLTB4NjcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDY4LTB4NmYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDcwLTB4NzcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKwkweDgwLCAweDgxLCAweDgyLCAweDgxLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDgwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDhhLCAweDliLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweGExLCAweGExLCAweGEzLCAweGE0LCAweGE1LCAweGE2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIyLCAweGE1LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGE4LCAweGI5LCAweGFhLCAweGJiLCAweGEzLCAweGJkLCAweGJkLCAweGFmLCAvKiAweGI4LTB4YmYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyBpbnQgdW5pMmNoYXIod2NoYXJfdCB1bmksIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50IGJvdW5kbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnVuaTJjaGFyc2V0OworCXVuc2lnbmVkIGNoYXIgY2wgPSB1bmkgJiAweDAwZmY7CisJdW5zaWduZWQgY2hhciBjaCA9ICh1bmkgJiAweGZmMDApID4+IDg7CisKKwlpZiAoYm91bmRsZW4gPD0gMCkKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwl1bmkyY2hhcnNldCA9IHBhZ2VfdW5pMmNoYXJzZXRbY2hdOworCWlmICh1bmkyY2hhcnNldCAmJiB1bmkyY2hhcnNldFtjbF0pCisJCW91dFswXSA9IHVuaTJjaGFyc2V0W2NsXTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNoYXIydW5pKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJhd3N0cmluZywgaW50IGJvdW5kbGVuLCB3Y2hhcl90ICp1bmkpCit7CisJKnVuaSA9IGNoYXJzZXQydW5pWypyYXdzdHJpbmddOworCWlmICgqdW5pID09IDB4MDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmxzX3RhYmxlIHRhYmxlID0geworCS5jaGFyc2V0CT0gImNwMTI1MSIsCisJLnVuaTJjaGFyCT0gdW5pMmNoYXIsCisJLmNoYXIydW5pCT0gY2hhcjJ1bmksCisJLmNoYXJzZXQybG93ZXIJPSBjaGFyc2V0Mmxvd2VyLAorCS5jaGFyc2V0MnVwcGVyCT0gY2hhcnNldDJ1cHBlciwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X25sc19jcDEyNTEodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X25sc19jcDEyNTEodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25scygmdGFibGUpOworfQorCittb2R1bGVfaW5pdChpbml0X25sc19jcDEyNTEpCittb2R1bGVfZXhpdChleGl0X25sc19jcDEyNTEpCisKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL25scy9ubHNfY3AxMjU1LmMgYi9mcy9ubHMvbmxzX2NwMTI1NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZGVlZmUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ubHMvbmxzX2NwMTI1NS5jCkBAIC0wLDAgKzEsMzg1IEBACisvKgorICogbGludXgvZnMvbmxzX2NwMTI1NS5jCisgKgorICogQ2hhcnNldCBjcDEyNTUgdHJhbnNsYXRpb24gdGFibGVzLgorICogVGhlIFVuaWNvZGUgdG8gY2hhcnNldCB0YWJsZSBoYXMgb25seSBleGFjdCBtYXBwaW5ncy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworc3RhdGljIHdjaGFyX3QgY2hhcnNldDJ1bmlbMjU2XSA9IHsKKwkvKiAweDAwKi8KKwkweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsCisJMHgwMDA0LCAweDAwMDUsIDB4MDAwNiwgMHgwMDA3LAorCTB4MDAwOCwgMHgwMDA5LCAweDAwMGEsIDB4MDAwYiwKKwkweDAwMGMsIDB4MDAwZCwgMHgwMDBlLCAweDAwMGYsCisJLyogMHgxMCovCisJMHgwMDEwLCAweDAwMTEsIDB4MDAxMiwgMHgwMDEzLAorCTB4MDAxNCwgMHgwMDE1LCAweDAwMTYsIDB4MDAxNywKKwkweDAwMTgsIDB4MDAxOSwgMHgwMDFhLCAweDAwMWIsCisJMHgwMDFjLCAweDAwMWQsIDB4MDAxZSwgMHgwMDFmLAorCS8qIDB4MjAqLworCTB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywKKwkweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisJMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLAorCTB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKwkvKiAweDMwKi8KKwkweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsCisJMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAorCTB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwKKwkweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsCisJLyogMHg0MCovCisJMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLAorCTB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKwkweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsCisJMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLAorCS8qIDB4NTAqLworCTB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywKKwkweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisJMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMDViLAorCTB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwKKwkvKiAweDYwKi8KKwkweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsCisJMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LAorCTB4MDA2OCwgMHgwMDY5LCAweDAwNmEsIDB4MDA2YiwKKwkweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsCisJLyogMHg3MCovCisJMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLAorCTB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKwkweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsCisJMHgwMDdjLCAweDAwN2QsIDB4MDA3ZSwgMHgwMDdmLAorCS8qIDB4ODAqLworCTB4MjBhYywgMHgwMDAwLCAweDIwMWEsIDB4MDE5MiwKKwkweDIwMWUsIDB4MjAyNiwgMHgyMDIwLCAweDIwMjEsCisJMHgwMmM2LCAweDIwMzAsIDB4MDAwMCwgMHgyMDM5LAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiAweDkwKi8KKwkweDAwMDAsIDB4MjAxOCwgMHgyMDE5LCAweDIwMWMsCisJMHgyMDFkLCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LAorCTB4MDJkYywgMHgyMTIyLCAweDAwMDAsIDB4MjAzYSwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJLyogMHhhMCovCisJMHgwMGEwLCAweDAwYTEsIDB4MDBhMiwgMHgwMGEzLAorCTB4MjBhYSwgMHgwMGE1LCAweDAwYTYsIDB4MDBhNywKKwkweDAwYTgsIDB4MDBhOSwgMHgwMGQ3LCAweDAwYWIsCisJMHgwMGFjLCAweDAwYWQsIDB4MDBhZSwgMHgyMDNlLAorCS8qIDB4YjAqLworCTB4MDBiMCwgMHgwMGIxLCAweDAwYjIsIDB4MDBiMywKKwkweDAwYjQsIDB4MDBiNSwgMHgwMGI2LCAweDAwYjcsCisJMHgwMGI4LCAweDAwYjksIDB4MDBmNywgMHgwMGJiLAorCTB4MDBiYywgMHgwMGJkLCAweDAwYmUsIDB4MDBiZiwKKwkvKiAweGMwKi8KKwkweDA1YjAsIDB4MDViMSwgMHgwNWIyLCAweDA1YjMsCisJMHgwNWI0LCAweDA1YjUsIDB4MDViNiwgMHgwNWI3LAorCTB4MDViOCwgMHgwNWI5LCAweDAwMDAsIDB4MDViYiwKKwkweDA1YmMsIDB4MDViZCwgMHgwNWJlLCAweDA1YmYsCisJLyogMHhkMCovCisJMHgwNWMwLCAweDA1YzEsIDB4MDVjMiwgMHgwNWMzLAorCTB4MDVmMCwgMHgwNWYxLCAweDA1ZjIsIDB4MDVmMywKKwkweDA1ZjQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgyMDE3LAorCS8qIDB4ZTAqLworCTB4MDVkMCwgMHgwNWQxLCAweDA1ZDIsIDB4MDVkMywKKwkweDA1ZDQsIDB4MDVkNSwgMHgwNWQ2LCAweDA1ZDcsCisJMHgwNWQ4LCAweDA1ZDksIDB4MDVkYSwgMHgwNWRiLAorCTB4MDVkYywgMHgwNWRkLCAweDA1ZGUsIDB4MDVkZiwKKwkvKiAweGYwKi8KKwkweDA1ZTAsIDB4MDVlMSwgMHgwNWUyLCAweDA1ZTMsCisJMHgwNWU0LCAweDA1ZTUsIDB4MDVlNiwgMHgwNWU3LAorCTB4MDVlOCwgMHgwNWU5LCAweDA1ZWEsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDBbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4MDAsIDB4YTIsIDB4YTMsIDB4MDAsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4MDAsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4MDAsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4MDAsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4MDAsIC8qIDB4YjgtMHhiZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YzAtMHhjNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YzgtMHhjZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YWEsIC8qIDB4ZDAtMHhkNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZDgtMHhkZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZTAtMHhlNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZTgtMHhlZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YmEsIC8qIDB4ZjAtMHhmNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAxWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDgzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMlsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhMC0weGE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhOC0weGFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhiMC0weGI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhiOC0weGJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHgwMCwgLyogMHhjMC0weGM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhjOC0weGNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhkMC0weGQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhkOC0weGRmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDVbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTgtMHhhZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YjAtMHhiNyAqLworCTB4YzgsIDB4YzksIDB4MDAsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YjgtMHhiZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YzAtMHhjNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YzgtMHhjZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIDB4ZDgsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZjAtMHhmNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTIwWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZCwgMHhmZSwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHg5NiwgMHg5NywgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHg5MSwgMHg5MiwgMHg4MiwgMHgwMCwgMHg5MywgMHg5NCwgMHg4NCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHg4NiwgMHg4NywgMHg5NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4NSwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHg4OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHg4YiwgMHg5YiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KKwkweDAwLCAweDAwLCAweGE0LCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGE4LTB4YWYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyMVsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YjksIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4OTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnBhZ2VfdW5pMmNoYXJzZXRbMjU2XSA9IHsKKwlwYWdlMDAsIHBhZ2UwMSwgcGFnZTAyLCBOVUxMLCAgIE5VTEwsICAgcGFnZTA1LCBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJcGFnZTIwLCBwYWdlMjEsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJsb3dlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NDAtMHg0NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NTAtMHg1NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHgwMCwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHgwMCwgLyogMHhiOC0weGJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhjMC0weGM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhjOC0weGNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhkMC0weGQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0MnVwcGVyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg2MC0weDY3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg2OC0weDZmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg3MC0weDc3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweDAwLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweDAwLCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweDAwLCAvKiAweGI4LTB4YmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGMwLTB4YzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGM4LTB4Y2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGQwLTB4ZDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyBpbnQgdW5pMmNoYXIod2NoYXJfdCB1bmksIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50IGJvdW5kbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnVuaTJjaGFyc2V0OworCXVuc2lnbmVkIGNoYXIgY2wgPSB1bmkgJiAweDAwZmY7CisJdW5zaWduZWQgY2hhciBjaCA9ICh1bmkgJiAweGZmMDApID4+IDg7CisKKwlpZiAoYm91bmRsZW4gPD0gMCkKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwl1bmkyY2hhcnNldCA9IHBhZ2VfdW5pMmNoYXJzZXRbY2hdOworCWlmICh1bmkyY2hhcnNldCAmJiB1bmkyY2hhcnNldFtjbF0pCisJCW91dFswXSA9IHVuaTJjaGFyc2V0W2NsXTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNoYXIydW5pKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJhd3N0cmluZywgaW50IGJvdW5kbGVuLCB3Y2hhcl90ICp1bmkpCit7CisJKnVuaSA9IGNoYXJzZXQydW5pWypyYXdzdHJpbmddOworCWlmICgqdW5pID09IDB4MDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmxzX3RhYmxlIHRhYmxlID0geworCS5jaGFyc2V0CT0gImNwMTI1NSIsCisJLmFsaWFzCQk9ICJpc284ODU5LTgiLAorCS51bmkyY2hhcgk9IHVuaTJjaGFyLAorCS5jaGFyMnVuaQk9IGNoYXIydW5pLAorCS5jaGFyc2V0Mmxvd2VyCT0gY2hhcnNldDJsb3dlciwKKwkuY2hhcnNldDJ1cHBlcgk9IGNoYXJzZXQydXBwZXIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9ubHNfY3AxMjU1KHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX25scygmdGFibGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9ubHNfY3AxMjU1KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ubHNfY3AxMjU1KQorbW9kdWxlX2V4aXQoZXhpdF9ubHNfY3AxMjU1KQorCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CitNT0RVTEVfQUxJQVNfTkxTKGlzbzg4NTktOCk7CmRpZmYgLS1naXQgYS9mcy9ubHMvbmxzX2NwNDM3LmMgYi9mcy9ubHMvbmxzX2NwNDM3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM0YTFjZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25scy9ubHNfY3A0MzcuYwpAQCAtMCwwICsxLDM4OCBAQAorLyoKKyAqIGxpbnV4L2ZzL25sc19jcDQzNy5jCisgKgorICogQ2hhcnNldCBjcDQzNyB0cmFuc2xhdGlvbiB0YWJsZXMuCisgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBVbmljb2RlIGFuZCBjaGFyc2V0CisgKiB0YWJsZXMgZnJvbSB0aGUgVW5pY29kZSBPcmdhbml6YXRpb24gKHd3dy51bmljb2RlLm9yZykuCisgKiBUaGUgVW5pY29kZSB0byBjaGFyc2V0IHRhYmxlIGhhcyBvbmx5IGV4YWN0IG1hcHBpbmdzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCitzdGF0aWMgd2NoYXJfdCBjaGFyc2V0MnVuaVsyNTZdID0geworCS8qIDB4MDAqLworCTB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywKKwkweDAwMDQsIDB4MDAwNSwgMHgwMDA2LCAweDAwMDcsCisJMHgwMDA4LCAweDAwMDksIDB4MDAwYSwgMHgwMDBiLAorCTB4MDAwYywgMHgwMDBkLCAweDAwMGUsIDB4MDAwZiwKKwkvKiAweDEwKi8KKwkweDAwMTAsIDB4MDAxMSwgMHgwMDEyLCAweDAwMTMsCisJMHgwMDE0LCAweDAwMTUsIDB4MDAxNiwgMHgwMDE3LAorCTB4MDAxOCwgMHgwMDE5LCAweDAwMWEsIDB4MDAxYiwKKwkweDAwMWMsIDB4MDAxZCwgMHgwMDFlLCAweDAwMWYsCisJLyogMHgyMCovCisJMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLAorCTB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKwkweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsCisJMHgwMDJjLCAweDAwMmQsIDB4MDAyZSwgMHgwMDJmLAorCS8qIDB4MzAqLworCTB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywKKwkweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisJMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLAorCTB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKwkvKiAweDQwKi8KKwkweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsCisJMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAorCTB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwKKwkweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsCisJLyogMHg1MCovCisJMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLAorCTB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKwkweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsCisJMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLAorCS8qIDB4NjAqLworCTB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywKKwkweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisJMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLAorCTB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKKwkvKiAweDcwKi8KKwkweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsCisJMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LAorCTB4MDA3OCwgMHgwMDc5LCAweDAwN2EsIDB4MDA3YiwKKwkweDAwN2MsIDB4MDA3ZCwgMHgwMDdlLCAweDAwN2YsCisJLyogMHg4MCovCisJMHgwMGM3LCAweDAwZmMsIDB4MDBlOSwgMHgwMGUyLAorCTB4MDBlNCwgMHgwMGUwLCAweDAwZTUsIDB4MDBlNywKKwkweDAwZWEsIDB4MDBlYiwgMHgwMGU4LCAweDAwZWYsCisJMHgwMGVlLCAweDAwZWMsIDB4MDBjNCwgMHgwMGM1LAorCS8qIDB4OTAqLworCTB4MDBjOSwgMHgwMGU2LCAweDAwYzYsIDB4MDBmNCwKKwkweDAwZjYsIDB4MDBmMiwgMHgwMGZiLCAweDAwZjksCisJMHgwMGZmLCAweDAwZDYsIDB4MDBkYywgMHgwMGEyLAorCTB4MDBhMywgMHgwMGE1LCAweDIwYTcsIDB4MDE5MiwKKwkvKiAweGEwKi8KKwkweDAwZTEsIDB4MDBlZCwgMHgwMGYzLCAweDAwZmEsCisJMHgwMGYxLCAweDAwZDEsIDB4MDBhYSwgMHgwMGJhLAorCTB4MDBiZiwgMHgyMzEwLCAweDAwYWMsIDB4MDBiZCwKKwkweDAwYmMsIDB4MDBhMSwgMHgwMGFiLCAweDAwYmIsCisJLyogMHhiMCovCisJMHgyNTkxLCAweDI1OTIsIDB4MjU5MywgMHgyNTAyLAorCTB4MjUyNCwgMHgyNTYxLCAweDI1NjIsIDB4MjU1NiwKKwkweDI1NTUsIDB4MjU2MywgMHgyNTUxLCAweDI1NTcsCisJMHgyNTVkLCAweDI1NWMsIDB4MjU1YiwgMHgyNTEwLAorCS8qIDB4YzAqLworCTB4MjUxNCwgMHgyNTM0LCAweDI1MmMsIDB4MjUxYywKKwkweDI1MDAsIDB4MjUzYywgMHgyNTVlLCAweDI1NWYsCisJMHgyNTVhLCAweDI1NTQsIDB4MjU2OSwgMHgyNTY2LAorCTB4MjU2MCwgMHgyNTUwLCAweDI1NmMsIDB4MjU2NywKKwkvKiAweGQwKi8KKwkweDI1NjgsIDB4MjU2NCwgMHgyNTY1LCAweDI1NTksCisJMHgyNTU4LCAweDI1NTIsIDB4MjU1MywgMHgyNTZiLAorCTB4MjU2YSwgMHgyNTE4LCAweDI1MGMsIDB4MjU4OCwKKwkweDI1ODQsIDB4MjU4YywgMHgyNTkwLCAweDI1ODAsCisJLyogMHhlMCovCisJMHgwM2IxLCAweDAwZGYsIDB4MDM5MywgMHgwM2MwLAorCTB4MDNhMywgMHgwM2MzLCAweDAwYjUsIDB4MDNjNCwKKwkweDAzYTYsIDB4MDM5OCwgMHgwM2E5LCAweDAzYjQsCisJMHgyMjFlLCAweDAzYzYsIDB4MDNiNSwgMHgyMjI5LAorCS8qIDB4ZjAqLworCTB4MjI2MSwgMHgwMGIxLCAweDIyNjUsIDB4MjI2NCwKKwkweDIzMjAsIDB4MjMyMSwgMHgwMGY3LCAweDIyNDgsCisJMHgwMGIwLCAweDIyMTksIDB4MDBiNywgMHgyMjFhLAorCTB4MjA3ZiwgMHgwMGIyLCAweDI1YTAsIDB4MDBhMCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMFsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHhmZiwgMHhhZCwgMHg5YiwgMHg5YywgMHgwMCwgMHg5ZCwgMHgwMCwgMHgwMCwgLyogMHhhMC0weGE3ICovCisJMHgwMCwgMHgwMCwgMHhhNiwgMHhhZSwgMHhhYSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhOC0weGFmICovCisJMHhmOCwgMHhmMSwgMHhmZCwgMHgwMCwgMHgwMCwgMHhlNiwgMHgwMCwgMHhmYSwgLyogMHhiMC0weGI3ICovCisJMHgwMCwgMHgwMCwgMHhhNywgMHhhZiwgMHhhYywgMHhhYiwgMHgwMCwgMHhhOCwgLyogMHhiOC0weGJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4ZSwgMHg4ZiwgMHg5MiwgMHg4MCwgLyogMHhjMC0weGM3ICovCisJMHgwMCwgMHg5MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhjOC0weGNmICovCisJMHgwMCwgMHhhNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OSwgMHgwMCwgLyogMHhkMC0weGQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5YSwgMHgwMCwgMHgwMCwgMHhlMSwgLyogMHhkOC0weGRmICovCisJMHg4NSwgMHhhMCwgMHg4MywgMHgwMCwgMHg4NCwgMHg4NiwgMHg5MSwgMHg4NywgLyogMHhlMC0weGU3ICovCisJMHg4YSwgMHg4MiwgMHg4OCwgMHg4OSwgMHg4ZCwgMHhhMSwgMHg4YywgMHg4YiwgLyogMHhlOC0weGVmICovCisJMHgwMCwgMHhhNCwgMHg5NSwgMHhhMiwgMHg5MywgMHgwMCwgMHg5NCwgMHhmNiwgLyogMHhmMC0weGY3ICovCisJMHgwMCwgMHg5NywgMHhhMywgMHg5NiwgMHg4MSwgMHgwMCwgMHgwMCwgMHg5OCwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDFbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4OWYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAzWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweGUyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweGU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweGU0LCAweDAwLCAweDAwLCAweGU4LCAweDAwLCAvKiAweGEwLTB4YTcgKi8KKwkweDAwLCAweGVhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGE4LTB4YWYgKi8KKwkweDAwLCAweGUwLCAweDAwLCAweDAwLCAweGViLCAweGVlLCAweDAwLCAweDAwLCAvKiAweGIwLTB4YjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGI4LTB4YmYgKi8KKwkweGUzLCAweDAwLCAweDAwLCAweGU1LCAweGU3LCAweDAwLCAweGVkLCAweDAwLCAvKiAweGMwLTB4YzcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyMFsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmMsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5ZSwgLyogMHhhMC0weGE3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjJbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweGY5LCAweGZiLCAweDAwLCAweDAwLCAweDAwLCAweGVjLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweGVmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweGY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweDAwLCAweGYwLCAweDAwLCAweDAwLCAweGYzLCAweGYyLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyM1syNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4YTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4ZjQsIDB4ZjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTI1WzI1Nl0gPSB7CisJMHhjNCwgMHgwMCwgMHhiMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkYSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHhiZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHhkOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMywgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiNCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMiwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjNSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHhjZCwgMHhiYSwgMHhkNSwgMHhkNiwgMHhjOSwgMHhiOCwgMHhiNywgMHhiYiwgLyogMHg1MC0weDU3ICovCisJMHhkNCwgMHhkMywgMHhjOCwgMHhiZSwgMHhiZCwgMHhiYywgMHhjNiwgMHhjNywgLyogMHg1OC0weDVmICovCisJMHhjYywgMHhiNSwgMHhiNiwgMHhiOSwgMHhkMSwgMHhkMiwgMHhjYiwgMHhjZiwgLyogMHg2MC0weDY3ICovCisJMHhkMCwgMHhjYSwgMHhkOCwgMHhkNywgMHhjZSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweGRmLCAweDAwLCAweDAwLCAweDAwLCAweGRjLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweGRiLCAweDAwLCAweDAwLCAweDAwLCAweGRkLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweGRlLCAweGIwLCAweGIxLCAweGIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweGZlLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwYWdlX3VuaTJjaGFyc2V0WzI1Nl0gPSB7CisJcGFnZTAwLCBwYWdlMDEsIE5VTEwsICAgcGFnZTAzLCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCXBhZ2UyMCwgTlVMTCwgICBwYWdlMjIsIHBhZ2UyMywgTlVMTCwgICBwYWdlMjUsIE5VTEwsICAgTlVMTCwgICAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQybG93ZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDQwLTB4NDcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDUwLTB4NTcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODcsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4ODQsIDB4ODYsIC8qIDB4ODgtMHg4ZiAqLworCTB4ODIsIDB4OTEsIDB4OTEsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTQsIDB4ODEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTQsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4MDAsIDB4ZTMsIDB4ZTUsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZWQsIDB4MDAsIDB4MDAsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJ1cHBlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NjAtMHg2NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NzAtMHg3NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg5YSwgMHg5MCwgMHgwMCwgMHg4ZSwgMHgwMCwgMHg4ZiwgMHg4MCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MiwgMHg5MiwgMHgwMCwgMHg5OSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhNSwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHgwMCwgMHhlMSwgMHhlMiwgMHgwMCwgMHhlNCwgMHhlNCwgMHgwMCwgMHgwMCwgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHgwMCwgMHhlYywgMHhlOCwgMHgwMCwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgaW50IHVuaTJjaGFyKHdjaGFyX3QgdW5pLCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCBib3VuZGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICp1bmkyY2hhcnNldDsKKwl1bnNpZ25lZCBjaGFyIGNsID0gdW5pICYgMHgwMGZmOworCXVuc2lnbmVkIGNoYXIgY2ggPSAodW5pICYgMHhmZjAwKSA+PiA4OworCisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJdW5pMmNoYXJzZXQgPSBwYWdlX3VuaTJjaGFyc2V0W2NoXTsKKwlpZiAodW5pMmNoYXJzZXQgJiYgdW5pMmNoYXJzZXRbY2xdKQorCQlvdXRbMF0gPSB1bmkyY2hhcnNldFtjbF07CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGFyMnVuaShjb25zdCB1bnNpZ25lZCBjaGFyICpyYXdzdHJpbmcsIGludCBib3VuZGxlbiwgd2NoYXJfdCAqdW5pKQoreworCSp1bmkgPSBjaGFyc2V0MnVuaVsqcmF3c3RyaW5nXTsKKwlpZiAoKnVuaSA9PSAweDAwMDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSB0YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJjcDQzNyIsCisJLnVuaTJjaGFyCT0gdW5pMmNoYXIsCisJLmNoYXIydW5pCT0gY2hhcjJ1bmksCisJLmNoYXJzZXQybG93ZXIJPSBjaGFyc2V0Mmxvd2VyLAorCS5jaGFyc2V0MnVwcGVyCT0gY2hhcnNldDJ1cHBlciwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X25sc19jcDQzNyh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmxzX2NwNDM3KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ubHNfY3A0MzcpCittb2R1bGVfZXhpdChleGl0X25sc19jcDQzNykKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvbmxzL25sc19jcDczNy5jIGIvZnMvbmxzL25sc19jcDczNy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YjNjYTgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ubHMvbmxzX2NwNzM3LmMKQEAgLTAsMCArMSwzNTEgQEAKKy8qCisgKiBsaW51eC9mcy9ubHNfY3A3MzcuYworICoKKyAqIENoYXJzZXQgY3A3MzcgdHJhbnNsYXRpb24gdGFibGVzLgorICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgVW5pY29kZSBhbmQgY2hhcnNldAorICogdGFibGVzIGZyb20gdGhlIFVuaWNvZGUgT3JnYW5pemF0aW9uICh3d3cudW5pY29kZS5vcmcpLgorICogVGhlIFVuaWNvZGUgdG8gY2hhcnNldCB0YWJsZSBoYXMgb25seSBleGFjdCBtYXBwaW5ncy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworc3RhdGljIHdjaGFyX3QgY2hhcnNldDJ1bmlbMjU2XSA9IHsKKwkvKiAweDAwKi8KKwkweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsCisJMHgwMDA0LCAweDAwMDUsIDB4MDAwNiwgMHgwMDA3LAorCTB4MDAwOCwgMHgwMDA5LCAweDAwMGEsIDB4MDAwYiwKKwkweDAwMGMsIDB4MDAwZCwgMHgwMDBlLCAweDAwMGYsCisJLyogMHgxMCovCisJMHgwMDEwLCAweDAwMTEsIDB4MDAxMiwgMHgwMDEzLAorCTB4MDAxNCwgMHgwMDE1LCAweDAwMTYsIDB4MDAxNywKKwkweDAwMTgsIDB4MDAxOSwgMHgwMDFhLCAweDAwMWIsCisJMHgwMDFjLCAweDAwMWQsIDB4MDAxZSwgMHgwMDFmLAorCS8qIDB4MjAqLworCTB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywKKwkweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisJMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLAorCTB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKwkvKiAweDMwKi8KKwkweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsCisJMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAorCTB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwKKwkweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsCisJLyogMHg0MCovCisJMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLAorCTB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKwkweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsCisJMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLAorCS8qIDB4NTAqLworCTB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywKKwkweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisJMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMDViLAorCTB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwKKwkvKiAweDYwKi8KKwkweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsCisJMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LAorCTB4MDA2OCwgMHgwMDY5LCAweDAwNmEsIDB4MDA2YiwKKwkweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsCisJLyogMHg3MCovCisJMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLAorCTB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKwkweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsCisJMHgwMDdjLCAweDAwN2QsIDB4MDA3ZSwgMHgwMDdmLAorCS8qIDB4ODAqLworCTB4MDM5MSwgMHgwMzkyLCAweDAzOTMsIDB4MDM5NCwKKwkweDAzOTUsIDB4MDM5NiwgMHgwMzk3LCAweDAzOTgsCisJMHgwMzk5LCAweDAzOWEsIDB4MDM5YiwgMHgwMzljLAorCTB4MDM5ZCwgMHgwMzllLCAweDAzOWYsIDB4MDNhMCwKKwkvKiAweDkwKi8KKwkweDAzYTEsIDB4MDNhMywgMHgwM2E0LCAweDAzYTUsCisJMHgwM2E2LCAweDAzYTcsIDB4MDNhOCwgMHgwM2E5LAorCTB4MDNiMSwgMHgwM2IyLCAweDAzYjMsIDB4MDNiNCwKKwkweDAzYjUsIDB4MDNiNiwgMHgwM2I3LCAweDAzYjgsCisJLyogMHhhMCovCisJMHgwM2I5LCAweDAzYmEsIDB4MDNiYiwgMHgwM2JjLAorCTB4MDNiZCwgMHgwM2JlLCAweDAzYmYsIDB4MDNjMCwKKwkweDAzYzEsIDB4MDNjMywgMHgwM2MyLCAweDAzYzQsCisJMHgwM2M1LCAweDAzYzYsIDB4MDNjNywgMHgwM2M4LAorCS8qIDB4YjAqLworCTB4MjU5MSwgMHgyNTkyLCAweDI1OTMsIDB4MjUwMiwKKwkweDI1MjQsIDB4MjU2MSwgMHgyNTYyLCAweDI1NTYsCisJMHgyNTU1LCAweDI1NjMsIDB4MjU1MSwgMHgyNTU3LAorCTB4MjU1ZCwgMHgyNTVjLCAweDI1NWIsIDB4MjUxMCwKKwkvKiAweGMwKi8KKwkweDI1MTQsIDB4MjUzNCwgMHgyNTJjLCAweDI1MWMsCisJMHgyNTAwLCAweDI1M2MsIDB4MjU1ZSwgMHgyNTVmLAorCTB4MjU1YSwgMHgyNTU0LCAweDI1NjksIDB4MjU2NiwKKwkweDI1NjAsIDB4MjU1MCwgMHgyNTZjLCAweDI1NjcsCisJLyogMHhkMCovCisJMHgyNTY4LCAweDI1NjQsIDB4MjU2NSwgMHgyNTU5LAorCTB4MjU1OCwgMHgyNTUyLCAweDI1NTMsIDB4MjU2YiwKKwkweDI1NmEsIDB4MjUxOCwgMHgyNTBjLCAweDI1ODgsCisJMHgyNTg0LCAweDI1OGMsIDB4MjU5MCwgMHgyNTgwLAorCS8qIDB4ZTAqLworCTB4MDNjOSwgMHgwM2FjLCAweDAzYWQsIDB4MDNhZSwKKwkweDAzY2EsIDB4MDNhZiwgMHgwM2NjLCAweDAzY2QsCisJMHgwM2NiLCAweDAzY2UsIDB4MDM4NiwgMHgwMzg4LAorCTB4MDM4OSwgMHgwMzhhLCAweDAzOGMsIDB4MDM4ZSwKKwkvKiAweGYwKi8KKwkweDAzOGYsIDB4MDBiMSwgMHgyMjY1LCAweDIyNjQsCisJMHgwM2FhLCAweDAzYWIsIDB4MDBmNywgMHgyMjQ4LAorCTB4MDBiMCwgMHgyMjE5LCAweDAwYjcsIDB4MjIxYSwKKwkweDIwN2YsIDB4MDBiMiwgMHgyNWEwLCAweDAwYTAsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDBbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTgtMHhhZiAqLworCTB4ZjgsIDB4ZjEsIDB4ZmQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmEsIC8qIDB4YjAtMHhiNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YjgtMHhiZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YzAtMHhjNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YzgtMHhjZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZDAtMHhkNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZDgtMHhkZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZTAtMHhlNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZTgtMHhlZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjYsIC8qIDB4ZjAtMHhmNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAzWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGVhLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweGViLCAweGVjLCAweGVkLCAweDAwLCAweGVlLCAweDAwLCAweGVmLCAweGYwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAvKiAweDkwLTB4OTcgKi8KKwkweDg3LCAweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAvKiAweDk4LTB4OWYgKi8KKwkweDhmLCAweDkwLCAweDAwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAvKiAweGEwLTB4YTcgKi8KKwkweDk2LCAweDk3LCAweGY0LCAweGY1LCAweGUxLCAweGUyLCAweGUzLCAweGU1LCAvKiAweGE4LTB4YWYgKi8KKwkweDAwLCAweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAvKiAweGIwLTB4YjcgKi8KKwkweDlmLCAweGEwLCAweGExLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LCAvKiAweGI4LTB4YmYgKi8KKwkweGE3LCAweGE4LCAweGFhLCAweGE5LCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAvKiAweGMwLTB4YzcgKi8KKwkweGFmLCAweGUwLCAweGU0LCAweGU4LCAweGU2LCAweGU3LCAweGU5LCAweDAwLCAvKiAweGM4LTB4Y2YgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyMFsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmMsIC8qIDB4NzgtMHg3ZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTIyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHhmOSwgMHhmYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHhmNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMywgMHhmMiwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjVbMjU2XSA9IHsKKwkweGM0LCAweDAwLCAweGIzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGRhLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweGJmLCAweDAwLCAweDAwLCAweDAwLCAweGMwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweGQ5LCAweDAwLCAweDAwLCAweDAwLCAweGMzLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGI0LCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGMyLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGMxLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGM1LCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweGNkLCAweGJhLCAweGQ1LCAweGQ2LCAweGM5LCAweGI4LCAweGI3LCAweGJiLCAvKiAweDUwLTB4NTcgKi8KKwkweGQ0LCAweGQzLCAweGM4LCAweGJlLCAweGJkLCAweGJjLCAweGM2LCAweGM3LCAvKiAweDU4LTB4NWYgKi8KKwkweGNjLCAweGI1LCAweGI2LCAweGI5LCAweGQxLCAweGQyLCAweGNiLCAweGNmLCAvKiAweDYwLTB4NjcgKi8KKwkweGQwLCAweGNhLCAweGQ4LCAweGQ3LCAweGNlLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ZGYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZGMsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4ZGIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZGQsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4ZGUsIDB4YjAsIDB4YjEsIDB4YjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4ZmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnBhZ2VfdW5pMmNoYXJzZXRbMjU2XSA9IHsKKwlwYWdlMDAsIE5VTEwsICAgTlVMTCwgICBwYWdlMDMsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJcGFnZTIwLCBOVUxMLCAgIHBhZ2UyMiwgTlVMTCwgICBOVUxMLCAgIHBhZ2UyNSwgTlVMTCwgICBOVUxMLCAgIAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJsb3dlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NDAtMHg0NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NTAtMHg1NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg4MC0weDg3ICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHg4OC0weDhmICovCisJMHhhOCwgMHhhOSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgMHhlMCwgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhlOC0weGVmICovCisJMHhlOSwgMHhmMSwgMHhmMiwgMHhmMywgMHhlNCwgMHhlOCwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0MnVwcGVyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg2MC0weDY3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg2OC0weDZmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg3MC0weDc3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDk4LTB4OWYgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweGEwLTB4YTcgKi8KKwkweDkwLCAweDkxLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweDk3LCAweGVhLCAweGViLCAweGVjLCAweGY0LCAweGVkLCAweGVlLCAweGVmLCAvKiAweGUwLTB4ZTcgKi8KKwkweGY1LCAweGYwLCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyBpbnQgdW5pMmNoYXIod2NoYXJfdCB1bmksIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50IGJvdW5kbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnVuaTJjaGFyc2V0OworCXVuc2lnbmVkIGNoYXIgY2wgPSB1bmkgJiAweDAwZmY7CisJdW5zaWduZWQgY2hhciBjaCA9ICh1bmkgJiAweGZmMDApID4+IDg7CisKKwlpZiAoYm91bmRsZW4gPD0gMCkKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwl1bmkyY2hhcnNldCA9IHBhZ2VfdW5pMmNoYXJzZXRbY2hdOworCWlmICh1bmkyY2hhcnNldCAmJiB1bmkyY2hhcnNldFtjbF0pCisJCW91dFswXSA9IHVuaTJjaGFyc2V0W2NsXTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNoYXIydW5pKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJhd3N0cmluZywgaW50IGJvdW5kbGVuLCB3Y2hhcl90ICp1bmkpCit7CisJKnVuaSA9IGNoYXJzZXQydW5pWypyYXdzdHJpbmddOworCWlmICgqdW5pID09IDB4MDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmxzX3RhYmxlIHRhYmxlID0geworCS5jaGFyc2V0CT0gImNwNzM3IiwKKwkudW5pMmNoYXIJPSB1bmkyY2hhciwKKwkuY2hhcjJ1bmkJPSBjaGFyMnVuaSwKKwkuY2hhcnNldDJsb3dlcgk9IGNoYXJzZXQybG93ZXIsCisJLmNoYXJzZXQydXBwZXIJPSBjaGFyc2V0MnVwcGVyLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmxzX2NwNzM3KHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX25scygmdGFibGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9ubHNfY3A3Mzcodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25scygmdGFibGUpOworfQorCittb2R1bGVfaW5pdChpbml0X25sc19jcDczNykKK21vZHVsZV9leGl0KGV4aXRfbmxzX2NwNzM3KQorCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CmRpZmYgLS1naXQgYS9mcy9ubHMvbmxzX2NwNzc1LmMgYi9mcy9ubHMvbmxzX2NwNzc1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRiMjkwZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25scy9ubHNfY3A3NzUuYwpAQCAtMCwwICsxLDMyMCBAQAorLyoKKyAqIGxpbnV4L2ZzL25sc19jcDc3NS5jCisgKgorICogQ2hhcnNldCBjcDc3NSB0cmFuc2xhdGlvbiB0YWJsZXMuCisgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBVbmljb2RlIGFuZCBjaGFyc2V0CisgKiB0YWJsZXMgZnJvbSB0aGUgVW5pY29kZSBPcmdhbml6YXRpb24gKHd3dy51bmljb2RlLm9yZykuCisgKiBUaGUgVW5pY29kZSB0byBjaGFyc2V0IHRhYmxlIGhhcyBvbmx5IGV4YWN0IG1hcHBpbmdzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCitzdGF0aWMgd2NoYXJfdCBjaGFyc2V0MnVuaVsyNTZdID0geworCS8qIDB4MDAqLworCTB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywKKwkweDAwMDQsIDB4MDAwNSwgMHgwMDA2LCAweDAwMDcsCisJMHgwMDA4LCAweDAwMDksIDB4MDAwYSwgMHgwMDBiLAorCTB4MDAwYywgMHgwMDBkLCAweDAwMGUsIDB4MDAwZiwKKwkvKiAweDEwKi8KKwkweDAwMTAsIDB4MDAxMSwgMHgwMDEyLCAweDAwMTMsCisJMHgwMDE0LCAweDAwMTUsIDB4MDAxNiwgMHgwMDE3LAorCTB4MDAxOCwgMHgwMDE5LCAweDAwMWEsIDB4MDAxYiwKKwkweDAwMWMsIDB4MDAxZCwgMHgwMDFlLCAweDAwMWYsCisJLyogMHgyMCovCisJMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLAorCTB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKwkweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsCisJMHgwMDJjLCAweDAwMmQsIDB4MDAyZSwgMHgwMDJmLAorCS8qIDB4MzAqLworCTB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywKKwkweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisJMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLAorCTB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKwkvKiAweDQwKi8KKwkweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsCisJMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAorCTB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwKKwkweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsCisJLyogMHg1MCovCisJMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLAorCTB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKwkweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsCisJMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLAorCS8qIDB4NjAqLworCTB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywKKwkweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisJMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLAorCTB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKKwkvKiAweDcwKi8KKwkweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsCisJMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LAorCTB4MDA3OCwgMHgwMDc5LCAweDAwN2EsIDB4MDA3YiwKKwkweDAwN2MsIDB4MDA3ZCwgMHgwMDdlLCAweDAwN2YsCisJLyogMHg4MCovCisJMHgwMTA2LCAweDAwZmMsIDB4MDBlOSwgMHgwMTAxLAorCTB4MDBlNCwgMHgwMTIzLCAweDAwZTUsIDB4MDEwNywKKwkweDAxNDIsIDB4MDExMywgMHgwMTU2LCAweDAxNTcsCisJMHgwMTJiLCAweDAxNzksIDB4MDBjNCwgMHgwMGM1LAorCS8qIDB4OTAqLworCTB4MDBjOSwgMHgwMGU2LCAweDAwYzYsIDB4MDE0ZCwKKwkweDAwZjYsIDB4MDEyMiwgMHgwMGEyLCAweDAxNWEsCisJMHgwMTViLCAweDAwZDYsIDB4MDBkYywgMHgwMGY4LAorCTB4MDBhMywgMHgwMGQ4LCAweDAwZDcsIDB4MDBhNCwKKwkvKiAweGEwKi8KKwkweDAxMDAsIDB4MDEyYSwgMHgwMGYzLCAweDAxN2IsCisJMHgwMTdjLCAweDAxN2EsIDB4MjAxZCwgMHgwMGE2LAorCTB4MDBhOSwgMHgwMGFlLCAweDAwYWMsIDB4MDBiZCwKKwkweDAwYmMsIDB4MDE0MSwgMHgwMGFiLCAweDAwYmIsCisJLyogMHhiMCovCisJMHgyNTkxLCAweDI1OTIsIDB4MjU5MywgMHgyNTAyLAorCTB4MjUyNCwgMHgwMTA0LCAweDAxMGMsIDB4MDExOCwKKwkweDAxMTYsIDB4MjU2MywgMHgyNTUxLCAweDI1NTcsCisJMHgyNTVkLCAweDAxMmUsIDB4MDE2MCwgMHgyNTEwLAorCS8qIDB4YzAqLworCTB4MjUxNCwgMHgyNTM0LCAweDI1MmMsIDB4MjUxYywKKwkweDI1MDAsIDB4MjUzYywgMHgwMTcyLCAweDAxNmEsCisJMHgyNTVhLCAweDI1NTQsIDB4MjU2OSwgMHgyNTY2LAorCTB4MjU2MCwgMHgyNTUwLCAweDI1NmMsIDB4MDE3ZCwKKwkvKiAweGQwKi8KKwkweDAxMDUsIDB4MDEwZCwgMHgwMTE5LCAweDAxMTcsCisJMHgwMTJmLCAweDAxNjEsIDB4MDE3MywgMHgwMTZiLAorCTB4MDE3ZSwgMHgyNTE4LCAweDI1MGMsIDB4MjU4OCwKKwkweDI1ODQsIDB4MjU4YywgMHgyNTkwLCAweDI1ODAsCisJLyogMHhlMCovCisJMHgwMGQzLCAweDAwZGYsIDB4MDE0YywgMHgwMTQzLAorCTB4MDBmNSwgMHgwMGQ1LCAweDAwYjUsIDB4MDE0NCwKKwkweDAxMzYsIDB4MDEzNywgMHgwMTNiLCAweDAxM2MsCisJMHgwMTQ2LCAweDAxMTIsIDB4MDE0NSwgMHgyMDE5LAorCS8qIDB4ZjAqLworCTB4MDBhZCwgMHgwMGIxLCAweDIwMWMsIDB4MDBiZSwKKwkweDAwYjYsIDB4MDBhNywgMHgwMGY3LCAweDIwMWUsCisJMHgwMGIwLCAweDIyMTksIDB4MDBiNywgMHgwMGI5LAorCTB4MDBiMywgMHgwMGIyLCAweDI1YTAsIDB4MDBhMCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMFsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHhmZiwgMHgwMCwgMHg5NiwgMHg5YywgMHg5ZiwgMHgwMCwgMHhhNywgMHhmNSwgLyogMHhhMC0weGE3ICovCisJMHgwMCwgMHhhOCwgMHgwMCwgMHhhZSwgMHhhYSwgMHhmMCwgMHhhOSwgMHgwMCwgLyogMHhhOC0weGFmICovCisJMHhmOCwgMHhmMSwgMHhmZCwgMHhmYywgMHgwMCwgMHhlNiwgMHhmNCwgMHhmYSwgLyogMHhiMC0weGI3ICovCisJMHgwMCwgMHhmYiwgMHgwMCwgMHhhZiwgMHhhYywgMHhhYiwgMHhmMywgMHgwMCwgLyogMHhiOC0weGJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4ZSwgMHg4ZiwgMHg5MiwgMHgwMCwgLyogMHhjMC0weGM3ICovCisJMHgwMCwgMHg5MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhjOC0weGNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhlMCwgMHgwMCwgMHhlNSwgMHg5OSwgMHg5ZSwgLyogMHhkMC0weGQ3ICovCisJMHg5ZCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5YSwgMHgwMCwgMHgwMCwgMHhlMSwgLyogMHhkOC0weGRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4NCwgMHg4NiwgMHg5MSwgMHgwMCwgLyogMHhlMC0weGU3ICovCisJMHgwMCwgMHg4MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhlOC0weGVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhhMiwgMHgwMCwgMHhlNCwgMHg5NCwgMHhmNiwgLyogMHhmMC0weGY3ICovCisJMHg5YiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDFbMjU2XSA9IHsKKwkweGEwLCAweDgzLCAweDAwLCAweDAwLCAweGI1LCAweGQwLCAweDgwLCAweDg3LCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGI2LCAweGQxLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweGVkLCAweDg5LCAweDAwLCAweDAwLCAweGI4LCAweGQzLCAvKiAweDEwLTB4MTcgKi8KKwkweGI3LCAweGQyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDk1LCAweDg1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweGExLCAweDhjLCAweDAwLCAweDAwLCAweGJkLCAweGQ0LCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGU4LCAweGU5LCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweGVhLCAweGViLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweGFkLCAweDg4LCAweGUzLCAweGU3LCAweGVlLCAweGVjLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGUyLCAweDkzLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhhLCAweDhiLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDk3LCAweDk4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweGJlLCAweGQ1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweDAwLCAweGM3LCAweGQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweGM2LCAweGQ2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDhkLCAweGE1LCAweGEzLCAweGE0LCAweGNmLCAweGQ4LCAweDAwLCAvKiAweDc4LTB4N2YgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyMFsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4ZWYsIDB4MDAsIDB4MDAsIDB4ZjIsIDB4YTYsIDB4ZjcsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTIyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHhmOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjVbMjU2XSA9IHsKKwkweGM0LCAweDAwLCAweGIzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGRhLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweGJmLCAweDAwLCAweDAwLCAweDAwLCAweGMwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweGQ5LCAweDAwLCAweDAwLCAweDAwLCAweGMzLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGI0LCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGMyLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGMxLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGM1LCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweGNkLCAweGJhLCAweDAwLCAweDAwLCAweGM5LCAweDAwLCAweDAwLCAweGJiLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweGM4LCAweDAwLCAweDAwLCAweGJjLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweGNjLCAweDAwLCAweDAwLCAweGI5LCAweDAwLCAweDAwLCAweGNiLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweGNhLCAweDAwLCAweDAwLCAweGNlLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ZGYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZGMsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4ZGIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZGQsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4ZGUsIDB4YjAsIDB4YjEsIDB4YjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4ZmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnBhZ2VfdW5pMmNoYXJzZXRbMjU2XSA9IHsKKwlwYWdlMDAsIHBhZ2UwMSwgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJcGFnZTIwLCBOVUxMLCAgIHBhZ2UyMiwgTlVMTCwgICBOVUxMLCAgIHBhZ2UyNSwgTlVMTCwgICBOVUxMLCAgIAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJsb3dlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NDAtMHg0NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NTAtMHg1NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4NywgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YiwgMHg4YiwgMHg4YywgMHhhNSwgMHg4NCwgMHg4NiwgLyogMHg4OC0weDhmICovCisJMHg4MiwgMHg5MSwgMHg5MSwgMHg5MywgMHg5NCwgMHg4NSwgMHg5NiwgMHg5OCwgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5NCwgMHg4MSwgMHg5YiwgMHg5YywgMHg5YiwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHg4MywgMHg4YywgMHhhMiwgMHhhNCwgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHg4OCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhkMCwgMHhkMSwgMHhkMiwgLyogMHhiMC0weGI3ICovCisJMHhkMywgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhkNCwgMHhkNSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhkNiwgMHhkNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhkOCwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhhMiwgMHhlMSwgMHg5MywgMHhlNywgMHhlNCwgMHhlNCwgMHhlNiwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlOSwgMHhlOSwgMHhlYiwgMHhlYiwgMHhlYywgMHg4OSwgMHhlYywgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0MnVwcGVyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg2MC0weDY3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg2OC0weDZmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg3MC0weDc3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDlhLCAweDkwLCAweGEwLCAweDhlLCAweDk1LCAweDhmLCAweDgwLCAvKiAweDgwLTB4ODcgKi8KKwkweGFkLCAweGVkLCAweDhhLCAweDhhLCAweGExLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkyLCAweDkyLCAweGUyLCAweDk5LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk3LCAweDk5LCAweDlhLCAweDlkLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweGExLCAweGUwLCAweGEzLCAweGEzLCAweDhkLCAweGE2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGI1LCAweGI2LCAweGI3LCAweGI4LCAweGJkLCAweGJlLCAweGM2LCAweGM3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGNmLCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU1LCAweGU1LCAweDAwLCAweGUzLCAvKiAweGUwLTB4ZTcgKi8KKwkweGU4LCAweGU4LCAweGVhLCAweGVhLCAweGVlLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyBpbnQgdW5pMmNoYXIod2NoYXJfdCB1bmksIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50IGJvdW5kbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnVuaTJjaGFyc2V0OworCXVuc2lnbmVkIGNoYXIgY2wgPSB1bmkgJiAweDAwZmY7CisJdW5zaWduZWQgY2hhciBjaCA9ICh1bmkgJiAweGZmMDApID4+IDg7CisKKwlpZiAoYm91bmRsZW4gPD0gMCkKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwl1bmkyY2hhcnNldCA9IHBhZ2VfdW5pMmNoYXJzZXRbY2hdOworCWlmICh1bmkyY2hhcnNldCAmJiB1bmkyY2hhcnNldFtjbF0pCisJCW91dFswXSA9IHVuaTJjaGFyc2V0W2NsXTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNoYXIydW5pKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJhd3N0cmluZywgaW50IGJvdW5kbGVuLCB3Y2hhcl90ICp1bmkpCit7CisJKnVuaSA9IGNoYXJzZXQydW5pWypyYXdzdHJpbmddOworCWlmICgqdW5pID09IDB4MDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmxzX3RhYmxlIHRhYmxlID0geworCS5jaGFyc2V0CT0gImNwNzc1IiwKKwkudW5pMmNoYXIJPSB1bmkyY2hhciwKKwkuY2hhcjJ1bmkJPSBjaGFyMnVuaSwKKwkuY2hhcnNldDJsb3dlcgk9IGNoYXJzZXQybG93ZXIsCisJLmNoYXJzZXQydXBwZXIJPSBjaGFyc2V0MnVwcGVyLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmxzX2NwNzc1KHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX25scygmdGFibGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9ubHNfY3A3NzUodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25scygmdGFibGUpOworfQorCittb2R1bGVfaW5pdChpbml0X25sc19jcDc3NSkKK21vZHVsZV9leGl0KGV4aXRfbmxzX2NwNzc1KQorCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CmRpZmYgLS1naXQgYS9mcy9ubHMvbmxzX2NwODUwLmMgYi9mcy9ubHMvbmxzX2NwODUwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVkZWFhNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25scy9ubHNfY3A4NTAuYwpAQCAtMCwwICsxLDMxNiBAQAorLyoKKyAqIGxpbnV4L2ZzL25sc19jcDg1MC5jCisgKgorICogQ2hhcnNldCBjcDg1MCB0cmFuc2xhdGlvbiB0YWJsZXMuCisgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBVbmljb2RlIGFuZCBjaGFyc2V0CisgKiB0YWJsZXMgZnJvbSB0aGUgVW5pY29kZSBPcmdhbml6YXRpb24gKHd3dy51bmljb2RlLm9yZykuCisgKiBUaGUgVW5pY29kZSB0byBjaGFyc2V0IHRhYmxlIGhhcyBvbmx5IGV4YWN0IG1hcHBpbmdzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCitzdGF0aWMgd2NoYXJfdCBjaGFyc2V0MnVuaVsyNTZdID0geworCS8qIDB4MDAqLworCTB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywKKwkweDAwMDQsIDB4MDAwNSwgMHgwMDA2LCAweDAwMDcsCisJMHgwMDA4LCAweDAwMDksIDB4MDAwYSwgMHgwMDBiLAorCTB4MDAwYywgMHgwMDBkLCAweDAwMGUsIDB4MDAwZiwKKwkvKiAweDEwKi8KKwkweDAwMTAsIDB4MDAxMSwgMHgwMDEyLCAweDAwMTMsCisJMHgwMDE0LCAweDAwMTUsIDB4MDAxNiwgMHgwMDE3LAorCTB4MDAxOCwgMHgwMDE5LCAweDAwMWEsIDB4MDAxYiwKKwkweDAwMWMsIDB4MDAxZCwgMHgwMDFlLCAweDAwMWYsCisJLyogMHgyMCovCisJMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLAorCTB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKwkweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsCisJMHgwMDJjLCAweDAwMmQsIDB4MDAyZSwgMHgwMDJmLAorCS8qIDB4MzAqLworCTB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywKKwkweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisJMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLAorCTB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKwkvKiAweDQwKi8KKwkweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsCisJMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAorCTB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwKKwkweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsCisJLyogMHg1MCovCisJMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLAorCTB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKwkweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsCisJMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLAorCS8qIDB4NjAqLworCTB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywKKwkweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisJMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLAorCTB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKKwkvKiAweDcwKi8KKwkweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsCisJMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LAorCTB4MDA3OCwgMHgwMDc5LCAweDAwN2EsIDB4MDA3YiwKKwkweDAwN2MsIDB4MDA3ZCwgMHgwMDdlLCAweDAwN2YsCisJLyogMHg4MCovCisJMHgwMGM3LCAweDAwZmMsIDB4MDBlOSwgMHgwMGUyLAorCTB4MDBlNCwgMHgwMGUwLCAweDAwZTUsIDB4MDBlNywKKwkweDAwZWEsIDB4MDBlYiwgMHgwMGU4LCAweDAwZWYsCisJMHgwMGVlLCAweDAwZWMsIDB4MDBjNCwgMHgwMGM1LAorCS8qIDB4OTAqLworCTB4MDBjOSwgMHgwMGU2LCAweDAwYzYsIDB4MDBmNCwKKwkweDAwZjYsIDB4MDBmMiwgMHgwMGZiLCAweDAwZjksCisJMHgwMGZmLCAweDAwZDYsIDB4MDBkYywgMHgwMGY4LAorCTB4MDBhMywgMHgwMGQ4LCAweDAwZDcsIDB4MDE5MiwKKwkvKiAweGEwKi8KKwkweDAwZTEsIDB4MDBlZCwgMHgwMGYzLCAweDAwZmEsCisJMHgwMGYxLCAweDAwZDEsIDB4MDBhYSwgMHgwMGJhLAorCTB4MDBiZiwgMHgwMGFlLCAweDAwYWMsIDB4MDBiZCwKKwkweDAwYmMsIDB4MDBhMSwgMHgwMGFiLCAweDAwYmIsCisJLyogMHhiMCovCisJMHgyNTkxLCAweDI1OTIsIDB4MjU5MywgMHgyNTAyLAorCTB4MjUyNCwgMHgwMGMxLCAweDAwYzIsIDB4MDBjMCwKKwkweDAwYTksIDB4MjU2MywgMHgyNTUxLCAweDI1NTcsCisJMHgyNTVkLCAweDAwYTIsIDB4MDBhNSwgMHgyNTEwLAorCS8qIDB4YzAqLworCTB4MjUxNCwgMHgyNTM0LCAweDI1MmMsIDB4MjUxYywKKwkweDI1MDAsIDB4MjUzYywgMHgwMGUzLCAweDAwYzMsCisJMHgyNTVhLCAweDI1NTQsIDB4MjU2OSwgMHgyNTY2LAorCTB4MjU2MCwgMHgyNTUwLCAweDI1NmMsIDB4MDBhNCwKKwkvKiAweGQwKi8KKwkweDAwZjAsIDB4MDBkMCwgMHgwMGNhLCAweDAwY2IsCisJMHgwMGM4LCAweDAxMzEsIDB4MDBjZCwgMHgwMGNlLAorCTB4MDBjZiwgMHgyNTE4LCAweDI1MGMsIDB4MjU4OCwKKwkweDI1ODQsIDB4MDBhNiwgMHgwMGNjLCAweDI1ODAsCisJLyogMHhlMCovCisJMHgwMGQzLCAweDAwZGYsIDB4MDBkNCwgMHgwMGQyLAorCTB4MDBmNSwgMHgwMGQ1LCAweDAwYjUsIDB4MDBmZSwKKwkweDAwZGUsIDB4MDBkYSwgMHgwMGRiLCAweDAwZDksCisJMHgwMGZkLCAweDAwZGQsIDB4MDBhZiwgMHgwMGI0LAorCS8qIDB4ZjAqLworCTB4MDBhZCwgMHgwMGIxLCAweDIwMTcsIDB4MDBiZSwKKwkweDAwYjYsIDB4MDBhNywgMHgwMGY3LCAweDAwYjgsCisJMHgwMGIwLCAweDAwYTgsIDB4MDBiNywgMHgwMGI5LAorCTB4MDBiMywgMHgwMGIyLCAweDI1YTAsIDB4MDBhMCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMFsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHhmZiwgMHhhZCwgMHhiZCwgMHg5YywgMHhjZiwgMHhiZSwgMHhkZCwgMHhmNSwgLyogMHhhMC0weGE3ICovCisJMHhmOSwgMHhiOCwgMHhhNiwgMHhhZSwgMHhhYSwgMHhmMCwgMHhhOSwgMHhlZSwgLyogMHhhOC0weGFmICovCisJMHhmOCwgMHhmMSwgMHhmZCwgMHhmYywgMHhlZiwgMHhlNiwgMHhmNCwgMHhmYSwgLyogMHhiMC0weGI3ICovCisJMHhmNywgMHhmYiwgMHhhNywgMHhhZiwgMHhhYywgMHhhYiwgMHhmMywgMHhhOCwgLyogMHhiOC0weGJmICovCisJMHhiNywgMHhiNSwgMHhiNiwgMHhjNywgMHg4ZSwgMHg4ZiwgMHg5MiwgMHg4MCwgLyogMHhjMC0weGM3ICovCisJMHhkNCwgMHg5MCwgMHhkMiwgMHhkMywgMHhkZSwgMHhkNiwgMHhkNywgMHhkOCwgLyogMHhjOC0weGNmICovCisJMHhkMSwgMHhhNSwgMHhlMywgMHhlMCwgMHhlMiwgMHhlNSwgMHg5OSwgMHg5ZSwgLyogMHhkMC0weGQ3ICovCisJMHg5ZCwgMHhlYiwgMHhlOSwgMHhlYSwgMHg5YSwgMHhlZCwgMHhlOCwgMHhlMSwgLyogMHhkOC0weGRmICovCisJMHg4NSwgMHhhMCwgMHg4MywgMHhjNiwgMHg4NCwgMHg4NiwgMHg5MSwgMHg4NywgLyogMHhlMC0weGU3ICovCisJMHg4YSwgMHg4MiwgMHg4OCwgMHg4OSwgMHg4ZCwgMHhhMSwgMHg4YywgMHg4YiwgLyogMHhlOC0weGVmICovCisJMHhkMCwgMHhhNCwgMHg5NSwgMHhhMiwgMHg5MywgMHhlNCwgMHg5NCwgMHhmNiwgLyogMHhmMC0weGY3ICovCisJMHg5YiwgMHg5NywgMHhhMywgMHg5NiwgMHg4MSwgMHhlYywgMHhlNywgMHg5OCwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDFbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweGQ1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4OWYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTIwWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMiwgLyogMHgxMC0weDE3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjVbMjU2XSA9IHsKKwkweGM0LCAweDAwLCAweGIzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGRhLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweGJmLCAweDAwLCAweDAwLCAweDAwLCAweGMwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweGQ5LCAweDAwLCAweDAwLCAweDAwLCAweGMzLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGI0LCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGMyLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGMxLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGM1LCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweGNkLCAweGJhLCAweDAwLCAweDAwLCAweGM5LCAweDAwLCAweDAwLCAweGJiLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweGM4LCAweDAwLCAweDAwLCAweGJjLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweGNjLCAweDAwLCAweDAwLCAweGI5LCAweDAwLCAweDAwLCAweGNiLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweGNhLCAweDAwLCAweDAwLCAweGNlLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ZGYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZGMsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4ZGIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4YjAsIDB4YjEsIDB4YjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4ZmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnBhZ2VfdW5pMmNoYXJzZXRbMjU2XSA9IHsKKwlwYWdlMDAsIHBhZ2UwMSwgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJcGFnZTIwLCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIHBhZ2UyNSwgTlVMTCwgICBOVUxMLCAgIAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJsb3dlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NDAtMHg0NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NTAtMHg1NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4NywgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4NCwgMHg4NiwgLyogMHg4OC0weDhmICovCisJMHg4MiwgMHg5MSwgMHg5MSwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5NCwgMHg4MSwgMHg5YiwgMHg5YywgMHg5YiwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNCwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhhMCwgMHg4MywgMHg4NSwgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNiwgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMCwgMHg4OCwgMHg4OSwgMHg4YSwgMHhkNSwgMHhhMSwgMHg4YywgLyogMHhkMC0weGQ3ICovCisJMHg4YiwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHg4ZCwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhhMiwgMHhlMSwgMHg5MywgMHg5NSwgMHhlNCwgMHhlNCwgMHhlNiwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlNywgMHhhMywgMHg5NiwgMHg5NywgMHhlYywgMHhlYywgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0MnVwcGVyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg2MC0weDY3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg2OC0weDZmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg3MC0weDc3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDlhLCAweDkwLCAweGI2LCAweDhlLCAweGI3LCAweDhmLCAweDgwLCAvKiAweDgwLTB4ODcgKi8KKwkweGQyLCAweGQzLCAweGQ0LCAweGQ4LCAweGQ3LCAweGRlLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkyLCAweDkyLCAweGUyLCAweDk5LCAweGUzLCAweGVhLCAweGViLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDk5LCAweDlhLCAweDlkLCAweDljLCAweDlkLCAweDllLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweGI1LCAweGQ2LCAweGUwLCAweGU5LCAweGE1LCAweGE1LCAweGE2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM3LCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGQxLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweDQ5LCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU1LCAweGU1LCAweDAwLCAweGU4LCAvKiAweGUwLTB4ZTcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVkLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyBpbnQgdW5pMmNoYXIod2NoYXJfdCB1bmksIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50IGJvdW5kbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnVuaTJjaGFyc2V0OworCXVuc2lnbmVkIGNoYXIgY2wgPSB1bmkgJiAweDAwZmY7CisJdW5zaWduZWQgY2hhciBjaCA9ICh1bmkgJiAweGZmMDApID4+IDg7CisKKwlpZiAoYm91bmRsZW4gPD0gMCkKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwl1bmkyY2hhcnNldCA9IHBhZ2VfdW5pMmNoYXJzZXRbY2hdOworCWlmICh1bmkyY2hhcnNldCAmJiB1bmkyY2hhcnNldFtjbF0pCisJCW91dFswXSA9IHVuaTJjaGFyc2V0W2NsXTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNoYXIydW5pKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJhd3N0cmluZywgaW50IGJvdW5kbGVuLCB3Y2hhcl90ICp1bmkpCit7CisJKnVuaSA9IGNoYXJzZXQydW5pWypyYXdzdHJpbmddOworCWlmICgqdW5pID09IDB4MDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmxzX3RhYmxlIHRhYmxlID0geworCS5jaGFyc2V0CT0gImNwODUwIiwKKwkudW5pMmNoYXIJPSB1bmkyY2hhciwKKwkuY2hhcjJ1bmkJPSBjaGFyMnVuaSwKKwkuY2hhcnNldDJsb3dlcgk9IGNoYXJzZXQybG93ZXIsCisJLmNoYXJzZXQydXBwZXIJPSBjaGFyc2V0MnVwcGVyLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmxzX2NwODUwKHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX25scygmdGFibGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9ubHNfY3A4NTAodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25scygmdGFibGUpOworfQorCittb2R1bGVfaW5pdChpbml0X25sc19jcDg1MCkKK21vZHVsZV9leGl0KGV4aXRfbmxzX2NwODUwKQorCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CmRpZmYgLS1naXQgYS9mcy9ubHMvbmxzX2NwODUyLmMgYi9mcy9ubHMvbmxzX2NwODUyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgyMmE3YgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25scy9ubHNfY3A4NTIuYwpAQCAtMCwwICsxLDMzOCBAQAorLyoKKyAqIGxpbnV4L2ZzL25sc19jcDg1Mi5jCisgKgorICogQ2hhcnNldCBjcDg1MiB0cmFuc2xhdGlvbiB0YWJsZXMuCisgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBVbmljb2RlIGFuZCBjaGFyc2V0CisgKiB0YWJsZXMgZnJvbSB0aGUgVW5pY29kZSBPcmdhbml6YXRpb24gKHd3dy51bmljb2RlLm9yZykuCisgKiBUaGUgVW5pY29kZSB0byBjaGFyc2V0IHRhYmxlIGhhcyBvbmx5IGV4YWN0IG1hcHBpbmdzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCitzdGF0aWMgd2NoYXJfdCBjaGFyc2V0MnVuaVsyNTZdID0geworCS8qIDB4MDAqLworCTB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywKKwkweDAwMDQsIDB4MDAwNSwgMHgwMDA2LCAweDAwMDcsCisJMHgwMDA4LCAweDAwMDksIDB4MDAwYSwgMHgwMDBiLAorCTB4MDAwYywgMHgwMDBkLCAweDAwMGUsIDB4MDAwZiwKKwkvKiAweDEwKi8KKwkweDAwMTAsIDB4MDAxMSwgMHgwMDEyLCAweDAwMTMsCisJMHgwMDE0LCAweDAwMTUsIDB4MDAxNiwgMHgwMDE3LAorCTB4MDAxOCwgMHgwMDE5LCAweDAwMWEsIDB4MDAxYiwKKwkweDAwMWMsIDB4MDAxZCwgMHgwMDFlLCAweDAwMWYsCisJLyogMHgyMCovCisJMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLAorCTB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKwkweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsCisJMHgwMDJjLCAweDAwMmQsIDB4MDAyZSwgMHgwMDJmLAorCS8qIDB4MzAqLworCTB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywKKwkweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisJMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLAorCTB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKwkvKiAweDQwKi8KKwkweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsCisJMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAorCTB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwKKwkweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsCisJLyogMHg1MCovCisJMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLAorCTB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKwkweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsCisJMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLAorCS8qIDB4NjAqLworCTB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywKKwkweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisJMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLAorCTB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKKwkvKiAweDcwKi8KKwkweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsCisJMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LAorCTB4MDA3OCwgMHgwMDc5LCAweDAwN2EsIDB4MDA3YiwKKwkweDAwN2MsIDB4MDA3ZCwgMHgwMDdlLCAweDAwN2YsCisJLyogMHg4MCovCisJMHgwMGM3LCAweDAwZmMsIDB4MDBlOSwgMHgwMGUyLAorCTB4MDBlNCwgMHgwMTZmLCAweDAxMDcsIDB4MDBlNywKKwkweDAxNDIsIDB4MDBlYiwgMHgwMTUwLCAweDAxNTEsCisJMHgwMGVlLCAweDAxNzksIDB4MDBjNCwgMHgwMTA2LAorCS8qIDB4OTAqLworCTB4MDBjOSwgMHgwMTM5LCAweDAxM2EsIDB4MDBmNCwKKwkweDAwZjYsIDB4MDEzZCwgMHgwMTNlLCAweDAxNWEsCisJMHgwMTViLCAweDAwZDYsIDB4MDBkYywgMHgwMTY0LAorCTB4MDE2NSwgMHgwMTQxLCAweDAwZDcsIDB4MDEwZCwKKwkvKiAweGEwKi8KKwkweDAwZTEsIDB4MDBlZCwgMHgwMGYzLCAweDAwZmEsCisJMHgwMTA0LCAweDAxMDUsIDB4MDE3ZCwgMHgwMTdlLAorCTB4MDExOCwgMHgwMTE5LCAweDAwYWMsIDB4MDE3YSwKKwkweDAxMGMsIDB4MDE1ZiwgMHgwMGFiLCAweDAwYmIsCisJLyogMHhiMCovCisJMHgyNTkxLCAweDI1OTIsIDB4MjU5MywgMHgyNTAyLAorCTB4MjUyNCwgMHgwMGMxLCAweDAwYzIsIDB4MDExYSwKKwkweDAxNWUsIDB4MjU2MywgMHgyNTUxLCAweDI1NTcsCisJMHgyNTVkLCAweDAxN2IsIDB4MDE3YywgMHgyNTEwLAorCS8qIDB4YzAqLworCTB4MjUxNCwgMHgyNTM0LCAweDI1MmMsIDB4MjUxYywKKwkweDI1MDAsIDB4MjUzYywgMHgwMTAyLCAweDAxMDMsCisJMHgyNTVhLCAweDI1NTQsIDB4MjU2OSwgMHgyNTY2LAorCTB4MjU2MCwgMHgyNTUwLCAweDI1NmMsIDB4MDBhNCwKKwkvKiAweGQwKi8KKwkweDAxMTEsIDB4MDExMCwgMHgwMTBlLCAweDAwY2IsCisJMHgwMTBmLCAweDAxNDcsIDB4MDBjZCwgMHgwMGNlLAorCTB4MDExYiwgMHgyNTE4LCAweDI1MGMsIDB4MjU4OCwKKwkweDI1ODQsIDB4MDE2MiwgMHgwMTZlLCAweDI1ODAsCisJLyogMHhlMCovCisJMHgwMGQzLCAweDAwZGYsIDB4MDBkNCwgMHgwMTQzLAorCTB4MDE0NCwgMHgwMTQ4LCAweDAxNjAsIDB4MDE2MSwKKwkweDAxNTQsIDB4MDBkYSwgMHgwMTU1LCAweDAxNzAsCisJMHgwMGZkLCAweDAwZGQsIDB4MDE2MywgMHgwMGI0LAorCS8qIDB4ZjAqLworCTB4MDBhZCwgMHgwMmRkLCAweDAyZGIsIDB4MDJjNywKKwkweDAyZDgsIDB4MDBhNywgMHgwMGY3LCAweDAwYjgsCisJMHgwMGIwLCAweDAwYTgsIDB4MDJkOSwgMHgwMTcxLAorCTB4MDE1OCwgMHgwMTU5LCAweDI1YTAsIDB4MDBhMCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMFsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjZiwgMHgwMCwgMHgwMCwgMHhmNSwgLyogMHhhMC0weGE3ICovCisJMHhmOSwgMHgwMCwgMHgwMCwgMHhhZSwgMHhhYSwgMHhmMCwgMHgwMCwgMHgwMCwgLyogMHhhOC0weGFmICovCisJMHhmOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhlZiwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhiMC0weGI3ICovCisJMHhmNywgMHgwMCwgMHgwMCwgMHhhZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhiOC0weGJmICovCisJMHgwMCwgMHhiNSwgMHhiNiwgMHgwMCwgMHg4ZSwgMHgwMCwgMHgwMCwgMHg4MCwgLyogMHhjMC0weGM3ICovCisJMHgwMCwgMHg5MCwgMHgwMCwgMHhkMywgMHgwMCwgMHhkNiwgMHhkNywgMHgwMCwgLyogMHhjOC0weGNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhlMCwgMHhlMiwgMHgwMCwgMHg5OSwgMHg5ZSwgLyogMHhkMC0weGQ3ICovCisJMHgwMCwgMHgwMCwgMHhlOSwgMHgwMCwgMHg5YSwgMHhlZCwgMHgwMCwgMHhlMSwgLyogMHhkOC0weGRmICovCisJMHgwMCwgMHhhMCwgMHg4MywgMHgwMCwgMHg4NCwgMHgwMCwgMHgwMCwgMHg4NywgLyogMHhlMC0weGU3ICovCisJMHgwMCwgMHg4MiwgMHgwMCwgMHg4OSwgMHgwMCwgMHhhMSwgMHg4YywgMHgwMCwgLyogMHhlOC0weGVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhhMiwgMHg5MywgMHgwMCwgMHg5NCwgMHhmNiwgLyogMHhmMC0weGY3ICovCisJMHgwMCwgMHgwMCwgMHhhMywgMHgwMCwgMHg4MSwgMHhlYywgMHgwMCwgMHgwMCwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDFbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweGM2LCAweGM3LCAweGE0LCAweGE1LCAweDhmLCAweDg2LCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGFjLCAweDlmLCAweGQyLCAweGQ0LCAvKiAweDA4LTB4MGYgKi8KKwkweGQxLCAweGQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweGE4LCAweGE5LCAweGI3LCAweGQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDkxLCAweDkyLCAweDAwLCAweDAwLCAweDk1LCAweDk2LCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDlkLCAweDg4LCAweGUzLCAweGU0LCAweDAwLCAweDAwLCAweGQ1LCAvKiAweDQwLTB4NDcgKi8KKwkweGU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDhhLCAweDhiLCAweDAwLCAweDAwLCAweGU4LCAweGVhLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweGZjLCAweGZkLCAweDk3LCAweDk4LCAweDAwLCAweDAwLCAweGI4LCAweGFkLCAvKiAweDU4LTB4NWYgKi8KKwkweGU2LCAweGU3LCAweGRkLCAweGVlLCAweDliLCAweDljLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGRlLCAweDg1LCAvKiAweDY4LTB4NmYgKi8KKwkweGViLCAweGZiLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDhkLCAweGFiLCAweGJkLCAweGJlLCAweGE2LCAweGE3LCAweDAwLCAvKiAweDc4LTB4N2YgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMlsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhMC0weGE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhOC0weGFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhiMC0weGI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhiOC0weGJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmMywgLyogMHhjMC0weGM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhjOC0weGNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhkMC0weGQ3ICovCisJMHhmNCwgMHhmYSwgMHgwMCwgMHhmMiwgMHgwMCwgMHhmMSwgMHgwMCwgMHgwMCwgLyogMHhkOC0weGRmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjVbMjU2XSA9IHsKKwkweGM0LCAweDAwLCAweGIzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGRhLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweGJmLCAweDAwLCAweDAwLCAweDAwLCAweGMwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweGQ5LCAweDAwLCAweDAwLCAweDAwLCAweGMzLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGI0LCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGMyLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGMxLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGM1LCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweGNkLCAweGJhLCAweDAwLCAweDAwLCAweGM5LCAweDAwLCAweDAwLCAweGJiLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweGM4LCAweDAwLCAweDAwLCAweGJjLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweGNjLCAweDAwLCAweDAwLCAweGI5LCAweDAwLCAweDAwLCAweGNiLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweGNhLCAweDAwLCAweDAwLCAweGNlLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ZGYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZGMsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4ZGIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4YjAsIDB4YjEsIDB4YjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4ZmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnBhZ2VfdW5pMmNoYXJzZXRbMjU2XSA9IHsKKwlwYWdlMDAsIHBhZ2UwMSwgcGFnZTAyLCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIHBhZ2UyNSwgTlVMTCwgICBOVUxMLCAgIAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJsb3dlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NDAtMHg0NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NTAtMHg1NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4NywgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YiwgMHg4YiwgMHg4YywgMHhhYiwgMHg4NCwgMHg4NiwgLyogMHg4OC0weDhmICovCisJMHg4MiwgMHg5MiwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NiwgMHg5NiwgMHg5OCwgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5NCwgMHg4MSwgMHg5YywgMHg5YywgMHg4OCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNSwgMHhhNSwgMHhhNywgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOSwgMHhhOSwgMHhhYSwgMHhhYiwgMHg5ZiwgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhhMCwgMHg4MywgMHhkOCwgLyogMHhiMC0weGI3ICovCisJMHhhZCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZSwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNywgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMCwgMHhkNCwgMHg4OSwgMHhkNCwgMHhlNSwgMHhhMSwgMHg4YywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhlZSwgMHg4NSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhhMiwgMHhlMSwgMHg5MywgMHhlNCwgMHhlNCwgMHhlNSwgMHhlNywgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlYSwgMHhhMywgMHhlYSwgMHhmYiwgMHhlYywgMHhlYywgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmZCwgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0MnVwcGVyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg2MC0weDY3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg2OC0weDZmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg3MC0weDc3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDlhLCAweDkwLCAweGI2LCAweDhlLCAweGRlLCAweDhmLCAweDgwLCAvKiAweDgwLTB4ODcgKi8KKwkweDlkLCAweGQzLCAweDhhLCAweDhhLCAweGQ3LCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkxLCAweGUyLCAweDk5LCAweDk1LCAweDk1LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk3LCAweDk5LCAweDlhLCAweDliLCAweDliLCAweDlkLCAweDllLCAweGFjLCAvKiAweDk4LTB4OWYgKi8KKwkweGI1LCAweGQ2LCAweGUwLCAweGU5LCAweGE0LCAweGE0LCAweGE2LCAweGE2LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE4LCAweGFhLCAweDhkLCAweGFjLCAweGI4LCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJkLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM2LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGQxLCAweGQxLCAweGQyLCAweGQzLCAweGQyLCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGI3LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGUzLCAweGQ1LCAweGU2LCAweGU2LCAvKiAweGUwLTB4ZTcgKi8KKwkweGU4LCAweGU5LCAweGU4LCAweGViLCAweGVkLCAweGVkLCAweGRkLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGViLCAweGZjLCAweGZjLCAweGZlLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyBpbnQgdW5pMmNoYXIod2NoYXJfdCB1bmksIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50IGJvdW5kbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnVuaTJjaGFyc2V0OworCXVuc2lnbmVkIGNoYXIgY2wgPSB1bmkgJiAweDAwZmY7CisJdW5zaWduZWQgY2hhciBjaCA9ICh1bmkgJiAweGZmMDApID4+IDg7CisKKwlpZiAoYm91bmRsZW4gPD0gMCkKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwl1bmkyY2hhcnNldCA9IHBhZ2VfdW5pMmNoYXJzZXRbY2hdOworCWlmICh1bmkyY2hhcnNldCAmJiB1bmkyY2hhcnNldFtjbF0pCisJCW91dFswXSA9IHVuaTJjaGFyc2V0W2NsXTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNoYXIydW5pKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJhd3N0cmluZywgaW50IGJvdW5kbGVuLCB3Y2hhcl90ICp1bmkpCit7CisJKnVuaSA9IGNoYXJzZXQydW5pWypyYXdzdHJpbmddOworCWlmICgqdW5pID09IDB4MDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmxzX3RhYmxlIHRhYmxlID0geworCS5jaGFyc2V0CT0gImNwODUyIiwKKwkudW5pMmNoYXIJPSB1bmkyY2hhciwKKwkuY2hhcjJ1bmkJPSBjaGFyMnVuaSwKKwkuY2hhcnNldDJsb3dlcgk9IGNoYXJzZXQybG93ZXIsCisJLmNoYXJzZXQydXBwZXIJPSBjaGFyc2V0MnVwcGVyLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmxzX2NwODUyKHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX25scygmdGFibGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9ubHNfY3A4NTIodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25scygmdGFibGUpOworfQorCittb2R1bGVfaW5pdChpbml0X25sc19jcDg1MikKK21vZHVsZV9leGl0KGV4aXRfbmxzX2NwODUyKQorCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CmRpZmYgLS1naXQgYS9mcy9ubHMvbmxzX2NwODU1LmMgYi9mcy9ubHMvbmxzX2NwODU1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg2NDFiNwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25scy9ubHNfY3A4NTUuYwpAQCAtMCwwICsxLDMwMCBAQAorLyoKKyAqIGxpbnV4L2ZzL25sc19jcDg1NS5jCisgKgorICogQ2hhcnNldCBjcDg1NSB0cmFuc2xhdGlvbiB0YWJsZXMuCisgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBVbmljb2RlIGFuZCBjaGFyc2V0CisgKiB0YWJsZXMgZnJvbSB0aGUgVW5pY29kZSBPcmdhbml6YXRpb24gKHd3dy51bmljb2RlLm9yZykuCisgKiBUaGUgVW5pY29kZSB0byBjaGFyc2V0IHRhYmxlIGhhcyBvbmx5IGV4YWN0IG1hcHBpbmdzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCitzdGF0aWMgd2NoYXJfdCBjaGFyc2V0MnVuaVsyNTZdID0geworCS8qIDB4MDAqLworCTB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywKKwkweDAwMDQsIDB4MDAwNSwgMHgwMDA2LCAweDAwMDcsCisJMHgwMDA4LCAweDAwMDksIDB4MDAwYSwgMHgwMDBiLAorCTB4MDAwYywgMHgwMDBkLCAweDAwMGUsIDB4MDAwZiwKKwkvKiAweDEwKi8KKwkweDAwMTAsIDB4MDAxMSwgMHgwMDEyLCAweDAwMTMsCisJMHgwMDE0LCAweDAwMTUsIDB4MDAxNiwgMHgwMDE3LAorCTB4MDAxOCwgMHgwMDE5LCAweDAwMWEsIDB4MDAxYiwKKwkweDAwMWMsIDB4MDAxZCwgMHgwMDFlLCAweDAwMWYsCisJLyogMHgyMCovCisJMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLAorCTB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKwkweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsCisJMHgwMDJjLCAweDAwMmQsIDB4MDAyZSwgMHgwMDJmLAorCS8qIDB4MzAqLworCTB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywKKwkweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisJMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLAorCTB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKwkvKiAweDQwKi8KKwkweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsCisJMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAorCTB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwKKwkweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsCisJLyogMHg1MCovCisJMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLAorCTB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKwkweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsCisJMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLAorCS8qIDB4NjAqLworCTB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywKKwkweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisJMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLAorCTB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKKwkvKiAweDcwKi8KKwkweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsCisJMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LAorCTB4MDA3OCwgMHgwMDc5LCAweDAwN2EsIDB4MDA3YiwKKwkweDAwN2MsIDB4MDA3ZCwgMHgwMDdlLCAweDAwN2YsCisJLyogMHg4MCovCisJMHgwNDUyLCAweDA0MDIsIDB4MDQ1MywgMHgwNDAzLAorCTB4MDQ1MSwgMHgwNDAxLCAweDA0NTQsIDB4MDQwNCwKKwkweDA0NTUsIDB4MDQwNSwgMHgwNDU2LCAweDA0MDYsCisJMHgwNDU3LCAweDA0MDcsIDB4MDQ1OCwgMHgwNDA4LAorCS8qIDB4OTAqLworCTB4MDQ1OSwgMHgwNDA5LCAweDA0NWEsIDB4MDQwYSwKKwkweDA0NWIsIDB4MDQwYiwgMHgwNDVjLCAweDA0MGMsCisJMHgwNDVlLCAweDA0MGUsIDB4MDQ1ZiwgMHgwNDBmLAorCTB4MDQ0ZSwgMHgwNDJlLCAweDA0NGEsIDB4MDQyYSwKKwkvKiAweGEwKi8KKwkweDA0MzAsIDB4MDQxMCwgMHgwNDMxLCAweDA0MTEsCisJMHgwNDQ2LCAweDA0MjYsIDB4MDQzNCwgMHgwNDE0LAorCTB4MDQzNSwgMHgwNDE1LCAweDA0NDQsIDB4MDQyNCwKKwkweDA0MzMsIDB4MDQxMywgMHgwMGFiLCAweDAwYmIsCisJLyogMHhiMCovCisJMHgyNTkxLCAweDI1OTIsIDB4MjU5MywgMHgyNTAyLAorCTB4MjUyNCwgMHgwNDQ1LCAweDA0MjUsIDB4MDQzOCwKKwkweDA0MTgsIDB4MjU2MywgMHgyNTUxLCAweDI1NTcsCisJMHgyNTVkLCAweDA0MzksIDB4MDQxOSwgMHgyNTEwLAorCS8qIDB4YzAqLworCTB4MjUxNCwgMHgyNTM0LCAweDI1MmMsIDB4MjUxYywKKwkweDI1MDAsIDB4MjUzYywgMHgwNDNhLCAweDA0MWEsCisJMHgyNTVhLCAweDI1NTQsIDB4MjU2OSwgMHgyNTY2LAorCTB4MjU2MCwgMHgyNTUwLCAweDI1NmMsIDB4MDBhNCwKKwkvKiAweGQwKi8KKwkweDA0M2IsIDB4MDQxYiwgMHgwNDNjLCAweDA0MWMsCisJMHgwNDNkLCAweDA0MWQsIDB4MDQzZSwgMHgwNDFlLAorCTB4MDQzZiwgMHgyNTE4LCAweDI1MGMsIDB4MjU4OCwKKwkweDI1ODQsIDB4MDQxZiwgMHgwNDRmLCAweDI1ODAsCisJLyogMHhlMCovCisJMHgwNDJmLCAweDA0NDAsIDB4MDQyMCwgMHgwNDQxLAorCTB4MDQyMSwgMHgwNDQyLCAweDA0MjIsIDB4MDQ0MywKKwkweDA0MjMsIDB4MDQzNiwgMHgwNDE2LCAweDA0MzIsCisJMHgwNDEyLCAweDA0NGMsIDB4MDQyYywgMHgyMTE2LAorCS8qIDB4ZjAqLworCTB4MDBhZCwgMHgwNDRiLCAweDA0MmIsIDB4MDQzNywKKwkweDA0MTcsIDB4MDQ0OCwgMHgwNDI4LCAweDA0NGQsCisJMHgwNDJkLCAweDA0NDksIDB4MDQyOSwgMHgwNDQ3LAorCTB4MDQyNywgMHgwMGE3LCAweDI1YTAsIDB4MDBhMCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMFsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjZiwgMHgwMCwgMHgwMCwgMHhmZCwgLyogMHhhMC0weGE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhhZSwgMHgwMCwgMHhmMCwgMHgwMCwgMHgwMCwgLyogMHhhOC0weGFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhiMC0weGI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhhZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhiOC0weGJmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDRbMjU2XSA9IHsKKwkweDAwLCAweDg1LCAweDgxLCAweDgzLCAweDg3LCAweDg5LCAweDhiLCAweDhkLCAvKiAweDAwLTB4MDcgKi8KKwkweDhmLCAweDkxLCAweDkzLCAweDk1LCAweDk3LCAweDAwLCAweDk5LCAweDliLCAvKiAweDA4LTB4MGYgKi8KKwkweGExLCAweGEzLCAweGVjLCAweGFkLCAweGE3LCAweGE5LCAweGVhLCAweGY0LCAvKiAweDEwLTB4MTcgKi8KKwkweGI4LCAweGJlLCAweGM3LCAweGQxLCAweGQzLCAweGQ1LCAweGQ3LCAweGRkLCAvKiAweDE4LTB4MWYgKi8KKwkweGUyLCAweGU0LCAweGU2LCAweGU4LCAweGFiLCAweGI2LCAweGE1LCAweGZjLCAvKiAweDIwLTB4MjcgKi8KKwkweGY2LCAweGZhLCAweDlmLCAweGYyLCAweGVlLCAweGY4LCAweDlkLCAweGUwLCAvKiAweDI4LTB4MmYgKi8KKwkweGEwLCAweGEyLCAweGViLCAweGFjLCAweGE2LCAweGE4LCAweGU5LCAweGYzLCAvKiAweDMwLTB4MzcgKi8KKwkweGI3LCAweGJkLCAweGM2LCAweGQwLCAweGQyLCAweGQ0LCAweGQ2LCAweGQ4LCAvKiAweDM4LTB4M2YgKi8KKwkweGUxLCAweGUzLCAweGU1LCAweGU3LCAweGFhLCAweGI1LCAweGE0LCAweGZiLCAvKiAweDQwLTB4NDcgKi8KKwkweGY1LCAweGY5LCAweDllLCAweGYxLCAweGVkLCAweGY3LCAweDljLCAweGRlLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDg0LCAweDgwLCAweDgyLCAweDg2LCAweDg4LCAweDhhLCAweDhjLCAvKiAweDUwLTB4NTcgKi8KKwkweDhlLCAweDkwLCAweDkyLCAweDk0LCAweDk2LCAweDAwLCAweDk4LCAweDlhLCAvKiAweDU4LTB4NWYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyMVsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZWYsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTI1WzI1Nl0gPSB7CisJMHhjNCwgMHgwMCwgMHhiMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkYSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHhiZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHhkOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMywgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiNCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMiwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjNSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHhjZCwgMHhiYSwgMHgwMCwgMHgwMCwgMHhjOSwgMHgwMCwgMHgwMCwgMHhiYiwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhjOCwgMHgwMCwgMHgwMCwgMHhiYywgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHhjYywgMHgwMCwgMHgwMCwgMHhiOSwgMHgwMCwgMHgwMCwgMHhjYiwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHhjYSwgMHgwMCwgMHgwMCwgMHhjZSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweGRmLCAweDAwLCAweDAwLCAweDAwLCAweGRjLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweGRiLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweGIwLCAweGIxLCAweGIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweGZlLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwYWdlX3VuaTJjaGFyc2V0WzI1Nl0gPSB7CisJcGFnZTAwLCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBwYWdlMDQsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgcGFnZTIxLCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBwYWdlMjUsIE5VTEwsICAgTlVMTCwgICAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQybG93ZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDQwLTB4NDcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDUwLTB4NTcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODAsIDB4ODIsIDB4ODIsIDB4ODQsIDB4ODQsIDB4ODYsIDB4ODYsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODgsIDB4OGEsIDB4OGEsIDB4OGMsIDB4OGMsIDB4OGUsIDB4OGUsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTAsIDB4OTIsIDB4OTIsIDB4OTQsIDB4OTQsIDB4OTYsIDB4OTYsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTgsIDB4OWEsIDB4OWEsIDB4OWMsIDB4OWMsIDB4OWUsIDB4OWUsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTAsIDB4YTIsIDB4YTIsIDB4YTQsIDB4YTQsIDB4YTYsIDB4YTYsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTgsIDB4YWEsIDB4YWEsIDB4YWMsIDB4YWMsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjUsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjcsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmQsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzYsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDAsIDB4ZDIsIDB4ZDIsIDB4ZDQsIDB4ZDQsIDB4ZDYsIDB4ZDYsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZDgsIDB4ZGUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZGUsIDB4ZTEsIDB4ZTEsIDB4ZTMsIDB4ZTMsIDB4ZTUsIDB4ZTUsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTcsIDB4ZTksIDB4ZTksIDB4ZWIsIDB4ZWIsIDB4ZWQsIDB4ZWQsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjEsIDB4ZjMsIDB4ZjMsIDB4ZjUsIDB4ZjUsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjcsIDB4ZjksIDB4ZjksIDB4ZmIsIDB4ZmIsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJ1cHBlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NjAtMHg2NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NzAtMHg3NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MSwgMHg4MSwgMHg4MywgMHg4MywgMHg4NSwgMHg4NSwgMHg4NywgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OSwgMHg4OSwgMHg4YiwgMHg4YiwgMHg4ZCwgMHg4ZCwgMHg4ZiwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MSwgMHg5MSwgMHg5MywgMHg5MywgMHg5NSwgMHg5NSwgMHg5NywgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OSwgMHg5OSwgMHg5YiwgMHg5YiwgMHg5ZCwgMHg5ZCwgMHg5ZiwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMSwgMHhhMSwgMHhhMywgMHhhMywgMHhhNSwgMHhhNSwgMHhhNywgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOSwgMHhhOSwgMHhhYiwgMHhhYiwgMHhhZCwgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNiwgMHhiNiwgMHhiOCwgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZSwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNywgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMSwgMHhkMSwgMHhkMywgMHhkMywgMHhkNSwgMHhkNSwgMHhkNywgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkZCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhlMCwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMiwgMHhlMiwgMHhlNCwgMHhlNCwgMHhlNiwgMHhlNiwgMHhlOCwgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlYSwgMHhlYSwgMHhlYywgMHhlYywgMHhlZSwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMiwgMHhmMiwgMHhmNCwgMHhmNCwgMHhmNiwgMHhmNiwgMHhmOCwgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmYSwgMHhmYSwgMHhmYywgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgaW50IHVuaTJjaGFyKHdjaGFyX3QgdW5pLCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCBib3VuZGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICp1bmkyY2hhcnNldDsKKwl1bnNpZ25lZCBjaGFyIGNsID0gdW5pICYgMHgwMGZmOworCXVuc2lnbmVkIGNoYXIgY2ggPSAodW5pICYgMHhmZjAwKSA+PiA4OworCisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJdW5pMmNoYXJzZXQgPSBwYWdlX3VuaTJjaGFyc2V0W2NoXTsKKwlpZiAodW5pMmNoYXJzZXQgJiYgdW5pMmNoYXJzZXRbY2xdKQorCQlvdXRbMF0gPSB1bmkyY2hhcnNldFtjbF07CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGFyMnVuaShjb25zdCB1bnNpZ25lZCBjaGFyICpyYXdzdHJpbmcsIGludCBib3VuZGxlbiwgd2NoYXJfdCAqdW5pKQoreworCSp1bmkgPSBjaGFyc2V0MnVuaVsqcmF3c3RyaW5nXTsKKwlpZiAoKnVuaSA9PSAweDAwMDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSB0YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJjcDg1NSIsCisJLnVuaTJjaGFyCT0gdW5pMmNoYXIsCisJLmNoYXIydW5pCT0gY2hhcjJ1bmksCisJLmNoYXJzZXQybG93ZXIJPSBjaGFyc2V0Mmxvd2VyLAorCS5jaGFyc2V0MnVwcGVyCT0gY2hhcnNldDJ1cHBlciwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X25sc19jcDg1NSh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmxzX2NwODU1KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ubHNfY3A4NTUpCittb2R1bGVfZXhpdChleGl0X25sc19jcDg1NSkKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvbmxzL25sc19jcDg1Ny5jIGIvZnMvbmxzL25sc19jcDg1Ny5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYTU4OWUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ubHMvbmxzX2NwODU3LmMKQEAgLTAsMCArMSwzMDIgQEAKKy8qCisgKiBsaW51eC9mcy9ubHNfY3A4NTcuYworICoKKyAqIENoYXJzZXQgY3A4NTcgdHJhbnNsYXRpb24gdGFibGVzLgorICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgVW5pY29kZSBhbmQgY2hhcnNldAorICogdGFibGVzIGZyb20gdGhlIFVuaWNvZGUgT3JnYW5pemF0aW9uICh3d3cudW5pY29kZS5vcmcpLgorICogVGhlIFVuaWNvZGUgdG8gY2hhcnNldCB0YWJsZSBoYXMgb25seSBleGFjdCBtYXBwaW5ncy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworc3RhdGljIHdjaGFyX3QgY2hhcnNldDJ1bmlbMjU2XSA9IHsKKwkvKiAweDAwKi8KKwkweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsCisJMHgwMDA0LCAweDAwMDUsIDB4MDAwNiwgMHgwMDA3LAorCTB4MDAwOCwgMHgwMDA5LCAweDAwMGEsIDB4MDAwYiwKKwkweDAwMGMsIDB4MDAwZCwgMHgwMDBlLCAweDAwMGYsCisJLyogMHgxMCovCisJMHgwMDEwLCAweDAwMTEsIDB4MDAxMiwgMHgwMDEzLAorCTB4MDAxNCwgMHgwMDE1LCAweDAwMTYsIDB4MDAxNywKKwkweDAwMTgsIDB4MDAxOSwgMHgwMDFhLCAweDAwMWIsCisJMHgwMDFjLCAweDAwMWQsIDB4MDAxZSwgMHgwMDFmLAorCS8qIDB4MjAqLworCTB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywKKwkweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisJMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLAorCTB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKwkvKiAweDMwKi8KKwkweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsCisJMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAorCTB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwKKwkweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsCisJLyogMHg0MCovCisJMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLAorCTB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKwkweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsCisJMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLAorCS8qIDB4NTAqLworCTB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywKKwkweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisJMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMDViLAorCTB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwKKwkvKiAweDYwKi8KKwkweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsCisJMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LAorCTB4MDA2OCwgMHgwMDY5LCAweDAwNmEsIDB4MDA2YiwKKwkweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsCisJLyogMHg3MCovCisJMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLAorCTB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKwkweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsCisJMHgwMDdjLCAweDAwN2QsIDB4MDA3ZSwgMHgwMDdmLAorCS8qIDB4ODAqLworCTB4MDBjNywgMHgwMGZjLCAweDAwZTksIDB4MDBlMiwKKwkweDAwZTQsIDB4MDBlMCwgMHgwMGU1LCAweDAwZTcsCisJMHgwMGVhLCAweDAwZWIsIDB4MDBlOCwgMHgwMGVmLAorCTB4MDBlZSwgMHgwMTMxLCAweDAwYzQsIDB4MDBjNSwKKwkvKiAweDkwKi8KKwkweDAwYzksIDB4MDBlNiwgMHgwMGM2LCAweDAwZjQsCisJMHgwMGY2LCAweDAwZjIsIDB4MDBmYiwgMHgwMGY5LAorCTB4MDEzMCwgMHgwMGQ2LCAweDAwZGMsIDB4MDBmOCwKKwkweDAwYTMsIDB4MDBkOCwgMHgwMTVlLCAweDAxNWYsCisJLyogMHhhMCovCisJMHgwMGUxLCAweDAwZWQsIDB4MDBmMywgMHgwMGZhLAorCTB4MDBmMSwgMHgwMGQxLCAweDAxMWUsIDB4MDExZiwKKwkweDAwYmYsIDB4MDBhZSwgMHgwMGFjLCAweDAwYmQsCisJMHgwMGJjLCAweDAwYTEsIDB4MDBhYiwgMHgwMGJiLAorCS8qIDB4YjAqLworCTB4MjU5MSwgMHgyNTkyLCAweDI1OTMsIDB4MjUwMiwKKwkweDI1MjQsIDB4MDBjMSwgMHgwMGMyLCAweDAwYzAsCisJMHgwMGE5LCAweDI1NjMsIDB4MjU1MSwgMHgyNTU3LAorCTB4MjU1ZCwgMHgwMGEyLCAweDAwYTUsIDB4MjUxMCwKKwkvKiAweGMwKi8KKwkweDI1MTQsIDB4MjUzNCwgMHgyNTJjLCAweDI1MWMsCisJMHgyNTAwLCAweDI1M2MsIDB4MDBlMywgMHgwMGMzLAorCTB4MjU1YSwgMHgyNTU0LCAweDI1NjksIDB4MjU2NiwKKwkweDI1NjAsIDB4MjU1MCwgMHgyNTZjLCAweDAwYTQsCisJLyogMHhkMCovCisJMHgwMGJhLCAweDAwYWEsIDB4MDBjYSwgMHgwMGNiLAorCTB4MDBjOCwgMHgwMDAwLCAweDAwY2QsIDB4MDBjZSwKKwkweDAwY2YsIDB4MjUxOCwgMHgyNTBjLCAweDI1ODgsCisJMHgyNTg0LCAweDAwYTYsIDB4MDBjYywgMHgyNTgwLAorCS8qIDB4ZTAqLworCTB4MDBkMywgMHgwMGRmLCAweDAwZDQsIDB4MDBkMiwKKwkweDAwZjUsIDB4MDBkNSwgMHgwMGI1LCAweDAwMDAsCisJMHgwMGQ3LCAweDAwZGEsIDB4MDBkYiwgMHgwMGQ5LAorCTB4MDBlYywgMHgwMGZmLCAweDAwYWYsIDB4MDBiNCwKKwkvKiAweGYwKi8KKwkweDAwYWQsIDB4MDBiMSwgMHgwMDAwLCAweDAwYmUsCisJMHgwMGI2LCAweDAwYTcsIDB4MDBmNywgMHgwMGI4LAorCTB4MDBiMCwgMHgwMGE4LCAweDAwYjcsIDB4MDBiOSwKKwkweDAwYjMsIDB4MDBiMiwgMHgyNWEwLCAweDAwYTAsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDBbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4ZmYsIDB4YWQsIDB4YmQsIDB4OWMsIDB4Y2YsIDB4YmUsIDB4ZGQsIDB4ZjUsIC8qIDB4YTAtMHhhNyAqLworCTB4ZjksIDB4YjgsIDB4ZDEsIDB4YWUsIDB4YWEsIDB4ZjAsIDB4YTksIDB4ZWUsIC8qIDB4YTgtMHhhZiAqLworCTB4ZjgsIDB4ZjEsIDB4ZmQsIDB4ZmMsIDB4ZWYsIDB4ZTYsIDB4ZjQsIDB4ZmEsIC8qIDB4YjAtMHhiNyAqLworCTB4ZjcsIDB4ZmIsIDB4ZDAsIDB4YWYsIDB4YWMsIDB4YWIsIDB4ZjMsIDB4YTgsIC8qIDB4YjgtMHhiZiAqLworCTB4YjcsIDB4YjUsIDB4YjYsIDB4YzcsIDB4OGUsIDB4OGYsIDB4OTIsIDB4ODAsIC8qIDB4YzAtMHhjNyAqLworCTB4ZDQsIDB4OTAsIDB4ZDIsIDB4ZDMsIDB4ZGUsIDB4ZDYsIDB4ZDcsIDB4ZDgsIC8qIDB4YzgtMHhjZiAqLworCTB4MDAsIDB4YTUsIDB4ZTMsIDB4ZTAsIDB4ZTIsIDB4ZTUsIDB4OTksIDB4ZTgsIC8qIDB4ZDAtMHhkNyAqLworCTB4OWQsIDB4ZWIsIDB4ZTksIDB4ZWEsIDB4OWEsIDB4MDAsIDB4MDAsIDB4ZTEsIC8qIDB4ZDgtMHhkZiAqLworCTB4ODUsIDB4YTAsIDB4ODMsIDB4YzYsIDB4ODQsIDB4ODYsIDB4OTEsIDB4ODcsIC8qIDB4ZTAtMHhlNyAqLworCTB4OGEsIDB4ODIsIDB4ODgsIDB4ODksIDB4ZWMsIDB4YTEsIDB4OGMsIDB4OGIsIC8qIDB4ZTgtMHhlZiAqLworCTB4MDAsIDB4YTQsIDB4OTUsIDB4YTIsIDB4OTMsIDB4ZTQsIDB4OTQsIDB4ZjYsIC8qIDB4ZjAtMHhmNyAqLworCTB4OWIsIDB4OTcsIDB4YTMsIDB4OTYsIDB4ODEsIDB4MDAsIDB4MDAsIDB4ZWQsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAxWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhNiwgMHhhNywgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHg5OCwgMHg4ZCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5ZSwgMHg5ZiwgLyogMHg1OC0weDVmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjVbMjU2XSA9IHsKKwkweGM0LCAweDAwLCAweGIzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGRhLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweGJmLCAweDAwLCAweDAwLCAweDAwLCAweGMwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweGQ5LCAweDAwLCAweDAwLCAweDAwLCAweGMzLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGI0LCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGMyLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGMxLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGM1LCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweGNkLCAweGJhLCAweDAwLCAweDAwLCAweGM5LCAweDAwLCAweDAwLCAweGJiLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweGM4LCAweDAwLCAweDAwLCAweGJjLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweGNjLCAweDAwLCAweDAwLCAweGI5LCAweDAwLCAweDAwLCAweGNiLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweGNhLCAweDAwLCAweDAwLCAweGNlLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ZGYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZGMsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4ZGIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4YjAsIDB4YjEsIDB4YjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4ZmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnBhZ2VfdW5pMmNoYXJzZXRbMjU2XSA9IHsKKwlwYWdlMDAsIHBhZ2UwMSwgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIHBhZ2UyNSwgTlVMTCwgICBOVUxMLCAgIAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJsb3dlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NDAtMHg0NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NTAtMHg1NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4NywgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4NCwgMHg4NiwgLyogMHg4OC0weDhmICovCisJMHg4MiwgMHg5MSwgMHg5MSwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg2OSwgMHg5NCwgMHg4MSwgMHg5YiwgMHg5YywgMHg5YiwgMHg5ZiwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNCwgMHhhNywgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhhMCwgMHg4MywgMHg4NSwgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNiwgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHg4OCwgMHg4OSwgMHg4YSwgMHgwMCwgMHhhMSwgMHg4YywgLyogMHhkMC0weGQ3ICovCisJMHg4YiwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhlYywgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhhMiwgMHhlMSwgMHg5MywgMHg5NSwgMHhlNCwgMHhlNCwgMHhlNiwgMHgwMCwgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhhMywgMHg5NiwgMHg5NywgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHgwMCwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0MnVwcGVyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg2MC0weDY3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg2OC0weDZmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg3MC0weDc3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDlhLCAweDkwLCAweGI2LCAweDhlLCAweGI3LCAweDhmLCAweDgwLCAvKiAweDgwLTB4ODcgKi8KKwkweGQyLCAweGQzLCAweGQ0LCAweGQ4LCAweGQ3LCAweDQ5LCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkyLCAweDkyLCAweGUyLCAweDk5LCAweGUzLCAweGVhLCAweGViLCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDlkLCAweDljLCAweDlkLCAweDllLCAweDllLCAvKiAweDk4LTB4OWYgKi8KKwkweGI1LCAweGQ2LCAweGUwLCAweGU5LCAweGE1LCAweGE1LCAweGE2LCAweGE2LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM3LCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweDAwLCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU1LCAweGU1LCAweDAwLCAweDAwLCAvKiAweGUwLTB4ZTcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGRlLCAweDAwLCAweGVlLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYxLCAweDAwLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyBpbnQgdW5pMmNoYXIod2NoYXJfdCB1bmksIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50IGJvdW5kbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnVuaTJjaGFyc2V0OworCXVuc2lnbmVkIGNoYXIgY2wgPSB1bmkgJiAweDAwZmY7CisJdW5zaWduZWQgY2hhciBjaCA9ICh1bmkgJiAweGZmMDApID4+IDg7CisKKwlpZiAoYm91bmRsZW4gPD0gMCkKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwl1bmkyY2hhcnNldCA9IHBhZ2VfdW5pMmNoYXJzZXRbY2hdOworCWlmICh1bmkyY2hhcnNldCAmJiB1bmkyY2hhcnNldFtjbF0pCisJCW91dFswXSA9IHVuaTJjaGFyc2V0W2NsXTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNoYXIydW5pKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJhd3N0cmluZywgaW50IGJvdW5kbGVuLCB3Y2hhcl90ICp1bmkpCit7CisJKnVuaSA9IGNoYXJzZXQydW5pWypyYXdzdHJpbmddOworCWlmICgqdW5pID09IDB4MDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmxzX3RhYmxlIHRhYmxlID0geworCS5jaGFyc2V0CT0gImNwODU3IiwKKwkudW5pMmNoYXIJPSB1bmkyY2hhciwKKwkuY2hhcjJ1bmkJPSBjaGFyMnVuaSwKKwkuY2hhcnNldDJsb3dlcgk9IGNoYXJzZXQybG93ZXIsCisJLmNoYXJzZXQydXBwZXIJPSBjaGFyc2V0MnVwcGVyLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmxzX2NwODU3KHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX25scygmdGFibGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9ubHNfY3A4NTcodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25scygmdGFibGUpOworfQorCittb2R1bGVfaW5pdChpbml0X25sc19jcDg1NykKK21vZHVsZV9leGl0KGV4aXRfbmxzX2NwODU3KQorCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CmRpZmYgLS1naXQgYS9mcy9ubHMvbmxzX2NwODYwLmMgYi9mcy9ubHMvbmxzX2NwODYwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I5ZTQ5YwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25scy9ubHNfY3A4NjAuYwpAQCAtMCwwICsxLDM2NSBAQAorLyoKKyAqIGxpbnV4L2ZzL25sc19jcDg2MC5jCisgKgorICogQ2hhcnNldCBjcDg2MCB0cmFuc2xhdGlvbiB0YWJsZXMuCisgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBVbmljb2RlIGFuZCBjaGFyc2V0CisgKiB0YWJsZXMgZnJvbSB0aGUgVW5pY29kZSBPcmdhbml6YXRpb24gKHd3dy51bmljb2RlLm9yZykuCisgKiBUaGUgVW5pY29kZSB0byBjaGFyc2V0IHRhYmxlIGhhcyBvbmx5IGV4YWN0IG1hcHBpbmdzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCitzdGF0aWMgd2NoYXJfdCBjaGFyc2V0MnVuaVsyNTZdID0geworCS8qIDB4MDAqLworCTB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywKKwkweDAwMDQsIDB4MDAwNSwgMHgwMDA2LCAweDAwMDcsCisJMHgwMDA4LCAweDAwMDksIDB4MDAwYSwgMHgwMDBiLAorCTB4MDAwYywgMHgwMDBkLCAweDAwMGUsIDB4MDAwZiwKKwkvKiAweDEwKi8KKwkweDAwMTAsIDB4MDAxMSwgMHgwMDEyLCAweDAwMTMsCisJMHgwMDE0LCAweDAwMTUsIDB4MDAxNiwgMHgwMDE3LAorCTB4MDAxOCwgMHgwMDE5LCAweDAwMWEsIDB4MDAxYiwKKwkweDAwMWMsIDB4MDAxZCwgMHgwMDFlLCAweDAwMWYsCisJLyogMHgyMCovCisJMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLAorCTB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKwkweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsCisJMHgwMDJjLCAweDAwMmQsIDB4MDAyZSwgMHgwMDJmLAorCS8qIDB4MzAqLworCTB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywKKwkweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisJMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLAorCTB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKwkvKiAweDQwKi8KKwkweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsCisJMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAorCTB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwKKwkweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsCisJLyogMHg1MCovCisJMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLAorCTB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKwkweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsCisJMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLAorCS8qIDB4NjAqLworCTB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywKKwkweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisJMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLAorCTB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKKwkvKiAweDcwKi8KKwkweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsCisJMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LAorCTB4MDA3OCwgMHgwMDc5LCAweDAwN2EsIDB4MDA3YiwKKwkweDAwN2MsIDB4MDA3ZCwgMHgwMDdlLCAweDAwN2YsCisJLyogMHg4MCovCisJMHgwMGM3LCAweDAwZmMsIDB4MDBlOSwgMHgwMGUyLAorCTB4MDBlMywgMHgwMGUwLCAweDAwYzEsIDB4MDBlNywKKwkweDAwZWEsIDB4MDBjYSwgMHgwMGU4LCAweDAwY2QsCisJMHgwMGQ0LCAweDAwZWMsIDB4MDBjMywgMHgwMGMyLAorCS8qIDB4OTAqLworCTB4MDBjOSwgMHgwMGMwLCAweDAwYzgsIDB4MDBmNCwKKwkweDAwZjUsIDB4MDBmMiwgMHgwMGRhLCAweDAwZjksCisJMHgwMGNjLCAweDAwZDUsIDB4MDBkYywgMHgwMGEyLAorCTB4MDBhMywgMHgwMGQ5LCAweDIwYTcsIDB4MDBkMywKKwkvKiAweGEwKi8KKwkweDAwZTEsIDB4MDBlZCwgMHgwMGYzLCAweDAwZmEsCisJMHgwMGYxLCAweDAwZDEsIDB4MDBhYSwgMHgwMGJhLAorCTB4MDBiZiwgMHgwMGQyLCAweDAwYWMsIDB4MDBiZCwKKwkweDAwYmMsIDB4MDBhMSwgMHgwMGFiLCAweDAwYmIsCisJLyogMHhiMCovCisJMHgyNTkxLCAweDI1OTIsIDB4MjU5MywgMHgyNTAyLAorCTB4MjUyNCwgMHgyNTYxLCAweDI1NjIsIDB4MjU1NiwKKwkweDI1NTUsIDB4MjU2MywgMHgyNTUxLCAweDI1NTcsCisJMHgyNTVkLCAweDI1NWMsIDB4MjU1YiwgMHgyNTEwLAorCS8qIDB4YzAqLworCTB4MjUxNCwgMHgyNTM0LCAweDI1MmMsIDB4MjUxYywKKwkweDI1MDAsIDB4MjUzYywgMHgyNTVlLCAweDI1NWYsCisJMHgyNTVhLCAweDI1NTQsIDB4MjU2OSwgMHgyNTY2LAorCTB4MjU2MCwgMHgyNTUwLCAweDI1NmMsIDB4MjU2NywKKwkvKiAweGQwKi8KKwkweDI1NjgsIDB4MjU2NCwgMHgyNTY1LCAweDI1NTksCisJMHgyNTU4LCAweDI1NTIsIDB4MjU1MywgMHgyNTZiLAorCTB4MjU2YSwgMHgyNTE4LCAweDI1MGMsIDB4MjU4OCwKKwkweDI1ODQsIDB4MjU4YywgMHgyNTkwLCAweDI1ODAsCisJLyogMHhlMCovCisJMHgwM2IxLCAweDAwZGYsIDB4MDM5MywgMHgwM2MwLAorCTB4MDNhMywgMHgwM2MzLCAweDAwYjUsIDB4MDNjNCwKKwkweDAzYTYsIDB4MDM5OCwgMHgwM2E5LCAweDAzYjQsCisJMHgyMjFlLCAweDAzYzYsIDB4MDNiNSwgMHgyMjI5LAorCS8qIDB4ZjAqLworCTB4MjI2MSwgMHgwMGIxLCAweDIyNjUsIDB4MjI2NCwKKwkweDIzMjAsIDB4MjMyMSwgMHgwMGY3LCAweDIyNDgsCisJMHgwMGIwLCAweDIyMTksIDB4MDBiNywgMHgyMjFhLAorCTB4MjA3ZiwgMHgwMGIyLCAweDI1YTAsIDB4MDBhMCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMFsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHhmZiwgMHhhZCwgMHg5YiwgMHg5YywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhMC0weGE3ICovCisJMHgwMCwgMHgwMCwgMHhhNiwgMHhhZSwgMHhhYSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhOC0weGFmICovCisJMHhmOCwgMHhmMSwgMHhmZCwgMHgwMCwgMHgwMCwgMHhlNiwgMHgwMCwgMHhmYSwgLyogMHhiMC0weGI3ICovCisJMHgwMCwgMHgwMCwgMHhhNywgMHhhZiwgMHhhYywgMHhhYiwgMHgwMCwgMHhhOCwgLyogMHhiOC0weGJmICovCisJMHg5MSwgMHg4NiwgMHg4ZiwgMHg4ZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgLyogMHhjMC0weGM3ICovCisJMHg5MiwgMHg5MCwgMHg4OSwgMHgwMCwgMHg5OCwgMHg4YiwgMHgwMCwgMHgwMCwgLyogMHhjOC0weGNmICovCisJMHgwMCwgMHhhNSwgMHhhOSwgMHg5ZiwgMHg4YywgMHg5OSwgMHgwMCwgMHgwMCwgLyogMHhkMC0weGQ3ICovCisJMHgwMCwgMHg5ZCwgMHg5NiwgMHgwMCwgMHg5YSwgMHgwMCwgMHgwMCwgMHhlMSwgLyogMHhkOC0weGRmICovCisJMHg4NSwgMHhhMCwgMHg4MywgMHg4NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4NywgLyogMHhlMC0weGU3ICovCisJMHg4YSwgMHg4MiwgMHg4OCwgMHgwMCwgMHg4ZCwgMHhhMSwgMHgwMCwgMHgwMCwgLyogMHhlOC0weGVmICovCisJMHgwMCwgMHhhNCwgMHg5NSwgMHhhMiwgMHg5MywgMHg5NCwgMHgwMCwgMHhmNiwgLyogMHhmMC0weGY3ICovCisJMHgwMCwgMHg5NywgMHhhMywgMHgwMCwgMHg4MSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDNbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4ZTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4ZTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4ZTQsIDB4MDAsIDB4MDAsIDB4ZTgsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworCTB4MDAsIDB4ZWEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTgtMHhhZiAqLworCTB4MDAsIDB4ZTAsIDB4MDAsIDB4MDAsIDB4ZWIsIDB4ZWUsIDB4MDAsIDB4MDAsIC8qIDB4YjAtMHhiNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YjgtMHhiZiAqLworCTB4ZTMsIDB4MDAsIDB4MDAsIDB4ZTUsIDB4ZTcsIDB4MDAsIDB4ZWQsIDB4MDAsIC8qIDB4YzAtMHhjNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTIwWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmYywgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDllLCAvKiAweGEwLTB4YTcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyMlsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4ZjksIDB4ZmIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZWMsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4ZWYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4ZjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4ZjMsIDB4ZjIsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTIzWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHhmNCwgMHhmNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjVbMjU2XSA9IHsKKwkweGM0LCAweDAwLCAweGIzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGRhLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweGJmLCAweDAwLCAweDAwLCAweDAwLCAweGMwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweGQ5LCAweDAwLCAweDAwLCAweDAwLCAweGMzLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGI0LCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGMyLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGMxLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGM1LCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweGNkLCAweGJhLCAweGQ1LCAweGQ2LCAweGM5LCAweGI4LCAweGI3LCAweGJiLCAvKiAweDUwLTB4NTcgKi8KKwkweGQ0LCAweGQzLCAweGM4LCAweGJlLCAweGJkLCAweGJjLCAweGM2LCAweGM3LCAvKiAweDU4LTB4NWYgKi8KKwkweGNjLCAweGI1LCAweGI2LCAweGI5LCAweGQxLCAweGQyLCAweGNiLCAweGNmLCAvKiAweDYwLTB4NjcgKi8KKwkweGQwLCAweGNhLCAweGQ4LCAweGQ3LCAweGNlLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ZGYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZGMsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4ZGIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZGQsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4ZGUsIDB4YjAsIDB4YjEsIDB4YjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4ZmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnBhZ2VfdW5pMmNoYXJzZXRbMjU2XSA9IHsKKwlwYWdlMDAsIE5VTEwsICAgTlVMTCwgICBwYWdlMDMsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJcGFnZTIwLCBOVUxMLCAgIHBhZ2UyMiwgcGFnZTIzLCBOVUxMLCAgIHBhZ2UyNSwgTlVMTCwgICBOVUxMLCAgIAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJsb3dlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NDAtMHg0NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NTAtMHg1NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4NywgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHhhMCwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OCwgMHg4YSwgMHhhMSwgMHg5MywgMHg4ZCwgMHg4NCwgMHg4MywgLyogMHg4OC0weDhmICovCisJMHg4MiwgMHg4NSwgMHg4YSwgMHg5MywgMHg5NCwgMHg5NSwgMHhhMywgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg4ZCwgMHg5NCwgMHg4MSwgMHg5YiwgMHg5YywgMHg5NywgMHg5ZSwgMHhhMiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNCwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHg5NSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHgwMCwgMHhlMywgMHhlNSwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlZCwgMHgwMCwgMHgwMCwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0MnVwcGVyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg2MC0weDY3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg2OC0weDZmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg3MC0weDc3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDlhLCAweDkwLCAweDhmLCAweDhlLCAweDkxLCAweDg2LCAweDgwLCAvKiAweDgwLTB4ODcgKi8KKwkweDg5LCAweDg5LCAweDkyLCAweDhiLCAweDhjLCAweDk4LCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDhjLCAweDk5LCAweGE5LCAweDk2LCAweDlkLCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweDg2LCAweDhiLCAweDlmLCAweDk2LCAweGE1LCAweGE1LCAweGE2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweDAwLCAweGUxLCAweGUyLCAweDAwLCAweGU0LCAweGU0LCAweDAwLCAweDAwLCAvKiAweGUwLTB4ZTcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweDAwLCAweGVjLCAweGU4LCAweDAwLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyBpbnQgdW5pMmNoYXIod2NoYXJfdCB1bmksIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50IGJvdW5kbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnVuaTJjaGFyc2V0OworCXVuc2lnbmVkIGNoYXIgY2wgPSB1bmkgJiAweDAwZmY7CisJdW5zaWduZWQgY2hhciBjaCA9ICh1bmkgJiAweGZmMDApID4+IDg7CisKKwlpZiAoYm91bmRsZW4gPD0gMCkKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwl1bmkyY2hhcnNldCA9IHBhZ2VfdW5pMmNoYXJzZXRbY2hdOworCWlmICh1bmkyY2hhcnNldCAmJiB1bmkyY2hhcnNldFtjbF0pCisJCW91dFswXSA9IHVuaTJjaGFyc2V0W2NsXTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNoYXIydW5pKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJhd3N0cmluZywgaW50IGJvdW5kbGVuLCB3Y2hhcl90ICp1bmkpCit7CisJKnVuaSA9IGNoYXJzZXQydW5pWypyYXdzdHJpbmddOworCWlmICgqdW5pID09IDB4MDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmxzX3RhYmxlIHRhYmxlID0geworCS5jaGFyc2V0CT0gImNwODYwIiwKKwkudW5pMmNoYXIJPSB1bmkyY2hhciwKKwkuY2hhcjJ1bmkJPSBjaGFyMnVuaSwKKwkuY2hhcnNldDJsb3dlcgk9IGNoYXJzZXQybG93ZXIsCisJLmNoYXJzZXQydXBwZXIJPSBjaGFyc2V0MnVwcGVyLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmxzX2NwODYwKHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX25scygmdGFibGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9ubHNfY3A4NjAodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25scygmdGFibGUpOworfQorCittb2R1bGVfaW5pdChpbml0X25sc19jcDg2MCkKK21vZHVsZV9leGl0KGV4aXRfbmxzX2NwODYwKQorCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CmRpZmYgLS1naXQgYS9mcy9ubHMvbmxzX2NwODYxLmMgYi9mcy9ubHMvbmxzX2NwODYxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU5ZmY2NAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25scy9ubHNfY3A4NjEuYwpAQCAtMCwwICsxLDM4OCBAQAorLyoKKyAqIGxpbnV4L2ZzL25sc19jcDg2MS5jCisgKgorICogQ2hhcnNldCBjcDg2MSB0cmFuc2xhdGlvbiB0YWJsZXMuCisgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBVbmljb2RlIGFuZCBjaGFyc2V0CisgKiB0YWJsZXMgZnJvbSB0aGUgVW5pY29kZSBPcmdhbml6YXRpb24gKHd3dy51bmljb2RlLm9yZykuCisgKiBUaGUgVW5pY29kZSB0byBjaGFyc2V0IHRhYmxlIGhhcyBvbmx5IGV4YWN0IG1hcHBpbmdzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCitzdGF0aWMgd2NoYXJfdCBjaGFyc2V0MnVuaVsyNTZdID0geworCS8qIDB4MDAqLworCTB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywKKwkweDAwMDQsIDB4MDAwNSwgMHgwMDA2LCAweDAwMDcsCisJMHgwMDA4LCAweDAwMDksIDB4MDAwYSwgMHgwMDBiLAorCTB4MDAwYywgMHgwMDBkLCAweDAwMGUsIDB4MDAwZiwKKwkvKiAweDEwKi8KKwkweDAwMTAsIDB4MDAxMSwgMHgwMDEyLCAweDAwMTMsCisJMHgwMDE0LCAweDAwMTUsIDB4MDAxNiwgMHgwMDE3LAorCTB4MDAxOCwgMHgwMDE5LCAweDAwMWEsIDB4MDAxYiwKKwkweDAwMWMsIDB4MDAxZCwgMHgwMDFlLCAweDAwMWYsCisJLyogMHgyMCovCisJMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLAorCTB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKwkweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsCisJMHgwMDJjLCAweDAwMmQsIDB4MDAyZSwgMHgwMDJmLAorCS8qIDB4MzAqLworCTB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywKKwkweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisJMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLAorCTB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKwkvKiAweDQwKi8KKwkweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsCisJMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAorCTB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwKKwkweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsCisJLyogMHg1MCovCisJMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLAorCTB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKwkweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsCisJMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLAorCS8qIDB4NjAqLworCTB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywKKwkweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisJMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLAorCTB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKKwkvKiAweDcwKi8KKwkweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsCisJMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LAorCTB4MDA3OCwgMHgwMDc5LCAweDAwN2EsIDB4MDA3YiwKKwkweDAwN2MsIDB4MDA3ZCwgMHgwMDdlLCAweDAwN2YsCisJLyogMHg4MCovCisJMHgwMGM3LCAweDAwZmMsIDB4MDBlOSwgMHgwMGUyLAorCTB4MDBlNCwgMHgwMGUwLCAweDAwZTUsIDB4MDBlNywKKwkweDAwZWEsIDB4MDBlYiwgMHgwMGU4LCAweDAwZDAsCisJMHgwMGYwLCAweDAwZGUsIDB4MDBjNCwgMHgwMGM1LAorCS8qIDB4OTAqLworCTB4MDBjOSwgMHgwMGU2LCAweDAwYzYsIDB4MDBmNCwKKwkweDAwZjYsIDB4MDBmZSwgMHgwMGZiLCAweDAwZGQsCisJMHgwMGZkLCAweDAwZDYsIDB4MDBkYywgMHgwMGY4LAorCTB4MDBhMywgMHgwMGQ4LCAweDIwYTcsIDB4MDE5MiwKKwkvKiAweGEwKi8KKwkweDAwZTEsIDB4MDBlZCwgMHgwMGYzLCAweDAwZmEsCisJMHgwMGMxLCAweDAwY2QsIDB4MDBkMywgMHgwMGRhLAorCTB4MDBiZiwgMHgyMzEwLCAweDAwYWMsIDB4MDBiZCwKKwkweDAwYmMsIDB4MDBhMSwgMHgwMGFiLCAweDAwYmIsCisJLyogMHhiMCovCisJMHgyNTkxLCAweDI1OTIsIDB4MjU5MywgMHgyNTAyLAorCTB4MjUyNCwgMHgyNTYxLCAweDI1NjIsIDB4MjU1NiwKKwkweDI1NTUsIDB4MjU2MywgMHgyNTUxLCAweDI1NTcsCisJMHgyNTVkLCAweDI1NWMsIDB4MjU1YiwgMHgyNTEwLAorCS8qIDB4YzAqLworCTB4MjUxNCwgMHgyNTM0LCAweDI1MmMsIDB4MjUxYywKKwkweDI1MDAsIDB4MjUzYywgMHgyNTVlLCAweDI1NWYsCisJMHgyNTVhLCAweDI1NTQsIDB4MjU2OSwgMHgyNTY2LAorCTB4MjU2MCwgMHgyNTUwLCAweDI1NmMsIDB4MjU2NywKKwkvKiAweGQwKi8KKwkweDI1NjgsIDB4MjU2NCwgMHgyNTY1LCAweDI1NTksCisJMHgyNTU4LCAweDI1NTIsIDB4MjU1MywgMHgyNTZiLAorCTB4MjU2YSwgMHgyNTE4LCAweDI1MGMsIDB4MjU4OCwKKwkweDI1ODQsIDB4MjU4YywgMHgyNTkwLCAweDI1ODAsCisJLyogMHhlMCovCisJMHgwM2IxLCAweDAwZGYsIDB4MDM5MywgMHgwM2MwLAorCTB4MDNhMywgMHgwM2MzLCAweDAwYjUsIDB4MDNjNCwKKwkweDAzYTYsIDB4MDM5OCwgMHgwM2E5LCAweDAzYjQsCisJMHgyMjFlLCAweDAzYzYsIDB4MDNiNSwgMHgyMjI5LAorCS8qIDB4ZjAqLworCTB4MjI2MSwgMHgwMGIxLCAweDIyNjUsIDB4MjI2NCwKKwkweDIzMjAsIDB4MjMyMSwgMHgwMGY3LCAweDIyNDgsCisJMHgwMGIwLCAweDIyMTksIDB4MDBiNywgMHgyMjFhLAorCTB4MjA3ZiwgMHgwMGIyLCAweDI1YTAsIDB4MDBhMCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMFsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHhmZiwgMHhhZCwgMHgwMCwgMHg5YywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhMC0weGE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhhZSwgMHhhYSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhOC0weGFmICovCisJMHhmOCwgMHhmMSwgMHhmZCwgMHgwMCwgMHgwMCwgMHhlNiwgMHgwMCwgMHhmYSwgLyogMHhiMC0weGI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhhZiwgMHhhYywgMHhhYiwgMHgwMCwgMHhhOCwgLyogMHhiOC0weGJmICovCisJMHgwMCwgMHhhNCwgMHgwMCwgMHgwMCwgMHg4ZSwgMHg4ZiwgMHg5MiwgMHg4MCwgLyogMHhjMC0weGM3ICovCisJMHgwMCwgMHg5MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhNSwgMHgwMCwgMHgwMCwgLyogMHhjOC0weGNmICovCisJMHg4YiwgMHgwMCwgMHgwMCwgMHhhNiwgMHgwMCwgMHgwMCwgMHg5OSwgMHgwMCwgLyogMHhkMC0weGQ3ICovCisJMHg5ZCwgMHgwMCwgMHhhNywgMHgwMCwgMHg5YSwgMHg5NywgMHg4ZCwgMHhlMSwgLyogMHhkOC0weGRmICovCisJMHg4NSwgMHhhMCwgMHg4MywgMHgwMCwgMHg4NCwgMHg4NiwgMHg5MSwgMHg4NywgLyogMHhlMC0weGU3ICovCisJMHg4YSwgMHg4MiwgMHg4OCwgMHg4OSwgMHgwMCwgMHhhMSwgMHgwMCwgMHgwMCwgLyogMHhlOC0weGVmICovCisJMHg4YywgMHgwMCwgMHgwMCwgMHhhMiwgMHg5MywgMHgwMCwgMHg5NCwgMHhmNiwgLyogMHhmMC0weGY3ICovCisJMHg5YiwgMHgwMCwgMHhhMywgMHg5NiwgMHg4MSwgMHg5OCwgMHg5NSwgMHgwMCwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDFbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4OWYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAzWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweGUyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweGU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweGU0LCAweDAwLCAweDAwLCAweGU4LCAweDAwLCAvKiAweGEwLTB4YTcgKi8KKwkweDAwLCAweGVhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGE4LTB4YWYgKi8KKwkweDAwLCAweGUwLCAweDAwLCAweDAwLCAweGViLCAweGVlLCAweDAwLCAweDAwLCAvKiAweGIwLTB4YjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGI4LTB4YmYgKi8KKwkweGUzLCAweDAwLCAweDAwLCAweGU1LCAweGU3LCAweDAwLCAweGVkLCAweDAwLCAvKiAweGMwLTB4YzcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyMFsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmMsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5ZSwgLyogMHhhMC0weGE3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjJbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweGY5LCAweGZiLCAweDAwLCAweDAwLCAweDAwLCAweGVjLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweGVmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweGY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweDAwLCAweGYwLCAweDAwLCAweDAwLCAweGYzLCAweGYyLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyM1syNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4YTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4ZjQsIDB4ZjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTI1WzI1Nl0gPSB7CisJMHhjNCwgMHgwMCwgMHhiMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkYSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHhiZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHhkOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMywgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiNCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMiwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjNSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHhjZCwgMHhiYSwgMHhkNSwgMHhkNiwgMHhjOSwgMHhiOCwgMHhiNywgMHhiYiwgLyogMHg1MC0weDU3ICovCisJMHhkNCwgMHhkMywgMHhjOCwgMHhiZSwgMHhiZCwgMHhiYywgMHhjNiwgMHhjNywgLyogMHg1OC0weDVmICovCisJMHhjYywgMHhiNSwgMHhiNiwgMHhiOSwgMHhkMSwgMHhkMiwgMHhjYiwgMHhjZiwgLyogMHg2MC0weDY3ICovCisJMHhkMCwgMHhjYSwgMHhkOCwgMHhkNywgMHhjZSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweGRmLCAweDAwLCAweDAwLCAweDAwLCAweGRjLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweGRiLCAweDAwLCAweDAwLCAweDAwLCAweGRkLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweGRlLCAweGIwLCAweGIxLCAweGIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweGZlLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwYWdlX3VuaTJjaGFyc2V0WzI1Nl0gPSB7CisJcGFnZTAwLCBwYWdlMDEsIE5VTEwsICAgcGFnZTAzLCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCXBhZ2UyMCwgTlVMTCwgICBwYWdlMjIsIHBhZ2UyMywgTlVMTCwgICBwYWdlMjUsIE5VTEwsICAgTlVMTCwgICAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQybG93ZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDQwLTB4NDcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDUwLTB4NTcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODcsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGMsIDB4OGMsIDB4OTUsIDB4ODQsIDB4ODYsIC8qIDB4ODgtMHg4ZiAqLworCTB4ODIsIDB4OTEsIDB4OTEsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTgsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTQsIDB4ODEsIDB4OWIsIDB4OWMsIDB4OWIsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4MDAsIDB4ZTMsIDB4ZTUsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZWQsIDB4MDAsIDB4MDAsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJ1cHBlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NjAtMHg2NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NzAtMHg3NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg5YSwgMHg5MCwgMHgwMCwgMHg4ZSwgMHgwMCwgMHg4ZiwgMHg4MCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHg4YiwgMHg4YiwgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MiwgMHg5MiwgMHgwMCwgMHg5OSwgMHg4ZCwgMHgwMCwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5NywgMHg5OSwgMHg5YSwgMHg5ZCwgMHg5YywgMHg5ZCwgMHg5ZSwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHgwMCwgMHhlMSwgMHhlMiwgMHgwMCwgMHhlNCwgMHhlNCwgMHgwMCwgMHgwMCwgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHgwMCwgMHhlYywgMHhlOCwgMHgwMCwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgaW50IHVuaTJjaGFyKHdjaGFyX3QgdW5pLCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCBib3VuZGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICp1bmkyY2hhcnNldDsKKwl1bnNpZ25lZCBjaGFyIGNsID0gdW5pICYgMHgwMGZmOworCXVuc2lnbmVkIGNoYXIgY2ggPSAodW5pICYgMHhmZjAwKSA+PiA4OworCisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJdW5pMmNoYXJzZXQgPSBwYWdlX3VuaTJjaGFyc2V0W2NoXTsKKwlpZiAodW5pMmNoYXJzZXQgJiYgdW5pMmNoYXJzZXRbY2xdKQorCQlvdXRbMF0gPSB1bmkyY2hhcnNldFtjbF07CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGFyMnVuaShjb25zdCB1bnNpZ25lZCBjaGFyICpyYXdzdHJpbmcsIGludCBib3VuZGxlbiwgd2NoYXJfdCAqdW5pKQoreworCSp1bmkgPSBjaGFyc2V0MnVuaVsqcmF3c3RyaW5nXTsKKwlpZiAoKnVuaSA9PSAweDAwMDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSB0YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJjcDg2MSIsCisJLnVuaTJjaGFyCT0gdW5pMmNoYXIsCisJLmNoYXIydW5pCT0gY2hhcjJ1bmksCisJLmNoYXJzZXQybG93ZXIJPSBjaGFyc2V0Mmxvd2VyLAorCS5jaGFyc2V0MnVwcGVyCT0gY2hhcnNldDJ1cHBlciwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X25sc19jcDg2MSh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmxzX2NwODYxKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ubHNfY3A4NjEpCittb2R1bGVfZXhpdChleGl0X25sc19jcDg2MSkKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvbmxzL25sc19jcDg2Mi5jIGIvZnMvbmxzL25sc19jcDg2Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NjkyOGYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ubHMvbmxzX2NwODYyLmMKQEAgLTAsMCArMSw0MjIgQEAKKy8qCisgKiBsaW51eC9mcy9ubHNfY3A4NjIuYworICoKKyAqIENoYXJzZXQgY3A4NjIgdHJhbnNsYXRpb24gdGFibGVzLgorICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgVW5pY29kZSBhbmQgY2hhcnNldAorICogdGFibGVzIGZyb20gdGhlIFVuaWNvZGUgT3JnYW5pemF0aW9uICh3d3cudW5pY29kZS5vcmcpLgorICogVGhlIFVuaWNvZGUgdG8gY2hhcnNldCB0YWJsZSBoYXMgb25seSBleGFjdCBtYXBwaW5ncy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworc3RhdGljIHdjaGFyX3QgY2hhcnNldDJ1bmlbMjU2XSA9IHsKKwkvKiAweDAwKi8KKwkweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsCisJMHgwMDA0LCAweDAwMDUsIDB4MDAwNiwgMHgwMDA3LAorCTB4MDAwOCwgMHgwMDA5LCAweDAwMGEsIDB4MDAwYiwKKwkweDAwMGMsIDB4MDAwZCwgMHgwMDBlLCAweDAwMGYsCisJLyogMHgxMCovCisJMHgwMDEwLCAweDAwMTEsIDB4MDAxMiwgMHgwMDEzLAorCTB4MDAxNCwgMHgwMDE1LCAweDAwMTYsIDB4MDAxNywKKwkweDAwMTgsIDB4MDAxOSwgMHgwMDFhLCAweDAwMWIsCisJMHgwMDFjLCAweDAwMWQsIDB4MDAxZSwgMHgwMDFmLAorCS8qIDB4MjAqLworCTB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywKKwkweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisJMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLAorCTB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKwkvKiAweDMwKi8KKwkweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsCisJMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAorCTB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwKKwkweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsCisJLyogMHg0MCovCisJMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLAorCTB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKwkweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsCisJMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLAorCS8qIDB4NTAqLworCTB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywKKwkweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisJMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMDViLAorCTB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwKKwkvKiAweDYwKi8KKwkweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsCisJMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LAorCTB4MDA2OCwgMHgwMDY5LCAweDAwNmEsIDB4MDA2YiwKKwkweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsCisJLyogMHg3MCovCisJMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLAorCTB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKwkweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsCisJMHgwMDdjLCAweDAwN2QsIDB4MDA3ZSwgMHgwMDdmLAorCS8qIDB4ODAqLworCTB4MDVkMCwgMHgwNWQxLCAweDA1ZDIsIDB4MDVkMywKKwkweDA1ZDQsIDB4MDVkNSwgMHgwNWQ2LCAweDA1ZDcsCisJMHgwNWQ4LCAweDA1ZDksIDB4MDVkYSwgMHgwNWRiLAorCTB4MDVkYywgMHgwNWRkLCAweDA1ZGUsIDB4MDVkZiwKKwkvKiAweDkwKi8KKwkweDA1ZTAsIDB4MDVlMSwgMHgwNWUyLCAweDA1ZTMsCisJMHgwNWU0LCAweDA1ZTUsIDB4MDVlNiwgMHgwNWU3LAorCTB4MDVlOCwgMHgwNWU5LCAweDA1ZWEsIDB4MDBhMiwKKwkweDAwYTMsIDB4MDBhNSwgMHgyMGE3LCAweDAxOTIsCisJLyogMHhhMCovCisJMHgwMGUxLCAweDAwZWQsIDB4MDBmMywgMHgwMGZhLAorCTB4MDBmMSwgMHgwMGQxLCAweDAwYWEsIDB4MDBiYSwKKwkweDAwYmYsIDB4MjMxMCwgMHgwMGFjLCAweDAwYmQsCisJMHgwMGJjLCAweDAwYTEsIDB4MDBhYiwgMHgwMGJiLAorCS8qIDB4YjAqLworCTB4MjU5MSwgMHgyNTkyLCAweDI1OTMsIDB4MjUwMiwKKwkweDI1MjQsIDB4MjU2MSwgMHgyNTYyLCAweDI1NTYsCisJMHgyNTU1LCAweDI1NjMsIDB4MjU1MSwgMHgyNTU3LAorCTB4MjU1ZCwgMHgyNTVjLCAweDI1NWIsIDB4MjUxMCwKKwkvKiAweGMwKi8KKwkweDI1MTQsIDB4MjUzNCwgMHgyNTJjLCAweDI1MWMsCisJMHgyNTAwLCAweDI1M2MsIDB4MjU1ZSwgMHgyNTVmLAorCTB4MjU1YSwgMHgyNTU0LCAweDI1NjksIDB4MjU2NiwKKwkweDI1NjAsIDB4MjU1MCwgMHgyNTZjLCAweDI1NjcsCisJLyogMHhkMCovCisJMHgyNTY4LCAweDI1NjQsIDB4MjU2NSwgMHgyNTU5LAorCTB4MjU1OCwgMHgyNTUyLCAweDI1NTMsIDB4MjU2YiwKKwkweDI1NmEsIDB4MjUxOCwgMHgyNTBjLCAweDI1ODgsCisJMHgyNTg0LCAweDI1OGMsIDB4MjU5MCwgMHgyNTgwLAorCS8qIDB4ZTAqLworCTB4MDNiMSwgMHgwMGRmLCAweDAzOTMsIDB4MDNjMCwKKwkweDAzYTMsIDB4MDNjMywgMHgwMGI1LCAweDAzYzQsCisJMHgwM2E2LCAweDAzOTgsIDB4MDNhOSwgMHgwM2I0LAorCTB4MjIxZSwgMHgwM2M2LCAweDAzYjUsIDB4MjIyOSwKKwkvKiAweGYwKi8KKwkweDIyNjEsIDB4MDBiMSwgMHgyMjY1LCAweDIyNjQsCisJMHgyMzIwLCAweDIzMjEsIDB4MDBmNywgMHgyMjQ4LAorCTB4MDBiMCwgMHgyMjE5LCAweDAwYjcsIDB4MjIxYSwKKwkweDIwN2YsIDB4MDBiMiwgMHgyNWEwLCAweDAwYTAsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDBbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4ZmYsIDB4YWQsIDB4OWIsIDB4OWMsIDB4MDAsIDB4OWQsIDB4MDAsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworCTB4MDAsIDB4MDAsIDB4YTYsIDB4YWUsIDB4YWEsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTgtMHhhZiAqLworCTB4ZjgsIDB4ZjEsIDB4ZmQsIDB4MDAsIDB4MDAsIDB4ZTYsIDB4MDAsIDB4ZmEsIC8qIDB4YjAtMHhiNyAqLworCTB4MDAsIDB4MDAsIDB4YTcsIDB4YWYsIDB4YWMsIDB4YWIsIDB4MDAsIDB4YTgsIC8qIDB4YjgtMHhiZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YzAtMHhjNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YzgtMHhjZiAqLworCTB4MDAsIDB4YTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZDAtMHhkNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZTEsIC8qIDB4ZDgtMHhkZiAqLworCTB4MDAsIDB4YTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZTAtMHhlNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YTEsIDB4MDAsIDB4MDAsIC8qIDB4ZTgtMHhlZiAqLworCTB4MDAsIDB4YTQsIDB4MDAsIDB4YTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjYsIC8qIDB4ZjAtMHhmNyAqLworCTB4MDAsIDB4MDAsIDB4YTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAxWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDlmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwM1syNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhlMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHhlOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhlNCwgMHgwMCwgMHgwMCwgMHhlOCwgMHgwMCwgLyogMHhhMC0weGE3ICovCisJMHgwMCwgMHhlYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhOC0weGFmICovCisJMHgwMCwgMHhlMCwgMHgwMCwgMHgwMCwgMHhlYiwgMHhlZSwgMHgwMCwgMHgwMCwgLyogMHhiMC0weGI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhiOC0weGJmICovCisJMHhlMywgMHgwMCwgMHgwMCwgMHhlNSwgMHhlNywgMHgwMCwgMHhlZCwgMHgwMCwgLyogMHhjMC0weGM3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDVbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTgtMHhhZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YjAtMHhiNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YjgtMHhiZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YzAtMHhjNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YzgtMHhjZiAqLworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZTgtMHhlZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTIwWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmYywgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDllLCAvKiAweGEwLTB4YTcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyMlsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4ZjksIDB4ZmIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZWMsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4ZWYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4ZjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4ZjMsIDB4ZjIsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTIzWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHhhOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHhmNCwgMHhmNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjVbMjU2XSA9IHsKKwkweGM0LCAweDAwLCAweGIzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGRhLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweGJmLCAweDAwLCAweDAwLCAweDAwLCAweGMwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweGQ5LCAweDAwLCAweDAwLCAweDAwLCAweGMzLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGI0LCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGMyLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGMxLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGM1LCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweGNkLCAweGJhLCAweGQ1LCAweGQ2LCAweGM5LCAweGI4LCAweGI3LCAweGJiLCAvKiAweDUwLTB4NTcgKi8KKwkweGQ0LCAweGQzLCAweGM4LCAweGJlLCAweGJkLCAweGJjLCAweGM2LCAweGM3LCAvKiAweDU4LTB4NWYgKi8KKwkweGNjLCAweGI1LCAweGI2LCAweGI5LCAweGQxLCAweGQyLCAweGNiLCAweGNmLCAvKiAweDYwLTB4NjcgKi8KKwkweGQwLCAweGNhLCAweGQ4LCAweGQ3LCAweGNlLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ZGYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZGMsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4ZGIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZGQsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4ZGUsIDB4YjAsIDB4YjEsIDB4YjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4ZmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnBhZ2VfdW5pMmNoYXJzZXRbMjU2XSA9IHsKKwlwYWdlMDAsIHBhZ2UwMSwgTlVMTCwgICBwYWdlMDMsIE5VTEwsICAgcGFnZTA1LCBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJcGFnZTIwLCBOVUxMLCAgIHBhZ2UyMiwgcGFnZTIzLCBOVUxMLCAgIHBhZ2UyNSwgTlVMTCwgICBOVUxMLCAgIAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJsb3dlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NDAtMHg0NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NTAtMHg1NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNCwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHgwMCwgMHhlMywgMHhlNSwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlZCwgMHgwMCwgMHgwMCwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0MnVwcGVyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg2MC0weDY3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg2OC0weDZmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg3MC0weDc3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGE1LCAweGE1LCAweGE2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweDAwLCAweGUxLCAweGUyLCAweDAwLCAweGU0LCAweGU0LCAweDAwLCAweDAwLCAvKiAweGUwLTB4ZTcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweDAwLCAweGVjLCAweGU4LCAweDAwLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyBpbnQgdW5pMmNoYXIod2NoYXJfdCB1bmksIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50IGJvdW5kbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnVuaTJjaGFyc2V0OworCXVuc2lnbmVkIGNoYXIgY2wgPSB1bmkgJiAweDAwZmY7CisJdW5zaWduZWQgY2hhciBjaCA9ICh1bmkgJiAweGZmMDApID4+IDg7CisKKwlpZiAoYm91bmRsZW4gPD0gMCkKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwl1bmkyY2hhcnNldCA9IHBhZ2VfdW5pMmNoYXJzZXRbY2hdOworCWlmICh1bmkyY2hhcnNldCAmJiB1bmkyY2hhcnNldFtjbF0pCisJCW91dFswXSA9IHVuaTJjaGFyc2V0W2NsXTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNoYXIydW5pKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJhd3N0cmluZywgaW50IGJvdW5kbGVuLCB3Y2hhcl90ICp1bmkpCit7CisJKnVuaSA9IGNoYXJzZXQydW5pWypyYXdzdHJpbmddOworCWlmICgqdW5pID09IDB4MDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmxzX3RhYmxlIHRhYmxlID0geworCS5jaGFyc2V0CT0gImNwODYyIiwKKwkudW5pMmNoYXIJPSB1bmkyY2hhciwKKwkuY2hhcjJ1bmkJPSBjaGFyMnVuaSwKKwkuY2hhcnNldDJsb3dlcgk9IGNoYXJzZXQybG93ZXIsCisJLmNoYXJzZXQydXBwZXIJPSBjaGFyc2V0MnVwcGVyLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmxzX2NwODYyKHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX25scygmdGFibGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9ubHNfY3A4NjIodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25scygmdGFibGUpOworfQorCittb2R1bGVfaW5pdChpbml0X25sc19jcDg2MikKK21vZHVsZV9leGl0KGV4aXRfbmxzX2NwODYyKQorCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CmRpZmYgLS1naXQgYS9mcy9ubHMvbmxzX2NwODYzLmMgYi9mcy9ubHMvbmxzX2NwODYzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFhNmUwZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25scy9ubHNfY3A4NjMuYwpAQCAtMCwwICsxLDM4MiBAQAorLyoKKyAqIGxpbnV4L2ZzL25sc19jcDg2My5jCisgKgorICogQ2hhcnNldCBjcDg2MyB0cmFuc2xhdGlvbiB0YWJsZXMuCisgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBVbmljb2RlIGFuZCBjaGFyc2V0CisgKiB0YWJsZXMgZnJvbSB0aGUgVW5pY29kZSBPcmdhbml6YXRpb24gKHd3dy51bmljb2RlLm9yZykuCisgKiBUaGUgVW5pY29kZSB0byBjaGFyc2V0IHRhYmxlIGhhcyBvbmx5IGV4YWN0IG1hcHBpbmdzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCitzdGF0aWMgd2NoYXJfdCBjaGFyc2V0MnVuaVsyNTZdID0geworCS8qIDB4MDAqLworCTB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywKKwkweDAwMDQsIDB4MDAwNSwgMHgwMDA2LCAweDAwMDcsCisJMHgwMDA4LCAweDAwMDksIDB4MDAwYSwgMHgwMDBiLAorCTB4MDAwYywgMHgwMDBkLCAweDAwMGUsIDB4MDAwZiwKKwkvKiAweDEwKi8KKwkweDAwMTAsIDB4MDAxMSwgMHgwMDEyLCAweDAwMTMsCisJMHgwMDE0LCAweDAwMTUsIDB4MDAxNiwgMHgwMDE3LAorCTB4MDAxOCwgMHgwMDE5LCAweDAwMWEsIDB4MDAxYiwKKwkweDAwMWMsIDB4MDAxZCwgMHgwMDFlLCAweDAwMWYsCisJLyogMHgyMCovCisJMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLAorCTB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKwkweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsCisJMHgwMDJjLCAweDAwMmQsIDB4MDAyZSwgMHgwMDJmLAorCS8qIDB4MzAqLworCTB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywKKwkweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisJMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLAorCTB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKwkvKiAweDQwKi8KKwkweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsCisJMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAorCTB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwKKwkweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsCisJLyogMHg1MCovCisJMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLAorCTB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKwkweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsCisJMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLAorCS8qIDB4NjAqLworCTB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywKKwkweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisJMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLAorCTB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKKwkvKiAweDcwKi8KKwkweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsCisJMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LAorCTB4MDA3OCwgMHgwMDc5LCAweDAwN2EsIDB4MDA3YiwKKwkweDAwN2MsIDB4MDA3ZCwgMHgwMDdlLCAweDAwN2YsCisJLyogMHg4MCovCisJMHgwMGM3LCAweDAwZmMsIDB4MDBlOSwgMHgwMGUyLAorCTB4MDBjMiwgMHgwMGUwLCAweDAwYjYsIDB4MDBlNywKKwkweDAwZWEsIDB4MDBlYiwgMHgwMGU4LCAweDAwZWYsCisJMHgwMGVlLCAweDIwMTcsIDB4MDBjMCwgMHgwMGE3LAorCS8qIDB4OTAqLworCTB4MDBjOSwgMHgwMGM4LCAweDAwY2EsIDB4MDBmNCwKKwkweDAwY2IsIDB4MDBjZiwgMHgwMGZiLCAweDAwZjksCisJMHgwMGE0LCAweDAwZDQsIDB4MDBkYywgMHgwMGEyLAorCTB4MDBhMywgMHgwMGQ5LCAweDAwZGIsIDB4MDE5MiwKKwkvKiAweGEwKi8KKwkweDAwYTYsIDB4MDBiNCwgMHgwMGYzLCAweDAwZmEsCisJMHgwMGE4LCAweDAwYjgsIDB4MDBiMywgMHgwMGFmLAorCTB4MDBjZSwgMHgyMzEwLCAweDAwYWMsIDB4MDBiZCwKKwkweDAwYmMsIDB4MDBiZSwgMHgwMGFiLCAweDAwYmIsCisJLyogMHhiMCovCisJMHgyNTkxLCAweDI1OTIsIDB4MjU5MywgMHgyNTAyLAorCTB4MjUyNCwgMHgyNTYxLCAweDI1NjIsIDB4MjU1NiwKKwkweDI1NTUsIDB4MjU2MywgMHgyNTUxLCAweDI1NTcsCisJMHgyNTVkLCAweDI1NWMsIDB4MjU1YiwgMHgyNTEwLAorCS8qIDB4YzAqLworCTB4MjUxNCwgMHgyNTM0LCAweDI1MmMsIDB4MjUxYywKKwkweDI1MDAsIDB4MjUzYywgMHgyNTVlLCAweDI1NWYsCisJMHgyNTVhLCAweDI1NTQsIDB4MjU2OSwgMHgyNTY2LAorCTB4MjU2MCwgMHgyNTUwLCAweDI1NmMsIDB4MjU2NywKKwkvKiAweGQwKi8KKwkweDI1NjgsIDB4MjU2NCwgMHgyNTY1LCAweDI1NTksCisJMHgyNTU4LCAweDI1NTIsIDB4MjU1MywgMHgyNTZiLAorCTB4MjU2YSwgMHgyNTE4LCAweDI1MGMsIDB4MjU4OCwKKwkweDI1ODQsIDB4MjU4YywgMHgyNTkwLCAweDI1ODAsCisJLyogMHhlMCovCisJMHgwM2IxLCAweDAwZGYsIDB4MDM5MywgMHgwM2MwLAorCTB4MDNhMywgMHgwM2MzLCAweDAwYjUsIDB4MDNjNCwKKwkweDAzYTYsIDB4MDM5OCwgMHgwM2E5LCAweDAzYjQsCisJMHgyMjFlLCAweDAzYzYsIDB4MDNiNSwgMHgyMjI5LAorCS8qIDB4ZjAqLworCTB4MjI2MSwgMHgwMGIxLCAweDIyNjUsIDB4MjI2NCwKKwkweDIzMjAsIDB4MjMyMSwgMHgwMGY3LCAweDIyNDgsCisJMHgwMGIwLCAweDIyMTksIDB4MDBiNywgMHgyMjFhLAorCTB4MjA3ZiwgMHgwMGIyLCAweDI1YTAsIDB4MDBhMCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMFsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHhmZiwgMHgwMCwgMHg5YiwgMHg5YywgMHg5OCwgMHgwMCwgMHhhMCwgMHg4ZiwgLyogMHhhMC0weGE3ICovCisJMHhhNCwgMHgwMCwgMHgwMCwgMHhhZSwgMHhhYSwgMHgwMCwgMHgwMCwgMHhhNywgLyogMHhhOC0weGFmICovCisJMHhmOCwgMHhmMSwgMHhmZCwgMHhhNiwgMHhhMSwgMHhlNiwgMHg4NiwgMHhmYSwgLyogMHhiMC0weGI3ICovCisJMHhhNSwgMHgwMCwgMHgwMCwgMHhhZiwgMHhhYywgMHhhYiwgMHhhZCwgMHgwMCwgLyogMHhiOC0weGJmICovCisJMHg4ZSwgMHgwMCwgMHg4NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MCwgLyogMHhjMC0weGM3ICovCisJMHg5MSwgMHg5MCwgMHg5MiwgMHg5NCwgMHgwMCwgMHgwMCwgMHhhOCwgMHg5NSwgLyogMHhjOC0weGNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhkMC0weGQ3ICovCisJMHgwMCwgMHg5ZCwgMHgwMCwgMHg5ZSwgMHg5YSwgMHgwMCwgMHgwMCwgMHhlMSwgLyogMHhkOC0weGRmICovCisJMHg4NSwgMHgwMCwgMHg4MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4NywgLyogMHhlMC0weGU3ICovCisJMHg4YSwgMHg4MiwgMHg4OCwgMHg4OSwgMHgwMCwgMHgwMCwgMHg4YywgMHg4YiwgLyogMHhlOC0weGVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhhMiwgMHg5MywgMHgwMCwgMHgwMCwgMHhmNiwgLyogMHhmMC0weGY3ICovCisJMHgwMCwgMHg5NywgMHhhMywgMHg5NiwgMHg4MSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDFbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4OWYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAzWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweGUyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweGU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweGU0LCAweDAwLCAweDAwLCAweGU4LCAweDAwLCAvKiAweGEwLTB4YTcgKi8KKwkweDAwLCAweGVhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGE4LTB4YWYgKi8KKwkweDAwLCAweGUwLCAweDAwLCAweDAwLCAweGViLCAweGVlLCAweDAwLCAweDAwLCAvKiAweGIwLTB4YjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGI4LTB4YmYgKi8KKwkweGUzLCAweDAwLCAweDAwLCAweGU1LCAweGU3LCAweDAwLCAweGVkLCAweDAwLCAvKiAweGMwLTB4YzcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyMFsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OGQsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmMsIC8qIDB4NzgtMHg3ZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTIyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHhmOSwgMHhmYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhlYywgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHhlZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHhmNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHgwMCwgMHhmMCwgMHgwMCwgMHgwMCwgMHhmMywgMHhmMiwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjNbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweGE5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweGY0LCAweGY1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyNVsyNTZdID0geworCTB4YzQsIDB4MDAsIDB4YjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZGEsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4YmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4ZDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzMsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YjQsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzIsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzEsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzUsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4Y2QsIDB4YmEsIDB4ZDUsIDB4ZDYsIDB4YzksIDB4YjgsIDB4YjcsIDB4YmIsIC8qIDB4NTAtMHg1NyAqLworCTB4ZDQsIDB4ZDMsIDB4YzgsIDB4YmUsIDB4YmQsIDB4YmMsIDB4YzYsIDB4YzcsIC8qIDB4NTgtMHg1ZiAqLworCTB4Y2MsIDB4YjUsIDB4YjYsIDB4YjksIDB4ZDEsIDB4ZDIsIDB4Y2IsIDB4Y2YsIC8qIDB4NjAtMHg2NyAqLworCTB4ZDAsIDB4Y2EsIDB4ZDgsIDB4ZDcsIDB4Y2UsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3ZiAqLworCisJMHhkZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkYywgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHhkYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkZCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHhkZSwgMHhiMCwgMHhiMSwgMHhiMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHhmZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhMC0weGE3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciAqcGFnZV91bmkyY2hhcnNldFsyNTZdID0geworCXBhZ2UwMCwgcGFnZTAxLCBOVUxMLCAgIHBhZ2UwMywgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlwYWdlMjAsIE5VTEwsICAgcGFnZTIyLCBwYWdlMjMsIE5VTEwsICAgcGFnZTI1LCBOVUxMLCAgIE5VTEwsICAgCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0Mmxvd2VyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg0MC0weDQ3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg0OC0weDRmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg1MC0weDU3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDg3LCAweDgxLCAweDgyLCAweDgzLCAweDgzLCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDg1LCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDgyLCAweDhhLCAweDg4LCAweDkzLCAweDg5LCAweDhiLCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDkzLCAweDgxLCAweDliLCAweDljLCAweDk3LCAweDk2LCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweGExLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweDhjLCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGUwLCAweGUxLCAweDAwLCAweGUzLCAweGU1LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGVkLCAweDAwLCAweDAwLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQydXBwZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDYwLTB4NjcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDY4LTB4NmYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDcwLTB4NzcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4OWEsIDB4OTAsIDB4ODQsIDB4ODQsIDB4OGUsIDB4ODYsIDB4ODAsIC8qIDB4ODAtMHg4NyAqLworCTB4OTIsIDB4OTQsIDB4OTEsIDB4OTUsIDB4YTgsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTksIDB4OTQsIDB4OTUsIDB4OWUsIDB4OWQsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4MDAsIDB4MDAsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4MDAsIDB4ZTEsIDB4ZTIsIDB4MDAsIDB4ZTQsIDB4ZTQsIDB4MDAsIDB4MDAsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4MDAsIDB4ZWMsIDB4ZTgsIDB4MDAsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIGludCB1bmkyY2hhcih3Y2hhcl90IHVuaSwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgYm91bmRsZW4pCit7CisJdW5zaWduZWQgY2hhciAqdW5pMmNoYXJzZXQ7CisJdW5zaWduZWQgY2hhciBjbCA9IHVuaSAmIDB4MDBmZjsKKwl1bnNpZ25lZCBjaGFyIGNoID0gKHVuaSAmIDB4ZmYwMCkgPj4gODsKKworCWlmIChib3VuZGxlbiA8PSAwKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCXVuaTJjaGFyc2V0ID0gcGFnZV91bmkyY2hhcnNldFtjaF07CisJaWYgKHVuaTJjaGFyc2V0ICYmIHVuaTJjaGFyc2V0W2NsXSkKKwkJb3V0WzBdID0gdW5pMmNoYXJzZXRbY2xdOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY2hhcjJ1bmkoY29uc3QgdW5zaWduZWQgY2hhciAqcmF3c3RyaW5nLCBpbnQgYm91bmRsZW4sIHdjaGFyX3QgKnVuaSkKK3sKKwkqdW5pID0gY2hhcnNldDJ1bmlbKnJhd3N0cmluZ107CisJaWYgKCp1bmkgPT0gMHgwMDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBubHNfdGFibGUgdGFibGUgPSB7CisJLmNoYXJzZXQJPSAiY3A4NjMiLAorCS51bmkyY2hhcgk9IHVuaTJjaGFyLAorCS5jaGFyMnVuaQk9IGNoYXIydW5pLAorCS5jaGFyc2V0Mmxvd2VyCT0gY2hhcnNldDJsb3dlciwKKwkuY2hhcnNldDJ1cHBlcgk9IGNoYXJzZXQydXBwZXIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9ubHNfY3A4NjModm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X25sc19jcDg2Myh2b2lkKQoreworCXVucmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbmxzX2NwODYzKQorbW9kdWxlX2V4aXQoZXhpdF9ubHNfY3A4NjMpCisKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL25scy9ubHNfY3A4NjQuYyBiL2ZzL25scy9ubHNfY3A4NjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGRhYmIwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmxzL25sc19jcDg2NC5jCkBAIC0wLDAgKzEsNDA4IEBACisvKgorICogbGludXgvZnMvbmxzX2NwODY0LmMKKyAqCisgKiBDaGFyc2V0IGNwODY0IHRyYW5zbGF0aW9uIHRhYmxlcy4KKyAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIFVuaWNvZGUgYW5kIGNoYXJzZXQKKyAqIHRhYmxlcyBmcm9tIHRoZSBVbmljb2RlIE9yZ2FuaXphdGlvbiAod3d3LnVuaWNvZGUub3JnKS4KKyAqIFRoZSBVbmljb2RlIHRvIGNoYXJzZXQgdGFibGUgaGFzIG9ubHkgZXhhY3QgbWFwcGluZ3MuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKK3N0YXRpYyB3Y2hhcl90IGNoYXJzZXQydW5pWzI1Nl0gPSB7CisJLyogMHgwMCovCisJMHgwMDAwLCAweDAwMDEsIDB4MDAwMiwgMHgwMDAzLAorCTB4MDAwNCwgMHgwMDA1LCAweDAwMDYsIDB4MDAwNywKKwkweDAwMDgsIDB4MDAwOSwgMHgwMDBhLCAweDAwMGIsCisJMHgwMDBjLCAweDAwMGQsIDB4MDAwZSwgMHgwMDBmLAorCS8qIDB4MTAqLworCTB4MDAxMCwgMHgwMDExLCAweDAwMTIsIDB4MDAxMywKKwkweDAwMTQsIDB4MDAxNSwgMHgwMDE2LCAweDAwMTcsCisJMHgwMDE4LCAweDAwMTksIDB4MDAxYSwgMHgwMDFiLAorCTB4MDAxYywgMHgwMDFkLCAweDAwMWUsIDB4MDAxZiwKKwkvKiAweDIwKi8KKwkweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsCisJMHgwMDI0LCAweDA2NmEsIDB4MDAyNiwgMHgwMDI3LAorCTB4MDAyOCwgMHgwMDI5LCAweDAwMmEsIDB4MDAyYiwKKwkweDAwMmMsIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsCisJLyogMHgzMCovCisJMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLAorCTB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKwkweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsCisJMHgwMDNjLCAweDAwM2QsIDB4MDAzZSwgMHgwMDNmLAorCS8qIDB4NDAqLworCTB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywKKwkweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCisJMHgwMDQ4LCAweDAwNDksIDB4MDA0YSwgMHgwMDRiLAorCTB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKKwkvKiAweDUwKi8KKwkweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsCisJMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LAorCTB4MDA1OCwgMHgwMDU5LCAweDAwNWEsIDB4MDA1YiwKKwkweDAwNWMsIDB4MDA1ZCwgMHgwMDVlLCAweDAwNWYsCisJLyogMHg2MCovCisJMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLAorCTB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywKKwkweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsCisJMHgwMDZjLCAweDAwNmQsIDB4MDA2ZSwgMHgwMDZmLAorCS8qIDB4NzAqLworCTB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywKKwkweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCisJMHgwMDc4LCAweDAwNzksIDB4MDA3YSwgMHgwMDdiLAorCTB4MDA3YywgMHgwMDdkLCAweDAwN2UsIDB4MDA3ZiwKKwkvKiAweDgwKi8KKwkweDAwYjAsIDB4MDBiNywgMHgyMjE5LCAweDIyMWEsCisJMHgyNTkyLCAweDI1MDAsIDB4MjUwMiwgMHgyNTNjLAorCTB4MjUyNCwgMHgyNTJjLCAweDI1MWMsIDB4MjUzNCwKKwkweDI1MTAsIDB4MjUwYywgMHgyNTE0LCAweDI1MTgsCisJLyogMHg5MCovCisJMHgwM2IyLCAweDIyMWUsIDB4MDNjNiwgMHgwMGIxLAorCTB4MDBiZCwgMHgwMGJjLCAweDIyNDgsIDB4MDBhYiwKKwkweDAwYmIsIDB4ZmVmNywgMHhmZWY4LCAweDAwMDAsCisJMHgwMDAwLCAweGZlZmIsIDB4ZmVmYywgMHgwMDAwLAorCS8qIDB4YTAqLworCTB4MDBhMCwgMHgwMGFkLCAweGZlODIsIDB4MDBhMywKKwkweDAwYTQsIDB4ZmU4NCwgMHgwMDAwLCAweDAwMDAsCisJMHhmZThlLCAweGZlOGYsIDB4ZmU5NSwgMHhmZTk5LAorCTB4MDYwYywgMHhmZTlkLCAweGZlYTEsIDB4ZmVhNSwKKwkvKiAweGIwKi8KKwkweDA2NjAsIDB4MDY2MSwgMHgwNjYyLCAweDA2NjMsCisJMHgwNjY0LCAweDA2NjUsIDB4MDY2NiwgMHgwNjY3LAorCTB4MDY2OCwgMHgwNjY5LCAweGZlZDEsIDB4MDYxYiwKKwkweGZlYjEsIDB4ZmViNSwgMHhmZWI5LCAweDA2MWYsCisJLyogMHhjMCovCisJMHgwMGEyLCAweGZlODAsIDB4ZmU4MSwgMHhmZTgzLAorCTB4ZmU4NSwgMHhmZWNhLCAweGZlOGIsIDB4ZmU4ZCwKKwkweGZlOTEsIDB4ZmU5MywgMHhmZTk3LCAweGZlOWIsCisJMHhmZTlmLCAweGZlYTMsIDB4ZmVhNywgMHhmZWE5LAorCS8qIDB4ZDAqLworCTB4ZmVhYiwgMHhmZWFkLCAweGZlYWYsIDB4ZmViMywKKwkweGZlYjcsIDB4ZmViYiwgMHhmZWJmLCAweGZlYzEsCisJMHhmZWM1LCAweGZlY2IsIDB4ZmVjZiwgMHgwMGE2LAorCTB4MDBhYywgMHgwMGY3LCAweDAwZDcsIDB4ZmVjOSwKKwkvKiAweGUwKi8KKwkweDA2NDAsIDB4ZmVkMywgMHhmZWQ3LCAweGZlZGIsCisJMHhmZWRmLCAweGZlZTMsIDB4ZmVlNywgMHhmZWViLAorCTB4ZmVlZCwgMHhmZWVmLCAweGZlZjMsIDB4ZmViZCwKKwkweGZlY2MsIDB4ZmVjZSwgMHhmZWNkLCAweGZlZTEsCisJLyogMHhmMCovCisJMHhmZTdkLCAweDA2NTEsIDB4ZmVlNSwgMHhmZWU5LAorCTB4ZmVlYywgMHhmZWYwLCAweGZlZjIsIDB4ZmVkMCwKKwkweGZlZDUsIDB4ZmVmNSwgMHhmZWY2LCAweGZlZGQsCisJMHhmZWQ5LCAweGZlZjEsIDB4MjVhMCwgMHgwMDAwLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAwWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgwMCwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweDAwLCAweGMwLCAweGEzLCAweGE0LCAweDAwLCAweGRiLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDk3LCAweGRjLCAweGExLCAweDAwLCAweDAwLCAvKiAweGE4LTB4YWYgKi8KKwkweDgwLCAweDkzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgxLCAvKiAweGIwLTB4YjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDk4LCAweDk1LCAweDk0LCAweDAwLCAweDAwLCAvKiAweGI4LTB4YmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGMwLTB4YzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGM4LTB4Y2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGRlLCAvKiAweGQwLTB4ZDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGQ4LTB4ZGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGUwLTB4ZTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGU4LTB4ZWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGRkLCAvKiAweGYwLTB4ZjcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwM1syNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhMC0weGE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhOC0weGFmICovCisJMHgwMCwgMHgwMCwgMHg5MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhiMC0weGI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhiOC0weGJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHgwMCwgLyogMHhjMC0weGM3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDZbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGFjLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweGJiLCAweDAwLCAweDAwLCAweDAwLCAweGJmLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweGUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweGYxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweDYwLTB4NjcgKi8KKwkweGI4LCAweGI5LCAweDI1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyMlsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4ODIsIDB4ODMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTEsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4OTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTI1WzI1Nl0gPSB7CisJMHg4NSwgMHgwMCwgMHg4NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4ZCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHg4YywgMHgwMCwgMHgwMCwgMHgwMCwgMHg4ZSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHg4ZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4YSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4YiwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4NywgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDg0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweGZlLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2VmZVsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3ZiAqLworCisJMHhjMSwgMHhjMiwgMHhhMiwgMHhjMywgMHhhNSwgMHhjNCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhjNiwgMHgwMCwgMHhjNywgMHhhOCwgMHhhOSwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHhjOCwgMHgwMCwgMHhjOSwgMHgwMCwgMHhhYSwgMHgwMCwgMHhjYSwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHhhYiwgMHgwMCwgMHhjYiwgMHgwMCwgMHhhZCwgMHgwMCwgMHhjYywgLyogMHg5OC0weDlmICovCisJMHgwMCwgMHhhZSwgMHgwMCwgMHhjZCwgMHgwMCwgMHhhZiwgMHgwMCwgMHhjZSwgLyogMHhhMC0weGE3ICovCisJMHgwMCwgMHhjZiwgMHgwMCwgMHhkMCwgMHgwMCwgMHhkMSwgMHgwMCwgMHhkMiwgLyogMHhhOC0weGFmICovCisJMHgwMCwgMHhiYywgMHgwMCwgMHhkMywgMHgwMCwgMHhiZCwgMHgwMCwgMHhkNCwgLyogMHhiMC0weGI3ICovCisJMHgwMCwgMHhiZSwgMHgwMCwgMHhkNSwgMHgwMCwgMHhlYiwgMHgwMCwgMHhkNiwgLyogMHhiOC0weGJmICovCisJMHgwMCwgMHhkNywgMHgwMCwgMHgwMCwgMHgwMCwgMHhkOCwgMHgwMCwgMHgwMCwgLyogMHhjMC0weGM3ICovCisJMHgwMCwgMHhkZiwgMHhjNSwgMHhkOSwgMHhlYywgMHhlZSwgMHhlZCwgMHhkYSwgLyogMHhjOC0weGNmICovCisJMHhmNywgMHhiYSwgMHgwMCwgMHhlMSwgMHgwMCwgMHhmOCwgMHgwMCwgMHhlMiwgLyogMHhkMC0weGQ3ICovCisJMHgwMCwgMHhmYywgMHgwMCwgMHhlMywgMHgwMCwgMHhmYiwgMHgwMCwgMHhlNCwgLyogMHhkOC0weGRmICovCisJMHgwMCwgMHhlZiwgMHgwMCwgMHhlNSwgMHgwMCwgMHhmMiwgMHgwMCwgMHhlNiwgLyogMHhlMC0weGU3ICovCisJMHgwMCwgMHhmMywgMHgwMCwgMHhlNywgMHhmNCwgMHhlOCwgMHgwMCwgMHhlOSwgLyogMHhlOC0weGVmICovCisJMHhmNSwgMHhmZCwgMHhmNiwgMHhlYSwgMHgwMCwgMHhmOSwgMHhmYSwgMHg5OSwgLyogMHhmMC0weGY3ICovCisJMHg5YSwgMHgwMCwgMHgwMCwgMHg5ZCwgMHg5ZSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciAqcGFnZV91bmkyY2hhcnNldFsyNTZdID0geworCXBhZ2UwMCwgTlVMTCwgICBOVUxMLCAgIHBhZ2UwMywgTlVMTCwgICBOVUxMLCAgIHBhZ2UwNiwgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgcGFnZTIyLCBOVUxMLCAgIE5VTEwsICAgcGFnZTI1LCBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBwYWdlZmUsIE5VTEwsICAgCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0Mmxvd2VyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg0MC0weDQ3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg0OC0weDRmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg1MC0weDU3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDAwLCAweDAwLCAweDlkLCAweDllLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweGExLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweDAwLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweDAwLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQydXBwZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDYwLTB4NjcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDY4LTB4NmYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDcwLTB4NzcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4OTEsIDB4MDAsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4MDAsIDB4MDAsIDB4OWQsIDB4OWUsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4MDAsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4MDAsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIGludCB1bmkyY2hhcih3Y2hhcl90IHVuaSwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgYm91bmRsZW4pCit7CisJdW5zaWduZWQgY2hhciAqdW5pMmNoYXJzZXQ7CisJdW5zaWduZWQgY2hhciBjbCA9IHVuaSAmIDB4MDBmZjsKKwl1bnNpZ25lZCBjaGFyIGNoID0gKHVuaSAmIDB4ZmYwMCkgPj4gODsKKworCWlmIChib3VuZGxlbiA8PSAwKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCXVuaTJjaGFyc2V0ID0gcGFnZV91bmkyY2hhcnNldFtjaF07CisJaWYgKHVuaTJjaGFyc2V0ICYmIHVuaTJjaGFyc2V0W2NsXSkKKwkJb3V0WzBdID0gdW5pMmNoYXJzZXRbY2xdOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY2hhcjJ1bmkoY29uc3QgdW5zaWduZWQgY2hhciAqcmF3c3RyaW5nLCBpbnQgYm91bmRsZW4sIHdjaGFyX3QgKnVuaSkKK3sKKwkqdW5pID0gY2hhcnNldDJ1bmlbKnJhd3N0cmluZ107CisJaWYgKCp1bmkgPT0gMHgwMDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBubHNfdGFibGUgdGFibGUgPSB7CisJLmNoYXJzZXQJPSAiY3A4NjQiLAorCS51bmkyY2hhcgk9IHVuaTJjaGFyLAorCS5jaGFyMnVuaQk9IGNoYXIydW5pLAorCS5jaGFyc2V0Mmxvd2VyCT0gY2hhcnNldDJsb3dlciwKKwkuY2hhcnNldDJ1cHBlcgk9IGNoYXJzZXQydXBwZXIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9ubHNfY3A4NjQodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X25sc19jcDg2NCh2b2lkKQoreworCXVucmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbmxzX2NwODY0KQorbW9kdWxlX2V4aXQoZXhpdF9ubHNfY3A4NjQpCisKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL25scy9ubHNfY3A4NjUuYyBiL2ZzL25scy9ubHNfY3A4NjUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2FlYWZhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmxzL25sc19jcDg2NS5jCkBAIC0wLDAgKzEsMzg4IEBACisvKgorICogbGludXgvZnMvbmxzX2NwODY1LmMKKyAqCisgKiBDaGFyc2V0IGNwODY1IHRyYW5zbGF0aW9uIHRhYmxlcy4KKyAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIFVuaWNvZGUgYW5kIGNoYXJzZXQKKyAqIHRhYmxlcyBmcm9tIHRoZSBVbmljb2RlIE9yZ2FuaXphdGlvbiAod3d3LnVuaWNvZGUub3JnKS4KKyAqIFRoZSBVbmljb2RlIHRvIGNoYXJzZXQgdGFibGUgaGFzIG9ubHkgZXhhY3QgbWFwcGluZ3MuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKK3N0YXRpYyB3Y2hhcl90IGNoYXJzZXQydW5pWzI1Nl0gPSB7CisJLyogMHgwMCovCisJMHgwMDAwLCAweDAwMDEsIDB4MDAwMiwgMHgwMDAzLAorCTB4MDAwNCwgMHgwMDA1LCAweDAwMDYsIDB4MDAwNywKKwkweDAwMDgsIDB4MDAwOSwgMHgwMDBhLCAweDAwMGIsCisJMHgwMDBjLCAweDAwMGQsIDB4MDAwZSwgMHgwMDBmLAorCS8qIDB4MTAqLworCTB4MDAxMCwgMHgwMDExLCAweDAwMTIsIDB4MDAxMywKKwkweDAwMTQsIDB4MDAxNSwgMHgwMDE2LCAweDAwMTcsCisJMHgwMDE4LCAweDAwMTksIDB4MDAxYSwgMHgwMDFiLAorCTB4MDAxYywgMHgwMDFkLCAweDAwMWUsIDB4MDAxZiwKKwkvKiAweDIwKi8KKwkweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsCisJMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LAorCTB4MDAyOCwgMHgwMDI5LCAweDAwMmEsIDB4MDAyYiwKKwkweDAwMmMsIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsCisJLyogMHgzMCovCisJMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLAorCTB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKwkweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsCisJMHgwMDNjLCAweDAwM2QsIDB4MDAzZSwgMHgwMDNmLAorCS8qIDB4NDAqLworCTB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywKKwkweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCisJMHgwMDQ4LCAweDAwNDksIDB4MDA0YSwgMHgwMDRiLAorCTB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKKwkvKiAweDUwKi8KKwkweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsCisJMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LAorCTB4MDA1OCwgMHgwMDU5LCAweDAwNWEsIDB4MDA1YiwKKwkweDAwNWMsIDB4MDA1ZCwgMHgwMDVlLCAweDAwNWYsCisJLyogMHg2MCovCisJMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLAorCTB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywKKwkweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsCisJMHgwMDZjLCAweDAwNmQsIDB4MDA2ZSwgMHgwMDZmLAorCS8qIDB4NzAqLworCTB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywKKwkweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCisJMHgwMDc4LCAweDAwNzksIDB4MDA3YSwgMHgwMDdiLAorCTB4MDA3YywgMHgwMDdkLCAweDAwN2UsIDB4MDA3ZiwKKwkvKiAweDgwKi8KKwkweDAwYzcsIDB4MDBmYywgMHgwMGU5LCAweDAwZTIsCisJMHgwMGU0LCAweDAwZTAsIDB4MDBlNSwgMHgwMGU3LAorCTB4MDBlYSwgMHgwMGViLCAweDAwZTgsIDB4MDBlZiwKKwkweDAwZWUsIDB4MDBlYywgMHgwMGM0LCAweDAwYzUsCisJLyogMHg5MCovCisJMHgwMGM5LCAweDAwZTYsIDB4MDBjNiwgMHgwMGY0LAorCTB4MDBmNiwgMHgwMGYyLCAweDAwZmIsIDB4MDBmOSwKKwkweDAwZmYsIDB4MDBkNiwgMHgwMGRjLCAweDAwZjgsCisJMHgwMGEzLCAweDAwZDgsIDB4MjBhNywgMHgwMTkyLAorCS8qIDB4YTAqLworCTB4MDBlMSwgMHgwMGVkLCAweDAwZjMsIDB4MDBmYSwKKwkweDAwZjEsIDB4MDBkMSwgMHgwMGFhLCAweDAwYmEsCisJMHgwMGJmLCAweDIzMTAsIDB4MDBhYywgMHgwMGJkLAorCTB4MDBiYywgMHgwMGExLCAweDAwYWIsIDB4MDBhNCwKKwkvKiAweGIwKi8KKwkweDI1OTEsIDB4MjU5MiwgMHgyNTkzLCAweDI1MDIsCisJMHgyNTI0LCAweDI1NjEsIDB4MjU2MiwgMHgyNTU2LAorCTB4MjU1NSwgMHgyNTYzLCAweDI1NTEsIDB4MjU1NywKKwkweDI1NWQsIDB4MjU1YywgMHgyNTViLCAweDI1MTAsCisJLyogMHhjMCovCisJMHgyNTE0LCAweDI1MzQsIDB4MjUyYywgMHgyNTFjLAorCTB4MjUwMCwgMHgyNTNjLCAweDI1NWUsIDB4MjU1ZiwKKwkweDI1NWEsIDB4MjU1NCwgMHgyNTY5LCAweDI1NjYsCisJMHgyNTYwLCAweDI1NTAsIDB4MjU2YywgMHgyNTY3LAorCS8qIDB4ZDAqLworCTB4MjU2OCwgMHgyNTY0LCAweDI1NjUsIDB4MjU1OSwKKwkweDI1NTgsIDB4MjU1MiwgMHgyNTUzLCAweDI1NmIsCisJMHgyNTZhLCAweDI1MTgsIDB4MjUwYywgMHgyNTg4LAorCTB4MjU4NCwgMHgyNThjLCAweDI1OTAsIDB4MjU4MCwKKwkvKiAweGUwKi8KKwkweDAzYjEsIDB4MDBkZiwgMHgwMzkzLCAweDAzYzAsCisJMHgwM2EzLCAweDAzYzMsIDB4MDBiNSwgMHgwM2M0LAorCTB4MDNhNiwgMHgwMzk4LCAweDAzYTksIDB4MDNiNCwKKwkweDIyMWUsIDB4MDNjNiwgMHgwM2I1LCAweDIyMjksCisJLyogMHhmMCovCisJMHgyMjYxLCAweDAwYjEsIDB4MjI2NSwgMHgyMjY0LAorCTB4MjMyMCwgMHgyMzIxLCAweDAwZjcsIDB4MjI0OCwKKwkweDAwYjAsIDB4MjIxOSwgMHgwMGI3LCAweDIyMWEsCisJMHgyMDdmLCAweDAwYjIsIDB4MjVhMCwgMHgwMGEwLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAwWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweGZmLCAweGFkLCAweDAwLCAweDljLCAweGFmLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KKwkweDAwLCAweDAwLCAweGE2LCAweGFlLCAweGFhLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGE4LTB4YWYgKi8KKwkweGY4LCAweGYxLCAweGZkLCAweDAwLCAweDAwLCAweGU2LCAweDAwLCAweGZhLCAvKiAweGIwLTB4YjcgKi8KKwkweDAwLCAweDAwLCAweGE3LCAweDAwLCAweGFjLCAweGFiLCAweDAwLCAweGE4LCAvKiAweGI4LTB4YmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhlLCAweDhmLCAweDkyLCAweDgwLCAvKiAweGMwLTB4YzcgKi8KKwkweDAwLCAweDkwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGM4LTB4Y2YgKi8KKwkweDAwLCAweGE1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk5LCAweDAwLCAvKiAweGQwLTB4ZDcgKi8KKwkweDlkLCAweDAwLCAweDAwLCAweDAwLCAweDlhLCAweDAwLCAweDAwLCAweGUxLCAvKiAweGQ4LTB4ZGYgKi8KKwkweDg1LCAweGEwLCAweDgzLCAweDAwLCAweDg0LCAweDg2LCAweDkxLCAweDg3LCAvKiAweGUwLTB4ZTcgKi8KKwkweDhhLCAweDgyLCAweDg4LCAweDg5LCAweDhkLCAweGExLCAweDhjLCAweDhiLCAvKiAweGU4LTB4ZWYgKi8KKwkweDAwLCAweGE0LCAweDk1LCAweGEyLCAweDkzLCAweDAwLCAweDk0LCAweGY2LCAvKiAweGYwLTB4ZjcgKi8KKwkweDliLCAweDk3LCAweGEzLCAweDk2LCAweDgxLCAweDAwLCAweDAwLCAweDk4LCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMVsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHg5ZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDNbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4ZTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4ZTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4ZTQsIDB4MDAsIDB4MDAsIDB4ZTgsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworCTB4MDAsIDB4ZWEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTgtMHhhZiAqLworCTB4MDAsIDB4ZTAsIDB4MDAsIDB4MDAsIDB4ZWIsIDB4ZWUsIDB4MDAsIDB4MDAsIC8qIDB4YjAtMHhiNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YjgtMHhiZiAqLworCTB4ZTMsIDB4MDAsIDB4MDAsIDB4ZTUsIDB4ZTcsIDB4MDAsIDB4ZWQsIDB4MDAsIC8qIDB4YzAtMHhjNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTIwWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmYywgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDllLCAvKiAweGEwLTB4YTcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyMlsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4ZjksIDB4ZmIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZWMsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4ZWYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4ZjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4ZjAsIDB4MDAsIDB4MDAsIDB4ZjMsIDB4ZjIsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTIzWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHhhOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHhmNCwgMHhmNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjVbMjU2XSA9IHsKKwkweGM0LCAweDAwLCAweGIzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGRhLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweGJmLCAweDAwLCAweDAwLCAweDAwLCAweGMwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweGQ5LCAweDAwLCAweDAwLCAweDAwLCAweGMzLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGI0LCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGMyLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGMxLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGM1LCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweGNkLCAweGJhLCAweGQ1LCAweGQ2LCAweGM5LCAweGI4LCAweGI3LCAweGJiLCAvKiAweDUwLTB4NTcgKi8KKwkweGQ0LCAweGQzLCAweGM4LCAweGJlLCAweGJkLCAweGJjLCAweGM2LCAweGM3LCAvKiAweDU4LTB4NWYgKi8KKwkweGNjLCAweGI1LCAweGI2LCAweGI5LCAweGQxLCAweGQyLCAweGNiLCAweGNmLCAvKiAweDYwLTB4NjcgKi8KKwkweGQwLCAweGNhLCAweGQ4LCAweGQ3LCAweGNlLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ZGYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZGMsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4ZGIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZGQsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4ZGUsIDB4YjAsIDB4YjEsIDB4YjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4ZmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnBhZ2VfdW5pMmNoYXJzZXRbMjU2XSA9IHsKKwlwYWdlMDAsIHBhZ2UwMSwgTlVMTCwgICBwYWdlMDMsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJcGFnZTIwLCBOVUxMLCAgIHBhZ2UyMiwgcGFnZTIzLCBOVUxMLCAgIHBhZ2UyNSwgTlVMTCwgICBOVUxMLCAgIAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJsb3dlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NDAtMHg0NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NTAtMHg1NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4NywgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4NCwgMHg4NiwgLyogMHg4OC0weDhmICovCisJMHg4MiwgMHg5MSwgMHg5MSwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5NCwgMHg4MSwgMHg5YiwgMHg5YywgMHg5YiwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNCwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHgwMCwgMHhlMywgMHhlNSwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlZCwgMHgwMCwgMHgwMCwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0MnVwcGVyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg2MC0weDY3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg2OC0weDZmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg3MC0weDc3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDlhLCAweDkwLCAweDAwLCAweDhlLCAweDAwLCAweDhmLCAweDgwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkyLCAweDkyLCAweDAwLCAweDk5LCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDk5LCAweDlhLCAweDlkLCAweDljLCAweDlkLCAweDllLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGE1LCAweGE1LCAweGE2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweDAwLCAweGUxLCAweGUyLCAweDAwLCAweGU0LCAweGU0LCAweDAwLCAweDAwLCAvKiAweGUwLTB4ZTcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweDAwLCAweGVjLCAweGU4LCAweDAwLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyBpbnQgdW5pMmNoYXIod2NoYXJfdCB1bmksIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50IGJvdW5kbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnVuaTJjaGFyc2V0OworCXVuc2lnbmVkIGNoYXIgY2wgPSB1bmkgJiAweDAwZmY7CisJdW5zaWduZWQgY2hhciBjaCA9ICh1bmkgJiAweGZmMDApID4+IDg7CisKKwlpZiAoYm91bmRsZW4gPD0gMCkKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwl1bmkyY2hhcnNldCA9IHBhZ2VfdW5pMmNoYXJzZXRbY2hdOworCWlmICh1bmkyY2hhcnNldCAmJiB1bmkyY2hhcnNldFtjbF0pCisJCW91dFswXSA9IHVuaTJjaGFyc2V0W2NsXTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNoYXIydW5pKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJhd3N0cmluZywgaW50IGJvdW5kbGVuLCB3Y2hhcl90ICp1bmkpCit7CisJKnVuaSA9IGNoYXJzZXQydW5pWypyYXdzdHJpbmddOworCWlmICgqdW5pID09IDB4MDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmxzX3RhYmxlIHRhYmxlID0geworCS5jaGFyc2V0CT0gImNwODY1IiwKKwkudW5pMmNoYXIJPSB1bmkyY2hhciwKKwkuY2hhcjJ1bmkJPSBjaGFyMnVuaSwKKwkuY2hhcnNldDJsb3dlcgk9IGNoYXJzZXQybG93ZXIsCisJLmNoYXJzZXQydXBwZXIJPSBjaGFyc2V0MnVwcGVyLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmxzX2NwODY1KHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX25scygmdGFibGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9ubHNfY3A4NjUodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25scygmdGFibGUpOworfQorCittb2R1bGVfaW5pdChpbml0X25sc19jcDg2NSkKK21vZHVsZV9leGl0KGV4aXRfbmxzX2NwODY1KQorCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CmRpZmYgLS1naXQgYS9mcy9ubHMvbmxzX2NwODY2LmMgYi9mcy9ubHMvbmxzX2NwODY2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJiNGE5YQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25scy9ubHNfY3A4NjYuYwpAQCAtMCwwICsxLDMwNiBAQAorLyoKKyAqIGxpbnV4L2ZzL25sc19jcDg2Ni5jCisgKgorICogQ2hhcnNldCBjcDg2NiB0cmFuc2xhdGlvbiB0YWJsZXMuCisgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBVbmljb2RlIGFuZCBjaGFyc2V0CisgKiB0YWJsZXMgZnJvbSB0aGUgVW5pY29kZSBPcmdhbml6YXRpb24gKHd3dy51bmljb2RlLm9yZykuCisgKiBUaGUgVW5pY29kZSB0byBjaGFyc2V0IHRhYmxlIGhhcyBvbmx5IGV4YWN0IG1hcHBpbmdzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCitzdGF0aWMgd2NoYXJfdCBjaGFyc2V0MnVuaVsyNTZdID0geworCS8qIDB4MDAqLworCTB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywKKwkweDAwMDQsIDB4MDAwNSwgMHgwMDA2LCAweDAwMDcsCisJMHgwMDA4LCAweDAwMDksIDB4MDAwYSwgMHgwMDBiLAorCTB4MDAwYywgMHgwMDBkLCAweDAwMGUsIDB4MDAwZiwKKwkvKiAweDEwKi8KKwkweDAwMTAsIDB4MDAxMSwgMHgwMDEyLCAweDAwMTMsCisJMHgwMDE0LCAweDAwMTUsIDB4MDAxNiwgMHgwMDE3LAorCTB4MDAxOCwgMHgwMDE5LCAweDAwMWEsIDB4MDAxYiwKKwkweDAwMWMsIDB4MDAxZCwgMHgwMDFlLCAweDAwMWYsCisJLyogMHgyMCovCisJMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLAorCTB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKwkweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsCisJMHgwMDJjLCAweDAwMmQsIDB4MDAyZSwgMHgwMDJmLAorCS8qIDB4MzAqLworCTB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywKKwkweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisJMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLAorCTB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKwkvKiAweDQwKi8KKwkweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsCisJMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAorCTB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwKKwkweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsCisJLyogMHg1MCovCisJMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLAorCTB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKwkweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsCisJMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLAorCS8qIDB4NjAqLworCTB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywKKwkweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisJMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLAorCTB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKKwkvKiAweDcwKi8KKwkweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsCisJMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LAorCTB4MDA3OCwgMHgwMDc5LCAweDAwN2EsIDB4MDA3YiwKKwkweDAwN2MsIDB4MDA3ZCwgMHgwMDdlLCAweDAwN2YsCisJLyogMHg4MCovCisJMHgwNDEwLCAweDA0MTEsIDB4MDQxMiwgMHgwNDEzLAorCTB4MDQxNCwgMHgwNDE1LCAweDA0MTYsIDB4MDQxNywKKwkweDA0MTgsIDB4MDQxOSwgMHgwNDFhLCAweDA0MWIsCisJMHgwNDFjLCAweDA0MWQsIDB4MDQxZSwgMHgwNDFmLAorCS8qIDB4OTAqLworCTB4MDQyMCwgMHgwNDIxLCAweDA0MjIsIDB4MDQyMywKKwkweDA0MjQsIDB4MDQyNSwgMHgwNDI2LCAweDA0MjcsCisJMHgwNDI4LCAweDA0MjksIDB4MDQyYSwgMHgwNDJiLAorCTB4MDQyYywgMHgwNDJkLCAweDA0MmUsIDB4MDQyZiwKKwkvKiAweGEwKi8KKwkweDA0MzAsIDB4MDQzMSwgMHgwNDMyLCAweDA0MzMsCisJMHgwNDM0LCAweDA0MzUsIDB4MDQzNiwgMHgwNDM3LAorCTB4MDQzOCwgMHgwNDM5LCAweDA0M2EsIDB4MDQzYiwKKwkweDA0M2MsIDB4MDQzZCwgMHgwNDNlLCAweDA0M2YsCisJLyogMHhiMCovCisJMHgyNTkxLCAweDI1OTIsIDB4MjU5MywgMHgyNTAyLAorCTB4MjUyNCwgMHgyNTYxLCAweDI1NjIsIDB4MjU1NiwKKwkweDI1NTUsIDB4MjU2MywgMHgyNTUxLCAweDI1NTcsCisJMHgyNTVkLCAweDI1NWMsIDB4MjU1YiwgMHgyNTEwLAorCS8qIDB4YzAqLworCTB4MjUxNCwgMHgyNTM0LCAweDI1MmMsIDB4MjUxYywKKwkweDI1MDAsIDB4MjUzYywgMHgyNTVlLCAweDI1NWYsCisJMHgyNTVhLCAweDI1NTQsIDB4MjU2OSwgMHgyNTY2LAorCTB4MjU2MCwgMHgyNTUwLCAweDI1NmMsIDB4MjU2NywKKwkvKiAweGQwKi8KKwkweDI1NjgsIDB4MjU2NCwgMHgyNTY1LCAweDI1NTksCisJMHgyNTU4LCAweDI1NTIsIDB4MjU1MywgMHgyNTZiLAorCTB4MjU2YSwgMHgyNTE4LCAweDI1MGMsIDB4MjU4OCwKKwkweDI1ODQsIDB4MjU4YywgMHgyNTkwLCAweDI1ODAsCisJLyogMHhlMCovCisJMHgwNDQwLCAweDA0NDEsIDB4MDQ0MiwgMHgwNDQzLAorCTB4MDQ0NCwgMHgwNDQ1LCAweDA0NDYsIDB4MDQ0NywKKwkweDA0NDgsIDB4MDQ0OSwgMHgwNDRhLCAweDA0NGIsCisJMHgwNDRjLCAweDA0NGQsIDB4MDQ0ZSwgMHgwNDRmLAorCS8qIDB4ZjAqLworCTB4MDQwMSwgMHgwNDUxLCAweDA0MDQsIDB4MDQ1NCwKKwkweDA0MDcsIDB4MDQ1NywgMHgwNDBlLCAweDA0NWUsCisJMHgwMGIwLCAweDIyMTksIDB4MDBiNywgMHgyMjFhLAorCTB4MjExNiwgMHgwMGE0LCAweDI1YTAsIDB4MDBhMCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMFsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhMC0weGE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhOC0weGFmICovCisJMHhmOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmYSwgLyogMHhiMC0weGI3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDRbMjU2XSA9IHsKKwkweDAwLCAweGYwLCAweDAwLCAweDAwLCAweGYyLCAweDAwLCAweDAwLCAweGY0LCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGY2LCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDEwLTB4MTcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDE4LTB4MWYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDIwLTB4MjcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDI4LTB4MmYgKi8KKwkweGEwLCAweGExLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LCAweGE3LCAvKiAweDMwLTB4MzcgKi8KKwkweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweDM4LTB4M2YgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweDQwLTB4NDcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweGYxLCAweDAwLCAweDAwLCAweGYzLCAweDAwLCAweDAwLCAweGY1LCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGY3LCAweDAwLCAvKiAweDU4LTB4NWYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyMVsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmMsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTIyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHhmOSwgMHhmYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjVbMjU2XSA9IHsKKwkweGM0LCAweDAwLCAweGIzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGRhLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweGJmLCAweDAwLCAweDAwLCAweDAwLCAweGMwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweGQ5LCAweDAwLCAweDAwLCAweDAwLCAweGMzLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGI0LCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGMyLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGMxLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGM1LCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweGNkLCAweGJhLCAweGQ1LCAweGQ2LCAweGM5LCAweGI4LCAweGI3LCAweGJiLCAvKiAweDUwLTB4NTcgKi8KKwkweGQ0LCAweGQzLCAweGM4LCAweGJlLCAweGJkLCAweGJjLCAweGM2LCAweGM3LCAvKiAweDU4LTB4NWYgKi8KKwkweGNjLCAweGI1LCAweGI2LCAweGI5LCAweGQxLCAweGQyLCAweGNiLCAweGNmLCAvKiAweDYwLTB4NjcgKi8KKwkweGQwLCAweGNhLCAweGQ4LCAweGQ3LCAweGNlLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ZGYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZGMsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4ZGIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZGQsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4ZGUsIDB4YjAsIDB4YjEsIDB4YjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4ZmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnBhZ2VfdW5pMmNoYXJzZXRbMjU2XSA9IHsKKwlwYWdlMDAsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIHBhZ2UwNCwgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBwYWdlMjEsIHBhZ2UyMiwgTlVMTCwgICBOVUxMLCAgIHBhZ2UyNSwgTlVMTCwgICBOVUxMLCAgIAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJsb3dlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NDAtMHg0NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NTAtMHg1NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHg4MC0weDg3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHg4OC0weDhmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHg5MC0weDk3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMSwgMHhmMSwgMHhmMywgMHhmMywgMHhmNSwgMHhmNSwgMHhmNywgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0MnVwcGVyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg2MC0weDY3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg2OC0weDZmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg3MC0weDc3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweGEwLTB4YTcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweGUwLTB4ZTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYwLCAweGYyLCAweGYyLCAweGY0LCAweGY0LCAweGY2LCAweGY2LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyBpbnQgdW5pMmNoYXIod2NoYXJfdCB1bmksIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50IGJvdW5kbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnVuaTJjaGFyc2V0OworCXVuc2lnbmVkIGNoYXIgY2wgPSB1bmkgJiAweDAwZmY7CisJdW5zaWduZWQgY2hhciBjaCA9ICh1bmkgJiAweGZmMDApID4+IDg7CisKKwlpZiAoYm91bmRsZW4gPD0gMCkKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwl1bmkyY2hhcnNldCA9IHBhZ2VfdW5pMmNoYXJzZXRbY2hdOworCWlmICh1bmkyY2hhcnNldCAmJiB1bmkyY2hhcnNldFtjbF0pCisJCW91dFswXSA9IHVuaTJjaGFyc2V0W2NsXTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNoYXIydW5pKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJhd3N0cmluZywgaW50IGJvdW5kbGVuLCB3Y2hhcl90ICp1bmkpCit7CisJKnVuaSA9IGNoYXJzZXQydW5pWypyYXdzdHJpbmddOworCWlmICgqdW5pID09IDB4MDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmxzX3RhYmxlIHRhYmxlID0geworCS5jaGFyc2V0CT0gImNwODY2IiwKKwkudW5pMmNoYXIJPSB1bmkyY2hhciwKKwkuY2hhcjJ1bmkJPSBjaGFyMnVuaSwKKwkuY2hhcnNldDJsb3dlcgk9IGNoYXJzZXQybG93ZXIsCisJLmNoYXJzZXQydXBwZXIJPSBjaGFyc2V0MnVwcGVyLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmxzX2NwODY2KHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX25scygmdGFibGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9ubHNfY3A4NjYodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25scygmdGFibGUpOworfQorCittb2R1bGVfaW5pdChpbml0X25sc19jcDg2NikKK21vZHVsZV9leGl0KGV4aXRfbmxzX2NwODY2KQorCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CmRpZmYgLS1naXQgYS9mcy9ubHMvbmxzX2NwODY5LmMgYi9mcy9ubHMvbmxzX2NwODY5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJiNDM2ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25scy9ubHNfY3A4NjkuYwpAQCAtMCwwICsxLDMxNiBAQAorLyoKKyAqIGxpbnV4L2ZzL25sc19jcDg2OS5jCisgKgorICogQ2hhcnNldCBjcDg2OSB0cmFuc2xhdGlvbiB0YWJsZXMuCisgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBVbmljb2RlIGFuZCBjaGFyc2V0CisgKiB0YWJsZXMgZnJvbSB0aGUgVW5pY29kZSBPcmdhbml6YXRpb24gKHd3dy51bmljb2RlLm9yZykuCisgKiBUaGUgVW5pY29kZSB0byBjaGFyc2V0IHRhYmxlIGhhcyBvbmx5IGV4YWN0IG1hcHBpbmdzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCitzdGF0aWMgd2NoYXJfdCBjaGFyc2V0MnVuaVsyNTZdID0geworCS8qIDB4MDAqLworCTB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywKKwkweDAwMDQsIDB4MDAwNSwgMHgwMDA2LCAweDAwMDcsCisJMHgwMDA4LCAweDAwMDksIDB4MDAwYSwgMHgwMDBiLAorCTB4MDAwYywgMHgwMDBkLCAweDAwMGUsIDB4MDAwZiwKKwkvKiAweDEwKi8KKwkweDAwMTAsIDB4MDAxMSwgMHgwMDEyLCAweDAwMTMsCisJMHgwMDE0LCAweDAwMTUsIDB4MDAxNiwgMHgwMDE3LAorCTB4MDAxOCwgMHgwMDE5LCAweDAwMWEsIDB4MDAxYiwKKwkweDAwMWMsIDB4MDAxZCwgMHgwMDFlLCAweDAwMWYsCisJLyogMHgyMCovCisJMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLAorCTB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKwkweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsCisJMHgwMDJjLCAweDAwMmQsIDB4MDAyZSwgMHgwMDJmLAorCS8qIDB4MzAqLworCTB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywKKwkweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisJMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLAorCTB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKwkvKiAweDQwKi8KKwkweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsCisJMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAorCTB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwKKwkweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsCisJLyogMHg1MCovCisJMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLAorCTB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKwkweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsCisJMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLAorCS8qIDB4NjAqLworCTB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywKKwkweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisJMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLAorCTB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKKwkvKiAweDcwKi8KKwkweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsCisJMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LAorCTB4MDA3OCwgMHgwMDc5LCAweDAwN2EsIDB4MDA3YiwKKwkweDAwN2MsIDB4MDA3ZCwgMHgwMDdlLCAweDAwN2YsCisJLyogMHg4MCovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAzODYsIDB4MDAwMCwKKwkweDAwYjcsIDB4MDBhYywgMHgwMGE2LCAweDIwMTgsCisJMHgyMDE5LCAweDAzODgsIDB4MjAxNSwgMHgwMzg5LAorCS8qIDB4OTAqLworCTB4MDM4YSwgMHgwM2FhLCAweDAzOGMsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDM4ZSwgMHgwM2FiLCAweDAwYTksCisJMHgwMzhmLCAweDAwYjIsIDB4MDBiMywgMHgwM2FjLAorCTB4MDBhMywgMHgwM2FkLCAweDAzYWUsIDB4MDNhZiwKKwkvKiAweGEwKi8KKwkweDAzY2EsIDB4MDM5MCwgMHgwM2NjLCAweDAzY2QsCisJMHgwMzkxLCAweDAzOTIsIDB4MDM5MywgMHgwMzk0LAorCTB4MDM5NSwgMHgwMzk2LCAweDAzOTcsIDB4MDBiZCwKKwkweDAzOTgsIDB4MDM5OSwgMHgwMGFiLCAweDAwYmIsCisJLyogMHhiMCovCisJMHgyNTkxLCAweDI1OTIsIDB4MjU5MywgMHgyNTAyLAorCTB4MjUyNCwgMHgwMzlhLCAweDAzOWIsIDB4MDM5YywKKwkweDAzOWQsIDB4MjU2MywgMHgyNTUxLCAweDI1NTcsCisJMHgyNTVkLCAweDAzOWUsIDB4MDM5ZiwgMHgyNTEwLAorCS8qIDB4YzAqLworCTB4MjUxNCwgMHgyNTM0LCAweDI1MmMsIDB4MjUxYywKKwkweDI1MDAsIDB4MjUzYywgMHgwM2EwLCAweDAzYTEsCisJMHgyNTVhLCAweDI1NTQsIDB4MjU2OSwgMHgyNTY2LAorCTB4MjU2MCwgMHgyNTUwLCAweDI1NmMsIDB4MDNhMywKKwkvKiAweGQwKi8KKwkweDAzYTQsIDB4MDNhNSwgMHgwM2E2LCAweDAzYTcsCisJMHgwM2E4LCAweDAzYTksIDB4MDNiMSwgMHgwM2IyLAorCTB4MDNiMywgMHgyNTE4LCAweDI1MGMsIDB4MjU4OCwKKwkweDI1ODQsIDB4MDNiNCwgMHgwM2I1LCAweDI1ODAsCisJLyogMHhlMCovCisJMHgwM2I2LCAweDAzYjcsIDB4MDNiOCwgMHgwM2I5LAorCTB4MDNiYSwgMHgwM2JiLCAweDAzYmMsIDB4MDNiZCwKKwkweDAzYmUsIDB4MDNiZiwgMHgwM2MwLCAweDAzYzEsCisJMHgwM2MzLCAweDAzYzIsIDB4MDNjNCwgMHgwMzg0LAorCS8qIDB4ZjAqLworCTB4MDBhZCwgMHgwMGIxLCAweDAzYzUsIDB4MDNjNiwKKwkweDAzYzcsIDB4MDBhNywgMHgwM2M4LCAweDAzODUsCisJMHgwMGIwLCAweDAwYTgsIDB4MDNjOSwgMHgwM2NiLAorCTB4MDNiMCwgMHgwM2NlLCAweDI1YTAsIDB4MDBhMCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMFsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHhmZiwgMHgwMCwgMHgwMCwgMHg5YywgMHgwMCwgMHgwMCwgMHg4YSwgMHhmNSwgLyogMHhhMC0weGE3ICovCisJMHhmOSwgMHg5NywgMHgwMCwgMHhhZSwgMHg4OSwgMHhmMCwgMHgwMCwgMHgwMCwgLyogMHhhOC0weGFmICovCisJMHhmOCwgMHhmMSwgMHg5OSwgMHg5YSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgLyogMHhiMC0weGI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhhZiwgMHgwMCwgMHhhYiwgMHgwMCwgMHgwMCwgLyogMHhiOC0weGJmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDNbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZWYsIDB4ZjcsIDB4ODYsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4OGQsIDB4OGYsIDB4OTAsIDB4MDAsIDB4OTIsIDB4MDAsIDB4OTUsIDB4OTgsIC8qIDB4ODgtMHg4ZiAqLworCTB4YTEsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIDB4YTgsIDB4YTksIDB4YWEsIC8qIDB4OTAtMHg5NyAqLworCTB4YWMsIDB4YWQsIDB4YjUsIDB4YjYsIDB4YjcsIDB4YjgsIDB4YmQsIDB4YmUsIC8qIDB4OTgtMHg5ZiAqLworCTB4YzYsIDB4YzcsIDB4MDAsIDB4Y2YsIDB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIC8qIDB4YTAtMHhhNyAqLworCTB4ZDQsIDB4ZDUsIDB4OTEsIDB4OTYsIDB4OWIsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4YTgtMHhhZiAqLworCTB4ZmMsIDB4ZDYsIDB4ZDcsIDB4ZDgsIDB4ZGQsIDB4ZGUsIDB4ZTAsIDB4ZTEsIC8qIDB4YjAtMHhiNyAqLworCTB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIDB4ZTgsIDB4ZTksIC8qIDB4YjgtMHhiZiAqLworCTB4ZWEsIDB4ZWIsIDB4ZWQsIDB4ZWMsIDB4ZWUsIDB4ZjIsIDB4ZjMsIDB4ZjQsIC8qIDB4YzAtMHhjNyAqLworCTB4ZjYsIDB4ZmEsIDB4YTAsIDB4ZmIsIDB4YTIsIDB4YTMsIDB4ZmQsIDB4MDAsIC8qIDB4YzgtMHhjZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTIwWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4ZSwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHg4YiwgMHg4YywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjVbMjU2XSA9IHsKKwkweGM0LCAweDAwLCAweGIzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGRhLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweGJmLCAweDAwLCAweDAwLCAweDAwLCAweGMwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweGQ5LCAweDAwLCAweDAwLCAweDAwLCAweGMzLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGI0LCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGMyLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGMxLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGM1LCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweGNkLCAweGJhLCAweDAwLCAweDAwLCAweGM5LCAweDAwLCAweDAwLCAweGJiLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweGM4LCAweDAwLCAweDAwLCAweGJjLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweGNjLCAweDAwLCAweDAwLCAweGI5LCAweDAwLCAweDAwLCAweGNiLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweGNhLCAweDAwLCAweDAwLCAweGNlLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ZGYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZGMsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4ZGIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4YjAsIDB4YjEsIDB4YjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4ZmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnBhZ2VfdW5pMmNoYXJzZXRbMjU2XSA9IHsKKwlwYWdlMDAsIE5VTEwsICAgTlVMTCwgICBwYWdlMDMsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJcGFnZTIwLCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIHBhZ2UyNSwgTlVMTCwgICBOVUxMLCAgIAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJsb3dlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NDAtMHg0NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NTAtMHg1NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5YiwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg5ZCwgMHg4ZSwgMHg5ZSwgLyogMHg4OC0weDhmICovCisJMHg5ZiwgMHhhMCwgMHhhMiwgMHgwMCwgMHgwMCwgMHhhMywgMHhmYiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHhmZCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhkNiwgMHhkNywgMHhkOCwgMHhkZCwgLyogMHhhMC0weGE3ICovCisJMHhkZSwgMHhlMCwgMHhlMSwgMHhhYiwgMHhlMiwgMHhlMywgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhlNCwgMHhlNSwgMHhlNiwgLyogMHhiMC0weGI3ICovCisJMHhlNywgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhlOCwgMHhlOSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhlYSwgMHhlYiwgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhlYywgLyogMHhjOC0weGNmICovCisJMHhlZSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNiwgMHhmYSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0MnVwcGVyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg2MC0weDY3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg2OC0weDZmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg3MC0weDc3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg2LCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDAwLCAweDAwLCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDg2LCAweDljLCAweDhkLCAweDhmLCAweDkwLCAvKiAweDk4LTB4OWYgKi8KKwkweDkxLCAweGExLCAweDkyLCAweDk1LCAweGE0LCAweGE1LCAweGE2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGE0LCAweGE1LCAvKiAweGQwLTB4ZDcgKi8KKwkweGE2LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGE3LCAweGE4LCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGE5LCAweGFhLCAweGFjLCAweGFkLCAweGI1LCAweGI2LCAweGI3LCAweGI4LCAvKiAweGUwLTB4ZTcgKi8KKwkweGJkLCAweGJlLCAweGM2LCAweGM3LCAweGNmLCAweGNmLCAweGQwLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYxLCAweGQxLCAweGQyLCAweGQzLCAweGY1LCAweGQ0LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGQ1LCAweDk2LCAweGZjLCAweDk4LCAweGZlLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyBpbnQgdW5pMmNoYXIod2NoYXJfdCB1bmksIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50IGJvdW5kbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnVuaTJjaGFyc2V0OworCXVuc2lnbmVkIGNoYXIgY2wgPSB1bmkgJiAweDAwZmY7CisJdW5zaWduZWQgY2hhciBjaCA9ICh1bmkgJiAweGZmMDApID4+IDg7CisKKwlpZiAoYm91bmRsZW4gPD0gMCkKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwl1bmkyY2hhcnNldCA9IHBhZ2VfdW5pMmNoYXJzZXRbY2hdOworCWlmICh1bmkyY2hhcnNldCAmJiB1bmkyY2hhcnNldFtjbF0pCisJCW91dFswXSA9IHVuaTJjaGFyc2V0W2NsXTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNoYXIydW5pKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJhd3N0cmluZywgaW50IGJvdW5kbGVuLCB3Y2hhcl90ICp1bmkpCit7CisJKnVuaSA9IGNoYXJzZXQydW5pWypyYXdzdHJpbmddOworCWlmICgqdW5pID09IDB4MDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmxzX3RhYmxlIHRhYmxlID0geworCS5jaGFyc2V0CT0gImNwODY5IiwKKwkudW5pMmNoYXIJPSB1bmkyY2hhciwKKwkuY2hhcjJ1bmkJPSBjaGFyMnVuaSwKKwkuY2hhcnNldDJsb3dlcgk9IGNoYXJzZXQybG93ZXIsCisJLmNoYXJzZXQydXBwZXIJPSBjaGFyc2V0MnVwcGVyLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmxzX2NwODY5KHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX25scygmdGFibGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9ubHNfY3A4Njkodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25scygmdGFibGUpOworfQorCittb2R1bGVfaW5pdChpbml0X25sc19jcDg2OSkKK21vZHVsZV9leGl0KGV4aXRfbmxzX2NwODY5KQorCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CmRpZmYgLS1naXQgYS9mcy9ubHMvbmxzX2NwODc0LmMgYi9mcy9ubHMvbmxzX2NwODc0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU3NjZhMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25scy9ubHNfY3A4NzQuYwpAQCAtMCwwICsxLDI3NiBAQAorLyoKKyAqIGxpbnV4L2ZzL25sc19jcDg3NC5jCisgKgorICogQ2hhcnNldCBjcDg3NCB0cmFuc2xhdGlvbiB0YWJsZXMuCisgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBVbmljb2RlIGFuZCBjaGFyc2V0CisgKiB0YWJsZXMgZnJvbSB0aGUgVW5pY29kZSBPcmdhbml6YXRpb24gKHd3dy51bmljb2RlLm9yZykuCisgKiBUaGUgVW5pY29kZSB0byBjaGFyc2V0IHRhYmxlIGhhcyBvbmx5IGV4YWN0IG1hcHBpbmdzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCitzdGF0aWMgd2NoYXJfdCBjaGFyc2V0MnVuaVsyNTZdID0geworCS8qIDB4MDAqLworCTB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywKKwkweDAwMDQsIDB4MDAwNSwgMHgwMDA2LCAweDAwMDcsCisJMHgwMDA4LCAweDAwMDksIDB4MDAwYSwgMHgwMDBiLAorCTB4MDAwYywgMHgwMDBkLCAweDAwMGUsIDB4MDAwZiwKKwkvKiAweDEwKi8KKwkweDAwMTAsIDB4MDAxMSwgMHgwMDEyLCAweDAwMTMsCisJMHgwMDE0LCAweDAwMTUsIDB4MDAxNiwgMHgwMDE3LAorCTB4MDAxOCwgMHgwMDE5LCAweDAwMWEsIDB4MDAxYiwKKwkweDAwMWMsIDB4MDAxZCwgMHgwMDFlLCAweDAwMWYsCisJLyogMHgyMCovCisJMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLAorCTB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKwkweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsCisJMHgwMDJjLCAweDAwMmQsIDB4MDAyZSwgMHgwMDJmLAorCS8qIDB4MzAqLworCTB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywKKwkweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisJMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLAorCTB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKwkvKiAweDQwKi8KKwkweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsCisJMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAorCTB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwKKwkweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsCisJLyogMHg1MCovCisJMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLAorCTB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKwkweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsCisJMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLAorCS8qIDB4NjAqLworCTB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywKKwkweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisJMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLAorCTB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKKwkvKiAweDcwKi8KKwkweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsCisJMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LAorCTB4MDA3OCwgMHgwMDc5LCAweDAwN2EsIDB4MDA3YiwKKwkweDAwN2MsIDB4MDA3ZCwgMHgwMDdlLCAweDAwN2YsCisJLyogMHg4MCovCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgyMDI2LCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCS8qIDB4OTAqLworCTB4MDAwMCwgMHgyMDE4LCAweDIwMTksIDB4MjAxYywKKwkweDIwMWQsIDB4MjAyMiwgMHgyMDEzLCAweDIwMTQsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiAweGEwKi8KKwkweDAwYTAsIDB4MGUwMSwgMHgwZTAyLCAweDBlMDMsCisJMHgwZTA0LCAweDBlMDUsIDB4MGUwNiwgMHgwZTA3LAorCTB4MGUwOCwgMHgwZTA5LCAweDBlMGEsIDB4MGUwYiwKKwkweDBlMGMsIDB4MGUwZCwgMHgwZTBlLCAweDBlMGYsCisJLyogMHhiMCovCisJMHgwZTEwLCAweDBlMTEsIDB4MGUxMiwgMHgwZTEzLAorCTB4MGUxNCwgMHgwZTE1LCAweDBlMTYsIDB4MGUxNywKKwkweDBlMTgsIDB4MGUxOSwgMHgwZTFhLCAweDBlMWIsCisJMHgwZTFjLCAweDBlMWQsIDB4MGUxZSwgMHgwZTFmLAorCS8qIDB4YzAqLworCTB4MGUyMCwgMHgwZTIxLCAweDBlMjIsIDB4MGUyMywKKwkweDBlMjQsIDB4MGUyNSwgMHgwZTI2LCAweDBlMjcsCisJMHgwZTI4LCAweDBlMjksIDB4MGUyYSwgMHgwZTJiLAorCTB4MGUyYywgMHgwZTJkLCAweDBlMmUsIDB4MGUyZiwKKwkvKiAweGQwKi8KKwkweDBlMzAsIDB4MGUzMSwgMHgwZTMyLCAweDBlMzMsCisJMHgwZTM0LCAweDBlMzUsIDB4MGUzNiwgMHgwZTM3LAorCTB4MGUzOCwgMHgwZTM5LCAweDBlM2EsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDBlM2YsCisJLyogMHhlMCovCisJMHgwZTQwLCAweDBlNDEsIDB4MGU0MiwgMHgwZTQzLAorCTB4MGU0NCwgMHgwZTQ1LCAweDBlNDYsIDB4MGU0NywKKwkweDBlNDgsIDB4MGU0OSwgMHgwZTRhLCAweDBlNGIsCisJMHgwZTRjLCAweDBlNGQsIDB4MGU0ZSwgMHgwZTRmLAorCS8qIDB4ZjAqLworCTB4MGU1MCwgMHgwZTUxLCAweDBlNTIsIDB4MGU1MywKKwkweDBlNTQsIDB4MGU1NSwgMHgwZTU2LCAweDBlNTcsCisJMHgwZTU4LCAweDBlNTksIDB4MGU1YSwgMHgwZTViLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMFsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhMC0weGE3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMGVbMjU2XSA9IHsKKwkweDAwLCAweGExLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LCAweGE3LCAvKiAweDAwLTB4MDcgKi8KKwkweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweDA4LTB4MGYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweDEwLTB4MTcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweGJmLCAvKiAweDE4LTB4MWYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweDIwLTB4MjcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweDI4LTB4MmYgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweDMwLTB4MzcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGRmLCAvKiAweDM4LTB4M2YgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweDQwLTB4NDcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweDQ4LTB4NGYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweDUwLTB4NTcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyMFsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4OTYsIDB4OTcsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4OTEsIDB4OTIsIDB4MDAsIDB4MDAsIDB4OTMsIDB4OTQsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4OTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODUsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnBhZ2VfdW5pMmNoYXJzZXRbMjU2XSA9IHsKKwlwYWdlMDAsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgcGFnZTBlLCBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJcGFnZTIwLCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJsb3dlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NDAtMHg0NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NTAtMHg1NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4NSwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0MnVwcGVyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg2MC0weDY3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg2OC0weDZmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg3MC0weDc3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg1LCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweGExLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyBpbnQgdW5pMmNoYXIod2NoYXJfdCB1bmksIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50IGJvdW5kbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnVuaTJjaGFyc2V0OworCXVuc2lnbmVkIGNoYXIgY2wgPSB1bmkgJiAweDAwZmY7CisJdW5zaWduZWQgY2hhciBjaCA9ICh1bmkgJiAweGZmMDApID4+IDg7CisKKwlpZiAoYm91bmRsZW4gPD0gMCkKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwl1bmkyY2hhcnNldCA9IHBhZ2VfdW5pMmNoYXJzZXRbY2hdOworCWlmICh1bmkyY2hhcnNldCAmJiB1bmkyY2hhcnNldFtjbF0pCisJCW91dFswXSA9IHVuaTJjaGFyc2V0W2NsXTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNoYXIydW5pKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJhd3N0cmluZywgaW50IGJvdW5kbGVuLCB3Y2hhcl90ICp1bmkpCit7CisJKnVuaSA9IGNoYXJzZXQydW5pWypyYXdzdHJpbmddOworCWlmICgqdW5pID09IDB4MDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmxzX3RhYmxlIHRhYmxlID0geworCS5jaGFyc2V0CT0gImNwODc0IiwKKwkuYWxpYXMJCT0gInRpcy02MjAiLAorCS51bmkyY2hhcgk9IHVuaTJjaGFyLAorCS5jaGFyMnVuaQk9IGNoYXIydW5pLAorCS5jaGFyc2V0Mmxvd2VyCT0gY2hhcnNldDJsb3dlciwKKwkuY2hhcnNldDJ1cHBlcgk9IGNoYXJzZXQydXBwZXIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9ubHNfY3A4NzQodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X25sc19jcDg3NCh2b2lkKQoreworCXVucmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbmxzX2NwODc0KQorbW9kdWxlX2V4aXQoZXhpdF9ubHNfY3A4NzQpCisKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKK01PRFVMRV9BTElBU19OTFModGlzLTYyMCk7CmRpZmYgLS1naXQgYS9mcy9ubHMvbmxzX2NwOTMyLmMgYi9mcy9ubHMvbmxzX2NwOTMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMxYTE3YwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25scy9ubHNfY3A5MzIuYwpAQCAtMCwwICsxLDc5MzQgQEAKKy8qCisgKiBsaW51eC9mcy9ubHNfY3A5MzIuYworICoKKyAqIENoYXJzZXQgY3A5MzIgdHJhbnNsYXRpb24gdGFibGVzLgorICogVGhpcyB0cmFuc2xhdGlvbiB0YWJsZSB3YXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHksIHRoZQorICogb3JpZ2luYWwgdGFibGUgY2FuIGJlIGRvd25sb2FkIGZyb20gdGhlIE1pY3Jvc29mdCB3ZWJzaXRlLgorICogKGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L3VuaWNvZGUvdW5pY29kZWNwLmh0bSkKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworc3RhdGljIHdjaGFyX3QgYzJ1XzgxWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MzAwMCwweDMwMDEsMHgzMDAyLDB4RkYwQywweEZGMEUsMHgzMEZCLDB4RkYxQSwweEZGMUIsLyogMHg0MC0weDQ3ICovCisJMHhGRjFGLDB4RkYwMSwweDMwOUIsMHgzMDlDLDB4MDBCNCwweEZGNDAsMHgwMEE4LDB4RkYzRSwvKiAweDQ4LTB4NEYgKi8KKwkweEZGRTMsMHhGRjNGLDB4MzBGRCwweDMwRkUsMHgzMDlELDB4MzA5RSwweDMwMDMsMHg0RURELC8qIDB4NTAtMHg1NyAqLworCTB4MzAwNSwweDMwMDYsMHgzMDA3LDB4MzBGQywweDIwMTUsMHgyMDEwLDB4RkYwRiwweEZGM0MsLyogMHg1OC0weDVGICovCisJMHhGRjVFLDB4MjIyNSwweEZGNUMsMHgyMDI2LDB4MjAyNSwweDIwMTgsMHgyMDE5LDB4MjAxQywvKiAweDYwLTB4NjcgKi8KKwkweDIwMUQsMHhGRjA4LDB4RkYwOSwweDMwMTQsMHgzMDE1LDB4RkYzQiwweEZGM0QsMHhGRjVCLC8qIDB4NjgtMHg2RiAqLworCTB4RkY1RCwweDMwMDgsMHgzMDA5LDB4MzAwQSwweDMwMEIsMHgzMDBDLDB4MzAwRCwweDMwMEUsLyogMHg3MC0weDc3ICovCisJMHgzMDBGLDB4MzAxMCwweDMwMTEsMHhGRjBCLDB4RkYwRCwweDAwQjEsMHgwMEQ3LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDBGNywweEZGMUQsMHgyMjYwLDB4RkYxQywweEZGMUUsMHgyMjY2LDB4MjI2NywweDIyMUUsLyogMHg4MC0weDg3ICovCisJMHgyMjM0LDB4MjY0MiwweDI2NDAsMHgwMEIwLDB4MjAzMiwweDIwMzMsMHgyMTAzLDB4RkZFNSwvKiAweDg4LTB4OEYgKi8KKwkweEZGMDQsMHhGRkUwLDB4RkZFMSwweEZGMDUsMHhGRjAzLDB4RkYwNiwweEZGMEEsMHhGRjIwLC8qIDB4OTAtMHg5NyAqLworCTB4MDBBNywweDI2MDYsMHgyNjA1LDB4MjVDQiwweDI1Q0YsMHgyNUNFLDB4MjVDNywweDI1QzYsLyogMHg5OC0weDlGICovCisJMHgyNUExLDB4MjVBMCwweDI1QjMsMHgyNUIyLDB4MjVCRCwweDI1QkMsMHgyMDNCLDB4MzAxMiwvKiAweEEwLTB4QTcgKi8KKwkweDIxOTIsMHgyMTkwLDB4MjE5MSwweDIxOTMsMHgzMDEzLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4QTgtMHhBRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhCMC0weEI3ICovCisJMHgyMjA4LDB4MjIwQiwweDIyODYsMHgyMjg3LDB4MjI4MiwweDIyODMsMHgyMjJBLDB4MjIyOSwvKiAweEI4LTB4QkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4QzAtMHhDNyAqLworCTB4MjIyNywweDIyMjgsMHhGRkUyLDB4MjFEMiwweDIxRDQsMHgyMjAwLDB4MjIwMywweDAwMDAsLyogMHhDOC0weENGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEQwLTB4RDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MjIyMCwweDIyQTUsMHgyMzEyLDB4MjIwMiwweDIyMDcsMHgyMjYxLC8qIDB4RDgtMHhERiAqLworCTB4MjI1MiwweDIyNkEsMHgyMjZCLDB4MjIxQSwweDIyM0QsMHgyMjFELDB4MjIzNSwweDIyMkIsLyogMHhFMC0weEU3ICovCisJMHgyMjJDLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEU4LTB4RUYgKi8KKwkweDIxMkIsMHgyMDMwLDB4MjY2RiwweDI2NkQsMHgyNjZBLDB4MjAyMCwweDIwMjEsMHgwMEI2LC8qIDB4RjAtMHhGNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDI1RUYsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfODJbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHhGRjEwLC8qIDB4NDgtMHg0RiAqLworCTB4RkYxMSwweEZGMTIsMHhGRjEzLDB4RkYxNCwweEZGMTUsMHhGRjE2LDB4RkYxNywweEZGMTgsLyogMHg1MC0weDU3ICovCisJMHhGRjE5LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweEZGMjEsMHhGRjIyLDB4RkYyMywweEZGMjQsMHhGRjI1LDB4RkYyNiwweEZGMjcsMHhGRjI4LC8qIDB4NjAtMHg2NyAqLworCTB4RkYyOSwweEZGMkEsMHhGRjJCLDB4RkYyQywweEZGMkQsMHhGRjJFLDB4RkYyRiwweEZGMzAsLyogMHg2OC0weDZGICovCisJMHhGRjMxLDB4RkYzMiwweEZGMzMsMHhGRjM0LDB4RkYzNSwweEZGMzYsMHhGRjM3LDB4RkYzOCwvKiAweDcwLTB4NzcgKi8KKwkweEZGMzksMHhGRjNBLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4RkY0MSwweEZGNDIsMHhGRjQzLDB4RkY0NCwweEZGNDUsMHhGRjQ2LDB4RkY0NywvKiAweDgwLTB4ODcgKi8KKwkweEZGNDgsMHhGRjQ5LDB4RkY0QSwweEZGNEIsMHhGRjRDLDB4RkY0RCwweEZGNEUsMHhGRjRGLC8qIDB4ODgtMHg4RiAqLworCTB4RkY1MCwweEZGNTEsMHhGRjUyLDB4RkY1MywweEZGNTQsMHhGRjU1LDB4RkY1NiwweEZGNTcsLyogMHg5MC0weDk3ICovCisJMHhGRjU4LDB4RkY1OSwweEZGNUEsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MzA0MSwvKiAweDk4LTB4OUYgKi8KKwkweDMwNDIsMHgzMDQzLDB4MzA0NCwweDMwNDUsMHgzMDQ2LDB4MzA0NywweDMwNDgsMHgzMDQ5LC8qIDB4QTAtMHhBNyAqLworCTB4MzA0QSwweDMwNEIsMHgzMDRDLDB4MzA0RCwweDMwNEUsMHgzMDRGLDB4MzA1MCwweDMwNTEsLyogMHhBOC0weEFGICovCisJMHgzMDUyLDB4MzA1MywweDMwNTQsMHgzMDU1LDB4MzA1NiwweDMwNTcsMHgzMDU4LDB4MzA1OSwvKiAweEIwLTB4QjcgKi8KKwkweDMwNUEsMHgzMDVCLDB4MzA1QywweDMwNUQsMHgzMDVFLDB4MzA1RiwweDMwNjAsMHgzMDYxLC8qIDB4QjgtMHhCRiAqLworCTB4MzA2MiwweDMwNjMsMHgzMDY0LDB4MzA2NSwweDMwNjYsMHgzMDY3LDB4MzA2OCwweDMwNjksLyogMHhDMC0weEM3ICovCisJMHgzMDZBLDB4MzA2QiwweDMwNkMsMHgzMDZELDB4MzA2RSwweDMwNkYsMHgzMDcwLDB4MzA3MSwvKiAweEM4LTB4Q0YgKi8KKwkweDMwNzIsMHgzMDczLDB4MzA3NCwweDMwNzUsMHgzMDc2LDB4MzA3NywweDMwNzgsMHgzMDc5LC8qIDB4RDAtMHhENyAqLworCTB4MzA3QSwweDMwN0IsMHgzMDdDLDB4MzA3RCwweDMwN0UsMHgzMDdGLDB4MzA4MCwweDMwODEsLyogMHhEOC0weERGICovCisJMHgzMDgyLDB4MzA4MywweDMwODQsMHgzMDg1LDB4MzA4NiwweDMwODcsMHgzMDg4LDB4MzA4OSwvKiAweEUwLTB4RTcgKi8KKwkweDMwOEEsMHgzMDhCLDB4MzA4QywweDMwOEQsMHgzMDhFLDB4MzA4RiwweDMwOTAsMHgzMDkxLC8qIDB4RTgtMHhFRiAqLworCTB4MzA5MiwweDMwOTMsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhGMC0weEY3ICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfODNbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgzMEExLDB4MzBBMiwweDMwQTMsMHgzMEE0LDB4MzBBNSwweDMwQTYsMHgzMEE3LDB4MzBBOCwvKiAweDQwLTB4NDcgKi8KKwkweDMwQTksMHgzMEFBLDB4MzBBQiwweDMwQUMsMHgzMEFELDB4MzBBRSwweDMwQUYsMHgzMEIwLC8qIDB4NDgtMHg0RiAqLworCTB4MzBCMSwweDMwQjIsMHgzMEIzLDB4MzBCNCwweDMwQjUsMHgzMEI2LDB4MzBCNywweDMwQjgsLyogMHg1MC0weDU3ICovCisJMHgzMEI5LDB4MzBCQSwweDMwQkIsMHgzMEJDLDB4MzBCRCwweDMwQkUsMHgzMEJGLDB4MzBDMCwvKiAweDU4LTB4NUYgKi8KKwkweDMwQzEsMHgzMEMyLDB4MzBDMywweDMwQzQsMHgzMEM1LDB4MzBDNiwweDMwQzcsMHgzMEM4LC8qIDB4NjAtMHg2NyAqLworCTB4MzBDOSwweDMwQ0EsMHgzMENCLDB4MzBDQywweDMwQ0QsMHgzMENFLDB4MzBDRiwweDMwRDAsLyogMHg2OC0weDZGICovCisJMHgzMEQxLDB4MzBEMiwweDMwRDMsMHgzMEQ0LDB4MzBENSwweDMwRDYsMHgzMEQ3LDB4MzBEOCwvKiAweDcwLTB4NzcgKi8KKwkweDMwRDksMHgzMERBLDB4MzBEQiwweDMwREMsMHgzMERELDB4MzBERSwweDMwREYsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgzMEUwLDB4MzBFMSwweDMwRTIsMHgzMEUzLDB4MzBFNCwweDMwRTUsMHgzMEU2LDB4MzBFNywvKiAweDgwLTB4ODcgKi8KKwkweDMwRTgsMHgzMEU5LDB4MzBFQSwweDMwRUIsMHgzMEVDLDB4MzBFRCwweDMwRUUsMHgzMEVGLC8qIDB4ODgtMHg4RiAqLworCTB4MzBGMCwweDMwRjEsMHgzMEYyLDB4MzBGMywweDMwRjQsMHgzMEY1LDB4MzBGNiwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDM5MSwvKiAweDk4LTB4OUYgKi8KKwkweDAzOTIsMHgwMzkzLDB4MDM5NCwweDAzOTUsMHgwMzk2LDB4MDM5NywweDAzOTgsMHgwMzk5LC8qIDB4QTAtMHhBNyAqLworCTB4MDM5QSwweDAzOUIsMHgwMzlDLDB4MDM5RCwweDAzOUUsMHgwMzlGLDB4MDNBMCwweDAzQTEsLyogMHhBOC0weEFGICovCisJMHgwM0EzLDB4MDNBNCwweDAzQTUsMHgwM0E2LDB4MDNBNywweDAzQTgsMHgwM0E5LDB4MDAwMCwvKiAweEIwLTB4QjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwM0IxLC8qIDB4QjgtMHhCRiAqLworCTB4MDNCMiwweDAzQjMsMHgwM0I0LDB4MDNCNSwweDAzQjYsMHgwM0I3LDB4MDNCOCwweDAzQjksLyogMHhDMC0weEM3ICovCisJMHgwM0JBLDB4MDNCQiwweDAzQkMsMHgwM0JELDB4MDNCRSwweDAzQkYsMHgwM0MwLDB4MDNDMSwvKiAweEM4LTB4Q0YgKi8KKwkweDAzQzMsMHgwM0M0LDB4MDNDNSwweDAzQzYsMHgwM0M3LDB4MDNDOCwweDAzQzksMHgwMDAwLC8qIDB4RDAtMHhENyAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1Xzg0WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDQxMCwweDA0MTEsMHgwNDEyLDB4MDQxMywweDA0MTQsMHgwNDE1LDB4MDQwMSwweDA0MTYsLyogMHg0MC0weDQ3ICovCisJMHgwNDE3LDB4MDQxOCwweDA0MTksMHgwNDFBLDB4MDQxQiwweDA0MUMsMHgwNDFELDB4MDQxRSwvKiAweDQ4LTB4NEYgKi8KKwkweDA0MUYsMHgwNDIwLDB4MDQyMSwweDA0MjIsMHgwNDIzLDB4MDQyNCwweDA0MjUsMHgwNDI2LC8qIDB4NTAtMHg1NyAqLworCTB4MDQyNywweDA0MjgsMHgwNDI5LDB4MDQyQSwweDA0MkIsMHgwNDJDLDB4MDQyRCwweDA0MkUsLyogMHg1OC0weDVGICovCisJMHgwNDJGLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDQzMCwweDA0MzEsMHgwNDMyLDB4MDQzMywweDA0MzQsMHgwNDM1LDB4MDQ1MSwweDA0MzYsLyogMHg3MC0weDc3ICovCisJMHgwNDM3LDB4MDQzOCwweDA0MzksMHgwNDNBLDB4MDQzQiwweDA0M0MsMHgwNDNELDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDQzRSwweDA0M0YsMHgwNDQwLDB4MDQ0MSwweDA0NDIsMHgwNDQzLDB4MDQ0NCwweDA0NDUsLyogMHg4MC0weDg3ICovCisJMHgwNDQ2LDB4MDQ0NywweDA0NDgsMHgwNDQ5LDB4MDQ0QSwweDA0NEIsMHgwNDRDLDB4MDQ0RCwvKiAweDg4LTB4OEYgKi8KKwkweDA0NEUsMHgwNDRGLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDI1MDAsLyogMHg5OC0weDlGICovCisJMHgyNTAyLDB4MjUwQywweDI1MTAsMHgyNTE4LDB4MjUxNCwweDI1MUMsMHgyNTJDLDB4MjUyNCwvKiAweEEwLTB4QTcgKi8KKwkweDI1MzQsMHgyNTNDLDB4MjUwMSwweDI1MDMsMHgyNTBGLDB4MjUxMywweDI1MUIsMHgyNTE3LC8qIDB4QTgtMHhBRiAqLworCTB4MjUyMywweDI1MzMsMHgyNTJCLDB4MjUzQiwweDI1NEIsMHgyNTIwLDB4MjUyRiwweDI1MjgsLyogMHhCMC0weEI3ICovCisJMHgyNTM3LDB4MjUzRiwweDI1MUQsMHgyNTMwLDB4MjUyNSwweDI1MzgsMHgyNTQyLDB4MDAwMCwvKiAweEI4LTB4QkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV84N1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDI0NjAsMHgyNDYxLDB4MjQ2MiwweDI0NjMsMHgyNDY0LDB4MjQ2NSwweDI0NjYsMHgyNDY3LC8qIDB4NDAtMHg0NyAqLworCTB4MjQ2OCwweDI0NjksMHgyNDZBLDB4MjQ2QiwweDI0NkMsMHgyNDZELDB4MjQ2RSwweDI0NkYsLyogMHg0OC0weDRGICovCisJMHgyNDcwLDB4MjQ3MSwweDI0NzIsMHgyNDczLDB4MjE2MCwweDIxNjEsMHgyMTYyLDB4MjE2MywvKiAweDUwLTB4NTcgKi8KKwkweDIxNjQsMHgyMTY1LDB4MjE2NiwweDIxNjcsMHgyMTY4LDB4MjE2OSwweDAwMDAsMHgzMzQ5LC8qIDB4NTgtMHg1RiAqLworCTB4MzMxNCwweDMzMjIsMHgzMzRELDB4MzMxOCwweDMzMjcsMHgzMzAzLDB4MzMzNiwweDMzNTEsLyogMHg2MC0weDY3ICovCisJMHgzMzU3LDB4MzMwRCwweDMzMjYsMHgzMzIzLDB4MzMyQiwweDMzNEEsMHgzMzNCLDB4MzM5QywvKiAweDY4LTB4NkYgKi8KKwkweDMzOUQsMHgzMzlFLDB4MzM4RSwweDMzOEYsMHgzM0M0LDB4MzNBMSwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MzM3QiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDMwMUQsMHgzMDFGLDB4MjExNiwweDMzQ0QsMHgyMTIxLDB4MzJBNCwweDMyQTUsMHgzMkE2LC8qIDB4ODAtMHg4NyAqLworCTB4MzJBNywweDMyQTgsMHgzMjMxLDB4MzIzMiwweDMyMzksMHgzMzdFLDB4MzM3RCwweDMzN0MsLyogMHg4OC0weDhGICovCisJMHgyMjUyLDB4MjI2MSwweDIyMkIsMHgyMjJFLDB4MjIxMSwweDIyMUEsMHgyMkE1LDB4MjIyMCwvKiAweDkwLTB4OTcgKi8KKwkweDIyMUYsMHgyMkJGLDB4MjIzNSwweDIyMjksMHgyMjJBLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1Xzg4WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDRFOUMsLyogMHg5OC0weDlGICovCisJMHg1NTE2LDB4NUEwMywweDk2M0YsMHg1NEMwLDB4NjExQiwweDYzMjgsMHg1OUY2LDB4OTAyMiwvKiAweEEwLTB4QTcgKi8KKwkweDg0NzUsMHg4MzFDLDB4N0E1MCwweDYwQUEsMHg2M0UxLDB4NkUyNSwweDY1RUQsMHg4NDY2LC8qIDB4QTgtMHhBRiAqLworCTB4ODJBNiwweDlCRjUsMHg2ODkzLDB4NTcyNywweDY1QTEsMHg2MjcxLDB4NUI5QiwweDU5RDAsLyogMHhCMC0weEI3ICovCisJMHg4NjdCLDB4OThGNCwweDdENjIsMHg3REJFLDB4OUI4RSwweDYyMTYsMHg3QzlGLDB4ODhCNywvKiAweEI4LTB4QkYgKi8KKwkweDVCODksMHg1RUI1LDB4NjMwOSwweDY2OTcsMHg2ODQ4LDB4OTVDNywweDk3OEQsMHg2NzRGLC8qIDB4QzAtMHhDNyAqLworCTB4NEVFNSwweDRGMEEsMHg0RjRELDB4NEY5RCwweDUwNDksMHg1NkYyLDB4NTkzNywweDU5RDQsLyogMHhDOC0weENGICovCisJMHg1QTAxLDB4NUMwOSwweDYwREYsMHg2MTBGLDB4NjE3MCwweDY2MTMsMHg2OTA1LDB4NzBCQSwvKiAweEQwLTB4RDcgKi8KKwkweDc1NEYsMHg3NTcwLDB4NzlGQiwweDdEQUQsMHg3REVGLDB4ODBDMywweDg0MEUsMHg4ODYzLC8qIDB4RDgtMHhERiAqLworCTB4OEIwMiwweDkwNTUsMHg5MDdBLDB4NTMzQiwweDRFOTUsMHg0RUE1LDB4NTdERiwweDgwQjIsLyogMHhFMC0weEU3ICovCisJMHg5MEMxLDB4NzhFRiwweDRFMDAsMHg1OEYxLDB4NkVBMiwweDkwMzgsMHg3QTMyLDB4ODMyOCwvKiAweEU4LTB4RUYgKi8KKwkweDgyOEIsMHg5QzJGLDB4NTE0MSwweDUzNzAsMHg1NEJELDB4NTRFMSwweDU2RTAsMHg1OUZCLC8qIDB4RjAtMHhGNyAqLworCTB4NUYxNSwweDk4RjIsMHg2REVCLDB4ODBFNCwweDg1MkQsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfODlbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5NjYyLDB4OTY3MCwweDk2QTAsMHg5N0ZCLDB4NTQwQiwweDUzRjMsMHg1Qjg3LDB4NzBDRiwvKiAweDQwLTB4NDcgKi8KKwkweDdGQkQsMHg4RkMyLDB4OTZFOCwweDUzNkYsMHg5RDVDLDB4N0FCQSwweDRFMTEsMHg3ODkzLC8qIDB4NDgtMHg0RiAqLworCTB4ODFGQywweDZFMjYsMHg1NjE4LDB4NTUwNCwweDZCMUQsMHg4NTFBLDB4OUMzQiwweDU5RTUsLyogMHg1MC0weDU3ICovCisJMHg1M0E5LDB4NkQ2NiwweDc0REMsMHg5NThGLDB4NTY0MiwweDRFOTEsMHg5MDRCLDB4OTZGMiwvKiAweDU4LTB4NUYgKi8KKwkweDgzNEYsMHg5OTBDLDB4NTNFMSwweDU1QjYsMHg1QjMwLDB4NUY3MSwweDY2MjAsMHg2NkYzLC8qIDB4NjAtMHg2NyAqLworCTB4NjgwNCwweDZDMzgsMHg2Q0YzLDB4NkQyOSwweDc0NUIsMHg3NkM4LDB4N0E0RSwweDk4MzQsLyogMHg2OC0weDZGICovCisJMHg4MkYxLDB4ODg1QiwweDhBNjAsMHg5MkVELDB4NkRCMiwweDc1QUIsMHg3NkNBLDB4OTlDNSwvKiAweDcwLTB4NzcgKi8KKwkweDYwQTYsMHg4QjAxLDB4OEQ4QSwweDk1QjIsMHg2OThFLDB4NTNBRCwweDUxODYsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg1NzEyLDB4NTgzMCwweDU5NDQsMHg1QkI0LDB4NUVGNiwweDYwMjgsMHg2M0E5LDB4NjNGNCwvKiAweDgwLTB4ODcgKi8KKwkweDZDQkYsMHg2RjE0LDB4NzA4RSwweDcxMTQsMHg3MTU5LDB4NzFENSwweDczM0YsMHg3RTAxLC8qIDB4ODgtMHg4RiAqLworCTB4ODI3NiwweDgyRDEsMHg4NTk3LDB4OTA2MCwweDkyNUIsMHg5RDFCLDB4NTg2OSwweDY1QkMsLyogMHg5MC0weDk3ICovCisJMHg2QzVBLDB4NzUyNSwweDUxRjksMHg1OTJFLDB4NTk2NSwweDVGODAsMHg1RkRDLDB4NjJCQywvKiAweDk4LTB4OUYgKi8KKwkweDY1RkEsMHg2QTJBLDB4NkIyNywweDZCQjQsMHg3MzhCLDB4N0ZDMSwweDg5NTYsMHg5RDJDLC8qIDB4QTAtMHhBNyAqLworCTB4OUQwRSwweDlFQzQsMHg1Q0ExLDB4NkM5NiwweDgzN0IsMHg1MTA0LDB4NUM0QiwweDYxQjYsLyogMHhBOC0weEFGICovCisJMHg4MUM2LDB4Njg3NiwweDcyNjEsMHg0RTU5LDB4NEZGQSwweDUzNzgsMHg2MDY5LDB4NkUyOSwvKiAweEIwLTB4QjcgKi8KKwkweDdBNEYsMHg5N0YzLDB4NEUwQiwweDUzMTYsMHg0RUVFLDB4NEY1NSwweDRGM0QsMHg0RkExLC8qIDB4QjgtMHhCRiAqLworCTB4NEY3MywweDUyQTAsMHg1M0VGLDB4NTYwOSwweDU5MEYsMHg1QUMxLDB4NUJCNiwweDVCRTEsLyogMHhDMC0weEM3ICovCisJMHg3OUQxLDB4NjY4NywweDY3OUMsMHg2N0I2LDB4NkI0QywweDZDQjMsMHg3MDZCLDB4NzNDMiwvKiAweEM4LTB4Q0YgKi8KKwkweDc5OEQsMHg3OUJFLDB4N0EzQywweDdCODcsMHg4MkIxLDB4ODJEQiwweDgzMDQsMHg4Mzc3LC8qIDB4RDAtMHhENyAqLworCTB4ODNFRiwweDgzRDMsMHg4NzY2LDB4OEFCMiwweDU2MjksMHg4Q0E4LDB4OEZFNiwweDkwNEUsLyogMHhEOC0weERGICovCisJMHg5NzFFLDB4ODY4QSwweDRGQzQsMHg1Q0U4LDB4NjIxMSwweDcyNTksMHg3NTNCLDB4ODFFNSwvKiAweEUwLTB4RTcgKi8KKwkweDgyQkQsMHg4NkZFLDB4OENDMCwweDk2QzUsMHg5OTEzLDB4OTlENSwweDRFQ0IsMHg0RjFBLC8qIDB4RTgtMHhFRiAqLworCTB4ODlFMywweDU2REUsMHg1ODRBLDB4NThDQSwweDVFRkIsMHg1RkVCLDB4NjAyQSwweDYwOTQsLyogMHhGMC0weEY3ICovCisJMHg2MDYyLDB4NjFEMCwweDYyMTIsMHg2MkQwLDB4NjUzOSwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV84QVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDlCNDEsMHg2NjY2LDB4NjhCMCwweDZENzcsMHg3MDcwLDB4NzU0QywweDc2ODYsMHg3RDc1LC8qIDB4NDAtMHg0NyAqLworCTB4ODJBNSwweDg3RjksMHg5NThCLDB4OTY4RSwweDhDOUQsMHg1MUYxLDB4NTJCRSwweDU5MTYsLyogMHg0OC0weDRGICovCisJMHg1NEIzLDB4NUJCMywweDVEMTYsMHg2MTY4LDB4Njk4MiwweDZEQUYsMHg3ODhELDB4ODRDQiwvKiAweDUwLTB4NTcgKi8KKwkweDg4NTcsMHg4QTcyLDB4OTNBNywweDlBQjgsMHg2RDZDLDB4OTlBOCwweDg2RDksMHg1N0EzLC8qIDB4NTgtMHg1RiAqLworCTB4NjdGRiwweDg2Q0UsMHg5MjBFLDB4NTI4MywweDU2ODcsMHg1NDA0LDB4NUVEMywweDYyRTEsLyogMHg2MC0weDY3ICovCisJMHg2NEI5LDB4NjgzQywweDY4MzgsMHg2QkJCLDB4NzM3MiwweDc4QkEsMHg3QTZCLDB4ODk5QSwvKiAweDY4LTB4NkYgKi8KKwkweDg5RDIsMHg4RDZCLDB4OEYwMywweDkwRUQsMHg5NUEzLDB4OTY5NCwweDk3NjksMHg1QjY2LC8qIDB4NzAtMHg3NyAqLworCTB4NUNCMywweDY5N0QsMHg5ODRELDB4OTg0RSwweDYzOUIsMHg3QjIwLDB4NkEyQiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDZBN0YsMHg2OEI2LDB4OUMwRCwweDZGNUYsMHg1MjcyLDB4NTU5RCwweDYwNzAsMHg2MkVDLC8qIDB4ODAtMHg4NyAqLworCTB4NkQzQiwweDZFMDcsMHg2RUQxLDB4ODQ1QiwweDg5MTAsMHg4RjQ0LDB4NEUxNCwweDlDMzksLyogMHg4OC0weDhGICovCisJMHg1M0Y2LDB4NjkxQiwweDZBM0EsMHg5Nzg0LDB4NjgyQSwweDUxNUMsMHg3QUMzLDB4ODRCMiwvKiAweDkwLTB4OTcgKi8KKwkweDkxREMsMHg5MzhDLDB4NTY1QiwweDlEMjgsMHg2ODIyLDB4ODMwNSwweDg0MzEsMHg3Q0E1LC8qIDB4OTgtMHg5RiAqLworCTB4NTIwOCwweDgyQzUsMHg3NEU2LDB4NEU3RSwweDRGODMsMHg1MUEwLDB4NUJEMiwweDUyMEEsLyogMHhBMC0weEE3ICovCisJMHg1MkQ4LDB4NTJFNywweDVERkIsMHg1NTlBLDB4NTgyQSwweDU5RTYsMHg1QjhDLDB4NUI5OCwvKiAweEE4LTB4QUYgKi8KKwkweDVCREIsMHg1RTcyLDB4NUU3OSwweDYwQTMsMHg2MTFGLDB4NjE2MywweDYxQkUsMHg2M0RCLC8qIDB4QjAtMHhCNyAqLworCTB4NjU2MiwweDY3RDEsMHg2ODUzLDB4NjhGQSwweDZCM0UsMHg2QjUzLDB4NkM1NywweDZGMjIsLyogMHhCOC0weEJGICovCisJMHg2Rjk3LDB4NkY0NSwweDc0QjAsMHg3NTE4LDB4NzZFMywweDc3MEIsMHg3QUZGLDB4N0JBMSwvKiAweEMwLTB4QzcgKi8KKwkweDdDMjEsMHg3REU5LDB4N0YzNiwweDdGRjAsMHg4MDlELDB4ODI2NiwweDgzOUUsMHg4OUIzLC8qIDB4QzgtMHhDRiAqLworCTB4OEFDQywweDhDQUIsMHg5MDg0LDB4OTQ1MSwweDk1OTMsMHg5NTkxLDB4OTVBMiwweDk2NjUsLyogMHhEMC0weEQ3ICovCisJMHg5N0QzLDB4OTkyOCwweDgyMTgsMHg0RTM4LDB4NTQyQiwweDVDQjgsMHg1RENDLDB4NzNBOSwvKiAweEQ4LTB4REYgKi8KKwkweDc2NEMsMHg3NzNDLDB4NUNBOSwweDdGRUIsMHg4RDBCLDB4OTZDMSwweDk4MTEsMHg5ODU0LC8qIDB4RTAtMHhFNyAqLworCTB4OTg1OCwweDRGMDEsMHg0RjBFLDB4NTM3MSwweDU1OUMsMHg1NjY4LDB4NTdGQSwweDU5NDcsLyogMHhFOC0weEVGICovCisJMHg1QjA5LDB4NUJDNCwweDVDOTAsMHg1RTBDLDB4NUU3RSwweDVGQ0MsMHg2M0VFLDB4NjczQSwvKiAweEYwLTB4RjcgKi8KKwkweDY1RDcsMHg2NUUyLDB4NjcxRiwweDY4Q0IsMHg2OEM0LDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzhCWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NkE1RiwweDVFMzAsMHg2QkM1LDB4NkMxNywweDZDN0QsMHg3NTdGLDB4Nzk0OCwweDVCNjMsLyogMHg0MC0weDQ3ICovCisJMHg3QTAwLDB4N0QwMCwweDVGQkQsMHg4OThGLDB4OEExOCwweDhDQjQsMHg4RDc3LDB4OEVDQywvKiAweDQ4LTB4NEYgKi8KKwkweDhGMUQsMHg5OEUyLDB4OUEwRSwweDlCM0MsMHg0RTgwLDB4NTA3RCwweDUxMDAsMHg1OTkzLC8qIDB4NTAtMHg1NyAqLworCTB4NUI5QywweDYyMkYsMHg2MjgwLDB4NjRFQywweDZCM0EsMHg3MkEwLDB4NzU5MSwweDc5NDcsLyogMHg1OC0weDVGICovCisJMHg3RkE5LDB4ODdGQiwweDhBQkMsMHg4QjcwLDB4NjNBQywweDgzQ0EsMHg5N0EwLDB4NTQwOSwvKiAweDYwLTB4NjcgKi8KKwkweDU0MDMsMHg1NUFCLDB4Njg1NCwweDZBNTgsMHg4QTcwLDB4NzgyNywweDY3NzUsMHg5RUNELC8qIDB4NjgtMHg2RiAqLworCTB4NTM3NCwweDVCQTIsMHg4MTFBLDB4ODY1MCwweDkwMDYsMHg0RTE4LDB4NEU0NSwweDRFQzcsLyogMHg3MC0weDc3ICovCisJMHg0RjExLDB4NTNDQSwweDU0MzgsMHg1QkFFLDB4NUYxMywweDYwMjUsMHg2NTUxLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NjczRCwweDZDNDIsMHg2QzcyLDB4NkNFMywweDcwNzgsMHg3NDAzLDB4N0E3NiwweDdBQUUsLyogMHg4MC0weDg3ICovCisJMHg3QjA4LDB4N0QxQSwweDdDRkUsMHg3RDY2LDB4NjVFNywweDcyNUIsMHg1M0JCLDB4NUM0NSwvKiAweDg4LTB4OEYgKi8KKwkweDVERTgsMHg2MkQyLDB4NjJFMCwweDYzMTksMHg2RTIwLDB4ODY1QSwweDhBMzEsMHg4RERELC8qIDB4OTAtMHg5NyAqLworCTB4OTJGOCwweDZGMDEsMHg3OUE2LDB4OUI1QSwweDRFQTgsMHg0RUFCLDB4NEVBQywweDRGOUIsLyogMHg5OC0weDlGICovCisJMHg0RkEwLDB4NTBEMSwweDUxNDcsMHg3QUY2LDB4NTE3MSwweDUxRjYsMHg1MzU0LDB4NTMyMSwvKiAweEEwLTB4QTcgKi8KKwkweDUzN0YsMHg1M0VCLDB4NTVBQywweDU4ODMsMHg1Q0UxLDB4NUYzNywweDVGNEEsMHg2MDJGLC8qIDB4QTgtMHhBRiAqLworCTB4NjA1MCwweDYwNkQsMHg2MzFGLDB4NjU1OSwweDZBNEIsMHg2Q0MxLDB4NzJDMiwweDcyRUQsLyogMHhCMC0weEI3ICovCisJMHg3N0VGLDB4ODBGOCwweDgxMDUsMHg4MjA4LDB4ODU0RSwweDkwRjcsMHg5M0UxLDB4OTdGRiwvKiAweEI4LTB4QkYgKi8KKwkweDk5NTcsMHg5QTVBLDB4NEVGMCwweDUxREQsMHg1QzJELDB4NjY4MSwweDY5NkQsMHg1QzQwLC8qIDB4QzAtMHhDNyAqLworCTB4NjZGMiwweDY5NzUsMHg3Mzg5LDB4Njg1MCwweDdDODEsMHg1MEM1LDB4NTJFNCwweDU3NDcsLyogMHhDOC0weENGICovCisJMHg1REZFLDB4OTMyNiwweDY1QTQsMHg2QjIzLDB4NkIzRCwweDc0MzQsMHg3OTgxLDB4NzlCRCwvKiAweEQwLTB4RDcgKi8KKwkweDdCNEIsMHg3RENBLDB4ODJCOSwweDgzQ0MsMHg4ODdGLDB4ODk1RiwweDhCMzksMHg4RkQxLC8qIDB4RDgtMHhERiAqLworCTB4OTFEMSwweDU0MUYsMHg5MjgwLDB4NEU1RCwweDUwMzYsMHg1M0U1LDB4NTMzQSwweDcyRDcsLyogMHhFMC0weEU3ICovCisJMHg3Mzk2LDB4NzdFOSwweDgyRTYsMHg4RUFGLDB4OTlDNiwweDk5QzgsMHg5OUQyLDB4NTE3NywvKiAweEU4LTB4RUYgKi8KKwkweDYxMUEsMHg4NjVFLDB4NTVCMCwweDdBN0EsMHg1MDc2LDB4NUJEMywweDkwNDcsMHg5Njg1LC8qIDB4RjAtMHhGNyAqLworCTB4NEUzMiwweDZBREIsMHg5MUU3LDB4NUM1MSwweDVDNDgsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOENbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg2Mzk4LDB4N0E5RiwweDZDOTMsMHg5Nzc0LDB4OEY2MSwweDdBQUEsMHg3MThBLDB4OTY4OCwvKiAweDQwLTB4NDcgKi8KKwkweDdDODIsMHg2ODE3LDB4N0U3MCwweDY4NTEsMHg5MzZDLDB4NTJGMiwweDU0MUIsMHg4NUFCLC8qIDB4NDgtMHg0RiAqLworCTB4OEExMywweDdGQTQsMHg4RUNELDB4OTBFMSwweDUzNjYsMHg4ODg4LDB4Nzk0MSwweDRGQzIsLyogMHg1MC0weDU3ICovCisJMHg1MEJFLDB4NTIxMSwweDUxNDQsMHg1NTUzLDB4NTcyRCwweDczRUEsMHg1NzhCLDB4NTk1MSwvKiAweDU4LTB4NUYgKi8KKwkweDVGNjIsMHg1Rjg0LDB4NjA3NSwweDYxNzYsMHg2MTY3LDB4NjFBOSwweDYzQjIsMHg2NDNBLC8qIDB4NjAtMHg2NyAqLworCTB4NjU2QywweDY2NkYsMHg2ODQyLDB4NkUxMywweDc1NjYsMHg3QTNELDB4N0NGQiwweDdENEMsLyogMHg2OC0weDZGICovCisJMHg3RDk5LDB4N0U0QiwweDdGNkIsMHg4MzBFLDB4ODM0QSwweDg2Q0QsMHg4QTA4LDB4OEE2MywvKiAweDcwLTB4NzcgKi8KKwkweDhCNjYsMHg4RUZELDB4OTgxQSwweDlEOEYsMHg4MkI4LDB4OEZDRSwweDlCRTgsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg1Mjg3LDB4NjIxRiwweDY0ODMsMHg2RkMwLDB4OTY5OSwweDY4NDEsMHg1MDkxLDB4NkIyMCwvKiAweDgwLTB4ODcgKi8KKwkweDZDN0EsMHg2RjU0LDB4N0E3NCwweDdENTAsMHg4ODQwLDB4OEEyMywweDY3MDgsMHg0RUY2LC8qIDB4ODgtMHg4RiAqLworCTB4NTAzOSwweDUwMjYsMHg1MDY1LDB4NTE3QywweDUyMzgsMHg1MjYzLDB4NTVBNywweDU3MEYsLyogMHg5MC0weDk3ICovCisJMHg1ODA1LDB4NUFDQywweDVFRkEsMHg2MUIyLDB4NjFGOCwweDYyRjMsMHg2MzcyLDB4NjkxQywvKiAweDk4LTB4OUYgKi8KKwkweDZBMjksMHg3MjdELDB4NzJBQywweDczMkUsMHg3ODE0LDB4Nzg2RiwweDdENzksMHg3NzBDLC8qIDB4QTAtMHhBNyAqLworCTB4ODBBOSwweDg5OEIsMHg4QjE5LDB4OENFMiwweDhFRDIsMHg5MDYzLDB4OTM3NSwweDk2N0EsLyogMHhBOC0weEFGICovCisJMHg5ODU1LDB4OUExMywweDlFNzgsMHg1MTQzLDB4NTM5RiwweDUzQjMsMHg1RTdCLDB4NUYyNiwvKiAweEIwLTB4QjcgKi8KKwkweDZFMUIsMHg2RTkwLDB4NzM4NCwweDczRkUsMHg3RDQzLDB4ODIzNywweDhBMDAsMHg4QUZBLC8qIDB4QjgtMHhCRiAqLworCTB4OTY1MCwweDRFNEUsMHg1MDBCLDB4NTNFNCwweDU0N0MsMHg1NkZBLDB4NTlEMSwweDVCNjQsLyogMHhDMC0weEM3ICovCisJMHg1REYxLDB4NUVBQiwweDVGMjcsMHg2MjM4LDB4NjU0NSwweDY3QUYsMHg2RTU2LDB4NzJEMCwvKiAweEM4LTB4Q0YgKi8KKwkweDdDQ0EsMHg4OEI0LDB4ODBBMSwweDgwRTEsMHg4M0YwLDB4ODY0RSwweDhBODcsMHg4REU4LC8qIDB4RDAtMHhENyAqLworCTB4OTIzNywweDk2QzcsMHg5ODY3LDB4OUYxMywweDRFOTQsMHg0RTkyLDB4NEYwRCwweDUzNDgsLyogMHhEOC0weERGICovCisJMHg1NDQ5LDB4NTQzRSwweDVBMkYsMHg1RjhDLDB4NUZBMSwweDYwOUYsMHg2OEE3LDB4NkE4RSwvKiAweEUwLTB4RTcgKi8KKwkweDc0NUEsMHg3ODgxLDB4OEE5RSwweDhBQTQsMHg4Qjc3LDB4OTE5MCwweDRFNUUsMHg5QkM5LC8qIDB4RTgtMHhFRiAqLworCTB4NEVBNCwweDRGN0MsMHg0RkFGLDB4NTAxOSwweDUwMTYsMHg1MTQ5LDB4NTE2QywweDUyOUYsLyogMHhGMC0weEY3ICovCisJMHg1MkI5LDB4NTJGRSwweDUzOUEsMHg1M0UzLDB4NTQxMSwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV84RFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDU0MEUsMHg1NTg5LDB4NTc1MSwweDU3QTIsMHg1OTdELDB4NUI1NCwweDVCNUQsMHg1QjhGLC8qIDB4NDAtMHg0NyAqLworCTB4NURFNSwweDVERTcsMHg1REY3LDB4NUU3OCwweDVFODMsMHg1RTlBLDB4NUVCNywweDVGMTgsLyogMHg0OC0weDRGICovCisJMHg2MDUyLDB4NjE0QywweDYyOTcsMHg2MkQ4LDB4NjNBNywweDY1M0IsMHg2NjAyLDB4NjY0MywvKiAweDUwLTB4NTcgKi8KKwkweDY2RjQsMHg2NzZELDB4NjgyMSwweDY4OTcsMHg2OUNCLDB4NkM1RiwweDZEMkEsMHg2RDY5LC8qIDB4NTgtMHg1RiAqLworCTB4NkUyRiwweDZFOUQsMHg3NTMyLDB4NzY4NywweDc4NkMsMHg3QTNGLDB4N0NFMCwweDdEMDUsLyogMHg2MC0weDY3ICovCisJMHg3RDE4LDB4N0Q1RSwweDdEQjEsMHg4MDE1LDB4ODAwMywweDgwQUYsMHg4MEIxLDB4ODE1NCwvKiAweDY4LTB4NkYgKi8KKwkweDgxOEYsMHg4MjJBLDB4ODM1MiwweDg4NEMsMHg4ODYxLDB4OEIxQiwweDhDQTIsMHg4Q0ZDLC8qIDB4NzAtMHg3NyAqLworCTB4OTBDQSwweDkxNzUsMHg5MjcxLDB4NzgzRiwweDkyRkMsMHg5NUE0LDB4OTY0RCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDk4MDUsMHg5OTk5LDB4OUFEOCwweDlEM0IsMHg1MjVCLDB4NTJBQiwweDUzRjcsMHg1NDA4LC8qIDB4ODAtMHg4NyAqLworCTB4NThENSwweDYyRjcsMHg2RkUwLDB4OEM2QSwweDhGNUYsMHg5RUI5LDB4NTE0QiwweDUyM0IsLyogMHg4OC0weDhGICovCisJMHg1NDRBLDB4NTZGRCwweDdBNDAsMHg5MTc3LDB4OUQ2MCwweDlFRDIsMHg3MzQ0LDB4NkYwOSwvKiAweDkwLTB4OTcgKi8KKwkweDgxNzAsMHg3NTExLDB4NUZGRCwweDYwREEsMHg5QUE4LDB4NzJEQiwweDhGQkMsMHg2QjY0LC8qIDB4OTgtMHg5RiAqLworCTB4OTgwMywweDRFQ0EsMHg1NkYwLDB4NTc2NCwweDU4QkUsMHg1QTVBLDB4NjA2OCwweDYxQzcsLyogMHhBMC0weEE3ICovCisJMHg2NjBGLDB4NjYwNiwweDY4MzksMHg2OEIxLDB4NkRGNywweDc1RDUsMHg3RDNBLDB4ODI2RSwvKiAweEE4LTB4QUYgKi8KKwkweDlCNDIsMHg0RTlCLDB4NEY1MCwweDUzQzksMHg1NTA2LDB4NUQ2RiwweDVERTYsMHg1REVFLC8qIDB4QjAtMHhCNyAqLworCTB4NjdGQiwweDZDOTksMHg3NDczLDB4NzgwMiwweDhBNTAsMHg5Mzk2LDB4ODhERiwweDU3NTAsLyogMHhCOC0weEJGICovCisJMHg1RUE3LDB4NjMyQiwweDUwQjUsMHg1MEFDLDB4NTE4RCwweDY3MDAsMHg1NEM5LDB4NTg1RSwvKiAweEMwLTB4QzcgKi8KKwkweDU5QkIsMHg1QkIwLDB4NUY2OSwweDYyNEQsMHg2M0ExLDB4NjgzRCwweDZCNzMsMHg2RTA4LC8qIDB4QzgtMHhDRiAqLworCTB4NzA3RCwweDkxQzcsMHg3MjgwLDB4NzgxNSwweDc4MjYsMHg3OTZELDB4NjU4RSwweDdEMzAsLyogMHhEMC0weEQ3ICovCisJMHg4M0RDLDB4ODhDMSwweDhGMDksMHg5NjlCLDB4NTI2NCwweDU3MjgsMHg2NzUwLDB4N0Y2QSwvKiAweEQ4LTB4REYgKi8KKwkweDhDQTEsMHg1MUI0LDB4NTc0MiwweDk2MkEsMHg1ODNBLDB4Njk4QSwweDgwQjQsMHg1NEIyLC8qIDB4RTAtMHhFNyAqLworCTB4NUQwRSwweDU3RkMsMHg3ODk1LDB4OURGQSwweDRGNUMsMHg1MjRBLDB4NTQ4QiwweDY0M0UsLyogMHhFOC0weEVGICovCisJMHg2NjI4LDB4NjcxNCwweDY3RjUsMHg3QTg0LDB4N0I1NiwweDdEMjIsMHg5MzJGLDB4Njg1QywvKiAweEYwLTB4RjcgKi8KKwkweDlCQUQsMHg3QjM5LDB4NTMxOSwweDUxOEEsMHg1MjM3LDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzhFWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NUJERiwweDYyRjYsMHg2NEFFLDB4NjRFNiwweDY3MkQsMHg2QkJBLDB4ODVBOSwweDk2RDEsLyogMHg0MC0weDQ3ICovCisJMHg3NjkwLDB4OUJENiwweDYzNEMsMHg5MzA2LDB4OUJBQiwweDc2QkYsMHg2NjUyLDB4NEUwOSwvKiAweDQ4LTB4NEYgKi8KKwkweDUwOTgsMHg1M0MyLDB4NUM3MSwweDYwRTgsMHg2NDkyLDB4NjU2MywweDY4NUYsMHg3MUU2LC8qIDB4NTAtMHg1NyAqLworCTB4NzNDQSwweDc1MjMsMHg3Qjk3LDB4N0U4MiwweDg2OTUsMHg4QjgzLDB4OENEQiwweDkxNzgsLyogMHg1OC0weDVGICovCisJMHg5OTEwLDB4NjVBQywweDY2QUIsMHg2QjhCLDB4NEVENSwweDRFRDQsMHg0RjNBLDB4NEY3RiwvKiAweDYwLTB4NjcgKi8KKwkweDUyM0EsMHg1M0Y4LDB4NTNGMiwweDU1RTMsMHg1NkRCLDB4NThFQiwweDU5Q0IsMHg1OUM5LC8qIDB4NjgtMHg2RiAqLworCTB4NTlGRiwweDVCNTAsMHg1QzRELDB4NUUwMiwweDVFMkIsMHg1RkQ3LDB4NjAxRCwweDYzMDcsLyogMHg3MC0weDc3ICovCisJMHg2NTJGLDB4NUI1QywweDY1QUYsMHg2NUJELDB4NjVFOCwweDY3OUQsMHg2QjYyLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NkI3QiwweDZDMEYsMHg3MzQ1LDB4Nzk0OSwweDc5QzEsMHg3Q0Y4LDB4N0QxOSwweDdEMkIsLyogMHg4MC0weDg3ICovCisJMHg4MEEyLDB4ODEwMiwweDgxRjMsMHg4OTk2LDB4OEE1RSwweDhBNjksMHg4QTY2LDB4OEE4QywvKiAweDg4LTB4OEYgKi8KKwkweDhBRUUsMHg4Q0M3LDB4OENEQywweDk2Q0MsMHg5OEZDLDB4NkI2RiwweDRFOEIsMHg0RjNDLC8qIDB4OTAtMHg5NyAqLworCTB4NEY4RCwweDUxNTAsMHg1QjU3LDB4NUJGQSwweDYxNDgsMHg2MzAxLDB4NjY0MiwweDZCMjEsLyogMHg5OC0weDlGICovCisJMHg2RUNCLDB4NkNCQiwweDcyM0UsMHg3NEJELDB4NzVENCwweDc4QzEsMHg3OTNBLDB4ODAwQywvKiAweEEwLTB4QTcgKi8KKwkweDgwMzMsMHg4MUVBLDB4ODQ5NCwweDhGOUUsMHg2QzUwLDB4OUU3RiwweDVGMEYsMHg4QjU4LC8qIDB4QTgtMHhBRiAqLworCTB4OUQyQiwweDdBRkEsMHg4RUY4LDB4NUI4RCwweDk2RUIsMHg0RTAzLDB4NTNGMSwweDU3RjcsLyogMHhCMC0weEI3ICovCisJMHg1OTMxLDB4NUFDOSwweDVCQTQsMHg2MDg5LDB4NkU3RiwweDZGMDYsMHg3NUJFLDB4OENFQSwvKiAweEI4LTB4QkYgKi8KKwkweDVCOUYsMHg4NTAwLDB4N0JFMCwweDUwNzIsMHg2N0Y0LDB4ODI5RCwweDVDNjEsMHg4NTRBLC8qIDB4QzAtMHhDNyAqLworCTB4N0UxRSwweDgyMEUsMHg1MTk5LDB4NUMwNCwweDYzNjgsMHg4RDY2LDB4NjU5QywweDcxNkUsLyogMHhDOC0weENGICovCisJMHg3OTNFLDB4N0QxNywweDgwMDUsMHg4QjFELDB4OEVDQSwweDkwNkUsMHg4NkM3LDB4OTBBQSwvKiAweEQwLTB4RDcgKi8KKwkweDUwMUYsMHg1MkZBLDB4NUMzQSwweDY3NTMsMHg3MDdDLDB4NzIzNSwweDkxNEMsMHg5MUM4LC8qIDB4RDgtMHhERiAqLworCTB4OTMyQiwweDgyRTUsMHg1QkMyLDB4NUYzMSwweDYwRjksMHg0RTNCLDB4NTNENiwweDVCODgsLyogMHhFMC0weEU3ICovCisJMHg2MjRCLDB4NjczMSwweDZCOEEsMHg3MkU5LDB4NzNFMCwweDdBMkUsMHg4MTZCLDB4OERBMywvKiAweEU4LTB4RUYgKi8KKwkweDkxNTIsMHg5OTk2LDB4NTExMiwweDUzRDcsMHg1NDZBLDB4NUJGRiwweDYzODgsMHg2QTM5LC8qIDB4RjAtMHhGNyAqLworCTB4N0RBQywweDk3MDAsMHg1NkRBLDB4NTNDRSwweDU0NjgsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOEZbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg1Qjk3LDB4NUMzMSwweDVEREUsMHg0RkVFLDB4NjEwMSwweDYyRkUsMHg2RDMyLDB4NzlDMCwvKiAweDQwLTB4NDcgKi8KKwkweDc5Q0IsMHg3RDQyLDB4N0U0RCwweDdGRDIsMHg4MUVELDB4ODIxRiwweDg0OTAsMHg4ODQ2LC8qIDB4NDgtMHg0RiAqLworCTB4ODk3MiwweDhCOTAsMHg4RTc0LDB4OEYyRiwweDkwMzEsMHg5MTRCLDB4OTE2QywweDk2QzYsLyogMHg1MC0weDU3ICovCisJMHg5MTlDLDB4NEVDMCwweDRGNEYsMHg1MTQ1LDB4NTM0MSwweDVGOTMsMHg2MjBFLDB4NjdENCwvKiAweDU4LTB4NUYgKi8KKwkweDZDNDEsMHg2RTBCLDB4NzM2MywweDdFMjYsMHg5MUNELDB4OTI4MywweDUzRDQsMHg1OTE5LC8qIDB4NjAtMHg2NyAqLworCTB4NUJCRiwweDZERDEsMHg3OTVELDB4N0UyRSwweDdDOUIsMHg1ODdFLDB4NzE5RiwweDUxRkEsLyogMHg2OC0weDZGICovCisJMHg4ODUzLDB4OEZGMCwweDRGQ0EsMHg1Q0ZCLDB4NjYyNSwweDc3QUMsMHg3QUUzLDB4ODIxQywvKiAweDcwLTB4NzcgKi8KKwkweDk5RkYsMHg1MUM2LDB4NUZBQSwweDY1RUMsMHg2OTZGLDB4NkI4OSwweDZERjMsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg2RTk2LDB4NkY2NCwweDc2RkUsMHg3RDE0LDB4NURFMSwweDkwNzUsMHg5MTg3LDB4OTgwNiwvKiAweDgwLTB4ODcgKi8KKwkweDUxRTYsMHg1MjFELDB4NjI0MCwweDY2OTEsMHg2NkQ5LDB4NkUxQSwweDVFQjYsMHg3REQyLC8qIDB4ODgtMHg4RiAqLworCTB4N0Y3MiwweDY2RjgsMHg4NUFGLDB4ODVGNywweDhBRjgsMHg1MkE5LDB4NTNEOSwweDU5NzMsLyogMHg5MC0weDk3ICovCisJMHg1RThGLDB4NUY5MCwweDYwNTUsMHg5MkU0LDB4OTY2NCwweDUwQjcsMHg1MTFGLDB4NTJERCwvKiAweDk4LTB4OUYgKi8KKwkweDUzMjAsMHg1MzQ3LDB4NTNFQywweDU0RTgsMHg1NTQ2LDB4NTUzMSwweDU2MTcsMHg1OTY4LC8qIDB4QTAtMHhBNyAqLworCTB4NTlCRSwweDVBM0MsMHg1QkI1LDB4NUMwNiwweDVDMEYsMHg1QzExLDB4NUMxQSwweDVFODQsLyogMHhBOC0weEFGICovCisJMHg1RThBLDB4NUVFMCwweDVGNzAsMHg2MjdGLDB4NjI4NCwweDYyREIsMHg2MzhDLDB4NjM3NywvKiAweEIwLTB4QjcgKi8KKwkweDY2MDcsMHg2NjBDLDB4NjYyRCwweDY2NzYsMHg2NzdFLDB4NjhBMiwweDZBMUYsMHg2QTM1LC8qIDB4QjgtMHhCRiAqLworCTB4NkNCQywweDZEODgsMHg2RTA5LDB4NkU1OCwweDcxM0MsMHg3MTI2LDB4NzE2NywweDc1QzcsLyogMHhDMC0weEM3ICovCisJMHg3NzAxLDB4Nzg1RCwweDc5MDEsMHg3OTY1LDB4NzlGMCwweDdBRTAsMHg3QjExLDB4N0NBNywvKiAweEM4LTB4Q0YgKi8KKwkweDdEMzksMHg4MDk2LDB4ODNENiwweDg0OEIsMHg4NTQ5LDB4ODg1RCwweDg4RjMsMHg4QTFGLC8qIDB4RDAtMHhENyAqLworCTB4OEEzQywweDhBNTQsMHg4QTczLDB4OEM2MSwweDhDREUsMHg5MUE0LDB4OTI2NiwweDkzN0UsLyogMHhEOC0weERGICovCisJMHg5NDE4LDB4OTY5QywweDk3OTgsMHg0RTBBLDB4NEUwOCwweDRFMUUsMHg0RTU3LDB4NTE5NywvKiAweEUwLTB4RTcgKi8KKwkweDUyNzAsMHg1N0NFLDB4NTgzNCwweDU4Q0MsMHg1QjIyLDB4NUUzOCwweDYwQzUsMHg2NEZFLC8qIDB4RTgtMHhFRiAqLworCTB4Njc2MSwweDY3NTYsMHg2RDQ0LDB4NzJCNiwweDc1NzMsMHg3QTYzLDB4ODRCOCwweDhCNzIsLyogMHhGMC0weEY3ICovCisJMHg5MUI4LDB4OTMyMCwweDU2MzEsMHg1N0Y0LDB4OThGRSwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV85MFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDYyRUQsMHg2OTBELDB4NkI5NiwweDcxRUQsMHg3RTU0LDB4ODA3NywweDgyNzIsMHg4OUU2LC8qIDB4NDAtMHg0NyAqLworCTB4OThERiwweDg3NTUsMHg4RkIxLDB4NUMzQiwweDRGMzgsMHg0RkUxLDB4NEZCNSwweDU1MDcsLyogMHg0OC0weDRGICovCisJMHg1QTIwLDB4NUJERCwweDVCRTksMHg1RkMzLDB4NjE0RSwweDYzMkYsMHg2NUIwLDB4NjY0QiwvKiAweDUwLTB4NTcgKi8KKwkweDY4RUUsMHg2OTlCLDB4NkQ3OCwweDZERjEsMHg3NTMzLDB4NzVCOSwweDc3MUYsMHg3OTVFLC8qIDB4NTgtMHg1RiAqLworCTB4NzlFNiwweDdEMzMsMHg4MUUzLDB4ODJBRiwweDg1QUEsMHg4OUFBLDB4OEEzQSwweDhFQUIsLyogMHg2MC0weDY3ICovCisJMHg4RjlCLDB4OTAzMiwweDkxREQsMHg5NzA3LDB4NEVCQSwweDRFQzEsMHg1MjAzLDB4NTg3NSwvKiAweDY4LTB4NkYgKi8KKwkweDU4RUMsMHg1QzBCLDB4NzUxQSwweDVDM0QsMHg4MTRFLDB4OEEwQSwweDhGQzUsMHg5NjYzLC8qIDB4NzAtMHg3NyAqLworCTB4OTc2RCwweDdCMjUsMHg4QUNGLDB4OTgwOCwweDkxNjIsMHg1NkYzLDB4NTNBOCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDkwMTcsMHg1NDM5LDB4NTc4MiwweDVFMjUsMHg2M0E4LDB4NkMzNCwweDcwOEEsMHg3NzYxLC8qIDB4ODAtMHg4NyAqLworCTB4N0M4QiwweDdGRTAsMHg4ODcwLDB4OTA0MiwweDkxNTQsMHg5MzEwLDB4OTMxOCwweDk2OEYsLyogMHg4OC0weDhGICovCisJMHg3NDVFLDB4OUFDNCwweDVEMDcsMHg1RDY5LDB4NjU3MCwweDY3QTIsMHg4REE4LDB4OTZEQiwvKiAweDkwLTB4OTcgKi8KKwkweDYzNkUsMHg2NzQ5LDB4NjkxOSwweDgzQzUsMHg5ODE3LDB4OTZDMCwweDg4RkUsMHg2Rjg0LC8qIDB4OTgtMHg5RiAqLworCTB4NjQ3QSwweDVCRjgsMHg0RTE2LDB4NzAyQywweDc1NUQsMHg2NjJGLDB4NTFDNCwweDUyMzYsLyogMHhBMC0weEE3ICovCisJMHg1MkUyLDB4NTlEMywweDVGODEsMHg2MDI3LDB4NjIxMCwweDY1M0YsMHg2NTc0LDB4NjYxRiwvKiAweEE4LTB4QUYgKi8KKwkweDY2NzQsMHg2OEYyLDB4NjgxNiwweDZCNjMsMHg2RTA1LDB4NzI3MiwweDc1MUYsMHg3NkRCLC8qIDB4QjAtMHhCNyAqLworCTB4N0NCRSwweDgwNTYsMHg1OEYwLDB4ODhGRCwweDg5N0YsMHg4QUEwLDB4OEE5MywweDhBQ0IsLyogMHhCOC0weEJGICovCisJMHg5MDFELDB4OTE5MiwweDk3NTIsMHg5NzU5LDB4NjU4OSwweDdBMEUsMHg4MTA2LDB4OTZCQiwvKiAweEMwLTB4QzcgKi8KKwkweDVFMkQsMHg2MERDLDB4NjIxQSwweDY1QTUsMHg2NjE0LDB4Njc5MCwweDc3RjMsMHg3QTRELC8qIDB4QzgtMHhDRiAqLworCTB4N0M0RCwweDdFM0UsMHg4MTBBLDB4OENBQywweDhENjQsMHg4REUxLDB4OEU1RiwweDc4QTksLyogMHhEMC0weEQ3ICovCisJMHg1MjA3LDB4NjJEOSwweDYzQTUsMHg2NDQyLDB4NjI5OCwweDhBMkQsMHg3QTgzLDB4N0JDMCwvKiAweEQ4LTB4REYgKi8KKwkweDhBQUMsMHg5NkVBLDB4N0Q3NiwweDgyMEMsMHg4NzQ5LDB4NEVEOSwweDUxNDgsMHg1MzQzLC8qIDB4RTAtMHhFNyAqLworCTB4NTM2MCwweDVCQTMsMHg1QzAyLDB4NUMxNiwweDVEREQsMHg2MjI2LDB4NjI0NywweDY0QjAsLyogMHhFOC0weEVGICovCisJMHg2ODEzLDB4NjgzNCwweDZDQzksMHg2RDQ1LDB4NkQxNywweDY3RDMsMHg2RjVDLDB4NzE0RSwvKiAweEYwLTB4RjcgKi8KKwkweDcxN0QsMHg2NUNCLDB4N0E3RiwweDdCQUQsMHg3RERBLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzkxWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4N0U0QSwweDdGQTgsMHg4MTdBLDB4ODIxQiwweDgyMzksMHg4NUE2LDB4OEE2RSwweDhDQ0UsLyogMHg0MC0weDQ3ICovCisJMHg4REY1LDB4OTA3OCwweDkwNzcsMHg5MkFELDB4OTI5MSwweDk1ODMsMHg5QkFFLDB4NTI0RCwvKiAweDQ4LTB4NEYgKi8KKwkweDU1ODQsMHg2RjM4LDB4NzEzNiwweDUxNjgsMHg3OTg1LDB4N0U1NSwweDgxQjMsMHg3Q0NFLC8qIDB4NTAtMHg1NyAqLworCTB4NTY0QywweDU4NTEsMHg1Q0E4LDB4NjNBQSwweDY2RkUsMHg2NkZELDB4Njk1QSwweDcyRDksLyogMHg1OC0weDVGICovCisJMHg3NThGLDB4NzU4RSwweDc5MEUsMHg3OTU2LDB4NzlERiwweDdDOTcsMHg3RDIwLDB4N0Q0NCwvKiAweDYwLTB4NjcgKi8KKwkweDg2MDcsMHg4QTM0LDB4OTYzQiwweDkwNjEsMHg5RjIwLDB4NTBFNywweDUyNzUsMHg1M0NDLC8qIDB4NjgtMHg2RiAqLworCTB4NTNFMiwweDUwMDksMHg1NUFBLDB4NThFRSwweDU5NEYsMHg3MjNELDB4NUI4QiwweDVDNjQsLyogMHg3MC0weDc3ICovCisJMHg1MzFELDB4NjBFMywweDYwRjMsMHg2MzVDLDB4NjM4MywweDYzM0YsMHg2M0JCLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NjRDRCwweDY1RTksMHg2NkY5LDB4NURFMywweDY5Q0QsMHg2OUZELDB4NkYxNSwweDcxRTUsLyogMHg4MC0weDg3ICovCisJMHg0RTg5LDB4NzVFOSwweDc2RjgsMHg3QTkzLDB4N0NERiwweDdEQ0YsMHg3RDlDLDB4ODA2MSwvKiAweDg4LTB4OEYgKi8KKwkweDgzNDksMHg4MzU4LDB4ODQ2QywweDg0QkMsMHg4NUZCLDB4ODhDNSwweDhENzAsMHg5MDAxLC8qIDB4OTAtMHg5NyAqLworCTB4OTA2RCwweDkzOTcsMHg5NzFDLDB4OUExMiwweDUwQ0YsMHg1ODk3LDB4NjE4RSwweDgxRDMsLyogMHg5OC0weDlGICovCisJMHg4NTM1LDB4OEQwOCwweDkwMjAsMHg0RkMzLDB4NTA3NCwweDUyNDcsMHg1MzczLDB4NjA2RiwvKiAweEEwLTB4QTcgKi8KKwkweDYzNDksMHg2NzVGLDB4NkUyQywweDhEQjMsMHg5MDFGLDB4NEZENywweDVDNUUsMHg4Q0NBLC8qIDB4QTgtMHhBRiAqLworCTB4NjVDRiwweDdEOUEsMHg1MzUyLDB4ODg5NiwweDUxNzYsMHg2M0MzLDB4NUI1OCwweDVCNkIsLyogMHhCMC0weEI3ICovCisJMHg1QzBBLDB4NjQwRCwweDY3NTEsMHg5MDVDLDB4NEVENiwweDU5MUEsMHg1OTJBLDB4NkM3MCwvKiAweEI4LTB4QkYgKi8KKwkweDhBNTEsMHg1NTNFLDB4NTgxNSwweDU5QTUsMHg2MEYwLDB4NjI1MywweDY3QzEsMHg4MjM1LC8qIDB4QzAtMHhDNyAqLworCTB4Njk1NSwweDk2NDAsMHg5OUM0LDB4OUEyOCwweDRGNTMsMHg1ODA2LDB4NUJGRSwweDgwMTAsLyogMHhDOC0weENGICovCisJMHg1Q0IxLDB4NUUyRiwweDVGODUsMHg2MDIwLDB4NjE0QiwweDYyMzQsMHg2NkZGLDB4NkNGMCwvKiAweEQwLTB4RDcgKi8KKwkweDZFREUsMHg4MENFLDB4ODE3RiwweDgyRDQsMHg4ODhCLDB4OENCOCwweDkwMDAsMHg5MDJFLC8qIDB4RDgtMHhERiAqLworCTB4OTY4QSwweDlFREIsMHg5QkRCLDB4NEVFMywweDUzRjAsMHg1OTI3LDB4N0IyQywweDkxOEQsLyogMHhFMC0weEU3ICovCisJMHg5ODRDLDB4OURGOSwweDZFREQsMHg3MDI3LDB4NTM1MywweDU1NDQsMHg1Qjg1LDB4NjI1OCwvKiAweEU4LTB4RUYgKi8KKwkweDYyOUUsMHg2MkQzLDB4NkNBMiwweDZGRUYsMHg3NDIyLDB4OEExNywweDk0MzgsMHg2RkMxLC8qIDB4RjAtMHhGNyAqLworCTB4OEFGRSwweDgzMzgsMHg1MUU3LDB4ODZGOCwweDUzRUEsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOTJbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg1M0U5LDB4NEY0NiwweDkwNTQsMHg4RkIwLDB4NTk2QSwweDgxMzEsMHg1REZELDB4N0FFQSwvKiAweDQwLTB4NDcgKi8KKwkweDhGQkYsMHg2OERBLDB4OEMzNywweDcyRjgsMHg5QzQ4LDB4NkEzRCwweDhBQjAsMHg0RTM5LC8qIDB4NDgtMHg0RiAqLworCTB4NTM1OCwweDU2MDYsMHg1NzY2LDB4NjJDNSwweDYzQTIsMHg2NUU2LDB4NkI0RSwweDZERTEsLyogMHg1MC0weDU3ICovCisJMHg2RTVCLDB4NzBBRCwweDc3RUQsMHg3QUVGLDB4N0JBQSwweDdEQkIsMHg4MDNELDB4ODBDNiwvKiAweDU4LTB4NUYgKi8KKwkweDg2Q0IsMHg4QTk1LDB4OTM1QiwweDU2RTMsMHg1OEM3LDB4NUYzRSwweDY1QUQsMHg2Njk2LC8qIDB4NjAtMHg2NyAqLworCTB4NkE4MCwweDZCQjUsMHg3NTM3LDB4OEFDNywweDUwMjQsMHg3N0U1LDB4NTczMCwweDVGMUIsLyogMHg2OC0weDZGICovCisJMHg2MDY1LDB4NjY3QSwweDZDNjAsMHg3NUY0LDB4N0ExQSwweDdGNkUsMHg4MUY0LDB4ODcxOCwvKiAweDcwLTB4NzcgKi8KKwkweDkwNDUsMHg5OUIzLDB4N0JDOSwweDc1NUMsMHg3QUY5LDB4N0I1MSwweDg0QzQsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg5MDEwLDB4NzlFOSwweDdBOTIsMHg4MzM2LDB4NUFFMSwweDc3NDAsMHg0RTJELDB4NEVGMiwvKiAweDgwLTB4ODcgKi8KKwkweDVCOTksMHg1RkUwLDB4NjJCRCwweDY2M0MsMHg2N0YxLDB4NkNFOCwweDg2NkIsMHg4ODc3LC8qIDB4ODgtMHg4RiAqLworCTB4OEEzQiwweDkxNEUsMHg5MkYzLDB4OTlEMCwweDZBMTcsMHg3MDI2LDB4NzMyQSwweDgyRTcsLyogMHg5MC0weDk3ICovCisJMHg4NDU3LDB4OENBRiwweDRFMDEsMHg1MTQ2LDB4NTFDQiwweDU1OEIsMHg1QkY1LDB4NUUxNiwvKiAweDk4LTB4OUYgKi8KKwkweDVFMzMsMHg1RTgxLDB4NUYxNCwweDVGMzUsMHg1RjZCLDB4NUZCNCwweDYxRjIsMHg2MzExLC8qIDB4QTAtMHhBNyAqLworCTB4NjZBMiwweDY3MUQsMHg2RjZFLDB4NzI1MiwweDc1M0EsMHg3NzNBLDB4ODA3NCwweDgxMzksLyogMHhBOC0weEFGICovCisJMHg4MTc4LDB4ODc3NiwweDhBQkYsMHg4QURDLDB4OEQ4NSwweDhERjMsMHg5MjlBLDB4OTU3NywvKiAweEIwLTB4QjcgKi8KKwkweDk4MDIsMHg5Q0U1LDB4NTJDNSwweDYzNTcsMHg3NkY0LDB4NjcxNSwweDZDODgsMHg3M0NELC8qIDB4QjgtMHhCRiAqLworCTB4OENDMywweDkzQUUsMHg5NjczLDB4NkQyNSwweDU4OUMsMHg2OTBFLDB4NjlDQywweDhGRkQsLyogMHhDMC0weEM3ICovCisJMHg5MzlBLDB4NzVEQiwweDkwMUEsMHg1ODVBLDB4NjgwMiwweDYzQjQsMHg2OUZCLDB4NEY0MywvKiAweEM4LTB4Q0YgKi8KKwkweDZGMkMsMHg2N0Q4LDB4OEZCQiwweDg1MjYsMHg3REI0LDB4OTM1NCwweDY5M0YsMHg2RjcwLC8qIDB4RDAtMHhENyAqLworCTB4NTc2QSwweDU4RjcsMHg1QjJDLDB4N0QyQywweDcyMkEsMHg1NDBBLDB4OTFFMywweDlEQjQsLyogMHhEOC0weERGICovCisJMHg0RUFELDB4NEY0RSwweDUwNUMsMHg1MDc1LDB4NTI0MywweDhDOUUsMHg1NDQ4LDB4NTgyNCwvKiAweEUwLTB4RTcgKi8KKwkweDVCOUEsMHg1RTFELDB4NUU5NSwweDVFQUQsMHg1RUY3LDB4NUYxRiwweDYwOEMsMHg2MkI1LC8qIDB4RTgtMHhFRiAqLworCTB4NjMzQSwweDYzRDAsMHg2OEFGLDB4NkM0MCwweDc4ODcsMHg3OThFLDB4N0EwQiwweDdERTAsLyogMHhGMC0weEY3ICovCisJMHg4MjQ3LDB4OEEwMiwweDhBRTYsMHg4RTQ0LDB4OTAxMywweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV85M1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDkwQjgsMHg5MTJELDB4OTFEOCwweDlGMEUsMHg2Q0U1LDB4NjQ1OCwweDY0RTIsMHg2NTc1LC8qIDB4NDAtMHg0NyAqLworCTB4NkVGNCwweDc2ODQsMHg3QjFCLDB4OTA2OSwweDkzRDEsMHg2RUJBLDB4NTRGMiwweDVGQjksLyogMHg0OC0weDRGICovCisJMHg2NEE0LDB4OEY0RCwweDhGRUQsMHg5MjQ0LDB4NTE3OCwweDU4NkIsMHg1OTI5LDB4NUM1NSwvKiAweDUwLTB4NTcgKi8KKwkweDVFOTcsMHg2REZCLDB4N0U4RiwweDc1MUMsMHg4Q0JDLDB4OEVFMiwweDk4NUIsMHg3MEI5LC8qIDB4NTgtMHg1RiAqLworCTB4NEYxRCwweDZCQkYsMHg2RkIxLDB4NzUzMCwweDk2RkIsMHg1MTRFLDB4NTQxMCwweDU4MzUsLyogMHg2MC0weDY3ICovCisJMHg1ODU3LDB4NTlBQywweDVDNjAsMHg1RjkyLDB4NjU5NywweDY3NUMsMHg2RTIxLDB4NzY3QiwvKiAweDY4LTB4NkYgKi8KKwkweDgzREYsMHg4Q0VELDB4OTAxNCwweDkwRkQsMHg5MzRELDB4NzgyNSwweDc4M0EsMHg1MkFBLC8qIDB4NzAtMHg3NyAqLworCTB4NUVBNiwweDU3MUYsMHg1OTc0LDB4NjAxMiwweDUwMTIsMHg1MTVBLDB4NTFBQywweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDUxQ0QsMHg1MjAwLDB4NTUxMCwweDU4NTQsMHg1ODU4LDB4NTk1NywweDVCOTUsMHg1Q0Y2LC8qIDB4ODAtMHg4NyAqLworCTB4NUQ4QiwweDYwQkMsMHg2Mjk1LDB4NjQyRCwweDY3NzEsMHg2ODQzLDB4NjhCQywweDY4REYsLyogMHg4OC0weDhGICovCisJMHg3NkQ3LDB4NkREOCwweDZFNkYsMHg2RDlCLDB4NzA2RiwweDcxQzgsMHg1RjUzLDB4NzVEOCwvKiAweDkwLTB4OTcgKi8KKwkweDc5NzcsMHg3QjQ5LDB4N0I1NCwweDdCNTIsMHg3Q0Q2LDB4N0Q3MSwweDUyMzAsMHg4NDYzLC8qIDB4OTgtMHg5RiAqLworCTB4ODU2OSwweDg1RTQsMHg4QTBFLDB4OEIwNCwweDhDNDYsMHg4RTBGLDB4OTAwMywweDkwMEYsLyogMHhBMC0weEE3ICovCisJMHg5NDE5LDB4OTY3NiwweDk4MkQsMHg5QTMwLDB4OTVEOCwweDUwQ0QsMHg1MkQ1LDB4NTQwQywvKiAweEE4LTB4QUYgKi8KKwkweDU4MDIsMHg1QzBFLDB4NjFBNywweDY0OUUsMHg2RDFFLDB4NzdCMywweDdBRTUsMHg4MEY0LC8qIDB4QjAtMHhCNyAqLworCTB4ODQwNCwweDkwNTMsMHg5Mjg1LDB4NUNFMCwweDlEMDcsMHg1MzNGLDB4NUY5NywweDVGQjMsLyogMHhCOC0weEJGICovCisJMHg2RDlDLDB4NzI3OSwweDc3NjMsMHg3OUJGLDB4N0JFNCwweDZCRDIsMHg3MkVDLDB4OEFBRCwvKiAweEMwLTB4QzcgKi8KKwkweDY4MDMsMHg2QTYxLDB4NTFGOCwweDdBODEsMHg2OTM0LDB4NUM0QSwweDlDRjYsMHg4MkVCLC8qIDB4QzgtMHhDRiAqLworCTB4NUJDNSwweDkxNDksMHg3MDFFLDB4NTY3OCwweDVDNkYsMHg2MEM3LDB4NjU2NiwweDZDOEMsLyogMHhEMC0weEQ3ICovCisJMHg4QzVBLDB4OTA0MSwweDk4MTMsMHg1NDUxLDB4NjZDNywweDkyMEQsMHg1OTQ4LDB4OTBBMywvKiAweEQ4LTB4REYgKi8KKwkweDUxODUsMHg0RTRELDB4NTFFQSwweDg1OTksMHg4QjBFLDB4NzA1OCwweDYzN0EsMHg5MzRCLC8qIDB4RTAtMHhFNyAqLworCTB4Njk2MiwweDk5QjQsMHg3RTA0LDB4NzU3NywweDUzNTcsMHg2OTYwLDB4OEVERiwweDk2RTMsLyogMHhFOC0weEVGICovCisJMHg2QzVELDB4NEU4QywweDVDM0MsMHg1RjEwLDB4OEZFOSwweDUzMDIsMHg4Q0QxLDB4ODA4OSwvKiAweEYwLTB4RjcgKi8KKwkweDg2NzksMHg1RUZGLDB4NjVFNSwweDRFNzMsMHg1MTY1LDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1Xzk0WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NTk4MiwweDVDM0YsMHg5N0VFLDB4NEVGQiwweDU5OEEsMHg1RkNELDB4OEE4RCwweDZGRTEsLyogMHg0MC0weDQ3ICovCisJMHg3OUIwLDB4Nzk2MiwweDVCRTcsMHg4NDcxLDB4NzMyQiwweDcxQjEsMHg1RTc0LDB4NUZGNSwvKiAweDQ4LTB4NEYgKi8KKwkweDYzN0IsMHg2NDlBLDB4NzFDMywweDdDOTgsMHg0RTQzLDB4NUVGQywweDRFNEIsMHg1N0RDLC8qIDB4NTAtMHg1NyAqLworCTB4NTZBMiwweDYwQTksMHg2RkMzLDB4N0QwRCwweDgwRkQsMHg4MTMzLDB4ODFCRiwweDhGQjIsLyogMHg1OC0weDVGICovCisJMHg4OTk3LDB4ODZBNCwweDVERjQsMHg2MjhBLDB4NjRBRCwweDg5ODcsMHg2Nzc3LDB4NkNFMiwvKiAweDYwLTB4NjcgKi8KKwkweDZEM0UsMHg3NDM2LDB4NzgzNCwweDVBNDYsMHg3Rjc1LDB4ODJBRCwweDk5QUMsMHg0RkYzLC8qIDB4NjgtMHg2RiAqLworCTB4NUVDMywweDYyREQsMHg2MzkyLDB4NjU1NywweDY3NkYsMHg3NkMzLDB4NzI0QywweDgwQ0MsLyogMHg3MC0weDc3ICovCisJMHg4MEJBLDB4OEYyOSwweDkxNEQsMHg1MDBELDB4NTdGOSwweDVBOTIsMHg2ODg1LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4Njk3MywweDcxNjQsMHg3MkZELDB4OENCNywweDU4RjIsMHg4Q0UwLDB4OTY2QSwweDkwMTksLyogMHg4MC0weDg3ICovCisJMHg4NzdGLDB4NzlFNCwweDc3RTcsMHg4NDI5LDB4NEYyRiwweDUyNjUsMHg1MzVBLDB4NjJDRCwvKiAweDg4LTB4OEYgKi8KKwkweDY3Q0YsMHg2Q0NBLDB4NzY3RCwweDdCOTQsMHg3Qzk1LDB4ODIzNiwweDg1ODQsMHg4RkVCLC8qIDB4OTAtMHg5NyAqLworCTB4NjZERCwweDZGMjAsMHg3MjA2LDB4N0UxQiwweDgzQUIsMHg5OUMxLDB4OUVBNiwweDUxRkQsLyogMHg5OC0weDlGICovCisJMHg3QkIxLDB4Nzg3MiwweDdCQjgsMHg4MDg3LDB4N0I0OCwweDZBRTgsMHg1RTYxLDB4ODA4QywvKiAweEEwLTB4QTcgKi8KKwkweDc1NTEsMHg3NTYwLDB4NTE2QiwweDkyNjIsMHg2RThDLDB4NzY3QSwweDkxOTcsMHg5QUVBLC8qIDB4QTgtMHhBRiAqLworCTB4NEYxMCwweDdGNzAsMHg2MjlDLDB4N0I0RiwweDk1QTUsMHg5Q0U5LDB4NTY3QSwweDU4NTksLyogMHhCMC0weEI3ICovCisJMHg4NkU0LDB4OTZCQywweDRGMzQsMHg1MjI0LDB4NTM0QSwweDUzQ0QsMHg1M0RCLDB4NUUwNiwvKiAweEI4LTB4QkYgKi8KKwkweDY0MkMsMHg2NTkxLDB4Njc3RiwweDZDM0UsMHg2QzRFLDB4NzI0OCwweDcyQUYsMHg3M0VELC8qIDB4QzAtMHhDNyAqLworCTB4NzU1NCwweDdFNDEsMHg4MjJDLDB4ODVFOSwweDhDQTksMHg3QkM0LDB4OTFDNiwweDcxNjksLyogMHhDOC0weENGICovCisJMHg5ODEyLDB4OThFRiwweDYzM0QsMHg2NjY5LDB4NzU2QSwweDc2RTQsMHg3OEQwLDB4ODU0MywvKiAweEQwLTB4RDcgKi8KKwkweDg2RUUsMHg1MzJBLDB4NTM1MSwweDU0MjYsMHg1OTgzLDB4NUU4NywweDVGN0MsMHg2MEIyLC8qIDB4RDgtMHhERiAqLworCTB4NjI0OSwweDYyNzksMHg2MkFCLDB4NjU5MCwweDZCRDQsMHg2Q0NDLDB4NzVCMiwweDc2QUUsLyogMHhFMC0weEU3ICovCisJMHg3ODkxLDB4NzlEOCwweDdEQ0IsMHg3Rjc3LDB4ODBBNSwweDg4QUIsMHg4QUI5LDB4OENCQiwvKiAweEU4LTB4RUYgKi8KKwkweDkwN0YsMHg5NzVFLDB4OThEQiwweDZBMEIsMHg3QzM4LDB4NTA5OSwweDVDM0UsMHg1RkFFLC8qIDB4RjAtMHhGNyAqLworCTB4Njc4NywweDZCRDgsMHg3NDM1LDB4NzcwOSwweDdGOEUsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOTVbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5RjNCLDB4NjdDQSwweDdBMTcsMHg1MzM5LDB4NzU4QiwweDlBRUQsMHg1RjY2LDB4ODE5RCwvKiAweDQwLTB4NDcgKi8KKwkweDgzRjEsMHg4MDk4LDB4NUYzQywweDVGQzUsMHg3NTYyLDB4N0I0NiwweDkwM0MsMHg2ODY3LC8qIDB4NDgtMHg0RiAqLworCTB4NTlFQiwweDVBOUIsMHg3RDEwLDB4NzY3RSwweDhCMkMsMHg0RkY1LDB4NUY2QSwweDZBMTksLyogMHg1MC0weDU3ICovCisJMHg2QzM3LDB4NkYwMiwweDc0RTIsMHg3OTY4LDB4ODg2OCwweDhBNTUsMHg4Qzc5LDB4NUVERiwvKiAweDU4LTB4NUYgKi8KKwkweDYzQ0YsMHg3NUM1LDB4NzlEMiwweDgyRDcsMHg5MzI4LDB4OTJGMiwweDg0OUMsMHg4NkVELC8qIDB4NjAtMHg2NyAqLworCTB4OUMyRCwweDU0QzEsMHg1RjZDLDB4NjU4QywweDZENUMsMHg3MDE1LDB4OENBNywweDhDRDMsLyogMHg2OC0weDZGICovCisJMHg5ODNCLDB4NjU0RiwweDc0RjYsMHg0RTBELDB4NEVEOCwweDU3RTAsMHg1OTJCLDB4NUE2NiwvKiAweDcwLTB4NzcgKi8KKwkweDVCQ0MsMHg1MUE4LDB4NUUwMywweDVFOUMsMHg2MDE2LDB4NjI3NiwweDY1NzcsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg2NUE3LDB4NjY2RSwweDZENkUsMHg3MjM2LDB4N0IyNiwweDgxNTAsMHg4MTlBLDB4ODI5OSwvKiAweDgwLTB4ODcgKi8KKwkweDhCNUMsMHg4Q0EwLDB4OENFNiwweDhENzQsMHg5NjFDLDB4OTY0NCwweDRGQUUsMHg2NEFCLC8qIDB4ODgtMHg4RiAqLworCTB4NkI2NiwweDgyMUUsMHg4NDYxLDB4ODU2QSwweDkwRTgsMHg1QzAxLDB4Njk1MywweDk4QTgsLyogMHg5MC0weDk3ICovCisJMHg4NDdBLDB4ODU1NywweDRGMEYsMHg1MjZGLDB4NUZBOSwweDVFNDUsMHg2NzBELDB4Nzk4RiwvKiAweDk4LTB4OUYgKi8KKwkweDgxNzksMHg4OTA3LDB4ODk4NiwweDZERjUsMHg1RjE3LDB4NjI1NSwweDZDQjgsMHg0RUNGLC8qIDB4QTAtMHhBNyAqLworCTB4NzI2OSwweDlCOTIsMHg1MjA2LDB4NTQzQiwweDU2NzQsMHg1OEIzLDB4NjFBNCwweDYyNkUsLyogMHhBOC0weEFGICovCisJMHg3MTFBLDB4NTk2RSwweDdDODksMHg3Q0RFLDB4N0QxQiwweDk2RjAsMHg2NTg3LDB4ODA1RSwvKiAweEIwLTB4QjcgKi8KKwkweDRFMTksMHg0Rjc1LDB4NTE3NSwweDU4NDAsMHg1RTYzLDB4NUU3MywweDVGMEEsMHg2N0M0LC8qIDB4QjgtMHhCRiAqLworCTB4NEUyNiwweDg1M0QsMHg5NTg5LDB4OTY1QiwweDdDNzMsMHg5ODAxLDB4NTBGQiwweDU4QzEsLyogMHhDMC0weEM3ICovCisJMHg3NjU2LDB4NzhBNywweDUyMjUsMHg3N0E1LDB4ODUxMSwweDdCODYsMHg1MDRGLDB4NTkwOSwvKiAweEM4LTB4Q0YgKi8KKwkweDcyNDcsMHg3QkM3LDB4N0RFOCwweDhGQkEsMHg4RkQ0LDB4OTA0RCwweDRGQkYsMHg1MkM5LC8qIDB4RDAtMHhENyAqLworCTB4NUEyOSwweDVGMDEsMHg5N0FELDB4NEZERCwweDgyMTcsMHg5MkVBLDB4NTcwMywweDYzNTUsLyogMHhEOC0weERGICovCisJMHg2QjY5LDB4NzUyQiwweDg4REMsMHg4RjE0LDB4N0E0MiwweDUyREYsMHg1ODkzLDB4NjE1NSwvKiAweEUwLTB4RTcgKi8KKwkweDYyMEEsMHg2NkFFLDB4NkJDRCwweDdDM0YsMHg4M0U5LDB4NTAyMywweDRGRjgsMHg1MzA1LC8qIDB4RTgtMHhFRiAqLworCTB4NTQ0NiwweDU4MzEsMHg1OTQ5LDB4NUI5RCwweDVDRjAsMHg1Q0VGLDB4NUQyOSwweDVFOTYsLyogMHhGMC0weEY3ICovCisJMHg2MkIxLDB4NjM2NywweDY1M0UsMHg2NUI5LDB4NjcwQiwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV85NlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDZDRDUsMHg2Q0UxLDB4NzBGOSwweDc4MzIsMHg3RTJCLDB4ODBERSwweDgyQjMsMHg4NDBDLC8qIDB4NDAtMHg0NyAqLworCTB4ODRFQywweDg3MDIsMHg4OTEyLDB4OEEyQSwweDhDNEEsMHg5MEE2LDB4OTJEMiwweDk4RkQsLyogMHg0OC0weDRGICovCisJMHg5Q0YzLDB4OUQ2QywweDRFNEYsMHg0RUExLDB4NTA4RCwweDUyNTYsMHg1NzRBLDB4NTlBOCwvKiAweDUwLTB4NTcgKi8KKwkweDVFM0QsMHg1RkQ4LDB4NUZEOSwweDYyM0YsMHg2NkI0LDB4NjcxQiwweDY3RDAsMHg2OEQyLC8qIDB4NTgtMHg1RiAqLworCTB4NTE5MiwweDdEMjEsMHg4MEFBLDB4ODFBOCwweDhCMDAsMHg4QzhDLDB4OENCRiwweDkyN0UsLyogMHg2MC0weDY3ICovCisJMHg5NjMyLDB4NTQyMCwweDk4MkMsMHg1MzE3LDB4NTBENSwweDUzNUMsMHg1OEE4LDB4NjRCMiwvKiAweDY4LTB4NkYgKi8KKwkweDY3MzQsMHg3MjY3LDB4Nzc2NiwweDdBNDYsMHg5MUU2LDB4NTJDMywweDZDQTEsMHg2Qjg2LC8qIDB4NzAtMHg3NyAqLworCTB4NTgwMCwweDVFNEMsMHg1OTU0LDB4NjcyQywweDdGRkIsMHg1MUUxLDB4NzZDNiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDY0NjksMHg3OEU4LDB4OUI1NCwweDlFQkIsMHg1N0NCLDB4NTlCOSwweDY2MjcsMHg2NzlBLC8qIDB4ODAtMHg4NyAqLworCTB4NkJDRSwweDU0RTksMHg2OUQ5LDB4NUU1NSwweDgxOUMsMHg2Nzk1LDB4OUJBQSwweDY3RkUsLyogMHg4OC0weDhGICovCisJMHg5QzUyLDB4Njg1RCwweDRFQTYsMHg0RkUzLDB4NTNDOCwweDYyQjksMHg2NzJCLDB4NkNBQiwvKiAweDkwLTB4OTcgKi8KKwkweDhGQzQsMHg0RkFELDB4N0U2RCwweDlFQkYsMHg0RTA3LDB4NjE2MiwweDZFODAsMHg2RjJCLC8qIDB4OTgtMHg5RiAqLworCTB4ODUxMywweDU0NzMsMHg2NzJBLDB4OUI0NSwweDVERjMsMHg3Qjk1LDB4NUNBQywweDVCQzYsLyogMHhBMC0weEE3ICovCisJMHg4NzFDLDB4NkU0QSwweDg0RDEsMHg3QTE0LDB4ODEwOCwweDU5OTksMHg3QzhELDB4NkMxMSwvKiAweEE4LTB4QUYgKi8KKwkweDc3MjAsMHg1MkQ5LDB4NTkyMiwweDcxMjEsMHg3MjVGLDB4NzdEQiwweDk3MjcsMHg5RDYxLC8qIDB4QjAtMHhCNyAqLworCTB4NjkwQiwweDVBN0YsMHg1QTE4LDB4NTFBNSwweDU0MEQsMHg1NDdELDB4NjYwRSwweDc2REYsLyogMHhCOC0weEJGICovCisJMHg4RkY3LDB4OTI5OCwweDlDRjQsMHg1OUVBLDB4NzI1RCwweDZFQzUsMHg1MTRELDB4NjhDOSwvKiAweEMwLTB4QzcgKi8KKwkweDdEQkYsMHg3REVDLDB4OTc2MiwweDlFQkEsMHg2NDc4LDB4NkEyMSwweDgzMDIsMHg1OTg0LC8qIDB4QzgtMHhDRiAqLworCTB4NUI1RiwweDZCREIsMHg3MzFCLDB4NzZGMiwweDdEQjIsMHg4MDE3LDB4ODQ5OSwweDUxMzIsLyogMHhEMC0weEQ3ICovCisJMHg2NzI4LDB4OUVEOSwweDc2RUUsMHg2NzYyLDB4NTJGRiwweDk5MDUsMHg1QzI0LDB4NjIzQiwvKiAweEQ4LTB4REYgKi8KKwkweDdDN0UsMHg4Q0IwLDB4NTU0RiwweDYwQjYsMHg3RDBCLDB4OTU4MCwweDUzMDEsMHg0RTVGLC8qIDB4RTAtMHhFNyAqLworCTB4NTFCNiwweDU5MUMsMHg3MjNBLDB4ODAzNiwweDkxQ0UsMHg1RjI1LDB4NzdFMiwweDUzODQsLyogMHhFOC0weEVGICovCisJMHg1Rjc5LDB4N0QwNCwweDg1QUMsMHg4QTMzLDB4OEU4RCwweDk3NTYsMHg2N0YzLDB4ODVBRSwvKiAweEYwLTB4RjcgKi8KKwkweDk0NTMsMHg2MTA5LDB4NjEwOCwweDZDQjksMHg3NjUyLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1Xzk3WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OEFFRCwweDhGMzgsMHg1NTJGLDB4NEY1MSwweDUxMkEsMHg1MkM3LDB4NTNDQiwweDVCQTUsLyogMHg0MC0weDQ3ICovCisJMHg1RTdELDB4NjBBMCwweDYxODIsMHg2M0Q2LDB4NjcwOSwweDY3REEsMHg2RTY3LDB4NkQ4QywvKiAweDQ4LTB4NEYgKi8KKwkweDczMzYsMHg3MzM3LDB4NzUzMSwweDc5NTAsMHg4OEQ1LDB4OEE5OCwweDkwNEEsMHg5MDkxLC8qIDB4NTAtMHg1NyAqLworCTB4OTBGNSwweDk2QzQsMHg4NzhELDB4NTkxNSwweDRFODgsMHg0RjU5LDB4NEUwRSwweDhBODksLyogMHg1OC0weDVGICovCisJMHg4RjNGLDB4OTgxMCwweDUwQUQsMHg1RTdDLDB4NTk5NiwweDVCQjksMHg1RUI4LDB4NjNEQSwvKiAweDYwLTB4NjcgKi8KKwkweDYzRkEsMHg2NEMxLDB4NjZEQywweDY5NEEsMHg2OUQ4LDB4NkQwQiwweDZFQjYsMHg3MTk0LC8qIDB4NjgtMHg2RiAqLworCTB4NzUyOCwweDdBQUYsMHg3RjhBLDB4ODAwMCwweDg0NDksMHg4NEM5LDB4ODk4MSwweDhCMjEsLyogMHg3MC0weDc3ICovCisJMHg4RTBBLDB4OTA2NSwweDk2N0QsMHg5OTBBLDB4NjE3RSwweDYyOTEsMHg2QjMyLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NkM4MywweDZENzQsMHg3RkNDLDB4N0ZGQywweDZEQzAsMHg3Rjg1LDB4ODdCQSwweDg4RjgsLyogMHg4MC0weDg3ICovCisJMHg2NzY1LDB4ODNCMSwweDk4M0MsMHg5NkY3LDB4NkQxQiwweDdENjEsMHg4NDNELDB4OTE2QSwvKiAweDg4LTB4OEYgKi8KKwkweDRFNzEsMHg1Mzc1LDB4NUQ1MCwweDZCMDQsMHg2RkVCLDB4ODVDRCwweDg2MkQsMHg4OUE3LC8qIDB4OTAtMHg5NyAqLworCTB4NTIyOSwweDU0MEYsMHg1QzY1LDB4Njc0RSwweDY4QTgsMHg3NDA2LDB4NzQ4MywweDc1RTIsLyogMHg5OC0weDlGICovCisJMHg4OENGLDB4ODhFMSwweDkxQ0MsMHg5NkUyLDB4OTY3OCwweDVGOEIsMHg3Mzg3LDB4N0FDQiwvKiAweEEwLTB4QTcgKi8KKwkweDg0NEUsMHg2M0EwLDB4NzU2NSwweDUyODksMHg2RDQxLDB4NkU5QywweDc0MDksMHg3NTU5LC8qIDB4QTgtMHhBRiAqLworCTB4Nzg2QiwweDdDOTIsMHg5Njg2LDB4N0FEQywweDlGOEQsMHg0RkI2LDB4NjE2RSwweDY1QzUsLyogMHhCMC0weEI3ICovCisJMHg4NjVDLDB4NEU4NiwweDRFQUUsMHg1MERBLDB4NEUyMSwweDUxQ0MsMHg1QkVFLDB4NjU5OSwvKiAweEI4LTB4QkYgKi8KKwkweDY4ODEsMHg2REJDLDB4NzMxRiwweDc2NDIsMHg3N0FELDB4N0ExQywweDdDRTcsMHg4MjZGLC8qIDB4QzAtMHhDNyAqLworCTB4OEFEMiwweDkwN0MsMHg5MUNGLDB4OTY3NSwweDk4MTgsMHg1MjlCLDB4N0REMSwweDUwMkIsLyogMHhDOC0weENGICovCisJMHg1Mzk4LDB4Njc5NywweDZEQ0IsMHg3MUQwLDB4NzQzMywweDgxRTgsMHg4RjJBLDB4OTZBMywvKiAweEQwLTB4RDcgKi8KKwkweDlDNTcsMHg5RTlGLDB4NzQ2MCwweDU4NDEsMHg2RDk5LDB4N0QyRiwweDk4NUUsMHg0RUU0LC8qIDB4RDgtMHhERiAqLworCTB4NEYzNiwweDRGOEIsMHg1MUI3LDB4NTJCMSwweDVEQkEsMHg2MDFDLDB4NzNCMiwweDc5M0MsLyogMHhFMC0weEU3ICovCisJMHg4MkQzLDB4OTIzNCwweDk2QjcsMHg5NkY2LDB4OTcwQSwweDlFOTcsMHg5RjYyLDB4NjZBNiwvKiAweEU4LTB4RUYgKi8KKwkweDZCNzQsMHg1MjE3LDB4NTJBMywweDcwQzgsMHg4OEMyLDB4NUVDOSwweDYwNEIsMHg2MTkwLC8qIDB4RjAtMHhGNyAqLworCTB4NkYyMywweDcxNDksMHg3QzNFLDB4N0RGNCwweDgwNkYsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOThbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4NEVFLDB4OTAyMywweDkzMkMsMHg1NDQyLDB4OUI2RiwweDZBRDMsMHg3MDg5LDB4OENDMiwvKiAweDQwLTB4NDcgKi8KKwkweDhERUYsMHg5NzMyLDB4NTJCNCwweDVBNDEsMHg1RUNBLDB4NUYwNCwweDY3MTcsMHg2OTdDLC8qIDB4NDgtMHg0RiAqLworCTB4Njk5NCwweDZENkEsMHg2RjBGLDB4NzI2MiwweDcyRkMsMHg3QkVELDB4ODAwMSwweDgwN0UsLyogMHg1MC0weDU3ICovCisJMHg4NzRCLDB4OTBDRSwweDUxNkQsMHg5RTkzLDB4Nzk4NCwweDgwOEIsMHg5MzMyLDB4OEFENiwvKiAweDU4LTB4NUYgKi8KKwkweDUwMkQsMHg1NDhDLDB4OEE3MSwweDZCNkEsMHg4Q0M0LDB4ODEwNywweDYwRDEsMHg2N0EwLC8qIDB4NjAtMHg2NyAqLworCTB4OURGMiwweDRFOTksMHg0RTk4LDB4OUMxMCwweDhBNkIsMHg4NUMxLDB4ODU2OCwweDY5MDAsLyogMHg2OC0weDZGICovCisJMHg2RTdFLDB4Nzg5NywweDgxNTUsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4NUYwQywvKiAweDk4LTB4OUYgKi8KKwkweDRFMTAsMHg0RTE1LDB4NEUyQSwweDRFMzEsMHg0RTM2LDB4NEUzQywweDRFM0YsMHg0RTQyLC8qIDB4QTAtMHhBNyAqLworCTB4NEU1NiwweDRFNTgsMHg0RTgyLDB4NEU4NSwweDhDNkIsMHg0RThBLDB4ODIxMiwweDVGMEQsLyogMHhBOC0weEFGICovCisJMHg0RThFLDB4NEU5RSwweDRFOUYsMHg0RUEwLDB4NEVBMiwweDRFQjAsMHg0RUIzLDB4NEVCNiwvKiAweEIwLTB4QjcgKi8KKwkweDRFQ0UsMHg0RUNELDB4NEVDNCwweDRFQzYsMHg0RUMyLDB4NEVENywweDRFREUsMHg0RUVELC8qIDB4QjgtMHhCRiAqLworCTB4NEVERiwweDRFRjcsMHg0RjA5LDB4NEY1QSwweDRGMzAsMHg0RjVCLDB4NEY1RCwweDRGNTcsLyogMHhDMC0weEM3ICovCisJMHg0RjQ3LDB4NEY3NiwweDRGODgsMHg0RjhGLDB4NEY5OCwweDRGN0IsMHg0RjY5LDB4NEY3MCwvKiAweEM4LTB4Q0YgKi8KKwkweDRGOTEsMHg0RjZGLDB4NEY4NiwweDRGOTYsMHg1MTE4LDB4NEZENCwweDRGREYsMHg0RkNFLC8qIDB4RDAtMHhENyAqLworCTB4NEZEOCwweDRGREIsMHg0RkQxLDB4NEZEQSwweDRGRDAsMHg0RkU0LDB4NEZFNSwweDUwMUEsLyogMHhEOC0weERGICovCisJMHg1MDI4LDB4NTAxNCwweDUwMkEsMHg1MDI1LDB4NTAwNSwweDRGMUMsMHg0RkY2LDB4NTAyMSwvKiAweEUwLTB4RTcgKi8KKwkweDUwMjksMHg1MDJDLDB4NEZGRSwweDRGRUYsMHg1MDExLDB4NTAwNiwweDUwNDMsMHg1MDQ3LC8qIDB4RTgtMHhFRiAqLworCTB4NjcwMywweDUwNTUsMHg1MDUwLDB4NTA0OCwweDUwNUEsMHg1MDU2LDB4NTA2QywweDUwNzgsLyogMHhGMC0weEY3ICovCisJMHg1MDgwLDB4NTA5QSwweDUwODUsMHg1MEI0LDB4NTBCMiwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV85OVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDUwQzksMHg1MENBLDB4NTBCMywweDUwQzIsMHg1MEQ2LDB4NTBERSwweDUwRTUsMHg1MEVELC8qIDB4NDAtMHg0NyAqLworCTB4NTBFMywweDUwRUUsMHg1MEY5LDB4NTBGNSwweDUxMDksMHg1MTAxLDB4NTEwMiwweDUxMTYsLyogMHg0OC0weDRGICovCisJMHg1MTE1LDB4NTExNCwweDUxMUEsMHg1MTIxLDB4NTEzQSwweDUxMzcsMHg1MTNDLDB4NTEzQiwvKiAweDUwLTB4NTcgKi8KKwkweDUxM0YsMHg1MTQwLDB4NTE1MiwweDUxNEMsMHg1MTU0LDB4NTE2MiwweDdBRjgsMHg1MTY5LC8qIDB4NTgtMHg1RiAqLworCTB4NTE2QSwweDUxNkUsMHg1MTgwLDB4NTE4MiwweDU2RDgsMHg1MThDLDB4NTE4OSwweDUxOEYsLyogMHg2MC0weDY3ICovCisJMHg1MTkxLDB4NTE5MywweDUxOTUsMHg1MTk2LDB4NTFBNCwweDUxQTYsMHg1MUEyLDB4NTFBOSwvKiAweDY4LTB4NkYgKi8KKwkweDUxQUEsMHg1MUFCLDB4NTFCMywweDUxQjEsMHg1MUIyLDB4NTFCMCwweDUxQjUsMHg1MUJELC8qIDB4NzAtMHg3NyAqLworCTB4NTFDNSwweDUxQzksMHg1MURCLDB4NTFFMCwweDg2NTUsMHg1MUU5LDB4NTFFRCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDUxRjAsMHg1MUY1LDB4NTFGRSwweDUyMDQsMHg1MjBCLDB4NTIxNCwweDUyMEUsMHg1MjI3LC8qIDB4ODAtMHg4NyAqLworCTB4NTIyQSwweDUyMkUsMHg1MjMzLDB4NTIzOSwweDUyNEYsMHg1MjQ0LDB4NTI0QiwweDUyNEMsLyogMHg4OC0weDhGICovCisJMHg1MjVFLDB4NTI1NCwweDUyNkEsMHg1Mjc0LDB4NTI2OSwweDUyNzMsMHg1MjdGLDB4NTI3RCwvKiAweDkwLTB4OTcgKi8KKwkweDUyOEQsMHg1Mjk0LDB4NTI5MiwweDUyNzEsMHg1Mjg4LDB4NTI5MSwweDhGQTgsMHg4RkE3LC8qIDB4OTgtMHg5RiAqLworCTB4NTJBQywweDUyQUQsMHg1MkJDLDB4NTJCNSwweDUyQzEsMHg1MkNELDB4NTJENywweDUyREUsLyogMHhBMC0weEE3ICovCisJMHg1MkUzLDB4NTJFNiwweDk4RUQsMHg1MkUwLDB4NTJGMywweDUyRjUsMHg1MkY4LDB4NTJGOSwvKiAweEE4LTB4QUYgKi8KKwkweDUzMDYsMHg1MzA4LDB4NzUzOCwweDUzMEQsMHg1MzEwLDB4NTMwRiwweDUzMTUsMHg1MzFBLC8qIDB4QjAtMHhCNyAqLworCTB4NTMyMywweDUzMkYsMHg1MzMxLDB4NTMzMywweDUzMzgsMHg1MzQwLDB4NTM0NiwweDUzNDUsLyogMHhCOC0weEJGICovCisJMHg0RTE3LDB4NTM0OSwweDUzNEQsMHg1MUQ2LDB4NTM1RSwweDUzNjksMHg1MzZFLDB4NTkxOCwvKiAweEMwLTB4QzcgKi8KKwkweDUzN0IsMHg1Mzc3LDB4NTM4MiwweDUzOTYsMHg1M0EwLDB4NTNBNiwweDUzQTUsMHg1M0FFLC8qIDB4QzgtMHhDRiAqLworCTB4NTNCMCwweDUzQjYsMHg1M0MzLDB4N0MxMiwweDk2RDksMHg1M0RGLDB4NjZGQywweDcxRUUsLyogMHhEMC0weEQ3ICovCisJMHg1M0VFLDB4NTNFOCwweDUzRUQsMHg1M0ZBLDB4NTQwMSwweDU0M0QsMHg1NDQwLDB4NTQyQywvKiAweEQ4LTB4REYgKi8KKwkweDU0MkQsMHg1NDNDLDB4NTQyRSwweDU0MzYsMHg1NDI5LDB4NTQxRCwweDU0NEUsMHg1NDhGLC8qIDB4RTAtMHhFNyAqLworCTB4NTQ3NSwweDU0OEUsMHg1NDVGLDB4NTQ3MSwweDU0NzcsMHg1NDcwLDB4NTQ5MiwweDU0N0IsLyogMHhFOC0weEVGICovCisJMHg1NDgwLDB4NTQ3NiwweDU0ODQsMHg1NDkwLDB4NTQ4NiwweDU0QzcsMHg1NEEyLDB4NTRCOCwvKiAweEYwLTB4RjcgKi8KKwkweDU0QTUsMHg1NEFDLDB4NTRDNCwweDU0QzgsMHg1NEE4LDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzlBWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NTRBQiwweDU0QzIsMHg1NEE0LDB4NTRCRSwweDU0QkMsMHg1NEQ4LDB4NTRFNSwweDU0RTYsLyogMHg0MC0weDQ3ICovCisJMHg1NTBGLDB4NTUxNCwweDU0RkQsMHg1NEVFLDB4NTRFRCwweDU0RkEsMHg1NEUyLDB4NTUzOSwvKiAweDQ4LTB4NEYgKi8KKwkweDU1NDAsMHg1NTYzLDB4NTU0QywweDU1MkUsMHg1NTVDLDB4NTU0NSwweDU1NTYsMHg1NTU3LC8qIDB4NTAtMHg1NyAqLworCTB4NTUzOCwweDU1MzMsMHg1NTVELDB4NTU5OSwweDU1ODAsMHg1NEFGLDB4NTU4QSwweDU1OUYsLyogMHg1OC0weDVGICovCisJMHg1NTdCLDB4NTU3RSwweDU1OTgsMHg1NTlFLDB4NTVBRSwweDU1N0MsMHg1NTgzLDB4NTVBOSwvKiAweDYwLTB4NjcgKi8KKwkweDU1ODcsMHg1NUE4LDB4NTVEQSwweDU1QzUsMHg1NURGLDB4NTVDNCwweDU1REMsMHg1NUU0LC8qIDB4NjgtMHg2RiAqLworCTB4NTVENCwweDU2MTQsMHg1NUY3LDB4NTYxNiwweDU1RkUsMHg1NUZELDB4NTYxQiwweDU1RjksLyogMHg3MC0weDc3ICovCisJMHg1NjRFLDB4NTY1MCwweDcxREYsMHg1NjM0LDB4NTYzNiwweDU2MzIsMHg1NjM4LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NTY2QiwweDU2NjQsMHg1NjJGLDB4NTY2QywweDU2NkEsMHg1Njg2LDB4NTY4MCwweDU2OEEsLyogMHg4MC0weDg3ICovCisJMHg1NkEwLDB4NTY5NCwweDU2OEYsMHg1NkE1LDB4NTZBRSwweDU2QjYsMHg1NkI0LDB4NTZDMiwvKiAweDg4LTB4OEYgKi8KKwkweDU2QkMsMHg1NkMxLDB4NTZDMywweDU2QzAsMHg1NkM4LDB4NTZDRSwweDU2RDEsMHg1NkQzLC8qIDB4OTAtMHg5NyAqLworCTB4NTZENywweDU2RUUsMHg1NkY5LDB4NTcwMCwweDU2RkYsMHg1NzA0LDB4NTcwOSwweDU3MDgsLyogMHg5OC0weDlGICovCisJMHg1NzBCLDB4NTcwRCwweDU3MTMsMHg1NzE4LDB4NTcxNiwweDU1QzcsMHg1NzFDLDB4NTcyNiwvKiAweEEwLTB4QTcgKi8KKwkweDU3MzcsMHg1NzM4LDB4NTc0RSwweDU3M0IsMHg1NzQwLDB4NTc0RiwweDU3NjksMHg1N0MwLC8qIDB4QTgtMHhBRiAqLworCTB4NTc4OCwweDU3NjEsMHg1NzdGLDB4NTc4OSwweDU3OTMsMHg1N0EwLDB4NTdCMywweDU3QTQsLyogMHhCMC0weEI3ICovCisJMHg1N0FBLDB4NTdCMCwweDU3QzMsMHg1N0M2LDB4NTdENCwweDU3RDIsMHg1N0QzLDB4NTgwQSwvKiAweEI4LTB4QkYgKi8KKwkweDU3RDYsMHg1N0UzLDB4NTgwQiwweDU4MTksMHg1ODFELDB4NTg3MiwweDU4MjEsMHg1ODYyLC8qIDB4QzAtMHhDNyAqLworCTB4NTg0QiwweDU4NzAsMHg2QkMwLDB4NTg1MiwweDU4M0QsMHg1ODc5LDB4NTg4NSwweDU4QjksLyogMHhDOC0weENGICovCisJMHg1ODlGLDB4NThBQiwweDU4QkEsMHg1OERFLDB4NThCQiwweDU4QjgsMHg1OEFFLDB4NThDNSwvKiAweEQwLTB4RDcgKi8KKwkweDU4RDMsMHg1OEQxLDB4NThENywweDU4RDksMHg1OEQ4LDB4NThFNSwweDU4REMsMHg1OEU0LC8qIDB4RDgtMHhERiAqLworCTB4NThERiwweDU4RUYsMHg1OEZBLDB4NThGOSwweDU4RkIsMHg1OEZDLDB4NThGRCwweDU5MDIsLyogMHhFMC0weEU3ICovCisJMHg1OTBBLDB4NTkxMCwweDU5MUIsMHg2OEE2LDB4NTkyNSwweDU5MkMsMHg1OTJELDB4NTkzMiwvKiAweEU4LTB4RUYgKi8KKwkweDU5MzgsMHg1OTNFLDB4N0FEMiwweDU5NTUsMHg1OTUwLDB4NTk0RSwweDU5NUEsMHg1OTU4LC8qIDB4RjAtMHhGNyAqLworCTB4NTk2MiwweDU5NjAsMHg1OTY3LDB4NTk2QywweDU5NjksMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOUJbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg1OTc4LDB4NTk4MSwweDU5OUQsMHg0RjVFLDB4NEZBQiwweDU5QTMsMHg1OUIyLDB4NTlDNiwvKiAweDQwLTB4NDcgKi8KKwkweDU5RTgsMHg1OURDLDB4NTk4RCwweDU5RDksMHg1OURBLDB4NUEyNSwweDVBMUYsMHg1QTExLC8qIDB4NDgtMHg0RiAqLworCTB4NUExQywweDVBMDksMHg1QTFBLDB4NUE0MCwweDVBNkMsMHg1QTQ5LDB4NUEzNSwweDVBMzYsLyogMHg1MC0weDU3ICovCisJMHg1QTYyLDB4NUE2QSwweDVBOUEsMHg1QUJDLDB4NUFCRSwweDVBQ0IsMHg1QUMyLDB4NUFCRCwvKiAweDU4LTB4NUYgKi8KKwkweDVBRTMsMHg1QUQ3LDB4NUFFNiwweDVBRTksMHg1QUQ2LDB4NUFGQSwweDVBRkIsMHg1QjBDLC8qIDB4NjAtMHg2NyAqLworCTB4NUIwQiwweDVCMTYsMHg1QjMyLDB4NUFEMCwweDVCMkEsMHg1QjM2LDB4NUIzRSwweDVCNDMsLyogMHg2OC0weDZGICovCisJMHg1QjQ1LDB4NUI0MCwweDVCNTEsMHg1QjU1LDB4NUI1QSwweDVCNUIsMHg1QjY1LDB4NUI2OSwvKiAweDcwLTB4NzcgKi8KKwkweDVCNzAsMHg1QjczLDB4NUI3NSwweDVCNzgsMHg2NTg4LDB4NUI3QSwweDVCODAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg1QjgzLDB4NUJBNiwweDVCQjgsMHg1QkMzLDB4NUJDNywweDVCQzksMHg1QkQ0LDB4NUJEMCwvKiAweDgwLTB4ODcgKi8KKwkweDVCRTQsMHg1QkU2LDB4NUJFMiwweDVCREUsMHg1QkU1LDB4NUJFQiwweDVCRjAsMHg1QkY2LC8qIDB4ODgtMHg4RiAqLworCTB4NUJGMywweDVDMDUsMHg1QzA3LDB4NUMwOCwweDVDMEQsMHg1QzEzLDB4NUMyMCwweDVDMjIsLyogMHg5MC0weDk3ICovCisJMHg1QzI4LDB4NUMzOCwweDVDMzksMHg1QzQxLDB4NUM0NiwweDVDNEUsMHg1QzUzLDB4NUM1MCwvKiAweDk4LTB4OUYgKi8KKwkweDVDNEYsMHg1QjcxLDB4NUM2QywweDVDNkUsMHg0RTYyLDB4NUM3NiwweDVDNzksMHg1QzhDLC8qIDB4QTAtMHhBNyAqLworCTB4NUM5MSwweDVDOTQsMHg1OTlCLDB4NUNBQiwweDVDQkIsMHg1Q0I2LDB4NUNCQywweDVDQjcsLyogMHhBOC0weEFGICovCisJMHg1Q0M1LDB4NUNCRSwweDVDQzcsMHg1Q0Q5LDB4NUNFOSwweDVDRkQsMHg1Q0ZBLDB4NUNFRCwvKiAweEIwLTB4QjcgKi8KKwkweDVEOEMsMHg1Q0VBLDB4NUQwQiwweDVEMTUsMHg1RDE3LDB4NUQ1QywweDVEMUYsMHg1RDFCLC8qIDB4QjgtMHhCRiAqLworCTB4NUQxMSwweDVEMTQsMHg1RDIyLDB4NUQxQSwweDVEMTksMHg1RDE4LDB4NUQ0QywweDVENTIsLyogMHhDMC0weEM3ICovCisJMHg1RDRFLDB4NUQ0QiwweDVENkMsMHg1RDczLDB4NUQ3NiwweDVEODcsMHg1RDg0LDB4NUQ4MiwvKiAweEM4LTB4Q0YgKi8KKwkweDVEQTIsMHg1RDlELDB4NURBQywweDVEQUUsMHg1REJELDB4NUQ5MCwweDVEQjcsMHg1REJDLC8qIDB4RDAtMHhENyAqLworCTB4NURDOSwweDVEQ0QsMHg1REQzLDB4NUREMiwweDVERDYsMHg1RERCLDB4NURFQiwweDVERjIsLyogMHhEOC0weERGICovCisJMHg1REY1LDB4NUUwQiwweDVFMUEsMHg1RTE5LDB4NUUxMSwweDVFMUIsMHg1RTM2LDB4NUUzNywvKiAweEUwLTB4RTcgKi8KKwkweDVFNDQsMHg1RTQzLDB4NUU0MCwweDVFNEUsMHg1RTU3LDB4NUU1NCwweDVFNUYsMHg1RTYyLC8qIDB4RTgtMHhFRiAqLworCTB4NUU2NCwweDVFNDcsMHg1RTc1LDB4NUU3NiwweDVFN0EsMHg5RUJDLDB4NUU3RiwweDVFQTAsLyogMHhGMC0weEY3ICovCisJMHg1RUMxLDB4NUVDMiwweDVFQzgsMHg1RUQwLDB4NUVDRiwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV85Q1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDVFRDYsMHg1RUUzLDB4NUVERCwweDVFREEsMHg1RURCLDB4NUVFMiwweDVFRTEsMHg1RUU4LC8qIDB4NDAtMHg0NyAqLworCTB4NUVFOSwweDVFRUMsMHg1RUYxLDB4NUVGMywweDVFRjAsMHg1RUY0LDB4NUVGOCwweDVFRkUsLyogMHg0OC0weDRGICovCisJMHg1RjAzLDB4NUYwOSwweDVGNUQsMHg1RjVDLDB4NUYwQiwweDVGMTEsMHg1RjE2LDB4NUYyOSwvKiAweDUwLTB4NTcgKi8KKwkweDVGMkQsMHg1RjM4LDB4NUY0MSwweDVGNDgsMHg1RjRDLDB4NUY0RSwweDVGMkYsMHg1RjUxLC8qIDB4NTgtMHg1RiAqLworCTB4NUY1NiwweDVGNTcsMHg1RjU5LDB4NUY2MSwweDVGNkQsMHg1RjczLDB4NUY3NywweDVGODMsLyogMHg2MC0weDY3ICovCisJMHg1RjgyLDB4NUY3RiwweDVGOEEsMHg1Rjg4LDB4NUY5MSwweDVGODcsMHg1RjlFLDB4NUY5OSwvKiAweDY4LTB4NkYgKi8KKwkweDVGOTgsMHg1RkEwLDB4NUZBOCwweDVGQUQsMHg1RkJDLDB4NUZENiwweDVGRkIsMHg1RkU0LC8qIDB4NzAtMHg3NyAqLworCTB4NUZGOCwweDVGRjEsMHg1RkRELDB4NjBCMywweDVGRkYsMHg2MDIxLDB4NjA2MCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDYwMTksMHg2MDEwLDB4NjAyOSwweDYwMEUsMHg2MDMxLDB4NjAxQiwweDYwMTUsMHg2MDJCLC8qIDB4ODAtMHg4NyAqLworCTB4NjAyNiwweDYwMEYsMHg2MDNBLDB4NjA1QSwweDYwNDEsMHg2MDZBLDB4NjA3NywweDYwNUYsLyogMHg4OC0weDhGICovCisJMHg2MDRBLDB4NjA0NiwweDYwNEQsMHg2MDYzLDB4NjA0MywweDYwNjQsMHg2MDQyLDB4NjA2QywvKiAweDkwLTB4OTcgKi8KKwkweDYwNkIsMHg2MDU5LDB4NjA4MSwweDYwOEQsMHg2MEU3LDB4NjA4MywweDYwOUEsMHg2MDg0LC8qIDB4OTgtMHg5RiAqLworCTB4NjA5QiwweDYwOTYsMHg2MDk3LDB4NjA5MiwweDYwQTcsMHg2MDhCLDB4NjBFMSwweDYwQjgsLyogMHhBMC0weEE3ICovCisJMHg2MEUwLDB4NjBEMywweDYwQjQsMHg1RkYwLDB4NjBCRCwweDYwQzYsMHg2MEI1LDB4NjBEOCwvKiAweEE4LTB4QUYgKi8KKwkweDYxNEQsMHg2MTE1LDB4NjEwNiwweDYwRjYsMHg2MEY3LDB4NjEwMCwweDYwRjQsMHg2MEZBLC8qIDB4QjAtMHhCNyAqLworCTB4NjEwMywweDYxMjEsMHg2MEZCLDB4NjBGMSwweDYxMEQsMHg2MTBFLDB4NjE0NywweDYxM0UsLyogMHhCOC0weEJGICovCisJMHg2MTI4LDB4NjEyNywweDYxNEEsMHg2MTNGLDB4NjEzQywweDYxMkMsMHg2MTM0LDB4NjEzRCwvKiAweEMwLTB4QzcgKi8KKwkweDYxNDIsMHg2MTQ0LDB4NjE3MywweDYxNzcsMHg2MTU4LDB4NjE1OSwweDYxNUEsMHg2MTZCLC8qIDB4QzgtMHhDRiAqLworCTB4NjE3NCwweDYxNkYsMHg2MTY1LDB4NjE3MSwweDYxNUYsMHg2MTVELDB4NjE1MywweDYxNzUsLyogMHhEMC0weEQ3ICovCisJMHg2MTk5LDB4NjE5NiwweDYxODcsMHg2MUFDLDB4NjE5NCwweDYxOUEsMHg2MThBLDB4NjE5MSwvKiAweEQ4LTB4REYgKi8KKwkweDYxQUIsMHg2MUFFLDB4NjFDQywweDYxQ0EsMHg2MUM5LDB4NjFGNywweDYxQzgsMHg2MUMzLC8qIDB4RTAtMHhFNyAqLworCTB4NjFDNiwweDYxQkEsMHg2MUNCLDB4N0Y3OSwweDYxQ0QsMHg2MUU2LDB4NjFFMywweDYxRjYsLyogMHhFOC0weEVGICovCisJMHg2MUZBLDB4NjFGNCwweDYxRkYsMHg2MUZELDB4NjFGQywweDYxRkUsMHg2MjAwLDB4NjIwOCwvKiAweEYwLTB4RjcgKi8KKwkweDYyMDksMHg2MjBELDB4NjIwQywweDYyMTQsMHg2MjFCLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzlEWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NjIxRSwweDYyMjEsMHg2MjJBLDB4NjIyRSwweDYyMzAsMHg2MjMyLDB4NjIzMywweDYyNDEsLyogMHg0MC0weDQ3ICovCisJMHg2MjRFLDB4NjI1RSwweDYyNjMsMHg2MjVCLDB4NjI2MCwweDYyNjgsMHg2MjdDLDB4NjI4MiwvKiAweDQ4LTB4NEYgKi8KKwkweDYyODksMHg2MjdFLDB4NjI5MiwweDYyOTMsMHg2Mjk2LDB4NjJENCwweDYyODMsMHg2Mjk0LC8qIDB4NTAtMHg1NyAqLworCTB4NjJENywweDYyRDEsMHg2MkJCLDB4NjJDRiwweDYyRkYsMHg2MkM2LDB4NjRENCwweDYyQzgsLyogMHg1OC0weDVGICovCisJMHg2MkRDLDB4NjJDQywweDYyQ0EsMHg2MkMyLDB4NjJDNywweDYyOUIsMHg2MkM5LDB4NjMwQywvKiAweDYwLTB4NjcgKi8KKwkweDYyRUUsMHg2MkYxLDB4NjMyNywweDYzMDIsMHg2MzA4LDB4NjJFRiwweDYyRjUsMHg2MzUwLC8qIDB4NjgtMHg2RiAqLworCTB4NjMzRSwweDYzNEQsMHg2NDFDLDB4NjM0RiwweDYzOTYsMHg2MzhFLDB4NjM4MCwweDYzQUIsLyogMHg3MC0weDc3ICovCisJMHg2Mzc2LDB4NjNBMywweDYzOEYsMHg2Mzg5LDB4NjM5RiwweDYzQjUsMHg2MzZCLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NjM2OSwweDYzQkUsMHg2M0U5LDB4NjNDMCwweDYzQzYsMHg2M0UzLDB4NjNDOSwweDYzRDIsLyogMHg4MC0weDg3ICovCisJMHg2M0Y2LDB4NjNDNCwweDY0MTYsMHg2NDM0LDB4NjQwNiwweDY0MTMsMHg2NDI2LDB4NjQzNiwvKiAweDg4LTB4OEYgKi8KKwkweDY1MUQsMHg2NDE3LDB4NjQyOCwweDY0MEYsMHg2NDY3LDB4NjQ2RiwweDY0NzYsMHg2NDRFLC8qIDB4OTAtMHg5NyAqLworCTB4NjUyQSwweDY0OTUsMHg2NDkzLDB4NjRBNSwweDY0QTksMHg2NDg4LDB4NjRCQywweDY0REEsLyogMHg5OC0weDlGICovCisJMHg2NEQyLDB4NjRDNSwweDY0QzcsMHg2NEJCLDB4NjREOCwweDY0QzIsMHg2NEYxLDB4NjRFNywvKiAweEEwLTB4QTcgKi8KKwkweDgyMDksMHg2NEUwLDB4NjRFMSwweDYyQUMsMHg2NEUzLDB4NjRFRiwweDY1MkMsMHg2NEY2LC8qIDB4QTgtMHhBRiAqLworCTB4NjRGNCwweDY0RjIsMHg2NEZBLDB4NjUwMCwweDY0RkQsMHg2NTE4LDB4NjUxQywweDY1MDUsLyogMHhCMC0weEI3ICovCisJMHg2NTI0LDB4NjUyMywweDY1MkIsMHg2NTM0LDB4NjUzNSwweDY1MzcsMHg2NTM2LDB4NjUzOCwvKiAweEI4LTB4QkYgKi8KKwkweDc1NEIsMHg2NTQ4LDB4NjU1NiwweDY1NTUsMHg2NTRELDB4NjU1OCwweDY1NUUsMHg2NTVELC8qIDB4QzAtMHhDNyAqLworCTB4NjU3MiwweDY1NzgsMHg2NTgyLDB4NjU4MywweDhCOEEsMHg2NTlCLDB4NjU5RiwweDY1QUIsLyogMHhDOC0weENGICovCisJMHg2NUI3LDB4NjVDMywweDY1QzYsMHg2NUMxLDB4NjVDNCwweDY1Q0MsMHg2NUQyLDB4NjVEQiwvKiAweEQwLTB4RDcgKi8KKwkweDY1RDksMHg2NUUwLDB4NjVFMSwweDY1RjEsMHg2NzcyLDB4NjYwQSwweDY2MDMsMHg2NUZCLC8qIDB4RDgtMHhERiAqLworCTB4Njc3MywweDY2MzUsMHg2NjM2LDB4NjYzNCwweDY2MUMsMHg2NjRGLDB4NjY0NCwweDY2NDksLyogMHhFMC0weEU3ICovCisJMHg2NjQxLDB4NjY1RSwweDY2NUQsMHg2NjY0LDB4NjY2NywweDY2NjgsMHg2NjVGLDB4NjY2MiwvKiAweEU4LTB4RUYgKi8KKwkweDY2NzAsMHg2NjgzLDB4NjY4OCwweDY2OEUsMHg2Njg5LDB4NjY4NCwweDY2OTgsMHg2NjlELC8qIDB4RjAtMHhGNyAqLworCTB4NjZDMSwweDY2QjksMHg2NkM5LDB4NjZCRSwweDY2QkMsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOUVbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg2NkM0LDB4NjZCOCwweDY2RDYsMHg2NkRBLDB4NjZFMCwweDY2M0YsMHg2NkU2LDB4NjZFOSwvKiAweDQwLTB4NDcgKi8KKwkweDY2RjAsMHg2NkY1LDB4NjZGNywweDY3MEYsMHg2NzE2LDB4NjcxRSwweDY3MjYsMHg2NzI3LC8qIDB4NDgtMHg0RiAqLworCTB4OTczOCwweDY3MkUsMHg2NzNGLDB4NjczNiwweDY3NDEsMHg2NzM4LDB4NjczNywweDY3NDYsLyogMHg1MC0weDU3ICovCisJMHg2NzVFLDB4Njc2MCwweDY3NTksMHg2NzYzLDB4Njc2NCwweDY3ODksMHg2NzcwLDB4NjdBOSwvKiAweDU4LTB4NUYgKi8KKwkweDY3N0MsMHg2NzZBLDB4Njc4QywweDY3OEIsMHg2N0E2LDB4NjdBMSwweDY3ODUsMHg2N0I3LC8qIDB4NjAtMHg2NyAqLworCTB4NjdFRiwweDY3QjQsMHg2N0VDLDB4NjdCMywweDY3RTksMHg2N0I4LDB4NjdFNCwweDY3REUsLyogMHg2OC0weDZGICovCisJMHg2N0RELDB4NjdFMiwweDY3RUUsMHg2N0I5LDB4NjdDRSwweDY3QzYsMHg2N0U3LDB4NkE5QywvKiAweDcwLTB4NzcgKi8KKwkweDY4MUUsMHg2ODQ2LDB4NjgyOSwweDY4NDAsMHg2ODRELDB4NjgzMiwweDY4NEUsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg2OEIzLDB4NjgyQiwweDY4NTksMHg2ODYzLDB4Njg3NywweDY4N0YsMHg2ODlGLDB4Njg4RiwvKiAweDgwLTB4ODcgKi8KKwkweDY4QUQsMHg2ODk0LDB4Njg5RCwweDY4OUIsMHg2ODgzLDB4NkFBRSwweDY4QjksMHg2ODc0LC8qIDB4ODgtMHg4RiAqLworCTB4NjhCNSwweDY4QTAsMHg2OEJBLDB4NjkwRiwweDY4OEQsMHg2ODdFLDB4NjkwMSwweDY4Q0EsLyogMHg5MC0weDk3ICovCisJMHg2OTA4LDB4NjhEOCwweDY5MjIsMHg2OTI2LDB4NjhFMSwweDY5MEMsMHg2OENELDB4NjhENCwvKiAweDk4LTB4OUYgKi8KKwkweDY4RTcsMHg2OEQ1LDB4NjkzNiwweDY5MTIsMHg2OTA0LDB4NjhENywweDY4RTMsMHg2OTI1LC8qIDB4QTAtMHhBNyAqLworCTB4NjhGOSwweDY4RTAsMHg2OEVGLDB4NjkyOCwweDY5MkEsMHg2OTFBLDB4NjkyMywweDY5MjEsLyogMHhBOC0weEFGICovCisJMHg2OEM2LDB4Njk3OSwweDY5NzcsMHg2OTVDLDB4Njk3OCwweDY5NkIsMHg2OTU0LDB4Njk3RSwvKiAweEIwLTB4QjcgKi8KKwkweDY5NkUsMHg2OTM5LDB4Njk3NCwweDY5M0QsMHg2OTU5LDB4NjkzMCwweDY5NjEsMHg2OTVFLC8qIDB4QjgtMHhCRiAqLworCTB4Njk1RCwweDY5ODEsMHg2OTZBLDB4NjlCMiwweDY5QUUsMHg2OUQwLDB4NjlCRiwweDY5QzEsLyogMHhDMC0weEM3ICovCisJMHg2OUQzLDB4NjlCRSwweDY5Q0UsMHg1QkU4LDB4NjlDQSwweDY5REQsMHg2OUJCLDB4NjlDMywvKiAweEM4LTB4Q0YgKi8KKwkweDY5QTcsMHg2QTJFLDB4Njk5MSwweDY5QTAsMHg2OTlDLDB4Njk5NSwweDY5QjQsMHg2OURFLC8qIDB4RDAtMHhENyAqLworCTB4NjlFOCwweDZBMDIsMHg2QTFCLDB4NjlGRiwweDZCMEEsMHg2OUY5LDB4NjlGMiwweDY5RTcsLyogMHhEOC0weERGICovCisJMHg2QTA1LDB4NjlCMSwweDZBMUUsMHg2OUVELDB4NkExNCwweDY5RUIsMHg2QTBBLDB4NkExMiwvKiAweEUwLTB4RTcgKi8KKwkweDZBQzEsMHg2QTIzLDB4NkExMywweDZBNDQsMHg2QTBDLDB4NkE3MiwweDZBMzYsMHg2QTc4LC8qIDB4RTgtMHhFRiAqLworCTB4NkE0NywweDZBNjIsMHg2QTU5LDB4NkE2NiwweDZBNDgsMHg2QTM4LDB4NkEyMiwweDZBOTAsLyogMHhGMC0weEY3ICovCisJMHg2QThELDB4NkFBMCwweDZBODQsMHg2QUEyLDB4NkFBMywweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV85RlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDZBOTcsMHg4NjE3LDB4NkFCQiwweDZBQzMsMHg2QUMyLDB4NkFCOCwweDZBQjMsMHg2QUFDLC8qIDB4NDAtMHg0NyAqLworCTB4NkFERSwweDZBRDEsMHg2QURGLDB4NkFBQSwweDZBREEsMHg2QUVBLDB4NkFGQiwweDZCMDUsLyogMHg0OC0weDRGICovCisJMHg4NjE2LDB4NkFGQSwweDZCMTIsMHg2QjE2LDB4OUIzMSwweDZCMUYsMHg2QjM4LDB4NkIzNywvKiAweDUwLTB4NTcgKi8KKwkweDc2REMsMHg2QjM5LDB4OThFRSwweDZCNDcsMHg2QjQzLDB4NkI0OSwweDZCNTAsMHg2QjU5LC8qIDB4NTgtMHg1RiAqLworCTB4NkI1NCwweDZCNUIsMHg2QjVGLDB4NkI2MSwweDZCNzgsMHg2Qjc5LDB4NkI3RiwweDZCODAsLyogMHg2MC0weDY3ICovCisJMHg2Qjg0LDB4NkI4MywweDZCOEQsMHg2Qjk4LDB4NkI5NSwweDZCOUUsMHg2QkE0LDB4NkJBQSwvKiAweDY4LTB4NkYgKi8KKwkweDZCQUIsMHg2QkFGLDB4NkJCMiwweDZCQjEsMHg2QkIzLDB4NkJCNywweDZCQkMsMHg2QkM2LC8qIDB4NzAtMHg3NyAqLworCTB4NkJDQiwweDZCRDMsMHg2QkRGLDB4NkJFQywweDZCRUIsMHg2QkYzLDB4NkJFRiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDlFQkUsMHg2QzA4LDB4NkMxMywweDZDMTQsMHg2QzFCLDB4NkMyNCwweDZDMjMsMHg2QzVFLC8qIDB4ODAtMHg4NyAqLworCTB4NkM1NSwweDZDNjIsMHg2QzZBLDB4NkM4MiwweDZDOEQsMHg2QzlBLDB4NkM4MSwweDZDOUIsLyogMHg4OC0weDhGICovCisJMHg2QzdFLDB4NkM2OCwweDZDNzMsMHg2QzkyLDB4NkM5MCwweDZDQzQsMHg2Q0YxLDB4NkNEMywvKiAweDkwLTB4OTcgKi8KKwkweDZDQkQsMHg2Q0Q3LDB4NkNDNSwweDZDREQsMHg2Q0FFLDB4NkNCMSwweDZDQkUsMHg2Q0JBLC8qIDB4OTgtMHg5RiAqLworCTB4NkNEQiwweDZDRUYsMHg2Q0Q5LDB4NkNFQSwweDZEMUYsMHg4ODRELDB4NkQzNiwweDZEMkIsLyogMHhBMC0weEE3ICovCisJMHg2RDNELDB4NkQzOCwweDZEMTksMHg2RDM1LDB4NkQzMywweDZEMTIsMHg2RDBDLDB4NkQ2MywvKiAweEE4LTB4QUYgKi8KKwkweDZEOTMsMHg2RDY0LDB4NkQ1QSwweDZENzksMHg2RDU5LDB4NkQ4RSwweDZEOTUsMHg2RkU0LC8qIDB4QjAtMHhCNyAqLworCTB4NkQ4NSwweDZERjksMHg2RTE1LDB4NkUwQSwweDZEQjUsMHg2REM3LDB4NkRFNiwweDZEQjgsLyogMHhCOC0weEJGICovCisJMHg2REM2LDB4NkRFQywweDZEREUsMHg2RENDLDB4NkRFOCwweDZERDIsMHg2REM1LDB4NkRGQSwvKiAweEMwLTB4QzcgKi8KKwkweDZERDksMHg2REU0LDB4NkRENSwweDZERUEsMHg2REVFLDB4NkUyRCwweDZFNkUsMHg2RTJFLC8qIDB4QzgtMHhDRiAqLworCTB4NkUxOSwweDZFNzIsMHg2RTVGLDB4NkUzRSwweDZFMjMsMHg2RTZCLDB4NkUyQiwweDZFNzYsLyogMHhEMC0weEQ3ICovCisJMHg2RTRELDB4NkUxRiwweDZFNDMsMHg2RTNBLDB4NkU0RSwweDZFMjQsMHg2RUZGLDB4NkUxRCwvKiAweEQ4LTB4REYgKi8KKwkweDZFMzgsMHg2RTgyLDB4NkVBQSwweDZFOTgsMHg2RUM5LDB4NkVCNywweDZFRDMsMHg2RUJELC8qIDB4RTAtMHhFNyAqLworCTB4NkVBRiwweDZFQzQsMHg2RUIyLDB4NkVENCwweDZFRDUsMHg2RThGLDB4NkVBNSwweDZFQzIsLyogMHhFOC0weEVGICovCisJMHg2RTlGLDB4NkY0MSwweDZGMTEsMHg3MDRDLDB4NkVFQywweDZFRjgsMHg2RUZFLDB4NkYzRiwvKiAweEYwLTB4RjcgKi8KKwkweDZFRjIsMHg2RjMxLDB4NkVFRiwweDZGMzIsMHg2RUNDLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0UwWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NkYzRSwweDZGMTMsMHg2RUY3LDB4NkY4NiwweDZGN0EsMHg2Rjc4LDB4NkY4MSwweDZGODAsLyogMHg0MC0weDQ3ICovCisJMHg2RjZGLDB4NkY1QiwweDZGRjMsMHg2RjZELDB4NkY4MiwweDZGN0MsMHg2RjU4LDB4NkY4RSwvKiAweDQ4LTB4NEYgKi8KKwkweDZGOTEsMHg2RkMyLDB4NkY2NiwweDZGQjMsMHg2RkEzLDB4NkZBMSwweDZGQTQsMHg2RkI5LC8qIDB4NTAtMHg1NyAqLworCTB4NkZDNiwweDZGQUEsMHg2RkRGLDB4NkZENSwweDZGRUMsMHg2RkQ0LDB4NkZEOCwweDZGRjEsLyogMHg1OC0weDVGICovCisJMHg2RkVFLDB4NkZEQiwweDcwMDksMHg3MDBCLDB4NkZGQSwweDcwMTEsMHg3MDAxLDB4NzAwRiwvKiAweDYwLTB4NjcgKi8KKwkweDZGRkUsMHg3MDFCLDB4NzAxQSwweDZGNzQsMHg3MDFELDB4NzAxOCwweDcwMUYsMHg3MDMwLC8qIDB4NjgtMHg2RiAqLworCTB4NzAzRSwweDcwMzIsMHg3MDUxLDB4NzA2MywweDcwOTksMHg3MDkyLDB4NzBBRiwweDcwRjEsLyogMHg3MC0weDc3ICovCisJMHg3MEFDLDB4NzBCOCwweDcwQjMsMHg3MEFFLDB4NzBERiwweDcwQ0IsMHg3MERELDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NzBEOSwweDcxMDksMHg3MEZELDB4NzExQywweDcxMTksMHg3MTY1LDB4NzE1NSwweDcxODgsLyogMHg4MC0weDg3ICovCisJMHg3MTY2LDB4NzE2MiwweDcxNEMsMHg3MTU2LDB4NzE2QywweDcxOEYsMHg3MUZCLDB4NzE4NCwvKiAweDg4LTB4OEYgKi8KKwkweDcxOTUsMHg3MUE4LDB4NzFBQywweDcxRDcsMHg3MUI5LDB4NzFCRSwweDcxRDIsMHg3MUM5LC8qIDB4OTAtMHg5NyAqLworCTB4NzFENCwweDcxQ0UsMHg3MUUwLDB4NzFFQywweDcxRTcsMHg3MUY1LDB4NzFGQywweDcxRjksLyogMHg5OC0weDlGICovCisJMHg3MUZGLDB4NzIwRCwweDcyMTAsMHg3MjFCLDB4NzIyOCwweDcyMkQsMHg3MjJDLDB4NzIzMCwvKiAweEEwLTB4QTcgKi8KKwkweDcyMzIsMHg3MjNCLDB4NzIzQywweDcyM0YsMHg3MjQwLDB4NzI0NiwweDcyNEIsMHg3MjU4LC8qIDB4QTgtMHhBRiAqLworCTB4NzI3NCwweDcyN0UsMHg3MjgyLDB4NzI4MSwweDcyODcsMHg3MjkyLDB4NzI5NiwweDcyQTIsLyogMHhCMC0weEI3ICovCisJMHg3MkE3LDB4NzJCOSwweDcyQjIsMHg3MkMzLDB4NzJDNiwweDcyQzQsMHg3MkNFLDB4NzJEMiwvKiAweEI4LTB4QkYgKi8KKwkweDcyRTIsMHg3MkUwLDB4NzJFMSwweDcyRjksMHg3MkY3LDB4NTAwRiwweDczMTcsMHg3MzBBLC8qIDB4QzAtMHhDNyAqLworCTB4NzMxQywweDczMTYsMHg3MzFELDB4NzMzNCwweDczMkYsMHg3MzI5LDB4NzMyNSwweDczM0UsLyogMHhDOC0weENGICovCisJMHg3MzRFLDB4NzM0RiwweDlFRDgsMHg3MzU3LDB4NzM2QSwweDczNjgsMHg3MzcwLDB4NzM3OCwvKiAweEQwLTB4RDcgKi8KKwkweDczNzUsMHg3MzdCLDB4NzM3QSwweDczQzgsMHg3M0IzLDB4NzNDRSwweDczQkIsMHg3M0MwLC8qIDB4RDgtMHhERiAqLworCTB4NzNFNSwweDczRUUsMHg3M0RFLDB4NzRBMiwweDc0MDUsMHg3NDZGLDB4NzQyNSwweDczRjgsLyogMHhFMC0weEU3ICovCisJMHg3NDMyLDB4NzQzQSwweDc0NTUsMHg3NDNGLDB4NzQ1RiwweDc0NTksMHg3NDQxLDB4NzQ1QywvKiAweEU4LTB4RUYgKi8KKwkweDc0NjksMHg3NDcwLDB4NzQ2MywweDc0NkEsMHg3NDc2LDB4NzQ3RSwweDc0OEIsMHg3NDlFLC8qIDB4RjAtMHhGNyAqLworCTB4NzRBNywweDc0Q0EsMHg3NENGLDB4NzRENCwweDczRjEsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRTFbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg3NEUwLDB4NzRFMywweDc0RTcsMHg3NEU5LDB4NzRFRSwweDc0RjIsMHg3NEYwLDB4NzRGMSwvKiAweDQwLTB4NDcgKi8KKwkweDc0RjgsMHg3NEY3LDB4NzUwNCwweDc1MDMsMHg3NTA1LDB4NzUwQywweDc1MEUsMHg3NTBELC8qIDB4NDgtMHg0RiAqLworCTB4NzUxNSwweDc1MTMsMHg3NTFFLDB4NzUyNiwweDc1MkMsMHg3NTNDLDB4NzU0NCwweDc1NEQsLyogMHg1MC0weDU3ICovCisJMHg3NTRBLDB4NzU0OSwweDc1NUIsMHg3NTQ2LDB4NzU1QSwweDc1NjksMHg3NTY0LDB4NzU2NywvKiAweDU4LTB4NUYgKi8KKwkweDc1NkIsMHg3NTZELDB4NzU3OCwweDc1NzYsMHg3NTg2LDB4NzU4NywweDc1NzQsMHg3NThBLC8qIDB4NjAtMHg2NyAqLworCTB4NzU4OSwweDc1ODIsMHg3NTk0LDB4NzU5QSwweDc1OUQsMHg3NUE1LDB4NzVBMywweDc1QzIsLyogMHg2OC0weDZGICovCisJMHg3NUIzLDB4NzVDMywweDc1QjUsMHg3NUJELDB4NzVCOCwweDc1QkMsMHg3NUIxLDB4NzVDRCwvKiAweDcwLTB4NzcgKi8KKwkweDc1Q0EsMHg3NUQyLDB4NzVEOSwweDc1RTMsMHg3NURFLDB4NzVGRSwweDc1RkYsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg3NUZDLDB4NzYwMSwweDc1RjAsMHg3NUZBLDB4NzVGMiwweDc1RjMsMHg3NjBCLDB4NzYwRCwvKiAweDgwLTB4ODcgKi8KKwkweDc2MDksMHg3NjFGLDB4NzYyNywweDc2MjAsMHg3NjIxLDB4NzYyMiwweDc2MjQsMHg3NjM0LC8qIDB4ODgtMHg4RiAqLworCTB4NzYzMCwweDc2M0IsMHg3NjQ3LDB4NzY0OCwweDc2NDYsMHg3NjVDLDB4NzY1OCwweDc2NjEsLyogMHg5MC0weDk3ICovCisJMHg3NjYyLDB4NzY2OCwweDc2NjksMHg3NjZBLDB4NzY2NywweDc2NkMsMHg3NjcwLDB4NzY3MiwvKiAweDk4LTB4OUYgKi8KKwkweDc2NzYsMHg3Njc4LDB4NzY3QywweDc2ODAsMHg3NjgzLDB4NzY4OCwweDc2OEIsMHg3NjhFLC8qIDB4QTAtMHhBNyAqLworCTB4NzY5NiwweDc2OTMsMHg3Njk5LDB4NzY5QSwweDc2QjAsMHg3NkI0LDB4NzZCOCwweDc2QjksLyogMHhBOC0weEFGICovCisJMHg3NkJBLDB4NzZDMiwweDc2Q0QsMHg3NkQ2LDB4NzZEMiwweDc2REUsMHg3NkUxLDB4NzZFNSwvKiAweEIwLTB4QjcgKi8KKwkweDc2RTcsMHg3NkVBLDB4ODYyRiwweDc2RkIsMHg3NzA4LDB4NzcwNywweDc3MDQsMHg3NzI5LC8qIDB4QjgtMHhCRiAqLworCTB4NzcyNCwweDc3MUUsMHg3NzI1LDB4NzcyNiwweDc3MUIsMHg3NzM3LDB4NzczOCwweDc3NDcsLyogMHhDMC0weEM3ICovCisJMHg3NzVBLDB4Nzc2OCwweDc3NkIsMHg3NzVCLDB4Nzc2NSwweDc3N0YsMHg3NzdFLDB4Nzc3OSwvKiAweEM4LTB4Q0YgKi8KKwkweDc3OEUsMHg3NzhCLDB4Nzc5MSwweDc3QTAsMHg3NzlFLDB4NzdCMCwweDc3QjYsMHg3N0I5LC8qIDB4RDAtMHhENyAqLworCTB4NzdCRiwweDc3QkMsMHg3N0JELDB4NzdCQiwweDc3QzcsMHg3N0NELDB4NzdENywweDc3REEsLyogMHhEOC0weERGICovCisJMHg3N0RDLDB4NzdFMywweDc3RUUsMHg3N0ZDLDB4NzgwQywweDc4MTIsMHg3OTI2LDB4NzgyMCwvKiAweEUwLTB4RTcgKi8KKwkweDc5MkEsMHg3ODQ1LDB4Nzg4RSwweDc4NzQsMHg3ODg2LDB4Nzg3QywweDc4OUEsMHg3ODhDLC8qIDB4RTgtMHhFRiAqLworCTB4NzhBMywweDc4QjUsMHg3OEFBLDB4NzhBRiwweDc4RDEsMHg3OEM2LDB4NzhDQiwweDc4RDQsLyogMHhGMC0weEY3ICovCisJMHg3OEJFLDB4NzhCQywweDc4QzUsMHg3OENBLDB4NzhFQywweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FMlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDc4RTcsMHg3OERBLDB4NzhGRCwweDc4RjQsMHg3OTA3LDB4NzkxMiwweDc5MTEsMHg3OTE5LC8qIDB4NDAtMHg0NyAqLworCTB4NzkyQywweDc5MkIsMHg3OTQwLDB4Nzk2MCwweDc5NTcsMHg3OTVGLDB4Nzk1QSwweDc5NTUsLyogMHg0OC0weDRGICovCisJMHg3OTUzLDB4Nzk3QSwweDc5N0YsMHg3OThBLDB4Nzk5RCwweDc5QTcsMHg5RjRCLDB4NzlBQSwvKiAweDUwLTB4NTcgKi8KKwkweDc5QUUsMHg3OUIzLDB4NzlCOSwweDc5QkEsMHg3OUM5LDB4NzlENSwweDc5RTcsMHg3OUVDLC8qIDB4NTgtMHg1RiAqLworCTB4NzlFMSwweDc5RTMsMHg3QTA4LDB4N0EwRCwweDdBMTgsMHg3QTE5LDB4N0EyMCwweDdBMUYsLyogMHg2MC0weDY3ICovCisJMHg3OTgwLDB4N0EzMSwweDdBM0IsMHg3QTNFLDB4N0EzNywweDdBNDMsMHg3QTU3LDB4N0E0OSwvKiAweDY4LTB4NkYgKi8KKwkweDdBNjEsMHg3QTYyLDB4N0E2OSwweDlGOUQsMHg3QTcwLDB4N0E3OSwweDdBN0QsMHg3QTg4LC8qIDB4NzAtMHg3NyAqLworCTB4N0E5NywweDdBOTUsMHg3QTk4LDB4N0E5NiwweDdBQTksMHg3QUM4LDB4N0FCMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDdBQjYsMHg3QUM1LDB4N0FDNCwweDdBQkYsMHg5MDgzLDB4N0FDNywweDdBQ0EsMHg3QUNELC8qIDB4ODAtMHg4NyAqLworCTB4N0FDRiwweDdBRDUsMHg3QUQzLDB4N0FEOSwweDdBREEsMHg3QURELDB4N0FFMSwweDdBRTIsLyogMHg4OC0weDhGICovCisJMHg3QUU2LDB4N0FFRCwweDdBRjAsMHg3QjAyLDB4N0IwRiwweDdCMEEsMHg3QjA2LDB4N0IzMywvKiAweDkwLTB4OTcgKi8KKwkweDdCMTgsMHg3QjE5LDB4N0IxRSwweDdCMzUsMHg3QjI4LDB4N0IzNiwweDdCNTAsMHg3QjdBLC8qIDB4OTgtMHg5RiAqLworCTB4N0IwNCwweDdCNEQsMHg3QjBCLDB4N0I0QywweDdCNDUsMHg3Qjc1LDB4N0I2NSwweDdCNzQsLyogMHhBMC0weEE3ICovCisJMHg3QjY3LDB4N0I3MCwweDdCNzEsMHg3QjZDLDB4N0I2RSwweDdCOUQsMHg3Qjk4LDB4N0I5RiwvKiAweEE4LTB4QUYgKi8KKwkweDdCOEQsMHg3QjlDLDB4N0I5QSwweDdCOEIsMHg3QjkyLDB4N0I4RiwweDdCNUQsMHg3Qjk5LC8qIDB4QjAtMHhCNyAqLworCTB4N0JDQiwweDdCQzEsMHg3QkNDLDB4N0JDRiwweDdCQjQsMHg3QkM2LDB4N0JERCwweDdCRTksLyogMHhCOC0weEJGICovCisJMHg3QzExLDB4N0MxNCwweDdCRTYsMHg3QkU1LDB4N0M2MCwweDdDMDAsMHg3QzA3LDB4N0MxMywvKiAweEMwLTB4QzcgKi8KKwkweDdCRjMsMHg3QkY3LDB4N0MxNywweDdDMEQsMHg3QkY2LDB4N0MyMywweDdDMjcsMHg3QzJBLC8qIDB4QzgtMHhDRiAqLworCTB4N0MxRiwweDdDMzcsMHg3QzJCLDB4N0MzRCwweDdDNEMsMHg3QzQzLDB4N0M1NCwweDdDNEYsLyogMHhEMC0weEQ3ICovCisJMHg3QzQwLDB4N0M1MCwweDdDNTgsMHg3QzVGLDB4N0M2NCwweDdDNTYsMHg3QzY1LDB4N0M2QywvKiAweEQ4LTB4REYgKi8KKwkweDdDNzUsMHg3QzgzLDB4N0M5MCwweDdDQTQsMHg3Q0FELDB4N0NBMiwweDdDQUIsMHg3Q0ExLC8qIDB4RTAtMHhFNyAqLworCTB4N0NBOCwweDdDQjMsMHg3Q0IyLDB4N0NCMSwweDdDQUUsMHg3Q0I5LDB4N0NCRCwweDdDQzAsLyogMHhFOC0weEVGICovCisJMHg3Q0M1LDB4N0NDMiwweDdDRDgsMHg3Q0QyLDB4N0NEQywweDdDRTIsMHg5QjNCLDB4N0NFRiwvKiAweEYwLTB4RjcgKi8KKwkweDdDRjIsMHg3Q0Y0LDB4N0NGNiwweDdDRkEsMHg3RDA2LDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0UzWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4N0QwMiwweDdEMUMsMHg3RDE1LDB4N0QwQSwweDdENDUsMHg3RDRCLDB4N0QyRSwweDdEMzIsLyogMHg0MC0weDQ3ICovCisJMHg3RDNGLDB4N0QzNSwweDdENDYsMHg3RDczLDB4N0Q1NiwweDdENEUsMHg3RDcyLDB4N0Q2OCwvKiAweDQ4LTB4NEYgKi8KKwkweDdENkUsMHg3RDRGLDB4N0Q2MywweDdEOTMsMHg3RDg5LDB4N0Q1QiwweDdEOEYsMHg3RDdELC8qIDB4NTAtMHg1NyAqLworCTB4N0Q5QiwweDdEQkEsMHg3REFFLDB4N0RBMywweDdEQjUsMHg3REM3LDB4N0RCRCwweDdEQUIsLyogMHg1OC0weDVGICovCisJMHg3RTNELDB4N0RBMiwweDdEQUYsMHg3RERDLDB4N0RCOCwweDdEOUYsMHg3REIwLDB4N0REOCwvKiAweDYwLTB4NjcgKi8KKwkweDdEREQsMHg3REU0LDB4N0RERSwweDdERkIsMHg3REYyLDB4N0RFMSwweDdFMDUsMHg3RTBBLC8qIDB4NjgtMHg2RiAqLworCTB4N0UyMywweDdFMjEsMHg3RTEyLDB4N0UzMSwweDdFMUYsMHg3RTA5LDB4N0UwQiwweDdFMjIsLyogMHg3MC0weDc3ICovCisJMHg3RTQ2LDB4N0U2NiwweDdFM0IsMHg3RTM1LDB4N0UzOSwweDdFNDMsMHg3RTM3LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4N0UzMiwweDdFM0EsMHg3RTY3LDB4N0U1RCwweDdFNTYsMHg3RTVFLDB4N0U1OSwweDdFNUEsLyogMHg4MC0weDg3ICovCisJMHg3RTc5LDB4N0U2QSwweDdFNjksMHg3RTdDLDB4N0U3QiwweDdFODMsMHg3REQ1LDB4N0U3RCwvKiAweDg4LTB4OEYgKi8KKwkweDhGQUUsMHg3RTdGLDB4N0U4OCwweDdFODksMHg3RThDLDB4N0U5MiwweDdFOTAsMHg3RTkzLC8qIDB4OTAtMHg5NyAqLworCTB4N0U5NCwweDdFOTYsMHg3RThFLDB4N0U5QiwweDdFOUMsMHg3RjM4LDB4N0YzQSwweDdGNDUsLyogMHg5OC0weDlGICovCisJMHg3RjRDLDB4N0Y0RCwweDdGNEUsMHg3RjUwLDB4N0Y1MSwweDdGNTUsMHg3RjU0LDB4N0Y1OCwvKiAweEEwLTB4QTcgKi8KKwkweDdGNUYsMHg3RjYwLDB4N0Y2OCwweDdGNjksMHg3RjY3LDB4N0Y3OCwweDdGODIsMHg3Rjg2LC8qIDB4QTgtMHhBRiAqLworCTB4N0Y4MywweDdGODgsMHg3Rjg3LDB4N0Y4QywweDdGOTQsMHg3RjlFLDB4N0Y5RCwweDdGOUEsLyogMHhCMC0weEI3ICovCisJMHg3RkEzLDB4N0ZBRiwweDdGQjIsMHg3RkI5LDB4N0ZBRSwweDdGQjYsMHg3RkI4LDB4OEI3MSwvKiAweEI4LTB4QkYgKi8KKwkweDdGQzUsMHg3RkM2LDB4N0ZDQSwweDdGRDUsMHg3RkQ0LDB4N0ZFMSwweDdGRTYsMHg3RkU5LC8qIDB4QzAtMHhDNyAqLworCTB4N0ZGMywweDdGRjksMHg5OERDLDB4ODAwNiwweDgwMDQsMHg4MDBCLDB4ODAxMiwweDgwMTgsLyogMHhDOC0weENGICovCisJMHg4MDE5LDB4ODAxQywweDgwMjEsMHg4MDI4LDB4ODAzRiwweDgwM0IsMHg4MDRBLDB4ODA0NiwvKiAweEQwLTB4RDcgKi8KKwkweDgwNTIsMHg4MDU4LDB4ODA1QSwweDgwNUYsMHg4MDYyLDB4ODA2OCwweDgwNzMsMHg4MDcyLC8qIDB4RDgtMHhERiAqLworCTB4ODA3MCwweDgwNzYsMHg4MDc5LDB4ODA3RCwweDgwN0YsMHg4MDg0LDB4ODA4NiwweDgwODUsLyogMHhFMC0weEU3ICovCisJMHg4MDlCLDB4ODA5MywweDgwOUEsMHg4MEFELDB4NTE5MCwweDgwQUMsMHg4MERCLDB4ODBFNSwvKiAweEU4LTB4RUYgKi8KKwkweDgwRDksMHg4MERELDB4ODBDNCwweDgwREEsMHg4MEQ2LDB4ODEwOSwweDgwRUYsMHg4MEYxLC8qIDB4RjAtMHhGNyAqLworCTB4ODExQiwweDgxMjksMHg4MTIzLDB4ODEyRiwweDgxNEIsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRTRbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5NjhCLDB4ODE0NiwweDgxM0UsMHg4MTUzLDB4ODE1MSwweDgwRkMsMHg4MTcxLDB4ODE2RSwvKiAweDQwLTB4NDcgKi8KKwkweDgxNjUsMHg4MTY2LDB4ODE3NCwweDgxODMsMHg4MTg4LDB4ODE4QSwweDgxODAsMHg4MTgyLC8qIDB4NDgtMHg0RiAqLworCTB4ODFBMCwweDgxOTUsMHg4MUE0LDB4ODFBMywweDgxNUYsMHg4MTkzLDB4ODFBOSwweDgxQjAsLyogMHg1MC0weDU3ICovCisJMHg4MUI1LDB4ODFCRSwweDgxQjgsMHg4MUJELDB4ODFDMCwweDgxQzIsMHg4MUJBLDB4ODFDOSwvKiAweDU4LTB4NUYgKi8KKwkweDgxQ0QsMHg4MUQxLDB4ODFEOSwweDgxRDgsMHg4MUM4LDB4ODFEQSwweDgxREYsMHg4MUUwLC8qIDB4NjAtMHg2NyAqLworCTB4ODFFNywweDgxRkEsMHg4MUZCLDB4ODFGRSwweDgyMDEsMHg4MjAyLDB4ODIwNSwweDgyMDcsLyogMHg2OC0weDZGICovCisJMHg4MjBBLDB4ODIwRCwweDgyMTAsMHg4MjE2LDB4ODIyOSwweDgyMkIsMHg4MjM4LDB4ODIzMywvKiAweDcwLTB4NzcgKi8KKwkweDgyNDAsMHg4MjU5LDB4ODI1OCwweDgyNUQsMHg4MjVBLDB4ODI1RiwweDgyNjQsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg4MjYyLDB4ODI2OCwweDgyNkEsMHg4MjZCLDB4ODIyRSwweDgyNzEsMHg4Mjc3LDB4ODI3OCwvKiAweDgwLTB4ODcgKi8KKwkweDgyN0UsMHg4MjhELDB4ODI5MiwweDgyQUIsMHg4MjlGLDB4ODJCQiwweDgyQUMsMHg4MkUxLC8qIDB4ODgtMHg4RiAqLworCTB4ODJFMywweDgyREYsMHg4MkQyLDB4ODJGNCwweDgyRjMsMHg4MkZBLDB4ODM5MywweDgzMDMsLyogMHg5MC0weDk3ICovCisJMHg4MkZCLDB4ODJGOSwweDgyREUsMHg4MzA2LDB4ODJEQywweDgzMDksMHg4MkQ5LDB4ODMzNSwvKiAweDk4LTB4OUYgKi8KKwkweDgzMzQsMHg4MzE2LDB4ODMzMiwweDgzMzEsMHg4MzQwLDB4ODMzOSwweDgzNTAsMHg4MzQ1LC8qIDB4QTAtMHhBNyAqLworCTB4ODMyRiwweDgzMkIsMHg4MzE3LDB4ODMxOCwweDgzODUsMHg4MzlBLDB4ODNBQSwweDgzOUYsLyogMHhBOC0weEFGICovCisJMHg4M0EyLDB4ODM5NiwweDgzMjMsMHg4MzhFLDB4ODM4NywweDgzOEEsMHg4MzdDLDB4ODNCNSwvKiAweEIwLTB4QjcgKi8KKwkweDgzNzMsMHg4Mzc1LDB4ODNBMCwweDgzODksMHg4M0E4LDB4ODNGNCwweDg0MTMsMHg4M0VCLC8qIDB4QjgtMHhCRiAqLworCTB4ODNDRSwweDgzRkQsMHg4NDAzLDB4ODNEOCwweDg0MEIsMHg4M0MxLDB4ODNGNywweDg0MDcsLyogMHhDMC0weEM3ICovCisJMHg4M0UwLDB4ODNGMiwweDg0MEQsMHg4NDIyLDB4ODQyMCwweDgzQkQsMHg4NDM4LDB4ODUwNiwvKiAweEM4LTB4Q0YgKi8KKwkweDgzRkIsMHg4NDZELDB4ODQyQSwweDg0M0MsMHg4NTVBLDB4ODQ4NCwweDg0NzcsMHg4NDZCLC8qIDB4RDAtMHhENyAqLworCTB4ODRBRCwweDg0NkUsMHg4NDgyLDB4ODQ2OSwweDg0NDYsMHg4NDJDLDB4ODQ2RiwweDg0NzksLyogMHhEOC0weERGICovCisJMHg4NDM1LDB4ODRDQSwweDg0NjIsMHg4NEI5LDB4ODRCRiwweDg0OUYsMHg4NEQ5LDB4ODRDRCwvKiAweEUwLTB4RTcgKi8KKwkweDg0QkIsMHg4NERBLDB4ODREMCwweDg0QzEsMHg4NEM2LDB4ODRENiwweDg0QTEsMHg4NTIxLC8qIDB4RTgtMHhFRiAqLworCTB4ODRGRiwweDg0RjQsMHg4NTE3LDB4ODUxOCwweDg1MkMsMHg4NTFGLDB4ODUxNSwweDg1MTQsLyogMHhGMC0weEY3ICovCisJMHg4NEZDLDB4ODU0MCwweDg1NjMsMHg4NTU4LDB4ODU0OCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FNVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDg1NDEsMHg4NjAyLDB4ODU0QiwweDg1NTUsMHg4NTgwLDB4ODVBNCwweDg1ODgsMHg4NTkxLC8qIDB4NDAtMHg0NyAqLworCTB4ODU4QSwweDg1QTgsMHg4NTZELDB4ODU5NCwweDg1OUIsMHg4NUVBLDB4ODU4NywweDg1OUMsLyogMHg0OC0weDRGICovCisJMHg4NTc3LDB4ODU3RSwweDg1OTAsMHg4NUM5LDB4ODVCQSwweDg1Q0YsMHg4NUI5LDB4ODVEMCwvKiAweDUwLTB4NTcgKi8KKwkweDg1RDUsMHg4NURELDB4ODVFNSwweDg1REMsMHg4NUY5LDB4ODYwQSwweDg2MTMsMHg4NjBCLC8qIDB4NTgtMHg1RiAqLworCTB4ODVGRSwweDg1RkEsMHg4NjA2LDB4ODYyMiwweDg2MUEsMHg4NjMwLDB4ODYzRiwweDg2NEQsLyogMHg2MC0weDY3ICovCisJMHg0RTU1LDB4ODY1NCwweDg2NUYsMHg4NjY3LDB4ODY3MSwweDg2OTMsMHg4NkEzLDB4ODZBOSwvKiAweDY4LTB4NkYgKi8KKwkweDg2QUEsMHg4NjhCLDB4ODY4QywweDg2QjYsMHg4NkFGLDB4ODZDNCwweDg2QzYsMHg4NkIwLC8qIDB4NzAtMHg3NyAqLworCTB4ODZDOSwweDg4MjMsMHg4NkFCLDB4ODZENCwweDg2REUsMHg4NkU5LDB4ODZFQywweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDg2REYsMHg4NkRCLDB4ODZFRiwweDg3MTIsMHg4NzA2LDB4ODcwOCwweDg3MDAsMHg4NzAzLC8qIDB4ODAtMHg4NyAqLworCTB4ODZGQiwweDg3MTEsMHg4NzA5LDB4ODcwRCwweDg2RjksMHg4NzBBLDB4ODczNCwweDg3M0YsLyogMHg4OC0weDhGICovCisJMHg4NzM3LDB4ODczQiwweDg3MjUsMHg4NzI5LDB4ODcxQSwweDg3NjAsMHg4NzVGLDB4ODc3OCwvKiAweDkwLTB4OTcgKi8KKwkweDg3NEMsMHg4NzRFLDB4ODc3NCwweDg3NTcsMHg4NzY4LDB4ODc2RSwweDg3NTksMHg4NzUzLC8qIDB4OTgtMHg5RiAqLworCTB4ODc2MywweDg3NkEsMHg4ODA1LDB4ODdBMiwweDg3OUYsMHg4NzgyLDB4ODdBRiwweDg3Q0IsLyogMHhBMC0weEE3ICovCisJMHg4N0JELDB4ODdDMCwweDg3RDAsMHg5NkQ2LDB4ODdBQiwweDg3QzQsMHg4N0IzLDB4ODdDNywvKiAweEE4LTB4QUYgKi8KKwkweDg3QzYsMHg4N0JCLDB4ODdFRiwweDg3RjIsMHg4N0UwLDB4ODgwRiwweDg4MEQsMHg4N0ZFLC8qIDB4QjAtMHhCNyAqLworCTB4ODdGNiwweDg3RjcsMHg4ODBFLDB4ODdEMiwweDg4MTEsMHg4ODE2LDB4ODgxNSwweDg4MjIsLyogMHhCOC0weEJGICovCisJMHg4ODIxLDB4ODgzMSwweDg4MzYsMHg4ODM5LDB4ODgyNywweDg4M0IsMHg4ODQ0LDB4ODg0MiwvKiAweEMwLTB4QzcgKi8KKwkweDg4NTIsMHg4ODU5LDB4ODg1RSwweDg4NjIsMHg4ODZCLDB4ODg4MSwweDg4N0UsMHg4ODlFLC8qIDB4QzgtMHhDRiAqLworCTB4ODg3NSwweDg4N0QsMHg4OEI1LDB4ODg3MiwweDg4ODIsMHg4ODk3LDB4ODg5MiwweDg4QUUsLyogMHhEMC0weEQ3ICovCisJMHg4ODk5LDB4ODhBMiwweDg4OEQsMHg4OEE0LDB4ODhCMCwweDg4QkYsMHg4OEIxLDB4ODhDMywvKiAweEQ4LTB4REYgKi8KKwkweDg4QzQsMHg4OEQ0LDB4ODhEOCwweDg4RDksMHg4OERELDB4ODhGOSwweDg5MDIsMHg4OEZDLC8qIDB4RTAtMHhFNyAqLworCTB4ODhGNCwweDg4RTgsMHg4OEYyLDB4ODkwNCwweDg5MEMsMHg4OTBBLDB4ODkxMywweDg5NDMsLyogMHhFOC0weEVGICovCisJMHg4OTFFLDB4ODkyNSwweDg5MkEsMHg4OTJCLDB4ODk0MSwweDg5NDQsMHg4OTNCLDB4ODkzNiwvKiAweEYwLTB4RjcgKi8KKwkweDg5MzgsMHg4OTRDLDB4ODkxRCwweDg5NjAsMHg4OTVFLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0U2WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4ODk2NiwweDg5NjQsMHg4OTZELDB4ODk2QSwweDg5NkYsMHg4OTc0LDB4ODk3NywweDg5N0UsLyogMHg0MC0weDQ3ICovCisJMHg4OTgzLDB4ODk4OCwweDg5OEEsMHg4OTkzLDB4ODk5OCwweDg5QTEsMHg4OUE5LDB4ODlBNiwvKiAweDQ4LTB4NEYgKi8KKwkweDg5QUMsMHg4OUFGLDB4ODlCMiwweDg5QkEsMHg4OUJELDB4ODlCRiwweDg5QzAsMHg4OURBLC8qIDB4NTAtMHg1NyAqLworCTB4ODlEQywweDg5REQsMHg4OUU3LDB4ODlGNCwweDg5RjgsMHg4QTAzLDB4OEExNiwweDhBMTAsLyogMHg1OC0weDVGICovCisJMHg4QTBDLDB4OEExQiwweDhBMUQsMHg4QTI1LDB4OEEzNiwweDhBNDEsMHg4QTVCLDB4OEE1MiwvKiAweDYwLTB4NjcgKi8KKwkweDhBNDYsMHg4QTQ4LDB4OEE3QywweDhBNkQsMHg4QTZDLDB4OEE2MiwweDhBODUsMHg4QTgyLC8qIDB4NjgtMHg2RiAqLworCTB4OEE4NCwweDhBQTgsMHg4QUExLDB4OEE5MSwweDhBQTUsMHg4QUE2LDB4OEE5QSwweDhBQTMsLyogMHg3MC0weDc3ICovCisJMHg4QUM0LDB4OEFDRCwweDhBQzIsMHg4QURBLDB4OEFFQiwweDhBRjMsMHg4QUU3LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4OEFFNCwweDhBRjEsMHg4QjE0LDB4OEFFMCwweDhBRTIsMHg4QUY3LDB4OEFERSwweDhBREIsLyogMHg4MC0weDg3ICovCisJMHg4QjBDLDB4OEIwNywweDhCMUEsMHg4QUUxLDB4OEIxNiwweDhCMTAsMHg4QjE3LDB4OEIyMCwvKiAweDg4LTB4OEYgKi8KKwkweDhCMzMsMHg5N0FCLDB4OEIyNiwweDhCMkIsMHg4QjNFLDB4OEIyOCwweDhCNDEsMHg4QjRDLC8qIDB4OTAtMHg5NyAqLworCTB4OEI0RiwweDhCNEUsMHg4QjQ5LDB4OEI1NiwweDhCNUIsMHg4QjVBLDB4OEI2QiwweDhCNUYsLyogMHg5OC0weDlGICovCisJMHg4QjZDLDB4OEI2RiwweDhCNzQsMHg4QjdELDB4OEI4MCwweDhCOEMsMHg4QjhFLDB4OEI5MiwvKiAweEEwLTB4QTcgKi8KKwkweDhCOTMsMHg4Qjk2LDB4OEI5OSwweDhCOUEsMHg4QzNBLDB4OEM0MSwweDhDM0YsMHg4QzQ4LC8qIDB4QTgtMHhBRiAqLworCTB4OEM0QywweDhDNEUsMHg4QzUwLDB4OEM1NSwweDhDNjIsMHg4QzZDLDB4OEM3OCwweDhDN0EsLyogMHhCMC0weEI3ICovCisJMHg4QzgyLDB4OEM4OSwweDhDODUsMHg4QzhBLDB4OEM4RCwweDhDOEUsMHg4Qzk0LDB4OEM3QywvKiAweEI4LTB4QkYgKi8KKwkweDhDOTgsMHg2MjFELDB4OENBRCwweDhDQUEsMHg4Q0JELDB4OENCMiwweDhDQjMsMHg4Q0FFLC8qIDB4QzAtMHhDNyAqLworCTB4OENCNiwweDhDQzgsMHg4Q0MxLDB4OENFNCwweDhDRTMsMHg4Q0RBLDB4OENGRCwweDhDRkEsLyogMHhDOC0weENGICovCisJMHg4Q0ZCLDB4OEQwNCwweDhEMDUsMHg4RDBBLDB4OEQwNywweDhEMEYsMHg4RDBELDB4OEQxMCwvKiAweEQwLTB4RDcgKi8KKwkweDlGNEUsMHg4RDEzLDB4OENDRCwweDhEMTQsMHg4RDE2LDB4OEQ2NywweDhENkQsMHg4RDcxLC8qIDB4RDgtMHhERiAqLworCTB4OEQ3MywweDhEODEsMHg4RDk5LDB4OERDMiwweDhEQkUsMHg4REJBLDB4OERDRiwweDhEREEsLyogMHhFMC0weEU3ICovCisJMHg4REQ2LDB4OERDQywweDhEREIsMHg4RENCLDB4OERFQSwweDhERUIsMHg4RERGLDB4OERFMywvKiAweEU4LTB4RUYgKi8KKwkweDhERkMsMHg4RTA4LDB4OEUwOSwweDhERkYsMHg4RTFELDB4OEUxRSwweDhFMTAsMHg4RTFGLC8qIDB4RjAtMHhGNyAqLworCTB4OEU0MiwweDhFMzUsMHg4RTMwLDB4OEUzNCwweDhFNEEsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRTdbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4RTQ3LDB4OEU0OSwweDhFNEMsMHg4RTUwLDB4OEU0OCwweDhFNTksMHg4RTY0LDB4OEU2MCwvKiAweDQwLTB4NDcgKi8KKwkweDhFMkEsMHg4RTYzLDB4OEU1NSwweDhFNzYsMHg4RTcyLDB4OEU3QywweDhFODEsMHg4RTg3LC8qIDB4NDgtMHg0RiAqLworCTB4OEU4NSwweDhFODQsMHg4RThCLDB4OEU4QSwweDhFOTMsMHg4RTkxLDB4OEU5NCwweDhFOTksLyogMHg1MC0weDU3ICovCisJMHg4RUFBLDB4OEVBMSwweDhFQUMsMHg4RUIwLDB4OEVDNiwweDhFQjEsMHg4RUJFLDB4OEVDNSwvKiAweDU4LTB4NUYgKi8KKwkweDhFQzgsMHg4RUNCLDB4OEVEQiwweDhFRTMsMHg4RUZDLDB4OEVGQiwweDhFRUIsMHg4RUZFLC8qIDB4NjAtMHg2NyAqLworCTB4OEYwQSwweDhGMDUsMHg4RjE1LDB4OEYxMiwweDhGMTksMHg4RjEzLDB4OEYxQywweDhGMUYsLyogMHg2OC0weDZGICovCisJMHg4RjFCLDB4OEYwQywweDhGMjYsMHg4RjMzLDB4OEYzQiwweDhGMzksMHg4RjQ1LDB4OEY0MiwvKiAweDcwLTB4NzcgKi8KKwkweDhGM0UsMHg4RjRDLDB4OEY0OSwweDhGNDYsMHg4RjRFLDB4OEY1NywweDhGNUMsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg4RjYyLDB4OEY2MywweDhGNjQsMHg4RjlDLDB4OEY5RiwweDhGQTMsMHg4RkFELDB4OEZBRiwvKiAweDgwLTB4ODcgKi8KKwkweDhGQjcsMHg4RkRBLDB4OEZFNSwweDhGRTIsMHg4RkVBLDB4OEZFRiwweDkwODcsMHg4RkY0LC8qIDB4ODgtMHg4RiAqLworCTB4OTAwNSwweDhGRjksMHg4RkZBLDB4OTAxMSwweDkwMTUsMHg5MDIxLDB4OTAwRCwweDkwMUUsLyogMHg5MC0weDk3ICovCisJMHg5MDE2LDB4OTAwQiwweDkwMjcsMHg5MDM2LDB4OTAzNSwweDkwMzksMHg4RkY4LDB4OTA0RiwvKiAweDk4LTB4OUYgKi8KKwkweDkwNTAsMHg5MDUxLDB4OTA1MiwweDkwMEUsMHg5MDQ5LDB4OTAzRSwweDkwNTYsMHg5MDU4LC8qIDB4QTAtMHhBNyAqLworCTB4OTA1RSwweDkwNjgsMHg5MDZGLDB4OTA3NiwweDk2QTgsMHg5MDcyLDB4OTA4MiwweDkwN0QsLyogMHhBOC0weEFGICovCisJMHg5MDgxLDB4OTA4MCwweDkwOEEsMHg5MDg5LDB4OTA4RiwweDkwQTgsMHg5MEFGLDB4OTBCMSwvKiAweEIwLTB4QjcgKi8KKwkweDkwQjUsMHg5MEUyLDB4OTBFNCwweDYyNDgsMHg5MERCLDB4OTEwMiwweDkxMTIsMHg5MTE5LC8qIDB4QjgtMHhCRiAqLworCTB4OTEzMiwweDkxMzAsMHg5MTRBLDB4OTE1NiwweDkxNTgsMHg5MTYzLDB4OTE2NSwweDkxNjksLyogMHhDMC0weEM3ICovCisJMHg5MTczLDB4OTE3MiwweDkxOEIsMHg5MTg5LDB4OTE4MiwweDkxQTIsMHg5MUFCLDB4OTFBRiwvKiAweEM4LTB4Q0YgKi8KKwkweDkxQUEsMHg5MUI1LDB4OTFCNCwweDkxQkEsMHg5MUMwLDB4OTFDMSwweDkxQzksMHg5MUNCLC8qIDB4RDAtMHhENyAqLworCTB4OTFEMCwweDkxRDYsMHg5MURGLDB4OTFFMSwweDkxREIsMHg5MUZDLDB4OTFGNSwweDkxRjYsLyogMHhEOC0weERGICovCisJMHg5MjFFLDB4OTFGRiwweDkyMTQsMHg5MjJDLDB4OTIxNSwweDkyMTEsMHg5MjVFLDB4OTI1NywvKiAweEUwLTB4RTcgKi8KKwkweDkyNDUsMHg5MjQ5LDB4OTI2NCwweDkyNDgsMHg5Mjk1LDB4OTIzRiwweDkyNEIsMHg5MjUwLC8qIDB4RTgtMHhFRiAqLworCTB4OTI5QywweDkyOTYsMHg5MjkzLDB4OTI5QiwweDkyNUEsMHg5MkNGLDB4OTJCOSwweDkyQjcsLyogMHhGMC0weEY3ICovCisJMHg5MkU5LDB4OTMwRiwweDkyRkEsMHg5MzQ0LDB4OTMyRSwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FOFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDkzMTksMHg5MzIyLDB4OTMxQSwweDkzMjMsMHg5MzNBLDB4OTMzNSwweDkzM0IsMHg5MzVDLC8qIDB4NDAtMHg0NyAqLworCTB4OTM2MCwweDkzN0MsMHg5MzZFLDB4OTM1NiwweDkzQjAsMHg5M0FDLDB4OTNBRCwweDkzOTQsLyogMHg0OC0weDRGICovCisJMHg5M0I5LDB4OTNENiwweDkzRDcsMHg5M0U4LDB4OTNFNSwweDkzRDgsMHg5M0MzLDB4OTNERCwvKiAweDUwLTB4NTcgKi8KKwkweDkzRDAsMHg5M0M4LDB4OTNFNCwweDk0MUEsMHg5NDE0LDB4OTQxMywweDk0MDMsMHg5NDA3LC8qIDB4NTgtMHg1RiAqLworCTB4OTQxMCwweDk0MzYsMHg5NDJCLDB4OTQzNSwweDk0MjEsMHg5NDNBLDB4OTQ0MSwweDk0NTIsLyogMHg2MC0weDY3ICovCisJMHg5NDQ0LDB4OTQ1QiwweDk0NjAsMHg5NDYyLDB4OTQ1RSwweDk0NkEsMHg5MjI5LDB4OTQ3MCwvKiAweDY4LTB4NkYgKi8KKwkweDk0NzUsMHg5NDc3LDB4OTQ3RCwweDk0NUEsMHg5NDdDLDB4OTQ3RSwweDk0ODEsMHg5NDdGLC8qIDB4NzAtMHg3NyAqLworCTB4OTU4MiwweDk1ODcsMHg5NThBLDB4OTU5NCwweDk1OTYsMHg5NTk4LDB4OTU5OSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDk1QTAsMHg5NUE4LDB4OTVBNywweDk1QUQsMHg5NUJDLDB4OTVCQiwweDk1QjksMHg5NUJFLC8qIDB4ODAtMHg4NyAqLworCTB4OTVDQSwweDZGRjYsMHg5NUMzLDB4OTVDRCwweDk1Q0MsMHg5NUQ1LDB4OTVENCwweDk1RDYsLyogMHg4OC0weDhGICovCisJMHg5NURDLDB4OTVFMSwweDk1RTUsMHg5NUUyLDB4OTYyMSwweDk2MjgsMHg5NjJFLDB4OTYyRiwvKiAweDkwLTB4OTcgKi8KKwkweDk2NDIsMHg5NjRDLDB4OTY0RiwweDk2NEIsMHg5Njc3LDB4OTY1QywweDk2NUUsMHg5NjVELC8qIDB4OTgtMHg5RiAqLworCTB4OTY1RiwweDk2NjYsMHg5NjcyLDB4OTY2QywweDk2OEQsMHg5Njk4LDB4OTY5NSwweDk2OTcsLyogMHhBMC0weEE3ICovCisJMHg5NkFBLDB4OTZBNywweDk2QjEsMHg5NkIyLDB4OTZCMCwweDk2QjQsMHg5NkI2LDB4OTZCOCwvKiAweEE4LTB4QUYgKi8KKwkweDk2QjksMHg5NkNFLDB4OTZDQiwweDk2QzksMHg5NkNELDB4ODk0RCwweDk2REMsMHg5NzBELC8qIDB4QjAtMHhCNyAqLworCTB4OTZENSwweDk2RjksMHg5NzA0LDB4OTcwNiwweDk3MDgsMHg5NzEzLDB4OTcwRSwweDk3MTEsLyogMHhCOC0weEJGICovCisJMHg5NzBGLDB4OTcxNiwweDk3MTksMHg5NzI0LDB4OTcyQSwweDk3MzAsMHg5NzM5LDB4OTczRCwvKiAweEMwLTB4QzcgKi8KKwkweDk3M0UsMHg5NzQ0LDB4OTc0NiwweDk3NDgsMHg5NzQyLDB4OTc0OSwweDk3NUMsMHg5NzYwLC8qIDB4QzgtMHhDRiAqLworCTB4OTc2NCwweDk3NjYsMHg5NzY4LDB4NTJEMiwweDk3NkIsMHg5NzcxLDB4OTc3OSwweDk3ODUsLyogMHhEMC0weEQ3ICovCisJMHg5NzdDLDB4OTc4MSwweDk3N0EsMHg5Nzg2LDB4OTc4QiwweDk3OEYsMHg5NzkwLDB4OTc5QywvKiAweEQ4LTB4REYgKi8KKwkweDk3QTgsMHg5N0E2LDB4OTdBMywweDk3QjMsMHg5N0I0LDB4OTdDMywweDk3QzYsMHg5N0M4LC8qIDB4RTAtMHhFNyAqLworCTB4OTdDQiwweDk3REMsMHg5N0VELDB4OUY0RiwweDk3RjIsMHg3QURGLDB4OTdGNiwweDk3RjUsLyogMHhFOC0weEVGICovCisJMHg5ODBGLDB4OTgwQywweDk4MzgsMHg5ODI0LDB4OTgyMSwweDk4MzcsMHg5ODNELDB4OTg0NiwvKiAweEYwLTB4RjcgKi8KKwkweDk4NEYsMHg5ODRCLDB4OTg2QiwweDk4NkYsMHg5ODcwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0U5WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OTg3MSwweDk4NzQsMHg5ODczLDB4OThBQSwweDk4QUYsMHg5OEIxLDB4OThCNiwweDk4QzQsLyogMHg0MC0weDQ3ICovCisJMHg5OEMzLDB4OThDNiwweDk4RTksMHg5OEVCLDB4OTkwMywweDk5MDksMHg5OTEyLDB4OTkxNCwvKiAweDQ4LTB4NEYgKi8KKwkweDk5MTgsMHg5OTIxLDB4OTkxRCwweDk5MUUsMHg5OTI0LDB4OTkyMCwweDk5MkMsMHg5OTJFLC8qIDB4NTAtMHg1NyAqLworCTB4OTkzRCwweDk5M0UsMHg5OTQyLDB4OTk0OSwweDk5NDUsMHg5OTUwLDB4OTk0QiwweDk5NTEsLyogMHg1OC0weDVGICovCisJMHg5OTUyLDB4OTk0QywweDk5NTUsMHg5OTk3LDB4OTk5OCwweDk5QTUsMHg5OUFELDB4OTlBRSwvKiAweDYwLTB4NjcgKi8KKwkweDk5QkMsMHg5OURGLDB4OTlEQiwweDk5REQsMHg5OUQ4LDB4OTlEMSwweDk5RUQsMHg5OUVFLC8qIDB4NjgtMHg2RiAqLworCTB4OTlGMSwweDk5RjIsMHg5OUZCLDB4OTlGOCwweDlBMDEsMHg5QTBGLDB4OUEwNSwweDk5RTIsLyogMHg3MC0weDc3ICovCisJMHg5QTE5LDB4OUEyQiwweDlBMzcsMHg5QTQ1LDB4OUE0MiwweDlBNDAsMHg5QTQzLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4OUEzRSwweDlBNTUsMHg5QTRELDB4OUE1QiwweDlBNTcsMHg5QTVGLDB4OUE2MiwweDlBNjUsLyogMHg4MC0weDg3ICovCisJMHg5QTY0LDB4OUE2OSwweDlBNkIsMHg5QTZBLDB4OUFBRCwweDlBQjAsMHg5QUJDLDB4OUFDMCwvKiAweDg4LTB4OEYgKi8KKwkweDlBQ0YsMHg5QUQxLDB4OUFEMywweDlBRDQsMHg5QURFLDB4OUFERiwweDlBRTIsMHg5QUUzLC8qIDB4OTAtMHg5NyAqLworCTB4OUFFNiwweDlBRUYsMHg5QUVCLDB4OUFFRSwweDlBRjQsMHg5QUYxLDB4OUFGNywweDlBRkIsLyogMHg5OC0weDlGICovCisJMHg5QjA2LDB4OUIxOCwweDlCMUEsMHg5QjFGLDB4OUIyMiwweDlCMjMsMHg5QjI1LDB4OUIyNywvKiAweEEwLTB4QTcgKi8KKwkweDlCMjgsMHg5QjI5LDB4OUIyQSwweDlCMkUsMHg5QjJGLDB4OUIzMiwweDlCNDQsMHg5QjQzLC8qIDB4QTgtMHhBRiAqLworCTB4OUI0RiwweDlCNEQsMHg5QjRFLDB4OUI1MSwweDlCNTgsMHg5Qjc0LDB4OUI5MywweDlCODMsLyogMHhCMC0weEI3ICovCisJMHg5QjkxLDB4OUI5NiwweDlCOTcsMHg5QjlGLDB4OUJBMCwweDlCQTgsMHg5QkI0LDB4OUJDMCwvKiAweEI4LTB4QkYgKi8KKwkweDlCQ0EsMHg5QkI5LDB4OUJDNiwweDlCQ0YsMHg5QkQxLDB4OUJEMiwweDlCRTMsMHg5QkUyLC8qIDB4QzAtMHhDNyAqLworCTB4OUJFNCwweDlCRDQsMHg5QkUxLDB4OUMzQSwweDlCRjIsMHg5QkYxLDB4OUJGMCwweDlDMTUsLyogMHhDOC0weENGICovCisJMHg5QzE0LDB4OUMwOSwweDlDMTMsMHg5QzBDLDB4OUMwNiwweDlDMDgsMHg5QzEyLDB4OUMwQSwvKiAweEQwLTB4RDcgKi8KKwkweDlDMDQsMHg5QzJFLDB4OUMxQiwweDlDMjUsMHg5QzI0LDB4OUMyMSwweDlDMzAsMHg5QzQ3LC8qIDB4RDgtMHhERiAqLworCTB4OUMzMiwweDlDNDYsMHg5QzNFLDB4OUM1QSwweDlDNjAsMHg5QzY3LDB4OUM3NiwweDlDNzgsLyogMHhFMC0weEU3ICovCisJMHg5Q0U3LDB4OUNFQywweDlDRjAsMHg5RDA5LDB4OUQwOCwweDlDRUIsMHg5RDAzLDB4OUQwNiwvKiAweEU4LTB4RUYgKi8KKwkweDlEMkEsMHg5RDI2LDB4OURBRiwweDlEMjMsMHg5RDFGLDB4OUQ0NCwweDlEMTUsMHg5RDEyLC8qIDB4RjAtMHhGNyAqLworCTB4OUQ0MSwweDlEM0YsMHg5RDNFLDB4OUQ0NiwweDlENDgsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRUFbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5RDVELDB4OUQ1RSwweDlENjQsMHg5RDUxLDB4OUQ1MCwweDlENTksMHg5RDcyLDB4OUQ4OSwvKiAweDQwLTB4NDcgKi8KKwkweDlEODcsMHg5REFCLDB4OUQ2RiwweDlEN0EsMHg5RDlBLDB4OURBNCwweDlEQTksMHg5REIyLC8qIDB4NDgtMHg0RiAqLworCTB4OURDNCwweDlEQzEsMHg5REJCLDB4OURCOCwweDlEQkEsMHg5REM2LDB4OURDRiwweDlEQzIsLyogMHg1MC0weDU3ICovCisJMHg5REQ5LDB4OUREMywweDlERjgsMHg5REU2LDB4OURFRCwweDlERUYsMHg5REZELDB4OUUxQSwvKiAweDU4LTB4NUYgKi8KKwkweDlFMUIsMHg5RTFFLDB4OUU3NSwweDlFNzksMHg5RTdELDB4OUU4MSwweDlFODgsMHg5RThCLC8qIDB4NjAtMHg2NyAqLworCTB4OUU4QywweDlFOTIsMHg5RTk1LDB4OUU5MSwweDlFOUQsMHg5RUE1LDB4OUVBOSwweDlFQjgsLyogMHg2OC0weDZGICovCisJMHg5RUFBLDB4OUVBRCwweDk3NjEsMHg5RUNDLDB4OUVDRSwweDlFQ0YsMHg5RUQwLDB4OUVENCwvKiAweDcwLTB4NzcgKi8KKwkweDlFREMsMHg5RURFLDB4OUVERCwweDlFRTAsMHg5RUU1LDB4OUVFOCwweDlFRUYsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg5RUY0LDB4OUVGNiwweDlFRjcsMHg5RUY5LDB4OUVGQiwweDlFRkMsMHg5RUZELDB4OUYwNywvKiAweDgwLTB4ODcgKi8KKwkweDlGMDgsMHg3NkI3LDB4OUYxNSwweDlGMjEsMHg5RjJDLDB4OUYzRSwweDlGNEEsMHg5RjUyLC8qIDB4ODgtMHg4RiAqLworCTB4OUY1NCwweDlGNjMsMHg5RjVGLDB4OUY2MCwweDlGNjEsMHg5RjY2LDB4OUY2NywweDlGNkMsLyogMHg5MC0weDk3ICovCisJMHg5RjZBLDB4OUY3NywweDlGNzIsMHg5Rjc2LDB4OUY5NSwweDlGOUMsMHg5RkEwLDB4NTgyRiwvKiAweDk4LTB4OUYgKi8KKwkweDY5QzcsMHg5MDU5LDB4NzQ2NCwweDUxREMsMHg3MTk5LDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4QTAtMHhBNyAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0VEWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4N0U4QSwweDg5MUMsMHg5MzQ4LDB4OTI4OCwweDg0REMsMHg0RkM5LDB4NzBCQiwweDY2MzEsLyogMHg0MC0weDQ3ICovCisJMHg2OEM4LDB4OTJGOSwweDY2RkIsMHg1RjQ1LDB4NEUyOCwweDRFRTEsMHg0RUZDLDB4NEYwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDRGMDMsMHg0RjM5LDB4NEY1NiwweDRGOTIsMHg0RjhBLDB4NEY5QSwweDRGOTQsMHg0RkNELC8qIDB4NTAtMHg1NyAqLworCTB4NTA0MCwweDUwMjIsMHg0RkZGLDB4NTAxRSwweDUwNDYsMHg1MDcwLDB4NTA0MiwweDUwOTQsLyogMHg1OC0weDVGICovCisJMHg1MEY0LDB4NTBEOCwweDUxNEEsMHg1MTY0LDB4NTE5RCwweDUxQkUsMHg1MUVDLDB4NTIxNSwvKiAweDYwLTB4NjcgKi8KKwkweDUyOUMsMHg1MkE2LDB4NTJDMCwweDUyREIsMHg1MzAwLDB4NTMwNywweDUzMjQsMHg1MzcyLC8qIDB4NjgtMHg2RiAqLworCTB4NTM5MywweDUzQjIsMHg1M0RELDB4RkEwRSwweDU0OUMsMHg1NDhBLDB4NTRBOSwweDU0RkYsLyogMHg3MC0weDc3ICovCisJMHg1NTg2LDB4NTc1OSwweDU3NjUsMHg1N0FDLDB4NTdDOCwweDU3QzcsMHhGQTBGLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4RkExMCwweDU4OUUsMHg1OEIyLDB4NTkwQiwweDU5NTMsMHg1OTVCLDB4NTk1RCwweDU5NjMsLyogMHg4MC0weDg3ICovCisJMHg1OUE0LDB4NTlCQSwweDVCNTYsMHg1QkMwLDB4NzUyRiwweDVCRDgsMHg1QkVDLDB4NUMxRSwvKiAweDg4LTB4OEYgKi8KKwkweDVDQTYsMHg1Q0JBLDB4NUNGNSwweDVEMjcsMHg1RDUzLDB4RkExMSwweDVENDIsMHg1RDZELC8qIDB4OTAtMHg5NyAqLworCTB4NURCOCwweDVEQjksMHg1REQwLDB4NUYyMSwweDVGMzQsMHg1RjY3LDB4NUZCNywweDVGREUsLyogMHg5OC0weDlGICovCisJMHg2MDVELDB4NjA4NSwweDYwOEEsMHg2MERFLDB4NjBENSwweDYxMjAsMHg2MEYyLDB4NjExMSwvKiAweEEwLTB4QTcgKi8KKwkweDYxMzcsMHg2MTMwLDB4NjE5OCwweDYyMTMsMHg2MkE2LDB4NjNGNSwweDY0NjAsMHg2NDlELC8qIDB4QTgtMHhBRiAqLworCTB4NjRDRSwweDY1NEUsMHg2NjAwLDB4NjYxNSwweDY2M0IsMHg2NjA5LDB4NjYyRSwweDY2MUUsLyogMHhCMC0weEI3ICovCisJMHg2NjI0LDB4NjY2NSwweDY2NTcsMHg2NjU5LDB4RkExMiwweDY2NzMsMHg2Njk5LDB4NjZBMCwvKiAweEI4LTB4QkYgKi8KKwkweDY2QjIsMHg2NkJGLDB4NjZGQSwweDY3MEUsMHhGOTI5LDB4Njc2NiwweDY3QkIsMHg2ODUyLC8qIDB4QzAtMHhDNyAqLworCTB4NjdDMCwweDY4MDEsMHg2ODQ0LDB4NjhDRiwweEZBMTMsMHg2OTY4LDB4RkExNCwweDY5OTgsLyogMHhDOC0weENGICovCisJMHg2OUUyLDB4NkEzMCwweDZBNkIsMHg2QTQ2LDB4NkE3MywweDZBN0UsMHg2QUUyLDB4NkFFNCwvKiAweEQwLTB4RDcgKi8KKwkweDZCRDYsMHg2QzNGLDB4NkM1QywweDZDODYsMHg2QzZGLDB4NkNEQSwweDZEMDQsMHg2RDg3LC8qIDB4RDgtMHhERiAqLworCTB4NkQ2RiwweDZEOTYsMHg2REFDLDB4NkRDRiwweDZERjgsMHg2REYyLDB4NkRGQywweDZFMzksLyogMHhFMC0weEU3ICovCisJMHg2RTVDLDB4NkUyNywweDZFM0MsMHg2RUJGLDB4NkY4OCwweDZGQjUsMHg2RkY1LDB4NzAwNSwvKiAweEU4LTB4RUYgKi8KKwkweDcwMDcsMHg3MDI4LDB4NzA4NSwweDcwQUIsMHg3MTBGLDB4NzEwNCwweDcxNUMsMHg3MTQ2LC8qIDB4RjAtMHhGNyAqLworCTB4NzE0NywweEZBMTUsMHg3MUMxLDB4NzFGRSwweDcyQjEsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRUVbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg3MkJFLDB4NzMyNCwweEZBMTYsMHg3Mzc3LDB4NzNCRCwweDczQzksMHg3M0Q2LDB4NzNFMywvKiAweDQwLTB4NDcgKi8KKwkweDczRDIsMHg3NDA3LDB4NzNGNSwweDc0MjYsMHg3NDJBLDB4NzQyOSwweDc0MkUsMHg3NDYyLC8qIDB4NDgtMHg0RiAqLworCTB4NzQ4OSwweDc0OUYsMHg3NTAxLDB4NzU2RiwweDc2ODIsMHg3NjlDLDB4NzY5RSwweDc2OUIsLyogMHg1MC0weDU3ICovCisJMHg3NkE2LDB4RkExNywweDc3NDYsMHg1MkFGLDB4NzgyMSwweDc4NEUsMHg3ODY0LDB4Nzg3QSwvKiAweDU4LTB4NUYgKi8KKwkweDc5MzAsMHhGQTE4LDB4RkExOSwweEZBMUEsMHg3OTk0LDB4RkExQiwweDc5OUIsMHg3QUQxLC8qIDB4NjAtMHg2NyAqLworCTB4N0FFNywweEZBMUMsMHg3QUVCLDB4N0I5RSwweEZBMUQsMHg3RDQ4LDB4N0Q1QywweDdEQjcsLyogMHg2OC0weDZGICovCisJMHg3REEwLDB4N0RENiwweDdFNTIsMHg3RjQ3LDB4N0ZBMSwweEZBMUUsMHg4MzAxLDB4ODM2MiwvKiAweDcwLTB4NzcgKi8KKwkweDgzN0YsMHg4M0M3LDB4ODNGNiwweDg0NDgsMHg4NEI0LDB4ODU1MywweDg1NTksMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg4NTZCLDB4RkExRiwweDg1QjAsMHhGQTIwLDB4RkEyMSwweDg4MDcsMHg4OEY1LDB4OEExMiwvKiAweDgwLTB4ODcgKi8KKwkweDhBMzcsMHg4QTc5LDB4OEFBNywweDhBQkUsMHg4QURGLDB4RkEyMiwweDhBRjYsMHg4QjUzLC8qIDB4ODgtMHg4RiAqLworCTB4OEI3RiwweDhDRjAsMHg4Q0Y0LDB4OEQxMiwweDhENzYsMHhGQTIzLDB4OEVDRiwweEZBMjQsLyogMHg5MC0weDk3ICovCisJMHhGQTI1LDB4OTA2NywweDkwREUsMHhGQTI2LDB4OTExNSwweDkxMjcsMHg5MURBLDB4OTFENywvKiAweDk4LTB4OUYgKi8KKwkweDkxREUsMHg5MUVELDB4OTFFRSwweDkxRTQsMHg5MUU1LDB4OTIwNiwweDkyMTAsMHg5MjBBLC8qIDB4QTAtMHhBNyAqLworCTB4OTIzQSwweDkyNDAsMHg5MjNDLDB4OTI0RSwweDkyNTksMHg5MjUxLDB4OTIzOSwweDkyNjcsLyogMHhBOC0weEFGICovCisJMHg5MkE3LDB4OTI3NywweDkyNzgsMHg5MkU3LDB4OTJENywweDkyRDksMHg5MkQwLDB4RkEyNywvKiAweEIwLTB4QjcgKi8KKwkweDkyRDUsMHg5MkUwLDB4OTJEMywweDkzMjUsMHg5MzIxLDB4OTJGQiwweEZBMjgsMHg5MzFFLC8qIDB4QjgtMHhCRiAqLworCTB4OTJGRiwweDkzMUQsMHg5MzAyLDB4OTM3MCwweDkzNTcsMHg5M0E0LDB4OTNDNiwweDkzREUsLyogMHhDMC0weEM3ICovCisJMHg5M0Y4LDB4OTQzMSwweDk0NDUsMHg5NDQ4LDB4OTU5MiwweEY5REMsMHhGQTI5LDB4OTY5RCwvKiAweEM4LTB4Q0YgKi8KKwkweDk2QUYsMHg5NzMzLDB4OTczQiwweDk3NDMsMHg5NzRELDB4OTc0RiwweDk3NTEsMHg5NzU1LC8qIDB4RDAtMHhENyAqLworCTB4OTg1NywweDk4NjUsMHhGQTJBLDB4RkEyQiwweDk5MjcsMHhGQTJDLDB4OTk5RSwweDlBNEUsLyogMHhEOC0weERGICovCisJMHg5QUQ5LDB4OUFEQywweDlCNzUsMHg5QjcyLDB4OUI4RiwweDlCQjEsMHg5QkJCLDB4OUMwMCwvKiAweEUwLTB4RTcgKi8KKwkweDlENzAsMHg5RDZCLDB4RkEyRCwweDlFMTksMHg5RUQxLDB4MDAwMCwweDAwMDAsMHgyMTcwLC8qIDB4RTgtMHhFRiAqLworCTB4MjE3MSwweDIxNzIsMHgyMTczLDB4MjE3NCwweDIxNzUsMHgyMTc2LDB4MjE3NywweDIxNzgsLyogMHhGMC0weEY3ICovCisJMHgyMTc5LDB4RkZFMiwweEZGRTQsMHhGRjA3LDB4RkYwMiwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9GQVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDIxNzAsMHgyMTcxLDB4MjE3MiwweDIxNzMsMHgyMTc0LDB4MjE3NSwweDIxNzYsMHgyMTc3LC8qIDB4NDAtMHg0NyAqLworCTB4MjE3OCwweDIxNzksMHgyMTYwLDB4MjE2MSwweDIxNjIsMHgyMTYzLDB4MjE2NCwweDIxNjUsLyogMHg0OC0weDRGICovCisJMHgyMTY2LDB4MjE2NywweDIxNjgsMHgyMTY5LDB4RkZFMiwweEZGRTQsMHhGRjA3LDB4RkYwMiwvKiAweDUwLTB4NTcgKi8KKwkweDMyMzEsMHgyMTE2LDB4MjEyMSwweDIyMzUsMHg3RThBLDB4ODkxQywweDkzNDgsMHg5Mjg4LC8qIDB4NTgtMHg1RiAqLworCTB4ODREQywweDRGQzksMHg3MEJCLDB4NjYzMSwweDY4QzgsMHg5MkY5LDB4NjZGQiwweDVGNDUsLyogMHg2MC0weDY3ICovCisJMHg0RTI4LDB4NEVFMSwweDRFRkMsMHg0RjAwLDB4NEYwMywweDRGMzksMHg0RjU2LDB4NEY5MiwvKiAweDY4LTB4NkYgKi8KKwkweDRGOEEsMHg0RjlBLDB4NEY5NCwweDRGQ0QsMHg1MDQwLDB4NTAyMiwweDRGRkYsMHg1MDFFLC8qIDB4NzAtMHg3NyAqLworCTB4NTA0NiwweDUwNzAsMHg1MDQyLDB4NTA5NCwweDUwRjQsMHg1MEQ4LDB4NTE0QSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDUxNjQsMHg1MTlELDB4NTFCRSwweDUxRUMsMHg1MjE1LDB4NTI5QywweDUyQTYsMHg1MkMwLC8qIDB4ODAtMHg4NyAqLworCTB4NTJEQiwweDUzMDAsMHg1MzA3LDB4NTMyNCwweDUzNzIsMHg1MzkzLDB4NTNCMiwweDUzREQsLyogMHg4OC0weDhGICovCisJMHhGQTBFLDB4NTQ5QywweDU0OEEsMHg1NEE5LDB4NTRGRiwweDU1ODYsMHg1NzU5LDB4NTc2NSwvKiAweDkwLTB4OTcgKi8KKwkweDU3QUMsMHg1N0M4LDB4NTdDNywweEZBMEYsMHhGQTEwLDB4NTg5RSwweDU4QjIsMHg1OTBCLC8qIDB4OTgtMHg5RiAqLworCTB4NTk1MywweDU5NUIsMHg1OTVELDB4NTk2MywweDU5QTQsMHg1OUJBLDB4NUI1NiwweDVCQzAsLyogMHhBMC0weEE3ICovCisJMHg3NTJGLDB4NUJEOCwweDVCRUMsMHg1QzFFLDB4NUNBNiwweDVDQkEsMHg1Q0Y1LDB4NUQyNywvKiAweEE4LTB4QUYgKi8KKwkweDVENTMsMHhGQTExLDB4NUQ0MiwweDVENkQsMHg1REI4LDB4NURCOSwweDVERDAsMHg1RjIxLC8qIDB4QjAtMHhCNyAqLworCTB4NUYzNCwweDVGNjcsMHg1RkI3LDB4NUZERSwweDYwNUQsMHg2MDg1LDB4NjA4QSwweDYwREUsLyogMHhCOC0weEJGICovCisJMHg2MEQ1LDB4NjEyMCwweDYwRjIsMHg2MTExLDB4NjEzNywweDYxMzAsMHg2MTk4LDB4NjIxMywvKiAweEMwLTB4QzcgKi8KKwkweDYyQTYsMHg2M0Y1LDB4NjQ2MCwweDY0OUQsMHg2NENFLDB4NjU0RSwweDY2MDAsMHg2NjE1LC8qIDB4QzgtMHhDRiAqLworCTB4NjYzQiwweDY2MDksMHg2NjJFLDB4NjYxRSwweDY2MjQsMHg2NjY1LDB4NjY1NywweDY2NTksLyogMHhEMC0weEQ3ICovCisJMHhGQTEyLDB4NjY3MywweDY2OTksMHg2NkEwLDB4NjZCMiwweDY2QkYsMHg2NkZBLDB4NjcwRSwvKiAweEQ4LTB4REYgKi8KKwkweEY5MjksMHg2NzY2LDB4NjdCQiwweDY4NTIsMHg2N0MwLDB4NjgwMSwweDY4NDQsMHg2OENGLC8qIDB4RTAtMHhFNyAqLworCTB4RkExMywweDY5NjgsMHhGQTE0LDB4Njk5OCwweDY5RTIsMHg2QTMwLDB4NkE2QiwweDZBNDYsLyogMHhFOC0weEVGICovCisJMHg2QTczLDB4NkE3RSwweDZBRTIsMHg2QUU0LDB4NkJENiwweDZDM0YsMHg2QzVDLDB4NkM4NiwvKiAweEYwLTB4RjcgKi8KKwkweDZDNkYsMHg2Q0RBLDB4NkQwNCwweDZEODcsMHg2RDZGLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0ZCWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NkQ5NiwweDZEQUMsMHg2RENGLDB4NkRGOCwweDZERjIsMHg2REZDLDB4NkUzOSwweDZFNUMsLyogMHg0MC0weDQ3ICovCisJMHg2RTI3LDB4NkUzQywweDZFQkYsMHg2Rjg4LDB4NkZCNSwweDZGRjUsMHg3MDA1LDB4NzAwNywvKiAweDQ4LTB4NEYgKi8KKwkweDcwMjgsMHg3MDg1LDB4NzBBQiwweDcxMEYsMHg3MTA0LDB4NzE1QywweDcxNDYsMHg3MTQ3LC8qIDB4NTAtMHg1NyAqLworCTB4RkExNSwweDcxQzEsMHg3MUZFLDB4NzJCMSwweDcyQkUsMHg3MzI0LDB4RkExNiwweDczNzcsLyogMHg1OC0weDVGICovCisJMHg3M0JELDB4NzNDOSwweDczRDYsMHg3M0UzLDB4NzNEMiwweDc0MDcsMHg3M0Y1LDB4NzQyNiwvKiAweDYwLTB4NjcgKi8KKwkweDc0MkEsMHg3NDI5LDB4NzQyRSwweDc0NjIsMHg3NDg5LDB4NzQ5RiwweDc1MDEsMHg3NTZGLC8qIDB4NjgtMHg2RiAqLworCTB4NzY4MiwweDc2OUMsMHg3NjlFLDB4NzY5QiwweDc2QTYsMHhGQTE3LDB4Nzc0NiwweDUyQUYsLyogMHg3MC0weDc3ICovCisJMHg3ODIxLDB4Nzg0RSwweDc4NjQsMHg3ODdBLDB4NzkzMCwweEZBMTgsMHhGQTE5LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4RkExQSwweDc5OTQsMHhGQTFCLDB4Nzk5QiwweDdBRDEsMHg3QUU3LDB4RkExQywweDdBRUIsLyogMHg4MC0weDg3ICovCisJMHg3QjlFLDB4RkExRCwweDdENDgsMHg3RDVDLDB4N0RCNywweDdEQTAsMHg3REQ2LDB4N0U1MiwvKiAweDg4LTB4OEYgKi8KKwkweDdGNDcsMHg3RkExLDB4RkExRSwweDgzMDEsMHg4MzYyLDB4ODM3RiwweDgzQzcsMHg4M0Y2LC8qIDB4OTAtMHg5NyAqLworCTB4ODQ0OCwweDg0QjQsMHg4NTUzLDB4ODU1OSwweDg1NkIsMHhGQTFGLDB4ODVCMCwweEZBMjAsLyogMHg5OC0weDlGICovCisJMHhGQTIxLDB4ODgwNywweDg4RjUsMHg4QTEyLDB4OEEzNywweDhBNzksMHg4QUE3LDB4OEFCRSwvKiAweEEwLTB4QTcgKi8KKwkweDhBREYsMHhGQTIyLDB4OEFGNiwweDhCNTMsMHg4QjdGLDB4OENGMCwweDhDRjQsMHg4RDEyLC8qIDB4QTgtMHhBRiAqLworCTB4OEQ3NiwweEZBMjMsMHg4RUNGLDB4RkEyNCwweEZBMjUsMHg5MDY3LDB4OTBERSwweEZBMjYsLyogMHhCMC0weEI3ICovCisJMHg5MTE1LDB4OTEyNywweDkxREEsMHg5MUQ3LDB4OTFERSwweDkxRUQsMHg5MUVFLDB4OTFFNCwvKiAweEI4LTB4QkYgKi8KKwkweDkxRTUsMHg5MjA2LDB4OTIxMCwweDkyMEEsMHg5MjNBLDB4OTI0MCwweDkyM0MsMHg5MjRFLC8qIDB4QzAtMHhDNyAqLworCTB4OTI1OSwweDkyNTEsMHg5MjM5LDB4OTI2NywweDkyQTcsMHg5Mjc3LDB4OTI3OCwweDkyRTcsLyogMHhDOC0weENGICovCisJMHg5MkQ3LDB4OTJEOSwweDkyRDAsMHhGQTI3LDB4OTJENSwweDkyRTAsMHg5MkQzLDB4OTMyNSwvKiAweEQwLTB4RDcgKi8KKwkweDkzMjEsMHg5MkZCLDB4RkEyOCwweDkzMUUsMHg5MkZGLDB4OTMxRCwweDkzMDIsMHg5MzcwLC8qIDB4RDgtMHhERiAqLworCTB4OTM1NywweDkzQTQsMHg5M0M2LDB4OTNERSwweDkzRjgsMHg5NDMxLDB4OTQ0NSwweDk0NDgsLyogMHhFMC0weEU3ICovCisJMHg5NTkyLDB4RjlEQywweEZBMjksMHg5NjlELDB4OTZBRiwweDk3MzMsMHg5NzNCLDB4OTc0MywvKiAweEU4LTB4RUYgKi8KKwkweDk3NEQsMHg5NzRGLDB4OTc1MSwweDk3NTUsMHg5ODU3LDB4OTg2NSwweEZBMkEsMHhGQTJCLC8qIDB4RjAtMHhGNyAqLworCTB4OTkyNywweEZBMkMsMHg5OTlFLDB4OUE0RSwweDlBRDksMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRkNbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5QURDLDB4OUI3NSwweDlCNzIsMHg5QjhGLDB4OUJCMSwweDlCQkIsMHg5QzAwLDB4OUQ3MCwvKiAweDQwLTB4NDcgKi8KKwkweDlENkIsMHhGQTJELDB4OUUxOSwweDlFRDEsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgKnBhZ2VfY2hhcnNldDJ1bmlbMjU2XSA9IHsKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBjMnVfODEsIGMydV84MiwgYzJ1XzgzLCBjMnVfODQsIE5VTEwsICAgTlVMTCwgICBjMnVfODcsIAorCWMydV84OCwgYzJ1Xzg5LCBjMnVfOEEsIGMydV84QiwgYzJ1XzhDLCBjMnVfOEQsIGMydV84RSwgYzJ1XzhGLCAKKwljMnVfOTAsIGMydV85MSwgYzJ1XzkyLCBjMnVfOTMsIGMydV85NCwgYzJ1Xzk1LCBjMnVfOTYsIGMydV85NywgCisJYzJ1Xzk4LCBjMnVfOTksIGMydV85QSwgYzJ1XzlCLCBjMnVfOUMsIGMydV85RCwgYzJ1XzlFLCBjMnVfOUYsIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJYzJ1X0UwLCBjMnVfRTEsIGMydV9FMiwgYzJ1X0UzLCBjMnVfRTQsIGMydV9FNSwgYzJ1X0U2LCBjMnVfRTcsIAorCWMydV9FOCwgYzJ1X0U5LCBjMnVfRUEsIE5VTEwsICAgTlVMTCwgICBjMnVfRUQsIGMydV9FRSwgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIGMydV9GQSwgYzJ1X0ZCLCBjMnVfRkMsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzAwaGlbMjU2IC0gMHhBMF1bMl0gPSB7CisJezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sIHsweDgxLCAweDkxfSwgezB4ODEsIDB4OTJ9LC8qIDB4QTAtMHhBMyAqLworCXsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sIHsweDgxLCAweDk4fSwvKiAweEE0LTB4QTcgKi8KKwl7MHg4MSwgMHg0RX0sIHsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sLyogMHhBOC0weEFCICovCisJezB4ODEsIDB4Q0F9LCB7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LC8qIDB4QUMtMHhBRiAqLworCXsweDgxLCAweDhCfSwgezB4ODEsIDB4N0R9LCB7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwvKiAweEIwLTB4QjMgKi8KKwl7MHg4MSwgMHg0Q30sIHsweDAwLCAweDAwfSwgezB4ODEsIDB4Rjd9LCB7MHgwMCwgMHgwMH0sLyogMHhCNC0weEI3ICovCisJezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LC8qIDB4QjgtMHhCQiAqLworCXsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwvKiAweEJDLTB4QkYgKi8KKwl7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sLyogMHhDMC0weEMzICovCisJezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LC8qIDB4QzQtMHhDNyAqLworCXsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwvKiAweEM4LTB4Q0IgKi8KKwl7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sLyogMHhDQy0weENGICovCisJezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LC8qIDB4RDAtMHhEMyAqLworCXsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sIHsweDgxLCAweDdFfSwvKiAweEQ0LTB4RDcgKi8KKwl7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sLyogMHhEOC0weERCICovCisJezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LC8qIDB4REMtMHhERiAqLworCXsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwvKiAweEUwLTB4RTMgKi8KKwl7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sLyogMHhFNC0weEU3ICovCisJezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LC8qIDB4RTgtMHhFQiAqLworCXsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwvKiAweEVDLTB4RUYgKi8KKwl7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sLyogMHhGMC0weEYzICovCisJezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwgezB4ODEsIDB4ODB9LC8qIDB4RjQtMHhGNyAqLworCXsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwvKiAweEY4LTB4RkIgKi8KKwl7MHgwMCwgMHgwMH0sIHsweDAwLCAweDAwfSwgezB4MDAsIDB4MDB9LCB7MHgwMCwgMHgwMH0sLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMDNbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDgzLCAweDlGLCAweDgzLCAweEEwLCAweDgzLCAweEExLCAvKiAweDkwLTB4OTMgKi8KKwkweDgzLCAweEEyLCAweDgzLCAweEEzLCAweDgzLCAweEE0LCAweDgzLCAweEE1LCAvKiAweDk0LTB4OTcgKi8KKwkweDgzLCAweEE2LCAweDgzLCAweEE3LCAweDgzLCAweEE4LCAweDgzLCAweEE5LCAvKiAweDk4LTB4OUIgKi8KKwkweDgzLCAweEFBLCAweDgzLCAweEFCLCAweDgzLCAweEFDLCAweDgzLCAweEFELCAvKiAweDlDLTB4OUYgKi8KKwkweDgzLCAweEFFLCAweDgzLCAweEFGLCAweDAwLCAweDAwLCAweDgzLCAweEIwLCAvKiAweEEwLTB4QTMgKi8KKwkweDgzLCAweEIxLCAweDgzLCAweEIyLCAweDgzLCAweEIzLCAweDgzLCAweEI0LCAvKiAweEE0LTB4QTcgKi8KKwkweDgzLCAweEI1LCAweDgzLCAweEI2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDgzLCAweEJGLCAweDgzLCAweEMwLCAweDgzLCAweEMxLCAvKiAweEIwLTB4QjMgKi8KKwkweDgzLCAweEMyLCAweDgzLCAweEMzLCAweDgzLCAweEM0LCAweDgzLCAweEM1LCAvKiAweEI0LTB4QjcgKi8KKwkweDgzLCAweEM2LCAweDgzLCAweEM3LCAweDgzLCAweEM4LCAweDgzLCAweEM5LCAvKiAweEI4LTB4QkIgKi8KKwkweDgzLCAweENBLCAweDgzLCAweENCLCAweDgzLCAweENDLCAweDgzLCAweENELCAvKiAweEJDLTB4QkYgKi8KKwkweDgzLCAweENFLCAweDgzLCAweENGLCAweDAwLCAweDAwLCAweDgzLCAweEQwLCAvKiAweEMwLTB4QzMgKi8KKwkweDgzLCAweEQxLCAweDgzLCAweEQyLCAweDgzLCAweEQzLCAweDgzLCAweEQ0LCAvKiAweEM0LTB4QzcgKi8KKwkweDgzLCAweEQ1LCAweDgzLCAweEQ2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18wNFs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4ODQsIDB4NDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4ODQsIDB4NDAsIDB4ODQsIDB4NDEsIDB4ODQsIDB4NDIsIDB4ODQsIDB4NDMsIC8qIDB4MTAtMHgxMyAqLworCTB4ODQsIDB4NDQsIDB4ODQsIDB4NDUsIDB4ODQsIDB4NDcsIDB4ODQsIDB4NDgsIC8qIDB4MTQtMHgxNyAqLworCTB4ODQsIDB4NDksIDB4ODQsIDB4NEEsIDB4ODQsIDB4NEIsIDB4ODQsIDB4NEMsIC8qIDB4MTgtMHgxQiAqLworCTB4ODQsIDB4NEQsIDB4ODQsIDB4NEUsIDB4ODQsIDB4NEYsIDB4ODQsIDB4NTAsIC8qIDB4MUMtMHgxRiAqLworCTB4ODQsIDB4NTEsIDB4ODQsIDB4NTIsIDB4ODQsIDB4NTMsIDB4ODQsIDB4NTQsIC8qIDB4MjAtMHgyMyAqLworCTB4ODQsIDB4NTUsIDB4ODQsIDB4NTYsIDB4ODQsIDB4NTcsIDB4ODQsIDB4NTgsIC8qIDB4MjQtMHgyNyAqLworCTB4ODQsIDB4NTksIDB4ODQsIDB4NUEsIDB4ODQsIDB4NUIsIDB4ODQsIDB4NUMsIC8qIDB4MjgtMHgyQiAqLworCTB4ODQsIDB4NUQsIDB4ODQsIDB4NUUsIDB4ODQsIDB4NUYsIDB4ODQsIDB4NjAsIC8qIDB4MkMtMHgyRiAqLworCTB4ODQsIDB4NzAsIDB4ODQsIDB4NzEsIDB4ODQsIDB4NzIsIDB4ODQsIDB4NzMsIC8qIDB4MzAtMHgzMyAqLworCTB4ODQsIDB4NzQsIDB4ODQsIDB4NzUsIDB4ODQsIDB4NzcsIDB4ODQsIDB4NzgsIC8qIDB4MzQtMHgzNyAqLworCTB4ODQsIDB4NzksIDB4ODQsIDB4N0EsIDB4ODQsIDB4N0IsIDB4ODQsIDB4N0MsIC8qIDB4MzgtMHgzQiAqLworCTB4ODQsIDB4N0QsIDB4ODQsIDB4N0UsIDB4ODQsIDB4ODAsIDB4ODQsIDB4ODEsIC8qIDB4M0MtMHgzRiAqLworCTB4ODQsIDB4ODIsIDB4ODQsIDB4ODMsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODUsIC8qIDB4NDAtMHg0MyAqLworCTB4ODQsIDB4ODYsIDB4ODQsIDB4ODcsIDB4ODQsIDB4ODgsIDB4ODQsIDB4ODksIC8qIDB4NDQtMHg0NyAqLworCTB4ODQsIDB4OEEsIDB4ODQsIDB4OEIsIDB4ODQsIDB4OEMsIDB4ODQsIDB4OEQsIC8qIDB4NDgtMHg0QiAqLworCTB4ODQsIDB4OEUsIDB4ODQsIDB4OEYsIDB4ODQsIDB4OTAsIDB4ODQsIDB4OTEsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4ODQsIDB4NzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzIwWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHg4MSwgMHg1RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHg4MSwgMHg1QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHg4MSwgMHg2NSwgMHg4MSwgMHg2NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHg4MSwgMHg2NywgMHg4MSwgMHg2OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHg4MSwgMHhGNSwgMHg4MSwgMHhGNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHg4MSwgMHg2NCwgMHg4MSwgMHg2MywgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHg4MSwgMHhGMSwgMHgwMCwgMHgwMCwgMHg4MSwgMHg4QywgMHg4MSwgMHg4RCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MSwgMHhBNiwgLyogMHgzOC0weDNCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMjFbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgxLCAweDhFLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZBLCAweDU5LCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweEZBLCAweDVBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgxLCAweEYwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweEZBLCAweDRBLCAweEZBLCAweDRCLCAweEZBLCAweDRDLCAweEZBLCAweDRELCAvKiAweDYwLTB4NjMgKi8KKwkweEZBLCAweDRFLCAweEZBLCAweDRGLCAweEZBLCAweDUwLCAweEZBLCAweDUxLCAvKiAweDY0LTB4NjcgKi8KKwkweEZBLCAweDUyLCAweEZBLCAweDUzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweEVFLCAweEVGLCAweEVFLCAweEYwLCAweEVFLCAweEYxLCAweEVFLCAweEYyLCAvKiAweDcwLTB4NzMgKi8KKwkweEVFLCAweEYzLCAweEVFLCAweEY0LCAweEVFLCAweEY1LCAweEVFLCAweEY2LCAvKiAweDc0LTB4NzcgKi8KKwkweEVFLCAweEY3LCAweEVFLCAweEY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDgxLCAweEE5LCAweDgxLCAweEFBLCAweDgxLCAweEE4LCAweDgxLCAweEFCLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgxLCAweENCLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDgxLCAweENDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18yMls1MTJdID0geworCTB4ODEsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4ODEsIDB4REQsIDB4ODEsIDB4Q0UsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODEsIDB4REUsIC8qIDB4MDQtMHgwNyAqLworCTB4ODEsIDB4QjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODEsIDB4QjksIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4ODcsIDB4OTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODcsIDB4OTUsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4ODEsIDB4RTUsIDB4ODEsIDB4ODcsIDB4ODcsIDB4OTgsIC8qIDB4MUMtMHgxRiAqLworCTB4ODcsIDB4OTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4ODEsIDB4NjEsIDB4MDAsIDB4MDAsIDB4ODEsIDB4QzgsIC8qIDB4MjQtMHgyNyAqLworCTB4ODEsIDB4QzksIDB4ODcsIDB4OUIsIDB4ODcsIDB4OUMsIDB4ODcsIDB4OTIsIC8qIDB4MjgtMHgyQiAqLworCTB4ODEsIDB4RTgsIDB4MDAsIDB4MDAsIDB4ODcsIDB4OTMsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4ODEsIDB4ODgsIDB4RkEsIDB4NUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4ODEsIDB4RTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODcsIDB4OTAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4ODEsIDB4ODIsIDB4ODcsIDB4OTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODEsIDB4ODUsIDB4ODEsIDB4ODYsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODEsIDB4RTEsIDB4ODEsIDB4RTIsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODEsIDB4QkMsIDB4ODEsIDB4QkQsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODEsIDB4QkEsIDB4ODEsIDB4QkIsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4ODcsIDB4OTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODcsIDB4OTksIC8qIDB4QkMtMHhCRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzIzWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MSwgMHhEQywgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMjRbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDg3LCAweDQwLCAweDg3LCAweDQxLCAweDg3LCAweDQyLCAweDg3LCAweDQzLCAvKiAweDYwLTB4NjMgKi8KKwkweDg3LCAweDQ0LCAweDg3LCAweDQ1LCAweDg3LCAweDQ2LCAweDg3LCAweDQ3LCAvKiAweDY0LTB4NjcgKi8KKwkweDg3LCAweDQ4LCAweDg3LCAweDQ5LCAweDg3LCAweDRBLCAweDg3LCAweDRCLCAvKiAweDY4LTB4NkIgKi8KKwkweDg3LCAweDRDLCAweDg3LCAweDRELCAweDg3LCAweDRFLCAweDg3LCAweDRGLCAvKiAweDZDLTB4NkYgKi8KKwkweDg3LCAweDUwLCAweDg3LCAweDUxLCAweDg3LCAweDUyLCAweDg3LCAweDUzLCAvKiAweDcwLTB4NzMgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18yNVs1MTJdID0geworCTB4ODQsIDB4OUYsIDB4ODQsIDB4QUEsIDB4ODQsIDB4QTAsIDB4ODQsIDB4QUIsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4ODQsIDB4QTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODQsIDB4QUMsIC8qIDB4MEMtMHgwRiAqLworCTB4ODQsIDB4QTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODQsIDB4QUQsIC8qIDB4MTAtMHgxMyAqLworCTB4ODQsIDB4QTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODQsIDB4QUYsIC8qIDB4MTQtMHgxNyAqLworCTB4ODQsIDB4QTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODQsIDB4QUUsIC8qIDB4MTgtMHgxQiAqLworCTB4ODQsIDB4QTUsIDB4ODQsIDB4QkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4ODQsIDB4QjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODQsIDB4QjAsIC8qIDB4MjAtMHgyMyAqLworCTB4ODQsIDB4QTcsIDB4ODQsIDB4QkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4ODQsIDB4QjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODQsIDB4QjIsIC8qIDB4MjgtMHgyQiAqLworCTB4ODQsIDB4QTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODQsIDB4QjYsIC8qIDB4MkMtMHgyRiAqLworCTB4ODQsIDB4QkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODQsIDB4QjEsIC8qIDB4MzAtMHgzMyAqLworCTB4ODQsIDB4QTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODQsIDB4QjgsIC8qIDB4MzQtMHgzNyAqLworCTB4ODQsIDB4QkQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODQsIDB4QjMsIC8qIDB4MzgtMHgzQiAqLworCTB4ODQsIDB4QTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODQsIDB4QjksIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODQsIDB4QkUsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODQsIDB4QjQsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4ODEsIDB4QTEsIDB4ODEsIDB4QTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODEsIDB4QTMsIDB4ODEsIDB4QTIsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4ODEsIDB4QTUsIDB4ODEsIDB4QTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODEsIDB4OUYsIDB4ODEsIDB4OUUsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODEsIDB4OUIsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODEsIDB4OUQsIDB4ODEsIDB4OUMsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODEsIDB4RkMsIC8qIDB4RUMtMHhFRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzI2WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHg4MSwgMHg5QSwgMHg4MSwgMHg5OSwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHg4MSwgMHg4QSwgMHgwMCwgMHgwMCwgMHg4MSwgMHg4OSwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MSwgMHhGNCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHg4MSwgMHhGMywgMHgwMCwgMHgwMCwgMHg4MSwgMHhGMiwgLyogMHg2Qy0weDZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMzBbNTEyXSA9IHsKKwkweDgxLCAweDQwLCAweDgxLCAweDQxLCAweDgxLCAweDQyLCAweDgxLCAweDU2LCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDgxLCAweDU4LCAweDgxLCAweDU5LCAweDgxLCAweDVBLCAvKiAweDA0LTB4MDcgKi8KKwkweDgxLCAweDcxLCAweDgxLCAweDcyLCAweDgxLCAweDczLCAweDgxLCAweDc0LCAvKiAweDA4LTB4MEIgKi8KKwkweDgxLCAweDc1LCAweDgxLCAweDc2LCAweDgxLCAweDc3LCAweDgxLCAweDc4LCAvKiAweDBDLTB4MEYgKi8KKwkweDgxLCAweDc5LCAweDgxLCAweDdBLCAweDgxLCAweEE3LCAweDgxLCAweEFDLCAvKiAweDEwLTB4MTMgKi8KKwkweDgxLCAweDZCLCAweDgxLCAweDZDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDg3LCAweDgwLCAweDAwLCAweDAwLCAweDg3LCAweDgxLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDgyLCAweDlGLCAweDgyLCAweEEwLCAweDgyLCAweEExLCAvKiAweDQwLTB4NDMgKi8KKwkweDgyLCAweEEyLCAweDgyLCAweEEzLCAweDgyLCAweEE0LCAweDgyLCAweEE1LCAvKiAweDQ0LTB4NDcgKi8KKwkweDgyLCAweEE2LCAweDgyLCAweEE3LCAweDgyLCAweEE4LCAweDgyLCAweEE5LCAvKiAweDQ4LTB4NEIgKi8KKwkweDgyLCAweEFBLCAweDgyLCAweEFCLCAweDgyLCAweEFDLCAweDgyLCAweEFELCAvKiAweDRDLTB4NEYgKi8KKwkweDgyLCAweEFFLCAweDgyLCAweEFGLCAweDgyLCAweEIwLCAweDgyLCAweEIxLCAvKiAweDUwLTB4NTMgKi8KKwkweDgyLCAweEIyLCAweDgyLCAweEIzLCAweDgyLCAweEI0LCAweDgyLCAweEI1LCAvKiAweDU0LTB4NTcgKi8KKwkweDgyLCAweEI2LCAweDgyLCAweEI3LCAweDgyLCAweEI4LCAweDgyLCAweEI5LCAvKiAweDU4LTB4NUIgKi8KKwkweDgyLCAweEJBLCAweDgyLCAweEJCLCAweDgyLCAweEJDLCAweDgyLCAweEJELCAvKiAweDVDLTB4NUYgKi8KKwkweDgyLCAweEJFLCAweDgyLCAweEJGLCAweDgyLCAweEMwLCAweDgyLCAweEMxLCAvKiAweDYwLTB4NjMgKi8KKwkweDgyLCAweEMyLCAweDgyLCAweEMzLCAweDgyLCAweEM0LCAweDgyLCAweEM1LCAvKiAweDY0LTB4NjcgKi8KKwkweDgyLCAweEM2LCAweDgyLCAweEM3LCAweDgyLCAweEM4LCAweDgyLCAweEM5LCAvKiAweDY4LTB4NkIgKi8KKwkweDgyLCAweENBLCAweDgyLCAweENCLCAweDgyLCAweENDLCAweDgyLCAweENELCAvKiAweDZDLTB4NkYgKi8KKwkweDgyLCAweENFLCAweDgyLCAweENGLCAweDgyLCAweEQwLCAweDgyLCAweEQxLCAvKiAweDcwLTB4NzMgKi8KKwkweDgyLCAweEQyLCAweDgyLCAweEQzLCAweDgyLCAweEQ0LCAweDgyLCAweEQ1LCAvKiAweDc0LTB4NzcgKi8KKwkweDgyLCAweEQ2LCAweDgyLCAweEQ3LCAweDgyLCAweEQ4LCAweDgyLCAweEQ5LCAvKiAweDc4LTB4N0IgKi8KKwkweDgyLCAweERBLCAweDgyLCAweERCLCAweDgyLCAweERDLCAweDgyLCAweERELCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDgyLCAweERFLCAweDgyLCAweERGLCAweDgyLCAweEUwLCAweDgyLCAweEUxLCAvKiAweDgwLTB4ODMgKi8KKwkweDgyLCAweEUyLCAweDgyLCAweEUzLCAweDgyLCAweEU0LCAweDgyLCAweEU1LCAvKiAweDg0LTB4ODcgKi8KKwkweDgyLCAweEU2LCAweDgyLCAweEU3LCAweDgyLCAweEU4LCAweDgyLCAweEU5LCAvKiAweDg4LTB4OEIgKi8KKwkweDgyLCAweEVBLCAweDgyLCAweEVCLCAweDgyLCAweEVDLCAweDgyLCAweEVELCAvKiAweDhDLTB4OEYgKi8KKwkweDgyLCAweEVFLCAweDgyLCAweEVGLCAweDgyLCAweEYwLCAweDgyLCAweEYxLCAvKiAweDkwLTB4OTMgKi8KKwkweDgzLCAweDk0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgxLCAweDRBLCAvKiAweDk4LTB4OUIgKi8KKwkweDgxLCAweDRCLCAweDgxLCAweDU0LCAweDgxLCAweDU1LCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDgzLCAweDQwLCAweDgzLCAweDQxLCAweDgzLCAweDQyLCAvKiAweEEwLTB4QTMgKi8KKwkweDgzLCAweDQzLCAweDgzLCAweDQ0LCAweDgzLCAweDQ1LCAweDgzLCAweDQ2LCAvKiAweEE0LTB4QTcgKi8KKwkweDgzLCAweDQ3LCAweDgzLCAweDQ4LCAweDgzLCAweDQ5LCAweDgzLCAweDRBLCAvKiAweEE4LTB4QUIgKi8KKwkweDgzLCAweDRCLCAweDgzLCAweDRDLCAweDgzLCAweDRELCAweDgzLCAweDRFLCAvKiAweEFDLTB4QUYgKi8KKwkweDgzLCAweDRGLCAweDgzLCAweDUwLCAweDgzLCAweDUxLCAweDgzLCAweDUyLCAvKiAweEIwLTB4QjMgKi8KKwkweDgzLCAweDUzLCAweDgzLCAweDU0LCAweDgzLCAweDU1LCAweDgzLCAweDU2LCAvKiAweEI0LTB4QjcgKi8KKwkweDgzLCAweDU3LCAweDgzLCAweDU4LCAweDgzLCAweDU5LCAweDgzLCAweDVBLCAvKiAweEI4LTB4QkIgKi8KKwkweDgzLCAweDVCLCAweDgzLCAweDVDLCAweDgzLCAweDVELCAweDgzLCAweDVFLCAvKiAweEJDLTB4QkYgKi8KKwkweDgzLCAweDVGLCAweDgzLCAweDYwLCAweDgzLCAweDYxLCAweDgzLCAweDYyLCAvKiAweEMwLTB4QzMgKi8KKwkweDgzLCAweDYzLCAweDgzLCAweDY0LCAweDgzLCAweDY1LCAweDgzLCAweDY2LCAvKiAweEM0LTB4QzcgKi8KKwkweDgzLCAweDY3LCAweDgzLCAweDY4LCAweDgzLCAweDY5LCAweDgzLCAweDZBLCAvKiAweEM4LTB4Q0IgKi8KKwkweDgzLCAweDZCLCAweDgzLCAweDZDLCAweDgzLCAweDZELCAweDgzLCAweDZFLCAvKiAweENDLTB4Q0YgKi8KKwkweDgzLCAweDZGLCAweDgzLCAweDcwLCAweDgzLCAweDcxLCAweDgzLCAweDcyLCAvKiAweEQwLTB4RDMgKi8KKwkweDgzLCAweDczLCAweDgzLCAweDc0LCAweDgzLCAweDc1LCAweDgzLCAweDc2LCAvKiAweEQ0LTB4RDcgKi8KKwkweDgzLCAweDc3LCAweDgzLCAweDc4LCAweDgzLCAweDc5LCAweDgzLCAweDdBLCAvKiAweEQ4LTB4REIgKi8KKwkweDgzLCAweDdCLCAweDgzLCAweDdDLCAweDgzLCAweDdELCAweDgzLCAweDdFLCAvKiAweERDLTB4REYgKi8KKwkweDgzLCAweDgwLCAweDgzLCAweDgxLCAweDgzLCAweDgyLCAweDgzLCAweDgzLCAvKiAweEUwLTB4RTMgKi8KKwkweDgzLCAweDg0LCAweDgzLCAweDg1LCAweDgzLCAweDg2LCAweDgzLCAweDg3LCAvKiAweEU0LTB4RTcgKi8KKwkweDgzLCAweDg4LCAweDgzLCAweDg5LCAweDgzLCAweDhBLCAweDgzLCAweDhCLCAvKiAweEU4LTB4RUIgKi8KKwkweDgzLCAweDhDLCAweDgzLCAweDhELCAweDgzLCAweDhFLCAweDgzLCAweDhGLCAvKiAweEVDLTB4RUYgKi8KKwkweDgzLCAweDkwLCAweDgzLCAweDkxLCAweDgzLCAweDkyLCAweDgzLCAweDkzLCAvKiAweEYwLTB4RjMgKi8KKwkweDgzLCAweDk0LCAweDgzLCAweDk1LCAweDgzLCAweDk2LCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgxLCAweDQ1LCAvKiAweEY4LTB4RkIgKi8KKwkweDgxLCAweDVCLCAweDgxLCAweDUyLCAweDgxLCAweDUzLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18zMls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4RkEsIDB4NTgsIDB4ODcsIDB4OEIsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4ODcsIDB4OEMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4ODcsIDB4ODUsIDB4ODcsIDB4ODYsIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODgsIC8qIDB4QTQtMHhBNyAqLworCTB4ODcsIDB4ODksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzMzWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4NywgMHg2NSwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHg4NywgMHg2OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHg4NywgMHg2MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHg4NywgMHg2MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4NywgMHg2MSwgMHg4NywgMHg2QiwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4NywgMHg2QSwgMHg4NywgMHg2NCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4NywgMHg2QywgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4NywgMHg2NiwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4NywgMHg2RSwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHg4NywgMHg1RiwgMHg4NywgMHg2RCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHg4NywgMHg2MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHg4NywgMHg2NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4NywgMHg2OCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4NywgMHg3RSwgLyogMHg3OC0weDdCICovCisJMHg4NywgMHg4RiwgMHg4NywgMHg4RSwgMHg4NywgMHg4RCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4NywgMHg3MiwgMHg4NywgMHg3MywgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHg4NywgMHg2RiwgMHg4NywgMHg3MCwgMHg4NywgMHg3MSwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHg4NywgMHg3NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHg4NywgMHg3NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHg4NywgMHg4MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNEVbNTEyXSA9IHsKKwkweDg4LCAweEVBLCAweDkyLCAweDlBLCAweDAwLCAweDAwLCAweDhFLCAweEI1LCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk2LCAweDlDLCAvKiAweDA0LTB4MDcgKi8KKwkweDhGLCAweEU0LCAweDhFLCAweDRGLCAweDhGLCAweEUzLCAweDg5LCAweEJBLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDk1LCAweDczLCAweDk3LCAweDVFLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDk4LCAweEEwLCAweDg5LCAweDRFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDhBLCAweDhFLCAweDk4LCAweEExLCAweDkwLCAweEEyLCAweDk5LCAweEMwLCAvKiAweDE0LTB4MTcgKi8KKwkweDhCLCAweDc1LCAweDk1LCAweEI4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhGLCAweEU1LCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDk3LCAweEJDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk1LCAweEMwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweEVELCAweDRDLCAweDAwLCAweDAwLCAweDk4LCAweEEyLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDkyLCAweDg2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDk4LCAweEEzLCAweDhCLCAweEY4LCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk4LCAweEE0LCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDhBLCAweERCLCAweDkyLCAweDRGLCAweDAwLCAweDAwLCAweDhFLCAweEU1LCAvKiAweDM4LTB4M0IgKi8KKwkweDk4LCAweEE1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk4LCAweEE2LCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk4LCAweEE3LCAweDk0LCAweDU0LCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDhCLCAweDc2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk0LCAweDU2LCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDkzLCAweEUxLCAweDhDLCAweEMxLCAweDk2LCAweDUyLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweDY4LCAweDk4LCAweEE4LCAweDhGLCAweEU2LCAvKiAweDU0LTB4NTcgKi8KKwkweDk4LCAweEE5LCAweDg5LCAweEIzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDhCLCAweEUzLCAweDhDLCAweEVFLCAweDk2LCAweEU3LCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlCLCAweEE0LCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDk3LCAweDkwLCAweDAwLCAweDAwLCAweDkzLCAweEZCLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhBLCAweEEzLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDhCLCAweDU0LCAweDAwLCAweDAwLCAweDk4LCAweEFBLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDk4LCAweEFCLCAweDk3LCAweEI5LCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDk3LCAweDVDLCAweDkxLCAweDg4LCAweDk4LCAweEFELCAweDhFLCAweDk2LCAvKiAweDg4LTB4OEIgKi8KKwkweDkzLCAweEYxLCAweDAwLCAweDAwLCAweDk4LCAweEIwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDg5LCAweDVELCAweDhDLCAweERELCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDhDLCAweERDLCAweDg4LCAweEU0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDk4LCAweDZBLCAweDk4LCAweDY5LCAweDAwLCAweDAwLCAweDhELCAweEIxLCAvKiAweDk4LTB4OUIgKi8KKwkweDg4LCAweDlGLCAweDAwLCAweDAwLCAweDk4LCAweEIxLCAweDk4LCAweEIyLCAvKiAweDlDLTB4OUYgKi8KKwkweDk4LCAweEIzLCAweDk2LCAweDUzLCAweDk4LCAweEI0LCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDhDLCAweEYwLCAweDg4LCAweEU1LCAweDk2LCAweDkyLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDhCLCAweDlDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhCLCAweDlELCAvKiAweEE4LTB4QUIgKi8KKwkweDhCLCAweDlFLCAweDkyLCAweEUwLCAweDk3LCAweEJBLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDk4LCAweEI1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk4LCAweEI2LCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk4LCAweEI3LCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkwLCAweDZDLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDhGLCAweDU5LCAweDkwLCAweDZELCAweDk4LCAweEJDLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDk4LCAweEJBLCAweDAwLCAweDAwLCAweDk4LCAweEJCLCAweDhCLCAweDc3LCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhELCAweEExLCAweDg5LCAweEVFLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDk4LCAweEI5LCAweDk4LCAweEI4LCAweDk1LCAweEE3LCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDhFLCAweDY1LCAweDhFLCAweDY0LCAweDkxLCAweEJDLCAweDk4LCAweEJELCAvKiAweEQ0LTB4RDcgKi8KKwkweDk1LCAweDc0LCAweDkwLCAweEU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDgxLCAweDU3LCAweDk4LCAweEJFLCAweDk4LCAweEMwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweEVELCAweDRELCAweDAwLCAweDAwLCAweDkxLCAweEUzLCAvKiAweEUwLTB4RTMgKi8KKwkweDk3LCAweERGLCAweDg4LCAweEM4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDk4LCAweEJGLCAweDg5LCAweEJDLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDhCLCAweEMyLCAweDAwLCAweDAwLCAweDkyLCAweDg3LCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhDLCAweDhGLCAweDk4LCAweEMxLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk0LCAweDQzLCAvKiAweEY4LTB4RkIgKi8KKwkweEVELCAweDRFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY180Rls1MTJdID0geworCTB4RUQsIDB4NEYsIDB4OEEsIDB4RTksIDB4MDAsIDB4MDAsIDB4RUQsIDB4NTAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4OTgsIDB4QzIsIDB4ODgsIDB4QzksIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4OEMsIDB4REUsIDB4OEEsIDB4RUEsIDB4OTUsIDB4OUEsIC8qIDB4MEMtMHgwRiAqLworCTB4OTQsIDB4QjAsIDB4OEIsIDB4NzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4RUYsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4OTgsIDB4RTUsIDB4OTMsIDB4NjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTQsIDB4OEMsIC8qIDB4MkMtMHgyRiAqLworCTB4OTgsIDB4QzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4OTQsIDB4QkEsIDB4MDAsIDB4MDAsIDB4OTcsIDB4RTAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4OTAsIDB4NEMsIDB4RUQsIDB4NTEsIDB4OEUsIDB4NjYsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4OEUsIDB4OTcsIDB4ODksIDB4QkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4Q0YsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4NDEsIDB4OTgsIDB4QzgsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4ODgsIDB4Q0EsIDB4OTIsIDB4RTEsIDB4OEYsIDB4NUEsIC8qIDB4NEMtMHg0RiAqLworCTB4OEQsIDB4QjIsIDB4OTcsIDB4NDMsIDB4MDAsIDB4MDAsIDB4OTEsIDB4Q0MsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4ODksIDB4QkQsIDB4RUQsIDB4NTIsIDB4OTgsIDB4QzcsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4OTcsIDB4NUQsIDB4OTgsIDB4QzMsIDB4OTgsIDB4QzUsIC8qIDB4NTgtMHg1QiAqLworCTB4OEQsIDB4RUMsIDB4OTgsIDB4QzYsIDB4OUIsIDB4NDMsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4OTgsIDB4Q0UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTgsIDB4RDEsIC8qIDB4NkMtMHg2RiAqLworCTB4OTgsIDB4Q0YsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4QzAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4OTUsIDB4QjksIDB4OTgsIDB4QzksIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTgsIDB4Q0QsIC8qIDB4NzgtMHg3QiAqLworCTB4OEMsIDB4RjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEUsIDB4NjcsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEEsIDB4QTQsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTgsIDB4RDIsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4OTgsIDB4Q0EsIDB4MDAsIDB4MDAsIDB4RUQsIDB4NTQsIDB4OTcsIDB4RTEsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4OEUsIDB4OTgsIDB4MDAsIDB4MDAsIDB4OTgsIDB4Q0IsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4OTgsIDB4RDAsIDB4RUQsIDB4NTMsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4RUQsIDB4NTYsIDB4MDAsIDB4MDAsIDB4OTgsIDB4RDMsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4OTgsIDB4Q0MsIDB4MDAsIDB4MDAsIDB4RUQsIDB4NTUsIDB4OEIsIDB4OUYsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4ODgsIDB4Q0IsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4OEIsIDB4QTAsIDB4ODksIDB4QkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUIsIDB4NDQsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4OTYsIDB4OTksIDB4OTUsIDB4OEUsIDB4OEMsIDB4RjIsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4OTAsIDB4NEUsIDB4OTcsIDB4QjUsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTUsIDB4RDYsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEMsIDB4NTcsIDB4OTEsIDB4QTMsIC8qIDB4QzAtMHhDMyAqLworCTB4ODksIDB4RTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4RUQsIDB4NDUsIDB4OEYsIDB4NzIsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4RUQsIDB4NTcsIDB4OTgsIDB4RDcsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4OTgsIDB4REMsIDB4OTgsIDB4REEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4OTgsIDB4RDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTEsIDB4QUQsIC8qIDB4RDQtMHhENyAqLworCTB4OTgsIDB4RDgsIDB4MDAsIDB4MDAsIDB4OTgsIDB4REIsIDB4OTgsIDB4RDksIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4OTUsIDB4REIsIDB4MDAsIDB4MDAsIDB4OTgsIDB4RDYsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4OTAsIDB4NEQsIDB4MDAsIDB4MDAsIDB4OTYsIDB4OTMsIC8qIDB4RTAtMHhFMyAqLworCTB4OTgsIDB4REQsIDB4OTgsIDB4REUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEYsIDB4NDMsIDB4OTgsIDB4RUIsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTQsIDB4NkYsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4OTUsIDB4NTUsIDB4OTgsIDB4RTYsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4OTUsIDB4RUUsIDB4MDAsIDB4MDAsIDB4ODksIDB4QjQsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTgsIDB4RUEsIDB4RUQsIDB4NUEsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzUwWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHg5OCwgMHhFNCwgMHg5OCwgMHhFRCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHg5MSwgMHg3MSwgMHgwMCwgMHgwMCwgMHg4QywgMHhDMiwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHg5NCwgMHg3QiwgMHgwMCwgMHgwMCwgMHhFMCwgMHhDNSwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHg5OCwgMHhFQywgMHg5MywgMHg3QywgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHg5OCwgMHhFMSwgMHgwMCwgMHgwMCwgMHg4QywgMHhGNCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHg4QywgMHhGMywgMHg5OCwgMHhERiwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHg1QiwgMHg4RSwgMHhEOCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHg5OCwgMHhFNywgMHhFRCwgMHg1OSwgMHg5NSwgMHhFRCwgLyogMHgyMC0weDIzICovCisJMHg5MiwgMHg2QywgMHg5OCwgMHhFMywgMHg4QywgMHg5MSwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHg5OCwgMHhFMCwgMHg5OCwgMHhFOCwgMHg5OCwgMHhFMiwgMHg5NywgMHhDRiwgLyogMHgyOC0weDJCICovCisJMHg5OCwgMHhFOSwgMHg5OCwgMHg2MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QiwgMHhFNCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHg4QywgMHg5MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHhFRCwgMHg1OCwgMHgwMCwgMHgwMCwgMHhFRCwgMHg1RSwgMHg5OCwgMHhFRSwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHg1QywgMHg5OCwgMHhFRiwgLyogMHg0NC0weDQ3ICovCisJMHg5OCwgMHhGMywgMHg4OCwgMHhDQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NSwgMHhDRSwgLyogMHg0Qy0weDRGICovCisJMHg5OCwgMHhGMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHg5OCwgMHhGMSwgMHg5OCwgMHhGNSwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OCwgMHhGNCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHg5MiwgMHhFMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHg4QywgMHg5MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHg5OCwgMHhGNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHhFRCwgMHg1RCwgMHgwMCwgMHgwMCwgMHg4RSwgMHhDMywgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHg5MSwgMHhBNCwgMHg5MiwgMHhFMywgMHg4QiwgMHhGNCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHg5OCwgMHhGNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHg4QiwgMHg1NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHg5OCwgMHhGOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHg5OCwgMHhGQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHg5NiwgMHg1NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHg4QywgMHg4NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHhFRCwgMHg1RiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHg4RSwgMHg1MCwgMHg5NCwgMHhGNSwgMHg5OCwgMHhGOSwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHg4RCwgMHhDMywgMHg5NywgMHg2MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OCwgMHhGQywgMHg5OSwgMHg0MiwgLyogMHhCMC0weEIzICovCisJMHg5OCwgMHhGQiwgMHg4RCwgMHhDMiwgMHgwMCwgMHgwMCwgMHg4RiwgMHg5RCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QywgMHg1OCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OSwgMHg0MywgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHg4QiwgMHhDRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHg5OSwgMHg0MCwgMHg5OSwgMHg0MSwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHg5MywgMHhBRCwgMHgwMCwgMHgwMCwgMHg5MSwgMHg5QywgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHg4QiwgMHhBMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHg5NiwgMHg2QywgMHg5OSwgMHg0NCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHhFRCwgMHg2MSwgMHgwMCwgMHgwMCwgMHg5NywgMHhCQiwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OSwgMHg0NSwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OSwgMHg0OCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHg5OSwgMHg0NiwgMHgwMCwgMHgwMCwgMHg5MSwgMHg2RCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHg5OSwgMHg0NywgMHg5OSwgMHg0OSwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHhFRCwgMHg2MCwgMHg5OSwgMHg0QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHg5OSwgMHg0QSwgMHgwMCwgMHgwMCwgMHg5NSwgMHhDNiwgLyogMHhGOC0weEZCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNTFbNTEyXSA9IHsKKwkweDhCLCAweDU2LCAweDk5LCAweDRELCAweDk5LCAweDRFLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDg5LCAweEFELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDk5LCAweDRDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhFLCAweEYyLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDk5LCAweDUxLCAweDk5LCAweDUwLCAweDk5LCAweDRGLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDk4LCAweEQ0LCAweDAwLCAweDAwLCAweDk5LCAweDUyLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhGLCAweDlFLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDk5LCAweDUzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk3LCAweDQ0LCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk2LCAweEQ3LCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk5LCAweDU1LCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk5LCAweDU0LCAweDk5LCAweDU3LCAvKiAweDM4LTB4M0IgKi8KKwkweDk5LCAweDU2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk5LCAweDU4LCAvKiAweDNDLTB4M0YgKi8KKwkweDk5LCAweDU5LCAweDg4LCAweEYyLCAweDAwLCAweDAwLCAweDhDLCAweEIzLCAvKiAweDQwLTB4NDMgKi8KKwkweDhDLCAweDVBLCAweDhGLCAweDVCLCAweDkyLCAweDlCLCAweDhCLCAweEEyLCAvKiAweDQ0LTB4NDcgKi8KKwkweDkwLCAweEU2LCAweDhDLCAweEY1LCAweEVELCAweDYyLCAweDhELCAweDhFLCAvKiAweDQ4LTB4NEIgKi8KKwkweDk5LCAweDVCLCAweDk2LCAweEM2LCAweDkzLCAweDY1LCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDhFLCAweDk5LCAweDAwLCAweDAwLCAweDk5LCAweDVBLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDk5LCAweDVDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkzLCAweDdELCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDhBLCAweDk1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk5LCAweDVELCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweEVELCAweDYzLCAweDkzLCAweEZDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDkxLCAweDUzLCAweDk5LCAweDVGLCAweDk5LCAweDYwLCAweDk0LCAweEFBLCAvKiAweDY4LTB4NkIgKi8KKwkweDhDLCAweEY2LCAweDk4LCAweDVBLCAweDk5LCAweDYxLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDhCLCAweEE0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDk1LCAweEJBLCAweDkxLCAweEI0LCAweDhCLCAweEVGLCAvKiAweDc0LTB4NzcgKi8KKwkweDkzLCAweDU0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDhDLCAweDkzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDk5LCAweDYyLCAweDAwLCAweDAwLCAweDk5LCAweDYzLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDkzLCAweEUwLCAweDg5LCAweDdFLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDk5LCAweDY2LCAweDhELCAweEZCLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDk5LCAweDY1LCAweDhELCAweEM0LCAweDAwLCAweDAwLCAweDk5LCAweDY3LCAvKiAweDhDLTB4OEYgKi8KKwkweEUzLCAweEVDLCAweDk5LCAweDY4LCAweDk2LCAweDYwLCAweDk5LCAweDY5LCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDk5LCAweDZBLCAweDk5LCAweDZCLCAweDhGLCAweEU3LCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDhFLCAweENBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweEVELCAweDY0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDhBLCAweEE1LCAweDAwLCAweDAwLCAweDk5LCAweDZFLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDk5LCAweDZDLCAweDk2LCAweEJCLCAweDk5LCAweDZELCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDk1LCAweDc5LCAweDk5LCAweDZGLCAweDk5LCAweDcwLCAweDk5LCAweDcxLCAvKiAweEE4LTB4QUIgKi8KKwkweDkzLCAweDdFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDk5LCAweDc1LCAweDk5LCAweDczLCAweDk5LCAweDc0LCAweDk5LCAweDcyLCAvKiAweEIwLTB4QjMgKi8KKwkweDhELCAweEUxLCAweDk5LCAweDc2LCAweDk2LCAweEU4LCAweDk3LCAweEUyLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDk5LCAweDc3LCAweEVELCAweDY1LCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDkwLCAweEE2LCAweDk5LCAweDc4LCAweDhGLCAweDc5LCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDk5LCAweDc5LCAweDAwLCAweDAwLCAweDkyLCAweDlDLCAvKiAweEM4LTB4Q0IgKi8KKwkweDk3LCAweEJELCAweDkzLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk5LCAweEMzLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk5LCAweDdBLCAvKiAweEQ4LTB4REIgKi8KKwkweEVBLCAweEEzLCAweDhCLCAweEMzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDk5LCAweDdCLCAweDk2LCAweDdELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhGLCAweDg4LCAweDkxLCAweEZBLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDk5LCAweDdELCAweDkzLCAweEUyLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweEVELCAweDY2LCAweDk5LCAweDdFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDk5LCAweDgwLCAweDhBLCAweDRELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDk5LCAweDgxLCAweDhCLCAweEE1LCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDkzLCAweENBLCAweDg5LCAweDlBLCAweDhGLCAweDZGLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDk0LCAweDlGLCAweDk5LCAweDgyLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181Mls1MTJdID0geworCTB4OTMsIDB4ODEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTAsIDB4NkUsIC8qIDB4MDAtMHgwMyAqLworCTB4OTksIDB4ODMsIDB4MDAsIDB4MDAsIDB4OTUsIDB4QUEsIDB4OTAsIDB4RDgsIC8qIDB4MDQtMHgwNyAqLworCTB4OEEsIDB4QTAsIDB4MDAsIDB4MDAsIDB4OEEsIDB4QTcsIDB4OTksIDB4ODQsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTksIDB4ODYsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4OEMsIDB4NTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4OTksIDB4ODUsIDB4RUQsIDB4NjcsIDB4MDAsIDB4MDAsIDB4OTcsIDB4RjEsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4OEYsIDB4ODksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4OTQsIDB4QkIsIDB4OTUsIDB4Q0EsIDB4MDAsIDB4MDAsIDB4OTksIDB4ODcsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4OTcsIDB4OTgsIDB4OTksIDB4ODgsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTksIDB4ODksIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4OTMsIDB4OUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTksIDB4OEEsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTAsIDB4QTcsIDB4OEQsIDB4RkMsIC8qIDB4MzQtMHgzNyAqLworCTB4OEMsIDB4OTQsIDB4OTksIDB4OEIsIDB4OEUsIDB4NjgsIDB4OEQsIDB4OEYsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4RTQsIC8qIDB4NDAtMHg0MyAqLworCTB4OTksIDB4OEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTEsIDB4QTUsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEQsIDB4RUQsIDB4OTksIDB4OEUsIC8qIDB4NDgtMHg0QiAqLworCTB4OTksIDB4OEYsIDB4OTEsIDB4NEYsIDB4MDAsIDB4MDAsIDB4OTksIDB4OEMsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4OTksIDB4OTEsIDB4MDAsIDB4MDAsIDB4OTYsIDB4NTUsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEQsIDB4ODQsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEMsIDB4OTUsIC8qIDB4NjAtMHg2MyAqLworCTB4OEQsIDB4REMsIDB4OTQsIDB4OEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4OTksIDB4OTQsIDB4OTksIDB4OTIsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTUsIDB4OUIsIC8qIDB4NkMtMHg2RiAqLworCTB4OEYsIDB4RTgsIDB4OTksIDB4OUIsIDB4OEEsIDB4ODQsIDB4OTksIDB4OTUsIC8qIDB4NzAtMHg3MyAqLworCTB4OTksIDB4OTMsIDB4OTEsIDB4NkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4OTksIDB4OTcsIDB4MDAsIDB4MDAsIDB4OTksIDB4OTYsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEEsIDB4NjMsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEMsIDB4ODAsIC8qIDB4ODQtMHg4NyAqLworCTB4OTksIDB4OUMsIDB4OTcsIDB4QUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4OTksIDB4OTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4OTksIDB4OUQsIDB4OTksIDB4OUEsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4OTksIDB4OTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTcsIDB4Q0QsIC8qIDB4OTgtMHg5QiAqLworCTB4RUQsIDB4NjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEMsIDB4RjcsIC8qIDB4OUMtMHg5RiAqLworCTB4ODksIDB4QzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTcsIDB4RjIsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4NjksIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4OEYsIDB4OTUsIDB4OTMsIDB4NzcsIDB4OEQsIDB4ODUsIC8qIDB4QTgtMHhBQiAqLworCTB4OTksIDB4QTAsIDB4OTksIDB4QTEsIDB4MDAsIDB4MDAsIDB4RUUsIDB4NUIsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4OTcsIDB4RTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4OTgsIDB4NEEsIDB4OTksIDB4QTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4OEMsIDB4RjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4OTksIDB4QTIsIDB4MDAsIDB4MDAsIDB4OEEsIDB4NEUsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4RUQsIDB4NkEsIDB4OTksIDB4QTQsIDB4MDAsIDB4MDAsIDB4OTYsIDB4NzUsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4OTIsIDB4QkEsIDB4MDAsIDB4MDAsIDB4OTcsIDB4NDUsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4OTUsIDB4RDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4OTksIDB4QTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4RDMsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4OTMsIDB4QUUsIDB4MDAsIDB4MDAsIDB4OTksIDB4QTYsIC8qIDB4RDQtMHhENyAqLworCTB4OEEsIDB4QTgsIDB4OTYsIDB4QjEsIDB4MDAsIDB4MDAsIDB4RUQsIDB4NkIsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4OEYsIDB4OUYsIDB4OTksIDB4QTcsIDB4OTUsIDB4RTUsIC8qIDB4REMtMHhERiAqLworCTB4OTksIDB4QUIsIDB4MDAsIDB4MDAsIDB4OTAsIDB4QTgsIDB4OTksIDB4QTgsIC8qIDB4RTAtMHhFMyAqLworCTB4OEIsIDB4Q0UsIDB4MDAsIDB4MDAsIDB4OTksIDB4QTksIDB4OEEsIDB4QTksIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEMsIDB4NEQsIDB4OTksIDB4QUMsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4OTksIDB4QUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4OTksIDB4QUUsIDB4OTksIDB4QUYsIDB4OEUsIDB4RDksIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEMsIDB4RjksIDB4OTYsIDB4REMsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzUzWzUxMl0gPSB7CisJMHhFRCwgMHg2QywgMHg5NiwgMHhFNiwgMHg5MywgMHhGNSwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHg5NSwgMHhFRiwgMHg5OSwgMHhCMCwgMHhFRCwgMHg2RCwgLyogMHgwNC0weDA3ICovCisJMHg5OSwgMHhCMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHg5OSwgMHhCMywgMHgwMCwgMHgwMCwgMHg5OSwgMHhCNSwgLyogMHgwQy0weDBGICovCisJMHg5OSwgMHhCNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHg5OSwgMHhCNiwgMHg4OSwgMHhCQiwgMHg5NiwgMHg2QiwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHg4RCwgMHhGQSwgMHg5OSwgMHhCNywgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHg5MSwgMHg3OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHg4RiwgMHhBMCwgMHg4QiwgMHhBNywgMHgwMCwgMHgwMCwgMHg5OSwgMHhCOCwgLyogMHgyMC0weDIzICovCisJMHhFRCwgMHg2RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NCwgMHhEOSwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OSwgMHhCOSwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHg5OSwgMHhCQSwgMHgwMCwgMHgwMCwgMHg5OSwgMHhCQiwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHg5OSwgMHhCQywgMHg5NSwgMHg0MywgMHg4QiwgMHhFNiwgMHg4OCwgMHhFMywgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MywgMHhCRCwgLyogMHgzQy0weDNGICovCisJMHg5OSwgMHhCRCwgMHg4RiwgMHg1QywgMHgwMCwgMHgwMCwgMHg5MCwgMHhFNywgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHg5OSwgMHhCRiwgMHg5OSwgMHhCRSwgMHg4RiwgMHhBMSwgLyogMHg0NC0weDQ3ICovCisJMHg4QywgMHhERiwgMHg5OSwgMHhDMSwgMHg5NCwgMHhCQywgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHg5OSwgMHhDMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHg5NCwgMHhEQSwgMHg5MSwgMHhCMiwgMHg5MSwgMHhFQywgLyogMHg1MC0weDUzICovCisJMHg4QiwgMHhBNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MywgMHhFQywgLyogMHg1NC0weDU3ICovCisJMHg5MiwgMHg1MCwgMHgwMCwgMHgwMCwgMHg5NCwgMHg4RSwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHg5NiwgMHg2RCwgMHgwMCwgMHgwMCwgMHg5OSwgMHhDNCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHg5MCwgMHhFOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QywgMHg1NCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHg5OSwgMHhDNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OSwgMHhDNiwgMHg4OSwgMHg0QiwgLyogMHg2Qy0weDZGICovCisJMHg4OCwgMHhGMywgMHg4QSwgMHhFQiwgMHhFRCwgMHg2RiwgMHg5MSwgMHhBNiwgLyogMHg3MC0weDczICovCisJMHg4QiwgMHg3MCwgMHg5NywgMHg5MSwgMHgwMCwgMHgwMCwgMHg5OSwgMHhDOSwgLyogMHg3NC0weDc3ICovCisJMHg4OSwgMHhCNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OSwgMHhDOCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QiwgMHhBOCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OSwgMHhDQSwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHg5NiwgMHhFRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHg3MCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OSwgMHhDQiwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHg5NywgMHhEMCwgMHgwMCwgMHgwMCwgMHg4QywgMHhGQSwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QywgMHhCNCwgLyogMHg5Qy0weDlGICovCisJMHg5OSwgMHhDQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHg5OSwgMHhDRSwgMHg5OSwgMHhDRCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHg5MCwgMHg3RSwgMHg4OSwgMHg1OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHg4OSwgMHg3RCwgMHg5OSwgMHhDRiwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHg5OSwgMHhEMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHg3MSwgMHg4QywgMHhCNSwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OSwgMHhEMSwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QiwgMHg4RSwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RSwgMHg1MSwgMHg5OSwgMHhEMiwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHg5NiwgMHg5NCwgMHg4RCwgMHhCMywgMHg4QiwgMHg3OSwgMHg5NywgMHg0NiwgLyogMHhDOC0weENCICovCisJMHg5MSwgMHg2RiwgMHg5NCwgMHhCRCwgMHg4RSwgMHhGQiwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHg4RiwgMHg2NiwgMHgwMCwgMHgwMCwgMHg4RSwgMHhFNiwgMHg4RSwgMHhGMywgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHg4RiwgMHg5NiwgMHgwMCwgMHgwMCwgMHg5NCwgMHhCRSwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHhFRCwgMHg3MiwgMHgwMCwgMHgwMCwgMHg5OSwgMHhENSwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHg4OSwgMHg2MiwgMHg5MSwgMHg3MCwgMHg4QywgMHhGQiwgLyogMHhFMC0weEUzICovCisJMHg4QywgMHhDMywgMHg4QiwgMHhFNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHg5OSwgMHhEOSwgMHg5MiwgMHg0MCwgMHg5MSwgMHhGQywgMHg4QiwgMHhBOSwgLyogMHhFOC0weEVCICovCisJMHg4RiwgMHhBMiwgMHg5OSwgMHhEQSwgMHg5OSwgMHhEOCwgMHg4OSwgMHhDMiwgLyogMHhFQy0weEVGICovCisJMHg5MSwgMHhFNCwgMHg4RSwgMHhCNiwgMHg4RSwgMHg2QSwgMHg4OSwgMHg0NSwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QSwgMHg5MCwgMHg4RCwgMHg4NiwgLyogMHhGNC0weEY3ICovCisJMHg4RSwgMHg2OSwgMHgwMCwgMHgwMCwgMHg5OSwgMHhEQiwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNTRbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDk5LCAweERDLCAweDAwLCAweDAwLCAweDhCLCAweDY4LCAvKiAweDAwLTB4MDMgKi8KKwkweDhBLCAweDY1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDhELCAweDg3LCAweDhCLCAweDY3LCAweDkyLCAweERELCAweDg5LCAweDQ0LCAvKiAweDA4LTB4MEIgKi8KKwkweDkzLCAweEFGLCAweDk2LCAweEJDLCAweDhELCAweDQwLCAweDk3LCAweDk5LCAvKiAweDBDLTB4MEYgKi8KKwkweDkzLCAweDY2LCAweDhDLCAweEZDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhDLCAweDRFLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDk5LCAweEU1LCAweDAwLCAweDAwLCAweDhCLCAweEUxLCAvKiAweDFDLTB4MUYgKi8KKwkweDk2LCAweDY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk0LCAweERCLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDk5LCAweEU0LCAweDAwLCAweDAwLCAweDhBLCAweERDLCAvKiAweDI4LTB4MkIgKi8KKwkweDk5LCAweERGLCAweDk5LCAweEUwLCAweDk5LCAweEUyLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk5LCAweEUzLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDhCLCAweDdBLCAweDkwLCAweDgxLCAweDAwLCAweDAwLCAweDk1LCAweEFCLCAvKiAweDM4LTB4M0IgKi8KKwkweDk5LCAweEUxLCAweDk5LCAweERELCAweDhDLCAweEUxLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDk5LCAweERFLCAweDAwLCAweDAwLCAweDk4LCAweDQzLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk1LCAweEYwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDkyLCAweEU2LCAweDhDLCAweEUwLCAweDhELCAweDkwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk5LCAweEU2LCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDkzLCAweERCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk5LCAweEVBLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDhFLCAweEZDLCAweDAwLCAweDAwLCAweDhFLCAweEY0LCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDk5LCAweEVELCAweDk5LCAweEVCLCAweDAwLCAweDAwLCAweDk2LCAweEExLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDk5LCAweEU4LCAweDk5LCAweEYxLCAweDk5LCAweEVDLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk5LCAweEVGLCAvKiAweDc4LTB4N0IgKi8KKwkweDhDLCAweEM0LCAweDk2LCAweEJELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDk5LCAweEYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDk5LCAweEYyLCAweDAwLCAweDAwLCAweDk5LCAweEY0LCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweDc1LCAweDhELCAweEVFLCAvKiAweDg4LTB4OEIgKi8KKwkweDk4LCAweDYxLCAweDAwLCAweDAwLCAweDk5LCAweEU5LCAweDk5LCAweEU3LCAvKiAweDhDLTB4OEYgKi8KKwkweDk5LCAweEYzLCAweDAwLCAweDAwLCAweDk5LCAweEVFLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweEVELCAweDc0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk5LCAweEY2LCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDlBLCAweDQyLCAweDk5LCAweEY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDk5LCAweEZDLCAweEVELCAweDc2LCAweDAwLCAweDAwLCAweDlBLCAweDQwLCAvKiAweEE4LTB4QUIgKi8KKwkweDk5LCAweEY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlBLCAweDVELCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhELCAweEU3LCAweDhBLCAweDUwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDk5LCAweEY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDlBLCAweDQ0LCAweDg4LCAweEY0LCAweDlBLCAweDQzLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDg4LCAweEEzLCAweDk1LCAweDY5LCAweDlBLCAweDQxLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDk5LCAweEZBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk5LCAweEY1LCAvKiAweEM0LTB4QzcgKi8KKwkweDk5LCAweEZCLCAweDhELCAweEM2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDlBLCAweDQ1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDg4LCAweEY1LCAweDlBLCAweDRFLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDlBLCAweDQ2LCAweDlBLCAweDQ3LCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDhGLCAweEEzLCAweDk2LCAweDg5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDlBLCAweDRDLCAweDlBLCAweDRCLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkzLCAweDRFLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlBLCAweDRELCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDlBLCAweDRBLCAweDAwLCAweDAwLCAweEVELCAweDc3LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181NVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4ODksIDB4NTMsIDB4MDAsIDB4MDAsIDB4OEQsIDB4QjQsIDB4OTAsIDB4NEYsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUEsIDB4NDgsIC8qIDB4MEMtMHgwRiAqLworCTB4OTMsIDB4ODIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4OUEsIDB4NDksIDB4MDAsIDB4MDAsIDB4ODgsIDB4QTAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUEsIDB4NTMsIDB4OTcsIDB4NDIsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4OEYsIDB4QTUsIDB4MDAsIDB4MDAsIDB4OUEsIDB4NTksIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4OUEsIDB4NTgsIDB4OUEsIDB4NEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTEsIDB4QzEsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4OUEsIDB4NTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4OTEsIDB4RUQsIDB4OUEsIDB4NTUsIDB4OEYsIDB4QTQsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4OUEsIDB4NTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTYsIDB4RTIsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEMsIDB4NUIsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUEsIDB4NTYsIDB4OUEsIDB4NTcsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4OUEsIDB4NTQsIDB4OUEsIDB4NUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUEsIDB4NTEsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUEsIDB4NjAsIC8qIDB4NzgtMHg3QiAqLworCTB4OUEsIDB4NjUsIDB4MDAsIDB4MDAsIDB4OUEsIDB4NjEsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4OUEsIDB4NUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUEsIDB4NjYsIC8qIDB4ODAtMHg4MyAqLworCTB4OTEsIDB4NTAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4NzgsIDB4OUEsIDB4NjgsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4OEQsIDB4NDEsIDB4OUEsIDB4NUUsIDB4OTIsIDB4OUQsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4OUEsIDB4NjIsIDB4OUEsIDB4NUIsIDB4OEEsIDB4QUIsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4OEEsIDB4RUMsIDB4OEEsIDB4ODUsIDB4OUEsIDB4NjMsIDB4OUEsIDB4NUYsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEMsIDB4OTYsIC8qIDB4QTQtMHhBNyAqLworCTB4OUEsIDB4NjksIDB4OUEsIDB4NjcsIDB4OTEsIDB4NzIsIDB4OEIsIDB4NjksIC8qIDB4QTgtMHhBQiAqLworCTB4OEIsIDB4QUEsIDB4MDAsIDB4MDAsIDB4OUEsIDB4NjQsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4OEIsIDB4RjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4NjMsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4OUEsIDB4NkQsIDB4OUEsIDB4NkIsIDB4MDAsIDB4MDAsIDB4OUEsIDB4QTUsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4OUEsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUEsIDB4NkEsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4OUEsIDB4NkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUEsIDB4NkMsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEUsIDB4NkIsIC8qIDB4RTAtMHhFMyAqLworCTB4OUEsIDB4NkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUEsIDB4NzIsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4OUEsIDB4NzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4OUEsIDB4NzUsIDB4OUEsIDB4NzQsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzU2WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHg1MSwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHg4OSwgMHhDMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHg5QSwgMHg3MSwgMHgwMCwgMHgwMCwgMHg5QSwgMHg3MywgMHg4RiwgMHhBNiwgLyogMHgxNC0weDE3ICovCisJMHg4OSwgMHg1MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QSwgMHg3NiwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHg4OSwgMHhEQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QSwgMHg4MiwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHg4RiwgMHhGQSwgMHg5QSwgMHg3RCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHg5QSwgMHg3QiwgMHgwMCwgMHgwMCwgMHg5QSwgMHg3QywgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHg5QSwgMHg3RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OSwgMHg1QywgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHg5MSwgMHg1OCwgMHgwMCwgMHgwMCwgMHg5QSwgMHg3OCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHg5QSwgMHg3OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QSwgMHg5QSwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHg5QSwgMHg4MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHg4QSwgMHhFRCwgMHgwMCwgMHgwMCwgMHg5QSwgMHg4NCwgMHg5QSwgMHg4MCwgLyogMHg2OC0weDZCICovCisJMHg5QSwgMHg4MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHg5NSwgMHhBQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHg5MywgMHhEMywgMHgwMCwgMHgwMCwgMHg5NCwgMHhCNiwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHg5QSwgMHg4NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QSwgMHg4NSwgMHg4QSwgMHg2NCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QSwgMHg4NywgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QSwgMHg4QSwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHg5QSwgMHg4OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHg5QSwgMHg4OCwgMHgwMCwgMHgwMCwgMHg5NCwgMHg1OCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHg5QSwgMHg4QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QSwgMHg4QywgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHg5QSwgMHg4RSwgMHgwMCwgMHgwMCwgMHg5QSwgMHg4RCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHg5QSwgMHg5MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHg5QSwgMHg5MywgMHg5QSwgMHg5MSwgMHg5QSwgMHg4RiwgMHg5QSwgMHg5MiwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHg5QSwgMHg5NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QSwgMHg5NSwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHg5QSwgMHg5NiwgMHgwMCwgMHgwMCwgMHg5QSwgMHg5NywgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QSwgMHg5OCwgLyogMHhENC0weEQ3ICovCisJMHg5OSwgMHg2NCwgMHgwMCwgMHgwMCwgMHg4RSwgMHhGQSwgMHg4RSwgMHg2QywgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OSwgMHhGMSwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHg4OCwgMHhGNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHg2MywgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QSwgMHg5OSwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHg4RCwgMHhBMiwgMHgwMCwgMHgwMCwgMHg4OCwgMHhDRCwgMHg5MCwgMHg3RCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHg5QSwgMHg5QSwgMHg4QywgMHhDNSwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHg4RCwgMHg5MSwgMHgwMCwgMHgwMCwgMHg5QSwgMHg5QywgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNTdbNTEyXSA9IHsKKwkweDlBLCAweDlCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk1LCAweERFLCAvKiAweDAwLTB4MDMgKi8KKwkweDlBLCAweDlELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDlBLCAweDlGLCAweDlBLCAweDlFLCAweDAwLCAweDAwLCAweDlBLCAweEEwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDlBLCAweEExLCAweDAwLCAweDAwLCAweDhDLCAweDk3LCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg5LCAweDgwLCAweDlBLCAweEEyLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlBLCAweEE0LCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDlBLCAweEEzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDlBLCAweEE2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkzLCAweDc5LCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlBLCAweEE3LCAweDg4LCAweEIzLCAvKiAweDI0LTB4MjcgKi8KKwkweDhELCAweERELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDhDLCAweDVDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDkyLCAweDZFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlBLCAweEE4LCAvKiAweDM0LTB4MzcgKi8KKwkweDlBLCAweEE5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlBLCAweEFCLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDlBLCAweEFDLCAweDAwLCAweDAwLCAweDhELCAweEUyLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhCLCAweENGLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk2LCAweDU2LCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlBLCAweEFBLCAweDlBLCAweEFELCAvKiAweDRDLTB4NEYgKi8KKwkweDhELCAweEJGLCAweDhELCAweDQyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweEVELCAweDc5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDlBLCAweEIxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDhELCAweEEzLCAweEVELCAweDdBLCAweDkyLCAweDUyLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDlBLCAweEFFLCAweDkyLCAweEQ4LCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlBLCAweEIyLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkwLCAweDgyLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDlBLCAweEIwLCAweDlBLCAweEIzLCAweDAwLCAweDAwLCAweDhDLCAweDVFLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlBLCAweEI0LCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDlBLCAweEI1LCAweDAwLCAweDAwLCAweDhELCAweDQzLCAweDhBLCAweDVGLCAvKiAweEEwLTB4QTMgKi8KKwkweDlBLCAweEI3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlBLCAweEI4LCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweEVELCAweDdCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDlBLCAweEI5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlBLCAweEI2LCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDlBLCAweEFGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlBLCAweEJBLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlBLCAweEJCLCAweEVELCAweDdELCAvKiAweEM0LTB4QzcgKi8KKwkweEVELCAweDdDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk2LCAweDg0LCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhGLCAweEU5LCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlBLCAweEJELCAweDlBLCAweEJFLCAvKiAweEQwLTB4RDMgKi8KKwkweDlBLCAweEJDLCAweDAwLCAweDAwLCAweDlBLCAweEMwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDk0LCAweDU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg4LCAweEU2LCAvKiAweERDLTB4REYgKi8KKwkweDk1LCAweDc1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlBLCAweEMxLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDhGLCAweEZCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhFLCAweEI3LCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDk0LCAweDdDLCAweDhBLCAweEVFLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDhELCAweEU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181OFs1MTJdID0geworCTB4OTYsIDB4NzgsIDB4MDAsIDB4MDAsIDB4OTMsIDB4QjAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4OEMsIDB4OTgsIDB4OTEsIDB4Q0QsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUEsIDB4QkYsIDB4OUEsIDB4QzIsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4OTEsIDB4QzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4OUEsIDB4QzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4OUEsIDB4QzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4OUEsIDB4QzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4OTIsIDB4RTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEEsIDB4QUMsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4OUYsIC8qIDB4MkMtMHgyRiAqLworCTB4ODksIDB4ODEsIDB4OTUsIDB4RjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4OEYsIDB4RUEsIDB4OTMsIDB4NjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEQsIDB4RTQsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4OUEsIDB4Q0MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4OTUsIDB4QkIsIDB4OTcsIDB4REIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4RjIsIDB4OUEsIDB4QzgsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4OTEsIDB4NTksIDB4OUEsIDB4Q0IsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4OTMsIDB4ODMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTMsIDB4NjgsIC8qIDB4NTQtMHg1NyAqLworCTB4OTMsIDB4ODQsIDB4OTQsIDB4QjcsIDB4OTIsIDB4Q0IsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEQsIDB4QzcsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUEsIDB4QzcsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4ODksIDB4OTYsIDB4MDAsIDB4MDAsIDB4OTMsIDB4NTUsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4OUEsIDB4QzksIDB4MDAsIDB4MDAsIDB4OUEsIDB4QzUsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4OTAsIDB4NkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4OUEsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEYsIDB4NkQsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEIsIDB4QUIsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4OUEsIDB4Q0UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTUsIDB4RTYsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTEsIDB4OUQsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4OTIsIDB4QzQsIDB4MDAsIDB4MDAsIDB4RUQsIDB4ODEsIDB4OUEsIDB4RDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4OTYsIDB4NkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUEsIDB4RDEsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUEsIDB4RDYsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4ODIsIDB4OTUsIDB4QUQsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4OUEsIDB4RDUsIDB4OUEsIDB4Q0YsIDB4OUEsIDB4RDIsIDB4OUEsIDB4RDQsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEQsIDB4QTQsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4OTUsIDB4QzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4OUEsIDB4RDcsIDB4MDAsIDB4MDAsIDB4OTIsIDB4NjQsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4RjMsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4OEYsIDB4RUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4OUEsIDB4RDksIDB4MDAsIDB4MDAsIDB4OUEsIDB4RDgsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4OEQsIDB4ODgsIDB4MDAsIDB4MDAsIDB4OUEsIDB4REEsIC8qIDB4RDQtMHhENyAqLworCTB4OUEsIDB4REMsIDB4OUEsIDB4REIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4OUEsIDB4REUsIDB4MDAsIDB4MDAsIDB4OUEsIDB4RDMsIDB4OUEsIDB4RTAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4OUEsIDB4REYsIDB4OUEsIDB4REQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEUsIDB4NkQsIC8qIDB4RTgtMHhFQiAqLworCTB4OTAsIDB4NzAsIDB4MDAsIDB4MDAsIDB4OTEsIDB4NzMsIDB4OUEsIDB4RTEsIC8qIDB4RUMtMHhFRiAqLworCTB4OTAsIDB4QkEsIDB4ODgsIDB4RUIsIDB4OTQsIDB4ODQsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4RDksIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4OUEsIDB4RTMsIDB4OUEsIDB4RTIsIDB4OUEsIDB4RTQsIC8qIDB4RjgtMHhGQiAqLworCTB4OUEsIDB4RTUsIDB4OUEsIDB4RTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzU5WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QSwgMHhFNywgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHg5NSwgMHhDRiwgMHg5QSwgMHhFOCwgMHhFRCwgMHg4MywgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OSwgMHhDNCwgLyogMHgwQy0weDBGICovCisJMHg5QSwgMHhFOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHg5NywgMHg1QiwgMHg4QSwgMHg0RiwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHg5OSwgMHhDNywgMHg4RiwgMHg2NywgMHg5MSwgMHhCRCwgMHg5QSwgMHhFQSwgLyogMHgxOC0weDFCICovCisJMHg5NiwgMHhFOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NiwgMHhCMiwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHg5QSwgMHhFQywgMHgwMCwgMHgwMCwgMHg5MSwgMHhFNSwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHg5MywgMHg1NiwgMHg5MSwgMHhCRSwgMHg5NSwgMHg3NiwgLyogMHgyOC0weDJCICovCisJMHg5QSwgMHhFRCwgMHg5QSwgMHhFRSwgMHg4OSwgMHg5QiwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHg4RSwgMHhCOCwgMHg5QSwgMHhFRiwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHhDRSwgLyogMHgzNC0weDM3ICovCisJMHg5QSwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QSwgMHhGMSwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHg4OSwgMHg4MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QSwgMHhFRiwgLyogMHg0NC0weDQ3ICovCisJMHg5MywgMHhERSwgMHg5NSwgMHhGMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QSwgMHhGNSwgMHg5MSwgMHg3NCwgLyogMHg0Qy0weDRGICovCisJMHg5QSwgMHhGNCwgMHg4QywgMHg1RiwgMHgwMCwgMHgwMCwgMHhFRCwgMHg4NCwgLyogMHg1MC0weDUzICovCisJMHg5NiwgMHg3QSwgMHg5QSwgMHhGMywgMHgwMCwgMHgwMCwgMHg5MywgMHg4NSwgLyogMHg1NC0weDU3ICovCisJMHg5QSwgMHhGNywgMHgwMCwgMHgwMCwgMHg5QSwgMHhGNiwgMHhFRCwgMHg4NSwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHhFRCwgMHg4NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHg5QSwgMHhGOSwgMHgwMCwgMHgwMCwgMHg5QSwgMHhGOCwgMHhFRCwgMHg4NywgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHg4OSwgMHg5QywgMHgwMCwgMHgwMCwgMHg5QSwgMHhGQSwgLyogMHg2NC0weDY3ICovCisJMHg4RiwgMHhBNywgMHg5QSwgMHhGQywgMHg5MiwgMHg0NCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHg5QSwgMHhGQiwgMHgwMCwgMHgwMCwgMHg5NSwgMHhCMSwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RiwgMHg5NywgLyogMHg3MC0weDczICovCisJMHg5MywgMHg3QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHg5QiwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHg4RCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHg5QiwgMHg0MSwgMHg5NCwgMHg0MCwgMHg5NCwgMHhEQywgLyogMHg4MC0weDgzICovCisJMHg5NiwgMHhDRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NCwgMHg0NCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHg5QiwgMHg0QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QiwgMHg1NywgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NywgMHg2NCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHg5NiwgMHhBRCwgMHgwMCwgMHgwMCwgMHg5QiwgMHhBQSwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHg5QiwgMHg0MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QiwgMHg0NSwgLyogMHhBMC0weEEzICovCisJMHhFRCwgMHg4OCwgMHg5MSwgMHhDMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHg5NiwgMHg1NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHg5MywgMHg2OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QiwgMHg0NiwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHg5NiwgMHg4NSwgMHhFRCwgMHg4OSwgMHg4RCwgMHhDOCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RiwgMHhBOCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QiwgMHg0NywgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHg4RSwgMHg2RiwgMHgwMCwgMHgwMCwgMHg4RSwgMHg2RSwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHg4OCwgMHhCNywgMHg4QywgMHhDNiwgMHgwMCwgMHgwMCwgMHg5MCwgMHhBOSwgLyogMHhEMC0weEQzICovCisJMHg4OCwgMHhDRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHg5QiwgMHg0QiwgMHg5QiwgMHg0QywgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHg5QiwgMHg0OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHg4OSwgMHg1NywgMHg4QSwgMHhBRCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHg5QiwgMHg0OCwgMHgwMCwgMHgwMCwgMHg5NiwgMHhDMywgMHg5NSwgMHg1MCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHhBNiwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHhGNywgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RSwgMHg3MCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNUFbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDg4LCAweEQwLCAweDAwLCAweDAwLCAweDg4LCAweEExLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDlCLCAweDUxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDlCLCAweDRGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDk2LCAweEJBLCAweDAwLCAweDAwLCAweDlCLCAweDUyLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDlCLCAweDUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlCLCAweDRFLCAvKiAweDFDLTB4MUYgKi8KKwkweDkwLCAweDUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDlCLCAweDRELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDk1LCAweEQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhDLCAweEUyLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDlCLCAweDU2LCAweDlCLCAweDU3LCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDhGLCAweEE5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDlCLCAweDUzLCAweDk4LCAweDRCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk0LCAweDZCLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDlCLCAweDU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhELCAweEE1LCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlCLCAweDU4LCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk1LCAweDc3LCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlCLCAweDU5LCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDlCLCAweDU0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk2LCAweEI5LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk0LCAweDdELCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlCLCAweDVBLCAweDk1LCAweDUxLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDlCLCAweDVCLCAweDlCLCAweDVGLCAweDlCLCAweDVDLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDg5LCAweEM1LCAweDlCLCAweDVFLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDhFLCAweEI5LCAweDAwLCAweDAwLCAweDlCLCAweDVELCAvKiAweEM4LTB4Q0IgKi8KKwkweDhDLCAweDk5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDlCLCAweDZCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlCLCAweDY0LCAweDlCLCAweDYxLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDkyLCAweDg0LCAweDAwLCAweDAwLCAweDlCLCAweDYwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlCLCAweDYyLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDlCLCAweDYzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlCLCAweDY1LCAweDlCLCAweDY2LCAvKiAweEY4LTB4RkIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181Qls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4OEEsIDB4RjAsIDB4MDAsIDB4MDAsIDB4OUIsIDB4NjgsIC8qIDB4MDgtMHgwQiAqLworCTB4OUIsIDB4NjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUIsIDB4NjksIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEYsIDB4RUMsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUIsIDB4NkMsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4OTIsIDB4REEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4ODksIDB4NjQsIDB4MDAsIDB4MDAsIDB4OUIsIDB4NkEsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUIsIDB4NkQsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUIsIDB4NkUsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4OUIsIDB4NzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUIsIDB4NkYsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4OUIsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4OEUsIDB4NzEsIDB4OUIsIDB4NzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4OEQsIDB4NDUsIDB4OUIsIDB4NzMsIDB4RUQsIDB4OEEsIDB4OEUsIDB4OUEsIC8qIDB4NTQtMHg1NyAqLworCTB4OTEsIDB4QjYsIDB4MDAsIDB4MDAsIDB4OUIsIDB4NzQsIDB4OUIsIDB4NzUsIC8qIDB4NTgtMHg1QiAqLworCTB4OEUsIDB4NzksIDB4OEQsIDB4NDYsIDB4MDAsIDB4MDAsIDB4OTYsIDB4RDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEIsIDB4NDcsIC8qIDB4NjAtMHg2MyAqLworCTB4OEMsIDB4QzcsIDB4OUIsIDB4NzYsIDB4OEEsIDB4NzcsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4OUIsIDB4NzcsIDB4MDAsIDB4MDAsIDB4OTEsIDB4QjcsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4OUIsIDB4NzgsIDB4OUIsIDB4QTEsIDB4MDAsIDB4MDAsIDB4OUIsIDB4NzksIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4OUIsIDB4N0EsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4OUIsIDB4N0IsIDB4MDAsIDB4MDAsIDB4OUIsIDB4N0QsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4OUIsIDB4N0UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUIsIDB4ODAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4OTEsIDB4RUUsIDB4MDAsIDB4MDAsIDB4ODksIDB4NDYsIC8qIDB4ODQtMHg4NyAqLworCTB4OEUsIDB4RTcsIDB4ODgsIDB4QzAsIDB4MDAsIDB4MDAsIDB4OTEsIDB4NzYsIC8qIDB4ODgtMHg4QiAqLworCTB4OEEsIDB4QUUsIDB4OEUsIDB4QjMsIDB4MDAsIDB4MDAsIDB4OEQsIDB4NDcsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4OTMsIDB4ODYsIDB4MDAsIDB4MDAsIDB4OEYsIDB4NDAsIC8qIDB4OTQtMHg5NyAqLworCTB4OEEsIDB4QUYsIDB4OTIsIDB4ODgsIDB4OTIsIDB4RTgsIDB4ODgsIDB4QjYsIC8qIDB4OTgtMHg5QiAqLworCTB4OEIsIDB4NTgsIDB4OTUsIDB4RjMsIDB4MDAsIDB4MDAsIDB4OEUsIDB4QzAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEIsIDB4NzEsIDB4OTAsIDB4RTksIC8qIDB4QTAtMHhBMyAqLworCTB4OEUsIDB4QkEsIDB4OTcsIDB4NDcsIDB4OUIsIDB4ODEsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEIsIDB4N0IsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4OEQsIDB4QzksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEEsIDB4NTEsIC8qIDB4QjAtMHhCMyAqLworCTB4ODksIDB4ODMsIDB4OEYsIDB4QUEsIDB4ODksIDB4QzYsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4OUIsIDB4ODIsIDB4OTcsIDB4NjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEYsIDB4NjgsIC8qIDB4QkMtMHhCRiAqLworCTB4RUQsIDB4OEIsIDB4MDAsIDB4MDAsIDB4OEUsIDB4RTIsIDB4OUIsIDB4ODMsIC8qIDB4QzAtMHhDMyAqLworCTB4OEEsIDB4RjEsIDB4OTMsIDB4RDAsIDB4OTYsIDB4QTcsIDB4OUIsIDB4ODQsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4OUIsIDB4ODUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4OTUsIDB4NzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4OUIsIDB4ODcsIDB4MDAsIDB4MDAsIDB4OEEsIDB4QTYsIDB4OEIsIDB4RjUsIC8qIDB4RDAtMHhEMyAqLworCTB4OUIsIDB4ODYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4RUQsIDB4OEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEEsIDB4QjAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4OTAsIDB4NTEsIDB4OUIsIDB4OEIsIDB4OEUsIDB4NDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4ODksIDB4QzcsIDB4OUIsIDB4OEEsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4OUIsIDB4ODgsIDB4OUIsIDB4OEMsIDB4OUIsIDB4ODksIDB4OTQsIDB4NEEsIC8qIDB4RTQtMHhFNyAqLworCTB4OUUsIDB4Q0IsIDB4OTAsIDB4NTIsIDB4MDAsIDB4MDAsIDB4OUIsIDB4OEQsIC8qIDB4RTgtMHhFQiAqLworCTB4RUQsIDB4OEUsIDB4MDAsIDB4MDAsIDB4OTcsIDB4QkUsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4OUIsIDB4OEUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUIsIDB4OTAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4OTIsIDB4OUUsIDB4OUIsIDB4OEYsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4OTAsIDB4QTEsIDB4MDAsIDB4MDAsIDB4OEUsIDB4OUIsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTEsIDB4Q0UsIDB4OEUsIDB4RjUsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzVDWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHg5NSwgMHg5NSwgMHg5MCwgMHhFQSwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHg4RSwgMHhDQiwgMHg5QiwgMHg5MSwgMHg4RiwgMHhBQiwgMHg5QiwgMHg5MiwgLyogMHgwNC0weDA3ICovCisJMHg5QiwgMHg5MywgMHg4OCwgMHhEMSwgMHg5MSwgMHhCOCwgMHg5MCwgMHg3MSwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHg5QiwgMHg5NCwgMHg5MywgMHhCMSwgMHg4RiwgMHhBQywgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHg4RiwgMHhBRCwgMHgwMCwgMHgwMCwgMHg5QiwgMHg5NSwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHhFQiwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RiwgMHhBRSwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHg4RiwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHg5QiwgMHg5NiwgMHgwMCwgMHgwMCwgMHg5QiwgMHg5NywgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHg5NiwgMHhERSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHg5QiwgMHg5OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHg4QiwgMHhDNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHg4RiwgMHg0MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHg5QiwgMHg5OSwgMHg5QiwgMHg5QSwgMHg4RSwgMHhEQSwgMHg5MCwgMHg0QiwgLyogMHgzOC0weDNCICovCisJMHg5MywgMHhGMiwgMHg5MCwgMHg3MywgMHg5NCwgMHhGNiwgMHg5NCwgMHg0MSwgLyogMHgzQy0weDNGICovCisJMHg4QiwgMHhDNywgMHg5QiwgMHg5QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHg4QiwgMHg4RiwgMHg5QiwgMHg5QywgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHg4QiwgMHhGQywgMHgwMCwgMHgwMCwgMHg5MywgMHhDRCwgMHg4OSwgMHhBRSwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHg4RSwgMHg3MiwgMHg5QiwgMHg5RCwgMHg5QiwgMHhBMCwgLyogMHg0Qy0weDRGICovCisJMHg5QiwgMHg5RiwgMHg4QiwgMHhGQiwgMHgwMCwgMHgwMCwgMHg5QiwgMHg5RSwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHg5MywgMHg1NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MSwgMHhBRSwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHg5MywgMHg2QSwgMHg4RSwgMHhDNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHg5MSwgMHg3NywgMHg5NywgMHg5QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHg5QiwgMHhBMiwgMHgwMCwgMHgwMCwgMHg5QiwgMHhBMywgMHg5MywgMHhENCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHg4RSwgMHg1MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QiwgMHhBNSwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHg5QiwgMHhBNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHg5QiwgMHhBNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHg4QSwgMHhGMiwgMHg5QiwgMHhBOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHg5QiwgMHhBOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHg4OSwgMHhBQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHg5MCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHg5MSwgMHg1QSwgMHg4QSwgMHhFMiwgMHgwMCwgMHgwMCwgMHg5QiwgMHhBQiwgLyogMHhBOC0weEFCICovCisJMHg5NiwgMHhBNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHg5MSwgMHhEMCwgMHgwMCwgMHgwMCwgMHg4QSwgMHg3OCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QiwgMHhBRCwgMHg5QiwgMHhBRiwgLyogMHhCNC0weEI3ICovCisJMHg4QSwgMHhERCwgMHgwMCwgMHgwMCwgMHhFRCwgMHg5MSwgMHg5QiwgMHhBQywgLyogMHhCOC0weEJCICovCisJMHg5QiwgMHhBRSwgMHgwMCwgMHgwMCwgMHg5QiwgMHhCMSwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHg5QiwgMHhCMCwgMHgwMCwgMHgwMCwgMHg5QiwgMHhCMiwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHg5QiwgMHhCMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHg5MywgMHhCQiwgMHg4QiwgMHhBQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHg4OSwgMHhFMywgMHg5QiwgMHhCNCwgMHg5QiwgMHhCOSwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHg5QiwgMHhCNywgMHgwMCwgMHgwMCwgMHg5NSwgMHhGNSwgLyogMHhFQy0weEVGICovCisJMHg5NSwgMHhGNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHhFRCwgMHg5MiwgMHg5MywgMHg4NywgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QiwgMHhCNiwgMHg4RiwgMHg3MywgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHg5QiwgMHhCNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNURbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkwLCAweDkyLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlCLCAweEJBLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhELCAweEU4LCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDlCLCAweEMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDlCLCAweEMxLCAweDlCLCAweEJCLCAweDhBLCAweDUyLCAweDlCLCAweEJDLCAvKiAweDE0LTB4MTcgKi8KKwkweDlCLCAweEM1LCAweDlCLCAweEM0LCAweDlCLCAweEMzLCAweDlCLCAweEJGLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlCLCAweEJFLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlCLCAweEMyLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweDkzLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDk1LCAweEY2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweDk2LCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlCLCAweEM5LCAvKiAweDQ4LTB4NEIgKi8KKwkweDlCLCAweEM2LCAweDAwLCAweDAwLCAweDlCLCAweEM4LCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDk3LCAweDkyLCAweDAwLCAweDAwLCAweDlCLCAweEM3LCAweEVELCAweDk0LCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDlCLCAweEJELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDkwLCAweDkzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDlCLCAweENBLCAweEVELCAweDk3LCAweDAwLCAweDAwLCAweDhELCAweEI1LCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlCLCAweENCLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlCLCAweENDLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlCLCAweENGLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDlCLCAweENFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlCLCAweENELCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkzLCAweDg4LCAvKiAweDg4LTB4OEIgKi8KKwkweDlCLCAweEI4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDlCLCAweEQ1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDlCLCAweEQxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlCLCAweEQwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDlCLCAweEQyLCAweDAwLCAweDAwLCAweDlCLCAweEQzLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlCLCAweEQ2LCAvKiAweEI0LTB4QjcgKi8KKwkweEVELCAweDk4LCAweEVELCAweDk5LCAweDk3LCAweEU0LCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDlCLCAweEQ3LCAweDlCLCAweEQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDlCLCAweEQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDhBLCAweERFLCAweDlCLCAweEQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweEVELCAweDlBLCAweDAwLCAweDAwLCAweDlCLCAweERCLCAweDlCLCAweERBLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlCLCAweERDLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlCLCAweERELCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDkwLCAweEVDLCAweDhGLCAweDQyLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDhGLCAweDg0LCAweDAwLCAweDAwLCAweDkxLCAweDgzLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDhELCAweDQ4LCAweDhELCAweEI2LCAweDhELCAweDQ5LCAvKiAweEU0LTB4RTcgKi8KKwkweDhCLCAweDkwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlCLCAweERFLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhELCAweEI3LCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDhDLCAweEM4LCAweDlCLCAweERGLCAweDk2LCAweEE0LCAvKiAweEYwLTB4RjMgKi8KKwkweDk0LCAweDYyLCAweDlCLCAweEUwLCAweDAwLCAweDAwLCAweDhELCAweDRBLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhBLCAweEFBLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDkyLCAweDQ2LCAweDhCLCAweEQwLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181RVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEUsIDB4NzMsIDB4OTUsIDB4N0EsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTQsIDB4QkYsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUIsIDB4RTEsIC8qIDB4MDgtMHgwQiAqLworCTB4OEEsIDB4RjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4OUIsIDB4RTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4OUYsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4OUIsIDB4RTMsIDB4OUIsIDB4RTIsIDB4OUIsIDB4RTUsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4OTIsIDB4RTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4OTAsIDB4ODMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEUsIDB4NzQsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4OTAsIDB4QzgsIDB4MDAsIDB4MDAsIDB4OTEsIDB4RDEsIC8qIDB4MkMtMHgyRiAqLworCTB4OEIsIDB4NDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4QTAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUIsIDB4RTYsIDB4OUIsIDB4RTcsIC8qIDB4MzQtMHgzNyAqLworCTB4OEYsIDB4RUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4OTYsIDB4NTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4OUIsIDB4RUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUIsIDB4RTksIC8qIDB4NDAtMHg0MyAqLworCTB4OUIsIDB4RTgsIDB4OTUsIDB4OUQsIDB4MDAsIDB4MDAsIDB4OUIsIDB4RjEsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4OTYsIDB4NzksIDB4MDAsIDB4MDAsIDB4OUIsIDB4RUIsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4OUIsIDB4RUQsIDB4OTYsIDB4OEIsIDB4MDAsIDB4MDAsIDB4OUIsIDB4RUMsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUIsIDB4RUUsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4OTQsIDB4QTYsIDB4OUIsIDB4RUYsIDB4OTUsIDB4QkMsIC8qIDB4NjAtMHg2MyAqLworCTB4OUIsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEEsIDB4QjEsIDB4OTUsIDB4QkQsIC8qIDB4NzAtMHg3MyAqLworCTB4OTQsIDB4NEUsIDB4OUIsIDB4RjIsIDB4OUIsIDB4RjMsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4OEQsIDB4NEIsIDB4OEEsIDB4QjIsIDB4OUIsIDB4RjQsIDB4OEMsIDB4QjYsIC8qIDB4NzgtMHg3QiAqLworCTB4OTcsIDB4NjMsIDB4OTcsIDB4NDgsIDB4OEEsIDB4RjQsIDB4OUIsIDB4RjYsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4OTIsIDB4QTEsIDB4MDAsIDB4MDAsIDB4OEQsIDB4NEMsIC8qIDB4ODAtMHg4MyAqLworCTB4OEYsIDB4QUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTQsIDB4REQsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEYsIDB4QjAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEYsIDB4OTgsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4OTIsIDB4RUEsIDB4OTUsIDB4RjcsIDB4OTMsIDB4NTgsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEQsIDB4NEQsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4OTUsIDB4N0IsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4OUIsIDB4RjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTMsIDB4NzgsIDB4OEQsIDB4QzAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEMsIDB4QzksIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4OTIsIDB4RUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4ODgsIDB4QzEsIDB4OEYsIDB4OEUsIDB4OEQsIDB4NEUsIC8qIDB4QjQtMHhCNyAqLworCTB4OTcsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4OUIsIDB4RjgsIDB4OUIsIDB4RjksIDB4OTQsIDB4NzAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4OUIsIDB4RkEsIDB4OTcsIDB4RjUsIDB4OTgsIDB4NEMsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUIsIDB4RkMsIC8qIDB4Q0MtMHhDRiAqLworCTB4OUIsIDB4RkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEEsIDB4NjYsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUMsIDB4NDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUMsIDB4NDMsIDB4OUMsIDB4NDQsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4OUMsIDB4NDIsIDB4MDAsIDB4MDAsIDB4OTUsIDB4NUYsIC8qIDB4REMtMHhERiAqLworCTB4OEYsIDB4QjEsIDB4OUMsIDB4NDYsIDB4OUMsIDB4NDUsIDB4OUMsIDB4NDEsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4OUMsIDB4NDcsIDB4OUMsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4OUMsIDB4NDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4OUMsIDB4NEMsIDB4OUMsIDB4NEEsIDB4MDAsIDB4MDAsIDB4OUMsIDB4NEIsIC8qIDB4RjAtMHhGMyAqLworCTB4OUMsIDB4NEQsIDB4MDAsIDB4MDAsIDB4ODksIDB4ODQsIDB4OTIsIDB4RUMsIC8qIDB4RjQtMHhGNyAqLworCTB4OUMsIDB4NEUsIDB4MDAsIDB4MDAsIDB4OEMsIDB4OUEsIDB4ODksIDB4RjQsIC8qIDB4RjgtMHhGQiAqLworCTB4OTQsIDB4NTUsIDB4MDAsIDB4MDAsIDB4OUMsIDB4NEYsIDB4OTMsIDB4RjksIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzVGWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHg5NSwgMHhEOSwgMHgwMCwgMHgwMCwgMHg5QywgMHg1MCwgLyogMHgwMC0weDAzICovCisJMHg5OCwgMHg0RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHg5QywgMHg1MSwgMHg5NSwgMHhCRSwgMHg5QywgMHg1NCwgLyogMHgwOC0weDBCICovCisJMHg5OCwgMHg5RiwgMHg5OCwgMHhBRiwgMHgwMCwgMHgwMCwgMHg4RSwgMHhBRSwgLyogMHgwQy0weDBGICovCisJMHg5MywgMHhGMywgMHg5QywgMHg1NSwgMHgwMCwgMHgwMCwgMHg4QiwgMHg3QywgLyogMHgxMC0weDEzICovCisJMHg5MiwgMHhBMiwgMHg4OCwgMHhGOCwgMHg5QywgMHg1NiwgMHg5NSwgMHhBNCwgLyogMHgxNC0weDE3ICovCisJMHg4RCwgMHg0RiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHg2RiwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHhFRCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHhFRCwgMHg5QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHg5NiwgMHhFRCwgMHg4QywgMHhCNywgMHg4QywgMHhDQSwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHg5QywgMHg1NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHg5QywgMHg1OCwgMHgwMCwgMHgwMCwgMHg5QywgMHg1RSwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHg4RSwgMHhFMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHhFRCwgMHg5QywgMHg5MiwgMHhBMywgMHgwMCwgMHgwMCwgMHg4QiwgMHhBRCwgLyogMHgzNC0weDM3ICovCisJMHg5QywgMHg1OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHg5NSwgMHg0QSwgMHgwMCwgMHgwMCwgMHg5MiwgMHg2NSwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHg5QywgMHg1QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHhFRCwgMHg0QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHg5QywgMHg1QiwgMHgwMCwgMHgwMCwgMHg4QiwgMHhBRSwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHg5QywgMHg1QywgMHgwMCwgMHgwMCwgMHg5QywgMHg1RCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHg5QywgMHg1RiwgMHgwMCwgMHgwMCwgMHg5MywgMHg5NiwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QywgMHg2MCwgMHg5QywgMHg2MSwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHg5QywgMHg2MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHg5QywgMHg1MywgMHg5QywgMHg1MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHg5QywgMHg2MywgMHg4QywgMHg2MCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NSwgMHg0NiwgMHhFRCwgMHg5RCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHg4RCwgMHhDQSwgMHg5NSwgMHg1NiwgMHg5MiwgMHhBNCwgLyogMHg2OC0weDZCICovCisJMHg5NSwgMHg2QSwgMHg5QywgMHg2NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHg4RiwgMHhCMiwgMHg4OSwgMHg2NSwgMHgwMCwgMHgwMCwgMHg5QywgMHg2NSwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QywgMHg2NiwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHg5NiwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHg5NCwgMHhERSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QywgMHg2OSwgLyogMHg3Qy0weDdGICovCisJCisJMHg4OSwgMHg5RCwgMHg5MCwgMHhBQSwgMHg5QywgMHg2OCwgMHg5QywgMHg2NywgLyogMHg4MC0weDgzICovCisJMHg4QywgMHg2MSwgMHg5MSwgMHhEMiwgMHgwMCwgMHgwMCwgMHg5QywgMHg2RCwgLyogMHg4NC0weDg3ICovCisJMHg5QywgMHg2QiwgMHgwMCwgMHgwMCwgMHg5QywgMHg2QSwgMHg5NywgMHhBNSwgLyogMHg4OC0weDhCICovCisJMHg4QywgMHhFMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHg4RiwgMHg5OSwgMHg5QywgMHg2QywgMHg5MywgMHg2QiwgMHg4RiwgMHg1RCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MywgMHhCRSwgLyogMHg5NC0weDk3ICovCisJMHg5QywgMHg3MCwgMHg5QywgMHg2RiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QywgMHg2RSwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHg5QywgMHg3MSwgMHg4QywgMHhFNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHg5QywgMHg3MiwgMHg5NSwgMHg5QywgMHg4RiwgMHg3QSwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHg5QywgMHg3MywgMHg5NCwgMHhGNywgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MywgMHhCRiwgLyogMHhCMC0weEIzICovCisJMHg5MiwgMHhBNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHg5RSwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHg5MywgMHg0RiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHg5QywgMHg3NCwgMHg4QiwgMHg0QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHg1MywgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHg5NSwgMHg0QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHg4QSwgMHhGNSwgMHg5NCwgMHg0NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QywgMHg3NSwgMHg4RSwgMHg3NSwgLyogMHhENC0weEQ3ICovCisJMHg5NiwgMHg1OSwgMHg5NiwgMHg1QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHg4OSwgMHg5RSwgMHg5QywgMHg3QSwgMHhFRCwgMHg5RiwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHg5MiwgMHg4OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHg5QywgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OSwgMHhGNSwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHg5QywgMHhBQiwgMHg5QywgMHg3OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHg5NCwgMHg0RiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHg5QywgMHg3OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QywgMHg3NiwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHg4RCwgMHg5QSwgMHgwMCwgMHgwMCwgMHg5QywgMHg3QywgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNjBbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlDLCAweDgzLCAweDlDLCAweDg5LCAvKiAweDBDLTB4MEYgKi8KKwkweDlDLCAweDgxLCAweDAwLCAweDAwLCAweDkzLCAweDdCLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDlDLCAweDg2LCAweDk1LCAweDdDLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDlDLCAweDgwLCAweDAwLCAweDAwLCAweDlDLCAweDg1LCAvKiAweDE4LTB4MUIgKi8KKwkweDk3LCAweEU1LCAweDhFLCAweDc2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDkxLCAweEQzLCAweDlDLCAweDdELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDhCLCAweDdELCAweDlDLCAweDg4LCAweDkwLCAweEFCLCAvKiAweDI0LTB4MjcgKi8KKwkweDg5LCAweDg1LCAweDlDLCAweDgyLCAweDg5LCAweEY2LCAweDlDLCAweDg3LCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhCLCAweEFGLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDlDLCAweDg0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlDLCAweDhBLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDlDLCAweDhDLCAweDlDLCAweDk2LCAweDlDLCAweDk0LCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlDLCAweDkxLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlDLCAweDkwLCAweDk3LCAweEY2LCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDlDLCAweDkyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDhCLCAweEIwLCAweDAwLCAweDAwLCAweDhELCAweDUwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDhGLCAweDlBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDlDLCAweDk5LCAweDlDLCAweDhCLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweEVELCAweEEwLCAweDAwLCAweDAwLCAweDlDLCAweDhGLCAvKiAweDVDLTB4NUYgKi8KKwkweDlDLCAweDdFLCAweDAwLCAweDAwLCAweDg5LCAweEY4LCAweDlDLCAweDkzLCAvKiAweDYwLTB4NjMgKi8KKwkweDlDLCAweDk1LCAweDkyLCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDhELCAweEE2LCAweDg5LCAweEI2LCAweDlDLCAweDhELCAweDlDLCAweDk4LCAvKiAweDY4LTB4NkIgKi8KKwkweDlDLCAweDk3LCAweDhCLCAweEIxLCAweDAwLCAweDAwLCAweDkxLCAweEE3LCAvKiAweDZDLTB4NkYgKi8KKwkweDhBLCAweDg2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDhDLCAweDYyLCAweDAwLCAweDAwLCAweDlDLCAweDhFLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDlDLCAweDlBLCAweDAwLCAweDAwLCAweDlDLCAweDlELCAvKiAweDgwLTB4ODMgKi8KKwkweDlDLCAweDlGLCAweEVELCAweEExLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDhFLCAweEJCLCAweEVELCAweEEyLCAweDlDLCAweEE1LCAvKiAweDg4LTB4OEIgKi8KKwkweDkyLCAweEVFLCAweDlDLCAweDlCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlDLCAweEEzLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDg5LCAweEY3LCAweDAwLCAweDAwLCAweDlDLCAweEExLCAweDlDLCAweEEyLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlDLCAweDlFLCAweDlDLCAweEEwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhDLCAweEU1LCAvKiAweDlDLTB4OUYgKi8KKwkweDk3LCAweDQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhBLCAweEIzLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg5LCAweDc4LCAweDlDLCAweEE0LCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDk0LCAweDU5LCAweDg4LCAweEFCLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk0LCAweERGLCAweDlDLCAweDdCLCAvKiAweEIwLTB4QjMgKi8KKwkweDlDLCAweEFBLCAweDlDLCAweEFFLCAweDk2LCAweEUzLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDlDLCAweEE3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDkzLCAweDg5LCAweDlDLCAweEFDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDhGLCAweEVFLCAweDlDLCAweEFELCAweDkzLCAweEQ1LCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDk4LCAweDY2LCAweDAwLCAweDAwLCAweDlDLCAweEE5LCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweEVELCAweEE0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDlDLCAweEFGLCAweDAwLCAweDAwLCAweDhELCAweDlCLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDkwLCAweEM5LCAweDAwLCAweDAwLCAweEVELCAweEEzLCAweDg4LCAweEQyLCAvKiAweERDLTB4REYgKi8KKwkweDlDLCAweEE4LCAweDlDLCAweEE2LCAweDAwLCAweDAwLCAweDkxLCAweDc5LCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlDLCAweDlDLCAvKiAweEU0LTB4RTcgKi8KKwkweDhFLCAweDUzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDkxLCAweEM0LCAweDlDLCAweEJCLCAweEVELCAweEE2LCAweDkxLCAweDdBLCAvKiAweEYwLTB4RjMgKi8KKwkweDlDLCAweEI2LCAweDAwLCAweDAwLCAweDlDLCAweEIzLCAweDlDLCAweEI0LCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDhFLCAweEU0LCAweDlDLCAweEI3LCAweDlDLCAweEJBLCAvKiAweEY4LTB4RkIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182MVs1MTJdID0geworCTB4OUMsIDB4QjUsIDB4OEYsIDB4NDQsIDB4MDAsIDB4MDAsIDB4OUMsIDB4QjgsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUMsIDB4QjIsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4OTYsIDB4RkEsIDB4OTYsIDB4RjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4OUMsIDB4QkMsIDB4OUMsIDB4QkQsIDB4ODgsIDB4RDMsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4RUQsIDB4QTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4OUMsIDB4QjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEIsIDB4RjAsIDB4ODgsIDB4QTQsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEEsIDB4QjQsIC8qIDB4MUMtMHgxRiAqLworCTB4RUQsIDB4QTUsIDB4OUMsIDB4QjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUMsIDB4QzEsIC8qIDB4MjQtMHgyNyAqLworCTB4OUMsIDB4QzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4OUMsIDB4QzUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4RUQsIDB4QTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4OUMsIDB4QzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4QTgsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4OUMsIDB4QzQsIDB4OUMsIDB4QzcsIDB4OUMsIDB4QkYsIDB4OUMsIDB4QzMsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUMsIDB4QzgsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4OUMsIDB4QzksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUMsIDB4QkUsIC8qIDB4NDQtMHg0NyAqLworCTB4OEUsIDB4OUMsIDB4MDAsIDB4MDAsIDB4OUMsIDB4QzIsIDB4OTEsIDB4RDQsIC8qIDB4NDgtMHg0QiAqLworCTB4OEQsIDB4NTEsIDB4OUMsIDB4QjAsIDB4OTAsIDB4NTQsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUMsIDB4RDYsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4OTUsIDB4RTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4OUMsIDB4Q0MsIDB4OUMsIDB4Q0QsIDB4OUMsIDB4Q0UsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4OUMsIDB4RDUsIDB4MDAsIDB4MDAsIDB4OUMsIDB4RDQsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTYsIDB4OUQsIDB4OEEsIDB4QjUsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4OUMsIDB4RDIsIDB4MDAsIDB4MDAsIDB4OEMsIDB4NjQsIC8qIDB4NjQtMHg2NyAqLworCTB4OEEsIDB4NTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUMsIDB4Q0YsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTcsIDB4QjYsIDB4OUMsIDB4RDEsIC8qIDB4NkMtMHg2RiAqLworCTB4ODgsIDB4RDQsIDB4OUMsIDB4RDMsIDB4MDAsIDB4MDAsIDB4OUMsIDB4Q0EsIC8qIDB4NzAtMHg3MyAqLworCTB4OUMsIDB4RDAsIDB4OUMsIDB4RDcsIDB4OEMsIDB4NjMsIDB4OUMsIDB4Q0IsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTcsIDB4N0MsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTcsIDB4NEEsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUMsIDB4REEsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUMsIDB4REUsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTEsIDB4OUUsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4OTcsIDB4RjcsIDB4OUMsIDB4REYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4OUMsIDB4REMsIDB4MDAsIDB4MDAsIDB4OUMsIDB4RDksIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4RUQsIDB4QUEsIDB4OUMsIDB4RDgsIDB4OUMsIDB4REQsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4OTUsIDB4QUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTMsIDB4QjIsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4OEMsIDB4NjUsIDB4MDAsIDB4MDAsIDB4OUMsIDB4RTAsIC8qIDB4QTgtMHhBQiAqLworCTB4OUMsIDB4REIsIDB4MDAsIDB4MDAsIDB4OUMsIDB4RTEsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEMsIDB4OUIsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4QUYsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUMsIDB4RTksIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEEsIDB4QjYsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUMsIDB4RTcsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUMsIDB4RTgsIDB4OEQsIDB4QTcsIC8qIDB4QzQtMHhDNyAqLworCTB4OUMsIDB4RTYsIDB4OUMsIDB4RTQsIDB4OUMsIDB4RTMsIDB4OUMsIDB4RUEsIC8qIDB4QzgtMHhDQiAqLworCTB4OUMsIDB4RTIsIDB4OUMsIDB4RUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4ODksIDB4RjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUMsIDB4RUUsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUMsIDB4RUQsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4QTYsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4OUMsIDB4RjEsIDB4MDAsIDB4MDAsIDB4OUMsIDB4RUYsIDB4OUMsIDB4RTUsIC8qIDB4RjQtMHhGNyAqLworCTB4OEMsIDB4OUMsIDB4MDAsIDB4MDAsIDB4OUMsIDB4RjAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4OUMsIDB4RjQsIDB4OUMsIDB4RjMsIDB4OUMsIDB4RjUsIDB4OUMsIDB4RjIsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzYyWzUxMl0gPSB7CisJMHg5QywgMHhGNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHg5QywgMHhGNywgMHg5QywgMHhGOCwgMHg5NSwgMHhFOCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHg5QywgMHhGQSwgMHg5QywgMHhGOSwgMHg4RiwgMHg1RSwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHg5MCwgMHhBQywgMHg4OSwgMHhFNCwgMHg4OSwgMHhGQSwgMHhFRCwgMHhBQiwgLyogMHgxMC0weDEzICovCisJMHg5QywgMHhGQiwgMHgwMCwgMHgwMCwgMHg4OCwgMHhCRCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHhDQSwgMHg5QywgMHhGQywgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHhFNiwgMHhDMSwgMHg5RCwgMHg0MCwgMHg4QywgMHg4MSwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHg5RCwgMHg0MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHhFRCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RCwgMHg0MiwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RCwgMHg0MywgMHg4QiwgMHg1OSwgLyogMHgyQy0weDJGICovCisJMHg5RCwgMHg0NCwgMHgwMCwgMHgwMCwgMHg5RCwgMHg0NSwgMHg5RCwgMHg0NiwgLyogMHgzMC0weDMzICovCisJMHg5MSwgMHhENSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHg4QywgMHhDQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NiwgMHhERiwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NiwgMHg1QiwgLyogMHgzQy0weDNGICovCisJMHg4RiwgMHg4QSwgMHg5RCwgMHg0NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHhFRSwgLyogMHg0NC0weDQ3ICovCisJMHhFNywgMHhCQiwgMHg5NCwgMHhFMCwgMHgwMCwgMHgwMCwgMHg4RSwgMHhFOCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHg4RCwgMHhDQiwgMHg5RCwgMHg0OCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MSwgMHhDNSwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHg5NSwgMHhBNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHg5MSwgMHhFRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RCwgMHg0QiwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RCwgMHg0OSwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHg5RCwgMHg0QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RCwgMHg0QSwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHg5RCwgMHg0RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NSwgMHhBRiwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHg4OCwgMHhCNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NSwgMHg3RCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHg5NCwgMHhFMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHg5RCwgMHg0RSwgMHgwMCwgMHgwMCwgMHg5RCwgMHg1MSwgMHg4RiwgMHhCMywgLyogMHg3Qy0weDdGICovCisJCisJMHg4QiwgMHg1QSwgMHgwMCwgMHgwMCwgMHg5RCwgMHg0RiwgMHg5RCwgMHg1NiwgLyogMHg4MC0weDgzICovCisJMHg4RiwgMHhCNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHg5RCwgMHg1MCwgMHg5NCwgMHg2MywgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHg5NywgMHg3RCwgMHg5RCwgMHg1MiwgMHg5RCwgMHg1MywgLyogMHg5MC0weDkzICovCisJMHg5RCwgMHg1NywgMHg5MywgMHg4QSwgMHg5RCwgMHg1NCwgMHg4RCwgMHg1MiwgLyogMHg5NC0weDk3ICovCisJMHg5MCwgMHhEQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RCwgMHg2NSwgLyogMHg5OC0weDlCICovCisJMHg5NCwgMHhCMiwgMHgwMCwgMHgwMCwgMHg5MSwgMHhGMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHhBQywgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NCwgMHhFMiwgLyogMHhBOC0weEFCICovCisJMHg5RCwgMHhBQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHg5NSwgMHhGOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHg5MiwgMHhFRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHg5NiwgMHg5NSwgMHgwMCwgMHgwMCwgMHg5RCwgMHg1QSwgLyogMHhCOC0weEJCICovCisJMHg4OSwgMHg5RiwgMHg5MiwgMHg4QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RCwgMHg2MywgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHg5MiwgMHg1MywgMHg5RCwgMHg1RCwgMHg5RCwgMHg2NCwgLyogMHhDNC0weEM3ICovCisJMHg5RCwgMHg1RiwgMHg5RCwgMHg2NiwgMHg5RCwgMHg2MiwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHg5RCwgMHg2MSwgMHg5NCwgMHg4RiwgMHgwMCwgMHgwMCwgMHg5RCwgMHg1QiwgLyogMHhDQy0weENGICovCisJMHg4OSwgMHhGQiwgMHg5RCwgMHg1OSwgMHg4QiwgMHg5MSwgMHg5MSwgMHhGMSwgLyogMHhEMC0weEQzICovCisJMHg5RCwgMHg1NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RCwgMHg1OCwgLyogMHhENC0weEQ3ICovCisJMHg4RCwgMHg1MywgMHg5MCwgMHhEOSwgMHgwMCwgMHgwMCwgMHg4RiwgMHhCNSwgLyogMHhEOC0weERCICovCisJMHg5RCwgMHg2MCwgMHg5NCwgMHg3MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHg4QiwgMHg5MiwgMHg4QSwgMHg2NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHg4QSwgMHg4NywgMHg5MCwgMHg0MCwgMHg5RCwgMHg2OCwgMHg5RCwgMHg2RCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHg5RCwgMHg2OSwgMHgwMCwgMHgwMCwgMHg4QywgMHg5RCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHg5RCwgMHg2RSwgMHg4RSwgMHg0MSwgMHg4RCwgMHg4OSwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RiwgMHg0NSwgMHg5RCwgMHg1QywgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNjNbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDhFLCAweDlELCAweDlELCAweDZCLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhFLCAweDc3LCAvKiAweDA0LTB4MDcgKi8KKwkweDlELCAweDZDLCAweDg4LCAweEMyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDlELCAweDY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDkyLCAweEE3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDhCLCAweDkzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhCLCAweEIyLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlELCAweDZBLCAvKiAweDI0LTB4MjcgKi8KKwkweDg4LCAweEE1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhELCAweEMxLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkwLCAweDU1LCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweEYwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDk0LCAweEQyLCAweDlELCAweDcwLCAweDkxLCAweDdELCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDkxLCAweEE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDhFLCAweDRBLCAweDlELCAweDcxLCAweDAwLCAweDAwLCAweDlELCAweDczLCAvKiAweDRDLTB4NEYgKi8KKwkweDlELCAweDZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDk1LCAweERGLCAweDAwLCAweDAwLCAweDkyLCAweEJCLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDkxLCAweDdCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk1LCAweEY5LCAvKiAweDY0LTB4NjcgKi8KKwkweDhFLCAweENDLCAweDlELCAweDgwLCAweDAwLCAweDAwLCAweDlELCAweDdFLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkwLCAweDk4LCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhDLCAweDlFLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlELCAweDc4LCAweDhGLCAweEI3LCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkzLCAweEU2LCAweDk0LCAweDUwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDlELCAweDc2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkxLCAweDdDLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDhFLCAweEY2LCAweDlELCAweDdCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDhGLCAweEI2LCAweDAwLCAweDAwLCAweDlELCAweDc1LCAweDlELCAweDdBLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk0LCAweDcyLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlELCAweDc0LCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDhDLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhBLCAweDdDLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlELCAweDdDLCAvKiAweDlDLTB4OUYgKi8KKwkweDk3LCAweEE5LCAweDhELCAweENDLCAweDkyLCAweDU0LCAweDlELCAweDc5LCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDkwLCAweERBLCAweDAwLCAweDAwLCAweDhELCAweDU0LCAvKiAweEE0LTB4QTcgKi8KKwkweDkwLCAweDg0LCAweDg5LCAweDg2LCAweDkxLCAweDVCLCAweDlELCAweDc3LCAvKiAweEE4LTB4QUIgKi8KKwkweDhCLCAweDY0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhDLCAweDY2LCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDkyLCAweENELCAweDlELCAweDdELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkxLCAweDdFLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlELCAweDgxLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDlELCAweDgzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkxLCAweEI1LCAvKiAweEMwLTB4QzMgKi8KKwkweDlELCAweDg5LCAweDAwLCAweDAwLCAweDlELCAweDg0LCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDlELCAweDg2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk1LCAweDYwLCAvKiAweENDLTB4Q0YgKi8KKwkweDkyLCAweEYxLCAweDAwLCAweDAwLCAweDlELCAweDg3LCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk3LCAweDRCLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk3LCAweDY3LCAweDhBLCAweEI3LCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDg4LCAweEFDLCAweDAwLCAweDAwLCAweDlELCAweDg1LCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDlELCAweDgyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhBLCAweEY2LCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDg5LCAweDg3LCAweEVELCAweEFELCAweDlELCAweDg4LCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk3LCAweDY4LCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182NFs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUQsIDB4OEMsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4OTEsIDB4QjksIDB4MDAsIDB4MDAsIDB4OUQsIDB4OTMsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUQsIDB4OEQsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUQsIDB4OEEsIDB4OUQsIDB4OTEsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4OUQsIDB4NzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUQsIDB4OEUsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4OUQsIDB4OTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4OTQsIDB4QzAsIDB4OTMsIDB4OEIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4OUQsIDB4OEIsIDB4MDAsIDB4MDAsIDB4OUQsIDB4OEYsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEMsIDB4NjcsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEQsIDB4RUYsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTAsIDB4REIsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUQsIDB4OTcsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4OTMsIDB4NDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4RUQsIDB4QUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUQsIDB4OTQsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4OTYsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUQsIDB4OTUsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUQsIDB4OTYsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4OTYsIDB4Q0MsIDB4MDAsIDB4MDAsIDB4OTAsIDB4QTAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEMsIDB4ODIsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4OUQsIDB4OUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEUsIDB4NTQsIDB4OUQsIDB4OUEsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4OUQsIDB4OTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTQsIDB4NTEsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4RUQsIDB4QUYsIDB4OTMsIDB4QjMsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4OTMsIDB4NTAsIDB4OUQsIDB4OUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4OUQsIDB4OUMsIDB4MDAsIDB4MDAsIDB4OTUsIDB4OEYsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4OTQsIDB4NjQsIDB4OEUsIDB4NDIsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4OTAsIDB4RUYsIDB4MDAsIDB4MDAsIDB4OTYsIDB4NkYsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4OEEsIDB4NjgsIDB4MDAsIDB4MDAsIDB4OUQsIDB4QTMsIC8qIDB4QjgtMHhCQiAqLworCTB4OUQsIDB4OUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4OTcsIDB4NjksIDB4OUQsIDB4QTUsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4OUQsIDB4QTEsIDB4MDAsIDB4MDAsIDB4OUQsIDB4QTIsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4OTEsIDB4ODAsIDB4RUQsIDB4QjAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUQsIDB4QTAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4OUQsIDB4NUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4OUQsIDB4QTQsIDB4MDAsIDB4MDAsIDB4OUQsIDB4OUYsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4OUQsIDB4QTksIDB4OUQsIDB4QUEsIDB4OTMsIDB4NDYsIDB4OUQsIDB4QUMsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEUsIDB4NDMsIDB4OUQsIDB4QTcsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4OEIsIDB4NUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUQsIDB4QUQsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4OUQsIDB4QTYsIDB4OUQsIDB4QjEsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4OUQsIDB4QjAsIDB4MDAsIDB4MDAsIDB4OUQsIDB4QUYsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUQsIDB4QjIsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4OUQsIDB4QjQsIDB4OEYsIDB4RUYsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzY1WzUxMl0gPSB7CisJMHg5RCwgMHhCMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHg5RCwgMHhCNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHg5RCwgMHhCNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHg5RCwgMHhCNiwgMHg5RCwgMHg5MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RCwgMHhCOSwgLyogMHgyMC0weDIzICovCisJMHg5RCwgMHhCOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RCwgMHg5OCwgMHg5RCwgMHhCQSwgLyogMHgyOC0weDJCICovCisJMHg5RCwgMHhBRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RSwgMHg3OCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHg5RCwgMHhCQiwgMHg5RCwgMHhCQywgMHg5RCwgMHhCRSwgMHg5RCwgMHhCRCwgLyogMHgzNC0weDM3ICovCisJMHg5RCwgMHhCRiwgMHg4OSwgMHhGQywgMHgwMCwgMHgwMCwgMHg4RCwgMHg1NSwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NSwgMHhGQSwgMHg5MCwgMHhBRCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHg4QywgMHhDQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHg5RCwgMHhDMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHg5RCwgMHhDNCwgMHhFRCwgMHhCMSwgMHg5NSwgMHg3MSwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHg4QiwgMHg3RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHg5RCwgMHhDMywgMHg5RCwgMHhDMiwgMHg5NCwgMHg3MywgLyogMHg1NC0weDU3ICovCisJMHg5RCwgMHhDNSwgMHg4QiwgMHhCMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHg5RCwgMHhDNywgMHg5RCwgMHhDNiwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QSwgMHhCOCwgMHg4RSwgMHg1NSwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MywgMHhENiwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHg4QywgMHg2OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHg5MCwgMHg5NCwgMHgwMCwgMHgwMCwgMHg5RCwgMHhDOCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHg5MCwgMHhBRSwgMHg5MywgMHg0NywgMHgwMCwgMHgwMCwgMHg5NSwgMHg3RSwgLyogMHg3NC0weDc3ICovCisJMHg5RCwgMHhDOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RCwgMHhDQSwgMHg5RCwgMHhDQiwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NSwgMHhCNiwgLyogMHg4NC0weDg3ICovCisJMHg5QiwgMHg3QywgMHg5MCwgMHhDNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHg5NSwgMHg2QiwgMHgwMCwgMHgwMCwgMHg4RCwgMHhENiwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHg5NCwgMHhFMywgMHg5NCwgMHhDMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MywgMHg2QywgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHg5NywgMHhCRiwgMHgwMCwgMHgwMCwgMHg5RCwgMHhDRCwgLyogMHg5OC0weDlCICovCisJMHg4RSwgMHhDRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RCwgMHhDRSwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHg4OCwgMHhCNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHg4QiwgMHhEMiwgMHg5MCwgMHhDQiwgMHgwMCwgMHgwMCwgMHg5NSwgMHg4MCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RCwgMHhDRiwgLyogMHhBOC0weEFCICovCisJMHg4RSwgMHg2MSwgMHg5MiwgMHg2NiwgMHgwMCwgMHgwMCwgMHg4RSwgMHg3QSwgLyogMHhBQy0weEFGICovCisJMHg5MCwgMHg1NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RCwgMHhEMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHg5NSwgMHhGQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHg4OSwgMHg5NywgMHg4RSwgMHg3QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHg5RCwgMHhEMywgMHgwMCwgMHgwMCwgMHg5RCwgMHhEMSwgLyogMHhDMC0weEMzICovCisJMHg5RCwgMHhENCwgMHg5NywgMHhCNywgMHg5RCwgMHhEMiwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHhGOSwgLyogMHhDOC0weENCICovCisJMHg5RCwgMHhENSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MSwgMHhCMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RCwgMHhENiwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QSwgMHhGOCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHg5RCwgMHhEOCwgMHgwMCwgMHgwMCwgMHg5RCwgMHhENywgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHg5RCwgMHhEOSwgMHg5RCwgMHhEQSwgMHg4QSwgMHhGOSwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHg5MywgMHhGQSwgMHg5MiwgMHg1NSwgMHg4QiwgMHg4QywgLyogMHhFNC0weEU3ICovCisJMHg4RSwgMHg3QywgMHg5MSwgMHg4MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHg4RiwgMHg3QiwgMHg4OCwgMHhBRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHg5RCwgMHhEQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OSwgMHhBMCwgMHg5RCwgMHhERiwgLyogMHhGOC0weEZCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNjZbNTEyXSA9IHsKKwkweEVELCAweEIyLCAweDAwLCAweDAwLCAweDhELCAweDU2LCAweDlELCAweERFLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhELCAweEE5LCAweDhGLCAweEI4LCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweEVELCAweEI1LCAweDlELCAweERELCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDhGLCAweEI5LCAweDAwLCAweDAwLCAweDk2LCAweEJFLCAweDhELCAweEE4LCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg4LCAweEQ1LCAvKiAweDEwLTB4MTMgKi8KKwkweDkwLCAweENDLCAweEVELCAweEIzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDlELCAweEU0LCAweDAwLCAweDAwLCAweEVELCAweEI3LCAweDkwLCAweEFGLCAvKiAweDFDLTB4MUYgKi8KKwkweDg5LCAweDY2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweEVELCAweEI4LCAweDhGLCAweDc0LCAweDAwLCAweDAwLCAweDk2LCAweDg2LCAvKiAweDI0LTB4MjcgKi8KKwkweDhELCAweEYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDhGLCAweEJBLCAweEVELCAweEI2LCAweDkwLCAweEE1LCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweEVELCAweDQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDlELCAweEUzLCAweDlELCAweEUxLCAweDlELCAweEUyLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweEI0LCAvKiAweDM4LTB4M0IgKi8KKwkweDkyLCAweDhCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlFLCAweDQ1LCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDlELCAweEU4LCAweDhFLCAweDlFLCAweDhELCAweDU3LCAvKiAweDQwLTB4NDMgKi8KKwkweDlELCAweEU2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDlELCAweEU3LCAweDAwLCAweDAwLCAweDkwLCAweDU3LCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlELCAweEU1LCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhFLCAweDRFLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweEJBLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweEVELCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDlELCAweEVBLCAweDlELCAweEU5LCAweDlELCAweEVFLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlELCAweEVGLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDlELCAweEVCLCAweEVELCAweEI5LCAweDhBLCAweDQxLCAweDlELCAweEVDLCAvKiAweDY0LTB4NjcgKi8KKwkweDlELCAweEVELCAweDk0LCAweEQzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk1LCAweDgxLCAweDhDLCAweDY5LCAvKiAweDZDLTB4NkYgKi8KKwkweDlELCAweEYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweEJELCAvKiAweDcwLTB4NzMgKi8KKwkweDkwLCAweEIwLCAweDAwLCAweDAwLCAweDhGLCAweEJCLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweDcxLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDhCLCAweEM1LCAweDAwLCAweDAwLCAweDlELCAweEYxLCAvKiAweDgwLTB4ODMgKi8KKwkweDlELCAweEY1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg5LCAweEM5LCAvKiAweDg0LTB4ODcgKi8KKwkweDlELCAweEYyLCAweDlELCAweEY0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlELCAweEYzLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDhGLCAweDhCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweDY3LCAweDg4LCAweEMzLCAvKiAweDk0LTB4OTcgKi8KKwkweDlELCAweEY2LCAweEVELCAweEJFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDlELCAweEY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweEVELCAweEJGLCAweDAwLCAweDAwLCAweDkyLCAweEE4LCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk3LCAweEVGLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhFLCAweDYyLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk1LCAweEU5LCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweEMwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDk2LCAweDVDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDlFLCAweDQxLCAweDlELCAweEY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDlELCAweEZDLCAweDAwLCAweDAwLCAweDlELCAweEZCLCAweEVELCAweEMxLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDlELCAweEY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDlFLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkzLCAweERDLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDlELCAweEZBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlFLCAweDQyLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDhGLCAweDhDLCAweDlFLCAweDQzLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDk3LCAweDZBLCAweDk0LCAweDk4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDlFLCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlFLCAweDQ2LCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDlFLCAweDQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDlFLCAweDQ4LCAweDAwLCAweDAwLCAweDhCLCAweEM4LCAweDg5LCAweDY3LCAvKiAweEYwLTB4RjMgKi8KKwkweDhELCAweDU4LCAweDlFLCAweDQ5LCAweDAwLCAweDAwLCAweDlFLCAweDRBLCAvKiAweEY0LTB4RjcgKi8KKwkweDhGLCAweDkxLCAweDkxLCAweDgyLCAweEVELCAweEMyLCAweEVELCAweDRBLCAvKiAweEY4LTB4RkIgKi8KKwkweDk5LCAweEQ2LCAweDkxLCAweDVELCAweDkxLCAweDVDLCAweDkxLCAweEQ2LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182N1s1MTJdID0geworCTB4OEQsIDB4QzUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTgsIDB4RjAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4OEMsIDB4OEUsIDB4OTcsIDB4NEMsIDB4MDAsIDB4MDAsIDB4OTUsIDB4RkMsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4OTUsIDB4OUUsIDB4RUQsIDB4QzMsIDB4OUUsIDB4NEIsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4OEQsIDB4RjEsIDB4OTIsIDB4QkQsIDB4OUUsIDB4NEMsIDB4OTgsIDB4NEUsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTYsIDB4NUQsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4OTIsIDB4QTksIDB4OUUsIDB4NEQsIDB4OEEsIDB4RkEsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUUsIDB4NEUsIDB4OUUsIDB4NEYsIC8qIDB4MjQtMHgyNyAqLworCTB4OTYsIDB4RDgsIDB4MDAsIDB4MDAsIDB4OTYsIDB4QTIsIDB4OTYsIDB4OTYsIC8qIDB4MjgtMHgyQiAqLworCTB4OTYsIDB4N0IsIDB4OEUsIDB4NDQsIDB4OUUsIDB4NTEsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4OEUsIDB4RTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4OTYsIDB4NzAsIDB4MDAsIDB4MDAsIDB4OUUsIDB4NTMsIDB4OUUsIDB4NTYsIC8qIDB4MzQtMHgzNyAqLworCTB4OUUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4OEEsIDB4RjcsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4OEIsIDB4ODAsIDB4MDAsIDB4MDAsIDB4OUUsIDB4NTIsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4OUUsIDB4NTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUUsIDB4NTcsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4OTAsIDB4OTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTcsIDB4OUIsIDB4ODgsIDB4QzcsIC8qIDB4NEMtMHg0RiAqLworCTB4OEQsIDB4REUsIDB4OTEsIDB4QkEsIDB4MDAsIDB4MDAsIDB4OEUsIDB4REIsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEYsIDB4RjEsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4OUUsIDB4NUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4OTMsIDB4NkQsIDB4MDAsIDB4MDAsIDB4OUUsIDB4NTgsIDB4OTEsIDB4QTksIC8qIDB4NUMtMHg1RiAqLworCTB4OUUsIDB4NTksIDB4OEYsIDB4RjAsIDB4OTYsIDB4REIsIDB4OUUsIDB4NUIsIC8qIDB4NjAtMHg2MyAqLworCTB4OUUsIDB4NUMsIDB4OTcsIDB4ODgsIDB4RUQsIDB4QzUsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUUsIDB4NjEsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4OEQsIDB4NTksIDB4MDAsIDB4MDAsIDB4OTQsIDB4NzQsIC8qIDB4NkMtMHg2RiAqLworCTB4OUUsIDB4NUUsIDB4OTMsIDB4OEMsIDB4OUQsIDB4REMsIDB4OUQsIDB4RTAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4OEIsIDB4NkUsIDB4MDAsIDB4MDAsIDB4OTQsIDB4NjYsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4OUUsIDB4NjAsIDB4MDAsIDB4MDAsIDB4OEYsIDB4QkMsIDB4OTQsIDB4QzIsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4OUUsIDB4NjYsIDB4MDAsIDB4MDAsIDB4OTQsIDB4RjgsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4OUUsIDB4NUQsIDB4MDAsIDB4MDAsIDB4OUUsIDB4NjMsIC8qIDB4ODgtMHg4QiAqLworCTB4OUUsIDB4NjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4OTAsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4OTYsIDB4OEQsIDB4MDAsIDB4MDAsIDB4OTcsIDB4RDEsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTYsIDB4ODcsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4ODksIDB4Q0EsIDB4OEUsIDB4N0QsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4OTgsIDB4NjcsIDB4OUUsIDB4NjUsIDB4OTAsIDB4OTUsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUUsIDB4NjQsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4OUUsIDB4NUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEMsIDB4Q0QsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUUsIDB4NkIsIC8qIDB4QjAtMHhCMyAqLworCTB4OUUsIDB4NjksIDB4MDAsIDB4MDAsIDB4ODksIDB4Q0IsIDB4OUUsIDB4NjcsIC8qIDB4QjQtMHhCNyAqLworCTB4OUUsIDB4NkQsIDB4OUUsIDB4NzMsIDB4MDAsIDB4MDAsIDB4RUQsIDB4QzYsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4RUQsIDB4QzgsIDB4OTEsIDB4QzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4OTUsIDB4QkYsIDB4MDAsIDB4MDAsIDB4OUUsIDB4NzUsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTUsIDB4NDEsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUUsIDB4NzQsIDB4OTQsIDB4OTAsIC8qIDB4Q0MtMHhDRiAqLworCTB4OTYsIDB4NUUsIDB4OEEsIDB4QjksIDB4MDAsIDB4MDAsIDB4OTAsIDB4RjUsIC8qIDB4RDAtMHhEMyAqLworCTB4OEYsIDB4NUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4OTIsIDB4RDEsIDB4MDAsIDB4MDAsIDB4OTcsIDB4NEQsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4OUUsIDB4NzAsIDB4OUUsIDB4NkYsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUUsIDB4NzEsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4OUUsIDB4NkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUUsIDB4NzYsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4OUUsIDB4NkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4OUUsIDB4NkEsIDB4MDAsIDB4MDAsIDB4OUUsIDB4NzIsIDB4OUUsIDB4NjgsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4OTIsIDB4OEMsIDB4MDAsIDB4MDAsIDB4OTYsIDB4RjYsIC8qIDB4RjAtMHhGMyAqLworCTB4OEUsIDB4QzQsIDB4OEQsIDB4RjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEQsIDB4QjgsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTYsIDB4OEYsIDB4OEEsIDB4NjAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzY4WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHhFRCwgMHhDOSwgMHg5MiwgMHhDQywgMHg5MywgMHhDOCwgLyogMHgwMC0weDAzICovCisJMHg4OSwgMHg2OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHhGMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHhCMiwgMHg4QywgMHg0OSwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RSwgMHg3OCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHg4RCwgMHg1QSwgMHg4QSwgMHg5QywgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHg5RSwgMHg3QSwgMHg4QSwgMHg5NCwgMHg5RSwgMHg4MSwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RSwgMHg3RCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHg5MCwgMHhGMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHg4QSwgMHg2QSwgMHg4RCwgMHhBQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHg4QSwgMHg2OSwgMHg4RCwgMHhDRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHg5RSwgMHg3QiwgMHg4QywgMHg4NSwgMHg4QywgMHg2QSwgMHg5MywgMHg4RCwgLyogMHg0MC0weDQzICovCisJMHhFRCwgMHhDQSwgMHgwMCwgMHgwMCwgMHg5RSwgMHg3OSwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHg4OCwgMHhDNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHg5RSwgMHg3QywgMHg5RSwgMHg3RSwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHg4QiwgMHhDQiwgMHg4QywgMHg0QiwgMHhFRCwgMHhDNywgMHg4QSwgMHhCQSwgLyogMHg1MC0weDUzICovCisJMHg4QiwgMHg2QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHg5RSwgMHg4MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHg4RCwgMHhGNywgMHg5NiwgMHg5MSwgMHgwMCwgMHgwMCwgMHg4RSwgMHg1NiwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RSwgMHg4MywgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NSwgMHg0RiwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHg5RSwgMHg4RiwgMHgwMCwgMHgwMCwgMHg4OSwgMHhCMSwgMHg5RSwgMHg4NCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RSwgMHg5NSwgMHg5RSwgMHg4NSwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHg5NywgMHhDMCwgMHgwMCwgMHgwMCwgMHg5RSwgMHg4QywgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHg5NCwgMHg3RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHg5RSwgMHg5NCwgMHgwMCwgMHgwMCwgMHg5RSwgMHg4NywgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHhCMiwgLyogMHg5MC0weDkzICovCisJMHg5RSwgMHg4OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RCwgMHg1QiwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RSwgMHg4QiwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHg5RSwgMHg4QSwgMHgwMCwgMHgwMCwgMHg5RSwgMHg4NiwgLyogMHg5Qy0weDlGICovCisJMHg5RSwgMHg5MSwgMHgwMCwgMHgwMCwgMHg4RiwgMHhCRCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QSwgMHhFQiwgMHg4QywgMHhFNiwgLyogMHhBNC0weEE3ICovCisJMHg5NywgMHg5QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHg5RSwgMHg4OCwgMHgwMCwgMHgwMCwgMHg5MiwgMHhGMiwgLyogMHhBQy0weEFGICovCisJMHg4QSwgMHg0MiwgMHg4RCwgMHhBQiwgMHgwMCwgMHgwMCwgMHg5RSwgMHg4MCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHg5RSwgMHg5MCwgMHg4QSwgMHg4MSwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHg5RSwgMHg4RSwgMHg5RSwgMHg5MiwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHg5MywgMHg4RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHg4QSwgMHhGQywgMHgwMCwgMHgwMCwgMHg5RSwgMHhCMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHhFRCwgMHg0OCwgMHg5NiwgMHhDNywgMHg5RSwgMHg5NywgMHg4QSwgMHhGQiwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHg5RSwgMHg5RSwgMHgwMCwgMHgwMCwgMHhFRCwgMHhDQiwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NiwgMHg1RiwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHg5RSwgMHg5RiwgMHg5RSwgMHhBMSwgMHgwMCwgMHgwMCwgMHg5RSwgMHhBNSwgLyogMHhENC0weEQ3ICovCisJMHg5RSwgMHg5OSwgMHgwMCwgMHgwMCwgMHg5MiwgMHg0OSwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MywgMHg4RiwgLyogMHhEQy0weERGICovCisJMHg5RSwgMHhBOSwgMHg5RSwgMHg5QywgMHgwMCwgMHgwMCwgMHg5RSwgMHhBNiwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RSwgMHhBMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHg1OCwgMHg5RSwgMHhBQSwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHhCMSwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHg5RSwgMHhBOCwgMHg4QSwgMHhCQiwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNjlbNTEyXSA9IHsKKwkweDk4LCAweDZGLCAweDlFLCAweDk2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDlFLCAweEE0LCAweDg4LCAweEQ2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDlFLCAweDk4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk2LCAweEI4LCAvKiAweDA4LTB4MEIgKi8KKwkweDlFLCAweDlELCAweDkwLCAweDQxLCAweDkyLCAweEM1LCAweDlFLCAweDkzLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlFLCAweEEzLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDkwLCAweDlBLCAweDlFLCAweEFELCAweDhBLCAweDkxLCAvKiAweDE4LTB4MUIgKi8KKwkweDhDLCAweDlGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDlFLCAweEFGLCAweDlFLCAweDlBLCAweDlFLCAweEFFLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDlFLCAweEE3LCAweDlFLCAweDlCLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDlFLCAweEFCLCAweDAwLCAweDAwLCAweDlFLCAweEFDLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDlFLCAweEJELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDkzLCAweENDLCAweDAwLCAweDAwLCAweDlFLCAweEEyLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDlFLCAweEI5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDlFLCAweEJCLCAweDAwLCAweDAwLCAweDkyLCAweEQ2LCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk3LCAweDZCLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk1LCAweDk2LCAvKiAweDUwLTB4NTMgKi8KKwkweDlFLCAweEI2LCAweDkxLCAweEM4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDlFLCAweEJDLCAweDkxLCAweDVFLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDlFLCAweEIzLCAweDlFLCAweEMwLCAweDlFLCAweEJGLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDkzLCAweEVELCAweDlFLCAweEJFLCAweDkzLCAweEU4LCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweEVELCAweENELCAweDAwLCAweDAwLCAweDlFLCAweEMyLCAweDlFLCAweEI1LCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDhCLCAweEM2LCAweDlFLCAweEI4LCAweDhGLCAweDdDLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk0LCAweDgwLCAvKiAweDcwLTB4NzMgKi8KKwkweDlFLCAweEJBLCAweDhCLCAweEM5LCAweDAwLCAweDAwLCAweDlFLCAweEIyLCAvKiAweDc0LTB4NzcgKi8KKwkweDlFLCAweEI0LCAweDlFLCAweEIxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDk4LCAweDRGLCAweDhBLCAweDc5LCAweDlFLCAweEI3LCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDlFLCAweEMxLCAweDhBLCAweDU0LCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhELCAweEU1LCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg5LCAweDdDLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDlFLCAweEQyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDk4LCAweDUwLCAweDlFLCAweEQ1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweEVELCAweENGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkwLCAweDU5LCAvKiAweDk4LTB4OUIgKi8KKwkweDlFLCAweEQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDlFLCAweEQzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlFLCAweEQwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlFLCAweEM0LCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDlFLCAweEUxLCAweDlFLCAweEMzLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDlFLCAweEQ2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlFLCAweENFLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlFLCAweEM5LCAweDlFLCAweEM2LCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDlFLCAweEM3LCAweDAwLCAweDAwLCAweDlFLCAweENGLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweEEwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlFLCAweENDLCAweDhELCAweDVDLCAvKiAweEM4LTB4Q0IgKi8KKwkweDkyLCAweEM2LCAweDkxLCAweDg0LCAweDlFLCAweENBLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDlFLCAweEM1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlFLCAweEM4LCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDk3LCAweDZDLCAweDk2LCAweDhBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDlFLCAweENELCAweDlFLCAweEQ3LCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweEQwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlFLCAweERGLCAvKiAweEU0LTB4RTcgKi8KKwkweDlFLCAweEQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlFLCAweEU1LCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDlFLCAweEUzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlFLCAweERFLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDlFLCAweERELCAweDAwLCAweDAwLCAweDkyLCAweENFLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDkxLCAweDg1LCAweDAwLCAweDAwLCAweDlFLCAweERCLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182QVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUUsIDB4RDksIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4OUUsIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUUsIDB4RTYsIDB4OTQsIDB4RjMsIC8qIDB4MDgtMHgwQiAqLworCTB4OUUsIDB4RUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUUsIDB4RTcsIDB4OUUsIDB4RUEsIC8qIDB4MTAtMHgxMyAqLworCTB4OUUsIDB4RTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4OTQsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4OTUsIDB4NTcsIDB4MDAsIDB4MDAsIDB4OUUsIDB4REEsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUUsIDB4RTIsIDB4OEYsIDB4QkUsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4OTYsIDB4Q0QsIDB4OUUsIDB4RjYsIDB4OUUsIDB4RTksIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4OEMsIDB4QTAsIDB4ODksIDB4QTEsIDB4OEEsIDB4N0UsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUUsIDB4RDEsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4RUQsIDB4RDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4OEYsIDB4QkYsIDB4OUUsIDB4RUUsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4OUUsIDB4RjUsIDB4OEUsIDB4RjcsIDB4OEEsIDB4OTIsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4OTIsIDB4NEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4OUUsIDB4RUIsIDB4MDAsIDB4MDAsIDB4RUQsIDB4RDMsIDB4OUUsIDB4RjAsIC8qIDB4NDQtMHg0NyAqLworCTB4OUUsIDB4RjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEIsIDB4QjQsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4OEIsIDB4NkIsIDB4OUUsIDB4RjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEIsIDB4NDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4OTMsIDB4QzksIDB4OUUsIDB4RjEsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUUsIDB4RjMsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4RDIsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUUsIDB4RUQsIDB4RUQsIDB4RDQsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4OUUsIDB4RUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4RDUsIDB4OEEsIDB4ODAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4OTIsIDB4NjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4OUUsIDB4RkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4OUUsIDB4RjgsIDB4OEMsIDB4RTcsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4OUUsIDB4RjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4NDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4OUUsIDB4NzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4OUUsIDB4RjksIDB4MDAsIDB4MDAsIDB4OUUsIDB4RkIsIDB4OUUsIDB4RkMsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4NEIsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4OUYsIDB4NDcsIDB4MDAsIDB4MDAsIDB4OUUsIDB4OEQsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4NDYsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4OUYsIDB4NDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4NDIsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4OUUsIDB4RTgsIDB4OUYsIDB4NDQsIDB4OUYsIDB4NDMsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4OUYsIDB4NDksIDB4MDAsIDB4MDAsIDB4OTgsIDB4NDUsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4NEMsIDB4OEIsIDB4RjksIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4NDgsIDB4OUYsIDB4NEEsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4RDYsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4RUQsIDB4RDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4OTQsIDB4QTUsIDB4MDAsIDB4MDAsIDB4OUYsIDB4NEQsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4NTEsIDB4OUYsIDB4NEUsIC8qIDB4RjgtMHhGQiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzZCWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHg5NywgMHg5MywgMHg5RiwgMHg0RiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RSwgMHhEQywgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHg1MiwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHg1MywgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHg4OSwgMHg1NCwgMHgwMCwgMHgwMCwgMHg5RiwgMHg1NSwgLyogMHgxQy0weDFGICovCisJMHg4QywgMHg4NywgMHg4RSwgMHg5RiwgMHgwMCwgMHgwMCwgMHg4QiwgMHhEMywgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OSwgMHhBMiwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NywgMHg3RSwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHg1NywgLyogMHgzNC0weDM3ICovCisJMHg5RiwgMHg1NiwgMHg5RiwgMHg1OSwgMHg4QiwgMHg1QywgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHg4QiwgMHhENCwgMHg4QSwgMHhCQywgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHg1QywgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHg1QiwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHg5RiwgMHg1RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHg4OSwgMHhDQywgMHgwMCwgMHgwMCwgMHg5MiwgMHg1NiwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHg5RiwgMHg1RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QSwgMHhCRCwgLyogMHg1MC0weDUzICovCisJMHg5RiwgMHg2MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHg5RiwgMHg1RiwgMHgwMCwgMHgwMCwgMHg5RiwgMHg2MSwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHg2MiwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHg5RiwgMHg2MywgMHg4RSwgMHg3RSwgMHg5MCwgMHhCMywgLyogMHg2MC0weDYzICovCisJMHg4RCwgMHg5RiwgMHgwMCwgMHgwMCwgMHg5NSwgMHg5MCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHg5NSwgMHhFMCwgMHg5OCwgMHg2MywgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RSwgMHg5NSwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RCwgMHhDRSwgLyogMHg3MC0weDczICovCisJMHg5NywgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHg5RiwgMHg2NCwgMHg5RiwgMHg2NSwgMHgwMCwgMHgwMCwgMHg4RSwgMHg4MCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHg2NiwgLyogMHg3Qy0weDdGICovCisJCisJMHg5RiwgMHg2NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHg2OSwgLyogMHg4MC0weDgzICovCisJMHg5RiwgMHg2OCwgMHgwMCwgMHgwMCwgMHg5NiwgMHg3NywgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHg4RiwgMHg3RCwgMHg4RSwgMHhFQSwgMHg4RSwgMHg2MywgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHg5RiwgMHg2QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHg5RiwgMHg2QywgMHg5MCwgMHg0MiwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHg5RiwgMHg2QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHg2RCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHg5RiwgMHg2RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHg2RiwgMHg5RiwgMHg3MCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHg3MSwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHg5RiwgMHg3MywgMHg5RiwgMHg3MiwgMHg5RiwgMHg3NCwgLyogMHhCMC0weEIzICovCisJMHg4OSwgMHhBMywgMHg5MiwgMHg2OSwgMHgwMCwgMHgwMCwgMHg5RiwgMHg3NSwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RSwgMHg0NSwgMHg4QSwgMHg2QiwgLyogMHhCOC0weEJCICovCisJMHg5RiwgMHg3NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MywgMHg2MSwgLyogMHhCQy0weEJGICovCisJMHg5QSwgMHhDQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHg4QiwgMHg0MiwgMHg5RiwgMHg3NywgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHg3OCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHg5NSwgMHhFQSwgMHg5NiwgMHg4OCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MywgMHhDNSwgMHg5RiwgMHg3OSwgLyogMHhEMC0weEQzICovCisJMHg5NCwgMHhFNCwgMHgwMCwgMHgwMCwgMHhFRCwgMHhEOCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHg5NCwgMHhGOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NiwgMHhEMSwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHg3QSwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHg3QywgLyogMHhFOC0weEVCICovCisJMHg5RiwgMHg3QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHg3RSwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHg3RCwgLyogMHhGMC0weEYzICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNkNbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDlGLCAweDgxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhFLCAweDgxLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDk2LCAweEFGLCAweDAwLCAweDAwLCAweDlGLCAweDgyLCAvKiAweDEwLTB4MTMgKi8KKwkweDlGLCAweDgzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhCLCAweDQzLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlGLCAweDg0LCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlGLCAweDg2LCAvKiAweDIwLTB4MjMgKi8KKwkweDlGLCAweDg1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDkwLCAweDg1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk1LCAweDU4LCAvKiAweDM0LTB4MzcgKi8KKwkweDg5LCAweDY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk0LCAweEMzLCAweEVELCAweEQ5LCAvKiAweDNDLTB4M0YgKi8KKwkweDkyLCAweEYzLCAweDhGLCAweDYwLCAweDhCLCAweDgxLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk0LCAweEM0LCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDhFLCAweEFDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDlGLCAweDg4LCAweDAwLCAweDAwLCAweDhBLCAweEJFLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg5LCAweDk4LCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweEVELCAweERBLCAweDkzLCAweEYwLCAweDlGLCAweDg3LCAweDhELCAweDVELCAvKiAweDVDLTB4NUYgKi8KKwkweDkyLCAweDcyLCAweDAwLCAweDAwLCAweDlGLCAweDg5LCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDlGLCAweDkxLCAweDAwLCAweDAwLCAweDlGLCAweDhBLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweERDLCAvKiAweDZDLTB4NkYgKi8KKwkweDkxLCAweEJGLCAweDAwLCAweDAwLCAweDhCLCAweDgyLCAweDlGLCAweDkyLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhDLCAweDg4LCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDhCLCAweDQ0LCAweDlGLCAweDkwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDlGLCAweDhFLCAweDlGLCAweDhCLCAweDk3LCAweDgwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweERCLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDkyLCAweEJFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDkzLCAweEQ3LCAweDlGLCAweDhDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDlGLCAweDk0LCAweDAwLCAweDAwLCAweDlGLCAweDkzLCAweDhDLCAweDQyLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg5LCAweEFCLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDhELCAweEI5LCAweDlGLCAweDhELCAweDlGLCAweDhGLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDk2LCAweDc2LCAweDkxLCAweEYyLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk2LCAweDk3LCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlGLCAweDlDLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDlGLCAweDlELCAweDAwLCAweDAwLCAweDg5LCAweENELCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDk1LCAweEE2LCAweDk2LCAweEZCLCAweDlGLCAweDlGLCAweDhFLCAweEExLCAvKiAweEI4LTB4QkIgKi8KKwkweDhGLCAweEMwLCAweDlGLCAweDk4LCAweDlGLCAweDlFLCAweDg5LCAweDg4LCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDhCLCAweEI1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDlGLCAweDk1LCAweDlGLCAweDlBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDkwLCAweEYyLCAweDk0LCAweDkxLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDk0LCAweEU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlGLCAweDk3LCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDk2LCAweDQwLCAweDAwLCAweDAwLCAweDlGLCAweDk5LCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDlGLCAweEEyLCAweEVELCAweERELCAweDlGLCAweEEwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDlGLCAweDlCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDk2LCAweDQxLCAweDk0LCAweDY3LCAweDhCLCAweDgzLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDkzLCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDkyLCAweDhELCAweDAwLCAweDAwLCAweDlGLCAweEEzLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlGLCAweEExLCAvKiAweEVDLTB4RUYgKi8KKwkweDkxLCAweEQ3LCAweDlGLCAweDk2LCAweDAwLCAweDAwLCAweDg5LCAweDZBLCAvKiAweEYwLTB4RjMgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182RFs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4RUQsIDB4REUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTcsIDB4NkQsIC8qIDB4MDgtMHgwQiAqLworCTB4OUYsIDB4QUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4QUQsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTAsIDB4RjQsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4OUYsIDB4QUEsIDB4MDAsIDB4MDAsIDB4OTcsIDB4OEMsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTMsIDB4QjQsIDB4OUYsIDB4QTQsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4OTIsIDB4QzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4ODksIDB4NkIsIDB4OEQsIDB4NUUsIDB4OUYsIDB4QTcsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEYsIDB4NDYsIDB4OUYsIDB4QUMsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4OUYsIDB4QUIsIDB4OUYsIDB4QTYsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4OUYsIDB4QTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEEsIDB4ODgsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4OUYsIDB4QTgsIDB4OTQsIDB4NjgsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4OTcsIDB4QUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4OEYsIDB4RjIsIDB4OTAsIDB4RjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4OUYsIDB4QjQsIDB4OUYsIDB4QjIsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4OTUsIDB4NkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4QUYsIC8qIDB4NjAtMHg2MyAqLworCTB4OUYsIDB4QjEsIDB4MDAsIDB4MDAsIDB4ODksIDB4NTksIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4OEQsIDB4NUYsIDB4OTgsIDB4NTEsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4OEEsIDB4NUMsIDB4MDAsIDB4MDAsIDB4OTUsIDB4ODIsIDB4RUQsIDB4RTAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4OTcsIDB4ODEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEEsIDB4NDMsIC8qIDB4NzQtMHg3NyAqLworCTB4OTAsIDB4NUEsIDB4OUYsIDB4QjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4OUYsIDB4QjgsIDB4MDAsIDB4MDAsIDB4RUQsIDB4REYsIC8qIDB4ODQtMHg4NyAqLworCTB4OEYsIDB4QzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4OTcsIDB4NEYsIDB4MDAsIDB4MDAsIDB4OUYsIDB4QjUsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4QjAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4OUYsIDB4QjYsIDB4RUQsIDB4RTEsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4OTcsIDB4REMsIDB4MDAsIDB4MDAsIDB4OTMsIDB4OTMsIC8qIDB4OTgtMHg5QiAqLworCTB4OTMsIDB4QzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4RUQsIDB4RTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEEsIDB4NTUsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4NzQsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4OUYsIDB4QkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4OUYsIDB4QkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4OTcsIDB4QzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4OTcsIDB4ODQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4OUYsIDB4QzYsIDB4OUYsIDB4QzAsIDB4OUYsIDB4QkQsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTcsIDB4RDIsIC8qIDB4QzgtMHhDQiAqLworCTB4OUYsIDB4QzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4RTMsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4OEYsIDB4NjksIDB4OUYsIDB4QzUsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4OUYsIDB4Q0EsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4OTMsIDB4OTEsIDB4OUYsIDB4QzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUYsIDB4QzIsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4OTIsIDB4NTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4OUYsIDB4QzksIDB4MDAsIDB4MDAsIDB4OUYsIDB4QkUsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4OUYsIDB4QzQsIDB4MDAsIDB4MDAsIDB4OUYsIDB4Q0IsIDB4ODgsIDB4RkEsIC8qIDB4RTgtMHhFQiAqLworCTB4OUYsIDB4QzEsIDB4MDAsIDB4MDAsIDB4OUYsIDB4Q0MsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4OTAsIDB4NUIsIDB4RUQsIDB4RTUsIDB4OEYsIDB4N0UsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4OTUsIDB4QTMsIDB4MDAsIDB4MDAsIDB4OEQsIDB4QUMsIC8qIDB4RjQtMHhGNyAqLworCTB4RUQsIDB4RTQsIDB4OUYsIDB4QjksIDB4OUYsIDB4QzcsIDB4OTMsIDB4NTksIC8qIDB4RjgtMHhGQiAqLworCTB4RUQsIDB4RTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzZFWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHg5MCwgMHhCNCwgMHgwMCwgMHgwMCwgMHg4QSwgMHg4OSwgLyogMHgwNC0weDA3ICovCisJMHg4RCwgMHhDRiwgMHg4RiwgMHhDMiwgMHg5RiwgMHhCQiwgMHg4RiwgMHg2MSwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QywgMHg2QiwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHg5RiwgMHhCQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHg5RiwgMHhEMCwgMHg4RiwgMHg4RCwgMHg4QywgMHhCOCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHg5RiwgMHhERiwgMHgwMCwgMHgwMCwgMHg5RiwgMHhEOSwgLyogMHgxQy0weDFGICovCisJMHg4QiwgMHg5NCwgMHg5MywgMHg2RSwgMHgwMCwgMHgwMCwgMHg5RiwgMHhENCwgLyogMHgyMC0weDIzICovCisJMHg5RiwgMHhERCwgMHg4OCwgMHhBRCwgMHg4OSwgMHg1MSwgMHhFRCwgMHhFOSwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHg4OSwgMHhCNywgMHgwMCwgMHgwMCwgMHg5RiwgMHhENiwgLyogMHgyOC0weDJCICovCisJMHg5MSwgMHhBQSwgMHg5RiwgMHhDRCwgMHg5RiwgMHhDRiwgMHg4RCwgMHg2MCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHg5RiwgMHhFMCwgMHhFRCwgMHhFNywgMHg5RiwgMHhEQiwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHhFRCwgMHhFQSwgMHgwMCwgMHgwMCwgMHg5RiwgMHhEMywgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHhEQSwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NiwgMHhBOSwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHg5RiwgMHhEOCwgMHg5RiwgMHhEQywgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QywgMHhDRSwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHg4RiwgMHhDMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHg1OCwgLyogMHg1OC0weDVCICovCisJMHhFRCwgMHhFOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHhEMiwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NywgMHg0RSwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHhENSwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHhDRSwgMHg5MywgMHg5MiwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHhEMSwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHhENywgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OCwgMHg3MCwgMHg4RSwgMHhCQywgLyogMHg3Qy0weDdGICovCisJCisJMHg5NiwgMHg5RSwgMHgwMCwgMHgwMCwgMHg5RiwgMHhFMSwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHg5NCwgMHhBQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHhFRCwgLyogMHg4Qy0weDhGICovCisJMHg4QywgMHhCOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RiwgMHg4MCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHg5RiwgMHhFMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHg5NywgMHhBRCwgMHg4RCwgMHg2MSwgMHgwMCwgMHgwMCwgMHg5RiwgMHhGMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHhFQywgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHg5RiwgMHhFRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHhFMiwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHhFOCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHhFQSwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NywgMHg2RSwgMHg5RiwgMHhFNSwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MywgMHg0RCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHg5RiwgMHhFNywgMHgwMCwgMHgwMCwgMHhFRCwgMHhFQiwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHhFRiwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHg5RiwgMHhFOSwgMHg5NiwgMHhDNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHg5RiwgMHhFNCwgMHgwMCwgMHgwMCwgMHg4RSwgMHhBMCwgLyogMHhDOC0weENCICovCisJMHg5RiwgMHhGQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHg4QSwgMHg4QSwgMHgwMCwgMHgwMCwgMHg5RiwgMHhFNiwgLyogMHhEMC0weEQzICovCisJMHg5RiwgMHhFQiwgMHg5RiwgMHhFQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHg5MSwgMHhFQSwgMHg5MSwgMHhEOCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHg5RiwgMHhGNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHhGQSwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHhGOCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHg5MywgMHg0OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHg0MiwgLyogMHhGNC0weEY3ICovCisJMHg5RiwgMHhGNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHhGNiwgMHg5RiwgMHhERSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNkZbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDhCLCAweDk5LCAweDk1LCAweDU5LCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhFLCAweEJELCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDhELCAweDk3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk4LCAweDUyLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDlGLCAweEYyLCAweDAwLCAweDAwLCAweEUwLCAweDQxLCAvKiAweDEwLTB4MTMgKi8KKwkweDg5LCAweDg5LCAweDkxLCAweDg2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDk0LCAweDk5LCAweDAwLCAweDAwLCAweDhBLCAweEJGLCAweDk3LCAweEY4LCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk2LCAweDlGLCAvKiAweDI4LTB4MkIgKi8KKwkweDkyLCAweEQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDlGLCAweEY5LCAweDlGLCAweEZCLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDkxLCAweDUxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweDQwLCAweDlGLCAweEY3LCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDlGLCAweEYxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDhBLCAweEMxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDhDLCAweDg5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweEUwLCAweDRFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweDQ5LCAvKiAweDU4LTB4NUIgKi8KKwkweDkwLCAweEY2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhBLCAweDgzLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDhGLCAweDgxLCAweDAwLCAweDAwLCAweEUwLCAweDUyLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweDRCLCAweDkyLCAweEFBLCAweEUwLCAweDQ4LCAvKiAweDZDLTB4NkYgKi8KKwkweDkyLCAweEQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweEUwLCAweDZCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweEUwLCAweDQ1LCAweDAwLCAweDAwLCAweEUwLCAweDQ0LCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweEUwLCAweDRELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEUwLCAweDQ3LCAweEUwLCAweDQ2LCAweEUwLCAweDRDLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDkwLCAweDlGLCAweDAwLCAweDAwLCAweEUwLCAweDQzLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweEVELCAweEVDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweDRGLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweDUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhBLCAweEMwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweDU1LCAweDAwLCAweDAwLCAweEUwLCAweDU0LCAvKiAweEEwLTB4QTMgKi8KKwkweEUwLCAweDU2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweDU5LCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDkzLCAweDYyLCAweDAwLCAweDAwLCAweEUwLCAweDUzLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweEVELCAweEVELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweDU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDhDLCAweDgzLCAweDkxLCAweEY3LCAweEUwLCAweDUxLCAweDk0LCAweDVBLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweDU4LCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweEUwLCAweDVELCAweEUwLCAweDVCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweEUwLCAweDVFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweDYxLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweDVBLCAvKiAweERDLTB4REYgKi8KKwkweDhELCAweDhBLCAweDk0LCAweDQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDlGLCAweEI3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk3LCAweDk0LCAvKiAweEU4LTB4RUIgKi8KKwkweEUwLCAweDVDLCAweDAwLCAweDAwLCAweEUwLCAweDYwLCAweDkxLCAweEYzLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweDVGLCAweDAwLCAweDAwLCAweEUwLCAweDRBLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweEVELCAweEVFLCAweEU4LCAweDg5LCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweDY0LCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweDY4LCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183MFs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4RTAsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4RUQsIDB4RUYsIDB4MDAsIDB4MDAsIDB4RUQsIDB4RjAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4NjIsIDB4MDAsIDB4MDAsIDB4RTAsIDB4NjMsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4NjcsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4NjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4OTUsIDB4NkQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4RTAsIDB4NkQsIDB4MDAsIDB4MDAsIDB4RTAsIDB4NkEsIDB4RTAsIDB4NjksIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4NkMsIDB4OTMsIDB4RDIsIDB4RTAsIDB4NkUsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4OTUsIDB4OTEsIDB4RUIsIC8qIDB4MjQtMHgyNyAqLworCTB4RUQsIDB4RjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4OTAsIDB4QTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4RTAsIDB4NkYsIDB4MDAsIDB4MDAsIDB4RTAsIDB4NzEsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4NzAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4OUYsIDB4RjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4NzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4OTMsIDB4RTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4NzMsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4Q0UsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTMsIDB4OTQsIC8qIDB4NkMtMHg2RiAqLworCTB4OEEsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4OEIsIDB4ODQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4OEUsIDB4REMsIDB4OEQsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4RUQsIDB4RjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4OTgsIDB4NDYsIDB4OTAsIDB4ODYsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4OEEsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4NzUsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4NzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4RjMsIC8qIDB4QTgtMHhBQiAqLworCTB4RTAsIDB4NzgsIDB4OTIsIDB4NTksIDB4RTAsIDB4N0IsIDB4RTAsIDB4NzYsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4N0EsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4RTAsIDB4NzksIDB4OTMsIDB4NUYsIDB4ODgsIDB4RDcsIDB4RUQsIDB4NDYsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4OTcsIDB4RjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4N0QsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4NDcsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4N0UsIDB4MDAsIDB4MDAsIDB4RTAsIDB4N0MsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4NzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4OTYsIDB4NDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4ODIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzcxWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHhFRCwgMHhGNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHg4MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHhGNCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHg4OSwgMHg4QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHg4NCwgMHg5NSwgMHhCMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHhFMCwgMHg4MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHg5NiwgMHhCMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RiwgMHhDNSwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MSwgMHg1MiwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHg4RiwgMHhDNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHhGNywgMHhFRCwgMHhGOCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHg5NywgMHhGOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHhFMCwgMHg4QSwgMHgwMCwgMHgwMCwgMHg5MCwgMHhGNywgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHg4NiwgMHhFMCwgMHg4QiwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHg4OSwgMHg4QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHhFRCwgMHhGNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHg4OSwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHg5NCwgMHg4MSwgMHhFMCwgMHg4NSwgMHhFMCwgMHg4OCwgMHg4RiwgMHhDNiwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHg5NCwgMHhDRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHhFMCwgMHg4QywgMHgwMCwgMHgwMCwgMHg4RSwgMHhDRiwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHg5MCwgMHhGOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHhFMCwgMHg4RiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHhFMCwgMHg4NywgMHgwMCwgMHgwMCwgMHg4QywgMHg0NiwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHg4RCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHg5NywgMHg2RiwgMHhFMCwgMHg5MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHhFQSwgMHhBNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RiwgMHg2RSwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHhFMCwgMHg5MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHhFMCwgMHg5MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHg5NCwgMHg0RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHg5NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHg5NSwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHhFRCwgMHhGQSwgMHgwMCwgMHgwMCwgMHg5NCwgMHg1MiwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHg5MywgMHg5NSwgMHhFMCwgMHg5NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHg5OSwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHg5NywgMHhEMywgMHgwMCwgMHgwMCwgMHhFMCwgMHg5NiwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHhFMCwgMHg5OCwgMHg4OSwgMHg4RCwgMHgwMCwgMHgwMCwgMHhFMCwgMHg5MywgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5QSwgMHg3QSwgLyogMHhEQy0weERGICovCisJMHhFMCwgMHg5QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHg5MSwgMHg4NywgMHg4RSwgMHg1NywgMHhFMCwgMHg5QywgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHhFMCwgMHg5QiwgMHg5MCwgMHg0MywgMHg5OSwgMHhENywgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHg5RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHg5RiwgMHgwMCwgMHgwMCwgMHhFMCwgMHg4RSwgLyogMHhGOC0weEZCICovCisJMHhFMCwgMHg5RSwgMHgwMCwgMHgwMCwgMHhFRCwgMHhGQiwgMHhFMCwgMHhBMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNzJbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk0LCAweDlBLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweEExLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweEUwLCAweEEyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEEzLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweEUwLCAweEE0LCAweDAwLCAweDAwLCAweDkyLCAweERDLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweEUwLCAweEE2LCAweEUwLCAweEE1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweEUwLCAweEE3LCAweDAwLCAweDAwLCAweEUwLCAweEE4LCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDhFLCAweERELCAweDk1LCAweDgzLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk2LCAweEVBLCAweEUwLCAweEE5LCAvKiAweDM4LTB4M0IgKi8KKwkweEUwLCAweEFBLCAweDkxLCAweDc1LCAweDhFLCAweEEyLCAweEUwLCAweEFCLCAvKiAweDNDLTB4M0YgKi8KKwkweEUwLCAweEFDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEFELCAweDk1LCAweEQwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDk0LCAweEM1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEFFLCAvKiAweDQ4LTB4NEIgKi8KKwkweDk0LCAweDc2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweEFCLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweEUwLCAweEFGLCAweDg5LCAweEU1LCAweDAwLCAweDAwLCAweDhCLCAweDhELCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDk2LCAweEM0LCAweDAwLCAweDAwLCAweDk2LCAweEI0LCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDg5LCAweEIyLCAweDk4LCAweDUzLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk2LCAweDcxLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDk1LCAweEE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkwLCAweEI1LCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweEUwLCAweEIwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDkzLCAweEMxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDhDLCAweEExLCAweEUwLCAweEIxLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDhELCAweEQyLCAweEUwLCAweEIzLCAweEUwLCAweEIyLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEI0LCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEI1LCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEI2LCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDhCLCAweDVELCAweDAwLCAweDAwLCAweEUwLCAweEI3LCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEI4LCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDhDLCAweEEyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk0LCAweEM2LCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweEVELCAweEZDLCAweEUwLCAweEJBLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhGLCAweEYzLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweEI5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweDQwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhCLCAweEI2LCAweEUwLCAweEJCLCAvKiAweEMwLTB4QzMgKi8KKwkweEUwLCAweEJELCAweDAwLCAweDAwLCAweEUwLCAweEJDLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEJFLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDhDLCAweENGLCAweDAwLCAweDAwLCAweEUwLCAweEJGLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhCLCAweEU3LCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDkxLCAweDVGLCAweDAwLCAweDAwLCAweDhELCAweDlELCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweEUwLCAweEMxLCAweEUwLCAweEMyLCAweEUwLCAweEMwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDhFLCAweEVCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDkzLCAweEM2LCAweDhCLCAweEI3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEM0LCAvKiAweEY0LTB4RjcgKi8KKwkweDkyLCAweDRCLCAweEUwLCAweEMzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDk4LCAweDU0LCAweDk0LCAweDgyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183M1s1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4QzcsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4QzksIDB4RTAsIDB4QzYsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTYsIDB4RDIsIC8qIDB4MTgtMHgxQiAqLworCTB4RTAsIDB4QzgsIDB4RTAsIDB4Q0EsIDB4MDAsIDB4MDAsIDB4OTcsIDB4QzIsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4RUUsIDB4NDEsIDB4RTAsIDB4Q0UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4Q0QsIDB4OTIsIDB4OTYsIDB4OTQsIDB4NEMsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEMsIDB4QTMsIDB4RTAsIDB4Q0MsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4RTAsIDB4Q0IsIDB4MDAsIDB4MDAsIDB4OTcsIDB4NTAsIDB4OTcsIDB4NTEsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4Q0YsIDB4ODksIDB4OEUsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4OEQsIDB4OTYsIDB4OEUsIDB4ODIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RDAsIDB4RTAsIDB4RDEsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RDMsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEYsIDB4NjIsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4RTAsIDB4RDUsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RDQsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4RTAsIDB4RDYsIDB4MDAsIDB4MDAsIDB4OEEsIDB4NkMsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4RDgsIDB4MDAsIDB4MDAsIDB4RUUsIDB4NDMsIC8qIDB4NzQtMHg3NyAqLworCTB4RTAsIDB4RDcsIDB4MDAsIDB4MDAsIDB4RTAsIDB4REEsIDB4RTAsIDB4RDksIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4OEMsIDB4QkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTcsIDB4QTYsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4OEIsIDB4Q0EsIDB4MDAsIDB4MDAsIDB4ODksIDB4QTQsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEIsIDB4RTgsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4OEEsIDB4REYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTcsIDB4RTYsIDB4RTAsIDB4REMsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4REUsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4RTAsIDB4REYsIDB4MDAsIDB4MDAsIDB4ODksIDB4Q0YsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4RTAsIDB4REIsIDB4RUUsIDB4NDUsIDB4OEUsIDB4NTgsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4OTIsIDB4QkYsIDB4RTAsIDB4REQsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4NDgsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4NDYsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RTIsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4OEUsIDB4RUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4NDcsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEMsIDB4NUQsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4OTQsIDB4QzcsIDB4RTAsIDB4RTEsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4RkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4NEEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4RTAsIDB4RTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEMsIDB4QkIsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzc0WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QiwgMHg4NSwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHhFNCwgMHg5NywgMHg5RCwgMHhFRSwgMHg0OSwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHg5NywgMHhBRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MSwgMHhGNCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHhFNiwgMHhFRSwgMHg0QiwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHhFRSwgMHg0RCwgMHhFRSwgMHg0QywgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHg0RSwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhFOCwgMHg5NywgMHhENCwgLyogMHgzMC0weDMzICovCisJMHg4QiwgMHhENSwgMHg5NCwgMHhGQSwgMHg5NCwgMHg2OSwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhFOSwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhFQiwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHhFRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHhFQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHhFRCwgMHg4QywgMHhFOCwgMHg4OSwgMHg2QywgLyogMHg1OC0weDVCICovCisJMHhFMCwgMHhFRiwgMHgwMCwgMHgwMCwgMHg5MCwgMHg5MCwgMHhFMCwgMHhFQywgLyogMHg1Qy0weDVGICovCisJMHg5NywgMHhEQSwgMHgwMCwgMHgwMCwgMHhFRSwgMHg0RiwgMHhFMCwgMHhGMiwgLyogMHg2MC0weDYzICovCisJMHhFQSwgMHhBMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHhGMCwgMHhFMCwgMHhGMywgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhFNSwgLyogMHg2Qy0weDZGICovCisJMHhFMCwgMHhGMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RCwgMHhCQSwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhGNCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhGNSwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NywgMHg5RSwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHhFRSwgMHg1MCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhGNiwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhGNywgMHhFRSwgMHg1MSwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhFMywgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhGOCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHg4QSwgMHhDMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHg4RSwgMHhBMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhGOSwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhGQSwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHhFMCwgMHhGQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHg4OSwgMHg1QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHhFMSwgMHg0MCwgMHgwMCwgMHgwMCwgMHg5NSwgMHg1QSwgMHhFMSwgMHg0MSwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QSwgMHhBMiwgMHhFMSwgMHg0MiwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHg0MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHg0NCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHhFMSwgMHg0NiwgMHhFMSwgMHg0NywgMHhFMSwgMHg0NSwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NSwgMHg3MiwgMHhFMSwgMHg0OSwgLyogMHhGNC0weEY3ICovCisJMHhFMSwgMHg0OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNzVbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweEVFLCAweDUyLCAweDAwLCAweDAwLCAweEUxLCAweDRCLCAvKiAweDAwLTB4MDMgKi8KKwkweEUxLCAweDRBLCAweEUxLCAweDRDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweEUxLCAweDRELCAweEUxLCAweDRGLCAweEUxLCAweDRFLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDhELCAweDk5LCAweDAwLCAweDAwLCAweEUxLCAweDUxLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweDUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDhBLCAweEMzLCAweDAwLCAweDAwLCAweDkwLCAweDcyLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDkzLCAweDVCLCAweDAwLCAweDAwLCAweEUxLCAweDUyLCAweDkwLCAweEI2LCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhFLCAweDU5LCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDg5LCAweDk5LCAweEUxLCAweDUzLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDk3LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk1LCAweEUxLCAvKiAweDI4LTB4MkIgKi8KKwkweEUxLCAweDU0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweDhDLCAvKiAweDJDLTB4MkYgKi8KKwkweDkzLCAweDYzLCAweDk3LCAweDUyLCAweDhELCAweDYyLCAweDkwLCAweDVDLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweDZBLCAvKiAweDM0LTB4MzcgKi8KKwkweDk5LCAweEIyLCAweDAwLCAweDAwLCAweDkyLCAweEFDLCAweDg5LCAweEU2LCAvKiAweDM4LTB4M0IgKi8KKwkweEUxLCAweDU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweEUxLCAweDU2LCAweDAwLCAweDAwLCAweEUxLCAweDVCLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweDU5LCAweEUxLCAweDU4LCAweDlELCAweEMwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDhBLCAweDQ1LCAweEUxLCAweDU3LCAweDAwLCAweDAwLCAweDg4LCAweEQ4LCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDk0LCAweEE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDk0LCAweEM4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDk3LCAweEFGLCAweEUxLCAweDVDLCAweEUxLCAweDVBLCAvKiAweDU4LTB4NUIgKi8KKwkweDkyLCAweDdCLCAweDkwLCAweEE0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDk0LCAweEE5LCAweDAwLCAweDAwLCAweDk1LCAweDRDLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweEUxLCAweDVFLCAweDk3LCAweEFBLCAweDhDLCAweDZDLCAweEUxLCAweDVGLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweDVELCAweDk0LCAweEQ0LCAweEUxLCAweDYwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweDYxLCAweDAwLCAweDAwLCAweEVFLCAweDUzLCAvKiAweDZDLTB4NkYgKi8KKwkweDg4LCAweEQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhGLCAweEY0LCAvKiAweDcwLTB4NzMgKi8KKwkweEUxLCAweDY2LCAweDAwLCAweDAwLCAweEUxLCAweDYzLCAweDkzLCAweEVCLCAvKiAweDc0LTB4NzcgKi8KKwkweEUxLCAweDYyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhCLCAweDQ1LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweDY5LCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweDY0LCAweEUxLCAweDY1LCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweDY4LCAweEUxLCAweDY3LCAweDk1LCAweDQ0LCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkxLCAweDYxLCAweDkxLCAweDYwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDhCLCAweDVFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweEUxLCAweDZBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweDZCLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweDZDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweDZFLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweDZELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg5LCAweDc1LCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweDc2LCAweDk0LCAweEU2LCAweEUxLCAweDcwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweDcyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweEUxLCAweDc0LCAweDkwLCAweDVELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweEUxLCAweDc1LCAweEUxLCAweDczLCAweDhFLCAweEJFLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweDZGLCAweEUxLCAweDcxLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDk1LCAweDYxLCAweDAwLCAweDAwLCAweDhGLCAweEM3LCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweDc4LCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweDc5LCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDhFLCAweEE0LCAweDhELCAweEFELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDkzLCAweDk3LCAweEUxLCAweDdBLCAweDAwLCAweDAwLCAweDkyLCAweEM5LCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweDdDLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk3LCAweDlGLCAweEUxLCAweDdCLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDkxLCAweDg5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweEUxLCAweDgyLCAweDAwLCAweDAwLCAweEUxLCAweDg0LCAweEUxLCAweDg1LCAvKiAweEYwLTB4RjMgKi8KKwkweDkyLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweDgzLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweEUxLCAweDgwLCAweDAwLCAweDAwLCAweEUxLCAweDdELCAweEUxLCAweDdFLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183Nls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4RTEsIDB4ODEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4RTEsIDB4ODgsIDB4MDAsIDB4MDAsIDB4RTEsIDB4ODYsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4RTEsIDB4ODcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4ODksIC8qIDB4MUMtMHgxRiAqLworCTB4RTEsIDB4OEIsIDB4RTEsIDB4OEMsIDB4RTEsIDB4OEQsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4RTEsIDB4OEUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4OEEsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4RTEsIDB4OTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4RTEsIDB4OEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4OTEsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTcsIDB4QzMsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4OTQsIDB4RTEsIDB4OTIsIC8qIDB4NDQtMHg0NyAqLworCTB4RTEsIDB4OTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4OEEsIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTYsIDB4RkMsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTUsIDB4QzgsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4RTEsIDB4OTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4RTEsIDB4OTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4RTEsIDB4OTcsIDB4RTEsIDB4OTgsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4OUMsIC8qIDB4NjQtMHg2NyAqLworCTB4RTEsIDB4OTksIDB4RTEsIDB4OUEsIDB4RTEsIDB4OUIsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4RTEsIDB4OUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4RTEsIDB4OUUsIDB4MDAsIDB4MDAsIDB4RTEsIDB4OUYsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4QTAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4RTEsIDB4QTEsIDB4MDAsIDB4MDAsIDB4OTQsIDB4QUQsIDB4OTMsIDB4NkYsIC8qIDB4NzgtMHg3QiAqLworCTB4RTEsIDB4QTIsIDB4OTQsIDB4OTIsIDB4OTUsIDB4NTMsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RTEsIDB4QTMsIDB4MDAsIDB4MDAsIDB4RUUsIDB4NTQsIDB4RTEsIDB4QTQsIC8qIDB4ODAtMHg4MyAqLworCTB4OTMsIDB4NDksIDB4MDAsIDB4MDAsIDB4OEEsIDB4NDYsIDB4OEQsIDB4NjMsIC8qIDB4ODQtMHg4NyAqLworCTB4RTEsIDB4QTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4QTYsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4QTcsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4OEUsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4QTksIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4QTgsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4RTEsIDB4QUEsIDB4RTEsIDB4QUIsIDB4RUUsIDB4NTcsIC8qIDB4OTgtMHg5QiAqLworCTB4RUUsIDB4NTUsIDB4MDAsIDB4MDAsIDB4RUUsIDB4NTYsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4NTgsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTQsIDB4RTcsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4RTEsIDB4QUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4RTEsIDB4QUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4ODksIC8qIDB4QjQtMHhCNyAqLworCTB4RTEsIDB4QUUsIDB4RTEsIDB4QUYsIDB4RTEsIDB4QjAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEUsIDB4NEQsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4QjEsIDB4OTQsIDB4NzUsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTYsIDB4N0UsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4ODksIDB4NkQsIDB4MDAsIDB4MDAsIDB4ODksIDB4NzYsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4RTEsIDB4QjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4QjQsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4QjMsIDB4OTMsIDB4OTAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTAsIDB4QjcsIC8qIDB4RDgtMHhEQiAqLworCTB4OUYsIDB4NTgsIDB4MDAsIDB4MDAsIDB4RTEsIDB4QjUsIDB4OTYsIDB4QkYsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4RTEsIDB4QjYsIDB4MDAsIDB4MDAsIDB4OEEsIDB4QzQsIC8qIDB4RTAtMHhFMyAqLworCTB4OTQsIDB4RDUsIDB4RTEsIDB4QjcsIDB4MDAsIDB4MDAsIDB4RTEsIDB4QjgsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4QjksIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTYsIDB4REEsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTYsIDB4RDMsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4OTIsIDB4QkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4OTEsIDB4OEEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4QkIsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEYsIDB4ODIsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzc3WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHg4RiwgMHhDOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHhFMSwgMHhCRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhCRCwgLyogMHgwNC0weDA3ICovCisJMHhFMSwgMHhCQywgMHg5NCwgMHhGQiwgMHgwMCwgMHgwMCwgMHg4QSwgMHhDNSwgLyogMHgwOC0weDBCICovCisJMHg4QywgMHhBNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhDNCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhDMSwgMHg5MCwgMHg1RSwgLyogMHgxQy0weDFGICovCisJMHg5NiwgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHhFMSwgMHhDMCwgMHhFMSwgMHhDMiwgMHhFMSwgMHhDMywgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHhCRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhDNSwgLyogMHgzNC0weDM3ICovCisJMHhFMSwgMHhDNiwgMHgwMCwgMHgwMCwgMHg5MiwgMHhBRCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHg4QSwgMHhFMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHg5MiwgMHg4NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHg1QSwgMHhFMSwgMHhDNywgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhDOCwgMHhFMSwgMHhDQiwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHg5MCwgMHg4NywgMHgwMCwgMHgwMCwgMHg5MywgMHhDMiwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHhDQywgMHg5NiwgMHg3MiwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHhFMSwgMHhDOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhDQSwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHhDRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhDRSwgMHhFMSwgMHhDRCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhEMSwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhEMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHhEMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhENCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHhFMSwgMHhEMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHg5NSwgMHhDQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHg4RiwgMHg3NSwgMHg5NywgMHhDNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHhFMSwgMHhENSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MywgMHhCNSwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhENiwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHhENywgMHgwMCwgMHgwMCwgMHhFMSwgMHhEQiwgLyogMHhCOC0weEJCICovCisJMHhFMSwgMHhEOSwgMHhFMSwgMHhEQSwgMHgwMCwgMHgwMCwgMHhFMSwgMHhEOCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhEQywgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHhERCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhERSwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhERiwgMHg5NiwgMHhCNSwgLyogMHhEOC0weERCICovCisJMHhFMSwgMHhFMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NiwgMHhFRSwgMHhFMSwgMHhFMSwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHg5MiwgMHg2RCwgMHgwMCwgMHgwMCwgMHg5NCwgMHg4QSwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHg4QiwgMHhFOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHg5MiwgMHg1QSwgMHhFMSwgMHhFMiwgMHg4QiwgMHhCOCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHhDRSwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHhFMSwgMHhFMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNzhbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhELCAweEJCLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweEUxLCAweEU0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEU1LCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDhDLCAweEE0LCAweDhELCAweEQzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweEUxLCAweEU3LCAweEVFLCAweDVDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDkzLCAweDc1LCAweDhELCAweEQ0LCAweDhCLCAweDZELCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk2LCAweDQzLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDk0LCAweDZBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkzLCAweDc2LCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhELCAweDdCLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweEU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweDVELCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDhGLCAweEM5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweEVFLCAweDVFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk3LCAweEIwLCAvKiAweDY4LTB4NkIgKi8KKwkweDhELCAweDY0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhDLCAweEE1LCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk0LCAweEExLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweEUxLCAweEVCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweDVGLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweEUxLCAweEVELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDhDLCAweEU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEVDLCAweDkyLCAweEY0LCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweEUxLCAweEVGLCAweDhBLCAweDU2LCAweEUxLCAweEVBLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDk0LCAweEU4LCAweDAwLCAweDAwLCAweDg5LCAweDRGLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDhELCAweEVBLCAweDAwLCAweDAwLCAweDk4LCAweDcxLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEVFLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEYwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk1LCAweEM5LCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDkwLCAweEQ3LCAweEUxLCAweEYyLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEYzLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweEYxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhBLCAweDZELCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweEUxLCAweEY5LCAweDAwLCAweDAwLCAweEUxLCAweEY4LCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDhFLCAweEE1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweEZBLCAweEUxLCAweEY1LCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEZCLCAweEUxLCAweEY2LCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDk0LCAweEQ2LCAweEUxLCAweEY0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweEUxLCAweEY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweDQxLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweDQwLCAvKiAweEU0LTB4RTcgKi8KKwkweDk2LCAweDgxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweEUxLCAweEZDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg4LCAweEU5LCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweEUyLCAweDQzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweDQyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183OVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4OEYsIDB4Q0EsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4NDQsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTEsIDB4NjIsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4NDYsIDB4RTIsIDB4NDUsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4RTYsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4RTgsIDB4RTIsIDB4NDksIC8qIDB4MjgtMHgyQiAqLworCTB4RTIsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4RUUsIDB4NjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEUsIDB4QTYsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4OTcsIDB4RTcsIDB4MDAsIDB4MDAsIDB4OEUsIDB4RDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4RTIsIDB4NEEsIDB4OEMsIDB4NTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEIsIDB4NUYsIC8qIDB4NDQtMHg0NyAqLworCTB4OEIsIDB4NDYsIDB4OEUsIDB4ODMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4OTcsIDB4NTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4NTAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4NEYsIDB4OTEsIDB4NjMsIDB4RTIsIDB4NEMsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4NEUsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4OEYsIDB4NkEsIDB4OTAsIDB4NUYsIDB4RTIsIDB4NEQsIC8qIDB4NUMtMHg1RiAqLworCTB4RTIsIDB4NEIsIDB4MDAsIDB4MDAsIDB4OTQsIDB4NDksIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4OEYsIDB4Q0IsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4OTUsIDB4NUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4OEQsIDB4RDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTMsIDB4OTgsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4NTEsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4NTIsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RTIsIDB4NjgsIDB4OEIsIDB4RDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4OTgsIDB4NUMsIDB4OTEsIDB4NTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4NTMsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4ODksIDB4RDAsIDB4OTIsIDB4RjUsIDB4OTUsIDB4OUYsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4RUUsIDB4NjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4NjYsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4NTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEIsIDB4OUEsIDB4RTIsIDB4NTUsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4NTcsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4NTgsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4OTQsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4NTksIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4NUEsIDB4RTIsIDB4NUIsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4OEIsIDB4RDcsIDB4ODksIDB4RDEsIDB4OTMsIDB4QzMsIC8qIDB4QkMtMHhCRiAqLworCTB4OEYsIDB4NDcsIDB4OEUsIDB4ODQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4NUMsIDB4MDAsIDB4MDAsIDB4OEYsIDB4NDgsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4ODksIDB4QzgsIDB4OTUsIDB4NjIsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4NUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4OTQsIDB4RTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTEsIDB4NjQsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4NjAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4NjEsIC8qIDB4RTAtMHhFMyAqLworCTB4OTQsIDB4ODksIDB4MDAsIDB4MDAsIDB4OTAsIDB4NjAsIDB4RTIsIDB4NUUsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4OTIsIDB4ODEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4RTIsIDB4NUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4OEYsIDB4Q0MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODgsIDB4REEsIC8qIDB4RjgtMHhGQiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzdBWzUxMl0gPSB7CisJMHg4QiwgMHg0OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHhFMiwgMHg2MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHhGNiwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHg2MywgMHg5MCwgMHhDNSwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHg5NiwgMHhBQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NSwgMHg0MiwgLyogMHgxNC0weDE3ICovCisJMHhFMiwgMHg2NCwgMHhFMiwgMHg2NSwgMHg5MiwgMHg3NCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHg5NywgMHhDNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHg2NywgLyogMHgxQy0weDFGICovCisJMHhFMiwgMHg2NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RSwgMHhFRCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHg2OSwgMHg4OCwgMHhFRSwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHg2QywgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHg2QSwgLyogMHgzOC0weDNCICovCisJMHg4OSwgMHhEMiwgMHg4QywgMHg2RCwgMHhFMiwgMHg2QiwgMHg4RCwgMHg2NSwgLyogMHgzQy0weDNGICovCisJMHg4RCwgMHg5MiwgMHgwMCwgMHgwMCwgMHg5NSwgMHhFNCwgMHhFMiwgMHg2RCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NiwgMHg3MywgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHg2RiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHg5MCwgMHhDRiwgMHg4OSwgMHg2RSwgMHg4OSwgMHhCOCwgLyogMHg0Qy0weDRGICovCisJMHg4OCwgMHhBQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHg2RSwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHg3MCwgMHhFMiwgMHg3MSwgMHg4RiwgMHhGNSwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHg3MiwgMHgwMCwgMHgwMCwgMHg4QSwgMHg2RSwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHhFMiwgMHg3NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHg4QywgMHg4QSwgMHgwMCwgMHgwMCwgMHg4QiwgMHg4NiwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHg3NSwgMHg4QiwgMHhGMywgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHg3NiwgMHgwMCwgMHgwMCwgMHg5MCwgMHhGQSwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHg5MywgMHhDQiwgMHgwMCwgMHgwMCwgMHg5MCwgMHhERSwgLyogMHg4MC0weDgzICovCisJMHg4RCwgMHhGMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHhFMiwgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHg4MiwgMHg5MSwgMHg4QiwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHg3OSwgMHhFMiwgMHg3QiwgMHhFMiwgMHg3OCwgLyogMHg5NC0weDk3ICovCisJMHhFMiwgMHg3QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QywgMHg0MSwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHg3QywgMHg4QywgMHg0NSwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QiwgMHg4NywgMHg5NywgMHg3MSwgLyogMHhBQy0weEFGICovCisJMHhFMiwgMHg3RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHg4MCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OSwgMHg0RCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHg4MywgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QSwgMHg5NiwgLyogMHhDMC0weEMzICovCisJMHhFMiwgMHg4MiwgMHhFMiwgMHg4MSwgMHgwMCwgMHgwMCwgMHhFMiwgMHg4NSwgLyogMHhDNC0weEM3ICovCisJMHhFMiwgMHg3RCwgMHgwMCwgMHgwMCwgMHhFMiwgMHg4NiwgMHg5NywgMHhBNywgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHg4NywgMHgwMCwgMHgwMCwgMHhFMiwgMHg4OCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHhFRSwgMHg2NywgMHg5QSwgMHhGMiwgMHhFMiwgMHg4QSwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHg4OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHg4QiwgMHhFMiwgMHg4QywgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHg5NywgMHhCMywgMHhFMiwgMHg4RCwgMHgwMCwgMHgwMCwgMHhFOCwgMHhFRCwgLyogMHhEQy0weERGICovCisJMHg4RiwgMHhDRCwgMHhFMiwgMHg4RSwgMHhFMiwgMHg4RiwgMHg4RiwgMHg3NiwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHg5MywgMHhCNiwgMHhFMiwgMHg5MCwgMHhFRSwgMHg2OCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHg0NywgMHhFRSwgMHg2QSwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHg5MSwgMHgwMCwgMHgwMCwgMHg5MiwgMHg1QiwgLyogMHhFQy0weEVGICovCisJMHhFMiwgMHg5MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QiwgMHhBMywgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHg5OSwgMHg1RSwgMHg5MiwgMHg3QywgMHg4RSwgMHhCMSwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QSwgMHhDNiwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfN0JbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweDkzLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweEUyLCAweEEwLCAweDAwLCAweDAwLCAweEUyLCAweDk2LCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDhCLCAweDg4LCAweDAwLCAweDAwLCAweEUyLCAweDk1LCAweEUyLCAweEEyLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweDk0LCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDhGLCAweENFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweEUyLCAweDk4LCAweEUyLCAweDk5LCAweDAwLCAweDAwLCAweDkzLCAweDRBLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweDlBLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDhBLCAweDdELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDkwLCAweDc5LCAweDk1LCAweDg0LCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweEUyLCAweDlDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDkxLCAweEU2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweDk3LCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweDlCLCAweEUyLCAweDlELCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDhELCAweEY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweEE0LCAweDk1LCAweDRELCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDk0LCAweEE0LCAweDkzLCAweDk5LCAweDAwLCAweDAwLCAweDhCLCAweEQ4LCAvKiAweDQ4LTB4NEIgKi8KKwkweEUyLCAweEEzLCAweEUyLCAweEExLCAweDAwLCAweDAwLCAweDk0LCAweEIzLCAvKiAweDRDLTB4NEYgKi8KKwkweEUyLCAweDlFLCAweDkyLCAweDdELCAweDkzLCAweDlCLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDkzLCAweDlBLCAweDAwLCAweDAwLCAweDhELCAweEY0LCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweEI2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweEE2LCAweDAwLCAweDAwLCAweEUyLCAweEE4LCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweEUyLCAweEFCLCAweDAwLCAweDAwLCAweEUyLCAweEFDLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweEUyLCAweEE5LCAweEUyLCAweEFBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweEUyLCAweEE3LCAweEUyLCAweEE1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweDlGLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk1LCAweENELCAweDg5LCAweEQzLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweEIzLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweEIwLCAweDAwLCAweDAwLCAweEUyLCAweEI1LCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweEI0LCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDk0LCAweDkzLCAweDk2LCAweEE1LCAweDAwLCAweDAwLCAweDhFLCAweDVBLCAvKiAweDk0LTB4OTcgKi8KKwkweEUyLCAweEFFLCAweEUyLCAweEI3LCAweEUyLCAweEIyLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweEUyLCAweEIxLCAweEUyLCAweEFELCAweEVFLCAweDZCLCAweEUyLCAweEFGLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDhBLCAweEM3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweDVDLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDkwLCAweEZCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDk0LCAweEEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweEUyLCAweEJDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDk0LCAweEEyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDkwLCAweERGLCAweEUyLCAweEI5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDk0LCAweENELCAweDAwLCAweDAwLCAweEUyLCAweEJELCAweDk1LCAweEQxLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDkyLCAweDdBLCAweDAwLCAweDAwLCAweEUyLCAweEI4LCAvKiAweEM4LTB4Q0IgKi8KKwkweEUyLCAweEJBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweEJCLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweEJFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDhFLCAweEMyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDkzLCAweEM0LCAweEUyLCAweEMzLCAweEUyLCAweEMyLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweEJGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDk4LCAweDU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweEM4LCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweENDLCAweEUyLCAweEM5LCAvKiAweEY0LTB4RjcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183Q1s1MTJdID0geworCTB4RTIsIDB4QzUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4QzYsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4Q0IsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4QzAsIDB4OTksIDB4RDMsIDB4RTIsIDB4QzcsIC8qIDB4MTAtMHgxMyAqLworCTB4RTIsIDB4QzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4Q0EsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4RDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4OEEsIDB4QzgsIDB4MDAsIDB4MDAsIDB4RTIsIDB4Q0QsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4Q0UsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4Q0YsIDB4RTIsIDB4RDIsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4RDEsIC8qIDB4MzQtMHgzNyAqLworCTB4OTQsIDB4RjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4RDMsIDB4OTcsIDB4RkEsIDB4OTUsIDB4RUIsIC8qIDB4M0MtMHgzRiAqLworCTB4RTIsIDB4RDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4RDUsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4RTIsIDB4RDQsIDB4OTAsIDB4RDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4RDcsIC8qIDB4NEMtMHg0RiAqLworCTB4RTIsIDB4RDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4RTIsIDB4RDYsIDB4MDAsIDB4MDAsIDB4RTIsIDB4REQsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4RTIsIDB4REEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4REIsIC8qIDB4NUMtMHg1RiAqLworCTB4RTIsIDB4QzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4RTIsIDB4REMsIDB4RTIsIDB4REUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4RTIsIDB4REYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTUsIDB4QzQsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTYsIDB4RTAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4OEIsIDB4Q0MsIDB4OEMsIDB4NDgsIDB4RTIsIDB4RTEsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4OTUsIDB4QjIsIDB4MDAsIDB4MDAsIDB4OTAsIDB4ODgsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4OTYsIDB4QUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4RTIsIDB4RTIsIDB4MDAsIDB4MDAsIDB4OTcsIDB4QjEsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4OTQsIDB4OTQsIDB4MDAsIDB4MDAsIDB4OTEsIDB4NjUsIC8qIDB4OTQtMHg5NyAqLworCTB4OTQsIDB4NTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEYsIDB4NkMsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODgsIDB4QkUsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4RTcsIDB4RTIsIDB4RTUsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4RTIsIDB4RTMsIDB4OEEsIDB4OUYsIDB4MDAsIDB4MDAsIDB4OEYsIDB4Q0YsIC8qIDB4QTQtMHhBNyAqLworCTB4RTIsIDB4RTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4RTYsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4RTQsIDB4RTIsIDB4RUMsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4RUIsIDB4RTIsIDB4RUEsIDB4RTIsIDB4RTksIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4RUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4RUUsIDB4OTAsIDB4QjgsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4RTIsIDB4RUYsIDB4MDAsIDB4MDAsIDB4RTIsIDB4RjEsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEMsIDB4RDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTEsIDB4NTcsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4RjMsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTMsIDB4OUMsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4RTIsIDB4RjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4RTIsIDB4RjQsIDB4MDAsIDB4MDAsIDB4OTUsIDB4QjMsIDB4OTEsIDB4OEMsIC8qIDB4REMtMHhERiAqLworCTB4OEQsIDB4NjYsIDB4MDAsIDB4MDAsIDB4RTIsIDB4RjUsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTcsIDB4QzYsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4RjcsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4RjgsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4RTIsIDB4RjksIDB4MDAsIDB4MDAsIDB4RTIsIDB4RkEsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4OEUsIDB4ODUsIDB4MDAsIDB4MDAsIDB4RTIsIDB4RkIsIDB4OEMsIDB4NkUsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEIsIDB4OEEsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzdEWzUxMl0gPSB7CisJMHg4QiwgMHg0OSwgMHgwMCwgMHgwMCwgMHhFMywgMHg0MCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHg5NiwgMHhGMSwgMHg4RCwgMHg2NywgMHhFMiwgMHhGQywgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHg0MywgMHg5NiwgMHhFNCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHg5NCwgMHg1QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHg5NSwgMHg1MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHg4RiwgMHg4MywgMHhFMywgMHg0MiwgMHgwMCwgMHgwMCwgMHg4RSwgMHhEMSwgLyogMHgxNC0weDE3ICovCisJMHg4RCwgMHg2OCwgMHg4RSwgMHg4NiwgMHg4QiwgMHg4OSwgMHg5NSwgMHhCNCwgLyogMHgxOC0weDFCICovCisJMHhFMywgMHg0MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHg5MSwgMHg2NiwgMHg5NiwgMHg2MSwgMHg4RCwgMHhGNSwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RSwgMHg4NywgLyogMHgyOC0weDJCICovCisJMHg5MiwgMHhEQiwgMHgwMCwgMHgwMCwgMHhFMywgMHg0NiwgMHg5NywgMHhERCwgLyogMHgyQy0weDJGICovCisJMHg4RCwgMHhENywgMHgwMCwgMHgwMCwgMHhFMywgMHg0NywgMHg5MCwgMHg2MSwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHg0OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHg4RiwgMHhEMCwgMHg4RCwgMHhBRSwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHg0OCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RiwgMHg0OSwgMHg4QywgMHhCQywgLyogMHg0MC0weDQzICovCisJMHg5MSwgMHg2NywgMHhFMywgMHg0NCwgMHhFMywgMHg0QSwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHhFRSwgMHg2RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHg0NSwgLyogMHg0OC0weDRCICovCisJMHg4QywgMHg2RiwgMHgwMCwgMHgwMCwgMHhFMywgMHg0RCwgMHhFMywgMHg1MSwgLyogMHg0Qy0weDRGICovCisJMHg4QywgMHg4QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHg0QywgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHg1NSwgLyogMHg1OC0weDVCICovCisJMHhFRSwgMHg2RSwgMHgwMCwgMHgwMCwgMHg4RCwgMHg2OSwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHg5NywgMHg4RCwgMHg4OCwgMHhCQSwgMHhFMywgMHg1MiwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QiwgMHg4QiwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHhFMywgMHg0RiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHg1MCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHg5MywgMHg5RCwgMHhFMywgMHg0RSwgMHhFMywgMHg0QiwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHg4QSwgMHg0NywgMHg5MCwgMHhFMiwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHg4QywgMHhBNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHg1NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHg1NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHg1NiwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHg1MywgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHg4QywgMHg3MCwgMHg5MSwgMHhCMSwgMHhFMywgMHg1OCwgLyogMHg5OC0weDlCICovCisJMHg5MSwgMHg4RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHg2NSwgLyogMHg5Qy0weDlGICovCisJMHhFRSwgMHg3MCwgMHgwMCwgMHgwMCwgMHhFMywgMHg2MSwgMHhFMywgMHg1QiwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHg1RiwgLyogMHhBOC0weEFCICovCisJMHg4RSwgMHhGOCwgMHg4OCwgMHhEQiwgMHhFMywgMHg1QSwgMHhFMywgMHg2MiwgLyogMHhBQy0weEFGICovCisJMHhFMywgMHg2NiwgMHg4RCwgMHg2QSwgMHg5NiwgMHhENCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHg5MiwgMHhENCwgMHhFMywgMHg1QywgMHgwMCwgMHgwMCwgMHhFRSwgMHg2RiwgLyogMHhCNC0weEI3ICovCisJMHhFMywgMHg2NCwgMHgwMCwgMHgwMCwgMHhFMywgMHg1OSwgMHg5MiwgMHg1RCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHg1RSwgMHg4OCwgMHhCQiwgMHg5NiwgMHhDOCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHg1RCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QiwgMHhEOSwgMHg5NCwgMHhFQSwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MSwgMHg4RCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHg5NywgMHhDRSwgMHg4RiwgMHg4RiwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHg4RSwgMHhFRSwgMHg3MSwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHhFMywgMHg2NywgMHgwMCwgMHgwMCwgMHg5MCwgMHhGQywgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHhFMywgMHg2MywgMHhFMywgMHg2OCwgMHhFMywgMHg2QSwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHg5MiwgMHhGNywgMHhFMywgMHg2RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHhFMywgMHg2OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHg5NSwgMHhEMiwgMHg4QSwgMHhDOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHg5NiwgMHhDOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHhEQywgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHg2QywgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHg5NywgMHhGQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHg2QiwgLyogMHhGOC0weEZCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfN0VbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDg5LCAweDhGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDkzLCAweEVBLCAweEUzLCAweDZFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweEUzLCAweDc1LCAweEUzLCAweDZGLCAweEUzLCAweDc2LCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweDcyLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk0LCAweDlCLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhFLCAweEM4LCAweEUzLCAweDc0LCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweEUzLCAweDcxLCAweEUzLCAweDc3LCAweEUzLCAweDcwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhGLCAweDYzLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk2LCAweDQ0LCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhGLCAweDZCLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweEUzLCAweDczLCAweEUzLCAweDgwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweEUzLCAweDdCLCAweDAwLCAweDAwLCAweEUzLCAweDdFLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweEUzLCAweDdDLCAweEUzLCAweDgxLCAweEUzLCAweDdBLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweEUzLCAweDYwLCAweDkwLCAweEQxLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDk0LCAweEM5LCAweDAwLCAweDAwLCAweEUzLCAweDdELCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweDc4LCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkxLCAweDQwLCAweDhDLCAweDcxLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDhGLCAweDRBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweDcyLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDkwLCAweDQ0LCAweDkxLCAweDU1LCAweEUzLCAweDg0LCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweEUzLCAweDg2LCAweEUzLCAweDg3LCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweEUzLCAweDgzLCAweEUzLCAweDg1LCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweDc5LCAweEUzLCAweDgyLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweEUzLCAweDhBLCAweEUzLCAweDg5LCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDk2LCAweDlBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDhDLCAweDRBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweEUzLCAweDg4LCAweDAwLCAweDAwLCAweEUzLCAweDhDLCAvKiAweDc4LTB4N0IgKi8KKwkweEUzLCAweDhCLCAweEUzLCAweDhGLCAweDAwLCAweDAwLCAweEUzLCAweDkxLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhFLCAweDVCLCAweEUzLCAweDhELCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweEUzLCAweDkyLCAweEUzLCAweDkzLCAweEVELCAweDQwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweEUzLCAweDk0LCAweDAwLCAweDAwLCAweEUzLCAweDlBLCAweDkzLCAweDVBLCAvKiAweDhDLTB4OEYgKi8KKwkweEUzLCAweDk2LCAweDAwLCAweDAwLCAweEUzLCAweDk1LCAweEUzLCAweDk3LCAvKiAweDkwLTB4OTMgKi8KKwkweEUzLCAweDk4LCAweDAwLCAweDAwLCAweEUzLCAweDk5LCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweDlCLCAvKiAweDk4LTB4OUIgKi8KKwkweEUzLCAweDlDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183Rls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEEsIDB4Q0EsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4RTMsIDB4OUQsIDB4MDAsIDB4MDAsIDB4RTMsIDB4OUUsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4OUYsIDB4MDAsIDB4MDAsIDB4RUUsIDB4NzMsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4RTMsIDB4QTAsIDB4RTMsIDB4QTEsIDB4RTMsIDB4QTIsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4RTMsIDB4QTMsIDB4RTMsIDB4QTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4RTMsIDB4QTYsIDB4RTMsIDB4QTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4RTMsIDB4QTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4QTgsIC8qIDB4NUMtMHg1RiAqLworCTB4RTMsIDB4QTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4QUMsIC8qIDB4NjQtMHg2NyAqLworCTB4RTMsIDB4QUEsIDB4RTMsIDB4QUIsIDB4OEQsIDB4REYsIDB4OEMsIDB4NzIsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4NzUsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4OTQsIDB4QjEsIDB4MDAsIDB4MDAsIDB4OEYsIDB4OTAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4OTQsIDB4NkMsIDB4MDAsIDB4MDAsIDB4OTQsIDB4RUIsIC8qIDB4NzQtMHg3NyAqLworCTB4RTMsIDB4QUQsIDB4OUMsIDB4RUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4QUUsIDB4RTMsIDB4QjAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4OTcsIDB4ODUsIDB4RTMsIDB4QUYsIDB4RTMsIDB4QjIsIC8qIDB4ODQtMHg4NyAqLworCTB4RTMsIDB4QjEsIDB4MDAsIDB4MDAsIDB4OTcsIDB4NzIsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4RTMsIDB4QjMsIDB4MDAsIDB4MDAsIDB4OTQsIDB4RkMsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4RTMsIDB4QjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4QjcsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4QjYsIDB4RTMsIDB4QjUsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4NzQsIDB4MDAsIDB4MDAsIDB4RTMsIDB4QjgsIC8qIDB4QTAtMHhBMyAqLworCTB4OEMsIDB4NTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4OTEsIDB4NDEsIDB4OEIsIDB4NjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4QkMsIDB4RTMsIDB4QjksIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4QkEsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4QkQsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4RTMsIDB4QkUsIDB4RTMsIDB4QkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4ODksIDB4NDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4ODksIDB4QTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4QzAsIDB4RTMsIDB4QzEsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4QzIsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4OTcsIDB4ODIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEYsIDB4NEIsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4RTMsIDB4QzQsIDB4RTMsIDB4QzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4OTAsIDB4ODksIDB4RTMsIDB4QzUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4QzYsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4QzcsIDB4MDAsIDB4MDAsIDB4OEEsIDB4RTMsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4OEEsIDB4Q0IsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4QzgsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4QzksIDB4MDAsIDB4MDAsIDB4OTYsIDB4N0MsIC8qIDB4RjgtMHhGQiAqLworCTB4OTcsIDB4ODMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzgwWzUxMl0gPSB7CisJMHg5NywgMHg3MywgMHg5OCwgMHg1NiwgMHgwMCwgMHgwMCwgMHg4RCwgMHg2QywgLyogMHgwMC0weDAzICovCisJMHhFMywgMHhDQywgMHg4RSwgMHhEMiwgMHhFMywgMHhDQiwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHhDRCwgLyogMHgwOC0weDBCICovCisJMHg4RSwgMHhBNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHg5MSwgMHhDRiwgMHgwMCwgMHgwMCwgMHhFMywgMHhDRSwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHg4RCwgMHg2QiwgMHgwMCwgMHgwMCwgMHg5NiwgMHhENSwgLyogMHgxNC0weDE3ICovCisJMHhFMywgMHhDRiwgMHhFMywgMHhEMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHhFMywgMHhEMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHhEMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHhFMywgMHhEMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RSwgMHhBOCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NiwgMHhFQiwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHhENSwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHg5MiwgMHg1RSwgMHgwMCwgMHgwMCwgMHhFMywgMHhENCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHhENywgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHhENiwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHhEOCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHhCOSwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHhFMywgMHhEOSwgMHgwMCwgMHgwMCwgMHhFMywgMHhEQSwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NSwgMHhCNywgMHhFMywgMHhEQiwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHg5MSwgMHg4RiwgMHhFMywgMHhEQywgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHhFMywgMHhERCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NywgMHhGQywgLyogMHg2Qy0weDZGICovCisJMHhFMywgMHhFMCwgMHgwMCwgMHgwMCwgMHhFMywgMHhERiwgMHhFMywgMHhERSwgLyogMHg3MC0weDczICovCisJMHg5MiwgMHhBRSwgMHgwMCwgMHgwMCwgMHhFMywgMHhFMSwgMHg5MCwgMHg0NSwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHhFMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHhFMywgMHg5OCwgMHg1NywgMHhFMywgMHhFNCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHhFMywgMHhFNSwgMHhFMywgMHhFNywgMHhFMywgMHhFNiwgMHg5NCwgMHhBMywgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHg5MywgMHhGNywgMHgwMCwgMHgwMCwgMHg5OCwgMHg1RCwgLyogMHg4OC0weDhCICovCisJMHg5NCwgMHhBNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHhFOSwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RiwgMHhEMSwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHg5NSwgMHg0OSwgMHgwMCwgMHgwMCwgMHhFMywgMHhFQSwgMHhFMywgMHhFOCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHg4QSwgMHhDQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHg4QywgMHhEMiwgMHg4RSwgMHg4OCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHg5NCwgMHhFQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHg4QywgMHhBOCwgMHg5NiwgMHg2MiwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHhFMywgMHhFRCwgMHhFMywgMHhFQiwgMHgwMCwgMHgwMCwgMHg4RCwgMHg2RCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHg4RCwgMHg2RSwgMHg4OCwgMHhFNywgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHg4RCwgMHhFNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NCwgMHg3OCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHhERCwgLyogMHhDMC0weEMzICovCisJMHhFMywgMHhGMiwgMHgwMCwgMHgwMCwgMHg5MiwgMHg1RiwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHg5NCwgMHg3NywgMHgwMCwgMHgwMCwgMHg5MSwgMHhEOSwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHhGNCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHhGMCwgMHhFMywgMHhGMywgMHhFMywgMHhFRSwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHhGMSwgMHg5NiwgMHg0NSwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHg4QywgMHhEMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHg4OCwgMHhGQiwgMHhFMywgMHhFRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHhGNiwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHhGNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHg5MywgMHhCNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHg4QiwgMHhCOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHhFNCwgMHg0NSwgMHg5NCwgMHg1QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfODFbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhFLCAweDg5LCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDhCLCAweEJBLCAweDkwLCAweEM2LCAweDk4LCAweDY1LCAvKiAweDA0LTB4MDcgKi8KKwkweDk2LCAweEFDLCAweEUzLCAweEY1LCAweDkwLCAweEQyLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhCLCAweDcyLCAweEUzLCAweEY4LCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweEZBLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweEUzLCAweEY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweEZCLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDkyLCAweDQ1LCAweDAwLCAweDAwLCAweDk0LCAweDVELCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDkyLCAweEFGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweDQyLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweDQxLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweEZDLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkwLCAweDc0LCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDk1LCAweDg1LCAweEU0LCAweDQ0LCAweDAwLCAweDAwLCAweEU0LCAweDQzLCAvKiAweDUwLTB4NTMgKi8KKwkweDhELCAweDZGLCAweDk4LCAweDcyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweDU0LCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweDQ4LCAweEU0LCAweDQ5LCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhFLCAweEVFLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweDQ3LCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDhELCAweDk4LCAweEU0LCAweDQ2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweEU0LCAweDRBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDkyLCAweEIwLCAweDk1LCAweEEwLCAweDkxLCAweDQyLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkxLCAweERBLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEU0LCAweDRFLCAweDAwLCAweDAwLCAweEU0LCAweDRGLCAweEU0LCAweDRCLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweEU0LCAweDRDLCAweDAwLCAweDAwLCAweEU0LCAweDRELCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhELCAweDcwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweDU1LCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweDUxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk1LCAweDg2LCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDk2LCAweDhDLCAweDk1LCAweDQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweEU0LCAweDUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweDUzLCAvKiAweEEwLTB4QTMgKi8KKwkweEU0LCAweDUyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDk2LCAweDYzLCAweEU0LCAweDU2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweEU0LCAweDU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkxLCAweDU2LCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweDU4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweEU0LCAweDVBLCAweDAwLCAweDAwLCAweEU0LCAweDVFLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweDVCLCAweEU0LCAweDU5LCAweDk0LCAweDVFLCAvKiAweEJDLTB4QkYgKi8KKwkweEU0LCAweDVDLCAweDAwLCAweDAwLCAweEU0LCAweDVELCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg5LCAweEIwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweEU0LCAweDY0LCAweEU0LCAweDVGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweDYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweDYxLCAweDAwLCAweDAwLCAweDkxLCAweDlGLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweEU0LCAweDYzLCAweEU0LCAweDYyLCAweEU0LCAweDY1LCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweDY2LCAvKiAweERDLTB4REYgKi8KKwkweEU0LCAweDY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkwLCAweDYyLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDg5LCAweEU3LCAweDAwLCAweDAwLCAweEU0LCAweDY4LCAvKiAweEU0LTB4RTcgKi8KKwkweDk3LCAweEQ1LCAweDAwLCAweDAwLCAweDhFLCAweEE5LCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDhGLCAweDRDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhFLCAweDhBLCAvKiAweEYwLTB4RjMgKi8KKwkweDkyLCAweDc2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweDY5LCAweEU0LCAweDZBLCAvKiAweEY4LTB4RkIgKi8KKwkweDg5LCAweDUwLCAweDAwLCAweDAwLCAweEU0LCAweDZCLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184Mls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4RTQsIDB4NkMsIDB4RTQsIDB4NkQsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4NkUsIDB4MDAsIDB4MDAsIDB4RTQsIDB4NkYsIC8qIDB4MDQtMHgwNyAqLworCTB4OEIsIDB4QkIsIDB4OUQsIDB4QTgsIDB4RTQsIDB4NzAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4OTAsIDB4RTMsIDB4RTQsIDB4NzEsIDB4OEUsIDB4QzksIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4RTQsIDB4NzIsIDB4MDAsIDB4MDAsIDB4OTgsIDB4QUUsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4NzMsIDB4OTUsIDB4REMsIC8qIDB4MTQtMHgxNyAqLworCTB4OEEsIDB4REEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTEsIDB4NDMsIC8qIDB4MTgtMHgxQiAqLworCTB4OEYsIDB4NzcsIDB4MDAsIDB4MDAsIDB4OTUsIDB4OTEsIDB4OEYsIDB4NEQsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4NzQsIDB4OEQsIDB4NzEsIDB4RTQsIDB4NzUsIC8qIDB4MjgtMHgyQiAqLworCTB4OTQsIDB4Q0EsIDB4MDAsIDB4MDAsIDB4RTQsIDB4ODQsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4NzcsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4OTEsIDB4QzcsIDB4OTQsIDB4OTUsIDB4OEMsIDB4QkQsIC8qIDB4MzQtMHgzNyAqLworCTB4RTQsIDB4NzYsIDB4OTEsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4RTQsIDB4NzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4RjgsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4RTQsIDB4N0EsIDB4RTQsIDB4NzksIDB4RTQsIDB4N0MsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4N0IsIDB4MDAsIDB4MDAsIDB4RTQsIDB4N0QsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4ODAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4RTQsIDB4N0UsIDB4MDAsIDB4MDAsIDB4OEEsIDB4Q0QsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4RTQsIDB4ODEsIDB4MDAsIDB4MDAsIDB4RTQsIDB4ODIsIDB4RTQsIDB4ODMsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEQsIDB4QUYsIDB4OTcsIDB4QzcsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4ODUsIDB4OTAsIDB4NDYsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4OTAsIDB4RTQsIDB4ODYsIC8qIDB4NzQtMHg3NyAqLworCTB4RTQsIDB4ODcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4ODgsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODgsIDB4RjAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4ODksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4OEEsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4OTUsIDB4ODcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4OEUsIDB4QzUsIDB4MDAsIDB4MDAsIDB4RTQsIDB4OEMsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4OEEsIDB4NDgsIDB4ODgsIDB4QjAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4OEIsIC8qIDB4QTgtMHhBQiAqLworCTB4RTQsIDB4OEUsIDB4OTQsIDB4NkQsIDB4MDAsIDB4MDAsIDB4OTAsIDB4NjMsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4ODksIDB4RDQsIDB4MDAsIDB4MDAsIDB4OTYsIDB4NDYsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4OEMsIDB4N0MsIDB4OEIsIDB4REEsIDB4MDAsIDB4MDAsIDB4RTQsIDB4OEQsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4ODksIDB4RTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4OEEsIDB4QTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4ODksIDB4OTEsIDB4RTQsIDB4OTIsIDB4OTcsIDB4RTgsIC8qIDB4RDAtMHhEMyAqLworCTB4OTEsIDB4REIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTUsIDB4NjMsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4OUUsIDB4MDAsIDB4MDAsIDB4ODksIDB4RDUsIC8qIDB4RDgtMHhEQiAqLworCTB4RTQsIDB4OUMsIDB4MDAsIDB4MDAsIDB4RTQsIDB4OUEsIDB4RTQsIDB4OTEsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4OEYsIDB4MDAsIDB4MDAsIDB4RTQsIDB4OTAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4OEUsIDB4RTEsIDB4OEIsIDB4RUEsIDB4OTIsIDB4OTcsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTMsIDB4Q0YsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4ODksIDB4NzAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4OTQsIC8qIDB4RjAtMHhGMyAqLworCTB4RTQsIDB4OTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4OTksIDB4RTQsIDB4OTUsIDB4RTQsIDB4OTgsIC8qIDB4RjgtMHhGQiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzgzWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHhFRSwgMHg3NiwgMHg5NiwgMHhDRSwgMHhFNCwgMHg5NywgLyogMHgwMC0weDAzICovCisJMHg4OSwgMHhENiwgMHg4QSwgMHg5RCwgMHhFNCwgMHg5QiwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHg5RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QywgMHg3MywgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhBMSwgMHhFNCwgMHhBQSwgLyogMHgxNC0weDE3ICovCisJMHhFNCwgMHhBQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHg4OCwgMHhBOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhCMiwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHg4OCwgMHhFRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhBOSwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhBOCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHhBMywgMHhFNCwgMHhBMiwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHhFNCwgMHhBMCwgMHhFNCwgMHg5RiwgMHg5MiwgMHg4MywgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHg5MSwgMHhGOSwgMHhFNCwgMHhBNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHhFNCwgMHhBNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHhBNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHg5MSwgMHg5MCwgMHg4QywgMHg3NCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OSwgMHg2MCwgLyogMHg0Qy0weDRGICovCisJMHhFNCwgMHhBNiwgMHgwMCwgMHgwMCwgMHg4RCwgMHg3MiwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHg5MSwgMHg5MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHg3NywgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhCOCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHhCOSwgMHgwMCwgMHgwMCwgMHg4OSwgMHhENywgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OSwgMHhBQywgLyogMHg3OC0weDdCICovCisJMHhFNCwgMHhCNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHg3OCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHhBQywgMHgwMCwgMHgwMCwgMHhFNCwgMHhCNCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHhCQiwgMHhFNCwgMHhCNSwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhCMywgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHg5NiwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhCMSwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhBRCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QSwgMHhDRSwgMHhFNCwgMHhBRiwgLyogMHg5Qy0weDlGICovCisJMHhFNCwgMHhCQSwgMHgwMCwgMHgwMCwgMHhFNCwgMHhCMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHhFNCwgMHhCQywgMHgwMCwgMHgwMCwgMHhFNCwgMHhBRSwgMHg5NCwgMHg5QywgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHg5NywgMHg4OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHhCNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHhDRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHhDNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHg5MCwgMHg5QiwgMHgwMCwgMHgwMCwgMHhFRSwgMHg3OSwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QiwgMHg2NSwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHg4QiwgMHhEQiwgMHgwMCwgMHgwMCwgMHhFNCwgMHhDMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OSwgMHhEOSwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RiwgMHhEMiwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHhFNCwgMHhDMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHg4RCwgMHhEOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MywgMHg3MCwgLyogMHhEQy0weERGICovCisJMHhFNCwgMHhDOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHg5NSwgMHhFQywgMHgwMCwgMHgwMCwgMHhFNCwgMHhCRiwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OSwgMHhEOCwgLyogMHhFQy0weEVGICovCisJMHg4QywgMHhENCwgMHg5NSwgMHg0OCwgMHhFNCwgMHhDOSwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHhFNCwgMHhCRCwgMHgwMCwgMHgwMCwgMHhFRSwgMHg3QSwgMHhFNCwgMHhDNiwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhEMCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHhDMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfODRbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweEMyLCAvKiAweDAwLTB4MDMgKi8KKwkweDkzLCAweEI4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweEM3LCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweEM0LCAvKiAweDA4LTB4MEIgKi8KKwkweDk2LCAweDQ3LCAweEU0LCAweENBLCAweDg4LCAweERFLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweEJFLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweEU0LCAweENDLCAweDAwLCAweDAwLCAweEU0LCAweENCLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDk0LCAweDhCLCAweEU0LCAweEQyLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweEU0LCAweERELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDhBLCAweDlFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweEUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweEU0LCAweENFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweEU0LCAweEQzLCAweDk3LCAweDhFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweERDLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweEVFLCAweDdCLCAweDk3LCAweDc0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk3LCAweEE4LCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweDk4LCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhBLCAweDhCLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDk1LCAweDkyLCAweEU0LCAweEUyLCAweDkzLCAweDlGLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg4LCAweEFGLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweERCLCAweDAwLCAweDAwLCAweEU0LCAweEQ3LCAvKiAweDY4LTB4NkIgKi8KKwkweDkxLCAweDkyLCAweEU0LCAweEQxLCAweEU0LCAweEQ5LCAweEU0LCAweERFLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDk0LCAweDRCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDg4LCAweEE4LCAweDAwLCAweDAwLCAweEU0LCAweEQ2LCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweERGLCAweDk1LCAweDk4LCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweERBLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweEU0LCAweEQ1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhGLCAweEQzLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDhGLCAweDRFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDhFLCAweEFBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDk2LCAweEQ2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDk1LCAweDY2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweEU1LCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweEVFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweEQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhBLCAweDk3LCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweEVFLCAweDdDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDhGLCAweEY2LCAweEU0LCAweEUzLCAweDAwLCAweDAwLCAweEU0LCAweEU4LCAvKiAweEI4LTB4QkIgKi8KKwkweDkxLCAweDkzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweEU0LCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweEVCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDkyLCAweDdFLCAweDAwLCAweDAwLCAweEU0LCAweEVDLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDk3LCAweDc1LCAweEU0LCAweEUxLCAweDhBLCAweDU3LCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweEU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweEU0LCAweEVBLCAweDk2LCAweEFBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweEVELCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweEU2LCAweEU0LCAweEU5LCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweEVELCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDk2LCAweDQ4LCAweDAwLCAweDAwLCAweDk4LCAweDQwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweEU0LCAweEYxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweEU0LCAweEY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweEYwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184NVs1MTJdID0geworCTB4OEUsIDB4QzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4Q0YsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4OTUsIDB4Q0MsIDB4MDAsIDB4MDAsIDB4OTYsIDB4QTAsIC8qIDB4MTAtMHgxMyAqLworCTB4RTQsIDB4RjcsIDB4RTQsIDB4RjYsIDB4MDAsIDB4MDAsIDB4RTQsIDB4RjIsIC8qIDB4MTQtMHgxNyAqLworCTB4RTQsIDB4RjMsIDB4MDAsIDB4MDAsIDB4ODksIDB4NTUsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4RjUsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4RUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4RDMsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4RTQsIDB4RjQsIDB4ODgsIDB4RkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4OTEsIDB4QTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4OTUsIDB4QzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4RTQsIDB4RjksIDB4RTUsIDB4NDAsIDB4MDAsIDB4MDAsIDB4OTQsIDB4RDcsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4RTQsIDB4RkMsIDB4OEYsIDB4RDQsIDB4OEUsIDB4QzcsIDB4RTUsIDB4NDIsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEIsIDB4QkMsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4N0QsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4NDMsIDB4MDAsIDB4MDAsIDB4OTUsIDB4OTksIC8qIDB4NTQtMHg1NyAqLworCTB4RTQsIDB4RkIsIDB4RUUsIDB4N0UsIDB4RTQsIDB4RDQsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4RkEsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4OTgsIDB4NkUsIDB4OTMsIDB4QTAsIDB4OTUsIDB4OTMsIDB4RUUsIDB4ODAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4NEEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4NTAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4NTEsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RTUsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4OTQsIDB4OTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4NEUsIC8qIDB4ODQtMHg4NyAqLworCTB4RTUsIDB4NDYsIDB4MDAsIDB4MDAsIDB4RTUsIDB4NDgsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4RTUsIDB4NTIsIDB4RTUsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4RTUsIDB4NEIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4OTIsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4OTMsIDB4RTMsIDB4MDAsIDB4MDAsIDB4RTUsIDB4NEMsIC8qIDB4OTgtMHg5QiAqLworCTB4RTUsIDB4NEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4RTUsIDB4NDUsIDB4MDAsIDB4MDAsIDB4OTEsIDB4NDUsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4RTUsIDB4NDksIDB4OEUsIDB4NDYsIDB4OTAsIDB4NjQsIDB4OEMsIDB4NEYsIC8qIDB4QTgtMHhBQiAqLworCTB4OTYsIDB4RjIsIDB4MDAsIDB4MDAsIDB4OTYsIDB4RjcsIDB4OEYsIDB4OTIsIC8qIDB4QUMtMHhBRiAqLworCTB4RUUsIDB4ODIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4NTYsIDB4RTUsIDB4NTQsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4OTgsIDB4NkQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4NTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4OTcsIDB4OTUsIDB4MDAsIDB4MDAsIDB4RTUsIDB4NTUsIC8qIDB4Q0MtMHhDRiAqLworCTB4RTUsIDB4NTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4NTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4RTUsIDB4NUIsIDB4RTUsIDB4NTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4OTMsIDB4QTEsIDB4RTUsIDB4NUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4OTQsIDB4Q0IsIDB4RTUsIDB4NEQsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEYsIDB4OTMsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4NUMsIDB4RTUsIDB4NjEsIDB4OTEsIDB4OTQsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4NjAsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzg2WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHg0MSwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHg2MiwgMHg5MSwgMHg2OCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHg1RCwgMHhFNSwgMHg1RiwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHg1RSwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5RiwgMHg1MCwgMHg5RiwgMHg0MSwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHg2NCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHg2MywgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHg5NywgMHg5NiwgMHgwMCwgMHgwMCwgMHhFMSwgMHhCQSwgLyogMHgyQy0weDJGICovCisJMHhFNSwgMHg2NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHg2NiwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHg2NywgMHg4QywgMHhENSwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHg4QiwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHhFNSwgMHg2OSwgMHg5OSwgMHg3QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QiwgMHg5NSwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHg5NywgMHhCOCwgMHgwMCwgMHgwMCwgMHg4QiwgMHhGMSwgMHhFNSwgMHg2QSwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHg2QiwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHg4RSwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHg2QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHg5MywgMHhGOCwgMHgwMCwgMHgwMCwgMHg4OCwgMHhCOCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OSwgMHhFMSwgMHhFNSwgMHg3MSwgLyogMHg4OC0weDhCICovCisJMHhFNSwgMHg3MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHg2RCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHg4RSwgMHg1QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHg2RSwgLyogMHhBMC0weEEzICovCisJMHg5NCwgMHg2MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHg2RiwgMHhFNSwgMHg3MCwgMHhFNSwgMHg3QSwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHg3NCwgLyogMHhBQy0weEFGICovCisJMHhFNSwgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHg3MywgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHhFNSwgMHg3NSwgMHgwMCwgMHgwMCwgMHhFNSwgMHg3NiwgMHg4RSwgMHhENiwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHg3OCwgMHgwMCwgMHgwMCwgMHg5MiwgMHg2MCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHg4QywgMHg3NSwgMHg4QSwgMHg2MSwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHhFNSwgMHg3QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHg4QSwgMHg1RSwgMHgwMCwgMHgwMCwgMHhFNSwgMHg4MSwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHg3QywgMHhFNSwgMHg4MCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHg5NCwgMHhCOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHg3RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHhFNSwgMHg3RSwgMHg5NSwgMHg2NywgMHg5NCwgMHhEOCwgMHhFNSwgMHg4MiwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHg5MSwgMHhGQiwgMHhFNSwgMHg4QywgMHgwMCwgMHgwMCwgMHhFNSwgMHg4OCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OSwgMHhFOSwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfODdbNTEyXSA9IHsKKwkweEU1LCAweDg2LCAweDAwLCAweDAwLCAweDk2LCAweDQ5LCAweEU1LCAweDg3LCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweDg0LCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweEU1LCAweDg1LCAweEU1LCAweDhBLCAweEU1LCAweDhELCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweDhCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweDg5LCAweEU1LCAweDgzLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDkyLCAweDc3LCAweDAwLCAweDAwLCAweEU1LCAweDk0LCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDk2LCAweEE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweDkyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweDkzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweEU1LCAweDhFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweDkwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweDkxLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweDhGLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDkwLCAweEU0LCAweDAwLCAweDAwLCAweDk4LCAweDU4LCAvKiAweDQ4LTB4NEIgKi8KKwkweEU1LCAweDk4LCAweDAwLCAweDAwLCAweEU1LCAweDk5LCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweDlGLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDkwLCAweDQ5LCAweDAwLCAweDAwLCAweEU1LCAweDlCLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweDlFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweDk2LCAvKiAweDVDLTB4NUYgKi8KKwkweEU1LCAweDk1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweEEwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg5LCAweERBLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweEU1LCAweDlDLCAweDAwLCAweDAwLCAweEU1LCAweEExLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweDlELCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweEU1LCAweDlBLCAweDAwLCAweDAwLCAweDkyLCAweEIxLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweEU1LCAweDk3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk0LCAweDg4LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweEE1LCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDk3LCAweDVBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweEE0LCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweEEzLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweEFDLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweEE2LCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweEFFLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk3LCAweDg2LCAweEU1LCAweEIxLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweEE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweEU1LCAweEE5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweEU1LCAweEFELCAweDAwLCAweDAwLCAweEU1LCAweEIwLCAweEU1LCAweEFGLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweEE3LCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweEU1LCAweEFBLCAweDAwLCAweDAwLCAweEU1LCAweEJCLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweEU1LCAweEI0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweEIyLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweEIzLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweEI4LCAweEU1LCAweEI5LCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDhBLCAweDQ5LCAweDAwLCAweDAwLCAweDhCLCAweDYxLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweEI3LCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184OFs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4QTIsIDB4MDAsIDB4MDAsIDB4RUUsIDB4ODUsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4QjYsIDB4RTUsIDB4QkEsIDB4RTUsIDB4QjUsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4QkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4QkUsIDB4RTUsIDB4QkQsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4QzAsIDB4RTUsIDB4QkYsIDB4RTUsIDB4NzksIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4QzQsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4QzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4QzIsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4QzMsIDB4MDAsIDB4MDAsIDB4RTUsIDB4QzUsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4OEMsIDB4OEMsIDB4MDAsIDB4MDAsIDB4RTUsIDB4QzcsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4RTUsIDB4QzYsIDB4MDAsIDB4MDAsIDB4OEYsIDB4NEYsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4OEQsIDB4NzMsIDB4OUYsIDB4QTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4QzgsIDB4OEYsIDB4NzAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEEsIDB4NTgsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4QzksIDB4MDAsIDB4MDAsIDB4ODksIDB4NzEsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4OEYsIDB4RDUsIDB4RTUsIDB4Q0EsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4OEQsIDB4NzQsIDB4RTUsIDB4Q0IsIDB4ODgsIDB4REYsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4OTUsIDB4NUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4Q0MsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4OTAsIDB4OEEsIDB4MDAsIDB4MDAsIDB4RTUsIDB4RDMsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4RDAsIDB4MDAsIDB4MDAsIDB4OTIsIDB4OEYsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4RDEsIDB4RTUsIDB4Q0UsIDB4OEIsIDB4REMsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4RTUsIDB4Q0QsIDB4RTUsIDB4RDQsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4OEMsIDB4NTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTEsIDB4REMsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4REEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4RDYsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTEsIDB4QjMsIDB4RTUsIDB4RDUsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4RDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4Q0YsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4RDksIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4RTUsIDB4REIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTQsIDB4RUQsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4RDcsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4RTUsIDB4REMsIDB4RTUsIDB4REUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4OEMsIDB4RDEsIDB4RTUsIDB4RDIsIDB4MDAsIDB4MDAsIDB4ODgsIDB4QkYsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4REQsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4OEQsIDB4RDksIDB4OTcsIDB4RjQsIDB4RTUsIDB4REYsIC8qIDB4QzAtMHhDMyAqLworCTB4RTUsIDB4RTAsIDB4OTEsIDB4OTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTcsIDB4QTAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4RTUsIDB4RTEsIDB4OTcsIDB4NTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4RTUsIDB4RTIsIDB4RTUsIDB4RTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4OTUsIDB4RTIsIDB4RTUsIDB4RTQsIDB4MDAsIDB4MDAsIDB4OEQsIDB4QkUsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4OTcsIDB4QTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4RTUsIDB4RTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4RUEsIDB4OEYsIDB4RDYsIC8qIDB4RjAtMHhGMyAqLworCTB4RTUsIDB4RTgsIDB4RUUsIDB4ODYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4OTcsIDB4ODcsIDB4RTUsIDB4RTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4RTUsIDB4RTcsIDB4OTAsIDB4QkIsIDB4OTAsIDB4OUUsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzg5WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhFNiwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHhFNSwgMHhFQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NSwgMHhBMSwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhFRCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHhFNSwgMHhFQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHg4QSwgMHg4QywgMHgwMCwgMHgwMCwgMHg5NiwgMHg0QSwgMHhFNSwgMHhFRSwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHhFRCwgMHg0MSwgMHhFNSwgMHhGQSwgMHhFNSwgMHhGMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHhGMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhGMiwgMHhFNSwgMHhGMywgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhGNywgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHhFNSwgMHhGOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhGNiwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHhGNCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhFRiwgLyogMHg0MC0weDQzICovCisJMHhFNSwgMHhGNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHhFNSwgMHhGOSwgMHhFOCwgMHhCNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OSwgMHhBNiwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhGQywgMHg4QiwgMHhERCwgLyogMHg1Qy0weDVGICovCisJMHhFNSwgMHhGQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHhFNiwgMHg0MSwgMHgwMCwgMHgwMCwgMHhFNiwgMHg0MCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHg0MywgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHhFNiwgMHg0MiwgMHgwMCwgMHgwMCwgMHhFNiwgMHg0NCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RiwgMHg1MCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHhFNiwgMHg0NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHg0NiwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHg0NywgMHg5MCwgMHhCQywgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHg5NywgMHg3NiwgMHgwMCwgMHgwMCwgMHhFNiwgMHg0OCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NSwgMHhBMiwgMHg5NCwgMHg2NSwgLyogMHg4NC0weDg3ICovCisJMHhFNiwgMHg0OSwgMHgwMCwgMHgwMCwgMHhFNiwgMHg0QSwgMHg4QywgMHhBOSwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QiwgMHg0QiwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHg0QiwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RSwgMHg4QiwgMHg5NCwgMHg2MCwgLyogMHg5NC0weDk3ICovCisJMHhFNiwgMHg0QywgMHgwMCwgMHgwMCwgMHg4QSwgMHg2RiwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHhFNiwgMHg0RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHg0RiwgMHg5NywgMHg5NywgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHhFNiwgMHg0RSwgMHg5MCwgMHg2NSwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHhFNiwgMHg1MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHg1MSwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHg1MiwgMHg4QSwgMHhDRiwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHg1MywgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHhFNiwgMHg1NCwgMHgwMCwgMHgwMCwgMHhFNiwgMHg1NSwgLyogMHhCQy0weEJGICovCisJMHhFNiwgMHg1NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QSwgMHg3MCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHg1NywgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHhFNiwgMHg1OCwgMHhFNiwgMHg1OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OSwgMHhGMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHg0NywgMHhFNiwgMHg1QSwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHhFNiwgMHg1QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHhFNiwgMHg1QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOEFbNTEyXSA9IHsKKwkweDhDLCAweEJFLCAweDAwLCAweDAwLCAweDkyLCAweEY5LCAweEU2LCAweDVELCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDhDLCAweDc2LCAweDAwLCAweDAwLCAweDkwLCAweDc1LCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweEU2LCAweDYwLCAweDAwLCAweDAwLCAweDkzLCAweEEyLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweEU2LCAweDVGLCAweDAwLCAweDAwLCAweEVFLCAweDg3LCAweDhDLCAweDUwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweDVFLCAweDkxLCAweEY1LCAvKiAweDE0LTB4MTcgKi8KKwkweDhCLCAweDRDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweDYxLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweEU2LCAweDYyLCAweDAwLCAweDAwLCAweDhGLCAweEQ3LCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhDLCAweDhELCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweEU2LCAweDYzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk2LCAweDRCLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDkwLCAweERELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDhCLCAweDk2LCAweDAwLCAweDAwLCAweDk2LCAweEYzLCAvKiAweDMwLTB4MzMgKi8KKwkweDkxLCAweDY5LCAweDAwLCAweDAwLCAweEU2LCAweDY0LCAweEVFLCAweDg4LCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkwLCAweDY2LCAweDkyLCAweDkwLCAvKiAweDM4LTB4M0IgKi8KKwkweDhGLCAweEQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweEU2LCAweDY1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweDY4LCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweEU2LCAweDY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDhELCAweEJDLCAweDkxLCAweEMwLCAweEU2LCAweDY3LCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDhGLCAweEQ5LCAweDk1LCAweDVELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweDY2LCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhFLCAweDhDLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDg5LCAweDcyLCAweDAwLCAweDAwLCAweEU2LCAweDZELCAweDhDLCAweDc3LCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhFLCAweDhFLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDhFLCAweDhELCAweDAwLCAweDAwLCAweDk4LCAweDZDLCAvKiAweDY4LTB4NkIgKi8KKwkweEU2LCAweDZDLCAweEU2LCAweDZCLCAweDkxLCAweDQ2LCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDhCLCAweDZDLCAweDk4LCAweDYyLCAweDhBLCAweDU5LCAweDhGLCAweERBLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweEVFLCAweDg5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweEU2LCAweDZBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweDZGLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweEU2LCAweDcwLCAweEU2LCAweDZFLCAweDAwLCAweDAwLCAweDhDLCAweEQ2LCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDk3LCAweDVGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDhFLCAweDhGLCAweDk0LCAweDQ2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweEU2LCAweDczLCAweDAwLCAweDAwLCAweDkwLCAweEJFLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDkyLCAweDYxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDk3LCAweDU1LCAweDAwLCAweDAwLCAweEU2LCAweDc2LCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhDLCAweEVBLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDkwLCAweEJELCAweEU2LCAweDcyLCAweDAwLCAweDAwLCAweEU2LCAweDc3LCAvKiAweEEwLTB4QTMgKi8KKwkweDhDLCAweEVCLCAweEU2LCAweDc0LCAweEU2LCAweDc1LCAweEVFLCAweDhBLCAvKiAweEE0LTB4QTcgKi8KKwkweEU2LCAweDcxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDkwLCAweEUwLCAweDkzLCAweEM3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDkyLCAweDRFLCAweDAwLCAweDAwLCAweDg5LCAweERCLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDk0LCAweEVFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDhCLCAweDYyLCAweDAwLCAweDAwLCAweEVFLCAweDhCLCAweDkyLCAweEIyLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweDdBLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweEU2LCAweDc4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweDZCLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkwLCAweEJGLCAvKiAweEM4LTB4Q0IgKi8KKwkweDhBLCAweEQwLCAweEU2LCAweDc5LCAweDAwLCAweDAwLCAweDkwLCAweDdBLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk3LCAweEM4LCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk4LCAweDVGLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweDdCLCAweEU2LCAweDg3LCAvKiAweEQ4LTB4REIgKi8KKwkweDkyLCAweEIzLCAweDAwLCAweDAwLCAweEU2LCAweDg2LCAweEVFLCAweDhDLCAvKiAweERDLTB4REYgKi8KKwkweEU2LCAweDgzLCAweEU2LCAweDhCLCAweEU2LCAweDg0LCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweEU2LCAweDgwLCAweDAwLCAweDAwLCAweDkyLCAweEZBLCAweEU2LCAweDdFLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweDdDLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDk3LCAweDQwLCAweDhFLCAweDkwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweEU2LCAweDgxLCAweDAwLCAweDAwLCAweEU2LCAweDdELCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweDhFLCAweEU2LCAweDg1LCAvKiAweEY0LTB4RjcgKi8KKwkweDhGLCAweDk0LCAweDAwLCAweDAwLCAweDhDLCAweEJGLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkxLCAweEY4LCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184Qls1MTJdID0geworCTB4OTYsIDB4NjQsIDB4ODksIDB4NzksIDB4ODgsIDB4RTAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4OTMsIDB4QTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4ODksIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4RTYsIDB4ODgsIDB4MDAsIDB4MDAsIDB4OTMsIDB4RTQsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4RTYsIDB4OEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4RTYsIDB4ODIsIDB4MDAsIDB4MDAsIDB4RTYsIDB4OEMsIDB4RTYsIDB4OEUsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4OEMsIDB4QUEsIDB4RTYsIDB4OEEsIDB4OEQsIDB4NzUsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4OEUsIDB4RDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4RTYsIDB4OEYsIDB4OTcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4OTIsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4RTYsIDB4OTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4OTMsIC8qIDB4MjgtMHgyQiAqLworCTB4OTUsIDB4NTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4OTAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4OEIsIDB4REUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4OTQsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4RTYsIDB4OTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4RTYsIDB4OUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4RTYsIDB4OTcsIDB4MDAsIDB4MDAsIDB4RTYsIDB4OTksIDB4RTYsIDB4OTgsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4OEYsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4OUIsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4OEUsIDB4QUYsIDB4MDAsIDB4MDAsIDB4RTYsIDB4OUQsIDB4RTYsIDB4OUMsIC8qIDB4NTgtMHg1QiAqLworCTB4OTUsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4OUYsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEMsIDB4NzgsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4OUUsIC8qIDB4NjgtMHg2QiAqLworCTB4RTYsIDB4QTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4QTEsIC8qIDB4NkMtMHg2RiAqLworCTB4OEIsIDB4NjMsIDB4RTMsIDB4QkYsIDB4OEYsIDB4RjcsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4RTYsIDB4QTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEMsIDB4RUMsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4RTYsIDB4QTMsIDB4MDAsIDB4MDAsIDB4RUUsIDB4OTAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RTYsIDB4QTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEUsIDB4NUQsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OUQsIDB4Q0MsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4RTYsIDB4QTUsIDB4MDAsIDB4MDAsIDB4RTYsIDB4QTYsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4OEYsIDB4NTEsIDB4MDAsIDB4MDAsIDB4RTYsIDB4QTcsIDB4RTYsIDB4QTgsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4QTksIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4RTYsIDB4QUEsIDB4RTYsIDB4QUIsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzhDWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHg0QSwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhBQywgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhBRSwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHhFNiwgMHhBRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MywgMHhBNCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHhFNiwgMHhBRiwgMHgwMCwgMHgwMCwgMHg5NiwgMHg0QywgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHhFNiwgMHhCMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhCMSwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHhFNiwgMHhCMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHhFNiwgMHhCMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MywgMHhEOCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHg4RiwgMHhEQiwgMHhFNiwgMHhCNCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RCwgMHg4QiwgMHg5OCwgMHhBQywgLyogMHg2OC0weDZCICovCisJMHhFNiwgMHhCNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHhFNiwgMHhCNiwgMHg5NSwgMHg1RSwgMHhFNiwgMHhCNywgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHhFNiwgMHhCRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhCOCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHhFNiwgMHhCQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHhFNiwgMHhCOSwgMHhFNiwgMHhCQiwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHg5NiwgMHg2NSwgMHhFNiwgMHhCQywgMHhFNiwgMHhCRCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHhFNiwgMHhCRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHhFNiwgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHg4QSwgMHg0QywgMHg5MiwgMHhFNSwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHg5NSwgMHg4OSwgMHg4RCwgMHhFMCwgMHg4RCwgMHg3NiwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NSwgMHg2RSwgLyogMHhBNC0weEE3ICovCisJMHg4OSwgMHhERCwgMHg5NCwgMHhDQywgMHhFNiwgMHhDMywgMHg4QSwgMHhEMSwgLyogMHhBOC0weEFCICovCisJMHg5MCwgMHhEMywgMHhFNiwgMHhDMiwgMHhFNiwgMHhDNywgMHg5MiwgMHg5OSwgLyogMHhBQy0weEFGICovCisJMHg5NiwgMHhFMSwgMHgwMCwgMHgwMCwgMHhFNiwgMHhDNSwgMHhFNiwgMHhDNiwgLyogMHhCMC0weEIzICovCisJMHg4QiwgMHg0RCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhDOCwgMHg5NCwgMHg4MywgLyogMHhCNC0weEI3ICovCisJMHg5MSwgMHhERCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NCwgMHhFRiwgLyogMHhCOC0weEJCICovCisJMHg5MywgMHg1QywgMHhFNiwgMHhDNCwgMHgwMCwgMHgwMCwgMHg5NiwgMHg2NiwgLyogMHhCQy0weEJGICovCisJMHg4OSwgMHhFQSwgMHhFNiwgMHhDQSwgMHg5OCwgMHg0NywgMHg5MiwgMHhDMCwgLyogMHhDMC0weEMzICovCisJMHg5OCwgMHg2NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RSwgMHg5MSwgLyogMHhDNC0weEM3ICovCisJMHhFNiwgMHhDOSwgMHgwMCwgMHgwMCwgMHg5MSwgMHhBRiwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHhFNiwgMHhEQSwgMHg5MSwgMHg0NywgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHg5MywgMHhGNiwgMHgwMCwgMHgwMCwgMHg5NSwgMHg2RiwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhDRCwgMHg4RSwgMHg1RSwgLyogMHhEOC0weERCICovCisJMHg4RSwgMHg5MiwgMHgwMCwgMHgwMCwgMHg4RiwgMHhEQywgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHg5NCwgMHg4NSwgMHgwMCwgMHgwMCwgMHg4QywgMHhBQiwgMHhFNiwgMHhDQywgLyogMHhFMC0weEUzICovCisJMHhFNiwgMHhDQiwgMHgwMCwgMHgwMCwgMHg5NSwgMHg4QSwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RSwgMHhCRiwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHg5MywgMHg3MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHhFRSwgMHg5MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHhFRSwgMHg5MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhDRiwgMHhFNiwgMHhEMCwgLyogMHhGOC0weEZCICovCisJMHg4RCwgMHg3NywgMHhFNiwgMHhDRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOERbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweEU2LCAweEQxLCAweEU2LCAweEQyLCAweDAwLCAweDAwLCAweEU2LCAweEQ0LCAvKiAweDA0LTB4MDcgKi8KKwkweDkxLCAweEExLCAweDAwLCAweDAwLCAweEU2LCAweEQzLCAweDhBLCAweEU0LCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweEU2LCAweEQ2LCAweDAwLCAweDAwLCAweEU2LCAweEQ1LCAvKiAweDBDLTB4MEYgKi8KKwkweEU2LCAweEQ3LCAweDAwLCAweDAwLCAweEVFLCAweDkzLCAweEU2LCAweEQ5LCAvKiAweDEwLTB4MTMgKi8KKwkweEU2LCAweERCLCAweDAwLCAweDAwLCAweEU2LCAweERDLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDkwLCAweEQ0LCAweDAwLCAweDAwLCAweDhFLCAweENELCAweEU2LCAweERELCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhBLCAweDcxLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweEU2LCAweERFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDkxLCAweDk2LCAweEU2LCAweERGLCAweDAwLCAweDAwLCAweEU2LCAweEUwLCAvKiAweDcwLTB4NzMgKi8KKwkweDk1LCAweDhCLCAweDAwLCAweDAwLCAweEVFLCAweDk0LCAweDhCLCAweDRFLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweEU2LCAweEUxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDkyLCAweEI0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg5LCAweDdBLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweEU2LCAweEUyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhFLCAweEVGLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDkwLCAweDk2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkxLCAweEFCLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweEU1LCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweEU0LCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweEUzLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweEVCLCAvKiAweEM4LTB4Q0IgKi8KKwkweEU2LCAweEU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweEU2LCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweEU4LCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweEU3LCAweEU2LCAweEVBLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDhCLCAweDk3LCAweDAwLCAweDAwLCAweEU2LCAweEVFLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDkwLCAweEQ1LCAweDAwLCAweDAwLCAweEU2LCAweEVGLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDhDLCAweEQ3LCAweDAwLCAweDAwLCAweEU2LCAweEVDLCAweEU2LCAweEVELCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk4LCAweDQ4LCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweEI1LCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDkxLCAweDQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweEU2LCAweEYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweEYzLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184RVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4RTYsIDB4RjEsIDB4RTYsIDB4RjIsIDB4OTcsIDB4NzgsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTMsIDB4QTUsIC8qIDB4MEMtMHgwRiAqLworCTB4RTYsIDB4RjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4RTYsIDB4RjQsIDB4RTYsIDB4RjUsIDB4RTYsIDB4RjcsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4NDgsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4RTYsIDB4RkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4RTYsIDB4RkIsIDB4RTYsIDB4RjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4RjgsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4OTIsIDB4RkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4NDAsIC8qIDB4NDQtMHg0NyAqLworCTB4RTcsIDB4NDQsIDB4RTcsIDB4NDEsIDB4RTYsIDB4RkMsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4RTcsIDB4NDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4RTcsIDB4NDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4RTcsIDB4NEEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4RTcsIDB4NDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTAsIDB4RDYsIC8qIDB4NUMtMHg1RiAqLworCTB4RTcsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4NDksIC8qIDB4NjAtMHg2MyAqLworCTB4RTcsIDB4NDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4NEMsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4OEYsIDB4NTIsIDB4MDAsIDB4MDAsIDB4RTcsIDB4NEIsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4RTcsIDB4NEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4RTcsIDB4NEUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4RTcsIDB4NTEsIDB4RTcsIDB4NTAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4NEYsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4NTMsIDB4RTcsIDB4NTIsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4OTYsIDB4RjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4RTcsIDB4NTUsIDB4MDAsIDB4MDAsIDB4RTcsIDB4NTQsIC8qIDB4OTAtMHg5MyAqLworCTB4RTcsIDB4NTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4RTcsIDB4NTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4RTcsIDB4NTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4NTgsIDB4OTAsIDB4NjcsIC8qIDB4QTgtMHhBQiAqLworCTB4RTcsIDB4NUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEIsIDB4RUIsIC8qIDB4QUMtMHhBRiAqLworCTB4RTcsIDB4NUIsIDB4RTcsIDB4NUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4NUUsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4RTcsIDB4NUYsIDB4RTcsIDB4NUMsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4RTcsIDB4NjAsIDB4MDAsIDB4MDAsIDB4OEUsIDB4RDQsIDB4RTcsIDB4NjEsIC8qIDB4QzgtMHhDQiAqLworCTB4OEIsIDB4NEYsIDB4OEMsIDB4NTIsIDB4MDAsIDB4MDAsIDB4RUUsIDB4OTYsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEMsIDB4QUMsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4NjIsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTMsIDB4RUUsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTMsIDB4NUQsIDB4RTcsIDB4NjMsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4NjYsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4OEUsIDB4QjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4NjUsIC8qIDB4RjgtMHhGQiAqLworCTB4RTcsIDB4NjQsIDB4OEMsIDB4NzksIDB4RTcsIDB4NjcsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzhGWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QSwgMHg3MiwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHhFNywgMHg2OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHg4RCwgMHhEQSwgMHhFNywgMHg2OCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHhFNywgMHg3MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHg2QiwgMHhFNywgMHg2RCwgLyogMHgxMC0weDEzICovCisJMHg5NSwgMHhFMywgMHhFNywgMHg2QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHhFNywgMHg2QywgMHgwMCwgMHgwMCwgMHhFNywgMHg3MCwgLyogMHgxOC0weDFCICovCisJMHhFNywgMHg2RSwgMHg4QiwgMHg1MCwgMHgwMCwgMHgwMCwgMHhFNywgMHg2RiwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHg3MiwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHg5NCwgMHg3OSwgMHg5NywgMHhENiwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RiwgMHg1MywgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHg3MywgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHg5NywgMHg0MSwgMHhFNywgMHg3NSwgMHgwMCwgMHgwMCwgMHhFNywgMHg3NCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHg3OCwgMHg5NywgMHg2MCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHg3NywgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHg4QSwgMHg4RCwgMHhFNywgMHg3NiwgMHhFNywgMHg3QiwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHhFNywgMHg3QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHhFNywgMHg3OSwgMHg5MywgMHg1MSwgMHhFNywgMHg3QywgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHg3RCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHhFNywgMHg3RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RCwgMHg4QywgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHg4QywgMHg0NCwgMHhFNywgMHg4MCwgMHhFNywgMHg4MSwgLyogMHg2MC0weDYzICovCisJMHhFNywgMHg4MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHg2OCwgLyogMHg5OC0weDlCICovCisJMHhFNywgMHg4MywgMHgwMCwgMHgwMCwgMHg4RSwgMHhBQiwgMHhFNywgMHg4NCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHg4NSwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OSwgMHg5RiwgLyogMHhBNC0weEE3ICovCisJMHg5OSwgMHg5RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHhFNywgMHg4NiwgMHhFMywgMHg5MCwgMHhFNywgMHg4NywgLyogMHhBQy0weEFGICovCisJMHg5MiwgMHg0MywgMHg5MCwgMHg0QSwgMHg5NCwgMHg1RiwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHg4OCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NSwgMHhEMywgMHg5MiwgMHhEMiwgLyogMHhCOC0weEJCICovCisJMHg4RCwgMHg5RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHg0OCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OSwgMHg0OSwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHg5NiwgMHg5OCwgMHg5MCwgMHg3NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QywgMHg3RCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHg4QiwgMHhERiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHg5NSwgMHhENCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHg4OSwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHg4QiwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHhFNywgMHg4QSwgMHg4OSwgMHhERSwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHg5MywgMHhGNCwgMHhFNywgMHg4QywgMHg5NCwgMHg5NywgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHg5MywgMHg1MiwgMHgwMCwgMHgwMCwgMHhFNywgMHg4RCwgLyogMHhFQy0weEVGICovCisJMHg4RiwgMHg3MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHhFNywgMHg4RiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NiwgMHhDMCwgLyogMHhGNC0weEY3ICovCisJMHhFNywgMHg5RSwgMHhFNywgMHg5MSwgMHhFNywgMHg5MiwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHg5MiwgMHhDNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOTBbNTEyXSA9IHsKKwkweDkxLCAweERFLCAweDkxLCAweDk3LCAweDAwLCAweDAwLCAweDkzLCAweEE2LCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweEU3LCAweDkwLCAweDhCLCAweDc0LCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweDk5LCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweEU3LCAweDk2LCAweEU3LCAweEEzLCAweDkzLCAweEE3LCAvKiAweDBDLTB4MEYgKi8KKwkweDkyLCAweDgwLCAweEU3LCAweDkzLCAweDAwLCAweDAwLCAweDkyLCAweEZDLCAvKiAweDEwLTB4MTMgKi8KKwkweDkzLCAweDcyLCAweEU3LCAweDk0LCAweEU3LCAweDk4LCAweDkwLCAweDgwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDk0LCAweDg3LCAweDkyLCAweENBLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDkwLCAweEMwLCAweEU3LCAweDk3LCAweDkxLCAweEFDLCAvKiAweDFDLTB4MUYgKi8KKwkweDkxLCAweEEyLCAweEU3LCAweDk1LCAweDg4LCAweEE3LCAweDk4LCAweDQxLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweDlBLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkxLCAweERGLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDhGLCAweDU0LCAweDkwLCAweDY5LCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweEU3LCAweDlDLCAweEU3LCAweDlCLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDg4LCAweEVELCAweEU3LCAweDlELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDk1LCAweDRFLCAweDAwLCAweDAwLCAweEU3LCAweEE1LCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDkzLCAweEQ5LCAweDkwLCAweDhCLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDkyLCAweDc4LCAweDAwLCAweDAwLCAweDhCLCAweEY2LCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweEU3LCAweEE0LCAweDk3LCAweDU2LCAweDg5LCAweDVFLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDk1LCAweEQ1LCAweDg5LCAweERGLCAweEU3LCAweDlGLCAvKiAweDRDLTB4NEYgKi8KKwkweEU3LCAweEEwLCAweEU3LCAweEExLCAweEU3LCAweEEyLCAweDkzLCAweEI5LCAvKiAweDUwLTB4NTMgKi8KKwkweDkyLCAweDQyLCAweDg4LCAweEUxLCAweEU3LCAweEE2LCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweEU3LCAweEE3LCAweEVBLCAweEExLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDkxLCAweEJCLCAweDAwLCAweDAwLCAweEU3LCAweEE4LCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDg5LCAweDkzLCAweDkxLCAweDZCLCAweDAwLCAweDAwLCAweDhDLCAweEFELCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDk3LCAweDc5LCAweDAwLCAweDAwLCAweEVFLCAweDk5LCAvKiAweDY0LTB4NjcgKi8KKwkweEU3LCAweEE5LCAweDkzLCAweDRCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDkxLCAweDk4LCAweDhFLCAweEQ1LCAweEU3LCAweEFBLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweEFELCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDhGLCAweDg1LCAweEU3LCAweEFCLCAweDkxLCAweDRBLCAvKiAweDc0LTB4NzcgKi8KKwkweDkxLCAweDQ5LCAweDAwLCAweDAwLCAweDg4LCAweEUyLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDk3LCAweEM5LCAweEU3LCAweEFGLCAweDAwLCAweDAwLCAweDk0LCAweEYwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEU3LCAweEIxLCAweEU3LCAweEIwLCAweEU3LCAweEFFLCAweEUyLCAweDg0LCAvKiAweDgwLTB4ODMgKi8KKwkweDhBLCAweEQyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweDhFLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweEU3LCAweEIzLCAweEU3LCAweEIyLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweEI0LCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDk3LCAweDU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkzLCAweERGLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk2LCAweDRELCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweEU3LCAweEI1LCAweDAwLCAweDAwLCAweDhFLCAweEQ3LCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweEI2LCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweEU3LCAweEI3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweEU3LCAweEI4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDkzLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDg4LCAweEU4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhELCAweDc4LCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk4LCAweDU5LCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweEJDLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweDlBLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDhDLCAweDUzLCAweEU3LCAweEI5LCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweEU3LCAweEJBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDk1LCAweDk0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDhBLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDk3LCAweDU4LCAweDAwLCAweDAwLCAweDhCLCAweEJELCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDkzLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185MVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4QkQsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4QkUsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4OUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4RTcsIDB4QkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4OUQsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4OTMsIDB4NDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4RTcsIDB4QzEsIDB4MDAsIDB4MDAsIDB4RTcsIDB4QzAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4OTMsIDB4RDEsIDB4RTcsIDB4QzIsIDB4OEYsIDB4NTUsIC8qIDB4NDgtMHg0QiAqLworCTB4OEUsIDB4REUsIDB4OTQsIDB4N0EsIDB4OTIsIDB4OTEsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEUsIDB4RjAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4OTAsIDB4OEMsIDB4MDAsIDB4MDAsIDB4RTcsIDB4QzMsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4RTcsIDB4QzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTAsIDB4N0MsIDB4RTcsIDB4QzUsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4RTcsIDB4QzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4RTcsIDB4QzcsIDB4OTcsIDB4OEYsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4OEYsIDB4NTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4QzksIDB4RTcsIDB4QzgsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4OEQsIDB4NzksIDB4MDAsIDB4MDAsIDB4OEQsIDB4OTMsIC8qIDB4NzQtMHg3NyAqLworCTB4OEUsIDB4NUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4Q0MsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEYsIDB4ODYsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4RTcsIDB4Q0IsIDB4MDAsIDB4MDAsIDB4RTcsIDB4Q0EsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4OTEsIDB4RTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4OEMsIDB4RUQsIDB4MDAsIDB4MDAsIDB4OTAsIDB4QzEsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTQsIDB4QUUsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4OEYsIDB4NTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4Q0QsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4OEYsIDB4REQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4RDAsIDB4RTcsIDB4Q0UsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4Q0YsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4RTcsIDB4RDIsIDB4RTcsIDB4RDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4OEYsIDB4RjgsIDB4MDAsIDB4MDAsIDB4RTcsIDB4RDMsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4RTcsIDB4RDQsIDB4RTcsIDB4RDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTQsIDB4Q0UsIDB4OEQsIDB4RDEsIC8qIDB4QzQtMHhDNyAqLworCTB4OEUsIDB4REYsIDB4RTcsIDB4RDYsIDB4MDAsIDB4MDAsIDB4RTcsIDB4RDcsIC8qIDB4QzgtMHhDQiAqLworCTB4OTcsIDB4QTIsIDB4OEYsIDB4NjQsIDB4OTYsIDB4RUMsIDB4OTcsIDB4Q0EsIC8qIDB4Q0MtMHhDRiAqLworCTB4RTcsIDB4RDgsIDB4OEIsIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4RDksIDB4RUUsIDB4OUYsIC8qIDB4RDQtMHhENyAqLworCTB4OTMsIDB4NDIsIDB4MDAsIDB4MDAsIDB4RUUsIDB4OUUsIDB4RTcsIDB4REMsIC8qIDB4RDgtMHhEQiAqLworCTB4OEEsIDB4OTgsIDB4OTAsIDB4NkEsIDB4RUUsIDB4QTAsIDB4RTcsIDB4REEsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4RTcsIDB4REIsIDB4MDAsIDB4MDAsIDB4OTIsIDB4REUsIC8qIDB4RTAtMHhFMyAqLworCTB4RUUsIDB4QTMsIDB4RUUsIDB4QTQsIDB4OTYsIDB4NzQsIDB4OEIsIDB4RkEsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4QTEsIDB4RUUsIDB4QTIsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4RTcsIDB4REUsIDB4RTcsIDB4REYsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4RTcsIDB4REQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4RTEsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzkyWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHhBNSwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHhBNywgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHg5MywgMHhERCwgMHg4QSwgMHg2MiwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHhFRSwgMHhBNiwgMHhFNywgMHhFNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHhFNywgMHhFMiwgMHhFNywgMHhFNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHhFMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHhFOCwgMHg2RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHhFNywgMHhFMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHg5NywgMHhFOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QywgMHhEOCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHhFRSwgMHhBRSwgMHhFRSwgMHhBOCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHhFRSwgMHhBQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHhFRCwgLyogMHgzQy0weDNGICovCisJMHhFRSwgMHhBOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHg5MywgMHg1MywgMHhFNywgMHhFOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHhFNywgMHhFQiwgMHhFNywgMHhFOSwgMHgwMCwgMHgwMCwgMHhFNywgMHhFRSwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHhBQiwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHhFNywgMHhFRiwgMHhFRSwgMHhBRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHhFNywgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhFRSwgMHhBQywgMHhFNywgMHhGNCwgMHg4OSwgMHg5NCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHhFNiwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NCwgMHhBQiwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHhFNywgMHhFQSwgMHgwMCwgMHgwMCwgMHg4RiwgMHhERSwgMHhFRSwgMHhBRiwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHg4RCwgMHg3QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHhCMSwgLyogMHg3NC0weDc3ICovCisJMHhFRSwgMHhCMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NiwgMHg2NywgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHg4QiwgMHhFMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4RiwgMHg2NSwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHg5MywgMHhCQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHhFRCwgMHg0MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHg5MSwgMHg0QywgMHgwMCwgMHgwMCwgMHhFNywgMHhGMiwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHhFNywgMHhFQywgMHhFNywgMHhGMSwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHg5NiwgMHhDMSwgMHgwMCwgMHgwMCwgMHg5MiwgMHhCNiwgMHhFNywgMHhGMywgLyogMHg5OC0weDlCICovCisJMHhFNywgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHhCMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHg5MSwgMHg0QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHhGNywgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHhFNywgMHhGNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHhGNSwgLyogMHhDQy0weENGICovCisJMHhFRSwgMHhCNiwgMHgwMCwgMHgwMCwgMHg5NiwgMHg0RSwgMHhFRSwgMHhCQSwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHhFRSwgMHhCOCwgMHgwMCwgMHgwMCwgMHhFRSwgMHhCNCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHhFRSwgMHhCNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHhFRSwgMHhCOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHg4RiwgMHg5QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHhCMywgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHhFNywgMHhGOCwgMHg5NSwgMHhERCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHg4OSwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NSwgMHg2NSwgMHg5MiwgMHg5MiwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHg4QiwgMHg5OCwgMHhFRCwgMHg0OSwgMHhFNywgMHhGQSwgMHhFRSwgMHhCRCwgLyogMHhGOC0weEZCICovCisJMHg4RCwgMHg3QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHhDMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOTNbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweEMyLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhFLCAweDRCLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweEY5LCAvKiAweDBDLTB4MEYgKi8KKwkweDkwLCAweDhELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDkwLCAweDhFLCAweEU4LCAweDQwLCAweEU4LCAweDQyLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweEVFLCAweEMxLCAweEVFLCAweEJGLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDhGLCAweEY5LCAweEVFLCAweEJDLCAweEU4LCAweDQxLCAweEU4LCAweDQzLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweEVFLCAweEJCLCAweDhCLCAweEQxLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDk1LCAweDY0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhFLCAweEUwLCAvKiAweDI4LTB4MkIgKi8KKwkweDk4LCAweDQyLCAweDAwLCAweDAwLCAweEU3LCAweEZDLCAweDhELCAweEY2LCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk4LCAweDVFLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweDQ1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweDQ0LCAweEU4LCAweDQ2LCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweEU3LCAweEZCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweEVELCAweDQyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkzLCAweEU3LCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDkzLCAweDc0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDkyLCAweEQ1LCAweDAwLCAweDAwLCAweEU4LCAweDRCLCAweEVFLCAweEM0LCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweDYyLCAvKiAweDU4LTB4NUIgKi8KKwkweEU4LCAweDQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweEU4LCAweDQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDhDLCAweDRDLCAweDAwLCAweDAwLCAweEU4LCAweDRBLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweEVFLCAweEMzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDhDLCAweEFFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweEU4LCAweDQ5LCAweDAwLCAweDAwLCAweDhGLCAweERGLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDhBLCAweDk5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweEU4LCAweDRGLCAweDAwLCAweDAwLCAweDhELCAweEJELCAweDkxLCAweDk5LCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweEM4LCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweEVFLCAweEM1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhBLCAweDVBLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweEU4LCAweDRELCAweEU4LCAweDRFLCAweDkyLCAweEMxLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweEU4LCAweDRDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweDUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweDU2LCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweEM2LCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweEU4LCAweDU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweEU4LCAweDU4LCAweDkzLCAweDRDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweDUxLCAweEU4LCAweDUyLCAvKiAweEQ0LTB4RDcgKi8KKwkweEU4LCAweDU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweDU3LCAweEVFLCAweEM3LCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDhCLCAweEJFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweEU4LCAweDVBLCAweEU4LCAweDU0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweEU4LCAweDUzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweEVFLCAweEM4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185NFs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4NUUsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4NUYsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4RTgsIDB4NjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4NUQsIC8qIDB4MTAtMHgxMyAqLworCTB4RTgsIDB4NUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4OEYsIDB4RTAsIDB4OTMsIDB4QTgsIDB4RTgsIDB4NUIsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4NjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4NjIsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4QzksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4NjMsIDB4RTgsIDB4NjEsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4OTEsIDB4RjYsIDB4MDAsIDB4MDAsIDB4RTgsIDB4NjUsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4RTgsIDB4NjgsIDB4RUUsIDB4Q0EsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4RUUsIDB4Q0IsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4OEEsIDB4RDMsIDB4RTgsIDB4NjcsIDB4OTYsIDB4RjgsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4NzMsIDB4RTgsIDB4NjksIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4NkMsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4RTgsIDB4NkEsIDB4MDAsIDB4MDAsIDB4RTgsIDB4NkIsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4NkQsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4RTgsIDB4NkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4NzAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4NzEsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4RTgsIDB4NzQsIDB4RTgsIDB4NzIsIDB4RTgsIDB4NzUsIDB4RTgsIDB4NzcsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4RTgsIDB4NzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzk1WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MiwgMHhCNywgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHg5NiwgMHhFNSwgMHgwMCwgMHgwMCwgMHhFOCwgMHg3OCwgMHg5MSwgMHg0RCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOCwgMHg3OSwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHg5NSwgMHhDMiwgMHhFOCwgMHg3QSwgMHg4QSwgMHg0QSwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OSwgMHg1QiwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHg4QSwgMHhENSwgMHhFRSwgMHhDQywgMHg4QSwgMHhENCwgLyogMHg5MC0weDkzICovCisJMHhFOCwgMHg3QiwgMHgwMCwgMHgwMCwgMHhFOCwgMHg3QywgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHhFOCwgMHg3RCwgMHhFOCwgMHg3RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHhFOCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4QSwgMHhENiwgMHg4QSwgMHg3NCwgLyogMHhBMC0weEEzICovCisJMHg4RCwgMHg3RCwgMHg5NCwgMHhCNCwgMHgwMCwgMHgwMCwgMHhFOCwgMHg4MiwgLyogMHhBNC0weEE3ICovCisJMHhFOCwgMHg4MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHhFOCwgMHg4MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OSwgMHg3QiwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHhFOCwgMHg4NiwgMHgwMCwgMHgwMCwgMHhFOCwgMHg4NSwgLyogMHhCOC0weEJCICovCisJMHhFOCwgMHg4NCwgMHgwMCwgMHgwMCwgMHhFOCwgMHg4NywgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOCwgMHg4QSwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHhDNSwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOCwgMHg4OCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHhFOCwgMHg4QywgMHhFOCwgMHg4QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHhFOCwgMHg4RSwgMHhFOCwgMHg4RCwgMHhFOCwgMHg4RiwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHg5MywgMHhBQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHhFOCwgMHg5MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHhFOCwgMHg5MSwgMHhFOCwgMHg5MywgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHhFOCwgMHg5MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOTZbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDk1LCAweDhDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweDk0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweEU4LCAweDk1LCAweDAwLCAweDAwLCAweDhELCAweEUzLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweDk2LCAweEU4LCAweDk3LCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk2LCAweDY4LCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkxLCAweDZBLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg4LCAweEEyLCAvKiAweDNDLTB4M0YgKi8KKwkweDkxLCAweEM5LCAweDAwLCAweDAwLCAweEU4LCAweDk4LCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDk1LCAweDhELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweDlCLCAvKiAweDQ4LTB4NEIgKi8KKwkweEU4LCAweDk5LCAweDhELCAweDdFLCAweDAwLCAweDAwLCAweEU4LCAweDlBLCAvKiAweDRDLTB4NEYgKi8KKwkweDhDLCAweEMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk1LCAweEMzLCAvKiAweDU4LTB4NUIgKi8KKwkweEU4LCAweDlELCAweEU4LCAweDlGLCAweEU4LCAweDlFLCAweEU4LCAweEEwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDg5LCAweDQwLCAweDkwLCAweDc3LCAvKiAweDYwLTB4NjMgKi8KKwkweDhGLCAweDlDLCAweDhBLCAweEQ3LCAweEU4LCAweEExLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk0LCAweDg2LCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweEU4LCAweEEzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDg5LCAweDQxLCAweDAwLCAweDAwLCAweEU4LCAweEEyLCAweDkyLCAweEMyLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDk3LCAweENCLCAweDkzLCAweEE5LCAweEU4LCAweDlDLCAvKiAweDc0LTB4NzcgKi8KKwkweDk3LCAweEE0LCAweDAwLCAweDAwLCAweDhDLCAweEFGLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDk3LCAweDdBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDhCLCAweEY3LCAweDk3LCAweEIyLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDhDLCAweDQ3LCAweDAwLCAweDAwLCAweDkxLCAweEUwLCAweEU0LCAweDQwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweEE0LCAweDhBLCAweDRCLCAweDkwLCAweDhGLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDhBLCAweDc1LCAweEU4LCAweEE2LCAweDAwLCAweDAwLCAweEU4LCAweEE3LCAvKiAweDk0LTB4OTcgKi8KKwkweEU4LCAweEE1LCAweDhDLCAweDg0LCAweDAwLCAweDAwLCAweDhELCAweERCLCAvKiAweDk4LTB4OUIgKi8KKwkweDhGLCAweEUxLCAweEVFLCAweENGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDg5LCAweDQyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk3LCAweEQ3LCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweEE5LCAvKiAweEE0LTB4QTcgKi8KKwkweEU3LCAweEFDLCAweDAwLCAweDAwLCAweEU4LCAweEE4LCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweEQwLCAvKiAweEFDLTB4QUYgKi8KKwkweEU4LCAweEFDLCAweEU4LCAweEFBLCAweEU4LCAweEFCLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweEU4LCAweEFELCAweDAwLCAweDAwLCAweEU4LCAweEFFLCAweDk3LCAweEVBLCAvKiAweEI0LTB4QjcgKi8KKwkweEU4LCAweEFGLCAweEU4LCAweEIwLCAweDAwLCAweDAwLCAweDkwLCAweEM3LCAvKiAweEI4LTB4QkIgKi8KKwkweDk0LCAweEI5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDkwLCAweDlELCAweDhBLCAweEU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDk3LCAweDU5LCAweDg5LCAweEVCLCAweDhGLCAweDU3LCAweDhDLCAweEQ5LCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweEIzLCAweDAwLCAweDAwLCAweEU4LCAweEIyLCAvKiAweEM4LTB4Q0IgKi8KKwkweDhFLCAweDkzLCAweEU4LCAweEI0LCAweEU4LCAweEIxLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDhFLCAweDQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweEI4LCAweEU1LCAweEFCLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDk5LCAweEQ0LCAweDAwLCAweDAwLCAweDkwLCAweDk3LCAvKiAweEQ4LTB4REIgKi8KKwkweEU4LCAweEI2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk3LCAweEEzLCAweDkzLCAweEVGLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDg5LCAweDRBLCAweDAwLCAweDAwLCAweDkwLCAweEUxLCAweDhFLCAweEI0LCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDk1LCAweEI1LCAweDAwLCAweDAwLCAweDg5LCAweDVGLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk3LCAweEVCLCAweDk3LCAweDhCLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweEI5LCAweDAwLCAweDAwLCAweDkzLCAweDY0LCAvKiAweEY4LTB4RkIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185N1s1MTJdID0geworCTB4OEUsIDB4RjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4RTgsIDB4QkEsIDB4MDAsIDB4MDAsIDB4RTgsIDB4QkIsIDB4OTAsIDB4NkIsIC8qIDB4MDQtMHgwNyAqLworCTB4RTgsIDB4QkMsIDB4MDAsIDB4MDAsIDB4OTcsIDB4RUMsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4QjcsIDB4RTgsIDB4QkUsIDB4RTgsIDB4QzAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4QkYsIDB4MDAsIDB4MDAsIDB4RTgsIDB4QkQsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4QzEsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4QzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4OTEsIDB4OUEsIDB4MDAsIDB4MDAsIDB4ODksIDB4RTAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4RTgsIDB4QzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTYsIDB4QjYsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4QzQsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4RTgsIDB4QzUsIDB4MDAsIDB4MDAsIDB4OTgsIDB4NDksIDB4RUUsIDB4RDEsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4OUUsIDB4NTAsIDB4RTgsIDB4QzYsIDB4MDAsIDB4MDAsIDB4RUUsIDB4RDIsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4QzcsIDB4RTgsIDB4QzgsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4Q0MsIDB4RUUsIDB4RDMsIC8qIDB4NDAtMHg0MyAqLworCTB4RTgsIDB4QzksIDB4MDAsIDB4MDAsIDB4RTgsIDB4Q0EsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4RTgsIDB4Q0IsIDB4RTgsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4RDQsIDB4MDAsIDB4MDAsIDB4RUUsIDB4RDUsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4RDYsIDB4OTAsIDB4QzIsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4RDcsIDB4OTYsIDB4RjUsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4OTAsIDB4QzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4RTgsIDB4Q0UsIDB4MDAsIDB4MDAsIDB4OTQsIDB4RjEsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4RTgsIDB4Q0YsIDB4RUEsIDB4NzIsIDB4OTYsIDB4Q0EsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4RTgsIDB4RDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4RDEsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4RTgsIDB4RDIsIDB4OEEsIDB4NzYsIDB4MDAsIDB4MDAsIDB4RTgsIDB4RDQsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4OTAsIDB4NzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4RDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4OEMsIDB4NDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4RDYsIDB4RTgsIDB4REEsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4RTgsIDB4RDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4RTgsIDB4RDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4OEEsIDB4OTMsIDB4RTgsIDB4RDcsIDB4RTgsIDB4REIsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4REMsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4ODgsIDB4QzYsIDB4MDAsIDB4MDAsIDB4RTgsIDB4REQsIC8qIDB4OEMtMHg4RiAqLworCTB4RTgsIDB4REUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4OEYsIDB4RTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4RTgsIDB4REYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4OEIsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4RTIsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4RTEsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4RTgsIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4OTEsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4OTUsIDB4REEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4RTMsIC8qIDB4QjAtMHhCMyAqLworCTB4RTgsIDB4RTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4RTUsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4RTYsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4RTgsIDB4RTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4RTgsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEEsIDB4RDgsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4RTgsIDB4RTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4RUEsIDB4OTQsIDB4NDIsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4RUMsIDB4ODksIDB4QjksIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4RUYsIDB4RTgsIDB4RUUsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4NDMsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEIsIDB4QkYsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzk4WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHg5NSwgMHhDNSwgMHg5MiwgMHhCOCwgMHg4RCwgMHhBMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHg4RCwgMHg4MCwgMHg4RiwgMHg4NywgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHg5MCwgMHg3QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHhFOCwgMHhGMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOCwgMHhGMCwgLyogMHgwQy0weDBGICovCisJMHg5NywgMHg2MSwgMHg4QSwgMHhFNiwgMHg5NCwgMHhEMCwgMHg5MywgMHhEQSwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHg5QywgLyogMHgxNC0weDE3ICovCisJMHg5NywgMHhDQywgMHgwMCwgMHgwMCwgMHg4QywgMHg3QSwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHhFOCwgMHhGNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHhFOCwgMHhGMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHg5NiwgMHg2QSwgMHg5MywgMHhBQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHg4OSwgMHg2RiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOCwgMHhGNSwgLyogMHgzNC0weDM3ICovCisJMHhFOCwgMHhGMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NSwgMHg3MCwgLyogMHgzOC0weDNCICovCisJMHg5NywgMHg4QSwgMHhFOCwgMHhGNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOCwgMHhGNywgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOCwgMHhGOSwgLyogMHg0OC0weDRCICovCisJMHg5MSwgMHhFOCwgMHg4QSwgMHg3QSwgMHg4QSwgMHg3QiwgMHhFOCwgMHhGOCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHg4QSwgMHhFNywgMHg4QywgMHhCMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHhEOCwgLyogMHg1NC0weDU3ICovCisJMHg4QSwgMHhFOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MywgMHg1RSwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NywgMHhERSwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHhFRSwgMHhEOSwgMHgwMCwgMHgwMCwgMHg4QywgMHhEQSwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOCwgMHhGQSwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOCwgMHhGQiwgLyogMHg2Qy0weDZGICovCisJMHhFOCwgMHhGQywgMHhFOSwgMHg0MCwgMHgwMCwgMHgwMCwgMHhFOSwgMHg0MiwgLyogMHg3MC0weDczICovCisJMHhFOSwgMHg0MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHg5NSwgMHg5NywgMHgwMCwgMHgwMCwgMHhFOSwgMHg0MywgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHg0NCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHg0NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHg0NiwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHg0OCwgLyogMHhDMC0weEMzICovCisJMHhFOSwgMHg0NywgMHgwMCwgMHgwMCwgMHhFOSwgMHg0OSwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NCwgMHhGMiwgLyogMHhEOC0weERCICovCisJMHhFMywgMHhDQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MCwgMHg0OCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4QiwgMHg1MSwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHg0QSwgMHgwMCwgMHgwMCwgMHhFOSwgMHg0QiwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHg5OSwgMHhBQSwgMHg5RiwgMHg1QSwgMHg5NCwgMHhEMSwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHhGOSwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHg4OCwgMHhCOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHg4RSwgMHg5NCwgMHg5NiwgMHg0RiwgMHg4RiwgMHhGQywgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOTlbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweDRDLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDk2LCAweERELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweDRELCAweDk3LCAweDdCLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDg5LCAweDYxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDhFLCAweDYwLCAweDAwLCAweDAwLCAweEU5LCAweDRFLCAweDg5LCAweEVDLCAvKiAweDEwLTB4MTMgKi8KKwkweEU5LCAweDRGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweEU5LCAweDUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweDUyLCAweEU5LCAweDUzLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweEU5LCAweDU1LCAweEU5LCAweDUxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweEU5LCAweDU0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweERDLCAvKiAweDI0LTB4MjcgKi8KKwkweDhBLCAweEQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweEU5LCAweDU2LCAweDAwLCAweDAwLCAweEU5LCAweDU3LCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweDU4LCAweEU5LCAweDU5LCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweDVBLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweDVDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweDVCLCAweDAwLCAweDAwLCAweEU5LCAweDVFLCAvKiAweDQ4LTB4NEIgKi8KKwkweEU5LCAweDYxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweEU5LCAweDVELCAweEU5LCAweDVGLCAweEU5LCAweDYwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweDYyLCAweDAwLCAweDAwLCAweDhCLCAweEMwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhFLCAweEYxLCAweEU5LCAweDYzLCAvKiAweDk0LTB4OTcgKi8KKwkweEU5LCAweDY0LCAweDhELCAweDgxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweERFLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweDY1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDhBLCAweDVELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDk0LCAweDZFLCAweEU5LCAweDY2LCAweEU5LCAweDY3LCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkyLCAweDc5LCAvKiAweEIwLTB4QjMgKi8KKwkweDkzLCAweEU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweEU5LCAweDY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDk0LCAweDlELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDkxLCAweENBLCAweDg5LCAweDc3LCAweDhCLCAweEVDLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDhCLCAweEVELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDkyLCAweDkzLCAweEU5LCAweDZELCAweDhCLCAweEVFLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDg5LCAweEVELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweEU5LCAweDZDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweDZBLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweDZCLCAweDAwLCAweDAwLCAweEU5LCAweDY5LCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweDc3LCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweDZFLCAweEU5LCAweDZGLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweDcwLCAweEU5LCAweDcxLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweEU5LCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweDcyLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhGLCAweDc4LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185QVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4RTksIDB4NzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4RTksIDB4NzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEIsIDB4NTIsIDB4RTksIDB4NzUsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTEsIDB4OUIsIDB4OEMsIDB4QjEsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4RTksIDB4NzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4OTEsIDB4Q0IsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4NzksIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4OTMsIDB4QUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4N0EsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4ODAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4RTksIDB4N0QsIDB4MDAsIDB4MDAsIDB4RTksIDB4N0MsIDB4RTksIDB4N0UsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4RTksIDB4N0IsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4RTksIDB4ODIsIDB4RUUsIDB4REYsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4RTksIDB4ODEsIDB4MDAsIDB4MDAsIDB4RTksIDB4ODQsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEIsIDB4QzEsIDB4RTksIDB4ODMsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4ODUsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4ODYsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4RTksIDB4ODgsIDB4RTksIDB4ODcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4RTksIDB4ODksIDB4RTksIDB4OEIsIDB4RTksIDB4OEEsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4OEQsIDB4OUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4RTksIDB4OEMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4RTksIDB4OEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4OEEsIDB4NUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4RTksIDB4OEUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4RTksIDB4OEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4OTAsIDB4OTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4OTAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4RTksIDB4OTEsIDB4MDAsIDB4MDAsIDB4RTksIDB4OTIsIC8qIDB4RDAtMHhEMyAqLworCTB4RTksIDB4OTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4OEQsIDB4ODIsIDB4RUUsIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4RUUsIDB4RTEsIDB4MDAsIDB4MDAsIDB4RTksIDB4OTQsIDB4RTksIDB4OTUsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4OTYsIDB4RTksIDB4OTcsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4OTgsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTQsIDB4QUYsIDB4RTksIDB4OUEsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4OTUsIDB4NDUsIDB4RTksIDB4OUIsIDB4RTksIDB4OTksIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4RTksIDB4OUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4RTksIDB4OUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4OUUsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4OUYsIC8qIDB4RjgtMHhGQiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzlCWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhBMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHhFOSwgMHhBMSwgMHgwMCwgMHgwMCwgMHhFOSwgMHhBMiwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhBMywgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhBNCwgMHhFOSwgMHhBNSwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHhBNiwgMHgwMCwgMHgwMCwgMHhFOSwgMHhBNywgLyogMHgyNC0weDI3ICovCisJMHhFOSwgMHhBOCwgMHhFOSwgMHhBOSwgMHhFOSwgMHhBQSwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhBQiwgMHhFOSwgMHhBQywgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHg5RiwgMHg1NCwgMHhFOSwgMHhBRCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHhGNiwgLyogMHgzOC0weDNCICovCisJMHg4QiwgMHg1MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHg4QSwgMHg0MCwgMHg4RCwgMHhCMCwgMHhFOSwgMHhBRiwgLyogMHg0MC0weDQzICovCisJMHhFOSwgMHhBRSwgMHg5NiwgMHhBMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHhCMSwgMHhFOSwgMHhCMiwgMHhFOSwgMHhCMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHhCMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHg5NiwgMHg4MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHhFOSwgMHhCNCwgMHgwMCwgMHgwMCwgMHg4QiwgMHg5QiwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OCwgMHg0NCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHhFMywgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHhFOSwgMHhCNSwgMHhFRSwgMHhFMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhCNywgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHhCQywgMHhFRSwgMHhFNCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHhCOCwgMHg5NSwgMHhBOSwgMHhFOSwgMHhCNiwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhCOSwgMHhFOSwgMHhCQSwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhCQiwgLyogMHg5Qy0weDlGICovCisJMHhFOSwgMHhCQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHhFOSwgMHhCRCwgMHgwMCwgMHgwMCwgMHg5NiwgMHg4RSwgMHg4RSwgMHg0QywgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHg4RCwgMHhGOCwgMHg5MSwgMHg0RSwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHhFRSwgMHhFNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHhFOSwgMHhCRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHhDMSwgMHgwMCwgMHgwMCwgMHhFRSwgMHhFNiwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHhFOSwgMHhCRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhDMiwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHg4QywgMHhFRiwgMHhFOSwgMHhDMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhDMywgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHhDNCwgMHhFOSwgMHhDNSwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHhFOSwgMHhDOSwgMHgwMCwgMHgwMCwgMHg4RSwgMHg0OSwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5MSwgMHhFMiwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHhDQSwgMHhFOSwgMHhDNywgMHhFOSwgMHhDNiwgLyogMHhFMC0weEUzICovCisJMHhFOSwgMHhDOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHg4QywgMHg3RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHhFOSwgMHhDRSwgMHhFOSwgMHhDRCwgMHhFOSwgMHhDQywgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHg4OCwgMHhCMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOUNbNTEyXSA9IHsKKwkweEVFLCAweEU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweEU5LCAweEQ4LCAweDAwLCAweDAwLCAweEU5LCAweEQ0LCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweEU5LCAweEQ1LCAweEU5LCAweEQxLCAweEU5LCAweEQ3LCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweEU5LCAweEQzLCAweDhBLCAweDgyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDk4LCAweDZCLCAweDAwLCAweDAwLCAweEU5LCAweEQ2LCAweEU5LCAweEQyLCAvKiAweDEwLTB4MTMgKi8KKwkweEU5LCAweEQwLCAweEU5LCAweENGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweERBLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweERELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweEU5LCAweERDLCAweEU5LCAweERCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDk1LCAweDY4LCAweEU5LCAweEQ5LCAweDg4LCAweEYxLCAvKiAweDJDLTB4MkYgKi8KKwkweEU5LCAweERFLCAweDAwLCAweDAwLCAweEU5LCAweEUwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDhBLCAweDhGLCAweEU5LCAweENCLCAweDg5LCAweDU2LCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweEUyLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweEUxLCAweEU5LCAweERGLCAvKiAweDQ0LTB4NDcgKi8KKwkweDkyLCAweDRDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk2LCAweDkwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk3LCAweEQ4LCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweEUzLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweEU5LCAweEU0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweEU1LCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweEU2LCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweEU5LCAweEU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDkyLCAweEI5LCAweDAwLCAweDAwLCAweEU5LCAweEU4LCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDk0LCAweEI1LCAweDAwLCAweDAwLCAweEU5LCAweEVELCAvKiAweEU4LTB4RUIgKi8KKwkweEU5LCAweEU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweEU5LCAweEVBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk2LCAweDUwLCAvKiAweEYwLTB4RjMgKi8KKwkweDk2LCAweEMyLCAweDAwLCAweDAwLCAweDkzLCAweENFLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185RFs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4RUUsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4RUYsIDB4OTMsIDB4QkMsIC8qIDB4MDQtMHgwNyAqLworCTB4RTksIDB4RUMsIDB4RTksIDB4RUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4QTgsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4RjcsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4RTksIDB4RjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4OTUsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4RjQsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4RjMsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4RjEsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4OEEsIDB4OUIsIDB4MDAsIDB4MDAsIDB4RTksIDB4RjAsIDB4OEUsIDB4QjAsIC8qIDB4MjgtMHgyQiAqLworCTB4ODksIDB4QTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEQsIDB4ODMsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4RkEsIDB4RTksIDB4RjksIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4RTksIDB4RjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4RTksIDB4RjUsIDB4MDAsIDB4MDAsIDB4RTksIDB4RkIsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4RTksIDB4RkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4RUEsIDB4NDQsIDB4RUEsIDB4NDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4RUEsIDB4NDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4ODksIDB4NEMsIDB4RUEsIDB4NDAsIDB4RUEsIDB4NDEsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4OEQsIDB4OTQsIDB4OTYsIDB4QjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4RUEsIDB4NDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4RTksIC8qIDB4NjgtMHg2QiAqLworCTB4OTYsIDB4NTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4NEEsIC8qIDB4NkMtMHg2RiAqLworCTB4RUUsIDB4RTgsIDB4MDAsIDB4MDAsIDB4RUEsIDB4NDYsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4NEIsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4NDgsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4RUEsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OEMsIDB4N0IsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4NEMsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4RUEsIDB4NEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4RUEsIDB4NEUsIDB4MDAsIDB4MDAsIDB4RUEsIDB4NDksIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4RjIsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4NEYsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4OTIsIDB4REYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4RUEsIDB4NTMsIDB4MDAsIDB4MDAsIDB4RUEsIDB4NTQsIDB4RUEsIDB4NTIsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4RUEsIDB4NTEsIDB4RUEsIDB4NTcsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4RUEsIDB4NTAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4NTUsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4NTYsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4NTksIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4RUEsIDB4NTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4NUIsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4RUEsIDB4NUMsIDB4MDAsIDB4MDAsIDB4RUEsIDB4NUQsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OTgsIDB4NjgsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4RUEsIDB4NUEsIDB4OTEsIDB4RTksIDB4OEQsIDB4RUIsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4RUEsIDB4NUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzlFWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHhFRSwgMHhFQiwgMHhFQSwgMHg1RiwgMHhFQSwgMHg2MCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHg2MSwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHhFQSwgMHg2MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHg4QywgMHhCMiwgMHhFQSwgMHg2MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHhFQSwgMHg2NCwgMHgwMCwgMHgwMCwgMHg4RSwgMHhBRCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHhFQSwgMHg2NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHhFQSwgMHg2NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHg2NywgLyogMHg4OC0weDhCICovCisJMHhFQSwgMHg2OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHhFQSwgMHg2QiwgMHhFQSwgMHg2OSwgMHg5OCwgMHg1QiwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHhFQSwgMHg2QSwgMHgwMCwgMHgwMCwgMHg5NywgMHhFRCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHhFQSwgMHg2QywgMHgwMCwgMHgwMCwgMHg5NywgMHhEOSwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHhFQSwgMHg2RCwgMHg5NCwgMHg5RSwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHhFQSwgMHg2RSwgMHhFQSwgMHg3MCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHhFQSwgMHg3MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHhFQSwgMHg2RiwgMHg4RCwgMHg4RCwgMHg5NiwgMHhDQiwgMHg5NiwgMHg4MywgLyogMHhCOC0weEJCICovCisJMHg5QiwgMHhGNSwgMHgwMCwgMHgwMCwgMHg5RiwgMHg4MCwgMHg5NiwgMHg5QiwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHg4OSwgMHhBOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHhFQSwgMHg3MywgMHg4QiwgMHg2RiwgMHhFQSwgMHg3NCwgMHhFQSwgMHg3NSwgLyogMHhDQy0weENGICovCisJMHhFQSwgMHg3NiwgMHhFRSwgMHhFQywgMHg4RCwgMHg5NSwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHhFQSwgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHhFMCwgMHhEMiwgMHg5NiwgMHhEOSwgMHgwMCwgMHgwMCwgMHg5MSwgMHhFMSwgLyogMHhEOC0weERCICovCisJMHhFQSwgMHg3OCwgMHhFQSwgMHg3QSwgMHhFQSwgMHg3OSwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHhFQSwgMHg3QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHhFQSwgMHg3QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHhFQSwgMHg3RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHg3RSwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHhFQSwgMHg4MCwgMHgwMCwgMHgwMCwgMHhFQSwgMHg4MSwgMHhFQSwgMHg4MiwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHhFQSwgMHg4MywgMHgwMCwgMHgwMCwgMHhFQSwgMHg4NCwgLyogMHhGOC0weEZCICovCisJMHhFQSwgMHg4NSwgMHhFQSwgMHg4NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOUZbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweDg3LCAvKiAweDA0LTB4MDcgKi8KKwkweEVBLCAweDg4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDkzLCAweDQzLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDhDLCAweERCLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweEVBLCAweDhBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDkxLCAweDZDLCAweEVBLCAweDhCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweEVBLCAweDhDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk1LCAweDQwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweDhELCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweDhFLCAweEUyLCAweDU2LCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweEQ4LCAweEU4LCAweEVCLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweDhGLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweEVBLCAweDkwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweDkyLCAvKiAweDVDLTB4NUYgKi8KKwkweEVBLCAweDkzLCAweEVBLCAweDk0LCAweDk3LCAweEVFLCAweEVBLCAweDkxLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweDk1LCAweEVBLCAweDk2LCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweDk4LCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweEVBLCAweDk3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweDlBLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweDlCLCAweEVBLCAweDk5LCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDk3LCAweEI0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweEVBLCAweDlDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweEVBLCAweDlELCAweEUyLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweEVBLCAweDlFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19EQ1s1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0Y5WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHhFRCwgMHhDNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHhFRSwgMHhDRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfRkFbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweDczLCAweEVELCAweDdFLCAvKiAweDBDLTB4MEYgKi8KKwkweEVELCAweDgwLCAweEVELCAweDk1LCAweEVELCAweEJDLCAweEVELCAweENDLCAvKiAweDEwLTB4MTMgKi8KKwkweEVELCAweENFLCAweEVELCAweEY5LCAweEVFLCAweDQyLCAweEVFLCAweDU5LCAvKiAweDE0LTB4MTcgKi8KKwkweEVFLCAweDYxLCAweEVFLCAweDYyLCAweEVFLCAweDYzLCAweEVFLCAweDY1LCAvKiAweDE4LTB4MUIgKi8KKwkweEVFLCAweDY5LCAweEVFLCAweDZDLCAweEVFLCAweDc1LCAweEVFLCAweDgxLCAvKiAweDFDLTB4MUYgKi8KKwkweEVFLCAweDgzLCAweEVFLCAweDg0LCAweEVFLCAweDhELCAweEVFLCAweDk1LCAvKiAweDIwLTB4MjMgKi8KKwkweEVFLCAweDk3LCAweEVFLCAweDk4LCAweEVFLCAweDlCLCAweEVFLCAweEI3LCAvKiAweDI0LTB4MjcgKi8KKwkweEVFLCAweEJFLCAweEVFLCAweENFLCAweEVFLCAweERBLCAweEVFLCAweERCLCAvKiAweDI4LTB4MkIgKi8KKwkweEVFLCAweERELCAweEVFLCAweEVBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19GRls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4ODEsIDB4NDksIDB4RUUsIDB4RkMsIDB4ODEsIDB4OTQsIC8qIDB4MDAtMHgwMyAqLworCTB4ODEsIDB4OTAsIDB4ODEsIDB4OTMsIDB4ODEsIDB4OTUsIDB4RUUsIDB4RkIsIC8qIDB4MDQtMHgwNyAqLworCTB4ODEsIDB4NjksIDB4ODEsIDB4NkEsIDB4ODEsIDB4OTYsIDB4ODEsIDB4N0IsIC8qIDB4MDgtMHgwQiAqLworCTB4ODEsIDB4NDMsIDB4ODEsIDB4N0MsIDB4ODEsIDB4NDQsIDB4ODEsIDB4NUUsIC8qIDB4MEMtMHgwRiAqLworCTB4ODIsIDB4NEYsIDB4ODIsIDB4NTAsIDB4ODIsIDB4NTEsIDB4ODIsIDB4NTIsIC8qIDB4MTAtMHgxMyAqLworCTB4ODIsIDB4NTMsIDB4ODIsIDB4NTQsIDB4ODIsIDB4NTUsIDB4ODIsIDB4NTYsIC8qIDB4MTQtMHgxNyAqLworCTB4ODIsIDB4NTcsIDB4ODIsIDB4NTgsIDB4ODEsIDB4NDYsIDB4ODEsIDB4NDcsIC8qIDB4MTgtMHgxQiAqLworCTB4ODEsIDB4ODMsIDB4ODEsIDB4ODEsIDB4ODEsIDB4ODQsIDB4ODEsIDB4NDgsIC8qIDB4MUMtMHgxRiAqLworCTB4ODEsIDB4OTcsIDB4ODIsIDB4NjAsIDB4ODIsIDB4NjEsIDB4ODIsIDB4NjIsIC8qIDB4MjAtMHgyMyAqLworCTB4ODIsIDB4NjMsIDB4ODIsIDB4NjQsIDB4ODIsIDB4NjUsIDB4ODIsIDB4NjYsIC8qIDB4MjQtMHgyNyAqLworCTB4ODIsIDB4NjcsIDB4ODIsIDB4NjgsIDB4ODIsIDB4NjksIDB4ODIsIDB4NkEsIC8qIDB4MjgtMHgyQiAqLworCTB4ODIsIDB4NkIsIDB4ODIsIDB4NkMsIDB4ODIsIDB4NkQsIDB4ODIsIDB4NkUsIC8qIDB4MkMtMHgyRiAqLworCTB4ODIsIDB4NkYsIDB4ODIsIDB4NzAsIDB4ODIsIDB4NzEsIDB4ODIsIDB4NzIsIC8qIDB4MzAtMHgzMyAqLworCTB4ODIsIDB4NzMsIDB4ODIsIDB4NzQsIDB4ODIsIDB4NzUsIDB4ODIsIDB4NzYsIC8qIDB4MzQtMHgzNyAqLworCTB4ODIsIDB4NzcsIDB4ODIsIDB4NzgsIDB4ODIsIDB4NzksIDB4ODEsIDB4NkQsIC8qIDB4MzgtMHgzQiAqLworCTB4ODEsIDB4NUYsIDB4ODEsIDB4NkUsIDB4ODEsIDB4NEYsIDB4ODEsIDB4NTEsIC8qIDB4M0MtMHgzRiAqLworCTB4ODEsIDB4NEQsIDB4ODIsIDB4ODEsIDB4ODIsIDB4ODIsIDB4ODIsIDB4ODMsIC8qIDB4NDAtMHg0MyAqLworCTB4ODIsIDB4ODQsIDB4ODIsIDB4ODUsIDB4ODIsIDB4ODYsIDB4ODIsIDB4ODcsIC8qIDB4NDQtMHg0NyAqLworCTB4ODIsIDB4ODgsIDB4ODIsIDB4ODksIDB4ODIsIDB4OEEsIDB4ODIsIDB4OEIsIC8qIDB4NDgtMHg0QiAqLworCTB4ODIsIDB4OEMsIDB4ODIsIDB4OEQsIDB4ODIsIDB4OEUsIDB4ODIsIDB4OEYsIC8qIDB4NEMtMHg0RiAqLworCTB4ODIsIDB4OTAsIDB4ODIsIDB4OTEsIDB4ODIsIDB4OTIsIDB4ODIsIDB4OTMsIC8qIDB4NTAtMHg1MyAqLworCTB4ODIsIDB4OTQsIDB4ODIsIDB4OTUsIDB4ODIsIDB4OTYsIDB4ODIsIDB4OTcsIC8qIDB4NTQtMHg1NyAqLworCTB4ODIsIDB4OTgsIDB4ODIsIDB4OTksIDB4ODIsIDB4OUEsIDB4ODEsIDB4NkYsIC8qIDB4NTgtMHg1QiAqLworCTB4ODEsIDB4NjIsIDB4ODEsIDB4NzAsIDB4ODEsIDB4NjAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4MDAsIDB4QTIsIDB4MDAsIDB4QTMsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4QTQsIDB4MDAsIDB4QTUsIDB4MDAsIDB4QTYsIDB4MDAsIDB4QTcsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4QTgsIDB4MDAsIDB4QTksIDB4MDAsIDB4QUEsIDB4MDAsIDB4QUIsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4QUMsIDB4MDAsIDB4QUQsIDB4MDAsIDB4QUUsIDB4MDAsIDB4QUYsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4QjAsIDB4MDAsIDB4QjEsIDB4MDAsIDB4QjIsIDB4MDAsIDB4QjMsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4QjQsIDB4MDAsIDB4QjUsIDB4MDAsIDB4QjYsIDB4MDAsIDB4QjcsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4QjgsIDB4MDAsIDB4QjksIDB4MDAsIDB4QkEsIDB4MDAsIDB4QkIsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4QkMsIDB4MDAsIDB4QkQsIDB4MDAsIDB4QkUsIDB4MDAsIDB4QkYsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4QzAsIDB4MDAsIDB4QzEsIDB4MDAsIDB4QzIsIDB4MDAsIDB4QzMsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4QzQsIDB4MDAsIDB4QzUsIDB4MDAsIDB4QzYsIDB4MDAsIDB4QzcsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4QzgsIDB4MDAsIDB4QzksIDB4MDAsIDB4Q0EsIDB4MDAsIDB4Q0IsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4Q0MsIDB4MDAsIDB4Q0QsIDB4MDAsIDB4Q0UsIDB4MDAsIDB4Q0YsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4RDAsIDB4MDAsIDB4RDEsIDB4MDAsIDB4RDIsIDB4MDAsIDB4RDMsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4RDQsIDB4MDAsIDB4RDUsIDB4MDAsIDB4RDYsIDB4MDAsIDB4RDcsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4RDgsIDB4MDAsIDB4RDksIDB4MDAsIDB4REEsIDB4MDAsIDB4REIsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4REMsIDB4MDAsIDB4REQsIDB4MDAsIDB4REUsIDB4MDAsIDB4REYsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4ODEsIDB4OTEsIDB4ODEsIDB4OTIsIDB4ODEsIDB4Q0EsIDB4ODEsIDB4NTAsIC8qIDB4RTAtMHhFMyAqLworCTB4RUUsIDB4RkEsIDB4ODEsIDB4OEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnBhZ2VfdW5pMmNoYXJzZXRbMjU2XSA9IHsKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICB1MmNfMDMsIHUyY18wNCwgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJdTJjXzIwLCB1MmNfMjEsIHUyY18yMiwgdTJjXzIzLCB1MmNfMjQsIHUyY18yNSwgdTJjXzI2LCBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwl1MmNfMzAsIE5VTEwsICAgdTJjXzMyLCB1MmNfMzMsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICB1MmNfNEUsIHUyY180RiwgCisJdTJjXzUwLCB1MmNfNTEsIHUyY181MiwgdTJjXzUzLCB1MmNfNTQsIHUyY181NSwgdTJjXzU2LCB1MmNfNTcsIAorCXUyY181OCwgdTJjXzU5LCB1MmNfNUEsIHUyY181QiwgdTJjXzVDLCB1MmNfNUQsIHUyY181RSwgdTJjXzVGLCAKKwl1MmNfNjAsIHUyY182MSwgdTJjXzYyLCB1MmNfNjMsIHUyY182NCwgdTJjXzY1LCB1MmNfNjYsIHUyY182NywgCisJdTJjXzY4LCB1MmNfNjksIHUyY182QSwgdTJjXzZCLCB1MmNfNkMsIHUyY182RCwgdTJjXzZFLCB1MmNfNkYsIAorCXUyY183MCwgdTJjXzcxLCB1MmNfNzIsIHUyY183MywgdTJjXzc0LCB1MmNfNzUsIHUyY183NiwgdTJjXzc3LCAKKwl1MmNfNzgsIHUyY183OSwgdTJjXzdBLCB1MmNfN0IsIHUyY183QywgdTJjXzdELCB1MmNfN0UsIHUyY183RiwgCisJdTJjXzgwLCB1MmNfODEsIHUyY184MiwgdTJjXzgzLCB1MmNfODQsIHUyY184NSwgdTJjXzg2LCB1MmNfODcsIAorCXUyY184OCwgdTJjXzg5LCB1MmNfOEEsIHUyY184QiwgdTJjXzhDLCB1MmNfOEQsIHUyY184RSwgdTJjXzhGLCAKKwl1MmNfOTAsIHUyY185MSwgdTJjXzkyLCB1MmNfOTMsIHUyY185NCwgdTJjXzk1LCB1MmNfOTYsIHUyY185NywgCisJdTJjXzk4LCB1MmNfOTksIHUyY185QSwgdTJjXzlCLCB1MmNfOUMsIHUyY185RCwgdTJjXzlFLCB1MmNfOUYsIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIHUyY19EQywgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICB1MmNfRjksIHUyY19GQSwgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICB1MmNfRkYsIH07CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQybG93ZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDQwLTB4NDcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDUwLTB4NTcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJ1cHBlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NjAtMHg2NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NzAtMHg3NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgaW50IHVuaTJjaGFyKGNvbnN0IHdjaGFyX3QgdW5pLAorCQkgICAgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgYm91bmRsZW4pCit7CisJdW5zaWduZWQgY2hhciAqdW5pMmNoYXJzZXQ7CisJdW5zaWduZWQgY2hhciBjbCA9IHVuaSYweEZGOworCXVuc2lnbmVkIGNoYXIgY2ggPSAodW5pPj44KSYweEZGOworCisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJaWYgKGNoID09IDB4RkYgJiYgMHg2MSA8PSBjbCAmJiBjbCA8PSAweDlGKSB7CisJCW91dFswXSA9IGNsICsgMHg0MDsKKwkJcmV0dXJuIDE7CisJfQorCXVuaTJjaGFyc2V0ID0gcGFnZV91bmkyY2hhcnNldFtjaF07CisJaWYgKHVuaTJjaGFyc2V0KSB7CisJCWlmIChib3VuZGxlbiA8IDIpCisJCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCQlvdXRbMF0gPSB1bmkyY2hhcnNldFtjbCoyXTsKKwkJb3V0WzFdID0gdW5pMmNoYXJzZXRbY2wqMisxXTsKKwkJaWYgKG91dFswXSA9PSAweDAwICYmIG91dFsxXSA9PSAweDAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAyOworCX0gZWxzZSBpZiAoY2ggPT0gMCkgeworCQlpZiAoY2wgPD0gMHg3RikgeworCQkJb3V0WzBdID0gY2w7CisJCQlyZXR1cm4gMTsKKwkJfSBlbHNlIGlmICgweEEwIDw9IGNsKSB7CisJCQlvdXRbMF0gPSB1MmNfMDBoaVtjbCAtIDB4QTBdWzBdOworCQkJb3V0WzFdID0gdTJjXzAwaGlbY2wgLSAweEEwXVsxXTsKKwkJCWlmIChvdXRbMF0gJiYgb3V0WzFdKQorCQkJCXJldHVybiAyOworCQl9CisJCXJldHVybiAtRUlOVkFMOworCX0KKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGNoYXIydW5pKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJhd3N0cmluZywgaW50IGJvdW5kbGVuLAorCQkgICAgd2NoYXJfdCAqdW5pKQoreworCXVuc2lnbmVkIGNoYXIgY2gsIGNsOworCXdjaGFyX3QgKmNoYXJzZXQydW5pOworCisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJaWYgKHJhd3N0cmluZ1swXSA8PSAweDdGKSB7CisJCSp1bmkgPSByYXdzdHJpbmdbMF07CisJCXJldHVybiAxOworCX0KKwlpZiAoMHhBMSA8PSByYXdzdHJpbmdbMF0gJiYgcmF3c3RyaW5nWzBdIDw9IDB4REYpIHsKKwkJKnVuaSA9IDB4RkYwMCB8IChyYXdzdHJpbmdbMF0gLSAweDQwKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGJvdW5kbGVuIDwgMikKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisJY2ggPSByYXdzdHJpbmdbMF07CisJY2wgPSByYXdzdHJpbmdbMV07CisJY2hhcnNldDJ1bmkgPSBwYWdlX2NoYXJzZXQydW5pW2NoXTsKKwlpZiAoY2hhcnNldDJ1bmkgJiYgY2wpIHsKKwkJKnVuaSA9IGNoYXJzZXQydW5pW2NsXTsKKwkJaWYgKCp1bmkgPT0gMHgwMDAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAyOworCX0KKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSB0YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJjcDkzMiIsCisJLmFsaWFzCQk9ICJzamlzIiwKKwkudW5pMmNoYXIJPSB1bmkyY2hhciwKKwkuY2hhcjJ1bmkJPSBjaGFyMnVuaSwKKwkuY2hhcnNldDJsb3dlcgk9IGNoYXJzZXQybG93ZXIsCisJLmNoYXJzZXQydXBwZXIJPSBjaGFyc2V0MnVwcGVyLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmxzX2NwOTMyKHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX25scygmdGFibGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9ubHNfY3A5MzIodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25scygmdGFibGUpOworfQorCittb2R1bGVfaW5pdChpbml0X25sc19jcDkzMikKK21vZHVsZV9leGl0KGV4aXRfbmxzX2NwOTMyKQorCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CitNT0RVTEVfQUxJQVNfTkxTKHNqaXMpOwpkaWZmIC0tZ2l0IGEvZnMvbmxzL25sc19jcDkzNi5jIGIvZnMvbmxzL25sc19jcDkzNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNGNlZjQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ubHMvbmxzX2NwOTM2LmMKQEAgLTAsMCArMSwxMTAxOSBAQAorLyoKKyAqIGxpbnV4L2ZzL25sc19jcDkzNi5jCisgKgorICogQ2hhcnNldCBjcDkzNiB0cmFuc2xhdGlvbiB0YWJsZXMuCisgKiBUaGlzIHRyYW5zbGF0aW9uIHRhYmxlIHdhcyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSwgdGhlCisgKiBvcmlnaW5hbCB0YWJsZSBjYW4gYmUgZG93bmxvYWQgZnJvbSB0aGUgTWljcm9zb2Z0IHdlYnNpdGUuCisgKiAoaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvdW5pY29kZS91bmljb2RlY3AuaHRtKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCitzdGF0aWMgd2NoYXJfdCBjMnVfODFbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg0RTAyLDB4NEUwNCwweDRFMDUsMHg0RTA2LDB4NEUwRiwweDRFMTIsMHg0RTE3LDB4NEUxRiwvKiAweDQwLTB4NDcgKi8KKwkweDRFMjAsMHg0RTIxLDB4NEUyMywweDRFMjYsMHg0RTI5LDB4NEUyRSwweDRFMkYsMHg0RTMxLC8qIDB4NDgtMHg0RiAqLworCTB4NEUzMywweDRFMzUsMHg0RTM3LDB4NEUzQywweDRFNDAsMHg0RTQxLDB4NEU0MiwweDRFNDQsLyogMHg1MC0weDU3ICovCisJMHg0RTQ2LDB4NEU0QSwweDRFNTEsMHg0RTU1LDB4NEU1NywweDRFNUEsMHg0RTVCLDB4NEU2MiwvKiAweDU4LTB4NUYgKi8KKwkweDRFNjMsMHg0RTY0LDB4NEU2NSwweDRFNjcsMHg0RTY4LDB4NEU2QSwweDRFNkIsMHg0RTZDLC8qIDB4NjAtMHg2NyAqLworCTB4NEU2RCwweDRFNkUsMHg0RTZGLDB4NEU3MiwweDRFNzQsMHg0RTc1LDB4NEU3NiwweDRFNzcsLyogMHg2OC0weDZGICovCisJMHg0RTc4LDB4NEU3OSwweDRFN0EsMHg0RTdCLDB4NEU3QywweDRFN0QsMHg0RTdGLDB4NEU4MCwvKiAweDcwLTB4NzcgKi8KKwkweDRFODEsMHg0RTgyLDB4NEU4MywweDRFODQsMHg0RTg1LDB4NEU4NywweDRFOEEsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg0RTkwLDB4NEU5NiwweDRFOTcsMHg0RTk5LDB4NEU5QywweDRFOUQsMHg0RTlFLDB4NEVBMywvKiAweDgwLTB4ODcgKi8KKwkweDRFQUEsMHg0RUFGLDB4NEVCMCwweDRFQjEsMHg0RUI0LDB4NEVCNiwweDRFQjcsMHg0RUI4LC8qIDB4ODgtMHg4RiAqLworCTB4NEVCOSwweDRFQkMsMHg0RUJELDB4NEVCRSwweDRFQzgsMHg0RUNDLDB4NEVDRiwweDRFRDAsLyogMHg5MC0weDk3ICovCisJMHg0RUQyLDB4NEVEQSwweDRFREIsMHg0RURDLDB4NEVFMCwweDRFRTIsMHg0RUU2LDB4NEVFNywvKiAweDk4LTB4OUYgKi8KKwkweDRFRTksMHg0RUVELDB4NEVFRSwweDRFRUYsMHg0RUYxLDB4NEVGNCwweDRFRjgsMHg0RUY5LC8qIDB4QTAtMHhBNyAqLworCTB4NEVGQSwweDRFRkMsMHg0RUZFLDB4NEYwMCwweDRGMDIsMHg0RjAzLDB4NEYwNCwweDRGMDUsLyogMHhBOC0weEFGICovCisJMHg0RjA2LDB4NEYwNywweDRGMDgsMHg0RjBCLDB4NEYwQywweDRGMTIsMHg0RjEzLDB4NEYxNCwvKiAweEIwLTB4QjcgKi8KKwkweDRGMTUsMHg0RjE2LDB4NEYxQywweDRGMUQsMHg0RjIxLDB4NEYyMywweDRGMjgsMHg0RjI5LC8qIDB4QjgtMHhCRiAqLworCTB4NEYyQywweDRGMkQsMHg0RjJFLDB4NEYzMSwweDRGMzMsMHg0RjM1LDB4NEYzNywweDRGMzksLyogMHhDMC0weEM3ICovCisJMHg0RjNCLDB4NEYzRSwweDRGM0YsMHg0RjQwLDB4NEY0MSwweDRGNDIsMHg0RjQ0LDB4NEY0NSwvKiAweEM4LTB4Q0YgKi8KKwkweDRGNDcsMHg0RjQ4LDB4NEY0OSwweDRGNEEsMHg0RjRCLDB4NEY0QywweDRGNTIsMHg0RjU0LC8qIDB4RDAtMHhENyAqLworCTB4NEY1NiwweDRGNjEsMHg0RjYyLDB4NEY2NiwweDRGNjgsMHg0RjZBLDB4NEY2QiwweDRGNkQsLyogMHhEOC0weERGICovCisJMHg0RjZFLDB4NEY3MSwweDRGNzIsMHg0Rjc1LDB4NEY3NywweDRGNzgsMHg0Rjc5LDB4NEY3QSwvKiAweEUwLTB4RTcgKi8KKwkweDRGN0QsMHg0RjgwLDB4NEY4MSwweDRGODIsMHg0Rjg1LDB4NEY4NiwweDRGODcsMHg0RjhBLC8qIDB4RTgtMHhFRiAqLworCTB4NEY4QywweDRGOEUsMHg0RjkwLDB4NEY5MiwweDRGOTMsMHg0Rjk1LDB4NEY5NiwweDRGOTgsLyogMHhGMC0weEY3ICovCisJMHg0Rjk5LDB4NEY5QSwweDRGOUMsMHg0RjlFLDB4NEY5RiwweDRGQTEsMHg0RkEyLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV84MlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDRGQTQsMHg0RkFCLDB4NEZBRCwweDRGQjAsMHg0RkIxLDB4NEZCMiwweDRGQjMsMHg0RkI0LC8qIDB4NDAtMHg0NyAqLworCTB4NEZCNiwweDRGQjcsMHg0RkI4LDB4NEZCOSwweDRGQkEsMHg0RkJCLDB4NEZCQywweDRGQkQsLyogMHg0OC0weDRGICovCisJMHg0RkJFLDB4NEZDMCwweDRGQzEsMHg0RkMyLDB4NEZDNiwweDRGQzcsMHg0RkM4LDB4NEZDOSwvKiAweDUwLTB4NTcgKi8KKwkweDRGQ0IsMHg0RkNDLDB4NEZDRCwweDRGRDIsMHg0RkQzLDB4NEZENCwweDRGRDUsMHg0RkQ2LC8qIDB4NTgtMHg1RiAqLworCTB4NEZEOSwweDRGREIsMHg0RkUwLDB4NEZFMiwweDRGRTQsMHg0RkU1LDB4NEZFNywweDRGRUIsLyogMHg2MC0weDY3ICovCisJMHg0RkVDLDB4NEZGMCwweDRGRjIsMHg0RkY0LDB4NEZGNSwweDRGRjYsMHg0RkY3LDB4NEZGOSwvKiAweDY4LTB4NkYgKi8KKwkweDRGRkIsMHg0RkZDLDB4NEZGRCwweDRGRkYsMHg1MDAwLDB4NTAwMSwweDUwMDIsMHg1MDAzLC8qIDB4NzAtMHg3NyAqLworCTB4NTAwNCwweDUwMDUsMHg1MDA2LDB4NTAwNywweDUwMDgsMHg1MDA5LDB4NTAwQSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDUwMEIsMHg1MDBFLDB4NTAxMCwweDUwMTEsMHg1MDEzLDB4NTAxNSwweDUwMTYsMHg1MDE3LC8qIDB4ODAtMHg4NyAqLworCTB4NTAxQiwweDUwMUQsMHg1MDFFLDB4NTAyMCwweDUwMjIsMHg1MDIzLDB4NTAyNCwweDUwMjcsLyogMHg4OC0weDhGICovCisJMHg1MDJCLDB4NTAyRiwweDUwMzAsMHg1MDMxLDB4NTAzMiwweDUwMzMsMHg1MDM0LDB4NTAzNSwvKiAweDkwLTB4OTcgKi8KKwkweDUwMzYsMHg1MDM3LDB4NTAzOCwweDUwMzksMHg1MDNCLDB4NTAzRCwweDUwM0YsMHg1MDQwLC8qIDB4OTgtMHg5RiAqLworCTB4NTA0MSwweDUwNDIsMHg1MDQ0LDB4NTA0NSwweDUwNDYsMHg1MDQ5LDB4NTA0QSwweDUwNEIsLyogMHhBMC0weEE3ICovCisJMHg1MDRELDB4NTA1MCwweDUwNTEsMHg1MDUyLDB4NTA1MywweDUwNTQsMHg1MDU2LDB4NTA1NywvKiAweEE4LTB4QUYgKi8KKwkweDUwNTgsMHg1MDU5LDB4NTA1QiwweDUwNUQsMHg1MDVFLDB4NTA1RiwweDUwNjAsMHg1MDYxLC8qIDB4QjAtMHhCNyAqLworCTB4NTA2MiwweDUwNjMsMHg1MDY0LDB4NTA2NiwweDUwNjcsMHg1MDY4LDB4NTA2OSwweDUwNkEsLyogMHhCOC0weEJGICovCisJMHg1MDZCLDB4NTA2RCwweDUwNkUsMHg1MDZGLDB4NTA3MCwweDUwNzEsMHg1MDcyLDB4NTA3MywvKiAweEMwLTB4QzcgKi8KKwkweDUwNzQsMHg1MDc1LDB4NTA3OCwweDUwNzksMHg1MDdBLDB4NTA3QywweDUwN0QsMHg1MDgxLC8qIDB4QzgtMHhDRiAqLworCTB4NTA4MiwweDUwODMsMHg1MDg0LDB4NTA4NiwweDUwODcsMHg1MDg5LDB4NTA4QSwweDUwOEIsLyogMHhEMC0weEQ3ICovCisJMHg1MDhDLDB4NTA4RSwweDUwOEYsMHg1MDkwLDB4NTA5MSwweDUwOTIsMHg1MDkzLDB4NTA5NCwvKiAweEQ4LTB4REYgKi8KKwkweDUwOTUsMHg1MDk2LDB4NTA5NywweDUwOTgsMHg1MDk5LDB4NTA5QSwweDUwOUIsMHg1MDlDLC8qIDB4RTAtMHhFNyAqLworCTB4NTA5RCwweDUwOUUsMHg1MDlGLDB4NTBBMCwweDUwQTEsMHg1MEEyLDB4NTBBNCwweDUwQTYsLyogMHhFOC0weEVGICovCisJMHg1MEFBLDB4NTBBQiwweDUwQUQsMHg1MEFFLDB4NTBBRiwweDUwQjAsMHg1MEIxLDB4NTBCMywvKiAweEYwLTB4RjcgKi8KKwkweDUwQjQsMHg1MEI1LDB4NTBCNiwweDUwQjcsMHg1MEI4LDB4NTBCOSwweDUwQkMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzgzWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NTBCRCwweDUwQkUsMHg1MEJGLDB4NTBDMCwweDUwQzEsMHg1MEMyLDB4NTBDMywweDUwQzQsLyogMHg0MC0weDQ3ICovCisJMHg1MEM1LDB4NTBDNiwweDUwQzcsMHg1MEM4LDB4NTBDOSwweDUwQ0EsMHg1MENCLDB4NTBDQywvKiAweDQ4LTB4NEYgKi8KKwkweDUwQ0QsMHg1MENFLDB4NTBEMCwweDUwRDEsMHg1MEQyLDB4NTBEMywweDUwRDQsMHg1MEQ1LC8qIDB4NTAtMHg1NyAqLworCTB4NTBENywweDUwRDgsMHg1MEQ5LDB4NTBEQiwweDUwREMsMHg1MERELDB4NTBERSwweDUwREYsLyogMHg1OC0weDVGICovCisJMHg1MEUwLDB4NTBFMSwweDUwRTIsMHg1MEUzLDB4NTBFNCwweDUwRTUsMHg1MEU4LDB4NTBFOSwvKiAweDYwLTB4NjcgKi8KKwkweDUwRUEsMHg1MEVCLDB4NTBFRiwweDUwRjAsMHg1MEYxLDB4NTBGMiwweDUwRjQsMHg1MEY2LC8qIDB4NjgtMHg2RiAqLworCTB4NTBGNywweDUwRjgsMHg1MEY5LDB4NTBGQSwweDUwRkMsMHg1MEZELDB4NTBGRSwweDUwRkYsLyogMHg3MC0weDc3ICovCisJMHg1MTAwLDB4NTEwMSwweDUxMDIsMHg1MTAzLDB4NTEwNCwweDUxMDUsMHg1MTA4LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NTEwOSwweDUxMEEsMHg1MTBDLDB4NTEwRCwweDUxMEUsMHg1MTBGLDB4NTExMCwweDUxMTEsLyogMHg4MC0weDg3ICovCisJMHg1MTEzLDB4NTExNCwweDUxMTUsMHg1MTE2LDB4NTExNywweDUxMTgsMHg1MTE5LDB4NTExQSwvKiAweDg4LTB4OEYgKi8KKwkweDUxMUIsMHg1MTFDLDB4NTExRCwweDUxMUUsMHg1MTFGLDB4NTEyMCwweDUxMjIsMHg1MTIzLC8qIDB4OTAtMHg5NyAqLworCTB4NTEyNCwweDUxMjUsMHg1MTI2LDB4NTEyNywweDUxMjgsMHg1MTI5LDB4NTEyQSwweDUxMkIsLyogMHg5OC0weDlGICovCisJMHg1MTJDLDB4NTEyRCwweDUxMkUsMHg1MTJGLDB4NTEzMCwweDUxMzEsMHg1MTMyLDB4NTEzMywvKiAweEEwLTB4QTcgKi8KKwkweDUxMzQsMHg1MTM1LDB4NTEzNiwweDUxMzcsMHg1MTM4LDB4NTEzOSwweDUxM0EsMHg1MTNCLC8qIDB4QTgtMHhBRiAqLworCTB4NTEzQywweDUxM0QsMHg1MTNFLDB4NTE0MiwweDUxNDcsMHg1MTRBLDB4NTE0QywweDUxNEUsLyogMHhCMC0weEI3ICovCisJMHg1MTRGLDB4NTE1MCwweDUxNTIsMHg1MTUzLDB4NTE1NywweDUxNTgsMHg1MTU5LDB4NTE1QiwvKiAweEI4LTB4QkYgKi8KKwkweDUxNUQsMHg1MTVFLDB4NTE1RiwweDUxNjAsMHg1MTYxLDB4NTE2MywweDUxNjQsMHg1MTY2LC8qIDB4QzAtMHhDNyAqLworCTB4NTE2NywweDUxNjksMHg1MTZBLDB4NTE2RiwweDUxNzIsMHg1MTdBLDB4NTE3RSwweDUxN0YsLyogMHhDOC0weENGICovCisJMHg1MTgzLDB4NTE4NCwweDUxODYsMHg1MTg3LDB4NTE4QSwweDUxOEIsMHg1MThFLDB4NTE4RiwvKiAweEQwLTB4RDcgKi8KKwkweDUxOTAsMHg1MTkxLDB4NTE5MywweDUxOTQsMHg1MTk4LDB4NTE5QSwweDUxOUQsMHg1MTlFLC8qIDB4RDgtMHhERiAqLworCTB4NTE5RiwweDUxQTEsMHg1MUEzLDB4NTFBNiwweDUxQTcsMHg1MUE4LDB4NTFBOSwweDUxQUEsLyogMHhFMC0weEU3ICovCisJMHg1MUFELDB4NTFBRSwweDUxQjQsMHg1MUI4LDB4NTFCOSwweDUxQkEsMHg1MUJFLDB4NTFCRiwvKiAweEU4LTB4RUYgKi8KKwkweDUxQzEsMHg1MUMyLDB4NTFDMywweDUxQzUsMHg1MUM4LDB4NTFDQSwweDUxQ0QsMHg1MUNFLC8qIDB4RjAtMHhGNyAqLworCTB4NTFEMCwweDUxRDIsMHg1MUQzLDB4NTFENCwweDUxRDUsMHg1MUQ2LDB4NTFENywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfODRbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg1MUQ4LDB4NTFEOSwweDUxREEsMHg1MURDLDB4NTFERSwweDUxREYsMHg1MUUyLDB4NTFFMywvKiAweDQwLTB4NDcgKi8KKwkweDUxRTUsMHg1MUU2LDB4NTFFNywweDUxRTgsMHg1MUU5LDB4NTFFQSwweDUxRUMsMHg1MUVFLC8qIDB4NDgtMHg0RiAqLworCTB4NTFGMSwweDUxRjIsMHg1MUY0LDB4NTFGNywweDUxRkUsMHg1MjA0LDB4NTIwNSwweDUyMDksLyogMHg1MC0weDU3ICovCisJMHg1MjBCLDB4NTIwQywweDUyMEYsMHg1MjEwLDB4NTIxMywweDUyMTQsMHg1MjE1LDB4NTIxQywvKiAweDU4LTB4NUYgKi8KKwkweDUyMUUsMHg1MjFGLDB4NTIyMSwweDUyMjIsMHg1MjIzLDB4NTIyNSwweDUyMjYsMHg1MjI3LC8qIDB4NjAtMHg2NyAqLworCTB4NTIyQSwweDUyMkMsMHg1MjJGLDB4NTIzMSwweDUyMzIsMHg1MjM0LDB4NTIzNSwweDUyM0MsLyogMHg2OC0weDZGICovCisJMHg1MjNFLDB4NTI0NCwweDUyNDUsMHg1MjQ2LDB4NTI0NywweDUyNDgsMHg1MjQ5LDB4NTI0QiwvKiAweDcwLTB4NzcgKi8KKwkweDUyNEUsMHg1MjRGLDB4NTI1MiwweDUyNTMsMHg1MjU1LDB4NTI1NywweDUyNTgsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg1MjU5LDB4NTI1QSwweDUyNUIsMHg1MjVELDB4NTI1RiwweDUyNjAsMHg1MjYyLDB4NTI2MywvKiAweDgwLTB4ODcgKi8KKwkweDUyNjQsMHg1MjY2LDB4NTI2OCwweDUyNkIsMHg1MjZDLDB4NTI2RCwweDUyNkUsMHg1MjcwLC8qIDB4ODgtMHg4RiAqLworCTB4NTI3MSwweDUyNzMsMHg1Mjc0LDB4NTI3NSwweDUyNzYsMHg1Mjc3LDB4NTI3OCwweDUyNzksLyogMHg5MC0weDk3ICovCisJMHg1MjdBLDB4NTI3QiwweDUyN0MsMHg1MjdFLDB4NTI4MCwweDUyODMsMHg1Mjg0LDB4NTI4NSwvKiAweDk4LTB4OUYgKi8KKwkweDUyODYsMHg1Mjg3LDB4NTI4OSwweDUyOEEsMHg1MjhCLDB4NTI4QywweDUyOEQsMHg1MjhFLC8qIDB4QTAtMHhBNyAqLworCTB4NTI4RiwweDUyOTEsMHg1MjkyLDB4NTI5NCwweDUyOTUsMHg1Mjk2LDB4NTI5NywweDUyOTgsLyogMHhBOC0weEFGICovCisJMHg1Mjk5LDB4NTI5QSwweDUyOUMsMHg1MkE0LDB4NTJBNSwweDUyQTYsMHg1MkE3LDB4NTJBRSwvKiAweEIwLTB4QjcgKi8KKwkweDUyQUYsMHg1MkIwLDB4NTJCNCwweDUyQjUsMHg1MkI2LDB4NTJCNywweDUyQjgsMHg1MkI5LC8qIDB4QjgtMHhCRiAqLworCTB4NTJCQSwweDUyQkIsMHg1MkJDLDB4NTJCRCwweDUyQzAsMHg1MkMxLDB4NTJDMiwweDUyQzQsLyogMHhDMC0weEM3ICovCisJMHg1MkM1LDB4NTJDNiwweDUyQzgsMHg1MkNBLDB4NTJDQywweDUyQ0QsMHg1MkNFLDB4NTJDRiwvKiAweEM4LTB4Q0YgKi8KKwkweDUyRDEsMHg1MkQzLDB4NTJENCwweDUyRDUsMHg1MkQ3LDB4NTJEOSwweDUyREEsMHg1MkRCLC8qIDB4RDAtMHhENyAqLworCTB4NTJEQywweDUyREQsMHg1MkRFLDB4NTJFMCwweDUyRTEsMHg1MkUyLDB4NTJFMywweDUyRTUsLyogMHhEOC0weERGICovCisJMHg1MkU2LDB4NTJFNywweDUyRTgsMHg1MkU5LDB4NTJFQSwweDUyRUIsMHg1MkVDLDB4NTJFRCwvKiAweEUwLTB4RTcgKi8KKwkweDUyRUUsMHg1MkVGLDB4NTJGMSwweDUyRjIsMHg1MkYzLDB4NTJGNCwweDUyRjUsMHg1MkY2LC8qIDB4RTgtMHhFRiAqLworCTB4NTJGNywweDUyRjgsMHg1MkZCLDB4NTJGQywweDUyRkQsMHg1MzAxLDB4NTMwMiwweDUzMDMsLyogMHhGMC0weEY3ICovCisJMHg1MzA0LDB4NTMwNywweDUzMDksMHg1MzBBLDB4NTMwQiwweDUzMEMsMHg1MzBFLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV84NVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDUzMTEsMHg1MzEyLDB4NTMxMywweDUzMTQsMHg1MzE4LDB4NTMxQiwweDUzMUMsMHg1MzFFLC8qIDB4NDAtMHg0NyAqLworCTB4NTMxRiwweDUzMjIsMHg1MzI0LDB4NTMyNSwweDUzMjcsMHg1MzI4LDB4NTMyOSwweDUzMkIsLyogMHg0OC0weDRGICovCisJMHg1MzJDLDB4NTMyRCwweDUzMkYsMHg1MzMwLDB4NTMzMSwweDUzMzIsMHg1MzMzLDB4NTMzNCwvKiAweDUwLTB4NTcgKi8KKwkweDUzMzUsMHg1MzM2LDB4NTMzNywweDUzMzgsMHg1MzNDLDB4NTMzRCwweDUzNDAsMHg1MzQyLC8qIDB4NTgtMHg1RiAqLworCTB4NTM0NCwweDUzNDYsMHg1MzRCLDB4NTM0QywweDUzNEQsMHg1MzUwLDB4NTM1NCwweDUzNTgsLyogMHg2MC0weDY3ICovCisJMHg1MzU5LDB4NTM1QiwweDUzNUQsMHg1MzY1LDB4NTM2OCwweDUzNkEsMHg1MzZDLDB4NTM2RCwvKiAweDY4LTB4NkYgKi8KKwkweDUzNzIsMHg1Mzc2LDB4NTM3OSwweDUzN0IsMHg1MzdDLDB4NTM3RCwweDUzN0UsMHg1MzgwLC8qIDB4NzAtMHg3NyAqLworCTB4NTM4MSwweDUzODMsMHg1Mzg3LDB4NTM4OCwweDUzOEEsMHg1MzhFLDB4NTM4RiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDUzOTAsMHg1MzkxLDB4NTM5MiwweDUzOTMsMHg1Mzk0LDB4NTM5NiwweDUzOTcsMHg1Mzk5LC8qIDB4ODAtMHg4NyAqLworCTB4NTM5QiwweDUzOUMsMHg1MzlFLDB4NTNBMCwweDUzQTEsMHg1M0E0LDB4NTNBNywweDUzQUEsLyogMHg4OC0weDhGICovCisJMHg1M0FCLDB4NTNBQywweDUzQUQsMHg1M0FGLDB4NTNCMCwweDUzQjEsMHg1M0IyLDB4NTNCMywvKiAweDkwLTB4OTcgKi8KKwkweDUzQjQsMHg1M0I1LDB4NTNCNywweDUzQjgsMHg1M0I5LDB4NTNCQSwweDUzQkMsMHg1M0JELC8qIDB4OTgtMHg5RiAqLworCTB4NTNCRSwweDUzQzAsMHg1M0MzLDB4NTNDNCwweDUzQzUsMHg1M0M2LDB4NTNDNywweDUzQ0UsLyogMHhBMC0weEE3ICovCisJMHg1M0NGLDB4NTNEMCwweDUzRDIsMHg1M0QzLDB4NTNENSwweDUzREEsMHg1M0RDLDB4NTNERCwvKiAweEE4LTB4QUYgKi8KKwkweDUzREUsMHg1M0UxLDB4NTNFMiwweDUzRTcsMHg1M0Y0LDB4NTNGQSwweDUzRkUsMHg1M0ZGLC8qIDB4QjAtMHhCNyAqLworCTB4NTQwMCwweDU0MDIsMHg1NDA1LDB4NTQwNywweDU0MEIsMHg1NDE0LDB4NTQxOCwweDU0MTksLyogMHhCOC0weEJGICovCisJMHg1NDFBLDB4NTQxQywweDU0MjIsMHg1NDI0LDB4NTQyNSwweDU0MkEsMHg1NDMwLDB4NTQzMywvKiAweEMwLTB4QzcgKi8KKwkweDU0MzYsMHg1NDM3LDB4NTQzQSwweDU0M0QsMHg1NDNGLDB4NTQ0MSwweDU0NDIsMHg1NDQ0LC8qIDB4QzgtMHhDRiAqLworCTB4NTQ0NSwweDU0NDcsMHg1NDQ5LDB4NTQ0QywweDU0NEQsMHg1NDRFLDB4NTQ0RiwweDU0NTEsLyogMHhEMC0weEQ3ICovCisJMHg1NDVBLDB4NTQ1RCwweDU0NUUsMHg1NDVGLDB4NTQ2MCwweDU0NjEsMHg1NDYzLDB4NTQ2NSwvKiAweEQ4LTB4REYgKi8KKwkweDU0NjcsMHg1NDY5LDB4NTQ2QSwweDU0NkIsMHg1NDZDLDB4NTQ2RCwweDU0NkUsMHg1NDZGLC8qIDB4RTAtMHhFNyAqLworCTB4NTQ3MCwweDU0NzQsMHg1NDc5LDB4NTQ3QSwweDU0N0UsMHg1NDdGLDB4NTQ4MSwweDU0ODMsLyogMHhFOC0weEVGICovCisJMHg1NDg1LDB4NTQ4NywweDU0ODgsMHg1NDg5LDB4NTQ4QSwweDU0OEQsMHg1NDkxLDB4NTQ5MywvKiAweEYwLTB4RjcgKi8KKwkweDU0OTcsMHg1NDk4LDB4NTQ5QywweDU0OUUsMHg1NDlGLDB4NTRBMCwweDU0QTEsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1Xzg2WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NTRBMiwweDU0QTUsMHg1NEFFLDB4NTRCMCwweDU0QjIsMHg1NEI1LDB4NTRCNiwweDU0QjcsLyogMHg0MC0weDQ3ICovCisJMHg1NEI5LDB4NTRCQSwweDU0QkMsMHg1NEJFLDB4NTRDMywweDU0QzUsMHg1NENBLDB4NTRDQiwvKiAweDQ4LTB4NEYgKi8KKwkweDU0RDYsMHg1NEQ4LDB4NTREQiwweDU0RTAsMHg1NEUxLDB4NTRFMiwweDU0RTMsMHg1NEU0LC8qIDB4NTAtMHg1NyAqLworCTB4NTRFQiwweDU0RUMsMHg1NEVGLDB4NTRGMCwweDU0RjEsMHg1NEY0LDB4NTRGNSwweDU0RjYsLyogMHg1OC0weDVGICovCisJMHg1NEY3LDB4NTRGOCwweDU0RjksMHg1NEZCLDB4NTRGRSwweDU1MDAsMHg1NTAyLDB4NTUwMywvKiAweDYwLTB4NjcgKi8KKwkweDU1MDQsMHg1NTA1LDB4NTUwOCwweDU1MEEsMHg1NTBCLDB4NTUwQywweDU1MEQsMHg1NTBFLC8qIDB4NjgtMHg2RiAqLworCTB4NTUxMiwweDU1MTMsMHg1NTE1LDB4NTUxNiwweDU1MTcsMHg1NTE4LDB4NTUxOSwweDU1MUEsLyogMHg3MC0weDc3ICovCisJMHg1NTFDLDB4NTUxRCwweDU1MUUsMHg1NTFGLDB4NTUyMSwweDU1MjUsMHg1NTI2LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NTUyOCwweDU1MjksMHg1NTJCLDB4NTUyRCwweDU1MzIsMHg1NTM0LDB4NTUzNSwweDU1MzYsLyogMHg4MC0weDg3ICovCisJMHg1NTM4LDB4NTUzOSwweDU1M0EsMHg1NTNCLDB4NTUzRCwweDU1NDAsMHg1NTQyLDB4NTU0NSwvKiAweDg4LTB4OEYgKi8KKwkweDU1NDcsMHg1NTQ4LDB4NTU0QiwweDU1NEMsMHg1NTRELDB4NTU0RSwweDU1NEYsMHg1NTUxLC8qIDB4OTAtMHg5NyAqLworCTB4NTU1MiwweDU1NTMsMHg1NTU0LDB4NTU1NywweDU1NTgsMHg1NTU5LDB4NTU1QSwweDU1NUIsLyogMHg5OC0weDlGICovCisJMHg1NTVELDB4NTU1RSwweDU1NUYsMHg1NTYwLDB4NTU2MiwweDU1NjMsMHg1NTY4LDB4NTU2OSwvKiAweEEwLTB4QTcgKi8KKwkweDU1NkIsMHg1NTZGLDB4NTU3MCwweDU1NzEsMHg1NTcyLDB4NTU3MywweDU1NzQsMHg1NTc5LC8qIDB4QTgtMHhBRiAqLworCTB4NTU3QSwweDU1N0QsMHg1NTdGLDB4NTU4NSwweDU1ODYsMHg1NThDLDB4NTU4RCwweDU1OEUsLyogMHhCMC0weEI3ICovCisJMHg1NTkwLDB4NTU5MiwweDU1OTMsMHg1NTk1LDB4NTU5NiwweDU1OTcsMHg1NTlBLDB4NTU5QiwvKiAweEI4LTB4QkYgKi8KKwkweDU1OUUsMHg1NUEwLDB4NTVBMSwweDU1QTIsMHg1NUEzLDB4NTVBNCwweDU1QTUsMHg1NUE2LC8qIDB4QzAtMHhDNyAqLworCTB4NTVBOCwweDU1QTksMHg1NUFBLDB4NTVBQiwweDU1QUMsMHg1NUFELDB4NTVBRSwweDU1QUYsLyogMHhDOC0weENGICovCisJMHg1NUIwLDB4NTVCMiwweDU1QjQsMHg1NUI2LDB4NTVCOCwweDU1QkEsMHg1NUJDLDB4NTVCRiwvKiAweEQwLTB4RDcgKi8KKwkweDU1QzAsMHg1NUMxLDB4NTVDMiwweDU1QzMsMHg1NUM2LDB4NTVDNywweDU1QzgsMHg1NUNBLC8qIDB4RDgtMHhERiAqLworCTB4NTVDQiwweDU1Q0UsMHg1NUNGLDB4NTVEMCwweDU1RDUsMHg1NUQ3LDB4NTVEOCwweDU1RDksLyogMHhFMC0weEU3ICovCisJMHg1NURBLDB4NTVEQiwweDU1REUsMHg1NUUwLDB4NTVFMiwweDU1RTcsMHg1NUU5LDB4NTVFRCwvKiAweEU4LTB4RUYgKi8KKwkweDU1RUUsMHg1NUYwLDB4NTVGMSwweDU1RjQsMHg1NUY2LDB4NTVGOCwweDU1RjksMHg1NUZBLC8qIDB4RjAtMHhGNyAqLworCTB4NTVGQiwweDU1RkMsMHg1NUZGLDB4NTYwMiwweDU2MDMsMHg1NjA0LDB4NTYwNSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfODdbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg1NjA2LDB4NTYwNywweDU2MEEsMHg1NjBCLDB4NTYwRCwweDU2MTAsMHg1NjExLDB4NTYxMiwvKiAweDQwLTB4NDcgKi8KKwkweDU2MTMsMHg1NjE0LDB4NTYxNSwweDU2MTYsMHg1NjE3LDB4NTYxOSwweDU2MUEsMHg1NjFDLC8qIDB4NDgtMHg0RiAqLworCTB4NTYxRCwweDU2MjAsMHg1NjIxLDB4NTYyMiwweDU2MjUsMHg1NjI2LDB4NTYyOCwweDU2MjksLyogMHg1MC0weDU3ICovCisJMHg1NjJBLDB4NTYyQiwweDU2MkUsMHg1NjJGLDB4NTYzMCwweDU2MzMsMHg1NjM1LDB4NTYzNywvKiAweDU4LTB4NUYgKi8KKwkweDU2MzgsMHg1NjNBLDB4NTYzQywweDU2M0QsMHg1NjNFLDB4NTY0MCwweDU2NDEsMHg1NjQyLC8qIDB4NjAtMHg2NyAqLworCTB4NTY0MywweDU2NDQsMHg1NjQ1LDB4NTY0NiwweDU2NDcsMHg1NjQ4LDB4NTY0OSwweDU2NEEsLyogMHg2OC0weDZGICovCisJMHg1NjRCLDB4NTY0RiwweDU2NTAsMHg1NjUxLDB4NTY1MiwweDU2NTMsMHg1NjU1LDB4NTY1NiwvKiAweDcwLTB4NzcgKi8KKwkweDU2NUEsMHg1NjVCLDB4NTY1RCwweDU2NUUsMHg1NjVGLDB4NTY2MCwweDU2NjEsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg1NjYzLDB4NTY2NSwweDU2NjYsMHg1NjY3LDB4NTY2RCwweDU2NkUsMHg1NjZGLDB4NTY3MCwvKiAweDgwLTB4ODcgKi8KKwkweDU2NzIsMHg1NjczLDB4NTY3NCwweDU2NzUsMHg1Njc3LDB4NTY3OCwweDU2NzksMHg1NjdBLC8qIDB4ODgtMHg4RiAqLworCTB4NTY3RCwweDU2N0UsMHg1NjdGLDB4NTY4MCwweDU2ODEsMHg1NjgyLDB4NTY4MywweDU2ODQsLyogMHg5MC0weDk3ICovCisJMHg1Njg3LDB4NTY4OCwweDU2ODksMHg1NjhBLDB4NTY4QiwweDU2OEMsMHg1NjhELDB4NTY5MCwvKiAweDk4LTB4OUYgKi8KKwkweDU2OTEsMHg1NjkyLDB4NTY5NCwweDU2OTUsMHg1Njk2LDB4NTY5NywweDU2OTgsMHg1Njk5LC8qIDB4QTAtMHhBNyAqLworCTB4NTY5QSwweDU2OUIsMHg1NjlDLDB4NTY5RCwweDU2OUUsMHg1NjlGLDB4NTZBMCwweDU2QTEsLyogMHhBOC0weEFGICovCisJMHg1NkEyLDB4NTZBNCwweDU2QTUsMHg1NkE2LDB4NTZBNywweDU2QTgsMHg1NkE5LDB4NTZBQSwvKiAweEIwLTB4QjcgKi8KKwkweDU2QUIsMHg1NkFDLDB4NTZBRCwweDU2QUUsMHg1NkIwLDB4NTZCMSwweDU2QjIsMHg1NkIzLC8qIDB4QjgtMHhCRiAqLworCTB4NTZCNCwweDU2QjUsMHg1NkI2LDB4NTZCOCwweDU2QjksMHg1NkJBLDB4NTZCQiwweDU2QkQsLyogMHhDMC0weEM3ICovCisJMHg1NkJFLDB4NTZCRiwweDU2QzAsMHg1NkMxLDB4NTZDMiwweDU2QzMsMHg1NkM0LDB4NTZDNSwvKiAweEM4LTB4Q0YgKi8KKwkweDU2QzYsMHg1NkM3LDB4NTZDOCwweDU2QzksMHg1NkNCLDB4NTZDQywweDU2Q0QsMHg1NkNFLC8qIDB4RDAtMHhENyAqLworCTB4NTZDRiwweDU2RDAsMHg1NkQxLDB4NTZEMiwweDU2RDMsMHg1NkQ1LDB4NTZENiwweDU2RDgsLyogMHhEOC0weERGICovCisJMHg1NkQ5LDB4NTZEQywweDU2RTMsMHg1NkU1LDB4NTZFNiwweDU2RTcsMHg1NkU4LDB4NTZFOSwvKiAweEUwLTB4RTcgKi8KKwkweDU2RUEsMHg1NkVDLDB4NTZFRSwweDU2RUYsMHg1NkYyLDB4NTZGMywweDU2RjYsMHg1NkY3LC8qIDB4RTgtMHhFRiAqLworCTB4NTZGOCwweDU2RkIsMHg1NkZDLDB4NTcwMCwweDU3MDEsMHg1NzAyLDB4NTcwNSwweDU3MDcsLyogMHhGMC0weEY3ICovCisJMHg1NzBCLDB4NTcwQywweDU3MEQsMHg1NzBFLDB4NTcwRiwweDU3MTAsMHg1NzExLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV84OFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDU3MTIsMHg1NzEzLDB4NTcxNCwweDU3MTUsMHg1NzE2LDB4NTcxNywweDU3MTgsMHg1NzE5LC8qIDB4NDAtMHg0NyAqLworCTB4NTcxQSwweDU3MUIsMHg1NzFELDB4NTcxRSwweDU3MjAsMHg1NzIxLDB4NTcyMiwweDU3MjQsLyogMHg0OC0weDRGICovCisJMHg1NzI1LDB4NTcyNiwweDU3MjcsMHg1NzJCLDB4NTczMSwweDU3MzIsMHg1NzM0LDB4NTczNSwvKiAweDUwLTB4NTcgKi8KKwkweDU3MzYsMHg1NzM3LDB4NTczOCwweDU3M0MsMHg1NzNELDB4NTczRiwweDU3NDEsMHg1NzQzLC8qIDB4NTgtMHg1RiAqLworCTB4NTc0NCwweDU3NDUsMHg1NzQ2LDB4NTc0OCwweDU3NDksMHg1NzRCLDB4NTc1MiwweDU3NTMsLyogMHg2MC0weDY3ICovCisJMHg1NzU0LDB4NTc1NSwweDU3NTYsMHg1NzU4LDB4NTc1OSwweDU3NjIsMHg1NzYzLDB4NTc2NSwvKiAweDY4LTB4NkYgKi8KKwkweDU3NjcsMHg1NzZDLDB4NTc2RSwweDU3NzAsMHg1NzcxLDB4NTc3MiwweDU3NzQsMHg1Nzc1LC8qIDB4NzAtMHg3NyAqLworCTB4NTc3OCwweDU3NzksMHg1NzdBLDB4NTc3RCwweDU3N0UsMHg1NzdGLDB4NTc4MCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDU3ODEsMHg1Nzg3LDB4NTc4OCwweDU3ODksMHg1NzhBLDB4NTc4RCwweDU3OEUsMHg1NzhGLC8qIDB4ODAtMHg4NyAqLworCTB4NTc5MCwweDU3OTEsMHg1Nzk0LDB4NTc5NSwweDU3OTYsMHg1Nzk3LDB4NTc5OCwweDU3OTksLyogMHg4OC0weDhGICovCisJMHg1NzlBLDB4NTc5QywweDU3OUQsMHg1NzlFLDB4NTc5RiwweDU3QTUsMHg1N0E4LDB4NTdBQSwvKiAweDkwLTB4OTcgKi8KKwkweDU3QUMsMHg1N0FGLDB4NTdCMCwweDU3QjEsMHg1N0IzLDB4NTdCNSwweDU3QjYsMHg1N0I3LC8qIDB4OTgtMHg5RiAqLworCTB4NTdCOSwweDU3QkEsMHg1N0JCLDB4NTdCQywweDU3QkQsMHg1N0JFLDB4NTdCRiwweDU3QzAsLyogMHhBMC0weEE3ICovCisJMHg1N0MxLDB4NTdDNCwweDU3QzUsMHg1N0M2LDB4NTdDNywweDU3QzgsMHg1N0M5LDB4NTdDQSwvKiAweEE4LTB4QUYgKi8KKwkweDU3Q0MsMHg1N0NELDB4NTdEMCwweDU3RDEsMHg1N0QzLDB4NTdENiwweDU3RDcsMHg1N0RCLC8qIDB4QjAtMHhCNyAqLworCTB4NTdEQywweDU3REUsMHg1N0UxLDB4NTdFMiwweDU3RTMsMHg1N0U1LDB4NTdFNiwweDU3RTcsLyogMHhCOC0weEJGICovCisJMHg1N0U4LDB4NTdFOSwweDU3RUEsMHg1N0VCLDB4NTdFQywweDU3RUUsMHg1N0YwLDB4NTdGMSwvKiAweEMwLTB4QzcgKi8KKwkweDU3RjIsMHg1N0YzLDB4NTdGNSwweDU3RjYsMHg1N0Y3LDB4NTdGQiwweDU3RkMsMHg1N0ZFLC8qIDB4QzgtMHhDRiAqLworCTB4NTdGRiwweDU4MDEsMHg1ODAzLDB4NTgwNCwweDU4MDUsMHg1ODA4LDB4NTgwOSwweDU4MEEsLyogMHhEMC0weEQ3ICovCisJMHg1ODBDLDB4NTgwRSwweDU4MEYsMHg1ODEwLDB4NTgxMiwweDU4MTMsMHg1ODE0LDB4NTgxNiwvKiAweEQ4LTB4REYgKi8KKwkweDU4MTcsMHg1ODE4LDB4NTgxQSwweDU4MUIsMHg1ODFDLDB4NTgxRCwweDU4MUYsMHg1ODIyLC8qIDB4RTAtMHhFNyAqLworCTB4NTgyMywweDU4MjUsMHg1ODI2LDB4NTgyNywweDU4MjgsMHg1ODI5LDB4NTgyQiwweDU4MkMsLyogMHhFOC0weEVGICovCisJMHg1ODJELDB4NTgyRSwweDU4MkYsMHg1ODMxLDB4NTgzMiwweDU4MzMsMHg1ODM0LDB4NTgzNiwvKiAweEYwLTB4RjcgKi8KKwkweDU4MzcsMHg1ODM4LDB4NTgzOSwweDU4M0EsMHg1ODNCLDB4NTgzQywweDU4M0QsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1Xzg5WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NTgzRSwweDU4M0YsMHg1ODQwLDB4NTg0MSwweDU4NDIsMHg1ODQzLDB4NTg0NSwweDU4NDYsLyogMHg0MC0weDQ3ICovCisJMHg1ODQ3LDB4NTg0OCwweDU4NDksMHg1ODRBLDB4NTg0QiwweDU4NEUsMHg1ODRGLDB4NTg1MCwvKiAweDQ4LTB4NEYgKi8KKwkweDU4NTIsMHg1ODUzLDB4NTg1NSwweDU4NTYsMHg1ODU3LDB4NTg1OSwweDU4NUEsMHg1ODVCLC8qIDB4NTAtMHg1NyAqLworCTB4NTg1QywweDU4NUQsMHg1ODVGLDB4NTg2MCwweDU4NjEsMHg1ODYyLDB4NTg2MywweDU4NjQsLyogMHg1OC0weDVGICovCisJMHg1ODY2LDB4NTg2NywweDU4NjgsMHg1ODY5LDB4NTg2QSwweDU4NkQsMHg1ODZFLDB4NTg2RiwvKiAweDYwLTB4NjcgKi8KKwkweDU4NzAsMHg1ODcxLDB4NTg3MiwweDU4NzMsMHg1ODc0LDB4NTg3NSwweDU4NzYsMHg1ODc3LC8qIDB4NjgtMHg2RiAqLworCTB4NTg3OCwweDU4NzksMHg1ODdBLDB4NTg3QiwweDU4N0MsMHg1ODdELDB4NTg3RiwweDU4ODIsLyogMHg3MC0weDc3ICovCisJMHg1ODg0LDB4NTg4NiwweDU4ODcsMHg1ODg4LDB4NTg4QSwweDU4OEIsMHg1ODhDLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NTg4RCwweDU4OEUsMHg1ODhGLDB4NTg5MCwweDU4OTEsMHg1ODk0LDB4NTg5NSwweDU4OTYsLyogMHg4MC0weDg3ICovCisJMHg1ODk3LDB4NTg5OCwweDU4OUIsMHg1ODlDLDB4NTg5RCwweDU4QTAsMHg1OEExLDB4NThBMiwvKiAweDg4LTB4OEYgKi8KKwkweDU4QTMsMHg1OEE0LDB4NThBNSwweDU4QTYsMHg1OEE3LDB4NThBQSwweDU4QUIsMHg1OEFDLC8qIDB4OTAtMHg5NyAqLworCTB4NThBRCwweDU4QUUsMHg1OEFGLDB4NThCMCwweDU4QjEsMHg1OEIyLDB4NThCMywweDU4QjQsLyogMHg5OC0weDlGICovCisJMHg1OEI1LDB4NThCNiwweDU4QjcsMHg1OEI4LDB4NThCOSwweDU4QkEsMHg1OEJCLDB4NThCRCwvKiAweEEwLTB4QTcgKi8KKwkweDU4QkUsMHg1OEJGLDB4NThDMCwweDU4QzIsMHg1OEMzLDB4NThDNCwweDU4QzYsMHg1OEM3LC8qIDB4QTgtMHhBRiAqLworCTB4NThDOCwweDU4QzksMHg1OENBLDB4NThDQiwweDU4Q0MsMHg1OENELDB4NThDRSwweDU4Q0YsLyogMHhCMC0weEI3ICovCisJMHg1OEQwLDB4NThEMiwweDU4RDMsMHg1OEQ0LDB4NThENiwweDU4RDcsMHg1OEQ4LDB4NThEOSwvKiAweEI4LTB4QkYgKi8KKwkweDU4REEsMHg1OERCLDB4NThEQywweDU4REQsMHg1OERFLDB4NThERiwweDU4RTAsMHg1OEUxLC8qIDB4QzAtMHhDNyAqLworCTB4NThFMiwweDU4RTMsMHg1OEU1LDB4NThFNiwweDU4RTcsMHg1OEU4LDB4NThFOSwweDU4RUEsLyogMHhDOC0weENGICovCisJMHg1OEVELDB4NThFRiwweDU4RjEsMHg1OEYyLDB4NThGNCwweDU4RjUsMHg1OEY3LDB4NThGOCwvKiAweEQwLTB4RDcgKi8KKwkweDU4RkEsMHg1OEZCLDB4NThGQywweDU4RkQsMHg1OEZFLDB4NThGRiwweDU5MDAsMHg1OTAxLC8qIDB4RDgtMHhERiAqLworCTB4NTkwMywweDU5MDUsMHg1OTA2LDB4NTkwOCwweDU5MDksMHg1OTBBLDB4NTkwQiwweDU5MEMsLyogMHhFMC0weEU3ICovCisJMHg1OTBFLDB4NTkxMCwweDU5MTEsMHg1OTEyLDB4NTkxMywweDU5MTcsMHg1OTE4LDB4NTkxQiwvKiAweEU4LTB4RUYgKi8KKwkweDU5MUQsMHg1OTFFLDB4NTkyMCwweDU5MjEsMHg1OTIyLDB4NTkyMywweDU5MjYsMHg1OTI4LC8qIDB4RjAtMHhGNyAqLworCTB4NTkyQywweDU5MzAsMHg1OTMyLDB4NTkzMywweDU5MzUsMHg1OTM2LDB4NTkzQiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOEFbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg1OTNELDB4NTkzRSwweDU5M0YsMHg1OTQwLDB4NTk0MywweDU5NDUsMHg1OTQ2LDB4NTk0QSwvKiAweDQwLTB4NDcgKi8KKwkweDU5NEMsMHg1OTRELDB4NTk1MCwweDU5NTIsMHg1OTUzLDB4NTk1OSwweDU5NUIsMHg1OTVDLC8qIDB4NDgtMHg0RiAqLworCTB4NTk1RCwweDU5NUUsMHg1OTVGLDB4NTk2MSwweDU5NjMsMHg1OTY0LDB4NTk2NiwweDU5NjcsLyogMHg1MC0weDU3ICovCisJMHg1OTY4LDB4NTk2OSwweDU5NkEsMHg1OTZCLDB4NTk2QywweDU5NkQsMHg1OTZFLDB4NTk2RiwvKiAweDU4LTB4NUYgKi8KKwkweDU5NzAsMHg1OTcxLDB4NTk3MiwweDU5NzUsMHg1OTc3LDB4NTk3QSwweDU5N0IsMHg1OTdDLC8qIDB4NjAtMHg2NyAqLworCTB4NTk3RSwweDU5N0YsMHg1OTgwLDB4NTk4NSwweDU5ODksMHg1OThCLDB4NTk4QywweDU5OEUsLyogMHg2OC0weDZGICovCisJMHg1OThGLDB4NTk5MCwweDU5OTEsMHg1OTk0LDB4NTk5NSwweDU5OTgsMHg1OTlBLDB4NTk5QiwvKiAweDcwLTB4NzcgKi8KKwkweDU5OUMsMHg1OTlELDB4NTk5RiwweDU5QTAsMHg1OUExLDB4NTlBMiwweDU5QTYsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg1OUE3LDB4NTlBQywweDU5QUQsMHg1OUIwLDB4NTlCMSwweDU5QjMsMHg1OUI0LDB4NTlCNSwvKiAweDgwLTB4ODcgKi8KKwkweDU5QjYsMHg1OUI3LDB4NTlCOCwweDU5QkEsMHg1OUJDLDB4NTlCRCwweDU5QkYsMHg1OUMwLC8qIDB4ODgtMHg4RiAqLworCTB4NTlDMSwweDU5QzIsMHg1OUMzLDB4NTlDNCwweDU5QzUsMHg1OUM3LDB4NTlDOCwweDU5QzksLyogMHg5MC0weDk3ICovCisJMHg1OUNDLDB4NTlDRCwweDU5Q0UsMHg1OUNGLDB4NTlENSwweDU5RDYsMHg1OUQ5LDB4NTlEQiwvKiAweDk4LTB4OUYgKi8KKwkweDU5REUsMHg1OURGLDB4NTlFMCwweDU5RTEsMHg1OUUyLDB4NTlFNCwweDU5RTYsMHg1OUU3LC8qIDB4QTAtMHhBNyAqLworCTB4NTlFOSwweDU5RUEsMHg1OUVCLDB4NTlFRCwweDU5RUUsMHg1OUVGLDB4NTlGMCwweDU5RjEsLyogMHhBOC0weEFGICovCisJMHg1OUYyLDB4NTlGMywweDU5RjQsMHg1OUY1LDB4NTlGNiwweDU5RjcsMHg1OUY4LDB4NTlGQSwvKiAweEIwLTB4QjcgKi8KKwkweDU5RkMsMHg1OUZELDB4NTlGRSwweDVBMDAsMHg1QTAyLDB4NUEwQSwweDVBMEIsMHg1QTBELC8qIDB4QjgtMHhCRiAqLworCTB4NUEwRSwweDVBMEYsMHg1QTEwLDB4NUExMiwweDVBMTQsMHg1QTE1LDB4NUExNiwweDVBMTcsLyogMHhDMC0weEM3ICovCisJMHg1QTE5LDB4NUExQSwweDVBMUIsMHg1QTFELDB4NUExRSwweDVBMjEsMHg1QTIyLDB4NUEyNCwvKiAweEM4LTB4Q0YgKi8KKwkweDVBMjYsMHg1QTI3LDB4NUEyOCwweDVBMkEsMHg1QTJCLDB4NUEyQywweDVBMkQsMHg1QTJFLC8qIDB4RDAtMHhENyAqLworCTB4NUEyRiwweDVBMzAsMHg1QTMzLDB4NUEzNSwweDVBMzcsMHg1QTM4LDB4NUEzOSwweDVBM0EsLyogMHhEOC0weERGICovCisJMHg1QTNCLDB4NUEzRCwweDVBM0UsMHg1QTNGLDB4NUE0MSwweDVBNDIsMHg1QTQzLDB4NUE0NCwvKiAweEUwLTB4RTcgKi8KKwkweDVBNDUsMHg1QTQ3LDB4NUE0OCwweDVBNEIsMHg1QTRDLDB4NUE0RCwweDVBNEUsMHg1QTRGLC8qIDB4RTgtMHhFRiAqLworCTB4NUE1MCwweDVBNTEsMHg1QTUyLDB4NUE1MywweDVBNTQsMHg1QTU2LDB4NUE1NywweDVBNTgsLyogMHhGMC0weEY3ICovCisJMHg1QTU5LDB4NUE1QiwweDVBNUMsMHg1QTVELDB4NUE1RSwweDVBNUYsMHg1QTYwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV84QlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDVBNjEsMHg1QTYzLDB4NUE2NCwweDVBNjUsMHg1QTY2LDB4NUE2OCwweDVBNjksMHg1QTZCLC8qIDB4NDAtMHg0NyAqLworCTB4NUE2QywweDVBNkQsMHg1QTZFLDB4NUE2RiwweDVBNzAsMHg1QTcxLDB4NUE3MiwweDVBNzMsLyogMHg0OC0weDRGICovCisJMHg1QTc4LDB4NUE3OSwweDVBN0IsMHg1QTdDLDB4NUE3RCwweDVBN0UsMHg1QTgwLDB4NUE4MSwvKiAweDUwLTB4NTcgKi8KKwkweDVBODIsMHg1QTgzLDB4NUE4NCwweDVBODUsMHg1QTg2LDB4NUE4NywweDVBODgsMHg1QTg5LC8qIDB4NTgtMHg1RiAqLworCTB4NUE4QSwweDVBOEIsMHg1QThDLDB4NUE4RCwweDVBOEUsMHg1QThGLDB4NUE5MCwweDVBOTEsLyogMHg2MC0weDY3ICovCisJMHg1QTkzLDB4NUE5NCwweDVBOTUsMHg1QTk2LDB4NUE5NywweDVBOTgsMHg1QTk5LDB4NUE5QywvKiAweDY4LTB4NkYgKi8KKwkweDVBOUQsMHg1QTlFLDB4NUE5RiwweDVBQTAsMHg1QUExLDB4NUFBMiwweDVBQTMsMHg1QUE0LC8qIDB4NzAtMHg3NyAqLworCTB4NUFBNSwweDVBQTYsMHg1QUE3LDB4NUFBOCwweDVBQTksMHg1QUFCLDB4NUFBQywweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDVBQUQsMHg1QUFFLDB4NUFBRiwweDVBQjAsMHg1QUIxLDB4NUFCNCwweDVBQjYsMHg1QUI3LC8qIDB4ODAtMHg4NyAqLworCTB4NUFCOSwweDVBQkEsMHg1QUJCLDB4NUFCQywweDVBQkQsMHg1QUJGLDB4NUFDMCwweDVBQzMsLyogMHg4OC0weDhGICovCisJMHg1QUM0LDB4NUFDNSwweDVBQzYsMHg1QUM3LDB4NUFDOCwweDVBQ0EsMHg1QUNCLDB4NUFDRCwvKiAweDkwLTB4OTcgKi8KKwkweDVBQ0UsMHg1QUNGLDB4NUFEMCwweDVBRDEsMHg1QUQzLDB4NUFENSwweDVBRDcsMHg1QUQ5LC8qIDB4OTgtMHg5RiAqLworCTB4NUFEQSwweDVBREIsMHg1QURELDB4NUFERSwweDVBREYsMHg1QUUyLDB4NUFFNCwweDVBRTUsLyogMHhBMC0weEE3ICovCisJMHg1QUU3LDB4NUFFOCwweDVBRUEsMHg1QUVDLDB4NUFFRCwweDVBRUUsMHg1QUVGLDB4NUFGMCwvKiAweEE4LTB4QUYgKi8KKwkweDVBRjIsMHg1QUYzLDB4NUFGNCwweDVBRjUsMHg1QUY2LDB4NUFGNywweDVBRjgsMHg1QUY5LC8qIDB4QjAtMHhCNyAqLworCTB4NUFGQSwweDVBRkIsMHg1QUZDLDB4NUFGRCwweDVBRkUsMHg1QUZGLDB4NUIwMCwweDVCMDEsLyogMHhCOC0weEJGICovCisJMHg1QjAyLDB4NUIwMywweDVCMDQsMHg1QjA1LDB4NUIwNiwweDVCMDcsMHg1QjA4LDB4NUIwQSwvKiAweEMwLTB4QzcgKi8KKwkweDVCMEIsMHg1QjBDLDB4NUIwRCwweDVCMEUsMHg1QjBGLDB4NUIxMCwweDVCMTEsMHg1QjEyLC8qIDB4QzgtMHhDRiAqLworCTB4NUIxMywweDVCMTQsMHg1QjE1LDB4NUIxOCwweDVCMTksMHg1QjFBLDB4NUIxQiwweDVCMUMsLyogMHhEMC0weEQ3ICovCisJMHg1QjFELDB4NUIxRSwweDVCMUYsMHg1QjIwLDB4NUIyMSwweDVCMjIsMHg1QjIzLDB4NUIyNCwvKiAweEQ4LTB4REYgKi8KKwkweDVCMjUsMHg1QjI2LDB4NUIyNywweDVCMjgsMHg1QjI5LDB4NUIyQSwweDVCMkIsMHg1QjJDLC8qIDB4RTAtMHhFNyAqLworCTB4NUIyRCwweDVCMkUsMHg1QjJGLDB4NUIzMCwweDVCMzEsMHg1QjMzLDB4NUIzNSwweDVCMzYsLyogMHhFOC0weEVGICovCisJMHg1QjM4LDB4NUIzOSwweDVCM0EsMHg1QjNCLDB4NUIzQywweDVCM0QsMHg1QjNFLDB4NUIzRiwvKiAweEYwLTB4RjcgKi8KKwkweDVCNDEsMHg1QjQyLDB4NUI0MywweDVCNDQsMHg1QjQ1LDB4NUI0NiwweDVCNDcsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzhDWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NUI0OCwweDVCNDksMHg1QjRBLDB4NUI0QiwweDVCNEMsMHg1QjRELDB4NUI0RSwweDVCNEYsLyogMHg0MC0weDQ3ICovCisJMHg1QjUyLDB4NUI1NiwweDVCNUUsMHg1QjYwLDB4NUI2MSwweDVCNjcsMHg1QjY4LDB4NUI2QiwvKiAweDQ4LTB4NEYgKi8KKwkweDVCNkQsMHg1QjZFLDB4NUI2RiwweDVCNzIsMHg1Qjc0LDB4NUI3NiwweDVCNzcsMHg1Qjc4LC8qIDB4NTAtMHg1NyAqLworCTB4NUI3OSwweDVCN0IsMHg1QjdDLDB4NUI3RSwweDVCN0YsMHg1QjgyLDB4NUI4NiwweDVCOEEsLyogMHg1OC0weDVGICovCisJMHg1QjhELDB4NUI4RSwweDVCOTAsMHg1QjkxLDB4NUI5MiwweDVCOTQsMHg1Qjk2LDB4NUI5RiwvKiAweDYwLTB4NjcgKi8KKwkweDVCQTcsMHg1QkE4LDB4NUJBOSwweDVCQUMsMHg1QkFELDB4NUJBRSwweDVCQUYsMHg1QkIxLC8qIDB4NjgtMHg2RiAqLworCTB4NUJCMiwweDVCQjcsMHg1QkJBLDB4NUJCQiwweDVCQkMsMHg1QkMwLDB4NUJDMSwweDVCQzMsLyogMHg3MC0weDc3ICovCisJMHg1QkM4LDB4NUJDOSwweDVCQ0EsMHg1QkNCLDB4NUJDRCwweDVCQ0UsMHg1QkNGLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NUJEMSwweDVCRDQsMHg1QkQ1LDB4NUJENiwweDVCRDcsMHg1QkQ4LDB4NUJEOSwweDVCREEsLyogMHg4MC0weDg3ICovCisJMHg1QkRCLDB4NUJEQywweDVCRTAsMHg1QkUyLDB4NUJFMywweDVCRTYsMHg1QkU3LDB4NUJFOSwvKiAweDg4LTB4OEYgKi8KKwkweDVCRUEsMHg1QkVCLDB4NUJFQywweDVCRUQsMHg1QkVGLDB4NUJGMSwweDVCRjIsMHg1QkYzLC8qIDB4OTAtMHg5NyAqLworCTB4NUJGNCwweDVCRjUsMHg1QkY2LDB4NUJGNywweDVCRkQsMHg1QkZFLDB4NUMwMCwweDVDMDIsLyogMHg5OC0weDlGICovCisJMHg1QzAzLDB4NUMwNSwweDVDMDcsMHg1QzA4LDB4NUMwQiwweDVDMEMsMHg1QzBELDB4NUMwRSwvKiAweEEwLTB4QTcgKi8KKwkweDVDMTAsMHg1QzEyLDB4NUMxMywweDVDMTcsMHg1QzE5LDB4NUMxQiwweDVDMUUsMHg1QzFGLC8qIDB4QTgtMHhBRiAqLworCTB4NUMyMCwweDVDMjEsMHg1QzIzLDB4NUMyNiwweDVDMjgsMHg1QzI5LDB4NUMyQSwweDVDMkIsLyogMHhCMC0weEI3ICovCisJMHg1QzJELDB4NUMyRSwweDVDMkYsMHg1QzMwLDB4NUMzMiwweDVDMzMsMHg1QzM1LDB4NUMzNiwvKiAweEI4LTB4QkYgKi8KKwkweDVDMzcsMHg1QzQzLDB4NUM0NCwweDVDNDYsMHg1QzQ3LDB4NUM0QywweDVDNEQsMHg1QzUyLC8qIDB4QzAtMHhDNyAqLworCTB4NUM1MywweDVDNTQsMHg1QzU2LDB4NUM1NywweDVDNTgsMHg1QzVBLDB4NUM1QiwweDVDNUMsLyogMHhDOC0weENGICovCisJMHg1QzVELDB4NUM1RiwweDVDNjIsMHg1QzY0LDB4NUM2NywweDVDNjgsMHg1QzY5LDB4NUM2QSwvKiAweEQwLTB4RDcgKi8KKwkweDVDNkIsMHg1QzZDLDB4NUM2RCwweDVDNzAsMHg1QzcyLDB4NUM3MywweDVDNzQsMHg1Qzc1LC8qIDB4RDgtMHhERiAqLworCTB4NUM3NiwweDVDNzcsMHg1Qzc4LDB4NUM3QiwweDVDN0MsMHg1QzdELDB4NUM3RSwweDVDODAsLyogMHhFMC0weEU3ICovCisJMHg1QzgzLDB4NUM4NCwweDVDODUsMHg1Qzg2LDB4NUM4NywweDVDODksMHg1QzhBLDB4NUM4QiwvKiAweEU4LTB4RUYgKi8KKwkweDVDOEUsMHg1QzhGLDB4NUM5MiwweDVDOTMsMHg1Qzk1LDB4NUM5RCwweDVDOUUsMHg1QzlGLC8qIDB4RjAtMHhGNyAqLworCTB4NUNBMCwweDVDQTEsMHg1Q0E0LDB4NUNBNSwweDVDQTYsMHg1Q0E3LDB4NUNBOCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOERbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg1Q0FBLDB4NUNBRSwweDVDQUYsMHg1Q0IwLDB4NUNCMiwweDVDQjQsMHg1Q0I2LDB4NUNCOSwvKiAweDQwLTB4NDcgKi8KKwkweDVDQkEsMHg1Q0JCLDB4NUNCQywweDVDQkUsMHg1Q0MwLDB4NUNDMiwweDVDQzMsMHg1Q0M1LC8qIDB4NDgtMHg0RiAqLworCTB4NUNDNiwweDVDQzcsMHg1Q0M4LDB4NUNDOSwweDVDQ0EsMHg1Q0NDLDB4NUNDRCwweDVDQ0UsLyogMHg1MC0weDU3ICovCisJMHg1Q0NGLDB4NUNEMCwweDVDRDEsMHg1Q0QzLDB4NUNENCwweDVDRDUsMHg1Q0Q2LDB4NUNENywvKiAweDU4LTB4NUYgKi8KKwkweDVDRDgsMHg1Q0RBLDB4NUNEQiwweDVDREMsMHg1Q0RELDB4NUNERSwweDVDREYsMHg1Q0UwLC8qIDB4NjAtMHg2NyAqLworCTB4NUNFMiwweDVDRTMsMHg1Q0U3LDB4NUNFOSwweDVDRUIsMHg1Q0VDLDB4NUNFRSwweDVDRUYsLyogMHg2OC0weDZGICovCisJMHg1Q0YxLDB4NUNGMiwweDVDRjMsMHg1Q0Y0LDB4NUNGNSwweDVDRjYsMHg1Q0Y3LDB4NUNGOCwvKiAweDcwLTB4NzcgKi8KKwkweDVDRjksMHg1Q0ZBLDB4NUNGQywweDVDRkQsMHg1Q0ZFLDB4NUNGRiwweDVEMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg1RDAxLDB4NUQwNCwweDVEMDUsMHg1RDA4LDB4NUQwOSwweDVEMEEsMHg1RDBCLDB4NUQwQywvKiAweDgwLTB4ODcgKi8KKwkweDVEMEQsMHg1RDBGLDB4NUQxMCwweDVEMTEsMHg1RDEyLDB4NUQxMywweDVEMTUsMHg1RDE3LC8qIDB4ODgtMHg4RiAqLworCTB4NUQxOCwweDVEMTksMHg1RDFBLDB4NUQxQywweDVEMUQsMHg1RDFGLDB4NUQyMCwweDVEMjEsLyogMHg5MC0weDk3ICovCisJMHg1RDIyLDB4NUQyMywweDVEMjUsMHg1RDI4LDB4NUQyQSwweDVEMkIsMHg1RDJDLDB4NUQyRiwvKiAweDk4LTB4OUYgKi8KKwkweDVEMzAsMHg1RDMxLDB4NUQzMiwweDVEMzMsMHg1RDM1LDB4NUQzNiwweDVEMzcsMHg1RDM4LC8qIDB4QTAtMHhBNyAqLworCTB4NUQzOSwweDVEM0EsMHg1RDNCLDB4NUQzQywweDVEM0YsMHg1RDQwLDB4NUQ0MSwweDVENDIsLyogMHhBOC0weEFGICovCisJMHg1RDQzLDB4NUQ0NCwweDVENDUsMHg1RDQ2LDB4NUQ0OCwweDVENDksMHg1RDRELDB4NUQ0RSwvKiAweEIwLTB4QjcgKi8KKwkweDVENEYsMHg1RDUwLDB4NUQ1MSwweDVENTIsMHg1RDUzLDB4NUQ1NCwweDVENTUsMHg1RDU2LC8qIDB4QjgtMHhCRiAqLworCTB4NUQ1NywweDVENTksMHg1RDVBLDB4NUQ1QywweDVENUUsMHg1RDVGLDB4NUQ2MCwweDVENjEsLyogMHhDMC0weEM3ICovCisJMHg1RDYyLDB4NUQ2MywweDVENjQsMHg1RDY1LDB4NUQ2NiwweDVENjcsMHg1RDY4LDB4NUQ2QSwvKiAweEM4LTB4Q0YgKi8KKwkweDVENkQsMHg1RDZFLDB4NUQ3MCwweDVENzEsMHg1RDcyLDB4NUQ3MywweDVENzUsMHg1RDc2LC8qIDB4RDAtMHhENyAqLworCTB4NUQ3NywweDVENzgsMHg1RDc5LDB4NUQ3QSwweDVEN0IsMHg1RDdDLDB4NUQ3RCwweDVEN0UsLyogMHhEOC0weERGICovCisJMHg1RDdGLDB4NUQ4MCwweDVEODEsMHg1RDgzLDB4NUQ4NCwweDVEODUsMHg1RDg2LDB4NUQ4NywvKiAweEUwLTB4RTcgKi8KKwkweDVEODgsMHg1RDg5LDB4NUQ4QSwweDVEOEIsMHg1RDhDLDB4NUQ4RCwweDVEOEUsMHg1RDhGLC8qIDB4RTgtMHhFRiAqLworCTB4NUQ5MCwweDVEOTEsMHg1RDkyLDB4NUQ5MywweDVEOTQsMHg1RDk1LDB4NUQ5NiwweDVEOTcsLyogMHhGMC0weEY3ICovCisJMHg1RDk4LDB4NUQ5QSwweDVEOUIsMHg1RDlDLDB4NUQ5RSwweDVEOUYsMHg1REEwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV84RVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDVEQTEsMHg1REEyLDB4NURBMywweDVEQTQsMHg1REE1LDB4NURBNiwweDVEQTcsMHg1REE4LC8qIDB4NDAtMHg0NyAqLworCTB4NURBOSwweDVEQUEsMHg1REFCLDB4NURBQywweDVEQUQsMHg1REFFLDB4NURBRiwweDVEQjAsLyogMHg0OC0weDRGICovCisJMHg1REIxLDB4NURCMiwweDVEQjMsMHg1REI0LDB4NURCNSwweDVEQjYsMHg1REI4LDB4NURCOSwvKiAweDUwLTB4NTcgKi8KKwkweDVEQkEsMHg1REJCLDB4NURCQywweDVEQkQsMHg1REJFLDB4NURCRiwweDVEQzAsMHg1REMxLC8qIDB4NTgtMHg1RiAqLworCTB4NURDMiwweDVEQzMsMHg1REM0LDB4NURDNiwweDVEQzcsMHg1REM4LDB4NURDOSwweDVEQ0EsLyogMHg2MC0weDY3ICovCisJMHg1RENCLDB4NURDQywweDVEQ0UsMHg1RENGLDB4NUREMCwweDVERDEsMHg1REQyLDB4NUREMywvKiAweDY4LTB4NkYgKi8KKwkweDVERDQsMHg1REQ1LDB4NURENiwweDVERDcsMHg1REQ4LDB4NUREOSwweDVEREEsMHg1RERDLC8qIDB4NzAtMHg3NyAqLworCTB4NURERiwweDVERTAsMHg1REUzLDB4NURFNCwweDVERUEsMHg1REVDLDB4NURFRCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDVERjAsMHg1REY1LDB4NURGNiwweDVERjgsMHg1REY5LDB4NURGQSwweDVERkIsMHg1REZDLC8qIDB4ODAtMHg4NyAqLworCTB4NURGRiwweDVFMDAsMHg1RTA0LDB4NUUwNywweDVFMDksMHg1RTBBLDB4NUUwQiwweDVFMEQsLyogMHg4OC0weDhGICovCisJMHg1RTBFLDB4NUUxMiwweDVFMTMsMHg1RTE3LDB4NUUxRSwweDVFMUYsMHg1RTIwLDB4NUUyMSwvKiAweDkwLTB4OTcgKi8KKwkweDVFMjIsMHg1RTIzLDB4NUUyNCwweDVFMjUsMHg1RTI4LDB4NUUyOSwweDVFMkEsMHg1RTJCLC8qIDB4OTgtMHg5RiAqLworCTB4NUUyQywweDVFMkYsMHg1RTMwLDB4NUUzMiwweDVFMzMsMHg1RTM0LDB4NUUzNSwweDVFMzYsLyogMHhBMC0weEE3ICovCisJMHg1RTM5LDB4NUUzQSwweDVFM0UsMHg1RTNGLDB4NUU0MCwweDVFNDEsMHg1RTQzLDB4NUU0NiwvKiAweEE4LTB4QUYgKi8KKwkweDVFNDcsMHg1RTQ4LDB4NUU0OSwweDVFNEEsMHg1RTRCLDB4NUU0RCwweDVFNEUsMHg1RTRGLC8qIDB4QjAtMHhCNyAqLworCTB4NUU1MCwweDVFNTEsMHg1RTUyLDB4NUU1MywweDVFNTYsMHg1RTU3LDB4NUU1OCwweDVFNTksLyogMHhCOC0weEJGICovCisJMHg1RTVBLDB4NUU1QywweDVFNUQsMHg1RTVGLDB4NUU2MCwweDVFNjMsMHg1RTY0LDB4NUU2NSwvKiAweEMwLTB4QzcgKi8KKwkweDVFNjYsMHg1RTY3LDB4NUU2OCwweDVFNjksMHg1RTZBLDB4NUU2QiwweDVFNkMsMHg1RTZELC8qIDB4QzgtMHhDRiAqLworCTB4NUU2RSwweDVFNkYsMHg1RTcwLDB4NUU3MSwweDVFNzUsMHg1RTc3LDB4NUU3OSwweDVFN0UsLyogMHhEMC0weEQ3ICovCisJMHg1RTgxLDB4NUU4MiwweDVFODMsMHg1RTg1LDB4NUU4OCwweDVFODksMHg1RThDLDB4NUU4RCwvKiAweEQ4LTB4REYgKi8KKwkweDVFOEUsMHg1RTkyLDB4NUU5OCwweDVFOUIsMHg1RTlELDB4NUVBMSwweDVFQTIsMHg1RUEzLC8qIDB4RTAtMHhFNyAqLworCTB4NUVBNCwweDVFQTgsMHg1RUE5LDB4NUVBQSwweDVFQUIsMHg1RUFDLDB4NUVBRSwweDVFQUYsLyogMHhFOC0weEVGICovCisJMHg1RUIwLDB4NUVCMSwweDVFQjIsMHg1RUI0LDB4NUVCQSwweDVFQkIsMHg1RUJDLDB4NUVCRCwvKiAweEYwLTB4RjcgKi8KKwkweDVFQkYsMHg1RUMwLDB4NUVDMSwweDVFQzIsMHg1RUMzLDB4NUVDNCwweDVFQzUsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzhGWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NUVDNiwweDVFQzcsMHg1RUM4LDB4NUVDQiwweDVFQ0MsMHg1RUNELDB4NUVDRSwweDVFQ0YsLyogMHg0MC0weDQ3ICovCisJMHg1RUQwLDB4NUVENCwweDVFRDUsMHg1RUQ3LDB4NUVEOCwweDVFRDksMHg1RURBLDB4NUVEQywvKiAweDQ4LTB4NEYgKi8KKwkweDVFREQsMHg1RURFLDB4NUVERiwweDVFRTAsMHg1RUUxLDB4NUVFMiwweDVFRTMsMHg1RUU0LC8qIDB4NTAtMHg1NyAqLworCTB4NUVFNSwweDVFRTYsMHg1RUU3LDB4NUVFOSwweDVFRUIsMHg1RUVDLDB4NUVFRCwweDVFRUUsLyogMHg1OC0weDVGICovCisJMHg1RUVGLDB4NUVGMCwweDVFRjEsMHg1RUYyLDB4NUVGMywweDVFRjUsMHg1RUY4LDB4NUVGOSwvKiAweDYwLTB4NjcgKi8KKwkweDVFRkIsMHg1RUZDLDB4NUVGRCwweDVGMDUsMHg1RjA2LDB4NUYwNywweDVGMDksMHg1RjBDLC8qIDB4NjgtMHg2RiAqLworCTB4NUYwRCwweDVGMEUsMHg1RjEwLDB4NUYxMiwweDVGMTQsMHg1RjE2LDB4NUYxOSwweDVGMUEsLyogMHg3MC0weDc3ICovCisJMHg1RjFDLDB4NUYxRCwweDVGMUUsMHg1RjIxLDB4NUYyMiwweDVGMjMsMHg1RjI0LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NUYyOCwweDVGMkIsMHg1RjJDLDB4NUYyRSwweDVGMzAsMHg1RjMyLDB4NUYzMywweDVGMzQsLyogMHg4MC0weDg3ICovCisJMHg1RjM1LDB4NUYzNiwweDVGMzcsMHg1RjM4LDB4NUYzQiwweDVGM0QsMHg1RjNFLDB4NUYzRiwvKiAweDg4LTB4OEYgKi8KKwkweDVGNDEsMHg1RjQyLDB4NUY0MywweDVGNDQsMHg1RjQ1LDB4NUY0NiwweDVGNDcsMHg1RjQ4LC8qIDB4OTAtMHg5NyAqLworCTB4NUY0OSwweDVGNEEsMHg1RjRCLDB4NUY0QywweDVGNEQsMHg1RjRFLDB4NUY0RiwweDVGNTEsLyogMHg5OC0weDlGICovCisJMHg1RjU0LDB4NUY1OSwweDVGNUEsMHg1RjVCLDB4NUY1QywweDVGNUUsMHg1RjVGLDB4NUY2MCwvKiAweEEwLTB4QTcgKi8KKwkweDVGNjMsMHg1RjY1LDB4NUY2NywweDVGNjgsMHg1RjZCLDB4NUY2RSwweDVGNkYsMHg1RjcyLC8qIDB4QTgtMHhBRiAqLworCTB4NUY3NCwweDVGNzUsMHg1Rjc2LDB4NUY3OCwweDVGN0EsMHg1RjdELDB4NUY3RSwweDVGN0YsLyogMHhCMC0weEI3ICovCisJMHg1RjgzLDB4NUY4NiwweDVGOEQsMHg1RjhFLDB4NUY4RiwweDVGOTEsMHg1RjkzLDB4NUY5NCwvKiAweEI4LTB4QkYgKi8KKwkweDVGOTYsMHg1RjlBLDB4NUY5QiwweDVGOUQsMHg1RjlFLDB4NUY5RiwweDVGQTAsMHg1RkEyLC8qIDB4QzAtMHhDNyAqLworCTB4NUZBMywweDVGQTQsMHg1RkE1LDB4NUZBNiwweDVGQTcsMHg1RkE5LDB4NUZBQiwweDVGQUMsLyogMHhDOC0weENGICovCisJMHg1RkFGLDB4NUZCMCwweDVGQjEsMHg1RkIyLDB4NUZCMywweDVGQjQsMHg1RkI2LDB4NUZCOCwvKiAweEQwLTB4RDcgKi8KKwkweDVGQjksMHg1RkJBLDB4NUZCQiwweDVGQkUsMHg1RkJGLDB4NUZDMCwweDVGQzEsMHg1RkMyLC8qIDB4RDgtMHhERiAqLworCTB4NUZDNywweDVGQzgsMHg1RkNBLDB4NUZDQiwweDVGQ0UsMHg1RkQzLDB4NUZENCwweDVGRDUsLyogMHhFMC0weEU3ICovCisJMHg1RkRBLDB4NUZEQiwweDVGREMsMHg1RkRFLDB4NUZERiwweDVGRTIsMHg1RkUzLDB4NUZFNSwvKiAweEU4LTB4RUYgKi8KKwkweDVGRTYsMHg1RkU4LDB4NUZFOSwweDVGRUMsMHg1RkVGLDB4NUZGMCwweDVGRjIsMHg1RkYzLC8qIDB4RjAtMHhGNyAqLworCTB4NUZGNCwweDVGRjYsMHg1RkY3LDB4NUZGOSwweDVGRkEsMHg1RkZDLDB4NjAwNywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOTBbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg2MDA4LDB4NjAwOSwweDYwMEIsMHg2MDBDLDB4NjAxMCwweDYwMTEsMHg2MDEzLDB4NjAxNywvKiAweDQwLTB4NDcgKi8KKwkweDYwMTgsMHg2MDFBLDB4NjAxRSwweDYwMUYsMHg2MDIyLDB4NjAyMywweDYwMjQsMHg2MDJDLC8qIDB4NDgtMHg0RiAqLworCTB4NjAyRCwweDYwMkUsMHg2MDMwLDB4NjAzMSwweDYwMzIsMHg2MDMzLDB4NjAzNCwweDYwMzYsLyogMHg1MC0weDU3ICovCisJMHg2MDM3LDB4NjAzOCwweDYwMzksMHg2MDNBLDB4NjAzRCwweDYwM0UsMHg2MDQwLDB4NjA0NCwvKiAweDU4LTB4NUYgKi8KKwkweDYwNDUsMHg2MDQ2LDB4NjA0NywweDYwNDgsMHg2MDQ5LDB4NjA0QSwweDYwNEMsMHg2MDRFLC8qIDB4NjAtMHg2NyAqLworCTB4NjA0RiwweDYwNTEsMHg2MDUzLDB4NjA1NCwweDYwNTYsMHg2MDU3LDB4NjA1OCwweDYwNUIsLyogMHg2OC0weDZGICovCisJMHg2MDVDLDB4NjA1RSwweDYwNUYsMHg2MDYwLDB4NjA2MSwweDYwNjUsMHg2MDY2LDB4NjA2RSwvKiAweDcwLTB4NzcgKi8KKwkweDYwNzEsMHg2MDcyLDB4NjA3NCwweDYwNzUsMHg2MDc3LDB4NjA3RSwweDYwODAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg2MDgxLDB4NjA4MiwweDYwODUsMHg2MDg2LDB4NjA4NywweDYwODgsMHg2MDhBLDB4NjA4QiwvKiAweDgwLTB4ODcgKi8KKwkweDYwOEUsMHg2MDhGLDB4NjA5MCwweDYwOTEsMHg2MDkzLDB4NjA5NSwweDYwOTcsMHg2MDk4LC8qIDB4ODgtMHg4RiAqLworCTB4NjA5OSwweDYwOUMsMHg2MDlFLDB4NjBBMSwweDYwQTIsMHg2MEE0LDB4NjBBNSwweDYwQTcsLyogMHg5MC0weDk3ICovCisJMHg2MEE5LDB4NjBBQSwweDYwQUUsMHg2MEIwLDB4NjBCMywweDYwQjUsMHg2MEI2LDB4NjBCNywvKiAweDk4LTB4OUYgKi8KKwkweDYwQjksMHg2MEJBLDB4NjBCRCwweDYwQkUsMHg2MEJGLDB4NjBDMCwweDYwQzEsMHg2MEMyLC8qIDB4QTAtMHhBNyAqLworCTB4NjBDMywweDYwQzQsMHg2MEM3LDB4NjBDOCwweDYwQzksMHg2MENDLDB4NjBDRCwweDYwQ0UsLyogMHhBOC0weEFGICovCisJMHg2MENGLDB4NjBEMCwweDYwRDIsMHg2MEQzLDB4NjBENCwweDYwRDYsMHg2MEQ3LDB4NjBEOSwvKiAweEIwLTB4QjcgKi8KKwkweDYwREIsMHg2MERFLDB4NjBFMSwweDYwRTIsMHg2MEUzLDB4NjBFNCwweDYwRTUsMHg2MEVBLC8qIDB4QjgtMHhCRiAqLworCTB4NjBGMSwweDYwRjIsMHg2MEY1LDB4NjBGNywweDYwRjgsMHg2MEZCLDB4NjBGQywweDYwRkQsLyogMHhDMC0weEM3ICovCisJMHg2MEZFLDB4NjBGRiwweDYxMDIsMHg2MTAzLDB4NjEwNCwweDYxMDUsMHg2MTA3LDB4NjEwQSwvKiAweEM4LTB4Q0YgKi8KKwkweDYxMEIsMHg2MTBDLDB4NjExMCwweDYxMTEsMHg2MTEyLDB4NjExMywweDYxMTQsMHg2MTE2LC8qIDB4RDAtMHhENyAqLworCTB4NjExNywweDYxMTgsMHg2MTE5LDB4NjExQiwweDYxMUMsMHg2MTFELDB4NjExRSwweDYxMjEsLyogMHhEOC0weERGICovCisJMHg2MTIyLDB4NjEyNSwweDYxMjgsMHg2MTI5LDB4NjEyQSwweDYxMkMsMHg2MTJELDB4NjEyRSwvKiAweEUwLTB4RTcgKi8KKwkweDYxMkYsMHg2MTMwLDB4NjEzMSwweDYxMzIsMHg2MTMzLDB4NjEzNCwweDYxMzUsMHg2MTM2LC8qIDB4RTgtMHhFRiAqLworCTB4NjEzNywweDYxMzgsMHg2MTM5LDB4NjEzQSwweDYxM0IsMHg2MTNDLDB4NjEzRCwweDYxM0UsLyogMHhGMC0weEY3ICovCisJMHg2MTQwLDB4NjE0MSwweDYxNDIsMHg2MTQzLDB4NjE0NCwweDYxNDUsMHg2MTQ2LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV85MVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDYxNDcsMHg2MTQ5LDB4NjE0QiwweDYxNEQsMHg2MTRGLDB4NjE1MCwweDYxNTIsMHg2MTUzLC8qIDB4NDAtMHg0NyAqLworCTB4NjE1NCwweDYxNTYsMHg2MTU3LDB4NjE1OCwweDYxNTksMHg2MTVBLDB4NjE1QiwweDYxNUMsLyogMHg0OC0weDRGICovCisJMHg2MTVFLDB4NjE1RiwweDYxNjAsMHg2MTYxLDB4NjE2MywweDYxNjQsMHg2MTY1LDB4NjE2NiwvKiAweDUwLTB4NTcgKi8KKwkweDYxNjksMHg2MTZBLDB4NjE2QiwweDYxNkMsMHg2MTZELDB4NjE2RSwweDYxNkYsMHg2MTcxLC8qIDB4NTgtMHg1RiAqLworCTB4NjE3MiwweDYxNzMsMHg2MTc0LDB4NjE3NiwweDYxNzgsMHg2MTc5LDB4NjE3QSwweDYxN0IsLyogMHg2MC0weDY3ICovCisJMHg2MTdDLDB4NjE3RCwweDYxN0UsMHg2MTdGLDB4NjE4MCwweDYxODEsMHg2MTgyLDB4NjE4MywvKiAweDY4LTB4NkYgKi8KKwkweDYxODQsMHg2MTg1LDB4NjE4NiwweDYxODcsMHg2MTg4LDB4NjE4OSwweDYxOEEsMHg2MThDLC8qIDB4NzAtMHg3NyAqLworCTB4NjE4RCwweDYxOEYsMHg2MTkwLDB4NjE5MSwweDYxOTIsMHg2MTkzLDB4NjE5NSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDYxOTYsMHg2MTk3LDB4NjE5OCwweDYxOTksMHg2MTlBLDB4NjE5QiwweDYxOUMsMHg2MTlFLC8qIDB4ODAtMHg4NyAqLworCTB4NjE5RiwweDYxQTAsMHg2MUExLDB4NjFBMiwweDYxQTMsMHg2MUE0LDB4NjFBNSwweDYxQTYsLyogMHg4OC0weDhGICovCisJMHg2MUFBLDB4NjFBQiwweDYxQUQsMHg2MUFFLDB4NjFBRiwweDYxQjAsMHg2MUIxLDB4NjFCMiwvKiAweDkwLTB4OTcgKi8KKwkweDYxQjMsMHg2MUI0LDB4NjFCNSwweDYxQjYsMHg2MUI4LDB4NjFCOSwweDYxQkEsMHg2MUJCLC8qIDB4OTgtMHg5RiAqLworCTB4NjFCQywweDYxQkQsMHg2MUJGLDB4NjFDMCwweDYxQzEsMHg2MUMzLDB4NjFDNCwweDYxQzUsLyogMHhBMC0weEE3ICovCisJMHg2MUM2LDB4NjFDNywweDYxQzksMHg2MUNDLDB4NjFDRCwweDYxQ0UsMHg2MUNGLDB4NjFEMCwvKiAweEE4LTB4QUYgKi8KKwkweDYxRDMsMHg2MUQ1LDB4NjFENiwweDYxRDcsMHg2MUQ4LDB4NjFEOSwweDYxREEsMHg2MURCLC8qIDB4QjAtMHhCNyAqLworCTB4NjFEQywweDYxREQsMHg2MURFLDB4NjFERiwweDYxRTAsMHg2MUUxLDB4NjFFMiwweDYxRTMsLyogMHhCOC0weEJGICovCisJMHg2MUU0LDB4NjFFNSwweDYxRTcsMHg2MUU4LDB4NjFFOSwweDYxRUEsMHg2MUVCLDB4NjFFQywvKiAweEMwLTB4QzcgKi8KKwkweDYxRUQsMHg2MUVFLDB4NjFFRiwweDYxRjAsMHg2MUYxLDB4NjFGMiwweDYxRjMsMHg2MUY0LC8qIDB4QzgtMHhDRiAqLworCTB4NjFGNiwweDYxRjcsMHg2MUY4LDB4NjFGOSwweDYxRkEsMHg2MUZCLDB4NjFGQywweDYxRkQsLyogMHhEMC0weEQ3ICovCisJMHg2MUZFLDB4NjIwMCwweDYyMDEsMHg2MjAyLDB4NjIwMywweDYyMDQsMHg2MjA1LDB4NjIwNywvKiAweEQ4LTB4REYgKi8KKwkweDYyMDksMHg2MjEzLDB4NjIxNCwweDYyMTksMHg2MjFDLDB4NjIxRCwweDYyMUUsMHg2MjIwLC8qIDB4RTAtMHhFNyAqLworCTB4NjIyMywweDYyMjYsMHg2MjI3LDB4NjIyOCwweDYyMjksMHg2MjJCLDB4NjIyRCwweDYyMkYsLyogMHhFOC0weEVGICovCisJMHg2MjMwLDB4NjIzMSwweDYyMzIsMHg2MjM1LDB4NjIzNiwweDYyMzgsMHg2MjM5LDB4NjIzQSwvKiAweEYwLTB4RjcgKi8KKwkweDYyM0IsMHg2MjNDLDB4NjI0MiwweDYyNDQsMHg2MjQ1LDB4NjI0NiwweDYyNEEsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzkyWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NjI0RiwweDYyNTAsMHg2MjU1LDB4NjI1NiwweDYyNTcsMHg2MjU5LDB4NjI1QSwweDYyNUMsLyogMHg0MC0weDQ3ICovCisJMHg2MjVELDB4NjI1RSwweDYyNUYsMHg2MjYwLDB4NjI2MSwweDYyNjIsMHg2MjY0LDB4NjI2NSwvKiAweDQ4LTB4NEYgKi8KKwkweDYyNjgsMHg2MjcxLDB4NjI3MiwweDYyNzQsMHg2Mjc1LDB4NjI3NywweDYyNzgsMHg2MjdBLC8qIDB4NTAtMHg1NyAqLworCTB4NjI3QiwweDYyN0QsMHg2MjgxLDB4NjI4MiwweDYyODMsMHg2Mjg1LDB4NjI4NiwweDYyODcsLyogMHg1OC0weDVGICovCisJMHg2Mjg4LDB4NjI4QiwweDYyOEMsMHg2MjhELDB4NjI4RSwweDYyOEYsMHg2MjkwLDB4NjI5NCwvKiAweDYwLTB4NjcgKi8KKwkweDYyOTksMHg2MjlDLDB4NjI5RCwweDYyOUUsMHg2MkEzLDB4NjJBNiwweDYyQTcsMHg2MkE5LC8qIDB4NjgtMHg2RiAqLworCTB4NjJBQSwweDYyQUQsMHg2MkFFLDB4NjJBRiwweDYyQjAsMHg2MkIyLDB4NjJCMywweDYyQjQsLyogMHg3MC0weDc3ICovCisJMHg2MkI2LDB4NjJCNywweDYyQjgsMHg2MkJBLDB4NjJCRSwweDYyQzAsMHg2MkMxLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NjJDMywweDYyQ0IsMHg2MkNGLDB4NjJEMSwweDYyRDUsMHg2MkRELDB4NjJERSwweDYyRTAsLyogMHg4MC0weDg3ICovCisJMHg2MkUxLDB4NjJFNCwweDYyRUEsMHg2MkVCLDB4NjJGMCwweDYyRjIsMHg2MkY1LDB4NjJGOCwvKiAweDg4LTB4OEYgKi8KKwkweDYyRjksMHg2MkZBLDB4NjJGQiwweDYzMDAsMHg2MzAzLDB4NjMwNCwweDYzMDUsMHg2MzA2LC8qIDB4OTAtMHg5NyAqLworCTB4NjMwQSwweDYzMEIsMHg2MzBDLDB4NjMwRCwweDYzMEYsMHg2MzEwLDB4NjMxMiwweDYzMTMsLyogMHg5OC0weDlGICovCisJMHg2MzE0LDB4NjMxNSwweDYzMTcsMHg2MzE4LDB4NjMxOSwweDYzMUMsMHg2MzI2LDB4NjMyNywvKiAweEEwLTB4QTcgKi8KKwkweDYzMjksMHg2MzJDLDB4NjMyRCwweDYzMkUsMHg2MzMwLDB4NjMzMSwweDYzMzMsMHg2MzM0LC8qIDB4QTgtMHhBRiAqLworCTB4NjMzNSwweDYzMzYsMHg2MzM3LDB4NjMzOCwweDYzM0IsMHg2MzNDLDB4NjMzRSwweDYzM0YsLyogMHhCMC0weEI3ICovCisJMHg2MzQwLDB4NjM0MSwweDYzNDQsMHg2MzQ3LDB4NjM0OCwweDYzNEEsMHg2MzUxLDB4NjM1MiwvKiAweEI4LTB4QkYgKi8KKwkweDYzNTMsMHg2MzU0LDB4NjM1NiwweDYzNTcsMHg2MzU4LDB4NjM1OSwweDYzNUEsMHg2MzVCLC8qIDB4QzAtMHhDNyAqLworCTB4NjM1QywweDYzNUQsMHg2MzYwLDB4NjM2NCwweDYzNjUsMHg2MzY2LDB4NjM2OCwweDYzNkEsLyogMHhDOC0weENGICovCisJMHg2MzZCLDB4NjM2QywweDYzNkYsMHg2MzcwLDB4NjM3MiwweDYzNzMsMHg2Mzc0LDB4NjM3NSwvKiAweEQwLTB4RDcgKi8KKwkweDYzNzgsMHg2Mzc5LDB4NjM3QywweDYzN0QsMHg2MzdFLDB4NjM3RiwweDYzODEsMHg2MzgzLC8qIDB4RDgtMHhERiAqLworCTB4NjM4NCwweDYzODUsMHg2Mzg2LDB4NjM4QiwweDYzOEQsMHg2MzkxLDB4NjM5MywweDYzOTQsLyogMHhFMC0weEU3ICovCisJMHg2Mzk1LDB4NjM5NywweDYzOTksMHg2MzlBLDB4NjM5QiwweDYzOUMsMHg2MzlELDB4NjM5RSwvKiAweEU4LTB4RUYgKi8KKwkweDYzOUYsMHg2M0ExLDB4NjNBNCwweDYzQTYsMHg2M0FCLDB4NjNBRiwweDYzQjEsMHg2M0IyLC8qIDB4RjAtMHhGNyAqLworCTB4NjNCNSwweDYzQjYsMHg2M0I5LDB4NjNCQiwweDYzQkQsMHg2M0JGLDB4NjNDMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOTNbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg2M0MxLDB4NjNDMiwweDYzQzMsMHg2M0M1LDB4NjNDNywweDYzQzgsMHg2M0NBLDB4NjNDQiwvKiAweDQwLTB4NDcgKi8KKwkweDYzQ0MsMHg2M0QxLDB4NjNEMywweDYzRDQsMHg2M0Q1LDB4NjNENywweDYzRDgsMHg2M0Q5LC8qIDB4NDgtMHg0RiAqLworCTB4NjNEQSwweDYzREIsMHg2M0RDLDB4NjNERCwweDYzREYsMHg2M0UyLDB4NjNFNCwweDYzRTUsLyogMHg1MC0weDU3ICovCisJMHg2M0U2LDB4NjNFNywweDYzRTgsMHg2M0VCLDB4NjNFQywweDYzRUUsMHg2M0VGLDB4NjNGMCwvKiAweDU4LTB4NUYgKi8KKwkweDYzRjEsMHg2M0YzLDB4NjNGNSwweDYzRjcsMHg2M0Y5LDB4NjNGQSwweDYzRkIsMHg2M0ZDLC8qIDB4NjAtMHg2NyAqLworCTB4NjNGRSwweDY0MDMsMHg2NDA0LDB4NjQwNiwweDY0MDcsMHg2NDA4LDB4NjQwOSwweDY0MEEsLyogMHg2OC0weDZGICovCisJMHg2NDBELDB4NjQwRSwweDY0MTEsMHg2NDEyLDB4NjQxNSwweDY0MTYsMHg2NDE3LDB4NjQxOCwvKiAweDcwLTB4NzcgKi8KKwkweDY0MTksMHg2NDFBLDB4NjQxRCwweDY0MUYsMHg2NDIyLDB4NjQyMywweDY0MjQsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg2NDI1LDB4NjQyNywweDY0MjgsMHg2NDI5LDB4NjQyQiwweDY0MkUsMHg2NDJGLDB4NjQzMCwvKiAweDgwLTB4ODcgKi8KKwkweDY0MzEsMHg2NDMyLDB4NjQzMywweDY0MzUsMHg2NDM2LDB4NjQzNywweDY0MzgsMHg2NDM5LC8qIDB4ODgtMHg4RiAqLworCTB4NjQzQiwweDY0M0MsMHg2NDNFLDB4NjQ0MCwweDY0NDIsMHg2NDQzLDB4NjQ0OSwweDY0NEIsLyogMHg5MC0weDk3ICovCisJMHg2NDRDLDB4NjQ0RCwweDY0NEUsMHg2NDRGLDB4NjQ1MCwweDY0NTEsMHg2NDUzLDB4NjQ1NSwvKiAweDk4LTB4OUYgKi8KKwkweDY0NTYsMHg2NDU3LDB4NjQ1OSwweDY0NUEsMHg2NDVCLDB4NjQ1QywweDY0NUQsMHg2NDVGLC8qIDB4QTAtMHhBNyAqLworCTB4NjQ2MCwweDY0NjEsMHg2NDYyLDB4NjQ2MywweDY0NjQsMHg2NDY1LDB4NjQ2NiwweDY0NjgsLyogMHhBOC0weEFGICovCisJMHg2NDZBLDB4NjQ2QiwweDY0NkMsMHg2NDZFLDB4NjQ2RiwweDY0NzAsMHg2NDcxLDB4NjQ3MiwvKiAweEIwLTB4QjcgKi8KKwkweDY0NzMsMHg2NDc0LDB4NjQ3NSwweDY0NzYsMHg2NDc3LDB4NjQ3QiwweDY0N0MsMHg2NDdELC8qIDB4QjgtMHhCRiAqLworCTB4NjQ3RSwweDY0N0YsMHg2NDgwLDB4NjQ4MSwweDY0ODMsMHg2NDg2LDB4NjQ4OCwweDY0ODksLyogMHhDMC0weEM3ICovCisJMHg2NDhBLDB4NjQ4QiwweDY0OEMsMHg2NDhELDB4NjQ4RSwweDY0OEYsMHg2NDkwLDB4NjQ5MywvKiAweEM4LTB4Q0YgKi8KKwkweDY0OTQsMHg2NDk3LDB4NjQ5OCwweDY0OUEsMHg2NDlCLDB4NjQ5QywweDY0OUQsMHg2NDlGLC8qIDB4RDAtMHhENyAqLworCTB4NjRBMCwweDY0QTEsMHg2NEEyLDB4NjRBMywweDY0QTUsMHg2NEE2LDB4NjRBNywweDY0QTgsLyogMHhEOC0weERGICovCisJMHg2NEFBLDB4NjRBQiwweDY0QUYsMHg2NEIxLDB4NjRCMiwweDY0QjMsMHg2NEI0LDB4NjRCNiwvKiAweEUwLTB4RTcgKi8KKwkweDY0QjksMHg2NEJCLDB4NjRCRCwweDY0QkUsMHg2NEJGLDB4NjRDMSwweDY0QzMsMHg2NEM0LC8qIDB4RTgtMHhFRiAqLworCTB4NjRDNiwweDY0QzcsMHg2NEM4LDB4NjRDOSwweDY0Q0EsMHg2NENCLDB4NjRDQywweDY0Q0YsLyogMHhGMC0weEY3ICovCisJMHg2NEQxLDB4NjREMywweDY0RDQsMHg2NEQ1LDB4NjRENiwweDY0RDksMHg2NERBLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV85NFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDY0REIsMHg2NERDLDB4NjRERCwweDY0REYsMHg2NEUwLDB4NjRFMSwweDY0RTMsMHg2NEU1LC8qIDB4NDAtMHg0NyAqLworCTB4NjRFNywweDY0RTgsMHg2NEU5LDB4NjRFQSwweDY0RUIsMHg2NEVDLDB4NjRFRCwweDY0RUUsLyogMHg0OC0weDRGICovCisJMHg2NEVGLDB4NjRGMCwweDY0RjEsMHg2NEYyLDB4NjRGMywweDY0RjQsMHg2NEY1LDB4NjRGNiwvKiAweDUwLTB4NTcgKi8KKwkweDY0RjcsMHg2NEY4LDB4NjRGOSwweDY0RkEsMHg2NEZCLDB4NjRGQywweDY0RkQsMHg2NEZFLC8qIDB4NTgtMHg1RiAqLworCTB4NjRGRiwweDY1MDEsMHg2NTAyLDB4NjUwMywweDY1MDQsMHg2NTA1LDB4NjUwNiwweDY1MDcsLyogMHg2MC0weDY3ICovCisJMHg2NTA4LDB4NjUwQSwweDY1MEIsMHg2NTBDLDB4NjUwRCwweDY1MEUsMHg2NTBGLDB4NjUxMCwvKiAweDY4LTB4NkYgKi8KKwkweDY1MTEsMHg2NTEzLDB4NjUxNCwweDY1MTUsMHg2NTE2LDB4NjUxNywweDY1MTksMHg2NTFBLC8qIDB4NzAtMHg3NyAqLworCTB4NjUxQiwweDY1MUMsMHg2NTFELDB4NjUxRSwweDY1MUYsMHg2NTIwLDB4NjUyMSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDY1MjIsMHg2NTIzLDB4NjUyNCwweDY1MjYsMHg2NTI3LDB4NjUyOCwweDY1MjksMHg2NTJBLC8qIDB4ODAtMHg4NyAqLworCTB4NjUyQywweDY1MkQsMHg2NTMwLDB4NjUzMSwweDY1MzIsMHg2NTMzLDB4NjUzNywweDY1M0EsLyogMHg4OC0weDhGICovCisJMHg2NTNDLDB4NjUzRCwweDY1NDAsMHg2NTQxLDB4NjU0MiwweDY1NDMsMHg2NTQ0LDB4NjU0NiwvKiAweDkwLTB4OTcgKi8KKwkweDY1NDcsMHg2NTRBLDB4NjU0QiwweDY1NEQsMHg2NTRFLDB4NjU1MCwweDY1NTIsMHg2NTUzLC8qIDB4OTgtMHg5RiAqLworCTB4NjU1NCwweDY1NTcsMHg2NTU4LDB4NjU1QSwweDY1NUMsMHg2NTVGLDB4NjU2MCwweDY1NjEsLyogMHhBMC0weEE3ICovCisJMHg2NTY0LDB4NjU2NSwweDY1NjcsMHg2NTY4LDB4NjU2OSwweDY1NkEsMHg2NTZELDB4NjU2RSwvKiAweEE4LTB4QUYgKi8KKwkweDY1NkYsMHg2NTcxLDB4NjU3MywweDY1NzUsMHg2NTc2LDB4NjU3OCwweDY1NzksMHg2NTdBLC8qIDB4QjAtMHhCNyAqLworCTB4NjU3QiwweDY1N0MsMHg2NTdELDB4NjU3RSwweDY1N0YsMHg2NTgwLDB4NjU4MSwweDY1ODIsLyogMHhCOC0weEJGICovCisJMHg2NTgzLDB4NjU4NCwweDY1ODUsMHg2NTg2LDB4NjU4OCwweDY1ODksMHg2NThBLDB4NjU4RCwvKiAweEMwLTB4QzcgKi8KKwkweDY1OEUsMHg2NThGLDB4NjU5MiwweDY1OTQsMHg2NTk1LDB4NjU5NiwweDY1OTgsMHg2NTlBLC8qIDB4QzgtMHhDRiAqLworCTB4NjU5RCwweDY1OUUsMHg2NUEwLDB4NjVBMiwweDY1QTMsMHg2NUE2LDB4NjVBOCwweDY1QUEsLyogMHhEMC0weEQ3ICovCisJMHg2NUFDLDB4NjVBRSwweDY1QjEsMHg2NUIyLDB4NjVCMywweDY1QjQsMHg2NUI1LDB4NjVCNiwvKiAweEQ4LTB4REYgKi8KKwkweDY1QjcsMHg2NUI4LDB4NjVCQSwweDY1QkIsMHg2NUJFLDB4NjVCRiwweDY1QzAsMHg2NUMyLC8qIDB4RTAtMHhFNyAqLworCTB4NjVDNywweDY1QzgsMHg2NUM5LDB4NjVDQSwweDY1Q0QsMHg2NUQwLDB4NjVEMSwweDY1RDMsLyogMHhFOC0weEVGICovCisJMHg2NUQ0LDB4NjVENSwweDY1RDgsMHg2NUQ5LDB4NjVEQSwweDY1REIsMHg2NURDLDB4NjVERCwvKiAweEYwLTB4RjcgKi8KKwkweDY1REUsMHg2NURGLDB4NjVFMSwweDY1RTMsMHg2NUU0LDB4NjVFQSwweDY1RUIsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1Xzk1WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NjVGMiwweDY1RjMsMHg2NUY0LDB4NjVGNSwweDY1RjgsMHg2NUY5LDB4NjVGQiwweDY1RkMsLyogMHg0MC0weDQ3ICovCisJMHg2NUZELDB4NjVGRSwweDY1RkYsMHg2NjAxLDB4NjYwNCwweDY2MDUsMHg2NjA3LDB4NjYwOCwvKiAweDQ4LTB4NEYgKi8KKwkweDY2MDksMHg2NjBCLDB4NjYwRCwweDY2MTAsMHg2NjExLDB4NjYxMiwweDY2MTYsMHg2NjE3LC8qIDB4NTAtMHg1NyAqLworCTB4NjYxOCwweDY2MUEsMHg2NjFCLDB4NjYxQywweDY2MUUsMHg2NjIxLDB4NjYyMiwweDY2MjMsLyogMHg1OC0weDVGICovCisJMHg2NjI0LDB4NjYyNiwweDY2MjksMHg2NjJBLDB4NjYyQiwweDY2MkMsMHg2NjJFLDB4NjYzMCwvKiAweDYwLTB4NjcgKi8KKwkweDY2MzIsMHg2NjMzLDB4NjYzNywweDY2MzgsMHg2NjM5LDB4NjYzQSwweDY2M0IsMHg2NjNELC8qIDB4NjgtMHg2RiAqLworCTB4NjYzRiwweDY2NDAsMHg2NjQyLDB4NjY0NCwweDY2NDUsMHg2NjQ2LDB4NjY0NywweDY2NDgsLyogMHg3MC0weDc3ICovCisJMHg2NjQ5LDB4NjY0QSwweDY2NEQsMHg2NjRFLDB4NjY1MCwweDY2NTEsMHg2NjU4LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NjY1OSwweDY2NUIsMHg2NjVDLDB4NjY1RCwweDY2NUUsMHg2NjYwLDB4NjY2MiwweDY2NjMsLyogMHg4MC0weDg3ICovCisJMHg2NjY1LDB4NjY2NywweDY2NjksMHg2NjZBLDB4NjY2QiwweDY2NkMsMHg2NjZELDB4NjY3MSwvKiAweDg4LTB4OEYgKi8KKwkweDY2NzIsMHg2NjczLDB4NjY3NSwweDY2NzgsMHg2Njc5LDB4NjY3QiwweDY2N0MsMHg2NjdELC8qIDB4OTAtMHg5NyAqLworCTB4NjY3RiwweDY2ODAsMHg2NjgxLDB4NjY4MywweDY2ODUsMHg2Njg2LDB4NjY4OCwweDY2ODksLyogMHg5OC0weDlGICovCisJMHg2NjhBLDB4NjY4QiwweDY2OEQsMHg2NjhFLDB4NjY4RiwweDY2OTAsMHg2NjkyLDB4NjY5MywvKiAweEEwLTB4QTcgKi8KKwkweDY2OTQsMHg2Njk1LDB4NjY5OCwweDY2OTksMHg2NjlBLDB4NjY5QiwweDY2OUMsMHg2NjlFLC8qIDB4QTgtMHhBRiAqLworCTB4NjY5RiwweDY2QTAsMHg2NkExLDB4NjZBMiwweDY2QTMsMHg2NkE0LDB4NjZBNSwweDY2QTYsLyogMHhCMC0weEI3ICovCisJMHg2NkE5LDB4NjZBQSwweDY2QUIsMHg2NkFDLDB4NjZBRCwweDY2QUYsMHg2NkIwLDB4NjZCMSwvKiAweEI4LTB4QkYgKi8KKwkweDY2QjIsMHg2NkIzLDB4NjZCNSwweDY2QjYsMHg2NkI3LDB4NjZCOCwweDY2QkEsMHg2NkJCLC8qIDB4QzAtMHhDNyAqLworCTB4NjZCQywweDY2QkQsMHg2NkJGLDB4NjZDMCwweDY2QzEsMHg2NkMyLDB4NjZDMywweDY2QzQsLyogMHhDOC0weENGICovCisJMHg2NkM1LDB4NjZDNiwweDY2QzcsMHg2NkM4LDB4NjZDOSwweDY2Q0EsMHg2NkNCLDB4NjZDQywvKiAweEQwLTB4RDcgKi8KKwkweDY2Q0QsMHg2NkNFLDB4NjZDRiwweDY2RDAsMHg2NkQxLDB4NjZEMiwweDY2RDMsMHg2NkQ0LC8qIDB4RDgtMHhERiAqLworCTB4NjZENSwweDY2RDYsMHg2NkQ3LDB4NjZEOCwweDY2REEsMHg2NkRFLDB4NjZERiwweDY2RTAsLyogMHhFMC0weEU3ICovCisJMHg2NkUxLDB4NjZFMiwweDY2RTMsMHg2NkU0LDB4NjZFNSwweDY2RTcsMHg2NkU4LDB4NjZFQSwvKiAweEU4LTB4RUYgKi8KKwkweDY2RUIsMHg2NkVDLDB4NjZFRCwweDY2RUUsMHg2NkVGLDB4NjZGMSwweDY2RjUsMHg2NkY2LC8qIDB4RjAtMHhGNyAqLworCTB4NjZGOCwweDY2RkEsMHg2NkZCLDB4NjZGRCwweDY3MDEsMHg2NzAyLDB4NjcwMywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOTZbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg2NzA0LDB4NjcwNSwweDY3MDYsMHg2NzA3LDB4NjcwQywweDY3MEUsMHg2NzBGLDB4NjcxMSwvKiAweDQwLTB4NDcgKi8KKwkweDY3MTIsMHg2NzEzLDB4NjcxNiwweDY3MTgsMHg2NzE5LDB4NjcxQSwweDY3MUMsMHg2NzFFLC8qIDB4NDgtMHg0RiAqLworCTB4NjcyMCwweDY3MjEsMHg2NzIyLDB4NjcyMywweDY3MjQsMHg2NzI1LDB4NjcyNywweDY3MjksLyogMHg1MC0weDU3ICovCisJMHg2NzJFLDB4NjczMCwweDY3MzIsMHg2NzMzLDB4NjczNiwweDY3MzcsMHg2NzM4LDB4NjczOSwvKiAweDU4LTB4NUYgKi8KKwkweDY3M0IsMHg2NzNDLDB4NjczRSwweDY3M0YsMHg2NzQxLDB4Njc0NCwweDY3NDUsMHg2NzQ3LC8qIDB4NjAtMHg2NyAqLworCTB4Njc0QSwweDY3NEIsMHg2NzRELDB4Njc1MiwweDY3NTQsMHg2NzU1LDB4Njc1NywweDY3NTgsLyogMHg2OC0weDZGICovCisJMHg2NzU5LDB4Njc1QSwweDY3NUIsMHg2NzVELDB4Njc2MiwweDY3NjMsMHg2NzY0LDB4Njc2NiwvKiAweDcwLTB4NzcgKi8KKwkweDY3NjcsMHg2NzZCLDB4Njc2QywweDY3NkUsMHg2NzcxLDB4Njc3NCwweDY3NzYsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg2Nzc4LDB4Njc3OSwweDY3N0EsMHg2NzdCLDB4Njc3RCwweDY3ODAsMHg2NzgyLDB4Njc4MywvKiAweDgwLTB4ODcgKi8KKwkweDY3ODUsMHg2Nzg2LDB4Njc4OCwweDY3OEEsMHg2NzhDLDB4Njc4RCwweDY3OEUsMHg2NzhGLC8qIDB4ODgtMHg4RiAqLworCTB4Njc5MSwweDY3OTIsMHg2NzkzLDB4Njc5NCwweDY3OTYsMHg2Nzk5LDB4Njc5QiwweDY3OUYsLyogMHg5MC0weDk3ICovCisJMHg2N0EwLDB4NjdBMSwweDY3QTQsMHg2N0E2LDB4NjdBOSwweDY3QUMsMHg2N0FFLDB4NjdCMSwvKiAweDk4LTB4OUYgKi8KKwkweDY3QjIsMHg2N0I0LDB4NjdCOSwweDY3QkEsMHg2N0JCLDB4NjdCQywweDY3QkQsMHg2N0JFLC8qIDB4QTAtMHhBNyAqLworCTB4NjdCRiwweDY3QzAsMHg2N0MyLDB4NjdDNSwweDY3QzYsMHg2N0M3LDB4NjdDOCwweDY3QzksLyogMHhBOC0weEFGICovCisJMHg2N0NBLDB4NjdDQiwweDY3Q0MsMHg2N0NELDB4NjdDRSwweDY3RDUsMHg2N0Q2LDB4NjdENywvKiAweEIwLTB4QjcgKi8KKwkweDY3REIsMHg2N0RGLDB4NjdFMSwweDY3RTMsMHg2N0U0LDB4NjdFNiwweDY3RTcsMHg2N0U4LC8qIDB4QjgtMHhCRiAqLworCTB4NjdFQSwweDY3RUIsMHg2N0VELDB4NjdFRSwweDY3RjIsMHg2N0Y1LDB4NjdGNiwweDY3RjcsLyogMHhDMC0weEM3ICovCisJMHg2N0Y4LDB4NjdGOSwweDY3RkEsMHg2N0ZCLDB4NjdGQywweDY3RkUsMHg2ODAxLDB4NjgwMiwvKiAweEM4LTB4Q0YgKi8KKwkweDY4MDMsMHg2ODA0LDB4NjgwNiwweDY4MEQsMHg2ODEwLDB4NjgxMiwweDY4MTQsMHg2ODE1LC8qIDB4RDAtMHhENyAqLworCTB4NjgxOCwweDY4MTksMHg2ODFBLDB4NjgxQiwweDY4MUMsMHg2ODFFLDB4NjgxRiwweDY4MjAsLyogMHhEOC0weERGICovCisJMHg2ODIyLDB4NjgyMywweDY4MjQsMHg2ODI1LDB4NjgyNiwweDY4MjcsMHg2ODI4LDB4NjgyQiwvKiAweEUwLTB4RTcgKi8KKwkweDY4MkMsMHg2ODJELDB4NjgyRSwweDY4MkYsMHg2ODMwLDB4NjgzMSwweDY4MzQsMHg2ODM1LC8qIDB4RTgtMHhFRiAqLworCTB4NjgzNiwweDY4M0EsMHg2ODNCLDB4NjgzRiwweDY4NDcsMHg2ODRCLDB4Njg0RCwweDY4NEYsLyogMHhGMC0weEY3ICovCisJMHg2ODUyLDB4Njg1NiwweDY4NTcsMHg2ODU4LDB4Njg1OSwweDY4NUEsMHg2ODVCLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV85N1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDY4NUMsMHg2ODVELDB4Njg1RSwweDY4NUYsMHg2ODZBLDB4Njg2QywweDY4NkQsMHg2ODZFLC8qIDB4NDAtMHg0NyAqLworCTB4Njg2RiwweDY4NzAsMHg2ODcxLDB4Njg3MiwweDY4NzMsMHg2ODc1LDB4Njg3OCwweDY4NzksLyogMHg0OC0weDRGICovCisJMHg2ODdBLDB4Njg3QiwweDY4N0MsMHg2ODdELDB4Njg3RSwweDY4N0YsMHg2ODgwLDB4Njg4MiwvKiAweDUwLTB4NTcgKi8KKwkweDY4ODQsMHg2ODg3LDB4Njg4OCwweDY4ODksMHg2ODhBLDB4Njg4QiwweDY4OEMsMHg2ODhELC8qIDB4NTgtMHg1RiAqLworCTB4Njg4RSwweDY4OTAsMHg2ODkxLDB4Njg5MiwweDY4OTQsMHg2ODk1LDB4Njg5NiwweDY4OTgsLyogMHg2MC0weDY3ICovCisJMHg2ODk5LDB4Njg5QSwweDY4OUIsMHg2ODlDLDB4Njg5RCwweDY4OUUsMHg2ODlGLDB4NjhBMCwvKiAweDY4LTB4NkYgKi8KKwkweDY4QTEsMHg2OEEzLDB4NjhBNCwweDY4QTUsMHg2OEE5LDB4NjhBQSwweDY4QUIsMHg2OEFDLC8qIDB4NzAtMHg3NyAqLworCTB4NjhBRSwweDY4QjEsMHg2OEIyLDB4NjhCNCwweDY4QjYsMHg2OEI3LDB4NjhCOCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDY4QjksMHg2OEJBLDB4NjhCQiwweDY4QkMsMHg2OEJELDB4NjhCRSwweDY4QkYsMHg2OEMxLC8qIDB4ODAtMHg4NyAqLworCTB4NjhDMywweDY4QzQsMHg2OEM1LDB4NjhDNiwweDY4QzcsMHg2OEM4LDB4NjhDQSwweDY4Q0MsLyogMHg4OC0weDhGICovCisJMHg2OENFLDB4NjhDRiwweDY4RDAsMHg2OEQxLDB4NjhEMywweDY4RDQsMHg2OEQ2LDB4NjhENywvKiAweDkwLTB4OTcgKi8KKwkweDY4RDksMHg2OERCLDB4NjhEQywweDY4REQsMHg2OERFLDB4NjhERiwweDY4RTEsMHg2OEUyLC8qIDB4OTgtMHg5RiAqLworCTB4NjhFNCwweDY4RTUsMHg2OEU2LDB4NjhFNywweDY4RTgsMHg2OEU5LDB4NjhFQSwweDY4RUIsLyogMHhBMC0weEE3ICovCisJMHg2OEVDLDB4NjhFRCwweDY4RUYsMHg2OEYyLDB4NjhGMywweDY4RjQsMHg2OEY2LDB4NjhGNywvKiAweEE4LTB4QUYgKi8KKwkweDY4RjgsMHg2OEZCLDB4NjhGRCwweDY4RkUsMHg2OEZGLDB4NjkwMCwweDY5MDIsMHg2OTAzLC8qIDB4QjAtMHhCNyAqLworCTB4NjkwNCwweDY5MDYsMHg2OTA3LDB4NjkwOCwweDY5MDksMHg2OTBBLDB4NjkwQywweDY5MEYsLyogMHhCOC0weEJGICovCisJMHg2OTExLDB4NjkxMywweDY5MTQsMHg2OTE1LDB4NjkxNiwweDY5MTcsMHg2OTE4LDB4NjkxOSwvKiAweEMwLTB4QzcgKi8KKwkweDY5MUEsMHg2OTFCLDB4NjkxQywweDY5MUQsMHg2OTFFLDB4NjkyMSwweDY5MjIsMHg2OTIzLC8qIDB4QzgtMHhDRiAqLworCTB4NjkyNSwweDY5MjYsMHg2OTI3LDB4NjkyOCwweDY5MjksMHg2OTJBLDB4NjkyQiwweDY5MkMsLyogMHhEMC0weEQ3ICovCisJMHg2OTJFLDB4NjkyRiwweDY5MzEsMHg2OTMyLDB4NjkzMywweDY5MzUsMHg2OTM2LDB4NjkzNywvKiAweEQ4LTB4REYgKi8KKwkweDY5MzgsMHg2OTNBLDB4NjkzQiwweDY5M0MsMHg2OTNFLDB4Njk0MCwweDY5NDEsMHg2OTQzLC8qIDB4RTAtMHhFNyAqLworCTB4Njk0NCwweDY5NDUsMHg2OTQ2LDB4Njk0NywweDY5NDgsMHg2OTQ5LDB4Njk0QSwweDY5NEIsLyogMHhFOC0weEVGICovCisJMHg2OTRDLDB4Njk0RCwweDY5NEUsMHg2OTRGLDB4Njk1MCwweDY5NTEsMHg2OTUyLDB4Njk1MywvKiAweEYwLTB4RjcgKi8KKwkweDY5NTUsMHg2OTU2LDB4Njk1OCwweDY5NTksMHg2OTVCLDB4Njk1QywweDY5NUYsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1Xzk4WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4Njk2MSwweDY5NjIsMHg2OTY0LDB4Njk2NSwweDY5NjcsMHg2OTY4LDB4Njk2OSwweDY5NkEsLyogMHg0MC0weDQ3ICovCisJMHg2OTZDLDB4Njk2RCwweDY5NkYsMHg2OTcwLDB4Njk3MiwweDY5NzMsMHg2OTc0LDB4Njk3NSwvKiAweDQ4LTB4NEYgKi8KKwkweDY5NzYsMHg2OTdBLDB4Njk3QiwweDY5N0QsMHg2OTdFLDB4Njk3RiwweDY5ODEsMHg2OTgzLC8qIDB4NTAtMHg1NyAqLworCTB4Njk4NSwweDY5OEEsMHg2OThCLDB4Njk4QywweDY5OEUsMHg2OThGLDB4Njk5MCwweDY5OTEsLyogMHg1OC0weDVGICovCisJMHg2OTkyLDB4Njk5MywweDY5OTYsMHg2OTk3LDB4Njk5OSwweDY5OUEsMHg2OTlELDB4Njk5RSwvKiAweDYwLTB4NjcgKi8KKwkweDY5OUYsMHg2OUEwLDB4NjlBMSwweDY5QTIsMHg2OUEzLDB4NjlBNCwweDY5QTUsMHg2OUE2LC8qIDB4NjgtMHg2RiAqLworCTB4NjlBOSwweDY5QUEsMHg2OUFDLDB4NjlBRSwweDY5QUYsMHg2OUIwLDB4NjlCMiwweDY5QjMsLyogMHg3MC0weDc3ICovCisJMHg2OUI1LDB4NjlCNiwweDY5QjgsMHg2OUI5LDB4NjlCQSwweDY5QkMsMHg2OUJELDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NjlCRSwweDY5QkYsMHg2OUMwLDB4NjlDMiwweDY5QzMsMHg2OUM0LDB4NjlDNSwweDY5QzYsLyogMHg4MC0weDg3ICovCisJMHg2OUM3LDB4NjlDOCwweDY5QzksMHg2OUNCLDB4NjlDRCwweDY5Q0YsMHg2OUQxLDB4NjlEMiwvKiAweDg4LTB4OEYgKi8KKwkweDY5RDMsMHg2OUQ1LDB4NjlENiwweDY5RDcsMHg2OUQ4LDB4NjlEOSwweDY5REEsMHg2OURDLC8qIDB4OTAtMHg5NyAqLworCTB4NjlERCwweDY5REUsMHg2OUUxLDB4NjlFMiwweDY5RTMsMHg2OUU0LDB4NjlFNSwweDY5RTYsLyogMHg5OC0weDlGICovCisJMHg2OUU3LDB4NjlFOCwweDY5RTksMHg2OUVBLDB4NjlFQiwweDY5RUMsMHg2OUVFLDB4NjlFRiwvKiAweEEwLTB4QTcgKi8KKwkweDY5RjAsMHg2OUYxLDB4NjlGMywweDY5RjQsMHg2OUY1LDB4NjlGNiwweDY5RjcsMHg2OUY4LC8qIDB4QTgtMHhBRiAqLworCTB4NjlGOSwweDY5RkEsMHg2OUZCLDB4NjlGQywweDY5RkUsMHg2QTAwLDB4NkEwMSwweDZBMDIsLyogMHhCMC0weEI3ICovCisJMHg2QTAzLDB4NkEwNCwweDZBMDUsMHg2QTA2LDB4NkEwNywweDZBMDgsMHg2QTA5LDB4NkEwQiwvKiAweEI4LTB4QkYgKi8KKwkweDZBMEMsMHg2QTBELDB4NkEwRSwweDZBMEYsMHg2QTEwLDB4NkExMSwweDZBMTIsMHg2QTEzLC8qIDB4QzAtMHhDNyAqLworCTB4NkExNCwweDZBMTUsMHg2QTE2LDB4NkExOSwweDZBMUEsMHg2QTFCLDB4NkExQywweDZBMUQsLyogMHhDOC0weENGICovCisJMHg2QTFFLDB4NkEyMCwweDZBMjIsMHg2QTIzLDB4NkEyNCwweDZBMjUsMHg2QTI2LDB4NkEyNywvKiAweEQwLTB4RDcgKi8KKwkweDZBMjksMHg2QTJCLDB4NkEyQywweDZBMkQsMHg2QTJFLDB4NkEzMCwweDZBMzIsMHg2QTMzLC8qIDB4RDgtMHhERiAqLworCTB4NkEzNCwweDZBMzYsMHg2QTM3LDB4NkEzOCwweDZBMzksMHg2QTNBLDB4NkEzQiwweDZBM0MsLyogMHhFMC0weEU3ICovCisJMHg2QTNGLDB4NkE0MCwweDZBNDEsMHg2QTQyLDB4NkE0MywweDZBNDUsMHg2QTQ2LDB4NkE0OCwvKiAweEU4LTB4RUYgKi8KKwkweDZBNDksMHg2QTRBLDB4NkE0QiwweDZBNEMsMHg2QTRELDB4NkE0RSwweDZBNEYsMHg2QTUxLC8qIDB4RjAtMHhGNyAqLworCTB4NkE1MiwweDZBNTMsMHg2QTU0LDB4NkE1NSwweDZBNTYsMHg2QTU3LDB4NkE1QSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOTlbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg2QTVDLDB4NkE1RCwweDZBNUUsMHg2QTVGLDB4NkE2MCwweDZBNjIsMHg2QTYzLDB4NkE2NCwvKiAweDQwLTB4NDcgKi8KKwkweDZBNjYsMHg2QTY3LDB4NkE2OCwweDZBNjksMHg2QTZBLDB4NkE2QiwweDZBNkMsMHg2QTZELC8qIDB4NDgtMHg0RiAqLworCTB4NkE2RSwweDZBNkYsMHg2QTcwLDB4NkE3MiwweDZBNzMsMHg2QTc0LDB4NkE3NSwweDZBNzYsLyogMHg1MC0weDU3ICovCisJMHg2QTc3LDB4NkE3OCwweDZBN0EsMHg2QTdCLDB4NkE3RCwweDZBN0UsMHg2QTdGLDB4NkE4MSwvKiAweDU4LTB4NUYgKi8KKwkweDZBODIsMHg2QTgzLDB4NkE4NSwweDZBODYsMHg2QTg3LDB4NkE4OCwweDZBODksMHg2QThBLC8qIDB4NjAtMHg2NyAqLworCTB4NkE4QiwweDZBOEMsMHg2QThELDB4NkE4RiwweDZBOTIsMHg2QTkzLDB4NkE5NCwweDZBOTUsLyogMHg2OC0weDZGICovCisJMHg2QTk2LDB4NkE5OCwweDZBOTksMHg2QTlBLDB4NkE5QiwweDZBOUMsMHg2QTlELDB4NkE5RSwvKiAweDcwLTB4NzcgKi8KKwkweDZBOUYsMHg2QUExLDB4NkFBMiwweDZBQTMsMHg2QUE0LDB4NkFBNSwweDZBQTYsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg2QUE3LDB4NkFBOCwweDZBQUEsMHg2QUFELDB4NkFBRSwweDZBQUYsMHg2QUIwLDB4NkFCMSwvKiAweDgwLTB4ODcgKi8KKwkweDZBQjIsMHg2QUIzLDB4NkFCNCwweDZBQjUsMHg2QUI2LDB4NkFCNywweDZBQjgsMHg2QUI5LC8qIDB4ODgtMHg4RiAqLworCTB4NkFCQSwweDZBQkIsMHg2QUJDLDB4NkFCRCwweDZBQkUsMHg2QUJGLDB4NkFDMCwweDZBQzEsLyogMHg5MC0weDk3ICovCisJMHg2QUMyLDB4NkFDMywweDZBQzQsMHg2QUM1LDB4NkFDNiwweDZBQzcsMHg2QUM4LDB4NkFDOSwvKiAweDk4LTB4OUYgKi8KKwkweDZBQ0EsMHg2QUNCLDB4NkFDQywweDZBQ0QsMHg2QUNFLDB4NkFDRiwweDZBRDAsMHg2QUQxLC8qIDB4QTAtMHhBNyAqLworCTB4NkFEMiwweDZBRDMsMHg2QUQ0LDB4NkFENSwweDZBRDYsMHg2QUQ3LDB4NkFEOCwweDZBRDksLyogMHhBOC0weEFGICovCisJMHg2QURBLDB4NkFEQiwweDZBREMsMHg2QURELDB4NkFERSwweDZBREYsMHg2QUUwLDB4NkFFMSwvKiAweEIwLTB4QjcgKi8KKwkweDZBRTIsMHg2QUUzLDB4NkFFNCwweDZBRTUsMHg2QUU2LDB4NkFFNywweDZBRTgsMHg2QUU5LC8qIDB4QjgtMHhCRiAqLworCTB4NkFFQSwweDZBRUIsMHg2QUVDLDB4NkFFRCwweDZBRUUsMHg2QUVGLDB4NkFGMCwweDZBRjEsLyogMHhDMC0weEM3ICovCisJMHg2QUYyLDB4NkFGMywweDZBRjQsMHg2QUY1LDB4NkFGNiwweDZBRjcsMHg2QUY4LDB4NkFGOSwvKiAweEM4LTB4Q0YgKi8KKwkweDZBRkEsMHg2QUZCLDB4NkFGQywweDZBRkQsMHg2QUZFLDB4NkFGRiwweDZCMDAsMHg2QjAxLC8qIDB4RDAtMHhENyAqLworCTB4NkIwMiwweDZCMDMsMHg2QjA0LDB4NkIwNSwweDZCMDYsMHg2QjA3LDB4NkIwOCwweDZCMDksLyogMHhEOC0weERGICovCisJMHg2QjBBLDB4NkIwQiwweDZCMEMsMHg2QjBELDB4NkIwRSwweDZCMEYsMHg2QjEwLDB4NkIxMSwvKiAweEUwLTB4RTcgKi8KKwkweDZCMTIsMHg2QjEzLDB4NkIxNCwweDZCMTUsMHg2QjE2LDB4NkIxNywweDZCMTgsMHg2QjE5LC8qIDB4RTgtMHhFRiAqLworCTB4NkIxQSwweDZCMUIsMHg2QjFDLDB4NkIxRCwweDZCMUUsMHg2QjFGLDB4NkIyNSwweDZCMjYsLyogMHhGMC0weEY3ICovCisJMHg2QjI4LDB4NkIyOSwweDZCMkEsMHg2QjJCLDB4NkIyQywweDZCMkQsMHg2QjJFLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV85QVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDZCMkYsMHg2QjMwLDB4NkIzMSwweDZCMzMsMHg2QjM0LDB4NkIzNSwweDZCMzYsMHg2QjM4LC8qIDB4NDAtMHg0NyAqLworCTB4NkIzQiwweDZCM0MsMHg2QjNELDB4NkIzRiwweDZCNDAsMHg2QjQxLDB4NkI0MiwweDZCNDQsLyogMHg0OC0weDRGICovCisJMHg2QjQ1LDB4NkI0OCwweDZCNEEsMHg2QjRCLDB4NkI0RCwweDZCNEUsMHg2QjRGLDB4NkI1MCwvKiAweDUwLTB4NTcgKi8KKwkweDZCNTEsMHg2QjUyLDB4NkI1MywweDZCNTQsMHg2QjU1LDB4NkI1NiwweDZCNTcsMHg2QjU4LC8qIDB4NTgtMHg1RiAqLworCTB4NkI1QSwweDZCNUIsMHg2QjVDLDB4NkI1RCwweDZCNUUsMHg2QjVGLDB4NkI2MCwweDZCNjEsLyogMHg2MC0weDY3ICovCisJMHg2QjY4LDB4NkI2OSwweDZCNkIsMHg2QjZDLDB4NkI2RCwweDZCNkUsMHg2QjZGLDB4NkI3MCwvKiAweDY4LTB4NkYgKi8KKwkweDZCNzEsMHg2QjcyLDB4NkI3MywweDZCNzQsMHg2Qjc1LDB4NkI3NiwweDZCNzcsMHg2Qjc4LC8qIDB4NzAtMHg3NyAqLworCTB4NkI3QSwweDZCN0QsMHg2QjdFLDB4NkI3RiwweDZCODAsMHg2Qjg1LDB4NkI4OCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDZCOEMsMHg2QjhFLDB4NkI4RiwweDZCOTAsMHg2QjkxLDB4NkI5NCwweDZCOTUsMHg2Qjk3LC8qIDB4ODAtMHg4NyAqLworCTB4NkI5OCwweDZCOTksMHg2QjlDLDB4NkI5RCwweDZCOUUsMHg2QjlGLDB4NkJBMCwweDZCQTIsLyogMHg4OC0weDhGICovCisJMHg2QkEzLDB4NkJBNCwweDZCQTUsMHg2QkE2LDB4NkJBNywweDZCQTgsMHg2QkE5LDB4NkJBQiwvKiAweDkwLTB4OTcgKi8KKwkweDZCQUMsMHg2QkFELDB4NkJBRSwweDZCQUYsMHg2QkIwLDB4NkJCMSwweDZCQjIsMHg2QkI2LC8qIDB4OTgtMHg5RiAqLworCTB4NkJCOCwweDZCQjksMHg2QkJBLDB4NkJCQiwweDZCQkMsMHg2QkJELDB4NkJCRSwweDZCQzAsLyogMHhBMC0weEE3ICovCisJMHg2QkMzLDB4NkJDNCwweDZCQzYsMHg2QkM3LDB4NkJDOCwweDZCQzksMHg2QkNBLDB4NkJDQywvKiAweEE4LTB4QUYgKi8KKwkweDZCQ0UsMHg2QkQwLDB4NkJEMSwweDZCRDgsMHg2QkRBLDB4NkJEQywweDZCREQsMHg2QkRFLC8qIDB4QjAtMHhCNyAqLworCTB4NkJERiwweDZCRTAsMHg2QkUyLDB4NkJFMywweDZCRTQsMHg2QkU1LDB4NkJFNiwweDZCRTcsLyogMHhCOC0weEJGICovCisJMHg2QkU4LDB4NkJFOSwweDZCRUMsMHg2QkVELDB4NkJFRSwweDZCRjAsMHg2QkYxLDB4NkJGMiwvKiAweEMwLTB4QzcgKi8KKwkweDZCRjQsMHg2QkY2LDB4NkJGNywweDZCRjgsMHg2QkZBLDB4NkJGQiwweDZCRkMsMHg2QkZFLC8qIDB4QzgtMHhDRiAqLworCTB4NkJGRiwweDZDMDAsMHg2QzAxLDB4NkMwMiwweDZDMDMsMHg2QzA0LDB4NkMwOCwweDZDMDksLyogMHhEMC0weEQ3ICovCisJMHg2QzBBLDB4NkMwQiwweDZDMEMsMHg2QzBFLDB4NkMxMiwweDZDMTcsMHg2QzFDLDB4NkMxRCwvKiAweEQ4LTB4REYgKi8KKwkweDZDMUUsMHg2QzIwLDB4NkMyMywweDZDMjUsMHg2QzJCLDB4NkMyQywweDZDMkQsMHg2QzMxLC8qIDB4RTAtMHhFNyAqLworCTB4NkMzMywweDZDMzYsMHg2QzM3LDB4NkMzOSwweDZDM0EsMHg2QzNCLDB4NkMzQywweDZDM0UsLyogMHhFOC0weEVGICovCisJMHg2QzNGLDB4NkM0MywweDZDNDQsMHg2QzQ1LDB4NkM0OCwweDZDNEIsMHg2QzRDLDB4NkM0RCwvKiAweEYwLTB4RjcgKi8KKwkweDZDNEUsMHg2QzRGLDB4NkM1MSwweDZDNTIsMHg2QzUzLDB4NkM1NiwweDZDNTgsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzlCWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NkM1OSwweDZDNUEsMHg2QzYyLDB4NkM2MywweDZDNjUsMHg2QzY2LDB4NkM2NywweDZDNkIsLyogMHg0MC0weDQ3ICovCisJMHg2QzZDLDB4NkM2RCwweDZDNkUsMHg2QzZGLDB4NkM3MSwweDZDNzMsMHg2Qzc1LDB4NkM3NywvKiAweDQ4LTB4NEYgKi8KKwkweDZDNzgsMHg2QzdBLDB4NkM3QiwweDZDN0MsMHg2QzdGLDB4NkM4MCwweDZDODQsMHg2Qzg3LC8qIDB4NTAtMHg1NyAqLworCTB4NkM4QSwweDZDOEIsMHg2QzhELDB4NkM4RSwweDZDOTEsMHg2QzkyLDB4NkM5NSwweDZDOTYsLyogMHg1OC0weDVGICovCisJMHg2Qzk3LDB4NkM5OCwweDZDOUEsMHg2QzlDLDB4NkM5RCwweDZDOUUsMHg2Q0EwLDB4NkNBMiwvKiAweDYwLTB4NjcgKi8KKwkweDZDQTgsMHg2Q0FDLDB4NkNBRiwweDZDQjAsMHg2Q0I0LDB4NkNCNSwweDZDQjYsMHg2Q0I3LC8qIDB4NjgtMHg2RiAqLworCTB4NkNCQSwweDZDQzAsMHg2Q0MxLDB4NkNDMiwweDZDQzMsMHg2Q0M2LDB4NkNDNywweDZDQzgsLyogMHg3MC0weDc3ICovCisJMHg2Q0NCLDB4NkNDRCwweDZDQ0UsMHg2Q0NGLDB4NkNEMSwweDZDRDIsMHg2Q0Q4LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NkNEOSwweDZDREEsMHg2Q0RDLDB4NkNERCwweDZDREYsMHg2Q0U0LDB4NkNFNiwweDZDRTcsLyogMHg4MC0weDg3ICovCisJMHg2Q0U5LDB4NkNFQywweDZDRUQsMHg2Q0YyLDB4NkNGNCwweDZDRjksMHg2Q0ZGLDB4NkQwMCwvKiAweDg4LTB4OEYgKi8KKwkweDZEMDIsMHg2RDAzLDB4NkQwNSwweDZEMDYsMHg2RDA4LDB4NkQwOSwweDZEMEEsMHg2RDBELC8qIDB4OTAtMHg5NyAqLworCTB4NkQwRiwweDZEMTAsMHg2RDExLDB4NkQxMywweDZEMTQsMHg2RDE1LDB4NkQxNiwweDZEMTgsLyogMHg5OC0weDlGICovCisJMHg2RDFDLDB4NkQxRCwweDZEMUYsMHg2RDIwLDB4NkQyMSwweDZEMjIsMHg2RDIzLDB4NkQyNCwvKiAweEEwLTB4QTcgKi8KKwkweDZEMjYsMHg2RDI4LDB4NkQyOSwweDZEMkMsMHg2RDJELDB4NkQyRiwweDZEMzAsMHg2RDM0LC8qIDB4QTgtMHhBRiAqLworCTB4NkQzNiwweDZEMzcsMHg2RDM4LDB4NkQzQSwweDZEM0YsMHg2RDQwLDB4NkQ0MiwweDZENDQsLyogMHhCMC0weEI3ICovCisJMHg2RDQ5LDB4NkQ0QywweDZENTAsMHg2RDU1LDB4NkQ1NiwweDZENTcsMHg2RDU4LDB4NkQ1QiwvKiAweEI4LTB4QkYgKi8KKwkweDZENUQsMHg2RDVGLDB4NkQ2MSwweDZENjIsMHg2RDY0LDB4NkQ2NSwweDZENjcsMHg2RDY4LC8qIDB4QzAtMHhDNyAqLworCTB4NkQ2QiwweDZENkMsMHg2RDZELDB4NkQ3MCwweDZENzEsMHg2RDcyLDB4NkQ3MywweDZENzUsLyogMHhDOC0weENGICovCisJMHg2RDc2LDB4NkQ3OSwweDZEN0EsMHg2RDdCLDB4NkQ3RCwweDZEN0UsMHg2RDdGLDB4NkQ4MCwvKiAweEQwLTB4RDcgKi8KKwkweDZEODEsMHg2RDgzLDB4NkQ4NCwweDZEODYsMHg2RDg3LDB4NkQ4QSwweDZEOEIsMHg2RDhELC8qIDB4RDgtMHhERiAqLworCTB4NkQ4RiwweDZEOTAsMHg2RDkyLDB4NkQ5NiwweDZEOTcsMHg2RDk4LDB4NkQ5OSwweDZEOUEsLyogMHhFMC0weEU3ICovCisJMHg2RDlDLDB4NkRBMiwweDZEQTUsMHg2REFDLDB4NkRBRCwweDZEQjAsMHg2REIxLDB4NkRCMywvKiAweEU4LTB4RUYgKi8KKwkweDZEQjQsMHg2REI2LDB4NkRCNywweDZEQjksMHg2REJBLDB4NkRCQiwweDZEQkMsMHg2REJELC8qIDB4RjAtMHhGNyAqLworCTB4NkRCRSwweDZEQzEsMHg2REMyLDB4NkRDMywweDZEQzgsMHg2REM5LDB4NkRDQSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOUNbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg2RENELDB4NkRDRSwweDZEQ0YsMHg2REQwLDB4NkREMiwweDZERDMsMHg2REQ0LDB4NkRENSwvKiAweDQwLTB4NDcgKi8KKwkweDZERDcsMHg2RERBLDB4NkREQiwweDZEREMsMHg2RERGLDB4NkRFMiwweDZERTMsMHg2REU1LC8qIDB4NDgtMHg0RiAqLworCTB4NkRFNywweDZERTgsMHg2REU5LDB4NkRFQSwweDZERUQsMHg2REVGLDB4NkRGMCwweDZERjIsLyogMHg1MC0weDU3ICovCisJMHg2REY0LDB4NkRGNSwweDZERjYsMHg2REY4LDB4NkRGQSwweDZERkQsMHg2REZFLDB4NkRGRiwvKiAweDU4LTB4NUYgKi8KKwkweDZFMDAsMHg2RTAxLDB4NkUwMiwweDZFMDMsMHg2RTA0LDB4NkUwNiwweDZFMDcsMHg2RTA4LC8qIDB4NjAtMHg2NyAqLworCTB4NkUwOSwweDZFMEIsMHg2RTBGLDB4NkUxMiwweDZFMTMsMHg2RTE1LDB4NkUxOCwweDZFMTksLyogMHg2OC0weDZGICovCisJMHg2RTFCLDB4NkUxQywweDZFMUUsMHg2RTFGLDB4NkUyMiwweDZFMjYsMHg2RTI3LDB4NkUyOCwvKiAweDcwLTB4NzcgKi8KKwkweDZFMkEsMHg2RTJDLDB4NkUyRSwweDZFMzAsMHg2RTMxLDB4NkUzMywweDZFMzUsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg2RTM2LDB4NkUzNywweDZFMzksMHg2RTNCLDB4NkUzQywweDZFM0QsMHg2RTNFLDB4NkUzRiwvKiAweDgwLTB4ODcgKi8KKwkweDZFNDAsMHg2RTQxLDB4NkU0MiwweDZFNDUsMHg2RTQ2LDB4NkU0NywweDZFNDgsMHg2RTQ5LC8qIDB4ODgtMHg4RiAqLworCTB4NkU0QSwweDZFNEIsMHg2RTRDLDB4NkU0RiwweDZFNTAsMHg2RTUxLDB4NkU1MiwweDZFNTUsLyogMHg5MC0weDk3ICovCisJMHg2RTU3LDB4NkU1OSwweDZFNUEsMHg2RTVDLDB4NkU1RCwweDZFNUUsMHg2RTYwLDB4NkU2MSwvKiAweDk4LTB4OUYgKi8KKwkweDZFNjIsMHg2RTYzLDB4NkU2NCwweDZFNjUsMHg2RTY2LDB4NkU2NywweDZFNjgsMHg2RTY5LC8qIDB4QTAtMHhBNyAqLworCTB4NkU2QSwweDZFNkMsMHg2RTZELDB4NkU2RiwweDZFNzAsMHg2RTcxLDB4NkU3MiwweDZFNzMsLyogMHhBOC0weEFGICovCisJMHg2RTc0LDB4NkU3NSwweDZFNzYsMHg2RTc3LDB4NkU3OCwweDZFNzksMHg2RTdBLDB4NkU3QiwvKiAweEIwLTB4QjcgKi8KKwkweDZFN0MsMHg2RTdELDB4NkU4MCwweDZFODEsMHg2RTgyLDB4NkU4NCwweDZFODcsMHg2RTg4LC8qIDB4QjgtMHhCRiAqLworCTB4NkU4QSwweDZFOEIsMHg2RThDLDB4NkU4RCwweDZFOEUsMHg2RTkxLDB4NkU5MiwweDZFOTMsLyogMHhDMC0weEM3ICovCisJMHg2RTk0LDB4NkU5NSwweDZFOTYsMHg2RTk3LDB4NkU5OSwweDZFOUEsMHg2RTlCLDB4NkU5RCwvKiAweEM4LTB4Q0YgKi8KKwkweDZFOUUsMHg2RUEwLDB4NkVBMSwweDZFQTMsMHg2RUE0LDB4NkVBNiwweDZFQTgsMHg2RUE5LC8qIDB4RDAtMHhENyAqLworCTB4NkVBQiwweDZFQUMsMHg2RUFELDB4NkVBRSwweDZFQjAsMHg2RUIzLDB4NkVCNSwweDZFQjgsLyogMHhEOC0weERGICovCisJMHg2RUI5LDB4NkVCQywweDZFQkUsMHg2RUJGLDB4NkVDMCwweDZFQzMsMHg2RUM0LDB4NkVDNSwvKiAweEUwLTB4RTcgKi8KKwkweDZFQzYsMHg2RUM4LDB4NkVDOSwweDZFQ0EsMHg2RUNDLDB4NkVDRCwweDZFQ0UsMHg2RUQwLC8qIDB4RTgtMHhFRiAqLworCTB4NkVEMiwweDZFRDYsMHg2RUQ4LDB4NkVEOSwweDZFREIsMHg2RURDLDB4NkVERCwweDZFRTMsLyogMHhGMC0weEY3ICovCisJMHg2RUU3LDB4NkVFQSwweDZFRUIsMHg2RUVDLDB4NkVFRCwweDZFRUUsMHg2RUVGLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV85RFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDZFRjAsMHg2RUYxLDB4NkVGMiwweDZFRjMsMHg2RUY1LDB4NkVGNiwweDZFRjcsMHg2RUY4LC8qIDB4NDAtMHg0NyAqLworCTB4NkVGQSwweDZFRkIsMHg2RUZDLDB4NkVGRCwweDZFRkUsMHg2RUZGLDB4NkYwMCwweDZGMDEsLyogMHg0OC0weDRGICovCisJMHg2RjAzLDB4NkYwNCwweDZGMDUsMHg2RjA3LDB4NkYwOCwweDZGMEEsMHg2RjBCLDB4NkYwQywvKiAweDUwLTB4NTcgKi8KKwkweDZGMEQsMHg2RjBFLDB4NkYxMCwweDZGMTEsMHg2RjEyLDB4NkYxNiwweDZGMTcsMHg2RjE4LC8qIDB4NTgtMHg1RiAqLworCTB4NkYxOSwweDZGMUEsMHg2RjFCLDB4NkYxQywweDZGMUQsMHg2RjFFLDB4NkYxRiwweDZGMjEsLyogMHg2MC0weDY3ICovCisJMHg2RjIyLDB4NkYyMywweDZGMjUsMHg2RjI2LDB4NkYyNywweDZGMjgsMHg2RjJDLDB4NkYyRSwvKiAweDY4LTB4NkYgKi8KKwkweDZGMzAsMHg2RjMyLDB4NkYzNCwweDZGMzUsMHg2RjM3LDB4NkYzOCwweDZGMzksMHg2RjNBLC8qIDB4NzAtMHg3NyAqLworCTB4NkYzQiwweDZGM0MsMHg2RjNELDB4NkYzRiwweDZGNDAsMHg2RjQxLDB4NkY0MiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDZGNDMsMHg2RjQ0LDB4NkY0NSwweDZGNDgsMHg2RjQ5LDB4NkY0QSwweDZGNEMsMHg2RjRFLC8qIDB4ODAtMHg4NyAqLworCTB4NkY0RiwweDZGNTAsMHg2RjUxLDB4NkY1MiwweDZGNTMsMHg2RjU0LDB4NkY1NSwweDZGNTYsLyogMHg4OC0weDhGICovCisJMHg2RjU3LDB4NkY1OSwweDZGNUEsMHg2RjVCLDB4NkY1RCwweDZGNUYsMHg2RjYwLDB4NkY2MSwvKiAweDkwLTB4OTcgKi8KKwkweDZGNjMsMHg2RjY0LDB4NkY2NSwweDZGNjcsMHg2RjY4LDB4NkY2OSwweDZGNkEsMHg2RjZCLC8qIDB4OTgtMHg5RiAqLworCTB4NkY2QywweDZGNkYsMHg2RjcwLDB4NkY3MSwweDZGNzMsMHg2Rjc1LDB4NkY3NiwweDZGNzcsLyogMHhBMC0weEE3ICovCisJMHg2Rjc5LDB4NkY3QiwweDZGN0QsMHg2RjdFLDB4NkY3RiwweDZGODAsMHg2RjgxLDB4NkY4MiwvKiAweEE4LTB4QUYgKi8KKwkweDZGODMsMHg2Rjg1LDB4NkY4NiwweDZGODcsMHg2RjhBLDB4NkY4QiwweDZGOEYsMHg2RjkwLC8qIDB4QjAtMHhCNyAqLworCTB4NkY5MSwweDZGOTIsMHg2RjkzLDB4NkY5NCwweDZGOTUsMHg2Rjk2LDB4NkY5NywweDZGOTgsLyogMHhCOC0weEJGICovCisJMHg2Rjk5LDB4NkY5QSwweDZGOUIsMHg2RjlELDB4NkY5RSwweDZGOUYsMHg2RkEwLDB4NkZBMiwvKiAweEMwLTB4QzcgKi8KKwkweDZGQTMsMHg2RkE0LDB4NkZBNSwweDZGQTYsMHg2RkE4LDB4NkZBOSwweDZGQUEsMHg2RkFCLC8qIDB4QzgtMHhDRiAqLworCTB4NkZBQywweDZGQUQsMHg2RkFFLDB4NkZBRiwweDZGQjAsMHg2RkIxLDB4NkZCMiwweDZGQjQsLyogMHhEMC0weEQ3ICovCisJMHg2RkI1LDB4NkZCNywweDZGQjgsMHg2RkJBLDB4NkZCQiwweDZGQkMsMHg2RkJELDB4NkZCRSwvKiAweEQ4LTB4REYgKi8KKwkweDZGQkYsMHg2RkMxLDB4NkZDMywweDZGQzQsMHg2RkM1LDB4NkZDNiwweDZGQzcsMHg2RkM4LC8qIDB4RTAtMHhFNyAqLworCTB4NkZDQSwweDZGQ0IsMHg2RkNDLDB4NkZDRCwweDZGQ0UsMHg2RkNGLDB4NkZEMCwweDZGRDMsLyogMHhFOC0weEVGICovCisJMHg2RkQ0LDB4NkZENSwweDZGRDYsMHg2RkQ3LDB4NkZEOCwweDZGRDksMHg2RkRBLDB4NkZEQiwvKiAweEYwLTB4RjcgKi8KKwkweDZGREMsMHg2RkRELDB4NkZERiwweDZGRTIsMHg2RkUzLDB4NkZFNCwweDZGRTUsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzlFWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NkZFNiwweDZGRTcsMHg2RkU4LDB4NkZFOSwweDZGRUEsMHg2RkVCLDB4NkZFQywweDZGRUQsLyogMHg0MC0weDQ3ICovCisJMHg2RkYwLDB4NkZGMSwweDZGRjIsMHg2RkYzLDB4NkZGNCwweDZGRjUsMHg2RkY2LDB4NkZGNywvKiAweDQ4LTB4NEYgKi8KKwkweDZGRjgsMHg2RkY5LDB4NkZGQSwweDZGRkIsMHg2RkZDLDB4NkZGRCwweDZGRkUsMHg2RkZGLC8qIDB4NTAtMHg1NyAqLworCTB4NzAwMCwweDcwMDEsMHg3MDAyLDB4NzAwMywweDcwMDQsMHg3MDA1LDB4NzAwNiwweDcwMDcsLyogMHg1OC0weDVGICovCisJMHg3MDA4LDB4NzAwOSwweDcwMEEsMHg3MDBCLDB4NzAwQywweDcwMEQsMHg3MDBFLDB4NzAwRiwvKiAweDYwLTB4NjcgKi8KKwkweDcwMTAsMHg3MDEyLDB4NzAxMywweDcwMTQsMHg3MDE1LDB4NzAxNiwweDcwMTcsMHg3MDE4LC8qIDB4NjgtMHg2RiAqLworCTB4NzAxOSwweDcwMUMsMHg3MDFELDB4NzAxRSwweDcwMUYsMHg3MDIwLDB4NzAyMSwweDcwMjIsLyogMHg3MC0weDc3ICovCisJMHg3MDI0LDB4NzAyNSwweDcwMjYsMHg3MDI3LDB4NzAyOCwweDcwMjksMHg3MDJBLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NzAyQiwweDcwMkMsMHg3MDJELDB4NzAyRSwweDcwMkYsMHg3MDMwLDB4NzAzMSwweDcwMzIsLyogMHg4MC0weDg3ICovCisJMHg3MDMzLDB4NzAzNCwweDcwMzYsMHg3MDM3LDB4NzAzOCwweDcwM0EsMHg3MDNCLDB4NzAzQywvKiAweDg4LTB4OEYgKi8KKwkweDcwM0QsMHg3MDNFLDB4NzAzRiwweDcwNDAsMHg3MDQxLDB4NzA0MiwweDcwNDMsMHg3MDQ0LC8qIDB4OTAtMHg5NyAqLworCTB4NzA0NSwweDcwNDYsMHg3MDQ3LDB4NzA0OCwweDcwNDksMHg3MDRBLDB4NzA0QiwweDcwNEQsLyogMHg5OC0weDlGICovCisJMHg3MDRFLDB4NzA1MCwweDcwNTEsMHg3MDUyLDB4NzA1MywweDcwNTQsMHg3MDU1LDB4NzA1NiwvKiAweEEwLTB4QTcgKi8KKwkweDcwNTcsMHg3MDU4LDB4NzA1OSwweDcwNUEsMHg3MDVCLDB4NzA1QywweDcwNUQsMHg3MDVGLC8qIDB4QTgtMHhBRiAqLworCTB4NzA2MCwweDcwNjEsMHg3MDYyLDB4NzA2MywweDcwNjQsMHg3MDY1LDB4NzA2NiwweDcwNjcsLyogMHhCMC0weEI3ICovCisJMHg3MDY4LDB4NzA2OSwweDcwNkEsMHg3MDZFLDB4NzA3MSwweDcwNzIsMHg3MDczLDB4NzA3NCwvKiAweEI4LTB4QkYgKi8KKwkweDcwNzcsMHg3MDc5LDB4NzA3QSwweDcwN0IsMHg3MDdELDB4NzA4MSwweDcwODIsMHg3MDgzLC8qIDB4QzAtMHhDNyAqLworCTB4NzA4NCwweDcwODYsMHg3MDg3LDB4NzA4OCwweDcwOEIsMHg3MDhDLDB4NzA4RCwweDcwOEYsLyogMHhDOC0weENGICovCisJMHg3MDkwLDB4NzA5MSwweDcwOTMsMHg3MDk3LDB4NzA5OCwweDcwOUEsMHg3MDlCLDB4NzA5RSwvKiAweEQwLTB4RDcgKi8KKwkweDcwOUYsMHg3MEEwLDB4NzBBMSwweDcwQTIsMHg3MEEzLDB4NzBBNCwweDcwQTUsMHg3MEE2LC8qIDB4RDgtMHhERiAqLworCTB4NzBBNywweDcwQTgsMHg3MEE5LDB4NzBBQSwweDcwQjAsMHg3MEIyLDB4NzBCNCwweDcwQjUsLyogMHhFMC0weEU3ICovCisJMHg3MEI2LDB4NzBCQSwweDcwQkUsMHg3MEJGLDB4NzBDNCwweDcwQzUsMHg3MEM2LDB4NzBDNywvKiAweEU4LTB4RUYgKi8KKwkweDcwQzksMHg3MENCLDB4NzBDQywweDcwQ0QsMHg3MENFLDB4NzBDRiwweDcwRDAsMHg3MEQxLC8qIDB4RjAtMHhGNyAqLworCTB4NzBEMiwweDcwRDMsMHg3MEQ0LDB4NzBENSwweDcwRDYsMHg3MEQ3LDB4NzBEQSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOUZbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg3MERDLDB4NzBERCwweDcwREUsMHg3MEUwLDB4NzBFMSwweDcwRTIsMHg3MEUzLDB4NzBFNSwvKiAweDQwLTB4NDcgKi8KKwkweDcwRUEsMHg3MEVFLDB4NzBGMCwweDcwRjEsMHg3MEYyLDB4NzBGMywweDcwRjQsMHg3MEY1LC8qIDB4NDgtMHg0RiAqLworCTB4NzBGNiwweDcwRjgsMHg3MEZBLDB4NzBGQiwweDcwRkMsMHg3MEZFLDB4NzBGRiwweDcxMDAsLyogMHg1MC0weDU3ICovCisJMHg3MTAxLDB4NzEwMiwweDcxMDMsMHg3MTA0LDB4NzEwNSwweDcxMDYsMHg3MTA3LDB4NzEwOCwvKiAweDU4LTB4NUYgKi8KKwkweDcxMEIsMHg3MTBDLDB4NzEwRCwweDcxMEUsMHg3MTBGLDB4NzExMSwweDcxMTIsMHg3MTE0LC8qIDB4NjAtMHg2NyAqLworCTB4NzExNywweDcxMUIsMHg3MTFDLDB4NzExRCwweDcxMUUsMHg3MTFGLDB4NzEyMCwweDcxMjEsLyogMHg2OC0weDZGICovCisJMHg3MTIyLDB4NzEyMywweDcxMjQsMHg3MTI1LDB4NzEyNywweDcxMjgsMHg3MTI5LDB4NzEyQSwvKiAweDcwLTB4NzcgKi8KKwkweDcxMkIsMHg3MTJDLDB4NzEyRCwweDcxMkUsMHg3MTMyLDB4NzEzMywweDcxMzQsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg3MTM1LDB4NzEzNywweDcxMzgsMHg3MTM5LDB4NzEzQSwweDcxM0IsMHg3MTNDLDB4NzEzRCwvKiAweDgwLTB4ODcgKi8KKwkweDcxM0UsMHg3MTNGLDB4NzE0MCwweDcxNDEsMHg3MTQyLDB4NzE0MywweDcxNDQsMHg3MTQ2LC8qIDB4ODgtMHg4RiAqLworCTB4NzE0NywweDcxNDgsMHg3MTQ5LDB4NzE0QiwweDcxNEQsMHg3MTRGLDB4NzE1MCwweDcxNTEsLyogMHg5MC0weDk3ICovCisJMHg3MTUyLDB4NzE1MywweDcxNTQsMHg3MTU1LDB4NzE1NiwweDcxNTcsMHg3MTU4LDB4NzE1OSwvKiAweDk4LTB4OUYgKi8KKwkweDcxNUEsMHg3MTVCLDB4NzE1RCwweDcxNUYsMHg3MTYwLDB4NzE2MSwweDcxNjIsMHg3MTYzLC8qIDB4QTAtMHhBNyAqLworCTB4NzE2NSwweDcxNjksMHg3MTZBLDB4NzE2QiwweDcxNkMsMHg3MTZELDB4NzE2RiwweDcxNzAsLyogMHhBOC0weEFGICovCisJMHg3MTcxLDB4NzE3NCwweDcxNzUsMHg3MTc2LDB4NzE3NywweDcxNzksMHg3MTdCLDB4NzE3QywvKiAweEIwLTB4QjcgKi8KKwkweDcxN0UsMHg3MTdGLDB4NzE4MCwweDcxODEsMHg3MTgyLDB4NzE4MywweDcxODUsMHg3MTg2LC8qIDB4QjgtMHhCRiAqLworCTB4NzE4NywweDcxODgsMHg3MTg5LDB4NzE4QiwweDcxOEMsMHg3MThELDB4NzE4RSwweDcxOTAsLyogMHhDMC0weEM3ICovCisJMHg3MTkxLDB4NzE5MiwweDcxOTMsMHg3MTk1LDB4NzE5NiwweDcxOTcsMHg3MTlBLDB4NzE5QiwvKiAweEM4LTB4Q0YgKi8KKwkweDcxOUMsMHg3MTlELDB4NzE5RSwweDcxQTEsMHg3MUEyLDB4NzFBMywweDcxQTQsMHg3MUE1LC8qIDB4RDAtMHhENyAqLworCTB4NzFBNiwweDcxQTcsMHg3MUE5LDB4NzFBQSwweDcxQUIsMHg3MUFELDB4NzFBRSwweDcxQUYsLyogMHhEOC0weERGICovCisJMHg3MUIwLDB4NzFCMSwweDcxQjIsMHg3MUI0LDB4NzFCNiwweDcxQjcsMHg3MUI4LDB4NzFCQSwvKiAweEUwLTB4RTcgKi8KKwkweDcxQkIsMHg3MUJDLDB4NzFCRCwweDcxQkUsMHg3MUJGLDB4NzFDMCwweDcxQzEsMHg3MUMyLC8qIDB4RTgtMHhFRiAqLworCTB4NzFDNCwweDcxQzUsMHg3MUM2LDB4NzFDNywweDcxQzgsMHg3MUM5LDB4NzFDQSwweDcxQ0IsLyogMHhGMC0weEY3ICovCisJMHg3MUNDLDB4NzFDRCwweDcxQ0YsMHg3MUQwLDB4NzFEMSwweDcxRDIsMHg3MUQzLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9BMFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDcxRDYsMHg3MUQ3LDB4NzFEOCwweDcxRDksMHg3MURBLDB4NzFEQiwweDcxREMsMHg3MURELC8qIDB4NDAtMHg0NyAqLworCTB4NzFERSwweDcxREYsMHg3MUUxLDB4NzFFMiwweDcxRTMsMHg3MUU0LDB4NzFFNiwweDcxRTgsLyogMHg0OC0weDRGICovCisJMHg3MUU5LDB4NzFFQSwweDcxRUIsMHg3MUVDLDB4NzFFRCwweDcxRUYsMHg3MUYwLDB4NzFGMSwvKiAweDUwLTB4NTcgKi8KKwkweDcxRjIsMHg3MUYzLDB4NzFGNCwweDcxRjUsMHg3MUY2LDB4NzFGNywweDcxRjgsMHg3MUZBLC8qIDB4NTgtMHg1RiAqLworCTB4NzFGQiwweDcxRkMsMHg3MUZELDB4NzFGRSwweDcxRkYsMHg3MjAwLDB4NzIwMSwweDcyMDIsLyogMHg2MC0weDY3ICovCisJMHg3MjAzLDB4NzIwNCwweDcyMDUsMHg3MjA3LDB4NzIwOCwweDcyMDksMHg3MjBBLDB4NzIwQiwvKiAweDY4LTB4NkYgKi8KKwkweDcyMEMsMHg3MjBELDB4NzIwRSwweDcyMEYsMHg3MjEwLDB4NzIxMSwweDcyMTIsMHg3MjEzLC8qIDB4NzAtMHg3NyAqLworCTB4NzIxNCwweDcyMTUsMHg3MjE2LDB4NzIxNywweDcyMTgsMHg3MjE5LDB4NzIxQSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDcyMUIsMHg3MjFDLDB4NzIxRSwweDcyMUYsMHg3MjIwLDB4NzIyMSwweDcyMjIsMHg3MjIzLC8qIDB4ODAtMHg4NyAqLworCTB4NzIyNCwweDcyMjUsMHg3MjI2LDB4NzIyNywweDcyMjksMHg3MjJCLDB4NzIyRCwweDcyMkUsLyogMHg4OC0weDhGICovCisJMHg3MjJGLDB4NzIzMiwweDcyMzMsMHg3MjM0LDB4NzIzQSwweDcyM0MsMHg3MjNFLDB4NzI0MCwvKiAweDkwLTB4OTcgKi8KKwkweDcyNDEsMHg3MjQyLDB4NzI0MywweDcyNDQsMHg3MjQ1LDB4NzI0NiwweDcyNDksMHg3MjRBLC8qIDB4OTgtMHg5RiAqLworCTB4NzI0QiwweDcyNEUsMHg3MjRGLDB4NzI1MCwweDcyNTEsMHg3MjUzLDB4NzI1NCwweDcyNTUsLyogMHhBMC0weEE3ICovCisJMHg3MjU3LDB4NzI1OCwweDcyNUEsMHg3MjVDLDB4NzI1RSwweDcyNjAsMHg3MjYzLDB4NzI2NCwvKiAweEE4LTB4QUYgKi8KKwkweDcyNjUsMHg3MjY4LDB4NzI2QSwweDcyNkIsMHg3MjZDLDB4NzI2RCwweDcyNzAsMHg3MjcxLC8qIDB4QjAtMHhCNyAqLworCTB4NzI3MywweDcyNzQsMHg3Mjc2LDB4NzI3NywweDcyNzgsMHg3MjdCLDB4NzI3QywweDcyN0QsLyogMHhCOC0weEJGICovCisJMHg3MjgyLDB4NzI4MywweDcyODUsMHg3Mjg2LDB4NzI4NywweDcyODgsMHg3Mjg5LDB4NzI4QywvKiAweEMwLTB4QzcgKi8KKwkweDcyOEUsMHg3MjkwLDB4NzI5MSwweDcyOTMsMHg3Mjk0LDB4NzI5NSwweDcyOTYsMHg3Mjk3LC8qIDB4QzgtMHhDRiAqLworCTB4NzI5OCwweDcyOTksMHg3MjlBLDB4NzI5QiwweDcyOUMsMHg3MjlELDB4NzI5RSwweDcyQTAsLyogMHhEMC0weEQ3ICovCisJMHg3MkExLDB4NzJBMiwweDcyQTMsMHg3MkE0LDB4NzJBNSwweDcyQTYsMHg3MkE3LDB4NzJBOCwvKiAweEQ4LTB4REYgKi8KKwkweDcyQTksMHg3MkFBLDB4NzJBQiwweDcyQUUsMHg3MkIxLDB4NzJCMiwweDcyQjMsMHg3MkI1LC8qIDB4RTAtMHhFNyAqLworCTB4NzJCQSwweDcyQkIsMHg3MkJDLDB4NzJCRCwweDcyQkUsMHg3MkJGLDB4NzJDMCwweDcyQzUsLyogMHhFOC0weEVGICovCisJMHg3MkM2LDB4NzJDNywweDcyQzksMHg3MkNBLDB4NzJDQiwweDcyQ0MsMHg3MkNGLDB4NzJEMSwvKiAweEYwLTB4RjcgKi8KKwkweDcyRDMsMHg3MkQ0LDB4NzJENSwweDcyRDYsMHg3MkQ4LDB4NzJEQSwweDcyREIsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0ExWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4MzAwMCwweDMwMDEsMHgzMDAyLDB4MDBCNywweDAyQzksMHgwMkM3LDB4MDBBOCwvKiAweEEwLTB4QTcgKi8KKwkweDMwMDMsMHgzMDA1LDB4MjAxNCwweEZGNUUsMHgyMDE2LDB4MjAyNiwweDIwMTgsMHgyMDE5LC8qIDB4QTgtMHhBRiAqLworCTB4MjAxQywweDIwMUQsMHgzMDE0LDB4MzAxNSwweDMwMDgsMHgzMDA5LDB4MzAwQSwweDMwMEIsLyogMHhCMC0weEI3ICovCisJMHgzMDBDLDB4MzAwRCwweDMwMEUsMHgzMDBGLDB4MzAxNiwweDMwMTcsMHgzMDEwLDB4MzAxMSwvKiAweEI4LTB4QkYgKi8KKwkweDAwQjEsMHgwMEQ3LDB4MDBGNywweDIyMzYsMHgyMjI3LDB4MjIyOCwweDIyMTEsMHgyMjBGLC8qIDB4QzAtMHhDNyAqLworCTB4MjIyQSwweDIyMjksMHgyMjA4LDB4MjIzNywweDIyMUEsMHgyMkE1LDB4MjIyNSwweDIyMjAsLyogMHhDOC0weENGICovCisJMHgyMzEyLDB4MjI5OSwweDIyMkIsMHgyMjJFLDB4MjI2MSwweDIyNEMsMHgyMjQ4LDB4MjIzRCwvKiAweEQwLTB4RDcgKi8KKwkweDIyMUQsMHgyMjYwLDB4MjI2RSwweDIyNkYsMHgyMjY0LDB4MjI2NSwweDIyMUUsMHgyMjM1LC8qIDB4RDgtMHhERiAqLworCTB4MjIzNCwweDI2NDIsMHgyNjQwLDB4MDBCMCwweDIwMzIsMHgyMDMzLDB4MjEwMywweEZGMDQsLyogMHhFMC0weEU3ICovCisJMHgwMEE0LDB4RkZFMCwweEZGRTEsMHgyMDMwLDB4MDBBNywweDIxMTYsMHgyNjA2LDB4MjYwNSwvKiAweEU4LTB4RUYgKi8KKwkweDI1Q0IsMHgyNUNGLDB4MjVDRSwweDI1QzcsMHgyNUM2LDB4MjVBMSwweDI1QTAsMHgyNUIzLC8qIDB4RjAtMHhGNyAqLworCTB4MjVCMiwweDIwM0IsMHgyMTkyLDB4MjE5MCwweDIxOTEsMHgyMTkzLDB4MzAxMywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQTJbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHgyMTcwLDB4MjE3MSwweDIxNzIsMHgyMTczLDB4MjE3NCwweDIxNzUsMHgyMTc2LC8qIDB4QTAtMHhBNyAqLworCTB4MjE3NywweDIxNzgsMHgyMTc5LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhBOC0weEFGICovCisJMHgwMDAwLDB4MjQ4OCwweDI0ODksMHgyNDhBLDB4MjQ4QiwweDI0OEMsMHgyNDhELDB4MjQ4RSwvKiAweEIwLTB4QjcgKi8KKwkweDI0OEYsMHgyNDkwLDB4MjQ5MSwweDI0OTIsMHgyNDkzLDB4MjQ5NCwweDI0OTUsMHgyNDk2LC8qIDB4QjgtMHhCRiAqLworCTB4MjQ5NywweDI0OTgsMHgyNDk5LDB4MjQ5QSwweDI0OUIsMHgyNDc0LDB4MjQ3NSwweDI0NzYsLyogMHhDMC0weEM3ICovCisJMHgyNDc3LDB4MjQ3OCwweDI0NzksMHgyNDdBLDB4MjQ3QiwweDI0N0MsMHgyNDdELDB4MjQ3RSwvKiAweEM4LTB4Q0YgKi8KKwkweDI0N0YsMHgyNDgwLDB4MjQ4MSwweDI0ODIsMHgyNDgzLDB4MjQ4NCwweDI0ODUsMHgyNDg2LC8qIDB4RDAtMHhENyAqLworCTB4MjQ4NywweDI0NjAsMHgyNDYxLDB4MjQ2MiwweDI0NjMsMHgyNDY0LDB4MjQ2NSwweDI0NjYsLyogMHhEOC0weERGICovCisJMHgyNDY3LDB4MjQ2OCwweDI0NjksMHgwMDAwLDB4MDAwMCwweDMyMjAsMHgzMjIxLDB4MzIyMiwvKiAweEUwLTB4RTcgKi8KKwkweDMyMjMsMHgzMjI0LDB4MzIyNSwweDMyMjYsMHgzMjI3LDB4MzIyOCwweDMyMjksMHgwMDAwLC8qIDB4RTgtMHhFRiAqLworCTB4MDAwMCwweDIxNjAsMHgyMTYxLDB4MjE2MiwweDIxNjMsMHgyMTY0LDB4MjE2NSwweDIxNjYsLyogMHhGMC0weEY3ICovCisJMHgyMTY3LDB4MjE2OCwweDIxNjksMHgyMTZBLDB4MjE2QiwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9BM1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweEZGMDEsMHhGRjAyLDB4RkYwMywweEZGRTUsMHhGRjA1LDB4RkYwNiwweEZGMDcsLyogMHhBMC0weEE3ICovCisJMHhGRjA4LDB4RkYwOSwweEZGMEEsMHhGRjBCLDB4RkYwQywweEZGMEQsMHhGRjBFLDB4RkYwRiwvKiAweEE4LTB4QUYgKi8KKwkweEZGMTAsMHhGRjExLDB4RkYxMiwweEZGMTMsMHhGRjE0LDB4RkYxNSwweEZGMTYsMHhGRjE3LC8qIDB4QjAtMHhCNyAqLworCTB4RkYxOCwweEZGMTksMHhGRjFBLDB4RkYxQiwweEZGMUMsMHhGRjFELDB4RkYxRSwweEZGMUYsLyogMHhCOC0weEJGICovCisJMHhGRjIwLDB4RkYyMSwweEZGMjIsMHhGRjIzLDB4RkYyNCwweEZGMjUsMHhGRjI2LDB4RkYyNywvKiAweEMwLTB4QzcgKi8KKwkweEZGMjgsMHhGRjI5LDB4RkYyQSwweEZGMkIsMHhGRjJDLDB4RkYyRCwweEZGMkUsMHhGRjJGLC8qIDB4QzgtMHhDRiAqLworCTB4RkYzMCwweEZGMzEsMHhGRjMyLDB4RkYzMywweEZGMzQsMHhGRjM1LDB4RkYzNiwweEZGMzcsLyogMHhEMC0weEQ3ICovCisJMHhGRjM4LDB4RkYzOSwweEZGM0EsMHhGRjNCLDB4RkYzQywweEZGM0QsMHhGRjNFLDB4RkYzRiwvKiAweEQ4LTB4REYgKi8KKwkweEZGNDAsMHhGRjQxLDB4RkY0MiwweEZGNDMsMHhGRjQ0LDB4RkY0NSwweEZGNDYsMHhGRjQ3LC8qIDB4RTAtMHhFNyAqLworCTB4RkY0OCwweEZGNDksMHhGRjRBLDB4RkY0QiwweEZGNEMsMHhGRjRELDB4RkY0RSwweEZGNEYsLyogMHhFOC0weEVGICovCisJMHhGRjUwLDB4RkY1MSwweEZGNTIsMHhGRjUzLDB4RkY1NCwweEZGNTUsMHhGRjU2LDB4RkY1NywvKiAweEYwLTB4RjcgKi8KKwkweEZGNTgsMHhGRjU5LDB4RkY1QSwweEZGNUIsMHhGRjVDLDB4RkY1RCwweEZGRTMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0E0WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4MzA0MSwweDMwNDIsMHgzMDQzLDB4MzA0NCwweDMwNDUsMHgzMDQ2LDB4MzA0NywvKiAweEEwLTB4QTcgKi8KKwkweDMwNDgsMHgzMDQ5LDB4MzA0QSwweDMwNEIsMHgzMDRDLDB4MzA0RCwweDMwNEUsMHgzMDRGLC8qIDB4QTgtMHhBRiAqLworCTB4MzA1MCwweDMwNTEsMHgzMDUyLDB4MzA1MywweDMwNTQsMHgzMDU1LDB4MzA1NiwweDMwNTcsLyogMHhCMC0weEI3ICovCisJMHgzMDU4LDB4MzA1OSwweDMwNUEsMHgzMDVCLDB4MzA1QywweDMwNUQsMHgzMDVFLDB4MzA1RiwvKiAweEI4LTB4QkYgKi8KKwkweDMwNjAsMHgzMDYxLDB4MzA2MiwweDMwNjMsMHgzMDY0LDB4MzA2NSwweDMwNjYsMHgzMDY3LC8qIDB4QzAtMHhDNyAqLworCTB4MzA2OCwweDMwNjksMHgzMDZBLDB4MzA2QiwweDMwNkMsMHgzMDZELDB4MzA2RSwweDMwNkYsLyogMHhDOC0weENGICovCisJMHgzMDcwLDB4MzA3MSwweDMwNzIsMHgzMDczLDB4MzA3NCwweDMwNzUsMHgzMDc2LDB4MzA3NywvKiAweEQwLTB4RDcgKi8KKwkweDMwNzgsMHgzMDc5LDB4MzA3QSwweDMwN0IsMHgzMDdDLDB4MzA3RCwweDMwN0UsMHgzMDdGLC8qIDB4RDgtMHhERiAqLworCTB4MzA4MCwweDMwODEsMHgzMDgyLDB4MzA4MywweDMwODQsMHgzMDg1LDB4MzA4NiwweDMwODcsLyogMHhFMC0weEU3ICovCisJMHgzMDg4LDB4MzA4OSwweDMwOEEsMHgzMDhCLDB4MzA4QywweDMwOEQsMHgzMDhFLDB4MzA4RiwvKiAweEU4LTB4RUYgKi8KKwkweDMwOTAsMHgzMDkxLDB4MzA5MiwweDMwOTMsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RjAtMHhGNyAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0E1WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4MzBBMSwweDMwQTIsMHgzMEEzLDB4MzBBNCwweDMwQTUsMHgzMEE2LDB4MzBBNywvKiAweEEwLTB4QTcgKi8KKwkweDMwQTgsMHgzMEE5LDB4MzBBQSwweDMwQUIsMHgzMEFDLDB4MzBBRCwweDMwQUUsMHgzMEFGLC8qIDB4QTgtMHhBRiAqLworCTB4MzBCMCwweDMwQjEsMHgzMEIyLDB4MzBCMywweDMwQjQsMHgzMEI1LDB4MzBCNiwweDMwQjcsLyogMHhCMC0weEI3ICovCisJMHgzMEI4LDB4MzBCOSwweDMwQkEsMHgzMEJCLDB4MzBCQywweDMwQkQsMHgzMEJFLDB4MzBCRiwvKiAweEI4LTB4QkYgKi8KKwkweDMwQzAsMHgzMEMxLDB4MzBDMiwweDMwQzMsMHgzMEM0LDB4MzBDNSwweDMwQzYsMHgzMEM3LC8qIDB4QzAtMHhDNyAqLworCTB4MzBDOCwweDMwQzksMHgzMENBLDB4MzBDQiwweDMwQ0MsMHgzMENELDB4MzBDRSwweDMwQ0YsLyogMHhDOC0weENGICovCisJMHgzMEQwLDB4MzBEMSwweDMwRDIsMHgzMEQzLDB4MzBENCwweDMwRDUsMHgzMEQ2LDB4MzBENywvKiAweEQwLTB4RDcgKi8KKwkweDMwRDgsMHgzMEQ5LDB4MzBEQSwweDMwREIsMHgzMERDLDB4MzBERCwweDMwREUsMHgzMERGLC8qIDB4RDgtMHhERiAqLworCTB4MzBFMCwweDMwRTEsMHgzMEUyLDB4MzBFMywweDMwRTQsMHgzMEU1LDB4MzBFNiwweDMwRTcsLyogMHhFMC0weEU3ICovCisJMHgzMEU4LDB4MzBFOSwweDMwRUEsMHgzMEVCLDB4MzBFQywweDMwRUQsMHgzMEVFLDB4MzBFRiwvKiAweEU4LTB4RUYgKi8KKwkweDMwRjAsMHgzMEYxLDB4MzBGMiwweDMwRjMsMHgzMEY0LDB4MzBGNSwweDMwRjYsMHgwMDAwLC8qIDB4RjAtMHhGNyAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0E2WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4MDM5MSwweDAzOTIsMHgwMzkzLDB4MDM5NCwweDAzOTUsMHgwMzk2LDB4MDM5NywvKiAweEEwLTB4QTcgKi8KKwkweDAzOTgsMHgwMzk5LDB4MDM5QSwweDAzOUIsMHgwMzlDLDB4MDM5RCwweDAzOUUsMHgwMzlGLC8qIDB4QTgtMHhBRiAqLworCTB4MDNBMCwweDAzQTEsMHgwM0EzLDB4MDNBNCwweDAzQTUsMHgwM0E2LDB4MDNBNywweDAzQTgsLyogMHhCMC0weEI3ICovCisJMHgwM0E5LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEI4LTB4QkYgKi8KKwkweDAwMDAsMHgwM0IxLDB4MDNCMiwweDAzQjMsMHgwM0I0LDB4MDNCNSwweDAzQjYsMHgwM0I3LC8qIDB4QzAtMHhDNyAqLworCTB4MDNCOCwweDAzQjksMHgwM0JBLDB4MDNCQiwweDAzQkMsMHgwM0JELDB4MDNCRSwweDAzQkYsLyogMHhDOC0weENGICovCisJMHgwM0MwLDB4MDNDMSwweDAzQzMsMHgwM0M0LDB4MDNDNSwweDAzQzYsMHgwM0M3LDB4MDNDOCwvKiAweEQwLTB4RDcgKi8KKwkweDAzQzksMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RDgtMHhERiAqLworCTB4RkUzNSwweEZFMzYsMHhGRTM5LDB4RkUzQSwweEZFM0YsMHhGRTQwLDB4RkUzRCwweEZFM0UsLyogMHhFMC0weEU3ICovCisJMHhGRTQxLDB4RkU0MiwweEZFNDMsMHhGRTQ0LDB4MDAwMCwweDAwMDAsMHhGRTNCLDB4RkUzQywvKiAweEU4LTB4RUYgKi8KKwkweEZFMzcsMHhGRTM4LDB4RkUzMSwweDAwMDAsMHhGRTMzLDB4RkUzNCwweDAwMDAsMHgwMDAwLC8qIDB4RjAtMHhGNyAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0E3WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4MDQxMCwweDA0MTEsMHgwNDEyLDB4MDQxMywweDA0MTQsMHgwNDE1LDB4MDQwMSwvKiAweEEwLTB4QTcgKi8KKwkweDA0MTYsMHgwNDE3LDB4MDQxOCwweDA0MTksMHgwNDFBLDB4MDQxQiwweDA0MUMsMHgwNDFELC8qIDB4QTgtMHhBRiAqLworCTB4MDQxRSwweDA0MUYsMHgwNDIwLDB4MDQyMSwweDA0MjIsMHgwNDIzLDB4MDQyNCwweDA0MjUsLyogMHhCMC0weEI3ICovCisJMHgwNDI2LDB4MDQyNywweDA0MjgsMHgwNDI5LDB4MDQyQSwweDA0MkIsMHgwNDJDLDB4MDQyRCwvKiAweEI4LTB4QkYgKi8KKwkweDA0MkUsMHgwNDJGLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4QzAtMHhDNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhDOC0weENGICovCisJMHgwMDAwLDB4MDQzMCwweDA0MzEsMHgwNDMyLDB4MDQzMywweDA0MzQsMHgwNDM1LDB4MDQ1MSwvKiAweEQwLTB4RDcgKi8KKwkweDA0MzYsMHgwNDM3LDB4MDQzOCwweDA0MzksMHgwNDNBLDB4MDQzQiwweDA0M0MsMHgwNDNELC8qIDB4RDgtMHhERiAqLworCTB4MDQzRSwweDA0M0YsMHgwNDQwLDB4MDQ0MSwweDA0NDIsMHgwNDQzLDB4MDQ0NCwweDA0NDUsLyogMHhFMC0weEU3ICovCisJMHgwNDQ2LDB4MDQ0NywweDA0NDgsMHgwNDQ5LDB4MDQ0QSwweDA0NEIsMHgwNDRDLDB4MDQ0RCwvKiAweEU4LTB4RUYgKi8KKwkweDA0NEUsMHgwNDRGLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RjAtMHhGNyAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0E4WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDJDQSwweDAyQ0IsMHgwMkQ5LDB4MjAxMywweDIwMTUsMHgyMDI1LDB4MjAzNSwweDIxMDUsLyogMHg0MC0weDQ3ICovCisJMHgyMTA5LDB4MjE5NiwweDIxOTcsMHgyMTk4LDB4MjE5OSwweDIyMTUsMHgyMjFGLDB4MjIyMywvKiAweDQ4LTB4NEYgKi8KKwkweDIyNTIsMHgyMjY2LDB4MjI2NywweDIyQkYsMHgyNTUwLDB4MjU1MSwweDI1NTIsMHgyNTUzLC8qIDB4NTAtMHg1NyAqLworCTB4MjU1NCwweDI1NTUsMHgyNTU2LDB4MjU1NywweDI1NTgsMHgyNTU5LDB4MjU1QSwweDI1NUIsLyogMHg1OC0weDVGICovCisJMHgyNTVDLDB4MjU1RCwweDI1NUUsMHgyNTVGLDB4MjU2MCwweDI1NjEsMHgyNTYyLDB4MjU2MywvKiAweDYwLTB4NjcgKi8KKwkweDI1NjQsMHgyNTY1LDB4MjU2NiwweDI1NjcsMHgyNTY4LDB4MjU2OSwweDI1NkEsMHgyNTZCLC8qIDB4NjgtMHg2RiAqLworCTB4MjU2QywweDI1NkQsMHgyNTZFLDB4MjU2RiwweDI1NzAsMHgyNTcxLDB4MjU3MiwweDI1NzMsLyogMHg3MC0weDc3ICovCisJMHgyNTgxLDB4MjU4MiwweDI1ODMsMHgyNTg0LDB4MjU4NSwweDI1ODYsMHgyNTg3LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MjU4OCwweDI1ODksMHgyNThBLDB4MjU4QiwweDI1OEMsMHgyNThELDB4MjU4RSwweDI1OEYsLyogMHg4MC0weDg3ICovCisJMHgyNTkzLDB4MjU5NCwweDI1OTUsMHgyNUJDLDB4MjVCRCwweDI1RTIsMHgyNUUzLDB4MjVFNCwvKiAweDg4LTB4OEYgKi8KKwkweDI1RTUsMHgyNjA5LDB4MjI5NSwweDMwMTIsMHgzMDFELDB4MzAxRSwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4MDEwMSwweDAwRTEsMHgwMUNFLDB4MDBFMCwweDAxMTMsMHgwMEU5LDB4MDExQiwvKiAweEEwLTB4QTcgKi8KKwkweDAwRTgsMHgwMTJCLDB4MDBFRCwweDAxRDAsMHgwMEVDLDB4MDE0RCwweDAwRjMsMHgwMUQyLC8qIDB4QTgtMHhBRiAqLworCTB4MDBGMiwweDAxNkIsMHgwMEZBLDB4MDFENCwweDAwRjksMHgwMUQ2LDB4MDFEOCwweDAxREEsLyogMHhCMC0weEI3ICovCisJMHgwMURDLDB4MDBGQywweDAwRUEsMHgwMjUxLDB4MDAwMCwweDAxNDQsMHgwMTQ4LDB4MDAwMCwvKiAweEI4LTB4QkYgKi8KKwkweDAyNjEsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MzEwNSwweDMxMDYsMHgzMTA3LC8qIDB4QzAtMHhDNyAqLworCTB4MzEwOCwweDMxMDksMHgzMTBBLDB4MzEwQiwweDMxMEMsMHgzMTBELDB4MzEwRSwweDMxMEYsLyogMHhDOC0weENGICovCisJMHgzMTEwLDB4MzExMSwweDMxMTIsMHgzMTEzLDB4MzExNCwweDMxMTUsMHgzMTE2LDB4MzExNywvKiAweEQwLTB4RDcgKi8KKwkweDMxMTgsMHgzMTE5LDB4MzExQSwweDMxMUIsMHgzMTFDLDB4MzExRCwweDMxMUUsMHgzMTFGLC8qIDB4RDgtMHhERiAqLworCTB4MzEyMCwweDMxMjEsMHgzMTIyLDB4MzEyMywweDMxMjQsMHgzMTI1LDB4MzEyNiwweDMxMjcsLyogMHhFMC0weEU3ICovCisJMHgzMTI4LDB4MzEyOSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEU4LTB4RUYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9BOVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDMwMjEsMHgzMDIyLDB4MzAyMywweDMwMjQsMHgzMDI1LDB4MzAyNiwweDMwMjcsMHgzMDI4LC8qIDB4NDAtMHg0NyAqLworCTB4MzAyOSwweDMyQTMsMHgzMzhFLDB4MzM4RiwweDMzOUMsMHgzMzlELDB4MzM5RSwweDMzQTEsLyogMHg0OC0weDRGICovCisJMHgzM0M0LDB4MzNDRSwweDMzRDEsMHgzM0QyLDB4MzNENSwweEZFMzAsMHhGRkUyLDB4RkZFNCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgyMTIxLDB4MzIzMSwweDAwMDAsMHgyMDEwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MzBGQywweDMwOUIsMHgzMDlDLDB4MzBGRCwweDMwRkUsMHgzMDA2LDB4MzA5RCwweDMwOUUsLyogMHg2MC0weDY3ICovCisJMHhGRTQ5LDB4RkU0QSwweEZFNEIsMHhGRTRDLDB4RkU0RCwweEZFNEUsMHhGRTRGLDB4RkU1MCwvKiAweDY4LTB4NkYgKi8KKwkweEZFNTEsMHhGRTUyLDB4RkU1NCwweEZFNTUsMHhGRTU2LDB4RkU1NywweEZFNTksMHhGRTVBLC8qIDB4NzAtMHg3NyAqLworCTB4RkU1QiwweEZFNUMsMHhGRTVELDB4RkU1RSwweEZFNUYsMHhGRTYwLDB4RkU2MSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweEZFNjIsMHhGRTYzLDB4RkU2NCwweEZFNjUsMHhGRTY2LDB4RkU2OCwweEZFNjksMHhGRTZBLC8qIDB4ODAtMHg4NyAqLworCTB4RkU2QiwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgzMDA3LDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDI1MDAsMHgyNTAxLDB4MjUwMiwweDI1MDMsLyogMHhBMC0weEE3ICovCisJMHgyNTA0LDB4MjUwNSwweDI1MDYsMHgyNTA3LDB4MjUwOCwweDI1MDksMHgyNTBBLDB4MjUwQiwvKiAweEE4LTB4QUYgKi8KKwkweDI1MEMsMHgyNTBELDB4MjUwRSwweDI1MEYsMHgyNTEwLDB4MjUxMSwweDI1MTIsMHgyNTEzLC8qIDB4QjAtMHhCNyAqLworCTB4MjUxNCwweDI1MTUsMHgyNTE2LDB4MjUxNywweDI1MTgsMHgyNTE5LDB4MjUxQSwweDI1MUIsLyogMHhCOC0weEJGICovCisJMHgyNTFDLDB4MjUxRCwweDI1MUUsMHgyNTFGLDB4MjUyMCwweDI1MjEsMHgyNTIyLDB4MjUyMywvKiAweEMwLTB4QzcgKi8KKwkweDI1MjQsMHgyNTI1LDB4MjUyNiwweDI1MjcsMHgyNTI4LDB4MjUyOSwweDI1MkEsMHgyNTJCLC8qIDB4QzgtMHhDRiAqLworCTB4MjUyQywweDI1MkQsMHgyNTJFLDB4MjUyRiwweDI1MzAsMHgyNTMxLDB4MjUzMiwweDI1MzMsLyogMHhEMC0weEQ3ICovCisJMHgyNTM0LDB4MjUzNSwweDI1MzYsMHgyNTM3LDB4MjUzOCwweDI1MzksMHgyNTNBLDB4MjUzQiwvKiAweEQ4LTB4REYgKi8KKwkweDI1M0MsMHgyNTNELDB4MjUzRSwweDI1M0YsMHgyNTQwLDB4MjU0MSwweDI1NDIsMHgyNTQzLC8qIDB4RTAtMHhFNyAqLworCTB4MjU0NCwweDI1NDUsMHgyNTQ2LDB4MjU0NywweDI1NDgsMHgyNTQ5LDB4MjU0QSwweDI1NEIsLyogMHhFOC0weEVGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQUFbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg3MkRDLDB4NzJERCwweDcyREYsMHg3MkUyLDB4NzJFMywweDcyRTQsMHg3MkU1LDB4NzJFNiwvKiAweDQwLTB4NDcgKi8KKwkweDcyRTcsMHg3MkVBLDB4NzJFQiwweDcyRjUsMHg3MkY2LDB4NzJGOSwweDcyRkQsMHg3MkZFLC8qIDB4NDgtMHg0RiAqLworCTB4NzJGRiwweDczMDAsMHg3MzAyLDB4NzMwNCwweDczMDUsMHg3MzA2LDB4NzMwNywweDczMDgsLyogMHg1MC0weDU3ICovCisJMHg3MzA5LDB4NzMwQiwweDczMEMsMHg3MzBELDB4NzMwRiwweDczMTAsMHg3MzExLDB4NzMxMiwvKiAweDU4LTB4NUYgKi8KKwkweDczMTQsMHg3MzE4LDB4NzMxOSwweDczMUEsMHg3MzFGLDB4NzMyMCwweDczMjMsMHg3MzI0LC8qIDB4NjAtMHg2NyAqLworCTB4NzMyNiwweDczMjcsMHg3MzI4LDB4NzMyRCwweDczMkYsMHg3MzMwLDB4NzMzMiwweDczMzMsLyogMHg2OC0weDZGICovCisJMHg3MzM1LDB4NzMzNiwweDczM0EsMHg3MzNCLDB4NzMzQywweDczM0QsMHg3MzQwLDB4NzM0MSwvKiAweDcwLTB4NzcgKi8KKwkweDczNDIsMHg3MzQzLDB4NzM0NCwweDczNDUsMHg3MzQ2LDB4NzM0NywweDczNDgsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg3MzQ5LDB4NzM0QSwweDczNEIsMHg3MzRDLDB4NzM0RSwweDczNEYsMHg3MzUxLDB4NzM1MywvKiAweDgwLTB4ODcgKi8KKwkweDczNTQsMHg3MzU1LDB4NzM1NiwweDczNTgsMHg3MzU5LDB4NzM1QSwweDczNUIsMHg3MzVDLC8qIDB4ODgtMHg4RiAqLworCTB4NzM1RCwweDczNUUsMHg3MzVGLDB4NzM2MSwweDczNjIsMHg3MzYzLDB4NzM2NCwweDczNjUsLyogMHg5MC0weDk3ICovCisJMHg3MzY2LDB4NzM2NywweDczNjgsMHg3MzY5LDB4NzM2QSwweDczNkIsMHg3MzZFLDB4NzM3MCwvKiAweDk4LTB4OUYgKi8KKwkweDczNzEsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4QTAtMHhBNyAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0FCWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NzM3MiwweDczNzMsMHg3Mzc0LDB4NzM3NSwweDczNzYsMHg3Mzc3LDB4NzM3OCwweDczNzksLyogMHg0MC0weDQ3ICovCisJMHg3MzdBLDB4NzM3QiwweDczN0MsMHg3MzdELDB4NzM3RiwweDczODAsMHg3MzgxLDB4NzM4MiwvKiAweDQ4LTB4NEYgKi8KKwkweDczODMsMHg3Mzg1LDB4NzM4NiwweDczODgsMHg3MzhBLDB4NzM4QywweDczOEQsMHg3MzhGLC8qIDB4NTAtMHg1NyAqLworCTB4NzM5MCwweDczOTIsMHg3MzkzLDB4NzM5NCwweDczOTUsMHg3Mzk3LDB4NzM5OCwweDczOTksLyogMHg1OC0weDVGICovCisJMHg3MzlBLDB4NzM5QywweDczOUQsMHg3MzlFLDB4NzNBMCwweDczQTEsMHg3M0EzLDB4NzNBNCwvKiAweDYwLTB4NjcgKi8KKwkweDczQTUsMHg3M0E2LDB4NzNBNywweDczQTgsMHg3M0FBLDB4NzNBQywweDczQUQsMHg3M0IxLC8qIDB4NjgtMHg2RiAqLworCTB4NzNCNCwweDczQjUsMHg3M0I2LDB4NzNCOCwweDczQjksMHg3M0JDLDB4NzNCRCwweDczQkUsLyogMHg3MC0weDc3ICovCisJMHg3M0JGLDB4NzNDMSwweDczQzMsMHg3M0M0LDB4NzNDNSwweDczQzYsMHg3M0M3LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NzNDQiwweDczQ0MsMHg3M0NFLDB4NzNEMiwweDczRDMsMHg3M0Q0LDB4NzNENSwweDczRDYsLyogMHg4MC0weDg3ICovCisJMHg3M0Q3LDB4NzNEOCwweDczREEsMHg3M0RCLDB4NzNEQywweDczREQsMHg3M0RGLDB4NzNFMSwvKiAweDg4LTB4OEYgKi8KKwkweDczRTIsMHg3M0UzLDB4NzNFNCwweDczRTYsMHg3M0U4LDB4NzNFQSwweDczRUIsMHg3M0VDLC8qIDB4OTAtMHg5NyAqLworCTB4NzNFRSwweDczRUYsMHg3M0YwLDB4NzNGMSwweDczRjMsMHg3M0Y0LDB4NzNGNSwweDczRjYsLyogMHg5OC0weDlGICovCisJMHg3M0Y3LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEEwLTB4QTcgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9BQ1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDczRjgsMHg3M0Y5LDB4NzNGQSwweDczRkIsMHg3M0ZDLDB4NzNGRCwweDczRkUsMHg3M0ZGLC8qIDB4NDAtMHg0NyAqLworCTB4NzQwMCwweDc0MDEsMHg3NDAyLDB4NzQwNCwweDc0MDcsMHg3NDA4LDB4NzQwQiwweDc0MEMsLyogMHg0OC0weDRGICovCisJMHg3NDBELDB4NzQwRSwweDc0MTEsMHg3NDEyLDB4NzQxMywweDc0MTQsMHg3NDE1LDB4NzQxNiwvKiAweDUwLTB4NTcgKi8KKwkweDc0MTcsMHg3NDE4LDB4NzQxOSwweDc0MUMsMHg3NDFELDB4NzQxRSwweDc0MUYsMHg3NDIwLC8qIDB4NTgtMHg1RiAqLworCTB4NzQyMSwweDc0MjMsMHg3NDI0LDB4NzQyNywweDc0MjksMHg3NDJCLDB4NzQyRCwweDc0MkYsLyogMHg2MC0weDY3ICovCisJMHg3NDMxLDB4NzQzMiwweDc0MzcsMHg3NDM4LDB4NzQzOSwweDc0M0EsMHg3NDNCLDB4NzQzRCwvKiAweDY4LTB4NkYgKi8KKwkweDc0M0UsMHg3NDNGLDB4NzQ0MCwweDc0NDIsMHg3NDQzLDB4NzQ0NCwweDc0NDUsMHg3NDQ2LC8qIDB4NzAtMHg3NyAqLworCTB4NzQ0NywweDc0NDgsMHg3NDQ5LDB4NzQ0QSwweDc0NEIsMHg3NDRDLDB4NzQ0RCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDc0NEUsMHg3NDRGLDB4NzQ1MCwweDc0NTEsMHg3NDUyLDB4NzQ1MywweDc0NTQsMHg3NDU2LC8qIDB4ODAtMHg4NyAqLworCTB4NzQ1OCwweDc0NUQsMHg3NDYwLDB4NzQ2MSwweDc0NjIsMHg3NDYzLDB4NzQ2NCwweDc0NjUsLyogMHg4OC0weDhGICovCisJMHg3NDY2LDB4NzQ2NywweDc0NjgsMHg3NDY5LDB4NzQ2QSwweDc0NkIsMHg3NDZDLDB4NzQ2RSwvKiAweDkwLTB4OTcgKi8KKwkweDc0NkYsMHg3NDcxLDB4NzQ3MiwweDc0NzMsMHg3NDc0LDB4NzQ3NSwweDc0NzgsMHg3NDc5LC8qIDB4OTgtMHg5RiAqLworCTB4NzQ3QSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhBMC0weEE3ICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQURbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg3NDdCLDB4NzQ3QywweDc0N0QsMHg3NDdGLDB4NzQ4MiwweDc0ODQsMHg3NDg1LDB4NzQ4NiwvKiAweDQwLTB4NDcgKi8KKwkweDc0ODgsMHg3NDg5LDB4NzQ4QSwweDc0OEMsMHg3NDhELDB4NzQ4RiwweDc0OTEsMHg3NDkyLC8qIDB4NDgtMHg0RiAqLworCTB4NzQ5MywweDc0OTQsMHg3NDk1LDB4NzQ5NiwweDc0OTcsMHg3NDk4LDB4NzQ5OSwweDc0OUEsLyogMHg1MC0weDU3ICovCisJMHg3NDlCLDB4NzQ5RCwweDc0OUYsMHg3NEEwLDB4NzRBMSwweDc0QTIsMHg3NEEzLDB4NzRBNCwvKiAweDU4LTB4NUYgKi8KKwkweDc0QTUsMHg3NEE2LDB4NzRBQSwweDc0QUIsMHg3NEFDLDB4NzRBRCwweDc0QUUsMHg3NEFGLC8qIDB4NjAtMHg2NyAqLworCTB4NzRCMCwweDc0QjEsMHg3NEIyLDB4NzRCMywweDc0QjQsMHg3NEI1LDB4NzRCNiwweDc0QjcsLyogMHg2OC0weDZGICovCisJMHg3NEI4LDB4NzRCOSwweDc0QkIsMHg3NEJDLDB4NzRCRCwweDc0QkUsMHg3NEJGLDB4NzRDMCwvKiAweDcwLTB4NzcgKi8KKwkweDc0QzEsMHg3NEMyLDB4NzRDMywweDc0QzQsMHg3NEM1LDB4NzRDNiwweDc0QzcsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg3NEM4LDB4NzRDOSwweDc0Q0EsMHg3NENCLDB4NzRDQywweDc0Q0QsMHg3NENFLDB4NzRDRiwvKiAweDgwLTB4ODcgKi8KKwkweDc0RDAsMHg3NEQxLDB4NzREMywweDc0RDQsMHg3NEQ1LDB4NzRENiwweDc0RDcsMHg3NEQ4LC8qIDB4ODgtMHg4RiAqLworCTB4NzREOSwweDc0REEsMHg3NERCLDB4NzRERCwweDc0REYsMHg3NEUxLDB4NzRFNSwweDc0RTcsLyogMHg5MC0weDk3ICovCisJMHg3NEU4LDB4NzRFOSwweDc0RUEsMHg3NEVCLDB4NzRFQywweDc0RUQsMHg3NEYwLDB4NzRGMSwvKiAweDk4LTB4OUYgKi8KKwkweDc0RjIsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4QTAtMHhBNyAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0FFWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NzRGMywweDc0RjUsMHg3NEY4LDB4NzRGOSwweDc0RkEsMHg3NEZCLDB4NzRGQywweDc0RkQsLyogMHg0MC0weDQ3ICovCisJMHg3NEZFLDB4NzUwMCwweDc1MDEsMHg3NTAyLDB4NzUwMywweDc1MDUsMHg3NTA2LDB4NzUwNywvKiAweDQ4LTB4NEYgKi8KKwkweDc1MDgsMHg3NTA5LDB4NzUwQSwweDc1MEIsMHg3NTBDLDB4NzUwRSwweDc1MTAsMHg3NTEyLC8qIDB4NTAtMHg1NyAqLworCTB4NzUxNCwweDc1MTUsMHg3NTE2LDB4NzUxNywweDc1MUIsMHg3NTFELDB4NzUxRSwweDc1MjAsLyogMHg1OC0weDVGICovCisJMHg3NTIxLDB4NzUyMiwweDc1MjMsMHg3NTI0LDB4NzUyNiwweDc1MjcsMHg3NTJBLDB4NzUyRSwvKiAweDYwLTB4NjcgKi8KKwkweDc1MzQsMHg3NTM2LDB4NzUzOSwweDc1M0MsMHg3NTNELDB4NzUzRiwweDc1NDEsMHg3NTQyLC8qIDB4NjgtMHg2RiAqLworCTB4NzU0MywweDc1NDQsMHg3NTQ2LDB4NzU0NywweDc1NDksMHg3NTRBLDB4NzU0RCwweDc1NTAsLyogMHg3MC0weDc3ICovCisJMHg3NTUxLDB4NzU1MiwweDc1NTMsMHg3NTU1LDB4NzU1NiwweDc1NTcsMHg3NTU4LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NzU1RCwweDc1NUUsMHg3NTVGLDB4NzU2MCwweDc1NjEsMHg3NTYyLDB4NzU2MywweDc1NjQsLyogMHg4MC0weDg3ICovCisJMHg3NTY3LDB4NzU2OCwweDc1NjksMHg3NTZCLDB4NzU2QywweDc1NkQsMHg3NTZFLDB4NzU2RiwvKiAweDg4LTB4OEYgKi8KKwkweDc1NzAsMHg3NTcxLDB4NzU3MywweDc1NzUsMHg3NTc2LDB4NzU3NywweDc1N0EsMHg3NTdCLC8qIDB4OTAtMHg5NyAqLworCTB4NzU3QywweDc1N0QsMHg3NTdFLDB4NzU4MCwweDc1ODEsMHg3NTgyLDB4NzU4NCwweDc1ODUsLyogMHg5OC0weDlGICovCisJMHg3NTg3LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEEwLTB4QTcgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9BRlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDc1ODgsMHg3NTg5LDB4NzU4QSwweDc1OEMsMHg3NThELDB4NzU4RSwweDc1OTAsMHg3NTkzLC8qIDB4NDAtMHg0NyAqLworCTB4NzU5NSwweDc1OTgsMHg3NTlCLDB4NzU5QywweDc1OUUsMHg3NUEyLDB4NzVBNiwweDc1QTcsLyogMHg0OC0weDRGICovCisJMHg3NUE4LDB4NzVBOSwweDc1QUEsMHg3NUFELDB4NzVCNiwweDc1QjcsMHg3NUJBLDB4NzVCQiwvKiAweDUwLTB4NTcgKi8KKwkweDc1QkYsMHg3NUMwLDB4NzVDMSwweDc1QzYsMHg3NUNCLDB4NzVDQywweDc1Q0UsMHg3NUNGLC8qIDB4NTgtMHg1RiAqLworCTB4NzVEMCwweDc1RDEsMHg3NUQzLDB4NzVENywweDc1RDksMHg3NURBLDB4NzVEQywweDc1REQsLyogMHg2MC0weDY3ICovCisJMHg3NURGLDB4NzVFMCwweDc1RTEsMHg3NUU1LDB4NzVFOSwweDc1RUMsMHg3NUVELDB4NzVFRSwvKiAweDY4LTB4NkYgKi8KKwkweDc1RUYsMHg3NUYyLDB4NzVGMywweDc1RjUsMHg3NUY2LDB4NzVGNywweDc1RjgsMHg3NUZBLC8qIDB4NzAtMHg3NyAqLworCTB4NzVGQiwweDc1RkQsMHg3NUZFLDB4NzYwMiwweDc2MDQsMHg3NjA2LDB4NzYwNywweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDc2MDgsMHg3NjA5LDB4NzYwQiwweDc2MEQsMHg3NjBFLDB4NzYwRiwweDc2MTEsMHg3NjEyLC8qIDB4ODAtMHg4NyAqLworCTB4NzYxMywweDc2MTQsMHg3NjE2LDB4NzYxQSwweDc2MUMsMHg3NjFELDB4NzYxRSwweDc2MjEsLyogMHg4OC0weDhGICovCisJMHg3NjIzLDB4NzYyNywweDc2MjgsMHg3NjJDLDB4NzYyRSwweDc2MkYsMHg3NjMxLDB4NzYzMiwvKiAweDkwLTB4OTcgKi8KKwkweDc2MzYsMHg3NjM3LDB4NzYzOSwweDc2M0EsMHg3NjNCLDB4NzYzRCwweDc2NDEsMHg3NjQyLC8qIDB4OTgtMHg5RiAqLworCTB4NzY0NCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhBMC0weEE3ICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQjBbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg3NjQ1LDB4NzY0NiwweDc2NDcsMHg3NjQ4LDB4NzY0OSwweDc2NEEsMHg3NjRCLDB4NzY0RSwvKiAweDQwLTB4NDcgKi8KKwkweDc2NEYsMHg3NjUwLDB4NzY1MSwweDc2NTIsMHg3NjUzLDB4NzY1NSwweDc2NTcsMHg3NjU4LC8qIDB4NDgtMHg0RiAqLworCTB4NzY1OSwweDc2NUEsMHg3NjVCLDB4NzY1RCwweDc2NUYsMHg3NjYwLDB4NzY2MSwweDc2NjIsLyogMHg1MC0weDU3ICovCisJMHg3NjY0LDB4NzY2NSwweDc2NjYsMHg3NjY3LDB4NzY2OCwweDc2NjksMHg3NjZBLDB4NzY2QywvKiAweDU4LTB4NUYgKi8KKwkweDc2NkQsMHg3NjZFLDB4NzY3MCwweDc2NzEsMHg3NjcyLDB4NzY3MywweDc2NzQsMHg3Njc1LC8qIDB4NjAtMHg2NyAqLworCTB4NzY3NiwweDc2NzcsMHg3Njc5LDB4NzY3QSwweDc2N0MsMHg3NjdGLDB4NzY4MCwweDc2ODEsLyogMHg2OC0weDZGICovCisJMHg3NjgzLDB4NzY4NSwweDc2ODksMHg3NjhBLDB4NzY4QywweDc2OEQsMHg3NjhGLDB4NzY5MCwvKiAweDcwLTB4NzcgKi8KKwkweDc2OTIsMHg3Njk0LDB4NzY5NSwweDc2OTcsMHg3Njk4LDB4NzY5QSwweDc2OUIsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg3NjlDLDB4NzY5RCwweDc2OUUsMHg3NjlGLDB4NzZBMCwweDc2QTEsMHg3NkEyLDB4NzZBMywvKiAweDgwLTB4ODcgKi8KKwkweDc2QTUsMHg3NkE2LDB4NzZBNywweDc2QTgsMHg3NkE5LDB4NzZBQSwweDc2QUIsMHg3NkFDLC8qIDB4ODgtMHg4RiAqLworCTB4NzZBRCwweDc2QUYsMHg3NkIwLDB4NzZCMywweDc2QjUsMHg3NkI2LDB4NzZCNywweDc2QjgsLyogMHg5MC0weDk3ICovCisJMHg3NkI5LDB4NzZCQSwweDc2QkIsMHg3NkJDLDB4NzZCRCwweDc2QkUsMHg3NkMwLDB4NzZDMSwvKiAweDk4LTB4OUYgKi8KKwkweDc2QzMsMHg1NTRBLDB4OTYzRiwweDU3QzMsMHg2MzI4LDB4NTRDRSwweDU1MDksMHg1NEMwLC8qIDB4QTAtMHhBNyAqLworCTB4NzY5MSwweDc2NEMsMHg4NTNDLDB4NzdFRSwweDgyN0UsMHg3ODhELDB4NzIzMSwweDk2OTgsLyogMHhBOC0weEFGICovCisJMHg5NzhELDB4NkMyOCwweDVCODksMHg0RkZBLDB4NjMwOSwweDY2OTcsMHg1Q0I4LDB4ODBGQSwvKiAweEIwLTB4QjcgKi8KKwkweDY4NDgsMHg4MEFFLDB4NjYwMiwweDc2Q0UsMHg1MUY5LDB4NjU1NiwweDcxQUMsMHg3RkYxLC8qIDB4QjgtMHhCRiAqLworCTB4ODg4NCwweDUwQjIsMHg1OTY1LDB4NjFDQSwweDZGQjMsMHg4MkFELDB4NjM0QywweDYyNTIsLyogMHhDMC0weEM3ICovCisJMHg1M0VELDB4NTQyNywweDdCMDYsMHg1MTZCLDB4NzVBNCwweDVERjQsMHg2MkQ0LDB4OERDQiwvKiAweEM4LTB4Q0YgKi8KKwkweDk3NzYsMHg2MjhBLDB4ODAxOSwweDU3NUQsMHg5NzM4LDB4N0Y2MiwweDcyMzgsMHg3NjdELC8qIDB4RDAtMHhENyAqLworCTB4NjdDRiwweDc2N0UsMHg2NDQ2LDB4NEY3MCwweDhEMjUsMHg2MkRDLDB4N0ExNywweDY1OTEsLyogMHhEOC0weERGICovCisJMHg3M0VELDB4NjQyQywweDYyNzMsMHg4MjJDLDB4OTg4MSwweDY3N0YsMHg3MjQ4LDB4NjI2RSwvKiAweEUwLTB4RTcgKi8KKwkweDYyQ0MsMHg0RjM0LDB4NzRFMywweDUzNEEsMHg1MjlFLDB4N0VDQSwweDkwQTYsMHg1RTJFLC8qIDB4RTgtMHhFRiAqLworCTB4Njg4NiwweDY5OUMsMHg4MTgwLDB4N0VEMSwweDY4RDIsMHg3OEM1LDB4ODY4QywweDk1NTEsLyogMHhGMC0weEY3ICovCisJMHg1MDhELDB4OEMyNCwweDgyREUsMHg4MERFLDB4NTMwNSwweDg5MTIsMHg1MjY1LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9CMVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDc2QzQsMHg3NkM3LDB4NzZDOSwweDc2Q0IsMHg3NkNDLDB4NzZEMywweDc2RDUsMHg3NkQ5LC8qIDB4NDAtMHg0NyAqLworCTB4NzZEQSwweDc2REMsMHg3NkRELDB4NzZERSwweDc2RTAsMHg3NkUxLDB4NzZFMiwweDc2RTMsLyogMHg0OC0weDRGICovCisJMHg3NkU0LDB4NzZFNiwweDc2RTcsMHg3NkU4LDB4NzZFOSwweDc2RUEsMHg3NkVCLDB4NzZFQywvKiAweDUwLTB4NTcgKi8KKwkweDc2RUQsMHg3NkYwLDB4NzZGMywweDc2RjUsMHg3NkY2LDB4NzZGNywweDc2RkEsMHg3NkZCLC8qIDB4NTgtMHg1RiAqLworCTB4NzZGRCwweDc2RkYsMHg3NzAwLDB4NzcwMiwweDc3MDMsMHg3NzA1LDB4NzcwNiwweDc3MEEsLyogMHg2MC0weDY3ICovCisJMHg3NzBDLDB4NzcwRSwweDc3MEYsMHg3NzEwLDB4NzcxMSwweDc3MTIsMHg3NzEzLDB4NzcxNCwvKiAweDY4LTB4NkYgKi8KKwkweDc3MTUsMHg3NzE2LDB4NzcxNywweDc3MTgsMHg3NzFCLDB4NzcxQywweDc3MUQsMHg3NzFFLC8qIDB4NzAtMHg3NyAqLworCTB4NzcyMSwweDc3MjMsMHg3NzI0LDB4NzcyNSwweDc3MjcsMHg3NzJBLDB4NzcyQiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDc3MkMsMHg3NzJFLDB4NzczMCwweDc3MzEsMHg3NzMyLDB4NzczMywweDc3MzQsMHg3NzM5LC8qIDB4ODAtMHg4NyAqLworCTB4NzczQiwweDc3M0QsMHg3NzNFLDB4NzczRiwweDc3NDIsMHg3NzQ0LDB4Nzc0NSwweDc3NDYsLyogMHg4OC0weDhGICovCisJMHg3NzQ4LDB4Nzc0OSwweDc3NEEsMHg3NzRCLDB4Nzc0QywweDc3NEQsMHg3NzRFLDB4Nzc0RiwvKiAweDkwLTB4OTcgKi8KKwkweDc3NTIsMHg3NzUzLDB4Nzc1NCwweDc3NTUsMHg3NzU2LDB4Nzc1NywweDc3NTgsMHg3NzU5LC8qIDB4OTgtMHg5RiAqLworCTB4Nzc1QywweDg1ODQsMHg5NkY5LDB4NEZERCwweDU4MjEsMHg5OTcxLDB4NUI5RCwweDYyQjEsLyogMHhBMC0weEE3ICovCisJMHg2MkE1LDB4NjZCNCwweDhDNzksMHg5QzhELDB4NzIwNiwweDY3NkYsMHg3ODkxLDB4NjBCMiwvKiAweEE4LTB4QUYgKi8KKwkweDUzNTEsMHg1MzE3LDB4OEY4OCwweDgwQ0MsMHg4RDFELDB4OTRBMSwweDUwMEQsMHg3MkM4LC8qIDB4QjAtMHhCNyAqLworCTB4NTkwNywweDYwRUIsMHg3MTE5LDB4ODhBQiwweDU5NTQsMHg4MkVGLDB4NjcyQywweDdCMjgsLyogMHhCOC0weEJGICovCisJMHg1RDI5LDB4N0VGNywweDc1MkQsMHg2Q0Y1LDB4OEU2NiwweDhGRjgsMHg5MDNDLDB4OUYzQiwvKiAweEMwLTB4QzcgKi8KKwkweDZCRDQsMHg5MTE5LDB4N0IxNCwweDVGN0MsMHg3OEE3LDB4ODRENiwweDg1M0QsMHg2QkQ1LC8qIDB4QzgtMHhDRiAqLworCTB4NkJEOSwweDZCRDYsMHg1RTAxLDB4NUU4NywweDc1RjksMHg5NUVELDB4NjU1RCwweDVGMEEsLyogMHhEMC0weEQ3ICovCisJMHg1RkM1LDB4OEY5RiwweDU4QzEsMHg4MUMyLDB4OTA3RiwweDk2NUIsMHg5N0FELDB4OEZCOSwvKiAweEQ4LTB4REYgKi8KKwkweDdGMTYsMHg4RDJDLDB4NjI0MSwweDRGQkYsMHg1M0Q4LDB4NTM1RSwweDhGQTgsMHg4RkE5LC8qIDB4RTAtMHhFNyAqLworCTB4OEZBQiwweDkwNEQsMHg2ODA3LDB4NUY2QSwweDgxOTgsMHg4ODY4LDB4OUNENiwweDYxOEIsLyogMHhFOC0weEVGICovCisJMHg1MjJCLDB4NzYyQSwweDVGNkMsMHg2NThDLDB4NkZEMiwweDZFRTgsMHg1QkJFLDB4NjQ0OCwvKiAweEYwLTB4RjcgKi8KKwkweDUxNzUsMHg1MUIwLDB4NjdDNCwweDRFMTksMHg3OUM5LDB4OTk3QywweDcwQjMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0IyWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4Nzc1RCwweDc3NUUsMHg3NzVGLDB4Nzc2MCwweDc3NjQsMHg3NzY3LDB4Nzc2OSwweDc3NkEsLyogMHg0MC0weDQ3ICovCisJMHg3NzZELDB4Nzc2RSwweDc3NkYsMHg3NzcwLDB4Nzc3MSwweDc3NzIsMHg3NzczLDB4Nzc3NCwvKiAweDQ4LTB4NEYgKi8KKwkweDc3NzUsMHg3Nzc2LDB4Nzc3NywweDc3NzgsMHg3NzdBLDB4Nzc3QiwweDc3N0MsMHg3NzgxLC8qIDB4NTAtMHg1NyAqLworCTB4Nzc4MiwweDc3ODMsMHg3Nzg2LDB4Nzc4NywweDc3ODgsMHg3Nzg5LDB4Nzc4QSwweDc3OEIsLyogMHg1OC0weDVGICovCisJMHg3NzhGLDB4Nzc5MCwweDc3OTMsMHg3Nzk0LDB4Nzc5NSwweDc3OTYsMHg3Nzk3LDB4Nzc5OCwvKiAweDYwLTB4NjcgKi8KKwkweDc3OTksMHg3NzlBLDB4Nzc5QiwweDc3OUMsMHg3NzlELDB4Nzc5RSwweDc3QTEsMHg3N0EzLC8qIDB4NjgtMHg2RiAqLworCTB4NzdBNCwweDc3QTYsMHg3N0E4LDB4NzdBQiwweDc3QUQsMHg3N0FFLDB4NzdBRiwweDc3QjEsLyogMHg3MC0weDc3ICovCisJMHg3N0IyLDB4NzdCNCwweDc3QjYsMHg3N0I3LDB4NzdCOCwweDc3QjksMHg3N0JBLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4NzdCQywweDc3QkUsMHg3N0MwLDB4NzdDMSwweDc3QzIsMHg3N0MzLDB4NzdDNCwweDc3QzUsLyogMHg4MC0weDg3ICovCisJMHg3N0M2LDB4NzdDNywweDc3QzgsMHg3N0M5LDB4NzdDQSwweDc3Q0IsMHg3N0NDLDB4NzdDRSwvKiAweDg4LTB4OEYgKi8KKwkweDc3Q0YsMHg3N0QwLDB4NzdEMSwweDc3RDIsMHg3N0QzLDB4NzdENCwweDc3RDUsMHg3N0Q2LC8qIDB4OTAtMHg5NyAqLworCTB4NzdEOCwweDc3RDksMHg3N0RBLDB4NzdERCwweDc3REUsMHg3N0RGLDB4NzdFMCwweDc3RTEsLyogMHg5OC0weDlGICovCisJMHg3N0U0LDB4NzVDNSwweDVFNzYsMHg3M0JCLDB4ODNFMCwweDY0QUQsMHg2MkU4LDB4OTRCNSwvKiAweEEwLTB4QTcgKi8KKwkweDZDRTIsMHg1MzVBLDB4NTJDMywweDY0MEYsMHg5NEMyLDB4N0I5NCwweDRGMkYsMHg1RTFCLC8qIDB4QTgtMHhBRiAqLworCTB4ODIzNiwweDgxMTYsMHg4MThBLDB4NkUyNCwweDZDQ0EsMHg5QTczLDB4NjM1NSwweDUzNUMsLyogMHhCMC0weEI3ICovCisJMHg1NEZBLDB4ODg2NSwweDU3RTAsMHg0RTBELDB4NUUwMywweDZCNjUsMHg3QzNGLDB4OTBFOCwvKiAweEI4LTB4QkYgKi8KKwkweDYwMTYsMHg2NEU2LDB4NzMxQywweDg4QzEsMHg2NzUwLDB4NjI0RCwweDhEMjIsMHg3NzZDLC8qIDB4QzAtMHhDNyAqLworCTB4OEUyOSwweDkxQzcsMHg1RjY5LDB4ODNEQywweDg1MjEsMHg5OTEwLDB4NTNDMiwweDg2OTUsLyogMHhDOC0weENGICovCisJMHg2QjhCLDB4NjBFRCwweDYwRTgsMHg3MDdGLDB4ODJDRCwweDgyMzEsMHg0RUQzLDB4NkNBNywvKiAweEQwLTB4RDcgKi8KKwkweDg1Q0YsMHg2NENELDB4N0NEOSwweDY5RkQsMHg2NkY5LDB4ODM0OSwweDUzOTUsMHg3QjU2LC8qIDB4RDgtMHhERiAqLworCTB4NEZBNywweDUxOEMsMHg2RDRCLDB4NUM0MiwweDhFNkQsMHg2M0QyLDB4NTNDOSwweDgzMkMsLyogMHhFMC0weEU3ICovCisJMHg4MzM2LDB4NjdFNSwweDc4QjQsMHg2NDNELDB4NUJERiwweDVDOTQsMHg1REVFLDB4OEJFNywvKiAweEU4LTB4RUYgKi8KKwkweDYyQzYsMHg2N0Y0LDB4OEM3QSwweDY0MDAsMHg2M0JBLDB4ODc0OSwweDk5OEIsMHg4QzE3LC8qIDB4RjAtMHhGNyAqLworCTB4N0YyMCwweDk0RjIsMHg0RUE3LDB4OTYxMCwweDk4QTQsMHg2NjBDLDB4NzMxNiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQjNbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg3N0U2LDB4NzdFOCwweDc3RUEsMHg3N0VGLDB4NzdGMCwweDc3RjEsMHg3N0YyLDB4NzdGNCwvKiAweDQwLTB4NDcgKi8KKwkweDc3RjUsMHg3N0Y3LDB4NzdGOSwweDc3RkEsMHg3N0ZCLDB4NzdGQywweDc4MDMsMHg3ODA0LC8qIDB4NDgtMHg0RiAqLworCTB4NzgwNSwweDc4MDYsMHg3ODA3LDB4NzgwOCwweDc4MEEsMHg3ODBCLDB4NzgwRSwweDc4MEYsLyogMHg1MC0weDU3ICovCisJMHg3ODEwLDB4NzgxMywweDc4MTUsMHg3ODE5LDB4NzgxQiwweDc4MUUsMHg3ODIwLDB4NzgyMSwvKiAweDU4LTB4NUYgKi8KKwkweDc4MjIsMHg3ODI0LDB4NzgyOCwweDc4MkEsMHg3ODJCLDB4NzgyRSwweDc4MkYsMHg3ODMxLC8qIDB4NjAtMHg2NyAqLworCTB4NzgzMiwweDc4MzMsMHg3ODM1LDB4NzgzNiwweDc4M0QsMHg3ODNGLDB4Nzg0MSwweDc4NDIsLyogMHg2OC0weDZGICovCisJMHg3ODQzLDB4Nzg0NCwweDc4NDYsMHg3ODQ4LDB4Nzg0OSwweDc4NEEsMHg3ODRCLDB4Nzg0RCwvKiAweDcwLTB4NzcgKi8KKwkweDc4NEYsMHg3ODUxLDB4Nzg1MywweDc4NTQsMHg3ODU4LDB4Nzg1OSwweDc4NUEsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg3ODVCLDB4Nzg1QywweDc4NUUsMHg3ODVGLDB4Nzg2MCwweDc4NjEsMHg3ODYyLDB4Nzg2MywvKiAweDgwLTB4ODcgKi8KKwkweDc4NjQsMHg3ODY1LDB4Nzg2NiwweDc4NjcsMHg3ODY4LDB4Nzg2OSwweDc4NkYsMHg3ODcwLC8qIDB4ODgtMHg4RiAqLworCTB4Nzg3MSwweDc4NzIsMHg3ODczLDB4Nzg3NCwweDc4NzUsMHg3ODc2LDB4Nzg3OCwweDc4NzksLyogMHg5MC0weDk3ICovCisJMHg3ODdBLDB4Nzg3QiwweDc4N0QsMHg3ODdFLDB4Nzg3RiwweDc4ODAsMHg3ODgxLDB4Nzg4MiwvKiAweDk4LTB4OUYgKi8KKwkweDc4ODMsMHg1NzNBLDB4NUMxRCwweDVFMzgsMHg5NTdGLDB4NTA3RiwweDgwQTAsMHg1MzgyLC8qIDB4QTAtMHhBNyAqLworCTB4NjU1RSwweDc1NDUsMHg1NTMxLDB4NTAyMSwweDhEODUsMHg2Mjg0LDB4OTQ5RSwweDY3MUQsLyogMHhBOC0weEFGICovCisJMHg1NjMyLDB4NkY2RSwweDVERTIsMHg1NDM1LDB4NzA5MiwweDhGNjYsMHg2MjZGLDB4NjRBNCwvKiAweEIwLTB4QjcgKi8KKwkweDYzQTMsMHg1RjdCLDB4NkY4OCwweDkwRjQsMHg4MUUzLDB4OEZCMCwweDVDMTgsMHg2NjY4LC8qIDB4QjgtMHhCRiAqLworCTB4NUZGMSwweDZDODksMHg5NjQ4LDB4OEQ4MSwweDg4NkMsMHg2NDkxLDB4NzlGMCwweDU3Q0UsLyogMHhDMC0weEM3ICovCisJMHg2QTU5LDB4NjIxMCwweDU0NDgsMHg0RTU4LDB4N0EwQiwweDYwRTksMHg2Rjg0LDB4OEJEQSwvKiAweEM4LTB4Q0YgKi8KKwkweDYyN0YsMHg5MDFFLDB4OUE4QiwweDc5RTQsMHg1NDAzLDB4NzVGNCwweDYzMDEsMHg1MzE5LC8qIDB4RDAtMHhENyAqLworCTB4NkM2MCwweDhGREYsMHg1RjFCLDB4OUE3MCwweDgwM0IsMHg5RjdGLDB4NEY4OCwweDVDM0EsLyogMHhEOC0weERGICovCisJMHg4RDY0LDB4N0ZDNSwweDY1QTUsMHg3MEJELDB4NTE0NSwweDUxQjIsMHg4NjZCLDB4NUQwNywvKiAweEUwLTB4RTcgKi8KKwkweDVCQTAsMHg2MkJELDB4OTE2QywweDc1NzQsMHg4RTBDLDB4N0EyMCwweDYxMDEsMHg3Qjc5LC8qIDB4RTgtMHhFRiAqLworCTB4NEVDNywweDdFRjgsMHg3Nzg1LDB4NEUxMSwweDgxRUQsMHg1MjFELDB4NTFGQSwweDZBNzEsLyogMHhGMC0weEY3ICovCisJMHg1M0E4LDB4OEU4NywweDk1MDQsMHg5NkNGLDB4NkVDMSwweDk2NjQsMHg2OTVBLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9CNFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDc4ODQsMHg3ODg1LDB4Nzg4NiwweDc4ODgsMHg3ODhBLDB4Nzg4QiwweDc4OEYsMHg3ODkwLC8qIDB4NDAtMHg0NyAqLworCTB4Nzg5MiwweDc4OTQsMHg3ODk1LDB4Nzg5NiwweDc4OTksMHg3ODlELDB4Nzg5RSwweDc4QTAsLyogMHg0OC0weDRGICovCisJMHg3OEEyLDB4NzhBNCwweDc4QTYsMHg3OEE4LDB4NzhBOSwweDc4QUEsMHg3OEFCLDB4NzhBQywvKiAweDUwLTB4NTcgKi8KKwkweDc4QUQsMHg3OEFFLDB4NzhBRiwweDc4QjUsMHg3OEI2LDB4NzhCNywweDc4QjgsMHg3OEJBLC8qIDB4NTgtMHg1RiAqLworCTB4NzhCQiwweDc4QkMsMHg3OEJELDB4NzhCRiwweDc4QzAsMHg3OEMyLDB4NzhDMywweDc4QzQsLyogMHg2MC0weDY3ICovCisJMHg3OEM2LDB4NzhDNywweDc4QzgsMHg3OENDLDB4NzhDRCwweDc4Q0UsMHg3OENGLDB4NzhEMSwvKiAweDY4LTB4NkYgKi8KKwkweDc4RDIsMHg3OEQzLDB4NzhENiwweDc4RDcsMHg3OEQ4LDB4NzhEQSwweDc4REIsMHg3OERDLC8qIDB4NzAtMHg3NyAqLworCTB4NzhERCwweDc4REUsMHg3OERGLDB4NzhFMCwweDc4RTEsMHg3OEUyLDB4NzhFMywweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDc4RTQsMHg3OEU1LDB4NzhFNiwweDc4RTcsMHg3OEU5LDB4NzhFQSwweDc4RUIsMHg3OEVELC8qIDB4ODAtMHg4NyAqLworCTB4NzhFRSwweDc4RUYsMHg3OEYwLDB4NzhGMSwweDc4RjMsMHg3OEY1LDB4NzhGNiwweDc4RjgsLyogMHg4OC0weDhGICovCisJMHg3OEY5LDB4NzhGQiwweDc4RkMsMHg3OEZELDB4NzhGRSwweDc4RkYsMHg3OTAwLDB4NzkwMiwvKiAweDkwLTB4OTcgKi8KKwkweDc5MDMsMHg3OTA0LDB4NzkwNiwweDc5MDcsMHg3OTA4LDB4NzkwOSwweDc5MEEsMHg3OTBCLC8qIDB4OTgtMHg5RiAqLworCTB4NzkwQywweDc4NDAsMHg1MEE4LDB4NzdENywweDY0MTAsMHg4OUU2LDB4NTkwNCwweDYzRTMsLyogMHhBMC0weEE3ICovCisJMHg1RERELDB4N0E3RiwweDY5M0QsMHg0RjIwLDB4ODIzOSwweDU1OTgsMHg0RTMyLDB4NzVBRSwvKiAweEE4LTB4QUYgKi8KKwkweDdBOTcsMHg1RTYyLDB4NUU4QSwweDk1RUYsMHg1MjFCLDB4NTQzOSwweDcwOEEsMHg2Mzc2LC8qIDB4QjAtMHhCNyAqLworCTB4OTUyNCwweDU3ODIsMHg2NjI1LDB4NjkzRiwweDkxODcsMHg1NTA3LDB4NkRGMywweDdFQUYsLyogMHhCOC0weEJGICovCisJMHg4ODIyLDB4NjIzMywweDdFRjAsMHg3NUI1LDB4ODMyOCwweDc4QzEsMHg5NkNDLDB4OEY5RSwvKiAweEMwLTB4QzcgKi8KKwkweDYxNDgsMHg3NEY3LDB4OEJDRCwweDZCNjQsMHg1MjNBLDB4OEQ1MCwweDZCMjEsMHg4MDZBLC8qIDB4QzgtMHhDRiAqLworCTB4ODQ3MSwweDU2RjEsMHg1MzA2LDB4NEVDRSwweDRFMUIsMHg1MUQxLDB4N0M5NywweDkxOEIsLyogMHhEMC0weEQ3ICovCisJMHg3QzA3LDB4NEZDMywweDhFN0YsMHg3QkUxLDB4N0E5QywweDY0NjcsMHg1RDE0LDB4NTBBQywvKiAweEQ4LTB4REYgKi8KKwkweDgxMDYsMHg3NjAxLDB4N0NCOSwweDZERUMsMHg3RkUwLDB4Njc1MSwweDVCNTgsMHg1QkY4LC8qIDB4RTAtMHhFNyAqLworCTB4NzhDQiwweDY0QUUsMHg2NDEzLDB4NjNBQSwweDYzMkIsMHg5NTE5LDB4NjQyRCwweDhGQkUsLyogMHhFOC0weEVGICovCisJMHg3QjU0LDB4NzYyOSwweDYyNTMsMHg1OTI3LDB4NTQ0NiwweDZCNzksMHg1MEEzLDB4NjIzNCwvKiAweEYwLTB4RjcgKi8KKwkweDVFMjYsMHg2Qjg2LDB4NEVFMywweDhEMzcsMHg4ODhCLDB4NUY4NSwweDkwMkUsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0I1WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NzkwRCwweDc5MEUsMHg3OTBGLDB4NzkxMCwweDc5MTEsMHg3OTEyLDB4NzkxNCwweDc5MTUsLyogMHg0MC0weDQ3ICovCisJMHg3OTE2LDB4NzkxNywweDc5MTgsMHg3OTE5LDB4NzkxQSwweDc5MUIsMHg3OTFDLDB4NzkxRCwvKiAweDQ4LTB4NEYgKi8KKwkweDc5MUYsMHg3OTIwLDB4NzkyMSwweDc5MjIsMHg3OTIzLDB4NzkyNSwweDc5MjYsMHg3OTI3LC8qIDB4NTAtMHg1NyAqLworCTB4NzkyOCwweDc5MjksMHg3OTJBLDB4NzkyQiwweDc5MkMsMHg3OTJELDB4NzkyRSwweDc5MkYsLyogMHg1OC0weDVGICovCisJMHg3OTMwLDB4NzkzMSwweDc5MzIsMHg3OTMzLDB4NzkzNSwweDc5MzYsMHg3OTM3LDB4NzkzOCwvKiAweDYwLTB4NjcgKi8KKwkweDc5MzksMHg3OTNELDB4NzkzRiwweDc5NDIsMHg3OTQzLDB4Nzk0NCwweDc5NDUsMHg3OTQ3LC8qIDB4NjgtMHg2RiAqLworCTB4Nzk0QSwweDc5NEIsMHg3OTRDLDB4Nzk0RCwweDc5NEUsMHg3OTRGLDB4Nzk1MCwweDc5NTEsLyogMHg3MC0weDc3ICovCisJMHg3OTUyLDB4Nzk1NCwweDc5NTUsMHg3OTU4LDB4Nzk1OSwweDc5NjEsMHg3OTYzLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4Nzk2NCwweDc5NjYsMHg3OTY5LDB4Nzk2QSwweDc5NkIsMHg3OTZDLDB4Nzk2RSwweDc5NzAsLyogMHg4MC0weDg3ICovCisJMHg3OTcxLDB4Nzk3MiwweDc5NzMsMHg3OTc0LDB4Nzk3NSwweDc5NzYsMHg3OTc5LDB4Nzk3QiwvKiAweDg4LTB4OEYgKi8KKwkweDc5N0MsMHg3OTdELDB4Nzk3RSwweDc5N0YsMHg3OTgyLDB4Nzk4MywweDc5ODYsMHg3OTg3LC8qIDB4OTAtMHg5NyAqLworCTB4Nzk4OCwweDc5ODksMHg3OThCLDB4Nzk4QywweDc5OEQsMHg3OThFLDB4Nzk5MCwweDc5OTEsLyogMHg5OC0weDlGICovCisJMHg3OTkyLDB4NjAyMCwweDgwM0QsMHg2MkM1LDB4NEUzOSwweDUzNTUsMHg5MEY4LDB4NjNCOCwvKiAweEEwLTB4QTcgKi8KKwkweDgwQzYsMHg2NUU2LDB4NkMyRSwweDRGNDYsMHg2MEVFLDB4NkRFMSwweDhCREUsMHg1RjM5LC8qIDB4QTgtMHhBRiAqLworCTB4ODZDQiwweDVGNTMsMHg2MzIxLDB4NTE1QSwweDgzNjEsMHg2ODYzLDB4NTIwMCwweDYzNjMsLyogMHhCMC0weEI3ICovCisJMHg4RTQ4LDB4NTAxMiwweDVDOUIsMHg3OTc3LDB4NUJGQywweDUyMzAsMHg3QTNCLDB4NjBCQywvKiAweEI4LTB4QkYgKi8KKwkweDkwNTMsMHg3NkQ3LDB4NUZCNywweDVGOTcsMHg3Njg0LDB4OEU2QywweDcwNkYsMHg3NjdCLC8qIDB4QzAtMHhDNyAqLworCTB4N0I0OSwweDc3QUEsMHg1MUYzLDB4OTA5MywweDU4MjQsMHg0RjRFLDB4NkVGNCwweDhGRUEsLyogMHhDOC0weENGICovCisJMHg2NTRDLDB4N0IxQiwweDcyQzQsMHg2REE0LDB4N0ZERiwweDVBRTEsMHg2MkI1LDB4NUU5NSwvKiAweEQwLTB4RDcgKi8KKwkweDU3MzAsMHg4NDgyLDB4N0IyQywweDVFMUQsMHg1RjFGLDB4OTAxMiwweDdGMTQsMHg5OEEwLC8qIDB4RDgtMHhERiAqLworCTB4NjM4MiwweDZFQzcsMHg3ODk4LDB4NzBCOSwweDUxNzgsMHg5NzVCLDB4NTdBQiwweDc1MzUsLyogMHhFMC0weEU3ICovCisJMHg0RjQzLDB4NzUzOCwweDVFOTcsMHg2MEU2LDB4NTk2MCwweDZEQzAsMHg2QkJGLDB4Nzg4OSwvKiAweEU4LTB4RUYgKi8KKwkweDUzRkMsMHg5NkQ1LDB4NTFDQiwweDUyMDEsMHg2Mzg5LDB4NTQwQSwweDk0OTMsMHg4QzAzLC8qIDB4RjAtMHhGNyAqLworCTB4OERDQywweDcyMzksMHg3ODlGLDB4ODc3NiwweDhGRUQsMHg4QzBELDB4NTNFMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQjZbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg3OTkzLDB4Nzk5NCwweDc5OTUsMHg3OTk2LDB4Nzk5NywweDc5OTgsMHg3OTk5LDB4Nzk5QiwvKiAweDQwLTB4NDcgKi8KKwkweDc5OUMsMHg3OTlELDB4Nzk5RSwweDc5OUYsMHg3OUEwLDB4NzlBMSwweDc5QTIsMHg3OUEzLC8qIDB4NDgtMHg0RiAqLworCTB4NzlBNCwweDc5QTUsMHg3OUE2LDB4NzlBOCwweDc5QTksMHg3OUFBLDB4NzlBQiwweDc5QUMsLyogMHg1MC0weDU3ICovCisJMHg3OUFELDB4NzlBRSwweDc5QUYsMHg3OUIwLDB4NzlCMSwweDc5QjIsMHg3OUI0LDB4NzlCNSwvKiAweDU4LTB4NUYgKi8KKwkweDc5QjYsMHg3OUI3LDB4NzlCOCwweDc5QkMsMHg3OUJGLDB4NzlDMiwweDc5QzQsMHg3OUM1LC8qIDB4NjAtMHg2NyAqLworCTB4NzlDNywweDc5QzgsMHg3OUNBLDB4NzlDQywweDc5Q0UsMHg3OUNGLDB4NzlEMCwweDc5RDMsLyogMHg2OC0weDZGICovCisJMHg3OUQ0LDB4NzlENiwweDc5RDcsMHg3OUQ5LDB4NzlEQSwweDc5REIsMHg3OURDLDB4NzlERCwvKiAweDcwLTB4NzcgKi8KKwkweDc5REUsMHg3OUUwLDB4NzlFMSwweDc5RTIsMHg3OUU1LDB4NzlFOCwweDc5RUEsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg3OUVDLDB4NzlFRSwweDc5RjEsMHg3OUYyLDB4NzlGMywweDc5RjQsMHg3OUY1LDB4NzlGNiwvKiAweDgwLTB4ODcgKi8KKwkweDc5RjcsMHg3OUY5LDB4NzlGQSwweDc5RkMsMHg3OUZFLDB4NzlGRiwweDdBMDEsMHg3QTA0LC8qIDB4ODgtMHg4RiAqLworCTB4N0EwNSwweDdBMDcsMHg3QTA4LDB4N0EwOSwweDdBMEEsMHg3QTBDLDB4N0EwRiwweDdBMTAsLyogMHg5MC0weDk3ICovCisJMHg3QTExLDB4N0ExMiwweDdBMTMsMHg3QTE1LDB4N0ExNiwweDdBMTgsMHg3QTE5LDB4N0ExQiwvKiAweDk4LTB4OUYgKi8KKwkweDdBMUMsMHg0RTAxLDB4NzZFRiwweDUzRUUsMHg5NDg5LDB4OTg3NiwweDlGMEUsMHg5NTJELC8qIDB4QTAtMHhBNyAqLworCTB4NUI5QSwweDhCQTIsMHg0RTIyLDB4NEUxQywweDUxQUMsMHg4NDYzLDB4NjFDMiwweDUyQTgsLyogMHhBOC0weEFGICovCisJMHg2ODBCLDB4NEY5NywweDYwNkIsMHg1MUJCLDB4NkQxRSwweDUxNUMsMHg2Mjk2LDB4NjU5NywvKiAweEIwLTB4QjcgKi8KKwkweDk2NjEsMHg4QzQ2LDB4OTAxNywweDc1RDgsMHg5MEZELDB4Nzc2MywweDZCRDIsMHg3MjhBLC8qIDB4QjgtMHhCRiAqLworCTB4NzJFQywweDhCRkIsMHg1ODM1LDB4Nzc3OSwweDhENEMsMHg2NzVDLDB4OTU0MCwweDgwOUEsLyogMHhDMC0weEM3ICovCisJMHg1RUE2LDB4NkUyMSwweDU5OTIsMHg3QUVGLDB4NzdFRCwweDk1M0IsMHg2QkI1LDB4NjVBRCwvKiAweEM4LTB4Q0YgKi8KKwkweDdGMEUsMHg1ODA2LDB4NTE1MSwweDk2MUYsMHg1QkY5LDB4NThBOSwweDU0MjgsMHg4RTcyLC8qIDB4RDAtMHhENyAqLworCTB4NjU2NiwweDk4N0YsMHg1NkU0LDB4OTQ5RCwweDc2RkUsMHg5MDQxLDB4NjM4NywweDU0QzYsLyogMHhEOC0weERGICovCisJMHg1OTFBLDB4NTkzQSwweDU3OUIsMHg4RUIyLDB4NjczNSwweDhERkEsMHg4MjM1LDB4NTI0MSwvKiAweEUwLTB4RTcgKi8KKwkweDYwRjAsMHg1ODE1LDB4ODZGRSwweDVDRTgsMHg5RTQ1LDB4NEZDNCwweDk4OUQsMHg4QkI5LC8qIDB4RTgtMHhFRiAqLworCTB4NUEyNSwweDYwNzYsMHg1Mzg0LDB4NjI3QywweDkwNEYsMHg5MTAyLDB4OTk3RiwweDYwNjksLyogMHhGMC0weEY3ICovCisJMHg4MDBDLDB4NTEzRiwweDgwMzMsMHg1QzE0LDB4OTk3NSwweDZEMzEsMHg0RThDLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9CN1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDdBMUQsMHg3QTFGLDB4N0EyMSwweDdBMjIsMHg3QTI0LDB4N0EyNSwweDdBMjYsMHg3QTI3LC8qIDB4NDAtMHg0NyAqLworCTB4N0EyOCwweDdBMjksMHg3QTJBLDB4N0EyQiwweDdBMkMsMHg3QTJELDB4N0EyRSwweDdBMkYsLyogMHg0OC0weDRGICovCisJMHg3QTMwLDB4N0EzMSwweDdBMzIsMHg3QTM0LDB4N0EzNSwweDdBMzYsMHg3QTM4LDB4N0EzQSwvKiAweDUwLTB4NTcgKi8KKwkweDdBM0UsMHg3QTQwLDB4N0E0MSwweDdBNDIsMHg3QTQzLDB4N0E0NCwweDdBNDUsMHg3QTQ3LC8qIDB4NTgtMHg1RiAqLworCTB4N0E0OCwweDdBNDksMHg3QTRBLDB4N0E0QiwweDdBNEMsMHg3QTRELDB4N0E0RSwweDdBNEYsLyogMHg2MC0weDY3ICovCisJMHg3QTUwLDB4N0E1MiwweDdBNTMsMHg3QTU0LDB4N0E1NSwweDdBNTYsMHg3QTU4LDB4N0E1OSwvKiAweDY4LTB4NkYgKi8KKwkweDdBNUEsMHg3QTVCLDB4N0E1QywweDdBNUQsMHg3QTVFLDB4N0E1RiwweDdBNjAsMHg3QTYxLC8qIDB4NzAtMHg3NyAqLworCTB4N0E2MiwweDdBNjMsMHg3QTY0LDB4N0E2NSwweDdBNjYsMHg3QTY3LDB4N0E2OCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDdBNjksMHg3QTZBLDB4N0E2QiwweDdBNkMsMHg3QTZELDB4N0E2RSwweDdBNkYsMHg3QTcxLC8qIDB4ODAtMHg4NyAqLworCTB4N0E3MiwweDdBNzMsMHg3QTc1LDB4N0E3QiwweDdBN0MsMHg3QTdELDB4N0E3RSwweDdBODIsLyogMHg4OC0weDhGICovCisJMHg3QTg1LDB4N0E4NywweDdBODksMHg3QThBLDB4N0E4QiwweDdBOEMsMHg3QThFLDB4N0E4RiwvKiAweDkwLTB4OTcgKi8KKwkweDdBOTAsMHg3QTkzLDB4N0E5NCwweDdBOTksMHg3QTlBLDB4N0E5QiwweDdBOUUsMHg3QUExLC8qIDB4OTgtMHg5RiAqLworCTB4N0FBMiwweDhEMzAsMHg1M0QxLDB4N0Y1QSwweDdCNEYsMHg0RjEwLDB4NEU0RiwweDk2MDAsLyogMHhBMC0weEE3ICovCisJMHg2Q0Q1LDB4NzNEMCwweDg1RTksMHg1RTA2LDB4NzU2QSwweDdGRkIsMHg2QTBBLDB4NzdGRSwvKiAweEE4LTB4QUYgKi8KKwkweDk0OTIsMHg3RTQxLDB4NTFFMSwweDcwRTYsMHg1M0NELDB4OEZENCwweDgzMDMsMHg4RDI5LC8qIDB4QjAtMHhCNyAqLworCTB4NzJBRiwweDk5NkQsMHg2Q0RCLDB4NTc0QSwweDgyQjMsMHg2NUI5LDB4ODBBQSwweDYyM0YsLyogMHhCOC0weEJGICovCisJMHg5NjMyLDB4NTlBOCwweDRFRkYsMHg4QkJGLDB4N0VCQSwweDY1M0UsMHg4M0YyLDB4OTc1RSwvKiAweEMwLTB4QzcgKi8KKwkweDU1NjEsMHg5OERFLDB4ODBBNSwweDUzMkEsMHg4QkZELDB4NTQyMCwweDgwQkEsMHg1RTlGLC8qIDB4QzgtMHhDRiAqLworCTB4NkNCOCwweDhEMzksMHg4MkFDLDB4OTE1QSwweDU0MjksMHg2QzFCLDB4NTIwNiwweDdFQjcsLyogMHhEMC0weEQ3ICovCisJMHg1NzVGLDB4NzExQSwweDZDN0UsMHg3Qzg5LDB4NTk0QiwweDRFRkQsMHg1RkZGLDB4NjEyNCwvKiAweEQ4LTB4REYgKi8KKwkweDdDQUEsMHg0RTMwLDB4NUMwMSwweDY3QUIsMHg4NzAyLDB4NUNGMCwweDk1MEIsMHg5OENFLC8qIDB4RTAtMHhFNyAqLworCTB4NzVBRiwweDcwRkQsMHg5MDIyLDB4NTFBRiwweDdGMUQsMHg4QkJELDB4NTk0OSwweDUxRTQsLyogMHhFOC0weEVGICovCisJMHg0RjVCLDB4NTQyNiwweDU5MkIsMHg2NTc3LDB4ODBBNCwweDVCNzUsMHg2Mjc2LDB4NjJDMiwvKiAweEYwLTB4RjcgKi8KKwkweDhGOTAsMHg1RTQ1LDB4NkMxRiwweDdCMjYsMHg0RjBGLDB4NEZEOCwweDY3MEQsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0I4WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4N0FBMywweDdBQTQsMHg3QUE3LDB4N0FBOSwweDdBQUEsMHg3QUFCLDB4N0FBRSwweDdBQUYsLyogMHg0MC0weDQ3ICovCisJMHg3QUIwLDB4N0FCMSwweDdBQjIsMHg3QUI0LDB4N0FCNSwweDdBQjYsMHg3QUI3LDB4N0FCOCwvKiAweDQ4LTB4NEYgKi8KKwkweDdBQjksMHg3QUJBLDB4N0FCQiwweDdBQkMsMHg3QUJELDB4N0FCRSwweDdBQzAsMHg3QUMxLC8qIDB4NTAtMHg1NyAqLworCTB4N0FDMiwweDdBQzMsMHg3QUM0LDB4N0FDNSwweDdBQzYsMHg3QUM3LDB4N0FDOCwweDdBQzksLyogMHg1OC0weDVGICovCisJMHg3QUNBLDB4N0FDQywweDdBQ0QsMHg3QUNFLDB4N0FDRiwweDdBRDAsMHg3QUQxLDB4N0FEMiwvKiAweDYwLTB4NjcgKi8KKwkweDdBRDMsMHg3QUQ0LDB4N0FENSwweDdBRDcsMHg3QUQ4LDB4N0FEQSwweDdBREIsMHg3QURDLC8qIDB4NjgtMHg2RiAqLworCTB4N0FERCwweDdBRTEsMHg3QUUyLDB4N0FFNCwweDdBRTcsMHg3QUU4LDB4N0FFOSwweDdBRUEsLyogMHg3MC0weDc3ICovCisJMHg3QUVCLDB4N0FFQywweDdBRUUsMHg3QUYwLDB4N0FGMSwweDdBRjIsMHg3QUYzLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4N0FGNCwweDdBRjUsMHg3QUY2LDB4N0FGNywweDdBRjgsMHg3QUZCLDB4N0FGQywweDdBRkUsLyogMHg4MC0weDg3ICovCisJMHg3QjAwLDB4N0IwMSwweDdCMDIsMHg3QjA1LDB4N0IwNywweDdCMDksMHg3QjBDLDB4N0IwRCwvKiAweDg4LTB4OEYgKi8KKwkweDdCMEUsMHg3QjEwLDB4N0IxMiwweDdCMTMsMHg3QjE2LDB4N0IxNywweDdCMTgsMHg3QjFBLC8qIDB4OTAtMHg5NyAqLworCTB4N0IxQywweDdCMUQsMHg3QjFGLDB4N0IyMSwweDdCMjIsMHg3QjIzLDB4N0IyNywweDdCMjksLyogMHg5OC0weDlGICovCisJMHg3QjJELDB4NkQ2RSwweDZEQUEsMHg3OThGLDB4ODhCMSwweDVGMTcsMHg3NTJCLDB4NjI5QSwvKiAweEEwLTB4QTcgKi8KKwkweDhGODUsMHg0RkVGLDB4OTFEQywweDY1QTcsMHg4MTJGLDB4ODE1MSwweDVFOUMsMHg4MTUwLC8qIDB4QTgtMHhBRiAqLworCTB4OEQ3NCwweDUyNkYsMHg4OTg2LDB4OEQ0QiwweDU5MEQsMHg1MDg1LDB4NEVEOCwweDk2MUMsLyogMHhCMC0weEI3ICovCisJMHg3MjM2LDB4ODE3OSwweDhEMUYsMHg1QkNDLDB4OEJBMywweDk2NDQsMHg1OTg3LDB4N0YxQSwvKiAweEI4LTB4QkYgKi8KKwkweDU0OTAsMHg1Njc2LDB4NTYwRSwweDhCRTUsMHg2NTM5LDB4Njk4MiwweDk0OTksMHg3NkQ2LC8qIDB4QzAtMHhDNyAqLworCTB4NkU4OSwweDVFNzIsMHg3NTE4LDB4Njc0NiwweDY3RDEsMHg3QUZGLDB4ODA5RCwweDhENzYsLyogMHhDOC0weENGICovCisJMHg2MTFGLDB4NzlDNiwweDY1NjIsMHg4RDYzLDB4NTE4OCwweDUyMUEsMHg5NEEyLDB4N0YzOCwvKiAweEQwLTB4RDcgKi8KKwkweDgwOUIsMHg3RUIyLDB4NUM5NywweDZFMkYsMHg2NzYwLDB4N0JEOSwweDc2OEIsMHg5QUQ4LC8qIDB4RDgtMHhERiAqLworCTB4ODE4RiwweDdGOTQsMHg3Q0Q1LDB4NjQxRSwweDk1NTAsMHg3QTNGLDB4NTQ0QSwweDU0RTUsLyogMHhFMC0weEU3ICovCisJMHg2QjRDLDB4NjQwMSwweDYyMDgsMHg5RTNELDB4ODBGMywweDc1OTksMHg1MjcyLDB4OTc2OSwvKiAweEU4LTB4RUYgKi8KKwkweDg0NUIsMHg2ODNDLDB4ODZFNCwweDk2MDEsMHg5Njk0LDB4OTRFQywweDRFMkEsMHg1NDA0LC8qIDB4RjAtMHhGNyAqLworCTB4N0VEOSwweDY4MzksMHg4RERGLDB4ODAxNSwweDY2RjQsMHg1RTlBLDB4N0ZCOSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQjlbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg3QjJGLDB4N0IzMCwweDdCMzIsMHg3QjM0LDB4N0IzNSwweDdCMzYsMHg3QjM3LDB4N0IzOSwvKiAweDQwLTB4NDcgKi8KKwkweDdCM0IsMHg3QjNELDB4N0IzRiwweDdCNDAsMHg3QjQxLDB4N0I0MiwweDdCNDMsMHg3QjQ0LC8qIDB4NDgtMHg0RiAqLworCTB4N0I0NiwweDdCNDgsMHg3QjRBLDB4N0I0RCwweDdCNEUsMHg3QjUzLDB4N0I1NSwweDdCNTcsLyogMHg1MC0weDU3ICovCisJMHg3QjU5LDB4N0I1QywweDdCNUUsMHg3QjVGLDB4N0I2MSwweDdCNjMsMHg3QjY0LDB4N0I2NSwvKiAweDU4LTB4NUYgKi8KKwkweDdCNjYsMHg3QjY3LDB4N0I2OCwweDdCNjksMHg3QjZBLDB4N0I2QiwweDdCNkMsMHg3QjZELC8qIDB4NjAtMHg2NyAqLworCTB4N0I2RiwweDdCNzAsMHg3QjczLDB4N0I3NCwweDdCNzYsMHg3Qjc4LDB4N0I3QSwweDdCN0MsLyogMHg2OC0weDZGICovCisJMHg3QjdELDB4N0I3RiwweDdCODEsMHg3QjgyLDB4N0I4MywweDdCODQsMHg3Qjg2LDB4N0I4NywvKiAweDcwLTB4NzcgKi8KKwkweDdCODgsMHg3Qjg5LDB4N0I4QSwweDdCOEIsMHg3QjhDLDB4N0I4RSwweDdCOEYsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg3QjkxLDB4N0I5MiwweDdCOTMsMHg3Qjk2LDB4N0I5OCwweDdCOTksMHg3QjlBLDB4N0I5QiwvKiAweDgwLTB4ODcgKi8KKwkweDdCOUUsMHg3QjlGLDB4N0JBMCwweDdCQTMsMHg3QkE0LDB4N0JBNSwweDdCQUUsMHg3QkFGLC8qIDB4ODgtMHg4RiAqLworCTB4N0JCMCwweDdCQjIsMHg3QkIzLDB4N0JCNSwweDdCQjYsMHg3QkI3LDB4N0JCOSwweDdCQkEsLyogMHg5MC0weDk3ICovCisJMHg3QkJCLDB4N0JCQywweDdCQkQsMHg3QkJFLDB4N0JCRiwweDdCQzAsMHg3QkMyLDB4N0JDMywvKiAweDk4LTB4OUYgKi8KKwkweDdCQzQsMHg1N0MyLDB4ODAzRiwweDY4OTcsMHg1REU1LDB4NjUzQiwweDUyOUYsMHg2MDZELC8qIDB4QTAtMHhBNyAqLworCTB4OUY5QSwweDRGOUIsMHg4RUFDLDB4NTE2QywweDVCQUIsMHg1RjEzLDB4NURFOSwweDZDNUUsLyogMHhBOC0weEFGICovCisJMHg2MkYxLDB4OEQyMSwweDUxNzEsMHg5NEE5LDB4NTJGRSwweDZDOUYsMHg4MkRGLDB4NzJENywvKiAweEIwLTB4QjcgKi8KKwkweDU3QTIsMHg2Nzg0LDB4OEQyRCwweDU5MUYsMHg4RjlDLDB4ODNDNywweDU0OTUsMHg3QjhELC8qIDB4QjgtMHhCRiAqLworCTB4NEYzMCwweDZDQkQsMHg1QjY0LDB4NTlEMSwweDlGMTMsMHg1M0U0LDB4ODZDQSwweDlBQTgsLyogMHhDMC0weEM3ICovCisJMHg4QzM3LDB4ODBBMSwweDY1NDUsMHg5ODdFLDB4NTZGQSwweDk2QzcsMHg1MjJFLDB4NzREQywvKiAweEM4LTB4Q0YgKi8KKwkweDUyNTAsMHg1QkUxLDB4NjMwMiwweDg5MDIsMHg0RTU2LDB4NjJEMCwweDYwMkEsMHg2OEZBLC8qIDB4RDAtMHhENyAqLworCTB4NTE3MywweDVCOTgsMHg1MUEwLDB4ODlDMiwweDdCQTEsMHg5OTg2LDB4N0Y1MCwweDYwRUYsLyogMHhEOC0weERGICovCisJMHg3MDRDLDB4OEQyRiwweDUxNDksMHg1RTdGLDB4OTAxQiwweDc0NzAsMHg4OUM0LDB4NTcyRCwvKiAweEUwLTB4RTcgKi8KKwkweDc4NDUsMHg1RjUyLDB4OUY5RiwweDk1RkEsMHg4RjY4LDB4OUIzQywweDhCRTEsMHg3Njc4LC8qIDB4RTgtMHhFRiAqLworCTB4Njg0MiwweDY3REMsMHg4REVBLDB4OEQzNSwweDUyM0QsMHg4RjhBLDB4NkVEQSwweDY4Q0QsLyogMHhGMC0weEY3ICovCisJMHg5NTA1LDB4OTBFRCwweDU2RkQsMHg2NzlDLDB4ODhGOSwweDhGQzcsMHg1NEM4LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9CQVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDdCQzUsMHg3QkM4LDB4N0JDOSwweDdCQ0EsMHg3QkNCLDB4N0JDRCwweDdCQ0UsMHg3QkNGLC8qIDB4NDAtMHg0NyAqLworCTB4N0JEMCwweDdCRDIsMHg3QkQ0LDB4N0JENSwweDdCRDYsMHg3QkQ3LDB4N0JEOCwweDdCREIsLyogMHg0OC0weDRGICovCisJMHg3QkRDLDB4N0JERSwweDdCREYsMHg3QkUwLDB4N0JFMiwweDdCRTMsMHg3QkU0LDB4N0JFNywvKiAweDUwLTB4NTcgKi8KKwkweDdCRTgsMHg3QkU5LDB4N0JFQiwweDdCRUMsMHg3QkVELDB4N0JFRiwweDdCRjAsMHg3QkYyLC8qIDB4NTgtMHg1RiAqLworCTB4N0JGMywweDdCRjQsMHg3QkY1LDB4N0JGNiwweDdCRjgsMHg3QkY5LDB4N0JGQSwweDdCRkIsLyogMHg2MC0weDY3ICovCisJMHg3QkZELDB4N0JGRiwweDdDMDAsMHg3QzAxLDB4N0MwMiwweDdDMDMsMHg3QzA0LDB4N0MwNSwvKiAweDY4LTB4NkYgKi8KKwkweDdDMDYsMHg3QzA4LDB4N0MwOSwweDdDMEEsMHg3QzBELDB4N0MwRSwweDdDMTAsMHg3QzExLC8qIDB4NzAtMHg3NyAqLworCTB4N0MxMiwweDdDMTMsMHg3QzE0LDB4N0MxNSwweDdDMTcsMHg3QzE4LDB4N0MxOSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDdDMUEsMHg3QzFCLDB4N0MxQywweDdDMUQsMHg3QzFFLDB4N0MyMCwweDdDMjEsMHg3QzIyLC8qIDB4ODAtMHg4NyAqLworCTB4N0MyMywweDdDMjQsMHg3QzI1LDB4N0MyOCwweDdDMjksMHg3QzJCLDB4N0MyQywweDdDMkQsLyogMHg4OC0weDhGICovCisJMHg3QzJFLDB4N0MyRiwweDdDMzAsMHg3QzMxLDB4N0MzMiwweDdDMzMsMHg3QzM0LDB4N0MzNSwvKiAweDkwLTB4OTcgKi8KKwkweDdDMzYsMHg3QzM3LDB4N0MzOSwweDdDM0EsMHg3QzNCLDB4N0MzQywweDdDM0QsMHg3QzNFLC8qIDB4OTgtMHg5RiAqLworCTB4N0M0MiwweDlBQjgsMHg1QjY5LDB4NkQ3NywweDZDMjYsMHg0RUE1LDB4NUJCMywweDlBODcsLyogMHhBMC0weEE3ICovCisJMHg5MTYzLDB4NjFBOCwweDkwQUYsMHg5N0U5LDB4NTQyQiwweDZEQjUsMHg1QkQyLDB4NTFGRCwvKiAweEE4LTB4QUYgKi8KKwkweDU1OEEsMHg3RjU1LDB4N0ZGMCwweDY0QkMsMHg2MzRELDB4NjVGMSwweDYxQkUsMHg2MDhELC8qIDB4QjAtMHhCNyAqLworCTB4NzEwQSwweDZDNTcsMHg2QzQ5LDB4NTkyRiwweDY3NkQsMHg4MjJBLDB4NThENSwweDU2OEUsLyogMHhCOC0weEJGICovCisJMHg4QzZBLDB4NkJFQiwweDkwREQsMHg1OTdELDB4ODAxNywweDUzRjcsMHg2RDY5LDB4NTQ3NSwvKiAweEMwLTB4QzcgKi8KKwkweDU1OUQsMHg4Mzc3LDB4ODNDRiwweDY4MzgsMHg3OUJFLDB4NTQ4QywweDRGNTUsMHg1NDA4LC8qIDB4QzgtMHhDRiAqLworCTB4NzZEMiwweDhDODksMHg5NjAyLDB4NkNCMywweDZEQjgsMHg4RDZCLDB4ODkxMCwweDlFNjQsLyogMHhEMC0weEQ3ICovCisJMHg4RDNBLDB4NTYzRiwweDlFRDEsMHg3NUQ1LDB4NUY4OCwweDcyRTAsMHg2MDY4LDB4NTRGQywvKiAweEQ4LTB4REYgKi8KKwkweDRFQTgsMHg2QTJBLDB4ODg2MSwweDYwNTIsMHg4RjcwLDB4NTRDNCwweDcwRDgsMHg4Njc5LC8qIDB4RTAtMHhFNyAqLworCTB4OUUzRiwweDZEMkEsMHg1QjhGLDB4NUYxOCwweDdFQTIsMHg1NTg5LDB4NEZBRiwweDczMzQsLyogMHhFOC0weEVGICovCisJMHg1NDNDLDB4NTM5QSwweDUwMTksMHg1NDBFLDB4NTQ3QywweDRFNEUsMHg1RkZELDB4NzQ1QSwvKiAweEYwLTB4RjcgKi8KKwkweDU4RjYsMHg4NDZCLDB4ODBFMSwweDg3NzQsMHg3MkQwLDB4N0NDQSwweDZFNTYsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0JCWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4N0M0MywweDdDNDQsMHg3QzQ1LDB4N0M0NiwweDdDNDcsMHg3QzQ4LDB4N0M0OSwweDdDNEEsLyogMHg0MC0weDQ3ICovCisJMHg3QzRCLDB4N0M0QywweDdDNEUsMHg3QzRGLDB4N0M1MCwweDdDNTEsMHg3QzUyLDB4N0M1MywvKiAweDQ4LTB4NEYgKi8KKwkweDdDNTQsMHg3QzU1LDB4N0M1NiwweDdDNTcsMHg3QzU4LDB4N0M1OSwweDdDNUEsMHg3QzVCLC8qIDB4NTAtMHg1NyAqLworCTB4N0M1QywweDdDNUQsMHg3QzVFLDB4N0M1RiwweDdDNjAsMHg3QzYxLDB4N0M2MiwweDdDNjMsLyogMHg1OC0weDVGICovCisJMHg3QzY0LDB4N0M2NSwweDdDNjYsMHg3QzY3LDB4N0M2OCwweDdDNjksMHg3QzZBLDB4N0M2QiwvKiAweDYwLTB4NjcgKi8KKwkweDdDNkMsMHg3QzZELDB4N0M2RSwweDdDNkYsMHg3QzcwLDB4N0M3MSwweDdDNzIsMHg3Qzc1LC8qIDB4NjgtMHg2RiAqLworCTB4N0M3NiwweDdDNzcsMHg3Qzc4LDB4N0M3OSwweDdDN0EsMHg3QzdFLDB4N0M3RiwweDdDODAsLyogMHg3MC0weDc3ICovCisJMHg3QzgxLDB4N0M4MiwweDdDODMsMHg3Qzg0LDB4N0M4NSwweDdDODYsMHg3Qzg3LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4N0M4OCwweDdDOEEsMHg3QzhCLDB4N0M4QywweDdDOEQsMHg3QzhFLDB4N0M4RiwweDdDOTAsLyogMHg4MC0weDg3ICovCisJMHg3QzkzLDB4N0M5NCwweDdDOTYsMHg3Qzk5LDB4N0M5QSwweDdDOUIsMHg3Q0EwLDB4N0NBMSwvKiAweDg4LTB4OEYgKi8KKwkweDdDQTMsMHg3Q0E2LDB4N0NBNywweDdDQTgsMHg3Q0E5LDB4N0NBQiwweDdDQUMsMHg3Q0FELC8qIDB4OTAtMHg5NyAqLworCTB4N0NBRiwweDdDQjAsMHg3Q0I0LDB4N0NCNSwweDdDQjYsMHg3Q0I3LDB4N0NCOCwweDdDQkEsLyogMHg5OC0weDlGICovCisJMHg3Q0JCLDB4NUYyNywweDg2NEUsMHg1NTJDLDB4NjJBNCwweDRFOTIsMHg2Q0FBLDB4NjIzNywvKiAweEEwLTB4QTcgKi8KKwkweDgyQjEsMHg1NEQ3LDB4NTM0RSwweDczM0UsMHg2RUQxLDB4NzUzQiwweDUyMTIsMHg1MzE2LC8qIDB4QTgtMHhBRiAqLworCTB4OEJERCwweDY5RDAsMHg1RjhBLDB4NjAwMCwweDZERUUsMHg1NzRGLDB4NkIyMiwweDczQUYsLyogMHhCMC0weEI3ICovCisJMHg2ODUzLDB4OEZEOCwweDdGMTMsMHg2MzYyLDB4NjBBMywweDU1MjQsMHg3NUVBLDB4OEM2MiwvKiAweEI4LTB4QkYgKi8KKwkweDcxMTUsMHg2REEzLDB4NUJBNiwweDVFN0IsMHg4MzUyLDB4NjE0QywweDlFQzQsMHg3OEZBLC8qIDB4QzAtMHhDNyAqLworCTB4ODc1NywweDdDMjcsMHg3Njg3LDB4NTFGMCwweDYwRjYsMHg3MTRDLDB4NjY0MywweDVFNEMsLyogMHhDOC0weENGICovCisJMHg2MDRELDB4OEMwRSwweDcwNzAsMHg2MzI1LDB4OEY4OSwweDVGQkQsMHg2MDYyLDB4ODZENCwvKiAweEQwLTB4RDcgKi8KKwkweDU2REUsMHg2QkMxLDB4NjA5NCwweDYxNjcsMHg1MzQ5LDB4NjBFMCwweDY2NjYsMHg4RDNGLC8qIDB4RDgtMHhERiAqLworCTB4NzlGRCwweDRGMUEsMHg3MEU5LDB4NkM0NywweDhCQjMsMHg4QkYyLDB4N0VEOCwweDgzNjQsLyogMHhFMC0weEU3ICovCisJMHg2NjBGLDB4NUE1QSwweDlCNDIsMHg2RDUxLDB4NkRGNywweDhDNDEsMHg2RDNCLDB4NEYxOSwvKiAweEU4LTB4RUYgKi8KKwkweDcwNkIsMHg4M0I3LDB4NjIxNiwweDYwRDEsMHg5NzBELDB4OEQyNywweDc5NzgsMHg1MUZCLC8qIDB4RjAtMHhGNyAqLworCTB4NTczRSwweDU3RkEsMHg2NzNBLDB4NzU3OCwweDdBM0QsMHg3OUVGLDB4N0I5NSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQkNbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg3Q0JGLDB4N0NDMCwweDdDQzIsMHg3Q0MzLDB4N0NDNCwweDdDQzYsMHg3Q0M5LDB4N0NDQiwvKiAweDQwLTB4NDcgKi8KKwkweDdDQ0UsMHg3Q0NGLDB4N0NEMCwweDdDRDEsMHg3Q0QyLDB4N0NEMywweDdDRDQsMHg3Q0Q4LC8qIDB4NDgtMHg0RiAqLworCTB4N0NEQSwweDdDREIsMHg3Q0RELDB4N0NERSwweDdDRTEsMHg3Q0UyLDB4N0NFMywweDdDRTQsLyogMHg1MC0weDU3ICovCisJMHg3Q0U1LDB4N0NFNiwweDdDRTcsMHg3Q0U5LDB4N0NFQSwweDdDRUIsMHg3Q0VDLDB4N0NFRCwvKiAweDU4LTB4NUYgKi8KKwkweDdDRUUsMHg3Q0YwLDB4N0NGMSwweDdDRjIsMHg3Q0YzLDB4N0NGNCwweDdDRjUsMHg3Q0Y2LC8qIDB4NjAtMHg2NyAqLworCTB4N0NGNywweDdDRjksMHg3Q0ZBLDB4N0NGQywweDdDRkQsMHg3Q0ZFLDB4N0NGRiwweDdEMDAsLyogMHg2OC0weDZGICovCisJMHg3RDAxLDB4N0QwMiwweDdEMDMsMHg3RDA0LDB4N0QwNSwweDdEMDYsMHg3RDA3LDB4N0QwOCwvKiAweDcwLTB4NzcgKi8KKwkweDdEMDksMHg3RDBCLDB4N0QwQywweDdEMEQsMHg3RDBFLDB4N0QwRiwweDdEMTAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg3RDExLDB4N0QxMiwweDdEMTMsMHg3RDE0LDB4N0QxNSwweDdEMTYsMHg3RDE3LDB4N0QxOCwvKiAweDgwLTB4ODcgKi8KKwkweDdEMTksMHg3RDFBLDB4N0QxQiwweDdEMUMsMHg3RDFELDB4N0QxRSwweDdEMUYsMHg3RDIxLC8qIDB4ODgtMHg4RiAqLworCTB4N0QyMywweDdEMjQsMHg3RDI1LDB4N0QyNiwweDdEMjgsMHg3RDI5LDB4N0QyQSwweDdEMkMsLyogMHg5MC0weDk3ICovCisJMHg3RDJELDB4N0QyRSwweDdEMzAsMHg3RDMxLDB4N0QzMiwweDdEMzMsMHg3RDM0LDB4N0QzNSwvKiAweDk4LTB4OUYgKi8KKwkweDdEMzYsMHg4MDhDLDB4OTk2NSwweDhGRjksMHg2RkMwLDB4OEJBNSwweDlFMjEsMHg1OUVDLC8qIDB4QTAtMHhBNyAqLworCTB4N0VFOSwweDdGMDksMHg1NDA5LDB4Njc4MSwweDY4RDgsMHg4RjkxLDB4N0M0RCwweDk2QzYsLyogMHhBOC0weEFGICovCisJMHg1M0NBLDB4NjAyNSwweDc1QkUsMHg2QzcyLDB4NTM3MywweDVBQzksMHg3RUE3LDB4NjMyNCwvKiAweEIwLTB4QjcgKi8KKwkweDUxRTAsMHg4MTBBLDB4NURGMSwweDg0REYsMHg2MjgwLDB4NTE4MCwweDVCNjMsMHg0RjBFLC8qIDB4QjgtMHhCRiAqLworCTB4Nzk2RCwweDUyNDIsMHg2MEI4LDB4NkQ0RSwweDVCQzQsMHg1QkMyLDB4OEJBMSwweDhCQjAsLyogMHhDMC0weEM3ICovCisJMHg2NUUyLDB4NUZDQywweDk2NDUsMHg1OTkzLDB4N0VFNywweDdFQUEsMHg1NjA5LDB4NjdCNywvKiAweEM4LTB4Q0YgKi8KKwkweDU5MzksMHg0RjczLDB4NUJCNiwweDUyQTAsMHg4MzVBLDB4OTg4QSwweDhEM0UsMHg3NTMyLC8qIDB4RDAtMHhENyAqLworCTB4OTRCRSwweDUwNDcsMHg3QTNDLDB4NEVGNywweDY3QjYsMHg5QTdFLDB4NUFDMSwweDZCN0MsLyogMHhEOC0weERGICovCisJMHg3NkQxLDB4NTc1QSwweDVDMTYsMHg3QjNBLDB4OTVGNCwweDcxNEUsMHg1MTdDLDB4ODBBOSwvKiAweEUwLTB4RTcgKi8KKwkweDgyNzAsMHg1OTc4LDB4N0YwNCwweDgzMjcsMHg2OEMwLDB4NjdFQywweDc4QjEsMHg3ODc3LC8qIDB4RTgtMHhFRiAqLworCTB4NjJFMywweDYzNjEsMHg3QjgwLDB4NEZFRCwweDUyNkEsMHg1MUNGLDB4ODM1MCwweDY5REIsLyogMHhGMC0weEY3ICovCisJMHg5Mjc0LDB4OERGNSwweDhEMzEsMHg4OUMxLDB4OTUyRSwweDdCQUQsMHg0RUY2LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9CRFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDdEMzcsMHg3RDM4LDB4N0QzOSwweDdEM0EsMHg3RDNCLDB4N0QzQywweDdEM0QsMHg3RDNFLC8qIDB4NDAtMHg0NyAqLworCTB4N0QzRiwweDdENDAsMHg3RDQxLDB4N0Q0MiwweDdENDMsMHg3RDQ0LDB4N0Q0NSwweDdENDYsLyogMHg0OC0weDRGICovCisJMHg3RDQ3LDB4N0Q0OCwweDdENDksMHg3RDRBLDB4N0Q0QiwweDdENEMsMHg3RDRELDB4N0Q0RSwvKiAweDUwLTB4NTcgKi8KKwkweDdENEYsMHg3RDUwLDB4N0Q1MSwweDdENTIsMHg3RDUzLDB4N0Q1NCwweDdENTUsMHg3RDU2LC8qIDB4NTgtMHg1RiAqLworCTB4N0Q1NywweDdENTgsMHg3RDU5LDB4N0Q1QSwweDdENUIsMHg3RDVDLDB4N0Q1RCwweDdENUUsLyogMHg2MC0weDY3ICovCisJMHg3RDVGLDB4N0Q2MCwweDdENjEsMHg3RDYyLDB4N0Q2MywweDdENjQsMHg3RDY1LDB4N0Q2NiwvKiAweDY4LTB4NkYgKi8KKwkweDdENjcsMHg3RDY4LDB4N0Q2OSwweDdENkEsMHg3RDZCLDB4N0Q2QywweDdENkQsMHg3RDZGLC8qIDB4NzAtMHg3NyAqLworCTB4N0Q3MCwweDdENzEsMHg3RDcyLDB4N0Q3MywweDdENzQsMHg3RDc1LDB4N0Q3NiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDdENzgsMHg3RDc5LDB4N0Q3QSwweDdEN0IsMHg3RDdDLDB4N0Q3RCwweDdEN0UsMHg3RDdGLC8qIDB4ODAtMHg4NyAqLworCTB4N0Q4MCwweDdEODEsMHg3RDgyLDB4N0Q4MywweDdEODQsMHg3RDg1LDB4N0Q4NiwweDdEODcsLyogMHg4OC0weDhGICovCisJMHg3RDg4LDB4N0Q4OSwweDdEOEEsMHg3RDhCLDB4N0Q4QywweDdEOEQsMHg3RDhFLDB4N0Q4RiwvKiAweDkwLTB4OTcgKi8KKwkweDdEOTAsMHg3RDkxLDB4N0Q5MiwweDdEOTMsMHg3RDk0LDB4N0Q5NSwweDdEOTYsMHg3RDk3LC8qIDB4OTgtMHg5RiAqLworCTB4N0Q5OCwweDUwNjUsMHg4MjMwLDB4NTI1MSwweDk5NkYsMHg2RTEwLDB4NkU4NSwweDZEQTcsLyogMHhBMC0weEE3ICovCisJMHg1RUZBLDB4NTBGNSwweDU5REMsMHg1QzA2LDB4NkQ0NiwweDZDNUYsMHg3NTg2LDB4ODQ4QiwvKiAweEE4LTB4QUYgKi8KKwkweDY4NjgsMHg1OTU2LDB4OEJCMiwweDUzMjAsMHg5MTcxLDB4OTY0RCwweDg1NDksMHg2OTEyLC8qIDB4QjAtMHhCNyAqLworCTB4NzkwMSwweDcxMjYsMHg4MEY2LDB4NEVBNCwweDkwQ0EsMHg2RDQ3LDB4OUE4NCwweDVBMDcsLyogMHhCOC0weEJGICovCisJMHg1NkJDLDB4NjQwNSwweDk0RjAsMHg3N0VCLDB4NEZBNSwweDgxMUEsMHg3MkUxLDB4ODlEMiwvKiAweEMwLTB4QzcgKi8KKwkweDk5N0EsMHg3RjM0LDB4N0VERSwweDUyN0YsMHg2NTU5LDB4OTE3NSwweDhGN0YsMHg4RjgzLC8qIDB4QzgtMHhDRiAqLworCTB4NTNFQiwweDdBOTYsMHg2M0VELDB4NjNBNSwweDc2ODYsMHg3OUY4LDB4ODg1NywweDk2MzYsLyogMHhEMC0weEQ3ICovCisJMHg2MjJBLDB4NTJBQiwweDgyODIsMHg2ODU0LDB4Njc3MCwweDYzNzcsMHg3NzZCLDB4N0FFRCwvKiAweEQ4LTB4REYgKi8KKwkweDZEMDEsMHg3RUQzLDB4ODlFMywweDU5RDAsMHg2MjEyLDB4ODVDOSwweDgyQTUsMHg3NTRDLC8qIDB4RTAtMHhFNyAqLworCTB4NTAxRiwweDRFQ0IsMHg3NUE1LDB4OEJFQiwweDVDNEEsMHg1REZFLDB4N0I0QiwweDY1QTQsLyogMHhFOC0weEVGICovCisJMHg5MUQxLDB4NEVDQSwweDZEMjUsMHg4OTVGLDB4N0QyNywweDk1MjYsMHg0RUM1LDB4OEMyOCwvKiAweEYwLTB4RjcgKi8KKwkweDhGREIsMHg5NzczLDB4NjY0QiwweDc5ODEsMHg4RkQxLDB4NzBFQywweDZENzgsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0JFWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4N0Q5OSwweDdEOUEsMHg3RDlCLDB4N0Q5QywweDdEOUQsMHg3RDlFLDB4N0Q5RiwweDdEQTAsLyogMHg0MC0weDQ3ICovCisJMHg3REExLDB4N0RBMiwweDdEQTMsMHg3REE0LDB4N0RBNSwweDdEQTcsMHg3REE4LDB4N0RBOSwvKiAweDQ4LTB4NEYgKi8KKwkweDdEQUEsMHg3REFCLDB4N0RBQywweDdEQUQsMHg3REFGLDB4N0RCMCwweDdEQjEsMHg3REIyLC8qIDB4NTAtMHg1NyAqLworCTB4N0RCMywweDdEQjQsMHg3REI1LDB4N0RCNiwweDdEQjcsMHg3REI4LDB4N0RCOSwweDdEQkEsLyogMHg1OC0weDVGICovCisJMHg3REJCLDB4N0RCQywweDdEQkQsMHg3REJFLDB4N0RCRiwweDdEQzAsMHg3REMxLDB4N0RDMiwvKiAweDYwLTB4NjcgKi8KKwkweDdEQzMsMHg3REM0LDB4N0RDNSwweDdEQzYsMHg3REM3LDB4N0RDOCwweDdEQzksMHg3RENBLC8qIDB4NjgtMHg2RiAqLworCTB4N0RDQiwweDdEQ0MsMHg3RENELDB4N0RDRSwweDdEQ0YsMHg3REQwLDB4N0REMSwweDdERDIsLyogMHg3MC0weDc3ICovCisJMHg3REQzLDB4N0RENCwweDdERDUsMHg3REQ2LDB4N0RENywweDdERDgsMHg3REQ5LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4N0REQSwweDdEREIsMHg3RERDLDB4N0RERCwweDdEREUsMHg3RERGLDB4N0RFMCwweDdERTEsLyogMHg4MC0weDg3ICovCisJMHg3REUyLDB4N0RFMywweDdERTQsMHg3REU1LDB4N0RFNiwweDdERTcsMHg3REU4LDB4N0RFOSwvKiAweDg4LTB4OEYgKi8KKwkweDdERUEsMHg3REVCLDB4N0RFQywweDdERUQsMHg3REVFLDB4N0RFRiwweDdERjAsMHg3REYxLC8qIDB4OTAtMHg5NyAqLworCTB4N0RGMiwweDdERjMsMHg3REY0LDB4N0RGNSwweDdERjYsMHg3REY3LDB4N0RGOCwweDdERjksLyogMHg5OC0weDlGICovCisJMHg3REZBLDB4NUMzRCwweDUyQjIsMHg4MzQ2LDB4NTE2MiwweDgzMEUsMHg3NzVCLDB4NjY3NiwvKiAweEEwLTB4QTcgKi8KKwkweDlDQjgsMHg0RUFDLDB4NjBDQSwweDdDQkUsMHg3Q0IzLDB4N0VDRiwweDRFOTUsMHg4QjY2LC8qIDB4QTgtMHhBRiAqLworCTB4NjY2RiwweDk4ODgsMHg5NzU5LDB4NTg4MywweDY1NkMsMHg5NTVDLDB4NUY4NCwweDc1QzksLyogMHhCMC0weEI3ICovCisJMHg5NzU2LDB4N0FERiwweDdBREUsMHg1MUMwLDB4NzBBRiwweDdBOTgsMHg2M0VBLDB4N0E3NiwvKiAweEI4LTB4QkYgKi8KKwkweDdFQTAsMHg3Mzk2LDB4OTdFRCwweDRFNDUsMHg3MDc4LDB4NEU1RCwweDkxNTIsMHg1M0E5LC8qIDB4QzAtMHhDNyAqLworCTB4NjU1MSwweDY1RTcsMHg4MUZDLDB4ODIwNSwweDU0OEUsMHg1QzMxLDB4NzU5QSwweDk3QTAsLyogMHhDOC0weENGICovCisJMHg2MkQ4LDB4NzJEOSwweDc1QkQsMHg1QzQ1LDB4OUE3OSwweDgzQ0EsMHg1QzQwLDB4NTQ4MCwvKiAweEQwLTB4RDcgKi8KKwkweDc3RTksMHg0RTNFLDB4NkNBRSwweDgwNUEsMHg2MkQyLDB4NjM2RSwweDVERTgsMHg1MTc3LC8qIDB4RDgtMHhERiAqLworCTB4OERERCwweDhFMUUsMHg5NTJGLDB4NEZGMSwweDUzRTUsMHg2MEU3LDB4NzBBQywweDUyNjcsLyogMHhFMC0weEU3ICovCisJMHg2MzUwLDB4OUU0MywweDVBMUYsMHg1MDI2LDB4NzczNywweDUzNzcsMHg3RUUyLDB4NjQ4NSwvKiAweEU4LTB4RUYgKi8KKwkweDY1MkIsMHg2Mjg5LDB4NjM5OCwweDUwMTQsMHg3MjM1LDB4ODlDOSwweDUxQjMsMHg4QkMwLC8qIDB4RjAtMHhGNyAqLworCTB4N0VERCwweDU3NDcsMHg4M0NDLDB4OTRBNywweDUxOUIsMHg1NDFCLDB4NUNGQiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQkZbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg3REZCLDB4N0RGQywweDdERkQsMHg3REZFLDB4N0RGRiwweDdFMDAsMHg3RTAxLDB4N0UwMiwvKiAweDQwLTB4NDcgKi8KKwkweDdFMDMsMHg3RTA0LDB4N0UwNSwweDdFMDYsMHg3RTA3LDB4N0UwOCwweDdFMDksMHg3RTBBLC8qIDB4NDgtMHg0RiAqLworCTB4N0UwQiwweDdFMEMsMHg3RTBELDB4N0UwRSwweDdFMEYsMHg3RTEwLDB4N0UxMSwweDdFMTIsLyogMHg1MC0weDU3ICovCisJMHg3RTEzLDB4N0UxNCwweDdFMTUsMHg3RTE2LDB4N0UxNywweDdFMTgsMHg3RTE5LDB4N0UxQSwvKiAweDU4LTB4NUYgKi8KKwkweDdFMUIsMHg3RTFDLDB4N0UxRCwweDdFMUUsMHg3RTFGLDB4N0UyMCwweDdFMjEsMHg3RTIyLC8qIDB4NjAtMHg2NyAqLworCTB4N0UyMywweDdFMjQsMHg3RTI1LDB4N0UyNiwweDdFMjcsMHg3RTI4LDB4N0UyOSwweDdFMkEsLyogMHg2OC0weDZGICovCisJMHg3RTJCLDB4N0UyQywweDdFMkQsMHg3RTJFLDB4N0UyRiwweDdFMzAsMHg3RTMxLDB4N0UzMiwvKiAweDcwLTB4NzcgKi8KKwkweDdFMzMsMHg3RTM0LDB4N0UzNSwweDdFMzYsMHg3RTM3LDB4N0UzOCwweDdFMzksMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg3RTNBLDB4N0UzQywweDdFM0QsMHg3RTNFLDB4N0UzRiwweDdFNDAsMHg3RTQyLDB4N0U0MywvKiAweDgwLTB4ODcgKi8KKwkweDdFNDQsMHg3RTQ1LDB4N0U0NiwweDdFNDgsMHg3RTQ5LDB4N0U0QSwweDdFNEIsMHg3RTRDLC8qIDB4ODgtMHg4RiAqLworCTB4N0U0RCwweDdFNEUsMHg3RTRGLDB4N0U1MCwweDdFNTEsMHg3RTUyLDB4N0U1MywweDdFNTQsLyogMHg5MC0weDk3ICovCisJMHg3RTU1LDB4N0U1NiwweDdFNTcsMHg3RTU4LDB4N0U1OSwweDdFNUEsMHg3RTVCLDB4N0U1QywvKiAweDk4LTB4OUYgKi8KKwkweDdFNUQsMHg0RkNBLDB4N0FFMywweDZENUEsMHg5MEUxLDB4OUE4RiwweDU1ODAsMHg1NDk2LC8qIDB4QTAtMHhBNyAqLworCTB4NTM2MSwweDU0QUYsMHg1RjAwLDB4NjNFOSwweDY5NzcsMHg1MUVGLDB4NjE2OCwweDUyMEEsLyogMHhBOC0weEFGICovCisJMHg1ODJBLDB4NTJEOCwweDU3NEUsMHg3ODBELDB4NzcwQiwweDVFQjcsMHg2MTc3LDB4N0NFMCwvKiAweEIwLTB4QjcgKi8KKwkweDYyNUIsMHg2Mjk3LDB4NEVBMiwweDcwOTUsMHg4MDAzLDB4NjJGNywweDcwRTQsMHg5NzYwLC8qIDB4QjgtMHhCRiAqLworCTB4NTc3NywweDgyREIsMHg2N0VGLDB4NjhGNSwweDc4RDUsMHg5ODk3LDB4NzlEMSwweDU4RjMsLyogMHhDMC0weEM3ICovCisJMHg1NEIzLDB4NTNFRiwweDZFMzQsMHg1MTRCLDB4NTIzQiwweDVCQTIsMHg4QkZFLDB4ODBBRiwvKiAweEM4LTB4Q0YgKi8KKwkweDU1NDMsMHg1N0E2LDB4NjA3MywweDU3NTEsMHg1NDJELDB4N0E3QSwweDYwNTAsMHg1QjU0LC8qIDB4RDAtMHhENyAqLworCTB4NjNBNywweDYyQTAsMHg1M0UzLDB4NjI2MywweDVCQzcsMHg2N0FGLDB4NTRFRCwweDdBOUYsLyogMHhEOC0weERGICovCisJMHg4MkU2LDB4OTE3NywweDVFOTMsMHg4OEU0LDB4NTkzOCwweDU3QUUsMHg2MzBFLDB4OERFOCwvKiAweEUwLTB4RTcgKi8KKwkweDgwRUYsMHg1NzU3LDB4N0I3NywweDRGQTksMHg1RkVCLDB4NUJCRCwweDZCM0UsMHg1MzIxLC8qIDB4RTgtMHhFRiAqLworCTB4N0I1MCwweDcyQzIsMHg2ODQ2LDB4NzdGRiwweDc3MzYsMHg2NUY3LDB4NTFCNSwweDRFOEYsLyogMHhGMC0weEY3ICovCisJMHg3NkQ0LDB4NUNCRiwweDdBQTUsMHg4NDc1LDB4NTk0RSwweDlCNDEsMHg1MDgwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9DMFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDdFNUUsMHg3RTVGLDB4N0U2MCwweDdFNjEsMHg3RTYyLDB4N0U2MywweDdFNjQsMHg3RTY1LC8qIDB4NDAtMHg0NyAqLworCTB4N0U2NiwweDdFNjcsMHg3RTY4LDB4N0U2OSwweDdFNkEsMHg3RTZCLDB4N0U2QywweDdFNkQsLyogMHg0OC0weDRGICovCisJMHg3RTZFLDB4N0U2RiwweDdFNzAsMHg3RTcxLDB4N0U3MiwweDdFNzMsMHg3RTc0LDB4N0U3NSwvKiAweDUwLTB4NTcgKi8KKwkweDdFNzYsMHg3RTc3LDB4N0U3OCwweDdFNzksMHg3RTdBLDB4N0U3QiwweDdFN0MsMHg3RTdELC8qIDB4NTgtMHg1RiAqLworCTB4N0U3RSwweDdFN0YsMHg3RTgwLDB4N0U4MSwweDdFODMsMHg3RTg0LDB4N0U4NSwweDdFODYsLyogMHg2MC0weDY3ICovCisJMHg3RTg3LDB4N0U4OCwweDdFODksMHg3RThBLDB4N0U4QiwweDdFOEMsMHg3RThELDB4N0U4RSwvKiAweDY4LTB4NkYgKi8KKwkweDdFOEYsMHg3RTkwLDB4N0U5MSwweDdFOTIsMHg3RTkzLDB4N0U5NCwweDdFOTUsMHg3RTk2LC8qIDB4NzAtMHg3NyAqLworCTB4N0U5NywweDdFOTgsMHg3RTk5LDB4N0U5QSwweDdFOUMsMHg3RTlELDB4N0U5RSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDdFQUUsMHg3RUI0LDB4N0VCQiwweDdFQkMsMHg3RUQ2LDB4N0VFNCwweDdFRUMsMHg3RUY5LC8qIDB4ODAtMHg4NyAqLworCTB4N0YwQSwweDdGMTAsMHg3RjFFLDB4N0YzNywweDdGMzksMHg3RjNCLDB4N0YzQywweDdGM0QsLyogMHg4OC0weDhGICovCisJMHg3RjNFLDB4N0YzRiwweDdGNDAsMHg3RjQxLDB4N0Y0MywweDdGNDYsMHg3RjQ3LDB4N0Y0OCwvKiAweDkwLTB4OTcgKi8KKwkweDdGNDksMHg3RjRBLDB4N0Y0QiwweDdGNEMsMHg3RjRELDB4N0Y0RSwweDdGNEYsMHg3RjUyLC8qIDB4OTgtMHg5RiAqLworCTB4N0Y1MywweDk5ODgsMHg2MTI3LDB4NkU4MywweDU3NjQsMHg2NjA2LDB4NjM0NiwweDU2RjAsLyogMHhBMC0weEE3ICovCisJMHg2MkVDLDB4NjI2OSwweDVFRDMsMHg5NjE0LDB4NTc4MywweDYyQzksMHg1NTg3LDB4ODcyMSwvKiAweEE4LTB4QUYgKi8KKwkweDgxNEEsMHg4RkEzLDB4NTU2NiwweDgzQjEsMHg2NzY1LDB4OEQ1NiwweDg0REQsMHg1QTZBLC8qIDB4QjAtMHhCNyAqLworCTB4NjgwRiwweDYyRTYsMHg3QkVFLDB4OTYxMSwweDUxNzAsMHg2RjlDLDB4OEMzMCwweDYzRkQsLyogMHhCOC0weEJGICovCisJMHg4OUM4LDB4NjFEMiwweDdGMDYsMHg3MEMyLDB4NkVFNSwweDc0MDUsMHg2OTk0LDB4NzJGQywvKiAweEMwLTB4QzcgKi8KKwkweDVFQ0EsMHg5MENFLDB4NjcxNywweDZENkEsMHg2MzVFLDB4NTJCMywweDcyNjIsMHg4MDAxLC8qIDB4QzgtMHhDRiAqLworCTB4NEY2QywweDU5RTUsMHg5MTZBLDB4NzBEOSwweDZEOUQsMHg1MkQyLDB4NEU1MCwweDk2RjcsLyogMHhEMC0weEQ3ICovCisJMHg5NTZELDB4ODU3RSwweDc4Q0EsMHg3RDJGLDB4NTEyMSwweDU3OTIsMHg2NEMyLDB4ODA4QiwvKiAweEQ4LTB4REYgKi8KKwkweDdDN0IsMHg2Q0VBLDB4NjhGMSwweDY5NUUsMHg1MUI3LDB4NTM5OCwweDY4QTgsMHg3MjgxLC8qIDB4RTAtMHhFNyAqLworCTB4OUVDRSwweDdCRjEsMHg3MkY4LDB4NzlCQiwweDZGMTMsMHg3NDA2LDB4Njc0RSwweDkxQ0MsLyogMHhFOC0weEVGICovCisJMHg5Q0E0LDB4NzkzQywweDgzODksMHg4MzU0LDB4NTQwRiwweDY4MTcsMHg0RTNELDB4NTM4OSwvKiAweEYwLTB4RjcgKi8KKwkweDUyQjEsMHg3ODNFLDB4NTM4NiwweDUyMjksMHg1MDg4LDB4NEY4QiwweDRGRDAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0MxWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4N0Y1NiwweDdGNTksMHg3RjVCLDB4N0Y1QywweDdGNUQsMHg3RjVFLDB4N0Y2MCwweDdGNjMsLyogMHg0MC0weDQ3ICovCisJMHg3RjY0LDB4N0Y2NSwweDdGNjYsMHg3RjY3LDB4N0Y2QiwweDdGNkMsMHg3RjZELDB4N0Y2RiwvKiAweDQ4LTB4NEYgKi8KKwkweDdGNzAsMHg3RjczLDB4N0Y3NSwweDdGNzYsMHg3Rjc3LDB4N0Y3OCwweDdGN0EsMHg3RjdCLC8qIDB4NTAtMHg1NyAqLworCTB4N0Y3QywweDdGN0QsMHg3RjdGLDB4N0Y4MCwweDdGODIsMHg3RjgzLDB4N0Y4NCwweDdGODUsLyogMHg1OC0weDVGICovCisJMHg3Rjg2LDB4N0Y4NywweDdGODgsMHg3Rjg5LDB4N0Y4QiwweDdGOEQsMHg3RjhGLDB4N0Y5MCwvKiAweDYwLTB4NjcgKi8KKwkweDdGOTEsMHg3RjkyLDB4N0Y5MywweDdGOTUsMHg3Rjk2LDB4N0Y5NywweDdGOTgsMHg3Rjk5LC8qIDB4NjgtMHg2RiAqLworCTB4N0Y5QiwweDdGOUMsMHg3RkEwLDB4N0ZBMiwweDdGQTMsMHg3RkE1LDB4N0ZBNiwweDdGQTgsLyogMHg3MC0weDc3ICovCisJMHg3RkE5LDB4N0ZBQSwweDdGQUIsMHg3RkFDLDB4N0ZBRCwweDdGQUUsMHg3RkIxLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4N0ZCMywweDdGQjQsMHg3RkI1LDB4N0ZCNiwweDdGQjcsMHg3RkJBLDB4N0ZCQiwweDdGQkUsLyogMHg4MC0weDg3ICovCisJMHg3RkMwLDB4N0ZDMiwweDdGQzMsMHg3RkM0LDB4N0ZDNiwweDdGQzcsMHg3RkM4LDB4N0ZDOSwvKiAweDg4LTB4OEYgKi8KKwkweDdGQ0IsMHg3RkNELDB4N0ZDRiwweDdGRDAsMHg3RkQxLDB4N0ZEMiwweDdGRDMsMHg3RkQ2LC8qIDB4OTAtMHg5NyAqLworCTB4N0ZENywweDdGRDksMHg3RkRBLDB4N0ZEQiwweDdGREMsMHg3RkRELDB4N0ZERSwweDdGRTIsLyogMHg5OC0weDlGICovCisJMHg3RkUzLDB4NzVFMiwweDdBQ0IsMHg3QzkyLDB4NkNBNSwweDk2QjYsMHg1MjlCLDB4NzQ4MywvKiAweEEwLTB4QTcgKi8KKwkweDU0RTksMHg0RkU5LDB4ODA1NCwweDgzQjIsMHg4RkRFLDB4OTU3MCwweDVFQzksMHg2MDFDLC8qIDB4QTgtMHhBRiAqLworCTB4NkQ5RiwweDVFMTgsMHg2NTVCLDB4ODEzOCwweDk0RkUsMHg2MDRCLDB4NzBCQywweDdFQzMsLyogMHhCMC0weEI3ICovCisJMHg3Q0FFLDB4NTFDOSwweDY4ODEsMHg3Q0IxLDB4ODI2RiwweDRFMjQsMHg4Rjg2LDB4OTFDRiwvKiAweEI4LTB4QkYgKi8KKwkweDY2N0UsMHg0RUFFLDB4OEMwNSwweDY0QTksMHg4MDRBLDB4NTBEQSwweDc1OTcsMHg3MUNFLC8qIDB4QzAtMHhDNyAqLworCTB4NUJFNSwweDhGQkQsMHg2RjY2LDB4NEU4NiwweDY0ODIsMHg5NTYzLDB4NUVENiwweDY1OTksLyogMHhDOC0weENGICovCisJMHg1MjE3LDB4ODhDMiwweDcwQzgsMHg1MkEzLDB4NzMwRSwweDc0MzMsMHg2Nzk3LDB4NzhGNywvKiAweEQwLTB4RDcgKi8KKwkweDk3MTYsMHg0RTM0LDB4OTBCQiwweDlDREUsMHg2RENCLDB4NTFEQiwweDhENDEsMHg1NDFELC8qIDB4RDgtMHhERiAqLworCTB4NjJDRSwweDczQjIsMHg4M0YxLDB4OTZGNiwweDlGODQsMHg5NEMzLDB4NEYzNiwweDdGOUEsLyogMHhFMC0weEU3ICovCisJMHg1MUNDLDB4NzA3NSwweDk2NzUsMHg1Q0FELDB4OTg4NiwweDUzRTYsMHg0RUU0LDB4NkU5QywvKiAweEU4LTB4RUYgKi8KKwkweDc0MDksMHg2OUI0LDB4Nzg2QiwweDk5OEYsMHg3NTU5LDB4NTIxOCwweDc2MjQsMHg2RDQxLC8qIDB4RjAtMHhGNyAqLworCTB4NjdGMywweDUxNkQsMHg5Rjk5LDB4ODA0QiwweDU0OTksMHg3QjNDLDB4N0FCRiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQzJbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg3RkU0LDB4N0ZFNywweDdGRTgsMHg3RkVBLDB4N0ZFQiwweDdGRUMsMHg3RkVELDB4N0ZFRiwvKiAweDQwLTB4NDcgKi8KKwkweDdGRjIsMHg3RkY0LDB4N0ZGNSwweDdGRjYsMHg3RkY3LDB4N0ZGOCwweDdGRjksMHg3RkZBLC8qIDB4NDgtMHg0RiAqLworCTB4N0ZGRCwweDdGRkUsMHg3RkZGLDB4ODAwMiwweDgwMDcsMHg4MDA4LDB4ODAwOSwweDgwMEEsLyogMHg1MC0weDU3ICovCisJMHg4MDBFLDB4ODAwRiwweDgwMTEsMHg4MDEzLDB4ODAxQSwweDgwMUIsMHg4MDFELDB4ODAxRSwvKiAweDU4LTB4NUYgKi8KKwkweDgwMUYsMHg4MDIxLDB4ODAyMywweDgwMjQsMHg4MDJCLDB4ODAyQywweDgwMkQsMHg4MDJFLC8qIDB4NjAtMHg2NyAqLworCTB4ODAyRiwweDgwMzAsMHg4MDMyLDB4ODAzNCwweDgwMzksMHg4MDNBLDB4ODAzQywweDgwM0UsLyogMHg2OC0weDZGICovCisJMHg4MDQwLDB4ODA0MSwweDgwNDQsMHg4MDQ1LDB4ODA0NywweDgwNDgsMHg4MDQ5LDB4ODA0RSwvKiAweDcwLTB4NzcgKi8KKwkweDgwNEYsMHg4MDUwLDB4ODA1MSwweDgwNTMsMHg4MDU1LDB4ODA1NiwweDgwNTcsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg4MDU5LDB4ODA1QiwweDgwNUMsMHg4MDVELDB4ODA1RSwweDgwNUYsMHg4MDYwLDB4ODA2MSwvKiAweDgwLTB4ODcgKi8KKwkweDgwNjIsMHg4MDYzLDB4ODA2NCwweDgwNjUsMHg4MDY2LDB4ODA2NywweDgwNjgsMHg4MDZCLC8qIDB4ODgtMHg4RiAqLworCTB4ODA2QywweDgwNkQsMHg4MDZFLDB4ODA2RiwweDgwNzAsMHg4MDcyLDB4ODA3MywweDgwNzQsLyogMHg5MC0weDk3ICovCisJMHg4MDc1LDB4ODA3NiwweDgwNzcsMHg4MDc4LDB4ODA3OSwweDgwN0EsMHg4MDdCLDB4ODA3QywvKiAweDk4LTB4OUYgKi8KKwkweDgwN0QsMHg5Njg2LDB4NTc4NCwweDYyRTIsMHg5NjQ3LDB4Njk3QywweDVBMDQsMHg2NDAyLC8qIDB4QTAtMHhBNyAqLworCTB4N0JEMywweDZGMEYsMHg5NjRCLDB4ODJBNiwweDUzNjIsMHg5ODg1LDB4NUU5MCwweDcwODksLyogMHhBOC0weEFGICovCisJMHg2M0IzLDB4NTM2NCwweDg2NEYsMHg5QzgxLDB4OUU5MywweDc4OEMsMHg5NzMyLDB4OERFRiwvKiAweEIwLTB4QjcgKi8KKwkweDhENDIsMHg5RTdGLDB4NkY1RSwweDc5ODQsMHg1RjU1LDB4OTY0NiwweDYyMkUsMHg5QTc0LC8qIDB4QjgtMHhCRiAqLworCTB4NTQxNSwweDk0REQsMHg0RkEzLDB4NjVDNSwweDVDNjUsMHg1QzYxLDB4N0YxNSwweDg2NTEsLyogMHhDMC0weEM3ICovCisJMHg2QzJGLDB4NUY4QiwweDczODcsMHg2RUU0LDB4N0VGRiwweDVDRTYsMHg2MzFCLDB4NUI2QSwvKiAweEM4LTB4Q0YgKi8KKwkweDZFRTYsMHg1Mzc1LDB4NEU3MSwweDYzQTAsMHg3NTY1LDB4NjJBMSwweDhGNkUsMHg0RjI2LC8qIDB4RDAtMHhENyAqLworCTB4NEVEMSwweDZDQTYsMHg3RUI2LDB4OEJCQSwweDg0MUQsMHg4N0JBLDB4N0Y1NywweDkwM0IsLyogMHhEOC0weERGICovCisJMHg5NTIzLDB4N0JBOSwweDlBQTEsMHg4OEY4LDB4ODQzRCwweDZEMUIsMHg5QTg2LDB4N0VEQywvKiAweEUwLTB4RTcgKi8KKwkweDU5ODgsMHg5RUJCLDB4NzM5QiwweDc4MDEsMHg4NjgyLDB4OUE2QywweDlBODIsMHg1NjFCLC8qIDB4RTgtMHhFRiAqLworCTB4NTQxNywweDU3Q0IsMHg0RTcwLDB4OUVBNiwweDUzNTYsMHg4RkM4LDB4ODEwOSwweDc3OTIsLyogMHhGMC0weEY3ICovCisJMHg5OTkyLDB4ODZFRSwweDZFRTEsMHg4NTEzLDB4NjZGQywweDYxNjIsMHg2RjJCLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9DM1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDgwN0UsMHg4MDgxLDB4ODA4MiwweDgwODUsMHg4MDg4LDB4ODA4QSwweDgwOEQsMHg4MDhFLC8qIDB4NDAtMHg0NyAqLworCTB4ODA4RiwweDgwOTAsMHg4MDkxLDB4ODA5MiwweDgwOTQsMHg4MDk1LDB4ODA5NywweDgwOTksLyogMHg0OC0weDRGICovCisJMHg4MDlFLDB4ODBBMywweDgwQTYsMHg4MEE3LDB4ODBBOCwweDgwQUMsMHg4MEIwLDB4ODBCMywvKiAweDUwLTB4NTcgKi8KKwkweDgwQjUsMHg4MEI2LDB4ODBCOCwweDgwQjksMHg4MEJCLDB4ODBDNSwweDgwQzcsMHg4MEM4LC8qIDB4NTgtMHg1RiAqLworCTB4ODBDOSwweDgwQ0EsMHg4MENCLDB4ODBDRiwweDgwRDAsMHg4MEQxLDB4ODBEMiwweDgwRDMsLyogMHg2MC0weDY3ICovCisJMHg4MEQ0LDB4ODBENSwweDgwRDgsMHg4MERGLDB4ODBFMCwweDgwRTIsMHg4MEUzLDB4ODBFNiwvKiAweDY4LTB4NkYgKi8KKwkweDgwRUUsMHg4MEY1LDB4ODBGNywweDgwRjksMHg4MEZCLDB4ODBGRSwweDgwRkYsMHg4MTAwLC8qIDB4NzAtMHg3NyAqLworCTB4ODEwMSwweDgxMDMsMHg4MTA0LDB4ODEwNSwweDgxMDcsMHg4MTA4LDB4ODEwQiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDgxMEMsMHg4MTE1LDB4ODExNywweDgxMTksMHg4MTFCLDB4ODExQywweDgxMUQsMHg4MTFGLC8qIDB4ODAtMHg4NyAqLworCTB4ODEyMCwweDgxMjEsMHg4MTIyLDB4ODEyMywweDgxMjQsMHg4MTI1LDB4ODEyNiwweDgxMjcsLyogMHg4OC0weDhGICovCisJMHg4MTI4LDB4ODEyOSwweDgxMkEsMHg4MTJCLDB4ODEyRCwweDgxMkUsMHg4MTMwLDB4ODEzMywvKiAweDkwLTB4OTcgKi8KKwkweDgxMzQsMHg4MTM1LDB4ODEzNywweDgxMzksMHg4MTNBLDB4ODEzQiwweDgxM0MsMHg4MTNELC8qIDB4OTgtMHg5RiAqLworCTB4ODEzRiwweDhDMjksMHg4MjkyLDB4ODMyQiwweDc2RjIsMHg2QzEzLDB4NUZEOSwweDgzQkQsLyogMHhBMC0weEE3ICovCisJMHg3MzJCLDB4ODMwNSwweDk1MUEsMHg2QkRCLDB4NzdEQiwweDk0QzYsMHg1MzZGLDB4ODMwMiwvKiAweEE4LTB4QUYgKi8KKwkweDUxOTIsMHg1RTNELDB4OEM4QywweDhEMzgsMHg0RTQ4LDB4NzNBQiwweDY3OUEsMHg2ODg1LC8qIDB4QjAtMHhCNyAqLworCTB4OTE3NiwweDk3MDksMHg3MTY0LDB4NkNBMSwweDc3MDksMHg1QTkyLDB4OTU0MSwweDZCQ0YsLyogMHhCOC0weEJGICovCisJMHg3RjhFLDB4NjYyNywweDVCRDAsMHg1OUI5LDB4NUE5QSwweDk1RTgsMHg5NUY3LDB4NEVFQywvKiAweEMwLTB4QzcgKi8KKwkweDg0MEMsMHg4NDk5LDB4NkFBQywweDc2REYsMHg5NTMwLDB4NzMxQiwweDY4QTYsMHg1QjVGLC8qIDB4QzgtMHhDRiAqLworCTB4NzcyRiwweDkxOUEsMHg5NzYxLDB4N0NEQywweDhGRjcsMHg4QzFDLDB4NUYyNSwweDdDNzMsLyogMHhEMC0weEQ3ICovCisJMHg3OUQ4LDB4ODlDNSwweDZDQ0MsMHg4NzFDLDB4NUJDNiwweDVFNDIsMHg2OEM5LDB4NzcyMCwvKiAweEQ4LTB4REYgKi8KKwkweDdFRjUsMHg1MTk1LDB4NTE0RCwweDUyQzksMHg1QTI5LDB4N0YwNSwweDk3NjIsMHg4MkQ3LC8qIDB4RTAtMHhFNyAqLworCTB4NjNDRiwweDc3ODQsMHg4NUQwLDB4NzlEMiwweDZFM0EsMHg1RTk5LDB4NTk5OSwweDg1MTEsLyogMHhFOC0weEVGICovCisJMHg3MDZELDB4NkMxMSwweDYyQkYsMHg3NkJGLDB4NjU0RiwweDYwQUYsMHg5NUZELDB4NjYwRSwvKiAweEYwLTB4RjcgKi8KKwkweDg3OUYsMHg5RTIzLDB4OTRFRCwweDU0MEQsMHg1NDdELDB4OEMyQywweDY0NzgsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0M0WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4ODE0MCwweDgxNDEsMHg4MTQyLDB4ODE0MywweDgxNDQsMHg4MTQ1LDB4ODE0NywweDgxNDksLyogMHg0MC0weDQ3ICovCisJMHg4MTRELDB4ODE0RSwweDgxNEYsMHg4MTUyLDB4ODE1NiwweDgxNTcsMHg4MTU4LDB4ODE1QiwvKiAweDQ4LTB4NEYgKi8KKwkweDgxNUMsMHg4MTVELDB4ODE1RSwweDgxNUYsMHg4MTYxLDB4ODE2MiwweDgxNjMsMHg4MTY0LC8qIDB4NTAtMHg1NyAqLworCTB4ODE2NiwweDgxNjgsMHg4MTZBLDB4ODE2QiwweDgxNkMsMHg4MTZGLDB4ODE3MiwweDgxNzMsLyogMHg1OC0weDVGICovCisJMHg4MTc1LDB4ODE3NiwweDgxNzcsMHg4MTc4LDB4ODE4MSwweDgxODMsMHg4MTg0LDB4ODE4NSwvKiAweDYwLTB4NjcgKi8KKwkweDgxODYsMHg4MTg3LDB4ODE4OSwweDgxOEIsMHg4MThDLDB4ODE4RCwweDgxOEUsMHg4MTkwLC8qIDB4NjgtMHg2RiAqLworCTB4ODE5MiwweDgxOTMsMHg4MTk0LDB4ODE5NSwweDgxOTYsMHg4MTk3LDB4ODE5OSwweDgxOUEsLyogMHg3MC0weDc3ICovCisJMHg4MTlFLDB4ODE5RiwweDgxQTAsMHg4MUExLDB4ODFBMiwweDgxQTQsMHg4MUE1LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4ODFBNywweDgxQTksMHg4MUFCLDB4ODFBQywweDgxQUQsMHg4MUFFLDB4ODFBRiwweDgxQjAsLyogMHg4MC0weDg3ICovCisJMHg4MUIxLDB4ODFCMiwweDgxQjQsMHg4MUI1LDB4ODFCNiwweDgxQjcsMHg4MUI4LDB4ODFCOSwvKiAweDg4LTB4OEYgKi8KKwkweDgxQkMsMHg4MUJELDB4ODFCRSwweDgxQkYsMHg4MUM0LDB4ODFDNSwweDgxQzcsMHg4MUM4LC8qIDB4OTAtMHg5NyAqLworCTB4ODFDOSwweDgxQ0IsMHg4MUNELDB4ODFDRSwweDgxQ0YsMHg4MUQwLDB4ODFEMSwweDgxRDIsLyogMHg5OC0weDlGICovCisJMHg4MUQzLDB4NjQ3OSwweDg2MTEsMHg2QTIxLDB4ODE5QywweDc4RTgsMHg2NDY5LDB4OUI1NCwvKiAweEEwLTB4QTcgKi8KKwkweDYyQjksMHg2NzJCLDB4ODNBQiwweDU4QTgsMHg5RUQ4LDB4NkNBQiwweDZGMjAsMHg1QkRFLC8qIDB4QTgtMHhBRiAqLworCTB4OTY0QywweDhDMEIsMHg3MjVGLDB4NjdEMCwweDYyQzcsMHg3MjYxLDB4NEVBOSwweDU5QzYsLyogMHhCMC0weEI3ICovCisJMHg2QkNELDB4NTg5MywweDY2QUUsMHg1RTU1LDB4NTJERiwweDYxNTUsMHg2NzI4LDB4NzZFRSwvKiAweEI4LTB4QkYgKi8KKwkweDc3NjYsMHg3MjY3LDB4N0E0NiwweDYyRkYsMHg1NEVBLDB4NTQ1MCwweDk0QTAsMHg5MEEzLC8qIDB4QzAtMHhDNyAqLworCTB4NUExQywweDdFQjMsMHg2QzE2LDB4NEU0MywweDU5NzYsMHg4MDEwLDB4NTk0OCwweDUzNTcsLyogMHhDOC0weENGICovCisJMHg3NTM3LDB4OTZCRSwweDU2Q0EsMHg2MzIwLDB4ODExMSwweDYwN0MsMHg5NUY5LDB4NkRENiwvKiAweEQwLTB4RDcgKi8KKwkweDU0NjIsMHg5OTgxLDB4NTE4NSwweDVBRTksMHg4MEZELDB4NTlBRSwweDk3MTMsMHg1MDJBLC8qIDB4RDgtMHhERiAqLworCTB4NkNFNSwweDVDM0MsMHg2MkRGLDB4NEY2MCwweDUzM0YsMHg4MTdCLDB4OTAwNiwweDZFQkEsLyogMHhFMC0weEU3ICovCisJMHg4NTJCLDB4NjJDOCwweDVFNzQsMHg3OEJFLDB4NjRCNSwweDYzN0IsMHg1RkY1LDB4NUExOCwvKiAweEU4LTB4RUYgKi8KKwkweDkxN0YsMHg5RTFGLDB4NUMzRiwweDYzNEYsMHg4MDQyLDB4NUI3RCwweDU1NkUsMHg5NTRBLC8qIDB4RjAtMHhGNyAqLworCTB4OTU0RCwweDZEODUsMHg2MEE4LDB4NjdFMCwweDcyREUsMHg1MURELDB4NUI4MSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQzVbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4MUQ0LDB4ODFENSwweDgxRDYsMHg4MUQ3LDB4ODFEOCwweDgxRDksMHg4MURBLDB4ODFEQiwvKiAweDQwLTB4NDcgKi8KKwkweDgxREMsMHg4MURELDB4ODFERSwweDgxREYsMHg4MUUwLDB4ODFFMSwweDgxRTIsMHg4MUU0LC8qIDB4NDgtMHg0RiAqLworCTB4ODFFNSwweDgxRTYsMHg4MUU4LDB4ODFFOSwweDgxRUIsMHg4MUVFLDB4ODFFRiwweDgxRjAsLyogMHg1MC0weDU3ICovCisJMHg4MUYxLDB4ODFGMiwweDgxRjUsMHg4MUY2LDB4ODFGNywweDgxRjgsMHg4MUY5LDB4ODFGQSwvKiAweDU4LTB4NUYgKi8KKwkweDgxRkQsMHg4MUZGLDB4ODIwMywweDgyMDcsMHg4MjA4LDB4ODIwOSwweDgyMEEsMHg4MjBCLC8qIDB4NjAtMHg2NyAqLworCTB4ODIwRSwweDgyMEYsMHg4MjExLDB4ODIxMywweDgyMTUsMHg4MjE2LDB4ODIxNywweDgyMTgsLyogMHg2OC0weDZGICovCisJMHg4MjE5LDB4ODIxQSwweDgyMUQsMHg4MjIwLDB4ODIyNCwweDgyMjUsMHg4MjI2LDB4ODIyNywvKiAweDcwLTB4NzcgKi8KKwkweDgyMjksMHg4MjJFLDB4ODIzMiwweDgyM0EsMHg4MjNDLDB4ODIzRCwweDgyM0YsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg4MjQwLDB4ODI0MSwweDgyNDIsMHg4MjQzLDB4ODI0NSwweDgyNDYsMHg4MjQ4LDB4ODI0QSwvKiAweDgwLTB4ODcgKi8KKwkweDgyNEMsMHg4MjRELDB4ODI0RSwweDgyNTAsMHg4MjUxLDB4ODI1MiwweDgyNTMsMHg4MjU0LC8qIDB4ODgtMHg4RiAqLworCTB4ODI1NSwweDgyNTYsMHg4MjU3LDB4ODI1OSwweDgyNUIsMHg4MjVDLDB4ODI1RCwweDgyNUUsLyogMHg5MC0weDk3ICovCisJMHg4MjYwLDB4ODI2MSwweDgyNjIsMHg4MjYzLDB4ODI2NCwweDgyNjUsMHg4MjY2LDB4ODI2NywvKiAweDk4LTB4OUYgKi8KKwkweDgyNjksMHg2MkU3LDB4NkNERSwweDcyNUIsMHg2MjZELDB4OTRBRSwweDdFQkQsMHg4MTEzLC8qIDB4QTAtMHhBNyAqLworCTB4NkQ1MywweDUxOUMsMHg1RjA0LDB4NTk3NCwweDUyQUEsMHg2MDEyLDB4NTk3MywweDY2OTYsLyogMHhBOC0weEFGICovCisJMHg4NjUwLDB4NzU5RiwweDYzMkEsMHg2MUU2LDB4N0NFRiwweDhCRkEsMHg1NEU2LDB4NkIyNywvKiAweEIwLTB4QjcgKi8KKwkweDlFMjUsMHg2QkI0LDB4ODVENSwweDU0NTUsMHg1MDc2LDB4NkNBNCwweDU1NkEsMHg4REI0LC8qIDB4QjgtMHhCRiAqLworCTB4NzIyQywweDVFMTUsMHg2MDE1LDB4NzQzNiwweDYyQ0QsMHg2MzkyLDB4NzI0QywweDVGOTgsLyogMHhDMC0weEM3ICovCisJMHg2RTQzLDB4NkQzRSwweDY1MDAsMHg2RjU4LDB4NzZEOCwweDc4RDAsMHg3NkZDLDB4NzU1NCwvKiAweEM4LTB4Q0YgKi8KKwkweDUyMjQsMHg1M0RCLDB4NEU1MywweDVFOUUsMHg2NUMxLDB4ODAyQSwweDgwRDYsMHg2MjlCLC8qIDB4RDAtMHhENyAqLworCTB4NTQ4NiwweDUyMjgsMHg3MEFFLDB4ODg4RCwweDhERDEsMHg2Q0UxLDB4NTQ3OCwweDgwREEsLyogMHhEOC0weERGICovCisJMHg1N0Y5LDB4ODhGNCwweDhENTQsMHg5NjZBLDB4OTE0RCwweDRGNjksMHg2QzlCLDB4NTVCNywvKiAweEUwLTB4RTcgKi8KKwkweDc2QzYsMHg3ODMwLDB4NjJBOCwweDcwRjksMHg2RjhFLDB4NUY2RCwweDg0RUMsMHg2OERBLC8qIDB4RTgtMHhFRiAqLworCTB4Nzg3QywweDdCRjcsMHg4MUE4LDB4NjcwQiwweDlFNEYsMHg2MzY3LDB4NzhCMCwweDU3NkYsLyogMHhGMC0weEY3ICovCisJMHg3ODEyLDB4OTczOSwweDYyNzksMHg2MkFCLDB4NTI4OCwweDc0MzUsMHg2QkQ3LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9DNlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDgyNkEsMHg4MjZCLDB4ODI2QywweDgyNkQsMHg4MjcxLDB4ODI3NSwweDgyNzYsMHg4Mjc3LC8qIDB4NDAtMHg0NyAqLworCTB4ODI3OCwweDgyN0IsMHg4MjdDLDB4ODI4MCwweDgyODEsMHg4MjgzLDB4ODI4NSwweDgyODYsLyogMHg0OC0weDRGICovCisJMHg4Mjg3LDB4ODI4OSwweDgyOEMsMHg4MjkwLDB4ODI5MywweDgyOTQsMHg4Mjk1LDB4ODI5NiwvKiAweDUwLTB4NTcgKi8KKwkweDgyOUEsMHg4MjlCLDB4ODI5RSwweDgyQTAsMHg4MkEyLDB4ODJBMywweDgyQTcsMHg4MkIyLC8qIDB4NTgtMHg1RiAqLworCTB4ODJCNSwweDgyQjYsMHg4MkJBLDB4ODJCQiwweDgyQkMsMHg4MkJGLDB4ODJDMCwweDgyQzIsLyogMHg2MC0weDY3ICovCisJMHg4MkMzLDB4ODJDNSwweDgyQzYsMHg4MkM5LDB4ODJEMCwweDgyRDYsMHg4MkQ5LDB4ODJEQSwvKiAweDY4LTB4NkYgKi8KKwkweDgyREQsMHg4MkUyLDB4ODJFNywweDgyRTgsMHg4MkU5LDB4ODJFQSwweDgyRUMsMHg4MkVELC8qIDB4NzAtMHg3NyAqLworCTB4ODJFRSwweDgyRjAsMHg4MkYyLDB4ODJGMywweDgyRjUsMHg4MkY2LDB4ODJGOCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDgyRkEsMHg4MkZDLDB4ODJGRCwweDgyRkUsMHg4MkZGLDB4ODMwMCwweDgzMEEsMHg4MzBCLC8qIDB4ODAtMHg4NyAqLworCTB4ODMwRCwweDgzMTAsMHg4MzEyLDB4ODMxMywweDgzMTYsMHg4MzE4LDB4ODMxOSwweDgzMUQsLyogMHg4OC0weDhGICovCisJMHg4MzFFLDB4ODMxRiwweDgzMjAsMHg4MzIxLDB4ODMyMiwweDgzMjMsMHg4MzI0LDB4ODMyNSwvKiAweDkwLTB4OTcgKi8KKwkweDgzMjYsMHg4MzI5LDB4ODMyQSwweDgzMkUsMHg4MzMwLDB4ODMzMiwweDgzMzcsMHg4MzNCLC8qIDB4OTgtMHg5RiAqLworCTB4ODMzRCwweDU1NjQsMHg4MTNFLDB4NzVCMiwweDc2QUUsMHg1MzM5LDB4NzVERSwweDUwRkIsLyogMHhBMC0weEE3ICovCisJMHg1QzQxLDB4OEI2QywweDdCQzcsMHg1MDRGLDB4NzI0NywweDlBOTcsMHg5OEQ4LDB4NkYwMiwvKiAweEE4LTB4QUYgKi8KKwkweDc0RTIsMHg3OTY4LDB4NjQ4NywweDc3QTUsMHg2MkZDLDB4OTg5MSwweDhEMkIsMHg1NEMxLC8qIDB4QjAtMHhCNyAqLworCTB4ODA1OCwweDRFNTIsMHg1NzZBLDB4ODJGOSwweDg0MEQsMHg1RTczLDB4NTFFRCwweDc0RjYsLyogMHhCOC0weEJGICovCisJMHg4QkM0LDB4NUM0RiwweDU3NjEsMHg2Q0ZDLDB4OTg4NywweDVBNDYsMHg3ODM0LDB4OUI0NCwvKiAweEMwLTB4QzcgKi8KKwkweDhGRUIsMHg3Qzk1LDB4NTI1NiwweDYyNTEsMHg5NEZBLDB4NEVDNiwweDgzODYsMHg4NDYxLC8qIDB4QzgtMHhDRiAqLworCTB4ODNFOSwweDg0QjIsMHg1N0Q0LDB4NjczNCwweDU3MDMsMHg2NjZFLDB4NkQ2NiwweDhDMzEsLyogMHhEMC0weEQ3ICovCisJMHg2NkRELDB4NzAxMSwweDY3MUYsMHg2QjNBLDB4NjgxNiwweDYyMUEsMHg1OUJCLDB4NEUwMywvKiAweEQ4LTB4REYgKi8KKwkweDUxQzQsMHg2RjA2LDB4NjdEMiwweDZDOEYsMHg1MTc2LDB4NjhDQiwweDU5NDcsMHg2QjY3LC8qIDB4RTAtMHhFNyAqLworCTB4NzU2NiwweDVEMEUsMHg4MTEwLDB4OUY1MCwweDY1RDcsMHg3OTQ4LDB4Nzk0MSwweDlBOTEsLyogMHhFOC0weEVGICovCisJMHg4RDc3LDB4NUM4MiwweDRFNUUsMHg0RjAxLDB4NTQyRiwweDU5NTEsMHg3ODBDLDB4NTY2OCwvKiAweEYwLTB4RjcgKi8KKwkweDZDMTQsMHg4RkM0LDB4NUYwMywweDZDN0QsMHg2Q0UzLDB4OEJBQiwweDYzOTAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0M3WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4ODMzRSwweDgzM0YsMHg4MzQxLDB4ODM0MiwweDgzNDQsMHg4MzQ1LDB4ODM0OCwweDgzNEEsLyogMHg0MC0weDQ3ICovCisJMHg4MzRCLDB4ODM0QywweDgzNEQsMHg4MzRFLDB4ODM1MywweDgzNTUsMHg4MzU2LDB4ODM1NywvKiAweDQ4LTB4NEYgKi8KKwkweDgzNTgsMHg4MzU5LDB4ODM1RCwweDgzNjIsMHg4MzcwLDB4ODM3MSwweDgzNzIsMHg4MzczLC8qIDB4NTAtMHg1NyAqLworCTB4ODM3NCwweDgzNzUsMHg4Mzc2LDB4ODM3OSwweDgzN0EsMHg4MzdFLDB4ODM3RiwweDgzODAsLyogMHg1OC0weDVGICovCisJMHg4MzgxLDB4ODM4MiwweDgzODMsMHg4Mzg0LDB4ODM4NywweDgzODgsMHg4MzhBLDB4ODM4QiwvKiAweDYwLTB4NjcgKi8KKwkweDgzOEMsMHg4MzhELDB4ODM4RiwweDgzOTAsMHg4MzkxLDB4ODM5NCwweDgzOTUsMHg4Mzk2LC8qIDB4NjgtMHg2RiAqLworCTB4ODM5NywweDgzOTksMHg4MzlBLDB4ODM5RCwweDgzOUYsMHg4M0ExLDB4ODNBMiwweDgzQTMsLyogMHg3MC0weDc3ICovCisJMHg4M0E0LDB4ODNBNSwweDgzQTYsMHg4M0E3LDB4ODNBQywweDgzQUQsMHg4M0FFLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4ODNBRiwweDgzQjUsMHg4M0JCLDB4ODNCRSwweDgzQkYsMHg4M0MyLDB4ODNDMywweDgzQzQsLyogMHg4MC0weDg3ICovCisJMHg4M0M2LDB4ODNDOCwweDgzQzksMHg4M0NCLDB4ODNDRCwweDgzQ0UsMHg4M0QwLDB4ODNEMSwvKiAweDg4LTB4OEYgKi8KKwkweDgzRDIsMHg4M0QzLDB4ODNENSwweDgzRDcsMHg4M0Q5LDB4ODNEQSwweDgzREIsMHg4M0RFLC8qIDB4OTAtMHg5NyAqLworCTB4ODNFMiwweDgzRTMsMHg4M0U0LDB4ODNFNiwweDgzRTcsMHg4M0U4LDB4ODNFQiwweDgzRUMsLyogMHg5OC0weDlGICovCisJMHg4M0VELDB4NjA3MCwweDZEM0QsMHg3Mjc1LDB4NjI2NiwweDk0OEUsMHg5NEM1LDB4NTM0MywvKiAweEEwLTB4QTcgKi8KKwkweDhGQzEsMHg3QjdFLDB4NEVERiwweDhDMjYsMHg0RTdFLDB4OUVENCwweDk0QjEsMHg5NEIzLC8qIDB4QTgtMHhBRiAqLworCTB4NTI0RCwweDZGNUMsMHg5MDYzLDB4NkQ0NSwweDhDMzQsMHg1ODExLDB4NUQ0QywweDZCMjAsLyogMHhCMC0weEI3ICovCisJMHg2QjQ5LDB4NjdBQSwweDU0NUIsMHg4MTU0LDB4N0Y4QywweDU4OTksMHg4NTM3LDB4NUYzQSwvKiAweEI4LTB4QkYgKi8KKwkweDYyQTIsMHg2QTQ3LDB4OTUzOSwweDY1NzIsMHg2MDg0LDB4Njg2NSwweDc3QTcsMHg0RTU0LC8qIDB4QzAtMHhDNyAqLworCTB4NEZBOCwweDVERTcsMHg5Nzk4LDB4NjRBQywweDdGRDgsMHg1Q0VELDB4NEZDRiwweDdBOEQsLyogMHhDOC0weENGICovCisJMHg1MjA3LDB4ODMwNCwweDRFMTQsMHg2MDJGLDB4N0E4MywweDk0QTYsMHg0RkI1LDB4NEVCMiwvKiAweEQwLTB4RDcgKi8KKwkweDc5RTYsMHg3NDM0LDB4NTJFNCwweDgyQjksMHg2NEQyLDB4NzlCRCwweDVCREQsMHg2QzgxLC8qIDB4RDgtMHhERiAqLworCTB4OTc1MiwweDhGN0IsMHg2QzIyLDB4NTAzRSwweDUzN0YsMHg2RTA1LDB4NjRDRSwweDY2NzQsLyogMHhFMC0weEU3ICovCisJMHg2QzMwLDB4NjBDNSwweDk4NzcsMHg4QkY3LDB4NUU4NiwweDc0M0MsMHg3QTc3LDB4NzlDQiwvKiAweEU4LTB4RUYgKi8KKwkweDRFMTgsMHg5MEIxLDB4NzQwMywweDZDNDIsMHg1NkRBLDB4OTE0QiwweDZDQzUsMHg4RDhCLC8qIDB4RjAtMHhGNyAqLworCTB4NTMzQSwweDg2QzYsMHg2NkYyLDB4OEVBRiwweDVDNDgsMHg5QTcxLDB4NkUyMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQzhbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4M0VFLDB4ODNFRiwweDgzRjMsMHg4M0Y0LDB4ODNGNSwweDgzRjYsMHg4M0Y3LDB4ODNGQSwvKiAweDQwLTB4NDcgKi8KKwkweDgzRkIsMHg4M0ZDLDB4ODNGRSwweDgzRkYsMHg4NDAwLDB4ODQwMiwweDg0MDUsMHg4NDA3LC8qIDB4NDgtMHg0RiAqLworCTB4ODQwOCwweDg0MDksMHg4NDBBLDB4ODQxMCwweDg0MTIsMHg4NDEzLDB4ODQxNCwweDg0MTUsLyogMHg1MC0weDU3ICovCisJMHg4NDE2LDB4ODQxNywweDg0MTksMHg4NDFBLDB4ODQxQiwweDg0MUUsMHg4NDFGLDB4ODQyMCwvKiAweDU4LTB4NUYgKi8KKwkweDg0MjEsMHg4NDIyLDB4ODQyMywweDg0MjksMHg4NDJBLDB4ODQyQiwweDg0MkMsMHg4NDJELC8qIDB4NjAtMHg2NyAqLworCTB4ODQyRSwweDg0MkYsMHg4NDMwLDB4ODQzMiwweDg0MzMsMHg4NDM0LDB4ODQzNSwweDg0MzYsLyogMHg2OC0weDZGICovCisJMHg4NDM3LDB4ODQzOSwweDg0M0EsMHg4NDNCLDB4ODQzRSwweDg0M0YsMHg4NDQwLDB4ODQ0MSwvKiAweDcwLTB4NzcgKi8KKwkweDg0NDIsMHg4NDQzLDB4ODQ0NCwweDg0NDUsMHg4NDQ3LDB4ODQ0OCwweDg0NDksMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg4NDRBLDB4ODQ0QiwweDg0NEMsMHg4NDRELDB4ODQ0RSwweDg0NEYsMHg4NDUwLDB4ODQ1MiwvKiAweDgwLTB4ODcgKi8KKwkweDg0NTMsMHg4NDU0LDB4ODQ1NSwweDg0NTYsMHg4NDU4LDB4ODQ1RCwweDg0NUUsMHg4NDVGLC8qIDB4ODgtMHg4RiAqLworCTB4ODQ2MCwweDg0NjIsMHg4NDY0LDB4ODQ2NSwweDg0NjYsMHg4NDY3LDB4ODQ2OCwweDg0NkEsLyogMHg5MC0weDk3ICovCisJMHg4NDZFLDB4ODQ2RiwweDg0NzAsMHg4NDcyLDB4ODQ3NCwweDg0NzcsMHg4NDc5LDB4ODQ3QiwvKiAweDk4LTB4OUYgKi8KKwkweDg0N0MsMHg1M0Q2LDB4NUEzNiwweDlGOEIsMHg4REEzLDB4NTNCQiwweDU3MDgsMHg5OEE3LC8qIDB4QTAtMHhBNyAqLworCTB4Njc0MywweDkxOUIsMHg2Q0M5LDB4NTE2OCwweDc1Q0EsMHg2MkYzLDB4NzJBQywweDUyMzgsLyogMHhBOC0weEFGICovCisJMHg1MjlELDB4N0YzQSwweDcwOTQsMHg3NjM4LDB4NTM3NCwweDlFNEEsMHg2OUI3LDB4Nzg2RSwvKiAweEIwLTB4QjcgKi8KKwkweDk2QzAsMHg4OEQ5LDB4N0ZBNCwweDcxMzYsMHg3MUMzLDB4NTE4OSwweDY3RDMsMHg3NEU0LC8qIDB4QjgtMHhCRiAqLworCTB4NThFNCwweDY1MTgsMHg1NkI3LDB4OEJBOSwweDk5NzYsMHg2MjcwLDB4N0VENSwweDYwRjksLyogMHhDMC0weEM3ICovCisJMHg3MEVELDB4NThFQywweDRFQzEsMHg0RUJBLDB4NUZDRCwweDk3RTcsMHg0RUZCLDB4OEJBNCwvKiAweEM4LTB4Q0YgKi8KKwkweDUyMDMsMHg1OThBLDB4N0VBQiwweDYyNTQsMHg0RUNELDB4NjVFNSwweDYyMEUsMHg4MzM4LC8qIDB4RDAtMHhENyAqLworCTB4ODRDOSwweDgzNjMsMHg4NzhELDB4NzE5NCwweDZFQjYsMHg1QkI5LDB4N0VEMiwweDUxOTcsLyogMHhEOC0weERGICovCisJMHg2M0M5LDB4NjdENCwweDgwODksMHg4MzM5LDB4ODgxNSwweDUxMTIsMHg1QjdBLDB4NTk4MiwvKiAweEUwLTB4RTcgKi8KKwkweDhGQjEsMHg0RTczLDB4NkM1RCwweDUxNjUsMHg4OTI1LDB4OEY2RiwweDk2MkUsMHg4NTRBLC8qIDB4RTgtMHhFRiAqLworCTB4NzQ1RSwweDk1MTAsMHg5NUYwLDB4NkRBNiwweDgyRTUsMHg1RjMxLDB4NjQ5MiwweDZEMTIsLyogMHhGMC0weEY3ICovCisJMHg4NDI4LDB4ODE2RSwweDlDQzMsMHg1ODVFLDB4OEQ1QiwweDRFMDksMHg1M0MxLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9DOVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDg0N0QsMHg4NDdFLDB4ODQ3RiwweDg0ODAsMHg4NDgxLDB4ODQ4MywweDg0ODQsMHg4NDg1LC8qIDB4NDAtMHg0NyAqLworCTB4ODQ4NiwweDg0OEEsMHg4NDhELDB4ODQ4RiwweDg0OTAsMHg4NDkxLDB4ODQ5MiwweDg0OTMsLyogMHg0OC0weDRGICovCisJMHg4NDk0LDB4ODQ5NSwweDg0OTYsMHg4NDk4LDB4ODQ5QSwweDg0OUIsMHg4NDlELDB4ODQ5RSwvKiAweDUwLTB4NTcgKi8KKwkweDg0OUYsMHg4NEEwLDB4ODRBMiwweDg0QTMsMHg4NEE0LDB4ODRBNSwweDg0QTYsMHg4NEE3LC8qIDB4NTgtMHg1RiAqLworCTB4ODRBOCwweDg0QTksMHg4NEFBLDB4ODRBQiwweDg0QUMsMHg4NEFELDB4ODRBRSwweDg0QjAsLyogMHg2MC0weDY3ICovCisJMHg4NEIxLDB4ODRCMywweDg0QjUsMHg4NEI2LDB4ODRCNywweDg0QkIsMHg4NEJDLDB4ODRCRSwvKiAweDY4LTB4NkYgKi8KKwkweDg0QzAsMHg4NEMyLDB4ODRDMywweDg0QzUsMHg4NEM2LDB4ODRDNywweDg0QzgsMHg4NENCLC8qIDB4NzAtMHg3NyAqLworCTB4ODRDQywweDg0Q0UsMHg4NENGLDB4ODREMiwweDg0RDQsMHg4NEQ1LDB4ODRENywweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDg0RDgsMHg4NEQ5LDB4ODREQSwweDg0REIsMHg4NERDLDB4ODRERSwweDg0RTEsMHg4NEUyLC8qIDB4ODAtMHg4NyAqLworCTB4ODRFNCwweDg0RTcsMHg4NEU4LDB4ODRFOSwweDg0RUEsMHg4NEVCLDB4ODRFRCwweDg0RUUsLyogMHg4OC0weDhGICovCisJMHg4NEVGLDB4ODRGMSwweDg0RjIsMHg4NEYzLDB4ODRGNCwweDg0RjUsMHg4NEY2LDB4ODRGNywvKiAweDkwLTB4OTcgKi8KKwkweDg0RjgsMHg4NEY5LDB4ODRGQSwweDg0RkIsMHg4NEZELDB4ODRGRSwweDg1MDAsMHg4NTAxLC8qIDB4OTgtMHg5RiAqLworCTB4ODUwMiwweDRGMUUsMHg2NTYzLDB4Njg1MSwweDU1RDMsMHg0RTI3LDB4NjQxNCwweDlBOUEsLyogMHhBMC0weEE3ICovCisJMHg2MjZCLDB4NUFDMiwweDc0NUYsMHg4MjcyLDB4NkRBOSwweDY4RUUsMHg1MEU3LDB4ODM4RSwvKiAweEE4LTB4QUYgKi8KKwkweDc4MDIsMHg2NzQwLDB4NTIzOSwweDZDOTksMHg3RUIxLDB4NTBCQiwweDU1NjUsMHg3MTVFLC8qIDB4QjAtMHhCNyAqLworCTB4N0I1QiwweDY2NTIsMHg3M0NBLDB4ODJFQiwweDY3NDksMHg1QzcxLDB4NTIyMCwweDcxN0QsLyogMHhCOC0weEJGICovCisJMHg4ODZCLDB4OTVFQSwweDk2NTUsMHg2NEM1LDB4OEQ2MSwweDgxQjMsMHg1NTg0LDB4NkM1NSwvKiAweEMwLTB4QzcgKi8KKwkweDYyNDcsMHg3RjJFLDB4NTg5MiwweDRGMjQsMHg1NTQ2LDB4OEQ0RiwweDY2NEMsMHg0RTBBLC8qIDB4QzgtMHhDRiAqLworCTB4NUMxQSwweDg4RjMsMHg2OEEyLDB4NjM0RSwweDdBMEQsMHg3MEU3LDB4ODI4RCwweDUyRkEsLyogMHhEMC0weEQ3ICovCisJMHg5N0Y2LDB4NUMxMSwweDU0RTgsMHg5MEI1LDB4N0VDRCwweDU5NjIsMHg4RDRBLDB4ODZDNywvKiAweEQ4LTB4REYgKi8KKwkweDgyMEMsMHg4MjBELDB4OEQ2NiwweDY0NDQsMHg1QzA0LDB4NjE1MSwweDZEODksMHg3OTNFLC8qIDB4RTAtMHhFNyAqLworCTB4OEJCRSwweDc4MzcsMHg3NTMzLDB4NTQ3QiwweDRGMzgsMHg4RUFCLDB4NkRGMSwweDVBMjAsLyogMHhFOC0weEVGICovCisJMHg3RUM1LDB4Nzk1RSwweDZDODgsMHg1QkExLDB4NUE3NiwweDc1MUEsMHg4MEJFLDB4NjE0RSwvKiAweEYwLTB4RjcgKi8KKwkweDZFMTcsMHg1OEYwLDB4NzUxRiwweDc1MjUsMHg3MjcyLDB4NTM0NywweDdFRjMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0NBWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4ODUwMywweDg1MDQsMHg4NTA1LDB4ODUwNiwweDg1MDcsMHg4NTA4LDB4ODUwOSwweDg1MEEsLyogMHg0MC0weDQ3ICovCisJMHg4NTBCLDB4ODUwRCwweDg1MEUsMHg4NTBGLDB4ODUxMCwweDg1MTIsMHg4NTE0LDB4ODUxNSwvKiAweDQ4LTB4NEYgKi8KKwkweDg1MTYsMHg4NTE4LDB4ODUxOSwweDg1MUIsMHg4NTFDLDB4ODUxRCwweDg1MUUsMHg4NTIwLC8qIDB4NTAtMHg1NyAqLworCTB4ODUyMiwweDg1MjMsMHg4NTI0LDB4ODUyNSwweDg1MjYsMHg4NTI3LDB4ODUyOCwweDg1MjksLyogMHg1OC0weDVGICovCisJMHg4NTJBLDB4ODUyRCwweDg1MkUsMHg4NTJGLDB4ODUzMCwweDg1MzEsMHg4NTMyLDB4ODUzMywvKiAweDYwLTB4NjcgKi8KKwkweDg1MzQsMHg4NTM1LDB4ODUzNiwweDg1M0UsMHg4NTNGLDB4ODU0MCwweDg1NDEsMHg4NTQyLC8qIDB4NjgtMHg2RiAqLworCTB4ODU0NCwweDg1NDUsMHg4NTQ2LDB4ODU0NywweDg1NEIsMHg4NTRDLDB4ODU0RCwweDg1NEUsLyogMHg3MC0weDc3ICovCisJMHg4NTRGLDB4ODU1MCwweDg1NTEsMHg4NTUyLDB4ODU1MywweDg1NTQsMHg4NTU1LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4ODU1NywweDg1NTgsMHg4NTVBLDB4ODU1QiwweDg1NUMsMHg4NTVELDB4ODU1RiwweDg1NjAsLyogMHg4MC0weDg3ICovCisJMHg4NTYxLDB4ODU2MiwweDg1NjMsMHg4NTY1LDB4ODU2NiwweDg1NjcsMHg4NTY5LDB4ODU2QSwvKiAweDg4LTB4OEYgKi8KKwkweDg1NkIsMHg4NTZDLDB4ODU2RCwweDg1NkUsMHg4NTZGLDB4ODU3MCwweDg1NzEsMHg4NTczLC8qIDB4OTAtMHg5NyAqLworCTB4ODU3NSwweDg1NzYsMHg4NTc3LDB4ODU3OCwweDg1N0MsMHg4NTdELDB4ODU3RiwweDg1ODAsLyogMHg5OC0weDlGICovCisJMHg4NTgxLDB4NzcwMSwweDc2REIsMHg1MjY5LDB4ODBEQywweDU3MjMsMHg1RTA4LDB4NTkzMSwvKiAweEEwLTB4QTcgKi8KKwkweDcyRUUsMHg2NUJELDB4NkU3RiwweDhCRDcsMHg1QzM4LDB4ODY3MSwweDUzNDEsMHg3N0YzLC8qIDB4QTgtMHhBRiAqLworCTB4NjJGRSwweDY1RjYsMHg0RUMwLDB4OThERiwweDg2ODAsMHg1QjlFLDB4OEJDNiwweDUzRjIsLyogMHhCMC0weEI3ICovCisJMHg3N0UyLDB4NEY3RiwweDVDNEUsMHg5QTc2LDB4NTlDQiwweDVGMEYsMHg3OTNBLDB4NThFQiwvKiAweEI4LTB4QkYgKi8KKwkweDRFMTYsMHg2N0ZGLDB4NEU4QiwweDYyRUQsMHg4QTkzLDB4OTAxRCwweDUyQkYsMHg2NjJGLC8qIDB4QzAtMHhDNyAqLworCTB4NTVEQywweDU2NkMsMHg5MDAyLDB4NEVENSwweDRGOEQsMHg5MUNBLDB4OTk3MCwweDZDMEYsLyogMHhDOC0weENGICovCisJMHg1RTAyLDB4NjA0MywweDVCQTQsMHg4OUM2LDB4OEJENSwweDY1MzYsMHg2MjRCLDB4OTk5NiwvKiAweEQwLTB4RDcgKi8KKwkweDVCODgsMHg1QkZGLDB4NjM4OCwweDU1MkUsMHg1M0Q3LDB4NzYyNiwweDUxN0QsMHg4NTJDLC8qIDB4RDgtMHhERiAqLworCTB4NjdBMiwweDY4QjMsMHg2QjhBLDB4NjI5MiwweDhGOTMsMHg1M0Q0LDB4ODIxMiwweDZERDEsLyogMHhFMC0weEU3ICovCisJMHg3NThGLDB4NEU2NiwweDhENEUsMHg1QjcwLDB4NzE5RiwweDg1QUYsMHg2NjkxLDB4NjZEOSwvKiAweEU4LTB4RUYgKi8KKwkweDdGNzIsMHg4NzAwLDB4OUVDRCwweDlGMjAsMHg1QzVFLDB4NjcyRiwweDhGRjAsMHg2ODExLC8qIDB4RjAtMHhGNyAqLworCTB4Njc1RiwweDYyMEQsMHg3QUQ2LDB4NTg4NSwweDVFQjYsMHg2NTcwLDB4NkYzMSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQ0JbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4NTgyLDB4ODU4MywweDg1ODYsMHg4NTg4LDB4ODU4OSwweDg1OEEsMHg4NThCLDB4ODU4QywvKiAweDQwLTB4NDcgKi8KKwkweDg1OEQsMHg4NThFLDB4ODU5MCwweDg1OTEsMHg4NTkyLDB4ODU5MywweDg1OTQsMHg4NTk1LC8qIDB4NDgtMHg0RiAqLworCTB4ODU5NiwweDg1OTcsMHg4NTk4LDB4ODU5OSwweDg1OUEsMHg4NTlELDB4ODU5RSwweDg1OUYsLyogMHg1MC0weDU3ICovCisJMHg4NUEwLDB4ODVBMSwweDg1QTIsMHg4NUEzLDB4ODVBNSwweDg1QTYsMHg4NUE3LDB4ODVBOSwvKiAweDU4LTB4NUYgKi8KKwkweDg1QUIsMHg4NUFDLDB4ODVBRCwweDg1QjEsMHg4NUIyLDB4ODVCMywweDg1QjQsMHg4NUI1LC8qIDB4NjAtMHg2NyAqLworCTB4ODVCNiwweDg1QjgsMHg4NUJBLDB4ODVCQiwweDg1QkMsMHg4NUJELDB4ODVCRSwweDg1QkYsLyogMHg2OC0weDZGICovCisJMHg4NUMwLDB4ODVDMiwweDg1QzMsMHg4NUM0LDB4ODVDNSwweDg1QzYsMHg4NUM3LDB4ODVDOCwvKiAweDcwLTB4NzcgKi8KKwkweDg1Q0EsMHg4NUNCLDB4ODVDQywweDg1Q0QsMHg4NUNFLDB4ODVEMSwweDg1RDIsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg4NUQ0LDB4ODVENiwweDg1RDcsMHg4NUQ4LDB4ODVEOSwweDg1REEsMHg4NURCLDB4ODVERCwvKiAweDgwLTB4ODcgKi8KKwkweDg1REUsMHg4NURGLDB4ODVFMCwweDg1RTEsMHg4NUUyLDB4ODVFMywweDg1RTUsMHg4NUU2LC8qIDB4ODgtMHg4RiAqLworCTB4ODVFNywweDg1RTgsMHg4NUVBLDB4ODVFQiwweDg1RUMsMHg4NUVELDB4ODVFRSwweDg1RUYsLyogMHg5MC0weDk3ICovCisJMHg4NUYwLDB4ODVGMSwweDg1RjIsMHg4NUYzLDB4ODVGNCwweDg1RjUsMHg4NUY2LDB4ODVGNywvKiAweDk4LTB4OUYgKi8KKwkweDg1RjgsMHg2MDU1LDB4NTIzNywweDgwMEQsMHg2NDU0LDB4ODg3MCwweDc1MjksMHg1RTA1LC8qIDB4QTAtMHhBNyAqLworCTB4NjgxMywweDYyRjQsMHg5NzFDLDB4NTNDQywweDcyM0QsMHg4QzAxLDB4NkMzNCwweDc3NjEsLyogMHhBOC0weEFGICovCisJMHg3QTBFLDB4NTQyRSwweDc3QUMsMHg5ODdBLDB4ODIxQywweDhCRjQsMHg3ODU1LDB4NjcxNCwvKiAweEIwLTB4QjcgKi8KKwkweDcwQzEsMHg2NUFGLDB4NjQ5NSwweDU2MzYsMHg2MDFELDB4NzlDMSwweDUzRjgsMHg0RTFELC8qIDB4QjgtMHhCRiAqLworCTB4NkI3QiwweDgwODYsMHg1QkZBLDB4NTVFMywweDU2REIsMHg0RjNBLDB4NEYzQywweDk5NzIsLyogMHhDMC0weEM3ICovCisJMHg1REYzLDB4Njc3RSwweDgwMzgsMHg2MDAyLDB4OTg4MiwweDkwMDEsMHg1QjhCLDB4OEJCQywvKiAweEM4LTB4Q0YgKi8KKwkweDhCRjUsMHg2NDFDLDB4ODI1OCwweDY0REUsMHg1NUZELDB4ODJDRiwweDkxNjUsMHg0RkQ3LC8qIDB4RDAtMHhENyAqLworCTB4N0QyMCwweDkwMUYsMHg3QzlGLDB4NTBGMywweDU4NTEsMHg2RUFGLDB4NUJCRiwweDhCQzksLyogMHhEOC0weERGICovCisJMHg4MDgzLDB4OTE3OCwweDg0OUMsMHg3Qjk3LDB4ODY3RCwweDk2OEIsMHg5NjhGLDB4N0VFNSwvKiAweEUwLTB4RTcgKi8KKwkweDlBRDMsMHg3ODhFLDB4NUM4MSwweDdBNTcsMHg5MDQyLDB4OTZBNywweDc5NUYsMHg1QjU5LC8qIDB4RTgtMHhFRiAqLworCTB4NjM1RiwweDdCMEIsMHg4NEQxLDB4NjhBRCwweDU1MDYsMHg3RjI5LDB4NzQxMCwweDdEMjIsLyogMHhGMC0weEY3ICovCisJMHg5NTAxLDB4NjI0MCwweDU4NEMsMHg0RUQ2LDB4NUI4MywweDU5NzksMHg1ODU0LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9DQ1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDg1RjksMHg4NUZBLDB4ODVGQywweDg1RkQsMHg4NUZFLDB4ODYwMCwweDg2MDEsMHg4NjAyLC8qIDB4NDAtMHg0NyAqLworCTB4ODYwMywweDg2MDQsMHg4NjA2LDB4ODYwNywweDg2MDgsMHg4NjA5LDB4ODYwQSwweDg2MEIsLyogMHg0OC0weDRGICovCisJMHg4NjBDLDB4ODYwRCwweDg2MEUsMHg4NjBGLDB4ODYxMCwweDg2MTIsMHg4NjEzLDB4ODYxNCwvKiAweDUwLTB4NTcgKi8KKwkweDg2MTUsMHg4NjE3LDB4ODYxOCwweDg2MTksMHg4NjFBLDB4ODYxQiwweDg2MUMsMHg4NjFELC8qIDB4NTgtMHg1RiAqLworCTB4ODYxRSwweDg2MUYsMHg4NjIwLDB4ODYyMSwweDg2MjIsMHg4NjIzLDB4ODYyNCwweDg2MjUsLyogMHg2MC0weDY3ICovCisJMHg4NjI2LDB4ODYyOCwweDg2MkEsMHg4NjJCLDB4ODYyQywweDg2MkQsMHg4NjJFLDB4ODYyRiwvKiAweDY4LTB4NkYgKi8KKwkweDg2MzAsMHg4NjMxLDB4ODYzMiwweDg2MzMsMHg4NjM0LDB4ODYzNSwweDg2MzYsMHg4NjM3LC8qIDB4NzAtMHg3NyAqLworCTB4ODYzOSwweDg2M0EsMHg4NjNCLDB4ODYzRCwweDg2M0UsMHg4NjNGLDB4ODY0MCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDg2NDEsMHg4NjQyLDB4ODY0MywweDg2NDQsMHg4NjQ1LDB4ODY0NiwweDg2NDcsMHg4NjQ4LC8qIDB4ODAtMHg4NyAqLworCTB4ODY0OSwweDg2NEEsMHg4NjRCLDB4ODY0QywweDg2NTIsMHg4NjUzLDB4ODY1NSwweDg2NTYsLyogMHg4OC0weDhGICovCisJMHg4NjU3LDB4ODY1OCwweDg2NTksMHg4NjVCLDB4ODY1QywweDg2NUQsMHg4NjVGLDB4ODY2MCwvKiAweDkwLTB4OTcgKi8KKwkweDg2NjEsMHg4NjYzLDB4ODY2NCwweDg2NjUsMHg4NjY2LDB4ODY2NywweDg2NjgsMHg4NjY5LC8qIDB4OTgtMHg5RiAqLworCTB4ODY2QSwweDczNkQsMHg2MzFFLDB4OEU0QiwweDhFMEYsMHg4MENFLDB4ODJENCwweDYyQUMsLyogMHhBMC0weEE3ICovCisJMHg1M0YwLDB4NkNGMCwweDkxNUUsMHg1OTJBLDB4NjAwMSwweDZDNzAsMHg1NzRELDB4NjQ0QSwvKiAweEE4LTB4QUYgKi8KKwkweDhEMkEsMHg3NjJCLDB4NkVFOSwweDU3NUIsMHg2QTgwLDB4NzVGMCwweDZGNkQsMHg4QzJELC8qIDB4QjAtMHhCNyAqLworCTB4OEMwOCwweDU3NjYsMHg2QkVGLDB4ODg5MiwweDc4QjMsMHg2M0EyLDB4NTNGOSwweDcwQUQsLyogMHhCOC0weEJGICovCisJMHg2QzY0LDB4NTg1OCwweDY0MkEsMHg1ODAyLDB4NjhFMCwweDgxOUIsMHg1NTEwLDB4N0NENiwvKiAweEMwLTB4QzcgKi8KKwkweDUwMTgsMHg4RUJBLDB4NkRDQywweDhEOUYsMHg3MEVCLDB4NjM4RiwweDZEOUIsMHg2RUQ0LC8qIDB4QzgtMHhDRiAqLworCTB4N0VFNiwweDg0MDQsMHg2ODQzLDB4OTAwMywweDZERDgsMHg5Njc2LDB4OEJBOCwweDU5NTcsLyogMHhEMC0weEQ3ICovCisJMHg3Mjc5LDB4ODVFNCwweDgxN0UsMHg3NUJDLDB4OEE4QSwweDY4QUYsMHg1MjU0LDB4OEUyMiwvKiAweEQ4LTB4REYgKi8KKwkweDk1MTEsMHg2M0QwLDB4OTg5OCwweDhFNDQsMHg1NTdDLDB4NEY1MywweDY2RkYsMHg1NjhGLC8qIDB4RTAtMHhFNyAqLworCTB4NjBENSwweDZEOTUsMHg1MjQzLDB4NUM0OSwweDU5MjksMHg2REZCLDB4NTg2QiwweDc1MzAsLyogMHhFOC0weEVGICovCisJMHg3NTFDLDB4NjA2QywweDgyMTQsMHg4MTQ2LDB4NjMxMSwweDY3NjEsMHg4RkUyLDB4NzczQSwvKiAweEYwLTB4RjcgKi8KKwkweDhERjMsMHg4RDM0LDB4OTRDMSwweDVFMTYsMHg1Mzg1LDB4NTQyQywweDcwQzMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0NEWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4ODY2RCwweDg2NkYsMHg4NjcwLDB4ODY3MiwweDg2NzMsMHg4Njc0LDB4ODY3NSwweDg2NzYsLyogMHg0MC0weDQ3ICovCisJMHg4Njc3LDB4ODY3OCwweDg2ODMsMHg4Njg0LDB4ODY4NSwweDg2ODYsMHg4Njg3LDB4ODY4OCwvKiAweDQ4LTB4NEYgKi8KKwkweDg2ODksMHg4NjhFLDB4ODY4RiwweDg2OTAsMHg4NjkxLDB4ODY5MiwweDg2OTQsMHg4Njk2LC8qIDB4NTAtMHg1NyAqLworCTB4ODY5NywweDg2OTgsMHg4Njk5LDB4ODY5QSwweDg2OUIsMHg4NjlFLDB4ODY5RiwweDg2QTAsLyogMHg1OC0weDVGICovCisJMHg4NkExLDB4ODZBMiwweDg2QTUsMHg4NkE2LDB4ODZBQiwweDg2QUQsMHg4NkFFLDB4ODZCMiwvKiAweDYwLTB4NjcgKi8KKwkweDg2QjMsMHg4NkI3LDB4ODZCOCwweDg2QjksMHg4NkJCLDB4ODZCQywweDg2QkQsMHg4NkJFLC8qIDB4NjgtMHg2RiAqLworCTB4ODZCRiwweDg2QzEsMHg4NkMyLDB4ODZDMywweDg2QzUsMHg4NkM4LDB4ODZDQywweDg2Q0QsLyogMHg3MC0weDc3ICovCisJMHg4NkQyLDB4ODZEMywweDg2RDUsMHg4NkQ2LDB4ODZENywweDg2REEsMHg4NkRDLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4ODZERCwweDg2RTAsMHg4NkUxLDB4ODZFMiwweDg2RTMsMHg4NkU1LDB4ODZFNiwweDg2RTcsLyogMHg4MC0weDg3ICovCisJMHg4NkU4LDB4ODZFQSwweDg2RUIsMHg4NkVDLDB4ODZFRiwweDg2RjUsMHg4NkY2LDB4ODZGNywvKiAweDg4LTB4OEYgKi8KKwkweDg2RkEsMHg4NkZCLDB4ODZGQywweDg2RkQsMHg4NkZGLDB4ODcwMSwweDg3MDQsMHg4NzA1LC8qIDB4OTAtMHg5NyAqLworCTB4ODcwNiwweDg3MEIsMHg4NzBDLDB4ODcwRSwweDg3MEYsMHg4NzEwLDB4ODcxMSwweDg3MTQsLyogMHg5OC0weDlGICovCisJMHg4NzE2LDB4NkM0MCwweDVFRjcsMHg1MDVDLDB4NEVBRCwweDVFQUQsMHg2MzNBLDB4ODI0NywvKiAweEEwLTB4QTcgKi8KKwkweDkwMUEsMHg2ODUwLDB4OTE2RSwweDc3QjMsMHg1NDBDLDB4OTREQywweDVGNjQsMHg3QUU1LC8qIDB4QTgtMHhBRiAqLworCTB4Njg3NiwweDYzNDUsMHg3QjUyLDB4N0VERiwweDc1REIsMHg1MDc3LDB4NjI5NSwweDU5MzQsLyogMHhCMC0weEI3ICovCisJMHg5MDBGLDB4NTFGOCwweDc5QzMsMHg3QTgxLDB4NTZGRSwweDVGOTIsMHg5MDE0LDB4NkQ4MiwvKiAweEI4LTB4QkYgKi8KKwkweDVDNjAsMHg1NzFGLDB4NTQxMCwweDUxNTQsMHg2RTRELDB4NTZFMiwweDYzQTgsMHg5ODkzLC8qIDB4QzAtMHhDNyAqLworCTB4ODE3RiwweDg3MTUsMHg4OTJBLDB4OTAwMCwweDU0MUUsMHg1QzZGLDB4ODFDMCwweDYyRDYsLyogMHhDOC0weENGICovCisJMHg2MjU4LDB4ODEzMSwweDlFMzUsMHg5NjQwLDB4OUE2RSwweDlBN0MsMHg2OTJELDB4NTlBNSwvKiAweEQwLTB4RDcgKi8KKwkweDYyRDMsMHg1NTNFLDB4NjMxNiwweDU0QzcsMHg4NkQ5LDB4NkQzQywweDVBMDMsMHg3NEU2LC8qIDB4RDgtMHhERiAqLworCTB4ODg5QywweDZCNkEsMHg1OTE2LDB4OEM0QywweDVGMkYsMHg2RTdFLDB4NzNBOSwweDk4N0QsLyogMHhFMC0weEU3ICovCisJMHg0RTM4LDB4NzBGNywweDVCOEMsMHg3ODk3LDB4NjMzRCwweDY2NUEsMHg3Njk2LDB4NjBDQiwvKiAweEU4LTB4RUYgKi8KKwkweDVCOUIsMHg1QTQ5LDB4NEUwNywweDgxNTUsMHg2QzZBLDB4NzM4QiwweDRFQTEsMHg2Nzg5LC8qIDB4RjAtMHhGNyAqLworCTB4N0Y1MSwweDVGODAsMHg2NUZBLDB4NjcxQiwweDVGRDgsMHg1OTg0LDB4NUEwMSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQ0VbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4NzE5LDB4ODcxQiwweDg3MUQsMHg4NzFGLDB4ODcyMCwweDg3MjQsMHg4NzI2LDB4ODcyNywvKiAweDQwLTB4NDcgKi8KKwkweDg3MjgsMHg4NzJBLDB4ODcyQiwweDg3MkMsMHg4NzJELDB4ODcyRiwweDg3MzAsMHg4NzMyLC8qIDB4NDgtMHg0RiAqLworCTB4ODczMywweDg3MzUsMHg4NzM2LDB4ODczOCwweDg3MzksMHg4NzNBLDB4ODczQywweDg3M0QsLyogMHg1MC0weDU3ICovCisJMHg4NzQwLDB4ODc0MSwweDg3NDIsMHg4NzQzLDB4ODc0NCwweDg3NDUsMHg4NzQ2LDB4ODc0QSwvKiAweDU4LTB4NUYgKi8KKwkweDg3NEIsMHg4NzRELDB4ODc0RiwweDg3NTAsMHg4NzUxLDB4ODc1MiwweDg3NTQsMHg4NzU1LC8qIDB4NjAtMHg2NyAqLworCTB4ODc1NiwweDg3NTgsMHg4NzVBLDB4ODc1QiwweDg3NUMsMHg4NzVELDB4ODc1RSwweDg3NUYsLyogMHg2OC0weDZGICovCisJMHg4NzYxLDB4ODc2MiwweDg3NjYsMHg4NzY3LDB4ODc2OCwweDg3NjksMHg4NzZBLDB4ODc2QiwvKiAweDcwLTB4NzcgKi8KKwkweDg3NkMsMHg4NzZELDB4ODc2RiwweDg3NzEsMHg4NzcyLDB4ODc3MywweDg3NzUsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg4Nzc3LDB4ODc3OCwweDg3NzksMHg4NzdBLDB4ODc3RiwweDg3ODAsMHg4NzgxLDB4ODc4NCwvKiAweDgwLTB4ODcgKi8KKwkweDg3ODYsMHg4Nzg3LDB4ODc4OSwweDg3OEEsMHg4NzhDLDB4ODc4RSwweDg3OEYsMHg4NzkwLC8qIDB4ODgtMHg4RiAqLworCTB4ODc5MSwweDg3OTIsMHg4Nzk0LDB4ODc5NSwweDg3OTYsMHg4Nzk4LDB4ODc5OSwweDg3OUEsLyogMHg5MC0weDk3ICovCisJMHg4NzlCLDB4ODc5QywweDg3OUQsMHg4NzlFLDB4ODdBMCwweDg3QTEsMHg4N0EyLDB4ODdBMywvKiAweDk4LTB4OUYgKi8KKwkweDg3QTQsMHg1RENELDB4NUZBRSwweDUzNzEsMHg5N0U2LDB4OEZERCwweDY4NDUsMHg1NkY0LC8qIDB4QTAtMHhBNyAqLworCTB4NTUyRiwweDYwREYsMHg0RTNBLDB4NkY0RCwweDdFRjQsMHg4MkM3LDB4ODQwRSwweDU5RDQsLyogMHhBOC0weEFGICovCisJMHg0RjFGLDB4NEYyQSwweDVDM0UsMHg3RUFDLDB4NjcyQSwweDg1MUEsMHg1NDczLDB4NzU0RiwvKiAweEIwLTB4QjcgKi8KKwkweDgwQzMsMHg1NTgyLDB4OUI0RiwweDRGNEQsMHg2RTJELDB4OEMxMywweDVDMDksMHg2MTcwLC8qIDB4QjgtMHhCRiAqLworCTB4NTM2QiwweDc2MUYsMHg2RTI5LDB4ODY4QSwweDY1ODcsMHg5NUZCLDB4N0VCOSwweDU0M0IsLyogMHhDMC0weEM3ICovCisJMHg3QTMzLDB4N0QwQSwweDk1RUUsMHg1NUUxLDB4N0ZDMSwweDc0RUUsMHg2MzFELDB4ODcxNywvKiAweEM4LTB4Q0YgKi8KKwkweDZEQTEsMHg3QTlELDB4NjIxMSwweDY1QTEsMHg1MzY3LDB4NjNFMSwweDZDODMsMHg1REVCLC8qIDB4RDAtMHhENyAqLworCTB4NTQ1QywweDk0QTgsMHg0RTRDLDB4NkM2MSwweDhCRUMsMHg1QzRCLDB4NjVFMCwweDgyOUMsLyogMHhEOC0weERGICovCisJMHg2OEE3LDB4NTQzRSwweDU0MzQsMHg2QkNCLDB4NkI2NiwweDRFOTQsMHg2MzQyLDB4NTM0OCwvKiAweEUwLTB4RTcgKi8KKwkweDgyMUUsMHg0RjBELDB4NEZBRSwweDU3NUUsMHg2MjBBLDB4OTZGRSwweDY2NjQsMHg3MjY5LC8qIDB4RTgtMHhFRiAqLworCTB4NTJGRiwweDUyQTEsMHg2MDlGLDB4OEJFRiwweDY2MTQsMHg3MTk5LDB4Njc5MCwweDg5N0YsLyogMHhGMC0weEY3ICovCisJMHg3ODUyLDB4NzdGRCwweDY2NzAsMHg1NjNCLDB4NTQzOCwweDk1MjEsMHg3MjdBLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9DRlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDg3QTUsMHg4N0E2LDB4ODdBNywweDg3QTksMHg4N0FBLDB4ODdBRSwweDg3QjAsMHg4N0IxLC8qIDB4NDAtMHg0NyAqLworCTB4ODdCMiwweDg3QjQsMHg4N0I2LDB4ODdCNywweDg3QjgsMHg4N0I5LDB4ODdCQiwweDg3QkMsLyogMHg0OC0weDRGICovCisJMHg4N0JFLDB4ODdCRiwweDg3QzEsMHg4N0MyLDB4ODdDMywweDg3QzQsMHg4N0M1LDB4ODdDNywvKiAweDUwLTB4NTcgKi8KKwkweDg3QzgsMHg4N0M5LDB4ODdDQywweDg3Q0QsMHg4N0NFLDB4ODdDRiwweDg3RDAsMHg4N0Q0LC8qIDB4NTgtMHg1RiAqLworCTB4ODdENSwweDg3RDYsMHg4N0Q3LDB4ODdEOCwweDg3RDksMHg4N0RBLDB4ODdEQywweDg3REQsLyogMHg2MC0weDY3ICovCisJMHg4N0RFLDB4ODdERiwweDg3RTEsMHg4N0UyLDB4ODdFMywweDg3RTQsMHg4N0U2LDB4ODdFNywvKiAweDY4LTB4NkYgKi8KKwkweDg3RTgsMHg4N0U5LDB4ODdFQiwweDg3RUMsMHg4N0VELDB4ODdFRiwweDg3RjAsMHg4N0YxLC8qIDB4NzAtMHg3NyAqLworCTB4ODdGMiwweDg3RjMsMHg4N0Y0LDB4ODdGNSwweDg3RjYsMHg4N0Y3LDB4ODdGOCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDg3RkEsMHg4N0ZCLDB4ODdGQywweDg3RkQsMHg4N0ZGLDB4ODgwMCwweDg4MDEsMHg4ODAyLC8qIDB4ODAtMHg4NyAqLworCTB4ODgwNCwweDg4MDUsMHg4ODA2LDB4ODgwNywweDg4MDgsMHg4ODA5LDB4ODgwQiwweDg4MEMsLyogMHg4OC0weDhGICovCisJMHg4ODBELDB4ODgwRSwweDg4MEYsMHg4ODEwLDB4ODgxMSwweDg4MTIsMHg4ODE0LDB4ODgxNywvKiAweDkwLTB4OTcgKi8KKwkweDg4MTgsMHg4ODE5LDB4ODgxQSwweDg4MUMsMHg4ODFELDB4ODgxRSwweDg4MUYsMHg4ODIwLC8qIDB4OTgtMHg5RiAqLworCTB4ODgyMywweDdBMDAsMHg2MDZGLDB4NUUwQywweDYwODksMHg4MTlELDB4NTkxNSwweDYwREMsLyogMHhBMC0weEE3ICovCisJMHg3MTg0LDB4NzBFRiwweDZFQUEsMHg2QzUwLDB4NzI4MCwweDZBODQsMHg4OEFELDB4NUUyRCwvKiAweEE4LTB4QUYgKi8KKwkweDRFNjAsMHg1QUIzLDB4NTU5QywweDk0RTMsMHg2RDE3LDB4N0NGQiwweDk2OTksMHg2MjBGLC8qIDB4QjAtMHhCNyAqLworCTB4N0VDNiwweDc3OEUsMHg4NjdFLDB4NTMyMywweDk3MUUsMHg4Rjk2LDB4NjY4NywweDVDRTEsLyogMHhCOC0weEJGICovCisJMHg0RkEwLDB4NzJFRCwweDRFMEIsMHg1M0E2LDB4NTkwRiwweDU0MTMsMHg2MzgwLDB4OTUyOCwvKiAweEMwLTB4QzcgKi8KKwkweDUxNDgsMHg0RUQ5LDB4OUM5QywweDdFQTQsMHg1NEI4LDB4OEQyNCwweDg4NTQsMHg4MjM3LC8qIDB4QzgtMHhDRiAqLworCTB4OTVGMiwweDZEOEUsMHg1RjI2LDB4NUFDQywweDY2M0UsMHg5NjY5LDB4NzNCMCwweDczMkUsLyogMHhEMC0weEQ3ICovCisJMHg1M0JGLDB4ODE3QSwweDk5ODUsMHg3RkExLDB4NUJBQSwweDk2NzcsMHg5NjUwLDB4N0VCRiwvKiAweEQ4LTB4REYgKi8KKwkweDc2RjgsMHg1M0EyLDB4OTU3NiwweDk5OTksMHg3QkIxLDB4ODk0NCwweDZFNTgsMHg0RTYxLC8qIDB4RTAtMHhFNyAqLworCTB4N0ZENCwweDc5NjUsMHg4QkU2LDB4NjBGMywweDU0Q0QsMHg0RUFCLDB4OTg3OSwweDVERjcsLyogMHhFOC0weEVGICovCisJMHg2QTYxLDB4NTBDRiwweDU0MTEsMHg4QzYxLDB4ODQyNywweDc4NUQsMHg5NzA0LDB4NTI0QSwvKiAweEYwLTB4RjcgKi8KKwkweDU0RUUsMHg1NkEzLDB4OTUwMCwweDZEODgsMHg1QkI1LDB4NkRDNiwweDY2NTMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0QwWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4ODgyNCwweDg4MjUsMHg4ODI2LDB4ODgyNywweDg4MjgsMHg4ODI5LDB4ODgyQSwweDg4MkIsLyogMHg0MC0weDQ3ICovCisJMHg4ODJDLDB4ODgyRCwweDg4MkUsMHg4ODJGLDB4ODgzMCwweDg4MzEsMHg4ODMzLDB4ODgzNCwvKiAweDQ4LTB4NEYgKi8KKwkweDg4MzUsMHg4ODM2LDB4ODgzNywweDg4MzgsMHg4ODNBLDB4ODgzQiwweDg4M0QsMHg4ODNFLC8qIDB4NTAtMHg1NyAqLworCTB4ODgzRiwweDg4NDEsMHg4ODQyLDB4ODg0MywweDg4NDYsMHg4ODQ3LDB4ODg0OCwweDg4NDksLyogMHg1OC0weDVGICovCisJMHg4ODRBLDB4ODg0QiwweDg4NEUsMHg4ODRGLDB4ODg1MCwweDg4NTEsMHg4ODUyLDB4ODg1MywvKiAweDYwLTB4NjcgKi8KKwkweDg4NTUsMHg4ODU2LDB4ODg1OCwweDg4NUEsMHg4ODVCLDB4ODg1QywweDg4NUQsMHg4ODVFLC8qIDB4NjgtMHg2RiAqLworCTB4ODg1RiwweDg4NjAsMHg4ODY2LDB4ODg2NywweDg4NkEsMHg4ODZELDB4ODg2RiwweDg4NzEsLyogMHg3MC0weDc3ICovCisJMHg4ODczLDB4ODg3NCwweDg4NzUsMHg4ODc2LDB4ODg3OCwweDg4NzksMHg4ODdBLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4ODg3QiwweDg4N0MsMHg4ODgwLDB4ODg4MywweDg4ODYsMHg4ODg3LDB4ODg4OSwweDg4OEEsLyogMHg4MC0weDg3ICovCisJMHg4ODhDLDB4ODg4RSwweDg4OEYsMHg4ODkwLDB4ODg5MSwweDg4OTMsMHg4ODk0LDB4ODg5NSwvKiAweDg4LTB4OEYgKi8KKwkweDg4OTcsMHg4ODk4LDB4ODg5OSwweDg4OUEsMHg4ODlCLDB4ODg5RCwweDg4OUUsMHg4ODlGLC8qIDB4OTAtMHg5NyAqLworCTB4ODhBMCwweDg4QTEsMHg4OEEzLDB4ODhBNSwweDg4QTYsMHg4OEE3LDB4ODhBOCwweDg4QTksLyogMHg5OC0weDlGICovCisJMHg4OEFBLDB4NUMwRiwweDVCNUQsMHg2ODIxLDB4ODA5NiwweDU1NzgsMHg3QjExLDB4NjU0OCwvKiAweEEwLTB4QTcgKi8KKwkweDY5NTQsMHg0RTlCLDB4NkI0NywweDg3NEUsMHg5NzhCLDB4NTM0RiwweDYzMUYsMHg2NDNBLC8qIDB4QTgtMHhBRiAqLworCTB4OTBBQSwweDY1OUMsMHg4MEMxLDB4OEMxMCwweDUxOTksMHg2OEIwLDB4NTM3OCwweDg3RjksLyogMHhCMC0weEI3ICovCisJMHg2MUM4LDB4NkNDNCwweDZDRkIsMHg4QzIyLDB4NUM1MSwweDg1QUEsMHg4MkFGLDB4OTUwQywvKiAweEI4LTB4QkYgKi8KKwkweDZCMjMsMHg4RjlCLDB4NjVCMCwweDVGRkIsMHg1RkMzLDB4NEZFMSwweDg4NDUsMHg2NjFGLC8qIDB4QzAtMHhDNyAqLworCTB4ODE2NSwweDczMjksMHg2MEZBLDB4NTE3NCwweDUyMTEsMHg1NzhCLDB4NUY2MiwweDkwQTIsLyogMHhDOC0weENGICovCisJMHg4ODRDLDB4OTE5MiwweDVFNzgsMHg2NzRGLDB4NjAyNywweDU5RDMsMHg1MTQ0LDB4NTFGNiwvKiAweEQwLTB4RDcgKi8KKwkweDgwRjgsMHg1MzA4LDB4NkM3OSwweDk2QzQsMHg3MThBLDB4NEYxMSwweDRGRUUsMHg3RjlFLC8qIDB4RDgtMHhERiAqLworCTB4NjczRCwweDU1QzUsMHg5NTA4LDB4NzlDMCwweDg4OTYsMHg3RUUzLDB4NTg5RiwweDYyMEMsLyogMHhFMC0weEU3ICovCisJMHg5NzAwLDB4ODY1QSwweDU2MTgsMHg5ODdCLDB4NUY5MCwweDhCQjgsMHg4NEM0LDB4OTE1NywvKiAweEU4LTB4RUYgKi8KKwkweDUzRDksMHg2NUVELDB4NUU4RiwweDc1NUMsMHg2MDY0LDB4N0Q2RSwweDVBN0YsMHg3RUVBLC8qIDB4RjAtMHhGNyAqLworCTB4N0VFRCwweDhGNjksMHg1NUE3LDB4NUJBMywweDYwQUMsMHg2NUNCLDB4NzM4NCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRDFbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4OEFDLDB4ODhBRSwweDg4QUYsMHg4OEIwLDB4ODhCMiwweDg4QjMsMHg4OEI0LDB4ODhCNSwvKiAweDQwLTB4NDcgKi8KKwkweDg4QjYsMHg4OEI4LDB4ODhCOSwweDg4QkEsMHg4OEJCLDB4ODhCRCwweDg4QkUsMHg4OEJGLC8qIDB4NDgtMHg0RiAqLworCTB4ODhDMCwweDg4QzMsMHg4OEM0LDB4ODhDNywweDg4QzgsMHg4OENBLDB4ODhDQiwweDg4Q0MsLyogMHg1MC0weDU3ICovCisJMHg4OENELDB4ODhDRiwweDg4RDAsMHg4OEQxLDB4ODhEMywweDg4RDYsMHg4OEQ3LDB4ODhEQSwvKiAweDU4LTB4NUYgKi8KKwkweDg4REIsMHg4OERDLDB4ODhERCwweDg4REUsMHg4OEUwLDB4ODhFMSwweDg4RTYsMHg4OEU3LC8qIDB4NjAtMHg2NyAqLworCTB4ODhFOSwweDg4RUEsMHg4OEVCLDB4ODhFQywweDg4RUQsMHg4OEVFLDB4ODhFRiwweDg4RjIsLyogMHg2OC0weDZGICovCisJMHg4OEY1LDB4ODhGNiwweDg4RjcsMHg4OEZBLDB4ODhGQiwweDg4RkQsMHg4OEZGLDB4ODkwMCwvKiAweDcwLTB4NzcgKi8KKwkweDg5MDEsMHg4OTAzLDB4ODkwNCwweDg5MDUsMHg4OTA2LDB4ODkwNywweDg5MDgsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg4OTA5LDB4ODkwQiwweDg5MEMsMHg4OTBELDB4ODkwRSwweDg5MEYsMHg4OTExLDB4ODkxNCwvKiAweDgwLTB4ODcgKi8KKwkweDg5MTUsMHg4OTE2LDB4ODkxNywweDg5MTgsMHg4OTFDLDB4ODkxRCwweDg5MUUsMHg4OTFGLC8qIDB4ODgtMHg4RiAqLworCTB4ODkyMCwweDg5MjIsMHg4OTIzLDB4ODkyNCwweDg5MjYsMHg4OTI3LDB4ODkyOCwweDg5MjksLyogMHg5MC0weDk3ICovCisJMHg4OTJDLDB4ODkyRCwweDg5MkUsMHg4OTJGLDB4ODkzMSwweDg5MzIsMHg4OTMzLDB4ODkzNSwvKiAweDk4LTB4OUYgKi8KKwkweDg5MzcsMHg5MDA5LDB4NzY2MywweDc3MjksMHg3RURBLDB4OTc3NCwweDg1OUIsMHg1QjY2LC8qIDB4QTAtMHhBNyAqLworCTB4N0E3NCwweDk2RUEsMHg4ODQwLDB4NTJDQiwweDcxOEYsMHg1RkFBLDB4NjVFQywweDhCRTIsLyogMHhBOC0weEFGICovCisJMHg1QkZCLDB4OUE2RiwweDVERTEsMHg2Qjg5LDB4NkM1QiwweDhCQUQsMHg4QkFGLDB4OTAwQSwvKiAweEIwLTB4QjcgKi8KKwkweDhGQzUsMHg1MzhCLDB4NjJCQywweDlFMjYsMHg5RTJELDB4NTQ0MCwweDRFMkIsMHg4MkJELC8qIDB4QjgtMHhCRiAqLworCTB4NzI1OSwweDg2OUMsMHg1RDE2LDB4ODg1OSwweDZEQUYsMHg5NkM1LDB4NTREMSwweDRFOUEsLyogMHhDMC0weEM3ICovCisJMHg4QkI2LDB4NzEwOSwweDU0QkQsMHg5NjA5LDB4NzBERiwweDZERjksMHg3NkQwLDB4NEUyNSwvKiAweEM4LTB4Q0YgKi8KKwkweDc4MTQsMHg4NzEyLDB4NUNBOSwweDVFRjYsMHg4QTAwLDB4OTg5QywweDk2MEUsMHg3MDhFLC8qIDB4RDAtMHhENyAqLworCTB4NkNCRiwweDU5NDQsMHg2M0E5LDB4NzczQywweDg4NEQsMHg2RjE0LDB4ODI3MywweDU4MzAsLyogMHhEOC0weERGICovCisJMHg3MUQ1LDB4NTM4QywweDc4MUEsMHg5NkMxLDB4NTUwMSwweDVGNjYsMHg3MTMwLDB4NUJCNCwvKiAweEUwLTB4RTcgKi8KKwkweDhDMUEsMHg5QThDLDB4NkI4MywweDU5MkUsMHg5RTJGLDB4NzlFNywweDY3NjgsMHg2MjZDLC8qIDB4RTgtMHhFRiAqLworCTB4NEY2RiwweDc1QTEsMHg3RjhBLDB4NkQwQiwweDk2MzMsMHg2QzI3LDB4NEVGMCwweDc1RDIsLyogMHhGMC0weEY3ICovCisJMHg1MTdCLDB4NjgzNywweDZGM0UsMHg5MDgwLDB4ODE3MCwweDU5OTYsMHg3NDc2LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9EMlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDg5MzgsMHg4OTM5LDB4ODkzQSwweDg5M0IsMHg4OTNDLDB4ODkzRCwweDg5M0UsMHg4OTNGLC8qIDB4NDAtMHg0NyAqLworCTB4ODk0MCwweDg5NDIsMHg4OTQzLDB4ODk0NSwweDg5NDYsMHg4OTQ3LDB4ODk0OCwweDg5NDksLyogMHg0OC0weDRGICovCisJMHg4OTRBLDB4ODk0QiwweDg5NEMsMHg4OTRELDB4ODk0RSwweDg5NEYsMHg4OTUwLDB4ODk1MSwvKiAweDUwLTB4NTcgKi8KKwkweDg5NTIsMHg4OTUzLDB4ODk1NCwweDg5NTUsMHg4OTU2LDB4ODk1NywweDg5NTgsMHg4OTU5LC8qIDB4NTgtMHg1RiAqLworCTB4ODk1QSwweDg5NUIsMHg4OTVDLDB4ODk1RCwweDg5NjAsMHg4OTYxLDB4ODk2MiwweDg5NjMsLyogMHg2MC0weDY3ICovCisJMHg4OTY0LDB4ODk2NSwweDg5NjcsMHg4OTY4LDB4ODk2OSwweDg5NkEsMHg4OTZCLDB4ODk2QywvKiAweDY4LTB4NkYgKi8KKwkweDg5NkQsMHg4OTZFLDB4ODk2RiwweDg5NzAsMHg4OTcxLDB4ODk3MiwweDg5NzMsMHg4OTc0LC8qIDB4NzAtMHg3NyAqLworCTB4ODk3NSwweDg5NzYsMHg4OTc3LDB4ODk3OCwweDg5NzksMHg4OTdBLDB4ODk3QywweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDg5N0QsMHg4OTdFLDB4ODk4MCwweDg5ODIsMHg4OTg0LDB4ODk4NSwweDg5ODcsMHg4OTg4LC8qIDB4ODAtMHg4NyAqLworCTB4ODk4OSwweDg5OEEsMHg4OThCLDB4ODk4QywweDg5OEQsMHg4OThFLDB4ODk4RiwweDg5OTAsLyogMHg4OC0weDhGICovCisJMHg4OTkxLDB4ODk5MiwweDg5OTMsMHg4OTk0LDB4ODk5NSwweDg5OTYsMHg4OTk3LDB4ODk5OCwvKiAweDkwLTB4OTcgKi8KKwkweDg5OTksMHg4OTlBLDB4ODk5QiwweDg5OUMsMHg4OTlELDB4ODk5RSwweDg5OUYsMHg4OUEwLC8qIDB4OTgtMHg5RiAqLworCTB4ODlBMSwweDY0NDcsMHg1QzI3LDB4OTA2NSwweDdBOTEsMHg4QzIzLDB4NTlEQSwweDU0QUMsLyogMHhBMC0weEE3ICovCisJMHg4MjAwLDB4ODM2RiwweDg5ODEsMHg4MDAwLDB4NjkzMCwweDU2NEUsMHg4MDM2LDB4NzIzNywvKiAweEE4LTB4QUYgKi8KKwkweDkxQ0UsMHg1MUI2LDB4NEU1RiwweDk4NzUsMHg2Mzk2LDB4NEUxQSwweDUzRjYsMHg2NkYzLC8qIDB4QjAtMHhCNyAqLworCTB4ODE0QiwweDU5MUMsMHg2REIyLDB4NEUwMCwweDU4RjksMHg1MzNCLDB4NjNENiwweDk0RjEsLyogMHhCOC0weEJGICovCisJMHg0RjlELDB4NEYwQSwweDg4NjMsMHg5ODkwLDB4NTkzNywweDkwNTcsMHg3OUZCLDB4NEVFQSwvKiAweEMwLTB4QzcgKi8KKwkweDgwRjAsMHg3NTkxLDB4NkM4MiwweDVCOUMsMHg1OUU4LDB4NUY1RCwweDY5MDUsMHg4NjgxLC8qIDB4QzgtMHhDRiAqLworCTB4NTAxQSwweDVERjIsMHg0RTU5LDB4NzdFMywweDRFRTUsMHg4MjdBLDB4NjI5MSwweDY2MTMsLyogMHhEMC0weEQ3ICovCisJMHg5MDkxLDB4NUM3OSwweDRFQkYsMHg1Rjc5LDB4ODFDNiwweDkwMzgsMHg4MDg0LDB4NzVBQiwvKiAweEQ4LTB4REYgKi8KKwkweDRFQTYsMHg4OEQ0LDB4NjEwRiwweDZCQzUsMHg1RkM2LDB4NEU0OSwweDc2Q0EsMHg2RUEyLC8qIDB4RTAtMHhFNyAqLworCTB4OEJFMywweDhCQUUsMHg4QzBBLDB4OEJEMSwweDVGMDIsMHg3RkZDLDB4N0ZDQywweDdFQ0UsLyogMHhFOC0weEVGICovCisJMHg4MzM1LDB4ODM2QiwweDU2RTAsMHg2QkI3LDB4OTdGMywweDk2MzQsMHg1OUZCLDB4NTQxRiwvKiAweEYwLTB4RjcgKi8KKwkweDk0RjYsMHg2REVCLDB4NUJDNSwweDk5NkUsMHg1QzM5LDB4NUYxNSwweDk2OTAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0QzWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4ODlBMiwweDg5QTMsMHg4OUE0LDB4ODlBNSwweDg5QTYsMHg4OUE3LDB4ODlBOCwweDg5QTksLyogMHg0MC0weDQ3ICovCisJMHg4OUFBLDB4ODlBQiwweDg5QUMsMHg4OUFELDB4ODlBRSwweDg5QUYsMHg4OUIwLDB4ODlCMSwvKiAweDQ4LTB4NEYgKi8KKwkweDg5QjIsMHg4OUIzLDB4ODlCNCwweDg5QjUsMHg4OUI2LDB4ODlCNywweDg5QjgsMHg4OUI5LC8qIDB4NTAtMHg1NyAqLworCTB4ODlCQSwweDg5QkIsMHg4OUJDLDB4ODlCRCwweDg5QkUsMHg4OUJGLDB4ODlDMCwweDg5QzMsLyogMHg1OC0weDVGICovCisJMHg4OUNELDB4ODlEMywweDg5RDQsMHg4OUQ1LDB4ODlENywweDg5RDgsMHg4OUQ5LDB4ODlEQiwvKiAweDYwLTB4NjcgKi8KKwkweDg5REQsMHg4OURGLDB4ODlFMCwweDg5RTEsMHg4OUUyLDB4ODlFNCwweDg5RTcsMHg4OUU4LC8qIDB4NjgtMHg2RiAqLworCTB4ODlFOSwweDg5RUEsMHg4OUVDLDB4ODlFRCwweDg5RUUsMHg4OUYwLDB4ODlGMSwweDg5RjIsLyogMHg3MC0weDc3ICovCisJMHg4OUY0LDB4ODlGNSwweDg5RjYsMHg4OUY3LDB4ODlGOCwweDg5RjksMHg4OUZBLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4ODlGQiwweDg5RkMsMHg4OUZELDB4ODlGRSwweDg5RkYsMHg4QTAxLDB4OEEwMiwweDhBMDMsLyogMHg4MC0weDg3ICovCisJMHg4QTA0LDB4OEEwNSwweDhBMDYsMHg4QTA4LDB4OEEwOSwweDhBMEEsMHg4QTBCLDB4OEEwQywvKiAweDg4LTB4OEYgKi8KKwkweDhBMEQsMHg4QTBFLDB4OEEwRiwweDhBMTAsMHg4QTExLDB4OEExMiwweDhBMTMsMHg4QTE0LC8qIDB4OTAtMHg5NyAqLworCTB4OEExNSwweDhBMTYsMHg4QTE3LDB4OEExOCwweDhBMTksMHg4QTFBLDB4OEExQiwweDhBMUMsLyogMHg5OC0weDlGICovCisJMHg4QTFELDB4NTM3MCwweDgyRjEsMHg2QTMxLDB4NUE3NCwweDlFNzAsMHg1RTk0LDB4N0YyOCwvKiAweEEwLTB4QTcgKi8KKwkweDgzQjksMHg4NDI0LDB4ODQyNSwweDgzNjcsMHg4NzQ3LDB4OEZDRSwweDhENjIsMHg3NkM4LC8qIDB4QTgtMHhBRiAqLworCTB4NUY3MSwweDk4OTYsMHg3ODZDLDB4NjYyMCwweDU0REYsMHg2MkU1LDB4NEY2MywweDgxQzMsLyogMHhCMC0weEI3ICovCisJMHg3NUM4LDB4NUVCOCwweDk2Q0QsMHg4RTBBLDB4ODZGOSwweDU0OEYsMHg2Q0YzLDB4NkQ4QywvKiAweEI4LTB4QkYgKi8KKwkweDZDMzgsMHg2MDdGLDB4NTJDNywweDc1MjgsMHg1RTdELDB4NEYxOCwweDYwQTAsMHg1RkU3LC8qIDB4QzAtMHhDNyAqLworCTB4NUMyNCwweDc1MzEsMHg5MEFFLDB4OTRDMCwweDcyQjksMHg2Q0I5LDB4NkUzOCwweDkxNDksLyogMHhDOC0weENGICovCisJMHg2NzA5LDB4NTNDQiwweDUzRjMsMHg0RjUxLDB4OTFDOSwweDhCRjEsMHg1M0M4LDB4NUU3QywvKiAweEQwLTB4RDcgKi8KKwkweDhGQzIsMHg2REU0LDB4NEU4RSwweDc2QzIsMHg2OTg2LDB4ODY1RSwweDYxMUEsMHg4MjA2LC8qIDB4RDgtMHhERiAqLworCTB4NEY1OSwweDRGREUsMHg5MDNFLDB4OUM3QywweDYxMDksMHg2RTFELDB4NkUxNCwweDk2ODUsLyogMHhFMC0weEU3ICovCisJMHg0RTg4LDB4NUEzMSwweDk2RTgsMHg0RTBFLDB4NUM3RiwweDc5QjksMHg1Qjg3LDB4OEJFRCwvKiAweEU4LTB4RUYgKi8KKwkweDdGQkQsMHg3Mzg5LDB4NTdERiwweDgyOEIsMHg5MEMxLDB4NTQwMSwweDkwNDcsMHg1NUJCLC8qIDB4RjAtMHhGNyAqLworCTB4NUNFQSwweDVGQTEsMHg2MTA4LDB4NkIzMiwweDcyRjEsMHg4MEIyLDB4OEE4OSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRDRbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4QTFFLDB4OEExRiwweDhBMjAsMHg4QTIxLDB4OEEyMiwweDhBMjMsMHg4QTI0LDB4OEEyNSwvKiAweDQwLTB4NDcgKi8KKwkweDhBMjYsMHg4QTI3LDB4OEEyOCwweDhBMjksMHg4QTJBLDB4OEEyQiwweDhBMkMsMHg4QTJELC8qIDB4NDgtMHg0RiAqLworCTB4OEEyRSwweDhBMkYsMHg4QTMwLDB4OEEzMSwweDhBMzIsMHg4QTMzLDB4OEEzNCwweDhBMzUsLyogMHg1MC0weDU3ICovCisJMHg4QTM2LDB4OEEzNywweDhBMzgsMHg4QTM5LDB4OEEzQSwweDhBM0IsMHg4QTNDLDB4OEEzRCwvKiAweDU4LTB4NUYgKi8KKwkweDhBM0YsMHg4QTQwLDB4OEE0MSwweDhBNDIsMHg4QTQzLDB4OEE0NCwweDhBNDUsMHg4QTQ2LC8qIDB4NjAtMHg2NyAqLworCTB4OEE0NywweDhBNDksMHg4QTRBLDB4OEE0QiwweDhBNEMsMHg4QTRELDB4OEE0RSwweDhBNEYsLyogMHg2OC0weDZGICovCisJMHg4QTUwLDB4OEE1MSwweDhBNTIsMHg4QTUzLDB4OEE1NCwweDhBNTUsMHg4QTU2LDB4OEE1NywvKiAweDcwLTB4NzcgKi8KKwkweDhBNTgsMHg4QTU5LDB4OEE1QSwweDhBNUIsMHg4QTVDLDB4OEE1RCwweDhBNUUsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg4QTVGLDB4OEE2MCwweDhBNjEsMHg4QTYyLDB4OEE2MywweDhBNjQsMHg4QTY1LDB4OEE2NiwvKiAweDgwLTB4ODcgKi8KKwkweDhBNjcsMHg4QTY4LDB4OEE2OSwweDhBNkEsMHg4QTZCLDB4OEE2QywweDhBNkQsMHg4QTZFLC8qIDB4ODgtMHg4RiAqLworCTB4OEE2RiwweDhBNzAsMHg4QTcxLDB4OEE3MiwweDhBNzMsMHg4QTc0LDB4OEE3NSwweDhBNzYsLyogMHg5MC0weDk3ICovCisJMHg4QTc3LDB4OEE3OCwweDhBN0EsMHg4QTdCLDB4OEE3QywweDhBN0QsMHg4QTdFLDB4OEE3RiwvKiAweDk4LTB4OUYgKi8KKwkweDhBODAsMHg2RDc0LDB4NUJEMywweDg4RDUsMHg5ODg0LDB4OEM2QiwweDlBNkQsMHg5RTMzLC8qIDB4QTAtMHhBNyAqLworCTB4NkUwQSwweDUxQTQsMHg1MTQzLDB4NTdBMywweDg4ODEsMHg1MzlGLDB4NjNGNCwweDhGOTUsLyogMHhBOC0weEFGICovCisJMHg1NkVELDB4NTQ1OCwweDU3MDYsMHg3MzNGLDB4NkU5MCwweDdGMTgsMHg4RkRDLDB4ODJEMSwvKiAweEIwLTB4QjcgKi8KKwkweDYxM0YsMHg2MDI4LDB4OTY2MiwweDY2RjAsMHg3RUE2LDB4OEQ4QSwweDhEQzMsMHg5NEE1LC8qIDB4QjgtMHhCRiAqLworCTB4NUNCMywweDdDQTQsMHg2NzA4LDB4NjBBNiwweDk2MDUsMHg4MDE4LDB4NEU5MSwweDkwRTcsLyogMHhDMC0weEM3ICovCisJMHg1MzAwLDB4OTY2OCwweDUxNDEsMHg4RkQwLDB4ODU3NCwweDkxNUQsMHg2NjU1LDB4OTdGNSwvKiAweEM4LTB4Q0YgKi8KKwkweDVCNTUsMHg1MzFELDB4NzgzOCwweDY3NDIsMHg2ODNELDB4NTRDOSwweDcwN0UsMHg1QkIwLC8qIDB4RDAtMHhENyAqLworCTB4OEY3RCwweDUxOEQsMHg1NzI4LDB4NTRCMSwweDY1MTIsMHg2NjgyLDB4OEQ1RSwweDhENDMsLyogMHhEOC0weERGICovCisJMHg4MTBGLDB4ODQ2QywweDkwNkQsMHg3Q0RGLDB4NTFGRiwweDg1RkIsMHg2N0EzLDB4NjVFOSwvKiAweEUwLTB4RTcgKi8KKwkweDZGQTEsMHg4NkE0LDB4OEU4MSwweDU2NkEsMHg5MDIwLDB4NzY4MiwweDcwNzYsMHg3MUU1LC8qIDB4RTgtMHhFRiAqLworCTB4OEQyMywweDYyRTksMHg1MjE5LDB4NkNGRCwweDhEM0MsMHg2MDBFLDB4NTg5RSwweDYxOEUsLyogMHhGMC0weEY3ICovCisJMHg2NkZFLDB4OEQ2MCwweDYyNEUsMHg1NUIzLDB4NkUyMywweDY3MkQsMHg4RjY3LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9ENVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDhBODEsMHg4QTgyLDB4OEE4MywweDhBODQsMHg4QTg1LDB4OEE4NiwweDhBODcsMHg4QTg4LC8qIDB4NDAtMHg0NyAqLworCTB4OEE4QiwweDhBOEMsMHg4QThELDB4OEE4RSwweDhBOEYsMHg4QTkwLDB4OEE5MSwweDhBOTIsLyogMHg0OC0weDRGICovCisJMHg4QTk0LDB4OEE5NSwweDhBOTYsMHg4QTk3LDB4OEE5OCwweDhBOTksMHg4QTlBLDB4OEE5QiwvKiAweDUwLTB4NTcgKi8KKwkweDhBOUMsMHg4QTlELDB4OEE5RSwweDhBOUYsMHg4QUEwLDB4OEFBMSwweDhBQTIsMHg4QUEzLC8qIDB4NTgtMHg1RiAqLworCTB4OEFBNCwweDhBQTUsMHg4QUE2LDB4OEFBNywweDhBQTgsMHg4QUE5LDB4OEFBQSwweDhBQUIsLyogMHg2MC0weDY3ICovCisJMHg4QUFDLDB4OEFBRCwweDhBQUUsMHg4QUFGLDB4OEFCMCwweDhBQjEsMHg4QUIyLDB4OEFCMywvKiAweDY4LTB4NkYgKi8KKwkweDhBQjQsMHg4QUI1LDB4OEFCNiwweDhBQjcsMHg4QUI4LDB4OEFCOSwweDhBQkEsMHg4QUJCLC8qIDB4NzAtMHg3NyAqLworCTB4OEFCQywweDhBQkQsMHg4QUJFLDB4OEFCRiwweDhBQzAsMHg4QUMxLDB4OEFDMiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDhBQzMsMHg4QUM0LDB4OEFDNSwweDhBQzYsMHg4QUM3LDB4OEFDOCwweDhBQzksMHg4QUNBLC8qIDB4ODAtMHg4NyAqLworCTB4OEFDQiwweDhBQ0MsMHg4QUNELDB4OEFDRSwweDhBQ0YsMHg4QUQwLDB4OEFEMSwweDhBRDIsLyogMHg4OC0weDhGICovCisJMHg4QUQzLDB4OEFENCwweDhBRDUsMHg4QUQ2LDB4OEFENywweDhBRDgsMHg4QUQ5LDB4OEFEQSwvKiAweDkwLTB4OTcgKi8KKwkweDhBREIsMHg4QURDLDB4OEFERCwweDhBREUsMHg4QURGLDB4OEFFMCwweDhBRTEsMHg4QUUyLC8qIDB4OTgtMHg5RiAqLworCTB4OEFFMywweDk0RTEsMHg5NUY4LDB4NzcyOCwweDY4MDUsMHg2OUE4LDB4NTQ4QiwweDRFNEQsLyogMHhBMC0weEE3ICovCisJMHg3MEI4LDB4OEJDOCwweDY0NTgsMHg2NThCLDB4NUI4NSwweDdBODQsMHg1MDNBLDB4NUJFOCwvKiAweEE4LTB4QUYgKi8KKwkweDc3QkIsMHg2QkUxLDB4OEE3OSwweDdDOTgsMHg2Q0JFLDB4NzZDRiwweDY1QTksMHg4Rjk3LC8qIDB4QjAtMHhCNyAqLworCTB4NUQyRCwweDVDNTUsMHg4NjM4LDB4NjgwOCwweDUzNjAsMHg2MjE4LDB4N0FEOSwweDZFNUIsLyogMHhCOC0weEJGICovCisJMHg3RUZELDB4NkExRiwweDdBRTAsMHg1RjcwLDB4NkYzMywweDVGMjAsMHg2MzhDLDB4NkRBOCwvKiAweEMwLTB4QzcgKi8KKwkweDY3NTYsMHg0RTA4LDB4NUUxMCwweDhEMjYsMHg0RUQ3LDB4ODBDMCwweDc2MzQsMHg5NjlDLC8qIDB4QzgtMHhDRiAqLworCTB4NjJEQiwweDY2MkQsMHg2MjdFLDB4NkNCQywweDhENzUsMHg3MTY3LDB4N0Y2OSwweDUxNDYsLyogMHhEMC0weEQ3ICovCisJMHg4MDg3LDB4NTNFQywweDkwNkUsMHg2Mjk4LDB4NTRGMiwweDg2RjAsMHg4Rjk5LDB4ODAwNSwvKiAweEQ4LTB4REYgKi8KKwkweDk1MTcsMHg4NTE3LDB4OEZEOSwweDZENTksMHg3M0NELDB4NjU5RiwweDc3MUYsMHg3NTA0LC8qIDB4RTAtMHhFNyAqLworCTB4NzgyNywweDgxRkIsMHg4RDFFLDB4OTQ4OCwweDRGQTYsMHg2Nzk1LDB4NzVCOSwweDhCQ0EsLyogMHhFOC0weEVGICovCisJMHg5NzA3LDB4NjMyRiwweDk1NDcsMHg5NjM1LDB4ODRCOCwweDYzMjMsMHg3NzQxLDB4NUY4MSwvKiAweEYwLTB4RjcgKi8KKwkweDcyRjAsMHg0RTg5LDB4NjAxNCwweDY1NzQsMHg2MkVGLDB4NkI2MywweDY1M0YsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0Q2WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OEFFNCwweDhBRTUsMHg4QUU2LDB4OEFFNywweDhBRTgsMHg4QUU5LDB4OEFFQSwweDhBRUIsLyogMHg0MC0weDQ3ICovCisJMHg4QUVDLDB4OEFFRCwweDhBRUUsMHg4QUVGLDB4OEFGMCwweDhBRjEsMHg4QUYyLDB4OEFGMywvKiAweDQ4LTB4NEYgKi8KKwkweDhBRjQsMHg4QUY1LDB4OEFGNiwweDhBRjcsMHg4QUY4LDB4OEFGOSwweDhBRkEsMHg4QUZCLC8qIDB4NTAtMHg1NyAqLworCTB4OEFGQywweDhBRkQsMHg4QUZFLDB4OEFGRiwweDhCMDAsMHg4QjAxLDB4OEIwMiwweDhCMDMsLyogMHg1OC0weDVGICovCisJMHg4QjA0LDB4OEIwNSwweDhCMDYsMHg4QjA4LDB4OEIwOSwweDhCMEEsMHg4QjBCLDB4OEIwQywvKiAweDYwLTB4NjcgKi8KKwkweDhCMEQsMHg4QjBFLDB4OEIwRiwweDhCMTAsMHg4QjExLDB4OEIxMiwweDhCMTMsMHg4QjE0LC8qIDB4NjgtMHg2RiAqLworCTB4OEIxNSwweDhCMTYsMHg4QjE3LDB4OEIxOCwweDhCMTksMHg4QjFBLDB4OEIxQiwweDhCMUMsLyogMHg3MC0weDc3ICovCisJMHg4QjFELDB4OEIxRSwweDhCMUYsMHg4QjIwLDB4OEIyMSwweDhCMjIsMHg4QjIzLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4OEIyNCwweDhCMjUsMHg4QjI3LDB4OEIyOCwweDhCMjksMHg4QjJBLDB4OEIyQiwweDhCMkMsLyogMHg4MC0weDg3ICovCisJMHg4QjJELDB4OEIyRSwweDhCMkYsMHg4QjMwLDB4OEIzMSwweDhCMzIsMHg4QjMzLDB4OEIzNCwvKiAweDg4LTB4OEYgKi8KKwkweDhCMzUsMHg4QjM2LDB4OEIzNywweDhCMzgsMHg4QjM5LDB4OEIzQSwweDhCM0IsMHg4QjNDLC8qIDB4OTAtMHg5NyAqLworCTB4OEIzRCwweDhCM0UsMHg4QjNGLDB4OEI0MCwweDhCNDEsMHg4QjQyLDB4OEI0MywweDhCNDQsLyogMHg5OC0weDlGICovCisJMHg4QjQ1LDB4NUUyNywweDc1QzcsMHg5MEQxLDB4OEJDMSwweDgyOUQsMHg2NzlELDB4NjUyRiwvKiAweEEwLTB4QTcgKi8KKwkweDU0MzEsMHg4NzE4LDB4NzdFNSwweDgwQTIsMHg4MTAyLDB4NkM0MSwweDRFNEIsMHg3RUM3LC8qIDB4QTgtMHhBRiAqLworCTB4ODA0QywweDc2RjQsMHg2OTBELDB4NkI5NiwweDYyNjcsMHg1MDNDLDB4NEY4NCwweDU3NDAsLyogMHhCMC0weEI3ICovCisJMHg2MzA3LDB4NkI2MiwweDhEQkUsMHg1M0VBLDB4NjVFOCwweDdFQjgsMHg1RkQ3LDB4NjMxQSwvKiAweEI4LTB4QkYgKi8KKwkweDYzQjcsMHg4MUYzLDB4ODFGNCwweDdGNkUsMHg1RTFDLDB4NUNEOSwweDUyMzYsMHg2NjdBLC8qIDB4QzAtMHhDNyAqLworCTB4NzlFOSwweDdBMUEsMHg4RDI4LDB4NzA5OSwweDc1RDQsMHg2RURFLDB4NkNCQiwweDdBOTIsLyogMHhDOC0weENGICovCisJMHg0RTJELDB4NzZDNSwweDVGRTAsMHg5NDlGLDB4ODg3NywweDdFQzgsMHg3OUNELDB4ODBCRiwvKiAweEQwLTB4RDcgKi8KKwkweDkxQ0QsMHg0RUYyLDB4NEYxNywweDgyMUYsMHg1NDY4LDB4NURERSwweDZEMzIsMHg4QkNDLC8qIDB4RDgtMHhERiAqLworCTB4N0NBNSwweDhGNzQsMHg4MDk4LDB4NUUxQSwweDU0OTIsMHg3NkIxLDB4NUI5OSwweDY2M0MsLyogMHhFMC0weEU3ICovCisJMHg5QUE0LDB4NzNFMCwweDY4MkEsMHg4NkRCLDB4NjczMSwweDczMkEsMHg4QkY4LDB4OEJEQiwvKiAweEU4LTB4RUYgKi8KKwkweDkwMTAsMHg3QUY5LDB4NzBEQiwweDcxNkUsMHg2MkM0LDB4NzdBOSwweDU2MzEsMHg0RTNCLC8qIDB4RjAtMHhGNyAqLworCTB4ODQ1NywweDY3RjEsMHg1MkE5LDB4ODZDMCwweDhEMkUsMHg5NEY4LDB4N0I1MSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRDdbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4QjQ2LDB4OEI0NywweDhCNDgsMHg4QjQ5LDB4OEI0QSwweDhCNEIsMHg4QjRDLDB4OEI0RCwvKiAweDQwLTB4NDcgKi8KKwkweDhCNEUsMHg4QjRGLDB4OEI1MCwweDhCNTEsMHg4QjUyLDB4OEI1MywweDhCNTQsMHg4QjU1LC8qIDB4NDgtMHg0RiAqLworCTB4OEI1NiwweDhCNTcsMHg4QjU4LDB4OEI1OSwweDhCNUEsMHg4QjVCLDB4OEI1QywweDhCNUQsLyogMHg1MC0weDU3ICovCisJMHg4QjVFLDB4OEI1RiwweDhCNjAsMHg4QjYxLDB4OEI2MiwweDhCNjMsMHg4QjY0LDB4OEI2NSwvKiAweDU4LTB4NUYgKi8KKwkweDhCNjcsMHg4QjY4LDB4OEI2OSwweDhCNkEsMHg4QjZCLDB4OEI2RCwweDhCNkUsMHg4QjZGLC8qIDB4NjAtMHg2NyAqLworCTB4OEI3MCwweDhCNzEsMHg4QjcyLDB4OEI3MywweDhCNzQsMHg4Qjc1LDB4OEI3NiwweDhCNzcsLyogMHg2OC0weDZGICovCisJMHg4Qjc4LDB4OEI3OSwweDhCN0EsMHg4QjdCLDB4OEI3QywweDhCN0QsMHg4QjdFLDB4OEI3RiwvKiAweDcwLTB4NzcgKi8KKwkweDhCODAsMHg4QjgxLDB4OEI4MiwweDhCODMsMHg4Qjg0LDB4OEI4NSwweDhCODYsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg4Qjg3LDB4OEI4OCwweDhCODksMHg4QjhBLDB4OEI4QiwweDhCOEMsMHg4QjhELDB4OEI4RSwvKiAweDgwLTB4ODcgKi8KKwkweDhCOEYsMHg4QjkwLDB4OEI5MSwweDhCOTIsMHg4QjkzLDB4OEI5NCwweDhCOTUsMHg4Qjk2LC8qIDB4ODgtMHg4RiAqLworCTB4OEI5NywweDhCOTgsMHg4Qjk5LDB4OEI5QSwweDhCOUIsMHg4QjlDLDB4OEI5RCwweDhCOUUsLyogMHg5MC0weDk3ICovCisJMHg4QjlGLDB4OEJBQywweDhCQjEsMHg4QkJCLDB4OEJDNywweDhCRDAsMHg4QkVBLDB4OEMwOSwvKiAweDk4LTB4OUYgKi8KKwkweDhDMUUsMHg0RjRGLDB4NkNFOCwweDc5NUQsMHg5QTdCLDB4NjI5MywweDcyMkEsMHg2MkZELC8qIDB4QTAtMHhBNyAqLworCTB4NEUxMywweDc4MTYsMHg4RjZDLDB4NjRCMCwweDhENUEsMHg3QkM2LDB4Njg2OSwweDVFODQsLyogMHhBOC0weEFGICovCisJMHg4OEM1LDB4NTk4NiwweDY0OUUsMHg1OEVFLDB4NzJCNiwweDY5MEUsMHg5NTI1LDB4OEZGRCwvKiAweEIwLTB4QjcgKi8KKwkweDhENTgsMHg1NzYwLDB4N0YwMCwweDhDMDYsMHg1MUM2LDB4NjM0OSwweDYyRDksMHg1MzUzLC8qIDB4QjgtMHhCRiAqLworCTB4Njg0QywweDc0MjIsMHg4MzAxLDB4OTE0QywweDU1NDQsMHg3NzQwLDB4NzA3QywweDZENEEsLyogMHhDMC0weEM3ICovCisJMHg1MTc5LDB4NTRBOCwweDhENDQsMHg1OUZGLDB4NkVDQiwweDZEQzQsMHg1QjVDLDB4N0QyQiwvKiAweEM4LTB4Q0YgKi8KKwkweDRFRDQsMHg3QzdELDB4NkVEMywweDVCNTAsMHg4MUVBLDB4NkUwRCwweDVCNTcsMHg5QjAzLC8qIDB4RDAtMHhENyAqLworCTB4NjhENSwweDhFMkEsMHg1Qjk3LDB4N0VGQywweDYwM0IsMHg3RUI1LDB4OTBCOSwweDhENzAsLyogMHhEOC0weERGICovCisJMHg1OTRGLDB4NjNDRCwweDc5REYsMHg4REIzLDB4NTM1MiwweDY1Q0YsMHg3OTU2LDB4OEJDNSwvKiAweEUwLTB4RTcgKi8KKwkweDk2M0IsMHg3RUM0LDB4OTRCQiwweDdFODIsMHg1NjM0LDB4OTE4OSwweDY3MDAsMHg3RjZBLC8qIDB4RTgtMHhFRiAqLworCTB4NUMwQSwweDkwNzUsMHg2NjI4LDB4NURFNiwweDRGNTAsMHg2N0RFLDB4NTA1QSwweDRGNUMsLyogMHhGMC0weEY3ICovCisJMHg1NzUwLDB4NUVBNywweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9EOFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDhDMzgsMHg4QzM5LDB4OEMzQSwweDhDM0IsMHg4QzNDLDB4OEMzRCwweDhDM0UsMHg4QzNGLC8qIDB4NDAtMHg0NyAqLworCTB4OEM0MCwweDhDNDIsMHg4QzQzLDB4OEM0NCwweDhDNDUsMHg4QzQ4LDB4OEM0QSwweDhDNEIsLyogMHg0OC0weDRGICovCisJMHg4QzRELDB4OEM0RSwweDhDNEYsMHg4QzUwLDB4OEM1MSwweDhDNTIsMHg4QzUzLDB4OEM1NCwvKiAweDUwLTB4NTcgKi8KKwkweDhDNTYsMHg4QzU3LDB4OEM1OCwweDhDNTksMHg4QzVCLDB4OEM1QywweDhDNUQsMHg4QzVFLC8qIDB4NTgtMHg1RiAqLworCTB4OEM1RiwweDhDNjAsMHg4QzYzLDB4OEM2NCwweDhDNjUsMHg4QzY2LDB4OEM2NywweDhDNjgsLyogMHg2MC0weDY3ICovCisJMHg4QzY5LDB4OEM2QywweDhDNkQsMHg4QzZFLDB4OEM2RiwweDhDNzAsMHg4QzcxLDB4OEM3MiwvKiAweDY4LTB4NkYgKi8KKwkweDhDNzQsMHg4Qzc1LDB4OEM3NiwweDhDNzcsMHg4QzdCLDB4OEM3QywweDhDN0QsMHg4QzdFLC8qIDB4NzAtMHg3NyAqLworCTB4OEM3RiwweDhDODAsMHg4QzgxLDB4OEM4MywweDhDODQsMHg4Qzg2LDB4OEM4NywweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDhDODgsMHg4QzhCLDB4OEM4RCwweDhDOEUsMHg4QzhGLDB4OEM5MCwweDhDOTEsMHg4QzkyLC8qIDB4ODAtMHg4NyAqLworCTB4OEM5MywweDhDOTUsMHg4Qzk2LDB4OEM5NywweDhDOTksMHg4QzlBLDB4OEM5QiwweDhDOUMsLyogMHg4OC0weDhGICovCisJMHg4QzlELDB4OEM5RSwweDhDOUYsMHg4Q0EwLDB4OENBMSwweDhDQTIsMHg4Q0EzLDB4OENBNCwvKiAweDkwLTB4OTcgKi8KKwkweDhDQTUsMHg4Q0E2LDB4OENBNywweDhDQTgsMHg4Q0E5LDB4OENBQSwweDhDQUIsMHg4Q0FDLC8qIDB4OTgtMHg5RiAqLworCTB4OENBRCwweDRFOEQsMHg0RTBDLDB4NTE0MCwweDRFMTAsMHg1RUZGLDB4NTM0NSwweDRFMTUsLyogMHhBMC0weEE3ICovCisJMHg0RTk4LDB4NEUxRSwweDlCMzIsMHg1QjZDLDB4NTY2OSwweDRFMjgsMHg3OUJBLDB4NEUzRiwvKiAweEE4LTB4QUYgKi8KKwkweDUzMTUsMHg0RTQ3LDB4NTkyRCwweDcyM0IsMHg1MzZFLDB4NkMxMCwweDU2REYsMHg4MEU0LC8qIDB4QjAtMHhCNyAqLworCTB4OTk5NywweDZCRDMsMHg3NzdFLDB4OUYxNywweDRFMzYsMHg0RTlGLDB4OUYxMCwweDRFNUMsLyogMHhCOC0weEJGICovCisJMHg0RTY5LDB4NEU5MywweDgyODgsMHg1QjVCLDB4NTU2QywweDU2MEYsMHg0RUM0LDB4NTM4RCwvKiAweEMwLTB4QzcgKi8KKwkweDUzOUQsMHg1M0EzLDB4NTNBNSwweDUzQUUsMHg5NzY1LDB4OEQ1RCwweDUzMUEsMHg1M0Y1LC8qIDB4QzgtMHhDRiAqLworCTB4NTMyNiwweDUzMkUsMHg1MzNFLDB4OEQ1QywweDUzNjYsMHg1MzYzLDB4NTIwMiwweDUyMDgsLyogMHhEMC0weEQ3ICovCisJMHg1MjBFLDB4NTIyRCwweDUyMzMsMHg1MjNGLDB4NTI0MCwweDUyNEMsMHg1MjVFLDB4NTI2MSwvKiAweEQ4LTB4REYgKi8KKwkweDUyNUMsMHg4NEFGLDB4NTI3RCwweDUyODIsMHg1MjgxLDB4NTI5MCwweDUyOTMsMHg1MTgyLC8qIDB4RTAtMHhFNyAqLworCTB4N0Y1NCwweDRFQkIsMHg0RUMzLDB4NEVDOSwweDRFQzIsMHg0RUU4LDB4NEVFMSwweDRFRUIsLyogMHhFOC0weEVGICovCisJMHg0RURFLDB4NEYxQiwweDRFRjMsMHg0RjIyLDB4NEY2NCwweDRFRjUsMHg0RjI1LDB4NEYyNywvKiAweEYwLTB4RjcgKi8KKwkweDRGMDksMHg0RjJCLDB4NEY1RSwweDRGNjcsMHg2NTM4LDB4NEY1QSwweDRGNUQsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0Q5WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OENBRSwweDhDQUYsMHg4Q0IwLDB4OENCMSwweDhDQjIsMHg4Q0IzLDB4OENCNCwweDhDQjUsLyogMHg0MC0weDQ3ICovCisJMHg4Q0I2LDB4OENCNywweDhDQjgsMHg4Q0I5LDB4OENCQSwweDhDQkIsMHg4Q0JDLDB4OENCRCwvKiAweDQ4LTB4NEYgKi8KKwkweDhDQkUsMHg4Q0JGLDB4OENDMCwweDhDQzEsMHg4Q0MyLDB4OENDMywweDhDQzQsMHg4Q0M1LC8qIDB4NTAtMHg1NyAqLworCTB4OENDNiwweDhDQzcsMHg4Q0M4LDB4OENDOSwweDhDQ0EsMHg4Q0NCLDB4OENDQywweDhDQ0QsLyogMHg1OC0weDVGICovCisJMHg4Q0NFLDB4OENDRiwweDhDRDAsMHg4Q0QxLDB4OENEMiwweDhDRDMsMHg4Q0Q0LDB4OENENSwvKiAweDYwLTB4NjcgKi8KKwkweDhDRDYsMHg4Q0Q3LDB4OENEOCwweDhDRDksMHg4Q0RBLDB4OENEQiwweDhDREMsMHg4Q0RELC8qIDB4NjgtMHg2RiAqLworCTB4OENERSwweDhDREYsMHg4Q0UwLDB4OENFMSwweDhDRTIsMHg4Q0UzLDB4OENFNCwweDhDRTUsLyogMHg3MC0weDc3ICovCisJMHg4Q0U2LDB4OENFNywweDhDRTgsMHg4Q0U5LDB4OENFQSwweDhDRUIsMHg4Q0VDLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4OENFRCwweDhDRUUsMHg4Q0VGLDB4OENGMCwweDhDRjEsMHg4Q0YyLDB4OENGMywweDhDRjQsLyogMHg4MC0weDg3ICovCisJMHg4Q0Y1LDB4OENGNiwweDhDRjcsMHg4Q0Y4LDB4OENGOSwweDhDRkEsMHg4Q0ZCLDB4OENGQywvKiAweDg4LTB4OEYgKi8KKwkweDhDRkQsMHg4Q0ZFLDB4OENGRiwweDhEMDAsMHg4RDAxLDB4OEQwMiwweDhEMDMsMHg4RDA0LC8qIDB4OTAtMHg5NyAqLworCTB4OEQwNSwweDhEMDYsMHg4RDA3LDB4OEQwOCwweDhEMDksMHg4RDBBLDB4OEQwQiwweDhEMEMsLyogMHg5OC0weDlGICovCisJMHg4RDBELDB4NEY1RiwweDRGNTcsMHg0RjMyLDB4NEYzRCwweDRGNzYsMHg0Rjc0LDB4NEY5MSwvKiAweEEwLTB4QTcgKi8KKwkweDRGODksMHg0RjgzLDB4NEY4RiwweDRGN0UsMHg0RjdCLDB4NEZBQSwweDRGN0MsMHg0RkFDLC8qIDB4QTgtMHhBRiAqLworCTB4NEY5NCwweDRGRTYsMHg0RkU4LDB4NEZFQSwweDRGQzUsMHg0RkRBLDB4NEZFMywweDRGREMsLyogMHhCMC0weEI3ICovCisJMHg0RkQxLDB4NEZERiwweDRGRjgsMHg1MDI5LDB4NTA0QywweDRGRjMsMHg1MDJDLDB4NTAwRiwvKiAweEI4LTB4QkYgKi8KKwkweDUwMkUsMHg1MDJELDB4NEZGRSwweDUwMUMsMHg1MDBDLDB4NTAyNSwweDUwMjgsMHg1MDdFLC8qIDB4QzAtMHhDNyAqLworCTB4NTA0MywweDUwNTUsMHg1MDQ4LDB4NTA0RSwweDUwNkMsMHg1MDdCLDB4NTBBNSwweDUwQTcsLyogMHhDOC0weENGICovCisJMHg1MEE5LDB4NTBCQSwweDUwRDYsMHg1MTA2LDB4NTBFRCwweDUwRUMsMHg1MEU2LDB4NTBFRSwvKiAweEQwLTB4RDcgKi8KKwkweDUxMDcsMHg1MTBCLDB4NEVERCwweDZDM0QsMHg0RjU4LDB4NEY2NSwweDRGQ0UsMHg5RkEwLC8qIDB4RDgtMHhERiAqLworCTB4NkM0NiwweDdDNzQsMHg1MTZFLDB4NURGRCwweDlFQzksMHg5OTk4LDB4NTE4MSwweDU5MTQsLyogMHhFMC0weEU3ICovCisJMHg1MkY5LDB4NTMwRCwweDhBMDcsMHg1MzEwLDB4NTFFQiwweDU5MTksMHg1MTU1LDB4NEVBMCwvKiAweEU4LTB4RUYgKi8KKwkweDUxNTYsMHg0RUIzLDB4ODg2RSwweDg4QTQsMHg0RUI1LDB4ODExNCwweDg4RDIsMHg3OTgwLC8qIDB4RjAtMHhGNyAqLworCTB4NUIzNCwweDg4MDMsMHg3RkI4LDB4NTFBQiwweDUxQjEsMHg1MUJELDB4NTFCQywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfREFbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4RDBFLDB4OEQwRiwweDhEMTAsMHg4RDExLDB4OEQxMiwweDhEMTMsMHg4RDE0LDB4OEQxNSwvKiAweDQwLTB4NDcgKi8KKwkweDhEMTYsMHg4RDE3LDB4OEQxOCwweDhEMTksMHg4RDFBLDB4OEQxQiwweDhEMUMsMHg4RDIwLC8qIDB4NDgtMHg0RiAqLworCTB4OEQ1MSwweDhENTIsMHg4RDU3LDB4OEQ1RiwweDhENjUsMHg4RDY4LDB4OEQ2OSwweDhENkEsLyogMHg1MC0weDU3ICovCisJMHg4RDZDLDB4OEQ2RSwweDhENkYsMHg4RDcxLDB4OEQ3MiwweDhENzgsMHg4RDc5LDB4OEQ3QSwvKiAweDU4LTB4NUYgKi8KKwkweDhEN0IsMHg4RDdDLDB4OEQ3RCwweDhEN0UsMHg4RDdGLDB4OEQ4MCwweDhEODIsMHg4RDgzLC8qIDB4NjAtMHg2NyAqLworCTB4OEQ4NiwweDhEODcsMHg4RDg4LDB4OEQ4OSwweDhEOEMsMHg4RDhELDB4OEQ4RSwweDhEOEYsLyogMHg2OC0weDZGICovCisJMHg4RDkwLDB4OEQ5MiwweDhEOTMsMHg4RDk1LDB4OEQ5NiwweDhEOTcsMHg4RDk4LDB4OEQ5OSwvKiAweDcwLTB4NzcgKi8KKwkweDhEOUEsMHg4RDlCLDB4OEQ5QywweDhEOUQsMHg4RDlFLDB4OERBMCwweDhEQTEsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg4REEyLDB4OERBNCwweDhEQTUsMHg4REE2LDB4OERBNywweDhEQTgsMHg4REE5LDB4OERBQSwvKiAweDgwLTB4ODcgKi8KKwkweDhEQUIsMHg4REFDLDB4OERBRCwweDhEQUUsMHg4REFGLDB4OERCMCwweDhEQjIsMHg4REI2LC8qIDB4ODgtMHg4RiAqLworCTB4OERCNywweDhEQjksMHg4REJCLDB4OERCRCwweDhEQzAsMHg4REMxLDB4OERDMiwweDhEQzUsLyogMHg5MC0weDk3ICovCisJMHg4REM3LDB4OERDOCwweDhEQzksMHg4RENBLDB4OERDRCwweDhERDAsMHg4REQyLDB4OEREMywvKiAweDk4LTB4OUYgKi8KKwkweDhERDQsMHg1MUM3LDB4NTE5NiwweDUxQTIsMHg1MUE1LDB4OEJBMCwweDhCQTYsMHg4QkE3LC8qIDB4QTAtMHhBNyAqLworCTB4OEJBQSwweDhCQjQsMHg4QkI1LDB4OEJCNywweDhCQzIsMHg4QkMzLDB4OEJDQiwweDhCQ0YsLyogMHhBOC0weEFGICovCisJMHg4QkNFLDB4OEJEMiwweDhCRDMsMHg4QkQ0LDB4OEJENiwweDhCRDgsMHg4QkQ5LDB4OEJEQywvKiAweEIwLTB4QjcgKi8KKwkweDhCREYsMHg4QkUwLDB4OEJFNCwweDhCRTgsMHg4QkU5LDB4OEJFRSwweDhCRjAsMHg4QkYzLC8qIDB4QjgtMHhCRiAqLworCTB4OEJGNiwweDhCRjksMHg4QkZDLDB4OEJGRiwweDhDMDAsMHg4QzAyLDB4OEMwNCwweDhDMDcsLyogMHhDMC0weEM3ICovCisJMHg4QzBDLDB4OEMwRiwweDhDMTEsMHg4QzEyLDB4OEMxNCwweDhDMTUsMHg4QzE2LDB4OEMxOSwvKiAweEM4LTB4Q0YgKi8KKwkweDhDMUIsMHg4QzE4LDB4OEMxRCwweDhDMUYsMHg4QzIwLDB4OEMyMSwweDhDMjUsMHg4QzI3LC8qIDB4RDAtMHhENyAqLworCTB4OEMyQSwweDhDMkIsMHg4QzJFLDB4OEMyRiwweDhDMzIsMHg4QzMzLDB4OEMzNSwweDhDMzYsLyogMHhEOC0weERGICovCisJMHg1MzY5LDB4NTM3QSwweDk2MUQsMHg5NjIyLDB4OTYyMSwweDk2MzEsMHg5NjJBLDB4OTYzRCwvKiAweEUwLTB4RTcgKi8KKwkweDk2M0MsMHg5NjQyLDB4OTY0OSwweDk2NTQsMHg5NjVGLDB4OTY2NywweDk2NkMsMHg5NjcyLC8qIDB4RTgtMHhFRiAqLworCTB4OTY3NCwweDk2ODgsMHg5NjhELDB4OTY5NywweDk2QjAsMHg5MDk3LDB4OTA5QiwweDkwOUQsLyogMHhGMC0weEY3ICovCisJMHg5MDk5LDB4OTBBQywweDkwQTEsMHg5MEI0LDB4OTBCMywweDkwQjYsMHg5MEJBLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9EQlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDhERDUsMHg4REQ4LDB4OEREOSwweDhEREMsMHg4REUwLDB4OERFMSwweDhERTIsMHg4REU1LC8qIDB4NDAtMHg0NyAqLworCTB4OERFNiwweDhERTcsMHg4REU5LDB4OERFRCwweDhERUUsMHg4REYwLDB4OERGMSwweDhERjIsLyogMHg0OC0weDRGICovCisJMHg4REY0LDB4OERGNiwweDhERkMsMHg4REZFLDB4OERGRiwweDhFMDAsMHg4RTAxLDB4OEUwMiwvKiAweDUwLTB4NTcgKi8KKwkweDhFMDMsMHg4RTA0LDB4OEUwNiwweDhFMDcsMHg4RTA4LDB4OEUwQiwweDhFMEQsMHg4RTBFLC8qIDB4NTgtMHg1RiAqLworCTB4OEUxMCwweDhFMTEsMHg4RTEyLDB4OEUxMywweDhFMTUsMHg4RTE2LDB4OEUxNywweDhFMTgsLyogMHg2MC0weDY3ICovCisJMHg4RTE5LDB4OEUxQSwweDhFMUIsMHg4RTFDLDB4OEUyMCwweDhFMjEsMHg4RTI0LDB4OEUyNSwvKiAweDY4LTB4NkYgKi8KKwkweDhFMjYsMHg4RTI3LDB4OEUyOCwweDhFMkIsMHg4RTJELDB4OEUzMCwweDhFMzIsMHg4RTMzLC8qIDB4NzAtMHg3NyAqLworCTB4OEUzNCwweDhFMzYsMHg4RTM3LDB4OEUzOCwweDhFM0IsMHg4RTNDLDB4OEUzRSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDhFM0YsMHg4RTQzLDB4OEU0NSwweDhFNDYsMHg4RTRDLDB4OEU0RCwweDhFNEUsMHg4RTRGLC8qIDB4ODAtMHg4NyAqLworCTB4OEU1MCwweDhFNTMsMHg4RTU0LDB4OEU1NSwweDhFNTYsMHg4RTU3LDB4OEU1OCwweDhFNUEsLyogMHg4OC0weDhGICovCisJMHg4RTVCLDB4OEU1QywweDhFNUQsMHg4RTVFLDB4OEU1RiwweDhFNjAsMHg4RTYxLDB4OEU2MiwvKiAweDkwLTB4OTcgKi8KKwkweDhFNjMsMHg4RTY0LDB4OEU2NSwweDhFNjcsMHg4RTY4LDB4OEU2QSwweDhFNkIsMHg4RTZFLC8qIDB4OTgtMHg5RiAqLworCTB4OEU3MSwweDkwQjgsMHg5MEIwLDB4OTBDRiwweDkwQzUsMHg5MEJFLDB4OTBEMCwweDkwQzQsLyogMHhBMC0weEE3ICovCisJMHg5MEM3LDB4OTBEMywweDkwRTYsMHg5MEUyLDB4OTBEQywweDkwRDcsMHg5MERCLDB4OTBFQiwvKiAweEE4LTB4QUYgKi8KKwkweDkwRUYsMHg5MEZFLDB4OTEwNCwweDkxMjIsMHg5MTFFLDB4OTEyMywweDkxMzEsMHg5MTJGLC8qIDB4QjAtMHhCNyAqLworCTB4OTEzOSwweDkxNDMsMHg5MTQ2LDB4NTIwRCwweDU5NDIsMHg1MkEyLDB4NTJBQywweDUyQUQsLyogMHhCOC0weEJGICovCisJMHg1MkJFLDB4NTRGRiwweDUyRDAsMHg1MkQ2LDB4NTJGMCwweDUzREYsMHg3MUVFLDB4NzdDRCwvKiAweEMwLTB4QzcgKi8KKwkweDVFRjQsMHg1MUY1LDB4NTFGQywweDlCMkYsMHg1M0I2LDB4NUYwMSwweDc1NUEsMHg1REVGLC8qIDB4QzgtMHhDRiAqLworCTB4NTc0QywweDU3QTksMHg1N0ExLDB4NTg3RSwweDU4QkMsMHg1OEM1LDB4NThEMSwweDU3MjksLyogMHhEMC0weEQ3ICovCisJMHg1NzJDLDB4NTcyQSwweDU3MzMsMHg1NzM5LDB4NTcyRSwweDU3MkYsMHg1NzVDLDB4NTczQiwvKiAweEQ4LTB4REYgKi8KKwkweDU3NDIsMHg1NzY5LDB4NTc4NSwweDU3NkIsMHg1Nzg2LDB4NTc3QywweDU3N0IsMHg1NzY4LC8qIDB4RTAtMHhFNyAqLworCTB4NTc2RCwweDU3NzYsMHg1NzczLDB4NTdBRCwweDU3QTQsMHg1NzhDLDB4NTdCMiwweDU3Q0YsLyogMHhFOC0weEVGICovCisJMHg1N0E3LDB4NTdCNCwweDU3OTMsMHg1N0EwLDB4NTdENSwweDU3RDgsMHg1N0RBLDB4NTdEOSwvKiAweEYwLTB4RjcgKi8KKwkweDU3RDIsMHg1N0I4LDB4NTdGNCwweDU3RUYsMHg1N0Y4LDB4NTdFNCwweDU3REQsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0RDWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OEU3MywweDhFNzUsMHg4RTc3LDB4OEU3OCwweDhFNzksMHg4RTdBLDB4OEU3QiwweDhFN0QsLyogMHg0MC0weDQ3ICovCisJMHg4RTdFLDB4OEU4MCwweDhFODIsMHg4RTgzLDB4OEU4NCwweDhFODYsMHg4RTg4LDB4OEU4OSwvKiAweDQ4LTB4NEYgKi8KKwkweDhFOEEsMHg4RThCLDB4OEU4QywweDhFOEQsMHg4RThFLDB4OEU5MSwweDhFOTIsMHg4RTkzLC8qIDB4NTAtMHg1NyAqLworCTB4OEU5NSwweDhFOTYsMHg4RTk3LDB4OEU5OCwweDhFOTksMHg4RTlBLDB4OEU5QiwweDhFOUQsLyogMHg1OC0weDVGICovCisJMHg4RTlGLDB4OEVBMCwweDhFQTEsMHg4RUEyLDB4OEVBMywweDhFQTQsMHg4RUE1LDB4OEVBNiwvKiAweDYwLTB4NjcgKi8KKwkweDhFQTcsMHg4RUE4LDB4OEVBOSwweDhFQUEsMHg4RUFELDB4OEVBRSwweDhFQjAsMHg4RUIxLC8qIDB4NjgtMHg2RiAqLworCTB4OEVCMywweDhFQjQsMHg4RUI1LDB4OEVCNiwweDhFQjcsMHg4RUI4LDB4OEVCOSwweDhFQkIsLyogMHg3MC0weDc3ICovCisJMHg4RUJDLDB4OEVCRCwweDhFQkUsMHg4RUJGLDB4OEVDMCwweDhFQzEsMHg4RUMyLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4OEVDMywweDhFQzQsMHg4RUM1LDB4OEVDNiwweDhFQzcsMHg4RUM4LDB4OEVDOSwweDhFQ0EsLyogMHg4MC0weDg3ICovCisJMHg4RUNCLDB4OEVDQywweDhFQ0QsMHg4RUNGLDB4OEVEMCwweDhFRDEsMHg4RUQyLDB4OEVEMywvKiAweDg4LTB4OEYgKi8KKwkweDhFRDQsMHg4RUQ1LDB4OEVENiwweDhFRDcsMHg4RUQ4LDB4OEVEOSwweDhFREEsMHg4RURCLC8qIDB4OTAtMHg5NyAqLworCTB4OEVEQywweDhFREQsMHg4RURFLDB4OEVERiwweDhFRTAsMHg4RUUxLDB4OEVFMiwweDhFRTMsLyogMHg5OC0weDlGICovCisJMHg4RUU0LDB4NTgwQiwweDU4MEQsMHg1N0ZELDB4NTdFRCwweDU4MDAsMHg1ODFFLDB4NTgxOSwvKiAweEEwLTB4QTcgKi8KKwkweDU4NDQsMHg1ODIwLDB4NTg2NSwweDU4NkMsMHg1ODgxLDB4NTg4OSwweDU4OUEsMHg1ODgwLC8qIDB4QTgtMHhBRiAqLworCTB4OTlBOCwweDlGMTksMHg2MUZGLDB4ODI3OSwweDgyN0QsMHg4MjdGLDB4ODI4RiwweDgyOEEsLyogMHhCMC0weEI3ICovCisJMHg4MkE4LDB4ODI4NCwweDgyOEUsMHg4MjkxLDB4ODI5NywweDgyOTksMHg4MkFCLDB4ODJCOCwvKiAweEI4LTB4QkYgKi8KKwkweDgyQkUsMHg4MkIwLDB4ODJDOCwweDgyQ0EsMHg4MkUzLDB4ODI5OCwweDgyQjcsMHg4MkFFLC8qIDB4QzAtMHhDNyAqLworCTB4ODJDQiwweDgyQ0MsMHg4MkMxLDB4ODJBOSwweDgyQjQsMHg4MkExLDB4ODJBQSwweDgyOUYsLyogMHhDOC0weENGICovCisJMHg4MkM0LDB4ODJDRSwweDgyQTQsMHg4MkUxLDB4ODMwOSwweDgyRjcsMHg4MkU0LDB4ODMwRiwvKiAweEQwLTB4RDcgKi8KKwkweDgzMDcsMHg4MkRDLDB4ODJGNCwweDgyRDIsMHg4MkQ4LDB4ODMwQywweDgyRkIsMHg4MkQzLC8qIDB4RDgtMHhERiAqLworCTB4ODMxMSwweDgzMUEsMHg4MzA2LDB4ODMxNCwweDgzMTUsMHg4MkUwLDB4ODJENSwweDgzMUMsLyogMHhFMC0weEU3ICovCisJMHg4MzUxLDB4ODM1QiwweDgzNUMsMHg4MzA4LDB4ODM5MiwweDgzM0MsMHg4MzM0LDB4ODMzMSwvKiAweEU4LTB4RUYgKi8KKwkweDgzOUIsMHg4MzVFLDB4ODMyRiwweDgzNEYsMHg4MzQ3LDB4ODM0MywweDgzNUYsMHg4MzQwLC8qIDB4RjAtMHhGNyAqLworCTB4ODMxNywweDgzNjAsMHg4MzJELDB4ODMzQSwweDgzMzMsMHg4MzY2LDB4ODM2NSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRERbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4RUU1LDB4OEVFNiwweDhFRTcsMHg4RUU4LDB4OEVFOSwweDhFRUEsMHg4RUVCLDB4OEVFQywvKiAweDQwLTB4NDcgKi8KKwkweDhFRUQsMHg4RUVFLDB4OEVFRiwweDhFRjAsMHg4RUYxLDB4OEVGMiwweDhFRjMsMHg4RUY0LC8qIDB4NDgtMHg0RiAqLworCTB4OEVGNSwweDhFRjYsMHg4RUY3LDB4OEVGOCwweDhFRjksMHg4RUZBLDB4OEVGQiwweDhFRkMsLyogMHg1MC0weDU3ICovCisJMHg4RUZELDB4OEVGRSwweDhFRkYsMHg4RjAwLDB4OEYwMSwweDhGMDIsMHg4RjAzLDB4OEYwNCwvKiAweDU4LTB4NUYgKi8KKwkweDhGMDUsMHg4RjA2LDB4OEYwNywweDhGMDgsMHg4RjA5LDB4OEYwQSwweDhGMEIsMHg4RjBDLC8qIDB4NjAtMHg2NyAqLworCTB4OEYwRCwweDhGMEUsMHg4RjBGLDB4OEYxMCwweDhGMTEsMHg4RjEyLDB4OEYxMywweDhGMTQsLyogMHg2OC0weDZGICovCisJMHg4RjE1LDB4OEYxNiwweDhGMTcsMHg4RjE4LDB4OEYxOSwweDhGMUEsMHg4RjFCLDB4OEYxQywvKiAweDcwLTB4NzcgKi8KKwkweDhGMUQsMHg4RjFFLDB4OEYxRiwweDhGMjAsMHg4RjIxLDB4OEYyMiwweDhGMjMsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg4RjI0LDB4OEYyNSwweDhGMjYsMHg4RjI3LDB4OEYyOCwweDhGMjksMHg4RjJBLDB4OEYyQiwvKiAweDgwLTB4ODcgKi8KKwkweDhGMkMsMHg4RjJELDB4OEYyRSwweDhGMkYsMHg4RjMwLDB4OEYzMSwweDhGMzIsMHg4RjMzLC8qIDB4ODgtMHg4RiAqLworCTB4OEYzNCwweDhGMzUsMHg4RjM2LDB4OEYzNywweDhGMzgsMHg4RjM5LDB4OEYzQSwweDhGM0IsLyogMHg5MC0weDk3ICovCisJMHg4RjNDLDB4OEYzRCwweDhGM0UsMHg4RjNGLDB4OEY0MCwweDhGNDEsMHg4RjQyLDB4OEY0MywvKiAweDk4LTB4OUYgKi8KKwkweDhGNDQsMHg4MzY4LDB4ODMxQiwweDgzNjksMHg4MzZDLDB4ODM2QSwweDgzNkQsMHg4MzZFLC8qIDB4QTAtMHhBNyAqLworCTB4ODNCMCwweDgzNzgsMHg4M0IzLDB4ODNCNCwweDgzQTAsMHg4M0FBLDB4ODM5MywweDgzOUMsLyogMHhBOC0weEFGICovCisJMHg4Mzg1LDB4ODM3QywweDgzQjYsMHg4M0E5LDB4ODM3RCwweDgzQjgsMHg4MzdCLDB4ODM5OCwvKiAweEIwLTB4QjcgKi8KKwkweDgzOUUsMHg4M0E4LDB4ODNCQSwweDgzQkMsMHg4M0MxLDB4ODQwMSwweDgzRTUsMHg4M0Q4LC8qIDB4QjgtMHhCRiAqLworCTB4NTgwNywweDg0MTgsMHg4NDBCLDB4ODNERCwweDgzRkQsMHg4M0Q2LDB4ODQxQywweDg0MzgsLyogMHhDMC0weEM3ICovCisJMHg4NDExLDB4ODQwNiwweDgzRDQsMHg4M0RGLDB4ODQwRiwweDg0MDMsMHg4M0Y4LDB4ODNGOSwvKiAweEM4LTB4Q0YgKi8KKwkweDgzRUEsMHg4M0M1LDB4ODNDMCwweDg0MjYsMHg4M0YwLDB4ODNFMSwweDg0NUMsMHg4NDUxLC8qIDB4RDAtMHhENyAqLworCTB4ODQ1QSwweDg0NTksMHg4NDczLDB4ODQ4NywweDg0ODgsMHg4NDdBLDB4ODQ4OSwweDg0NzgsLyogMHhEOC0weERGICovCisJMHg4NDNDLDB4ODQ0NiwweDg0NjksMHg4NDc2LDB4ODQ4QywweDg0OEUsMHg4NDMxLDB4ODQ2RCwvKiAweEUwLTB4RTcgKi8KKwkweDg0QzEsMHg4NENELDB4ODREMCwweDg0RTYsMHg4NEJELDB4ODREMywweDg0Q0EsMHg4NEJGLC8qIDB4RTgtMHhFRiAqLworCTB4ODRCQSwweDg0RTAsMHg4NEExLDB4ODRCOSwweDg0QjQsMHg4NDk3LDB4ODRFNSwweDg0RTMsLyogMHhGMC0weEY3ICovCisJMHg4NTBDLDB4NzUwRCwweDg1MzgsMHg4NEYwLDB4ODUzOSwweDg1MUYsMHg4NTNBLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9ERVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDhGNDUsMHg4RjQ2LDB4OEY0NywweDhGNDgsMHg4RjQ5LDB4OEY0QSwweDhGNEIsMHg4RjRDLC8qIDB4NDAtMHg0NyAqLworCTB4OEY0RCwweDhGNEUsMHg4RjRGLDB4OEY1MCwweDhGNTEsMHg4RjUyLDB4OEY1MywweDhGNTQsLyogMHg0OC0weDRGICovCisJMHg4RjU1LDB4OEY1NiwweDhGNTcsMHg4RjU4LDB4OEY1OSwweDhGNUEsMHg4RjVCLDB4OEY1QywvKiAweDUwLTB4NTcgKi8KKwkweDhGNUQsMHg4RjVFLDB4OEY1RiwweDhGNjAsMHg4RjYxLDB4OEY2MiwweDhGNjMsMHg4RjY0LC8qIDB4NTgtMHg1RiAqLworCTB4OEY2NSwweDhGNkEsMHg4RjgwLDB4OEY4QywweDhGOTIsMHg4RjlELDB4OEZBMCwweDhGQTEsLyogMHg2MC0weDY3ICovCisJMHg4RkEyLDB4OEZBNCwweDhGQTUsMHg4RkE2LDB4OEZBNywweDhGQUEsMHg4RkFDLDB4OEZBRCwvKiAweDY4LTB4NkYgKi8KKwkweDhGQUUsMHg4RkFGLDB4OEZCMiwweDhGQjMsMHg4RkI0LDB4OEZCNSwweDhGQjcsMHg4RkI4LC8qIDB4NzAtMHg3NyAqLworCTB4OEZCQSwweDhGQkIsMHg4RkJDLDB4OEZCRiwweDhGQzAsMHg4RkMzLDB4OEZDNiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDhGQzksMHg4RkNBLDB4OEZDQiwweDhGQ0MsMHg4RkNELDB4OEZDRiwweDhGRDIsMHg4RkQ2LC8qIDB4ODAtMHg4NyAqLworCTB4OEZENywweDhGREEsMHg4RkUwLDB4OEZFMSwweDhGRTMsMHg4RkU3LDB4OEZFQywweDhGRUYsLyogMHg4OC0weDhGICovCisJMHg4RkYxLDB4OEZGMiwweDhGRjQsMHg4RkY1LDB4OEZGNiwweDhGRkEsMHg4RkZCLDB4OEZGQywvKiAweDkwLTB4OTcgKi8KKwkweDhGRkUsMHg4RkZGLDB4OTAwNywweDkwMDgsMHg5MDBDLDB4OTAwRSwweDkwMTMsMHg5MDE1LC8qIDB4OTgtMHg5RiAqLworCTB4OTAxOCwweDg1NTYsMHg4NTNCLDB4ODRGRiwweDg0RkMsMHg4NTU5LDB4ODU0OCwweDg1NjgsLyogMHhBMC0weEE3ICovCisJMHg4NTY0LDB4ODU1RSwweDg1N0EsMHg3N0EyLDB4ODU0MywweDg1NzIsMHg4NTdCLDB4ODVBNCwvKiAweEE4LTB4QUYgKi8KKwkweDg1QTgsMHg4NTg3LDB4ODU4RiwweDg1NzksMHg4NUFFLDB4ODU5QywweDg1ODUsMHg4NUI5LC8qIDB4QjAtMHhCNyAqLworCTB4ODVCNywweDg1QjAsMHg4NUQzLDB4ODVDMSwweDg1REMsMHg4NUZGLDB4ODYyNywweDg2MDUsLyogMHhCOC0weEJGICovCisJMHg4NjI5LDB4ODYxNiwweDg2M0MsMHg1RUZFLDB4NUYwOCwweDU5M0MsMHg1OTQxLDB4ODAzNywvKiAweEMwLTB4QzcgKi8KKwkweDU5NTUsMHg1OTVBLDB4NTk1OCwweDUzMEYsMHg1QzIyLDB4NUMyNSwweDVDMkMsMHg1QzM0LC8qIDB4QzgtMHhDRiAqLworCTB4NjI0QywweDYyNkEsMHg2MjlGLDB4NjJCQiwweDYyQ0EsMHg2MkRBLDB4NjJENywweDYyRUUsLyogMHhEMC0weEQ3ICovCisJMHg2MzIyLDB4NjJGNiwweDYzMzksMHg2MzRCLDB4NjM0MywweDYzQUQsMHg2M0Y2LDB4NjM3MSwvKiAweEQ4LTB4REYgKi8KKwkweDYzN0EsMHg2MzhFLDB4NjNCNCwweDYzNkQsMHg2M0FDLDB4NjM4QSwweDYzNjksMHg2M0FFLC8qIDB4RTAtMHhFNyAqLworCTB4NjNCQywweDYzRjIsMHg2M0Y4LDB4NjNFMCwweDYzRkYsMHg2M0M0LDB4NjNERSwweDYzQ0UsLyogMHhFOC0weEVGICovCisJMHg2NDUyLDB4NjNDNiwweDYzQkUsMHg2NDQ1LDB4NjQ0MSwweDY0MEIsMHg2NDFCLDB4NjQyMCwvKiAweEYwLTB4RjcgKi8KKwkweDY0MEMsMHg2NDI2LDB4NjQyMSwweDY0NUUsMHg2NDg0LDB4NjQ2RCwweDY0OTYsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0RGWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OTAxOSwweDkwMUMsMHg5MDIzLDB4OTAyNCwweDkwMjUsMHg5MDI3LDB4OTAyOCwweDkwMjksLyogMHg0MC0weDQ3ICovCisJMHg5MDJBLDB4OTAyQiwweDkwMkMsMHg5MDMwLDB4OTAzMSwweDkwMzIsMHg5MDMzLDB4OTAzNCwvKiAweDQ4LTB4NEYgKi8KKwkweDkwMzcsMHg5MDM5LDB4OTAzQSwweDkwM0QsMHg5MDNGLDB4OTA0MCwweDkwNDMsMHg5MDQ1LC8qIDB4NTAtMHg1NyAqLworCTB4OTA0NiwweDkwNDgsMHg5MDQ5LDB4OTA0QSwweDkwNEIsMHg5MDRDLDB4OTA0RSwweDkwNTQsLyogMHg1OC0weDVGICovCisJMHg5MDU1LDB4OTA1NiwweDkwNTksMHg5MDVBLDB4OTA1QywweDkwNUQsMHg5MDVFLDB4OTA1RiwvKiAweDYwLTB4NjcgKi8KKwkweDkwNjAsMHg5MDYxLDB4OTA2NCwweDkwNjYsMHg5MDY3LDB4OTA2OSwweDkwNkEsMHg5MDZCLC8qIDB4NjgtMHg2RiAqLworCTB4OTA2QywweDkwNkYsMHg5MDcwLDB4OTA3MSwweDkwNzIsMHg5MDczLDB4OTA3NiwweDkwNzcsLyogMHg3MC0weDc3ICovCisJMHg5MDc4LDB4OTA3OSwweDkwN0EsMHg5MDdCLDB4OTA3QywweDkwN0UsMHg5MDgxLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4OTA4NCwweDkwODUsMHg5MDg2LDB4OTA4NywweDkwODksMHg5MDhBLDB4OTA4QywweDkwOEQsLyogMHg4MC0weDg3ICovCisJMHg5MDhFLDB4OTA4RiwweDkwOTAsMHg5MDkyLDB4OTA5NCwweDkwOTYsMHg5MDk4LDB4OTA5QSwvKiAweDg4LTB4OEYgKi8KKwkweDkwOUMsMHg5MDlFLDB4OTA5RiwweDkwQTAsMHg5MEE0LDB4OTBBNSwweDkwQTcsMHg5MEE4LC8qIDB4OTAtMHg5NyAqLworCTB4OTBBOSwweDkwQUIsMHg5MEFELDB4OTBCMiwweDkwQjcsMHg5MEJDLDB4OTBCRCwweDkwQkYsLyogMHg5OC0weDlGICovCisJMHg5MEMwLDB4NjQ3QSwweDY0QjcsMHg2NEI4LDB4NjQ5OSwweDY0QkEsMHg2NEMwLDB4NjREMCwvKiAweEEwLTB4QTcgKi8KKwkweDY0RDcsMHg2NEU0LDB4NjRFMiwweDY1MDksMHg2NTI1LDB4NjUyRSwweDVGMEIsMHg1RkQyLC8qIDB4QTgtMHhBRiAqLworCTB4NzUxOSwweDVGMTEsMHg1MzVGLDB4NTNGMSwweDUzRkQsMHg1M0U5LDB4NTNFOCwweDUzRkIsLyogMHhCMC0weEI3ICovCisJMHg1NDEyLDB4NTQxNiwweDU0MDYsMHg1NDRCLDB4NTQ1MiwweDU0NTMsMHg1NDU0LDB4NTQ1NiwvKiAweEI4LTB4QkYgKi8KKwkweDU0NDMsMHg1NDIxLDB4NTQ1NywweDU0NTksMHg1NDIzLDB4NTQzMiwweDU0ODIsMHg1NDk0LC8qIDB4QzAtMHhDNyAqLworCTB4NTQ3NywweDU0NzEsMHg1NDY0LDB4NTQ5QSwweDU0OUIsMHg1NDg0LDB4NTQ3NiwweDU0NjYsLyogMHhDOC0weENGICovCisJMHg1NDlELDB4NTREMCwweDU0QUQsMHg1NEMyLDB4NTRCNCwweDU0RDIsMHg1NEE3LDB4NTRBNiwvKiAweEQwLTB4RDcgKi8KKwkweDU0RDMsMHg1NEQ0LDB4NTQ3MiwweDU0QTMsMHg1NEQ1LDB4NTRCQiwweDU0QkYsMHg1NENDLC8qIDB4RDgtMHhERiAqLworCTB4NTREOSwweDU0REEsMHg1NERDLDB4NTRBOSwweDU0QUEsMHg1NEE0LDB4NTRERCwweDU0Q0YsLyogMHhFMC0weEU3ICovCisJMHg1NERFLDB4NTUxQiwweDU0RTcsMHg1NTIwLDB4NTRGRCwweDU1MTQsMHg1NEYzLDB4NTUyMiwvKiAweEU4LTB4RUYgKi8KKwkweDU1MjMsMHg1NTBGLDB4NTUxMSwweDU1MjcsMHg1NTJBLDB4NTU2NywweDU1OEYsMHg1NUI1LC8qIDB4RjAtMHhGNyAqLworCTB4NTU0OSwweDU1NkQsMHg1NTQxLDB4NTU1NSwweDU1M0YsMHg1NTUwLDB4NTUzQywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRTBbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5MEMyLDB4OTBDMywweDkwQzYsMHg5MEM4LDB4OTBDOSwweDkwQ0IsMHg5MENDLDB4OTBDRCwvKiAweDQwLTB4NDcgKi8KKwkweDkwRDIsMHg5MEQ0LDB4OTBENSwweDkwRDYsMHg5MEQ4LDB4OTBEOSwweDkwREEsMHg5MERFLC8qIDB4NDgtMHg0RiAqLworCTB4OTBERiwweDkwRTAsMHg5MEUzLDB4OTBFNCwweDkwRTUsMHg5MEU5LDB4OTBFQSwweDkwRUMsLyogMHg1MC0weDU3ICovCisJMHg5MEVFLDB4OTBGMCwweDkwRjEsMHg5MEYyLDB4OTBGMywweDkwRjUsMHg5MEY2LDB4OTBGNywvKiAweDU4LTB4NUYgKi8KKwkweDkwRjksMHg5MEZBLDB4OTBGQiwweDkwRkMsMHg5MEZGLDB4OTEwMCwweDkxMDEsMHg5MTAzLC8qIDB4NjAtMHg2NyAqLworCTB4OTEwNSwweDkxMDYsMHg5MTA3LDB4OTEwOCwweDkxMDksMHg5MTBBLDB4OTEwQiwweDkxMEMsLyogMHg2OC0weDZGICovCisJMHg5MTBELDB4OTEwRSwweDkxMEYsMHg5MTEwLDB4OTExMSwweDkxMTIsMHg5MTEzLDB4OTExNCwvKiAweDcwLTB4NzcgKi8KKwkweDkxMTUsMHg5MTE2LDB4OTExNywweDkxMTgsMHg5MTFBLDB4OTExQiwweDkxMUMsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg5MTFELDB4OTExRiwweDkxMjAsMHg5MTIxLDB4OTEyNCwweDkxMjUsMHg5MTI2LDB4OTEyNywvKiAweDgwLTB4ODcgKi8KKwkweDkxMjgsMHg5MTI5LDB4OTEyQSwweDkxMkIsMHg5MTJDLDB4OTEyRCwweDkxMkUsMHg5MTMwLC8qIDB4ODgtMHg4RiAqLworCTB4OTEzMiwweDkxMzMsMHg5MTM0LDB4OTEzNSwweDkxMzYsMHg5MTM3LDB4OTEzOCwweDkxM0EsLyogMHg5MC0weDk3ICovCisJMHg5MTNCLDB4OTEzQywweDkxM0QsMHg5MTNFLDB4OTEzRiwweDkxNDAsMHg5MTQxLDB4OTE0MiwvKiAweDk4LTB4OUYgKi8KKwkweDkxNDQsMHg1NTM3LDB4NTU1NiwweDU1NzUsMHg1NTc2LDB4NTU3NywweDU1MzMsMHg1NTMwLC8qIDB4QTAtMHhBNyAqLworCTB4NTU1QywweDU1OEIsMHg1NUQyLDB4NTU4MywweDU1QjEsMHg1NUI5LDB4NTU4OCwweDU1ODEsLyogMHhBOC0weEFGICovCisJMHg1NTlGLDB4NTU3RSwweDU1RDYsMHg1NTkxLDB4NTU3QiwweDU1REYsMHg1NUJELDB4NTVCRSwvKiAweEIwLTB4QjcgKi8KKwkweDU1OTQsMHg1NTk5LDB4NTVFQSwweDU1RjcsMHg1NUM5LDB4NTYxRiwweDU1RDEsMHg1NUVCLC8qIDB4QjgtMHhCRiAqLworCTB4NTVFQywweDU1RDQsMHg1NUU2LDB4NTVERCwweDU1QzQsMHg1NUVGLDB4NTVFNSwweDU1RjIsLyogMHhDMC0weEM3ICovCisJMHg1NUYzLDB4NTVDQywweDU1Q0QsMHg1NUU4LDB4NTVGNSwweDU1RTQsMHg4Rjk0LDB4NTYxRSwvKiAweEM4LTB4Q0YgKi8KKwkweDU2MDgsMHg1NjBDLDB4NTYwMSwweDU2MjQsMHg1NjIzLDB4NTVGRSwweDU2MDAsMHg1NjI3LC8qIDB4RDAtMHhENyAqLworCTB4NTYyRCwweDU2NTgsMHg1NjM5LDB4NTY1NywweDU2MkMsMHg1NjRELDB4NTY2MiwweDU2NTksLyogMHhEOC0weERGICovCisJMHg1NjVDLDB4NTY0QywweDU2NTQsMHg1Njg2LDB4NTY2NCwweDU2NzEsMHg1NjZCLDB4NTY3QiwvKiAweEUwLTB4RTcgKi8KKwkweDU2N0MsMHg1Njg1LDB4NTY5MywweDU2QUYsMHg1NkQ0LDB4NTZENywweDU2REQsMHg1NkUxLC8qIDB4RTgtMHhFRiAqLworCTB4NTZGNSwweDU2RUIsMHg1NkY5LDB4NTZGRiwweDU3MDQsMHg1NzBBLDB4NTcwOSwweDU3MUMsLyogMHhGMC0weEY3ICovCisJMHg1RTBGLDB4NUUxOSwweDVFMTQsMHg1RTExLDB4NUUzMSwweDVFM0IsMHg1RTNDLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FMVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDkxNDUsMHg5MTQ3LDB4OTE0OCwweDkxNTEsMHg5MTUzLDB4OTE1NCwweDkxNTUsMHg5MTU2LC8qIDB4NDAtMHg0NyAqLworCTB4OTE1OCwweDkxNTksMHg5MTVCLDB4OTE1QywweDkxNUYsMHg5MTYwLDB4OTE2NiwweDkxNjcsLyogMHg0OC0weDRGICovCisJMHg5MTY4LDB4OTE2QiwweDkxNkQsMHg5MTczLDB4OTE3QSwweDkxN0IsMHg5MTdDLDB4OTE4MCwvKiAweDUwLTB4NTcgKi8KKwkweDkxODEsMHg5MTgyLDB4OTE4MywweDkxODQsMHg5MTg2LDB4OTE4OCwweDkxOEEsMHg5MThFLC8qIDB4NTgtMHg1RiAqLworCTB4OTE4RiwweDkxOTMsMHg5MTk0LDB4OTE5NSwweDkxOTYsMHg5MTk3LDB4OTE5OCwweDkxOTksLyogMHg2MC0weDY3ICovCisJMHg5MTlDLDB4OTE5RCwweDkxOUUsMHg5MTlGLDB4OTFBMCwweDkxQTEsMHg5MUE0LDB4OTFBNSwvKiAweDY4LTB4NkYgKi8KKwkweDkxQTYsMHg5MUE3LDB4OTFBOCwweDkxQTksMHg5MUFCLDB4OTFBQywweDkxQjAsMHg5MUIxLC8qIDB4NzAtMHg3NyAqLworCTB4OTFCMiwweDkxQjMsMHg5MUI2LDB4OTFCNywweDkxQjgsMHg5MUI5LDB4OTFCQiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDkxQkMsMHg5MUJELDB4OTFCRSwweDkxQkYsMHg5MUMwLDB4OTFDMSwweDkxQzIsMHg5MUMzLC8qIDB4ODAtMHg4NyAqLworCTB4OTFDNCwweDkxQzUsMHg5MUM2LDB4OTFDOCwweDkxQ0IsMHg5MUQwLDB4OTFEMiwweDkxRDMsLyogMHg4OC0weDhGICovCisJMHg5MUQ0LDB4OTFENSwweDkxRDYsMHg5MUQ3LDB4OTFEOCwweDkxRDksMHg5MURBLDB4OTFEQiwvKiAweDkwLTB4OTcgKi8KKwkweDkxREQsMHg5MURFLDB4OTFERiwweDkxRTAsMHg5MUUxLDB4OTFFMiwweDkxRTMsMHg5MUU0LC8qIDB4OTgtMHg5RiAqLworCTB4OTFFNSwweDVFMzcsMHg1RTQ0LDB4NUU1NCwweDVFNUIsMHg1RTVFLDB4NUU2MSwweDVDOEMsLyogMHhBMC0weEE3ICovCisJMHg1QzdBLDB4NUM4RCwweDVDOTAsMHg1Qzk2LDB4NUM4OCwweDVDOTgsMHg1Qzk5LDB4NUM5MSwvKiAweEE4LTB4QUYgKi8KKwkweDVDOUEsMHg1QzlDLDB4NUNCNSwweDVDQTIsMHg1Q0JELDB4NUNBQywweDVDQUIsMHg1Q0IxLC8qIDB4QjAtMHhCNyAqLworCTB4NUNBMywweDVDQzEsMHg1Q0I3LDB4NUNDNCwweDVDRDIsMHg1Q0U0LDB4NUNDQiwweDVDRTUsLyogMHhCOC0weEJGICovCisJMHg1RDAyLDB4NUQwMywweDVEMjcsMHg1RDI2LDB4NUQyRSwweDVEMjQsMHg1RDFFLDB4NUQwNiwvKiAweEMwLTB4QzcgKi8KKwkweDVEMUIsMHg1RDU4LDB4NUQzRSwweDVEMzQsMHg1RDNELDB4NUQ2QywweDVENUIsMHg1RDZGLC8qIDB4QzgtMHhDRiAqLworCTB4NUQ1RCwweDVENkIsMHg1RDRCLDB4NUQ0QSwweDVENjksMHg1RDc0LDB4NUQ4MiwweDVEOTksLyogMHhEMC0weEQ3ICovCisJMHg1RDlELDB4OEM3MywweDVEQjcsMHg1REM1LDB4NUY3MywweDVGNzcsMHg1RjgyLDB4NUY4NywvKiAweEQ4LTB4REYgKi8KKwkweDVGODksMHg1RjhDLDB4NUY5NSwweDVGOTksMHg1RjlDLDB4NUZBOCwweDVGQUQsMHg1RkI1LC8qIDB4RTAtMHhFNyAqLworCTB4NUZCQywweDg4NjIsMHg1RjYxLDB4NzJBRCwweDcyQjAsMHg3MkI0LDB4NzJCNywweDcyQjgsLyogMHhFOC0weEVGICovCisJMHg3MkMzLDB4NzJDMSwweDcyQ0UsMHg3MkNELDB4NzJEMiwweDcyRTgsMHg3MkVGLDB4NzJFOSwvKiAweEYwLTB4RjcgKi8KKwkweDcyRjIsMHg3MkY0LDB4NzJGNywweDczMDEsMHg3MkYzLDB4NzMwMywweDcyRkEsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0UyWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OTFFNiwweDkxRTcsMHg5MUU4LDB4OTFFOSwweDkxRUEsMHg5MUVCLDB4OTFFQywweDkxRUQsLyogMHg0MC0weDQ3ICovCisJMHg5MUVFLDB4OTFFRiwweDkxRjAsMHg5MUYxLDB4OTFGMiwweDkxRjMsMHg5MUY0LDB4OTFGNSwvKiAweDQ4LTB4NEYgKi8KKwkweDkxRjYsMHg5MUY3LDB4OTFGOCwweDkxRjksMHg5MUZBLDB4OTFGQiwweDkxRkMsMHg5MUZELC8qIDB4NTAtMHg1NyAqLworCTB4OTFGRSwweDkxRkYsMHg5MjAwLDB4OTIwMSwweDkyMDIsMHg5MjAzLDB4OTIwNCwweDkyMDUsLyogMHg1OC0weDVGICovCisJMHg5MjA2LDB4OTIwNywweDkyMDgsMHg5MjA5LDB4OTIwQSwweDkyMEIsMHg5MjBDLDB4OTIwRCwvKiAweDYwLTB4NjcgKi8KKwkweDkyMEUsMHg5MjBGLDB4OTIxMCwweDkyMTEsMHg5MjEyLDB4OTIxMywweDkyMTQsMHg5MjE1LC8qIDB4NjgtMHg2RiAqLworCTB4OTIxNiwweDkyMTcsMHg5MjE4LDB4OTIxOSwweDkyMUEsMHg5MjFCLDB4OTIxQywweDkyMUQsLyogMHg3MC0weDc3ICovCisJMHg5MjFFLDB4OTIxRiwweDkyMjAsMHg5MjIxLDB4OTIyMiwweDkyMjMsMHg5MjI0LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4OTIyNSwweDkyMjYsMHg5MjI3LDB4OTIyOCwweDkyMjksMHg5MjJBLDB4OTIyQiwweDkyMkMsLyogMHg4MC0weDg3ICovCisJMHg5MjJELDB4OTIyRSwweDkyMkYsMHg5MjMwLDB4OTIzMSwweDkyMzIsMHg5MjMzLDB4OTIzNCwvKiAweDg4LTB4OEYgKi8KKwkweDkyMzUsMHg5MjM2LDB4OTIzNywweDkyMzgsMHg5MjM5LDB4OTIzQSwweDkyM0IsMHg5MjNDLC8qIDB4OTAtMHg5NyAqLworCTB4OTIzRCwweDkyM0UsMHg5MjNGLDB4OTI0MCwweDkyNDEsMHg5MjQyLDB4OTI0MywweDkyNDQsLyogMHg5OC0weDlGICovCisJMHg5MjQ1LDB4NzJGQiwweDczMTcsMHg3MzEzLDB4NzMyMSwweDczMEEsMHg3MzFFLDB4NzMxRCwvKiAweEEwLTB4QTcgKi8KKwkweDczMTUsMHg3MzIyLDB4NzMzOSwweDczMjUsMHg3MzJDLDB4NzMzOCwweDczMzEsMHg3MzUwLC8qIDB4QTgtMHhBRiAqLworCTB4NzM0RCwweDczNTcsMHg3MzYwLDB4NzM2QywweDczNkYsMHg3MzdFLDB4ODIxQiwweDU5MjUsLyogMHhCMC0weEI3ICovCisJMHg5OEU3LDB4NTkyNCwweDU5MDIsMHg5OTYzLDB4OTk2NywweDk5NjgsMHg5OTY5LDB4OTk2QSwvKiAweEI4LTB4QkYgKi8KKwkweDk5NkIsMHg5OTZDLDB4OTk3NCwweDk5NzcsMHg5OTdELDB4OTk4MCwweDk5ODQsMHg5OTg3LC8qIDB4QzAtMHhDNyAqLworCTB4OTk4QSwweDk5OEQsMHg5OTkwLDB4OTk5MSwweDk5OTMsMHg5OTk0LDB4OTk5NSwweDVFODAsLyogMHhDOC0weENGICovCisJMHg1RTkxLDB4NUU4QiwweDVFOTYsMHg1RUE1LDB4NUVBMCwweDVFQjksMHg1RUI1LDB4NUVCRSwvKiAweEQwLTB4RDcgKi8KKwkweDVFQjMsMHg4RDUzLDB4NUVEMiwweDVFRDEsMHg1RURCLDB4NUVFOCwweDVFRUEsMHg4MUJBLC8qIDB4RDgtMHhERiAqLworCTB4NUZDNCwweDVGQzksMHg1RkQ2LDB4NUZDRiwweDYwMDMsMHg1RkVFLDB4NjAwNCwweDVGRTEsLyogMHhFMC0weEU3ICovCisJMHg1RkU0LDB4NUZGRSwweDYwMDUsMHg2MDA2LDB4NUZFQSwweDVGRUQsMHg1RkY4LDB4NjAxOSwvKiAweEU4LTB4RUYgKi8KKwkweDYwMzUsMHg2MDI2LDB4NjAxQiwweDYwMEYsMHg2MDBELDB4NjAyOSwweDYwMkIsMHg2MDBBLC8qIDB4RjAtMHhGNyAqLworCTB4NjAzRiwweDYwMjEsMHg2MDc4LDB4NjA3OSwweDYwN0IsMHg2MDdBLDB4NjA0MiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRTNbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5MjQ2LDB4OTI0NywweDkyNDgsMHg5MjQ5LDB4OTI0QSwweDkyNEIsMHg5MjRDLDB4OTI0RCwvKiAweDQwLTB4NDcgKi8KKwkweDkyNEUsMHg5MjRGLDB4OTI1MCwweDkyNTEsMHg5MjUyLDB4OTI1MywweDkyNTQsMHg5MjU1LC8qIDB4NDgtMHg0RiAqLworCTB4OTI1NiwweDkyNTcsMHg5MjU4LDB4OTI1OSwweDkyNUEsMHg5MjVCLDB4OTI1QywweDkyNUQsLyogMHg1MC0weDU3ICovCisJMHg5MjVFLDB4OTI1RiwweDkyNjAsMHg5MjYxLDB4OTI2MiwweDkyNjMsMHg5MjY0LDB4OTI2NSwvKiAweDU4LTB4NUYgKi8KKwkweDkyNjYsMHg5MjY3LDB4OTI2OCwweDkyNjksMHg5MjZBLDB4OTI2QiwweDkyNkMsMHg5MjZELC8qIDB4NjAtMHg2NyAqLworCTB4OTI2RSwweDkyNkYsMHg5MjcwLDB4OTI3MSwweDkyNzIsMHg5MjczLDB4OTI3NSwweDkyNzYsLyogMHg2OC0weDZGICovCisJMHg5Mjc3LDB4OTI3OCwweDkyNzksMHg5MjdBLDB4OTI3QiwweDkyN0MsMHg5MjdELDB4OTI3RSwvKiAweDcwLTB4NzcgKi8KKwkweDkyN0YsMHg5MjgwLDB4OTI4MSwweDkyODIsMHg5MjgzLDB4OTI4NCwweDkyODUsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg5Mjg2LDB4OTI4NywweDkyODgsMHg5Mjg5LDB4OTI4QSwweDkyOEIsMHg5MjhDLDB4OTI4RCwvKiAweDgwLTB4ODcgKi8KKwkweDkyOEYsMHg5MjkwLDB4OTI5MSwweDkyOTIsMHg5MjkzLDB4OTI5NCwweDkyOTUsMHg5Mjk2LC8qIDB4ODgtMHg4RiAqLworCTB4OTI5NywweDkyOTgsMHg5Mjk5LDB4OTI5QSwweDkyOUIsMHg5MjlDLDB4OTI5RCwweDkyOUUsLyogMHg5MC0weDk3ICovCisJMHg5MjlGLDB4OTJBMCwweDkyQTEsMHg5MkEyLDB4OTJBMywweDkyQTQsMHg5MkE1LDB4OTJBNiwvKiAweDk4LTB4OUYgKi8KKwkweDkyQTcsMHg2MDZBLDB4NjA3RCwweDYwOTYsMHg2MDlBLDB4NjBBRCwweDYwOUQsMHg2MDgzLC8qIDB4QTAtMHhBNyAqLworCTB4NjA5MiwweDYwOEMsMHg2MDlCLDB4NjBFQywweDYwQkIsMHg2MEIxLDB4NjBERCwweDYwRDgsLyogMHhBOC0weEFGICovCisJMHg2MEM2LDB4NjBEQSwweDYwQjQsMHg2MTIwLDB4NjEyNiwweDYxMTUsMHg2MTIzLDB4NjBGNCwvKiAweEIwLTB4QjcgKi8KKwkweDYxMDAsMHg2MTBFLDB4NjEyQiwweDYxNEEsMHg2MTc1LDB4NjFBQywweDYxOTQsMHg2MUE3LC8qIDB4QjgtMHhCRiAqLworCTB4NjFCNywweDYxRDQsMHg2MUY1LDB4NUZERCwweDk2QjMsMHg5NUU5LDB4OTVFQiwweDk1RjEsLyogMHhDMC0weEM3ICovCisJMHg5NUYzLDB4OTVGNSwweDk1RjYsMHg5NUZDLDB4OTVGRSwweDk2MDMsMHg5NjA0LDB4OTYwNiwvKiAweEM4LTB4Q0YgKi8KKwkweDk2MDgsMHg5NjBBLDB4OTYwQiwweDk2MEMsMHg5NjBELDB4OTYwRiwweDk2MTIsMHg5NjE1LC8qIDB4RDAtMHhENyAqLworCTB4OTYxNiwweDk2MTcsMHg5NjE5LDB4OTYxQSwweDRFMkMsMHg3MjNGLDB4NjIxNSwweDZDMzUsLyogMHhEOC0weERGICovCisJMHg2QzU0LDB4NkM1QywweDZDNEEsMHg2Q0EzLDB4NkM4NSwweDZDOTAsMHg2Qzk0LDB4NkM4QywvKiAweEUwLTB4RTcgKi8KKwkweDZDNjgsMHg2QzY5LDB4NkM3NCwweDZDNzYsMHg2Qzg2LDB4NkNBOSwweDZDRDAsMHg2Q0Q0LC8qIDB4RTgtMHhFRiAqLworCTB4NkNBRCwweDZDRjcsMHg2Q0Y4LDB4NkNGMSwweDZDRDcsMHg2Q0IyLDB4NkNFMCwweDZDRDYsLyogMHhGMC0weEY3ICovCisJMHg2Q0ZBLDB4NkNFQiwweDZDRUUsMHg2Q0IxLDB4NkNEMywweDZDRUYsMHg2Q0ZFLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FNFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDkyQTgsMHg5MkE5LDB4OTJBQSwweDkyQUIsMHg5MkFDLDB4OTJBRCwweDkyQUYsMHg5MkIwLC8qIDB4NDAtMHg0NyAqLworCTB4OTJCMSwweDkyQjIsMHg5MkIzLDB4OTJCNCwweDkyQjUsMHg5MkI2LDB4OTJCNywweDkyQjgsLyogMHg0OC0weDRGICovCisJMHg5MkI5LDB4OTJCQSwweDkyQkIsMHg5MkJDLDB4OTJCRCwweDkyQkUsMHg5MkJGLDB4OTJDMCwvKiAweDUwLTB4NTcgKi8KKwkweDkyQzEsMHg5MkMyLDB4OTJDMywweDkyQzQsMHg5MkM1LDB4OTJDNiwweDkyQzcsMHg5MkM5LC8qIDB4NTgtMHg1RiAqLworCTB4OTJDQSwweDkyQ0IsMHg5MkNDLDB4OTJDRCwweDkyQ0UsMHg5MkNGLDB4OTJEMCwweDkyRDEsLyogMHg2MC0weDY3ICovCisJMHg5MkQyLDB4OTJEMywweDkyRDQsMHg5MkQ1LDB4OTJENiwweDkyRDcsMHg5MkQ4LDB4OTJEOSwvKiAweDY4LTB4NkYgKi8KKwkweDkyREEsMHg5MkRCLDB4OTJEQywweDkyREQsMHg5MkRFLDB4OTJERiwweDkyRTAsMHg5MkUxLC8qIDB4NzAtMHg3NyAqLworCTB4OTJFMiwweDkyRTMsMHg5MkU0LDB4OTJFNSwweDkyRTYsMHg5MkU3LDB4OTJFOCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDkyRTksMHg5MkVBLDB4OTJFQiwweDkyRUMsMHg5MkVELDB4OTJFRSwweDkyRUYsMHg5MkYwLC8qIDB4ODAtMHg4NyAqLworCTB4OTJGMSwweDkyRjIsMHg5MkYzLDB4OTJGNCwweDkyRjUsMHg5MkY2LDB4OTJGNywweDkyRjgsLyogMHg4OC0weDhGICovCisJMHg5MkY5LDB4OTJGQSwweDkyRkIsMHg5MkZDLDB4OTJGRCwweDkyRkUsMHg5MkZGLDB4OTMwMCwvKiAweDkwLTB4OTcgKi8KKwkweDkzMDEsMHg5MzAyLDB4OTMwMywweDkzMDQsMHg5MzA1LDB4OTMwNiwweDkzMDcsMHg5MzA4LC8qIDB4OTgtMHg5RiAqLworCTB4OTMwOSwweDZEMzksMHg2RDI3LDB4NkQwQywweDZENDMsMHg2RDQ4LDB4NkQwNywweDZEMDQsLyogMHhBMC0weEE3ICovCisJMHg2RDE5LDB4NkQwRSwweDZEMkIsMHg2RDRELDB4NkQyRSwweDZEMzUsMHg2RDFBLDB4NkQ0RiwvKiAweEE4LTB4QUYgKi8KKwkweDZENTIsMHg2RDU0LDB4NkQzMywweDZEOTEsMHg2RDZGLDB4NkQ5RSwweDZEQTAsMHg2RDVFLC8qIDB4QjAtMHhCNyAqLworCTB4NkQ5MywweDZEOTQsMHg2RDVDLDB4NkQ2MCwweDZEN0MsMHg2RDYzLDB4NkUxQSwweDZEQzcsLyogMHhCOC0weEJGICovCisJMHg2REM1LDB4NkRERSwweDZFMEUsMHg2REJGLDB4NkRFMCwweDZFMTEsMHg2REU2LDB4NkRERCwvKiAweEMwLTB4QzcgKi8KKwkweDZERDksMHg2RTE2LDB4NkRBQiwweDZFMEMsMHg2REFFLDB4NkUyQiwweDZFNkUsMHg2RTRFLC8qIDB4QzgtMHhDRiAqLworCTB4NkU2QiwweDZFQjIsMHg2RTVGLDB4NkU4NiwweDZFNTMsMHg2RTU0LDB4NkUzMiwweDZFMjUsLyogMHhEMC0weEQ3ICovCisJMHg2RTQ0LDB4NkVERiwweDZFQjEsMHg2RTk4LDB4NkVFMCwweDZGMkQsMHg2RUUyLDB4NkVBNSwvKiAweEQ4LTB4REYgKi8KKwkweDZFQTcsMHg2RUJELDB4NkVCQiwweDZFQjcsMHg2RUQ3LDB4NkVCNCwweDZFQ0YsMHg2RThGLC8qIDB4RTAtMHhFNyAqLworCTB4NkVDMiwweDZFOUYsMHg2RjYyLDB4NkY0NiwweDZGNDcsMHg2RjI0LDB4NkYxNSwweDZFRjksLyogMHhFOC0weEVGICovCisJMHg2RjJGLDB4NkYzNiwweDZGNEIsMHg2Rjc0LDB4NkYyQSwweDZGMDksMHg2RjI5LDB4NkY4OSwvKiAweEYwLTB4RjcgKi8KKwkweDZGOEQsMHg2RjhDLDB4NkY3OCwweDZGNzIsMHg2RjdDLDB4NkY3QSwweDZGRDEsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0U1WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OTMwQSwweDkzMEIsMHg5MzBDLDB4OTMwRCwweDkzMEUsMHg5MzBGLDB4OTMxMCwweDkzMTEsLyogMHg0MC0weDQ3ICovCisJMHg5MzEyLDB4OTMxMywweDkzMTQsMHg5MzE1LDB4OTMxNiwweDkzMTcsMHg5MzE4LDB4OTMxOSwvKiAweDQ4LTB4NEYgKi8KKwkweDkzMUEsMHg5MzFCLDB4OTMxQywweDkzMUQsMHg5MzFFLDB4OTMxRiwweDkzMjAsMHg5MzIxLC8qIDB4NTAtMHg1NyAqLworCTB4OTMyMiwweDkzMjMsMHg5MzI0LDB4OTMyNSwweDkzMjYsMHg5MzI3LDB4OTMyOCwweDkzMjksLyogMHg1OC0weDVGICovCisJMHg5MzJBLDB4OTMyQiwweDkzMkMsMHg5MzJELDB4OTMyRSwweDkzMkYsMHg5MzMwLDB4OTMzMSwvKiAweDYwLTB4NjcgKi8KKwkweDkzMzIsMHg5MzMzLDB4OTMzNCwweDkzMzUsMHg5MzM2LDB4OTMzNywweDkzMzgsMHg5MzM5LC8qIDB4NjgtMHg2RiAqLworCTB4OTMzQSwweDkzM0IsMHg5MzNDLDB4OTMzRCwweDkzM0YsMHg5MzQwLDB4OTM0MSwweDkzNDIsLyogMHg3MC0weDc3ICovCisJMHg5MzQzLDB4OTM0NCwweDkzNDUsMHg5MzQ2LDB4OTM0NywweDkzNDgsMHg5MzQ5LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4OTM0QSwweDkzNEIsMHg5MzRDLDB4OTM0RCwweDkzNEUsMHg5MzRGLDB4OTM1MCwweDkzNTEsLyogMHg4MC0weDg3ICovCisJMHg5MzUyLDB4OTM1MywweDkzNTQsMHg5MzU1LDB4OTM1NiwweDkzNTcsMHg5MzU4LDB4OTM1OSwvKiAweDg4LTB4OEYgKi8KKwkweDkzNUEsMHg5MzVCLDB4OTM1QywweDkzNUQsMHg5MzVFLDB4OTM1RiwweDkzNjAsMHg5MzYxLC8qIDB4OTAtMHg5NyAqLworCTB4OTM2MiwweDkzNjMsMHg5MzY0LDB4OTM2NSwweDkzNjYsMHg5MzY3LDB4OTM2OCwweDkzNjksLyogMHg5OC0weDlGICovCisJMHg5MzZCLDB4NkZDOSwweDZGQTcsMHg2RkI5LDB4NkZCNiwweDZGQzIsMHg2RkUxLDB4NkZFRSwvKiAweEEwLTB4QTcgKi8KKwkweDZGREUsMHg2RkUwLDB4NkZFRiwweDcwMUEsMHg3MDIzLDB4NzAxQiwweDcwMzksMHg3MDM1LC8qIDB4QTgtMHhBRiAqLworCTB4NzA0RiwweDcwNUUsMHg1QjgwLDB4NUI4NCwweDVCOTUsMHg1QjkzLDB4NUJBNSwweDVCQjgsLyogMHhCMC0weEI3ICovCisJMHg3NTJGLDB4OUE5RSwweDY0MzQsMHg1QkU0LDB4NUJFRSwweDg5MzAsMHg1QkYwLDB4OEU0NywvKiAweEI4LTB4QkYgKi8KKwkweDhCMDcsMHg4RkI2LDB4OEZEMywweDhGRDUsMHg4RkU1LDB4OEZFRSwweDhGRTQsMHg4RkU5LC8qIDB4QzAtMHhDNyAqLworCTB4OEZFNiwweDhGRjMsMHg4RkU4LDB4OTAwNSwweDkwMDQsMHg5MDBCLDB4OTAyNiwweDkwMTEsLyogMHhDOC0weENGICovCisJMHg5MDBELDB4OTAxNiwweDkwMjEsMHg5MDM1LDB4OTAzNiwweDkwMkQsMHg5MDJGLDB4OTA0NCwvKiAweEQwLTB4RDcgKi8KKwkweDkwNTEsMHg5MDUyLDB4OTA1MCwweDkwNjgsMHg5MDU4LDB4OTA2MiwweDkwNUIsMHg2NkI5LC8qIDB4RDgtMHhERiAqLworCTB4OTA3NCwweDkwN0QsMHg5MDgyLDB4OTA4OCwweDkwODMsMHg5MDhCLDB4NUY1MCwweDVGNTcsLyogMHhFMC0weEU3ICovCisJMHg1RjU2LDB4NUY1OCwweDVDM0IsMHg1NEFCLDB4NUM1MCwweDVDNTksMHg1QjcxLDB4NUM2MywvKiAweEU4LTB4RUYgKi8KKwkweDVDNjYsMHg3RkJDLDB4NUYyQSwweDVGMjksMHg1RjJELDB4ODI3NCwweDVGM0MsMHg5QjNCLC8qIDB4RjAtMHhGNyAqLworCTB4NUM2RSwweDU5ODEsMHg1OTgzLDB4NTk4RCwweDU5QTksMHg1OUFBLDB4NTlBMywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRTZbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5MzZDLDB4OTM2RCwweDkzNkUsMHg5MzZGLDB4OTM3MCwweDkzNzEsMHg5MzcyLDB4OTM3MywvKiAweDQwLTB4NDcgKi8KKwkweDkzNzQsMHg5Mzc1LDB4OTM3NiwweDkzNzcsMHg5Mzc4LDB4OTM3OSwweDkzN0EsMHg5MzdCLC8qIDB4NDgtMHg0RiAqLworCTB4OTM3QywweDkzN0QsMHg5MzdFLDB4OTM3RiwweDkzODAsMHg5MzgxLDB4OTM4MiwweDkzODMsLyogMHg1MC0weDU3ICovCisJMHg5Mzg0LDB4OTM4NSwweDkzODYsMHg5Mzg3LDB4OTM4OCwweDkzODksMHg5MzhBLDB4OTM4QiwvKiAweDU4LTB4NUYgKi8KKwkweDkzOEMsMHg5MzhELDB4OTM4RSwweDkzOTAsMHg5MzkxLDB4OTM5MiwweDkzOTMsMHg5Mzk0LC8qIDB4NjAtMHg2NyAqLworCTB4OTM5NSwweDkzOTYsMHg5Mzk3LDB4OTM5OCwweDkzOTksMHg5MzlBLDB4OTM5QiwweDkzOUMsLyogMHg2OC0weDZGICovCisJMHg5MzlELDB4OTM5RSwweDkzOUYsMHg5M0EwLDB4OTNBMSwweDkzQTIsMHg5M0EzLDB4OTNBNCwvKiAweDcwLTB4NzcgKi8KKwkweDkzQTUsMHg5M0E2LDB4OTNBNywweDkzQTgsMHg5M0E5LDB4OTNBQSwweDkzQUIsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg5M0FDLDB4OTNBRCwweDkzQUUsMHg5M0FGLDB4OTNCMCwweDkzQjEsMHg5M0IyLDB4OTNCMywvKiAweDgwLTB4ODcgKi8KKwkweDkzQjQsMHg5M0I1LDB4OTNCNiwweDkzQjcsMHg5M0I4LDB4OTNCOSwweDkzQkEsMHg5M0JCLC8qIDB4ODgtMHg4RiAqLworCTB4OTNCQywweDkzQkQsMHg5M0JFLDB4OTNCRiwweDkzQzAsMHg5M0MxLDB4OTNDMiwweDkzQzMsLyogMHg5MC0weDk3ICovCisJMHg5M0M0LDB4OTNDNSwweDkzQzYsMHg5M0M3LDB4OTNDOCwweDkzQzksMHg5M0NCLDB4OTNDQywvKiAweDk4LTB4OUYgKi8KKwkweDkzQ0QsMHg1OTk3LDB4NTlDQSwweDU5QUIsMHg1OTlFLDB4NTlBNCwweDU5RDIsMHg1OUIyLC8qIDB4QTAtMHhBNyAqLworCTB4NTlBRiwweDU5RDcsMHg1OUJFLDB4NUEwNSwweDVBMDYsMHg1OURELDB4NUEwOCwweDU5RTMsLyogMHhBOC0weEFGICovCisJMHg1OUQ4LDB4NTlGOSwweDVBMEMsMHg1QTA5LDB4NUEzMiwweDVBMzQsMHg1QTExLDB4NUEyMywvKiAweEIwLTB4QjcgKi8KKwkweDVBMTMsMHg1QTQwLDB4NUE2NywweDVBNEEsMHg1QTU1LDB4NUEzQywweDVBNjIsMHg1QTc1LC8qIDB4QjgtMHhCRiAqLworCTB4ODBFQywweDVBQUEsMHg1QTlCLDB4NUE3NywweDVBN0EsMHg1QUJFLDB4NUFFQiwweDVBQjIsLyogMHhDMC0weEM3ICovCisJMHg1QUQyLDB4NUFENCwweDVBQjgsMHg1QUUwLDB4NUFFMywweDVBRjEsMHg1QUQ2LDB4NUFFNiwvKiAweEM4LTB4Q0YgKi8KKwkweDVBRDgsMHg1QURDLDB4NUIwOSwweDVCMTcsMHg1QjE2LDB4NUIzMiwweDVCMzcsMHg1QjQwLC8qIDB4RDAtMHhENyAqLworCTB4NUMxNSwweDVDMUMsMHg1QjVBLDB4NUI2NSwweDVCNzMsMHg1QjUxLDB4NUI1MywweDVCNjIsLyogMHhEOC0weERGICovCisJMHg5QTc1LDB4OUE3NywweDlBNzgsMHg5QTdBLDB4OUE3RiwweDlBN0QsMHg5QTgwLDB4OUE4MSwvKiAweEUwLTB4RTcgKi8KKwkweDlBODUsMHg5QTg4LDB4OUE4QSwweDlBOTAsMHg5QTkyLDB4OUE5MywweDlBOTYsMHg5QTk4LC8qIDB4RTgtMHhFRiAqLworCTB4OUE5QiwweDlBOUMsMHg5QTlELDB4OUE5RiwweDlBQTAsMHg5QUEyLDB4OUFBMywweDlBQTUsLyogMHhGMC0weEY3ICovCisJMHg5QUE3LDB4N0U5RiwweDdFQTEsMHg3RUEzLDB4N0VBNSwweDdFQTgsMHg3RUE5LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FN1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDkzQ0UsMHg5M0NGLDB4OTNEMCwweDkzRDEsMHg5M0QyLDB4OTNEMywweDkzRDQsMHg5M0Q1LC8qIDB4NDAtMHg0NyAqLworCTB4OTNENywweDkzRDgsMHg5M0Q5LDB4OTNEQSwweDkzREIsMHg5M0RDLDB4OTNERCwweDkzREUsLyogMHg0OC0weDRGICovCisJMHg5M0RGLDB4OTNFMCwweDkzRTEsMHg5M0UyLDB4OTNFMywweDkzRTQsMHg5M0U1LDB4OTNFNiwvKiAweDUwLTB4NTcgKi8KKwkweDkzRTcsMHg5M0U4LDB4OTNFOSwweDkzRUEsMHg5M0VCLDB4OTNFQywweDkzRUQsMHg5M0VFLC8qIDB4NTgtMHg1RiAqLworCTB4OTNFRiwweDkzRjAsMHg5M0YxLDB4OTNGMiwweDkzRjMsMHg5M0Y0LDB4OTNGNSwweDkzRjYsLyogMHg2MC0weDY3ICovCisJMHg5M0Y3LDB4OTNGOCwweDkzRjksMHg5M0ZBLDB4OTNGQiwweDkzRkMsMHg5M0ZELDB4OTNGRSwvKiAweDY4LTB4NkYgKi8KKwkweDkzRkYsMHg5NDAwLDB4OTQwMSwweDk0MDIsMHg5NDAzLDB4OTQwNCwweDk0MDUsMHg5NDA2LC8qIDB4NzAtMHg3NyAqLworCTB4OTQwNywweDk0MDgsMHg5NDA5LDB4OTQwQSwweDk0MEIsMHg5NDBDLDB4OTQwRCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDk0MEUsMHg5NDBGLDB4OTQxMCwweDk0MTEsMHg5NDEyLDB4OTQxMywweDk0MTQsMHg5NDE1LC8qIDB4ODAtMHg4NyAqLworCTB4OTQxNiwweDk0MTcsMHg5NDE4LDB4OTQxOSwweDk0MUEsMHg5NDFCLDB4OTQxQywweDk0MUQsLyogMHg4OC0weDhGICovCisJMHg5NDFFLDB4OTQxRiwweDk0MjAsMHg5NDIxLDB4OTQyMiwweDk0MjMsMHg5NDI0LDB4OTQyNSwvKiAweDkwLTB4OTcgKi8KKwkweDk0MjYsMHg5NDI3LDB4OTQyOCwweDk0MjksMHg5NDJBLDB4OTQyQiwweDk0MkMsMHg5NDJELC8qIDB4OTgtMHg5RiAqLworCTB4OTQyRSwweDdFQUQsMHg3RUIwLDB4N0VCRSwweDdFQzAsMHg3RUMxLDB4N0VDMiwweDdFQzksLyogMHhBMC0weEE3ICovCisJMHg3RUNCLDB4N0VDQywweDdFRDAsMHg3RUQ0LDB4N0VENywweDdFREIsMHg3RUUwLDB4N0VFMSwvKiAweEE4LTB4QUYgKi8KKwkweDdFRTgsMHg3RUVCLDB4N0VFRSwweDdFRUYsMHg3RUYxLDB4N0VGMiwweDdGMEQsMHg3RUY2LC8qIDB4QjAtMHhCNyAqLworCTB4N0VGQSwweDdFRkIsMHg3RUZFLDB4N0YwMSwweDdGMDIsMHg3RjAzLDB4N0YwNywweDdGMDgsLyogMHhCOC0weEJGICovCisJMHg3RjBCLDB4N0YwQywweDdGMEYsMHg3RjExLDB4N0YxMiwweDdGMTcsMHg3RjE5LDB4N0YxQywvKiAweEMwLTB4QzcgKi8KKwkweDdGMUIsMHg3RjFGLDB4N0YyMSwweDdGMjIsMHg3RjIzLDB4N0YyNCwweDdGMjUsMHg3RjI2LC8qIDB4QzgtMHhDRiAqLworCTB4N0YyNywweDdGMkEsMHg3RjJCLDB4N0YyQywweDdGMkQsMHg3RjJGLDB4N0YzMCwweDdGMzEsLyogMHhEMC0weEQ3ICovCisJMHg3RjMyLDB4N0YzMywweDdGMzUsMHg1RTdBLDB4NzU3RiwweDVEREIsMHg3NTNFLDB4OTA5NSwvKiAweEQ4LTB4REYgKi8KKwkweDczOEUsMHg3MzkxLDB4NzNBRSwweDczQTIsMHg3MzlGLDB4NzNDRiwweDczQzIsMHg3M0QxLC8qIDB4RTAtMHhFNyAqLworCTB4NzNCNywweDczQjMsMHg3M0MwLDB4NzNDOSwweDczQzgsMHg3M0U1LDB4NzNEOSwweDk4N0MsLyogMHhFOC0weEVGICovCisJMHg3NDBBLDB4NzNFOSwweDczRTcsMHg3M0RFLDB4NzNCQSwweDczRjIsMHg3NDBGLDB4NzQyQSwvKiAweEYwLTB4RjcgKi8KKwkweDc0NUIsMHg3NDI2LDB4NzQyNSwweDc0MjgsMHg3NDMwLDB4NzQyRSwweDc0MkMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0U4WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OTQyRiwweDk0MzAsMHg5NDMxLDB4OTQzMiwweDk0MzMsMHg5NDM0LDB4OTQzNSwweDk0MzYsLyogMHg0MC0weDQ3ICovCisJMHg5NDM3LDB4OTQzOCwweDk0MzksMHg5NDNBLDB4OTQzQiwweDk0M0MsMHg5NDNELDB4OTQzRiwvKiAweDQ4LTB4NEYgKi8KKwkweDk0NDAsMHg5NDQxLDB4OTQ0MiwweDk0NDMsMHg5NDQ0LDB4OTQ0NSwweDk0NDYsMHg5NDQ3LC8qIDB4NTAtMHg1NyAqLworCTB4OTQ0OCwweDk0NDksMHg5NDRBLDB4OTQ0QiwweDk0NEMsMHg5NDRELDB4OTQ0RSwweDk0NEYsLyogMHg1OC0weDVGICovCisJMHg5NDUwLDB4OTQ1MSwweDk0NTIsMHg5NDUzLDB4OTQ1NCwweDk0NTUsMHg5NDU2LDB4OTQ1NywvKiAweDYwLTB4NjcgKi8KKwkweDk0NTgsMHg5NDU5LDB4OTQ1QSwweDk0NUIsMHg5NDVDLDB4OTQ1RCwweDk0NUUsMHg5NDVGLC8qIDB4NjgtMHg2RiAqLworCTB4OTQ2MCwweDk0NjEsMHg5NDYyLDB4OTQ2MywweDk0NjQsMHg5NDY1LDB4OTQ2NiwweDk0NjcsLyogMHg3MC0weDc3ICovCisJMHg5NDY4LDB4OTQ2OSwweDk0NkEsMHg5NDZDLDB4OTQ2RCwweDk0NkUsMHg5NDZGLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4OTQ3MCwweDk0NzEsMHg5NDcyLDB4OTQ3MywweDk0NzQsMHg5NDc1LDB4OTQ3NiwweDk0NzcsLyogMHg4MC0weDg3ICovCisJMHg5NDc4LDB4OTQ3OSwweDk0N0EsMHg5NDdCLDB4OTQ3QywweDk0N0QsMHg5NDdFLDB4OTQ3RiwvKiAweDg4LTB4OEYgKi8KKwkweDk0ODAsMHg5NDgxLDB4OTQ4MiwweDk0ODMsMHg5NDg0LDB4OTQ5MSwweDk0OTYsMHg5NDk4LC8qIDB4OTAtMHg5NyAqLworCTB4OTRDNywweDk0Q0YsMHg5NEQzLDB4OTRENCwweDk0REEsMHg5NEU2LDB4OTRGQiwweDk1MUMsLyogMHg5OC0weDlGICovCisJMHg5NTIwLDB4NzQxQiwweDc0MUEsMHg3NDQxLDB4NzQ1QywweDc0NTcsMHg3NDU1LDB4NzQ1OSwvKiAweEEwLTB4QTcgKi8KKwkweDc0NzcsMHg3NDZELDB4NzQ3RSwweDc0OUMsMHg3NDhFLDB4NzQ4MCwweDc0ODEsMHg3NDg3LC8qIDB4QTgtMHhBRiAqLworCTB4NzQ4QiwweDc0OUUsMHg3NEE4LDB4NzRBOSwweDc0OTAsMHg3NEE3LDB4NzREMiwweDc0QkEsLyogMHhCMC0weEI3ICovCisJMHg5N0VBLDB4OTdFQiwweDk3RUMsMHg2NzRDLDB4Njc1MywweDY3NUUsMHg2NzQ4LDB4Njc2OSwvKiAweEI4LTB4QkYgKi8KKwkweDY3QTUsMHg2Nzg3LDB4Njc2QSwweDY3NzMsMHg2Nzk4LDB4NjdBNywweDY3NzUsMHg2N0E4LC8qIDB4QzAtMHhDNyAqLworCTB4Njc5RSwweDY3QUQsMHg2NzhCLDB4Njc3NywweDY3N0MsMHg2N0YwLDB4NjgwOSwweDY3RDgsLyogMHhDOC0weENGICovCisJMHg2ODBBLDB4NjdFOSwweDY3QjAsMHg2ODBDLDB4NjdEOSwweDY3QjUsMHg2N0RBLDB4NjdCMywvKiAweEQwLTB4RDcgKi8KKwkweDY3REQsMHg2ODAwLDB4NjdDMywweDY3QjgsMHg2N0UyLDB4NjgwRSwweDY3QzEsMHg2N0ZELC8qIDB4RDgtMHhERiAqLworCTB4NjgzMiwweDY4MzMsMHg2ODYwLDB4Njg2MSwweDY4NEUsMHg2ODYyLDB4Njg0NCwweDY4NjQsLyogMHhFMC0weEU3ICovCisJMHg2ODgzLDB4NjgxRCwweDY4NTUsMHg2ODY2LDB4Njg0MSwweDY4NjcsMHg2ODQwLDB4NjgzRSwvKiAweEU4LTB4RUYgKi8KKwkweDY4NEEsMHg2ODQ5LDB4NjgyOSwweDY4QjUsMHg2ODhGLDB4Njg3NCwweDY4NzcsMHg2ODkzLC8qIDB4RjAtMHhGNyAqLworCTB4Njg2QiwweDY4QzIsMHg2OTZFLDB4NjhGQywweDY5MUYsMHg2OTIwLDB4NjhGOSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRTlbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5NTI3LDB4OTUzMywweDk1M0QsMHg5NTQzLDB4OTU0OCwweDk1NEIsMHg5NTU1LDB4OTU1QSwvKiAweDQwLTB4NDcgKi8KKwkweDk1NjAsMHg5NTZFLDB4OTU3NCwweDk1NzUsMHg5NTc3LDB4OTU3OCwweDk1NzksMHg5NTdBLC8qIDB4NDgtMHg0RiAqLworCTB4OTU3QiwweDk1N0MsMHg5NTdELDB4OTU3RSwweDk1ODAsMHg5NTgxLDB4OTU4MiwweDk1ODMsLyogMHg1MC0weDU3ICovCisJMHg5NTg0LDB4OTU4NSwweDk1ODYsMHg5NTg3LDB4OTU4OCwweDk1ODksMHg5NThBLDB4OTU4QiwvKiAweDU4LTB4NUYgKi8KKwkweDk1OEMsMHg5NThELDB4OTU4RSwweDk1OEYsMHg5NTkwLDB4OTU5MSwweDk1OTIsMHg5NTkzLC8qIDB4NjAtMHg2NyAqLworCTB4OTU5NCwweDk1OTUsMHg5NTk2LDB4OTU5NywweDk1OTgsMHg5NTk5LDB4OTU5QSwweDk1OUIsLyogMHg2OC0weDZGICovCisJMHg5NTlDLDB4OTU5RCwweDk1OUUsMHg5NTlGLDB4OTVBMCwweDk1QTEsMHg5NUEyLDB4OTVBMywvKiAweDcwLTB4NzcgKi8KKwkweDk1QTQsMHg5NUE1LDB4OTVBNiwweDk1QTcsMHg5NUE4LDB4OTVBOSwweDk1QUEsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg5NUFCLDB4OTVBQywweDk1QUQsMHg5NUFFLDB4OTVBRiwweDk1QjAsMHg5NUIxLDB4OTVCMiwvKiAweDgwLTB4ODcgKi8KKwkweDk1QjMsMHg5NUI0LDB4OTVCNSwweDk1QjYsMHg5NUI3LDB4OTVCOCwweDk1QjksMHg5NUJBLC8qIDB4ODgtMHg4RiAqLworCTB4OTVCQiwweDk1QkMsMHg5NUJELDB4OTVCRSwweDk1QkYsMHg5NUMwLDB4OTVDMSwweDk1QzIsLyogMHg5MC0weDk3ICovCisJMHg5NUMzLDB4OTVDNCwweDk1QzUsMHg5NUM2LDB4OTVDNywweDk1QzgsMHg5NUM5LDB4OTVDQSwvKiAweDk4LTB4OUYgKi8KKwkweDk1Q0IsMHg2OTI0LDB4NjhGMCwweDY5MEIsMHg2OTAxLDB4Njk1NywweDY4RTMsMHg2OTEwLC8qIDB4QTAtMHhBNyAqLworCTB4Njk3MSwweDY5MzksMHg2OTYwLDB4Njk0MiwweDY5NUQsMHg2OTg0LDB4Njk2QiwweDY5ODAsLyogMHhBOC0weEFGICovCisJMHg2OTk4LDB4Njk3OCwweDY5MzQsMHg2OUNDLDB4Njk4NywweDY5ODgsMHg2OUNFLDB4Njk4OSwvKiAweEIwLTB4QjcgKi8KKwkweDY5NjYsMHg2OTYzLDB4Njk3OSwweDY5OUIsMHg2OUE3LDB4NjlCQiwweDY5QUIsMHg2OUFELC8qIDB4QjgtMHhCRiAqLworCTB4NjlENCwweDY5QjEsMHg2OUMxLDB4NjlDQSwweDY5REYsMHg2OTk1LDB4NjlFMCwweDY5OEQsLyogMHhDMC0weEM3ICovCisJMHg2OUZGLDB4NkEyRiwweDY5RUQsMHg2QTE3LDB4NkExOCwweDZBNjUsMHg2OUYyLDB4NkE0NCwvKiAweEM4LTB4Q0YgKi8KKwkweDZBM0UsMHg2QUEwLDB4NkE1MCwweDZBNUIsMHg2QTM1LDB4NkE4RSwweDZBNzksMHg2QTNELC8qIDB4RDAtMHhENyAqLworCTB4NkEyOCwweDZBNTgsMHg2QTdDLDB4NkE5MSwweDZBOTAsMHg2QUE5LDB4NkE5NywweDZBQUIsLyogMHhEOC0weERGICovCisJMHg3MzM3LDB4NzM1MiwweDZCODEsMHg2QjgyLDB4NkI4NywweDZCODQsMHg2QjkyLDB4NkI5MywvKiAweEUwLTB4RTcgKi8KKwkweDZCOEQsMHg2QjlBLDB4NkI5QiwweDZCQTEsMHg2QkFBLDB4OEY2QiwweDhGNkQsMHg4RjcxLC8qIDB4RTgtMHhFRiAqLworCTB4OEY3MiwweDhGNzMsMHg4Rjc1LDB4OEY3NiwweDhGNzgsMHg4Rjc3LDB4OEY3OSwweDhGN0EsLyogMHhGMC0weEY3ICovCisJMHg4RjdDLDB4OEY3RSwweDhGODEsMHg4RjgyLDB4OEY4NCwweDhGODcsMHg4RjhCLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FQVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDk1Q0MsMHg5NUNELDB4OTVDRSwweDk1Q0YsMHg5NUQwLDB4OTVEMSwweDk1RDIsMHg5NUQzLC8qIDB4NDAtMHg0NyAqLworCTB4OTVENCwweDk1RDUsMHg5NUQ2LDB4OTVENywweDk1RDgsMHg5NUQ5LDB4OTVEQSwweDk1REIsLyogMHg0OC0weDRGICovCisJMHg5NURDLDB4OTVERCwweDk1REUsMHg5NURGLDB4OTVFMCwweDk1RTEsMHg5NUUyLDB4OTVFMywvKiAweDUwLTB4NTcgKi8KKwkweDk1RTQsMHg5NUU1LDB4OTVFNiwweDk1RTcsMHg5NUVDLDB4OTVGRiwweDk2MDcsMHg5NjEzLC8qIDB4NTgtMHg1RiAqLworCTB4OTYxOCwweDk2MUIsMHg5NjFFLDB4OTYyMCwweDk2MjMsMHg5NjI0LDB4OTYyNSwweDk2MjYsLyogMHg2MC0weDY3ICovCisJMHg5NjI3LDB4OTYyOCwweDk2MjksMHg5NjJCLDB4OTYyQywweDk2MkQsMHg5NjJGLDB4OTYzMCwvKiAweDY4LTB4NkYgKi8KKwkweDk2MzcsMHg5NjM4LDB4OTYzOSwweDk2M0EsMHg5NjNFLDB4OTY0MSwweDk2NDMsMHg5NjRBLC8qIDB4NzAtMHg3NyAqLworCTB4OTY0RSwweDk2NEYsMHg5NjUxLDB4OTY1MiwweDk2NTMsMHg5NjU2LDB4OTY1NywweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDk2NTgsMHg5NjU5LDB4OTY1QSwweDk2NUMsMHg5NjVELDB4OTY1RSwweDk2NjAsMHg5NjYzLC8qIDB4ODAtMHg4NyAqLworCTB4OTY2NSwweDk2NjYsMHg5NjZCLDB4OTY2RCwweDk2NkUsMHg5NjZGLDB4OTY3MCwweDk2NzEsLyogMHg4OC0weDhGICovCisJMHg5NjczLDB4OTY3OCwweDk2NzksMHg5NjdBLDB4OTY3QiwweDk2N0MsMHg5NjdELDB4OTY3RSwvKiAweDkwLTB4OTcgKi8KKwkweDk2N0YsMHg5NjgwLDB4OTY4MSwweDk2ODIsMHg5NjgzLDB4OTY4NCwweDk2ODcsMHg5Njg5LC8qIDB4OTgtMHg5RiAqLworCTB4OTY4QSwweDhGOEQsMHg4RjhFLDB4OEY4RiwweDhGOTgsMHg4RjlBLDB4OEVDRSwweDYyMEIsLyogMHhBMC0weEE3ICovCisJMHg2MjE3LDB4NjIxQiwweDYyMUYsMHg2MjIyLDB4NjIyMSwweDYyMjUsMHg2MjI0LDB4NjIyQywvKiAweEE4LTB4QUYgKi8KKwkweDgxRTcsMHg3NEVGLDB4NzRGNCwweDc0RkYsMHg3NTBGLDB4NzUxMSwweDc1MTMsMHg2NTM0LC8qIDB4QjAtMHhCNyAqLworCTB4NjVFRSwweDY1RUYsMHg2NUYwLDB4NjYwQSwweDY2MTksMHg2NzcyLDB4NjYwMywweDY2MTUsLyogMHhCOC0weEJGICovCisJMHg2NjAwLDB4NzA4NSwweDY2RjcsMHg2NjFELDB4NjYzNCwweDY2MzEsMHg2NjM2LDB4NjYzNSwvKiAweEMwLTB4QzcgKi8KKwkweDgwMDYsMHg2NjVGLDB4NjY1NCwweDY2NDEsMHg2NjRGLDB4NjY1NiwweDY2NjEsMHg2NjU3LC8qIDB4QzgtMHhDRiAqLworCTB4NjY3NywweDY2ODQsMHg2NjhDLDB4NjZBNywweDY2OUQsMHg2NkJFLDB4NjZEQiwweDY2REMsLyogMHhEMC0weEQ3ICovCisJMHg2NkU2LDB4NjZFOSwweDhEMzIsMHg4RDMzLDB4OEQzNiwweDhEM0IsMHg4RDNELDB4OEQ0MCwvKiAweEQ4LTB4REYgKi8KKwkweDhENDUsMHg4RDQ2LDB4OEQ0OCwweDhENDksMHg4RDQ3LDB4OEQ0RCwweDhENTUsMHg4RDU5LC8qIDB4RTAtMHhFNyAqLworCTB4ODlDNywweDg5Q0EsMHg4OUNCLDB4ODlDQywweDg5Q0UsMHg4OUNGLDB4ODlEMCwweDg5RDEsLyogMHhFOC0weEVGICovCisJMHg3MjZFLDB4NzI5RiwweDcyNUQsMHg3MjY2LDB4NzI2RiwweDcyN0UsMHg3MjdGLDB4NzI4NCwvKiAweEYwLTB4RjcgKi8KKwkweDcyOEIsMHg3MjhELDB4NzI4RiwweDcyOTIsMHg2MzA4LDB4NjMzMiwweDYzQjAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0VCWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OTY4QywweDk2OEUsMHg5NjkxLDB4OTY5MiwweDk2OTMsMHg5Njk1LDB4OTY5NiwweDk2OUEsLyogMHg0MC0weDQ3ICovCisJMHg5NjlCLDB4OTY5RCwweDk2OUUsMHg5NjlGLDB4OTZBMCwweDk2QTEsMHg5NkEyLDB4OTZBMywvKiAweDQ4LTB4NEYgKi8KKwkweDk2QTQsMHg5NkE1LDB4OTZBNiwweDk2QTgsMHg5NkE5LDB4OTZBQSwweDk2QUIsMHg5NkFDLC8qIDB4NTAtMHg1NyAqLworCTB4OTZBRCwweDk2QUUsMHg5NkFGLDB4OTZCMSwweDk2QjIsMHg5NkI0LDB4OTZCNSwweDk2QjcsLyogMHg1OC0weDVGICovCisJMHg5NkI4LDB4OTZCQSwweDk2QkIsMHg5NkJGLDB4OTZDMiwweDk2QzMsMHg5NkM4LDB4OTZDQSwvKiAweDYwLTB4NjcgKi8KKwkweDk2Q0IsMHg5NkQwLDB4OTZEMSwweDk2RDMsMHg5NkQ0LDB4OTZENiwweDk2RDcsMHg5NkQ4LC8qIDB4NjgtMHg2RiAqLworCTB4OTZEOSwweDk2REEsMHg5NkRCLDB4OTZEQywweDk2REQsMHg5NkRFLDB4OTZERiwweDk2RTEsLyogMHg3MC0weDc3ICovCisJMHg5NkUyLDB4OTZFMywweDk2RTQsMHg5NkU1LDB4OTZFNiwweDk2RTcsMHg5NkVCLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4OTZFQywweDk2RUQsMHg5NkVFLDB4OTZGMCwweDk2RjEsMHg5NkYyLDB4OTZGNCwweDk2RjUsLyogMHg4MC0weDg3ICovCisJMHg5NkY4LDB4OTZGQSwweDk2RkIsMHg5NkZDLDB4OTZGRCwweDk2RkYsMHg5NzAyLDB4OTcwMywvKiAweDg4LTB4OEYgKi8KKwkweDk3MDUsMHg5NzBBLDB4OTcwQiwweDk3MEMsMHg5NzEwLDB4OTcxMSwweDk3MTIsMHg5NzE0LC8qIDB4OTAtMHg5NyAqLworCTB4OTcxNSwweDk3MTcsMHg5NzE4LDB4OTcxOSwweDk3MUEsMHg5NzFCLDB4OTcxRCwweDk3MUYsLyogMHg5OC0weDlGICovCisJMHg5NzIwLDB4NjQzRiwweDY0RDgsMHg4MDA0LDB4NkJFQSwweDZCRjMsMHg2QkZELDB4NkJGNSwvKiAweEEwLTB4QTcgKi8KKwkweDZCRjksMHg2QzA1LDB4NkMwNywweDZDMDYsMHg2QzBELDB4NkMxNSwweDZDMTgsMHg2QzE5LC8qIDB4QTgtMHhBRiAqLworCTB4NkMxQSwweDZDMjEsMHg2QzI5LDB4NkMyNCwweDZDMkEsMHg2QzMyLDB4NjUzNSwweDY1NTUsLyogMHhCMC0weEI3ICovCisJMHg2NTZCLDB4NzI0RCwweDcyNTIsMHg3MjU2LDB4NzIzMCwweDg2NjIsMHg1MjE2LDB4ODA5RiwvKiAweEI4LTB4QkYgKi8KKwkweDgwOUMsMHg4MDkzLDB4ODBCQywweDY3MEEsMHg4MEJELDB4ODBCMSwweDgwQUIsMHg4MEFELC8qIDB4QzAtMHhDNyAqLworCTB4ODBCNCwweDgwQjcsMHg4MEU3LDB4ODBFOCwweDgwRTksMHg4MEVBLDB4ODBEQiwweDgwQzIsLyogMHhDOC0weENGICovCisJMHg4MEM0LDB4ODBEOSwweDgwQ0QsMHg4MEQ3LDB4NjcxMCwweDgwREQsMHg4MEVCLDB4ODBGMSwvKiAweEQwLTB4RDcgKi8KKwkweDgwRjQsMHg4MEVELDB4ODEwRCwweDgxMEUsMHg4MEYyLDB4ODBGQywweDY3MTUsMHg4MTEyLC8qIDB4RDgtMHhERiAqLworCTB4OEM1QSwweDgxMzYsMHg4MTFFLDB4ODEyQywweDgxMTgsMHg4MTMyLDB4ODE0OCwweDgxNEMsLyogMHhFMC0weEU3ICovCisJMHg4MTUzLDB4ODE3NCwweDgxNTksMHg4MTVBLDB4ODE3MSwweDgxNjAsMHg4MTY5LDB4ODE3QywvKiAweEU4LTB4RUYgKi8KKwkweDgxN0QsMHg4MTZELDB4ODE2NywweDU4NEQsMHg1QUI1LDB4ODE4OCwweDgxODIsMHg4MTkxLC8qIDB4RjAtMHhGNyAqLworCTB4NkVENSwweDgxQTMsMHg4MUFBLDB4ODFDQywweDY3MjYsMHg4MUNBLDB4ODFCQiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRUNbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5NzIxLDB4OTcyMiwweDk3MjMsMHg5NzI0LDB4OTcyNSwweDk3MjYsMHg5NzI3LDB4OTcyOCwvKiAweDQwLTB4NDcgKi8KKwkweDk3MjksMHg5NzJCLDB4OTcyQywweDk3MkUsMHg5NzJGLDB4OTczMSwweDk3MzMsMHg5NzM0LC8qIDB4NDgtMHg0RiAqLworCTB4OTczNSwweDk3MzYsMHg5NzM3LDB4OTczQSwweDk3M0IsMHg5NzNDLDB4OTczRCwweDk3M0YsLyogMHg1MC0weDU3ICovCisJMHg5NzQwLDB4OTc0MSwweDk3NDIsMHg5NzQzLDB4OTc0NCwweDk3NDUsMHg5NzQ2LDB4OTc0NywvKiAweDU4LTB4NUYgKi8KKwkweDk3NDgsMHg5NzQ5LDB4OTc0QSwweDk3NEIsMHg5NzRDLDB4OTc0RCwweDk3NEUsMHg5NzRGLC8qIDB4NjAtMHg2NyAqLworCTB4OTc1MCwweDk3NTEsMHg5NzU0LDB4OTc1NSwweDk3NTcsMHg5NzU4LDB4OTc1QSwweDk3NUMsLyogMHg2OC0weDZGICovCisJMHg5NzVELDB4OTc1RiwweDk3NjMsMHg5NzY0LDB4OTc2NiwweDk3NjcsMHg5NzY4LDB4OTc2QSwvKiAweDcwLTB4NzcgKi8KKwkweDk3NkIsMHg5NzZDLDB4OTc2RCwweDk3NkUsMHg5NzZGLDB4OTc3MCwweDk3NzEsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg5NzcyLDB4OTc3NSwweDk3NzcsMHg5Nzc4LDB4OTc3OSwweDk3N0EsMHg5NzdCLDB4OTc3RCwvKiAweDgwLTB4ODcgKi8KKwkweDk3N0UsMHg5NzdGLDB4OTc4MCwweDk3ODEsMHg5NzgyLDB4OTc4MywweDk3ODQsMHg5Nzg2LC8qIDB4ODgtMHg4RiAqLworCTB4OTc4NywweDk3ODgsMHg5Nzg5LDB4OTc4QSwweDk3OEMsMHg5NzhFLDB4OTc4RiwweDk3OTAsLyogMHg5MC0weDk3ICovCisJMHg5NzkzLDB4OTc5NSwweDk3OTYsMHg5Nzk3LDB4OTc5OSwweDk3OUEsMHg5NzlCLDB4OTc5QywvKiAweDk4LTB4OUYgKi8KKwkweDk3OUQsMHg4MUMxLDB4ODFBNiwweDZCMjQsMHg2QjM3LDB4NkIzOSwweDZCNDMsMHg2QjQ2LC8qIDB4QTAtMHhBNyAqLworCTB4NkI1OSwweDk4RDEsMHg5OEQyLDB4OThEMywweDk4RDUsMHg5OEQ5LDB4OThEQSwweDZCQjMsLyogMHhBOC0weEFGICovCisJMHg1RjQwLDB4NkJDMiwweDg5RjMsMHg2NTkwLDB4OUY1MSwweDY1OTMsMHg2NUJDLDB4NjVDNiwvKiAweEIwLTB4QjcgKi8KKwkweDY1QzQsMHg2NUMzLDB4NjVDQywweDY1Q0UsMHg2NUQyLDB4NjVENiwweDcwODAsMHg3MDlDLC8qIDB4QjgtMHhCRiAqLworCTB4NzA5NiwweDcwOUQsMHg3MEJCLDB4NzBDMCwweDcwQjcsMHg3MEFCLDB4NzBCMSwweDcwRTgsLyogMHhDMC0weEM3ICovCisJMHg3MENBLDB4NzExMCwweDcxMTMsMHg3MTE2LDB4NzEyRiwweDcxMzEsMHg3MTczLDB4NzE1QywvKiAweEM4LTB4Q0YgKi8KKwkweDcxNjgsMHg3MTQ1LDB4NzE3MiwweDcxNEEsMHg3MTc4LDB4NzE3QSwweDcxOTgsMHg3MUIzLC8qIDB4RDAtMHhENyAqLworCTB4NzFCNSwweDcxQTgsMHg3MUEwLDB4NzFFMCwweDcxRDQsMHg3MUU3LDB4NzFGOSwweDcyMUQsLyogMHhEOC0weERGICovCisJMHg3MjI4LDB4NzA2QywweDcxMTgsMHg3MTY2LDB4NzFCOSwweDYyM0UsMHg2MjNELDB4NjI0MywvKiAweEUwLTB4RTcgKi8KKwkweDYyNDgsMHg2MjQ5LDB4NzkzQiwweDc5NDAsMHg3OTQ2LDB4Nzk0OSwweDc5NUIsMHg3OTVDLC8qIDB4RTgtMHhFRiAqLworCTB4Nzk1MywweDc5NUEsMHg3OTYyLDB4Nzk1NywweDc5NjAsMHg3OTZGLDB4Nzk2NywweDc5N0EsLyogMHhGMC0weEY3ICovCisJMHg3OTg1LDB4Nzk4QSwweDc5OUEsMHg3OUE3LDB4NzlCMywweDVGRDEsMHg1RkQwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FRFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDk3OUUsMHg5NzlGLDB4OTdBMSwweDk3QTIsMHg5N0E0LDB4OTdBNSwweDk3QTYsMHg5N0E3LC8qIDB4NDAtMHg0NyAqLworCTB4OTdBOCwweDk3QTksMHg5N0FBLDB4OTdBQywweDk3QUUsMHg5N0IwLDB4OTdCMSwweDk3QjMsLyogMHg0OC0weDRGICovCisJMHg5N0I1LDB4OTdCNiwweDk3QjcsMHg5N0I4LDB4OTdCOSwweDk3QkEsMHg5N0JCLDB4OTdCQywvKiAweDUwLTB4NTcgKi8KKwkweDk3QkQsMHg5N0JFLDB4OTdCRiwweDk3QzAsMHg5N0MxLDB4OTdDMiwweDk3QzMsMHg5N0M0LC8qIDB4NTgtMHg1RiAqLworCTB4OTdDNSwweDk3QzYsMHg5N0M3LDB4OTdDOCwweDk3QzksMHg5N0NBLDB4OTdDQiwweDk3Q0MsLyogMHg2MC0weDY3ICovCisJMHg5N0NELDB4OTdDRSwweDk3Q0YsMHg5N0QwLDB4OTdEMSwweDk3RDIsMHg5N0QzLDB4OTdENCwvKiAweDY4LTB4NkYgKi8KKwkweDk3RDUsMHg5N0Q2LDB4OTdENywweDk3RDgsMHg5N0Q5LDB4OTdEQSwweDk3REIsMHg5N0RDLC8qIDB4NzAtMHg3NyAqLworCTB4OTdERCwweDk3REUsMHg5N0RGLDB4OTdFMCwweDk3RTEsMHg5N0UyLDB4OTdFMywweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDk3RTQsMHg5N0U1LDB4OTdFOCwweDk3RUUsMHg5N0VGLDB4OTdGMCwweDk3RjEsMHg5N0YyLC8qIDB4ODAtMHg4NyAqLworCTB4OTdGNCwweDk3RjcsMHg5N0Y4LDB4OTdGOSwweDk3RkEsMHg5N0ZCLDB4OTdGQywweDk3RkQsLyogMHg4OC0weDhGICovCisJMHg5N0ZFLDB4OTdGRiwweDk4MDAsMHg5ODAxLDB4OTgwMiwweDk4MDMsMHg5ODA0LDB4OTgwNSwvKiAweDkwLTB4OTcgKi8KKwkweDk4MDYsMHg5ODA3LDB4OTgwOCwweDk4MDksMHg5ODBBLDB4OTgwQiwweDk4MEMsMHg5ODBELC8qIDB4OTgtMHg5RiAqLworCTB4OTgwRSwweDYwM0MsMHg2MDVELDB4NjA1QSwweDYwNjcsMHg2MDQxLDB4NjA1OSwweDYwNjMsLyogMHhBMC0weEE3ICovCisJMHg2MEFCLDB4NjEwNiwweDYxMEQsMHg2MTVELDB4NjFBOSwweDYxOUQsMHg2MUNCLDB4NjFEMSwvKiAweEE4LTB4QUYgKi8KKwkweDYyMDYsMHg4MDgwLDB4ODA3RiwweDZDOTMsMHg2Q0Y2LDB4NkRGQywweDc3RjYsMHg3N0Y4LC8qIDB4QjAtMHhCNyAqLworCTB4NzgwMCwweDc4MDksMHg3ODE3LDB4NzgxOCwweDc4MTEsMHg2NUFCLDB4NzgyRCwweDc4MUMsLyogMHhCOC0weEJGICovCisJMHg3ODFELDB4NzgzOSwweDc4M0EsMHg3ODNCLDB4NzgxRiwweDc4M0MsMHg3ODI1LDB4NzgyQywvKiAweEMwLTB4QzcgKi8KKwkweDc4MjMsMHg3ODI5LDB4Nzg0RSwweDc4NkQsMHg3ODU2LDB4Nzg1NywweDc4MjYsMHg3ODUwLC8qIDB4QzgtMHhDRiAqLworCTB4Nzg0NywweDc4NEMsMHg3ODZBLDB4Nzg5QiwweDc4OTMsMHg3ODlBLDB4Nzg4NywweDc4OUMsLyogMHhEMC0weEQ3ICovCisJMHg3OEExLDB4NzhBMywweDc4QjIsMHg3OEI5LDB4NzhBNSwweDc4RDQsMHg3OEQ5LDB4NzhDOSwvKiAweEQ4LTB4REYgKi8KKwkweDc4RUMsMHg3OEYyLDB4NzkwNSwweDc4RjQsMHg3OTEzLDB4NzkyNCwweDc5MUUsMHg3OTM0LC8qIDB4RTAtMHhFNyAqLworCTB4OUY5QiwweDlFRjksMHg5RUZCLDB4OUVGQywweDc2RjEsMHg3NzA0LDB4NzcwRCwweDc2RjksLyogMHhFOC0weEVGICovCisJMHg3NzA3LDB4NzcwOCwweDc3MUEsMHg3NzIyLDB4NzcxOSwweDc3MkQsMHg3NzI2LDB4NzczNSwvKiAweEYwLTB4RjcgKi8KKwkweDc3MzgsMHg3NzUwLDB4Nzc1MSwweDc3NDcsMHg3NzQzLDB4Nzc1QSwweDc3NjgsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0VFWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OTgwRiwweDk4MTAsMHg5ODExLDB4OTgxMiwweDk4MTMsMHg5ODE0LDB4OTgxNSwweDk4MTYsLyogMHg0MC0weDQ3ICovCisJMHg5ODE3LDB4OTgxOCwweDk4MTksMHg5ODFBLDB4OTgxQiwweDk4MUMsMHg5ODFELDB4OTgxRSwvKiAweDQ4LTB4NEYgKi8KKwkweDk4MUYsMHg5ODIwLDB4OTgyMSwweDk4MjIsMHg5ODIzLDB4OTgyNCwweDk4MjUsMHg5ODI2LC8qIDB4NTAtMHg1NyAqLworCTB4OTgyNywweDk4MjgsMHg5ODI5LDB4OTgyQSwweDk4MkIsMHg5ODJDLDB4OTgyRCwweDk4MkUsLyogMHg1OC0weDVGICovCisJMHg5ODJGLDB4OTgzMCwweDk4MzEsMHg5ODMyLDB4OTgzMywweDk4MzQsMHg5ODM1LDB4OTgzNiwvKiAweDYwLTB4NjcgKi8KKwkweDk4MzcsMHg5ODM4LDB4OTgzOSwweDk4M0EsMHg5ODNCLDB4OTgzQywweDk4M0QsMHg5ODNFLC8qIDB4NjgtMHg2RiAqLworCTB4OTgzRiwweDk4NDAsMHg5ODQxLDB4OTg0MiwweDk4NDMsMHg5ODQ0LDB4OTg0NSwweDk4NDYsLyogMHg3MC0weDc3ICovCisJMHg5ODQ3LDB4OTg0OCwweDk4NDksMHg5ODRBLDB4OTg0QiwweDk4NEMsMHg5ODRELDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4OTg0RSwweDk4NEYsMHg5ODUwLDB4OTg1MSwweDk4NTIsMHg5ODUzLDB4OTg1NCwweDk4NTUsLyogMHg4MC0weDg3ICovCisJMHg5ODU2LDB4OTg1NywweDk4NTgsMHg5ODU5LDB4OTg1QSwweDk4NUIsMHg5ODVDLDB4OTg1RCwvKiAweDg4LTB4OEYgKi8KKwkweDk4NUUsMHg5ODVGLDB4OTg2MCwweDk4NjEsMHg5ODYyLDB4OTg2MywweDk4NjQsMHg5ODY1LC8qIDB4OTAtMHg5NyAqLworCTB4OTg2NiwweDk4NjcsMHg5ODY4LDB4OTg2OSwweDk4NkEsMHg5ODZCLDB4OTg2QywweDk4NkQsLyogMHg5OC0weDlGICovCisJMHg5ODZFLDB4Nzc2MiwweDc3NjUsMHg3NzdGLDB4Nzc4RCwweDc3N0QsMHg3NzgwLDB4Nzc4QywvKiAweEEwLTB4QTcgKi8KKwkweDc3OTEsMHg3NzlGLDB4NzdBMCwweDc3QjAsMHg3N0I1LDB4NzdCRCwweDc1M0EsMHg3NTQwLC8qIDB4QTgtMHhBRiAqLworCTB4NzU0RSwweDc1NEIsMHg3NTQ4LDB4NzU1QiwweDc1NzIsMHg3NTc5LDB4NzU4MywweDdGNTgsLyogMHhCMC0weEI3ICovCisJMHg3RjYxLDB4N0Y1RiwweDhBNDgsMHg3RjY4LDB4N0Y3NCwweDdGNzEsMHg3Rjc5LDB4N0Y4MSwvKiAweEI4LTB4QkYgKi8KKwkweDdGN0UsMHg3NkNELDB4NzZFNSwweDg4MzIsMHg5NDg1LDB4OTQ4NiwweDk0ODcsMHg5NDhCLC8qIDB4QzAtMHhDNyAqLworCTB4OTQ4QSwweDk0OEMsMHg5NDhELDB4OTQ4RiwweDk0OTAsMHg5NDk0LDB4OTQ5NywweDk0OTUsLyogMHhDOC0weENGICovCisJMHg5NDlBLDB4OTQ5QiwweDk0OUMsMHg5NEEzLDB4OTRBNCwweDk0QUIsMHg5NEFBLDB4OTRBRCwvKiAweEQwLTB4RDcgKi8KKwkweDk0QUMsMHg5NEFGLDB4OTRCMCwweDk0QjIsMHg5NEI0LDB4OTRCNiwweDk0QjcsMHg5NEI4LC8qIDB4RDgtMHhERiAqLworCTB4OTRCOSwweDk0QkEsMHg5NEJDLDB4OTRCRCwweDk0QkYsMHg5NEM0LDB4OTRDOCwweDk0QzksLyogMHhFMC0weEU3ICovCisJMHg5NENBLDB4OTRDQiwweDk0Q0MsMHg5NENELDB4OTRDRSwweDk0RDAsMHg5NEQxLDB4OTREMiwvKiAweEU4LTB4RUYgKi8KKwkweDk0RDUsMHg5NEQ2LDB4OTRENywweDk0RDksMHg5NEQ4LDB4OTREQiwweDk0REUsMHg5NERGLC8qIDB4RjAtMHhGNyAqLworCTB4OTRFMCwweDk0RTIsMHg5NEU0LDB4OTRFNSwweDk0RTcsMHg5NEU4LDB4OTRFQSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRUZbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5ODZGLDB4OTg3MCwweDk4NzEsMHg5ODcyLDB4OTg3MywweDk4NzQsMHg5ODhCLDB4OTg4RSwvKiAweDQwLTB4NDcgKi8KKwkweDk4OTIsMHg5ODk1LDB4OTg5OSwweDk4QTMsMHg5OEE4LDB4OThBOSwweDk4QUEsMHg5OEFCLC8qIDB4NDgtMHg0RiAqLworCTB4OThBQywweDk4QUQsMHg5OEFFLDB4OThBRiwweDk4QjAsMHg5OEIxLDB4OThCMiwweDk4QjMsLyogMHg1MC0weDU3ICovCisJMHg5OEI0LDB4OThCNSwweDk4QjYsMHg5OEI3LDB4OThCOCwweDk4QjksMHg5OEJBLDB4OThCQiwvKiAweDU4LTB4NUYgKi8KKwkweDk4QkMsMHg5OEJELDB4OThCRSwweDk4QkYsMHg5OEMwLDB4OThDMSwweDk4QzIsMHg5OEMzLC8qIDB4NjAtMHg2NyAqLworCTB4OThDNCwweDk4QzUsMHg5OEM2LDB4OThDNywweDk4QzgsMHg5OEM5LDB4OThDQSwweDk4Q0IsLyogMHg2OC0weDZGICovCisJMHg5OENDLDB4OThDRCwweDk4Q0YsMHg5OEQwLDB4OThENCwweDk4RDYsMHg5OEQ3LDB4OThEQiwvKiAweDcwLTB4NzcgKi8KKwkweDk4REMsMHg5OERELDB4OThFMCwweDk4RTEsMHg5OEUyLDB4OThFMywweDk4RTQsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg5OEU1LDB4OThFNiwweDk4RTksMHg5OEVBLDB4OThFQiwweDk4RUMsMHg5OEVELDB4OThFRSwvKiAweDgwLTB4ODcgKi8KKwkweDk4RUYsMHg5OEYwLDB4OThGMSwweDk4RjIsMHg5OEYzLDB4OThGNCwweDk4RjUsMHg5OEY2LC8qIDB4ODgtMHg4RiAqLworCTB4OThGNywweDk4RjgsMHg5OEY5LDB4OThGQSwweDk4RkIsMHg5OEZDLDB4OThGRCwweDk4RkUsLyogMHg5MC0weDk3ICovCisJMHg5OEZGLDB4OTkwMCwweDk5MDEsMHg5OTAyLDB4OTkwMywweDk5MDQsMHg5OTA1LDB4OTkwNiwvKiAweDk4LTB4OUYgKi8KKwkweDk5MDcsMHg5NEU5LDB4OTRFQiwweDk0RUUsMHg5NEVGLDB4OTRGMywweDk0RjQsMHg5NEY1LC8qIDB4QTAtMHhBNyAqLworCTB4OTRGNywweDk0RjksMHg5NEZDLDB4OTRGRCwweDk0RkYsMHg5NTAzLDB4OTUwMiwweDk1MDYsLyogMHhBOC0weEFGICovCisJMHg5NTA3LDB4OTUwOSwweDk1MEEsMHg5NTBELDB4OTUwRSwweDk1MEYsMHg5NTEyLDB4OTUxMywvKiAweEIwLTB4QjcgKi8KKwkweDk1MTQsMHg5NTE1LDB4OTUxNiwweDk1MTgsMHg5NTFCLDB4OTUxRCwweDk1MUUsMHg5NTFGLC8qIDB4QjgtMHhCRiAqLworCTB4OTUyMiwweDk1MkEsMHg5NTJCLDB4OTUyOSwweDk1MkMsMHg5NTMxLDB4OTUzMiwweDk1MzQsLyogMHhDMC0weEM3ICovCisJMHg5NTM2LDB4OTUzNywweDk1MzgsMHg5NTNDLDB4OTUzRSwweDk1M0YsMHg5NTQyLDB4OTUzNSwvKiAweEM4LTB4Q0YgKi8KKwkweDk1NDQsMHg5NTQ1LDB4OTU0NiwweDk1NDksMHg5NTRDLDB4OTU0RSwweDk1NEYsMHg5NTUyLC8qIDB4RDAtMHhENyAqLworCTB4OTU1MywweDk1NTQsMHg5NTU2LDB4OTU1NywweDk1NTgsMHg5NTU5LDB4OTU1QiwweDk1NUUsLyogMHhEOC0weERGICovCisJMHg5NTVGLDB4OTU1RCwweDk1NjEsMHg5NTYyLDB4OTU2NCwweDk1NjUsMHg5NTY2LDB4OTU2NywvKiAweEUwLTB4RTcgKi8KKwkweDk1NjgsMHg5NTY5LDB4OTU2QSwweDk1NkIsMHg5NTZDLDB4OTU2RiwweDk1NzEsMHg5NTcyLC8qIDB4RTgtMHhFRiAqLworCTB4OTU3MywweDk1M0EsMHg3N0U3LDB4NzdFQywweDk2QzksMHg3OUQ1LDB4NzlFRCwweDc5RTMsLyogMHhGMC0weEY3ICovCisJMHg3OUVCLDB4N0EwNiwweDVENDcsMHg3QTAzLDB4N0EwMiwweDdBMUUsMHg3QTE0LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9GMFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDk5MDgsMHg5OTA5LDB4OTkwQSwweDk5MEIsMHg5OTBDLDB4OTkwRSwweDk5MEYsMHg5OTExLC8qIDB4NDAtMHg0NyAqLworCTB4OTkxMiwweDk5MTMsMHg5OTE0LDB4OTkxNSwweDk5MTYsMHg5OTE3LDB4OTkxOCwweDk5MTksLyogMHg0OC0weDRGICovCisJMHg5OTFBLDB4OTkxQiwweDk5MUMsMHg5OTFELDB4OTkxRSwweDk5MUYsMHg5OTIwLDB4OTkyMSwvKiAweDUwLTB4NTcgKi8KKwkweDk5MjIsMHg5OTIzLDB4OTkyNCwweDk5MjUsMHg5OTI2LDB4OTkyNywweDk5MjgsMHg5OTI5LC8qIDB4NTgtMHg1RiAqLworCTB4OTkyQSwweDk5MkIsMHg5OTJDLDB4OTkyRCwweDk5MkYsMHg5OTMwLDB4OTkzMSwweDk5MzIsLyogMHg2MC0weDY3ICovCisJMHg5OTMzLDB4OTkzNCwweDk5MzUsMHg5OTM2LDB4OTkzNywweDk5MzgsMHg5OTM5LDB4OTkzQSwvKiAweDY4LTB4NkYgKi8KKwkweDk5M0IsMHg5OTNDLDB4OTkzRCwweDk5M0UsMHg5OTNGLDB4OTk0MCwweDk5NDEsMHg5OTQyLC8qIDB4NzAtMHg3NyAqLworCTB4OTk0MywweDk5NDQsMHg5OTQ1LDB4OTk0NiwweDk5NDcsMHg5OTQ4LDB4OTk0OSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDk5NEEsMHg5OTRCLDB4OTk0QywweDk5NEQsMHg5OTRFLDB4OTk0RiwweDk5NTAsMHg5OTUxLC8qIDB4ODAtMHg4NyAqLworCTB4OTk1MiwweDk5NTMsMHg5OTU2LDB4OTk1NywweDk5NTgsMHg5OTU5LDB4OTk1QSwweDk5NUIsLyogMHg4OC0weDhGICovCisJMHg5OTVDLDB4OTk1RCwweDk5NUUsMHg5OTVGLDB4OTk2MCwweDk5NjEsMHg5OTYyLDB4OTk2NCwvKiAweDkwLTB4OTcgKi8KKwkweDk5NjYsMHg5OTczLDB4OTk3OCwweDk5NzksMHg5OTdCLDB4OTk3RSwweDk5ODIsMHg5OTgzLC8qIDB4OTgtMHg5RiAqLworCTB4OTk4OSwweDdBMzksMHg3QTM3LDB4N0E1MSwweDlFQ0YsMHg5OUE1LDB4N0E3MCwweDc2ODgsLyogMHhBMC0weEE3ICovCisJMHg3NjhFLDB4NzY5MywweDc2OTksMHg3NkE0LDB4NzRERSwweDc0RTAsMHg3NTJDLDB4OUUyMCwvKiAweEE4LTB4QUYgKi8KKwkweDlFMjIsMHg5RTI4LDB4OUUyOSwweDlFMkEsMHg5RTJCLDB4OUUyQywweDlFMzIsMHg5RTMxLC8qIDB4QjAtMHhCNyAqLworCTB4OUUzNiwweDlFMzgsMHg5RTM3LDB4OUUzOSwweDlFM0EsMHg5RTNFLDB4OUU0MSwweDlFNDIsLyogMHhCOC0weEJGICovCisJMHg5RTQ0LDB4OUU0NiwweDlFNDcsMHg5RTQ4LDB4OUU0OSwweDlFNEIsMHg5RTRDLDB4OUU0RSwvKiAweEMwLTB4QzcgKi8KKwkweDlFNTEsMHg5RTU1LDB4OUU1NywweDlFNUEsMHg5RTVCLDB4OUU1QywweDlFNUUsMHg5RTYzLC8qIDB4QzgtMHhDRiAqLworCTB4OUU2NiwweDlFNjcsMHg5RTY4LDB4OUU2OSwweDlFNkEsMHg5RTZCLDB4OUU2QywweDlFNzEsLyogMHhEMC0weEQ3ICovCisJMHg5RTZELDB4OUU3MywweDc1OTIsMHg3NTk0LDB4NzU5NiwweDc1QTAsMHg3NTlELDB4NzVBQywvKiAweEQ4LTB4REYgKi8KKwkweDc1QTMsMHg3NUIzLDB4NzVCNCwweDc1QjgsMHg3NUM0LDB4NzVCMSwweDc1QjAsMHg3NUMzLC8qIDB4RTAtMHhFNyAqLworCTB4NzVDMiwweDc1RDYsMHg3NUNELDB4NzVFMywweDc1RTgsMHg3NUU2LDB4NzVFNCwweDc1RUIsLyogMHhFOC0weEVGICovCisJMHg3NUU3LDB4NzYwMywweDc1RjEsMHg3NUZDLDB4NzVGRiwweDc2MTAsMHg3NjAwLDB4NzYwNSwvKiAweEYwLTB4RjcgKi8KKwkweDc2MEMsMHg3NjE3LDB4NzYwQSwweDc2MjUsMHg3NjE4LDB4NzYxNSwweDc2MTksMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0YxWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OTk4QywweDk5OEUsMHg5OTlBLDB4OTk5QiwweDk5OUMsMHg5OTlELDB4OTk5RSwweDk5OUYsLyogMHg0MC0weDQ3ICovCisJMHg5OUEwLDB4OTlBMSwweDk5QTIsMHg5OUEzLDB4OTlBNCwweDk5QTYsMHg5OUE3LDB4OTlBOSwvKiAweDQ4LTB4NEYgKi8KKwkweDk5QUEsMHg5OUFCLDB4OTlBQywweDk5QUQsMHg5OUFFLDB4OTlBRiwweDk5QjAsMHg5OUIxLC8qIDB4NTAtMHg1NyAqLworCTB4OTlCMiwweDk5QjMsMHg5OUI0LDB4OTlCNSwweDk5QjYsMHg5OUI3LDB4OTlCOCwweDk5QjksLyogMHg1OC0weDVGICovCisJMHg5OUJBLDB4OTlCQiwweDk5QkMsMHg5OUJELDB4OTlCRSwweDk5QkYsMHg5OUMwLDB4OTlDMSwvKiAweDYwLTB4NjcgKi8KKwkweDk5QzIsMHg5OUMzLDB4OTlDNCwweDk5QzUsMHg5OUM2LDB4OTlDNywweDk5QzgsMHg5OUM5LC8qIDB4NjgtMHg2RiAqLworCTB4OTlDQSwweDk5Q0IsMHg5OUNDLDB4OTlDRCwweDk5Q0UsMHg5OUNGLDB4OTlEMCwweDk5RDEsLyogMHg3MC0weDc3ICovCisJMHg5OUQyLDB4OTlEMywweDk5RDQsMHg5OUQ1LDB4OTlENiwweDk5RDcsMHg5OUQ4LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4OTlEOSwweDk5REEsMHg5OURCLDB4OTlEQywweDk5REQsMHg5OURFLDB4OTlERiwweDk5RTAsLyogMHg4MC0weDg3ICovCisJMHg5OUUxLDB4OTlFMiwweDk5RTMsMHg5OUU0LDB4OTlFNSwweDk5RTYsMHg5OUU3LDB4OTlFOCwvKiAweDg4LTB4OEYgKi8KKwkweDk5RTksMHg5OUVBLDB4OTlFQiwweDk5RUMsMHg5OUVELDB4OTlFRSwweDk5RUYsMHg5OUYwLC8qIDB4OTAtMHg5NyAqLworCTB4OTlGMSwweDk5RjIsMHg5OUYzLDB4OTlGNCwweDk5RjUsMHg5OUY2LDB4OTlGNywweDk5RjgsLyogMHg5OC0weDlGICovCisJMHg5OUY5LDB4NzYxQiwweDc2M0MsMHg3NjIyLDB4NzYyMCwweDc2NDAsMHg3NjJELDB4NzYzMCwvKiAweEEwLTB4QTcgKi8KKwkweDc2M0YsMHg3NjM1LDB4NzY0MywweDc2M0UsMHg3NjMzLDB4NzY0RCwweDc2NUUsMHg3NjU0LC8qIDB4QTgtMHhBRiAqLworCTB4NzY1QywweDc2NTYsMHg3NjZCLDB4NzY2RiwweDdGQ0EsMHg3QUU2LDB4N0E3OCwweDdBNzksLyogMHhCMC0weEI3ICovCisJMHg3QTgwLDB4N0E4NiwweDdBODgsMHg3QTk1LDB4N0FBNiwweDdBQTAsMHg3QUFDLDB4N0FBOCwvKiAweEI4LTB4QkYgKi8KKwkweDdBQUQsMHg3QUIzLDB4ODg2NCwweDg4NjksMHg4ODcyLDB4ODg3RCwweDg4N0YsMHg4ODgyLC8qIDB4QzAtMHhDNyAqLworCTB4ODhBMiwweDg4QzYsMHg4OEI3LDB4ODhCQywweDg4QzksMHg4OEUyLDB4ODhDRSwweDg4RTMsLyogMHhDOC0weENGICovCisJMHg4OEU1LDB4ODhGMSwweDg5MUEsMHg4OEZDLDB4ODhFOCwweDg4RkUsMHg4OEYwLDB4ODkyMSwvKiAweEQwLTB4RDcgKi8KKwkweDg5MTksMHg4OTEzLDB4ODkxQiwweDg5MEEsMHg4OTM0LDB4ODkyQiwweDg5MzYsMHg4OTQxLC8qIDB4RDgtMHhERiAqLworCTB4ODk2NiwweDg5N0IsMHg3NThCLDB4ODBFNSwweDc2QjIsMHg3NkI0LDB4NzdEQywweDgwMTIsLyogMHhFMC0weEU3ICovCisJMHg4MDE0LDB4ODAxNiwweDgwMUMsMHg4MDIwLDB4ODAyMiwweDgwMjUsMHg4MDI2LDB4ODAyNywvKiAweEU4LTB4RUYgKi8KKwkweDgwMjksMHg4MDI4LDB4ODAzMSwweDgwMEIsMHg4MDM1LDB4ODA0MywweDgwNDYsMHg4MDRELC8qIDB4RjAtMHhGNyAqLworCTB4ODA1MiwweDgwNjksMHg4MDcxLDB4ODk4MywweDk4NzgsMHg5ODgwLDB4OTg4MywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRjJbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5OUZBLDB4OTlGQiwweDk5RkMsMHg5OUZELDB4OTlGRSwweDk5RkYsMHg5QTAwLDB4OUEwMSwvKiAweDQwLTB4NDcgKi8KKwkweDlBMDIsMHg5QTAzLDB4OUEwNCwweDlBMDUsMHg5QTA2LDB4OUEwNywweDlBMDgsMHg5QTA5LC8qIDB4NDgtMHg0RiAqLworCTB4OUEwQSwweDlBMEIsMHg5QTBDLDB4OUEwRCwweDlBMEUsMHg5QTBGLDB4OUExMCwweDlBMTEsLyogMHg1MC0weDU3ICovCisJMHg5QTEyLDB4OUExMywweDlBMTQsMHg5QTE1LDB4OUExNiwweDlBMTcsMHg5QTE4LDB4OUExOSwvKiAweDU4LTB4NUYgKi8KKwkweDlBMUEsMHg5QTFCLDB4OUExQywweDlBMUQsMHg5QTFFLDB4OUExRiwweDlBMjAsMHg5QTIxLC8qIDB4NjAtMHg2NyAqLworCTB4OUEyMiwweDlBMjMsMHg5QTI0LDB4OUEyNSwweDlBMjYsMHg5QTI3LDB4OUEyOCwweDlBMjksLyogMHg2OC0weDZGICovCisJMHg5QTJBLDB4OUEyQiwweDlBMkMsMHg5QTJELDB4OUEyRSwweDlBMkYsMHg5QTMwLDB4OUEzMSwvKiAweDcwLTB4NzcgKi8KKwkweDlBMzIsMHg5QTMzLDB4OUEzNCwweDlBMzUsMHg5QTM2LDB4OUEzNywweDlBMzgsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg5QTM5LDB4OUEzQSwweDlBM0IsMHg5QTNDLDB4OUEzRCwweDlBM0UsMHg5QTNGLDB4OUE0MCwvKiAweDgwLTB4ODcgKi8KKwkweDlBNDEsMHg5QTQyLDB4OUE0MywweDlBNDQsMHg5QTQ1LDB4OUE0NiwweDlBNDcsMHg5QTQ4LC8qIDB4ODgtMHg4RiAqLworCTB4OUE0OSwweDlBNEEsMHg5QTRCLDB4OUE0QywweDlBNEQsMHg5QTRFLDB4OUE0RiwweDlBNTAsLyogMHg5MC0weDk3ICovCisJMHg5QTUxLDB4OUE1MiwweDlBNTMsMHg5QTU0LDB4OUE1NSwweDlBNTYsMHg5QTU3LDB4OUE1OCwvKiAweDk4LTB4OUYgKi8KKwkweDlBNTksMHg5ODg5LDB4OTg4QywweDk4OEQsMHg5ODhGLDB4OTg5NCwweDk4OUEsMHg5ODlCLC8qIDB4QTAtMHhBNyAqLworCTB4OTg5RSwweDk4OUYsMHg5OEExLDB4OThBMiwweDk4QTUsMHg5OEE2LDB4ODY0RCwweDg2NTQsLyogMHhBOC0weEFGICovCisJMHg4NjZDLDB4ODY2RSwweDg2N0YsMHg4NjdBLDB4ODY3QywweDg2N0IsMHg4NkE4LDB4ODY4RCwvKiAweEIwLTB4QjcgKi8KKwkweDg2OEIsMHg4NkFDLDB4ODY5RCwweDg2QTcsMHg4NkEzLDB4ODZBQSwweDg2OTMsMHg4NkE5LC8qIDB4QjgtMHhCRiAqLworCTB4ODZCNiwweDg2QzQsMHg4NkI1LDB4ODZDRSwweDg2QjAsMHg4NkJBLDB4ODZCMSwweDg2QUYsLyogMHhDMC0weEM3ICovCisJMHg4NkM5LDB4ODZDRiwweDg2QjQsMHg4NkU5LDB4ODZGMSwweDg2RjIsMHg4NkVELDB4ODZGMywvKiAweEM4LTB4Q0YgKi8KKwkweDg2RDAsMHg4NzEzLDB4ODZERSwweDg2RjQsMHg4NkRGLDB4ODZEOCwweDg2RDEsMHg4NzAzLC8qIDB4RDAtMHhENyAqLworCTB4ODcwNywweDg2RjgsMHg4NzA4LDB4ODcwQSwweDg3MEQsMHg4NzA5LDB4ODcyMywweDg3M0IsLyogMHhEOC0weERGICovCisJMHg4NzFFLDB4ODcyNSwweDg3MkUsMHg4NzFBLDB4ODczRSwweDg3NDgsMHg4NzM0LDB4ODczMSwvKiAweEUwLTB4RTcgKi8KKwkweDg3MjksMHg4NzM3LDB4ODczRiwweDg3ODIsMHg4NzIyLDB4ODc3RCwweDg3N0UsMHg4NzdCLC8qIDB4RTgtMHhFRiAqLworCTB4ODc2MCwweDg3NzAsMHg4NzRDLDB4ODc2RSwweDg3OEIsMHg4NzUzLDB4ODc2MywweDg3N0MsLyogMHhGMC0weEY3ICovCisJMHg4NzY0LDB4ODc1OSwweDg3NjUsMHg4NzkzLDB4ODdBRiwweDg3QTgsMHg4N0QyLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9GM1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDlBNUEsMHg5QTVCLDB4OUE1QywweDlBNUQsMHg5QTVFLDB4OUE1RiwweDlBNjAsMHg5QTYxLC8qIDB4NDAtMHg0NyAqLworCTB4OUE2MiwweDlBNjMsMHg5QTY0LDB4OUE2NSwweDlBNjYsMHg5QTY3LDB4OUE2OCwweDlBNjksLyogMHg0OC0weDRGICovCisJMHg5QTZBLDB4OUE2QiwweDlBNzIsMHg5QTgzLDB4OUE4OSwweDlBOEQsMHg5QThFLDB4OUE5NCwvKiAweDUwLTB4NTcgKi8KKwkweDlBOTUsMHg5QTk5LDB4OUFBNiwweDlBQTksMHg5QUFBLDB4OUFBQiwweDlBQUMsMHg5QUFELC8qIDB4NTgtMHg1RiAqLworCTB4OUFBRSwweDlBQUYsMHg5QUIyLDB4OUFCMywweDlBQjQsMHg5QUI1LDB4OUFCOSwweDlBQkIsLyogMHg2MC0weDY3ICovCisJMHg5QUJELDB4OUFCRSwweDlBQkYsMHg5QUMzLDB4OUFDNCwweDlBQzYsMHg5QUM3LDB4OUFDOCwvKiAweDY4LTB4NkYgKi8KKwkweDlBQzksMHg5QUNBLDB4OUFDRCwweDlBQ0UsMHg5QUNGLDB4OUFEMCwweDlBRDIsMHg5QUQ0LC8qIDB4NzAtMHg3NyAqLworCTB4OUFENSwweDlBRDYsMHg5QUQ3LDB4OUFEOSwweDlBREEsMHg5QURCLDB4OUFEQywweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDlBREQsMHg5QURFLDB4OUFFMCwweDlBRTIsMHg5QUUzLDB4OUFFNCwweDlBRTUsMHg5QUU3LC8qIDB4ODAtMHg4NyAqLworCTB4OUFFOCwweDlBRTksMHg5QUVBLDB4OUFFQywweDlBRUUsMHg5QUYwLDB4OUFGMSwweDlBRjIsLyogMHg4OC0weDhGICovCisJMHg5QUYzLDB4OUFGNCwweDlBRjUsMHg5QUY2LDB4OUFGNywweDlBRjgsMHg5QUZBLDB4OUFGQywvKiAweDkwLTB4OTcgKi8KKwkweDlBRkQsMHg5QUZFLDB4OUFGRiwweDlCMDAsMHg5QjAxLDB4OUIwMiwweDlCMDQsMHg5QjA1LC8qIDB4OTgtMHg5RiAqLworCTB4OUIwNiwweDg3QzYsMHg4Nzg4LDB4ODc4NSwweDg3QUQsMHg4Nzk3LDB4ODc4MywweDg3QUIsLyogMHhBMC0weEE3ICovCisJMHg4N0U1LDB4ODdBQywweDg3QjUsMHg4N0IzLDB4ODdDQiwweDg3RDMsMHg4N0JELDB4ODdEMSwvKiAweEE4LTB4QUYgKi8KKwkweDg3QzAsMHg4N0NBLDB4ODdEQiwweDg3RUEsMHg4N0UwLDB4ODdFRSwweDg4MTYsMHg4ODEzLC8qIDB4QjAtMHhCNyAqLworCTB4ODdGRSwweDg4MEEsMHg4ODFCLDB4ODgyMSwweDg4MzksMHg4ODNDLDB4N0YzNiwweDdGNDIsLyogMHhCOC0weEJGICovCisJMHg3RjQ0LDB4N0Y0NSwweDgyMTAsMHg3QUZBLDB4N0FGRCwweDdCMDgsMHg3QjAzLDB4N0IwNCwvKiAweEMwLTB4QzcgKi8KKwkweDdCMTUsMHg3QjBBLDB4N0IyQiwweDdCMEYsMHg3QjQ3LDB4N0IzOCwweDdCMkEsMHg3QjE5LC8qIDB4QzgtMHhDRiAqLworCTB4N0IyRSwweDdCMzEsMHg3QjIwLDB4N0IyNSwweDdCMjQsMHg3QjMzLDB4N0IzRSwweDdCMUUsLyogMHhEMC0weEQ3ICovCisJMHg3QjU4LDB4N0I1QSwweDdCNDUsMHg3Qjc1LDB4N0I0QywweDdCNUQsMHg3QjYwLDB4N0I2RSwvKiAweEQ4LTB4REYgKi8KKwkweDdCN0IsMHg3QjYyLDB4N0I3MiwweDdCNzEsMHg3QjkwLDB4N0JBNiwweDdCQTcsMHg3QkI4LC8qIDB4RTAtMHhFNyAqLworCTB4N0JBQywweDdCOUQsMHg3QkE4LDB4N0I4NSwweDdCQUEsMHg3QjlDLDB4N0JBMiwweDdCQUIsLyogMHhFOC0weEVGICovCisJMHg3QkI0LDB4N0JEMSwweDdCQzEsMHg3QkNDLDB4N0JERCwweDdCREEsMHg3QkU1LDB4N0JFNiwvKiAweEYwLTB4RjcgKi8KKwkweDdCRUEsMHg3QzBDLDB4N0JGRSwweDdCRkMsMHg3QzBGLDB4N0MxNiwweDdDMEIsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0Y0WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OUIwNywweDlCMDksMHg5QjBBLDB4OUIwQiwweDlCMEMsMHg5QjBELDB4OUIwRSwweDlCMTAsLyogMHg0MC0weDQ3ICovCisJMHg5QjExLDB4OUIxMiwweDlCMTQsMHg5QjE1LDB4OUIxNiwweDlCMTcsMHg5QjE4LDB4OUIxOSwvKiAweDQ4LTB4NEYgKi8KKwkweDlCMUEsMHg5QjFCLDB4OUIxQywweDlCMUQsMHg5QjFFLDB4OUIyMCwweDlCMjEsMHg5QjIyLC8qIDB4NTAtMHg1NyAqLworCTB4OUIyNCwweDlCMjUsMHg5QjI2LDB4OUIyNywweDlCMjgsMHg5QjI5LDB4OUIyQSwweDlCMkIsLyogMHg1OC0weDVGICovCisJMHg5QjJDLDB4OUIyRCwweDlCMkUsMHg5QjMwLDB4OUIzMSwweDlCMzMsMHg5QjM0LDB4OUIzNSwvKiAweDYwLTB4NjcgKi8KKwkweDlCMzYsMHg5QjM3LDB4OUIzOCwweDlCMzksMHg5QjNBLDB4OUIzRCwweDlCM0UsMHg5QjNGLC8qIDB4NjgtMHg2RiAqLworCTB4OUI0MCwweDlCNDYsMHg5QjRBLDB4OUI0QiwweDlCNEMsMHg5QjRFLDB4OUI1MCwweDlCNTIsLyogMHg3MC0weDc3ICovCisJMHg5QjUzLDB4OUI1NSwweDlCNTYsMHg5QjU3LDB4OUI1OCwweDlCNTksMHg5QjVBLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4OUI1QiwweDlCNUMsMHg5QjVELDB4OUI1RSwweDlCNUYsMHg5QjYwLDB4OUI2MSwweDlCNjIsLyogMHg4MC0weDg3ICovCisJMHg5QjYzLDB4OUI2NCwweDlCNjUsMHg5QjY2LDB4OUI2NywweDlCNjgsMHg5QjY5LDB4OUI2QSwvKiAweDg4LTB4OEYgKi8KKwkweDlCNkIsMHg5QjZDLDB4OUI2RCwweDlCNkUsMHg5QjZGLDB4OUI3MCwweDlCNzEsMHg5QjcyLC8qIDB4OTAtMHg5NyAqLworCTB4OUI3MywweDlCNzQsMHg5Qjc1LDB4OUI3NiwweDlCNzcsMHg5Qjc4LDB4OUI3OSwweDlCN0EsLyogMHg5OC0weDlGICovCisJMHg5QjdCLDB4N0MxRiwweDdDMkEsMHg3QzI2LDB4N0MzOCwweDdDNDEsMHg3QzQwLDB4ODFGRSwvKiAweEEwLTB4QTcgKi8KKwkweDgyMDEsMHg4MjAyLDB4ODIwNCwweDgxRUMsMHg4ODQ0LDB4ODIyMSwweDgyMjIsMHg4MjIzLC8qIDB4QTgtMHhBRiAqLworCTB4ODIyRCwweDgyMkYsMHg4MjI4LDB4ODIyQiwweDgyMzgsMHg4MjNCLDB4ODIzMywweDgyMzQsLyogMHhCMC0weEI3ICovCisJMHg4MjNFLDB4ODI0NCwweDgyNDksMHg4MjRCLDB4ODI0RiwweDgyNUEsMHg4MjVGLDB4ODI2OCwvKiAweEI4LTB4QkYgKi8KKwkweDg4N0UsMHg4ODg1LDB4ODg4OCwweDg4RDgsMHg4OERGLDB4ODk1RSwweDdGOUQsMHg3RjlGLC8qIDB4QzAtMHhDNyAqLworCTB4N0ZBNywweDdGQUYsMHg3RkIwLDB4N0ZCMiwweDdDN0MsMHg2NTQ5LDB4N0M5MSwweDdDOUQsLyogMHhDOC0weENGICovCisJMHg3QzlDLDB4N0M5RSwweDdDQTIsMHg3Q0IyLDB4N0NCQywweDdDQkQsMHg3Q0MxLDB4N0NDNywvKiAweEQwLTB4RDcgKi8KKwkweDdDQ0MsMHg3Q0NELDB4N0NDOCwweDdDQzUsMHg3Q0Q3LDB4N0NFOCwweDgyNkUsMHg2NkE4LC8qIDB4RDgtMHhERiAqLworCTB4N0ZCRiwweDdGQ0UsMHg3RkQ1LDB4N0ZFNSwweDdGRTEsMHg3RkU2LDB4N0ZFOSwweDdGRUUsLyogMHhFMC0weEU3ICovCisJMHg3RkYzLDB4N0NGOCwweDdENzcsMHg3REE2LDB4N0RBRSwweDdFNDcsMHg3RTlCLDB4OUVCOCwvKiAweEU4LTB4RUYgKi8KKwkweDlFQjQsMHg4RDczLDB4OEQ4NCwweDhEOTQsMHg4RDkxLDB4OERCMSwweDhENjcsMHg4RDZELC8qIDB4RjAtMHhGNyAqLworCTB4OEM0NywweDhDNDksMHg5MTRBLDB4OTE1MCwweDkxNEUsMHg5MTRGLDB4OTE2NCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRjVbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5QjdDLDB4OUI3RCwweDlCN0UsMHg5QjdGLDB4OUI4MCwweDlCODEsMHg5QjgyLDB4OUI4MywvKiAweDQwLTB4NDcgKi8KKwkweDlCODQsMHg5Qjg1LDB4OUI4NiwweDlCODcsMHg5Qjg4LDB4OUI4OSwweDlCOEEsMHg5QjhCLC8qIDB4NDgtMHg0RiAqLworCTB4OUI4QywweDlCOEQsMHg5QjhFLDB4OUI4RiwweDlCOTAsMHg5QjkxLDB4OUI5MiwweDlCOTMsLyogMHg1MC0weDU3ICovCisJMHg5Qjk0LDB4OUI5NSwweDlCOTYsMHg5Qjk3LDB4OUI5OCwweDlCOTksMHg5QjlBLDB4OUI5QiwvKiAweDU4LTB4NUYgKi8KKwkweDlCOUMsMHg5QjlELDB4OUI5RSwweDlCOUYsMHg5QkEwLDB4OUJBMSwweDlCQTIsMHg5QkEzLC8qIDB4NjAtMHg2NyAqLworCTB4OUJBNCwweDlCQTUsMHg5QkE2LDB4OUJBNywweDlCQTgsMHg5QkE5LDB4OUJBQSwweDlCQUIsLyogMHg2OC0weDZGICovCisJMHg5QkFDLDB4OUJBRCwweDlCQUUsMHg5QkFGLDB4OUJCMCwweDlCQjEsMHg5QkIyLDB4OUJCMywvKiAweDcwLTB4NzcgKi8KKwkweDlCQjQsMHg5QkI1LDB4OUJCNiwweDlCQjcsMHg5QkI4LDB4OUJCOSwweDlCQkEsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg5QkJCLDB4OUJCQywweDlCQkQsMHg5QkJFLDB4OUJCRiwweDlCQzAsMHg5QkMxLDB4OUJDMiwvKiAweDgwLTB4ODcgKi8KKwkweDlCQzMsMHg5QkM0LDB4OUJDNSwweDlCQzYsMHg5QkM3LDB4OUJDOCwweDlCQzksMHg5QkNBLC8qIDB4ODgtMHg4RiAqLworCTB4OUJDQiwweDlCQ0MsMHg5QkNELDB4OUJDRSwweDlCQ0YsMHg5QkQwLDB4OUJEMSwweDlCRDIsLyogMHg5MC0weDk3ICovCisJMHg5QkQzLDB4OUJENCwweDlCRDUsMHg5QkQ2LDB4OUJENywweDlCRDgsMHg5QkQ5LDB4OUJEQSwvKiAweDk4LTB4OUYgKi8KKwkweDlCREIsMHg5MTYyLDB4OTE2MSwweDkxNzAsMHg5MTY5LDB4OTE2RiwweDkxN0QsMHg5MTdFLC8qIDB4QTAtMHhBNyAqLworCTB4OTE3MiwweDkxNzQsMHg5MTc5LDB4OTE4QywweDkxODUsMHg5MTkwLDB4OTE4RCwweDkxOTEsLyogMHhBOC0weEFGICovCisJMHg5MUEyLDB4OTFBMywweDkxQUEsMHg5MUFELDB4OTFBRSwweDkxQUYsMHg5MUI1LDB4OTFCNCwvKiAweEIwLTB4QjcgKi8KKwkweDkxQkEsMHg4QzU1LDB4OUU3RSwweDhEQjgsMHg4REVCLDB4OEUwNSwweDhFNTksMHg4RTY5LC8qIDB4QjgtMHhCRiAqLworCTB4OERCNSwweDhEQkYsMHg4REJDLDB4OERCQSwweDhEQzQsMHg4REQ2LDB4OERENywweDhEREEsLyogMHhDMC0weEM3ICovCisJMHg4RERFLDB4OERDRSwweDhEQ0YsMHg4RERCLDB4OERDNiwweDhERUMsMHg4REY3LDB4OERGOCwvKiAweEM4LTB4Q0YgKi8KKwkweDhERTMsMHg4REY5LDB4OERGQiwweDhERTQsMHg4RTA5LDB4OERGRCwweDhFMTQsMHg4RTFELC8qIDB4RDAtMHhENyAqLworCTB4OEUxRiwweDhFMkMsMHg4RTJFLDB4OEUyMywweDhFMkYsMHg4RTNBLDB4OEU0MCwweDhFMzksLyogMHhEOC0weERGICovCisJMHg4RTM1LDB4OEUzRCwweDhFMzEsMHg4RTQ5LDB4OEU0MSwweDhFNDIsMHg4RTUxLDB4OEU1MiwvKiAweEUwLTB4RTcgKi8KKwkweDhFNEEsMHg4RTcwLDB4OEU3NiwweDhFN0MsMHg4RTZGLDB4OEU3NCwweDhFODUsMHg4RThGLC8qIDB4RTgtMHhFRiAqLworCTB4OEU5NCwweDhFOTAsMHg4RTlDLDB4OEU5RSwweDhDNzgsMHg4QzgyLDB4OEM4QSwweDhDODUsLyogMHhGMC0weEY3ICovCisJMHg4Qzk4LDB4OEM5NCwweDY1OUIsMHg4OUQ2LDB4ODlERSwweDg5REEsMHg4OURDLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9GNlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDlCREMsMHg5QkRELDB4OUJERSwweDlCREYsMHg5QkUwLDB4OUJFMSwweDlCRTIsMHg5QkUzLC8qIDB4NDAtMHg0NyAqLworCTB4OUJFNCwweDlCRTUsMHg5QkU2LDB4OUJFNywweDlCRTgsMHg5QkU5LDB4OUJFQSwweDlCRUIsLyogMHg0OC0weDRGICovCisJMHg5QkVDLDB4OUJFRCwweDlCRUUsMHg5QkVGLDB4OUJGMCwweDlCRjEsMHg5QkYyLDB4OUJGMywvKiAweDUwLTB4NTcgKi8KKwkweDlCRjQsMHg5QkY1LDB4OUJGNiwweDlCRjcsMHg5QkY4LDB4OUJGOSwweDlCRkEsMHg5QkZCLC8qIDB4NTgtMHg1RiAqLworCTB4OUJGQywweDlCRkQsMHg5QkZFLDB4OUJGRiwweDlDMDAsMHg5QzAxLDB4OUMwMiwweDlDMDMsLyogMHg2MC0weDY3ICovCisJMHg5QzA0LDB4OUMwNSwweDlDMDYsMHg5QzA3LDB4OUMwOCwweDlDMDksMHg5QzBBLDB4OUMwQiwvKiAweDY4LTB4NkYgKi8KKwkweDlDMEMsMHg5QzBELDB4OUMwRSwweDlDMEYsMHg5QzEwLDB4OUMxMSwweDlDMTIsMHg5QzEzLC8qIDB4NzAtMHg3NyAqLworCTB4OUMxNCwweDlDMTUsMHg5QzE2LDB4OUMxNywweDlDMTgsMHg5QzE5LDB4OUMxQSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDlDMUIsMHg5QzFDLDB4OUMxRCwweDlDMUUsMHg5QzFGLDB4OUMyMCwweDlDMjEsMHg5QzIyLC8qIDB4ODAtMHg4NyAqLworCTB4OUMyMywweDlDMjQsMHg5QzI1LDB4OUMyNiwweDlDMjcsMHg5QzI4LDB4OUMyOSwweDlDMkEsLyogMHg4OC0weDhGICovCisJMHg5QzJCLDB4OUMyQywweDlDMkQsMHg5QzJFLDB4OUMyRiwweDlDMzAsMHg5QzMxLDB4OUMzMiwvKiAweDkwLTB4OTcgKi8KKwkweDlDMzMsMHg5QzM0LDB4OUMzNSwweDlDMzYsMHg5QzM3LDB4OUMzOCwweDlDMzksMHg5QzNBLC8qIDB4OTgtMHg5RiAqLworCTB4OUMzQiwweDg5RTUsMHg4OUVCLDB4ODlFRiwweDhBM0UsMHg4QjI2LDB4OTc1MywweDk2RTksLyogMHhBMC0weEE3ICovCisJMHg5NkYzLDB4OTZFRiwweDk3MDYsMHg5NzAxLDB4OTcwOCwweDk3MEYsMHg5NzBFLDB4OTcyQSwvKiAweEE4LTB4QUYgKi8KKwkweDk3MkQsMHg5NzMwLDB4OTczRSwweDlGODAsMHg5RjgzLDB4OUY4NSwweDlGODYsMHg5Rjg3LC8qIDB4QjAtMHhCNyAqLworCTB4OUY4OCwweDlGODksMHg5RjhBLDB4OUY4QywweDlFRkUsMHg5RjBCLDB4OUYwRCwweDk2QjksLyogMHhCOC0weEJGICovCisJMHg5NkJDLDB4OTZCRCwweDk2Q0UsMHg5NkQyLDB4NzdCRiwweDk2RTAsMHg5MjhFLDB4OTJBRSwvKiAweEMwLTB4QzcgKi8KKwkweDkyQzgsMHg5MzNFLDB4OTM2QSwweDkzQ0EsMHg5MzhGLDB4OTQzRSwweDk0NkIsMHg5QzdGLC8qIDB4QzgtMHhDRiAqLworCTB4OUM4MiwweDlDODUsMHg5Qzg2LDB4OUM4NywweDlDODgsMHg3QTIzLDB4OUM4QiwweDlDOEUsLyogMHhEMC0weEQ3ICovCisJMHg5QzkwLDB4OUM5MSwweDlDOTIsMHg5Qzk0LDB4OUM5NSwweDlDOUEsMHg5QzlCLDB4OUM5RSwvKiAweEQ4LTB4REYgKi8KKwkweDlDOUYsMHg5Q0EwLDB4OUNBMSwweDlDQTIsMHg5Q0EzLDB4OUNBNSwweDlDQTYsMHg5Q0E3LC8qIDB4RTAtMHhFNyAqLworCTB4OUNBOCwweDlDQTksMHg5Q0FCLDB4OUNBRCwweDlDQUUsMHg5Q0IwLDB4OUNCMSwweDlDQjIsLyogMHhFOC0weEVGICovCisJMHg5Q0IzLDB4OUNCNCwweDlDQjUsMHg5Q0I2LDB4OUNCNywweDlDQkEsMHg5Q0JCLDB4OUNCQywvKiAweEYwLTB4RjcgKi8KKwkweDlDQkQsMHg5Q0M0LDB4OUNDNSwweDlDQzYsMHg5Q0M3LDB4OUNDQSwweDlDQ0IsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0Y3WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OUMzQywweDlDM0QsMHg5QzNFLDB4OUMzRiwweDlDNDAsMHg5QzQxLDB4OUM0MiwweDlDNDMsLyogMHg0MC0weDQ3ICovCisJMHg5QzQ0LDB4OUM0NSwweDlDNDYsMHg5QzQ3LDB4OUM0OCwweDlDNDksMHg5QzRBLDB4OUM0QiwvKiAweDQ4LTB4NEYgKi8KKwkweDlDNEMsMHg5QzRELDB4OUM0RSwweDlDNEYsMHg5QzUwLDB4OUM1MSwweDlDNTIsMHg5QzUzLC8qIDB4NTAtMHg1NyAqLworCTB4OUM1NCwweDlDNTUsMHg5QzU2LDB4OUM1NywweDlDNTgsMHg5QzU5LDB4OUM1QSwweDlDNUIsLyogMHg1OC0weDVGICovCisJMHg5QzVDLDB4OUM1RCwweDlDNUUsMHg5QzVGLDB4OUM2MCwweDlDNjEsMHg5QzYyLDB4OUM2MywvKiAweDYwLTB4NjcgKi8KKwkweDlDNjQsMHg5QzY1LDB4OUM2NiwweDlDNjcsMHg5QzY4LDB4OUM2OSwweDlDNkEsMHg5QzZCLC8qIDB4NjgtMHg2RiAqLworCTB4OUM2QywweDlDNkQsMHg5QzZFLDB4OUM2RiwweDlDNzAsMHg5QzcxLDB4OUM3MiwweDlDNzMsLyogMHg3MC0weDc3ICovCisJMHg5Qzc0LDB4OUM3NSwweDlDNzYsMHg5Qzc3LDB4OUM3OCwweDlDNzksMHg5QzdBLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4OUM3QiwweDlDN0QsMHg5QzdFLDB4OUM4MCwweDlDODMsMHg5Qzg0LDB4OUM4OSwweDlDOEEsLyogMHg4MC0weDg3ICovCisJMHg5QzhDLDB4OUM4RiwweDlDOTMsMHg5Qzk2LDB4OUM5NywweDlDOTgsMHg5Qzk5LDB4OUM5RCwvKiAweDg4LTB4OEYgKi8KKwkweDlDQUEsMHg5Q0FDLDB4OUNBRiwweDlDQjksMHg5Q0JFLDB4OUNCRiwweDlDQzAsMHg5Q0MxLC8qIDB4OTAtMHg5NyAqLworCTB4OUNDMiwweDlDQzgsMHg5Q0M5LDB4OUNEMSwweDlDRDIsMHg5Q0RBLDB4OUNEQiwweDlDRTAsLyogMHg5OC0weDlGICovCisJMHg5Q0UxLDB4OUNDQywweDlDQ0QsMHg5Q0NFLDB4OUNDRiwweDlDRDAsMHg5Q0QzLDB4OUNENCwvKiAweEEwLTB4QTcgKi8KKwkweDlDRDUsMHg5Q0Q3LDB4OUNEOCwweDlDRDksMHg5Q0RDLDB4OUNERCwweDlDREYsMHg5Q0UyLC8qIDB4QTgtMHhBRiAqLworCTB4OTc3QywweDk3ODUsMHg5NzkxLDB4OTc5MiwweDk3OTQsMHg5N0FGLDB4OTdBQiwweDk3QTMsLyogMHhCMC0weEI3ICovCisJMHg5N0IyLDB4OTdCNCwweDlBQjEsMHg5QUIwLDB4OUFCNywweDlFNTgsMHg5QUI2LDB4OUFCQSwvKiAweEI4LTB4QkYgKi8KKwkweDlBQkMsMHg5QUMxLDB4OUFDMCwweDlBQzUsMHg5QUMyLDB4OUFDQiwweDlBQ0MsMHg5QUQxLC8qIDB4QzAtMHhDNyAqLworCTB4OUI0NSwweDlCNDMsMHg5QjQ3LDB4OUI0OSwweDlCNDgsMHg5QjRELDB4OUI1MSwweDk4RTgsLyogMHhDOC0weENGICovCisJMHg5OTBELDB4OTkyRSwweDk5NTUsMHg5OTU0LDB4OUFERiwweDlBRTEsMHg5QUU2LDB4OUFFRiwvKiAweEQwLTB4RDcgKi8KKwkweDlBRUIsMHg5QUZCLDB4OUFFRCwweDlBRjksMHg5QjA4LDB4OUIwRiwweDlCMTMsMHg5QjFGLC8qIDB4RDgtMHhERiAqLworCTB4OUIyMywweDlFQkQsMHg5RUJFLDB4N0UzQiwweDlFODIsMHg5RTg3LDB4OUU4OCwweDlFOEIsLyogMHhFMC0weEU3ICovCisJMHg5RTkyLDB4OTNENiwweDlFOUQsMHg5RTlGLDB4OUVEQiwweDlFREMsMHg5RURELDB4OUVFMCwvKiAweEU4LTB4RUYgKi8KKwkweDlFREYsMHg5RUUyLDB4OUVFOSwweDlFRTcsMHg5RUU1LDB4OUVFQSwweDlFRUYsMHg5RjIyLC8qIDB4RjAtMHhGNyAqLworCTB4OUYyQywweDlGMkYsMHg5RjM5LDB4OUYzNywweDlGM0QsMHg5RjNFLDB4OUY0NCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRjhbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5Q0UzLDB4OUNFNCwweDlDRTUsMHg5Q0U2LDB4OUNFNywweDlDRTgsMHg5Q0U5LDB4OUNFQSwvKiAweDQwLTB4NDcgKi8KKwkweDlDRUIsMHg5Q0VDLDB4OUNFRCwweDlDRUUsMHg5Q0VGLDB4OUNGMCwweDlDRjEsMHg5Q0YyLC8qIDB4NDgtMHg0RiAqLworCTB4OUNGMywweDlDRjQsMHg5Q0Y1LDB4OUNGNiwweDlDRjcsMHg5Q0Y4LDB4OUNGOSwweDlDRkEsLyogMHg1MC0weDU3ICovCisJMHg5Q0ZCLDB4OUNGQywweDlDRkQsMHg5Q0ZFLDB4OUNGRiwweDlEMDAsMHg5RDAxLDB4OUQwMiwvKiAweDU4LTB4NUYgKi8KKwkweDlEMDMsMHg5RDA0LDB4OUQwNSwweDlEMDYsMHg5RDA3LDB4OUQwOCwweDlEMDksMHg5RDBBLC8qIDB4NjAtMHg2NyAqLworCTB4OUQwQiwweDlEMEMsMHg5RDBELDB4OUQwRSwweDlEMEYsMHg5RDEwLDB4OUQxMSwweDlEMTIsLyogMHg2OC0weDZGICovCisJMHg5RDEzLDB4OUQxNCwweDlEMTUsMHg5RDE2LDB4OUQxNywweDlEMTgsMHg5RDE5LDB4OUQxQSwvKiAweDcwLTB4NzcgKi8KKwkweDlEMUIsMHg5RDFDLDB4OUQxRCwweDlEMUUsMHg5RDFGLDB4OUQyMCwweDlEMjEsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg5RDIyLDB4OUQyMywweDlEMjQsMHg5RDI1LDB4OUQyNiwweDlEMjcsMHg5RDI4LDB4OUQyOSwvKiAweDgwLTB4ODcgKi8KKwkweDlEMkEsMHg5RDJCLDB4OUQyQywweDlEMkQsMHg5RDJFLDB4OUQyRiwweDlEMzAsMHg5RDMxLC8qIDB4ODgtMHg4RiAqLworCTB4OUQzMiwweDlEMzMsMHg5RDM0LDB4OUQzNSwweDlEMzYsMHg5RDM3LDB4OUQzOCwweDlEMzksLyogMHg5MC0weDk3ICovCisJMHg5RDNBLDB4OUQzQiwweDlEM0MsMHg5RDNELDB4OUQzRSwweDlEM0YsMHg5RDQwLDB4OUQ0MSwvKiAweDk4LTB4OUYgKi8KKwkweDlENDIsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4QTAtMHhBNyAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0Y5WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OUQ0MywweDlENDQsMHg5RDQ1LDB4OUQ0NiwweDlENDcsMHg5RDQ4LDB4OUQ0OSwweDlENEEsLyogMHg0MC0weDQ3ICovCisJMHg5RDRCLDB4OUQ0QywweDlENEQsMHg5RDRFLDB4OUQ0RiwweDlENTAsMHg5RDUxLDB4OUQ1MiwvKiAweDQ4LTB4NEYgKi8KKwkweDlENTMsMHg5RDU0LDB4OUQ1NSwweDlENTYsMHg5RDU3LDB4OUQ1OCwweDlENTksMHg5RDVBLC8qIDB4NTAtMHg1NyAqLworCTB4OUQ1QiwweDlENUMsMHg5RDVELDB4OUQ1RSwweDlENUYsMHg5RDYwLDB4OUQ2MSwweDlENjIsLyogMHg1OC0weDVGICovCisJMHg5RDYzLDB4OUQ2NCwweDlENjUsMHg5RDY2LDB4OUQ2NywweDlENjgsMHg5RDY5LDB4OUQ2QSwvKiAweDYwLTB4NjcgKi8KKwkweDlENkIsMHg5RDZDLDB4OUQ2RCwweDlENkUsMHg5RDZGLDB4OUQ3MCwweDlENzEsMHg5RDcyLC8qIDB4NjgtMHg2RiAqLworCTB4OUQ3MywweDlENzQsMHg5RDc1LDB4OUQ3NiwweDlENzcsMHg5RDc4LDB4OUQ3OSwweDlEN0EsLyogMHg3MC0weDc3ICovCisJMHg5RDdCLDB4OUQ3QywweDlEN0QsMHg5RDdFLDB4OUQ3RiwweDlEODAsMHg5RDgxLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4OUQ4MiwweDlEODMsMHg5RDg0LDB4OUQ4NSwweDlEODYsMHg5RDg3LDB4OUQ4OCwweDlEODksLyogMHg4MC0weDg3ICovCisJMHg5RDhBLDB4OUQ4QiwweDlEOEMsMHg5RDhELDB4OUQ4RSwweDlEOEYsMHg5RDkwLDB4OUQ5MSwvKiAweDg4LTB4OEYgKi8KKwkweDlEOTIsMHg5RDkzLDB4OUQ5NCwweDlEOTUsMHg5RDk2LDB4OUQ5NywweDlEOTgsMHg5RDk5LC8qIDB4OTAtMHg5NyAqLworCTB4OUQ5QSwweDlEOUIsMHg5RDlDLDB4OUQ5RCwweDlEOUUsMHg5RDlGLDB4OURBMCwweDlEQTEsLyogMHg5OC0weDlGICovCisJMHg5REEyLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEEwLTB4QTcgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9GQVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDlEQTMsMHg5REE0LDB4OURBNSwweDlEQTYsMHg5REE3LDB4OURBOCwweDlEQTksMHg5REFBLC8qIDB4NDAtMHg0NyAqLworCTB4OURBQiwweDlEQUMsMHg5REFELDB4OURBRSwweDlEQUYsMHg5REIwLDB4OURCMSwweDlEQjIsLyogMHg0OC0weDRGICovCisJMHg5REIzLDB4OURCNCwweDlEQjUsMHg5REI2LDB4OURCNywweDlEQjgsMHg5REI5LDB4OURCQSwvKiAweDUwLTB4NTcgKi8KKwkweDlEQkIsMHg5REJDLDB4OURCRCwweDlEQkUsMHg5REJGLDB4OURDMCwweDlEQzEsMHg5REMyLC8qIDB4NTgtMHg1RiAqLworCTB4OURDMywweDlEQzQsMHg5REM1LDB4OURDNiwweDlEQzcsMHg5REM4LDB4OURDOSwweDlEQ0EsLyogMHg2MC0weDY3ICovCisJMHg5RENCLDB4OURDQywweDlEQ0QsMHg5RENFLDB4OURDRiwweDlERDAsMHg5REQxLDB4OUREMiwvKiAweDY4LTB4NkYgKi8KKwkweDlERDMsMHg5REQ0LDB4OURENSwweDlERDYsMHg5REQ3LDB4OUREOCwweDlERDksMHg5RERBLC8qIDB4NzAtMHg3NyAqLworCTB4OUREQiwweDlEREMsMHg5RERELDB4OURERSwweDlEREYsMHg5REUwLDB4OURFMSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDlERTIsMHg5REUzLDB4OURFNCwweDlERTUsMHg5REU2LDB4OURFNywweDlERTgsMHg5REU5LC8qIDB4ODAtMHg4NyAqLworCTB4OURFQSwweDlERUIsMHg5REVDLDB4OURFRCwweDlERUUsMHg5REVGLDB4OURGMCwweDlERjEsLyogMHg4OC0weDhGICovCisJMHg5REYyLDB4OURGMywweDlERjQsMHg5REY1LDB4OURGNiwweDlERjcsMHg5REY4LDB4OURGOSwvKiAweDkwLTB4OTcgKi8KKwkweDlERkEsMHg5REZCLDB4OURGQywweDlERkQsMHg5REZFLDB4OURGRiwweDlFMDAsMHg5RTAxLC8qIDB4OTgtMHg5RiAqLworCTB4OUUwMiwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhBMC0weEE3ICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRkJbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5RTAzLDB4OUUwNCwweDlFMDUsMHg5RTA2LDB4OUUwNywweDlFMDgsMHg5RTA5LDB4OUUwQSwvKiAweDQwLTB4NDcgKi8KKwkweDlFMEIsMHg5RTBDLDB4OUUwRCwweDlFMEUsMHg5RTBGLDB4OUUxMCwweDlFMTEsMHg5RTEyLC8qIDB4NDgtMHg0RiAqLworCTB4OUUxMywweDlFMTQsMHg5RTE1LDB4OUUxNiwweDlFMTcsMHg5RTE4LDB4OUUxOSwweDlFMUEsLyogMHg1MC0weDU3ICovCisJMHg5RTFCLDB4OUUxQywweDlFMUQsMHg5RTFFLDB4OUUyNCwweDlFMjcsMHg5RTJFLDB4OUUzMCwvKiAweDU4LTB4NUYgKi8KKwkweDlFMzQsMHg5RTNCLDB4OUUzQywweDlFNDAsMHg5RTRELDB4OUU1MCwweDlFNTIsMHg5RTUzLC8qIDB4NjAtMHg2NyAqLworCTB4OUU1NCwweDlFNTYsMHg5RTU5LDB4OUU1RCwweDlFNUYsMHg5RTYwLDB4OUU2MSwweDlFNjIsLyogMHg2OC0weDZGICovCisJMHg5RTY1LDB4OUU2RSwweDlFNkYsMHg5RTcyLDB4OUU3NCwweDlFNzUsMHg5RTc2LDB4OUU3NywvKiAweDcwLTB4NzcgKi8KKwkweDlFNzgsMHg5RTc5LDB4OUU3QSwweDlFN0IsMHg5RTdDLDB4OUU3RCwweDlFODAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHg5RTgxLDB4OUU4MywweDlFODQsMHg5RTg1LDB4OUU4NiwweDlFODksMHg5RThBLDB4OUU4QywvKiAweDgwLTB4ODcgKi8KKwkweDlFOEQsMHg5RThFLDB4OUU4RiwweDlFOTAsMHg5RTkxLDB4OUU5NCwweDlFOTUsMHg5RTk2LC8qIDB4ODgtMHg4RiAqLworCTB4OUU5NywweDlFOTgsMHg5RTk5LDB4OUU5QSwweDlFOUIsMHg5RTlDLDB4OUU5RSwweDlFQTAsLyogMHg5MC0weDk3ICovCisJMHg5RUExLDB4OUVBMiwweDlFQTMsMHg5RUE0LDB4OUVBNSwweDlFQTcsMHg5RUE4LDB4OUVBOSwvKiAweDk4LTB4OUYgKi8KKwkweDlFQUEsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4QTAtMHhBNyAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0ZDWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OUVBQiwweDlFQUMsMHg5RUFELDB4OUVBRSwweDlFQUYsMHg5RUIwLDB4OUVCMSwweDlFQjIsLyogMHg0MC0weDQ3ICovCisJMHg5RUIzLDB4OUVCNSwweDlFQjYsMHg5RUI3LDB4OUVCOSwweDlFQkEsMHg5RUJDLDB4OUVCRiwvKiAweDQ4LTB4NEYgKi8KKwkweDlFQzAsMHg5RUMxLDB4OUVDMiwweDlFQzMsMHg5RUM1LDB4OUVDNiwweDlFQzcsMHg5RUM4LC8qIDB4NTAtMHg1NyAqLworCTB4OUVDQSwweDlFQ0IsMHg5RUNDLDB4OUVEMCwweDlFRDIsMHg5RUQzLDB4OUVENSwweDlFRDYsLyogMHg1OC0weDVGICovCisJMHg5RUQ3LDB4OUVEOSwweDlFREEsMHg5RURFLDB4OUVFMSwweDlFRTMsMHg5RUU0LDB4OUVFNiwvKiAweDYwLTB4NjcgKi8KKwkweDlFRTgsMHg5RUVCLDB4OUVFQywweDlFRUQsMHg5RUVFLDB4OUVGMCwweDlFRjEsMHg5RUYyLC8qIDB4NjgtMHg2RiAqLworCTB4OUVGMywweDlFRjQsMHg5RUY1LDB4OUVGNiwweDlFRjcsMHg5RUY4LDB4OUVGQSwweDlFRkQsLyogMHg3MC0weDc3ICovCisJMHg5RUZGLDB4OUYwMCwweDlGMDEsMHg5RjAyLDB4OUYwMywweDlGMDQsMHg5RjA1LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4OUYwNiwweDlGMDcsMHg5RjA4LDB4OUYwOSwweDlGMEEsMHg5RjBDLDB4OUYwRiwweDlGMTEsLyogMHg4MC0weDg3ICovCisJMHg5RjEyLDB4OUYxNCwweDlGMTUsMHg5RjE2LDB4OUYxOCwweDlGMUEsMHg5RjFCLDB4OUYxQywvKiAweDg4LTB4OEYgKi8KKwkweDlGMUQsMHg5RjFFLDB4OUYxRiwweDlGMjEsMHg5RjIzLDB4OUYyNCwweDlGMjUsMHg5RjI2LC8qIDB4OTAtMHg5NyAqLworCTB4OUYyNywweDlGMjgsMHg5RjI5LDB4OUYyQSwweDlGMkIsMHg5RjJELDB4OUYyRSwweDlGMzAsLyogMHg5OC0weDlGICovCisJMHg5RjMxLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEEwLTB4QTcgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9GRFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDlGMzIsMHg5RjMzLDB4OUYzNCwweDlGMzUsMHg5RjM2LDB4OUYzOCwweDlGM0EsMHg5RjNDLC8qIDB4NDAtMHg0NyAqLworCTB4OUYzRiwweDlGNDAsMHg5RjQxLDB4OUY0MiwweDlGNDMsMHg5RjQ1LDB4OUY0NiwweDlGNDcsLyogMHg0OC0weDRGICovCisJMHg5RjQ4LDB4OUY0OSwweDlGNEEsMHg5RjRCLDB4OUY0QywweDlGNEQsMHg5RjRFLDB4OUY0RiwvKiAweDUwLTB4NTcgKi8KKwkweDlGNTIsMHg5RjUzLDB4OUY1NCwweDlGNTUsMHg5RjU2LDB4OUY1NywweDlGNTgsMHg5RjU5LC8qIDB4NTgtMHg1RiAqLworCTB4OUY1QSwweDlGNUIsMHg5RjVDLDB4OUY1RCwweDlGNUUsMHg5RjVGLDB4OUY2MCwweDlGNjEsLyogMHg2MC0weDY3ICovCisJMHg5RjYyLDB4OUY2MywweDlGNjQsMHg5RjY1LDB4OUY2NiwweDlGNjcsMHg5RjY4LDB4OUY2OSwvKiAweDY4LTB4NkYgKi8KKwkweDlGNkEsMHg5RjZCLDB4OUY2QywweDlGNkQsMHg5RjZFLDB4OUY2RiwweDlGNzAsMHg5RjcxLC8qIDB4NzAtMHg3NyAqLworCTB4OUY3MiwweDlGNzMsMHg5Rjc0LDB4OUY3NSwweDlGNzYsMHg5Rjc3LDB4OUY3OCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDlGNzksMHg5RjdBLDB4OUY3QiwweDlGN0MsMHg5RjdELDB4OUY3RSwweDlGODEsMHg5RjgyLC8qIDB4ODAtMHg4NyAqLworCTB4OUY4RCwweDlGOEUsMHg5RjhGLDB4OUY5MCwweDlGOTEsMHg5RjkyLDB4OUY5MywweDlGOTQsLyogMHg4OC0weDhGICovCisJMHg5Rjk1LDB4OUY5NiwweDlGOTcsMHg5Rjk4LDB4OUY5QywweDlGOUQsMHg5RjlFLDB4OUZBMSwvKiAweDkwLTB4OTcgKi8KKwkweDlGQTIsMHg5RkEzLDB4OUZBNCwweDlGQTUsMHhGOTJDLDB4Rjk3OSwweEY5OTUsMHhGOUU3LC8qIDB4OTgtMHg5RiAqLworCTB4RjlGMSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhBMC0weEE3ICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRkVbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHhGQTBDLDB4RkEwRCwweEZBMEUsMHhGQTBGLDB4RkExMSwweEZBMTMsMHhGQTE0LDB4RkExOCwvKiAweDQwLTB4NDcgKi8KKwkweEZBMUYsMHhGQTIwLDB4RkEyMSwweEZBMjMsMHhGQTI0LDB4RkEyNywweEZBMjgsMHhGQTI5LC8qIDB4NDgtMHg0RiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgKnBhZ2VfY2hhcnNldDJ1bmlbMjU2XSA9IHsKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBjMnVfODEsIGMydV84MiwgYzJ1XzgzLCBjMnVfODQsIGMydV84NSwgYzJ1Xzg2LCBjMnVfODcsIAorCWMydV84OCwgYzJ1Xzg5LCBjMnVfOEEsIGMydV84QiwgYzJ1XzhDLCBjMnVfOEQsIGMydV84RSwgYzJ1XzhGLCAKKwljMnVfOTAsIGMydV85MSwgYzJ1XzkyLCBjMnVfOTMsIGMydV85NCwgYzJ1Xzk1LCBjMnVfOTYsIGMydV85NywgCisJYzJ1Xzk4LCBjMnVfOTksIGMydV85QSwgYzJ1XzlCLCBjMnVfOUMsIGMydV85RCwgYzJ1XzlFLCBjMnVfOUYsIAorCWMydV9BMCwgYzJ1X0ExLCBjMnVfQTIsIGMydV9BMywgYzJ1X0E0LCBjMnVfQTUsIGMydV9BNiwgYzJ1X0E3LCAKKwljMnVfQTgsIGMydV9BOSwgYzJ1X0FBLCBjMnVfQUIsIGMydV9BQywgYzJ1X0FELCBjMnVfQUUsIGMydV9BRiwgCisJYzJ1X0IwLCBjMnVfQjEsIGMydV9CMiwgYzJ1X0IzLCBjMnVfQjQsIGMydV9CNSwgYzJ1X0I2LCBjMnVfQjcsIAorCWMydV9COCwgYzJ1X0I5LCBjMnVfQkEsIGMydV9CQiwgYzJ1X0JDLCBjMnVfQkQsIGMydV9CRSwgYzJ1X0JGLCAKKwljMnVfQzAsIGMydV9DMSwgYzJ1X0MyLCBjMnVfQzMsIGMydV9DNCwgYzJ1X0M1LCBjMnVfQzYsIGMydV9DNywgCisJYzJ1X0M4LCBjMnVfQzksIGMydV9DQSwgYzJ1X0NCLCBjMnVfQ0MsIGMydV9DRCwgYzJ1X0NFLCBjMnVfQ0YsIAorCWMydV9EMCwgYzJ1X0QxLCBjMnVfRDIsIGMydV9EMywgYzJ1X0Q0LCBjMnVfRDUsIGMydV9ENiwgYzJ1X0Q3LCAKKwljMnVfRDgsIGMydV9EOSwgYzJ1X0RBLCBjMnVfREIsIGMydV9EQywgYzJ1X0RELCBjMnVfREUsIGMydV9ERiwgCisJYzJ1X0UwLCBjMnVfRTEsIGMydV9FMiwgYzJ1X0UzLCBjMnVfRTQsIGMydV9FNSwgYzJ1X0U2LCBjMnVfRTcsIAorCWMydV9FOCwgYzJ1X0U5LCBjMnVfRUEsIGMydV9FQiwgYzJ1X0VDLCBjMnVfRUQsIGMydV9FRSwgYzJ1X0VGLCAKKwljMnVfRjAsIGMydV9GMSwgYzJ1X0YyLCBjMnVfRjMsIGMydV9GNCwgYzJ1X0Y1LCBjMnVfRjYsIGMydV9GNywgCisJYzJ1X0Y4LCBjMnVfRjksIGMydV9GQSwgYzJ1X0ZCLCBjMnVfRkMsIGMydV9GRCwgYzJ1X0ZFLCBOVUxMLCAgIAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzAxWzUxMl0gPSB7CisJMHhBOCwgMHhBMSwgMHhBOCwgMHhBMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBOCwgMHhBNSwgMHhBOCwgMHhBNSwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBOCwgMHhBNywgMHhBOCwgMHhBNywgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBOCwgMHhBOSwgMHhBOCwgMHhBOSwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHhBOCwgMHhCRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHhBOCwgMHhCRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHhBOCwgMHhBRCwgMHhBOCwgMHhBRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBOCwgMHhCMSwgMHhBOCwgMHhCMSwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHhBMSwgMHhDRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHhBOCwgMHhBMywgMHhBOCwgMHhBMywgMHhBOCwgMHhBQiwgLyogMHhDQy0weENGICovCisJMHhBOCwgMHhBQiwgMHhBOCwgMHhBRiwgMHhBOCwgMHhBRiwgMHhBOCwgMHhCMywgLyogMHhEMC0weEQzICovCisJMHhBOCwgMHhCMywgMHhBOCwgMHhCNSwgMHhBOCwgMHhCNSwgMHhBOCwgMHhCNiwgLyogMHhENC0weEQ3ICovCisJMHhBOCwgMHhCNiwgMHhBOCwgMHhCNywgMHhBOCwgMHhCNywgMHhBOCwgMHhCOCwgLyogMHhEOC0weERCICovCisJMHhBOCwgMHhCOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMDJbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweEE4LCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweEE4LCAweEMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEExLCAweEE2LCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweEExLCAweEE1LCAweEE4LCAweDQwLCAweEE4LCAweDQxLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweEE4LCAweDQyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18wM1s1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4QTYsIDB4QTEsIDB4QTYsIDB4QTIsIDB4QTYsIDB4QTMsIC8qIDB4OTAtMHg5MyAqLworCTB4QTYsIDB4QTQsIDB4QTYsIDB4QTUsIDB4QTYsIDB4QTYsIDB4QTYsIDB4QTcsIC8qIDB4OTQtMHg5NyAqLworCTB4QTYsIDB4QTgsIDB4QTYsIDB4QTksIDB4QTYsIDB4QUEsIDB4QTYsIDB4QUIsIC8qIDB4OTgtMHg5QiAqLworCTB4QTYsIDB4QUMsIDB4QTYsIDB4QUQsIDB4QTYsIDB4QUUsIDB4QTYsIDB4QUYsIC8qIDB4OUMtMHg5RiAqLworCTB4QTYsIDB4QjAsIDB4QTYsIDB4QjEsIDB4MDAsIDB4MDAsIDB4QTYsIDB4QjIsIC8qIDB4QTAtMHhBMyAqLworCTB4QTYsIDB4QjMsIDB4QTYsIDB4QjQsIDB4QTYsIDB4QjUsIDB4QTYsIDB4QjYsIC8qIDB4QTQtMHhBNyAqLworCTB4QTYsIDB4QjcsIDB4QTYsIDB4QjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4QTYsIDB4QzEsIDB4QTYsIDB4QzIsIDB4QTYsIDB4QzMsIC8qIDB4QjAtMHhCMyAqLworCTB4QTYsIDB4QzQsIDB4QTYsIDB4QzUsIDB4QTYsIDB4QzYsIDB4QTYsIDB4QzcsIC8qIDB4QjQtMHhCNyAqLworCTB4QTYsIDB4QzgsIDB4QTYsIDB4QzksIDB4QTYsIDB4Q0EsIDB4QTYsIDB4Q0IsIC8qIDB4QjgtMHhCQiAqLworCTB4QTYsIDB4Q0MsIDB4QTYsIDB4Q0QsIDB4QTYsIDB4Q0UsIDB4QTYsIDB4Q0YsIC8qIDB4QkMtMHhCRiAqLworCTB4QTYsIDB4RDAsIDB4QTYsIDB4RDEsIDB4MDAsIDB4MDAsIDB4QTYsIDB4RDIsIC8qIDB4QzAtMHhDMyAqLworCTB4QTYsIDB4RDMsIDB4QTYsIDB4RDQsIDB4QTYsIDB4RDUsIDB4QTYsIDB4RDYsIC8qIDB4QzQtMHhDNyAqLworCTB4QTYsIDB4RDcsIDB4QTYsIDB4RDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzA0WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHhBNywgMHhBNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHhBNywgMHhBMSwgMHhBNywgMHhBMiwgMHhBNywgMHhBMywgMHhBNywgMHhBNCwgLyogMHgxMC0weDEzICovCisJMHhBNywgMHhBNSwgMHhBNywgMHhBNiwgMHhBNywgMHhBOCwgMHhBNywgMHhBOSwgLyogMHgxNC0weDE3ICovCisJMHhBNywgMHhBQSwgMHhBNywgMHhBQiwgMHhBNywgMHhBQywgMHhBNywgMHhBRCwgLyogMHgxOC0weDFCICovCisJMHhBNywgMHhBRSwgMHhBNywgMHhBRiwgMHhBNywgMHhCMCwgMHhBNywgMHhCMSwgLyogMHgxQy0weDFGICovCisJMHhBNywgMHhCMiwgMHhBNywgMHhCMywgMHhBNywgMHhCNCwgMHhBNywgMHhCNSwgLyogMHgyMC0weDIzICovCisJMHhBNywgMHhCNiwgMHhBNywgMHhCNywgMHhBNywgMHhCOCwgMHhBNywgMHhCOSwgLyogMHgyNC0weDI3ICovCisJMHhBNywgMHhCQSwgMHhBNywgMHhCQiwgMHhBNywgMHhCQywgMHhBNywgMHhCRCwgLyogMHgyOC0weDJCICovCisJMHhBNywgMHhCRSwgMHhBNywgMHhCRiwgMHhBNywgMHhDMCwgMHhBNywgMHhDMSwgLyogMHgyQy0weDJGICovCisJMHhBNywgMHhEMSwgMHhBNywgMHhEMiwgMHhBNywgMHhEMywgMHhBNywgMHhENCwgLyogMHgzMC0weDMzICovCisJMHhBNywgMHhENSwgMHhBNywgMHhENiwgMHhBNywgMHhEOCwgMHhBNywgMHhEOSwgLyogMHgzNC0weDM3ICovCisJMHhBNywgMHhEQSwgMHhBNywgMHhEQiwgMHhBNywgMHhEQywgMHhBNywgMHhERCwgLyogMHgzOC0weDNCICovCisJMHhBNywgMHhERSwgMHhBNywgMHhERiwgMHhBNywgMHhFMCwgMHhBNywgMHhFMSwgLyogMHgzQy0weDNGICovCisJMHhBNywgMHhFMiwgMHhBNywgMHhFMywgMHhBNywgMHhFNCwgMHhBNywgMHhFNSwgLyogMHg0MC0weDQzICovCisJMHhBNywgMHhFNiwgMHhBNywgMHhFNywgMHhBNywgMHhFOCwgMHhBNywgMHhFOSwgLyogMHg0NC0weDQ3ICovCisJMHhBNywgMHhFQSwgMHhBNywgMHhFQiwgMHhBNywgMHhFQywgMHhBNywgMHhFRCwgLyogMHg0OC0weDRCICovCisJMHhBNywgMHhFRSwgMHhBNywgMHhFRiwgMHhBNywgMHhGMCwgMHhBNywgMHhGMSwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHhBNywgMHhENywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMjBbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweEE5LCAweDVDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE4LCAweDQzLCAvKiAweDEwLTB4MTMgKi8KKwkweEExLCAweEFBLCAweEE4LCAweDQ0LCAweEExLCAweEFDLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweEExLCAweEFFLCAweEExLCAweEFGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweEExLCAweEIwLCAweEExLCAweEIxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweEE4LCAweDQ1LCAweEExLCAweEFELCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweEExLCAweEVCLCAweDAwLCAweDAwLCAweEExLCAweEU0LCAweEExLCAweEU1LCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweEE4LCAweDQ2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEExLCAweEY5LCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEEzLCAweEZFLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18yMVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4RTYsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4QTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4QTgsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4RUQsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4QTksIDB4NTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4QTIsIDB4RjEsIDB4QTIsIDB4RjIsIDB4QTIsIDB4RjMsIDB4QTIsIDB4RjQsIC8qIDB4NjAtMHg2MyAqLworCTB4QTIsIDB4RjUsIDB4QTIsIDB4RjYsIDB4QTIsIDB4RjcsIDB4QTIsIDB4RjgsIC8qIDB4NjQtMHg2NyAqLworCTB4QTIsIDB4RjksIDB4QTIsIDB4RkEsIDB4QTIsIDB4RkIsIDB4QTIsIDB4RkMsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4QTIsIDB4QTEsIDB4QTIsIDB4QTIsIDB4QTIsIDB4QTMsIDB4QTIsIDB4QTQsIC8qIDB4NzAtMHg3MyAqLworCTB4QTIsIDB4QTUsIDB4QTIsIDB4QTYsIDB4QTIsIDB4QTcsIDB4QTIsIDB4QTgsIC8qIDB4NzQtMHg3NyAqLworCTB4QTIsIDB4QTksIDB4QTIsIDB4QUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4QTEsIDB4RkIsIDB4QTEsIDB4RkMsIDB4QTEsIDB4RkEsIDB4QTEsIDB4RkQsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTgsIDB4NDksIDB4QTgsIDB4NEEsIC8qIDB4OTQtMHg5NyAqLworCTB4QTgsIDB4NEIsIDB4QTgsIDB4NEMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzIyWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHhBMSwgMHhDQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhDNywgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHhBMSwgMHhDNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHhBOCwgMHg0RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHhBMSwgMHhFMywgMHgwMCwgMHgwMCwgMHhBMSwgMHhDQywgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHhBMSwgMHhEOCwgMHhBMSwgMHhERSwgMHhBOCwgMHg0RSwgLyogMHgxQy0weDFGICovCisJMHhBMSwgMHhDRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBOCwgMHg0RiwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhBMSwgMHhDRSwgMHgwMCwgMHgwMCwgMHhBMSwgMHhDNCwgLyogMHgyNC0weDI3ICovCisJMHhBMSwgMHhDNSwgMHhBMSwgMHhDOSwgMHhBMSwgMHhDOCwgMHhBMSwgMHhEMiwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhEMywgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHhBMSwgMHhFMCwgMHhBMSwgMHhERiwgMHhBMSwgMHhDMywgMHhBMSwgMHhDQiwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHhBMSwgMHhBQiwgMHhBMSwgMHhENywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHhBMSwgMHhENiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHhBMSwgMHhENSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBOCwgMHg1MCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHhBMSwgMHhEOSwgMHhBMSwgMHhENCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHhBMSwgMHhEQywgMHhBMSwgMHhERCwgMHhBOCwgMHg1MSwgMHhBOCwgMHg1MiwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhEQSwgMHhBMSwgMHhEQiwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHhBOCwgMHg5MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHhBMSwgMHhEMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHhBMSwgMHhDRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBOCwgMHg1MywgLyogMHhCQy0weEJGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMjNbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEExLCAweEQwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18yNFs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4QTIsIDB4RDksIDB4QTIsIDB4REEsIDB4QTIsIDB4REIsIDB4QTIsIDB4REMsIC8qIDB4NjAtMHg2MyAqLworCTB4QTIsIDB4REQsIDB4QTIsIDB4REUsIDB4QTIsIDB4REYsIDB4QTIsIDB4RTAsIC8qIDB4NjQtMHg2NyAqLworCTB4QTIsIDB4RTEsIDB4QTIsIDB4RTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4QTIsIDB4QzUsIDB4QTIsIDB4QzYsIDB4QTIsIDB4QzcsIDB4QTIsIDB4QzgsIC8qIDB4NzQtMHg3NyAqLworCTB4QTIsIDB4QzksIDB4QTIsIDB4Q0EsIDB4QTIsIDB4Q0IsIDB4QTIsIDB4Q0MsIC8qIDB4NzgtMHg3QiAqLworCTB4QTIsIDB4Q0QsIDB4QTIsIDB4Q0UsIDB4QTIsIDB4Q0YsIDB4QTIsIDB4RDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QTIsIDB4RDEsIDB4QTIsIDB4RDIsIDB4QTIsIDB4RDMsIDB4QTIsIDB4RDQsIC8qIDB4ODAtMHg4MyAqLworCTB4QTIsIDB4RDUsIDB4QTIsIDB4RDYsIDB4QTIsIDB4RDcsIDB4QTIsIDB4RDgsIC8qIDB4ODQtMHg4NyAqLworCTB4QTIsIDB4QjEsIDB4QTIsIDB4QjIsIDB4QTIsIDB4QjMsIDB4QTIsIDB4QjQsIC8qIDB4ODgtMHg4QiAqLworCTB4QTIsIDB4QjUsIDB4QTIsIDB4QjYsIDB4QTIsIDB4QjcsIDB4QTIsIDB4QjgsIC8qIDB4OEMtMHg4RiAqLworCTB4QTIsIDB4QjksIDB4QTIsIDB4QkEsIDB4QTIsIDB4QkIsIDB4QTIsIDB4QkMsIC8qIDB4OTAtMHg5MyAqLworCTB4QTIsIDB4QkQsIDB4QTIsIDB4QkUsIDB4QTIsIDB4QkYsIDB4QTIsIDB4QzAsIC8qIDB4OTQtMHg5NyAqLworCTB4QTIsIDB4QzEsIDB4QTIsIDB4QzIsIDB4QTIsIDB4QzMsIDB4QTIsIDB4QzQsIC8qIDB4OTgtMHg5QiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzI1WzUxMl0gPSB7CisJMHhBOSwgMHhBNCwgMHhBOSwgMHhBNSwgMHhBOSwgMHhBNiwgMHhBOSwgMHhBNywgLyogMHgwMC0weDAzICovCisJMHhBOSwgMHhBOCwgMHhBOSwgMHhBOSwgMHhBOSwgMHhBQSwgMHhBOSwgMHhBQiwgLyogMHgwNC0weDA3ICovCisJMHhBOSwgMHhBQywgMHhBOSwgMHhBRCwgMHhBOSwgMHhBRSwgMHhBOSwgMHhBRiwgLyogMHgwOC0weDBCICovCisJMHhBOSwgMHhCMCwgMHhBOSwgMHhCMSwgMHhBOSwgMHhCMiwgMHhBOSwgMHhCMywgLyogMHgwQy0weDBGICovCisJMHhBOSwgMHhCNCwgMHhBOSwgMHhCNSwgMHhBOSwgMHhCNiwgMHhBOSwgMHhCNywgLyogMHgxMC0weDEzICovCisJMHhBOSwgMHhCOCwgMHhBOSwgMHhCOSwgMHhBOSwgMHhCQSwgMHhBOSwgMHhCQiwgLyogMHgxNC0weDE3ICovCisJMHhBOSwgMHhCQywgMHhBOSwgMHhCRCwgMHhBOSwgMHhCRSwgMHhBOSwgMHhCRiwgLyogMHgxOC0weDFCICovCisJMHhBOSwgMHhDMCwgMHhBOSwgMHhDMSwgMHhBOSwgMHhDMiwgMHhBOSwgMHhDMywgLyogMHgxQy0weDFGICovCisJMHhBOSwgMHhDNCwgMHhBOSwgMHhDNSwgMHhBOSwgMHhDNiwgMHhBOSwgMHhDNywgLyogMHgyMC0weDIzICovCisJMHhBOSwgMHhDOCwgMHhBOSwgMHhDOSwgMHhBOSwgMHhDQSwgMHhBOSwgMHhDQiwgLyogMHgyNC0weDI3ICovCisJMHhBOSwgMHhDQywgMHhBOSwgMHhDRCwgMHhBOSwgMHhDRSwgMHhBOSwgMHhDRiwgLyogMHgyOC0weDJCICovCisJMHhBOSwgMHhEMCwgMHhBOSwgMHhEMSwgMHhBOSwgMHhEMiwgMHhBOSwgMHhEMywgLyogMHgyQy0weDJGICovCisJMHhBOSwgMHhENCwgMHhBOSwgMHhENSwgMHhBOSwgMHhENiwgMHhBOSwgMHhENywgLyogMHgzMC0weDMzICovCisJMHhBOSwgMHhEOCwgMHhBOSwgMHhEOSwgMHhBOSwgMHhEQSwgMHhBOSwgMHhEQiwgLyogMHgzNC0weDM3ICovCisJMHhBOSwgMHhEQywgMHhBOSwgMHhERCwgMHhBOSwgMHhERSwgMHhBOSwgMHhERiwgLyogMHgzOC0weDNCICovCisJMHhBOSwgMHhFMCwgMHhBOSwgMHhFMSwgMHhBOSwgMHhFMiwgMHhBOSwgMHhFMywgLyogMHgzQy0weDNGICovCisJMHhBOSwgMHhFNCwgMHhBOSwgMHhFNSwgMHhBOSwgMHhFNiwgMHhBOSwgMHhFNywgLyogMHg0MC0weDQzICovCisJMHhBOSwgMHhFOCwgMHhBOSwgMHhFOSwgMHhBOSwgMHhFQSwgMHhBOSwgMHhFQiwgLyogMHg0NC0weDQ3ICovCisJMHhBOSwgMHhFQywgMHhBOSwgMHhFRCwgMHhBOSwgMHhFRSwgMHhBOSwgMHhFRiwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHhBOCwgMHg1NCwgMHhBOCwgMHg1NSwgMHhBOCwgMHg1NiwgMHhBOCwgMHg1NywgLyogMHg1MC0weDUzICovCisJMHhBOCwgMHg1OCwgMHhBOCwgMHg1OSwgMHhBOCwgMHg1QSwgMHhBOCwgMHg1QiwgLyogMHg1NC0weDU3ICovCisJMHhBOCwgMHg1QywgMHhBOCwgMHg1RCwgMHhBOCwgMHg1RSwgMHhBOCwgMHg1RiwgLyogMHg1OC0weDVCICovCisJMHhBOCwgMHg2MCwgMHhBOCwgMHg2MSwgMHhBOCwgMHg2MiwgMHhBOCwgMHg2MywgLyogMHg1Qy0weDVGICovCisJMHhBOCwgMHg2NCwgMHhBOCwgMHg2NSwgMHhBOCwgMHg2NiwgMHhBOCwgMHg2NywgLyogMHg2MC0weDYzICovCisJMHhBOCwgMHg2OCwgMHhBOCwgMHg2OSwgMHhBOCwgMHg2QSwgMHhBOCwgMHg2QiwgLyogMHg2NC0weDY3ICovCisJMHhBOCwgMHg2QywgMHhBOCwgMHg2RCwgMHhBOCwgMHg2RSwgMHhBOCwgMHg2RiwgLyogMHg2OC0weDZCICovCisJMHhBOCwgMHg3MCwgMHhBOCwgMHg3MSwgMHhBOCwgMHg3MiwgMHhBOCwgMHg3MywgLyogMHg2Qy0weDZGICovCisJMHhBOCwgMHg3NCwgMHhBOCwgMHg3NSwgMHhBOCwgMHg3NiwgMHhBOCwgMHg3NywgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHhBOCwgMHg3OCwgMHhBOCwgMHg3OSwgMHhBOCwgMHg3QSwgLyogMHg4MC0weDgzICovCisJMHhBOCwgMHg3QiwgMHhBOCwgMHg3QywgMHhBOCwgMHg3RCwgMHhBOCwgMHg3RSwgLyogMHg4NC0weDg3ICovCisJMHhBOCwgMHg4MCwgMHhBOCwgMHg4MSwgMHhBOCwgMHg4MiwgMHhBOCwgMHg4MywgLyogMHg4OC0weDhCICovCisJMHhBOCwgMHg4NCwgMHhBOCwgMHg4NSwgMHhBOCwgMHg4NiwgMHhBOCwgMHg4NywgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBOCwgMHg4OCwgLyogMHg5MC0weDkzICovCisJMHhBOCwgMHg4OSwgMHhBOCwgMHg4QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHhBMSwgMHhGNiwgMHhBMSwgMHhGNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhGOCwgMHhBMSwgMHhGNywgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHhBOCwgMHg4QiwgMHhBOCwgMHg4QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhGNCwgMHhBMSwgMHhGMywgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhGMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhGMiwgMHhBMSwgMHhGMSwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBOCwgMHg4RCwgMHhBOCwgMHg4RSwgLyogMHhFMC0weEUzICovCisJMHhBOCwgMHg4RiwgMHhBOCwgMHg5MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMjZbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweEExLCAweEVGLCAweEExLCAweEVFLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweEE4LCAweDkxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweEExLCAweEUyLCAweDAwLCAweDAwLCAweEExLCAweEUxLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18zMFs1MTJdID0geworCTB4QTEsIDB4QTEsIDB4QTEsIDB4QTIsIDB4QTEsIDB4QTMsIDB4QTEsIDB4QTgsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4QTEsIDB4QTksIDB4QTksIDB4NjUsIDB4QTksIDB4OTYsIC8qIDB4MDQtMHgwNyAqLworCTB4QTEsIDB4QjQsIDB4QTEsIDB4QjUsIDB4QTEsIDB4QjYsIDB4QTEsIDB4QjcsIC8qIDB4MDgtMHgwQiAqLworCTB4QTEsIDB4QjgsIDB4QTEsIDB4QjksIDB4QTEsIDB4QkEsIDB4QTEsIDB4QkIsIC8qIDB4MEMtMHgwRiAqLworCTB4QTEsIDB4QkUsIDB4QTEsIDB4QkYsIDB4QTgsIDB4OTMsIDB4QTEsIDB4RkUsIC8qIDB4MTAtMHgxMyAqLworCTB4QTEsIDB4QjIsIDB4QTEsIDB4QjMsIDB4QTEsIDB4QkMsIDB4QTEsIDB4QkQsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4QTgsIDB4OTQsIDB4QTgsIDB4OTUsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4QTksIDB4NDAsIDB4QTksIDB4NDEsIDB4QTksIDB4NDIsIC8qIDB4MjAtMHgyMyAqLworCTB4QTksIDB4NDMsIDB4QTksIDB4NDQsIDB4QTksIDB4NDUsIDB4QTksIDB4NDYsIC8qIDB4MjQtMHgyNyAqLworCTB4QTksIDB4NDcsIDB4QTksIDB4NDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4QTQsIDB4QTEsIDB4QTQsIDB4QTIsIDB4QTQsIDB4QTMsIC8qIDB4NDAtMHg0MyAqLworCTB4QTQsIDB4QTQsIDB4QTQsIDB4QTUsIDB4QTQsIDB4QTYsIDB4QTQsIDB4QTcsIC8qIDB4NDQtMHg0NyAqLworCTB4QTQsIDB4QTgsIDB4QTQsIDB4QTksIDB4QTQsIDB4QUEsIDB4QTQsIDB4QUIsIC8qIDB4NDgtMHg0QiAqLworCTB4QTQsIDB4QUMsIDB4QTQsIDB4QUQsIDB4QTQsIDB4QUUsIDB4QTQsIDB4QUYsIC8qIDB4NEMtMHg0RiAqLworCTB4QTQsIDB4QjAsIDB4QTQsIDB4QjEsIDB4QTQsIDB4QjIsIDB4QTQsIDB4QjMsIC8qIDB4NTAtMHg1MyAqLworCTB4QTQsIDB4QjQsIDB4QTQsIDB4QjUsIDB4QTQsIDB4QjYsIDB4QTQsIDB4QjcsIC8qIDB4NTQtMHg1NyAqLworCTB4QTQsIDB4QjgsIDB4QTQsIDB4QjksIDB4QTQsIDB4QkEsIDB4QTQsIDB4QkIsIC8qIDB4NTgtMHg1QiAqLworCTB4QTQsIDB4QkMsIDB4QTQsIDB4QkQsIDB4QTQsIDB4QkUsIDB4QTQsIDB4QkYsIC8qIDB4NUMtMHg1RiAqLworCTB4QTQsIDB4QzAsIDB4QTQsIDB4QzEsIDB4QTQsIDB4QzIsIDB4QTQsIDB4QzMsIC8qIDB4NjAtMHg2MyAqLworCTB4QTQsIDB4QzQsIDB4QTQsIDB4QzUsIDB4QTQsIDB4QzYsIDB4QTQsIDB4QzcsIC8qIDB4NjQtMHg2NyAqLworCTB4QTQsIDB4QzgsIDB4QTQsIDB4QzksIDB4QTQsIDB4Q0EsIDB4QTQsIDB4Q0IsIC8qIDB4NjgtMHg2QiAqLworCTB4QTQsIDB4Q0MsIDB4QTQsIDB4Q0QsIDB4QTQsIDB4Q0UsIDB4QTQsIDB4Q0YsIC8qIDB4NkMtMHg2RiAqLworCTB4QTQsIDB4RDAsIDB4QTQsIDB4RDEsIDB4QTQsIDB4RDIsIDB4QTQsIDB4RDMsIC8qIDB4NzAtMHg3MyAqLworCTB4QTQsIDB4RDQsIDB4QTQsIDB4RDUsIDB4QTQsIDB4RDYsIDB4QTQsIDB4RDcsIC8qIDB4NzQtMHg3NyAqLworCTB4QTQsIDB4RDgsIDB4QTQsIDB4RDksIDB4QTQsIDB4REEsIDB4QTQsIDB4REIsIC8qIDB4NzgtMHg3QiAqLworCTB4QTQsIDB4REMsIDB4QTQsIDB4REQsIDB4QTQsIDB4REUsIDB4QTQsIDB4REYsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QTQsIDB4RTAsIDB4QTQsIDB4RTEsIDB4QTQsIDB4RTIsIDB4QTQsIDB4RTMsIC8qIDB4ODAtMHg4MyAqLworCTB4QTQsIDB4RTQsIDB4QTQsIDB4RTUsIDB4QTQsIDB4RTYsIDB4QTQsIDB4RTcsIC8qIDB4ODQtMHg4NyAqLworCTB4QTQsIDB4RTgsIDB4QTQsIDB4RTksIDB4QTQsIDB4RUEsIDB4QTQsIDB4RUIsIC8qIDB4ODgtMHg4QiAqLworCTB4QTQsIDB4RUMsIDB4QTQsIDB4RUQsIDB4QTQsIDB4RUUsIDB4QTQsIDB4RUYsIC8qIDB4OEMtMHg4RiAqLworCTB4QTQsIDB4RjAsIDB4QTQsIDB4RjEsIDB4QTQsIDB4RjIsIDB4QTQsIDB4RjMsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTksIDB4NjEsIC8qIDB4OTgtMHg5QiAqLworCTB4QTksIDB4NjIsIDB4QTksIDB4NjYsIDB4QTksIDB4NjcsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4QTUsIDB4QTEsIDB4QTUsIDB4QTIsIDB4QTUsIDB4QTMsIC8qIDB4QTAtMHhBMyAqLworCTB4QTUsIDB4QTQsIDB4QTUsIDB4QTUsIDB4QTUsIDB4QTYsIDB4QTUsIDB4QTcsIC8qIDB4QTQtMHhBNyAqLworCTB4QTUsIDB4QTgsIDB4QTUsIDB4QTksIDB4QTUsIDB4QUEsIDB4QTUsIDB4QUIsIC8qIDB4QTgtMHhBQiAqLworCTB4QTUsIDB4QUMsIDB4QTUsIDB4QUQsIDB4QTUsIDB4QUUsIDB4QTUsIDB4QUYsIC8qIDB4QUMtMHhBRiAqLworCTB4QTUsIDB4QjAsIDB4QTUsIDB4QjEsIDB4QTUsIDB4QjIsIDB4QTUsIDB4QjMsIC8qIDB4QjAtMHhCMyAqLworCTB4QTUsIDB4QjQsIDB4QTUsIDB4QjUsIDB4QTUsIDB4QjYsIDB4QTUsIDB4QjcsIC8qIDB4QjQtMHhCNyAqLworCTB4QTUsIDB4QjgsIDB4QTUsIDB4QjksIDB4QTUsIDB4QkEsIDB4QTUsIDB4QkIsIC8qIDB4QjgtMHhCQiAqLworCTB4QTUsIDB4QkMsIDB4QTUsIDB4QkQsIDB4QTUsIDB4QkUsIDB4QTUsIDB4QkYsIC8qIDB4QkMtMHhCRiAqLworCTB4QTUsIDB4QzAsIDB4QTUsIDB4QzEsIDB4QTUsIDB4QzIsIDB4QTUsIDB4QzMsIC8qIDB4QzAtMHhDMyAqLworCTB4QTUsIDB4QzQsIDB4QTUsIDB4QzUsIDB4QTUsIDB4QzYsIDB4QTUsIDB4QzcsIC8qIDB4QzQtMHhDNyAqLworCTB4QTUsIDB4QzgsIDB4QTUsIDB4QzksIDB4QTUsIDB4Q0EsIDB4QTUsIDB4Q0IsIC8qIDB4QzgtMHhDQiAqLworCTB4QTUsIDB4Q0MsIDB4QTUsIDB4Q0QsIDB4QTUsIDB4Q0UsIDB4QTUsIDB4Q0YsIC8qIDB4Q0MtMHhDRiAqLworCTB4QTUsIDB4RDAsIDB4QTUsIDB4RDEsIDB4QTUsIDB4RDIsIDB4QTUsIDB4RDMsIC8qIDB4RDAtMHhEMyAqLworCTB4QTUsIDB4RDQsIDB4QTUsIDB4RDUsIDB4QTUsIDB4RDYsIDB4QTUsIDB4RDcsIC8qIDB4RDQtMHhENyAqLworCTB4QTUsIDB4RDgsIDB4QTUsIDB4RDksIDB4QTUsIDB4REEsIDB4QTUsIDB4REIsIC8qIDB4RDgtMHhEQiAqLworCTB4QTUsIDB4REMsIDB4QTUsIDB4REQsIDB4QTUsIDB4REUsIDB4QTUsIDB4REYsIC8qIDB4REMtMHhERiAqLworCTB4QTUsIDB4RTAsIDB4QTUsIDB4RTEsIDB4QTUsIDB4RTIsIDB4QTUsIDB4RTMsIC8qIDB4RTAtMHhFMyAqLworCTB4QTUsIDB4RTQsIDB4QTUsIDB4RTUsIDB4QTUsIDB4RTYsIDB4QTUsIDB4RTcsIC8qIDB4RTQtMHhFNyAqLworCTB4QTUsIDB4RTgsIDB4QTUsIDB4RTksIDB4QTUsIDB4RUEsIDB4QTUsIDB4RUIsIC8qIDB4RTgtMHhFQiAqLworCTB4QTUsIDB4RUMsIDB4QTUsIDB4RUQsIDB4QTUsIDB4RUUsIDB4QTUsIDB4RUYsIC8qIDB4RUMtMHhFRiAqLworCTB4QTUsIDB4RjAsIDB4QTUsIDB4RjEsIDB4QTUsIDB4RjIsIDB4QTUsIDB4RjMsIC8qIDB4RjAtMHhGMyAqLworCTB4QTUsIDB4RjQsIDB4QTUsIDB4RjUsIDB4QTUsIDB4RjYsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4QTksIDB4NjAsIDB4QTksIDB4NjMsIDB4QTksIDB4NjQsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzMxWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHhBOCwgMHhDNSwgMHhBOCwgMHhDNiwgMHhBOCwgMHhDNywgLyogMHgwNC0weDA3ICovCisJMHhBOCwgMHhDOCwgMHhBOCwgMHhDOSwgMHhBOCwgMHhDQSwgMHhBOCwgMHhDQiwgLyogMHgwOC0weDBCICovCisJMHhBOCwgMHhDQywgMHhBOCwgMHhDRCwgMHhBOCwgMHhDRSwgMHhBOCwgMHhDRiwgLyogMHgwQy0weDBGICovCisJMHhBOCwgMHhEMCwgMHhBOCwgMHhEMSwgMHhBOCwgMHhEMiwgMHhBOCwgMHhEMywgLyogMHgxMC0weDEzICovCisJMHhBOCwgMHhENCwgMHhBOCwgMHhENSwgMHhBOCwgMHhENiwgMHhBOCwgMHhENywgLyogMHgxNC0weDE3ICovCisJMHhBOCwgMHhEOCwgMHhBOCwgMHhEOSwgMHhBOCwgMHhEQSwgMHhBOCwgMHhEQiwgLyogMHgxOC0weDFCICovCisJMHhBOCwgMHhEQywgMHhBOCwgMHhERCwgMHhBOCwgMHhERSwgMHhBOCwgMHhERiwgLyogMHgxQy0weDFGICovCisJMHhBOCwgMHhFMCwgMHhBOCwgMHhFMSwgMHhBOCwgMHhFMiwgMHhBOCwgMHhFMywgLyogMHgyMC0weDIzICovCisJMHhBOCwgMHhFNCwgMHhBOCwgMHhFNSwgMHhBOCwgMHhFNiwgMHhBOCwgMHhFNywgLyogMHgyNC0weDI3ICovCisJMHhBOCwgMHhFOCwgMHhBOCwgMHhFOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMiwgMHhCQiwgMHhCNiwgMHhGRSwgLyogMHg5MC0weDkzICovCisJMHhDOCwgMHhGRCwgMHhDQiwgMHhDNCwgMHhDOSwgMHhDRiwgMHhENiwgMHhEMCwgLyogMHg5NC0weDk3ICovCisJMHhDRiwgMHhDMiwgMHhCQywgMHhENywgMHhEMiwgMHhEMiwgMHhCMSwgMHhGQiwgLyogMHg5OC0weDlCICovCisJMHhCNiwgMHhBMSwgMHhDQywgMHhFQywgMHhCNSwgMHhEOCwgMHhDOCwgMHhDQiwgLyogMHg5Qy0weDlGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMzJbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweEEyLCAweEU1LCAweEEyLCAweEU2LCAweEEyLCAweEU3LCAweEEyLCAweEU4LCAvKiAweDIwLTB4MjMgKi8KKwkweEEyLCAweEU5LCAweEEyLCAweEVBLCAweEEyLCAweEVCLCAweEEyLCAweEVDLCAvKiAweDI0LTB4MjcgKi8KKwkweEEyLCAweEVELCAweEEyLCAweEVFLCAweEQ0LCAweEMyLCAweEJCLCAweEYwLCAvKiAweDI4LTB4MkIgKi8KKwkweENCLCAweEFFLCAweEM0LCAweEJFLCAweEJELCAweEYwLCAweENELCAweEMxLCAvKiAweDJDLTB4MkYgKi8KKwkweEM4LCAweEQ1LCAweEE5LCAweDVBLCAweEQzLCAweEQwLCAweEM5LCAweEU3LCAvKiAweDMwLTB4MzMgKi8KKwkweEMzLCAweEZCLCAweENDLCAweEQ4LCAweEIyLCAweEM2LCAweEQ3LCAweEEzLCAvKiAweDM0LTB4MzcgKi8KKwkweEMwLCAweENELCAweEI0LCAweEZBLCAweEJBLCAweEY0LCAweEQxLCAweEE3LCAvKiAweDM4LTB4M0IgKi8KKwkweEJDLCAweEUwLCAweEM2LCAweEYzLCAweEQ3LCAweENBLCAweEQwLCAweEFELCAvKiAweDNDLTB4M0YgKi8KKwkweEJDLCAweEMwLCAweEQwLCAweERELCAweEQ3LCAweEQ0LCAweEQ2LCAweEMxLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEQyLCAweEJCLCAweEI2LCAweEZFLCAweEM4LCAweEZELCAweENCLCAweEM0LCAvKiAweDgwLTB4ODMgKi8KKwkweENFLCAweEU1LCAweEMxLCAweEY5LCAweEM2LCAweERGLCAweEIwLCAweENCLCAvKiAweDg0LTB4ODcgKi8KKwkweEJFLCAweEM1LCAweENBLCAweEFFLCAweEQ0LCAweEMyLCAweEJCLCAweEYwLCAvKiAweDg4LTB4OEIgKi8KKwkweENCLCAweEFFLCAweEM0LCAweEJFLCAweEJELCAweEYwLCAweENELCAweEMxLCAvKiAweDhDLTB4OEYgKi8KKwkweEM4LCAweEQ1LCAweEQ2LCAweEVBLCAweEQzLCAweEQwLCAweEM5LCAweEU3LCAvKiAweDkwLTB4OTMgKi8KKwkweEMzLCAweEZCLCAweENDLCAweEQ4LCAweEIyLCAweEM2LCAweEQ3LCAweEEzLCAvKiAweDk0LTB4OTcgKi8KKwkweEMwLCAweENELCAweEMzLCAweEQ4LCAweEM0LCAweEQwLCAweEM1LCAweEFFLCAvKiAweDk4LTB4OUIgKi8KKwkweENBLCAweENBLCAweEQzLCAweEM1LCAweDAwLCAweDAwLCAweEQ3LCAweEEyLCAvKiAweDlDLTB4OUYgKi8KKwkweENGLCAweEVFLCAweEQwLCAweERELCAweEQwLCAweEI0LCAweEE5LCAweDQ5LCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweEQyLCAweEJELCAweEQ3LCAweERBLCAweEQxLCAweEE3LCAvKiAweEE4LTB4QUIgKi8KKwkweEJDLCAweEUwLCAweEM2LCAweEYzLCAweEQ3LCAweENBLCAweEQwLCAweEFELCAvKiAweEFDLTB4QUYgKi8KKwkweEQyLCAweEI5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18zM1s1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTksIDB4NEEsIDB4QTksIDB4NEIsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4QTksIDB4NEMsIDB4QTksIDB4NEQsIDB4QTksIDB4NEUsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4QTksIDB4NEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4QTksIDB4NTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTksIDB4NTEsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4QTksIDB4NTIsIDB4QTksIDB4NTMsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4QTksIDB4NTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzRFWzUxMl0gPSB7CisJMHhEMiwgMHhCQiwgMHhCNiwgMHhBMSwgMHg4MSwgMHg0MCwgMHhDNiwgMHhERiwgLyogMHgwMC0weDAzICovCisJMHg4MSwgMHg0MSwgMHg4MSwgMHg0MiwgMHg4MSwgMHg0MywgMHhDRCwgMHhGMiwgLyogMHgwNC0weDA3ICovCisJMHhENSwgMHhDOSwgMHhDOCwgMHhGRCwgMHhDOSwgMHhDRiwgMHhDRiwgMHhDMiwgLyogMHgwOC0weDBCICovCisJMHhEOCwgMHhBMiwgMHhCMiwgMHhCQiwgMHhEMywgMHhFQiwgMHg4MSwgMHg0NCwgLyogMHgwQy0weDBGICovCisJMHhEOCwgMHhBNCwgMHhCMywgMHhGMywgMHg4MSwgMHg0NSwgMHhENywgMHhBOCwgLyogMHgxMC0weDEzICovCisJMHhDNywgMHhEMiwgMHhEOCwgMHhBNywgMHhDQSwgMHhDMCwgMHg4MSwgMHg0NiwgLyogMHgxNC0weDE3ICovCisJMHhDNywgMHhGMCwgMHhCMSwgMHhGQiwgMHhEMiwgMHhCNSwgMHhCNCwgMHhENCwgLyogMHgxOC0weDFCICovCisJMHhCNiwgMHhBQiwgMHhDQiwgMHhCRiwgMHhEOCwgMHhBOSwgMHg4MSwgMHg0NywgLyogMHgxQy0weDFGICovCisJMHg4MSwgMHg0OCwgMHg4MSwgMHg0OSwgMHhCNiwgMHhBQSwgMHg4MSwgMHg0QSwgLyogMHgyMC0weDIzICovCisJMHhDMSwgMHhCRCwgMHhEMSwgMHhDRiwgMHg4MSwgMHg0QiwgMHhDOSwgMHhBNSwgLyogMHgyNC0weDI3ICovCisJMHhEOCwgMHhBRCwgMHg4MSwgMHg0QywgMHhCOCwgMHhGNiwgMHhEMSwgMHhCRSwgLyogMHgyOC0weDJCICovCisJMHhFMywgMHhEQywgMHhENiwgMHhEMCwgMHg4MSwgMHg0RCwgMHg4MSwgMHg0RSwgLyogMHgyQy0weDJGICovCisJMHhCNywgMHhFMSwgMHg4MSwgMHg0RiwgMHhCNCwgMHhBRSwgMHg4MSwgMHg1MCwgLyogMHgzMC0weDMzICovCisJMHhDMSwgMHhEOSwgMHg4MSwgMHg1MSwgMHhEOCwgMHhCQywgMHg4MSwgMHg1MiwgLyogMHgzNC0weDM3ICovCisJMHhDRCwgMHhFOCwgMHhCNSwgMHhBNCwgMHhDRSwgMHhBQSwgMHhENiwgMHhGNywgLyogMHgzOC0weDNCICovCisJMHg4MSwgMHg1MywgMHhDMCwgMHhGNiwgMHhCRSwgMHhEOSwgMHhEOCwgMHhBRiwgLyogMHgzQy0weDNGICovCisJMHg4MSwgMHg1NCwgMHg4MSwgMHg1NSwgMHg4MSwgMHg1NiwgMHhDNCwgMHhDQiwgLyogMHg0MC0weDQzICovCisJMHg4MSwgMHg1NywgMHhCRSwgMHhDMywgMHg4MSwgMHg1OCwgMHhEOCwgMHhCMSwgLyogMHg0NC0weDQ3ICovCisJMHhDMywgMHhCNCwgMHhEMiwgMHhFNSwgMHg4MSwgMHg1OSwgMHhENiwgMHhBRSwgLyogMHg0OC0weDRCICovCisJMHhDRSwgMHhEQSwgMHhENSwgMHhBNywgMHhCQSwgMHhGNSwgMHhCNywgMHhBNiwgLyogMHg0Qy0weDRGICovCisJMHhDMCwgMHhENiwgMHg4MSwgMHg1QSwgMHhDNiwgMHhCOSwgMHhDNSwgMHhEMiwgLyogMHg1MC0weDUzICovCisJMHhDNywgMHhDNywgMHg4MSwgMHg1QiwgMHhCOSwgMHhENCwgMHg4MSwgMHg1QywgLyogMHg1NC0weDU3ICovCisJMHhCMywgMHhDQiwgMHhEMiwgMHhEMiwgMHg4MSwgMHg1RCwgMHg4MSwgMHg1RSwgLyogMHg1OC0weDVCICovCisJMHhEOCwgMHhCRiwgMHhCRSwgMHhDNSwgMHhDNiwgMHhGMiwgMHhEMiwgMHhCMiwgLyogMHg1Qy0weDVGICovCisJMHhDRiwgMHhCMCwgMHhDRiwgMHhFNywgMHg4MSwgMHg1RiwgMHg4MSwgMHg2MCwgLyogMHg2MC0weDYzICovCisJMHg4MSwgMHg2MSwgMHg4MSwgMHg2MiwgMHhDQSwgMHhFOSwgMHg4MSwgMHg2MywgLyogMHg2NC0weDY3ICovCisJMHg4MSwgMHg2NCwgMHhEOCwgMHhDMCwgMHg4MSwgMHg2NSwgMHg4MSwgMHg2NiwgLyogMHg2OC0weDZCICovCisJMHg4MSwgMHg2NywgMHg4MSwgMHg2OCwgMHg4MSwgMHg2OSwgMHg4MSwgMHg2QSwgLyogMHg2Qy0weDZGICovCisJMHhDMiwgMHhGMiwgMHhDMiwgMHhEMiwgMHg4MSwgMHg2QiwgMHhDOCwgMHhFOSwgLyogMHg3MC0weDczICovCisJMHg4MSwgMHg2QywgMHg4MSwgMHg2RCwgMHg4MSwgMHg2RSwgMHg4MSwgMHg2RiwgLyogMHg3NC0weDc3ICovCisJMHg4MSwgMHg3MCwgMHg4MSwgMHg3MSwgMHg4MSwgMHg3MiwgMHg4MSwgMHg3MywgLyogMHg3OC0weDdCICovCisJMHg4MSwgMHg3NCwgMHg4MSwgMHg3NSwgMHhDNywgMHhBQywgMHg4MSwgMHg3NiwgLyogMHg3Qy0weDdGICovCisJCisJMHg4MSwgMHg3NywgMHg4MSwgMHg3OCwgMHg4MSwgMHg3OSwgMHg4MSwgMHg3QSwgLyogMHg4MC0weDgzICovCisJMHg4MSwgMHg3QiwgMHg4MSwgMHg3QywgMHhDMSwgMHhDQiwgMHg4MSwgMHg3RCwgLyogMHg4NC0weDg3ICovCisJMHhEMywgMHhFOCwgMHhENSwgMHhGOSwgMHg4MSwgMHg3RSwgMHhDQSwgMHhDMiwgLyogMHg4OC0weDhCICovCisJMHhCNiwgMHhGRSwgMHhEOCwgMHhBMSwgMHhEMywgMHhEQSwgMHhCRiwgMHhGNywgLyogMHg4Qy0weDhGICovCisJMHg4MSwgMHg4MCwgMHhENCwgMHhDNiwgMHhCQiwgMHhBNSwgMHhEOCwgMHhDMSwgLyogMHg5MC0weDkzICovCisJMHhDRSwgMHhFNSwgMHhCRSwgMHhBRSwgMHg4MSwgMHg4MSwgMHg4MSwgMHg4MiwgLyogMHg5NC0weDk3ICovCisJMHhEOCwgMHhBOCwgMHg4MSwgMHg4MywgMHhEMSwgMHhDNywgMHhEMCwgMHhBOSwgLyogMHg5OC0weDlCICovCisJMHg4MSwgMHg4NCwgMHg4MSwgMHg4NSwgMHg4MSwgMHg4NiwgMHhEOCwgMHhCRCwgLyogMHg5Qy0weDlGICovCisJMHhEOSwgMHhFRiwgMHhDRCwgMHhGNiwgMHhCRiwgMHhCQSwgMHg4MSwgMHg4NywgLyogMHhBMC0weEEzICovCisJMHhCRCwgMHhCQiwgMHhCQSwgMHhBNSwgMHhEMiwgMHhFMCwgMHhCMiwgMHhGQSwgLyogMHhBNC0weEE3ICovCisJMHhCQSwgMHhFMCwgMHhDNCwgMHhCNiwgMHg4MSwgMHg4OCwgMHhDRiwgMHhFRCwgLyogMHhBOC0weEFCICovCisJMHhCRSwgMHhBOSwgMHhDRCwgMHhBNCwgMHhDMSwgMHhDMSwgMHg4MSwgMHg4OSwgLyogMHhBQy0weEFGICovCisJMHg4MSwgMHg4QSwgMHg4MSwgMHg4QiwgMHhDNywgMHhENywgMHhEOSwgMHhGMSwgLyogMHhCMC0weEIzICovCisJMHg4MSwgMHg4QywgMHhEOSwgMHhGNCwgMHg4MSwgMHg4RCwgMHg4MSwgMHg4RSwgLyogMHhCNC0weEI3ICovCisJMHg4MSwgMHg4RiwgMHg4MSwgMHg5MCwgMHhDOCwgMHhDQiwgMHhEOCwgMHhFOSwgLyogMHhCOC0weEJCICovCisJMHg4MSwgMHg5MSwgMHg4MSwgMHg5MiwgMHg4MSwgMHg5MywgMHhEMiwgMHhEQSwgLyogMHhCQy0weEJGICovCisJMHhDQSwgMHhCMiwgMHhDOCwgMHhDQSwgMHhEOCwgMHhFQywgMHhEOCwgMHhFQSwgLyogMHhDMC0weEMzICovCisJMHhEOCwgMHhDNiwgMHhCRCwgMHhGNiwgMHhDNiwgMHhDRCwgMHhCMywgMHhGMCwgLyogMHhDNC0weEM3ICovCisJMHg4MSwgMHg5NCwgMHhEOCwgMHhFQiwgMHhCRCwgMHhGMSwgMHhCRCwgMHhFOSwgLyogMHhDOC0weENCICovCisJMHg4MSwgMHg5NSwgMHhDOCwgMHhENCwgMHhCNCwgMHhEMywgMHg4MSwgMHg5NiwgLyogMHhDQy0weENGICovCisJMHg4MSwgMHg5NywgMHhDMiwgMHhEOCwgMHg4MSwgMHg5OCwgMHhCMiwgMHhENiwgLyogMHhEMC0weEQzICovCisJMHhENywgMHhEMCwgMHhDQSwgMHhDQiwgMHhDQiwgMHhGQiwgMHhENSwgMHhDQywgLyogMHhENC0weEQ3ICovCisJMHhCOCwgMHhCNiwgMHhDRiwgMHhDOSwgMHg4MSwgMHg5OSwgMHg4MSwgMHg5QSwgLyogMHhEOC0weERCICovCisJMHg4MSwgMHg5QiwgMHhEOSwgMHhEQSwgMHhEOCwgMHhGMCwgMHhDNywgMHhBQSwgLyogMHhEQy0weERGICovCisJMHg4MSwgMHg5QywgMHhEOCwgMHhFRSwgMHg4MSwgMHg5RCwgMHhCNCwgMHhGQSwgLyogMHhFMC0weEUzICovCisJMHhDMSwgMHhFRSwgMHhEMiwgMHhENCwgMHg4MSwgMHg5RSwgMHg4MSwgMHg5RiwgLyogMHhFNC0weEU3ICovCisJMHhEOCwgMHhFRCwgMHg4MSwgMHhBMCwgMHhEMiwgMHhDNywgMHhEOCwgMHhFRiwgLyogMHhFOC0weEVCICovCisJMHhDMywgMHhDNywgMHg4MSwgMHhBMSwgMHg4MSwgMHhBMiwgMHg4MSwgMHhBMywgLyogMHhFQy0weEVGICovCisJMHhEMSwgMHhGNiwgMHg4MSwgMHhBNCwgMHhENiwgMHhEOSwgMHhEOCwgMHhGMiwgLyogMHhGMC0weEYzICovCisJMHg4MSwgMHhBNSwgMHhEOCwgMHhGNSwgMHhCQywgMHhGRSwgMHhCQywgMHhEQiwgLyogMHhGNC0weEY3ICovCisJMHg4MSwgMHhBNiwgMHg4MSwgMHhBNywgMHg4MSwgMHhBOCwgMHhDOCwgMHhDRSwgLyogMHhGOC0weEZCICovCisJMHg4MSwgMHhBOSwgMHhCNywgMHhERCwgMHg4MSwgMHhBQSwgMHhCNywgMHhDMiwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNEZbNTEyXSA9IHsKKwkweDgxLCAweEFCLCAweEM2LCAweEYzLCAweDgxLCAweEFDLCAweDgxLCAweEFELCAvKiAweDAwLTB4MDMgKi8KKwkweDgxLCAweEFFLCAweDgxLCAweEFGLCAweDgxLCAweEIwLCAweDgxLCAweEIxLCAvKiAweDA0LTB4MDcgKi8KKwkweDgxLCAweEIyLCAweEQ4LCAweEY4LCAweEQyLCAweEMxLCAweDgxLCAweEIzLCAvKiAweDA4LTB4MEIgKi8KKwkweDgxLCAweEI0LCAweENFLCAweEU5LCAweEJDLCAweEJGLCAweEI3LCAweEZDLCAvKiAweDBDLTB4MEYgKi8KKwkweEI3LCAweEE1LCAweEQwLCAweERELCAweDgxLCAweEI1LCAweDgxLCAweEI2LCAvKiAweDEwLTB4MTMgKi8KKwkweDgxLCAweEI3LCAweDgxLCAweEI4LCAweDgxLCAweEI5LCAweEQ2LCAweERBLCAvKiAweDE0LTB4MTcgKi8KKwkweEQzLCAweEM1LCAweEJCLCAweEVGLCAweEJCLCAweEUxLCAweEQ4LCAweEYxLCAvKiAweDE4LTB4MUIgKi8KKwkweDgxLCAweEJBLCAweDgxLCAweEJCLCAweEM5LCAweEExLCAweENFLCAweEIwLCAvKiAweDFDLTB4MUYgKi8KKwkweEI0LCAweEFCLCAweDgxLCAweEJDLCAweEQ4LCAweEYzLCAweDgxLCAweEJELCAvKiAweDIwLTB4MjMgKi8KKwkweEM5LCAweENCLCAweEQ4LCAweEY2LCAweEMyLCAweEQ3LCAweEQ4LCAweEY3LCAvKiAweDI0LTB4MjcgKi8KKwkweDgxLCAweEJFLCAweDgxLCAweEJGLCAweENFLCAweEIxLCAweEQ4LCAweEY5LCAvKiAweDI4LTB4MkIgKi8KKwkweDgxLCAweEMwLCAweDgxLCAweEMxLCAweDgxLCAweEMyLCAweEIyLCAweEFFLCAvKiAweDJDLTB4MkYgKi8KKwkweEI5LCAweEMwLCAweDgxLCAweEMzLCAweEQ5LCAweEEzLCAweDgxLCAweEM0LCAvKiAweDMwLTB4MzMgKi8KKwkweEIwLCAweEU5LCAweDgxLCAweEM1LCAweEMxLCAweEU2LCAweDgxLCAweEM2LCAvKiAweDM0LTB4MzcgKi8KKwkweEM5LCAweEVDLCAweDgxLCAweEM3LCAweENCLCAweEM1LCAweDgxLCAweEM4LCAvKiAweDM4LTB4M0IgKi8KKwkweENCLCAweEM2LCAweEQ5LCAweEE0LCAweDgxLCAweEM5LCAweDgxLCAweENBLCAvKiAweDNDLTB4M0YgKi8KKwkweDgxLCAweENCLCAweDgxLCAweENDLCAweDgxLCAweENELCAweEI1LCAweEU4LCAvKiAweDQwLTB4NDMgKi8KKwkweDgxLCAweENFLCAweDgxLCAweENGLCAweEI1LCAweEFCLCAweDgxLCAweEQwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDgxLCAweEQxLCAweDgxLCAweEQyLCAweDgxLCAweEQzLCAweDgxLCAweEQ0LCAvKiAweDQ4LTB4NEIgKi8KKwkweDgxLCAweEQ1LCAweENFLCAweEJCLCAweEI1LCAweENELCAweEQ3LCAweEExLCAvKiAweDRDLTB4NEYgKi8KKwkweEQ3LCAweEY0LCAweEQzLCAweEQzLCAweDgxLCAweEQ2LCAweENDLCAweEU1LCAvKiAweDUwLTB4NTMgKi8KKwkweDgxLCAweEQ3LCAweEJBLCAweENFLCAweDgxLCAweEQ4LCAweEQ5LCAweEEyLCAvKiAweDU0LTB4NTcgKi8KKwkweEQ5LCAweERDLCAweEQzLCAweEUwLCAweEQ4LCAweEZELCAweEI3LCAweEYwLCAvKiAweDU4LTB4NUIgKi8KKwkweEQ3LCAweEY3LCAweEQ4LCAweEZFLCAweEQ4LCAweEZBLCAweEQ5LCAweEExLCAvKiAweDVDLTB4NUYgKi8KKwkweEM0LCAweEUzLCAweDgxLCAweEQ5LCAweDgxLCAweERBLCAweEQzLCAweEI2LCAvKiAweDYwLTB4NjMgKi8KKwkweEQ4LCAweEY0LCAweEQ5LCAweERELCAweDgxLCAweERCLCAweEQ4LCAweEZCLCAvKiAweDY0LTB4NjcgKi8KKwkweDgxLCAweERDLCAweEM1LCAweEU1LCAweDgxLCAweERELCAweDgxLCAweERFLCAvKiAweDY4LTB4NkIgKi8KKwkweEMwLCAweEQwLCAweDgxLCAweERGLCAweDgxLCAweEUwLCAweEQxLCAweEYwLCAvKiAweDZDLTB4NkYgKi8KKwkweEIwLCAweERCLCAweDgxLCAweEUxLCAweDgxLCAweEUyLCAweEJDLCAweEQxLCAvKiAweDcwLTB4NzMgKi8KKwkweEQ5LCAweEE2LCAweDgxLCAweEUzLCAweEQ5LCAweEE1LCAweDgxLCAweEU0LCAvKiAweDc0LTB4NzcgKi8KKwkweDgxLCAweEU1LCAweDgxLCAweEU2LCAweDgxLCAweEU3LCAweEQ5LCAweEFDLCAvKiAweDc4LTB4N0IgKi8KKwkweEQ5LCAweEFFLCAweDgxLCAweEU4LCAweEQ5LCAweEFCLCAweENBLCAweEI5LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDgxLCAweEU5LCAweDgxLCAweEVBLCAweDgxLCAweEVCLCAweEQ5LCAweEE5LCAvKiAweDgwLTB4ODMgKi8KKwkweEQ2LCAweEI2LCAweDgxLCAweEVDLCAweDgxLCAweEVELCAweDgxLCAweEVFLCAvKiAweDg0LTB4ODcgKi8KKwkweEIzLCAweERFLCAweEQ5LCAweEE4LCAweDgxLCAweEVGLCAweEMwLCAweEZELCAvKiAweDg4LTB4OEIgKi8KKwkweDgxLCAweEYwLCAweENBLCAweENDLCAweDgxLCAweEYxLCAweEQ5LCAweEFBLCAvKiAweDhDLTB4OEYgKi8KKwkweDgxLCAweEYyLCAweEQ5LCAweEE3LCAweDgxLCAweEYzLCAweDgxLCAweEY0LCAvKiAweDkwLTB4OTMgKi8KKwkweEQ5LCAweEIwLCAweDgxLCAweEY1LCAweDgxLCAweEY2LCAweEI2LCAweEIxLCAvKiAweDk0LTB4OTcgKi8KKwkweDgxLCAweEY3LCAweDgxLCAweEY4LCAweDgxLCAweEY5LCAweEI5LCAweEE5LCAvKiAweDk4LTB4OUIgKi8KKwkweDgxLCAweEZBLCAweEQyLCAweEMwLCAweDgxLCAweEZCLCAweDgxLCAweEZDLCAvKiAweDlDLTB4OUYgKi8KKwkweENGLCAweEMwLCAweDgxLCAweEZELCAweDgxLCAweEZFLCAweEMyLCAweEMyLCAvKiAweEEwLTB4QTMgKi8KKwkweDgyLCAweDQwLCAweEJELCAweEM0LCAweEQ1LCAweEVDLCAweEIyLCAweEUwLCAvKiAweEE0LTB4QTcgKi8KKwkweEM3LCAweEM4LCAweEJGLCAweEVCLCAweEQ5LCAweEFELCAweDgyLCAweDQxLCAvKiAweEE4LTB4QUIgKi8KKwkweEQ5LCAweEFGLCAweDgyLCAweDQyLCAweENFLCAweEVBLCAweEJBLCAweEVFLCAvKiAweEFDLTB4QUYgKi8KKwkweDgyLCAweDQzLCAweDgyLCAweDQ0LCAweDgyLCAweDQ1LCAweDgyLCAweDQ2LCAvKiAweEIwLTB4QjMgKi8KKwkweDgyLCAweDQ3LCAweEM3LCAweEQ2LCAweDgyLCAweDQ4LCAweDgyLCAweDQ5LCAvKiAweEI0LTB4QjcgKi8KKwkweDgyLCAweDRBLCAweDgyLCAweDRCLCAweDgyLCAweDRDLCAweDgyLCAweDRELCAvKiAweEI4LTB4QkIgKi8KKwkweDgyLCAweDRFLCAweDgyLCAweDRGLCAweDgyLCAweDUwLCAweEIxLCAweEUzLCAvKiAweEJDLTB4QkYgKi8KKwkweDgyLCAweDUxLCAweDgyLCAweDUyLCAweDgyLCAweDUzLCAweEI0LCAweEQ5LCAvKiAweEMwLTB4QzMgKi8KKwkweEI2LCAweEVELCAweEQ5LCAweEI0LCAweDgyLCAweDU0LCAweDgyLCAweDU1LCAvKiAweEM0LTB4QzcgKi8KKwkweDgyLCAweDU2LCAweDgyLCAweDU3LCAweEJGLCAweEExLCAweDgyLCAweDU4LCAvKiAweEM4LTB4Q0IgKi8KKwkweDgyLCAweDU5LCAweDgyLCAweDVBLCAweEQ5LCAweERFLCAweEM3LCAweENFLCAvKiAweENDLTB4Q0YgKi8KKwkweEMwLCAweEZFLCAweEQ5LCAweEI4LCAweDgyLCAweDVCLCAweDgyLCAweDVDLCAvKiAweEQwLTB4RDMgKi8KKwkweDgyLCAweDVELCAweDgyLCAweDVFLCAweDgyLCAweDVGLCAweENCLCAweEQ3LCAvKiAweEQ0LTB4RDcgKi8KKwkweEI3LCAweEZELCAweDgyLCAweDYwLCAweEQ5LCAweEI1LCAweDgyLCAweDYxLCAvKiAweEQ4LTB4REIgKi8KKwkweEQ5LCAweEI3LCAweEIxLCAweEEzLCAweEQzLCAweEUxLCAweEQ5LCAweEI5LCAvKiAweERDLTB4REYgKi8KKwkweDgyLCAweDYyLCAweEQwLCAweEM1LCAweDgyLCAweDYzLCAweEQ5LCAweEI2LCAvKiAweEUwLTB4RTMgKi8KKwkweDgyLCAweDY0LCAweDgyLCAweDY1LCAweEQ5LCAweEIxLCAweDgyLCAweDY2LCAvKiAweEU0LTB4RTcgKi8KKwkweEQ5LCAweEIyLCAweEMxLCAweEE5LCAweEQ5LCAweEIzLCAweDgyLCAweDY3LCAvKiAweEU4LTB4RUIgKi8KKwkweDgyLCAweDY4LCAweEJDLCAweEYzLCAweEQwLCAweERFLCAweEI4LCAweEE5LCAvKiAweEVDLTB4RUYgKi8KKwkweDgyLCAweDY5LCAweEJFLCAweEUzLCAweDgyLCAweDZBLCAweEQ5LCAweEJELCAvKiAweEYwLTB4RjMgKi8KKwkweDgyLCAweDZCLCAweDgyLCAweDZDLCAweDgyLCAweDZELCAweDgyLCAweDZFLCAvKiAweEY0LTB4RjcgKi8KKwkweEQ5LCAweEJBLCAweDgyLCAweDZGLCAweEIwLCAweEIzLCAweDgyLCAweDcwLCAvKiAweEY4LTB4RkIgKi8KKwkweDgyLCAweDcxLCAweDgyLCAweDcyLCAweEQ5LCAweEMyLCAweDgyLCAweDczLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181MFs1MTJdID0geworCTB4ODIsIDB4NzQsIDB4ODIsIDB4NzUsIDB4ODIsIDB4NzYsIDB4ODIsIDB4NzcsIC8qIDB4MDAtMHgwMyAqLworCTB4ODIsIDB4NzgsIDB4ODIsIDB4NzksIDB4ODIsIDB4N0EsIDB4ODIsIDB4N0IsIC8qIDB4MDQtMHgwNyAqLworCTB4ODIsIDB4N0MsIDB4ODIsIDB4N0QsIDB4ODIsIDB4N0UsIDB4ODIsIDB4ODAsIC8qIDB4MDgtMHgwQiAqLworCTB4RDksIDB4QzQsIDB4QjEsIDB4QjYsIDB4ODIsIDB4ODEsIDB4RDksIDB4QkYsIC8qIDB4MEMtMHgwRiAqLworCTB4ODIsIDB4ODIsIDB4ODIsIDB4ODMsIDB4QjUsIDB4QjksIDB4ODIsIDB4ODQsIC8qIDB4MTAtMHgxMyAqLworCTB4QkUsIDB4RjMsIDB4ODIsIDB4ODUsIDB4ODIsIDB4ODYsIDB4ODIsIDB4ODcsIC8qIDB4MTQtMHgxNyAqLworCTB4Q0MsIDB4QzgsIDB4QkEsIDB4RjIsIDB4RDIsIDB4RDAsIDB4ODIsIDB4ODgsIC8qIDB4MTgtMHgxQiAqLworCTB4RDksIDB4QzMsIDB4ODIsIDB4ODksIDB4ODIsIDB4OEEsIDB4QkQsIDB4RTgsIC8qIDB4MUMtMHgxRiAqLworCTB4ODIsIDB4OEIsIDB4QjMsIDB4QUIsIDB4ODIsIDB4OEMsIDB4ODIsIDB4OEQsIC8qIDB4MjAtMHgyMyAqLworCTB4ODIsIDB4OEUsIDB4RDksIDB4QzUsIDB4QkUsIDB4RUIsIDB4ODIsIDB4OEYsIC8qIDB4MjQtMHgyNyAqLworCTB4RDksIDB4QzYsIDB4RDksIDB4QkIsIDB4QzQsIDB4REYsIDB4ODIsIDB4OTAsIC8qIDB4MjgtMHgyQiAqLworCTB4RDksIDB4QkUsIDB4RDksIDB4QzEsIDB4RDksIDB4QzAsIDB4ODIsIDB4OTEsIC8qIDB4MkMtMHgyRiAqLworCTB4ODIsIDB4OTIsIDB4ODIsIDB4OTMsIDB4ODIsIDB4OTQsIDB4ODIsIDB4OTUsIC8qIDB4MzAtMHgzMyAqLworCTB4ODIsIDB4OTYsIDB4ODIsIDB4OTcsIDB4ODIsIDB4OTgsIDB4ODIsIDB4OTksIC8qIDB4MzQtMHgzNyAqLworCTB4ODIsIDB4OUEsIDB4ODIsIDB4OUIsIDB4RDUsIDB4QUUsIDB4ODIsIDB4OUMsIC8qIDB4MzgtMHgzQiAqLworCTB4RDYsIDB4QjUsIDB4ODIsIDB4OUQsIDB4QzcsIDB4RTMsIDB4ODIsIDB4OUUsIC8qIDB4M0MtMHgzRiAqLworCTB4ODIsIDB4OUYsIDB4ODIsIDB4QTAsIDB4ODIsIDB4QTEsIDB4RDksIDB4QzgsIC8qIDB4NDAtMHg0MyAqLworCTB4ODIsIDB4QTIsIDB4ODIsIDB4QTMsIDB4ODIsIDB4QTQsIDB4QkMsIDB4RDksIC8qIDB4NDQtMHg0NyAqLworCTB4RDksIDB4Q0EsIDB4ODIsIDB4QTUsIDB4ODIsIDB4QTYsIDB4ODIsIDB4QTcsIC8qIDB4NDgtMHg0QiAqLworCTB4RDksIDB4QkMsIDB4ODIsIDB4QTgsIDB4RDksIDB4Q0IsIDB4QzYsIDB4QUIsIC8qIDB4NEMtMHg0RiAqLworCTB4ODIsIDB4QTksIDB4ODIsIDB4QUEsIDB4ODIsIDB4QUIsIDB4ODIsIDB4QUMsIC8qIDB4NTAtMHg1MyAqLworCTB4ODIsIDB4QUQsIDB4RDksIDB4QzksIDB4ODIsIDB4QUUsIDB4ODIsIDB4QUYsIC8qIDB4NTQtMHg1NyAqLworCTB4ODIsIDB4QjAsIDB4ODIsIDB4QjEsIDB4RDcsIDB4RjYsIDB4ODIsIDB4QjIsIC8qIDB4NTgtMHg1QiAqLworCTB4Q0QsIDB4QTMsIDB4ODIsIDB4QjMsIDB4ODIsIDB4QjQsIDB4ODIsIDB4QjUsIC8qIDB4NUMtMHg1RiAqLworCTB4ODIsIDB4QjYsIDB4ODIsIDB4QjcsIDB4ODIsIDB4QjgsIDB4ODIsIDB4QjksIC8qIDB4NjAtMHg2MyAqLworCTB4ODIsIDB4QkEsIDB4QkQsIDB4QTEsIDB4ODIsIDB4QkIsIDB4ODIsIDB4QkMsIC8qIDB4NjQtMHg2NyAqLworCTB4ODIsIDB4QkQsIDB4ODIsIDB4QkUsIDB4ODIsIDB4QkYsIDB4ODIsIDB4QzAsIC8qIDB4NjgtMHg2QiAqLworCTB4RDksIDB4Q0MsIDB4ODIsIDB4QzEsIDB4ODIsIDB4QzIsIDB4ODIsIDB4QzMsIC8qIDB4NkMtMHg2RiAqLworCTB4ODIsIDB4QzQsIDB4ODIsIDB4QzUsIDB4ODIsIDB4QzYsIDB4ODIsIDB4QzcsIC8qIDB4NzAtMHg3MyAqLworCTB4ODIsIDB4QzgsIDB4ODIsIDB4QzksIDB4QzUsIDB4QkMsIDB4Q0QsIDB4QjUsIC8qIDB4NzQtMHg3NyAqLworCTB4ODIsIDB4Q0EsIDB4ODIsIDB4Q0IsIDB4ODIsIDB4Q0MsIDB4RDksIDB4Q0QsIC8qIDB4NzgtMHg3QiAqLworCTB4ODIsIDB4Q0QsIDB4ODIsIDB4Q0UsIDB4RDksIDB4QzcsIDB4QjMsIDB4QTUsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QkYsIDB4RkUsIDB4ODIsIDB4Q0YsIDB4ODIsIDB4RDAsIDB4ODIsIDB4RDEsIC8qIDB4ODAtMHg4MyAqLworCTB4ODIsIDB4RDIsIDB4QjgsIDB4QjUsIDB4ODIsIDB4RDMsIDB4ODIsIDB4RDQsIC8qIDB4ODQtMHg4NyAqLworCTB4QzAsIDB4RkMsIDB4ODIsIDB4RDUsIDB4ODIsIDB4RDYsIDB4ODIsIDB4RDcsIC8qIDB4ODgtMHg4QiAqLworCTB4ODIsIDB4RDgsIDB4QjAsIDB4RjgsIDB4ODIsIDB4RDksIDB4ODIsIDB4REEsIC8qIDB4OEMtMHg4RiAqLworCTB4ODIsIDB4REIsIDB4ODIsIDB4REMsIDB4ODIsIDB4REQsIDB4ODIsIDB4REUsIC8qIDB4OTAtMHg5MyAqLworCTB4ODIsIDB4REYsIDB4ODIsIDB4RTAsIDB4ODIsIDB4RTEsIDB4ODIsIDB4RTIsIC8qIDB4OTQtMHg5NyAqLworCTB4ODIsIDB4RTMsIDB4ODIsIDB4RTQsIDB4ODIsIDB4RTUsIDB4ODIsIDB4RTYsIC8qIDB4OTgtMHg5QiAqLworCTB4ODIsIDB4RTcsIDB4ODIsIDB4RTgsIDB4ODIsIDB4RTksIDB4ODIsIDB4RUEsIC8qIDB4OUMtMHg5RiAqLworCTB4ODIsIDB4RUIsIDB4ODIsIDB4RUMsIDB4ODIsIDB4RUQsIDB4QjQsIDB4RjYsIC8qIDB4QTAtMHhBMyAqLworCTB4ODIsIDB4RUUsIDB4RDksIDB4Q0UsIDB4ODIsIDB4RUYsIDB4RDksIDB4Q0YsIC8qIDB4QTQtMHhBNyAqLworCTB4QjQsIDB4QTIsIDB4RDksIDB4RDAsIDB4ODIsIDB4RjAsIDB4ODIsIDB4RjEsIC8qIDB4QTgtMHhBQiAqLworCTB4QjQsIDB4REYsIDB4ODIsIDB4RjIsIDB4ODIsIDB4RjMsIDB4ODIsIDB4RjQsIC8qIDB4QUMtMHhBRiAqLworCTB4ODIsIDB4RjUsIDB4ODIsIDB4RjYsIDB4QjAsIDB4QzEsIDB4ODIsIDB4RjcsIC8qIDB4QjAtMHhCMyAqLworCTB4ODIsIDB4RjgsIDB4ODIsIDB4RjksIDB4ODIsIDB4RkEsIDB4ODIsIDB4RkIsIC8qIDB4QjQtMHhCNyAqLworCTB4ODIsIDB4RkMsIDB4ODIsIDB4RkQsIDB4RDksIDB4RDEsIDB4QzksIDB4QjUsIC8qIDB4QjgtMHhCQiAqLworCTB4ODIsIDB4RkUsIDB4ODMsIDB4NDAsIDB4ODMsIDB4NDEsIDB4ODMsIDB4NDIsIC8qIDB4QkMtMHhCRiAqLworCTB4ODMsIDB4NDMsIDB4ODMsIDB4NDQsIDB4ODMsIDB4NDUsIDB4ODMsIDB4NDYsIC8qIDB4QzAtMHhDMyAqLworCTB4ODMsIDB4NDcsIDB4ODMsIDB4NDgsIDB4ODMsIDB4NDksIDB4ODMsIDB4NEEsIC8qIDB4QzQtMHhDNyAqLworCTB4ODMsIDB4NEIsIDB4ODMsIDB4NEMsIDB4ODMsIDB4NEQsIDB4ODMsIDB4NEUsIC8qIDB4QzgtMHhDQiAqLworCTB4ODMsIDB4NEYsIDB4ODMsIDB4NTAsIDB4ODMsIDB4NTEsIDB4Q0YsIDB4RjEsIC8qIDB4Q0MtMHhDRiAqLworCTB4ODMsIDB4NTIsIDB4ODMsIDB4NTMsIDB4ODMsIDB4NTQsIDB4ODMsIDB4NTUsIC8qIDB4RDAtMHhEMyAqLworCTB4ODMsIDB4NTYsIDB4ODMsIDB4NTcsIDB4RDksIDB4RDIsIDB4ODMsIDB4NTgsIC8qIDB4RDQtMHhENyAqLworCTB4ODMsIDB4NTksIDB4ODMsIDB4NUEsIDB4QzEsIDB4QzUsIDB4ODMsIDB4NUIsIC8qIDB4RDgtMHhEQiAqLworCTB4ODMsIDB4NUMsIDB4ODMsIDB4NUQsIDB4ODMsIDB4NUUsIDB4ODMsIDB4NUYsIC8qIDB4REMtMHhERiAqLworCTB4ODMsIDB4NjAsIDB4ODMsIDB4NjEsIDB4ODMsIDB4NjIsIDB4ODMsIDB4NjMsIC8qIDB4RTAtMHhFMyAqLworCTB4ODMsIDB4NjQsIDB4ODMsIDB4NjUsIDB4RDksIDB4RDYsIDB4QzksIDB4QUUsIC8qIDB4RTQtMHhFNyAqLworCTB4ODMsIDB4NjYsIDB4ODMsIDB4NjcsIDB4ODMsIDB4NjgsIDB4ODMsIDB4NjksIC8qIDB4RTgtMHhFQiAqLworCTB4RDksIDB4RDUsIDB4RDksIDB4RDQsIDB4RDksIDB4RDcsIDB4ODMsIDB4NkEsIC8qIDB4RUMtMHhFRiAqLworCTB4ODMsIDB4NkIsIDB4ODMsIDB4NkMsIDB4ODMsIDB4NkQsIDB4Q0IsIDB4REIsIC8qIDB4RjAtMHhGMyAqLworCTB4ODMsIDB4NkUsIDB4QkQsIDB4QTksIDB4ODMsIDB4NkYsIDB4ODMsIDB4NzAsIC8qIDB4RjQtMHhGNyAqLworCTB4ODMsIDB4NzEsIDB4ODMsIDB4NzIsIDB4ODMsIDB4NzMsIDB4QzYsIDB4QTcsIC8qIDB4RjgtMHhGQiAqLworCTB4ODMsIDB4NzQsIDB4ODMsIDB4NzUsIDB4ODMsIDB4NzYsIDB4ODMsIDB4NzcsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzUxWzUxMl0gPSB7CisJMHg4MywgMHg3OCwgMHg4MywgMHg3OSwgMHg4MywgMHg3QSwgMHg4MywgMHg3QiwgLyogMHgwMC0weDAzICovCisJMHg4MywgMHg3QywgMHg4MywgMHg3RCwgMHhEOSwgMHhEMywgMHhEOSwgMHhEOCwgLyogMHgwNC0weDA3ICovCisJMHg4MywgMHg3RSwgMHg4MywgMHg4MCwgMHg4MywgMHg4MSwgMHhEOSwgMHhEOSwgLyogMHgwOC0weDBCICovCisJMHg4MywgMHg4MiwgMHg4MywgMHg4MywgMHg4MywgMHg4NCwgMHg4MywgMHg4NSwgLyogMHgwQy0weDBGICovCisJMHg4MywgMHg4NiwgMHg4MywgMHg4NywgMHhDOCwgMHhFNSwgMHg4MywgMHg4OCwgLyogMHgxMC0weDEzICovCisJMHg4MywgMHg4OSwgMHg4MywgMHg4QSwgMHg4MywgMHg4QiwgMHg4MywgMHg4QywgLyogMHgxNC0weDE3ICovCisJMHg4MywgMHg4RCwgMHg4MywgMHg4RSwgMHg4MywgMHg4RiwgMHg4MywgMHg5MCwgLyogMHgxOC0weDFCICovCisJMHg4MywgMHg5MSwgMHg4MywgMHg5MiwgMHg4MywgMHg5MywgMHg4MywgMHg5NCwgLyogMHgxQy0weDFGICovCisJMHg4MywgMHg5NSwgMHhDMCwgMHhEQywgMHg4MywgMHg5NiwgMHg4MywgMHg5NywgLyogMHgyMC0weDIzICovCisJMHg4MywgMHg5OCwgMHg4MywgMHg5OSwgMHg4MywgMHg5QSwgMHg4MywgMHg5QiwgLyogMHgyNC0weDI3ICovCisJMHg4MywgMHg5QywgMHg4MywgMHg5RCwgMHg4MywgMHg5RSwgMHg4MywgMHg5RiwgLyogMHgyOC0weDJCICovCisJMHg4MywgMHhBMCwgMHg4MywgMHhBMSwgMHg4MywgMHhBMiwgMHg4MywgMHhBMywgLyogMHgyQy0weDJGICovCisJMHg4MywgMHhBNCwgMHg4MywgMHhBNSwgMHg4MywgMHhBNiwgMHg4MywgMHhBNywgLyogMHgzMC0weDMzICovCisJMHg4MywgMHhBOCwgMHg4MywgMHhBOSwgMHg4MywgMHhBQSwgMHg4MywgMHhBQiwgLyogMHgzNC0weDM3ICovCisJMHg4MywgMHhBQywgMHg4MywgMHhBRCwgMHg4MywgMHhBRSwgMHg4MywgMHhBRiwgLyogMHgzOC0weDNCICovCisJMHg4MywgMHhCMCwgMHg4MywgMHhCMSwgMHg4MywgMHhCMiwgMHhCNiwgMHhGOSwgLyogMHgzQy0weDNGICovCisJMHhEOCwgMHhBMywgMHhENCwgMHhDQSwgMHg4MywgMHhCMywgMHhENCwgMHhBQSwgLyogMHg0MC0weDQzICovCisJMHhEMCwgMHhENiwgMHhCMywgMHhFNCwgMHhENSwgMHhENywgMHg4MywgMHhCNCwgLyogMHg0NC0weDQ3ICovCisJMHhDRiwgMHhDOCwgMHhCOSwgMHhFMiwgMHg4MywgMHhCNSwgMHhCRiwgMHhDQiwgLyogMHg0OC0weDRCICovCisJMHg4MywgMHhCNiwgMHhDMywgMHhFMiwgMHg4MywgMHhCNywgMHg4MywgMHhCOCwgLyogMHg0Qy0weDRGICovCisJMHg4MywgMHhCOSwgMHhCNiwgMHhEMiwgMHg4MywgMHhCQSwgMHg4MywgMHhCQiwgLyogMHg1MC0weDUzICovCisJMHhDRCwgMHhDMywgMHhEOSwgMHhFRSwgMHhEOSwgMHhGMCwgMHg4MywgMHhCQywgLyogMHg1NC0weDU3ICovCisJMHg4MywgMHhCRCwgMHg4MywgMHhCRSwgMHhCNSwgMHhCMywgMHg4MywgMHhCRiwgLyogMHg1OC0weDVCICovCisJMHhCNiwgMHhCNSwgMHg4MywgMHhDMCwgMHg4MywgMHhDMSwgMHg4MywgMHhDMiwgLyogMHg1Qy0weDVGICovCisJMHg4MywgMHhDMywgMHg4MywgMHhDNCwgMHhCRSwgMHhBNCwgMHg4MywgMHhDNSwgLyogMHg2MC0weDYzICovCisJMHg4MywgMHhDNiwgMHhDOCwgMHhFQiwgMHg4MywgMHhDNywgMHg4MywgMHhDOCwgLyogMHg2NC0weDY3ICovCisJMHhDOCwgMHhBQiwgMHg4MywgMHhDOSwgMHg4MywgMHhDQSwgMHhCMCwgMHhDQiwgLyogMHg2OC0weDZCICovCisJMHhCOSwgMHhBQiwgMHhDMSwgMHhGOSwgMHhEOSwgMHhFMiwgMHg4MywgMHhDQiwgLyogMHg2Qy0weDZGICovCisJMHhDMCwgMHhCQywgMHhCOSwgMHhCMiwgMHg4MywgMHhDQywgMHhCOSwgMHhEOCwgLyogMHg3MC0weDczICovCisJMHhEMCwgMHhDQiwgMHhCMSwgMHhGOCwgMHhDNiwgMHhFNCwgMHhCRSwgMHhERiwgLyogMHg3NC0weDc3ICovCisJMHhCNSwgMHhFNCwgMHhENywgMHhDOCwgMHg4MywgMHhDRCwgMHhEMSwgMHhGOCwgLyogMHg3OC0weDdCICovCisJMHhCQywgMHhFNiwgMHhDQSwgMHhERSwgMHg4MywgMHhDRSwgMHg4MywgMHhDRiwgLyogMHg3Qy0weDdGICovCisJCisJMHhCQywgMHhCRCwgMHhEOSwgMHhFNiwgMHhEOCwgMHhFNywgMHg4MywgMHhEMCwgLyogMHg4MC0weDgzICovCisJMHg4MywgMHhEMSwgMHhDNCwgMHhEQSwgMHg4MywgMHhEMiwgMHg4MywgMHhEMywgLyogMHg4NC0weDg3ICovCisJMHhCOCwgMHhENCwgMHhDOCwgMHhCRCwgMHg4MywgMHhENCwgMHg4MywgMHhENSwgLyogMHg4OC0weDhCICovCisJMHhCMiwgMHhFMSwgMHhENCwgMHhEOSwgMHg4MywgMHhENiwgMHg4MywgMHhENywgLyogMHg4Qy0weDhGICovCisJMHg4MywgMHhEOCwgMHg4MywgMHhEOSwgMHhDMywgMHhCMCwgMHg4MywgMHhEQSwgLyogMHg5MC0weDkzICovCisJMHg4MywgMHhEQiwgMHhDMywgMHhFMSwgMHhEQSwgMHhBMiwgMHhDOCwgMHhERiwgLyogMHg5NC0weDk3ICovCisJMHg4MywgMHhEQywgMHhEMCwgMHhCNCwgMHg4MywgMHhERCwgMHhCRSwgMHhGQywgLyogMHg5OC0weDlCICovCisJMHhDNSwgMHhBOSwgMHg4MywgMHhERSwgMHg4MywgMHhERiwgMHg4MywgMHhFMCwgLyogMHg5Qy0weDlGICovCisJMHhCOSwgMHhEQSwgMHg4MywgMHhFMSwgMHhEQSwgMHhBMywgMHg4MywgMHhFMiwgLyogMHhBMC0weEEzICovCisJMHhENCwgMHhBOSwgMHhEQSwgMHhBNCwgMHg4MywgMHhFMywgMHg4MywgMHhFNCwgLyogMHhBNC0weEE3ICovCisJMHg4MywgMHhFNSwgMHg4MywgMHhFNiwgMHg4MywgMHhFNywgMHhEOSwgMHhGQiwgLyogMHhBOC0weEFCICovCisJMHhCNiwgMHhBQywgMHg4MywgMHhFOCwgMHg4MywgMHhFOSwgMHhCNywgMHhFQiwgLyogMHhBQy0weEFGICovCisJMHhCMSwgMHhGOSwgMHhEOSwgMHhGQywgMHhCMywgMHhFNSwgMHhCRSwgMHhGNiwgLyogMHhCMC0weEIzICovCisJMHg4MywgMHhFQSwgMHhCRiwgMHhGNiwgMHhEMiwgMHhCMSwgMHhDMCwgMHhFNCwgLyogMHhCNC0weEI3ICovCisJMHg4MywgMHhFQiwgMHg4MywgMHhFQywgMHg4MywgMHhFRCwgMHhCNiwgMHhCMywgLyogMHhCOC0weEJCICovCisJMHhEOSwgMHhGRSwgMHhEOSwgMHhGRCwgMHg4MywgMHhFRSwgMHg4MywgMHhFRiwgLyogMHhCQy0weEJGICovCisJMHhCRSwgMHhCQiwgMHg4MywgMHhGMCwgMHg4MywgMHhGMSwgMHg4MywgMHhGMiwgLyogMHhDMC0weEMzICovCisJMHhDNiwgMHhFMCwgMHg4MywgMHhGMywgMHhENywgMHhCQywgMHhEQSwgMHhBMSwgLyogMHhDNC0weEM3ICovCisJMHg4MywgMHhGNCwgMHhDMSwgMHhCOSwgMHg4MywgMHhGNSwgMHhCNSwgMHhGMiwgLyogMHhDOC0weENCICovCisJMHhDMSwgMHhFOCwgMHg4MywgMHhGNiwgMHg4MywgMHhGNywgMHhCQywgMHhGNSwgLyogMHhDQy0weENGICovCisJMHg4MywgMHhGOCwgMHhCNCwgMHhENSwgMHg4MywgMHhGOSwgMHg4MywgMHhGQSwgLyogMHhEMC0weEQzICovCisJMHg4MywgMHhGQiwgMHg4MywgMHhGQywgMHg4MywgMHhGRCwgMHg4MywgMHhGRSwgLyogMHhENC0weEQ3ICovCisJMHg4NCwgMHg0MCwgMHg4NCwgMHg0MSwgMHg4NCwgMHg0MiwgMHhDMSwgMHhERCwgLyogMHhEOC0weERCICovCisJMHg4NCwgMHg0MywgMHhDNCwgMHhGRCwgMHg4NCwgMHg0NCwgMHg4NCwgMHg0NSwgLyogMHhEQy0weERGICovCisJMHhCQywgMHhCOCwgMHhCNywgMHhCMiwgMHg4NCwgMHg0NiwgMHg4NCwgMHg0NywgLyogMHhFMC0weEUzICovCisJMHhCNywgMHhFRiwgMHg4NCwgMHg0OCwgMHg4NCwgMHg0OSwgMHg4NCwgMHg0QSwgLyogMHhFNC0weEU3ICovCisJMHg4NCwgMHg0QiwgMHg4NCwgMHg0QywgMHg4NCwgMHg0RCwgMHhEOSwgMHhFQywgLyogMHhFOC0weEVCICovCisJMHg4NCwgMHg0RSwgMHhDNiwgMHhCRSwgMHg4NCwgMHg0RiwgMHhCRiwgMHhBRCwgLyogMHhFQy0weEVGICovCisJMHhCQiwgMHhDQiwgMHg4NCwgMHg1MCwgMHg4NCwgMHg1MSwgMHhCNSwgMHhDQSwgLyogMHhGMC0weEYzICovCisJMHg4NCwgMHg1MiwgMHhEQiwgMHhDOSwgMHhEMCwgMHhENywgMHg4NCwgMHg1MywgLyogMHhGNC0weEY3ICovCisJMHhDRCwgMHhCOSwgMHhCMCwgMHhCQywgMHhCMywgMHhGNiwgMHhCQiwgMHhGNywgLyogMHhGOC0weEZCICovCisJMHhEQiwgMHhDQSwgMHhCQSwgMHhBRiwgMHg4NCwgMHg1NCwgMHhENCwgMHhFNCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNTJbNTEyXSA9IHsKKwkweEI1LCAweEI2LCAweEI1LCAweEYzLCAweEQ4LCAweEQ2LCAweEM4LCAweEQwLCAvKiAweDAwLTB4MDMgKi8KKwkweDg0LCAweDU1LCAweDg0LCAweDU2LCAweEI3LCAweEQ2LCAweEM3LCAweEQwLCAvKiAweDA0LTB4MDcgKi8KKwkweEQ4LCAweEQ3LCAweDg0LCAweDU3LCAweEJGLCAweEFGLCAweDg0LCAweDU4LCAvKiAweDA4LTB4MEIgKi8KKwkweDg0LCAweDU5LCAweERCLCAweEJCLCAweEQ4LCAweEQ4LCAweDg0LCAweDVBLCAvKiAweDBDLTB4MEYgKi8KKwkweDg0LCAweDVCLCAweEQwLCAweENDLCAweEJCLCAweEFFLCAweDg0LCAweDVDLCAvKiAweDEwLTB4MTMgKi8KKwkweDg0LCAweDVELCAweDg0LCAweDVFLCAweEVCLCAweEJFLCAweEMxLCAweEQwLCAvKiAweDE0LTB4MTcgKi8KKwkweEMxLCAweEY1LCAweEQ0LCAweEYyLCAweEI4LCAweEQ1LCAweEI0LCAweEI0LCAvKiAweDE4LTB4MUIgKi8KKwkweDg0LCAweDVGLCAweEIzLCAweEY1LCAweDg0LCAweDYwLCAweDg0LCAweDYxLCAvKiAweDFDLTB4MUYgKi8KKwkweEM5LCAweEJFLCAweDg0LCAweDYyLCAweDg0LCAweDYzLCAweDg0LCAweDY0LCAvKiAweDIwLTB4MjMgKi8KKwkweEM1LCAweEQwLCAweDg0LCAweDY1LCAweDg0LCAweDY2LCAweDg0LCAweDY3LCAvKiAweDI0LTB4MjcgKi8KKwkweEM1LCAweEQ5LCAweEMwLCAweEZCLCAweDg0LCAweDY4LCAweEIxLCAweEYwLCAvKiAweDI4LTB4MkIgKi8KKwkweDg0LCAweDY5LCAweEQ4LCAweEQ5LCAweEI5LCAweENFLCAweDg0LCAweDZBLCAvKiAweDJDLTB4MkYgKi8KKwkweEI1LCAweEJELCAweDg0LCAweDZCLCAweDg0LCAweDZDLCAweEQ4LCAweERBLCAvKiAweDMwLTB4MzMgKi8KKwkweDg0LCAweDZELCAweDg0LCAweDZFLCAweEQ2LCAweEM2LCAweENCLCAweEEyLCAvKiAweDM0LTB4MzcgKi8KKwkweEM4LCAweEFGLCAweEM5LCAweEIyLCAweEI0LCAweENDLCAweEJGLCAweENDLCAvKiAweDM4LTB4M0IgKi8KKwkweDg0LCAweDZGLCAweEI5LCAweEY0LCAweDg0LCAweDcwLCAweEQ4LCAweERCLCAvKiAweDNDLTB4M0YgKi8KKwkweEQ4LCAweERDLCAweEI2LCAweEU3LCAweEJDLCAweEMxLCAweENDLCAweEVBLCAvKiAweDQwLTB4NDMgKi8KKwkweDg0LCAweDcxLCAweDg0LCAweDcyLCAweDg0LCAweDczLCAweDg0LCAweDc0LCAvKiAweDQ0LTB4NDcgKi8KKwkweDg0LCAweDc1LCAweDg0LCAweDc2LCAweENGLCAweEY3LCAweDg0LCAweDc3LCAvKiAweDQ4LTB4NEIgKi8KKwkweEQ4LCAweERELCAweEM3LCAweEIwLCAweDg0LCAweDc4LCAweDg0LCAweDc5LCAvKiAweDRDLTB4NEYgKi8KKwkweEI5LCAweEQwLCAweEJELCAweEEzLCAweDg0LCAweDdBLCAweDg0LCAweDdCLCAvKiAweDUwLTB4NTMgKi8KKwkweENDLCAweERFLCAweDg0LCAweDdDLCAweEM2LCAweENBLCAweDg0LCAweDdELCAvKiAweDU0LTB4NTcgKi8KKwkweDg0LCAweDdFLCAweDg0LCAweDgwLCAweDg0LCAweDgxLCAweDg0LCAweDgyLCAvKiAweDU4LTB4NUIgKi8KKwkweEQ4LCAweEUwLCAweDg0LCAweDgzLCAweEQ4LCAweERFLCAweDg0LCAweDg0LCAvKiAweDVDLTB4NUYgKi8KKwkweDg0LCAweDg1LCAweEQ4LCAweERGLCAweDg0LCAweDg2LCAweDg0LCAweDg3LCAvKiAweDYwLTB4NjMgKi8KKwkweDg0LCAweDg4LCAweEIwLCAweEZFLCAweDg0LCAweDg5LCAweEJFLCAweEU3LCAvKiAweDY0LTB4NjcgKi8KKwkweDg0LCAweDhBLCAweENBLCAweEEzLCAweEJDLCAweEY0LCAweDg0LCAweDhCLCAvKiAweDY4LTB4NkIgKi8KKwkweDg0LCAweDhDLCAweDg0LCAweDhELCAweDg0LCAweDhFLCAweEI4LCAweEIxLCAvKiAweDZDLTB4NkYgKi8KKwkweDg0LCAweDhGLCAweDg0LCAweDkwLCAweEI4LCAweEVFLCAweDg0LCAweDkxLCAvKiAweDcwLTB4NzMgKi8KKwkweDg0LCAweDkyLCAweDg0LCAweDkzLCAweDg0LCAweDk0LCAweDg0LCAweDk1LCAvKiAweDc0LTB4NzcgKi8KKwkweDg0LCAweDk2LCAweDg0LCAweDk3LCAweDg0LCAweDk4LCAweDg0LCAweDk5LCAvKiAweDc4LTB4N0IgKi8KKwkweDg0LCAweDlBLCAweEQ4LCAweEUyLCAweDg0LCAweDlCLCAweEJELCAweENCLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDg0LCAweDlDLCAweEQ4LCAweEU0LCAweEQ4LCAweEUzLCAweDg0LCAweDlELCAvKiAweDgwLTB4ODMgKi8KKwkweDg0LCAweDlFLCAweDg0LCAweDlGLCAweDg0LCAweEEwLCAweDg0LCAweEExLCAvKiAweDg0LTB4ODcgKi8KKwkweEM1LCAweEZDLCAweDg0LCAweEEyLCAweDg0LCAweEEzLCAweDg0LCAweEE0LCAvKiAweDg4LTB4OEIgKi8KKwkweDg0LCAweEE1LCAweDg0LCAweEE2LCAweDg0LCAweEE3LCAweDg0LCAweEE4LCAvKiAweDhDLTB4OEYgKi8KKwkweEQ4LCAweEU1LCAweDg0LCAweEE5LCAweDg0LCAweEFBLCAweEQ4LCAweEU2LCAvKiAweDkwLTB4OTMgKi8KKwkweDg0LCAweEFCLCAweDg0LCAweEFDLCAweDg0LCAweEFELCAweDg0LCAweEFFLCAvKiAweDk0LTB4OTcgKi8KKwkweDg0LCAweEFGLCAweDg0LCAweEIwLCAweDg0LCAweEIxLCAweEMxLCAweEE2LCAvKiAweDk4LTB4OUIgKi8KKwkweDg0LCAweEIyLCAweEM4LCAweEIwLCAweEIwLCAweEVDLCAweEI5LCAweEE2LCAvKiAweDlDLTB4OUYgKi8KKwkweEJDLCAweEQzLCAweENFLCAweEYxLCAweERCLCAweEJELCAweEMxLCAweEQzLCAvKiAweEEwLTB4QTMgKi8KKwkweDg0LCAweEIzLCAweDg0LCAweEI0LCAweDg0LCAweEI1LCAweDg0LCAweEI2LCAvKiAweEE0LTB4QTcgKi8KKwkweEI2LCAweEFGLCAweEQ2LCAweEZBLCAweEM1LCAweEFDLCAweEJELCAweEQ5LCAvKiAweEE4LTB4QUIgKi8KKwkweERCLCAweEJFLCAweERCLCAweEJGLCAweDg0LCAweEI3LCAweDg0LCAweEI4LCAvKiAweEFDLTB4QUYgKi8KKwkweDg0LCAweEI5LCAweEMwLCAweEY4LCAweEJFLCAweEEyLCAweEMwLCAweENELCAvKiAweEIwLTB4QjMgKi8KKwkweDg0LCAweEJBLCAweDg0LCAweEJCLCAweDg0LCAweEJDLCAweDg0LCAweEJELCAvKiAweEI0LTB4QjcgKi8KKwkweDg0LCAweEJFLCAweDg0LCAweEJGLCAweDg0LCAweEMwLCAweDg0LCAweEMxLCAvKiAweEI4LTB4QkIgKi8KKwkweDg0LCAweEMyLCAweDg0LCAweEMzLCAweERCLCAweEMwLCAweENBLCAweEM2LCAvKiAweEJDLTB4QkYgKi8KKwkweDg0LCAweEM0LCAweDg0LCAweEM1LCAweDg0LCAweEM2LCAweEIyLCAweEFBLCAvKiAweEMwLTB4QzMgKi8KKwkweDg0LCAweEM3LCAweDg0LCAweEM4LCAweDg0LCAweEM5LCAweEQzLCAweEMyLCAvKiAweEM0LTB4QzcgKi8KKwkweDg0LCAweENBLCAweEMzLCAweEUzLCAweDg0LCAweENCLCAweEQxLCAweEFCLCAvKiAweEM4LTB4Q0IgKi8KKwkweDg0LCAweENDLCAweDg0LCAweENELCAweDg0LCAweENFLCAweDg0LCAweENGLCAvKiAweENDLTB4Q0YgKi8KKwkweERCLCAweEMyLCAweDg0LCAweEQwLCAweEMwLCAweEQ1LCAweDg0LCAweEQxLCAvKiAweEQwLTB4RDMgKi8KKwkweDg0LCAweEQyLCAweDg0LCAweEQzLCAweERCLCAweEMzLCAweDg0LCAweEQ0LCAvKiAweEQ0LTB4RDcgKi8KKwkweEJGLCAweEIxLCAweDg0LCAweEQ1LCAweDg0LCAweEQ2LCAweDg0LCAweEQ3LCAvKiAweEQ4LTB4REIgKi8KKwkweDg0LCAweEQ4LCAweDg0LCAweEQ5LCAweDg0LCAweERBLCAweEM0LCAweEJDLCAvKiAweERDLTB4REYgKi8KKwkweDg0LCAweERCLCAweDg0LCAweERDLCAweDg0LCAweERELCAweDg0LCAweERFLCAvKiAweEUwLTB4RTMgKi8KKwkweEM3LCAweERBLCAweDg0LCAweERGLCAweDg0LCAweEUwLCAweDg0LCAweEUxLCAvKiAweEU0LTB4RTcgKi8KKwkweDg0LCAweEUyLCAweDg0LCAweEUzLCAweDg0LCAweEU0LCAweDg0LCAweEU1LCAvKiAweEU4LTB4RUIgKi8KKwkweDg0LCAweEU2LCAweDg0LCAweEU3LCAweDg0LCAweEU4LCAweDg0LCAweEU5LCAvKiAweEVDLTB4RUYgKi8KKwkweERCLCAweEM0LCAweDg0LCAweEVBLCAweDg0LCAweEVCLCAweDg0LCAweEVDLCAvKiAweEYwLTB4RjMgKi8KKwkweDg0LCAweEVELCAweDg0LCAweEVFLCAweDg0LCAweEVGLCAweDg0LCAweEYwLCAvKiAweEY0LTB4RjcgKi8KKwkweDg0LCAweEYxLCAweEQ5LCAweEU4LCAweEM5LCAweEQ3LCAweDg0LCAweEYyLCAvKiAweEY4LTB4RkIgKi8KKwkweDg0LCAweEYzLCAweDg0LCAweEY0LCAweEI5LCAweEI0LCAweENFLCAweEYwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181M1s1MTJdID0geworCTB4RDQsIDB4QzgsIDB4ODQsIDB4RjUsIDB4ODQsIDB4RjYsIDB4ODQsIDB4RjcsIC8qIDB4MDAtMHgwMyAqLworCTB4ODQsIDB4RjgsIDB4QjAsIDB4RkMsIDB4QjQsIDB4RDIsIDB4ODQsIDB4RjksIC8qIDB4MDQtMHgwNyAqLworCTB4RDAsIDB4RDksIDB4ODQsIDB4RkEsIDB4ODQsIDB4RkIsIDB4ODQsIDB4RkMsIC8qIDB4MDgtMHgwQiAqLworCTB4ODQsIDB4RkQsIDB4RDksIDB4RTksIDB4ODQsIDB4RkUsIDB4REUsIDB4Q0IsIC8qIDB4MEMtMHgwRiAqLworCTB4RDksIDB4RUIsIDB4ODUsIDB4NDAsIDB4ODUsIDB4NDEsIDB4ODUsIDB4NDIsIC8qIDB4MTAtMHgxMyAqLworCTB4ODUsIDB4NDMsIDB4RDgsIDB4QjAsIDB4QkIsIDB4QUYsIDB4QjEsIDB4QjEsIC8qIDB4MTQtMHgxNyAqLworCTB4ODUsIDB4NDQsIDB4QjMsIDB4RDcsIDB4RDgsIDB4Q0UsIDB4ODUsIDB4NDUsIC8qIDB4MTgtMHgxQiAqLworCTB4ODUsIDB4NDYsIDB4RDQsIDB4RDEsIDB4ODUsIDB4NDcsIDB4ODUsIDB4NDgsIC8qIDB4MUMtMHgxRiAqLworCTB4QkQsIDB4QjMsIDB4QkYsIDB4RUYsIDB4ODUsIDB4NDksIDB4Q0YsIDB4QkIsIC8qIDB4MjAtMHgyMyAqLworCTB4ODUsIDB4NEEsIDB4ODUsIDB4NEIsIDB4RDgsIDB4RDAsIDB4ODUsIDB4NEMsIC8qIDB4MjQtMHgyNyAqLworCTB4ODUsIDB4NEQsIDB4ODUsIDB4NEUsIDB4QjcsIDB4Q0IsIDB4ODUsIDB4NEYsIC8qIDB4MjgtMHgyQiAqLworCTB4ODUsIDB4NTAsIDB4ODUsIDB4NTEsIDB4RDgsIDB4RDEsIDB4ODUsIDB4NTIsIC8qIDB4MkMtMHgyRiAqLworCTB4ODUsIDB4NTMsIDB4ODUsIDB4NTQsIDB4ODUsIDB4NTUsIDB4ODUsIDB4NTYsIC8qIDB4MzAtMHgzMyAqLworCTB4ODUsIDB4NTcsIDB4ODUsIDB4NTgsIDB4ODUsIDB4NTksIDB4ODUsIDB4NUEsIC8qIDB4MzQtMHgzNyAqLworCTB4ODUsIDB4NUIsIDB4QzYsIDB4QTUsIDB4QzcsIDB4RjgsIDB4RDIsIDB4QkQsIC8qIDB4MzgtMHgzQiAqLworCTB4ODUsIDB4NUMsIDB4ODUsIDB4NUQsIDB4RDgsIDB4RDIsIDB4QzQsIDB4RTQsIC8qIDB4M0MtMHgzRiAqLworCTB4ODUsIDB4NUUsIDB4Q0EsIDB4QUUsIDB4ODUsIDB4NUYsIDB4QzcsIDB4QTcsIC8qIDB4NDAtMHg0MyAqLworCTB4ODUsIDB4NjAsIDB4RDgsIDB4QTYsIDB4ODUsIDB4NjEsIDB4QzksIDB4RkQsIC8qIDB4NDQtMHg0NyAqLworCTB4Q0UsIDB4RTcsIDB4QkIsIDB4REMsIDB4QjAsIDB4RUIsIDB4ODUsIDB4NjIsIC8qIDB4NDgtMHg0QiAqLworCTB4ODUsIDB4NjMsIDB4ODUsIDB4NjQsIDB4QkIsIDB4QUEsIDB4RDAsIDB4QUQsIC8qIDB4NEMtMHg0RiAqLworCTB4ODUsIDB4NjUsIDB4QjEsIDB4QjAsIDB4RDcsIDB4RTQsIDB4RDcsIDB4QkYsIC8qIDB4NTAtMHg1MyAqLworCTB4ODUsIDB4NjYsIDB4QjUsIDB4QTUsIDB4QzIsIDB4RjQsIDB4QzQsIDB4Q0YsIC8qIDB4NTQtMHg1NyAqLworCTB4ODUsIDB4NjcsIDB4ODUsIDB4NjgsIDB4QjIsIDB4QTksIDB4ODUsIDB4NjksIC8qIDB4NTgtMHg1QiAqLworCTB4QjIsIDB4QjcsIDB4ODUsIDB4NkEsIDB4QjEsIDB4RTUsIDB4REYsIDB4QjIsIC8qIDB4NUMtMHg1RiAqLworCTB4RDUsIDB4QkMsIDB4QkYsIDB4QTgsIDB4QzIsIDB4QUMsIDB4RDgsIDB4RDUsIC8qIDB4NjAtMHg2MyAqLworCTB4QzIsIDB4QjEsIDB4ODUsIDB4NkIsIDB4RDgsIDB4RDQsIDB4Q0UsIDB4RDQsIC8qIDB4NjQtMHg2NyAqLworCTB4ODUsIDB4NkMsIDB4REEsIDB4RTAsIDB4ODUsIDB4NkQsIDB4Q0UsIDB4QzAsIC8qIDB4NjgtMHg2QiAqLworCTB4ODUsIDB4NkUsIDB4ODUsIDB4NkYsIDB4RDgsIDB4QjQsIDB4QzMsIDB4QUUsIC8qIDB4NkMtMHg2RiAqLworCTB4RDMsIDB4QTEsIDB4Q0UsIDB4QTMsIDB4ODUsIDB4NzAsIDB4QkMsIDB4QjQsIC8qIDB4NzAtMHg3MyAqLworCTB4QzgsIDB4QjQsIDB4QzIsIDB4RDEsIDB4ODUsIDB4NzEsIDB4QkUsIDB4RUQsIC8qIDB4NzQtMHg3NyAqLworCTB4RDAsIDB4QjYsIDB4ODUsIDB4NzIsIDB4REEsIDB4RTEsIDB4ODUsIDB4NzMsIC8qIDB4NzgtMHg3QiAqLworCTB4ODUsIDB4NzQsIDB4ODUsIDB4NzUsIDB4ODUsIDB4NzYsIDB4QzcsIDB4RTQsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4ODUsIDB4NzcsIDB4ODUsIDB4NzgsIDB4QjMsIDB4QTcsIDB4ODUsIDB4NzksIC8qIDB4ODAtMHg4MyAqLworCTB4QjYsIDB4RjIsIDB4Q0MsIDB4RkMsIDB4QzAsIDB4RkEsIDB4ODUsIDB4N0EsIC8qIDB4ODQtMHg4NyAqLworCTB4ODUsIDB4N0IsIDB4QzAsIDB4RjcsIDB4ODUsIDB4N0MsIDB4RDEsIDB4QjksIC8qIDB4ODgtMHg4QiAqLworCTB4RDEsIDB4RTEsIDB4RDgsIDB4QzcsIDB4ODUsIDB4N0QsIDB4ODUsIDB4N0UsIC8qIDB4OEMtMHg4RiAqLworCTB4ODUsIDB4ODAsIDB4ODUsIDB4ODEsIDB4ODUsIDB4ODIsIDB4ODUsIDB4ODMsIC8qIDB4OTAtMHg5MyAqLworCTB4ODUsIDB4ODQsIDB4QjIsIDB4REUsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODYsIC8qIDB4OTQtMHg5NyAqLworCTB4QzAsIDB4RTUsIDB4ODUsIDB4ODcsIDB4QkEsIDB4RjEsIDB4ODUsIDB4ODgsIC8qIDB4OTgtMHg5QiAqLworCTB4ODUsIDB4ODksIDB4RDgsIDB4QzgsIDB4ODUsIDB4OEEsIDB4RDQsIDB4QUQsIC8qIDB4OUMtMHg5RiAqLworCTB4ODUsIDB4OEIsIDB4ODUsIDB4OEMsIDB4Q0YsIDB4RTEsIDB4RDgsIDB4QzksIC8qIDB4QTAtMHhBMyAqLworCTB4ODUsIDB4OEQsIDB4RDgsIDB4Q0EsIDB4Q0YsIDB4QzMsIDB4ODUsIDB4OEUsIC8qIDB4QTQtMHhBNyAqLworCTB4QjMsIDB4RjgsIDB4QkUsIDB4QzcsIDB4ODUsIDB4OEYsIDB4ODUsIDB4OTAsIC8qIDB4QTgtMHhBQiAqLworCTB4ODUsIDB4OTEsIDB4ODUsIDB4OTIsIDB4RDgsIDB4Q0IsIDB4ODUsIDB4OTMsIC8qIDB4QUMtMHhBRiAqLworCTB4ODUsIDB4OTQsIDB4ODUsIDB4OTUsIDB4ODUsIDB4OTYsIDB4ODUsIDB4OTcsIC8qIDB4QjAtMHhCMyAqLworCTB4ODUsIDB4OTgsIDB4ODUsIDB4OTksIDB4REIsIDB4Q0MsIDB4ODUsIDB4OUEsIC8qIDB4QjQtMHhCNyAqLworCTB4ODUsIDB4OUIsIDB4ODUsIDB4OUMsIDB4ODUsIDB4OUQsIDB4QzgsIDB4QTUsIC8qIDB4QjgtMHhCQiAqLworCTB4ODUsIDB4OUUsIDB4ODUsIDB4OUYsIDB4ODUsIDB4QTAsIDB4Q0YsIDB4RDgsIC8qIDB4QkMtMHhCRiAqLworCTB4ODUsIDB4QTEsIDB4QzgsIDB4RkUsIDB4QjIsIDB4Q0UsIDB4ODUsIDB4QTIsIC8qIDB4QzAtMHhDMyAqLworCTB4ODUsIDB4QTMsIDB4ODUsIDB4QTQsIDB4ODUsIDB4QTUsIDB4ODUsIDB4QTYsIC8qIDB4QzQtMHhDNyAqLworCTB4RDMsIDB4RDYsIDB4QjIsIDB4RTYsIDB4QkMsIDB4QjAsIDB4RDMsIDB4RDEsIC8qIDB4QzgtMHhDQiAqLworCTB4Q0IsIDB4QUIsIDB4QjcsIDB4QjQsIDB4ODUsIDB4QTcsIDB4ODUsIDB4QTgsIC8qIDB4Q0MtMHhDRiAqLworCTB4ODUsIDB4QTksIDB4QjcsIDB4QTIsIDB4ODUsIDB4QUEsIDB4ODUsIDB4QUIsIC8qIDB4RDAtMHhEMyAqLworCTB4Q0EsIDB4RTUsIDB4ODUsIDB4QUMsIDB4QzgsIDB4QTEsIDB4Q0EsIDB4REMsIC8qIDB4RDQtMHhENyAqLworCTB4QjEsIDB4RTQsIDB4RDAsIDB4RjAsIDB4ODUsIDB4QUQsIDB4QzUsIDB4RDEsIC8qIDB4RDgtMHhEQiAqLworCTB4ODUsIDB4QUUsIDB4ODUsIDB4QUYsIDB4ODUsIDB4QjAsIDB4REIsIDB4QzUsIC8qIDB4REMtMHhERiAqLworCTB4QjUsIDB4RkUsIDB4ODUsIDB4QjEsIDB4ODUsIDB4QjIsIDB4QkYsIDB4REEsIC8qIDB4RTAtMHhFMyAqLworCTB4QjksIDB4QzUsIDB4QkUsIDB4RTQsIDB4QzEsIDB4RUQsIDB4ODUsIDB4QjMsIC8qIDB4RTQtMHhFNyAqLworCTB4REYsIDB4QjYsIDB4REYsIDB4QjUsIDB4RDYsIDB4QkIsIDB4QkQsIDB4RDAsIC8qIDB4RTgtMHhFQiAqLworCTB4RDUsIDB4RDksIDB4QjAsIDB4QzgsIDB4QjYsIDB4QTMsIDB4QkYsIDB4QzksIC8qIDB4RUMtMHhFRiAqLworCTB4Q0MsIDB4QTgsIDB4REYsIDB4QjMsIDB4Q0EsIDB4QjcsIDB4RDMsIDB4RDIsIC8qIDB4RjAtMHhGMyAqLworCTB4ODUsIDB4QjQsIDB4RDgsIDB4Q0YsIDB4RDIsIDB4QjYsIDB4QkEsIDB4QzUsIC8qIDB4RjQtMHhGNyAqLworCTB4Q0IsIDB4QkUsIDB4Q0MsIDB4QkUsIDB4ODUsIDB4QjUsIDB4REYsIDB4QjcsIC8qIDB4RjgtMHhGQiAqLworCTB4QjUsIDB4RjAsIDB4REYsIDB4QjQsIDB4ODUsIDB4QjYsIDB4ODUsIDB4QjcsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzU0WzUxMl0gPSB7CisJMHg4NSwgMHhCOCwgMHhEMywgMHhGNSwgMHg4NSwgMHhCOSwgMHhCMywgMHhENCwgLyogMHgwMC0weDAzICovCisJMHhCOCwgMHhGNywgMHg4NSwgMHhCQSwgMHhERiwgMHhCQSwgMHg4NSwgMHhCQiwgLyogMHgwNC0weDA3ICovCisJMHhCQSwgMHhDRiwgMHhCQywgMHhBQSwgMHhCNSwgMHhGNSwgMHg4NSwgMHhCQywgLyogMHgwOC0weDBCICovCisJMHhDRCwgMHhBQywgMHhDMywgMHhGQiwgMHhCQSwgMHhGMywgMHhDMCwgMHhGNCwgLyogMHgwQy0weDBGICovCisJMHhDRCwgMHhDMiwgMHhDRiwgMHhGMiwgMHhERiwgMHhCOCwgMHhDRiwgMHhDNSwgLyogMHgxMC0weDEzICovCisJMHg4NSwgMHhCRCwgMHhDMiwgMHhDMCwgMHhERiwgMHhCOSwgMHhDMiwgMHhGMCwgLyogMHgxNC0weDE3ICovCisJMHg4NSwgMHhCRSwgMHg4NSwgMHhCRiwgMHg4NSwgMHhDMCwgMHhCRSwgMHhGRCwgLyogMHgxOC0weDFCICovCisJMHg4NSwgMHhDMSwgMHhDMSwgMHhERiwgMHhDRCwgMHhDQywgMHhEMiwgMHhGNywgLyogMHgxQy0weDFGICovCisJMHhCNywgMHhDRCwgMHhERiwgMHhDMSwgMHg4NSwgMHhDMiwgMHhERiwgMHhDNCwgLyogMHgyMC0weDIzICovCisJMHg4NSwgMHhDMywgMHg4NSwgMHhDNCwgMHhCNywgMHhGMSwgMHhCMCwgMHhDOSwgLyogMHgyNC0weDI3ICovCisJMHhCNiwgMHhENiwgMHhCNywgMHhENCwgMHg4NSwgMHhDNSwgMHhCQSwgMHhBQywgLyogMHgyOC0weDJCICovCisJMHhDQywgMHhGRCwgMHhCRiwgMHhENCwgMHhDQiwgMHhCMSwgMHhDNiwgMHhGNCwgLyogMHgyQy0weDJGICovCisJMHg4NSwgMHhDNiwgMHhENiwgMHhBOCwgMHhERiwgMHhDNSwgMHg4NSwgMHhDNywgLyogMHgzMC0weDMzICovCisJMHhDRSwgMHhFMiwgMHhCMywgMHhCMywgMHg4NSwgMHhDOCwgMHg4NSwgMHhDOSwgLyogMHgzNC0weDM3ICovCisJMHhDRSwgMHhGQywgMHhCNCwgMHhCNSwgMHg4NSwgMHhDQSwgMHhDRSwgMHhDNywgLyogMHgzOC0weDNCICovCisJMHhCQSwgMHhGMCwgMHg4NSwgMHhDQiwgMHhDRSwgMHhFMSwgMHg4NSwgMHhDQywgLyogMHgzQy0weDNGICovCisJMHhEMSwgMHhCRCwgMHg4NSwgMHhDRCwgMHg4NSwgMHhDRSwgMHhERiwgMHhDMCwgLyogMHg0MC0weDQzICovCisJMHg4NSwgMHhDRiwgMHg4NSwgMHhEMCwgMHhCNCwgMHhGNCwgMHg4NSwgMHhEMSwgLyogMHg0NC0weDQ3ICovCisJMHhCMywgMHhDQSwgMHg4NSwgMHhEMiwgMHhCOCwgMHhFNiwgMHhERiwgMHhCQiwgLyogMHg0OC0weDRCICovCisJMHg4NSwgMHhEMywgMHg4NSwgMHhENCwgMHg4NSwgMHhENSwgMHg4NSwgMHhENiwgLyogMHg0Qy0weDRGICovCisJMHhDNCwgMHhDNSwgMHg4NSwgMHhENywgMHhERiwgMHhCQywgMHhERiwgMHhCRCwgLyogMHg1MC0weDUzICovCisJMHhERiwgMHhCRSwgMHhDNSwgMHhCQiwgMHhERiwgMHhCRiwgMHhERiwgMHhDMiwgLyogMHg1NC0weDU3ICovCisJMHhENCwgMHhCMSwgMHhERiwgMHhDMywgMHg4NSwgMHhEOCwgMHhDNywgMHhCQSwgLyogMHg1OC0weDVCICovCisJMHhDRSwgMHhEOCwgMHg4NSwgMHhEOSwgMHg4NSwgMHhEQSwgMHg4NSwgMHhEQiwgLyogMHg1Qy0weDVGICovCisJMHg4NSwgMHhEQywgMHg4NSwgMHhERCwgMHhDNCwgMHhEOCwgMHg4NSwgMHhERSwgLyogMHg2MC0weDYzICovCisJMHhERiwgMHhDQSwgMHg4NSwgMHhERiwgMHhERiwgMHhDRiwgMHg4NSwgMHhFMCwgLyogMHg2NC0weDY3ICovCisJMHhENiwgMHhEQywgMHg4NSwgMHhFMSwgMHg4NSwgMHhFMiwgMHg4NSwgMHhFMywgLyogMHg2OC0weDZCICovCisJMHg4NSwgMHhFNCwgMHg4NSwgMHhFNSwgMHg4NSwgMHhFNiwgMHg4NSwgMHhFNywgLyogMHg2Qy0weDZGICovCisJMHg4NSwgMHhFOCwgMHhERiwgMHhDOSwgMHhERiwgMHhEQSwgMHhDRSwgMHhCNiwgLyogMHg3MC0weDczICovCisJMHg4NSwgMHhFOSwgMHhCQSwgMHhDNywgMHhERiwgMHhDRSwgMHhERiwgMHhDOCwgLyogMHg3NC0weDc3ICovCisJMHhDNSwgMHhERSwgMHg4NSwgMHhFQSwgMHg4NSwgMHhFQiwgMHhDOSwgMHhFQiwgLyogMHg3OC0weDdCICovCisJMHhCQSwgMHhGNCwgMHhDMywgMHhGQywgMHg4NSwgMHhFQywgMHg4NSwgMHhFRCwgLyogMHg3Qy0weDdGICovCisJCisJMHhCRSwgMHhENywgMHg4NSwgMHhFRSwgMHhERiwgMHhDNiwgMHg4NSwgMHhFRiwgLyogMHg4MC0weDgzICovCisJMHhERiwgMHhDRCwgMHg4NSwgMHhGMCwgMHhDNSwgMHhEOCwgMHg4NSwgMHhGMSwgLyogMHg4NC0weDg3ICovCisJMHg4NSwgMHhGMiwgMHg4NSwgMHhGMywgMHg4NSwgMHhGNCwgMHhENSwgMHhBNiwgLyogMHg4OC0weDhCICovCisJMHhCQSwgMHhDRCwgMHg4NSwgMHhGNSwgMHhCRSwgMHhDQywgMHhEMywgMHhCRCwgLyogMHg4Qy0weDhGICovCisJMHhCOCwgMHhDMCwgMHg4NSwgMHhGNiwgMHhENiwgMHhFNCwgMHg4NSwgMHhGNywgLyogMHg5MC0weDkzICovCisJMHhERiwgMHhDNywgMHhCOSwgMHhCRSwgMHhCRiwgMHhBNywgMHg4NSwgMHhGOCwgLyogMHg5NC0weDk3ICovCisJMHg4NSwgMHhGOSwgMHhDMSwgMHhGQywgMHhERiwgMHhDQiwgMHhERiwgMHhDQywgLyogMHg5OC0weDlCICovCisJMHg4NSwgMHhGQSwgMHhERiwgMHhEMCwgMHg4NSwgMHhGQiwgMHg4NSwgMHhGQywgLyogMHg5Qy0weDlGICovCisJMHg4NSwgMHhGRCwgMHg4NSwgMHhGRSwgMHg4NiwgMHg0MCwgMHhERiwgMHhEQiwgLyogMHhBMC0weEEzICovCisJMHhERiwgMHhFNSwgMHg4NiwgMHg0MSwgMHhERiwgMHhENywgMHhERiwgMHhENiwgLyogMHhBNC0weEE3ICovCisJMHhENywgMHhDOSwgMHhERiwgMHhFMywgMHhERiwgMHhFNCwgMHhFNSwgMHhFQiwgLyogMHhBOC0weEFCICovCisJMHhEMiwgMHhBNywgMHhERiwgMHhEMiwgMHg4NiwgMHg0MiwgMHhCRiwgMHhBOSwgLyogMHhBQy0weEFGICovCisJMHg4NiwgMHg0MywgMHhENCwgMHhEQiwgMHg4NiwgMHg0NCwgMHhCRiwgMHhDOCwgLyogMHhCMC0weEIzICovCisJMHhERiwgMHhENCwgMHg4NiwgMHg0NSwgMHg4NiwgMHg0NiwgMHg4NiwgMHg0NywgLyogMHhCNC0weEI3ICovCisJMHhDRiwgMHhDQywgMHg4NiwgMHg0OCwgMHg4NiwgMHg0OSwgMHhERiwgMHhERCwgLyogMHhCOC0weEJCICovCisJMHg4NiwgMHg0QSwgMHhEMSwgMHhDQSwgMHg4NiwgMHg0QiwgMHhERiwgMHhERSwgLyogMHhCQy0weEJGICovCisJMHhCMCwgMHhBNywgMHhDNiwgMHhCNywgMHhERiwgMHhEMywgMHg4NiwgMHg0QywgLyogMHhDMC0weEMzICovCisJMHhCQSwgMHhFNSwgMHg4NiwgMHg0RCwgMHhCNiwgMHhERiwgMHhDRCwgMHhEQiwgLyogMHhDNC0weEM3ICovCisJMHhCOSwgMHhGRSwgMHhENCwgMHhENSwgMHg4NiwgMHg0RSwgMHg4NiwgMHg0RiwgLyogMHhDOC0weENCICovCisJMHhERiwgMHhERiwgMHhDRiwgMHhFQywgMHhCMCwgMHhBNSwgMHhERiwgMHhFNywgLyogMHhDQy0weENGICovCisJMHhERiwgMHhEMSwgMHhEMSwgMHhDNiwgMHhERiwgMHhENSwgMHhERiwgMHhEOCwgLyogMHhEMC0weEQzICovCisJMHhERiwgMHhEOSwgMHhERiwgMHhEQywgMHg4NiwgMHg1MCwgMHhCQiwgMHhBOSwgLyogMHhENC0weEQ3ICovCisJMHg4NiwgMHg1MSwgMHhERiwgMHhFMCwgMHhERiwgMHhFMSwgMHg4NiwgMHg1MiwgLyogMHhEOC0weERCICovCisJMHhERiwgMHhFMiwgMHhERiwgMHhFNiwgMHhERiwgMHhFOCwgMHhEMywgMHhCNCwgLyogMHhEQy0weERGICovCisJMHg4NiwgMHg1MywgMHg4NiwgMHg1NCwgMHg4NiwgMHg1NSwgMHg4NiwgMHg1NiwgLyogMHhFMC0weEUzICovCisJMHg4NiwgMHg1NywgMHhCOCwgMHhFNywgMHhDNSwgMHhCNiwgMHhERiwgMHhFQSwgLyogMHhFNC0weEU3ICovCisJMHhDOSwgMHhEQSwgMHhDMSwgMHhBOCwgMHhDNCwgMHhDNCwgMHg4NiwgMHg1OCwgLyogMHhFOC0weEVCICovCisJMHg4NiwgMHg1OSwgMHhCRiwgMHhERSwgMHhDRiwgMHhGOCwgMHg4NiwgMHg1QSwgLyogMHhFQy0weEVGICovCisJMHg4NiwgMHg1QiwgMHg4NiwgMHg1QywgMHhENSwgMHhEQywgMHhERiwgMHhFRSwgLyogMHhGMC0weEYzICovCisJMHg4NiwgMHg1RCwgMHg4NiwgMHg1RSwgMHg4NiwgMHg1RiwgMHg4NiwgMHg2MCwgLyogMHhGNC0weEY3ICovCisJMHg4NiwgMHg2MSwgMHg4NiwgMHg2MiwgMHhCMiwgMHhCOCwgMHg4NiwgMHg2MywgLyogMHhGOC0weEZCICovCisJMHhCQSwgMHhERiwgMHhERiwgMHhFQywgMHg4NiwgMHg2NCwgMHhEQiwgMHhDMSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNTVbNTEyXSA9IHsKKwkweDg2LCAweDY1LCAweEQxLCAweEU0LCAweDg2LCAweDY2LCAweDg2LCAweDY3LCAvKiAweDAwLTB4MDMgKi8KKwkweDg2LCAweDY4LCAweDg2LCAweDY5LCAweENCLCAweEY0LCAweEI0LCAweEJELCAvKiAweDA0LTB4MDcgKi8KKwkweDg2LCAweDZBLCAweEIwLCAweEE2LCAweDg2LCAweDZCLCAweDg2LCAweDZDLCAvKiAweDA4LTB4MEIgKi8KKwkweDg2LCAweDZELCAweDg2LCAweDZFLCAweDg2LCAweDZGLCAweERGLCAweEYxLCAvKiAweDBDLTB4MEYgKi8KKwkweENDLCAweEM2LCAweERGLCAweEYyLCAweDg2LCAweDcwLCAweDg2LCAweDcxLCAvKiAweDEwLTB4MTMgKi8KKwkweERGLCAweEVELCAweDg2LCAweDcyLCAweDg2LCAweDczLCAweDg2LCAweDc0LCAvKiAweDE0LTB4MTcgKi8KKwkweDg2LCAweDc1LCAweDg2LCAweDc2LCAweDg2LCAweDc3LCAweERGLCAweEU5LCAvKiAweDE4LTB4MUIgKi8KKwkweDg2LCAweDc4LCAweDg2LCAweDc5LCAweDg2LCAweDdBLCAweDg2LCAweDdCLCAvKiAweDFDLTB4MUYgKi8KKwkweERGLCAweEVCLCAweDg2LCAweDdDLCAweERGLCAweEVGLCAweERGLCAweEYwLCAvKiAweDIwLTB4MjMgKi8KKwkweEJCLCAweEJELCAweDg2LCAweDdELCAweDg2LCAweDdFLCAweERGLCAweEYzLCAvKiAweDI0LTB4MjcgKi8KKwkweDg2LCAweDgwLCAweDg2LCAweDgxLCAweERGLCAweEY0LCAweDg2LCAweDgyLCAvKiAweDI4LTB4MkIgKi8KKwkweEJCLCAweEEzLCAweDg2LCAweDgzLCAweENBLCAweERCLCAweENFLCAweEE4LCAvKiAweDJDLTB4MkYgKi8KKwkweEUwLCAweEE3LCAweEIzLCAweEFBLCAweDg2LCAweDg0LCAweEUwLCAweEE2LCAvKiAweDMwLTB4MzMgKi8KKwkweDg2LCAweDg1LCAweDg2LCAweDg2LCAweDg2LCAweDg3LCAweEUwLCAweEExLCAvKiAweDM0LTB4MzcgKi8KKwkweDg2LCAweDg4LCAweDg2LCAweDg5LCAweDg2LCAweDhBLCAweDg2LCAweDhCLCAvKiAweDM4LTB4M0IgKi8KKwkweERGLCAweEZFLCAweDg2LCAweDhDLCAweENELCAweEQ5LCAweERGLCAweEZDLCAvKiAweDNDLTB4M0YgKi8KKwkweDg2LCAweDhELCAweERGLCAweEZBLCAweDg2LCAweDhFLCAweEJGLCAweEQwLCAvKiAweDQwLTB4NDMgKi8KKwkweEQ3LCAweEM0LCAweDg2LCAweDhGLCAweEM5LCAweENDLCAweDg2LCAweDkwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDg2LCAweDkxLCAweERGLCAweEY4LCAweEIwLCAweEExLCAweDg2LCAweDkyLCAvKiAweDQ4LTB4NEIgKi8KKwkweDg2LCAweDkzLCAweDg2LCAweDk0LCAweDg2LCAweDk1LCAweDg2LCAweDk2LCAvKiAweDRDLTB4NEYgKi8KKwkweERGLCAweEZELCAweDg2LCAweDk3LCAweDg2LCAweDk4LCAweDg2LCAweDk5LCAvKiAweDUwLTB4NTMgKi8KKwkweDg2LCAweDlBLCAweERGLCAweEZCLCAweEUwLCAweEEyLCAweDg2LCAweDlCLCAvKiAweDU0LTB4NTcgKi8KKwkweDg2LCAweDlDLCAweDg2LCAweDlELCAweDg2LCAweDlFLCAweDg2LCAweDlGLCAvKiAweDU4LTB4NUIgKi8KKwkweEUwLCAweEE4LCAweDg2LCAweEEwLCAweDg2LCAweEExLCAweDg2LCAweEEyLCAvKiAweDVDLTB4NUYgKi8KKwkweDg2LCAweEEzLCAweEI3LCAweEM4LCAweDg2LCAweEE0LCAweDg2LCAweEE1LCAvKiAweDYwLTB4NjMgKi8KKwkweEM2LCAweEExLCAweEM5LCAweEI2LCAweEMwLCAweEIyLCAweERGLCAweEY1LCAvKiAweDY0LTB4NjcgKi8KKwkweDg2LCAweEE2LCAweDg2LCAweEE3LCAweEM1LCAweEJFLCAweDg2LCAweEE4LCAvKiAweDY4LTB4NkIgKi8KKwkweEQ4LCAweEM0LCAweERGLCAweEY5LCAweEM0LCAweEY2LCAweDg2LCAweEE5LCAvKiAweDZDLTB4NkYgKi8KKwkweDg2LCAweEFBLCAweDg2LCAweEFCLCAweDg2LCAweEFDLCAweDg2LCAweEFELCAvKiAweDcwLTB4NzMgKi8KKwkweDg2LCAweEFFLCAweEUwLCAweEEzLCAweEUwLCAweEE0LCAweEUwLCAweEE1LCAvKiAweDc0LTB4NzcgKi8KKwkweEQwLCAweEE1LCAweDg2LCAweEFGLCAweDg2LCAweEIwLCAweEUwLCAweEI0LCAvKiAweDc4LTB4N0IgKi8KKwkweENDLCAweEU0LCAweDg2LCAweEIxLCAweEUwLCAweEIxLCAweDg2LCAweEIyLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEJGLCAweEE2LCAweEUwLCAweEFGLCAweENFLCAweEI5LCAweEUwLCAweEFCLCAvKiAweDgwLTB4ODMgKi8KKwkweEM5LCAweEM2LCAweDg2LCAweEIzLCAweDg2LCAweEI0LCAweEMwLCAweEFFLCAvKiAweDg0LTB4ODcgKi8KKwkweEUwLCAweEFFLCAweEJBLCAweEVELCAweEJBLCAweEIwLCAweEUwLCAweEE5LCAvKiAweDg4LTB4OEIgKi8KKwkweDg2LCAweEI1LCAweDg2LCAweEI2LCAweDg2LCAweEI3LCAweERGLCAweEY2LCAvKiAweDhDLTB4OEYgKi8KKwkweDg2LCAweEI4LCAweEUwLCAweEIzLCAweDg2LCAweEI5LCAweDg2LCAweEJBLCAvKiAweDkwLTB4OTMgKi8KKwkweEUwLCAweEI4LCAweDg2LCAweEJCLCAweDg2LCAweEJDLCAweDg2LCAweEJELCAvKiAweDk0LTB4OTcgKi8KKwkweEI0LCAweEFELCAweEUwLCAweEI5LCAweDg2LCAweEJFLCAweDg2LCAweEJGLCAvKiAweDk4LTB4OUIgKi8KKwkweENGLCAweEIyLCAweEJBLCAweEM4LCAweDg2LCAweEMwLCAweEUwLCAweEIwLCAvKiAweDlDLTB4OUYgKi8KKwkweDg2LCAweEMxLCAweDg2LCAweEMyLCAweDg2LCAweEMzLCAweDg2LCAweEM0LCAvKiAweEEwLTB4QTMgKi8KKwkweDg2LCAweEM1LCAweDg2LCAweEM2LCAweDg2LCAweEM3LCAweEQwLCAweEZBLCAvKiAweEE0LTB4QTcgKi8KKwkweDg2LCAweEM4LCAweDg2LCAweEM5LCAweDg2LCAweENBLCAweDg2LCAweENCLCAvKiAweEE4LTB4QUIgKi8KKwkweDg2LCAweENDLCAweDg2LCAweENELCAweDg2LCAweENFLCAweDg2LCAweENGLCAvKiAweEFDLTB4QUYgKi8KKwkweDg2LCAweEQwLCAweEUwLCAweEFDLCAweDg2LCAweEQxLCAweEQ0LCAweEZCLCAvKiAweEIwLTB4QjMgKi8KKwkweDg2LCAweEQyLCAweERGLCAweEY3LCAweDg2LCAweEQzLCAweEM1LCAweEU3LCAvKiAweEI0LTB4QjcgKi8KKwkweDg2LCAweEQ0LCAweEUwLCAweEFELCAweDg2LCAweEQ1LCAweEQzLCAweEY3LCAvKiAweEI4LTB4QkIgKi8KKwkweDg2LCAweEQ2LCAweEUwLCAweEI2LCAweEUwLCAweEI3LCAweDg2LCAweEQ3LCAvKiAweEJDLTB4QkYgKi8KKwkweDg2LCAweEQ4LCAweDg2LCAweEQ5LCAweDg2LCAweERBLCAweDg2LCAweERCLCAvKiAweEMwLTB4QzMgKi8KKwkweEUwLCAweEM0LCAweEQwLCAweEUxLCAweDg2LCAweERDLCAweDg2LCAweERELCAvKiAweEM0LTB4QzcgKi8KKwkweDg2LCAweERFLCAweEUwLCAweEJDLCAweDg2LCAweERGLCAweDg2LCAweEUwLCAvKiAweEM4LTB4Q0IgKi8KKwkweEUwLCAweEM5LCAweEUwLCAweENBLCAweDg2LCAweEUxLCAweDg2LCAweEUyLCAvKiAweENDLTB4Q0YgKi8KKwkweDg2LCAweEUzLCAweEUwLCAweEJFLCAweEUwLCAweEFBLCAweEM5LCAweEE0LCAvKiAweEQwLTB4RDMgKi8KKwkweEUwLCAweEMxLCAweDg2LCAweEU0LCAweEUwLCAweEIyLCAweDg2LCAweEU1LCAvKiAweEQ0LTB4RDcgKi8KKwkweDg2LCAweEU2LCAweDg2LCAweEU3LCAweDg2LCAweEU4LCAweDg2LCAweEU5LCAvKiAweEQ4LTB4REIgKi8KKwkweENBLCAweEM4LCAweEUwLCAweEMzLCAweDg2LCAweEVBLCAweEUwLCAweEI1LCAvKiAweERDLTB4REYgKi8KKwkweDg2LCAweEVCLCAweENFLCAweENCLCAweDg2LCAweEVDLCAweENCLCAweEMzLCAvKiAweEUwLTB4RTMgKi8KKwkweEUwLCAweENELCAweEUwLCAweEM2LCAweEUwLCAweEMyLCAweDg2LCAweEVELCAvKiAweEU0LTB4RTcgKi8KKwkweEUwLCAweENCLCAweDg2LCAweEVFLCAweEUwLCAweEJBLCAweEUwLCAweEJGLCAvKiAweEU4LTB4RUIgKi8KKwkweEUwLCAweEMwLCAweDg2LCAweEVGLCAweDg2LCAweEYwLCAweEUwLCAweEM1LCAvKiAweEVDLTB4RUYgKi8KKwkweDg2LCAweEYxLCAweDg2LCAweEYyLCAweEUwLCAweEM3LCAweEUwLCAweEM4LCAvKiAweEYwLTB4RjMgKi8KKwkweDg2LCAweEYzLCAweEUwLCAweENDLCAweDg2LCAweEY0LCAweEUwLCAweEJCLCAvKiAweEY0LTB4RjcgKi8KKwkweDg2LCAweEY1LCAweDg2LCAweEY2LCAweDg2LCAweEY3LCAweDg2LCAweEY4LCAvKiAweEY4LTB4RkIgKi8KKwkweDg2LCAweEY5LCAweENCLCAweEQ0LCAweEUwLCAweEQ1LCAweDg2LCAweEZBLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181Nls1MTJdID0geworCTB4RTAsIDB4RDYsIDB4RTAsIDB4RDIsIDB4ODYsIDB4RkIsIDB4ODYsIDB4RkMsIC8qIDB4MDAtMHgwMyAqLworCTB4ODYsIDB4RkQsIDB4ODYsIDB4RkUsIDB4ODcsIDB4NDAsIDB4ODcsIDB4NDEsIC8qIDB4MDQtMHgwNyAqLworCTB4RTAsIDB4RDAsIDB4QkMsIDB4Q0UsIDB4ODcsIDB4NDIsIDB4ODcsIDB4NDMsIC8qIDB4MDgtMHgwQiAqLworCTB4RTAsIDB4RDEsIDB4ODcsIDB4NDQsIDB4QjgsIDB4QzIsIDB4RDgsIDB4QzUsIC8qIDB4MEMtMHgwRiAqLworCTB4ODcsIDB4NDUsIDB4ODcsIDB4NDYsIDB4ODcsIDB4NDcsIDB4ODcsIDB4NDgsIC8qIDB4MTAtMHgxMyAqLworCTB4ODcsIDB4NDksIDB4ODcsIDB4NEEsIDB4ODcsIDB4NEIsIDB4ODcsIDB4NEMsIC8qIDB4MTQtMHgxNyAqLworCTB4RDAsIDB4RUEsIDB4ODcsIDB4NEQsIDB4ODcsIDB4NEUsIDB4QzIsIDB4RUYsIC8qIDB4MTgtMHgxQiAqLworCTB4ODcsIDB4NEYsIDB4ODcsIDB4NTAsIDB4RTAsIDB4Q0YsIDB4RTAsIDB4QkQsIC8qIDB4MUMtMHgxRiAqLworCTB4ODcsIDB4NTEsIDB4ODcsIDB4NTIsIDB4ODcsIDB4NTMsIDB4RTAsIDB4RDQsIC8qIDB4MjAtMHgyMyAqLworCTB4RTAsIDB4RDMsIDB4ODcsIDB4NTQsIDB4ODcsIDB4NTUsIDB4RTAsIDB4RDcsIC8qIDB4MjQtMHgyNyAqLworCTB4ODcsIDB4NTYsIDB4ODcsIDB4NTcsIDB4ODcsIDB4NTgsIDB4ODcsIDB4NTksIC8qIDB4MjgtMHgyQiAqLworCTB4RTAsIDB4REMsIDB4RTAsIDB4RDgsIDB4ODcsIDB4NUEsIDB4ODcsIDB4NUIsIC8qIDB4MkMtMHgyRiAqLworCTB4ODcsIDB4NUMsIDB4RDYsIDB4RjYsIDB4QjMsIDB4QjAsIDB4ODcsIDB4NUQsIC8qIDB4MzAtMHgzMyAqLworCTB4RDcsIDB4RUMsIDB4ODcsIDB4NUUsIDB4Q0IsIDB4QkIsIDB4ODcsIDB4NUYsIC8qIDB4MzQtMHgzNyAqLworCTB4ODcsIDB4NjAsIDB4RTAsIDB4REEsIDB4ODcsIDB4NjEsIDB4Q0UsIDB4RkIsIC8qIDB4MzgtMHgzQiAqLworCTB4ODcsIDB4NjIsIDB4ODcsIDB4NjMsIDB4ODcsIDB4NjQsIDB4QkEsIDB4RDksIC8qIDB4M0MtMHgzRiAqLworCTB4ODcsIDB4NjUsIDB4ODcsIDB4NjYsIDB4ODcsIDB4NjcsIDB4ODcsIDB4NjgsIC8qIDB4NDAtMHg0MyAqLworCTB4ODcsIDB4NjksIDB4ODcsIDB4NkEsIDB4ODcsIDB4NkIsIDB4ODcsIDB4NkMsIC8qIDB4NDQtMHg0NyAqLworCTB4ODcsIDB4NkQsIDB4ODcsIDB4NkUsIDB4ODcsIDB4NkYsIDB4ODcsIDB4NzAsIC8qIDB4NDgtMHg0QiAqLworCTB4RTAsIDB4RTEsIDB4RTAsIDB4REQsIDB4RDIsIDB4QUQsIDB4ODcsIDB4NzEsIC8qIDB4NEMtMHg0RiAqLworCTB4ODcsIDB4NzIsIDB4ODcsIDB4NzMsIDB4ODcsIDB4NzQsIDB4ODcsIDB4NzUsIC8qIDB4NTAtMHg1MyAqLworCTB4RTAsIDB4RTIsIDB4ODcsIDB4NzYsIDB4ODcsIDB4NzcsIDB4RTAsIDB4REIsIC8qIDB4NTQtMHg1NyAqLworCTB4RTAsIDB4RDksIDB4RTAsIDB4REYsIDB4ODcsIDB4NzgsIDB4ODcsIDB4NzksIC8qIDB4NTgtMHg1QiAqLworCTB4RTAsIDB4RTAsIDB4ODcsIDB4N0EsIDB4ODcsIDB4N0IsIDB4ODcsIDB4N0MsIC8qIDB4NUMtMHg1RiAqLworCTB4ODcsIDB4N0QsIDB4ODcsIDB4N0UsIDB4RTAsIDB4REUsIDB4ODcsIDB4ODAsIC8qIDB4NjAtMHg2MyAqLworCTB4RTAsIDB4RTQsIDB4ODcsIDB4ODEsIDB4ODcsIDB4ODIsIDB4ODcsIDB4ODMsIC8qIDB4NjQtMHg2NyAqLworCTB4QzYsIDB4RjcsIDB4RDgsIDB4QUMsIDB4RDQsIDB4RUIsIDB4RTAsIDB4RTYsIC8qIDB4NjgtMHg2QiAqLworCTB4Q0EsIDB4QzksIDB4ODcsIDB4ODQsIDB4ODcsIDB4ODUsIDB4ODcsIDB4ODYsIC8qIDB4NkMtMHg2RiAqLworCTB4ODcsIDB4ODcsIDB4RTAsIDB4RTUsIDB4ODcsIDB4ODgsIDB4ODcsIDB4ODksIC8qIDB4NzAtMHg3MyAqLworCTB4ODcsIDB4OEEsIDB4ODcsIDB4OEIsIDB4QjgsIDB4QzEsIDB4ODcsIDB4OEMsIC8qIDB4NzQtMHg3NyAqLworCTB4ODcsIDB4OEQsIDB4ODcsIDB4OEUsIDB4ODcsIDB4OEYsIDB4RTAsIDB4RTcsIC8qIDB4NzgtMHg3QiAqLworCTB4RTAsIDB4RTgsIDB4ODcsIDB4OTAsIDB4ODcsIDB4OTEsIDB4ODcsIDB4OTIsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4ODcsIDB4OTMsIDB4ODcsIDB4OTQsIDB4ODcsIDB4OTUsIDB4ODcsIDB4OTYsIC8qIDB4ODAtMHg4MyAqLworCTB4ODcsIDB4OTcsIDB4RTAsIDB4RTksIDB4RTAsIDB4RTMsIDB4ODcsIDB4OTgsIC8qIDB4ODQtMHg4NyAqLworCTB4ODcsIDB4OTksIDB4ODcsIDB4OUEsIDB4ODcsIDB4OUIsIDB4ODcsIDB4OUMsIC8qIDB4ODgtMHg4QiAqLworCTB4ODcsIDB4OUQsIDB4ODcsIDB4OUUsIDB4QkEsIDB4QkYsIDB4Q0MsIDB4RTcsIC8qIDB4OEMtMHg4RiAqLworCTB4ODcsIDB4OUYsIDB4ODcsIDB4QTAsIDB4ODcsIDB4QTEsIDB4RTAsIDB4RUEsIC8qIDB4OTAtMHg5MyAqLworCTB4ODcsIDB4QTIsIDB4ODcsIDB4QTMsIDB4ODcsIDB4QTQsIDB4ODcsIDB4QTUsIC8qIDB4OTQtMHg5NyAqLworCTB4ODcsIDB4QTYsIDB4ODcsIDB4QTcsIDB4ODcsIDB4QTgsIDB4ODcsIDB4QTksIC8qIDB4OTgtMHg5QiAqLworCTB4ODcsIDB4QUEsIDB4ODcsIDB4QUIsIDB4ODcsIDB4QUMsIDB4ODcsIDB4QUQsIC8qIDB4OUMtMHg5RiAqLworCTB4ODcsIDB4QUUsIDB4ODcsIDB4QUYsIDB4ODcsIDB4QjAsIDB4Q0YsIDB4RjksIC8qIDB4QTAtMHhBMyAqLworCTB4ODcsIDB4QjEsIDB4ODcsIDB4QjIsIDB4ODcsIDB4QjMsIDB4ODcsIDB4QjQsIC8qIDB4QTQtMHhBNyAqLworCTB4ODcsIDB4QjUsIDB4ODcsIDB4QjYsIDB4ODcsIDB4QjcsIDB4ODcsIDB4QjgsIC8qIDB4QTgtMHhBQiAqLworCTB4ODcsIDB4QjksIDB4ODcsIDB4QkEsIDB4ODcsIDB4QkIsIDB4RTAsIDB4RUIsIC8qIDB4QUMtMHhBRiAqLworCTB4ODcsIDB4QkMsIDB4ODcsIDB4QkQsIDB4ODcsIDB4QkUsIDB4ODcsIDB4QkYsIC8qIDB4QjAtMHhCMyAqLworCTB4ODcsIDB4QzAsIDB4ODcsIDB4QzEsIDB4ODcsIDB4QzIsIDB4QzgsIDB4QzIsIC8qIDB4QjQtMHhCNyAqLworCTB4ODcsIDB4QzMsIDB4ODcsIDB4QzQsIDB4ODcsIDB4QzUsIDB4ODcsIDB4QzYsIC8qIDB4QjgtMHhCQiAqLworCTB4QkQsIDB4QzAsIDB4ODcsIDB4QzcsIDB4ODcsIDB4QzgsIDB4ODcsIDB4QzksIC8qIDB4QkMtMHhCRiAqLworCTB4ODcsIDB4Q0EsIDB4ODcsIDB4Q0IsIDB4ODcsIDB4Q0MsIDB4ODcsIDB4Q0QsIC8qIDB4QzAtMHhDMyAqLworCTB4ODcsIDB4Q0UsIDB4ODcsIDB4Q0YsIDB4ODcsIDB4RDAsIDB4ODcsIDB4RDEsIC8qIDB4QzQtMHhDNyAqLworCTB4ODcsIDB4RDIsIDB4ODcsIDB4RDMsIDB4QzQsIDB4RDIsIDB4ODcsIDB4RDQsIC8qIDB4QzgtMHhDQiAqLworCTB4ODcsIDB4RDUsIDB4ODcsIDB4RDYsIDB4ODcsIDB4RDcsIDB4ODcsIDB4RDgsIC8qIDB4Q0MtMHhDRiAqLworCTB4ODcsIDB4RDksIDB4ODcsIDB4REEsIDB4ODcsIDB4REIsIDB4ODcsIDB4REMsIC8qIDB4RDAtMHhEMyAqLworCTB4RTAsIDB4RUMsIDB4ODcsIDB4REQsIDB4ODcsIDB4REUsIDB4RTAsIDB4RUQsIC8qIDB4RDQtMHhENyAqLworCTB4ODcsIDB4REYsIDB4ODcsIDB4RTAsIDB4QzcsIDB4RjQsIDB4Q0IsIDB4QzQsIC8qIDB4RDgtMHhEQiAqLworCTB4ODcsIDB4RTEsIDB4RTAsIDB4RUUsIDB4QkIsIDB4RDgsIDB4RDgsIDB4QjYsIC8qIDB4REMtMHhERiAqLworCTB4RDIsIDB4RjIsIDB4RTAsIDB4RUYsIDB4Q0QsIDB4QzUsIDB4ODcsIDB4RTIsIC8qIDB4RTAtMHhFMyAqLworCTB4QjYsIDB4REEsIDB4ODcsIDB4RTMsIDB4ODcsIDB4RTQsIDB4ODcsIDB4RTUsIC8qIDB4RTQtMHhFNyAqLworCTB4ODcsIDB4RTYsIDB4ODcsIDB4RTcsIDB4ODcsIDB4RTgsIDB4RTAsIDB4RjEsIC8qIDB4RTgtMHhFQiAqLworCTB4ODcsIDB4RTksIDB4RDQsIDB4QjAsIDB4ODcsIDB4RUEsIDB4ODcsIDB4RUIsIC8qIDB4RUMtMHhFRiAqLworCTB4QzAsIDB4QTcsIDB4QjQsIDB4RDEsIDB4ODcsIDB4RUMsIDB4ODcsIDB4RUQsIC8qIDB4RjAtMHhGMyAqLworCTB4Q0UsIDB4QTcsIDB4RTAsIDB4RjAsIDB4ODcsIDB4RUUsIDB4ODcsIDB4RUYsIC8qIDB4RjQtMHhGNyAqLworCTB4ODcsIDB4RjAsIDB4RTAsIDB4RjIsIDB4QjksIDB4Q0MsIDB4ODcsIDB4RjEsIC8qIDB4RjgtMHhGQiAqLworCTB4ODcsIDB4RjIsIDB4QjksIDB4RkEsIDB4Q0QsIDB4QkMsIDB4RTAsIDB4RjMsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzU3WzUxMl0gPSB7CisJMHg4NywgMHhGMywgMHg4NywgMHhGNCwgMHg4NywgMHhGNSwgMHhDNiwgMHhENCwgLyogMHgwMC0weDAzICovCisJMHhFMCwgMHhGNCwgMHg4NywgMHhGNiwgMHhENCwgMHhCMiwgMHg4NywgMHhGNywgLyogMHgwNC0weDA3ICovCisJMHhDOCwgMHhBNiwgMHhFMCwgMHhGNiwgMHhFMCwgMHhGNSwgMHg4NywgMHhGOCwgLyogMHgwOC0weDBCICovCisJMHg4NywgMHhGOSwgMHg4NywgMHhGQSwgMHg4NywgMHhGQiwgMHg4NywgMHhGQywgLyogMHgwQy0weDBGICovCisJMHg4NywgMHhGRCwgMHg4NywgMHhGRSwgMHg4OCwgMHg0MCwgMHg4OCwgMHg0MSwgLyogMHgxMC0weDEzICovCisJMHg4OCwgMHg0MiwgMHg4OCwgMHg0MywgMHg4OCwgMHg0NCwgMHg4OCwgMHg0NSwgLyogMHgxNC0weDE3ICovCisJMHg4OCwgMHg0NiwgMHg4OCwgMHg0NywgMHg4OCwgMHg0OCwgMHg4OCwgMHg0OSwgLyogMHgxOC0weDFCICovCisJMHhFMCwgMHhGNywgMHg4OCwgMHg0QSwgMHg4OCwgMHg0QiwgMHhDRCwgMHhDMSwgLyogMHgxQy0weDFGICovCisJMHg4OCwgMHg0QywgMHg4OCwgMHg0RCwgMHg4OCwgMHg0RSwgMHhDQSwgMHhBNSwgLyogMHgyMC0weDIzICovCisJMHg4OCwgMHg0RiwgMHg4OCwgMHg1MCwgMHg4OCwgMHg1MSwgMHg4OCwgMHg1MiwgLyogMHgyNC0weDI3ICovCisJMHhENCwgMHhEQSwgMHhEQiwgMHhENywgMHhEQiwgMHhEOSwgMHg4OCwgMHg1MywgLyogMHgyOC0weDJCICovCisJMHhEQiwgMHhEOCwgMHhCOSwgMHhFNywgMHhEQiwgMHhEQywgMHhEQiwgMHhERCwgLyogMHgyQy0weDJGICovCisJMHhCNSwgMHhEOCwgMHg4OCwgMHg1NCwgMHg4OCwgMHg1NSwgMHhEQiwgMHhEQSwgLyogMHgzMC0weDMzICovCisJMHg4OCwgMHg1NiwgMHg4OCwgMHg1NywgMHg4OCwgMHg1OCwgMHg4OCwgMHg1OSwgLyogMHgzNC0weDM3ICovCisJMHg4OCwgMHg1QSwgMHhEQiwgMHhEQiwgMHhCMywgMHhBMSwgMHhEQiwgMHhERiwgLyogMHgzOC0weDNCICovCisJMHg4OCwgMHg1QiwgMHg4OCwgMHg1QywgMHhCQiwgMHhGOCwgMHg4OCwgMHg1RCwgLyogMHgzQy0weDNGICovCisJMHhENiwgMHhCNywgMHg4OCwgMHg1RSwgMHhEQiwgMHhFMCwgMHg4OCwgMHg1RiwgLyogMHg0MC0weDQzICovCisJMHg4OCwgMHg2MCwgMHg4OCwgMHg2MSwgMHg4OCwgMHg2MiwgMHhCRSwgMHhGOSwgLyogMHg0NC0weDQ3ICovCisJMHg4OCwgMHg2MywgMHg4OCwgMHg2NCwgMHhCNywgMHhCQiwgMHg4OCwgMHg2NSwgLyogMHg0OC0weDRCICovCisJMHhEQiwgMHhEMCwgMHhDQywgMHhBRSwgMHhCRiwgMHhCMiwgMHhCQiwgMHhCNSwgLyogMHg0Qy0weDRGICovCisJMHhENywgMHhGOCwgMHhCRiwgMHhEMywgMHg4OCwgMHg2NiwgMHg4OCwgMHg2NywgLyogMHg1MC0weDUzICovCisJMHg4OCwgMHg2OCwgMHg4OCwgMHg2OSwgMHg4OCwgMHg2QSwgMHhCRiwgMHhFOSwgLyogMHg1NC0weDU3ICovCisJMHg4OCwgMHg2QiwgMHg4OCwgMHg2QywgMHhCQywgMHhFMSwgMHhDQywgMHhCMywgLyogMHg1OC0weDVCICovCisJMHhEQiwgMHhERSwgMHhCMCwgMHhEMywgMHhDRSwgMHhFQiwgMHhCNywgMHhEOCwgLyogMHg1Qy0weDVGICovCisJMHhENywgMHhCOSwgMHhDNiwgMHhDMiwgMHg4OCwgMHg2RCwgMHg4OCwgMHg2RSwgLyogMHg2MC0weDYzICovCisJMHhDMCwgMHhBNCwgMHg4OCwgMHg2RiwgMHhDQywgMHhCOSwgMHg4OCwgMHg3MCwgLyogMHg2NC0weDY3ICovCisJMHhEQiwgMHhFNywgMHhEQiwgMHhFMSwgMHhDNiwgMHhCQSwgMHhEQiwgMHhFMywgLyogMHg2OC0weDZCICovCisJMHg4OCwgMHg3MSwgMHhEQiwgMHhFOCwgMHg4OCwgMHg3MiwgMHhDNSwgMHhGNywgLyogMHg2Qy0weDZGICovCisJMHg4OCwgMHg3MywgMHg4OCwgMHg3NCwgMHg4OCwgMHg3NSwgMHhEQiwgMHhFQSwgLyogMHg3MC0weDczICovCisJMHg4OCwgMHg3NiwgMHg4OCwgMHg3NywgMHhEQiwgMHhFOSwgMHhCRiwgMHhDMCwgLyogMHg3NC0weDc3ICovCisJMHg4OCwgMHg3OCwgMHg4OCwgMHg3OSwgMHg4OCwgMHg3QSwgMHhEQiwgMHhFNiwgLyogMHg3OC0weDdCICovCisJMHhEQiwgMHhFNSwgMHg4OCwgMHg3QiwgMHg4OCwgMHg3QywgMHg4OCwgMHg3RCwgLyogMHg3Qy0weDdGICovCisJCisJMHg4OCwgMHg3RSwgMHg4OCwgMHg4MCwgMHhCNCwgMHhCOSwgMHhDMCwgMHhBQywgLyogMHg4MC0weDgzICovCisJMHhDMiwgMHhBMiwgMHhEQiwgMHhFMiwgMHhEQiwgMHhFNCwgMHg4OCwgMHg4MSwgLyogMHg4NC0weDg3ICovCisJMHg4OCwgMHg4MiwgMHg4OCwgMHg4MywgMHg4OCwgMHg4NCwgMHhEMCwgMHhDRCwgLyogMHg4OC0weDhCICovCisJMHhEQiwgMHhFRCwgMHg4OCwgMHg4NSwgMHg4OCwgMHg4NiwgMHg4OCwgMHg4NywgLyogMHg4Qy0weDhGICovCisJMHg4OCwgMHg4OCwgMHg4OCwgMHg4OSwgMHhDMCwgMHhERCwgMHhEQiwgMHhGMiwgLyogMHg5MC0weDkzICovCisJMHg4OCwgMHg4QSwgMHg4OCwgMHg4QiwgMHg4OCwgMHg4QywgMHg4OCwgMHg4RCwgLyogMHg5NC0weDk3ICovCisJMHg4OCwgMHg4RSwgMHg4OCwgMHg4RiwgMHg4OCwgMHg5MCwgMHhCNiwgMHhFMiwgLyogMHg5OC0weDlCICovCisJMHg4OCwgMHg5MSwgMHg4OCwgMHg5MiwgMHg4OCwgMHg5MywgMHg4OCwgMHg5NCwgLyogMHg5Qy0weDlGICovCisJMHhEQiwgMHhGMywgMHhEQiwgMHhEMiwgMHhCOSwgMHhCOCwgMHhENCwgMHhBQiwgLyogMHhBMC0weEEzICovCisJMHhEQiwgMHhFQywgMHg4OCwgMHg5NSwgMHhCRiwgMHhEMSwgMHhEQiwgMHhGMCwgLyogMHhBNC0weEE3ICovCisJMHg4OCwgMHg5NiwgMHhEQiwgMHhEMSwgMHg4OCwgMHg5NywgMHhCNSwgMHhFNiwgLyogMHhBOC0weEFCICovCisJMHg4OCwgMHg5OCwgMHhEQiwgMHhFQiwgMHhCRiwgMHhFNSwgMHg4OCwgMHg5OSwgLyogMHhBQy0weEFGICovCisJMHg4OCwgMHg5QSwgMHg4OCwgMHg5QiwgMHhEQiwgMHhFRSwgMHg4OCwgMHg5QywgLyogMHhCMC0weEIzICovCisJMHhEQiwgMHhGMSwgMHg4OCwgMHg5RCwgMHg4OCwgMHg5RSwgMHg4OCwgMHg5RiwgLyogMHhCNC0weEI3ICovCisJMHhEQiwgMHhGOSwgMHg4OCwgMHhBMCwgMHg4OCwgMHhBMSwgMHg4OCwgMHhBMiwgLyogMHhCOC0weEJCICovCisJMHg4OCwgMHhBMywgMHg4OCwgMHhBNCwgMHg4OCwgMHhBNSwgMHg4OCwgMHhBNiwgLyogMHhCQy0weEJGICovCisJMHg4OCwgMHhBNywgMHg4OCwgMHhBOCwgMHhCOSwgMHhBMSwgMHhCMCwgMHhBMywgLyogMHhDMC0weEMzICovCisJMHg4OCwgMHhBOSwgMHg4OCwgMHhBQSwgMHg4OCwgMHhBQiwgMHg4OCwgMHhBQywgLyogMHhDNC0weEM3ICovCisJMHg4OCwgMHhBRCwgMHg4OCwgMHhBRSwgMHg4OCwgMHhBRiwgMHhDMiwgMHhGMSwgLyogMHhDOC0weENCICovCisJMHg4OCwgMHhCMCwgMHg4OCwgMHhCMSwgMHhCMywgMHhDNywgMHhEQiwgMHhFRiwgLyogMHhDQy0weENGICovCisJMHg4OCwgMHhCMiwgMHg4OCwgMHhCMywgMHhEQiwgMHhGOCwgMHg4OCwgMHhCNCwgLyogMHhEMC0weEQzICovCisJMHhDNiwgMHhEMiwgMHhEQiwgMHhGNCwgMHg4OCwgMHhCNSwgMHg4OCwgMHhCNiwgLyogMHhENC0weEQ3ICovCisJMHhEQiwgMHhGNSwgMHhEQiwgMHhGNywgMHhEQiwgMHhGNiwgMHg4OCwgMHhCNywgLyogMHhEOC0weERCICovCisJMHg4OCwgMHhCOCwgMHhEQiwgMHhGRSwgMHg4OCwgMHhCOSwgMHhEMywgMHhGMiwgLyogMHhEQy0weERGICovCisJMHhCMiwgMHhCQSwgMHg4OCwgMHhCQSwgMHg4OCwgMHhCQiwgMHg4OCwgMHhCQywgLyogMHhFMC0weEUzICovCisJMHhEQiwgMHhGRCwgMHg4OCwgMHhCRCwgMHg4OCwgMHhCRSwgMHg4OCwgMHhCRiwgLyogMHhFNC0weEU3ICovCisJMHg4OCwgMHhDMCwgMHg4OCwgMHhDMSwgMHg4OCwgMHhDMiwgMHg4OCwgMHhDMywgLyogMHhFOC0weEVCICovCisJMHg4OCwgMHhDNCwgMHhEQywgMHhBNCwgMHg4OCwgMHhDNSwgMHhEQiwgMHhGQiwgLyogMHhFQy0weEVGICovCisJMHg4OCwgMHhDNiwgMHg4OCwgMHhDNywgMHg4OCwgMHhDOCwgMHg4OCwgMHhDOSwgLyogMHhGMC0weEYzICovCisJMHhEQiwgMHhGQSwgMHg4OCwgMHhDQSwgMHg4OCwgMHhDQiwgMHg4OCwgMHhDQywgLyogMHhGNC0weEY3ICovCisJMHhEQiwgMHhGQywgMHhDNSwgMHhFMCwgMHhCQiwgMHhGOSwgMHg4OCwgMHhDRCwgLyogMHhGOC0weEZCICovCisJMHg4OCwgMHhDRSwgMHhEQywgMHhBMywgMHg4OCwgMHhDRiwgMHg4OCwgMHhEMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNThbNTEyXSA9IHsKKwkweERDLCAweEE1LCAweDg4LCAweEQxLCAweENDLCAweEMzLCAweDg4LCAweEQyLCAvKiAweDAwLTB4MDMgKi8KKwkweDg4LCAweEQzLCAweDg4LCAweEQ0LCAweEI2LCAweEQxLCAweERELCAweEMwLCAvKiAweDA0LTB4MDcgKi8KKwkweDg4LCAweEQ1LCAweDg4LCAweEQ2LCAweDg4LCAweEQ3LCAweERDLCAweEExLCAvKiAweDA4LTB4MEIgKi8KKwkweDg4LCAweEQ4LCAweERDLCAweEEyLCAweDg4LCAweEQ5LCAweDg4LCAweERBLCAvKiAweDBDLTB4MEYgKi8KKwkweDg4LCAweERCLCAweEM3LCAweEI1LCAweDg4LCAweERDLCAweDg4LCAweERELCAvKiAweDEwLTB4MTMgKi8KKwkweDg4LCAweERFLCAweEI2LCAweEU5LCAweDg4LCAweERGLCAweDg4LCAweEUwLCAvKiAweDE0LTB4MTcgKi8KKwkweDg4LCAweEUxLCAweERDLCAweEE3LCAweDg4LCAweEUyLCAweDg4LCAweEUzLCAvKiAweDE4LTB4MUIgKi8KKwkweDg4LCAweEU0LCAweDg4LCAweEU1LCAweERDLCAweEE2LCAweDg4LCAweEU2LCAvKiAweDFDLTB4MUYgKi8KKwkweERDLCAweEE5LCAweEIxLCAweEE0LCAweDg4LCAweEU3LCAweDg4LCAweEU4LCAvKiAweDIwLTB4MjMgKi8KKwkweEI1LCAweENDLCAweDg4LCAweEU5LCAweDg4LCAweEVBLCAweDg4LCAweEVCLCAvKiAweDI0LTB4MjcgKi8KKwkweDg4LCAweEVDLCAweDg4LCAweEVELCAweEJGLCAweEIwLCAweDg4LCAweEVFLCAvKiAweDI4LTB4MkIgKi8KKwkweDg4LCAweEVGLCAweDg4LCAweEYwLCAweDg4LCAweEYxLCAweDg4LCAweEYyLCAvKiAweDJDLTB4MkYgKi8KKwkweEQxLCAweERGLCAweDg4LCAweEYzLCAweDg4LCAweEY0LCAweDg4LCAweEY1LCAvKiAweDMwLTB4MzMgKi8KKwkweDg4LCAweEY2LCAweEI2LCAweEMyLCAweDg4LCAweEY3LCAweDg4LCAweEY4LCAvKiAweDM0LTB4MzcgKi8KKwkweDg4LCAweEY5LCAweDg4LCAweEZBLCAweDg4LCAweEZCLCAweDg4LCAweEZDLCAvKiAweDM4LTB4M0IgKi8KKwkweDg4LCAweEZELCAweDg4LCAweEZFLCAweDg5LCAweDQwLCAweDg5LCAweDQxLCAvKiAweDNDLTB4M0YgKi8KKwkweDg5LCAweDQyLCAweDg5LCAweDQzLCAweDg5LCAweDQ0LCAweDg5LCAweDQ1LCAvKiAweDQwLTB4NDMgKi8KKwkweERDLCAweEE4LCAweDg5LCAweDQ2LCAweDg5LCAweDQ3LCAweDg5LCAweDQ4LCAvKiAweDQ0LTB4NDcgKi8KKwkweDg5LCAweDQ5LCAweDg5LCAweDRBLCAweDg5LCAweDRCLCAweDg5LCAweDRDLCAvKiAweDQ4LTB4NEIgKi8KKwkweENCLCAweEZBLCAweEVCLCAweEYzLCAweDg5LCAweDRELCAweDg5LCAweDRFLCAvKiAweDRDLTB4NEYgKi8KKwkweDg5LCAweDRGLCAweENCLCAweERDLCAweDg5LCAweDUwLCAweDg5LCAweDUxLCAvKiAweDUwLTB4NTMgKi8KKwkweENCLCAweEZFLCAweDg5LCAweDUyLCAweDg5LCAweDUzLCAweDg5LCAweDU0LCAvKiAweDU0LTB4NTcgKi8KKwkweENDLCAweEMxLCAweDg5LCAweDU1LCAweDg5LCAweDU2LCAweDg5LCAweDU3LCAvKiAweDU4LTB4NUIgKi8KKwkweDg5LCAweDU4LCAweDg5LCAweDU5LCAweEM4LCAweEZCLCAweDg5LCAweDVBLCAvKiAweDVDLTB4NUYgKi8KKwkweDg5LCAweDVCLCAweDg5LCAweDVDLCAweDg5LCAweDVELCAweDg5LCAweDVFLCAvKiAweDYwLTB4NjMgKi8KKwkweDg5LCAweDVGLCAweERDLCAweEFBLCAweDg5LCAweDYwLCAweDg5LCAweDYxLCAvKiAweDY0LTB4NjcgKi8KKwkweDg5LCAweDYyLCAweDg5LCAweDYzLCAweDg5LCAweDY0LCAweENDLCAweEVFLCAvKiAweDY4LTB4NkIgKi8KKwkweERDLCAweEFCLCAweDg5LCAweDY1LCAweDg5LCAweDY2LCAweDg5LCAweDY3LCAvKiAweDZDLTB4NkYgKi8KKwkweDg5LCAweDY4LCAweDg5LCAweDY5LCAweDg5LCAweDZBLCAweDg5LCAweDZCLCAvKiAweDcwLTB4NzMgKi8KKwkweDg5LCAweDZDLCAweDg5LCAweDZELCAweDg5LCAweDZFLCAweDg5LCAweDZGLCAvKiAweDc0LTB4NzcgKi8KKwkweDg5LCAweDcwLCAweDg5LCAweDcxLCAweDg5LCAweDcyLCAweDg5LCAweDczLCAvKiAweDc4LTB4N0IgKi8KKwkweDg5LCAweDc0LCAweDg5LCAweDc1LCAweERCLCAweEQzLCAweDg5LCAweDc2LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweERDLCAweEFGLCAweERDLCAweEFDLCAweDg5LCAweDc3LCAweEJFLCAweEIzLCAvKiAweDgwLTB4ODMgKi8KKwkweDg5LCAweDc4LCAweENBLCAweEZCLCAweDg5LCAweDc5LCAweDg5LCAweDdBLCAvKiAweDg0LTB4ODcgKi8KKwkweDg5LCAweDdCLCAweERDLCAweEFELCAweDg5LCAweDdDLCAweDg5LCAweDdELCAvKiAweDg4LTB4OEIgKi8KKwkweDg5LCAweDdFLCAweDg5LCAweDgwLCAweDg5LCAweDgxLCAweDg5LCAweDgyLCAvKiAweDhDLTB4OEYgKi8KKwkweDg5LCAweDgzLCAweDg5LCAweDg0LCAweEM5LCAweENBLCAweEM0LCAweEI5LCAvKiAweDkwLTB4OTMgKi8KKwkweDg5LCAweDg1LCAweDg5LCAweDg2LCAweDg5LCAweDg3LCAweDg5LCAweDg4LCAvKiAweDk0LTB4OTcgKi8KKwkweDg5LCAweDg5LCAweEM3LCAweEJELCAweERDLCAweEFFLCAweDg5LCAweDhBLCAvKiAweDk4LTB4OUIgKi8KKwkweDg5LCAweDhCLCAweDg5LCAweDhDLCAweEQ0LCAweEY2LCAweEQwLCAweEU2LCAvKiAweDlDLTB4OUYgKi8KKwkweDg5LCAweDhELCAweDg5LCAweDhFLCAweDg5LCAweDhGLCAweDg5LCAweDkwLCAvKiAweEEwLTB4QTMgKi8KKwkweDg5LCAweDkxLCAweDg5LCAweDkyLCAweDg5LCAweDkzLCAweDg5LCAweDk0LCAvKiAweEE0LTB4QTcgKi8KKwkweEM0LCAweEFCLCAweEI2LCAweEQ1LCAweDg5LCAweDk1LCAweDg5LCAweDk2LCAvKiAweEE4LTB4QUIgKi8KKwkweDg5LCAweDk3LCAweDg5LCAweDk4LCAweDg5LCAweDk5LCAweDg5LCAweDlBLCAvKiAweEFDLTB4QUYgKi8KKwkweDg5LCAweDlCLCAweDg5LCAweDlDLCAweDg5LCAweDlELCAweDg5LCAweDlFLCAvKiAweEIwLTB4QjMgKi8KKwkweDg5LCAweDlGLCAweDg5LCAweEEwLCAweDg5LCAweEExLCAweDg5LCAweEEyLCAvKiAweEI0LTB4QjcgKi8KKwkweDg5LCAweEEzLCAweDg5LCAweEE0LCAweDg5LCAweEE1LCAweDg5LCAweEE2LCAvKiAweEI4LTB4QkIgKi8KKwkweERCLCAweEQ0LCAweDg5LCAweEE3LCAweDg5LCAweEE4LCAweDg5LCAweEE5LCAvKiAweEJDLTB4QkYgKi8KKwkweDg5LCAweEFBLCAweEIxLCAweERBLCAweDg5LCAweEFCLCAweDg5LCAweEFDLCAvKiAweEMwLTB4QzMgKi8KKwkweDg5LCAweEFELCAweERCLCAweEQ1LCAweDg5LCAweEFFLCAweDg5LCAweEFGLCAvKiAweEM0LTB4QzcgKi8KKwkweDg5LCAweEIwLCAweDg5LCAweEIxLCAweDg5LCAweEIyLCAweDg5LCAweEIzLCAvKiAweEM4LTB4Q0IgKi8KKwkweDg5LCAweEI0LCAweDg5LCAweEI1LCAweDg5LCAweEI2LCAweDg5LCAweEI3LCAvKiAweENDLTB4Q0YgKi8KKwkweDg5LCAweEI4LCAweERCLCAweEQ2LCAweDg5LCAweEI5LCAweDg5LCAweEJBLCAvKiAweEQwLTB4RDMgKi8KKwkweDg5LCAweEJCLCAweEJBLCAweEJFLCAweDg5LCAweEJDLCAweDg5LCAweEJELCAvKiAweEQ0LTB4RDcgKi8KKwkweDg5LCAweEJFLCAweDg5LCAweEJGLCAweDg5LCAweEMwLCAweDg5LCAweEMxLCAvKiAweEQ4LTB4REIgKi8KKwkweDg5LCAweEMyLCAweDg5LCAweEMzLCAweDg5LCAweEM0LCAweDg5LCAweEM1LCAvKiAweERDLTB4REYgKi8KKwkweDg5LCAweEM2LCAweDg5LCAweEM3LCAweDg5LCAweEM4LCAweDg5LCAweEM5LCAvKiAweEUwLTB4RTMgKi8KKwkweEM4LCAweEMwLCAweDg5LCAweENBLCAweDg5LCAweENCLCAweDg5LCAweENDLCAvKiAweEU0LTB4RTcgKi8KKwkweDg5LCAweENELCAweDg5LCAweENFLCAweDg5LCAweENGLCAweENBLCAweEJGLCAvKiAweEU4LTB4RUIgKi8KKwkweEM4LCAweEM5LCAweDg5LCAweEQwLCAweEQ3LCAweEIzLCAweDg5LCAweEQxLCAvKiAweEVDLTB4RUYgKi8KKwkweEM5LCAweEY5LCAweDg5LCAweEQyLCAweDg5LCAweEQzLCAweEJGLCAweEM3LCAvKiAweEYwLTB4RjMgKi8KKwkweDg5LCAweEQ0LCAweDg5LCAweEQ1LCAweEJBLCAweEY4LCAweDg5LCAweEQ2LCAvKiAweEY0LTB4RjcgKi8KKwkweDg5LCAweEQ3LCAweEQyLCAweEJDLCAweDg5LCAweEQ4LCAweDg5LCAweEQ5LCAvKiAweEY4LTB4RkIgKi8KKwkweDg5LCAweERBLCAweDg5LCAweERCLCAweDg5LCAweERDLCAweDg5LCAweERELCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181OVs1MTJdID0geworCTB4ODksIDB4REUsIDB4ODksIDB4REYsIDB4RTIsIDB4QkEsIDB4ODksIDB4RTAsIC8qIDB4MDAtMHgwMyAqLworCTB4QjQsIDB4QTYsIDB4ODksIDB4RTEsIDB4ODksIDB4RTIsIDB4QjEsIDB4QjgsIC8qIDB4MDQtMHgwNyAqLworCTB4ODksIDB4RTMsIDB4ODksIDB4RTQsIDB4ODksIDB4RTUsIDB4ODksIDB4RTYsIC8qIDB4MDgtMHgwQiAqLworCTB4ODksIDB4RTcsIDB4QjgsIDB4QjQsIDB4ODksIDB4RTgsIDB4Q0YsIDB4QzQsIC8qIDB4MEMtMHgwRiAqLworCTB4ODksIDB4RTksIDB4ODksIDB4RUEsIDB4ODksIDB4RUIsIDB4ODksIDB4RUMsIC8qIDB4MTAtMHgxMyAqLworCTB4RDksIDB4RTcsIDB4Q0YsIDB4QTYsIDB4Q0QsIDB4RTIsIDB4ODksIDB4RUQsIC8qIDB4MTQtMHgxNyAqLworCTB4ODksIDB4RUUsIDB4RDksIDB4RUQsIDB4QjYsIDB4RTAsIDB4ODksIDB4RUYsIC8qIDB4MTgtMHgxQiAqLworCTB4RDIsIDB4QjksIDB4ODksIDB4RjAsIDB4ODksIDB4RjEsIDB4QjksIDB4QkIsIC8qIDB4MUMtMHgxRiAqLworCTB4ODksIDB4RjIsIDB4ODksIDB4RjMsIDB4ODksIDB4RjQsIDB4ODksIDB4RjUsIC8qIDB4MjAtMHgyMyAqLworCTB4RTIsIDB4QjksIDB4RTIsIDB4QjcsIDB4ODksIDB4RjYsIDB4QjQsIDB4RjMsIC8qIDB4MjQtMHgyNyAqLworCTB4ODksIDB4RjcsIDB4Q0MsIDB4RUMsIDB4Q0MsIDB4QUIsIDB4QjcsIDB4RjIsIC8qIDB4MjgtMHgyQiAqLworCTB4ODksIDB4RjgsIDB4RDgsIDB4QjIsIDB4RDEsIDB4RUIsIDB4QkEsIDB4QkIsIC8qIDB4MkMtMHgyRiAqLworCTB4ODksIDB4RjksIDB4Q0EsIDB4QTcsIDB4ODksIDB4RkEsIDB4ODksIDB4RkIsIC8qIDB4MzAtMHgzMyAqLworCTB4Q0QsIDB4QjcsIDB4ODksIDB4RkMsIDB4ODksIDB4RkQsIDB4RDIsIDB4QzQsIC8qIDB4MzQtMHgzNyAqLworCTB4QkYsIDB4RTQsIDB4QkMsIDB4RDAsIDB4QjYsIDB4RTEsIDB4ODksIDB4RkUsIC8qIDB4MzgtMHgzQiAqLworCTB4REUsIDB4QzUsIDB4OEEsIDB4NDAsIDB4OEEsIDB4NDEsIDB4OEEsIDB4NDIsIC8qIDB4M0MtMHgzRiAqLworCTB4OEEsIDB4NDMsIDB4REUsIDB4QzYsIDB4REIsIDB4QkMsIDB4OEEsIDB4NDQsIC8qIDB4NDAtMHg0MyAqLworCTB4RDEsIDB4RDksIDB4OEEsIDB4NDUsIDB4OEEsIDB4NDYsIDB4QzYsIDB4RTYsIC8qIDB4NDQtMHg0NyAqLworCTB4QzQsIDB4Q0UsIDB4QjcsIDB4RUUsIDB4OEEsIDB4NDcsIDB4QjcsIDB4REMsIC8qIDB4NDgtMHg0QiAqLworCTB4OEEsIDB4NDgsIDB4OEEsIDB4NDksIDB4QkYsIDB4RkMsIDB4RDcsIDB4RTAsIC8qIDB4NEMtMHg0RiAqLworCTB4OEEsIDB4NEEsIDB4QzYsIDB4RjUsIDB4OEEsIDB4NEIsIDB4OEEsIDB4NEMsIC8qIDB4NTAtMHg1MyAqLworCTB4QjEsIDB4QkMsIDB4REUsIDB4QzgsIDB4QkQsIDB4QjEsIDB4Q0MsIDB4RDcsIC8qIDB4NTQtMHg1NyAqLworCTB4REUsIDB4Q0EsIDB4OEEsIDB4NEQsIDB4REUsIDB4QzksIDB4OEEsIDB4NEUsIC8qIDB4NTgtMHg1QiAqLworCTB4OEEsIDB4NEYsIDB4OEEsIDB4NTAsIDB4OEEsIDB4NTEsIDB4OEEsIDB4NTIsIC8qIDB4NUMtMHg1RiAqLworCTB4QjUsIDB4RUMsIDB4OEEsIDB4NTMsIDB4QzksIDB4REQsIDB4OEEsIDB4NTQsIC8qIDB4NjAtMHg2MyAqLworCTB4OEEsIDB4NTUsIDB4QjAsIDB4QzIsIDB4OEEsIDB4NTYsIDB4OEEsIDB4NTcsIC8qIDB4NjQtMHg2NyAqLworCTB4OEEsIDB4NTgsIDB4OEEsIDB4NTksIDB4OEEsIDB4NUEsIDB4OEEsIDB4NUIsIC8qIDB4NjgtMHg2QiAqLworCTB4OEEsIDB4NUMsIDB4OEEsIDB4NUQsIDB4OEEsIDB4NUUsIDB4OEEsIDB4NUYsIC8qIDB4NkMtMHg2RiAqLworCTB4OEEsIDB4NjAsIDB4OEEsIDB4NjEsIDB4OEEsIDB4NjIsIDB4QzUsIDB4QUUsIC8qIDB4NzAtMHg3MyAqLworCTB4QzUsIDB4QUIsIDB4OEEsIDB4NjMsIDB4QzQsIDB4Q0MsIDB4OEEsIDB4NjQsIC8qIDB4NzQtMHg3NyAqLworCTB4QkMsIDB4RTksIDB4Q0IsIDB4RkQsIDB4OEEsIDB4NjUsIDB4OEEsIDB4NjYsIC8qIDB4NzgtMHg3QiAqLworCTB4OEEsIDB4NjcsIDB4QkEsIDB4QzMsIDB4OEEsIDB4NjgsIDB4OEEsIDB4NjksIC8qIDB4N0MtMHg3RiAqLworCQorCTB4OEEsIDB4NkEsIDB4RTUsIDB4RjksIDB4QzgsIDB4RTcsIDB4RTUsIDB4RkEsIC8qIDB4ODAtMHg4MyAqLworCTB4Q0QsIDB4RkQsIDB4OEEsIDB4NkIsIDB4RDcsIDB4QjEsIDB4QjgsIDB4QkUsIC8qIDB4ODQtMHg4NyAqLworCTB4QzIsIDB4RTgsIDB4OEEsIDB4NkMsIDB4QzgsIDB4RDEsIDB4OEEsIDB4NkQsIC8qIDB4ODgtMHg4QiAqLworCTB4OEEsIDB4NkUsIDB4RTUsIDB4RkIsIDB4OEEsIDB4NkYsIDB4OEEsIDB4NzAsIC8qIDB4OEMtMHg4RiAqLworCTB4OEEsIDB4NzEsIDB4OEEsIDB4NzIsIDB4QjYsIDB4Q0EsIDB4QkMsIDB4Q0IsIC8qIDB4OTAtMHg5MyAqLworCTB4OEEsIDB4NzMsIDB4OEEsIDB4NzQsIDB4RDEsIDB4RkQsIDB4RTYsIDB4QTEsIC8qIDB4OTQtMHg5NyAqLworCTB4OEEsIDB4NzUsIDB4QzMsIDB4RUUsIDB4OEEsIDB4NzYsIDB4OEEsIDB4NzcsIC8qIDB4OTgtMHg5QiAqLworCTB4OEEsIDB4NzgsIDB4OEEsIDB4NzksIDB4RTYsIDB4QTQsIDB4OEEsIDB4N0EsIC8qIDB4OUMtMHg5RiAqLworCTB4OEEsIDB4N0IsIDB4OEEsIDB4N0MsIDB4OEEsIDB4N0QsIDB4RTUsIDB4RkUsIC8qIDB4QTAtMHhBMyAqLworCTB4RTYsIDB4QTUsIDB4Q0QsIDB4RDcsIDB4OEEsIDB4N0UsIDB4OEEsIDB4ODAsIC8qIDB4QTQtMHhBNyAqLworCTB4QjcsIDB4QzEsIDB4RTUsIDB4RkMsIDB4RTUsIDB4RkQsIDB4RTYsIDB4QTMsIC8qIDB4QTgtMHhBQiAqLworCTB4OEEsIDB4ODEsIDB4OEEsIDB4ODIsIDB4QzQsIDB4REQsIDB4RTYsIDB4QTgsIC8qIDB4QUMtMHhBRiAqLworCTB4OEEsIDB4ODMsIDB4OEEsIDB4ODQsIDB4RTYsIDB4QTcsIDB4OEEsIDB4ODUsIC8qIDB4QjAtMHhCMyAqLworCTB4OEEsIDB4ODYsIDB4OEEsIDB4ODcsIDB4OEEsIDB4ODgsIDB4OEEsIDB4ODksIC8qIDB4QjQtMHhCNyAqLworCTB4OEEsIDB4OEEsIDB4QzMsIDB4QzMsIDB4OEEsIDB4OEIsIDB4QzYsIDB4REUsIC8qIDB4QjgtMHhCQiAqLworCTB4OEEsIDB4OEMsIDB4OEEsIDB4OEQsIDB4RTYsIDB4QUEsIDB4OEEsIDB4OEUsIC8qIDB4QkMtMHhCRiAqLworCTB4OEEsIDB4OEYsIDB4OEEsIDB4OTAsIDB4OEEsIDB4OTEsIDB4OEEsIDB4OTIsIC8qIDB4QzAtMHhDMyAqLworCTB4OEEsIDB4OTMsIDB4OEEsIDB4OTQsIDB4QzQsIDB4QjcsIDB4OEEsIDB4OTUsIC8qIDB4QzQtMHhDNyAqLworCTB4OEEsIDB4OTYsIDB4OEEsIDB4OTcsIDB4RTYsIDB4QTIsIDB4Q0EsIDB4QkMsIC8qIDB4QzgtMHhDQiAqLworCTB4OEEsIDB4OTgsIDB4OEEsIDB4OTksIDB4OEEsIDB4OUEsIDB4OEEsIDB4OUIsIC8qIDB4Q0MtMHhDRiAqLworCTB4QkQsIDB4RTMsIDB4QjksIDB4QzMsIDB4RTYsIDB4QTYsIDB4RDAsIDB4RDUsIC8qIDB4RDAtMHhEMyAqLworCTB4Q0UsIDB4QUYsIDB4OEEsIDB4OUMsIDB4OEEsIDB4OUQsIDB4RTYsIDB4QTksIC8qIDB4RDQtMHhENyAqLworCTB4RTYsIDB4QjAsIDB4OEEsIDB4OUUsIDB4RDIsIDB4QTYsIDB4OEEsIDB4OUYsIC8qIDB4RDgtMHhEQiAqLworCTB4QkQsIDB4QUEsIDB4RTYsIDB4QUQsIDB4OEEsIDB4QTAsIDB4OEEsIDB4QTEsIC8qIDB4REMtMHhERiAqLworCTB4OEEsIDB4QTIsIDB4OEEsIDB4QTMsIDB4OEEsIDB4QTQsIDB4RTYsIDB4QUYsIC8qIDB4RTAtMHhFMyAqLworCTB4OEEsIDB4QTUsIDB4QzAsIDB4RDEsIDB4OEEsIDB4QTYsIDB4OEEsIDB4QTcsIC8qIDB4RTQtMHhFNyAqLworCTB4RDIsIDB4Q0MsIDB4OEEsIDB4QTgsIDB4OEEsIDB4QTksIDB4OEEsIDB4QUEsIC8qIDB4RTgtMHhFQiAqLworCTB4QkMsIDB4QTcsIDB4OEEsIDB4QUIsIDB4OEEsIDB4QUMsIDB4OEEsIDB4QUQsIC8qIDB4RUMtMHhFRiAqLworCTB4OEEsIDB4QUUsIDB4OEEsIDB4QUYsIDB4OEEsIDB4QjAsIDB4OEEsIDB4QjEsIC8qIDB4RjAtMHhGMyAqLworCTB4OEEsIDB4QjIsIDB4OEEsIDB4QjMsIDB4OEEsIDB4QjQsIDB4OEEsIDB4QjUsIC8qIDB4RjQtMHhGNyAqLworCTB4OEEsIDB4QjYsIDB4RTYsIDB4QjEsIDB4OEEsIDB4QjcsIDB4RDIsIDB4RjYsIC8qIDB4RjgtMHhGQiAqLworCTB4OEEsIDB4QjgsIDB4OEEsIDB4QjksIDB4OEEsIDB4QkEsIDB4RDcsIDB4Q0IsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzVBWzUxMl0gPSB7CisJMHg4QSwgMHhCQiwgMHhDRCwgMHhGRSwgMHg4QSwgMHhCQywgMHhDRCwgMHhERSwgLyogMHgwMC0weDAzICovCisJMHhDMiwgMHhBNiwgMHhFNiwgMHhBQiwgMHhFNiwgMHhBQywgMHhCRCwgMHhCRiwgLyogMHgwNC0weDA3ICovCisJMHhFNiwgMHhBRSwgMHhFNiwgMHhCMywgMHg4QSwgMHhCRCwgMHg4QSwgMHhCRSwgLyogMHgwOC0weDBCICovCisJMHhFNiwgMHhCMiwgMHg4QSwgMHhCRiwgMHg4QSwgMHhDMCwgMHg4QSwgMHhDMSwgLyogMHgwQy0weDBGICovCisJMHg4QSwgMHhDMiwgMHhFNiwgMHhCNiwgMHg4QSwgMHhDMywgMHhFNiwgMHhCOCwgLyogMHgxMC0weDEzICovCisJMHg4QSwgMHhDNCwgMHg4QSwgMHhDNSwgMHg4QSwgMHhDNiwgMHg4QSwgMHhDNywgLyogMHgxNC0weDE3ICovCisJMHhDNCwgMHhFRiwgMHg4QSwgMHhDOCwgMHg4QSwgMHhDOSwgMHg4QSwgMHhDQSwgLyogMHgxOC0weDFCICovCisJMHhDNCwgMHhDOCwgMHg4QSwgMHhDQiwgMHg4QSwgMHhDQywgMHhCRSwgMHhFQSwgLyogMHgxQy0weDFGICovCisJMHhDOSwgMHhFRiwgMHg4QSwgMHhDRCwgMHg4QSwgMHhDRSwgMHhFNiwgMHhCNywgLyogMHgyMC0weDIzICovCisJMHg4QSwgMHhDRiwgMHhCNiwgMHhGMCwgMHg4QSwgMHhEMCwgMHg4QSwgMHhEMSwgLyogMHgyNC0weDI3ICovCisJMHg4QSwgMHhEMiwgMHhDMywgMHhFNCwgMHg4QSwgMHhEMywgMHg4QSwgMHhENCwgLyogMHgyOC0weDJCICovCisJMHg4QSwgMHhENSwgMHg4QSwgMHhENiwgMHg4QSwgMHhENywgMHg4QSwgMHhEOCwgLyogMHgyQy0weDJGICovCisJMHg4QSwgMHhEOSwgMHhEMywgMHhFOSwgMHhFNiwgMHhCNCwgMHg4QSwgMHhEQSwgLyogMHgzMC0weDMzICovCisJMHhFNiwgMHhCNSwgMHg4QSwgMHhEQiwgMHhDOCwgMHhBMiwgMHg4QSwgMHhEQywgLyogMHgzNC0weDM3ICovCisJMHg4QSwgMHhERCwgMHg4QSwgMHhERSwgMHg4QSwgMHhERiwgMHg4QSwgMHhFMCwgLyogMHgzOC0weDNCICovCisJMHhFNiwgMHhCRCwgMHg4QSwgMHhFMSwgMHg4QSwgMHhFMiwgMHg4QSwgMHhFMywgLyogMHgzQy0weDNGICovCisJMHhFNiwgMHhCOSwgMHg4QSwgMHhFNCwgMHg4QSwgMHhFNSwgMHg4QSwgMHhFNiwgLyogMHg0MC0weDQzICovCisJMHg4QSwgMHhFNywgMHg4QSwgMHhFOCwgMHhDNiwgMHhDNSwgMHg4QSwgMHhFOSwgLyogMHg0NC0weDQ3ICovCisJMHg4QSwgMHhFQSwgMHhDRCwgMHhGMSwgMHhFNiwgMHhCQiwgMHg4QSwgMHhFQiwgLyogMHg0OC0weDRCICovCisJMHg4QSwgMHhFQywgMHg4QSwgMHhFRCwgMHg4QSwgMHhFRSwgMHg4QSwgMHhFRiwgLyogMHg0Qy0weDRGICovCisJMHg4QSwgMHhGMCwgMHg4QSwgMHhGMSwgMHg4QSwgMHhGMiwgMHg4QSwgMHhGMywgLyogMHg1MC0weDUzICovCisJMHg4QSwgMHhGNCwgMHhFNiwgMHhCQywgMHg4QSwgMHhGNSwgMHg4QSwgMHhGNiwgLyogMHg1NC0weDU3ICovCisJMHg4QSwgMHhGNywgMHg4QSwgMHhGOCwgMHhCQiwgMHhFOSwgMHg4QSwgMHhGOSwgLyogMHg1OC0weDVCICovCisJMHg4QSwgMHhGQSwgMHg4QSwgMHhGQiwgMHg4QSwgMHhGQywgMHg4QSwgMHhGRCwgLyogMHg1Qy0weDVGICovCisJMHg4QSwgMHhGRSwgMHg4QiwgMHg0MCwgMHhFNiwgMHhCRSwgMHg4QiwgMHg0MSwgLyogMHg2MC0weDYzICovCisJMHg4QiwgMHg0MiwgMHg4QiwgMHg0MywgMHg4QiwgMHg0NCwgMHhFNiwgMHhCQSwgLyogMHg2NC0weDY3ICovCisJMHg4QiwgMHg0NSwgMHg4QiwgMHg0NiwgMHhDMCwgMHhCNywgMHg4QiwgMHg0NywgLyogMHg2OC0weDZCICovCisJMHg4QiwgMHg0OCwgMHg4QiwgMHg0OSwgMHg4QiwgMHg0QSwgMHg4QiwgMHg0QiwgLyogMHg2Qy0weDZGICovCisJMHg4QiwgMHg0QywgMHg4QiwgMHg0RCwgMHg4QiwgMHg0RSwgMHg4QiwgMHg0RiwgLyogMHg3MC0weDczICovCisJMHhEMywgMHhBNCwgMHhFNiwgMHhCRiwgMHhDOSwgMHhGNCwgMHhFNiwgMHhDMywgLyogMHg3NC0weDc3ICovCisJMHg4QiwgMHg1MCwgMHg4QiwgMHg1MSwgMHhFNiwgMHhDNCwgMHg4QiwgMHg1MiwgLyogMHg3OC0weDdCICovCisJMHg4QiwgMHg1MywgMHg4QiwgMHg1NCwgMHg4QiwgMHg1NSwgMHhEMCwgMHhGNiwgLyogMHg3Qy0weDdGICovCisJCisJMHg4QiwgMHg1NiwgMHg4QiwgMHg1NywgMHg4QiwgMHg1OCwgMHg4QiwgMHg1OSwgLyogMHg4MC0weDgzICovCisJMHg4QiwgMHg1QSwgMHg4QiwgMHg1QiwgMHg4QiwgMHg1QywgMHg4QiwgMHg1RCwgLyogMHg4NC0weDg3ICovCisJMHg4QiwgMHg1RSwgMHg4QiwgMHg1RiwgMHg4QiwgMHg2MCwgMHg4QiwgMHg2MSwgLyogMHg4OC0weDhCICovCisJMHg4QiwgMHg2MiwgMHg4QiwgMHg2MywgMHg4QiwgMHg2NCwgMHg4QiwgMHg2NSwgLyogMHg4Qy0weDhGICovCisJMHg4QiwgMHg2NiwgMHg4QiwgMHg2NywgMHhDMywgMHhCRCwgMHg4QiwgMHg2OCwgLyogMHg5MC0weDkzICovCisJMHg4QiwgMHg2OSwgMHg4QiwgMHg2QSwgMHg4QiwgMHg2QiwgMHg4QiwgMHg2QywgLyogMHg5NC0weDk3ICovCisJMHg4QiwgMHg2RCwgMHg4QiwgMHg2RSwgMHhDMywgMHhDNCwgMHhFNiwgMHhDMiwgLyogMHg5OC0weDlCICovCisJMHg4QiwgMHg2RiwgMHg4QiwgMHg3MCwgMHg4QiwgMHg3MSwgMHg4QiwgMHg3MiwgLyogMHg5Qy0weDlGICovCisJMHg4QiwgMHg3MywgMHg4QiwgMHg3NCwgMHg4QiwgMHg3NSwgMHg4QiwgMHg3NiwgLyogMHhBMC0weEEzICovCisJMHg4QiwgMHg3NywgMHg4QiwgMHg3OCwgMHg4QiwgMHg3OSwgMHg4QiwgMHg3QSwgLyogMHhBNC0weEE3ICovCisJMHg4QiwgMHg3QiwgMHg4QiwgMHg3QywgMHhFNiwgMHhDMSwgMHg4QiwgMHg3RCwgLyogMHhBOC0weEFCICovCisJMHg4QiwgMHg3RSwgMHg4QiwgMHg4MCwgMHg4QiwgMHg4MSwgMHg4QiwgMHg4MiwgLyogMHhBQy0weEFGICovCisJMHg4QiwgMHg4MywgMHg4QiwgMHg4NCwgMHhFNiwgMHhDNywgMHhDRiwgMHhCMSwgLyogMHhCMC0weEIzICovCisJMHg4QiwgMHg4NSwgMHhFQiwgMHhGNCwgMHg4QiwgMHg4NiwgMHg4QiwgMHg4NywgLyogMHhCNC0weEI3ICovCisJMHhFNiwgMHhDQSwgMHg4QiwgMHg4OCwgMHg4QiwgMHg4OSwgMHg4QiwgMHg4QSwgLyogMHhCOC0weEJCICovCisJMHg4QiwgMHg4QiwgMHg4QiwgMHg4QywgMHhFNiwgMHhDNSwgMHg4QiwgMHg4RCwgLyogMHhCQy0weEJGICovCisJMHg4QiwgMHg4RSwgMHhCQywgMHhERSwgMHhDOSwgMHhBOSwgMHg4QiwgMHg4RiwgLyogMHhDMC0weEMzICovCisJMHg4QiwgMHg5MCwgMHg4QiwgMHg5MSwgMHg4QiwgMHg5MiwgMHg4QiwgMHg5MywgLyogMHhDNC0weEM3ICovCisJMHg4QiwgMHg5NCwgMHhCQywgMHhCNSwgMHg4QiwgMHg5NSwgMHg4QiwgMHg5NiwgLyogMHhDOC0weENCICovCisJMHhDRiwgMHhEMywgMHg4QiwgMHg5NywgMHg4QiwgMHg5OCwgMHg4QiwgMHg5OSwgLyogMHhDQy0weENGICovCisJMHg4QiwgMHg5QSwgMHg4QiwgMHg5QiwgMHhFNiwgMHhDOCwgMHg4QiwgMHg5QywgLyogMHhEMC0weEQzICovCisJMHhFNiwgMHhDOSwgMHg4QiwgMHg5RCwgMHhFNiwgMHhDRSwgMHg4QiwgMHg5RSwgLyogMHhENC0weEQ3ICovCisJMHhFNiwgMHhEMCwgMHg4QiwgMHg5RiwgMHg4QiwgMHhBMCwgMHg4QiwgMHhBMSwgLyogMHhEOC0weERCICovCisJMHhFNiwgMHhEMSwgMHg4QiwgMHhBMiwgMHg4QiwgMHhBMywgMHg4QiwgMHhBNCwgLyogMHhEQy0weERGICovCisJMHhFNiwgMHhDQiwgMHhCNSwgMHhENSwgMHg4QiwgMHhBNSwgMHhFNiwgMHhDQywgLyogMHhFMC0weEUzICovCisJMHg4QiwgMHhBNiwgMHg4QiwgMHhBNywgMHhFNiwgMHhDRiwgMHg4QiwgMHhBOCwgLyogMHhFNC0weEU3ICovCisJMHg4QiwgMHhBOSwgMHhDNCwgMHhEQiwgMHg4QiwgMHhBQSwgMHhFNiwgMHhDNiwgLyogMHhFOC0weEVCICovCisJMHg4QiwgMHhBQiwgMHg4QiwgMHhBQywgMHg4QiwgMHhBRCwgMHg4QiwgMHhBRSwgLyogMHhFQy0weEVGICovCisJMHg4QiwgMHhBRiwgMHhFNiwgMHhDRCwgMHg4QiwgMHhCMCwgMHg4QiwgMHhCMSwgLyogMHhGMC0weEYzICovCisJMHg4QiwgMHhCMiwgMHg4QiwgMHhCMywgMHg4QiwgMHhCNCwgMHg4QiwgMHhCNSwgLyogMHhGNC0weEY3ICovCisJMHg4QiwgMHhCNiwgMHg4QiwgMHhCNywgMHg4QiwgMHhCOCwgMHg4QiwgMHhCOSwgLyogMHhGOC0weEZCICovCisJMHg4QiwgMHhCQSwgMHg4QiwgMHhCQiwgMHg4QiwgMHhCQywgMHg4QiwgMHhCRCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNUJbNTEyXSA9IHsKKwkweDhCLCAweEJFLCAweDhCLCAweEJGLCAweDhCLCAweEMwLCAweDhCLCAweEMxLCAvKiAweDAwLTB4MDMgKi8KKwkweDhCLCAweEMyLCAweDhCLCAweEMzLCAweDhCLCAweEM0LCAweDhCLCAweEM1LCAvKiAweDA0LTB4MDcgKi8KKwkweDhCLCAweEM2LCAweEU2LCAweEQyLCAweDhCLCAweEM3LCAweDhCLCAweEM4LCAvKiAweDA4LTB4MEIgKi8KKwkweDhCLCAweEM5LCAweDhCLCAweENBLCAweDhCLCAweENCLCAweDhCLCAweENDLCAvKiAweDBDLTB4MEYgKi8KKwkweDhCLCAweENELCAweDhCLCAweENFLCAweDhCLCAweENGLCAweDhCLCAweEQwLCAvKiAweDEwLTB4MTMgKi8KKwkweDhCLCAweEQxLCAweDhCLCAweEQyLCAweEU2LCAweEQ0LCAweEU2LCAweEQzLCAvKiAweDE0LTB4MTcgKi8KKwkweDhCLCAweEQzLCAweDhCLCAweEQ0LCAweDhCLCAweEQ1LCAweDhCLCAweEQ2LCAvKiAweDE4LTB4MUIgKi8KKwkweDhCLCAweEQ3LCAweDhCLCAweEQ4LCAweDhCLCAweEQ5LCAweDhCLCAweERBLCAvKiAweDFDLTB4MUYgKi8KKwkweDhCLCAweERCLCAweDhCLCAweERDLCAweDhCLCAweERELCAweDhCLCAweERFLCAvKiAweDIwLTB4MjMgKi8KKwkweDhCLCAweERGLCAweDhCLCAweEUwLCAweDhCLCAweEUxLCAweDhCLCAweEUyLCAvKiAweDI0LTB4MjcgKi8KKwkweDhCLCAweEUzLCAweDhCLCAweEU0LCAweDhCLCAweEU1LCAweDhCLCAweEU2LCAvKiAweDI4LTB4MkIgKi8KKwkweDhCLCAweEU3LCAweDhCLCAweEU4LCAweDhCLCAweEU5LCAweDhCLCAweEVBLCAvKiAweDJDLTB4MkYgKi8KKwkweDhCLCAweEVCLCAweDhCLCAweEVDLCAweEU2LCAweEQ1LCAweDhCLCAweEVELCAvKiAweDMwLTB4MzMgKi8KKwkweEQ5LCAweEY4LCAweDhCLCAweEVFLCAweDhCLCAweEVGLCAweEU2LCAweEQ2LCAvKiAweDM0LTB4MzcgKi8KKwkweDhCLCAweEYwLCAweDhCLCAweEYxLCAweDhCLCAweEYyLCAweDhCLCAweEYzLCAvKiAweDM4LTB4M0IgKi8KKwkweDhCLCAweEY0LCAweDhCLCAweEY1LCAweDhCLCAweEY2LCAweDhCLCAweEY3LCAvKiAweDNDLTB4M0YgKi8KKwkweEU2LCAweEQ3LCAweDhCLCAweEY4LCAweDhCLCAweEY5LCAweDhCLCAweEZBLCAvKiAweDQwLTB4NDMgKi8KKwkweDhCLCAweEZCLCAweDhCLCAweEZDLCAweDhCLCAweEZELCAweDhCLCAweEZFLCAvKiAweDQ0LTB4NDcgKi8KKwkweDhDLCAweDQwLCAweDhDLCAweDQxLCAweDhDLCAweDQyLCAweDhDLCAweDQzLCAvKiAweDQ4LTB4NEIgKi8KKwkweDhDLCAweDQ0LCAweDhDLCAweDQ1LCAweDhDLCAweDQ2LCAweDhDLCAweDQ3LCAvKiAweDRDLTB4NEYgKi8KKwkweEQ3LCAweEQzLCAweEU2LCAweERELCAweDhDLCAweDQ4LCAweEU2LCAweERFLCAvKiAweDUwLTB4NTMgKi8KKwkweEJGLCAweEQ3LCAweEQ0LCAweEQwLCAweDhDLCAweDQ5LCAweEQ3LCAweEQ2LCAvKiAweDU0LTB4NTcgKi8KKwkweEI0LCAweEU2LCAweENCLCAweEVGLCAweEU2LCAweERBLCAweEQ4LCAweEMzLCAvKiAweDU4LTB4NUIgKi8KKwkweEQ3LCAweENFLCAweEQwLCAweEEyLCAweDhDLCAweDRBLCAweEMzLCAweENGLCAvKiAweDVDLTB4NUYgKi8KKwkweDhDLCAweDRCLCAweDhDLCAweDRDLCAweEU2LCAweERGLCAweEJDLCAweEJFLCAvKiAweDYwLTB4NjMgKi8KKwkweEI5LCAweEMyLCAweEU2LCAweERCLCAweEQxLCAweEE3LCAweDhDLCAweDRELCAvKiAweDY0LTB4NjcgKi8KKwkweDhDLCAweDRFLCAweEJBLCAweEEyLCAweEMyLCAweENGLCAweDhDLCAweDRGLCAvKiAweDY4LTB4NkIgKi8KKwkweEQ4LCAweEFCLCAweDhDLCAweDUwLCAweDhDLCAweDUxLCAweDhDLCAweDUyLCAvKiAweDZDLTB4NkYgKi8KKwkweENBLCAweEVCLCAweEU1LCAweEVFLCAweDhDLCAweDUzLCAweEU2LCAweERDLCAvKiAweDcwLTB4NzMgKi8KKwkweDhDLCAweDU0LCAweEI3LCAweEY1LCAweDhDLCAweDU1LCAweDhDLCAweDU2LCAvKiAweDc0LTB4NzcgKi8KKwkweDhDLCAweDU3LCAweDhDLCAweDU4LCAweEM4LCAweEU2LCAweDhDLCAweDU5LCAvKiAweDc4LTB4N0IgKi8KKwkweDhDLCAweDVBLCAweEM0LCAweEY1LCAweDhDLCAweDVCLCAweDhDLCAweDVDLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEU1LCAweEIyLCAweEM0LCAweEZFLCAweDhDLCAweDVELCAweENCLCAweEZDLCAvKiAweDgwLTB4ODMgKi8KKwkweEU1LCAweEIzLCAweEQ1LCAweEFDLCAweDhDLCAweDVFLCAweEQzLCAweEVFLCAvKiAweDg0LTB4ODcgKi8KKwkweENBLCAweEQ4LCAweEIwLCAweEIyLCAweDhDLCAweDVGLCAweENCLCAweENFLCAvKiAweDg4LTB4OEIgKi8KKwkweENELCAweEVBLCAweDhDLCAweDYwLCAweDhDLCAweDYxLCAweEJBLCAweEVBLCAvKiAweDhDLTB4OEYgKi8KKwkweDhDLCAweDYyLCAweDhDLCAweDYzLCAweDhDLCAweDY0LCAweEU1LCAweEI1LCAvKiAweDkwLTB4OTMgKi8KKwkweDhDLCAweDY1LCAweEU1LCAweEI0LCAweDhDLCAweDY2LCAweEQ3LCAweERBLCAvKiAweDk0LTB4OTcgKi8KKwkweEI5LCAweEQ5LCAweEQ2LCAweEU2LCAweEI2LCAweEE4LCAweENELCAweEYwLCAvKiAweDk4LTB4OUIgKi8KKwkweEQyLCAweENCLCAweEIxLCAweEE2LCAweENBLCAweEI1LCAweDhDLCAweDY3LCAvKiAweDlDLTB4OUYgKi8KKwkweEIzLCAweEU4LCAweEM5LCAweEYzLCAweEJGLCAweENELCAweEQwLCAweEZCLCAvKiAweEEwLTB4QTMgKi8KKwkweENBLCAweEQyLCAweEU1LCAweEI2LCAweEJCLCAweEMyLCAweDhDLCAweDY4LCAvKiAweEE0LTB4QTcgKi8KKwkweDhDLCAweDY5LCAweDhDLCAweDZBLCAweENGLCAweERDLCAweEI5LCAweEFDLCAvKiAweEE4LTB4QUIgKi8KKwkweDhDLCAweDZCLCAweDhDLCAweDZDLCAweDhDLCAweDZELCAweDhDLCAweDZFLCAvKiAweEFDLTB4QUYgKi8KKwkweEQ0LCAweEQ3LCAweDhDLCAweDZGLCAweDhDLCAweDcwLCAweEJBLCAweEE2LCAvKiAweEIwLTB4QjMgKi8KKwkweEQxLCAweEU3LCAweENGLCAweEZDLCAweEJDLCAweEQyLCAweDhDLCAweDcxLCAvKiAweEI0LTB4QjcgKi8KKwkweEU1LCAweEI3LCAweEM4LCAweERELCAweDhDLCAweDcyLCAweDhDLCAweDczLCAvKiAweEI4LTB4QkIgKi8KKwkweDhDLCAweDc0LCAweEJGLCAweEVELCAweEIxLCAweEY2LCAweENCLCAweERFLCAvKiAweEJDLTB4QkYgKi8KKwkweDhDLCAweDc1LCAweDhDLCAweDc2LCAweEJDLCAweEM1LCAweDhDLCAweDc3LCAvKiAweEMwLTB4QzMgKi8KKwkweEJDLCAweEM0LCAweEQyLCAweEZBLCAweEMzLCAweERDLCAweEJGLCAweERDLCAvKiAweEM0LTB4QzcgKi8KKwkweDhDLCAweDc4LCAweDhDLCAweDc5LCAweDhDLCAweDdBLCAweDhDLCAweDdCLCAvKiAweEM4LTB4Q0IgKi8KKwkweEI4LCAweEJCLCAweDhDLCAweDdDLCAweDhDLCAweDdELCAweDhDLCAweDdFLCAvKiAweENDLTB4Q0YgKi8KKwkweEMzLCAweEMyLCAweDhDLCAweDgwLCAweEJBLCAweEFFLCAweEQ0LCAweEEyLCAvKiAweEQwLTB4RDMgKi8KKwkweDhDLCAweDgxLCAweDhDLCAweDgyLCAweDhDLCAweDgzLCAweDhDLCAweDg0LCAvKiAweEQ0LTB4RDcgKi8KKwkweDhDLCAweDg1LCAweDhDLCAweDg2LCAweDhDLCAweDg3LCAweDhDLCAweDg4LCAvKiAweEQ4LTB4REIgKi8KKwkweDhDLCAweDg5LCAweEM3LCAweERFLCAweEM0LCAweEFGLCAweEIyLCAweEVDLCAvKiAweERDLTB4REYgKi8KKwkweDhDLCAweDhBLCAweEI5LCAweEQxLCAweDhDLCAweDhCLCAweDhDLCAweDhDLCAvKiAweEUwLTB4RTMgKi8KKwkweEU1LCAweEJCLCAweEMxLCAweEM4LCAweDhDLCAweDhELCAweDhDLCAweDhFLCAvKiAweEU0LTB4RTcgKi8KKwkweEQ1LCAweEFGLCAweDhDLCAweDhGLCAweDhDLCAweDkwLCAweDhDLCAweDkxLCAvKiAweEU4LTB4RUIgKi8KKwkweDhDLCAweDkyLCAweDhDLCAweDkzLCAweEU1LCAweEJDLCAweDhDLCAweDk0LCAvKiAweEVDLTB4RUYgKi8KKwkweEU1LCAweEJFLCAweDhDLCAweDk1LCAweDhDLCAweDk2LCAweDhDLCAweDk3LCAvKiAweEYwLTB4RjMgKi8KKwkweDhDLCAweDk4LCAweDhDLCAweDk5LCAweDhDLCAweDlBLCAweDhDLCAweDlCLCAvKiAweEY0LTB4RjcgKi8KKwkweEI0LCAweEU3LCAweEI2LCAweEQ0LCAweENCLCAweEMyLCAweEQxLCAweEIwLCAvKiAweEY4LTB4RkIgKi8KKwkweEI1LCAweEJDLCAweDhDLCAweDlDLCAweDhDLCAweDlELCAweENBLCAweEQ5LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181Q1s1MTJdID0geworCTB4OEMsIDB4OUUsIDB4QjcsIDB4RTIsIDB4OEMsIDB4OUYsIDB4OEMsIDB4QTAsIC8qIDB4MDAtMHgwMyAqLworCTB4QzksIDB4RTQsIDB4OEMsIDB4QTEsIDB4QkQsIDB4QUIsIDB4OEMsIDB4QTIsIC8qIDB4MDQtMHgwNyAqLworCTB4OEMsIDB4QTMsIDB4Q0UsIDB4QkUsIDB4RDcsIDB4RjAsIDB4OEMsIDB4QTQsIC8qIDB4MDgtMHgwQiAqLworCTB4OEMsIDB4QTUsIDB4OEMsIDB4QTYsIDB4OEMsIDB4QTcsIDB4RDAsIDB4QTEsIC8qIDB4MEMtMHgwRiAqLworCTB4OEMsIDB4QTgsIDB4QzksIDB4RDksIDB4OEMsIDB4QTksIDB4OEMsIDB4QUEsIC8qIDB4MTAtMHgxMyAqLworCTB4QjYsIDB4RkIsIDB4RTYsIDB4RDgsIDB4QkMsIDB4RTIsIDB4OEMsIDB4QUIsIC8qIDB4MTQtMHgxNyAqLworCTB4QjMsIDB4QkUsIDB4OEMsIDB4QUMsIDB4QzksIDB4RDAsIDB4OEMsIDB4QUQsIC8qIDB4MTgtMHgxQiAqLworCTB4RTYsIDB4RDksIDB4QjMsIDB4QTIsIDB4OEMsIDB4QUUsIDB4OEMsIDB4QUYsIC8qIDB4MUMtMHgxRiAqLworCTB4OEMsIDB4QjAsIDB4OEMsIDB4QjEsIDB4REUsIDB4Q0MsIDB4OEMsIDB4QjIsIC8qIDB4MjAtMHgyMyAqLworCTB4RDMsIDB4QzgsIDB4REUsIDB4Q0QsIDB4OEMsIDB4QjMsIDB4RDIsIDB4QTIsIC8qIDB4MjQtMHgyNyAqLworCTB4OEMsIDB4QjQsIDB4OEMsIDB4QjUsIDB4OEMsIDB4QjYsIDB4OEMsIDB4QjcsIC8qIDB4MjgtMHgyQiAqLworCTB4REUsIDB4Q0UsIDB4OEMsIDB4QjgsIDB4OEMsIDB4QjksIDB4OEMsIDB4QkEsIC8qIDB4MkMtMHgyRiAqLworCTB4OEMsIDB4QkIsIDB4QkUsIDB4Q0QsIDB4OEMsIDB4QkMsIDB4OEMsIDB4QkQsIC8qIDB4MzAtMHgzMyAqLworCTB4REUsIDB4Q0YsIDB4OEMsIDB4QkUsIDB4OEMsIDB4QkYsIDB4OEMsIDB4QzAsIC8qIDB4MzQtMHgzNyAqLworCTB4Q0EsIDB4QUMsIDB4RDIsIDB4RkMsIDB4QjMsIDB4REYsIDB4RTUsIDB4RUEsIC8qIDB4MzgtMHgzQiAqLworCTB4QzQsIDB4RTEsIDB4QkUsIDB4QTEsIDB4Q0UsIDB4QjIsIDB4QzQsIDB4RjIsIC8qIDB4M0MtMHgzRiAqLworCTB4QkUsIDB4RDYsIDB4QzYsIDB4QTgsIDB4QjIsIDB4RTMsIDB4OEMsIDB4QzEsIC8qIDB4NDAtMHg0MyAqLworCTB4OEMsIDB4QzIsIDB4QkUsIDB4RDMsIDB4OEMsIDB4QzMsIDB4OEMsIDB4QzQsIC8qIDB4NDQtMHg0NyAqLworCTB4QzcsIDB4RkMsIDB4Q0MsIDB4RUIsIDB4QkQsIDB4RUMsIDB4Q0UsIDB4REQsIC8qIDB4NDgtMHg0QiAqLworCTB4OEMsIDB4QzUsIDB4OEMsIDB4QzYsIDB4Q0EsIDB4QkEsIDB4QzYsIDB4QzEsIC8qIDB4NEMtMHg0RiAqLworCTB4RTUsIDB4RUMsIDB4RDAsIDB4QkMsIDB4OEMsIDB4QzcsIDB4OEMsIDB4QzgsIC8qIDB4NTAtMHg1MyAqLworCTB4OEMsIDB4QzksIDB4RDUsIDB4QjksIDB4OEMsIDB4Q0EsIDB4OEMsIDB4Q0IsIC8qIDB4NTQtMHg1NyAqLworCTB4OEMsIDB4Q0MsIDB4RTUsIDB4RUQsIDB4OEMsIDB4Q0QsIDB4OEMsIDB4Q0UsIC8qIDB4NTgtMHg1QiAqLworCTB4OEMsIDB4Q0YsIDB4OEMsIDB4RDAsIDB4Q0EsIDB4RjQsIDB4OEMsIDB4RDEsIC8qIDB4NUMtMHg1RiAqLworCTB4Q0QsIDB4QzAsIDB4QzIsIDB4QzUsIDB4OEMsIDB4RDIsIDB4RTUsIDB4RUYsIC8qIDB4NjAtMHg2MyAqLworCTB4OEMsIDB4RDMsIDB4QzIsIDB4QzQsIDB4RTUsIDB4RjAsIDB4OEMsIDB4RDQsIC8qIDB4NjQtMHg2NyAqLworCTB4OEMsIDB4RDUsIDB4OEMsIDB4RDYsIDB4OEMsIDB4RDcsIDB4OEMsIDB4RDgsIC8qIDB4NjgtMHg2QiAqLworCTB4OEMsIDB4RDksIDB4OEMsIDB4REEsIDB4RTUsIDB4RjgsIDB4Q0QsIDB4Q0QsIC8qIDB4NkMtMHg2RiAqLworCTB4OEMsIDB4REIsIDB4QzksIDB4QkQsIDB4OEMsIDB4REMsIDB4OEMsIDB4REQsIC8qIDB4NzAtMHg3MyAqLworCTB4OEMsIDB4REUsIDB4OEMsIDB4REYsIDB4OEMsIDB4RTAsIDB4OEMsIDB4RTEsIC8qIDB4NzQtMHg3NyAqLworCTB4OEMsIDB4RTIsIDB4RDIsIDB4RDksIDB4RTEsIDB4QTgsIDB4OEMsIDB4RTMsIC8qIDB4NzgtMHg3QiAqLworCTB4OEMsIDB4RTQsIDB4OEMsIDB4RTUsIDB4OEMsIDB4RTYsIDB4RDMsIDB4RUMsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4OEMsIDB4RTcsIDB4Q0IsIDB4RUEsIDB4QzYsIDB4RjEsIDB4OEMsIDB4RTgsIC8qIDB4ODAtMHg4MyAqLworCTB4OEMsIDB4RTksIDB4OEMsIDB4RUEsIDB4OEMsIDB4RUIsIDB4OEMsIDB4RUMsIC8qIDB4ODQtMHg4NyAqLworCTB4RTEsIDB4QUMsIDB4OEMsIDB4RUQsIDB4OEMsIDB4RUUsIDB4OEMsIDB4RUYsIC8qIDB4ODgtMHg4QiAqLworCTB4RTEsIDB4QTcsIDB4RTEsIDB4QTksIDB4OEMsIDB4RjAsIDB4OEMsIDB4RjEsIC8qIDB4OEMtMHg4RiAqLworCTB4RTEsIDB4QUEsIDB4RTEsIDB4QUYsIDB4OEMsIDB4RjIsIDB4OEMsIDB4RjMsIC8qIDB4OTAtMHg5MyAqLworCTB4QjIsIDB4RUQsIDB4OEMsIDB4RjQsIDB4RTEsIDB4QUIsIDB4QjgsIDB4REEsIC8qIDB4OTQtMHg5NyAqLworCTB4RTEsIDB4QUQsIDB4RTEsIDB4QUUsIDB4RTEsIDB4QjAsIDB4QjUsIDB4QkEsIC8qIDB4OTgtMHg5QiAqLworCTB4RTEsIDB4QjEsIDB4OEMsIDB4RjUsIDB4OEMsIDB4RjYsIDB4OEMsIDB4RjcsIC8qIDB4OUMtMHg5RiAqLworCTB4OEMsIDB4RjgsIDB4OEMsIDB4RjksIDB4RTEsIDB4QjMsIDB4RTEsIDB4QjgsIC8qIDB4QTAtMHhBMyAqLworCTB4OEMsIDB4RkEsIDB4OEMsIDB4RkIsIDB4OEMsIDB4RkMsIDB4OEMsIDB4RkQsIC8qIDB4QTQtMHhBNyAqLworCTB4OEMsIDB4RkUsIDB4RDEsIDB4RDIsIDB4OEQsIDB4NDAsIDB4RTEsIDB4QjYsIC8qIDB4QTgtMHhBQiAqLworCTB4RTEsIDB4QjUsIDB4QzEsIDB4RUIsIDB4OEQsIDB4NDEsIDB4OEQsIDB4NDIsIC8qIDB4QUMtMHhBRiAqLworCTB4OEQsIDB4NDMsIDB4RTEsIDB4QjcsIDB4OEQsIDB4NDQsIDB4RDQsIDB4QzAsIC8qIDB4QjAtMHhCMyAqLworCTB4OEQsIDB4NDUsIDB4RTEsIDB4QjIsIDB4OEQsIDB4NDYsIDB4RTEsIDB4QkEsIC8qIDB4QjQtMHhCNyAqLworCTB4QjAsIDB4QjYsIDB4OEQsIDB4NDcsIDB4OEQsIDB4NDgsIDB4OEQsIDB4NDksIC8qIDB4QjgtMHhCQiAqLworCTB4OEQsIDB4NEEsIDB4RTEsIDB4QjQsIDB4OEQsIDB4NEIsIDB4QkYsIDB4RjksIC8qIDB4QkMtMHhCRiAqLworCTB4OEQsIDB4NEMsIDB4RTEsIDB4QjksIDB4OEQsIDB4NEQsIDB4OEQsIDB4NEUsIC8qIDB4QzAtMHhDMyAqLworCTB4RTEsIDB4QkIsIDB4OEQsIDB4NEYsIDB4OEQsIDB4NTAsIDB4OEQsIDB4NTEsIC8qIDB4QzQtMHhDNyAqLworCTB4OEQsIDB4NTIsIDB4OEQsIDB4NTMsIDB4OEQsIDB4NTQsIDB4RTEsIDB4QkUsIC8qIDB4QzgtMHhDQiAqLworCTB4OEQsIDB4NTUsIDB4OEQsIDB4NTYsIDB4OEQsIDB4NTcsIDB4OEQsIDB4NTgsIC8qIDB4Q0MtMHhDRiAqLworCTB4OEQsIDB4NTksIDB4OEQsIDB4NUEsIDB4RTEsIDB4QkMsIDB4OEQsIDB4NUIsIC8qIDB4RDAtMHhEMyAqLworCTB4OEQsIDB4NUMsIDB4OEQsIDB4NUQsIDB4OEQsIDB4NUUsIDB4OEQsIDB4NUYsIC8qIDB4RDQtMHhENyAqLworCTB4OEQsIDB4NjAsIDB4RDYsIDB4QzUsIDB4OEQsIDB4NjEsIDB4OEQsIDB4NjIsIC8qIDB4RDgtMHhEQiAqLworCTB4OEQsIDB4NjMsIDB4OEQsIDB4NjQsIDB4OEQsIDB4NjUsIDB4OEQsIDB4NjYsIC8qIDB4REMtMHhERiAqLworCTB4OEQsIDB4NjcsIDB4Q0YsIDB4QkYsIDB4OEQsIDB4NjgsIDB4OEQsIDB4NjksIC8qIDB4RTAtMHhFMyAqLworCTB4RTEsIDB4QkQsIDB4RTEsIDB4QkYsIDB4QzIsIDB4Q0QsIDB4OEQsIDB4NkEsIC8qIDB4RTQtMHhFNyAqLworCTB4QjYsIDB4RUIsIDB4OEQsIDB4NkIsIDB4RDMsIDB4RjgsIDB4OEQsIDB4NkMsIC8qIDB4RTgtMHhFQiAqLworCTB4OEQsIDB4NkQsIDB4QzcsIDB4Q0QsIDB4OEQsIDB4NkUsIDB4OEQsIDB4NkYsIC8qIDB4RUMtMHhFRiAqLworCTB4QjcsIDB4RTUsIDB4OEQsIDB4NzAsIDB4OEQsIDB4NzEsIDB4OEQsIDB4NzIsIC8qIDB4RjAtMHhGMyAqLworCTB4OEQsIDB4NzMsIDB4OEQsIDB4NzQsIDB4OEQsIDB4NzUsIDB4OEQsIDB4NzYsIC8qIDB4RjQtMHhGNyAqLworCTB4OEQsIDB4NzcsIDB4OEQsIDB4NzgsIDB4OEQsIDB4NzksIDB4QkUsIDB4RkUsIC8qIDB4RjgtMHhGQiAqLworCTB4OEQsIDB4N0EsIDB4OEQsIDB4N0IsIDB4OEQsIDB4N0MsIDB4OEQsIDB4N0QsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzVEWzUxMl0gPSB7CisJMHg4RCwgMHg3RSwgMHg4RCwgMHg4MCwgMHhFMSwgMHhDMCwgMHhFMSwgMHhDMSwgLyogMHgwMC0weDAzICovCisJMHg4RCwgMHg4MSwgMHg4RCwgMHg4MiwgMHhFMSwgMHhDNywgMHhCMywgMHhFNywgLyogMHgwNC0weDA3ICovCisJMHg4RCwgMHg4MywgMHg4RCwgMHg4NCwgMHg4RCwgMHg4NSwgMHg4RCwgMHg4NiwgLyogMHgwOC0weDBCICovCisJMHg4RCwgMHg4NywgMHg4RCwgMHg4OCwgMHhDNiwgMHhFOSwgMHg4RCwgMHg4OSwgLyogMHgwQy0weDBGICovCisJMHg4RCwgMHg4QSwgMHg4RCwgMHg4QiwgMHg4RCwgMHg4QywgMHg4RCwgMHg4RCwgLyogMHgxMC0weDEzICovCisJMHhCNCwgMHhERSwgMHg4RCwgMHg4RSwgMHhEMSwgMHhDMiwgMHg4RCwgMHg4RiwgLyogMHgxNC0weDE3ICovCisJMHg4RCwgMHg5MCwgMHg4RCwgMHg5MSwgMHg4RCwgMHg5MiwgMHhFMSwgMHhDOCwgLyogMHgxOC0weDFCICovCisJMHg4RCwgMHg5MywgMHg4RCwgMHg5NCwgMHhFMSwgMHhDNiwgMHg4RCwgMHg5NSwgLyogMHgxQy0weDFGICovCisJMHg4RCwgMHg5NiwgMHg4RCwgMHg5NywgMHg4RCwgMHg5OCwgMHg4RCwgMHg5OSwgLyogMHgyMC0weDIzICovCisJMHhFMSwgMHhDNSwgMHg4RCwgMHg5QSwgMHhFMSwgMHhDMywgMHhFMSwgMHhDMiwgLyogMHgyNC0weDI3ICovCisJMHg4RCwgMHg5QiwgMHhCMSwgMHhDMCwgMHg4RCwgMHg5QywgMHg4RCwgMHg5RCwgLyogMHgyOC0weDJCICovCisJMHg4RCwgMHg5RSwgMHhENSwgMHhCOCwgMHhFMSwgMHhDNCwgMHg4RCwgMHg5RiwgLyogMHgyQy0weDJGICovCisJMHg4RCwgMHhBMCwgMHg4RCwgMHhBMSwgMHg4RCwgMHhBMiwgMHg4RCwgMHhBMywgLyogMHgzMC0weDMzICovCisJMHhFMSwgMHhDQiwgMHg4RCwgMHhBNCwgMHg4RCwgMHhBNSwgMHg4RCwgMHhBNiwgLyogMHgzNC0weDM3ICovCisJMHg4RCwgMHhBNywgMHg4RCwgMHhBOCwgMHg4RCwgMHhBOSwgMHg4RCwgMHhBQSwgLyogMHgzOC0weDNCICovCisJMHg4RCwgMHhBQiwgMHhFMSwgMHhDQywgMHhFMSwgMHhDQSwgMHg4RCwgMHhBQywgLyogMHgzQy0weDNGICovCisJMHg4RCwgMHhBRCwgMHg4RCwgMHhBRSwgMHg4RCwgMHhBRiwgMHg4RCwgMHhCMCwgLyogMHg0MC0weDQzICovCisJMHg4RCwgMHhCMSwgMHg4RCwgMHhCMiwgMHg4RCwgMHhCMywgMHhFRiwgMHhGQSwgLyogMHg0NC0weDQ3ICovCisJMHg4RCwgMHhCNCwgMHg4RCwgMHhCNSwgMHhFMSwgMHhEMywgMHhFMSwgMHhEMiwgLyogMHg0OC0weDRCICovCisJMHhDNywgMHhCNiwgMHg4RCwgMHhCNiwgMHg4RCwgMHhCNywgMHg4RCwgMHhCOCwgLyogMHg0Qy0weDRGICovCisJMHg4RCwgMHhCOSwgMHg4RCwgMHhCQSwgMHg4RCwgMHhCQiwgMHg4RCwgMHhCQywgLyogMHg1MC0weDUzICovCisJMHg4RCwgMHhCRCwgMHg4RCwgMHhCRSwgMHg4RCwgMHhCRiwgMHg4RCwgMHhDMCwgLyogMHg1NC0weDU3ICovCisJMHhFMSwgMHhDOSwgMHg4RCwgMHhDMSwgMHg4RCwgMHhDMiwgMHhFMSwgMHhDRSwgLyogMHg1OC0weDVCICovCisJMHg4RCwgMHhDMywgMHhFMSwgMHhEMCwgMHg4RCwgMHhDNCwgMHg4RCwgMHhDNSwgLyogMHg1Qy0weDVGICovCisJMHg4RCwgMHhDNiwgMHg4RCwgMHhDNywgMHg4RCwgMHhDOCwgMHg4RCwgMHhDOSwgLyogMHg2MC0weDYzICovCisJMHg4RCwgMHhDQSwgMHg4RCwgMHhDQiwgMHg4RCwgMHhDQywgMHg4RCwgMHhDRCwgLyogMHg2NC0weDY3ICovCisJMHg4RCwgMHhDRSwgMHhFMSwgMHhENCwgMHg4RCwgMHhDRiwgMHhFMSwgMHhEMSwgLyogMHg2OC0weDZCICovCisJMHhFMSwgMHhDRCwgMHg4RCwgMHhEMCwgMHg4RCwgMHhEMSwgMHhFMSwgMHhDRiwgLyogMHg2Qy0weDZGICovCisJMHg4RCwgMHhEMiwgMHg4RCwgMHhEMywgMHg4RCwgMHhENCwgMHg4RCwgMHhENSwgLyogMHg3MC0weDczICovCisJMHhFMSwgMHhENSwgMHg4RCwgMHhENiwgMHg4RCwgMHhENywgMHg4RCwgMHhEOCwgLyogMHg3NC0weDc3ICovCisJMHg4RCwgMHhEOSwgMHg4RCwgMHhEQSwgMHg4RCwgMHhEQiwgMHg4RCwgMHhEQywgLyogMHg3OC0weDdCICovCisJMHg4RCwgMHhERCwgMHg4RCwgMHhERSwgMHg4RCwgMHhERiwgMHg4RCwgMHhFMCwgLyogMHg3Qy0weDdGICovCisJCisJMHg4RCwgMHhFMSwgMHg4RCwgMHhFMiwgMHhFMSwgMHhENiwgMHg4RCwgMHhFMywgLyogMHg4MC0weDgzICovCisJMHg4RCwgMHhFNCwgMHg4RCwgMHhFNSwgMHg4RCwgMHhFNiwgMHg4RCwgMHhFNywgLyogMHg4NC0weDg3ICovCisJMHg4RCwgMHhFOCwgMHg4RCwgMHhFOSwgMHg4RCwgMHhFQSwgMHg4RCwgMHhFQiwgLyogMHg4OC0weDhCICovCisJMHg4RCwgMHhFQywgMHg4RCwgMHhFRCwgMHg4RCwgMHhFRSwgMHg4RCwgMHhFRiwgLyogMHg4Qy0weDhGICovCisJMHg4RCwgMHhGMCwgMHg4RCwgMHhGMSwgMHg4RCwgMHhGMiwgMHg4RCwgMHhGMywgLyogMHg5MC0weDkzICovCisJMHg4RCwgMHhGNCwgMHg4RCwgMHhGNSwgMHg4RCwgMHhGNiwgMHg4RCwgMHhGNywgLyogMHg5NC0weDk3ICovCisJMHg4RCwgMHhGOCwgMHhFMSwgMHhENywgMHg4RCwgMHhGOSwgMHg4RCwgMHhGQSwgLyogMHg5OC0weDlCICovCisJMHg4RCwgMHhGQiwgMHhFMSwgMHhEOCwgMHg4RCwgMHhGQywgMHg4RCwgMHhGRCwgLyogMHg5Qy0weDlGICovCisJMHg4RCwgMHhGRSwgMHg4RSwgMHg0MCwgMHg4RSwgMHg0MSwgMHg4RSwgMHg0MiwgLyogMHhBMC0weEEzICovCisJMHg4RSwgMHg0MywgMHg4RSwgMHg0NCwgMHg4RSwgMHg0NSwgMHg4RSwgMHg0NiwgLyogMHhBNC0weEE3ICovCisJMHg4RSwgMHg0NywgMHg4RSwgMHg0OCwgMHg4RSwgMHg0OSwgMHg4RSwgMHg0QSwgLyogMHhBOC0weEFCICovCisJMHg4RSwgMHg0QiwgMHg4RSwgMHg0QywgMHg4RSwgMHg0RCwgMHg4RSwgMHg0RSwgLyogMHhBQy0weEFGICovCisJMHg4RSwgMHg0RiwgMHg4RSwgMHg1MCwgMHg4RSwgMHg1MSwgMHg4RSwgMHg1MiwgLyogMHhCMC0weEIzICovCisJMHg4RSwgMHg1MywgMHg4RSwgMHg1NCwgMHg4RSwgMHg1NSwgMHhFMSwgMHhEQSwgLyogMHhCNC0weEI3ICovCisJMHg4RSwgMHg1NiwgMHg4RSwgMHg1NywgMHg4RSwgMHg1OCwgMHg4RSwgMHg1OSwgLyogMHhCOC0weEJCICovCisJMHg4RSwgMHg1QSwgMHg4RSwgMHg1QiwgMHg4RSwgMHg1QywgMHg4RSwgMHg1RCwgLyogMHhCQy0weEJGICovCisJMHg4RSwgMHg1RSwgMHg4RSwgMHg1RiwgMHg4RSwgMHg2MCwgMHg4RSwgMHg2MSwgLyogMHhDMC0weEMzICovCisJMHg4RSwgMHg2MiwgMHhFMSwgMHhEQiwgMHg4RSwgMHg2MywgMHg4RSwgMHg2NCwgLyogMHhDNC0weEM3ICovCisJMHg4RSwgMHg2NSwgMHg4RSwgMHg2NiwgMHg4RSwgMHg2NywgMHg4RSwgMHg2OCwgLyogMHhDOC0weENCICovCisJMHg4RSwgMHg2OSwgMHhDRSwgMHhBMSwgMHg4RSwgMHg2QSwgMHg4RSwgMHg2QiwgLyogMHhDQy0weENGICovCisJMHg4RSwgMHg2QywgMHg4RSwgMHg2RCwgMHg4RSwgMHg2RSwgMHg4RSwgMHg2RiwgLyogMHhEMC0weEQzICovCisJMHg4RSwgMHg3MCwgMHg4RSwgMHg3MSwgMHg4RSwgMHg3MiwgMHg4RSwgMHg3MywgLyogMHhENC0weEQ3ICovCisJMHg4RSwgMHg3NCwgMHg4RSwgMHg3NSwgMHg4RSwgMHg3NiwgMHhFNywgMHhERCwgLyogMHhEOC0weERCICovCisJMHg4RSwgMHg3NywgMHhCNCwgMHhBOCwgMHhENiwgMHhERCwgMHg4RSwgMHg3OCwgLyogMHhEQy0weERGICovCisJMHg4RSwgMHg3OSwgMHhEMSwgMHhCMiwgMHhCMywgMHhCMiwgMHg4RSwgMHg3QSwgLyogMHhFMC0weEUzICovCisJMHg4RSwgMHg3QiwgMHhCOSwgMHhBNCwgMHhENywgMHhGMywgMHhDNywgMHhDOSwgLyogMHhFNC0weEU3ICovCisJMHhCRSwgMHhERSwgMHhCOSwgMHhBRSwgMHg4RSwgMHg3QywgMHhDRSwgMHhENywgLyogMHhFOC0weEVCICovCisJMHg4RSwgMHg3RCwgMHg4RSwgMHg3RSwgMHhCMiwgMHhFRSwgMHhEQiwgMHhDRiwgLyogMHhFQy0weEVGICovCisJMHg4RSwgMHg4MCwgMHhCQywgMHhCQSwgMHhEMiwgMHhEMSwgMHhDQiwgMHhDOCwgLyogMHhGMC0weEYzICovCisJMHhCMCwgMHhDRCwgMHg4RSwgMHg4MSwgMHg4RSwgMHg4MiwgMHhDRiwgMHhFRiwgLyogMHhGNC0weEY3ICovCisJMHg4RSwgMHg4MywgMHg4RSwgMHg4NCwgMHg4RSwgMHg4NSwgMHg4RSwgMHg4NiwgLyogMHhGOC0weEZCICovCisJMHg4RSwgMHg4NywgMHhEOSwgMHhFMywgMHhCRCwgMHhFRCwgMHg4RSwgMHg4OCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNUVbNTEyXSA9IHsKKwkweDhFLCAweDg5LCAweEIxLCAweEQyLCAweENBLCAweEQwLCAweEIyLCAweEJDLCAvKiAweDAwLTB4MDMgKi8KKwkweDhFLCAweDhBLCAweENCLCAweEE3LCAweEI3LCAweEFCLCAweDhFLCAweDhCLCAvKiAweDA0LTB4MDcgKi8KKwkweENBLCAweEE2LCAweDhFLCAweDhDLCAweDhFLCAweDhELCAweDhFLCAweDhFLCAvKiAweDA4LTB4MEIgKi8KKwkweENGLCAweEEzLCAweDhFLCAweDhGLCAweDhFLCAweDkwLCAweEUwLCAweEY4LCAvKiAweDBDLTB4MEYgKi8KKwkweEQ1LCAweENBLCAweEUwLCAweEZCLCAweDhFLCAweDkxLCAweDhFLCAweDkyLCAvKiAweDEwLTB4MTMgKi8KKwkweEUwLCAweEZBLCAweEM1LCAweEMxLCAweENDLCAweEZCLCAweDhFLCAweDkzLCAvKiAweDE0LTB4MTcgKi8KKwkweEMxLCAweEIxLCAweEUwLCAweEY5LCAweEQ2LCAweEUzLCAweEIyLCAweEFGLCAvKiAweDE4LTB4MUIgKi8KKwkweEQ2LCAweEM0LCAweEI1LCAweERCLCAweDhFLCAweDk0LCAweDhFLCAweDk1LCAvKiAweDFDLTB4MUYgKi8KKwkweDhFLCAweDk2LCAweDhFLCAweDk3LCAweDhFLCAweDk4LCAweDhFLCAweDk5LCAvKiAweDIwLTB4MjMgKi8KKwkweDhFLCAweDlBLCAweDhFLCAweDlCLCAweEI0LCAweEY4LCAweEQ2LCAweEExLCAvKiAweDI0LTB4MjcgKi8KKwkweDhFLCAweDlDLCAweDhFLCAweDlELCAweDhFLCAweDlFLCAweDhFLCAweDlGLCAvKiAweDI4LTB4MkIgKi8KKwkweDhFLCAweEEwLCAweENGLCAweEFGLCAweEIwLCAweEVGLCAweDhFLCAweEExLCAvKiAweDJDLTB4MkYgKi8KKwkweDhFLCAweEEyLCAweEUwLCAweEZDLCAweDhFLCAweEEzLCAweDhFLCAweEE0LCAvKiAweDMwLTB4MzMgKi8KKwkweDhFLCAweEE1LCAweDhFLCAweEE2LCAweDhFLCAweEE3LCAweEUxLCAweEExLCAvKiAweDM0LTB4MzcgKi8KKwkweEIzLCAweEEzLCAweDhFLCAweEE4LCAweDhFLCAweEE5LCAweEUwLCAweEZELCAvKiAweDM4LTB4M0IgKi8KKwkweEUwLCAweEZFLCAweEMzLCAweEIxLCAweDhFLCAweEFBLCAweDhFLCAweEFCLCAvKiAweDNDLTB4M0YgKi8KKwkweDhFLCAweEFDLCAweDhFLCAweEFELCAweEMzLCAweERELCAweDhFLCAweEFFLCAvKiAweDQwLTB4NDMgKi8KKwkweEUxLCAweEEyLCAweEI3LCAweEY5LCAweDhFLCAweEFGLCAweDhFLCAweEIwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDhFLCAweEIxLCAweDhFLCAweEIyLCAweDhFLCAweEIzLCAweDhFLCAweEI0LCAvKiAweDQ4LTB4NEIgKi8KKwkweEJCLCAweENGLCAweDhFLCAweEI1LCAweDhFLCAweEI2LCAweDhFLCAweEI3LCAvKiAweDRDLTB4NEYgKi8KKwkweDhFLCAweEI4LCAweDhFLCAweEI5LCAweDhFLCAweEJBLCAweDhFLCAweEJCLCAvKiAweDUwLTB4NTMgKi8KKwkweEUxLCAweEEzLCAweEM0LCAweEJCLCAweDhFLCAweEJDLCAweDhFLCAweEJELCAvKiAweDU0LTB4NTcgKi8KKwkweDhFLCAweEJFLCAweDhFLCAweEJGLCAweDhFLCAweEMwLCAweEUxLCAweEE0LCAvKiAweDU4LTB4NUIgKi8KKwkweDhFLCAweEMxLCAweDhFLCAweEMyLCAweEUxLCAweEE1LCAweDhFLCAweEMzLCAvKiAweDVDLTB4NUYgKi8KKwkweDhFLCAweEM0LCAweEUxLCAweEE2LCAweEI0LCAweEIxLCAweDhFLCAweEM1LCAvKiAweDYwLTB4NjMgKi8KKwkweDhFLCAweEM2LCAweDhFLCAweEM3LCAweDhFLCAweEM4LCAweDhFLCAweEM5LCAvKiAweDY0LTB4NjcgKi8KKwkweDhFLCAweENBLCAweDhFLCAweENCLCAweDhFLCAweENDLCAweDhFLCAweENELCAvKiAweDY4LTB4NkIgKi8KKwkweDhFLCAweENFLCAweDhFLCAweENGLCAweDhFLCAweEQwLCAweDhFLCAweEQxLCAvKiAweDZDLTB4NkYgKi8KKwkweDhFLCAweEQyLCAweDhFLCAweEQzLCAweEI4LCAweEM5LCAweEM2LCAweEJELCAvKiAweDcwLTB4NzMgKi8KKwkweEM0LCAweEVBLCAweDhFLCAweEQ0LCAweEIyLCAweEEyLCAweDhFLCAweEQ1LCAvKiAweDc0LTB4NzcgKi8KKwkweEQwLCAweEQyLCAweDhFLCAweEQ2LCAweEU3LCAweERCLCAweEJCLCAweEMzLCAvKiAweDc4LTB4N0IgKi8KKwkweEQzLCAweEQ3LCAweEQzLCAweEM0LCAweDhFLCAweEQ3LCAweEI5LCAweEUzLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEUyLCAweENGLCAweDhFLCAweEQ4LCAweDhFLCAweEQ5LCAweDhFLCAweERBLCAvKiAweDgwLTB4ODMgKi8KKwkweEQ3LCAweEFGLCAweDhFLCAweERCLCAweEM3LCAweEVDLCAweEIxLCAweEQzLCAvKiAweDg0LTB4ODcgKi8KKwkweDhFLCAweERDLCAweDhFLCAweERELCAweEI0LCAweEIyLCAweEUyLCAweEQxLCAvKiAweDg4LTB4OEIgKi8KKwkweDhFLCAweERFLCAweDhFLCAweERGLCAweDhFLCAweEUwLCAweEQwLCAweEYyLCAvKiAweDhDLTB4OEYgKi8KKwkweEMyLCAweEFFLCAweEUyLCAweEQwLCAweDhFLCAweEUxLCAweEJGLCAweEUyLCAvKiAweDkwLTB4OTMgKi8KKwkweEQzLCAweEE2LCAweEI1LCAweEQ3LCAweEUyLCAweEQyLCAweEI1LCAweEVBLCAvKiAweDk0LTB4OTcgKi8KKwkweDhFLCAweEUyLCAweEMzLCAweEVELCAweEI4LCAweEZELCAweDhFLCAweEUzLCAvKiAweDk4LTB4OUIgKi8KKwkweEI4LCAweEFFLCAweDhFLCAweEU0LCAweEM1LCAweEQzLCAweEI3LCAweENGLCAvKiAweDlDLTB4OUYgKi8KKwkweEUyLCAweEQ0LCAweDhFLCAweEU1LCAweDhFLCAweEU2LCAweDhFLCAweEU3LCAvKiAweEEwLTB4QTMgKi8KKwkweDhFLCAweEU4LCAweEUyLCAweEQzLCAweEI2LCAweEM4LCAweEQ3LCAweEY5LCAvKiAweEE0LTB4QTcgKi8KKwkweDhFLCAweEU5LCAweDhFLCAweEVBLCAweDhFLCAweEVCLCAweDhFLCAweEVDLCAvKiAweEE4LTB4QUIgKi8KKwkweDhFLCAweEVELCAweENELCAweEE1LCAweDhFLCAweEVFLCAweDhFLCAweEVGLCAvKiAweEFDLTB4QUYgKi8KKwkweDhFLCAweEYwLCAweDhFLCAweEYxLCAweDhFLCAweEYyLCAweEUyLCAweEQ4LCAvKiAweEIwLTB4QjMgKi8KKwkweDhFLCAweEYzLCAweEUyLCAweEQ2LCAweENBLCAweEZDLCAweEJGLCAweEI1LCAvKiAweEI0LTB4QjcgKi8KKwkweEQzLCAweEI5LCAweEUyLCAweEQ1LCAweDhFLCAweEY0LCAweDhFLCAweEY1LCAvKiAweEI4LTB4QkIgKi8KKwkweDhFLCAweEY2LCAweDhFLCAweEY3LCAweEUyLCAweEQ3LCAweDhFLCAweEY4LCAvKiAweEJDLTB4QkYgKi8KKwkweDhFLCAweEY5LCAweDhFLCAweEZBLCAweDhFLCAweEZCLCAweDhFLCAweEZDLCAvKiAweEMwLTB4QzMgKi8KKwkweDhFLCAweEZELCAweDhFLCAweEZFLCAweDhGLCAweDQwLCAweDhGLCAweDQxLCAvKiAweEM0LTB4QzcgKi8KKwkweDhGLCAweDQyLCAweEMxLCAweEFFLCAweEMwLCAweEM4LCAweDhGLCAweDQzLCAvKiAweEM4LTB4Q0IgKi8KKwkweDhGLCAweDQ0LCAweDhGLCAweDQ1LCAweDhGLCAweDQ2LCAweDhGLCAweDQ3LCAvKiAweENDLTB4Q0YgKi8KKwkweDhGLCAweDQ4LCAweEUyLCAweERCLCAweEUyLCAweERBLCAweEMwLCAweEFBLCAvKiAweEQwLTB4RDMgKi8KKwkweDhGLCAweDQ5LCAweDhGLCAweDRBLCAweEMxLCAweENFLCAweDhGLCAweDRCLCAvKiAweEQ0LTB4RDcgKi8KKwkweDhGLCAweDRDLCAweDhGLCAweDRELCAweDhGLCAweDRFLCAweEUyLCAweERDLCAvKiAweEQ4LTB4REIgKi8KKwkweDhGLCAweDRGLCAweDhGLCAweDUwLCAweDhGLCAweDUxLCAweDhGLCAweDUyLCAvKiAweERDLTB4REYgKi8KKwkweDhGLCAweDUzLCAweDhGLCAweDU0LCAweDhGLCAweDU1LCAweDhGLCAweDU2LCAvKiAweEUwLTB4RTMgKi8KKwkweDhGLCAweDU3LCAweDhGLCAweDU4LCAweDhGLCAweDU5LCAweDhGLCAweDVBLCAvKiAweEU0LTB4RTcgKi8KKwkweEUyLCAweERELCAweDhGLCAweDVCLCAweEUyLCAweERFLCAweDhGLCAweDVDLCAvKiAweEU4LTB4RUIgKi8KKwkweDhGLCAweDVELCAweDhGLCAweDVFLCAweDhGLCAweDVGLCAweDhGLCAweDYwLCAvKiAweEVDLTB4RUYgKi8KKwkweDhGLCAweDYxLCAweDhGLCAweDYyLCAweDhGLCAweDYzLCAweDhGLCAweDY0LCAvKiAweEYwLTB4RjMgKi8KKwkweERCLCAweEM4LCAweDhGLCAweDY1LCAweEQxLCAweEQzLCAweENELCAweEEyLCAvKiAweEY0LTB4RjcgKi8KKwkweDhGLCAweDY2LCAweDhGLCAweDY3LCAweEJELCAweEE4LCAweDhGLCAweDY4LCAvKiAweEY4LTB4RkIgKi8KKwkweDhGLCAweDY5LCAweDhGLCAweDZBLCAweERFLCAweEMzLCAweEQ4LCAweEE1LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181Rls1MTJdID0geworCTB4QkYsIDB4QUEsIDB4REIsIDB4Q0QsIDB4RDIsIDB4RUMsIDB4QzYsIDB4RkEsIC8qIDB4MDAtMHgwMyAqLworCTB4QzUsIDB4QUEsIDB4OEYsIDB4NkIsIDB4OEYsIDB4NkMsIDB4OEYsIDB4NkQsIC8qIDB4MDQtMHgwNyAqLworCTB4REUsIDB4QzQsIDB4OEYsIDB4NkUsIDB4QjEsIDB4RDcsIDB4REYsIDB4QUUsIC8qIDB4MDgtMHgwQiAqLworCTB4OEYsIDB4NkYsIDB4OEYsIDB4NzAsIDB4OEYsIDB4NzEsIDB4Q0EsIDB4QkQsIC8qIDB4MEMtMHgwRiAqLworCTB4OEYsIDB4NzIsIDB4REYsIDB4QjEsIDB4OEYsIDB4NzMsIDB4QjksIDB4QUQsIC8qIDB4MTAtMHgxMyAqLworCTB4OEYsIDB4NzQsIDB4RDIsIDB4RkQsIDB4OEYsIDB4NzUsIDB4QjgsIDB4QTUsIC8qIDB4MTQtMHgxNyAqLworCTB4QkEsIDB4RUIsIDB4OEYsIDB4NzYsIDB4OEYsIDB4NzcsIDB4QjMsIDB4REEsIC8qIDB4MTgtMHgxQiAqLworCTB4OEYsIDB4NzgsIDB4OEYsIDB4NzksIDB4OEYsIDB4N0EsIDB4QjUsIDB4REMsIC8qIDB4MUMtMHgxRiAqLworCTB4RDUsIDB4QzUsIDB4OEYsIDB4N0IsIDB4OEYsIDB4N0MsIDB4OEYsIDB4N0QsIC8qIDB4MjAtMHgyMyAqLworCTB4OEYsIDB4N0UsIDB4QzMsIDB4RDYsIDB4Q0YsIDB4RDIsIDB4QkIsIDB4QTEsIC8qIDB4MjQtMHgyNyAqLworCTB4OEYsIDB4ODAsIDB4RTUsIDB4RjMsIDB4RTUsIDB4RjIsIDB4OEYsIDB4ODEsIC8qIDB4MjgtMHgyQiAqLworCTB4OEYsIDB4ODIsIDB4RTUsIDB4RjQsIDB4OEYsIDB4ODMsIDB4Q0QsIDB4RTQsIC8qIDB4MkMtMHgyRiAqLworCTB4OEYsIDB4ODQsIDB4QzgsIDB4RjUsIDB4OEYsIDB4ODUsIDB4OEYsIDB4ODYsIC8qIDB4MzAtMHgzMyAqLworCTB4OEYsIDB4ODcsIDB4OEYsIDB4ODgsIDB4OEYsIDB4ODksIDB4OEYsIDB4OEEsIC8qIDB4MzQtMHgzNyAqLworCTB4OEYsIDB4OEIsIDB4QjUsIDB4QUYsIDB4QzcsIDB4QkYsIDB4OEYsIDB4OEMsIC8qIDB4MzgtMHgzQiAqLworCTB4RTUsIDB4RjYsIDB4OEYsIDB4OEQsIDB4OEYsIDB4OEUsIDB4OEYsIDB4OEYsIC8qIDB4M0MtMHgzRiAqLworCTB4RUMsIDB4QjAsIDB4OEYsIDB4OTAsIDB4OEYsIDB4OTEsIDB4OEYsIDB4OTIsIC8qIDB4NDAtMHg0MyAqLworCTB4OEYsIDB4OTMsIDB4OEYsIDB4OTQsIDB4OEYsIDB4OTUsIDB4OEYsIDB4OTYsIC8qIDB4NDQtMHg0NyAqLworCTB4OEYsIDB4OTcsIDB4OEYsIDB4OTgsIDB4OEYsIDB4OTksIDB4OEYsIDB4OUEsIC8qIDB4NDgtMHg0QiAqLworCTB4OEYsIDB4OUIsIDB4OEYsIDB4OUMsIDB4OEYsIDB4OUQsIDB4OEYsIDB4OUUsIC8qIDB4NEMtMHg0RiAqLworCTB4RTUsIDB4RTYsIDB4OEYsIDB4OUYsIDB4QjksIDB4RTksIDB4QjUsIDB4QjEsIC8qIDB4NTAtMHg1MyAqLworCTB4OEYsIDB4QTAsIDB4QzIsIDB4QkMsIDB4RTUsIDB4RTgsIDB4RTUsIDB4RTcsIC8qIDB4NTQtMHg1NyAqLworCTB4RTUsIDB4RTksIDB4OEYsIDB4QTEsIDB4OEYsIDB4QTIsIDB4OEYsIDB4QTMsIC8qIDB4NTgtMHg1QiAqLworCTB4OEYsIDB4QTQsIDB4RDIsIDB4Q0QsIDB4OEYsIDB4QTUsIDB4OEYsIDB4QTYsIC8qIDB4NUMtMHg1RiAqLworCTB4OEYsIDB4QTcsIDB4RTEsIDB4RUEsIDB4RDAsIDB4Q0UsIDB4OEYsIDB4QTgsIC8qIDB4NjAtMHg2MyAqLworCTB4Q0QsIDB4QUUsIDB4OEYsIDB4QTksIDB4RDEsIDB4RTUsIDB4OEYsIDB4QUEsIC8qIDB4NjQtMHg2NyAqLworCTB4OEYsIDB4QUIsIDB4QjIsIDB4Q0EsIDB4QjEsIDB4RUIsIDB4OEYsIDB4QUMsIC8qIDB4NjgtMHg2QiAqLworCTB4QjEsIDB4RjIsIDB4QzUsIDB4RUQsIDB4OEYsIDB4QUQsIDB4OEYsIDB4QUUsIC8qIDB4NkMtMHg2RiAqLworCTB4RDUsIDB4QzMsIDB4RDMsIDB4QjAsIDB4OEYsIDB4QUYsIDB4RTEsIDB4REMsIC8qIDB4NzAtMHg3MyAqLworCTB4OEYsIDB4QjAsIDB4OEYsIDB4QjEsIDB4OEYsIDB4QjIsIDB4RTEsIDB4REQsIC8qIDB4NzQtMHg3NyAqLworCTB4OEYsIDB4QjMsIDB4RDIsIDB4REIsIDB4OEYsIDB4QjQsIDB4QjMsIDB4QjksIC8qIDB4NzgtMHg3QiAqLworCTB4QjEsIDB4Q0IsIDB4OEYsIDB4QjUsIDB4OEYsIDB4QjYsIDB4OEYsIDB4QjcsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4Q0QsIDB4RjksIDB4RDUsIDB4RjcsIDB4RTEsIDB4REUsIDB4OEYsIDB4QjgsIC8qIDB4ODAtMHg4MyAqLworCTB4QkUsIDB4QjYsIDB4QjQsIDB4RkQsIDB4OEYsIDB4QjksIDB4RTEsIDB4REYsIC8qIDB4ODQtMHg4NyAqLworCTB4QkEsIDB4REMsIDB4RTEsIDB4RTAsIDB4QkIsIDB4QjIsIDB4QzIsIDB4QzksIC8qIDB4ODgtMHg4QiAqLworCTB4RTEsIDB4RTEsIDB4OEYsIDB4QkEsIDB4OEYsIDB4QkIsIDB4OEYsIDB4QkMsIC8qIDB4OEMtMHg4RiAqLworCTB4RDAsIDB4RUMsIDB4OEYsIDB4QkQsIDB4Q0QsIDB4QkQsIDB4OEYsIDB4QkUsIC8qIDB4OTAtMHg5MyAqLworCTB4OEYsIDB4QkYsIDB4RTEsIDB4RTIsIDB4OEYsIDB4QzAsIDB4QjUsIDB4QzMsIC8qIDB4OTQtMHg5NyAqLworCTB4QzUsIDB4QzcsIDB4RTEsIDB4RTMsIDB4OEYsIDB4QzEsIDB4OEYsIDB4QzIsIC8qIDB4OTgtMHg5QiAqLworCTB4RTEsIDB4RTQsIDB4OEYsIDB4QzMsIDB4OEYsIDB4QzQsIDB4OEYsIDB4QzUsIC8qIDB4OUMtMHg5RiAqLworCTB4OEYsIDB4QzYsIDB4RDMsIDB4RjksIDB4OEYsIDB4QzcsIDB4OEYsIDB4QzgsIC8qIDB4QTAtMHhBMyAqLworCTB4OEYsIDB4QzksIDB4OEYsIDB4Q0EsIDB4OEYsIDB4Q0IsIDB4OEYsIDB4Q0MsIC8qIDB4QTQtMHhBNyAqLworCTB4RTEsIDB4RTUsIDB4OEYsIDB4Q0QsIDB4RDEsIDB4QUQsIDB4OEYsIDB4Q0UsIC8qIDB4QTgtMHhBQiAqLworCTB4OEYsIDB4Q0YsIDB4RTEsIDB4RTYsIDB4Q0UsIDB4QTIsIDB4OEYsIDB4RDAsIC8qIDB4QUMtMHhBRiAqLworCTB4OEYsIDB4RDEsIDB4OEYsIDB4RDIsIDB4OEYsIDB4RDMsIDB4OEYsIDB4RDQsIC8qIDB4QjAtMHhCMyAqLworCTB4OEYsIDB4RDUsIDB4RTEsIDB4RTcsIDB4OEYsIDB4RDYsIDB4QjUsIDB4QzIsIC8qIDB4QjQtMHhCNyAqLworCTB4OEYsIDB4RDcsIDB4OEYsIDB4RDgsIDB4OEYsIDB4RDksIDB4OEYsIDB4REEsIC8qIDB4QjgtMHhCQiAqLworCTB4RTEsIDB4RTgsIDB4QkIsIDB4RDUsIDB4OEYsIDB4REIsIDB4OEYsIDB4REMsIC8qIDB4QkMtMHhCRiAqLworCTB4OEYsIDB4REQsIDB4OEYsIDB4REUsIDB4OEYsIDB4REYsIDB4RDAsIDB4QzQsIC8qIDB4QzAtMHhDMyAqLworCTB4RTIsIDB4RTAsIDB4QjEsIDB4RDgsIDB4RDIsIDB4RTQsIDB4OEYsIDB4RTAsIC8qIDB4QzQtMHhDNyAqLworCTB4OEYsIDB4RTEsIDB4RTIsIDB4RTEsIDB4OEYsIDB4RTIsIDB4OEYsIDB4RTMsIC8qIDB4QzgtMHhDQiAqLworCTB4QkMsIDB4QzksIDB4QzgsIDB4Q0MsIDB4OEYsIDB4RTQsIDB4RTIsIDB4RTMsIC8qIDB4Q0MtMHhDRiAqLworCTB4RUMsIDB4RkUsIDB4RUMsIDB4RkQsIDB4REYsIDB4QUYsIDB4OEYsIDB4RTUsIC8qIDB4RDAtMHhEMyAqLworCTB4OEYsIDB4RTYsIDB4OEYsIDB4RTcsIDB4RTIsIDB4RTIsIDB4RDYsIDB4QkUsIC8qIDB4RDQtMHhENyAqLworCTB4Q0QsIDB4RkMsIDB4QzMsIDB4QTYsIDB4OEYsIDB4RTgsIDB4OEYsIDB4RTksIC8qIDB4RDgtMHhEQiAqLworCTB4OEYsIDB4RUEsIDB4RTMsIDB4QzMsIDB4OEYsIDB4RUIsIDB4OEYsIDB4RUMsIC8qIDB4REMtMHhERiAqLworCTB4RDYsIDB4RDIsIDB4RTIsIDB4RTcsIDB4OEYsIDB4RUQsIDB4OEYsIDB4RUUsIC8qIDB4RTAtMHhFMyAqLworCTB4RTIsIDB4RTgsIDB4OEYsIDB4RUYsIDB4OEYsIDB4RjAsIDB4RDMsIDB4QzcsIC8qIDB4RTQtMHhFNyAqLworCTB4OEYsIDB4RjEsIDB4OEYsIDB4RjIsIDB4RTIsIDB4RUMsIDB4QkYsIDB4RUMsIC8qIDB4RTgtMHhFQiAqLworCTB4OEYsIDB4RjMsIDB4RTIsIDB4RUQsIDB4RTIsIDB4RTUsIDB4OEYsIDB4RjQsIC8qIDB4RUMtMHhFRiAqLworCTB4OEYsIDB4RjUsIDB4QjMsIDB4QzAsIDB4OEYsIDB4RjYsIDB4OEYsIDB4RjcsIC8qIDB4RjAtMHhGMyAqLworCTB4OEYsIDB4RjgsIDB4QzQsIDB4RUUsIDB4OEYsIDB4RjksIDB4OEYsIDB4RkEsIC8qIDB4RjQtMHhGNyAqLworCTB4RTIsIDB4RUUsIDB4OEYsIDB4RkIsIDB4OEYsIDB4RkMsIDB4RDAsIDB4QzMsIC8qIDB4RjgtMHhGQiAqLworCTB4OEYsIDB4RkQsIDB4QkEsIDB4RjYsIDB4RTIsIDB4RTksIDB4QjcsIDB4REUsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzYwWzUxMl0gPSB7CisJMHhCQiwgMHhCMywgMHhDQywgMHhBQywgMHhDQiwgMHhDQiwgMHhFMiwgMHhFNCwgLyogMHgwMC0weDAzICovCisJMHhFMiwgMHhFNiwgMHhFMiwgMHhFQSwgMHhFMiwgMHhFQiwgMHg4RiwgMHhGRSwgLyogMHgwNC0weDA3ICovCisJMHg5MCwgMHg0MCwgMHg5MCwgMHg0MSwgMHhFMiwgMHhGNywgMHg5MCwgMHg0MiwgLyogMHgwOC0weDBCICovCisJMHg5MCwgMHg0MywgMHhFMiwgMHhGNCwgMHhENCwgMHhGNSwgMHhFMiwgMHhGMywgLyogMHgwQy0weDBGICovCisJMHg5MCwgMHg0NCwgMHg5MCwgMHg0NSwgMHhDNSwgMHhBRCwgMHg5MCwgMHg0NiwgLyogMHgxMC0weDEzICovCisJMHhENSwgMHhGQSwgMHhDNSwgMHhDMiwgMHhCMiwgMHhDMCwgMHg5MCwgMHg0NywgLyogMHgxNC0weDE3ICovCisJMHg5MCwgMHg0OCwgMHhFMiwgMHhFRiwgMHg5MCwgMHg0OSwgMHhFMiwgMHhGMiwgLyogMHgxOC0weDFCICovCisJMHhDMSwgMHhBRiwgMHhDQiwgMHhCQywgMHg5MCwgMHg0QSwgMHg5MCwgMHg0QiwgLyogMHgxQy0weDFGICovCisJMHhCNSwgMHhBMSwgMHhFMiwgMHhGOSwgMHg5MCwgMHg0QywgMHg5MCwgMHg0RCwgLyogMHgyMC0weDIzICovCisJMHg5MCwgMHg0RSwgMHhCQywgMHhCMSwgMHhFMiwgMHhGMSwgMHhEMCwgMHhENCwgLyogMHgyNC0weDI3ICovCisJMHhENCwgMHhCOSwgMHhFMiwgMHhGNSwgMHhCOSwgMHhENiwgMHhFMiwgMHhGNiwgLyogMHgyOC0weDJCICovCisJMHg5MCwgMHg0RiwgMHg5MCwgMHg1MCwgMHg5MCwgMHg1MSwgMHhDNywgMHhEMywgLyogMHgyQy0weDJGICovCisJMHg5MCwgMHg1MiwgMHg5MCwgMHg1MywgMHg5MCwgMHg1NCwgMHg5MCwgMHg1NSwgLyogMHgzMC0weDMzICovCisJMHg5MCwgMHg1NiwgMHhFMiwgMHhGMCwgMHg5MCwgMHg1NywgMHg5MCwgMHg1OCwgLyogMHgzNC0weDM3ICovCisJMHg5MCwgMHg1OSwgMHg5MCwgMHg1QSwgMHg5MCwgMHg1QiwgMHhENywgMHhEQywgLyogMHgzOC0weDNCICovCisJMHhFRCwgMHhBMSwgMHg5MCwgMHg1QywgMHg5MCwgMHg1RCwgMHhFMiwgMHhGOCwgLyogMHgzQy0weDNGICovCisJMHg5MCwgMHg1RSwgMHhFRCwgMHhBNSwgMHhFMiwgMHhGRSwgMHhDQSwgMHhEMSwgLyogMHg0MC0weDQzICovCisJMHg5MCwgMHg1RiwgMHg5MCwgMHg2MCwgMHg5MCwgMHg2MSwgMHg5MCwgMHg2MiwgLyogMHg0NC0weDQ3ICovCisJMHg5MCwgMHg2MywgMHg5MCwgMHg2NCwgMHg5MCwgMHg2NSwgMHhDMSwgMHhCNSwgLyogMHg0OC0weDRCICovCisJMHg5MCwgMHg2NiwgMHhCQiwgMHhEMCwgMHg5MCwgMHg2NywgMHg5MCwgMHg2OCwgLyogMHg0Qy0weDRGICovCisJMHhCRiwgMHhENiwgMHg5MCwgMHg2OSwgMHhCQSwgMHhFMywgMHg5MCwgMHg2QSwgLyogMHg1MC0weDUzICovCisJMHg5MCwgMHg2QiwgMHhDQiwgMHhBMSwgMHg5MCwgMHg2QywgMHg5MCwgMHg2RCwgLyogMHg1NC0weDU3ICovCisJMHg5MCwgMHg2RSwgMHhFRCwgMHhBNiwgMHhFRCwgMHhBMywgMHg5MCwgMHg2RiwgLyogMHg1OC0weDVCICovCisJMHg5MCwgMHg3MCwgMHhFRCwgMHhBMiwgMHg5MCwgMHg3MSwgMHg5MCwgMHg3MiwgLyogMHg1Qy0weDVGICovCisJMHg5MCwgMHg3MywgMHg5MCwgMHg3NCwgMHhCQiwgMHhENiwgMHhFRCwgMHhBNywgLyogMHg2MC0weDYzICovCisJMHhEMCwgMHhGNCwgMHg5MCwgMHg3NSwgMHg5MCwgMHg3NiwgMHhFRCwgMHhBNCwgLyogMHg2NC0weDY3ICovCisJMHhCQSwgMHhERSwgMHhCNiwgMHhGNywgMHhFMywgMHhBMSwgMHhCNiwgMHhCMiwgLyogMHg2OC0weDZCICovCisJMHhDQywgMHhGMSwgMHhCOSwgMHhBNywgMHg5MCwgMHg3NywgMHhDRiwgMHhBMiwgLyogMHg2Qy0weDZGICovCisJMHhDNywgMHhBMSwgMHg5MCwgMHg3OCwgMHg5MCwgMHg3OSwgMHhCRiwgMHhEMiwgLyogMHg3MC0weDczICovCisJMHg5MCwgMHg3QSwgMHg5MCwgMHg3QiwgMHhCNiwgMHhGMSwgMHg5MCwgMHg3QywgLyogMHg3NC0weDc3ICovCisJMHhFMiwgMHhGQSwgMHhFMiwgMHhGQiwgMHhFMiwgMHhGRCwgMHhFMiwgMHhGQywgLyogMHg3OC0weDdCICovCisJMHhDNCwgMHhENSwgMHhFMywgMHhBMiwgMHg5MCwgMHg3RCwgMHhEMywgMHhDMSwgLyogMHg3Qy0weDdGICovCisJCisJMHg5MCwgMHg3RSwgMHg5MCwgMHg4MCwgMHg5MCwgMHg4MSwgMHhFMywgMHhBNywgLyogMHg4MC0weDgzICovCisJMHhDNywgMHhDNCwgMHg5MCwgMHg4MiwgMHg5MCwgMHg4MywgMHg5MCwgMHg4NCwgLyogMHg4NC0weDg3ICovCisJMHg5MCwgMHg4NSwgMHhDRiwgMHhBNCwgMHg5MCwgMHg4NiwgMHg5MCwgMHg4NywgLyogMHg4OC0weDhCICovCisJMHhFMywgMHhBOSwgMHhCQSwgMHhCNywgMHg5MCwgMHg4OCwgMHg5MCwgMHg4OSwgLyogMHg4Qy0weDhGICovCisJMHg5MCwgMHg4QSwgMHg5MCwgMHg4QiwgMHhFMywgMHhBOCwgMHg5MCwgMHg4QywgLyogMHg5MC0weDkzICovCisJMHhCQiwgMHhEQSwgMHg5MCwgMHg4RCwgMHhFMywgMHhBMywgMHg5MCwgMHg4RSwgLyogMHg5NC0weDk3ICovCisJMHg5MCwgMHg4RiwgMHg5MCwgMHg5MCwgMHhFMywgMHhBNCwgMHhFMywgMHhBQSwgLyogMHg5OC0weDlCICovCisJMHg5MCwgMHg5MSwgMHhFMywgMHhBNiwgMHg5MCwgMHg5MiwgMHhDRSwgMHhGMiwgLyogMHg5Qy0weDlGICovCisJMHhEMywgMHhDNiwgMHg5MCwgMHg5MywgMHg5MCwgMHg5NCwgMHhCQiwgMHhCQywgLyogMHhBMC0weEEzICovCisJMHg5MCwgMHg5NSwgMHg5MCwgMHg5NiwgMHhENCwgMHhDMywgMHg5MCwgMHg5NywgLyogMHhBNC0weEE3ICovCisJMHhDNCwgMHhGQSwgMHg5MCwgMHg5OCwgMHg5MCwgMHg5OSwgMHhFRCwgMHhBOCwgLyogMHhBOC0weEFCICovCisJMHhEMCwgMHhGQywgMHhFMywgMHhBNSwgMHg5MCwgMHg5QSwgMHhDMywgMHhGNSwgLyogMHhBQy0weEFGICovCisJMHg5MCwgMHg5QiwgMHhFMywgMHhBRCwgMHhCMSwgMHhBRiwgMHg5MCwgMHg5QywgLyogMHhCMC0weEIzICovCisJMHhFMywgMHhCMiwgMHg5MCwgMHg5RCwgMHg5MCwgMHg5RSwgMHg5MCwgMHg5RiwgLyogMHhCNC0weEI3ICovCisJMHhCQywgMHhDMiwgMHg5MCwgMHhBMCwgMHg5MCwgMHhBMSwgMHhFMywgMHhBQywgLyogMHhCOC0weEJCICovCisJMHhCNSwgMHhCRiwgMHg5MCwgMHhBMiwgMHg5MCwgMHhBMywgMHg5MCwgMHhBNCwgLyogMHhCQy0weEJGICovCisJMHg5MCwgMHhBNSwgMHg5MCwgMHhBNiwgMHg5MCwgMHhBNywgMHg5MCwgMHhBOCwgLyogMHhDMC0weEMzICovCisJMHg5MCwgMHhBOSwgMHhDNywgMHhFOSwgMHhFMywgMHhCMCwgMHg5MCwgMHhBQSwgLyogMHhDNC0weEM3ICovCisJMHg5MCwgMHhBQiwgMHg5MCwgMHhBQywgMHhCRSwgMHhBQSwgMHhDRCwgMHhFRiwgLyogMHhDOC0weENCICovCisJMHg5MCwgMHhBRCwgMHg5MCwgMHhBRSwgMHg5MCwgMHhBRiwgMHg5MCwgMHhCMCwgLyogMHhDQy0weENGICovCisJMHg5MCwgMHhCMSwgMHhCQiwgMHhGMywgMHg5MCwgMHhCMiwgMHg5MCwgMHhCMywgLyogMHhEMC0weEQzICovCisJMHg5MCwgMHhCNCwgMHhDQywgMHhFOCwgMHg5MCwgMHhCNSwgMHg5MCwgMHhCNiwgLyogMHhENC0weEQ3ICovCisJMHhFMywgMHhBRiwgMHg5MCwgMHhCNywgMHhFMywgMHhCMSwgMHg5MCwgMHhCOCwgLyogMHhEOC0weERCICovCisJMHhDRiwgMHhBNywgMHhFMywgMHhBRSwgMHg5MCwgMHhCOSwgMHhDRSwgMHhBOSwgLyogMHhEQy0weERGICovCisJMHhCQiwgMHhERCwgMHg5MCwgMHhCQSwgMHg5MCwgMHhCQiwgMHg5MCwgMHhCQywgLyogMHhFMC0weEUzICovCisJMHg5MCwgMHhCRCwgMHg5MCwgMHhCRSwgMHhCNSwgMHhFQiwgMHhCRSwgMHhFNSwgLyogMHhFNC0weEU3ICovCisJMHhCMiwgMHhEMiwgMHhCMywgMHhDRCwgMHg5MCwgMHhCRiwgMHhCMSwgMHhCOSwgLyogMHhFOC0weEVCICovCisJMHhFMywgMHhBQiwgMHhCMiwgMHhEMSwgMHhCNSwgMHhBQywgMHhCOSwgMHhERiwgLyogMHhFQy0weEVGICovCisJMHhCNiwgMHhFOCwgMHg5MCwgMHhDMCwgMHg5MCwgMHhDMSwgMHhDRiwgMHhFQiwgLyogMHhGMC0weEYzICovCisJMHhFMywgMHhCNywgMHg5MCwgMHhDMiwgMHhCQiwgMHhDQywgMHg5MCwgMHhDMywgLyogMHhGNC0weEY3ICovCisJMHg5MCwgMHhDNCwgMHhDOCwgMHhDNywgMHhEMCwgMHhDQSwgMHg5MCwgMHhDNSwgLyogMHhGOC0weEZCICovCisJMHg5MCwgMHhDNiwgMHg5MCwgMHhDNywgMHg5MCwgMHhDOCwgMHg5MCwgMHhDOSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNjFbNTEyXSA9IHsKKwkweEUzLCAweEI4LCAweEIzLCAweEVFLCAweDkwLCAweENBLCAweDkwLCAweENCLCAvKiAweDAwLTB4MDMgKi8KKwkweDkwLCAweENDLCAweDkwLCAweENELCAweEVELCAweEE5LCAweDkwLCAweENFLCAvKiAweDA0LTB4MDcgKi8KKwkweEQzLCAweEZBLCAweEQzLCAweEU0LCAweDkwLCAweENGLCAweDkwLCAweEQwLCAvKiAweDA4LTB4MEIgKi8KKwkweDkwLCAweEQxLCAweEVELCAweEFBLCAweEUzLCAweEI5LCAweEQyLCAweEUyLCAvKiAweDBDLTB4MEYgKi8KKwkweDkwLCAweEQyLCAweDkwLCAweEQzLCAweDkwLCAweEQ0LCAweDkwLCAweEQ1LCAvKiAweDEwLTB4MTMgKi8KKwkweDkwLCAweEQ2LCAweEUzLCAweEI1LCAweDkwLCAweEQ3LCAweDkwLCAweEQ4LCAvKiAweDE0LTB4MTcgKi8KKwkweDkwLCAweEQ5LCAweDkwLCAweERBLCAweEQzLCAweERFLCAweDkwLCAweERCLCAvKiAweDE4LTB4MUIgKi8KKwkweDkwLCAweERDLCAweDkwLCAweERELCAweDkwLCAweERFLCAweEI4LCAweEQwLCAvKiAweDFDLTB4MUYgKi8KKwkweEUzLCAweEIzLCAweDkwLCAweERGLCAweDkwLCAweEUwLCAweEUzLCAweEI2LCAvKiAweDIwLTB4MjMgKi8KKwkweEI3LCAweERGLCAweDkwLCAweEUxLCAweEUzLCAweEI0LCAweEMwLCAweEEyLCAvKiAweDI0LTB4MjcgKi8KKwkweDkwLCAweEUyLCAweDkwLCAweEUzLCAweDkwLCAweEU0LCAweEUzLCAweEJBLCAvKiAweDI4LTB4MkIgKi8KKwkweDkwLCAweEU1LCAweDkwLCAweEU2LCAweDkwLCAweEU3LCAweDkwLCAweEU4LCAvKiAweDJDLTB4MkYgKi8KKwkweDkwLCAweEU5LCAweDkwLCAweEVBLCAweDkwLCAweEVCLCAweDkwLCAweEVDLCAvKiAweDMwLTB4MzMgKi8KKwkweDkwLCAweEVELCAweDkwLCAweEVFLCAweDkwLCAweEVGLCAweDkwLCAweEYwLCAvKiAweDM0LTB4MzcgKi8KKwkweDkwLCAweEYxLCAweDkwLCAweEYyLCAweDkwLCAweEYzLCAweDkwLCAweEY0LCAvKiAweDM4LTB4M0IgKi8KKwkweDkwLCAweEY1LCAweDkwLCAweEY2LCAweDkwLCAweEY3LCAweEQ0LCAweEI4LCAvKiAweDNDLTB4M0YgKi8KKwkweDkwLCAweEY4LCAweDkwLCAweEY5LCAweDkwLCAweEZBLCAweDkwLCAweEZCLCAvKiAweDQwLTB4NDMgKi8KKwkweDkwLCAweEZDLCAweDkwLCAweEZELCAweDkwLCAweEZFLCAweDkxLCAweDQwLCAvKiAweDQ0LTB4NDcgKi8KKwkweEI0LCAweEM4LCAweDkxLCAweDQxLCAweEUzLCAweEJCLCAweDkxLCAweDQyLCAvKiAweDQ4LTB4NEIgKi8KKwkweEJCLCAweEM1LCAweDkxLCAweDQzLCAweEM5LCAweEY3LCAweDkxLCAweDQ0LCAvKiAweDRDLTB4NEYgKi8KKwkweDkxLCAweDQ1LCAweEM5LCAweEU1LCAweDkxLCAweDQ2LCAweDkxLCAweDQ3LCAvKiAweDUwLTB4NTMgKi8KKwkweDkxLCAweDQ4LCAweEM0LCAweEJELCAweDkxLCAweDQ5LCAweDkxLCAweDRBLCAvKiAweDU0LTB4NTcgKi8KKwkweDkxLCAweDRCLCAweDkxLCAweDRDLCAweDkxLCAweDRELCAweDkxLCAweDRFLCAvKiAweDU4LTB4NUIgKi8KKwkweDkxLCAweDRGLCAweEVELCAweEFCLCAweDkxLCAweDUwLCAweDkxLCAweDUxLCAvKiAweDVDLTB4NUYgKi8KKwkweDkxLCAweDUyLCAweDkxLCAweDUzLCAweEMyLCAweEZELCAweDkxLCAweDU0LCAvKiAweDYwLTB4NjMgKi8KKwkweDkxLCAweDU1LCAweDkxLCAweDU2LCAweDkxLCAweDU3LCAweEJCLCAweERCLCAvKiAweDY0LTB4NjcgKi8KKwkweEJGLCAweEFFLCAweDkxLCAweDU4LCAweDkxLCAweDU5LCAweDkxLCAweDVBLCAvKiAweDY4LTB4NkIgKi8KKwkweDkxLCAweDVCLCAweDkxLCAweDVDLCAweDkxLCAweDVELCAweDkxLCAweDVFLCAvKiAweDZDLTB4NkYgKi8KKwkweENFLCAweEJGLCAweDkxLCAweDVGLCAweDkxLCAweDYwLCAweDkxLCAweDYxLCAvKiAweDcwLTB4NzMgKi8KKwkweDkxLCAweDYyLCAweEUzLCAweEJDLCAweDkxLCAweDYzLCAweEJGLCAweEI2LCAvKiAweDc0LTB4NzcgKi8KKwkweDkxLCAweDY0LCAweDkxLCAweDY1LCAweDkxLCAweDY2LCAweDkxLCAweDY3LCAvKiAweDc4LTB4N0IgKi8KKwkweDkxLCAweDY4LCAweDkxLCAweDY5LCAweDkxLCAweDZBLCAweDkxLCAweDZCLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDkxLCAweDZDLCAweDkxLCAweDZELCAweDkxLCAweDZFLCAweDkxLCAweDZGLCAvKiAweDgwLTB4ODMgKi8KKwkweDkxLCAweDcwLCAweDkxLCAweDcxLCAweDkxLCAweDcyLCAweDkxLCAweDczLCAvKiAweDg0LTB4ODcgKi8KKwkweDkxLCAweDc0LCAweDkxLCAweDc1LCAweDkxLCAweDc2LCAweEIxLCAweEVGLCAvKiAweDg4LTB4OEIgKi8KKwkweDkxLCAweDc3LCAweDkxLCAweDc4LCAweEQ0LCAweEY3LCAweDkxLCAweDc5LCAvKiAweDhDLTB4OEYgKi8KKwkweDkxLCAweDdBLCAweDkxLCAweDdCLCAweDkxLCAweDdDLCAweDkxLCAweDdELCAvKiAweDkwLTB4OTMgKi8KKwkweEUzLCAweEJFLCAweDkxLCAweDdFLCAweDkxLCAweDgwLCAweDkxLCAweDgxLCAvKiAweDk0LTB4OTcgKi8KKwkweDkxLCAweDgyLCAweDkxLCAweDgzLCAweDkxLCAweDg0LCAweDkxLCAweDg1LCAvKiAweDk4LTB4OUIgKi8KKwkweDkxLCAweDg2LCAweEVELCAweEFELCAweDkxLCAweDg3LCAweDkxLCAweDg4LCAvKiAweDlDLTB4OUYgKi8KKwkweDkxLCAweDg5LCAweDkxLCAweDhBLCAweDkxLCAweDhCLCAweDkxLCAweDhDLCAvKiAweEEwLTB4QTMgKi8KKwkweDkxLCAweDhELCAweDkxLCAweDhFLCAweDkxLCAweDhGLCAweEUzLCAweEJGLCAvKiAweEE0LTB4QTcgKi8KKwkweEJBLCAweEE5LCAweEVELCAweEFDLCAweDkxLCAweDkwLCAweDkxLCAweDkxLCAvKiAweEE4LTB4QUIgKi8KKwkweEUzLCAweEJELCAweDkxLCAweDkyLCAweDkxLCAweDkzLCAweDkxLCAweDk0LCAvKiAweEFDLTB4QUYgKi8KKwkweDkxLCAweDk1LCAweDkxLCAweDk2LCAweDkxLCAweDk3LCAweDkxLCAweDk4LCAvKiAweEIwLTB4QjMgKi8KKwkweDkxLCAweDk5LCAweDkxLCAweDlBLCAweDkxLCAweDlCLCAweEUzLCAweEMwLCAvKiAweEI0LTB4QjcgKi8KKwkweDkxLCAweDlDLCAweDkxLCAweDlELCAweDkxLCAweDlFLCAweDkxLCAweDlGLCAvKiAweEI4LTB4QkIgKi8KKwkweDkxLCAweEEwLCAweDkxLCAweEExLCAweEJBLCAweEI2LCAweDkxLCAweEEyLCAvKiAweEJDLTB4QkYgKi8KKwkweDkxLCAweEEzLCAweDkxLCAweEE0LCAweEI2LCAweEFFLCAweDkxLCAweEE1LCAvKiAweEMwLTB4QzMgKi8KKwkweDkxLCAweEE2LCAweDkxLCAweEE3LCAweDkxLCAweEE4LCAweDkxLCAweEE5LCAvKiAweEM0LTB4QzcgKi8KKwkweEQwLCAweEI4LCAweDkxLCAweEFBLCAweEIwLCAweEMzLCAweEVELCAweEFFLCAvKiAweEM4LTB4Q0IgKi8KKwkweDkxLCAweEFCLCAweDkxLCAweEFDLCAweDkxLCAweEFELCAweDkxLCAweEFFLCAvKiAweENDLTB4Q0YgKi8KKwkweDkxLCAweEFGLCAweEVELCAweEFGLCAweEMwLCAweEMxLCAweDkxLCAweEIwLCAvKiAweEQwLTB4RDMgKi8KKwkweEUzLCAweEMxLCAweDkxLCAweEIxLCAweDkxLCAweEIyLCAweDkxLCAweEIzLCAvKiAweEQ0LTB4RDcgKi8KKwkweDkxLCAweEI0LCAweDkxLCAweEI1LCAweDkxLCAweEI2LCAweDkxLCAweEI3LCAvKiAweEQ4LTB4REIgKi8KKwkweDkxLCAweEI4LCAweDkxLCAweEI5LCAweDkxLCAweEJBLCAweDkxLCAweEJCLCAvKiAweERDLTB4REYgKi8KKwkweDkxLCAweEJDLCAweDkxLCAweEJELCAweDkxLCAweEJFLCAweDkxLCAweEJGLCAvKiAweEUwLTB4RTMgKi8KKwkweDkxLCAweEMwLCAweDkxLCAweEMxLCAweEM1LCAweEIzLCAweDkxLCAweEMyLCAvKiAweEU0LTB4RTcgKi8KKwkweDkxLCAweEMzLCAweDkxLCAweEM0LCAweDkxLCAweEM1LCAweDkxLCAweEM2LCAvKiAweEU4LTB4RUIgKi8KKwkweDkxLCAweEM3LCAweDkxLCAweEM4LCAweDkxLCAweEM5LCAweDkxLCAweENBLCAvKiAweEVDLTB4RUYgKi8KKwkweDkxLCAweENCLCAweDkxLCAweENDLCAweDkxLCAweENELCAweDkxLCAweENFLCAvKiAweEYwLTB4RjMgKi8KKwkweDkxLCAweENGLCAweEUzLCAweEMyLCAweDkxLCAweEQwLCAweDkxLCAweEQxLCAvKiAweEY0LTB4RjcgKi8KKwkweDkxLCAweEQyLCAweDkxLCAweEQzLCAweDkxLCAweEQ0LCAweDkxLCAweEQ1LCAvKiAweEY4LTB4RkIgKi8KKwkweDkxLCAweEQ2LCAweDkxLCAweEQ3LCAweDkxLCAweEQ4LCAweERDLCAweEIyLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182Mls1MTJdID0geworCTB4OTEsIDB4RDksIDB4OTEsIDB4REEsIDB4OTEsIDB4REIsIDB4OTEsIDB4REMsIC8qIDB4MDAtMHgwMyAqLworCTB4OTEsIDB4REQsIDB4OTEsIDB4REUsIDB4RUQsIDB4QjAsIDB4OTEsIDB4REYsIC8qIDB4MDQtMHgwNyAqLworCTB4QjgsIDB4RUEsIDB4OTEsIDB4RTAsIDB4Q0UsIDB4RUMsIDB4RUEsIDB4QTcsIC8qIDB4MDgtMHgwQiAqLworCTB4RDAsIDB4RTcsIDB4Q0EsIDB4RjksIDB4QzgsIDB4RDYsIDB4Q0YsIDB4QjcsIC8qIDB4MEMtMHgwRiAqLworCTB4QjMsIDB4QzksIDB4Q0UsIDB4RDIsIDB4QkQsIDB4RTQsIDB4OTEsIDB4RTEsIC8qIDB4MTAtMHgxMyAqLworCTB4OTEsIDB4RTIsIDB4RTMsIDB4REUsIDB4QkIsIDB4RjIsIDB4RUEsIDB4QTgsIC8qIDB4MTQtMHgxNyAqLworCTB4RDUsIDB4QkQsIDB4OTEsIDB4RTMsIDB4QzYsIDB4REQsIDB4RUEsIDB4QTksIC8qIDB4MTgtMHgxQiAqLworCTB4OTEsIDB4RTQsIDB4OTEsIDB4RTUsIDB4OTEsIDB4RTYsIDB4RUEsIDB4QUEsIC8qIDB4MUMtMHgxRiAqLworCTB4OTEsIDB4RTcsIDB4RUEsIDB4QUMsIDB4RUEsIDB4QUIsIDB4OTEsIDB4RTgsIC8qIDB4MjAtMHgyMyAqLworCTB4RUEsIDB4QUUsIDB4RUEsIDB4QUQsIDB4OTEsIDB4RTksIDB4OTEsIDB4RUEsIC8qIDB4MjQtMHgyNyAqLworCTB4OTEsIDB4RUIsIDB4OTEsIDB4RUMsIDB4QkQsIDB4RDgsIDB4OTEsIDB4RUQsIC8qIDB4MjgtMHgyQiAqLworCTB4RUEsIDB4QUYsIDB4OTEsIDB4RUUsIDB4QzIsIDB4QkUsIDB4OTEsIDB4RUYsIC8qIDB4MkMtMHgyRiAqLworCTB4OTEsIDB4RjAsIDB4OTEsIDB4RjEsIDB4OTEsIDB4RjIsIDB4QjQsIDB4QzEsIC8qIDB4MzAtMHgzMyAqLworCTB4QjQsIDB4RjcsIDB4OTEsIDB4RjMsIDB4OTEsIDB4RjQsIDB4QkIsIDB4QTcsIC8qIDB4MzQtMHgzNyAqLworCTB4OTEsIDB4RjUsIDB4OTEsIDB4RjYsIDB4OTEsIDB4RjcsIDB4OTEsIDB4RjgsIC8qIDB4MzgtMHgzQiAqLworCTB4OTEsIDB4RjksIDB4RUMsIDB4RTYsIDB4RUMsIDB4RTUsIDB4QjcsIDB4QkYsIC8qIDB4M0MtMHgzRiAqLworCTB4Q0IsIDB4RjksIDB4QjEsIDB4RTIsIDB4OTEsIDB4RkEsIDB4RUMsIDB4RTcsIC8qIDB4NDAtMHg0MyAqLworCTB4OTEsIDB4RkIsIDB4OTEsIDB4RkMsIDB4OTEsIDB4RkQsIDB4QzksIDB4QzgsIC8qIDB4NDQtMHg0NyAqLworCTB4RUMsIDB4RTgsIDB4RUMsIDB4RTksIDB4OTEsIDB4RkUsIDB4Q0EsIDB4RDYsIC8qIDB4NDgtMHg0QiAqLworCTB4REUsIDB4RDAsIDB4QjIsIDB4QzUsIDB4RDQsIDB4RkEsIDB4OTIsIDB4NDAsIC8qIDB4NEMtMHg0RiAqLworCTB4OTIsIDB4NDEsIDB4QzYsIDB4Q0IsIDB4QjAsIDB4QzcsIDB4QjQsIDB4RjIsIC8qIDB4NTAtMHg1MyAqLworCTB4QzgsIDB4RDMsIDB4OTIsIDB4NDIsIDB4OTIsIDB4NDMsIDB4OTIsIDB4NDQsIC8qIDB4NTQtMHg1NyAqLworCTB4Q0QsIDB4RDAsIDB4OTIsIDB4NDUsIDB4OTIsIDB4NDYsIDB4QkYsIDB4QjgsIC8qIDB4NTgtMHg1QiAqLworCTB4OTIsIDB4NDcsIDB4OTIsIDB4NDgsIDB4OTIsIDB4NDksIDB4OTIsIDB4NEEsIC8qIDB4NUMtMHg1RiAqLworCTB4OTIsIDB4NEIsIDB4OTIsIDB4NEMsIDB4OTIsIDB4NEQsIDB4QkYsIDB4REIsIC8qIDB4NjAtMHg2MyAqLworCTB4OTIsIDB4NEUsIDB4OTIsIDB4NEYsIDB4QzcsIDB4QTQsIDB4RDYsIDB4QjQsIC8qIDB4NjQtMHg2NyAqLworCTB4OTIsIDB4NTAsIDB4QzAsIDB4QTksIDB4REUsIDB4RDEsIDB4QzksIDB4QTgsIC8qIDB4NjgtMHg2QiAqLworCTB4RDEsIDB4RUYsIDB4QzUsIDB4QTQsIDB4QjAsIDB4RTcsIDB4QjMsIDB4QjYsIC8qIDB4NkMtMHg2RiAqLworCTB4QzgsIDB4QzUsIDB4OTIsIDB4NTEsIDB4OTIsIDB4NTIsIDB4QjAsIDB4RTIsIC8qIDB4NzAtMHg3MyAqLworCTB4OTIsIDB4NTMsIDB4OTIsIDB4NTQsIDB4QjcsIDB4RjYsIDB4OTIsIDB4NTUsIC8qIDB4NzQtMHg3NyAqLworCTB4OTIsIDB4NTYsIDB4QzUsIDB4RkEsIDB4OTIsIDB4NTcsIDB4OTIsIDB4NTgsIC8qIDB4NzgtMHg3QiAqLworCTB4QjYsIDB4RjMsIDB4OTIsIDB4NTksIDB4RDUsIDB4RDIsIDB4QjMsIDB4RDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QkMsIDB4QkMsIDB4OTIsIDB4NUEsIDB4OTIsIDB4NUIsIDB4OTIsIDB4NUMsIC8qIDB4ODAtMHg4MyAqLworCTB4QjMsIDB4QUQsIDB4OTIsIDB4NUQsIDB4OTIsIDB4NUUsIDB4OTIsIDB4NUYsIC8qIDB4ODQtMHg4NyAqLworCTB4OTIsIDB4NjAsIDB4QkUsIDB4RjEsIDB4QjAsIDB4RDEsIDB4OTIsIDB4NjEsIC8qIDB4ODgtMHg4QiAqLworCTB4OTIsIDB4NjIsIDB4OTIsIDB4NjMsIDB4OTIsIDB4NjQsIDB4OTIsIDB4NjUsIC8qIDB4OEMtMHg4RiAqLworCTB4OTIsIDB4NjYsIDB4RDIsIDB4RDYsIDB4Q0EsIDB4RTMsIDB4RDcsIDB4QTUsIC8qIDB4OTAtMHg5MyAqLworCTB4OTIsIDB4NjcsIDB4Q0QsIDB4QjYsIDB4QjYsIDB4QjYsIDB4QkYsIDB4QjksIC8qIDB4OTQtMHg5NyAqLworCTB4RDUsIDB4REIsIDB4OTIsIDB4NjgsIDB4QjgsIDB4QTcsIDB4QzUsIDB4RDcsIC8qIDB4OTgtMHg5QiAqLworCTB4OTIsIDB4NjksIDB4OTIsIDB4NkEsIDB4OTIsIDB4NkIsIDB4REUsIDB4RDIsIC8qIDB4OUMtMHg5RiAqLworCTB4QkYsIDB4RDksIDB4QzIsIDB4RDUsIDB4QzcsIDB4QzAsIDB4OTIsIDB4NkMsIC8qIDB4QTAtMHhBMyAqLworCTB4QkIsIDB4QTQsIDB4QjEsIDB4QTgsIDB4OTIsIDB4NkQsIDB4OTIsIDB4NkUsIC8qIDB4QTQtMHhBNyAqLworCTB4QzUsIDB4RUEsIDB4OTIsIDB4NkYsIDB4OTIsIDB4NzAsIDB4QzUsIDB4RkIsIC8qIDB4QTgtMHhBQiAqLworCTB4Q0MsIDB4QTcsIDB4OTIsIDB4NzEsIDB4OTIsIDB4NzIsIDB4OTIsIDB4NzMsIC8qIDB4QUMtMHhBRiAqLworCTB4OTIsIDB4NzQsIDB4QjEsIDB4QTcsIDB4OTIsIDB4NzUsIDB4OTIsIDB4NzYsIC8qIDB4QjAtMHhCMyAqLworCTB4OTIsIDB4NzcsIDB4QjUsIDB4RDYsIDB4OTIsIDB4NzgsIDB4OTIsIDB4NzksIC8qIDB4QjQtMHhCNyAqLworCTB4OTIsIDB4N0EsIDB4QzQsIDB4QTgsIDB4OTIsIDB4N0IsIDB4REUsIDB4RDMsIC8qIDB4QjgtMHhCQiAqLworCTB4RDEsIDB4QkEsIDB4QjMsIDB4RTksIDB4OTIsIDB4N0MsIDB4QzMsIDB4RjIsIC8qIDB4QkMtMHhCRiAqLworCTB4OTIsIDB4N0QsIDB4OTIsIDB4N0UsIDB4QjcsIDB4RjcsIDB4OTIsIDB4ODAsIC8qIDB4QzAtMHhDMyAqLworCTB4RDYsIDB4RjQsIDB4QjUsIDB4QTMsIDB4QjIsIDB4RjAsIDB4QzQsIDB4QjQsIC8qIDB4QzQtMHhDNyAqLworCTB4QzQsIDB4RTksIDB4QzAsIDB4QUQsIDB4REUsIDB4RDQsIDB4OTIsIDB4ODEsIC8qIDB4QzgtMHhDQiAqLworCTB4QjAsIDB4RTgsIDB4QzUsIDB4QzQsIDB4QzEsIDB4RTAsIDB4OTIsIDB4ODIsIC8qIDB4Q0MtMHhDRiAqLworCTB4QjksIDB4RDUsIDB4OTIsIDB4ODMsIDB4QkUsIDB4REMsIDB4Q0QsIDB4RDgsIC8qIDB4RDAtMHhEMyAqLworCTB4QjAsIDB4Q0UsIDB4OTIsIDB4ODQsIDB4Q0QsIDB4Q0YsIDB4REUsIDB4RDYsIC8qIDB4RDQtMHhENyAqLworCTB4QkUsIDB4RDAsIDB4RDcsIDB4QkUsIDB4REUsIDB4RDUsIDB4RDUsIDB4RDAsIC8qIDB4RDgtMHhEQiAqLworCTB4QjAsIDB4REQsIDB4OTIsIDB4ODUsIDB4OTIsIDB4ODYsIDB4QzQsIDB4RTIsIC8qIDB4REMtMHhERiAqLworCTB4OTIsIDB4ODcsIDB4OTIsIDB4ODgsIDB4QzIsIDB4QTMsIDB4QkMsIDB4RjAsIC8qIDB4RTAtMHhFMyAqLworCTB4OTIsIDB4ODksIDB4RDMsIDB4QjUsIDB4QzAsIDB4QjksIDB4QzUsIDB4QTEsIC8qIDB4RTQtMHhFNyAqLworCTB4QjIsIDB4QTYsIDB4RDQsIDB4RjEsIDB4OTIsIDB4OEEsIDB4OTIsIDB4OEIsIC8qIDB4RTgtMHhFQiAqLworCTB4QzAsIDB4QTgsIDB4Q0EsIDB4QzMsIDB4REUsIDB4RDcsIDB4RDUsIDB4RkMsIC8qIDB4RUMtMHhFRiAqLworCTB4OTIsIDB4OEMsIDB4QjksIDB4QjAsIDB4OTIsIDB4OEQsIDB4QzgsIDB4QUQsIC8qIDB4RjAtMHhGMyAqLworCTB4Q0IsIDB4QTksIDB4OTIsIDB4OEUsIDB4REUsIDB4RDksIDB4QkYsIDB4QkQsIC8qIDB4RjQtMHhGNyAqLworCTB4OTIsIDB4OEYsIDB4OTIsIDB4OTAsIDB4OTIsIDB4OTEsIDB4OTIsIDB4OTIsIC8qIDB4RjgtMHhGQiAqLworCTB4QzYsIDB4QjQsIDB4RDcsIDB4QTcsIDB4Q0EsIDB4QjAsIDB4QzQsIDB4QzMsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzYzWzUxMl0gPSB7CisJMHg5MiwgMHg5MywgMHhCMywgMHhENiwgMHhCOSwgMHhEMiwgMHg5MiwgMHg5NCwgLyogMHgwMC0weDAzICovCisJMHg5MiwgMHg5NSwgMHg5MiwgMHg5NiwgMHg5MiwgMHg5NywgMHhENiwgMHhCOCwgLyogMHgwNC0weDA3ICovCisJMHhFQSwgMHhGQywgMHhCMCwgMHhCNCwgMHg5MiwgMHg5OCwgMHg5MiwgMHg5OSwgLyogMHgwOC0weDBCICovCisJMHg5MiwgMHg5QSwgMHg5MiwgMHg5QiwgMHhCRiwgMHhFNiwgMHg5MiwgMHg5QywgLyogMHgwQy0weDBGICovCisJMHg5MiwgMHg5RCwgMHhDQywgMHhGNCwgMHg5MiwgMHg5RSwgMHg5MiwgMHg5RiwgLyogMHgxMC0weDEzICovCisJMHg5MiwgMHhBMCwgMHg5MiwgMHhBMSwgMHhDRCwgMHhEQSwgMHg5MiwgMHhBMiwgLyogMHgxNC0weDE3ICovCisJMHg5MiwgMHhBMywgMHg5MiwgMHhBNCwgMHhENiwgMHhCRiwgMHhDMiwgMHhDRSwgLyogMHgxOC0weDFCICovCisJMHg5MiwgMHhBNSwgMHhDRSwgMHhDRSwgMHhDQywgMHhBMiwgMHhEMCwgMHhBRSwgLyogMHgxQy0weDFGICovCisJMHhDNCwgMHhEMywgMHhCNSwgMHhCMiwgMHhERSwgMHhEOCwgMHhENSwgMHhGNSwgLyogMHgyMC0weDIzICovCisJMHhCQywgMHhCNywgMHhCQiwgMHhEMywgMHg5MiwgMHhBNiwgMHg5MiwgMHhBNywgLyogMHgyNC0weDI3ICovCisJMHhCMCwgMHhBNCwgMHg5MiwgMHhBOCwgMHhDNSwgMHhCMiwgMHhCNCwgMHhFQywgLyogMHgyOC0weDJCICovCisJMHg5MiwgMHhBOSwgMHg5MiwgMHhBQSwgMHg5MiwgMHhBQiwgMHhENSwgMHhGMSwgLyogMHgyQy0weDJGICovCisJMHg5MiwgMHhBQywgMHg5MiwgMHhBRCwgMHhFQSwgMHhGRCwgMHg5MiwgMHhBRSwgLyogMHgzMC0weDMzICovCisJMHg5MiwgMHhBRiwgMHg5MiwgMHhCMCwgMHg5MiwgMHhCMSwgMHg5MiwgMHhCMiwgLyogMHgzNC0weDM3ICovCisJMHg5MiwgMHhCMywgMHhERSwgMHhEQSwgMHhDRCwgMHhBNiwgMHg5MiwgMHhCNCwgLyogMHgzOC0weDNCICovCisJMHg5MiwgMHhCNSwgMHhDRCwgMHhFQywgMHg5MiwgMHhCNiwgMHg5MiwgMHhCNywgLyogMHgzQy0weDNGICovCisJMHg5MiwgMHhCOCwgMHg5MiwgMHhCOSwgMHhDRSwgMHhFNiwgMHhERSwgMHhEQywgLyogMHg0MC0weDQzICovCisJMHg5MiwgMHhCQSwgMHhDRCwgMHhCMSwgMHhDMCwgMHhBNiwgMHg5MiwgMHhCQiwgLyogMHg0NC0weDQ3ICovCisJMHg5MiwgMHhCQywgMHhENywgMHhCRCwgMHg5MiwgMHhCRCwgMHhERSwgMHhEQiwgLyogMHg0OC0weDRCICovCisJMHhCMCwgMHhDNiwgMHhCQSwgMHhCNCwgMHhDOSwgMHhEMywgMHhDNCwgMHhGMywgLyogMHg0Qy0weDRGICovCisJMHhCRSwgMHhFOCwgMHg5MiwgMHhCRSwgMHg5MiwgMHhCRiwgMHg5MiwgMHhDMCwgLyogMHg1MC0weDUzICovCisJMHg5MiwgMHhDMSwgMHhCMiwgMHhCNiwgMHg5MiwgMHhDMiwgMHg5MiwgMHhDMywgLyogMHg1NC0weDU3ICovCisJMHg5MiwgMHhDNCwgMHg5MiwgMHhDNSwgMHg5MiwgMHhDNiwgMHg5MiwgMHhDNywgLyogMHg1OC0weDVCICovCisJMHg5MiwgMHhDOCwgMHg5MiwgMHhDOSwgMHhDMCwgMHhDQywgMHhDQiwgMHhGMCwgLyogMHg1Qy0weDVGICovCisJMHg5MiwgMHhDQSwgMHhCQywgMHhGMSwgMHhCQiwgMHhCQiwgMHhCNSwgMHhCNywgLyogMHg2MC0weDYzICovCisJMHg5MiwgMHhDQiwgMHg5MiwgMHhDQywgMHg5MiwgMHhDRCwgMHhDNSwgMHhGNSwgLyogMHg2NC0weDY3ICovCisJMHg5MiwgMHhDRSwgMHhERSwgMHhFNiwgMHg5MiwgMHhDRiwgMHg5MiwgMHhEMCwgLyogMHg2OC0weDZCICovCisJMHg5MiwgMHhEMSwgMHhERSwgMHhFMywgMHhCRSwgMHhERCwgMHg5MiwgMHhEMiwgLyogMHg2Qy0weDZGICovCisJMHg5MiwgMHhEMywgMHhERSwgMHhERiwgMHg5MiwgMHhENCwgMHg5MiwgMHhENSwgLyogMHg3MC0weDczICovCisJMHg5MiwgMHhENiwgMHg5MiwgMHhENywgMHhCNCwgMHhCNywgMHhCRCwgMHhERCwgLyogMHg3NC0weDc3ICovCisJMHg5MiwgMHhEOCwgMHg5MiwgMHhEOSwgMHhERSwgMHhFMCwgMHhDNCwgMHhFRCwgLyogMHg3OC0weDdCICovCisJMHg5MiwgMHhEQSwgMHg5MiwgMHhEQiwgMHg5MiwgMHhEQywgMHg5MiwgMHhERCwgLyogMHg3Qy0weDdGICovCisJCisJMHhDRiwgMHhDNiwgMHg5MiwgMHhERSwgMHhCNSwgMHhFMCwgMHg5MiwgMHhERiwgLyogMHg4MC0weDgzICovCisJMHg5MiwgMHhFMCwgMHg5MiwgMHhFMSwgMHg5MiwgMHhFMiwgMHhCNiwgMHhERSwgLyogMHg4NC0weDg3ICovCisJMHhDQSwgMHhEQSwgMHhCNSwgMHhGNCwgMHhERSwgMHhFNSwgMHg5MiwgMHhFMywgLyogMHg4OC0weDhCICovCisJMHhENSwgMHhDNiwgMHg5MiwgMHhFNCwgMHhERSwgMHhFMSwgMHhDQywgMHhDRCwgLyogMHg4Qy0weDhGICovCisJMHhDNiwgMHhGRSwgMHg5MiwgMHhFNSwgMHhDNSwgMHhDNSwgMHg5MiwgMHhFNiwgLyogMHg5MC0weDkzICovCisJMHg5MiwgMHhFNywgMHg5MiwgMHhFOCwgMHhEMiwgMHhCNCwgMHg5MiwgMHhFOSwgLyogMHg5NC0weDk3ICovCisJMHhCRSwgMHhGMiwgMHg5MiwgMHhFQSwgMHg5MiwgMHhFQiwgMHg5MiwgMHhFQywgLyogMHg5OC0weDlCICovCisJMHg5MiwgMHhFRCwgMHg5MiwgMHhFRSwgMHg5MiwgMHhFRiwgMHg5MiwgMHhGMCwgLyogMHg5Qy0weDlGICovCisJMHhDMiwgMHhEMywgMHg5MiwgMHhGMSwgMHhDQywgMHhCRCwgMHhCMywgMHhCOCwgLyogMHhBMC0weEEzICovCisJMHg5MiwgMHhGMiwgMHhCRCwgMHhEMywgMHg5MiwgMHhGMywgMHhCRiwgMHhEOCwgLyogMHhBNC0weEE3ICovCisJMHhDRCwgMHhDNiwgMHhEMSwgMHhEQSwgMHhCNCwgMHhFQiwgMHg5MiwgMHhGNCwgLyogMHhBOC0weEFCICovCisJMHhERSwgMHhFNCwgMHhERSwgMHhERCwgMHhERSwgMHhFNywgMHg5MiwgMHhGNSwgLyogMHhBQy0weEFGICovCisJMHhFQSwgMHhGRSwgMHg5MiwgMHhGNiwgMHg5MiwgMHhGNywgMHhDMiwgMHhCMCwgLyogMHhCMC0weEIzICovCisJMHhERSwgMHhFMiwgMHg5MiwgMHhGOCwgMHg5MiwgMHhGOSwgMHhENiwgMHhDMCwgLyogMHhCNC0weEI3ICovCisJMHhCNSwgMHhBNywgMHg5MiwgMHhGQSwgMHhCMiwgMHhGNCwgMHg5MiwgMHhGQiwgLyogMHhCOC0weEJCICovCisJMHhERSwgMHhFOCwgMHg5MiwgMHhGQywgMHhERSwgMHhGMiwgMHg5MiwgMHhGRCwgLyogMHhCQy0weEJGICovCisJMHg5MiwgMHhGRSwgMHg5MywgMHg0MCwgMHg5MywgMHg0MSwgMHg5MywgMHg0MiwgLyogMHhDMC0weEMzICovCisJMHhERSwgMHhFRCwgMHg5MywgMHg0MywgMHhERSwgMHhGMSwgMHg5MywgMHg0NCwgLyogMHhDNC0weEM3ICovCisJMHg5MywgMHg0NSwgMHhDOCwgMHhFMCwgMHg5MywgMHg0NiwgMHg5MywgMHg0NywgLyogMHhDOC0weENCICovCisJMHg5MywgMHg0OCwgMHhENywgMHhFMSwgMHhERSwgMHhFRiwgMHhDMywgMHhFOCwgLyogMHhDQy0weENGICovCisJMHhDQywgMHhFMSwgMHg5MywgMHg0OSwgMHhCMiwgMHhFNSwgMHg5MywgMHg0QSwgLyogMHhEMC0weEQzICovCisJMHg5MywgMHg0QiwgMHg5MywgMHg0QywgMHhEMiwgMHhCRSwgMHg5MywgMHg0RCwgLyogMHhENC0weEQ3ICovCisJMHg5MywgMHg0RSwgMHg5MywgMHg0RiwgMHg5MywgMHg1MCwgMHg5MywgMHg1MSwgLyogMHhEOC0weERCICovCisJMHg5MywgMHg1MiwgMHg5MywgMHg1MywgMHhERSwgMHhFRSwgMHg5MywgMHg1NCwgLyogMHhEQy0weERGICovCisJMHhERSwgMHhFQiwgMHhDRSwgMHhENSwgMHg5MywgMHg1NSwgMHhCNCwgMHhBNywgLyogMHhFMC0weEUzICovCisJMHg5MywgMHg1NiwgMHg5MywgMHg1NywgMHg5MywgMHg1OCwgMHg5MywgMHg1OSwgLyogMHhFNC0weEU3ICovCisJMHg5MywgMHg1QSwgMHhCRiwgMHhBQiwgMHhCRSwgMHhCRSwgMHg5MywgMHg1QiwgLyogMHhFOC0weEVCICovCisJMHg5MywgMHg1QywgMHhCRCwgMHhEMiwgMHg5MywgMHg1RCwgMHg5MywgMHg1RSwgLyogMHhFQy0weEVGICovCisJMHg5MywgMHg1RiwgMHg5MywgMHg2MCwgMHhERSwgMHhFOSwgMHg5MywgMHg2MSwgLyogMHhGMC0weEYzICovCisJMHhENCwgMHhBRSwgMHg5MywgMHg2MiwgMHhERSwgMHhERSwgMHg5MywgMHg2MywgLyogMHhGNC0weEY3ICovCisJMHhERSwgMHhFQSwgMHg5MywgMHg2NCwgMHg5MywgMHg2NSwgMHg5MywgMHg2NiwgLyogMHhGOC0weEZCICovCisJMHg5MywgMHg2NywgMHhDMCwgMHhCRiwgMHg5MywgMHg2OCwgMHhERSwgMHhFQywgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNjRbNTEyXSA9IHsKKwkweEIyLCAweEYzLCAweEI4LCAweEU5LCAweEMyLCAweEE3LCAweDkzLCAweDY5LCAvKiAweDAwLTB4MDMgKi8KKwkweDkzLCAweDZBLCAweEJELCAweEMxLCAweDkzLCAweDZCLCAweDkzLCAweDZDLCAvKiAweDA0LTB4MDcgKi8KKwkweDkzLCAweDZELCAweDkzLCAweDZFLCAweDkzLCAweDZGLCAweERFLCAweEY1LCAvKiAweDA4LTB4MEIgKi8KKwkweERFLCAweEY4LCAweDkzLCAweDcwLCAweDkzLCAweDcxLCAweEIyLCAweEFCLCAvKiAweDBDLTB4MEYgKi8KKwkweEI0LCAweEE0LCAweDkzLCAweDcyLCAweDkzLCAweDczLCAweEI0LCAweEVBLCAvKiAweDEwLTB4MTMgKi8KKwkweEM5LCAweEE2LCAweDkzLCAweDc0LCAweDkzLCAweDc1LCAweDkzLCAweDc2LCAvKiAweDE0LTB4MTcgKi8KKwkweDkzLCAweDc3LCAweDkzLCAweDc4LCAweDkzLCAweDc5LCAweERFLCAweEY2LCAvKiAweDE4LTB4MUIgKi8KKwkweENCLCAweEQxLCAweDkzLCAweDdBLCAweEI4LCAweEUzLCAweDkzLCAweDdCLCAvKiAweDFDLTB4MUYgKi8KKwkweERFLCAweEY3LCAweERFLCAweEZBLCAweDkzLCAweDdDLCAweDkzLCAweDdELCAvKiAweDIwLTB4MjMgKi8KKwkweDkzLCAweDdFLCAweDkzLCAweDgwLCAweERFLCAweEY5LCAweDkzLCAweDgxLCAvKiAweDI0LTB4MjcgKi8KKwkweDkzLCAweDgyLCAweDkzLCAweDgzLCAweENDLCAweEMyLCAweDkzLCAweDg0LCAvKiAweDI4LTB4MkIgKi8KKwkweEIwLCAweEUxLCAweEI0LCAweEVFLCAweDkzLCAweDg1LCAweDkzLCAweDg2LCAvKiAweDJDLTB4MkYgKi8KKwkweDkzLCAweDg3LCAweDkzLCAweDg4LCAweDkzLCAweDg5LCAweDkzLCAweDhBLCAvKiAweDMwLTB4MzMgKi8KKwkweEU1LCAweEJBLCAweDkzLCAweDhCLCAweDkzLCAweDhDLCAweDkzLCAweDhELCAvKiAweDM0LTB4MzcgKi8KKwkweDkzLCAweDhFLCAweDkzLCAweDhGLCAweEQwLCAweEFGLCAweDkzLCAweDkwLCAvKiAweDM4LTB4M0IgKi8KKwkweDkzLCAweDkxLCAweEIyLCAweEVCLCAweDkzLCAweDkyLCAweEVCLCAweEExLCAvKiAweDNDLTB4M0YgKi8KKwkweDkzLCAweDkzLCAweERFLCAweEY0LCAweDkzLCAweDk0LCAweDkzLCAweDk1LCAvKiAweDQwLTB4NDMgKi8KKwkweEM5LCAweEUzLCAweERFLCAweEYzLCAweEIwLCAweERBLCAweEQyLCAweEExLCAvKiAweDQ0LTB4NDcgKi8KKwkweEIxLCAweEY3LCAweDkzLCAweDk2LCAweENDLCAweEFGLCAweDkzLCAweDk3LCAvKiAweDQ4LTB4NEIgKi8KKwkweDkzLCAweDk4LCAweDkzLCAweDk5LCAweDkzLCAweDlBLCAweDkzLCAweDlCLCAvKiAweDRDLTB4NEYgKi8KKwkweDkzLCAweDlDLCAweDkzLCAweDlELCAweERFLCAweEYwLCAweDkzLCAweDlFLCAvKiAweDUwLTB4NTMgKi8KKwkweENCLCAweEE0LCAweDkzLCAweDlGLCAweDkzLCAweEEwLCAweDkzLCAweEExLCAvKiAweDU0LTB4NTcgKi8KKwkweEQ1LCAweEFBLCAweDkzLCAweEEyLCAweDkzLCAweEEzLCAweDkzLCAweEE0LCAvKiAweDU4LTB4NUIgKi8KKwkweDkzLCAweEE1LCAweDkzLCAweEE2LCAweERFLCAweEZCLCAweDkzLCAweEE3LCAvKiAweDVDLTB4NUYgKi8KKwkweDkzLCAweEE4LCAweDkzLCAweEE5LCAweDkzLCAweEFBLCAweDkzLCAweEFCLCAvKiAweDYwLTB4NjMgKi8KKwkweDkzLCAweEFDLCAweDkzLCAweEFELCAweDkzLCAweEFFLCAweEI0LCAweERELCAvKiAweDY0LTB4NjcgKi8KKwkweDkzLCAweEFGLCAweEM0LCAweEE2LCAweDkzLCAweEIwLCAweDkzLCAweEIxLCAvKiAweDY4LTB4NkIgKi8KKwkweDkzLCAweEIyLCAweERFLCAweEZELCAweDkzLCAweEIzLCAweDkzLCAweEI0LCAvKiAweDZDLTB4NkYgKi8KKwkweDkzLCAweEI1LCAweDkzLCAweEI2LCAweDkzLCAweEI3LCAweDkzLCAweEI4LCAvKiAweDcwLTB4NzMgKi8KKwkweDkzLCAweEI5LCAweDkzLCAweEJBLCAweDkzLCAweEJCLCAweDkzLCAweEJDLCAvKiAweDc0LTB4NzcgKi8KKwkweEMzLCAweEZFLCAweEM0LCAweEExLCAweERGLCAweEExLCAweDkzLCAweEJELCAvKiAweDc4LTB4N0IgKi8KKwkweDkzLCAweEJFLCAweDkzLCAweEJGLCAweDkzLCAweEMwLCAweDkzLCAweEMxLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDkzLCAweEMyLCAweDkzLCAweEMzLCAweEMxLCAweENDLCAweDkzLCAweEM0LCAvKiAweDgwLTB4ODMgKi8KKwkweERFLCAweEZDLCAweEJFLCAweEVGLCAweDkzLCAweEM1LCAweEM2LCAweEIyLCAvKiAweDg0LTB4ODcgKi8KKwkweDkzLCAweEM2LCAweDkzLCAweEM3LCAweDkzLCAweEM4LCAweDkzLCAweEM5LCAvKiAweDg4LTB4OEIgKi8KKwkweDkzLCAweENBLCAweDkzLCAweENCLCAweDkzLCAweENDLCAweDkzLCAweENELCAvKiAweDhDLTB4OEYgKi8KKwkweDkzLCAweENFLCAweEIzLCAweEM1LCAweEM4LCAweEY2LCAweDkzLCAweENGLCAvKiAweDkwLTB4OTMgKi8KKwkweDkzLCAweEQwLCAweENCLCAweEJBLCAweERFLCAweEZFLCAweDkzLCAweEQxLCAvKiAweDk0LTB4OTcgKi8KKwkweDkzLCAweEQyLCAweERGLCAweEE0LCAweDkzLCAweEQzLCAweDkzLCAweEQ0LCAvKiAweDk4LTB4OUIgKi8KKwkweDkzLCAweEQ1LCAweDkzLCAweEQ2LCAweEQ3LCAweEIyLCAweDkzLCAweEQ3LCAvKiAweDlDLTB4OUYgKi8KKwkweDkzLCAweEQ4LCAweDkzLCAweEQ5LCAweDkzLCAweERBLCAweDkzLCAweERCLCAvKiAweEEwLTB4QTMgKi8KKwkweEIzLCAweEI3LCAweDkzLCAweERDLCAweDkzLCAweERELCAweDkzLCAweERFLCAvKiAweEE0LTB4QTcgKi8KKwkweDkzLCAweERGLCAweEMxLCAweEMzLCAweDkzLCAweEUwLCAweDkzLCAweEUxLCAvKiAweEE4LTB4QUIgKi8KKwkweEM3LCAweENCLCAweEIyLCAweEE1LCAweEI0LCAweEU5LCAweDkzLCAweEUyLCAvKiAweEFDLTB4QUYgKi8KKwkweEQ3LCAweEFCLCAweDkzLCAweEUzLCAweDkzLCAweEU0LCAweDkzLCAweEU1LCAvKiAweEIwLTB4QjMgKi8KKwkweDkzLCAweEU2LCAweEM0LCAweEVDLCAweDkzLCAweEU3LCAweERGLCAweEEyLCAvKiAweEI0LTB4QjcgKi8KKwkweERGLCAweEEzLCAweDkzLCAweEU4LCAweERGLCAweEE1LCAweDkzLCAweEU5LCAvKiAweEI4LTB4QkIgKi8KKwkweEJBLCAweEIzLCAweDkzLCAweEVBLCAweDkzLCAweEVCLCAweDkzLCAweEVDLCAvKiAweEJDLTB4QkYgKi8KKwkweERGLCAweEE2LCAweDkzLCAweEVELCAweEMwLCAweERFLCAweDkzLCAweEVFLCAvKiAweEMwLTB4QzMgKi8KKwkweDkzLCAweEVGLCAweEM5LCAweEMzLCAweDkzLCAweEYwLCAweDkzLCAweEYxLCAvKiAweEM0LTB4QzcgKi8KKwkweDkzLCAweEYyLCAweDkzLCAweEYzLCAweDkzLCAweEY0LCAweDkzLCAweEY1LCAvKiAweEM4LTB4Q0IgKi8KKwkweDkzLCAweEY2LCAweEIyLCAweEQ5LCAweEM3LCAweEU2LCAweDkzLCAweEY3LCAvKiAweENDLTB4Q0YgKi8KKwkweERGLCAweEE3LCAweDkzLCAweEY4LCAweEM3LCAweERDLCAweDkzLCAweEY5LCAvKiAweEQwLTB4RDMgKi8KKwkweDkzLCAweEZBLCAweDkzLCAweEZCLCAweDkzLCAweEZDLCAweERGLCAweEE4LCAvKiAweEQ0LTB4RDcgKi8KKwkweEVCLCAweEEyLCAweDkzLCAweEZELCAweDkzLCAweEZFLCAweDk0LCAweDQwLCAvKiAweEQ4LTB4REIgKi8KKwkweDk0LCAweDQxLCAweDk0LCAweDQyLCAweENCLCAweEQzLCAweDk0LCAweDQzLCAvKiAweERDLTB4REYgKi8KKwkweDk0LCAweDQ0LCAweDk0LCAweDQ1LCAweERGLCAweEFBLCAweDk0LCAweDQ2LCAvKiAweEUwLTB4RTMgKi8KKwkweERGLCAweEE5LCAweDk0LCAweDQ3LCAweEIyLCAweEMxLCAweDk0LCAweDQ4LCAvKiAweEU0LTB4RTcgKi8KKwkweDk0LCAweDQ5LCAweDk0LCAweDRBLCAweDk0LCAweDRCLCAweDk0LCAweDRDLCAvKiAweEU4LTB4RUIgKi8KKwkweDk0LCAweDRELCAweDk0LCAweDRFLCAweDk0LCAweDRGLCAweDk0LCAweDUwLCAvKiAweEVDLTB4RUYgKi8KKwkweDk0LCAweDUxLCAweDk0LCAweDUyLCAweDk0LCAweDUzLCAweDk0LCAweDU0LCAvKiAweEYwLTB4RjMgKi8KKwkweDk0LCAweDU1LCAweDk0LCAweDU2LCAweDk0LCAweDU3LCAweDk0LCAweDU4LCAvKiAweEY0LTB4RjcgKi8KKwkweDk0LCAweDU5LCAweDk0LCAweDVBLCAweDk0LCAweDVCLCAweDk0LCAweDVDLCAvKiAweEY4LTB4RkIgKi8KKwkweDk0LCAweDVELCAweDk0LCAweDVFLCAweDk0LCAweDVGLCAweDk0LCAweDYwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182NVs1MTJdID0geworCTB4QzUsIDB4Q0EsIDB4OTQsIDB4NjEsIDB4OTQsIDB4NjIsIDB4OTQsIDB4NjMsIC8qIDB4MDAtMHgwMyAqLworCTB4OTQsIDB4NjQsIDB4OTQsIDB4NjUsIDB4OTQsIDB4NjYsIDB4OTQsIDB4NjcsIC8qIDB4MDQtMHgwNyAqLworCTB4OTQsIDB4NjgsIDB4REYsIDB4QUIsIDB4OTQsIDB4NjksIDB4OTQsIDB4NkEsIC8qIDB4MDgtMHgwQiAqLworCTB4OTQsIDB4NkIsIDB4OTQsIDB4NkMsIDB4OTQsIDB4NkQsIDB4OTQsIDB4NkUsIC8qIDB4MEMtMHgwRiAqLworCTB4OTQsIDB4NkYsIDB4OTQsIDB4NzAsIDB4RDQsIDB4REMsIDB4OTQsIDB4NzEsIC8qIDB4MTAtMHgxMyAqLworCTB4OTQsIDB4NzIsIDB4OTQsIDB4NzMsIDB4OTQsIDB4NzQsIDB4OTQsIDB4NzUsIC8qIDB4MTQtMHgxNyAqLworCTB4QzgsIDB4QzEsIDB4OTQsIDB4NzYsIDB4OTQsIDB4NzcsIDB4OTQsIDB4NzgsIC8qIDB4MTgtMHgxQiAqLworCTB4OTQsIDB4NzksIDB4OTQsIDB4N0EsIDB4OTQsIDB4N0IsIDB4OTQsIDB4N0MsIC8qIDB4MUMtMHgxRiAqLworCTB4OTQsIDB4N0QsIDB4OTQsIDB4N0UsIDB4OTQsIDB4ODAsIDB4OTQsIDB4ODEsIC8qIDB4MjAtMHgyMyAqLworCTB4OTQsIDB4ODIsIDB4REYsIDB4QUMsIDB4OTQsIDB4ODMsIDB4OTQsIDB4ODQsIC8qIDB4MjQtMHgyNyAqLworCTB4OTQsIDB4ODUsIDB4OTQsIDB4ODYsIDB4OTQsIDB4ODcsIDB4QkUsIDB4RjAsIC8qIDB4MjgtMHgyQiAqLworCTB4OTQsIDB4ODgsIDB4OTQsIDB4ODksIDB4REYsIDB4QUQsIDB4RDYsIDB4QTcsIC8qIDB4MkMtMHgyRiAqLworCTB4OTQsIDB4OEEsIDB4OTQsIDB4OEIsIDB4OTQsIDB4OEMsIDB4OTQsIDB4OEQsIC8qIDB4MzAtMHgzMyAqLworCTB4RUEsIDB4QjcsIDB4RUIsIDB4QjYsIDB4Q0EsIDB4RDUsIDB4OTQsIDB4OEUsIC8qIDB4MzQtMHgzNyAqLworCTB4RDgsIDB4RkMsIDB4QjgsIDB4QzQsIDB4OTQsIDB4OEYsIDB4QjksIDB4QTUsIC8qIDB4MzgtMHgzQiAqLworCTB4OTQsIDB4OTAsIDB4OTQsIDB4OTEsIDB4QjcsIDB4QzUsIDB4RDUsIDB4RkUsIC8qIDB4M0MtMHgzRiAqLworCTB4OTQsIDB4OTIsIDB4OTQsIDB4OTMsIDB4OTQsIDB4OTQsIDB4OTQsIDB4OTUsIC8qIDB4NDAtMHg0MyAqLworCTB4OTQsIDB4OTYsIDB4QjksIDB4Q0EsIDB4OTQsIDB4OTcsIDB4OTQsIDB4OTgsIC8qIDB4NDQtMHg0NyAqLworCTB4RDAsIDB4QTcsIDB4RjQsIDB4Q0QsIDB4OTQsIDB4OTksIDB4OTQsIDB4OUEsIC8qIDB4NDgtMHg0QiAqLworCTB4QjUsIDB4RDAsIDB4OTQsIDB4OUIsIDB4OTQsIDB4OUMsIDB4QzMsIDB4RjQsIC8qIDB4NEMtMHg0RiAqLworCTB4OTQsIDB4OUQsIDB4QkUsIDB4QzgsIDB4OTQsIDB4OUUsIDB4OTQsIDB4OUYsIC8qIDB4NTAtMHg1MyAqLworCTB4OTQsIDB4QTAsIDB4RUIsIDB4QjcsIDB4QjAsIDB4QkQsIDB4OTQsIDB4QTEsIC8qIDB4NTQtMHg1NyAqLworCTB4OTQsIDB4QTIsIDB4QkQsIDB4Q0MsIDB4OTQsIDB4QTMsIDB4QzEsIDB4QjIsIC8qIDB4NTgtMHg1QiAqLworCTB4OTQsIDB4QTQsIDB4QjEsIDB4RDYsIDB4QjMsIDB4QTgsIDB4OTQsIDB4QTUsIC8qIDB4NUMtMHg1RiAqLworCTB4OTQsIDB4QTYsIDB4OTQsIDB4QTcsIDB4QjgsIDB4RDIsIDB4QzksIDB4QTIsIC8qIDB4NjAtMHg2MyAqLworCTB4OTQsIDB4QTgsIDB4OTQsIDB4QTksIDB4QjYsIDB4RDgsIDB4OTQsIDB4QUEsIC8qIDB4NjQtMHg2NyAqLworCTB4OTQsIDB4QUIsIDB4OTQsIDB4QUMsIDB4OTQsIDB4QUQsIDB4RUIsIDB4QjgsIC8qIDB4NjgtMHg2QiAqLworCTB4QkUsIDB4QjQsIDB4OTQsIDB4QUUsIDB4OTQsIDB4QUYsIDB4OTQsIDB4QjAsIC8qIDB4NkMtMHg2RiAqLworCTB4Q0EsIDB4RkQsIDB4OTQsIDB4QjEsIDB4QzcsIDB4QzMsIDB4OTQsIDB4QjIsIC8qIDB4NzAtMHg3MyAqLworCTB4RDUsIDB4RkIsIDB4OTQsIDB4QjMsIDB4OTQsIDB4QjQsIDB4QjcsIDB4RjMsIC8qIDB4NzQtMHg3NyAqLworCTB4OTQsIDB4QjUsIDB4OTQsIDB4QjYsIDB4OTQsIDB4QjcsIDB4OTQsIDB4QjgsIC8qIDB4NzgtMHg3QiAqLworCTB4OTQsIDB4QjksIDB4OTQsIDB4QkEsIDB4OTQsIDB4QkIsIDB4OTQsIDB4QkMsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4OTQsIDB4QkQsIDB4OTQsIDB4QkUsIDB4OTQsIDB4QkYsIDB4OTQsIDB4QzAsIC8qIDB4ODAtMHg4MyAqLworCTB4OTQsIDB4QzEsIDB4OTQsIDB4QzIsIDB4OTQsIDB4QzMsIDB4Q0UsIDB4QzQsIC8qIDB4ODQtMHg4NyAqLworCTB4OTQsIDB4QzQsIDB4OTQsIDB4QzUsIDB4OTQsIDB4QzYsIDB4RDUsIDB4QUIsIC8qIDB4ODgtMHg4QiAqLworCTB4QjEsIDB4RjMsIDB4OTQsIDB4QzcsIDB4OTQsIDB4QzgsIDB4OTQsIDB4QzksIC8qIDB4OEMtMHg4RiAqLworCTB4RUMsIDB4QjMsIDB4QjAsIDB4REYsIDB4OTQsIDB4Q0EsIDB4RUMsIDB4QjUsIC8qIDB4OTAtMHg5MyAqLworCTB4OTQsIDB4Q0IsIDB4OTQsIDB4Q0MsIDB4OTQsIDB4Q0QsIDB4QjYsIDB4QjcsIC8qIDB4OTQtMHg5NyAqLworCTB4OTQsIDB4Q0UsIDB4QzEsIDB4Q0YsIDB4OTQsIDB4Q0YsIDB4RjUsIDB4RkEsIC8qIDB4OTgtMHg5QiAqLworCTB4RDAsIDB4QjEsIDB4OTQsIDB4RDAsIDB4OTQsIDB4RDEsIDB4RDUsIDB4RTUsIC8qIDB4OUMtMHg5RiAqLworCTB4OTQsIDB4RDIsIDB4Q0UsIDB4RDMsIDB4OTQsIDB4RDMsIDB4OTQsIDB4RDQsIC8qIDB4QTAtMHhBMyAqLworCTB4QkQsIDB4RUYsIDB4QjMsIDB4RTIsIDB4OTQsIDB4RDUsIDB4QjgsIDB4QUIsIC8qIDB4QTQtMHhBNyAqLworCTB4OTQsIDB4RDYsIDB4RDUsIDB4QjYsIDB4OTQsIDB4RDcsIDB4RUQsIDB4QkQsIC8qIDB4QTgtMHhBQiAqLworCTB4OTQsIDB4RDgsIDB4QjYsIDB4Q0YsIDB4OTQsIDB4RDksIDB4Q0IsIDB4QjksIC8qIDB4QUMtMHhBRiAqLworCTB4RDAsIDB4QzIsIDB4OTQsIDB4REEsIDB4OTQsIDB4REIsIDB4OTQsIDB4REMsIC8qIDB4QjAtMHhCMyAqLworCTB4OTQsIDB4REQsIDB4OTQsIDB4REUsIDB4OTQsIDB4REYsIDB4OTQsIDB4RTAsIC8qIDB4QjQtMHhCNyAqLworCTB4OTQsIDB4RTEsIDB4QjcsIDB4QkQsIDB4OTQsIDB4RTIsIDB4OTQsIDB4RTMsIC8qIDB4QjgtMHhCQiAqLworCTB4RUMsIDB4QjYsIDB4Q0EsIDB4QTksIDB4OTQsIDB4RTQsIDB4OTQsIDB4RTUsIC8qIDB4QkMtMHhCRiAqLworCTB4OTQsIDB4RTYsIDB4QzUsIDB4RDQsIDB4OTQsIDB4RTcsIDB4RUMsIDB4QjksIC8qIDB4QzAtMHhDMyAqLworCTB4RUMsIDB4QjgsIDB4QzIsIDB4QzMsIDB4RUMsIDB4QjcsIDB4OTQsIDB4RTgsIC8qIDB4QzQtMHhDNyAqLworCTB4OTQsIDB4RTksIDB4OTQsIDB4RUEsIDB4OTQsIDB4RUIsIDB4RDAsIDB4RkQsIC8qIDB4QzgtMHhDQiAqLworCTB4RUMsIDB4QkEsIDB4OTQsIDB4RUMsIDB4RUMsIDB4QkIsIDB4RDcsIDB4RTUsIC8qIDB4Q0MtMHhDRiAqLworCTB4OTQsIDB4RUQsIDB4OTQsIDB4RUUsIDB4RUMsIDB4QkMsIDB4OTQsIDB4RUYsIC8qIDB4RDAtMHhEMyAqLworCTB4OTQsIDB4RjAsIDB4OTQsIDB4RjEsIDB4RUMsIDB4QkQsIDB4QzYsIDB4RUMsIC8qIDB4RDQtMHhENyAqLworCTB4OTQsIDB4RjIsIDB4OTQsIDB4RjMsIDB4OTQsIDB4RjQsIDB4OTQsIDB4RjUsIC8qIDB4RDgtMHhEQiAqLworCTB4OTQsIDB4RjYsIDB4OTQsIDB4RjcsIDB4OTQsIDB4RjgsIDB4OTQsIDB4RjksIC8qIDB4REMtMHhERiAqLworCTB4Q0UsIDB4REUsIDB4OTQsIDB4RkEsIDB4QkMsIDB4QzgsIDB4OTQsIDB4RkIsIC8qIDB4RTAtMHhFMyAqLworCTB4OTQsIDB4RkMsIDB4QzgsIDB4RDUsIDB4QjUsIDB4QTksIDB4QkUsIDB4QzksIC8qIDB4RTQtMHhFNyAqLworCTB4RDYsIDB4QkMsIDB4RDQsIDB4RTcsIDB4OTQsIDB4RkQsIDB4OTQsIDB4RkUsIC8qIDB4RTgtMHhFQiAqLworCTB4RDEsIDB4QUUsIDB4RDAsIDB4RjEsIDB4RUEsIDB4QjgsIDB4RUEsIDB4QjksIC8qIDB4RUMtMHhFRiAqLworCTB4RUEsIDB4QkEsIDB4QkEsIDB4QjUsIDB4OTUsIDB4NDAsIDB4OTUsIDB4NDEsIC8qIDB4RjAtMHhGMyAqLworCTB4OTUsIDB4NDIsIDB4OTUsIDB4NDMsIDB4Q0EsIDB4QjEsIDB4QkYsIDB4RjUsIC8qIDB4RjQtMHhGNyAqLworCTB4OTUsIDB4NDQsIDB4OTUsIDB4NDUsIDB4Q0QsIDB4RkEsIDB4OTUsIDB4NDYsIC8qIDB4RjgtMHhGQiAqLworCTB4OTUsIDB4NDcsIDB4OTUsIDB4NDgsIDB4OTUsIDB4NDksIDB4OTUsIDB4NEEsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzY2WzUxMl0gPSB7CisJMHhFQSwgMHhDMCwgMHg5NSwgMHg0QiwgMHhCMCwgMHhCQSwgMHhFQSwgMHhCRSwgLyogMHgwMC0weDAzICovCisJMHg5NSwgMHg0QywgMHg5NSwgMHg0RCwgMHhDMCwgMHhBNSwgMHg5NSwgMHg0RSwgLyogMHgwNC0weDA3ICovCisJMHg5NSwgMHg0RiwgMHg5NSwgMHg1MCwgMHhFQSwgMHhCQiwgMHg5NSwgMHg1MSwgLyogMHgwOC0weDBCICovCisJMHhCMiwgMHhGRCwgMHg5NSwgMHg1MiwgMHhDMywgMHhGNywgMHhCQiwgMHhFOCwgLyogMHgwQy0weDBGICovCisJMHg5NSwgMHg1MywgMHg5NSwgMHg1NCwgMHg5NSwgMHg1NSwgMHhEMiwgMHhENywgLyogMHgxMC0weDEzICovCisJMHhDRSwgMHhGNCwgMHhFQSwgMHhCRiwgMHg5NSwgMHg1NiwgMHg5NSwgMHg1NywgLyogMHgxNC0weDE3ICovCisJMHg5NSwgMHg1OCwgMHhFQSwgMHhCQywgMHg5NSwgMHg1OSwgMHg5NSwgMHg1QSwgLyogMHgxOC0weDFCICovCisJMHg5NSwgMHg1QiwgMHhFQSwgMHhDMywgMHg5NSwgMHg1QywgMHhEMCwgMHhDNywgLyogMHgxQy0weDFGICovCisJMHhEMywgMHhCMywgMHg5NSwgMHg1RCwgMHg5NSwgMHg1RSwgMHg5NSwgMHg1RiwgLyogMHgyMC0weDIzICovCisJMHg5NSwgMHg2MCwgMHhCNCwgMHhCQSwgMHg5NSwgMHg2MSwgMHhDMywgMHhDMSwgLyogMHgyNC0weDI3ICovCisJMHhENywgMHhGMiwgMHg5NSwgMHg2MiwgMHg5NSwgMHg2MywgMHg5NSwgMHg2NCwgLyogMHgyOC0weDJCICovCisJMHg5NSwgMHg2NSwgMHhENSwgMHhEMSwgMHg5NSwgMHg2NiwgMHhDQSwgMHhDNywgLyogMHgyQy0weDJGICovCisJMHg5NSwgMHg2NywgMHhFQSwgMHhDNSwgMHg5NSwgMHg2OCwgMHg5NSwgMHg2OSwgLyogMHgzMC0weDMzICovCisJMHhFQSwgMHhDNCwgMHhFQSwgMHhDNywgMHhFQSwgMHhDNiwgMHg5NSwgMHg2QSwgLyogMHgzNC0weDM3ICovCisJMHg5NSwgMHg2QiwgMHg5NSwgMHg2QywgMHg5NSwgMHg2RCwgMHg5NSwgMHg2RSwgLyogMHgzOC0weDNCICovCisJMHhENiwgMHhFNywgMHg5NSwgMHg2RiwgMHhDRiwgMHhENCwgMHg5NSwgMHg3MCwgLyogMHgzQy0weDNGICovCisJMHg5NSwgMHg3MSwgMHhFQSwgMHhDQiwgMHg5NSwgMHg3MiwgMHhCQiwgMHhDRSwgLyogMHg0MC0weDQzICovCisJMHg5NSwgMHg3MywgMHg5NSwgMHg3NCwgMHg5NSwgMHg3NSwgMHg5NSwgMHg3NiwgLyogMHg0NC0weDQ3ICovCisJMHg5NSwgMHg3NywgMHg5NSwgMHg3OCwgMHg5NSwgMHg3OSwgMHhCRCwgMHhGQSwgLyogMHg0OC0weDRCICovCisJMHhDOSwgMHhDRSwgMHg5NSwgMHg3QSwgMHg5NSwgMHg3QiwgMHhFQSwgMHhDQywgLyogMHg0Qy0weDRGICovCisJMHg5NSwgMHg3QywgMHg5NSwgMHg3RCwgMHhDOSwgMHhCOSwgMHhDRiwgMHhGRSwgLyogMHg1MC0weDUzICovCisJMHhFQSwgMHhDQSwgMHhENCwgMHhDRSwgMHhFQSwgMHhDRCwgMHhFQSwgMHhDRiwgLyogMHg1NC0weDU3ICovCisJMHg5NSwgMHg3RSwgMHg5NSwgMHg4MCwgMHhDRCwgMHhFRCwgMHg5NSwgMHg4MSwgLyogMHg1OC0weDVCICovCisJMHg5NSwgMHg4MiwgMHg5NSwgMHg4MywgMHg5NSwgMHg4NCwgMHhFQSwgMHhDOSwgLyogMHg1Qy0weDVGICovCisJMHg5NSwgMHg4NSwgMHhFQSwgMHhDRSwgMHg5NSwgMHg4NiwgMHg5NSwgMHg4NywgLyogMHg2MC0weDYzICovCisJMHhDRSwgMHhFRSwgMHg5NSwgMHg4OCwgMHhCQiwgMHhERSwgMHg5NSwgMHg4OSwgLyogMHg2NC0weDY3ICovCisJMHhCMywgMHhCRiwgMHg5NSwgMHg4QSwgMHg5NSwgMHg4QiwgMHg5NSwgMHg4QywgLyogMHg2OC0weDZCICovCisJMHg5NSwgMHg4RCwgMHg5NSwgMHg4RSwgMHhDNiwgMHhENSwgMHhCRSwgMHhCMCwgLyogMHg2Qy0weDZGICovCisJMHhDRSwgMHhGQSwgMHg5NSwgMHg4RiwgMHg5NSwgMHg5MCwgMHg5NSwgMHg5MSwgLyogMHg3MC0weDczICovCisJMHhDNywgMHhFNywgMHg5NSwgMHg5MiwgMHhCRSwgMHhBNywgMHhFQSwgMHhEMCwgLyogMHg3NC0weDc3ICovCisJMHg5NSwgMHg5MywgMHg5NSwgMHg5NCwgMHhENiwgMHhDNywgMHg5NSwgMHg5NSwgLyogMHg3OC0weDdCICovCisJMHg5NSwgMHg5NiwgMHg5NSwgMHg5NywgMHhDMSwgMHhDMCwgMHg5NSwgMHg5OCwgLyogMHg3Qy0weDdGICovCisJCisJMHg5NSwgMHg5OSwgMHg5NSwgMHg5QSwgMHhENCwgMHhERCwgMHg5NSwgMHg5QiwgLyogMHg4MC0weDgzICovCisJMHhFQSwgMHhEMSwgMHg5NSwgMHg5QywgMHg5NSwgMHg5RCwgMHhDRiwgMHhCRSwgLyogMHg4NC0weDg3ICovCisJMHg5NSwgMHg5RSwgMHg5NSwgMHg5RiwgMHg5NSwgMHhBMCwgMHg5NSwgMHhBMSwgLyogMHg4OC0weDhCICovCisJMHhFQSwgMHhEMiwgMHg5NSwgMHhBMiwgMHg5NSwgMHhBMywgMHg5NSwgMHhBNCwgLyogMHg4Qy0weDhGICovCisJMHg5NSwgMHhBNSwgMHhDQSwgMHhFRSwgMHg5NSwgMHhBNiwgMHg5NSwgMHhBNywgLyogMHg5MC0weDkzICovCisJMHg5NSwgMHhBOCwgMHg5NSwgMHhBOSwgMHhDNSwgMHhBRiwgMHhCMCwgMHhCNSwgLyogMHg5NC0weDk3ICovCisJMHg5NSwgMHhBQSwgMHg5NSwgMHhBQiwgMHg5NSwgMHhBQywgMHg5NSwgMHhBRCwgLyogMHg5OC0weDlCICovCisJMHg5NSwgMHhBRSwgMHhFQSwgMHhENCwgMHg5NSwgMHhBRiwgMHg5NSwgMHhCMCwgLyogMHg5Qy0weDlGICovCisJMHg5NSwgMHhCMSwgMHg5NSwgMHhCMiwgMHg5NSwgMHhCMywgMHg5NSwgMHhCNCwgLyogMHhBMC0weEEzICovCisJMHg5NSwgMHhCNSwgMHg5NSwgMHhCNiwgMHg5NSwgMHhCNywgMHhFQSwgMHhEMywgLyogMHhBNC0weEE3ICovCisJMHhGNCwgMHhERiwgMHg5NSwgMHhCOCwgMHg5NSwgMHhCOSwgMHg5NSwgMHhCQSwgLyogMHhBOC0weEFCICovCisJMHg5NSwgMHhCQiwgMHg5NSwgMHhCQywgMHhDNCwgMHhCQSwgMHg5NSwgMHhCRCwgLyogMHhBQy0weEFGICovCisJMHg5NSwgMHhCRSwgMHg5NSwgMHhCRiwgMHg5NSwgMHhDMCwgMHg5NSwgMHhDMSwgLyogMHhCMC0weEIzICovCisJMHhCMSwgMHhBOSwgMHg5NSwgMHhDMiwgMHg5NSwgMHhDMywgMHg5NSwgMHhDNCwgLyogMHhCNC0weEI3ICovCisJMHg5NSwgMHhDNSwgMHhFNSwgMHhERiwgMHg5NSwgMHhDNiwgMHg5NSwgMHhDNywgLyogMHhCOC0weEJCICovCisJMHg5NSwgMHhDOCwgMHg5NSwgMHhDOSwgMHhFQSwgMHhENSwgMHg5NSwgMHhDQSwgLyogMHhCQy0weEJGICovCisJMHg5NSwgMHhDQiwgMHg5NSwgMHhDQywgMHg5NSwgMHhDRCwgMHg5NSwgMHhDRSwgLyogMHhDMC0weEMzICovCisJMHg5NSwgMHhDRiwgMHg5NSwgMHhEMCwgMHg5NSwgMHhEMSwgMHg5NSwgMHhEMiwgLyogMHhDNC0weEM3ICovCisJMHg5NSwgMHhEMywgMHg5NSwgMHhENCwgMHg5NSwgMHhENSwgMHg5NSwgMHhENiwgLyogMHhDOC0weENCICovCisJMHg5NSwgMHhENywgMHg5NSwgMHhEOCwgMHg5NSwgMHhEOSwgMHg5NSwgMHhEQSwgLyogMHhDQy0weENGICovCisJMHg5NSwgMHhEQiwgMHg5NSwgMHhEQywgMHg5NSwgMHhERCwgMHg5NSwgMHhERSwgLyogMHhEMC0weEQzICovCisJMHg5NSwgMHhERiwgMHg5NSwgMHhFMCwgMHg5NSwgMHhFMSwgMHg5NSwgMHhFMiwgLyogMHhENC0weEQ3ICovCisJMHg5NSwgMHhFMywgMHhDQSwgMHhFRiwgMHg5NSwgMHhFNCwgMHhFQSwgMHhENiwgLyogMHhEOC0weERCICovCisJMHhFQSwgMHhENywgMHhDNiwgMHhEOCwgMHg5NSwgMHhFNSwgMHg5NSwgMHhFNiwgLyogMHhEQy0weERGICovCisJMHg5NSwgMHhFNywgMHg5NSwgMHhFOCwgMHg5NSwgMHhFOSwgMHg5NSwgMHhFQSwgLyogMHhFMC0weEUzICovCisJMHg5NSwgMHhFQiwgMHg5NSwgMHhFQywgMHhFQSwgMHhEOCwgMHg5NSwgMHhFRCwgLyogMHhFNC0weEU3ICovCisJMHg5NSwgMHhFRSwgMHhFQSwgMHhEOSwgMHg5NSwgMHhFRiwgMHg5NSwgMHhGMCwgLyogMHhFOC0weEVCICovCisJMHg5NSwgMHhGMSwgMHg5NSwgMHhGMiwgMHg5NSwgMHhGMywgMHg5NSwgMHhGNCwgLyogMHhFQy0weEVGICovCisJMHhENCwgMHhCQiwgMHg5NSwgMHhGNSwgMHhDNywgMHhGQSwgMHhEMiwgMHhCNywgLyogMHhGMC0weEYzICovCisJMHhCOCwgMHhGQywgMHg5NSwgMHhGNiwgMHg5NSwgMHhGNywgMHhFQSwgMHhDMiwgLyogMHhGNC0weEY3ICovCisJMHg5NSwgMHhGOCwgMHhCMiwgMHhEQywgMHg5NSwgMHhGOSwgMHg5NSwgMHhGQSwgLyogMHhGOC0weEZCICovCisJMHhDMiwgMHhGQywgMHg5NSwgMHhGQiwgMHhENCwgMHhGOCwgMHhDQywgMHhFNiwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNjdbNTEyXSA9IHsKKwkweEQ3LCAweEVFLCAweDk1LCAweEZDLCAweDk1LCAweEZELCAweDk1LCAweEZFLCAvKiAweDAwLTB4MDMgKi8KKwkweDk2LCAweDQwLCAweDk2LCAweDQxLCAweDk2LCAweDQyLCAweDk2LCAweDQzLCAvKiAweDA0LTB4MDcgKi8KKwkweEQ0LCAweEMyLCAweEQzLCAweEQwLCAweEVCLCAweEMzLCAweEM1LCAweEYzLCAvKiAweDA4LTB4MEIgKi8KKwkweDk2LCAweDQ0LCAweEI3LCAweEZFLCAweDk2LCAweDQ1LCAweDk2LCAweDQ2LCAvKiAweDBDLTB4MEYgKi8KKwkweEVCLCAweEQ0LCAweDk2LCAweDQ3LCAweDk2LCAweDQ4LCAweDk2LCAweDQ5LCAvKiAweDEwLTB4MTMgKi8KKwkweENCLCAweEI3LCAweEVCLCAweERFLCAweDk2LCAweDRBLCAweEMwLCAweENBLCAvKiAweDE0LTB4MTcgKi8KKwkweDk2LCAweDRCLCAweDk2LCAweDRDLCAweDk2LCAweDRELCAweENELCAweEZCLCAvKiAweDE4LTB4MUIgKi8KKwkweDk2LCAweDRFLCAweEIzLCAweEFGLCAweDk2LCAweDRGLCAweEM2LCAweERBLCAvKiAweDFDLTB4MUYgKi8KKwkweDk2LCAweDUwLCAweDk2LCAweDUxLCAweDk2LCAweDUyLCAweDk2LCAweDUzLCAvKiAweDIwLTB4MjMgKi8KKwkweDk2LCAweDU0LCAweDk2LCAweDU1LCAweEVCLCAweEZDLCAweDk2LCAweDU2LCAvKiAweDI0LTB4MjcgKi8KKwkweEM0LCAweEJFLCAweDk2LCAweDU3LCAweENFLCAweEI0LCAweEM0LCAweEE5LCAvKiAweDI4LTB4MkIgKi8KKwkweEIxLCAweEJFLCAweEQ0LCAweEZELCAweDk2LCAweDU4LCAweENBLCAweEY1LCAvKiAweDJDLTB4MkYgKi8KKwkweDk2LCAweDU5LCAweEQ2LCAweEVDLCAweDk2LCAweDVBLCAweDk2LCAweDVCLCAvKiAweDMwLTB4MzMgKi8KKwkweEM2LCAweEQzLCAweEI2LCAweEU0LCAweDk2LCAweDVDLCAweDk2LCAweDVELCAvKiAweDM0LTB4MzcgKi8KKwkweDk2LCAweDVFLCAweDk2LCAweDVGLCAweEJCLCAweEZBLCAweDk2LCAweDYwLCAvKiAweDM4LTB4M0IgKi8KKwkweDk2LCAweDYxLCAweEQwLCAweEUwLCAweDk2LCAweDYyLCAweDk2LCAweDYzLCAvKiAweDNDLTB4M0YgKi8KKwkweEM5LCAweEIxLCAweDk2LCAweDY0LCAweEQ0LCAweEQzLCAweEM4LCAweEE4LCAvKiAweDQwLTB4NDMgKi8KKwkweDk2LCAweDY1LCAweDk2LCAweDY2LCAweEI4LCAweENCLCAweDk2LCAweDY3LCAvKiAweDQ0LTB4NDcgKi8KKwkweEU4LCAweEJFLCAweEM5LCAweEJDLCAweDk2LCAweDY4LCAweDk2LCAweDY5LCAvKiAweDQ4LTB4NEIgKi8KKwkweEU4LCAweEJCLCAweDk2LCAweDZBLCAweEMwLCAweEVFLCAweEQwLCAweEQzLCAvKiAweDRDLTB4NEYgKi8KKwkweEIyLCAweEM0LCAweEI0LCAweEU1LCAweDk2LCAweDZCLCAweEU4LCAweEJDLCAvKiAweDUwLTB4NTMgKi8KKwkweDk2LCAweDZDLCAweDk2LCAweDZELCAweEQ1LCAweEM4LCAweDk2LCAweDZFLCAvKiAweDU0LTB4NTcgKi8KKwkweDk2LCAweDZGLCAweDk2LCAweDcwLCAweDk2LCAweDcxLCAweDk2LCAweDcyLCAvKiAweDU4LTB4NUIgKi8KKwkweEI2LCAweEM1LCAweDk2LCAweDczLCAweEU4LCAweEJELCAweENBLCAweEY4LCAvKiAweDVDLTB4NUYgKi8KKwkweEI4LCAweERDLCAweENDLCAweEY1LCAweDk2LCAweDc0LCAweDk2LCAweDc1LCAvKiAweDYwLTB4NjMgKi8KKwkweDk2LCAweDc2LCAweEMwLCAweEI0LCAweDk2LCAweDc3LCAweDk2LCAweDc4LCAvKiAweDY0LTB4NjcgKi8KKwkweEQxLCAweEVFLCAweEU4LCAweEJGLCAweEU4LCAweEMyLCAweDk2LCAweDc5LCAvKiAweDY4LTB4NkIgKi8KKwkweDk2LCAweDdBLCAweEJBLCAweEJDLCAweDk2LCAweDdCLCAweEIxLCAweEFELCAvKiAweDZDLTB4NkYgKi8KKwkweEJELCAweERDLCAweDk2LCAweDdDLCAweEVBLCAweEJELCAweEU4LCAweEMzLCAvKiAweDcwLTB4NzMgKi8KKwkweDk2LCAweDdELCAweEU4LCAweEM2LCAweDk2LCAweDdFLCAweEU4LCAweENCLCAvKiAweDc0LTB4NzcgKi8KKwkweDk2LCAweDgwLCAweDk2LCAweDgxLCAweDk2LCAweDgyLCAweDk2LCAweDgzLCAvKiAweDc4LTB4N0IgKi8KKwkweEU4LCAweENDLCAweDk2LCAweDg0LCAweENCLCAweEM5LCAweEIwLCAweEU1LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDk2LCAweDg1LCAweEJDLCAweEFCLCAweDk2LCAweDg2LCAweDk2LCAweDg3LCAvKiAweDgwLTB4ODMgKi8KKwkweEI5LCAweEI5LCAweDk2LCAweDg4LCAweDk2LCAweDg5LCAweEU4LCAweEMxLCAvKiAweDg0LTB4ODcgKi8KKwkweDk2LCAweDhBLCAweENELCAweEY3LCAweDk2LCAweDhCLCAweEU4LCAweENBLCAvKiAweDg4LTB4OEIgKi8KKwkweDk2LCAweDhDLCAweDk2LCAweDhELCAweDk2LCAweDhFLCAweDk2LCAweDhGLCAvKiAweDhDLTB4OEYgKi8KKwkweENFLCAweEY2LCAweDk2LCAweDkwLCAweDk2LCAweDkxLCAweDk2LCAweDkyLCAvKiAweDkwLTB4OTMgKi8KKwkweDk2LCAweDkzLCAweEQ1LCAweEVELCAweDk2LCAweDk0LCAweEMxLCAweEQ2LCAvKiAweDk0LTB4OTcgKi8KKwkweEU4LCAweEM0LCAweDk2LCAweDk1LCAweEMzLCAweEI2LCAweDk2LCAweDk2LCAvKiAweDk4LTB4OUIgKi8KKwkweEI5LCAweEZCLCAweEQ2LCAweEE2LCAweEU4LCAweEM4LCAweDk2LCAweDk3LCAvKiAweDlDLTB4OUYgKi8KKwkweDk2LCAweDk4LCAweDk2LCAweDk5LCAweENBLCAweEUwLCAweEQ0LCAweEU2LCAvKiAweEEwLTB4QTMgKi8KKwkweDk2LCAweDlBLCAweEU4LCAweEMwLCAweDk2LCAweDlCLCAweEU4LCAweEM1LCAvKiAweEE0LTB4QTcgKi8KKwkweEU4LCAweEM3LCAweDk2LCAweDlDLCAweEM3LCAweEI5LCAweEI3LCAweEUzLCAvKiAweEE4LTB4QUIgKi8KKwkweDk2LCAweDlELCAweEU4LCAweEM5LCAweDk2LCAweDlFLCAweEJGLCAweERELCAvKiAweEFDLTB4QUYgKi8KKwkweEU4LCAweEQyLCAweDk2LCAweDlGLCAweDk2LCAweEEwLCAweEU4LCAweEQ3LCAvKiAweEIwLTB4QjMgKi8KKwkweDk2LCAweEExLCAweEU4LCAweEQ1LCAweEJDLCAweERDLCAweEJDLCAweENGLCAvKiAweEI0LTB4QjcgKi8KKwkweEU4LCAweERCLCAweDk2LCAweEEyLCAweDk2LCAweEEzLCAweDk2LCAweEE0LCAvKiAweEI4LTB4QkIgKi8KKwkweDk2LCAweEE1LCAweDk2LCAweEE2LCAweDk2LCAweEE3LCAweDk2LCAweEE4LCAvKiAweEJDLTB4QkYgKi8KKwkweDk2LCAweEE5LCAweEU4LCAweERFLCAweDk2LCAweEFBLCAweEU4LCAweERBLCAvKiAweEMwLTB4QzMgKi8KKwkweEIxLCAweEZBLCAweDk2LCAweEFCLCAweDk2LCAweEFDLCAweDk2LCAweEFELCAvKiAweEM0LTB4QzcgKi8KKwkweDk2LCAweEFFLCAweDk2LCAweEFGLCAweDk2LCAweEIwLCAweDk2LCAweEIxLCAvKiAweEM4LTB4Q0IgKi8KKwkweDk2LCAweEIyLCAweDk2LCAweEIzLCAweDk2LCAweEI0LCAweEIwLCAweEQ4LCAvKiAweENDLTB4Q0YgKi8KKwkweEM0LCAweEIzLCAweEI4LCAweENDLCAweEM2LCAweEUyLCAweEM4LCAweEJFLCAvKiAweEQwLTB4RDMgKi8KKwkweEM4LCAweEUxLCAweDk2LCAweEI1LCAweDk2LCAweEI2LCAweDk2LCAweEI3LCAvKiAweEQ0LTB4RDcgKi8KKwkweEU4LCAweENGLCAweEU4LCAweEQ0LCAweEU4LCAweEQ2LCAweDk2LCAweEI4LCAvKiAweEQ4LTB4REIgKi8KKwkweEI5LCAweEYxLCAweEU4LCAweEQ4LCAweEQ3LCAweEY1LCAweDk2LCAweEI5LCAvKiAweERDLTB4REYgKi8KKwkweEM0LCAweEZCLCAweDk2LCAweEJBLCAweEU4LCAweERDLCAweDk2LCAweEJCLCAvKiAweEUwLTB4RTMgKi8KKwkweDk2LCAweEJDLCAweEIyLCAweEU5LCAweDk2LCAweEJELCAweDk2LCAweEJFLCAvKiAweEU0LTB4RTcgKi8KKwkweDk2LCAweEJGLCAweEU4LCAweEQxLCAweDk2LCAweEMwLCAweDk2LCAweEMxLCAvKiAweEU4LTB4RUIgKi8KKwkweEJDLCAweEVELCAweDk2LCAweEMyLCAweDk2LCAweEMzLCAweEJGLCAweEMyLCAvKiAweEVDLTB4RUYgKi8KKwkweEU4LCAweENELCAweEQ2LCAweEY5LCAweDk2LCAweEM0LCAweEMxLCAweEY4LCAvKiAweEYwLTB4RjMgKi8KKwkweEIyLCAweEYxLCAweDk2LCAweEM1LCAweDk2LCAweEM2LCAweDk2LCAweEM3LCAvKiAweEY0LTB4RjcgKi8KKwkweDk2LCAweEM4LCAweDk2LCAweEM5LCAweDk2LCAweENBLCAweDk2LCAweENCLCAvKiAweEY4LTB4RkIgKi8KKwkweDk2LCAweENDLCAweEU4LCAweERGLCAweDk2LCAweENELCAweENBLCAweEMxLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182OFs1MTJdID0geworCTB4RTgsIDB4RDksIDB4OTYsIDB4Q0UsIDB4OTYsIDB4Q0YsIDB4OTYsIDB4RDAsIC8qIDB4MDAtMHgwMyAqLworCTB4OTYsIDB4RDEsIDB4RDUsIDB4QTQsIDB4OTYsIDB4RDIsIDB4QjEsIDB4RUEsIC8qIDB4MDQtMHgwNyAqLworCTB4RDUsIDB4QkIsIDB4RTgsIDB4Q0UsIDB4RTgsIDB4RDAsIDB4QjYsIDB4QjAsIC8qIDB4MDgtMHgwQiAqLworCTB4RTgsIDB4RDMsIDB4OTYsIDB4RDMsIDB4RTgsIDB4REQsIDB4QzAsIDB4QjgsIC8qIDB4MEMtMHgwRiAqLworCTB4OTYsIDB4RDQsIDB4Q0EsIDB4RjcsIDB4OTYsIDB4RDUsIDB4Q0IsIDB4QTgsIC8qIDB4MTAtMHgxMyAqLworCTB4OTYsIDB4RDYsIDB4OTYsIDB4RDcsIDB4QzYsIDB4REMsIDB4QzAsIDB4RjUsIC8qIDB4MTQtMHgxNyAqLworCTB4OTYsIDB4RDgsIDB4OTYsIDB4RDksIDB4OTYsIDB4REEsIDB4OTYsIDB4REIsIC8qIDB4MTgtMHgxQiAqLworCTB4OTYsIDB4REMsIDB4RTgsIDB4RTksIDB4OTYsIDB4REQsIDB4OTYsIDB4REUsIC8qIDB4MUMtMHgxRiAqLworCTB4OTYsIDB4REYsIDB4RDAsIDB4QTMsIDB4OTYsIDB4RTAsIDB4OTYsIDB4RTEsIC8qIDB4MjAtMHgyMyAqLworCTB4OTYsIDB4RTIsIDB4OTYsIDB4RTMsIDB4OTYsIDB4RTQsIDB4OTYsIDB4RTUsIC8qIDB4MjQtMHgyNyAqLworCTB4OTYsIDB4RTYsIDB4RTgsIDB4RjIsIDB4RDYsIDB4RUEsIDB4OTYsIDB4RTcsIC8qIDB4MjgtMHgyQiAqLworCTB4OTYsIDB4RTgsIDB4OTYsIDB4RTksIDB4OTYsIDB4RUEsIDB4OTYsIDB4RUIsIC8qIDB4MkMtMHgyRiAqLworCTB4OTYsIDB4RUMsIDB4OTYsIDB4RUQsIDB4RTgsIDB4RTAsIDB4RTgsIDB4RTEsIC8qIDB4MzAtMHgzMyAqLworCTB4OTYsIDB4RUUsIDB4OTYsIDB4RUYsIDB4OTYsIDB4RjAsIDB4RDEsIDB4RjksIC8qIDB4MzQtMHgzNyAqLworCTB4QkEsIDB4Q0IsIDB4QjgsIDB4RjksIDB4OTYsIDB4RjEsIDB4OTYsIDB4RjIsIC8qIDB4MzgtMHgzQiAqLworCTB4QjgsIDB4RjEsIDB4RDQsIDB4RDQsIDB4RTgsIDB4RUYsIDB4OTYsIDB4RjMsIC8qIDB4M0MtMHgzRiAqLworCTB4RTgsIDB4RUUsIDB4RTgsIDB4RUMsIDB4QjksIDB4RjAsIDB4Q0MsIDB4RDIsIC8qIDB4NDAtMHg0MyAqLworCTB4RTgsIDB4RTYsIDB4Q0UsIDB4QTYsIDB4QkYsIDB4RjIsIDB4OTYsIDB4RjQsIC8qIDB4NDQtMHg0NyAqLworCTB4QjAsIDB4QjgsIDB4RTgsIDB4RjEsIDB4RTgsIDB4RjAsIDB4OTYsIDB4RjUsIC8qIDB4NDgtMHg0QiAqLworCTB4RDcsIDB4QzAsIDB4OTYsIDB4RjYsIDB4RTgsIDB4RTQsIDB4OTYsIDB4RjcsIC8qIDB4NEMtMHg0RiAqLworCTB4Q0QsIDB4QTksIDB4QzksIDB4QTMsIDB4OTYsIDB4RjgsIDB4QkIsIDB4QjgsIC8qIDB4NTAtMHg1MyAqLworCTB4QkQsIDB4REIsIDB4RTgsIDB4RUEsIDB4OTYsIDB4RjksIDB4OTYsIDB4RkEsIC8qIDB4NTQtMHg1NyAqLworCTB4OTYsIDB4RkIsIDB4OTYsIDB4RkMsIDB4OTYsIDB4RkQsIDB4OTYsIDB4RkUsIC8qIDB4NTgtMHg1QiAqLworCTB4OTcsIDB4NDAsIDB4OTcsIDB4NDEsIDB4OTcsIDB4NDIsIDB4OTcsIDB4NDMsIC8qIDB4NUMtMHg1RiAqLworCTB4RTgsIDB4RTIsIDB4RTgsIDB4RTMsIDB4RTgsIDB4RTUsIDB4QjUsIDB4QjUsIC8qIDB4NjAtMHg2MyAqLworCTB4RTgsIDB4RTcsIDB4QzcsIDB4QzUsIDB4RTgsIDB4RUIsIDB4RTgsIDB4RUQsIC8qIDB4NjQtMHg2NyAqLworCTB4QkQsIDB4QjAsIDB4RDcsIDB4QUUsIDB4OTcsIDB4NDQsIDB4RTgsIDB4RjgsIC8qIDB4NjgtMHg2QiAqLworCTB4OTcsIDB4NDUsIDB4OTcsIDB4NDYsIDB4OTcsIDB4NDcsIDB4OTcsIDB4NDgsIC8qIDB4NkMtMHg2RiAqLworCTB4OTcsIDB4NDksIDB4OTcsIDB4NEEsIDB4OTcsIDB4NEIsIDB4OTcsIDB4NEMsIC8qIDB4NzAtMHg3MyAqLworCTB4RTgsIDB4RjUsIDB4OTcsIDB4NEQsIDB4Q0QsIDB4QjAsIDB4RTgsIDB4RjYsIC8qIDB4NzQtMHg3NyAqLworCTB4OTcsIDB4NEUsIDB4OTcsIDB4NEYsIDB4OTcsIDB4NTAsIDB4OTcsIDB4NTEsIC8qIDB4NzgtMHg3QiAqLworCTB4OTcsIDB4NTIsIDB4OTcsIDB4NTMsIDB4OTcsIDB4NTQsIDB4OTcsIDB4NTUsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4OTcsIDB4NTYsIDB4QzEsIDB4QkEsIDB4OTcsIDB4NTcsIDB4RTgsIDB4RTgsIC8qIDB4ODAtMHg4MyAqLworCTB4OTcsIDB4NTgsIDB4QzMsIDB4QjcsIDB4QjAsIDB4RjAsIDB4OTcsIDB4NTksIC8qIDB4ODQtMHg4NyAqLworCTB4OTcsIDB4NUEsIDB4OTcsIDB4NUIsIDB4OTcsIDB4NUMsIDB4OTcsIDB4NUQsIC8qIDB4ODgtMHg4QiAqLworCTB4OTcsIDB4NUUsIDB4OTcsIDB4NUYsIDB4OTcsIDB4NjAsIDB4RTgsIDB4RjQsIC8qIDB4OEMtMHg4RiAqLworCTB4OTcsIDB4NjEsIDB4OTcsIDB4NjIsIDB4OTcsIDB4NjMsIDB4RTgsIDB4RjcsIC8qIDB4OTAtMHg5MyAqLworCTB4OTcsIDB4NjQsIDB4OTcsIDB4NjUsIDB4OTcsIDB4NjYsIDB4QjksIDB4QTMsIC8qIDB4OTQtMHg5NyAqLworCTB4OTcsIDB4NjcsIDB4OTcsIDB4NjgsIDB4OTcsIDB4NjksIDB4OTcsIDB4NkEsIC8qIDB4OTgtMHg5QiAqLworCTB4OTcsIDB4NkIsIDB4OTcsIDB4NkMsIDB4OTcsIDB4NkQsIDB4OTcsIDB4NkUsIC8qIDB4OUMtMHg5RiAqLworCTB4OTcsIDB4NkYsIDB4OTcsIDB4NzAsIDB4QzksIDB4RDIsIDB4OTcsIDB4NzEsIC8qIDB4QTAtMHhBMyAqLworCTB4OTcsIDB4NzIsIDB4OTcsIDB4NzMsIDB4QzMsIDB4Q0UsIDB4Q0UsIDB4RTAsIC8qIDB4QTQtMHhBNyAqLworCTB4QzAsIDB4RTYsIDB4OTcsIDB4NzQsIDB4OTcsIDB4NzUsIDB4OTcsIDB4NzYsIC8qIDB4QTgtMHhBQiAqLworCTB4OTcsIDB4NzcsIDB4Q0IsIDB4RjMsIDB4OTcsIDB4NzgsIDB4Q0MsIDB4REQsIC8qIDB4QUMtMHhBRiAqLworCTB4RDAsIDB4QjUsIDB4OTcsIDB4NzksIDB4OTcsIDB4N0EsIDB4Q0EsIDB4RTEsIC8qIDB4QjAtMHhCMyAqLworCTB4OTcsIDB4N0IsIDB4RTgsIDB4RjMsIDB4OTcsIDB4N0MsIDB4OTcsIDB4N0QsIC8qIDB4QjQtMHhCNyAqLworCTB4OTcsIDB4N0UsIDB4OTcsIDB4ODAsIDB4OTcsIDB4ODEsIDB4OTcsIDB4ODIsIC8qIDB4QjgtMHhCQiAqLworCTB4OTcsIDB4ODMsIDB4OTcsIDB4ODQsIDB4OTcsIDB4ODUsIDB4OTcsIDB4ODYsIC8qIDB4QkMtMHhCRiAqLworCTB4QkMsIDB4RUMsIDB4OTcsIDB4ODcsIDB4RTgsIDB4RjksIDB4OTcsIDB4ODgsIC8qIDB4QzAtMHhDMyAqLworCTB4OTcsIDB4ODksIDB4OTcsIDB4OEEsIDB4OTcsIDB4OEIsIDB4OTcsIDB4OEMsIC8qIDB4QzQtMHhDNyAqLworCTB4OTcsIDB4OEQsIDB4QzMsIDB4REUsIDB4OTcsIDB4OEUsIDB4QzYsIDB4RTUsIC8qIDB4QzgtMHhDQiAqLworCTB4OTcsIDB4OEYsIDB4QjksIDB4RjcsIDB4OTcsIDB4OTAsIDB4OTcsIDB4OTEsIC8qIDB4Q0MtMHhDRiAqLworCTB4OTcsIDB4OTIsIDB4OTcsIDB4OTMsIDB4QjAsIDB4RjQsIDB4OTcsIDB4OTQsIC8qIDB4RDAtMHhEMyAqLworCTB4OTcsIDB4OTUsIDB4RDcsIDB4RDgsIDB4OTcsIDB4OTYsIDB4OTcsIDB4OTcsIC8qIDB4RDQtMHhENyAqLworCTB4QkMsIDB4QUMsIDB4OTcsIDB4OTgsIDB4QzUsIDB4RUYsIDB4OTcsIDB4OTksIC8qIDB4RDgtMHhEQiAqLworCTB4OTcsIDB4OUEsIDB4OTcsIDB4OUIsIDB4OTcsIDB4OUMsIDB4OTcsIDB4OUQsIC8qIDB4REMtMHhERiAqLworCTB4Q0MsIDB4QzQsIDB4OTcsIDB4OUUsIDB4OTcsIDB4OUYsIDB4RTksIDB4QTYsIC8qIDB4RTAtMHhFMyAqLworCTB4OTcsIDB4QTAsIDB4OTcsIDB4QTEsIDB4OTcsIDB4QTIsIDB4OTcsIDB4QTMsIC8qIDB4RTQtMHhFNyAqLworCTB4OTcsIDB4QTQsIDB4OTcsIDB4QTUsIDB4OTcsIDB4QTYsIDB4OTcsIDB4QTcsIC8qIDB4RTgtMHhFQiAqLworCTB4OTcsIDB4QTgsIDB4OTcsIDB4QTksIDB4QzksIDB4QUQsIDB4OTcsIDB4QUEsIC8qIDB4RUMtMHhFRiAqLworCTB4RTksIDB4QTIsIDB4QzAsIDB4RTIsIDB4OTcsIDB4QUIsIDB4OTcsIDB4QUMsIC8qIDB4RjAtMHhGMyAqLworCTB4OTcsIDB4QUQsIDB4QkYsIDB4QzMsIDB4OTcsIDB4QUUsIDB4OTcsIDB4QUYsIC8qIDB4RjQtMHhGNyAqLworCTB4OTcsIDB4QjAsIDB4RTgsIDB4RkUsIDB4QjksIDB4RDcsIDB4OTcsIDB4QjEsIC8qIDB4RjgtMHhGQiAqLworCTB4RTgsIDB4RkIsIDB4OTcsIDB4QjIsIDB4OTcsIDB4QjMsIDB4OTcsIDB4QjQsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzY5WzUxMl0gPSB7CisJMHg5NywgMHhCNSwgMHhFOSwgMHhBNCwgMHg5NywgMHhCNiwgMHg5NywgMHhCNywgLyogMHgwMC0weDAzICovCisJMHg5NywgMHhCOCwgMHhEMiwgMHhDRSwgMHg5NywgMHhCOSwgMHg5NywgMHhCQSwgLyogMHgwNC0weDA3ICovCisJMHg5NywgMHhCQiwgMHg5NywgMHhCQywgMHg5NywgMHhCRCwgMHhFOSwgMHhBMywgLyogMHgwOC0weDBCICovCisJMHg5NywgMHhCRSwgMHhENiwgMHhCMiwgMHhENywgMHhCNSwgMHg5NywgMHhCRiwgLyogMHgwQy0weDBGICovCisJMHhFOSwgMHhBNywgMHg5NywgMHhDMCwgMHhCRCwgMHhCNywgMHg5NywgMHhDMSwgLyogMHgxMC0weDEzICovCisJMHg5NywgMHhDMiwgMHg5NywgMHhDMywgMHg5NywgMHhDNCwgMHg5NywgMHhDNSwgLyogMHgxNC0weDE3ICovCisJMHg5NywgMHhDNiwgMHg5NywgMHhDNywgMHg5NywgMHhDOCwgMHg5NywgMHhDOSwgLyogMHgxOC0weDFCICovCisJMHg5NywgMHhDQSwgMHg5NywgMHhDQiwgMHg5NywgMHhDQywgMHhFOCwgMHhGQywgLyogMHgxQy0weDFGICovCisJMHhFOCwgMHhGRCwgMHg5NywgMHhDRCwgMHg5NywgMHhDRSwgMHg5NywgMHhDRiwgLyogMHgyMC0weDIzICovCisJMHhFOSwgMHhBMSwgMHg5NywgMHhEMCwgMHg5NywgMHhEMSwgMHg5NywgMHhEMiwgLyogMHgyNC0weDI3ICovCisJMHg5NywgMHhEMywgMHg5NywgMHhENCwgMHg5NywgMHhENSwgMHg5NywgMHhENiwgLyogMHgyOC0weDJCICovCisJMHg5NywgMHhENywgMHhDRCwgMHhENiwgMHg5NywgMHhEOCwgMHg5NywgMHhEOSwgLyogMHgyQy0weDJGICovCisJMHhEMiwgMHhBQywgMHg5NywgMHhEQSwgMHg5NywgMHhEQiwgMHg5NywgMHhEQywgLyogMHgzMC0weDMzICovCisJMHhFOSwgMHhCMiwgMHg5NywgMHhERCwgMHg5NywgMHhERSwgMHg5NywgMHhERiwgLyogMHgzNC0weDM3ICovCisJMHg5NywgMHhFMCwgMHhFOSwgMHhBOSwgMHg5NywgMHhFMSwgMHg5NywgMHhFMiwgLyogMHgzOC0weDNCICovCisJMHg5NywgMHhFMywgMHhCNCwgMHhBQSwgMHg5NywgMHhFNCwgMHhCNCwgMHhCQiwgLyogMHgzQy0weDNGICovCisJMHg5NywgMHhFNSwgMHg5NywgMHhFNiwgMHhFOSwgMHhBQiwgMHg5NywgMHhFNywgLyogMHg0MC0weDQzICovCisJMHg5NywgMHhFOCwgMHg5NywgMHhFOSwgMHg5NywgMHhFQSwgMHg5NywgMHhFQiwgLyogMHg0NC0weDQ3ICovCisJMHg5NywgMHhFQywgMHg5NywgMHhFRCwgMHg5NywgMHhFRSwgMHg5NywgMHhFRiwgLyogMHg0OC0weDRCICovCisJMHg5NywgMHhGMCwgMHg5NywgMHhGMSwgMHg5NywgMHhGMiwgMHg5NywgMHhGMywgLyogMHg0Qy0weDRGICovCisJMHg5NywgMHhGNCwgMHg5NywgMHhGNSwgMHg5NywgMHhGNiwgMHg5NywgMHhGNywgLyogMHg1MC0weDUzICovCisJMHhEMCwgMHhBOCwgMHg5NywgMHhGOCwgMHg5NywgMHhGOSwgMHhFOSwgMHhBNSwgLyogMHg1NC0weDU3ICovCisJMHg5NywgMHhGQSwgMHg5NywgMHhGQiwgMHhCMywgMHhGRSwgMHg5NywgMHhGQywgLyogMHg1OC0weDVCICovCisJMHg5NywgMHhGRCwgMHhFOSwgMHhBQywgMHhDMCwgMHhFMywgMHg5NywgMHhGRSwgLyogMHg1Qy0weDVGICovCisJMHhFOSwgMHhBQSwgMHg5OCwgMHg0MCwgMHg5OCwgMHg0MSwgMHhFOSwgMHhCOSwgLyogMHg2MC0weDYzICovCisJMHg5OCwgMHg0MiwgMHg5OCwgMHg0MywgMHhFOSwgMHhCOCwgMHg5OCwgMHg0NCwgLyogMHg2NC0weDY3ICovCisJMHg5OCwgMHg0NSwgMHg5OCwgMHg0NiwgMHg5OCwgMHg0NywgMHhFOSwgMHhBRSwgLyogMHg2OC0weDZCICovCisJMHg5OCwgMHg0OCwgMHg5OCwgMHg0OSwgMHhFOCwgMHhGQSwgMHg5OCwgMHg0QSwgLyogMHg2Qy0weDZGICovCisJMHg5OCwgMHg0QiwgMHhFOSwgMHhBOCwgMHg5OCwgMHg0QywgMHg5OCwgMHg0RCwgLyogMHg3MC0weDczICovCisJMHg5OCwgMHg0RSwgMHg5OCwgMHg0RiwgMHg5OCwgMHg1MCwgMHhCRiwgMHhBQywgLyogMHg3NC0weDc3ICovCisJMHhFOSwgMHhCMSwgMHhFOSwgMHhCQSwgMHg5OCwgMHg1MSwgMHg5OCwgMHg1MiwgLyogMHg3OC0weDdCICovCisJMHhDMiwgMHhBNSwgMHg5OCwgMHg1MywgMHg5OCwgMHg1NCwgMHg5OCwgMHg1NSwgLyogMHg3Qy0weDdGICovCisJCisJMHhFOSwgMHhBRiwgMHg5OCwgMHg1NiwgMHhCOCwgMHhDNSwgMHg5OCwgMHg1NywgLyogMHg4MC0weDgzICovCisJMHhFOSwgMHhBRCwgMHg5OCwgMHg1OCwgMHhEMywgMHhEQywgMHhFOSwgMHhCNCwgLyogMHg4NC0weDg3ICovCisJMHhFOSwgMHhCNSwgMHhFOSwgMHhCNywgMHg5OCwgMHg1OSwgMHg5OCwgMHg1QSwgLyogMHg4OC0weDhCICovCisJMHg5OCwgMHg1QiwgMHhFOSwgMHhDNywgMHg5OCwgMHg1QywgMHg5OCwgMHg1RCwgLyogMHg4Qy0weDhGICovCisJMHg5OCwgMHg1RSwgMHg5OCwgMHg1RiwgMHg5OCwgMHg2MCwgMHg5OCwgMHg2MSwgLyogMHg5MC0weDkzICovCisJMHhDMCwgMHhDNiwgMHhFOSwgMHhDNSwgMHg5OCwgMHg2MiwgMHg5OCwgMHg2MywgLyogMHg5NC0weDk3ICovCisJMHhFOSwgMHhCMCwgMHg5OCwgMHg2NCwgMHg5OCwgMHg2NSwgMHhFOSwgMHhCQiwgLyogMHg5OC0weDlCICovCisJMHhCMCwgMHhGMSwgMHg5OCwgMHg2NiwgMHg5OCwgMHg2NywgMHg5OCwgMHg2OCwgLyogMHg5Qy0weDlGICovCisJMHg5OCwgMHg2OSwgMHg5OCwgMHg2QSwgMHg5OCwgMHg2QiwgMHg5OCwgMHg2QywgLyogMHhBMC0weEEzICovCisJMHg5OCwgMHg2RCwgMHg5OCwgMHg2RSwgMHg5OCwgMHg2RiwgMHhFOSwgMHhCQywgLyogMHhBNC0weEE3ICovCisJMHhENSwgMHhBNSwgMHg5OCwgMHg3MCwgMHg5OCwgMHg3MSwgMHhFOSwgMHhCRSwgLyogMHhBOC0weEFCICovCisJMHg5OCwgMHg3MiwgMHhFOSwgMHhCRiwgMHg5OCwgMHg3MywgMHg5OCwgMHg3NCwgLyogMHhBQy0weEFGICovCisJMHg5OCwgMHg3NSwgMHhFOSwgMHhDMSwgMHg5OCwgMHg3NiwgMHg5OCwgMHg3NywgLyogMHhCMC0weEIzICovCisJMHhDMSwgMHhGMSwgMHg5OCwgMHg3OCwgMHg5OCwgMHg3OSwgMHhDOCwgMHhCNiwgLyogMHhCNC0weEI3ICovCisJMHg5OCwgMHg3QSwgMHg5OCwgMHg3QiwgMHg5OCwgMHg3QywgMHhFOSwgMHhCRCwgLyogMHhCOC0weEJCICovCisJMHg5OCwgMHg3RCwgMHg5OCwgMHg3RSwgMHg5OCwgMHg4MCwgMHg5OCwgMHg4MSwgLyogMHhCQy0weEJGICovCisJMHg5OCwgMHg4MiwgMHhFOSwgMHhDMiwgMHg5OCwgMHg4MywgMHg5OCwgMHg4NCwgLyogMHhDMC0weEMzICovCisJMHg5OCwgMHg4NSwgMHg5OCwgMHg4NiwgMHg5OCwgMHg4NywgMHg5OCwgMHg4OCwgLyogMHhDNC0weEM3ICovCisJMHg5OCwgMHg4OSwgMHg5OCwgMHg4QSwgMHhFOSwgMHhDMywgMHg5OCwgMHg4QiwgLyogMHhDOC0weENCICovCisJMHhFOSwgMHhCMywgMHg5OCwgMHg4QywgMHhFOSwgMHhCNiwgMHg5OCwgMHg4RCwgLyogMHhDQy0weENGICovCisJMHhCQiwgMHhCMSwgMHg5OCwgMHg4RSwgMHg5OCwgMHg4RiwgMHg5OCwgMHg5MCwgLyogMHhEMC0weEQzICovCisJMHhFOSwgMHhDMCwgMHg5OCwgMHg5MSwgMHg5OCwgMHg5MiwgMHg5OCwgMHg5MywgLyogMHhENC0weEQ3ICovCisJMHg5OCwgMHg5NCwgMHg5OCwgMHg5NSwgMHg5OCwgMHg5NiwgMHhCQywgMHhGNywgLyogMHhEOC0weERCICovCisJMHg5OCwgMHg5NywgMHg5OCwgMHg5OCwgMHg5OCwgMHg5OSwgMHhFOSwgMHhDNCwgLyogMHhEQy0weERGICovCisJMHhFOSwgMHhDNiwgMHg5OCwgMHg5QSwgMHg5OCwgMHg5QiwgMHg5OCwgMHg5QywgLyogMHhFMC0weEUzICovCisJMHg5OCwgMHg5RCwgMHg5OCwgMHg5RSwgMHg5OCwgMHg5RiwgMHg5OCwgMHhBMCwgLyogMHhFNC0weEU3ICovCisJMHg5OCwgMHhBMSwgMHg5OCwgMHhBMiwgMHg5OCwgMHhBMywgMHg5OCwgMHhBNCwgLyogMHhFOC0weEVCICovCisJMHg5OCwgMHhBNSwgMHhFOSwgMHhDQSwgMHg5OCwgMHhBNiwgMHg5OCwgMHhBNywgLyogMHhFQy0weEVGICovCisJMHg5OCwgMHhBOCwgMHg5OCwgMHhBOSwgMHhFOSwgMHhDRSwgMHg5OCwgMHhBQSwgLyogMHhGMC0weEYzICovCisJMHg5OCwgMHhBQiwgMHg5OCwgMHhBQywgMHg5OCwgMHhBRCwgMHg5OCwgMHhBRSwgLyogMHhGNC0weEY3ICovCisJMHg5OCwgMHhBRiwgMHg5OCwgMHhCMCwgMHg5OCwgMHhCMSwgMHg5OCwgMHhCMiwgLyogMHhGOC0weEZCICovCisJMHg5OCwgMHhCMywgMHhCMiwgMHhEQiwgMHg5OCwgMHhCNCwgMHhFOSwgMHhDOCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNkFbNTEyXSA9IHsKKwkweDk4LCAweEI1LCAweDk4LCAweEI2LCAweDk4LCAweEI3LCAweDk4LCAweEI4LCAvKiAweDAwLTB4MDMgKi8KKwkweDk4LCAweEI5LCAweDk4LCAweEJBLCAweDk4LCAweEJCLCAweDk4LCAweEJDLCAvKiAweDA0LTB4MDcgKi8KKwkweDk4LCAweEJELCAweDk4LCAweEJFLCAweEI3LCAweEFFLCAweDk4LCAweEJGLCAvKiAweDA4LTB4MEIgKi8KKwkweDk4LCAweEMwLCAweDk4LCAweEMxLCAweDk4LCAweEMyLCAweDk4LCAweEMzLCAvKiAweDBDLTB4MEYgKi8KKwkweDk4LCAweEM0LCAweDk4LCAweEM1LCAweDk4LCAweEM2LCAweDk4LCAweEM3LCAvKiAweDEwLTB4MTMgKi8KKwkweDk4LCAweEM4LCAweDk4LCAweEM5LCAweDk4LCAweENBLCAweEU5LCAweENCLCAvKiAweDE0LTB4MTcgKi8KKwkweEU5LCAweENDLCAweDk4LCAweENCLCAweDk4LCAweENDLCAweDk4LCAweENELCAvKiAweDE4LTB4MUIgKi8KKwkweDk4LCAweENFLCAweDk4LCAweENGLCAweDk4LCAweEQwLCAweEQ1LCAweEMxLCAvKiAweDFDLTB4MUYgKi8KKwkweDk4LCAweEQxLCAweEM0LCAweEEzLCAweDk4LCAweEQyLCAweDk4LCAweEQzLCAvKiAweDIwLTB4MjMgKi8KKwkweDk4LCAweEQ0LCAweDk4LCAweEQ1LCAweDk4LCAweEQ2LCAweDk4LCAweEQ3LCAvKiAweDI0LTB4MjcgKi8KKwkweEU5LCAweEQ4LCAweDk4LCAweEQ4LCAweEJBLCAweEUxLCAweDk4LCAweEQ5LCAvKiAweDI4LTB4MkIgKi8KKwkweDk4LCAweERBLCAweDk4LCAweERCLCAweDk4LCAweERDLCAweEU5LCAweEM5LCAvKiAweDJDLTB4MkYgKi8KKwkweDk4LCAweERELCAweEQzLCAweEEzLCAweDk4LCAweERFLCAweDk4LCAweERGLCAvKiAweDMwLTB4MzMgKi8KKwkweDk4LCAweEUwLCAweEU5LCAweEQ0LCAweDk4LCAweEUxLCAweDk4LCAweEUyLCAvKiAweDM0LTB4MzcgKi8KKwkweDk4LCAweEUzLCAweDk4LCAweEU0LCAweDk4LCAweEU1LCAweDk4LCAweEU2LCAvKiAweDM4LTB4M0IgKi8KKwkweDk4LCAweEU3LCAweEU5LCAweEQ3LCAweEU5LCAweEQwLCAweDk4LCAweEU4LCAvKiAweDNDLTB4M0YgKi8KKwkweDk4LCAweEU5LCAweDk4LCAweEVBLCAweDk4LCAweEVCLCAweDk4LCAweEVDLCAvKiAweDQwLTB4NDMgKi8KKwkweEU5LCAweENGLCAweDk4LCAweEVELCAweDk4LCAweEVFLCAweEM3LCAweEMxLCAvKiAweDQ0LTB4NDcgKi8KKwkweDk4LCAweEVGLCAweDk4LCAweEYwLCAweDk4LCAweEYxLCAweDk4LCAweEYyLCAvKiAweDQ4LTB4NEIgKi8KKwkweDk4LCAweEYzLCAweDk4LCAweEY0LCAweDk4LCAweEY1LCAweDk4LCAweEY2LCAvKiAweDRDLTB4NEYgKi8KKwkweEU5LCAweEQyLCAweDk4LCAweEY3LCAweDk4LCAweEY4LCAweDk4LCAweEY5LCAvKiAweDUwLTB4NTMgKi8KKwkweDk4LCAweEZBLCAweDk4LCAweEZCLCAweDk4LCAweEZDLCAweDk4LCAweEZELCAvKiAweDU0LTB4NTcgKi8KKwkweEU5LCAweEQ5LCAweEIzLCAweEM4LCAweDk4LCAweEZFLCAweEU5LCAweEQzLCAvKiAweDU4LTB4NUIgKi8KKwkweDk5LCAweDQwLCAweDk5LCAweDQxLCAweDk5LCAweDQyLCAweDk5LCAweDQzLCAvKiAweDVDLTB4NUYgKi8KKwkweDk5LCAweDQ0LCAweENGLCAweEYwLCAweDk5LCAweDQ1LCAweDk5LCAweDQ2LCAvKiAweDYwLTB4NjMgKi8KKwkweDk5LCAweDQ3LCAweEU5LCAweENELCAweDk5LCAweDQ4LCAweDk5LCAweDQ5LCAvKiAweDY0LTB4NjcgKi8KKwkweDk5LCAweDRBLCAweDk5LCAweDRCLCAweDk5LCAweDRDLCAweDk5LCAweDRELCAvKiAweDY4LTB4NkIgKi8KKwkweDk5LCAweDRFLCAweDk5LCAweDRGLCAweDk5LCAweDUwLCAweDk5LCAweDUxLCAvKiAweDZDLTB4NkYgKi8KKwkweDk5LCAweDUyLCAweEIzLCAweEY3LCAweDk5LCAweDUzLCAweDk5LCAweDU0LCAvKiAweDcwLTB4NzMgKi8KKwkweDk5LCAweDU1LCAweDk5LCAweDU2LCAweDk5LCAweDU3LCAweDk5LCAweDU4LCAvKiAweDc0LTB4NzcgKi8KKwkweDk5LCAweDU5LCAweEU5LCAweEQ2LCAweDk5LCAweDVBLCAweDk5LCAweDVCLCAvKiAweDc4LTB4N0IgKi8KKwkweEU5LCAweERBLCAweDk5LCAweDVDLCAweDk5LCAweDVELCAweDk5LCAweDVFLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweENDLCAweEI0LCAweDk5LCAweDVGLCAweDk5LCAweDYwLCAweDk5LCAweDYxLCAvKiAweDgwLTB4ODMgKi8KKwkweENGLCAweEFELCAweDk5LCAweDYyLCAweDk5LCAweDYzLCAweDk5LCAweDY0LCAvKiAweDg0LTB4ODcgKi8KKwkweDk5LCAweDY1LCAweDk5LCAweDY2LCAweDk5LCAweDY3LCAweDk5LCAweDY4LCAvKiAweDg4LTB4OEIgKi8KKwkweDk5LCAweDY5LCAweDk5LCAweDZBLCAweEU5LCAweEQ1LCAweDk5LCAweDZCLCAvKiAweDhDLTB4OEYgKi8KKwkweEU5LCAweERDLCAweEU5LCAweERCLCAweDk5LCAweDZDLCAweDk5LCAweDZELCAvKiAweDkwLTB4OTMgKi8KKwkweDk5LCAweDZFLCAweDk5LCAweDZGLCAweDk5LCAweDcwLCAweEU5LCAweERFLCAvKiAweDk0LTB4OTcgKi8KKwkweDk5LCAweDcxLCAweDk5LCAweDcyLCAweDk5LCAweDczLCAweDk5LCAweDc0LCAvKiAweDk4LTB4OUIgKi8KKwkweDk5LCAweDc1LCAweDk5LCAweDc2LCAweDk5LCAweDc3LCAweDk5LCAweDc4LCAvKiAweDlDLTB4OUYgKi8KKwkweEU5LCAweEQxLCAweDk5LCAweDc5LCAweDk5LCAweDdBLCAweDk5LCAweDdCLCAvKiAweEEwLTB4QTMgKi8KKwkweDk5LCAweDdDLCAweDk5LCAweDdELCAweDk5LCAweDdFLCAweDk5LCAweDgwLCAvKiAweEE0LTB4QTcgKi8KKwkweDk5LCAweDgxLCAweEU5LCAweERELCAweDk5LCAweDgyLCAweEU5LCAweERGLCAvKiAweEE4LTB4QUIgKi8KKwkweEMzLCAweENBLCAweDk5LCAweDgzLCAweDk5LCAweDg0LCAweDk5LCAweDg1LCAvKiAweEFDLTB4QUYgKi8KKwkweDk5LCAweDg2LCAweDk5LCAweDg3LCAweDk5LCAweDg4LCAweDk5LCAweDg5LCAvKiAweEIwLTB4QjMgKi8KKwkweDk5LCAweDhBLCAweDk5LCAweDhCLCAweDk5LCAweDhDLCAweDk5LCAweDhELCAvKiAweEI0LTB4QjcgKi8KKwkweDk5LCAweDhFLCAweDk5LCAweDhGLCAweDk5LCAweDkwLCAweDk5LCAweDkxLCAvKiAweEI4LTB4QkIgKi8KKwkweDk5LCAweDkyLCAweDk5LCAweDkzLCAweDk5LCAweDk0LCAweDk5LCAweDk1LCAvKiAweEJDLTB4QkYgKi8KKwkweDk5LCAweDk2LCAweDk5LCAweDk3LCAweDk5LCAweDk4LCAweDk5LCAweDk5LCAvKiAweEMwLTB4QzMgKi8KKwkweDk5LCAweDlBLCAweDk5LCAweDlCLCAweDk5LCAweDlDLCAweDk5LCAweDlELCAvKiAweEM0LTB4QzcgKi8KKwkweDk5LCAweDlFLCAweDk5LCAweDlGLCAweDk5LCAweEEwLCAweDk5LCAweEExLCAvKiAweEM4LTB4Q0IgKi8KKwkweDk5LCAweEEyLCAweDk5LCAweEEzLCAweDk5LCAweEE0LCAweDk5LCAweEE1LCAvKiAweENDLTB4Q0YgKi8KKwkweDk5LCAweEE2LCAweDk5LCAweEE3LCAweDk5LCAweEE4LCAweDk5LCAweEE5LCAvKiAweEQwLTB4RDMgKi8KKwkweDk5LCAweEFBLCAweDk5LCAweEFCLCAweDk5LCAweEFDLCAweDk5LCAweEFELCAvKiAweEQ0LTB4RDcgKi8KKwkweDk5LCAweEFFLCAweDk5LCAweEFGLCAweDk5LCAweEIwLCAweDk5LCAweEIxLCAvKiAweEQ4LTB4REIgKi8KKwkweDk5LCAweEIyLCAweDk5LCAweEIzLCAweDk5LCAweEI0LCAweDk5LCAweEI1LCAvKiAweERDLTB4REYgKi8KKwkweDk5LCAweEI2LCAweDk5LCAweEI3LCAweDk5LCAweEI4LCAweDk5LCAweEI5LCAvKiAweEUwLTB4RTMgKi8KKwkweDk5LCAweEJBLCAweDk5LCAweEJCLCAweDk5LCAweEJDLCAweDk5LCAweEJELCAvKiAweEU0LTB4RTcgKi8KKwkweDk5LCAweEJFLCAweDk5LCAweEJGLCAweDk5LCAweEMwLCAweDk5LCAweEMxLCAvKiAweEU4LTB4RUIgKi8KKwkweDk5LCAweEMyLCAweDk5LCAweEMzLCAweDk5LCAweEM0LCAweDk5LCAweEM1LCAvKiAweEVDLTB4RUYgKi8KKwkweDk5LCAweEM2LCAweDk5LCAweEM3LCAweDk5LCAweEM4LCAweDk5LCAweEM5LCAvKiAweEYwLTB4RjMgKi8KKwkweDk5LCAweENBLCAweDk5LCAweENCLCAweDk5LCAweENDLCAweDk5LCAweENELCAvKiAweEY0LTB4RjcgKi8KKwkweDk5LCAweENFLCAweDk5LCAweENGLCAweDk5LCAweEQwLCAweDk5LCAweEQxLCAvKiAweEY4LTB4RkIgKi8KKwkweDk5LCAweEQyLCAweDk5LCAweEQzLCAweDk5LCAweEQ0LCAweDk5LCAweEQ1LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182Qls1MTJdID0geworCTB4OTksIDB4RDYsIDB4OTksIDB4RDcsIDB4OTksIDB4RDgsIDB4OTksIDB4RDksIC8qIDB4MDAtMHgwMyAqLworCTB4OTksIDB4REEsIDB4OTksIDB4REIsIDB4OTksIDB4REMsIDB4OTksIDB4REQsIC8qIDB4MDQtMHgwNyAqLworCTB4OTksIDB4REUsIDB4OTksIDB4REYsIDB4OTksIDB4RTAsIDB4OTksIDB4RTEsIC8qIDB4MDgtMHgwQiAqLworCTB4OTksIDB4RTIsIDB4OTksIDB4RTMsIDB4OTksIDB4RTQsIDB4OTksIDB4RTUsIC8qIDB4MEMtMHgwRiAqLworCTB4OTksIDB4RTYsIDB4OTksIDB4RTcsIDB4OTksIDB4RTgsIDB4OTksIDB4RTksIC8qIDB4MTAtMHgxMyAqLworCTB4OTksIDB4RUEsIDB4OTksIDB4RUIsIDB4OTksIDB4RUMsIDB4OTksIDB4RUQsIC8qIDB4MTQtMHgxNyAqLworCTB4OTksIDB4RUUsIDB4OTksIDB4RUYsIDB4OTksIDB4RjAsIDB4OTksIDB4RjEsIC8qIDB4MTgtMHgxQiAqLworCTB4OTksIDB4RjIsIDB4OTksIDB4RjMsIDB4OTksIDB4RjQsIDB4OTksIDB4RjUsIC8qIDB4MUMtMHgxRiAqLworCTB4QzcsIDB4QjcsIDB4QjQsIDB4Q0UsIDB4QkIsIDB4QjYsIDB4RDAsIDB4QzAsIC8qIDB4MjAtMHgyMyAqLworCTB4RUMsIDB4QTMsIDB4OTksIDB4RjYsIDB4OTksIDB4RjcsIDB4QzUsIDB4QjcsIC8qIDB4MjQtMHgyNyAqLworCTB4OTksIDB4RjgsIDB4OTksIDB4RjksIDB4OTksIDB4RkEsIDB4OTksIDB4RkIsIC8qIDB4MjgtMHgyQiAqLworCTB4OTksIDB4RkMsIDB4OTksIDB4RkQsIDB4OTksIDB4RkUsIDB4OUEsIDB4NDAsIC8qIDB4MkMtMHgyRiAqLworCTB4OUEsIDB4NDEsIDB4OUEsIDB4NDIsIDB4RDMsIDB4RkIsIDB4OUEsIDB4NDMsIC8qIDB4MzAtMHgzMyAqLworCTB4OUEsIDB4NDQsIDB4OUEsIDB4NDUsIDB4OUEsIDB4NDYsIDB4RUMsIDB4QTQsIC8qIDB4MzQtMHgzNyAqLworCTB4OUEsIDB4NDcsIDB4RUMsIDB4QTUsIDB4QzYsIDB4REIsIDB4OUEsIDB4NDgsIC8qIDB4MzgtMHgzQiAqLworCTB4OUEsIDB4NDksIDB4OUEsIDB4NEEsIDB4QkYsIDB4RUUsIDB4OUEsIDB4NEIsIC8qIDB4M0MtMHgzRiAqLworCTB4OUEsIDB4NEMsIDB4OUEsIDB4NEQsIDB4OUEsIDB4NEUsIDB4RUMsIDB4QTYsIC8qIDB4NDAtMHg0MyAqLworCTB4OUEsIDB4NEYsIDB4OUEsIDB4NTAsIDB4RUMsIDB4QTcsIDB4RDAsIDB4QUEsIC8qIDB4NDQtMHg0NyAqLworCTB4OUEsIDB4NTEsIDB4QzcsIDB4QjgsIDB4OUEsIDB4NTIsIDB4OUEsIDB4NTMsIC8qIDB4NDgtMHg0QiAqLworCTB4QjgsIDB4RTgsIDB4OUEsIDB4NTQsIDB4OUEsIDB4NTUsIDB4OUEsIDB4NTYsIC8qIDB4NEMtMHg0RiAqLworCTB4OUEsIDB4NTcsIDB4OUEsIDB4NTgsIDB4OUEsIDB4NTksIDB4OUEsIDB4NUEsIC8qIDB4NTAtMHg1MyAqLworCTB4OUEsIDB4NUIsIDB4OUEsIDB4NUMsIDB4OUEsIDB4NUQsIDB4OUEsIDB4NUUsIC8qIDB4NTQtMHg1NyAqLworCTB4OUEsIDB4NUYsIDB4RUMsIDB4QTgsIDB4OUEsIDB4NjAsIDB4OUEsIDB4NjEsIC8qIDB4NTgtMHg1QiAqLworCTB4OUEsIDB4NjIsIDB4OUEsIDB4NjMsIDB4OUEsIDB4NjQsIDB4OUEsIDB4NjUsIC8qIDB4NUMtMHg1RiAqLworCTB4OUEsIDB4NjYsIDB4OUEsIDB4NjcsIDB4RDYsIDB4QjksIDB4RDUsIDB4RkQsIC8qIDB4NjAtMHg2MyAqLworCTB4QjQsIDB4Q0IsIDB4QjIsIDB4QkQsIDB4Q0UsIDB4RTQsIDB4QzYsIDB4RTcsIC8qIDB4NjQtMHg2NyAqLworCTB4OUEsIDB4NjgsIDB4OUEsIDB4NjksIDB4Q0QsIDB4RTEsIDB4OUEsIDB4NkEsIC8qIDB4NjgtMHg2QiAqLworCTB4OUEsIDB4NkIsIDB4OUEsIDB4NkMsIDB4OUEsIDB4NkQsIDB4OUEsIDB4NkUsIC8qIDB4NkMtMHg2RiAqLworCTB4OUEsIDB4NkYsIDB4OUEsIDB4NzAsIDB4OUEsIDB4NzEsIDB4OUEsIDB4NzIsIC8qIDB4NzAtMHg3MyAqLworCTB4OUEsIDB4NzMsIDB4OUEsIDB4NzQsIDB4OUEsIDB4NzUsIDB4OUEsIDB4NzYsIC8qIDB4NzQtMHg3NyAqLworCTB4OUEsIDB4NzcsIDB4QjQsIDB4RjUsIDB4OUEsIDB4NzgsIDB4Q0IsIDB4QzAsIC8qIDB4NzgtMHg3QiAqLworCTB4QkMsIDB4REYsIDB4OUEsIDB4NzksIDB4OUEsIDB4N0EsIDB4OUEsIDB4N0IsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4OUEsIDB4N0MsIDB4RTksIDB4RTIsIDB4RTksIDB4RTMsIDB4RDEsIDB4RUEsIC8qIDB4ODAtMHg4MyAqLworCTB4RTksIDB4RTUsIDB4OUEsIDB4N0QsIDB4QjQsIDB4RjksIDB4RTksIDB4RTQsIC8qIDB4ODQtMHg4NyAqLworCTB4OUEsIDB4N0UsIDB4RDEsIDB4QjMsIDB4Q0EsIDB4RTIsIDB4QjIsIDB4RDAsIC8qIDB4ODgtMHg4QiAqLworCTB4OUEsIDB4ODAsIDB4RTksIDB4RTgsIDB4OUEsIDB4ODEsIDB4OUEsIDB4ODIsIC8qIDB4OEMtMHg4RiAqLworCTB4OUEsIDB4ODMsIDB4OUEsIDB4ODQsIDB4RTksIDB4RTYsIDB4RTksIDB4RTcsIC8qIDB4OTAtMHg5MyAqLworCTB4OUEsIDB4ODUsIDB4OUEsIDB4ODYsIDB4RDYsIDB4QjMsIDB4OUEsIDB4ODcsIC8qIDB4OTQtMHg5NyAqLworCTB4OUEsIDB4ODgsIDB4OUEsIDB4ODksIDB4RTksIDB4RTksIDB4RTksIDB4RUEsIC8qIDB4OTgtMHg5QiAqLworCTB4OUEsIDB4OEEsIDB4OUEsIDB4OEIsIDB4OUEsIDB4OEMsIDB4OUEsIDB4OEQsIC8qIDB4OUMtMHg5RiAqLworCTB4OUEsIDB4OEUsIDB4RTksIDB4RUIsIDB4OUEsIDB4OEYsIDB4OUEsIDB4OTAsIC8qIDB4QTAtMHhBMyAqLworCTB4OUEsIDB4OTEsIDB4OUEsIDB4OTIsIDB4OUEsIDB4OTMsIDB4OUEsIDB4OTQsIC8qIDB4QTQtMHhBNyAqLworCTB4OUEsIDB4OTUsIDB4OUEsIDB4OTYsIDB4RTksIDB4RUMsIDB4OUEsIDB4OTcsIC8qIDB4QTgtMHhBQiAqLworCTB4OUEsIDB4OTgsIDB4OUEsIDB4OTksIDB4OUEsIDB4OUEsIDB4OUEsIDB4OUIsIC8qIDB4QUMtMHhBRiAqLworCTB4OUEsIDB4OUMsIDB4OUEsIDB4OUQsIDB4OUEsIDB4OUUsIDB4RUMsIDB4QUYsIC8qIDB4QjAtMHhCMyAqLworCTB4QzUsIDB4QjksIDB4QjYsIDB4Q0UsIDB4OUEsIDB4OUYsIDB4RDIsIDB4RjMsIC8qIDB4QjQtMHhCNyAqLworCTB4OUEsIDB4QTAsIDB4OUEsIDB4QTEsIDB4OUEsIDB4QTIsIDB4OUEsIDB4QTMsIC8qIDB4QjgtMHhCQiAqLworCTB4OUEsIDB4QTQsIDB4OUEsIDB4QTUsIDB4OUEsIDB4QTYsIDB4QjUsIDB4RUUsIC8qIDB4QkMtMHhCRiAqLworCTB4OUEsIDB4QTcsIDB4QkIsIDB4RDksIDB4RUMsIDB4QjEsIDB4OUEsIDB4QTgsIC8qIDB4QzAtMHhDMyAqLworCTB4OUEsIDB4QTksIDB4RDIsIDB4RTMsIDB4OUEsIDB4QUEsIDB4OUEsIDB4QUIsIC8qIDB4QzQtMHhDNyAqLworCTB4OUEsIDB4QUMsIDB4OUEsIDB4QUQsIDB4OUEsIDB4QUUsIDB4Q0UsIDB4RTMsIC8qIDB4QzgtMHhDQiAqLworCTB4OUEsIDB4QUYsIDB4QzQsIDB4QjgsIDB4OUEsIDB4QjAsIDB4QzMsIDB4QkYsIC8qIDB4Q0MtMHhDRiAqLworCTB4OUEsIDB4QjEsIDB4OUEsIDB4QjIsIDB4QjYsIDB4QkUsIDB4RDgsIDB4QjksIC8qIDB4RDAtMHhEMyAqLworCTB4QjEsIDB4QzgsIDB4QjEsIDB4Q0YsIDB4QjEsIDB4RDEsIDB4QzUsIDB4RkUsIC8qIDB4RDQtMHhENyAqLworCTB4OUEsIDB4QjMsIDB4QjEsIDB4RDAsIDB4OUEsIDB4QjQsIDB4QzMsIDB4QUIsIC8qIDB4RDgtMHhEQiAqLworCTB4OUEsIDB4QjUsIDB4OUEsIDB4QjYsIDB4OUEsIDB4QjcsIDB4OUEsIDB4QjgsIC8qIDB4REMtMHhERiAqLworCTB4OUEsIDB4QjksIDB4RDUsIDB4QjEsIDB4OUEsIDB4QkEsIDB4OUEsIDB4QkIsIC8qIDB4RTAtMHhFMyAqLworCTB4OUEsIDB4QkMsIDB4OUEsIDB4QkQsIDB4OUEsIDB4QkUsIDB4OUEsIDB4QkYsIC8qIDB4RTQtMHhFNyAqLworCTB4OUEsIDB4QzAsIDB4OUEsIDB4QzEsIDB4RUIsIDB4QTQsIDB4QkEsIDB4QzEsIC8qIDB4RTgtMHhFQiAqLworCTB4OUEsIDB4QzIsIDB4OUEsIDB4QzMsIDB4OUEsIDB4QzQsIDB4Q0MsIDB4QkEsIC8qIDB4RUMtMHhFRiAqLworCTB4OUEsIDB4QzUsIDB4OUEsIDB4QzYsIDB4OUEsIDB4QzcsIDB4RUIsIDB4QTUsIC8qIDB4RjAtMHhGMyAqLworCTB4OUEsIDB4QzgsIDB4RUIsIDB4QTcsIDB4OUEsIDB4QzksIDB4OUEsIDB4Q0EsIC8qIDB4RjQtMHhGNyAqLworCTB4OUEsIDB4Q0IsIDB4RUIsIDB4QTgsIDB4OUEsIDB4Q0MsIDB4OUEsIDB4Q0QsIC8qIDB4RjgtMHhGQiAqLworCTB4OUEsIDB4Q0UsIDB4RUIsIDB4QTYsIDB4OUEsIDB4Q0YsIDB4OUEsIDB4RDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzZDWzUxMl0gPSB7CisJMHg5QSwgMHhEMSwgMHg5QSwgMHhEMiwgMHg5QSwgMHhEMywgMHg5QSwgMHhENCwgLyogMHgwMC0weDAzICovCisJMHg5QSwgMHhENSwgMHhFQiwgMHhBOSwgMHhFQiwgMHhBQiwgMHhFQiwgMHhBQSwgLyogMHgwNC0weDA3ICovCisJMHg5QSwgMHhENiwgMHg5QSwgMHhENywgMHg5QSwgMHhEOCwgMHg5QSwgMHhEOSwgLyogMHgwOC0weDBCICovCisJMHg5QSwgMHhEQSwgMHhFQiwgMHhBQywgMHg5QSwgMHhEQiwgMHhDQSwgMHhDRiwgLyogMHgwQy0weDBGICovCisJMHhEOCwgMHhCNSwgMHhDMywgMHhGMSwgMHg5QSwgMHhEQywgMHhDMywgMHhBNSwgLyogMHgxMC0weDEzICovCisJMHhDNiwgMHhGOCwgMHhFQiwgMHhBRCwgMHhDNCwgMHhDQSwgMHg5QSwgMHhERCwgLyogMHgxNC0weDE3ICovCisJMHhFQiwgMHhBRSwgMHhFQiwgMHhBRiwgMHhFQiwgMHhCMCwgMHhCNywgMHhENSwgLyogMHgxOC0weDFCICovCisJMHg5QSwgMHhERSwgMHg5QSwgMHhERiwgMHg5QSwgMHhFMCwgMHhCNywgMHhGQSwgLyogMHgxQy0weDFGICovCisJMHg5QSwgMHhFMSwgMHhFQiwgMHhCMSwgMHhDNywgMHhFMiwgMHg5QSwgMHhFMiwgLyogMHgyMC0weDIzICovCisJMHhFQiwgMHhCMywgMHg5QSwgMHhFMywgMHhCQSwgMHhBNCwgMHhEMSwgMHhGNSwgLyogMHgyNC0weDI3ICovCisJMHhCMCwgMHhCMSwgMHhFQiwgMHhCMiwgMHhFQiwgMHhCNCwgMHg5QSwgMHhFNCwgLyogMHgyOC0weDJCICovCisJMHg5QSwgMHhFNSwgMHg5QSwgMHhFNiwgMHhCNSwgMHhBQSwgMHhDMiwgMHhDOCwgLyogMHgyQy0weDJGICovCisJMHhDNywgMHhFOCwgMHg5QSwgMHhFNywgMHhFQiwgMHhCNSwgMHg5QSwgMHhFOCwgLyogMHgzMC0weDMzICovCisJMHhDQiwgMHhBRSwgMHhFMywgMHhERiwgMHg5QSwgMHhFOSwgMHg5QSwgMHhFQSwgLyogMHgzNC0weDM3ICovCisJMHhEMywgMHhDMCwgMHg5QSwgMHhFQiwgMHg5QSwgMHhFQywgMHg5QSwgMHhFRCwgLyogMHgzOC0weDNCICovCisJMHg5QSwgMHhFRSwgMHhEOSwgMHhEQiwgMHg5QSwgMHhFRiwgMHg5QSwgMHhGMCwgLyogMHgzQy0weDNGICovCisJMHhDRCwgMHhBMSwgMHhENiwgMHhBRCwgMHhDNywgMHhGMywgMHg5QSwgMHhGMSwgLyogMHg0MC0weDQzICovCisJMHg5QSwgMHhGMiwgMHg5QSwgMHhGMywgMHhEOSwgMHhFMCwgMHhCQiwgMHhFMywgLyogMHg0NC0weDQ3ICovCisJMHg5QSwgMHhGNCwgMHhCQSwgMHhCQSwgMHhFMywgMHhFMiwgMHg5QSwgMHhGNSwgLyogMHg0OC0weDRCICovCisJMHg5QSwgMHhGNiwgMHg5QSwgMHhGNywgMHg5QSwgMHhGOCwgMHg5QSwgMHhGOSwgLyogMHg0Qy0weDRGICovCisJMHhDRiwgMHhBQiwgMHg5QSwgMHhGQSwgMHg5QSwgMHhGQiwgMHg5QSwgMHhGQywgLyogMHg1MC0weDUzICovCisJMHhFMywgMHhFMCwgMHhDOSwgMHhDNywgMHg5QSwgMHhGRCwgMHhCQSwgMHhCOSwgLyogMHg1NC0weDU3ICovCisJMHg5QSwgMHhGRSwgMHg5QiwgMHg0MCwgMHg5QiwgMHg0MSwgMHhEMSwgMHhCNCwgLyogMHg1OC0weDVCICovCisJMHhFMywgMHhFMSwgMHhDOCwgMHhFQSwgMHhCOSwgMHhBRiwgMHhCRCwgMHhBRCwgLyogMHg1Qy0weDVGICovCisJMHhCMywgMHhEOCwgMHhDRSwgMHhEQiwgMHg5QiwgMHg0MiwgMHg5QiwgMHg0MywgLyogMHg2MC0weDYzICovCisJMHhDQywgMHhDMCwgMHg5QiwgMHg0NCwgMHg5QiwgMHg0NSwgMHg5QiwgMHg0NiwgLyogMHg2NC0weDY3ICovCisJMHhFMywgMHhFOCwgMHhFMywgMHhFOSwgMHhDRCwgMHhGNCwgMHg5QiwgMHg0NywgLyogMHg2OC0weDZCICovCisJMHg5QiwgMHg0OCwgMHg5QiwgMHg0OSwgMHg5QiwgMHg0QSwgMHg5QiwgMHg0QiwgLyogMHg2Qy0weDZGICovCisJMHhDQywgMHhBRCwgMHg5QiwgMHg0QywgMHhCQywgMHhCMywgMHg5QiwgMHg0RCwgLyogMHg3MC0weDczICovCisJMHhFMywgMHhFQSwgMHg5QiwgMHg0RSwgMHhFMywgMHhFQiwgMHg5QiwgMHg0RiwgLyogMHg3NC0weDc3ICovCisJMHg5QiwgMHg1MCwgMHhEMCwgMHhEQSwgMHg5QiwgMHg1MSwgMHg5QiwgMHg1MiwgLyogMHg3OC0weDdCICovCisJMHg5QiwgMHg1MywgMHhDNiwgMHhGQiwgMHhCNywgMHhEQSwgMHg5QiwgMHg1NCwgLyogMHg3Qy0weDdGICovCisJCisJMHg5QiwgMHg1NSwgMHhDNywgMHhERiwgMHhEMiwgMHhDQSwgMHhDRSwgMHhENiwgLyogMHg4MC0weDgzICovCisJMHg5QiwgMHg1NiwgMHhFMywgMHhFNCwgMHhFMywgMHhFQywgMHg5QiwgMHg1NywgLyogMHg4NC0weDg3ICovCisJMHhDOSwgMHhGMiwgMHhCMywgMHhDMSwgMHg5QiwgMHg1OCwgMHg5QiwgMHg1OSwgLyogMHg4OC0weDhCICovCisJMHhFMywgMHhFNywgMHg5QiwgMHg1QSwgMHg5QiwgMHg1QiwgMHhDNiwgMHhFMywgLyogMHg4Qy0weDhGICovCisJMHhFMywgMHhFNSwgMHg5QiwgMHg1QywgMHg5QiwgMHg1RCwgMHhFRCwgMHhCMywgLyogMHg5MC0weDkzICovCisJMHhFMywgMHhFNiwgMHg5QiwgMHg1RSwgMHg5QiwgMHg1RiwgMHg5QiwgMHg2MCwgLyogMHg5NC0weDk3ICovCisJMHg5QiwgMHg2MSwgMHhDOSwgMHhCMywgMHg5QiwgMHg2MiwgMHhDNSwgMHhFNiwgLyogMHg5OC0weDlCICovCisJMHg5QiwgMHg2MywgMHg5QiwgMHg2NCwgMHg5QiwgMHg2NSwgMHhCOSwgMHhCNSwgLyogMHg5Qy0weDlGICovCisJMHg5QiwgMHg2NiwgMHhDMywgMHhCQiwgMHg5QiwgMHg2NywgMHhFMywgMHhFMywgLyogMHhBMC0weEEzICovCisJMHhDNSwgMHhCRCwgMHhDMSwgMHhBNCwgMHhDMiwgMHhEOSwgMHhCMiwgMHhENywgLyogMHhBNC0weEE3ICovCisJMHg5QiwgMHg2OCwgMHhFMywgMHhFRCwgMHhCQiwgMHhBNiwgMHhDNCwgMHhBRCwgLyogMHhBOC0weEFCICovCisJMHg5QiwgMHg2OSwgMHhFMywgMHhGMCwgMHhCRSwgMHhEQSwgMHg5QiwgMHg2QSwgLyogMHhBQy0weEFGICovCisJMHg5QiwgMHg2QiwgMHhFMywgMHhGQiwgMHhFMywgMHhGNSwgMHhCQSwgMHhEMywgLyogMHhCMC0weEIzICovCisJMHg5QiwgMHg2QywgMHg5QiwgMHg2RCwgMHg5QiwgMHg2RSwgMHg5QiwgMHg2RiwgLyogMHhCNC0weEI3ICovCisJMHhCNywgMHhEMCwgMHhEMywgMHhDRCwgMHg5QiwgMHg3MCwgMHhENiwgMHhDRSwgLyogMHhCOC0weEJCICovCisJMHhENSwgMHhEMywgMHhCOSwgMHhDMSwgMHhENSwgMHhCNCwgMHhEMSwgMHhEOCwgLyogMHhCQy0weEJGICovCisJMHg5QiwgMHg3MSwgMHg5QiwgMHg3MiwgMHg5QiwgMHg3MywgMHg5QiwgMHg3NCwgLyogMHhDMC0weEMzICovCisJMHhEMCwgMHhCOSwgMHhDNywgMHhGNiwgMHg5QiwgMHg3NSwgMHg5QiwgMHg3NiwgLyogMHhDNC0weEM3ICovCisJMHg5QiwgMHg3NywgMHhDOCwgMHhBQSwgMHhCMiwgMHhCNCwgMHg5QiwgMHg3OCwgLyogMHhDOC0weENCICovCisJMHhDMywgMHhEQSwgMHg5QiwgMHg3OSwgMHg5QiwgMHg3QSwgMHg5QiwgMHg3QiwgLyogMHhDQy0weENGICovCisJMHhFMywgMHhFRSwgMHg5QiwgMHg3QywgMHg5QiwgMHg3RCwgMHhFMywgMHhGQywgLyogMHhEMC0weEQzICovCisJMHhFMywgMHhFRiwgMHhCNywgMHhBOCwgMHhFMywgMHhGNywgMHhFMywgMHhGNCwgLyogMHhENC0weEQ3ICovCisJMHg5QiwgMHg3RSwgMHg5QiwgMHg4MCwgMHg5QiwgMHg4MSwgMHhCNywgMHhCQSwgLyogMHhEOC0weERCICovCisJMHg5QiwgMHg4MiwgMHg5QiwgMHg4MywgMHhDNSwgMHhBMiwgMHg5QiwgMHg4NCwgLyogMHhEQy0weERGICovCisJMHhFMywgMHhGNiwgMHhDNSwgMHhERCwgMHhCMiwgMHhBOCwgMHhDNiwgMHhGQywgLyogMHhFMC0weEUzICovCisJMHg5QiwgMHg4NSwgMHhDNCwgMHhFMCwgMHg5QiwgMHg4NiwgMHg5QiwgMHg4NywgLyogMHhFNC0weEU3ICovCisJMHhENywgMHhBMiwgMHg5QiwgMHg4OCwgMHhDMCwgMHhFMSwgMHhFMywgMHhGOSwgLyogMHhFOC0weEVCICovCisJMHg5QiwgMHg4OSwgMHg5QiwgMHg4QSwgMHhFMywgMHhGQSwgMHhFMywgMHhGRCwgLyogMHhFQy0weEVGICovCisJMHhDQywgMHhBOSwgMHhFMywgMHhGMywgMHg5QiwgMHg4QiwgMHhEMywgMHhCRSwgLyogMHhGMC0weEYzICovCisJMHg5QiwgMHg4QywgMHhCMSwgMHhDMywgMHhFRCwgMHhCNCwgMHhFMywgMHhGMSwgLyogMHhGNC0weEY3ICovCisJMHhFMywgMHhGMiwgMHg5QiwgMHg4RCwgMHhFMywgMHhGOCwgMHhEMCwgMHhCQSwgLyogMHhGOC0weEZCICovCisJMHhDNiwgMHhDMywgMHhENCwgMHhGMywgMHhFMywgMHhGRSwgMHg5QiwgMHg4RSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNkRbNTEyXSA9IHsKKwkweDlCLCAweDhGLCAweEJELCAweEUwLCAweDlCLCAweDkwLCAweDlCLCAweDkxLCAvKiAweDAwLTB4MDMgKi8KKwkweEU0LCAweEE3LCAweDlCLCAweDkyLCAweDlCLCAweDkzLCAweEU0LCAweEE2LCAvKiAweDA0LTB4MDcgKi8KKwkweDlCLCAweDk0LCAweDlCLCAweDk1LCAweDlCLCAweDk2LCAweEQxLCAweEYzLCAvKiAweDA4LTB4MEIgKi8KKwkweEU0LCAweEEzLCAweDlCLCAweDk3LCAweEU0LCAweEE5LCAweDlCLCAweDk4LCAvKiAweDBDLTB4MEYgKi8KKwkweDlCLCAweDk5LCAweDlCLCAweDlBLCAweEM4LCAweEY3LCAweDlCLCAweDlCLCAvKiAweDEwLTB4MTMgKi8KKwkweDlCLCAweDlDLCAweDlCLCAweDlELCAweDlCLCAweDlFLCAweENGLCAweEI0LCAvKiAweDE0LTB4MTcgKi8KKwkweDlCLCAweDlGLCAweEU0LCAweEE4LCAweEU0LCAweEFFLCAweEMyLCAweEU1LCAvKiAweDE4LTB4MUIgKi8KKwkweDlCLCAweEEwLCAweDlCLCAweEExLCAweEI2LCAweEI0LCAweDlCLCAweEEyLCAvKiAweDFDLTB4MUYgKi8KKwkweDlCLCAweEEzLCAweDlCLCAweEE0LCAweDlCLCAweEE1LCAweDlCLCAweEE2LCAvKiAweDIwLTB4MjMgKi8KKwkweDlCLCAweEE3LCAweEJELCAweEYyLCAweDlCLCAweEE4LCAweEU0LCAweEEyLCAvKiAweDI0LTB4MjcgKi8KKwkweDlCLCAweEE5LCAweDlCLCAweEFBLCAweEJBLCAweEU5LCAweEU0LCAweEFBLCAvKiAweDI4LTB4MkIgKi8KKwkweDlCLCAweEFCLCAweDlCLCAweEFDLCAweEU0LCAweEFDLCAweDlCLCAweEFELCAvKiAweDJDLTB4MkYgKi8KKwkweDlCLCAweEFFLCAweEI2LCAweEZELCAweEQ2LCAweERFLCAweEU0LCAweEIyLCAvKiAweDMwLTB4MzMgKi8KKwkweDlCLCAweEFGLCAweEU0LCAweEFELCAweDlCLCAweEIwLCAweDlCLCAweEIxLCAvKiAweDM0LTB4MzcgKi8KKwkweDlCLCAweEIyLCAweEU0LCAweEExLCAweDlCLCAweEIzLCAweEJCLCAweEVFLCAvKiAweDM4LTB4M0IgKi8KKwkweENELCAweERELCAweEM3LCAweEEyLCAweEM1LCAweEM5LCAweDlCLCAweEI0LCAvKiAweDNDLTB4M0YgKi8KKwkweDlCLCAweEI1LCAweEMxLCAweEY3LCAweDlCLCAweEI2LCAweEU0LCAweEE0LCAvKiAweDQwLTB4NDMgKi8KKwkweDlCLCAweEI3LCAweEM3LCAweEIzLCAweEJELCAweEFDLCAweEJELCAweEJELCAvKiAweDQ0LTB4NDcgKi8KKwkweEU0LCAweEE1LCAweDlCLCAweEI4LCAweEQ3LCAweEM3LCAweEIyLCAweEUyLCAvKiAweDQ4LTB4NEIgKi8KKwkweDlCLCAweEI5LCAweEU0LCAweEFCLCAweEJDLCAweEMzLCAweEU0LCAweEFGLCAvKiAweDRDLTB4NEYgKi8KKwkweDlCLCAweEJBLCAweEJCLCAweEVCLCAweEU0LCAweEIwLCAweEM1LCAweEE4LCAvKiAweDUwLTB4NTMgKi8KKwkweEU0LCAweEIxLCAweDlCLCAweEJCLCAweDlCLCAweEJDLCAweDlCLCAweEJELCAvKiAweDU0LTB4NTcgKi8KKwkweDlCLCAweEJFLCAweEQ1LCAweEUzLCAweEJGLCAweEEzLCAweDlCLCAweEJGLCAvKiAweDU4LTB4NUIgKi8KKwkweEU0LCAweEJBLCAweDlCLCAweEMwLCAweEU0LCAweEI3LCAweDlCLCAweEMxLCAvKiAweDVDLTB4NUYgKi8KKwkweEU0LCAweEJCLCAweDlCLCAweEMyLCAweDlCLCAweEMzLCAweEU0LCAweEJELCAvKiAweDYwLTB4NjMgKi8KKwkweDlCLCAweEM0LCAweDlCLCAweEM1LCAweEM2LCAweEQ2LCAweDlCLCAweEM2LCAvKiAweDY0LTB4NjcgKi8KKwkweDlCLCAweEM3LCAweEJBLCAweEM2LCAweEMwLCAweENCLCAweDlCLCAweEM4LCAvKiAweDY4LTB4NkIgKi8KKwkweDlCLCAweEM5LCAweDlCLCAweENBLCAweEI4LCAweEExLCAweEU0LCAweEI0LCAvKiAweDZDLTB4NkYgKi8KKwkweDlCLCAweENCLCAweDlCLCAweENDLCAweDlCLCAweENELCAweDlCLCAweENFLCAvKiAweDcwLTB4NzMgKi8KKwkweEQ0LCAweEExLCAweDlCLCAweENGLCAweDlCLCAweEQwLCAweEJBLCAweEEzLCAvKiAweDc0LTB4NzcgKi8KKwkweEJELCAweEZFLCAweDlCLCAweEQxLCAweDlCLCAweEQyLCAweDlCLCAweEQzLCAvKiAweDc4LTB4N0IgKi8KKwkweEU0LCAweEJDLCAweDlCLCAweEQ0LCAweDlCLCAweEQ1LCAweDlCLCAweEQ2LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDlCLCAweEQ3LCAweDlCLCAweEQ4LCAweENELCAweEJGLCAweDlCLCAweEQ5LCAvKiAweDgwLTB4ODMgKi8KKwkweDlCLCAweERBLCAweEM0LCAweEY5LCAweDlCLCAweERCLCAweDlCLCAweERDLCAvKiAweDg0LTB4ODcgKi8KKwkweENGLCAweEZCLCAweEM5LCAweEU2LCAweDlCLCAweERELCAweDlCLCAweERFLCAvKiAweDg4LTB4OEIgKi8KKwkweEQzLCAweEJGLCAweDlCLCAweERGLCAweENGLCAweEQxLCAweDlCLCAweEUwLCAvKiAweDhDLTB4OEYgKi8KKwkweDlCLCAweEUxLCAweEU0LCAweEIzLCAweDlCLCAweEUyLCAweEU0LCAweEI4LCAvKiAweDkwLTB4OTMgKi8KKwkweEU0LCAweEI5LCAweENDLCAweEU5LCAweDlCLCAweEUzLCAweDlCLCAweEU0LCAvKiAweDk0LTB4OTcgKi8KKwkweDlCLCAweEU1LCAweDlCLCAweEU2LCAweDlCLCAweEU3LCAweENDLCAweENFLCAvKiAweDk4LTB4OUIgKi8KKwkweDlCLCAweEU4LCAweEMwLCAweEQ0LCAweEU0LCAweEI1LCAweEMxLCAweEIwLCAvKiAweDlDLTB4OUYgKi8KKwkweEU0LCAweEI2LCAweENFLCAweEQwLCAweDlCLCAweEU5LCAweEJCLCAweEMxLCAvKiAweEEwLTB4QTMgKi8KKwkweEI1LCAweEQzLCAweDlCLCAweEVBLCAweEM4LCAweEYzLCAweEJELCAweEE3LCAvKiAweEE0LTB4QTcgKi8KKwkweEQ1LCAweEM3LCAweEM5LCAweEFDLCAweEI4LCAweEEyLCAweEU0LCAweENBLCAvKiAweEE4LTB4QUIgKi8KKwkweDlCLCAweEVCLCAweDlCLCAweEVDLCAweEU0LCAweENDLCAweEQxLCAweEM0LCAvKiAweEFDLTB4QUYgKi8KKwkweDlCLCAweEVELCAweDlCLCAweEVFLCAweEQyLCAweEJBLCAweDlCLCAweEVGLCAvKiAweEIwLTB4QjMgKi8KKwkweDlCLCAweEYwLCAweEJBLCAweEFELCAweDlCLCAweEYxLCAweDlCLCAweEYyLCAvKiAweEI0LTB4QjcgKi8KKwkweEJBLCAweEQ0LCAweDlCLCAweEYzLCAweDlCLCAweEY0LCAweDlCLCAweEY1LCAvKiAweEI4LTB4QkIgKi8KKwkweDlCLCAweEY2LCAweDlCLCAweEY3LCAweDlCLCAweEY4LCAweEU0LCAweEMzLCAvKiAweEJDLTB4QkYgKi8KKwkweEI1LCAweEVELCAweDlCLCAweEY5LCAweDlCLCAweEZBLCAweDlCLCAweEZCLCAvKiAweEMwLTB4QzMgKi8KKwkweEQ3LCAweENELCAweEU0LCAweEMwLCAweENGLCAweEZELCAweEU0LCAweEJGLCAvKiAweEM0LTB4QzcgKi8KKwkweDlCLCAweEZDLCAweDlCLCAweEZELCAweDlCLCAweEZFLCAweEMxLCAweERDLCAvKiAweEM4LTB4Q0IgKi8KKwkweENDLCAweENBLCAweDlDLCAweDQwLCAweDlDLCAweDQxLCAweDlDLCAweDQyLCAvKiAweENDLTB4Q0YgKi8KKwkweDlDLCAweDQzLCAweENBLCAweEU3LCAweDlDLCAweDQ0LCAweDlDLCAweDQ1LCAvKiAweEQwLTB4RDMgKi8KKwkweDlDLCAweDQ2LCAweDlDLCAweDQ3LCAweEM0LCAweEQ3LCAweDlDLCAweDQ4LCAvKiAweEQ0LTB4RDcgKi8KKwkweENDLCAweEQ0LCAweEU0LCAweEM4LCAweDlDLCAweDQ5LCAweDlDLCAweDRBLCAvKiAweEQ4LTB4REIgKi8KKwkweDlDLCAweDRCLCAweEU0LCAweEM3LCAweEU0LCAweEMxLCAweDlDLCAweDRDLCAvKiAweERDLTB4REYgKi8KKwkweEU0LCAweEM0LCAweEI1LCAweEFELCAweDlDLCAweDRELCAweDlDLCAweDRFLCAvKiAweEUwLTB4RTMgKi8KKwkweEQzLCAweEQ5LCAweDlDLCAweDRGLCAweEU0LCAweEM2LCAweDlDLCAweDUwLCAvKiAweEU0LTB4RTcgKi8KKwkweDlDLCAweDUxLCAweDlDLCAweDUyLCAweDlDLCAweDUzLCAweEQyLCAweEY5LCAvKiAweEU4LTB4RUIgKi8KKwkweEI0LCAweEUzLCAweDlDLCAweDU0LCAweEJCLCAweEI0LCAweDlDLCAweDU1LCAvKiAweEVDLTB4RUYgKi8KKwkweDlDLCAweDU2LCAweEM5LCAweEVFLCAweDlDLCAweDU3LCAweEI0LCAweEJFLCAvKiAweEYwLTB4RjMgKi8KKwkweDlDLCAweDU4LCAweDlDLCAweDU5LCAweDlDLCAweDVBLCAweEJCLCAweEVDLCAvKiAweEY0LTB4RjcgKi8KKwkweDlDLCAweDVCLCAweEQxLCAweENELCAweDlDLCAweDVDLCAweENDLCAweEVELCAvKiAweEY4LTB4RkIgKi8KKwkweEVELCAweEI1LCAweDlDLCAweDVELCAweDlDLCAweDVFLCAweDlDLCAweDVGLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182RVs1MTJdID0geworCTB4OUMsIDB4NjAsIDB4OUMsIDB4NjEsIDB4OUMsIDB4NjIsIDB4OUMsIDB4NjMsIC8qIDB4MDAtMHgwMyAqLworCTB4OUMsIDB4NjQsIDB4QzcsIDB4RTUsIDB4OUMsIDB4NjUsIDB4OUMsIDB4NjYsIC8qIDB4MDQtMHgwNyAqLworCTB4OUMsIDB4NjcsIDB4OUMsIDB4NjgsIDB4RDQsIDB4QTgsIDB4OUMsIDB4NjksIC8qIDB4MDgtMHgwQiAqLworCTB4RTQsIDB4Q0IsIDB4RDcsIDB4RDUsIDB4RTQsIDB4QzIsIDB4OUMsIDB4NkEsIC8qIDB4MEMtMHgwRiAqLworCTB4QkQsIDB4QTUsIDB4RTQsIDB4QzUsIDB4OUMsIDB4NkIsIDB4OUMsIDB4NkMsIC8qIDB4MTAtMHgxMyAqLworCTB4RDMsIDB4RTYsIDB4OUMsIDB4NkQsIDB4RTQsIDB4QzksIDB4QzksIDB4RjgsIC8qIDB4MTQtMHgxNyAqLworCTB4OUMsIDB4NkUsIDB4OUMsIDB4NkYsIDB4RTQsIDB4QkUsIDB4OUMsIDB4NzAsIC8qIDB4MTgtMHgxQiAqLworCTB4OUMsIDB4NzEsIDB4RDMsIDB4RTUsIDB4OUMsIDB4NzIsIDB4OUMsIDB4NzMsIC8qIDB4MUMtMHgxRiAqLworCTB4QzcsIDB4RkUsIDB4QjYsIDB4QzksIDB4OUMsIDB4NzQsIDB4RDQsIDB4RkMsIC8qIDB4MjAtMHgyMyAqLworCTB4QjIsIDB4QjMsIDB4RTQsIDB4RDcsIDB4OUMsIDB4NzUsIDB4OUMsIDB4NzYsIC8qIDB4MjQtMHgyNyAqLworCTB4OUMsIDB4NzcsIDB4Q0UsIDB4QzIsIDB4OUMsIDB4NzgsIDB4RTQsIDB4Q0QsIC8qIDB4MjgtMHgyQiAqLworCTB4OUMsIDB4NzksIDB4Q0UsIDB4QkMsIDB4OUMsIDB4N0EsIDB4QjgsIDB4REIsIC8qIDB4MkMtMHgyRiAqLworCTB4OUMsIDB4N0IsIDB4OUMsIDB4N0MsIDB4RTQsIDB4RDYsIDB4OUMsIDB4N0QsIC8qIDB4MzAtMHgzMyAqLworCTB4QkYsIDB4Q0EsIDB4OUMsIDB4N0UsIDB4OUMsIDB4ODAsIDB4OUMsIDB4ODEsIC8qIDB4MzQtMHgzNyAqLworCTB4RDMsIDB4Q0UsIDB4OUMsIDB4ODIsIDB4QzMsIDB4RUMsIDB4OUMsIDB4ODMsIC8qIDB4MzgtMHgzQiAqLworCTB4OUMsIDB4ODQsIDB4OUMsIDB4ODUsIDB4OUMsIDB4ODYsIDB4OUMsIDB4ODcsIC8qIDB4M0MtMHgzRiAqLworCTB4OUMsIDB4ODgsIDB4OUMsIDB4ODksIDB4OUMsIDB4OEEsIDB4QzUsIDB4QzgsIC8qIDB4NDAtMHg0MyAqLworCTB4RTQsIDB4RDgsIDB4OUMsIDB4OEIsIDB4OUMsIDB4OEMsIDB4OUMsIDB4OEQsIC8qIDB4NDQtMHg0NyAqLworCTB4OUMsIDB4OEUsIDB4OUMsIDB4OEYsIDB4OUMsIDB4OTAsIDB4OUMsIDB4OTEsIC8qIDB4NDgtMHg0QiAqLworCTB4OUMsIDB4OTIsIDB4Q0QsIDB4QzQsIDB4RTQsIDB4Q0YsIDB4OUMsIDB4OTMsIC8qIDB4NEMtMHg0RiAqLworCTB4OUMsIDB4OTQsIDB4OUMsIDB4OTUsIDB4OUMsIDB4OTYsIDB4RTQsIDB4RDQsIC8qIDB4NTAtMHg1MyAqLworCTB4RTQsIDB4RDUsIDB4OUMsIDB4OTcsIDB4QkEsIDB4RkUsIDB4OUMsIDB4OTgsIC8qIDB4NTQtMHg1NyAqLworCTB4Q0YsIDB4RTYsIDB4OUMsIDB4OTksIDB4OUMsIDB4OUEsIDB4RDUsIDB4QkYsIC8qIDB4NTgtMHg1QiAqLworCTB4OUMsIDB4OUIsIDB4OUMsIDB4OUMsIDB4OUMsIDB4OUQsIDB4RTQsIDB4RDIsIC8qIDB4NUMtMHg1RiAqLworCTB4OUMsIDB4OUUsIDB4OUMsIDB4OUYsIDB4OUMsIDB4QTAsIDB4OUMsIDB4QTEsIC8qIDB4NjAtMHg2MyAqLworCTB4OUMsIDB4QTIsIDB4OUMsIDB4QTMsIDB4OUMsIDB4QTQsIDB4OUMsIDB4QTUsIC8qIDB4NjQtMHg2NyAqLworCTB4OUMsIDB4QTYsIDB4OUMsIDB4QTcsIDB4OUMsIDB4QTgsIDB4RTQsIDB4RDAsIC8qIDB4NjgtMHg2QiAqLworCTB4OUMsIDB4QTksIDB4OUMsIDB4QUEsIDB4RTQsIDB4Q0UsIDB4OUMsIDB4QUIsIC8qIDB4NkMtMHg2RiAqLworCTB4OUMsIDB4QUMsIDB4OUMsIDB4QUQsIDB4OUMsIDB4QUUsIDB4OUMsIDB4QUYsIC8qIDB4NzAtMHg3MyAqLworCTB4OUMsIDB4QjAsIDB4OUMsIDB4QjEsIDB4OUMsIDB4QjIsIDB4OUMsIDB4QjMsIC8qIDB4NzQtMHg3NyAqLworCTB4OUMsIDB4QjQsIDB4OUMsIDB4QjUsIDB4OUMsIDB4QjYsIDB4OUMsIDB4QjcsIC8qIDB4NzgtMHg3QiAqLworCTB4OUMsIDB4QjgsIDB4OUMsIDB4QjksIDB4Q0QsIDB4RTUsIDB4Q0EsIDB4QUEsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4OUMsIDB4QkEsIDB4OUMsIDB4QkIsIDB4OUMsIDB4QkMsIDB4QzAsIDB4QTMsIC8qIDB4ODAtMHg4MyAqLworCTB4OUMsIDB4QkQsIDB4QkQsIDB4QTYsIDB4RTQsIDB4RDMsIDB4OUMsIDB4QkUsIC8qIDB4ODQtMHg4NyAqLworCTB4OUMsIDB4QkYsIDB4QjgsIDB4QzgsIDB4OUMsIDB4QzAsIDB4OUMsIDB4QzEsIC8qIDB4ODgtMHg4QiAqLworCTB4OUMsIDB4QzIsIDB4OUMsIDB4QzMsIDB4OUMsIDB4QzQsIDB4RTQsIDB4RTcsIC8qIDB4OEMtMHg4RiAqLworCTB4RDQsIDB4QjQsIDB4OUMsIDB4QzUsIDB4OUMsIDB4QzYsIDB4OUMsIDB4QzcsIC8qIDB4OTAtMHg5MyAqLworCTB4OUMsIDB4QzgsIDB4OUMsIDB4QzksIDB4OUMsIDB4Q0EsIDB4OUMsIDB4Q0IsIC8qIDB4OTQtMHg5NyAqLworCTB4RTQsIDB4REIsIDB4OUMsIDB4Q0MsIDB4OUMsIDB4Q0QsIDB4OUMsIDB4Q0UsIC8qIDB4OTgtMHg5QiAqLworCTB4QzEsIDB4RUYsIDB4OUMsIDB4Q0YsIDB4OUMsIDB4RDAsIDB4RTQsIDB4RTksIC8qIDB4OUMtMHg5RiAqLworCTB4OUMsIDB4RDEsIDB4OUMsIDB4RDIsIDB4RDIsIDB4RTcsIDB4OUMsIDB4RDMsIC8qIDB4QTAtMHhBMyAqLworCTB4OUMsIDB4RDQsIDB4RTQsIDB4REYsIDB4OUMsIDB4RDUsIDB4RTQsIDB4RTAsIC8qIDB4QTQtMHhBNyAqLworCTB4OUMsIDB4RDYsIDB4OUMsIDB4RDcsIDB4Q0YsIDB4QUEsIDB4OUMsIDB4RDgsIC8qIDB4QTgtMHhBQiAqLworCTB4OUMsIDB4RDksIDB4OUMsIDB4REEsIDB4OUMsIDB4REIsIDB4Q0IsIDB4REQsIC8qIDB4QUMtMHhBRiAqLworCTB4OUMsIDB4REMsIDB4RTQsIDB4REEsIDB4RTQsIDB4RDEsIDB4OUMsIDB4REQsIC8qIDB4QjAtMHhCMyAqLworCTB4RTQsIDB4RTUsIDB4OUMsIDB4REUsIDB4QzgsIDB4REMsIDB4RTQsIDB4RTMsIC8qIDB4QjQtMHhCNyAqLworCTB4OUMsIDB4REYsIDB4OUMsIDB4RTAsIDB4QzQsIDB4RTcsIDB4RTQsIDB4RTIsIC8qIDB4QjgtMHhCQiAqLworCTB4OUMsIDB4RTEsIDB4RTQsIDB4RTEsIDB4OUMsIDB4RTIsIDB4OUMsIDB4RTMsIC8qIDB4QkMtMHhCRiAqLworCTB4OUMsIDB4RTQsIDB4QjMsIDB4RkMsIDB4RTQsIDB4RTgsIDB4OUMsIDB4RTUsIC8qIDB4QzAtMHhDMyAqLworCTB4OUMsIDB4RTYsIDB4OUMsIDB4RTcsIDB4OUMsIDB4RTgsIDB4QjUsIDB4RTEsIC8qIDB4QzQtMHhDNyAqLworCTB4OUMsIDB4RTksIDB4OUMsIDB4RUEsIDB4OUMsIDB4RUIsIDB4RDcsIDB4Q0MsIC8qIDB4QzgtMHhDQiAqLworCTB4OUMsIDB4RUMsIDB4OUMsIDB4RUQsIDB4OUMsIDB4RUUsIDB4RTQsIDB4RTYsIC8qIDB4Q0MtMHhDRiAqLworCTB4OUMsIDB4RUYsIDB4QkIsIDB4QUMsIDB4OUMsIDB4RjAsIDB4RDcsIDB4RDIsIC8qIDB4RDAtMHhEMyAqLworCTB4Q0MsIDB4Q0YsIDB4RUIsIDB4RjgsIDB4OUMsIDB4RjEsIDB4RTQsIDB4RTQsIC8qIDB4RDQtMHhENyAqLworCTB4OUMsIDB4RjIsIDB4OUMsIDB4RjMsIDB4QjksIDB4RjYsIDB4OUMsIDB4RjQsIC8qIDB4RDgtMHhEQiAqLworCTB4OUMsIDB4RjUsIDB4OUMsIDB4RjYsIDB4RDYsIDB4Q0QsIDB4RTQsIDB4RDksIC8qIDB4REMtMHhERiAqLworCTB4RTQsIDB4REMsIDB4QzIsIDB4RkEsIDB4RTQsIDB4REUsIDB4OUMsIDB4RjcsIC8qIDB4RTAtMHhFMyAqLworCTB4QzIsIDB4Q0IsIDB4QzAsIDB4QzQsIDB4QzIsIDB4RDAsIDB4OUMsIDB4RjgsIC8qIDB4RTQtMHhFNyAqLworCTB4QjEsIDB4RjUsIDB4Q0MsIDB4QjIsIDB4OUMsIDB4RjksIDB4OUMsIDB4RkEsIC8qIDB4RTgtMHhFQiAqLworCTB4OUMsIDB4RkIsIDB4OUMsIDB4RkMsIDB4OUMsIDB4RkQsIDB4OUMsIDB4RkUsIC8qIDB4RUMtMHhFRiAqLworCTB4OUQsIDB4NDAsIDB4OUQsIDB4NDEsIDB4OUQsIDB4NDIsIDB4OUQsIDB4NDMsIC8qIDB4RjAtMHhGMyAqLworCTB4QjUsIDB4Q0UsIDB4OUQsIDB4NDQsIDB4OUQsIDB4NDUsIDB4OUQsIDB4NDYsIC8qIDB4RjQtMHhGNyAqLworCTB4OUQsIDB4NDcsIDB4RTQsIDB4RUYsIDB4OUQsIDB4NDgsIDB4OUQsIDB4NDksIC8qIDB4RjgtMHhGQiAqLworCTB4OUQsIDB4NEEsIDB4OUQsIDB4NEIsIDB4OUQsIDB4NEMsIDB4OUQsIDB4NEQsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzZGWzUxMl0gPSB7CisJMHg5RCwgMHg0RSwgMHg5RCwgMHg0RiwgMHhDNiwgMHhBRiwgMHg5RCwgMHg1MCwgLyogMHgwMC0weDAzICovCisJMHg5RCwgMHg1MSwgMHg5RCwgMHg1MiwgMHhDNiwgMHhFMSwgMHg5RCwgMHg1MywgLyogMHgwNC0weDA3ICovCisJMHg5RCwgMHg1NCwgMHhFNCwgMHhGNSwgMHg5RCwgMHg1NSwgMHg5RCwgMHg1NiwgLyogMHgwOC0weDBCICovCisJMHg5RCwgMHg1NywgMHg5RCwgMHg1OCwgMHg5RCwgMHg1OSwgMHhDMiwgMHhBOSwgLyogMHgwQy0weDBGICovCisJMHg5RCwgMHg1QSwgMHg5RCwgMHg1QiwgMHg5RCwgMHg1QywgMHhDMCwgMHhFQywgLyogMHgxMC0weDEzICovCisJMHhEMSwgMHhERCwgMHhFNCwgMHhFRSwgMHg5RCwgMHg1RCwgMHg5RCwgMHg1RSwgLyogMHgxNC0weDE3ICovCisJMHg5RCwgMHg1RiwgMHg5RCwgMHg2MCwgMHg5RCwgMHg2MSwgMHg5RCwgMHg2MiwgLyogMHgxOC0weDFCICovCisJMHg5RCwgMHg2MywgMHg5RCwgMHg2NCwgMHg5RCwgMHg2NSwgMHg5RCwgMHg2NiwgLyogMHgxQy0weDFGICovCisJMHhDNCwgMHhBRSwgMHg5RCwgMHg2NywgMHg5RCwgMHg2OCwgMHg5RCwgMHg2OSwgLyogMHgyMC0weDIzICovCisJMHhFNCwgMHhFRCwgMHg5RCwgMHg2QSwgMHg5RCwgMHg2QiwgMHg5RCwgMHg2QywgLyogMHgyNC0weDI3ICovCisJMHg5RCwgMHg2RCwgMHhFNCwgMHhGNiwgMHhFNCwgMHhGNCwgMHhDMiwgMHhGRSwgLyogMHgyOC0weDJCICovCisJMHg5RCwgMHg2RSwgMHhFNCwgMHhERCwgMHg5RCwgMHg2RiwgMHhFNCwgMHhGMCwgLyogMHgyQy0weDJGICovCisJMHg5RCwgMHg3MCwgMHhDQSwgMHhGRSwgMHg5RCwgMHg3MSwgMHhENSwgMHhDNCwgLyogMHgzMC0weDMzICovCisJMHg5RCwgMHg3MiwgMHg5RCwgMHg3MywgMHhFNCwgMHhGMSwgMHg5RCwgMHg3NCwgLyogMHgzNC0weDM3ICovCisJMHg5RCwgMHg3NSwgMHg5RCwgMHg3NiwgMHg5RCwgMHg3NywgMHg5RCwgMHg3OCwgLyogMHgzOC0weDNCICovCisJMHg5RCwgMHg3OSwgMHg5RCwgMHg3QSwgMHhEMSwgMHhGQSwgMHg5RCwgMHg3QiwgLyogMHgzQy0weDNGICovCisJMHg5RCwgMHg3QywgMHg5RCwgMHg3RCwgMHg5RCwgMHg3RSwgMHg5RCwgMHg4MCwgLyogMHg0MC0weDQzICovCisJMHg5RCwgMHg4MSwgMHg5RCwgMHg4MiwgMHhFNCwgMHhFQiwgMHhFNCwgMHhFQywgLyogMHg0NC0weDQ3ICovCisJMHg5RCwgMHg4MywgMHg5RCwgMHg4NCwgMHg5RCwgMHg4NSwgMHhFNCwgMHhGMiwgLyogMHg0OC0weDRCICovCisJMHg5RCwgMHg4NiwgMHhDRSwgMHhBQiwgMHg5RCwgMHg4NywgMHg5RCwgMHg4OCwgLyogMHg0Qy0weDRGICovCisJMHg5RCwgMHg4OSwgMHg5RCwgMHg4QSwgMHg5RCwgMHg4QiwgMHg5RCwgMHg4QywgLyogMHg1MC0weDUzICovCisJMHg5RCwgMHg4RCwgMHg5RCwgMHg4RSwgMHg5RCwgMHg4RiwgMHg5RCwgMHg5MCwgLyogMHg1NC0weDU3ICovCisJMHhDNSwgMHhDQiwgMHg5RCwgMHg5MSwgMHg5RCwgMHg5MiwgMHg5RCwgMHg5MywgLyogMHg1OC0weDVCICovCisJMHhDNywgMHhCMSwgMHg5RCwgMHg5NCwgMHhDMiwgMHhCQSwgMHg5RCwgMHg5NSwgLyogMHg1Qy0weDVGICovCisJMHg5RCwgMHg5NiwgMHg5RCwgMHg5NywgMHhFNCwgMHhFQSwgMHg5RCwgMHg5OCwgLyogMHg2MC0weDYzICovCisJMHg5RCwgMHg5OSwgMHg5RCwgMHg5QSwgMHhDMSwgMHhDQSwgMHg5RCwgMHg5QiwgLyogMHg2NC0weDY3ICovCisJMHg5RCwgMHg5QywgMHg5RCwgMHg5RCwgMHg5RCwgMHg5RSwgMHg5RCwgMHg5RiwgLyogMHg2OC0weDZCICovCisJMHg5RCwgMHhBMCwgMHhDQywgMHhCNiwgMHhCMywgMHhCMSwgMHg5RCwgMHhBMSwgLyogMHg2Qy0weDZGICovCisJMHg5RCwgMHhBMiwgMHg5RCwgMHhBMywgMHhFNCwgMHhGQiwgMHg5RCwgMHhBNCwgLyogMHg3MC0weDczICovCisJMHhFNCwgMHhGMywgMHg5RCwgMHhBNSwgMHg5RCwgMHhBNiwgMHg5RCwgMHhBNywgLyogMHg3NC0weDc3ICovCisJMHhFNCwgMHhGQSwgMHg5RCwgMHhBOCwgMHhFNCwgMHhGRCwgMHg5RCwgMHhBOSwgLyogMHg3OC0weDdCICovCisJMHhFNCwgMHhGQywgMHg5RCwgMHhBQSwgMHg5RCwgMHhBQiwgMHg5RCwgMHhBQywgLyogMHg3Qy0weDdGICovCisJCisJMHg5RCwgMHhBRCwgMHg5RCwgMHhBRSwgMHg5RCwgMHhBRiwgMHg5RCwgMHhCMCwgLyogMHg4MC0weDgzICovCisJMHhCMywgMHhDRSwgMHg5RCwgMHhCMSwgMHg5RCwgMHhCMiwgMHg5RCwgMHhCMywgLyogMHg4NC0weDg3ICovCisJMHhCMywgMHhCQSwgMHhFNCwgMHhGNywgMHg5RCwgMHhCNCwgMHg5RCwgMHhCNSwgLyogMHg4OC0weDhCICovCisJMHhFNCwgMHhGOSwgMHhFNCwgMHhGOCwgMHhDNSwgMHhFQywgMHg5RCwgMHhCNiwgLyogMHg4Qy0weDhGICovCisJMHg5RCwgMHhCNywgMHg5RCwgMHhCOCwgMHg5RCwgMHhCOSwgMHg5RCwgMHhCQSwgLyogMHg5MC0weDkzICovCisJMHg5RCwgMHhCQiwgMHg5RCwgMHhCQywgMHg5RCwgMHhCRCwgMHg5RCwgMHhCRSwgLyogMHg5NC0weDk3ICovCisJMHg5RCwgMHhCRiwgMHg5RCwgMHhDMCwgMHg5RCwgMHhDMSwgMHg5RCwgMHhDMiwgLyogMHg5OC0weDlCICovCisJMHhDMCwgMHhCRCwgMHg5RCwgMHhDMywgMHg5RCwgMHhDNCwgMHg5RCwgMHhDNSwgLyogMHg5Qy0weDlGICovCisJMHg5RCwgMHhDNiwgMHhENCwgMHhFOCwgMHg5RCwgMHhDNywgMHg5RCwgMHhDOCwgLyogMHhBMC0weEEzICovCisJMHg5RCwgMHhDOSwgMHg5RCwgMHhDQSwgMHg5RCwgMHhDQiwgMHhFNSwgMHhBMiwgLyogMHhBNC0weEE3ICovCisJMHg5RCwgMHhDQywgMHg5RCwgMHhDRCwgMHg5RCwgMHhDRSwgMHg5RCwgMHhDRiwgLyogMHhBOC0weEFCICovCisJMHg5RCwgMHhEMCwgMHg5RCwgMHhEMSwgMHg5RCwgMHhEMiwgMHg5RCwgMHhEMywgLyogMHhBQy0weEFGICovCisJMHg5RCwgMHhENCwgMHg5RCwgMHhENSwgMHg5RCwgMHhENiwgMHhCMCwgMHhDNCwgLyogMHhCMC0weEIzICovCisJMHg5RCwgMHhENywgMHg5RCwgMHhEOCwgMHhFNSwgMHhBNCwgMHg5RCwgMHhEOSwgLyogMHhCNC0weEI3ICovCisJMHg5RCwgMHhEQSwgMHhFNSwgMHhBMywgMHg5RCwgMHhEQiwgMHg5RCwgMHhEQywgLyogMHhCOC0weEJCICovCisJMHg5RCwgMHhERCwgMHg5RCwgMHhERSwgMHg5RCwgMHhERiwgMHg5RCwgMHhFMCwgLyogMHhCQy0weEJGICovCisJMHhCQywgMHhBNCwgMHg5RCwgMHhFMSwgMHhFNSwgMHhBNSwgMHg5RCwgMHhFMiwgLyogMHhDMC0weEMzICovCisJMHg5RCwgMHhFMywgMHg5RCwgMHhFNCwgMHg5RCwgMHhFNSwgMHg5RCwgMHhFNiwgLyogMHhDNC0weEM3ICovCisJMHg5RCwgMHhFNywgMHhFNSwgMHhBMSwgMHg5RCwgMHhFOCwgMHg5RCwgMHhFOSwgLyogMHhDOC0weENCICovCisJMHg5RCwgMHhFQSwgMHg5RCwgMHhFQiwgMHg5RCwgMHhFQywgMHg5RCwgMHhFRCwgLyogMHhDQy0weENGICovCisJMHg5RCwgMHhFRSwgMHhFNCwgMHhGRSwgMHhCMSwgMHhGNCwgMHg5RCwgMHhFRiwgLyogMHhEMC0weEQzICovCisJMHg5RCwgMHhGMCwgMHg5RCwgMHhGMSwgMHg5RCwgMHhGMiwgMHg5RCwgMHhGMywgLyogMHhENC0weEQ3ICovCisJMHg5RCwgMHhGNCwgMHg5RCwgMHhGNSwgMHg5RCwgMHhGNiwgMHg5RCwgMHhGNywgLyogMHhEOC0weERCICovCisJMHg5RCwgMHhGOCwgMHg5RCwgMHhGOSwgMHhFNSwgMHhBOCwgMHg5RCwgMHhGQSwgLyogMHhEQy0weERGICovCisJMHhFNSwgMHhBOSwgMHhFNSwgMHhBNiwgMHg5RCwgMHhGQiwgMHg5RCwgMHhGQywgLyogMHhFMC0weEUzICovCisJMHg5RCwgMHhGRCwgMHg5RCwgMHhGRSwgMHg5RSwgMHg0MCwgMHg5RSwgMHg0MSwgLyogMHhFNC0weEU3ICovCisJMHg5RSwgMHg0MiwgMHg5RSwgMHg0MywgMHg5RSwgMHg0NCwgMHg5RSwgMHg0NSwgLyogMHhFOC0weEVCICovCisJMHg5RSwgMHg0NiwgMHg5RSwgMHg0NywgMHhFNSwgMHhBNywgMHhFNSwgMHhBQSwgLyogMHhFQy0weEVGICovCisJMHg5RSwgMHg0OCwgMHg5RSwgMHg0OSwgMHg5RSwgMHg0QSwgMHg5RSwgMHg0QiwgLyogMHhGMC0weEYzICovCisJMHg5RSwgMHg0QywgMHg5RSwgMHg0RCwgMHg5RSwgMHg0RSwgMHg5RSwgMHg0RiwgLyogMHhGNC0weEY3ICovCisJMHg5RSwgMHg1MCwgMHg5RSwgMHg1MSwgMHg5RSwgMHg1MiwgMHg5RSwgMHg1MywgLyogMHhGOC0weEZCICovCisJMHg5RSwgMHg1NCwgMHg5RSwgMHg1NSwgMHg5RSwgMHg1NiwgMHg5RSwgMHg1NywgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNzBbNTEyXSA9IHsKKwkweDlFLCAweDU4LCAweDlFLCAweDU5LCAweDlFLCAweDVBLCAweDlFLCAweDVCLCAvKiAweDAwLTB4MDMgKi8KKwkweDlFLCAweDVDLCAweDlFLCAweDVELCAweDlFLCAweDVFLCAweDlFLCAweDVGLCAvKiAweDA0LTB4MDcgKi8KKwkweDlFLCAweDYwLCAweDlFLCAweDYxLCAweDlFLCAweDYyLCAweDlFLCAweDYzLCAvKiAweDA4LTB4MEIgKi8KKwkweDlFLCAweDY0LCAweDlFLCAweDY1LCAweDlFLCAweDY2LCAweDlFLCAweDY3LCAvKiAweDBDLTB4MEYgKi8KKwkweDlFLCAweDY4LCAweEM2LCAweEQ5LCAweDlFLCAweDY5LCAweDlFLCAweDZBLCAvKiAweDEwLTB4MTMgKi8KKwkweDlFLCAweDZCLCAweDlFLCAweDZDLCAweDlFLCAweDZELCAweDlFLCAweDZFLCAvKiAweDE0LTB4MTcgKi8KKwkweDlFLCAweDZGLCAweDlFLCAweDcwLCAweEU1LCAweEFCLCAweEU1LCAweEFELCAvKiAweDE4LTB4MUIgKi8KKwkweDlFLCAweDcxLCAweDlFLCAweDcyLCAweDlFLCAweDczLCAweDlFLCAweDc0LCAvKiAweDFDLTB4MUYgKi8KKwkweDlFLCAweDc1LCAweDlFLCAweDc2LCAweDlFLCAweDc3LCAweEU1LCAweEFDLCAvKiAweDIwLTB4MjMgKi8KKwkweDlFLCAweDc4LCAweDlFLCAweDc5LCAweDlFLCAweDdBLCAweDlFLCAweDdCLCAvKiAweDI0LTB4MjcgKi8KKwkweDlFLCAweDdDLCAweDlFLCAweDdELCAweDlFLCAweDdFLCAweDlFLCAweDgwLCAvKiAweDI4LTB4MkIgKi8KKwkweDlFLCAweDgxLCAweDlFLCAweDgyLCAweDlFLCAweDgzLCAweDlFLCAweDg0LCAvKiAweDJDLTB4MkYgKi8KKwkweDlFLCAweDg1LCAweDlFLCAweDg2LCAweDlFLCAweDg3LCAweDlFLCAweDg4LCAvKiAweDMwLTB4MzMgKi8KKwkweDlFLCAweDg5LCAweEU1LCAweEFGLCAweDlFLCAweDhBLCAweDlFLCAweDhCLCAvKiAweDM0LTB4MzcgKi8KKwkweDlFLCAweDhDLCAweEU1LCAweEFFLCAweDlFLCAweDhELCAweDlFLCAweDhFLCAvKiAweDM4LTB4M0IgKi8KKwkweDlFLCAweDhGLCAweDlFLCAweDkwLCAweDlFLCAweDkxLCAweDlFLCAweDkyLCAvKiAweDNDLTB4M0YgKi8KKwkweDlFLCAweDkzLCAweDlFLCAweDk0LCAweDlFLCAweDk1LCAweDlFLCAweDk2LCAvKiAweDQwLTB4NDMgKi8KKwkweDlFLCAweDk3LCAweDlFLCAweDk4LCAweDlFLCAweDk5LCAweDlFLCAweDlBLCAvKiAweDQ0LTB4NDcgKi8KKwkweDlFLCAweDlCLCAweDlFLCAweDlDLCAweDlFLCAweDlELCAweDlFLCAweDlFLCAvKiAweDQ4LTB4NEIgKi8KKwkweEI5LCAweEUwLCAweDlFLCAweDlGLCAweDlFLCAweEEwLCAweEU1LCAweEIwLCAvKiAweDRDLTB4NEYgKi8KKwkweDlFLCAweEExLCAweDlFLCAweEEyLCAweDlFLCAweEEzLCAweDlFLCAweEE0LCAvKiAweDUwLTB4NTMgKi8KKwkweDlFLCAweEE1LCAweDlFLCAweEE2LCAweDlFLCAweEE3LCAweDlFLCAweEE4LCAvKiAweDU0LTB4NTcgKi8KKwkweDlFLCAweEE5LCAweDlFLCAweEFBLCAweDlFLCAweEFCLCAweDlFLCAweEFDLCAvKiAweDU4LTB4NUIgKi8KKwkweDlFLCAweEFELCAweDlFLCAweEFFLCAweEU1LCAweEIxLCAweDlFLCAweEFGLCAvKiAweDVDLTB4NUYgKi8KKwkweDlFLCAweEIwLCAweDlFLCAweEIxLCAweDlFLCAweEIyLCAweDlFLCAweEIzLCAvKiAweDYwLTB4NjMgKi8KKwkweDlFLCAweEI0LCAweDlFLCAweEI1LCAweDlFLCAweEI2LCAweDlFLCAweEI3LCAvKiAweDY0LTB4NjcgKi8KKwkweDlFLCAweEI4LCAweDlFLCAweEI5LCAweDlFLCAweEJBLCAweEJCLCAweEYwLCAvKiAweDY4LTB4NkIgKi8KKwkweEVDLCAweEUxLCAweEMzLCAweEYwLCAweDlFLCAweEJCLCAweEI1LCAweEM2LCAvKiAweDZDLTB4NkYgKi8KKwkweEJCLCAweEQyLCAweDlFLCAweEJDLCAweDlFLCAweEJELCAweDlFLCAweEJFLCAvKiAweDcwLTB4NzMgKi8KKwkweDlFLCAweEJGLCAweEMxLCAweEU5LCAweEQ0LCAweEVFLCAweDlFLCAweEMwLCAvKiAweDc0LTB4NzcgKi8KKwkweEJFLCAweEM0LCAweDlFLCAweEMxLCAweDlFLCAweEMyLCAweDlFLCAweEMzLCAvKiAweDc4LTB4N0IgKi8KKwkweEQ3LCAweEM2LCAweDlFLCAweEM0LCAweEQ0LCAweEQ2LCAweEIyLCAweEQzLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEVDLCAweEJFLCAweDlFLCAweEM1LCAweDlFLCAweEM2LCAweDlFLCAweEM3LCAvKiAweDgwLTB4ODMgKi8KKwkweDlFLCAweEM4LCAweEVBLCAweEMxLCAweDlFLCAweEM5LCAweDlFLCAweENBLCAvKiAweDg0LTB4ODcgKi8KKwkweDlFLCAweENCLCAweEMyLCAweEFGLCAweEI0LCAweEI2LCAweDlFLCAweENDLCAvKiAweDg4LTB4OEIgKi8KKwkweDlFLCAweENELCAweDlFLCAweENFLCAweEQxLCAweEQ3LCAweDlFLCAweENGLCAvKiAweDhDLTB4OEYgKi8KKwkweDlFLCAweEQwLCAweDlFLCAweEQxLCAweEIzLCAweEI0LCAweDlFLCAweEQyLCAvKiAweDkwLTB4OTMgKi8KKwkweEM4LCAweEIyLCAweEJGLCAweEJCLCAweEVDLCAweEMwLCAweDlFLCAweEQzLCAvKiAweDk0LTB4OTcgKi8KKwkweDlFLCAweEQ0LCAweEQ2LCAweENCLCAweDlFLCAweEQ1LCAweDlFLCAweEQ2LCAvKiAweDk4LTB4OUIgKi8KKwkweEVDLCAweEJGLCAweEVDLCAweEMxLCAweDlFLCAweEQ3LCAweDlFLCAweEQ4LCAvKiAweDlDLTB4OUYgKi8KKwkweDlFLCAweEQ5LCAweDlFLCAweERBLCAweDlFLCAweERCLCAweDlFLCAweERDLCAvKiAweEEwLTB4QTMgKi8KKwkweDlFLCAweERELCAweDlFLCAweERFLCAweDlFLCAweERGLCAweDlFLCAweEUwLCAvKiAweEE0LTB4QTcgKi8KKwkweDlFLCAweEUxLCAweDlFLCAweEUyLCAweDlFLCAweEUzLCAweEVDLCAweEM1LCAvKiAweEE4LTB4QUIgKi8KKwkweEJFLCAweEU2LCAweENDLCAweEJGLCAweEM1LCAweERBLCAweEJFLCAweEJDLCAvKiAweEFDLTB4QUYgKi8KKwkweDlFLCAweEU0LCAweEVDLCAweEM2LCAweDlFLCAweEU1LCAweEIxLCAweEZFLCAvKiAweEIwLTB4QjMgKi8KKwkweDlFLCAweEU2LCAweDlFLCAweEU3LCAweDlFLCAweEU4LCAweEVDLCAweEM0LCAvKiAweEI0LTB4QjcgKi8KKwkweEQ1LCAweEE4LCAweEI1LCAweEUzLCAweDlFLCAweEU5LCAweEVDLCAweEMyLCAvKiAweEI4LTB4QkIgKi8KKwkweEMxLCAweEI2LCAweEIzLCAweEUzLCAweDlFLCAweEVBLCAweDlFLCAweEVCLCAvKiAweEJDLTB4QkYgKi8KKwkweEVDLCAweEMzLCAweENCLCAweEI4LCAweEMwLCAweEMzLCAweENDLCAweEZFLCAvKiAweEMwLTB4QzMgKi8KKwkweDlFLCAweEVDLCAweDlFLCAweEVELCAweDlFLCAweEVFLCAweDlFLCAweEVGLCAvKiAweEM0LTB4QzcgKi8KKwkweEMxLCAweEQyLCAweDlFLCAweEYwLCAweEVDLCAweEM4LCAweDlFLCAweEYxLCAvKiAweEM4LTB4Q0IgKi8KKwkweDlFLCAweEYyLCAweDlFLCAweEYzLCAweDlFLCAweEY0LCAweDlFLCAweEY1LCAvKiAweENDLTB4Q0YgKi8KKwkweDlFLCAweEY2LCAweDlFLCAweEY3LCAweDlFLCAweEY4LCAweDlFLCAweEY5LCAvKiAweEQwLTB4RDMgKi8KKwkweDlFLCAweEZBLCAweDlFLCAweEZCLCAweDlFLCAweEZDLCAweDlFLCAweEZELCAvKiAweEQ0LTB4RDcgKi8KKwkweEJBLCAweEU2LCAweEMwLCAweEQzLCAweDlFLCAweEZFLCAweEQ2LCAweEYyLCAvKiAweEQ4LTB4REIgKi8KKwkweDlGLCAweDQwLCAweDlGLCAweDQxLCAweDlGLCAweDQyLCAweEQxLCAweENDLCAvKiAweERDLTB4REYgKi8KKwkweDlGLCAweDQzLCAweDlGLCAweDQ0LCAweDlGLCAweDQ1LCAweDlGLCAweDQ2LCAvKiAweEUwLTB4RTMgKi8KKwkweEJGLCAweEJFLCAweDlGLCAweDQ3LCAweEI3LCAweEIzLCAweEM5LCAweEQ1LCAvKiAweEU0LTB4RTcgKi8KKwkweEVDLCAweEM3LCAweEJCLCAweEUyLCAweDlGLCAweDQ4LCAweENDLCAweENDLCAvKiAweEU4LTB4RUIgKi8KKwkweEJELCAweEZELCAweEM4LCAweEM4LCAweDlGLCAweDQ5LCAweENGLCAweEE5LCAvKiAweEVDLTB4RUYgKi8KKwkweDlGLCAweDRBLCAweDlGLCAweDRCLCAweDlGLCAweDRDLCAweDlGLCAweDRELCAvKiAweEYwLTB4RjMgKi8KKwkweDlGLCAweDRFLCAweDlGLCAweDRGLCAweDlGLCAweDUwLCAweENELCAweEU5LCAvKiAweEY0LTB4RjcgKi8KKwkweDlGLCAweDUxLCAweEM1LCAweEVCLCAweDlGLCAweDUyLCAweDlGLCAweDUzLCAvKiAweEY4LTB4RkIgKi8KKwkweDlGLCAweDU0LCAweEI3LCAweEU5LCAweDlGLCAweDU1LCAweDlGLCAweDU2LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183MVs1MTJdID0geworCTB4OUYsIDB4NTcsIDB4OUYsIDB4NTgsIDB4OUYsIDB4NTksIDB4OUYsIDB4NUEsIC8qIDB4MDAtMHgwMyAqLworCTB4OUYsIDB4NUIsIDB4OUYsIDB4NUMsIDB4OUYsIDB4NUQsIDB4OUYsIDB4NUUsIC8qIDB4MDQtMHgwNyAqLworCTB4OUYsIDB4NUYsIDB4RDEsIDB4QzksIDB4QkEsIDB4QjgsIDB4OUYsIDB4NjAsIC8qIDB4MDgtMHgwQiAqLworCTB4OUYsIDB4NjEsIDB4OUYsIDB4NjIsIDB4OUYsIDB4NjMsIDB4OUYsIDB4NjQsIC8qIDB4MEMtMHgwRiAqLworCTB4RUMsIDB4QzksIDB4OUYsIDB4NjUsIDB4OUYsIDB4NjYsIDB4RUMsIDB4Q0EsIC8qIDB4MTAtMHgxMyAqLworCTB4OUYsIDB4NjcsIDB4QkIsIDB4QzAsIDB4RUMsIDB4Q0IsIDB4OUYsIDB4NjgsIC8qIDB4MTQtMHgxNyAqLworCTB4RUMsIDB4RTIsIDB4QjEsIDB4QkEsIDB4QjcsIDB4RDksIDB4OUYsIDB4NjksIC8qIDB4MTgtMHgxQiAqLworCTB4OUYsIDB4NkEsIDB4OUYsIDB4NkIsIDB4OUYsIDB4NkMsIDB4OUYsIDB4NkQsIC8qIDB4MUMtMHgxRiAqLworCTB4OUYsIDB4NkUsIDB4OUYsIDB4NkYsIDB4OUYsIDB4NzAsIDB4OUYsIDB4NzEsIC8qIDB4MjAtMHgyMyAqLworCTB4OUYsIDB4NzIsIDB4OUYsIDB4NzMsIDB4QkQsIDB4QjksIDB4OUYsIDB4NzQsIC8qIDB4MjQtMHgyNyAqLworCTB4OUYsIDB4NzUsIDB4OUYsIDB4NzYsIDB4OUYsIDB4NzcsIDB4OUYsIDB4NzgsIC8qIDB4MjgtMHgyQiAqLworCTB4OUYsIDB4NzksIDB4OUYsIDB4N0EsIDB4OUYsIDB4N0IsIDB4RUMsIDB4Q0MsIC8qIDB4MkMtMHgyRiAqLworCTB4RDEsIDB4RTYsIDB4RUMsIDB4Q0QsIDB4OUYsIDB4N0MsIDB4OUYsIDB4N0QsIC8qIDB4MzAtMHgzMyAqLworCTB4OUYsIDB4N0UsIDB4OUYsIDB4ODAsIDB4QzgsIDB4QkIsIDB4OUYsIDB4ODEsIC8qIDB4MzQtMHgzNyAqLworCTB4OUYsIDB4ODIsIDB4OUYsIDB4ODMsIDB4OUYsIDB4ODQsIDB4OUYsIDB4ODUsIC8qIDB4MzgtMHgzQiAqLworCTB4OUYsIDB4ODYsIDB4OUYsIDB4ODcsIDB4OUYsIDB4ODgsIDB4OUYsIDB4ODksIC8qIDB4M0MtMHgzRiAqLworCTB4OUYsIDB4OEEsIDB4OUYsIDB4OEIsIDB4OUYsIDB4OEMsIDB4OUYsIDB4OEQsIC8qIDB4NDAtMHg0MyAqLworCTB4OUYsIDB4OEUsIDB4RUMsIDB4RDEsIDB4OUYsIDB4OEYsIDB4OUYsIDB4OTAsIC8qIDB4NDQtMHg0NyAqLworCTB4OUYsIDB4OTEsIDB4OUYsIDB4OTIsIDB4RUMsIDB4RDMsIDB4OUYsIDB4OTMsIC8qIDB4NDgtMHg0QiAqLworCTB4QkIsIDB4Q0QsIDB4OUYsIDB4OTQsIDB4QkMsIDB4RTUsIDB4OUYsIDB4OTUsIC8qIDB4NEMtMHg0RiAqLworCTB4OUYsIDB4OTYsIDB4OUYsIDB4OTcsIDB4OUYsIDB4OTgsIDB4OUYsIDB4OTksIC8qIDB4NTAtMHg1MyAqLworCTB4OUYsIDB4OUEsIDB4OUYsIDB4OUIsIDB4OUYsIDB4OUMsIDB4OUYsIDB4OUQsIC8qIDB4NTQtMHg1NyAqLworCTB4OUYsIDB4OUUsIDB4OUYsIDB4OUYsIDB4OUYsIDB4QTAsIDB4OUYsIDB4QTEsIC8qIDB4NTgtMHg1QiAqLworCTB4RUMsIDB4Q0YsIDB4OUYsIDB4QTIsIDB4QzksIDB4QjcsIDB4OUYsIDB4QTMsIC8qIDB4NUMtMHg1RiAqLworCTB4OUYsIDB4QTQsIDB4OUYsIDB4QTUsIDB4OUYsIDB4QTYsIDB4OUYsIDB4QTcsIC8qIDB4NjAtMHg2MyAqLworCTB4QzMsIDB4QkEsIDB4OUYsIDB4QTgsIDB4RUMsIDB4RTMsIDB4RDUsIDB4RDUsIC8qIDB4NjQtMHg2NyAqLworCTB4RUMsIDB4RDAsIDB4OUYsIDB4QTksIDB4OUYsIDB4QUEsIDB4OUYsIDB4QUIsIC8qIDB4NjgtMHg2QiAqLworCTB4OUYsIDB4QUMsIDB4OUYsIDB4QUQsIDB4RDYsIDB4RjMsIDB4OUYsIDB4QUUsIC8qIDB4NkMtMHg2RiAqLworCTB4OUYsIDB4QUYsIDB4OUYsIDB4QjAsIDB4RUMsIDB4RDIsIDB4RUMsIDB4Q0UsIC8qIDB4NzAtMHg3MyAqLworCTB4OUYsIDB4QjEsIDB4OUYsIDB4QjIsIDB4OUYsIDB4QjMsIDB4OUYsIDB4QjQsIC8qIDB4NzQtMHg3NyAqLworCTB4RUMsIDB4RDQsIDB4OUYsIDB4QjUsIDB4RUMsIDB4RDUsIDB4OUYsIDB4QjYsIC8qIDB4NzgtMHg3QiAqLworCTB4OUYsIDB4QjcsIDB4QzksIDB4QkYsIDB4OUYsIDB4QjgsIDB4OUYsIDB4QjksIC8qIDB4N0MtMHg3RiAqLworCQorCTB4OUYsIDB4QkEsIDB4OUYsIDB4QkIsIDB4OUYsIDB4QkMsIDB4OUYsIDB4QkQsIC8qIDB4ODAtMHg4MyAqLworCTB4Q0YsIDB4QTgsIDB4OUYsIDB4QkUsIDB4OUYsIDB4QkYsIDB4OUYsIDB4QzAsIC8qIDB4ODQtMHg4NyAqLworCTB4OUYsIDB4QzEsIDB4OUYsIDB4QzIsIDB4RDAsIDB4REMsIDB4OUYsIDB4QzMsIC8qIDB4ODgtMHg4QiAqLworCTB4OUYsIDB4QzQsIDB4OUYsIDB4QzUsIDB4OUYsIDB4QzYsIDB4RDEsIDB4QUMsIC8qIDB4OEMtMHg4RiAqLworCTB4OUYsIDB4QzcsIDB4OUYsIDB4QzgsIDB4OUYsIDB4QzksIDB4OUYsIDB4Q0EsIC8qIDB4OTAtMHg5MyAqLworCTB4QzgsIDB4REIsIDB4OUYsIDB4Q0IsIDB4OUYsIDB4Q0MsIDB4OUYsIDB4Q0QsIC8qIDB4OTQtMHg5NyAqLworCTB4RUMsIDB4RDYsIDB4Q0UsIDB4RjUsIDB4OUYsIDB4Q0UsIDB4OUYsIDB4Q0YsIC8qIDB4OTgtMHg5QiAqLworCTB4OUYsIDB4RDAsIDB4OUYsIDB4RDEsIDB4OUYsIDB4RDIsIDB4Q0EsIDB4RUMsIC8qIDB4OUMtMHg5RiAqLworCTB4RUMsIDB4REEsIDB4OUYsIDB4RDMsIDB4OUYsIDB4RDQsIDB4OUYsIDB4RDUsIC8qIDB4QTAtMHhBMyAqLworCTB4OUYsIDB4RDYsIDB4OUYsIDB4RDcsIDB4OUYsIDB4RDgsIDB4OUYsIDB4RDksIC8qIDB4QTQtMHhBNyAqLworCTB4RUMsIDB4RDksIDB4OUYsIDB4REEsIDB4OUYsIDB4REIsIDB4OUYsIDB4REMsIC8qIDB4QTgtMHhBQiAqLworCTB4QjAsIDB4QkUsIDB4OUYsIDB4REQsIDB4OUYsIDB4REUsIDB4OUYsIDB4REYsIC8qIDB4QUMtMHhBRiAqLworCTB4OUYsIDB4RTAsIDB4OUYsIDB4RTEsIDB4OUYsIDB4RTIsIDB4RUMsIDB4RDcsIC8qIDB4QjAtMHhCMyAqLworCTB4OUYsIDB4RTMsIDB4RUMsIDB4RDgsIDB4OUYsIDB4RTQsIDB4OUYsIDB4RTUsIC8qIDB4QjQtMHhCNyAqLworCTB4OUYsIDB4RTYsIDB4RUMsIDB4RTQsIDB4OUYsIDB4RTcsIDB4OUYsIDB4RTgsIC8qIDB4QjgtMHhCQiAqLworCTB4OUYsIDB4RTksIDB4OUYsIDB4RUEsIDB4OUYsIDB4RUIsIDB4OUYsIDB4RUMsIC8qIDB4QkMtMHhCRiAqLworCTB4OUYsIDB4RUQsIDB4OUYsIDB4RUUsIDB4OUYsIDB4RUYsIDB4QzgsIDB4QkMsIC8qIDB4QzAtMHhDMyAqLworCTB4OUYsIDB4RjAsIDB4OUYsIDB4RjEsIDB4OUYsIDB4RjIsIDB4OUYsIDB4RjMsIC8qIDB4QzQtMHhDNyAqLworCTB4OUYsIDB4RjQsIDB4OUYsIDB4RjUsIDB4OUYsIDB4RjYsIDB4OUYsIDB4RjcsIC8qIDB4QzgtMHhDQiAqLworCTB4OUYsIDB4RjgsIDB4OUYsIDB4RjksIDB4QzEsIDB4QzcsIDB4OUYsIDB4RkEsIC8qIDB4Q0MtMHhDRiAqLworCTB4OUYsIDB4RkIsIDB4OUYsIDB4RkMsIDB4OUYsIDB4RkQsIDB4OUYsIDB4RkUsIC8qIDB4RDAtMHhEMyAqLworCTB4RUMsIDB4REMsIDB4RDEsIDB4RTAsIDB4QTAsIDB4NDAsIDB4QTAsIDB4NDEsIC8qIDB4RDQtMHhENyAqLworCTB4QTAsIDB4NDIsIDB4QTAsIDB4NDMsIDB4QTAsIDB4NDQsIDB4QTAsIDB4NDUsIC8qIDB4RDgtMHhEQiAqLworCTB4QTAsIDB4NDYsIDB4QTAsIDB4NDcsIDB4QTAsIDB4NDgsIDB4QTAsIDB4NDksIC8qIDB4REMtMHhERiAqLworCTB4RUMsIDB4REIsIDB4QTAsIDB4NEEsIDB4QTAsIDB4NEIsIDB4QTAsIDB4NEMsIC8qIDB4RTAtMHhFMyAqLworCTB4QTAsIDB4NEQsIDB4RDQsIDB4RUYsIDB4QTAsIDB4NEUsIDB4RUMsIDB4REQsIC8qIDB4RTQtMHhFNyAqLworCTB4QTAsIDB4NEYsIDB4QTAsIDB4NTAsIDB4QTAsIDB4NTEsIDB4QTAsIDB4NTIsIC8qIDB4RTgtMHhFQiAqLworCTB4QTAsIDB4NTMsIDB4QTAsIDB4NTQsIDB4REIsIDB4QzYsIDB4QTAsIDB4NTUsIC8qIDB4RUMtMHhFRiAqLworCTB4QTAsIDB4NTYsIDB4QTAsIDB4NTcsIDB4QTAsIDB4NTgsIDB4QTAsIDB4NTksIC8qIDB4RjAtMHhGMyAqLworCTB4QTAsIDB4NUEsIDB4QTAsIDB4NUIsIDB4QTAsIDB4NUMsIDB4QTAsIDB4NUQsIC8qIDB4RjQtMHhGNyAqLworCTB4QTAsIDB4NUUsIDB4RUMsIDB4REUsIDB4QTAsIDB4NUYsIDB4QTAsIDB4NjAsIC8qIDB4RjgtMHhGQiAqLworCTB4QTAsIDB4NjEsIDB4QTAsIDB4NjIsIDB4QTAsIDB4NjMsIDB4QTAsIDB4NjQsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzcyWzUxMl0gPSB7CisJMHhBMCwgMHg2NSwgMHhBMCwgMHg2NiwgMHhBMCwgMHg2NywgMHhBMCwgMHg2OCwgLyogMHgwMC0weDAzICovCisJMHhBMCwgMHg2OSwgMHhBMCwgMHg2QSwgMHhCMSwgMHhBQywgMHhBMCwgMHg2QiwgLyogMHgwNC0weDA3ICovCisJMHhBMCwgMHg2QywgMHhBMCwgMHg2RCwgMHhBMCwgMHg2RSwgMHhBMCwgMHg2RiwgLyogMHgwOC0weDBCICovCisJMHhBMCwgMHg3MCwgMHhBMCwgMHg3MSwgMHhBMCwgMHg3MiwgMHhBMCwgMHg3MywgLyogMHgwQy0weDBGICovCisJMHhBMCwgMHg3NCwgMHhBMCwgMHg3NSwgMHhBMCwgMHg3NiwgMHhBMCwgMHg3NywgLyogMHgxMC0weDEzICovCisJMHhBMCwgMHg3OCwgMHhBMCwgMHg3OSwgMHhBMCwgMHg3QSwgMHhBMCwgMHg3QiwgLyogMHgxNC0weDE3ICovCisJMHhBMCwgMHg3QywgMHhBMCwgMHg3RCwgMHhBMCwgMHg3RSwgMHhBMCwgMHg4MCwgLyogMHgxOC0weDFCICovCisJMHhBMCwgMHg4MSwgMHhFQywgMHhERiwgMHhBMCwgMHg4MiwgMHhBMCwgMHg4MywgLyogMHgxQy0weDFGICovCisJMHhBMCwgMHg4NCwgMHhBMCwgMHg4NSwgMHhBMCwgMHg4NiwgMHhBMCwgMHg4NywgLyogMHgyMC0weDIzICovCisJMHhBMCwgMHg4OCwgMHhBMCwgMHg4OSwgMHhBMCwgMHg4QSwgMHhBMCwgMHg4QiwgLyogMHgyNC0weDI3ICovCisJMHhFQywgMHhFMCwgMHhBMCwgMHg4QywgMHhENywgMHhBNiwgMHhBMCwgMHg4RCwgLyogMHgyOC0weDJCICovCisJMHhDNSwgMHhDMCwgMHhBMCwgMHg4RSwgMHhBMCwgMHg4RiwgMHhBMCwgMHg5MCwgLyogMHgyQy0weDJGICovCisJMHhFQiwgMHhCQywgMHhCMCwgMHhBRSwgMHhBMCwgMHg5MSwgMHhBMCwgMHg5MiwgLyogMHgzMC0weDMzICovCisJMHhBMCwgMHg5MywgMHhCRSwgMHhGNCwgMHhCOCwgMHhCOCwgMHhEMiwgMHhBRiwgLyogMHgzNC0weDM3ICovCisJMHhCMCwgMHhENiwgMHhCNSwgMHhGOSwgMHhBMCwgMHg5NCwgMHhEOCwgMHhCMywgLyogMHgzOC0weDNCICovCisJMHhBMCwgMHg5NSwgMHhDQiwgMHhBQywgMHhBMCwgMHg5NiwgMHhFMywgMHhERCwgLyogMHgzQy0weDNGICovCisJMHhBMCwgMHg5NywgMHhBMCwgMHg5OCwgMHhBMCwgMHg5OSwgMHhBMCwgMHg5QSwgLyogMHg0MC0weDQzICovCisJMHhBMCwgMHg5QiwgMHhBMCwgMHg5QywgMHhBMCwgMHg5RCwgMHhDNiwgMHhBQywgLyogMHg0NC0weDQ3ICovCisJMHhCMCwgMHhFNiwgMHhBMCwgMHg5RSwgMHhBMCwgMHg5RiwgMHhBMCwgMHhBMCwgLyogMHg0OC0weDRCICovCisJMHhDNSwgMHhDNiwgMHhFQiwgMHhCOSwgMHhBMCwgMHhBMSwgMHhBMCwgMHhBMiwgLyogMHg0Qy0weDRGICovCisJMHhBMCwgMHhBMywgMHhBMCwgMHhBNCwgMHhFQiwgMHhCQSwgMHhBMCwgMHhBNSwgLyogMHg1MC0weDUzICovCisJMHhBMCwgMHhBNiwgMHhBMCwgMHhBNywgMHhFQiwgMHhCQiwgMHhBMCwgMHhBOCwgLyogMHg1NC0weDU3ICovCisJMHhBMCwgMHhBOSwgMHhEMSwgMHhDMCwgMHhBMCwgMHhBQSwgMHhDNSwgMHhBMywgLyogMHg1OC0weDVCICovCisJMHhBMCwgMHhBQiwgMHhFQSwgMHhGMiwgMHhBMCwgMHhBQywgMHhDNCwgMHhCMiwgLyogMHg1Qy0weDVGICovCisJMHhBMCwgMHhBRCwgMHhDNCwgMHhCNSwgMHhDMCwgMHhDRSwgMHhBMCwgMHhBRSwgLyogMHg2MC0weDYzICovCisJMHhBMCwgMHhBRiwgMHhBMCwgMHhCMCwgMHhFQSwgMHhGMywgMHhDNCwgMHhDMSwgLyogMHg2NC0weDY3ICovCisJMHhBMCwgMHhCMSwgMHhDRSwgMHhFRiwgMHhBMCwgMHhCMiwgMHhBMCwgMHhCMywgLyogMHg2OC0weDZCICovCisJMHhBMCwgMHhCNCwgMHhBMCwgMHhCNSwgMHhFQSwgMHhGMCwgMHhFQSwgMHhGNCwgLyogMHg2Qy0weDZGICovCisJMHhBMCwgMHhCNiwgMHhBMCwgMHhCNywgMHhDOSwgMHhGQywgMHhBMCwgMHhCOCwgLyogMHg3MC0weDczICovCisJMHhBMCwgMHhCOSwgMHhDNywgMHhBMywgMHhBMCwgMHhCQSwgMHhBMCwgMHhCQiwgLyogMHg3NC0weDc3ICovCisJMHhBMCwgMHhCQywgMHhDQywgMHhEOCwgMHhDRSwgMHhGRSwgMHhBMCwgMHhCRCwgLyogMHg3OC0weDdCICovCisJMHhBMCwgMHhCRSwgMHhBMCwgMHhCRiwgMHhFQSwgMHhGNSwgMHhFQSwgMHhGNiwgLyogMHg3Qy0weDdGICovCisJCisJMHhDRiwgMHhBQywgMHhDMCwgMHhFNywgMHhBMCwgMHhDMCwgMHhBMCwgMHhDMSwgLyogMHg4MC0weDgzICovCisJMHhFQSwgMHhGNywgMHhBMCwgMHhDMiwgMHhBMCwgMHhDMywgMHhBMCwgMHhDNCwgLyogMHg4NC0weDg3ICovCisJMHhBMCwgMHhDNSwgMHhBMCwgMHhDNiwgMHhCNiwgMHhCRiwgMHhFQSwgMHhGOCwgLyogMHg4OC0weDhCICovCisJMHhBMCwgMHhDNywgMHhFQSwgMHhGOSwgMHhBMCwgMHhDOCwgMHhFQSwgMHhGQSwgLyogMHg4Qy0weDhGICovCisJMHhBMCwgMHhDOSwgMHhBMCwgMHhDQSwgMHhFQSwgMHhGQiwgMHhBMCwgMHhDQiwgLyogMHg5MC0weDkzICovCisJMHhBMCwgMHhDQywgMHhBMCwgMHhDRCwgMHhBMCwgMHhDRSwgMHhBMCwgMHhDRiwgLyogMHg5NC0weDk3ICovCisJMHhBMCwgMHhEMCwgMHhBMCwgMHhEMSwgMHhBMCwgMHhEMiwgMHhBMCwgMHhEMywgLyogMHg5OC0weDlCICovCisJMHhBMCwgMHhENCwgMHhBMCwgMHhENSwgMHhBMCwgMHhENiwgMHhFQSwgMHhGMSwgLyogMHg5Qy0weDlGICovCisJMHhBMCwgMHhENywgMHhBMCwgMHhEOCwgMHhBMCwgMHhEOSwgMHhBMCwgMHhEQSwgLyogMHhBMC0weEEzICovCisJMHhBMCwgMHhEQiwgMHhBMCwgMHhEQywgMHhBMCwgMHhERCwgMHhBMCwgMHhERSwgLyogMHhBNC0weEE3ICovCisJMHhBMCwgMHhERiwgMHhBMCwgMHhFMCwgMHhBMCwgMHhFMSwgMHhBMCwgMHhFMiwgLyogMHhBOC0weEFCICovCisJMHhDOCwgMHhBRSwgMHhFMSwgMHhFQiwgMHhBMCwgMHhFMywgMHhCNywgMHhCOCwgLyogMHhBQy0weEFGICovCisJMHhFMSwgMHhFQywgMHhBMCwgMHhFNCwgMHhBMCwgMHhFNSwgMHhBMCwgMHhFNiwgLyogMHhCMC0weEIzICovCisJMHhFMSwgMHhFRCwgMHhBMCwgMHhFNywgMHhENywgMHhCNCwgMHhFMSwgMHhFRSwgLyogMHhCNC0weEI3ICovCisJMHhFMSwgMHhFRiwgMHhEMywgMHhDQywgMHhBMCwgMHhFOCwgMHhBMCwgMHhFOSwgLyogMHhCOC0weEJCICovCisJMHhBMCwgMHhFQSwgMHhBMCwgMHhFQiwgMHhBMCwgMHhFQywgMHhBMCwgMHhFRCwgLyogMHhCQy0weEJGICovCisJMHhBMCwgMHhFRSwgMHhFMSwgMHhGMSwgMHhCRiwgMHhGMSwgMHhFMSwgMHhGMCwgLyogMHhDMC0weEMzICovCisJMHhCNSwgMHhEMiwgMHhBMCwgMHhFRiwgMHhBMCwgMHhGMCwgMHhBMCwgMHhGMSwgLyogMHhDNC0weEM3ICovCisJMHhCMSwgMHhCNywgMHhBMCwgMHhGMiwgMHhBMCwgMHhGMywgMHhBMCwgMHhGNCwgLyogMHhDOC0weENCICovCisJMHhBMCwgMHhGNSwgMHhFMSwgMHhGMywgMHhFMSwgMHhGMiwgMHhBMCwgMHhGNiwgLyogMHhDQy0weENGICovCisJMHhCQSwgMHhGQywgMHhBMCwgMHhGNywgMHhFMSwgMHhGNCwgMHhBMCwgMHhGOCwgLyogMHhEMC0weEQzICovCisJMHhBMCwgMHhGOSwgMHhBMCwgMHhGQSwgMHhBMCwgMHhGQiwgMHhCOSwgMHhCNywgLyogMHhENC0weEQ3ICovCisJMHhBMCwgMHhGQywgMHhCRSwgMHhEMSwgMHhBMCwgMHhGRCwgMHhBMCwgMHhGRSwgLyogMHhEOC0weERCICovCisJMHhBQSwgMHg0MCwgMHhBQSwgMHg0MSwgMHhDNCwgMHhGQywgMHhBQSwgMHg0MiwgLyogMHhEQy0weERGICovCisJMHhCQSwgMHhERCwgMHhCRCwgMHhDNiwgMHhBQSwgMHg0MywgMHhBQSwgMHg0NCwgLyogMHhFMC0weEUzICovCisJMHhBQSwgMHg0NSwgMHhBQSwgMHg0NiwgMHhBQSwgMHg0NywgMHhBQSwgMHg0OCwgLyogMHhFNC0weEU3ICovCisJMHhFMSwgMHhGNSwgMHhFMSwgMHhGNywgMHhBQSwgMHg0OSwgMHhBQSwgMHg0QSwgLyogMHhFOC0weEVCICovCisJMHhCNiwgMHhDMCwgMHhDRiwgMHhDMSwgMHhDQSwgMHhBOCwgMHhFMSwgMHhGNiwgLyogMHhFQy0weEVGICovCisJMHhENSwgMHhGOCwgMHhEMywgMHhGQywgMHhFMSwgMHhGOCwgMHhFMSwgMHhGQywgLyogMHhGMC0weEYzICovCisJMHhFMSwgMHhGOSwgMHhBQSwgMHg0QiwgMHhBQSwgMHg0QywgMHhFMSwgMHhGQSwgLyogMHhGNC0weEY3ICovCisJMHhDMCwgMHhFQSwgMHhBQSwgMHg0RCwgMHhFMSwgMHhGRSwgMHhFMiwgMHhBMSwgLyogMHhGOC0weEZCICovCisJMHhDMCwgMHhDNywgMHhBQSwgMHg0RSwgMHhBQSwgMHg0RiwgMHhBQSwgMHg1MCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNzNbNTEyXSA9IHsKKwkweEFBLCAweDUxLCAweEUxLCAweEZCLCAweEFBLCAweDUyLCAweEUxLCAweEZELCAvKiAweDAwLTB4MDMgKi8KKwkweEFBLCAweDUzLCAweEFBLCAweDU0LCAweEFBLCAweDU1LCAweEFBLCAweDU2LCAvKiAweDA0LTB4MDcgKi8KKwkweEFBLCAweDU3LCAweEFBLCAweDU4LCAweEUyLCAweEE1LCAweEFBLCAweDU5LCAvKiAweDA4LTB4MEIgKi8KKwkweEFBLCAweDVBLCAweEFBLCAweDVCLCAweEMxLCAweEQ0LCAweEFBLCAweDVDLCAvKiAweDBDLTB4MEYgKi8KKwkweEFBLCAweDVELCAweEFBLCAweDVFLCAweEFBLCAweDVGLCAweEUyLCAweEEzLCAvKiAweDEwLTB4MTMgKi8KKwkweEFBLCAweDYwLCAweEUyLCAweEE4LCAweEIyLCAweEZFLCAweEUyLCAweEEyLCAvKiAweDE0LTB4MTcgKi8KKwkweEFBLCAweDYxLCAweEFBLCAweDYyLCAweEFBLCAweDYzLCAweEMzLCAweENELCAvKiAweDE4LTB4MUIgKi8KKwkweEIyLCAweEMyLCAweEUyLCAweEE3LCAweEUyLCAweEE2LCAweEFBLCAweDY0LCAvKiAweDFDLTB4MUYgKi8KKwkweEFBLCAweDY1LCAweEUyLCAweEE0LCAweEUyLCAweEE5LCAweEFBLCAweDY2LCAvKiAweDIwLTB4MjMgKi8KKwkweEFBLCAweDY3LCAweEUyLCAweEFCLCAweEFBLCAweDY4LCAweEFBLCAweDY5LCAvKiAweDI0LTB4MjcgKi8KKwkweEFBLCAweDZBLCAweEQwLCAweEM5LCAweEQ2LCAweEVELCAweEMzLCAweEE4LCAvKiAweDI4LTB4MkIgKi8KKwkweEUyLCAweEFDLCAweEFBLCAweDZCLCAweENGLCAweEQ3LCAweEFBLCAweDZDLCAvKiAweDJDLTB4MkYgKi8KKwkweEFBLCAweDZELCAweEUyLCAweEFFLCAweEFBLCAweDZFLCAweEFBLCAweDZGLCAvKiAweDMwLTB4MzMgKi8KKwkweEJBLCAweEVGLCAweEFBLCAweDcwLCAweEFBLCAweDcxLCAweEU5LCAweEUwLCAvKiAweDM0LTB4MzcgKi8KKwkweEUyLCAweEFELCAweEUyLCAweEFBLCAweEFBLCAweDcyLCAweEFBLCAweDczLCAvKiAweDM4LTB4M0IgKi8KKwkweEFBLCAweDc0LCAweEFBLCAweDc1LCAweEJCLCAweEFCLCAweEQ0LCAweEIzLCAvKiAweDNDLTB4M0YgKi8KKwkweEFBLCAweDc2LCAweEFBLCAweDc3LCAweEFBLCAweDc4LCAweEFBLCAweDc5LCAvKiAweDQwLTB4NDMgKi8KKwkweEFBLCAweDdBLCAweEFBLCAweDdCLCAweEFBLCAweDdDLCAweEFBLCAweDdELCAvKiAweDQ0LTB4NDcgKi8KKwkweEFBLCAweDdFLCAweEFBLCAweDgwLCAweEFBLCAweDgxLCAweEFBLCAweDgyLCAvKiAweDQ4LTB4NEIgKi8KKwkweEFBLCAweDgzLCAweEUyLCAweEIwLCAweEFBLCAweDg0LCAweEFBLCAweDg1LCAvKiAweDRDLTB4NEYgKi8KKwkweEUyLCAweEFGLCAweEFBLCAweDg2LCAweEU5LCAweEUxLCAweEFBLCAweDg3LCAvKiAweDUwLTB4NTMgKi8KKwkweEFBLCAweDg4LCAweEFBLCAweDg5LCAweEFBLCAweDhBLCAweEUyLCAweEIxLCAvKiAweDU0LTB4NTcgKi8KKwkweEFBLCAweDhCLCAweEFBLCAweDhDLCAweEFBLCAweDhELCAweEFBLCAweDhFLCAvKiAweDU4LTB4NUIgKi8KKwkweEFBLCAweDhGLCAweEFBLCAweDkwLCAweEFBLCAweDkxLCAweEFBLCAweDkyLCAvKiAweDVDLTB4NUYgKi8KKwkweEUyLCAweEIyLCAweEFBLCAweDkzLCAweEFBLCAweDk0LCAweEFBLCAweDk1LCAvKiAweDYwLTB4NjMgKi8KKwkweEFBLCAweDk2LCAweEFBLCAweDk3LCAweEFBLCAweDk4LCAweEFBLCAweDk5LCAvKiAweDY0LTB4NjcgKi8KKwkweEFBLCAweDlBLCAweEFBLCAweDlCLCAweEFBLCAweDlDLCAweEFBLCAweDlELCAvKiAweDY4LTB4NkIgKi8KKwkweEUyLCAweEIzLCAweENDLCAweEExLCAweEFBLCAweDlFLCAweEUyLCAweEI0LCAvKiAweDZDLTB4NkYgKi8KKwkweEFBLCAweDlGLCAweEFBLCAweEEwLCAweEFCLCAweDQwLCAweEFCLCAweDQxLCAvKiAweDcwLTB4NzMgKi8KKwkweEFCLCAweDQyLCAweEFCLCAweDQzLCAweEFCLCAweDQ0LCAweEFCLCAweDQ1LCAvKiAweDc0LTB4NzcgKi8KKwkweEFCLCAweDQ2LCAweEFCLCAweDQ3LCAweEFCLCAweDQ4LCAweEFCLCAweDQ5LCAvKiAweDc4LTB4N0IgKi8KKwkweEFCLCAweDRBLCAweEFCLCAweDRCLCAweEUyLCAweEI1LCAweEFCLCAweDRDLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEFCLCAweDRELCAweEFCLCAweDRFLCAweEFCLCAweDRGLCAweEFCLCAweDUwLCAvKiAweDgwLTB4ODMgKi8KKwkweEQwLCAweEZFLCAweEFCLCAweDUxLCAweEFCLCAweDUyLCAweEMyLCAweENBLCAvKiAweDg0LTB4ODcgKi8KKwkweEFCLCAweDUzLCAweEQzLCAweEYxLCAweEFCLCAweDU0LCAweENELCAweEY1LCAvKiAweDg4LTB4OEIgKi8KKwkweEFCLCAweDU1LCAweEFCLCAweDU2LCAweEU3LCAweEUwLCAweEFCLCAweDU3LCAvKiAweDhDLTB4OEYgKi8KKwkweEFCLCAweDU4LCAweEU3LCAweEUxLCAweEFCLCAweDU5LCAweEFCLCAweDVBLCAvKiAweDkwLTB4OTMgKi8KKwkweEFCLCAweDVCLCAweEFCLCAweDVDLCAweEJFLCAweEMxLCAweEFCLCAweDVELCAvKiAweDk0LTB4OTcgKi8KKwkweEFCLCAweDVFLCAweEFCLCAweDVGLCAweEFCLCAweDYwLCAweEMyLCAweEVBLCAvKiAweDk4LTB4OUIgKi8KKwkweEFCLCAweDYxLCAweEFCLCAweDYyLCAweEFCLCAweDYzLCAweEU3LCAweEU0LCAvKiAweDlDLTB4OUYgKi8KKwkweEFCLCAweDY0LCAweEFCLCAweDY1LCAweEU3LCAweEUzLCAweEFCLCAweDY2LCAvKiAweEEwLTB4QTMgKi8KKwkweEFCLCAweDY3LCAweEFCLCAweDY4LCAweEFCLCAweDY5LCAweEFCLCAweDZBLCAvKiAweEE0LTB4QTcgKi8KKwkweEFCLCAweDZCLCAweENELCAweEU2LCAweEFCLCAweDZDLCAweEMzLCAweEI1LCAvKiAweEE4LTB4QUIgKi8KKwkweEFCLCAweDZELCAweEFCLCAweDZFLCAweEU3LCAweEUyLCAweEJCLCAweEI3LCAvKiAweEFDLTB4QUYgKi8KKwkweENGLCAweEQ2LCAweEFCLCAweDZGLCAweEMxLCAweEUxLCAweEU3LCAweEU5LCAvKiAweEIwLTB4QjMgKi8KKwkweEFCLCAweDcwLCAweEFCLCAweDcxLCAweEFCLCAweDcyLCAweEU3LCAweEU4LCAvKiAweEI0LTB4QjcgKi8KKwkweEFCLCAweDczLCAweEFCLCAweDc0LCAweEU3LCAweEY0LCAweEIyLCAweEEzLCAvKiAweEI4LTB4QkIgKi8KKwkweEFCLCAweDc1LCAweEFCLCAweDc2LCAweEFCLCAweDc3LCAweEFCLCAweDc4LCAvKiAweEJDLTB4QkYgKi8KKwkweEU3LCAweEVBLCAweEFCLCAweDc5LCAweEU3LCAweEU2LCAweEFCLCAweDdBLCAvKiAweEMwLTB4QzMgKi8KKwkweEFCLCAweDdCLCAweEFCLCAweDdDLCAweEFCLCAweDdELCAweEFCLCAweDdFLCAvKiAweEM0LTB4QzcgKi8KKwkweEU3LCAweEVDLCAweEU3LCAweEVCLCAweEM5LCAweEJBLCAweEFCLCAweDgwLCAvKiAweEM4LTB4Q0IgKi8KKwkweEFCLCAweDgxLCAweEQ1LCAweEU0LCAweEFCLCAweDgyLCAweEU3LCAweEU1LCAvKiAweENDLTB4Q0YgKi8KKwkweEI3LCAweEE5LCAweEU3LCAweEU3LCAweEFCLCAweDgzLCAweEFCLCAweDg0LCAvKiAweEQwLTB4RDMgKi8KKwkweEFCLCAweDg1LCAweEFCLCAweDg2LCAweEFCLCAweDg3LCAweEFCLCAweDg4LCAvKiAweEQ0LTB4RDcgKi8KKwkweEFCLCAweDg5LCAweEU3LCAweEVFLCAweEFCLCAweDhBLCAweEFCLCAweDhCLCAvKiAweEQ4LTB4REIgKi8KKwkweEFCLCAweDhDLCAweEFCLCAweDhELCAweEU3LCAweEYzLCAweEFCLCAweDhFLCAvKiAweERDLTB4REYgKi8KKwkweEQ2LCAweEU5LCAweEFCLCAweDhGLCAweEFCLCAweDkwLCAweEFCLCAweDkxLCAvKiAweEUwLTB4RTMgKi8KKwkweEFCLCAweDkyLCAweEU3LCAweEVELCAweEFCLCAweDkzLCAweEU3LCAweEYyLCAvKiAweEU0LTB4RTcgKi8KKwkweEFCLCAweDk0LCAweEU3LCAweEYxLCAweEFCLCAweDk1LCAweEFCLCAweDk2LCAvKiAweEU4LTB4RUIgKi8KKwkweEFCLCAweDk3LCAweEIwLCAweEUwLCAweEFCLCAweDk4LCAweEFCLCAweDk5LCAvKiAweEVDLTB4RUYgKi8KKwkweEFCLCAweDlBLCAweEFCLCAweDlCLCAweEU3LCAweEY1LCAweEFCLCAweDlDLCAvKiAweEYwLTB4RjMgKi8KKwkweEFCLCAweDlELCAweEFCLCAweDlFLCAweEFCLCAweDlGLCAweEFCLCAweEEwLCAvKiAweEY0LTB4RjcgKi8KKwkweEFDLCAweDQwLCAweEFDLCAweDQxLCAweEFDLCAweDQyLCAweEFDLCAweDQzLCAvKiAweEY4LTB4RkIgKi8KKwkweEFDLCAweDQ0LCAweEFDLCAweDQ1LCAweEFDLCAweDQ2LCAweEFDLCAweDQ3LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183NFs1MTJdID0geworCTB4QUMsIDB4NDgsIDB4QUMsIDB4NDksIDB4QUMsIDB4NEEsIDB4QzcsIDB4RjIsIC8qIDB4MDAtMHgwMyAqLworCTB4QUMsIDB4NEIsIDB4QzAsIDB4QzUsIDB4QzAsIDB4RUQsIDB4QUMsIDB4NEMsIC8qIDB4MDQtMHgwNyAqLworCTB4QUMsIDB4NEQsIDB4QzEsIDB4RjAsIDB4RTcsIDB4RjAsIDB4QUMsIDB4NEUsIC8qIDB4MDgtMHgwQiAqLworCTB4QUMsIDB4NEYsIDB4QUMsIDB4NTAsIDB4QUMsIDB4NTEsIDB4RTcsIDB4RjYsIC8qIDB4MEMtMHgwRiAqLworCTB4Q0IsIDB4RjYsIDB4QUMsIDB4NTIsIDB4QUMsIDB4NTMsIDB4QUMsIDB4NTQsIC8qIDB4MTAtMHgxMyAqLworCTB4QUMsIDB4NTUsIDB4QUMsIDB4NTYsIDB4QUMsIDB4NTcsIDB4QUMsIDB4NTgsIC8qIDB4MTQtMHgxNyAqLworCTB4QUMsIDB4NTksIDB4QUMsIDB4NUEsIDB4RTgsIDB4QTIsIDB4RTgsIDB4QTEsIC8qIDB4MTgtMHgxQiAqLworCTB4QUMsIDB4NUIsIDB4QUMsIDB4NUMsIDB4QUMsIDB4NUQsIDB4QUMsIDB4NUUsIC8qIDB4MUMtMHgxRiAqLworCTB4QUMsIDB4NUYsIDB4QUMsIDB4NjAsIDB4RDcsIDB4QzEsIDB4QUMsIDB4NjEsIC8qIDB4MjAtMHgyMyAqLworCTB4QUMsIDB4NjIsIDB4RTcsIDB4RkEsIDB4RTcsIDB4RjksIDB4QUMsIDB4NjMsIC8qIDB4MjQtMHgyNyAqLworCTB4RTcsIDB4RkIsIDB4QUMsIDB4NjQsIDB4RTcsIDB4RjcsIDB4QUMsIDB4NjUsIC8qIDB4MjgtMHgyQiAqLworCTB4RTcsIDB4RkUsIDB4QUMsIDB4NjYsIDB4RTcsIDB4RkQsIDB4QUMsIDB4NjcsIC8qIDB4MkMtMHgyRiAqLworCTB4RTcsIDB4RkMsIDB4QUMsIDB4NjgsIDB4QUMsIDB4NjksIDB4QzEsIDB4RDUsIC8qIDB4MzAtMHgzMyAqLworCTB4QzcsIDB4RDksIDB4QzUsIDB4RkQsIDB4QzUsIDB4QzMsIDB4QUMsIDB4NkEsIC8qIDB4MzQtMHgzNyAqLworCTB4QUMsIDB4NkIsIDB4QUMsIDB4NkMsIDB4QUMsIDB4NkQsIDB4QUMsIDB4NkUsIC8qIDB4MzgtMHgzQiAqLworCTB4QzcsIDB4RUQsIDB4QUMsIDB4NkYsIDB4QUMsIDB4NzAsIDB4QUMsIDB4NzEsIC8qIDB4M0MtMHgzRiAqLworCTB4QUMsIDB4NzIsIDB4RTgsIDB4QTMsIDB4QUMsIDB4NzMsIDB4QUMsIDB4NzQsIC8qIDB4NDAtMHg0MyAqLworCTB4QUMsIDB4NzUsIDB4QUMsIDB4NzYsIDB4QUMsIDB4NzcsIDB4QUMsIDB4NzgsIC8qIDB4NDQtMHg0NyAqLworCTB4QUMsIDB4NzksIDB4QUMsIDB4N0EsIDB4QUMsIDB4N0IsIDB4QUMsIDB4N0MsIC8qIDB4NDgtMHg0QiAqLworCTB4QUMsIDB4N0QsIDB4QUMsIDB4N0UsIDB4QUMsIDB4ODAsIDB4QUMsIDB4ODEsIC8qIDB4NEMtMHg0RiAqLworCTB4QUMsIDB4ODIsIDB4QUMsIDB4ODMsIDB4QUMsIDB4ODQsIDB4QUMsIDB4ODUsIC8qIDB4NTAtMHg1MyAqLworCTB4QUMsIDB4ODYsIDB4RTgsIDB4QTYsIDB4QUMsIDB4ODcsIDB4RTgsIDB4QTUsIC8qIDB4NTQtMHg1NyAqLworCTB4QUMsIDB4ODgsIDB4RTgsIDB4QTcsIDB4QkEsIDB4RjcsIDB4RTcsIDB4RjgsIC8qIDB4NTgtMHg1QiAqLworCTB4RTgsIDB4QTQsIDB4QUMsIDB4ODksIDB4QzgsIDB4RjAsIDB4QzksIDB4QUEsIC8qIDB4NUMtMHg1RiAqLworCTB4QUMsIDB4OEEsIDB4QUMsIDB4OEIsIDB4QUMsIDB4OEMsIDB4QUMsIDB4OEQsIC8qIDB4NjAtMHg2MyAqLworCTB4QUMsIDB4OEUsIDB4QUMsIDB4OEYsIDB4QUMsIDB4OTAsIDB4QUMsIDB4OTEsIC8qIDB4NjQtMHg2NyAqLworCTB4QUMsIDB4OTIsIDB4QUMsIDB4OTMsIDB4QUMsIDB4OTQsIDB4QUMsIDB4OTUsIC8qIDB4NjgtMHg2QiAqLworCTB4QUMsIDB4OTYsIDB4RTgsIDB4QTksIDB4QUMsIDB4OTcsIDB4QUMsIDB4OTgsIC8qIDB4NkMtMHg2RiAqLworCTB4QjksIDB4RTUsIDB4QUMsIDB4OTksIDB4QUMsIDB4OUEsIDB4QUMsIDB4OUIsIC8qIDB4NzAtMHg3MyAqLworCTB4QUMsIDB4OUMsIDB4QUMsIDB4OUQsIDB4RDEsIDB4RkUsIDB4RTgsIDB4QTgsIC8qIDB4NzQtMHg3NyAqLworCTB4QUMsIDB4OUUsIDB4QUMsIDB4OUYsIDB4QUMsIDB4QTAsIDB4QUQsIDB4NDAsIC8qIDB4NzgtMHg3QiAqLworCTB4QUQsIDB4NDEsIDB4QUQsIDB4NDIsIDB4RTgsIDB4QUEsIDB4QUQsIDB4NDMsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RTgsIDB4QUQsIDB4RTgsIDB4QUUsIDB4QUQsIDB4NDQsIDB4QzEsIDB4QTcsIC8qIDB4ODAtMHg4MyAqLworCTB4QUQsIDB4NDUsIDB4QUQsIDB4NDYsIDB4QUQsIDB4NDcsIDB4RTgsIDB4QUYsIC8qIDB4ODQtMHg4NyAqLworCTB4QUQsIDB4NDgsIDB4QUQsIDB4NDksIDB4QUQsIDB4NEEsIDB4RTgsIDB4QjAsIC8qIDB4ODgtMHg4QiAqLworCTB4QUQsIDB4NEIsIDB4QUQsIDB4NEMsIDB4RTgsIDB4QUMsIDB4QUQsIDB4NEQsIC8qIDB4OEMtMHg4RiAqLworCTB4RTgsIDB4QjQsIDB4QUQsIDB4NEUsIDB4QUQsIDB4NEYsIDB4QUQsIDB4NTAsIC8qIDB4OTAtMHg5MyAqLworCTB4QUQsIDB4NTEsIDB4QUQsIDB4NTIsIDB4QUQsIDB4NTMsIDB4QUQsIDB4NTQsIC8qIDB4OTQtMHg5NyAqLworCTB4QUQsIDB4NTUsIDB4QUQsIDB4NTYsIDB4QUQsIDB4NTcsIDB4QUQsIDB4NTgsIC8qIDB4OTgtMHg5QiAqLworCTB4RTgsIDB4QUIsIDB4QUQsIDB4NTksIDB4RTgsIDB4QjEsIDB4QUQsIDB4NUEsIC8qIDB4OUMtMHg5RiAqLworCTB4QUQsIDB4NUIsIDB4QUQsIDB4NUMsIDB4QUQsIDB4NUQsIDB4QUQsIDB4NUUsIC8qIDB4QTAtMHhBMyAqLworCTB4QUQsIDB4NUYsIDB4QUQsIDB4NjAsIDB4QUQsIDB4NjEsIDB4RTgsIDB4QjUsIC8qIDB4QTQtMHhBNyAqLworCTB4RTgsIDB4QjIsIDB4RTgsIDB4QjMsIDB4QUQsIDB4NjIsIDB4QUQsIDB4NjMsIC8qIDB4QTgtMHhBQiAqLworCTB4QUQsIDB4NjQsIDB4QUQsIDB4NjUsIDB4QUQsIDB4NjYsIDB4QUQsIDB4NjcsIC8qIDB4QUMtMHhBRiAqLworCTB4QUQsIDB4NjgsIDB4QUQsIDB4NjksIDB4QUQsIDB4NkEsIDB4QUQsIDB4NkIsIC8qIDB4QjAtMHhCMyAqLworCTB4QUQsIDB4NkMsIDB4QUQsIDB4NkQsIDB4QUQsIDB4NkUsIDB4QUQsIDB4NkYsIC8qIDB4QjQtMHhCNyAqLworCTB4QUQsIDB4NzAsIDB4QUQsIDB4NzEsIDB4RTgsIDB4QjcsIDB4QUQsIDB4NzIsIC8qIDB4QjgtMHhCQiAqLworCTB4QUQsIDB4NzMsIDB4QUQsIDB4NzQsIDB4QUQsIDB4NzUsIDB4QUQsIDB4NzYsIC8qIDB4QkMtMHhCRiAqLworCTB4QUQsIDB4NzcsIDB4QUQsIDB4NzgsIDB4QUQsIDB4NzksIDB4QUQsIDB4N0EsIC8qIDB4QzAtMHhDMyAqLworCTB4QUQsIDB4N0IsIDB4QUQsIDB4N0MsIDB4QUQsIDB4N0QsIDB4QUQsIDB4N0UsIC8qIDB4QzQtMHhDNyAqLworCTB4QUQsIDB4ODAsIDB4QUQsIDB4ODEsIDB4QUQsIDB4ODIsIDB4QUQsIDB4ODMsIC8qIDB4QzgtMHhDQiAqLworCTB4QUQsIDB4ODQsIDB4QUQsIDB4ODUsIDB4QUQsIDB4ODYsIDB4QUQsIDB4ODcsIC8qIDB4Q0MtMHhDRiAqLworCTB4QUQsIDB4ODgsIDB4QUQsIDB4ODksIDB4RTgsIDB4QjYsIDB4QUQsIDB4OEEsIC8qIDB4RDAtMHhEMyAqLworCTB4QUQsIDB4OEIsIDB4QUQsIDB4OEMsIDB4QUQsIDB4OEQsIDB4QUQsIDB4OEUsIC8qIDB4RDQtMHhENyAqLworCTB4QUQsIDB4OEYsIDB4QUQsIDB4OTAsIDB4QUQsIDB4OTEsIDB4QUQsIDB4OTIsIC8qIDB4RDgtMHhEQiAqLworCTB4QjksIDB4Q0YsIDB4QUQsIDB4OTMsIDB4RjAsIDB4QUMsIDB4QUQsIDB4OTQsIC8qIDB4REMtMHhERiAqLworCTB4RjAsIDB4QUQsIDB4QUQsIDB4OTUsIDB4QzYsIDB4QjAsIDB4QjAsIDB4RUEsIC8qIDB4RTAtMHhFMyAqLworCTB4QzgsIDB4QkYsIDB4QUQsIDB4OTYsIDB4Q0QsIDB4REYsIDB4QUQsIDB4OTcsIC8qIDB4RTQtMHhFNyAqLworCTB4QUQsIDB4OTgsIDB4QUQsIDB4OTksIDB4QUQsIDB4OUEsIDB4QUQsIDB4OUIsIC8qIDB4RTgtMHhFQiAqLworCTB4QUQsIDB4OUMsIDB4QUQsIDB4OUQsIDB4Q0UsIDB4Q0QsIDB4RUEsIDB4QjEsIC8qIDB4RUMtMHhFRiAqLworCTB4QUQsIDB4OUUsIDB4QUQsIDB4OUYsIDB4QUQsIDB4QTAsIDB4QUUsIDB4NDAsIC8qIDB4RjAtMHhGMyAqLworCTB4RUEsIDB4QjIsIDB4QUUsIDB4NDEsIDB4QzYsIDB4QkYsIDB4QjQsIDB4QzksIC8qIDB4RjQtMHhGNyAqLworCTB4QUUsIDB4NDIsIDB4QUUsIDB4NDMsIDB4QUUsIDB4NDQsIDB4QUUsIDB4NDUsIC8qIDB4RjgtMHhGQiAqLworCTB4QUUsIDB4NDYsIDB4QUUsIDB4NDcsIDB4QUUsIDB4NDgsIDB4RUEsIDB4QjMsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzc1WzUxMl0gPSB7CisJMHhBRSwgMHg0OSwgMHhBRSwgMHg0QSwgMHhBRSwgMHg0QiwgMHhBRSwgMHg0QywgLyogMHgwMC0weDAzICovCisJMHhENSwgMHhFNywgMHhBRSwgMHg0RCwgMHhBRSwgMHg0RSwgMHhBRSwgMHg0RiwgLyogMHgwNC0weDA3ICovCisJMHhBRSwgMHg1MCwgMHhBRSwgMHg1MSwgMHhBRSwgMHg1MiwgMHhBRSwgMHg1MywgLyogMHgwOC0weDBCICovCisJMHhBRSwgMHg1NCwgMHhERCwgMHhGOSwgMHhBRSwgMHg1NSwgMHhFQSwgMHhCNCwgLyogMHgwQy0weDBGICovCisJMHhBRSwgMHg1NiwgMHhFQSwgMHhCNSwgMHhBRSwgMHg1NywgMHhFQSwgMHhCNiwgLyogMHgxMC0weDEzICovCisJMHhBRSwgMHg1OCwgMHhBRSwgMHg1OSwgMHhBRSwgMHg1QSwgMHhBRSwgMHg1QiwgLyogMHgxNC0weDE3ICovCisJMHhCOCwgMHhDQSwgMHhERiwgMHhCMCwgMHhDOSwgMHhGNSwgMHhBRSwgMHg1QywgLyogMHgxOC0weDFCICovCisJMHhDQywgMHhGMCwgMHhBRSwgMHg1RCwgMHhBRSwgMHg1RSwgMHhDOSwgMHhGQSwgLyogMHgxQy0weDFGICovCisJMHhBRSwgMHg1RiwgMHhBRSwgMHg2MCwgMHhBRSwgMHg2MSwgMHhBRSwgMHg2MiwgLyogMHgyMC0weDIzICovCisJMHhBRSwgMHg2MywgMHhDOSwgMHhGQiwgMHhBRSwgMHg2NCwgMHhBRSwgMHg2NSwgLyogMHgyNC0weDI3ICovCisJMHhEMywgMHhDMywgMHhDQiwgMHhBNiwgMHhBRSwgMHg2NiwgMHhCOCwgMHhBNiwgLyogMHgyOC0weDJCICovCisJMHhGMCwgMHhBRSwgMHhCMSwgMHhDMiwgMHhBRSwgMHg2NywgMHhFNSwgMHhCOCwgLyogMHgyQy0weDJGICovCisJMHhDQywgMHhFRiwgMHhEMywgMHhDOSwgMHhCQywgMHhENywgMHhDOSwgMHhFQSwgLyogMHgzMC0weDMzICovCisJMHhBRSwgMHg2OCwgMHhCNSwgMHhFNywgMHhBRSwgMHg2OSwgMHhDNCwgMHhEMCwgLyogMHgzNC0weDM3ICovCisJMHhCNSwgMHhFOSwgMHhBRSwgMHg2QSwgMHhFRSwgMHhBRSwgMHhCQiwgMHhBRCwgLyogMHgzOC0weDNCICovCisJMHhBRSwgMHg2QiwgMHhBRSwgMHg2QywgMHhFNywgMHhERSwgMHhBRSwgMHg2RCwgLyogMHgzQy0weDNGICovCisJMHhFRSwgMHhBRiwgMHhBRSwgMHg2RSwgMHhBRSwgMHg2RiwgMHhBRSwgMHg3MCwgLyogMHg0MC0weDQzICovCisJMHhBRSwgMHg3MSwgMHhCMywgMHhBOSwgMHhBRSwgMHg3MiwgMHhBRSwgMHg3MywgLyogMHg0NC0weDQ3ICovCisJMHhFRSwgMHhCMiwgMHhBRSwgMHg3NCwgMHhBRSwgMHg3NSwgMHhFRSwgMHhCMSwgLyogMHg0OC0weDRCICovCisJMHhCRCwgMHhFNywgMHhBRSwgMHg3NiwgMHhFRSwgMHhCMCwgMHhDRSwgMHhCNywgLyogMHg0Qy0weDRGICovCisJMHhBRSwgMHg3NywgMHhBRSwgMHg3OCwgMHhBRSwgMHg3OSwgMHhBRSwgMHg3QSwgLyogMHg1MC0weDUzICovCisJMHhDNSwgMHhDRiwgMHhBRSwgMHg3QiwgMHhBRSwgMHg3QywgMHhBRSwgMHg3RCwgLyogMHg1NC0weDU3ICovCisJMHhBRSwgMHg3RSwgMHhDMSwgMHhGNCwgMHhEQiwgMHhDRSwgMHhFRSwgMHhCMywgLyogMHg1OC0weDVCICovCisJMHhEMCwgMHhGMywgMHhBRSwgMHg4MCwgMHhBRSwgMHg4MSwgMHhBRSwgMHg4MiwgLyogMHg1Qy0weDVGICovCisJMHhBRSwgMHg4MywgMHhBRSwgMHg4NCwgMHhBRSwgMHg4NSwgMHhBRSwgMHg4NiwgLyogMHg2MC0weDYzICovCisJMHhBRSwgMHg4NywgMHhDMiwgMHhENCwgMHhDNiwgMHhFOCwgMHhBRSwgMHg4OCwgLyogMHg2NC0weDY3ICovCisJMHhBRSwgMHg4OSwgMHhBRSwgMHg4QSwgMHhCNywgMHhBQywgMHhBRSwgMHg4QiwgLyogMHg2OC0weDZCICovCisJMHhBRSwgMHg4QywgMHhBRSwgMHg4RCwgMHhBRSwgMHg4RSwgMHhBRSwgMHg4RiwgLyogMHg2Qy0weDZGICovCisJMHhBRSwgMHg5MCwgMHhBRSwgMHg5MSwgMHhFRSwgMHhCNCwgMHhBRSwgMHg5MiwgLyogMHg3MC0weDczICovCisJMHhCMywgMHhFQiwgMHhBRSwgMHg5MywgMHhBRSwgMHg5NCwgMHhBRSwgMHg5NSwgLyogMHg3NC0weDc3ICovCisJMHhCQiwgMHhGQiwgMHhFRSwgMHhCNSwgMHhBRSwgMHg5NiwgMHhBRSwgMHg5NywgLyogMHg3OC0weDdCICovCisJMHhBRSwgMHg5OCwgMHhBRSwgMHg5OSwgMHhBRSwgMHg5QSwgMHhFNywgMHhEQywgLyogMHg3Qy0weDdGICovCisJCisJMHhBRSwgMHg5QiwgMHhBRSwgMHg5QywgMHhBRSwgMHg5RCwgMHhFRSwgMHhCNiwgLyogMHg4MC0weDgzICovCisJMHhBRSwgMHg5RSwgMHhBRSwgMHg5RiwgMHhCRCwgMHhBRSwgMHhBRSwgMHhBMCwgLyogMHg4NC0weDg3ICovCisJMHhBRiwgMHg0MCwgMHhBRiwgMHg0MSwgMHhBRiwgMHg0MiwgMHhGMSwgMHhFMiwgLyogMHg4OC0weDhCICovCisJMHhBRiwgMHg0MywgMHhBRiwgMHg0NCwgMHhBRiwgMHg0NSwgMHhDQSwgMHhFOCwgLyogMHg4Qy0weDhGICovCisJMHhBRiwgMHg0NiwgMHhEMiwgMHhDOSwgMHhGMCwgMHhEQSwgMHhBRiwgMHg0NywgLyogMHg5MC0weDkzICovCisJMHhGMCwgMHhEQiwgMHhBRiwgMHg0OCwgMHhGMCwgMHhEQywgMHhDMSwgMHhDNiwgLyogMHg5NC0weDk3ICovCisJMHhBRiwgMHg0OSwgMHhCOCwgMHhFRCwgMHhCRSwgMHhDRSwgMHhBRiwgMHg0QSwgLyogMHg5OC0weDlCICovCisJMHhBRiwgMHg0QiwgMHhGMCwgMHhERSwgMHhBRiwgMHg0QywgMHhDNSwgMHhCMSwgLyogMHg5Qy0weDlGICovCisJMHhGMCwgMHhERCwgMHhEMSwgMHhGMSwgMHhBRiwgMHg0RCwgMHhGMCwgMHhFMCwgLyogMHhBMC0weEEzICovCisJMHhCMCwgMHhDQywgMHhCRCwgMHhFQSwgMHhBRiwgMHg0RSwgMHhBRiwgMHg0RiwgLyogMHhBNC0weEE3ICovCisJMHhBRiwgMHg1MCwgMHhBRiwgMHg1MSwgMHhBRiwgMHg1MiwgMHhEMiwgMHhERiwgLyogMHhBOC0weEFCICovCisJMHhGMCwgMHhERiwgMHhBRiwgMHg1MywgMHhCNCwgMHhBRiwgMHhCNywgMHhFOCwgLyogMHhBQy0weEFGICovCisJMHhGMCwgMHhFNiwgMHhGMCwgMHhFNSwgMHhDNiwgMHhBMywgMHhGMCwgMHhFMSwgLyogMHhCMC0weEIzICovCisJMHhGMCwgMHhFMiwgMHhCNCwgMHhDMywgMHhBRiwgMHg1NCwgMHhBRiwgMHg1NSwgLyogMHhCNC0weEI3ICovCisJMHhGMCwgMHhFMywgMHhENSwgMHhFRSwgMHhBRiwgMHg1NiwgMHhBRiwgMHg1NywgLyogMHhCOC0weEJCICovCisJMHhDQywgMHhEQiwgMHhCRSwgMHhEMiwgMHhCQywgMHhCMiwgMHhBRiwgMHg1OCwgLyogMHhCQy0weEJGICovCisJMHhBRiwgMHg1OSwgMHhBRiwgMHg1QSwgMHhGMCwgMHhFOCwgMHhGMCwgMHhFNywgLyogMHhDMC0weEMzICovCisJMHhGMCwgMHhFNCwgMHhCMiwgMHhBMSwgMHhBRiwgMHg1QiwgMHhENiwgMHhBMiwgLyogMHhDNC0weEM3ICovCisJMHhEMywgMHhCOCwgMHhCRSwgMHhCNywgMHhDOCwgMHhBQywgMHhBRiwgMHg1QywgLyogMHhDOC0weENCICovCisJMHhBRiwgMHg1RCwgMHhGMCwgMHhFQSwgMHhBRiwgMHg1RSwgMHhBRiwgMHg1RiwgLyogMHhDQy0weENGICovCisJMHhBRiwgMHg2MCwgMHhBRiwgMHg2MSwgMHhEMSwgMHhGNywgMHhBRiwgMHg2MiwgLyogMHhEMC0weEQzICovCisJMHhENiwgMHhDQywgMHhCQSwgMHhEQiwgMHhGMCwgMHhFOSwgMHhBRiwgMHg2MywgLyogMHhENC0weEQ3ICovCisJMHhCNiwgMHhCQiwgMHhBRiwgMHg2NCwgMHhBRiwgMHg2NSwgMHhDRCwgMHhCNCwgLyogMHhEOC0weERCICovCisJMHhBRiwgMHg2NiwgMHhBRiwgMHg2NywgMHhDNiwgMHhBNiwgMHhBRiwgMHg2OCwgLyogMHhEQy0weERGICovCisJMHhBRiwgMHg2OSwgMHhBRiwgMHg2QSwgMHhDMSwgMHhBMSwgMHhGMCwgMHhFQiwgLyogMHhFMC0weEUzICovCisJMHhGMCwgMHhFRSwgMHhBRiwgMHg2QiwgMHhGMCwgMHhFRCwgMHhGMCwgMHhGMCwgLyogMHhFNC0weEU3ICovCisJMHhGMCwgMHhFQywgMHhBRiwgMHg2QywgMHhCQiwgMHhCRSwgMHhGMCwgMHhFRiwgLyogMHhFOC0weEVCICovCisJMHhBRiwgMHg2RCwgMHhBRiwgMHg2RSwgMHhBRiwgMHg2RiwgMHhBRiwgMHg3MCwgLyogMHhFQy0weEVGICovCisJMHhDQywgMHhCNSwgMHhGMCwgMHhGMiwgMHhBRiwgMHg3MSwgMHhBRiwgMHg3MiwgLyogMHhGMC0weEYzICovCisJMHhCMywgMHhENSwgMHhBRiwgMHg3MywgMHhBRiwgMHg3NCwgMHhBRiwgMHg3NSwgLyogMHhGNC0weEY3ICovCisJMHhBRiwgMHg3NiwgMHhCMSwgMHhENCwgMHhBRiwgMHg3NywgMHhBRiwgMHg3OCwgLyogMHhGOC0weEZCICovCisJMHhGMCwgMHhGMywgMHhBRiwgMHg3OSwgMHhBRiwgMHg3QSwgMHhGMCwgMHhGNCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNzZbNTEyXSA9IHsKKwkweEYwLCAweEY2LCAweEI0LCAweEUxLCAweEFGLCAweDdCLCAweEYwLCAweEYxLCAvKiAweDAwLTB4MDMgKi8KKwkweEFGLCAweDdDLCAweEYwLCAweEY3LCAweEFGLCAweDdELCAweEFGLCAweDdFLCAvKiAweDA0LTB4MDcgKi8KKwkweEFGLCAweDgwLCAweEFGLCAweDgxLCAweEYwLCAweEZBLCAweEFGLCAweDgyLCAvKiAweDA4LTB4MEIgKi8KKwkweEYwLCAweEY4LCAweEFGLCAweDgzLCAweEFGLCAweDg0LCAweEFGLCAweDg1LCAvKiAweDBDLTB4MEYgKi8KKwkweEYwLCAweEY1LCAweEFGLCAweDg2LCAweEFGLCAweDg3LCAweEFGLCAweDg4LCAvKiAweDEwLTB4MTMgKi8KKwkweEFGLCAweDg5LCAweEYwLCAweEZELCAweEFGLCAweDhBLCAweEYwLCAweEY5LCAvKiAweDE0LTB4MTcgKi8KKwkweEYwLCAweEZDLCAweEYwLCAweEZFLCAweEFGLCAweDhCLCAweEYxLCAweEExLCAvKiAweDE4LTB4MUIgKi8KKwkweEFGLCAweDhDLCAweEFGLCAweDhELCAweEFGLCAweDhFLCAweENFLCAweEMxLCAvKiAweDFDLTB4MUYgKi8KKwkweEYxLCAweEE0LCAweEFGLCAweDhGLCAweEYxLCAweEEzLCAweEFGLCAweDkwLCAvKiAweDIwLTB4MjMgKi8KKwkweEMxLCAweEY2LCAweEYwLCAweEZCLCAweENBLCAweERELCAweEFGLCAweDkxLCAvKiAweDI0LTB4MjcgKi8KKwkweEFGLCAweDkyLCAweEI0LCAweEYxLCAweEIxLCAweEYxLCAweENDLCAweEIxLCAvKiAweDI4LTB4MkIgKi8KKwkweEFGLCAweDkzLCAweEYxLCAweEE2LCAweEFGLCAweDk0LCAweEFGLCAweDk1LCAvKiAweDJDLTB4MkYgKi8KKwkweEYxLCAweEE3LCAweEFGLCAweDk2LCAweEFGLCAweDk3LCAweEYxLCAweEFDLCAvKiAweDMwLTB4MzMgKi8KKwkweEQ1LCAweENFLCAweEYxLCAweEE5LCAweEFGLCAweDk4LCAweEFGLCAweDk5LCAvKiAweDM0LTB4MzcgKi8KKwkweEM4LCAweEIzLCAweEFGLCAweDlBLCAweEFGLCAweDlCLCAweEFGLCAweDlDLCAvKiAweDM4LTB4M0IgKi8KKwkweEYxLCAweEEyLCAweEFGLCAweDlELCAweEYxLCAweEFCLCAweEYxLCAweEE4LCAvKiAweDNDLTB4M0YgKi8KKwkweEYxLCAweEE1LCAweEFGLCAweDlFLCAweEFGLCAweDlGLCAweEYxLCAweEFBLCAvKiAweDQwLTB4NDMgKi8KKwkweEFGLCAweEEwLCAweEIwLCAweDQwLCAweEIwLCAweDQxLCAweEIwLCAweDQyLCAvKiAweDQ0LTB4NDcgKi8KKwkweEIwLCAweDQzLCAweEIwLCAweDQ0LCAweEIwLCAweDQ1LCAweEIwLCAweDQ2LCAvKiAweDQ4LTB4NEIgKi8KKwkweEIwLCAweEE5LCAweEYxLCAweEFELCAweEIwLCAweDQ3LCAweEIwLCAweDQ4LCAvKiAweDRDLTB4NEYgKi8KKwkweEIwLCAweDQ5LCAweEIwLCAweDRBLCAweEIwLCAweDRCLCAweEIwLCAweDRDLCAvKiAweDUwLTB4NTMgKi8KKwkweEYxLCAweEFGLCAweEIwLCAweDRELCAweEYxLCAweEIxLCAweEIwLCAweDRFLCAvKiAweDU0LTB4NTcgKi8KKwkweEIwLCAweDRGLCAweEIwLCAweDUwLCAweEIwLCAweDUxLCAweEIwLCAweDUyLCAvKiAweDU4LTB4NUIgKi8KKwkweEYxLCAweEIwLCAweEIwLCAweDUzLCAweEYxLCAweEFFLCAweEIwLCAweDU0LCAvKiAweDVDLTB4NUYgKi8KKwkweEIwLCAweDU1LCAweEIwLCAweDU2LCAweEIwLCAweDU3LCAweEQxLCAweEEyLCAvKiAweDYwLTB4NjMgKi8KKwkweEIwLCAweDU4LCAweEIwLCAweDU5LCAweEIwLCAweDVBLCAweEIwLCAweDVCLCAvKiAweDY0LTB4NjcgKi8KKwkweEIwLCAweDVDLCAweEIwLCAweDVELCAweEIwLCAweDVFLCAweEYxLCAweEIyLCAvKiAweDY4LTB4NkIgKi8KKwkweEIwLCAweDVGLCAweEIwLCAweDYwLCAweEIwLCAweDYxLCAweEYxLCAweEIzLCAvKiAweDZDLTB4NkYgKi8KKwkweEIwLCAweDYyLCAweEIwLCAweDYzLCAweEIwLCAweDY0LCAweEIwLCAweDY1LCAvKiAweDcwLTB4NzMgKi8KKwkweEIwLCAweDY2LCAweEIwLCAweDY3LCAweEIwLCAweDY4LCAweEIwLCAweDY5LCAvKiAweDc0LTB4NzcgKi8KKwkweEI5LCAweEVGLCAweEIwLCAweDZBLCAweEIwLCAweDZCLCAweEI1LCAweEM3LCAvKiAweDc4LTB4N0IgKi8KKwkweEIwLCAweDZDLCAweEIwLCAweEQ3LCAweEIwLCAweEQ5LCAweEIwLCAweDZELCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEIwLCAweDZFLCAweEIwLCAweDZGLCAweEQ0LCAweEVELCAweEIwLCAweDcwLCAvKiAweDgwLTB4ODMgKi8KKwkweEI1LCAweEM0LCAweEIwLCAweDcxLCAweEJELCAweEQ0LCAweEJCLCAweENBLCAvKiAweDg0LTB4ODcgKi8KKwkweEYwLCAweEE3LCAweEIwLCAweDcyLCAweEIwLCAweDczLCAweEI4LCAweERFLCAvKiAweDg4LTB4OEIgKi8KKwkweEIwLCAweDc0LCAweEIwLCAweDc1LCAweEYwLCAweEE4LCAweEIwLCAweDc2LCAvKiAweDhDLTB4OEYgKi8KKwkweEIwLCAweDc3LCAweEIwLCAweEE4LCAweEIwLCAweDc4LCAweEYwLCAweEE5LCAvKiAweDkwLTB4OTMgKi8KKwkweEIwLCAweDc5LCAweEIwLCAweDdBLCAweENELCAweEVFLCAweEIwLCAweDdCLCAvKiAweDk0LTB4OTcgKi8KKwkweEIwLCAweDdDLCAweEYwLCAweEFBLCAweEIwLCAweDdELCAweEIwLCAweDdFLCAvKiAweDk4LTB4OUIgKi8KKwkweEIwLCAweDgwLCAweEIwLCAweDgxLCAweEIwLCAweDgyLCAweEIwLCAweDgzLCAvKiAweDlDLTB4OUYgKi8KKwkweEIwLCAweDg0LCAweEIwLCAweDg1LCAweEIwLCAweDg2LCAweEIwLCAweDg3LCAvKiAweEEwLTB4QTMgKi8KKwkweEYwLCAweEFCLCAweEIwLCAweDg4LCAweEIwLCAweDg5LCAweEIwLCAweDhBLCAvKiAweEE0LTB4QTcgKi8KKwkweEIwLCAweDhCLCAweEIwLCAweDhDLCAweEIwLCAweDhELCAweEIwLCAweDhFLCAvKiAweEE4LTB4QUIgKi8KKwkweEIwLCAweDhGLCAweEIwLCAweDkwLCAweEM2LCAweEE0LCAweEIwLCAweDkxLCAvKiAweEFDLTB4QUYgKi8KKwkweEIwLCAweDkyLCAweEQ2LCAweEU1LCAweEYxLCAweEU0LCAweEIwLCAweDkzLCAvKiAweEIwLTB4QjMgKi8KKwkweEYxLCAweEU1LCAweEIwLCAweDk0LCAweEIwLCAweDk1LCAweEIwLCAweDk2LCAvKiAweEI0LTB4QjcgKi8KKwkweEIwLCAweDk3LCAweEIwLCAweDk4LCAweEIwLCAweDk5LCAweEIwLCAweDlBLCAvKiAweEI4LTB4QkIgKi8KKwkweEIwLCAweDlCLCAweEIwLCAweDlDLCAweEIwLCAweDlELCAweEMzLCAweEYzLCAvKiAweEJDLTB4QkYgKi8KKwkweEIwLCAweDlFLCAweEIwLCAweDlGLCAweEQzLCAweERCLCAweEIwLCAweEEwLCAvKiAweEMwLTB4QzMgKi8KKwkweEIxLCAweDQwLCAweEQ2LCAweEQxLCAweEM1LCAweEU4LCAweEIxLCAweDQxLCAvKiAweEM0LTB4QzcgKi8KKwkweEQzLCAweEFGLCAweEIxLCAweDQyLCAweEQyLCAweEU2LCAweEIxLCAweDQzLCAvKiAweEM4LTB4Q0IgKi8KKwkweEIxLCAweDQ0LCAweEVFLCAweEMxLCAweEIwLCAweEJCLCAweEQ1LCAweEI1LCAvKiAweENDLTB4Q0YgKi8KKwkweEQxLCAweENFLCAweEJDLCAweEUwLCAweEJBLCAweEQwLCAweEIxLCAweDQ1LCAvKiAweEQwLTB4RDMgKi8KKwkweEJGLCAweEY4LCAweEIxLCAweDQ2LCAweEI4LCAweEM3LCAweEI1LCAweEMxLCAvKiAweEQ0LTB4RDcgKi8KKwkweEM1LCAweENDLCAweEIxLCAweDQ3LCAweEIxLCAweDQ4LCAweENBLCAweEEyLCAvKiAweEQ4LTB4REIgKi8KKwkweEIxLCAweDQ5LCAweEIxLCAweDRBLCAweEIxLCAweDRCLCAweEMzLCAweENCLCAvKiAweERDLTB4REYgKi8KKwkweEIxLCAweDRDLCAweEIxLCAweDRELCAweEIxLCAweDRFLCAweEIxLCAweDRGLCAvKiAweEUwLTB4RTMgKi8KKwkweEIxLCAweDUwLCAweEVFLCAweEMyLCAweEIxLCAweDUxLCAweEIxLCAweDUyLCAvKiAweEU0LTB4RTcgKi8KKwkweEIxLCAweDUzLCAweEIxLCAweDU0LCAweEIxLCAweDU1LCAweEIxLCAweDU2LCAvKiAweEU4LTB4RUIgKi8KKwkweEIxLCAweDU3LCAweEIxLCAweDU4LCAweEM0LCAweEJGLCAweEI2LCAweEEyLCAvKiAweEVDLTB4RUYgKi8KKwkweEIxLCAweDU5LCAweEVELCAweEVDLCAweEMzLCAweEE0LCAweEIxLCAweDVBLCAvKiAweEYwLTB4RjMgKi8KKwkweEQ2LCAweEIxLCAweEIxLCAweDVCLCAweEIxLCAweDVDLCAweEIxLCAweDVELCAvKiAweEY0LTB4RjcgKi8KKwkweENGLCAweEUwLCAweEVELCAweEVGLCAweEIxLCAweDVFLCAweEIxLCAweDVGLCAvKiAweEY4LTB4RkIgKi8KKwkweEM1LCAweENFLCAweEIxLCAweDYwLCAweEI2LCAweERDLCAweEIxLCAweDYxLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183N1s1MTJdID0geworCTB4QjEsIDB4NjIsIDB4Q0EsIDB4QTEsIDB4QjEsIDB4NjMsIDB4QjEsIDB4NjQsIC8qIDB4MDAtMHgwMyAqLworCTB4RUQsIDB4RUQsIDB4QjEsIDB4NjUsIDB4QjEsIDB4NjYsIDB4RUQsIDB4RjAsIC8qIDB4MDQtMHgwNyAqLworCTB4RUQsIDB4RjEsIDB4QzMsIDB4QkMsIDB4QjEsIDB4NjcsIDB4QkYsIDB4QjQsIC8qIDB4MDgtMHgwQiAqLworCTB4QjEsIDB4NjgsIDB4RUQsIDB4RUUsIDB4QjEsIDB4NjksIDB4QjEsIDB4NkEsIC8qIDB4MEMtMHgwRiAqLworCTB4QjEsIDB4NkIsIDB4QjEsIDB4NkMsIDB4QjEsIDB4NkQsIDB4QjEsIDB4NkUsIC8qIDB4MTAtMHgxMyAqLworCTB4QjEsIDB4NkYsIDB4QjEsIDB4NzAsIDB4QjEsIDB4NzEsIDB4QjEsIDB4NzIsIC8qIDB4MTQtMHgxNyAqLworCTB4QjEsIDB4NzMsIDB4RUQsIDB4RjQsIDB4RUQsIDB4RjIsIDB4QjEsIDB4NzQsIC8qIDB4MTgtMHgxQiAqLworCTB4QjEsIDB4NzUsIDB4QjEsIDB4NzYsIDB4QjEsIDB4NzcsIDB4RDUsIDB4RTYsIC8qIDB4MUMtMHgxRiAqLworCTB4QzMsIDB4REYsIDB4QjEsIDB4NzgsIDB4RUQsIDB4RjMsIDB4QjEsIDB4NzksIC8qIDB4MjAtMHgyMyAqLworCTB4QjEsIDB4N0EsIDB4QjEsIDB4N0IsIDB4RUQsIDB4RjYsIDB4QjEsIDB4N0MsIC8qIDB4MjQtMHgyNyAqLworCTB4RDUsIDB4QTMsIDB4RDEsIDB4QTMsIDB4QjEsIDB4N0QsIDB4QjEsIDB4N0UsIC8qIDB4MjgtMHgyQiAqLworCTB4QjEsIDB4ODAsIDB4RUQsIDB4RjUsIDB4QjEsIDB4ODEsIDB4QzMsIDB4RDAsIC8qIDB4MkMtMHgyRiAqLworCTB4QjEsIDB4ODIsIDB4QjEsIDB4ODMsIDB4QjEsIDB4ODQsIDB4QjEsIDB4ODUsIC8qIDB4MzAtMHgzMyAqLworCTB4QjEsIDB4ODYsIDB4RUQsIDB4RjcsIDB4QkYsIDB4RjQsIDB4QkUsIDB4RUMsIC8qIDB4MzQtMHgzNyAqLworCTB4RUQsIDB4RjgsIDB4QjEsIDB4ODcsIDB4Q0MsIDB4RjcsIDB4QjEsIDB4ODgsIC8qIDB4MzgtMHgzQiAqLworCTB4RDEsIDB4REIsIDB4QjEsIDB4ODksIDB4QjEsIDB4OEEsIDB4QjEsIDB4OEIsIC8qIDB4M0MtMHgzRiAqLworCTB4RDcsIDB4QzUsIDB4RDUsIDB4RjYsIDB4QjEsIDB4OEMsIDB4RUQsIDB4RkMsIC8qIDB4NDAtMHg0MyAqLworCTB4QjEsIDB4OEQsIDB4QjEsIDB4OEUsIDB4QjEsIDB4OEYsIDB4RUQsIDB4RkIsIC8qIDB4NDQtMHg0NyAqLworCTB4QjEsIDB4OTAsIDB4QjEsIDB4OTEsIDB4QjEsIDB4OTIsIDB4QjEsIDB4OTMsIC8qIDB4NDgtMHg0QiAqLworCTB4QjEsIDB4OTQsIDB4QjEsIDB4OTUsIDB4QjEsIDB4OTYsIDB4QjEsIDB4OTcsIC8qIDB4NEMtMHg0RiAqLworCTB4RUQsIDB4RjksIDB4RUQsIDB4RkEsIDB4QjEsIDB4OTgsIDB4QjEsIDB4OTksIC8qIDB4NTAtMHg1MyAqLworCTB4QjEsIDB4OUEsIDB4QjEsIDB4OUIsIDB4QjEsIDB4OUMsIDB4QjEsIDB4OUQsIC8qIDB4NTQtMHg1NyAqLworCTB4QjEsIDB4OUUsIDB4QjEsIDB4OUYsIDB4RUQsIDB4RkQsIDB4QkUsIDB4QTYsIC8qIDB4NTgtMHg1QiAqLworCTB4QjEsIDB4QTAsIDB4QjIsIDB4NDAsIDB4QjIsIDB4NDEsIDB4QjIsIDB4NDIsIC8qIDB4NUMtMHg1RiAqLworCTB4QjIsIDB4NDMsIDB4Q0IsIDB4QUYsIDB4RUUsIDB4QTEsIDB4QjYsIDB4QkQsIC8qIDB4NjAtMHg2MyAqLworCTB4QjIsIDB4NDQsIDB4RUUsIDB4QTIsIDB4QzQsIDB4QzAsIDB4QjIsIDB4NDUsIC8qIDB4NjQtMHg2NyAqLworCTB4RUQsIDB4RkUsIDB4QjIsIDB4NDYsIDB4QjIsIDB4NDcsIDB4QkQsIDB4REUsIC8qIDB4NjgtMHg2QiAqLworCTB4QjIsIDB4QzcsIDB4QjIsIDB4NDgsIDB4QjIsIDB4NDksIDB4QjIsIDB4NEEsIC8qIDB4NkMtMHg2RiAqLworCTB4QjIsIDB4NEIsIDB4QjIsIDB4NEMsIDB4QjIsIDB4NEQsIDB4QjIsIDB4NEUsIC8qIDB4NzAtMHg3MyAqLworCTB4QjIsIDB4NEYsIDB4QjIsIDB4NTAsIDB4QjIsIDB4NTEsIDB4QjIsIDB4NTIsIC8qIDB4NzQtMHg3NyAqLworCTB4QjIsIDB4NTMsIDB4QjYsIDB4QzMsIDB4QjIsIDB4NTQsIDB4QjIsIDB4NTUsIC8qIDB4NzgtMHg3QiAqLworCTB4QjIsIDB4NTYsIDB4RUUsIDB4QTUsIDB4RDgsIDB4QkEsIDB4RUUsIDB4QTMsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RUUsIDB4QTYsIDB4QjIsIDB4NTcsIDB4QjIsIDB4NTgsIDB4QjIsIDB4NTksIC8qIDB4ODAtMHg4MyAqLworCTB4QzMsIDB4RTksIDB4QjMsIDB4RjIsIDB4QjIsIDB4NUEsIDB4QjIsIDB4NUIsIC8qIDB4ODQtMHg4NyAqLworCTB4QjIsIDB4NUMsIDB4QjIsIDB4NUQsIDB4QjIsIDB4NUUsIDB4QjIsIDB4NUYsIC8qIDB4ODgtMHg4QiAqLworCTB4RUUsIDB4QTcsIDB4RUUsIDB4QTQsIDB4Q0YsIDB4QjksIDB4QjIsIDB4NjAsIC8qIDB4OEMtMHg4RiAqLworCTB4QjIsIDB4NjEsIDB4RUUsIDB4QTgsIDB4QzIsIDB4RjcsIDB4QjIsIDB4NjIsIC8qIDB4OTAtMHg5MyAqLworCTB4QjIsIDB4NjMsIDB4QjIsIDB4NjQsIDB4QjIsIDB4NjUsIDB4QjIsIDB4NjYsIC8qIDB4OTQtMHg5NyAqLworCTB4QjIsIDB4NjcsIDB4QjIsIDB4NjgsIDB4QjIsIDB4NjksIDB4QjIsIDB4NkEsIC8qIDB4OTgtMHg5QiAqLworCTB4QjIsIDB4NkIsIDB4QjIsIDB4NkMsIDB4QjIsIDB4NkQsIDB4RUUsIDB4QTksIC8qIDB4OUMtMHg5RiAqLworCTB4RUUsIDB4QUEsIDB4QjIsIDB4NkUsIDB4REUsIDB4QUIsIDB4QjIsIDB4NkYsIC8qIDB4QTAtMHhBMyAqLworCTB4QjIsIDB4NzAsIDB4QzYsIDB4QjMsIDB4QjIsIDB4NzEsIDB4QzcsIDB4QzYsIC8qIDB4QTQtMHhBNyAqLworCTB4QjIsIDB4NzIsIDB4RDYsIDB4RjUsIDB4QjUsIDB4QzksIDB4QjIsIDB4NzMsIC8qIDB4QTgtMHhBQiAqLworCTB4Q0IsIDB4QjIsIDB4QjIsIDB4NzQsIDB4QjIsIDB4NzUsIDB4QjIsIDB4NzYsIC8qIDB4QUMtMHhBRiAqLworCTB4RUUsIDB4QUIsIDB4QjIsIDB4NzcsIDB4QjIsIDB4NzgsIDB4Q0QsIDB4QUIsIC8qIDB4QjAtMHhCMyAqLworCTB4QjIsIDB4NzksIDB4RUUsIDB4QUMsIDB4QjIsIDB4N0EsIDB4QjIsIDB4N0IsIC8qIDB4QjQtMHhCNyAqLworCTB4QjIsIDB4N0MsIDB4QjIsIDB4N0QsIDB4QjIsIDB4N0UsIDB4RDUsIDB4QjAsIC8qIDB4QjgtMHhCQiAqLworCTB4QjIsIDB4ODAsIDB4RUUsIDB4QUQsIDB4QjIsIDB4ODEsIDB4RjYsIDB4QzQsIC8qIDB4QkMtMHhCRiAqLworCTB4QjIsIDB4ODIsIDB4QjIsIDB4ODMsIDB4QjIsIDB4ODQsIDB4QjIsIDB4ODUsIC8qIDB4QzAtMHhDMyAqLworCTB4QjIsIDB4ODYsIDB4QjIsIDB4ODcsIDB4QjIsIDB4ODgsIDB4QjIsIDB4ODksIC8qIDB4QzQtMHhDNyAqLworCTB4QjIsIDB4OEEsIDB4QjIsIDB4OEIsIDB4QjIsIDB4OEMsIDB4QjIsIDB4OEQsIC8qIDB4QzgtMHhDQiAqLworCTB4QjIsIDB4OEUsIDB4REIsIDB4QzcsIDB4QjIsIDB4OEYsIDB4QjIsIDB4OTAsIC8qIDB4Q0MtMHhDRiAqLworCTB4QjIsIDB4OTEsIDB4QjIsIDB4OTIsIDB4QjIsIDB4OTMsIDB4QjIsIDB4OTQsIC8qIDB4RDAtMHhEMyAqLworCTB4QjIsIDB4OTUsIDB4QjIsIDB4OTYsIDB4QjIsIDB4OTcsIDB4QjQsIDB4QTMsIC8qIDB4RDQtMHhENyAqLworCTB4QjIsIDB4OTgsIDB4QjIsIDB4OTksIDB4QjIsIDB4OUEsIDB4QzMsIDB4QUMsIC8qIDB4RDgtMHhEQiAqLworCTB4RjEsIDB4RTYsIDB4QjIsIDB4OUIsIDB4QjIsIDB4OUMsIDB4QjIsIDB4OUQsIC8qIDB4REMtMHhERiAqLworCTB4QjIsIDB4OUUsIDB4QjIsIDB4OUYsIDB4Q0EsIDB4QjgsIDB4RDIsIDB4RDMsIC8qIDB4RTAtMHhFMyAqLworCTB4QjIsIDB4QTAsIDB4RDYsIDB4QUEsIDB4QjMsIDB4NDAsIDB4RUYsIDB4RjIsIC8qIDB4RTQtMHhFNyAqLworCTB4QjMsIDB4NDEsIDB4QkUsIDB4RDgsIDB4QjMsIDB4NDIsIDB4QkQsIDB4QzMsIC8qIDB4RTgtMHhFQiAqLworCTB4RUYsIDB4RjMsIDB4QjYsIDB4Q0MsIDB4QjAsIDB4QUIsIDB4QjMsIDB4NDMsIC8qIDB4RUMtMHhFRiAqLworCTB4QjMsIDB4NDQsIDB4QjMsIDB4NDUsIDB4QjMsIDB4NDYsIDB4Q0EsIDB4QUYsIC8qIDB4RjAtMHhGMyAqLworCTB4QjMsIDB4NDcsIDB4QjMsIDB4NDgsIDB4RUQsIDB4QjYsIDB4QjMsIDB4NDksIC8qIDB4RjQtMHhGNyAqLworCTB4RUQsIDB4QjcsIDB4QjMsIDB4NEEsIDB4QjMsIDB4NEIsIDB4QjMsIDB4NEMsIC8qIDB4RjgtMHhGQiAqLworCTB4QjMsIDB4NEQsIDB4Q0UsIDB4RjksIDB4QjcsIDB4QUYsIDB4QkYsIDB4RjMsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzc4WzUxMl0gPSB7CisJMHhFRCwgMHhCOCwgMHhDMiwgMHhFQiwgMHhDOSwgMHhCMCwgMHhCMywgMHg0RSwgLyogMHgwMC0weDAzICovCisJMHhCMywgMHg0RiwgMHhCMywgMHg1MCwgMHhCMywgMHg1MSwgMHhCMywgMHg1MiwgLyogMHgwNC0weDA3ICovCisJMHhCMywgMHg1MywgMHhFRCwgMHhCOSwgMHhCMywgMHg1NCwgMHhCMywgMHg1NSwgLyogMHgwOC0weDBCICovCisJMHhDNiwgMHhGNiwgMHhCRiwgMHhCMywgMHhCMywgMHg1NiwgMHhCMywgMHg1NywgLyogMHgwQy0weDBGICovCisJMHhCMywgMHg1OCwgMHhFRCwgMHhCQywgMHhDNSwgMHhGOCwgMHhCMywgMHg1OSwgLyogMHgxMC0weDEzICovCisJMHhEMSwgMHhEMCwgMHhCMywgMHg1QSwgMHhENywgMHhBOSwgMHhFRCwgMHhCQSwgLyogMHgxNC0weDE3ICovCisJMHhFRCwgMHhCQiwgMHhCMywgMHg1QiwgMHhEMSwgMHhFMiwgMHhCMywgMHg1QywgLyogMHgxOC0weDFCICovCisJMHhFRCwgMHhCRiwgMHhFRCwgMHhDMCwgMHhCMywgMHg1RCwgMHhFRCwgMHhDNCwgLyogMHgxQy0weDFGICovCisJMHhCMywgMHg1RSwgMHhCMywgMHg1RiwgMHhCMywgMHg2MCwgMHhFRCwgMHhDOCwgLyogMHgyMC0weDIzICovCisJMHhCMywgMHg2MSwgMHhFRCwgMHhDNiwgMHhFRCwgMHhDRSwgMHhENSwgMHhFOCwgLyogMHgyNC0weDI3ICovCisJMHhCMywgMHg2MiwgMHhFRCwgMHhDOSwgMHhCMywgMHg2MywgMHhCMywgMHg2NCwgLyogMHgyOC0weDJCICovCisJMHhFRCwgMHhDNywgMHhFRCwgMHhCRSwgMHhCMywgMHg2NSwgMHhCMywgMHg2NiwgLyogMHgyQy0weDJGICovCisJMHhDNSwgMHhFOSwgMHhCMywgMHg2NywgMHhCMywgMHg2OCwgMHhCMywgMHg2OSwgLyogMHgzMC0weDMzICovCisJMHhDNiwgMHhDNiwgMHhCMywgMHg2QSwgMHhCMywgMHg2QiwgMHhDOSwgMHhFOSwgLyogMHgzNC0weDM3ICovCisJMHhENCwgMHhEMiwgMHhFRCwgMHhDMSwgMHhFRCwgMHhDMiwgMHhFRCwgMHhDMywgLyogMHgzOC0weDNCICovCisJMHhFRCwgMHhDNSwgMHhCMywgMHg2QywgMHhDMCwgMHhGOSwgMHhCMywgMHg2RCwgLyogMHgzQy0weDNGICovCisJMHhCNCwgMHhBMSwgMHhCMywgMHg2RSwgMHhCMywgMHg2RiwgMHhCMywgMHg3MCwgLyogMHg0MC0weDQzICovCisJMHhCMywgMHg3MSwgMHhCOSwgMHhFOCwgMHhCMywgMHg3MiwgMHhFRCwgMHhEMCwgLyogMHg0NC0weDQ3ICovCisJMHhCMywgMHg3MywgMHhCMywgMHg3NCwgMHhCMywgMHg3NSwgMHhCMywgMHg3NiwgLyogMHg0OC0weDRCICovCisJMHhFRCwgMHhEMSwgMHhCMywgMHg3NywgMHhFRCwgMHhDQSwgMHhCMywgMHg3OCwgLyogMHg0Qy0weDRGICovCisJMHhFRCwgMHhDRiwgMHhCMywgMHg3OSwgMHhDRSwgMHhGOCwgMHhCMywgMHg3QSwgLyogMHg1MC0weDUzICovCisJMHhCMywgMHg3QiwgMHhDQiwgMHhCNiwgMHhFRCwgMHhDQywgMHhFRCwgMHhDRCwgLyogMHg1NC0weDU3ICovCisJMHhCMywgMHg3QywgMHhCMywgMHg3RCwgMHhCMywgMHg3RSwgMHhCMywgMHg4MCwgLyogMHg1OC0weDVCICovCisJMHhCMywgMHg4MSwgMHhDRiwgMHhGNSwgMHhCMywgMHg4MiwgMHhCMywgMHg4MywgLyogMHg1Qy0weDVGICovCisJMHhCMywgMHg4NCwgMHhCMywgMHg4NSwgMHhCMywgMHg4NiwgMHhCMywgMHg4NywgLyogMHg2MC0weDYzICovCisJMHhCMywgMHg4OCwgMHhCMywgMHg4OSwgMHhCMywgMHg4QSwgMHhCMywgMHg4QiwgLyogMHg2NC0weDY3ICovCisJMHhCMywgMHg4QywgMHhCMywgMHg4RCwgMHhFRCwgMHhEMiwgMHhDMSwgMHhGMiwgLyogMHg2OC0weDZCICovCisJMHhEMywgMHhCMiwgMHhFRCwgMHhDQiwgMHhDOCwgMHhCNywgMHhCMywgMHg4RSwgLyogMHg2Qy0weDZGICovCisJMHhCMywgMHg4RiwgMHhCMywgMHg5MCwgMHhCMywgMHg5MSwgMHhCMywgMHg5MiwgLyogMHg3MC0weDczICovCisJMHhCMywgMHg5MywgMHhCMywgMHg5NCwgMHhCMywgMHg5NSwgMHhCQywgMHhFRiwgLyogMHg3NC0weDc3ICovCisJMHhCMywgMHg5NiwgMHhCMywgMHg5NywgMHhCMywgMHg5OCwgMHhCMywgMHg5OSwgLyogMHg3OC0weDdCICovCisJMHhDNSwgMHhGMCwgMHhCMywgMHg5QSwgMHhCMywgMHg5QiwgMHhCMywgMHg5QywgLyogMHg3Qy0weDdGICovCisJCisJMHhCMywgMHg5RCwgMHhCMywgMHg5RSwgMHhCMywgMHg5RiwgMHhCMywgMHhBMCwgLyogMHg4MC0weDgzICovCisJMHhCNCwgMHg0MCwgMHhCNCwgMHg0MSwgMHhCNCwgMHg0MiwgMHhFRCwgMHhENiwgLyogMHg4NC0weDg3ICovCisJMHhCNCwgMHg0MywgMHhCNSwgMHhFRiwgMHhCNCwgMHg0NCwgMHhCNCwgMHg0NSwgLyogMHg4OC0weDhCICovCisJMHhDMiwgMHhCNSwgMHhCMCwgMHhBRCwgMHhDQiwgMHhFOSwgMHhCNCwgMHg0NiwgLyogMHg4Qy0weDhGICovCisJMHhCNCwgMHg0NywgMHhCMSwgMHhBRSwgMHhCNCwgMHg0OCwgMHhFRCwgMHhENCwgLyogMHg5MC0weDkzICovCisJMHhCNCwgMHg0OSwgMHhCNCwgMHg0QSwgMHhCNCwgMHg0QiwgMHhDRCwgMHhFQiwgLyogMHg5NC0weDk3ICovCisJMHhCNSwgMHhFMiwgMHhCNCwgMHg0QywgMHhFRCwgMHhENSwgMHhFRCwgMHhEMywgLyogMHg5OC0weDlCICovCisJMHhFRCwgMHhENywgMHhCNCwgMHg0RCwgMHhCNCwgMHg0RSwgMHhCNSwgMHhGQSwgLyogMHg5Qy0weDlGICovCisJMHhCNCwgMHg0RiwgMHhFRCwgMHhEOCwgMHhCNCwgMHg1MCwgMHhFRCwgMHhEOSwgLyogMHhBMC0weEEzICovCisJMHhCNCwgMHg1MSwgMHhFRCwgMHhEQywgMHhCNCwgMHg1MiwgMHhCMSwgMHhDQywgLyogMHhBNC0weEE3ICovCisJMHhCNCwgMHg1MywgMHhCNCwgMHg1NCwgMHhCNCwgMHg1NSwgMHhCNCwgMHg1NiwgLyogMHhBOC0weEFCICovCisJMHhCNCwgMHg1NywgMHhCNCwgMHg1OCwgMHhCNCwgMHg1OSwgMHhCNCwgMHg1QSwgLyogMHhBQy0weEFGICovCisJMHhDNSwgMHhGNiwgMHhCQywgMHhFRSwgMHhFRCwgMHhEQSwgMHhDQywgMHhCQywgLyogMHhCMC0weEIzICovCisJMHhCMiwgMHhFQSwgMHhCNCwgMHg1QiwgMHhCNCwgMHg1QywgMHhCNCwgMHg1RCwgLyogMHhCNC0weEI3ICovCisJMHhCNCwgMHg1RSwgMHhFRCwgMHhEQiwgMHhCNCwgMHg1RiwgMHhCNCwgMHg2MCwgLyogMHhCOC0weEJCICovCisJMHhCNCwgMHg2MSwgMHhCNCwgMHg2MiwgMHhDNCwgMHhFQiwgMHhCNCwgMHg2MywgLyogMHhCQy0weEJGICovCisJMHhCNCwgMHg2NCwgMHhCNCwgMHhDNSwgMHhCNCwgMHg2NSwgMHhCNCwgMHg2NiwgLyogMHhDMC0weEMzICovCisJMHhCNCwgMHg2NywgMHhCMCwgMHhGNSwgMHhCNCwgMHg2OCwgMHhCNCwgMHg2OSwgLyogMHhDNC0weEM3ICovCisJMHhCNCwgMHg2QSwgMHhFRCwgMHhERiwgMHhDMCwgMHhEQSwgMHhCNCwgMHhFOCwgLyogMHhDOC0weENCICovCisJMHhCNCwgMHg2QiwgMHhCNCwgMHg2QywgMHhCNCwgMHg2RCwgMHhCNCwgMHg2RSwgLyogMHhDQy0weENGICovCisJMHhDNSwgMHhDRCwgMHhCNCwgMHg2RiwgMHhCNCwgMHg3MCwgMHhCNCwgMHg3MSwgLyogMHhEMC0weEQzICovCisJMHhFRCwgMHhERCwgMHhCRiwgMHhDNCwgMHhCNCwgMHg3MiwgMHhCNCwgMHg3MywgLyogMHhENC0weEQ3ICovCisJMHhCNCwgMHg3NCwgMHhFRCwgMHhERSwgMHhCNCwgMHg3NSwgMHhCNCwgMHg3NiwgLyogMHhEOC0weERCICovCisJMHhCNCwgMHg3NywgMHhCNCwgMHg3OCwgMHhCNCwgMHg3OSwgMHhCNCwgMHg3QSwgLyogMHhEQy0weERGICovCisJMHhCNCwgMHg3QiwgMHhCNCwgMHg3QywgMHhCNCwgMHg3RCwgMHhCNCwgMHg3RSwgLyogMHhFMC0weEUzICovCisJMHhCNCwgMHg4MCwgMHhCNCwgMHg4MSwgMHhCNCwgMHg4MiwgMHhCNCwgMHg4MywgLyogMHhFNC0weEU3ICovCisJMHhDNCwgMHhBNSwgMHhCNCwgMHg4NCwgMHhCNCwgMHg4NSwgMHhCNCwgMHg4NiwgLyogMHhFOC0weEVCICovCisJMHhFRCwgMHhFMCwgMHhCNCwgMHg4NywgMHhCNCwgMHg4OCwgMHhCNCwgMHg4OSwgLyogMHhFQy0weEVGICovCisJMHhCNCwgMHg4QSwgMHhCNCwgMHg4QiwgMHhFRCwgMHhFMSwgMHhCNCwgMHg4QywgLyogMHhGMC0weEYzICovCisJMHhFRCwgMHhFMywgMHhCNCwgMHg4RCwgMHhCNCwgMHg4RSwgMHhDMSwgMHhENywgLyogMHhGNC0weEY3ICovCisJMHhCNCwgMHg4RiwgMHhCNCwgMHg5MCwgMHhCQiwgMHhDNywgMHhCNCwgMHg5MSwgLyogMHhGOC0weEZCICovCisJMHhCNCwgMHg5MiwgMHhCNCwgMHg5MywgMHhCNCwgMHg5NCwgMHhCNCwgMHg5NSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNzlbNTEyXSA9IHsKKwkweEI0LCAweDk2LCAweEJELCAweEI4LCAweEI0LCAweDk3LCAweEI0LCAweDk4LCAvKiAweDAwLTB4MDMgKi8KKwkweEI0LCAweDk5LCAweEVELCAweEUyLCAweEI0LCAweDlBLCAweEI0LCAweDlCLCAvKiAweDA0LTB4MDcgKi8KKwkweEI0LCAweDlDLCAweEI0LCAweDlELCAweEI0LCAweDlFLCAweEI0LCAweDlGLCAvKiAweDA4LTB4MEIgKi8KKwkweEI0LCAweEEwLCAweEI1LCAweDQwLCAweEI1LCAweDQxLCAweEI1LCAweDQyLCAvKiAweDBDLTB4MEYgKi8KKwkweEI1LCAweDQzLCAweEI1LCAweDQ0LCAweEI1LCAweDQ1LCAweEVELCAweEU0LCAvKiAweDEwLTB4MTMgKi8KKwkweEI1LCAweDQ2LCAweEI1LCAweDQ3LCAweEI1LCAweDQ4LCAweEI1LCAweDQ5LCAvKiAweDE0LTB4MTcgKi8KKwkweEI1LCAweDRBLCAweEI1LCAweDRCLCAweEI1LCAweDRDLCAweEI1LCAweDRELCAvKiAweDE4LTB4MUIgKi8KKwkweEI1LCAweDRFLCAweEI1LCAweDRGLCAweEVELCAweEU2LCAweEI1LCAweDUwLCAvKiAweDFDLTB4MUYgKi8KKwkweEI1LCAweDUxLCAweEI1LCAweDUyLCAweEI1LCAweDUzLCAweEI1LCAweDU0LCAvKiAweDIwLTB4MjMgKi8KKwkweEVELCAweEU1LCAweEI1LCAweDU1LCAweEI1LCAweDU2LCAweEI1LCAweDU3LCAvKiAweDI0LTB4MjcgKi8KKwkweEI1LCAweDU4LCAweEI1LCAweDU5LCAweEI1LCAweDVBLCAweEI1LCAweDVCLCAvKiAweDI4LTB4MkIgKi8KKwkweEI1LCAweDVDLCAweEI1LCAweDVELCAweEI1LCAweDVFLCAweEI1LCAweDVGLCAvKiAweDJDLTB4MkYgKi8KKwkweEI1LCAweDYwLCAweEI1LCAweDYxLCAweEI1LCAweDYyLCAweEI1LCAweDYzLCAvKiAweDMwLTB4MzMgKi8KKwkweEVELCAweEU3LCAweEI1LCAweDY0LCAweEI1LCAweDY1LCAweEI1LCAweDY2LCAvKiAweDM0LTB4MzcgKi8KKwkweEI1LCAweDY3LCAweEI1LCAweDY4LCAweENBLCAweEJFLCAweEVDLCAweEVBLCAvKiAweDM4LTB4M0IgKi8KKwkweEMwLCAweEYxLCAweEI1LCAweDY5LCAweEM5LCAweEU3LCAweEI1LCAweDZBLCAvKiAweDNDLTB4M0YgKi8KKwkweEVDLCAweEVCLCAweEM2LCAweEVFLCAweEI1LCAweDZCLCAweEI1LCAweDZDLCAvKiAweDQwLTB4NDMgKi8KKwkweEI1LCAweDZELCAweEI1LCAweDZFLCAweEVDLCAweEVDLCAweEI1LCAweDZGLCAvKiAweDQ0LTB4NDcgKi8KKwkweEM2LCAweEVELCAweEVDLCAweEVELCAweEI1LCAweDcwLCAweEI1LCAweDcxLCAvKiAweDQ4LTB4NEIgKi8KKwkweEI1LCAweDcyLCAweEI1LCAweDczLCAweEI1LCAweDc0LCAweEI1LCAweDc1LCAvKiAweDRDLTB4NEYgKi8KKwkweEI1LCAweDc2LCAweEI1LCAweDc3LCAweEI1LCAweDc4LCAweEVDLCAweEYwLCAvKiAweDUwLTB4NTMgKi8KKwkweEI1LCAweDc5LCAweEI1LCAweDdBLCAweEQ3LCAweEU2LCAweEVDLCAweEYzLCAvKiAweDU0LTB4NTcgKi8KKwkweEI1LCAweDdCLCAweEI1LCAweDdDLCAweEVDLCAweEYxLCAweEVDLCAweEVFLCAvKiAweDU4LTB4NUIgKi8KKwkweEVDLCAweEVGLCAweEQ3LCAweEEzLCAweEM5LCAweEYxLCAweENCLCAweEVFLCAvKiAweDVDLTB4NUYgKi8KKwkweEVDLCAweEY0LCAweEI1LCAweDdELCAweEVDLCAweEYyLCAweEI1LCAweDdFLCAvKiAweDYwLTB4NjMgKi8KKwkweEI1LCAweDgwLCAweENGLCAweEU5LCAweEI1LCAweDgxLCAweEVDLCAweEY2LCAvKiAweDY0LTB4NjcgKi8KKwkweEM2LCAweEIxLCAweEI1LCAweDgyLCAweEI1LCAweDgzLCAweEI1LCAweDg0LCAvKiAweDY4LTB4NkIgKi8KKwkweEI1LCAweDg1LCAweEJDLCAweEMwLCAweEI1LCAweDg2LCAweEVDLCAweEY1LCAvKiAweDZDLTB4NkYgKi8KKwkweEI1LCAweDg3LCAweEI1LCAweDg4LCAweEI1LCAweDg5LCAweEI1LCAweDhBLCAvKiAweDcwLTB4NzMgKi8KKwkweEI1LCAweDhCLCAweEI1LCAweDhDLCAweEI1LCAweDhELCAweEI1LCAweEJCLCAvKiAweDc0LTB4NzcgKi8KKwkweEJCLCAweEY2LCAweEI1LCAweDhFLCAweEVDLCAweEY3LCAweEI1LCAweDhGLCAvKiAweDc4LTB4N0IgKi8KKwkweEI1LCAweDkwLCAweEI1LCAweDkxLCAweEI1LCAweDkyLCAweEI1LCAweDkzLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEQ5LCAweEY3LCAweEJELCAweEZCLCAweEI1LCAweDk0LCAweEI1LCAweDk1LCAvKiAweDgwLTB4ODMgKi8KKwkweEMyLCAweEJCLCAweEVDLCAweEY4LCAweEI1LCAweDk2LCAweEI1LCAweDk3LCAvKiAweDg0LTB4ODcgKi8KKwkweEI1LCAweDk4LCAweEI1LCAweDk5LCAweEVDLCAweEY5LCAweEI1LCAweDlBLCAvKiAweDg4LTB4OEIgKi8KKwkweEI1LCAweDlCLCAweEI1LCAweDlDLCAweEI1LCAweDlELCAweEI4LCAweEEzLCAvKiAweDhDLTB4OEYgKi8KKwkweEI1LCAweDlFLCAweEI1LCAweDlGLCAweEI1LCAweEEwLCAweEI2LCAweDQwLCAvKiAweDkwLTB4OTMgKi8KKwkweEI2LCAweDQxLCAweEI2LCAweDQyLCAweEI2LCAweDQzLCAweEI2LCAweDQ0LCAvKiAweDk0LTB4OTcgKi8KKwkweEI2LCAweDQ1LCAweEI2LCAweDQ2LCAweEVDLCAweEZBLCAweEI2LCAweDQ3LCAvKiAweDk4LTB4OUIgKi8KKwkweEI2LCAweDQ4LCAweEI2LCAweDQ5LCAweEI2LCAweDRBLCAweEI2LCAweDRCLCAvKiAweDlDLTB4OUYgKi8KKwkweEI2LCAweDRDLCAweEI2LCAweDRELCAweEI2LCAweDRFLCAweEI2LCAweDRGLCAvKiAweEEwLTB4QTMgKi8KKwkweEI2LCAweDUwLCAweEI2LCAweDUxLCAweEI2LCAweDUyLCAweEVDLCAweEZCLCAvKiAweEE0LTB4QTcgKi8KKwkweEI2LCAweDUzLCAweEI2LCAweDU0LCAweEI2LCAweDU1LCAweEI2LCAweDU2LCAvKiAweEE4LTB4QUIgKi8KKwkweEI2LCAweDU3LCAweEI2LCAweDU4LCAweEI2LCAweDU5LCAweEI2LCAweDVBLCAvKiAweEFDLTB4QUYgKi8KKwkweEI2LCAweDVCLCAweEI2LCAweDVDLCAweEI2LCAweDVELCAweEVDLCAweEZDLCAvKiAweEIwLTB4QjMgKi8KKwkweEI2LCAweDVFLCAweEI2LCAweDVGLCAweEI2LCAweDYwLCAweEI2LCAweDYxLCAvKiAweEI0LTB4QjcgKi8KKwkweEI2LCAweDYyLCAweEQzLCAweEVELCAweEQ4LCAweEFFLCAweEMwLCAweEVCLCAvKiAweEI4LTB4QkIgKi8KKwkweEI2LCAweDYzLCAweEM3LCAweERELCAweEJBLCAweENDLCAweEI2LCAweDY0LCAvKiAweEJDLTB4QkYgKi8KKwkweEQwLCAweEUzLCAweENCLCAweEJELCAweEI2LCAweDY1LCAweENELCAweEJBLCAvKiAweEMwLTB4QzMgKi8KKwkweEI2LCAweDY2LCAweEI2LCAweDY3LCAweEI4LCAweEQxLCAweEI2LCAweDY4LCAvKiAweEM0LTB4QzcgKi8KKwkweEI2LCAweDY5LCAweEIxLCAweEZDLCAweEI2LCAweDZBLCAweEM3LCAweEVGLCAvKiAweEM4LTB4Q0IgKi8KKwkweEI2LCAweDZCLCAweEQ2LCAweEQ2LCAweEI2LCAweDZDLCAweEI2LCAweDZELCAvKiAweENDLTB4Q0YgKi8KKwkweEI2LCAweDZFLCAweEJGLCAweEM2LCAweEMzLCAweEVCLCAweEI2LCAweDZGLCAvKiAweEQwLTB4RDMgKi8KKwkweEI2LCAweDcwLCAweEVGLCAweEY1LCAweEI2LCAweDcxLCAweEI2LCAweDcyLCAvKiAweEQ0LTB4RDcgKi8KKwkweEMzLCAweEQ4LCAweEI2LCAweDczLCAweEI2LCAweDc0LCAweEI2LCAweDc1LCAvKiAweEQ4LTB4REIgKi8KKwkweEI2LCAweDc2LCAweEI2LCAweDc3LCAweEI2LCAweDc4LCAweEQ3LCAweEUyLCAvKiAweERDLTB4REYgKi8KKwkweEI2LCAweDc5LCAweEI2LCAweDdBLCAweEI2LCAweDdCLCAweEVGLCAweEY3LCAvKiAweEUwLTB4RTMgKi8KKwkweEIzLCAweEQzLCAweEI2LCAweDdDLCAweEM3LCAweEQ4LCAweEQxLCAweEVELCAvKiAweEU0LTB4RTcgKi8KKwkweEI2LCAweDdELCAweEQ2LCAweEM4LCAweEI2LCAweDdFLCAweEVGLCAweEY4LCAvKiAweEU4LTB4RUIgKi8KKwkweEI2LCAweDgwLCAweEVGLCAweEY2LCAweEI2LCAweDgxLCAweEJCLCAweEZELCAvKiAweEVDLTB4RUYgKi8KKwkweEIzLCAweEM2LCAweEI2LCAweDgyLCAweEI2LCAweDgzLCAweEI2LCAweDg0LCAvKiAweEYwLTB4RjMgKi8KKwkweEI2LCAweDg1LCAweEI2LCAweDg2LCAweEI2LCAweDg3LCAweEI2LCAweDg4LCAvKiAweEY0LTB4RjcgKi8KKwkweEJELCAweEQ1LCAweEI2LCAweDg5LCAweEI2LCAweDhBLCAweEQyLCAweEM2LCAvKiAweEY4LTB4RkIgKi8KKwkweEI2LCAweDhCLCAweEJCLCAweEUwLCAweEI2LCAweDhDLCAweEI2LCAweDhELCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183QVs1MTJdID0geworCTB4Q0YsIDB4QTEsIDB4QjYsIDB4OEUsIDB4RUYsIDB4RkMsIDB4RUYsIDB4RkIsIC8qIDB4MDAtMHgwMyAqLworCTB4QjYsIDB4OEYsIDB4QjYsIDB4OTAsIDB4RUYsIDB4RjksIDB4QjYsIDB4OTEsIC8qIDB4MDQtMHgwNyAqLworCTB4QjYsIDB4OTIsIDB4QjYsIDB4OTMsIDB4QjYsIDB4OTQsIDB4QjMsIDB4Q0MsIC8qIDB4MDgtMHgwQiAqLworCTB4QjYsIDB4OTUsIDB4QzksIDB4RDQsIDB4Q0IsIDB4QjAsIDB4QjYsIDB4OTYsIC8qIDB4MEMtMHgwRiAqLworCTB4QjYsIDB4OTcsIDB4QjYsIDB4OTgsIDB4QjYsIDB4OTksIDB4QjYsIDB4OUEsIC8qIDB4MTAtMHgxMyAqLworCTB4RUYsIDB4RkUsIDB4QjYsIDB4OUIsIDB4QjYsIDB4OUMsIDB4QjAsIDB4REUsIC8qIDB4MTQtMHgxNyAqLworCTB4QjYsIDB4OUQsIDB4QjYsIDB4OUUsIDB4RDYsIDB4QzksIDB4QjYsIDB4OUYsIC8qIDB4MTgtMHgxQiAqLworCTB4QjYsIDB4QTAsIDB4QjcsIDB4NDAsIDB4RUYsIDB4RkQsIDB4QjcsIDB4NDEsIC8qIDB4MUMtMHgxRiAqLworCTB4QjMsIDB4RUQsIDB4QjcsIDB4NDIsIDB4QjcsIDB4NDMsIDB4RjYsIDB4RDUsIC8qIDB4MjAtMHgyMyAqLworCTB4QjcsIDB4NDQsIDB4QjcsIDB4NDUsIDB4QjcsIDB4NDYsIDB4QjcsIDB4NDcsIC8qIDB4MjQtMHgyNyAqLworCTB4QjcsIDB4NDgsIDB4QjcsIDB4NDksIDB4QjcsIDB4NEEsIDB4QjcsIDB4NEIsIC8qIDB4MjgtMHgyQiAqLworCTB4QjcsIDB4NEMsIDB4QjcsIDB4NEQsIDB4QjcsIDB4NEUsIDB4QjcsIDB4NEYsIC8qIDB4MkMtMHgyRiAqLworCTB4QjcsIDB4NTAsIDB4QjcsIDB4NTEsIDB4QjcsIDB4NTIsIDB4Q0UsIDB4QzgsIC8qIDB4MzAtMHgzMyAqLworCTB4QjcsIDB4NTMsIDB4QjcsIDB4NTQsIDB4QjcsIDB4NTUsIDB4RjAsIDB4QTIsIC8qIDB4MzQtMHgzNyAqLworCTB4QjcsIDB4NTYsIDB4RjAsIDB4QTEsIDB4QjcsIDB4NTcsIDB4QjUsIDB4QkUsIC8qIDB4MzgtMHgzQiAqLworCTB4QkMsIDB4REEsIDB4QkIsIDB4RkMsIDB4QjcsIDB4NTgsIDB4QjgsIDB4RTUsIC8qIDB4M0MtMHgzRiAqLworCTB4QjcsIDB4NTksIDB4QjcsIDB4NUEsIDB4QjcsIDB4NUIsIDB4QjcsIDB4NUMsIC8qIDB4NDAtMHg0MyAqLworCTB4QjcsIDB4NUQsIDB4QjcsIDB4NUUsIDB4QzQsIDB4QzIsIDB4QjcsIDB4NUYsIC8qIDB4NDQtMHg0NyAqLworCTB4QjcsIDB4NjAsIDB4QjcsIDB4NjEsIDB4QjcsIDB4NjIsIDB4QjcsIDB4NjMsIC8qIDB4NDgtMHg0QiAqLworCTB4QjcsIDB4NjQsIDB4QjcsIDB4NjUsIDB4QjcsIDB4NjYsIDB4QjcsIDB4NjcsIC8qIDB4NEMtMHg0RiAqLworCTB4QjcsIDB4NjgsIDB4RjAsIDB4QTMsIDB4QjcsIDB4NjksIDB4QjcsIDB4NkEsIC8qIDB4NTAtMHg1MyAqLworCTB4QjcsIDB4NkIsIDB4QjcsIDB4NkMsIDB4QjcsIDB4NkQsIDB4Q0IsIDB4RUIsIC8qIDB4NTQtMHg1NyAqLworCTB4QjcsIDB4NkUsIDB4QjcsIDB4NkYsIDB4QjcsIDB4NzAsIDB4QjcsIDB4NzEsIC8qIDB4NTgtMHg1QiAqLworCTB4QjcsIDB4NzIsIDB4QjcsIDB4NzMsIDB4QjcsIDB4NzQsIDB4QjcsIDB4NzUsIC8qIDB4NUMtMHg1RiAqLworCTB4QjcsIDB4NzYsIDB4QjcsIDB4NzcsIDB4QjcsIDB4NzgsIDB4QjcsIDB4NzksIC8qIDB4NjAtMHg2MyAqLworCTB4QjcsIDB4N0EsIDB4QjcsIDB4N0IsIDB4QjcsIDB4N0MsIDB4QjcsIDB4N0QsIC8qIDB4NjQtMHg2NyAqLworCTB4QjcsIDB4N0UsIDB4QjcsIDB4ODAsIDB4QjcsIDB4ODEsIDB4QjcsIDB4ODIsIC8qIDB4NjgtMHg2QiAqLworCTB4QjcsIDB4ODMsIDB4QjcsIDB4ODQsIDB4QjcsIDB4ODUsIDB4QjcsIDB4ODYsIC8qIDB4NkMtMHg2RiAqLworCTB4RjAsIDB4QTYsIDB4QjcsIDB4ODcsIDB4QjcsIDB4ODgsIDB4QjcsIDB4ODksIC8qIDB4NzAtMHg3MyAqLworCTB4RDEsIDB4QTgsIDB4QjcsIDB4OEEsIDB4QkUsIDB4QkYsIDB4QzcsIDB4RUUsIC8qIDB4NzQtMHg3NyAqLworCTB4RjEsIDB4QjYsIDB4RjEsIDB4QjcsIDB4QkYsIDB4RDUsIDB4QjcsIDB4OEIsIC8qIDB4NzgtMHg3QiAqLworCTB4QjcsIDB4OEMsIDB4QjcsIDB4OEQsIDB4QjcsIDB4OEUsIDB4QjQsIDB4QTksIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RjEsIDB4QjgsIDB4Q0QsIDB4QkIsIDB4QjcsIDB4OEYsIDB4QzcsIDB4RDQsIC8qIDB4ODAtMHg4MyAqLworCTB4RDUsIDB4QUQsIDB4QjcsIDB4OTAsIDB4RjEsIDB4QjksIDB4QjcsIDB4OTEsIC8qIDB4ODQtMHg4NyAqLworCTB4RjEsIDB4QkEsIDB4QjcsIDB4OTIsIDB4QjcsIDB4OTMsIDB4QjcsIDB4OTQsIC8qIDB4ODgtMHg4QiAqLworCTB4QjcsIDB4OTUsIDB4QzcsIDB4Q0YsIDB4QjcsIDB4OTYsIDB4QjcsIDB4OTcsIC8qIDB4OEMtMHg4RiAqLworCTB4QjcsIDB4OTgsIDB4RDIsIDB4QTQsIDB4RDYsIDB4Q0YsIDB4QjcsIDB4OTksIC8qIDB4OTAtMHg5MyAqLworCTB4QjcsIDB4OUEsIDB4RjEsIDB4QkIsIDB4QkQsIDB4RDEsIDB4QjQsIDB4QjAsIC8qIDB4OTQtMHg5NyAqLworCTB4QkUsIDB4QkQsIDB4QjcsIDB4OUIsIDB4QjcsIDB4OUMsIDB4QjcsIDB4OUQsIC8qIDB4OTgtMHg5QiAqLworCTB4QjQsIDB4REMsIDB4Q0UsIDB4RDEsIDB4QjcsIDB4OUUsIDB4QkYsIDB4REYsIC8qIDB4OUMtMHg5RiAqLworCTB4RjEsIDB4QkQsIDB4QjcsIDB4OUYsIDB4QjcsIDB4QTAsIDB4QjgsIDB4NDAsIC8qIDB4QTAtMHhBMyAqLworCTB4QjgsIDB4NDEsIDB4QkYsIDB4RkEsIDB4RjEsIDB4QkMsIDB4QjgsIDB4NDIsIC8qIDB4QTQtMHhBNyAqLworCTB4RjEsIDB4QkYsIDB4QjgsIDB4NDMsIDB4QjgsIDB4NDQsIDB4QjgsIDB4NDUsIC8qIDB4QTgtMHhBQiAqLworCTB4RjEsIDB4QkUsIDB4RjEsIDB4QzAsIDB4QjgsIDB4NDYsIDB4QjgsIDB4NDcsIC8qIDB4QUMtMHhBRiAqLworCTB4QjgsIDB4NDgsIDB4QjgsIDB4NDksIDB4QjgsIDB4NEEsIDB4RjEsIDB4QzEsIC8qIDB4QjAtMHhCMyAqLworCTB4QjgsIDB4NEIsIDB4QjgsIDB4NEMsIDB4QjgsIDB4NEQsIDB4QjgsIDB4NEUsIC8qIDB4QjQtMHhCNyAqLworCTB4QjgsIDB4NEYsIDB4QjgsIDB4NTAsIDB4QjgsIDB4NTEsIDB4QjgsIDB4NTIsIC8qIDB4QjgtMHhCQiAqLworCTB4QjgsIDB4NTMsIDB4QjgsIDB4NTQsIDB4QjgsIDB4NTUsIDB4QzEsIDB4RkUsIC8qIDB4QkMtMHhCRiAqLworCTB4QjgsIDB4NTYsIDB4QjgsIDB4NTcsIDB4QjgsIDB4NTgsIDB4QjgsIDB4NTksIC8qIDB4QzAtMHhDMyAqLworCTB4QjgsIDB4NUEsIDB4QjgsIDB4NUIsIDB4QjgsIDB4NUMsIDB4QjgsIDB4NUQsIC8qIDB4QzQtMHhDNyAqLworCTB4QjgsIDB4NUUsIDB4QjgsIDB4NUYsIDB4QjgsIDB4NjAsIDB4QzEsIDB4QTIsIC8qIDB4QzgtMHhDQiAqLworCTB4QjgsIDB4NjEsIDB4QjgsIDB4NjIsIDB4QjgsIDB4NjMsIDB4QjgsIDB4NjQsIC8qIDB4Q0MtMHhDRiAqLworCTB4QjgsIDB4NjUsIDB4QjgsIDB4NjYsIDB4QjgsIDB4NjcsIDB4QjgsIDB4NjgsIC8qIDB4RDAtMHhEMyAqLworCTB4QjgsIDB4NjksIDB4QjgsIDB4NkEsIDB4Q0EsIDB4RkEsIDB4QjgsIDB4NkIsIC8qIDB4RDQtMHhENyAqLworCTB4QjgsIDB4NkMsIDB4RDUsIDB4QkUsIDB4QjgsIDB4NkQsIDB4QjgsIDB4NkUsIC8qIDB4RDgtMHhEQiAqLworCTB4QjgsIDB4NkYsIDB4QjgsIDB4NzAsIDB4QkUsIDB4QkEsIDB4QkUsIDB4QjksIC8qIDB4REMtMHhERiAqLworCTB4RDUsIDB4QzIsIDB4QjgsIDB4NzEsIDB4QjgsIDB4NzIsIDB4QkYsIDB4QTIsIC8qIDB4RTAtMHhFMyAqLworCTB4QjgsIDB4NzMsIDB4Q0QsIDB4QUYsIDB4RjEsIDB4QjUsIDB4QjgsIDB4NzQsIC8qIDB4RTQtMHhFNyAqLworCTB4QjgsIDB4NzUsIDB4QjgsIDB4NzYsIDB4QjgsIDB4NzcsIDB4QjgsIDB4NzgsIC8qIDB4RTgtMHhFQiAqLworCTB4QjgsIDB4NzksIDB4QkQsIDB4REYsIDB4QjgsIDB4N0EsIDB4QjYsIDB4Q0IsIC8qIDB4RUMtMHhFRiAqLworCTB4QjgsIDB4N0IsIDB4QjgsIDB4N0MsIDB4QjgsIDB4N0QsIDB4QjgsIDB4N0UsIC8qIDB4RjAtMHhGMyAqLworCTB4QjgsIDB4ODAsIDB4QjgsIDB4ODEsIDB4QjgsIDB4ODIsIDB4QjgsIDB4ODMsIC8qIDB4RjQtMHhGNyAqLworCTB4QjgsIDB4ODQsIDB4RDYsIDB4RjEsIDB4RjMsIDB4QzMsIDB4QjgsIDB4ODUsIC8qIDB4RjgtMHhGQiAqLworCTB4QjgsIDB4ODYsIDB4RjMsIDB4QzQsIDB4QjgsIDB4ODcsIDB4QjgsIDB4Q0QsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzdCWzUxMl0gPSB7CisJMHhCOCwgMHg4OCwgMHhCOCwgMHg4OSwgMHhCOCwgMHg4QSwgMHhGMywgMHhDNiwgLyogMHgwMC0weDAzICovCisJMHhGMywgMHhDNywgMHhCOCwgMHg4QiwgMHhCMCwgMHhDQSwgMHhCOCwgMHg4QywgLyogMHgwNC0weDA3ICovCisJMHhGMywgMHhDNSwgMHhCOCwgMHg4RCwgMHhGMywgMHhDOSwgMHhDQiwgMHhGMSwgLyogMHgwOC0weDBCICovCisJMHhCOCwgMHg4RSwgMHhCOCwgMHg4RiwgMHhCOCwgMHg5MCwgMHhGMywgMHhDQiwgLyogMHgwQy0weDBGICovCisJMHhCOCwgMHg5MSwgMHhEMCwgMHhBNiwgMHhCOCwgMHg5MiwgMHhCOCwgMHg5MywgLyogMHgxMC0weDEzICovCisJMHhCMSwgMHhDQSwgMHhGMywgMHhDOCwgMHhCOCwgMHg5NCwgMHhCOCwgMHg5NSwgLyogMHgxNC0weDE3ICovCisJMHhCOCwgMHg5NiwgMHhGMywgMHhDRiwgMHhCOCwgMHg5NywgMHhCNSwgMHhEMSwgLyogMHgxOC0weDFCICovCisJMHhCOCwgMHg5OCwgMHhCOCwgMHg5OSwgMHhGMywgMHhENywgMHhCOCwgMHg5QSwgLyogMHgxQy0weDFGICovCisJMHhGMywgMHhEMiwgMHhCOCwgMHg5QiwgMHhCOCwgMHg5QywgMHhCOCwgMHg5RCwgLyogMHgyMC0weDIzICovCisJMHhGMywgMHhENCwgMHhGMywgMHhEMywgMHhCNywgMHhGQiwgMHhCOCwgMHg5RSwgLyogMHgyNC0weDI3ICovCisJMHhCMSwgMHhCRiwgMHhCOCwgMHg5RiwgMHhGMywgMHhDRSwgMHhGMywgMHhDQSwgLyogMHgyOC0weDJCICovCisJMHhCNSwgMHhEQSwgMHhCOCwgMHhBMCwgMHhGMywgMHhEMCwgMHhCOSwgMHg0MCwgLyogMHgyQy0weDJGICovCisJMHhCOSwgMHg0MSwgMHhGMywgMHhEMSwgMHhCOSwgMHg0MiwgMHhGMywgMHhENSwgLyogMHgzMC0weDMzICovCisJMHhCOSwgMHg0MywgMHhCOSwgMHg0NCwgMHhCOSwgMHg0NSwgMHhCOSwgMHg0NiwgLyogMHgzNC0weDM3ICovCisJMHhGMywgMHhDRCwgMHhCOSwgMHg0NywgMHhCQywgMHhFMywgMHhCOSwgMHg0OCwgLyogMHgzOC0weDNCICovCisJMHhDMSwgMHhGRCwgMHhCOSwgMHg0OSwgMHhGMywgMHhENiwgMHhCOSwgMHg0QSwgLyogMHgzQy0weDNGICovCisJMHhCOSwgMHg0QiwgMHhCOSwgMHg0QywgMHhCOSwgMHg0RCwgMHhCOSwgMHg0RSwgLyogMHg0MC0weDQzICovCisJMHhCOSwgMHg0RiwgMHhGMywgMHhEQSwgMHhCOSwgMHg1MCwgMHhGMywgMHhDQywgLyogMHg0NC0weDQ3ICovCisJMHhCOSwgMHg1MSwgMHhCNSwgMHhDOCwgMHhCOSwgMHg1MiwgMHhCRCwgMHhFRSwgLyogMHg0OC0weDRCICovCisJMHhGMywgMHhEQywgMHhCOSwgMHg1MywgMHhCOSwgMHg1NCwgMHhCNywgMHhBNCwgLyogMHg0Qy0weDRGICovCisJMHhCRiwgMHhGMCwgMHhENiwgMHhGRSwgMHhDRCwgMHhCMiwgMHhCOSwgMHg1NSwgLyogMHg1MC0weDUzICovCisJMHhCNCwgMHhGMCwgMHhCOSwgMHg1NiwgMHhCMiwgMHhERiwgMHhCOSwgMHg1NywgLyogMHg1NC0weDU3ICovCisJMHhGMywgMHhEOCwgMHhCOSwgMHg1OCwgMHhGMywgMHhEOSwgMHhDOSwgMHhCOCwgLyogMHg1OC0weDVCICovCisJMHhCOSwgMHg1OSwgMHhGMywgMHhERCwgMHhCOSwgMHg1QSwgMHhCOSwgMHg1QiwgLyogMHg1Qy0weDVGICovCisJMHhGMywgMHhERSwgMHhCOSwgMHg1QywgMHhGMywgMHhFMSwgMHhCOSwgMHg1RCwgLyogMHg2MC0weDYzICovCisJMHhCOSwgMHg1RSwgMHhCOSwgMHg1RiwgMHhCOSwgMHg2MCwgMHhCOSwgMHg2MSwgLyogMHg2NC0weDY3ICovCisJMHhCOSwgMHg2MiwgMHhCOSwgMHg2MywgMHhCOSwgMHg2NCwgMHhCOSwgMHg2NSwgLyogMHg2OC0weDZCICovCisJMHhCOSwgMHg2NiwgMHhCOSwgMHg2NywgMHhGMywgMHhERiwgMHhCOSwgMHg2OCwgLyogMHg2Qy0weDZGICovCisJMHhCOSwgMHg2OSwgMHhGMywgMHhFMywgMHhGMywgMHhFMiwgMHhCOSwgMHg2QSwgLyogMHg3MC0weDczICovCisJMHhCOSwgMHg2QiwgMHhGMywgMHhEQiwgMHhCOSwgMHg2QywgMHhCRiwgMHhFQSwgLyogMHg3NC0weDc3ICovCisJMHhCOSwgMHg2RCwgMHhCMywgMHhFRiwgMHhCOSwgMHg2RSwgMHhGMywgMHhFMCwgLyogMHg3OC0weDdCICovCisJMHhCOSwgMHg2RiwgMHhCOSwgMHg3MCwgMHhDNywgMHhBOSwgMHhCOSwgMHg3MSwgLyogMHg3Qy0weDdGICovCisJCisJMHhCQywgMHhGMiwgMHhCOSwgMHg3MiwgMHhCOSwgMHg3MywgMHhCOSwgMHg3NCwgLyogMHg4MC0weDgzICovCisJMHhCOSwgMHg3NSwgMHhGMywgMHhFQiwgMHhCOSwgMHg3NiwgMHhCOSwgMHg3NywgLyogMHg4NC0weDg3ICovCisJMHhCOSwgMHg3OCwgMHhCOSwgMHg3OSwgMHhCOSwgMHg3QSwgMHhCOSwgMHg3QiwgLyogMHg4OC0weDhCICovCisJMHhCOSwgMHg3QywgMHhCOSwgMHhCRiwgMHhCOSwgMHg3RCwgMHhCOSwgMHg3RSwgLyogMHg4Qy0weDhGICovCisJMHhGMywgMHhFNCwgMHhCOSwgMHg4MCwgMHhCOSwgMHg4MSwgMHhCOSwgMHg4MiwgLyogMHg5MC0weDkzICovCisJMHhCMiwgMHhBRCwgMHhCQiwgMHhGRSwgMHhCOSwgMHg4MywgMHhDQiwgMHhFMywgLyogMHg5NC0weDk3ICovCisJMHhCOSwgMHg4NCwgMHhCOSwgMHg4NSwgMHhCOSwgMHg4NiwgMHhCOSwgMHg4NywgLyogMHg5OC0weDlCICovCisJMHhGMywgMHhFRCwgMHhGMywgMHhFOSwgMHhCOSwgMHg4OCwgMHhCOSwgMHg4OSwgLyogMHg5Qy0weDlGICovCisJMHhCOSwgMHg4QSwgMHhCOSwgMHhEQywgMHhGMywgMHhFRSwgMHhCOSwgMHg4QiwgLyogMHhBMC0weEEzICovCisJMHhCOSwgMHg4QywgMHhCOSwgMHg4RCwgMHhGMywgMHhFNSwgMHhGMywgMHhFNiwgLyogMHhBNC0weEE3ICovCisJMHhGMywgMHhFQSwgMHhDMiwgMHhFMSwgMHhGMywgMHhFQywgMHhGMywgMHhFRiwgLyogMHhBOC0weEFCICovCisJMHhGMywgMHhFOCwgMHhCQywgMHhGRCwgMHhCOSwgMHg4RSwgMHhCOSwgMHg4RiwgLyogMHhBQy0weEFGICovCisJMHhCOSwgMHg5MCwgMHhDRiwgMHhFNCwgMHhCOSwgMHg5MSwgMHhCOSwgMHg5MiwgLyogMHhCMC0weEIzICovCisJMHhGMywgMHhGMCwgMHhCOSwgMHg5MywgMHhCOSwgMHg5NCwgMHhCOSwgMHg5NSwgLyogMHhCNC0weEI3ICovCisJMHhGMywgMHhFNywgMHhCOSwgMHg5NiwgMHhCOSwgMHg5NywgMHhCOSwgMHg5OCwgLyogMHhCOC0weEJCICovCisJMHhCOSwgMHg5OSwgMHhCOSwgMHg5QSwgMHhCOSwgMHg5QiwgMHhCOSwgMHg5QywgLyogMHhCQy0weEJGICovCisJMHhCOSwgMHg5RCwgMHhGMywgMHhGMiwgMHhCOSwgMHg5RSwgMHhCOSwgMHg5RiwgLyogMHhDMC0weEMzICovCisJMHhCOSwgMHhBMCwgMHhCQSwgMHg0MCwgMHhENywgMHhBRCwgMHhDNiwgMHhBQSwgLyogMHhDNC0weEM3ICovCisJMHhCQSwgMHg0MSwgMHhCQSwgMHg0MiwgMHhCQSwgMHg0MywgMHhCQSwgMHg0NCwgLyogMHhDOC0weENCICovCisJMHhGMywgMHhGMywgMHhCQSwgMHg0NSwgMHhCQSwgMHg0NiwgMHhCQSwgMHg0NywgLyogMHhDQy0weENGICovCisJMHhCQSwgMHg0OCwgMHhGMywgMHhGMSwgMHhCQSwgMHg0OSwgMHhDMiwgMHhBOCwgLyogMHhEMC0weEQzICovCisJMHhCQSwgMHg0QSwgMHhCQSwgMHg0QiwgMHhCQSwgMHg0QywgMHhCQSwgMHg0RCwgLyogMHhENC0weEQ3ICovCisJMHhCQSwgMHg0RSwgMHhCOCwgMHhERCwgMHhGMywgMHhGNSwgMHhCQSwgMHg0RiwgLyogMHhEOC0weERCICovCisJMHhCQSwgMHg1MCwgMHhGMywgMHhGNCwgMHhCQSwgMHg1MSwgMHhCQSwgMHg1MiwgLyogMHhEQy0weERGICovCisJMHhCQSwgMHg1MywgMHhCNCwgMHhEQiwgMHhCQSwgMHg1NCwgMHhCQSwgMHg1NSwgLyogMHhFMC0weEUzICovCisJMHhCQSwgMHg1NiwgMHhGMywgMHhGNiwgMHhGMywgMHhGNywgMHhCQSwgMHg1NywgLyogMHhFNC0weEU3ICovCisJMHhCQSwgMHg1OCwgMHhCQSwgMHg1OSwgMHhGMywgMHhGOCwgMHhCQSwgMHg1QSwgLyogMHhFOC0weEVCICovCisJMHhCQSwgMHg1QiwgMHhCQSwgMHg1QywgMHhDMCwgMHhCQSwgMHhCQSwgMHg1RCwgLyogMHhFQy0weEVGICovCisJMHhCQSwgMHg1RSwgMHhDMCwgMHhFOSwgMHhCQSwgMHg1RiwgMHhCQSwgMHg2MCwgLyogMHhGMC0weEYzICovCisJMHhCQSwgMHg2MSwgMHhCQSwgMHg2MiwgMHhCQSwgMHg2MywgMHhDNSwgMHhGMSwgLyogMHhGNC0weEY3ICovCisJMHhCQSwgMHg2NCwgMHhCQSwgMHg2NSwgMHhCQSwgMHg2NiwgMHhCQSwgMHg2NywgLyogMHhGOC0weEZCICovCisJMHhGMywgMHhGQiwgMHhCQSwgMHg2OCwgMHhGMywgMHhGQSwgMHhCQSwgMHg2OSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfN0NbNTEyXSA9IHsKKwkweEJBLCAweDZBLCAweEJBLCAweDZCLCAweEJBLCAweDZDLCAweEJBLCAweDZELCAvKiAweDAwLTB4MDMgKi8KKwkweEJBLCAweDZFLCAweEJBLCAweDZGLCAweEJBLCAweDcwLCAweEI0LCAweEQ4LCAvKiAweDA0LTB4MDcgKi8KKwkweEJBLCAweDcxLCAweEJBLCAweDcyLCAweEJBLCAweDczLCAweEYzLCAweEZFLCAvKiAweDA4LTB4MEIgKi8KKwkweEYzLCAweEY5LCAweEJBLCAweDc0LCAweEJBLCAweDc1LCAweEYzLCAweEZDLCAvKiAweDBDLTB4MEYgKi8KKwkweEJBLCAweDc2LCAweEJBLCAweDc3LCAweEJBLCAweDc4LCAweEJBLCAweDc5LCAvKiAweDEwLTB4MTMgKi8KKwkweEJBLCAweDdBLCAweEJBLCAweDdCLCAweEYzLCAweEZELCAweEJBLCAweDdDLCAvKiAweDE0LTB4MTcgKi8KKwkweEJBLCAweDdELCAweEJBLCAweDdFLCAweEJBLCAweDgwLCAweEJBLCAweDgxLCAvKiAweDE4LTB4MUIgKi8KKwkweEJBLCAweDgyLCAweEJBLCAweDgzLCAweEJBLCAweDg0LCAweEY0LCAweEExLCAvKiAweDFDLTB4MUYgKi8KKwkweEJBLCAweDg1LCAweEJBLCAweDg2LCAweEJBLCAweDg3LCAweEJBLCAweDg4LCAvKiAweDIwLTB4MjMgKi8KKwkweEJBLCAweDg5LCAweEJBLCAweDhBLCAweEY0LCAweEEzLCAweEJCLCAweEM5LCAvKiAweDI0LTB4MjcgKi8KKwkweEJBLCAweDhCLCAweEJBLCAweDhDLCAweEY0LCAweEEyLCAweEJBLCAweDhELCAvKiAweDI4LTB4MkIgKi8KKwkweEJBLCAweDhFLCAweEJBLCAweDhGLCAweEJBLCAweDkwLCAweEJBLCAweDkxLCAvKiAweDJDLTB4MkYgKi8KKwkweEJBLCAweDkyLCAweEJBLCAweDkzLCAweEJBLCAweDk0LCAweEJBLCAweDk1LCAvKiAweDMwLTB4MzMgKi8KKwkweEJBLCAweDk2LCAweEJBLCAweDk3LCAweEJBLCAweDk4LCAweEJBLCAweDk5LCAvKiAweDM0LTB4MzcgKi8KKwkweEY0LCAweEE0LCAweEJBLCAweDlBLCAweEJBLCAweDlCLCAweEJBLCAweDlDLCAvKiAweDM4LTB4M0IgKi8KKwkweEJBLCAweDlELCAweEJBLCAweDlFLCAweEJBLCAweDlGLCAweEIyLCAweEJFLCAvKiAweDNDLTB4M0YgKi8KKwkweEY0LCAweEE2LCAweEY0LCAweEE1LCAweEJBLCAweEEwLCAweEJCLCAweDQwLCAvKiAweDQwLTB4NDMgKi8KKwkweEJCLCAweDQxLCAweEJCLCAweDQyLCAweEJCLCAweDQzLCAweEJCLCAweDQ0LCAvKiAweDQ0LTB4NDcgKi8KKwkweEJCLCAweDQ1LCAweEJCLCAweDQ2LCAweEJCLCAweDQ3LCAweEJCLCAweDQ4LCAvKiAweDQ4LTB4NEIgKi8KKwkweEJCLCAweDQ5LCAweEJDLCAweEFFLCAweEJCLCAweDRBLCAweEJCLCAweDRCLCAvKiAweDRDLTB4NEYgKi8KKwkweEJCLCAweDRDLCAweEJCLCAweDRELCAweEJCLCAweDRFLCAweEJCLCAweDRGLCAvKiAweDUwLTB4NTMgKi8KKwkweEJCLCAweDUwLCAweEJCLCAweDUxLCAweEJCLCAweDUyLCAweEJCLCAweDUzLCAvKiAweDU0LTB4NTcgKi8KKwkweEJCLCAweDU0LCAweEJCLCAweDU1LCAweEJCLCAweDU2LCAweEJCLCAweDU3LCAvKiAweDU4LTB4NUIgKi8KKwkweEJCLCAweDU4LCAweEJCLCAweDU5LCAweEJCLCAweDVBLCAweEJCLCAweDVCLCAvKiAweDVDLTB4NUYgKi8KKwkweEJCLCAweDVDLCAweEJCLCAweDVELCAweEJCLCAweDVFLCAweEJCLCAweDVGLCAvKiAweDYwLTB4NjMgKi8KKwkweEJCLCAweDYwLCAweEJCLCAweDYxLCAweEJCLCAweDYyLCAweEJCLCAweDYzLCAvKiAweDY0LTB4NjcgKi8KKwkweEJCLCAweDY0LCAweEJCLCAweDY1LCAweEJCLCAweDY2LCAweEJCLCAweDY3LCAvKiAweDY4LTB4NkIgKi8KKwkweEJCLCAweDY4LCAweEJCLCAweDY5LCAweEJCLCAweDZBLCAweEJCLCAweDZCLCAvKiAweDZDLTB4NkYgKi8KKwkweEJCLCAweDZDLCAweEJCLCAweDZELCAweEJCLCAweDZFLCAweEMzLCAweEQ3LCAvKiAweDcwLTB4NzMgKi8KKwkweEQ5LCAweEUxLCAweEJCLCAweDZGLCAweEJCLCAweDcwLCAweEJCLCAweDcxLCAvKiAweDc0LTB4NzcgKi8KKwkweEJCLCAweDcyLCAweEJCLCAweDczLCAweEJCLCAweDc0LCAweEMwLCAweEUwLCAvKiAweDc4LTB4N0IgKi8KKwkweEY0LCAweENDLCAweEQ3LCAweEQxLCAweEJCLCAweDc1LCAweEJCLCAweDc2LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEJCLCAweDc3LCAweEJCLCAweDc4LCAweEJCLCAweDc5LCAweEJCLCAweDdBLCAvKiAweDgwLTB4ODMgKi8KKwkweEJCLCAweDdCLCAweEJCLCAweDdDLCAweEJCLCAweDdELCAweEJCLCAweDdFLCAvKiAweDg0LTB4ODcgKi8KKwkweEJCLCAweDgwLCAweEI3LCAweERCLCAweEJCLCAweDgxLCAweEJCLCAweDgyLCAvKiAweDg4LTB4OEIgKi8KKwkweEJCLCAweDgzLCAweEJCLCAweDg0LCAweEJCLCAweDg1LCAweEJCLCAweDg2LCAvKiAweDhDLTB4OEYgKi8KKwkweEJCLCAweDg3LCAweEY0LCAweENFLCAweEMxLCAweEEzLCAweEJCLCAweDg4LCAvKiAweDkwLTB4OTMgKi8KKwkweEJCLCAweDg5LCAweEM2LCAweEM5LCAweEJCLCAweDhBLCAweEI0LCAweEQ2LCAvKiAweDk0LTB4OTcgKi8KKwkweEQ1LCAweEIzLCAweEJCLCAweDhCLCAweEJCLCAweDhDLCAweEJCLCAweDhELCAvKiAweDk4LTB4OUIgKi8KKwkweEY0LCAweEQwLCAweEY0LCAweENGLCAweEY0LCAweEQxLCAweENCLCAweERBLCAvKiAweDlDLTB4OUYgKi8KKwkweEJCLCAweDhFLCAweEJCLCAweDhGLCAweEY0LCAweEQyLCAweEJCLCAweDkwLCAvKiAweEEwLTB4QTMgKi8KKwkweEQ0LCAweEMxLCAweEQ2LCAweEUwLCAweEJCLCAweDkxLCAweEJCLCAweDkyLCAvKiAweEE0LTB4QTcgKi8KKwkweEJCLCAweDkzLCAweEJCLCAweDk0LCAweEI3LCAweEUwLCAweEJCLCAweDk1LCAvKiAweEE4LTB4QUIgKi8KKwkweEJCLCAweDk2LCAweEJCLCAweDk3LCAweEMxLCAweEI4LCAweEJCLCAweDk4LCAvKiAweEFDLTB4QUYgKi8KKwkweEJCLCAweDk5LCAweEMxLCAweEJCLCAweEY0LCAweEQzLCAweEJFLCAweEFDLCAvKiAweEIwLTB4QjMgKi8KKwkweEJCLCAweDlBLCAweEJCLCAweDlCLCAweEJCLCAweDlDLCAweEJCLCAweDlELCAvKiAweEI0LTB4QjcgKi8KKwkweEJCLCAweDlFLCAweEI0LCAweEUyLCAweEJCLCAweDlGLCAweEJCLCAweEEwLCAvKiAweEI4LTB4QkIgKi8KKwkweEY0LCAweEQ0LCAweEY0LCAweEQ1LCAweEJFLCAweEFCLCAweEJDLCAweDQwLCAvKiAweEJDLTB4QkYgKi8KKwkweEJDLCAweDQxLCAweEY0LCAweEQ2LCAweEJDLCAweDQyLCAweEJDLCAweDQzLCAvKiAweEMwLTB4QzMgKi8KKwkweEJDLCAweDQ0LCAweEY0LCAweERCLCAweEJDLCAweDQ1LCAweEY0LCAweEQ3LCAvKiAweEM0LTB4QzcgKi8KKwkweEY0LCAweERBLCAweEJDLCAweDQ2LCAweEJBLCAweEZELCAweEJDLCAweDQ3LCAvKiAweEM4LTB4Q0IgKi8KKwkweEY0LCAweEQ4LCAweEY0LCAweEQ5LCAweEJDLCAweDQ4LCAweEJDLCAweDQ5LCAvKiAweENDLTB4Q0YgKi8KKwkweEJDLCAweDRBLCAweEJDLCAweDRCLCAweEJDLCAweDRDLCAweEJDLCAweDRELCAvKiAweEQwLTB4RDMgKi8KKwkweEJDLCAweDRFLCAweEI4LCAweEUyLCAweENDLCAweEM3LCAweEY0LCAweERDLCAvKiAweEQ0LTB4RDcgKi8KKwkweEJDLCAweDRGLCAweEIyLCAweERBLCAweEJDLCAweDUwLCAweEJDLCAweDUxLCAvKiAweEQ4LTB4REIgKi8KKwkweEMzLCAweEQzLCAweEJDLCAweDUyLCAweEJDLCAweDUzLCAweEQ0LCAweEUzLCAvKiAweERDLTB4REYgKi8KKwkweEJGLCAweEI3LCAweEJDLCAweDU0LCAweEJDLCAweDU1LCAweEJDLCAweDU2LCAvKiAweEUwLTB4RTMgKi8KKwkweEJDLCAweDU3LCAweEJDLCAweDU4LCAweEJDLCAweDU5LCAweEJDLCAweDVBLCAvKiAweEU0LTB4RTcgKi8KKwkweEY0LCAweERELCAweEJDLCAweDVCLCAweEJDLCAweDVDLCAweEJDLCAweDVELCAvKiAweEU4LTB4RUIgKi8KKwkweEJDLCAweDVFLCAweEJDLCAweDVGLCAweEJDLCAweDYwLCAweEM1LCAweEI0LCAvKiAweEVDLTB4RUYgKi8KKwkweEJDLCAweDYxLCAweEJDLCAweDYyLCAweEJDLCAweDYzLCAweEJDLCAweDY0LCAvKiAweEYwLTB4RjMgKi8KKwkweEJDLCAweDY1LCAweEJDLCAweDY2LCAweEJDLCAweDY3LCAweEJDLCAweDY4LCAvKiAweEY0LTB4RjcgKi8KKwkweEY0LCAweEU5LCAweEJDLCAweDY5LCAweEJDLCAweDZBLCAweENGLCAweEI1LCAvKiAweEY4LTB4RkIgKi8KKwkweEJDLCAweDZCLCAweEJDLCAweDZDLCAweEJDLCAweDZELCAweEJDLCAweDZFLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183RFs1MTJdID0geworCTB4QkMsIDB4NkYsIDB4QkMsIDB4NzAsIDB4QkMsIDB4NzEsIDB4QkMsIDB4NzIsIC8qIDB4MDAtMHgwMyAqLworCTB4QkMsIDB4NzMsIDB4QkMsIDB4NzQsIDB4QkMsIDB4NzUsIDB4QkMsIDB4NzYsIC8qIDB4MDQtMHgwNyAqLworCTB4QkMsIDB4NzcsIDB4QkMsIDB4NzgsIDB4Q0UsIDB4QzksIDB4QkMsIDB4NzksIC8qIDB4MDgtMHgwQiAqLworCTB4QkMsIDB4N0EsIDB4QkMsIDB4N0IsIDB4QkMsIDB4N0MsIDB4QkMsIDB4N0QsIC8qIDB4MEMtMHgwRiAqLworCTB4QkMsIDB4N0UsIDB4QkMsIDB4ODAsIDB4QkMsIDB4ODEsIDB4QkMsIDB4ODIsIC8qIDB4MTAtMHgxMyAqLworCTB4QkMsIDB4ODMsIDB4QkMsIDB4ODQsIDB4QkMsIDB4ODUsIDB4QkMsIDB4ODYsIC8qIDB4MTQtMHgxNyAqLworCTB4QkMsIDB4ODcsIDB4QkMsIDB4ODgsIDB4QkMsIDB4ODksIDB4QkMsIDB4OEEsIC8qIDB4MTgtMHgxQiAqLworCTB4QkMsIDB4OEIsIDB4QkMsIDB4OEMsIDB4QkMsIDB4OEQsIDB4QkMsIDB4OEUsIC8qIDB4MUMtMHgxRiAqLworCTB4Q0IsIDB4RDgsIDB4QkMsIDB4OEYsIDB4Q0IsIDB4RjcsIDB4QkMsIDB4OTAsIC8qIDB4MjAtMHgyMyAqLworCTB4QkMsIDB4OTEsIDB4QkMsIDB4OTIsIDB4QkMsIDB4OTMsIDB4QkQsIDB4RjQsIC8qIDB4MjQtMHgyNyAqLworCTB4QkMsIDB4OTQsIDB4QkMsIDB4OTUsIDB4QkMsIDB4OTYsIDB4RDcsIDB4Q0YsIC8qIDB4MjgtMHgyQiAqLworCTB4QkMsIDB4OTcsIDB4QkMsIDB4OTgsIDB4QkMsIDB4OTksIDB4QzAsIDB4REIsIC8qIDB4MkMtMHgyRiAqLworCTB4QkMsIDB4OUEsIDB4QkMsIDB4OUIsIDB4QkMsIDB4OUMsIDB4QkMsIDB4OUQsIC8qIDB4MzAtMHgzMyAqLworCTB4QkMsIDB4OUUsIDB4QkMsIDB4OUYsIDB4QkMsIDB4QTAsIDB4QkQsIDB4NDAsIC8qIDB4MzQtMHgzNyAqLworCTB4QkQsIDB4NDEsIDB4QkQsIDB4NDIsIDB4QkQsIDB4NDMsIDB4QkQsIDB4NDQsIC8qIDB4MzgtMHgzQiAqLworCTB4QkQsIDB4NDUsIDB4QkQsIDB4NDYsIDB4QkQsIDB4NDcsIDB4QkQsIDB4NDgsIC8qIDB4M0MtMHgzRiAqLworCTB4QkQsIDB4NDksIDB4QkQsIDB4NEEsIDB4QkQsIDB4NEIsIDB4QkQsIDB4NEMsIC8qIDB4NDAtMHg0MyAqLworCTB4QkQsIDB4NEQsIDB4QkQsIDB4NEUsIDB4QkQsIDB4NEYsIDB4QkQsIDB4NTAsIC8qIDB4NDQtMHg0NyAqLworCTB4QkQsIDB4NTEsIDB4QkQsIDB4NTIsIDB4QkQsIDB4NTMsIDB4QkQsIDB4NTQsIC8qIDB4NDgtMHg0QiAqLworCTB4QkQsIDB4NTUsIDB4QkQsIDB4NTYsIDB4QkQsIDB4NTcsIDB4QkQsIDB4NTgsIC8qIDB4NEMtMHg0RiAqLworCTB4QkQsIDB4NTksIDB4QkQsIDB4NUEsIDB4QkQsIDB4NUIsIDB4QkQsIDB4NUMsIC8qIDB4NTAtMHg1MyAqLworCTB4QkQsIDB4NUQsIDB4QkQsIDB4NUUsIDB4QkQsIDB4NUYsIDB4QkQsIDB4NjAsIC8qIDB4NTQtMHg1NyAqLworCTB4QkQsIDB4NjEsIDB4QkQsIDB4NjIsIDB4QkQsIDB4NjMsIDB4QkQsIDB4NjQsIC8qIDB4NTgtMHg1QiAqLworCTB4QkQsIDB4NjUsIDB4QkQsIDB4NjYsIDB4QkQsIDB4NjcsIDB4QkQsIDB4NjgsIC8qIDB4NUMtMHg1RiAqLworCTB4QkQsIDB4NjksIDB4QkQsIDB4NkEsIDB4QkQsIDB4NkIsIDB4QkQsIDB4NkMsIC8qIDB4NjAtMHg2MyAqLworCTB4QkQsIDB4NkQsIDB4QkQsIDB4NkUsIDB4QkQsIDB4NkYsIDB4QkQsIDB4NzAsIC8qIDB4NjQtMHg2NyAqLworCTB4QkQsIDB4NzEsIDB4QkQsIDB4NzIsIDB4QkQsIDB4NzMsIDB4QkQsIDB4NzQsIC8qIDB4NjgtMHg2QiAqLworCTB4QkQsIDB4NzUsIDB4QkQsIDB4NzYsIDB4RDAsIDB4RjUsIDB4QkQsIDB4NzcsIC8qIDB4NkMtMHg2RiAqLworCTB4QkQsIDB4NzgsIDB4QkQsIDB4NzksIDB4QkQsIDB4N0EsIDB4QkQsIDB4N0IsIC8qIDB4NzAtMHg3MyAqLworCTB4QkQsIDB4N0MsIDB4QkQsIDB4N0QsIDB4QkQsIDB4N0UsIDB4RjQsIDB4RUEsIC8qIDB4NzQtMHg3NyAqLworCTB4QkQsIDB4ODAsIDB4QkQsIDB4ODEsIDB4QkQsIDB4ODIsIDB4QkQsIDB4ODMsIC8qIDB4NzgtMHg3QiAqLworCTB4QkQsIDB4ODQsIDB4QkQsIDB4ODUsIDB4QkQsIDB4ODYsIDB4QkQsIDB4ODcsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QkQsIDB4ODgsIDB4QkQsIDB4ODksIDB4QkQsIDB4OEEsIDB4QkQsIDB4OEIsIC8qIDB4ODAtMHg4MyAqLworCTB4QkQsIDB4OEMsIDB4QkQsIDB4OEQsIDB4QkQsIDB4OEUsIDB4QkQsIDB4OEYsIC8qIDB4ODQtMHg4NyAqLworCTB4QkQsIDB4OTAsIDB4QkQsIDB4OTEsIDB4QkQsIDB4OTIsIDB4QkQsIDB4OTMsIC8qIDB4ODgtMHg4QiAqLworCTB4QkQsIDB4OTQsIDB4QkQsIDB4OTUsIDB4QkQsIDB4OTYsIDB4QkQsIDB4OTcsIC8qIDB4OEMtMHg4RiAqLworCTB4QkQsIDB4OTgsIDB4QkQsIDB4OTksIDB4QkQsIDB4OUEsIDB4QkQsIDB4OUIsIC8qIDB4OTAtMHg5MyAqLworCTB4QkQsIDB4OUMsIDB4QkQsIDB4OUQsIDB4QkQsIDB4OUUsIDB4QkQsIDB4OUYsIC8qIDB4OTQtMHg5NyAqLworCTB4QkQsIDB4QTAsIDB4QkUsIDB4NDAsIDB4QkUsIDB4NDEsIDB4QkUsIDB4NDIsIC8qIDB4OTgtMHg5QiAqLworCTB4QkUsIDB4NDMsIDB4QkUsIDB4NDQsIDB4QkUsIDB4NDUsIDB4QkUsIDB4NDYsIC8qIDB4OUMtMHg5RiAqLworCTB4QkUsIDB4NDcsIDB4QkUsIDB4NDgsIDB4QkUsIDB4NDksIDB4QkUsIDB4NEEsIC8qIDB4QTAtMHhBMyAqLworCTB4QkUsIDB4NEIsIDB4QkUsIDB4NEMsIDB4RjQsIDB4RUIsIDB4QkUsIDB4NEQsIC8qIDB4QTQtMHhBNyAqLworCTB4QkUsIDB4NEUsIDB4QkUsIDB4NEYsIDB4QkUsIDB4NTAsIDB4QkUsIDB4NTEsIC8qIDB4QTgtMHhBQiAqLworCTB4QkUsIDB4NTIsIDB4QkUsIDB4NTMsIDB4RjQsIDB4RUMsIDB4QkUsIDB4NTQsIC8qIDB4QUMtMHhBRiAqLworCTB4QkUsIDB4NTUsIDB4QkUsIDB4NTYsIDB4QkUsIDB4NTcsIDB4QkUsIDB4NTgsIC8qIDB4QjAtMHhCMyAqLworCTB4QkUsIDB4NTksIDB4QkUsIDB4NUEsIDB4QkUsIDB4NUIsIDB4QkUsIDB4NUMsIC8qIDB4QjQtMHhCNyAqLworCTB4QkUsIDB4NUQsIDB4QkUsIDB4NUUsIDB4QkUsIDB4NUYsIDB4QkUsIDB4NjAsIC8qIDB4QjgtMHhCQiAqLworCTB4QkUsIDB4NjEsIDB4QkUsIDB4NjIsIDB4QkUsIDB4NjMsIDB4QkUsIDB4NjQsIC8qIDB4QkMtMHhCRiAqLworCTB4QkUsIDB4NjUsIDB4QkUsIDB4NjYsIDB4QkUsIDB4NjcsIDB4QkUsIDB4NjgsIC8qIDB4QzAtMHhDMyAqLworCTB4QkUsIDB4NjksIDB4QkUsIDB4NkEsIDB4QkUsIDB4NkIsIDB4QkUsIDB4NkMsIC8qIDB4QzQtMHhDNyAqLworCTB4QkUsIDB4NkQsIDB4QkUsIDB4NkUsIDB4QkUsIDB4NkYsIDB4QkUsIDB4NzAsIC8qIDB4QzgtMHhDQiAqLworCTB4QkUsIDB4NzEsIDB4QkUsIDB4NzIsIDB4QkUsIDB4NzMsIDB4QkUsIDB4NzQsIC8qIDB4Q0MtMHhDRiAqLworCTB4QkUsIDB4NzUsIDB4QkUsIDB4NzYsIDB4QkUsIDB4NzcsIDB4QkUsIDB4NzgsIC8qIDB4RDAtMHhEMyAqLworCTB4QkUsIDB4NzksIDB4QkUsIDB4N0EsIDB4QkUsIDB4N0IsIDB4QkUsIDB4N0MsIC8qIDB4RDQtMHhENyAqLworCTB4QkUsIDB4N0QsIDB4QkUsIDB4N0UsIDB4QkUsIDB4ODAsIDB4QkUsIDB4ODEsIC8qIDB4RDgtMHhEQiAqLworCTB4QkUsIDB4ODIsIDB4QkUsIDB4ODMsIDB4QkUsIDB4ODQsIDB4QkUsIDB4ODUsIC8qIDB4REMtMHhERiAqLworCTB4QkUsIDB4ODYsIDB4QkUsIDB4ODcsIDB4QkUsIDB4ODgsIDB4QkUsIDB4ODksIC8qIDB4RTAtMHhFMyAqLworCTB4QkUsIDB4OEEsIDB4QkUsIDB4OEIsIDB4QkUsIDB4OEMsIDB4QkUsIDB4OEQsIC8qIDB4RTQtMHhFNyAqLworCTB4QkUsIDB4OEUsIDB4QkUsIDB4OEYsIDB4QkUsIDB4OTAsIDB4QkUsIDB4OTEsIC8qIDB4RTgtMHhFQiAqLworCTB4QkUsIDB4OTIsIDB4QkUsIDB4OTMsIDB4QkUsIDB4OTQsIDB4QkUsIDB4OTUsIC8qIDB4RUMtMHhFRiAqLworCTB4QkUsIDB4OTYsIDB4QkUsIDB4OTcsIDB4QkUsIDB4OTgsIDB4QkUsIDB4OTksIC8qIDB4RjAtMHhGMyAqLworCTB4QkUsIDB4OUEsIDB4QkUsIDB4OUIsIDB4QkUsIDB4OUMsIDB4QkUsIDB4OUQsIC8qIDB4RjQtMHhGNyAqLworCTB4QkUsIDB4OUUsIDB4QkUsIDB4OUYsIDB4QkUsIDB4QTAsIDB4QkYsIDB4NDAsIC8qIDB4RjgtMHhGQiAqLworCTB4QkYsIDB4NDEsIDB4QkYsIDB4NDIsIDB4QkYsIDB4NDMsIDB4QkYsIDB4NDQsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzdFWzUxMl0gPSB7CisJMHhCRiwgMHg0NSwgMHhCRiwgMHg0NiwgMHhCRiwgMHg0NywgMHhCRiwgMHg0OCwgLyogMHgwMC0weDAzICovCisJMHhCRiwgMHg0OSwgMHhCRiwgMHg0QSwgMHhCRiwgMHg0QiwgMHhCRiwgMHg0QywgLyogMHgwNC0weDA3ICovCisJMHhCRiwgMHg0RCwgMHhCRiwgMHg0RSwgMHhCRiwgMHg0RiwgMHhCRiwgMHg1MCwgLyogMHgwOC0weDBCICovCisJMHhCRiwgMHg1MSwgMHhCRiwgMHg1MiwgMHhCRiwgMHg1MywgMHhCRiwgMHg1NCwgLyogMHgwQy0weDBGICovCisJMHhCRiwgMHg1NSwgMHhCRiwgMHg1NiwgMHhCRiwgMHg1NywgMHhCRiwgMHg1OCwgLyogMHgxMC0weDEzICovCisJMHhCRiwgMHg1OSwgMHhCRiwgMHg1QSwgMHhCRiwgMHg1QiwgMHhCRiwgMHg1QywgLyogMHgxNC0weDE3ICovCisJMHhCRiwgMHg1RCwgMHhCRiwgMHg1RSwgMHhCRiwgMHg1RiwgMHhCRiwgMHg2MCwgLyogMHgxOC0weDFCICovCisJMHhCRiwgMHg2MSwgMHhCRiwgMHg2MiwgMHhCRiwgMHg2MywgMHhCRiwgMHg2NCwgLyogMHgxQy0weDFGICovCisJMHhCRiwgMHg2NSwgMHhCRiwgMHg2NiwgMHhCRiwgMHg2NywgMHhCRiwgMHg2OCwgLyogMHgyMC0weDIzICovCisJMHhCRiwgMHg2OSwgMHhCRiwgMHg2QSwgMHhCRiwgMHg2QiwgMHhCRiwgMHg2QywgLyogMHgyNC0weDI3ICovCisJMHhCRiwgMHg2RCwgMHhCRiwgMHg2RSwgMHhCRiwgMHg2RiwgMHhCRiwgMHg3MCwgLyogMHgyOC0weDJCICovCisJMHhCRiwgMHg3MSwgMHhCRiwgMHg3MiwgMHhCRiwgMHg3MywgMHhCRiwgMHg3NCwgLyogMHgyQy0weDJGICovCisJMHhCRiwgMHg3NSwgMHhCRiwgMHg3NiwgMHhCRiwgMHg3NywgMHhCRiwgMHg3OCwgLyogMHgzMC0weDMzICovCisJMHhCRiwgMHg3OSwgMHhCRiwgMHg3QSwgMHhCRiwgMHg3QiwgMHhCRiwgMHg3QywgLyogMHgzNC0weDM3ICovCisJMHhCRiwgMHg3RCwgMHhCRiwgMHg3RSwgMHhCRiwgMHg4MCwgMHhGNywgMHhFMywgLyogMHgzOC0weDNCICovCisJMHhCRiwgMHg4MSwgMHhCRiwgMHg4MiwgMHhCRiwgMHg4MywgMHhCRiwgMHg4NCwgLyogMHgzQy0weDNGICovCisJMHhCRiwgMHg4NSwgMHhCNywgMHhCMSwgMHhCRiwgMHg4NiwgMHhCRiwgMHg4NywgLyogMHg0MC0weDQzICovCisJMHhCRiwgMHg4OCwgMHhCRiwgMHg4OSwgMHhCRiwgMHg4QSwgMHhGNCwgMHhFRCwgLyogMHg0NC0weDQ3ICovCisJMHhCRiwgMHg4QiwgMHhCRiwgMHg4QywgMHhCRiwgMHg4RCwgMHhCRiwgMHg4RSwgLyogMHg0OC0weDRCICovCisJMHhCRiwgMHg4RiwgMHhCRiwgMHg5MCwgMHhCRiwgMHg5MSwgMHhCRiwgMHg5MiwgLyogMHg0Qy0weDRGICovCisJMHhCRiwgMHg5MywgMHhCRiwgMHg5NCwgMHhCRiwgMHg5NSwgMHhCRiwgMHg5NiwgLyogMHg1MC0weDUzICovCisJMHhCRiwgMHg5NywgMHhCRiwgMHg5OCwgMHhCRiwgMHg5OSwgMHhCRiwgMHg5QSwgLyogMHg1NC0weDU3ICovCisJMHhCRiwgMHg5QiwgMHhCRiwgMHg5QywgMHhCRiwgMHg5RCwgMHhCRiwgMHg5RSwgLyogMHg1OC0weDVCICovCisJMHhCRiwgMHg5RiwgMHhCRiwgMHhBMCwgMHhDMCwgMHg0MCwgMHhDMCwgMHg0MSwgLyogMHg1Qy0weDVGICovCisJMHhDMCwgMHg0MiwgMHhDMCwgMHg0MywgMHhDMCwgMHg0NCwgMHhDMCwgMHg0NSwgLyogMHg2MC0weDYzICovCisJMHhDMCwgMHg0NiwgMHhDMCwgMHg0NywgMHhDMCwgMHg0OCwgMHhDMCwgMHg0OSwgLyogMHg2NC0weDY3ICovCisJMHhDMCwgMHg0QSwgMHhDMCwgMHg0QiwgMHhDMCwgMHg0QywgMHhDMCwgMHg0RCwgLyogMHg2OC0weDZCICovCisJMHhDMCwgMHg0RSwgMHhDMCwgMHg0RiwgMHhDMCwgMHg1MCwgMHhDMCwgMHg1MSwgLyogMHg2Qy0weDZGICovCisJMHhDMCwgMHg1MiwgMHhDMCwgMHg1MywgMHhDMCwgMHg1NCwgMHhDMCwgMHg1NSwgLyogMHg3MC0weDczICovCisJMHhDMCwgMHg1NiwgMHhDMCwgMHg1NywgMHhDMCwgMHg1OCwgMHhDMCwgMHg1OSwgLyogMHg3NC0weDc3ICovCisJMHhDMCwgMHg1QSwgMHhDMCwgMHg1QiwgMHhDMCwgMHg1QywgMHhDMCwgMHg1RCwgLyogMHg3OC0weDdCICovCisJMHhDMCwgMHg1RSwgMHhDMCwgMHg1RiwgMHhDMCwgMHg2MCwgMHhDMCwgMHg2MSwgLyogMHg3Qy0weDdGICovCisJCisJMHhDMCwgMHg2MiwgMHhDMCwgMHg2MywgMHhENywgMHhFQiwgMHhDMCwgMHg2NCwgLyogMHg4MC0weDgzICovCisJMHhDMCwgMHg2NSwgMHhDMCwgMHg2NiwgMHhDMCwgMHg2NywgMHhDMCwgMHg2OCwgLyogMHg4NC0weDg3ICovCisJMHhDMCwgMHg2OSwgMHhDMCwgMHg2QSwgMHhDMCwgMHg2QiwgMHhDMCwgMHg2QywgLyogMHg4OC0weDhCICovCisJMHhDMCwgMHg2RCwgMHhDMCwgMHg2RSwgMHhDMCwgMHg2RiwgMHhDMCwgMHg3MCwgLyogMHg4Qy0weDhGICovCisJMHhDMCwgMHg3MSwgMHhDMCwgMHg3MiwgMHhDMCwgMHg3MywgMHhDMCwgMHg3NCwgLyogMHg5MC0weDkzICovCisJMHhDMCwgMHg3NSwgMHhDMCwgMHg3NiwgMHhDMCwgMHg3NywgMHhDMCwgMHg3OCwgLyogMHg5NC0weDk3ICovCisJMHhDMCwgMHg3OSwgMHhDMCwgMHg3QSwgMHhDMCwgMHg3QiwgMHhGNCwgMHhFRSwgLyogMHg5OC0weDlCICovCisJMHhDMCwgMHg3QywgMHhDMCwgMHg3RCwgMHhDMCwgMHg3RSwgMHhFNiwgMHhGOSwgLyogMHg5Qy0weDlGICovCisJMHhCRSwgMHhDMCwgMHhFNiwgMHhGQSwgMHhCQSwgMHhFQywgMHhFNiwgMHhGQiwgLyogMHhBMC0weEEzICovCisJMHhDRiwgMHhDQiwgMHhFNiwgMHhGQywgMHhENCwgMHhCQywgMHhCQywgMHhCNiwgLyogMHhBNC0weEE3ICovCisJMHhFNiwgMHhGRCwgMHhFNiwgMHhGRSwgMHhCQywgMHhDRCwgMHhDOCwgMHhEMiwgLyogMHhBOC0weEFCICovCisJMHhDRSwgMHhCMywgMHhFNywgMHhBMSwgMHhDMCwgMHg4MCwgMHhCNCwgMHhCRiwgLyogMHhBQy0weEFGICovCisJMHhFNywgMHhBMiwgMHhDOSwgMHhCNCwgMHhCOCwgMHhEOSwgMHhDNCwgMHhDOSwgLyogMHhCMC0weEIzICovCisJMHhDMCwgMHg4MSwgMHhENywgMHhERCwgMHhDMiwgMHhEQSwgMHhCNywgMHhENywgLyogMHhCNC0weEI3ICovCisJMHhENiwgMHhCRCwgMHhDRSwgMHhDNiwgMHhCNywgMHhDNCwgMHhDMCwgMHg4MiwgLyogMHhCOC0weEJCICovCisJMHhDMCwgMHg4MywgMHhDNSwgMHhBNiwgMHhFNywgMHhBMywgMHhDRiwgMHhERiwgLyogMHhCQy0weEJGICovCisJMHhFNywgMHhBNCwgMHhFNywgMHhBNSwgMHhFNywgMHhBNiwgMHhDMSwgMHhCNywgLyogMHhDMC0weEMzICovCisJMHhENywgMHhFOSwgMHhDOSwgMHhGMCwgMHhDRiwgMHhCOCwgMHhENiwgMHhBRiwgLyogMHhDNC0weEM3ICovCisJMHhENiwgMHhENSwgMHhFNywgMHhBNywgMHhCMCwgMHhFRCwgMHhFNywgMHhBOCwgLyogMHhDOC0weENCICovCisJMHhFNywgMHhBOSwgMHhDOSwgMHhEQywgMHhEMiwgMHhFRiwgMHhCRSwgMHhBRCwgLyogMHhDQy0weENGICovCisJMHhFNywgMHhBQSwgMHhCMCwgMHhGMywgMHhDOCwgMHhERSwgMHhCRCwgMHhFMSwgLyogMHhEMC0weEQzICovCisJMHhFNywgMHhBQiwgMHhDOCwgMHhDNiwgMHhDMCwgMHg4NCwgMHhFNywgMHhBQywgLyogMHhENC0weEQ3ICovCisJMHhCQiwgMHhFNiwgMHhCOCwgMHhGOCwgMHhEMSwgMHhBNCwgMHhFNywgMHhBRCwgLyogMHhEOC0weERCICovCisJMHhDMiwgMHhFNywgMHhCRSwgMHhGOCwgMHhCRCwgMHhDQSwgMHhDRCwgMHhCMywgLyogMHhEQy0weERGICovCisJMHhFNywgMHhBRSwgMHhFNywgMHhBRiwgMHhCRSwgMHhFRSwgMHhEMCwgMHhFNSwgLyogMHhFMC0weEUzICovCisJMHhDMCwgMHg4NSwgMHhDQiwgMHhFNywgMHhDQywgMHhEMCwgMHhCQywgMHhDQywgLyogMHhFNC0weEU3ICovCisJMHhFNywgMHhCMCwgMHhCQywgMHhBOCwgMHhEMCwgMHhGNywgMHhFNywgMHhCMSwgLyogMHhFOC0weEVCICovCisJMHhDMCwgMHg4NiwgMHhEMCwgMHhGOCwgMHhFNywgMHhCMiwgMHhFNywgMHhCMywgLyogMHhFQy0weEVGICovCisJMHhCNCwgMHhDMiwgMHhFNywgMHhCNCwgMHhFNywgMHhCNSwgMHhDOSwgMHhGRSwgLyogMHhGMC0weEYzICovCisJMHhDRSwgMHhBQywgMHhDMywgMHhFMCwgMHhFNywgMHhCNywgMHhCMSwgMHhDMSwgLyogMHhGNC0weEY3ICovCisJMHhCMywgMHhGMSwgMHhDMCwgMHg4NywgMHhFNywgMHhCOCwgMHhFNywgMHhCOSwgLyogMHhGOC0weEZCICovCisJMHhENywgMHhEQiwgMHhENSwgMHhDMCwgMHhFNywgMHhCQSwgMHhDMiwgMHhDQywgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfN0ZbNTEyXSA9IHsKKwkweEQ3LCAweEJBLCAweEU3LCAweEJCLCAweEU3LCAweEJDLCAweEU3LCAweEJELCAvKiAweDAwLTB4MDMgKi8KKwkweEJDLCAweEVBLCAweEMzLCAweEU1LCAweEMwLCAweEMyLCAweEU3LCAweEJFLCAvKiAweDA0LTB4MDcgKi8KKwkweEU3LCAweEJGLCAweEJDLCAweEE5LCAweEMwLCAweDg4LCAweEU3LCAweEMwLCAvKiAweDA4LTB4MEIgKi8KKwkweEU3LCAweEMxLCAweEU3LCAweEI2LCAweEI2LCAweEQwLCAweEU3LCAweEMyLCAvKiAweDBDLTB4MEYgKi8KKwkweEMwLCAweDg5LCAweEU3LCAweEMzLCAweEU3LCAweEM0LCAweEJCLCAweEJBLCAvKiAweDEwLTB4MTMgKi8KKwkweEI1LCAweERFLCAweEMyLCAweEM2LCAweEIxLCAweEUwLCAweEU3LCAweEM1LCAvKiAweDE0LTB4MTcgKi8KKwkweEQ0LCAweEI1LCAweEU3LCAweEM2LCAweEI4LCAweEJGLCAweEU3LCAweEM4LCAvKiAweDE4LTB4MUIgKi8KKwkweEU3LCAweEM3LCAweEI3LCAweEVDLCAweEMwLCAweDhBLCAweEU3LCAweEM5LCAvKiAweDFDLTB4MUYgKi8KKwkweEIyLCAweEY4LCAweEU3LCAweENBLCAweEU3LCAweENCLCAweEU3LCAweENDLCAvKiAweDIwLTB4MjMgKi8KKwkweEU3LCAweENELCAweEU3LCAweENFLCAweEU3LCAweENGLCAweEU3LCAweEQwLCAvKiAweDI0LTB4MjcgKi8KKwkweEQzLCAweEE3LCAweENCLCAweEY1LCAweEU3LCAweEQxLCAweEU3LCAweEQyLCAvKiAweDI4LTB4MkIgKi8KKwkweEU3LCAweEQzLCAweEU3LCAweEQ0LCAweEM5LCAweEM5LCAweEU3LCAweEQ1LCAvKiAweDJDLTB4MkYgKi8KKwkweEU3LCAweEQ2LCAweEU3LCAweEQ3LCAweEU3LCAweEQ4LCAweEU3LCAweEQ5LCAvKiAweDMwLTB4MzMgKi8KKwkweEJELCAweEM5LCAweEU3LCAweERBLCAweEYzLCAweEJFLCAweEMwLCAweDhCLCAvKiAweDM0LTB4MzcgKi8KKwkweEI4LCAweEQ3LCAweEMwLCAweDhDLCAweEM4LCAweEIxLCAweEMwLCAweDhELCAvKiAweDM4LTB4M0IgKi8KKwkweEMwLCAweDhFLCAweEMwLCAweDhGLCAweEMwLCAweDkwLCAweEMwLCAweDkxLCAvKiAweDNDLTB4M0YgKi8KKwkweEMwLCAweDkyLCAweEMwLCAweDkzLCAweEYzLCAweEJGLCAweEMwLCAweDk0LCAvKiAweDQwLTB4NDMgKi8KKwkweEYzLCAweEMwLCAweEYzLCAweEMxLCAweEMwLCAweDk1LCAweEMwLCAweDk2LCAvKiAweDQ0LTB4NDcgKi8KKwkweEMwLCAweDk3LCAweEMwLCAweDk4LCAweEMwLCAweDk5LCAweEMwLCAweDlBLCAvKiAweDQ4LTB4NEIgKi8KKwkweEMwLCAweDlCLCAweEMwLCAweDlDLCAweEMwLCAweDlELCAweEMwLCAweDlFLCAvKiAweDRDLTB4NEYgKi8KKwkweEI5LCAweERFLCAweENELCAweEY4LCAweEMwLCAweDlGLCAweEMwLCAweEEwLCAvKiAweDUwLTB4NTMgKi8KKwkweEQ4LCAweEU4LCAweEJBLCAweEIxLCAweEMxLCAweDQwLCAweEMyLCAweERFLCAvKiAweDU0LTB4NTcgKi8KKwkweEVFLCAweEI3LCAweEMxLCAweDQxLCAweEI3LCAweEEzLCAweEMxLCAweDQyLCAvKiAweDU4LTB4NUIgKi8KKwkweEMxLCAweDQzLCAweEMxLCAweDQ0LCAweEMxLCAweDQ1LCAweEVFLCAweEI5LCAvKiAweDVDLTB4NUYgKi8KKwkweEMxLCAweDQ2LCAweEVFLCAweEI4LCAweEIwLCAweEQ1LCAweEMxLCAweDQ3LCAvKiAweDYwLTB4NjMgKi8KKwkweEMxLCAweDQ4LCAweEMxLCAweDQ5LCAweEMxLCAweDRBLCAweEMxLCAweDRCLCAvKiAweDY0LTB4NjcgKi8KKwkweEVFLCAweEJCLCAweEQ1LCAweEQ2LCAweEQ3LCAweEVGLCAweEMxLCAweDRDLCAvKiAweDY4LTB4NkIgKi8KKwkweEMxLCAweDRELCAweEMxLCAweDRFLCAweEQ2LCAweEMzLCAweEMxLCAweDRGLCAvKiAweDZDLTB4NkYgKi8KKwkweEMxLCAweDUwLCAweEVFLCAweEJELCAweENBLCAweEYwLCAweEMxLCAweDUxLCAvKiAweDcwLTB4NzMgKi8KKwkweEVFLCAweEJDLCAweEMxLCAweDUyLCAweEMxLCAweDUzLCAweEMxLCAweDU0LCAvKiAweDc0LTB4NzcgKi8KKwkweEMxLCAweDU1LCAweEVFLCAweEJFLCAweEMxLCAweDU2LCAweEMxLCAweDU3LCAvKiAweDc4LTB4N0IgKi8KKwkweEMxLCAweDU4LCAweEMxLCAweDU5LCAweEVFLCAweEMwLCAweEMxLCAweDVBLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEMxLCAweDVCLCAweEVFLCAweEJGLCAweEMxLCAweDVDLCAweEMxLCAweDVELCAvKiAweDgwLTB4ODMgKi8KKwkweEMxLCAweDVFLCAweEMxLCAweDVGLCAweEMxLCAweDYwLCAweEMxLCAweDYxLCAvKiAweDg0LTB4ODcgKi8KKwkweEMxLCAweDYyLCAweEMxLCAweDYzLCAweEQxLCAweEYyLCAweEMxLCAweDY0LCAvKiAweDg4LTB4OEIgKi8KKwkweEM3LCAweEJDLCAweEMxLCAweDY1LCAweEMzLCAweEMwLCAweEMxLCAweDY2LCAvKiAweDhDLTB4OEYgKi8KKwkweEMxLCAweDY3LCAweEMxLCAweDY4LCAweEMxLCAweDY5LCAweEMxLCAweDZBLCAvKiAweDkwLTB4OTMgKi8KKwkweEI4LCAweEUxLCAweEMxLCAweDZCLCAweEMxLCAweDZDLCAweEMxLCAweDZELCAvKiAweDk0LTB4OTcgKi8KKwkweEMxLCAweDZFLCAweEMxLCAweDZGLCAweEMxLCAweEU3LCAweEMxLCAweDcwLCAvKiAweDk4LTB4OUIgKi8KKwkweEMxLCAweDcxLCAweEY0LCAweEM2LCAweEQwLCAweERGLCAweEY0LCAweEM3LCAvKiAweDlDLTB4OUYgKi8KKwkweEMxLCAweDcyLCAweENGLCAweERCLCAweEMxLCAweDczLCAweEMxLCAweDc0LCAvKiAweEEwLTB4QTMgKi8KKwkweEM4LCAweEJBLCAweEMxLCAweDc1LCAweEMxLCAweDc2LCAweEY0LCAweEM4LCAvKiAweEE0LTB4QTcgKi8KKwkweEMxLCAweDc3LCAweEMxLCAweDc4LCAweEMxLCAweDc5LCAweEMxLCAweDdBLCAvKiAweEE4LTB4QUIgKi8KKwkweEMxLCAweDdCLCAweEMxLCAweDdDLCAweEMxLCAweDdELCAweEY0LCAweEM5LCAvKiAweEFDLTB4QUYgKi8KKwkweEY0LCAweENBLCAweEMxLCAweDdFLCAweEY0LCAweENCLCAweEMxLCAweDgwLCAvKiAweEIwLTB4QjMgKi8KKwkweEMxLCAweDgxLCAweEMxLCAweDgyLCAweEMxLCAweDgzLCAweEMxLCAweDg0LCAvKiAweEI0LTB4QjcgKi8KKwkweEQ5LCAweEZBLCAweEI4LCAweEZFLCAweEMxLCAweDg1LCAweEMxLCAweDg2LCAvKiAweEI4LTB4QkIgKi8KKwkweEU1LCAweEYxLCAweEQzLCAweEYwLCAweEMxLCAweDg3LCAweEY0LCAweEUwLCAvKiAweEJDLTB4QkYgKi8KKwkweEMxLCAweDg4LCAweENFLCAweENDLCAweEMxLCAweDg5LCAweEMxLCAweDhBLCAvKiAweEMwLTB4QzMgKi8KKwkweEMxLCAweDhCLCAweEIzLCAweEUxLCAweEMxLCAweDhDLCAweEMxLCAweDhELCAvKiAweEM0LTB4QzcgKi8KKwkweEMxLCAweDhFLCAweEMxLCAweDhGLCAweEYxLCAweEI0LCAweEMxLCAweDkwLCAvKiAweEM4LTB4Q0IgKi8KKwkweEQyLCAweEVFLCAweEMxLCAweDkxLCAweEY0LCAweEUxLCAweEMxLCAweDkyLCAvKiAweENDLTB4Q0YgKi8KKwkweEMxLCAweDkzLCAweEMxLCAweDk0LCAweEMxLCAweDk1LCAweEMxLCAweDk2LCAvKiAweEQwLTB4RDMgKi8KKwkweENGLCAweEU4LCAweEY0LCAweEUyLCAweEMxLCAweDk3LCAweEMxLCAweDk4LCAvKiAweEQ0LTB4RDcgKi8KKwkweEM3LCAweENDLCAweEMxLCAweDk5LCAweEMxLCAweDlBLCAweEMxLCAweDlCLCAvKiAweEQ4LTB4REIgKi8KKwkweEMxLCAweDlDLCAweEMxLCAweDlELCAweEMxLCAweDlFLCAweEI1LCAweEQ0LCAvKiAweERDLTB4REYgKi8KKwkweEI0LCAweEU0LCAweEY0LCAweEU0LCAweEMxLCAweDlGLCAweEMxLCAweEEwLCAvKiAweEUwLTB4RTMgKi8KKwkweEMyLCAweDQwLCAweEY0LCAweEUzLCAweEY0LCAweEU1LCAweEMyLCAweDQxLCAvKiAweEU0LTB4RTcgKi8KKwkweEMyLCAweDQyLCAweEY0LCAweEU2LCAweEMyLCAweDQzLCAweEMyLCAweDQ0LCAvKiAweEU4LTB4RUIgKi8KKwkweEMyLCAweDQ1LCAweEMyLCAweDQ2LCAweEY0LCAweEU3LCAweEMyLCAweDQ3LCAvKiAweEVDLTB4RUYgKi8KKwkweEJBLCAweEIyLCAweEIwLCAweEJGLCAweEMyLCAweDQ4LCAweEY0LCAweEU4LCAvKiAweEYwLTB4RjMgKi8KKwkweEMyLCAweDQ5LCAweEMyLCAweDRBLCAweEMyLCAweDRCLCAweEMyLCAweDRDLCAvKiAweEY0LTB4RjcgKi8KKwkweEMyLCAweDRELCAweEMyLCAweDRFLCAweEMyLCAweDRGLCAweEI3LCAweEFELCAvKiAweEY4LTB4RkIgKi8KKwkweEQyLCAweEVELCAweEMyLCAweDUwLCAweEMyLCAweDUxLCAweEMyLCAweDUyLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184MFs1MTJdID0geworCTB4RDIsIDB4QUIsIDB4QzAsIDB4Q0YsIDB4QzIsIDB4NTMsIDB4QkYsIDB4QkMsIC8qIDB4MDAtMHgwMyAqLworCTB4RUIsIDB4QTMsIDB4RDUsIDB4REYsIDB4RUEsIDB4QzgsIDB4QzIsIDB4NTQsIC8qIDB4MDQtMHgwNyAqLworCTB4QzIsIDB4NTUsIDB4QzIsIDB4NTYsIDB4QzIsIDB4NTcsIDB4RjEsIDB4RjMsIC8qIDB4MDgtMHgwQiAqLworCTB4QjYsIDB4RjgsIDB4Q0IsIDB4QTMsIDB4QzIsIDB4NTgsIDB4QzIsIDB4NTksIC8qIDB4MEMtMHgwRiAqLworCTB4QzQsIDB4Q0QsIDB4QzIsIDB4NUEsIDB4RjEsIDB4RTcsIDB4QzIsIDB4NUIsIC8qIDB4MTAtMHgxMyAqLworCTB4RjEsIDB4RTgsIDB4QjgsIDB4RkIsIDB4RjEsIDB4RTksIDB4QkEsIDB4QzQsIC8qIDB4MTQtMHgxNyAqLworCTB4RDQsIDB4QzUsIDB4QjAsIDB4RDIsIDB4QzIsIDB4NUMsIDB4QzIsIDB4NUQsIC8qIDB4MTgtMHgxQiAqLworCTB4RjEsIDB4RUEsIDB4QzIsIDB4NUUsIDB4QzIsIDB4NUYsIDB4QzIsIDB4NjAsIC8qIDB4MUMtMHgxRiAqLworCTB4RjEsIDB4RUIsIDB4QzIsIDB4NjEsIDB4RjEsIDB4RUMsIDB4QzIsIDB4NjIsIC8qIDB4MjAtMHgyMyAqLworCTB4QzIsIDB4NjMsIDB4RjEsIDB4RUQsIDB4RjEsIDB4RUUsIDB4RjEsIDB4RUYsIC8qIDB4MjQtMHgyNyAqLworCTB4RjEsIDB4RjEsIDB4RjEsIDB4RjAsIDB4QzUsIDB4RDUsIDB4QzIsIDB4NjQsIC8qIDB4MjgtMHgyQiAqLworCTB4QzIsIDB4NjUsIDB4QzIsIDB4NjYsIDB4QzIsIDB4NjcsIDB4QzIsIDB4NjgsIC8qIDB4MkMtMHgyRiAqLworCTB4QzIsIDB4NjksIDB4RjEsIDB4RjIsIDB4QzIsIDB4NkEsIDB4QjYsIDB4RkEsIC8qIDB4MzAtMHgzMyAqLworCTB4QzIsIDB4NkIsIDB4RjEsIDB4RjQsIDB4RDIsIDB4QUUsIDB4REUsIDB4QzcsIC8qIDB4MzQtMHgzNyAqLworCTB4Q0IsIDB4Q0EsIDB4QzIsIDB4NkMsIDB4QzIsIDB4NkQsIDB4QjMsIDB4REMsIC8qIDB4MzgtMHgzQiAqLworCTB4QzIsIDB4NkUsIDB4QjUsIDB4QTIsIDB4QzIsIDB4NkYsIDB4QjksIDB4QTIsIC8qIDB4M0MtMHgzRiAqLworCTB4QzIsIDB4NzAsIDB4QzIsIDB4NzEsIDB4QzQsIDB4RjQsIDB4RjEsIDB4RjUsIC8qIDB4NDAtMHg0MyAqLworCTB4QzIsIDB4NzIsIDB4QzIsIDB4NzMsIDB4RjEsIDB4RjYsIDB4QzIsIDB4NzQsIC8qIDB4NDQtMHg0NyAqLworCTB4QzIsIDB4NzUsIDB4QzIsIDB4NzYsIDB4QzEsIDB4QzQsIDB4QzEsIDB4RkIsIC8qIDB4NDgtMHg0QiAqLworCTB4RDYsIDB4QjAsIDB4RjEsIDB4RjcsIDB4QzIsIDB4NzcsIDB4QzIsIDB4NzgsIC8qIDB4NEMtMHg0RiAqLworCTB4QzIsIDB4NzksIDB4QzIsIDB4N0EsIDB4RjEsIDB4RjgsIDB4QzIsIDB4N0IsIC8qIDB4NTAtMHg1MyAqLworCTB4QzEsIDB4QUEsIDB4QzIsIDB4N0MsIDB4QzIsIDB4N0QsIDB4QzIsIDB4N0UsIC8qIDB4NTQtMHg1NyAqLworCTB4QzYsIDB4QjgsIDB4QzIsIDB4ODAsIDB4QkUsIDB4REIsIDB4QzIsIDB4ODEsIC8qIDB4NTgtMHg1QiAqLworCTB4QzIsIDB4ODIsIDB4QzIsIDB4ODMsIDB4QzIsIDB4ODQsIDB4QzIsIDB4ODUsIC8qIDB4NUMtMHg1RiAqLworCTB4QzIsIDB4ODYsIDB4QzIsIDB4ODcsIDB4QzIsIDB4ODgsIDB4QzIsIDB4ODksIC8qIDB4NjAtMHg2MyAqLworCTB4QzIsIDB4OEEsIDB4QzIsIDB4OEIsIDB4QzIsIDB4OEMsIDB4QzIsIDB4OEQsIC8qIDB4NjQtMHg2NyAqLworCTB4QzIsIDB4OEUsIDB4RjEsIDB4RjksIDB4QjQsIDB4Q0YsIDB4QzIsIDB4OEYsIC8qIDB4NjgtMHg2QiAqLworCTB4QzIsIDB4OTAsIDB4QzIsIDB4OTEsIDB4QzIsIDB4OTIsIDB4QzIsIDB4OTMsIC8qIDB4NkMtMHg2RiAqLworCTB4QzIsIDB4OTQsIDB4RjEsIDB4RkEsIDB4QzIsIDB4OTUsIDB4QzIsIDB4OTYsIC8qIDB4NzAtMHg3MyAqLworCTB4QzIsIDB4OTcsIDB4QzIsIDB4OTgsIDB4QzIsIDB4OTksIDB4QzIsIDB4OUEsIC8qIDB4NzQtMHg3NyAqLworCTB4QzIsIDB4OUIsIDB4QzIsIDB4OUMsIDB4QzIsIDB4OUQsIDB4QzIsIDB4OUUsIC8qIDB4NzgtMHg3QiAqLworCTB4QzIsIDB4OUYsIDB4QzIsIDB4QTAsIDB4QzMsIDB4NDAsIDB4RUQsIDB4QjIsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RUQsIDB4QjEsIDB4QzMsIDB4NDEsIDB4QzMsIDB4NDIsIDB4Q0IsIDB4RTAsIC8qIDB4ODAtMHg4MyAqLworCTB4RDIsIDB4REUsIDB4QzMsIDB4NDMsIDB4Q0IsIDB4QzEsIDB4RDUsIDB4RDgsIC8qIDB4ODQtMHg4NyAqLworCTB4QzMsIDB4NDQsIDB4QzgsIDB4RTIsIDB4QzMsIDB4NDUsIDB4QzAsIDB4REYsIC8qIDB4ODgtMHg4QiAqLworCTB4QkMsIDB4QTEsIDB4QzMsIDB4NDYsIDB4QzMsIDB4NDcsIDB4QzMsIDB4NDgsIC8qIDB4OEMtMHg4RiAqLworCTB4QzMsIDB4NDksIDB4QzMsIDB4NEEsIDB4QzMsIDB4NEIsIDB4RUIsIDB4QzEsIC8qIDB4OTAtMHg5MyAqLworCTB4QzMsIDB4NEMsIDB4QzMsIDB4NEQsIDB4RDAsIDB4QTQsIDB4QzMsIDB4NEUsIC8qIDB4OTQtMHg5NyAqLworCTB4RDYsIDB4RTIsIDB4QzMsIDB4NEYsIDB4QjYsIDB4QzcsIDB4QjgsIDB4RDgsIC8qIDB4OTgtMHg5QiAqLworCTB4RUIsIDB4QzAsIDB4QjgsIDB4Q0UsIDB4QzMsIDB4NTAsIDB4RUIsIDB4QkYsIC8qIDB4OUMtMHg5RiAqLworCTB4QjMsIDB4QTYsIDB4QjksIDB4QzksIDB4RDYsIDB4QUIsIDB4QzMsIDB4NTEsIC8qIDB4QTAtMHhBMyAqLworCTB4QjcsIDB4RjQsIDB4QjcsIDB4Q0EsIDB4QzMsIDB4NTIsIDB4QzMsIDB4NTMsIC8qIDB4QTQtMHhBNyAqLworCTB4QzMsIDB4NTQsIDB4QkMsIDB4RTcsIDB4QjcsIDB4QkUsIDB4RUIsIDB4QzYsIC8qIDB4QTgtMHhBQiAqLworCTB4QzMsIDB4NTUsIDB4RUIsIDB4QzcsIDB4QjAsIDB4QjksIDB4QkYsIDB4Q0YsIC8qIDB4QUMtMHhBRiAqLworCTB4QzMsIDB4NTYsIDB4RUIsIDB4QzUsIDB4RDMsIDB4RkQsIDB4QzMsIDB4NTcsIC8qIDB4QjAtMHhCMyAqLworCTB4RUIsIDB4QzgsIDB4QzMsIDB4NTgsIDB4QzMsIDB4NTksIDB4RUIsIDB4QzksIC8qIDB4QjQtMHhCNyAqLworCTB4QzMsIDB4NUEsIDB4QzMsIDB4NUIsIDB4QjcsIDB4Q0UsIDB4QzMsIDB4NUMsIC8qIDB4QjgtMHhCQiAqLworCTB4RUIsIDB4QzIsIDB4RUIsIDB4QzQsIDB4QzksIDB4RjYsIDB4RDYsIDB4RDcsIC8qIDB4QkMtMHhCRiAqLworCTB4RDUsIDB4Q0QsIDB4RDAsIDB4QjIsIDB4RUIsIDB4Q0YsIDB4Q0UsIDB4QjgsIC8qIDB4QzAtMHhDMyAqLworCTB4RUIsIDB4RDAsIDB4QzMsIDB4NUQsIDB4QjUsIDB4QTgsIDB4QzMsIDB4NUUsIC8qIDB4QzQtMHhDNyAqLworCTB4QzMsIDB4NUYsIDB4QzMsIDB4NjAsIDB4QzMsIDB4NjEsIDB4QzMsIDB4NjIsIC8qIDB4QzgtMHhDQiAqLworCTB4QjEsIDB4QjMsIDB4RUIsIDB4RDIsIDB4Q0MsIDB4QTUsIDB4QzMsIDB4NjMsIC8qIDB4Q0MtMHhDRiAqLworCTB4QzMsIDB4NjQsIDB4QzMsIDB4NjUsIDB4QzMsIDB4NjYsIDB4QzMsIDB4NjcsIC8qIDB4RDAtMHhEMyAqLworCTB4QzMsIDB4NjgsIDB4QzMsIDB4NjksIDB4QzUsIDB4RDYsIDB4RUIsIDB4RDMsIC8qIDB4RDQtMHhENyAqLworCTB4QzMsIDB4NkEsIDB4RUIsIDB4RDEsIDB4QzUsIDB4REYsIDB4RUIsIDB4Q0UsIC8qIDB4RDgtMHhEQiAqLworCTB4Q0EsIDB4QTQsIDB4RUIsIDB4RDUsIDB4QjAsIDB4RkIsIDB4QzMsIDB4NkIsIC8qIDB4REMtMHhERiAqLworCTB4QzMsIDB4NkMsIDB4QkEsIDB4RkEsIDB4QzMsIDB4NkQsIDB4QzMsIDB4NkUsIC8qIDB4RTAtMHhFMyAqLworCTB4RDgsIDB4QjcsIDB4RjEsIDB4RTMsIDB4QzMsIDB4NkYsIDB4RUIsIDB4Q0EsIC8qIDB4RTQtMHhFNyAqLworCTB4RUIsIDB4Q0IsIDB4RUIsIDB4Q0MsIDB4RUIsIDB4Q0QsIDB4RUIsIDB4RDYsIC8qIDB4RTgtMHhFQiAqLworCTB4RTYsIDB4QzAsIDB4RUIsIDB4RDksIDB4QzMsIDB4NzAsIDB4QkYsIDB4RTgsIC8qIDB4RUMtMHhFRiAqLworCTB4RDIsIDB4QzgsIDB4RUIsIDB4RDcsIDB4RUIsIDB4REMsIDB4QjgsIDB4RUMsIC8qIDB4RjAtMHhGMyAqLworCTB4RUIsIDB4RDgsIDB4QzMsIDB4NzEsIDB4QkQsIDB4QkEsIDB4QzMsIDB4NzIsIC8qIDB4RjQtMHhGNyAqLworCTB4RDAsIDB4RDgsIDB4QzMsIDB4NzMsIDB4QjAsIDB4QjcsIDB4QzMsIDB4NzQsIC8qIDB4RjgtMHhGQiAqLworCTB4RUIsIDB4REQsIDB4QzQsIDB4REMsIDB4QzMsIDB4NzUsIDB4QzMsIDB4NzYsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzgxWzUxMl0gPSB7CisJMHhDMywgMHg3NywgMHhDMywgMHg3OCwgMHhENiwgMHhBQywgMHhDMywgMHg3OSwgLyogMHgwMC0weDAzICovCisJMHhDMywgMHg3QSwgMHhDMywgMHg3QiwgMHhCNCwgMHhFMCwgMHhDMywgMHg3QywgLyogMHgwNC0weDA3ICovCisJMHhDMywgMHg3RCwgMHhDMiwgMHhGNiwgMHhCQywgMHhCOSwgMHhDMywgMHg3RSwgLyogMHgwOC0weDBCICovCisJMHhDMywgMHg4MCwgMHhFQiwgMHhEQSwgMHhFQiwgMHhEQiwgMHhENCwgMHhFMCwgLyogMHgwQy0weDBGICovCisJMHhDNiwgMHhFQSwgMHhDNCwgMHhENCwgMHhFQiwgMHhERiwgMHhDNSwgMHhBNywgLyogMHgxMC0weDEzICovCisJMHhEOSwgMHhGNSwgMHhDMywgMHg4MSwgMHhCMiwgMHhCMSwgMHhDMywgMHg4MiwgLyogMHgxNC0weDE3ICovCisJMHhFQiwgMHhFNCwgMHhDMywgMHg4MywgMHhCRCwgMHhDNSwgMHhDMywgMHg4NCwgLyogMHgxOC0weDFCICovCisJMHhDMywgMHg4NSwgMHhDMywgMHg4NiwgMHhFQiwgMHhFMiwgMHhDMywgMHg4NywgLyogMHgxQy0weDFGICovCisJMHhDMywgMHg4OCwgMHhDMywgMHg4OSwgMHhDMywgMHg4QSwgMHhDMywgMHg4QiwgLyogMHgyMC0weDIzICovCisJMHhDMywgMHg4QywgMHhDMywgMHg4RCwgMHhDMywgMHg4RSwgMHhDMywgMHg4RiwgLyogMHgyNC0weDI3ICovCisJMHhDMywgMHg5MCwgMHhDMywgMHg5MSwgMHhDMywgMHg5MiwgMHhDMywgMHg5MywgLyogMHgyOC0weDJCICovCisJMHhFQiwgMHhFMywgMHhDMywgMHg5NCwgMHhDMywgMHg5NSwgMHhCOCwgMHhBQywgLyogMHgyQy0weDJGICovCisJMHhDMywgMHg5NiwgMHhDRCwgMHhEMSwgMHhFQiwgMHhFNSwgMHhDMywgMHg5NywgLyogMHgzMC0weDMzICovCisJMHhDMywgMHg5OCwgMHhDMywgMHg5OSwgMHhFQiwgMHhFMSwgMHhDMywgMHg5QSwgLyogMHgzNC0weDM3ICovCisJMHhDMSwgMHhCMywgMHhDMywgMHg5QiwgMHhDMywgMHg5QywgMHhDMywgMHg5RCwgLyogMHgzOC0weDNCICovCisJMHhDMywgMHg5RSwgMHhDMywgMHg5RiwgMHhDNiwgMHhBMiwgMHhDMywgMHhBMCwgLyogMHgzQy0weDNGICovCisJMHhDNCwgMHg0MCwgMHhDNCwgMHg0MSwgMHhDNCwgMHg0MiwgMHhDNCwgMHg0MywgLyogMHg0MC0weDQzICovCisJMHhDNCwgMHg0NCwgMHhDNCwgMHg0NSwgMHhDQywgMHhGMywgMHhDNCwgMHg0NiwgLyogMHg0NC0weDQ3ICovCisJMHhFQiwgMHhFNiwgMHhDNCwgMHg0NywgMHhDMCwgMHhCMCwgMHhEMiwgMHhCOCwgLyogMHg0OC0weDRCICovCisJMHhFQiwgMHhFNywgMHhDNCwgMHg0OCwgMHhDNCwgMHg0OSwgMHhDNCwgMHg0QSwgLyogMHg0Qy0weDRGICovCisJMHhCOCwgMHhBRiwgMHhCOCwgMHhBRCwgMHhDNCwgMHg0QiwgMHhFQiwgMHhFOCwgLyogMHg1MC0weDUzICovCisJMHhDNywgMHhCQiwgMHhDRCwgMHhGMywgMHhDNCwgMHg0QywgMHhDNCwgMHg0RCwgLyogMHg1NC0weDU3ICovCisJMHhDNCwgMHg0RSwgMHhFQiwgMHhFQSwgMHhFQiwgMHhFQiwgMHhDNCwgMHg0RiwgLyogMHg1OC0weDVCICovCisJMHhDNCwgMHg1MCwgMHhDNCwgMHg1MSwgMHhDNCwgMHg1MiwgMHhDNCwgMHg1MywgLyogMHg1Qy0weDVGICovCisJMHhFQiwgMHhFRCwgMHhDNCwgMHg1NCwgMHhDNCwgMHg1NSwgMHhDNCwgMHg1NiwgLyogMHg2MC0weDYzICovCisJMHhDNCwgMHg1NywgMHhEMCwgMHhDOCwgMHhDNCwgMHg1OCwgMHhFQiwgMHhGMiwgLyogMHg2NC0weDY3ICovCisJMHhDNCwgMHg1OSwgMHhFQiwgMHhFRSwgMHhDNCwgMHg1QSwgMHhDNCwgMHg1QiwgLyogMHg2OC0weDZCICovCisJMHhDNCwgMHg1QywgMHhFQiwgMHhGMSwgMHhDOCwgMHhGOSwgMHhDNCwgMHg1RCwgLyogMHg2Qy0weDZGICovCisJMHhEMSwgMHhGQywgMHhFQiwgMHhFQywgMHhDNCwgMHg1RSwgMHhDNCwgMHg1RiwgLyogMHg3MC0weDczICovCisJMHhFQiwgMHhFOSwgMHhDNCwgMHg2MCwgMHhDNCwgMHg2MSwgMHhDNCwgMHg2MiwgLyogMHg3NC0weDc3ICovCisJMHhDNCwgMHg2MywgMHhCOCwgMHhCOSwgMHhDRiwgMHhEOSwgMHhDNCwgMHhFNSwgLyogMHg3OC0weDdCICovCisJMHhFQiwgMHhFRiwgMHhFQiwgMHhGMCwgMHhDQywgMHhEQSwgMHhDRCwgMHhDOCwgLyogMHg3Qy0weDdGICovCisJCisJMHhCMCwgMHhGMiwgMHhDNCwgMHg2NCwgMHhFQiwgMHhGNiwgMHhDNCwgMHg2NSwgLyogMHg4MC0weDgzICovCisJMHhDNCwgMHg2NiwgMHhDNCwgMHg2NywgMHhDNCwgMHg2OCwgMHhDNCwgMHg2OSwgLyogMHg4NC0weDg3ICovCisJMHhFQiwgMHhGNSwgMHhDNCwgMHg2QSwgMHhCMiwgMHhCMiwgMHhDNCwgMHg2QiwgLyogMHg4OC0weDhCICovCisJMHhDNCwgMHg2QywgMHhDNCwgMHg2RCwgMHhDNCwgMHg2RSwgMHhCOCwgMHhFMCwgLyogMHg4Qy0weDhGICovCisJMHhDNCwgMHg2RiwgMHhFQiwgMHhGNywgMHhDNCwgMHg3MCwgMHhDNCwgMHg3MSwgLyogMHg5MC0weDkzICovCisJMHhDNCwgMHg3MiwgMHhDNCwgMHg3MywgMHhDNCwgMHg3NCwgMHhDNCwgMHg3NSwgLyogMHg5NC0weDk3ICovCisJMHhCMSwgMHhFQywgMHhDNCwgMHg3NiwgMHhDNCwgMHg3NywgMHhDQywgMHhDNSwgLyogMHg5OC0weDlCICovCisJMHhDNCwgMHhBNCwgMHhDRiwgMHhBNSwgMHhDNCwgMHg3OCwgMHhDNCwgMHg3OSwgLyogMHg5Qy0weDlGICovCisJMHhDNCwgMHg3QSwgMHhDNCwgMHg3QiwgMHhDNCwgMHg3QywgMHhFQiwgMHhGOSwgLyogMHhBMC0weEEzICovCisJMHhDNCwgMHg3RCwgMHhDNCwgMHg3RSwgMHhFQywgMHhBMiwgMHhDNCwgMHg4MCwgLyogMHhBNC0weEE3ICovCisJMHhDNSwgMHhGMiwgMHhDNCwgMHg4MSwgMHhFQiwgMHhGQSwgMHhDNCwgMHg4MiwgLyogMHhBOC0weEFCICovCisJMHhDNCwgMHg4MywgMHhDNCwgMHg4NCwgMHhDNCwgMHg4NSwgMHhDNCwgMHg4NiwgLyogMHhBQy0weEFGICovCisJMHhDNCwgMHg4NywgMHhDNCwgMHg4OCwgMHhDNCwgMHg4OSwgMHhDOSwgMHhDNSwgLyogMHhCMC0weEIzICovCisJMHhDNCwgMHg4QSwgMHhDNCwgMHg4QiwgMHhDNCwgMHg4QywgMHhDNCwgMHg4RCwgLyogMHhCNC0weEI3ICovCisJMHhDNCwgMHg4RSwgMHhDNCwgMHg4RiwgMHhFMiwgMHhERiwgMHhFQiwgMHhGRSwgLyogMHhCOC0weEJCICovCisJMHhDNCwgMHg5MCwgMHhDNCwgMHg5MSwgMHhDNCwgMHg5MiwgMHhDNCwgMHg5MywgLyogMHhCQy0weEJGICovCisJMHhDRCwgMHhDRSwgMHhFQywgMHhBMSwgMHhCMSwgMHhEQiwgMHhEMywgMHhCNywgLyogMHhDMC0weEMzICovCisJMHhDNCwgMHg5NCwgMHhDNCwgMHg5NSwgMHhEMiwgMHhEQywgMHhDNCwgMHg5NiwgLyogMHhDNC0weEM3ICovCisJMHhDNCwgMHg5NywgMHhDNCwgMHg5OCwgMHhFQiwgMHhGRCwgMHhDNCwgMHg5OSwgLyogMHhDOC0weENCICovCisJMHhFQiwgMHhGQiwgMHhDNCwgMHg5QSwgMHhDNCwgMHg5QiwgMHhDNCwgMHg5QywgLyogMHhDQy0weENGICovCisJMHhDNCwgMHg5RCwgMHhDNCwgMHg5RSwgMHhDNCwgMHg5RiwgMHhDNCwgMHhBMCwgLyogMHhEMC0weEQzICovCisJMHhDNSwgMHg0MCwgMHhDNSwgMHg0MSwgMHhDNSwgMHg0MiwgMHhDNSwgMHg0MywgLyogMHhENC0weEQ3ICovCisJMHhDNSwgMHg0NCwgMHhDNSwgMHg0NSwgMHhDNSwgMHg0NiwgMHhDNSwgMHg0NywgLyogMHhEOC0weERCICovCisJMHhDNSwgMHg0OCwgMHhDNSwgMHg0OSwgMHhDNSwgMHg0QSwgMHhDNSwgMHg0QiwgLyogMHhEQy0weERGICovCisJMHhDNSwgMHg0QywgMHhDNSwgMHg0RCwgMHhDNSwgMHg0RSwgMHhCMywgMHhCQywgLyogMHhFMC0weEUzICovCisJMHhDNSwgMHg0RiwgMHhDNSwgMHg1MCwgMHhDNSwgMHg1MSwgMHhFQSwgMHhCMCwgLyogMHhFNC0weEU3ICovCisJMHhDNSwgMHg1MiwgMHhDNSwgMHg1MywgMHhENywgMHhENCwgMHhDNSwgMHg1NCwgLyogMHhFOC0weEVCICovCisJMHhGNCwgMHhBQiwgMHhCMywgMHhGNCwgMHhDNSwgMHg1NSwgMHhDNSwgMHg1NiwgLyogMHhFQy0weEVGICovCisJMHhDNSwgMHg1NywgMHhDNSwgMHg1OCwgMHhDNSwgMHg1OSwgMHhENiwgMHhDMSwgLyogMHhGMC0weEYzICovCisJMHhENiwgMHhDMiwgMHhDNSwgMHg1QSwgMHhDNSwgMHg1QiwgMHhDNSwgMHg1QywgLyogMHhGNC0weEY3ICovCisJMHhDNSwgMHg1RCwgMHhDNSwgMHg1RSwgMHhDNSwgMHg1RiwgMHhENSwgMHhFOSwgLyogMHhGOC0weEZCICovCisJMHhCRSwgMHhDQSwgMHhDNSwgMHg2MCwgMHhGNCwgMHhBNywgMHhDNSwgMHg2MSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfODJbNTEyXSA9IHsKKwkweEQyLCAweEE4LCAweEY0LCAweEE4LCAweEY0LCAweEE5LCAweEM1LCAweDYyLCAvKiAweDAwLTB4MDMgKi8KKwkweEY0LCAweEFBLCAweEJFLCAweENCLCAweEQzLCAweERGLCAweEM1LCAweDYzLCAvKiAweDA0LTB4MDcgKi8KKwkweEM1LCAweDY0LCAweEM1LCAweDY1LCAweEM1LCAweDY2LCAweEM1LCAweDY3LCAvKiAweDA4LTB4MEIgKi8KKwkweEM5LCAweEUwLCAweEM5LCAweEUxLCAweEM1LCAweDY4LCAweEM1LCAweDY5LCAvKiAweDBDLTB4MEYgKi8KKwkweEYzLCAweEMyLCAweEM1LCAweDZBLCAweENBLCAweEU2LCAweEM1LCAweDZCLCAvKiAweDEwLTB4MTMgKi8KKwkweENDLCAweEYyLCAweEM1LCAweDZDLCAweEM1LCAweDZELCAweEM1LCAweDZFLCAvKiAweDE0LTB4MTcgKi8KKwkweEM1LCAweDZGLCAweEM1LCAweDcwLCAweEM1LCAweDcxLCAweEUyLCAweEI2LCAvKiAweDE4LTB4MUIgKi8KKwkweENCLCAweEI0LCAweEM1LCAweDcyLCAweENFLCAweEU4LCAweEQ2LCAweERCLCAvKiAweDFDLTB4MUYgKi8KKwkweEM1LCAweDczLCAweEY0LCAweEFELCAweEY0LCAweEFFLCAweEY0LCAweEFGLCAvKiAweDIwLTB4MjMgKi8KKwkweEM1LCAweDc0LCAweEM1LCAweDc1LCAweEM1LCAweDc2LCAweEM1LCAweDc3LCAvKiAweDI0LTB4MjcgKi8KKwkweEY0LCAweEIyLCAweEM1LCAweDc4LCAweEJBLCAweEJELCAweEY0LCAweEIzLCAvKiAweDI4LTB4MkIgKi8KKwkweEIwLCAweEUzLCAweEY0LCAweEIwLCAweEM1LCAweDc5LCAweEY0LCAweEIxLCAvKiAweDJDLTB4MkYgKi8KKwkweEJELCAweEEyLCAweEIyLCAweEQ1LCAweEM1LCAweDdBLCAweEY0LCAweEI2LCAvKiAweDMwLTB4MzMgKi8KKwkweEY0LCAweEI3LCAweEI2LCAweEU2LCAweEIyLCAweEIwLCAweENGLCAweENGLCAvKiAweDM0LTB4MzcgKi8KKwkweEY0LCAweEI0LCAweEI0LCAweEFDLCAweEM1LCAweDdCLCAweEY0LCAweEI1LCAvKiAweDM4LTB4M0IgKi8KKwkweEM1LCAweDdDLCAweEM1LCAweDdELCAweEY0LCAweEI4LCAweEM1LCAweDdFLCAvKiAweDNDLTB4M0YgKi8KKwkweEM1LCAweDgwLCAweEM1LCAweDgxLCAweEM1LCAweDgyLCAweEM1LCAweDgzLCAvKiAweDQwLTB4NDMgKi8KKwkweEY0LCAweEI5LCAweEM1LCAweDg0LCAweEM1LCAweDg1LCAweENELCAweEE3LCAvKiAweDQ0LTB4NDcgKi8KKwkweEM1LCAweDg2LCAweEY0LCAweEJBLCAweEM1LCAweDg3LCAweEY0LCAweEJCLCAvKiAweDQ4LTB4NEIgKi8KKwkweEM1LCAweDg4LCAweEM1LCAweDg5LCAweEM1LCAweDhBLCAweEY0LCAweEJDLCAvKiAweDRDLTB4NEYgKi8KKwkweEM1LCAweDhCLCAweEM1LCAweDhDLCAweEM1LCAweDhELCAweEM1LCAweDhFLCAvKiAweDUwLTB4NTMgKi8KKwkweEM1LCAweDhGLCAweEM1LCAweDkwLCAweEM1LCAweDkxLCAweEM1LCAweDkyLCAvKiAweDU0LTB4NTcgKi8KKwkweENCLCAweEQyLCAweEM1LCAweDkzLCAweEY0LCAweEJELCAweEM1LCAweDk0LCAvKiAweDU4LTB4NUIgKi8KKwkweEM1LCAweDk1LCAweEM1LCAweDk2LCAweEM1LCAweDk3LCAweEY0LCAweEJFLCAvKiAweDVDLTB4NUYgKi8KKwkweEM1LCAweDk4LCAweEM1LCAweDk5LCAweEM1LCAweDlBLCAweEM1LCAweDlCLCAvKiAweDYwLTB4NjMgKi8KKwkweEM1LCAweDlDLCAweEM1LCAweDlELCAweEM1LCAweDlFLCAweEM1LCAweDlGLCAvKiAweDY0LTB4NjcgKi8KKwkweEY0LCAweEJGLCAweEM1LCAweEEwLCAweEM2LCAweDQwLCAweEM2LCAweDQxLCAvKiAweDY4LTB4NkIgKi8KKwkweEM2LCAweDQyLCAweEM2LCAweDQzLCAweEY0LCAweERFLCAweEMxLCAweEJDLCAvKiAweDZDLTB4NkYgKi8KKwkweEJDLCAweEU4LCAweEM2LCAweDQ0LCAweEM5LCAweEFCLCAweEQxLCAweERFLCAvKiAweDcwLTB4NzMgKi8KKwkweEU1LCAweEY1LCAweEM2LCAweDQ1LCAweEM2LCAweDQ2LCAweEM2LCAweDQ3LCAvKiAweDc0LTB4NzcgKi8KKwkweEM2LCAweDQ4LCAweERDLCAweEIzLCAweEQyLCAweEQ1LCAweEM2LCAweDQ5LCAvKiAweDc4LTB4N0IgKi8KKwkweEM2LCAweDRBLCAweERDLCAweEI0LCAweEIwLCAweEFDLCAweERDLCAweEI1LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEM2LCAweDRCLCAweEM2LCAweDRDLCAweEJELCAweERBLCAweEM2LCAweDRELCAvKiAweDgwLTB4ODMgKi8KKwkweERDLCAweEI5LCAweEM2LCAweDRFLCAweEM2LCAweDRGLCAweEM2LCAweDUwLCAvKiAweDg0LTB4ODcgKi8KKwkweEQ4LCAweEMyLCAweEM2LCAweDUxLCAweERDLCAweEI3LCAweEQzLCAweEYzLCAvKiAweDg4LTB4OEIgKi8KKwkweEM2LCAweDUyLCAweEM5LCAweEQ2LCAweERDLCAweEJBLCAweERDLCAweEI2LCAvKiAweDhDLTB4OEYgKi8KKwkweEM2LCAweDUzLCAweERDLCAweEJCLCAweEMzLCAweEEyLCAweEM2LCAweDU0LCAvKiAweDkwLTB4OTMgKi8KKwkweEM2LCAweDU1LCAweEM2LCAweDU2LCAweEM2LCAweDU3LCAweERDLCAweEJDLCAvKiAweDk0LTB4OTcgKi8KKwkweERDLCAweEM1LCAweERDLCAweEJELCAweEM2LCAweDU4LCAweEM2LCAweDU5LCAvKiAweDk4LTB4OUIgKi8KKwkweENFLCAweERGLCAweEQ2LCAweEE1LCAweEM2LCAweDVBLCAweERDLCAweENGLCAvKiAweDlDLTB4OUYgKi8KKwkweEM2LCAweDVCLCAweERDLCAweENELCAweEM2LCAweDVDLCAweEM2LCAweDVELCAvKiAweEEwLTB4QTMgKi8KKwkweERDLCAweEQyLCAweEJELCAweEU2LCAweEMyLCAweEFCLCAweEM2LCAweDVFLCAvKiAweEE0LTB4QTcgKi8KKwkweERDLCAweEI4LCAweERDLCAweENCLCAweERDLCAweENFLCAweERDLCAweEJFLCAvKiAweEE4LTB4QUIgKi8KKwkweEI3LCAweEQyLCAweEIwLCAweEM1LCAweERDLCAweEM3LCAweEQwLCAweEJFLCAvKiAweEFDLTB4QUYgKi8KKwkweERDLCAweEMxLCAweEJCLCAweEE4LCAweEM2LCAweDVGLCAweEI3LCAweEJDLCAvKiAweEIwLTB4QjMgKi8KKwkweERDLCAweENDLCAweEM2LCAweDYwLCAweEM2LCAweDYxLCAweERDLCAweEM2LCAvKiAweEI0LTB4QjcgKi8KKwkweERDLCAweEJGLCAweEM3LCAweERCLCAweEM2LCAweDYyLCAweEM2LCAweDYzLCAvKiAweEI4LTB4QkIgKi8KKwkweEM2LCAweDY0LCAweEQxLCAweEJGLCAweERDLCAweEMwLCAweEM2LCAweDY1LCAvKiAweEJDLTB4QkYgKi8KKwkweEM2LCAweDY2LCAweERDLCAweENBLCAweEM2LCAweDY3LCAweEM2LCAweDY4LCAvKiAweEMwLTB4QzMgKi8KKwkweERDLCAweEQwLCAweEM2LCAweDY5LCAweEM2LCAweDZBLCAweENFLCAweEFELCAvKiAweEM0LTB4QzcgKi8KKwkweERDLCAweEMyLCAweEM2LCAweDZCLCAweERDLCAweEMzLCAweERDLCAweEM4LCAvKiAweEM4LTB4Q0IgKi8KKwkweERDLCAweEM5LCAweEIyLCAweEQ0LCAweERDLCAweEQxLCAweENCLCAweEQ1LCAvKiAweENDLTB4Q0YgKi8KKwkweEM2LCAweDZDLCAweEQ0LCAweEI3LCAweERDLCAweERCLCAweERDLCAweERGLCAvKiAweEQwLTB4RDMgKi8KKwkweENDLCAweEE2LCAweERDLCAweEU2LCAweEM2LCAweDZELCAweEMzLCAweEU3LCAvKiAweEQ0LTB4RDcgKi8KKwkweERDLCAweERDLCAweEM2LCAweDZFLCAweEM2LCAweDZGLCAweEJGLCAweEMxLCAvKiAweEQ4LTB4REIgKi8KKwkweERDLCAweEQ5LCAweEM2LCAweDcwLCAweEIwLCAweEZBLCAweEI5LCAweEI2LCAvKiAweERDLTB4REYgKi8KKwkweERDLCAweEU1LCAweERDLCAweEQzLCAweEM2LCAweDcxLCAweERDLCAweEM0LCAvKiAweEUwLTB4RTMgKi8KKwkweERDLCAweEQ2LCAweEM4LCAweEY0LCAweEJGLCAweEUwLCAweEM2LCAweDcyLCAvKiAweEU0LTB4RTcgKi8KKwkweEM2LCAweDczLCAweEM2LCAweDc0LCAweEM2LCAweDc1LCAweEM5LCAweEJCLCAvKiAweEU4LTB4RUIgKi8KKwkweEM2LCAweDc2LCAweEM2LCAweDc3LCAweEM2LCAweDc4LCAweEIxLCAweEJELCAvKiAweEVDLTB4RUYgKi8KKwkweEM2LCAweDc5LCAweEQzLCAweEEyLCAweEM2LCAweDdBLCAweEM2LCAweDdCLCAvKiAweEYwLTB4RjMgKi8KKwkweERDLCAweERBLCAweEM2LCAweDdDLCAweEM2LCAweDdELCAweERDLCAweEQ1LCAvKiAweEY0LTB4RjcgKi8KKwkweEM2LCAweDdFLCAweEM2LCAweEJCLCAweEM2LCAweDgwLCAweERDLCAweERFLCAvKiAweEY4LTB4RkIgKi8KKwkweEM2LCAweDgxLCAweEM2LCAweDgyLCAweEM2LCAweDgzLCAweEM2LCAweDg0LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184M1s1MTJdID0geworCTB4QzYsIDB4ODUsIDB4RDcsIDB4QzIsIDB4QzMsIDB4QUYsIDB4QjcsIDB4QjYsIC8qIDB4MDAtMHgwMyAqLworCTB4QzcsIDB4RDEsIDB4QzMsIDB4QTksIDB4REMsIDB4RTIsIDB4REMsIDB4RDgsIC8qIDB4MDQtMHgwNyAqLworCTB4REMsIDB4RUIsIDB4REMsIDB4RDQsIDB4QzYsIDB4ODYsIDB4QzYsIDB4ODcsIC8qIDB4MDgtMHgwQiAqLworCTB4REMsIDB4REQsIDB4QzYsIDB4ODgsIDB4QkUsIDB4QTUsIDB4REMsIDB4RDcsIC8qIDB4MEMtMHgwRiAqLworCTB4QzYsIDB4ODksIDB4REMsIDB4RTAsIDB4QzYsIDB4OEEsIDB4QzYsIDB4OEIsIC8qIDB4MTAtMHgxMyAqLworCTB4REMsIDB4RTMsIDB4REMsIDB4RTQsIDB4QzYsIDB4OEMsIDB4REMsIDB4RjgsIC8qIDB4MTQtMHgxNyAqLworCTB4QzYsIDB4OEQsIDB4QzYsIDB4OEUsIDB4REMsIDB4RTEsIDB4REQsIDB4QTIsIC8qIDB4MTgtMHgxQiAqLworCTB4REMsIDB4RTcsIDB4QzYsIDB4OEYsIDB4QzYsIDB4OTAsIDB4QzYsIDB4OTEsIC8qIDB4MUMtMHgxRiAqLworCTB4QzYsIDB4OTIsIDB4QzYsIDB4OTMsIDB4QzYsIDB4OTQsIDB4QzYsIDB4OTUsIC8qIDB4MjAtMHgyMyAqLworCTB4QzYsIDB4OTYsIDB4QzYsIDB4OTcsIDB4QzYsIDB4OTgsIDB4QkMsIDB4RUIsIC8qIDB4MjQtMHgyNyAqLworCTB4QjQsIDB4QzQsIDB4QzYsIDB4OTksIDB4QzYsIDB4OUEsIDB4QzMsIDB4QTMsIC8qIDB4MjgtMHgyQiAqLworCTB4QjIsIDB4RTcsIDB4REMsIDB4RkEsIDB4QzYsIDB4OUIsIDB4REMsIDB4RjIsIC8qIDB4MkMtMHgyRiAqLworCTB4QzYsIDB4OUMsIDB4REMsIDB4RUYsIDB4QzYsIDB4OUQsIDB4REMsIDB4RkMsIC8qIDB4MzAtMHgzMyAqLworCTB4REMsIDB4RUUsIDB4RDIsIDB4RjAsIDB4QjIsIDB4RTgsIDB4QzYsIDB4OUUsIC8qIDB4MzQtMHgzNyAqLworCTB4QzgsIDB4RDcsIDB4QzgsIDB4RTMsIDB4REMsIDB4RkIsIDB4QzYsIDB4OUYsIC8qIDB4MzgtMHgzQiAqLworCTB4REMsIDB4RUQsIDB4QzYsIDB4QTAsIDB4QzcsIDB4NDAsIDB4QzcsIDB4NDEsIC8qIDB4M0MtMHgzRiAqLworCTB4REMsIDB4RjcsIDB4QzcsIDB4NDIsIDB4QzcsIDB4NDMsIDB4REMsIDB4RjUsIC8qIDB4NDAtMHg0MyAqLworCTB4QzcsIDB4NDQsIDB4QzcsIDB4NDUsIDB4QkUsIDB4QTMsIDB4REMsIDB4RjQsIC8qIDB4NDQtMHg0NyAqLworCTB4QzcsIDB4NDYsIDB4QjIsIDB4REQsIDB4QzcsIDB4NDcsIDB4QzcsIDB4NDgsIC8qIDB4NDgtMHg0QiAqLworCTB4QzcsIDB4NDksIDB4QzcsIDB4NEEsIDB4QzcsIDB4NEIsIDB4REMsIDB4RjMsIC8qIDB4NEMtMHg0RiAqLworCTB4QkMsIDB4RjYsIDB4REMsIDB4RTgsIDB4QkIsIDB4QzQsIDB4QzcsIDB4NEMsIC8qIDB4NTAtMHg1MyAqLworCTB4QzAsIDB4RjMsIDB4QzcsIDB4NEQsIDB4QzcsIDB4NEUsIDB4QzcsIDB4NEYsIC8qIDB4NTQtMHg1NyAqLworCTB4QzcsIDB4NTAsIDB4QzcsIDB4NTEsIDB4QkMsIDB4RDQsIDB4REMsIDB4RTksIC8qIDB4NTgtMHg1QiAqLworCTB4REMsIDB4RUEsIDB4QzcsIDB4NTIsIDB4REMsIDB4RjEsIDB4REMsIDB4RjYsIC8qIDB4NUMtMHg1RiAqLworCTB4REMsIDB4RjksIDB4QjUsIDB4QjQsIDB4QzcsIDB4NTMsIDB4QzgsIDB4RDksIC8qIDB4NjAtMHg2MyAqLworCTB4QkIsIDB4RTcsIDB4REMsIDB4RkUsIDB4REMsIDB4RkQsIDB4RDMsIDB4QUIsIC8qIDB4NjQtMHg2NyAqLworCTB4REQsIDB4QTEsIDB4REQsIDB4QTMsIDB4REQsIDB4QTUsIDB4RDIsIDB4RjEsIC8qIDB4NjgtMHg2QiAqLworCTB4REQsIDB4QTQsIDB4REQsIDB4QTYsIDB4REQsIDB4QTcsIDB4RDIsIDB4QTksIC8qIDB4NkMtMHg2RiAqLworCTB4QzcsIDB4NTQsIDB4QzcsIDB4NTUsIDB4QzcsIDB4NTYsIDB4QzcsIDB4NTcsIC8qIDB4NzAtMHg3MyAqLworCTB4QzcsIDB4NTgsIDB4QzcsIDB4NTksIDB4QzcsIDB4NUEsIDB4QkEsIDB4QzksIC8qIDB4NzQtMHg3NyAqLworCTB4REQsIDB4QTksIDB4QzcsIDB4NUIsIDB4QzcsIDB4NUMsIDB4REQsIDB4QjYsIC8qIDB4NzgtMHg3QiAqLworCTB4REQsIDB4QjEsIDB4REQsIDB4QjQsIDB4QzcsIDB4NUQsIDB4QzcsIDB4NUUsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QzcsIDB4NUYsIDB4QzcsIDB4NjAsIDB4QzcsIDB4NjEsIDB4QzcsIDB4NjIsIC8qIDB4ODAtMHg4MyAqLworCTB4QzcsIDB4NjMsIDB4REQsIDB4QjAsIDB4QzYsIDB4Q0UsIDB4QzcsIDB4NjQsIC8qIDB4ODQtMHg4NyAqLworCTB4QzcsIDB4NjUsIDB4QzAsIDB4RjIsIDB4QzcsIDB4NjYsIDB4QzcsIDB4NjcsIC8qIDB4ODgtMHg4QiAqLworCTB4QzcsIDB4NjgsIDB4QzcsIDB4NjksIDB4QzksIDB4QUYsIDB4QzcsIDB4NkEsIC8qIDB4OEMtMHg4RiAqLworCTB4QzcsIDB4NkIsIDB4QzcsIDB4NkMsIDB4REMsIDB4RUMsIDB4REQsIDB4QUUsIC8qIDB4OTAtMHg5MyAqLworCTB4QzcsIDB4NkQsIDB4QzcsIDB4NkUsIDB4QzcsIDB4NkYsIDB4QzcsIDB4NzAsIC8qIDB4OTQtMHg5NyAqLworCTB4REQsIDB4QjcsIDB4QzcsIDB4NzEsIDB4QzcsIDB4NzIsIDB4REMsIDB4RjAsIC8qIDB4OTgtMHg5QiAqLworCTB4REQsIDB4QUYsIDB4QzcsIDB4NzMsIDB4REQsIDB4QjgsIDB4QzcsIDB4NzQsIC8qIDB4OUMtMHg5RiAqLworCTB4REQsIDB4QUMsIDB4QzcsIDB4NzUsIDB4QzcsIDB4NzYsIDB4QzcsIDB4NzcsIC8qIDB4QTAtMHhBMyAqLworCTB4QzcsIDB4NzgsIDB4QzcsIDB4NzksIDB4QzcsIDB4N0EsIDB4QzcsIDB4N0IsIC8qIDB4QTQtMHhBNyAqLworCTB4REQsIDB4QjksIDB4REQsIDB4QjMsIDB4REQsIDB4QUQsIDB4QzQsIDB4QUEsIC8qIDB4QTgtMHhBQiAqLworCTB4QzcsIDB4N0MsIDB4QzcsIDB4N0QsIDB4QzcsIDB4N0UsIDB4QzcsIDB4ODAsIC8qIDB4QUMtMHhBRiAqLworCTB4REQsIDB4QTgsIDB4QzAsIDB4QjMsIDB4QzEsIDB4QUIsIDB4REQsIDB4QUEsIC8qIDB4QjAtMHhCMyAqLworCTB4REQsIDB4QUIsIDB4QzcsIDB4ODEsIDB4REQsIDB4QjIsIDB4QkIsIDB4RjEsIC8qIDB4QjQtMHhCNyAqLworCTB4REQsIDB4QjUsIDB4RDMsIDB4QTgsIDB4REQsIDB4QkEsIDB4QzcsIDB4ODIsIC8qIDB4QjgtMHhCQiAqLworCTB4REQsIDB4QkIsIDB4QzMsIDB4QTcsIDB4QzcsIDB4ODMsIDB4QzcsIDB4ODQsIC8qIDB4QkMtMHhCRiAqLworCTB4REQsIDB4RDIsIDB4REQsIDB4QkMsIDB4QzcsIDB4ODUsIDB4QzcsIDB4ODYsIC8qIDB4QzAtMHhDMyAqLworCTB4QzcsIDB4ODcsIDB4REQsIDB4RDEsIDB4QzcsIDB4ODgsIDB4QjksIDB4QkQsIC8qIDB4QzQtMHhDNyAqLworCTB4QzcsIDB4ODksIDB4QzcsIDB4OEEsIDB4QkUsIDB4RDUsIDB4QzcsIDB4OEIsIC8qIDB4QzgtMHhDQiAqLworCTB4QkUsIDB4RkEsIDB4QzcsIDB4OEMsIDB4QzcsIDB4OEQsIDB4QkEsIDB4Q0EsIC8qIDB4Q0MtMHhDRiAqLworCTB4QzcsIDB4OEUsIDB4QzcsIDB4OEYsIDB4QzcsIDB4OTAsIDB4QzcsIDB4OTEsIC8qIDB4RDAtMHhEMyAqLworCTB4REQsIDB4Q0EsIDB4QzcsIDB4OTIsIDB4REQsIDB4QzUsIDB4QzcsIDB4OTMsIC8qIDB4RDQtMHhENyAqLworCTB4REQsIDB4QkYsIDB4QzcsIDB4OTQsIDB4QzcsIDB4OTUsIDB4QzcsIDB4OTYsIC8qIDB4RDgtMHhEQiAqLworCTB4QjIsIDB4Q0IsIDB4REQsIDB4QzMsIDB4QzcsIDB4OTcsIDB4REQsIDB4Q0IsIC8qIDB4REMtMHhERiAqLworCTB4QjIsIDB4QTQsIDB4REQsIDB4RDUsIDB4QzcsIDB4OTgsIDB4QzcsIDB4OTksIC8qIDB4RTAtMHhFMyAqLworCTB4QzcsIDB4OUEsIDB4REQsIDB4QkUsIDB4QzcsIDB4OUIsIDB4QzcsIDB4OUMsIC8qIDB4RTQtMHhFNyAqLworCTB4QzcsIDB4OUQsIDB4QzYsIDB4RDAsIDB4REQsIDB4RDAsIDB4QzcsIDB4OUUsIC8qIDB4RTgtMHhFQiAqLworCTB4QzcsIDB4OUYsIDB4QzcsIDB4QTAsIDB4QzgsIDB4NDAsIDB4QzgsIDB4NDEsIC8qIDB4RUMtMHhFRiAqLworCTB4REQsIDB4RDQsIDB4QzEsIDB4RTIsIDB4QjcsIDB4QzYsIDB4QzgsIDB4NDIsIC8qIDB4RjAtMHhGMyAqLworCTB4QzgsIDB4NDMsIDB4QzgsIDB4NDQsIDB4QzgsIDB4NDUsIDB4QzgsIDB4NDYsIC8qIDB4RjQtMHhGNyAqLworCTB4REQsIDB4Q0UsIDB4REQsIDB4Q0YsIDB4QzgsIDB4NDcsIDB4QzgsIDB4NDgsIC8qIDB4RjgtMHhGQiAqLworCTB4QzgsIDB4NDksIDB4REQsIDB4QzQsIDB4QzgsIDB4NEEsIDB4QzgsIDB4NEIsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzg0WzUxMl0gPSB7CisJMHhDOCwgMHg0QywgMHhERCwgMHhCRCwgMHhDOCwgMHg0RCwgMHhERCwgMHhDRCwgLyogMHgwMC0weDAzICovCisJMHhDQywgMHhEMSwgMHhDOCwgMHg0RSwgMHhERCwgMHhDOSwgMHhDOCwgMHg0RiwgLyogMHgwNC0weDA3ICovCisJMHhDOCwgMHg1MCwgMHhDOCwgMHg1MSwgMHhDOCwgMHg1MiwgMHhERCwgMHhDMiwgLyogMHgwOC0weDBCICovCisJMHhDMywgMHhDOCwgMHhDNiwgMHhCQywgMHhDRSwgMHhBRSwgMHhERCwgMHhDQywgLyogMHgwQy0weDBGICovCisJMHhDOCwgMHg1MywgMHhERCwgMHhDOCwgMHhDOCwgMHg1NCwgMHhDOCwgMHg1NSwgLyogMHgxMC0weDEzICovCisJMHhDOCwgMHg1NiwgMHhDOCwgMHg1NywgMHhDOCwgMHg1OCwgMHhDOCwgMHg1OSwgLyogMHgxNC0weDE3ICovCisJMHhERCwgMHhDMSwgMHhDOCwgMHg1QSwgMHhDOCwgMHg1QiwgMHhDOCwgMHg1QywgLyogMHgxOC0weDFCICovCisJMHhERCwgMHhDNiwgMHhDMiwgMHhEQywgMHhDOCwgMHg1RCwgMHhDOCwgMHg1RSwgLyogMHgxQy0weDFGICovCisJMHhDOCwgMHg1RiwgMHhDOCwgMHg2MCwgMHhDOCwgMHg2MSwgMHhDOCwgMHg2MiwgLyogMHgyMC0weDIzICovCisJMHhEMywgMHhBOSwgMHhEMywgMHhBQSwgMHhERCwgMHhEMywgMHhDRiwgMHhGNCwgLyogMHgyNC0weDI3ICovCisJMHhDOCwgMHhGOCwgMHhDOCwgMHg2MywgMHhDOCwgMHg2NCwgMHhDOCwgMHg2NSwgLyogMHgyOC0weDJCICovCisJMHhDOCwgMHg2NiwgMHhDOCwgMHg2NywgMHhDOCwgMHg2OCwgMHhDOCwgMHg2OSwgLyogMHgyQy0weDJGICovCisJMHhDOCwgMHg2QSwgMHhERCwgMHhFNiwgMHhDOCwgMHg2QiwgMHhDOCwgMHg2QywgLyogMHgzMC0weDMzICovCisJMHhDOCwgMHg2RCwgMHhDOCwgMHg2RSwgMHhDOCwgMHg2RiwgMHhDOCwgMHg3MCwgLyogMHgzNC0weDM3ICovCisJMHhERCwgMHhDNywgMHhDOCwgMHg3MSwgMHhDOCwgMHg3MiwgMHhDOCwgMHg3MywgLyogMHgzOC0weDNCICovCisJMHhERCwgMHhFMCwgMHhDMiwgMHhFNCwgMHhDOCwgMHg3NCwgMHhDOCwgMHg3NSwgLyogMHgzQy0weDNGICovCisJMHhDOCwgMHg3NiwgMHhDOCwgMHg3NywgMHhDOCwgMHg3OCwgMHhDOCwgMHg3OSwgLyogMHg0MC0weDQzICovCisJMHhDOCwgMHg3QSwgMHhDOCwgMHg3QiwgMHhERCwgMHhFMSwgMHhDOCwgMHg3QywgLyogMHg0NC0weDQ3ICovCisJMHhDOCwgMHg3RCwgMHhDOCwgMHg3RSwgMHhDOCwgMHg4MCwgMHhDOCwgMHg4MSwgLyogMHg0OC0weDRCICovCisJMHhDOCwgMHg4MiwgMHhDOCwgMHg4MywgMHhDOCwgMHg4NCwgMHhDOCwgMHg4NSwgLyogMHg0Qy0weDRGICovCisJMHhDOCwgMHg4NiwgMHhERCwgMHhENywgMHhDOCwgMHg4NywgMHhDOCwgMHg4OCwgLyogMHg1MC0weDUzICovCisJMHhDOCwgMHg4OSwgMHhDOCwgMHg4QSwgMHhDOCwgMHg4QiwgMHhENiwgMHhGOCwgLyogMHg1NC0weDU3ICovCisJMHhDOCwgMHg4QywgMHhERCwgMHhEOSwgMHhERCwgMHhEOCwgMHhCOCwgMHhGMCwgLyogMHg1OC0weDVCICovCisJMHhERCwgMHhENiwgMHhDOCwgMHg4RCwgMHhDOCwgMHg4RSwgMHhDOCwgMHg4RiwgLyogMHg1Qy0weDVGICovCisJMHhDOCwgMHg5MCwgMHhDNiwgMHhDRiwgMHhDOCwgMHg5MSwgMHhCNiwgMHhBRCwgLyogMHg2MC0weDYzICovCisJMHhDOCwgMHg5MiwgMHhDOCwgMHg5MywgMHhDOCwgMHg5NCwgMHhDOCwgMHg5NSwgLyogMHg2NC0weDY3ICovCisJMHhDOCwgMHg5NiwgMHhERCwgMHhFMiwgMHhDOCwgMHg5NywgMHhCQSwgMHhGOSwgLyogMHg2OC0weDZCICovCisJMHhENCwgMHhFMSwgMHhERCwgMHhFNywgMHhDOCwgMHg5OCwgMHhDOCwgMHg5OSwgLyogMHg2Qy0weDZGICovCisJMHhDOCwgMHg5QSwgMHhCNCwgMHhEMCwgMHhDOCwgMHg5QiwgMHhERCwgMHhEQSwgLyogMHg3MC0weDczICovCisJMHhDOCwgMHg5QywgMHhCRiwgMHhGQiwgMHhERCwgMHhFMywgMHhDOCwgMHg5RCwgLyogMHg3NC0weDc3ICovCisJMHhERCwgMHhERiwgMHhDOCwgMHg5RSwgMHhERCwgMHhERCwgMHhDOCwgMHg5RiwgLyogMHg3OC0weDdCICovCisJMHhDOCwgMHhBMCwgMHhDOSwgMHg0MCwgMHhDOSwgMHg0MSwgMHhDOSwgMHg0MiwgLyogMHg3Qy0weDdGICovCisJCisJMHhDOSwgMHg0MywgMHhDOSwgMHg0NCwgMHhCNSwgMHhEOSwgMHhDOSwgMHg0NSwgLyogMHg4MC0weDgzICovCisJMHhDOSwgMHg0NiwgMHhDOSwgMHg0NywgMHhDOSwgMHg0OCwgMHhERCwgMHhEQiwgLyogMHg4NC0weDg3ICovCisJMHhERCwgMHhEQywgMHhERCwgMHhERSwgMHhDOSwgMHg0OSwgMHhCRCwgMHhBRiwgLyogMHg4OC0weDhCICovCisJMHhERCwgMHhFNCwgMHhDOSwgMHg0QSwgMHhERCwgMHhFNSwgMHhDOSwgMHg0QiwgLyogMHg4Qy0weDhGICovCisJMHhDOSwgMHg0QywgMHhDOSwgMHg0RCwgMHhDOSwgMHg0RSwgMHhDOSwgMHg0RiwgLyogMHg5MC0weDkzICovCisJMHhDOSwgMHg1MCwgMHhDOSwgMHg1MSwgMHhDOSwgMHg1MiwgMHhERCwgMHhGNSwgLyogMHg5NC0weDk3ICovCisJMHhDOSwgMHg1MywgMHhDMywgMHhDOSwgMHhDOSwgMHg1NCwgMHhDOSwgMHg1NSwgLyogMHg5OC0weDlCICovCisJMHhDQiwgMHhFMiwgMHhDOSwgMHg1NiwgMHhDOSwgMHg1NywgMHhDOSwgMHg1OCwgLyogMHg5Qy0weDlGICovCisJMHhDOSwgMHg1OSwgMHhERCwgMHhGMiwgMHhDOSwgMHg1QSwgMHhDOSwgMHg1QiwgLyogMHhBMC0weEEzICovCisJMHhDOSwgMHg1QywgMHhDOSwgMHg1RCwgMHhDOSwgMHg1RSwgMHhDOSwgMHg1RiwgLyogMHhBNC0weEE3ICovCisJMHhDOSwgMHg2MCwgMHhDOSwgMHg2MSwgMHhDOSwgMHg2MiwgMHhDOSwgMHg2MywgLyogMHhBOC0weEFCICovCisJMHhDOSwgMHg2NCwgMHhDOSwgMHg2NSwgMHhDOSwgMHg2NiwgMHhEOCwgMHhFMSwgLyogMHhBQy0weEFGICovCisJMHhDOSwgMHg2NywgMHhDOSwgMHg2OCwgMHhDNiwgMHhEMSwgMHhDOSwgMHg2OSwgLyogMHhCMC0weEIzICovCisJMHhERCwgMHhGNCwgMHhDOSwgMHg2QSwgMHhDOSwgMHg2QiwgMHhDOSwgMHg2QywgLyogMHhCNC0weEI3ICovCisJMHhENSwgMHhGNCwgMHhERCwgMHhGMywgMHhERCwgMHhGMCwgMHhDOSwgMHg2RCwgLyogMHhCOC0weEJCICovCisJMHhDOSwgMHg2RSwgMHhERCwgMHhFQywgMHhDOSwgMHg2RiwgMHhERCwgMHhFRiwgLyogMHhCQy0weEJGICovCisJMHhDOSwgMHg3MCwgMHhERCwgMHhFOCwgMHhDOSwgMHg3MSwgMHhDOSwgMHg3MiwgLyogMHhDMC0weEMzICovCisJMHhEMCwgMHhFRSwgMHhDOSwgMHg3MywgMHhDOSwgMHg3NCwgMHhDOSwgMHg3NSwgLyogMHhDNC0weEM3ICovCisJMHhDOSwgMHg3NiwgMHhDOCwgMHhEOCwgMHhERCwgMHhFRSwgMHhDOSwgMHg3NywgLyogMHhDOC0weENCICovCisJMHhDOSwgMHg3OCwgMHhERCwgMHhFOSwgMHhDOSwgMHg3OSwgMHhDOSwgMHg3QSwgLyogMHhDQy0weENGICovCisJMHhERCwgMHhFQSwgMHhDQiwgMHhGMiwgMHhDOSwgMHg3QiwgMHhERCwgMHhFRCwgLyogMHhEMC0weEQzICovCisJMHhDOSwgMHg3QywgMHhDOSwgMHg3RCwgMHhCMSwgMHhDRCwgMHhDOSwgMHg3RSwgLyogMHhENC0weEQ3ICovCisJMHhDOSwgMHg4MCwgMHhDOSwgMHg4MSwgMHhDOSwgMHg4MiwgMHhDOSwgMHg4MywgLyogMHhEOC0weERCICovCisJMHhDOSwgMHg4NCwgMHhDMCwgMHhCNiwgMHhDOSwgMHg4NSwgMHhCQywgMHhCQiwgLyogMHhEQy0weERGICovCisJMHhERCwgMHhGMSwgMHhDOSwgMHg4NiwgMHhDOSwgMHg4NywgMHhERCwgMHhGNywgLyogMHhFMC0weEUzICovCisJMHhDOSwgMHg4OCwgMHhERCwgMHhGNiwgMHhERCwgMHhFQiwgMHhDOSwgMHg4OSwgLyogMHhFNC0weEU3ICovCisJMHhDOSwgMHg4QSwgMHhDOSwgMHg4QiwgMHhDOSwgMHg4QywgMHhDOSwgMHg4RCwgLyogMHhFOC0weEVCICovCisJMHhDNSwgMHhFRSwgMHhDOSwgMHg4RSwgMHhDOSwgMHg4RiwgMHhDOSwgMHg5MCwgLyogMHhFQy0weEVGICovCisJMHhERCwgMHhGQiwgMHhDOSwgMHg5MSwgMHhDOSwgMHg5MiwgMHhDOSwgMHg5MywgLyogMHhGMC0weEYzICovCisJMHhDOSwgMHg5NCwgMHhDOSwgMHg5NSwgMHhDOSwgMHg5NiwgMHhDOSwgMHg5NywgLyogMHhGNC0weEY3ICovCisJMHhDOSwgMHg5OCwgMHhDOSwgMHg5OSwgMHhDOSwgMHg5QSwgMHhDOSwgMHg5QiwgLyogMHhGOC0weEZCICovCisJMHhERSwgMHhBNCwgMHhDOSwgMHg5QywgMHhDOSwgMHg5RCwgMHhERSwgMHhBMywgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfODVbNTEyXSA9IHsKKwkweEM5LCAweDlFLCAweEM5LCAweDlGLCAweEM5LCAweEEwLCAweENBLCAweDQwLCAvKiAweDAwLTB4MDMgKi8KKwkweENBLCAweDQxLCAweENBLCAweDQyLCAweENBLCAweDQzLCAweENBLCAweDQ0LCAvKiAweDA0LTB4MDcgKi8KKwkweENBLCAweDQ1LCAweENBLCAweDQ2LCAweENBLCAweDQ3LCAweENBLCAweDQ4LCAvKiAweDA4LTB4MEIgKi8KKwkweERELCAweEY4LCAweENBLCAweDQ5LCAweENBLCAweDRBLCAweENBLCAweDRCLCAvKiAweDBDLTB4MEYgKi8KKwkweENBLCAweDRDLCAweEMzLCAweEVGLCAweENBLCAweDRELCAweEMyLCAweEZCLCAvKiAweDEwLTB4MTMgKi8KKwkweENBLCAweDRFLCAweENBLCAweDRGLCAweENBLCAweDUwLCAweEQ1LCAweEUxLCAvKiAweDE0LTB4MTcgKi8KKwkweENBLCAweDUxLCAweENBLCAweDUyLCAweENFLCAweEI1LCAweENBLCAweDUzLCAvKiAweDE4LTB4MUIgKi8KKwkweENBLCAweDU0LCAweENBLCAweDU1LCAweENBLCAweDU2LCAweERELCAweEZELCAvKiAweDFDLTB4MUYgKi8KKwkweENBLCAweDU3LCAweEIyLCAweENDLCAweENBLCAweDU4LCAweENBLCAweDU5LCAvKiAweDIwLTB4MjMgKi8KKwkweENBLCAweDVBLCAweENBLCAweDVCLCAweENBLCAweDVDLCAweENBLCAweDVELCAvKiAweDI0LTB4MjcgKi8KKwkweENBLCAweDVFLCAweENBLCAweDVGLCAweENBLCAweDYwLCAweEM0LCAweEU4LCAvKiAweDI4LTB4MkIgKi8KKwkweENBLCAweERGLCAweENBLCAweDYxLCAweENBLCAweDYyLCAweENBLCAweDYzLCAvKiAweDJDLTB4MkYgKi8KKwkweENBLCAweDY0LCAweENBLCAweDY1LCAweENBLCAweDY2LCAweENBLCAweDY3LCAvKiAweDMwLTB4MzMgKi8KKwkweENBLCAweDY4LCAweENBLCAweDY5LCAweENBLCAweDZBLCAweEM3LCAweEJFLCAvKiAweDM0LTB4MzcgKi8KKwkweERELCAweEZBLCAweERELCAweEZDLCAweERELCAweEZFLCAweERFLCAweEEyLCAvKiAweDM4LTB4M0IgKi8KKwkweEIwLCAweEFBLCAweEIxLCAweENFLCAweENBLCAweDZCLCAweENBLCAweDZDLCAvKiAweDNDLTB4M0YgKi8KKwkweENBLCAweDZELCAweENBLCAweDZFLCAweENBLCAweDZGLCAweERFLCAweEFDLCAvKiAweDQwLTB4NDMgKi8KKwkweENBLCAweDcwLCAweENBLCAweDcxLCAweENBLCAweDcyLCAweENBLCAweDczLCAvKiAweDQ0LTB4NDcgKi8KKwkweERFLCAweEE2LCAweEJELCAweEI2LCAweEM4LCAweEVGLCAweENBLCAweDc0LCAvKiAweDQ4LTB4NEIgKi8KKwkweENBLCAweDc1LCAweENBLCAweDc2LCAweENBLCAweDc3LCAweENBLCAweDc4LCAvKiAweDRDLTB4NEYgKi8KKwkweENBLCAweDc5LCAweENBLCAweDdBLCAweENBLCAweDdCLCAweENBLCAweDdDLCAvKiAweDUwLTB4NTMgKi8KKwkweENBLCAweDdELCAweENBLCAweDdFLCAweERFLCAweEExLCAweENBLCAweDgwLCAvKiAweDU0LTB4NTcgKi8KKwkweENBLCAweDgxLCAweERFLCAweEE1LCAweENBLCAweDgyLCAweENBLCAweDgzLCAvKiAweDU4LTB4NUIgKi8KKwkweENBLCAweDg0LCAweENBLCAweDg1LCAweERFLCAweEE5LCAweENBLCAweDg2LCAvKiAweDVDLTB4NUYgKi8KKwkweENBLCAweDg3LCAweENBLCAweDg4LCAweENBLCAweDg5LCAweENBLCAweDhBLCAvKiAweDYwLTB4NjMgKi8KKwkweERFLCAweEE4LCAweENBLCAweDhCLCAweENBLCAweDhDLCAweENBLCAweDhELCAvKiAweDY0LTB4NjcgKi8KKwkweERFLCAweEE3LCAweENBLCAweDhFLCAweENBLCAweDhGLCAweENBLCAweDkwLCAvKiAweDY4LTB4NkIgKi8KKwkweENBLCAweDkxLCAweENBLCAweDkyLCAweENBLCAweDkzLCAweENBLCAweDk0LCAvKiAweDZDLTB4NkYgKi8KKwkweENBLCAweDk1LCAweENBLCAweDk2LCAweERFLCAweEFELCAweENBLCAweDk3LCAvKiAweDcwLTB4NzMgKi8KKwkweEQ0LCAweENDLCAweENBLCAweDk4LCAweENBLCAweDk5LCAweENBLCAweDlBLCAvKiAweDc0LTB4NzcgKi8KKwkweENBLCAweDlCLCAweERFLCAweEIzLCAweERFLCAweEFBLCAweERFLCAweEFFLCAvKiAweDc4LTB4N0IgKi8KKwkweENBLCAweDlDLCAweENBLCAweDlELCAweEMwLCAweEQ5LCAweENBLCAweDlFLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweENBLCAweDlGLCAweENBLCAweEEwLCAweENCLCAweDQwLCAweENCLCAweDQxLCAvKiAweDgwLTB4ODMgKi8KKwkweEIxLCAweEExLCAweERFLCAweEI2LCAweENCLCAweDQyLCAweERFLCAweEIxLCAvKiAweDg0LTB4ODcgKi8KKwkweENCLCAweDQzLCAweENCLCAweDQ0LCAweENCLCAweDQ1LCAweENCLCAweDQ2LCAvKiAweDg4LTB4OEIgKi8KKwkweENCLCAweDQ3LCAweENCLCAweDQ4LCAweENCLCAweDQ5LCAweERFLCAweEIyLCAvKiAweDhDLTB4OEYgKi8KKwkweENCLCAweDRBLCAweENCLCAweDRCLCAweENCLCAweDRDLCAweENCLCAweDRELCAvKiAweDkwLTB4OTMgKi8KKwkweENCLCAweDRFLCAweENCLCAweDRGLCAweENCLCAweDUwLCAweENCLCAweDUxLCAvKiAweDk0LTB4OTcgKi8KKwkweENCLCAweDUyLCAweENCLCAweDUzLCAweENCLCAweDU0LCAweEQxLCAweEE2LCAvKiAweDk4LTB4OUIgKi8KKwkweERFLCAweEI1LCAweENCLCAweDU1LCAweENCLCAweDU2LCAweENCLCAweDU3LCAvKiAweDlDLTB4OUYgKi8KKwkweENCLCAweDU4LCAweENCLCAweDU5LCAweENCLCAweDVBLCAweENCLCAweDVCLCAvKiAweEEwLTB4QTMgKi8KKwkweERFLCAweEFGLCAweENCLCAweDVDLCAweENCLCAweDVELCAweENCLCAweDVFLCAvKiAweEE0LTB4QTcgKi8KKwkweERFLCAweEIwLCAweENCLCAweDVGLCAweEQwLCAweEJELCAweENCLCAweDYwLCAvKiAweEE4LTB4QUIgKi8KKwkweENCLCAweDYxLCAweENCLCAweDYyLCAweERFLCAweEI0LCAweENBLCAweEVELCAvKiAweEFDLTB4QUYgKi8KKwkweERFLCAweEI5LCAweENCLCAweDYzLCAweENCLCAweDY0LCAweENCLCAweDY1LCAvKiAweEIwLTB4QjMgKi8KKwkweENCLCAweDY2LCAweENCLCAweDY3LCAweENCLCAweDY4LCAweERFLCAweEI4LCAvKiAweEI0LTB4QjcgKi8KKwkweENCLCAweDY5LCAweERFLCAweEI3LCAweENCLCAweDZBLCAweENCLCAweDZCLCAvKiAweEI4LTB4QkIgKi8KKwkweENCLCAweDZDLCAweENCLCAweDZELCAweENCLCAweDZFLCAweENCLCAweDZGLCAvKiAweEJDLTB4QkYgKi8KKwkweENCLCAweDcwLCAweERFLCAweEJCLCAweENCLCAweDcxLCAweENCLCAweDcyLCAvKiAweEMwLTB4QzMgKi8KKwkweENCLCAweDczLCAweENCLCAweDc0LCAweENCLCAweDc1LCAweENCLCAweDc2LCAvKiAweEM0LTB4QzcgKi8KKwkweENCLCAweDc3LCAweEJELCAweEU1LCAweENCLCAweDc4LCAweENCLCAweDc5LCAvKiAweEM4LTB4Q0IgKi8KKwkweENCLCAweDdBLCAweENCLCAweDdCLCAweENCLCAweDdDLCAweEIyLCAweEQ4LCAvKiAweENDLTB4Q0YgKi8KKwkweEMzLCAweEVBLCAweENCLCAweDdELCAweENCLCAweDdFLCAweERFLCAweEJBLCAvKiAweEQwLTB4RDMgKi8KKwkweENCLCAweDgwLCAweEM1LCAweEJBLCAweENCLCAweDgxLCAweENCLCAweDgyLCAvKiAweEQ0LTB4RDcgKi8KKwkweENCLCAweDgzLCAweENCLCAweDg0LCAweENCLCAweDg1LCAweENCLCAweDg2LCAvKiAweEQ4LTB4REIgKi8KKwkweERFLCAweEJDLCAweENCLCAweDg3LCAweENCLCAweDg4LCAweENCLCAweDg5LCAvKiAweERDLTB4REYgKi8KKwkweENCLCAweDhBLCAweENCLCAweDhCLCAweENCLCAweDhDLCAweENCLCAweDhELCAvKiAweEUwLTB4RTMgKi8KKwkweENDLCAweEQ5LCAweENCLCAweDhFLCAweENCLCAweDhGLCAweENCLCAweDkwLCAvKiAweEU0LTB4RTcgKi8KKwkweENCLCAweDkxLCAweEI3LCAweEFBLCAweENCLCAweDkyLCAweENCLCAweDkzLCAvKiAweEU4LTB4RUIgKi8KKwkweENCLCAweDk0LCAweENCLCAweDk1LCAweENCLCAweDk2LCAweENCLCAweDk3LCAvKiAweEVDLTB4RUYgKi8KKwkweENCLCAweDk4LCAweENCLCAweDk5LCAweENCLCAweDlBLCAweENCLCAweDlCLCAvKiAweEYwLTB4RjMgKi8KKwkweENCLCAweDlDLCAweENCLCAweDlELCAweENCLCAweDlFLCAweENCLCAweDlGLCAvKiAweEY0LTB4RjcgKi8KKwkweENCLCAweEEwLCAweENDLCAweDQwLCAweENDLCAweDQxLCAweEQ0LCAweEU1LCAvKiAweEY4LTB4RkIgKi8KKwkweENDLCAweDQyLCAweENDLCAweDQzLCAweENDLCAweDQ0LCAweERFLCAweEJELCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184Nls1MTJdID0geworCTB4Q0MsIDB4NDUsIDB4Q0MsIDB4NDYsIDB4Q0MsIDB4NDcsIDB4Q0MsIDB4NDgsIC8qIDB4MDAtMHgwMyAqLworCTB4Q0MsIDB4NDksIDB4REUsIDB4QkYsIDB4Q0MsIDB4NEEsIDB4Q0MsIDB4NEIsIC8qIDB4MDQtMHgwNyAqLworCTB4Q0MsIDB4NEMsIDB4Q0MsIDB4NEQsIDB4Q0MsIDB4NEUsIDB4Q0MsIDB4NEYsIC8qIDB4MDgtMHgwQiAqLworCTB4Q0MsIDB4NTAsIDB4Q0MsIDB4NTEsIDB4Q0MsIDB4NTIsIDB4Q0MsIDB4NTMsIC8qIDB4MEMtMHgwRiAqLworCTB4Q0MsIDB4NTQsIDB4QzQsIDB4QTIsIDB4Q0MsIDB4NTUsIDB4Q0MsIDB4NTYsIC8qIDB4MTAtMHgxMyAqLworCTB4Q0MsIDB4NTcsIDB4Q0MsIDB4NTgsIDB4REUsIDB4QzEsIDB4Q0MsIDB4NTksIC8qIDB4MTQtMHgxNyAqLworCTB4Q0MsIDB4NUEsIDB4Q0MsIDB4NUIsIDB4Q0MsIDB4NUMsIDB4Q0MsIDB4NUQsIC8qIDB4MTgtMHgxQiAqLworCTB4Q0MsIDB4NUUsIDB4Q0MsIDB4NUYsIDB4Q0MsIDB4NjAsIDB4Q0MsIDB4NjEsIC8qIDB4MUMtMHgxRiAqLworCTB4Q0MsIDB4NjIsIDB4Q0MsIDB4NjMsIDB4Q0MsIDB4NjQsIDB4Q0MsIDB4NjUsIC8qIDB4MjAtMHgyMyAqLworCTB4Q0MsIDB4NjYsIDB4Q0MsIDB4NjcsIDB4Q0MsIDB4NjgsIDB4REUsIDB4QkUsIC8qIDB4MjQtMHgyNyAqLworCTB4Q0MsIDB4NjksIDB4REUsIDB4QzAsIDB4Q0MsIDB4NkEsIDB4Q0MsIDB4NkIsIC8qIDB4MjgtMHgyQiAqLworCTB4Q0MsIDB4NkMsIDB4Q0MsIDB4NkQsIDB4Q0MsIDB4NkUsIDB4Q0MsIDB4NkYsIC8qIDB4MkMtMHgyRiAqLworCTB4Q0MsIDB4NzAsIDB4Q0MsIDB4NzEsIDB4Q0MsIDB4NzIsIDB4Q0MsIDB4NzMsIC8qIDB4MzAtMHgzMyAqLworCTB4Q0MsIDB4NzQsIDB4Q0MsIDB4NzUsIDB4Q0MsIDB4NzYsIDB4Q0MsIDB4NzcsIC8qIDB4MzQtMHgzNyAqLworCTB4RDUsIDB4QkEsIDB4Q0MsIDB4NzgsIDB4Q0MsIDB4NzksIDB4Q0MsIDB4N0EsIC8qIDB4MzgtMHgzQiAqLworCTB4REUsIDB4QzIsIDB4Q0MsIDB4N0IsIDB4Q0MsIDB4N0MsIDB4Q0MsIDB4N0QsIC8qIDB4M0MtMHgzRiAqLworCTB4Q0MsIDB4N0UsIDB4Q0MsIDB4ODAsIDB4Q0MsIDB4ODEsIDB4Q0MsIDB4ODIsIC8qIDB4NDAtMHg0MyAqLworCTB4Q0MsIDB4ODMsIDB4Q0MsIDB4ODQsIDB4Q0MsIDB4ODUsIDB4Q0MsIDB4ODYsIC8qIDB4NDQtMHg0NyAqLworCTB4Q0MsIDB4ODcsIDB4Q0MsIDB4ODgsIDB4Q0MsIDB4ODksIDB4Q0MsIDB4OEEsIC8qIDB4NDgtMHg0QiAqLworCTB4Q0MsIDB4OEIsIDB4RjIsIDB4QUUsIDB4QkIsIDB4QTIsIDB4QzIsIDB4QjIsIC8qIDB4NEMtMHg0RiAqLworCTB4QzUsIDB4QjAsIDB4QzIsIDB4QzcsIDB4Q0MsIDB4OEMsIDB4Q0MsIDB4OEQsIC8qIDB4NTAtMHg1MyAqLworCTB4RjIsIDB4QUYsIDB4Q0MsIDB4OEUsIDB4Q0MsIDB4OEYsIDB4Q0MsIDB4OTAsIC8qIDB4NTQtMHg1NyAqLworCTB4Q0MsIDB4OTEsIDB4Q0MsIDB4OTIsIDB4RDAsIDB4RTksIDB4Q0MsIDB4OTMsIC8qIDB4NTgtMHg1QiAqLworCTB4Q0MsIDB4OTQsIDB4Q0MsIDB4OTUsIDB4RDMsIDB4REQsIDB4Q0MsIDB4OTYsIC8qIDB4NUMtMHg1RiAqLworCTB4Q0MsIDB4OTcsIDB4Q0MsIDB4OTgsIDB4RUIsIDB4QkQsIDB4Q0MsIDB4OTksIC8qIDB4NjAtMHg2MyAqLworCTB4Q0MsIDB4OUEsIDB4Q0MsIDB4OUIsIDB4Q0MsIDB4OUMsIDB4Q0MsIDB4OUQsIC8qIDB4NjQtMHg2NyAqLworCTB4Q0MsIDB4OUUsIDB4Q0MsIDB4OUYsIDB4Q0MsIDB4QTAsIDB4QjMsIDB4RTYsIC8qIDB4NjgtMHg2QiAqLworCTB4RjIsIDB4QjAsIDB4Q0QsIDB4NDAsIDB4RjIsIDB4QjEsIDB4Q0QsIDB4NDEsIC8qIDB4NkMtMHg2RiAqLworCTB4Q0QsIDB4NDIsIDB4Q0EsIDB4QUQsIDB4Q0QsIDB4NDMsIDB4Q0QsIDB4NDQsIC8qIDB4NzAtMHg3MyAqLworCTB4Q0QsIDB4NDUsIDB4Q0QsIDB4NDYsIDB4Q0QsIDB4NDcsIDB4Q0QsIDB4NDgsIC8qIDB4NzQtMHg3NyAqLworCTB4Q0QsIDB4NDksIDB4QkEsIDB4RTcsIDB4RjIsIDB4QjMsIDB4RjIsIDB4QjUsIC8qIDB4NzgtMHg3QiAqLworCTB4RjIsIDB4QjQsIDB4Q0IsIDB4RTQsIDB4Q0YsIDB4QkEsIDB4RjIsIDB4QjIsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4Q0EsIDB4QjQsIDB4RDIsIDB4Q0YsIDB4QzIsIDB4RUMsIDB4Q0QsIDB4NEEsIC8qIDB4ODAtMHg4MyAqLworCTB4Q0QsIDB4NEIsIDB4Q0QsIDB4NEMsIDB4Q0QsIDB4NEQsIDB4Q0QsIDB4NEUsIC8qIDB4ODQtMHg4NyAqLworCTB4Q0QsIDB4NEYsIDB4Q0QsIDB4NTAsIDB4Q0UsIDB4QzMsIDB4RjIsIDB4QjgsIC8qIDB4ODgtMHg4QiAqLworCTB4QjAsIDB4RjYsIDB4RjIsIDB4QjcsIDB4Q0QsIDB4NTEsIDB4Q0QsIDB4NTIsIC8qIDB4OEMtMHg4RiAqLworCTB4Q0QsIDB4NTMsIDB4Q0QsIDB4NTQsIDB4Q0QsIDB4NTUsIDB4RjIsIDB4QkUsIC8qIDB4OTAtMHg5MyAqLworCTB4Q0QsIDB4NTYsIDB4QjIsIDB4Q0YsIDB4Q0QsIDB4NTcsIDB4Q0QsIDB4NTgsIC8qIDB4OTQtMHg5NyAqLworCTB4Q0QsIDB4NTksIDB4Q0QsIDB4NUEsIDB4Q0QsIDB4NUIsIDB4Q0QsIDB4NUMsIC8qIDB4OTgtMHg5QiAqLworCTB4RDEsIDB4QzEsIDB4RjIsIDB4QkEsIDB4Q0QsIDB4NUQsIDB4Q0QsIDB4NUUsIC8qIDB4OUMtMHg5RiAqLworCTB4Q0QsIDB4NUYsIDB4Q0QsIDB4NjAsIDB4Q0QsIDB4NjEsIDB4RjIsIDB4QkMsIC8qIDB4QTAtMHhBMyAqLworCTB4RDQsIDB4RTksIDB4Q0QsIDB4NjIsIDB4Q0QsIDB4NjMsIDB4RjIsIDB4QkIsIC8qIDB4QTQtMHhBNyAqLworCTB4RjIsIDB4QjYsIDB4RjIsIDB4QkYsIDB4RjIsIDB4QkQsIDB4Q0QsIDB4NjQsIC8qIDB4QTgtMHhBQiAqLworCTB4RjIsIDB4QjksIDB4Q0QsIDB4NjUsIDB4Q0QsIDB4NjYsIDB4RjIsIDB4QzcsIC8qIDB4QUMtMHhBRiAqLworCTB4RjIsIDB4QzQsIDB4RjIsIDB4QzYsIDB4Q0QsIDB4NjcsIDB4Q0QsIDB4NjgsIC8qIDB4QjAtMHhCMyAqLworCTB4RjIsIDB4Q0EsIDB4RjIsIDB4QzIsIDB4RjIsIDB4QzAsIDB4Q0QsIDB4NjksIC8qIDB4QjQtMHhCNyAqLworCTB4Q0QsIDB4NkEsIDB4Q0QsIDB4NkIsIDB4RjIsIDB4QzUsIDB4Q0QsIDB4NkMsIC8qIDB4QjgtMHhCQiAqLworCTB4Q0QsIDB4NkQsIDB4Q0QsIDB4NkUsIDB4Q0QsIDB4NkYsIDB4Q0QsIDB4NzAsIC8qIDB4QkMtMHhCRiAqLworCTB4RDYsIDB4RkIsIDB4Q0QsIDB4NzEsIDB4Q0QsIDB4NzIsIDB4Q0QsIDB4NzMsIC8qIDB4QzAtMHhDMyAqLworCTB4RjIsIDB4QzEsIDB4Q0QsIDB4NzQsIDB4QzcsIDB4RjksIDB4QzksIDB4REYsIC8qIDB4QzQtMHhDNyAqLworCTB4Q0QsIDB4NzUsIDB4RjIsIDB4QzgsIDB4QjksIDB4QzYsIDB4QjUsIDB4QjAsIC8qIDB4QzgtMHhDQiAqLworCTB4Q0QsIDB4NzYsIDB4Q0QsIDB4NzcsIDB4RjIsIDB4QzMsIDB4RjIsIDB4QzksIC8qIDB4Q0MtMHhDRiAqLworCTB4RjIsIDB4RDAsIDB4RjIsIDB4RDYsIDB4Q0QsIDB4NzgsIDB4Q0QsIDB4NzksIC8qIDB4RDAtMHhEMyAqLworCTB4QkIsIDB4RDcsIDB4Q0QsIDB4N0EsIDB4Q0QsIDB4N0IsIDB4Q0QsIDB4N0MsIC8qIDB4RDQtMHhENyAqLworCTB4RjIsIDB4RDUsIDB4Q0QsIDB4REMsIDB4Q0QsIDB4N0QsIDB4RDYsIDB4RUIsIC8qIDB4RDgtMHhEQiAqLworCTB4Q0QsIDB4N0UsIDB4Q0QsIDB4ODAsIDB4RjIsIDB4RDIsIDB4RjIsIDB4RDQsIC8qIDB4REMtMHhERiAqLworCTB4Q0QsIDB4ODEsIDB4Q0QsIDB4ODIsIDB4Q0QsIDB4ODMsIDB4Q0QsIDB4ODQsIC8qIDB4RTAtMHhFMyAqLworCTB4QjgsIDB4RjIsIDB4Q0QsIDB4ODUsIDB4Q0QsIDB4ODYsIDB4Q0QsIDB4ODcsIC8qIDB4RTQtMHhFNyAqLworCTB4Q0QsIDB4ODgsIDB4RjIsIDB4Q0IsIDB4Q0QsIDB4ODksIDB4Q0QsIDB4OEEsIC8qIDB4RTgtMHhFQiAqLworCTB4Q0QsIDB4OEIsIDB4RjIsIDB4Q0UsIDB4QzIsIDB4RjksIDB4Q0QsIDB4OEMsIC8qIDB4RUMtMHhFRiAqLworCTB4RDUsIDB4REQsIDB4RjIsIDB4Q0MsIDB4RjIsIDB4Q0QsIDB4RjIsIDB4Q0YsIC8qIDB4RjAtMHhGMyAqLworCTB4RjIsIDB4RDMsIDB4Q0QsIDB4OEQsIDB4Q0QsIDB4OEUsIDB4Q0QsIDB4OEYsIC8qIDB4RjQtMHhGNyAqLworCTB4RjIsIDB4RDksIDB4RDMsIDB4QkMsIDB4Q0QsIDB4OTAsIDB4Q0QsIDB4OTEsIC8qIDB4RjgtMHhGQiAqLworCTB4Q0QsIDB4OTIsIDB4Q0QsIDB4OTMsIDB4QjYsIDB4RUEsIDB4Q0QsIDB4OTQsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzg3WzUxMl0gPSB7CisJMHhDQSwgMHhGMSwgMHhDRCwgMHg5NSwgMHhCNywgMHhFNCwgMHhGMiwgMHhENywgLyogMHgwMC0weDAzICovCisJMHhDRCwgMHg5NiwgMHhDRCwgMHg5NywgMHhDRCwgMHg5OCwgMHhGMiwgMHhEOCwgLyogMHgwNC0weDA3ICovCisJMHhGMiwgMHhEQSwgMHhGMiwgMHhERCwgMHhGMiwgMHhEQiwgMHhDRCwgMHg5OSwgLyogMHgwOC0weDBCICovCisJMHhDRCwgMHg5QSwgMHhGMiwgMHhEQywgMHhDRCwgMHg5QiwgMHhDRCwgMHg5QywgLyogMHgwQy0weDBGICovCisJMHhDRCwgMHg5RCwgMHhDRCwgMHg5RSwgMHhEMSwgMHhEMSwgMHhGMiwgMHhEMSwgLyogMHgxMC0weDEzICovCisJMHhDRCwgMHg5RiwgMHhDRCwgMHhDOSwgMHhDRCwgMHhBMCwgMHhDRSwgMHhDRiwgLyogMHgxNC0weDE3ICovCisJMHhENiwgMHhBOSwgMHhDRSwgMHg0MCwgMHhGMiwgMHhFMywgMHhDRSwgMHg0MSwgLyogMHgxOC0weDFCICovCisJMHhDMywgMHhEQiwgMHhDRSwgMHg0MiwgMHhGMiwgMHhFMCwgMHhDRSwgMHg0MywgLyogMHgxQy0weDFGICovCisJMHhDRSwgMHg0NCwgMHhDMCwgMHhBRiwgMHhGMiwgMHhFQywgMHhGMiwgMHhERSwgLyogMHgyMC0weDIzICovCisJMHhDRSwgMHg0NSwgMHhGMiwgMHhFMSwgMHhDRSwgMHg0NiwgMHhDRSwgMHg0NywgLyogMHgyNC0weDI3ICovCisJMHhDRSwgMHg0OCwgMHhGMiwgMHhFOCwgMHhDRSwgMHg0OSwgMHhDRSwgMHg0QSwgLyogMHgyOC0weDJCICovCisJMHhDRSwgMHg0QiwgMHhDRSwgMHg0QywgMHhGMiwgMHhFMiwgMHhDRSwgMHg0RCwgLyogMHgyQy0weDJGICovCisJMHhDRSwgMHg0RSwgMHhGMiwgMHhFNywgMHhDRSwgMHg0RiwgMHhDRSwgMHg1MCwgLyogMHgzMC0weDMzICovCisJMHhGMiwgMHhFNiwgMHhDRSwgMHg1MSwgMHhDRSwgMHg1MiwgMHhGMiwgMHhFOSwgLyogMHgzNC0weDM3ICovCisJMHhDRSwgMHg1MywgMHhDRSwgMHg1NCwgMHhDRSwgMHg1NSwgMHhGMiwgMHhERiwgLyogMHgzOC0weDNCICovCisJMHhDRSwgMHg1NiwgMHhDRSwgMHg1NywgMHhGMiwgMHhFNCwgMHhGMiwgMHhFQSwgLyogMHgzQy0weDNGICovCisJMHhDRSwgMHg1OCwgMHhDRSwgMHg1OSwgMHhDRSwgMHg1QSwgMHhDRSwgMHg1QiwgLyogMHg0MC0weDQzICovCisJMHhDRSwgMHg1QywgMHhDRSwgMHg1RCwgMHhDRSwgMHg1RSwgMHhEMywgMHhBQywgLyogMHg0NC0weDQ3ICovCisJMHhGMiwgMHhFNSwgMHhCMiwgMHhGNSwgMHhDRSwgMHg1RiwgMHhDRSwgMHg2MCwgLyogMHg0OC0weDRCICovCisJMHhGMiwgMHhGMiwgMHhDRSwgMHg2MSwgMHhEMCwgMHhBQiwgMHhDRSwgMHg2MiwgLyogMHg0Qy0weDRGICovCisJMHhDRSwgMHg2MywgMHhDRSwgMHg2NCwgMHhDRSwgMHg2NSwgMHhGMiwgMHhGNSwgLyogMHg1MC0weDUzICovCisJMHhDRSwgMHg2NiwgMHhDRSwgMHg2NywgMHhDRSwgMHg2OCwgMHhCQiwgMHhDOCwgLyogMHg1NC0weDU3ICovCisJMHhDRSwgMHg2OSwgMHhGMiwgMHhGOSwgMHhDRSwgMHg2QSwgMHhDRSwgMHg2QiwgLyogMHg1OC0weDVCICovCisJMHhDRSwgMHg2QywgMHhDRSwgMHg2RCwgMHhDRSwgMHg2RSwgMHhDRSwgMHg2RiwgLyogMHg1Qy0weDVGICovCisJMHhGMiwgMHhGMCwgMHhDRSwgMHg3MCwgMHhDRSwgMHg3MSwgMHhGMiwgMHhGNiwgLyogMHg2MC0weDYzICovCisJMHhGMiwgMHhGOCwgMHhGMiwgMHhGQSwgMHhDRSwgMHg3MiwgMHhDRSwgMHg3MywgLyogMHg2NC0weDY3ICovCisJMHhDRSwgMHg3NCwgMHhDRSwgMHg3NSwgMHhDRSwgMHg3NiwgMHhDRSwgMHg3NywgLyogMHg2OC0weDZCICovCisJMHhDRSwgMHg3OCwgMHhDRSwgMHg3OSwgMHhGMiwgMHhGMywgMHhDRSwgMHg3QSwgLyogMHg2Qy0weDZGICovCisJMHhGMiwgMHhGMSwgMHhDRSwgMHg3QiwgMHhDRSwgMHg3QywgMHhDRSwgMHg3RCwgLyogMHg3MC0weDczICovCisJMHhCQSwgMHhGQiwgMHhDRSwgMHg3RSwgMHhCNSwgMHhGQiwgMHhDRSwgMHg4MCwgLyogMHg3NC0weDc3ICovCisJMHhDRSwgMHg4MSwgMHhDRSwgMHg4MiwgMHhDRSwgMHg4MywgMHhGMiwgMHhFRiwgLyogMHg3OC0weDdCICovCisJMHhGMiwgMHhGNywgMHhGMiwgMHhFRCwgMHhGMiwgMHhFRSwgMHhDRSwgMHg4NCwgLyogMHg3Qy0weDdGICovCisJCisJMHhDRSwgMHg4NSwgMHhDRSwgMHg4NiwgMHhGMiwgMHhFQiwgMHhGMywgMHhBNiwgLyogMHg4MC0weDgzICovCisJMHhDRSwgMHg4NywgMHhGMywgMHhBMywgMHhDRSwgMHg4OCwgMHhDRSwgMHg4OSwgLyogMHg4NC0weDg3ICovCisJMHhGMywgMHhBMiwgMHhDRSwgMHg4QSwgMHhDRSwgMHg4QiwgMHhGMiwgMHhGNCwgLyogMHg4OC0weDhCICovCisJMHhDRSwgMHg4QywgMHhDOCwgMHhEQSwgMHhDRSwgMHg4RCwgMHhDRSwgMHg4RSwgLyogMHg4Qy0weDhGICovCisJMHhDRSwgMHg4RiwgMHhDRSwgMHg5MCwgMHhDRSwgMHg5MSwgMHhGMiwgMHhGQiwgLyogMHg5MC0weDkzICovCisJMHhDRSwgMHg5MiwgMHhDRSwgMHg5MywgMHhDRSwgMHg5NCwgMHhGMywgMHhBNSwgLyogMHg5NC0weDk3ICovCisJMHhDRSwgMHg5NSwgMHhDRSwgMHg5NiwgMHhDRSwgMHg5NywgMHhDRSwgMHg5OCwgLyogMHg5OC0weDlCICovCisJMHhDRSwgMHg5OSwgMHhDRSwgMHg5QSwgMHhDRSwgMHg5QiwgMHhDMywgMHhGOCwgLyogMHg5Qy0weDlGICovCisJMHhDRSwgMHg5QywgMHhDRSwgMHg5RCwgMHhDRSwgMHg5RSwgMHhDRSwgMHg5RiwgLyogMHhBMC0weEEzICovCisJMHhDRSwgMHhBMCwgMHhDRiwgMHg0MCwgMHhDRiwgMHg0MSwgMHhDRiwgMHg0MiwgLyogMHhBNC0weEE3ICovCisJMHhGMiwgMHhGRCwgMHhDRiwgMHg0MywgMHhDRiwgMHg0NCwgMHhGMywgMHhBNywgLyogMHhBOC0weEFCICovCisJMHhGMywgMHhBOSwgMHhGMywgMHhBNCwgMHhDRiwgMHg0NSwgMHhGMiwgMHhGQywgLyogMHhBQy0weEFGICovCisJMHhDRiwgMHg0NiwgMHhDRiwgMHg0NywgMHhDRiwgMHg0OCwgMHhGMywgMHhBQiwgLyogMHhCMC0weEIzICovCisJMHhDRiwgMHg0OSwgMHhGMywgMHhBQSwgMHhDRiwgMHg0QSwgMHhDRiwgMHg0QiwgLyogMHhCNC0weEI3ICovCisJMHhDRiwgMHg0QywgMHhDRiwgMHg0RCwgMHhDMiwgMHhERCwgMHhDRiwgMHg0RSwgLyogMHhCOC0weEJCICovCisJMHhDRiwgMHg0RiwgMHhGMywgMHhBRSwgMHhDRiwgMHg1MCwgMHhDRiwgMHg1MSwgLyogMHhCQy0weEJGICovCisJMHhGMywgMHhCMCwgMHhDRiwgMHg1MiwgMHhDRiwgMHg1MywgMHhDRiwgMHg1NCwgLyogMHhDMC0weEMzICovCisJMHhDRiwgMHg1NSwgMHhDRiwgMHg1NiwgMHhGMywgMHhBMSwgMHhDRiwgMHg1NywgLyogMHhDNC0weEM3ICovCisJMHhDRiwgMHg1OCwgMHhDRiwgMHg1OSwgMHhGMywgMHhCMSwgMHhGMywgMHhBQywgLyogMHhDOC0weENCICovCisJMHhDRiwgMHg1QSwgMHhDRiwgMHg1QiwgMHhDRiwgMHg1QywgMHhDRiwgMHg1RCwgLyogMHhDQy0weENGICovCisJMHhDRiwgMHg1RSwgMHhGMywgMHhBRiwgMHhGMiwgMHhGRSwgMHhGMywgMHhBRCwgLyogMHhEMC0weEQzICovCisJMHhDRiwgMHg1RiwgMHhDRiwgMHg2MCwgMHhDRiwgMHg2MSwgMHhDRiwgMHg2MiwgLyogMHhENC0weEQ3ICovCisJMHhDRiwgMHg2MywgMHhDRiwgMHg2NCwgMHhDRiwgMHg2NSwgMHhGMywgMHhCMiwgLyogMHhEOC0weERCICovCisJMHhDRiwgMHg2NiwgMHhDRiwgMHg2NywgMHhDRiwgMHg2OCwgMHhDRiwgMHg2OSwgLyogMHhEQy0weERGICovCisJMHhGMywgMHhCNCwgMHhDRiwgMHg2QSwgMHhDRiwgMHg2QiwgMHhDRiwgMHg2QywgLyogMHhFMC0weEUzICovCisJMHhDRiwgMHg2RCwgMHhGMywgMHhBOCwgMHhDRiwgMHg2RSwgMHhDRiwgMHg2RiwgLyogMHhFNC0weEU3ICovCisJMHhDRiwgMHg3MCwgMHhDRiwgMHg3MSwgMHhGMywgMHhCMywgMHhDRiwgMHg3MiwgLyogMHhFOC0weEVCICovCisJMHhDRiwgMHg3MywgMHhDRiwgMHg3NCwgMHhGMywgMHhCNSwgMHhDRiwgMHg3NSwgLyogMHhFQy0weEVGICovCisJMHhDRiwgMHg3NiwgMHhDRiwgMHg3NywgMHhDRiwgMHg3OCwgMHhDRiwgMHg3OSwgLyogMHhGMC0weEYzICovCisJMHhDRiwgMHg3QSwgMHhDRiwgMHg3QiwgMHhDRiwgMHg3QywgMHhDRiwgMHg3RCwgLyogMHhGNC0weEY3ICovCisJMHhDRiwgMHg3RSwgMHhEMCwgMHhCNywgMHhDRiwgMHg4MCwgMHhDRiwgMHg4MSwgLyogMHhGOC0weEZCICovCisJMHhDRiwgMHg4MiwgMHhDRiwgMHg4MywgMHhGMywgMHhCOCwgMHhDRiwgMHg4NCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfODhbNTEyXSA9IHsKKwkweENGLCAweDg1LCAweENGLCAweDg2LCAweENGLCAweDg3LCAweEQ5LCAweEY5LCAvKiAweDAwLTB4MDMgKi8KKwkweENGLCAweDg4LCAweENGLCAweDg5LCAweENGLCAweDhBLCAweENGLCAweDhCLCAvKiAweDA0LTB4MDcgKi8KKwkweENGLCAweDhDLCAweENGLCAweDhELCAweEYzLCAweEI5LCAweENGLCAweDhFLCAvKiAweDA4LTB4MEIgKi8KKwkweENGLCAweDhGLCAweENGLCAweDkwLCAweENGLCAweDkxLCAweENGLCAweDkyLCAvKiAweDBDLTB4MEYgKi8KKwkweENGLCAweDkzLCAweENGLCAweDk0LCAweENGLCAweDk1LCAweEYzLCAweEI3LCAvKiAweDEwLTB4MTMgKi8KKwkweENGLCAweDk2LCAweEM4LCAweEU0LCAweEYzLCAweEI2LCAweENGLCAweDk3LCAvKiAweDE0LTB4MTcgKi8KKwkweENGLCAweDk4LCAweENGLCAweDk5LCAweENGLCAweDlBLCAweEYzLCAweEJBLCAvKiAweDE4LTB4MUIgKi8KKwkweENGLCAweDlCLCAweENGLCAweDlDLCAweENGLCAweDlELCAweENGLCAweDlFLCAvKiAweDFDLTB4MUYgKi8KKwkweENGLCAweDlGLCAweEYzLCAweEJCLCAweEI0LCAweEMwLCAweENGLCAweEEwLCAvKiAweDIwLTB4MjMgKi8KKwkweEQwLCAweDQwLCAweEQwLCAweDQxLCAweEQwLCAweDQyLCAweEQwLCAweDQzLCAvKiAweDI0LTB4MjcgKi8KKwkweEQwLCAweDQ0LCAweEQwLCAweDQ1LCAweEQwLCAweDQ2LCAweEQwLCAweDQ3LCAvKiAweDI4LTB4MkIgKi8KKwkweEQwLCAweDQ4LCAweEQwLCAweDQ5LCAweEQwLCAweDRBLCAweEQwLCAweDRCLCAvKiAweDJDLTB4MkYgKi8KKwkweEQwLCAweDRDLCAweEQwLCAweDRELCAweEVFLCAweEMzLCAweEQwLCAweDRFLCAvKiAweDMwLTB4MzMgKi8KKwkweEQwLCAweDRGLCAweEQwLCAweDUwLCAweEQwLCAweDUxLCAweEQwLCAweDUyLCAvKiAweDM0LTB4MzcgKi8KKwkweEQwLCAweDUzLCAweEYzLCAweEJDLCAweEQwLCAweDU0LCAweEQwLCAweDU1LCAvKiAweDM4LTB4M0IgKi8KKwkweEYzLCAweEJELCAweEQwLCAweDU2LCAweEQwLCAweDU3LCAweEQwLCAweDU4LCAvKiAweDNDLTB4M0YgKi8KKwkweEQxLCAweEFBLCAweEQwLCAweDU5LCAweEQwLCAweDVBLCAweEQwLCAweDVCLCAvKiAweDQwLTB4NDMgKi8KKwkweEY0LCAweEFDLCAweEQwLCAweEM2LCAweEQwLCAweDVDLCAweEQwLCAweDVELCAvKiAweDQ0LTB4NDcgKi8KKwkweEQwLCAweDVFLCAweEQwLCAweDVGLCAweEQwLCAweDYwLCAweEQwLCAweDYxLCAvKiAweDQ4LTB4NEIgKi8KKwkweEQwLCAweEQwLCAweEQxLCAweERDLCAweEQwLCAweDYyLCAweEQwLCAweDYzLCAvKiAweDRDLTB4NEYgKi8KKwkweEQwLCAweDY0LCAweEQwLCAweDY1LCAweEQwLCAweDY2LCAweEQwLCAweDY3LCAvKiAweDUwLTB4NTMgKi8KKwkweENGLCAweENFLCAweEQwLCAweDY4LCAweEQwLCAweDY5LCAweEJELCAweEQ2LCAvKiAweDU0LTB4NTcgKi8KKwkweEQwLCAweDZBLCAweEQxLCAweEMzLCAweEQwLCAweDZCLCAweEQwLCAweDZDLCAvKiAweDU4LTB4NUIgKi8KKwkweEQwLCAweDZELCAweEQwLCAweDZFLCAweEQwLCAweDZGLCAweEQwLCAweDcwLCAvKiAweDVDLTB4NUYgKi8KKwkweEQwLCAweDcxLCAweEJBLCAweEUyLCAweEUxLCAweEU5LCAweEQyLCAweEMyLCAvKiAweDYwLTB4NjMgKi8KKwkweEYxLCAweEMyLCAweEIyLCAweEI5LCAweEQwLCAweDcyLCAweEQwLCAweDczLCAvKiAweDY0LTB4NjcgKi8KKwkweEIxLCAweEVELCAweEYxLCAweEMzLCAweEQwLCAweDc0LCAweEM5LCAweEMwLCAvKiAweDY4LTB4NkIgKi8KKwkweEIzLCAweEM0LCAweEQwLCAweDc1LCAweEQ5LCAweEYyLCAweEQwLCAweDc2LCAvKiAweDZDLTB4NkYgKi8KKwkweENCLCAweEE1LCAweEQwLCAweDc3LCAweEYxLCAweEM0LCAweEQwLCAweDc4LCAvKiAweDcwLTB4NzMgKi8KKwkweEQwLCAweDc5LCAweEQwLCAweDdBLCAweEQwLCAweDdCLCAweEQ2LCAweEQ0LCAvKiAweDc0LTB4NzcgKi8KKwkweEQwLCAweDdDLCAweEQwLCAweDdELCAweEQwLCAweDdFLCAweEQwLCAweDgwLCAvKiAweDc4LTB4N0IgKi8KKwkweEQwLCAweDgxLCAweEYxLCAweEM1LCAweEY0LCAweEMwLCAweEYxLCAweEM2LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEQwLCAweDgyLCAweEQ0LCAweEFDLCAweEYxLCAweEM3LCAweEQwLCAweDgzLCAvKiAweDgwLTB4ODMgKi8KKwkweEIwLCAweEMwLCAweEY0LCAweEMxLCAweEQwLCAweDg0LCAweEQwLCAweDg1LCAvKiAweDg0LTB4ODcgKi8KKwkweEY0LCAweEMyLCAweEQwLCAweDg2LCAweEQwLCAweDg3LCAweEI0LCAweEZDLCAvKiAweDg4LTB4OEIgKi8KKwkweEQwLCAweDg4LCAweEM1LCAweERCLCAweEQwLCAweDg5LCAweEQwLCAweDhBLCAvKiAweDhDLTB4OEYgKi8KKwkweEQwLCAweDhCLCAweEQwLCAweDhDLCAweENDLCAweEJCLCAweEQwLCAweDhELCAvKiAweDkwLTB4OTMgKi8KKwkweEQwLCAweDhFLCAweEQwLCAweDhGLCAweEQwLCAweEU0LCAweEQwLCAweDkwLCAvKiAweDk0LTB4OTcgKi8KKwkweEQwLCAweDkxLCAweEQwLCAweDkyLCAweEQwLCAweDkzLCAweEQwLCAweDk0LCAvKiAweDk4LTB4OUIgKi8KKwkweENELCAweEUwLCAweEQwLCAweDk1LCAweEQwLCAweDk2LCAweEQwLCAweDk3LCAvKiAweDlDLTB4OUYgKi8KKwkweEQwLCAweDk4LCAweEQwLCAweDk5LCAweEYxLCAweEM4LCAweEQwLCAweDlBLCAvKiAweEEwLTB4QTMgKi8KKwkweEQ5LCAweEYzLCAweEQwLCAweDlCLCAweEQwLCAweDlDLCAweEQwLCAweDlELCAvKiAweEE0LTB4QTcgKi8KKwkweEQwLCAweDlFLCAweEQwLCAweDlGLCAweEQwLCAweEEwLCAweEIxLCAweEJCLCAvKiAweEE4LTB4QUIgKi8KKwkweEQxLCAweDQwLCAweENGLCAweEFFLCAweEQxLCAweDQxLCAweEQxLCAweDQyLCAvKiAweEFDLTB4QUYgKi8KKwkweEQxLCAweDQzLCAweEI4LCAweEE0LCAweEQxLCAweDQ0LCAweEQxLCAweDQ1LCAvKiAweEIwLTB4QjMgKi8KKwkweEQxLCAweDQ2LCAweEQxLCAweDQ3LCAweEQxLCAweDQ4LCAweEYxLCAweENBLCAvKiAweEI0LTB4QjcgKi8KKwkweEQxLCAweDQ5LCAweEQxLCAweDRBLCAweEQxLCAweDRCLCAweEQxLCAweDRDLCAvKiAweEI4LTB4QkIgKi8KKwkweEYxLCAweENCLCAweEQxLCAweDRELCAweEQxLCAweDRFLCAweEQxLCAweDRGLCAvKiAweEJDLTB4QkYgKi8KKwkweEQxLCAweDUwLCAweEIyLCAweEMzLCAweEMxLCAweEQxLCAweEQxLCAweDUxLCAvKiAweEMwLTB4QzMgKi8KKwkweEQxLCAweDUyLCAweEQ3LCAweEIwLCAweEYxLCAweEM5LCAweEQxLCAweDUzLCAvKiAweEM0LTB4QzcgKi8KKwkweEQxLCAweDU0LCAweEYxLCAweENDLCAweEQxLCAweDU1LCAweEQxLCAweDU2LCAvKiAweEM4LTB4Q0IgKi8KKwkweEQxLCAweDU3LCAweEQxLCAweDU4LCAweEYxLCAweENFLCAweEQxLCAweDU5LCAvKiAweENDLTB4Q0YgKi8KKwkweEQxLCAweDVBLCAweEQxLCAweDVCLCAweEQ5LCAweEY2LCAweEQxLCAweDVDLCAvKiAweEQwLTB4RDMgKi8KKwkweEQyLCAweEUxLCAweEQ0LCAweEEzLCAweEQxLCAweDVELCAweEQxLCAweDVFLCAvKiAweEQ0LTB4RDcgKi8KKwkweEY0LCAweEMzLCAweEM4LCAweEI5LCAweEQxLCAweDVGLCAweEQxLCAweDYwLCAvKiAweEQ4LTB4REIgKi8KKwkweEQxLCAweDYxLCAweEQxLCAweDYyLCAweEQxLCAweDYzLCAweEY0LCAweEM0LCAvKiAweERDLTB4REYgKi8KKwkweEQxLCAweDY0LCAweEQxLCAweDY1LCAweEYxLCAweENELCAweEYxLCAweENGLCAvKiAweEUwLTB4RTMgKi8KKwkweEJGLCAweEUzLCAweEYxLCAweEQwLCAweEQxLCAweDY2LCAweEQxLCAweDY3LCAvKiAweEU0LTB4RTcgKi8KKwkweEYxLCAweEQ0LCAweEQxLCAweDY4LCAweEQxLCAweDY5LCAweEQxLCAweDZBLCAvKiAweEU4LTB4RUIgKi8KKwkweEQxLCAweDZCLCAweEQxLCAweDZDLCAweEQxLCAweDZELCAweEQxLCAweDZFLCAvKiAweEVDLTB4RUYgKi8KKwkweEYxLCAweEQ2LCAweEYxLCAweEQxLCAweEQxLCAweDZGLCAweEM5LCAweEQxLCAvKiAweEYwLTB4RjMgKi8KKwkweEM1LCAweEUxLCAweEQxLCAweDcwLCAweEQxLCAweDcxLCAweEQxLCAweDcyLCAvKiAweEY0LTB4RjcgKi8KKwkweEMyLCAweEUzLCAweEI5LCAweEZDLCAweEQxLCAweDczLCAweEQxLCAweDc0LCAvKiAweEY4LTB4RkIgKi8KKwkweEYxLCAweEQzLCAweEQxLCAweDc1LCAweEYxLCAweEQ1LCAweEQxLCAweDc2LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184OVs1MTJdID0geworCTB4RDEsIDB4NzcsIDB4RDEsIDB4NzgsIDB4QjksIDB4RDMsIDB4RDEsIDB4NzksIC8qIDB4MDAtMHgwMyAqLworCTB4RDEsIDB4N0EsIDB4RDEsIDB4N0IsIDB4RDEsIDB4N0MsIDB4RDEsIDB4N0QsIC8qIDB4MDQtMHgwNyAqLworCTB4RDEsIDB4N0UsIDB4RDEsIDB4ODAsIDB4RjEsIDB4REIsIDB4RDEsIDB4ODEsIC8qIDB4MDgtMHgwQiAqLworCTB4RDEsIDB4ODIsIDB4RDEsIDB4ODMsIDB4RDEsIDB4ODQsIDB4RDEsIDB4ODUsIC8qIDB4MEMtMHgwRiAqLworCTB4QkEsIDB4RDYsIDB4RDEsIDB4ODYsIDB4QjAsIDB4RkQsIDB4RjEsIDB4RDksIC8qIDB4MTAtMHgxMyAqLworCTB4RDEsIDB4ODcsIDB4RDEsIDB4ODgsIDB4RDEsIDB4ODksIDB4RDEsIDB4OEEsIC8qIDB4MTQtMHgxNyAqLworCTB4RDEsIDB4OEIsIDB4RjEsIDB4RDgsIDB4RjEsIDB4RDIsIDB4RjEsIDB4REEsIC8qIDB4MTgtMHgxQiAqLworCTB4RDEsIDB4OEMsIDB4RDEsIDB4OEQsIDB4RDEsIDB4OEUsIDB4RDEsIDB4OEYsIC8qIDB4MUMtMHgxRiAqLworCTB4RDEsIDB4OTAsIDB4RjEsIDB4RDcsIDB4RDEsIDB4OTEsIDB4RDEsIDB4OTIsIC8qIDB4MjAtMHgyMyAqLworCTB4RDEsIDB4OTMsIDB4QzgsIDB4RUMsIDB4RDEsIDB4OTQsIDB4RDEsIDB4OTUsIC8qIDB4MjQtMHgyNyAqLworCTB4RDEsIDB4OTYsIDB4RDEsIDB4OTcsIDB4Q0QsIDB4Q0EsIDB4RjEsIDB4REQsIC8qIDB4MjgtMHgyQiAqLworCTB4RDEsIDB4OTgsIDB4RDEsIDB4OTksIDB4RDEsIDB4OUEsIDB4RDEsIDB4OUIsIC8qIDB4MkMtMHgyRiAqLworCTB4RTUsIDB4QkQsIDB4RDEsIDB4OUMsIDB4RDEsIDB4OUQsIDB4RDEsIDB4OUUsIC8qIDB4MzAtMHgzMyAqLworCTB4RjEsIDB4REMsIDB4RDEsIDB4OUYsIDB4RjEsIDB4REUsIDB4RDEsIDB4QTAsIC8qIDB4MzQtMHgzNyAqLworCTB4RDIsIDB4NDAsIDB4RDIsIDB4NDEsIDB4RDIsIDB4NDIsIDB4RDIsIDB4NDMsIC8qIDB4MzgtMHgzQiAqLworCTB4RDIsIDB4NDQsIDB4RDIsIDB4NDUsIDB4RDIsIDB4NDYsIDB4RDIsIDB4NDcsIC8qIDB4M0MtMHgzRiAqLworCTB4RDIsIDB4NDgsIDB4RjEsIDB4REYsIDB4RDIsIDB4NDksIDB4RDIsIDB4NEEsIC8qIDB4NDAtMHg0MyAqLworCTB4Q0YsIDB4RTUsIDB4RDIsIDB4NEIsIDB4RDIsIDB4NEMsIDB4RDIsIDB4NEQsIC8qIDB4NDQtMHg0NyAqLworCTB4RDIsIDB4NEUsIDB4RDIsIDB4NEYsIDB4RDIsIDB4NTAsIDB4RDIsIDB4NTEsIC8qIDB4NDgtMHg0QiAqLworCTB4RDIsIDB4NTIsIDB4RDIsIDB4NTMsIDB4RDIsIDB4NTQsIDB4RDIsIDB4NTUsIC8qIDB4NEMtMHg0RiAqLworCTB4RDIsIDB4NTYsIDB4RDIsIDB4NTcsIDB4RDIsIDB4NTgsIDB4RDIsIDB4NTksIC8qIDB4NTAtMHg1MyAqLworCTB4RDIsIDB4NUEsIDB4RDIsIDB4NUIsIDB4RDIsIDB4NUMsIDB4RDIsIDB4NUQsIC8qIDB4NTQtMHg1NyAqLworCTB4RDIsIDB4NUUsIDB4RDIsIDB4NUYsIDB4RDIsIDB4NjAsIDB4RDIsIDB4NjEsIC8qIDB4NTgtMHg1QiAqLworCTB4RDIsIDB4NjIsIDB4RDIsIDB4NjMsIDB4RjQsIDB4QzUsIDB4QkQsIDB4RjMsIC8qIDB4NUMtMHg1RiAqLworCTB4RDIsIDB4NjQsIDB4RDIsIDB4NjUsIDB4RDIsIDB4NjYsIDB4RDIsIDB4NjcsIC8qIDB4NjAtMHg2MyAqLworCTB4RDIsIDB4NjgsIDB4RDIsIDB4NjksIDB4RjEsIDB4RTAsIDB4RDIsIDB4NkEsIC8qIDB4NjQtMHg2NyAqLworCTB4RDIsIDB4NkIsIDB4RDIsIDB4NkMsIDB4RDIsIDB4NkQsIDB4RDIsIDB4NkUsIC8qIDB4NjgtMHg2QiAqLworCTB4RDIsIDB4NkYsIDB4RDIsIDB4NzAsIDB4RDIsIDB4NzEsIDB4RDIsIDB4NzIsIC8qIDB4NkMtMHg2RiAqLworCTB4RDIsIDB4NzMsIDB4RDIsIDB4NzQsIDB4RDIsIDB4NzUsIDB4RDIsIDB4NzYsIC8qIDB4NzAtMHg3MyAqLworCTB4RDIsIDB4NzcsIDB4RDIsIDB4NzgsIDB4RDIsIDB4NzksIDB4RDIsIDB4N0EsIC8qIDB4NzQtMHg3NyAqLworCTB4RDIsIDB4N0IsIDB4RDIsIDB4N0MsIDB4RDIsIDB4N0QsIDB4RjEsIDB4RTEsIC8qIDB4NzgtMHg3QiAqLworCTB4RDIsIDB4N0UsIDB4RDIsIDB4ODAsIDB4RDIsIDB4ODEsIDB4Q0UsIDB4RjcsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RDIsIDB4ODIsIDB4RDIsIDB4QUEsIDB4RDIsIDB4ODMsIDB4RjEsIDB4RkIsIC8qIDB4ODAtMHg4MyAqLworCTB4RDIsIDB4ODQsIDB4RDIsIDB4ODUsIDB4QjgsIDB4QjIsIDB4RDIsIDB4ODYsIC8qIDB4ODQtMHg4NyAqLworCTB4RDIsIDB4ODcsIDB4RDIsIDB4ODgsIDB4RDIsIDB4ODksIDB4RDIsIDB4OEEsIC8qIDB4ODgtMHg4QiAqLworCTB4RDIsIDB4OEIsIDB4RDIsIDB4OEMsIDB4RDIsIDB4OEQsIDB4RDIsIDB4OEUsIC8qIDB4OEMtMHg4RiAqLworCTB4RDIsIDB4OEYsIDB4RDIsIDB4OTAsIDB4RDIsIDB4OTEsIDB4RDIsIDB4OTIsIC8qIDB4OTAtMHg5MyAqLworCTB4RDIsIDB4OTMsIDB4RDIsIDB4OTQsIDB4RDIsIDB4OTUsIDB4RDIsIDB4OTYsIC8qIDB4OTQtMHg5NyAqLworCTB4RDIsIDB4OTcsIDB4RDIsIDB4OTgsIDB4RDIsIDB4OTksIDB4RDIsIDB4OUEsIC8qIDB4OTgtMHg5QiAqLworCTB4RDIsIDB4OUIsIDB4RDIsIDB4OUMsIDB4RDIsIDB4OUQsIDB4RDIsIDB4OUUsIC8qIDB4OUMtMHg5RiAqLworCTB4RDIsIDB4OUYsIDB4RDIsIDB4QTAsIDB4RDMsIDB4NDAsIDB4RDMsIDB4NDEsIC8qIDB4QTAtMHhBMyAqLworCTB4RDMsIDB4NDIsIDB4RDMsIDB4NDMsIDB4RDMsIDB4NDQsIDB4RDMsIDB4NDUsIC8qIDB4QTQtMHhBNyAqLworCTB4RDMsIDB4NDYsIDB4RDMsIDB4NDcsIDB4RDMsIDB4NDgsIDB4RDMsIDB4NDksIC8qIDB4QTgtMHhBQiAqLworCTB4RDMsIDB4NEEsIDB4RDMsIDB4NEIsIDB4RDMsIDB4NEMsIDB4RDMsIDB4NEQsIC8qIDB4QUMtMHhBRiAqLworCTB4RDMsIDB4NEUsIDB4RDMsIDB4NEYsIDB4RDMsIDB4NTAsIDB4RDMsIDB4NTEsIC8qIDB4QjAtMHhCMyAqLworCTB4RDMsIDB4NTIsIDB4RDMsIDB4NTMsIDB4RDMsIDB4NTQsIDB4RDMsIDB4NTUsIC8qIDB4QjQtMHhCNyAqLworCTB4RDMsIDB4NTYsIDB4RDMsIDB4NTcsIDB4RDMsIDB4NTgsIDB4RDMsIDB4NTksIC8qIDB4QjgtMHhCQiAqLworCTB4RDMsIDB4NUEsIDB4RDMsIDB4NUIsIDB4RDMsIDB4NUMsIDB4RDMsIDB4NUQsIC8qIDB4QkMtMHhCRiAqLworCTB4RDMsIDB4NUUsIDB4QkMsIDB4RkIsIDB4QjksIDB4REIsIDB4RDMsIDB4NUYsIC8qIDB4QzAtMHhDMyAqLworCTB4QjksIDB4RTYsIDB4QzMsIDB4RDksIDB4Q0EsIDB4RDMsIDB4RUEsIDB4RTgsIC8qIDB4QzQtMHhDNyAqLworCTB4QzAsIDB4QzAsIDB4QkUsIDB4RjUsIDB4RUEsIDB4RTksIDB4RUEsIDB4RUEsIC8qIDB4QzgtMHhDQiAqLworCTB4RUEsIDB4RUIsIDB4RDMsIDB4NjAsIDB4RUEsIDB4RUMsIDB4RUEsIDB4RUQsIC8qIDB4Q0MtMHhDRiAqLworCTB4RUEsIDB4RUUsIDB4RUEsIDB4RUYsIDB4QkQsIDB4QzcsIDB4RDMsIDB4NjEsIC8qIDB4RDAtMHhEMyAqLworCTB4RDMsIDB4NjIsIDB4RDMsIDB4NjMsIDB4RjUsIDB4RkIsIDB4RDMsIDB4NjQsIC8qIDB4RDQtMHhENyAqLworCTB4RDMsIDB4NjUsIDB4RDMsIDB4NjYsIDB4RjUsIDB4RkQsIDB4RDMsIDB4NjcsIC8qIDB4RDgtMHhEQiAqLworCTB4RjUsIDB4RkUsIDB4RDMsIDB4NjgsIDB4RjUsIDB4RkMsIDB4RDMsIDB4NjksIC8qIDB4REMtMHhERiAqLworCTB4RDMsIDB4NkEsIDB4RDMsIDB4NkIsIDB4RDMsIDB4NkMsIDB4QkQsIDB4RTIsIC8qIDB4RTAtMHhFMyAqLworCTB4RDMsIDB4NkQsIDB4RjYsIDB4QTEsIDB4QjQsIDB4QTUsIDB4RDMsIDB4NkUsIC8qIDB4RTQtMHhFNyAqLworCTB4RDMsIDB4NkYsIDB4RDMsIDB4NzAsIDB4RDMsIDB4NzEsIDB4RjYsIDB4QTIsIC8qIDB4RTgtMHhFQiAqLworCTB4RDMsIDB4NzIsIDB4RDMsIDB4NzMsIDB4RDMsIDB4NzQsIDB4RjYsIDB4QTMsIC8qIDB4RUMtMHhFRiAqLworCTB4RDMsIDB4NzUsIDB4RDMsIDB4NzYsIDB4RDMsIDB4NzcsIDB4RUMsIDB4QjIsIC8qIDB4RjAtMHhGMyAqLworCTB4RDMsIDB4NzgsIDB4RDMsIDB4NzksIDB4RDMsIDB4N0EsIDB4RDMsIDB4N0IsIC8qIDB4RjQtMHhGNyAqLworCTB4RDMsIDB4N0MsIDB4RDMsIDB4N0QsIDB4RDMsIDB4N0UsIDB4RDMsIDB4ODAsIC8qIDB4RjgtMHhGQiAqLworCTB4RDMsIDB4ODEsIDB4RDMsIDB4ODIsIDB4RDMsIDB4ODMsIDB4RDMsIDB4ODQsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzhBWzUxMl0gPSB7CisJMHhEMSwgMHhENCwgMHhEMywgMHg4NSwgMHhEMywgMHg4NiwgMHhEMywgMHg4NywgLyogMHgwMC0weDAzICovCisJMHhEMywgMHg4OCwgMHhEMywgMHg4OSwgMHhEMywgMHg4QSwgMHhEOSwgMHhFQSwgLyogMHgwNC0weDA3ICovCisJMHhEMywgMHg4QiwgMHhEMywgMHg4QywgMHhEMywgMHg4RCwgMHhEMywgMHg4RSwgLyogMHgwOC0weDBCICovCisJMHhEMywgMHg4RiwgMHhEMywgMHg5MCwgMHhEMywgMHg5MSwgMHhEMywgMHg5MiwgLyogMHgwQy0weDBGICovCisJMHhEMywgMHg5MywgMHhEMywgMHg5NCwgMHhEMywgMHg5NSwgMHhEMywgMHg5NiwgLyogMHgxMC0weDEzICovCisJMHhEMywgMHg5NywgMHhEMywgMHg5OCwgMHhEMywgMHg5OSwgMHhEMywgMHg5QSwgLyogMHgxNC0weDE3ICovCisJMHhEMywgMHg5QiwgMHhEMywgMHg5QywgMHhEMywgMHg5RCwgMHhEMywgMHg5RSwgLyogMHgxOC0weDFCICovCisJMHhEMywgMHg5RiwgMHhEMywgMHhBMCwgMHhENCwgMHg0MCwgMHhENCwgMHg0MSwgLyogMHgxQy0weDFGICovCisJMHhENCwgMHg0MiwgMHhENCwgMHg0MywgMHhENCwgMHg0NCwgMHhENCwgMHg0NSwgLyogMHgyMC0weDIzICovCisJMHhENCwgMHg0NiwgMHhENCwgMHg0NywgMHhENCwgMHg0OCwgMHhENCwgMHg0OSwgLyogMHgyNC0weDI3ICovCisJMHhENCwgMHg0QSwgMHhENCwgMHg0QiwgMHhENCwgMHg0QywgMHhENCwgMHg0RCwgLyogMHgyOC0weDJCICovCisJMHhENCwgMHg0RSwgMHhENCwgMHg0RiwgMHhENCwgMHg1MCwgMHhENCwgMHg1MSwgLyogMHgyQy0weDJGICovCisJMHhENCwgMHg1MiwgMHhENCwgMHg1MywgMHhENCwgMHg1NCwgMHhENCwgMHg1NSwgLyogMHgzMC0weDMzICovCisJMHhENCwgMHg1NiwgMHhENCwgMHg1NywgMHhENCwgMHg1OCwgMHhENCwgMHg1OSwgLyogMHgzNC0weDM3ICovCisJMHhENCwgMHg1QSwgMHhENCwgMHg1QiwgMHhENCwgMHg1QywgMHhENCwgMHg1RCwgLyogMHgzOC0weDNCICovCisJMHhENCwgMHg1RSwgMHhENCwgMHg1RiwgMHhGNiwgMHhBNCwgMHhENCwgMHg2MCwgLyogMHgzQy0weDNGICovCisJMHhENCwgMHg2MSwgMHhENCwgMHg2MiwgMHhENCwgMHg2MywgMHhENCwgMHg2NCwgLyogMHg0MC0weDQzICovCisJMHhENCwgMHg2NSwgMHhENCwgMHg2NiwgMHhENCwgMHg2NywgMHhENCwgMHg2OCwgLyogMHg0NC0weDQ3ICovCisJMHhFRSwgMHhCQSwgMHhENCwgMHg2OSwgMHhENCwgMHg2QSwgMHhENCwgMHg2QiwgLyogMHg0OC0weDRCICovCisJMHhENCwgMHg2QywgMHhENCwgMHg2RCwgMHhENCwgMHg2RSwgMHhENCwgMHg2RiwgLyogMHg0Qy0weDRGICovCisJMHhENCwgMHg3MCwgMHhENCwgMHg3MSwgMHhENCwgMHg3MiwgMHhENCwgMHg3MywgLyogMHg1MC0weDUzICovCisJMHhENCwgMHg3NCwgMHhENCwgMHg3NSwgMHhENCwgMHg3NiwgMHhENCwgMHg3NywgLyogMHg1NC0weDU3ICovCisJMHhENCwgMHg3OCwgMHhENCwgMHg3OSwgMHhENCwgMHg3QSwgMHhENCwgMHg3QiwgLyogMHg1OC0weDVCICovCisJMHhENCwgMHg3QywgMHhENCwgMHg3RCwgMHhENCwgMHg3RSwgMHhENCwgMHg4MCwgLyogMHg1Qy0weDVGICovCisJMHhENCwgMHg4MSwgMHhENCwgMHg4MiwgMHhENCwgMHg4MywgMHhENCwgMHg4NCwgLyogMHg2MC0weDYzICovCisJMHhENCwgMHg4NSwgMHhENCwgMHg4NiwgMHhENCwgMHg4NywgMHhENCwgMHg4OCwgLyogMHg2NC0weDY3ICovCisJMHhENCwgMHg4OSwgMHhENCwgMHg4QSwgMHhENCwgMHg4QiwgMHhENCwgMHg4QywgLyogMHg2OC0weDZCICovCisJMHhENCwgMHg4RCwgMHhENCwgMHg4RSwgMHhENCwgMHg4RiwgMHhENCwgMHg5MCwgLyogMHg2Qy0weDZGICovCisJMHhENCwgMHg5MSwgMHhENCwgMHg5MiwgMHhENCwgMHg5MywgMHhENCwgMHg5NCwgLyogMHg3MC0weDczICovCisJMHhENCwgMHg5NSwgMHhENCwgMHg5NiwgMHhENCwgMHg5NywgMHhENCwgMHg5OCwgLyogMHg3NC0weDc3ICovCisJMHhENCwgMHg5OSwgMHhENSwgMHhCMiwgMHhENCwgMHg5QSwgMHhENCwgMHg5QiwgLyogMHg3OC0weDdCICovCisJMHhENCwgMHg5QywgMHhENCwgMHg5RCwgMHhENCwgMHg5RSwgMHhENCwgMHg5RiwgLyogMHg3Qy0weDdGICovCisJCisJMHhENCwgMHhBMCwgMHhENSwgMHg0MCwgMHhENSwgMHg0MSwgMHhENSwgMHg0MiwgLyogMHg4MC0weDgzICovCisJMHhENSwgMHg0MywgMHhENSwgMHg0NCwgMHhENSwgMHg0NSwgMHhENSwgMHg0NiwgLyogMHg4NC0weDg3ICovCisJMHhENSwgMHg0NywgMHhEMywgMHhGRSwgMHhDQywgMHhEQywgMHhENSwgMHg0OCwgLyogMHg4OC0weDhCICovCisJMHhENSwgMHg0OSwgMHhENSwgMHg0QSwgMHhENSwgMHg0QiwgMHhENSwgMHg0QywgLyogMHg4Qy0weDhGICovCisJMHhENSwgMHg0RCwgMHhENSwgMHg0RSwgMHhENSwgMHg0RiwgMHhDQSwgMHhDNCwgLyogMHg5MC0weDkzICovCisJMHhENSwgMHg1MCwgMHhENSwgMHg1MSwgMHhENSwgMHg1MiwgMHhENSwgMHg1MywgLyogMHg5NC0weDk3ICovCisJMHhENSwgMHg1NCwgMHhENSwgMHg1NSwgMHhENSwgMHg1NiwgMHhENSwgMHg1NywgLyogMHg5OC0weDlCICovCisJMHhENSwgMHg1OCwgMHhENSwgMHg1OSwgMHhENSwgMHg1QSwgMHhENSwgMHg1QiwgLyogMHg5Qy0weDlGICovCisJMHhENSwgMHg1QywgMHhENSwgMHg1RCwgMHhENSwgMHg1RSwgMHhENSwgMHg1RiwgLyogMHhBMC0weEEzICovCisJMHhENSwgMHg2MCwgMHhENSwgMHg2MSwgMHhENSwgMHg2MiwgMHhENSwgMHg2MywgLyogMHhBNC0weEE3ICovCisJMHhENSwgMHg2NCwgMHhENSwgMHg2NSwgMHhENSwgMHg2NiwgMHhENSwgMHg2NywgLyogMHhBOC0weEFCICovCisJMHhENSwgMHg2OCwgMHhENSwgMHg2OSwgMHhENSwgMHg2QSwgMHhENSwgMHg2QiwgLyogMHhBQy0weEFGICovCisJMHhENSwgMHg2QywgMHhENSwgMHg2RCwgMHhENSwgMHg2RSwgMHhENSwgMHg2RiwgLyogMHhCMC0weEIzICovCisJMHhENSwgMHg3MCwgMHhENSwgMHg3MSwgMHhENSwgMHg3MiwgMHhENSwgMHg3MywgLyogMHhCNC0weEI3ICovCisJMHhENSwgMHg3NCwgMHhENSwgMHg3NSwgMHhENSwgMHg3NiwgMHhENSwgMHg3NywgLyogMHhCOC0weEJCICovCisJMHhENSwgMHg3OCwgMHhENSwgMHg3OSwgMHhENSwgMHg3QSwgMHhENSwgMHg3QiwgLyogMHhCQy0weEJGICovCisJMHhENSwgMHg3QywgMHhENSwgMHg3RCwgMHhENSwgMHg3RSwgMHhENSwgMHg4MCwgLyogMHhDMC0weEMzICovCisJMHhENSwgMHg4MSwgMHhENSwgMHg4MiwgMHhENSwgMHg4MywgMHhENSwgMHg4NCwgLyogMHhDNC0weEM3ICovCisJMHhENSwgMHg4NSwgMHhENSwgMHg4NiwgMHhENSwgMHg4NywgMHhENSwgMHg4OCwgLyogMHhDOC0weENCICovCisJMHhENSwgMHg4OSwgMHhENSwgMHg4QSwgMHhENSwgMHg4QiwgMHhENSwgMHg4QywgLyogMHhDQy0weENGICovCisJMHhENSwgMHg4RCwgMHhENSwgMHg4RSwgMHhENSwgMHg4RiwgMHhENSwgMHg5MCwgLyogMHhEMC0weEQzICovCisJMHhENSwgMHg5MSwgMHhENSwgMHg5MiwgMHhENSwgMHg5MywgMHhENSwgMHg5NCwgLyogMHhENC0weEQ3ICovCisJMHhENSwgMHg5NSwgMHhENSwgMHg5NiwgMHhENSwgMHg5NywgMHhENSwgMHg5OCwgLyogMHhEOC0weERCICovCisJMHhENSwgMHg5OSwgMHhENSwgMHg5QSwgMHhENSwgMHg5QiwgMHhENSwgMHg5QywgLyogMHhEQy0weERGICovCisJMHhENSwgMHg5RCwgMHhENSwgMHg5RSwgMHhENSwgMHg5RiwgMHhENSwgMHhBMCwgLyogMHhFMC0weEUzICovCisJMHhENiwgMHg0MCwgMHhENiwgMHg0MSwgMHhENiwgMHg0MiwgMHhENiwgMHg0MywgLyogMHhFNC0weEU3ICovCisJMHhENiwgMHg0NCwgMHhENiwgMHg0NSwgMHhENiwgMHg0NiwgMHhENiwgMHg0NywgLyogMHhFOC0weEVCICovCisJMHhENiwgMHg0OCwgMHhENiwgMHg0OSwgMHhENiwgMHg0QSwgMHhENiwgMHg0QiwgLyogMHhFQy0weEVGICovCisJMHhENiwgMHg0QywgMHhENiwgMHg0RCwgMHhENiwgMHg0RSwgMHhENiwgMHg0RiwgLyogMHhGMC0weEYzICovCisJMHhENiwgMHg1MCwgMHhENiwgMHg1MSwgMHhENiwgMHg1MiwgMHhENiwgMHg1MywgLyogMHhGNC0weEY3ICovCisJMHhENiwgMHg1NCwgMHhENiwgMHg1NSwgMHhENiwgMHg1NiwgMHhENiwgMHg1NywgLyogMHhGOC0weEZCICovCisJMHhENiwgMHg1OCwgMHhENiwgMHg1OSwgMHhENiwgMHg1QSwgMHhENiwgMHg1QiwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOEJbNTEyXSA9IHsKKwkweEQ2LCAweDVDLCAweEQ2LCAweDVELCAweEQ2LCAweDVFLCAweEQ2LCAweDVGLCAvKiAweDAwLTB4MDMgKi8KKwkweEQ2LCAweDYwLCAweEQ2LCAweDYxLCAweEQ2LCAweDYyLCAweEU1LCAweEMwLCAvKiAweDA0LTB4MDcgKi8KKwkweEQ2LCAweDYzLCAweEQ2LCAweDY0LCAweEQ2LCAweDY1LCAweEQ2LCAweDY2LCAvKiAweDA4LTB4MEIgKi8KKwkweEQ2LCAweDY3LCAweEQ2LCAweDY4LCAweEQ2LCAweDY5LCAweEQ2LCAweDZBLCAvKiAweDBDLTB4MEYgKi8KKwkweEQ2LCAweDZCLCAweEQ2LCAweDZDLCAweEQ2LCAweDZELCAweEQ2LCAweDZFLCAvKiAweDEwLTB4MTMgKi8KKwkweEQ2LCAweDZGLCAweEQ2LCAweDcwLCAweEQ2LCAweDcxLCAweEQ2LCAweDcyLCAvKiAweDE0LTB4MTcgKi8KKwkweEQ2LCAweDczLCAweEQ2LCAweDc0LCAweEQ2LCAweDc1LCAweEQ2LCAweDc2LCAvKiAweDE4LTB4MUIgKi8KKwkweEQ2LCAweDc3LCAweEQ2LCAweDc4LCAweEQ2LCAweDc5LCAweEQ2LCAweDdBLCAvKiAweDFDLTB4MUYgKi8KKwkweEQ2LCAweDdCLCAweEQ2LCAweDdDLCAweEQ2LCAweDdELCAweEQ2LCAweDdFLCAvKiAweDIwLTB4MjMgKi8KKwkweEQ2LCAweDgwLCAweEQ2LCAweDgxLCAweEY2LCAweEE1LCAweEQ2LCAweDgyLCAvKiAweDI0LTB4MjcgKi8KKwkweEQ2LCAweDgzLCAweEQ2LCAweDg0LCAweEQ2LCAweDg1LCAweEQ2LCAweDg2LCAvKiAweDI4LTB4MkIgKi8KKwkweEQ2LCAweDg3LCAweEQ2LCAweDg4LCAweEQ2LCAweDg5LCAweEQ2LCAweDhBLCAvKiAweDJDLTB4MkYgKi8KKwkweEQ2LCAweDhCLCAweEQ2LCAweDhDLCAweEQ2LCAweDhELCAweEQ2LCAweDhFLCAvKiAweDMwLTB4MzMgKi8KKwkweEQ2LCAweDhGLCAweEQ2LCAweDkwLCAweEQ2LCAweDkxLCAweEQ2LCAweDkyLCAvKiAweDM0LTB4MzcgKi8KKwkweEQ2LCAweDkzLCAweEQ2LCAweDk0LCAweEQ2LCAweDk1LCAweEQ2LCAweDk2LCAvKiAweDM4LTB4M0IgKi8KKwkweEQ2LCAweDk3LCAweEQ2LCAweDk4LCAweEQ2LCAweDk5LCAweEQ2LCAweDlBLCAvKiAweDNDLTB4M0YgKi8KKwkweEQ2LCAweDlCLCAweEQ2LCAweDlDLCAweEQ2LCAweDlELCAweEQ2LCAweDlFLCAvKiAweDQwLTB4NDMgKi8KKwkweEQ2LCAweDlGLCAweEQ2LCAweEEwLCAweEQ3LCAweDQwLCAweEQ3LCAweDQxLCAvKiAweDQ0LTB4NDcgKi8KKwkweEQ3LCAweDQyLCAweEQ3LCAweDQzLCAweEQ3LCAweDQ0LCAweEQ3LCAweDQ1LCAvKiAweDQ4LTB4NEIgKi8KKwkweEQ3LCAweDQ2LCAweEQ3LCAweDQ3LCAweEQ3LCAweDQ4LCAweEQ3LCAweDQ5LCAvKiAweDRDLTB4NEYgKi8KKwkweEQ3LCAweDRBLCAweEQ3LCAweDRCLCAweEQ3LCAweDRDLCAweEQ3LCAweDRELCAvKiAweDUwLTB4NTMgKi8KKwkweEQ3LCAweDRFLCAweEQ3LCAweDRGLCAweEQ3LCAweDUwLCAweEQ3LCAweDUxLCAvKiAweDU0LTB4NTcgKi8KKwkweEQ3LCAweDUyLCAweEQ3LCAweDUzLCAweEQ3LCAweDU0LCAweEQ3LCAweDU1LCAvKiAweDU4LTB4NUIgKi8KKwkweEQ3LCAweDU2LCAweEQ3LCAweDU3LCAweEQ3LCAweDU4LCAweEQ3LCAweDU5LCAvKiAweDVDLTB4NUYgKi8KKwkweEQ3LCAweDVBLCAweEQ3LCAweDVCLCAweEQ3LCAweDVDLCAweEQ3LCAweDVELCAvKiAweDYwLTB4NjMgKi8KKwkweEQ3LCAweDVFLCAweEQ3LCAweDVGLCAweEJFLCAweEFGLCAweEQ3LCAweDYwLCAvKiAweDY0LTB4NjcgKi8KKwkweEQ3LCAweDYxLCAweEQ3LCAweDYyLCAweEQ3LCAweDYzLCAweEQ3LCAweDY0LCAvKiAweDY4LTB4NkIgKi8KKwkweEM2LCAweEE5LCAweEQ3LCAweDY1LCAweEQ3LCAweDY2LCAweEQ3LCAweDY3LCAvKiAweDZDLTB4NkYgKi8KKwkweEQ3LCAweDY4LCAweEQ3LCAweDY5LCAweEQ3LCAweDZBLCAweEQ3LCAweDZCLCAvKiAweDcwLTB4NzMgKi8KKwkweEQ3LCAweDZDLCAweEQ3LCAweDZELCAweEQ3LCAweDZFLCAweEQ3LCAweDZGLCAvKiAweDc0LTB4NzcgKi8KKwkweEQ3LCAweDcwLCAweEQ3LCAweDcxLCAweEQ3LCAweDcyLCAweEQ3LCAweDczLCAvKiAweDc4LTB4N0IgKi8KKwkweEQ3LCAweDc0LCAweEQ3LCAweDc1LCAweEQ3LCAweDc2LCAweEQ3LCAweDc3LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEQ3LCAweDc4LCAweEQ3LCAweDc5LCAweEQ3LCAweDdBLCAweEQ3LCAweDdCLCAvKiAweDgwLTB4ODMgKi8KKwkweEQ3LCAweDdDLCAweEQ3LCAweDdELCAweEQ3LCAweDdFLCAweEQ3LCAweDgwLCAvKiAweDg0LTB4ODcgKi8KKwkweEQ3LCAweDgxLCAweEQ3LCAweDgyLCAweEQ3LCAweDgzLCAweEQ3LCAweDg0LCAvKiAweDg4LTB4OEIgKi8KKwkweEQ3LCAweDg1LCAweEQ3LCAweDg2LCAweEQ3LCAweDg3LCAweEQ3LCAweDg4LCAvKiAweDhDLTB4OEYgKi8KKwkweEQ3LCAweDg5LCAweEQ3LCAweDhBLCAweEQ3LCAweDhCLCAweEQ3LCAweDhDLCAvKiAweDkwLTB4OTMgKi8KKwkweEQ3LCAweDhELCAweEQ3LCAweDhFLCAweEQ3LCAweDhGLCAweEQ3LCAweDkwLCAvKiAweDk0LTB4OTcgKi8KKwkweEQ3LCAweDkxLCAweEQ3LCAweDkyLCAweEQ3LCAweDkzLCAweEQ3LCAweDk0LCAvKiAweDk4LTB4OUIgKi8KKwkweEQ3LCAweDk1LCAweEQ3LCAweDk2LCAweEQ3LCAweDk3LCAweEQ3LCAweDk4LCAvKiAweDlDLTB4OUYgKi8KKwkweERBLCAweEE1LCAweEJDLCAweEM2LCAweEI2LCAweEE5LCAweEI4LCAweEJDLCAvKiAweEEwLTB4QTMgKi8KKwkweEM4LCAweENGLCAweEJDLCAweEE1LCAweERBLCAweEE2LCAweERBLCAweEE3LCAvKiAweEE0LTB4QTcgKi8KKwkweENDLCAweEQ2LCAweEM4LCAweEMzLCAweERBLCAweEE4LCAweEM2LCAweEZELCAvKiAweEE4LTB4QUIgKi8KKwkweEQ3LCAweDk5LCAweEQxLCAweEI1LCAweEQyLCAweEU5LCAweEQxLCAweEI2LCAvKiAweEFDLTB4QUYgKi8KKwkweEJDLCAweEM3LCAweEQ3LCAweDlBLCAweEJELCAweEIyLCAweEJCLCAweEU0LCAvKiAweEIwLTB4QjMgKi8KKwkweERBLCAweEE5LCAweERBLCAweEFBLCAweEQxLCAweEM4LCAweERBLCAweEFCLCAvKiAweEI0LTB4QjcgKi8KKwkweEQwLCAweEVELCAweEI2LCAweEVGLCAweEMyLCAweERCLCAweEQ3LCAweDlCLCAvKiAweEI4LTB4QkIgKi8KKwkweENCLCAweENGLCAweEI3LCAweEVELCAweEM5LCAweEU4LCAweEI3LCAweEMzLCAvKiAweEJDLTB4QkYgKi8KKwkweEJFLCAweEY3LCAweEQ2LCAweEE0LCAweERBLCAweEFDLCAweERBLCAweEFELCAvKiAweEMwLTB4QzMgKi8KKwkweEM2LCAweEMwLCAweEQ3LCAweEU3LCAweENBLCAweEI2LCAweEQ3LCAweDlDLCAvKiAweEM0LTB4QzcgKi8KKwkweEQ1LCAweEE5LCAweENCLCAweERGLCAweEQ1LCAweEVGLCAweERBLCAweEFFLCAvKiAweEM4LTB4Q0IgKi8KKwkweEQ2LCAweERGLCAweEI0LCAweENBLCAweERBLCAweEIwLCAweERBLCAweEFGLCAvKiAweENDLTB4Q0YgKi8KKwkweEQ3LCAweDlELCAweEQyLCAweEVCLCAweERBLCAweEIxLCAweERBLCAweEIyLCAvKiAweEQwLTB4RDMgKi8KKwkweERBLCAweEIzLCAweENBLCAweEQ0LCAweERBLCAweEI0LCAweENBLCAweEFCLCAvKiAweEQ0LTB4RDcgKi8KKwkweERBLCAweEI1LCAweERBLCAweEI2LCAweEIzLCAweENGLCAweEQ2LCAweEVGLCAvKiAweEQ4LTB4REIgKi8KKwkweERBLCAweEI3LCAweEJCLCAweEIwLCAweEI1LCAweEFFLCAweERBLCAweEI4LCAvKiAweERDLTB4REYgKi8KKwkweERBLCAweEI5LCAweEI5LCAweEVFLCAweEQxLCAweEFGLCAweEQyLCAweEU4LCAvKiAweEUwLTB4RTMgKi8KKwkweERBLCAweEJBLCAweEI4LCAweEMzLCAweENGLCAweEVBLCAweEIyLCAweEVGLCAvKiAweEU0LTB4RTcgKi8KKwkweERBLCAweEJCLCAweERBLCAweEJDLCAweEQ3LCAweDlFLCAweEJELCAweEVCLCAvKiAweEU4LTB4RUIgKi8KKwkweENFLCAweERDLCAweEQzLCAweEVGLCAweERBLCAweEJELCAweENFLCAweEYzLCAvKiAweEVDLTB4RUYgKi8KKwkweERBLCAweEJFLCAweEQzLCAweEQ1LCAweEJCLCAweEU1LCAweERBLCAweEJGLCAvKiAweEYwLTB4RjMgKi8KKwkweENCLCAweEI1LCAweENCLCAweEQwLCAweERBLCAweEMwLCAweEM3LCAweEVCLCAvKiAweEY0LTB4RjcgKi8KKwkweEQ2LCAweEVFLCAweERBLCAweEMxLCAweEM1LCAweEI1LCAweEI2LCAweEMxLCAvKiAweEY4LTB4RkIgKi8KKwkweERBLCAweEMyLCAweEI3LCAweENDLCAweEJGLCAweENFLCAweERBLCAweEMzLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184Q1s1MTJdID0geworCTB4REEsIDB4QzQsIDB4Q0IsIDB4QUQsIDB4REEsIDB4QzUsIDB4QjUsIDB4RjcsIC8qIDB4MDAtMHgwMyAqLworCTB4REEsIDB4QzYsIDB4QzEsIDB4QzIsIDB4RDcsIDB4QkIsIDB4REEsIDB4QzcsIC8qIDB4MDQtMHgwNyAqLworCTB4Q0MsIDB4QjgsIDB4RDcsIDB4OUYsIDB4RDIsIDB4RUEsIDB4QzQsIDB4QjEsIC8qIDB4MDgtMHgwQiAqLworCTB4REEsIDB4QzgsIDB4QjUsIDB4RkQsIDB4QkIsIDB4RDEsIDB4REEsIDB4QzksIC8qIDB4MEMtMHgwRiAqLworCTB4RDAsIDB4QjMsIDB4REEsIDB4Q0EsIDB4REEsIDB4Q0IsIDB4Q0UsIDB4QkQsIC8qIDB4MTAtMHgxMyAqLworCTB4REEsIDB4Q0MsIDB4REEsIDB4Q0QsIDB4REEsIDB4Q0UsIDB4QjIsIDB4RjcsIC8qIDB4MTQtMHgxNyAqLworCTB4REEsIDB4RDEsIDB4REEsIDB4Q0YsIDB4RDEsIDB4RTgsIDB4REEsIDB4RDAsIC8qIDB4MTgtMHgxQiAqLworCTB4QzMsIDB4RDUsIDB4REEsIDB4RDIsIDB4RDcsIDB4QTAsIDB4REEsIDB4RDMsIC8qIDB4MUMtMHgxRiAqLworCTB4REEsIDB4RDQsIDB4REEsIDB4RDUsIDB4RDAsIDB4QkIsIDB4RDIsIDB4QTUsIC8qIDB4MjAtMHgyMyAqLworCTB4QjAsIDB4RjksIDB4REEsIDB4RDYsIDB4QzcsIDB4QUIsIDB4REEsIDB4RDcsIC8qIDB4MjQtMHgyNyAqLworCTB4QkQsIDB4RjcsIDB4QzMsIDB4QTEsIDB4REEsIDB4RDgsIDB4REEsIDB4RDksIC8qIDB4MjgtMHgyQiAqLworCTB4QzMsIDB4RkQsIDB4Q0MsIDB4QjcsIDB4REEsIDB4REEsIDB4REEsIDB4REIsIC8qIDB4MkMtMHgyRiAqLworCTB4QzAsIDB4QkUsIDB4QzYsIDB4RDcsIDB4REEsIDB4REMsIDB4REEsIDB4REQsIC8qIDB4MzAtMHgzMyAqLworCTB4QzcsIDB4QjQsIDB4REEsIDB4REUsIDB4REEsIDB4REYsIDB4QjksIDB4QzgsIC8qIDB4MzQtMHgzNyAqLworCTB4RDgsIDB4NDAsIDB4RDgsIDB4NDEsIDB4RDgsIDB4NDIsIDB4RDgsIDB4NDMsIC8qIDB4MzgtMHgzQiAqLworCTB4RDgsIDB4NDQsIDB4RDgsIDB4NDUsIDB4RDgsIDB4NDYsIDB4RDgsIDB4NDcsIC8qIDB4M0MtMHgzRiAqLworCTB4RDgsIDB4NDgsIDB4QkIsIDB4RUQsIDB4RDgsIDB4NDksIDB4RDgsIDB4NEEsIC8qIDB4NDAtMHg0MyAqLworCTB4RDgsIDB4NEIsIDB4RDgsIDB4NEMsIDB4QjYsIDB4QjksIDB4RjQsIDB4RjgsIC8qIDB4NDQtMHg0NyAqLworCTB4RDgsIDB4NEQsIDB4RjQsIDB4RjksIDB4RDgsIDB4NEUsIDB4RDgsIDB4NEYsIC8qIDB4NDgtMHg0QiAqLworCTB4Q0QsIDB4RTMsIDB4RDgsIDB4NTAsIDB4RDgsIDB4NTEsIDB4RDgsIDB4NTIsIC8qIDB4NEMtMHg0RiAqLworCTB4RDgsIDB4NTMsIDB4RDgsIDB4NTQsIDB4RDgsIDB4NTUsIDB4RDgsIDB4NTYsIC8qIDB4NTAtMHg1MyAqLworCTB4RDgsIDB4NTcsIDB4RjUsIDB4QjksIDB4RDgsIDB4NTgsIDB4RDgsIDB4NTksIC8qIDB4NTQtMHg1NyAqLworCTB4RDgsIDB4NUEsIDB4RDgsIDB4NUIsIDB4RUIsIDB4RTAsIDB4RDgsIDB4NUMsIC8qIDB4NTgtMHg1QiAqLworCTB4RDgsIDB4NUQsIDB4RDgsIDB4NUUsIDB4RDgsIDB4NUYsIDB4RDgsIDB4NjAsIC8qIDB4NUMtMHg1RiAqLworCTB4RDgsIDB4NjEsIDB4Q0YsIDB4RjMsIDB4QkIsIDB4QkYsIDB4RDgsIDB4NjIsIC8qIDB4NjAtMHg2MyAqLworCTB4RDgsIDB4NjMsIDB4RDgsIDB4NjQsIDB4RDgsIDB4NjUsIDB4RDgsIDB4NjYsIC8qIDB4NjQtMHg2NyAqLworCTB4RDgsIDB4NjcsIDB4RDgsIDB4NjgsIDB4QkEsIDB4QzAsIDB4RDQsIDB4QTUsIC8qIDB4NjgtMHg2QiAqLworCTB4RDgsIDB4NjksIDB4RDgsIDB4NkEsIDB4RDgsIDB4NkIsIDB4RDgsIDB4NkMsIC8qIDB4NkMtMHg2RiAqLworCTB4RDgsIDB4NkQsIDB4RDgsIDB4NkUsIDB4RDgsIDB4NkYsIDB4RTEsIDB4RDksIC8qIDB4NzAtMHg3MyAqLworCTB4RDgsIDB4NzAsIDB4RDgsIDB4NzEsIDB4RDgsIDB4NzIsIDB4RDgsIDB4NzMsIC8qIDB4NzQtMHg3NyAqLworCTB4RjUsIDB4RjQsIDB4QjEsIDB4QUEsIDB4QjIsIDB4RjIsIDB4RDgsIDB4NzQsIC8qIDB4NzgtMHg3QiAqLworCTB4RDgsIDB4NzUsIDB4RDgsIDB4NzYsIDB4RDgsIDB4NzcsIDB4RDgsIDB4NzgsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RDgsIDB4NzksIDB4RDgsIDB4N0EsIDB4RjUsIDB4RjUsIDB4RDgsIDB4N0IsIC8qIDB4ODAtMHg4MyAqLworCTB4RDgsIDB4N0MsIDB4RjUsIDB4RjcsIDB4RDgsIDB4N0QsIDB4RDgsIDB4N0UsIC8qIDB4ODQtMHg4NyAqLworCTB4RDgsIDB4ODAsIDB4QkEsIDB4RDEsIDB4RjUsIDB4RjYsIDB4RDgsIDB4ODEsIC8qIDB4ODgtMHg4QiAqLworCTB4QzMsIDB4QjIsIDB4RDgsIDB4ODIsIDB4RDgsIDB4ODMsIDB4RDgsIDB4ODQsIC8qIDB4OEMtMHg4RiAqLworCTB4RDgsIDB4ODUsIDB4RDgsIDB4ODYsIDB4RDgsIDB4ODcsIDB4RDgsIDB4ODgsIC8qIDB4OTAtMHg5MyAqLworCTB4RjUsIDB4RjksIDB4RDgsIDB4ODksIDB4RDgsIDB4OEEsIDB4RDgsIDB4OEIsIC8qIDB4OTQtMHg5NyAqLworCTB4RjUsIDB4RjgsIDB4RDgsIDB4OEMsIDB4RDgsIDB4OEQsIDB4RDgsIDB4OEUsIC8qIDB4OTgtMHg5QiAqLworCTB4RDgsIDB4OEYsIDB4RDgsIDB4OTAsIDB4RDgsIDB4OTEsIDB4RDgsIDB4OTIsIC8qIDB4OUMtMHg5RiAqLworCTB4RDgsIDB4OTMsIDB4RDgsIDB4OTQsIDB4RDgsIDB4OTUsIDB4RDgsIDB4OTYsIC8qIDB4QTAtMHhBMyAqLworCTB4RDgsIDB4OTcsIDB4RDgsIDB4OTgsIDB4RDgsIDB4OTksIDB4RDgsIDB4OUEsIC8qIDB4QTQtMHhBNyAqLworCTB4RDgsIDB4OUIsIDB4RDgsIDB4OUMsIDB4RDgsIDB4OUQsIDB4RDgsIDB4OUUsIC8qIDB4QTgtMHhBQiAqLworCTB4RDgsIDB4OUYsIDB4RDgsIDB4QTAsIDB4RDksIDB4NDAsIDB4RDksIDB4NDEsIC8qIDB4QUMtMHhBRiAqLworCTB4RDksIDB4NDIsIDB4RDksIDB4NDMsIDB4RDksIDB4NDQsIDB4RDksIDB4NDUsIC8qIDB4QjAtMHhCMyAqLworCTB4RDksIDB4NDYsIDB4RDksIDB4NDcsIDB4RDksIDB4NDgsIDB4RDksIDB4NDksIC8qIDB4QjQtMHhCNyAqLworCTB4RDksIDB4NEEsIDB4RDksIDB4NEIsIDB4RDksIDB4NEMsIDB4RDksIDB4NEQsIC8qIDB4QjgtMHhCQiAqLworCTB4RDksIDB4NEUsIDB4RDksIDB4NEYsIDB4RDksIDB4NTAsIDB4RDksIDB4NTEsIC8qIDB4QkMtMHhCRiAqLworCTB4RDksIDB4NTIsIDB4RDksIDB4NTMsIDB4RDksIDB4NTQsIDB4RDksIDB4NTUsIC8qIDB4QzAtMHhDMyAqLworCTB4RDksIDB4NTYsIDB4RDksIDB4NTcsIDB4RDksIDB4NTgsIDB4RDksIDB4NTksIC8qIDB4QzQtMHhDNyAqLworCTB4RDksIDB4NUEsIDB4RDksIDB4NUIsIDB4RDksIDB4NUMsIDB4RDksIDB4NUQsIC8qIDB4QzgtMHhDQiAqLworCTB4RDksIDB4NUUsIDB4RDksIDB4NUYsIDB4RDksIDB4NjAsIDB4RDksIDB4NjEsIC8qIDB4Q0MtMHhDRiAqLworCTB4RDksIDB4NjIsIDB4RDksIDB4NjMsIDB4RDksIDB4NjQsIDB4RDksIDB4NjUsIC8qIDB4RDAtMHhEMyAqLworCTB4RDksIDB4NjYsIDB4RDksIDB4NjcsIDB4RDksIDB4NjgsIDB4RDksIDB4NjksIC8qIDB4RDQtMHhENyAqLworCTB4RDksIDB4NkEsIDB4RDksIDB4NkIsIDB4RDksIDB4NkMsIDB4RDksIDB4NkQsIC8qIDB4RDgtMHhEQiAqLworCTB4RDksIDB4NkUsIDB4RDksIDB4NkYsIDB4RDksIDB4NzAsIDB4RDksIDB4NzEsIC8qIDB4REMtMHhERiAqLworCTB4RDksIDB4NzIsIDB4RDksIDB4NzMsIDB4RDksIDB4NzQsIDB4RDksIDB4NzUsIC8qIDB4RTAtMHhFMyAqLworCTB4RDksIDB4NzYsIDB4RDksIDB4NzcsIDB4RDksIDB4NzgsIDB4RDksIDB4NzksIC8qIDB4RTQtMHhFNyAqLworCTB4RDksIDB4N0EsIDB4RDksIDB4N0IsIDB4RDksIDB4N0MsIDB4RDksIDB4N0QsIC8qIDB4RTgtMHhFQiAqLworCTB4RDksIDB4N0UsIDB4RDksIDB4ODAsIDB4RDksIDB4ODEsIDB4RDksIDB4ODIsIC8qIDB4RUMtMHhFRiAqLworCTB4RDksIDB4ODMsIDB4RDksIDB4ODQsIDB4RDksIDB4ODUsIDB4RDksIDB4ODYsIC8qIDB4RjAtMHhGMyAqLworCTB4RDksIDB4ODcsIDB4RDksIDB4ODgsIDB4RDksIDB4ODksIDB4RDksIDB4OEEsIC8qIDB4RjQtMHhGNyAqLworCTB4RDksIDB4OEIsIDB4RDksIDB4OEMsIDB4RDksIDB4OEQsIDB4RDksIDB4OEUsIC8qIDB4RjgtMHhGQiAqLworCTB4RDksIDB4OEYsIDB4RDksIDB4OTAsIDB4RDksIDB4OTEsIDB4RDksIDB4OTIsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzhEWzUxMl0gPSB7CisJMHhEOSwgMHg5MywgMHhEOSwgMHg5NCwgMHhEOSwgMHg5NSwgMHhEOSwgMHg5NiwgLyogMHgwMC0weDAzICovCisJMHhEOSwgMHg5NywgMHhEOSwgMHg5OCwgMHhEOSwgMHg5OSwgMHhEOSwgMHg5QSwgLyogMHgwNC0weDA3ICovCisJMHhEOSwgMHg5QiwgMHhEOSwgMHg5QywgMHhEOSwgMHg5RCwgMHhEOSwgMHg5RSwgLyogMHgwOC0weDBCICovCisJMHhEOSwgMHg5RiwgMHhEOSwgMHhBMCwgMHhEQSwgMHg0MCwgMHhEQSwgMHg0MSwgLyogMHgwQy0weDBGICovCisJMHhEQSwgMHg0MiwgMHhEQSwgMHg0MywgMHhEQSwgMHg0NCwgMHhEQSwgMHg0NSwgLyogMHgxMC0weDEzICovCisJMHhEQSwgMHg0NiwgMHhEQSwgMHg0NywgMHhEQSwgMHg0OCwgMHhEQSwgMHg0OSwgLyogMHgxNC0weDE3ICovCisJMHhEQSwgMHg0QSwgMHhEQSwgMHg0QiwgMHhEQSwgMHg0QywgMHhEQSwgMHg0RCwgLyogMHgxOC0weDFCICovCisJMHhEQSwgMHg0RSwgMHhCMSwgMHhCNCwgMHhENSwgMHhFQSwgMHhCOCwgMHhCQSwgLyogMHgxQy0weDFGICovCisJMHhEQSwgMHg0RiwgMHhCOSwgMHhCMSwgMHhCMiwgMHhDNiwgMHhENCwgMHhGMCwgLyogMHgyMC0weDIzICovCisJMHhDRiwgMHhDRCwgMHhCMCwgMHhEQywgMHhENSwgMHhDQiwgMHhCQiwgMHhGNSwgLyogMHgyNC0weDI3ICovCisJMHhENiwgMHhDQSwgMHhCNywgMHhCNywgMHhDQywgMHhCMCwgMHhDNiwgMHhCNiwgLyogMHgyOC0weDJCICovCisJMHhCMSwgMHhFMSwgMHhCOSwgMHhCQSwgMHhENiwgMHhGQywgMHhCOSwgMHhFMSwgLyogMHgyQy0weDJGICovCisJMHhCNywgMHhBMSwgMHhCQywgMHhGQSwgMHhFQSwgMHhEQSwgMHhFQSwgMHhEQiwgLyogMHgzMC0weDMzICovCisJMHhDQywgMHhGOSwgMHhCOSwgMHhGMywgMHhFQSwgMHhEQywgMHhCNCwgMHhGQiwgLyogMHgzNC0weDM3ICovCisJMHhDMywgMHhCMywgMHhCNywgMHhEMSwgMHhCQSwgMHhEOCwgMHhFQSwgMHhERCwgLyogMHgzOC0weDNCICovCisJMHhENCwgMHhGNCwgMHhFQSwgMHhERSwgMHhCQywgMHhENiwgMHhCQiwgMHhERiwgLyogMHgzQy0weDNGICovCisJMHhFQSwgMHhERiwgMHhDMSwgMHhERSwgMHhDMiwgMHhCOCwgMHhENCwgMHhERiwgLyogMHg0MC0weDQzICovCisJMHhENywgMHhDQSwgMHhFQSwgMHhFMCwgMHhFQSwgMHhFMSwgMHhFQSwgMHhFNCwgLyogMHg0NC0weDQ3ICovCisJMHhFQSwgMHhFMiwgMHhFQSwgMHhFMywgMHhDOSwgMHhERSwgMHhCOCwgMHhCMywgLyogMHg0OC0weDRCICovCisJMHhCNiwgMHhDNCwgMHhFQSwgMHhFNSwgMHhDQSwgMHhFQSwgMHhDOSwgMHhDRCwgLyogMHg0Qy0weDRGICovCisJMHhCNCwgMHhDRCwgMHhEQSwgMHg1MCwgMHhEQSwgMHg1MSwgMHhFMiwgMHhEOSwgLyogMHg1MC0weDUzICovCisJMHhDNSwgMHhFMiwgMHhFQSwgMHhFNiwgMHhDMCwgMHhCNSwgMHhEQSwgMHg1MiwgLyogMHg1NC0weDU3ICovCisJMHhENywgMHhCOCwgMHhFQSwgMHhFNywgMHhENywgMHhBQywgMHhDOCwgMHhGQywgLyogMHg1OC0weDVCICovCisJMHhEOCwgMHhEMywgMHhEOCwgMHhDRCwgMHhENCwgMHhERSwgMHhEQSwgMHg1MywgLyogMHg1Qy0weDVGICovCisJMHhENCwgMHhGOSwgMHhDOSwgMHhDNCwgMHhEMywgMHhBRSwgMHhCOCwgMHhEMywgLyogMHg2MC0weDYzICovCisJMHhCMywgMHhFMCwgMHhEQSwgMHg1NCwgMHhDOSwgMHhFMiwgMHhGNCwgMHhGNiwgLyogMHg2NC0weDY3ICovCisJMHhEQSwgMHg1NSwgMHhEQSwgMHg1NiwgMHhEQSwgMHg1NywgMHhCQSwgMHhENSwgLyogMHg2OC0weDZCICovCisJMHhEQSwgMHg1OCwgMHhGNCwgMHhGNywgMHhEQSwgMHg1OSwgMHhEQSwgMHg1QSwgLyogMHg2Qy0weDZGICovCisJMHhENywgMHhERiwgMHhEQSwgMHg1QiwgMHhEQSwgMHg1QywgMHhGNCwgMHhGMSwgLyogMHg3MC0weDczICovCisJMHhCOCwgMHhCMCwgMHhENSwgMHhENCwgMHhCOCwgMHhDRiwgMHhDNiwgMHhGMCwgLyogMHg3NC0weDc3ICovCisJMHhEQSwgMHg1RCwgMHhEQSwgMHg1RSwgMHhEQSwgMHg1RiwgMHhEQSwgMHg2MCwgLyogMHg3OC0weDdCICovCisJMHhEQSwgMHg2MSwgMHhEQSwgMHg2MiwgMHhEQSwgMHg2MywgMHhEQSwgMHg2NCwgLyogMHg3Qy0weDdGICovCisJCisJMHhEQSwgMHg2NSwgMHhCMywgMHhDMywgMHhEQSwgMHg2NiwgMHhEQSwgMHg2NywgLyogMHg4MC0weDgzICovCisJMHhGNCwgMHhGMiwgMHhCMywgMHhBQywgMHhEQSwgMHg2OCwgMHhEQSwgMHg2OSwgLyogMHg4NC0weDg3ICovCisJMHhEQSwgMHg2QSwgMHhEQSwgMHg2QiwgMHhENCwgMHhCRCwgMHhDNywgMHhGNywgLyogMHg4OC0weDhCICovCisJMHhEQSwgMHg2QywgMHhEQSwgMHg2RCwgMHhEQSwgMHg2RSwgMHhEQSwgMHg2RiwgLyogMHg4Qy0weDhGICovCisJMHhEQSwgMHg3MCwgMHhGNCwgMHhGNCwgMHhEQSwgMHg3MSwgMHhEQSwgMHg3MiwgLyogMHg5MC0weDkzICovCisJMHhGNCwgMHhGMywgMHhEQSwgMHg3MywgMHhEQSwgMHg3NCwgMHhEQSwgMHg3NSwgLyogMHg5NC0weDk3ICovCisJMHhEQSwgMHg3NiwgMHhEQSwgMHg3NywgMHhEQSwgMHg3OCwgMHhEQSwgMHg3OSwgLyogMHg5OC0weDlCICovCisJMHhEQSwgMHg3QSwgMHhEQSwgMHg3QiwgMHhEQSwgMHg3QywgMHhDQywgMHhDQiwgLyogMHg5Qy0weDlGICovCisJMHhEQSwgMHg3RCwgMHhEQSwgMHg3RSwgMHhEQSwgMHg4MCwgMHhDOCwgMHhBNCwgLyogMHhBMC0weEEzICovCisJMHhEQSwgMHg4MSwgMHhEQSwgMHg4MiwgMHhEQSwgMHg4MywgMHhEQSwgMHg4NCwgLyogMHhBNC0weEE3ICovCisJMHhEQSwgMHg4NSwgMHhEQSwgMHg4NiwgMHhEQSwgMHg4NywgMHhEQSwgMHg4OCwgLyogMHhBOC0weEFCICovCisJMHhEQSwgMHg4OSwgMHhEQSwgMHg4QSwgMHhEQSwgMHg4QiwgMHhEQSwgMHg4QywgLyogMHhBQy0weEFGICovCisJMHhEQSwgMHg4RCwgMHhGNCwgMHhGNSwgMHhEQSwgMHg4RSwgMHhENywgMHhFMywgLyogMHhCMC0weEIzICovCisJMHhDNSwgMHhCRiwgMHhGNSwgMHhDMCwgMHhEQSwgMHg4RiwgMHhEQSwgMHg5MCwgLyogMHhCNC0weEI3ICovCisJMHhGNSwgMHhCQiwgMHhEQSwgMHg5MSwgMHhGNSwgMHhDMywgMHhEQSwgMHg5MiwgLyogMHhCOC0weEJCICovCisJMHhGNSwgMHhDMiwgMHhEQSwgMHg5MywgMHhENiwgMHhCQSwgMHhGNSwgMHhDMSwgLyogMHhCQy0weEJGICovCisJMHhEQSwgMHg5NCwgMHhEQSwgMHg5NSwgMHhEQSwgMHg5NiwgMHhENCwgMHhCRSwgLyogMHhDMC0weEMzICovCisJMHhGNSwgMHhDNCwgMHhEQSwgMHg5NywgMHhGNSwgMHhDQywgMHhEQSwgMHg5OCwgLyogMHhDNC0weEM3ICovCisJMHhEQSwgMHg5OSwgMHhEQSwgMHg5QSwgMHhEQSwgMHg5QiwgMHhCMCwgMHhDRiwgLyogMHhDOC0weENCICovCisJMHhCNSwgMHhGOCwgMHhEQSwgMHg5QywgMHhGNSwgMHhDOSwgMHhGNSwgMHhDQSwgLyogMHhDQy0weENGICovCisJMHhEQSwgMHg5RCwgMHhDNSwgMHhEQywgMHhEQSwgMHg5RSwgMHhEQSwgMHg5RiwgLyogMHhEMC0weEQzICovCisJMHhEQSwgMHhBMCwgMHhEQiwgMHg0MCwgMHhGNSwgMHhDNSwgMHhGNSwgMHhDNiwgLyogMHhENC0weEQ3ICovCisJMHhEQiwgMHg0MSwgMHhEQiwgMHg0MiwgMHhGNSwgMHhDNywgMHhGNSwgMHhDQiwgLyogMHhEOC0weERCICovCisJMHhEQiwgMHg0MywgMHhCRSwgMHhFMCwgMHhGNSwgMHhDOCwgMHhCOCwgMHhGQSwgLyogMHhEQy0weERGICovCisJMHhEQiwgMHg0NCwgMHhEQiwgMHg0NSwgMHhEQiwgMHg0NiwgMHhGNSwgMHhEMCwgLyogMHhFMC0weEUzICovCisJMHhGNSwgMHhEMywgMHhEQiwgMHg0NywgMHhEQiwgMHg0OCwgMHhEQiwgMHg0OSwgLyogMHhFNC0weEU3ICovCisJMHhCRiwgMHhFNywgMHhEQiwgMHg0QSwgMHhCOSwgMHhGMiwgMHhGNSwgMHhCQywgLyogMHhFOC0weEVCICovCisJMHhGNSwgMHhDRCwgMHhEQiwgMHg0QiwgMHhEQiwgMHg0QywgMHhDMiwgMHhCNywgLyogMHhFQy0weEVGICovCisJMHhEQiwgMHg0RCwgMHhEQiwgMHg0RSwgMHhEQiwgMHg0RiwgMHhDQywgMHhGOCwgLyogMHhGMC0weEYzICovCisJMHhEQiwgMHg1MCwgMHhCQywgMHhGOSwgMHhEQiwgMHg1MSwgMHhGNSwgMHhDRSwgLyogMHhGNC0weEY3ICovCisJMHhGNSwgMHhDRiwgMHhGNSwgMHhEMSwgMHhCNiwgMHhFNSwgMHhGNSwgMHhEMiwgLyogMHhGOC0weEZCICovCisJMHhEQiwgMHg1MiwgMHhGNSwgMHhENSwgMHhEQiwgMHg1MywgMHhEQiwgMHg1NCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOEVbNTEyXSA9IHsKKwkweERCLCAweDU1LCAweERCLCAweDU2LCAweERCLCAweDU3LCAweERCLCAweDU4LCAvKiAweDAwLTB4MDMgKi8KKwkweERCLCAweDU5LCAweEY1LCAweEJELCAweERCLCAweDVBLCAweERCLCAweDVCLCAvKiAweDA0LTB4MDcgKi8KKwkweERCLCAweDVDLCAweEY1LCAweEQ0LCAweEQzLCAweEJCLCAweERCLCAweDVELCAvKiAweDA4LTB4MEIgKi8KKwkweEIzLCAweEVDLCAweERCLCAweDVFLCAweERCLCAweDVGLCAweENDLCAweEE0LCAvKiAweDBDLTB4MEYgKi8KKwkweERCLCAweDYwLCAweERCLCAweDYxLCAweERCLCAweDYyLCAweERCLCAweDYzLCAvKiAweDEwLTB4MTMgKi8KKwkweEY1LCAweEQ2LCAweERCLCAweDY0LCAweERCLCAweDY1LCAweERCLCAweDY2LCAvKiAweDE0LTB4MTcgKi8KKwkweERCLCAweDY3LCAweERCLCAweDY4LCAweERCLCAweDY5LCAweERCLCAweDZBLCAvKiAweDE4LTB4MUIgKi8KKwkweERCLCAweDZCLCAweEY1LCAweEQ3LCAweEJFLCAweEUxLCAweEY1LCAweEQ4LCAvKiAweDFDLTB4MUYgKi8KKwkweERCLCAweDZDLCAweERCLCAweDZELCAweENDLCAweERGLCAweEY1LCAweERCLCAvKiAweDIwLTB4MjMgKi8KKwkweERCLCAweDZFLCAweERCLCAweDZGLCAweERCLCAweDcwLCAweERCLCAweDcxLCAvKiAweDI0LTB4MjcgKi8KKwkweERCLCAweDcyLCAweEIyLCAweEM4LCAweEQ3LCAweEQ5LCAweERCLCAweDczLCAvKiAweDI4LTB4MkIgKi8KKwkweEY1LCAweEQ5LCAweERCLCAweDc0LCAweEY1LCAweERBLCAweEY1LCAweERDLCAvKiAweDJDLTB4MkYgKi8KKwkweERCLCAweDc1LCAweEY1LCAweEUyLCAweERCLCAweDc2LCAweERCLCAweDc3LCAvKiAweDMwLTB4MzMgKi8KKwkweERCLCAweDc4LCAweEY1LCAweEUwLCAweERCLCAweDc5LCAweERCLCAweDdBLCAvKiAweDM0LTB4MzcgKi8KKwkweERCLCAweDdCLCAweEY1LCAweERGLCAweEY1LCAweERELCAweERCLCAweDdDLCAvKiAweDM4LTB4M0IgKi8KKwkweERCLCAweDdELCAweEY1LCAweEUxLCAweERCLCAweDdFLCAweERCLCAweDgwLCAvKiAweDNDLTB4M0YgKi8KKwkweEY1LCAweERFLCAweEY1LCAweEU0LCAweEY1LCAweEU1LCAweERCLCAweDgxLCAvKiAweDQwLTB4NDMgKi8KKwkweENDLCAweEUzLCAweERCLCAweDgyLCAweERCLCAweDgzLCAweEU1LCAweEJGLCAvKiAweDQ0LTB4NDcgKi8KKwkweEI1LCAweEI4LCAweEY1LCAweEUzLCAweEY1LCAweEU4LCAweENDLCAweEEzLCAvKiAweDQ4LTB4NEIgKi8KKwkweERCLCAweDg0LCAweERCLCAweDg1LCAweERCLCAweDg2LCAweERCLCAweDg3LCAvKiAweDRDLTB4NEYgKi8KKwkweERCLCAweDg4LCAweEY1LCAweEU2LCAweEY1LCAweEU3LCAweERCLCAweDg5LCAvKiAweDUwLTB4NTMgKi8KKwkweERCLCAweDhBLCAweERCLCAweDhCLCAweERCLCAweDhDLCAweERCLCAweDhELCAvKiAweDU0LTB4NTcgKi8KKwkweERCLCAweDhFLCAweEY1LCAweEJFLCAweERCLCAweDhGLCAweERCLCAweDkwLCAvKiAweDU4LTB4NUIgKi8KKwkweERCLCAweDkxLCAweERCLCAweDkyLCAweERCLCAweDkzLCAweERCLCAweDk0LCAvKiAweDVDLTB4NUYgKi8KKwkweERCLCAweDk1LCAweERCLCAweDk2LCAweERCLCAweDk3LCAweERCLCAweDk4LCAvKiAweDYwLTB4NjMgKi8KKwkweERCLCAweDk5LCAweERCLCAweDlBLCAweEIxLCAweEM0LCAweERCLCAweDlCLCAvKiAweDY0LTB4NjcgKi8KKwkweERCLCAweDlDLCAweEY1LCAweEJGLCAweERCLCAweDlELCAweERCLCAweDlFLCAvKiAweDY4LTB4NkIgKi8KKwkweEI1LCAweEM1LCAweEIyLCAweEU0LCAweERCLCAweDlGLCAweEY1LCAweEVDLCAvKiAweDZDLTB4NkYgKi8KKwkweEY1LCAweEU5LCAweERCLCAweEEwLCAweEI2LCAweEQ3LCAweERDLCAweDQwLCAvKiAweDcwLTB4NzMgKi8KKwkweEY1LCAweEVELCAweERDLCAweDQxLCAweEY1LCAweEVBLCAweERDLCAweDQyLCAvKiAweDc0LTB4NzcgKi8KKwkweERDLCAweDQzLCAweERDLCAweDQ0LCAweERDLCAweDQ1LCAweERDLCAweDQ2LCAvKiAweDc4LTB4N0IgKi8KKwkweEY1LCAweEVCLCAweERDLCAweDQ3LCAweERDLCAweDQ4LCAweEI0LCAweERBLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweERDLCAweDQ5LCAweEQ0LCAweEVBLCAweERDLCAweDRBLCAweERDLCAweDRCLCAvKiAweDgwLTB4ODMgKi8KKwkweERDLCAweDRDLCAweEY1LCAweEVFLCAweERDLCAweDRELCAweEIzLCAweEY5LCAvKiAweDg0LTB4ODcgKi8KKwkweERDLCAweDRFLCAweERDLCAweDRGLCAweERDLCAweDUwLCAweERDLCAweDUxLCAvKiAweDg4LTB4OEIgKi8KKwkweERDLCAweDUyLCAweERDLCAweDUzLCAweERDLCAweDU0LCAweEY1LCAweEVGLCAvKiAweDhDLTB4OEYgKi8KKwkweEY1LCAweEYxLCAweERDLCAweDU1LCAweERDLCAweDU2LCAweERDLCAweDU3LCAvKiAweDkwLTB4OTMgKi8KKwkweEY1LCAweEYwLCAweERDLCAweDU4LCAweERDLCAweDU5LCAweERDLCAweDVBLCAvKiAweDk0LTB4OTcgKi8KKwkweERDLCAweDVCLCAweERDLCAweDVDLCAweERDLCAweDVELCAweERDLCAweDVFLCAvKiAweDk4LTB4OUIgKi8KKwkweEY1LCAweEYyLCAweERDLCAweDVGLCAweEY1LCAweEYzLCAweERDLCAweDYwLCAvKiAweDlDLTB4OUYgKi8KKwkweERDLCAweDYxLCAweERDLCAweDYyLCAweERDLCAweDYzLCAweERDLCAweDY0LCAvKiAweEEwLTB4QTMgKi8KKwkweERDLCAweDY1LCAweERDLCAweDY2LCAweERDLCAweDY3LCAweERDLCAweDY4LCAvKiAweEE0LTB4QTcgKi8KKwkweERDLCAweDY5LCAweERDLCAweDZBLCAweERDLCAweDZCLCAweEM5LCAweEVELCAvKiAweEE4LTB4QUIgKi8KKwkweEI5LCAweEFBLCAweERDLCAweDZDLCAweERDLCAweDZELCAweEM3LCAweEZCLCAvKiAweEFDLTB4QUYgKi8KKwkweERDLCAweDZFLCAweERDLCAweDZGLCAweEI2LCAweEUzLCAweERDLCAweDcwLCAvKiAweEIwLTB4QjMgKi8KKwkweERDLCAweDcxLCAweERDLCAweDcyLCAweERDLCAweDczLCAweERDLCAweDc0LCAvKiAweEI0LTB4QjcgKi8KKwkweERDLCAweDc1LCAweERDLCAweDc2LCAweENDLCAweEM5LCAweERDLCAweDc3LCAvKiAweEI4LTB4QkIgKi8KKwkweERDLCAweDc4LCAweERDLCAweDc5LCAweERDLCAweDdBLCAweERDLCAweDdCLCAvKiAweEJDLTB4QkYgKi8KKwkweERDLCAweDdDLCAweERDLCAweDdELCAweERDLCAweDdFLCAweERDLCAweDgwLCAvKiAweEMwLTB4QzMgKi8KKwkweERDLCAweDgxLCAweERDLCAweDgyLCAweERDLCAweDgzLCAweERDLCAweDg0LCAvKiAweEM0LTB4QzcgKi8KKwkweERDLCAweDg1LCAweERDLCAweDg2LCAweERDLCAweDg3LCAweERDLCAweDg4LCAvKiAweEM4LTB4Q0IgKi8KKwkweERDLCAweDg5LCAweERDLCAweDhBLCAweEVBLCAweEE2LCAweERDLCAweDhCLCAvKiAweENDLTB4Q0YgKi8KKwkweERDLCAweDhDLCAweERDLCAweDhELCAweERDLCAweDhFLCAweERDLCAweDhGLCAvKiAweEQwLTB4RDMgKi8KKwkweERDLCAweDkwLCAweERDLCAweDkxLCAweERDLCAweDkyLCAweERDLCAweDkzLCAvKiAweEQ0LTB4RDcgKi8KKwkweERDLCAweDk0LCAweERDLCAweDk1LCAweERDLCAweDk2LCAweERDLCAweDk3LCAvKiAweEQ4LTB4REIgKi8KKwkweERDLCAweDk4LCAweERDLCAweDk5LCAweERDLCAweDlBLCAweERDLCAweDlCLCAvKiAweERDLTB4REYgKi8KKwkweERDLCAweDlDLCAweERDLCAweDlELCAweERDLCAweDlFLCAweERDLCAweDlGLCAvKiAweEUwLTB4RTMgKi8KKwkweERDLCAweEEwLCAweERELCAweDQwLCAweERELCAweDQxLCAweERELCAweDQyLCAvKiAweEU0LTB4RTcgKi8KKwkweERELCAweDQzLCAweERELCAweDQ0LCAweERELCAweDQ1LCAweERELCAweDQ2LCAvKiAweEU4LTB4RUIgKi8KKwkweERELCAweDQ3LCAweERELCAweDQ4LCAweERELCAweDQ5LCAweERELCAweDRBLCAvKiAweEVDLTB4RUYgKi8KKwkweERELCAweDRCLCAweERELCAweDRDLCAweERELCAweDRELCAweERELCAweDRFLCAvKiAweEYwLTB4RjMgKi8KKwkweERELCAweDRGLCAweERELCAweDUwLCAweERELCAweDUxLCAweERELCAweDUyLCAvKiAweEY0LTB4RjcgKi8KKwkweERELCAweDUzLCAweERELCAweDU0LCAweERELCAweDU1LCAweERELCAweDU2LCAvKiAweEY4LTB4RkIgKi8KKwkweERELCAweDU3LCAweERELCAweDU4LCAweERELCAweDU5LCAweERELCAweDVBLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184Rls1MTJdID0geworCTB4REQsIDB4NUIsIDB4REQsIDB4NUMsIDB4REQsIDB4NUQsIDB4REQsIDB4NUUsIC8qIDB4MDAtMHgwMyAqLworCTB4REQsIDB4NUYsIDB4REQsIDB4NjAsIDB4REQsIDB4NjEsIDB4REQsIDB4NjIsIC8qIDB4MDQtMHgwNyAqLworCTB4REQsIDB4NjMsIDB4REQsIDB4NjQsIDB4REQsIDB4NjUsIDB4REQsIDB4NjYsIC8qIDB4MDgtMHgwQiAqLworCTB4REQsIDB4NjcsIDB4REQsIDB4NjgsIDB4REQsIDB4NjksIDB4REQsIDB4NkEsIC8qIDB4MEMtMHgwRiAqLworCTB4REQsIDB4NkIsIDB4REQsIDB4NkMsIDB4REQsIDB4NkQsIDB4REQsIDB4NkUsIC8qIDB4MTAtMHgxMyAqLworCTB4REQsIDB4NkYsIDB4REQsIDB4NzAsIDB4REQsIDB4NzEsIDB4REQsIDB4NzIsIC8qIDB4MTQtMHgxNyAqLworCTB4REQsIDB4NzMsIDB4REQsIDB4NzQsIDB4REQsIDB4NzUsIDB4REQsIDB4NzYsIC8qIDB4MTgtMHgxQiAqLworCTB4REQsIDB4NzcsIDB4REQsIDB4NzgsIDB4REQsIDB4NzksIDB4REQsIDB4N0EsIC8qIDB4MUMtMHgxRiAqLworCTB4REQsIDB4N0IsIDB4REQsIDB4N0MsIDB4REQsIDB4N0QsIDB4REQsIDB4N0UsIC8qIDB4MjAtMHgyMyAqLworCTB4REQsIDB4ODAsIDB4REQsIDB4ODEsIDB4REQsIDB4ODIsIDB4REQsIDB4ODMsIC8qIDB4MjQtMHgyNyAqLworCTB4REQsIDB4ODQsIDB4REQsIDB4ODUsIDB4REQsIDB4ODYsIDB4REQsIDB4ODcsIC8qIDB4MjgtMHgyQiAqLworCTB4REQsIDB4ODgsIDB4REQsIDB4ODksIDB4REQsIDB4OEEsIDB4REQsIDB4OEIsIC8qIDB4MkMtMHgyRiAqLworCTB4REQsIDB4OEMsIDB4REQsIDB4OEQsIDB4REQsIDB4OEUsIDB4REQsIDB4OEYsIC8qIDB4MzAtMHgzMyAqLworCTB4REQsIDB4OTAsIDB4REQsIDB4OTEsIDB4REQsIDB4OTIsIDB4REQsIDB4OTMsIC8qIDB4MzQtMHgzNyAqLworCTB4REQsIDB4OTQsIDB4REQsIDB4OTUsIDB4REQsIDB4OTYsIDB4REQsIDB4OTcsIC8qIDB4MzgtMHgzQiAqLworCTB4REQsIDB4OTgsIDB4REQsIDB4OTksIDB4REQsIDB4OUEsIDB4REQsIDB4OUIsIC8qIDB4M0MtMHgzRiAqLworCTB4REQsIDB4OUMsIDB4REQsIDB4OUQsIDB4REQsIDB4OUUsIDB4REQsIDB4OUYsIC8qIDB4NDAtMHg0MyAqLworCTB4REQsIDB4QTAsIDB4REUsIDB4NDAsIDB4REUsIDB4NDEsIDB4REUsIDB4NDIsIC8qIDB4NDQtMHg0NyAqLworCTB4REUsIDB4NDMsIDB4REUsIDB4NDQsIDB4REUsIDB4NDUsIDB4REUsIDB4NDYsIC8qIDB4NDgtMHg0QiAqLworCTB4REUsIDB4NDcsIDB4REUsIDB4NDgsIDB4REUsIDB4NDksIDB4REUsIDB4NEEsIC8qIDB4NEMtMHg0RiAqLworCTB4REUsIDB4NEIsIDB4REUsIDB4NEMsIDB4REUsIDB4NEQsIDB4REUsIDB4NEUsIC8qIDB4NTAtMHg1MyAqLworCTB4REUsIDB4NEYsIDB4REUsIDB4NTAsIDB4REUsIDB4NTEsIDB4REUsIDB4NTIsIC8qIDB4NTQtMHg1NyAqLworCTB4REUsIDB4NTMsIDB4REUsIDB4NTQsIDB4REUsIDB4NTUsIDB4REUsIDB4NTYsIC8qIDB4NTgtMHg1QiAqLworCTB4REUsIDB4NTcsIDB4REUsIDB4NTgsIDB4REUsIDB4NTksIDB4REUsIDB4NUEsIC8qIDB4NUMtMHg1RiAqLworCTB4REUsIDB4NUIsIDB4REUsIDB4NUMsIDB4REUsIDB4NUQsIDB4REUsIDB4NUUsIC8qIDB4NjAtMHg2MyAqLworCTB4REUsIDB4NUYsIDB4REUsIDB4NjAsIDB4QjMsIDB4QjUsIDB4RDQsIDB4RkUsIC8qIDB4NjQtMHg2NyAqLworCTB4QjksIDB4RUMsIDB4RDAsIDB4RjksIDB4REUsIDB4NjEsIDB4RTksIDB4RUQsIC8qIDB4NjgtMHg2QiAqLworCTB4RDcsIDB4QUEsIDB4RTksIDB4RUUsIDB4QzIsIDB4RDYsIDB4QzgsIDB4RUQsIC8qIDB4NkMtMHg2RiAqLworCTB4QkEsIDB4RTQsIDB4RTksIDB4RUYsIDB4RTksIDB4RjAsIDB4RTksIDB4RjEsIC8qIDB4NzAtMHg3MyAqLworCTB4RDYsIDB4RTEsIDB4RTksIDB4RjIsIDB4RTksIDB4RjMsIDB4RTksIDB4RjUsIC8qIDB4NzQtMHg3NyAqLworCTB4RTksIDB4RjQsIDB4RTksIDB4RjYsIDB4RTksIDB4RjcsIDB4QzcsIDB4RTEsIC8qIDB4NzgtMHg3QiAqLworCTB4RTksIDB4RjgsIDB4RDQsIDB4RDgsIDB4RTksIDB4RjksIDB4QkQsIDB4Q0UsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4REUsIDB4NjIsIDB4RTksIDB4RkEsIDB4RTksIDB4RkIsIDB4QkQsIDB4Q0YsIC8qIDB4ODAtMHg4MyAqLworCTB4RTksIDB4RkMsIDB4QjgsIDB4QTgsIDB4QzEsIDB4QkUsIDB4RTksIDB4RkQsIC8qIDB4ODQtMHg4NyAqLworCTB4QjEsIDB4QjIsIDB4QkIsIDB4RDQsIDB4QjksIDB4RjUsIDB4RTksIDB4RkUsIC8qIDB4ODgtMHg4QiAqLworCTB4REUsIDB4NjMsIDB4RUEsIDB4QTEsIDB4RUEsIDB4QTIsIDB4RUEsIDB4QTMsIC8qIDB4OEMtMHg4RiAqLworCTB4QjcsIDB4RjgsIDB4QkMsIDB4QUQsIDB4REUsIDB4NjQsIDB4Q0EsIDB4RTQsIC8qIDB4OTAtMHg5MyAqLworCTB4RTAsIDB4Q0UsIDB4RDQsIDB4QUYsIDB4Q0YsIDB4QkQsIDB4RDUsIDB4QjcsIC8qIDB4OTQtMHg5NyAqLworCTB4RUEsIDB4QTQsIDB4RDUsIDB4REUsIDB4RUEsIDB4QTUsIDB4RDAsIDB4QzEsIC8qIDB4OTgtMHg5QiAqLworCTB4QjksIDB4QkMsIDB4REUsIDB4NjUsIDB4QjQsIDB4QzcsIDB4QjEsIDB4RDksIC8qIDB4OUMtMHg5RiAqLworCTB4REUsIDB4NjYsIDB4REUsIDB4NjcsIDB4REUsIDB4NjgsIDB4QzAsIDB4QjEsIC8qIDB4QTAtMHhBMyAqLworCTB4REUsIDB4NjksIDB4REUsIDB4NkEsIDB4REUsIDB4NkIsIDB4REUsIDB4NkMsIC8qIDB4QTQtMHhBNyAqLworCTB4QjEsIDB4RTYsIDB4QjEsIDB4RTcsIDB4REUsIDB4NkQsIDB4QjEsIDB4RTgsIC8qIDB4QTgtMHhBQiAqLworCTB4REUsIDB4NkUsIDB4REUsIDB4NkYsIDB4REUsIDB4NzAsIDB4REUsIDB4NzEsIC8qIDB4QUMtMHhBRiAqLworCTB4QjMsIDB4QkQsIDB4QzgsIDB4RTgsIDB4REUsIDB4NzIsIDB4REUsIDB4NzMsIC8qIDB4QjAtMHhCMyAqLworCTB4REUsIDB4NzQsIDB4REUsIDB4NzUsIDB4RTUsIDB4QzEsIDB4REUsIDB4NzYsIC8qIDB4QjQtMHhCNyAqLworCTB4REUsIDB4NzcsIDB4QjEsIDB4REYsIDB4REUsIDB4NzgsIDB4REUsIDB4NzksIC8qIDB4QjgtMHhCQiAqLworCTB4REUsIDB4N0EsIDB4QzEsIDB4QzksIDB4QjQsIDB4RUYsIDB4REUsIDB4N0IsIC8qIDB4QkMtMHhCRiAqLworCTB4REUsIDB4N0MsIDB4QzcsIDB4QTgsIDB4RDMsIDB4RDgsIDB4REUsIDB4N0QsIC8qIDB4QzAtMHhDMyAqLworCTB4QzYsIDB4RjksIDB4RDEsIDB4QjgsIDB4REUsIDB4N0UsIDB4QjksIDB4RkQsIC8qIDB4QzQtMHhDNyAqLworCTB4QzIsIDB4RjUsIDB4REUsIDB4ODAsIDB4REUsIDB4ODEsIDB4REUsIDB4ODIsIC8qIDB4QzgtMHhDQiAqLworCTB4REUsIDB4ODMsIDB4REUsIDB4ODQsIDB4RDMsIDB4QUQsIDB4REUsIDB4ODUsIC8qIDB4Q0MtMHhDRiAqLworCTB4RDQsIDB4Q0IsIDB4QkQsIDB4RkMsIDB4REUsIDB4ODYsIDB4RTUsIDB4QzIsIC8qIDB4RDAtMHhEMyAqLworCTB4QjcsIDB4QjUsIDB4RTUsIDB4QzMsIDB4REUsIDB4ODcsIDB4REUsIDB4ODgsIC8qIDB4RDQtMHhENyAqLworCTB4QkIsIDB4QjksIDB4RDUsIDB4RTIsIDB4REUsIDB4ODksIDB4QkQsIDB4RjgsIC8qIDB4RDgtMHhEQiAqLworCTB4RDQsIDB4QjYsIDB4Q0UsIDB4QTUsIDB4QzEsIDB4QUMsIDB4QjMsIDB4RDksIC8qIDB4REMtMHhERiAqLworCTB4REUsIDB4OEEsIDB4REUsIDB4OEIsIDB4Q0MsIDB4RjYsIDB4REUsIDB4OEMsIC8qIDB4RTAtMHhFMyAqLworCTB4RTUsIDB4QzYsIDB4RTUsIDB4QzQsIDB4RTUsIDB4QzgsIDB4REUsIDB4OEQsIC8qIDB4RTQtMHhFNyAqLworCTB4RTUsIDB4Q0EsIDB4RTUsIDB4QzcsIDB4QjUsIDB4Q0YsIDB4QzYsIDB4QzgsIC8qIDB4RTgtMHhFQiAqLworCTB4REUsIDB4OEUsIDB4QjUsIDB4RkMsIDB4RTUsIDB4QzUsIDB4REUsIDB4OEYsIC8qIDB4RUMtMHhFRiAqLworCTB4Q0EsIDB4RjYsIDB4REUsIDB4OTAsIDB4REUsIDB4OTEsIDB4RTUsIDB4QzksIC8qIDB4RjAtMHhGMyAqLworCTB4REUsIDB4OTIsIDB4REUsIDB4OTMsIDB4REUsIDB4OTQsIDB4QzMsIDB4RDQsIC8qIDB4RjQtMHhGNyAqLworCTB4QjEsIDB4QzUsIDB4QkMsIDB4QTMsIDB4REUsIDB4OTUsIDB4REUsIDB4OTYsIC8qIDB4RjgtMHhGQiAqLworCTB4REUsIDB4OTcsIDB4RDcsIDB4QjcsIDB4REUsIDB4OTgsIDB4REUsIDB4OTksIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzkwWzUxMl0gPSB7CisJMHhDRCwgMHhDQiwgMHhDQiwgMHhDRCwgMHhDQSwgMHhDQSwgMHhDQywgMHhEMywgLyogMHgwMC0weDAzICovCisJMHhFNSwgMHhDQywgMHhFNSwgMHhDQiwgMHhDNCwgMHhFNiwgMHhERSwgMHg5QSwgLyogMHgwNC0weDA3ICovCisJMHhERSwgMHg5QiwgMHhEMSwgMHhBMSwgMHhEMSwgMHhCNywgMHhFNSwgMHhDRCwgLyogMHgwOC0weDBCICovCisJMHhERSwgMHg5QywgMHhFNSwgMHhEMCwgMHhERSwgMHg5RCwgMHhDRCwgMHhCOCwgLyogMHgwQy0weDBGICovCisJMHhENiwgMHhGMCwgMHhFNSwgMHhDRiwgMHhCNSwgMHhERCwgMHhERSwgMHg5RSwgLyogMHgxMC0weDEzICovCisJMHhDRCwgMHhCRSwgMHhERSwgMHg5RiwgMHhFNSwgMHhEMSwgMHhCNiwgMHhCQSwgLyogMHgxNC0weDE3ICovCisJMHhERSwgMHhBMCwgMHhERiwgMHg0MCwgMHhDRCwgMHhBOCwgMHhCOSwgMHhFNCwgLyogMHgxOC0weDFCICovCisJMHhERiwgMHg0MSwgMHhDQSwgMHhDNSwgMHhCMywgMHhEMSwgMHhDQiwgMHhEOSwgLyogMHgxQy0weDFGICovCisJMHhENCwgMHhFQywgMHhFNSwgMHhEMiwgMHhCNywgMHhFQSwgMHhERiwgMHg0MiwgLyogMHgyMC0weDIzICovCisJMHhERiwgMHg0MywgMHhERiwgMHg0NCwgMHhFNSwgMHhDRSwgMHhERiwgMHg0NSwgLyogMHgyNC0weDI3ICovCisJMHhERiwgMHg0NiwgMHhERiwgMHg0NywgMHhERiwgMHg0OCwgMHhERiwgMHg0OSwgLyogMHgyOC0weDJCICovCisJMHhERiwgMHg0QSwgMHhFNSwgMHhENSwgMHhCNCwgMHhGRSwgMHhFNSwgMHhENiwgLyogMHgyQy0weDJGICovCisJMHhERiwgMHg0QiwgMHhERiwgMHg0QywgMHhERiwgMHg0RCwgMHhERiwgMHg0RSwgLyogMHgzMC0weDMzICovCisJMHhERiwgMHg0RiwgMHhFNSwgMHhEMywgMHhFNSwgMHhENCwgMHhERiwgMHg1MCwgLyogMHgzNC0weDM3ICovCisJMHhEMiwgMHhERCwgMHhERiwgMHg1MSwgMHhERiwgMHg1MiwgMHhDMiwgMHhERiwgLyogMHgzOC0weDNCICovCisJMHhCMSwgMHhDNiwgMHhERiwgMHg1MywgMHhEMywgMHhFMiwgMHhERiwgMHg1NCwgLyogMHgzQy0weDNGICovCisJMHhERiwgMHg1NSwgMHhCNiwgMHhERCwgMHhDQiwgMHhFQywgMHhERiwgMHg1NiwgLyogMHg0MC0weDQzICovCisJMHhFNSwgMHhENywgMHhERiwgMHg1NywgMHhERiwgMHg1OCwgMHhEMywgMHhGNiwgLyogMHg0NC0weDQ3ICovCisJMHhERiwgMHg1OSwgMHhERiwgMHg1QSwgMHhERiwgMHg1QiwgMHhERiwgMHg1QywgLyogMHg0OC0weDRCICovCisJMHhERiwgMHg1RCwgMHhCMSwgMHhFOSwgMHhERiwgMHg1RSwgMHhCNiwgMHhGNCwgLyogMHg0Qy0weDRGICovCisJMHhFNSwgMHhEQSwgMHhFNSwgMHhEOCwgMHhFNSwgMHhEOSwgMHhCNSwgMHhDMCwgLyogMHg1MC0weDUzICovCisJMHhERiwgMHg1RiwgMHhERiwgMHg2MCwgMHhERiwgMHg2MSwgMHhEMiwgMHhDNSwgLyogMHg1NC0weDU3ICovCisJMHhFNSwgMHhEQywgMHhERiwgMHg2MiwgMHhERiwgMHg2MywgMHhFNSwgMHhERSwgLyogMHg1OC0weDVCICovCisJMHhERiwgMHg2NCwgMHhERiwgMHg2NSwgMHhERiwgMHg2NiwgMHhERiwgMHg2NywgLyogMHg1Qy0weDVGICovCisJMHhERiwgMHg2OCwgMHhERiwgMHg2OSwgMHhFNSwgMHhERCwgMHhDNywgMHhCMiwgLyogMHg2MC0weDYzICovCisJMHhERiwgMHg2QSwgMHhEMiwgMHhBMywgMHhERiwgMHg2QiwgMHhERiwgMHg2QywgLyogMHg2NC0weDY3ICovCisJMHhFNSwgMHhEQiwgMHhERiwgMHg2RCwgMHhERiwgMHg2RSwgMHhERiwgMHg2RiwgLyogMHg2OC0weDZCICovCisJMHhERiwgMHg3MCwgMHhENCwgMHhFMiwgMHhENSwgMHhEQSwgMHhERiwgMHg3MSwgLyogMHg2Qy0weDZGICovCisJMHhERiwgMHg3MiwgMHhERiwgMHg3MywgMHhERiwgMHg3NCwgMHhERiwgMHg3NSwgLyogMHg3MC0weDczICovCisJMHhFNSwgMHhFMCwgMHhENywgMHhGMSwgMHhERiwgMHg3NiwgMHhERiwgMHg3NywgLyogMHg3NC0weDc3ICovCisJMHhERiwgMHg3OCwgMHhERiwgMHg3OSwgMHhERiwgMHg3QSwgMHhERiwgMHg3QiwgLyogMHg3OC0weDdCICovCisJMHhERiwgMHg3QywgMHhFNSwgMHhFMSwgMHhERiwgMHg3RCwgMHhCMSwgMHhEQywgLyogMHg3Qy0weDdGICovCisJCisJMHhEMSwgMHhGQiwgMHhERiwgMHg3RSwgMHhFNSwgMHhFMiwgMHhFNSwgMHhFNCwgLyogMHg4MC0weDgzICovCisJMHhERiwgMHg4MCwgMHhERiwgMHg4MSwgMHhERiwgMHg4MiwgMHhERiwgMHg4MywgLyogMHg4NC0weDg3ICovCisJMHhFNSwgMHhFMywgMHhERiwgMHg4NCwgMHhERiwgMHg4NSwgMHhFNSwgMHhFNSwgLyogMHg4OC0weDhCICovCisJMHhERiwgMHg4NiwgMHhERiwgMHg4NywgMHhERiwgMHg4OCwgMHhERiwgMHg4OSwgLyogMHg4Qy0weDhGICovCisJMHhERiwgMHg4QSwgMHhEMiwgMHhEOCwgMHhERiwgMHg4QiwgMHhCNSwgMHhDQiwgLyogMHg5MC0weDkzICovCisJMHhERiwgMHg4QywgMHhFNywgMHhERiwgMHhERiwgMHg4RCwgMHhEQSwgMHhGNSwgLyogMHg5NC0weDk3ICovCisJMHhERiwgMHg4RSwgMHhEQSwgMHhGOCwgMHhERiwgMHg4RiwgMHhEQSwgMHhGNiwgLyogMHg5OC0weDlCICovCisJMHhERiwgMHg5MCwgMHhEQSwgMHhGNywgMHhERiwgMHg5MSwgMHhERiwgMHg5MiwgLyogMHg5Qy0weDlGICovCisJMHhERiwgMHg5MywgMHhEQSwgMHhGQSwgMHhEMCwgMHhDRiwgMHhDNCwgMHhDNywgLyogMHhBMC0weEEzICovCisJMHhERiwgMHg5NCwgMHhERiwgMHg5NSwgMHhCMCwgMHhFRSwgMHhERiwgMHg5NiwgLyogMHhBNC0weEE3ICovCisJMHhERiwgMHg5NywgMHhERiwgMHg5OCwgMHhEMCwgMHhCMCwgMHhERiwgMHg5OSwgLyogMHhBOC0weEFCICovCisJMHhEQSwgMHhGOSwgMHhERiwgMHg5QSwgMHhEMywgMHhDQSwgMHhCQSwgMHhBQSwgLyogMHhBQy0weEFGICovCisJMHhEQiwgMHhBMiwgMHhDNywgMHhGMSwgMHhERiwgMHg5QiwgMHhEQSwgMHhGQywgLyogMHhCMC0weEIzICovCisJMHhEQSwgMHhGQiwgMHhDOSwgMHhEQiwgMHhEQSwgMHhGRCwgMHhERiwgMHg5QywgLyogMHhCNC0weEI3ICovCisJMHhEQiwgMHhBMSwgMHhENywgMHhERSwgMHhEQSwgMHhGRSwgMHhDMSwgMHhEQSwgLyogMHhCOC0weEJCICovCisJMHhERiwgMHg5RCwgMHhERiwgMHg5RSwgMHhEQiwgMHhBNSwgMHhERiwgMHg5RiwgLyogMHhCQy0weEJGICovCisJMHhERiwgMHhBMCwgMHhEMywgMHhGNCwgMHhFMCwgMHg0MCwgMHhFMCwgMHg0MSwgLyogMHhDMC0weEMzICovCisJMHhEQiwgMHhBNywgMHhEQiwgMHhBNCwgMHhFMCwgMHg0MiwgMHhEQiwgMHhBOCwgLyogMHhDNC0weEM3ICovCisJMHhFMCwgMHg0MywgMHhFMCwgMHg0NCwgMHhCRCwgMHhCQywgMHhFMCwgMHg0NSwgLyogMHhDOC0weENCICovCisJMHhFMCwgMHg0NiwgMHhFMCwgMHg0NywgMHhDMCwgMHhDOSwgMHhEQiwgMHhBMywgLyogMHhDQy0weENGICovCisJMHhEQiwgMHhBNiwgMHhENiwgMHhBMywgMHhFMCwgMHg0OCwgMHhEQiwgMHhBOSwgLyogMHhEMC0weEQzICovCisJMHhFMCwgMHg0OSwgMHhFMCwgMHg0QSwgMHhFMCwgMHg0QiwgMHhEQiwgMHhBRCwgLyogMHhENC0weEQ3ICovCisJMHhFMCwgMHg0QywgMHhFMCwgMHg0RCwgMHhFMCwgMHg0RSwgMHhEQiwgMHhBRSwgLyogMHhEOC0weERCICovCisJMHhEQiwgMHhBQywgMHhCQSwgMHhDMiwgMHhFMCwgMHg0RiwgMHhFMCwgMHg1MCwgLyogMHhEQy0weERGICovCisJMHhFMCwgMHg1MSwgMHhCRiwgMHhBNCwgMHhEQiwgMHhBQiwgMHhFMCwgMHg1MiwgLyogMHhFMC0weEUzICovCisJMHhFMCwgMHg1MywgMHhFMCwgMHg1NCwgMHhEQiwgMHhBQSwgMHhENCwgMHhDNywgLyogMHhFNC0weEU3ICovCisJMHhCMiwgMHhCRiwgMHhFMCwgMHg1NSwgMHhFMCwgMHg1NiwgMHhEQiwgMHhBRiwgLyogMHhFOC0weEVCICovCisJMHhFMCwgMHg1NywgMHhCOSwgMHhGOSwgMHhFMCwgMHg1OCwgMHhEQiwgMHhCMCwgLyogMHhFQy0weEVGICovCisJMHhFMCwgMHg1OSwgMHhFMCwgMHg1QSwgMHhFMCwgMHg1QiwgMHhFMCwgMHg1QywgLyogMHhGMC0weEYzICovCisJMHhCMywgMHhCQiwgMHhFMCwgMHg1RCwgMHhFMCwgMHg1RSwgMHhFMCwgMHg1RiwgLyogMHhGNC0weEY3ICovCisJMHhCNSwgMHhBNiwgMHhFMCwgMHg2MCwgMHhFMCwgMHg2MSwgMHhFMCwgMHg2MiwgLyogMHhGOC0weEZCICovCisJMHhFMCwgMHg2MywgMHhCNiwgMHhCQywgMHhEQiwgMHhCMSwgMHhFMCwgMHg2NCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOTFbNTEyXSA9IHsKKwkweEUwLCAweDY1LCAweEUwLCAweDY2LCAweEI2LCAweEY1LCAweEUwLCAweDY3LCAvKiAweDAwLTB4MDMgKi8KKwkweERCLCAweEIyLCAweEUwLCAweDY4LCAweEUwLCAweDY5LCAweEUwLCAweDZBLCAvKiAweDA0LTB4MDcgKi8KKwkweEUwLCAweDZCLCAweEUwLCAweDZDLCAweEUwLCAweDZELCAweEUwLCAweDZFLCAvKiAweDA4LTB4MEIgKi8KKwkweEUwLCAweDZGLCAweEUwLCAweDcwLCAweEUwLCAweDcxLCAweEUwLCAweDcyLCAvKiAweDBDLTB4MEYgKi8KKwkweEUwLCAweDczLCAweEUwLCAweDc0LCAweEUwLCAweDc1LCAweEUwLCAweDc2LCAvKiAweDEwLTB4MTMgKi8KKwkweEUwLCAweDc3LCAweEUwLCAweDc4LCAweEUwLCAweDc5LCAweEUwLCAweDdBLCAvKiAweDE0LTB4MTcgKi8KKwkweEUwLCAweDdCLCAweEIxLCAweEM5LCAweEUwLCAweDdDLCAweEUwLCAweDdELCAvKiAweDE4LTB4MUIgKi8KKwkweEUwLCAweDdFLCAweEUwLCAweDgwLCAweERCLCAweEI0LCAweEUwLCAweDgxLCAvKiAweDFDLTB4MUYgKi8KKwkweEUwLCAweDgyLCAweEUwLCAweDgzLCAweERCLCAweEIzLCAweERCLCAweEI1LCAvKiAweDIwLTB4MjMgKi8KKwkweEUwLCAweDg0LCAweEUwLCAweDg1LCAweEUwLCAweDg2LCAweEUwLCAweDg3LCAvKiAweDI0LTB4MjcgKi8KKwkweEUwLCAweDg4LCAweEUwLCAweDg5LCAweEUwLCAweDhBLCAweEUwLCAweDhCLCAvKiAweDI4LTB4MkIgKi8KKwkweEUwLCAweDhDLCAweEUwLCAweDhELCAweEUwLCAweDhFLCAweERCLCAweEI3LCAvKiAweDJDLTB4MkYgKi8KKwkweEUwLCAweDhGLCAweERCLCAweEI2LCAweEUwLCAweDkwLCAweEUwLCAweDkxLCAvKiAweDMwLTB4MzMgKi8KKwkweEUwLCAweDkyLCAweEUwLCAweDkzLCAweEUwLCAweDk0LCAweEUwLCAweDk1LCAvKiAweDM0LTB4MzcgKi8KKwkweEUwLCAweDk2LCAweERCLCAweEI4LCAweEUwLCAweDk3LCAweEUwLCAweDk4LCAvKiAweDM4LTB4M0IgKi8KKwkweEUwLCAweDk5LCAweEUwLCAweDlBLCAweEUwLCAweDlCLCAweEUwLCAweDlDLCAvKiAweDNDLTB4M0YgKi8KKwkweEUwLCAweDlELCAweEUwLCAweDlFLCAweEUwLCAweDlGLCAweERCLCAweEI5LCAvKiAweDQwLTB4NDMgKi8KKwkweEUwLCAweEEwLCAweEUxLCAweDQwLCAweERCLCAweEJBLCAweEUxLCAweDQxLCAvKiAweDQ0LTB4NDcgKi8KKwkweEUxLCAweDQyLCAweEQzLCAweENGLCAweEY0LCAweEZBLCAweEM3LCAweEY1LCAvKiAweDQ4LTB4NEIgKi8KKwkweEQ3LCAweEMzLCAweEM1LCAweEU0LCAweEY0LCAweEZDLCAweEY0LCAweEZELCAvKiAweDRDLTB4NEYgKi8KKwkweEY0LCAweEZCLCAweEUxLCAweDQzLCAweEJFLCAweEM2LCAweEUxLCAweDQ0LCAvKiAweDUwLTB4NTMgKi8KKwkweEUxLCAweDQ1LCAweEUxLCAweDQ2LCAweEUxLCAweDQ3LCAweEQwLCAweEVGLCAvKiAweDU0LTB4NTcgKi8KKwkweEUxLCAweDQ4LCAweEUxLCAweDQ5LCAweEI3LCAweEQzLCAweEUxLCAweDRBLCAvKiAweDU4LTB4NUIgKi8KKwkweEUxLCAweDRCLCAweEQ0LCAweENELCAweENDLCAweEFBLCAweEUxLCAweDRDLCAvKiAweDVDLTB4NUYgKi8KKwkweEUxLCAweDRELCAweEY1LCAweEEyLCAweEY1LCAweEExLCAweEJBLCAweEE4LCAvKiAweDYwLTB4NjMgKi8KKwkweEY0LCAweEZFLCAweENCLCAweEQ2LCAweEUxLCAweDRFLCAweEUxLCAweDRGLCAvKiAweDY0LTB4NjcgKi8KKwkweEUxLCAweDUwLCAweEY1LCAweEE0LCAweEMwLCAweEQyLCAweEUxLCAweDUxLCAvKiAweDY4LTB4NkIgKi8KKwkweEIzLCAweEVBLCAweEUxLCAweDUyLCAweENELCAweEFBLCAweEY1LCAweEE1LCAvKiAweDZDLTB4NkYgKi8KKwkweEY1LCAweEEzLCAweEJELCAweEI0LCAweEY1LCAweEE4LCAweEUxLCAweDUzLCAvKiAweDcwLTB4NzMgKi8KKwkweEY1LCAweEE5LCAweEJELCAweENELCAweEMzLCAweEI4LCAweEJGLCAweEUxLCAvKiAweDc0LTB4NzcgKi8KKwkweENCLCAweEUxLCAweEY1LCAweEFBLCAweEUxLCAweDU0LCAweEUxLCAweDU1LCAvKiAweDc4LTB4N0IgKi8KKwkweEUxLCAweDU2LCAweEY1LCAweEE2LCAweEY1LCAweEE3LCAweEM0LCAweEYwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEUxLCAweDU3LCAweEUxLCAweDU4LCAweEUxLCAweDU5LCAweEUxLCAweDVBLCAvKiAweDgwLTB4ODMgKi8KKwkweEUxLCAweDVCLCAweEY1LCAweEFDLCAweEUxLCAweDVDLCAweEI0LCAweEJDLCAvKiAweDg0LTB4ODcgKi8KKwkweEUxLCAweDVELCAweEQ3LCAweEVELCAweEUxLCAweDVFLCAweEI0LCAweEQ3LCAvKiAweDg4LTB4OEIgKi8KKwkweEY1LCAweEFCLCAweEY1LCAweEFFLCAweEUxLCAweDVGLCAweEUxLCAweDYwLCAvKiAweDhDLTB4OEYgKi8KKwkweEY1LCAweEFELCAweEY1LCAweEFGLCAweEQwLCAweEQxLCAweEUxLCAweDYxLCAvKiAweDkwLTB4OTMgKi8KKwkweEUxLCAweDYyLCAweEUxLCAweDYzLCAweEUxLCAweDY0LCAweEUxLCAweDY1LCAvKiAweDk0LTB4OTcgKi8KKwkweEUxLCAweDY2LCAweEUxLCAweDY3LCAweEMzLCAweEQxLCAweEM4LCAweEE5LCAvKiAweDk4LTB4OUIgKi8KKwkweEUxLCAweDY4LCAweEUxLCAweDY5LCAweEUxLCAweDZBLCAweEUxLCAweDZCLCAvKiAweDlDLTB4OUYgKi8KKwkweEUxLCAweDZDLCAweEUxLCAweDZELCAweEY1LCAweEIwLCAweEY1LCAweEIxLCAvKiAweEEwLTB4QTMgKi8KKwkweEUxLCAweDZFLCAweEUxLCAweDZGLCAweEUxLCAweDcwLCAweEUxLCAweDcxLCAvKiAweEE0LTB4QTcgKi8KKwkweEUxLCAweDcyLCAweEUxLCAweDczLCAweEY1LCAweEIyLCAweEUxLCAweDc0LCAvKiAweEE4LTB4QUIgKi8KKwkweEUxLCAweDc1LCAweEY1LCAweEIzLCAweEY1LCAweEI0LCAweEY1LCAweEI1LCAvKiAweEFDLTB4QUYgKi8KKwkweEUxLCAweDc2LCAweEUxLCAweDc3LCAweEUxLCAweDc4LCAweEUxLCAweDc5LCAvKiAweEIwLTB4QjMgKi8KKwkweEY1LCAweEI3LCAweEY1LCAweEI2LCAweEUxLCAweDdBLCAweEUxLCAweDdCLCAvKiAweEI0LTB4QjcgKi8KKwkweEUxLCAweDdDLCAweEUxLCAweDdELCAweEY1LCAweEI4LCAweEUxLCAweDdFLCAvKiAweEI4LTB4QkIgKi8KKwkweEUxLCAweDgwLCAweEUxLCAweDgxLCAweEUxLCAweDgyLCAweEUxLCAweDgzLCAvKiAweEJDLTB4QkYgKi8KKwkweEUxLCAweDg0LCAweEUxLCAweDg1LCAweEUxLCAweDg2LCAweEUxLCAweDg3LCAvKiAweEMwLTB4QzMgKi8KKwkweEUxLCAweDg4LCAweEUxLCAweDg5LCAweEUxLCAweDhBLCAweEIyLCAweEM5LCAvKiAweEM0LTB4QzcgKi8KKwkweEUxLCAweDhCLCAweEQzLCAweEQ0LCAweENBLCAweENELCAweEUxLCAweDhDLCAvKiAweEM4LTB4Q0IgKi8KKwkweEMwLCAweEVGLCAweEQ2LCAweEQ4LCAweEQyLCAweEIwLCAweEMxLCAweEJGLCAvKiAweENDLTB4Q0YgKi8KKwkweEUxLCAweDhELCAweEJELCAweEYwLCAweEUxLCAweDhFLCAweEUxLCAweDhGLCAvKiAweEQwLTB4RDMgKi8KKwkweEUxLCAweDkwLCAweEUxLCAweDkxLCAweEUxLCAweDkyLCAweEUxLCAweDkzLCAvKiAweEQ0LTB4RDcgKi8KKwkweEUxLCAweDk0LCAweEUxLCAweDk1LCAweEUxLCAweDk2LCAweEUxLCAweDk3LCAvKiAweEQ4LTB4REIgKi8KKwkweEI4LCAweEFBLCAweEUxLCAweDk4LCAweEUxLCAweDk5LCAweEUxLCAweDlBLCAvKiAweERDLTB4REYgKi8KKwkweEUxLCAweDlCLCAweEUxLCAweDlDLCAweEUxLCAweDlELCAweEUxLCAweDlFLCAvKiAweEUwLTB4RTMgKi8KKwkweEUxLCAweDlGLCAweEUxLCAweEEwLCAweEUyLCAweDQwLCAweEUyLCAweDQxLCAvKiAweEU0LTB4RTcgKi8KKwkweEUyLCAweDQyLCAweEUyLCAweDQzLCAweEUyLCAweDQ0LCAweEUyLCAweDQ1LCAvKiAweEU4LTB4RUIgKi8KKwkweEUyLCAweDQ2LCAweEUyLCAweDQ3LCAweEUyLCAweDQ4LCAweEUyLCAweDQ5LCAvKiAweEVDLTB4RUYgKi8KKwkweEUyLCAweDRBLCAweEUyLCAweDRCLCAweEUyLCAweDRDLCAweEUyLCAweDRELCAvKiAweEYwLTB4RjMgKi8KKwkweEUyLCAweDRFLCAweEUyLCAweDRGLCAweEUyLCAweDUwLCAweEUyLCAweDUxLCAvKiAweEY0LTB4RjcgKi8KKwkweEUyLCAweDUyLCAweEUyLCAweDUzLCAweEUyLCAweDU0LCAweEUyLCAweDU1LCAvKiAweEY4LTB4RkIgKi8KKwkweEUyLCAweDU2LCAweEUyLCAweDU3LCAweEUyLCAweDU4LCAweEUyLCAweDU5LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185Mls1MTJdID0geworCTB4RTIsIDB4NUEsIDB4RTIsIDB4NUIsIDB4RTIsIDB4NUMsIDB4RTIsIDB4NUQsIC8qIDB4MDAtMHgwMyAqLworCTB4RTIsIDB4NUUsIDB4RTIsIDB4NUYsIDB4RTIsIDB4NjAsIDB4RTIsIDB4NjEsIC8qIDB4MDQtMHgwNyAqLworCTB4RTIsIDB4NjIsIDB4RTIsIDB4NjMsIDB4RTIsIDB4NjQsIDB4RTIsIDB4NjUsIC8qIDB4MDgtMHgwQiAqLworCTB4RTIsIDB4NjYsIDB4RTIsIDB4NjcsIDB4RTIsIDB4NjgsIDB4RTIsIDB4NjksIC8qIDB4MEMtMHgwRiAqLworCTB4RTIsIDB4NkEsIDB4RTIsIDB4NkIsIDB4RTIsIDB4NkMsIDB4RTIsIDB4NkQsIC8qIDB4MTAtMHgxMyAqLworCTB4RTIsIDB4NkUsIDB4RTIsIDB4NkYsIDB4RTIsIDB4NzAsIDB4RTIsIDB4NzEsIC8qIDB4MTQtMHgxNyAqLworCTB4RTIsIDB4NzIsIDB4RTIsIDB4NzMsIDB4RTIsIDB4NzQsIDB4RTIsIDB4NzUsIC8qIDB4MTgtMHgxQiAqLworCTB4RTIsIDB4NzYsIDB4RTIsIDB4NzcsIDB4RTIsIDB4NzgsIDB4RTIsIDB4NzksIC8qIDB4MUMtMHgxRiAqLworCTB4RTIsIDB4N0EsIDB4RTIsIDB4N0IsIDB4RTIsIDB4N0MsIDB4RTIsIDB4N0QsIC8qIDB4MjAtMHgyMyAqLworCTB4RTIsIDB4N0UsIDB4RTIsIDB4ODAsIDB4RTIsIDB4ODEsIDB4RTIsIDB4ODIsIC8qIDB4MjQtMHgyNyAqLworCTB4RTIsIDB4ODMsIDB4RTIsIDB4ODQsIDB4RTIsIDB4ODUsIDB4RTIsIDB4ODYsIC8qIDB4MjgtMHgyQiAqLworCTB4RTIsIDB4ODcsIDB4RTIsIDB4ODgsIDB4RTIsIDB4ODksIDB4RTIsIDB4OEEsIC8qIDB4MkMtMHgyRiAqLworCTB4RTIsIDB4OEIsIDB4RTIsIDB4OEMsIDB4RTIsIDB4OEQsIDB4RTIsIDB4OEUsIC8qIDB4MzAtMHgzMyAqLworCTB4RTIsIDB4OEYsIDB4RTIsIDB4OTAsIDB4RTIsIDB4OTEsIDB4RTIsIDB4OTIsIC8qIDB4MzQtMHgzNyAqLworCTB4RTIsIDB4OTMsIDB4RTIsIDB4OTQsIDB4RTIsIDB4OTUsIDB4RTIsIDB4OTYsIC8qIDB4MzgtMHgzQiAqLworCTB4RTIsIDB4OTcsIDB4RTIsIDB4OTgsIDB4RTIsIDB4OTksIDB4RTIsIDB4OUEsIC8qIDB4M0MtMHgzRiAqLworCTB4RTIsIDB4OUIsIDB4RTIsIDB4OUMsIDB4RTIsIDB4OUQsIDB4RTIsIDB4OUUsIC8qIDB4NDAtMHg0MyAqLworCTB4RTIsIDB4OUYsIDB4RTIsIDB4QTAsIDB4RTMsIDB4NDAsIDB4RTMsIDB4NDEsIC8qIDB4NDQtMHg0NyAqLworCTB4RTMsIDB4NDIsIDB4RTMsIDB4NDMsIDB4RTMsIDB4NDQsIDB4RTMsIDB4NDUsIC8qIDB4NDgtMHg0QiAqLworCTB4RTMsIDB4NDYsIDB4RTMsIDB4NDcsIDB4RTMsIDB4NDgsIDB4RTMsIDB4NDksIC8qIDB4NEMtMHg0RiAqLworCTB4RTMsIDB4NEEsIDB4RTMsIDB4NEIsIDB4RTMsIDB4NEMsIDB4RTMsIDB4NEQsIC8qIDB4NTAtMHg1MyAqLworCTB4RTMsIDB4NEUsIDB4RTMsIDB4NEYsIDB4RTMsIDB4NTAsIDB4RTMsIDB4NTEsIC8qIDB4NTQtMHg1NyAqLworCTB4RTMsIDB4NTIsIDB4RTMsIDB4NTMsIDB4RTMsIDB4NTQsIDB4RTMsIDB4NTUsIC8qIDB4NTgtMHg1QiAqLworCTB4RTMsIDB4NTYsIDB4RTMsIDB4NTcsIDB4RTMsIDB4NTgsIDB4RTMsIDB4NTksIC8qIDB4NUMtMHg1RiAqLworCTB4RTMsIDB4NUEsIDB4RTMsIDB4NUIsIDB4RTMsIDB4NUMsIDB4RTMsIDB4NUQsIC8qIDB4NjAtMHg2MyAqLworCTB4RTMsIDB4NUUsIDB4RTMsIDB4NUYsIDB4RTMsIDB4NjAsIDB4RTMsIDB4NjEsIC8qIDB4NjQtMHg2NyAqLworCTB4RTMsIDB4NjIsIDB4RTMsIDB4NjMsIDB4RTMsIDB4NjQsIDB4RTMsIDB4NjUsIC8qIDB4NjgtMHg2QiAqLworCTB4RTMsIDB4NjYsIDB4RTMsIDB4NjcsIDB4RTMsIDB4NjgsIDB4RTMsIDB4NjksIC8qIDB4NkMtMHg2RiAqLworCTB4RTMsIDB4NkEsIDB4RTMsIDB4NkIsIDB4RTMsIDB4NkMsIDB4RTMsIDB4NkQsIC8qIDB4NzAtMHg3MyAqLworCTB4QkMsIDB4RjgsIDB4RTMsIDB4NkUsIDB4RTMsIDB4NkYsIDB4RTMsIDB4NzAsIC8qIDB4NzQtMHg3NyAqLworCTB4RTMsIDB4NzEsIDB4RTMsIDB4NzIsIDB4RTMsIDB4NzMsIDB4RTMsIDB4NzQsIC8qIDB4NzgtMHg3QiAqLworCTB4RTMsIDB4NzUsIDB4RTMsIDB4NzYsIDB4RTMsIDB4NzcsIDB4RTMsIDB4NzgsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RTMsIDB4NzksIDB4RTMsIDB4N0EsIDB4RTMsIDB4N0IsIDB4RTMsIDB4N0MsIC8qIDB4ODAtMHg4MyAqLworCTB4RTMsIDB4N0QsIDB4RTMsIDB4N0UsIDB4RTMsIDB4ODAsIDB4RTMsIDB4ODEsIC8qIDB4ODQtMHg4NyAqLworCTB4RTMsIDB4ODIsIDB4RTMsIDB4ODMsIDB4RTMsIDB4ODQsIDB4RTMsIDB4ODUsIC8qIDB4ODgtMHg4QiAqLworCTB4RTMsIDB4ODYsIDB4RTMsIDB4ODcsIDB4RjYsIDB4QzYsIDB4RTMsIDB4ODgsIC8qIDB4OEMtMHg4RiAqLworCTB4RTMsIDB4ODksIDB4RTMsIDB4OEEsIDB4RTMsIDB4OEIsIDB4RTMsIDB4OEMsIC8qIDB4OTAtMHg5MyAqLworCTB4RTMsIDB4OEQsIDB4RTMsIDB4OEUsIDB4RTMsIDB4OEYsIDB4RTMsIDB4OTAsIC8qIDB4OTQtMHg5NyAqLworCTB4RTMsIDB4OTEsIDB4RTMsIDB4OTIsIDB4RTMsIDB4OTMsIDB4RTMsIDB4OTQsIC8qIDB4OTgtMHg5QiAqLworCTB4RTMsIDB4OTUsIDB4RTMsIDB4OTYsIDB4RTMsIDB4OTcsIDB4RTMsIDB4OTgsIC8qIDB4OUMtMHg5RiAqLworCTB4RTMsIDB4OTksIDB4RTMsIDB4OUEsIDB4RTMsIDB4OUIsIDB4RTMsIDB4OUMsIC8qIDB4QTAtMHhBMyAqLworCTB4RTMsIDB4OUQsIDB4RTMsIDB4OUUsIDB4RTMsIDB4OUYsIDB4RTMsIDB4QTAsIC8qIDB4QTQtMHhBNyAqLworCTB4RTQsIDB4NDAsIDB4RTQsIDB4NDEsIDB4RTQsIDB4NDIsIDB4RTQsIDB4NDMsIC8qIDB4QTgtMHhBQiAqLworCTB4RTQsIDB4NDQsIDB4RTQsIDB4NDUsIDB4RjYsIDB4QzcsIDB4RTQsIDB4NDYsIC8qIDB4QUMtMHhBRiAqLworCTB4RTQsIDB4NDcsIDB4RTQsIDB4NDgsIDB4RTQsIDB4NDksIDB4RTQsIDB4NEEsIC8qIDB4QjAtMHhCMyAqLworCTB4RTQsIDB4NEIsIDB4RTQsIDB4NEMsIDB4RTQsIDB4NEQsIDB4RTQsIDB4NEUsIC8qIDB4QjQtMHhCNyAqLworCTB4RTQsIDB4NEYsIDB4RTQsIDB4NTAsIDB4RTQsIDB4NTEsIDB4RTQsIDB4NTIsIC8qIDB4QjgtMHhCQiAqLworCTB4RTQsIDB4NTMsIDB4RTQsIDB4NTQsIDB4RTQsIDB4NTUsIDB4RTQsIDB4NTYsIC8qIDB4QkMtMHhCRiAqLworCTB4RTQsIDB4NTcsIDB4RTQsIDB4NTgsIDB4RTQsIDB4NTksIDB4RTQsIDB4NUEsIC8qIDB4QzAtMHhDMyAqLworCTB4RTQsIDB4NUIsIDB4RTQsIDB4NUMsIDB4RTQsIDB4NUQsIDB4RTQsIDB4NUUsIC8qIDB4QzQtMHhDNyAqLworCTB4RjYsIDB4QzgsIDB4RTQsIDB4NUYsIDB4RTQsIDB4NjAsIDB4RTQsIDB4NjEsIC8qIDB4QzgtMHhDQiAqLworCTB4RTQsIDB4NjIsIDB4RTQsIDB4NjMsIDB4RTQsIDB4NjQsIDB4RTQsIDB4NjUsIC8qIDB4Q0MtMHhDRiAqLworCTB4RTQsIDB4NjYsIDB4RTQsIDB4NjcsIDB4RTQsIDB4NjgsIDB4RTQsIDB4NjksIC8qIDB4RDAtMHhEMyAqLworCTB4RTQsIDB4NkEsIDB4RTQsIDB4NkIsIDB4RTQsIDB4NkMsIDB4RTQsIDB4NkQsIC8qIDB4RDQtMHhENyAqLworCTB4RTQsIDB4NkUsIDB4RTQsIDB4NkYsIDB4RTQsIDB4NzAsIDB4RTQsIDB4NzEsIC8qIDB4RDgtMHhEQiAqLworCTB4RTQsIDB4NzIsIDB4RTQsIDB4NzMsIDB4RTQsIDB4NzQsIDB4RTQsIDB4NzUsIC8qIDB4REMtMHhERiAqLworCTB4RTQsIDB4NzYsIDB4RTQsIDB4NzcsIDB4RTQsIDB4NzgsIDB4RTQsIDB4NzksIC8qIDB4RTAtMHhFMyAqLworCTB4RTQsIDB4N0EsIDB4RTQsIDB4N0IsIDB4RTQsIDB4N0MsIDB4RTQsIDB4N0QsIC8qIDB4RTQtMHhFNyAqLworCTB4RTQsIDB4N0UsIDB4RTQsIDB4ODAsIDB4RTQsIDB4ODEsIDB4RTQsIDB4ODIsIC8qIDB4RTgtMHhFQiAqLworCTB4RTQsIDB4ODMsIDB4RTQsIDB4ODQsIDB4RTQsIDB4ODUsIDB4RTQsIDB4ODYsIC8qIDB4RUMtMHhFRiAqLworCTB4RTQsIDB4ODcsIDB4RTQsIDB4ODgsIDB4RTQsIDB4ODksIDB4RTQsIDB4OEEsIC8qIDB4RjAtMHhGMyAqLworCTB4RTQsIDB4OEIsIDB4RTQsIDB4OEMsIDB4RTQsIDB4OEQsIDB4RTQsIDB4OEUsIC8qIDB4RjQtMHhGNyAqLworCTB4RTQsIDB4OEYsIDB4RTQsIDB4OTAsIDB4RTQsIDB4OTEsIDB4RTQsIDB4OTIsIC8qIDB4RjgtMHhGQiAqLworCTB4RTQsIDB4OTMsIDB4RTQsIDB4OTQsIDB4RTQsIDB4OTUsIDB4RTQsIDB4OTYsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzkzWzUxMl0gPSB7CisJMHhFNCwgMHg5NywgMHhFNCwgMHg5OCwgMHhFNCwgMHg5OSwgMHhFNCwgMHg5QSwgLyogMHgwMC0weDAzICovCisJMHhFNCwgMHg5QiwgMHhFNCwgMHg5QywgMHhFNCwgMHg5RCwgMHhFNCwgMHg5RSwgLyogMHgwNC0weDA3ICovCisJMHhFNCwgMHg5RiwgMHhFNCwgMHhBMCwgMHhFNSwgMHg0MCwgMHhFNSwgMHg0MSwgLyogMHgwOC0weDBCICovCisJMHhFNSwgMHg0MiwgMHhFNSwgMHg0MywgMHhFNSwgMHg0NCwgMHhFNSwgMHg0NSwgLyogMHgwQy0weDBGICovCisJMHhFNSwgMHg0NiwgMHhFNSwgMHg0NywgMHhFNSwgMHg0OCwgMHhFNSwgMHg0OSwgLyogMHgxMC0weDEzICovCisJMHhFNSwgMHg0QSwgMHhFNSwgMHg0QiwgMHhFNSwgMHg0QywgMHhFNSwgMHg0RCwgLyogMHgxNC0weDE3ICovCisJMHhFNSwgMHg0RSwgMHhFNSwgMHg0RiwgMHhFNSwgMHg1MCwgMHhFNSwgMHg1MSwgLyogMHgxOC0weDFCICovCisJMHhFNSwgMHg1MiwgMHhFNSwgMHg1MywgMHhFNSwgMHg1NCwgMHhFNSwgMHg1NSwgLyogMHgxQy0weDFGICovCisJMHhFNSwgMHg1NiwgMHhFNSwgMHg1NywgMHhFNSwgMHg1OCwgMHhFNSwgMHg1OSwgLyogMHgyMC0weDIzICovCisJMHhFNSwgMHg1QSwgMHhFNSwgMHg1QiwgMHhFNSwgMHg1QywgMHhFNSwgMHg1RCwgLyogMHgyNC0weDI3ICovCisJMHhFNSwgMHg1RSwgMHhFNSwgMHg1RiwgMHhFNSwgMHg2MCwgMHhFNSwgMHg2MSwgLyogMHgyOC0weDJCICovCisJMHhFNSwgMHg2MiwgMHhFNSwgMHg2MywgMHhFNSwgMHg2NCwgMHhFNSwgMHg2NSwgLyogMHgyQy0weDJGICovCisJMHhFNSwgMHg2NiwgMHhFNSwgMHg2NywgMHhFNSwgMHg2OCwgMHhFNSwgMHg2OSwgLyogMHgzMC0weDMzICovCisJMHhFNSwgMHg2QSwgMHhFNSwgMHg2QiwgMHhFNSwgMHg2QywgMHhFNSwgMHg2RCwgLyogMHgzNC0weDM3ICovCisJMHhFNSwgMHg2RSwgMHhFNSwgMHg2RiwgMHhFNSwgMHg3MCwgMHhFNSwgMHg3MSwgLyogMHgzOC0weDNCICovCisJMHhFNSwgMHg3MiwgMHhFNSwgMHg3MywgMHhGNiwgMHhDOSwgMHhFNSwgMHg3NCwgLyogMHgzQy0weDNGICovCisJMHhFNSwgMHg3NSwgMHhFNSwgMHg3NiwgMHhFNSwgMHg3NywgMHhFNSwgMHg3OCwgLyogMHg0MC0weDQzICovCisJMHhFNSwgMHg3OSwgMHhFNSwgMHg3QSwgMHhFNSwgMHg3QiwgMHhFNSwgMHg3QywgLyogMHg0NC0weDQ3ICovCisJMHhFNSwgMHg3RCwgMHhFNSwgMHg3RSwgMHhFNSwgMHg4MCwgMHhFNSwgMHg4MSwgLyogMHg0OC0weDRCICovCisJMHhFNSwgMHg4MiwgMHhFNSwgMHg4MywgMHhFNSwgMHg4NCwgMHhFNSwgMHg4NSwgLyogMHg0Qy0weDRGICovCisJMHhFNSwgMHg4NiwgMHhFNSwgMHg4NywgMHhFNSwgMHg4OCwgMHhFNSwgMHg4OSwgLyogMHg1MC0weDUzICovCisJMHhFNSwgMHg4QSwgMHhFNSwgMHg4QiwgMHhFNSwgMHg4QywgMHhFNSwgMHg4RCwgLyogMHg1NC0weDU3ICovCisJMHhFNSwgMHg4RSwgMHhFNSwgMHg4RiwgMHhFNSwgMHg5MCwgMHhFNSwgMHg5MSwgLyogMHg1OC0weDVCICovCisJMHhFNSwgMHg5MiwgMHhFNSwgMHg5MywgMHhFNSwgMHg5NCwgMHhFNSwgMHg5NSwgLyogMHg1Qy0weDVGICovCisJMHhFNSwgMHg5NiwgMHhFNSwgMHg5NywgMHhFNSwgMHg5OCwgMHhFNSwgMHg5OSwgLyogMHg2MC0weDYzICovCisJMHhFNSwgMHg5QSwgMHhFNSwgMHg5QiwgMHhFNSwgMHg5QywgMHhFNSwgMHg5RCwgLyogMHg2NC0weDY3ICovCisJMHhFNSwgMHg5RSwgMHhFNSwgMHg5RiwgMHhGNiwgMHhDQSwgMHhFNSwgMHhBMCwgLyogMHg2OC0weDZCICovCisJMHhFNiwgMHg0MCwgMHhFNiwgMHg0MSwgMHhFNiwgMHg0MiwgMHhFNiwgMHg0MywgLyogMHg2Qy0weDZGICovCisJMHhFNiwgMHg0NCwgMHhFNiwgMHg0NSwgMHhFNiwgMHg0NiwgMHhFNiwgMHg0NywgLyogMHg3MC0weDczICovCisJMHhFNiwgMHg0OCwgMHhFNiwgMHg0OSwgMHhFNiwgMHg0QSwgMHhFNiwgMHg0QiwgLyogMHg3NC0weDc3ICovCisJMHhFNiwgMHg0QywgMHhFNiwgMHg0RCwgMHhFNiwgMHg0RSwgMHhFNiwgMHg0RiwgLyogMHg3OC0weDdCICovCisJMHhFNiwgMHg1MCwgMHhFNiwgMHg1MSwgMHhFNiwgMHg1MiwgMHhFNiwgMHg1MywgLyogMHg3Qy0weDdGICovCisJCisJMHhFNiwgMHg1NCwgMHhFNiwgMHg1NSwgMHhFNiwgMHg1NiwgMHhFNiwgMHg1NywgLyogMHg4MC0weDgzICovCisJMHhFNiwgMHg1OCwgMHhFNiwgMHg1OSwgMHhFNiwgMHg1QSwgMHhFNiwgMHg1QiwgLyogMHg4NC0weDg3ICovCisJMHhFNiwgMHg1QywgMHhFNiwgMHg1RCwgMHhFNiwgMHg1RSwgMHhFNiwgMHg1RiwgLyogMHg4OC0weDhCICovCisJMHhFNiwgMHg2MCwgMHhFNiwgMHg2MSwgMHhFNiwgMHg2MiwgMHhGNiwgMHhDQywgLyogMHg4Qy0weDhGICovCisJMHhFNiwgMHg2MywgMHhFNiwgMHg2NCwgMHhFNiwgMHg2NSwgMHhFNiwgMHg2NiwgLyogMHg5MC0weDkzICovCisJMHhFNiwgMHg2NywgMHhFNiwgMHg2OCwgMHhFNiwgMHg2OSwgMHhFNiwgMHg2QSwgLyogMHg5NC0weDk3ICovCisJMHhFNiwgMHg2QiwgMHhFNiwgMHg2QywgMHhFNiwgMHg2RCwgMHhFNiwgMHg2RSwgLyogMHg5OC0weDlCICovCisJMHhFNiwgMHg2RiwgMHhFNiwgMHg3MCwgMHhFNiwgMHg3MSwgMHhFNiwgMHg3MiwgLyogMHg5Qy0weDlGICovCisJMHhFNiwgMHg3MywgMHhFNiwgMHg3NCwgMHhFNiwgMHg3NSwgMHhFNiwgMHg3NiwgLyogMHhBMC0weEEzICovCisJMHhFNiwgMHg3NywgMHhFNiwgMHg3OCwgMHhFNiwgMHg3OSwgMHhFNiwgMHg3QSwgLyogMHhBNC0weEE3ICovCisJMHhFNiwgMHg3QiwgMHhFNiwgMHg3QywgMHhFNiwgMHg3RCwgMHhFNiwgMHg3RSwgLyogMHhBOC0weEFCICovCisJMHhFNiwgMHg4MCwgMHhFNiwgMHg4MSwgMHhFNiwgMHg4MiwgMHhFNiwgMHg4MywgLyogMHhBQy0weEFGICovCisJMHhFNiwgMHg4NCwgMHhFNiwgMHg4NSwgMHhFNiwgMHg4NiwgMHhFNiwgMHg4NywgLyogMHhCMC0weEIzICovCisJMHhFNiwgMHg4OCwgMHhFNiwgMHg4OSwgMHhFNiwgMHg4QSwgMHhFNiwgMHg4QiwgLyogMHhCNC0weEI3ICovCisJMHhFNiwgMHg4QywgMHhFNiwgMHg4RCwgMHhFNiwgMHg4RSwgMHhFNiwgMHg4RiwgLyogMHhCOC0weEJCICovCisJMHhFNiwgMHg5MCwgMHhFNiwgMHg5MSwgMHhFNiwgMHg5MiwgMHhFNiwgMHg5MywgLyogMHhCQy0weEJGICovCisJMHhFNiwgMHg5NCwgMHhFNiwgMHg5NSwgMHhFNiwgMHg5NiwgMHhFNiwgMHg5NywgLyogMHhDMC0weEMzICovCisJMHhFNiwgMHg5OCwgMHhFNiwgMHg5OSwgMHhFNiwgMHg5QSwgMHhFNiwgMHg5QiwgLyogMHhDNC0weEM3ICovCisJMHhFNiwgMHg5QywgMHhFNiwgMHg5RCwgMHhGNiwgMHhDQiwgMHhFNiwgMHg5RSwgLyogMHhDOC0weENCICovCisJMHhFNiwgMHg5RiwgMHhFNiwgMHhBMCwgMHhFNywgMHg0MCwgMHhFNywgMHg0MSwgLyogMHhDQy0weENGICovCisJMHhFNywgMHg0MiwgMHhFNywgMHg0MywgMHhFNywgMHg0NCwgMHhFNywgMHg0NSwgLyogMHhEMC0weEQzICovCisJMHhFNywgMHg0NiwgMHhFNywgMHg0NywgMHhGNywgMHhFOSwgMHhFNywgMHg0OCwgLyogMHhENC0weEQ3ICovCisJMHhFNywgMHg0OSwgMHhFNywgMHg0QSwgMHhFNywgMHg0QiwgMHhFNywgMHg0QywgLyogMHhEOC0weERCICovCisJMHhFNywgMHg0RCwgMHhFNywgMHg0RSwgMHhFNywgMHg0RiwgMHhFNywgMHg1MCwgLyogMHhEQy0weERGICovCisJMHhFNywgMHg1MSwgMHhFNywgMHg1MiwgMHhFNywgMHg1MywgMHhFNywgMHg1NCwgLyogMHhFMC0weEUzICovCisJMHhFNywgMHg1NSwgMHhFNywgMHg1NiwgMHhFNywgMHg1NywgMHhFNywgMHg1OCwgLyogMHhFNC0weEU3ICovCisJMHhFNywgMHg1OSwgMHhFNywgMHg1QSwgMHhFNywgMHg1QiwgMHhFNywgMHg1QywgLyogMHhFOC0weEVCICovCisJMHhFNywgMHg1RCwgMHhFNywgMHg1RSwgMHhFNywgMHg1RiwgMHhFNywgMHg2MCwgLyogMHhFQy0weEVGICovCisJMHhFNywgMHg2MSwgMHhFNywgMHg2MiwgMHhFNywgMHg2MywgMHhFNywgMHg2NCwgLyogMHhGMC0weEYzICovCisJMHhFNywgMHg2NSwgMHhFNywgMHg2NiwgMHhFNywgMHg2NywgMHhFNywgMHg2OCwgLyogMHhGNC0weEY3ICovCisJMHhFNywgMHg2OSwgMHhFNywgMHg2QSwgMHhFNywgMHg2QiwgMHhFNywgMHg2QywgLyogMHhGOC0weEZCICovCisJMHhFNywgMHg2RCwgMHhFNywgMHg2RSwgMHhFNywgMHg2RiwgMHhFNywgMHg3MCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOTRbNTEyXSA9IHsKKwkweEU3LCAweDcxLCAweEU3LCAweDcyLCAweEU3LCAweDczLCAweEU3LCAweDc0LCAvKiAweDAwLTB4MDMgKi8KKwkweEU3LCAweDc1LCAweEU3LCAweDc2LCAweEU3LCAweDc3LCAweEU3LCAweDc4LCAvKiAweDA0LTB4MDcgKi8KKwkweEU3LCAweDc5LCAweEU3LCAweDdBLCAweEU3LCAweDdCLCAweEU3LCAweDdDLCAvKiAweDA4LTB4MEIgKi8KKwkweEU3LCAweDdELCAweEU3LCAweDdFLCAweEU3LCAweDgwLCAweEU3LCAweDgxLCAvKiAweDBDLTB4MEYgKi8KKwkweEU3LCAweDgyLCAweEU3LCAweDgzLCAweEU3LCAweDg0LCAweEU3LCAweDg1LCAvKiAweDEwLTB4MTMgKi8KKwkweEU3LCAweDg2LCAweEU3LCAweDg3LCAweEU3LCAweDg4LCAweEU3LCAweDg5LCAvKiAweDE0LTB4MTcgKi8KKwkweEU3LCAweDhBLCAweEU3LCAweDhCLCAweEU3LCAweDhDLCAweEU3LCAweDhELCAvKiAweDE4LTB4MUIgKi8KKwkweEU3LCAweDhFLCAweEU3LCAweDhGLCAweEU3LCAweDkwLCAweEU3LCAweDkxLCAvKiAweDFDLTB4MUYgKi8KKwkweEU3LCAweDkyLCAweEU3LCAweDkzLCAweEU3LCAweDk0LCAweEU3LCAweDk1LCAvKiAweDIwLTB4MjMgKi8KKwkweEU3LCAweDk2LCAweEU3LCAweDk3LCAweEU3LCAweDk4LCAweEU3LCAweDk5LCAvKiAweDI0LTB4MjcgKi8KKwkweEU3LCAweDlBLCAweEU3LCAweDlCLCAweEU3LCAweDlDLCAweEU3LCAweDlELCAvKiAweDI4LTB4MkIgKi8KKwkweEU3LCAweDlFLCAweEU3LCAweDlGLCAweEU3LCAweEEwLCAweEU4LCAweDQwLCAvKiAweDJDLTB4MkYgKi8KKwkweEU4LCAweDQxLCAweEU4LCAweDQyLCAweEU4LCAweDQzLCAweEU4LCAweDQ0LCAvKiAweDMwLTB4MzMgKi8KKwkweEU4LCAweDQ1LCAweEU4LCAweDQ2LCAweEU4LCAweDQ3LCAweEU4LCAweDQ4LCAvKiAweDM0LTB4MzcgKi8KKwkweEU4LCAweDQ5LCAweEU4LCAweDRBLCAweEU4LCAweDRCLCAweEU4LCAweDRDLCAvKiAweDM4LTB4M0IgKi8KKwkweEU4LCAweDRELCAweEU4LCAweDRFLCAweEY2LCAweENELCAweEU4LCAweDRGLCAvKiAweDNDLTB4M0YgKi8KKwkweEU4LCAweDUwLCAweEU4LCAweDUxLCAweEU4LCAweDUyLCAweEU4LCAweDUzLCAvKiAweDQwLTB4NDMgKi8KKwkweEU4LCAweDU0LCAweEU4LCAweDU1LCAweEU4LCAweDU2LCAweEU4LCAweDU3LCAvKiAweDQ0LTB4NDcgKi8KKwkweEU4LCAweDU4LCAweEU4LCAweDU5LCAweEU4LCAweDVBLCAweEU4LCAweDVCLCAvKiAweDQ4LTB4NEIgKi8KKwkweEU4LCAweDVDLCAweEU4LCAweDVELCAweEU4LCAweDVFLCAweEU4LCAweDVGLCAvKiAweDRDLTB4NEYgKi8KKwkweEU4LCAweDYwLCAweEU4LCAweDYxLCAweEU4LCAweDYyLCAweEU4LCAweDYzLCAvKiAweDUwLTB4NTMgKi8KKwkweEU4LCAweDY0LCAweEU4LCAweDY1LCAweEU4LCAweDY2LCAweEU4LCAweDY3LCAvKiAweDU0LTB4NTcgKi8KKwkweEU4LCAweDY4LCAweEU4LCAweDY5LCAweEU4LCAweDZBLCAweEU4LCAweDZCLCAvKiAweDU4LTB4NUIgKi8KKwkweEU4LCAweDZDLCAweEU4LCAweDZELCAweEU4LCAweDZFLCAweEU4LCAweDZGLCAvKiAweDVDLTB4NUYgKi8KKwkweEU4LCAweDcwLCAweEU4LCAweDcxLCAweEU4LCAweDcyLCAweEU4LCAweDczLCAvKiAweDYwLTB4NjMgKi8KKwkweEU4LCAweDc0LCAweEU4LCAweDc1LCAweEU4LCAweDc2LCAweEU4LCAweDc3LCAvKiAweDY0LTB4NjcgKi8KKwkweEU4LCAweDc4LCAweEU4LCAweDc5LCAweEU4LCAweDdBLCAweEY2LCAweENFLCAvKiAweDY4LTB4NkIgKi8KKwkweEU4LCAweDdCLCAweEU4LCAweDdDLCAweEU4LCAweDdELCAweEU4LCAweDdFLCAvKiAweDZDLTB4NkYgKi8KKwkweEU4LCAweDgwLCAweEU4LCAweDgxLCAweEU4LCAweDgyLCAweEU4LCAweDgzLCAvKiAweDcwLTB4NzMgKi8KKwkweEU4LCAweDg0LCAweEU4LCAweDg1LCAweEU4LCAweDg2LCAweEU4LCAweDg3LCAvKiAweDc0LTB4NzcgKi8KKwkweEU4LCAweDg4LCAweEU4LCAweDg5LCAweEU4LCAweDhBLCAweEU4LCAweDhCLCAvKiAweDc4LTB4N0IgKi8KKwkweEU4LCAweDhDLCAweEU4LCAweDhELCAweEU4LCAweDhFLCAweEU4LCAweDhGLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEU4LCAweDkwLCAweEU4LCAweDkxLCAweEU4LCAweDkyLCAweEU4LCAweDkzLCAvKiAweDgwLTB4ODMgKi8KKwkweEU4LCAweDk0LCAweEVFLCAweEM0LCAweEVFLCAweEM1LCAweEVFLCAweEM2LCAvKiAweDg0LTB4ODcgKi8KKwkweEQ1LCAweEVCLCAweEI2LCAweEE0LCAweEVFLCAweEM4LCAweEVFLCAweEM3LCAvKiAweDg4LTB4OEIgKi8KKwkweEVFLCAweEM5LCAweEVFLCAweENBLCAweEM3LCAweEE1LCAweEVFLCAweENCLCAvKiAweDhDLTB4OEYgKi8KKwkweEVFLCAweENDLCAweEU4LCAweDk1LCAweEI3LCAweEIwLCAweEI1LCAweEY2LCAvKiAweDkwLTB4OTMgKi8KKwkweEVFLCAweENELCAweEVFLCAweENGLCAweEU4LCAweDk2LCAweEVFLCAweENFLCAvKiAweDk0LTB4OTcgKi8KKwkweEU4LCAweDk3LCAweEI4LCAweEM2LCAweEVFLCAweEQwLCAweEVFLCAweEQxLCAvKiAweDk4LTB4OUIgKi8KKwkweEVFLCAweEQyLCAweEI2LCAweERCLCAweEIzLCAweEFFLCAweEQ2LCAweEQzLCAvKiAweDlDLTB4OUYgKi8KKwkweEM0LCAweEM2LCAweEIxLCAweEI1LCAweEI4LCAweEQ2LCAweEVFLCAweEQzLCAvKiAweEEwLTB4QTMgKi8KKwkweEVFLCAweEQ0LCAweEQ0LCAweEJGLCAweEM3LCAweEQ1LCAweEJFLCAweEZCLCAvKiAweEE0LTB4QTcgKi8KKwkweENFLCAweEQ5LCAweEI5LCAweEIzLCAweEVFLCAweEQ2LCAweEVFLCAweEQ1LCAvKiAweEE4LTB4QUIgKi8KKwkweEVFLCAweEQ4LCAweEVFLCAweEQ3LCAweEM1LCAweEE1LCAweEVFLCAweEQ5LCAvKiAweEFDLTB4QUYgKi8KKwkweEVFLCAweERBLCAweEM3LCAweEFFLCAweEVFLCAweERCLCAweEM3LCAweEFGLCAvKiAweEIwLTB4QjMgKi8KKwkweEVFLCAweERDLCAweEIyLCAweEE3LCAweEVFLCAweERELCAweEVFLCAweERFLCAvKiAweEI0LTB4QjcgKi8KKwkweEVFLCAweERGLCAweEVFLCAweEUwLCAweEVFLCAweEUxLCAweEQ3LCAweEVBLCAvKiAweEI4LTB4QkIgKi8KKwkweEVFLCAweEUyLCAweEVFLCAweEUzLCAweEJDLCAweEQ4LCAweEVFLCAweEU0LCAvKiAweEJDLTB4QkYgKi8KKwkweEQzLCAweENCLCAweENDLCAweEZBLCAweEIyLCAweEFDLCAweEMxLCAweEU1LCAvKiAweEMwLTB4QzMgKi8KKwkweEVFLCAweEU1LCAweEM3LCAweEE2LCAweEMzLCAweEFELCAweEU4LCAweDk4LCAvKiAweEM0LTB4QzcgKi8KKwkweEVFLCAweEU2LCAweEVFLCAweEU3LCAweEVFLCAweEU4LCAweEVFLCAweEU5LCAvKiAweEM4LTB4Q0IgKi8KKwkweEVFLCAweEVBLCAweEVFLCAweEVCLCAweEVFLCAweEVDLCAweEU4LCAweDk5LCAvKiAweENDLTB4Q0YgKi8KKwkweEVFLCAweEVELCAweEVFLCAweEVFLCAweEVFLCAweEVGLCAweEU4LCAweDlBLCAvKiAweEQwLTB4RDMgKi8KKwkweEU4LCAweDlCLCAweEVFLCAweEYwLCAweEVFLCAweEYxLCAweEVFLCAweEYyLCAvKiAweEQ0LTB4RDcgKi8KKwkweEVFLCAweEY0LCAweEVFLCAweEYzLCAweEU4LCAweDlDLCAweEVFLCAweEY1LCAvKiAweEQ4LTB4REIgKi8KKwkweENELCAweEFELCAweEMyLCAweEMxLCAweEVFLCAweEY2LCAweEVFLCAweEY3LCAvKiAweERDLTB4REYgKi8KKwkweEVFLCAweEY4LCAweEQ1LCAweEExLCAweEVFLCAweEY5LCAweENGLCAweEIzLCAvKiAweEUwLTB4RTMgKi8KKwkweEVFLCAweEZBLCAweEVFLCAweEZCLCAweEU4LCAweDlELCAweEVFLCAweEZDLCAvKiAweEU0LTB4RTcgKi8KKwkweEVFLCAweEZELCAweEVGLCAweEExLCAweEVFLCAweEZFLCAweEVGLCAweEEyLCAvKiAweEU4LTB4RUIgKi8KKwkweEI4LCAweEY1LCAweEMzLCAweEZBLCAweEVGLCAweEEzLCAweEVGLCAweEE0LCAvKiAweEVDLTB4RUYgKi8KKwkweEJELCAweEMyLCAweEQyLCAweEJGLCAweEIyLCAweEY5LCAweEVGLCAweEE1LCAvKiAweEYwLTB4RjMgKi8KKwkweEVGLCAweEE2LCAweEVGLCAweEE3LCAweEQyLCAweEY4LCAweEVGLCAweEE4LCAvKiAweEY0LTB4RjcgKi8KKwkweEQ2LCAweEZELCAweEVGLCAweEE5LCAweEM2LCAweENDLCAweEU4LCAweDlFLCAvKiAweEY4LTB4RkIgKi8KKwkweEVGLCAweEFBLCAweEVGLCAweEFCLCAweEMxLCAweEI0LCAweEVGLCAweEFDLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185NVs1MTJdID0geworCTB4Q0YsIDB4RkEsIDB4Q0IsIDB4RjgsIDB4RUYsIDB4QUUsIDB4RUYsIDB4QUQsIC8qIDB4MDAtMHgwMyAqLworCTB4QjMsIDB4RkEsIDB4QjksIDB4RjgsIDB4RUYsIDB4QUYsIDB4RUYsIDB4QjAsIC8qIDB4MDQtMHgwNyAqLworCTB4RDAsIDB4RTIsIDB4RUYsIDB4QjEsIDB4RUYsIDB4QjIsIDB4QjcsIDB4RTYsIC8qIDB4MDgtMHgwQiAqLworCTB4RDAsIDB4QkYsIDB4RUYsIDB4QjMsIDB4RUYsIDB4QjQsIDB4RUYsIDB4QjUsIC8qIDB4MEMtMHgwRiAqLworCTB4QzgsIDB4RjEsIDB4Q0MsIDB4RTAsIDB4RUYsIDB4QjYsIDB4RUYsIDB4QjcsIC8qIDB4MTAtMHgxMyAqLworCTB4RUYsIDB4QjgsIDB4RUYsIDB4QjksIDB4RUYsIDB4QkEsIDB4RDUsIDB4RTAsIC8qIDB4MTQtMHgxNyAqLworCTB4RUYsIDB4QkIsIDB4QjQsIDB4RUQsIDB4QzMsIDB4QUEsIDB4RUYsIDB4QkMsIC8qIDB4MTgtMHgxQiAqLworCTB4RTgsIDB4OUYsIDB4RUYsIDB4QkQsIDB4RUYsIDB4QkUsIDB4RUYsIDB4QkYsIC8qIDB4MUMtMHgxRiAqLworCTB4RTgsIDB4QTAsIDB4Q0UsIDB4RkQsIDB4RUYsIDB4QzAsIDB4QzIsIDB4RTAsIC8qIDB4MjAtMHgyMyAqLworCTB4QjQsIDB4QjgsIDB4RDcsIDB4QjYsIDB4QkQsIDB4RjUsIDB4RTksIDB4NDAsIC8qIDB4MjQtMHgyNyAqLworCTB4Q0YsIDB4QzcsIDB4RUYsIDB4QzMsIDB4RUYsIDB4QzEsIDB4RUYsIDB4QzIsIC8qIDB4MjgtMHgyQiAqLworCTB4RUYsIDB4QzQsIDB4QjYsIDB4QTcsIDB4QkMsIDB4RkMsIDB4QkUsIDB4RTIsIC8qIDB4MkMtMHgyRiAqLworCTB4QzMsIDB4Q0MsIDB4RUYsIDB4QzUsIDB4RUYsIDB4QzYsIDB4RTksIDB4NDEsIC8qIDB4MzAtMHgzMyAqLworCTB4RUYsIDB4QzcsIDB4RUYsIDB4Q0YsIDB4RUYsIDB4QzgsIDB4RUYsIDB4QzksIC8qIDB4MzQtMHgzNyAqLworCTB4RUYsIDB4Q0EsIDB4QzcsIDB4QzIsIDB4RUYsIDB4RjEsIDB4QjYsIDB4Q0QsIC8qIDB4MzgtMHgzQiAqLworCTB4RUYsIDB4Q0IsIDB4RTksIDB4NDIsIDB4RUYsIDB4Q0MsIDB4RUYsIDB4Q0QsIC8qIDB4M0MtMHgzRiAqLworCTB4QjYsIDB4QzYsIDB4QzMsIDB4QkUsIDB4RUYsIDB4Q0UsIDB4RTksIDB4NDMsIC8qIDB4NDAtMHg0MyAqLworCTB4RUYsIDB4RDAsIDB4RUYsIDB4RDEsIDB4RUYsIDB4RDIsIDB4RDUsIDB4RjIsIC8qIDB4NDQtMHg0NyAqLworCTB4RTksIDB4NDQsIDB4RUYsIDB4RDMsIDB4QzQsIDB4RjcsIDB4RTksIDB4NDUsIC8qIDB4NDgtMHg0QiAqLworCTB4RUYsIDB4RDQsIDB4QzQsIDB4RjgsIDB4RUYsIDB4RDUsIDB4RUYsIDB4RDYsIC8qIDB4NEMtMHg0RiAqLworCTB4QjgsIDB4RTQsIDB4QjAsIDB4RjcsIDB4RUYsIDB4RDcsIDB4RUYsIDB4RDgsIC8qIDB4NTAtMHg1MyAqLworCTB4RUYsIDB4RDksIDB4RTksIDB4NDYsIDB4RUYsIDB4REEsIDB4RUYsIDB4REIsIC8qIDB4NTQtMHg1NyAqLworCTB4RUYsIDB4REMsIDB4RUYsIDB4REQsIDB4RTksIDB4NDcsIDB4RUYsIDB4REUsIC8qIDB4NTgtMHg1QiAqLworCTB4QkUsIDB4QjUsIDB4RUYsIDB4RTEsIDB4RUYsIDB4REYsIDB4RUYsIDB4RTAsIC8qIDB4NUMtMHg1RiAqLworCTB4RTksIDB4NDgsIDB4RUYsIDB4RTIsIDB4RUYsIDB4RTMsIDB4QzEsIDB4Q0QsIC8qIDB4NjAtMHg2MyAqLworCTB4RUYsIDB4RTQsIDB4RUYsIDB4RTUsIDB4RUYsIDB4RTYsIDB4RUYsIDB4RTcsIC8qIDB4NjQtMHg2NyAqLworCTB4RUYsIDB4RTgsIDB4RUYsIDB4RTksIDB4RUYsIDB4RUEsIDB4RUYsIDB4RUIsIC8qIDB4NjgtMHg2QiAqLworCTB4RUYsIDB4RUMsIDB4QzAsIDB4RDgsIDB4RTksIDB4NDksIDB4RUYsIDB4RUQsIC8qIDB4NkMtMHg2RiAqLworCTB4QzEsIDB4QUQsIDB4RUYsIDB4RUUsIDB4RUYsIDB4RUYsIDB4RUYsIDB4RjAsIC8qIDB4NzAtMHg3MyAqLworCTB4RTksIDB4NEEsIDB4RTksIDB4NEIsIDB4Q0YsIDB4RTIsIDB4RTksIDB4NEMsIC8qIDB4NzQtMHg3NyAqLworCTB4RTksIDB4NEQsIDB4RTksIDB4NEUsIDB4RTksIDB4NEYsIDB4RTksIDB4NTAsIC8qIDB4NzgtMHg3QiAqLworCTB4RTksIDB4NTEsIDB4RTksIDB4NTIsIDB4RTksIDB4NTMsIDB4QjMsIDB4QTQsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RTksIDB4NTQsIDB4RTksIDB4NTUsIDB4RTksIDB4NTYsIDB4RTksIDB4NTcsIC8qIDB4ODAtMHg4MyAqLworCTB4RTksIDB4NTgsIDB4RTksIDB4NTksIDB4RTksIDB4NUEsIDB4RTksIDB4NUIsIC8qIDB4ODQtMHg4NyAqLworCTB4RTksIDB4NUMsIDB4RTksIDB4NUQsIDB4RTksIDB4NUUsIDB4RTksIDB4NUYsIC8qIDB4ODgtMHg4QiAqLworCTB4RTksIDB4NjAsIDB4RTksIDB4NjEsIDB4RTksIDB4NjIsIDB4RTksIDB4NjMsIC8qIDB4OEMtMHg4RiAqLworCTB4RTksIDB4NjQsIDB4RTksIDB4NjUsIDB4RTksIDB4NjYsIDB4RTksIDB4NjcsIC8qIDB4OTAtMHg5MyAqLworCTB4RTksIDB4NjgsIDB4RTksIDB4NjksIDB4RTksIDB4NkEsIDB4RTksIDB4NkIsIC8qIDB4OTQtMHg5NyAqLworCTB4RTksIDB4NkMsIDB4RTksIDB4NkQsIDB4RTksIDB4NkUsIDB4RTksIDB4NkYsIC8qIDB4OTgtMHg5QiAqLworCTB4RTksIDB4NzAsIDB4RTksIDB4NzEsIDB4RTksIDB4NzIsIDB4RTksIDB4NzMsIC8qIDB4OUMtMHg5RiAqLworCTB4RTksIDB4NzQsIDB4RTksIDB4NzUsIDB4RTksIDB4NzYsIDB4RTksIDB4NzcsIC8qIDB4QTAtMHhBMyAqLworCTB4RTksIDB4NzgsIDB4RTksIDB4NzksIDB4RTksIDB4N0EsIDB4RTksIDB4N0IsIC8qIDB4QTQtMHhBNyAqLworCTB4RTksIDB4N0MsIDB4RTksIDB4N0QsIDB4RTksIDB4N0UsIDB4RTksIDB4ODAsIC8qIDB4QTgtMHhBQiAqLworCTB4RTksIDB4ODEsIDB4RTksIDB4ODIsIDB4RTksIDB4ODMsIDB4RTksIDB4ODQsIC8qIDB4QUMtMHhBRiAqLworCTB4RTksIDB4ODUsIDB4RTksIDB4ODYsIDB4RTksIDB4ODcsIDB4RTksIDB4ODgsIC8qIDB4QjAtMHhCMyAqLworCTB4RTksIDB4ODksIDB4RTksIDB4OEEsIDB4RTksIDB4OEIsIDB4RTksIDB4OEMsIC8qIDB4QjQtMHhCNyAqLworCTB4RTksIDB4OEQsIDB4RTksIDB4OEUsIDB4RTksIDB4OEYsIDB4RTksIDB4OTAsIC8qIDB4QjgtMHhCQiAqLworCTB4RTksIDB4OTEsIDB4RTksIDB4OTIsIDB4RTksIDB4OTMsIDB4RTksIDB4OTQsIC8qIDB4QkMtMHhCRiAqLworCTB4RTksIDB4OTUsIDB4RTksIDB4OTYsIDB4RTksIDB4OTcsIDB4RTksIDB4OTgsIC8qIDB4QzAtMHhDMyAqLworCTB4RTksIDB4OTksIDB4RTksIDB4OUEsIDB4RTksIDB4OUIsIDB4RTksIDB4OUMsIC8qIDB4QzQtMHhDNyAqLworCTB4RTksIDB4OUQsIDB4RTksIDB4OUUsIDB4RTksIDB4OUYsIDB4RTksIDB4QTAsIC8qIDB4QzgtMHhDQiAqLworCTB4RUEsIDB4NDAsIDB4RUEsIDB4NDEsIDB4RUEsIDB4NDIsIDB4RUEsIDB4NDMsIC8qIDB4Q0MtMHhDRiAqLworCTB4RUEsIDB4NDQsIDB4RUEsIDB4NDUsIDB4RUEsIDB4NDYsIDB4RUEsIDB4NDcsIC8qIDB4RDAtMHhEMyAqLworCTB4RUEsIDB4NDgsIDB4RUEsIDB4NDksIDB4RUEsIDB4NEEsIDB4RUEsIDB4NEIsIC8qIDB4RDQtMHhENyAqLworCTB4RUEsIDB4NEMsIDB4RUEsIDB4NEQsIDB4RUEsIDB4NEUsIDB4RUEsIDB4NEYsIC8qIDB4RDgtMHhEQiAqLworCTB4RUEsIDB4NTAsIDB4RUEsIDB4NTEsIDB4RUEsIDB4NTIsIDB4RUEsIDB4NTMsIC8qIDB4REMtMHhERiAqLworCTB4RUEsIDB4NTQsIDB4RUEsIDB4NTUsIDB4RUEsIDB4NTYsIDB4RUEsIDB4NTcsIC8qIDB4RTAtMHhFMyAqLworCTB4RUEsIDB4NTgsIDB4RUEsIDB4NTksIDB4RUEsIDB4NUEsIDB4RUEsIDB4NUIsIC8qIDB4RTQtMHhFNyAqLworCTB4QzMsIDB4QzUsIDB4RTMsIDB4QzUsIDB4QzksIDB4QzEsIDB4RTMsIDB4QzYsIC8qIDB4RTgtMHhFQiAqLworCTB4RUEsIDB4NUMsIDB4QjEsIDB4RDUsIDB4Q0UsIDB4Q0EsIDB4QjQsIDB4QjMsIC8qIDB4RUMtMHhFRiAqLworCTB4QzgsIDB4RjIsIDB4RTMsIDB4QzcsIDB4Q0YsIDB4RDAsIDB4RTMsIDB4QzgsIC8qIDB4RjAtMHhGMyAqLworCTB4QkMsIDB4RTQsIDB4RTMsIDB4QzksIDB4RTMsIDB4Q0EsIDB4QzMsIDB4QzYsIC8qIDB4RjQtMHhGNyAqLworCTB4RDUsIDB4QTIsIDB4QzQsIDB4RDYsIDB4QjksIDB4RUIsIDB4Q0UsIDB4QzUsIC8qIDB4RjgtMHhGQiAqLworCTB4RTMsIDB4Q0IsIDB4QzMsIDB4RjYsIDB4RTMsIDB4Q0MsIDB4RUEsIDB4NUQsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzk2WzUxMl0gPSB7CisJMHhCNywgMHhBNywgMHhCOCwgMHhGMywgMHhCQSwgMHhEMiwgMHhFMywgMHhDRCwgLyogMHgwMC0weDAzICovCisJMHhFMywgMHhDRSwgMHhENCwgMHhDNCwgMHhFMywgMHhDRiwgMHhFQSwgMHg1RSwgLyogMHgwNC0weDA3ICovCisJMHhFMywgMHhEMCwgMHhEMSwgMHhDQiwgMHhFMywgMHhEMSwgMHhFMywgMHhEMiwgLyogMHgwOC0weDBCICovCisJMHhFMywgMHhEMywgMHhFMywgMHhENCwgMHhEMSwgMHhENiwgMHhFMywgMHhENSwgLyogMHgwQy0weDBGICovCisJMHhCMiwgMHhGQiwgMHhDMCwgMHhCQiwgMHhFMywgMHhENiwgMHhFQSwgMHg1RiwgLyogMHgxMC0weDEzICovCisJMHhDMCwgMHhBQiwgMHhFMywgMHhENywgMHhFMywgMHhEOCwgMHhFMywgMHhEOSwgLyogMHgxNC0weDE3ICovCisJMHhFQSwgMHg2MCwgMHhFMywgMHhEQSwgMHhFMywgMHhEQiwgMHhFQSwgMHg2MSwgLyogMHgxOC0weDFCICovCisJMHhCOCwgMHhCNywgMHhEQSwgMHhFMiwgMHhFQSwgMHg2MiwgMHhCNiwgMHhEMywgLyogMHgxQy0weDFGICovCisJMHhFQSwgMHg2MywgMHhEQSwgMHhFNCwgMHhEQSwgMHhFMywgMHhFQSwgMHg2NCwgLyogMHgyMC0weDIzICovCisJMHhFQSwgMHg2NSwgMHhFQSwgMHg2NiwgMHhFQSwgMHg2NywgMHhFQSwgMHg2OCwgLyogMHgyNC0weDI3ICovCisJMHhFQSwgMHg2OSwgMHhFQSwgMHg2QSwgMHhEQSwgMHhFNiwgMHhFQSwgMHg2QiwgLyogMHgyOC0weDJCICovCisJMHhFQSwgMHg2QywgMHhFQSwgMHg2RCwgMHhDOCwgMHhFRSwgMHhFQSwgMHg2RSwgLyogMHgyQy0weDJGICovCisJMHhFQSwgMHg2RiwgMHhEQSwgMHhFNSwgMHhCNywgMHhDMCwgMHhEMSwgMHhGNCwgLyogMHgzMC0weDMzICovCisJMHhEMiwgMHhGNSwgMHhENSwgMHhGMywgMHhCRCwgMHhENywgMHhFQSwgMHg3MCwgLyogMHgzNC0weDM3ICovCisJMHhFQSwgMHg3MSwgMHhFQSwgMHg3MiwgMHhFQSwgMHg3MywgMHhENywgMHhFOCwgLyogMHgzOC0weDNCICovCisJMHhEQSwgMHhFOCwgMHhEQSwgMHhFNywgMHhFQSwgMHg3NCwgMHhCMCwgMHhBMiwgLyogMHgzQy0weDNGICovCisJMHhDRCwgMHhEMywgMHhFQSwgMHg3NSwgMHhEQSwgMHhFOSwgMHhFQSwgMHg3NiwgLyogMHg0MC0weDQzICovCisJMHhCOCwgMHhCRCwgMHhCQywgMHhDQSwgMHhDMiwgMHhCRCwgMHhDMiwgMHhBNCwgLyogMHg0NC0weDQ3ICovCisJMHhCMywgMHhDMiwgMHhEQSwgMHhFQSwgMHhFQSwgMHg3NywgMHhDMiwgMHhBQSwgLyogMHg0OC0weDRCICovCisJMHhDNCwgMHhCMCwgMHhCRCwgMHhCNSwgMHhFQSwgMHg3OCwgMHhFQSwgMHg3OSwgLyogMHg0Qy0weDRGICovCisJMHhDRiwgMHhERSwgMHhFQSwgMHg3QSwgMHhFQSwgMHg3QiwgMHhFQSwgMHg3QywgLyogMHg1MC0weDUzICovCisJMHhEQSwgMHhFQiwgMHhDOSwgMHhDMiwgMHhFQSwgMHg3RCwgMHhFQSwgMHg3RSwgLyogMHg1NC0weDU3ICovCisJMHhFQSwgMHg4MCwgMHhFQSwgMHg4MSwgMHhFQSwgMHg4MiwgMHhCMSwgMHhERCwgLyogMHg1OC0weDVCICovCisJMHhFQSwgMHg4MywgMHhFQSwgMHg4NCwgMHhFQSwgMHg4NSwgMHhEQSwgMHhFQywgLyogMHg1Qy0weDVGICovCisJMHhFQSwgMHg4NiwgMHhCNiwgMHhCOCwgMHhENCwgMHhCQSwgMHhFQSwgMHg4NywgLyogMHg2MC0weDYzICovCisJMHhCMywgMHhGRCwgMHhFQSwgMHg4OCwgMHhFQSwgMHg4OSwgMHhEQSwgMHhFRCwgLyogMHg2NC0weDY3ICovCisJMHhENCwgMHhDOSwgMHhDRiwgMHhENSwgMHhDNSwgMHhFMywgMHhFQSwgMHg4QSwgLyogMHg2OC0weDZCICovCisJMHhEQSwgMHhFRSwgMHhFQSwgMHg4QiwgMHhFQSwgMHg4QywgMHhFQSwgMHg4RCwgLyogMHg2Qy0weDZGICovCisJMHhFQSwgMHg4RSwgMHhFQSwgMHg4RiwgMHhEQSwgMHhFRiwgMHhFQSwgMHg5MCwgLyogMHg3MC0weDczICovCisJMHhEQSwgMHhGMCwgMHhDMSwgMHhFQSwgMHhDQywgMHhENSwgMHhDRiwgMHhERCwgLyogMHg3NC0weDc3ICovCisJMHhFQSwgMHg5MSwgMHhFQSwgMHg5MiwgMHhFQSwgMHg5MywgMHhFQSwgMHg5NCwgLyogMHg3OC0weDdCICovCisJMHhFQSwgMHg5NSwgMHhFQSwgMHg5NiwgMHhFQSwgMHg5NywgMHhFQSwgMHg5OCwgLyogMHg3Qy0weDdGICovCisJCisJMHhFQSwgMHg5OSwgMHhFQSwgMHg5QSwgMHhFQSwgMHg5QiwgMHhFQSwgMHg5QywgLyogMHg4MC0weDgzICovCisJMHhFQSwgMHg5RCwgMHhEMywgMHhFNywgMHhDMiwgMHhBMSwgMHhFQSwgMHg5RSwgLyogMHg4NC0weDg3ICovCisJMHhEQSwgMHhGMSwgMHhFQSwgMHg5RiwgMHhFQSwgMHhBMCwgMHhDQiwgMHhFNSwgLyogMHg4OC0weDhCICovCisJMHhFQiwgMHg0MCwgMHhEQSwgMHhGMiwgMHhFQiwgMHg0MSwgMHhDQiwgMHhFNiwgLyogMHg4Qy0weDhGICovCisJMHhEMiwgMHhGRSwgMHhFQiwgMHg0MiwgMHhFQiwgMHg0MywgMHhFQiwgMHg0NCwgLyogMHg5MC0weDkzICovCisJMHhCOCwgMHhGNCwgMHhFQiwgMHg0NSwgMHhFQiwgMHg0NiwgMHhEQSwgMHhGMywgLyogMHg5NC0weDk3ICovCisJMHhCMCwgMHhBRiwgMHhDRiwgMHhCNiwgMHhFQiwgMHg0NywgMHhFQiwgMHg0OCwgLyogMHg5OC0weDlCICovCisJMHhENSwgMHhDRiwgMHhFQiwgMHg0OSwgMHhFQiwgMHg0QSwgMHhFQiwgMHg0QiwgLyogMHg5Qy0weDlGICovCisJMHhFQiwgMHg0QywgMHhFQiwgMHg0RCwgMHhFQiwgMHg0RSwgMHhFQiwgMHg0RiwgLyogMHhBMC0weEEzICovCisJMHhFQiwgMHg1MCwgMHhFQiwgMHg1MSwgMHhFQiwgMHg1MiwgMHhDQiwgMHhFRCwgLyogMHhBNC0weEE3ICovCisJMHhFQiwgMHg1MywgMHhFQiwgMHg1NCwgMHhFQiwgMHg1NSwgMHhFQiwgMHg1NiwgLyogMHhBOC0weEFCICovCisJMHhFQiwgMHg1NywgMHhFQiwgMHg1OCwgMHhFQiwgMHg1OSwgMHhFQiwgMHg1QSwgLyogMHhBQy0weEFGICovCisJMHhEQSwgMHhGNCwgMHhFQiwgMHg1QiwgMHhFQiwgMHg1QywgMHhFMywgMHhDNCwgLyogMHhCMC0weEIzICovCisJMHhFQiwgMHg1RCwgMHhFQiwgMHg1RSwgMHhDMSwgMHhBNSwgMHhFQiwgMHg1RiwgLyogMHhCNC0weEI3ICovCisJMHhFQiwgMHg2MCwgMHhGNiwgMHhCRiwgMHhFQiwgMHg2MSwgMHhFQiwgMHg2MiwgLyogMHhCOC0weEJCICovCisJMHhGNiwgMHhDMCwgMHhGNiwgMHhDMSwgMHhDNCwgMHhEMSwgMHhFQiwgMHg2MywgLyogMHhCQy0weEJGICovCisJMHhDOCwgMHhCOCwgMHhEMSwgMHhFMywgMHhFQiwgMHg2NCwgMHhFQiwgMHg2NSwgLyogMHhDMC0weEMzICovCisJMHhEMCwgMHhEQiwgMHhEMSwgMHhDNSwgMHhCQywgMHhBRiwgMHhCOSwgMHhDRCwgLyogMHhDNC0weEM3ICovCisJMHhFQiwgMHg2NiwgMHhFRiwgMHhGNCwgMHhFQiwgMHg2NywgMHhFQiwgMHg2OCwgLyogMHhDOC0weENCICovCisJMHhCNCwgMHhDNiwgMHhEMywgMHhCQSwgMHhGNiwgMHhDMiwgMHhCMywgMHhGQiwgLyogMHhDQy0weENGICovCisJMHhFQiwgMHg2OSwgMHhFQiwgMHg2QSwgMHhGNiwgMHhDMywgMHhFQiwgMHg2QiwgLyogMHhEMC0weEQzICovCisJMHhFQiwgMHg2QywgMHhCNSwgMHhGMSwgMHhFQiwgMHg2RCwgMHhFQiwgMHg2RSwgLyogMHhENC0weEQ3ICovCisJMHhFQiwgMHg2RiwgMHhFQiwgMHg3MCwgMHhFQiwgMHg3MSwgMHhFQiwgMHg3MiwgLyogMHhEOC0weERCICovCisJMHhFQiwgMHg3MywgMHhFQiwgMHg3NCwgMHhFQiwgMHg3NSwgMHhFQiwgMHg3NiwgLyogMHhEQy0weERGICovCisJMHhGNiwgMHhDNSwgMHhFQiwgMHg3NywgMHhFQiwgMHg3OCwgMHhFQiwgMHg3OSwgLyogMHhFMC0weEUzICovCisJMHhFQiwgMHg3QSwgMHhFQiwgMHg3QiwgMHhFQiwgMHg3QywgMHhFQiwgMHg3RCwgLyogMHhFNC0weEU3ICovCisJMHhEMywgMHhFQSwgMHhGNiwgMHhBNywgMHhEMSwgMHhBOSwgMHhFQiwgMHg3RSwgLyogMHhFOC0weEVCICovCisJMHhFQiwgMHg4MCwgMHhFQiwgMHg4MSwgMHhFQiwgMHg4MiwgMHhGNiwgMHhBOSwgLyogMHhFQy0weEVGICovCisJMHhFQiwgMHg4MywgMHhFQiwgMHg4NCwgMHhFQiwgMHg4NSwgMHhGNiwgMHhBOCwgLyogMHhGMC0weEYzICovCisJMHhFQiwgMHg4NiwgMHhFQiwgMHg4NywgMHhDMSwgMHhFMywgMHhDMCwgMHhENywgLyogMHhGNC0weEY3ICovCisJMHhFQiwgMHg4OCwgMHhCMSwgMHhBMiwgMHhFQiwgMHg4OSwgMHhFQiwgMHg4QSwgLyogMHhGOC0weEZCICovCisJMHhFQiwgMHg4QiwgMHhFQiwgMHg4QywgMHhDRSwgMHhFRCwgMHhFQiwgMHg4RCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOTdbNTEyXSA9IHsKKwkweEQwLCAweEU4LCAweEY2LCAweEFCLCAweEVCLCAweDhFLCAweEVCLCAweDhGLCAvKiAweDAwLTB4MDMgKi8KKwkweENGLCAweEY2LCAweEVCLCAweDkwLCAweEY2LCAweEFBLCAweEQ1LCAweEYwLCAvKiAweDA0LTB4MDcgKi8KKwkweEY2LCAweEFDLCAweEMzLCAweEI5LCAweEVCLCAweDkxLCAweEVCLCAweDkyLCAvKiAweDA4LTB4MEIgKi8KKwkweEVCLCAweDkzLCAweEJCLCAweEY0LCAweEY2LCAweEFFLCAweEY2LCAweEFELCAvKiAweDBDLTB4MEYgKi8KKwkweEVCLCAweDk0LCAweEVCLCAweDk1LCAweEVCLCAweDk2LCAweEM0LCAweERFLCAvKiAweDEwLTB4MTMgKi8KKwkweEVCLCAweDk3LCAweEVCLCAweDk4LCAweEMxLCAweEQ4LCAweEVCLCAweDk5LCAvKiAweDE0LTB4MTcgKi8KKwkweEVCLCAweDlBLCAweEVCLCAweDlCLCAweEVCLCAweDlDLCAweEVCLCAweDlELCAvKiAweDE4LTB4MUIgKi8KKwkweENCLCAweEFBLCAweEVCLCAweDlFLCAweENGLCAweEJDLCAweEVCLCAweDlGLCAvKiAweDFDLTB4MUYgKi8KKwkweEVCLCAweEEwLCAweEVDLCAweDQwLCAweEVDLCAweDQxLCAweEVDLCAweDQyLCAvKiAweDIwLTB4MjMgKi8KKwkweEVDLCAweDQzLCAweEVDLCAweDQ0LCAweEVDLCAweDQ1LCAweEVDLCAweDQ2LCAvKiAweDI0LTB4MjcgKi8KKwkweEVDLCAweDQ3LCAweEVDLCAweDQ4LCAweEY2LCAweEFGLCAweEVDLCAweDQ5LCAvKiAweDI4LTB4MkIgKi8KKwkweEVDLCAweDRBLCAweEY2LCAweEIwLCAweEVDLCAweDRCLCAweEVDLCAweDRDLCAvKiAweDJDLTB4MkYgKi8KKwkweEY2LCAweEIxLCAweEVDLCAweDRELCAweEMyLCAweEI2LCAweEVDLCAweDRFLCAvKiAweDMwLTB4MzMgKi8KKwkweEVDLCAweDRGLCAweEVDLCAweDUwLCAweEVDLCAweDUxLCAweEVDLCAweDUyLCAvKiAweDM0LTB4MzcgKi8KKwkweEIwLCAweEQ0LCAweEM1LCAweEY5LCAweEVDLCAweDUzLCAweEVDLCAweDU0LCAvKiAweDM4LTB4M0IgKi8KKwkweEVDLCAweDU1LCAweEVDLCAweDU2LCAweEY2LCAweEIyLCAweEVDLCAweDU3LCAvKiAweDNDLTB4M0YgKi8KKwkweEVDLCAweDU4LCAweEVDLCAweDU5LCAweEVDLCAweDVBLCAweEVDLCAweDVCLCAvKiAweDQwLTB4NDMgKi8KKwkweEVDLCAweDVDLCAweEVDLCAweDVELCAweEVDLCAweDVFLCAweEVDLCAweDVGLCAvKiAweDQ0LTB4NDcgKi8KKwkweEVDLCAweDYwLCAweEVDLCAweDYxLCAweEVDLCAweDYyLCAweEVDLCAweDYzLCAvKiAweDQ4LTB4NEIgKi8KKwkweEVDLCAweDY0LCAweEVDLCAweDY1LCAweEVDLCAweDY2LCAweEVDLCAweDY3LCAvKiAweDRDLTB4NEYgKi8KKwkweEVDLCAweDY4LCAweEVDLCAweDY5LCAweEM3LCAweEUwLCAweEY2LCAweEE2LCAvKiAweDUwLTB4NTMgKi8KKwkweEVDLCAweDZBLCAweEVDLCAweDZCLCAweEJFLCAweEI4LCAweEVDLCAweDZDLCAvKiAweDU0LTB4NTcgKi8KKwkweEVDLCAweDZELCAweEJFLCAweEIyLCAweEVDLCAweDZFLCAweEI1LCAweEU1LCAvKiAweDU4LTB4NUIgKi8KKwkweEVDLCAweDZGLCAweEVDLCAweDcwLCAweEI3LCAweEM3LCAweEVDLCAweDcxLCAvKiAweDVDLTB4NUYgKi8KKwkweEJGLCAweEJGLCAweEMzLCAweEQyLCAweEMzLCAweEU2LCAweEVDLCAweDcyLCAvKiAweDYwLTB4NjMgKi8KKwkweEVDLCAweDczLCAweEQ4LCAweENDLCAweEVDLCAweDc0LCAweEVDLCAweDc1LCAvKiAweDY0LTB4NjcgKi8KKwkweEVDLCAweDc2LCAweEI4LCAweEVGLCAweEVDLCAweDc3LCAweEVDLCAweDc4LCAvKiAweDY4LTB4NkIgKi8KKwkweEVDLCAweDc5LCAweEVDLCAweDdBLCAweEVDLCAweDdCLCAweEVDLCAweDdDLCAvKiAweDZDLTB4NkYgKi8KKwkweEVDLCAweDdELCAweEVDLCAweDdFLCAweEVDLCAweDgwLCAweEJELCAweEY5LCAvKiAweDcwLTB4NzMgKi8KKwkweEQxLCAweEE1LCAweEVDLCAweDgxLCAweEIwLCAweEQwLCAweEVDLCAweDgyLCAvKiAweDc0LTB4NzcgKi8KKwkweEVDLCAweDgzLCAweEVDLCAweDg0LCAweEVDLCAweDg1LCAweEVDLCAweDg2LCAvKiAweDc4LTB4N0IgKi8KKwkweEY3LCAweEIwLCAweEVDLCAweDg3LCAweEVDLCAweDg4LCAweEVDLCAweDg5LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEVDLCAweDhBLCAweEVDLCAweDhCLCAweEVDLCAweDhDLCAweEVDLCAweDhELCAvKiAweDgwLTB4ODMgKi8KKwkweEVDLCAweDhFLCAweEY3LCAweEIxLCAweEVDLCAweDhGLCAweEVDLCAweDkwLCAvKiAweDg0LTB4ODcgKi8KKwkweEVDLCAweDkxLCAweEVDLCAweDkyLCAweEVDLCAweDkzLCAweEQwLCAweEFDLCAvKiAweDg4LTB4OEIgKi8KKwkweEVDLCAweDk0LCAweEIwLCAweEIwLCAweEVDLCAweDk1LCAweEVDLCAweDk2LCAvKiAweDhDLTB4OEYgKi8KKwkweEVDLCAweDk3LCAweEY3LCAweEIyLCAweEY3LCAweEIzLCAweEVDLCAweDk4LCAvKiAweDkwLTB4OTMgKi8KKwkweEY3LCAweEI0LCAweEVDLCAweDk5LCAweEVDLCAweDlBLCAweEVDLCAweDlCLCAvKiAweDk0LTB4OTcgKi8KKwkweEM3LCAweENBLCAweEVDLCAweDlDLCAweEVDLCAweDlELCAweEVDLCAweDlFLCAvKiAweDk4LTB4OUIgKi8KKwkweEVDLCAweDlGLCAweEVDLCAweEEwLCAweEVELCAweDQwLCAweEVELCAweDQxLCAvKiAweDlDLTB4OUYgKi8KKwkweEJFLCAweENGLCAweEVELCAweDQyLCAweEVELCAweDQzLCAweEY3LCAweEI3LCAvKiAweEEwLTB4QTMgKi8KKwkweEVELCAweDQ0LCAweEVELCAweDQ1LCAweEVELCAweDQ2LCAweEVELCAweDQ3LCAvKiAweEE0LTB4QTcgKi8KKwkweEVELCAweDQ4LCAweEVELCAweDQ5LCAweEVELCAweDRBLCAweEY3LCAweEI2LCAvKiAweEE4LTB4QUIgKi8KKwkweEVELCAweDRCLCAweEIxLCAweERFLCAweEVELCAweDRDLCAweEY3LCAweEI1LCAvKiAweEFDLTB4QUYgKi8KKwkweEVELCAweDRELCAweEVELCAweDRFLCAweEY3LCAweEI4LCAweEVELCAweDRGLCAvKiAweEIwLTB4QjMgKi8KKwkweEY3LCAweEI5LCAweEVELCAweDUwLCAweEVELCAweDUxLCAweEVELCAweDUyLCAvKiAweEI0LTB4QjcgKi8KKwkweEVELCAweDUzLCAweEVELCAweDU0LCAweEVELCAweDU1LCAweEVELCAweDU2LCAvKiAweEI4LTB4QkIgKi8KKwkweEVELCAweDU3LCAweEVELCAweDU4LCAweEVELCAweDU5LCAweEVELCAweDVBLCAvKiAweEJDLTB4QkYgKi8KKwkweEVELCAweDVCLCAweEVELCAweDVDLCAweEVELCAweDVELCAweEVELCAweDVFLCAvKiAweEMwLTB4QzMgKi8KKwkweEVELCAweDVGLCAweEVELCAweDYwLCAweEVELCAweDYxLCAweEVELCAweDYyLCAvKiAweEM0LTB4QzcgKi8KKwkweEVELCAweDYzLCAweEVELCAweDY0LCAweEVELCAweDY1LCAweEVELCAweDY2LCAvKiAweEM4LTB4Q0IgKi8KKwkweEVELCAweDY3LCAweEVELCAweDY4LCAweEVELCAweDY5LCAweEVELCAweDZBLCAvKiAweENDLTB4Q0YgKi8KKwkweEVELCAweDZCLCAweEVELCAweDZDLCAweEVELCAweDZELCAweEVELCAweDZFLCAvKiAweEQwLTB4RDMgKi8KKwkweEVELCAweDZGLCAweEVELCAweDcwLCAweEVELCAweDcxLCAweEVELCAweDcyLCAvKiAweEQ0LTB4RDcgKi8KKwkweEVELCAweDczLCAweEVELCAweDc0LCAweEVELCAweDc1LCAweEVELCAweDc2LCAvKiAweEQ4LTB4REIgKi8KKwkweEVELCAweDc3LCAweEVELCAweDc4LCAweEVELCAweDc5LCAweEVELCAweDdBLCAvKiAweERDLTB4REYgKi8KKwkweEVELCAweDdCLCAweEVELCAweDdDLCAweEVELCAweDdELCAweEVELCAweDdFLCAvKiAweEUwLTB4RTMgKi8KKwkweEVELCAweDgwLCAweEVELCAweDgxLCAweENFLCAweEE0LCAweEM4LCAweENELCAvKiAweEU0LTB4RTcgKi8KKwkweEVELCAweDgyLCAweEJBLCAweEFCLCAweEU4LCAweEI4LCAweEU4LCAweEI5LCAvKiAweEU4LTB4RUIgKi8KKwkweEU4LCAweEJBLCAweEJFLCAweEMyLCAweEVELCAweDgzLCAweEVELCAweDg0LCAvKiAweEVDLTB4RUYgKi8KKwkweEVELCAweDg1LCAweEVELCAweDg2LCAweEVELCAweDg3LCAweEQyLCAweEY0LCAvKiAweEYwLTB4RjMgKi8KKwkweEVELCAweDg4LCAweEQ0LCAweENGLCAweEM5LCAweEQ4LCAweEVELCAweDg5LCAvKiAweEY0LTB4RjcgKi8KKwkweEVELCAweDhBLCAweEVELCAweDhCLCAweEVELCAweDhDLCAweEVELCAweDhELCAvKiAweEY4LTB4RkIgKi8KKwkweEVELCAweDhFLCAweEVELCAweDhGLCAweEVELCAweDkwLCAweEVELCAweDkxLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185OFs1MTJdID0geworCTB4RUQsIDB4OTIsIDB4RUQsIDB4OTMsIDB4RUQsIDB4OTQsIDB4RUQsIDB4OTUsIC8qIDB4MDAtMHgwMyAqLworCTB4RUQsIDB4OTYsIDB4RUQsIDB4OTcsIDB4RUQsIDB4OTgsIDB4RUQsIDB4OTksIC8qIDB4MDQtMHgwNyAqLworCTB4RUQsIDB4OUEsIDB4RUQsIDB4OUIsIDB4RUQsIDB4OUMsIDB4RUQsIDB4OUQsIC8qIDB4MDgtMHgwQiAqLworCTB4RUQsIDB4OUUsIDB4RUQsIDB4OUYsIDB4RUQsIDB4QTAsIDB4RUUsIDB4NDAsIC8qIDB4MEMtMHgwRiAqLworCTB4RUUsIDB4NDEsIDB4RUUsIDB4NDIsIDB4RUUsIDB4NDMsIDB4RUUsIDB4NDQsIC8qIDB4MTAtMHgxMyAqLworCTB4RUUsIDB4NDUsIDB4RUUsIDB4NDYsIDB4RUUsIDB4NDcsIDB4RUUsIDB4NDgsIC8qIDB4MTQtMHgxNyAqLworCTB4RUUsIDB4NDksIDB4RUUsIDB4NEEsIDB4RUUsIDB4NEIsIDB4RUUsIDB4NEMsIC8qIDB4MTgtMHgxQiAqLworCTB4RUUsIDB4NEQsIDB4RUUsIDB4NEUsIDB4RUUsIDB4NEYsIDB4RUUsIDB4NTAsIC8qIDB4MUMtMHgxRiAqLworCTB4RUUsIDB4NTEsIDB4RUUsIDB4NTIsIDB4RUUsIDB4NTMsIDB4RUUsIDB4NTQsIC8qIDB4MjAtMHgyMyAqLworCTB4RUUsIDB4NTUsIDB4RUUsIDB4NTYsIDB4RUUsIDB4NTcsIDB4RUUsIDB4NTgsIC8qIDB4MjQtMHgyNyAqLworCTB4RUUsIDB4NTksIDB4RUUsIDB4NUEsIDB4RUUsIDB4NUIsIDB4RUUsIDB4NUMsIC8qIDB4MjgtMHgyQiAqLworCTB4RUUsIDB4NUQsIDB4RUUsIDB4NUUsIDB4RUUsIDB4NUYsIDB4RUUsIDB4NjAsIC8qIDB4MkMtMHgyRiAqLworCTB4RUUsIDB4NjEsIDB4RUUsIDB4NjIsIDB4RUUsIDB4NjMsIDB4RUUsIDB4NjQsIC8qIDB4MzAtMHgzMyAqLworCTB4RUUsIDB4NjUsIDB4RUUsIDB4NjYsIDB4RUUsIDB4NjcsIDB4RUUsIDB4NjgsIC8qIDB4MzQtMHgzNyAqLworCTB4RUUsIDB4NjksIDB4RUUsIDB4NkEsIDB4RUUsIDB4NkIsIDB4RUUsIDB4NkMsIC8qIDB4MzgtMHgzQiAqLworCTB4RUUsIDB4NkQsIDB4RUUsIDB4NkUsIDB4RUUsIDB4NkYsIDB4RUUsIDB4NzAsIC8qIDB4M0MtMHgzRiAqLworCTB4RUUsIDB4NzEsIDB4RUUsIDB4NzIsIDB4RUUsIDB4NzMsIDB4RUUsIDB4NzQsIC8qIDB4NDAtMHg0MyAqLworCTB4RUUsIDB4NzUsIDB4RUUsIDB4NzYsIDB4RUUsIDB4NzcsIDB4RUUsIDB4NzgsIC8qIDB4NDQtMHg0NyAqLworCTB4RUUsIDB4NzksIDB4RUUsIDB4N0EsIDB4RUUsIDB4N0IsIDB4RUUsIDB4N0MsIC8qIDB4NDgtMHg0QiAqLworCTB4RUUsIDB4N0QsIDB4RUUsIDB4N0UsIDB4RUUsIDB4ODAsIDB4RUUsIDB4ODEsIC8qIDB4NEMtMHg0RiAqLworCTB4RUUsIDB4ODIsIDB4RUUsIDB4ODMsIDB4RUUsIDB4ODQsIDB4RUUsIDB4ODUsIC8qIDB4NTAtMHg1MyAqLworCTB4RUUsIDB4ODYsIDB4RUUsIDB4ODcsIDB4RUUsIDB4ODgsIDB4RUUsIDB4ODksIC8qIDB4NTQtMHg1NyAqLworCTB4RUUsIDB4OEEsIDB4RUUsIDB4OEIsIDB4RUUsIDB4OEMsIDB4RUUsIDB4OEQsIC8qIDB4NTgtMHg1QiAqLworCTB4RUUsIDB4OEUsIDB4RUUsIDB4OEYsIDB4RUUsIDB4OTAsIDB4RUUsIDB4OTEsIC8qIDB4NUMtMHg1RiAqLworCTB4RUUsIDB4OTIsIDB4RUUsIDB4OTMsIDB4RUUsIDB4OTQsIDB4RUUsIDB4OTUsIC8qIDB4NjAtMHg2MyAqLworCTB4RUUsIDB4OTYsIDB4RUUsIDB4OTcsIDB4RUUsIDB4OTgsIDB4RUUsIDB4OTksIC8qIDB4NjQtMHg2NyAqLworCTB4RUUsIDB4OUEsIDB4RUUsIDB4OUIsIDB4RUUsIDB4OUMsIDB4RUUsIDB4OUQsIC8qIDB4NjgtMHg2QiAqLworCTB4RUUsIDB4OUUsIDB4RUUsIDB4OUYsIDB4RUUsIDB4QTAsIDB4RUYsIDB4NDAsIC8qIDB4NkMtMHg2RiAqLworCTB4RUYsIDB4NDEsIDB4RUYsIDB4NDIsIDB4RUYsIDB4NDMsIDB4RUYsIDB4NDQsIC8qIDB4NzAtMHg3MyAqLworCTB4RUYsIDB4NDUsIDB4RDIsIDB4QjMsIDB4QjYsIDB4QTUsIDB4QzcsIDB4RUEsIC8qIDB4NzQtMHg3NyAqLworCTB4RjEsIDB4RkMsIDB4Q0YsIDB4RUUsIDB4Q0IsIDB4QjMsIDB4RDAsIDB4RUIsIC8qIDB4NzgtMHg3QiAqLworCTB4RTcsIDB4RUYsIDB4Q0QsIDB4RTcsIDB4QjksIDB4Q0IsIDB4QjYsIDB4RDksIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RjEsIDB4RkQsIDB4QjAsIDB4RTQsIDB4Q0IsIDB4Q0MsIDB4RjEsIDB4RkUsIC8qIDB4ODAtMHg4MyAqLworCTB4RDQsIDB4QTQsIDB4QzIsIDB4QUQsIDB4QzEsIDB4RUMsIDB4QzYsIDB4QzQsIC8qIDB4ODQtMHg4NyAqLworCTB4QkUsIDB4QjEsIDB4RjIsIDB4QTEsIDB4QkMsIDB4RDUsIDB4RUYsIDB4NDYsIC8qIDB4ODgtMHg4QiAqLworCTB4RjIsIDB4QTIsIDB4RjIsIDB4QTMsIDB4RUYsIDB4NDcsIDB4RjIsIDB4QTQsIC8qIDB4OEMtMHg4RiAqLworCTB4RDIsIDB4QzMsIDB4QzYsIDB4QjUsIDB4RUYsIDB4NDgsIDB4Q0QsIDB4QzcsIC8qIDB4OTAtMHg5MyAqLworCTB4RjIsIDB4QTUsIDB4RUYsIDB4NDksIDB4RDMsIDB4QjEsIDB4QkYsIDB4QzUsIC8qIDB4OTQtMHg5NyAqLworCTB4Q0MsIDB4RTIsIDB4RUYsIDB4NEEsIDB4RjIsIDB4QTYsIDB4RjIsIDB4QTcsIC8qIDB4OTgtMHg5QiAqLworCTB4RDEsIDB4RDUsIDB4QjYsIDB4RUUsIDB4RjIsIDB4QTgsIDB4RjIsIDB4QTksIC8qIDB4OUMtMHg5RiAqLworCTB4QjUsIDB4REYsIDB4RjIsIDB4QUEsIDB4RjIsIDB4QUIsIDB4RUYsIDB4NEIsIC8qIDB4QTAtMHhBMyAqLworCTB4QjIsIDB4RkMsIDB4RjIsIDB4QUMsIDB4RjIsIDB4QUQsIDB4QzgsIDB4QTcsIC8qIDB4QTQtMHhBNyAqLworCTB4RUYsIDB4NEMsIDB4RUYsIDB4NEQsIDB4RUYsIDB4NEUsIDB4RUYsIDB4NEYsIC8qIDB4QTgtMHhBQiAqLworCTB4RUYsIDB4NTAsIDB4RUYsIDB4NTEsIDB4RUYsIDB4NTIsIDB4RUYsIDB4NTMsIC8qIDB4QUMtMHhBRiAqLworCTB4RUYsIDB4NTQsIDB4RUYsIDB4NTUsIDB4RUYsIDB4NTYsIDB4RUYsIDB4NTcsIC8qIDB4QjAtMHhCMyAqLworCTB4RUYsIDB4NTgsIDB4RUYsIDB4NTksIDB4RUYsIDB4NUEsIDB4RUYsIDB4NUIsIC8qIDB4QjQtMHhCNyAqLworCTB4RUYsIDB4NUMsIDB4RUYsIDB4NUQsIDB4RUYsIDB4NUUsIDB4RUYsIDB4NUYsIC8qIDB4QjgtMHhCQiAqLworCTB4RUYsIDB4NjAsIDB4RUYsIDB4NjEsIDB4RUYsIDB4NjIsIDB4RUYsIDB4NjMsIC8qIDB4QkMtMHhCRiAqLworCTB4RUYsIDB4NjQsIDB4RUYsIDB4NjUsIDB4RUYsIDB4NjYsIDB4RUYsIDB4NjcsIC8qIDB4QzAtMHhDMyAqLworCTB4RUYsIDB4NjgsIDB4RUYsIDB4NjksIDB4RUYsIDB4NkEsIDB4RUYsIDB4NkIsIC8qIDB4QzQtMHhDNyAqLworCTB4RUYsIDB4NkMsIDB4RUYsIDB4NkQsIDB4RUYsIDB4NkUsIDB4RUYsIDB4NkYsIC8qIDB4QzgtMHhDQiAqLworCTB4RUYsIDB4NzAsIDB4RUYsIDB4NzEsIDB4QjcsIDB4RTcsIDB4RUYsIDB4NzIsIC8qIDB4Q0MtMHhDRiAqLworCTB4RUYsIDB4NzMsIDB4RUMsIDB4QTksIDB4RUMsIDB4QUEsIDB4RUMsIDB4QUIsIC8qIDB4RDAtMHhEMyAqLworCTB4RUYsIDB4NzQsIDB4RUMsIDB4QUMsIDB4RUYsIDB4NzUsIDB4RUYsIDB4NzYsIC8qIDB4RDQtMHhENyAqLworCTB4QzYsIDB4QUUsIDB4RUMsIDB4QUQsIDB4RUMsIDB4QUUsIDB4RUYsIDB4NzcsIC8qIDB4RDgtMHhEQiAqLworCTB4RUYsIDB4NzgsIDB4RUYsIDB4NzksIDB4QjcsIDB4QzksIDB4Q0EsIDB4QjMsIC8qIDB4REMtMHhERiAqLworCTB4RUYsIDB4N0EsIDB4RUYsIDB4N0IsIDB4RUYsIDB4N0MsIDB4RUYsIDB4N0QsIC8qIDB4RTAtMHhFMyAqLworCTB4RUYsIDB4N0UsIDB4RUYsIDB4ODAsIDB4RUYsIDB4ODEsIDB4RTIsIDB4QjgsIC8qIDB4RTQtMHhFNyAqLworCTB4RjcsIDB4Q0YsIDB4RUYsIDB4ODIsIDB4RUYsIDB4ODMsIDB4RUYsIDB4ODQsIC8qIDB4RTgtMHhFQiAqLworCTB4RUYsIDB4ODUsIDB4RUYsIDB4ODYsIDB4RUYsIDB4ODcsIDB4RUYsIDB4ODgsIC8qIDB4RUMtMHhFRiAqLworCTB4RUYsIDB4ODksIDB4RUYsIDB4OEEsIDB4RUYsIDB4OEIsIDB4RUYsIDB4OEMsIC8qIDB4RjAtMHhGMyAqLworCTB4RUYsIDB4OEQsIDB4RUYsIDB4OEUsIDB4RUYsIDB4OEYsIDB4RUYsIDB4OTAsIC8qIDB4RjQtMHhGNyAqLworCTB4RUYsIDB4OTEsIDB4RUYsIDB4OTIsIDB4RUYsIDB4OTMsIDB4RUYsIDB4OTQsIC8qIDB4RjgtMHhGQiAqLworCTB4RUYsIDB4OTUsIDB4RUYsIDB4OTYsIDB4RUYsIDB4OTcsIDB4RUYsIDB4OTgsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzk5WzUxMl0gPSB7CisJMHhFRiwgMHg5OSwgMHhFRiwgMHg5QSwgMHhFRiwgMHg5QiwgMHhFRiwgMHg5QywgLyogMHgwMC0weDAzICovCisJMHhFRiwgMHg5RCwgMHhFRiwgMHg5RSwgMHhFRiwgMHg5RiwgMHhFRiwgMHhBMCwgLyogMHgwNC0weDA3ICovCisJMHhGMCwgMHg0MCwgMHhGMCwgMHg0MSwgMHhGMCwgMHg0MiwgMHhGMCwgMHg0MywgLyogMHgwOC0weDBCICovCisJMHhGMCwgMHg0NCwgMHhGNywgMHhEMCwgMHhGMCwgMHg0NSwgMHhGMCwgMHg0NiwgLyogMHgwQy0weDBGICovCisJMHhCMiwgMHhDRCwgMHhGMCwgMHg0NywgMHhGMCwgMHg0OCwgMHhGMCwgMHg0OSwgLyogMHgxMC0weDEzICovCisJMHhGMCwgMHg0QSwgMHhGMCwgMHg0QiwgMHhGMCwgMHg0QywgMHhGMCwgMHg0RCwgLyogMHgxNC0weDE3ICovCisJMHhGMCwgMHg0RSwgMHhGMCwgMHg0RiwgMHhGMCwgMHg1MCwgMHhGMCwgMHg1MSwgLyogMHgxOC0weDFCICovCisJMHhGMCwgMHg1MiwgMHhGMCwgMHg1MywgMHhGMCwgMHg1NCwgMHhGMCwgMHg1NSwgLyogMHgxQy0weDFGICovCisJMHhGMCwgMHg1NiwgMHhGMCwgMHg1NywgMHhGMCwgMHg1OCwgMHhGMCwgMHg1OSwgLyogMHgyMC0weDIzICovCisJMHhGMCwgMHg1QSwgMHhGMCwgMHg1QiwgMHhGMCwgMHg1QywgMHhGMCwgMHg1RCwgLyogMHgyNC0weDI3ICovCisJMHhGMCwgMHg1RSwgMHhGMCwgMHg1RiwgMHhGMCwgMHg2MCwgMHhGMCwgMHg2MSwgLyogMHgyOC0weDJCICovCisJMHhGMCwgMHg2MiwgMHhGMCwgMHg2MywgMHhGNywgMHhEMSwgMHhGMCwgMHg2NCwgLyogMHgyQy0weDJGICovCisJMHhGMCwgMHg2NSwgMHhGMCwgMHg2NiwgMHhGMCwgMHg2NywgMHhGMCwgMHg2OCwgLyogMHgzMC0weDMzICovCisJMHhGMCwgMHg2OSwgMHhGMCwgMHg2QSwgMHhGMCwgMHg2QiwgMHhGMCwgMHg2QywgLyogMHgzNC0weDM3ICovCisJMHhGMCwgMHg2RCwgMHhGMCwgMHg2RSwgMHhGMCwgMHg2RiwgMHhGMCwgMHg3MCwgLyogMHgzOC0weDNCICovCisJMHhGMCwgMHg3MSwgMHhGMCwgMHg3MiwgMHhGMCwgMHg3MywgMHhGMCwgMHg3NCwgLyogMHgzQy0weDNGICovCisJMHhGMCwgMHg3NSwgMHhGMCwgMHg3NiwgMHhGMCwgMHg3NywgMHhGMCwgMHg3OCwgLyogMHg0MC0weDQzICovCisJMHhGMCwgMHg3OSwgMHhGMCwgMHg3QSwgMHhGMCwgMHg3QiwgMHhGMCwgMHg3QywgLyogMHg0NC0weDQ3ICovCisJMHhGMCwgMHg3RCwgMHhGMCwgMHg3RSwgMHhGMCwgMHg4MCwgMHhGMCwgMHg4MSwgLyogMHg0OC0weDRCICovCisJMHhGMCwgMHg4MiwgMHhGMCwgMHg4MywgMHhGMCwgMHg4NCwgMHhGMCwgMHg4NSwgLyogMHg0Qy0weDRGICovCisJMHhGMCwgMHg4NiwgMHhGMCwgMHg4NywgMHhGMCwgMHg4OCwgMHhGMCwgMHg4OSwgLyogMHg1MC0weDUzICovCisJMHhGNywgMHhEMywgMHhGNywgMHhEMiwgMHhGMCwgMHg4QSwgMHhGMCwgMHg4QiwgLyogMHg1NC0weDU3ICovCisJMHhGMCwgMHg4QywgMHhGMCwgMHg4RCwgMHhGMCwgMHg4RSwgMHhGMCwgMHg4RiwgLyogMHg1OC0weDVCICovCisJMHhGMCwgMHg5MCwgMHhGMCwgMHg5MSwgMHhGMCwgMHg5MiwgMHhGMCwgMHg5MywgLyogMHg1Qy0weDVGICovCisJMHhGMCwgMHg5NCwgMHhGMCwgMHg5NSwgMHhGMCwgMHg5NiwgMHhFMiwgMHhCQiwgLyogMHg2MC0weDYzICovCisJMHhGMCwgMHg5NywgMHhCQywgMHhBMiwgMHhGMCwgMHg5OCwgMHhFMiwgMHhCQywgLyogMHg2NC0weDY3ICovCisJMHhFMiwgMHhCRCwgMHhFMiwgMHhCRSwgMHhFMiwgMHhCRiwgMHhFMiwgMHhDMCwgLyogMHg2OC0weDZCICovCisJMHhFMiwgMHhDMSwgMHhCNywgMHhCOSwgMHhEMiwgMHhGQiwgMHhCRCwgMHhBNCwgLyogMHg2Qy0weDZGICovCisJMHhDQSwgMHhDRSwgMHhCMSwgMHhBNSwgMHhDQiwgMHhDNywgMHhGMCwgMHg5OSwgLyogMHg3MC0weDczICovCisJMHhFMiwgMHhDMiwgMHhCNiwgMHhGQywgMHhDOCwgMHhDNCwgMHhFMiwgMHhDMywgLyogMHg3NC0weDc3ICovCisJMHhGMCwgMHg5QSwgMHhGMCwgMHg5QiwgMHhCRCwgMHhDOCwgMHhGMCwgMHg5QywgLyogMHg3OC0weDdCICovCisJMHhCMSwgMHhGRCwgMHhFMiwgMHhDNCwgMHhGMCwgMHg5RCwgMHhCNiwgMHhGNiwgLyogMHg3Qy0weDdGICovCisJCisJMHhFMiwgMHhDNSwgMHhDNCwgMHhEOSwgMHhGMCwgMHg5RSwgMHhGMCwgMHg5RiwgLyogMHg4MC0weDgzICovCisJMHhFMiwgMHhDNiwgMHhDRiwgMHhEQSwgMHhCOSwgMHhERCwgMHhFMiwgMHhDNywgLyogMHg4NC0weDg3ICovCisJMHhDMCwgMHhBMSwgMHhGMCwgMHhBMCwgMHhFMiwgMHhDOCwgMHhCMiwgMHhGNiwgLyogMHg4OC0weDhCICovCisJMHhGMSwgMHg0MCwgMHhFMiwgMHhDOSwgMHhGMSwgMHg0MSwgMHhDMSwgMHhGMywgLyogMHg4Qy0weDhGICovCisJMHhFMiwgMHhDQSwgMHhFMiwgMHhDQiwgMHhDMiwgMHhGOCwgMHhFMiwgMHhDQywgLyogMHg5MC0weDkzICovCisJMHhFMiwgMHhDRCwgMHhFMiwgMHhDRSwgMHhDQSwgMHhENywgMHhEOCwgMHhCOCwgLyogMHg5NC0weDk3ICovCisJMHhEOSwgMHhFNSwgMHhDRiwgMHhFMywgMHhGMSwgMHg0MiwgMHhGMSwgMHg0MywgLyogMHg5OC0weDlCICovCisJMHhGMSwgMHg0NCwgMHhGMSwgMHg0NSwgMHhGMSwgMHg0NiwgMHhGMSwgMHg0NywgLyogMHg5Qy0weDlGICovCisJMHhGMSwgMHg0OCwgMHhGMSwgMHg0OSwgMHhGMSwgMHg0QSwgMHhGMSwgMHg0QiwgLyogMHhBMC0weEEzICovCisJMHhGMSwgMHg0QywgMHhGMCwgMHhBNSwgMHhGMSwgMHg0RCwgMHhGMSwgMHg0RSwgLyogMHhBNC0weEE3ICovCisJMHhEQywgMHhCMCwgMHhGMSwgMHg0RiwgMHhGMSwgMHg1MCwgMHhGMSwgMHg1MSwgLyogMHhBOC0weEFCICovCisJMHhGMSwgMHg1MiwgMHhGMSwgMHg1MywgMHhGMSwgMHg1NCwgMHhGMSwgMHg1NSwgLyogMHhBQy0weEFGICovCisJMHhGMSwgMHg1NiwgMHhGMSwgMHg1NywgMHhGMSwgMHg1OCwgMHhGMSwgMHg1OSwgLyogMHhCMC0weEIzICovCisJMHhGMSwgMHg1QSwgMHhGMSwgMHg1QiwgMHhGMSwgMHg1QywgMHhGMSwgMHg1RCwgLyogMHhCNC0weEI3ICovCisJMHhGMSwgMHg1RSwgMHhGMSwgMHg1RiwgMHhGMSwgMHg2MCwgMHhGMSwgMHg2MSwgLyogMHhCOC0weEJCICovCisJMHhGMSwgMHg2MiwgMHhGMSwgMHg2MywgMHhGMSwgMHg2NCwgMHhGMSwgMHg2NSwgLyogMHhCQy0weEJGICovCisJMHhGMSwgMHg2NiwgMHhGMSwgMHg2NywgMHhGMSwgMHg2OCwgMHhGMSwgMHg2OSwgLyogMHhDMC0weEMzICovCisJMHhGMSwgMHg2QSwgMHhGMSwgMHg2QiwgMHhGMSwgMHg2QywgMHhGMSwgMHg2RCwgLyogMHhDNC0weEM3ICovCisJMHhGMSwgMHg2RSwgMHhGMSwgMHg2RiwgMHhGMSwgMHg3MCwgMHhGMSwgMHg3MSwgLyogMHhDOC0weENCICovCisJMHhGMSwgMHg3MiwgMHhGMSwgMHg3MywgMHhGMSwgMHg3NCwgMHhGMSwgMHg3NSwgLyogMHhDQy0weENGICovCisJMHhGMSwgMHg3NiwgMHhGMSwgMHg3NywgMHhGMSwgMHg3OCwgMHhGMSwgMHg3OSwgLyogMHhEMC0weEQzICovCisJMHhGMSwgMHg3QSwgMHhGMSwgMHg3QiwgMHhGMSwgMHg3QywgMHhGMSwgMHg3RCwgLyogMHhENC0weEQ3ICovCisJMHhGMSwgMHg3RSwgMHhGMSwgMHg4MCwgMHhGMSwgMHg4MSwgMHhGMSwgMHg4MiwgLyogMHhEOC0weERCICovCisJMHhGMSwgMHg4MywgMHhGMSwgMHg4NCwgMHhGMSwgMHg4NSwgMHhGMSwgMHg4NiwgLyogMHhEQy0weERGICovCisJMHhGMSwgMHg4NywgMHhGMSwgMHg4OCwgMHhGMSwgMHg4OSwgMHhGMSwgMHg4QSwgLyogMHhFMC0weEUzICovCisJMHhGMSwgMHg4QiwgMHhGMSwgMHg4QywgMHhGMSwgMHg4RCwgMHhGMSwgMHg4RSwgLyogMHhFNC0weEU3ICovCisJMHhGMSwgMHg4RiwgMHhGMSwgMHg5MCwgMHhGMSwgMHg5MSwgMHhGMSwgMHg5MiwgLyogMHhFOC0weEVCICovCisJMHhGMSwgMHg5MywgMHhGMSwgMHg5NCwgMHhGMSwgMHg5NSwgMHhGMSwgMHg5NiwgLyogMHhFQy0weEVGICovCisJMHhGMSwgMHg5NywgMHhGMSwgMHg5OCwgMHhGMSwgMHg5OSwgMHhGMSwgMHg5QSwgLyogMHhGMC0weEYzICovCisJMHhGMSwgMHg5QiwgMHhGMSwgMHg5QywgMHhGMSwgMHg5RCwgMHhGMSwgMHg5RSwgLyogMHhGNC0weEY3ICovCisJMHhGMSwgMHg5RiwgMHhGMSwgMHhBMCwgMHhGMiwgMHg0MCwgMHhGMiwgMHg0MSwgLyogMHhGOC0weEZCICovCisJMHhGMiwgMHg0MiwgMHhGMiwgMHg0MywgMHhGMiwgMHg0NCwgMHhGMiwgMHg0NSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOUFbNTEyXSA9IHsKKwkweEYyLCAweDQ2LCAweEYyLCAweDQ3LCAweEYyLCAweDQ4LCAweEYyLCAweDQ5LCAvKiAweDAwLTB4MDMgKi8KKwkweEYyLCAweDRBLCAweEYyLCAweDRCLCAweEYyLCAweDRDLCAweEYyLCAweDRELCAvKiAweDA0LTB4MDcgKi8KKwkweEYyLCAweDRFLCAweEYyLCAweDRGLCAweEYyLCAweDUwLCAweEYyLCAweDUxLCAvKiAweDA4LTB4MEIgKi8KKwkweEYyLCAweDUyLCAweEYyLCAweDUzLCAweEYyLCAweDU0LCAweEYyLCAweDU1LCAvKiAweDBDLTB4MEYgKi8KKwkweEYyLCAweDU2LCAweEYyLCAweDU3LCAweEYyLCAweDU4LCAweEYyLCAweDU5LCAvKiAweDEwLTB4MTMgKi8KKwkweEYyLCAweDVBLCAweEYyLCAweDVCLCAweEYyLCAweDVDLCAweEYyLCAweDVELCAvKiAweDE0LTB4MTcgKi8KKwkweEYyLCAweDVFLCAweEYyLCAweDVGLCAweEYyLCAweDYwLCAweEYyLCAweDYxLCAvKiAweDE4LTB4MUIgKi8KKwkweEYyLCAweDYyLCAweEYyLCAweDYzLCAweEYyLCAweDY0LCAweEYyLCAweDY1LCAvKiAweDFDLTB4MUYgKi8KKwkweEYyLCAweDY2LCAweEYyLCAweDY3LCAweEYyLCAweDY4LCAweEYyLCAweDY5LCAvKiAweDIwLTB4MjMgKi8KKwkweEYyLCAweDZBLCAweEYyLCAweDZCLCAweEYyLCAweDZDLCAweEYyLCAweDZELCAvKiAweDI0LTB4MjcgKi8KKwkweEYyLCAweDZFLCAweEYyLCAweDZGLCAweEYyLCAweDcwLCAweEYyLCAweDcxLCAvKiAweDI4LTB4MkIgKi8KKwkweEYyLCAweDcyLCAweEYyLCAweDczLCAweEYyLCAweDc0LCAweEYyLCAweDc1LCAvKiAweDJDLTB4MkYgKi8KKwkweEYyLCAweDc2LCAweEYyLCAweDc3LCAweEYyLCAweDc4LCAweEYyLCAweDc5LCAvKiAweDMwLTB4MzMgKi8KKwkweEYyLCAweDdBLCAweEYyLCAweDdCLCAweEYyLCAweDdDLCAweEYyLCAweDdELCAvKiAweDM0LTB4MzcgKi8KKwkweEYyLCAweDdFLCAweEYyLCAweDgwLCAweEYyLCAweDgxLCAweEYyLCAweDgyLCAvKiAweDM4LTB4M0IgKi8KKwkweEYyLCAweDgzLCAweEYyLCAweDg0LCAweEYyLCAweDg1LCAweEYyLCAweDg2LCAvKiAweDNDLTB4M0YgKi8KKwkweEYyLCAweDg3LCAweEYyLCAweDg4LCAweEYyLCAweDg5LCAweEYyLCAweDhBLCAvKiAweDQwLTB4NDMgKi8KKwkweEYyLCAweDhCLCAweEYyLCAweDhDLCAweEYyLCAweDhELCAweEYyLCAweDhFLCAvKiAweDQ0LTB4NDcgKi8KKwkweEYyLCAweDhGLCAweEYyLCAweDkwLCAweEYyLCAweDkxLCAweEYyLCAweDkyLCAvKiAweDQ4LTB4NEIgKi8KKwkweEYyLCAweDkzLCAweEYyLCAweDk0LCAweEYyLCAweDk1LCAweEYyLCAweDk2LCAvKiAweDRDLTB4NEYgKi8KKwkweEYyLCAweDk3LCAweEYyLCAweDk4LCAweEYyLCAweDk5LCAweEYyLCAweDlBLCAvKiAweDUwLTB4NTMgKi8KKwkweEYyLCAweDlCLCAweEYyLCAweDlDLCAweEYyLCAweDlELCAweEYyLCAweDlFLCAvKiAweDU0LTB4NTcgKi8KKwkweEYyLCAweDlGLCAweEYyLCAweEEwLCAweEYzLCAweDQwLCAweEYzLCAweDQxLCAvKiAweDU4LTB4NUIgKi8KKwkweEYzLCAweDQyLCAweEYzLCAweDQzLCAweEYzLCAweDQ0LCAweEYzLCAweDQ1LCAvKiAweDVDLTB4NUYgKi8KKwkweEYzLCAweDQ2LCAweEYzLCAweDQ3LCAweEYzLCAweDQ4LCAweEYzLCAweDQ5LCAvKiAweDYwLTB4NjMgKi8KKwkweEYzLCAweDRBLCAweEYzLCAweDRCLCAweEYzLCAweDRDLCAweEYzLCAweDRELCAvKiAweDY0LTB4NjcgKi8KKwkweEYzLCAweDRFLCAweEYzLCAweDRGLCAweEYzLCAweDUwLCAweEYzLCAweDUxLCAvKiAweDY4LTB4NkIgKi8KKwkweEMyLCAweEVELCAweEQ0LCAweEE2LCAweENELCAweEQ0LCAweEQxLCAweEIxLCAvKiAweDZDLTB4NkYgKi8KKwkweEIzLCAweERCLCAweEM3LCAweEZELCAweEYzLCAweDUyLCAweEIyLCAweEI1LCAvKiAweDcwLTB4NzMgKi8KKwkweEMyLCAweEJGLCAweEU2LCAweEUwLCAweENBLCAweEJCLCAweEU2LCAweEUxLCAvKiAweDc0LTB4NzcgKi8KKwkweEU2LCAweEUyLCAweEJFLCAweEQ0LCAweEU2LCAweEUzLCAweEQ3LCAweEE0LCAvKiAweDc4LTB4N0IgKi8KKwkweENELCAweEQ1LCAweEU2LCAweEU1LCAweEJDLCAweERELCAweEU2LCAweEU0LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEU2LCAweEU2LCAweEU2LCAweEU3LCAweEMyLCAweEVFLCAweEYzLCAweDUzLCAvKiAweDgwLTB4ODMgKi8KKwkweEJELCAweEJFLCAweEU2LCAweEU4LCAweEMyLCAweEU2LCAweEJBLCAweEE3LCAvKiAweDg0LTB4ODcgKi8KKwkweEU2LCAweEU5LCAweEYzLCAweDU0LCAweEU2LCAweEVBLCAweEIzLCAweEQyLCAvKiAweDg4LTB4OEIgKi8KKwkweEQxLCAweEU5LCAweEYzLCAweDU1LCAweEYzLCAweDU2LCAweEJGLCAweEE1LCAvKiAweDhDLTB4OEYgKi8KKwkweEU2LCAweEVCLCAweEM2LCAweEVGLCAweEU2LCAweEVDLCAweEU2LCAweEVELCAvKiAweDkwLTB4OTMgKi8KKwkweEYzLCAweDU3LCAweEYzLCAweDU4LCAweEU2LCAweEVFLCAweEM2LCAweEFELCAvKiAweDk0LTB4OTcgKi8KKwkweEU2LCAweEVGLCAweEYzLCAweDU5LCAweEM5LCAweEE3LCAweEU2LCAweEYwLCAvKiAweDk4LTB4OUIgKi8KKwkweEU2LCAweEYxLCAweEU2LCAweEYyLCAweEU1LCAweEI5LCAweEU2LCAweEYzLCAvKiAweDlDLTB4OUYgKi8KKwkweEU2LCAweEY0LCAweEMyLCAweEUyLCAweEU2LCAweEY1LCAweEU2LCAweEY2LCAvKiAweEEwLTB4QTMgKi8KKwkweEQ2LCAweEU4LCAweEU2LCAweEY3LCAweEYzLCAweDVBLCAweEU2LCAweEY4LCAvKiAweEE0LTB4QTcgKi8KKwkweEI5LCAweEM3LCAweEYzLCAweDVCLCAweEYzLCAweDVDLCAweEYzLCAweDVELCAvKiAweEE4LTB4QUIgKi8KKwkweEYzLCAweDVFLCAweEYzLCAweDVGLCAweEYzLCAweDYwLCAweEYzLCAweDYxLCAvKiAweEFDLTB4QUYgKi8KKwkweEY3LCAweEJCLCAweEY3LCAweEJBLCAweEYzLCAweDYyLCAweEYzLCAweDYzLCAvKiAweEIwLTB4QjMgKi8KKwkweEYzLCAweDY0LCAweEYzLCAweDY1LCAweEY3LCAweEJFLCAweEY3LCAweEJDLCAvKiAweEI0LTB4QjcgKi8KKwkweEJBLCAweEExLCAweEYzLCAweDY2LCAweEY3LCAweEJGLCAweEYzLCAweDY3LCAvKiAweEI4LTB4QkIgKi8KKwkweEY3LCAweEMwLCAweEYzLCAweDY4LCAweEYzLCAweDY5LCAweEYzLCAweDZBLCAvKiAweEJDLTB4QkYgKi8KKwkweEY3LCAweEMyLCAweEY3LCAweEMxLCAweEY3LCAweEM0LCAweEYzLCAweDZCLCAvKiAweEMwLTB4QzMgKi8KKwkweEYzLCAweDZDLCAweEY3LCAweEMzLCAweEYzLCAweDZELCAweEYzLCAweDZFLCAvKiAweEM0LTB4QzcgKi8KKwkweEYzLCAweDZGLCAweEYzLCAweDcwLCAweEYzLCAweDcxLCAweEY3LCAweEM1LCAvKiAweEM4LTB4Q0IgKi8KKwkweEY3LCAweEM2LCAweEYzLCAweDcyLCAweEYzLCAweDczLCAweEYzLCAweDc0LCAvKiAweENDLTB4Q0YgKi8KKwkweEYzLCAweDc1LCAweEY3LCAweEM3LCAweEYzLCAweDc2LCAweENCLCAweEU4LCAvKiAweEQwLTB4RDMgKi8KKwkweEYzLCAweDc3LCAweEYzLCAweDc4LCAweEYzLCAweDc5LCAweEYzLCAweDdBLCAvKiAweEQ0LTB4RDcgKi8KKwkweEI4LCAweERGLCAweEYzLCAweDdCLCAweEYzLCAweDdDLCAweEYzLCAweDdELCAvKiAweEQ4LTB4REIgKi8KKwkweEYzLCAweDdFLCAweEYzLCAweDgwLCAweEYzLCAweDgxLCAweEY3LCAweEQ0LCAvKiAweERDLTB4REYgKi8KKwkweEYzLCAweDgyLCAweEY3LCAweEQ1LCAweEYzLCAweDgzLCAweEYzLCAweDg0LCAvKiAweEUwLTB4RTMgKi8KKwkweEYzLCAweDg1LCAweEYzLCAweDg2LCAweEY3LCAweEQ2LCAweEYzLCAweDg3LCAvKiAweEU0LTB4RTcgKi8KKwkweEYzLCAweDg4LCAweEYzLCAweDg5LCAweEYzLCAweDhBLCAweEY3LCAweEQ4LCAvKiAweEU4LTB4RUIgKi8KKwkweEYzLCAweDhCLCAweEY3LCAweERBLCAweEYzLCAweDhDLCAweEY3LCAweEQ3LCAvKiAweEVDLTB4RUYgKi8KKwkweEYzLCAweDhELCAweEYzLCAweDhFLCAweEYzLCAweDhGLCAweEYzLCAweDkwLCAvKiAweEYwLTB4RjMgKi8KKwkweEYzLCAweDkxLCAweEYzLCAweDkyLCAweEYzLCAweDkzLCAweEYzLCAweDk0LCAvKiAweEY0LTB4RjcgKi8KKwkweEYzLCAweDk1LCAweEY3LCAweERCLCAweEYzLCAweDk2LCAweEY3LCAweEQ5LCAvKiAweEY4LTB4RkIgKi8KKwkweEYzLCAweDk3LCAweEYzLCAweDk4LCAweEYzLCAweDk5LCAweEYzLCAweDlBLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185Qls1MTJdID0geworCTB4RjMsIDB4OUIsIDB4RjMsIDB4OUMsIDB4RjMsIDB4OUQsIDB4RDcsIDB4RDcsIC8qIDB4MDAtMHgwMyAqLworCTB4RjMsIDB4OUUsIDB4RjMsIDB4OUYsIDB4RjMsIDB4QTAsIDB4RjQsIDB4NDAsIC8qIDB4MDQtMHgwNyAqLworCTB4RjcsIDB4REMsIDB4RjQsIDB4NDEsIDB4RjQsIDB4NDIsIDB4RjQsIDB4NDMsIC8qIDB4MDgtMHgwQiAqLworCTB4RjQsIDB4NDQsIDB4RjQsIDB4NDUsIDB4RjQsIDB4NDYsIDB4RjcsIDB4REQsIC8qIDB4MEMtMHgwRiAqLworCTB4RjQsIDB4NDcsIDB4RjQsIDB4NDgsIDB4RjQsIDB4NDksIDB4RjcsIDB4REUsIC8qIDB4MTAtMHgxMyAqLworCTB4RjQsIDB4NEEsIDB4RjQsIDB4NEIsIDB4RjQsIDB4NEMsIDB4RjQsIDB4NEQsIC8qIDB4MTQtMHgxNyAqLworCTB4RjQsIDB4NEUsIDB4RjQsIDB4NEYsIDB4RjQsIDB4NTAsIDB4RjQsIDB4NTEsIC8qIDB4MTgtMHgxQiAqLworCTB4RjQsIDB4NTIsIDB4RjQsIDB4NTMsIDB4RjQsIDB4NTQsIDB4RjcsIDB4REYsIC8qIDB4MUMtMHgxRiAqLworCTB4RjQsIDB4NTUsIDB4RjQsIDB4NTYsIDB4RjQsIDB4NTcsIDB4RjcsIDB4RTAsIC8qIDB4MjAtMHgyMyAqLworCTB4RjQsIDB4NTgsIDB4RjQsIDB4NTksIDB4RjQsIDB4NUEsIDB4RjQsIDB4NUIsIC8qIDB4MjQtMHgyNyAqLworCTB4RjQsIDB4NUMsIDB4RjQsIDB4NUQsIDB4RjQsIDB4NUUsIDB4RjQsIDB4NUYsIC8qIDB4MjgtMHgyQiAqLworCTB4RjQsIDB4NjAsIDB4RjQsIDB4NjEsIDB4RjQsIDB4NjIsIDB4REIsIDB4Q0IsIC8qIDB4MkMtMHgyRiAqLworCTB4RjQsIDB4NjMsIDB4RjQsIDB4NjQsIDB4RDgsIDB4QUEsIDB4RjQsIDB4NjUsIC8qIDB4MzAtMHgzMyAqLworCTB4RjQsIDB4NjYsIDB4RjQsIDB4NjcsIDB4RjQsIDB4NjgsIDB4RjQsIDB4NjksIC8qIDB4MzQtMHgzNyAqLworCTB4RjQsIDB4NkEsIDB4RjQsIDB4NkIsIDB4RjQsIDB4NkMsIDB4RTUsIDB4RjcsIC8qIDB4MzgtMHgzQiAqLworCTB4QjksIDB4RUQsIDB4RjQsIDB4NkQsIDB4RjQsIDB4NkUsIDB4RjQsIDB4NkYsIC8qIDB4M0MtMHgzRiAqLworCTB4RjQsIDB4NzAsIDB4QkYsIDB4RkQsIDB4QkIsIDB4RUEsIDB4RjcsIDB4QzksIC8qIDB4NDAtMHg0MyAqLworCTB4QzYsIDB4QzcsIDB4RjcsIDB4QzgsIDB4RjQsIDB4NzEsIDB4RjcsIDB4Q0EsIC8qIDB4NDQtMHg0NyAqLworCTB4RjcsIDB4Q0MsIDB4RjcsIDB4Q0IsIDB4RjQsIDB4NzIsIDB4RjQsIDB4NzMsIC8qIDB4NDgtMHg0QiAqLworCTB4RjQsIDB4NzQsIDB4RjcsIDB4Q0QsIDB4RjQsIDB4NzUsIDB4Q0UsIDB4QkEsIC8qIDB4NEMtMHg0RiAqLworCTB4RjQsIDB4NzYsIDB4RjcsIDB4Q0UsIDB4RjQsIDB4NzcsIDB4RjQsIDB4NzgsIC8qIDB4NTAtMHg1MyAqLworCTB4QzQsIDB4QTcsIDB4RjQsIDB4NzksIDB4RjQsIDB4N0EsIDB4RjQsIDB4N0IsIC8qIDB4NTQtMHg1NyAqLworCTB4RjQsIDB4N0MsIDB4RjQsIDB4N0QsIDB4RjQsIDB4N0UsIDB4RjQsIDB4ODAsIC8qIDB4NTgtMHg1QiAqLworCTB4RjQsIDB4ODEsIDB4RjQsIDB4ODIsIDB4RjQsIDB4ODMsIDB4RjQsIDB4ODQsIC8qIDB4NUMtMHg1RiAqLworCTB4RjQsIDB4ODUsIDB4RjQsIDB4ODYsIDB4RjQsIDB4ODcsIDB4RjQsIDB4ODgsIC8qIDB4NjAtMHg2MyAqLworCTB4RjQsIDB4ODksIDB4RjQsIDB4OEEsIDB4RjQsIDB4OEIsIDB4RjQsIDB4OEMsIC8qIDB4NjQtMHg2NyAqLworCTB4RjQsIDB4OEQsIDB4RjQsIDB4OEUsIDB4RjQsIDB4OEYsIDB4RjQsIDB4OTAsIC8qIDB4NjgtMHg2QiAqLworCTB4RjQsIDB4OTEsIDB4RjQsIDB4OTIsIDB4RjQsIDB4OTMsIDB4RjQsIDB4OTQsIC8qIDB4NkMtMHg2RiAqLworCTB4RjQsIDB4OTUsIDB4RjQsIDB4OTYsIDB4RjQsIDB4OTcsIDB4RjQsIDB4OTgsIC8qIDB4NzAtMHg3MyAqLworCTB4RjQsIDB4OTksIDB4RjQsIDB4OUEsIDB4RjQsIDB4OUIsIDB4RjQsIDB4OUMsIC8qIDB4NzQtMHg3NyAqLworCTB4RjQsIDB4OUQsIDB4RjQsIDB4OUUsIDB4RjQsIDB4OUYsIDB4RjQsIDB4QTAsIC8qIDB4NzgtMHg3QiAqLworCTB4RjUsIDB4NDAsIDB4RjUsIDB4NDEsIDB4RjUsIDB4NDIsIDB4RjUsIDB4NDMsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RjUsIDB4NDQsIDB4RjUsIDB4NDUsIDB4RjUsIDB4NDYsIDB4RjUsIDB4NDcsIC8qIDB4ODAtMHg4MyAqLworCTB4RjUsIDB4NDgsIDB4RjUsIDB4NDksIDB4RjUsIDB4NEEsIDB4RjUsIDB4NEIsIC8qIDB4ODQtMHg4NyAqLworCTB4RjUsIDB4NEMsIDB4RjUsIDB4NEQsIDB4RjUsIDB4NEUsIDB4RjUsIDB4NEYsIC8qIDB4ODgtMHg4QiAqLworCTB4RjUsIDB4NTAsIDB4RjUsIDB4NTEsIDB4RjUsIDB4NTIsIDB4RjUsIDB4NTMsIC8qIDB4OEMtMHg4RiAqLworCTB4RjUsIDB4NTQsIDB4RjUsIDB4NTUsIDB4RjUsIDB4NTYsIDB4RjUsIDB4NTcsIC8qIDB4OTAtMHg5MyAqLworCTB4RjUsIDB4NTgsIDB4RjUsIDB4NTksIDB4RjUsIDB4NUEsIDB4RjUsIDB4NUIsIC8qIDB4OTQtMHg5NyAqLworCTB4RjUsIDB4NUMsIDB4RjUsIDB4NUQsIDB4RjUsIDB4NUUsIDB4RjUsIDB4NUYsIC8qIDB4OTgtMHg5QiAqLworCTB4RjUsIDB4NjAsIDB4RjUsIDB4NjEsIDB4RjUsIDB4NjIsIDB4RjUsIDB4NjMsIC8qIDB4OUMtMHg5RiAqLworCTB4RjUsIDB4NjQsIDB4RjUsIDB4NjUsIDB4RjUsIDB4NjYsIDB4RjUsIDB4NjcsIC8qIDB4QTAtMHhBMyAqLworCTB4RjUsIDB4NjgsIDB4RjUsIDB4NjksIDB4RjUsIDB4NkEsIDB4RjUsIDB4NkIsIC8qIDB4QTQtMHhBNyAqLworCTB4RjUsIDB4NkMsIDB4RjUsIDB4NkQsIDB4RjUsIDB4NkUsIDB4RjUsIDB4NkYsIC8qIDB4QTgtMHhBQiAqLworCTB4RjUsIDB4NzAsIDB4RjUsIDB4NzEsIDB4RjUsIDB4NzIsIDB4RjUsIDB4NzMsIC8qIDB4QUMtMHhBRiAqLworCTB4RjUsIDB4NzQsIDB4RjUsIDB4NzUsIDB4RjUsIDB4NzYsIDB4RjUsIDB4NzcsIC8qIDB4QjAtMHhCMyAqLworCTB4RjUsIDB4NzgsIDB4RjUsIDB4NzksIDB4RjUsIDB4N0EsIDB4RjUsIDB4N0IsIC8qIDB4QjQtMHhCNyAqLworCTB4RjUsIDB4N0MsIDB4RjUsIDB4N0QsIDB4RjUsIDB4N0UsIDB4RjUsIDB4ODAsIC8qIDB4QjgtMHhCQiAqLworCTB4RjUsIDB4ODEsIDB4RjUsIDB4ODIsIDB4RjUsIDB4ODMsIDB4RjUsIDB4ODQsIC8qIDB4QkMtMHhCRiAqLworCTB4RjUsIDB4ODUsIDB4RjUsIDB4ODYsIDB4RjUsIDB4ODcsIDB4RjUsIDB4ODgsIC8qIDB4QzAtMHhDMyAqLworCTB4RjUsIDB4ODksIDB4RjUsIDB4OEEsIDB4RjUsIDB4OEIsIDB4RjUsIDB4OEMsIC8qIDB4QzQtMHhDNyAqLworCTB4RjUsIDB4OEQsIDB4RjUsIDB4OEUsIDB4RjUsIDB4OEYsIDB4RjUsIDB4OTAsIC8qIDB4QzgtMHhDQiAqLworCTB4RjUsIDB4OTEsIDB4RjUsIDB4OTIsIDB4RjUsIDB4OTMsIDB4RjUsIDB4OTQsIC8qIDB4Q0MtMHhDRiAqLworCTB4RjUsIDB4OTUsIDB4RjUsIDB4OTYsIDB4RjUsIDB4OTcsIDB4RjUsIDB4OTgsIC8qIDB4RDAtMHhEMyAqLworCTB4RjUsIDB4OTksIDB4RjUsIDB4OUEsIDB4RjUsIDB4OUIsIDB4RjUsIDB4OUMsIC8qIDB4RDQtMHhENyAqLworCTB4RjUsIDB4OUQsIDB4RjUsIDB4OUUsIDB4RjUsIDB4OUYsIDB4RjUsIDB4QTAsIC8qIDB4RDgtMHhEQiAqLworCTB4RjYsIDB4NDAsIDB4RjYsIDB4NDEsIDB4RjYsIDB4NDIsIDB4RjYsIDB4NDMsIC8qIDB4REMtMHhERiAqLworCTB4RjYsIDB4NDQsIDB4RjYsIDB4NDUsIDB4RjYsIDB4NDYsIDB4RjYsIDB4NDcsIC8qIDB4RTAtMHhFMyAqLworCTB4RjYsIDB4NDgsIDB4RjYsIDB4NDksIDB4RjYsIDB4NEEsIDB4RjYsIDB4NEIsIC8qIDB4RTQtMHhFNyAqLworCTB4RjYsIDB4NEMsIDB4RjYsIDB4NEQsIDB4RjYsIDB4NEUsIDB4RjYsIDB4NEYsIC8qIDB4RTgtMHhFQiAqLworCTB4RjYsIDB4NTAsIDB4RjYsIDB4NTEsIDB4RjYsIDB4NTIsIDB4RjYsIDB4NTMsIC8qIDB4RUMtMHhFRiAqLworCTB4RjYsIDB4NTQsIDB4RjYsIDB4NTUsIDB4RjYsIDB4NTYsIDB4RjYsIDB4NTcsIC8qIDB4RjAtMHhGMyAqLworCTB4RjYsIDB4NTgsIDB4RjYsIDB4NTksIDB4RjYsIDB4NUEsIDB4RjYsIDB4NUIsIC8qIDB4RjQtMHhGNyAqLworCTB4RjYsIDB4NUMsIDB4RjYsIDB4NUQsIDB4RjYsIDB4NUUsIDB4RjYsIDB4NUYsIC8qIDB4RjgtMHhGQiAqLworCTB4RjYsIDB4NjAsIDB4RjYsIDB4NjEsIDB4RjYsIDB4NjIsIDB4RjYsIDB4NjMsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzlDWzUxMl0gPSB7CisJMHhGNiwgMHg2NCwgMHhGNiwgMHg2NSwgMHhGNiwgMHg2NiwgMHhGNiwgMHg2NywgLyogMHgwMC0weDAzICovCisJMHhGNiwgMHg2OCwgMHhGNiwgMHg2OSwgMHhGNiwgMHg2QSwgMHhGNiwgMHg2QiwgLyogMHgwNC0weDA3ICovCisJMHhGNiwgMHg2QywgMHhGNiwgMHg2RCwgMHhGNiwgMHg2RSwgMHhGNiwgMHg2RiwgLyogMHgwOC0weDBCICovCisJMHhGNiwgMHg3MCwgMHhGNiwgMHg3MSwgMHhGNiwgMHg3MiwgMHhGNiwgMHg3MywgLyogMHgwQy0weDBGICovCisJMHhGNiwgMHg3NCwgMHhGNiwgMHg3NSwgMHhGNiwgMHg3NiwgMHhGNiwgMHg3NywgLyogMHgxMC0weDEzICovCisJMHhGNiwgMHg3OCwgMHhGNiwgMHg3OSwgMHhGNiwgMHg3QSwgMHhGNiwgMHg3QiwgLyogMHgxNC0weDE3ICovCisJMHhGNiwgMHg3QywgMHhGNiwgMHg3RCwgMHhGNiwgMHg3RSwgMHhGNiwgMHg4MCwgLyogMHgxOC0weDFCICovCisJMHhGNiwgMHg4MSwgMHhGNiwgMHg4MiwgMHhGNiwgMHg4MywgMHhGNiwgMHg4NCwgLyogMHgxQy0weDFGICovCisJMHhGNiwgMHg4NSwgMHhGNiwgMHg4NiwgMHhGNiwgMHg4NywgMHhGNiwgMHg4OCwgLyogMHgyMC0weDIzICovCisJMHhGNiwgMHg4OSwgMHhGNiwgMHg4QSwgMHhGNiwgMHg4QiwgMHhGNiwgMHg4QywgLyogMHgyNC0weDI3ICovCisJMHhGNiwgMHg4RCwgMHhGNiwgMHg4RSwgMHhGNiwgMHg4RiwgMHhGNiwgMHg5MCwgLyogMHgyOC0weDJCICovCisJMHhGNiwgMHg5MSwgMHhGNiwgMHg5MiwgMHhGNiwgMHg5MywgMHhGNiwgMHg5NCwgLyogMHgyQy0weDJGICovCisJMHhGNiwgMHg5NSwgMHhGNiwgMHg5NiwgMHhGNiwgMHg5NywgMHhGNiwgMHg5OCwgLyogMHgzMC0weDMzICovCisJMHhGNiwgMHg5OSwgMHhGNiwgMHg5QSwgMHhGNiwgMHg5QiwgMHhGNiwgMHg5QywgLyogMHgzNC0weDM3ICovCisJMHhGNiwgMHg5RCwgMHhGNiwgMHg5RSwgMHhGNiwgMHg5RiwgMHhGNiwgMHhBMCwgLyogMHgzOC0weDNCICovCisJMHhGNywgMHg0MCwgMHhGNywgMHg0MSwgMHhGNywgMHg0MiwgMHhGNywgMHg0MywgLyogMHgzQy0weDNGICovCisJMHhGNywgMHg0NCwgMHhGNywgMHg0NSwgMHhGNywgMHg0NiwgMHhGNywgMHg0NywgLyogMHg0MC0weDQzICovCisJMHhGNywgMHg0OCwgMHhGNywgMHg0OSwgMHhGNywgMHg0QSwgMHhGNywgMHg0QiwgLyogMHg0NC0weDQ3ICovCisJMHhGNywgMHg0QywgMHhGNywgMHg0RCwgMHhGNywgMHg0RSwgMHhGNywgMHg0RiwgLyogMHg0OC0weDRCICovCisJMHhGNywgMHg1MCwgMHhGNywgMHg1MSwgMHhGNywgMHg1MiwgMHhGNywgMHg1MywgLyogMHg0Qy0weDRGICovCisJMHhGNywgMHg1NCwgMHhGNywgMHg1NSwgMHhGNywgMHg1NiwgMHhGNywgMHg1NywgLyogMHg1MC0weDUzICovCisJMHhGNywgMHg1OCwgMHhGNywgMHg1OSwgMHhGNywgMHg1QSwgMHhGNywgMHg1QiwgLyogMHg1NC0weDU3ICovCisJMHhGNywgMHg1QywgMHhGNywgMHg1RCwgMHhGNywgMHg1RSwgMHhGNywgMHg1RiwgLyogMHg1OC0weDVCICovCisJMHhGNywgMHg2MCwgMHhGNywgMHg2MSwgMHhGNywgMHg2MiwgMHhGNywgMHg2MywgLyogMHg1Qy0weDVGICovCisJMHhGNywgMHg2NCwgMHhGNywgMHg2NSwgMHhGNywgMHg2NiwgMHhGNywgMHg2NywgLyogMHg2MC0weDYzICovCisJMHhGNywgMHg2OCwgMHhGNywgMHg2OSwgMHhGNywgMHg2QSwgMHhGNywgMHg2QiwgLyogMHg2NC0weDY3ICovCisJMHhGNywgMHg2QywgMHhGNywgMHg2RCwgMHhGNywgMHg2RSwgMHhGNywgMHg2RiwgLyogMHg2OC0weDZCICovCisJMHhGNywgMHg3MCwgMHhGNywgMHg3MSwgMHhGNywgMHg3MiwgMHhGNywgMHg3MywgLyogMHg2Qy0weDZGICovCisJMHhGNywgMHg3NCwgMHhGNywgMHg3NSwgMHhGNywgMHg3NiwgMHhGNywgMHg3NywgLyogMHg3MC0weDczICovCisJMHhGNywgMHg3OCwgMHhGNywgMHg3OSwgMHhGNywgMHg3QSwgMHhGNywgMHg3QiwgLyogMHg3NC0weDc3ICovCisJMHhGNywgMHg3QywgMHhGNywgMHg3RCwgMHhGNywgMHg3RSwgMHhGNywgMHg4MCwgLyogMHg3OC0weDdCICovCisJMHhEMywgMHhFMywgMHhGNywgMHg4MSwgMHhGNywgMHg4MiwgMHhGNiwgMHhDRiwgLyogMHg3Qy0weDdGICovCisJCisJMHhGNywgMHg4MywgMHhDMiwgMHhCMywgMHhGNiwgMHhEMCwgMHhGNywgMHg4NCwgLyogMHg4MC0weDgzICovCisJMHhGNywgMHg4NSwgMHhGNiwgMHhEMSwgMHhGNiwgMHhEMiwgMHhGNiwgMHhEMywgLyogMHg4NC0weDg3ICovCisJMHhGNiwgMHhENCwgMHhGNywgMHg4NiwgMHhGNywgMHg4NywgMHhGNiwgMHhENiwgLyogMHg4OC0weDhCICovCisJMHhGNywgMHg4OCwgMHhCMSwgMHhBQiwgMHhGNiwgMHhENywgMHhGNywgMHg4OSwgLyogMHg4Qy0weDhGICovCisJMHhGNiwgMHhEOCwgMHhGNiwgMHhEOSwgMHhGNiwgMHhEQSwgMHhGNywgMHg4QSwgLyogMHg5MC0weDkzICovCisJMHhGNiwgMHhEQiwgMHhGNiwgMHhEQywgMHhGNywgMHg4QiwgMHhGNywgMHg4QywgLyogMHg5NC0weDk3ICovCisJMHhGNywgMHg4RCwgMHhGNywgMHg4RSwgMHhGNiwgMHhERCwgMHhGNiwgMHhERSwgLyogMHg5OC0weDlCICovCisJMHhDRiwgMHhDQSwgMHhGNywgMHg4RiwgMHhGNiwgMHhERiwgMHhGNiwgMHhFMCwgLyogMHg5Qy0weDlGICovCisJMHhGNiwgMHhFMSwgMHhGNiwgMHhFMiwgMHhGNiwgMHhFMywgMHhGNiwgMHhFNCwgLyogMHhBMC0weEEzICovCisJMHhDMCwgMHhGMCwgMHhGNiwgMHhFNSwgMHhGNiwgMHhFNiwgMHhGNiwgMHhFNywgLyogMHhBNC0weEE3ICovCisJMHhGNiwgMHhFOCwgMHhGNiwgMHhFOSwgMHhGNywgMHg5MCwgMHhGNiwgMHhFQSwgLyogMHhBOC0weEFCICovCisJMHhGNywgMHg5MSwgMHhGNiwgMHhFQiwgMHhGNiwgMHhFQywgMHhGNywgMHg5MiwgLyogMHhBQy0weEFGICovCisJMHhGNiwgMHhFRCwgMHhGNiwgMHhFRSwgMHhGNiwgMHhFRiwgMHhGNiwgMHhGMCwgLyogMHhCMC0weEIzICovCisJMHhGNiwgMHhGMSwgMHhGNiwgMHhGMiwgMHhGNiwgMHhGMywgMHhGNiwgMHhGNCwgLyogMHhCNC0weEI3ICovCisJMHhCRSwgMHhBOCwgMHhGNywgMHg5MywgMHhGNiwgMHhGNSwgMHhGNiwgMHhGNiwgLyogMHhCOC0weEJCICovCisJMHhGNiwgMHhGNywgMHhGNiwgMHhGOCwgMHhGNywgMHg5NCwgMHhGNywgMHg5NSwgLyogMHhCQy0weEJGICovCisJMHhGNywgMHg5NiwgMHhGNywgMHg5NywgMHhGNywgMHg5OCwgMHhDOCwgMHhGQSwgLyogMHhDMC0weEMzICovCisJMHhGNiwgMHhGOSwgMHhGNiwgMHhGQSwgMHhGNiwgMHhGQiwgMHhGNiwgMHhGQywgLyogMHhDNC0weEM3ICovCisJMHhGNywgMHg5OSwgMHhGNywgMHg5QSwgMHhGNiwgMHhGRCwgMHhGNiwgMHhGRSwgLyogMHhDOC0weENCICovCisJMHhGNywgMHhBMSwgMHhGNywgMHhBMiwgMHhGNywgMHhBMywgMHhGNywgMHhBNCwgLyogMHhDQy0weENGICovCisJMHhGNywgMHhBNSwgMHhGNywgMHg5QiwgMHhGNywgMHg5QywgMHhGNywgMHhBNiwgLyogMHhEMC0weEQzICovCisJMHhGNywgMHhBNywgMHhGNywgMHhBOCwgMHhCMSwgMHhFRSwgMHhGNywgMHhBOSwgLyogMHhENC0weEQ3ICovCisJMHhGNywgMHhBQSwgMHhGNywgMHhBQiwgMHhGNywgMHg5RCwgMHhGNywgMHg5RSwgLyogMHhEOC0weERCICovCisJMHhGNywgMHhBQywgMHhGNywgMHhBRCwgMHhDMSwgMHhEQiwgMHhGNywgMHhBRSwgLyogMHhEQy0weERGICovCisJMHhGNywgMHg5RiwgMHhGNywgMHhBMCwgMHhGNywgMHhBRiwgMHhGOCwgMHg0MCwgLyogMHhFMC0weEUzICovCisJMHhGOCwgMHg0MSwgMHhGOCwgMHg0MiwgMHhGOCwgMHg0MywgMHhGOCwgMHg0NCwgLyogMHhFNC0weEU3ICovCisJMHhGOCwgMHg0NSwgMHhGOCwgMHg0NiwgMHhGOCwgMHg0NywgMHhGOCwgMHg0OCwgLyogMHhFOC0weEVCICovCisJMHhGOCwgMHg0OSwgMHhGOCwgMHg0QSwgMHhGOCwgMHg0QiwgMHhGOCwgMHg0QywgLyogMHhFQy0weEVGICovCisJMHhGOCwgMHg0RCwgMHhGOCwgMHg0RSwgMHhGOCwgMHg0RiwgMHhGOCwgMHg1MCwgLyogMHhGMC0weEYzICovCisJMHhGOCwgMHg1MSwgMHhGOCwgMHg1MiwgMHhGOCwgMHg1MywgMHhGOCwgMHg1NCwgLyogMHhGNC0weEY3ICovCisJMHhGOCwgMHg1NSwgMHhGOCwgMHg1NiwgMHhGOCwgMHg1NywgMHhGOCwgMHg1OCwgLyogMHhGOC0weEZCICovCisJMHhGOCwgMHg1OSwgMHhGOCwgMHg1QSwgMHhGOCwgMHg1QiwgMHhGOCwgMHg1QywgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOURbNTEyXSA9IHsKKwkweEY4LCAweDVELCAweEY4LCAweDVFLCAweEY4LCAweDVGLCAweEY4LCAweDYwLCAvKiAweDAwLTB4MDMgKi8KKwkweEY4LCAweDYxLCAweEY4LCAweDYyLCAweEY4LCAweDYzLCAweEY4LCAweDY0LCAvKiAweDA0LTB4MDcgKi8KKwkweEY4LCAweDY1LCAweEY4LCAweDY2LCAweEY4LCAweDY3LCAweEY4LCAweDY4LCAvKiAweDA4LTB4MEIgKi8KKwkweEY4LCAweDY5LCAweEY4LCAweDZBLCAweEY4LCAweDZCLCAweEY4LCAweDZDLCAvKiAweDBDLTB4MEYgKi8KKwkweEY4LCAweDZELCAweEY4LCAweDZFLCAweEY4LCAweDZGLCAweEY4LCAweDcwLCAvKiAweDEwLTB4MTMgKi8KKwkweEY4LCAweDcxLCAweEY4LCAweDcyLCAweEY4LCAweDczLCAweEY4LCAweDc0LCAvKiAweDE0LTB4MTcgKi8KKwkweEY4LCAweDc1LCAweEY4LCAweDc2LCAweEY4LCAweDc3LCAweEY4LCAweDc4LCAvKiAweDE4LTB4MUIgKi8KKwkweEY4LCAweDc5LCAweEY4LCAweDdBLCAweEY4LCAweDdCLCAweEY4LCAweDdDLCAvKiAweDFDLTB4MUYgKi8KKwkweEY4LCAweDdELCAweEY4LCAweDdFLCAweEY4LCAweDgwLCAweEY4LCAweDgxLCAvKiAweDIwLTB4MjMgKi8KKwkweEY4LCAweDgyLCAweEY4LCAweDgzLCAweEY4LCAweDg0LCAweEY4LCAweDg1LCAvKiAweDI0LTB4MjcgKi8KKwkweEY4LCAweDg2LCAweEY4LCAweDg3LCAweEY4LCAweDg4LCAweEY4LCAweDg5LCAvKiAweDI4LTB4MkIgKi8KKwkweEY4LCAweDhBLCAweEY4LCAweDhCLCAweEY4LCAweDhDLCAweEY4LCAweDhELCAvKiAweDJDLTB4MkYgKi8KKwkweEY4LCAweDhFLCAweEY4LCAweDhGLCAweEY4LCAweDkwLCAweEY4LCAweDkxLCAvKiAweDMwLTB4MzMgKi8KKwkweEY4LCAweDkyLCAweEY4LCAweDkzLCAweEY4LCAweDk0LCAweEY4LCAweDk1LCAvKiAweDM0LTB4MzcgKi8KKwkweEY4LCAweDk2LCAweEY4LCAweDk3LCAweEY4LCAweDk4LCAweEY4LCAweDk5LCAvKiAweDM4LTB4M0IgKi8KKwkweEY4LCAweDlBLCAweEY4LCAweDlCLCAweEY4LCAweDlDLCAweEY4LCAweDlELCAvKiAweDNDLTB4M0YgKi8KKwkweEY4LCAweDlFLCAweEY4LCAweDlGLCAweEY4LCAweEEwLCAweEY5LCAweDQwLCAvKiAweDQwLTB4NDMgKi8KKwkweEY5LCAweDQxLCAweEY5LCAweDQyLCAweEY5LCAweDQzLCAweEY5LCAweDQ0LCAvKiAweDQ0LTB4NDcgKi8KKwkweEY5LCAweDQ1LCAweEY5LCAweDQ2LCAweEY5LCAweDQ3LCAweEY5LCAweDQ4LCAvKiAweDQ4LTB4NEIgKi8KKwkweEY5LCAweDQ5LCAweEY5LCAweDRBLCAweEY5LCAweDRCLCAweEY5LCAweDRDLCAvKiAweDRDLTB4NEYgKi8KKwkweEY5LCAweDRELCAweEY5LCAweDRFLCAweEY5LCAweDRGLCAweEY5LCAweDUwLCAvKiAweDUwLTB4NTMgKi8KKwkweEY5LCAweDUxLCAweEY5LCAweDUyLCAweEY5LCAweDUzLCAweEY5LCAweDU0LCAvKiAweDU0LTB4NTcgKi8KKwkweEY5LCAweDU1LCAweEY5LCAweDU2LCAweEY5LCAweDU3LCAweEY5LCAweDU4LCAvKiAweDU4LTB4NUIgKi8KKwkweEY5LCAweDU5LCAweEY5LCAweDVBLCAweEY5LCAweDVCLCAweEY5LCAweDVDLCAvKiAweDVDLTB4NUYgKi8KKwkweEY5LCAweDVELCAweEY5LCAweDVFLCAweEY5LCAweDVGLCAweEY5LCAweDYwLCAvKiAweDYwLTB4NjMgKi8KKwkweEY5LCAweDYxLCAweEY5LCAweDYyLCAweEY5LCAweDYzLCAweEY5LCAweDY0LCAvKiAweDY0LTB4NjcgKi8KKwkweEY5LCAweDY1LCAweEY5LCAweDY2LCAweEY5LCAweDY3LCAweEY5LCAweDY4LCAvKiAweDY4LTB4NkIgKi8KKwkweEY5LCAweDY5LCAweEY5LCAweDZBLCAweEY5LCAweDZCLCAweEY5LCAweDZDLCAvKiAweDZDLTB4NkYgKi8KKwkweEY5LCAweDZELCAweEY5LCAweDZFLCAweEY5LCAweDZGLCAweEY5LCAweDcwLCAvKiAweDcwLTB4NzMgKi8KKwkweEY5LCAweDcxLCAweEY5LCAweDcyLCAweEY5LCAweDczLCAweEY5LCAweDc0LCAvKiAweDc0LTB4NzcgKi8KKwkweEY5LCAweDc1LCAweEY5LCAweDc2LCAweEY5LCAweDc3LCAweEY5LCAweDc4LCAvKiAweDc4LTB4N0IgKi8KKwkweEY5LCAweDc5LCAweEY5LCAweDdBLCAweEY5LCAweDdCLCAweEY5LCAweDdDLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEY5LCAweDdELCAweEY5LCAweDdFLCAweEY5LCAweDgwLCAweEY5LCAweDgxLCAvKiAweDgwLTB4ODMgKi8KKwkweEY5LCAweDgyLCAweEY5LCAweDgzLCAweEY5LCAweDg0LCAweEY5LCAweDg1LCAvKiAweDg0LTB4ODcgKi8KKwkweEY5LCAweDg2LCAweEY5LCAweDg3LCAweEY5LCAweDg4LCAweEY5LCAweDg5LCAvKiAweDg4LTB4OEIgKi8KKwkweEY5LCAweDhBLCAweEY5LCAweDhCLCAweEY5LCAweDhDLCAweEY5LCAweDhELCAvKiAweDhDLTB4OEYgKi8KKwkweEY5LCAweDhFLCAweEY5LCAweDhGLCAweEY5LCAweDkwLCAweEY5LCAweDkxLCAvKiAweDkwLTB4OTMgKi8KKwkweEY5LCAweDkyLCAweEY5LCAweDkzLCAweEY5LCAweDk0LCAweEY5LCAweDk1LCAvKiAweDk0LTB4OTcgKi8KKwkweEY5LCAweDk2LCAweEY5LCAweDk3LCAweEY5LCAweDk4LCAweEY5LCAweDk5LCAvKiAweDk4LTB4OUIgKi8KKwkweEY5LCAweDlBLCAweEY5LCAweDlCLCAweEY5LCAweDlDLCAweEY5LCAweDlELCAvKiAweDlDLTB4OUYgKi8KKwkweEY5LCAweDlFLCAweEY5LCAweDlGLCAweEY5LCAweEEwLCAweEZBLCAweDQwLCAvKiAweEEwLTB4QTMgKi8KKwkweEZBLCAweDQxLCAweEZBLCAweDQyLCAweEZBLCAweDQzLCAweEZBLCAweDQ0LCAvKiAweEE0LTB4QTcgKi8KKwkweEZBLCAweDQ1LCAweEZBLCAweDQ2LCAweEZBLCAweDQ3LCAweEZBLCAweDQ4LCAvKiAweEE4LTB4QUIgKi8KKwkweEZBLCAweDQ5LCAweEZBLCAweDRBLCAweEZBLCAweDRCLCAweEZBLCAweDRDLCAvKiAweEFDLTB4QUYgKi8KKwkweEZBLCAweDRELCAweEZBLCAweDRFLCAweEZBLCAweDRGLCAweEZBLCAweDUwLCAvKiAweEIwLTB4QjMgKi8KKwkweEZBLCAweDUxLCAweEZBLCAweDUyLCAweEZBLCAweDUzLCAweEZBLCAweDU0LCAvKiAweEI0LTB4QjcgKi8KKwkweEZBLCAweDU1LCAweEZBLCAweDU2LCAweEZBLCAweDU3LCAweEZBLCAweDU4LCAvKiAweEI4LTB4QkIgKi8KKwkweEZBLCAweDU5LCAweEZBLCAweDVBLCAweEZBLCAweDVCLCAweEZBLCAweDVDLCAvKiAweEJDLTB4QkYgKi8KKwkweEZBLCAweDVELCAweEZBLCAweDVFLCAweEZBLCAweDVGLCAweEZBLCAweDYwLCAvKiAweEMwLTB4QzMgKi8KKwkweEZBLCAweDYxLCAweEZBLCAweDYyLCAweEZBLCAweDYzLCAweEZBLCAweDY0LCAvKiAweEM0LTB4QzcgKi8KKwkweEZBLCAweDY1LCAweEZBLCAweDY2LCAweEZBLCAweDY3LCAweEZBLCAweDY4LCAvKiAweEM4LTB4Q0IgKi8KKwkweEZBLCAweDY5LCAweEZBLCAweDZBLCAweEZBLCAweDZCLCAweEZBLCAweDZDLCAvKiAweENDLTB4Q0YgKi8KKwkweEZBLCAweDZELCAweEZBLCAweDZFLCAweEZBLCAweDZGLCAweEZBLCAweDcwLCAvKiAweEQwLTB4RDMgKi8KKwkweEZBLCAweDcxLCAweEZBLCAweDcyLCAweEZBLCAweDczLCAweEZBLCAweDc0LCAvKiAweEQ0LTB4RDcgKi8KKwkweEZBLCAweDc1LCAweEZBLCAweDc2LCAweEZBLCAweDc3LCAweEZBLCAweDc4LCAvKiAweEQ4LTB4REIgKi8KKwkweEZBLCAweDc5LCAweEZBLCAweDdBLCAweEZBLCAweDdCLCAweEZBLCAweDdDLCAvKiAweERDLTB4REYgKi8KKwkweEZBLCAweDdELCAweEZBLCAweDdFLCAweEZBLCAweDgwLCAweEZBLCAweDgxLCAvKiAweEUwLTB4RTMgKi8KKwkweEZBLCAweDgyLCAweEZBLCAweDgzLCAweEZBLCAweDg0LCAweEZBLCAweDg1LCAvKiAweEU0LTB4RTcgKi8KKwkweEZBLCAweDg2LCAweEZBLCAweDg3LCAweEZBLCAweDg4LCAweEZBLCAweDg5LCAvKiAweEU4LTB4RUIgKi8KKwkweEZBLCAweDhBLCAweEZBLCAweDhCLCAweEZBLCAweDhDLCAweEZBLCAweDhELCAvKiAweEVDLTB4RUYgKi8KKwkweEZBLCAweDhFLCAweEZBLCAweDhGLCAweEZBLCAweDkwLCAweEZBLCAweDkxLCAvKiAweEYwLTB4RjMgKi8KKwkweEZBLCAweDkyLCAweEZBLCAweDkzLCAweEZBLCAweDk0LCAweEZBLCAweDk1LCAvKiAweEY0LTB4RjcgKi8KKwkweEZBLCAweDk2LCAweEZBLCAweDk3LCAweEZBLCAweDk4LCAweEZBLCAweDk5LCAvKiAweEY4LTB4RkIgKi8KKwkweEZBLCAweDlBLCAweEZBLCAweDlCLCAweEZBLCAweDlDLCAweEZBLCAweDlELCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185RVs1MTJdID0geworCTB4RkEsIDB4OUUsIDB4RkEsIDB4OUYsIDB4RkEsIDB4QTAsIDB4RkIsIDB4NDAsIC8qIDB4MDAtMHgwMyAqLworCTB4RkIsIDB4NDEsIDB4RkIsIDB4NDIsIDB4RkIsIDB4NDMsIDB4RkIsIDB4NDQsIC8qIDB4MDQtMHgwNyAqLworCTB4RkIsIDB4NDUsIDB4RkIsIDB4NDYsIDB4RkIsIDB4NDcsIDB4RkIsIDB4NDgsIC8qIDB4MDgtMHgwQiAqLworCTB4RkIsIDB4NDksIDB4RkIsIDB4NEEsIDB4RkIsIDB4NEIsIDB4RkIsIDB4NEMsIC8qIDB4MEMtMHgwRiAqLworCTB4RkIsIDB4NEQsIDB4RkIsIDB4NEUsIDB4RkIsIDB4NEYsIDB4RkIsIDB4NTAsIC8qIDB4MTAtMHgxMyAqLworCTB4RkIsIDB4NTEsIDB4RkIsIDB4NTIsIDB4RkIsIDB4NTMsIDB4RkIsIDB4NTQsIC8qIDB4MTQtMHgxNyAqLworCTB4RkIsIDB4NTUsIDB4RkIsIDB4NTYsIDB4RkIsIDB4NTcsIDB4RkIsIDB4NTgsIC8qIDB4MTgtMHgxQiAqLworCTB4RkIsIDB4NTksIDB4RkIsIDB4NUEsIDB4RkIsIDB4NUIsIDB4QzQsIDB4RjEsIC8qIDB4MUMtMHgxRiAqLworCTB4RjAsIDB4QUYsIDB4QkMsIDB4QTYsIDB4RjAsIDB4QjAsIDB4QzMsIDB4RjksIC8qIDB4MjAtMHgyMyAqLworCTB4RkIsIDB4NUMsIDB4QzUsIDB4QjgsIDB4RDEsIDB4QkIsIDB4RkIsIDB4NUQsIC8qIDB4MjQtMHgyNyAqLworCTB4RjAsIDB4QjEsIDB4RjAsIDB4QjIsIDB4RjAsIDB4QjMsIDB4RjAsIDB4QjQsIC8qIDB4MjgtMHgyQiAqLworCTB4RjAsIDB4QjUsIDB4RDEsIDB4QkMsIDB4RkIsIDB4NUUsIDB4RDEsIDB4RUMsIC8qIDB4MkMtMHgyRiAqLworCTB4RkIsIDB4NUYsIDB4RjAsIDB4QjcsIDB4RjAsIDB4QjYsIDB4RDQsIDB4QTcsIC8qIDB4MzAtMHgzMyAqLworCTB4RkIsIDB4NjAsIDB4Q0QsIDB4RDIsIDB4RjAsIDB4QjgsIDB4RjAsIDB4QkEsIC8qIDB4MzQtMHgzNyAqLworCTB4RjAsIDB4QjksIDB4RjAsIDB4QkIsIDB4RjAsIDB4QkMsIDB4RkIsIDB4NjEsIC8qIDB4MzgtMHgzQiAqLworCTB4RkIsIDB4NjIsIDB4QjgsIDB4RUIsIDB4RjAsIDB4QkQsIDB4QkEsIDB4RTgsIC8qIDB4M0MtMHgzRiAqLworCTB4RkIsIDB4NjMsIDB4RjAsIDB4QkUsIDB4RjAsIDB4QkYsIDB4QkUsIDB4RTksIC8qIDB4NDAtMHg0MyAqLworCTB4RjAsIDB4QzAsIDB4QjYsIDB4RUMsIDB4RjAsIDB4QzEsIDB4RjAsIDB4QzIsIC8qIDB4NDQtMHg0NyAqLworCTB4RjAsIDB4QzMsIDB4RjAsIDB4QzQsIDB4QzgsIDB4QjUsIDB4RjAsIDB4QzUsIC8qIDB4NDgtMHg0QiAqLworCTB4RjAsIDB4QzYsIDB4RkIsIDB4NjQsIDB4RjAsIDB4QzcsIDB4QzUsIDB4RjQsIC8qIDB4NEMtMHg0RiAqLworCTB4RkIsIDB4NjUsIDB4RjAsIDB4QzgsIDB4RkIsIDB4NjYsIDB4RkIsIDB4NjcsIC8qIDB4NTAtMHg1MyAqLworCTB4RkIsIDB4NjgsIDB4RjAsIDB4QzksIDB4RkIsIDB4NjksIDB4RjAsIDB4Q0EsIC8qIDB4NTQtMHg1NyAqLworCTB4RjcsIDB4QkQsIDB4RkIsIDB4NkEsIDB4RjAsIDB4Q0IsIDB4RjAsIDB4Q0MsIC8qIDB4NTgtMHg1QiAqLworCTB4RjAsIDB4Q0QsIDB4RkIsIDB4NkIsIDB4RjAsIDB4Q0UsIDB4RkIsIDB4NkMsIC8qIDB4NUMtMHg1RiAqLworCTB4RkIsIDB4NkQsIDB4RkIsIDB4NkUsIDB4RkIsIDB4NkYsIDB4RjAsIDB4Q0YsIC8qIDB4NjAtMHg2MyAqLworCTB4QkEsIDB4RDcsIDB4RkIsIDB4NzAsIDB4RjAsIDB4RDAsIDB4RjAsIDB4RDEsIC8qIDB4NjQtMHg2NyAqLworCTB4RjAsIDB4RDIsIDB4RjAsIDB4RDMsIDB4RjAsIDB4RDQsIDB4RjAsIDB4RDUsIC8qIDB4NjgtMHg2QiAqLworCTB4RjAsIDB4RDYsIDB4RjAsIDB4RDgsIDB4RkIsIDB4NzEsIDB4RkIsIDB4NzIsIC8qIDB4NkMtMHg2RiAqLworCTB4RDMsIDB4QTUsIDB4RjAsIDB4RDcsIDB4RkIsIDB4NzMsIDB4RjAsIDB4RDksIC8qIDB4NzAtMHg3MyAqLworCTB4RkIsIDB4NzQsIDB4RkIsIDB4NzUsIDB4RkIsIDB4NzYsIDB4RkIsIDB4NzcsIC8qIDB4NzQtMHg3NyAqLworCTB4RkIsIDB4NzgsIDB4RkIsIDB4NzksIDB4RkIsIDB4N0EsIDB4RkIsIDB4N0IsIC8qIDB4NzgtMHg3QiAqLworCTB4RkIsIDB4N0MsIDB4RkIsIDB4N0QsIDB4RjUsIDB4QkEsIDB4QzIsIDB4QjksIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RkIsIDB4N0UsIDB4RkIsIDB4ODAsIDB4RjcsIDB4RTQsIDB4RkIsIDB4ODEsIC8qIDB4ODAtMHg4MyAqLworCTB4RkIsIDB4ODIsIDB4RkIsIDB4ODMsIDB4RkIsIDB4ODQsIDB4RjcsIDB4RTUsIC8qIDB4ODQtMHg4NyAqLworCTB4RjcsIDB4RTYsIDB4RkIsIDB4ODUsIDB4RkIsIDB4ODYsIDB4RjcsIDB4RTcsIC8qIDB4ODgtMHg4QiAqLworCTB4RkIsIDB4ODcsIDB4RkIsIDB4ODgsIDB4RkIsIDB4ODksIDB4RkIsIDB4OEEsIC8qIDB4OEMtMHg4RiAqLworCTB4RkIsIDB4OEIsIDB4RkIsIDB4OEMsIDB4RjcsIDB4RTgsIDB4QzIsIDB4QjQsIC8qIDB4OTAtMHg5MyAqLworCTB4RkIsIDB4OEQsIDB4RkIsIDB4OEUsIDB4RkIsIDB4OEYsIDB4RkIsIDB4OTAsIC8qIDB4OTQtMHg5NyAqLworCTB4RkIsIDB4OTEsIDB4RkIsIDB4OTIsIDB4RkIsIDB4OTMsIDB4RkIsIDB4OTQsIC8qIDB4OTgtMHg5QiAqLworCTB4RkIsIDB4OTUsIDB4RjcsIDB4RUEsIDB4RkIsIDB4OTYsIDB4RjcsIDB4RUIsIC8qIDB4OUMtMHg5RiAqLworCTB4RkIsIDB4OTcsIDB4RkIsIDB4OTgsIDB4RkIsIDB4OTksIDB4RkIsIDB4OUEsIC8qIDB4QTAtMHhBMyAqLworCTB4RkIsIDB4OUIsIDB4RkIsIDB4OUMsIDB4QzIsIDB4RjMsIDB4RkIsIDB4OUQsIC8qIDB4QTQtMHhBNyAqLworCTB4RkIsIDB4OUUsIDB4RkIsIDB4OUYsIDB4RkIsIDB4QTAsIDB4RkMsIDB4NDAsIC8qIDB4QTgtMHhBQiAqLworCTB4RkMsIDB4NDEsIDB4RkMsIDB4NDIsIDB4RkMsIDB4NDMsIDB4RkMsIDB4NDQsIC8qIDB4QUMtMHhBRiAqLworCTB4RkMsIDB4NDUsIDB4RkMsIDB4NDYsIDB4RkMsIDB4NDcsIDB4RkMsIDB4NDgsIC8qIDB4QjAtMHhCMyAqLworCTB4RjQsIDB4RjAsIDB4RkMsIDB4NDksIDB4RkMsIDB4NEEsIDB4RkMsIDB4NEIsIC8qIDB4QjQtMHhCNyAqLworCTB4RjQsIDB4RUYsIDB4RkMsIDB4NEMsIDB4RkMsIDB4NEQsIDB4QzIsIDB4RTksIC8qIDB4QjgtMHhCQiAqLworCTB4RkMsIDB4NEUsIDB4RjcsIDB4RTEsIDB4RjcsIDB4RTIsIDB4RkMsIDB4NEYsIC8qIDB4QkMtMHhCRiAqLworCTB4RkMsIDB4NTAsIDB4RkMsIDB4NTEsIDB4RkMsIDB4NTIsIDB4RkMsIDB4NTMsIC8qIDB4QzAtMHhDMyAqLworCTB4QkIsIDB4QzYsIDB4RkMsIDB4NTQsIDB4RkMsIDB4NTUsIDB4RkMsIDB4NTYsIC8qIDB4QzQtMHhDNyAqLworCTB4RkMsIDB4NTcsIDB4RDksIDB4RTQsIDB4RkMsIDB4NTgsIDB4RkMsIDB4NTksIC8qIDB4QzgtMHhDQiAqLworCTB4RkMsIDB4NUEsIDB4Q0EsIDB4RjIsIDB4QzAsIDB4RTgsIDB4RjAsIDB4QTQsIC8qIDB4Q0MtMHhDRiAqLworCTB4RkMsIDB4NUIsIDB4QkEsIDB4REEsIDB4RkMsIDB4NUMsIDB4RkMsIDB4NUQsIC8qIDB4RDAtMHhEMyAqLworCTB4QzcsIDB4QUQsIDB4RkMsIDB4NUUsIDB4RkMsIDB4NUYsIDB4RkMsIDB4NjAsIC8qIDB4RDQtMHhENyAqLworCTB4QzQsIDB4QUMsIDB4RkMsIDB4NjEsIDB4RkMsIDB4NjIsIDB4RjcsIDB4RUMsIC8qIDB4RDgtMHhEQiAqLworCTB4RjcsIDB4RUQsIDB4RjcsIDB4RUUsIDB4RkMsIDB4NjMsIDB4RjcsIDB4RjAsIC8qIDB4REMtMHhERiAqLworCTB4RjcsIDB4RUYsIDB4RkMsIDB4NjQsIDB4RjcsIDB4RjEsIDB4RkMsIDB4NjUsIC8qIDB4RTAtMHhFMyAqLworCTB4RkMsIDB4NjYsIDB4RjcsIDB4RjQsIDB4RkMsIDB4NjcsIDB4RjcsIDB4RjMsIC8qIDB4RTQtMHhFNyAqLworCTB4RkMsIDB4NjgsIDB4RjcsIDB4RjIsIDB4RjcsIDB4RjUsIDB4RkMsIDB4NjksIC8qIDB4RTgtMHhFQiAqLworCTB4RkMsIDB4NkEsIDB4RkMsIDB4NkIsIDB4RkMsIDB4NkMsIDB4RjcsIDB4RjYsIC8qIDB4RUMtMHhFRiAqLworCTB4RkMsIDB4NkQsIDB4RkMsIDB4NkUsIDB4RkMsIDB4NkYsIDB4RkMsIDB4NzAsIC8qIDB4RjAtMHhGMyAqLworCTB4RkMsIDB4NzEsIDB4RkMsIDB4NzIsIDB4RkMsIDB4NzMsIDB4RkMsIDB4NzQsIC8qIDB4RjQtMHhGNyAqLworCTB4RkMsIDB4NzUsIDB4RUQsIDB4RTksIDB4RkMsIDB4NzYsIDB4RUQsIDB4RUEsIC8qIDB4RjgtMHhGQiAqLworCTB4RUQsIDB4RUIsIDB4RkMsIDB4NzcsIDB4RjYsIDB4QkMsIDB4RkMsIDB4NzgsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzlGWzUxMl0gPSB7CisJMHhGQywgMHg3OSwgMHhGQywgMHg3QSwgMHhGQywgMHg3QiwgMHhGQywgMHg3QywgLyogMHgwMC0weDAzICovCisJMHhGQywgMHg3RCwgMHhGQywgMHg3RSwgMHhGQywgMHg4MCwgMHhGQywgMHg4MSwgLyogMHgwNC0weDA3ICovCisJMHhGQywgMHg4MiwgMHhGQywgMHg4MywgMHhGQywgMHg4NCwgMHhGNiwgMHhCRCwgLyogMHgwOC0weDBCICovCisJMHhGQywgMHg4NSwgMHhGNiwgMHhCRSwgMHhCNiwgMHhBNiwgMHhGQywgMHg4NiwgLyogMHgwQy0weDBGICovCisJMHhEOCwgMHhCRSwgMHhGQywgMHg4NywgMHhGQywgMHg4OCwgMHhCOSwgMHhDNCwgLyogMHgxMC0weDEzICovCisJMHhGQywgMHg4OSwgMHhGQywgMHg4QSwgMHhGQywgMHg4QiwgMHhEOCwgMHhCQiwgLyogMHgxNC0weDE3ICovCisJMHhGQywgMHg4QywgMHhEQywgMHhCMSwgMHhGQywgMHg4RCwgMHhGQywgMHg4RSwgLyogMHgxOC0weDFCICovCisJMHhGQywgMHg4RiwgMHhGQywgMHg5MCwgMHhGQywgMHg5MSwgMHhGQywgMHg5MiwgLyogMHgxQy0weDFGICovCisJMHhDQSwgMHhGMywgMHhGQywgMHg5MywgMHhGNywgMHhGNywgMHhGQywgMHg5NCwgLyogMHgyMC0weDIzICovCisJMHhGQywgMHg5NSwgMHhGQywgMHg5NiwgMHhGQywgMHg5NywgMHhGQywgMHg5OCwgLyogMHgyNC0weDI3ICovCisJMHhGQywgMHg5OSwgMHhGQywgMHg5QSwgMHhGQywgMHg5QiwgMHhGQywgMHg5QywgLyogMHgyOC0weDJCICovCisJMHhGNywgMHhGOCwgMHhGQywgMHg5RCwgMHhGQywgMHg5RSwgMHhGNywgMHhGOSwgLyogMHgyQy0weDJGICovCisJMHhGQywgMHg5RiwgMHhGQywgMHhBMCwgMHhGRCwgMHg0MCwgMHhGRCwgMHg0MSwgLyogMHgzMC0weDMzICovCisJMHhGRCwgMHg0MiwgMHhGRCwgMHg0MywgMHhGRCwgMHg0NCwgMHhGNywgMHhGQiwgLyogMHgzNC0weDM3ICovCisJMHhGRCwgMHg0NSwgMHhGNywgMHhGQSwgMHhGRCwgMHg0NiwgMHhCMSwgMHhDNywgLyogMHgzOC0weDNCICovCisJMHhGRCwgMHg0NywgMHhGNywgMHhGQywgMHhGNywgMHhGRCwgMHhGRCwgMHg0OCwgLyogMHgzQy0weDNGICovCisJMHhGRCwgMHg0OSwgMHhGRCwgMHg0QSwgMHhGRCwgMHg0QiwgMHhGRCwgMHg0QywgLyogMHg0MC0weDQzICovCisJMHhGNywgMHhGRSwgMHhGRCwgMHg0RCwgMHhGRCwgMHg0RSwgMHhGRCwgMHg0RiwgLyogMHg0NC0weDQ3ICovCisJMHhGRCwgMHg1MCwgMHhGRCwgMHg1MSwgMHhGRCwgMHg1MiwgMHhGRCwgMHg1MywgLyogMHg0OC0weDRCICovCisJMHhGRCwgMHg1NCwgMHhGRCwgMHg1NSwgMHhGRCwgMHg1NiwgMHhGRCwgMHg1NywgLyogMHg0Qy0weDRGICovCisJMHhDNiwgMHhFQiwgMHhFQywgMHhCNCwgMHhGRCwgMHg1OCwgMHhGRCwgMHg1OSwgLyogMHg1MC0weDUzICovCisJMHhGRCwgMHg1QSwgMHhGRCwgMHg1QiwgMHhGRCwgMHg1QywgMHhGRCwgMHg1RCwgLyogMHg1NC0weDU3ICovCisJMHhGRCwgMHg1RSwgMHhGRCwgMHg1RiwgMHhGRCwgMHg2MCwgMHhGRCwgMHg2MSwgLyogMHg1OC0weDVCICovCisJMHhGRCwgMHg2MiwgMHhGRCwgMHg2MywgMHhGRCwgMHg2NCwgMHhGRCwgMHg2NSwgLyogMHg1Qy0weDVGICovCisJMHhGRCwgMHg2NiwgMHhGRCwgMHg2NywgMHhGRCwgMHg2OCwgMHhGRCwgMHg2OSwgLyogMHg2MC0weDYzICovCisJMHhGRCwgMHg2QSwgMHhGRCwgMHg2QiwgMHhGRCwgMHg2QywgMHhGRCwgMHg2RCwgLyogMHg2NC0weDY3ICovCisJMHhGRCwgMHg2RSwgMHhGRCwgMHg2RiwgMHhGRCwgMHg3MCwgMHhGRCwgMHg3MSwgLyogMHg2OC0weDZCICovCisJMHhGRCwgMHg3MiwgMHhGRCwgMHg3MywgMHhGRCwgMHg3NCwgMHhGRCwgMHg3NSwgLyogMHg2Qy0weDZGICovCisJMHhGRCwgMHg3NiwgMHhGRCwgMHg3NywgMHhGRCwgMHg3OCwgMHhGRCwgMHg3OSwgLyogMHg3MC0weDczICovCisJMHhGRCwgMHg3QSwgMHhGRCwgMHg3QiwgMHhGRCwgMHg3QywgMHhGRCwgMHg3RCwgLyogMHg3NC0weDc3ICovCisJMHhGRCwgMHg3RSwgMHhGRCwgMHg4MCwgMHhGRCwgMHg4MSwgMHhGRCwgMHg4MiwgLyogMHg3OC0weDdCICovCisJMHhGRCwgMHg4MywgMHhGRCwgMHg4NCwgMHhGRCwgMHg4NSwgMHhCMywgMHhERCwgLyogMHg3Qy0weDdGICovCisJCisJMHhGNiwgMHhCMywgMHhGRCwgMHg4NiwgMHhGRCwgMHg4NywgMHhGNiwgMHhCNCwgLyogMHg4MC0weDgzICovCisJMHhDMSwgMHhFNCwgMHhGNiwgMHhCNSwgMHhGNiwgMHhCNiwgMHhGNiwgMHhCNywgLyogMHg4NC0weDg3ICovCisJMHhGNiwgMHhCOCwgMHhGNiwgMHhCOSwgMHhGNiwgMHhCQSwgMHhDOCwgMHhBMywgLyogMHg4OC0weDhCICovCisJMHhGNiwgMHhCQiwgMHhGRCwgMHg4OCwgMHhGRCwgMHg4OSwgMHhGRCwgMHg4QSwgLyogMHg4Qy0weDhGICovCisJMHhGRCwgMHg4QiwgMHhGRCwgMHg4QywgMHhGRCwgMHg4RCwgMHhGRCwgMHg4RSwgLyogMHg5MC0weDkzICovCisJMHhGRCwgMHg4RiwgMHhGRCwgMHg5MCwgMHhGRCwgMHg5MSwgMHhGRCwgMHg5MiwgLyogMHg5NC0weDk3ICovCisJMHhGRCwgMHg5MywgMHhDMSwgMHhGQSwgMHhCOSwgMHhBOCwgMHhFRCwgMHhFOCwgLyogMHg5OC0weDlCICovCisJMHhGRCwgMHg5NCwgMHhGRCwgMHg5NSwgMHhGRCwgMHg5NiwgMHhCOSwgMHhFQSwgLyogMHg5Qy0weDlGICovCisJMHhEOSwgMHhERiwgMHhGRCwgMHg5NywgMHhGRCwgMHg5OCwgMHhGRCwgMHg5OSwgLyogMHhBMC0weEEzICovCisJMHhGRCwgMHg5QSwgMHhGRCwgMHg5QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfRENbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19GOVs1MTJdID0geworCTB4RDgsIDB4NEQsIDB4QjgsIDB4RkMsIDB4REMsIDB4ODcsIDB4RDksIDB4NUEsIC8qIDB4MDAtMHgwMyAqLworCTB4QkIsIDB4QUMsIDB4QjQsIDB4QUUsIDB4QkUsIDB4RTQsIDB4RkQsIDB4OTQsIC8qIDB4MDQtMHgwNyAqLworCTB4RkQsIDB4OTQsIDB4QzYsIDB4RjUsIDB4QkQsIDB4RjAsIDB4QzAsIDB4QUUsIC8qIDB4MDgtMHgwQiAqLworCTB4QzQsIDB4Q0UsIDB4OTEsIDB4RDAsIDB4QjAsIDB4NUQsIDB4QzEsIDB4NUYsIC8qIDB4MEMtMHgwRiAqLworCTB4Q0MsIDB4N0QsIDB4QzIsIDB4REQsIDB4QzIsIDB4RTMsIDB4REYsIDB4ODksIC8qIDB4MTAtMHgxMyAqLworCTB4OTgsIDB4QjcsIDB4QzIsIDB4RTUsIDB4QzAsIDB4RDMsIDB4RTcsIDB4RjMsIC8qIDB4MTQtMHgxNyAqLworCTB4QzIsIDB4RTQsIDB4QzAsIDB4RDIsIDB4RjEsIDB4OTgsIDB4ODEsIDB4NzksIC8qIDB4MTgtMHgxQiAqLworCTB4QzIsIDB4RDEsIDB4OTksIDB4REEsIDB4QTAsIDB4ODAsIDB4Q0MsIDB4NkQsIC8qIDB4MUMtMHgxRiAqLworCTB4RkIsIDB4NUIsIDB4OEQsIDB4QjksIDB4OUUsIDB4NDUsIDB4Q0IsIDB4N0IsIC8qIDB4MjAtMHgyMyAqLworCTB4RDIsIDB4NjgsIDB4QzAsIDB4QUQsIDB4QzUsIDB4NDQsIDB4Q0YsIDB4OUUsIC8qIDB4MjQtMHgyNyAqLworCTB4QzAsIDB4QzgsIDB4QzAsIDB4Q0EsIDB4QzAsIDB4Q0IsIDB4QzAsIDB4QzcsIC8qIDB4MjgtMHgyQiAqLworCTB4RkQsIDB4OUMsIDB4ODEsIDB4RUQsIDB4QzAsIDB4RTQsIDB4ODQsIDB4REEsIC8qIDB4MkMtMHgyRiAqLworCTB4OTMsIDB4RUYsIDB4OTksIDB4QTksIDB4QTAsIDB4NzQsIDB4QjEsIDB4NTIsIC8qIDB4MzAtMHgzMyAqLworCTB4QzAsIDB4Q0YsIDB4Q0MsIDB4NEEsIDB4Q0MsIDB4OTQsIDB4QzIsIDB4QjcsIC8qIDB4MzQtMHgzNyAqLworCTB4QzIsIDB4QjYsIDB4RjQsIDB4OTQsIDB4RkEsIDB4OTgsIDB4QzIsIDB4QjUsIC8qIDB4MzgtMHgzQiAqLworCTB4QjUsIDB4OTMsIDB4QkUsIDB4NDcsIDB4QzcsIDB4OEEsIDB4RTQsIDB4OUIsIC8qIDB4M0MtMHgzRiAqLworCTB4QzIsIDB4QjksIDB4RDUsIDB4OTMsIDB4ODksIDB4QzUsIDB4QzUsIDB4QUEsIC8qIDB4NDAtMHg0MyAqLworCTB4QkIsIDB4NUMsIDB4QzMsIDB4NDAsIDB4QzAsIDB4Q0UsIDB4QzAsIDB4REEsIC8qIDB4NDQtMHg0NyAqLworCTB4RDksIDB4NTQsIDB4QzAsIDB4RDcsIDB4ODksIDB4QkUsIDB4OEMsIDB4RDIsIC8qIDB4NDgtMHg0QiAqLworCTB4OTgsIDB4QzcsIDB4OUMsIDB4NDksIDB4QzIsIDB4QTksIDB4QzAsIDB4REIsIC8qIDB4NEMtMHg0RiAqLworCTB4QkYsIDB4N0MsIDB4QzIsIDB4QUEsIDB4QzAsIDB4RDUsIDB4QzAsIDB4REYsIC8qIDB4NTAtMHg1MyAqLworCTB4ODQsIDB4NDMsIDB4QzEsIDB4RTgsIDB4QjYsIDB4QTAsIDB4QkUsIDB4NjMsIC8qIDB4NTQtMHg1NyAqLworCTB4QzEsIDB4RTIsIDB4QzEsIDB4RUEsIDB4RDcsIDB4NzgsIDB4OTIsIDB4ODIsIC8qIDB4NTgtMHg1QiAqLworCTB4OTgsIDB4QjcsIDB4RDYsIDB4NUEsIDB4QjUsIDB4QTQsIDB4OEMsIDB4OEUsIC8qIDB4NUMtMHg1RiAqLworCTB4QzUsIDB4QUQsIDB4QzIsIDB4Q0EsIDB4QUUsIDB4OTAsIDB4QjEsIDB4QjEsIC8qIDB4NjAtMHg2MyAqLworCTB4QjQsIDB4OTEsIDB4QjEsIDB4RTMsIDB4OEYsIDB4Q0QsIDB4QjIsIDB4QkIsIC8qIDB4NjQtMHg2NyAqLworCTB4QzMsIDB4REEsIDB4OTQsIDB4QjUsIDB4Q0IsIDB4RjcsIDB4ODUsIDB4QTIsIC8qIDB4NjgtMHg2QiAqLworCTB4QzgsIDB4RkIsIDB4Q0EsIDB4QTEsIDB4QzgsIDB4N0UsIDB4RDUsIDB4NjYsIC8qIDB4NkMtMHg2RiAqLworCTB4OUEsIDB4QTIsIDB4QjMsIDB4QkQsIDB4QzksIDB4RjIsIDB4Q0EsIDB4QjAsIC8qIDB4NzAtMHg3MyAqLworCTB4QzgsIDB4RjQsIDB4QzIsIDB4RDMsIDB4QzIsIDB4RDQsIDB4QzEsIDB4QzEsIC8qIDB4NzQtMHg3NyAqLworCTB4ODMsIDB4QzksIDB4RkQsIDB4OUQsIDB4QzEsIDB4QkEsIDB4QkMsIDB4NUEsIC8qIDB4NzgtMHg3QiAqLworCTB4QzEsIDB4QkMsIDB4RDUsIDB4OEYsIDB4QzEsIDB4QkYsIDB4ODQsIDB4RUUsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4ODUsIDB4Q0UsIDB4QzUsIDB4QUUsIDB4OEYsIDB4NUQsIDB4QzIsIDB4QzMsIC8qIDB4ODAtMHg4MyAqLworCTB4OUUsIDB4NTYsIDB4QjUsIDB4NUEsIDB4RTksIDB4ODIsIDB4RjMsIDB4NTAsIC8qIDB4ODQtMHg4NyAqLworCTB4RkIsIDB4OTAsIDB4QzAsIDB4RTgsIDB4QzEsIDB4QTYsIDB4OTUsIDB4RDEsIC8qIDB4ODgtMHg4QiAqLworCTB4OUEsIDB4NzYsIDB4REUsIDB4NUQsIDB4QzQsIDB4RUEsIDB4OTEsIDB4N0EsIC8qIDB4OEMtMHg4RiAqLworCTB4OTEsIDB4RDksIDB4OTMsIDB4RDMsIDB4OUQsIDB4NjksIDB4OUYsIDB4OTIsIC8qIDB4OTAtMHg5MyAqLworCTB4QUQsIDB4NDksIDB4RkQsIDB4OUUsIDB4QkUsIDB4OUEsIDB4QzIsIDB4OTMsIC8qIDB4OTQtMHg5NyAqLworCTB4REQsIDB4ODIsIDB4QzksIDB4OEYsIDB4REYsIDB4NDIsIDB4RTUsIDB4ODAsIC8qIDB4OTgtMHg5QiAqLworCTB4QzEsIDB4RDAsIDB4QzEsIDB4RDMsIDB4RDEsIDB4Q0EsIDB4QzEsIDB4RDIsIC8qIDB4OUMtMHg5RiAqLworCTB4QzEsIDB4RDEsIDB4RDUsIDB4NjYsIDB4QzEsIDB4QUUsIDB4QzQsIDB4RUUsIC8qIDB4QTAtMHhBMyAqLworCTB4QzQsIDB4RUQsIDB4OUEsIDB4OUEsIDB4QkEsIDB4OUYsIDB4QUIsIDB4NDMsIC8qIDB4QTQtMHhBNyAqLworCTB4QzEsIDB4RUUsIDB4RTAsIDB4RjIsIDB4OEMsIDB4OEUsIDB4OEUsIDB4NTgsIC8qIDB4QTgtMHhBQiAqLworCTB4QzEsIDB4QUYsIDB4QzEsIDB4RTEsIDB4QUMsIDB4OTMsIDB4QzEsIDB4RTcsIC8qIDB4QUMtMHhBRiAqLworCTB4RjEsIDB4RjYsIDB4RTIsIDB4OEYsIDB4QzEsIDB4RTMsIDB4RUMsIDB4NjAsIC8qIDB4QjAtMHhCMyAqLworCTB4RUUsIDB4NDksIDB4QzAsIDB4RkQsIDB4QjYsIDB4NTksIDB4RjUsIDB4QjcsIC8qIDB4QjQtMHhCNyAqLworCTB4RUIsIDB4NjAsIDB4OTAsIDB4QkEsIDB4QzEsIDB4Q0IsIDB4QzEsIDB4QzUsIC8qIDB4QjgtMHhCQiAqLworCTB4RTUsIDB4QkMsIDB4QzQsIDB4RjIsIDB4QzEsIDB4Q0YsIDB4OTgsIDB4QjcsIC8qIDB4QkMtMHhCRiAqLworCTB4QzEsIDB4QzcsIDB4QUYsIDB4OUYsIDB4REUsIDB4QTQsIDB4REYsIDB4N0MsIC8qIDB4QzAtMHhDMyAqLworCTB4RkQsIDB4ODgsIDB4OTUsIDB4OUUsIDB4QzgsIDB4RUUsIDB4ODQsIDB4QTIsIC8qIDB4QzQtMHhDNyAqLworCTB4OTYsIDB4ODMsIDB4QzEsIDB4RjgsIDB4QzEsIDB4RjcsIDB4QzEsIDB4RUYsIC8qIDB4QzgtMHhDQiAqLworCTB4QzEsIDB4RjAsIDB4QzEsIDB4RjQsIDB4QzEsIDB4RjIsIDB4QkMsIDB4N0UsIC8qIDB4Q0MtMHhDRiAqLworCTB4RUUsIDB4OTAsIDB4QzEsIDB4RjksIDB4QzIsIDB4QkUsIDB4RUEsIDB4OTEsIC8qIDB4RDAtMHhEMyAqLworCTB4ODIsIDB4OTAsIDB4OEQsIDB4OTEsIDB4OUMsIDB4NTMsIDB4REQsIDB4ODYsIC8qIDB4RDQtMHhENyAqLworCTB4QzIsIDB4QzksIDB4OTAsIDB4RkMsIDB4QzAsIDB4RjUsIDB4QzIsIDB4Q0EsIC8qIDB4RDgtMHhEQiAqLworCTB4QzIsIDB4QTEsIDB4QzAsIDB4RkIsIDB4QzAsIDB4RjQsIDB4QzIsIDB4QzQsIC8qIDB4REMtMHhERiAqLworCTB4RDIsIDB4RDcsIDB4QzAsIDB4RUUsIDB4QzAsIDB4RTYsIDB4QzQsIDB4RTAsIC8qIDB4RTAtMHhFMyAqLworCTB4QzAsIDB4RUQsIDB4QzEsIDB4QTEsIDB4RUUsIDB4QkUsIDB4RkQsIDB4OUYsIC8qIDB4RTQtMHhFNyAqLworCTB4RDEsIDB4NjUsIDB4QzAsIDB4RUYsIDB4RUIsIDB4NzgsIDB4QzQsIDB4RTQsIC8qIDB4RTgtMHhFQiAqLworCTB4QzQsIDB4RTcsIDB4QzEsIDB4REYsIDB4OUYsIDB4RkIsIDB4QUQsIDB4NTUsIC8qIDB4RUMtMHhFRiAqLworCTB4Q0MsIDB4NDEsIDB4RkQsIDB4QTAsIDB4RjcsIDB4NUIsIDB4RjcsIDB4RUIsIC8qIDB4RjAtMHhGMyAqLworCTB4QzEsIDB4RDYsIDB4QzEsIDB4REMsIDB4QzUsIDB4NTIsIDB4QzEsIDB4QTIsIC8qIDB4RjQtMHhGNyAqLworCTB4RjMsIDB4RDIsIDB4QzEsIDB4QTMsIDB4QTAsIDB4RUUsIDB4RDYsIDB4Q0IsIC8qIDB4RjgtMHhGQiAqLworCTB4RDcsIDB4NTIsIDB4Q0EsIDB4QjIsIDB4QjIsIDB4RTgsIDB4QjQsIDB4Q0MsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0ZBWzUxMl0gPSB7CisJMHhDNywgMHhEMCwgMHhCNiwgMHhDOCwgMHhDRCwgMHhEOCwgMHhDQywgMHhDNywgLyogMHgwMC0weDAzICovCisJMHhENSwgMHhBQywgMHhCNiwgMHhCNCwgMHhCMSwgMHhBOSwgMHhERCwgMHg5NywgLyogMHgwNC0weDA3ICovCisJMHhEMCwgMHhEMCwgMHhCRCwgMHhCNSwgMHhEMiwgMHg4QSwgMHhDMCwgMHhBQSwgLyogMHgwOC0weDBCICovCisJMHhGRSwgMHg0MCwgMHhGRSwgMHg0MSwgMHhGRSwgMHg0MiwgMHhGRSwgMHg0MywgLyogMHgwQy0weDBGICovCisJMHg4OSwgMHg1NiwgMHhGRSwgMHg0NCwgMHhDNywgMHhFNywgMHhGRSwgMHg0NSwgLyogMHgxMC0weDEzICovCisJMHhGRSwgMHg0NiwgMHg4NCwgMHg0NCwgMHhEOCwgMHg2OSwgMHhEMiwgMHhFNiwgLyogMHgxNC0weDE3ICovCisJMHhGRSwgMHg0NywgMHhDOSwgMHhGMSwgMHhDRiwgMHhFOSwgMHhCOCwgMHhBMywgLyogMHgxOC0weDFCICovCisJMHhCRSwgMHhCOCwgMHhCRSwgMHhBQiwgMHhEMywgMHhGMCwgMHhGRSwgMHg0OCwgLyogMHgxQy0weDFGICovCisJMHhGRSwgMHg0OSwgMHhGRSwgMHg0QSwgMHhENiwgMHg1NCwgMHhGRSwgMHg0QiwgLyogMHgyMC0weDIzICovCisJMHhGRSwgMHg0QywgMHhEMiwgMHhERCwgMHhCNiwgMHhCQywgMHhGRSwgMHg0RCwgLyogMHgyNC0weDI3ICovCisJMHhGRSwgMHg0RSwgMHhGRSwgMHg0RiwgMHhFRiwgMHg4OCwgMHhFRiwgMHg5NSwgLyogMHgyOC0weDJCICovCisJMHhGMCwgMHg1RSwgMHhGQSwgMHg1MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfRkVbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweEE5LCAweDU1LCAweEE2LCAweEYyLCAweDAwLCAweDAwLCAweEE2LCAweEY0LCAvKiAweDMwLTB4MzMgKi8KKwkweEE2LCAweEY1LCAweEE2LCAweEUwLCAweEE2LCAweEUxLCAweEE2LCAweEYwLCAvKiAweDM0LTB4MzcgKi8KKwkweEE2LCAweEYxLCAweEE2LCAweEUyLCAweEE2LCAweEUzLCAweEE2LCAweEVFLCAvKiAweDM4LTB4M0IgKi8KKwkweEE2LCAweEVGLCAweEE2LCAweEU2LCAweEE2LCAweEU3LCAweEE2LCAweEU0LCAvKiAweDNDLTB4M0YgKi8KKwkweEE2LCAweEU1LCAweEE2LCAweEU4LCAweEE2LCAweEU5LCAweEE2LCAweEVBLCAvKiAweDQwLTB4NDMgKi8KKwkweEE2LCAweEVCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweEE5LCAweDY4LCAweEE5LCAweDY5LCAweEE5LCAweDZBLCAvKiAweDQ4LTB4NEIgKi8KKwkweEE5LCAweDZCLCAweEE5LCAweDZDLCAweEE5LCAweDZELCAweEE5LCAweDZFLCAvKiAweDRDLTB4NEYgKi8KKwkweEE5LCAweDZGLCAweEE5LCAweDcwLCAweEE5LCAweDcxLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweEE5LCAweDcyLCAweEE5LCAweDczLCAweEE5LCAweDc0LCAweEE5LCAweDc1LCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweEE5LCAweDc2LCAweEE5LCAweDc3LCAweEE5LCAweDc4LCAvKiAweDU4LTB4NUIgKi8KKwkweEE5LCAweDc5LCAweEE5LCAweDdBLCAweEE5LCAweDdCLCAweEE5LCAweDdDLCAvKiAweDVDLTB4NUYgKi8KKwkweEE5LCAweDdELCAweEE5LCAweDdFLCAweEE5LCAweDgwLCAweEE5LCAweDgxLCAvKiAweDYwLTB4NjMgKi8KKwkweEE5LCAweDgyLCAweEE5LCAweDgzLCAweEE5LCAweDg0LCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweEE5LCAweDg1LCAweEE5LCAweDg2LCAweEE5LCAweDg3LCAweEE5LCAweDg4LCAvKiAweDY4LTB4NkIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19GRls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4QTMsIDB4QTEsIDB4QTMsIDB4QTIsIDB4QTMsIDB4QTMsIC8qIDB4MDAtMHgwMyAqLworCTB4QTEsIDB4RTcsIDB4QTMsIDB4QTUsIDB4QTMsIDB4QTYsIDB4QTMsIDB4QTcsIC8qIDB4MDQtMHgwNyAqLworCTB4QTMsIDB4QTgsIDB4QTMsIDB4QTksIDB4QTMsIDB4QUEsIDB4QTMsIDB4QUIsIC8qIDB4MDgtMHgwQiAqLworCTB4QTMsIDB4QUMsIDB4QTMsIDB4QUQsIDB4QTMsIDB4QUUsIDB4QTMsIDB4QUYsIC8qIDB4MEMtMHgwRiAqLworCTB4QTMsIDB4QjAsIDB4QTMsIDB4QjEsIDB4QTMsIDB4QjIsIDB4QTMsIDB4QjMsIC8qIDB4MTAtMHgxMyAqLworCTB4QTMsIDB4QjQsIDB4QTMsIDB4QjUsIDB4QTMsIDB4QjYsIDB4QTMsIDB4QjcsIC8qIDB4MTQtMHgxNyAqLworCTB4QTMsIDB4QjgsIDB4QTMsIDB4QjksIDB4QTMsIDB4QkEsIDB4QTMsIDB4QkIsIC8qIDB4MTgtMHgxQiAqLworCTB4QTMsIDB4QkMsIDB4QTMsIDB4QkQsIDB4QTMsIDB4QkUsIDB4QTMsIDB4QkYsIC8qIDB4MUMtMHgxRiAqLworCTB4QTMsIDB4QzAsIDB4QTMsIDB4QzEsIDB4QTMsIDB4QzIsIDB4QTMsIDB4QzMsIC8qIDB4MjAtMHgyMyAqLworCTB4QTMsIDB4QzQsIDB4QTMsIDB4QzUsIDB4QTMsIDB4QzYsIDB4QTMsIDB4QzcsIC8qIDB4MjQtMHgyNyAqLworCTB4QTMsIDB4QzgsIDB4QTMsIDB4QzksIDB4QTMsIDB4Q0EsIDB4QTMsIDB4Q0IsIC8qIDB4MjgtMHgyQiAqLworCTB4QTMsIDB4Q0MsIDB4QTMsIDB4Q0QsIDB4QTMsIDB4Q0UsIDB4QTMsIDB4Q0YsIC8qIDB4MkMtMHgyRiAqLworCTB4QTMsIDB4RDAsIDB4QTMsIDB4RDEsIDB4QTMsIDB4RDIsIDB4QTMsIDB4RDMsIC8qIDB4MzAtMHgzMyAqLworCTB4QTMsIDB4RDQsIDB4QTMsIDB4RDUsIDB4QTMsIDB4RDYsIDB4QTMsIDB4RDcsIC8qIDB4MzQtMHgzNyAqLworCTB4QTMsIDB4RDgsIDB4QTMsIDB4RDksIDB4QTMsIDB4REEsIDB4QTMsIDB4REIsIC8qIDB4MzgtMHgzQiAqLworCTB4QTMsIDB4REMsIDB4QTMsIDB4REQsIDB4QTMsIDB4REUsIDB4QTMsIDB4REYsIC8qIDB4M0MtMHgzRiAqLworCTB4QTMsIDB4RTAsIDB4QTMsIDB4RTEsIDB4QTMsIDB4RTIsIDB4QTMsIDB4RTMsIC8qIDB4NDAtMHg0MyAqLworCTB4QTMsIDB4RTQsIDB4QTMsIDB4RTUsIDB4QTMsIDB4RTYsIDB4QTMsIDB4RTcsIC8qIDB4NDQtMHg0NyAqLworCTB4QTMsIDB4RTgsIDB4QTMsIDB4RTksIDB4QTMsIDB4RUEsIDB4QTMsIDB4RUIsIC8qIDB4NDgtMHg0QiAqLworCTB4QTMsIDB4RUMsIDB4QTMsIDB4RUQsIDB4QTMsIDB4RUUsIDB4QTMsIDB4RUYsIC8qIDB4NEMtMHg0RiAqLworCTB4QTMsIDB4RjAsIDB4QTMsIDB4RjEsIDB4QTMsIDB4RjIsIDB4QTMsIDB4RjMsIC8qIDB4NTAtMHg1MyAqLworCTB4QTMsIDB4RjQsIDB4QTMsIDB4RjUsIDB4QTMsIDB4RjYsIDB4QTMsIDB4RjcsIC8qIDB4NTQtMHg1NyAqLworCTB4QTMsIDB4RjgsIDB4QTMsIDB4RjksIDB4QTMsIDB4RkEsIDB4QTMsIDB4RkIsIC8qIDB4NTgtMHg1QiAqLworCTB4QTMsIDB4RkMsIDB4QTMsIDB4RkQsIDB4QTEsIDB4QUIsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4QTEsIDB4RTksIDB4QTEsIDB4RUEsIDB4QTksIDB4NTYsIDB4QTMsIDB4RkUsIC8qIDB4RTAtMHhFMyAqLworCTB4QTksIDB4NTcsIDB4QTMsIDB4QTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnBhZ2VfdW5pMmNoYXJzZXRbMjU2XSA9IHsKKwlOVUxMLCAgIHUyY18wMSwgdTJjXzAyLCB1MmNfMDMsIHUyY18wNCwgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJdTJjXzIwLCB1MmNfMjEsIHUyY18yMiwgdTJjXzIzLCB1MmNfMjQsIHUyY18yNSwgdTJjXzI2LCBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwl1MmNfMzAsIHUyY18zMSwgdTJjXzMyLCB1MmNfMzMsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICB1MmNfNEUsIHUyY180RiwgCisJdTJjXzUwLCB1MmNfNTEsIHUyY181MiwgdTJjXzUzLCB1MmNfNTQsIHUyY181NSwgdTJjXzU2LCB1MmNfNTcsIAorCXUyY181OCwgdTJjXzU5LCB1MmNfNUEsIHUyY181QiwgdTJjXzVDLCB1MmNfNUQsIHUyY181RSwgdTJjXzVGLCAKKwl1MmNfNjAsIHUyY182MSwgdTJjXzYyLCB1MmNfNjMsIHUyY182NCwgdTJjXzY1LCB1MmNfNjYsIHUyY182NywgCisJdTJjXzY4LCB1MmNfNjksIHUyY182QSwgdTJjXzZCLCB1MmNfNkMsIHUyY182RCwgdTJjXzZFLCB1MmNfNkYsIAorCXUyY183MCwgdTJjXzcxLCB1MmNfNzIsIHUyY183MywgdTJjXzc0LCB1MmNfNzUsIHUyY183NiwgdTJjXzc3LCAKKwl1MmNfNzgsIHUyY183OSwgdTJjXzdBLCB1MmNfN0IsIHUyY183QywgdTJjXzdELCB1MmNfN0UsIHUyY183RiwgCisJdTJjXzgwLCB1MmNfODEsIHUyY184MiwgdTJjXzgzLCB1MmNfODQsIHUyY184NSwgdTJjXzg2LCB1MmNfODcsIAorCXUyY184OCwgdTJjXzg5LCB1MmNfOEEsIHUyY184QiwgdTJjXzhDLCB1MmNfOEQsIHUyY184RSwgdTJjXzhGLCAKKwl1MmNfOTAsIHUyY185MSwgdTJjXzkyLCB1MmNfOTMsIHUyY185NCwgdTJjXzk1LCB1MmNfOTYsIHUyY185NywgCisJdTJjXzk4LCB1MmNfOTksIHUyY185QSwgdTJjXzlCLCB1MmNfOUMsIHUyY185RCwgdTJjXzlFLCB1MmNfOUYsIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIHUyY19EQywgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICB1MmNfRjksIHUyY19GQSwgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgdTJjX0ZFLCB1MmNfRkYsIH07CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQybG93ZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDQwLTB4NDcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDUwLTB4NTcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJ1cHBlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NjAtMHg2NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NzAtMHg3NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgaW50IHVuaTJjaGFyKGNvbnN0IHdjaGFyX3QgdW5pLAorCQkJdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgYm91bmRsZW4pCit7CisJdW5zaWduZWQgY2hhciAqdW5pMmNoYXJzZXQ7CisJdW5zaWduZWQgY2hhciBjbCA9IHVuaSYweEZGOworCXVuc2lnbmVkIGNoYXIgY2ggPSAodW5pPj44KSYweEZGOworCWludCBuOworCisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisKKwl1bmkyY2hhcnNldCA9IHBhZ2VfdW5pMmNoYXJzZXRbY2hdOworCWlmICh1bmkyY2hhcnNldCkgeworCQlpZiAoYm91bmRsZW4gPD0gMSkKKwkJCXJldHVybiAtRU5BTUVUT09MT05HOworCQlvdXRbMF0gPSB1bmkyY2hhcnNldFtjbCoyXTsKKwkJb3V0WzFdID0gdW5pMmNoYXJzZXRbY2wqMisxXTsKKwkJaWYgKG91dFswXSA9PSAweDAwICYmIG91dFsxXSA9PSAweDAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCW4gPSAyOworCX0gZWxzZSBpZiAoY2g9PTAgJiYgY2wpIHsKKwkJb3V0WzBdID0gY2w7CisJCW4gPSAxOworCX0KKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbnQgY2hhcjJ1bmkoY29uc3QgdW5zaWduZWQgY2hhciAqcmF3c3RyaW5nLCBpbnQgYm91bmRsZW4sCisJCQl3Y2hhcl90ICp1bmkpCit7CisJdW5zaWduZWQgY2hhciBjaCwgY2w7CisJd2NoYXJfdCAqY2hhcnNldDJ1bmk7CisJaW50IG47CisKKwlpZiAoYm91bmRsZW4gPD0gMCkKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwlpZiAoYm91bmRsZW4gPT0gMSkgeworCQkqdW5pID0gcmF3c3RyaW5nWzBdOworCQlyZXR1cm4gMTsKKwl9CisKKwljaCA9IHJhd3N0cmluZ1swXTsKKwljbCA9IHJhd3N0cmluZ1sxXTsKKworCWNoYXJzZXQydW5pID0gcGFnZV9jaGFyc2V0MnVuaVtjaF07CisJaWYgKGNoYXJzZXQydW5pICYmIGNsKSB7CisJCSp1bmkgPSBjaGFyc2V0MnVuaVtjbF07CisJCWlmICgqdW5pID09IDB4MDAwMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQluID0gMjsKKwl9IGVsc2V7CisJCSp1bmkgPSBjaDsKKwkJbiA9IDE7CisJfQorCXJldHVybiBuOworfQorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSB0YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJjcDkzNiIsCisJLmFsaWFzCQk9ICJnYjIzMTIiLAorCS51bmkyY2hhcgk9IHVuaTJjaGFyLAorCS5jaGFyMnVuaQk9IGNoYXIydW5pLAorCS5jaGFyc2V0Mmxvd2VyCT0gY2hhcnNldDJsb3dlciwKKwkuY2hhcnNldDJ1cHBlcgk9IGNoYXJzZXQydXBwZXIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9ubHNfY3A5MzYodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X25sc19jcDkzNih2b2lkKQoreworCXVucmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbmxzX2NwOTM2KQorbW9kdWxlX2V4aXQoZXhpdF9ubHNfY3A5MzYpCisKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKK01PRFVMRV9BTElBU19OTFMoZ2IyMzEyKTsKZGlmZiAtLWdpdCBhL2ZzL25scy9ubHNfY3A5NDkuYyBiL2ZzL25scy9ubHNfY3A5NDkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzUxYWUyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmxzL25sc19jcDk0OS5jCkBAIC0wLDAgKzEsMTM5NDcgQEAKKy8qCisgKiBsaW51eC9mcy9ubHNfY3A5NDkuYworICoKKyAqIENoYXJzZXQgY3A5NDkgdHJhbnNsYXRpb24gdGFibGVzLgorICogVGhpcyB0cmFuc2xhdGlvbiB0YWJsZSB3YXMgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHksIHRoZQorICogb3JpZ2luYWwgdGFibGUgY2FuIGJlIGRvd25sb2FkIGZyb20gdGhlIE1pY3Jvc29mdCB3ZWJzaXRlLgorICogKGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L3VuaWNvZGUvdW5pY29kZWNwLmh0bSkKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworc3RhdGljIHdjaGFyX3QgYzJ1XzgxWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEFDMDIsMHhBQzAzLDB4QUMwNSwweEFDMDYsMHhBQzBCLDB4QUMwQywweEFDMEQsLyogMHg0MC0weDQ3ICovCisJMHhBQzBFLDB4QUMwRiwweEFDMTgsMHhBQzFFLDB4QUMxRiwweEFDMjEsMHhBQzIyLDB4QUMyMywvKiAweDQ4LTB4NEYgKi8KKwkweEFDMjUsMHhBQzI2LDB4QUMyNywweEFDMjgsMHhBQzI5LDB4QUMyQSwweEFDMkIsMHhBQzJFLC8qIDB4NTAtMHg1NyAqLworCTB4QUMzMiwweEFDMzMsMHhBQzM0LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4QUMzNSwweEFDMzYsMHhBQzM3LDB4QUMzQSwweEFDM0IsMHhBQzNELDB4QUMzRSwvKiAweDYwLTB4NjcgKi8KKwkweEFDM0YsMHhBQzQxLDB4QUM0MiwweEFDNDMsMHhBQzQ0LDB4QUM0NSwweEFDNDYsMHhBQzQ3LC8qIDB4NjgtMHg2RiAqLworCTB4QUM0OCwweEFDNDksMHhBQzRBLDB4QUM0QywweEFDNEUsMHhBQzRGLDB4QUM1MCwweEFDNTEsLyogMHg3MC0weDc3ICovCisJMHhBQzUyLDB4QUM1MywweEFDNTUsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEFDNTYsMHhBQzU3LDB4QUM1OSwweEFDNUEsMHhBQzVCLDB4QUM1RCwweEFDNUUsLyogMHg4MC0weDg3ICovCisJMHhBQzVGLDB4QUM2MCwweEFDNjEsMHhBQzYyLDB4QUM2MywweEFDNjQsMHhBQzY1LDB4QUM2NiwvKiAweDg4LTB4OEYgKi8KKwkweEFDNjcsMHhBQzY4LDB4QUM2OSwweEFDNkEsMHhBQzZCLDB4QUM2QywweEFDNkQsMHhBQzZFLC8qIDB4OTAtMHg5NyAqLworCTB4QUM2RiwweEFDNzIsMHhBQzczLDB4QUM3NSwweEFDNzYsMHhBQzc5LDB4QUM3QiwweEFDN0MsLyogMHg5OC0weDlGICovCisJMHhBQzdELDB4QUM3RSwweEFDN0YsMHhBQzgyLDB4QUM4NywweEFDODgsMHhBQzhELDB4QUM4RSwvKiAweEEwLTB4QTcgKi8KKwkweEFDOEYsMHhBQzkxLDB4QUM5MiwweEFDOTMsMHhBQzk1LDB4QUM5NiwweEFDOTcsMHhBQzk4LC8qIDB4QTgtMHhBRiAqLworCTB4QUM5OSwweEFDOUEsMHhBQzlCLDB4QUM5RSwweEFDQTIsMHhBQ0EzLDB4QUNBNCwweEFDQTUsLyogMHhCMC0weEI3ICovCisJMHhBQ0E2LDB4QUNBNywweEFDQUIsMHhBQ0FELDB4QUNBRSwweEFDQjEsMHhBQ0IyLDB4QUNCMywvKiAweEI4LTB4QkYgKi8KKwkweEFDQjQsMHhBQ0I1LDB4QUNCNiwweEFDQjcsMHhBQ0JBLDB4QUNCRSwweEFDQkYsMHhBQ0MwLC8qIDB4QzAtMHhDNyAqLworCTB4QUNDMiwweEFDQzMsMHhBQ0M1LDB4QUNDNiwweEFDQzcsMHhBQ0M5LDB4QUNDQSwweEFDQ0IsLyogMHhDOC0weENGICovCisJMHhBQ0NELDB4QUNDRSwweEFDQ0YsMHhBQ0QwLDB4QUNEMSwweEFDRDIsMHhBQ0QzLDB4QUNENCwvKiAweEQwLTB4RDcgKi8KKwkweEFDRDYsMHhBQ0Q4LDB4QUNEOSwweEFDREEsMHhBQ0RCLDB4QUNEQywweEFDREQsMHhBQ0RFLC8qIDB4RDgtMHhERiAqLworCTB4QUNERiwweEFDRTIsMHhBQ0UzLDB4QUNFNSwweEFDRTYsMHhBQ0U5LDB4QUNFQiwweEFDRUQsLyogMHhFMC0weEU3ICovCisJMHhBQ0VFLDB4QUNGMiwweEFDRjQsMHhBQ0Y3LDB4QUNGOCwweEFDRjksMHhBQ0ZBLDB4QUNGQiwvKiAweEU4LTB4RUYgKi8KKwkweEFDRkUsMHhBQ0ZGLDB4QUQwMSwweEFEMDIsMHhBRDAzLDB4QUQwNSwweEFEMDcsMHhBRDA4LC8qIDB4RjAtMHhGNyAqLworCTB4QUQwOSwweEFEMEEsMHhBRDBCLDB4QUQwRSwweEFEMTAsMHhBRDEyLDB4QUQxMywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfODJbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4QUQxNCwweEFEMTUsMHhBRDE2LDB4QUQxNywweEFEMTksMHhBRDFBLDB4QUQxQiwvKiAweDQwLTB4NDcgKi8KKwkweEFEMUQsMHhBRDFFLDB4QUQxRiwweEFEMjEsMHhBRDIyLDB4QUQyMywweEFEMjQsMHhBRDI1LC8qIDB4NDgtMHg0RiAqLworCTB4QUQyNiwweEFEMjcsMHhBRDI4LDB4QUQyQSwweEFEMkIsMHhBRDJFLDB4QUQyRiwweEFEMzAsLyogMHg1MC0weDU3ICovCisJMHhBRDMxLDB4QUQzMiwweEFEMzMsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhBRDM2LDB4QUQzNywweEFEMzksMHhBRDNBLDB4QUQzQiwweEFEM0QsMHhBRDNFLC8qIDB4NjAtMHg2NyAqLworCTB4QUQzRiwweEFENDAsMHhBRDQxLDB4QUQ0MiwweEFENDMsMHhBRDQ2LDB4QUQ0OCwweEFENEEsLyogMHg2OC0weDZGICovCisJMHhBRDRCLDB4QUQ0QywweEFENEQsMHhBRDRFLDB4QUQ0RiwweEFENTEsMHhBRDUyLDB4QUQ1MywvKiAweDcwLTB4NzcgKi8KKwkweEFENTUsMHhBRDU2LDB4QUQ1NywweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4QUQ1OSwweEFENUEsMHhBRDVCLDB4QUQ1QywweEFENUQsMHhBRDVFLDB4QUQ1RiwvKiAweDgwLTB4ODcgKi8KKwkweEFENjAsMHhBRDYyLDB4QUQ2NCwweEFENjUsMHhBRDY2LDB4QUQ2NywweEFENjgsMHhBRDY5LC8qIDB4ODgtMHg4RiAqLworCTB4QUQ2QSwweEFENkIsMHhBRDZFLDB4QUQ2RiwweEFENzEsMHhBRDcyLDB4QUQ3NywweEFENzgsLyogMHg5MC0weDk3ICovCisJMHhBRDc5LDB4QUQ3QSwweEFEN0UsMHhBRDgwLDB4QUQ4MywweEFEODQsMHhBRDg1LDB4QUQ4NiwvKiAweDk4LTB4OUYgKi8KKwkweEFEODcsMHhBRDhBLDB4QUQ4QiwweEFEOEQsMHhBRDhFLDB4QUQ4RiwweEFEOTEsMHhBRDkyLC8qIDB4QTAtMHhBNyAqLworCTB4QUQ5MywweEFEOTQsMHhBRDk1LDB4QUQ5NiwweEFEOTcsMHhBRDk4LDB4QUQ5OSwweEFEOUEsLyogMHhBOC0weEFGICovCisJMHhBRDlCLDB4QUQ5RSwweEFEOUYsMHhBREEwLDB4QURBMSwweEFEQTIsMHhBREEzLDB4QURBNSwvKiAweEIwLTB4QjcgKi8KKwkweEFEQTYsMHhBREE3LDB4QURBOCwweEFEQTksMHhBREFBLDB4QURBQiwweEFEQUMsMHhBREFELC8qIDB4QjgtMHhCRiAqLworCTB4QURBRSwweEFEQUYsMHhBREIwLDB4QURCMSwweEFEQjIsMHhBREIzLDB4QURCNCwweEFEQjUsLyogMHhDMC0weEM3ICovCisJMHhBREI2LDB4QURCOCwweEFEQjksMHhBREJBLDB4QURCQiwweEFEQkMsMHhBREJELDB4QURCRSwvKiAweEM4LTB4Q0YgKi8KKwkweEFEQkYsMHhBREMyLDB4QURDMywweEFEQzUsMHhBREM2LDB4QURDNywweEFEQzksMHhBRENBLC8qIDB4RDAtMHhENyAqLworCTB4QURDQiwweEFEQ0MsMHhBRENELDB4QURDRSwweEFEQ0YsMHhBREQyLDB4QURENCwweEFERDUsLyogMHhEOC0weERGICovCisJMHhBREQ2LDB4QURENywweEFERDgsMHhBREQ5LDB4QUREQSwweEFEREIsMHhBRERELDB4QURERSwvKiAweEUwLTB4RTcgKi8KKwkweEFEREYsMHhBREUxLDB4QURFMiwweEFERTMsMHhBREU1LDB4QURFNiwweEFERTcsMHhBREU4LC8qIDB4RTgtMHhFRiAqLworCTB4QURFOSwweEFERUEsMHhBREVCLDB4QURFQywweEFERUQsMHhBREVFLDB4QURFRiwweEFERjAsLyogMHhGMC0weEY3ICovCisJMHhBREYxLDB4QURGMiwweEFERjMsMHhBREY0LDB4QURGNSwweEFERjYsMHhBREY3LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV84M1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhBREZBLDB4QURGQiwweEFERkQsMHhBREZFLDB4QUUwMiwweEFFMDMsMHhBRTA0LC8qIDB4NDAtMHg0NyAqLworCTB4QUUwNSwweEFFMDYsMHhBRTA3LDB4QUUwQSwweEFFMEMsMHhBRTBFLDB4QUUwRiwweEFFMTAsLyogMHg0OC0weDRGICovCisJMHhBRTExLDB4QUUxMiwweEFFMTMsMHhBRTE1LDB4QUUxNiwweEFFMTcsMHhBRTE4LDB4QUUxOSwvKiAweDUwLTB4NTcgKi8KKwkweEFFMUEsMHhBRTFCLDB4QUUxQywweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEFFMUQsMHhBRTFFLDB4QUUxRiwweEFFMjAsMHhBRTIxLDB4QUUyMiwweEFFMjMsLyogMHg2MC0weDY3ICovCisJMHhBRTI0LDB4QUUyNSwweEFFMjYsMHhBRTI3LDB4QUUyOCwweEFFMjksMHhBRTJBLDB4QUUyQiwvKiAweDY4LTB4NkYgKi8KKwkweEFFMkMsMHhBRTJELDB4QUUyRSwweEFFMkYsMHhBRTMyLDB4QUUzMywweEFFMzUsMHhBRTM2LC8qIDB4NzAtMHg3NyAqLworCTB4QUUzOSwweEFFM0IsMHhBRTNDLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhBRTNELDB4QUUzRSwweEFFM0YsMHhBRTQyLDB4QUU0NCwweEFFNDcsMHhBRTQ4LC8qIDB4ODAtMHg4NyAqLworCTB4QUU0OSwweEFFNEIsMHhBRTRGLDB4QUU1MSwweEFFNTIsMHhBRTUzLDB4QUU1NSwweEFFNTcsLyogMHg4OC0weDhGICovCisJMHhBRTU4LDB4QUU1OSwweEFFNUEsMHhBRTVCLDB4QUU1RSwweEFFNjIsMHhBRTYzLDB4QUU2NCwvKiAweDkwLTB4OTcgKi8KKwkweEFFNjYsMHhBRTY3LDB4QUU2QSwweEFFNkIsMHhBRTZELDB4QUU2RSwweEFFNkYsMHhBRTcxLC8qIDB4OTgtMHg5RiAqLworCTB4QUU3MiwweEFFNzMsMHhBRTc0LDB4QUU3NSwweEFFNzYsMHhBRTc3LDB4QUU3QSwweEFFN0UsLyogMHhBMC0weEE3ICovCisJMHhBRTdGLDB4QUU4MCwweEFFODEsMHhBRTgyLDB4QUU4MywweEFFODYsMHhBRTg3LDB4QUU4OCwvKiAweEE4LTB4QUYgKi8KKwkweEFFODksMHhBRThBLDB4QUU4QiwweEFFOEQsMHhBRThFLDB4QUU4RiwweEFFOTAsMHhBRTkxLC8qIDB4QjAtMHhCNyAqLworCTB4QUU5MiwweEFFOTMsMHhBRTk0LDB4QUU5NSwweEFFOTYsMHhBRTk3LDB4QUU5OCwweEFFOTksLyogMHhCOC0weEJGICovCisJMHhBRTlBLDB4QUU5QiwweEFFOUMsMHhBRTlELDB4QUU5RSwweEFFOUYsMHhBRUEwLDB4QUVBMSwvKiAweEMwLTB4QzcgKi8KKwkweEFFQTIsMHhBRUEzLDB4QUVBNCwweEFFQTUsMHhBRUE2LDB4QUVBNywweEFFQTgsMHhBRUE5LC8qIDB4QzgtMHhDRiAqLworCTB4QUVBQSwweEFFQUIsMHhBRUFDLDB4QUVBRCwweEFFQUUsMHhBRUFGLDB4QUVCMCwweEFFQjEsLyogMHhEMC0weEQ3ICovCisJMHhBRUIyLDB4QUVCMywweEFFQjQsMHhBRUI1LDB4QUVCNiwweEFFQjcsMHhBRUI4LDB4QUVCOSwvKiAweEQ4LTB4REYgKi8KKwkweEFFQkEsMHhBRUJCLDB4QUVCRiwweEFFQzEsMHhBRUMyLDB4QUVDMywweEFFQzUsMHhBRUM2LC8qIDB4RTAtMHhFNyAqLworCTB4QUVDNywweEFFQzgsMHhBRUM5LDB4QUVDQSwweEFFQ0IsMHhBRUNFLDB4QUVEMiwweEFFRDMsLyogMHhFOC0weEVGICovCisJMHhBRUQ0LDB4QUVENSwweEFFRDYsMHhBRUQ3LDB4QUVEQSwweEFFREIsMHhBRURELDB4QUVERSwvKiAweEYwLTB4RjcgKi8KKwkweEFFREYsMHhBRUUwLDB4QUVFMSwweEFFRTIsMHhBRUUzLDB4QUVFNCwweEFFRTUsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1Xzg0WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEFFRTYsMHhBRUU3LDB4QUVFOSwweEFFRUEsMHhBRUVDLDB4QUVFRSwweEFFRUYsLyogMHg0MC0weDQ3ICovCisJMHhBRUYwLDB4QUVGMSwweEFFRjIsMHhBRUYzLDB4QUVGNSwweEFFRjYsMHhBRUY3LDB4QUVGOSwvKiAweDQ4LTB4NEYgKi8KKwkweEFFRkEsMHhBRUZCLDB4QUVGRCwweEFFRkUsMHhBRUZGLDB4QUYwMCwweEFGMDEsMHhBRjAyLC8qIDB4NTAtMHg1NyAqLworCTB4QUYwMywweEFGMDQsMHhBRjA1LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4QUYwNiwweEFGMDksMHhBRjBBLDB4QUYwQiwweEFGMEMsMHhBRjBFLDB4QUYwRiwvKiAweDYwLTB4NjcgKi8KKwkweEFGMTEsMHhBRjEyLDB4QUYxMywweEFGMTQsMHhBRjE1LDB4QUYxNiwweEFGMTcsMHhBRjE4LC8qIDB4NjgtMHg2RiAqLworCTB4QUYxOSwweEFGMUEsMHhBRjFCLDB4QUYxQywweEFGMUQsMHhBRjFFLDB4QUYxRiwweEFGMjAsLyogMHg3MC0weDc3ICovCisJMHhBRjIxLDB4QUYyMiwweEFGMjMsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEFGMjQsMHhBRjI1LDB4QUYyNiwweEFGMjcsMHhBRjI4LDB4QUYyOSwweEFGMkEsLyogMHg4MC0weDg3ICovCisJMHhBRjJCLDB4QUYyRSwweEFGMkYsMHhBRjMxLDB4QUYzMywweEFGMzUsMHhBRjM2LDB4QUYzNywvKiAweDg4LTB4OEYgKi8KKwkweEFGMzgsMHhBRjM5LDB4QUYzQSwweEFGM0IsMHhBRjNFLDB4QUY0MCwweEFGNDQsMHhBRjQ1LC8qIDB4OTAtMHg5NyAqLworCTB4QUY0NiwweEFGNDcsMHhBRjRBLDB4QUY0QiwweEFGNEMsMHhBRjRELDB4QUY0RSwweEFGNEYsLyogMHg5OC0weDlGICovCisJMHhBRjUxLDB4QUY1MiwweEFGNTMsMHhBRjU0LDB4QUY1NSwweEFGNTYsMHhBRjU3LDB4QUY1OCwvKiAweEEwLTB4QTcgKi8KKwkweEFGNTksMHhBRjVBLDB4QUY1QiwweEFGNUUsMHhBRjVGLDB4QUY2MCwweEFGNjEsMHhBRjYyLC8qIDB4QTgtMHhBRiAqLworCTB4QUY2MywweEFGNjYsMHhBRjY3LDB4QUY2OCwweEFGNjksMHhBRjZBLDB4QUY2QiwweEFGNkMsLyogMHhCMC0weEI3ICovCisJMHhBRjZELDB4QUY2RSwweEFGNkYsMHhBRjcwLDB4QUY3MSwweEFGNzIsMHhBRjczLDB4QUY3NCwvKiAweEI4LTB4QkYgKi8KKwkweEFGNzUsMHhBRjc2LDB4QUY3NywweEFGNzgsMHhBRjdBLDB4QUY3QiwweEFGN0MsMHhBRjdELC8qIDB4QzAtMHhDNyAqLworCTB4QUY3RSwweEFGN0YsMHhBRjgxLDB4QUY4MiwweEFGODMsMHhBRjg1LDB4QUY4NiwweEFGODcsLyogMHhDOC0weENGICovCisJMHhBRjg5LDB4QUY4QSwweEFGOEIsMHhBRjhDLDB4QUY4RCwweEFGOEUsMHhBRjhGLDB4QUY5MiwvKiAweEQwLTB4RDcgKi8KKwkweEFGOTMsMHhBRjk0LDB4QUY5NiwweEFGOTcsMHhBRjk4LDB4QUY5OSwweEFGOUEsMHhBRjlCLC8qIDB4RDgtMHhERiAqLworCTB4QUY5RCwweEFGOUUsMHhBRjlGLDB4QUZBMCwweEFGQTEsMHhBRkEyLDB4QUZBMywweEFGQTQsLyogMHhFMC0weEU3ICovCisJMHhBRkE1LDB4QUZBNiwweEFGQTcsMHhBRkE4LDB4QUZBOSwweEFGQUEsMHhBRkFCLDB4QUZBQywvKiAweEU4LTB4RUYgKi8KKwkweEFGQUQsMHhBRkFFLDB4QUZBRiwweEFGQjAsMHhBRkIxLDB4QUZCMiwweEFGQjMsMHhBRkI0LC8qIDB4RjAtMHhGNyAqLworCTB4QUZCNSwweEFGQjYsMHhBRkI3LDB4QUZCQSwweEFGQkIsMHhBRkJELDB4QUZCRSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfODVbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4QUZCRiwweEFGQzEsMHhBRkMyLDB4QUZDMywweEFGQzQsMHhBRkM1LDB4QUZDNiwvKiAweDQwLTB4NDcgKi8KKwkweEFGQ0EsMHhBRkNDLDB4QUZDRiwweEFGRDAsMHhBRkQxLDB4QUZEMiwweEFGRDMsMHhBRkQ1LC8qIDB4NDgtMHg0RiAqLworCTB4QUZENiwweEFGRDcsMHhBRkQ4LDB4QUZEOSwweEFGREEsMHhBRkRCLDB4QUZERCwweEFGREUsLyogMHg1MC0weDU3ICovCisJMHhBRkRGLDB4QUZFMCwweEFGRTEsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhBRkUyLDB4QUZFMywweEFGRTQsMHhBRkU1LDB4QUZFNiwweEFGRTcsMHhBRkVBLC8qIDB4NjAtMHg2NyAqLworCTB4QUZFQiwweEFGRUMsMHhBRkVELDB4QUZFRSwweEFGRUYsMHhBRkYyLDB4QUZGMywweEFGRjUsLyogMHg2OC0weDZGICovCisJMHhBRkY2LDB4QUZGNywweEFGRjksMHhBRkZBLDB4QUZGQiwweEFGRkMsMHhBRkZELDB4QUZGRSwvKiAweDcwLTB4NzcgKi8KKwkweEFGRkYsMHhCMDAyLDB4QjAwMywweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4QjAwNSwweEIwMDYsMHhCMDA3LDB4QjAwOCwweEIwMDksMHhCMDBBLDB4QjAwQiwvKiAweDgwLTB4ODcgKi8KKwkweEIwMEQsMHhCMDBFLDB4QjAwRiwweEIwMTEsMHhCMDEyLDB4QjAxMywweEIwMTUsMHhCMDE2LC8qIDB4ODgtMHg4RiAqLworCTB4QjAxNywweEIwMTgsMHhCMDE5LDB4QjAxQSwweEIwMUIsMHhCMDFFLDB4QjAxRiwweEIwMjAsLyogMHg5MC0weDk3ICovCisJMHhCMDIxLDB4QjAyMiwweEIwMjMsMHhCMDI0LDB4QjAyNSwweEIwMjYsMHhCMDI3LDB4QjAyOSwvKiAweDk4LTB4OUYgKi8KKwkweEIwMkEsMHhCMDJCLDB4QjAyQywweEIwMkQsMHhCMDJFLDB4QjAyRiwweEIwMzAsMHhCMDMxLC8qIDB4QTAtMHhBNyAqLworCTB4QjAzMiwweEIwMzMsMHhCMDM0LDB4QjAzNSwweEIwMzYsMHhCMDM3LDB4QjAzOCwweEIwMzksLyogMHhBOC0weEFGICovCisJMHhCMDNBLDB4QjAzQiwweEIwM0MsMHhCMDNELDB4QjAzRSwweEIwM0YsMHhCMDQwLDB4QjA0MSwvKiAweEIwLTB4QjcgKi8KKwkweEIwNDIsMHhCMDQzLDB4QjA0NiwweEIwNDcsMHhCMDQ5LDB4QjA0QiwweEIwNEQsMHhCMDRGLC8qIDB4QjgtMHhCRiAqLworCTB4QjA1MCwweEIwNTEsMHhCMDUyLDB4QjA1NiwweEIwNTgsMHhCMDVBLDB4QjA1QiwweEIwNUMsLyogMHhDMC0weEM3ICovCisJMHhCMDVFLDB4QjA1RiwweEIwNjAsMHhCMDYxLDB4QjA2MiwweEIwNjMsMHhCMDY0LDB4QjA2NSwvKiAweEM4LTB4Q0YgKi8KKwkweEIwNjYsMHhCMDY3LDB4QjA2OCwweEIwNjksMHhCMDZBLDB4QjA2QiwweEIwNkMsMHhCMDZELC8qIDB4RDAtMHhENyAqLworCTB4QjA2RSwweEIwNkYsMHhCMDcwLDB4QjA3MSwweEIwNzIsMHhCMDczLDB4QjA3NCwweEIwNzUsLyogMHhEOC0weERGICovCisJMHhCMDc2LDB4QjA3NywweEIwNzgsMHhCMDc5LDB4QjA3QSwweEIwN0IsMHhCMDdFLDB4QjA3RiwvKiAweEUwLTB4RTcgKi8KKwkweEIwODEsMHhCMDgyLDB4QjA4MywweEIwODUsMHhCMDg2LDB4QjA4NywweEIwODgsMHhCMDg5LC8qIDB4RTgtMHhFRiAqLworCTB4QjA4QSwweEIwOEIsMHhCMDhFLDB4QjA5MCwweEIwOTIsMHhCMDkzLDB4QjA5NCwweEIwOTUsLyogMHhGMC0weEY3ICovCisJMHhCMDk2LDB4QjA5NywweEIwOUIsMHhCMDlELDB4QjA5RSwweEIwQTMsMHhCMEE0LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV84NlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhCMEE1LDB4QjBBNiwweEIwQTcsMHhCMEFBLDB4QjBCMCwweEIwQjIsMHhCMEI2LC8qIDB4NDAtMHg0NyAqLworCTB4QjBCNywweEIwQjksMHhCMEJBLDB4QjBCQiwweEIwQkQsMHhCMEJFLDB4QjBCRiwweEIwQzAsLyogMHg0OC0weDRGICovCisJMHhCMEMxLDB4QjBDMiwweEIwQzMsMHhCMEM2LDB4QjBDQSwweEIwQ0IsMHhCMENDLDB4QjBDRCwvKiAweDUwLTB4NTcgKi8KKwkweEIwQ0UsMHhCMENGLDB4QjBEMiwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEIwRDMsMHhCMEQ1LDB4QjBENiwweEIwRDcsMHhCMEQ5LDB4QjBEQSwweEIwREIsLyogMHg2MC0weDY3ICovCisJMHhCMERDLDB4QjBERCwweEIwREUsMHhCMERGLDB4QjBFMSwweEIwRTIsMHhCMEUzLDB4QjBFNCwvKiAweDY4LTB4NkYgKi8KKwkweEIwRTYsMHhCMEU3LDB4QjBFOCwweEIwRTksMHhCMEVBLDB4QjBFQiwweEIwRUMsMHhCMEVELC8qIDB4NzAtMHg3NyAqLworCTB4QjBFRSwweEIwRUYsMHhCMEYwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhCMEYxLDB4QjBGMiwweEIwRjMsMHhCMEY0LDB4QjBGNSwweEIwRjYsMHhCMEY3LC8qIDB4ODAtMHg4NyAqLworCTB4QjBGOCwweEIwRjksMHhCMEZBLDB4QjBGQiwweEIwRkMsMHhCMEZELDB4QjBGRSwweEIwRkYsLyogMHg4OC0weDhGICovCisJMHhCMTAwLDB4QjEwMSwweEIxMDIsMHhCMTAzLDB4QjEwNCwweEIxMDUsMHhCMTA2LDB4QjEwNywvKiAweDkwLTB4OTcgKi8KKwkweEIxMEEsMHhCMTBELDB4QjEwRSwweEIxMEYsMHhCMTExLDB4QjExNCwweEIxMTUsMHhCMTE2LC8qIDB4OTgtMHg5RiAqLworCTB4QjExNywweEIxMUEsMHhCMTFFLDB4QjExRiwweEIxMjAsMHhCMTIxLDB4QjEyMiwweEIxMjYsLyogMHhBMC0weEE3ICovCisJMHhCMTI3LDB4QjEyOSwweEIxMkEsMHhCMTJCLDB4QjEyRCwweEIxMkUsMHhCMTJGLDB4QjEzMCwvKiAweEE4LTB4QUYgKi8KKwkweEIxMzEsMHhCMTMyLDB4QjEzMywweEIxMzYsMHhCMTNBLDB4QjEzQiwweEIxM0MsMHhCMTNELC8qIDB4QjAtMHhCNyAqLworCTB4QjEzRSwweEIxM0YsMHhCMTQyLDB4QjE0MywweEIxNDUsMHhCMTQ2LDB4QjE0NywweEIxNDksLyogMHhCOC0weEJGICovCisJMHhCMTRBLDB4QjE0QiwweEIxNEMsMHhCMTRELDB4QjE0RSwweEIxNEYsMHhCMTUyLDB4QjE1MywvKiAweEMwLTB4QzcgKi8KKwkweEIxNTYsMHhCMTU3LDB4QjE1OSwweEIxNUEsMHhCMTVCLDB4QjE1RCwweEIxNUUsMHhCMTVGLC8qIDB4QzgtMHhDRiAqLworCTB4QjE2MSwweEIxNjIsMHhCMTYzLDB4QjE2NCwweEIxNjUsMHhCMTY2LDB4QjE2NywweEIxNjgsLyogMHhEMC0weEQ3ICovCisJMHhCMTY5LDB4QjE2QSwweEIxNkIsMHhCMTZDLDB4QjE2RCwweEIxNkUsMHhCMTZGLDB4QjE3MCwvKiAweEQ4LTB4REYgKi8KKwkweEIxNzEsMHhCMTcyLDB4QjE3MywweEIxNzQsMHhCMTc1LDB4QjE3NiwweEIxNzcsMHhCMTdBLC8qIDB4RTAtMHhFNyAqLworCTB4QjE3QiwweEIxN0QsMHhCMTdFLDB4QjE3RiwweEIxODEsMHhCMTgzLDB4QjE4NCwweEIxODUsLyogMHhFOC0weEVGICovCisJMHhCMTg2LDB4QjE4NywweEIxOEEsMHhCMThDLDB4QjE4RSwweEIxOEYsMHhCMTkwLDB4QjE5MSwvKiAweEYwLTB4RjcgKi8KKwkweEIxOTUsMHhCMTk2LDB4QjE5NywweEIxOTksMHhCMTlBLDB4QjE5QiwweEIxOUQsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1Xzg3WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEIxOUUsMHhCMTlGLDB4QjFBMCwweEIxQTEsMHhCMUEyLDB4QjFBMywweEIxQTQsLyogMHg0MC0weDQ3ICovCisJMHhCMUE1LDB4QjFBNiwweEIxQTcsMHhCMUE5LDB4QjFBQSwweEIxQUIsMHhCMUFDLDB4QjFBRCwvKiAweDQ4LTB4NEYgKi8KKwkweEIxQUUsMHhCMUFGLDB4QjFCMCwweEIxQjEsMHhCMUIyLDB4QjFCMywweEIxQjQsMHhCMUI1LC8qIDB4NTAtMHg1NyAqLworCTB4QjFCNiwweEIxQjcsMHhCMUI4LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4QjFCOSwweEIxQkEsMHhCMUJCLDB4QjFCQywweEIxQkQsMHhCMUJFLDB4QjFCRiwvKiAweDYwLTB4NjcgKi8KKwkweEIxQzAsMHhCMUMxLDB4QjFDMiwweEIxQzMsMHhCMUM0LDB4QjFDNSwweEIxQzYsMHhCMUM3LC8qIDB4NjgtMHg2RiAqLworCTB4QjFDOCwweEIxQzksMHhCMUNBLDB4QjFDQiwweEIxQ0QsMHhCMUNFLDB4QjFDRiwweEIxRDEsLyogMHg3MC0weDc3ICovCisJMHhCMUQyLDB4QjFEMywweEIxRDUsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEIxRDYsMHhCMUQ3LDB4QjFEOCwweEIxRDksMHhCMURBLDB4QjFEQiwweEIxREUsLyogMHg4MC0weDg3ICovCisJMHhCMUUwLDB4QjFFMSwweEIxRTIsMHhCMUUzLDB4QjFFNCwweEIxRTUsMHhCMUU2LDB4QjFFNywvKiAweDg4LTB4OEYgKi8KKwkweEIxRUEsMHhCMUVCLDB4QjFFRCwweEIxRUUsMHhCMUVGLDB4QjFGMSwweEIxRjIsMHhCMUYzLC8qIDB4OTAtMHg5NyAqLworCTB4QjFGNCwweEIxRjUsMHhCMUY2LDB4QjFGNywweEIxRjgsMHhCMUZBLDB4QjFGQywweEIxRkUsLyogMHg5OC0weDlGICovCisJMHhCMUZGLDB4QjIwMCwweEIyMDEsMHhCMjAyLDB4QjIwMywweEIyMDYsMHhCMjA3LDB4QjIwOSwvKiAweEEwLTB4QTcgKi8KKwkweEIyMEEsMHhCMjBELDB4QjIwRSwweEIyMEYsMHhCMjEwLDB4QjIxMSwweEIyMTIsMHhCMjEzLC8qIDB4QTgtMHhBRiAqLworCTB4QjIxNiwweEIyMTgsMHhCMjFBLDB4QjIxQiwweEIyMUMsMHhCMjFELDB4QjIxRSwweEIyMUYsLyogMHhCMC0weEI3ICovCisJMHhCMjIxLDB4QjIyMiwweEIyMjMsMHhCMjI0LDB4QjIyNSwweEIyMjYsMHhCMjI3LDB4QjIyOCwvKiAweEI4LTB4QkYgKi8KKwkweEIyMjksMHhCMjJBLDB4QjIyQiwweEIyMkMsMHhCMjJELDB4QjIyRSwweEIyMkYsMHhCMjMwLC8qIDB4QzAtMHhDNyAqLworCTB4QjIzMSwweEIyMzIsMHhCMjMzLDB4QjIzNSwweEIyMzYsMHhCMjM3LDB4QjIzOCwweEIyMzksLyogMHhDOC0weENGICovCisJMHhCMjNBLDB4QjIzQiwweEIyM0QsMHhCMjNFLDB4QjIzRiwweEIyNDAsMHhCMjQxLDB4QjI0MiwvKiAweEQwLTB4RDcgKi8KKwkweEIyNDMsMHhCMjQ0LDB4QjI0NSwweEIyNDYsMHhCMjQ3LDB4QjI0OCwweEIyNDksMHhCMjRBLC8qIDB4RDgtMHhERiAqLworCTB4QjI0QiwweEIyNEMsMHhCMjRELDB4QjI0RSwweEIyNEYsMHhCMjUwLDB4QjI1MSwweEIyNTIsLyogMHhFMC0weEU3ICovCisJMHhCMjUzLDB4QjI1NCwweEIyNTUsMHhCMjU2LDB4QjI1NywweEIyNTksMHhCMjVBLDB4QjI1QiwvKiAweEU4LTB4RUYgKi8KKwkweEIyNUQsMHhCMjVFLDB4QjI1RiwweEIyNjEsMHhCMjYyLDB4QjI2MywweEIyNjQsMHhCMjY1LC8qIDB4RjAtMHhGNyAqLworCTB4QjI2NiwweEIyNjcsMHhCMjZBLDB4QjI2QiwweEIyNkMsMHhCMjZELDB4QjI2RSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfODhbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4QjI2RiwweEIyNzAsMHhCMjcxLDB4QjI3MiwweEIyNzMsMHhCMjc2LDB4QjI3NywvKiAweDQwLTB4NDcgKi8KKwkweEIyNzgsMHhCMjc5LDB4QjI3QSwweEIyN0IsMHhCMjdELDB4QjI3RSwweEIyN0YsMHhCMjgwLC8qIDB4NDgtMHg0RiAqLworCTB4QjI4MSwweEIyODIsMHhCMjgzLDB4QjI4NiwweEIyODcsMHhCMjg4LDB4QjI4QSwweEIyOEIsLyogMHg1MC0weDU3ICovCisJMHhCMjhDLDB4QjI4RCwweEIyOEUsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhCMjhGLDB4QjI5MiwweEIyOTMsMHhCMjk1LDB4QjI5NiwweEIyOTcsMHhCMjlCLC8qIDB4NjAtMHg2NyAqLworCTB4QjI5QywweEIyOUQsMHhCMjlFLDB4QjI5RiwweEIyQTIsMHhCMkE0LDB4QjJBNywweEIyQTgsLyogMHg2OC0weDZGICovCisJMHhCMkE5LDB4QjJBQiwweEIyQUQsMHhCMkFFLDB4QjJBRiwweEIyQjEsMHhCMkIyLDB4QjJCMywvKiAweDcwLTB4NzcgKi8KKwkweEIyQjUsMHhCMkI2LDB4QjJCNywweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4QjJCOCwweEIyQjksMHhCMkJBLDB4QjJCQiwweEIyQkMsMHhCMkJELDB4QjJCRSwvKiAweDgwLTB4ODcgKi8KKwkweEIyQkYsMHhCMkMwLDB4QjJDMSwweEIyQzIsMHhCMkMzLDB4QjJDNCwweEIyQzUsMHhCMkM2LC8qIDB4ODgtMHg4RiAqLworCTB4QjJDNywweEIyQ0EsMHhCMkNCLDB4QjJDRCwweEIyQ0UsMHhCMkNGLDB4QjJEMSwweEIyRDMsLyogMHg5MC0weDk3ICovCisJMHhCMkQ0LDB4QjJENSwweEIyRDYsMHhCMkQ3LDB4QjJEQSwweEIyREMsMHhCMkRFLDB4QjJERiwvKiAweDk4LTB4OUYgKi8KKwkweEIyRTAsMHhCMkUxLDB4QjJFMywweEIyRTcsMHhCMkU5LDB4QjJFQSwweEIyRjAsMHhCMkYxLC8qIDB4QTAtMHhBNyAqLworCTB4QjJGMiwweEIyRjYsMHhCMkZDLDB4QjJGRCwweEIyRkUsMHhCMzAyLDB4QjMwMywweEIzMDUsLyogMHhBOC0weEFGICovCisJMHhCMzA2LDB4QjMwNywweEIzMDksMHhCMzBBLDB4QjMwQiwweEIzMEMsMHhCMzBELDB4QjMwRSwvKiAweEIwLTB4QjcgKi8KKwkweEIzMEYsMHhCMzEyLDB4QjMxNiwweEIzMTcsMHhCMzE4LDB4QjMxOSwweEIzMUEsMHhCMzFCLC8qIDB4QjgtMHhCRiAqLworCTB4QjMxRCwweEIzMUUsMHhCMzFGLDB4QjMyMCwweEIzMjEsMHhCMzIyLDB4QjMyMywweEIzMjQsLyogMHhDMC0weEM3ICovCisJMHhCMzI1LDB4QjMyNiwweEIzMjcsMHhCMzI4LDB4QjMyOSwweEIzMkEsMHhCMzJCLDB4QjMyQywvKiAweEM4LTB4Q0YgKi8KKwkweEIzMkQsMHhCMzJFLDB4QjMyRiwweEIzMzAsMHhCMzMxLDB4QjMzMiwweEIzMzMsMHhCMzM0LC8qIDB4RDAtMHhENyAqLworCTB4QjMzNSwweEIzMzYsMHhCMzM3LDB4QjMzOCwweEIzMzksMHhCMzNBLDB4QjMzQiwweEIzM0MsLyogMHhEOC0weERGICovCisJMHhCMzNELDB4QjMzRSwweEIzM0YsMHhCMzQwLDB4QjM0MSwweEIzNDIsMHhCMzQzLDB4QjM0NCwvKiAweEUwLTB4RTcgKi8KKwkweEIzNDUsMHhCMzQ2LDB4QjM0NywweEIzNDgsMHhCMzQ5LDB4QjM0QSwweEIzNEIsMHhCMzRDLC8qIDB4RTgtMHhFRiAqLworCTB4QjM0RCwweEIzNEUsMHhCMzRGLDB4QjM1MCwweEIzNTEsMHhCMzUyLDB4QjM1MywweEIzNTcsLyogMHhGMC0weEY3ICovCisJMHhCMzU5LDB4QjM1QSwweEIzNUQsMHhCMzYwLDB4QjM2MSwweEIzNjIsMHhCMzYzLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV84OVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhCMzY2LDB4QjM2OCwweEIzNkEsMHhCMzZDLDB4QjM2RCwweEIzNkYsMHhCMzcyLC8qIDB4NDAtMHg0NyAqLworCTB4QjM3MywweEIzNzUsMHhCMzc2LDB4QjM3NywweEIzNzksMHhCMzdBLDB4QjM3QiwweEIzN0MsLyogMHg0OC0weDRGICovCisJMHhCMzdELDB4QjM3RSwweEIzN0YsMHhCMzgyLDB4QjM4NiwweEIzODcsMHhCMzg4LDB4QjM4OSwvKiAweDUwLTB4NTcgKi8KKwkweEIzOEEsMHhCMzhCLDB4QjM4RCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEIzOEUsMHhCMzhGLDB4QjM5MSwweEIzOTIsMHhCMzkzLDB4QjM5NSwweEIzOTYsLyogMHg2MC0weDY3ICovCisJMHhCMzk3LDB4QjM5OCwweEIzOTksMHhCMzlBLDB4QjM5QiwweEIzOUMsMHhCMzlELDB4QjM5RSwvKiAweDY4LTB4NkYgKi8KKwkweEIzOUYsMHhCM0EyLDB4QjNBMywweEIzQTQsMHhCM0E1LDB4QjNBNiwweEIzQTcsMHhCM0E5LC8qIDB4NzAtMHg3NyAqLworCTB4QjNBQSwweEIzQUIsMHhCM0FELDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhCM0FFLDB4QjNBRiwweEIzQjAsMHhCM0IxLDB4QjNCMiwweEIzQjMsMHhCM0I0LC8qIDB4ODAtMHg4NyAqLworCTB4QjNCNSwweEIzQjYsMHhCM0I3LDB4QjNCOCwweEIzQjksMHhCM0JBLDB4QjNCQiwweEIzQkMsLyogMHg4OC0weDhGICovCisJMHhCM0JELDB4QjNCRSwweEIzQkYsMHhCM0MwLDB4QjNDMSwweEIzQzIsMHhCM0MzLDB4QjNDNiwvKiAweDkwLTB4OTcgKi8KKwkweEIzQzcsMHhCM0M5LDB4QjNDQSwweEIzQ0QsMHhCM0NGLDB4QjNEMSwweEIzRDIsMHhCM0QzLC8qIDB4OTgtMHg5RiAqLworCTB4QjNENiwweEIzRDgsMHhCM0RBLDB4QjNEQywweEIzREUsMHhCM0RGLDB4QjNFMSwweEIzRTIsLyogMHhBMC0weEE3ICovCisJMHhCM0UzLDB4QjNFNSwweEIzRTYsMHhCM0U3LDB4QjNFOSwweEIzRUEsMHhCM0VCLDB4QjNFQywvKiAweEE4LTB4QUYgKi8KKwkweEIzRUQsMHhCM0VFLDB4QjNFRiwweEIzRjAsMHhCM0YxLDB4QjNGMiwweEIzRjMsMHhCM0Y0LC8qIDB4QjAtMHhCNyAqLworCTB4QjNGNSwweEIzRjYsMHhCM0Y3LDB4QjNGOCwweEIzRjksMHhCM0ZBLDB4QjNGQiwweEIzRkQsLyogMHhCOC0weEJGICovCisJMHhCM0ZFLDB4QjNGRiwweEI0MDAsMHhCNDAxLDB4QjQwMiwweEI0MDMsMHhCNDA0LDB4QjQwNSwvKiAweEMwLTB4QzcgKi8KKwkweEI0MDYsMHhCNDA3LDB4QjQwOCwweEI0MDksMHhCNDBBLDB4QjQwQiwweEI0MEMsMHhCNDBELC8qIDB4QzgtMHhDRiAqLworCTB4QjQwRSwweEI0MEYsMHhCNDExLDB4QjQxMiwweEI0MTMsMHhCNDE0LDB4QjQxNSwweEI0MTYsLyogMHhEMC0weEQ3ICovCisJMHhCNDE3LDB4QjQxOSwweEI0MUEsMHhCNDFCLDB4QjQxRCwweEI0MUUsMHhCNDFGLDB4QjQyMSwvKiAweEQ4LTB4REYgKi8KKwkweEI0MjIsMHhCNDIzLDB4QjQyNCwweEI0MjUsMHhCNDI2LDB4QjQyNywweEI0MkEsMHhCNDJDLC8qIDB4RTAtMHhFNyAqLworCTB4QjQyRCwweEI0MkUsMHhCNDJGLDB4QjQzMCwweEI0MzEsMHhCNDMyLDB4QjQzMywweEI0MzUsLyogMHhFOC0weEVGICovCisJMHhCNDM2LDB4QjQzNywweEI0MzgsMHhCNDM5LDB4QjQzQSwweEI0M0IsMHhCNDNDLDB4QjQzRCwvKiAweEYwLTB4RjcgKi8KKwkweEI0M0UsMHhCNDNGLDB4QjQ0MCwweEI0NDEsMHhCNDQyLDB4QjQ0MywweEI0NDQsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzhBWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEI0NDUsMHhCNDQ2LDB4QjQ0NywweEI0NDgsMHhCNDQ5LDB4QjQ0QSwweEI0NEIsLyogMHg0MC0weDQ3ICovCisJMHhCNDRDLDB4QjQ0RCwweEI0NEUsMHhCNDRGLDB4QjQ1MiwweEI0NTMsMHhCNDU1LDB4QjQ1NiwvKiAweDQ4LTB4NEYgKi8KKwkweEI0NTcsMHhCNDU5LDB4QjQ1QSwweEI0NUIsMHhCNDVDLDB4QjQ1RCwweEI0NUUsMHhCNDVGLC8qIDB4NTAtMHg1NyAqLworCTB4QjQ2MiwweEI0NjQsMHhCNDY2LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4QjQ2NywweEI0NjgsMHhCNDY5LDB4QjQ2QSwweEI0NkIsMHhCNDZELDB4QjQ2RSwvKiAweDYwLTB4NjcgKi8KKwkweEI0NkYsMHhCNDcwLDB4QjQ3MSwweEI0NzIsMHhCNDczLDB4QjQ3NCwweEI0NzUsMHhCNDc2LC8qIDB4NjgtMHg2RiAqLworCTB4QjQ3NywweEI0NzgsMHhCNDc5LDB4QjQ3QSwweEI0N0IsMHhCNDdDLDB4QjQ3RCwweEI0N0UsLyogMHg3MC0weDc3ICovCisJMHhCNDdGLDB4QjQ4MSwweEI0ODIsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEI0ODMsMHhCNDg0LDB4QjQ4NSwweEI0ODYsMHhCNDg3LDB4QjQ4OSwweEI0OEEsLyogMHg4MC0weDg3ICovCisJMHhCNDhCLDB4QjQ4QywweEI0OEQsMHhCNDhFLDB4QjQ4RiwweEI0OTAsMHhCNDkxLDB4QjQ5MiwvKiAweDg4LTB4OEYgKi8KKwkweEI0OTMsMHhCNDk0LDB4QjQ5NSwweEI0OTYsMHhCNDk3LDB4QjQ5OCwweEI0OTksMHhCNDlBLC8qIDB4OTAtMHg5NyAqLworCTB4QjQ5QiwweEI0OUMsMHhCNDlFLDB4QjQ5RiwweEI0QTAsMHhCNEExLDB4QjRBMiwweEI0QTMsLyogMHg5OC0weDlGICovCisJMHhCNEE1LDB4QjRBNiwweEI0QTcsMHhCNEE5LDB4QjRBQSwweEI0QUIsMHhCNEFELDB4QjRBRSwvKiAweEEwLTB4QTcgKi8KKwkweEI0QUYsMHhCNEIwLDB4QjRCMSwweEI0QjIsMHhCNEIzLDB4QjRCNCwweEI0QjYsMHhCNEI4LC8qIDB4QTgtMHhBRiAqLworCTB4QjRCQSwweEI0QkIsMHhCNEJDLDB4QjRCRCwweEI0QkUsMHhCNEJGLDB4QjRDMSwweEI0QzIsLyogMHhCMC0weEI3ICovCisJMHhCNEMzLDB4QjRDNSwweEI0QzYsMHhCNEM3LDB4QjRDOSwweEI0Q0EsMHhCNENCLDB4QjRDQywvKiAweEI4LTB4QkYgKi8KKwkweEI0Q0QsMHhCNENFLDB4QjRDRiwweEI0RDEsMHhCNEQyLDB4QjREMywweEI0RDQsMHhCNEQ2LC8qIDB4QzAtMHhDNyAqLworCTB4QjRENywweEI0RDgsMHhCNEQ5LDB4QjREQSwweEI0REIsMHhCNERFLDB4QjRERiwweEI0RTEsLyogMHhDOC0weENGICovCisJMHhCNEUyLDB4QjRFNSwweEI0RTcsMHhCNEU4LDB4QjRFOSwweEI0RUEsMHhCNEVCLDB4QjRFRSwvKiAweEQwLTB4RDcgKi8KKwkweEI0RjAsMHhCNEYyLDB4QjRGMywweEI0RjQsMHhCNEY1LDB4QjRGNiwweEI0RjcsMHhCNEY5LC8qIDB4RDgtMHhERiAqLworCTB4QjRGQSwweEI0RkIsMHhCNEZDLDB4QjRGRCwweEI0RkUsMHhCNEZGLDB4QjUwMCwweEI1MDEsLyogMHhFMC0weEU3ICovCisJMHhCNTAyLDB4QjUwMywweEI1MDQsMHhCNTA1LDB4QjUwNiwweEI1MDcsMHhCNTA4LDB4QjUwOSwvKiAweEU4LTB4RUYgKi8KKwkweEI1MEEsMHhCNTBCLDB4QjUwQywweEI1MEQsMHhCNTBFLDB4QjUwRiwweEI1MTAsMHhCNTExLC8qIDB4RjAtMHhGNyAqLworCTB4QjUxMiwweEI1MTMsMHhCNTE2LDB4QjUxNywweEI1MTksMHhCNTFBLDB4QjUxRCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOEJbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4QjUxRSwweEI1MUYsMHhCNTIwLDB4QjUyMSwweEI1MjIsMHhCNTIzLDB4QjUyNiwvKiAweDQwLTB4NDcgKi8KKwkweEI1MkIsMHhCNTJDLDB4QjUyRCwweEI1MkUsMHhCNTJGLDB4QjUzMiwweEI1MzMsMHhCNTM1LC8qIDB4NDgtMHg0RiAqLworCTB4QjUzNiwweEI1MzcsMHhCNTM5LDB4QjUzQSwweEI1M0IsMHhCNTNDLDB4QjUzRCwweEI1M0UsLyogMHg1MC0weDU3ICovCisJMHhCNTNGLDB4QjU0MiwweEI1NDYsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhCNTQ3LDB4QjU0OCwweEI1NDksMHhCNTRBLDB4QjU0RSwweEI1NEYsMHhCNTUxLC8qIDB4NjAtMHg2NyAqLworCTB4QjU1MiwweEI1NTMsMHhCNTU1LDB4QjU1NiwweEI1NTcsMHhCNTU4LDB4QjU1OSwweEI1NUEsLyogMHg2OC0weDZGICovCisJMHhCNTVCLDB4QjU1RSwweEI1NjIsMHhCNTYzLDB4QjU2NCwweEI1NjUsMHhCNTY2LDB4QjU2NywvKiAweDcwLTB4NzcgKi8KKwkweEI1NjgsMHhCNTY5LDB4QjU2QSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4QjU2QiwweEI1NkMsMHhCNTZELDB4QjU2RSwweEI1NkYsMHhCNTcwLDB4QjU3MSwvKiAweDgwLTB4ODcgKi8KKwkweEI1NzIsMHhCNTczLDB4QjU3NCwweEI1NzUsMHhCNTc2LDB4QjU3NywweEI1NzgsMHhCNTc5LC8qIDB4ODgtMHg4RiAqLworCTB4QjU3QSwweEI1N0IsMHhCNTdDLDB4QjU3RCwweEI1N0UsMHhCNTdGLDB4QjU4MCwweEI1ODEsLyogMHg5MC0weDk3ICovCisJMHhCNTgyLDB4QjU4MywweEI1ODQsMHhCNTg1LDB4QjU4NiwweEI1ODcsMHhCNTg4LDB4QjU4OSwvKiAweDk4LTB4OUYgKi8KKwkweEI1OEEsMHhCNThCLDB4QjU4QywweEI1OEQsMHhCNThFLDB4QjU4RiwweEI1OTAsMHhCNTkxLC8qIDB4QTAtMHhBNyAqLworCTB4QjU5MiwweEI1OTMsMHhCNTk0LDB4QjU5NSwweEI1OTYsMHhCNTk3LDB4QjU5OCwweEI1OTksLyogMHhBOC0weEFGICovCisJMHhCNTlBLDB4QjU5QiwweEI1OUMsMHhCNTlELDB4QjU5RSwweEI1OUYsMHhCNUEyLDB4QjVBMywvKiAweEIwLTB4QjcgKi8KKwkweEI1QTUsMHhCNUE2LDB4QjVBNywweEI1QTksMHhCNUFDLDB4QjVBRCwweEI1QUUsMHhCNUFGLC8qIDB4QjgtMHhCRiAqLworCTB4QjVCMiwweEI1QjYsMHhCNUI3LDB4QjVCOCwweEI1QjksMHhCNUJBLDB4QjVCRSwweEI1QkYsLyogMHhDMC0weEM3ICovCisJMHhCNUMxLDB4QjVDMiwweEI1QzMsMHhCNUM1LDB4QjVDNiwweEI1QzcsMHhCNUM4LDB4QjVDOSwvKiAweEM4LTB4Q0YgKi8KKwkweEI1Q0EsMHhCNUNCLDB4QjVDRSwweEI1RDIsMHhCNUQzLDB4QjVENCwweEI1RDUsMHhCNUQ2LC8qIDB4RDAtMHhENyAqLworCTB4QjVENywweEI1RDksMHhCNURBLDB4QjVEQiwweEI1REMsMHhCNURELDB4QjVERSwweEI1REYsLyogMHhEOC0weERGICovCisJMHhCNUUwLDB4QjVFMSwweEI1RTIsMHhCNUUzLDB4QjVFNCwweEI1RTUsMHhCNUU2LDB4QjVFNywvKiAweEUwLTB4RTcgKi8KKwkweEI1RTgsMHhCNUU5LDB4QjVFQSwweEI1RUIsMHhCNUVELDB4QjVFRSwweEI1RUYsMHhCNUYwLC8qIDB4RTgtMHhFRiAqLworCTB4QjVGMSwweEI1RjIsMHhCNUYzLDB4QjVGNCwweEI1RjUsMHhCNUY2LDB4QjVGNywweEI1RjgsLyogMHhGMC0weEY3ICovCisJMHhCNUY5LDB4QjVGQSwweEI1RkIsMHhCNUZDLDB4QjVGRCwweEI1RkUsMHhCNUZGLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV84Q1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhCNjAwLDB4QjYwMSwweEI2MDIsMHhCNjAzLDB4QjYwNCwweEI2MDUsMHhCNjA2LC8qIDB4NDAtMHg0NyAqLworCTB4QjYwNywweEI2MDgsMHhCNjA5LDB4QjYwQSwweEI2MEIsMHhCNjBDLDB4QjYwRCwweEI2MEUsLyogMHg0OC0weDRGICovCisJMHhCNjBGLDB4QjYxMiwweEI2MTMsMHhCNjE1LDB4QjYxNiwweEI2MTcsMHhCNjE5LDB4QjYxQSwvKiAweDUwLTB4NTcgKi8KKwkweEI2MUIsMHhCNjFDLDB4QjYxRCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEI2MUUsMHhCNjFGLDB4QjYyMCwweEI2MjEsMHhCNjIyLDB4QjYyMywweEI2MjQsLyogMHg2MC0weDY3ICovCisJMHhCNjI2LDB4QjYyNywweEI2MjgsMHhCNjI5LDB4QjYyQSwweEI2MkIsMHhCNjJELDB4QjYyRSwvKiAweDY4LTB4NkYgKi8KKwkweEI2MkYsMHhCNjMwLDB4QjYzMSwweEI2MzIsMHhCNjMzLDB4QjYzNSwweEI2MzYsMHhCNjM3LC8qIDB4NzAtMHg3NyAqLworCTB4QjYzOCwweEI2MzksMHhCNjNBLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhCNjNCLDB4QjYzQywweEI2M0QsMHhCNjNFLDB4QjYzRiwweEI2NDAsMHhCNjQxLC8qIDB4ODAtMHg4NyAqLworCTB4QjY0MiwweEI2NDMsMHhCNjQ0LDB4QjY0NSwweEI2NDYsMHhCNjQ3LDB4QjY0OSwweEI2NEEsLyogMHg4OC0weDhGICovCisJMHhCNjRCLDB4QjY0QywweEI2NEQsMHhCNjRFLDB4QjY0RiwweEI2NTAsMHhCNjUxLDB4QjY1MiwvKiAweDkwLTB4OTcgKi8KKwkweEI2NTMsMHhCNjU0LDB4QjY1NSwweEI2NTYsMHhCNjU3LDB4QjY1OCwweEI2NTksMHhCNjVBLC8qIDB4OTgtMHg5RiAqLworCTB4QjY1QiwweEI2NUMsMHhCNjVELDB4QjY1RSwweEI2NUYsMHhCNjYwLDB4QjY2MSwweEI2NjIsLyogMHhBMC0weEE3ICovCisJMHhCNjYzLDB4QjY2NSwweEI2NjYsMHhCNjY3LDB4QjY2OSwweEI2NkEsMHhCNjZCLDB4QjY2QywvKiAweEE4LTB4QUYgKi8KKwkweEI2NkQsMHhCNjZFLDB4QjY2RiwweEI2NzAsMHhCNjcxLDB4QjY3MiwweEI2NzMsMHhCNjc0LC8qIDB4QjAtMHhCNyAqLworCTB4QjY3NSwweEI2NzYsMHhCNjc3LDB4QjY3OCwweEI2NzksMHhCNjdBLDB4QjY3QiwweEI2N0MsLyogMHhCOC0weEJGICovCisJMHhCNjdELDB4QjY3RSwweEI2N0YsMHhCNjgwLDB4QjY4MSwweEI2ODIsMHhCNjgzLDB4QjY4NCwvKiAweEMwLTB4QzcgKi8KKwkweEI2ODUsMHhCNjg2LDB4QjY4NywweEI2ODgsMHhCNjg5LDB4QjY4QSwweEI2OEIsMHhCNjhDLC8qIDB4QzgtMHhDRiAqLworCTB4QjY4RCwweEI2OEUsMHhCNjhGLDB4QjY5MCwweEI2OTEsMHhCNjkyLDB4QjY5MywweEI2OTQsLyogMHhEMC0weEQ3ICovCisJMHhCNjk1LDB4QjY5NiwweEI2OTcsMHhCNjk4LDB4QjY5OSwweEI2OUEsMHhCNjlCLDB4QjY5RSwvKiAweEQ4LTB4REYgKi8KKwkweEI2OUYsMHhCNkExLDB4QjZBMiwweEI2QTMsMHhCNkE1LDB4QjZBNiwweEI2QTcsMHhCNkE4LC8qIDB4RTAtMHhFNyAqLworCTB4QjZBOSwweEI2QUEsMHhCNkFELDB4QjZBRSwweEI2QUYsMHhCNkIwLDB4QjZCMiwweEI2QjMsLyogMHhFOC0weEVGICovCisJMHhCNkI0LDB4QjZCNSwweEI2QjYsMHhCNkI3LDB4QjZCOCwweEI2QjksMHhCNkJBLDB4QjZCQiwvKiAweEYwLTB4RjcgKi8KKwkweEI2QkMsMHhCNkJELDB4QjZCRSwweEI2QkYsMHhCNkMwLDB4QjZDMSwweEI2QzIsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzhEWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEI2QzMsMHhCNkM0LDB4QjZDNSwweEI2QzYsMHhCNkM3LDB4QjZDOCwweEI2QzksLyogMHg0MC0weDQ3ICovCisJMHhCNkNBLDB4QjZDQiwweEI2Q0MsMHhCNkNELDB4QjZDRSwweEI2Q0YsMHhCNkQwLDB4QjZEMSwvKiAweDQ4LTB4NEYgKi8KKwkweEI2RDIsMHhCNkQzLDB4QjZENSwweEI2RDYsMHhCNkQ3LDB4QjZEOCwweEI2RDksMHhCNkRBLC8qIDB4NTAtMHg1NyAqLworCTB4QjZEQiwweEI2REMsMHhCNkRELDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4QjZERSwweEI2REYsMHhCNkUwLDB4QjZFMSwweEI2RTIsMHhCNkUzLDB4QjZFNCwvKiAweDYwLTB4NjcgKi8KKwkweEI2RTUsMHhCNkU2LDB4QjZFNywweEI2RTgsMHhCNkU5LDB4QjZFQSwweEI2RUIsMHhCNkVDLC8qIDB4NjgtMHg2RiAqLworCTB4QjZFRCwweEI2RUUsMHhCNkVGLDB4QjZGMSwweEI2RjIsMHhCNkYzLDB4QjZGNSwweEI2RjYsLyogMHg3MC0weDc3ICovCisJMHhCNkY3LDB4QjZGOSwweEI2RkEsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEI2RkIsMHhCNkZDLDB4QjZGRCwweEI2RkUsMHhCNkZGLDB4QjcwMiwweEI3MDMsLyogMHg4MC0weDg3ICovCisJMHhCNzA0LDB4QjcwNiwweEI3MDcsMHhCNzA4LDB4QjcwOSwweEI3MEEsMHhCNzBCLDB4QjcwQywvKiAweDg4LTB4OEYgKi8KKwkweEI3MEQsMHhCNzBFLDB4QjcwRiwweEI3MTAsMHhCNzExLDB4QjcxMiwweEI3MTMsMHhCNzE0LC8qIDB4OTAtMHg5NyAqLworCTB4QjcxNSwweEI3MTYsMHhCNzE3LDB4QjcxOCwweEI3MTksMHhCNzFBLDB4QjcxQiwweEI3MUMsLyogMHg5OC0weDlGICovCisJMHhCNzFELDB4QjcxRSwweEI3MUYsMHhCNzIwLDB4QjcyMSwweEI3MjIsMHhCNzIzLDB4QjcyNCwvKiAweEEwLTB4QTcgKi8KKwkweEI3MjUsMHhCNzI2LDB4QjcyNywweEI3MkEsMHhCNzJCLDB4QjcyRCwweEI3MkUsMHhCNzMxLC8qIDB4QTgtMHhBRiAqLworCTB4QjczMiwweEI3MzMsMHhCNzM0LDB4QjczNSwweEI3MzYsMHhCNzM3LDB4QjczQSwweEI3M0MsLyogMHhCMC0weEI3ICovCisJMHhCNzNELDB4QjczRSwweEI3M0YsMHhCNzQwLDB4Qjc0MSwweEI3NDIsMHhCNzQzLDB4Qjc0NSwvKiAweEI4LTB4QkYgKi8KKwkweEI3NDYsMHhCNzQ3LDB4Qjc0OSwweEI3NEEsMHhCNzRCLDB4Qjc0RCwweEI3NEUsMHhCNzRGLC8qIDB4QzAtMHhDNyAqLworCTB4Qjc1MCwweEI3NTEsMHhCNzUyLDB4Qjc1MywweEI3NTYsMHhCNzU3LDB4Qjc1OCwweEI3NTksLyogMHhDOC0weENGICovCisJMHhCNzVBLDB4Qjc1QiwweEI3NUMsMHhCNzVELDB4Qjc1RSwweEI3NUYsMHhCNzYxLDB4Qjc2MiwvKiAweEQwLTB4RDcgKi8KKwkweEI3NjMsMHhCNzY1LDB4Qjc2NiwweEI3NjcsMHhCNzY5LDB4Qjc2QSwweEI3NkIsMHhCNzZDLC8qIDB4RDgtMHhERiAqLworCTB4Qjc2RCwweEI3NkUsMHhCNzZGLDB4Qjc3MiwweEI3NzQsMHhCNzc2LDB4Qjc3NywweEI3NzgsLyogMHhFMC0weEU3ICovCisJMHhCNzc5LDB4Qjc3QSwweEI3N0IsMHhCNzdFLDB4Qjc3RiwweEI3ODEsMHhCNzgyLDB4Qjc4MywvKiAweEU4LTB4RUYgKi8KKwkweEI3ODUsMHhCNzg2LDB4Qjc4NywweEI3ODgsMHhCNzg5LDB4Qjc4QSwweEI3OEIsMHhCNzhFLC8qIDB4RjAtMHhGNyAqLworCTB4Qjc5MywweEI3OTQsMHhCNzk1LDB4Qjc5QSwweEI3OUIsMHhCNzlELDB4Qjc5RSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOEVbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4Qjc5RiwweEI3QTEsMHhCN0EyLDB4QjdBMywweEI3QTQsMHhCN0E1LDB4QjdBNiwvKiAweDQwLTB4NDcgKi8KKwkweEI3QTcsMHhCN0FBLDB4QjdBRSwweEI3QUYsMHhCN0IwLDB4QjdCMSwweEI3QjIsMHhCN0IzLC8qIDB4NDgtMHg0RiAqLworCTB4QjdCNiwweEI3QjcsMHhCN0I5LDB4QjdCQSwweEI3QkIsMHhCN0JDLDB4QjdCRCwweEI3QkUsLyogMHg1MC0weDU3ICovCisJMHhCN0JGLDB4QjdDMCwweEI3QzEsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhCN0MyLDB4QjdDMywweEI3QzQsMHhCN0M1LDB4QjdDNiwweEI3QzgsMHhCN0NBLC8qIDB4NjAtMHg2NyAqLworCTB4QjdDQiwweEI3Q0MsMHhCN0NELDB4QjdDRSwweEI3Q0YsMHhCN0QwLDB4QjdEMSwweEI3RDIsLyogMHg2OC0weDZGICovCisJMHhCN0QzLDB4QjdENCwweEI3RDUsMHhCN0Q2LDB4QjdENywweEI3RDgsMHhCN0Q5LDB4QjdEQSwvKiAweDcwLTB4NzcgKi8KKwkweEI3REIsMHhCN0RDLDB4QjdERCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4QjdERSwweEI3REYsMHhCN0UwLDB4QjdFMSwweEI3RTIsMHhCN0UzLDB4QjdFNCwvKiAweDgwLTB4ODcgKi8KKwkweEI3RTUsMHhCN0U2LDB4QjdFNywweEI3RTgsMHhCN0U5LDB4QjdFQSwweEI3RUIsMHhCN0VFLC8qIDB4ODgtMHg4RiAqLworCTB4QjdFRiwweEI3RjEsMHhCN0YyLDB4QjdGMywweEI3RjUsMHhCN0Y2LDB4QjdGNywweEI3RjgsLyogMHg5MC0weDk3ICovCisJMHhCN0Y5LDB4QjdGQSwweEI3RkIsMHhCN0ZFLDB4QjgwMiwweEI4MDMsMHhCODA0LDB4QjgwNSwvKiAweDk4LTB4OUYgKi8KKwkweEI4MDYsMHhCODBBLDB4QjgwQiwweEI4MEQsMHhCODBFLDB4QjgwRiwweEI4MTEsMHhCODEyLC8qIDB4QTAtMHhBNyAqLworCTB4QjgxMywweEI4MTQsMHhCODE1LDB4QjgxNiwweEI4MTcsMHhCODFBLDB4QjgxQywweEI4MUUsLyogMHhBOC0weEFGICovCisJMHhCODFGLDB4QjgyMCwweEI4MjEsMHhCODIyLDB4QjgyMywweEI4MjYsMHhCODI3LDB4QjgyOSwvKiAweEIwLTB4QjcgKi8KKwkweEI4MkEsMHhCODJCLDB4QjgyRCwweEI4MkUsMHhCODJGLDB4QjgzMCwweEI4MzEsMHhCODMyLC8qIDB4QjgtMHhCRiAqLworCTB4QjgzMywweEI4MzYsMHhCODNBLDB4QjgzQiwweEI4M0MsMHhCODNELDB4QjgzRSwweEI4M0YsLyogMHhDMC0weEM3ICovCisJMHhCODQxLDB4Qjg0MiwweEI4NDMsMHhCODQ1LDB4Qjg0NiwweEI4NDcsMHhCODQ4LDB4Qjg0OSwvKiAweEM4LTB4Q0YgKi8KKwkweEI4NEEsMHhCODRCLDB4Qjg0QywweEI4NEQsMHhCODRFLDB4Qjg0RiwweEI4NTAsMHhCODUyLC8qIDB4RDAtMHhENyAqLworCTB4Qjg1NCwweEI4NTUsMHhCODU2LDB4Qjg1NywweEI4NTgsMHhCODU5LDB4Qjg1QSwweEI4NUIsLyogMHhEOC0weERGICovCisJMHhCODVFLDB4Qjg1RiwweEI4NjEsMHhCODYyLDB4Qjg2MywweEI4NjUsMHhCODY2LDB4Qjg2NywvKiAweEUwLTB4RTcgKi8KKwkweEI4NjgsMHhCODY5LDB4Qjg2QSwweEI4NkIsMHhCODZFLDB4Qjg3MCwweEI4NzIsMHhCODczLC8qIDB4RTgtMHhFRiAqLworCTB4Qjg3NCwweEI4NzUsMHhCODc2LDB4Qjg3NywweEI4NzksMHhCODdBLDB4Qjg3QiwweEI4N0QsLyogMHhGMC0weEY3ICovCisJMHhCODdFLDB4Qjg3RiwweEI4ODAsMHhCODgxLDB4Qjg4MiwweEI4ODMsMHhCODg0LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV84RlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhCODg1LDB4Qjg4NiwweEI4ODcsMHhCODg4LDB4Qjg4OSwweEI4OEEsMHhCODhCLC8qIDB4NDAtMHg0NyAqLworCTB4Qjg4QywweEI4OEUsMHhCODhGLDB4Qjg5MCwweEI4OTEsMHhCODkyLDB4Qjg5MywweEI4OTQsLyogMHg0OC0weDRGICovCisJMHhCODk1LDB4Qjg5NiwweEI4OTcsMHhCODk4LDB4Qjg5OSwweEI4OUEsMHhCODlCLDB4Qjg5QywvKiAweDUwLTB4NTcgKi8KKwkweEI4OUQsMHhCODlFLDB4Qjg5RiwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEI4QTAsMHhCOEExLDB4QjhBMiwweEI4QTMsMHhCOEE0LDB4QjhBNSwweEI4QTYsLyogMHg2MC0weDY3ICovCisJMHhCOEE3LDB4QjhBOSwweEI4QUEsMHhCOEFCLDB4QjhBQywweEI4QUQsMHhCOEFFLDB4QjhBRiwvKiAweDY4LTB4NkYgKi8KKwkweEI4QjEsMHhCOEIyLDB4QjhCMywweEI4QjUsMHhCOEI2LDB4QjhCNywweEI4QjksMHhCOEJBLC8qIDB4NzAtMHg3NyAqLworCTB4QjhCQiwweEI4QkMsMHhCOEJELDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhCOEJFLDB4QjhCRiwweEI4QzIsMHhCOEM0LDB4QjhDNiwweEI4QzcsMHhCOEM4LC8qIDB4ODAtMHg4NyAqLworCTB4QjhDOSwweEI4Q0EsMHhCOENCLDB4QjhDRCwweEI4Q0UsMHhCOENGLDB4QjhEMSwweEI4RDIsLyogMHg4OC0weDhGICovCisJMHhCOEQzLDB4QjhENSwweEI4RDYsMHhCOEQ3LDB4QjhEOCwweEI4RDksMHhCOERBLDB4QjhEQiwvKiAweDkwLTB4OTcgKi8KKwkweEI4REMsMHhCOERFLDB4QjhFMCwweEI4RTIsMHhCOEUzLDB4QjhFNCwweEI4RTUsMHhCOEU2LC8qIDB4OTgtMHg5RiAqLworCTB4QjhFNywweEI4RUEsMHhCOEVCLDB4QjhFRCwweEI4RUUsMHhCOEVGLDB4QjhGMSwweEI4RjIsLyogMHhBMC0weEE3ICovCisJMHhCOEYzLDB4QjhGNCwweEI4RjUsMHhCOEY2LDB4QjhGNywweEI4RkEsMHhCOEZDLDB4QjhGRSwvKiAweEE4LTB4QUYgKi8KKwkweEI4RkYsMHhCOTAwLDB4QjkwMSwweEI5MDIsMHhCOTAzLDB4QjkwNSwweEI5MDYsMHhCOTA3LC8qIDB4QjAtMHhCNyAqLworCTB4QjkwOCwweEI5MDksMHhCOTBBLDB4QjkwQiwweEI5MEMsMHhCOTBELDB4QjkwRSwweEI5MEYsLyogMHhCOC0weEJGICovCisJMHhCOTEwLDB4QjkxMSwweEI5MTIsMHhCOTEzLDB4QjkxNCwweEI5MTUsMHhCOTE2LDB4QjkxNywvKiAweEMwLTB4QzcgKi8KKwkweEI5MTksMHhCOTFBLDB4QjkxQiwweEI5MUMsMHhCOTFELDB4QjkxRSwweEI5MUYsMHhCOTIxLC8qIDB4QzgtMHhDRiAqLworCTB4QjkyMiwweEI5MjMsMHhCOTI0LDB4QjkyNSwweEI5MjYsMHhCOTI3LDB4QjkyOCwweEI5MjksLyogMHhEMC0weEQ3ICovCisJMHhCOTJBLDB4QjkyQiwweEI5MkMsMHhCOTJELDB4QjkyRSwweEI5MkYsMHhCOTMwLDB4QjkzMSwvKiAweEQ4LTB4REYgKi8KKwkweEI5MzIsMHhCOTMzLDB4QjkzNCwweEI5MzUsMHhCOTM2LDB4QjkzNywweEI5MzgsMHhCOTM5LC8qIDB4RTAtMHhFNyAqLworCTB4QjkzQSwweEI5M0IsMHhCOTNFLDB4QjkzRiwweEI5NDEsMHhCOTQyLDB4Qjk0MywweEI5NDUsLyogMHhFOC0weEVGICovCisJMHhCOTQ2LDB4Qjk0NywweEI5NDgsMHhCOTQ5LDB4Qjk0QSwweEI5NEIsMHhCOTRELDB4Qjk0RSwvKiAweEYwLTB4RjcgKi8KKwkweEI5NTAsMHhCOTUyLDB4Qjk1MywweEI5NTQsMHhCOTU1LDB4Qjk1NiwweEI5NTcsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzkwWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEI5NUEsMHhCOTVCLDB4Qjk1RCwweEI5NUUsMHhCOTVGLDB4Qjk2MSwweEI5NjIsLyogMHg0MC0weDQ3ICovCisJMHhCOTYzLDB4Qjk2NCwweEI5NjUsMHhCOTY2LDB4Qjk2NywweEI5NkEsMHhCOTZDLDB4Qjk2RSwvKiAweDQ4LTB4NEYgKi8KKwkweEI5NkYsMHhCOTcwLDB4Qjk3MSwweEI5NzIsMHhCOTczLDB4Qjk3NiwweEI5NzcsMHhCOTc5LC8qIDB4NTAtMHg1NyAqLworCTB4Qjk3QSwweEI5N0IsMHhCOTdELDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4Qjk3RSwweEI5N0YsMHhCOTgwLDB4Qjk4MSwweEI5ODIsMHhCOTgzLDB4Qjk4NiwvKiAweDYwLTB4NjcgKi8KKwkweEI5ODgsMHhCOThCLDB4Qjk4QywweEI5OEYsMHhCOTkwLDB4Qjk5MSwweEI5OTIsMHhCOTkzLC8qIDB4NjgtMHg2RiAqLworCTB4Qjk5NCwweEI5OTUsMHhCOTk2LDB4Qjk5NywweEI5OTgsMHhCOTk5LDB4Qjk5QSwweEI5OUIsLyogMHg3MC0weDc3ICovCisJMHhCOTlDLDB4Qjk5RCwweEI5OUUsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEI5OUYsMHhCOUEwLDB4QjlBMSwweEI5QTIsMHhCOUEzLDB4QjlBNCwweEI5QTUsLyogMHg4MC0weDg3ICovCisJMHhCOUE2LDB4QjlBNywweEI5QTgsMHhCOUE5LDB4QjlBQSwweEI5QUIsMHhCOUFFLDB4QjlBRiwvKiAweDg4LTB4OEYgKi8KKwkweEI5QjEsMHhCOUIyLDB4QjlCMywweEI5QjUsMHhCOUI2LDB4QjlCNywweEI5QjgsMHhCOUI5LC8qIDB4OTAtMHg5NyAqLworCTB4QjlCQSwweEI5QkIsMHhCOUJFLDB4QjlDMCwweEI5QzIsMHhCOUMzLDB4QjlDNCwweEI5QzUsLyogMHg5OC0weDlGICovCisJMHhCOUM2LDB4QjlDNywweEI5Q0EsMHhCOUNCLDB4QjlDRCwweEI5RDMsMHhCOUQ0LDB4QjlENSwvKiAweEEwLTB4QTcgKi8KKwkweEI5RDYsMHhCOUQ3LDB4QjlEQSwweEI5REMsMHhCOURGLDB4QjlFMCwweEI5RTIsMHhCOUU2LC8qIDB4QTgtMHhBRiAqLworCTB4QjlFNywweEI5RTksMHhCOUVBLDB4QjlFQiwweEI5RUQsMHhCOUVFLDB4QjlFRiwweEI5RjAsLyogMHhCMC0weEI3ICovCisJMHhCOUYxLDB4QjlGMiwweEI5RjMsMHhCOUY2LDB4QjlGQiwweEI5RkMsMHhCOUZELDB4QjlGRSwvKiAweEI4LTB4QkYgKi8KKwkweEI5RkYsMHhCQTAyLDB4QkEwMywweEJBMDQsMHhCQTA1LDB4QkEwNiwweEJBMDcsMHhCQTA5LC8qIDB4QzAtMHhDNyAqLworCTB4QkEwQSwweEJBMEIsMHhCQTBDLDB4QkEwRCwweEJBMEUsMHhCQTBGLDB4QkExMCwweEJBMTEsLyogMHhDOC0weENGICovCisJMHhCQTEyLDB4QkExMywweEJBMTQsMHhCQTE2LDB4QkExNywweEJBMTgsMHhCQTE5LDB4QkExQSwvKiAweEQwLTB4RDcgKi8KKwkweEJBMUIsMHhCQTFDLDB4QkExRCwweEJBMUUsMHhCQTFGLDB4QkEyMCwweEJBMjEsMHhCQTIyLC8qIDB4RDgtMHhERiAqLworCTB4QkEyMywweEJBMjQsMHhCQTI1LDB4QkEyNiwweEJBMjcsMHhCQTI4LDB4QkEyOSwweEJBMkEsLyogMHhFMC0weEU3ICovCisJMHhCQTJCLDB4QkEyQywweEJBMkQsMHhCQTJFLDB4QkEyRiwweEJBMzAsMHhCQTMxLDB4QkEzMiwvKiAweEU4LTB4RUYgKi8KKwkweEJBMzMsMHhCQTM0LDB4QkEzNSwweEJBMzYsMHhCQTM3LDB4QkEzQSwweEJBM0IsMHhCQTNELC8qIDB4RjAtMHhGNyAqLworCTB4QkEzRSwweEJBM0YsMHhCQTQxLDB4QkE0MywweEJBNDQsMHhCQTQ1LDB4QkE0NiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOTFbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4QkE0NywweEJBNEEsMHhCQTRDLDB4QkE0RiwweEJBNTAsMHhCQTUxLDB4QkE1MiwvKiAweDQwLTB4NDcgKi8KKwkweEJBNTYsMHhCQTU3LDB4QkE1OSwweEJBNUEsMHhCQTVCLDB4QkE1RCwweEJBNUUsMHhCQTVGLC8qIDB4NDgtMHg0RiAqLworCTB4QkE2MCwweEJBNjEsMHhCQTYyLDB4QkE2MywweEJBNjYsMHhCQTZBLDB4QkE2QiwweEJBNkMsLyogMHg1MC0weDU3ICovCisJMHhCQTZELDB4QkE2RSwweEJBNkYsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhCQTcyLDB4QkE3MywweEJBNzUsMHhCQTc2LDB4QkE3NywweEJBNzksMHhCQTdBLC8qIDB4NjAtMHg2NyAqLworCTB4QkE3QiwweEJBN0MsMHhCQTdELDB4QkE3RSwweEJBN0YsMHhCQTgwLDB4QkE4MSwweEJBODIsLyogMHg2OC0weDZGICovCisJMHhCQTg2LDB4QkE4OCwweEJBODksMHhCQThBLDB4QkE4QiwweEJBOEQsMHhCQThFLDB4QkE4RiwvKiAweDcwLTB4NzcgKi8KKwkweEJBOTAsMHhCQTkxLDB4QkE5MiwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4QkE5MywweEJBOTQsMHhCQTk1LDB4QkE5NiwweEJBOTcsMHhCQTk4LDB4QkE5OSwvKiAweDgwLTB4ODcgKi8KKwkweEJBOUEsMHhCQTlCLDB4QkE5QywweEJBOUQsMHhCQTlFLDB4QkE5RiwweEJBQTAsMHhCQUExLC8qIDB4ODgtMHg4RiAqLworCTB4QkFBMiwweEJBQTMsMHhCQUE0LDB4QkFBNSwweEJBQTYsMHhCQUE3LDB4QkFBQSwweEJBQUQsLyogMHg5MC0weDk3ICovCisJMHhCQUFFLDB4QkFBRiwweEJBQjEsMHhCQUIzLDB4QkFCNCwweEJBQjUsMHhCQUI2LDB4QkFCNywvKiAweDk4LTB4OUYgKi8KKwkweEJBQkEsMHhCQUJDLDB4QkFCRSwweEJBQkYsMHhCQUMwLDB4QkFDMSwweEJBQzIsMHhCQUMzLC8qIDB4QTAtMHhBNyAqLworCTB4QkFDNSwweEJBQzYsMHhCQUM3LDB4QkFDOSwweEJBQ0EsMHhCQUNCLDB4QkFDQywweEJBQ0QsLyogMHhBOC0weEFGICovCisJMHhCQUNFLDB4QkFDRiwweEJBRDAsMHhCQUQxLDB4QkFEMiwweEJBRDMsMHhCQUQ0LDB4QkFENSwvKiAweEIwLTB4QjcgKi8KKwkweEJBRDYsMHhCQUQ3LDB4QkFEQSwweEJBREIsMHhCQURDLDB4QkFERCwweEJBREUsMHhCQURGLC8qIDB4QjgtMHhCRiAqLworCTB4QkFFMCwweEJBRTEsMHhCQUUyLDB4QkFFMywweEJBRTQsMHhCQUU1LDB4QkFFNiwweEJBRTcsLyogMHhDMC0weEM3ICovCisJMHhCQUU4LDB4QkFFOSwweEJBRUEsMHhCQUVCLDB4QkFFQywweEJBRUQsMHhCQUVFLDB4QkFFRiwvKiAweEM4LTB4Q0YgKi8KKwkweEJBRjAsMHhCQUYxLDB4QkFGMiwweEJBRjMsMHhCQUY0LDB4QkFGNSwweEJBRjYsMHhCQUY3LC8qIDB4RDAtMHhENyAqLworCTB4QkFGOCwweEJBRjksMHhCQUZBLDB4QkFGQiwweEJBRkQsMHhCQUZFLDB4QkFGRiwweEJCMDEsLyogMHhEOC0weERGICovCisJMHhCQjAyLDB4QkIwMywweEJCMDUsMHhCQjA2LDB4QkIwNywweEJCMDgsMHhCQjA5LDB4QkIwQSwvKiAweEUwLTB4RTcgKi8KKwkweEJCMEIsMHhCQjBDLDB4QkIwRSwweEJCMTAsMHhCQjEyLDB4QkIxMywweEJCMTQsMHhCQjE1LC8qIDB4RTgtMHhFRiAqLworCTB4QkIxNiwweEJCMTcsMHhCQjE5LDB4QkIxQSwweEJCMUIsMHhCQjFELDB4QkIxRSwweEJCMUYsLyogMHhGMC0weEY3ICovCisJMHhCQjIxLDB4QkIyMiwweEJCMjMsMHhCQjI0LDB4QkIyNSwweEJCMjYsMHhCQjI3LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV85MlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhCQjI4LDB4QkIyQSwweEJCMkMsMHhCQjJELDB4QkIyRSwweEJCMkYsMHhCQjMwLC8qIDB4NDAtMHg0NyAqLworCTB4QkIzMSwweEJCMzIsMHhCQjMzLDB4QkIzNywweEJCMzksMHhCQjNBLDB4QkIzRiwweEJCNDAsLyogMHg0OC0weDRGICovCisJMHhCQjQxLDB4QkI0MiwweEJCNDMsMHhCQjQ2LDB4QkI0OCwweEJCNEEsMHhCQjRCLDB4QkI0QywvKiAweDUwLTB4NTcgKi8KKwkweEJCNEUsMHhCQjUxLDB4QkI1MiwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEJCNTMsMHhCQjU1LDB4QkI1NiwweEJCNTcsMHhCQjU5LDB4QkI1QSwweEJCNUIsLyogMHg2MC0weDY3ICovCisJMHhCQjVDLDB4QkI1RCwweEJCNUUsMHhCQjVGLDB4QkI2MCwweEJCNjIsMHhCQjY0LDB4QkI2NSwvKiAweDY4LTB4NkYgKi8KKwkweEJCNjYsMHhCQjY3LDB4QkI2OCwweEJCNjksMHhCQjZBLDB4QkI2QiwweEJCNkQsMHhCQjZFLC8qIDB4NzAtMHg3NyAqLworCTB4QkI2RiwweEJCNzAsMHhCQjcxLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhCQjcyLDB4QkI3MywweEJCNzQsMHhCQjc1LDB4QkI3NiwweEJCNzcsMHhCQjc4LC8qIDB4ODAtMHg4NyAqLworCTB4QkI3OSwweEJCN0EsMHhCQjdCLDB4QkI3QywweEJCN0QsMHhCQjdFLDB4QkI3RiwweEJCODAsLyogMHg4OC0weDhGICovCisJMHhCQjgxLDB4QkI4MiwweEJCODMsMHhCQjg0LDB4QkI4NSwweEJCODYsMHhCQjg3LDB4QkI4OSwvKiAweDkwLTB4OTcgKi8KKwkweEJCOEEsMHhCQjhCLDB4QkI4RCwweEJCOEUsMHhCQjhGLDB4QkI5MSwweEJCOTIsMHhCQjkzLC8qIDB4OTgtMHg5RiAqLworCTB4QkI5NCwweEJCOTUsMHhCQjk2LDB4QkI5NywweEJCOTgsMHhCQjk5LDB4QkI5QSwweEJCOUIsLyogMHhBMC0weEE3ICovCisJMHhCQjlDLDB4QkI5RCwweEJCOUUsMHhCQjlGLDB4QkJBMCwweEJCQTEsMHhCQkEyLDB4QkJBMywvKiAweEE4LTB4QUYgKi8KKwkweEJCQTUsMHhCQkE2LDB4QkJBNywweEJCQTksMHhCQkFBLDB4QkJBQiwweEJCQUQsMHhCQkFFLC8qIDB4QjAtMHhCNyAqLworCTB4QkJBRiwweEJCQjAsMHhCQkIxLDB4QkJCMiwweEJCQjMsMHhCQkI1LDB4QkJCNiwweEJCQjgsLyogMHhCOC0weEJGICovCisJMHhCQkI5LDB4QkJCQSwweEJCQkIsMHhCQkJDLDB4QkJCRCwweEJCQkUsMHhCQkJGLDB4QkJDMSwvKiAweEMwLTB4QzcgKi8KKwkweEJCQzIsMHhCQkMzLDB4QkJDNSwweEJCQzYsMHhCQkM3LDB4QkJDOSwweEJCQ0EsMHhCQkNCLC8qIDB4QzgtMHhDRiAqLworCTB4QkJDQywweEJCQ0QsMHhCQkNFLDB4QkJDRiwweEJCRDEsMHhCQkQyLDB4QkJENCwweEJCRDUsLyogMHhEMC0weEQ3ICovCisJMHhCQkQ2LDB4QkJENywweEJCRDgsMHhCQkQ5LDB4QkJEQSwweEJCREIsMHhCQkRDLDB4QkJERCwvKiAweEQ4LTB4REYgKi8KKwkweEJCREUsMHhCQkRGLDB4QkJFMCwweEJCRTEsMHhCQkUyLDB4QkJFMywweEJCRTQsMHhCQkU1LC8qIDB4RTAtMHhFNyAqLworCTB4QkJFNiwweEJCRTcsMHhCQkU4LDB4QkJFOSwweEJCRUEsMHhCQkVCLDB4QkJFQywweEJCRUQsLyogMHhFOC0weEVGICovCisJMHhCQkVFLDB4QkJFRiwweEJCRjAsMHhCQkYxLDB4QkJGMiwweEJCRjMsMHhCQkY0LDB4QkJGNSwvKiAweEYwLTB4RjcgKi8KKwkweEJCRjYsMHhCQkY3LDB4QkJGQSwweEJCRkIsMHhCQkZELDB4QkJGRSwweEJDMDEsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzkzWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEJDMDMsMHhCQzA0LDB4QkMwNSwweEJDMDYsMHhCQzA3LDB4QkMwQSwweEJDMEUsLyogMHg0MC0weDQ3ICovCisJMHhCQzEwLDB4QkMxMiwweEJDMTMsMHhCQzE5LDB4QkMxQSwweEJDMjAsMHhCQzIxLDB4QkMyMiwvKiAweDQ4LTB4NEYgKi8KKwkweEJDMjMsMHhCQzI2LDB4QkMyOCwweEJDMkEsMHhCQzJCLDB4QkMyQywweEJDMkUsMHhCQzJGLC8qIDB4NTAtMHg1NyAqLworCTB4QkMzMiwweEJDMzMsMHhCQzM1LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4QkMzNiwweEJDMzcsMHhCQzM5LDB4QkMzQSwweEJDM0IsMHhCQzNDLDB4QkMzRCwvKiAweDYwLTB4NjcgKi8KKwkweEJDM0UsMHhCQzNGLDB4QkM0MiwweEJDNDYsMHhCQzQ3LDB4QkM0OCwweEJDNEEsMHhCQzRCLC8qIDB4NjgtMHg2RiAqLworCTB4QkM0RSwweEJDNEYsMHhCQzUxLDB4QkM1MiwweEJDNTMsMHhCQzU0LDB4QkM1NSwweEJDNTYsLyogMHg3MC0weDc3ICovCisJMHhCQzU3LDB4QkM1OCwweEJDNTksMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEJDNUEsMHhCQzVCLDB4QkM1QywweEJDNUUsMHhCQzVGLDB4QkM2MCwweEJDNjEsLyogMHg4MC0weDg3ICovCisJMHhCQzYyLDB4QkM2MywweEJDNjQsMHhCQzY1LDB4QkM2NiwweEJDNjcsMHhCQzY4LDB4QkM2OSwvKiAweDg4LTB4OEYgKi8KKwkweEJDNkEsMHhCQzZCLDB4QkM2QywweEJDNkQsMHhCQzZFLDB4QkM2RiwweEJDNzAsMHhCQzcxLC8qIDB4OTAtMHg5NyAqLworCTB4QkM3MiwweEJDNzMsMHhCQzc0LDB4QkM3NSwweEJDNzYsMHhCQzc3LDB4QkM3OCwweEJDNzksLyogMHg5OC0weDlGICovCisJMHhCQzdBLDB4QkM3QiwweEJDN0MsMHhCQzdELDB4QkM3RSwweEJDN0YsMHhCQzgwLDB4QkM4MSwvKiAweEEwLTB4QTcgKi8KKwkweEJDODIsMHhCQzgzLDB4QkM4NiwweEJDODcsMHhCQzg5LDB4QkM4QSwweEJDOEQsMHhCQzhGLC8qIDB4QTgtMHhBRiAqLworCTB4QkM5MCwweEJDOTEsMHhCQzkyLDB4QkM5MywweEJDOTYsMHhCQzk4LDB4QkM5QiwweEJDOUMsLyogMHhCMC0weEI3ICovCisJMHhCQzlELDB4QkM5RSwweEJDOUYsMHhCQ0EyLDB4QkNBMywweEJDQTUsMHhCQ0E2LDB4QkNBOSwvKiAweEI4LTB4QkYgKi8KKwkweEJDQUEsMHhCQ0FCLDB4QkNBQywweEJDQUQsMHhCQ0FFLDB4QkNBRiwweEJDQjIsMHhCQ0I2LC8qIDB4QzAtMHhDNyAqLworCTB4QkNCNywweEJDQjgsMHhCQ0I5LDB4QkNCQSwweEJDQkIsMHhCQ0JFLDB4QkNCRiwweEJDQzEsLyogMHhDOC0weENGICovCisJMHhCQ0MyLDB4QkNDMywweEJDQzUsMHhCQ0M2LDB4QkNDNywweEJDQzgsMHhCQ0M5LDB4QkNDQSwvKiAweEQwLTB4RDcgKi8KKwkweEJDQ0IsMHhCQ0NDLDB4QkNDRSwweEJDRDIsMHhCQ0QzLDB4QkNENCwweEJDRDYsMHhCQ0Q3LC8qIDB4RDgtMHhERiAqLworCTB4QkNEOSwweEJDREEsMHhCQ0RCLDB4QkNERCwweEJDREUsMHhCQ0RGLDB4QkNFMCwweEJDRTEsLyogMHhFMC0weEU3ICovCisJMHhCQ0UyLDB4QkNFMywweEJDRTQsMHhCQ0U1LDB4QkNFNiwweEJDRTcsMHhCQ0U4LDB4QkNFOSwvKiAweEU4LTB4RUYgKi8KKwkweEJDRUEsMHhCQ0VCLDB4QkNFQywweEJDRUQsMHhCQ0VFLDB4QkNFRiwweEJDRjAsMHhCQ0YxLC8qIDB4RjAtMHhGNyAqLworCTB4QkNGMiwweEJDRjMsMHhCQ0Y3LDB4QkNGOSwweEJDRkEsMHhCQ0ZCLDB4QkNGRCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOTRbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4QkNGRSwweEJDRkYsMHhCRDAwLDB4QkQwMSwweEJEMDIsMHhCRDAzLDB4QkQwNiwvKiAweDQwLTB4NDcgKi8KKwkweEJEMDgsMHhCRDBBLDB4QkQwQiwweEJEMEMsMHhCRDBELDB4QkQwRSwweEJEMEYsMHhCRDExLC8qIDB4NDgtMHg0RiAqLworCTB4QkQxMiwweEJEMTMsMHhCRDE1LDB4QkQxNiwweEJEMTcsMHhCRDE4LDB4QkQxOSwweEJEMUEsLyogMHg1MC0weDU3ICovCisJMHhCRDFCLDB4QkQxQywweEJEMUQsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhCRDFFLDB4QkQxRiwweEJEMjAsMHhCRDIxLDB4QkQyMiwweEJEMjMsMHhCRDI1LC8qIDB4NjAtMHg2NyAqLworCTB4QkQyNiwweEJEMjcsMHhCRDI4LDB4QkQyOSwweEJEMkEsMHhCRDJCLDB4QkQyRCwweEJEMkUsLyogMHg2OC0weDZGICovCisJMHhCRDJGLDB4QkQzMCwweEJEMzEsMHhCRDMyLDB4QkQzMywweEJEMzQsMHhCRDM1LDB4QkQzNiwvKiAweDcwLTB4NzcgKi8KKwkweEJEMzcsMHhCRDM4LDB4QkQzOSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4QkQzQSwweEJEM0IsMHhCRDNDLDB4QkQzRCwweEJEM0UsMHhCRDNGLDB4QkQ0MSwvKiAweDgwLTB4ODcgKi8KKwkweEJENDIsMHhCRDQzLDB4QkQ0NCwweEJENDUsMHhCRDQ2LDB4QkQ0NywweEJENEEsMHhCRDRCLC8qIDB4ODgtMHg4RiAqLworCTB4QkQ0RCwweEJENEUsMHhCRDRGLDB4QkQ1MSwweEJENTIsMHhCRDUzLDB4QkQ1NCwweEJENTUsLyogMHg5MC0weDk3ICovCisJMHhCRDU2LDB4QkQ1NywweEJENUEsMHhCRDVCLDB4QkQ1QywweEJENUQsMHhCRDVFLDB4QkQ1RiwvKiAweDk4LTB4OUYgKi8KKwkweEJENjAsMHhCRDYxLDB4QkQ2MiwweEJENjMsMHhCRDY1LDB4QkQ2NiwweEJENjcsMHhCRDY5LC8qIDB4QTAtMHhBNyAqLworCTB4QkQ2QSwweEJENkIsMHhCRDZDLDB4QkQ2RCwweEJENkUsMHhCRDZGLDB4QkQ3MCwweEJENzEsLyogMHhBOC0weEFGICovCisJMHhCRDcyLDB4QkQ3MywweEJENzQsMHhCRDc1LDB4QkQ3NiwweEJENzcsMHhCRDc4LDB4QkQ3OSwvKiAweEIwLTB4QjcgKi8KKwkweEJEN0EsMHhCRDdCLDB4QkQ3QywweEJEN0QsMHhCRDdFLDB4QkQ3RiwweEJEODIsMHhCRDgzLC8qIDB4QjgtMHhCRiAqLworCTB4QkQ4NSwweEJEODYsMHhCRDhCLDB4QkQ4QywweEJEOEQsMHhCRDhFLDB4QkQ4RiwweEJEOTIsLyogMHhDMC0weEM3ICovCisJMHhCRDk0LDB4QkQ5NiwweEJEOTcsMHhCRDk4LDB4QkQ5QiwweEJEOUQsMHhCRDlFLDB4QkQ5RiwvKiAweEM4LTB4Q0YgKi8KKwkweEJEQTAsMHhCREExLDB4QkRBMiwweEJEQTMsMHhCREE1LDB4QkRBNiwweEJEQTcsMHhCREE4LC8qIDB4RDAtMHhENyAqLworCTB4QkRBOSwweEJEQUEsMHhCREFCLDB4QkRBQywweEJEQUQsMHhCREFFLDB4QkRBRiwweEJEQjEsLyogMHhEOC0weERGICovCisJMHhCREIyLDB4QkRCMywweEJEQjQsMHhCREI1LDB4QkRCNiwweEJEQjcsMHhCREI5LDB4QkRCQSwvKiAweEUwLTB4RTcgKi8KKwkweEJEQkIsMHhCREJDLDB4QkRCRCwweEJEQkUsMHhCREJGLDB4QkRDMCwweEJEQzEsMHhCREMyLC8qIDB4RTgtMHhFRiAqLworCTB4QkRDMywweEJEQzQsMHhCREM1LDB4QkRDNiwweEJEQzcsMHhCREM4LDB4QkRDOSwweEJEQ0EsLyogMHhGMC0weEY3ICovCisJMHhCRENCLDB4QkRDQywweEJEQ0QsMHhCRENFLDB4QkRDRiwweEJERDAsMHhCREQxLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV85NVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhCREQyLDB4QkREMywweEJERDYsMHhCREQ3LDB4QkREOSwweEJEREEsMHhCRERCLC8qIDB4NDAtMHg0NyAqLworCTB4QkRERCwweEJEREUsMHhCRERGLDB4QkRFMCwweEJERTEsMHhCREUyLDB4QkRFMywweEJERTQsLyogMHg0OC0weDRGICovCisJMHhCREU1LDB4QkRFNiwweEJERTcsMHhCREU4LDB4QkRFQSwweEJERUIsMHhCREVDLDB4QkRFRCwvKiAweDUwLTB4NTcgKi8KKwkweEJERUUsMHhCREVGLDB4QkRGMSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEJERjIsMHhCREYzLDB4QkRGNSwweEJERjYsMHhCREY3LDB4QkRGOSwweEJERkEsLyogMHg2MC0weDY3ICovCisJMHhCREZCLDB4QkRGQywweEJERkQsMHhCREZFLDB4QkRGRiwweEJFMDEsMHhCRTAyLDB4QkUwNCwvKiAweDY4LTB4NkYgKi8KKwkweEJFMDYsMHhCRTA3LDB4QkUwOCwweEJFMDksMHhCRTBBLDB4QkUwQiwweEJFMEUsMHhCRTBGLC8qIDB4NzAtMHg3NyAqLworCTB4QkUxMSwweEJFMTIsMHhCRTEzLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhCRTE1LDB4QkUxNiwweEJFMTcsMHhCRTE4LDB4QkUxOSwweEJFMUEsMHhCRTFCLC8qIDB4ODAtMHg4NyAqLworCTB4QkUxRSwweEJFMjAsMHhCRTIxLDB4QkUyMiwweEJFMjMsMHhCRTI0LDB4QkUyNSwweEJFMjYsLyogMHg4OC0weDhGICovCisJMHhCRTI3LDB4QkUyOCwweEJFMjksMHhCRTJBLDB4QkUyQiwweEJFMkMsMHhCRTJELDB4QkUyRSwvKiAweDkwLTB4OTcgKi8KKwkweEJFMkYsMHhCRTMwLDB4QkUzMSwweEJFMzIsMHhCRTMzLDB4QkUzNCwweEJFMzUsMHhCRTM2LC8qIDB4OTgtMHg5RiAqLworCTB4QkUzNywweEJFMzgsMHhCRTM5LDB4QkUzQSwweEJFM0IsMHhCRTNDLDB4QkUzRCwweEJFM0UsLyogMHhBMC0weEE3ICovCisJMHhCRTNGLDB4QkU0MCwweEJFNDEsMHhCRTQyLDB4QkU0MywweEJFNDYsMHhCRTQ3LDB4QkU0OSwvKiAweEE4LTB4QUYgKi8KKwkweEJFNEEsMHhCRTRCLDB4QkU0RCwweEJFNEYsMHhCRTUwLDB4QkU1MSwweEJFNTIsMHhCRTUzLC8qIDB4QjAtMHhCNyAqLworCTB4QkU1NiwweEJFNTgsMHhCRTVDLDB4QkU1RCwweEJFNUUsMHhCRTVGLDB4QkU2MiwweEJFNjMsLyogMHhCOC0weEJGICovCisJMHhCRTY1LDB4QkU2NiwweEJFNjcsMHhCRTY5LDB4QkU2QiwweEJFNkMsMHhCRTZELDB4QkU2RSwvKiAweEMwLTB4QzcgKi8KKwkweEJFNkYsMHhCRTcyLDB4QkU3NiwweEJFNzcsMHhCRTc4LDB4QkU3OSwweEJFN0EsMHhCRTdFLC8qIDB4QzgtMHhDRiAqLworCTB4QkU3RiwweEJFODEsMHhCRTgyLDB4QkU4MywweEJFODUsMHhCRTg2LDB4QkU4NywweEJFODgsLyogMHhEMC0weEQ3ICovCisJMHhCRTg5LDB4QkU4QSwweEJFOEIsMHhCRThFLDB4QkU5MiwweEJFOTMsMHhCRTk0LDB4QkU5NSwvKiAweEQ4LTB4REYgKi8KKwkweEJFOTYsMHhCRTk3LDB4QkU5QSwweEJFOUIsMHhCRTlDLDB4QkU5RCwweEJFOUUsMHhCRTlGLC8qIDB4RTAtMHhFNyAqLworCTB4QkVBMCwweEJFQTEsMHhCRUEyLDB4QkVBMywweEJFQTQsMHhCRUE1LDB4QkVBNiwweEJFQTcsLyogMHhFOC0weEVGICovCisJMHhCRUE5LDB4QkVBQSwweEJFQUIsMHhCRUFDLDB4QkVBRCwweEJFQUUsMHhCRUFGLDB4QkVCMCwvKiAweEYwLTB4RjcgKi8KKwkweEJFQjEsMHhCRUIyLDB4QkVCMywweEJFQjQsMHhCRUI1LDB4QkVCNiwweEJFQjcsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1Xzk2WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEJFQjgsMHhCRUI5LDB4QkVCQSwweEJFQkIsMHhCRUJDLDB4QkVCRCwweEJFQkUsLyogMHg0MC0weDQ3ICovCisJMHhCRUJGLDB4QkVDMCwweEJFQzEsMHhCRUMyLDB4QkVDMywweEJFQzQsMHhCRUM1LDB4QkVDNiwvKiAweDQ4LTB4NEYgKi8KKwkweEJFQzcsMHhCRUM4LDB4QkVDOSwweEJFQ0EsMHhCRUNCLDB4QkVDQywweEJFQ0QsMHhCRUNFLC8qIDB4NTAtMHg1NyAqLworCTB4QkVDRiwweEJFRDIsMHhCRUQzLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4QkVENSwweEJFRDYsMHhCRUQ5LDB4QkVEQSwweEJFREIsMHhCRURDLDB4QkVERCwvKiAweDYwLTB4NjcgKi8KKwkweEJFREUsMHhCRURGLDB4QkVFMSwweEJFRTIsMHhCRUU2LDB4QkVFNywweEJFRTgsMHhCRUU5LC8qIDB4NjgtMHg2RiAqLworCTB4QkVFQSwweEJFRUIsMHhCRUVELDB4QkVFRSwweEJFRUYsMHhCRUYwLDB4QkVGMSwweEJFRjIsLyogMHg3MC0weDc3ICovCisJMHhCRUYzLDB4QkVGNCwweEJFRjUsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEJFRjYsMHhCRUY3LDB4QkVGOCwweEJFRjksMHhCRUZBLDB4QkVGQiwweEJFRkMsLyogMHg4MC0weDg3ICovCisJMHhCRUZELDB4QkVGRSwweEJFRkYsMHhCRjAwLDB4QkYwMiwweEJGMDMsMHhCRjA0LDB4QkYwNSwvKiAweDg4LTB4OEYgKi8KKwkweEJGMDYsMHhCRjA3LDB4QkYwQSwweEJGMEIsMHhCRjBDLDB4QkYwRCwweEJGMEUsMHhCRjBGLC8qIDB4OTAtMHg5NyAqLworCTB4QkYxMCwweEJGMTEsMHhCRjEyLDB4QkYxMywweEJGMTQsMHhCRjE1LDB4QkYxNiwweEJGMTcsLyogMHg5OC0weDlGICovCisJMHhCRjFBLDB4QkYxRSwweEJGMUYsMHhCRjIwLDB4QkYyMSwweEJGMjIsMHhCRjIzLDB4QkYyNCwvKiAweEEwLTB4QTcgKi8KKwkweEJGMjUsMHhCRjI2LDB4QkYyNywweEJGMjgsMHhCRjI5LDB4QkYyQSwweEJGMkIsMHhCRjJDLC8qIDB4QTgtMHhBRiAqLworCTB4QkYyRCwweEJGMkUsMHhCRjJGLDB4QkYzMCwweEJGMzEsMHhCRjMyLDB4QkYzMywweEJGMzQsLyogMHhCMC0weEI3ICovCisJMHhCRjM1LDB4QkYzNiwweEJGMzcsMHhCRjM4LDB4QkYzOSwweEJGM0EsMHhCRjNCLDB4QkYzQywvKiAweEI4LTB4QkYgKi8KKwkweEJGM0QsMHhCRjNFLDB4QkYzRiwweEJGNDIsMHhCRjQzLDB4QkY0NSwweEJGNDYsMHhCRjQ3LC8qIDB4QzAtMHhDNyAqLworCTB4QkY0OSwweEJGNEEsMHhCRjRCLDB4QkY0QywweEJGNEQsMHhCRjRFLDB4QkY0RiwweEJGNTIsLyogMHhDOC0weENGICovCisJMHhCRjUzLDB4QkY1NCwweEJGNTYsMHhCRjU3LDB4QkY1OCwweEJGNTksMHhCRjVBLDB4QkY1QiwvKiAweEQwLTB4RDcgKi8KKwkweEJGNUMsMHhCRjVELDB4QkY1RSwweEJGNUYsMHhCRjYwLDB4QkY2MSwweEJGNjIsMHhCRjYzLC8qIDB4RDgtMHhERiAqLworCTB4QkY2NCwweEJGNjUsMHhCRjY2LDB4QkY2NywweEJGNjgsMHhCRjY5LDB4QkY2QSwweEJGNkIsLyogMHhFMC0weEU3ICovCisJMHhCRjZDLDB4QkY2RCwweEJGNkUsMHhCRjZGLDB4QkY3MCwweEJGNzEsMHhCRjcyLDB4QkY3MywvKiAweEU4LTB4RUYgKi8KKwkweEJGNzQsMHhCRjc1LDB4QkY3NiwweEJGNzcsMHhCRjc4LDB4QkY3OSwweEJGN0EsMHhCRjdCLC8qIDB4RjAtMHhGNyAqLworCTB4QkY3QywweEJGN0QsMHhCRjdFLDB4QkY3RiwweEJGODAsMHhCRjgxLDB4QkY4MiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOTdbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4QkY4MywweEJGODQsMHhCRjg1LDB4QkY4NiwweEJGODcsMHhCRjg4LDB4QkY4OSwvKiAweDQwLTB4NDcgKi8KKwkweEJGOEEsMHhCRjhCLDB4QkY4QywweEJGOEQsMHhCRjhFLDB4QkY4RiwweEJGOTAsMHhCRjkxLC8qIDB4NDgtMHg0RiAqLworCTB4QkY5MiwweEJGOTMsMHhCRjk1LDB4QkY5NiwweEJGOTcsMHhCRjk4LDB4QkY5OSwweEJGOUEsLyogMHg1MC0weDU3ICovCisJMHhCRjlCLDB4QkY5QywweEJGOUQsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhCRjlFLDB4QkY5RiwweEJGQTAsMHhCRkExLDB4QkZBMiwweEJGQTMsMHhCRkE0LC8qIDB4NjAtMHg2NyAqLworCTB4QkZBNSwweEJGQTYsMHhCRkE3LDB4QkZBOCwweEJGQTksMHhCRkFBLDB4QkZBQiwweEJGQUMsLyogMHg2OC0weDZGICovCisJMHhCRkFELDB4QkZBRSwweEJGQUYsMHhCRkIxLDB4QkZCMiwweEJGQjMsMHhCRkI0LDB4QkZCNSwvKiAweDcwLTB4NzcgKi8KKwkweEJGQjYsMHhCRkI3LDB4QkZCOCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4QkZCOSwweEJGQkEsMHhCRkJCLDB4QkZCQywweEJGQkQsMHhCRkJFLDB4QkZCRiwvKiAweDgwLTB4ODcgKi8KKwkweEJGQzAsMHhCRkMxLDB4QkZDMiwweEJGQzMsMHhCRkM0LDB4QkZDNiwweEJGQzcsMHhCRkM4LC8qIDB4ODgtMHg4RiAqLworCTB4QkZDOSwweEJGQ0EsMHhCRkNCLDB4QkZDRSwweEJGQ0YsMHhCRkQxLDB4QkZEMiwweEJGRDMsLyogMHg5MC0weDk3ICovCisJMHhCRkQ1LDB4QkZENiwweEJGRDcsMHhCRkQ4LDB4QkZEOSwweEJGREEsMHhCRkRCLDB4QkZERCwvKiAweDk4LTB4OUYgKi8KKwkweEJGREUsMHhCRkUwLDB4QkZFMiwweEJGRTMsMHhCRkU0LDB4QkZFNSwweEJGRTYsMHhCRkU3LC8qIDB4QTAtMHhBNyAqLworCTB4QkZFOCwweEJGRTksMHhCRkVBLDB4QkZFQiwweEJGRUMsMHhCRkVELDB4QkZFRSwweEJGRUYsLyogMHhBOC0weEFGICovCisJMHhCRkYwLDB4QkZGMSwweEJGRjIsMHhCRkYzLDB4QkZGNCwweEJGRjUsMHhCRkY2LDB4QkZGNywvKiAweEIwLTB4QjcgKi8KKwkweEJGRjgsMHhCRkY5LDB4QkZGQSwweEJGRkIsMHhCRkZDLDB4QkZGRCwweEJGRkUsMHhCRkZGLC8qIDB4QjgtMHhCRiAqLworCTB4QzAwMCwweEMwMDEsMHhDMDAyLDB4QzAwMywweEMwMDQsMHhDMDA1LDB4QzAwNiwweEMwMDcsLyogMHhDMC0weEM3ICovCisJMHhDMDA4LDB4QzAwOSwweEMwMEEsMHhDMDBCLDB4QzAwQywweEMwMEQsMHhDMDBFLDB4QzAwRiwvKiAweEM4LTB4Q0YgKi8KKwkweEMwMTAsMHhDMDExLDB4QzAxMiwweEMwMTMsMHhDMDE0LDB4QzAxNSwweEMwMTYsMHhDMDE3LC8qIDB4RDAtMHhENyAqLworCTB4QzAxOCwweEMwMTksMHhDMDFBLDB4QzAxQiwweEMwMUMsMHhDMDFELDB4QzAxRSwweEMwMUYsLyogMHhEOC0weERGICovCisJMHhDMDIwLDB4QzAyMSwweEMwMjIsMHhDMDIzLDB4QzAyNCwweEMwMjUsMHhDMDI2LDB4QzAyNywvKiAweEUwLTB4RTcgKi8KKwkweEMwMjgsMHhDMDI5LDB4QzAyQSwweEMwMkIsMHhDMDJDLDB4QzAyRCwweEMwMkUsMHhDMDJGLC8qIDB4RTgtMHhFRiAqLworCTB4QzAzMCwweEMwMzEsMHhDMDMyLDB4QzAzMywweEMwMzQsMHhDMDM1LDB4QzAzNiwweEMwMzcsLyogMHhGMC0weEY3ICovCisJMHhDMDM4LDB4QzAzOSwweEMwM0EsMHhDMDNCLDB4QzAzRCwweEMwM0UsMHhDMDNGLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV85OFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhDMDQwLDB4QzA0MSwweEMwNDIsMHhDMDQzLDB4QzA0NCwweEMwNDUsMHhDMDQ2LC8qIDB4NDAtMHg0NyAqLworCTB4QzA0NywweEMwNDgsMHhDMDQ5LDB4QzA0QSwweEMwNEIsMHhDMDRDLDB4QzA0RCwweEMwNEUsLyogMHg0OC0weDRGICovCisJMHhDMDRGLDB4QzA1MCwweEMwNTIsMHhDMDUzLDB4QzA1NCwweEMwNTUsMHhDMDU2LDB4QzA1NywvKiAweDUwLTB4NTcgKi8KKwkweEMwNTksMHhDMDVBLDB4QzA1QiwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEMwNUQsMHhDMDVFLDB4QzA1RiwweEMwNjEsMHhDMDYyLDB4QzA2MywweEMwNjQsLyogMHg2MC0weDY3ICovCisJMHhDMDY1LDB4QzA2NiwweEMwNjcsMHhDMDZBLDB4QzA2QiwweEMwNkMsMHhDMDZELDB4QzA2RSwvKiAweDY4LTB4NkYgKi8KKwkweEMwNkYsMHhDMDcwLDB4QzA3MSwweEMwNzIsMHhDMDczLDB4QzA3NCwweEMwNzUsMHhDMDc2LC8qIDB4NzAtMHg3NyAqLworCTB4QzA3NywweEMwNzgsMHhDMDc5LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhDMDdBLDB4QzA3QiwweEMwN0MsMHhDMDdELDB4QzA3RSwweEMwN0YsMHhDMDgwLC8qIDB4ODAtMHg4NyAqLworCTB4QzA4MSwweEMwODIsMHhDMDgzLDB4QzA4NCwweEMwODUsMHhDMDg2LDB4QzA4NywweEMwODgsLyogMHg4OC0weDhGICovCisJMHhDMDg5LDB4QzA4QSwweEMwOEIsMHhDMDhDLDB4QzA4RCwweEMwOEUsMHhDMDhGLDB4QzA5MiwvKiAweDkwLTB4OTcgKi8KKwkweEMwOTMsMHhDMDk1LDB4QzA5NiwweEMwOTcsMHhDMDk5LDB4QzA5QSwweEMwOUIsMHhDMDlDLC8qIDB4OTgtMHg5RiAqLworCTB4QzA5RCwweEMwOUUsMHhDMDlGLDB4QzBBMiwweEMwQTQsMHhDMEE2LDB4QzBBNywweEMwQTgsLyogMHhBMC0weEE3ICovCisJMHhDMEE5LDB4QzBBQSwweEMwQUIsMHhDMEFFLDB4QzBCMSwweEMwQjIsMHhDMEI3LDB4QzBCOCwvKiAweEE4LTB4QUYgKi8KKwkweEMwQjksMHhDMEJBLDB4QzBCQiwweEMwQkUsMHhDMEMyLDB4QzBDMywweEMwQzQsMHhDMEM2LC8qIDB4QjAtMHhCNyAqLworCTB4QzBDNywweEMwQ0EsMHhDMENCLDB4QzBDRCwweEMwQ0UsMHhDMENGLDB4QzBEMSwweEMwRDIsLyogMHhCOC0weEJGICovCisJMHhDMEQzLDB4QzBENCwweEMwRDUsMHhDMEQ2LDB4QzBENywweEMwREEsMHhDMERFLDB4QzBERiwvKiAweEMwLTB4QzcgKi8KKwkweEMwRTAsMHhDMEUxLDB4QzBFMiwweEMwRTMsMHhDMEU2LDB4QzBFNywweEMwRTksMHhDMEVBLC8qIDB4QzgtMHhDRiAqLworCTB4QzBFQiwweEMwRUQsMHhDMEVFLDB4QzBFRiwweEMwRjAsMHhDMEYxLDB4QzBGMiwweEMwRjMsLyogMHhEMC0weEQ3ICovCisJMHhDMEY2LDB4QzBGOCwweEMwRkEsMHhDMEZCLDB4QzBGQywweEMwRkQsMHhDMEZFLDB4QzBGRiwvKiAweEQ4LTB4REYgKi8KKwkweEMxMDEsMHhDMTAyLDB4QzEwMywweEMxMDUsMHhDMTA2LDB4QzEwNywweEMxMDksMHhDMTBBLC8qIDB4RTAtMHhFNyAqLworCTB4QzEwQiwweEMxMEMsMHhDMTBELDB4QzEwRSwweEMxMEYsMHhDMTExLDB4QzExMiwweEMxMTMsLyogMHhFOC0weEVGICovCisJMHhDMTE0LDB4QzExNiwweEMxMTcsMHhDMTE4LDB4QzExOSwweEMxMUEsMHhDMTFCLDB4QzEyMSwvKiAweEYwLTB4RjcgKi8KKwkweEMxMjIsMHhDMTI1LDB4QzEyOCwweEMxMjksMHhDMTJBLDB4QzEyQiwweEMxMkUsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1Xzk5WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEMxMzIsMHhDMTMzLDB4QzEzNCwweEMxMzUsMHhDMTM3LDB4QzEzQSwweEMxM0IsLyogMHg0MC0weDQ3ICovCisJMHhDMTNELDB4QzEzRSwweEMxM0YsMHhDMTQxLDB4QzE0MiwweEMxNDMsMHhDMTQ0LDB4QzE0NSwvKiAweDQ4LTB4NEYgKi8KKwkweEMxNDYsMHhDMTQ3LDB4QzE0QSwweEMxNEUsMHhDMTRGLDB4QzE1MCwweEMxNTEsMHhDMTUyLC8qIDB4NTAtMHg1NyAqLworCTB4QzE1MywweEMxNTYsMHhDMTU3LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4QzE1OSwweEMxNUEsMHhDMTVCLDB4QzE1RCwweEMxNUUsMHhDMTVGLDB4QzE2MCwvKiAweDYwLTB4NjcgKi8KKwkweEMxNjEsMHhDMTYyLDB4QzE2MywweEMxNjYsMHhDMTZBLDB4QzE2QiwweEMxNkMsMHhDMTZELC8qIDB4NjgtMHg2RiAqLworCTB4QzE2RSwweEMxNkYsMHhDMTcxLDB4QzE3MiwweEMxNzMsMHhDMTc1LDB4QzE3NiwweEMxNzcsLyogMHg3MC0weDc3ICovCisJMHhDMTc5LDB4QzE3QSwweEMxN0IsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEMxN0MsMHhDMTdELDB4QzE3RSwweEMxN0YsMHhDMTgwLDB4QzE4MSwweEMxODIsLyogMHg4MC0weDg3ICovCisJMHhDMTgzLDB4QzE4NCwweEMxODYsMHhDMTg3LDB4QzE4OCwweEMxODksMHhDMThBLDB4QzE4QiwvKiAweDg4LTB4OEYgKi8KKwkweEMxOEYsMHhDMTkxLDB4QzE5MiwweEMxOTMsMHhDMTk1LDB4QzE5NywweEMxOTgsMHhDMTk5LC8qIDB4OTAtMHg5NyAqLworCTB4QzE5QSwweEMxOUIsMHhDMTlFLDB4QzFBMCwweEMxQTIsMHhDMUEzLDB4QzFBNCwweEMxQTYsLyogMHg5OC0weDlGICovCisJMHhDMUE3LDB4QzFBQSwweEMxQUIsMHhDMUFELDB4QzFBRSwweEMxQUYsMHhDMUIxLDB4QzFCMiwvKiAweEEwLTB4QTcgKi8KKwkweEMxQjMsMHhDMUI0LDB4QzFCNSwweEMxQjYsMHhDMUI3LDB4QzFCOCwweEMxQjksMHhDMUJBLC8qIDB4QTgtMHhBRiAqLworCTB4QzFCQiwweEMxQkMsMHhDMUJFLDB4QzFCRiwweEMxQzAsMHhDMUMxLDB4QzFDMiwweEMxQzMsLyogMHhCMC0weEI3ICovCisJMHhDMUM1LDB4QzFDNiwweEMxQzcsMHhDMUM5LDB4QzFDQSwweEMxQ0IsMHhDMUNELDB4QzFDRSwvKiAweEI4LTB4QkYgKi8KKwkweEMxQ0YsMHhDMUQwLDB4QzFEMSwweEMxRDIsMHhDMUQzLDB4QzFENSwweEMxRDYsMHhDMUQ5LC8qIDB4QzAtMHhDNyAqLworCTB4QzFEQSwweEMxREIsMHhDMURDLDB4QzFERCwweEMxREUsMHhDMURGLDB4QzFFMSwweEMxRTIsLyogMHhDOC0weENGICovCisJMHhDMUUzLDB4QzFFNSwweEMxRTYsMHhDMUU3LDB4QzFFOSwweEMxRUEsMHhDMUVCLDB4QzFFQywvKiAweEQwLTB4RDcgKi8KKwkweEMxRUQsMHhDMUVFLDB4QzFFRiwweEMxRjIsMHhDMUY0LDB4QzFGNSwweEMxRjYsMHhDMUY3LC8qIDB4RDgtMHhERiAqLworCTB4QzFGOCwweEMxRjksMHhDMUZBLDB4QzFGQiwweEMxRkUsMHhDMUZGLDB4QzIwMSwweEMyMDIsLyogMHhFMC0weEU3ICovCisJMHhDMjAzLDB4QzIwNSwweEMyMDYsMHhDMjA3LDB4QzIwOCwweEMyMDksMHhDMjBBLDB4QzIwQiwvKiAweEU4LTB4RUYgKi8KKwkweEMyMEUsMHhDMjEwLDB4QzIxMiwweEMyMTMsMHhDMjE0LDB4QzIxNSwweEMyMTYsMHhDMjE3LC8qIDB4RjAtMHhGNyAqLworCTB4QzIxQSwweEMyMUIsMHhDMjFELDB4QzIxRSwweEMyMjEsMHhDMjIyLDB4QzIyMywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOUFbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4QzIyNCwweEMyMjUsMHhDMjI2LDB4QzIyNywweEMyMkEsMHhDMjJDLDB4QzIyRSwvKiAweDQwLTB4NDcgKi8KKwkweEMyMzAsMHhDMjMzLDB4QzIzNSwweEMyMzYsMHhDMjM3LDB4QzIzOCwweEMyMzksMHhDMjNBLC8qIDB4NDgtMHg0RiAqLworCTB4QzIzQiwweEMyM0MsMHhDMjNELDB4QzIzRSwweEMyM0YsMHhDMjQwLDB4QzI0MSwweEMyNDIsLyogMHg1MC0weDU3ICovCisJMHhDMjQzLDB4QzI0NCwweEMyNDUsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhDMjQ2LDB4QzI0NywweEMyNDksMHhDMjRBLDB4QzI0QiwweEMyNEMsMHhDMjRELC8qIDB4NjAtMHg2NyAqLworCTB4QzI0RSwweEMyNEYsMHhDMjUyLDB4QzI1MywweEMyNTUsMHhDMjU2LDB4QzI1NywweEMyNTksLyogMHg2OC0weDZGICovCisJMHhDMjVBLDB4QzI1QiwweEMyNUMsMHhDMjVELDB4QzI1RSwweEMyNUYsMHhDMjYxLDB4QzI2MiwvKiAweDcwLTB4NzcgKi8KKwkweEMyNjMsMHhDMjY0LDB4QzI2NiwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4QzI2NywweEMyNjgsMHhDMjY5LDB4QzI2QSwweEMyNkIsMHhDMjZFLDB4QzI2RiwvKiAweDgwLTB4ODcgKi8KKwkweEMyNzEsMHhDMjcyLDB4QzI3MywweEMyNzUsMHhDMjc2LDB4QzI3NywweEMyNzgsMHhDMjc5LC8qIDB4ODgtMHg4RiAqLworCTB4QzI3QSwweEMyN0IsMHhDMjdFLDB4QzI4MCwweEMyODIsMHhDMjgzLDB4QzI4NCwweEMyODUsLyogMHg5MC0weDk3ICovCisJMHhDMjg2LDB4QzI4NywweEMyOEEsMHhDMjhCLDB4QzI4QywweEMyOEQsMHhDMjhFLDB4QzI4RiwvKiAweDk4LTB4OUYgKi8KKwkweEMyOTEsMHhDMjkyLDB4QzI5MywweEMyOTQsMHhDMjk1LDB4QzI5NiwweEMyOTcsMHhDMjk5LC8qIDB4QTAtMHhBNyAqLworCTB4QzI5QSwweEMyOUMsMHhDMjlFLDB4QzI5RiwweEMyQTAsMHhDMkExLDB4QzJBMiwweEMyQTMsLyogMHhBOC0weEFGICovCisJMHhDMkE2LDB4QzJBNywweEMyQTksMHhDMkFBLDB4QzJBQiwweEMyQUUsMHhDMkFGLDB4QzJCMCwvKiAweEIwLTB4QjcgKi8KKwkweEMyQjEsMHhDMkIyLDB4QzJCMywweEMyQjYsMHhDMkI4LDB4QzJCQSwweEMyQkIsMHhDMkJDLC8qIDB4QjgtMHhCRiAqLworCTB4QzJCRCwweEMyQkUsMHhDMkJGLDB4QzJDMCwweEMyQzEsMHhDMkMyLDB4QzJDMywweEMyQzQsLyogMHhDMC0weEM3ICovCisJMHhDMkM1LDB4QzJDNiwweEMyQzcsMHhDMkM4LDB4QzJDOSwweEMyQ0EsMHhDMkNCLDB4QzJDQywvKiAweEM4LTB4Q0YgKi8KKwkweEMyQ0QsMHhDMkNFLDB4QzJDRiwweEMyRDAsMHhDMkQxLDB4QzJEMiwweEMyRDMsMHhDMkQ0LC8qIDB4RDAtMHhENyAqLworCTB4QzJENSwweEMyRDYsMHhDMkQ3LDB4QzJEOCwweEMyRDksMHhDMkRBLDB4QzJEQiwweEMyREUsLyogMHhEOC0weERGICovCisJMHhDMkRGLDB4QzJFMSwweEMyRTIsMHhDMkU1LDB4QzJFNiwweEMyRTcsMHhDMkU4LDB4QzJFOSwvKiAweEUwLTB4RTcgKi8KKwkweEMyRUEsMHhDMkVFLDB4QzJGMCwweEMyRjIsMHhDMkYzLDB4QzJGNCwweEMyRjUsMHhDMkY3LC8qIDB4RTgtMHhFRiAqLworCTB4QzJGQSwweEMyRkQsMHhDMkZFLDB4QzJGRiwweEMzMDEsMHhDMzAyLDB4QzMwMywweEMzMDQsLyogMHhGMC0weEY3ICovCisJMHhDMzA1LDB4QzMwNiwweEMzMDcsMHhDMzBBLDB4QzMwQiwweEMzMEUsMHhDMzBGLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV85QlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhDMzEwLDB4QzMxMSwweEMzMTIsMHhDMzE2LDB4QzMxNywweEMzMTksMHhDMzFBLC8qIDB4NDAtMHg0NyAqLworCTB4QzMxQiwweEMzMUQsMHhDMzFFLDB4QzMxRiwweEMzMjAsMHhDMzIxLDB4QzMyMiwweEMzMjMsLyogMHg0OC0weDRGICovCisJMHhDMzI2LDB4QzMyNywweEMzMkEsMHhDMzJCLDB4QzMyQywweEMzMkQsMHhDMzJFLDB4QzMyRiwvKiAweDUwLTB4NTcgKi8KKwkweEMzMzAsMHhDMzMxLDB4QzMzMiwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEMzMzMsMHhDMzM0LDB4QzMzNSwweEMzMzYsMHhDMzM3LDB4QzMzOCwweEMzMzksLyogMHg2MC0weDY3ICovCisJMHhDMzNBLDB4QzMzQiwweEMzM0MsMHhDMzNELDB4QzMzRSwweEMzM0YsMHhDMzQwLDB4QzM0MSwvKiAweDY4LTB4NkYgKi8KKwkweEMzNDIsMHhDMzQzLDB4QzM0NCwweEMzNDYsMHhDMzQ3LDB4QzM0OCwweEMzNDksMHhDMzRBLC8qIDB4NzAtMHg3NyAqLworCTB4QzM0QiwweEMzNEMsMHhDMzRELDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhDMzRFLDB4QzM0RiwweEMzNTAsMHhDMzUxLDB4QzM1MiwweEMzNTMsMHhDMzU0LC8qIDB4ODAtMHg4NyAqLworCTB4QzM1NSwweEMzNTYsMHhDMzU3LDB4QzM1OCwweEMzNTksMHhDMzVBLDB4QzM1QiwweEMzNUMsLyogMHg4OC0weDhGICovCisJMHhDMzVELDB4QzM1RSwweEMzNUYsMHhDMzYwLDB4QzM2MSwweEMzNjIsMHhDMzYzLDB4QzM2NCwvKiAweDkwLTB4OTcgKi8KKwkweEMzNjUsMHhDMzY2LDB4QzM2NywweEMzNkEsMHhDMzZCLDB4QzM2RCwweEMzNkUsMHhDMzZGLC8qIDB4OTgtMHg5RiAqLworCTB4QzM3MSwweEMzNzMsMHhDMzc0LDB4QzM3NSwweEMzNzYsMHhDMzc3LDB4QzM3QSwweEMzN0IsLyogMHhBMC0weEE3ICovCisJMHhDMzdFLDB4QzM3RiwweEMzODAsMHhDMzgxLDB4QzM4MiwweEMzODMsMHhDMzg1LDB4QzM4NiwvKiAweEE4LTB4QUYgKi8KKwkweEMzODcsMHhDMzg5LDB4QzM4QSwweEMzOEIsMHhDMzhELDB4QzM4RSwweEMzOEYsMHhDMzkwLC8qIDB4QjAtMHhCNyAqLworCTB4QzM5MSwweEMzOTIsMHhDMzkzLDB4QzM5NCwweEMzOTUsMHhDMzk2LDB4QzM5NywweEMzOTgsLyogMHhCOC0weEJGICovCisJMHhDMzk5LDB4QzM5QSwweEMzOUIsMHhDMzlDLDB4QzM5RCwweEMzOUUsMHhDMzlGLDB4QzNBMCwvKiAweEMwLTB4QzcgKi8KKwkweEMzQTEsMHhDM0EyLDB4QzNBMywweEMzQTQsMHhDM0E1LDB4QzNBNiwweEMzQTcsMHhDM0E4LC8qIDB4QzgtMHhDRiAqLworCTB4QzNBOSwweEMzQUEsMHhDM0FCLDB4QzNBQywweEMzQUQsMHhDM0FFLDB4QzNBRiwweEMzQjAsLyogMHhEMC0weEQ3ICovCisJMHhDM0IxLDB4QzNCMiwweEMzQjMsMHhDM0I0LDB4QzNCNSwweEMzQjYsMHhDM0I3LDB4QzNCOCwvKiAweEQ4LTB4REYgKi8KKwkweEMzQjksMHhDM0JBLDB4QzNCQiwweEMzQkMsMHhDM0JELDB4QzNCRSwweEMzQkYsMHhDM0MxLC8qIDB4RTAtMHhFNyAqLworCTB4QzNDMiwweEMzQzMsMHhDM0M0LDB4QzNDNSwweEMzQzYsMHhDM0M3LDB4QzNDOCwweEMzQzksLyogMHhFOC0weEVGICovCisJMHhDM0NBLDB4QzNDQiwweEMzQ0MsMHhDM0NELDB4QzNDRSwweEMzQ0YsMHhDM0QwLDB4QzNEMSwvKiAweEYwLTB4RjcgKi8KKwkweEMzRDIsMHhDM0QzLDB4QzNENCwweEMzRDUsMHhDM0Q2LDB4QzNENywweEMzREEsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzlDWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEMzREIsMHhDM0RELDB4QzNERSwweEMzRTEsMHhDM0UzLDB4QzNFNCwweEMzRTUsLyogMHg0MC0weDQ3ICovCisJMHhDM0U2LDB4QzNFNywweEMzRUEsMHhDM0VCLDB4QzNFQywweEMzRUUsMHhDM0VGLDB4QzNGMCwvKiAweDQ4LTB4NEYgKi8KKwkweEMzRjEsMHhDM0YyLDB4QzNGMywweEMzRjYsMHhDM0Y3LDB4QzNGOSwweEMzRkEsMHhDM0ZCLC8qIDB4NTAtMHg1NyAqLworCTB4QzNGQywweEMzRkQsMHhDM0ZFLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4QzNGRiwweEM0MDAsMHhDNDAxLDB4QzQwMiwweEM0MDMsMHhDNDA0LDB4QzQwNSwvKiAweDYwLTB4NjcgKi8KKwkweEM0MDYsMHhDNDA3LDB4QzQwOSwweEM0MEEsMHhDNDBCLDB4QzQwQywweEM0MEQsMHhDNDBFLC8qIDB4NjgtMHg2RiAqLworCTB4QzQwRiwweEM0MTEsMHhDNDEyLDB4QzQxMywweEM0MTQsMHhDNDE1LDB4QzQxNiwweEM0MTcsLyogMHg3MC0weDc3ICovCisJMHhDNDE4LDB4QzQxOSwweEM0MUEsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEM0MUIsMHhDNDFDLDB4QzQxRCwweEM0MUUsMHhDNDFGLDB4QzQyMCwweEM0MjEsLyogMHg4MC0weDg3ICovCisJMHhDNDIyLDB4QzQyMywweEM0MjUsMHhDNDI2LDB4QzQyNywweEM0MjgsMHhDNDI5LDB4QzQyQSwvKiAweDg4LTB4OEYgKi8KKwkweEM0MkIsMHhDNDJELDB4QzQyRSwweEM0MkYsMHhDNDMxLDB4QzQzMiwweEM0MzMsMHhDNDM1LC8qIDB4OTAtMHg5NyAqLworCTB4QzQzNiwweEM0MzcsMHhDNDM4LDB4QzQzOSwweEM0M0EsMHhDNDNCLDB4QzQzRSwweEM0M0YsLyogMHg5OC0weDlGICovCisJMHhDNDQwLDB4QzQ0MSwweEM0NDIsMHhDNDQzLDB4QzQ0NCwweEM0NDUsMHhDNDQ2LDB4QzQ0NywvKiAweEEwLTB4QTcgKi8KKwkweEM0NDksMHhDNDRBLDB4QzQ0QiwweEM0NEMsMHhDNDRELDB4QzQ0RSwweEM0NEYsMHhDNDUwLC8qIDB4QTgtMHhBRiAqLworCTB4QzQ1MSwweEM0NTIsMHhDNDUzLDB4QzQ1NCwweEM0NTUsMHhDNDU2LDB4QzQ1NywweEM0NTgsLyogMHhCMC0weEI3ICovCisJMHhDNDU5LDB4QzQ1QSwweEM0NUIsMHhDNDVDLDB4QzQ1RCwweEM0NUUsMHhDNDVGLDB4QzQ2MCwvKiAweEI4LTB4QkYgKi8KKwkweEM0NjEsMHhDNDYyLDB4QzQ2MywweEM0NjYsMHhDNDY3LDB4QzQ2OSwweEM0NkEsMHhDNDZCLC8qIDB4QzAtMHhDNyAqLworCTB4QzQ2RCwweEM0NkUsMHhDNDZGLDB4QzQ3MCwweEM0NzEsMHhDNDcyLDB4QzQ3MywweEM0NzYsLyogMHhDOC0weENGICovCisJMHhDNDc3LDB4QzQ3OCwweEM0N0EsMHhDNDdCLDB4QzQ3QywweEM0N0QsMHhDNDdFLDB4QzQ3RiwvKiAweEQwLTB4RDcgKi8KKwkweEM0ODEsMHhDNDgyLDB4QzQ4MywweEM0ODQsMHhDNDg1LDB4QzQ4NiwweEM0ODcsMHhDNDg4LC8qIDB4RDgtMHhERiAqLworCTB4QzQ4OSwweEM0OEEsMHhDNDhCLDB4QzQ4QywweEM0OEQsMHhDNDhFLDB4QzQ4RiwweEM0OTAsLyogMHhFMC0weEU3ICovCisJMHhDNDkxLDB4QzQ5MiwweEM0OTMsMHhDNDk1LDB4QzQ5NiwweEM0OTcsMHhDNDk4LDB4QzQ5OSwvKiAweEU4LTB4RUYgKi8KKwkweEM0OUEsMHhDNDlCLDB4QzQ5RCwweEM0OUUsMHhDNDlGLDB4QzRBMCwweEM0QTEsMHhDNEEyLC8qIDB4RjAtMHhGNyAqLworCTB4QzRBMywweEM0QTQsMHhDNEE1LDB4QzRBNiwweEM0QTcsMHhDNEE4LDB4QzRBOSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfOURbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4QzRBQSwweEM0QUIsMHhDNEFDLDB4QzRBRCwweEM0QUUsMHhDNEFGLDB4QzRCMCwvKiAweDQwLTB4NDcgKi8KKwkweEM0QjEsMHhDNEIyLDB4QzRCMywweEM0QjQsMHhDNEI1LDB4QzRCNiwweEM0QjcsMHhDNEI5LC8qIDB4NDgtMHg0RiAqLworCTB4QzRCQSwweEM0QkIsMHhDNEJELDB4QzRCRSwweEM0QkYsMHhDNEMwLDB4QzRDMSwweEM0QzIsLyogMHg1MC0weDU3ICovCisJMHhDNEMzLDB4QzRDNCwweEM0QzUsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhDNEM2LDB4QzRDNywweEM0QzgsMHhDNEM5LDB4QzRDQSwweEM0Q0IsMHhDNENDLC8qIDB4NjAtMHg2NyAqLworCTB4QzRDRCwweEM0Q0UsMHhDNENGLDB4QzREMCwweEM0RDEsMHhDNEQyLDB4QzREMywweEM0RDQsLyogMHg2OC0weDZGICovCisJMHhDNEQ1LDB4QzRENiwweEM0RDcsMHhDNEQ4LDB4QzREOSwweEM0REEsMHhDNERCLDB4QzREQywvKiAweDcwLTB4NzcgKi8KKwkweEM0REQsMHhDNERFLDB4QzRERiwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4QzRFMCwweEM0RTEsMHhDNEUyLDB4QzRFMywweEM0RTQsMHhDNEU1LDB4QzRFNiwvKiAweDgwLTB4ODcgKi8KKwkweEM0RTcsMHhDNEU4LDB4QzRFQSwweEM0RUIsMHhDNEVDLDB4QzRFRCwweEM0RUUsMHhDNEVGLC8qIDB4ODgtMHg4RiAqLworCTB4QzRGMiwweEM0RjMsMHhDNEY1LDB4QzRGNiwweEM0RjcsMHhDNEY5LDB4QzRGQiwweEM0RkMsLyogMHg5MC0weDk3ICovCisJMHhDNEZELDB4QzRGRSwweEM1MDIsMHhDNTAzLDB4QzUwNCwweEM1MDUsMHhDNTA2LDB4QzUwNywvKiAweDk4LTB4OUYgKi8KKwkweEM1MDgsMHhDNTA5LDB4QzUwQSwweEM1MEIsMHhDNTBELDB4QzUwRSwweEM1MEYsMHhDNTExLC8qIDB4QTAtMHhBNyAqLworCTB4QzUxMiwweEM1MTMsMHhDNTE1LDB4QzUxNiwweEM1MTcsMHhDNTE4LDB4QzUxOSwweEM1MUEsLyogMHhBOC0weEFGICovCisJMHhDNTFCLDB4QzUxRCwweEM1MUUsMHhDNTFGLDB4QzUyMCwweEM1MjEsMHhDNTIyLDB4QzUyMywvKiAweEIwLTB4QjcgKi8KKwkweEM1MjQsMHhDNTI1LDB4QzUyNiwweEM1MjcsMHhDNTJBLDB4QzUyQiwweEM1MkQsMHhDNTJFLC8qIDB4QjgtMHhCRiAqLworCTB4QzUyRiwweEM1MzEsMHhDNTMyLDB4QzUzMywweEM1MzQsMHhDNTM1LDB4QzUzNiwweEM1MzcsLyogMHhDMC0weEM3ICovCisJMHhDNTNBLDB4QzUzQywweEM1M0UsMHhDNTNGLDB4QzU0MCwweEM1NDEsMHhDNTQyLDB4QzU0MywvKiAweEM4LTB4Q0YgKi8KKwkweEM1NDYsMHhDNTQ3LDB4QzU0QiwweEM1NEYsMHhDNTUwLDB4QzU1MSwweEM1NTIsMHhDNTU2LC8qIDB4RDAtMHhENyAqLworCTB4QzU1QSwweEM1NUIsMHhDNTVDLDB4QzU1RiwweEM1NjIsMHhDNTYzLDB4QzU2NSwweEM1NjYsLyogMHhEOC0weERGICovCisJMHhDNTY3LDB4QzU2OSwweEM1NkEsMHhDNTZCLDB4QzU2QywweEM1NkQsMHhDNTZFLDB4QzU2RiwvKiAweEUwLTB4RTcgKi8KKwkweEM1NzIsMHhDNTc2LDB4QzU3NywweEM1NzgsMHhDNTc5LDB4QzU3QSwweEM1N0IsMHhDNTdFLC8qIDB4RTgtMHhFRiAqLworCTB4QzU3RiwweEM1ODEsMHhDNTgyLDB4QzU4MywweEM1ODUsMHhDNTg2LDB4QzU4OCwweEM1ODksLyogMHhGMC0weEY3ICovCisJMHhDNThBLDB4QzU4QiwweEM1OEUsMHhDNTkwLDB4QzU5MiwweEM1OTMsMHhDNTk0LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV85RVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhDNTk2LDB4QzU5OSwweEM1OUEsMHhDNTlCLDB4QzU5RCwweEM1OUUsMHhDNTlGLC8qIDB4NDAtMHg0NyAqLworCTB4QzVBMSwweEM1QTIsMHhDNUEzLDB4QzVBNCwweEM1QTUsMHhDNUE2LDB4QzVBNywweEM1QTgsLyogMHg0OC0weDRGICovCisJMHhDNUFBLDB4QzVBQiwweEM1QUMsMHhDNUFELDB4QzVBRSwweEM1QUYsMHhDNUIwLDB4QzVCMSwvKiAweDUwLTB4NTcgKi8KKwkweEM1QjIsMHhDNUIzLDB4QzVCNiwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEM1QjcsMHhDNUJBLDB4QzVCRiwweEM1QzAsMHhDNUMxLDB4QzVDMiwweEM1QzMsLyogMHg2MC0weDY3ICovCisJMHhDNUNCLDB4QzVDRCwweEM1Q0YsMHhDNUQyLDB4QzVEMywweEM1RDUsMHhDNUQ2LDB4QzVENywvKiAweDY4LTB4NkYgKi8KKwkweEM1RDksMHhDNURBLDB4QzVEQiwweEM1REMsMHhDNURELDB4QzVERSwweEM1REYsMHhDNUUyLC8qIDB4NzAtMHg3NyAqLworCTB4QzVFNCwweEM1RTYsMHhDNUU3LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhDNUU4LDB4QzVFOSwweEM1RUEsMHhDNUVCLDB4QzVFRiwweEM1RjEsMHhDNUYyLC8qIDB4ODAtMHg4NyAqLworCTB4QzVGMywweEM1RjUsMHhDNUY4LDB4QzVGOSwweEM1RkEsMHhDNUZCLDB4QzYwMiwweEM2MDMsLyogMHg4OC0weDhGICovCisJMHhDNjA0LDB4QzYwOSwweEM2MEEsMHhDNjBCLDB4QzYwRCwweEM2MEUsMHhDNjBGLDB4QzYxMSwvKiAweDkwLTB4OTcgKi8KKwkweEM2MTIsMHhDNjEzLDB4QzYxNCwweEM2MTUsMHhDNjE2LDB4QzYxNywweEM2MUEsMHhDNjFELC8qIDB4OTgtMHg5RiAqLworCTB4QzYxRSwweEM2MUYsMHhDNjIwLDB4QzYyMSwweEM2MjIsMHhDNjIzLDB4QzYyNiwweEM2MjcsLyogMHhBMC0weEE3ICovCisJMHhDNjI5LDB4QzYyQSwweEM2MkIsMHhDNjJGLDB4QzYzMSwweEM2MzIsMHhDNjM2LDB4QzYzOCwvKiAweEE4LTB4QUYgKi8KKwkweEM2M0EsMHhDNjNDLDB4QzYzRCwweEM2M0UsMHhDNjNGLDB4QzY0MiwweEM2NDMsMHhDNjQ1LC8qIDB4QjAtMHhCNyAqLworCTB4QzY0NiwweEM2NDcsMHhDNjQ5LDB4QzY0QSwweEM2NEIsMHhDNjRDLDB4QzY0RCwweEM2NEUsLyogMHhCOC0weEJGICovCisJMHhDNjRGLDB4QzY1MiwweEM2NTYsMHhDNjU3LDB4QzY1OCwweEM2NTksMHhDNjVBLDB4QzY1QiwvKiAweEMwLTB4QzcgKi8KKwkweEM2NUUsMHhDNjVGLDB4QzY2MSwweEM2NjIsMHhDNjYzLDB4QzY2NCwweEM2NjUsMHhDNjY2LC8qIDB4QzgtMHhDRiAqLworCTB4QzY2NywweEM2NjgsMHhDNjY5LDB4QzY2QSwweEM2NkIsMHhDNjZELDB4QzY2RSwweEM2NzAsLyogMHhEMC0weEQ3ICovCisJMHhDNjcyLDB4QzY3MywweEM2NzQsMHhDNjc1LDB4QzY3NiwweEM2NzcsMHhDNjdBLDB4QzY3QiwvKiAweEQ4LTB4REYgKi8KKwkweEM2N0QsMHhDNjdFLDB4QzY3RiwweEM2ODEsMHhDNjgyLDB4QzY4MywweEM2ODQsMHhDNjg1LC8qIDB4RTAtMHhFNyAqLworCTB4QzY4NiwweEM2ODcsMHhDNjhBLDB4QzY4QywweEM2OEUsMHhDNjhGLDB4QzY5MCwweEM2OTEsLyogMHhFOC0weEVGICovCisJMHhDNjkyLDB4QzY5MywweEM2OTYsMHhDNjk3LDB4QzY5OSwweEM2OUEsMHhDNjlCLDB4QzY5RCwvKiAweEYwLTB4RjcgKi8KKwkweEM2OUUsMHhDNjlGLDB4QzZBMCwweEM2QTEsMHhDNkEyLDB4QzZBMywweEM2QTYsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1XzlGWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEM2QTgsMHhDNkFBLDB4QzZBQiwweEM2QUMsMHhDNkFELDB4QzZBRSwweEM2QUYsLyogMHg0MC0weDQ3ICovCisJMHhDNkIyLDB4QzZCMywweEM2QjUsMHhDNkI2LDB4QzZCNywweEM2QkIsMHhDNkJDLDB4QzZCRCwvKiAweDQ4LTB4NEYgKi8KKwkweEM2QkUsMHhDNkJGLDB4QzZDMiwweEM2QzQsMHhDNkM2LDB4QzZDNywweEM2QzgsMHhDNkM5LC8qIDB4NTAtMHg1NyAqLworCTB4QzZDQSwweEM2Q0IsMHhDNkNFLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4QzZDRiwweEM2RDEsMHhDNkQyLDB4QzZEMywweEM2RDUsMHhDNkQ2LDB4QzZENywvKiAweDYwLTB4NjcgKi8KKwkweEM2RDgsMHhDNkQ5LDB4QzZEQSwweEM2REIsMHhDNkRFLDB4QzZERiwweEM2RTIsMHhDNkUzLC8qIDB4NjgtMHg2RiAqLworCTB4QzZFNCwweEM2RTUsMHhDNkU2LDB4QzZFNywweEM2RUEsMHhDNkVCLDB4QzZFRCwweEM2RUUsLyogMHg3MC0weDc3ICovCisJMHhDNkVGLDB4QzZGMSwweEM2RjIsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEM2RjMsMHhDNkY0LDB4QzZGNSwweEM2RjYsMHhDNkY3LDB4QzZGQSwweEM2RkIsLyogMHg4MC0weDg3ICovCisJMHhDNkZDLDB4QzZGRSwweEM2RkYsMHhDNzAwLDB4QzcwMSwweEM3MDIsMHhDNzAzLDB4QzcwNiwvKiAweDg4LTB4OEYgKi8KKwkweEM3MDcsMHhDNzA5LDB4QzcwQSwweEM3MEIsMHhDNzBELDB4QzcwRSwweEM3MEYsMHhDNzEwLC8qIDB4OTAtMHg5NyAqLworCTB4QzcxMSwweEM3MTIsMHhDNzEzLDB4QzcxNiwweEM3MTgsMHhDNzFBLDB4QzcxQiwweEM3MUMsLyogMHg5OC0weDlGICovCisJMHhDNzFELDB4QzcxRSwweEM3MUYsMHhDNzIyLDB4QzcyMywweEM3MjUsMHhDNzI2LDB4QzcyNywvKiAweEEwLTB4QTcgKi8KKwkweEM3MjksMHhDNzJBLDB4QzcyQiwweEM3MkMsMHhDNzJELDB4QzcyRSwweEM3MkYsMHhDNzMyLC8qIDB4QTgtMHhBRiAqLworCTB4QzczNCwweEM3MzYsMHhDNzM4LDB4QzczOSwweEM3M0EsMHhDNzNCLDB4QzczRSwweEM3M0YsLyogMHhCMC0weEI3ICovCisJMHhDNzQxLDB4Qzc0MiwweEM3NDMsMHhDNzQ1LDB4Qzc0NiwweEM3NDcsMHhDNzQ4LDB4Qzc0OSwvKiAweEI4LTB4QkYgKi8KKwkweEM3NEIsMHhDNzRFLDB4Qzc1MCwweEM3NTksMHhDNzVBLDB4Qzc1QiwweEM3NUQsMHhDNzVFLC8qIDB4QzAtMHhDNyAqLworCTB4Qzc1RiwweEM3NjEsMHhDNzYyLDB4Qzc2MywweEM3NjQsMHhDNzY1LDB4Qzc2NiwweEM3NjcsLyogMHhDOC0weENGICovCisJMHhDNzY5LDB4Qzc2QSwweEM3NkMsMHhDNzZELDB4Qzc2RSwweEM3NkYsMHhDNzcwLDB4Qzc3MSwvKiAweEQwLTB4RDcgKi8KKwkweEM3NzIsMHhDNzczLDB4Qzc3NiwweEM3NzcsMHhDNzc5LDB4Qzc3QSwweEM3N0IsMHhDNzdGLC8qIDB4RDgtMHhERiAqLworCTB4Qzc4MCwweEM3ODEsMHhDNzgyLDB4Qzc4NiwweEM3OEIsMHhDNzhDLDB4Qzc4RCwweEM3OEYsLyogMHhFMC0weEU3ICovCisJMHhDNzkyLDB4Qzc5MywweEM3OTUsMHhDNzk5LDB4Qzc5QiwweEM3OUMsMHhDNzlELDB4Qzc5RSwvKiAweEU4LTB4RUYgKi8KKwkweEM3OUYsMHhDN0EyLDB4QzdBNywweEM3QTgsMHhDN0E5LDB4QzdBQSwweEM3QUIsMHhDN0FFLC8qIDB4RjAtMHhGNyAqLworCTB4QzdBRiwweEM3QjEsMHhDN0IyLDB4QzdCMywweEM3QjUsMHhDN0I2LDB4QzdCNywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQTBbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4QzdCOCwweEM3QjksMHhDN0JBLDB4QzdCQiwweEM3QkUsMHhDN0MyLDB4QzdDMywvKiAweDQwLTB4NDcgKi8KKwkweEM3QzQsMHhDN0M1LDB4QzdDNiwweEM3QzcsMHhDN0NBLDB4QzdDQiwweEM3Q0QsMHhDN0NGLC8qIDB4NDgtMHg0RiAqLworCTB4QzdEMSwweEM3RDIsMHhDN0QzLDB4QzdENCwweEM3RDUsMHhDN0Q2LDB4QzdENywweEM3RDksLyogMHg1MC0weDU3ICovCisJMHhDN0RBLDB4QzdEQiwweEM3REMsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhDN0RFLDB4QzdERiwweEM3RTAsMHhDN0UxLDB4QzdFMiwweEM3RTMsMHhDN0U1LC8qIDB4NjAtMHg2NyAqLworCTB4QzdFNiwweEM3RTcsMHhDN0U5LDB4QzdFQSwweEM3RUIsMHhDN0VELDB4QzdFRSwweEM3RUYsLyogMHg2OC0weDZGICovCisJMHhDN0YwLDB4QzdGMSwweEM3RjIsMHhDN0YzLDB4QzdGNCwweEM3RjUsMHhDN0Y2LDB4QzdGNywvKiAweDcwLTB4NzcgKi8KKwkweEM3RjgsMHhDN0Y5LDB4QzdGQSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4QzdGQiwweEM3RkMsMHhDN0ZELDB4QzdGRSwweEM3RkYsMHhDODAyLDB4QzgwMywvKiAweDgwLTB4ODcgKi8KKwkweEM4MDUsMHhDODA2LDB4QzgwNywweEM4MDksMHhDODBCLDB4QzgwQywweEM4MEQsMHhDODBFLC8qIDB4ODgtMHg4RiAqLworCTB4QzgwRiwweEM4MTIsMHhDODE0LDB4QzgxNywweEM4MTgsMHhDODE5LDB4QzgxQSwweEM4MUIsLyogMHg5MC0weDk3ICovCisJMHhDODFFLDB4QzgxRiwweEM4MjEsMHhDODIyLDB4QzgyMywweEM4MjUsMHhDODI2LDB4QzgyNywvKiAweDk4LTB4OUYgKi8KKwkweEM4MjgsMHhDODI5LDB4QzgyQSwweEM4MkIsMHhDODJFLDB4QzgzMCwweEM4MzIsMHhDODMzLC8qIDB4QTAtMHhBNyAqLworCTB4QzgzNCwweEM4MzUsMHhDODM2LDB4QzgzNywweEM4MzksMHhDODNBLDB4QzgzQiwweEM4M0QsLyogMHhBOC0weEFGICovCisJMHhDODNFLDB4QzgzRiwweEM4NDEsMHhDODQyLDB4Qzg0MywweEM4NDQsMHhDODQ1LDB4Qzg0NiwvKiAweEIwLTB4QjcgKi8KKwkweEM4NDcsMHhDODRBLDB4Qzg0QiwweEM4NEUsMHhDODRGLDB4Qzg1MCwweEM4NTEsMHhDODUyLC8qIDB4QjgtMHhCRiAqLworCTB4Qzg1MywweEM4NTUsMHhDODU2LDB4Qzg1NywweEM4NTgsMHhDODU5LDB4Qzg1QSwweEM4NUIsLyogMHhDMC0weEM3ICovCisJMHhDODVDLDB4Qzg1RCwweEM4NUUsMHhDODVGLDB4Qzg2MCwweEM4NjEsMHhDODYyLDB4Qzg2MywvKiAweEM4LTB4Q0YgKi8KKwkweEM4NjQsMHhDODY1LDB4Qzg2NiwweEM4NjcsMHhDODY4LDB4Qzg2OSwweEM4NkEsMHhDODZCLC8qIDB4RDAtMHhENyAqLworCTB4Qzg2QywweEM4NkQsMHhDODZFLDB4Qzg2RiwweEM4NzIsMHhDODczLDB4Qzg3NSwweEM4NzYsLyogMHhEOC0weERGICovCisJMHhDODc3LDB4Qzg3OSwweEM4N0IsMHhDODdDLDB4Qzg3RCwweEM4N0UsMHhDODdGLDB4Qzg4MiwvKiAweEUwLTB4RTcgKi8KKwkweEM4ODQsMHhDODg4LDB4Qzg4OSwweEM4OEEsMHhDODhFLDB4Qzg4RiwweEM4OTAsMHhDODkxLC8qIDB4RTgtMHhFRiAqLworCTB4Qzg5MiwweEM4OTMsMHhDODk1LDB4Qzg5NiwweEM4OTcsMHhDODk4LDB4Qzg5OSwweEM4OUEsLyogMHhGMC0weEY3ICovCisJMHhDODlCLDB4Qzg5QywweEM4OUUsMHhDOEEwLDB4QzhBMiwweEM4QTMsMHhDOEE0LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9BMVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhDOEE1LDB4QzhBNiwweEM4QTcsMHhDOEE5LDB4QzhBQSwweEM4QUIsMHhDOEFDLC8qIDB4NDAtMHg0NyAqLworCTB4QzhBRCwweEM4QUUsMHhDOEFGLDB4QzhCMCwweEM4QjEsMHhDOEIyLDB4QzhCMywweEM4QjQsLyogMHg0OC0weDRGICovCisJMHhDOEI1LDB4QzhCNiwweEM4QjcsMHhDOEI4LDB4QzhCOSwweEM4QkEsMHhDOEJCLDB4QzhCRSwvKiAweDUwLTB4NTcgKi8KKwkweEM4QkYsMHhDOEMwLDB4QzhDMSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEM4QzIsMHhDOEMzLDB4QzhDNSwweEM4QzYsMHhDOEM3LDB4QzhDOSwweEM4Q0EsLyogMHg2MC0weDY3ICovCisJMHhDOENCLDB4QzhDRCwweEM4Q0UsMHhDOENGLDB4QzhEMCwweEM4RDEsMHhDOEQyLDB4QzhEMywvKiAweDY4LTB4NkYgKi8KKwkweEM4RDYsMHhDOEQ4LDB4QzhEQSwweEM4REIsMHhDOERDLDB4QzhERCwweEM4REUsMHhDOERGLC8qIDB4NzAtMHg3NyAqLworCTB4QzhFMiwweEM4RTMsMHhDOEU1LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhDOEU2LDB4QzhFNywweEM4RTgsMHhDOEU5LDB4QzhFQSwweEM4RUIsMHhDOEVDLC8qIDB4ODAtMHg4NyAqLworCTB4QzhFRCwweEM4RUUsMHhDOEVGLDB4QzhGMCwweEM4RjEsMHhDOEYyLDB4QzhGMywweEM4RjQsLyogMHg4OC0weDhGICovCisJMHhDOEY2LDB4QzhGNywweEM4RjgsMHhDOEY5LDB4QzhGQSwweEM4RkIsMHhDOEZFLDB4QzhGRiwvKiAweDkwLTB4OTcgKi8KKwkweEM5MDEsMHhDOTAyLDB4QzkwMywweEM5MDcsMHhDOTA4LDB4QzkwOSwweEM5MEEsMHhDOTBCLC8qIDB4OTgtMHg5RiAqLworCTB4QzkwRSwweDMwMDAsMHgzMDAxLDB4MzAwMiwweDAwQjcsMHgyMDI1LDB4MjAyNiwweDAwQTgsLyogMHhBMC0weEE3ICovCisJMHgzMDAzLDB4MDBBRCwweDIwMTUsMHgyMjI1LDB4RkYzQywweDIyM0MsMHgyMDE4LDB4MjAxOSwvKiAweEE4LTB4QUYgKi8KKwkweDIwMUMsMHgyMDFELDB4MzAxNCwweDMwMTUsMHgzMDA4LDB4MzAwOSwweDMwMEEsMHgzMDBCLC8qIDB4QjAtMHhCNyAqLworCTB4MzAwQywweDMwMEQsMHgzMDBFLDB4MzAwRiwweDMwMTAsMHgzMDExLDB4MDBCMSwweDAwRDcsLyogMHhCOC0weEJGICovCisJMHgwMEY3LDB4MjI2MCwweDIyNjQsMHgyMjY1LDB4MjIxRSwweDIyMzQsMHgwMEIwLDB4MjAzMiwvKiAweEMwLTB4QzcgKi8KKwkweDIwMzMsMHgyMTAzLDB4MjEyQiwweEZGRTAsMHhGRkUxLDB4RkZFNSwweDI2NDIsMHgyNjQwLC8qIDB4QzgtMHhDRiAqLworCTB4MjIyMCwweDIyQTUsMHgyMzEyLDB4MjIwMiwweDIyMDcsMHgyMjYxLDB4MjI1MiwweDAwQTcsLyogMHhEMC0weEQ3ICovCisJMHgyMDNCLDB4MjYwNiwweDI2MDUsMHgyNUNCLDB4MjVDRiwweDI1Q0UsMHgyNUM3LDB4MjVDNiwvKiAweEQ4LTB4REYgKi8KKwkweDI1QTEsMHgyNUEwLDB4MjVCMywweDI1QjIsMHgyNUJELDB4MjVCQywweDIxOTIsMHgyMTkwLC8qIDB4RTAtMHhFNyAqLworCTB4MjE5MSwweDIxOTMsMHgyMTk0LDB4MzAxMywweDIyNkEsMHgyMjZCLDB4MjIxQSwweDIyM0QsLyogMHhFOC0weEVGICovCisJMHgyMjFELDB4MjIzNSwweDIyMkIsMHgyMjJDLDB4MjIwOCwweDIyMEIsMHgyMjg2LDB4MjI4NywvKiAweEYwLTB4RjcgKi8KKwkweDIyODIsMHgyMjgzLDB4MjIyQSwweDIyMjksMHgyMjI3LDB4MjIyOCwweEZGRTIsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0EyWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEM5MTAsMHhDOTEyLDB4QzkxMywweEM5MTQsMHhDOTE1LDB4QzkxNiwweEM5MTcsLyogMHg0MC0weDQ3ICovCisJMHhDOTE5LDB4QzkxQSwweEM5MUIsMHhDOTFDLDB4QzkxRCwweEM5MUUsMHhDOTFGLDB4QzkyMCwvKiAweDQ4LTB4NEYgKi8KKwkweEM5MjEsMHhDOTIyLDB4QzkyMywweEM5MjQsMHhDOTI1LDB4QzkyNiwweEM5MjcsMHhDOTI4LC8qIDB4NTAtMHg1NyAqLworCTB4QzkyOSwweEM5MkEsMHhDOTJCLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4QzkyRCwweEM5MkUsMHhDOTJGLDB4QzkzMCwweEM5MzEsMHhDOTMyLDB4QzkzMywvKiAweDYwLTB4NjcgKi8KKwkweEM5MzUsMHhDOTM2LDB4QzkzNywweEM5MzgsMHhDOTM5LDB4QzkzQSwweEM5M0IsMHhDOTNDLC8qIDB4NjgtMHg2RiAqLworCTB4QzkzRCwweEM5M0UsMHhDOTNGLDB4Qzk0MCwweEM5NDEsMHhDOTQyLDB4Qzk0MywweEM5NDQsLyogMHg3MC0weDc3ICovCisJMHhDOTQ1LDB4Qzk0NiwweEM5NDcsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEM5NDgsMHhDOTQ5LDB4Qzk0QSwweEM5NEIsMHhDOTRDLDB4Qzk0RCwweEM5NEUsLyogMHg4MC0weDg3ICovCisJMHhDOTRGLDB4Qzk1MiwweEM5NTMsMHhDOTU1LDB4Qzk1NiwweEM5NTcsMHhDOTU5LDB4Qzk1QSwvKiAweDg4LTB4OEYgKi8KKwkweEM5NUIsMHhDOTVDLDB4Qzk1RCwweEM5NUUsMHhDOTVGLDB4Qzk2MiwweEM5NjQsMHhDOTY1LC8qIDB4OTAtMHg5NyAqLworCTB4Qzk2NiwweEM5NjcsMHhDOTY4LDB4Qzk2OSwweEM5NkEsMHhDOTZCLDB4Qzk2RCwweEM5NkUsLyogMHg5OC0weDlGICovCisJMHhDOTZGLDB4MjFEMiwweDIxRDQsMHgyMjAwLDB4MjIwMywweDAwQjQsMHhGRjVFLDB4MDJDNywvKiAweEEwLTB4QTcgKi8KKwkweDAyRDgsMHgwMkRELDB4MDJEQSwweDAyRDksMHgwMEI4LDB4MDJEQiwweDAwQTEsMHgwMEJGLC8qIDB4QTgtMHhBRiAqLworCTB4MDJEMCwweDIyMkUsMHgyMjExLDB4MjIwRiwweDAwQTQsMHgyMTA5LDB4MjAzMCwweDI1QzEsLyogMHhCMC0weEI3ICovCisJMHgyNUMwLDB4MjVCNywweDI1QjYsMHgyNjY0LDB4MjY2MCwweDI2NjEsMHgyNjY1LDB4MjY2NywvKiAweEI4LTB4QkYgKi8KKwkweDI2NjMsMHgyMjk5LDB4MjVDOCwweDI1QTMsMHgyNUQwLDB4MjVEMSwweDI1OTIsMHgyNUE0LC8qIDB4QzAtMHhDNyAqLworCTB4MjVBNSwweDI1QTgsMHgyNUE3LDB4MjVBNiwweDI1QTksMHgyNjY4LDB4MjYwRiwweDI2MEUsLyogMHhDOC0weENGICovCisJMHgyNjFDLDB4MjYxRSwweDAwQjYsMHgyMDIwLDB4MjAyMSwweDIxOTUsMHgyMTk3LDB4MjE5OSwvKiAweEQwLTB4RDcgKi8KKwkweDIxOTYsMHgyMTk4LDB4MjY2RCwweDI2NjksMHgyNjZBLDB4MjY2QywweDMyN0YsMHgzMjFDLC8qIDB4RDgtMHhERiAqLworCTB4MjExNiwweDMzQzcsMHgyMTIyLDB4MzNDMiwweDMzRDgsMHgyMTIxLDB4MjBBQywweDAwQUUsLyogMHhFMC0weEU3ICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQTNbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4Qzk3MSwweEM5NzIsMHhDOTczLDB4Qzk3NSwweEM5NzYsMHhDOTc3LDB4Qzk3OCwvKiAweDQwLTB4NDcgKi8KKwkweEM5NzksMHhDOTdBLDB4Qzk3QiwweEM5N0QsMHhDOTdFLDB4Qzk3RiwweEM5ODAsMHhDOTgxLC8qIDB4NDgtMHg0RiAqLworCTB4Qzk4MiwweEM5ODMsMHhDOTg0LDB4Qzk4NSwweEM5ODYsMHhDOTg3LDB4Qzk4QSwweEM5OEIsLyogMHg1MC0weDU3ICovCisJMHhDOThELDB4Qzk4RSwweEM5OEYsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhDOTkxLDB4Qzk5MiwweEM5OTMsMHhDOTk0LDB4Qzk5NSwweEM5OTYsMHhDOTk3LC8qIDB4NjAtMHg2NyAqLworCTB4Qzk5QSwweEM5OUMsMHhDOTlFLDB4Qzk5RiwweEM5QTAsMHhDOUExLDB4QzlBMiwweEM5QTMsLyogMHg2OC0weDZGICovCisJMHhDOUE0LDB4QzlBNSwweEM5QTYsMHhDOUE3LDB4QzlBOCwweEM5QTksMHhDOUFBLDB4QzlBQiwvKiAweDcwLTB4NzcgKi8KKwkweEM5QUMsMHhDOUFELDB4QzlBRSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4QzlBRiwweEM5QjAsMHhDOUIxLDB4QzlCMiwweEM5QjMsMHhDOUI0LDB4QzlCNSwvKiAweDgwLTB4ODcgKi8KKwkweEM5QjYsMHhDOUI3LDB4QzlCOCwweEM5QjksMHhDOUJBLDB4QzlCQiwweEM5QkMsMHhDOUJELC8qIDB4ODgtMHg4RiAqLworCTB4QzlCRSwweEM5QkYsMHhDOUMyLDB4QzlDMywweEM5QzUsMHhDOUM2LDB4QzlDOSwweEM5Q0IsLyogMHg5MC0weDk3ICovCisJMHhDOUNDLDB4QzlDRCwweEM5Q0UsMHhDOUNGLDB4QzlEMiwweEM5RDQsMHhDOUQ3LDB4QzlEOCwvKiAweDk4LTB4OUYgKi8KKwkweEM5REIsMHhGRjAxLDB4RkYwMiwweEZGMDMsMHhGRjA0LDB4RkYwNSwweEZGMDYsMHhGRjA3LC8qIDB4QTAtMHhBNyAqLworCTB4RkYwOCwweEZGMDksMHhGRjBBLDB4RkYwQiwweEZGMEMsMHhGRjBELDB4RkYwRSwweEZGMEYsLyogMHhBOC0weEFGICovCisJMHhGRjEwLDB4RkYxMSwweEZGMTIsMHhGRjEzLDB4RkYxNCwweEZGMTUsMHhGRjE2LDB4RkYxNywvKiAweEIwLTB4QjcgKi8KKwkweEZGMTgsMHhGRjE5LDB4RkYxQSwweEZGMUIsMHhGRjFDLDB4RkYxRCwweEZGMUUsMHhGRjFGLC8qIDB4QjgtMHhCRiAqLworCTB4RkYyMCwweEZGMjEsMHhGRjIyLDB4RkYyMywweEZGMjQsMHhGRjI1LDB4RkYyNiwweEZGMjcsLyogMHhDMC0weEM3ICovCisJMHhGRjI4LDB4RkYyOSwweEZGMkEsMHhGRjJCLDB4RkYyQywweEZGMkQsMHhGRjJFLDB4RkYyRiwvKiAweEM4LTB4Q0YgKi8KKwkweEZGMzAsMHhGRjMxLDB4RkYzMiwweEZGMzMsMHhGRjM0LDB4RkYzNSwweEZGMzYsMHhGRjM3LC8qIDB4RDAtMHhENyAqLworCTB4RkYzOCwweEZGMzksMHhGRjNBLDB4RkYzQiwweEZGRTYsMHhGRjNELDB4RkYzRSwweEZGM0YsLyogMHhEOC0weERGICovCisJMHhGRjQwLDB4RkY0MSwweEZGNDIsMHhGRjQzLDB4RkY0NCwweEZGNDUsMHhGRjQ2LDB4RkY0NywvKiAweEUwLTB4RTcgKi8KKwkweEZGNDgsMHhGRjQ5LDB4RkY0QSwweEZGNEIsMHhGRjRDLDB4RkY0RCwweEZGNEUsMHhGRjRGLC8qIDB4RTgtMHhFRiAqLworCTB4RkY1MCwweEZGNTEsMHhGRjUyLDB4RkY1MywweEZGNTQsMHhGRjU1LDB4RkY1NiwweEZGNTcsLyogMHhGMC0weEY3ICovCisJMHhGRjU4LDB4RkY1OSwweEZGNUEsMHhGRjVCLDB4RkY1QywweEZGNUQsMHhGRkUzLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9BNFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhDOURFLDB4QzlERiwweEM5RTEsMHhDOUUzLDB4QzlFNSwweEM5RTYsMHhDOUU4LC8qIDB4NDAtMHg0NyAqLworCTB4QzlFOSwweEM5RUEsMHhDOUVCLDB4QzlFRSwweEM5RjIsMHhDOUYzLDB4QzlGNCwweEM5RjUsLyogMHg0OC0weDRGICovCisJMHhDOUY2LDB4QzlGNywweEM5RkEsMHhDOUZCLDB4QzlGRCwweEM5RkUsMHhDOUZGLDB4Q0EwMSwvKiAweDUwLTB4NTcgKi8KKwkweENBMDIsMHhDQTAzLDB4Q0EwNCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweENBMDUsMHhDQTA2LDB4Q0EwNywweENBMEEsMHhDQTBFLDB4Q0EwRiwweENBMTAsLyogMHg2MC0weDY3ICovCisJMHhDQTExLDB4Q0ExMiwweENBMTMsMHhDQTE1LDB4Q0ExNiwweENBMTcsMHhDQTE5LDB4Q0ExQSwvKiAweDY4LTB4NkYgKi8KKwkweENBMUIsMHhDQTFDLDB4Q0ExRCwweENBMUUsMHhDQTFGLDB4Q0EyMCwweENBMjEsMHhDQTIyLC8qIDB4NzAtMHg3NyAqLworCTB4Q0EyMywweENBMjQsMHhDQTI1LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhDQTI2LDB4Q0EyNywweENBMjgsMHhDQTJBLDB4Q0EyQiwweENBMkMsMHhDQTJELC8qIDB4ODAtMHg4NyAqLworCTB4Q0EyRSwweENBMkYsMHhDQTMwLDB4Q0EzMSwweENBMzIsMHhDQTMzLDB4Q0EzNCwweENBMzUsLyogMHg4OC0weDhGICovCisJMHhDQTM2LDB4Q0EzNywweENBMzgsMHhDQTM5LDB4Q0EzQSwweENBM0IsMHhDQTNDLDB4Q0EzRCwvKiAweDkwLTB4OTcgKi8KKwkweENBM0UsMHhDQTNGLDB4Q0E0MCwweENBNDEsMHhDQTQyLDB4Q0E0MywweENBNDQsMHhDQTQ1LC8qIDB4OTgtMHg5RiAqLworCTB4Q0E0NiwweDMxMzEsMHgzMTMyLDB4MzEzMywweDMxMzQsMHgzMTM1LDB4MzEzNiwweDMxMzcsLyogMHhBMC0weEE3ICovCisJMHgzMTM4LDB4MzEzOSwweDMxM0EsMHgzMTNCLDB4MzEzQywweDMxM0QsMHgzMTNFLDB4MzEzRiwvKiAweEE4LTB4QUYgKi8KKwkweDMxNDAsMHgzMTQxLDB4MzE0MiwweDMxNDMsMHgzMTQ0LDB4MzE0NSwweDMxNDYsMHgzMTQ3LC8qIDB4QjAtMHhCNyAqLworCTB4MzE0OCwweDMxNDksMHgzMTRBLDB4MzE0QiwweDMxNEMsMHgzMTRELDB4MzE0RSwweDMxNEYsLyogMHhCOC0weEJGICovCisJMHgzMTUwLDB4MzE1MSwweDMxNTIsMHgzMTUzLDB4MzE1NCwweDMxNTUsMHgzMTU2LDB4MzE1NywvKiAweEMwLTB4QzcgKi8KKwkweDMxNTgsMHgzMTU5LDB4MzE1QSwweDMxNUIsMHgzMTVDLDB4MzE1RCwweDMxNUUsMHgzMTVGLC8qIDB4QzgtMHhDRiAqLworCTB4MzE2MCwweDMxNjEsMHgzMTYyLDB4MzE2MywweDMxNjQsMHgzMTY1LDB4MzE2NiwweDMxNjcsLyogMHhEMC0weEQ3ICovCisJMHgzMTY4LDB4MzE2OSwweDMxNkEsMHgzMTZCLDB4MzE2QywweDMxNkQsMHgzMTZFLDB4MzE2RiwvKiAweEQ4LTB4REYgKi8KKwkweDMxNzAsMHgzMTcxLDB4MzE3MiwweDMxNzMsMHgzMTc0LDB4MzE3NSwweDMxNzYsMHgzMTc3LC8qIDB4RTAtMHhFNyAqLworCTB4MzE3OCwweDMxNzksMHgzMTdBLDB4MzE3QiwweDMxN0MsMHgzMTdELDB4MzE3RSwweDMxN0YsLyogMHhFOC0weEVGICovCisJMHgzMTgwLDB4MzE4MSwweDMxODIsMHgzMTgzLDB4MzE4NCwweDMxODUsMHgzMTg2LDB4MzE4NywvKiAweEYwLTB4RjcgKi8KKwkweDMxODgsMHgzMTg5LDB4MzE4QSwweDMxOEIsMHgzMThDLDB4MzE4RCwweDMxOEUsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0E1WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweENBNDcsMHhDQTQ4LDB4Q0E0OSwweENBNEEsMHhDQTRCLDB4Q0E0RSwweENBNEYsLyogMHg0MC0weDQ3ICovCisJMHhDQTUxLDB4Q0E1MiwweENBNTMsMHhDQTU1LDB4Q0E1NiwweENBNTcsMHhDQTU4LDB4Q0E1OSwvKiAweDQ4LTB4NEYgKi8KKwkweENBNUEsMHhDQTVCLDB4Q0E1RSwweENBNjIsMHhDQTYzLDB4Q0E2NCwweENBNjUsMHhDQTY2LC8qIDB4NTAtMHg1NyAqLworCTB4Q0E2NywweENBNjksMHhDQTZBLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4Q0E2QiwweENBNkMsMHhDQTZELDB4Q0E2RSwweENBNkYsMHhDQTcwLDB4Q0E3MSwvKiAweDYwLTB4NjcgKi8KKwkweENBNzIsMHhDQTczLDB4Q0E3NCwweENBNzUsMHhDQTc2LDB4Q0E3NywweENBNzgsMHhDQTc5LC8qIDB4NjgtMHg2RiAqLworCTB4Q0E3QSwweENBN0IsMHhDQTdDLDB4Q0E3RSwweENBN0YsMHhDQTgwLDB4Q0E4MSwweENBODIsLyogMHg3MC0weDc3ICovCisJMHhDQTgzLDB4Q0E4NSwweENBODYsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweENBODcsMHhDQTg4LDB4Q0E4OSwweENBOEEsMHhDQThCLDB4Q0E4QywweENBOEQsLyogMHg4MC0weDg3ICovCisJMHhDQThFLDB4Q0E4RiwweENBOTAsMHhDQTkxLDB4Q0E5MiwweENBOTMsMHhDQTk0LDB4Q0E5NSwvKiAweDg4LTB4OEYgKi8KKwkweENBOTYsMHhDQTk3LDB4Q0E5OSwweENBOUEsMHhDQTlCLDB4Q0E5QywweENBOUQsMHhDQTlFLC8qIDB4OTAtMHg5NyAqLworCTB4Q0E5RiwweENBQTAsMHhDQUExLDB4Q0FBMiwweENBQTMsMHhDQUE0LDB4Q0FBNSwweENBQTYsLyogMHg5OC0weDlGICovCisJMHhDQUE3LDB4MjE3MCwweDIxNzEsMHgyMTcyLDB4MjE3MywweDIxNzQsMHgyMTc1LDB4MjE3NiwvKiAweEEwLTB4QTcgKi8KKwkweDIxNzcsMHgyMTc4LDB4MjE3OSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4QTgtMHhBRiAqLworCTB4MjE2MCwweDIxNjEsMHgyMTYyLDB4MjE2MywweDIxNjQsMHgyMTY1LDB4MjE2NiwweDIxNjcsLyogMHhCMC0weEI3ICovCisJMHgyMTY4LDB4MjE2OSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEI4LTB4QkYgKi8KKwkweDAwMDAsMHgwMzkxLDB4MDM5MiwweDAzOTMsMHgwMzk0LDB4MDM5NSwweDAzOTYsMHgwMzk3LC8qIDB4QzAtMHhDNyAqLworCTB4MDM5OCwweDAzOTksMHgwMzlBLDB4MDM5QiwweDAzOUMsMHgwMzlELDB4MDM5RSwweDAzOUYsLyogMHhDOC0weENGICovCisJMHgwM0EwLDB4MDNBMSwweDAzQTMsMHgwM0E0LDB4MDNBNSwweDAzQTYsMHgwM0E3LDB4MDNBOCwvKiAweEQwLTB4RDcgKi8KKwkweDAzQTksMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RDgtMHhERiAqLworCTB4MDAwMCwweDAzQjEsMHgwM0IyLDB4MDNCMywweDAzQjQsMHgwM0I1LDB4MDNCNiwweDAzQjcsLyogMHhFMC0weEU3ICovCisJMHgwM0I4LDB4MDNCOSwweDAzQkEsMHgwM0JCLDB4MDNCQywweDAzQkQsMHgwM0JFLDB4MDNCRiwvKiAweEU4LTB4RUYgKi8KKwkweDAzQzAsMHgwM0MxLDB4MDNDMywweDAzQzQsMHgwM0M1LDB4MDNDNiwweDAzQzcsMHgwM0M4LC8qIDB4RjAtMHhGNyAqLworCTB4MDNDOSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQTZbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4Q0FBOCwweENBQTksMHhDQUFBLDB4Q0FBQiwweENBQUMsMHhDQUFELDB4Q0FBRSwvKiAweDQwLTB4NDcgKi8KKwkweENBQUYsMHhDQUIwLDB4Q0FCMSwweENBQjIsMHhDQUIzLDB4Q0FCNCwweENBQjUsMHhDQUI2LC8qIDB4NDgtMHg0RiAqLworCTB4Q0FCNywweENBQjgsMHhDQUI5LDB4Q0FCQSwweENBQkIsMHhDQUJFLDB4Q0FCRiwweENBQzEsLyogMHg1MC0weDU3ICovCisJMHhDQUMyLDB4Q0FDMywweENBQzUsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhDQUM2LDB4Q0FDNywweENBQzgsMHhDQUM5LDB4Q0FDQSwweENBQ0IsMHhDQUNFLC8qIDB4NjAtMHg2NyAqLworCTB4Q0FEMCwweENBRDIsMHhDQUQ0LDB4Q0FENSwweENBRDYsMHhDQUQ3LDB4Q0FEQSwweENBREIsLyogMHg2OC0weDZGICovCisJMHhDQURDLDB4Q0FERCwweENBREUsMHhDQURGLDB4Q0FFMSwweENBRTIsMHhDQUUzLDB4Q0FFNCwvKiAweDcwLTB4NzcgKi8KKwkweENBRTUsMHhDQUU2LDB4Q0FFNywweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4Q0FFOCwweENBRTksMHhDQUVBLDB4Q0FFQiwweENBRUQsMHhDQUVFLDB4Q0FFRiwvKiAweDgwLTB4ODcgKi8KKwkweENBRjAsMHhDQUYxLDB4Q0FGMiwweENBRjMsMHhDQUY1LDB4Q0FGNiwweENBRjcsMHhDQUY4LC8qIDB4ODgtMHg4RiAqLworCTB4Q0FGOSwweENBRkEsMHhDQUZCLDB4Q0FGQywweENBRkQsMHhDQUZFLDB4Q0FGRiwweENCMDAsLyogMHg5MC0weDk3ICovCisJMHhDQjAxLDB4Q0IwMiwweENCMDMsMHhDQjA0LDB4Q0IwNSwweENCMDYsMHhDQjA3LDB4Q0IwOSwvKiAweDk4LTB4OUYgKi8KKwkweENCMEEsMHgyNTAwLDB4MjUwMiwweDI1MEMsMHgyNTEwLDB4MjUxOCwweDI1MTQsMHgyNTFDLC8qIDB4QTAtMHhBNyAqLworCTB4MjUyQywweDI1MjQsMHgyNTM0LDB4MjUzQywweDI1MDEsMHgyNTAzLDB4MjUwRiwweDI1MTMsLyogMHhBOC0weEFGICovCisJMHgyNTFCLDB4MjUxNywweDI1MjMsMHgyNTMzLDB4MjUyQiwweDI1M0IsMHgyNTRCLDB4MjUyMCwvKiAweEIwLTB4QjcgKi8KKwkweDI1MkYsMHgyNTI4LDB4MjUzNywweDI1M0YsMHgyNTFELDB4MjUzMCwweDI1MjUsMHgyNTM4LC8qIDB4QjgtMHhCRiAqLworCTB4MjU0MiwweDI1MTIsMHgyNTExLDB4MjUxQSwweDI1MTksMHgyNTE2LDB4MjUxNSwweDI1MEUsLyogMHhDMC0weEM3ICovCisJMHgyNTBELDB4MjUxRSwweDI1MUYsMHgyNTIxLDB4MjUyMiwweDI1MjYsMHgyNTI3LDB4MjUyOSwvKiAweEM4LTB4Q0YgKi8KKwkweDI1MkEsMHgyNTJELDB4MjUyRSwweDI1MzEsMHgyNTMyLDB4MjUzNSwweDI1MzYsMHgyNTM5LC8qIDB4RDAtMHhENyAqLworCTB4MjUzQSwweDI1M0QsMHgyNTNFLDB4MjU0MCwweDI1NDEsMHgyNTQzLDB4MjU0NCwweDI1NDUsLyogMHhEOC0weERGICovCisJMHgyNTQ2LDB4MjU0NywweDI1NDgsMHgyNTQ5LDB4MjU0QSwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEUwLTB4RTcgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9BN1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhDQjBCLDB4Q0IwQywweENCMEQsMHhDQjBFLDB4Q0IwRiwweENCMTEsMHhDQjEyLC8qIDB4NDAtMHg0NyAqLworCTB4Q0IxMywweENCMTUsMHhDQjE2LDB4Q0IxNywweENCMTksMHhDQjFBLDB4Q0IxQiwweENCMUMsLyogMHg0OC0weDRGICovCisJMHhDQjFELDB4Q0IxRSwweENCMUYsMHhDQjIyLDB4Q0IyMywweENCMjQsMHhDQjI1LDB4Q0IyNiwvKiAweDUwLTB4NTcgKi8KKwkweENCMjcsMHhDQjI4LDB4Q0IyOSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweENCMkEsMHhDQjJCLDB4Q0IyQywweENCMkQsMHhDQjJFLDB4Q0IyRiwweENCMzAsLyogMHg2MC0weDY3ICovCisJMHhDQjMxLDB4Q0IzMiwweENCMzMsMHhDQjM0LDB4Q0IzNSwweENCMzYsMHhDQjM3LDB4Q0IzOCwvKiAweDY4LTB4NkYgKi8KKwkweENCMzksMHhDQjNBLDB4Q0IzQiwweENCM0MsMHhDQjNELDB4Q0IzRSwweENCM0YsMHhDQjQwLC8qIDB4NzAtMHg3NyAqLworCTB4Q0I0MiwweENCNDMsMHhDQjQ0LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhDQjQ1LDB4Q0I0NiwweENCNDcsMHhDQjRBLDB4Q0I0QiwweENCNEQsMHhDQjRFLC8qIDB4ODAtMHg4NyAqLworCTB4Q0I0RiwweENCNTEsMHhDQjUyLDB4Q0I1MywweENCNTQsMHhDQjU1LDB4Q0I1NiwweENCNTcsLyogMHg4OC0weDhGICovCisJMHhDQjVBLDB4Q0I1QiwweENCNUMsMHhDQjVFLDB4Q0I1RiwweENCNjAsMHhDQjYxLDB4Q0I2MiwvKiAweDkwLTB4OTcgKi8KKwkweENCNjMsMHhDQjY1LDB4Q0I2NiwweENCNjcsMHhDQjY4LDB4Q0I2OSwweENCNkEsMHhDQjZCLC8qIDB4OTgtMHg5RiAqLworCTB4Q0I2QywweDMzOTUsMHgzMzk2LDB4MzM5NywweDIxMTMsMHgzMzk4LDB4MzNDNCwweDMzQTMsLyogMHhBMC0weEE3ICovCisJMHgzM0E0LDB4MzNBNSwweDMzQTYsMHgzMzk5LDB4MzM5QSwweDMzOUIsMHgzMzlDLDB4MzM5RCwvKiAweEE4LTB4QUYgKi8KKwkweDMzOUUsMHgzMzlGLDB4MzNBMCwweDMzQTEsMHgzM0EyLDB4MzNDQSwweDMzOEQsMHgzMzhFLC8qIDB4QjAtMHhCNyAqLworCTB4MzM4RiwweDMzQ0YsMHgzMzg4LDB4MzM4OSwweDMzQzgsMHgzM0E3LDB4MzNBOCwweDMzQjAsLyogMHhCOC0weEJGICovCisJMHgzM0IxLDB4MzNCMiwweDMzQjMsMHgzM0I0LDB4MzNCNSwweDMzQjYsMHgzM0I3LDB4MzNCOCwvKiAweEMwLTB4QzcgKi8KKwkweDMzQjksMHgzMzgwLDB4MzM4MSwweDMzODIsMHgzMzgzLDB4MzM4NCwweDMzQkEsMHgzM0JCLC8qIDB4QzgtMHhDRiAqLworCTB4MzNCQywweDMzQkQsMHgzM0JFLDB4MzNCRiwweDMzOTAsMHgzMzkxLDB4MzM5MiwweDMzOTMsLyogMHhEMC0weEQ3ICovCisJMHgzMzk0LDB4MjEyNiwweDMzQzAsMHgzM0MxLDB4MzM4QSwweDMzOEIsMHgzMzhDLDB4MzNENiwvKiAweEQ4LTB4REYgKi8KKwkweDMzQzUsMHgzM0FELDB4MzNBRSwweDMzQUYsMHgzM0RCLDB4MzNBOSwweDMzQUEsMHgzM0FCLC8qIDB4RTAtMHhFNyAqLworCTB4MzNBQywweDMzREQsMHgzM0QwLDB4MzNEMywweDMzQzMsMHgzM0M5LDB4MzNEQywweDMzQzYsLyogMHhFOC0weEVGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQThbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4Q0I2RCwweENCNkUsMHhDQjZGLDB4Q0I3MCwweENCNzEsMHhDQjcyLDB4Q0I3MywvKiAweDQwLTB4NDcgKi8KKwkweENCNzQsMHhDQjc1LDB4Q0I3NiwweENCNzcsMHhDQjdBLDB4Q0I3QiwweENCN0MsMHhDQjdELC8qIDB4NDgtMHg0RiAqLworCTB4Q0I3RSwweENCN0YsMHhDQjgwLDB4Q0I4MSwweENCODIsMHhDQjgzLDB4Q0I4NCwweENCODUsLyogMHg1MC0weDU3ICovCisJMHhDQjg2LDB4Q0I4NywweENCODgsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhDQjg5LDB4Q0I4QSwweENCOEIsMHhDQjhDLDB4Q0I4RCwweENCOEUsMHhDQjhGLC8qIDB4NjAtMHg2NyAqLworCTB4Q0I5MCwweENCOTEsMHhDQjkyLDB4Q0I5MywweENCOTQsMHhDQjk1LDB4Q0I5NiwweENCOTcsLyogMHg2OC0weDZGICovCisJMHhDQjk4LDB4Q0I5OSwweENCOUEsMHhDQjlCLDB4Q0I5RCwweENCOUUsMHhDQjlGLDB4Q0JBMCwvKiAweDcwLTB4NzcgKi8KKwkweENCQTEsMHhDQkEyLDB4Q0JBMywweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4Q0JBNCwweENCQTUsMHhDQkE2LDB4Q0JBNywweENCQTgsMHhDQkE5LDB4Q0JBQSwvKiAweDgwLTB4ODcgKi8KKwkweENCQUIsMHhDQkFDLDB4Q0JBRCwweENCQUUsMHhDQkFGLDB4Q0JCMCwweENCQjEsMHhDQkIyLC8qIDB4ODgtMHg4RiAqLworCTB4Q0JCMywweENCQjQsMHhDQkI1LDB4Q0JCNiwweENCQjcsMHhDQkI5LDB4Q0JCQSwweENCQkIsLyogMHg5MC0weDk3ICovCisJMHhDQkJDLDB4Q0JCRCwweENCQkUsMHhDQkJGLDB4Q0JDMCwweENCQzEsMHhDQkMyLDB4Q0JDMywvKiAweDk4LTB4OUYgKi8KKwkweENCQzQsMHgwMEM2LDB4MDBEMCwweDAwQUEsMHgwMTI2LDB4MDAwMCwweDAxMzIsMHgwMDAwLC8qIDB4QTAtMHhBNyAqLworCTB4MDEzRiwweDAxNDEsMHgwMEQ4LDB4MDE1MiwweDAwQkEsMHgwMERFLDB4MDE2NiwweDAxNEEsLyogMHhBOC0weEFGICovCisJMHgwMDAwLDB4MzI2MCwweDMyNjEsMHgzMjYyLDB4MzI2MywweDMyNjQsMHgzMjY1LDB4MzI2NiwvKiAweEIwLTB4QjcgKi8KKwkweDMyNjcsMHgzMjY4LDB4MzI2OSwweDMyNkEsMHgzMjZCLDB4MzI2QywweDMyNkQsMHgzMjZFLC8qIDB4QjgtMHhCRiAqLworCTB4MzI2RiwweDMyNzAsMHgzMjcxLDB4MzI3MiwweDMyNzMsMHgzMjc0LDB4MzI3NSwweDMyNzYsLyogMHhDMC0weEM3ICovCisJMHgzMjc3LDB4MzI3OCwweDMyNzksMHgzMjdBLDB4MzI3QiwweDI0RDAsMHgyNEQxLDB4MjREMiwvKiAweEM4LTB4Q0YgKi8KKwkweDI0RDMsMHgyNEQ0LDB4MjRENSwweDI0RDYsMHgyNEQ3LDB4MjREOCwweDI0RDksMHgyNERBLC8qIDB4RDAtMHhENyAqLworCTB4MjREQiwweDI0REMsMHgyNERELDB4MjRERSwweDI0REYsMHgyNEUwLDB4MjRFMSwweDI0RTIsLyogMHhEOC0weERGICovCisJMHgyNEUzLDB4MjRFNCwweDI0RTUsMHgyNEU2LDB4MjRFNywweDI0RTgsMHgyNEU5LDB4MjQ2MCwvKiAweEUwLTB4RTcgKi8KKwkweDI0NjEsMHgyNDYyLDB4MjQ2MywweDI0NjQsMHgyNDY1LDB4MjQ2NiwweDI0NjcsMHgyNDY4LC8qIDB4RTgtMHhFRiAqLworCTB4MjQ2OSwweDI0NkEsMHgyNDZCLDB4MjQ2QywweDI0NkQsMHgyNDZFLDB4MDBCRCwweDIxNTMsLyogMHhGMC0weEY3ICovCisJMHgyMTU0LDB4MDBCQywweDAwQkUsMHgyMTVCLDB4MjE1QywweDIxNUQsMHgyMTVFLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9BOVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhDQkM1LDB4Q0JDNiwweENCQzcsMHhDQkM4LDB4Q0JDOSwweENCQ0EsMHhDQkNCLC8qIDB4NDAtMHg0NyAqLworCTB4Q0JDQywweENCQ0QsMHhDQkNFLDB4Q0JDRiwweENCRDAsMHhDQkQxLDB4Q0JEMiwweENCRDMsLyogMHg0OC0weDRGICovCisJMHhDQkQ1LDB4Q0JENiwweENCRDcsMHhDQkQ4LDB4Q0JEOSwweENCREEsMHhDQkRCLDB4Q0JEQywvKiAweDUwLTB4NTcgKi8KKwkweENCREQsMHhDQkRFLDB4Q0JERiwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweENCRTAsMHhDQkUxLDB4Q0JFMiwweENCRTMsMHhDQkU1LDB4Q0JFNiwweENCRTgsLyogMHg2MC0weDY3ICovCisJMHhDQkVBLDB4Q0JFQiwweENCRUMsMHhDQkVELDB4Q0JFRSwweENCRUYsMHhDQkYwLDB4Q0JGMSwvKiAweDY4LTB4NkYgKi8KKwkweENCRjIsMHhDQkYzLDB4Q0JGNCwweENCRjUsMHhDQkY2LDB4Q0JGNywweENCRjgsMHhDQkY5LC8qIDB4NzAtMHg3NyAqLworCTB4Q0JGQSwweENCRkIsMHhDQkZDLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhDQkZELDB4Q0JGRSwweENCRkYsMHhDQzAwLDB4Q0MwMSwweENDMDIsMHhDQzAzLC8qIDB4ODAtMHg4NyAqLworCTB4Q0MwNCwweENDMDUsMHhDQzA2LDB4Q0MwNywweENDMDgsMHhDQzA5LDB4Q0MwQSwweENDMEIsLyogMHg4OC0weDhGICovCisJMHhDQzBFLDB4Q0MwRiwweENDMTEsMHhDQzEyLDB4Q0MxMywweENDMTUsMHhDQzE2LDB4Q0MxNywvKiAweDkwLTB4OTcgKi8KKwkweENDMTgsMHhDQzE5LDB4Q0MxQSwweENDMUIsMHhDQzFFLDB4Q0MxRiwweENDMjAsMHhDQzIzLC8qIDB4OTgtMHg5RiAqLworCTB4Q0MyNCwweDAwRTYsMHgwMTExLDB4MDBGMCwweDAxMjcsMHgwMTMxLDB4MDEzMywweDAxMzgsLyogMHhBMC0weEE3ICovCisJMHgwMTQwLDB4MDE0MiwweDAwRjgsMHgwMTUzLDB4MDBERiwweDAwRkUsMHgwMTY3LDB4MDE0QiwvKiAweEE4LTB4QUYgKi8KKwkweDAxNDksMHgzMjAwLDB4MzIwMSwweDMyMDIsMHgzMjAzLDB4MzIwNCwweDMyMDUsMHgzMjA2LC8qIDB4QjAtMHhCNyAqLworCTB4MzIwNywweDMyMDgsMHgzMjA5LDB4MzIwQSwweDMyMEIsMHgzMjBDLDB4MzIwRCwweDMyMEUsLyogMHhCOC0weEJGICovCisJMHgzMjBGLDB4MzIxMCwweDMyMTEsMHgzMjEyLDB4MzIxMywweDMyMTQsMHgzMjE1LDB4MzIxNiwvKiAweEMwLTB4QzcgKi8KKwkweDMyMTcsMHgzMjE4LDB4MzIxOSwweDMyMUEsMHgzMjFCLDB4MjQ5QywweDI0OUQsMHgyNDlFLC8qIDB4QzgtMHhDRiAqLworCTB4MjQ5RiwweDI0QTAsMHgyNEExLDB4MjRBMiwweDI0QTMsMHgyNEE0LDB4MjRBNSwweDI0QTYsLyogMHhEMC0weEQ3ICovCisJMHgyNEE3LDB4MjRBOCwweDI0QTksMHgyNEFBLDB4MjRBQiwweDI0QUMsMHgyNEFELDB4MjRBRSwvKiAweEQ4LTB4REYgKi8KKwkweDI0QUYsMHgyNEIwLDB4MjRCMSwweDI0QjIsMHgyNEIzLDB4MjRCNCwweDI0QjUsMHgyNDc0LC8qIDB4RTAtMHhFNyAqLworCTB4MjQ3NSwweDI0NzYsMHgyNDc3LDB4MjQ3OCwweDI0NzksMHgyNDdBLDB4MjQ3QiwweDI0N0MsLyogMHhFOC0weEVGICovCisJMHgyNDdELDB4MjQ3RSwweDI0N0YsMHgyNDgwLDB4MjQ4MSwweDI0ODIsMHgwMEI5LDB4MDBCMiwvKiAweEYwLTB4RjcgKi8KKwkweDAwQjMsMHgyMDc0LDB4MjA3RiwweDIwODEsMHgyMDgyLDB4MjA4MywweDIwODQsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0FBWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweENDMjUsMHhDQzI2LDB4Q0MyQSwweENDMkIsMHhDQzJELDB4Q0MyRiwweENDMzEsLyogMHg0MC0weDQ3ICovCisJMHhDQzMyLDB4Q0MzMywweENDMzQsMHhDQzM1LDB4Q0MzNiwweENDMzcsMHhDQzNBLDB4Q0MzRiwvKiAweDQ4LTB4NEYgKi8KKwkweENDNDAsMHhDQzQxLDB4Q0M0MiwweENDNDMsMHhDQzQ2LDB4Q0M0NywweENDNDksMHhDQzRBLC8qIDB4NTAtMHg1NyAqLworCTB4Q0M0QiwweENDNEQsMHhDQzRFLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4Q0M0RiwweENDNTAsMHhDQzUxLDB4Q0M1MiwweENDNTMsMHhDQzU2LDB4Q0M1QSwvKiAweDYwLTB4NjcgKi8KKwkweENDNUIsMHhDQzVDLDB4Q0M1RCwweENDNUUsMHhDQzVGLDB4Q0M2MSwweENDNjIsMHhDQzYzLC8qIDB4NjgtMHg2RiAqLworCTB4Q0M2NSwweENDNjcsMHhDQzY5LDB4Q0M2QSwweENDNkIsMHhDQzZDLDB4Q0M2RCwweENDNkUsLyogMHg3MC0weDc3ICovCisJMHhDQzZGLDB4Q0M3MSwweENDNzIsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweENDNzMsMHhDQzc0LDB4Q0M3NiwweENDNzcsMHhDQzc4LDB4Q0M3OSwweENDN0EsLyogMHg4MC0weDg3ICovCisJMHhDQzdCLDB4Q0M3QywweENDN0QsMHhDQzdFLDB4Q0M3RiwweENDODAsMHhDQzgxLDB4Q0M4MiwvKiAweDg4LTB4OEYgKi8KKwkweENDODMsMHhDQzg0LDB4Q0M4NSwweENDODYsMHhDQzg3LDB4Q0M4OCwweENDODksMHhDQzhBLC8qIDB4OTAtMHg5NyAqLworCTB4Q0M4QiwweENDOEMsMHhDQzhELDB4Q0M4RSwweENDOEYsMHhDQzkwLDB4Q0M5MSwweENDOTIsLyogMHg5OC0weDlGICovCisJMHhDQzkzLDB4MzA0MSwweDMwNDIsMHgzMDQzLDB4MzA0NCwweDMwNDUsMHgzMDQ2LDB4MzA0NywvKiAweEEwLTB4QTcgKi8KKwkweDMwNDgsMHgzMDQ5LDB4MzA0QSwweDMwNEIsMHgzMDRDLDB4MzA0RCwweDMwNEUsMHgzMDRGLC8qIDB4QTgtMHhBRiAqLworCTB4MzA1MCwweDMwNTEsMHgzMDUyLDB4MzA1MywweDMwNTQsMHgzMDU1LDB4MzA1NiwweDMwNTcsLyogMHhCMC0weEI3ICovCisJMHgzMDU4LDB4MzA1OSwweDMwNUEsMHgzMDVCLDB4MzA1QywweDMwNUQsMHgzMDVFLDB4MzA1RiwvKiAweEI4LTB4QkYgKi8KKwkweDMwNjAsMHgzMDYxLDB4MzA2MiwweDMwNjMsMHgzMDY0LDB4MzA2NSwweDMwNjYsMHgzMDY3LC8qIDB4QzAtMHhDNyAqLworCTB4MzA2OCwweDMwNjksMHgzMDZBLDB4MzA2QiwweDMwNkMsMHgzMDZELDB4MzA2RSwweDMwNkYsLyogMHhDOC0weENGICovCisJMHgzMDcwLDB4MzA3MSwweDMwNzIsMHgzMDczLDB4MzA3NCwweDMwNzUsMHgzMDc2LDB4MzA3NywvKiAweEQwLTB4RDcgKi8KKwkweDMwNzgsMHgzMDc5LDB4MzA3QSwweDMwN0IsMHgzMDdDLDB4MzA3RCwweDMwN0UsMHgzMDdGLC8qIDB4RDgtMHhERiAqLworCTB4MzA4MCwweDMwODEsMHgzMDgyLDB4MzA4MywweDMwODQsMHgzMDg1LDB4MzA4NiwweDMwODcsLyogMHhFMC0weEU3ICovCisJMHgzMDg4LDB4MzA4OSwweDMwOEEsMHgzMDhCLDB4MzA4QywweDMwOEQsMHgzMDhFLDB4MzA4RiwvKiAweEU4LTB4RUYgKi8KKwkweDMwOTAsMHgzMDkxLDB4MzA5MiwweDMwOTMsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RjAtMHhGNyAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0FCWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweENDOTQsMHhDQzk1LDB4Q0M5NiwweENDOTcsMHhDQzlBLDB4Q0M5QiwweENDOUQsLyogMHg0MC0weDQ3ICovCisJMHhDQzlFLDB4Q0M5RiwweENDQTEsMHhDQ0EyLDB4Q0NBMywweENDQTQsMHhDQ0E1LDB4Q0NBNiwvKiAweDQ4LTB4NEYgKi8KKwkweENDQTcsMHhDQ0FBLDB4Q0NBRSwweENDQUYsMHhDQ0IwLDB4Q0NCMSwweENDQjIsMHhDQ0IzLC8qIDB4NTAtMHg1NyAqLworCTB4Q0NCNiwweENDQjcsMHhDQ0I5LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4Q0NCQSwweENDQkIsMHhDQ0JELDB4Q0NCRSwweENDQkYsMHhDQ0MwLDB4Q0NDMSwvKiAweDYwLTB4NjcgKi8KKwkweENDQzIsMHhDQ0MzLDB4Q0NDNiwweENDQzgsMHhDQ0NBLDB4Q0NDQiwweENDQ0MsMHhDQ0NELC8qIDB4NjgtMHg2RiAqLworCTB4Q0NDRSwweENDQ0YsMHhDQ0QxLDB4Q0NEMiwweENDRDMsMHhDQ0Q1LDB4Q0NENiwweENDRDcsLyogMHg3MC0weDc3ICovCisJMHhDQ0Q4LDB4Q0NEOSwweENDREEsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweENDREIsMHhDQ0RDLDB4Q0NERCwweENDREUsMHhDQ0RGLDB4Q0NFMCwweENDRTEsLyogMHg4MC0weDg3ICovCisJMHhDQ0UyLDB4Q0NFMywweENDRTUsMHhDQ0U2LDB4Q0NFNywweENDRTgsMHhDQ0U5LDB4Q0NFQSwvKiAweDg4LTB4OEYgKi8KKwkweENDRUIsMHhDQ0VELDB4Q0NFRSwweENDRUYsMHhDQ0YxLDB4Q0NGMiwweENDRjMsMHhDQ0Y0LC8qIDB4OTAtMHg5NyAqLworCTB4Q0NGNSwweENDRjYsMHhDQ0Y3LDB4Q0NGOCwweENDRjksMHhDQ0ZBLDB4Q0NGQiwweENDRkMsLyogMHg5OC0weDlGICovCisJMHhDQ0ZELDB4MzBBMSwweDMwQTIsMHgzMEEzLDB4MzBBNCwweDMwQTUsMHgzMEE2LDB4MzBBNywvKiAweEEwLTB4QTcgKi8KKwkweDMwQTgsMHgzMEE5LDB4MzBBQSwweDMwQUIsMHgzMEFDLDB4MzBBRCwweDMwQUUsMHgzMEFGLC8qIDB4QTgtMHhBRiAqLworCTB4MzBCMCwweDMwQjEsMHgzMEIyLDB4MzBCMywweDMwQjQsMHgzMEI1LDB4MzBCNiwweDMwQjcsLyogMHhCMC0weEI3ICovCisJMHgzMEI4LDB4MzBCOSwweDMwQkEsMHgzMEJCLDB4MzBCQywweDMwQkQsMHgzMEJFLDB4MzBCRiwvKiAweEI4LTB4QkYgKi8KKwkweDMwQzAsMHgzMEMxLDB4MzBDMiwweDMwQzMsMHgzMEM0LDB4MzBDNSwweDMwQzYsMHgzMEM3LC8qIDB4QzAtMHhDNyAqLworCTB4MzBDOCwweDMwQzksMHgzMENBLDB4MzBDQiwweDMwQ0MsMHgzMENELDB4MzBDRSwweDMwQ0YsLyogMHhDOC0weENGICovCisJMHgzMEQwLDB4MzBEMSwweDMwRDIsMHgzMEQzLDB4MzBENCwweDMwRDUsMHgzMEQ2LDB4MzBENywvKiAweEQwLTB4RDcgKi8KKwkweDMwRDgsMHgzMEQ5LDB4MzBEQSwweDMwREIsMHgzMERDLDB4MzBERCwweDMwREUsMHgzMERGLC8qIDB4RDgtMHhERiAqLworCTB4MzBFMCwweDMwRTEsMHgzMEUyLDB4MzBFMywweDMwRTQsMHgzMEU1LDB4MzBFNiwweDMwRTcsLyogMHhFMC0weEU3ICovCisJMHgzMEU4LDB4MzBFOSwweDMwRUEsMHgzMEVCLDB4MzBFQywweDMwRUQsMHgzMEVFLDB4MzBFRiwvKiAweEU4LTB4RUYgKi8KKwkweDMwRjAsMHgzMEYxLDB4MzBGMiwweDMwRjMsMHgzMEY0LDB4MzBGNSwweDMwRjYsMHgwMDAwLC8qIDB4RjAtMHhGNyAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0FDWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweENDRkUsMHhDQ0ZGLDB4Q0QwMCwweENEMDIsMHhDRDAzLDB4Q0QwNCwweENEMDUsLyogMHg0MC0weDQ3ICovCisJMHhDRDA2LDB4Q0QwNywweENEMEEsMHhDRDBCLDB4Q0QwRCwweENEMEUsMHhDRDBGLDB4Q0QxMSwvKiAweDQ4LTB4NEYgKi8KKwkweENEMTIsMHhDRDEzLDB4Q0QxNCwweENEMTUsMHhDRDE2LDB4Q0QxNywweENEMUEsMHhDRDFDLC8qIDB4NTAtMHg1NyAqLworCTB4Q0QxRSwweENEMUYsMHhDRDIwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4Q0QyMSwweENEMjIsMHhDRDIzLDB4Q0QyNSwweENEMjYsMHhDRDI3LDB4Q0QyOSwvKiAweDYwLTB4NjcgKi8KKwkweENEMkEsMHhDRDJCLDB4Q0QyRCwweENEMkUsMHhDRDJGLDB4Q0QzMCwweENEMzEsMHhDRDMyLC8qIDB4NjgtMHg2RiAqLworCTB4Q0QzMywweENEMzQsMHhDRDM1LDB4Q0QzNiwweENEMzcsMHhDRDM4LDB4Q0QzQSwweENEM0IsLyogMHg3MC0weDc3ICovCisJMHhDRDNDLDB4Q0QzRCwweENEM0UsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweENEM0YsMHhDRDQwLDB4Q0Q0MSwweENENDIsMHhDRDQzLDB4Q0Q0NCwweENENDUsLyogMHg4MC0weDg3ICovCisJMHhDRDQ2LDB4Q0Q0NywweENENDgsMHhDRDQ5LDB4Q0Q0QSwweENENEIsMHhDRDRDLDB4Q0Q0RCwvKiAweDg4LTB4OEYgKi8KKwkweENENEUsMHhDRDRGLDB4Q0Q1MCwweENENTEsMHhDRDUyLDB4Q0Q1MywweENENTQsMHhDRDU1LC8qIDB4OTAtMHg5NyAqLworCTB4Q0Q1NiwweENENTcsMHhDRDU4LDB4Q0Q1OSwweENENUEsMHhDRDVCLDB4Q0Q1RCwweENENUUsLyogMHg5OC0weDlGICovCisJMHhDRDVGLDB4MDQxMCwweDA0MTEsMHgwNDEyLDB4MDQxMywweDA0MTQsMHgwNDE1LDB4MDQwMSwvKiAweEEwLTB4QTcgKi8KKwkweDA0MTYsMHgwNDE3LDB4MDQxOCwweDA0MTksMHgwNDFBLDB4MDQxQiwweDA0MUMsMHgwNDFELC8qIDB4QTgtMHhBRiAqLworCTB4MDQxRSwweDA0MUYsMHgwNDIwLDB4MDQyMSwweDA0MjIsMHgwNDIzLDB4MDQyNCwweDA0MjUsLyogMHhCMC0weEI3ICovCisJMHgwNDI2LDB4MDQyNywweDA0MjgsMHgwNDI5LDB4MDQyQSwweDA0MkIsMHgwNDJDLDB4MDQyRCwvKiAweEI4LTB4QkYgKi8KKwkweDA0MkUsMHgwNDJGLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4QzAtMHhDNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhDOC0weENGICovCisJMHgwMDAwLDB4MDQzMCwweDA0MzEsMHgwNDMyLDB4MDQzMywweDA0MzQsMHgwNDM1LDB4MDQ1MSwvKiAweEQwLTB4RDcgKi8KKwkweDA0MzYsMHgwNDM3LDB4MDQzOCwweDA0MzksMHgwNDNBLDB4MDQzQiwweDA0M0MsMHgwNDNELC8qIDB4RDgtMHhERiAqLworCTB4MDQzRSwweDA0M0YsMHgwNDQwLDB4MDQ0MSwweDA0NDIsMHgwNDQzLDB4MDQ0NCwweDA0NDUsLyogMHhFMC0weEU3ICovCisJMHgwNDQ2LDB4MDQ0NywweDA0NDgsMHgwNDQ5LDB4MDQ0QSwweDA0NEIsMHgwNDRDLDB4MDQ0RCwvKiAweEU4LTB4RUYgKi8KKwkweDA0NEUsMHgwNDRGLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RjAtMHhGNyAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0FEWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweENENjEsMHhDRDYyLDB4Q0Q2MywweENENjUsMHhDRDY2LDB4Q0Q2NywweENENjgsLyogMHg0MC0weDQ3ICovCisJMHhDRDY5LDB4Q0Q2QSwweENENkIsMHhDRDZFLDB4Q0Q3MCwweENENzIsMHhDRDczLDB4Q0Q3NCwvKiAweDQ4LTB4NEYgKi8KKwkweENENzUsMHhDRDc2LDB4Q0Q3NywweENENzksMHhDRDdBLDB4Q0Q3QiwweENEN0MsMHhDRDdELC8qIDB4NTAtMHg1NyAqLworCTB4Q0Q3RSwweENEN0YsMHhDRDgwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4Q0Q4MSwweENEODIsMHhDRDgzLDB4Q0Q4NCwweENEODUsMHhDRDg2LDB4Q0Q4NywvKiAweDYwLTB4NjcgKi8KKwkweENEODksMHhDRDhBLDB4Q0Q4QiwweENEOEMsMHhDRDhELDB4Q0Q4RSwweENEOEYsMHhDRDkwLC8qIDB4NjgtMHg2RiAqLworCTB4Q0Q5MSwweENEOTIsMHhDRDkzLDB4Q0Q5NiwweENEOTcsMHhDRDk5LDB4Q0Q5QSwweENEOUIsLyogMHg3MC0weDc3ICovCisJMHhDRDlELDB4Q0Q5RSwweENEOUYsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweENEQTAsMHhDREExLDB4Q0RBMiwweENEQTMsMHhDREE2LDB4Q0RBOCwweENEQUEsLyogMHg4MC0weDg3ICovCisJMHhDREFCLDB4Q0RBQywweENEQUQsMHhDREFFLDB4Q0RBRiwweENEQjEsMHhDREIyLDB4Q0RCMywvKiAweDg4LTB4OEYgKi8KKwkweENEQjQsMHhDREI1LDB4Q0RCNiwweENEQjcsMHhDREI4LDB4Q0RCOSwweENEQkEsMHhDREJCLC8qIDB4OTAtMHg5NyAqLworCTB4Q0RCQywweENEQkQsMHhDREJFLDB4Q0RCRiwweENEQzAsMHhDREMxLDB4Q0RDMiwweENEQzMsLyogMHg5OC0weDlGICovCisJMHhDREM1LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEEwLTB4QTcgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9BRVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhDREM2LDB4Q0RDNywweENEQzgsMHhDREM5LDB4Q0RDQSwweENEQ0IsMHhDRENELC8qIDB4NDAtMHg0NyAqLworCTB4Q0RDRSwweENEQ0YsMHhDREQxLDB4Q0REMiwweENERDMsMHhDREQ0LDB4Q0RENSwweENERDYsLyogMHg0OC0weDRGICovCisJMHhDREQ3LDB4Q0REOCwweENERDksMHhDRERBLDB4Q0REQiwweENEREMsMHhDRERELDB4Q0RERSwvKiAweDUwLTB4NTcgKi8KKwkweENEREYsMHhDREUwLDB4Q0RFMSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweENERTIsMHhDREUzLDB4Q0RFNCwweENERTUsMHhDREU2LDB4Q0RFNywweENERTksLyogMHg2MC0weDY3ICovCisJMHhDREVBLDB4Q0RFQiwweENERUQsMHhDREVFLDB4Q0RFRiwweENERjEsMHhDREYyLDB4Q0RGMywvKiAweDY4LTB4NkYgKi8KKwkweENERjQsMHhDREY1LDB4Q0RGNiwweENERjcsMHhDREZBLDB4Q0RGQywweENERkUsMHhDREZGLC8qIDB4NzAtMHg3NyAqLworCTB4Q0UwMCwweENFMDEsMHhDRTAyLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhDRTAzLDB4Q0UwNSwweENFMDYsMHhDRTA3LDB4Q0UwOSwweENFMEEsMHhDRTBCLC8qIDB4ODAtMHg4NyAqLworCTB4Q0UwRCwweENFMEUsMHhDRTBGLDB4Q0UxMCwweENFMTEsMHhDRTEyLDB4Q0UxMywweENFMTUsLyogMHg4OC0weDhGICovCisJMHhDRTE2LDB4Q0UxNywweENFMTgsMHhDRTFBLDB4Q0UxQiwweENFMUMsMHhDRTFELDB4Q0UxRSwvKiAweDkwLTB4OTcgKi8KKwkweENFMUYsMHhDRTIyLDB4Q0UyMywweENFMjUsMHhDRTI2LDB4Q0UyNywweENFMjksMHhDRTJBLC8qIDB4OTgtMHg5RiAqLworCTB4Q0UyQiwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhBMC0weEE3ICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQUZbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4Q0UyQywweENFMkQsMHhDRTJFLDB4Q0UyRiwweENFMzIsMHhDRTM0LDB4Q0UzNiwvKiAweDQwLTB4NDcgKi8KKwkweENFMzcsMHhDRTM4LDB4Q0UzOSwweENFM0EsMHhDRTNCLDB4Q0UzQywweENFM0QsMHhDRTNFLC8qIDB4NDgtMHg0RiAqLworCTB4Q0UzRiwweENFNDAsMHhDRTQxLDB4Q0U0MiwweENFNDMsMHhDRTQ0LDB4Q0U0NSwweENFNDYsLyogMHg1MC0weDU3ICovCisJMHhDRTQ3LDB4Q0U0OCwweENFNDksMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhDRTRBLDB4Q0U0QiwweENFNEMsMHhDRTRELDB4Q0U0RSwweENFNEYsMHhDRTUwLC8qIDB4NjAtMHg2NyAqLworCTB4Q0U1MSwweENFNTIsMHhDRTUzLDB4Q0U1NCwweENFNTUsMHhDRTU2LDB4Q0U1NywweENFNUEsLyogMHg2OC0weDZGICovCisJMHhDRTVCLDB4Q0U1RCwweENFNUUsMHhDRTYyLDB4Q0U2MywweENFNjQsMHhDRTY1LDB4Q0U2NiwvKiAweDcwLTB4NzcgKi8KKwkweENFNjcsMHhDRTZBLDB4Q0U2QywweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4Q0U2RSwweENFNkYsMHhDRTcwLDB4Q0U3MSwweENFNzIsMHhDRTczLDB4Q0U3NiwvKiAweDgwLTB4ODcgKi8KKwkweENFNzcsMHhDRTc5LDB4Q0U3QSwweENFN0IsMHhDRTdELDB4Q0U3RSwweENFN0YsMHhDRTgwLC8qIDB4ODgtMHg4RiAqLworCTB4Q0U4MSwweENFODIsMHhDRTgzLDB4Q0U4NiwweENFODgsMHhDRThBLDB4Q0U4QiwweENFOEMsLyogMHg5MC0weDk3ICovCisJMHhDRThELDB4Q0U4RSwweENFOEYsMHhDRTkyLDB4Q0U5MywweENFOTUsMHhDRTk2LDB4Q0U5NywvKiAweDk4LTB4OUYgKi8KKwkweENFOTksMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4QTAtMHhBNyAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0IwWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweENFOUEsMHhDRTlCLDB4Q0U5QywweENFOUQsMHhDRTlFLDB4Q0U5RiwweENFQTIsLyogMHg0MC0weDQ3ICovCisJMHhDRUE2LDB4Q0VBNywweENFQTgsMHhDRUE5LDB4Q0VBQSwweENFQUIsMHhDRUFFLDB4Q0VBRiwvKiAweDQ4LTB4NEYgKi8KKwkweENFQjAsMHhDRUIxLDB4Q0VCMiwweENFQjMsMHhDRUI0LDB4Q0VCNSwweENFQjYsMHhDRUI3LC8qIDB4NTAtMHg1NyAqLworCTB4Q0VCOCwweENFQjksMHhDRUJBLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4Q0VCQiwweENFQkMsMHhDRUJELDB4Q0VCRSwweENFQkYsMHhDRUMwLDB4Q0VDMiwvKiAweDYwLTB4NjcgKi8KKwkweENFQzMsMHhDRUM0LDB4Q0VDNSwweENFQzYsMHhDRUM3LDB4Q0VDOCwweENFQzksMHhDRUNBLC8qIDB4NjgtMHg2RiAqLworCTB4Q0VDQiwweENFQ0MsMHhDRUNELDB4Q0VDRSwweENFQ0YsMHhDRUQwLDB4Q0VEMSwweENFRDIsLyogMHg3MC0weDc3ICovCisJMHhDRUQzLDB4Q0VENCwweENFRDUsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweENFRDYsMHhDRUQ3LDB4Q0VEOCwweENFRDksMHhDRURBLDB4Q0VEQiwweENFREMsLyogMHg4MC0weDg3ICovCisJMHhDRURELDB4Q0VERSwweENFREYsMHhDRUUwLDB4Q0VFMSwweENFRTIsMHhDRUUzLDB4Q0VFNiwvKiAweDg4LTB4OEYgKi8KKwkweENFRTcsMHhDRUU5LDB4Q0VFQSwweENFRUQsMHhDRUVFLDB4Q0VFRiwweENFRjAsMHhDRUYxLC8qIDB4OTAtMHg5NyAqLworCTB4Q0VGMiwweENFRjMsMHhDRUY2LDB4Q0VGQSwweENFRkIsMHhDRUZDLDB4Q0VGRCwweENFRkUsLyogMHg5OC0weDlGICovCisJMHhDRUZGLDB4QUMwMCwweEFDMDEsMHhBQzA0LDB4QUMwNywweEFDMDgsMHhBQzA5LDB4QUMwQSwvKiAweEEwLTB4QTcgKi8KKwkweEFDMTAsMHhBQzExLDB4QUMxMiwweEFDMTMsMHhBQzE0LDB4QUMxNSwweEFDMTYsMHhBQzE3LC8qIDB4QTgtMHhBRiAqLworCTB4QUMxOSwweEFDMUEsMHhBQzFCLDB4QUMxQywweEFDMUQsMHhBQzIwLDB4QUMyNCwweEFDMkMsLyogMHhCMC0weEI3ICovCisJMHhBQzJELDB4QUMyRiwweEFDMzAsMHhBQzMxLDB4QUMzOCwweEFDMzksMHhBQzNDLDB4QUM0MCwvKiAweEI4LTB4QkYgKi8KKwkweEFDNEIsMHhBQzRELDB4QUM1NCwweEFDNTgsMHhBQzVDLDB4QUM3MCwweEFDNzEsMHhBQzc0LC8qIDB4QzAtMHhDNyAqLworCTB4QUM3NywweEFDNzgsMHhBQzdBLDB4QUM4MCwweEFDODEsMHhBQzgzLDB4QUM4NCwweEFDODUsLyogMHhDOC0weENGICovCisJMHhBQzg2LDB4QUM4OSwweEFDOEEsMHhBQzhCLDB4QUM4QywweEFDOTAsMHhBQzk0LDB4QUM5QywvKiAweEQwLTB4RDcgKi8KKwkweEFDOUQsMHhBQzlGLDB4QUNBMCwweEFDQTEsMHhBQ0E4LDB4QUNBOSwweEFDQUEsMHhBQ0FDLC8qIDB4RDgtMHhERiAqLworCTB4QUNBRiwweEFDQjAsMHhBQ0I4LDB4QUNCOSwweEFDQkIsMHhBQ0JDLDB4QUNCRCwweEFDQzEsLyogMHhFMC0weEU3ICovCisJMHhBQ0M0LDB4QUNDOCwweEFDQ0MsMHhBQ0Q1LDB4QUNENywweEFDRTAsMHhBQ0UxLDB4QUNFNCwvKiAweEU4LTB4RUYgKi8KKwkweEFDRTcsMHhBQ0U4LDB4QUNFQSwweEFDRUMsMHhBQ0VGLDB4QUNGMCwweEFDRjEsMHhBQ0YzLC8qIDB4RjAtMHhGNyAqLworCTB4QUNGNSwweEFDRjYsMHhBQ0ZDLDB4QUNGRCwweEFEMDAsMHhBRDA0LDB4QUQwNiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQjFbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4Q0YwMiwweENGMDMsMHhDRjA1LDB4Q0YwNiwweENGMDcsMHhDRjA5LDB4Q0YwQSwvKiAweDQwLTB4NDcgKi8KKwkweENGMEIsMHhDRjBDLDB4Q0YwRCwweENGMEUsMHhDRjBGLDB4Q0YxMiwweENGMTQsMHhDRjE2LC8qIDB4NDgtMHg0RiAqLworCTB4Q0YxNywweENGMTgsMHhDRjE5LDB4Q0YxQSwweENGMUIsMHhDRjFELDB4Q0YxRSwweENGMUYsLyogMHg1MC0weDU3ICovCisJMHhDRjIxLDB4Q0YyMiwweENGMjMsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhDRjI1LDB4Q0YyNiwweENGMjcsMHhDRjI4LDB4Q0YyOSwweENGMkEsMHhDRjJCLC8qIDB4NjAtMHg2NyAqLworCTB4Q0YyRSwweENGMzIsMHhDRjMzLDB4Q0YzNCwweENGMzUsMHhDRjM2LDB4Q0YzNywweENGMzksLyogMHg2OC0weDZGICovCisJMHhDRjNBLDB4Q0YzQiwweENGM0MsMHhDRjNELDB4Q0YzRSwweENGM0YsMHhDRjQwLDB4Q0Y0MSwvKiAweDcwLTB4NzcgKi8KKwkweENGNDIsMHhDRjQzLDB4Q0Y0NCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4Q0Y0NSwweENGNDYsMHhDRjQ3LDB4Q0Y0OCwweENGNDksMHhDRjRBLDB4Q0Y0QiwvKiAweDgwLTB4ODcgKi8KKwkweENGNEMsMHhDRjRELDB4Q0Y0RSwweENGNEYsMHhDRjUwLDB4Q0Y1MSwweENGNTIsMHhDRjUzLC8qIDB4ODgtMHg4RiAqLworCTB4Q0Y1NiwweENGNTcsMHhDRjU5LDB4Q0Y1QSwweENGNUIsMHhDRjVELDB4Q0Y1RSwweENGNUYsLyogMHg5MC0weDk3ICovCisJMHhDRjYwLDB4Q0Y2MSwweENGNjIsMHhDRjYzLDB4Q0Y2NiwweENGNjgsMHhDRjZBLDB4Q0Y2QiwvKiAweDk4LTB4OUYgKi8KKwkweENGNkMsMHhBRDBDLDB4QUQwRCwweEFEMEYsMHhBRDExLDB4QUQxOCwweEFEMUMsMHhBRDIwLC8qIDB4QTAtMHhBNyAqLworCTB4QUQyOSwweEFEMkMsMHhBRDJELDB4QUQzNCwweEFEMzUsMHhBRDM4LDB4QUQzQywweEFENDQsLyogMHhBOC0weEFGICovCisJMHhBRDQ1LDB4QUQ0NywweEFENDksMHhBRDUwLDB4QUQ1NCwweEFENTgsMHhBRDYxLDB4QUQ2MywvKiAweEIwLTB4QjcgKi8KKwkweEFENkMsMHhBRDZELDB4QUQ3MCwweEFENzMsMHhBRDc0LDB4QUQ3NSwweEFENzYsMHhBRDdCLC8qIDB4QjgtMHhCRiAqLworCTB4QUQ3QywweEFEN0QsMHhBRDdGLDB4QUQ4MSwweEFEODIsMHhBRDg4LDB4QUQ4OSwweEFEOEMsLyogMHhDMC0weEM3ICovCisJMHhBRDkwLDB4QUQ5QywweEFEOUQsMHhBREE0LDB4QURCNywweEFEQzAsMHhBREMxLDB4QURDNCwvKiAweEM4LTB4Q0YgKi8KKwkweEFEQzgsMHhBREQwLDB4QUREMSwweEFERDMsMHhBRERDLDB4QURFMCwweEFERTQsMHhBREY4LC8qIDB4RDAtMHhENyAqLworCTB4QURGOSwweEFERkMsMHhBREZGLDB4QUUwMCwweEFFMDEsMHhBRTA4LDB4QUUwOSwweEFFMEIsLyogMHhEOC0weERGICovCisJMHhBRTBELDB4QUUxNCwweEFFMzAsMHhBRTMxLDB4QUUzNCwweEFFMzcsMHhBRTM4LDB4QUUzQSwvKiAweEUwLTB4RTcgKi8KKwkweEFFNDAsMHhBRTQxLDB4QUU0MywweEFFNDUsMHhBRTQ2LDB4QUU0QSwweEFFNEMsMHhBRTRELC8qIDB4RTgtMHhFRiAqLworCTB4QUU0RSwweEFFNTAsMHhBRTU0LDB4QUU1NiwweEFFNUMsMHhBRTVELDB4QUU1RiwweEFFNjAsLyogMHhGMC0weEY3ICovCisJMHhBRTYxLDB4QUU2NSwweEFFNjgsMHhBRTY5LDB4QUU2QywweEFFNzAsMHhBRTc4LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9CMlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhDRjZELDB4Q0Y2RSwweENGNkYsMHhDRjcyLDB4Q0Y3MywweENGNzUsMHhDRjc2LC8qIDB4NDAtMHg0NyAqLworCTB4Q0Y3NywweENGNzksMHhDRjdBLDB4Q0Y3QiwweENGN0MsMHhDRjdELDB4Q0Y3RSwweENGN0YsLyogMHg0OC0weDRGICovCisJMHhDRjgxLDB4Q0Y4MiwweENGODMsMHhDRjg0LDB4Q0Y4NiwweENGODcsMHhDRjg4LDB4Q0Y4OSwvKiAweDUwLTB4NTcgKi8KKwkweENGOEEsMHhDRjhCLDB4Q0Y4RCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweENGOEUsMHhDRjhGLDB4Q0Y5MCwweENGOTEsMHhDRjkyLDB4Q0Y5MywweENGOTQsLyogMHg2MC0weDY3ICovCisJMHhDRjk1LDB4Q0Y5NiwweENGOTcsMHhDRjk4LDB4Q0Y5OSwweENGOUEsMHhDRjlCLDB4Q0Y5QywvKiAweDY4LTB4NkYgKi8KKwkweENGOUQsMHhDRjlFLDB4Q0Y5RiwweENGQTAsMHhDRkEyLDB4Q0ZBMywweENGQTQsMHhDRkE1LC8qIDB4NzAtMHg3NyAqLworCTB4Q0ZBNiwweENGQTcsMHhDRkE5LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhDRkFBLDB4Q0ZBQiwweENGQUMsMHhDRkFELDB4Q0ZBRSwweENGQUYsMHhDRkIxLC8qIDB4ODAtMHg4NyAqLworCTB4Q0ZCMiwweENGQjMsMHhDRkI0LDB4Q0ZCNSwweENGQjYsMHhDRkI3LDB4Q0ZCOCwweENGQjksLyogMHg4OC0weDhGICovCisJMHhDRkJBLDB4Q0ZCQiwweENGQkMsMHhDRkJELDB4Q0ZCRSwweENGQkYsMHhDRkMwLDB4Q0ZDMSwvKiAweDkwLTB4OTcgKi8KKwkweENGQzIsMHhDRkMzLDB4Q0ZDNSwweENGQzYsMHhDRkM3LDB4Q0ZDOCwweENGQzksMHhDRkNBLC8qIDB4OTgtMHg5RiAqLworCTB4Q0ZDQiwweEFFNzksMHhBRTdCLDB4QUU3QywweEFFN0QsMHhBRTg0LDB4QUU4NSwweEFFOEMsLyogMHhBMC0weEE3ICovCisJMHhBRUJDLDB4QUVCRCwweEFFQkUsMHhBRUMwLDB4QUVDNCwweEFFQ0MsMHhBRUNELDB4QUVDRiwvKiAweEE4LTB4QUYgKi8KKwkweEFFRDAsMHhBRUQxLDB4QUVEOCwweEFFRDksMHhBRURDLDB4QUVFOCwweEFFRUIsMHhBRUVELC8qIDB4QjAtMHhCNyAqLworCTB4QUVGNCwweEFFRjgsMHhBRUZDLDB4QUYwNywweEFGMDgsMHhBRjBELDB4QUYxMCwweEFGMkMsLyogMHhCOC0weEJGICovCisJMHhBRjJELDB4QUYzMCwweEFGMzIsMHhBRjM0LDB4QUYzQywweEFGM0QsMHhBRjNGLDB4QUY0MSwvKiAweEMwLTB4QzcgKi8KKwkweEFGNDIsMHhBRjQzLDB4QUY0OCwweEFGNDksMHhBRjUwLDB4QUY1QywweEFGNUQsMHhBRjY0LC8qIDB4QzgtMHhDRiAqLworCTB4QUY2NSwweEFGNzksMHhBRjgwLDB4QUY4NCwweEFGODgsMHhBRjkwLDB4QUY5MSwweEFGOTUsLyogMHhEMC0weEQ3ICovCisJMHhBRjlDLDB4QUZCOCwweEFGQjksMHhBRkJDLDB4QUZDMCwweEFGQzcsMHhBRkM4LDB4QUZDOSwvKiAweEQ4LTB4REYgKi8KKwkweEFGQ0IsMHhBRkNELDB4QUZDRSwweEFGRDQsMHhBRkRDLDB4QUZFOCwweEFGRTksMHhBRkYwLC8qIDB4RTAtMHhFNyAqLworCTB4QUZGMSwweEFGRjQsMHhBRkY4LDB4QjAwMCwweEIwMDEsMHhCMDA0LDB4QjAwQywweEIwMTAsLyogMHhFOC0weEVGICovCisJMHhCMDE0LDB4QjAxQywweEIwMUQsMHhCMDI4LDB4QjA0NCwweEIwNDUsMHhCMDQ4LDB4QjA0QSwvKiAweEYwLTB4RjcgKi8KKwkweEIwNEMsMHhCMDRFLDB4QjA1MywweEIwNTQsMHhCMDU1LDB4QjA1NywweEIwNTksMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0IzWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweENGQ0MsMHhDRkNELDB4Q0ZDRSwweENGQ0YsMHhDRkQwLDB4Q0ZEMSwweENGRDIsLyogMHg0MC0weDQ3ICovCisJMHhDRkQzLDB4Q0ZENCwweENGRDUsMHhDRkQ2LDB4Q0ZENywweENGRDgsMHhDRkQ5LDB4Q0ZEQSwvKiAweDQ4LTB4NEYgKi8KKwkweENGREIsMHhDRkRDLDB4Q0ZERCwweENGREUsMHhDRkRGLDB4Q0ZFMiwweENGRTMsMHhDRkU1LC8qIDB4NTAtMHg1NyAqLworCTB4Q0ZFNiwweENGRTcsMHhDRkU5LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4Q0ZFQSwweENGRUIsMHhDRkVDLDB4Q0ZFRCwweENGRUUsMHhDRkVGLDB4Q0ZGMiwvKiAweDYwLTB4NjcgKi8KKwkweENGRjQsMHhDRkY2LDB4Q0ZGNywweENGRjgsMHhDRkY5LDB4Q0ZGQSwweENGRkIsMHhDRkZELC8qIDB4NjgtMHg2RiAqLworCTB4Q0ZGRSwweENGRkYsMHhEMDAxLDB4RDAwMiwweEQwMDMsMHhEMDA1LDB4RDAwNiwweEQwMDcsLyogMHg3MC0weDc3ICovCisJMHhEMDA4LDB4RDAwOSwweEQwMEEsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEQwMEIsMHhEMDBDLDB4RDAwRCwweEQwMEUsMHhEMDBGLDB4RDAxMCwweEQwMTIsLyogMHg4MC0weDg3ICovCisJMHhEMDEzLDB4RDAxNCwweEQwMTUsMHhEMDE2LDB4RDAxNywweEQwMTksMHhEMDFBLDB4RDAxQiwvKiAweDg4LTB4OEYgKi8KKwkweEQwMUMsMHhEMDFELDB4RDAxRSwweEQwMUYsMHhEMDIwLDB4RDAyMSwweEQwMjIsMHhEMDIzLC8qIDB4OTAtMHg5NyAqLworCTB4RDAyNCwweEQwMjUsMHhEMDI2LDB4RDAyNywweEQwMjgsMHhEMDI5LDB4RDAyQSwweEQwMkIsLyogMHg5OC0weDlGICovCisJMHhEMDJDLDB4QjA1RCwweEIwN0MsMHhCMDdELDB4QjA4MCwweEIwODQsMHhCMDhDLDB4QjA4RCwvKiAweEEwLTB4QTcgKi8KKwkweEIwOEYsMHhCMDkxLDB4QjA5OCwweEIwOTksMHhCMDlBLDB4QjA5QywweEIwOUYsMHhCMEEwLC8qIDB4QTgtMHhBRiAqLworCTB4QjBBMSwweEIwQTIsMHhCMEE4LDB4QjBBOSwweEIwQUIsMHhCMEFDLDB4QjBBRCwweEIwQUUsLyogMHhCMC0weEI3ICovCisJMHhCMEFGLDB4QjBCMSwweEIwQjMsMHhCMEI0LDB4QjBCNSwweEIwQjgsMHhCMEJDLDB4QjBDNCwvKiAweEI4LTB4QkYgKi8KKwkweEIwQzUsMHhCMEM3LDB4QjBDOCwweEIwQzksMHhCMEQwLDB4QjBEMSwweEIwRDQsMHhCMEQ4LC8qIDB4QzAtMHhDNyAqLworCTB4QjBFMCwweEIwRTUsMHhCMTA4LDB4QjEwOSwweEIxMEIsMHhCMTBDLDB4QjExMCwweEIxMTIsLyogMHhDOC0weENGICovCisJMHhCMTEzLDB4QjExOCwweEIxMTksMHhCMTFCLDB4QjExQywweEIxMUQsMHhCMTIzLDB4QjEyNCwvKiAweEQwLTB4RDcgKi8KKwkweEIxMjUsMHhCMTI4LDB4QjEyQywweEIxMzQsMHhCMTM1LDB4QjEzNywweEIxMzgsMHhCMTM5LC8qIDB4RDgtMHhERiAqLworCTB4QjE0MCwweEIxNDEsMHhCMTQ0LDB4QjE0OCwweEIxNTAsMHhCMTUxLDB4QjE1NCwweEIxNTUsLyogMHhFMC0weEU3ICovCisJMHhCMTU4LDB4QjE1QywweEIxNjAsMHhCMTc4LDB4QjE3OSwweEIxN0MsMHhCMTgwLDB4QjE4MiwvKiAweEU4LTB4RUYgKi8KKwkweEIxODgsMHhCMTg5LDB4QjE4QiwweEIxOEQsMHhCMTkyLDB4QjE5MywweEIxOTQsMHhCMTk4LC8qIDB4RjAtMHhGNyAqLworCTB4QjE5QywweEIxQTgsMHhCMUNDLDB4QjFEMCwweEIxRDQsMHhCMURDLDB4QjFERCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQjRbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4RDAyRSwweEQwMkYsMHhEMDMwLDB4RDAzMSwweEQwMzIsMHhEMDMzLDB4RDAzNiwvKiAweDQwLTB4NDcgKi8KKwkweEQwMzcsMHhEMDM5LDB4RDAzQSwweEQwM0IsMHhEMDNELDB4RDAzRSwweEQwM0YsMHhEMDQwLC8qIDB4NDgtMHg0RiAqLworCTB4RDA0MSwweEQwNDIsMHhEMDQzLDB4RDA0NiwweEQwNDgsMHhEMDRBLDB4RDA0QiwweEQwNEMsLyogMHg1MC0weDU3ICovCisJMHhEMDRELDB4RDA0RSwweEQwNEYsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhEMDUxLDB4RDA1MiwweEQwNTMsMHhEMDU1LDB4RDA1NiwweEQwNTcsMHhEMDU5LC8qIDB4NjAtMHg2NyAqLworCTB4RDA1QSwweEQwNUIsMHhEMDVDLDB4RDA1RCwweEQwNUUsMHhEMDVGLDB4RDA2MSwweEQwNjIsLyogMHg2OC0weDZGICovCisJMHhEMDYzLDB4RDA2NCwweEQwNjUsMHhEMDY2LDB4RDA2NywweEQwNjgsMHhEMDY5LDB4RDA2QSwvKiAweDcwLTB4NzcgKi8KKwkweEQwNkIsMHhEMDZFLDB4RDA2RiwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4RDA3MSwweEQwNzIsMHhEMDczLDB4RDA3NSwweEQwNzYsMHhEMDc3LDB4RDA3OCwvKiAweDgwLTB4ODcgKi8KKwkweEQwNzksMHhEMDdBLDB4RDA3QiwweEQwN0UsMHhEMDdGLDB4RDA4MCwweEQwODIsMHhEMDgzLC8qIDB4ODgtMHg4RiAqLworCTB4RDA4NCwweEQwODUsMHhEMDg2LDB4RDA4NywweEQwODgsMHhEMDg5LDB4RDA4QSwweEQwOEIsLyogMHg5MC0weDk3ICovCisJMHhEMDhDLDB4RDA4RCwweEQwOEUsMHhEMDhGLDB4RDA5MCwweEQwOTEsMHhEMDkyLDB4RDA5MywvKiAweDk4LTB4OUYgKi8KKwkweEQwOTQsMHhCMURGLDB4QjFFOCwweEIxRTksMHhCMUVDLDB4QjFGMCwweEIxRjksMHhCMUZCLC8qIDB4QTAtMHhBNyAqLworCTB4QjFGRCwweEIyMDQsMHhCMjA1LDB4QjIwOCwweEIyMEIsMHhCMjBDLDB4QjIxNCwweEIyMTUsLyogMHhBOC0weEFGICovCisJMHhCMjE3LDB4QjIxOSwweEIyMjAsMHhCMjM0LDB4QjIzQywweEIyNTgsMHhCMjVDLDB4QjI2MCwvKiAweEIwLTB4QjcgKi8KKwkweEIyNjgsMHhCMjY5LDB4QjI3NCwweEIyNzUsMHhCMjdDLDB4QjI4NCwweEIyODUsMHhCMjg5LC8qIDB4QjgtMHhCRiAqLworCTB4QjI5MCwweEIyOTEsMHhCMjk0LDB4QjI5OCwweEIyOTksMHhCMjlBLDB4QjJBMCwweEIyQTEsLyogMHhDMC0weEM3ICovCisJMHhCMkEzLDB4QjJBNSwweEIyQTYsMHhCMkFBLDB4QjJBQywweEIyQjAsMHhCMkI0LDB4QjJDOCwvKiAweEM4LTB4Q0YgKi8KKwkweEIyQzksMHhCMkNDLDB4QjJEMCwweEIyRDIsMHhCMkQ4LDB4QjJEOSwweEIyREIsMHhCMkRELC8qIDB4RDAtMHhENyAqLworCTB4QjJFMiwweEIyRTQsMHhCMkU1LDB4QjJFNiwweEIyRTgsMHhCMkVCLDB4QjJFQywweEIyRUQsLyogMHhEOC0weERGICovCisJMHhCMkVFLDB4QjJFRiwweEIyRjMsMHhCMkY0LDB4QjJGNSwweEIyRjcsMHhCMkY4LDB4QjJGOSwvKiAweEUwLTB4RTcgKi8KKwkweEIyRkEsMHhCMkZCLDB4QjJGRiwweEIzMDAsMHhCMzAxLDB4QjMwNCwweEIzMDgsMHhCMzEwLC8qIDB4RTgtMHhFRiAqLworCTB4QjMxMSwweEIzMTMsMHhCMzE0LDB4QjMxNSwweEIzMUMsMHhCMzU0LDB4QjM1NSwweEIzNTYsLyogMHhGMC0weEY3ICovCisJMHhCMzU4LDB4QjM1QiwweEIzNUMsMHhCMzVFLDB4QjM1RiwweEIzNjQsMHhCMzY1LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9CNVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhEMDk1LDB4RDA5NiwweEQwOTcsMHhEMDk4LDB4RDA5OSwweEQwOUEsMHhEMDlCLC8qIDB4NDAtMHg0NyAqLworCTB4RDA5QywweEQwOUQsMHhEMDlFLDB4RDA5RiwweEQwQTAsMHhEMEExLDB4RDBBMiwweEQwQTMsLyogMHg0OC0weDRGICovCisJMHhEMEE2LDB4RDBBNywweEQwQTksMHhEMEFBLDB4RDBBQiwweEQwQUQsMHhEMEFFLDB4RDBBRiwvKiAweDUwLTB4NTcgKi8KKwkweEQwQjAsMHhEMEIxLDB4RDBCMiwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEQwQjMsMHhEMEI2LDB4RDBCOCwweEQwQkEsMHhEMEJCLDB4RDBCQywweEQwQkQsLyogMHg2MC0weDY3ICovCisJMHhEMEJFLDB4RDBCRiwweEQwQzIsMHhEMEMzLDB4RDBDNSwweEQwQzYsMHhEMEM3LDB4RDBDQSwvKiAweDY4LTB4NkYgKi8KKwkweEQwQ0IsMHhEMENDLDB4RDBDRCwweEQwQ0UsMHhEMENGLDB4RDBEMiwweEQwRDYsMHhEMEQ3LC8qIDB4NzAtMHg3NyAqLworCTB4RDBEOCwweEQwRDksMHhEMERBLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhEMERCLDB4RDBERSwweEQwREYsMHhEMEUxLDB4RDBFMiwweEQwRTMsMHhEMEU1LC8qIDB4ODAtMHg4NyAqLworCTB4RDBFNiwweEQwRTcsMHhEMEU4LDB4RDBFOSwweEQwRUEsMHhEMEVCLDB4RDBFRSwweEQwRjIsLyogMHg4OC0weDhGICovCisJMHhEMEYzLDB4RDBGNCwweEQwRjUsMHhEMEY2LDB4RDBGNywweEQwRjksMHhEMEZBLDB4RDBGQiwvKiAweDkwLTB4OTcgKi8KKwkweEQwRkMsMHhEMEZELDB4RDBGRSwweEQwRkYsMHhEMTAwLDB4RDEwMSwweEQxMDIsMHhEMTAzLC8qIDB4OTgtMHg5RiAqLworCTB4RDEwNCwweEIzNjcsMHhCMzY5LDB4QjM2QiwweEIzNkUsMHhCMzcwLDB4QjM3MSwweEIzNzQsLyogMHhBMC0weEE3ICovCisJMHhCMzc4LDB4QjM4MCwweEIzODEsMHhCMzgzLDB4QjM4NCwweEIzODUsMHhCMzhDLDB4QjM5MCwvKiAweEE4LTB4QUYgKi8KKwkweEIzOTQsMHhCM0EwLDB4QjNBMSwweEIzQTgsMHhCM0FDLDB4QjNDNCwweEIzQzUsMHhCM0M4LC8qIDB4QjAtMHhCNyAqLworCTB4QjNDQiwweEIzQ0MsMHhCM0NFLDB4QjNEMCwweEIzRDQsMHhCM0Q1LDB4QjNENywweEIzRDksLyogMHhCOC0weEJGICovCisJMHhCM0RCLDB4QjNERCwweEIzRTAsMHhCM0U0LDB4QjNFOCwweEIzRkMsMHhCNDEwLDB4QjQxOCwvKiAweEMwLTB4QzcgKi8KKwkweEI0MUMsMHhCNDIwLDB4QjQyOCwweEI0MjksMHhCNDJCLDB4QjQzNCwweEI0NTAsMHhCNDUxLC8qIDB4QzgtMHhDRiAqLworCTB4QjQ1NCwweEI0NTgsMHhCNDYwLDB4QjQ2MSwweEI0NjMsMHhCNDY1LDB4QjQ2QywweEI0ODAsLyogMHhEMC0weEQ3ICovCisJMHhCNDg4LDB4QjQ5RCwweEI0QTQsMHhCNEE4LDB4QjRBQywweEI0QjUsMHhCNEI3LDB4QjRCOSwvKiAweEQ4LTB4REYgKi8KKwkweEI0QzAsMHhCNEM0LDB4QjRDOCwweEI0RDAsMHhCNEQ1LDB4QjREQywweEI0REQsMHhCNEUwLC8qIDB4RTAtMHhFNyAqLworCTB4QjRFMywweEI0RTQsMHhCNEU2LDB4QjRFQywweEI0RUQsMHhCNEVGLDB4QjRGMSwweEI0RjgsLyogMHhFOC0weEVGICovCisJMHhCNTE0LDB4QjUxNSwweEI1MTgsMHhCNTFCLDB4QjUxQywweEI1MjQsMHhCNTI1LDB4QjUyNywvKiAweEYwLTB4RjcgKi8KKwkweEI1MjgsMHhCNTI5LDB4QjUyQSwweEI1MzAsMHhCNTMxLDB4QjUzNCwweEI1MzgsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0I2WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEQxMDUsMHhEMTA2LDB4RDEwNywweEQxMDgsMHhEMTA5LDB4RDEwQSwweEQxMEIsLyogMHg0MC0weDQ3ICovCisJMHhEMTBDLDB4RDEwRSwweEQxMEYsMHhEMTEwLDB4RDExMSwweEQxMTIsMHhEMTEzLDB4RDExNCwvKiAweDQ4LTB4NEYgKi8KKwkweEQxMTUsMHhEMTE2LDB4RDExNywweEQxMTgsMHhEMTE5LDB4RDExQSwweEQxMUIsMHhEMTFDLC8qIDB4NTAtMHg1NyAqLworCTB4RDExRCwweEQxMUUsMHhEMTFGLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4RDEyMCwweEQxMjEsMHhEMTIyLDB4RDEyMywweEQxMjQsMHhEMTI1LDB4RDEyNiwvKiAweDYwLTB4NjcgKi8KKwkweEQxMjcsMHhEMTI4LDB4RDEyOSwweEQxMkEsMHhEMTJCLDB4RDEyQywweEQxMkQsMHhEMTJFLC8qIDB4NjgtMHg2RiAqLworCTB4RDEyRiwweEQxMzIsMHhEMTMzLDB4RDEzNSwweEQxMzYsMHhEMTM3LDB4RDEzOSwweEQxM0IsLyogMHg3MC0weDc3ICovCisJMHhEMTNDLDB4RDEzRCwweEQxM0UsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEQxM0YsMHhEMTQyLDB4RDE0NiwweEQxNDcsMHhEMTQ4LDB4RDE0OSwweEQxNEEsLyogMHg4MC0weDg3ICovCisJMHhEMTRCLDB4RDE0RSwweEQxNEYsMHhEMTUxLDB4RDE1MiwweEQxNTMsMHhEMTU1LDB4RDE1NiwvKiAweDg4LTB4OEYgKi8KKwkweEQxNTcsMHhEMTU4LDB4RDE1OSwweEQxNUEsMHhEMTVCLDB4RDE1RSwweEQxNjAsMHhEMTYyLC8qIDB4OTAtMHg5NyAqLworCTB4RDE2MywweEQxNjQsMHhEMTY1LDB4RDE2NiwweEQxNjcsMHhEMTY5LDB4RDE2QSwweEQxNkIsLyogMHg5OC0weDlGICovCisJMHhEMTZELDB4QjU0MCwweEI1NDEsMHhCNTQzLDB4QjU0NCwweEI1NDUsMHhCNTRCLDB4QjU0QywvKiAweEEwLTB4QTcgKi8KKwkweEI1NEQsMHhCNTUwLDB4QjU1NCwweEI1NUMsMHhCNTVELDB4QjU1RiwweEI1NjAsMHhCNTYxLC8qIDB4QTgtMHhBRiAqLworCTB4QjVBMCwweEI1QTEsMHhCNUE0LDB4QjVBOCwweEI1QUEsMHhCNUFCLDB4QjVCMCwweEI1QjEsLyogMHhCMC0weEI3ICovCisJMHhCNUIzLDB4QjVCNCwweEI1QjUsMHhCNUJCLDB4QjVCQywweEI1QkQsMHhCNUMwLDB4QjVDNCwvKiAweEI4LTB4QkYgKi8KKwkweEI1Q0MsMHhCNUNELDB4QjVDRiwweEI1RDAsMHhCNUQxLDB4QjVEOCwweEI1RUMsMHhCNjEwLC8qIDB4QzAtMHhDNyAqLworCTB4QjYxMSwweEI2MTQsMHhCNjE4LDB4QjYyNSwweEI2MkMsMHhCNjM0LDB4QjY0OCwweEI2NjQsLyogMHhDOC0weENGICovCisJMHhCNjY4LDB4QjY5QywweEI2OUQsMHhCNkEwLDB4QjZBNCwweEI2QUIsMHhCNkFDLDB4QjZCMSwvKiAweEQwLTB4RDcgKi8KKwkweEI2RDQsMHhCNkYwLDB4QjZGNCwweEI2RjgsMHhCNzAwLDB4QjcwMSwweEI3MDUsMHhCNzI4LC8qIDB4RDgtMHhERiAqLworCTB4QjcyOSwweEI3MkMsMHhCNzJGLDB4QjczMCwweEI3MzgsMHhCNzM5LDB4QjczQiwweEI3NDQsLyogMHhFMC0weEU3ICovCisJMHhCNzQ4LDB4Qjc0QywweEI3NTQsMHhCNzU1LDB4Qjc2MCwweEI3NjQsMHhCNzY4LDB4Qjc3MCwvKiAweEU4LTB4RUYgKi8KKwkweEI3NzEsMHhCNzczLDB4Qjc3NSwweEI3N0MsMHhCNzdELDB4Qjc4MCwweEI3ODQsMHhCNzhDLC8qIDB4RjAtMHhGNyAqLworCTB4Qjc4RCwweEI3OEYsMHhCNzkwLDB4Qjc5MSwweEI3OTIsMHhCNzk2LDB4Qjc5NywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQjdbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4RDE2RSwweEQxNkYsMHhEMTcwLDB4RDE3MSwweEQxNzIsMHhEMTczLDB4RDE3NCwvKiAweDQwLTB4NDcgKi8KKwkweEQxNzUsMHhEMTc2LDB4RDE3NywweEQxNzgsMHhEMTc5LDB4RDE3QSwweEQxN0IsMHhEMTdELC8qIDB4NDgtMHg0RiAqLworCTB4RDE3RSwweEQxN0YsMHhEMTgwLDB4RDE4MSwweEQxODIsMHhEMTgzLDB4RDE4NSwweEQxODYsLyogMHg1MC0weDU3ICovCisJMHhEMTg3LDB4RDE4OSwweEQxOEEsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhEMThCLDB4RDE4QywweEQxOEQsMHhEMThFLDB4RDE4RiwweEQxOTAsMHhEMTkxLC8qIDB4NjAtMHg2NyAqLworCTB4RDE5MiwweEQxOTMsMHhEMTk0LDB4RDE5NSwweEQxOTYsMHhEMTk3LDB4RDE5OCwweEQxOTksLyogMHg2OC0weDZGICovCisJMHhEMTlBLDB4RDE5QiwweEQxOUMsMHhEMTlELDB4RDE5RSwweEQxOUYsMHhEMUEyLDB4RDFBMywvKiAweDcwLTB4NzcgKi8KKwkweEQxQTUsMHhEMUE2LDB4RDFBNywweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4RDFBOSwweEQxQUEsMHhEMUFCLDB4RDFBQywweEQxQUQsMHhEMUFFLDB4RDFBRiwvKiAweDgwLTB4ODcgKi8KKwkweEQxQjIsMHhEMUI0LDB4RDFCNiwweEQxQjcsMHhEMUI4LDB4RDFCOSwweEQxQkIsMHhEMUJELC8qIDB4ODgtMHg4RiAqLworCTB4RDFCRSwweEQxQkYsMHhEMUMxLDB4RDFDMiwweEQxQzMsMHhEMUM0LDB4RDFDNSwweEQxQzYsLyogMHg5MC0weDk3ICovCisJMHhEMUM3LDB4RDFDOCwweEQxQzksMHhEMUNBLDB4RDFDQiwweEQxQ0MsMHhEMUNELDB4RDFDRSwvKiAweDk4LTB4OUYgKi8KKwkweEQxQ0YsMHhCNzk4LDB4Qjc5OSwweEI3OUMsMHhCN0EwLDB4QjdBOCwweEI3QTksMHhCN0FCLC8qIDB4QTAtMHhBNyAqLworCTB4QjdBQywweEI3QUQsMHhCN0I0LDB4QjdCNSwweEI3QjgsMHhCN0M3LDB4QjdDOSwweEI3RUMsLyogMHhBOC0weEFGICovCisJMHhCN0VELDB4QjdGMCwweEI3RjQsMHhCN0ZDLDB4QjdGRCwweEI3RkYsMHhCODAwLDB4QjgwMSwvKiAweEIwLTB4QjcgKi8KKwkweEI4MDcsMHhCODA4LDB4QjgwOSwweEI4MEMsMHhCODEwLDB4QjgxOCwweEI4MTksMHhCODFCLC8qIDB4QjgtMHhCRiAqLworCTB4QjgxRCwweEI4MjQsMHhCODI1LDB4QjgyOCwweEI4MkMsMHhCODM0LDB4QjgzNSwweEI4MzcsLyogMHhDMC0weEM3ICovCisJMHhCODM4LDB4QjgzOSwweEI4NDAsMHhCODQ0LDB4Qjg1MSwweEI4NTMsMHhCODVDLDB4Qjg1RCwvKiAweEM4LTB4Q0YgKi8KKwkweEI4NjAsMHhCODY0LDB4Qjg2QywweEI4NkQsMHhCODZGLDB4Qjg3MSwweEI4NzgsMHhCODdDLC8qIDB4RDAtMHhENyAqLworCTB4Qjg4RCwweEI4QTgsMHhCOEIwLDB4QjhCNCwweEI4QjgsMHhCOEMwLDB4QjhDMSwweEI4QzMsLyogMHhEOC0weERGICovCisJMHhCOEM1LDB4QjhDQywweEI4RDAsMHhCOEQ0LDB4QjhERCwweEI4REYsMHhCOEUxLDB4QjhFOCwvKiAweEUwLTB4RTcgKi8KKwkweEI4RTksMHhCOEVDLDB4QjhGMCwweEI4RjgsMHhCOEY5LDB4QjhGQiwweEI4RkQsMHhCOTA0LC8qIDB4RTgtMHhFRiAqLworCTB4QjkxOCwweEI5MjAsMHhCOTNDLDB4QjkzRCwweEI5NDAsMHhCOTQ0LDB4Qjk0QywweEI5NEYsLyogMHhGMC0weEY3ICovCisJMHhCOTUxLDB4Qjk1OCwweEI5NTksMHhCOTVDLDB4Qjk2MCwweEI5NjgsMHhCOTY5LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9COFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhEMUQwLDB4RDFEMSwweEQxRDIsMHhEMUQzLDB4RDFENCwweEQxRDUsMHhEMUQ2LC8qIDB4NDAtMHg0NyAqLworCTB4RDFENywweEQxRDksMHhEMURBLDB4RDFEQiwweEQxREMsMHhEMURELDB4RDFERSwweEQxREYsLyogMHg0OC0weDRGICovCisJMHhEMUUwLDB4RDFFMSwweEQxRTIsMHhEMUUzLDB4RDFFNCwweEQxRTUsMHhEMUU2LDB4RDFFNywvKiAweDUwLTB4NTcgKi8KKwkweEQxRTgsMHhEMUU5LDB4RDFFQSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEQxRUIsMHhEMUVDLDB4RDFFRCwweEQxRUUsMHhEMUVGLDB4RDFGMCwweEQxRjEsLyogMHg2MC0weDY3ICovCisJMHhEMUYyLDB4RDFGMywweEQxRjUsMHhEMUY2LDB4RDFGNywweEQxRjksMHhEMUZBLDB4RDFGQiwvKiAweDY4LTB4NkYgKi8KKwkweEQxRkMsMHhEMUZELDB4RDFGRSwweEQxRkYsMHhEMjAwLDB4RDIwMSwweEQyMDIsMHhEMjAzLC8qIDB4NzAtMHg3NyAqLworCTB4RDIwNCwweEQyMDUsMHhEMjA2LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhEMjA4LDB4RDIwQSwweEQyMEIsMHhEMjBDLDB4RDIwRCwweEQyMEUsMHhEMjBGLC8qIDB4ODAtMHg4NyAqLworCTB4RDIxMSwweEQyMTIsMHhEMjEzLDB4RDIxNCwweEQyMTUsMHhEMjE2LDB4RDIxNywweEQyMTgsLyogMHg4OC0weDhGICovCisJMHhEMjE5LDB4RDIxQSwweEQyMUIsMHhEMjFDLDB4RDIxRCwweEQyMUUsMHhEMjFGLDB4RDIyMCwvKiAweDkwLTB4OTcgKi8KKwkweEQyMjEsMHhEMjIyLDB4RDIyMywweEQyMjQsMHhEMjI1LDB4RDIyNiwweEQyMjcsMHhEMjI4LC8qIDB4OTgtMHg5RiAqLworCTB4RDIyOSwweEI5NkIsMHhCOTZELDB4Qjk3NCwweEI5NzUsMHhCOTc4LDB4Qjk3QywweEI5ODQsLyogMHhBMC0weEE3ICovCisJMHhCOTg1LDB4Qjk4NywweEI5ODksMHhCOThBLDB4Qjk4RCwweEI5OEUsMHhCOUFDLDB4QjlBRCwvKiAweEE4LTB4QUYgKi8KKwkweEI5QjAsMHhCOUI0LDB4QjlCQywweEI5QkQsMHhCOUJGLDB4QjlDMSwweEI5QzgsMHhCOUM5LC8qIDB4QjAtMHhCNyAqLworCTB4QjlDQywweEI5Q0UsMHhCOUNGLDB4QjlEMCwweEI5RDEsMHhCOUQyLDB4QjlEOCwweEI5RDksLyogMHhCOC0weEJGICovCisJMHhCOURCLDB4QjlERCwweEI5REUsMHhCOUUxLDB4QjlFMywweEI5RTQsMHhCOUU1LDB4QjlFOCwvKiAweEMwLTB4QzcgKi8KKwkweEI5RUMsMHhCOUY0LDB4QjlGNSwweEI5RjcsMHhCOUY4LDB4QjlGOSwweEI5RkEsMHhCQTAwLC8qIDB4QzgtMHhDRiAqLworCTB4QkEwMSwweEJBMDgsMHhCQTE1LDB4QkEzOCwweEJBMzksMHhCQTNDLDB4QkE0MCwweEJBNDIsLyogMHhEMC0weEQ3ICovCisJMHhCQTQ4LDB4QkE0OSwweEJBNEIsMHhCQTRELDB4QkE0RSwweEJBNTMsMHhCQTU0LDB4QkE1NSwvKiAweEQ4LTB4REYgKi8KKwkweEJBNTgsMHhCQTVDLDB4QkE2NCwweEJBNjUsMHhCQTY3LDB4QkE2OCwweEJBNjksMHhCQTcwLC8qIDB4RTAtMHhFNyAqLworCTB4QkE3MSwweEJBNzQsMHhCQTc4LDB4QkE4MywweEJBODQsMHhCQTg1LDB4QkE4NywweEJBOEMsLyogMHhFOC0weEVGICovCisJMHhCQUE4LDB4QkFBOSwweEJBQUIsMHhCQUFDLDB4QkFCMCwweEJBQjIsMHhCQUI4LDB4QkFCOSwvKiAweEYwLTB4RjcgKi8KKwkweEJBQkIsMHhCQUJELDB4QkFDNCwweEJBQzgsMHhCQUQ4LDB4QkFEOSwweEJBRkMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0I5WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEQyMkEsMHhEMjJCLDB4RDIyRSwweEQyMkYsMHhEMjMxLDB4RDIzMiwweEQyMzMsLyogMHg0MC0weDQ3ICovCisJMHhEMjM1LDB4RDIzNiwweEQyMzcsMHhEMjM4LDB4RDIzOSwweEQyM0EsMHhEMjNCLDB4RDIzRSwvKiAweDQ4LTB4NEYgKi8KKwkweEQyNDAsMHhEMjQyLDB4RDI0MywweEQyNDQsMHhEMjQ1LDB4RDI0NiwweEQyNDcsMHhEMjQ5LC8qIDB4NTAtMHg1NyAqLworCTB4RDI0QSwweEQyNEIsMHhEMjRDLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4RDI0RCwweEQyNEUsMHhEMjRGLDB4RDI1MCwweEQyNTEsMHhEMjUyLDB4RDI1MywvKiAweDYwLTB4NjcgKi8KKwkweEQyNTQsMHhEMjU1LDB4RDI1NiwweEQyNTcsMHhEMjU4LDB4RDI1OSwweEQyNUEsMHhEMjVCLC8qIDB4NjgtMHg2RiAqLworCTB4RDI1RCwweEQyNUUsMHhEMjVGLDB4RDI2MCwweEQyNjEsMHhEMjYyLDB4RDI2MywweEQyNjUsLyogMHg3MC0weDc3ICovCisJMHhEMjY2LDB4RDI2NywweEQyNjgsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEQyNjksMHhEMjZBLDB4RDI2QiwweEQyNkMsMHhEMjZELDB4RDI2RSwweEQyNkYsLyogMHg4MC0weDg3ICovCisJMHhEMjcwLDB4RDI3MSwweEQyNzIsMHhEMjczLDB4RDI3NCwweEQyNzUsMHhEMjc2LDB4RDI3NywvKiAweDg4LTB4OEYgKi8KKwkweEQyNzgsMHhEMjc5LDB4RDI3QSwweEQyN0IsMHhEMjdDLDB4RDI3RCwweEQyN0UsMHhEMjdGLC8qIDB4OTAtMHg5NyAqLworCTB4RDI4MiwweEQyODMsMHhEMjg1LDB4RDI4NiwweEQyODcsMHhEMjg5LDB4RDI4QSwweEQyOEIsLyogMHg5OC0weDlGICovCisJMHhEMjhDLDB4QkIwMCwweEJCMDQsMHhCQjBELDB4QkIwRiwweEJCMTEsMHhCQjE4LDB4QkIxQywvKiAweEEwLTB4QTcgKi8KKwkweEJCMjAsMHhCQjI5LDB4QkIyQiwweEJCMzQsMHhCQjM1LDB4QkIzNiwweEJCMzgsMHhCQjNCLC8qIDB4QTgtMHhBRiAqLworCTB4QkIzQywweEJCM0QsMHhCQjNFLDB4QkI0NCwweEJCNDUsMHhCQjQ3LDB4QkI0OSwweEJCNEQsLyogMHhCMC0weEI3ICovCisJMHhCQjRGLDB4QkI1MCwweEJCNTQsMHhCQjU4LDB4QkI2MSwweEJCNjMsMHhCQjZDLDB4QkI4OCwvKiAweEI4LTB4QkYgKi8KKwkweEJCOEMsMHhCQjkwLDB4QkJBNCwweEJCQTgsMHhCQkFDLDB4QkJCNCwweEJCQjcsMHhCQkMwLC8qIDB4QzAtMHhDNyAqLworCTB4QkJDNCwweEJCQzgsMHhCQkQwLDB4QkJEMywweEJCRjgsMHhCQkY5LDB4QkJGQywweEJCRkYsLyogMHhDOC0weENGICovCisJMHhCQzAwLDB4QkMwMiwweEJDMDgsMHhCQzA5LDB4QkMwQiwweEJDMEMsMHhCQzBELDB4QkMwRiwvKiAweEQwLTB4RDcgKi8KKwkweEJDMTEsMHhCQzE0LDB4QkMxNSwweEJDMTYsMHhCQzE3LDB4QkMxOCwweEJDMUIsMHhCQzFDLC8qIDB4RDgtMHhERiAqLworCTB4QkMxRCwweEJDMUUsMHhCQzFGLDB4QkMyNCwweEJDMjUsMHhCQzI3LDB4QkMyOSwweEJDMkQsLyogMHhFMC0weEU3ICovCisJMHhCQzMwLDB4QkMzMSwweEJDMzQsMHhCQzM4LDB4QkM0MCwweEJDNDEsMHhCQzQzLDB4QkM0NCwvKiAweEU4LTB4RUYgKi8KKwkweEJDNDUsMHhCQzQ5LDB4QkM0QywweEJDNEQsMHhCQzUwLDB4QkM1RCwweEJDODQsMHhCQzg1LC8qIDB4RjAtMHhGNyAqLworCTB4QkM4OCwweEJDOEIsMHhCQzhDLDB4QkM4RSwweEJDOTQsMHhCQzk1LDB4QkM5NywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQkFbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4RDI4RCwweEQyOEUsMHhEMjhGLDB4RDI5MiwweEQyOTMsMHhEMjk0LDB4RDI5NiwvKiAweDQwLTB4NDcgKi8KKwkweEQyOTcsMHhEMjk4LDB4RDI5OSwweEQyOUEsMHhEMjlCLDB4RDI5RCwweEQyOUUsMHhEMjlGLC8qIDB4NDgtMHg0RiAqLworCTB4RDJBMSwweEQyQTIsMHhEMkEzLDB4RDJBNSwweEQyQTYsMHhEMkE3LDB4RDJBOCwweEQyQTksLyogMHg1MC0weDU3ICovCisJMHhEMkFBLDB4RDJBQiwweEQyQUQsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhEMkFFLDB4RDJBRiwweEQyQjAsMHhEMkIyLDB4RDJCMywweEQyQjQsMHhEMkI1LC8qIDB4NjAtMHg2NyAqLworCTB4RDJCNiwweEQyQjcsMHhEMkJBLDB4RDJCQiwweEQyQkQsMHhEMkJFLDB4RDJDMSwweEQyQzMsLyogMHg2OC0weDZGICovCisJMHhEMkM0LDB4RDJDNSwweEQyQzYsMHhEMkM3LDB4RDJDQSwweEQyQ0MsMHhEMkNELDB4RDJDRSwvKiAweDcwLTB4NzcgKi8KKwkweEQyQ0YsMHhEMkQwLDB4RDJEMSwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4RDJEMiwweEQyRDMsMHhEMkQ1LDB4RDJENiwweEQyRDcsMHhEMkQ5LDB4RDJEQSwvKiAweDgwLTB4ODcgKi8KKwkweEQyREIsMHhEMkRELDB4RDJERSwweEQyREYsMHhEMkUwLDB4RDJFMSwweEQyRTIsMHhEMkUzLC8qIDB4ODgtMHg4RiAqLworCTB4RDJFNiwweEQyRTcsMHhEMkU4LDB4RDJFOSwweEQyRUEsMHhEMkVCLDB4RDJFQywweEQyRUQsLyogMHg5MC0weDk3ICovCisJMHhEMkVFLDB4RDJFRiwweEQyRjIsMHhEMkYzLDB4RDJGNSwweEQyRjYsMHhEMkY3LDB4RDJGOSwvKiAweDk4LTB4OUYgKi8KKwkweEQyRkEsMHhCQzk5LDB4QkM5QSwweEJDQTAsMHhCQ0ExLDB4QkNBNCwweEJDQTcsMHhCQ0E4LC8qIDB4QTAtMHhBNyAqLworCTB4QkNCMCwweEJDQjEsMHhCQ0IzLDB4QkNCNCwweEJDQjUsMHhCQ0JDLDB4QkNCRCwweEJDQzAsLyogMHhBOC0weEFGICovCisJMHhCQ0M0LDB4QkNDRCwweEJDQ0YsMHhCQ0QwLDB4QkNEMSwweEJDRDUsMHhCQ0Q4LDB4QkNEQywvKiAweEIwLTB4QjcgKi8KKwkweEJDRjQsMHhCQ0Y1LDB4QkNGNiwweEJDRjgsMHhCQ0ZDLDB4QkQwNCwweEJEMDUsMHhCRDA3LC8qIDB4QjgtMHhCRiAqLworCTB4QkQwOSwweEJEMTAsMHhCRDE0LDB4QkQyNCwweEJEMkMsMHhCRDQwLDB4QkQ0OCwweEJENDksLyogMHhDMC0weEM3ICovCisJMHhCRDRDLDB4QkQ1MCwweEJENTgsMHhCRDU5LDB4QkQ2NCwweEJENjgsMHhCRDgwLDB4QkQ4MSwvKiAweEM4LTB4Q0YgKi8KKwkweEJEODQsMHhCRDg3LDB4QkQ4OCwweEJEODksMHhCRDhBLDB4QkQ5MCwweEJEOTEsMHhCRDkzLC8qIDB4RDAtMHhENyAqLworCTB4QkQ5NSwweEJEOTksMHhCRDlBLDB4QkQ5QywweEJEQTQsMHhCREIwLDB4QkRCOCwweEJERDQsLyogMHhEOC0weERGICovCisJMHhCREQ1LDB4QkREOCwweEJEREMsMHhCREU5LDB4QkRGMCwweEJERjQsMHhCREY4LDB4QkUwMCwvKiAweEUwLTB4RTcgKi8KKwkweEJFMDMsMHhCRTA1LDB4QkUwQywweEJFMEQsMHhCRTEwLDB4QkUxNCwweEJFMUMsMHhCRTFELC8qIDB4RTgtMHhFRiAqLworCTB4QkUxRiwweEJFNDQsMHhCRTQ1LDB4QkU0OCwweEJFNEMsMHhCRTRFLDB4QkU1NCwweEJFNTUsLyogMHhGMC0weEY3ICovCisJMHhCRTU3LDB4QkU1OSwweEJFNUEsMHhCRTVCLDB4QkU2MCwweEJFNjEsMHhCRTY0LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9CQlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhEMkZCLDB4RDJGQywweEQyRkQsMHhEMkZFLDB4RDJGRiwweEQzMDIsMHhEMzA0LC8qIDB4NDAtMHg0NyAqLworCTB4RDMwNiwweEQzMDcsMHhEMzA4LDB4RDMwOSwweEQzMEEsMHhEMzBCLDB4RDMwRiwweEQzMTEsLyogMHg0OC0weDRGICovCisJMHhEMzEyLDB4RDMxMywweEQzMTUsMHhEMzE3LDB4RDMxOCwweEQzMTksMHhEMzFBLDB4RDMxQiwvKiAweDUwLTB4NTcgKi8KKwkweEQzMUUsMHhEMzIyLDB4RDMyMywweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEQzMjQsMHhEMzI2LDB4RDMyNywweEQzMkEsMHhEMzJCLDB4RDMyRCwweEQzMkUsLyogMHg2MC0weDY3ICovCisJMHhEMzJGLDB4RDMzMSwweEQzMzIsMHhEMzMzLDB4RDMzNCwweEQzMzUsMHhEMzM2LDB4RDMzNywvKiAweDY4LTB4NkYgKi8KKwkweEQzM0EsMHhEMzNFLDB4RDMzRiwweEQzNDAsMHhEMzQxLDB4RDM0MiwweEQzNDMsMHhEMzQ2LC8qIDB4NzAtMHg3NyAqLworCTB4RDM0NywweEQzNDgsMHhEMzQ5LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhEMzRBLDB4RDM0QiwweEQzNEMsMHhEMzRELDB4RDM0RSwweEQzNEYsMHhEMzUwLC8qIDB4ODAtMHg4NyAqLworCTB4RDM1MSwweEQzNTIsMHhEMzUzLDB4RDM1NCwweEQzNTUsMHhEMzU2LDB4RDM1NywweEQzNTgsLyogMHg4OC0weDhGICovCisJMHhEMzU5LDB4RDM1QSwweEQzNUIsMHhEMzVDLDB4RDM1RCwweEQzNUUsMHhEMzVGLDB4RDM2MCwvKiAweDkwLTB4OTcgKi8KKwkweEQzNjEsMHhEMzYyLDB4RDM2MywweEQzNjQsMHhEMzY1LDB4RDM2NiwweEQzNjcsMHhEMzY4LC8qIDB4OTgtMHg5RiAqLworCTB4RDM2OSwweEJFNjgsMHhCRTZBLDB4QkU3MCwweEJFNzEsMHhCRTczLDB4QkU3NCwweEJFNzUsLyogMHhBMC0weEE3ICovCisJMHhCRTdCLDB4QkU3QywweEJFN0QsMHhCRTgwLDB4QkU4NCwweEJFOEMsMHhCRThELDB4QkU4RiwvKiAweEE4LTB4QUYgKi8KKwkweEJFOTAsMHhCRTkxLDB4QkU5OCwweEJFOTksMHhCRUE4LDB4QkVEMCwweEJFRDEsMHhCRUQ0LC8qIDB4QjAtMHhCNyAqLworCTB4QkVENywweEJFRDgsMHhCRUUwLDB4QkVFMywweEJFRTQsMHhCRUU1LDB4QkVFQywweEJGMDEsLyogMHhCOC0weEJGICovCisJMHhCRjA4LDB4QkYwOSwweEJGMTgsMHhCRjE5LDB4QkYxQiwweEJGMUMsMHhCRjFELDB4QkY0MCwvKiAweEMwLTB4QzcgKi8KKwkweEJGNDEsMHhCRjQ0LDB4QkY0OCwweEJGNTAsMHhCRjUxLDB4QkY1NSwweEJGOTQsMHhCRkIwLC8qIDB4QzgtMHhDRiAqLworCTB4QkZDNSwweEJGQ0MsMHhCRkNELDB4QkZEMCwweEJGRDQsMHhCRkRDLDB4QkZERiwweEJGRTEsLyogMHhEMC0weEQ3ICovCisJMHhDMDNDLDB4QzA1MSwweEMwNTgsMHhDMDVDLDB4QzA2MCwweEMwNjgsMHhDMDY5LDB4QzA5MCwvKiAweEQ4LTB4REYgKi8KKwkweEMwOTEsMHhDMDk0LDB4QzA5OCwweEMwQTAsMHhDMEExLDB4QzBBMywweEMwQTUsMHhDMEFDLC8qIDB4RTAtMHhFNyAqLworCTB4QzBBRCwweEMwQUYsMHhDMEIwLDB4QzBCMywweEMwQjQsMHhDMEI1LDB4QzBCNiwweEMwQkMsLyogMHhFOC0weEVGICovCisJMHhDMEJELDB4QzBCRiwweEMwQzAsMHhDMEMxLDB4QzBDNSwweEMwQzgsMHhDMEM5LDB4QzBDQywvKiAweEYwLTB4RjcgKi8KKwkweEMwRDAsMHhDMEQ4LDB4QzBEOSwweEMwREIsMHhDMERDLDB4QzBERCwweEMwRTQsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0JDWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEQzNkEsMHhEMzZCLDB4RDM2QywweEQzNkQsMHhEMzZFLDB4RDM2RiwweEQzNzAsLyogMHg0MC0weDQ3ICovCisJMHhEMzcxLDB4RDM3MiwweEQzNzMsMHhEMzc0LDB4RDM3NSwweEQzNzYsMHhEMzc3LDB4RDM3OCwvKiAweDQ4LTB4NEYgKi8KKwkweEQzNzksMHhEMzdBLDB4RDM3QiwweEQzN0UsMHhEMzdGLDB4RDM4MSwweEQzODIsMHhEMzgzLC8qIDB4NTAtMHg1NyAqLworCTB4RDM4NSwweEQzODYsMHhEMzg3LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4RDM4OCwweEQzODksMHhEMzhBLDB4RDM4QiwweEQzOEUsMHhEMzkyLDB4RDM5MywvKiAweDYwLTB4NjcgKi8KKwkweEQzOTQsMHhEMzk1LDB4RDM5NiwweEQzOTcsMHhEMzlBLDB4RDM5QiwweEQzOUQsMHhEMzlFLC8qIDB4NjgtMHg2RiAqLworCTB4RDM5RiwweEQzQTEsMHhEM0EyLDB4RDNBMywweEQzQTQsMHhEM0E1LDB4RDNBNiwweEQzQTcsLyogMHg3MC0weDc3ICovCisJMHhEM0FBLDB4RDNBQywweEQzQUUsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEQzQUYsMHhEM0IwLDB4RDNCMSwweEQzQjIsMHhEM0IzLDB4RDNCNSwweEQzQjYsLyogMHg4MC0weDg3ICovCisJMHhEM0I3LDB4RDNCOSwweEQzQkEsMHhEM0JCLDB4RDNCRCwweEQzQkUsMHhEM0JGLDB4RDNDMCwvKiAweDg4LTB4OEYgKi8KKwkweEQzQzEsMHhEM0MyLDB4RDNDMywweEQzQzYsMHhEM0M3LDB4RDNDQSwweEQzQ0IsMHhEM0NDLC8qIDB4OTAtMHg5NyAqLworCTB4RDNDRCwweEQzQ0UsMHhEM0NGLDB4RDNEMSwweEQzRDIsMHhEM0QzLDB4RDNENCwweEQzRDUsLyogMHg5OC0weDlGICovCisJMHhEM0Q2LDB4QzBFNSwweEMwRTgsMHhDMEVDLDB4QzBGNCwweEMwRjUsMHhDMEY3LDB4QzBGOSwvKiAweEEwLTB4QTcgKi8KKwkweEMxMDAsMHhDMTA0LDB4QzEwOCwweEMxMTAsMHhDMTE1LDB4QzExQywweEMxMUQsMHhDMTFFLC8qIDB4QTgtMHhBRiAqLworCTB4QzExRiwweEMxMjAsMHhDMTIzLDB4QzEyNCwweEMxMjYsMHhDMTI3LDB4QzEyQywweEMxMkQsLyogMHhCMC0weEI3ICovCisJMHhDMTJGLDB4QzEzMCwweEMxMzEsMHhDMTM2LDB4QzEzOCwweEMxMzksMHhDMTNDLDB4QzE0MCwvKiAweEI4LTB4QkYgKi8KKwkweEMxNDgsMHhDMTQ5LDB4QzE0QiwweEMxNEMsMHhDMTRELDB4QzE1NCwweEMxNTUsMHhDMTU4LC8qIDB4QzAtMHhDNyAqLworCTB4QzE1QywweEMxNjQsMHhDMTY1LDB4QzE2NywweEMxNjgsMHhDMTY5LDB4QzE3MCwweEMxNzQsLyogMHhDOC0weENGICovCisJMHhDMTc4LDB4QzE4NSwweEMxOEMsMHhDMThELDB4QzE4RSwweEMxOTAsMHhDMTk0LDB4QzE5NiwvKiAweEQwLTB4RDcgKi8KKwkweEMxOUMsMHhDMTlELDB4QzE5RiwweEMxQTEsMHhDMUE1LDB4QzFBOCwweEMxQTksMHhDMUFDLC8qIDB4RDgtMHhERiAqLworCTB4QzFCMCwweEMxQkQsMHhDMUM0LDB4QzFDOCwweEMxQ0MsMHhDMUQ0LDB4QzFENywweEMxRDgsLyogMHhFMC0weEU3ICovCisJMHhDMUUwLDB4QzFFNCwweEMxRTgsMHhDMUYwLDB4QzFGMSwweEMxRjMsMHhDMUZDLDB4QzFGRCwvKiAweEU4LTB4RUYgKi8KKwkweEMyMDAsMHhDMjA0LDB4QzIwQywweEMyMEQsMHhDMjBGLDB4QzIxMSwweEMyMTgsMHhDMjE5LC8qIDB4RjAtMHhGNyAqLworCTB4QzIxQywweEMyMUYsMHhDMjIwLDB4QzIyOCwweEMyMjksMHhDMjJCLDB4QzIyRCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQkRbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4RDNENywweEQzRDksMHhEM0RBLDB4RDNEQiwweEQzREMsMHhEM0RELDB4RDNERSwvKiAweDQwLTB4NDcgKi8KKwkweEQzREYsMHhEM0UwLDB4RDNFMiwweEQzRTQsMHhEM0U1LDB4RDNFNiwweEQzRTcsMHhEM0U4LC8qIDB4NDgtMHg0RiAqLworCTB4RDNFOSwweEQzRUEsMHhEM0VCLDB4RDNFRSwweEQzRUYsMHhEM0YxLDB4RDNGMiwweEQzRjMsLyogMHg1MC0weDU3ICovCisJMHhEM0Y1LDB4RDNGNiwweEQzRjcsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhEM0Y4LDB4RDNGOSwweEQzRkEsMHhEM0ZCLDB4RDNGRSwweEQ0MDAsMHhENDAyLC8qIDB4NjAtMHg2NyAqLworCTB4RDQwMywweEQ0MDQsMHhENDA1LDB4RDQwNiwweEQ0MDcsMHhENDA5LDB4RDQwQSwweEQ0MEIsLyogMHg2OC0weDZGICovCisJMHhENDBDLDB4RDQwRCwweEQ0MEUsMHhENDBGLDB4RDQxMCwweEQ0MTEsMHhENDEyLDB4RDQxMywvKiAweDcwLTB4NzcgKi8KKwkweEQ0MTQsMHhENDE1LDB4RDQxNiwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4RDQxNywweEQ0MTgsMHhENDE5LDB4RDQxQSwweEQ0MUIsMHhENDFDLDB4RDQxRSwvKiAweDgwLTB4ODcgKi8KKwkweEQ0MUYsMHhENDIwLDB4RDQyMSwweEQ0MjIsMHhENDIzLDB4RDQyNCwweEQ0MjUsMHhENDI2LC8qIDB4ODgtMHg4RiAqLworCTB4RDQyNywweEQ0MjgsMHhENDI5LDB4RDQyQSwweEQ0MkIsMHhENDJDLDB4RDQyRCwweEQ0MkUsLyogMHg5MC0weDk3ICovCisJMHhENDJGLDB4RDQzMCwweEQ0MzEsMHhENDMyLDB4RDQzMywweEQ0MzQsMHhENDM1LDB4RDQzNiwvKiAweDk4LTB4OUYgKi8KKwkweEQ0MzcsMHhDMjJGLDB4QzIzMSwweEMyMzIsMHhDMjM0LDB4QzI0OCwweEMyNTAsMHhDMjUxLC8qIDB4QTAtMHhBNyAqLworCTB4QzI1NCwweEMyNTgsMHhDMjYwLDB4QzI2NSwweEMyNkMsMHhDMjZELDB4QzI3MCwweEMyNzQsLyogMHhBOC0weEFGICovCisJMHhDMjdDLDB4QzI3RCwweEMyN0YsMHhDMjgxLDB4QzI4OCwweEMyODksMHhDMjkwLDB4QzI5OCwvKiAweEIwLTB4QjcgKi8KKwkweEMyOUIsMHhDMjlELDB4QzJBNCwweEMyQTUsMHhDMkE4LDB4QzJBQywweEMyQUQsMHhDMkI0LC8qIDB4QjgtMHhCRiAqLworCTB4QzJCNSwweEMyQjcsMHhDMkI5LDB4QzJEQywweEMyREQsMHhDMkUwLDB4QzJFMywweEMyRTQsLyogMHhDMC0weEM3ICovCisJMHhDMkVCLDB4QzJFQywweEMyRUQsMHhDMkVGLDB4QzJGMSwweEMyRjYsMHhDMkY4LDB4QzJGOSwvKiAweEM4LTB4Q0YgKi8KKwkweEMyRkIsMHhDMkZDLDB4QzMwMCwweEMzMDgsMHhDMzA5LDB4QzMwQywweEMzMEQsMHhDMzEzLC8qIDB4RDAtMHhENyAqLworCTB4QzMxNCwweEMzMTUsMHhDMzE4LDB4QzMxQywweEMzMjQsMHhDMzI1LDB4QzMyOCwweEMzMjksLyogMHhEOC0weERGICovCisJMHhDMzQ1LDB4QzM2OCwweEMzNjksMHhDMzZDLDB4QzM3MCwweEMzNzIsMHhDMzc4LDB4QzM3OSwvKiAweEUwLTB4RTcgKi8KKwkweEMzN0MsMHhDMzdELDB4QzM4NCwweEMzODgsMHhDMzhDLDB4QzNDMCwweEMzRDgsMHhDM0Q5LC8qIDB4RTgtMHhFRiAqLworCTB4QzNEQywweEMzREYsMHhDM0UwLDB4QzNFMiwweEMzRTgsMHhDM0U5LDB4QzNFRCwweEMzRjQsLyogMHhGMC0weEY3ICovCisJMHhDM0Y1LDB4QzNGOCwweEM0MDgsMHhDNDEwLDB4QzQyNCwweEM0MkMsMHhDNDMwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9CRVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhENDM4LDB4RDQzOSwweEQ0M0EsMHhENDNCLDB4RDQzQywweEQ0M0QsMHhENDNFLC8qIDB4NDAtMHg0NyAqLworCTB4RDQzRiwweEQ0NDEsMHhENDQyLDB4RDQ0MywweEQ0NDUsMHhENDQ2LDB4RDQ0NywweEQ0NDgsLyogMHg0OC0weDRGICovCisJMHhENDQ5LDB4RDQ0QSwweEQ0NEIsMHhENDRDLDB4RDQ0RCwweEQ0NEUsMHhENDRGLDB4RDQ1MCwvKiAweDUwLTB4NTcgKi8KKwkweEQ0NTEsMHhENDUyLDB4RDQ1MywweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEQ0NTQsMHhENDU1LDB4RDQ1NiwweEQ0NTcsMHhENDU4LDB4RDQ1OSwweEQ0NUEsLyogMHg2MC0weDY3ICovCisJMHhENDVCLDB4RDQ1RCwweEQ0NUUsMHhENDVGLDB4RDQ2MSwweEQ0NjIsMHhENDYzLDB4RDQ2NSwvKiAweDY4LTB4NkYgKi8KKwkweEQ0NjYsMHhENDY3LDB4RDQ2OCwweEQ0NjksMHhENDZBLDB4RDQ2QiwweEQ0NkMsMHhENDZFLC8qIDB4NzAtMHg3NyAqLworCTB4RDQ3MCwweEQ0NzEsMHhENDcyLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhENDczLDB4RDQ3NCwweEQ0NzUsMHhENDc2LDB4RDQ3NywweEQ0N0EsMHhENDdCLC8qIDB4ODAtMHg4NyAqLworCTB4RDQ3RCwweEQ0N0UsMHhENDgxLDB4RDQ4MywweEQ0ODQsMHhENDg1LDB4RDQ4NiwweEQ0ODcsLyogMHg4OC0weDhGICovCisJMHhENDhBLDB4RDQ4QywweEQ0OEUsMHhENDhGLDB4RDQ5MCwweEQ0OTEsMHhENDkyLDB4RDQ5MywvKiAweDkwLTB4OTcgKi8KKwkweEQ0OTUsMHhENDk2LDB4RDQ5NywweEQ0OTgsMHhENDk5LDB4RDQ5QSwweEQ0OUIsMHhENDlDLC8qIDB4OTgtMHg5RiAqLworCTB4RDQ5RCwweEM0MzQsMHhDNDNDLDB4QzQzRCwweEM0NDgsMHhDNDY0LDB4QzQ2NSwweEM0NjgsLyogMHhBMC0weEE3ICovCisJMHhDNDZDLDB4QzQ3NCwweEM0NzUsMHhDNDc5LDB4QzQ4MCwweEM0OTQsMHhDNDlDLDB4QzRCOCwvKiAweEE4LTB4QUYgKi8KKwkweEM0QkMsMHhDNEU5LDB4QzRGMCwweEM0RjEsMHhDNEY0LDB4QzRGOCwweEM0RkEsMHhDNEZGLC8qIDB4QjAtMHhCNyAqLworCTB4QzUwMCwweEM1MDEsMHhDNTBDLDB4QzUxMCwweEM1MTQsMHhDNTFDLDB4QzUyOCwweEM1MjksLyogMHhCOC0weEJGICovCisJMHhDNTJDLDB4QzUzMCwweEM1MzgsMHhDNTM5LDB4QzUzQiwweEM1M0QsMHhDNTQ0LDB4QzU0NSwvKiAweEMwLTB4QzcgKi8KKwkweEM1NDgsMHhDNTQ5LDB4QzU0QSwweEM1NEMsMHhDNTRELDB4QzU0RSwweEM1NTMsMHhDNTU0LC8qIDB4QzgtMHhDRiAqLworCTB4QzU1NSwweEM1NTcsMHhDNTU4LDB4QzU1OSwweEM1NUQsMHhDNTVFLDB4QzU2MCwweEM1NjEsLyogMHhEMC0weEQ3ICovCisJMHhDNTY0LDB4QzU2OCwweEM1NzAsMHhDNTcxLDB4QzU3MywweEM1NzQsMHhDNTc1LDB4QzU3QywvKiAweEQ4LTB4REYgKi8KKwkweEM1N0QsMHhDNTgwLDB4QzU4NCwweEM1ODcsMHhDNThDLDB4QzU4RCwweEM1OEYsMHhDNTkxLC8qIDB4RTAtMHhFNyAqLworCTB4QzU5NSwweEM1OTcsMHhDNTk4LDB4QzU5QywweEM1QTAsMHhDNUE5LDB4QzVCNCwweEM1QjUsLyogMHhFOC0weEVGICovCisJMHhDNUI4LDB4QzVCOSwweEM1QkIsMHhDNUJDLDB4QzVCRCwweEM1QkUsMHhDNUM0LDB4QzVDNSwvKiAweEYwLTB4RjcgKi8KKwkweEM1QzYsMHhDNUM3LDB4QzVDOCwweEM1QzksMHhDNUNBLDB4QzVDQywweEM1Q0UsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0JGWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEQ0OUUsMHhENDlGLDB4RDRBMCwweEQ0QTEsMHhENEEyLDB4RDRBMywweEQ0QTQsLyogMHg0MC0weDQ3ICovCisJMHhENEE1LDB4RDRBNiwweEQ0QTcsMHhENEE4LDB4RDRBQSwweEQ0QUIsMHhENEFDLDB4RDRBRCwvKiAweDQ4LTB4NEYgKi8KKwkweEQ0QUUsMHhENEFGLDB4RDRCMCwweEQ0QjEsMHhENEIyLDB4RDRCMywweEQ0QjQsMHhENEI1LC8qIDB4NTAtMHg1NyAqLworCTB4RDRCNiwweEQ0QjcsMHhENEI4LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4RDRCOSwweEQ0QkEsMHhENEJCLDB4RDRCQywweEQ0QkQsMHhENEJFLDB4RDRCRiwvKiAweDYwLTB4NjcgKi8KKwkweEQ0QzAsMHhENEMxLDB4RDRDMiwweEQ0QzMsMHhENEM0LDB4RDRDNSwweEQ0QzYsMHhENEM3LC8qIDB4NjgtMHg2RiAqLworCTB4RDRDOCwweEQ0QzksMHhENENBLDB4RDRDQiwweEQ0Q0QsMHhENENFLDB4RDRDRiwweEQ0RDEsLyogMHg3MC0weDc3ICovCisJMHhENEQyLDB4RDREMywweEQ0RDUsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEQ0RDYsMHhENEQ3LDB4RDREOCwweEQ0RDksMHhENERBLDB4RDREQiwweEQ0REQsLyogMHg4MC0weDg3ICovCisJMHhENERFLDB4RDRFMCwweEQ0RTEsMHhENEUyLDB4RDRFMywweEQ0RTQsMHhENEU1LDB4RDRFNiwvKiAweDg4LTB4OEYgKi8KKwkweEQ0RTcsMHhENEU5LDB4RDRFQSwweEQ0RUIsMHhENEVELDB4RDRFRSwweEQ0RUYsMHhENEYxLC8qIDB4OTAtMHg5NyAqLworCTB4RDRGMiwweEQ0RjMsMHhENEY0LDB4RDRGNSwweEQ0RjYsMHhENEY3LDB4RDRGOSwweEQ0RkEsLyogMHg5OC0weDlGICovCisJMHhENEZDLDB4QzVEMCwweEM1RDEsMHhDNUQ0LDB4QzVEOCwweEM1RTAsMHhDNUUxLDB4QzVFMywvKiAweEEwLTB4QTcgKi8KKwkweEM1RTUsMHhDNUVDLDB4QzVFRCwweEM1RUUsMHhDNUYwLDB4QzVGNCwweEM1RjYsMHhDNUY3LC8qIDB4QTgtMHhBRiAqLworCTB4QzVGQywweEM1RkQsMHhDNUZFLDB4QzVGRiwweEM2MDAsMHhDNjAxLDB4QzYwNSwweEM2MDYsLyogMHhCMC0weEI3ICovCisJMHhDNjA3LDB4QzYwOCwweEM2MEMsMHhDNjEwLDB4QzYxOCwweEM2MTksMHhDNjFCLDB4QzYxQywvKiAweEI4LTB4QkYgKi8KKwkweEM2MjQsMHhDNjI1LDB4QzYyOCwweEM2MkMsMHhDNjJELDB4QzYyRSwweEM2MzAsMHhDNjMzLC8qIDB4QzAtMHhDNyAqLworCTB4QzYzNCwweEM2MzUsMHhDNjM3LDB4QzYzOSwweEM2M0IsMHhDNjQwLDB4QzY0MSwweEM2NDQsLyogMHhDOC0weENGICovCisJMHhDNjQ4LDB4QzY1MCwweEM2NTEsMHhDNjUzLDB4QzY1NCwweEM2NTUsMHhDNjVDLDB4QzY1RCwvKiAweEQwLTB4RDcgKi8KKwkweEM2NjAsMHhDNjZDLDB4QzY2RiwweEM2NzEsMHhDNjc4LDB4QzY3OSwweEM2N0MsMHhDNjgwLC8qIDB4RDgtMHhERiAqLworCTB4QzY4OCwweEM2ODksMHhDNjhCLDB4QzY4RCwweEM2OTQsMHhDNjk1LDB4QzY5OCwweEM2OUMsLyogMHhFMC0weEU3ICovCisJMHhDNkE0LDB4QzZBNSwweEM2QTcsMHhDNkE5LDB4QzZCMCwweEM2QjEsMHhDNkI0LDB4QzZCOCwvKiAweEU4LTB4RUYgKi8KKwkweEM2QjksMHhDNkJBLDB4QzZDMCwweEM2QzEsMHhDNkMzLDB4QzZDNSwweEM2Q0MsMHhDNkNELC8qIDB4RjAtMHhGNyAqLworCTB4QzZEMCwweEM2RDQsMHhDNkRDLDB4QzZERCwweEM2RTAsMHhDNkUxLDB4QzZFOCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQzBbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4RDRGRSwweEQ0RkYsMHhENTAwLDB4RDUwMSwweEQ1MDIsMHhENTAzLDB4RDUwNSwvKiAweDQwLTB4NDcgKi8KKwkweEQ1MDYsMHhENTA3LDB4RDUwOSwweEQ1MEEsMHhENTBCLDB4RDUwRCwweEQ1MEUsMHhENTBGLC8qIDB4NDgtMHg0RiAqLworCTB4RDUxMCwweEQ1MTEsMHhENTEyLDB4RDUxMywweEQ1MTYsMHhENTE4LDB4RDUxOSwweEQ1MUEsLyogMHg1MC0weDU3ICovCisJMHhENTFCLDB4RDUxQywweEQ1MUQsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhENTFFLDB4RDUxRiwweEQ1MjAsMHhENTIxLDB4RDUyMiwweEQ1MjMsMHhENTI0LC8qIDB4NjAtMHg2NyAqLworCTB4RDUyNSwweEQ1MjYsMHhENTI3LDB4RDUyOCwweEQ1MjksMHhENTJBLDB4RDUyQiwweEQ1MkMsLyogMHg2OC0weDZGICovCisJMHhENTJELDB4RDUyRSwweEQ1MkYsMHhENTMwLDB4RDUzMSwweEQ1MzIsMHhENTMzLDB4RDUzNCwvKiAweDcwLTB4NzcgKi8KKwkweEQ1MzUsMHhENTM2LDB4RDUzNywweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4RDUzOCwweEQ1MzksMHhENTNBLDB4RDUzQiwweEQ1M0UsMHhENTNGLDB4RDU0MSwvKiAweDgwLTB4ODcgKi8KKwkweEQ1NDIsMHhENTQzLDB4RDU0NSwweEQ1NDYsMHhENTQ3LDB4RDU0OCwweEQ1NDksMHhENTRBLC8qIDB4ODgtMHg4RiAqLworCTB4RDU0QiwweEQ1NEUsMHhENTUwLDB4RDU1MiwweEQ1NTMsMHhENTU0LDB4RDU1NSwweEQ1NTYsLyogMHg5MC0weDk3ICovCisJMHhENTU3LDB4RDU1QSwweEQ1NUIsMHhENTVELDB4RDU1RSwweEQ1NUYsMHhENTYxLDB4RDU2MiwvKiAweDk4LTB4OUYgKi8KKwkweEQ1NjMsMHhDNkU5LDB4QzZFQywweEM2RjAsMHhDNkY4LDB4QzZGOSwweEM2RkQsMHhDNzA0LC8qIDB4QTAtMHhBNyAqLworCTB4QzcwNSwweEM3MDgsMHhDNzBDLDB4QzcxNCwweEM3MTUsMHhDNzE3LDB4QzcxOSwweEM3MjAsLyogMHhBOC0weEFGICovCisJMHhDNzIxLDB4QzcyNCwweEM3MjgsMHhDNzMwLDB4QzczMSwweEM3MzMsMHhDNzM1LDB4QzczNywvKiAweEIwLTB4QjcgKi8KKwkweEM3M0MsMHhDNzNELDB4Qzc0MCwweEM3NDQsMHhDNzRBLDB4Qzc0QywweEM3NEQsMHhDNzRGLC8qIDB4QjgtMHhCRiAqLworCTB4Qzc1MSwweEM3NTIsMHhDNzUzLDB4Qzc1NCwweEM3NTUsMHhDNzU2LDB4Qzc1NywweEM3NTgsLyogMHhDMC0weEM3ICovCisJMHhDNzVDLDB4Qzc2MCwweEM3NjgsMHhDNzZCLDB4Qzc3NCwweEM3NzUsMHhDNzc4LDB4Qzc3QywvKiAweEM4LTB4Q0YgKi8KKwkweEM3N0QsMHhDNzdFLDB4Qzc4MywweEM3ODQsMHhDNzg1LDB4Qzc4NywweEM3ODgsMHhDNzg5LC8qIDB4RDAtMHhENyAqLworCTB4Qzc4QSwweEM3OEUsMHhDNzkwLDB4Qzc5MSwweEM3OTQsMHhDNzk2LDB4Qzc5NywweEM3OTgsLyogMHhEOC0weERGICovCisJMHhDNzlBLDB4QzdBMCwweEM3QTEsMHhDN0EzLDB4QzdBNCwweEM3QTUsMHhDN0E2LDB4QzdBQywvKiAweEUwLTB4RTcgKi8KKwkweEM3QUQsMHhDN0IwLDB4QzdCNCwweEM3QkMsMHhDN0JELDB4QzdCRiwweEM3QzAsMHhDN0MxLC8qIDB4RTgtMHhFRiAqLworCTB4QzdDOCwweEM3QzksMHhDN0NDLDB4QzdDRSwweEM3RDAsMHhDN0Q4LDB4QzdERCwweEM3RTQsLyogMHhGMC0weEY3ICovCisJMHhDN0U4LDB4QzdFQywweEM4MDAsMHhDODAxLDB4QzgwNCwweEM4MDgsMHhDODBBLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9DMVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhENTY0LDB4RDU2NiwweEQ1NjcsMHhENTZBLDB4RDU2QywweEQ1NkUsMHhENTZGLC8qIDB4NDAtMHg0NyAqLworCTB4RDU3MCwweEQ1NzEsMHhENTcyLDB4RDU3MywweEQ1NzYsMHhENTc3LDB4RDU3OSwweEQ1N0EsLyogMHg0OC0weDRGICovCisJMHhENTdCLDB4RDU3RCwweEQ1N0UsMHhENTdGLDB4RDU4MCwweEQ1ODEsMHhENTgyLDB4RDU4MywvKiAweDUwLTB4NTcgKi8KKwkweEQ1ODYsMHhENThBLDB4RDU4QiwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEQ1OEMsMHhENThELDB4RDU4RSwweEQ1OEYsMHhENTkxLDB4RDU5MiwweEQ1OTMsLyogMHg2MC0weDY3ICovCisJMHhENTk0LDB4RDU5NSwweEQ1OTYsMHhENTk3LDB4RDU5OCwweEQ1OTksMHhENTlBLDB4RDU5QiwvKiAweDY4LTB4NkYgKi8KKwkweEQ1OUMsMHhENTlELDB4RDU5RSwweEQ1OUYsMHhENUEwLDB4RDVBMSwweEQ1QTIsMHhENUEzLC8qIDB4NzAtMHg3NyAqLworCTB4RDVBNCwweEQ1QTYsMHhENUE3LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhENUE4LDB4RDVBOSwweEQ1QUEsMHhENUFCLDB4RDVBQywweEQ1QUQsMHhENUFFLC8qIDB4ODAtMHg4NyAqLworCTB4RDVBRiwweEQ1QjAsMHhENUIxLDB4RDVCMiwweEQ1QjMsMHhENUI0LDB4RDVCNSwweEQ1QjYsLyogMHg4OC0weDhGICovCisJMHhENUI3LDB4RDVCOCwweEQ1QjksMHhENUJBLDB4RDVCQiwweEQ1QkMsMHhENUJELDB4RDVCRSwvKiAweDkwLTB4OTcgKi8KKwkweEQ1QkYsMHhENUMwLDB4RDVDMSwweEQ1QzIsMHhENUMzLDB4RDVDNCwweEQ1QzUsMHhENUM2LC8qIDB4OTgtMHg5RiAqLworCTB4RDVDNywweEM4MTAsMHhDODExLDB4QzgxMywweEM4MTUsMHhDODE2LDB4QzgxQywweEM4MUQsLyogMHhBMC0weEE3ICovCisJMHhDODIwLDB4QzgyNCwweEM4MkMsMHhDODJELDB4QzgyRiwweEM4MzEsMHhDODM4LDB4QzgzQywvKiAweEE4LTB4QUYgKi8KKwkweEM4NDAsMHhDODQ4LDB4Qzg0OSwweEM4NEMsMHhDODRELDB4Qzg1NCwweEM4NzAsMHhDODcxLC8qIDB4QjAtMHhCNyAqLworCTB4Qzg3NCwweEM4NzgsMHhDODdBLDB4Qzg4MCwweEM4ODEsMHhDODgzLDB4Qzg4NSwweEM4ODYsLyogMHhCOC0weEJGICovCisJMHhDODg3LDB4Qzg4QiwweEM4OEMsMHhDODhELDB4Qzg5NCwweEM4OUQsMHhDODlGLDB4QzhBMSwvKiAweEMwLTB4QzcgKi8KKwkweEM4QTgsMHhDOEJDLDB4QzhCRCwweEM4QzQsMHhDOEM4LDB4QzhDQywweEM4RDQsMHhDOEQ1LC8qIDB4QzgtMHhDRiAqLworCTB4QzhENywweEM4RDksMHhDOEUwLDB4QzhFMSwweEM4RTQsMHhDOEY1LDB4QzhGQywweEM4RkQsLyogMHhEMC0weEQ3ICovCisJMHhDOTAwLDB4QzkwNCwweEM5MDUsMHhDOTA2LDB4QzkwQywweEM5MEQsMHhDOTBGLDB4QzkxMSwvKiAweEQ4LTB4REYgKi8KKwkweEM5MTgsMHhDOTJDLDB4QzkzNCwweEM5NTAsMHhDOTUxLDB4Qzk1NCwweEM5NTgsMHhDOTYwLC8qIDB4RTAtMHhFNyAqLworCTB4Qzk2MSwweEM5NjMsMHhDOTZDLDB4Qzk3MCwweEM5NzQsMHhDOTdDLDB4Qzk4OCwweEM5ODksLyogMHhFOC0weEVGICovCisJMHhDOThDLDB4Qzk5MCwweEM5OTgsMHhDOTk5LDB4Qzk5QiwweEM5OUQsMHhDOUMwLDB4QzlDMSwvKiAweEYwLTB4RjcgKi8KKwkweEM5QzQsMHhDOUM3LDB4QzlDOCwweEM5Q0EsMHhDOUQwLDB4QzlEMSwweEM5RDMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0MyWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEQ1Q0EsMHhENUNCLDB4RDVDRCwweEQ1Q0UsMHhENUNGLDB4RDVEMSwweEQ1RDMsLyogMHg0MC0weDQ3ICovCisJMHhENUQ0LDB4RDVENSwweEQ1RDYsMHhENUQ3LDB4RDVEQSwweEQ1REMsMHhENURFLDB4RDVERiwvKiAweDQ4LTB4NEYgKi8KKwkweEQ1RTAsMHhENUUxLDB4RDVFMiwweEQ1RTMsMHhENUU2LDB4RDVFNywweEQ1RTksMHhENUVBLC8qIDB4NTAtMHg1NyAqLworCTB4RDVFQiwweEQ1RUQsMHhENUVFLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4RDVFRiwweEQ1RjAsMHhENUYxLDB4RDVGMiwweEQ1RjMsMHhENUY2LDB4RDVGOCwvKiAweDYwLTB4NjcgKi8KKwkweEQ1RkEsMHhENUZCLDB4RDVGQywweEQ1RkQsMHhENUZFLDB4RDVGRiwweEQ2MDIsMHhENjAzLC8qIDB4NjgtMHg2RiAqLworCTB4RDYwNSwweEQ2MDYsMHhENjA3LDB4RDYwOSwweEQ2MEEsMHhENjBCLDB4RDYwQywweEQ2MEQsLyogMHg3MC0weDc3ICovCisJMHhENjBFLDB4RDYwRiwweEQ2MTIsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEQ2MTYsMHhENjE3LDB4RDYxOCwweEQ2MTksMHhENjFBLDB4RDYxQiwweEQ2MUQsLyogMHg4MC0weDg3ICovCisJMHhENjFFLDB4RDYxRiwweEQ2MjEsMHhENjIyLDB4RDYyMywweEQ2MjUsMHhENjI2LDB4RDYyNywvKiAweDg4LTB4OEYgKi8KKwkweEQ2MjgsMHhENjI5LDB4RDYyQSwweEQ2MkIsMHhENjJDLDB4RDYyRSwweEQ2MkYsMHhENjMwLC8qIDB4OTAtMHg5NyAqLworCTB4RDYzMSwweEQ2MzIsMHhENjMzLDB4RDYzNCwweEQ2MzUsMHhENjM2LDB4RDYzNywweEQ2M0EsLyogMHg5OC0weDlGICovCisJMHhENjNCLDB4QzlENSwweEM5RDYsMHhDOUQ5LDB4QzlEQSwweEM5REMsMHhDOURELDB4QzlFMCwvKiAweEEwLTB4QTcgKi8KKwkweEM5RTIsMHhDOUU0LDB4QzlFNywweEM5RUMsMHhDOUVELDB4QzlFRiwweEM5RjAsMHhDOUYxLC8qIDB4QTgtMHhBRiAqLworCTB4QzlGOCwweEM5RjksMHhDOUZDLDB4Q0EwMCwweENBMDgsMHhDQTA5LDB4Q0EwQiwweENBMEMsLyogMHhCMC0weEI3ICovCisJMHhDQTBELDB4Q0ExNCwweENBMTgsMHhDQTI5LDB4Q0E0QywweENBNEQsMHhDQTUwLDB4Q0E1NCwvKiAweEI4LTB4QkYgKi8KKwkweENBNUMsMHhDQTVELDB4Q0E1RiwweENBNjAsMHhDQTYxLDB4Q0E2OCwweENBN0QsMHhDQTg0LC8qIDB4QzAtMHhDNyAqLworCTB4Q0E5OCwweENBQkMsMHhDQUJELDB4Q0FDMCwweENBQzQsMHhDQUNDLDB4Q0FDRCwweENBQ0YsLyogMHhDOC0weENGICovCisJMHhDQUQxLDB4Q0FEMywweENBRDgsMHhDQUQ5LDB4Q0FFMCwweENBRUMsMHhDQUY0LDB4Q0IwOCwvKiAweEQwLTB4RDcgKi8KKwkweENCMTAsMHhDQjE0LDB4Q0IxOCwweENCMjAsMHhDQjIxLDB4Q0I0MSwweENCNDgsMHhDQjQ5LC8qIDB4RDgtMHhERiAqLworCTB4Q0I0QywweENCNTAsMHhDQjU4LDB4Q0I1OSwweENCNUQsMHhDQjY0LDB4Q0I3OCwweENCNzksLyogMHhFMC0weEU3ICovCisJMHhDQjlDLDB4Q0JCOCwweENCRDQsMHhDQkU0LDB4Q0JFNywweENCRTksMHhDQzBDLDB4Q0MwRCwvKiAweEU4LTB4RUYgKi8KKwkweENDMTAsMHhDQzE0LDB4Q0MxQywweENDMUQsMHhDQzIxLDB4Q0MyMiwweENDMjcsMHhDQzI4LC8qIDB4RjAtMHhGNyAqLworCTB4Q0MyOSwweENDMkMsMHhDQzJFLDB4Q0MzMCwweENDMzgsMHhDQzM5LDB4Q0MzQiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQzNbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4RDYzRCwweEQ2M0UsMHhENjNGLDB4RDY0MSwweEQ2NDIsMHhENjQzLDB4RDY0NCwvKiAweDQwLTB4NDcgKi8KKwkweEQ2NDYsMHhENjQ3LDB4RDY0QSwweEQ2NEMsMHhENjRFLDB4RDY0RiwweEQ2NTAsMHhENjUyLC8qIDB4NDgtMHg0RiAqLworCTB4RDY1MywweEQ2NTYsMHhENjU3LDB4RDY1OSwweEQ2NUEsMHhENjVCLDB4RDY1RCwweEQ2NUUsLyogMHg1MC0weDU3ICovCisJMHhENjVGLDB4RDY2MCwweEQ2NjEsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHhENjYyLDB4RDY2MywweEQ2NjQsMHhENjY1LDB4RDY2NiwweEQ2NjgsMHhENjZBLC8qIDB4NjAtMHg2NyAqLworCTB4RDY2QiwweEQ2NkMsMHhENjZELDB4RDY2RSwweEQ2NkYsMHhENjcyLDB4RDY3MywweEQ2NzUsLyogMHg2OC0weDZGICovCisJMHhENjc2LDB4RDY3NywweEQ2NzgsMHhENjc5LDB4RDY3QSwweEQ2N0IsMHhENjdDLDB4RDY3RCwvKiAweDcwLTB4NzcgKi8KKwkweEQ2N0UsMHhENjdGLDB4RDY4MCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4RDY4MSwweEQ2ODIsMHhENjg0LDB4RDY4NiwweEQ2ODcsMHhENjg4LDB4RDY4OSwvKiAweDgwLTB4ODcgKi8KKwkweEQ2OEEsMHhENjhCLDB4RDY4RSwweEQ2OEYsMHhENjkxLDB4RDY5MiwweEQ2OTMsMHhENjk1LC8qIDB4ODgtMHg4RiAqLworCTB4RDY5NiwweEQ2OTcsMHhENjk4LDB4RDY5OSwweEQ2OUEsMHhENjlCLDB4RDY5QywweEQ2OUUsLyogMHg5MC0weDk3ICovCisJMHhENkEwLDB4RDZBMiwweEQ2QTMsMHhENkE0LDB4RDZBNSwweEQ2QTYsMHhENkE3LDB4RDZBOSwvKiAweDk4LTB4OUYgKi8KKwkweEQ2QUEsMHhDQzNDLDB4Q0MzRCwweENDM0UsMHhDQzQ0LDB4Q0M0NSwweENDNDgsMHhDQzRDLC8qIDB4QTAtMHhBNyAqLworCTB4Q0M1NCwweENDNTUsMHhDQzU3LDB4Q0M1OCwweENDNTksMHhDQzYwLDB4Q0M2NCwweENDNjYsLyogMHhBOC0weEFGICovCisJMHhDQzY4LDB4Q0M3MCwweENDNzUsMHhDQzk4LDB4Q0M5OSwweENDOUMsMHhDQ0EwLDB4Q0NBOCwvKiAweEIwLTB4QjcgKi8KKwkweENDQTksMHhDQ0FCLDB4Q0NBQywweENDQUQsMHhDQ0I0LDB4Q0NCNSwweENDQjgsMHhDQ0JDLC8qIDB4QjgtMHhCRiAqLworCTB4Q0NDNCwweENDQzUsMHhDQ0M3LDB4Q0NDOSwweENDRDAsMHhDQ0Q0LDB4Q0NFNCwweENDRUMsLyogMHhDMC0weEM3ICovCisJMHhDQ0YwLDB4Q0QwMSwweENEMDgsMHhDRDA5LDB4Q0QwQywweENEMTAsMHhDRDE4LDB4Q0QxOSwvKiAweEM4LTB4Q0YgKi8KKwkweENEMUIsMHhDRDFELDB4Q0QyNCwweENEMjgsMHhDRDJDLDB4Q0QzOSwweENENUMsMHhDRDYwLC8qIDB4RDAtMHhENyAqLworCTB4Q0Q2NCwweENENkMsMHhDRDZELDB4Q0Q2RiwweENENzEsMHhDRDc4LDB4Q0Q4OCwweENEOTQsLyogMHhEOC0weERGICovCisJMHhDRDk1LDB4Q0Q5OCwweENEOUMsMHhDREE0LDB4Q0RBNSwweENEQTcsMHhDREE5LDB4Q0RCMCwvKiAweEUwLTB4RTcgKi8KKwkweENEQzQsMHhDRENDLDB4Q0REMCwweENERTgsMHhDREVDLDB4Q0RGMCwweENERjgsMHhDREY5LC8qIDB4RTgtMHhFRiAqLworCTB4Q0RGQiwweENERkQsMHhDRTA0LDB4Q0UwOCwweENFMEMsMHhDRTE0LDB4Q0UxOSwweENFMjAsLyogMHhGMC0weEY3ICovCisJMHhDRTIxLDB4Q0UyNCwweENFMjgsMHhDRTMwLDB4Q0UzMSwweENFMzMsMHhDRTM1LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9DNFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHhENkFCLDB4RDZBRCwweEQ2QUUsMHhENkFGLDB4RDZCMSwweEQ2QjIsMHhENkIzLC8qIDB4NDAtMHg0NyAqLworCTB4RDZCNCwweEQ2QjUsMHhENkI2LDB4RDZCNywweEQ2QjgsMHhENkJBLDB4RDZCQywweEQ2QkQsLyogMHg0OC0weDRGICovCisJMHhENkJFLDB4RDZCRiwweEQ2QzAsMHhENkMxLDB4RDZDMiwweEQ2QzMsMHhENkM2LDB4RDZDNywvKiAweDUwLTB4NTcgKi8KKwkweEQ2QzksMHhENkNBLDB4RDZDQiwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweEQ2Q0QsMHhENkNFLDB4RDZDRiwweEQ2RDAsMHhENkQyLDB4RDZEMywweEQ2RDUsLyogMHg2MC0weDY3ICovCisJMHhENkQ2LDB4RDZEOCwweEQ2REEsMHhENkRCLDB4RDZEQywweEQ2REQsMHhENkRFLDB4RDZERiwvKiAweDY4LTB4NkYgKi8KKwkweEQ2RTEsMHhENkUyLDB4RDZFMywweEQ2RTUsMHhENkU2LDB4RDZFNywweEQ2RTksMHhENkVBLC8qIDB4NzAtMHg3NyAqLworCTB4RDZFQiwweEQ2RUMsMHhENkVELDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHhENkVFLDB4RDZFRiwweEQ2RjEsMHhENkYyLDB4RDZGMywweEQ2RjQsMHhENkY2LC8qIDB4ODAtMHg4NyAqLworCTB4RDZGNywweEQ2RjgsMHhENkY5LDB4RDZGQSwweEQ2RkIsMHhENkZFLDB4RDZGRiwweEQ3MDEsLyogMHg4OC0weDhGICovCisJMHhENzAyLDB4RDcwMywweEQ3MDUsMHhENzA2LDB4RDcwNywweEQ3MDgsMHhENzA5LDB4RDcwQSwvKiAweDkwLTB4OTcgKi8KKwkweEQ3MEIsMHhENzBDLDB4RDcwRCwweEQ3MEUsMHhENzBGLDB4RDcxMCwweEQ3MTIsMHhENzEzLC8qIDB4OTgtMHg5RiAqLworCTB4RDcxNCwweENFNTgsMHhDRTU5LDB4Q0U1QywweENFNUYsMHhDRTYwLDB4Q0U2MSwweENFNjgsLyogMHhBMC0weEE3ICovCisJMHhDRTY5LDB4Q0U2QiwweENFNkQsMHhDRTc0LDB4Q0U3NSwweENFNzgsMHhDRTdDLDB4Q0U4NCwvKiAweEE4LTB4QUYgKi8KKwkweENFODUsMHhDRTg3LDB4Q0U4OSwweENFOTAsMHhDRTkxLDB4Q0U5NCwweENFOTgsMHhDRUEwLC8qIDB4QjAtMHhCNyAqLworCTB4Q0VBMSwweENFQTMsMHhDRUE0LDB4Q0VBNSwweENFQUMsMHhDRUFELDB4Q0VDMSwweENFRTQsLyogMHhCOC0weEJGICovCisJMHhDRUU1LDB4Q0VFOCwweENFRUIsMHhDRUVDLDB4Q0VGNCwweENFRjUsMHhDRUY3LDB4Q0VGOCwvKiAweEMwLTB4QzcgKi8KKwkweENFRjksMHhDRjAwLDB4Q0YwMSwweENGMDQsMHhDRjA4LDB4Q0YxMCwweENGMTEsMHhDRjEzLC8qIDB4QzgtMHhDRiAqLworCTB4Q0YxNSwweENGMUMsMHhDRjIwLDB4Q0YyNCwweENGMkMsMHhDRjJELDB4Q0YyRiwweENGMzAsLyogMHhEMC0weEQ3ICovCisJMHhDRjMxLDB4Q0YzOCwweENGNTQsMHhDRjU1LDB4Q0Y1OCwweENGNUMsMHhDRjY0LDB4Q0Y2NSwvKiAweEQ4LTB4REYgKi8KKwkweENGNjcsMHhDRjY5LDB4Q0Y3MCwweENGNzEsMHhDRjc0LDB4Q0Y3OCwweENGODAsMHhDRjg1LC8qIDB4RTAtMHhFNyAqLworCTB4Q0Y4QywweENGQTEsMHhDRkE4LDB4Q0ZCMCwweENGQzQsMHhDRkUwLDB4Q0ZFMSwweENGRTQsLyogMHhFOC0weEVGICovCisJMHhDRkU4LDB4Q0ZGMCwweENGRjEsMHhDRkYzLDB4Q0ZGNSwweENGRkMsMHhEMDAwLDB4RDAwNCwvKiAweEYwLTB4RjcgKi8KKwkweEQwMTEsMHhEMDE4LDB4RDAyRCwweEQwMzQsMHhEMDM1LDB4RDAzOCwweEQwM0MsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0M1WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweEQ3MTUsMHhENzE2LDB4RDcxNywweEQ3MUEsMHhENzFCLDB4RDcxRCwweEQ3MUUsLyogMHg0MC0weDQ3ICovCisJMHhENzFGLDB4RDcyMSwweEQ3MjIsMHhENzIzLDB4RDcyNCwweEQ3MjUsMHhENzI2LDB4RDcyNywvKiAweDQ4LTB4NEYgKi8KKwkweEQ3MkEsMHhENzJDLDB4RDcyRSwweEQ3MkYsMHhENzMwLDB4RDczMSwweEQ3MzIsMHhENzMzLC8qIDB4NTAtMHg1NyAqLworCTB4RDczNiwweEQ3MzcsMHhENzM5LDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4RDczQSwweEQ3M0IsMHhENzNELDB4RDczRSwweEQ3M0YsMHhENzQwLDB4RDc0MSwvKiAweDYwLTB4NjcgKi8KKwkweEQ3NDIsMHhENzQzLDB4RDc0NSwweEQ3NDYsMHhENzQ4LDB4RDc0QSwweEQ3NEIsMHhENzRDLC8qIDB4NjgtMHg2RiAqLworCTB4RDc0RCwweEQ3NEUsMHhENzRGLDB4RDc1MiwweEQ3NTMsMHhENzU1LDB4RDc1QSwweEQ3NUIsLyogMHg3MC0weDc3ICovCisJMHhENzVDLDB4RDc1RCwweEQ3NUUsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweEQ3NUYsMHhENzYyLDB4RDc2NCwweEQ3NjYsMHhENzY3LDB4RDc2OCwweEQ3NkEsLyogMHg4MC0weDg3ICovCisJMHhENzZCLDB4RDc2RCwweEQ3NkUsMHhENzZGLDB4RDc3MSwweEQ3NzIsMHhENzczLDB4RDc3NSwvKiAweDg4LTB4OEYgKi8KKwkweEQ3NzYsMHhENzc3LDB4RDc3OCwweEQ3NzksMHhENzdBLDB4RDc3QiwweEQ3N0UsMHhENzdGLC8qIDB4OTAtMHg5NyAqLworCTB4RDc4MCwweEQ3ODIsMHhENzgzLDB4RDc4NCwweEQ3ODUsMHhENzg2LDB4RDc4NywweEQ3OEEsLyogMHg5OC0weDlGICovCisJMHhENzhCLDB4RDA0NCwweEQwNDUsMHhEMDQ3LDB4RDA0OSwweEQwNTAsMHhEMDU0LDB4RDA1OCwvKiAweEEwLTB4QTcgKi8KKwkweEQwNjAsMHhEMDZDLDB4RDA2RCwweEQwNzAsMHhEMDc0LDB4RDA3QywweEQwN0QsMHhEMDgxLC8qIDB4QTgtMHhBRiAqLworCTB4RDBBNCwweEQwQTUsMHhEMEE4LDB4RDBBQywweEQwQjQsMHhEMEI1LDB4RDBCNywweEQwQjksLyogMHhCMC0weEI3ICovCisJMHhEMEMwLDB4RDBDMSwweEQwQzQsMHhEMEM4LDB4RDBDOSwweEQwRDAsMHhEMEQxLDB4RDBEMywvKiAweEI4LTB4QkYgKi8KKwkweEQwRDQsMHhEMEQ1LDB4RDBEQywweEQwREQsMHhEMEUwLDB4RDBFNCwweEQwRUMsMHhEMEVELC8qIDB4QzAtMHhDNyAqLworCTB4RDBFRiwweEQwRjAsMHhEMEYxLDB4RDBGOCwweEQxMEQsMHhEMTMwLDB4RDEzMSwweEQxMzQsLyogMHhDOC0weENGICovCisJMHhEMTM4LDB4RDEzQSwweEQxNDAsMHhEMTQxLDB4RDE0MywweEQxNDQsMHhEMTQ1LDB4RDE0QywvKiAweEQwLTB4RDcgKi8KKwkweEQxNEQsMHhEMTUwLDB4RDE1NCwweEQxNUMsMHhEMTVELDB4RDE1RiwweEQxNjEsMHhEMTY4LC8qIDB4RDgtMHhERiAqLworCTB4RDE2QywweEQxN0MsMHhEMTg0LDB4RDE4OCwweEQxQTAsMHhEMUExLDB4RDFBNCwweEQxQTgsLyogMHhFMC0weEU3ICovCisJMHhEMUIwLDB4RDFCMSwweEQxQjMsMHhEMUI1LDB4RDFCQSwweEQxQkMsMHhEMUMwLDB4RDFEOCwvKiAweEU4LTB4RUYgKi8KKwkweEQxRjQsMHhEMUY4LDB4RDIwNywweEQyMDksMHhEMjEwLDB4RDIyQywweEQyMkQsMHhEMjMwLC8qIDB4RjAtMHhGNyAqLworCTB4RDIzNCwweEQyM0MsMHhEMjNELDB4RDIzRiwweEQyNDEsMHhEMjQ4LDB4RDI1QywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQzZbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4RDc4RCwweEQ3OEUsMHhENzhGLDB4RDc5MSwweEQ3OTIsMHhENzkzLDB4RDc5NCwvKiAweDQwLTB4NDcgKi8KKwkweEQ3OTUsMHhENzk2LDB4RDc5NywweEQ3OUEsMHhENzlDLDB4RDc5RSwweEQ3OUYsMHhEN0EwLC8qIDB4NDgtMHg0RiAqLworCTB4RDdBMSwweEQ3QTIsMHhEN0EzLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHhEMjY0LDB4RDI4MCwweEQyODEsMHhEMjg0LDB4RDI4OCwweEQyOTAsMHhEMjkxLC8qIDB4QTAtMHhBNyAqLworCTB4RDI5NSwweEQyOUMsMHhEMkEwLDB4RDJBNCwweEQyQUMsMHhEMkIxLDB4RDJCOCwweEQyQjksLyogMHhBOC0weEFGICovCisJMHhEMkJDLDB4RDJCRiwweEQyQzAsMHhEMkMyLDB4RDJDOCwweEQyQzksMHhEMkNCLDB4RDJENCwvKiAweEIwLTB4QjcgKi8KKwkweEQyRDgsMHhEMkRDLDB4RDJFNCwweEQyRTUsMHhEMkYwLDB4RDJGMSwweEQyRjQsMHhEMkY4LC8qIDB4QjgtMHhCRiAqLworCTB4RDMwMCwweEQzMDEsMHhEMzAzLDB4RDMwNSwweEQzMEMsMHhEMzBELDB4RDMwRSwweEQzMTAsLyogMHhDMC0weEM3ICovCisJMHhEMzE0LDB4RDMxNiwweEQzMUMsMHhEMzFELDB4RDMxRiwweEQzMjAsMHhEMzIxLDB4RDMyNSwvKiAweEM4LTB4Q0YgKi8KKwkweEQzMjgsMHhEMzI5LDB4RDMyQywweEQzMzAsMHhEMzM4LDB4RDMzOSwweEQzM0IsMHhEMzNDLC8qIDB4RDAtMHhENyAqLworCTB4RDMzRCwweEQzNDQsMHhEMzQ1LDB4RDM3QywweEQzN0QsMHhEMzgwLDB4RDM4NCwweEQzOEMsLyogMHhEOC0weERGICovCisJMHhEMzhELDB4RDM4RiwweEQzOTAsMHhEMzkxLDB4RDM5OCwweEQzOTksMHhEMzlDLDB4RDNBMCwvKiAweEUwLTB4RTcgKi8KKwkweEQzQTgsMHhEM0E5LDB4RDNBQiwweEQzQUQsMHhEM0I0LDB4RDNCOCwweEQzQkMsMHhEM0M0LC8qIDB4RTgtMHhFRiAqLworCTB4RDNDNSwweEQzQzgsMHhEM0M5LDB4RDNEMCwweEQzRDgsMHhEM0UxLDB4RDNFMywweEQzRUMsLyogMHhGMC0weEY3ICovCisJMHhEM0VELDB4RDNGMCwweEQzRjQsMHhEM0ZDLDB4RDNGRCwweEQzRkYsMHhENDAxLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9DN1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweEQ0MDgsMHhENDFELDB4RDQ0MCwweEQ0NDQsMHhENDVDLDB4RDQ2MCwweEQ0NjQsLyogMHhBMC0weEE3ICovCisJMHhENDZELDB4RDQ2RiwweEQ0NzgsMHhENDc5LDB4RDQ3QywweEQ0N0YsMHhENDgwLDB4RDQ4MiwvKiAweEE4LTB4QUYgKi8KKwkweEQ0ODgsMHhENDg5LDB4RDQ4QiwweEQ0OEQsMHhENDk0LDB4RDRBOSwweEQ0Q0MsMHhENEQwLC8qIDB4QjAtMHhCNyAqLworCTB4RDRENCwweEQ0REMsMHhENERGLDB4RDRFOCwweEQ0RUMsMHhENEYwLDB4RDRGOCwweEQ0RkIsLyogMHhCOC0weEJGICovCisJMHhENEZELDB4RDUwNCwweEQ1MDgsMHhENTBDLDB4RDUxNCwweEQ1MTUsMHhENTE3LDB4RDUzQywvKiAweEMwLTB4QzcgKi8KKwkweEQ1M0QsMHhENTQwLDB4RDU0NCwweEQ1NEMsMHhENTRELDB4RDU0RiwweEQ1NTEsMHhENTU4LC8qIDB4QzgtMHhDRiAqLworCTB4RDU1OSwweEQ1NUMsMHhENTYwLDB4RDU2NSwweEQ1NjgsMHhENTY5LDB4RDU2QiwweEQ1NkQsLyogMHhEMC0weEQ3ICovCisJMHhENTc0LDB4RDU3NSwweEQ1NzgsMHhENTdDLDB4RDU4NCwweEQ1ODUsMHhENTg3LDB4RDU4OCwvKiAweEQ4LTB4REYgKi8KKwkweEQ1ODksMHhENTkwLDB4RDVBNSwweEQ1QzgsMHhENUM5LDB4RDVDQywweEQ1RDAsMHhENUQyLC8qIDB4RTAtMHhFNyAqLworCTB4RDVEOCwweEQ1RDksMHhENURCLDB4RDVERCwweEQ1RTQsMHhENUU1LDB4RDVFOCwweEQ1RUMsLyogMHhFOC0weEVGICovCisJMHhENUY0LDB4RDVGNSwweEQ1RjcsMHhENUY5LDB4RDYwMCwweEQ2MDEsMHhENjA0LDB4RDYwOCwvKiAweEYwLTB4RjcgKi8KKwkweEQ2MTAsMHhENjExLDB4RDYxMywweEQ2MTQsMHhENjE1LDB4RDYxQywweEQ2MjAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0M4WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4RDYyNCwweEQ2MkQsMHhENjM4LDB4RDYzOSwweEQ2M0MsMHhENjQwLDB4RDY0NSwvKiAweEEwLTB4QTcgKi8KKwkweEQ2NDgsMHhENjQ5LDB4RDY0QiwweEQ2NEQsMHhENjUxLDB4RDY1NCwweEQ2NTUsMHhENjU4LC8qIDB4QTgtMHhBRiAqLworCTB4RDY1QywweEQ2NjcsMHhENjY5LDB4RDY3MCwweEQ2NzEsMHhENjc0LDB4RDY4MywweEQ2ODUsLyogMHhCMC0weEI3ICovCisJMHhENjhDLDB4RDY4RCwweEQ2OTAsMHhENjk0LDB4RDY5RCwweEQ2OUYsMHhENkExLDB4RDZBOCwvKiAweEI4LTB4QkYgKi8KKwkweEQ2QUMsMHhENkIwLDB4RDZCOSwweEQ2QkIsMHhENkM0LDB4RDZDNSwweEQ2QzgsMHhENkNDLC8qIDB4QzAtMHhDNyAqLworCTB4RDZEMSwweEQ2RDQsMHhENkQ3LDB4RDZEOSwweEQ2RTAsMHhENkU0LDB4RDZFOCwweEQ2RjAsLyogMHhDOC0weENGICovCisJMHhENkY1LDB4RDZGQywweEQ2RkQsMHhENzAwLDB4RDcwNCwweEQ3MTEsMHhENzE4LDB4RDcxOSwvKiAweEQwLTB4RDcgKi8KKwkweEQ3MUMsMHhENzIwLDB4RDcyOCwweEQ3MjksMHhENzJCLDB4RDcyRCwweEQ3MzQsMHhENzM1LC8qIDB4RDgtMHhERiAqLworCTB4RDczOCwweEQ3M0MsMHhENzQ0LDB4RDc0NywweEQ3NDksMHhENzUwLDB4RDc1MSwweEQ3NTQsLyogMHhFMC0weEU3ICovCisJMHhENzU2LDB4RDc1NywweEQ3NTgsMHhENzU5LDB4RDc2MCwweEQ3NjEsMHhENzYzLDB4RDc2NSwvKiAweEU4LTB4RUYgKi8KKwkweEQ3NjksMHhENzZDLDB4RDc3MCwweEQ3NzQsMHhENzdDLDB4RDc3RCwweEQ3ODEsMHhENzg4LC8qIDB4RjAtMHhGNyAqLworCTB4RDc4OSwweEQ3OEMsMHhENzkwLDB4RDc5OCwweEQ3OTksMHhENzlCLDB4RDc5RCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQ0FbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg0RjNELDB4NEY3MywweDUwNDcsMHg1MEY5LDB4NTJBMCwweDUzRUYsMHg1NDc1LC8qIDB4QTAtMHhBNyAqLworCTB4NTRFNSwweDU2MDksMHg1QUMxLDB4NUJCNiwweDY2ODcsMHg2N0I2LDB4NjdCNywweDY3RUYsLyogMHhBOC0weEFGICovCisJMHg2QjRDLDB4NzNDMiwweDc1QzIsMHg3QTNDLDB4ODJEQiwweDgzMDQsMHg4ODU3LDB4ODg4OCwvKiAweEIwLTB4QjcgKi8KKwkweDhBMzYsMHg4Q0M4LDB4OERDRiwweDhFRkIsMHg4RkU2LDB4OTlENSwweDUyM0IsMHg1Mzc0LC8qIDB4QjgtMHhCRiAqLworCTB4NTQwNCwweDYwNkEsMHg2MTY0LDB4NkJCQywweDczQ0YsMHg4MTFBLDB4ODlCQSwweDg5RDIsLyogMHhDMC0weEM3ICovCisJMHg5NUEzLDB4NEY4MywweDUyMEEsMHg1OEJFLDB4NTk3OCwweDU5RTYsMHg1RTcyLDB4NUU3OSwvKiAweEM4LTB4Q0YgKi8KKwkweDYxQzcsMHg2M0MwLDB4Njc0NiwweDY3RUMsMHg2ODdGLDB4NkY5NywweDc2NEUsMHg3NzBCLC8qIDB4RDAtMHhENyAqLworCTB4NzhGNSwweDdBMDgsMHg3QUZGLDB4N0MyMSwweDgwOUQsMHg4MjZFLDB4ODI3MSwweDhBRUIsLyogMHhEOC0weERGICovCisJMHg5NTkzLDB4NEU2QiwweDU1OUQsMHg2NkY3LDB4NkUzNCwweDc4QTMsMHg3QUVELDB4ODQ1QiwvKiAweEUwLTB4RTcgKi8KKwkweDg5MTAsMHg4NzRFLDB4OTdBOCwweDUyRDgsMHg1NzRFLDB4NTgyQSwweDVENEMsMHg2MTFGLC8qIDB4RTgtMHhFRiAqLworCTB4NjFCRSwweDYyMjEsMHg2NTYyLDB4NjdEMSwweDZBNDQsMHg2RTFCLDB4NzUxOCwweDc1QjMsLyogMHhGMC0weEY3ICovCisJMHg3NkUzLDB4NzdCMCwweDdEM0EsMHg5MEFGLDB4OTQ1MSwweDk0NTIsMHg5Rjk1LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9DQlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDUzMjMsMHg1Q0FDLDB4NzUzMiwweDgwREIsMHg5MjQwLDB4OTU5OCwweDUyNUIsLyogMHhBMC0weEE3ICovCisJMHg1ODA4LDB4NTlEQywweDVDQTEsMHg1RDE3LDB4NUVCNywweDVGM0EsMHg1RjRBLDB4NjE3NywvKiAweEE4LTB4QUYgKi8KKwkweDZDNUYsMHg3NTdBLDB4NzU4NiwweDdDRTAsMHg3RDczLDB4N0RCMSwweDdGOEMsMHg4MTU0LC8qIDB4QjAtMHhCNyAqLworCTB4ODIyMSwweDg1OTEsMHg4OTQxLDB4OEIxQiwweDkyRkMsMHg5NjRELDB4OUM0NywweDRFQ0IsLyogMHhCOC0weEJGICovCisJMHg0RUY3LDB4NTAwQiwweDUxRjEsMHg1ODRGLDB4NjEzNywweDYxM0UsMHg2MTY4LDB4NjUzOSwvKiAweEMwLTB4QzcgKi8KKwkweDY5RUEsMHg2RjExLDB4NzVBNSwweDc2ODYsMHg3NkQ2LDB4N0I4NywweDgyQTUsMHg4NENCLC8qIDB4QzgtMHhDRiAqLworCTB4RjkwMCwweDkzQTcsMHg5NThCLDB4NTU4MCwweDVCQTIsMHg1NzUxLDB4RjkwMSwweDdDQjMsLyogMHhEMC0weEQ3ICovCisJMHg3RkI5LDB4OTFCNSwweDUwMjgsMHg1M0JCLDB4NUM0NSwweDVERTgsMHg2MkQyLDB4NjM2RSwvKiAweEQ4LTB4REYgKi8KKwkweDY0REEsMHg2NEU3LDB4NkUyMCwweDcwQUMsMHg3OTVCLDB4OERERCwweDhFMUUsMHhGOTAyLC8qIDB4RTAtMHhFNyAqLworCTB4OTA3RCwweDkyNDUsMHg5MkY4LDB4NEU3RSwweDRFRjYsMHg1MDY1LDB4NURGRSwweDVFRkEsLyogMHhFOC0weEVGICovCisJMHg2MTA2LDB4Njk1NywweDgxNzEsMHg4NjU0LDB4OEU0NywweDkzNzUsMHg5QTJCLDB4NEU1RSwvKiAweEYwLTB4RjcgKi8KKwkweDUwOTEsMHg2NzcwLDB4Njg0MCwweDUxMDksMHg1MjhELDB4NTI5MiwweDZBQTIsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0NDWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NzdCQywweDkyMTAsMHg5RUQ0LDB4NTJBQiwweDYwMkYsMHg4RkYyLDB4NTA0OCwvKiAweEEwLTB4QTcgKi8KKwkweDYxQTksMHg2M0VELDB4NjRDQSwweDY4M0MsMHg2QTg0LDB4NkZDMCwweDgxODgsMHg4OUExLC8qIDB4QTgtMHhBRiAqLworCTB4OTY5NCwweDU4MDUsMHg3MjdELDB4NzJBQywweDc1MDQsMHg3RDc5LDB4N0U2RCwweDgwQTksLyogMHhCMC0weEI3ICovCisJMHg4OThCLDB4OEI3NCwweDkwNjMsMHg5RDUxLDB4NjI4OSwweDZDN0EsMHg2RjU0LDB4N0Q1MCwvKiAweEI4LTB4QkYgKi8KKwkweDdGM0EsMHg4QTIzLDB4NTE3QywweDYxNEEsMHg3QjlELDB4OEIxOSwweDkyNTcsMHg5MzhDLC8qIDB4QzAtMHhDNyAqLworCTB4NEVBQywweDRGRDMsMHg1MDFFLDB4NTBCRSwweDUxMDYsMHg1MkMxLDB4NTJDRCwweDUzN0YsLyogMHhDOC0weENGICovCisJMHg1NzcwLDB4NTg4MywweDVFOUEsMHg1RjkxLDB4NjE3NiwweDYxQUMsMHg2NENFLDB4NjU2QywvKiAweEQwLTB4RDcgKi8KKwkweDY2NkYsMHg2NkJCLDB4NjZGNCwweDY4OTcsMHg2RDg3LDB4NzA4NSwweDcwRjEsMHg3NDlGLC8qIDB4RDgtMHhERiAqLworCTB4NzRBNSwweDc0Q0EsMHg3NUQ5LDB4Nzg2QywweDc4RUMsMHg3QURGLDB4N0FGNiwweDdENDUsLyogMHhFMC0weEU3ICovCisJMHg3RDkzLDB4ODAxNSwweDgwM0YsMHg4MTFCLDB4ODM5NiwweDhCNjYsMHg4RjE1LDB4OTAxNSwvKiAweEU4LTB4RUYgKi8KKwkweDkzRTEsMHg5ODAzLDB4OTgzOCwweDlBNUEsMHg5QkU4LDB4NEZDMiwweDU1NTMsMHg1ODNBLC8qIDB4RjAtMHhGNyAqLworCTB4NTk1MSwweDVCNjMsMHg1QzQ2LDB4NjBCOCwweDYyMTIsMHg2ODQyLDB4NjhCMCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQ0RbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg2OEU4LDB4NkVBQSwweDc1NEMsMHg3Njc4LDB4NzhDRSwweDdBM0QsMHg3Q0ZCLC8qIDB4QTAtMHhBNyAqLworCTB4N0U2QiwweDdFN0MsMHg4QTA4LDB4OEFBMSwweDhDM0YsMHg5NjhFLDB4OURDNCwweDUzRTQsLyogMHhBOC0weEFGICovCisJMHg1M0U5LDB4NTQ0QSwweDU0NzEsMHg1NkZBLDB4NTlEMSwweDVCNjQsMHg1QzNCLDB4NUVBQiwvKiAweEIwLTB4QjcgKi8KKwkweDYyRjcsMHg2NTM3LDB4NjU0NSwweDY1NzIsMHg2NkEwLDB4NjdBRiwweDY5QzEsMHg2Q0JELC8qIDB4QjgtMHhCRiAqLworCTB4NzVGQywweDc2OTAsMHg3NzdFLDB4N0EzRiwweDdGOTQsMHg4MDAzLDB4ODBBMSwweDgxOEYsLyogMHhDMC0weEM3ICovCisJMHg4MkU2LDB4ODJGRCwweDgzRjAsMHg4NUMxLDB4ODgzMSwweDg4QjQsMHg4QUE1LDB4RjkwMywvKiAweEM4LTB4Q0YgKi8KKwkweDhGOUMsMHg5MzJFLDB4OTZDNywweDk4NjcsMHg5QUQ4LDB4OUYxMywweDU0RUQsMHg2NTlCLC8qIDB4RDAtMHhENyAqLworCTB4NjZGMiwweDY4OEYsMHg3QTQwLDB4OEMzNywweDlENjAsMHg1NkYwLDB4NTc2NCwweDVEMTEsLyogMHhEOC0weERGICovCisJMHg2NjA2LDB4NjhCMSwweDY4Q0QsMHg2RUZFLDB4NzQyOCwweDg4OUUsMHg5QkU0LDB4NkM2OCwvKiAweEUwLTB4RTcgKi8KKwkweEY5MDQsMHg5QUE4LDB4NEY5QiwweDUxNkMsMHg1MTcxLDB4NTI5RiwweDVCNTQsMHg1REU1LC8qIDB4RTgtMHhFRiAqLworCTB4NjA1MCwweDYwNkQsMHg2MkYxLDB4NjNBNywweDY1M0IsMHg3M0Q5LDB4N0E3QSwweDg2QTMsLyogMHhGMC0weEY3ICovCisJMHg4Q0EyLDB4OTc4RiwweDRFMzIsMHg1QkUxLDB4NjIwOCwweDY3OUMsMHg3NERDLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9DRVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDc5RDEsMHg4M0QzLDB4OEE4NywweDhBQjIsMHg4REU4LDB4OTA0RSwweDkzNEIsLyogMHhBMC0weEE3ICovCisJMHg5ODQ2LDB4NUVEMywweDY5RTgsMHg4NUZGLDB4OTBFRCwweEY5MDUsMHg1MUEwLDB4NUI5OCwvKiAweEE4LTB4QUYgKi8KKwkweDVCRUMsMHg2MTYzLDB4NjhGQSwweDZCM0UsMHg3MDRDLDB4NzQyRiwweDc0RDgsMHg3QkExLC8qIDB4QjAtMHhCNyAqLworCTB4N0Y1MCwweDgzQzUsMHg4OUMwLDB4OENBQiwweDk1REMsMHg5OTI4LDB4NTIyRSwweDYwNUQsLyogMHhCOC0weEJGICovCisJMHg2MkVDLDB4OTAwMiwweDRGOEEsMHg1MTQ5LDB4NTMyMSwweDU4RDksMHg1RUUzLDB4NjZFMCwvKiAweEMwLTB4QzcgKi8KKwkweDZEMzgsMHg3MDlBLDB4NzJDMiwweDczRDYsMHg3QjUwLDB4ODBGMSwweDk0NUIsMHg1MzY2LC8qIDB4QzgtMHhDRiAqLworCTB4NjM5QiwweDdGNkIsMHg0RTU2LDB4NTA4MCwweDU4NEEsMHg1OERFLDB4NjAyQSwweDYxMjcsLyogMHhEMC0weEQ3ICovCisJMHg2MkQwLDB4NjlEMCwweDlCNDEsMHg1QjhGLDB4N0QxOCwweDgwQjEsMHg4RjVGLDB4NEVBNCwvKiAweEQ4LTB4REYgKi8KKwkweDUwRDEsMHg1NEFDLDB4NTVBQywweDVCMEMsMHg1REEwLDB4NURFNywweDY1MkEsMHg2NTRFLC8qIDB4RTAtMHhFNyAqLworCTB4NjgyMSwweDZBNEIsMHg3MkUxLDB4NzY4RSwweDc3RUYsMHg3RDVFLDB4N0ZGOSwweDgxQTAsLyogMHhFOC0weEVGICovCisJMHg4NTRFLDB4ODZERiwweDhGMDMsMHg4RjRFLDB4OTBDQSwweDk5MDMsMHg5QTU1LDB4OUJBQiwvKiAweEYwLTB4RjcgKi8KKwkweDRFMTgsMHg0RTQ1LDB4NEU1RCwweDRFQzcsMHg0RkYxLDB4NTE3NywweDUyRkUsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0NGWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NTM0MCwweDUzRTMsMHg1M0U1LDB4NTQ4RSwweDU2MTQsMHg1Nzc1LDB4NTdBMiwvKiAweEEwLTB4QTcgKi8KKwkweDVCQzcsMHg1RDg3LDB4NUVEMCwweDYxRkMsMHg2MkQ4LDB4NjU1MSwweDY3QjgsMHg2N0U5LC8qIDB4QTgtMHhBRiAqLworCTB4NjlDQiwweDZCNTAsMHg2QkM2LDB4NkJFQywweDZDNDIsMHg2RTlELDB4NzA3OCwweDcyRDcsLyogMHhCMC0weEI3ICovCisJMHg3Mzk2LDB4NzQwMywweDc3QkYsMHg3N0U5LDB4N0E3NiwweDdEN0YsMHg4MDA5LDB4ODFGQywvKiAweEI4LTB4QkYgKi8KKwkweDgyMDUsMHg4MjBBLDB4ODJERiwweDg4NjIsMHg4QjMzLDB4OENGQywweDhFQzAsMHg5MDExLC8qIDB4QzAtMHhDNyAqLworCTB4OTBCMSwweDkyNjQsMHg5MkI2LDB4OTlEMiwweDlBNDUsMHg5Q0U5LDB4OURENywweDlGOUMsLyogMHhDOC0weENGICovCisJMHg1NzBCLDB4NUM0MCwweDgzQ0EsMHg5N0EwLDB4OTdBQiwweDlFQjQsMHg1NDFCLDB4N0E5OCwvKiAweEQwLTB4RDcgKi8KKwkweDdGQTQsMHg4OEQ5LDB4OEVDRCwweDkwRTEsMHg1ODAwLDB4NUM0OCwweDYzOTgsMHg3QTlGLC8qIDB4RDgtMHhERiAqLworCTB4NUJBRSwweDVGMTMsMHg3QTc5LDB4N0FBRSwweDgyOEUsMHg4RUFDLDB4NTAyNiwweDUyMzgsLyogMHhFMC0weEU3ICovCisJMHg1MkY4LDB4NTM3NywweDU3MDgsMHg2MkYzLDB4NjM3MiwweDZCMEEsMHg2REMzLDB4NzczNywvKiAweEU4LTB4RUYgKi8KKwkweDUzQTUsMHg3MzU3LDB4ODU2OCwweDhFNzYsMHg5NUQ1LDB4NjczQSwweDZBQzMsMHg2RjcwLC8qIDB4RjAtMHhGNyAqLworCTB4OEE2RCwweDhFQ0MsMHg5OTRCLDB4RjkwNiwweDY2NzcsMHg2Qjc4LDB4OENCNCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRDBbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg5QjNDLDB4RjkwNywweDUzRUIsMHg1NzJELDB4NTk0RSwweDYzQzYsMHg2OUZCLC8qIDB4QTAtMHhBNyAqLworCTB4NzNFQSwweDc4NDUsMHg3QUJBLDB4N0FDNSwweDdDRkUsMHg4NDc1LDB4ODk4RiwweDhENzMsLyogMHhBOC0weEFGICovCisJMHg5MDM1LDB4OTVBOCwweDUyRkIsMHg1NzQ3LDB4NzU0NywweDdCNjAsMHg4M0NDLDB4OTIxRSwvKiAweEIwLTB4QjcgKi8KKwkweEY5MDgsMHg2QTU4LDB4NTE0QiwweDUyNEIsMHg1Mjg3LDB4NjIxRiwweDY4RDgsMHg2OTc1LC8qIDB4QjgtMHhCRiAqLworCTB4OTY5OSwweDUwQzUsMHg1MkE0LDB4NTJFNCwweDYxQzMsMHg2NUE0LDB4NjgzOSwweDY5RkYsLyogMHhDMC0weEM3ICovCisJMHg3NDdFLDB4N0I0QiwweDgyQjksMHg4M0VCLDB4ODlCMiwweDhCMzksMHg4RkQxLDB4OTk0OSwvKiAweEM4LTB4Q0YgKi8KKwkweEY5MDksMHg0RUNBLDB4NTk5NywweDY0RDIsMHg2NjExLDB4NkE4RSwweDc0MzQsMHg3OTgxLC8qIDB4RDAtMHhENyAqLworCTB4NzlCRCwweDgyQTksMHg4ODdFLDB4ODg3RiwweDg5NUYsMHhGOTBBLDB4OTMyNiwweDRGMEIsLyogMHhEOC0weERGICovCisJMHg1M0NBLDB4NjAyNSwweDYyNzEsMHg2QzcyLDB4N0QxQSwweDdENjYsMHg0RTk4LDB4NTE2MiwvKiAweEUwLTB4RTcgKi8KKwkweDc3REMsMHg4MEFGLDB4NEYwMSwweDRGMEUsMHg1MTc2LDB4NTE4MCwweDU1REMsMHg1NjY4LC8qIDB4RTgtMHhFRiAqLworCTB4NTczQiwweDU3RkEsMHg1N0ZDLDB4NTkxNCwweDU5NDcsMHg1OTkzLDB4NUJDNCwweDVDOTAsLyogMHhGMC0weEY3ICovCisJMHg1RDBFLDB4NURGMSwweDVFN0UsMHg1RkNDLDB4NjI4MCwweDY1RDcsMHg2NUUzLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9EMVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDY3MUUsMHg2NzFGLDB4Njc1RSwweDY4Q0IsMHg2OEM0LDB4NkE1RiwweDZCM0EsLyogMHhBMC0weEE3ICovCisJMHg2QzIzLDB4NkM3RCwweDZDODIsMHg2REM3LDB4NzM5OCwweDc0MjYsMHg3NDJBLDB4NzQ4MiwvKiAweEE4LTB4QUYgKi8KKwkweDc0QTMsMHg3NTc4LDB4NzU3RiwweDc4ODEsMHg3OEVGLDB4Nzk0MSwweDc5NDcsMHg3OTQ4LC8qIDB4QjAtMHhCNyAqLworCTB4Nzk3QSwweDdCOTUsMHg3RDAwLDB4N0RCQSwweDdGODgsMHg4MDA2LDB4ODAyRCwweDgwOEMsLyogMHhCOC0weEJGICovCisJMHg4QTE4LDB4OEI0RiwweDhDNDgsMHg4RDc3LDB4OTMyMSwweDkzMjQsMHg5OEUyLDB4OTk1MSwvKiAweEMwLTB4QzcgKi8KKwkweDlBMEUsMHg5QTBGLDB4OUE2NSwweDlFOTIsMHg3RENBLDB4NEY3NiwweDU0MDksMHg2MkVFLC8qIDB4QzgtMHhDRiAqLworCTB4Njg1NCwweDkxRDEsMHg1NUFCLDB4NTEzQSwweEY5MEIsMHhGOTBDLDB4NUExQywweDYxRTYsLyogMHhEMC0weEQ3ICovCisJMHhGOTBELDB4NjJDRiwweDYyRkYsMHhGOTBFLDB4RjkwRiwweEY5MTAsMHhGOTExLDB4RjkxMiwvKiAweEQ4LTB4REYgKi8KKwkweEY5MTMsMHg5MEEzLDB4RjkxNCwweEY5MTUsMHhGOTE2LDB4RjkxNywweEY5MTgsMHg4QUZFLC8qIDB4RTAtMHhFNyAqLworCTB4RjkxOSwweEY5MUEsMHhGOTFCLDB4RjkxQywweDY2OTYsMHhGOTFELDB4NzE1NiwweEY5MUUsLyogMHhFOC0weEVGICovCisJMHhGOTFGLDB4OTZFMywweEY5MjAsMHg2MzRGLDB4NjM3QSwweDUzNTcsMHhGOTIxLDB4Njc4RiwvKiAweEYwLTB4RjcgKi8KKwkweDY5NjAsMHg2RTczLDB4RjkyMiwweDc1MzcsMHhGOTIzLDB4RjkyNCwweEY5MjUsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0QyWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4N0QwRCwweEY5MjYsMHhGOTI3LDB4ODg3MiwweDU2Q0EsMHg1QTE4LDB4RjkyOCwvKiAweEEwLTB4QTcgKi8KKwkweEY5MjksMHhGOTJBLDB4RjkyQiwweEY5MkMsMHg0RTQzLDB4RjkyRCwweDUxNjcsMHg1OTQ4LC8qIDB4QTgtMHhBRiAqLworCTB4NjdGMCwweDgwMTAsMHhGOTJFLDB4NTk3MywweDVFNzQsMHg2NDlBLDB4NzlDQSwweDVGRjUsLyogMHhCMC0weEI3ICovCisJMHg2MDZDLDB4NjJDOCwweDYzN0IsMHg1QkU3LDB4NUJENywweDUyQUEsMHhGOTJGLDB4NTk3NCwvKiAweEI4LTB4QkYgKi8KKwkweDVGMjksMHg2MDEyLDB4RjkzMCwweEY5MzEsMHhGOTMyLDB4NzQ1OSwweEY5MzMsMHhGOTM0LC8qIDB4QzAtMHhDNyAqLworCTB4RjkzNSwweEY5MzYsMHhGOTM3LDB4RjkzOCwweDk5RDEsMHhGOTM5LDB4RjkzQSwweEY5M0IsLyogMHhDOC0weENGICovCisJMHhGOTNDLDB4RjkzRCwweEY5M0UsMHhGOTNGLDB4Rjk0MCwweEY5NDEsMHhGOTQyLDB4Rjk0MywvKiAweEQwLTB4RDcgKi8KKwkweDZGQzMsMHhGOTQ0LDB4Rjk0NSwweDgxQkYsMHg4RkIyLDB4NjBGMSwweEY5NDYsMHhGOTQ3LC8qIDB4RDgtMHhERiAqLworCTB4ODE2NiwweEY5NDgsMHhGOTQ5LDB4NUMzRiwweEY5NEEsMHhGOTRCLDB4Rjk0QywweEY5NEQsLyogMHhFMC0weEU3ICovCisJMHhGOTRFLDB4Rjk0RiwweEY5NTAsMHhGOTUxLDB4NUFFOSwweDhBMjUsMHg2NzdCLDB4N0QxMCwvKiAweEU4LTB4RUYgKi8KKwkweEY5NTIsMHhGOTUzLDB4Rjk1NCwweEY5NTUsMHhGOTU2LDB4Rjk1NywweDgwRkQsMHhGOTU4LC8qIDB4RjAtMHhGNyAqLworCTB4Rjk1OSwweDVDM0MsMHg2Q0U1LDB4NTMzRiwweDZFQkEsMHg1OTFBLDB4ODMzNiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRDNbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg0RTM5LDB4NEVCNiwweDRGNDYsMHg1NUFFLDB4NTcxOCwweDU4QzcsMHg1RjU2LC8qIDB4QTAtMHhBNyAqLworCTB4NjVCNywweDY1RTYsMHg2QTgwLDB4NkJCNSwweDZFNEQsMHg3N0VELDB4N0FFRiwweDdDMUUsLyogMHhBOC0weEFGICovCisJMHg3RERFLDB4ODZDQiwweDg4OTIsMHg5MTMyLDB4OTM1QiwweDY0QkIsMHg2RkJFLDB4NzM3QSwvKiAweEIwLTB4QjcgKi8KKwkweDc1QjgsMHg5MDU0LDB4NTU1NiwweDU3NEQsMHg2MUJBLDB4NjRENCwweDY2QzcsMHg2REUxLC8qIDB4QjgtMHhCRiAqLworCTB4NkU1QiwweDZGNkQsMHg2RkI5LDB4NzVGMCwweDgwNDMsMHg4MUJELDB4ODU0MSwweDg5ODMsLyogMHhDMC0weEM3ICovCisJMHg4QUM3LDB4OEI1QSwweDkzMUYsMHg2QzkzLDB4NzU1MywweDdCNTQsMHg4RTBGLDB4OTA1RCwvKiAweEM4LTB4Q0YgKi8KKwkweDU1MTAsMHg1ODAyLDB4NTg1OCwweDVFNjIsMHg2MjA3LDB4NjQ5RSwweDY4RTAsMHg3NTc2LC8qIDB4RDAtMHhENyAqLworCTB4N0NENiwweDg3QjMsMHg5RUU4LDB4NEVFMywweDU3ODgsMHg1NzZFLDB4NTkyNywweDVDMEQsLyogMHhEOC0weERGICovCisJMHg1Q0IxLDB4NUUzNiwweDVGODUsMHg2MjM0LDB4NjRFMSwweDczQjMsMHg4MUZBLDB4ODg4QiwvKiAweEUwLTB4RTcgKi8KKwkweDhDQjgsMHg5NjhBLDB4OUVEQiwweDVCODUsMHg1RkI3LDB4NjBCMywweDUwMTIsMHg1MjAwLC8qIDB4RTgtMHhFRiAqLworCTB4NTIzMCwweDU3MTYsMHg1ODM1LDB4NTg1NywweDVDMEUsMHg1QzYwLDB4NUNGNiwweDVEOEIsLyogMHhGMC0weEY3ICovCisJMHg1RUE2LDB4NUY5MiwweDYwQkMsMHg2MzExLDB4NjM4OSwweDY0MTcsMHg2ODQzLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9ENFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDY4RjksMHg2QUMyLDB4NkREOCwweDZFMjEsMHg2RUQ0LDB4NkZFNCwweDcxRkUsLyogMHhBMC0weEE3ICovCisJMHg3NkRDLDB4Nzc3OSwweDc5QjEsMHg3QTNCLDB4ODQwNCwweDg5QTksMHg4Q0VELDB4OERGMywvKiAweEE4LTB4QUYgKi8KKwkweDhFNDgsMHg5MDAzLDB4OTAxNCwweDkwNTMsMHg5MEZELDB4OTM0RCwweDk2NzYsMHg5N0RDLC8qIDB4QjAtMHhCNyAqLworCTB4NkJEMiwweDcwMDYsMHg3MjU4LDB4NzJBMiwweDczNjgsMHg3NzYzLDB4NzlCRiwweDdCRTQsLyogMHhCOC0weEJGICovCisJMHg3RTlCLDB4OEI4MCwweDU4QTksMHg2MEM3LDB4NjU2NiwweDY1RkQsMHg2NkJFLDB4NkM4QywvKiAweEMwLTB4QzcgKi8KKwkweDcxMUUsMHg3MUM5LDB4OEM1QSwweDk4MTMsMHg0RTZELDB4N0E4MSwweDRFREQsMHg1MUFDLC8qIDB4QzgtMHhDRiAqLworCTB4NTFDRCwweDUyRDUsMHg1NDBDLDB4NjFBNywweDY3NzEsMHg2ODUwLDB4NjhERiwweDZEMUUsLyogMHhEMC0weEQ3ICovCisJMHg2RjdDLDB4NzVCQywweDc3QjMsMHg3QUU1LDB4ODBGNCwweDg0NjMsMHg5Mjg1LDB4NTE1QywvKiAweEQ4LTB4REYgKi8KKwkweDY1OTcsMHg2NzVDLDB4Njc5MywweDc1RDgsMHg3QUM3LDB4ODM3MywweEY5NUEsMHg4QzQ2LC8qIDB4RTAtMHhFNyAqLworCTB4OTAxNywweDk4MkQsMHg1QzZGLDB4ODFDMCwweDgyOUEsMHg5MDQxLDB4OTA2RiwweDkyMEQsLyogMHhFOC0weEVGICovCisJMHg1Rjk3LDB4NUQ5RCwweDZBNTksMHg3MUM4LDB4NzY3QiwweDdCNDksMHg4NUU0LDB4OEIwNCwvKiAweEYwLTB4RjcgKi8KKwkweDkxMjcsMHg5QTMwLDB4NTU4NywweDYxRjYsMHhGOTVCLDB4NzY2OSwweDdGODUsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0Q1WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4ODYzRiwweDg3QkEsMHg4OEY4LDB4OTA4RiwweEY5NUMsMHg2RDFCLDB4NzBEOSwvKiAweEEwLTB4QTcgKi8KKwkweDczREUsMHg3RDYxLDB4ODQzRCwweEY5NUQsMHg5MTZBLDB4OTlGMSwweEY5NUUsMHg0RTgyLC8qIDB4QTgtMHhBRiAqLworCTB4NTM3NSwweDZCMDQsMHg2QjEyLDB4NzAzRSwweDcyMUIsMHg4NjJELDB4OUUxRSwweDUyNEMsLyogMHhCMC0weEI3ICovCisJMHg4RkEzLDB4NUQ1MCwweDY0RTUsMHg2NTJDLDB4NkIxNiwweDZGRUIsMHg3QzQzLDB4N0U5QywvKiAweEI4LTB4QkYgKi8KKwkweDg1Q0QsMHg4OTY0LDB4ODlCRCwweDYyQzksMHg4MUQ4LDB4ODgxRiwweDVFQ0EsMHg2NzE3LC8qIDB4QzAtMHhDNyAqLworCTB4NkQ2QSwweDcyRkMsMHg3NDA1LDB4NzQ2RiwweDg3ODIsMHg5MERFLDB4NEY4NiwweDVEMEQsLyogMHhDOC0weENGICovCisJMHg1RkEwLDB4ODQwQSwweDUxQjcsMHg2M0EwLDB4NzU2NSwweDRFQUUsMHg1MDA2LDB4NTE2OSwvKiAweEQwLTB4RDcgKi8KKwkweDUxQzksMHg2ODgxLDB4NkExMSwweDdDQUUsMHg3Q0IxLDB4N0NFNywweDgyNkYsMHg4QUQyLC8qIDB4RDgtMHhERiAqLworCTB4OEYxQiwweDkxQ0YsMHg0RkI2LDB4NTEzNywweDUyRjUsMHg1NDQyLDB4NUVFQywweDYxNkUsLyogMHhFMC0weEU3ICovCisJMHg2MjNFLDB4NjVDNSwweDZBREEsMHg2RkZFLDB4NzkyQSwweDg1REMsMHg4ODIzLDB4OTVBRCwvKiAweEU4LTB4RUYgKi8KKwkweDlBNjIsMHg5QTZBLDB4OUU5NywweDlFQ0UsMHg1MjlCLDB4NjZDNiwweDZCNzcsMHg3MDFELC8qIDB4RjAtMHhGNyAqLworCTB4NzkyQiwweDhGNjIsMHg5NzQyLDB4NjE5MCwweDYyMDAsMHg2NTIzLDB4NkYyMywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRDZbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg3MTQ5LDB4NzQ4OSwweDdERjQsMHg4MDZGLDB4ODRFRSwweDhGMjYsMHg5MDIzLC8qIDB4QTAtMHhBNyAqLworCTB4OTM0QSwweDUxQkQsMHg1MjE3LDB4NTJBMywweDZEMEMsMHg3MEM4LDB4ODhDMiwweDVFQzksLyogMHhBOC0weEFGICovCisJMHg2NTgyLDB4NkJBRSwweDZGQzIsMHg3QzNFLDB4NzM3NSwweDRFRTQsMHg0RjM2LDB4NTZGOSwvKiAweEIwLTB4QjcgKi8KKwkweEY5NUYsMHg1Q0JBLDB4NURCQSwweDYwMUMsMHg3M0IyLDB4N0IyRCwweDdGOUEsMHg3RkNFLC8qIDB4QjgtMHhCRiAqLworCTB4ODA0NiwweDkwMUUsMHg5MjM0LDB4OTZGNiwweDk3NDgsMHg5ODE4LDB4OUY2MSwweDRGOEIsLyogMHhDMC0weEM3ICovCisJMHg2RkE3LDB4NzlBRSwweDkxQjQsMHg5NkI3LDB4NTJERSwweEY5NjAsMHg2NDg4LDB4NjRDNCwvKiAweEM4LTB4Q0YgKi8KKwkweDZBRDMsMHg2RjVFLDB4NzAxOCwweDcyMTAsMHg3NkU3LDB4ODAwMSwweDg2MDYsMHg4NjVDLC8qIDB4RDAtMHhENyAqLworCTB4OERFRiwweDhGMDUsMHg5NzMyLDB4OUI2RiwweDlERkEsMHg5RTc1LDB4Nzg4QywweDc5N0YsLyogMHhEOC0weERGICovCisJMHg3REEwLDB4ODNDOSwweDkzMDQsMHg5RTdGLDB4OUU5MywweDhBRDYsMHg1OERGLDB4NUYwNCwvKiAweEUwLTB4RTcgKi8KKwkweDY3MjcsMHg3MDI3LDB4NzRDRiwweDdDNjAsMHg4MDdFLDB4NTEyMSwweDcwMjgsMHg3MjYyLC8qIDB4RTgtMHhFRiAqLworCTB4NzhDQSwweDhDQzIsMHg4Q0RBLDB4OENGNCwweDk2RjcsMHg0RTg2LDB4NTBEQSwweDVCRUUsLyogMHhGMC0weEY3ICovCisJMHg1RUQ2LDB4NjU5OSwweDcxQ0UsMHg3NjQyLDB4NzdBRCwweDgwNEEsMHg4NEZDLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9EN1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDkwN0MsMHg5QjI3LDB4OUY4RCwweDU4RDgsMHg1QTQxLDB4NUM2MiwweDZBMTMsLyogMHhBMC0weEE3ICovCisJMHg2RERBLDB4NkYwRiwweDc2M0IsMHg3RDJGLDB4N0UzNywweDg1MUUsMHg4OTM4LDB4OTNFNCwvKiAweEE4LTB4QUYgKi8KKwkweDk2NEIsMHg1Mjg5LDB4NjVEMiwweDY3RjMsMHg2OUI0LDB4NkQ0MSwweDZFOUMsMHg3MDBGLC8qIDB4QjAtMHhCNyAqLworCTB4NzQwOSwweDc0NjAsMHg3NTU5LDB4NzYyNCwweDc4NkIsMHg4QjJDLDB4OTg1RSwweDUxNkQsLyogMHhCOC0weEJGICovCisJMHg2MjJFLDB4OTY3OCwweDRGOTYsMHg1MDJCLDB4NUQxOSwweDZERUEsMHg3REI4LDB4OEYyQSwvKiAweEMwLTB4QzcgKi8KKwkweDVGOEIsMHg2MTQ0LDB4NjgxNywweEY5NjEsMHg5Njg2LDB4NTJEMiwweDgwOEIsMHg1MURDLC8qIDB4QzgtMHhDRiAqLworCTB4NTFDQywweDY5NUUsMHg3QTFDLDB4N0RCRSwweDgzRjEsMHg5Njc1LDB4NEZEQSwweDUyMjksLyogMHhEMC0weEQ3ICovCisJMHg1Mzk4LDB4NTQwRiwweDU1MEUsMHg1QzY1LDB4NjBBNywweDY3NEUsMHg2OEE4LDB4NkQ2QywvKiAweEQ4LTB4REYgKi8KKwkweDcyODEsMHg3MkY4LDB4NzQwNiwweDc0ODMsMHhGOTYyLDB4NzVFMiwweDdDNkMsMHg3Rjc5LC8qIDB4RTAtMHhFNyAqLworCTB4N0ZCOCwweDgzODksMHg4OENGLDB4ODhFMSwweDkxQ0MsMHg5MUQwLDB4OTZFMiwweDlCQzksLyogMHhFOC0weEVGICovCisJMHg1NDFELDB4NkY3RSwweDcxRDAsMHg3NDk4LDB4ODVGQSwweDhFQUEsMHg5NkEzLDB4OUM1NywvKiAweEYwLTB4RjcgKi8KKwkweDlFOUYsMHg2Nzk3LDB4NkRDQiwweDc0MzMsMHg4MUU4LDB4OTcxNiwweDc4MkMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0Q4WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4N0FDQiwweDdCMjAsMHg3QzkyLDB4NjQ2OSwweDc0NkEsMHg3NUYyLDB4NzhCQywvKiAweEEwLTB4QTcgKi8KKwkweDc4RTgsMHg5OUFDLDB4OUI1NCwweDlFQkIsMHg1QkRFLDB4NUU1NSwweDZGMjAsMHg4MTlDLC8qIDB4QTgtMHhBRiAqLworCTB4ODNBQiwweDkwODgsMHg0RTA3LDB4NTM0RCwweDVBMjksMHg1REQyLDB4NUY0RSwweDYxNjIsLyogMHhCMC0weEI3ICovCisJMHg2MzNELDB4NjY2OSwweDY2RkMsMHg2RUZGLDB4NkYyQiwweDcwNjMsMHg3NzlFLDB4ODQyQywvKiAweEI4LTB4QkYgKi8KKwkweDg1MTMsMHg4ODNCLDB4OEYxMywweDk5NDUsMHg5QzNCLDB4NTUxQywweDYyQjksMHg2NzJCLC8qIDB4QzAtMHhDNyAqLworCTB4NkNBQiwweDgzMDksMHg4OTZBLDB4OTc3QSwweDRFQTEsMHg1OTg0LDB4NUZEOCwweDVGRDksLyogMHhDOC0weENGICovCisJMHg2NzFCLDB4N0RCMiwweDdGNTQsMHg4MjkyLDB4ODMyQiwweDgzQkQsMHg4RjFFLDB4OTA5OSwvKiAweEQwLTB4RDcgKi8KKwkweDU3Q0IsMHg1OUI5LDB4NUE5MiwweDVCRDAsMHg2NjI3LDB4Njc5QSwweDY4ODUsMHg2QkNGLC8qIDB4RDgtMHhERiAqLworCTB4NzE2NCwweDdGNzUsMHg4Q0I3LDB4OENFMywweDkwODEsMHg5QjQ1LDB4ODEwOCwweDhDOEEsLyogMHhFMC0weEU3ICovCisJMHg5NjRDLDB4OUE0MCwweDlFQTUsMHg1QjVGLDB4NkMxMywweDczMUIsMHg3NkYyLDB4NzZERiwvKiAweEU4LTB4RUYgKi8KKwkweDg0MEMsMHg1MUFBLDB4ODk5MywweDUxNEQsMHg1MTk1LDB4NTJDOSwweDY4QzksMHg2Qzk0LC8qIDB4RjAtMHhGNyAqLworCTB4NzcwNCwweDc3MjAsMHg3REJGLDB4N0RFQywweDk3NjIsMHg5RUI1LDB4NkVDNSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRDlbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg4NTExLDB4NTFBNSwweDU0MEQsMHg1NDdELDB4NjYwRSwweDY2OUQsMHg2OTI3LC8qIDB4QTAtMHhBNyAqLworCTB4NkU5RiwweDc2QkYsMHg3NzkxLDB4ODMxNywweDg0QzIsMHg4NzlGLDB4OTE2OSwweDkyOTgsLyogMHhBOC0weEFGICovCisJMHg5Q0Y0LDB4ODg4MiwweDRGQUUsMHg1MTkyLDB4NTJERiwweDU5QzYsMHg1RTNELDB4NjE1NSwvKiAweEIwLTB4QjcgKi8KKwkweDY0NzgsMHg2NDc5LDB4NjZBRSwweDY3RDAsMHg2QTIxLDB4NkJDRCwweDZCREIsMHg3MjVGLC8qIDB4QjgtMHhCRiAqLworCTB4NzI2MSwweDc0NDEsMHg3NzM4LDB4NzdEQiwweDgwMTcsMHg4MkJDLDB4ODMwNSwweDhCMDAsLyogMHhDMC0weEM3ICovCisJMHg4QjI4LDB4OEM4QywweDY3MjgsMHg2QzkwLDB4NzI2NywweDc2RUUsMHg3NzY2LDB4N0E0NiwvKiAweEM4LTB4Q0YgKi8KKwkweDlEQTksMHg2QjdGLDB4NkM5MiwweDU5MjIsMHg2NzI2LDB4ODQ5OSwweDUzNkYsMHg1ODkzLC8qIDB4RDAtMHhENyAqLworCTB4NTk5OSwweDVFREYsMHg2M0NGLDB4NjYzNCwweDY3NzMsMHg2RTNBLDB4NzMyQiwweDdBRDcsLyogMHhEOC0weERGICovCisJMHg4MkQ3LDB4OTMyOCwweDUyRDksMHg1REVCLDB4NjFBRSwweDYxQ0IsMHg2MjBBLDB4NjJDNywvKiAweEUwLTB4RTcgKi8KKwkweDY0QUIsMHg2NUUwLDB4Njk1OSwweDZCNjYsMHg2QkNCLDB4NzEyMSwweDczRjcsMHg3NTVELC8qIDB4RTgtMHhFRiAqLworCTB4N0U0NiwweDgyMUUsMHg4MzAyLDB4ODU2QSwweDhBQTMsMHg4Q0JGLDB4OTcyNywweDlENjEsLyogMHhGMC0weEY3ICovCisJMHg1OEE4LDB4OUVEOCwweDUwMTEsMHg1MjBFLDB4NTQzQiwweDU1NEYsMHg2NTg3LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9EQVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDZDNzYsMHg3RDBBLDB4N0QwQiwweDgwNUUsMHg4NjhBLDB4OTU4MCwweDk2RUYsLyogMHhBMC0weEE3ICovCisJMHg1MkZGLDB4NkM5NSwweDcyNjksMHg1NDczLDB4NUE5QSwweDVDM0UsMHg1RDRCLDB4NUY0QywvKiAweEE4LTB4QUYgKi8KKwkweDVGQUUsMHg2NzJBLDB4NjhCNiwweDY5NjMsMHg2RTNDLDB4NkU0NCwweDc3MDksMHg3QzczLC8qIDB4QjAtMHhCNyAqLworCTB4N0Y4RSwweDg1ODcsMHg4QjBFLDB4OEZGNywweDk3NjEsMHg5RUY0LDB4NUNCNywweDYwQjYsLyogMHhCOC0weEJGICovCisJMHg2MTBELDB4NjFBQiwweDY1NEYsMHg2NUZCLDB4NjVGQywweDZDMTEsMHg2Q0VGLDB4NzM5RiwvKiAweEMwLTB4QzcgKi8KKwkweDczQzksMHg3REUxLDB4OTU5NCwweDVCQzYsMHg4NzFDLDB4OEIxMCwweDUyNUQsMHg1MzVBLC8qIDB4QzgtMHhDRiAqLworCTB4NjJDRCwweDY0MEYsMHg2NEIyLDB4NjczNCwweDZBMzgsMHg2Q0NBLDB4NzNDMCwweDc0OUUsLyogMHhEMC0weEQ3ICovCisJMHg3Qjk0LDB4N0M5NSwweDdFMUIsMHg4MThBLDB4ODIzNiwweDg1ODQsMHg4RkVCLDB4OTZGOSwvKiAweEQ4LTB4REYgKi8KKwkweDk5QzEsMHg0RjM0LDB4NTM0QSwweDUzQ0QsMHg1M0RCLDB4NjJDQywweDY0MkMsMHg2NTAwLC8qIDB4RTAtMHhFNyAqLworCTB4NjU5MSwweDY5QzMsMHg2Q0VFLDB4NkY1OCwweDczRUQsMHg3NTU0LDB4NzYyMiwweDc2RTQsLyogMHhFOC0weEVGICovCisJMHg3NkZDLDB4NzhEMCwweDc4RkIsMHg3OTJDLDB4N0Q0NiwweDgyMkMsMHg4N0UwLDB4OEZENCwvKiAweEYwLTB4RjcgKi8KKwkweDk4MTIsMHg5OEVGLDB4NTJDMywweDYyRDQsMHg2NEE1LDB4NkUyNCwweDZGNTEsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0RCWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NzY3QywweDhEQ0IsMHg5MUIxLDB4OTI2MiwweDlBRUUsMHg5QjQzLDB4NTAyMywvKiAweEEwLTB4QTcgKi8KKwkweDUwOEQsMHg1NzRBLDB4NTlBOCwweDVDMjgsMHg1RTQ3LDB4NUY3NywweDYyM0YsMHg2NTNFLC8qIDB4QTgtMHhBRiAqLworCTB4NjVCOSwweDY1QzEsMHg2NjA5LDB4Njc4QiwweDY5OUMsMHg2RUMyLDB4NzhDNSwweDdEMjEsLyogMHhCMC0weEI3ICovCisJMHg4MEFBLDB4ODE4MCwweDgyMkIsMHg4MkIzLDB4ODRBMSwweDg2OEMsMHg4QTJBLDB4OEIxNywvKiAweEI4LTB4QkYgKi8KKwkweDkwQTYsMHg5NjMyLDB4OUY5MCwweDUwMEQsMHg0RkYzLDB4Rjk2MywweDU3RjksMHg1Rjk4LC8qIDB4QzAtMHhDNyAqLworCTB4NjJEQywweDYzOTIsMHg2NzZGLDB4NkU0MywweDcxMTksMHg3NkMzLDB4ODBDQywweDgwREEsLyogMHhDOC0weENGICovCisJMHg4OEY0LDB4ODhGNSwweDg5MTksMHg4Q0UwLDB4OEYyOSwweDkxNEQsMHg5NjZBLDB4NEYyRiwvKiAweEQwLTB4RDcgKi8KKwkweDRGNzAsMHg1RTFCLDB4NjdDRiwweDY4MjIsMHg3NjdELDB4NzY3RSwweDlCNDQsMHg1RTYxLC8qIDB4RDgtMHhERiAqLworCTB4NkEwQSwweDcxNjksMHg3MUQ0LDB4NzU2QSwweEY5NjQsMHg3RTQxLDB4ODU0MywweDg1RTksLyogMHhFMC0weEU3ICovCisJMHg5OERDLDB4NEYxMCwweDdCNEYsMHg3RjcwLDB4OTVBNSwweDUxRTEsMHg1RTA2LDB4NjhCNSwvKiAweEU4LTB4RUYgKi8KKwkweDZDM0UsMHg2QzRFLDB4NkNEQiwweDcyQUYsMHg3QkM0LDB4ODMwMywweDZDRDUsMHg3NDNBLC8qIDB4RjAtMHhGNyAqLworCTB4NTBGQiwweDUyODgsMHg1OEMxLDB4NjREOCwweDZBOTcsMHg3NEE3LDB4NzY1NiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRENbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg3OEE3LDB4ODYxNywweDk1RTIsMHg5NzM5LDB4Rjk2NSwweDUzNUUsMHg1RjAxLC8qIDB4QTAtMHhBNyAqLworCTB4OEI4QSwweDhGQTgsMHg4RkFGLDB4OTA4QSwweDUyMjUsMHg3N0E1LDB4OUM0OSwweDlGMDgsLyogMHhBOC0weEFGICovCisJMHg0RTE5LDB4NTAwMiwweDUxNzUsMHg1QzVCLDB4NUU3NywweDY2MUUsMHg2NjNBLDB4NjdDNCwvKiAweEIwLTB4QjcgKi8KKwkweDY4QzUsMHg3MEIzLDB4NzUwMSwweDc1QzUsMHg3OUM5LDB4N0FERCwweDhGMjcsMHg5OTIwLC8qIDB4QjgtMHhCRiAqLworCTB4OUEwOCwweDRGREQsMHg1ODIxLDB4NTgzMSwweDVCRjYsMHg2NjZFLDB4NkI2NSwweDZEMTEsLyogMHhDMC0weEM3ICovCisJMHg2RTdBLDB4NkY3RCwweDczRTQsMHg3NTJCLDB4ODNFOSwweDg4REMsMHg4OTEzLDB4OEI1QywvKiAweEM4LTB4Q0YgKi8KKwkweDhGMTQsMHg0RjBGLDB4NTBENSwweDUzMTAsMHg1MzVDLDB4NUI5MywweDVGQTksMHg2NzBELC8qIDB4RDAtMHhENyAqLworCTB4Nzk4RiwweDgxNzksMHg4MzJGLDB4ODUxNCwweDg5MDcsMHg4OTg2LDB4OEYzOSwweDhGM0IsLyogMHhEOC0weERGICovCisJMHg5OUE1LDB4OUMxMiwweDY3MkMsMHg0RTc2LDB4NEZGOCwweDU5NDksMHg1QzAxLDB4NUNFRiwvKiAweEUwLTB4RTcgKi8KKwkweDVDRjAsMHg2MzY3LDB4NjhEMiwweDcwRkQsMHg3MUEyLDB4NzQyQiwweDdFMkIsMHg4NEVDLC8qIDB4RTgtMHhFRiAqLworCTB4ODcwMiwweDkwMjIsMHg5MkQyLDB4OUNGMywweDRFMEQsMHg0RUQ4LDB4NEZFRiwweDUwODUsLyogMHhGMC0weEY3ICovCisJMHg1MjU2LDB4NTI2RiwweDU0MjYsMHg1NDkwLDB4NTdFMCwweDU5MkIsMHg1QTY2LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9ERFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDVCNUEsMHg1Qjc1LDB4NUJDQywweDVFOUMsMHhGOTY2LDB4NjI3NiwweDY1NzcsLyogMHhBMC0weEE3ICovCisJMHg2NUE3LDB4NkQ2RSwweDZFQTUsMHg3MjM2LDB4N0IyNiwweDdDM0YsMHg3RjM2LDB4ODE1MCwvKiAweEE4LTB4QUYgKi8KKwkweDgxNTEsMHg4MTlBLDB4ODI0MCwweDgyOTksMHg4M0E5LDB4OEEwMywweDhDQTAsMHg4Q0U2LC8qIDB4QjAtMHhCNyAqLworCTB4OENGQiwweDhENzQsMHg4REJBLDB4OTBFOCwweDkxREMsMHg5NjFDLDB4OTY0NCwweDk5RDksLyogMHhCOC0weEJGICovCisJMHg5Q0U3LDB4NTMxNywweDUyMDYsMHg1NDI5LDB4NTY3NCwweDU4QjMsMHg1OTU0LDB4NTk2RSwvKiAweEMwLTB4QzcgKi8KKwkweDVGRkYsMHg2MUE0LDB4NjI2RSwweDY2MTAsMHg2QzdFLDB4NzExQSwweDc2QzYsMHg3Qzg5LC8qIDB4QzgtMHhDRiAqLworCTB4N0NERSwweDdEMUIsMHg4MkFDLDB4OENDMSwweDk2RjAsMHhGOTY3LDB4NEY1QiwweDVGMTcsLyogMHhEMC0weEQ3ICovCisJMHg1RjdGLDB4NjJDMiwweDVEMjksMHg2NzBCLDB4NjhEQSwweDc4N0MsMHg3RTQzLDB4OUQ2QywvKiAweEQ4LTB4REYgKi8KKwkweDRFMTUsMHg1MDk5LDB4NTMxNSwweDUzMkEsMHg1MzUxLDB4NTk4MywweDVBNjIsMHg1RTg3LC8qIDB4RTAtMHhFNyAqLworCTB4NjBCMiwweDYxOEEsMHg2MjQ5LDB4NjI3OSwweDY1OTAsMHg2Nzg3LDB4NjlBNywweDZCRDQsLyogMHhFOC0weEVGICovCisJMHg2QkQ2LDB4NkJENywweDZCRDgsMHg2Q0I4LDB4Rjk2OCwweDc0MzUsMHg3NUZBLDB4NzgxMiwvKiAweEYwLTB4RjcgKi8KKwkweDc4OTEsMHg3OUQ1LDB4NzlEOCwweDdDODMsMHg3RENCLDB4N0ZFMSwweDgwQTUsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0RFWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4ODEzRSwweDgxQzIsMHg4M0YyLDB4ODcxQSwweDg4RTgsMHg4QUI5LDB4OEI2QywvKiAweEEwLTB4QTcgKi8KKwkweDhDQkIsMHg5MTE5LDB4OTc1RSwweDk4REIsMHg5RjNCLDB4NTZBQywweDVCMkEsMHg1RjZDLC8qIDB4QTgtMHhBRiAqLworCTB4NjU4QywweDZBQjMsMHg2QkFGLDB4NkQ1QywweDZGRjEsMHg3MDE1LDB4NzI1RCwweDczQUQsLyogMHhCMC0weEI3ICovCisJMHg4Q0E3LDB4OENEMywweDk4M0IsMHg2MTkxLDB4NkMzNywweDgwNTgsMHg5QTAxLDB4NEU0RCwvKiAweEI4LTB4QkYgKi8KKwkweDRFOEIsMHg0RTlCLDB4NEVENSwweDRGM0EsMHg0RjNDLDB4NEY3RiwweDRGREYsMHg1MEZGLC8qIDB4QzAtMHhDNyAqLworCTB4NTNGMiwweDUzRjgsMHg1NTA2LDB4NTVFMywweDU2REIsMHg1OEVCLDB4NTk2MiwweDVBMTEsLyogMHhDOC0weENGICovCisJMHg1QkVCLDB4NUJGQSwweDVDMDQsMHg1REYzLDB4NUUyQiwweDVGOTksMHg2MDFELDB4NjM2OCwvKiAweEQwLTB4RDcgKi8KKwkweDY1OUMsMHg2NUFGLDB4NjdGNiwweDY3RkIsMHg2OEFELDB4NkI3QiwweDZDOTksMHg2Q0Q3LC8qIDB4RDgtMHhERiAqLworCTB4NkUyMywweDcwMDksMHg3MzQ1LDB4NzgwMiwweDc5M0UsMHg3OTQwLDB4Nzk2MCwweDc5QzEsLyogMHhFMC0weEU3ICovCisJMHg3QkU5LDB4N0QxNywweDdENzIsMHg4MDg2LDB4ODIwRCwweDgzOEUsMHg4NEQxLDB4ODZDNywvKiAweEU4LTB4RUYgKi8KKwkweDg4REYsMHg4QTUwLDB4OEE1RSwweDhCMUQsMHg4Q0RDLDB4OEQ2NiwweDhGQUQsMHg5MEFBLC8qIDB4RjAtMHhGNyAqLworCTB4OThGQywweDk5REYsMHg5RTlELDB4NTI0QSwweEY5NjksMHg2NzE0LDB4Rjk2QSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfREZbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg1MDk4LDB4NTIyQSwweDVDNzEsMHg2NTYzLDB4NkM1NSwweDczQ0EsMHg3NTIzLC8qIDB4QTAtMHhBNyAqLworCTB4NzU5RCwweDdCOTcsMHg4NDlDLDB4OTE3OCwweDk3MzAsMHg0RTc3LDB4NjQ5MiwweDZCQkEsLyogMHhBOC0weEFGICovCisJMHg3MTVFLDB4ODVBOSwweDRFMDksMHhGOTZCLDB4Njc0OSwweDY4RUUsMHg2RTE3LDB4ODI5RiwvKiAweEIwLTB4QjcgKi8KKwkweDg1MTgsMHg4ODZCLDB4NjNGNywweDZGODEsMHg5MjEyLDB4OThBRiwweDRFMEEsMHg1MEI3LC8qIDB4QjgtMHhCRiAqLworCTB4NTBDRiwweDUxMUYsMHg1NTQ2LDB4NTVBQSwweDU2MTcsMHg1QjQwLDB4NUMxOSwweDVDRTAsLyogMHhDMC0weEM3ICovCisJMHg1RTM4LDB4NUU4QSwweDVFQTAsMHg1RUMyLDB4NjBGMywweDY4NTEsMHg2QTYxLDB4NkU1OCwvKiAweEM4LTB4Q0YgKi8KKwkweDcyM0QsMHg3MjQwLDB4NzJDMCwweDc2RjgsMHg3OTY1LDB4N0JCMSwweDdGRDQsMHg4OEYzLC8qIDB4RDAtMHhENyAqLworCTB4ODlGNCwweDhBNzMsMHg4QzYxLDB4OENERSwweDk3MUMsMHg1ODVFLDB4NzRCRCwweDhDRkQsLyogMHhEOC0weERGICovCisJMHg1NUM3LDB4Rjk2QywweDdBNjEsMHg3RDIyLDB4ODI3MiwweDcyNzIsMHg3NTFGLDB4NzUyNSwvKiAweEUwLTB4RTcgKi8KKwkweEY5NkQsMHg3QjE5LDB4NTg4NSwweDU4RkIsMHg1REJDLDB4NUU4RiwweDVFQjYsMHg1RjkwLC8qIDB4RTgtMHhFRiAqLworCTB4NjA1NSwweDYyOTIsMHg2MzdGLDB4NjU0RCwweDY2OTEsMHg2NkQ5LDB4NjZGOCwweDY4MTYsLyogMHhGMC0weEY3ICovCisJMHg2OEYyLDB4NzI4MCwweDc0NUUsMHg3QjZFLDB4N0Q2RSwweDdERDYsMHg3RjcyLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FMFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDgwRTUsMHg4MjEyLDB4ODVBRiwweDg5N0YsMHg4QTkzLDB4OTAxRCwweDkyRTQsLyogMHhBMC0weEE3ICovCisJMHg5RUNELDB4OUYyMCwweDU5MTUsMHg1OTZELDB4NUUyRCwweDYwREMsMHg2NjE0LDB4NjY3MywvKiAweEE4LTB4QUYgKi8KKwkweDY3OTAsMHg2QzUwLDB4NkRDNSwweDZGNUYsMHg3N0YzLDB4NzhBOSwweDg0QzYsMHg5MUNCLC8qIDB4QjAtMHhCNyAqLworCTB4OTMyQiwweDRFRDksMHg1MENBLDB4NTE0OCwweDU1ODQsMHg1QjBCLDB4NUJBMywweDYyNDcsLyogMHhCOC0weEJGICovCisJMHg2NTdFLDB4NjVDQiwweDZFMzIsMHg3MTdELDB4NzQwMSwweDc0NDQsMHg3NDg3LDB4NzRCRiwvKiAweEMwLTB4QzcgKi8KKwkweDc2NkMsMHg3OUFBLDB4N0REQSwweDdFNTUsMHg3RkE4LDB4ODE3QSwweDgxQjMsMHg4MjM5LC8qIDB4QzgtMHhDRiAqLworCTB4ODYxQSwweDg3RUMsMHg4QTc1LDB4OERFMywweDkwNzgsMHg5MjkxLDB4OTQyNSwweDk5NEQsLyogMHhEMC0weEQ3ICovCisJMHg5QkFFLDB4NTM2OCwweDVDNTEsMHg2OTU0LDB4NkNDNCwweDZEMjksMHg2RTJCLDB4ODIwQywvKiAweEQ4LTB4REYgKi8KKwkweDg1OUIsMHg4OTNCLDB4OEEyRCwweDhBQUEsMHg5NkVBLDB4OUY2NywweDUyNjEsMHg2NkI5LC8qIDB4RTAtMHhFNyAqLworCTB4NkJCMiwweDdFOTYsMHg4N0ZFLDB4OEQwRCwweDk1ODMsMHg5NjVELDB4NjUxRCwweDZEODksLyogMHhFOC0weEVGICovCisJMHg3MUVFLDB4Rjk2RSwweDU3Q0UsMHg1OUQzLDB4NUJBQywweDYwMjcsMHg2MEZBLDB4NjIxMCwvKiAweEYwLTB4RjcgKi8KKwkweDY2MUYsMHg2NjVGLDB4NzMyOSwweDczRjksMHg3NkRCLDB4NzcwMSwweDdCNkMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0UxWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4ODA1NiwweDgwNzIsMHg4MTY1LDB4OEFBMCwweDkxOTIsMHg0RTE2LDB4NTJFMiwvKiAweEEwLTB4QTcgKi8KKwkweDZCNzIsMHg2RDE3LDB4N0EwNSwweDdCMzksMHg3RDMwLDB4Rjk2RiwweDhDQjAsMHg1M0VDLC8qIDB4QTgtMHhBRiAqLworCTB4NTYyRiwweDU4NTEsMHg1QkI1LDB4NUMwRiwweDVDMTEsMHg1REUyLDB4NjI0MCwweDYzODMsLyogMHhCMC0weEI3ICovCisJMHg2NDE0LDB4NjYyRCwweDY4QjMsMHg2Q0JDLDB4NkQ4OCwweDZFQUYsMHg3MDFGLDB4NzBBNCwvKiAweEI4LTB4QkYgKi8KKwkweDcxRDIsMHg3NTI2LDB4NzU4RiwweDc1OEUsMHg3NjE5LDB4N0IxMSwweDdCRTAsMHg3QzJCLC8qIDB4QzAtMHhDNyAqLworCTB4N0QyMCwweDdEMzksMHg4NTJDLDB4ODU2RCwweDg2MDcsMHg4QTM0LDB4OTAwRCwweDkwNjEsLyogMHhDOC0weENGICovCisJMHg5MEI1LDB4OTJCNywweDk3RjYsMHg5QTM3LDB4NEZENywweDVDNkMsMHg2NzVGLDB4NkQ5MSwvKiAweEQwLTB4RDcgKi8KKwkweDdDOUYsMHg3RThDLDB4OEIxNiwweDhEMTYsMHg5MDFGLDB4NUI2QiwweDVERkQsMHg2NDBELC8qIDB4RDgtMHhERiAqLworCTB4ODRDMCwweDkwNUMsMHg5OEUxLDB4NzM4NywweDVCOEIsMHg2MDlBLDB4Njc3RSwweDZEREUsLyogMHhFMC0weEU3ICovCisJMHg4QTFGLDB4OEFBNiwweDkwMDEsMHg5ODBDLDB4NTIzNywweEY5NzAsMHg3MDUxLDB4Nzg4RSwvKiAweEU4LTB4RUYgKi8KKwkweDkzOTYsMHg4ODcwLDB4OTFENywweDRGRUUsMHg1M0Q3LDB4NTVGRCwweDU2REEsMHg1NzgyLC8qIDB4RjAtMHhGNyAqLworCTB4NThGRCwweDVBQzIsMHg1Qjg4LDB4NUNBQiwweDVDQzAsMHg1RTI1LDB4NjEwMSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRTJbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg2MjBELDB4NjI0QiwweDYzODgsMHg2NDFDLDB4NjUzNiwweDY1NzgsMHg2QTM5LC8qIDB4QTAtMHhBNyAqLworCTB4NkI4QSwweDZDMzQsMHg2RDE5LDB4NkYzMSwweDcxRTcsMHg3MkU5LDB4NzM3OCwweDc0MDcsLyogMHhBOC0weEFGICovCisJMHg3NEIyLDB4NzYyNiwweDc3NjEsMHg3OUMwLDB4N0E1NywweDdBRUEsMHg3Q0I5LDB4N0Q4RiwvKiAweEIwLTB4QjcgKi8KKwkweDdEQUMsMHg3RTYxLDB4N0Y5RSwweDgxMjksMHg4MzMxLDB4ODQ5MCwweDg0REEsMHg4NUVBLC8qIDB4QjgtMHhCRiAqLworCTB4ODg5NiwweDhBQjAsMHg4QjkwLDB4OEYzOCwweDkwNDIsMHg5MDgzLDB4OTE2QywweDkyOTYsLyogMHhDMC0weEM3ICovCisJMHg5MkI5LDB4OTY4QiwweDk2QTcsMHg5NkE4LDB4OTZENiwweDk3MDAsMHg5ODA4LDB4OTk5NiwvKiAweEM4LTB4Q0YgKi8KKwkweDlBRDMsMHg5QjFBLDB4NTNENCwweDU4N0UsMHg1OTE5LDB4NUI3MCwweDVCQkYsMHg2REQxLC8qIDB4RDAtMHhENyAqLworCTB4NkY1QSwweDcxOUYsMHg3NDIxLDB4NzRCOSwweDgwODUsMHg4M0ZELDB4NURFMSwweDVGODcsLyogMHhEOC0weERGICovCisJMHg1RkFBLDB4NjA0MiwweDY1RUMsMHg2ODEyLDB4Njk2RiwweDZBNTMsMHg2Qjg5LDB4NkQzNSwvKiAweEUwLTB4RTcgKi8KKwkweDZERjMsMHg3M0UzLDB4NzZGRSwweDc3QUMsMHg3QjRELDB4N0QxNCwweDgxMjMsMHg4MjFDLC8qIDB4RTgtMHhFRiAqLworCTB4ODM0MCwweDg0RjQsMHg4NTYzLDB4OEE2MiwweDhBQzQsMHg5MTg3LDB4OTMxRSwweDk4MDYsLyogMHhGMC0weEY3ICovCisJMHg5OUI0LDB4NjIwQywweDg4NTMsMHg4RkYwLDB4OTI2NSwweDVEMDcsMHg1RDI3LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FM1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDVENjksMHg3NDVGLDB4ODE5RCwweDg3NjgsMHg2RkQ1LDB4NjJGRSwweDdGRDIsLyogMHhBMC0weEE3ICovCisJMHg4OTM2LDB4ODk3MiwweDRFMUUsMHg0RTU4LDB4NTBFNywweDUyREQsMHg1MzQ3LDB4NjI3RiwvKiAweEE4LTB4QUYgKi8KKwkweDY2MDcsMHg3RTY5LDB4ODgwNSwweDk2NUUsMHg0RjhELDB4NTMxOSwweDU2MzYsMHg1OUNCLC8qIDB4QjAtMHhCNyAqLworCTB4NUFBNCwweDVDMzgsMHg1QzRFLDB4NUM0RCwweDVFMDIsMHg1RjExLDB4NjA0MywweDY1QkQsLyogMHhCOC0weEJGICovCisJMHg2NjJGLDB4NjY0MiwweDY3QkUsMHg2N0Y0LDB4NzMxQywweDc3RTIsMHg3OTNBLDB4N0ZDNSwvKiAweEMwLTB4QzcgKi8KKwkweDg0OTQsMHg4NENELDB4ODk5NiwweDhBNjYsMHg4QTY5LDB4OEFFMSwweDhDNTUsMHg4QzdBLC8qIDB4QzgtMHhDRiAqLworCTB4NTdGNCwweDVCRDQsMHg1RjBGLDB4NjA2RiwweDYyRUQsMHg2OTBELDB4NkI5NiwweDZFNUMsLyogMHhEMC0weEQ3ICovCisJMHg3MTg0LDB4N0JEMiwweDg3NTUsMHg4QjU4LDB4OEVGRSwweDk4REYsMHg5OEZFLDB4NEYzOCwvKiAweEQ4LTB4REYgKi8KKwkweDRGODEsMHg0RkUxLDB4NTQ3QiwweDVBMjAsMHg1QkI4LDB4NjEzQywweDY1QjAsMHg2NjY4LC8qIDB4RTAtMHhFNyAqLworCTB4NzFGQywweDc1MzMsMHg3OTVFLDB4N0QzMywweDgxNEUsMHg4MUUzLDB4ODM5OCwweDg1QUEsLyogMHhFOC0weEVGICovCisJMHg4NUNFLDB4ODcwMywweDhBMEEsMHg4RUFCLDB4OEY5QiwweEY5NzEsMHg4RkM1LDB4NTkzMSwvKiAweEYwLTB4RjcgKi8KKwkweDVCQTQsMHg1QkU2LDB4NjA4OSwweDVCRTksMHg1QzBCLDB4NUZDMywweDZDODEsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0U0WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4Rjk3MiwweDZERjEsMHg3MDBCLDB4NzUxQSwweDgyQUYsMHg4QUY2LDB4NEVDMCwvKiAweEEwLTB4QTcgKi8KKwkweDUzNDEsMHhGOTczLDB4OTZEOSwweDZDMEYsMHg0RTlFLDB4NEZDNCwweDUxNTIsMHg1NTVFLC8qIDB4QTgtMHhBRiAqLworCTB4NUEyNSwweDVDRTgsMHg2MjExLDB4NzI1OSwweDgyQkQsMHg4M0FBLDB4ODZGRSwweDg4NTksLyogMHhCMC0weEI3ICovCisJMHg4QTFELDB4OTYzRiwweDk2QzUsMHg5OTEzLDB4OUQwOSwweDlENUQsMHg1ODBBLDB4NUNCMywvKiAweEI4LTB4QkYgKi8KKwkweDVEQkQsMHg1RTQ0LDB4NjBFMSwweDYxMTUsMHg2M0UxLDB4NkEwMiwweDZFMjUsMHg5MTAyLC8qIDB4QzAtMHhDNyAqLworCTB4OTM1NCwweDk4NEUsMHg5QzEwLDB4OUY3NywweDVCODksMHg1Q0I4LDB4NjMwOSwweDY2NEYsLyogMHhDOC0weENGICovCisJMHg2ODQ4LDB4NzczQywweDk2QzEsMHg5NzhELDB4OTg1NCwweDlCOUYsMHg2NUExLDB4OEIwMSwvKiAweEQwLTB4RDcgKi8KKwkweDhFQ0IsMHg5NUJDLDB4NTUzNSwweDVDQTksMHg1REQ2LDB4NUVCNSwweDY2OTcsMHg3NjRDLC8qIDB4RDgtMHhERiAqLworCTB4ODNGNCwweDk1QzcsMHg1OEQzLDB4NjJCQywweDcyQ0UsMHg5RDI4LDB4NEVGMCwweDU5MkUsLyogMHhFMC0weEU3ICovCisJMHg2MDBGLDB4NjYzQiwweDZCODMsMHg3OUU3LDB4OUQyNiwweDUzOTMsMHg1NEMwLDB4NTdDMywvKiAweEU4LTB4RUYgKi8KKwkweDVEMTYsMHg2MTFCLDB4NjZENiwweDZEQUYsMHg3ODhELDB4ODI3RSwweDk2OTgsMHg5NzQ0LC8qIDB4RjAtMHhGNyAqLworCTB4NTM4NCwweDYyN0MsMHg2Mzk2LDB4NkRCMiwweDdFMEEsMHg4MTRCLDB4OTg0RCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRTVbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg2QUZCLDB4N0Y0QywweDlEQUYsMHg5RTFBLDB4NEU1RiwweDUwM0IsMHg1MUI2LC8qIDB4QTAtMHhBNyAqLworCTB4NTkxQywweDYwRjksMHg2M0Y2LDB4NjkzMCwweDcyM0EsMHg4MDM2LDB4Rjk3NCwweDkxQ0UsLyogMHhBOC0weEFGICovCisJMHg1RjMxLDB4Rjk3NSwweEY5NzYsMHg3RDA0LDB4ODJFNSwweDg0NkYsMHg4NEJCLDB4ODVFNSwvKiAweEIwLTB4QjcgKi8KKwkweDhFOEQsMHhGOTc3LDB4NEY2RiwweEY5NzgsMHhGOTc5LDB4NThFNCwweDVCNDMsMHg2MDU5LC8qIDB4QjgtMHhCRiAqLworCTB4NjNEQSwweDY1MTgsMHg2NTZELDB4NjY5OCwweEY5N0EsMHg2OTRBLDB4NkEyMywweDZEMEIsLyogMHhDMC0weEM3ICovCisJMHg3MDAxLDB4NzE2QywweDc1RDIsMHg3NjBELDB4NzlCMywweDdBNzAsMHhGOTdCLDB4N0Y4QSwvKiAweEM4LTB4Q0YgKi8KKwkweEY5N0MsMHg4OTQ0LDB4Rjk3RCwweDhCOTMsMHg5MUMwLDB4OTY3RCwweEY5N0UsMHg5OTBBLC8qIDB4RDAtMHhENyAqLworCTB4NTcwNCwweDVGQTEsMHg2NUJDLDB4NkYwMSwweDc2MDAsMHg3OUE2LDB4OEE5RSwweDk5QUQsLyogMHhEOC0weERGICovCisJMHg5QjVBLDB4OUY2QywweDUxMDQsMHg2MUI2LDB4NjI5MSwweDZBOEQsMHg4MUM2LDB4NTA0MywvKiAweEUwLTB4RTcgKi8KKwkweDU4MzAsMHg1RjY2LDB4NzEwOSwweDhBMDAsMHg4QUZBLDB4NUI3QywweDg2MTYsMHg0RkZBLC8qIDB4RTgtMHhFRiAqLworCTB4NTEzQywweDU2QjQsMHg1OTQ0LDB4NjNBOSwweDZERjksMHg1REFBLDB4Njk2RCwweDUxODYsLyogMHhGMC0weEY3ICovCisJMHg0RTg4LDB4NEY1OSwweEY5N0YsMHhGOTgwLDB4Rjk4MSwweDU5ODIsMHhGOTgyLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FNlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweEY5ODMsMHg2QjVGLDB4NkM1RCwweEY5ODQsMHg3NEI1LDB4NzkxNiwweEY5ODUsLyogMHhBMC0weEE3ICovCisJMHg4MjA3LDB4ODI0NSwweDgzMzksMHg4RjNGLDB4OEY1RCwweEY5ODYsMHg5OTE4LDB4Rjk4NywvKiAweEE4LTB4QUYgKi8KKwkweEY5ODgsMHhGOTg5LDB4NEVBNiwweEY5OEEsMHg1N0RGLDB4NUY3OSwweDY2MTMsMHhGOThCLC8qIDB4QjAtMHhCNyAqLworCTB4Rjk4QywweDc1QUIsMHg3RTc5LDB4OEI2RiwweEY5OEQsMHg5MDA2LDB4OUE1QiwweDU2QTUsLyogMHhCOC0weEJGICovCisJMHg1ODI3LDB4NTlGOCwweDVBMUYsMHg1QkI0LDB4Rjk4RSwweDVFRjYsMHhGOThGLDB4Rjk5MCwvKiAweEMwLTB4QzcgKi8KKwkweDYzNTAsMHg2MzNCLDB4Rjk5MSwweDY5M0QsMHg2Qzg3LDB4NkNCRiwweDZEOEUsMHg2RDkzLC8qIDB4QzgtMHhDRiAqLworCTB4NkRGNSwweDZGMTQsMHhGOTkyLDB4NzBERiwweDcxMzYsMHg3MTU5LDB4Rjk5MywweDcxQzMsLyogMHhEMC0weEQ3ICovCisJMHg3MUQ1LDB4Rjk5NCwweDc4NEYsMHg3ODZGLDB4Rjk5NSwweDdCNzUsMHg3REUzLDB4Rjk5NiwvKiAweEQ4LTB4REYgKi8KKwkweDdFMkYsMHhGOTk3LDB4ODg0RCwweDhFREYsMHhGOTk4LDB4Rjk5OSwweEY5OUEsMHg5MjVCLC8qIDB4RTAtMHhFNyAqLworCTB4Rjk5QiwweDlDRjYsMHhGOTlDLDB4Rjk5RCwweEY5OUUsMHg2MDg1LDB4NkQ4NSwweEY5OUYsLyogMHhFOC0weEVGICovCisJMHg3MUIxLDB4RjlBMCwweEY5QTEsMHg5NUIxLDB4NTNBRCwweEY5QTIsMHhGOUEzLDB4RjlBNCwvKiAweEYwLTB4RjcgKi8KKwkweDY3RDMsMHhGOUE1LDB4NzA4RSwweDcxMzAsMHg3NDMwLDB4ODI3NiwweDgyRDIsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0U3WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4RjlBNiwweDk1QkIsMHg5QUU1LDB4OUU3RCwweDY2QzQsMHhGOUE3LDB4NzFDMSwvKiAweEEwLTB4QTcgKi8KKwkweDg0NDksMHhGOUE4LDB4RjlBOSwweDU4NEIsMHhGOUFBLDB4RjlBQiwweDVEQjgsMHg1RjcxLC8qIDB4QTgtMHhBRiAqLworCTB4RjlBQywweDY2MjAsMHg2NjhFLDB4Njk3OSwweDY5QUUsMHg2QzM4LDB4NkNGMywweDZFMzYsLyogMHhCMC0weEI3ICovCisJMHg2RjQxLDB4NkZEQSwweDcwMUIsMHg3MDJGLDB4NzE1MCwweDcxREYsMHg3MzcwLDB4RjlBRCwvKiAweEI4LTB4QkYgKi8KKwkweDc0NUIsMHhGOUFFLDB4NzRENCwweDc2QzgsMHg3QTRFLDB4N0U5MywweEY5QUYsMHhGOUIwLC8qIDB4QzAtMHhDNyAqLworCTB4ODJGMSwweDhBNjAsMHg4RkNFLDB4RjlCMSwweDkzNDgsMHhGOUIyLDB4OTcxOSwweEY5QjMsLyogMHhDOC0weENGICovCisJMHhGOUI0LDB4NEU0MiwweDUwMkEsMHhGOUI1LDB4NTIwOCwweDUzRTEsMHg2NkYzLDB4NkM2RCwvKiAweEQwLTB4RDcgKi8KKwkweDZGQ0EsMHg3MzBBLDB4Nzc3RiwweDdBNjIsMHg4MkFFLDB4ODVERCwweDg2MDIsMHhGOUI2LC8qIDB4RDgtMHhERiAqLworCTB4ODhENCwweDhBNjMsMHg4QjdELDB4OEM2QiwweEY5QjcsMHg5MkIzLDB4RjlCOCwweDk3MTMsLyogMHhFMC0weEU3ICovCisJMHg5ODEwLDB4NEU5NCwweDRGMEQsMHg0RkM5LDB4NTBCMiwweDUzNDgsMHg1NDNFLDB4NTQzMywvKiAweEU4LTB4RUYgKi8KKwkweDU1REEsMHg1ODYyLDB4NThCQSwweDU5NjcsMHg1QTFCLDB4NUJFNCwweDYwOUYsMHhGOUI5LC8qIDB4RjAtMHhGNyAqLworCTB4NjFDQSwweDY1NTYsMHg2NUZGLDB4NjY2NCwweDY4QTcsMHg2QzVBLDB4NkZCMywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRThbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg3MENGLDB4NzFBQywweDczNTIsMHg3QjdELDB4ODcwOCwweDhBQTQsMHg5QzMyLC8qIDB4QTAtMHhBNyAqLworCTB4OUYwNywweDVDNEIsMHg2QzgzLDB4NzM0NCwweDczODksMHg5MjNBLDB4NkVBQiwweDc0NjUsLyogMHhBOC0weEFGICovCisJMHg3NjFGLDB4N0E2OSwweDdFMTUsMHg4NjBBLDB4NTE0MCwweDU4QzUsMHg2NEMxLDB4NzRFRSwvKiAweEIwLTB4QjcgKi8KKwkweDc1MTUsMHg3NjcwLDB4N0ZDMSwweDkwOTUsMHg5NkNELDB4OTk1NCwweDZFMjYsMHg3NEU2LC8qIDB4QjgtMHhCRiAqLworCTB4N0FBOSwweDdBQUEsMHg4MUU1LDB4ODZEOSwweDg3NzgsMHg4QTFCLDB4NUE0OSwweDVCOEMsLyogMHhDMC0weEM3ICovCisJMHg1QjlCLDB4NjhBMSwweDY5MDAsMHg2RDYzLDB4NzNBOSwweDc0MTMsMHg3NDJDLDB4Nzg5NywvKiAweEM4LTB4Q0YgKi8KKwkweDdERTksMHg3RkVCLDB4ODExOCwweDgxNTUsMHg4MzlFLDB4OEM0QywweDk2MkUsMHg5ODExLC8qIDB4RDAtMHhENyAqLworCTB4NjZGMCwweDVGODAsMHg2NUZBLDB4Njc4OSwweDZDNkEsMHg3MzhCLDB4NTAyRCwweDVBMDMsLyogMHhEOC0weERGICovCisJMHg2QjZBLDB4NzdFRSwweDU5MTYsMHg1RDZDLDB4NURDRCwweDczMjUsMHg3NTRGLDB4RjlCQSwvKiAweEUwLTB4RTcgKi8KKwkweEY5QkIsMHg1MEU1LDB4NTFGOSwweDU4MkYsMHg1OTJELDB4NTk5NiwweDU5REEsMHg1QkU1LC8qIDB4RTgtMHhFRiAqLworCTB4RjlCQywweEY5QkQsMHg1REEyLDB4NjJENywweDY0MTYsMHg2NDkzLDB4NjRGRSwweEY5QkUsLyogMHhGMC0weEY3ICovCisJMHg2NkRDLDB4RjlCRiwweDZBNDgsMHhGOUMwLDB4NzFGRiwweDc0NjQsMHhGOUMxLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FOVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDdBODgsMHg3QUFGLDB4N0U0NywweDdFNUUsMHg4MDAwLDB4ODE3MCwweEY5QzIsLyogMHhBMC0weEE3ICovCisJMHg4N0VGLDB4ODk4MSwweDhCMjAsMHg5MDU5LDB4RjlDMywweDkwODAsMHg5OTUyLDB4NjE3RSwvKiAweEE4LTB4QUYgKi8KKwkweDZCMzIsMHg2RDc0LDB4N0UxRiwweDg5MjUsMHg4RkIxLDB4NEZEMSwweDUwQUQsMHg1MTk3LC8qIDB4QjAtMHhCNyAqLworCTB4NTJDNywweDU3QzcsMHg1ODg5LDB4NUJCOSwweDVFQjgsMHg2MTQyLDB4Njk5NSwweDZEOEMsLyogMHhCOC0weEJGICovCisJMHg2RTY3LDB4NkVCNiwweDcxOTQsMHg3NDYyLDB4NzUyOCwweDc1MkMsMHg4MDczLDB4ODMzOCwvKiAweEMwLTB4QzcgKi8KKwkweDg0QzksMHg4RTBBLDB4OTM5NCwweDkzREUsMHhGOUM0LDB4NEU4RSwweDRGNTEsMHg1MDc2LC8qIDB4QzgtMHhDRiAqLworCTB4NTEyQSwweDUzQzgsMHg1M0NCLDB4NTNGMywweDVCODcsMHg1QkQzLDB4NUMyNCwweDYxMUEsLyogMHhEMC0weEQ3ICovCisJMHg2MTgyLDB4NjVGNCwweDcyNUIsMHg3Mzk3LDB4NzQ0MCwweDc2QzIsMHg3OTUwLDB4Nzk5MSwvKiAweEQ4LTB4REYgKi8KKwkweDc5QjksMHg3RDA2LDB4N0ZCRCwweDgyOEIsMHg4NUQ1LDB4ODY1RSwweDhGQzIsMHg5MDQ3LC8qIDB4RTAtMHhFNyAqLworCTB4OTBGNSwweDkxRUEsMHg5Njg1LDB4OTZFOCwweDk2RTksMHg1MkQ2LDB4NUY2NywweDY1RUQsLyogMHhFOC0weEVGICovCisJMHg2NjMxLDB4NjgyRiwweDcxNUMsMHg3QTM2LDB4OTBDMSwweDk4MEEsMHg0RTkxLDB4RjlDNSwvKiAweEYwLTB4RjcgKi8KKwkweDZBNTIsMHg2QjlFLDB4NkY5MCwweDcxODksMHg4MDE4LDB4ODJCOCwweDg1NTMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0VBWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4OTA0QiwweDk2OTUsMHg5NkYyLDB4OTdGQiwweDg1MUEsMHg5QjMxLDB4NEU5MCwvKiAweEEwLTB4QTcgKi8KKwkweDcxOEEsMHg5NkM0LDB4NTE0MywweDUzOUYsMHg1NEUxLDB4NTcxMywweDU3MTIsMHg1N0EzLC8qIDB4QTgtMHhBRiAqLworCTB4NUE5QiwweDVBQzQsMHg1QkMzLDB4NjAyOCwweDYxM0YsMHg2M0Y0LDB4NkM4NSwweDZEMzksLyogMHhCMC0weEI3ICovCisJMHg2RTcyLDB4NkU5MCwweDcyMzAsMHg3MzNGLDB4NzQ1NywweDgyRDEsMHg4ODgxLDB4OEY0NSwvKiAweEI4LTB4QkYgKi8KKwkweDkwNjAsMHhGOUM2LDB4OTY2MiwweDk4NTgsMHg5RDFCLDB4NjcwOCwweDhEOEEsMHg5MjVFLC8qIDB4QzAtMHhDNyAqLworCTB4NEY0RCwweDUwNDksMHg1MERFLDB4NTM3MSwweDU3MEQsMHg1OUQ0LDB4NUEwMSwweDVDMDksLyogMHhDOC0weENGICovCisJMHg2MTcwLDB4NjY5MCwweDZFMkQsMHg3MjMyLDB4NzQ0QiwweDdERUYsMHg4MEMzLDB4ODQwRSwvKiAweEQwLTB4RDcgKi8KKwkweDg0NjYsMHg4NTNGLDB4ODc1RiwweDg4NUIsMHg4OTE4LDB4OEIwMiwweDkwNTUsMHg5N0NCLC8qIDB4RDgtMHhERiAqLworCTB4OUI0RiwweDRFNzMsMHg0RjkxLDB4NTExMiwweDUxNkEsMHhGOUM3LDB4NTUyRiwweDU1QTksLyogMHhFMC0weEU3ICovCisJMHg1QjdBLDB4NUJBNSwweDVFN0MsMHg1RTdELDB4NUVCRSwweDYwQTAsMHg2MERGLDB4NjEwOCwvKiAweEU4LTB4RUYgKi8KKwkweDYxMDksMHg2M0M0LDB4NjUzOCwweDY3MDksMHhGOUM4LDB4NjdENCwweDY3REEsMHhGOUM5LC8qIDB4RjAtMHhGNyAqLworCTB4Njk2MSwweDY5NjIsMHg2Q0I5LDB4NkQyNywweEY5Q0EsMHg2RTM4LDB4RjlDQiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRUJbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg2RkUxLDB4NzMzNiwweDczMzcsMHhGOUNDLDB4NzQ1QywweDc1MzEsMHhGOUNELC8qIDB4QTAtMHhBNyAqLworCTB4NzY1MiwweEY5Q0UsMHhGOUNGLDB4N0RBRCwweDgxRkUsMHg4NDM4LDB4ODhENSwweDhBOTgsLyogMHhBOC0weEFGICovCisJMHg4QURCLDB4OEFFRCwweDhFMzAsMHg4RTQyLDB4OTA0QSwweDkwM0UsMHg5MDdBLDB4OTE0OSwvKiAweEIwLTB4QjcgKi8KKwkweDkxQzksMHg5MzZFLDB4RjlEMCwweEY5RDEsMHg1ODA5LDB4RjlEMiwweDZCRDMsMHg4MDg5LC8qIDB4QjgtMHhCRiAqLworCTB4ODBCMiwweEY5RDMsMHhGOUQ0LDB4NTE0MSwweDU5NkIsMHg1QzM5LDB4RjlENSwweEY5RDYsLyogMHhDMC0weEM3ICovCisJMHg2RjY0LDB4NzNBNywweDgwRTQsMHg4RDA3LDB4RjlENywweDkyMTcsMHg5NThGLDB4RjlEOCwvKiAweEM4LTB4Q0YgKi8KKwkweEY5RDksMHhGOURBLDB4RjlEQiwweDgwN0YsMHg2MjBFLDB4NzAxQywweDdENjgsMHg4NzhELC8qIDB4RDAtMHhENyAqLworCTB4RjlEQywweDU3QTAsMHg2MDY5LDB4NjE0NywweDZCQjcsMHg4QUJFLDB4OTI4MCwweDk2QjEsLyogMHhEOC0weERGICovCisJMHg0RTU5LDB4NTQxRiwweDZERUIsMHg4NTJELDB4OTY3MCwweDk3RjMsMHg5OEVFLDB4NjNENiwvKiAweEUwLTB4RTcgKi8KKwkweDZDRTMsMHg5MDkxLDB4NTFERCwweDYxQzksMHg4MUJBLDB4OURGOSwweDRGOUQsMHg1MDFBLC8qIDB4RTgtMHhFRiAqLworCTB4NTEwMCwweDVCOUMsMHg2MTBGLDB4NjFGRiwweDY0RUMsMHg2OTA1LDB4NkJDNSwweDc1OTEsLyogMHhGMC0weEY3ICovCisJMHg3N0UzLDB4N0ZBOSwweDgyNjQsMHg4NThGLDB4ODdGQiwweDg4NjMsMHg4QUJDLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FQ1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDhCNzAsMHg5MUFCLDB4NEU4QywweDRFRTUsMHg0RjBBLDB4RjlERCwweEY5REUsLyogMHhBMC0weEE3ICovCisJMHg1OTM3LDB4NTlFOCwweEY5REYsMHg1REYyLDB4NUYxQiwweDVGNUIsMHg2MDIxLDB4RjlFMCwvKiAweEE4LTB4QUYgKi8KKwkweEY5RTEsMHhGOUUyLDB4RjlFMywweDcyM0UsMHg3M0U1LDB4RjlFNCwweDc1NzAsMHg3NUNELC8qIDB4QjAtMHhCNyAqLworCTB4RjlFNSwweDc5RkIsMHhGOUU2LDB4ODAwQywweDgwMzMsMHg4MDg0LDB4ODJFMSwweDgzNTEsLyogMHhCOC0weEJGICovCisJMHhGOUU3LDB4RjlFOCwweDhDQkQsMHg4Q0IzLDB4OTA4NywweEY5RTksMHhGOUVBLDB4OThGNCwvKiAweEMwLTB4QzcgKi8KKwkweDk5MEMsMHhGOUVCLDB4RjlFQywweDcwMzcsMHg3NkNBLDB4N0ZDQSwweDdGQ0MsMHg3RkZDLC8qIDB4QzgtMHhDRiAqLworCTB4OEIxQSwweDRFQkEsMHg0RUMxLDB4NTIwMywweDUzNzAsMHhGOUVELDB4NTRCRCwweDU2RTAsLyogMHhEMC0weEQ3ICovCisJMHg1OUZCLDB4NUJDNSwweDVGMTUsMHg1RkNELDB4NkU2RSwweEY5RUUsMHhGOUVGLDB4N0Q2QSwvKiAweEQ4LTB4REYgKi8KKwkweDgzMzUsMHhGOUYwLDB4ODY5MywweDhBOEQsMHhGOUYxLDB4OTc2RCwweDk3NzcsMHhGOUYyLC8qIDB4RTAtMHhFNyAqLworCTB4RjlGMywweDRFMDAsMHg0RjVBLDB4NEY3RSwweDU4RjksMHg2NUU1LDB4NkVBMiwweDkwMzgsLyogMHhFOC0weEVGICovCisJMHg5M0IwLDB4OTlCOSwweDRFRkIsMHg1OEVDLDB4NTk4QSwweDU5RDksMHg2MDQxLDB4RjlGNCwvKiAweEYwLTB4RjcgKi8KKwkweEY5RjUsMHg3QTE0LDB4RjlGNiwweDgzNEYsMHg4Q0MzLDB4NTE2NSwweDUzNDQsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0VEWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4RjlGNywweEY5RjgsMHhGOUY5LDB4NEVDRCwweDUyNjksMHg1QjU1LDB4ODJCRiwvKiAweEEwLTB4QTcgKi8KKwkweDRFRDQsMHg1MjNBLDB4NTRBOCwweDU5QzksMHg1OUZGLDB4NUI1MCwweDVCNTcsMHg1QjVDLC8qIDB4QTgtMHhBRiAqLworCTB4NjA2MywweDYxNDgsMHg2RUNCLDB4NzA5OSwweDcxNkUsMHg3Mzg2LDB4NzRGNywweDc1QjUsLyogMHhCMC0weEI3ICovCisJMHg3OEMxLDB4N0QyQiwweDgwMDUsMHg4MUVBLDB4ODMyOCwweDg1MTcsMHg4NUM5LDB4OEFFRSwvKiAweEI4LTB4QkYgKi8KKwkweDhDQzcsMHg5NkNDLDB4NEY1QywweDUyRkEsMHg1NkJDLDB4NjVBQiwweDY2MjgsMHg3MDdDLC8qIDB4QzAtMHhDNyAqLworCTB4NzBCOCwweDcyMzUsMHg3REJELDB4ODI4RCwweDkxNEMsMHg5NkMwLDB4OUQ3MiwweDVCNzEsLyogMHhDOC0weENGICovCisJMHg2OEU3LDB4NkI5OCwweDZGN0EsMHg3NkRFLDB4NUM5MSwweDY2QUIsMHg2RjVCLDB4N0JCNCwvKiAweEQwLTB4RDcgKi8KKwkweDdDMkEsMHg4ODM2LDB4OTZEQywweDRFMDgsMHg0RUQ3LDB4NTMyMCwweDU4MzQsMHg1OEJCLC8qIDB4RDgtMHhERiAqLworCTB4NThFRiwweDU5NkMsMHg1QzA3LDB4NUUzMywweDVFODQsMHg1RjM1LDB4NjM4QywweDY2QjIsLyogMHhFMC0weEU3ICovCisJMHg2NzU2LDB4NkExRiwweDZBQTMsMHg2QjBDLDB4NkYzRiwweDcyNDYsMHhGOUZBLDB4NzM1MCwvKiAweEU4LTB4RUYgKi8KKwkweDc0OEIsMHg3QUUwLDB4N0NBNywweDgxNzgsMHg4MURGLDB4ODFFNywweDgzOEEsMHg4NDZDLC8qIDB4RjAtMHhGNyAqLworCTB4ODUyMywweDg1OTQsMHg4NUNGLDB4ODhERCwweDhEMTMsMHg5MUFDLDB4OTU3NywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRUVbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg5NjlDLDB4NTE4RCwweDU0QzksMHg1NzI4LDB4NUJCMCwweDYyNEQsMHg2NzUwLC8qIDB4QTAtMHhBNyAqLworCTB4NjgzRCwweDY4OTMsMHg2RTNELDB4NkVEMywweDcwN0QsMHg3RTIxLDB4ODhDMSwweDhDQTEsLyogMHhBOC0weEFGICovCisJMHg4RjA5LDB4OUY0QiwweDlGNEUsMHg3MjJELDB4N0I4RiwweDhBQ0QsMHg5MzFBLDB4NEY0NywvKiAweEIwLTB4QjcgKi8KKwkweDRGNEUsMHg1MTMyLDB4NTQ4MCwweDU5RDAsMHg1RTk1LDB4NjJCNSwweDY3NzUsMHg2OTZFLC8qIDB4QjgtMHhCRiAqLworCTB4NkExNywweDZDQUUsMHg2RTFBLDB4NzJEOSwweDczMkEsMHg3NUJELDB4N0JCOCwweDdEMzUsLyogMHhDMC0weEM3ICovCisJMHg4MkU3LDB4ODNGOSwweDg0NTcsMHg4NUY3LDB4OEE1QiwweDhDQUYsMHg4RTg3LDB4OTAxOSwvKiAweEM4LTB4Q0YgKi8KKwkweDkwQjgsMHg5NkNFLDB4OUY1RiwweDUyRTMsMHg1NDBBLDB4NUFFMSwweDVCQzIsMHg2NDU4LC8qIDB4RDAtMHhENyAqLworCTB4NjU3NSwweDZFRjQsMHg3MkM0LDB4RjlGQiwweDc2ODQsMHg3QTRELDB4N0IxQiwweDdDNEQsLyogMHhEOC0weERGICovCisJMHg3RTNFLDB4N0ZERiwweDgzN0IsMHg4QjJCLDB4OENDQSwweDhENjQsMHg4REUxLDB4OEU1RiwvKiAweEUwLTB4RTcgKi8KKwkweDhGRUEsMHg4RkY5LDB4OTA2OSwweDkzRDEsMHg0RjQzLDB4NEY3QSwweDUwQjMsMHg1MTY4LC8qIDB4RTgtMHhFRiAqLworCTB4NTE3OCwweDUyNEQsMHg1MjZBLDB4NTg2MSwweDU4N0MsMHg1OTYwLDB4NUMwOCwweDVDNTUsLyogMHhGMC0weEY3ICovCisJMHg1RURCLDB4NjA5QiwweDYyMzAsMHg2ODEzLDB4NkJCRiwweDZDMDgsMHg2RkIxLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FRlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDcxNEUsMHg3NDIwLDB4NzUzMCwweDc1MzgsMHg3NTUxLDB4NzY3MiwweDdCNEMsLyogMHhBMC0weEE3ICovCisJMHg3QjhCLDB4N0JBRCwweDdCQzYsMHg3RThGLDB4OEE2RSwweDhGM0UsMHg4RjQ5LDB4OTIzRiwvKiAweEE4LTB4QUYgKi8KKwkweDkyOTMsMHg5MzIyLDB4OTQyQiwweDk2RkIsMHg5ODVBLDB4OTg2QiwweDk5MUUsMHg1MjA3LC8qIDB4QjAtMHhCNyAqLworCTB4NjIyQSwweDYyOTgsMHg2RDU5LDB4NzY2NCwweDdBQ0EsMHg3QkMwLDB4N0Q3NiwweDUzNjAsLyogMHhCOC0weEJGICovCisJMHg1Q0JFLDB4NUU5NywweDZGMzgsMHg3MEI5LDB4N0M5OCwweDk3MTEsMHg5QjhFLDB4OUVERSwvKiAweEMwLTB4QzcgKi8KKwkweDYzQTUsMHg2NDdBLDB4ODc3NiwweDRFMDEsMHg0RTk1LDB4NEVBRCwweDUwNUMsMHg1MDc1LC8qIDB4QzgtMHhDRiAqLworCTB4NTQ0OCwweDU5QzMsMHg1QjlBLDB4NUU0MCwweDVFQUQsMHg1RUY3LDB4NUY4MSwweDYwQzUsLyogMHhEMC0weEQ3ICovCisJMHg2MzNBLDB4NjUzRiwweDY1NzQsMHg2NUNDLDB4NjY3NiwweDY2NzgsMHg2N0ZFLDB4Njk2OCwvKiAweEQ4LTB4REYgKi8KKwkweDZBODksMHg2QjYzLDB4NkM0MCwweDZEQzAsMHg2REU4LDB4NkUxRiwweDZFNUUsMHg3MDFFLC8qIDB4RTAtMHhFNyAqLworCTB4NzBBMSwweDczOEUsMHg3M0ZELDB4NzUzQSwweDc3NUIsMHg3ODg3LDB4Nzk4RSwweDdBMEIsLyogMHhFOC0weEVGICovCisJMHg3QTdELDB4N0NCRSwweDdEOEUsMHg4MjQ3LDB4OEEwMiwweDhBRUEsMHg4QzlFLDB4OTEyRCwvKiAweEYwLTB4RjcgKi8KKwkweDkxNEEsMHg5MUQ4LDB4OTI2NiwweDkyQ0MsMHg5MzIwLDB4OTcwNiwweDk3NTYsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0YwWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4OTc1QywweDk4MDIsMHg5RjBFLDB4NTIzNiwweDUyOTEsMHg1NTdDLDB4NTgyNCwvKiAweEEwLTB4QTcgKi8KKwkweDVFMUQsMHg1RjFGLDB4NjA4QywweDYzRDAsMHg2OEFGLDB4NkZERiwweDc5NkQsMHg3QjJDLC8qIDB4QTgtMHhBRiAqLworCTB4ODFDRCwweDg1QkEsMHg4OEZELDB4OEFGOCwweDhFNDQsMHg5MThELDB4OTY2NCwweDk2OUIsLyogMHhCMC0weEI3ICovCisJMHg5NzNELDB4OTg0QywweDlGNEEsMHg0RkNFLDB4NTE0NiwweDUxQ0IsMHg1MkE5LDB4NTYzMiwvKiAweEI4LTB4QkYgKi8KKwkweDVGMTQsMHg1RjZCLDB4NjNBQSwweDY0Q0QsMHg2NUU5LDB4NjY0MSwweDY2RkEsMHg2NkY5LC8qIDB4QzAtMHhDNyAqLworCTB4NjcxRCwweDY4OUQsMHg2OEQ3LDB4NjlGRCwweDZGMTUsMHg2RjZFLDB4NzE2NywweDcxRTUsLyogMHhDOC0weENGICovCisJMHg3MjJBLDB4NzRBQSwweDc3M0EsMHg3OTU2LDB4Nzk1QSwweDc5REYsMHg3QTIwLDB4N0E5NSwvKiAweEQwLTB4RDcgKi8KKwkweDdDOTcsMHg3Q0RGLDB4N0Q0NCwweDdFNzAsMHg4MDg3LDB4ODVGQiwweDg2QTQsMHg4QTU0LC8qIDB4RDgtMHhERiAqLworCTB4OEFCRiwweDhEOTksMHg4RTgxLDB4OTAyMCwweDkwNkQsMHg5MUUzLDB4OTYzQiwweDk2RDUsLyogMHhFMC0weEU3ICovCisJMHg5Q0U1LDB4NjVDRiwweDdDMDcsMHg4REIzLDB4OTNDMywweDVCNTgsMHg1QzBBLDB4NTM1MiwvKiAweEU4LTB4RUYgKi8KKwkweDYyRDksMHg3MzFELDB4NTAyNywweDVCOTcsMHg1RjlFLDB4NjBCMCwweDYxNkIsMHg2OEQ1LC8qIDB4RjAtMHhGNyAqLworCTB4NkREOSwweDc0MkUsMHg3QTJFLDB4N0Q0MiwweDdEOUMsMHg3RTMxLDB4ODE2QiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRjFbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg4RTJBLDB4OEUzNSwweDkzN0UsMHg5NDE4LDB4NEY1MCwweDU3NTAsMHg1REU2LC8qIDB4QTAtMHhBNyAqLworCTB4NUVBNywweDYzMkIsMHg3RjZBLDB4NEUzQiwweDRGNEYsMHg0RjhGLDB4NTA1QSwweDU5REQsLyogMHhBOC0weEFGICovCisJMHg4MEM0LDB4NTQ2QSwweDU0NjgsMHg1NUZFLDB4NTk0RiwweDVCOTksMHg1RERFLDB4NUVEQSwvKiAweEIwLTB4QjcgKi8KKwkweDY2NUQsMHg2NzMxLDB4NjdGMSwweDY4MkEsMHg2Q0U4LDB4NkQzMiwweDZFNEEsMHg2RjhELC8qIDB4QjgtMHhCRiAqLworCTB4NzBCNywweDczRTAsMHg3NTg3LDB4N0M0QywweDdEMDIsMHg3RDJDLDB4N0RBMiwweDgyMUYsLyogMHhDMC0weEM3ICovCisJMHg4NkRCLDB4OEEzQiwweDhBODUsMHg4RDcwLDB4OEU4QSwweDhGMzMsMHg5MDMxLDB4OTE0RSwvKiAweEM4LTB4Q0YgKi8KKwkweDkxNTIsMHg5NDQ0LDB4OTlEMCwweDdBRjksMHg3Q0E1LDB4NEZDQSwweDUxMDEsMHg1MUM2LC8qIDB4RDAtMHhENyAqLworCTB4NTdDOCwweDVCRUYsMHg1Q0ZCLDB4NjY1OSwweDZBM0QsMHg2RDVBLDB4NkU5NiwweDZGRUMsLyogMHhEOC0weERGICovCisJMHg3MTBDLDB4NzU2RiwweDdBRTMsMHg4ODIyLDB4OTAyMSwweDkwNzUsMHg5NkNCLDB4OTlGRiwvKiAweEUwLTB4RTcgKi8KKwkweDgzMDEsMHg0RTJELDB4NEVGMiwweDg4NDYsMHg5MUNELDB4NTM3RCwweDZBREIsMHg2OTZCLC8qIDB4RTgtMHhFRiAqLworCTB4NkM0MSwweDg0N0EsMHg1ODlFLDB4NjE4RSwweDY2RkUsMHg2MkVGLDB4NzBERCwweDc1MTEsLyogMHhGMC0weEY3ICovCisJMHg3NUM3LDB4N0U1MiwweDg0QjgsMHg4QjQ5LDB4OEQwOCwweDRFNEIsMHg1M0VBLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9GMlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDU0QUIsMHg1NzMwLDB4NTc0MCwweDVGRDcsMHg2MzAxLDB4NjMwNywweDY0NkYsLyogMHhBMC0weEE3ICovCisJMHg2NTJGLDB4NjVFOCwweDY2N0EsMHg2NzlELDB4NjdCMywweDZCNjIsMHg2QzYwLDB4NkM5QSwvKiAweEE4LTB4QUYgKi8KKwkweDZGMkMsMHg3N0U1LDB4NzgyNSwweDc5NDksMHg3OTU3LDB4N0QxOSwweDgwQTIsMHg4MTAyLC8qIDB4QjAtMHhCNyAqLworCTB4ODFGMywweDgyOUQsMHg4MkI3LDB4ODcxOCwweDhBOEMsMHhGOUZDLDB4OEQwNCwweDhEQkUsLyogMHhCOC0weEJGICovCisJMHg5MDcyLDB4NzZGNCwweDdBMTksMHg3QTM3LDB4N0U1NCwweDgwNzcsMHg1NTA3LDB4NTVENCwvKiAweEMwLTB4QzcgKi8KKwkweDU4NzUsMHg2MzJGLDB4NjQyMiwweDY2NDksMHg2NjRCLDB4Njg2RCwweDY5OUIsMHg2Qjg0LC8qIDB4QzgtMHhDRiAqLworCTB4NkQyNSwweDZFQjEsMHg3M0NELDB4NzQ2OCwweDc0QTEsMHg3NTVCLDB4NzVCOSwweDc2RTEsLyogMHhEMC0weEQ3ICovCisJMHg3NzFFLDB4Nzc4QiwweDc5RTYsMHg3RTA5LDB4N0UxRCwweDgxRkIsMHg4NTJGLDB4ODg5NywvKiAweEQ4LTB4REYgKi8KKwkweDhBM0EsMHg4Q0QxLDB4OEVFQiwweDhGQjAsMHg5MDMyLDB4OTNBRCwweDk2NjMsMHg5NjczLC8qIDB4RTAtMHhFNyAqLworCTB4OTcwNywweDRGODQsMHg1M0YxLDB4NTlFQSwweDVBQzksMHg1RTE5LDB4Njg0RSwweDc0QzYsLyogMHhFOC0weEVGICovCisJMHg3NUJFLDB4NzlFOSwweDdBOTIsMHg4MUEzLDB4ODZFRCwweDhDRUEsMHg4RENDLDB4OEZFRCwvKiAweEYwLTB4RjcgKi8KKwkweDY1OUYsMHg2NzE1LDB4RjlGRCwweDU3RjcsMHg2RjU3LDB4N0RERCwweDhGMkYsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0YzWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4OTNGNiwweDk2QzYsMHg1RkI1LDB4NjFGMiwweDZGODQsMHg0RTE0LDB4NEY5OCwvKiAweEEwLTB4QTcgKi8KKwkweDUwMUYsMHg1M0M5LDB4NTVERiwweDVENkYsMHg1REVFLDB4NkIyMSwweDZCNjQsMHg3OENCLC8qIDB4QTgtMHhBRiAqLworCTB4N0I5QSwweEY5RkUsMHg4RTQ5LDB4OEVDQSwweDkwNkUsMHg2MzQ5LDB4NjQzRSwweDc3NDAsLyogMHhCMC0weEI3ICovCisJMHg3QTg0LDB4OTMyRiwweDk0N0YsMHg5RjZBLDB4NjRCMCwweDZGQUYsMHg3MUU2LDB4NzRBOCwvKiAweEI4LTB4QkYgKi8KKwkweDc0REEsMHg3QUM0LDB4N0MxMiwweDdFODIsMHg3Q0IyLDB4N0U5OCwweDhCOUEsMHg4RDBBLC8qIDB4QzAtMHhDNyAqLworCTB4OTQ3RCwweDk5MTAsMHg5OTRDLDB4NTIzOSwweDVCREYsMHg2NEU2LDB4NjcyRCwweDdEMkUsLyogMHhDOC0weENGICovCisJMHg1MEVELDB4NTNDMywweDU4NzksMHg2MTU4LDB4NjE1OSwweDYxRkEsMHg2NUFDLDB4N0FEOSwvKiAweEQwLTB4RDcgKi8KKwkweDhCOTIsMHg4Qjk2LDB4NTAwOSwweDUwMjEsMHg1Mjc1LDB4NTUzMSwweDVBM0MsMHg1RUUwLC8qIDB4RDgtMHhERiAqLworCTB4NUY3MCwweDYxMzQsMHg2NTVFLDB4NjYwQywweDY2MzYsMHg2NkEyLDB4NjlDRCwweDZFQzQsLyogMHhFMC0weEU3ICovCisJMHg2RjMyLDB4NzMxNiwweDc2MjEsMHg3QTkzLDB4ODEzOSwweDgyNTksMHg4M0Q2LDB4ODRCQywvKiAweEU4LTB4RUYgKi8KKwkweDUwQjUsMHg1N0YwLDB4NUJDMCwweDVCRTgsMHg1RjY5LDB4NjNBMSwweDc4MjYsMHg3REI1LC8qIDB4RjAtMHhGNyAqLworCTB4ODNEQywweDg1MjEsMHg5MUM3LDB4OTFGNSwweDUxOEEsMHg2N0Y1LDB4N0I1NiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRjRbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg4Q0FDLDB4NTFDNCwweDU5QkIsMHg2MEJELDB4ODY1NSwweDUwMUMsMHhGOUZGLC8qIDB4QTAtMHhBNyAqLworCTB4NTI1NCwweDVDM0EsMHg2MTdELDB4NjIxQSwweDYyRDMsMHg2NEYyLDB4NjVBNSwweDZFQ0MsLyogMHhBOC0weEFGICovCisJMHg3NjIwLDB4ODEwQSwweDhFNjAsMHg5NjVGLDB4OTZCQiwweDRFREYsMHg1MzQzLDB4NTU5OCwvKiAweEIwLTB4QjcgKi8KKwkweDU5MjksMHg1RERELDB4NjRDNSwweDZDQzksMHg2REZBLDB4NzM5NCwweDdBN0YsMHg4MjFCLC8qIDB4QjgtMHhCRiAqLworCTB4ODVBNiwweDhDRTQsMHg4RTEwLDB4OTA3NywweDkxRTcsMHg5NUUxLDB4OTYyMSwweDk3QzYsLyogMHhDMC0weEM3ICovCisJMHg1MUY4LDB4NTRGMiwweDU1ODYsMHg1RkI5LDB4NjRBNCwweDZGODgsMHg3REI0LDB4OEYxRiwvKiAweEM4LTB4Q0YgKi8KKwkweDhGNEQsMHg5NDM1LDB4NTBDOSwweDVDMTYsMHg2Q0JFLDB4NkRGQiwweDc1MUIsMHg3N0JCLC8qIDB4RDAtMHhENyAqLworCTB4N0MzRCwweDdDNjQsMHg4QTc5LDB4OEFDMiwweDU4MUUsMHg1OUJFLDB4NUUxNiwweDYzNzcsLyogMHhEOC0weERGICovCisJMHg3MjUyLDB4NzU4QSwweDc3NkIsMHg4QURDLDB4OENCQywweDhGMTIsMHg1RUYzLDB4NjY3NCwvKiAweEUwLTB4RTcgKi8KKwkweDZERjgsMHg4MDdELDB4ODNDMSwweDhBQ0IsMHg5NzUxLDB4OUJENiwweEZBMDAsMHg1MjQzLC8qIDB4RTgtMHhFRiAqLworCTB4NjZGRiwweDZEOTUsMHg2RUVGLDB4N0RFMCwweDhBRTYsMHg5MDJFLDB4OTA1RSwweDlBRDQsLyogMHhGMC0weEY3ICovCisJMHg1MjFELDB4NTI3RiwweDU0RTgsMHg2MTk0LDB4NjI4NCwweDYyREIsMHg2OEEyLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9GNVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDY5MTIsMHg2OTVBLDB4NkEzNSwweDcwOTIsMHg3MTI2LDB4Nzg1RCwweDc5MDEsLyogMHhBMC0weEE3ICovCisJMHg3OTBFLDB4NzlEMiwweDdBMEQsMHg4MDk2LDB4ODI3OCwweDgyRDUsMHg4MzQ5LDB4ODU0OSwvKiAweEE4LTB4QUYgKi8KKwkweDhDODIsMHg4RDg1LDB4OTE2MiwweDkxOEIsMHg5MUFFLDB4NEZDMywweDU2RDEsMHg3MUVELC8qIDB4QjAtMHhCNyAqLworCTB4NzdENywweDg3MDAsMHg4OUY4LDB4NUJGOCwweDVGRDYsMHg2NzUxLDB4OTBBOCwweDUzRTIsLyogMHhCOC0weEJGICovCisJMHg1ODVBLDB4NUJGNSwweDYwQTQsMHg2MTgxLDB4NjQ2MCwweDdFM0QsMHg4MDcwLDB4ODUyNSwvKiAweEMwLTB4QzcgKi8KKwkweDkyODMsMHg2NEFFLDB4NTBBQywweDVEMTQsMHg2NzAwLDB4NTg5QywweDYyQkQsMHg2M0E4LC8qIDB4QzgtMHhDRiAqLworCTB4NjkwRSwweDY5NzgsMHg2QTFFLDB4NkU2QiwweDc2QkEsMHg3OUNCLDB4ODJCQiwweDg0MjksLyogMHhEMC0weEQ3ICovCisJMHg4QUNGLDB4OERBOCwweDhGRkQsMHg5MTEyLDB4OTE0QiwweDkxOUMsMHg5MzEwLDB4OTMxOCwvKiAweEQ4LTB4REYgKi8KKwkweDkzOUEsMHg5NkRCLDB4OUEzNiwweDlDMEQsMHg0RTExLDB4NzU1QywweDc5NUQsMHg3QUZBLC8qIDB4RTAtMHhFNyAqLworCTB4N0I1MSwweDdCQzksMHg3RTJFLDB4ODRDNCwweDhFNTksMHg4RTc0LDB4OEVGOCwweDkwMTAsLyogMHhFOC0weEVGICovCisJMHg2NjI1LDB4NjkzRiwweDc0NDMsMHg1MUZBLDB4NjcyRSwweDlFREMsMHg1MTQ1LDB4NUZFMCwvKiAweEYwLTB4RjcgKi8KKwkweDZDOTYsMHg4N0YyLDB4ODg1RCwweDg4NzcsMHg2MEI0LDB4ODFCNSwweDg0MDMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0Y2WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4OEQwNSwweDUzRDYsMHg1NDM5LDB4NTYzNCwweDVBMzYsMHg1QzMxLDB4NzA4QSwvKiAweEEwLTB4QTcgKi8KKwkweDdGRTAsMHg4MDVBLDB4ODEwNiwweDgxRUQsMHg4REEzLDB4OTE4OSwweDlBNUYsMHg5REYyLC8qIDB4QTgtMHhBRiAqLworCTB4NTA3NCwweDRFQzQsMHg1M0EwLDB4NjBGQiwweDZFMkMsMHg1QzY0LDB4NEY4OCwweDUwMjQsLyogMHhCMC0weEI3ICovCisJMHg1NUU0LDB4NUNEOSwweDVFNUYsMHg2MDY1LDB4Njg5NCwweDZDQkIsMHg2REM0LDB4NzFCRSwvKiAweEI4LTB4QkYgKi8KKwkweDc1RDQsMHg3NUY0LDB4NzY2MSwweDdBMUEsMHg3QTQ5LDB4N0RDNywweDdERkIsMHg3RjZFLC8qIDB4QzAtMHhDNyAqLworCTB4ODFGNCwweDg2QTksMHg4RjFDLDB4OTZDOSwweDk5QjMsMHg5RjUyLDB4NTI0NywweDUyQzUsLyogMHhDOC0weENGICovCisJMHg5OEVELDB4ODlBQSwweDRFMDMsMHg2N0QyLDB4NkYwNiwweDRGQjUsMHg1QkUyLDB4Njc5NSwvKiAweEQwLTB4RDcgKi8KKwkweDZDODgsMHg2RDc4LDB4NzQxQiwweDc4MjcsMHg5MURELDB4OTM3QywweDg3QzQsMHg3OUU0LC8qIDB4RDgtMHhERiAqLworCTB4N0EzMSwweDVGRUIsMHg0RUQ2LDB4NTRBNCwweDU1M0UsMHg1OEFFLDB4NTlBNSwweDYwRjAsLyogMHhFMC0weEU3ICovCisJMHg2MjUzLDB4NjJENiwweDY3MzYsMHg2OTU1LDB4ODIzNSwweDk2NDAsMHg5OUIxLDB4OTlERCwvKiAweEU4LTB4RUYgKi8KKwkweDUwMkMsMHg1MzUzLDB4NTU0NCwweDU3N0MsMHhGQTAxLDB4NjI1OCwweEZBMDIsMHg2NEUyLC8qIDB4RjAtMHhGNyAqLworCTB4NjY2QiwweDY3REQsMHg2RkMxLDB4NkZFRiwweDc0MjIsMHg3NDM4LDB4OEExNywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRjdbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg5NDM4LDB4NTQ1MSwweDU2MDYsMHg1NzY2LDB4NUY0OCwweDYxOUEsMHg2QjRFLC8qIDB4QTAtMHhBNyAqLworCTB4NzA1OCwweDcwQUQsMHg3REJCLDB4OEE5NSwweDU5NkEsMHg4MTJCLDB4NjNBMiwweDc3MDgsLyogMHhBOC0weEFGICovCisJMHg4MDNELDB4OENBQSwweDU4NTQsMHg2NDJELDB4NjlCQiwweDVCOTUsMHg1RTExLDB4NkU2RiwvKiAweEIwLTB4QjcgKi8KKwkweEZBMDMsMHg4NTY5LDB4NTE0QywweDUzRjAsMHg1OTJBLDB4NjAyMCwweDYxNEIsMHg2Qjg2LC8qIDB4QjgtMHhCRiAqLworCTB4NkM3MCwweDZDRjAsMHg3QjFFLDB4ODBDRSwweDgyRDQsMHg4REM2LDB4OTBCMCwweDk4QjEsLyogMHhDMC0weEM3ICovCisJMHhGQTA0LDB4NjRDNywweDZGQTQsMHg2NDkxLDB4NjUwNCwweDUxNEUsMHg1NDEwLDB4NTcxRiwvKiAweEM4LTB4Q0YgKi8KKwkweDhBMEUsMHg2MTVGLDB4Njg3NiwweEZBMDUsMHg3NURCLDB4N0I1MiwweDdENzEsMHg5MDFBLC8qIDB4RDAtMHhENyAqLworCTB4NTgwNiwweDY5Q0MsMHg4MTdGLDB4ODkyQSwweDkwMDAsMHg5ODM5LDB4NTA3OCwweDU5NTcsLyogMHhEOC0weERGICovCisJMHg1OUFDLDB4NjI5NSwweDkwMEYsMHg5QjJBLDB4NjE1RCwweDcyNzksMHg5NUQ2LDB4NTc2MSwvKiAweEUwLTB4RTcgKi8KKwkweDVBNDYsMHg1REY0LDB4NjI4QSwweDY0QUQsMHg2NEZBLDB4Njc3NywweDZDRTIsMHg2RDNFLC8qIDB4RTgtMHhFRiAqLworCTB4NzIyQywweDc0MzYsMHg3ODM0LDB4N0Y3NywweDgyQUQsMHg4RERCLDB4OTgxNywweDUyMjQsLyogMHhGMC0weEY3ICovCisJMHg1NzQyLDB4Njc3RiwweDcyNDgsMHg3NEUzLDB4OENBOSwweDhGQTYsMHg5MjExLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9GOFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDk2MkEsMHg1MTZCLDB4NTNFRCwweDYzNEMsMHg0RjY5LDB4NTUwNCwweDYwOTYsLyogMHhBMC0weEE3ICovCisJMHg2NTU3LDB4NkM5QiwweDZEN0YsMHg3MjRDLDB4NzJGRCwweDdBMTcsMHg4OTg3LDB4OEM5RCwvKiAweEE4LTB4QUYgKi8KKwkweDVGNkQsMHg2RjhFLDB4NzBGOSwweDgxQTgsMHg2MTBFLDB4NEZCRiwweDUwNEYsMHg2MjQxLC8qIDB4QjAtMHhCNyAqLworCTB4NzI0NywweDdCQzcsMHg3REU4LDB4N0ZFOSwweDkwNEQsMHg5N0FELDB4OUExOSwweDhDQjYsLyogMHhCOC0weEJGICovCisJMHg1NzZBLDB4NUU3MywweDY3QjAsMHg4NDBELDB4OEE1NSwweDU0MjAsMHg1QjE2LDB4NUU2MywvKiAweEMwLTB4QzcgKi8KKwkweDVFRTIsMHg1RjBBLDB4NjU4MywweDgwQkEsMHg4NTNELDB4OTU4OSwweDk2NUIsMHg0RjQ4LC8qIDB4QzgtMHhDRiAqLworCTB4NTMwNSwweDUzMEQsMHg1MzBGLDB4NTQ4NiwweDU0RkEsMHg1NzAzLDB4NUUwMywweDYwMTYsLyogMHhEMC0weEQ3ICovCisJMHg2MjlCLDB4NjJCMSwweDYzNTUsMHhGQTA2LDB4NkNFMSwweDZENjYsMHg3NUIxLDB4NzgzMiwvKiAweEQ4LTB4REYgKi8KKwkweDgwREUsMHg4MTJGLDB4ODJERSwweDg0NjEsMHg4NEIyLDB4ODg4RCwweDg5MTIsMHg5MDBCLC8qIDB4RTAtMHhFNyAqLworCTB4OTJFQSwweDk4RkQsMHg5QjkxLDB4NUU0NSwweDY2QjQsMHg2NkRELDB4NzAxMSwweDcyMDYsLyogMHhFOC0weEVGICovCisJMHhGQTA3LDB4NEZGNSwweDUyN0QsMHg1RjZBLDB4NjE1MywweDY3NTMsMHg2QTE5LDB4NkYwMiwvKiAweEYwLTB4RjcgKi8KKwkweDc0RTIsMHg3OTY4LDB4ODg2OCwweDhDNzksMHg5OEM3LDB4OThDNCwweDlBNDMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0Y5WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NTRDMSwweDdBMUYsMHg2OTUzLDB4OEFGNywweDhDNEEsMHg5OEE4LDB4OTlBRSwvKiAweEEwLTB4QTcgKi8KKwkweDVGN0MsMHg2MkFCLDB4NzVCMiwweDc2QUUsMHg4OEFCLDB4OTA3RiwweDk2NDIsMHg1MzM5LC8qIDB4QTgtMHhBRiAqLworCTB4NUYzQywweDVGQzUsMHg2Q0NDLDB4NzNDQywweDc1NjIsMHg3NThCLDB4N0I0NiwweDgyRkUsLyogMHhCMC0weEI3ICovCisJMHg5OTlELDB4NEU0RiwweDkwM0MsMHg0RTBCLDB4NEY1NSwweDUzQTYsMHg1OTBGLDB4NUVDOCwvKiAweEI4LTB4QkYgKi8KKwkweDY2MzAsMHg2Q0IzLDB4NzQ1NSwweDgzNzcsMHg4NzY2LDB4OENDMCwweDkwNTAsMHg5NzFFLC8qIDB4QzAtMHhDNyAqLworCTB4OUMxNSwweDU4RDEsMHg1Qjc4LDB4ODY1MCwweDhCMTQsMHg5REI0LDB4NUJEMiwweDYwNjgsLyogMHhDOC0weENGICovCisJMHg2MDhELDB4NjVGMSwweDZDNTcsMHg2RjIyLDB4NkZBMywweDcwMUEsMHg3RjU1LDB4N0ZGMCwvKiAweEQwLTB4RDcgKi8KKwkweDk1OTEsMHg5NTkyLDB4OTY1MCwweDk3RDMsMHg1MjcyLDB4OEY0NCwweDUxRkQsMHg1NDJCLC8qIDB4RDgtMHhERiAqLworCTB4NTRCOCwweDU1NjMsMHg1NThBLDB4NkFCQiwweDZEQjUsMHg3REQ4LDB4ODI2NiwweDkyOUMsLyogMHhFMC0weEU3ICovCisJMHg5Njc3LDB4OUU3OSwweDU0MDgsMHg1NEM4LDB4NzZEMiwweDg2RTQsMHg5NUE0LDB4OTVENCwvKiAweEU4LTB4RUYgKi8KKwkweDk2NUMsMHg0RUEyLDB4NEYwOSwweDU5RUUsMHg1QUU2LDB4NURGNywweDYwNTIsMHg2Mjk3LC8qIDB4RjAtMHhGNyAqLworCTB4Njc2RCwweDY4NDEsMHg2Qzg2LDB4NkUyRiwweDdGMzgsMHg4MDlCLDB4ODIyQSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRkFbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHhGQTA4LDB4RkEwOSwweDk4MDUsMHg0RUE1LDB4NTA1NSwweDU0QjMsMHg1NzkzLC8qIDB4QTAtMHhBNyAqLworCTB4NTk1QSwweDVCNjksMHg1QkIzLDB4NjFDOCwweDY5NzcsMHg2RDc3LDB4NzAyMywweDg3RjksLyogMHhBOC0weEFGICovCisJMHg4OUUzLDB4OEE3MiwweDhBRTcsMHg5MDgyLDB4OTlFRCwweDlBQjgsMHg1MkJFLDB4NjgzOCwvKiAweEIwLTB4QjcgKi8KKwkweDUwMTYsMHg1RTc4LDB4Njc0RiwweDgzNDcsMHg4ODRDLDB4NEVBQiwweDU0MTEsMHg1NkFFLC8qIDB4QjgtMHhCRiAqLworCTB4NzNFNiwweDkxMTUsMHg5N0ZGLDB4OTkwOSwweDk5NTcsMHg5OTk5LDB4NTY1MywweDU4OUYsLyogMHhDMC0weEM3ICovCisJMHg4NjVCLDB4OEEzMSwweDYxQjIsMHg2QUY2LDB4NzM3QiwweDhFRDIsMHg2QjQ3LDB4OTZBQSwvKiAweEM4LTB4Q0YgKi8KKwkweDlBNTcsMHg1OTU1LDB4NzIwMCwweDhENkIsMHg5NzY5LDB4NEZENCwweDVDRjQsMHg1RjI2LC8qIDB4RDAtMHhENyAqLworCTB4NjFGOCwweDY2NUIsMHg2Q0VCLDB4NzBBQiwweDczODQsMHg3M0I5LDB4NzNGRSwweDc3MjksLyogMHhEOC0weERGICovCisJMHg3NzRELDB4N0Q0MywweDdENjIsMHg3RTIzLDB4ODIzNywweDg4NTIsMHhGQTBBLDB4OENFMiwvKiAweEUwLTB4RTcgKi8KKwkweDkyNDksMHg5ODZGLDB4NUI1MSwweDdBNzQsMHg4ODQwLDB4OTgwMSwweDVBQ0MsMHg0RkUwLC8qIDB4RTgtMHhFRiAqLworCTB4NTM1NCwweDU5M0UsMHg1Q0ZELDB4NjMzRSwweDZENzksMHg3MkY5LDB4ODEwNSwweDgxMDcsLyogMHhGMC0weEY3ICovCisJMHg4M0EyLDB4OTJDRiwweDk4MzAsMHg0RUE4LDB4NTE0NCwweDUyMTEsMHg1NzhCLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9GQlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDAtMHg0NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0OC0weDRGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDUwLTB4NTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTgtMHg1RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2MC0weDY3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDY4LTB4NkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzAtMHg3NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDVGNjIsMHg2Q0MyLDB4NkVDRSwweDcwMDUsMHg3MDUwLDB4NzBBRiwweDcxOTIsLyogMHhBMC0weEE3ICovCisJMHg3M0U5LDB4NzQ2OSwweDgzNEEsMHg4N0EyLDB4ODg2MSwweDkwMDgsMHg5MEEyLDB4OTNBMywvKiAweEE4LTB4QUYgKi8KKwkweDk5QTgsMHg1MTZFLDB4NUY1NywweDYwRTAsMHg2MTY3LDB4NjZCMywweDg1NTksMHg4RTRBLC8qIDB4QjAtMHhCNyAqLworCTB4OTFBRiwweDk3OEIsMHg0RTRFLDB4NEU5MiwweDU0N0MsMHg1OEQ1LDB4NThGQSwweDU5N0QsLyogMHhCOC0weEJGICovCisJMHg1Q0I1LDB4NUYyNywweDYyMzYsMHg2MjQ4LDB4NjYwQSwweDY2NjcsMHg2QkVCLDB4NkQ2OSwvKiAweEMwLTB4QzcgKi8KKwkweDZEQ0YsMHg2RTU2LDB4NkVGOCwweDZGOTQsMHg2RkUwLDB4NkZFOSwweDcwNUQsMHg3MkQwLC8qIDB4QzgtMHhDRiAqLworCTB4NzQyNSwweDc0NUEsMHg3NEUwLDB4NzY5MywweDc5NUMsMHg3Q0NBLDB4N0UxRSwweDgwRTEsLyogMHhEMC0weEQ3ICovCisJMHg4MkE2LDB4ODQ2QiwweDg0QkYsMHg4NjRFLDB4ODY1RiwweDg3NzQsMHg4Qjc3LDB4OEM2QSwvKiAweEQ4LTB4REYgKi8KKwkweDkzQUMsMHg5ODAwLDB4OTg2NSwweDYwRDEsMHg2MjE2LDB4OTE3NywweDVBNUEsMHg2NjBGLC8qIDB4RTAtMHhFNyAqLworCTB4NkRGNywweDZFM0UsMHg3NDNGLDB4OUI0MiwweDVGRkQsMHg2MERBLDB4N0IwRiwweDU0QzQsLyogMHhFOC0weEVGICovCisJMHg1RjE4LDB4NkM1RSwweDZDRDMsMHg2RDJBLDB4NzBEOCwweDdEMDUsMHg4Njc5LDB4OEEwQywvKiAweEYwLTB4RjcgKi8KKwkweDlEM0IsMHg1MzE2LDB4NTQ4QywweDVCMDUsMHg2QTNBLDB4NzA2QiwweDc1NzUsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0ZDWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg0MC0weDQ3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQ4LTB4NEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NTAtMHg1NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1OC0weDVGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDYwLTB4NjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjgtMHg2RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg3MC0weDc3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4Nzk4RCwweDc5QkUsMHg4MkIxLDB4ODNFRiwweDhBNzEsMHg4QjQxLDB4OENBOCwvKiAweEEwLTB4QTcgKi8KKwkweDk3NzQsMHhGQTBCLDB4NjRGNCwweDY1MkIsMHg3OEJBLDB4NzhCQiwweDdBNkIsMHg0RTM4LC8qIDB4QTgtMHhBRiAqLworCTB4NTU5QSwweDU5NTAsMHg1QkE2LDB4NUU3QiwweDYwQTMsMHg2M0RCLDB4NkI2MSwweDY2NjUsLyogMHhCMC0weEI3ICovCisJMHg2ODUzLDB4NkUxOSwweDcxNjUsMHg3NEIwLDB4N0QwOCwweDkwODQsMHg5QTY5LDB4OUMyNSwvKiAweEI4LTB4QkYgKi8KKwkweDZEM0IsMHg2RUQxLDB4NzMzRSwweDhDNDEsMHg5NUNBLDB4NTFGMCwweDVFNEMsMHg1RkE4LC8qIDB4QzAtMHhDNyAqLworCTB4NjA0RCwweDYwRjYsMHg2MTMwLDB4NjE0QywweDY2NDMsMHg2NjQ0LDB4NjlBNSwweDZDQzEsLyogMHhDOC0weENGICovCisJMHg2RTVGLDB4NkVDOSwweDZGNjIsMHg3MTRDLDB4NzQ5QywweDc2ODcsMHg3QkMxLDB4N0MyNywvKiAweEQwLTB4RDcgKi8KKwkweDgzNTIsMHg4NzU3LDB4OTA1MSwweDk2OEQsMHg5RUMzLDB4NTMyRiwweDU2REUsMHg1RUZCLC8qIDB4RDgtMHhERiAqLworCTB4NUY4QSwweDYwNjIsMHg2MDk0LDB4NjFGNywweDY2NjYsMHg2NzAzLDB4NkE5QywweDZERUUsLyogMHhFMC0weEU3ICovCisJMHg2RkFFLDB4NzA3MCwweDczNkEsMHg3RTZBLDB4ODFCRSwweDgzMzQsMHg4NkQ0LDB4OEFBOCwvKiAweEU4LTB4RUYgKi8KKwkweDhDQzQsMHg1MjgzLDB4NzM3MiwweDVCOTYsMHg2QTZCLDB4OTQwNCwweDU0RUUsMHg1Njg2LC8qIDB4RjAtMHhGNyAqLworCTB4NUI1RCwweDY1NDgsMHg2NTg1LDB4NjZDOSwweDY4OUYsMHg2RDhELDB4NkRDNiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRkRbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDQwLTB4NDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NDgtMHg0RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg1MC0weDU3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDU4LTB4NUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NjAtMHg2NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg2OC0weDZGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDcwLTB4NzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg3MjNCLDB4ODBCNCwweDkxNzUsMHg5QTRELDB4NEZBRiwweDUwMTksMHg1MzlBLC8qIDB4QTAtMHhBNyAqLworCTB4NTQwRSwweDU0M0MsMHg1NTg5LDB4NTVDNSwweDVFM0YsMHg1RjhDLDB4NjczRCwweDcxNjYsLyogMHhBOC0weEFGICovCisJMHg3M0RELDB4OTAwNSwweDUyREIsMHg1MkYzLDB4NTg2NCwweDU4Q0UsMHg3MTA0LDB4NzE4RiwvKiAweEIwLTB4QjcgKi8KKwkweDcxRkIsMHg4NUIwLDB4OEExMywweDY2ODgsMHg4NUE4LDB4NTVBNywweDY2ODQsMHg3MTRBLC8qIDB4QjgtMHhCRiAqLworCTB4ODQzMSwweDUzNDksMHg1NTk5LDB4NkJDMSwweDVGNTksMHg1RkJELDB4NjNFRSwweDY2ODksLyogMHhDMC0weEM3ICovCisJMHg3MTQ3LDB4OEFGMSwweDhGMUQsMHg5RUJFLDB4NEYxMSwweDY0M0EsMHg3MENCLDB4NzU2NiwvKiAweEM4LTB4Q0YgKi8KKwkweDg2NjcsMHg2MDY0LDB4OEI0RSwweDlERjgsMHg1MTQ3LDB4NTFGNiwweDUzMDgsMHg2RDM2LC8qIDB4RDAtMHhENyAqLworCTB4ODBGOCwweDlFRDEsMHg2NjE1LDB4NkIyMywweDcwOTgsMHg3NUQ1LDB4NTQwMywweDVDNzksLyogMHhEOC0weERGICovCisJMHg3RDA3LDB4OEExNiwweDZCMjAsMHg2QjNELDB4NkI0NiwweDU0MzgsMHg2MDcwLDB4NkQzRCwvKiAweEUwLTB4RTcgKi8KKwkweDdGRDUsMHg4MjA4LDB4NTBENiwweDUxREUsMHg1NTlDLDB4NTY2QiwweDU2Q0QsMHg1OUVDLC8qIDB4RTgtMHhFRiAqLworCTB4NUIwOSwweDVFMEMsMHg2MTk5LDB4NjE5OCwweDYyMzEsMHg2NjVFLDB4NjZFNiwweDcxOTksLyogMHhGMC0weEY3ICovCisJMHg3MUI5LDB4NzFCQSwweDcyQTcsMHg3OUE3LDB4N0EwMCwweDdGQjIsMHg4QTcwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90ICpwYWdlX2NoYXJzZXQydW5pWzI1Nl0gPSB7CisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgYzJ1XzgxLCBjMnVfODIsIGMydV84MywgYzJ1Xzg0LCBjMnVfODUsIGMydV84NiwgYzJ1Xzg3LCAKKwljMnVfODgsIGMydV84OSwgYzJ1XzhBLCBjMnVfOEIsIGMydV84QywgYzJ1XzhELCBjMnVfOEUsIGMydV84RiwgCisJYzJ1XzkwLCBjMnVfOTEsIGMydV85MiwgYzJ1XzkzLCBjMnVfOTQsIGMydV85NSwgYzJ1Xzk2LCBjMnVfOTcsIAorCWMydV85OCwgYzJ1Xzk5LCBjMnVfOUEsIGMydV85QiwgYzJ1XzlDLCBjMnVfOUQsIGMydV85RSwgYzJ1XzlGLCAKKwljMnVfQTAsIGMydV9BMSwgYzJ1X0EyLCBjMnVfQTMsIGMydV9BNCwgYzJ1X0E1LCBjMnVfQTYsIGMydV9BNywgCisJYzJ1X0E4LCBjMnVfQTksIGMydV9BQSwgYzJ1X0FCLCBjMnVfQUMsIGMydV9BRCwgYzJ1X0FFLCBjMnVfQUYsIAorCWMydV9CMCwgYzJ1X0IxLCBjMnVfQjIsIGMydV9CMywgYzJ1X0I0LCBjMnVfQjUsIGMydV9CNiwgYzJ1X0I3LCAKKwljMnVfQjgsIGMydV9COSwgYzJ1X0JBLCBjMnVfQkIsIGMydV9CQywgYzJ1X0JELCBjMnVfQkUsIGMydV9CRiwgCisJYzJ1X0MwLCBjMnVfQzEsIGMydV9DMiwgYzJ1X0MzLCBjMnVfQzQsIGMydV9DNSwgYzJ1X0M2LCBjMnVfQzcsIAorCWMydV9DOCwgTlVMTCwgICBjMnVfQ0EsIGMydV9DQiwgYzJ1X0NDLCBjMnVfQ0QsIGMydV9DRSwgYzJ1X0NGLCAKKwljMnVfRDAsIGMydV9EMSwgYzJ1X0QyLCBjMnVfRDMsIGMydV9ENCwgYzJ1X0Q1LCBjMnVfRDYsIGMydV9ENywgCisJYzJ1X0Q4LCBjMnVfRDksIGMydV9EQSwgYzJ1X0RCLCBjMnVfREMsIGMydV9ERCwgYzJ1X0RFLCBjMnVfREYsIAorCWMydV9FMCwgYzJ1X0UxLCBjMnVfRTIsIGMydV9FMywgYzJ1X0U0LCBjMnVfRTUsIGMydV9FNiwgYzJ1X0U3LCAKKwljMnVfRTgsIGMydV9FOSwgYzJ1X0VBLCBjMnVfRUIsIGMydV9FQywgYzJ1X0VELCBjMnVfRUUsIGMydV9FRiwgCisJYzJ1X0YwLCBjMnVfRjEsIGMydV9GMiwgYzJ1X0YzLCBjMnVfRjQsIGMydV9GNSwgYzJ1X0Y2LCBjMnVfRjcsIAorCWMydV9GOCwgYzJ1X0Y5LCBjMnVfRkEsIGMydV9GQiwgYzJ1X0ZDLCBjMnVfRkQsIE5VTEwsICAgTlVMTCwgICAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18wMVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4QTksIDB4QTIsIDB4QTksIDB4QTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTgsIDB4QTQsIDB4QTksIDB4QTQsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4QTksIDB4QTUsIDB4QTgsIDB4QTYsIDB4QTksIDB4QTYsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4QTksIDB4QTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTgsIDB4QTgsIC8qIDB4M0MtMHgzRiAqLworCTB4QTksIDB4QTgsIDB4QTgsIDB4QTksIDB4QTksIDB4QTksIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4QTksIDB4QjAsIDB4QTgsIDB4QUYsIDB4QTksIDB4QUYsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTgsIDB4QUIsIDB4QTksIDB4QUIsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTgsIDB4QUUsIDB4QTksIDB4QUUsIC8qIDB4NjQtMHg2NyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzAyWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMiwgMHhBNywgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHhBMiwgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHhBMiwgMHhBOCwgMHhBMiwgMHhBQiwgMHhBMiwgMHhBQSwgMHhBMiwgMHhBRCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHhBMiwgMHhBOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMDNbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweEE1LCAweEMxLCAweEE1LCAweEMyLCAweEE1LCAweEMzLCAvKiAweDkwLTB4OTMgKi8KKwkweEE1LCAweEM0LCAweEE1LCAweEM1LCAweEE1LCAweEM2LCAweEE1LCAweEM3LCAvKiAweDk0LTB4OTcgKi8KKwkweEE1LCAweEM4LCAweEE1LCAweEM5LCAweEE1LCAweENBLCAweEE1LCAweENCLCAvKiAweDk4LTB4OUIgKi8KKwkweEE1LCAweENDLCAweEE1LCAweENELCAweEE1LCAweENFLCAweEE1LCAweENGLCAvKiAweDlDLTB4OUYgKi8KKwkweEE1LCAweEQwLCAweEE1LCAweEQxLCAweDAwLCAweDAwLCAweEE1LCAweEQyLCAvKiAweEEwLTB4QTMgKi8KKwkweEE1LCAweEQzLCAweEE1LCAweEQ0LCAweEE1LCAweEQ1LCAweEE1LCAweEQ2LCAvKiAweEE0LTB4QTcgKi8KKwkweEE1LCAweEQ3LCAweEE1LCAweEQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweEE1LCAweEUxLCAweEE1LCAweEUyLCAweEE1LCAweEUzLCAvKiAweEIwLTB4QjMgKi8KKwkweEE1LCAweEU0LCAweEE1LCAweEU1LCAweEE1LCAweEU2LCAweEE1LCAweEU3LCAvKiAweEI0LTB4QjcgKi8KKwkweEE1LCAweEU4LCAweEE1LCAweEU5LCAweEE1LCAweEVBLCAweEE1LCAweEVCLCAvKiAweEI4LTB4QkIgKi8KKwkweEE1LCAweEVDLCAweEE1LCAweEVELCAweEE1LCAweEVFLCAweEE1LCAweEVGLCAvKiAweEJDLTB4QkYgKi8KKwkweEE1LCAweEYwLCAweEE1LCAweEYxLCAweDAwLCAweDAwLCAweEE1LCAweEYyLCAvKiAweEMwLTB4QzMgKi8KKwkweEE1LCAweEYzLCAweEE1LCAweEY0LCAweEE1LCAweEY1LCAweEE1LCAweEY2LCAvKiAweEM0LTB4QzcgKi8KKwkweEE1LCAweEY3LCAweEE1LCAweEY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18wNFs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4QUMsIDB4QTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4QUMsIDB4QTEsIDB4QUMsIDB4QTIsIDB4QUMsIDB4QTMsIDB4QUMsIDB4QTQsIC8qIDB4MTAtMHgxMyAqLworCTB4QUMsIDB4QTUsIDB4QUMsIDB4QTYsIDB4QUMsIDB4QTgsIDB4QUMsIDB4QTksIC8qIDB4MTQtMHgxNyAqLworCTB4QUMsIDB4QUEsIDB4QUMsIDB4QUIsIDB4QUMsIDB4QUMsIDB4QUMsIDB4QUQsIC8qIDB4MTgtMHgxQiAqLworCTB4QUMsIDB4QUUsIDB4QUMsIDB4QUYsIDB4QUMsIDB4QjAsIDB4QUMsIDB4QjEsIC8qIDB4MUMtMHgxRiAqLworCTB4QUMsIDB4QjIsIDB4QUMsIDB4QjMsIDB4QUMsIDB4QjQsIDB4QUMsIDB4QjUsIC8qIDB4MjAtMHgyMyAqLworCTB4QUMsIDB4QjYsIDB4QUMsIDB4QjcsIDB4QUMsIDB4QjgsIDB4QUMsIDB4QjksIC8qIDB4MjQtMHgyNyAqLworCTB4QUMsIDB4QkEsIDB4QUMsIDB4QkIsIDB4QUMsIDB4QkMsIDB4QUMsIDB4QkQsIC8qIDB4MjgtMHgyQiAqLworCTB4QUMsIDB4QkUsIDB4QUMsIDB4QkYsIDB4QUMsIDB4QzAsIDB4QUMsIDB4QzEsIC8qIDB4MkMtMHgyRiAqLworCTB4QUMsIDB4RDEsIDB4QUMsIDB4RDIsIDB4QUMsIDB4RDMsIDB4QUMsIDB4RDQsIC8qIDB4MzAtMHgzMyAqLworCTB4QUMsIDB4RDUsIDB4QUMsIDB4RDYsIDB4QUMsIDB4RDgsIDB4QUMsIDB4RDksIC8qIDB4MzQtMHgzNyAqLworCTB4QUMsIDB4REEsIDB4QUMsIDB4REIsIDB4QUMsIDB4REMsIDB4QUMsIDB4REQsIC8qIDB4MzgtMHgzQiAqLworCTB4QUMsIDB4REUsIDB4QUMsIDB4REYsIDB4QUMsIDB4RTAsIDB4QUMsIDB4RTEsIC8qIDB4M0MtMHgzRiAqLworCTB4QUMsIDB4RTIsIDB4QUMsIDB4RTMsIDB4QUMsIDB4RTQsIDB4QUMsIDB4RTUsIC8qIDB4NDAtMHg0MyAqLworCTB4QUMsIDB4RTYsIDB4QUMsIDB4RTcsIDB4QUMsIDB4RTgsIDB4QUMsIDB4RTksIC8qIDB4NDQtMHg0NyAqLworCTB4QUMsIDB4RUEsIDB4QUMsIDB4RUIsIDB4QUMsIDB4RUMsIDB4QUMsIDB4RUQsIC8qIDB4NDgtMHg0QiAqLworCTB4QUMsIDB4RUUsIDB4QUMsIDB4RUYsIDB4QUMsIDB4RjAsIDB4QUMsIDB4RjEsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4QUMsIDB4RDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzExWzUxMl0gPSB7CisJMHhBNCwgMHhBMSwgMHhBNCwgMHhBMiwgMHhBNCwgMHhBNCwgMHhBNCwgMHhBNywgLyogMHgwMC0weDAzICovCisJMHhBNCwgMHhBOCwgMHhBNCwgMHhBOSwgMHhBNCwgMHhCMSwgMHhBNCwgMHhCMiwgLyogMHgwNC0weDA3ICovCisJMHhBNCwgMHhCMywgMHhBNCwgMHhCNSwgMHhBNCwgMHhCNiwgMHhBNCwgMHhCNywgLyogMHgwOC0weDBCICovCisJMHhBNCwgMHhCOCwgMHhBNCwgMHhCOSwgMHhBNCwgMHhCQSwgMHhBNCwgMHhCQiwgLyogMHgwQy0weDBGICovCisJMHhBNCwgMHhCQywgMHhBNCwgMHhCRCwgMHhBNCwgMHhCRSwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHhBNCwgMHhENSwgMHhBNCwgMHhENiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNCwgMHhERCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHhBNCwgMHhERSwgMHhBNCwgMHhFMSwgMHhBNCwgMHhFMiwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHhBNCwgMHhFMywgMHhBNCwgMHhCNCwgMHhBNCwgMHhFNCwgMHhBNCwgMHhFNSwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNCwgMHhFNiwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHhBNCwgMHhFNywgMHgwMCwgMHgwMCwgMHhBNCwgMHhFOCwgLyogMHgyOC0weDJCICovCisJMHhBNCwgMHhFOSwgMHhBNCwgMHhFQSwgMHhBNCwgMHhFQiwgMHhBNCwgMHhFQywgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNCwgMHhFRCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNCwgMHhFRSwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHhBNCwgMHhCNSwgMHhBNCwgMHhCNiwgMHhBNCwgMHhCNSwgMHhBNCwgMHhCNiwgLyogMHgzQy0weDNGICovCisJMHhBNCwgMHhFRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHhBNCwgMHhGMiwgMHhBNCwgMHhGMywgMHhBNCwgMHhGMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHhBNCwgMHhCNywgMHgwMCwgMHgwMCwgMHhBNCwgMHhCOCwgMHhBNCwgMHhCOSwgLyogMHg0Qy0weDRGICovCisJMHhBNCwgMHhCOCwgMHhBNCwgMHhCOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHhBNCwgMHhCQSwgMHhBNCwgMHhCQSwgMHgwMCwgMHgwMCwgMHhBNCwgMHhGNCwgLyogMHg1NC0weDU3ICovCisJMHhBNCwgMHhGNSwgMHhBNCwgMHhGNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNCwgMHhENCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHhBNCwgMHhCRiwgMHhBNCwgMHhDMCwgMHhBNCwgMHhDMSwgLyogMHg2MC0weDYzICovCisJMHhBNCwgMHhDMiwgMHhBNCwgMHhDMywgMHhBNCwgMHhDNCwgMHhBNCwgMHhDNSwgLyogMHg2NC0weDY3ICovCisJMHhBNCwgMHhDNiwgMHhBNCwgMHhDNywgMHhBNCwgMHhDOCwgMHhBNCwgMHhDOSwgLyogMHg2OC0weDZCICovCisJMHhBNCwgMHhDQSwgMHhBNCwgMHhDQiwgMHhBNCwgMHhDQywgMHhBNCwgMHhDRCwgLyogMHg2Qy0weDZGICovCisJMHhBNCwgMHhDRSwgMHhBNCwgMHhDRiwgMHhBNCwgMHhEMCwgMHhBNCwgMHhEMSwgLyogMHg3MC0weDczICovCisJMHhBNCwgMHhEMiwgMHhBNCwgMHhEMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHhBNCwgMHhGNywgMHhBNCwgMHhGOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHhBNCwgMHhGOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHhBNCwgMHhGQSwgMHhBNCwgMHhGQiwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHhBNCwgMHhGQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNCwgMHhGRCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHhBNCwgMHhGRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHhBNCwgMHhBMSwgMHhBNCwgMHhBMiwgMHhBNCwgMHhBMywgMHhBNCwgMHhBNCwgLyogMHhBOC0weEFCICovCisJMHhBNCwgMHhBNSwgMHhBNCwgMHhBNiwgMHhBNCwgMHhBNywgMHhBNCwgMHhBOSwgLyogMHhBQy0weEFGICovCisJMHhBNCwgMHhBQSwgMHhBNCwgMHhBQiwgMHhBNCwgMHhBQywgMHhBNCwgMHhBRCwgLyogMHhCMC0weEIzICovCisJMHhBNCwgMHhBRSwgMHhBNCwgMHhBRiwgMHhBNCwgMHhCMCwgMHhBNCwgMHhCMSwgLyogMHhCNC0weEI3ICovCisJMHhBNCwgMHhCMiwgMHhBNCwgMHhCNCwgMHhBNCwgMHhCNSwgMHhBNCwgMHhCNiwgLyogMHhCOC0weEJCICovCisJMHhBNCwgMHhCNywgMHhBNCwgMHhCOCwgMHhBNCwgMHhCQSwgMHhBNCwgMHhCQiwgLyogMHhCQy0weEJGICovCisJMHhBNCwgMHhCQywgMHhBNCwgMHhCRCwgMHhBNCwgMHhCRSwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNCwgMHhENiwgMHhBNCwgMHhENywgLyogMHhDNC0weEM3ICovCisJMHhBNCwgMHhEOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHhBNCwgMHhEOSwgMHgwMCwgMHgwMCwgMHhBNCwgMHhEQSwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNCwgMHhEQiwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNCwgMHhEQywgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHhBNCwgMHhERCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHhBNCwgMHhERSwgMHhBNCwgMHhERiwgMHgwMCwgMHgwMCwgMHhBNCwgMHhFMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNCwgMHhFOCwgMHhBNCwgMHhFQSwgLyogMHhFNC0weEU3ICovCisJMHhBNCwgMHhFQywgMHgwMCwgMHgwMCwgMHhBNCwgMHhFRCwgMHhBNCwgMHhFRiwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNCwgMHhGMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHhBNCwgMHhCNywgMHhBNCwgMHhGMiwgMHhBNCwgMHhGMywgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHhBNCwgMHhGNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHhBNCwgMHhGNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMjBbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweEExLCAweEFBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweEExLCAweEFFLCAweEExLCAweEFGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweEExLCAweEIwLCAweEExLCAweEIxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweEEyLCAweEQzLCAweEEyLCAweEQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweEExLCAweEE1LCAweEExLCAweEE2LCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweEEyLCAweEI2LCAweDAwLCAweDAwLCAweEExLCAweEM3LCAweEExLCAweEM4LCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEExLCAweEQ4LCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweEE5LCAweEY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE5LCAweEZBLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweEE5LCAweEZCLCAweEE5LCAweEZDLCAweEE5LCAweEZELCAvKiAweDgwLTB4ODMgKi8KKwkweEE5LCAweEZFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDVDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18yMVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4QzksIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4QTIsIDB4QjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTcsIDB4QTQsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTIsIDB4RTAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4QTIsIDB4RTUsIDB4QTIsIDB4RTIsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTcsIDB4RDksIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4Q0EsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTgsIDB4RjcsIC8qIDB4NTAtMHg1MyAqLworCTB4QTgsIDB4RjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTgsIDB4RkIsIC8qIDB4NTgtMHg1QiAqLworCTB4QTgsIDB4RkMsIDB4QTgsIDB4RkQsIDB4QTgsIDB4RkUsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4QTUsIDB4QjAsIDB4QTUsIDB4QjEsIDB4QTUsIDB4QjIsIDB4QTUsIDB4QjMsIC8qIDB4NjAtMHg2MyAqLworCTB4QTUsIDB4QjQsIDB4QTUsIDB4QjUsIDB4QTUsIDB4QjYsIDB4QTUsIDB4QjcsIC8qIDB4NjQtMHg2NyAqLworCTB4QTUsIDB4QjgsIDB4QTUsIDB4QjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4QTUsIDB4QTEsIDB4QTUsIDB4QTIsIDB4QTUsIDB4QTMsIDB4QTUsIDB4QTQsIC8qIDB4NzAtMHg3MyAqLworCTB4QTUsIDB4QTUsIDB4QTUsIDB4QTYsIDB4QTUsIDB4QTcsIDB4QTUsIDB4QTgsIC8qIDB4NzQtMHg3NyAqLworCTB4QTUsIDB4QTksIDB4QTUsIDB4QUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4QTEsIDB4RTcsIDB4QTEsIDB4RTgsIDB4QTEsIDB4RTYsIDB4QTEsIDB4RTksIC8qIDB4OTAtMHg5MyAqLworCTB4QTEsIDB4RUEsIDB4QTIsIDB4RDUsIDB4QTIsIDB4RDgsIDB4QTIsIDB4RDYsIC8qIDB4OTQtMHg5NyAqLworCTB4QTIsIDB4RDksIDB4QTIsIDB4RDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTIsIDB4QTEsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4QTIsIDB4QTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzIyWzUxMl0gPSB7CisJMHhBMiwgMHhBMywgMHgwMCwgMHgwMCwgMHhBMSwgMHhEMywgMHhBMiwgMHhBNCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhENCwgLyogMHgwNC0weDA3ICovCisJMHhBMSwgMHhGNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhGNSwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMiwgMHhCMywgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHhBMiwgMHhCMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhFRSwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHhBMSwgMHhGMCwgMHhBMSwgMHhDNCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHhBMSwgMHhEMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhBMSwgMHhBQiwgMHgwMCwgMHgwMCwgMHhBMSwgMHhGQywgLyogMHgyNC0weDI3ICovCisJMHhBMSwgMHhGRCwgMHhBMSwgMHhGQiwgMHhBMSwgMHhGQSwgMHhBMSwgMHhGMiwgLyogMHgyOC0weDJCICovCisJMHhBMSwgMHhGMywgMHgwMCwgMHgwMCwgMHhBMiwgMHhCMSwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHhBMSwgMHhDNSwgMHhBMSwgMHhGMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHhBMSwgMHhBRCwgMHhBMSwgMHhFRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhENiwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHhBMSwgMHhDMSwgMHhBMSwgMHhENSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHhBMSwgMHhDMiwgMHhBMSwgMHhDMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhFQywgMHhBMSwgMHhFRCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhGOCwgMHhBMSwgMHhGOSwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhGNiwgMHhBMSwgMHhGNywgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHhBMiwgMHhDMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHhBMSwgMHhEMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMjNbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEExLCAweEQyLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18yNFs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4QTgsIDB4RTcsIDB4QTgsIDB4RTgsIDB4QTgsIDB4RTksIDB4QTgsIDB4RUEsIC8qIDB4NjAtMHg2MyAqLworCTB4QTgsIDB4RUIsIDB4QTgsIDB4RUMsIDB4QTgsIDB4RUQsIDB4QTgsIDB4RUUsIC8qIDB4NjQtMHg2NyAqLworCTB4QTgsIDB4RUYsIDB4QTgsIDB4RjAsIDB4QTgsIDB4RjEsIDB4QTgsIDB4RjIsIC8qIDB4NjgtMHg2QiAqLworCTB4QTgsIDB4RjMsIDB4QTgsIDB4RjQsIDB4QTgsIDB4RjUsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4QTksIDB4RTcsIDB4QTksIDB4RTgsIDB4QTksIDB4RTksIDB4QTksIDB4RUEsIC8qIDB4NzQtMHg3NyAqLworCTB4QTksIDB4RUIsIDB4QTksIDB4RUMsIDB4QTksIDB4RUQsIDB4QTksIDB4RUUsIC8qIDB4NzgtMHg3QiAqLworCTB4QTksIDB4RUYsIDB4QTksIDB4RjAsIDB4QTksIDB4RjEsIDB4QTksIDB4RjIsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QTksIDB4RjMsIDB4QTksIDB4RjQsIDB4QTksIDB4RjUsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4QTksIDB4Q0QsIDB4QTksIDB4Q0UsIDB4QTksIDB4Q0YsIDB4QTksIDB4RDAsIC8qIDB4OUMtMHg5RiAqLworCTB4QTksIDB4RDEsIDB4QTksIDB4RDIsIDB4QTksIDB4RDMsIDB4QTksIDB4RDQsIC8qIDB4QTAtMHhBMyAqLworCTB4QTksIDB4RDUsIDB4QTksIDB4RDYsIDB4QTksIDB4RDcsIDB4QTksIDB4RDgsIC8qIDB4QTQtMHhBNyAqLworCTB4QTksIDB4RDksIDB4QTksIDB4REEsIDB4QTksIDB4REIsIDB4QTksIDB4REMsIC8qIDB4QTgtMHhBQiAqLworCTB4QTksIDB4REQsIDB4QTksIDB4REUsIDB4QTksIDB4REYsIDB4QTksIDB4RTAsIC8qIDB4QUMtMHhBRiAqLworCTB4QTksIDB4RTEsIDB4QTksIDB4RTIsIDB4QTksIDB4RTMsIDB4QTksIDB4RTQsIC8qIDB4QjAtMHhCMyAqLworCTB4QTksIDB4RTUsIDB4QTksIDB4RTYsIDB4QTgsIDB4Q0QsIDB4QTgsIDB4Q0UsIC8qIDB4QjQtMHhCNyAqLworCTB4QTgsIDB4Q0YsIDB4QTgsIDB4RDAsIDB4QTgsIDB4RDEsIDB4QTgsIDB4RDIsIC8qIDB4QjgtMHhCQiAqLworCTB4QTgsIDB4RDMsIDB4QTgsIDB4RDQsIDB4QTgsIDB4RDUsIDB4QTgsIDB4RDYsIC8qIDB4QkMtMHhCRiAqLworCTB4QTgsIDB4RDcsIDB4QTgsIDB4RDgsIDB4QTgsIDB4RDksIDB4QTgsIDB4REEsIC8qIDB4QzAtMHhDMyAqLworCTB4QTgsIDB4REIsIDB4QTgsIDB4REMsIDB4QTgsIDB4REQsIDB4QTgsIDB4REUsIC8qIDB4QzQtMHhDNyAqLworCTB4QTgsIDB4REYsIDB4QTgsIDB4RTAsIDB4QTgsIDB4RTEsIDB4QTgsIDB4RTIsIC8qIDB4QzgtMHhDQiAqLworCTB4QTgsIDB4RTMsIDB4QTgsIDB4RTQsIDB4QTgsIDB4RTUsIDB4QTgsIDB4RTYsIC8qIDB4Q0MtMHhDRiAqLworCTB4QTgsIDB4Q0QsIDB4QTgsIDB4Q0UsIDB4QTgsIDB4Q0YsIDB4QTgsIDB4RDAsIC8qIDB4RDAtMHhEMyAqLworCTB4QTgsIDB4RDEsIDB4QTgsIDB4RDIsIDB4QTgsIDB4RDMsIDB4QTgsIDB4RDQsIC8qIDB4RDQtMHhENyAqLworCTB4QTgsIDB4RDUsIDB4QTgsIDB4RDYsIDB4QTgsIDB4RDcsIDB4QTgsIDB4RDgsIC8qIDB4RDgtMHhEQiAqLworCTB4QTgsIDB4RDksIDB4QTgsIDB4REEsIDB4QTgsIDB4REIsIDB4QTgsIDB4REMsIC8qIDB4REMtMHhERiAqLworCTB4QTgsIDB4REQsIDB4QTgsIDB4REUsIDB4QTgsIDB4REYsIDB4QTgsIDB4RTAsIC8qIDB4RTAtMHhFMyAqLworCTB4QTgsIDB4RTEsIDB4QTgsIDB4RTIsIDB4QTgsIDB4RTMsIDB4QTgsIDB4RTQsIC8qIDB4RTQtMHhFNyAqLworCTB4QTgsIDB4RTUsIDB4QTgsIDB4RTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzI1WzUxMl0gPSB7CisJMHhBNiwgMHhBMSwgMHhBNiwgMHhBQywgMHhBNiwgMHhBMiwgMHhBNiwgMHhBRCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHhBNiwgMHhBMywgMHhBNiwgMHhDOCwgMHhBNiwgMHhDNywgMHhBNiwgMHhBRSwgLyogMHgwQy0weDBGICovCisJMHhBNiwgMHhBNCwgMHhBNiwgMHhDMiwgMHhBNiwgMHhDMSwgMHhBNiwgMHhBRiwgLyogMHgxMC0weDEzICovCisJMHhBNiwgMHhBNiwgMHhBNiwgMHhDNiwgMHhBNiwgMHhDNSwgMHhBNiwgMHhCMSwgLyogMHgxNC0weDE3ICovCisJMHhBNiwgMHhBNSwgMHhBNiwgMHhDNCwgMHhBNiwgMHhDMywgMHhBNiwgMHhCMCwgLyogMHgxOC0weDFCICovCisJMHhBNiwgMHhBNywgMHhBNiwgMHhCQywgMHhBNiwgMHhDOSwgMHhBNiwgMHhDQSwgLyogMHgxQy0weDFGICovCisJMHhBNiwgMHhCNywgMHhBNiwgMHhDQiwgMHhBNiwgMHhDQywgMHhBNiwgMHhCMiwgLyogMHgyMC0weDIzICovCisJMHhBNiwgMHhBOSwgMHhBNiwgMHhCRSwgMHhBNiwgMHhDRCwgMHhBNiwgMHhDRSwgLyogMHgyNC0weDI3ICovCisJMHhBNiwgMHhCOSwgMHhBNiwgMHhDRiwgMHhBNiwgMHhEMCwgMHhBNiwgMHhCNCwgLyogMHgyOC0weDJCICovCisJMHhBNiwgMHhBOCwgMHhBNiwgMHhEMSwgMHhBNiwgMHhEMiwgMHhBNiwgMHhCOCwgLyogMHgyQy0weDJGICovCisJMHhBNiwgMHhCRCwgMHhBNiwgMHhEMywgMHhBNiwgMHhENCwgMHhBNiwgMHhCMywgLyogMHgzMC0weDMzICovCisJMHhBNiwgMHhBQSwgMHhBNiwgMHhENSwgMHhBNiwgMHhENiwgMHhBNiwgMHhCQSwgLyogMHgzNC0weDM3ICovCisJMHhBNiwgMHhCRiwgMHhBNiwgMHhENywgMHhBNiwgMHhEOCwgMHhBNiwgMHhCNSwgLyogMHgzOC0weDNCICovCisJMHhBNiwgMHhBQiwgMHhBNiwgMHhEOSwgMHhBNiwgMHhEQSwgMHhBNiwgMHhCQiwgLyogMHgzQy0weDNGICovCisJMHhBNiwgMHhEQiwgMHhBNiwgMHhEQywgMHhBNiwgMHhDMCwgMHhBNiwgMHhERCwgLyogMHg0MC0weDQzICovCisJMHhBNiwgMHhERSwgMHhBNiwgMHhERiwgMHhBNiwgMHhFMCwgMHhBNiwgMHhFMSwgLyogMHg0NC0weDQ3ICovCisJMHhBNiwgMHhFMiwgMHhBNiwgMHhFMywgMHhBNiwgMHhFNCwgMHhBNiwgMHhCNiwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMiwgMHhDNiwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHhBMSwgMHhFMSwgMHhBMSwgMHhFMCwgMHgwMCwgMHgwMCwgMHhBMiwgMHhDMywgLyogMHhBMC0weEEzICovCisJMHhBMiwgMHhDNywgMHhBMiwgMHhDOCwgMHhBMiwgMHhDQiwgMHhBMiwgMHhDQSwgLyogMHhBNC0weEE3ICovCisJMHhBMiwgMHhDOSwgMHhBMiwgMHhDQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhFMywgMHhBMSwgMHhFMiwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMiwgMHhCQSwgMHhBMiwgMHhCOSwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHhBMSwgMHhFNSwgMHhBMSwgMHhFNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHhBMiwgMHhCOCwgMHhBMiwgMHhCNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhERiwgMHhBMSwgMHhERSwgLyogMHhDNC0weEM3ICovCisJMHhBMiwgMHhDMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhEQiwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhERCwgMHhBMSwgMHhEQywgLyogMHhDQy0weENGICovCisJMHhBMiwgMHhDNCwgMHhBMiwgMHhDNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMjZbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweEExLCAweERBLCAweEExLCAweEQ5LCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEEyLCAweENGLCAweEEyLCAweENFLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweEEyLCAweEQwLCAweDAwLCAweDAwLCAweEEyLCAweEQxLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweEExLCAweENGLCAweDAwLCAweDAwLCAweEExLCAweENFLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweEEyLCAweEJDLCAweEEyLCAweEJELCAweDAwLCAweDAwLCAweEEyLCAweEMwLCAvKiAweDYwLTB4NjMgKi8KKwkweEEyLCAweEJCLCAweEEyLCAweEJFLCAweDAwLCAweDAwLCAweEEyLCAweEJGLCAvKiAweDY0LTB4NjcgKi8KKwkweEEyLCAweENELCAweEEyLCAweERCLCAweEEyLCAweERDLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweEEyLCAweERELCAweEEyLCAweERBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18zMFs1MTJdID0geworCTB4QTEsIDB4QTEsIDB4QTEsIDB4QTIsIDB4QTEsIDB4QTMsIDB4QTEsIDB4QTgsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4QTEsIDB4QjQsIDB4QTEsIDB4QjUsIDB4QTEsIDB4QjYsIDB4QTEsIDB4QjcsIC8qIDB4MDgtMHgwQiAqLworCTB4QTEsIDB4QjgsIDB4QTEsIDB4QjksIDB4QTEsIDB4QkEsIDB4QTEsIDB4QkIsIC8qIDB4MEMtMHgwRiAqLworCTB4QTEsIDB4QkMsIDB4QTEsIDB4QkQsIDB4MDAsIDB4MDAsIDB4QTEsIDB4RUIsIC8qIDB4MTAtMHgxMyAqLworCTB4QTEsIDB4QjIsIDB4QTEsIDB4QjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4QUEsIDB4QTEsIDB4QUEsIDB4QTIsIDB4QUEsIDB4QTMsIC8qIDB4NDAtMHg0MyAqLworCTB4QUEsIDB4QTQsIDB4QUEsIDB4QTUsIDB4QUEsIDB4QTYsIDB4QUEsIDB4QTcsIC8qIDB4NDQtMHg0NyAqLworCTB4QUEsIDB4QTgsIDB4QUEsIDB4QTksIDB4QUEsIDB4QUEsIDB4QUEsIDB4QUIsIC8qIDB4NDgtMHg0QiAqLworCTB4QUEsIDB4QUMsIDB4QUEsIDB4QUQsIDB4QUEsIDB4QUUsIDB4QUEsIDB4QUYsIC8qIDB4NEMtMHg0RiAqLworCTB4QUEsIDB4QjAsIDB4QUEsIDB4QjEsIDB4QUEsIDB4QjIsIDB4QUEsIDB4QjMsIC8qIDB4NTAtMHg1MyAqLworCTB4QUEsIDB4QjQsIDB4QUEsIDB4QjUsIDB4QUEsIDB4QjYsIDB4QUEsIDB4QjcsIC8qIDB4NTQtMHg1NyAqLworCTB4QUEsIDB4QjgsIDB4QUEsIDB4QjksIDB4QUEsIDB4QkEsIDB4QUEsIDB4QkIsIC8qIDB4NTgtMHg1QiAqLworCTB4QUEsIDB4QkMsIDB4QUEsIDB4QkQsIDB4QUEsIDB4QkUsIDB4QUEsIDB4QkYsIC8qIDB4NUMtMHg1RiAqLworCTB4QUEsIDB4QzAsIDB4QUEsIDB4QzEsIDB4QUEsIDB4QzIsIDB4QUEsIDB4QzMsIC8qIDB4NjAtMHg2MyAqLworCTB4QUEsIDB4QzQsIDB4QUEsIDB4QzUsIDB4QUEsIDB4QzYsIDB4QUEsIDB4QzcsIC8qIDB4NjQtMHg2NyAqLworCTB4QUEsIDB4QzgsIDB4QUEsIDB4QzksIDB4QUEsIDB4Q0EsIDB4QUEsIDB4Q0IsIC8qIDB4NjgtMHg2QiAqLworCTB4QUEsIDB4Q0MsIDB4QUEsIDB4Q0QsIDB4QUEsIDB4Q0UsIDB4QUEsIDB4Q0YsIC8qIDB4NkMtMHg2RiAqLworCTB4QUEsIDB4RDAsIDB4QUEsIDB4RDEsIDB4QUEsIDB4RDIsIDB4QUEsIDB4RDMsIC8qIDB4NzAtMHg3MyAqLworCTB4QUEsIDB4RDQsIDB4QUEsIDB4RDUsIDB4QUEsIDB4RDYsIDB4QUEsIDB4RDcsIC8qIDB4NzQtMHg3NyAqLworCTB4QUEsIDB4RDgsIDB4QUEsIDB4RDksIDB4QUEsIDB4REEsIDB4QUEsIDB4REIsIC8qIDB4NzgtMHg3QiAqLworCTB4QUEsIDB4REMsIDB4QUEsIDB4REQsIDB4QUEsIDB4REUsIDB4QUEsIDB4REYsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QUEsIDB4RTAsIDB4QUEsIDB4RTEsIDB4QUEsIDB4RTIsIDB4QUEsIDB4RTMsIC8qIDB4ODAtMHg4MyAqLworCTB4QUEsIDB4RTQsIDB4QUEsIDB4RTUsIDB4QUEsIDB4RTYsIDB4QUEsIDB4RTcsIC8qIDB4ODQtMHg4NyAqLworCTB4QUEsIDB4RTgsIDB4QUEsIDB4RTksIDB4QUEsIDB4RUEsIDB4QUEsIDB4RUIsIC8qIDB4ODgtMHg4QiAqLworCTB4QUEsIDB4RUMsIDB4QUEsIDB4RUQsIDB4QUEsIDB4RUUsIDB4QUEsIDB4RUYsIC8qIDB4OEMtMHg4RiAqLworCTB4QUEsIDB4RjAsIDB4QUEsIDB4RjEsIDB4QUEsIDB4RjIsIDB4QUEsIDB4RjMsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4QUIsIDB4QTEsIDB4QUIsIDB4QTIsIDB4QUIsIDB4QTMsIC8qIDB4QTAtMHhBMyAqLworCTB4QUIsIDB4QTQsIDB4QUIsIDB4QTUsIDB4QUIsIDB4QTYsIDB4QUIsIDB4QTcsIC8qIDB4QTQtMHhBNyAqLworCTB4QUIsIDB4QTgsIDB4QUIsIDB4QTksIDB4QUIsIDB4QUEsIDB4QUIsIDB4QUIsIC8qIDB4QTgtMHhBQiAqLworCTB4QUIsIDB4QUMsIDB4QUIsIDB4QUQsIDB4QUIsIDB4QUUsIDB4QUIsIDB4QUYsIC8qIDB4QUMtMHhBRiAqLworCTB4QUIsIDB4QjAsIDB4QUIsIDB4QjEsIDB4QUIsIDB4QjIsIDB4QUIsIDB4QjMsIC8qIDB4QjAtMHhCMyAqLworCTB4QUIsIDB4QjQsIDB4QUIsIDB4QjUsIDB4QUIsIDB4QjYsIDB4QUIsIDB4QjcsIC8qIDB4QjQtMHhCNyAqLworCTB4QUIsIDB4QjgsIDB4QUIsIDB4QjksIDB4QUIsIDB4QkEsIDB4QUIsIDB4QkIsIC8qIDB4QjgtMHhCQiAqLworCTB4QUIsIDB4QkMsIDB4QUIsIDB4QkQsIDB4QUIsIDB4QkUsIDB4QUIsIDB4QkYsIC8qIDB4QkMtMHhCRiAqLworCTB4QUIsIDB4QzAsIDB4QUIsIDB4QzEsIDB4QUIsIDB4QzIsIDB4QUIsIDB4QzMsIC8qIDB4QzAtMHhDMyAqLworCTB4QUIsIDB4QzQsIDB4QUIsIDB4QzUsIDB4QUIsIDB4QzYsIDB4QUIsIDB4QzcsIC8qIDB4QzQtMHhDNyAqLworCTB4QUIsIDB4QzgsIDB4QUIsIDB4QzksIDB4QUIsIDB4Q0EsIDB4QUIsIDB4Q0IsIC8qIDB4QzgtMHhDQiAqLworCTB4QUIsIDB4Q0MsIDB4QUIsIDB4Q0QsIDB4QUIsIDB4Q0UsIDB4QUIsIDB4Q0YsIC8qIDB4Q0MtMHhDRiAqLworCTB4QUIsIDB4RDAsIDB4QUIsIDB4RDEsIDB4QUIsIDB4RDIsIDB4QUIsIDB4RDMsIC8qIDB4RDAtMHhEMyAqLworCTB4QUIsIDB4RDQsIDB4QUIsIDB4RDUsIDB4QUIsIDB4RDYsIDB4QUIsIDB4RDcsIC8qIDB4RDQtMHhENyAqLworCTB4QUIsIDB4RDgsIDB4QUIsIDB4RDksIDB4QUIsIDB4REEsIDB4QUIsIDB4REIsIC8qIDB4RDgtMHhEQiAqLworCTB4QUIsIDB4REMsIDB4QUIsIDB4REQsIDB4QUIsIDB4REUsIDB4QUIsIDB4REYsIC8qIDB4REMtMHhERiAqLworCTB4QUIsIDB4RTAsIDB4QUIsIDB4RTEsIDB4QUIsIDB4RTIsIDB4QUIsIDB4RTMsIC8qIDB4RTAtMHhFMyAqLworCTB4QUIsIDB4RTQsIDB4QUIsIDB4RTUsIDB4QUIsIDB4RTYsIDB4QUIsIDB4RTcsIC8qIDB4RTQtMHhFNyAqLworCTB4QUIsIDB4RTgsIDB4QUIsIDB4RTksIDB4QUIsIDB4RUEsIDB4QUIsIDB4RUIsIC8qIDB4RTgtMHhFQiAqLworCTB4QUIsIDB4RUMsIDB4QUIsIDB4RUQsIDB4QUIsIDB4RUUsIDB4QUIsIDB4RUYsIC8qIDB4RUMtMHhFRiAqLworCTB4QUIsIDB4RjAsIDB4QUIsIDB4RjEsIDB4QUIsIDB4RjIsIDB4QUIsIDB4RjMsIC8qIDB4RjAtMHhGMyAqLworCTB4QUIsIDB4RjQsIDB4QUIsIDB4RjUsIDB4QUIsIDB4RjYsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzMxWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHhBNCwgMHhBMSwgMHhBNCwgMHhBMiwgMHhBNCwgMHhBMywgLyogMHgzMC0weDMzICovCisJMHhBNCwgMHhBNCwgMHhBNCwgMHhBNSwgMHhBNCwgMHhBNiwgMHhBNCwgMHhBNywgLyogMHgzNC0weDM3ICovCisJMHhBNCwgMHhBOCwgMHhBNCwgMHhBOSwgMHhBNCwgMHhBQSwgMHhBNCwgMHhBQiwgLyogMHgzOC0weDNCICovCisJMHhBNCwgMHhBQywgMHhBNCwgMHhBRCwgMHhBNCwgMHhBRSwgMHhBNCwgMHhBRiwgLyogMHgzQy0weDNGICovCisJMHhBNCwgMHhCMCwgMHhBNCwgMHhCMSwgMHhBNCwgMHhCMiwgMHhBNCwgMHhCMywgLyogMHg0MC0weDQzICovCisJMHhBNCwgMHhCNCwgMHhBNCwgMHhCNSwgMHhBNCwgMHhCNiwgMHhBNCwgMHhCNywgLyogMHg0NC0weDQ3ICovCisJMHhBNCwgMHhCOCwgMHhBNCwgMHhCOSwgMHhBNCwgMHhCQSwgMHhBNCwgMHhCQiwgLyogMHg0OC0weDRCICovCisJMHhBNCwgMHhCQywgMHhBNCwgMHhCRCwgMHhBNCwgMHhCRSwgMHhBNCwgMHhCRiwgLyogMHg0Qy0weDRGICovCisJMHhBNCwgMHhDMCwgMHhBNCwgMHhDMSwgMHhBNCwgMHhDMiwgMHhBNCwgMHhDMywgLyogMHg1MC0weDUzICovCisJMHhBNCwgMHhDNCwgMHhBNCwgMHhDNSwgMHhBNCwgMHhDNiwgMHhBNCwgMHhDNywgLyogMHg1NC0weDU3ICovCisJMHhBNCwgMHhDOCwgMHhBNCwgMHhDOSwgMHhBNCwgMHhDQSwgMHhBNCwgMHhDQiwgLyogMHg1OC0weDVCICovCisJMHhBNCwgMHhDQywgMHhBNCwgMHhDRCwgMHhBNCwgMHhDRSwgMHhBNCwgMHhDRiwgLyogMHg1Qy0weDVGICovCisJMHhBNCwgMHhEMCwgMHhBNCwgMHhEMSwgMHhBNCwgMHhEMiwgMHhBNCwgMHhEMywgLyogMHg2MC0weDYzICovCisJMHhBNCwgMHhENCwgMHhBNCwgMHhENSwgMHhBNCwgMHhENiwgMHhBNCwgMHhENywgLyogMHg2NC0weDY3ICovCisJMHhBNCwgMHhEOCwgMHhBNCwgMHhEOSwgMHhBNCwgMHhEQSwgMHhBNCwgMHhEQiwgLyogMHg2OC0weDZCICovCisJMHhBNCwgMHhEQywgMHhBNCwgMHhERCwgMHhBNCwgMHhERSwgMHhBNCwgMHhERiwgLyogMHg2Qy0weDZGICovCisJMHhBNCwgMHhFMCwgMHhBNCwgMHhFMSwgMHhBNCwgMHhFMiwgMHhBNCwgMHhFMywgLyogMHg3MC0weDczICovCisJMHhBNCwgMHhFNCwgMHhBNCwgMHhFNSwgMHhBNCwgMHhFNiwgMHhBNCwgMHhFNywgLyogMHg3NC0weDc3ICovCisJMHhBNCwgMHhFOCwgMHhBNCwgMHhFOSwgMHhBNCwgMHhFQSwgMHhBNCwgMHhFQiwgLyogMHg3OC0weDdCICovCisJMHhBNCwgMHhFQywgMHhBNCwgMHhFRCwgMHhBNCwgMHhFRSwgMHhBNCwgMHhFRiwgLyogMHg3Qy0weDdGICovCisJCisJMHhBNCwgMHhGMCwgMHhBNCwgMHhGMSwgMHhBNCwgMHhGMiwgMHhBNCwgMHhGMywgLyogMHg4MC0weDgzICovCisJMHhBNCwgMHhGNCwgMHhBNCwgMHhGNSwgMHhBNCwgMHhGNiwgMHhBNCwgMHhGNywgLyogMHg4NC0weDg3ICovCisJMHhBNCwgMHhGOCwgMHhBNCwgMHhGOSwgMHhBNCwgMHhGQSwgMHhBNCwgMHhGQiwgLyogMHg4OC0weDhCICovCisJMHhBNCwgMHhGQywgMHhBNCwgMHhGRCwgMHhBNCwgMHhGRSwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQywgMHhFOSwgMHhFQywgMHhBMywgLyogMHg5MC0weDkzICovCisJMHhERiwgMHhCMiwgMHhERSwgMHhDQywgMHhERiwgMHhCRSwgMHhGMSwgMHhFOSwgLyogMHg5NC0weDk3ICovCisJMHhGOSwgMHhCQiwgMHhDQiwgMHhBMywgMHhFQiwgMHhFMCwgMHhEQywgMHhCMCwgLyogMHg5OC0weDlCICovCisJMHhFRiwgMHhDQiwgMHhGNCwgMHhCOCwgMHhGMiwgMHhBMiwgMHhFQywgMHhEMSwgLyogMHg5Qy0weDlGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMzJbNTEyXSA9IHsKKwkweEE5LCAweEIxLCAweEE5LCAweEIyLCAweEE5LCAweEIzLCAweEE5LCAweEI0LCAvKiAweDAwLTB4MDMgKi8KKwkweEE5LCAweEI1LCAweEE5LCAweEI2LCAweEE5LCAweEI3LCAweEE5LCAweEI4LCAvKiAweDA0LTB4MDcgKi8KKwkweEE5LCAweEI5LCAweEE5LCAweEJBLCAweEE5LCAweEJCLCAweEE5LCAweEJDLCAvKiAweDA4LTB4MEIgKi8KKwkweEE5LCAweEJELCAweEE5LCAweEJFLCAweEE5LCAweEJGLCAweEE5LCAweEMwLCAvKiAweDBDLTB4MEYgKi8KKwkweEE5LCAweEMxLCAweEE5LCAweEMyLCAweEE5LCAweEMzLCAweEE5LCAweEM0LCAvKiAweDEwLTB4MTMgKi8KKwkweEE5LCAweEM1LCAweEE5LCAweEM2LCAweEE5LCAweEM3LCAweEE5LCAweEM4LCAvKiAweDE0LTB4MTcgKi8KKwkweEE5LCAweEM5LCAweEE5LCAweENBLCAweEE5LCAweENCLCAweEE5LCAweENDLCAvKiAweDE4LTB4MUIgKi8KKwkweEEyLCAweERGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweEVDLCAweEU5LCAweEVDLCAweEEzLCAweERGLCAweEIyLCAweERFLCAweENDLCAvKiAweDIwLTB4MjMgKi8KKwkweEU3LCAweEU5LCAweEQ3LCAweEJGLCAweEY2LCAweEQyLCAweEY4LCAweEEyLCAvKiAweDI0LTB4MjcgKi8KKwkweENFLCAweEZBLCAweEU0LCAweEE4LCAweEVBLCAweEM1LCAweEZCLCAweEZELCAvKiAweDI4LTB4MkIgKi8KKwkweEUyLCAweEE5LCAweEQ5LCAweENBLCAweEQxLCAweEQxLCAweEY3LCAweENGLCAvKiAweDJDLTB4MkYgKi8KKwkweEVDLCAweEVELCAweEYxLCAweEJCLCAweEVBLCAweEYzLCAweERFLCAweEU0LCAvKiAweDMwLTB4MzMgKi8KKwkweEQ5LCAweEEzLCAweEY3LCAweEU1LCAweEVFLCAweEFGLCAweEY1LCAweEU2LCAvKiAweDM0LTB4MzcgKi8KKwkweEQ2LCAweENDLCAweEQzLCAweERCLCAweEZCLCAweEJDLCAweEY5LCAweENBLCAvKiAweDM4LTB4M0IgKi8KKwkweENBLCAweEY4LCAweEQwLCAweEVBLCAweEVELCAweEMwLCAweEZBLCAweEYwLCAvKiAweDNDLTB4M0YgKi8KKwkweEYwLCAweEFFLCAweEZELCAweENDLCAweEVELCAweEJCLCAweEYyLCAweEI4LCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweEE4LCAweEIxLCAweEE4LCAweEIyLCAweEE4LCAweEIzLCAweEE4LCAweEI0LCAvKiAweDYwLTB4NjMgKi8KKwkweEE4LCAweEI1LCAweEE4LCAweEI2LCAweEE4LCAweEI3LCAweEE4LCAweEI4LCAvKiAweDY0LTB4NjcgKi8KKwkweEE4LCAweEI5LCAweEE4LCAweEJBLCAweEE4LCAweEJCLCAweEE4LCAweEJDLCAvKiAweDY4LTB4NkIgKi8KKwkweEE4LCAweEJELCAweEE4LCAweEJFLCAweEE4LCAweEJGLCAweEE4LCAweEMwLCAvKiAweDZDLTB4NkYgKi8KKwkweEE4LCAweEMxLCAweEE4LCAweEMyLCAweEE4LCAweEMzLCAweEE4LCAweEM0LCAvKiAweDcwLTB4NzMgKi8KKwkweEE4LCAweEM1LCAweEE4LCAweEM2LCAweEE4LCAweEM3LCAweEE4LCAweEM4LCAvKiAweDc0LTB4NzcgKi8KKwkweEE4LCAweEM5LCAweEE4LCAweENBLCAweEE4LCAweENCLCAweEE4LCAweENDLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEEyLCAweERFLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEVDLCAweEU5LCAweEVDLCAweEEzLCAweERGLCAweEIyLCAweERFLCAweENDLCAvKiAweDgwLTB4ODMgKi8KKwkweEU3LCAweEU5LCAweEQ3LCAweEJGLCAweEY2LCAweEQyLCAweEY4LCAweEEyLCAvKiAweDg0LTB4ODcgKi8KKwkweENFLCAweEZBLCAweEU0LCAweEE4LCAweEVBLCAweEM1LCAweEZCLCAweEZELCAvKiAweDg4LTB4OEIgKi8KKwkweEUyLCAweEE5LCAweEQ5LCAweENBLCAweEQxLCAweEQxLCAweEY3LCAweENGLCAvKiAweDhDLTB4OEYgKi8KKwkweEVDLCAweEVELCAweEYxLCAweEJCLCAweEVBLCAweEYzLCAweERFLCAweEU0LCAvKiAweDkwLTB4OTMgKi8KKwkweEQ5LCAweEEzLCAweEY3LCAweEU1LCAweEVFLCAweEFGLCAweEY1LCAweEU2LCAvKiAweDk0LTB4OTcgKi8KKwkweEQ2LCAweENDLCAweERELCAweEZBLCAweEQxLCAweEZCLCAweEQyLCAweEIzLCAvKiAweDk4LTB4OUIgKi8KKwkweEVFLCAweEVBLCAweEU5LCAweEQwLCAweEVDLCAweEQ0LCAweEYxLCAweEJDLCAvKiAweDlDLTB4OUYgKi8KKwkweEZBLCAweEEzLCAweEZELCAweENDLCAweERFLCAweEQwLCAweEVGLCAweEUxLCAvKiAweEEwLTB4QTMgKi8KKwkweERGLCAweEJFLCAweEYxLCAweEU5LCAweEY5LCAweEJCLCAweEYxLCAweEE3LCAvKiAweEE0LTB4QTcgKi8KKwkweEU5LCAweEQzLCAweEVDLCAweEEyLCAweEYwLCAweEYzLCAweEY5LCAweENBLCAvKiAweEE4LTB4QUIgKi8KKwkweENBLCAweEY4LCAweEQwLCAweEVBLCAweEVELCAweEMwLCAweEZBLCAweEYwLCAvKiAweEFDLTB4QUYgKi8KKwkweEU1LCAweEE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18zM1s1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QTcsIDB4QzksIDB4QTcsIDB4Q0EsIDB4QTcsIDB4Q0IsIDB4QTcsIDB4Q0MsIC8qIDB4ODAtMHg4MyAqLworCTB4QTcsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4QTcsIDB4QkEsIDB4QTcsIDB4QkIsIDB4QTcsIDB4REMsIDB4QTcsIDB4REQsIC8qIDB4ODgtMHg4QiAqLworCTB4QTcsIDB4REUsIDB4QTcsIDB4QjYsIDB4QTcsIDB4QjcsIDB4QTcsIDB4QjgsIC8qIDB4OEMtMHg4RiAqLworCTB4QTcsIDB4RDQsIDB4QTcsIDB4RDUsIDB4QTcsIDB4RDYsIDB4QTcsIDB4RDcsIC8qIDB4OTAtMHg5MyAqLworCTB4QTcsIDB4RDgsIDB4QTcsIDB4QTEsIDB4QTcsIDB4QTIsIDB4QTcsIDB4QTMsIC8qIDB4OTQtMHg5NyAqLworCTB4QTcsIDB4QTUsIDB4QTcsIDB4QUIsIDB4QTcsIDB4QUMsIDB4QTcsIDB4QUQsIC8qIDB4OTgtMHg5QiAqLworCTB4QTcsIDB4QUUsIDB4QTcsIDB4QUYsIDB4QTcsIDB4QjAsIDB4QTcsIDB4QjEsIC8qIDB4OUMtMHg5RiAqLworCTB4QTcsIDB4QjIsIDB4QTcsIDB4QjMsIDB4QTcsIDB4QjQsIDB4QTcsIDB4QTcsIC8qIDB4QTAtMHhBMyAqLworCTB4QTcsIDB4QTgsIDB4QTcsIDB4QTksIDB4QTcsIDB4QUEsIDB4QTcsIDB4QkQsIC8qIDB4QTQtMHhBNyAqLworCTB4QTcsIDB4QkUsIDB4QTcsIDB4RTUsIDB4QTcsIDB4RTYsIDB4QTcsIDB4RTcsIC8qIDB4QTgtMHhBQiAqLworCTB4QTcsIDB4RTgsIDB4QTcsIDB4RTEsIDB4QTcsIDB4RTIsIDB4QTcsIDB4RTMsIC8qIDB4QUMtMHhBRiAqLworCTB4QTcsIDB4QkYsIDB4QTcsIDB4QzAsIDB4QTcsIDB4QzEsIDB4QTcsIDB4QzIsIC8qIDB4QjAtMHhCMyAqLworCTB4QTcsIDB4QzMsIDB4QTcsIDB4QzQsIDB4QTcsIDB4QzUsIDB4QTcsIDB4QzYsIC8qIDB4QjQtMHhCNyAqLworCTB4QTcsIDB4QzcsIDB4QTcsIDB4QzgsIDB4QTcsIDB4Q0UsIDB4QTcsIDB4Q0YsIC8qIDB4QjgtMHhCQiAqLworCTB4QTcsIDB4RDAsIDB4QTcsIDB4RDEsIDB4QTcsIDB4RDIsIDB4QTcsIDB4RDMsIC8qIDB4QkMtMHhCRiAqLworCTB4QTcsIDB4REEsIDB4QTcsIDB4REIsIDB4QTIsIDB4RTMsIDB4QTcsIDB4RUMsIC8qIDB4QzAtMHhDMyAqLworCTB4QTcsIDB4QTYsIDB4QTcsIDB4RTAsIDB4QTcsIDB4RUYsIDB4QTIsIDB4RTEsIC8qIDB4QzQtMHhDNyAqLworCTB4QTcsIDB4QkMsIDB4QTcsIDB4RUQsIDB4QTcsIDB4QjUsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTcsIDB4QjksIC8qIDB4Q0MtMHhDRiAqLworCTB4QTcsIDB4RUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTcsIDB4RUIsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTcsIDB4REYsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4QTIsIDB4RTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTcsIDB4RTQsIC8qIDB4RDgtMHhEQiAqLworCTB4QTcsIDB4RUUsIDB4QTcsIDB4RTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzRFWzUxMl0gPSB7CisJMHhFQywgMHhFOSwgMHhFRiwgMHhDQiwgMHgwMCwgMHgwMCwgMHhGNiwgMHhEMiwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOCwgMHhCMiwgLyogMHgwNC0weDA3ICovCisJMHhFRCwgMHhEQiwgMHhERiwgMHhCMiwgMHhERiwgMHhCRSwgMHhGOSwgMHhCQiwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHhEQywgMHhGNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHhGNSwgMHhFNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHhGMywgMHhBNiwgMHhERCwgMHhFMCwgMHhFMSwgMHhBNiwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHhDRSwgMHhGOCwgMHhEQywgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHhBQSwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHhGMSwgMHhFOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRCwgMHhGQSwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHhGQywgMHhBRiwgMHhEMywgMHhBMSwgMHgwMCwgMHgwMCwgMHhGMSwgMHhBQiwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHhEMSwgMHhEMiwgMHhBQywgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHhDRSwgMHhGOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMSwgMHhGRCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHhERSwgMHhCRiwgMHhGQiwgMHhCQSwgMHhGOSwgMHhCOSwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRSwgMHhEMiwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHhFMywgMHhBQiwgMHhFQiwgMHhFMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHhDRSwgMHhGQSwgMHhDQiwgMHhGNywgMHhFNSwgMHhBNSwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQSwgMHhFMSwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHhENCwgMHhDQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHhFMSwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQywgMHhFMywgMHhERiwgMHhBRCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQiwgMHhFQiwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENSwgMHhBRiwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENiwgMHhGNSwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHhFNSwgMHhGOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERSwgMHhDMCwgLyogMHg4OC0weDhCICovCisJMHhFQywgMHhBMywgMHgwMCwgMHgwMCwgMHhFOSwgMHhDRCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHhFQSwgMHhBNywgMHhFOSwgMHhGNiwgMHhGQiwgMHhCQiwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHhFNywgMHhFOSwgMHhFRiwgMHhDQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHhEMCwgMHhFNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERSwgMHhDMSwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhBQywgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHhEOCwgMHhDQywgMHhGOSwgMHhGMSwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHhDRSwgMHhERiwgMHhGQSwgMHhBNCwgMHhFNiwgMHhCMiwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHhGQSwgMHhGQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQSwgMHhCRCwgLyogMHhBOC0weEFCICovCisJMHhDQywgMHhDOCwgMHhFRiwgMHhDRCwgMHhENSwgMHhENSwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMywgMHhBMiwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQywgMHhEMSwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHhFNCwgMHhBNywgMHhFQywgMHhEMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHhGNiwgMHhCMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRSwgMHhGQiwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMCwgMHhEMSwgMHhDQiwgMHhCRiwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHhFRCwgMHhBNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHhFRCwgMHhBOCwgMHhERSwgMHhDMiwgMHhGNiwgMHhFMiwgMHhFRCwgMHhEQywgLyogMHhENC0weEQ3ICovCisJMHhEQywgMHhGNSwgMHhFMCwgMHhCOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHhENCwgMHhDRSwgMHgwMCwgMHgwMCwgMHhGNCwgMHhCNSwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMywgMHhEQiwgLyogMHhFMC0weEUzICovCisJMHhENiwgMHhCNSwgMHhFQywgMHhBNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHhFNCwgMHhFNiwgMHgwMCwgMHgwMCwgMHhGMSwgMHhFQSwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQiwgMHhFQywgMHhDQiwgMHhDMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQywgMHhGMiwgLyogMHhGOC0weEZCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNEZbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweEQwLCAweEVBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweEY5LCAweEYyLCAweEVDLCAweEE1LCAweEQwLCAweERGLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweEU3LCAweEVBLCAweEQwLCAweEVCLCAweERDLCAweEQxLCAvKiAweDBDLTB4MEYgKi8KKwkweERCLCAweEU5LCAweEZELCAweENDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERCLCAweEQ3LCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweERBLCAweEUxLCAweDAwLCAweDAwLCAweEQ2LCAweEI2LCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweEUzLCAweERGLCAweDAwLCAweDAwLCAweERFLCAweEMzLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweERFLCAweEM0LCAweENBLCAweEExLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweEVDLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQzLCAweEEzLCAweEVFLCAweEI3LCAvKiAweDQ0LTB4NDcgKi8KKwkweEY4LCAweENGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweEVBLCAweEM4LCAweEVFLCAweEI4LCAweEYxLCAweEFDLCAvKiAweDRDLTB4NEYgKi8KKwkweEYxLCAweEE1LCAweEU5LCAweENFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweEY5LCAweEJDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweEY5LCAweEVDLCAweEVBLCAweERELCAweEQ2LCAvKiAweDU4LTB4NUIgKi8KKwkweEVELCAweEMyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweEY4LCAweEE1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweEJBLCAvKiAweDZDLTB4NkYgKi8KKwkweERCLCAweEQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENBLCAweEEyLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQxLCAweENELCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweEVELCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVDLCAweEVCLCAweERFLCAweEM1LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweEUzLCAweEUwLCAweDAwLCAweDAwLCAweENBLCAweEM5LCAvKiAweDgwLTB4ODMgKi8KKwkweEYyLCAweEU5LCAweDAwLCAweDAwLCAweEQ1LCAweENFLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweEY2LCAweEI2LCAweDAwLCAweDAwLCAweENFLCAweEMyLCAweEQ2LCAweEM3LCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweEUzLCAweEI0LCAweDAwLCAweDAwLCAweEYxLCAweEFELCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweEVBLCAweEUyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ3LCAweEMyLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweEYzLCAweEE3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENELCAweEVBLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweEVCLCAweEVFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ5LCAweEIyLCAweEZELCAweEE1LCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweEY2LCAweEQ1LCAweEQ1LCAweEUyLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY4LCAweEI1LCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENDLCAweEY1LCAweEY1LCAweEI1LCAvKiAweEMwLTB4QzMgKi8KKwkweEU0LCAweEFELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweEU3LCAweEVCLCAweEYxLCAweEQ1LCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYwLCAweEJCLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweEI1LCAweDAwLCAweDAwLCAweENDLCAweEM5LCAvKiAweEQwLTB4RDMgKi8KKwkweEZBLCAweEQ1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEQ0LCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ3LCAweEQ2LCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweERDLCAweEMxLCAweDAwLCAweDAwLCAweERFLCAweEM2LCAvKiAweERDLTB4REYgKi8KKwkweEZBLCAweEVGLCAweEUzLCAweEUxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEYzLCAweERDLCAweEY2LCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweENFLCAweEZDLCAweDAwLCAweDAwLCAweERCLCAweEM0LCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweEY4LCAweEYxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweERDLCAweEU0LCAweDAwLCAweDAwLCAweEU1LCAweEVGLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181MFs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REMsIDB4QjEsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDUsIDB4RDYsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4RjMsIDB4REEsIDB4MDAsIDB4MDAsIDB4Q0IsIDB4QzEsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4REIsIDB4QzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4RDksIDB4RkEsIDB4RDMsIDB4RUUsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkEsIDB4QjgsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4RkQsIDB4QTYsIDB4RUIsIDB4RUYsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4RjQsIDB4QTYsIDB4MDAsIDB4MDAsIDB4Q0MsIDB4Q0EsIDB4RjMsIDB4QTgsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4RjMsIDB4REIsIDB4MDAsIDB4MDAsIDB4REIsIDB4QTcsIC8qIDB4MjAtMHgyMyAqLworCTB4RjYsIDB4QjcsIDB4MDAsIDB4MDAsIDB4Q0YsIDB4RTYsIDB4RjAsIDB4RjIsIC8qIDB4MjQtMHgyNyAqLworCTB4Q0IsIDB4REEsIDB4MDAsIDB4MDAsIDB4RTcsIDB4RDIsIDB4RDcsIDB4QzMsIC8qIDB4MjgtMHgyQiAqLworCTB4RjYsIDB4RjAsIDB4RTgsIDB4REUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4QTYsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4RTcsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4QTMsIC8qIDB4NDQtMHg0NyAqLworCTB4Q0MsIDB4QTcsIDB4RUEsIDB4QzksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjgsIDB4QjYsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4RkEsIDB4QTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjEsIDB4QUUsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4RUYsIDB4Q0UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4Q0IsIDB4RUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4RjYsIDB4QjAsIDB4RUYsIDB4Q0YsIDB4RTksIDB4Q0YsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4RjcsIDB4REUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4Q0UsIDB4RDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4REMsIDB4RjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4REIsIDB4QTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4Q0IsIDB4RjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4REYsIDB4QTEsIDB4REQsIDB4RTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4RjUsIDB4Q0EsIDB4RTksIDB4QjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4RUMsIDB4RUUsIDB4RUUsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4RjMsIDB4RjAsIDB4MDAsIDB4MDAsIDB4REYsIDB4QkYsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0MsIDB4Q0IsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4RDAsIDB4QzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4RjQsIDB4RDIsIDB4RTAsIDB4QkEsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REYsIDB4QzAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4Q0UsIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4REMsIDB4RDIsIDB4RkQsIDB4RUEsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDYsIDB4RjYsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4Q0EsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4RTksIDB4MDAsIDB4MDAsIDB4RTMsIDB4QUMsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4RjMsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4Q0EsIDB4QTQsIDB4MDAsIDB4MDAsIDB4REIsIDB4RjgsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REUsIDB4QzcsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzUxWzUxMl0gPSB7CisJMHhFQiwgMHhGMCwgMHhGMSwgMHhENiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHhFNSwgMHhFMiwgMHgwMCwgMHgwMCwgMHhDQywgMHhDQywgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHhDQiwgMHhGQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHhFMywgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERiwgMHhDMSwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHhENiwgMHhFRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhEMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHhCOSwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENSwgMHhFMywgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMSwgMHhEMywgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHhFNSwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHhFOCwgMHhCNCwgMHhFQiwgMHhDMywgMHgwMCwgMHgwMCwgMHhFQSwgMHhBQSwgLyogMHg0MC0weDQzICovCisJMHhGQSwgMHhGQywgMHhGNSwgMHhGNiwgMHhGMCwgMHhCQywgMHhGRCwgMHhENCwgLyogMHg0NC0weDQ3ICovCisJMHhFMCwgMHhCQiwgMHhDRSwgMHhDMywgMHgwMCwgMHgwMCwgMHhEMCwgMHhCQSwgLyogMHg0OC0weDRCICovCisJMHhGNywgMHhCQSwgMHhEOCwgMHhGMywgMHhGNywgMHhDRCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhBRSwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHhENCwgMHhERiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMCwgMHhFNywgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHhFQywgMHhGRCwgMHgwMCwgMHgwMCwgMHhEMiwgMHhBRSwgLyogMHg2NC0weDY3ICovCisJMHhFRSwgMHhFRiwgMHhENSwgMHhENywgMHhFQSwgMHhFNCwgMHhGOCwgMHhBMiwgLyogMHg2OC0weDZCICovCisJMHhDRCwgMHhFQiwgMHhENywgMHhCRiwgMHhGQiwgMHhCMSwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHhDRCwgMHhFQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHhEQywgMHhCMiwgMHhEMCwgMHhFQywgMHhDRSwgMHhGRCwgLyogMHg3NC0weDc3ICovCisJMHhFRSwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHhDQywgMHhDMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHhEMCwgMHhFRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhGNywgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMywgMHhGQywgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHhFRSwgMHhBMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOSwgMHhCMywgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHhEOCwgMHhGNCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhCNywgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHhDRSwgMHhBRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHhEOSwgMHhBMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOCwgMHhGMSwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHhENCwgMHhDRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhBNywgMHhENSwgMHhEMiwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHhENiwgMHhBOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHhGNCwgMHhBMiwgMHgwMCwgMHgwMCwgMHhGMSwgMHhENywgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHhENSwgMHhEOCwgMHgwMCwgMHgwMCwgMHhGMCwgMHhCRCwgLyogMHhDOC0weENCICovCisJMHhENywgMHhEMCwgMHhENCwgMHhEMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHhENywgMHhDRiwgMHhFQiwgMHhFQSwgMHhGRCwgMHhFQiwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHhEQiwgMHhFRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHhGQywgMHhDNSwgMHhDQiwgMHhDMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhENSwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHhGNCwgMHhDOCwgMHhFOCwgMHhFQSwgMHhGNSwgMHhGMywgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHhGOSwgMHhERSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNTJbNTEyXSA9IHsKKwkweEQzLCAweEVGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVDLCAweEQzLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERELCAweEMyLCAweEVGLCAweEI3LCAvKiAweDA0LTB4MDcgKi8KKwkweEU3LCAweEQ0LCAweDAwLCAweDAwLCAweENBLCAweENBLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ5LCAweEZCLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweEZBLCAweEZELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ2LCAweEFBLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweEY0LCAweEY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweEY3LCAweEY3LCAweERDLCAweEFDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweEQ3LCAweEQ3LCAweERGLCAweEEyLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENFLCAweEJFLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweEQzLCAweEYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYwLCAweEE0LCAweEUxLCAweEVDLCAvKiAweDM0LTB4MzcgKi8KKwkweENGLCAweEU3LCAweEYzLCAweENCLCAweEVELCAweEE5LCAweENBLCAweEJFLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY0LCAweEVGLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY2LCAweENFLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERFLCAweEZCLCAweEQwLCAweEJCLCAvKiAweDQ4LTB4NEIgKi8KKwkweEQ1LCAweEI3LCAweEVFLCAweEYxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweEY0LCAweEE4LCAweDAwLCAweDAwLCAweERDLCAweEY4LCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENCLCAweEE3LCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweERBLCAweENFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweEU2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweEVELCAweEE1LCAweEVFLCAweEYyLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERDLCAweEY5LCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY5LCAweERDLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweEYzLCAweERDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweEY4LCAweEYyLCAweDAwLCAweDAwLCAweEY0LCAweEY5LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZDLCAweEYxLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQwLCAweEJDLCAvKiAweDg0LTB4ODcgKi8KKwkweERCLCAweEY5LCAweEQ3LCAweEIxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweENCLCAweEZDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweEYwLCAweEE1LCAweENCLCAweEZELCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ1LCAweEY0LCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENELCAweEVELCAvKiAweDlDLTB4OUYgKi8KKwkweENBLCAweEE1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ2LCAweEFCLCAvKiAweEEwLTB4QTMgKi8KKwkweEQwLCAweEMyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweEYwLCAweEJFLCAweEQyLCAweEJELCAweENDLCAweEE0LCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZBLCAweEI2LCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweENDLCAweENELCAweDAwLCAweDAwLCAweERBLCAweEZBLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweEY2LCAweENGLCAweDAwLCAweDAwLCAweEU5LCAweEI4LCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweEQ4LCAweEY1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweENDLCAweENFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ3LCAweENELCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweEQ0LCAweEQxLCAweEU5LCAweEVELCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweENBLCAweEVCLCAweEQ5LCAweEUyLCAweDAwLCAweDAwLCAweEZELCAweEIyLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweEUzLCAweEFELCAweEQ2LCAweENDLCAweEQ5LCAweEI0LCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEE3LCAweEVFLCAweEQzLCAvKiAweEUwLTB4RTMgKi8KKwkweEQwLCAweEMzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEIzLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweEQ1LCAweEU0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweENGLCAweEU4LCAweDAwLCAweDAwLCAweEVELCAweEMzLCAweEQwLCAweEIyLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENFLCAweEZFLCAweERBLCAweEE4LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181M1s1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4RjgsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4RkQsIDB4RDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4RjgsIDB4RDEsIDB4MDAsIDB4MDAsIDB4RjgsIDB4RDIsIC8qIDB4MEMtMHgwRiAqLworCTB4REMsIDB4RDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4REQsIDB4RTIsIDB4RkIsIDB4RjksIDB4REQsIDB4QzEsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4QjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4RUQsIDB4REQsIDB4Q0UsIDB4QzQsIDB4MDAsIDB4MDAsIDB4Q0IsIDB4QTEsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REQsIDB4RTMsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkMsIDB4REQsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4RjksIDB4QUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDIsIDB4RkIsIC8qIDB4M0MtMHgzRiAqLworCTB4Q0YsIDB4QTEsIDB4RTQsIDB4QTgsIDB4MDAsIDB4MDAsIDB4RjQsIDB4QjYsIC8qIDB4NDAtMHg0MyAqLworCTB4RUMsIDB4RkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4QUUsIC8qIDB4NDQtMHg0NyAqLworCTB4RTcsIDB4RUQsIDB4RkQsIDB4QzEsIDB4REEsIDB4RTIsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4RDgsIDB4QjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4REQsIDB4RTQsIDB4RjAsIDB4RUYsIDB4RjYsIDB4RjEsIC8qIDB4NTAtMHg1MyAqLworCTB4RkEsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDEsIDB4RjUsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REEsIDB4Q0YsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4REMsIDB4RDQsIDB4MDAsIDB4MDAsIDB4REMsIDB4QTYsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4RUYsIDB4QkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4Q0YsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4RTAsIDB4RDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDksIDB4RDYsIC8qIDB4NkMtMHg2RiAqLworCTB4RUMsIDB4RDQsIDB4RUEsIDB4Q0IsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4Q0EsIDB4QkYsIDB4RDUsIDB4QjAsIDB4MDAsIDB4MDAsIDB4Q0YsIDB4RTksIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4RjEsIDB4RUQsIDB4MDAsIDB4MDAsIDB4Q0MsIDB4Q0YsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4RTQsIDB4RjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4RUQsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4RDcsIDB4RDgsIDB4MDAsIDB4MDAsIDB4RkQsIDB4QTcsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4QUIsIC8qIDB4OUMtMHg5RiAqLworCTB4RjYsIDB4QjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4Q0YsIDB4RjAsIDB4RjksIDB4QkQsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4RTYsIDB4RjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0IsIDB4REIsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjMsIDB4RDEsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4RTksIDB4RDEsIDB4RjMsIDB4QTksIDB4RDAsIDB4RTAsIDB4RTksIDB4RDIsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4REEsIDB4RTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4RTIsIDB4RDIsIDB4MDAsIDB4MDAsIDB4RjYsIDB4QTIsIDB4RTEsIDB4RjQsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REEsIDB4RTQsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4RTcsIDB4RDUsIDB4RjUsIDB4QkYsIDB4Q0YsIDB4QTIsIC8qIDB4RTAtMHhFMyAqLworCTB4Q0QsIDB4QUYsIDB4Q0YsIDB4QTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4Q0QsIDB4QjAsIDB4RjEsIDB4RkUsIDB4RDAsIDB4QTMsIC8qIDB4RTgtMHhFQiAqLworCTB4RTEsIDB4QUYsIDB4RjgsIDB4QTMsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4QTYsIC8qIDB4RUMtMHhFRiAqLworCTB4RjcsIDB4QkIsIDB4RjIsIDB4RUEsIDB4REUsIDB4QzgsIDB4RTksIDB4RDMsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4REUsIDB4QzksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzU0WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhERSwgLyogMHgwMC0weDAzICovCisJMHhDQSwgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHhGOSwgMHhFQSwgMHhEMSwgMHhDRSwgMHhFRSwgMHhENCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHhENCwgMHhEMiwgMHhEOSwgMHhBMywgMHhGRCwgMHhBOCwgMHhENywgMHhEOSwgLyogMHgwQy0weDBGICovCisJMHhGNywgMHhDRSwgMHhGQSwgMHhCRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRiwgMHhENiwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHhENywgMHhGMCwgMHgwMCwgMHgwMCwgMHhFQiwgMHhFMSwgLyogMHgxQy0weDFGICovCisJMHhGOCwgMHhDNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQywgMHhGQSwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHhERCwgMHhDMywgMHgwMCwgMHgwMCwgMHhGOSwgMHhERiwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHhFRiwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHhGRCwgMHhFNSwgMHhGNiwgMHhBMywgMHgwMCwgMHgwMCwgMHhEOSwgMHhGQywgLyogMHgzOC0weDNCICovCisJMHhGRCwgMHhBOSwgMHgwMCwgMHgwMCwgMHhFNywgMHhFRSwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENSwgMHhFNSwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHhFRiwgMHhEMCwgMHgwMCwgMHgwMCwgMHhDRCwgMHhCMSwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHhGNywgMHhBMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHhGMSwgMHhCMiwgMHgwMCwgMHgwMCwgMHhGMSwgMHhCMSwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHhDRCwgMHhCMiwgMHgwMCwgMHgwMCwgMHhEQSwgMHhBQiwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHhDQSwgMHhBNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHhFMiwgLyogMHg3OC0weDdCICovCisJMHhGQiwgMHhCQywgMHhEOSwgMHhBNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHhFRSwgMHhCQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOCwgMHhEMywgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHhGQiwgMHhGQSwgMHgwMCwgMHgwMCwgMHhDRiwgMHhBNCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHhEQywgMHhGQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHhGNiwgMHhFMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHhFRCwgMHhBQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMiwgMHhBMSwgLyogMHhBOC0weEFCICovCisJMHhDRSwgMHhFMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQSwgMHhBNiwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHhGOSwgMHhFMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHhFQywgMHhENiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHhFNCwgMHhFRSwgMHhGOSwgMHhBMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHhGQiwgMHhFRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHhGOSwgMHhFQiwgMHhFRSwgMHhBMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHhFQSwgMHhBQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHhDQSwgMHhBOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHhGNCwgMHhGQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHhDRCwgMHhENiwgMHhGQywgMHhGNiwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNCwgMHhDOSwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOCwgMHhENCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNTVbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweEY4LCAweEE2LCAweDAwLCAweDAwLCAweERFLCAweENBLCAweEYyLCAweEM2LCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ3LCAweERBLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweEQzLCAweEQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweEQ4LCAweEM1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweEU2LCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweEYzLCAweERELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweERBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY2LCAweEU0LCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweEY2LCAweEYyLCAweDAwLCAweDAwLCAweERGLCAweEMyLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ5LCAweEZELCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENDLCAweEY2LCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQzLCAweEJBLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweEFGLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY5LCAweEUxLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweEYwLCAweEE2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweENCLCAweEQzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweEUwLCAweEJDLCAweDAwLCAweDAwLCAweEY0LCAweENBLCAweEQ0LCAweEZBLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweEZELCAweEFBLCAweEY5LCAweEUyLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweEY0LCAweEI3LCAweEZELCAweEMyLCAweEZDLCAweEIwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweEZELCAweEVDLCAweENBLCAweEUyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEJELCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweEVBLCAweEU3LCAweERGLCAweEMzLCAweEQxLCAweEQyLCAvKiAweEE4LTB4QUIgKi8KKwkweENFLCAweEUyLCAweDAwLCAweDAwLCAweEQzLCAweEE0LCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweEZELCAweEFCLCAweDAwLCAweDAwLCAweERGLCAweEUwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweEYyLCAweEM3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweEYwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweEQwLCAweEVFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYzLCAweEFBLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERFLCAweENCLCAvKiAweEUwLTB4RTMgKi8KKwkweEY2LCAweEI4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweEY1LCAweEYxLCAweEIzLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181Nls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjcsIDB4QTMsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4Q0EsIDB4QTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4Q0YsIDB4QTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REYsIDB4QzQsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4QjAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjAsIDB4QkYsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4RjYsIDB4QTQsIDB4MDAsIDB4MDAsIDB4RTMsIDB4QjYsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkEsIDB4QzYsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4RDAsIDB4RUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RUQsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4REQsIDB4QzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkMsIDB4RjcsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4RTYsIDB4QkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4REUsIDB4QUQsIDB4MDAsIDB4MDAsIDB4RkEsIDB4QkYsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4RTUsIDB4RjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4RUQsIDB4QzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDIsIDB4QTUsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4RkQsIDB4RUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4RjUsIDB4QjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4RjYsIDB4REUsIDB4Q0MsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkMsIDB4REUsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4RUMsIDB4RDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4Q0QsIDB4REQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4RDYsIDB4QjcsIDB4Q0QsIDB4QjMsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzU3WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOCwgMHhENSwgLyogMHgwMC0weDAzICovCisJMHhFNSwgMHhEOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHhDRiwgMHhFQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRiwgMHhEMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHhFQSwgMHhDQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHhBRSwgMHhFQSwgMHhBRCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMywgMHhGMSwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHhEMywgMHhBNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNywgMHhDRiwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHhFRSwgMHhBNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHhEMCwgMHhBNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHhGMiwgMHhBMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMCwgMHhGMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHhGMiwgMHhBMywgMHgwMCwgMHgwMCwgMHhGNywgMHhGOCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMCwgMHhCMywgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQiwgMHhBOSwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHhEMywgMHhCQiwgMHhDQSwgMHhFQywgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHhGMSwgMHhBNiwgMHhDQiwgMHhENSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHhGNywgMHhFNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHhDRCwgMHhERSwgMHgwMCwgMHgwMCwgMHhGNywgMHhBNCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOCwgMHhDMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMywgMHhERCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHhDQywgMHhEMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHhDRiwgMHhBNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHhGNiwgMHhGMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhGNywgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHhEMywgMHhEQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQSwgMHhGRSwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQSwgMHhBNywgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHhFQiwgMHhEOSwgMHgwMCwgMHgwMCwgMHhDRiwgMHhBNywgMHhFQSwgMHhBRiwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhFRiwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhCOSwgLyogMHhDNC0weEM3ICovCisJMHhGMSwgMHhEOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOCwgMHhEOCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhGMiwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhCNCwgLyogMHhEQy0weERGICovCisJMHhEQywgMHhGQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHhGMywgMHhGMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHhFMywgMHhEMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMiwgMHhGQiwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHhEQiwgMHhDNiwgMHhEMCwgMHhGMSwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHhEMCwgMHhGMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNThbNTEyXSA9IHsKKwkweENGLCAweERDLCAweDAwLCAweDAwLCAweEQzLCAweEQxLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweENDLCAweEIxLCAweEY3LCAweEQ4LCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweENCLCAweEE4LCAweEVCLCAweEJDLCAweEU0LCAweEJFLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY0LCAweERDLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweERDLCAweEMyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweEYwLCAweEE3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweEMwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENBLCAweEVELCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweEVCLCAvKiAweDJDLTB4MkYgKi8KKwkweEU1LCAweEU4LCAweERDLCAweEMzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweEVELCAweERFLCAweEQzLCAweEYyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENDLCAweEY3LCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENFLCAweEQ0LCAweEU3LCAweEFCLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENCLCAweEMzLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweEIxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweEY3LCAweEIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQzLCAweEYzLCAvKiAweDU0LTB4NTcgKi8KKwkweEQzLCAweEQyLCAweDAwLCAweDAwLCAweEY1LCAweEMwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERGLCAweERELCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweEVFLCAweEYzLCAweEU3LCAweEYxLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweEZELCAweEI0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweEYyLCAweEM4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweEYzLCAweEQyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweEVFLCAweEY0LCAweDAwLCAweDAwLCAweEUyLCAweEQzLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENDLCAweEQxLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweERGLCAweEVBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweEJBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ5LCAweEQ3LCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweEY1LCAweENELCAweDAwLCAweDAwLCAweEYxLCAweEYyLCAweEZBLCAweEM3LCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweEQ5LCAweEY4LCAweEQ0LCAweEMyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY2LCAweEU1LCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERELCAweEM1LCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweEYyLCAweEVELCAweERGLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENBLCAweENCLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweERCLCAweEZBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweEI1LCAweDAwLCAweDAwLCAweEQzLCAweEE2LCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEI1LCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweEY5LCAweEM5LCAweDAwLCAweDAwLCAweEU0LCAweEUyLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweEZCLCAweEJELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweEQ3LCAweEE0LCAweENFLCAweEM1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENFLCAweEQ1LCAweEQ2LCAweEU2LCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweEU1LCAweEJELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERFLCAweENELCAvKiAweEU4LTB4RUIgKi8KKwkweEVDLCAweEYzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweEUwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweEVDLCAweEVDLCAweEZCLCAweEJFLCAweERGLCAweEVCLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweEY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181OVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjksIDB4QkUsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4RDAsIDB4RjMsIDB4RTAsIDB4QUEsIDB4RTgsIDB4RTIsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4RDQsIDB4RDIsIDB4RkQsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4RTUsIDB4QTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDksIDB4RDMsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDMsIDB4REUsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4RjQsIDB4QjgsIDB4RjcsIDB4QkMsIDB4REMsIDB4RkQsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4RUMsIDB4RTQsIDB4RTcsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4RjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUMsIDB4QTgsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkEsIDB4RjEsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4RTUsIDB4RjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDAsIDB4RjQsIC8qIDB4NDQtMHg0NyAqLworCTB4RDIsIDB4QUYsIDB4REMsIDB4RTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDAsIDB4QTUsIDB4RjEsIDB4QjQsIC8qIDB4NEMtMHg0RiAqLworCTB4RkMsIDB4QjEsIDB4Q0MsIDB4RjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4REQsIDB4QzYsIDB4RkEsIDB4RDEsIDB4MDAsIDB4MDAsIDB4RjcsIDB4REYsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkEsIDB4QTgsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4RUUsIDB4RjUsIDB4MDAsIDB4MDAsIDB4REUsIDB4Q0UsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4RjMsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjcsIDB4QUMsIDB4RUIsIDB4QzQsIC8qIDB4NjgtMHg2QiAqLworCTB4RUQsIDB4RTEsIDB4RTAsIDB4QUIsIDB4REQsIDB4QzcsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDIsIDB4QjMsIC8qIDB4NzAtMHg3MyAqLworCTB4RDIsIDB4QkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4Q0EsIDB4Q0MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4RkIsIDB4QkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4RkQsIDB4REQsIDB4RTUsIC8qIDB4ODAtMHg4MyAqLworCTB4RDgsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUMsIDB4RjQsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDAsIDB4RjUsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4RUQsIDB4RDAsIDB4RDIsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4RDksIDB4RDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4RjYsIDB4RTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4REIsIDB4QUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4RjcsIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4RDgsIDB4RDksIDB4MDAsIDB4MDAsIDB4RjQsIDB4QTMsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjQsIDB4REQsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUYsIDB4RDEsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDksIDB4QjUsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4RUQsIDB4QUIsIDB4MDAsIDB4MDAsIDB4RTMsIDB4QjcsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4RUUsIDB4QkIsIDB4Q0QsIDB4QjQsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RjMsIC8qIDB4RDAtMHhEMyAqLworCTB4RUEsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4RUMsIDB4RjUsIDB4RTgsIDB4RUUsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4Q0IsIDB4QTksIDB4RjEsIDB4QUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4Q0QsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4RUMsIDB4QTksIDB4MDAsIDB4MDAsIDB4RjIsIDB4RUIsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4RkQsIDB4RUYsIDB4MDAsIDB4MDAsIDB4RjksIDB4RjMsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4RTYsIDB4QzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUMsIDB4RDgsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4QUMsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzVBWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHhFQSwgMHhDRSwgMHgwMCwgMHgwMCwgMHhFOCwgMHhERiwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHhERSwgMHhDRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHhEMiwgMHhBNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHhGNCwgLyogMHgxOC0weDFCICovCisJMHhEMSwgMHhENiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhDMiwgLyogMHgxQy0weDFGICovCisJMHhFMywgMHhFMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHhEOCwgMHhCNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNiwgMHhBNSwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHhGMywgMHhERSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHhENywgMHhBNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNywgMHhFOCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHhFOCwgMHhDNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQiwgMHhFNiwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERCwgMHhFNiwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQywgMHhGRSwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOCwgMHhEQSwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQSwgMHhBQywgMHhFQSwgMHhCMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHhFMywgMHhCOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHhDQSwgMHhBQSwgMHhFMSwgMHhGOSwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHhFQSwgMHhCMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHhGMiwgMHhFQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHhGQSwgMHhFRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHhFRSwgMHhENSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOSwgMHhGNCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHhEMiwgMHhFQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNUJbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweEZCLCAweEZCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweEZELCAweEYwLCAweDAwLCAweDAwLCAweEUwLCAweEJELCAvKiAweDA4LTB4MEIgKi8KKwkweENFLCAweEUzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY4LCAweEM2LCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERFLCAweEFFLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweERGLCAweEM1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweEJFLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweEVELCAweEFELCAweEZBLCAweEVBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweENELCAweEVFLCAweEVELCAweEE2LCAweDAwLCAweDAwLCAweEVELCAweEFFLCAvKiAweDU0LTB4NTcgKi8KKwkweEYwLCAweEVELCAweDAwLCAweDAwLCAweERELCAweEExLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweEVELCAweEFGLCAweEZDLCAweEY4LCAweDAwLCAweDAwLCAweEQ4LCAweEVCLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENDLCAweEY5LCAvKiAweDYwLTB4NjMgKi8KKwkweENELCAweEI1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweEZBLCAweEE5LCAweDAwLCAweDAwLCAweEUxLCAweERELCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweEUyLCAweEQ1LCAweEVELCAweENGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweERELCAweEEyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweEY5LCAweENBLCAweDAwLCAweDAwLCAweEVBLCAweEU4LCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweEU1LCAweEVELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweEQzLCAweEVCLCAweDAwLCAweDAwLCAweEU5LCAweEQ0LCAvKiAweDg0LTB4ODcgKi8KKwkweEUxLCAweEZBLCAweEU0LCAweENDLCAweDAwLCAweDAwLCAweEUxLCAweEU0LCAvKiAweDg4LTB4OEIgKi8KKwkweEU4LCAweEM3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENFLCAweERCLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERDLCAweEQ1LCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweEY3LCAweEI1LCAweEZDLCAweEYzLCAweEYwLCAweEYzLCAvKiAweDk0LTB4OTcgKi8KKwkweENFLCAweEFGLCAweEYxLCAweEI1LCAweEVGLCAweEQyLCAweEU4LCAweEM4LCAvKiAweDk4LTB4OUIgKi8KKwkweEVCLCAweEYxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENCLCAweEQ0LCAweEUwLCAweEJFLCAvKiAweEEwLTB4QTMgKi8KKwkweEUzLCAweEY4LCAweEVBLCAweEU5LCAweEZDLCAweEIyLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweEUwLCAweEY0LCAweDAwLCAweDAwLCAweENGLCAweEUwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweEVFLCAweEE1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZBLCAweEFBLCAvKiAweEIwLTB4QjMgKi8KKwkweEU2LCAweEMzLCAweEUxLCAweEIyLCAweENBLCAweEFCLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweEUzLCAweEU0LCAweEU5LCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweEQ2LCAvKiAweEJDLTB4QkYgKi8KKwkweEYzLCAweEYyLCAweDAwLCAweDAwLCAweEVFLCAweEQ2LCAweEVBLCAweEIyLCAvKiAweEMwLTB4QzMgKi8KKwkweEQwLCAweEY2LCAweEVDLCAweEQ5LCAweERBLCAweENCLCAweENGLCAweEE4LCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweERELCAweEEzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweEQ4LCAweERCLCAweDAwLCAweDAwLCAweEY5LCAweENFLCAweEU5LCAweEQ1LCAvKiAweEQwLTB4RDMgKi8KKwkweEUzLCAweEQxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQyLCAweEJDLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ4LCAweEFDLCAweEYzLCAweENDLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweENELCAweEZCLCAweEY2LCAweEQ2LCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweEU3LCAweEY1LCAweEU4LCAweEVGLCAweEUzLCAweEY5LCAweEQyLCAweEJCLCAvKiAweEU0LTB4RTcgKi8KKwkweEYzLCAweEYzLCAweEUzLCAweEZCLCAweDAwLCAweDAwLCAweERFLCAweEQwLCAvKiAweEU4LTB4RUIgKi8KKwkweENFLCAweEIwLCAweDAwLCAweDAwLCAweEQ2LCAweEY3LCAweEYxLCAweEQ5LCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweEY1LCAweEMxLCAweERDLCAweEM0LCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweEY1LCAweEJCLCAweDAwLCAweDAwLCAweERFLCAweEQxLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181Q1s1MTJdID0geworCTB4MDAsIDB4MDAsIDB4REMsIDB4RTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4REUsIDB4RDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4RTIsIC8qIDB4MDQtMHgwNyAqLworCTB4RUUsIDB4RjYsIDB4RUEsIDB4Q0YsIDB4RjAsIDB4RUUsIDB4RTMsIDB4RkMsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4RDMsIDB4REYsIDB4RDMsIDB4RjQsIDB4RTEsIDB4QjMsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4RTEsIDB4QjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjQsIDB4RDMsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4REYsIDB4QzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4RTksIDB4RDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4REIsIDB4QUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4RjYsIDB4QTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4RTMsIDB4QjksIDB4RUIsIDB4QzUsIDB4RjQsIDB4QTksIDB4Q0QsIDB4QjYsIC8qIDB4MzgtMHgzQiAqLworCTB4RDIsIDB4RjksIDB4MDAsIDB4MDAsIDB4REEsIDB4QUQsIDB4RDIsIDB4RTMsIC8qIDB4M0MtMHgzRiAqLworCTB4Q0YsIDB4RDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4Q0IsIDB4REMsIDB4Q0MsIDB4RkEsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4Q0YsIDB4REQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4QTksIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4QkIsIDB4RTMsIDB4QkEsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4REEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4RjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REMsIDB4QjMsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4RDMsIDB4RjUsIDB4MDAsIDB4MDAsIDB4RDcsIDB4QTYsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4RjYsIDB4QjUsIDB4RDcsIDB4REIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4RTEsIDB4RDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDQsIDB4RUEsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4REYsIDB4QTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4RkQsIDB4REYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4RDAsIDB4RjcsIDB4RUQsIDB4RDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4Q0IsIDB4QUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4REIsIDB4MDAsIDB4MDAsIDB4RTEsIDB4RkIsIC8qIDB4QTgtMHhBQiAqLworCTB4Q0IsIDB4QTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4RDMsIDB4RTAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4QkYsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4RkIsIDB4QzAsIDB4MDAsIDB4MDAsIDB4REEsIDB4QkUsIC8qIDB4QjQtMHhCNyAqLworCTB4RTQsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4RDYsIDB4QjksIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUYsIDB4QzAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4RTEsIDB4RkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4RjYsIDB4QjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4REYsIDB4QzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4RTQsIDB4QjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REMsIDB4RTcsIC8qIDB4RUMtMHhFRiAqLworCTB4REMsIDB4RTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4RkEsIDB4RDYsIDB4MDAsIDB4MDAsIDB4RDMsIDB4RjYsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjEsIDB4REEsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4RkEsIDB4RjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzVEWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHhGRCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHhENSwgMHhDRiwgMHhEMCwgMHhGOCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHhDRCwgMHhERiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHhGNSwgMHhDQiwgMHgwMCwgMHgwMCwgMHhFNCwgMHhGMCwgMHhDQiwgMHhBQiwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHhENywgMHhDNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHhGRSwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHhERCwgMHhEQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQSwgMHhBRSwgLyogMHg0OC0weDRCICovCisJMHhDQSwgMHhFRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHhENSwgMHhCOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHhBMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHhFOCwgMHhFMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMywgMHhBQiwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRiwgMHhBOSwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMywgMHhGNywgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHhENCwgMHhGMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHhDRSwgMHhFNCwgMHgwMCwgMHgwMCwgMHhFOCwgMHhGMiwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhGNSwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHhFNywgMHhBRSwgMHgwMCwgMHgwMCwgMHhENiwgMHhCQSwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHhERiwgMHhFQywgMHhFNCwgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHhFOCwgMHhFNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOCwgMHhCNSwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhEQywgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHhGNCwgMHhCOSwgMHhGMSwgMHhCNiwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHhERSwgMHhFMSwgMHhCNSwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHhDRCwgMHhFRiwgMHhGMSwgMHhBNywgMHhDRSwgMHhFNSwgLyogMHhFNC0weEU3ICovCisJMHhDQiwgMHhERCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOSwgMHhFMywgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMywgMHhBQywgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHhEMCwgMHhGOSwgMHhFQywgMHhBQiwgMHhERSwgMHhEMywgLyogMHhGMC0weEYzICovCisJMHhGNywgMHhFOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOSwgMHhGNSwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHhERSwgMHhDQiwgMHhFRSwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNUVbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweEJDLCAweEY4LCAweEQ2LCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERCLCAweEVFLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweEZELCAweEYxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweEY3LCAweEI2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY0LCAweERFLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweEYyLCAweEVELCAweDAwLCAweDAwLCAweERCLCAweEQ5LCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweEYwLCAweEE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweEZELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERFLCAweEQ0LCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweEFDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweEUzLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQzLCAweEUxLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweERGLCAweEM4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweEQ5LCAweEI2LCAweDAwLCAweDAwLCAweEZELCAweEFDLCAvKiAweDNDLTB4M0YgKi8KKwkweEVGLCAweEQzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweEU0LCAweEMxLCAweEY4LCAweEVCLCAweDAwLCAweDAwLCAweERCLCAweEFDLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweEZDLCAweEM2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweEQ4LCAweEFELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY2LCAweEJBLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweERCLCAweERGLCAweEQzLCAweEQzLCAweEY4LCAweEM3LCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENBLCAweENFLCAweEY4LCAweEMxLCAvKiAweDcwLTB4NzMgKi8KKwkweEQyLCAweEI0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERDLCAweEI0LCAvKiAweDc0LTB4NzcgKi8KKwkweEZBLCAweEI5LCAweENBLCAweENGLCAweDAwLCAweDAwLCAweEZDLCAweEIzLCAvKiAweDc4LTB4N0IgKi8KKwkweEVBLCAweEVBLCAweEVBLCAweEVCLCAweEQwLCAweEZBLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweEVELCAweEU0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERELCAweEU3LCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERGLCAweEM5LCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERGLCAweEVELCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweEVFLCAweEJDLCAweDAwLCAweDAwLCAweEVGLCAweEMxLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENDLCAweEQyLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweERELCAweEE0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweERGLCAweENBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQzLCAweEY4LCAweEYxLCAweEE4LCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENELCAweEI3LCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweEVGLCAweEQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweERELCAweERGLCAweEVFLCAweENCLCAweEFDLCAvKiAweEI0LTB4QjcgKi8KKwkweEU5LCAweEJDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweEVDLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERGLCAweENCLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweEY5LCAweEJGLCAweEQ2LCAweEFGLCAweEQ1LCAweEM2LCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweENGLCAweEFBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENFLCAweEE5LCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ2LCAweEY4LCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYxLCAweEI3LCAweEVFLCAweEY4LCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ5LCAweEQ5LCAvKiAweERDLTB4REYgKi8KKwkweEYzLCAweERGLCAweDAwLCAweDAwLCAweEY4LCAweEM4LCAweENFLCAweEM2LCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweEQ1LCAweEU2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY0LCAweEU2LCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweEM1LCAweEVGLCAweEQ1LCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENCLCAweEVGLCAweEZDLCAweERGLCAvKiAweEY4LTB4RkIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181Rls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4REMsIDB4QTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4RDYsIDB4RTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjgsIDB4QzksIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4RDIsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4QkQsIDB4MDAsIDB4MDAsIDB4Q0YsIDB4RTEsIC8qIDB4MTAtMHgxMyAqLworCTB4RjAsIDB4QzAsIDB4RUMsIDB4REEsIDB4MDAsIDB4MDAsIDB4REQsIDB4RDcsIC8qIDB4MTQtMHgxNyAqLworCTB4RkIsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUMsIDB4QUMsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjAsIDB4QTksIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkEsIDB4RDcsIDB4RkIsIDB4QzEsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4RDIsIDB4QzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4RUQsIDB4RTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0IsIDB4QUQsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4RjksIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4RjcsIDB4QTUsIDB4MDAsIDB4MDAsIDB4Q0IsIDB4QUUsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4REEsIDB4QUYsIDB4MDAsIDB4MDAsIDB4RDgsIDB4QjYsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDMsIDB4QTcsIDB4RkIsIDB4QjIsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4RkQsIDB4QzQsIDB4MDAsIDB4MDAsIDB4RUMsIDB4QUQsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkIsIDB4QTEsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4RTksIDB4RTksIDB4RUUsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4RjMsIDB4RjQsIDB4RjgsIDB4RjMsIDB4RjAsIDB4QzEsIC8qIDB4NjgtMHg2QiAqLworCTB4REUsIDB4QUYsIDB4RjgsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4RjMsIDB4RTAsIDB4RTcsIDB4QUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REIsIDB4QUQsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4RTYsIDB4QjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4RjksIDB4QTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REQsIDB4RDgsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RTgsIDB4RDksIDB4RUYsIDB4RDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4RDMsIDB4RTIsIDB4MDAsIDB4MDAsIDB4RTIsIDB4REYsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkMsIDB4RTAsIDB4RDcsIDB4QzgsIC8qIDB4ODgtMHg4QiAqLworCTB4RkQsIDB4QUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4REYsIDB4RUYsIDB4Q0MsIDB4RDMsIDB4RDMsIDB4RjksIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDQsIDB4RjAsIC8qIDB4OTQtMHg5NyAqLworCTB4REIsIDB4QzcsIDB4REUsIDB4RDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjAsIDB4RjQsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4RDUsIDB4RDAsIDB4RTUsIDB4RDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4RkMsIDB4QzcsIDB4REMsIDB4RDYsIDB4RTIsIDB4RTAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REEsIDB4QjAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4RjMsIDB4QTMsIDB4MDAsIDB4MDAsIDB4RDMsIDB4RUMsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4RjQsIDB4Q0IsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4RkQsIDB4QzUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4RkQsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4RjksIDB4QjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4RDAsIDB4RkIsIDB4RUMsIDB4REIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjUsIDB4QkMsIDB4RjIsIDB4QTQsIC8qIDB4RDQtMHhENyAqLworCTB4RDgsIDB4Q0UsIDB4RDgsIDB4Q0YsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4RjUsIDB4RjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjYsIDB4RTEsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4RDIsIDB4QjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4RkIsIDB4RUMsIDB4MDAsIDB4MDAsIDB4REQsIDB4QzgsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzYwWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhFOCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMiwgMHhDMSwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOCwgMHhENywgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHhENiwgMHhCQiwgMHhERSwgMHhENiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHhGNywgMHhCRCwgMHhFQywgMHhBRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhEMCwgMHhFMSwgMHgwMCwgMHgwMCwgMHhFMCwgMHhGNSwgLyogMHgyNC0weDI3ICovCisJMHhFQSwgMHhCMywgMHgwMCwgMHgwMCwgMHhDRSwgMHhENiwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQywgMHhBNSwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHhFQywgMHhGNiwgMHhFMiwgMHhFMSwgMHhFMywgMHhCRSwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHhGQywgMHhDOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHhDRCwgMHhGMCwgMHgwMCwgMHgwMCwgMHhGOSwgMHhGNiwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHhERiwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHhCRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHhDRSwgMHhCRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQywgMHhFMSwgMHhFRCwgMHhCMCwgLyogMHg2MC0weDYzICovCisJMHhGRCwgMHhEMSwgMHhGNiwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHhGOSwgMHhDRiwgMHhFQiwgMHhEQSwgMHhDQSwgMHhDMSwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHhEMiwgMHhCOCwgMHhDRCwgMHhGMSwgMHgwMCwgMHgwMCwgMHhFMywgMHhEMywgLyogMHg2Qy0weDZGICovCisJMHhGRCwgMHhFNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHhFNiwgMHhFRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHhGQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHhGMCwgMHhBQSwgMHhGOSwgMHhEMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHhGQywgMHhFMiwgMHgwMCwgMHgwMCwgMHhGOCwgMHhBNywgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhFNSwgMHhFRSwgMHhGOSwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHhGNiwgLyogMHg5Qy0weDlGICovCisJMHhFQSwgMHhFRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQywgMHhCNCwgLyogMHhBMC0weEEzICovCisJMHhGNSwgMHhDMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENywgMHhEQywgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHhGMCwgMHhGNSwgMHgwMCwgMHgwMCwgMHhERCwgMHhFOCwgMHhEMywgMHhFRCwgLyogMHhCMC0weEIzICovCisJMHhGNSwgMHhGQywgMHgwMCwgMHgwMCwgMHhEQSwgMHhCRiwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHhDQywgMHhGQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHhEMywgMHhGQSwgMHhGNCwgMHhBNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHhFRiwgMHhENywgMHgwMCwgMHgwMCwgMHhENCwgMHhDMywgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHhGQiwgMHhFMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQiwgMHhFRCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHhFMCwgMHhBRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHhFRSwgLyogMHhEQy0weERGICovCisJMHhGQiwgMHhCMywgMHhFNCwgMHhDMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHhGNiwgMHhFNywgMHhEMiwgMHhERCwgMHgwMCwgMHgwMCwgMHhERiwgMHhDQywgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQywgMHhDOSwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHhBOSwgMHhFMCwgMHhGNiwgMHhGNiwgMHhCMywgLyogMHhGOC0weEZCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNjFbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweEUxLCAweEZFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENCLCAweEYwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweEVBLCAweEVGLCAweEVBLCAweEYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweERBLCAweEMwLCAweEY4LCAweEI0LCAweEVCLCAweEYyLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweEMzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweEQ3LCAweEU0LCAweEYxLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENBLCAweEVGLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENFLCAweEQ3LCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweEZDLCAweENBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweEYzLCAweEUxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENCLCAweEM0LCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweEUzLCAweEU1LCAweDAwLCAweDAwLCAweENCLCAweEM1LCAweEVBLCAweEI0LCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweEJELCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweEQ3LCAweEM5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVCLCAweERCLCAvKiAweDQ0LTB4NDcgKi8KKwkweEVELCAweEIxLCAweDAwLCAweDAwLCAweENDLCAweEMzLCAweEY3LCAweEJFLCAvKiAweDQ4LTB4NEIgKi8KKwkweEZDLCAweENCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY4LCAweEY0LCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweEQ5LCAweEI3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweEYzLCAweEQzLCAweEYzLCAweEQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweEY3LCAweEU0LCAweDAwLCAweDAwLCAweEY3LCAweEQxLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ4LCAweEI3LCAweENFLCAweEIxLCAvKiAweDYwLTB4NjMgKi8KKwkweENBLCAweEMyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZCLCAweEI0LCAvKiAweDY0LTB4NjcgKi8KKwkweENCLCAweEM2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYwLCAweEY2LCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ1LCAweEU3LCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweEVBLCAweEQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENDLCAweEQ0LCAweENCLCAweEFGLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweEY0LCAweEFBLCAweEU5LCAweEFGLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweEY1LCAweEMzLCAweEU5LCAweEQ4LCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERELCAweEU5LCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYxLCAweEYzLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweEQ1LCAweEZCLCAweERFLCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweEY0LCAweEZCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweEZELCAweEYzLCAweEZELCAweEYyLCAweEY3LCAweEE2LCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweERELCAweEM5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ0LCAweEQzLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweENDLCAweEE4LCAweDAwLCAweDAwLCAweERBLCAweEMxLCAvKiAweEE4LTB4QUIgKi8KKwkweENDLCAweEQ1LCAweDAwLCAweDAwLCAweEQ5LCAweEU0LCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZBLCAweENBLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweEUzLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQzLCAweEJDLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENBLCAweEYwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQwLCAweEM0LCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENBLCAweEQwLCAvKiAweEM0LTB4QzcgKi8KKwkweEZBLCAweEFCLCAweEVCLCAweEVCLCAweEU3LCAweEY4LCAweEQ5LCAweEU1LCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQxLCAweEQ3LCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYzLCAweEE0LCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ0LCAweEZCLCAweEZDLCAweEUzLCAvKiAweEY0LTB4RjcgKi8KKwkweEZBLCAweEQ4LCAweDAwLCAweDAwLCAweEYzLCAweEQ1LCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweENGLCAweEFCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVCLCAweEYzLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182Mls1MTJdID0geworCTB4RDUsIDB4RkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDMsIDB4RDQsIC8qIDB4MDQtMHgwNyAqLworCTB4Q0QsIDB4RkMsIDB4MDAsIDB4MDAsIDB4RDksIDB4RTYsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4RTIsIDB4RjksIDB4RTIsIDB4QTEsIDB4RUIsIDB4RDQsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4RTAsIDB4RjcsIDB4RTQsIDB4QjIsIDB4Q0MsIDB4RkMsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkIsIDB4RTQsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjQsIDB4QUIsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDAsIDB4QkQsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4Q0EsIDB4RjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUYsIDB4QjgsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDcsIDB4QzAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4RUUsIDB4RkEsIDB4RkQsIDB4RjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4RDMsIDB4RTMsIDB4MDAsIDB4MDAsIDB4RkIsIDB4QzIsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDUsIDB4RTgsIDB4REIsIDB4QUUsIC8qIDB4M0MtMHgzRiAqLworCTB4RTEsIDB4QjYsIDB4RjgsIDB4QjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4QkYsIC8qIDB4NDQtMHg0NyAqLworCTB4RkIsIDB4QzMsIDB4REQsIDB4RUEsIDB4MDAsIDB4MDAsIDB4RTIsIDB4QTIsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4QTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjYsIDB4RTgsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4RjYsIDB4RjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REQsIDB4Q0EsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4RDAsIDB4RTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REQsIDB4QTYsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4REQsIDB4RUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4RTQsIDB4RjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4QUYsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RDAsIDB4RkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4RjQsIDB4RkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4Q0MsIDB4QkMsIDB4RjcsIDB4RUEsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4RTQsIDB4REYsIDB4RjEsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4RjcsIDB4RTEsIDB4MDAsIDB4MDAsIDB4RjksIDB4RjcsIC8qIDB4OTQtMHg5NyAqLworCTB4RUYsIDB4QjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjgsIDB4RDgsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjksIDB4QTksIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4RjgsIDB4RDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4QkQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4RDgsIDB4QzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4RTQsIDB4RTMsIDB4RjUsIDB4Q0UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REQsIDB4RDksIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDksIDB4RTcsIC8qIDB4QzQtMHhDNyAqLworCTB4RDIsIDB4QjksIDB4RDUsIDB4QzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4REEsIDB4RTUsIDB4REEsIDB4RDAsIDB4MDAsIDB4MDAsIDB4RDEsIDB4RDksIC8qIDB4Q0MtMHhDRiAqLworCTB4Q0UsIDB4RDgsIDB4MDAsIDB4MDAsIDB4Q0IsIDB4REUsIDB4RjQsIDB4QUMsIC8qIDB4RDAtMHhEMyAqLworCTB4REEsIDB4RkIsIDB4MDAsIDB4MDAsIDB4RjYsIDB4RTksIDB4RTgsIDB4RjMsIC8qIDB4RDQtMHhENyAqLworCTB4Q0YsIDB4QUMsIDB4RjAsIDB4RjAsIDB4MDAsIDB4MDAsIDB4RjQsIDB4RkQsIC8qIDB4RDgtMHhEQiAqLworCTB4REIsIDB4QzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4Q0UsIDB4QzAsIDB4RTMsIDB4RDQsIDB4RDEsIDB4Q0YsIDB4RjEsIDB4RjUsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4Q0QsIDB4RjIsIDB4MDAsIDB4MDAsIDB4Q0YsIDB4RUIsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0QsIDB4QjgsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4QTYsIDB4RDEsIDB4REEsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzYzWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHhGMiwgMHhBNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMiwgMHhBNiwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHhDRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHhEMywgMHhGQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMSwgMHhBOSwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMiwgMHhDOSwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRiwgMHhEOCwgMHhFNiwgMHhDOSwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHhEOCwgMHhCOCwgMHhGQSwgMHhGMywgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHhGMywgMHhCNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHhGOCwgMHhBNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMSwgMHhGMywgLyogMHg0Qy0weDRGICovCisJMHhFNiwgMHhDOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHhGOCwgMHhEQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQywgMHhFOSwgLyogMHg2NC0weDY3ICovCisJMHhERSwgMHhENywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQiwgMHhERiwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRiwgMHhFQywgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNCwgMHhERiwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMSwgMHhGNCwgMHhEMiwgMHhCQSwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERiwgMHhGMiwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhCNywgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHhFMiwgMHhBMywgMHhEMywgMHhGQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHhFRCwgMHhFNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQiwgMHhDOSwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhGQSwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHhDRiwgMHhERSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRSwgMHhEMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHhENSwgMHhEMywgMHhGMywgMHhGNSwgMHhGNywgMHhBRSwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHhFRiwgMHhDOCwgMHgwMCwgMHgwMCwgMHhDRCwgMHhGMywgLyogMHhBNC0weEE3ICovCisJMHhGNSwgMHhDRiwgMHhFNSwgMHhGMywgMHhGMCwgMHhDMiwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHhDQSwgMHhEMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHhFQSwgMHhGMSwgMHgwMCwgMHgwMCwgMHhEMCwgMHhBNiwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOSwgMHhEQSwgLyogMHhDQy0weENGICovCisJMHhGMCwgMHhBQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQiwgMHhFNywgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhDMCwgMHhGQywgMHhCNSwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHhDNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHhDQywgMHhBOSwgMHhGRCwgMHhDNiwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHhFQSwgMHhCNSwgMHgwMCwgMHgwMCwgMHhFNSwgMHhBQSwgMHhERiwgMHhCQSwgLyogMHhGNC0weEY3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNjRbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweERGLCAweDAwLCAweDAwLCAweERBLCAweEQxLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweEUxLCAweEI4LCAweDAwLCAweDAwLCAweEU4LCAweEY0LCAweEQzLCAweEZELCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweEUyLCAweEE0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYyLCAweENBLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweERBLCAweEU2LCAweEY3LCAweEIzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweENELCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYzLCAweEI2LCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweEVFLCAweEQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweEY1LCAweEM0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweEQ4LCAweEE0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYyLCAweEE3LCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweEQ5LCAweEI4LCAweEQ5LCAweEI5LCAweEVGLCAweEM5LCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweEQ2LCAweENFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweEY3LCAweENCLCAweERGLCAweEFFLCAweEU4LCAweEY1LCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQyLCAweEI1LCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQzLCAweEQ1LCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweEY0LCAweENDLCAweERBLCAweEZDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ5LCAweEU4LCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweEY3LCAweEVCLCAweEY1LCAweEM5LCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweEYzLCAweEJDLCAweDAwLCAweDAwLCAweERBLCAweEQyLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQzLCAweEI1LCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweEI2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweEQ2LCAweENGLCAweEY0LCAweEJBLCAweDAwLCAweDAwLCAweEY3LCAweEM5LCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENDLCAweEFBLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweEYwLCAweEMzLCAweENDLCAweEQ2LCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQwLCAweEQzLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweEQzLCAweEJELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweERCLCAweEZCLCAweDAwLCAweDAwLCAweENCLCAweEUwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweEQzLCAweEU0LCAweEY2LCAweEY3LCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweEQ1LCAweEJBLCAweEYzLCAweENELCAweENCLCAweEUxLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweEVCLCAweEY0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY0LCAweEFELCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweEZDLCAweEFBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY3LCAweEVDLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweEY2LCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182NVs1MTJdID0geworCTB4REEsIDB4RTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4RjcsIDB4Q0MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4RTUsIDB4QzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4RUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDUsIDB4RkQsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4RTYsIDB4RkMsIDB4QUIsIC8qIDB4MjgtMHgyQiAqLworCTB4RDUsIDB4QkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjIsIDB4QTgsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4QTUsIDB4Q0QsIDB4QjksIC8qIDB4MzQtMHgzNyAqLworCTB4RUEsIDB4RjIsIDB4Q0IsIDB4QzcsIDB4MDAsIDB4MDAsIDB4Q0QsIDB4RjQsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REIsIDB4QUYsIDB4RUYsIDB4RDksIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4Q0QsIDB4QkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4RkMsIDB4RjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4REYsIDB4RjMsIDB4Q0UsIDB4RTcsIDB4REEsIDB4QzIsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4Q0YsIDB4QUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4RjksIDB4RjgsIDB4QTgsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjMsIDB4RTIsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4RjIsIDB4REYsIDB4QTQsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDQsIDB4QzQsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4Q0MsIDB4RDcsIDB4RTUsIDB4QzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0QsIDB4QkIsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4RUYsIDB4REEsIDB4RUUsIDB4RDgsIDB4MDAsIDB4MDAsIDB4REQsIDB4QTcsIC8qIDB4NzQtMHg3NyAqLworCTB4RTIsIDB4QTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4QzAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDYsIDB4QjAsIDB4RjgsIDB4Q0EsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4RkMsIDB4RkEsIDB4MDAsIDB4MDAsIDB4RDksIDB4RkUsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4REUsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4REQsIDB4RUMsIDB4REEsIDB4RTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDQsIDB4RTAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4RDYsIDB4RjksIDB4MDAsIDB4MDAsIDB4Q0QsIDB4RDcsIC8qIDB4OTgtMHg5QiAqLworCTB4REUsIDB4RDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjIsIDB4RjgsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4RDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4RDAsIDB4QzUsIDB4RjQsIDB4QUUsIDB4MDAsIDB4MDAsIDB4REQsIDB4QTgsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4QzUsIC8qIDB4QTgtMHhBQiAqLworCTB4RjMsIDB4RDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REUsIDB4RDksIC8qIDB4QUMtMHhBRiAqLworCTB4RTMsIDB4RTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDMsIDB4QTgsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4REIsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4RTUsIDB4REEsIDB4RTMsIDB4QkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4REIsIDB4QjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4RDUsIDB4RTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4QzEsIC8qIDB4QzgtMHhDQiAqLworCTB4RUYsIDB4REIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjAsIDB4RTksIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDcsIDB4QjIsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDAsIDB4RkQsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4RDksIDB4RTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDAsIDB4RkUsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4RUMsIDB4RUQsIDB4RDMsIDB4QTksIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4RjIsIDB4QTksIDB4RjAsIDB4QzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4RTIsIDB4RTIsIDB4RTksIDB4RUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4RjksIDB4RDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4RTksIDB4RDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4REEsIDB4REEsIDB4QzMsIC8qIDB4RjgtMHhGQiAqLworCTB4REEsIDB4QzQsIDB4RDQsIDB4QzUsIDB4MDAsIDB4MDAsIDB4RTcsIDB4RkEsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzY2WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRCwgMHhFMCwgMHhFMywgMHhCMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHhEQiwgMHhCMiwgMHhGQiwgMHhDNCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHhGMywgMHhFMywgMHgwMCwgMHgwMCwgMHhEOSwgMHhBNSwgMHhGQiwgMHhFNywgLyogMHgwQy0weDBGICovCisJMHhERCwgMHhDQiwgMHhEMCwgMHhENCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhCNiwgLyogMHgxMC0weDEzICovCisJMHhFMCwgMHhBRSwgMHhGRCwgMHhEQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQywgMHhCNSwgMHhFMCwgMHhGOCwgLyogMHgxQy0weDFGICovCisJMHhFNywgMHhCMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhGNSwgMHhGMCwgMHgwMCwgMHgwMCwgMHhEOCwgMHhEQywgLyogMHgyNC0weDI3ICovCisJMHhFRCwgMHhDNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHhCOSwgMHgwMCwgMHgwMCwgMHhFMywgMHhDMCwgLyogMHgyQy0weDJGICovCisJMHhGOSwgMHhDMCwgMHhFOSwgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHhEOSwgMHhEQiwgMHgwMCwgMHgwMCwgMHhGMywgMHhFNCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQywgMHhCNiwgMHhFNCwgMHhFOSwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHhGMCwgMHhDNSwgMHhFMywgMHhDMSwgMHhGQywgMHhDQywgLyogMHg0MC0weDQzICovCisJMHhGQywgMHhDRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHhGMiwgMHhDQiwgMHgwMCwgMHgwMCwgMHhGMiwgMHhDQywgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhDRiwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhGMSwgMHhEQiwgMHgwMCwgMHgwMCwgMHhGQSwgMHhEOSwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHhGMSwgMHhCOCwgMHhGRCwgMHhGNSwgMHhFMCwgMHhGOSwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHhFNywgMHhGQiwgMHhGQywgMHhCNywgMHhGQywgMHhFNCwgMHhGQiwgMHhDNSwgLyogMHg2NC0weDY3ICovCisJMHhFMywgMHhFNywgMHhEOCwgMHhCOSwgMHgwMCwgMHgwMCwgMHhGNiwgMHhGOCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQywgMHhDNSwgMHhDQywgMHhEOCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhBRiwgLyogMHg3MC0weDczICovCisJMHhGNCwgMHhFNywgMHgwMCwgMHgwMCwgMHhFRiwgMHhEQywgMHhDRiwgMHhGQywgLyogMHg3NC0weDc3ICovCisJMHhFRiwgMHhERCwgMHgwMCwgMHgwMCwgMHhGMiwgMHhBQSwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHhGRCwgMHhCRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQSwgMHhBQywgLyogMHg4NC0weDg3ICovCisJMHhGRCwgMHhCQiwgMHhGRCwgMHhDNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHhCMiwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHhFQSwgMHhEMSwgMHhERiwgMHhGNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMSwgMHhFQywgMHhFNCwgMHhERSwgLyogMHg5NC0weDk3ICovCisJMHhFNSwgMHhDMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHhEOSwgMHhBNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHhDRCwgMHhCQywgMHgwMCwgMHgwMCwgMHhGMywgMHhFNSwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHhENSwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOSwgMHhCQSwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHhFNywgMHhGQiwgMHhCNSwgLyogMHhCMC0weEIzICovCisJMHhGOCwgMHhFQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHhFNywgMHgwMCwgMHgwMCwgMHhDQywgMHhEOSwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENCwgMHhDNiwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHhFNywgMHhBNSwgMHgwMCwgMHgwMCwgMHhENSwgMHhGNSwgMHhEMywgMHhCRSwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHhGQywgMHhGQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhGMiwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHhERiwgMHhGNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHhFOCwgMHhGOCwgMHhGOCwgMHhFRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHhDRSwgMHhDNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGNiwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHhFOCwgMHhEOCwgMHgwMCwgMHgwMCwgMHhDRCwgMHhEOCwgMHhFNywgMHhENiwgLyogMHhGMC0weEYzICovCisJMHhDQywgMHhEQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQSwgMHhFMywgLyogMHhGNC0weEY3ICovCisJMHhERiwgMHhGNiwgMHhGMCwgMHhDNywgMHhGMCwgMHhDNiwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHhEOCwgMHhCQSwgMHgwMCwgMHgwMCwgMHhGMSwgMHhGNCwgMHhGNCwgMHhGMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNjdbNTEyXSA9IHsKKwkweEY1LCAweENDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZDLCAweEU1LCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweEVBLCAweEM1LCAweEVBLCAweEYzLCAweDAwLCAweDAwLCAweERELCAweERCLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweERDLCAweEQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweERFLCAweEZELCAweEYyLCAweEY5LCAweDAwLCAweDAwLCAweEQ1LCAweEM3LCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ4LCAweEQwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweEYwLCAweEM4LCAweEQxLCAweEExLCAweEQxLCAweEEyLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ5LCAweEQ0LCAweEQ2LCAweEU4LCAvKiAweDI0LTB4MjcgKi8KKwkweEQ5LCAweENBLCAweDAwLCAweDAwLCAweERBLCAweEIxLCAweEQ4LCAweEM3LCAvKiAweDI4LTB4MkIgKi8KKwkweERDLCAweEUyLCAweEYzLCAweENFLCAweEY1LCAweEY0LCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweEYxLCAweEI5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweERBLCAweEQzLCAweDAwLCAweDAwLCAweEY2LCAweEVBLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENGLCAweEY1LCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweEZELCAweEFFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENBLCAweEQyLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweERGLCAweEI0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ3LCAweERELCAweEZBLCAweEJBLCAvKiAweDRDLTB4NEYgKi8KKwkweEVFLCAweEE3LCAweEY1LCAweEJELCAweDAwLCAweDAwLCAweEY4LCAweEY1LCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweEU4LCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweEQ0LCAweEUxLCAweDAwLCAweDAwLCAweEQxLCAweEEzLCAweEUxLCAweEQ2LCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweEY5LCAweEY4LCAweDAwLCAweDAwLCAweERCLCAweENBLCAvKiAweDZDLTB4NkYgKi8KKwkweENCLCAweEY5LCAweEQ0LCAweEQ0LCAweDAwLCAweDAwLCAweEQ5LCAweERDLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweEVFLCAweEJFLCAweDAwLCAweDAwLCAweEY3LCAweEVELCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQyLCAweEVFLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEU2LCAweEY3LCAweEY5LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERELCAweEVELCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweERCLCAweDAwLCAweDAwLCAweERCLCAweEIzLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQxLCAweEY3LCAvKiAweDhDLTB4OEYgKi8KKwkweEUwLCAweEIwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ0LCAweEUyLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweEY2LCAweEQ3LCAweDAwLCAweDAwLCAweEQ3LCAweEY5LCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ4LCAweERELCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweENELCAweEZELCAweEYyLCAweEFCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENELCAweEJELCAvKiAweEFDLTB4QUYgKi8KKwkweEY4LCAweEMyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYyLCAweEFDLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENBLCAweEFELCAweENBLCAweEFFLCAvKiAweEI0LTB4QjcgKi8KKwkweENGLCAweEFFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweEMyLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweERDLCAweEI3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERCLCAweERBLCAvKiAweENDLTB4Q0YgKi8KKwkweEQ5LCAweEJCLCAweENBLCAweEYzLCAweEY2LCAweEQzLCAweEU2LCAweEY4LCAvKiAweEQwLTB4RDMgKi8KKwkweEVBLCAweEY1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweEY2LCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweEY2LCAweEY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweENGLCAweEFGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweENBLCAweEQzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENBLCAweEFGLCAvKiAweEVDLTB4RUYgKi8KKwkweEQyLCAweEIwLCAweEYxLCAweEJBLCAweDAwLCAweDAwLCAweEQ3LCAweEIzLCAvKiAweEYwLTB4RjMgKi8KKwkweEUzLCAweEMzLCAweEYzLCAweEZELCAweERFLCAweERBLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERFLCAweERCLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVGLCAweERFLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182OFs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4RTMsIDB4RUUsIDB4RkIsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REYsIDB4RjcsIDB4RDcsIDB4Q0EsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4Q0UsIDB4RTgsIDB4REIsIDB4REIsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjEsIDB4QkIsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4RjEsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4RkEsIDB4QjcsIDB4RDAsIDB4QzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4Q0MsIDB4QUIsIDB4RUUsIDB4QTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4Q0IsIDB4RkEsIDB4RjksIDB4RjksIDB4Q0MsIDB4RkQsIDB4RDMsIDB4RkUsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4RTQsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjIsIDB4RUUsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4RDQsIDB4RDUsIDB4REYsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4RkMsIDB4QjgsIC8qIDB4NTAtMHg1MyAqLworCTB4RDEsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4RjIsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjcsIDB4RDIsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4RDQsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4RDUsIDB4RDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4RDgsIDB4REUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0QsIDB4RDksIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4QTksIC8qIDB4OTAtMHg5MyAqLworCTB4RjYsIDB4QkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0MsIDB4REIsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4RjAsIDB4QzksIDB4MDAsIDB4MDAsIDB4RkMsIDB4RkMsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4QzksIDB4RjQsIDB4RkUsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4RkMsIC8qIDB4QTQtMHhBNyAqLworCTB4RDcsIDB4REUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4REUsIDB4REMsIDB4MDAsIDB4MDAsIDB4RjAsIDB4QUMsIC8qIDB4QUMtMHhBRiAqLworCTB4Q0MsIDB4RkUsIDB4Q0QsIDB4RTEsIDB4MDAsIDB4MDAsIDB4RTEsIDB4QkEsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4REIsIDB4RUYsIDB4REEsIDB4QjIsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4RDEsIDB4QTUsIDB4REMsIDB4QjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4RDgsIDB4RjYsIDB4MDAsIDB4MDAsIDB4RDEsIDB4QTQsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4Q0QsIDB4RTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REMsIDB4RUEsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4RjAsIDB4RjcsIDB4MDAsIDB4MDAsIDB4RjAsIDB4Q0EsIC8qIDB4RDQtMHhENyAqLworCTB4RDAsIDB4QkUsIDB4MDAsIDB4MDAsIDB4REQsIDB4REMsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDQsIDB4RDYsIC8qIDB4REMtMHhERiAqLworCTB4RDMsIDB4RDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4RDAsIC8qIDB4RTQtMHhFNyAqLworCTB4Q0QsIDB4QTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REYsIDB4QjUsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REYsIDB4RjgsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4RDQsIDB4QTEsIDB4Q0UsIDB4QjIsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzY5WzUxMl0gPSB7CisJMHhFOCwgMHhDQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHhFQiwgMHhGNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHhENSwgMHhGNSwgMHhEMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNSwgMHhBMSwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOSwgMHhBNywgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHhFNSwgMHhBQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHhFNiwgMHhDQiwgMHgwMCwgMHgwMCwgMHhGNSwgMHhGMSwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhDNSwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOSwgMHhBMywgLyogMHg1MC0weDUzICovCisJMHhFMCwgMHhEQiwgMHhGNiwgMHhFQiwgMHgwMCwgMHgwMCwgMHhDQiwgMHhGMSwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhEOSwgMHhFQSwgMHhGNSwgMHhBMiwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENywgMHhEMSwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHhEMSwgMHhGOCwgMHhFQSwgMHhGOCwgMHhFQSwgMHhGOSwgMHhEQSwgMHhCMywgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHhFRiwgMHhERiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMSwgMHhFRiwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHhGNiwgMHhFRSwgMHhCRiwgMHhFMiwgMHhFNCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHhEMCwgMHhCRiwgMHgwMCwgMHgwMCwgMHhGQSwgMHhBQywgLyogMHg3NC0weDc3ICovCisJMHhGNSwgMHhEMSwgMHhFNywgMHhCMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHhCRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMiwgMHhDRSwgLyogMHg5OC0weDlCICovCisJMHhEQiwgMHhCNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHhGQywgMHhDRSwgMHgwMCwgMHgwMCwgMHhERCwgMHhFRSwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHhCNCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHhENywgMHhCNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNywgMHhCNCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHhDRCwgMHhCRSwgMHgwMCwgMHgwMCwgMHhEQSwgMHhFOSwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRiwgMHhCMCwgLyogMHhDOC0weENCICovCisJMHhGNywgMHhEOSwgMHhGMywgMHhFNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHhDRSwgMHhEOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHhDRSwgMHhBQSwgMHgwMCwgMHgwMCwgMHhDQiwgMHhDOCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMCwgMHhBNywgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHhGMCwgMHhDQiwgMHgwMCwgMHgwMCwgMHhEMCwgMHhDNywgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNkFbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweEM1LCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERCLCAweEUwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweEQ1LCAweERBLCAweDAwLCAweDAwLCAweEQ3LCAweEE3LCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweEMwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweEY4LCAweEY2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY1LCAweEQyLCAweEVELCAweEU5LCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweEQ5LCAweEJDLCAweDAwLCAweDAwLCAweEU1LCAweEM2LCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweEY1LCAweEEzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweERBLCAweEQ0LCAweEUyLCAweEE3LCAweEZCLCAweEZDLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweEYxLCAweERDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweENBLCAweEY0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweEU4LCAweEZBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENFLCAweEU5LCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweEY4LCAweEUyLCAweEU1LCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweEQwLCAweEI5LCAweEQ0LCAweEYyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQxLCAweEE2LCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweERGLCAweENFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZDLCAweEY0LCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEQzLCAweEFBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweENDLCAweEFDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweEVGLCAweEUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweEU1LCAweEQwLCAweEQ1LCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERCLCAweEZDLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweEZDLCAweEU2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENCLCAweEZFLCAweEVELCAweEVBLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERFLCAweEIxLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY5LCAweEUzLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ0LCAweEEyLCAweENGLCAweEY2LCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ2LCAweEQwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ1LCAweEVBLCAweEYxLCAweEVFLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZBLCAweENCLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweEExLCAvKiAweEY4LTB4RkIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182Qls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4RDUsIDB4QjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0YsIDB4RUQsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4RUQsIDB4RUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDUsIDB4QjIsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDUsIDB4QkMsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4RkQsIDB4RTIsIDB4RjMsIDB4QUQsIDB4MDAsIDB4MDAsIDB4RkQsIDB4REIsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4QjAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDEsIDB4QTcsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4RkQsIDB4RTMsIDB4Q0UsIDB4QjMsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RTQsIDB4RkEsIDB4Q0UsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4Q0EsIDB4QjAsIDB4MDAsIDB4MDAsIDB4RjcsIDB4QTcsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4Q0YsIDB4QjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4QTIsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4RkMsIDB4QjYsIDB4RjIsIDB4QUQsIDB4RUYsIDB4RTEsIC8qIDB4NjAtMHg2MyAqLworCTB4RjMsIDB4QUUsIDB4REMsIDB4QzYsIDB4RDksIDB4RUIsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4RTAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4QTgsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDUsIDB4RjYsIC8qIDB4NzQtMHg3NyAqLworCTB4Q0YsIDB4RkQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REUsIDB4REQsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDksIDB4RDEsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4RUEsIC8qIDB4ODAtMHg4MyAqLworCTB4RjIsIDB4Q0YsIDB4MDAsIDB4MDAsIDB4RjcsIDB4QkYsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4RTYsIDB4RTIsIDB4QTgsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4RDYsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4RUQsIDB4RDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4RjksIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDYsIDB4QjEsIDB4REUsIDB4QjIsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RTgsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4RDMsIDB4QUIsIDB4MDAsIDB4MDAsIDB4RUIsIDB4REMsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REYsIDB4QUYsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4Q0EsIDB4QzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4RkMsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4RkQsIDB4QzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4RUIsIDB4RjYsIDB4Q0YsIDB4QjIsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDksIDB4RUMsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4RDksIDB4QkQsIDB4MDAsIDB4MDAsIDB4RDgsIDB4REYsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDQsIDB4QjgsIDB4RUIsIDB4QkUsIC8qIDB4RDAtMHhEMyAqLworCTB4REQsIDB4RUYsIDB4MDAsIDB4MDAsIDB4REQsIDB4RjAsIDB4REQsIDB4RjEsIC8qIDB4RDQtMHhENyAqLworCTB4REQsIDB4RjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDksIDB4QkUsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkIsIDB4QzYsIC8qIDB4RTgtMHhFQiAqLworCTB4Q0YsIDB4QjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzZDWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHhFRSwgMHhGRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhBQiwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHhEQSwgMHhDNSwgMHgwMCwgMHgwMCwgMHhEOCwgMHhFQywgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMSwgMHhBOCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHhFMiwgMHhBOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERSwgMHhCQywgLyogMHgzNC0weDM3ICovCisJMHhFNywgMHhCNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQiwgMHhGMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHhFRiwgMHhFMiwgMHhGMSwgMHhGMCwgMHhDRiwgMHhCNCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQiwgMHhGMSwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHhFMCwgMHhCMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHhERiwgMHhBNSwgMHgwMCwgMHgwMCwgMHhGOSwgMHhEMiwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHhGRCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHhFNiwgMHhBMywgMHhGQiwgMHhGMSwgMHhDQiwgMHhCMCwgLyogMHg1Qy0weDVGICovCisJMHhGMiwgMHhBRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHhDRCwgMHhFNywgMHgwMCwgMHgwMCwgMHhFOCwgMHhEQywgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHhFNywgMHhENywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHhGNywgMHhDMCwgMHgwMCwgMHgwMCwgMHhEMCwgMHhFMywgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQSwgMHhBMSwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQywgMHhCRCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHhEMSwgMHhBOSwgMHhERCwgMHhDQywgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHhFMywgMHhGRSwgMHhEMSwgMHhBQSwgMHhFOCwgMHhBQSwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHhFQSwgMHhCNiwgMHhGOSwgMHhGQSwgMHhFNiwgMHhDQywgLyogMHg4NC0weDg3ICovCisJMHhGNiwgMHhEOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHhENCwgMHhDNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHhEOSwgMHhDQiwgMHgwMCwgMHgwMCwgMHhEOSwgMHhEMiwgMHhEMywgMHhDQiwgLyogMHg5MC0weDkzICovCisJMHhEOCwgMHhGNywgMHhEQSwgMHhBOSwgMHhGNSwgMHhGOCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHhERSwgMHhERSwgMHhGMiwgMHhBRiwgMHhGOCwgMHhBOSwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOCwgMHhDOCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHhDMSwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOSwgMHhDMSwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHhERCwgMHhGMywgMHhFQSwgMHhGQSwgMHgwMCwgMHgwMCwgMHhGNiwgMHhCRCwgLyogMHhCOC0weEJCICovCisJMHhFMSwgMHhCQiwgMHhDRCwgMHhCRiwgMHhGNCwgMHhENCwgMHhFNiwgMHhDRCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHhGQywgMHhDRiwgMHhGQiwgMHhBMiwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHhFMCwgMHhEQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHhGNCwgMHhCQiwgMHhEQSwgMHhENSwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHhGOSwgMHhCMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQiwgMHhGMiwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHhEQiwgMHhGNiwgMHgwMCwgMHgwMCwgMHhERSwgMHhERiwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQiwgMHhGMiwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHhGOCwgMHhEQywgMHhGNywgMHhFRSwgMHhFQiwgMHhFOCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHhEMiwgMHhGQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHhGMSwgMHhCQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQSwgMHhEQSwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQSwgMHhFQSwgMHhEQSwgMHhDNiwgLyogMHhFQy0weEVGICovCisJMHhGNywgMHhDMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHhCNiwgLyogMHhGMC0weEYzICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNkRbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweEM3LCAvKiAweDA4LTB4MEIgKi8KKwkweEQ2LCAweEFDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweERDLCAweEM3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEE5LCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweEFBLCAweDAwLCAweDAwLCAweEQ1LCAweEE2LCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ0LCAweEQ3LCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweEYyLCAweEQwLCAweDAwLCAweDAwLCAweEVBLCAweEZCLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweERELCAweEZCLCAweEYzLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYxLCAweEJELCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweEU3LCAweEZELCAweEQ3LCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweENFLCAweEM4LCAweEVBLCAweEI3LCAweDAwLCAweDAwLCAweEZDLCAweEMwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweEZELCAweEU3LCAweEY3LCAweEVGLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweEQ3LCAweEI1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweEVGLCAweEJBLCAweEYxLCAweERELCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweERFLCAweEIzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweENCLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY4LCAweERELCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweEZCLCAweEM3LCAweEQ1LCAweEM4LCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweEQ3LCAweERGLCAweDAwLCAweDAwLCAweERELCAweEE5LCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweEU5LCAweEIxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZBLCAweEFELCAvKiAweDc0LTB4NzcgKi8KKwkweEY2LCAweEQ5LCAweEZBLCAweEY0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY4LCAweEFBLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweEU2LCAweEVFLCAweDAwLCAweDAwLCAweENDLCAweERDLCAvKiAweDg0LTB4ODcgKi8KKwkweEUxLCAweEJDLCAweEUwLCAweEVGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweEU5LCAweEJGLCAweEZDLCAweEZELCAweEU2LCAweENFLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweEQ3LCAweDAwLCAweDAwLCAweEU2LCAweENGLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweEY0LCAweEYxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweEYzLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweEZCLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweEY5LCAweEU0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweEVGLCAweEUzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENGLCAweEVFLCAvKiAweEMwLTB4QzMgKi8KKwkweEY2LCAweEJFLCAweEUwLCAweEIyLCAweEZDLCAweEZFLCAweEQxLCAweEFCLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ3LCAweEZBLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZCLCAweEM4LCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweEQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweEQ0LCAweEEzLCAweEYwLCAweEY4LCAweEQ3LCAweEE4LCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEU3LCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweEQzLCAweEJGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweEVGLCAweEU0LCAweDAwLCAweDAwLCAweEQ3LCAweEM1LCAweEVCLCAweEUyLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZDLCAweEU3LCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweEEyLCAweDAwLCAweDAwLCAweEUyLCAweEU4LCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweEU2LCAweEQwLCAweDAwLCAweDAwLCAweEZCLCAweEU4LCAvKiAweEY0LTB4RjcgKi8KKwkweEY0LCAweEU4LCAweEU1LCAweEY0LCAweEY0LCAweEJDLCAweEY0LCAweEQ1LCAvKiAweEY4LTB4RkIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182RVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REYsIDB4QjYsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4RkMsIDB4QjksIDB4RUUsIDB4QzIsIDB4Q0EsIDB4RjUsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUYsIDB4RTUsIC8qIDB4MUMtMHgxRiAqLworCTB4Q0IsIDB4RTIsIDB4RDQsIDB4QTQsIDB4MDAsIDB4MDAsIDB4REUsIDB4RTAsIC8qIDB4MjAtMHgyMyAqLworCTB4REEsIDB4RkQsIDB4RTQsIDB4QzYsIDB4RTgsIDB4QkUsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4REUsIC8qIDB4MjgtMHgyQiAqLworCTB4RjYsIDB4QjQsIDB4RUEsIDB4RDIsIDB4MDAsIDB4MDAsIDB4RjksIDB4RkIsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4QzIsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4Q0EsIDB4RTQsIDB4MDAsIDB4MDAsIDB4RTcsIDB4QjcsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4RUEsIDB4RkQsIDB4MDAsIDB4MDAsIDB4RDksIDB4REQsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4REEsIDB4QjQsIDB4RUUsIDB4QUEsIDB4RkIsIDB4RTksIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REIsIDB4Q0IsIC8qIDB4NDAtMHg0MyAqLworCTB4REEsIDB4QjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjEsIDB4QkUsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4RDMsIDB4QUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkIsIDB4QzksIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4REYsIDB4Q0YsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDMsIDB4QzAsIC8qIDB4NTgtMHg1QiAqLworCTB4RTMsIDB4RDcsIDB4MDAsIDB4MDAsIDB4RUYsIDB4RTYsIDB4RkMsIDB4RDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4QzAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjUsIDB4RDMsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUMsIDB4REMsIDB4RjcsIDB4QjcsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4QjgsIDB4RDEsIDB4RjksIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REMsIDB4QzgsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4RUEsIDB4QjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjEsIDB4REUsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4RDcsIDB4QjYsIDB4Q0YsIDB4QjUsIDB4MDAsIDB4MDAsIDB4RDksIDB4QTgsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUMsIDB4RUUsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4REQsIDB4QUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0QsIDB4QTIsIDB4RTgsIDB4QUUsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4QkQsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4RjIsIDB4RDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4QzEsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDIsIDB4RkMsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REIsIDB4QjUsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4RjMsIDB4RTcsIDB4RDgsIDB4RkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4RkMsIDB4RDEsIDB4MDAsIDB4MDAsIDB4RUQsIDB4QjIsIC8qIDB4QzgtMHhDQiAqLworCTB4RjQsIDB4QUYsIDB4MDAsIDB4MDAsIDB4RkIsIDB4QTMsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4RkMsIDB4QzEsIDB4MDAsIDB4MDAsIDB4RUUsIDB4QUIsIC8qIDB4RDAtMHhEMyAqLworCTB4RDQsIDB4QTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjQsIDB4RjIsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4RUUsIDB4RDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4RkIsIDB4Q0EsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0QsIDB4RTMsIDB4RDgsIDB4QkIsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzZGWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHhFNSwgMHhEQiwgMHhGOCwgMHhGNywgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNiwgMHhENCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENywgMHhBOSwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHhDQiwgMHhDOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHhFNiwgMHhEMSwgMHhGMCwgMHhDQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHhEOCwgMHhBRSwgMHgwMCwgMHgwMCwgMHhGOSwgMHhEMywgMHhENSwgMHhGRSwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOCwgMHhCQywgLyogMHgyOC0weDJCICovCisJMHhGMiwgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHhBQiwgMHhGMywgMHhFOCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHhFRiwgMHhDMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHhFQywgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHhFNywgMHhCOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHhEQSwgMHhGRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHhDQywgMHhCRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMiwgMHhGQywgLyogMHg1NC0weDU3ICovCisJMHhEQSwgMHhFQiwgMHgwMCwgMHgwMCwgMHhFMiwgMHhEOCwgMHhFRCwgMHhENiwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENiwgMHhEMSwgMHhFMCwgMHhCMywgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQywgMHhEMiwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHhFQiwgMHhDOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHhEMywgMHhDMSwgMHhGMCwgMHhDRCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHhDRiwgMHhGNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHhEMiwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHhENCwgMHhEOCwgMHhEQywgMHhDOSwgMHhENywgMHhGMSwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHhERiwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHhGMywgMHhBNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHhGNCwgMHhDRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHhGMSwgMHhCRiwgMHhGOCwgMHhCMSwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHhFOSwgMHhGQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHhGQiwgMHhDQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQSwgMHhENSwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOSwgMHhENCwgLyogMHhBMC0weEEzICovCisJMHhGNywgMHhDQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENiwgMHhDOCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQywgMHhFOCwgMHhGMywgMHhCRCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHhFRSwgMHhGRSwgMHgwMCwgMHgwMCwgMHhFNywgMHhGRSwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHhEMywgMHhDMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMywgMHhCNiwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHhDQywgMHhBRCwgMHhGNiwgMHhGQSwgMHhENiwgMHhCMiwgMHhEMiwgMHhEOCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHhEOCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHhBNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHhCOSwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMCwgMHhBRCwgLyogMHhEQy0weERGICovCisJMHhGQiwgMHhDQywgMHhFQiwgMHhBMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHhENCwgMHhBNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHhGQiwgMHhDRCwgMHgwMCwgMHgwMCwgMHhENSwgMHhCRCwgLyogMHhFOC0weEVCICovCisJMHhGMSwgMHhERiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNiwgMHhGQiwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHhERSwgMHhCNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENSwgMHhFQiwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNzBbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweEU1LCAweEM4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweEZCLCAweEE0LCAweEQ0LCAweEI5LCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweERFLCAweEUxLCAweDAwLCAweDAwLCAweEU0LCAweEEzLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ3LCAweEI3LCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweEY4LCAweEVFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweERFLCAweEI1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweEQ2LCAweEQyLCAweDAwLCAweDAwLCAweEY5LCAweEQ1LCAweEU3LCAweEJBLCAvKiAweDE4LTB4MUIgKi8KKwkweEVCLCAweEQ1LCAweEQ1LCAweEY3LCAweEVGLCAweEU3LCAweEUxLCAweEJFLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZBLCAweEFFLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ2LCAweEU5LCAvKiAweDI0LTB4MjcgKi8KKwkweEQ2LCAweEVFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweEJCLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVDLCAweENCLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ1LCAweEIzLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweENFLCAweEI0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweEZCLCAweEE1LCAweEUxLCAweEVFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweEY3LCAweEE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweEZCLCAweENFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ4LCAweEJELCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZCLCAweEZELCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweEZDLCAweEU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweENGLCAweEI2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweEVELCAweEM3LCAweEVFLCAweEFDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweENDLCAweERELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY2LCAweEE3LCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweEZBLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY1LCAweEE0LCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweEZELCAweERDLCAweEVELCAweEIzLCAweENFLCAweEM5LCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweEVGLCAweEU4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweEUxLCAweEJGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZBLCAweERCLCAvKiAweEE4LTB4QUIgKi8KKwkweENCLCAweEUzLCAweEY3LCAweEE5LCAweDAwLCAweDAwLCAweEZCLCAweEE2LCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERDLCAweEI5LCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYxLCAweEMwLCAvKiAweEI0LTB4QjcgKi8KKwkweEVELCAweEM4LCAweEVGLCAweEMzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweEQ2LCAweEFELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweENFLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweEExLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweEZCLCAweEY0LCAweEQ1LCAweEE3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweEYxLCAweEY2LCAweDAwLCAweDAwLCAweEU2LCAweEQzLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweENDLCAweERFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweEY4LCAweEIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweERDLCAweEVCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183MVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4RkQsIDB4QjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4RUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4RjEsIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4REIsIDB4Q0MsIDB4REQsIDB4Q0QsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDQsIDB4QzgsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4RDksIDB4RUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjUsIDB4QTUsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4RTYsIDB4RkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4RDQsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4QzgsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4RDYsIDB4QTEsIDB4RkQsIDB4QkYsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4RkMsIDB4RDMsIDB4MDAsIDB4MDAsIDB4RUYsIDB4QTEsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4RTcsIDB4QkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDEsIDB4RUUsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4RTYsIDB4RDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4RTksIDB4RjIsIDB4MDAsIDB4MDAsIDB4REYsIDB4QjAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4RDgsIDB4RTAsIDB4RkMsIDB4QkEsIDB4RkQsIDB4QUYsIDB4RjAsIDB4Q0UsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4REIsIDB4RTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4RTUsIDB4QzksIDB4MDAsIDB4MDAsIDB4RUQsIDB4QjQsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4QzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4RTMsIDB4RDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4RTksIDB4RkIsIDB4RUEsIDB4QTgsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4QjcsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkIsIDB4QTcsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4RTksIDB4QzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4RkQsIDB4RjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4RDksIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REMsIDB4RUMsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4RTgsIDB4QTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4RTYsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4RkQsIDB4RjgsIDB4RkQsIDB4RjksIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjYsIDB4QkYsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4RTcsIDB4QTcsIDB4MDAsIDB4MDAsIDB4RTYsIDB4RDcsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4RDQsIDB4RjMsIDB4RDQsIDB4QzksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDYsIDB4RkEsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4RDcsIDB4RjIsIDB4MDAsIDB4MDAsIDB4RTEsIDB4QzAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4REIsIDB4RTIsIDB4RTYsIDB4RDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4QkQsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4RjAsIDB4Q0YsIDB4RjMsIDB4QkUsIDB4RTIsIDB4QUMsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4RjUsIDB4QjcsIDB4RTAsIDB4RjAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4QjgsIC8qIDB4RjgtMHhGQiAqLworCTB4RTMsIDB4RTgsIDB4MDAsIDB4MDAsIDB4RDQsIDB4QTcsIDB4RTgsIDB4RkMsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzcyWzUxMl0gPSB7CisJMHhGQSwgMHhEMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOCwgMHhFRiwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHhENiwgMHhEMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENSwgMHhCNCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMCwgMHhEMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHhGNywgMHhGMCwgMHhFRSwgMHhCMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHhFQSwgMHhCQSwgMHgwMCwgMHgwMCwgMHhFQSwgMHhEMywgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHhFRCwgMHhDOSwgMHhERCwgMHhBQiwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhBQywgMHhGRCwgMHhBMSwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHhERiwgMHhEMCwgMHhFQywgMHhCMywgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHhERiwgMHhEMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHhFRCwgMHhGOCwgMHhCOCwgLyogMHg0NC0weDQ3ICovCisJMHhGNywgMHhGQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHhGOCwgMHhBQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNCwgMHhFMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHhENCwgMHhCQSwgMHhFNCwgMHhCMywgMHgwMCwgMHgwMCwgMHhFOSwgMHhEQSwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHhERSwgMHhCNiwgMHgwMCwgMHgwMCwgMHhEOSwgMHhCRiwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHhEOSwgMHhDMCwgMHhENiwgMHhFRiwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOSwgMHhDQywgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhEQSwgMHhBQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERiwgMHhFNSwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHhGNywgMHhFNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHhDQywgMHhCMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHhERiwgMHhGOSwgMHhENywgMHhFMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENCwgMHhCQiwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGQSwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHhDQywgMHhCMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQiwgMHhGMywgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHhERiwgMHhEMiwgMHgwMCwgMHgwMCwgMHhDRSwgMHhDQSwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHhFRSwgMHhEQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhFNCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHhGQiwgMHhDRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRiwgMHhCNywgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHhFRSwgMHhDMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHhDRSwgMHhFQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHhBRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHhENywgMHhFMSwgMHhGQSwgMHhGNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHhENSwgMHhDOSwgMHhGOCwgMHhBQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNzNbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweEQ5LCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYzLCAweEU5LCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ4LCAweEVELCAvKiAweDE4LTB4MUIgKi8KKwkweEUzLCAweEM0LCAweEYwLCAweEYxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweEU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweEZBLCAweEVFLCAweEM0LCAweEQ5LCAweERFLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVCLCAweEEyLCAweEVCLCAweEEzLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZDLCAweEMyLCAweEVBLCAweEJCLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweEU4LCAweEFCLCAweERFLCAweEUyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweEVELCAweEVGLCAweDAwLCAweDAwLCAweEU4LCAweEEzLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENGLCAweEYxLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweEQ0LCAweEJDLCAweDAwLCAweDAwLCAweEZDLCAweEVBLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweEU3LCAweEJFLCAweDAwLCAweDAwLCAweEZDLCAweEYyLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweEQ2LCAweEI0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweEUyLCAweEFFLCAweDAwLCAweDAwLCAweEQzLCAweEI3LCAweEZBLCAweENDLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweEZBLCAweERDLCAweDAwLCAweDAwLCAweEVELCAweEI1LCAweEUxLCAweEUzLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweEFDLCAweDAwLCAweDAwLCAweEU4LCAweERELCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVGLCAweEU5LCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweEY0LCAweEJELCAweDAwLCAweDAwLCAweENGLCAweEI4LCAweEU5LCAweERCLCAvKiAweDk0LTB4OTcgKi8KKwkweEQxLCAweEFDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERBLCAweEM3LCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVCLCAweEM5LCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweENDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweERFLCAweEI3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ2LCAweEJDLCAweEQzLCAweEU1LCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweEZBLCAweERELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweERBLCAweEQ2LCAweDAwLCAweDAwLCAweENBLCAweEIxLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweERBLCAweEM4LCAweERGLCAweEE2LCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweEY5LCAweEIzLCAweEYyLCAweEQyLCAweDAwLCAweDAwLCAweENBLCAweEM0LCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENFLCAweENCLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweENELCAweEY1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweEZELCAweEIwLCAweEQ1LCAweEE4LCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweEYxLCAweEMxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweEU5LCAvKiAweEUwLTB4RTMgKi8KKwkweERDLCAweENBLCAweEVDLCAweEI0LCAweEZBLCAweEMwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweEZCLCAweEE4LCAweEQwLCAweEE4LCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweERBLCAweEVDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ5LCAweEVFLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweEZCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweEVGLCAweEVBLCAweEZBLCAweERFLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183NFs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4RTAsIDB4QzQsIDB4MDAsIDB4MDAsIDB4Q0YsIDB4QjksIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4RDUsIDB4Q0EsIDB4RDcsIDB4RTIsIDB4RTIsIDB4QUYsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4RDcsIDB4QjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4Q0QsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjYsIDB4REEsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4RUYsIDB4QTIsIDB4RTIsIDB4REEsIDB4RjYsIDB4RkMsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4RkIsIDB4RDAsIDB4RDEsIDB4QUQsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4Q0QsIDB4RTQsIDB4MDAsIDB4MDAsIDB4RDEsIDB4QUUsIDB4REMsIDB4RUQsIC8qIDB4MjgtMHgyQiAqLworCTB4RTgsIDB4Q0UsIDB4MDAsIDB4MDAsIDB4RjAsIDB4RjksIDB4Q0UsIDB4QjUsIC8qIDB4MkMtMHgyRiAqLworCTB4RTYsIDB4RkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDcsIDB4RkIsIC8qIDB4MzAtMHgzMyAqLworCTB4RDAsIDB4RDYsIDB4REQsIDB4RjUsIDB4RjcsIDB4RjEsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4RjYsIDB4RkQsIDB4MDAsIDB4MDAsIDB4REIsIDB4RjcsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkIsIDB4RUEsIC8qIDB4M0MtMHgzRiAqLworCTB4RTksIDB4REMsIDB4RDksIDB4QzEsIDB4MDAsIDB4MDAsIDB4RjUsIDB4RjIsIC8qIDB4NDAtMHg0MyAqLworCTB4RTAsIDB4QzUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4RDQsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4RjksIDB4QzIsIDB4MDAsIDB4MDAsIDB4RUEsIDB4QkMsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4RDIsIDB4QzUsIDB4RkIsIDB4RDEsIDB4RTcsIDB4QzAsIC8qIDB4NTgtMHg1QiAqLworCTB4RUIsIDB4QTUsIDB4MDAsIDB4MDAsIDB4REYsIDB4RkEsIDB4RTMsIDB4QTIsIC8qIDB4NUMtMHg1RiAqLworCTB4RDcsIDB4QjksIDB4MDAsIDB4MDAsIDB4RTksIDB4QzMsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4RTgsIDB4RkQsIDB4RTgsIDB4QUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4RjIsIDB4RDMsIDB4RkIsIDB4QTksIDB4RDgsIDB4QTUsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDUsIDB4Q0IsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDAsIDB4QzgsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDEsIDB4QUYsIDB4RDcsIDB4RTMsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4QzYsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4RDYsIDB4QTIsIDB4MDAsIDB4MDAsIDB4RUQsIDB4RjAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4RDcsIDB4RjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4RkMsIDB4RDQsIDB4MDAsIDB4MDAsIDB4REEsIDB4RDcsIDB4Q0MsIDB4REYsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4RjIsIDB4RDQsIDB4MDAsIDB4MDAsIDB4RDEsIDB4QjAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4Q0MsIDB4RTAsIDB4MDAsIDB4MDAsIDB4REIsIDB4RkQsIC8qIDB4QTQtMHhBNyAqLworCTB4RjMsIDB4QkYsIDB4MDAsIDB4MDAsIDB4RjAsIDB4RDEsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4RkMsIDB4QkIsIDB4MDAsIDB4MDAsIDB4RTIsIDB4QjAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4RTYsIDB4QTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4REIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4REYsIDB4REUsIDB4MDAsIDB4MDAsIDB4RTAsIDB4QzcsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjIsIDB4RUYsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0MsIDB4RTEsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDYsIDB4RUEsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4RTcsIDB4QzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4Q0UsIDB4QjYsIDB4MDAsIDB4MDAsIDB4RjMsIDB4QzAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4Q0QsIDB4RkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4RkIsIDB4RDIsIDB4MDAsIDB4MDAsIDB4RjgsIDB4RjgsIDB4RjcsIDB4RkIsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4QkYsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4QjcsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4QjYsIC8qIDB4RjQtMHhGNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzc1WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHhEQywgMHhCQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHhDQywgMHhCNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHhGMSwgMHhGNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHhFOCwgMHhCOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHhDQSwgMHhGNiwgMHgwMCwgMHgwMCwgMHhFNCwgMHhBNCwgMHhGNCwgMHhENiwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERiwgMHhFNiwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERiwgMHhBNywgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhERiwgMHhFNywgMHhFMSwgMHhDMSwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHhFOSwgMHhDNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQywgMHhDQiwgLyogMHgyOC0weDJCICovCisJMHhFOSwgMHhDNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHhFRiwgMHhBMywgMHhFQiwgMHhBNiwgMHhDQiwgMHhBMywgMHhFMywgMHhFOSwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMSwgMHhGQiwgLyogMHgzNC0weDM3ICovCisJMHhFRiwgMHhBNCwgMHgwMCwgMHgwMCwgMHhFRiwgMHhFQiwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMCwgMHhCNCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHhDRCwgMHhBMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOCwgMHhFNiwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHhFRiwgMHhBNSwgMHgwMCwgMHgwMCwgMHhEMywgMHhDQywgLyogMHg1MC0weDUzICovCisJMHhEQSwgMHhFRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhENywgMHhCQSwgMHgwMCwgMHgwMCwgMHhGMiwgMHhENSwgLyogMHg1OC0weDVCICovCisJMHhGNSwgMHhFNSwgMHhEOSwgMHhFRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOSwgMHhCNCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHhENSwgMHhENCwgMHhGRCwgMHhDRiwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQiwgMHhFMywgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMSwgMHhFMSwgLyogMHg2Qy0weDZGICovCisJMHhFQywgMHhCNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHhGQiwgMHhGRSwgMHhEMywgMHhENywgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHhEMSwgMHhCMSwgMHgwMCwgMHgwMCwgMHhDQiwgMHhCMSwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMSwgMHhCMiwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQiwgMHhCMiwgMHhGMSwgMHhDMiwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNCwgMHhFMSwgMHhGOSwgMHhCNSwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhDMywgMHhFMSwgMHhDMiwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHhFQiwgMHhGNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHhERiwgMHhBOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHhDQiwgMHhDQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhCOSwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHhGOCwgMHhERSwgMHhGOSwgMHhBQSwgMHhDQSwgMHhGNywgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHhFRCwgMHhCNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHhEMywgMHhCOCwgMHhGMiwgMHhENiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHhENCwgMHhEOSwgMHhFRSwgMHhDNSwgMHhGMiwgMHhGMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQSwgMHhCMiwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHhEQywgMHhCQiwgMHgwMCwgMHgwMCwgMHhGMSwgMHhGOCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHhFQywgMHhCNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhDQSwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHhGNiwgMHhDMCwgMHhGRCwgMHhERCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHhENCwgMHhFMywgMHhDQywgMHhFMiwgMHgwMCwgMHgwMCwgMHhGNywgMHhENCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENywgMHhFNSwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHhEMywgMHhDMywgMHgwMCwgMHgwMCwgMHhEOCwgMHhBNiwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHhGNiwgMHhDMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERCwgMHhGNiwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHhDRCwgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNzZbNTEyXSA9IHsKKwkweEU1LCAweERDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweENCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweEM0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweEIwLCAvKiAweDFDLTB4MUYgKi8KKwkweEY0LCAweEIwLCAweEYzLCAweEVBLCAweERBLCAweEVFLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweEQ3LCAweEJCLCAweDAwLCAweDAwLCAweEUyLCAweEIxLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ3LCAweEFBLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ2LCAweEZCLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweEU0LCAweERGLCAweDAwLCAweDAwLCAweENBLCAweEQ2LCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVCLCAweEE4LCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERCLCAweEZFLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweEY2LCAweEMyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweEVGLCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweEQ0LCAweEZELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweEUwLCAweEM4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweEU4LCAweEI5LCAweDAwLCAweDAwLCAweEVGLCAweEE2LCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweENELCAweEE0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ0LCAweEY0LCAvKiAweDc4LTB4N0IgKi8KKwkweERCLCAweEExLCAweERCLCAweERDLCAweERCLCAweERELCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweEVFLCAweERDLCAweDAwLCAweDAwLCAweENCLCAweENCLCAweEZDLCAweEQ1LCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENFLCAweEVCLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweENELCAweEMxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZCLCAweEQzLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY5LCAweEFCLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY1LCAweEQ0LCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ5LCAweEE5LCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweERELCAweERCLCAweENELCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERELCAweENFLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweEU3LCAweEMzLCAweDAwLCAweDAwLCAweEVDLCAweENDLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY5LCAweEVDLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENCLCAweENDLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEZDLCAvKiAweEQ4LTB4REIgKi8KKwkweEQ0LCAweEE4LCAweDAwLCAweDAwLCAweEVELCAweEQzLCAweEQ4LCAweEVGLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweEYyLCAweEQ3LCAweDAwLCAweDAwLCAweENBLCAweEY4LCAvKiAweEUwLTB4RTMgKi8KKwkweERBLCAweEVGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ2LCAweEQ0LCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ5LCAweENELCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ4LCAweEVFLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweEYyLCAweEMxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweERGLCAweEQzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweERBLCAweEYwLCAweDAwLCAweDAwLCAweEUyLCAweEVBLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183N1s1MTJdID0geworCTB4MDAsIDB4MDAsIDB4RTAsIDB4RkQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4RDgsIDB4RjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4RjcsIDB4QUYsIDB4REEsIDB4QjYsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4RDcsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjIsIDB4RDgsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4RDgsIDB4RjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4RkEsIDB4REYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0YsIDB4RUYsIC8qIDB4MzQtMHgzNyAqLworCTB4RDksIDB4QzIsIDB4MDAsIDB4MDAsIDB4RjAsIDB4RDIsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4RTQsIDB4RDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4RjMsIDB4QjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4RkEsIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUYsIDB4RUMsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4QjIsIDB4MDAsIDB4MDAsIDB4RDQsIDB4QkQsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDksIDB4Q0UsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjQsIDB4RTIsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4RDQsIDB4QTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0QsIDB4QzIsIDB4RTcsIDB4REEsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjIsIDB4RDksIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4RDksIDB4QUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDgsIDB4QkUsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4REMsIDB4QUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4RTIsIDB4RUIsIDB4RDYsIDB4RkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4Q0EsIDB4RjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDQsIDB4REEsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjQsIDB4RDcsIC8qIDB4QjgtMHhCQiAqLworCTB4Q0MsIDB4QTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0YsIDB4QkEsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjUsIDB4QjgsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDksIDB4QzMsIC8qIDB4RDgtMHhEQiAqLworCTB4RDAsIDB4RTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4QzUsIDB4RUIsIDB4RjgsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4RjIsIDB4QjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4Q0YsIDB4QkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4RDMsIDB4QUQsIDB4RTgsIDB4RTEsIDB4Q0UsIDB4RUMsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4QjQsIC8qIDB4RjAtMHhGMyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzc4WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERSwgMHhFMywgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERCwgMHhGNywgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhGMiwgMHhCMiwgMHhGMywgMHhGNiwgMHhGNiwgMHhEQiwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHhENywgMHhGRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOCwgMHhERiwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHhGNywgMHhGMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHhEMCwgMHhBOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhEQSwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHhGNSwgMHhBNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENywgMHhCQywgLyogMHg2OC0weDZCICovCisJMHhDQywgMHhFMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhEQiwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHhERCwgMHhERCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHhEMSwgMHhCMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRiwgMHhFRCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHhENiwgMHhERSwgMHhFNCwgMHhGNCwgMHhFMSwgMHhFRiwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHhERCwgMHhGOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOCwgMHhDRiwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQSwgMHhFNSwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQywgMHhBMSwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHhCNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQywgMHhBQywgMHhGQywgMHhBRCwgLyogMHhCOC0weEJCICovCisJMHhEOCwgMHhBNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHhFRCwgMHhCOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHhEQiwgMHhCNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENiwgMHhGMCwgMHhGMywgMHhBRiwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRCwgMHhBNSwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHhEQSwgMHhGMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHhEOCwgMHhBOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHhDQywgMHhFNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMSwgMHhCNCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHhDQSwgMHhEOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQSwgMHhGMiwgLyogMHhGOC0weEZCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNzlbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweEY1LCAweEE3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY1LCAweEE4LCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweEE2LCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ1LCAweEVDLCAweEQ1LCAweEY4LCAvKiAweDI4LTB4MkIgKi8KKwkweERBLCAweEYzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweEM2LCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERFLCAweEU0LCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweERFLCAweEU1LCAweEQxLCAweEI1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQxLCAweEI2LCAvKiAweDQ0LTB4NDcgKi8KKwkweEQxLCAweEI3LCAweEYyLCAweEIzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweEU5LCAweERFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYwLCAweEQzLCAweEYyLCAweEI0LCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYwLCAweEQ0LCAweENCLCAweEU0LCAvKiAweDU4LTB4NUIgKi8KKwkweEZCLCAweEQ0LCAweEY1LCAweEU2LCAweEUzLCAweEVBLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweERFLCAweEU2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweERGLCAweEQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweEY4LCAweEY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweEYwLCAweEFFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQxLCAweEI4LCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ2LCAweERGLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweEQwLCAweEQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweEZDLCAweEExLCAweEVGLCAweEVFLCAweERDLCAweEQ4LCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweERGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweERELCAweEZELCAweEZCLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEM5LCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ2LCAweEM5LCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweEQ0LCAweEFBLCAweDAwLCAweDAwLCAweEU1LCAweENDLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweEUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweEQwLCAweEQ4LCAweEZDLCAweEEyLCAweEQ0LCAweEJFLCAvKiAweEJDLTB4QkYgKi8KKwkweEUyLCAweEIzLCAweERFLCAweEU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweERDLCAweEJDLCAweEQyLCAweEI2LCAweEY1LCAweEQ1LCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweENFLCAweEExLCAweEY1LCAweEE5LCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweERELCAweEY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweERELCAweEZBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYwLCAweEQ1LCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweEY2LCAweERGLCAweDAwLCAweDAwLCAweEYyLCAweERBLCAweEU0LCAweEVCLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweEYyLCAweEYxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVDLCAweEI5LCAvKiAweEY4LTB4RkIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183QVs1MTJdID0geworCTB4RkQsIDB4RkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4RTEsIDB4QUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4Q0EsIDB4RDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUYsIDB4RUYsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4RjUsIDB4QUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4RUMsIDB4RjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjgsIDB4QUQsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4RjIsIDB4QzIsIDB4RjYsIDB4QzMsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4RDcsIDB4RDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjksIDB4QTIsIC8qIDB4MUMtMHgxRiAqLworCTB4RjAsIDB4RDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjAsIDB4RkEsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4RjYsIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4RjMsIDB4RjIsIDB4QzMsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDQsIDB4QUIsIC8qIDB4MzgtMHgzQiAqLworCTB4Q0EsIDB4QjMsIDB4Q0QsIDB4QTYsIDB4MDAsIDB4MDAsIDB4Q0QsIDB4QzMsIC8qIDB4M0MtMHgzRiAqLworCTB4Q0QsIDB4REEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDksIDB4Q0YsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4RjYsIDB4QzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4REQsIDB4RTcsIDB4QzQsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4QjQsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4REYsIDB4RTIsIDB4RTcsIDB4REIsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4QjEsIDB4MDAsIDB4MDAsIDB4RkMsIDB4QUUsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4RTUsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4RkEsIDB4RUIsIDB4MDAsIDB4MDAsIDB4Q0YsIDB4QkMsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4Q0YsIDB4RTIsIDB4Q0QsIDB4RjYsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4RUYsIDB4RjAsIDB4MDAsIDB4MDAsIDB4RjQsIDB4QkUsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4RDQsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4RjMsIDB4QjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4RTksIDB4QTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjIsIDB4RjIsIDB4RjMsIDB4RUIsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4RjAsIDB4RDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4Q0YsIDB4RDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0YsIDB4REYsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4QzAsIDB4RTgsIDB4QzEsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0YsIDB4RTMsIDB4RTksIDB4QTIsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDAsIDB4QUEsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4RjMsIDB4QzEsIDB4RDAsIDB4QUIsIDB4MDAsIDB4MDAsIDB4RDQsIDB4RTQsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUYsIDB4QkMsIDB4RDgsIDB4QTEsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDksIDB4REYsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4RjMsIDB4RDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4REMsIDB4QkQsIDB4MDAsIDB4MDAsIDB4Q0MsIDB4RTUsIC8qIDB4REMtMHhERiAqLworCTB4RUQsIDB4RjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjEsIDB4RTIsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4RDQsIDB4REIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4QjUsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4Q0EsIDB4RTYsIDB4MDAsIDB4MDAsIDB4RDMsIDB4QUUsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0MsIDB4RTYsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4RjEsIDB4RDMsIDB4RjUsIDB4RTcsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4REEsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzdCWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQiwgMHhFRSwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHhDNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHhERiwgMHhFOSwgMHgwMCwgMHgwMCwgMHhFRSwgMHhERSwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNywgMHhDMiwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHhEOCwgMHhBMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERCwgMHhBQywgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHhGMCwgMHhBRiwgMHhENiwgMHhCRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHhBQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOSwgMHhCNiwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHhENCwgMHhGNSwgMHgwMCwgMHgwMCwgMHhEMCwgMHhDOSwgLyogMHg0OC0weDRCICovCisJMHhFRiwgMHhBNywgMHhFMiwgMHhFQywgMHgwMCwgMHgwMCwgMHhEQiwgMHhFQSwgLyogMHg0Qy0weDRGICovCisJMHhDRSwgMHhDQywgMHhGNSwgMHhFOCwgMHhGNywgMHhENSwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHhEMywgMHhDRCwgMHgwMCwgMHgwMCwgMHhGMywgMHhGRSwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHhEMCwgMHhCNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHhFMCwgMHhGRSwgMHgwMCwgMHgwMCwgMHhERiwgMHhGQiwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHhFNiwgMHhERCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHhFOCwgMHhBNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQiwgMHhDRCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRiwgMHhBOCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHhCNCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHhEQSwgMHhEOCwgMHhEMSwgMHhCOSwgMHgwMCwgMHgwMCwgMHhERiwgMHhBOSwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMywgMHhCMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHhDQywgMHhDNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHhDRSwgMHhCNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHhFRiwgMHhBOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHhERiwgMHhENSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHhFRCwgMHhENywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHhFRSwgMHhDNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHhFRiwgMHhCRCwgMHhGQywgMHhENiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHhEQiwgMHhGNCwgMHgwMCwgMHgwMCwgMHhFRiwgMHhBQSwgMHhGOCwgMHhCOSwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHhGNSwgMHhFOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHhEOSwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHhFMSwgMHhDNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHhENCwgMHhCRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHhERSwgMHhFOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfN0NbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYwLCAweEVBLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYzLCAweEMyLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQzLCAweEFGLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweENBLCAweERCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZDLCAweEQ3LCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweEQ4LCAweEUxLCAweEM3LCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweEY0LCAweEQ4LCAweEQ2LCAweEIzLCAweERELCAweEFELCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ1LCAweEJFLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweEYxLCAweEMzLCAweEVFLCAweERGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweEQ2LCAweEVCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweEY0LCAweEQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweEQ3LCAweEU2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERBLCAweEI3LCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERELCAweEZCLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweERELCAweENGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ4LCAweEEzLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweERBLCAweEQ5LCAweDAwLCAweDAwLCAweEYwLCAweEQ4LCAvKiAweDk0LTB4OTcgKi8KKwkweEVGLCAweEM0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEQ4LCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweEYxLCAweEQ0LCAweDAwLCAweDAwLCAweEVELCAweEYyLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ1LCAweERCLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweEQ1LCAweERDLCAweEYzLCAweEM0LCAweENCLCAweEQ3LCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweEUyLCAweEI2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVGLCAweEYxLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZCLCAweEQ1LCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQzLCAweEQ4LCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERELCAweEQwLCAweEYwLCAweEQ5LCAvKiAweERDLTB4REYgKi8KKwkweENCLCAweEIzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ1LCAweERELCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENELCAweEE3LCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQwLCAweEFDLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183RFs1MTJdID0geworCTB4RDEsIDB4QkEsIDB4MDAsIDB4MDAsIDB4RjEsIDB4QzQsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4RTUsIDB4QjMsIDB4RkIsIDB4RjUsIDB4RTksIDB4RTEsIDB4RkQsIDB4RTAsIC8qIDB4MDQtMHgwNyAqLworCTB4RkMsIDB4QkMsIDB4MDAsIDB4MDAsIDB4REEsIDB4QTIsIDB4REEsIDB4QTMsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4RDIsIDB4QTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4RDIsIDB4RUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4RTIsIDB4RUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REUsIDB4RTksIC8qIDB4MTQtMHgxNyAqLworCTB4Q0UsIDB4REMsIDB4RjIsIDB4QjUsIDB4RDAsIDB4RTQsIDB4REQsIDB4RDEsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4RTEsIDB4QzgsIDB4REIsIDB4QjcsIDB4REYsIDB4RTMsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4QjksIC8qIDB4MjgtMHgyQiAqLworCTB4RjEsIDB4QzUsIDB4MDAsIDB4MDAsIDB4RjMsIDB4Q0YsIDB4RDcsIDB4QUIsIC8qIDB4MkMtMHgyRiAqLworCTB4RTEsIDB4QUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4RUIsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4QzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4RTEsIDB4QzksIDB4Q0EsIDB4RkEsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjAsIDB4RkIsIDB4RkEsIDB4RTEsIC8qIDB4NDAtMHg0MyAqLworCTB4RjAsIDB4REEsIDB4Q0MsIDB4RTcsIDB4REEsIDB4RjQsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4Q0MsIDB4QkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4RUQsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4RDUsIDB4QTksIDB4RkEsIDB4RTIsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDAsIDB4RTUsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4RUIsIDB4RDYsIDB4MDAsIDB4MDAsIDB4RUMsIDB4REYsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REYsIDB4RkMsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4RjcsIDB4RDYsIDB4REUsIDB4RUEsIDB4Q0IsIDB4QjQsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUYsIDB4QkUsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4Q0MsIDB4QjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0YsIDB4QkQsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUYsIDB4RjIsIDB4RTIsIDB4QjcsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0MsIDB4RTgsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4RjAsIDB4RkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4RDYsIDB4RTAsIDB4MDAsIDB4MDAsIDB4RjEsIDB4QzYsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4RTIsIDB4QjgsIDB4RUIsIDB4QUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4Q0IsIDB4QjUsIDB4RDgsIDB4RDEsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4RjQsIDB4Q0UsIDB4RjMsIDB4RjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4RDcsIDB4QzYsIDB4MDAsIDB4MDAsIDB4RDEsIDB4QkIsIDB4RjcsIDB4QUEsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4RUQsIDB4Q0EsIDB4RDcsIDB4RDMsIDB4RDgsIDB4RkEsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjYsIDB4QzUsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDEsIDB4Q0MsIDB4REQsIDB4RkMsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REYsIDB4RkQsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4RjksIDB4RTUsIDB4MDAsIDB4MDAsIDB4RTAsIDB4Q0EsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4RjIsIDB4RkQsIDB4RDMsIDB4QjAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4RjQsIDB4RjMsIDB4REEsIDB4QzksIDB4MDAsIDB4MDAsIDB4RTYsIDB4REUsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4RjgsIDB4QkEsIDB4RTgsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4RDgsIDB4RkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4RDUsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4RDYsIDB4QTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjYsIDB4QzYsIC8qIDB4RjgtMHhGQiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzdFWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHhGMiwgMHhEQiwgMHhFNCwgMHhGQywgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHhFOCwgMHhCMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQSwgMHhEQSwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHhGMiwgMHhEQywgMHhGQiwgMHhENiwgMHhFOSwgMHhCMiwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHhFRSwgMHhBRCwgMHgwMCwgMHgwMCwgMHhGQSwgMHhFMywgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQywgMHhFRSwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNSwgMHhFQSwgMHhFNiwgMHhFMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHhGMCwgMHhGRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENywgMHhBQywgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHhGNSwgMHhDNSwgMHhFRSwgMHhFMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHhEQiwgMHhFNSwgMHgwMCwgMHgwMCwgMHhERCwgMHhERSwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOSwgMHhGMCwgMHhFOSwgMHhBMywgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMSwgMHhGOSwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHhGMiwgMHhDNCwgMHhFMCwgMHhDQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhBNCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHhCOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHhCMSwgMHhGQywgMHhFQiwgMHhDRCwgMHhBOCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHhDQywgMHhCNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHhGMCwgMHhEQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHhFNiwgMHhCQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHhDRCwgMHhBOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMywgMHhDMywgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHhFMSwgMHhEOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRiwgMHhBQiwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHhDNSwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhFOSwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHhGMywgMHhDNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENCwgMHhDMCwgLyogMHg5OC0weDlCICovCisJMHhENSwgMHhCRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfN0ZbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERELCAweEFFLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweEY5LCAweEZDLCAweDAwLCAweDAwLCAweENDLCAweEMwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweEU1LCAweEEyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweENFLCAweEI4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweEQ4LCAweEQyLCAweEY5LCAweEQ2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYxLCAweEFBLCAweENFLCAweEQxLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY2LCAweEM3LCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweERCLCAweEVCLCAweDAwLCAweDAwLCAweERGLCAweEZFLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweEQ4LCAweEUxLCAweDAwLCAweDAwLCAweEY3LCAweEYzLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweEQ3LCAweEU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweEQ0LCAweEZFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweEQxLCAweEJDLCAweDAwLCAweDAwLCAweEU1LCAweENGLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweENCLCAweEI2LCAweDAwLCAweDAwLCAweERBLCAweEI4LCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweENELCAweEM0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ2LCAweEJFLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweEJBLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweENGLCAweEQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweEUwLCAweENDLCAweEVCLCAweEY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZELCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweEQ3LCAweEU4LCAweENCLCAweEQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweEUyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweEJBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweEUzLCAweEM3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVDLCAweENELCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweEVDLCAweENFLCAweDAwLCAweDAwLCAweEQ2LCAweEJGLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweEE3LCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweERGLCAweEQ2LCAweEZELCAweEU4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweEUxLCAvKiAweERDLTB4REYgKi8KKwkweEY2LCAweEE4LCAweERELCAweEZELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweEY4LCAweEJCLCAweDAwLCAweDAwLCAweEU4LCAweEQxLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweEY5LCAweEQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweENFLCAweEVFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweEVDLCAweENGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184MFs1MTJdID0geworCTB4RTksIDB4QTUsIDB4RDYsIDB4RDUsIDB4MDAsIDB4MDAsIDB4Q0QsIDB4QzUsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4RUQsIDB4QkEsIDB4RDEsIDB4QkQsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4Q0YsIDB4QkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4RUMsIDB4QkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4RDIsIDB4QjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4Q0MsIDB4RTksIDB4MDAsIDB4MDAsIDB4RDksIDB4QzQsIC8qIDB4MTQtMHgxNyAqLworCTB4RTksIDB4RkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4RDEsIDB4QkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUMsIDB4QkMsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4QUQsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4RjcsIDB4QjAsIDB4MDAsIDB4MDAsIDB4Q0MsIDB4RUEsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDMsIDB4QzQsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDYsIDB4QzAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDYsIDB4RkQsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4QTEsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4REUsIDB4QkQsIDB4MDAsIDB4MDAsIDB4RjYsIDB4QTksIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REEsIDB4QTQsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDYsIDB4QTQsIC8qIDB4NkMtMHg2RiAqLworCTB4RjUsIDB4QzYsIDB4MDAsIDB4MDAsIDB4RTEsIDB4QTIsIDB4RTksIDB4QzYsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjIsIDB4QzUsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4RjQsIDB4RTksIDB4RDYsIDB4RUMsIDB4RUIsIDB4RDMsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4RUMsIDB4QkQsIDB4RTIsIDB4REMsIDB4REUsIDB4RUIsIDB4RjAsIDB4REMsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4RUIsIDB4QkYsIDB4MDAsIDB4MDAsIDB4RDcsIDB4Q0UsIC8qIDB4ODgtMHg4QiAqLworCTB4RDEsIDB4QkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjUsIDB4QUIsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjksIDB4RkQsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4Q0EsIDB4REMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4Q0QsIDB4QzYsIDB4RjIsIDB4QjYsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4REQsIDB4RkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4Q0MsIDB4QjcsIDB4REIsIDB4QjgsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDAsIDB4RTksIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4Q0UsIDB4REQsIDB4RUIsIDB4QzAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4RkQsIDB4QTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjgsIDB4Q0IsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4RDYsIC8qIDB4QzAtMHhDMyAqLworCTB4RjEsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4REIsIDB4Q0UsIDB4MDAsIDB4MDAsIDB4RjcsIDB4QzMsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REIsIDB4Q0YsIDB4Q0IsIDB4QTQsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjgsIDB4RTAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4RkIsIDB4RDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4RUIsIDB4Q0EsIDB4RTAsIDB4QTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4Q0UsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4RDQsIDB4REMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4RkQsIDB4RDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4RDIsIDB4RjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzgxWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMiwgMHhCNywgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHhGQSwgMHhGNiwgMHhGNiwgMHhBQSwgMHhGQSwgMHhGNywgLyogMHgwNC0weDA3ICovCisJMHhEOCwgMHhFNiwgMHgwMCwgMHgwMCwgMHhGNCwgMHhCMSwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHhFOCwgMHhEMiwgMHgwMCwgMHgwMCwgMHhDQSwgMHhDNSwgMHhDQywgMHhFQiwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHhFRSwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHhCQiwgMHgwMCwgMHgwMCwgMHhGNywgMHhBRCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOCwgMHhFMSwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHhGMywgMHhFQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERSwgMHhBMSwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhGRCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHhFQywgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHhERCwgMHhBRiwgMHhERCwgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHhDQiwgMHhCNywgMHhFOCwgMHhEMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHhBMywgMHhEMiwgMHhFMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMCwgMHhGRSwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHhFOSwgMHhBNiwgMHhDQiwgMHhGMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHhFRCwgMHhGMywgMHhEQywgMHhEOSwgMHhFMCwgMHhDRCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNywgMHhEQSwgLyogMHg3Qy0weDdGICovCisJCisJMHhEQiwgMHhCOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHhDQywgMHhBRSwgMHgwMCwgMHgwMCwgMHhEQSwgMHhEQiwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRCwgMHhDNywgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERCwgMHhCMSwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHhEOCwgMHhBRiwgMHhFMywgMHhBMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHhDRSwgMHhFRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMiwgMHhGMywgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHhGOCwgMHhCMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhDRSwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHhGNSwgMHhGRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQiwgMHhFQywgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHhEMywgMHhDNSwgMHhGQywgMHhFQywgMHhEMiwgMHhEQiwgLyogMHhCQy0weEJGICovCisJMHhENCwgMHhFQiwgMHgwMCwgMHgwMCwgMHhERSwgMHhBMiwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhFNiwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHhGMCwgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHhENSwgMHhDNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHhGNCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHhFRCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHhFOCwgMHhDMiwgMHgwMCwgMHgwMCwgMHhFRCwgMHhGNSwgLyogMHhFNC0weEU3ICovCisJMHhENywgMHhGQywgMHgwMCwgMHgwMCwgMHhFRCwgMHhCQiwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHhGNiwgMHhBQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMiwgMHhCOCwgLyogMHhGMC0weEYzICovCisJMHhGNiwgMHhDOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMywgMHhFNiwgMHhGMiwgMHhERCwgLyogMHhGOC0weEZCICovCisJMHhDRiwgMHhCRiwgMHgwMCwgMHgwMCwgMHhFQiwgMHhBQywgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfODJbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweENGLCAweEMwLCAweDAwLCAweDAwLCAweEU2LCAweEE4LCAvKiAweDA0LTB4MDcgKi8KKwkweEZELCAweEU5LCAweDAwLCAweDAwLCAweENGLCAweEMxLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweEUwLCAweERGLCAweERFLCAweEVDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEEyLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY0LCAweEJGLCAvKiAweDE4LTB4MUIgKi8KKwkweEUyLCAweEVGLCAweDAwLCAweDAwLCAweEQ5LCAweEYxLCAweEYxLCAweEM3LCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweENCLCAweEI4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY5LCAweEZFLCAweERCLCAweEJBLCAvKiAweDI4LTB4MkIgKi8KKwkweERBLCAweEY1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweEY2LCAweEVDLCAweERBLCAweERDLCAweEZBLCAweEU0LCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweENGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweERELCAweEIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweEU2LCAweEE5LCAweDAwLCAweDAwLCAweEVGLCAweEYzLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweEYzLCAweEVELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweEVCLCAweEZBLCAweDAwLCAweDAwLCAweEY5LCAweEU2LCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENBLCAweERELCAweEQ1LCAweERFLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweENBLCAweERFLCAweERGLCAweEU0LCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweEZELCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweEY1LCAweEFDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweEY1LCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweEUzLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweEVELCAweENCLCAweENGLCAweEU0LCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ4LCAweEQzLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweERELCAweEIzLCAweEQ0LCAweEVDLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweEYyLCAweEI5LCAweDAwLCAweDAwLCAweERGLCAweEI3LCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweENCLCAweENFLCAweEZCLCAweEQ4LCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweEQwLCAweEQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweERELCAweEQyLCAweEY3LCAweEY0LCAweEU3LCAweERDLCAweEU0LCAweEE1LCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweEZDLCAweEEzLCAweDAwLCAweDAwLCAweERCLCAweEJCLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYyLCAweEJBLCAvKiAweEI0LTB4QjcgKi8KKwkweEU5LCAweEZELCAweEQwLCAweENBLCAweDAwLCAweDAwLCAweEY1LCAweEQ2LCAvKiAweEI4LTB4QkIgKi8KKwkweEQ5LCAweEM1LCAweEU0LCAweEI0LCAweDAwLCAweDAwLCAweEVELCAweEE3LCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweEVBLCAweEJELCAweEU2LCAweEZFLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweEY3LCAweEM0LCAweEY1LCAweEFELCAweDAwLCAweDAwLCAweEQ5LCAweEUwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENBLCAweEI0LCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY4LCAweEUyLCAweENGLCAweEMyLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweEVDLCAweEJFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweEI0LCAweENELCAweEM4LCAweEVFLCAweEM4LCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweEU3LCAweEM4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweENELCAweEM5LCAweEY5LCAweEI3LCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184M1s1MTJdID0geworCTB4MDAsIDB4MDAsIDB4RjEsIDB4RTgsIDB4RDksIDB4RjIsIDB4REIsIDB4RjUsIC8qIDB4MDAtMHgwMyAqLworCTB4Q0EsIDB4QjUsIDB4RDksIDB4QzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4RDgsIDB4QzksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDksIDB4QUIsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4RUQsIDB4QkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDgsIDB4RDQsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REMsIDB4REEsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4QkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4RkMsIDB4RUQsIDB4RUMsIDB4RTAsIDB4RDIsIDB4RkUsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4RTksIDB4QzcsIDB4RTYsIDB4QUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4RTIsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkEsIDB4QkIsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4RjUsIDB4QUUsIDB4RkIsIDB4QUEsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUMsIDB4RkIsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4RUMsIDB4QkYsIDB4RkMsIDB4RDgsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDQsIDB4RTUsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjksIDB4QzMsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4RTIsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4RDcsIDB4RTksIDB4RUQsIDB4RjYsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REUsIDB4RUQsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0MsIDB4RUMsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4RTMsIDB4RUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4RDQsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkEsIDB4RjgsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4REQsIDB4QjQsIDB4RTQsIDB4QjUsIDB4RDgsIDB4QjAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4RDgsIDB4RDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4RjQsIDB4RUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4Q0UsIDB4QjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4RDYsIDB4RTEsIDB4Q0YsIDB4RDIsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4RDAsIDB4QjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4QTIsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjMsIDB4RUUsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4RjMsIDB4RjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4REMsIDB4Q0MsIDB4MDAsIDB4MDAsIDB4RDAsIDB4Q0IsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkMsIDB4QTQsIC8qIDB4RUMtMHhFRiAqLworCTB4Q0QsIDB4Q0EsIDB4RDcsIDB4RDQsIDB4REUsIDB4QTMsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4RTQsIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4QzksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4REQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzg0WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNSwgMHhGRSwgLyogMHgwMC0weDAzICovCisJMHhENCwgMHhBQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENSwgMHhEMSwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHhEOCwgMHhGMCwgMHhGOCwgMHhDMywgMHhFQSwgMHhENywgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHhGNSwgMHhENywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHhEOCwgMHhCRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHhGRCwgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHhFQiwgMHhBRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHhENSwgMHhBQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHhFNywgMHhBOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHhDQSwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQSwgMHhFNywgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHhGOCwgMHhFMywgMHgwMCwgMHgwMCwgMHhENCwgMHhERCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHhEOCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQiwgMHhEOSwgLyogMHg2OC0weDZCICovCisJMHhFRCwgMHhGNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhCNSwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHhEMCwgMHhBRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMSwgMHhGMSwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHhFMiwgMHhCRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHhFMywgMHhDOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHhEOSwgMHhENSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHhERiwgMHhBQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHhEQiwgMHhCQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOCwgMHhFNCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHhGMSwgMHhGQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhCNiwgLyogMHhCOC0weEJCICovCisJMHhGMywgMHhFRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQiwgMHhEQSwgLyogMHhCQy0weEJGICovCisJMHhFMSwgMHhFMCwgMHgwMCwgMHgwMCwgMHhEOSwgMHhBQywgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHhGNSwgMHhFQiwgMHgwMCwgMHgwMCwgMHhFMCwgMHhCNiwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHhDOCwgMHgwMCwgMHgwMCwgMHhDQiwgMHhDRiwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHhDOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHhERSwgMHhFRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHhCRSwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHhEQywgMHhFRiwgMHgwMCwgMHgwMCwgMHhENiwgMHhBNSwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHhFMiwgMHhGMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHhENiwgMHhGRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfODVbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweEQ5LCAweEExLCAweDAwLCAweDAwLCAweEQ4LCAweEMwLCAvKiAweDEwLTB4MTMgKi8KKwkweERDLCAweERCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweEJELCAvKiAweDE0LTB4MTcgKi8KKwkweERGLCAweEI4LCAweDAwLCAweDAwLCAweEVBLCAweEE1LCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ3LCAweEFELCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweEYzLCAweEY5LCAweDAwLCAweDAwLCAweEVELCAweEY4LCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweEY1LCAweEM3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweEUxLCAweENBLCAweEVCLCAweEUzLCAweDAwLCAweDAwLCAweEYyLCAweERFLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweEY4LCAweENDLCAweDAwLCAweDAwLCAweEVBLCAweEQ5LCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweEQzLCAweEM2LCAweDAwLCAweDAwLCAweERCLCAweEU2LCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweEY1LCAweEFGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENFLCAweEYwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweEZFLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweEZCLCAweEI2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweEYyLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweENGLCAweEYyLCAweEY3LCAweEI5LCAweEQ5LCAweEYzLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweENCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweERBLCAweERELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERBLCAweEI5LCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVCLCAweEZCLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweENCLCAweEI5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweEVELCAweEY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEUwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY0LCAweEMwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweEZELCAweEJDLCAweERGLCAweEIxLCAweEUzLCAweEVGLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEEzLCAvKiAweEFDLTB4QUYgKi8KKwkweEZELCAweEI5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYwLCAweEIxLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweENELCAweENCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweEVELCAweEJFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweEQ1LCAweEMwLCAweEUzLCAweEYwLCAweEVELCAweEZBLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweEU0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweEQ1LCAweEVELCAweEU3LCAweERELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweEQ0LCAweEY2LCAweEU1LCAweEI3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweERCLCAweEU3LCAweEUyLCAweEJGLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweENCLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ3LCAweEY0LCAweEYwLCAweERELCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENFLCAweEFCLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184Nls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4REUsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDYsIDB4RDYsIDB4RTEsIDB4Q0MsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4QjMsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4RUUsIDB4REMsIDB4QTIsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4RDUsIDB4QjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDUsIDB4QTEsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkIsIDB4REIsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4RjksIDB4Q0IsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4Q0IsIDB4RjMsIDB4RjQsIDB4QTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkEsIDB4QzgsIC8qIDB4NTgtMHg1QiAqLworCTB4RDYsIDB4RDcsIDB4MDAsIDB4MDAsIDB4RTksIDB4RTUsIDB4RkIsIDB4REMsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4RkIsIDB4RjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REEsIDB4QTUsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4REIsIDB4QkQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUMsIDB4RTIsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0QsIDB4RjcsIC8qIDB4QTAtMHhBMyAqLworCTB4RjAsIDB4REUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4RjYsIDB4QzksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REUsIDB4RUYsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDMsIDB4QjEsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4RkMsIDB4RUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4QzMsIDB4MDAsIDB4MDAsIDB4RjEsIDB4QzgsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4RjEsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4RjksIDB4RUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4RjIsIDB4RjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4QjYsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzg3WzUxMl0gPSB7CisJMHhGNSwgMHhCOSwgMHgwMCwgMHgwMCwgMHhEQywgMHhGMCwgMHhFMywgMHhGMSwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHhFOCwgMHhBNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHhGMiwgMHhCQiwgMHgwMCwgMHgwMCwgMHhERSwgMHhBNCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHhEQSwgMHhDQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQSwgMHhFOSwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHhEQSwgMHgwMCwgMHgwMCwgMHhGQywgMHhEOSwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHhEQSwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOSwgMHhDNCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHhFMywgMHhBNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHhGQiwgMHhERCwgMHgwMCwgMHgwMCwgMHhFRiwgMHhDQSwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHhFOCwgMHhDNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENSwgMHhDQywgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHhFQiwgMHhENywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOSwgMHhBRCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQiwgMHhBQiwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMywgMHhEOSwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENSwgMHhBMiwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHhGNiwgMHhERSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHhEQSwgMHhGNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHhFMCwgMHhEMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhBOCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNSwgMHhGOSwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHhGQSwgMHhBRiwgMHgwMCwgMHgwMCwgMHhFQiwgMHhGQywgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhFQSwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfODhbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweEUzLCAweEIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ1LCAweEM1LCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYxLCAweEUzLCAweEQ1LCAweEVFLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweENELCAweENDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweEQ5LCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ4LCAweEMxLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweEZBLCAweEVDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYxLCAweEVCLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweEZBLCAweEJDLCAweEU2LCAweEUyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZBLCAweEU1LCAweEUyLCAweEZBLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENBLCAweEI2LCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweEI3LCAweDAwLCAweDAwLCAweEVBLCAweERCLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweEY1LCAweEZBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweEZCLCAweEFDLCAweENGLCAweEMzLCAweEVCLCAweEZELCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweEY4LCAweEZBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERGLCAweEI5LCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweEUxLCAweEYxLCAweDAwLCAweDAwLCAweEQyLCAweEE0LCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY1LCAweEZCLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQwLCAweERBLCAweEQwLCAweERCLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweEVBLCAweEJFLCAweEQ5LCAweEIxLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweENBLCAweEI3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQzLCAweEU3LCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweEY4LCAweEU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQzLCAweEIyLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweEMwLCAweEYyLCAweERGLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENELCAweEU1LCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY5LCAweEFDLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweENELCAweENELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweEVFLCAweEFFLCAweEQ2LCAweEFFLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ3LCAweEVBLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweEU3LCAweEUwLCAweEVCLCAweEFFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweENGLCAweEQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweERDLCAweENELCAweEVELCAweEZCLCAweDAwLCAweDAwLCAweERFLCAweEYwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweEQ3LCAweEVCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweERFLCAweEE1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERGLCAweEQ3LCAvKiAweEYwLTB4RjMgKi8KKwkweERCLCAweEQwLCAweERCLCAweEQxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweEQ1LCAweEEzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweEYwLCAweEIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184OVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REMsIDB4REMsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4Q0EsIDB4RTgsIDB4MDAsIDB4MDAsIDB4RjgsIDB4RTYsIDB4REMsIDB4Q0UsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4RUEsIDB4REMsIDB4REIsIDB4RDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4RTksIDB4QjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjcsIDB4REIsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4QTgsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4RDcsIDB4QUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RTEsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4Q0IsIDB4QkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4RTUsIDB4RDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDAsIDB4REMsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4RDUsIDB4QzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDgsIDB4Q0EsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4QTksIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4QTQsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4RTksIDB4QTksIDB4MDAsIDB4MDAsIDB4RDMsIDB4QzcsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REMsIDB4REQsIDB4RjgsIDB4QUUsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0MsIDB4QjgsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDAsIDB4QUUsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDgsIDB4RjIsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4Q0EsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4Q0MsIDB4QUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4RDQsIDB4QUQsIDB4RjYsIDB4RDEsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDAsIDB4Q0MsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4QzYsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4RDUsIDB4QzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4Q0UsIDB4QkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4QzcsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkEsIDB4QjAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4REYsIDB4RDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4RjUsIDB4QkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzhBWzUxMl0gPSB7CisJMHhFNSwgMHhFQiwgMHgwMCwgMHgwMCwgMHhFRiwgMHhGNCwgMHhERCwgMHhCNSwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHhDRCwgMHhBQSwgMHgwMCwgMHgwMCwgMHhFMywgMHhGMiwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHhGQiwgMHhGNywgMHgwMCwgMHgwMCwgMHhGNywgMHhEMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhCQSwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhFMSwgMHhGNiwgMHhGRSwgLyogMHgxNC0weDE3ICovCisJMHhEMSwgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOCwgMHhDNSwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHhCOCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhFOCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQywgMHhDMSwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhEMiwgMHhFRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQiwgMHhCRSwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHhFMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHhGQSwgMHhDOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHhFMSwgMHhDRCwgMHgwMCwgMHgwMCwgMHhDQSwgMHhCOCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMiwgMHhFMCwgMHhGMSwgMHhDOSwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHhERSwgMHhGMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHhGMCwgMHhERiwgMHhGOCwgMHhDNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHhDQywgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERSwgMHhGMiwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHhFNywgMHhDOSwgMHgwMCwgMHgwMCwgMHhFMiwgMHhGMywgMHhFNywgMHhFMSwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHhDQiwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHhDQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHhDRiwgMHhGOCwgMHhFRiwgMHhBQywgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHhGRCwgMHhGRSwgMHhGQywgMHhBNSwgMHhGQSwgMHhCMSwgMHhERiwgMHhEOSwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHhEMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHhGNCwgMHhEQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHhGMSwgMHhDQSwgMHgwMCwgMHgwMCwgMHhDRSwgMHhBMywgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHhGMiwgMHhCQywgMHhFQywgMHhFMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhBNSwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHhGNywgMHhBQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHhFQiwgMHhBRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhERSwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHhFMSwgMHhBNCwgMHhDRCwgMHhBQiwgMHgwMCwgMHgwMCwgMHhEOSwgMHhGNCwgLyogMHhBMC0weEEzICovCisJMHhFOCwgMHhBNiwgMHhDRCwgMHhDRSwgMHhFMSwgMHhFOSwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHhGQywgMHhFRiwgMHgwMCwgMHgwMCwgMHhFMCwgMHhFMywgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHhFMiwgMHhDMSwgMHgwMCwgMHgwMCwgMHhDRSwgMHhBNCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHhERSwgMHhBNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHhFQiwgMHhGRSwgMHgwMCwgMHgwMCwgMHhFQiwgMHhERCwgMHhGMCwgMHhFMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNCwgMHhEQiwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHhFMiwgMHhGNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMywgMHhDOCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNCwgMHhFQiwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHhFRSwgMHhCNSwgMHgwMCwgMHgwMCwgMHhGNSwgMHhEOCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENSwgMHhERiwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENiwgMHhFNSwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQiwgMHhCMCwgLyogMHhEOC0weERCICovCisJMHhGNCwgMHhFMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHhDRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNCwgMHhGNCwgMHhGQSwgMHhCMiwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRiwgMHhGNSwgMHhDQSwgMHhERiwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHhFQiwgMHhCMSwgMHhFRCwgMHhCRiwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHhGRCwgMHhDOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhBNiwgMHhGOSwgMHhBNCwgLyogMHhGNC0weEY3ICovCisJMHhGMCwgMHhCMywgMHgwMCwgMHgwMCwgMHhFNSwgMHhFQywgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMSwgMHhFNywgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOEJbNTEyXSA9IHsKKwkweEQ5LCAweEM3LCAweEU0LCAweEQ3LCAweEVBLCAweERELCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweEQ0LCAweEY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERBLCAweEJBLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweERBLCAweENELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweEY5LCAweENDLCAweDAwLCAweDAwLCAweEUxLCAweERBLCAweERCLCAweEJGLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweENDLCAweEM1LCAweEVDLCAweEQwLCAweENCLCAweEJCLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweERFLCAweEYzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweEU5LCAweEFBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweEQ5LCAweEM4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweEUzLCAvKiAweDI4LTB4MkIgKi8KKwkweEQ3LCAweEJELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENGLCAweEM0LCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweEQwLCAweENELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweEZDLCAweEE2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweEYxLCAweEZCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEQyLCAweEQxLCAweEMxLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweEUzLCAweERCLCAweDAwLCAweDAwLCAweEQzLCAweEM5LCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweERDLCAweENGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENDLCAweEVELCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweERFLCAweEE3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweEJCLCAvKiAweDZDLTB4NkYgKi8KKwkweEVDLCAweEExLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweENDLCAweEI5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZCLCAweERFLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweEU3LCAweEUyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEQ0LCAweEMxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERDLCAweEE4LCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweEUyLCAweEMyLCAweDAwLCAweDAwLCAweEYzLCAweEQ4LCAweEU1LCAweEQzLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYzLCAweEQ5LCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYzLCAweEM2LCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184Q1s1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0QsIDB4REIsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0QsIDB4QUMsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4RkMsIDB4QzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDQsIDB4RTcsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4RDEsIDB4QzIsIDB4MDAsIDB4MDAsIDB4RjksIDB4QTUsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4RTgsIDB4RDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4Q0UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDQsIDB4Q0EsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4REYsIDB4REEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkIsIDB4REYsIDB4RTcsIDB4RTMsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4RjgsIDB4RkIsIDB4RTMsIDB4Q0YsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjUsIDB4QjAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDgsIDB4RTcsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4RDksIDB4QzksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4RjgsIDB4QUYsIDB4RUYsIDB4RjYsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4REQsIDB4QjYsIDB4RUUsIDB4QUYsIDB4Q0QsIDB4RjgsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REUsIDB4QjgsIC8qIDB4QTQtMHhBNyAqLworCTB4RkMsIDB4QTcsIDB4RjcsIDB4RkMsIDB4RjcsIDB4QjEsIDB4Q0UsIDB4QkIsIC8qIDB4QTgtMHhBQiAqLworCTB4RjQsIDB4QTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4Q0QsIC8qIDB4QUMtMHhBRiAqLworCTB4RTEsIDB4QUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUMsIDB4QzMsIC8qIDB4QjAtMHhCMyAqLworCTB4Q0YsIDB4RkUsIDB4MDAsIDB4MDAsIDB4RjgsIDB4QkYsIDB4RDgsIDB4RTIsIC8qIDB4QjQtMHhCNyAqLworCTB4RDMsIDB4RTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REUsIDB4QTgsIC8qIDB4QjgtMHhCQiAqLworCTB4RjQsIDB4RTQsIDB4RUMsIDB4QzIsIDB4MDAsIDB4MDAsIDB4RDksIDB4RjUsIC8qIDB4QkMtMHhCRiAqLworCTB4RjksIDB4QzUsIDB4REQsIDB4RDMsIDB4RDYsIDB4RjEsIDB4RUMsIDB4RkMsIC8qIDB4QzAtMHhDMyAqLworCTB4RkMsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4QzAsIC8qIDB4QzQtMHhDNyAqLworCTB4Q0EsIDB4QjksIDB4MDAsIDB4MDAsIDB4RUUsIDB4RTQsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4RjIsIDB4RTEsIDB4MDAsIDB4MDAsIDB4REUsIDB4QjksIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDYsIDB4RjIsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4REUsIDB4RjQsIDB4MDAsIDB4MDAsIDB4REYsIDB4REIsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4REIsIDB4RDMsIDB4MDAsIDB4MDAsIDB4RkEsIDB4RTcsIDB4RDgsIDB4RTMsIC8qIDB4RTAtMHhFMyAqLworCTB4RjQsIDB4QzEsIDB4MDAsIDB4MDAsIDB4REQsIDB4QjcsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjIsIDB4RjUsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4RDQsIDB4QUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4RDYsIDB4RjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REQsIDB4QjgsIC8qIDB4RjgtMHhGQiAqLworCTB4Q0YsIDB4QzUsIDB4REYsIDB4REYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzhEWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHhGMiwgMHhCRSwgMHhGNiwgMHhBMSwgMHgwMCwgMHgwMCwgMHhFQiwgMHhDQiwgLyogMHgwNC0weDA3ICovCisJMHhGMSwgMHhGQywgMHgwMCwgMHgwMCwgMHhGMywgMHhDNywgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHhFQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHhGQywgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhEQiwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHhFRSwgMHhFNSwgMHgwMCwgMHgwMCwgMHhERSwgMHhGNSwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQSwgMHhEMywgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHhGMSwgMHhDQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMCwgMHhBRiwgLyogMHg3MC0weDczICovCisJMHhERCwgMHhCOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMSwgMHhDMywgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHhGNSwgMHhCMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHhDNiwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHhGMCwgMHhFMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNiwgMHhBQywgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHhGNSwgMHhEOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMCwgMHhFQiwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERCwgMHhCQSwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMiwgMHhCRiwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNywgMHhDNSwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQiwgMHhBMiwgLyogMHhDOC0weENCICovCisJMHhGMiwgMHhGNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQSwgMHhCQSwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNywgMHhGNSwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHhDQiwgMHhFNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHhFRSwgMHhFNiwgMHgwMCwgMHgwMCwgMHhFMCwgMHhEMywgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHhDRSwgMHhBNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENiwgMHhEOCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENCwgMHhBRiwgLyogMHhGMC0weEYzICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOEVbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweEM5LCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQzLCAweENFLCAvKiAweDBDLTB4MEYgKi8KKwkweEY0LCAweEMyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENCLCAweEU2LCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYxLCAweEExLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweEVCLCAweEIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweEYxLCAweEEyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVCLCAweEIzLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweEYwLCAweEI0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENCLCAweEY0LCAvKiAweDQ0LTB4NDcgKi8KKwkweEQ0LCAweEIwLCAweEYzLCAweEIyLCAweEZCLCAweEI3LCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweEY1LCAweEVDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweEU3LCAvKiAweDVDLTB4NUYgKi8KKwkweEY0LCAweEIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweEY1LCAweEVELCAweDAwLCAweDAwLCAweENGLCAweEYzLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweEYwLCAweEUyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweENFLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYxLCAweENDLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweEI4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ3LCAweEY1LCAweEUzLCAweEYzLCAvKiAweEE4LTB4QUIgKi8KKwkweENGLCAweEU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweENGLCAweEM2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYzLCAweEIzLCAweEU0LCAweEQ4LCAvKiAweEM4LTB4Q0IgKi8KKwkweENGLCAweEY5LCAweENGLCAweERBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZBLCAweENELCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU2LCAweEUzLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYyLCAweEUyLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweEY1LCAweEVFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENBLCAweEJCLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweERDLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184Rls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4RjIsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4RDYsIDB4RDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjQsIDB4RTUsIDB4RDgsIDB4QzIsIC8qIDB4MTAtMHgxMyAqLworCTB4REMsIDB4RDAsIDB4Q0MsIDB4RUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDUsIDB4RTAsIC8qIDB4MTgtMHgxQiAqLworCTB4RjYsIDB4Q0EsIDB4RkQsIDB4Q0EsIDB4RDgsIDB4RDYsIDB4RjQsIDB4Q0YsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDYsIDB4QTYsIDB4REMsIDB4QkUsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4REIsIDB4RDQsIDB4RDcsIDB4QzcsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjIsIDB4RkUsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjEsIDB4Q0QsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4RTIsIDB4QzMsIDB4REMsIDB4REUsIDB4MDAsIDB4MDAsIDB4REMsIDB4REYsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUYsIDB4QUQsIDB4RTYsIDB4QUIsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4RjksIDB4REQsIDB4RUEsIDB4QkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4RUYsIDB4QUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4RjQsIDB4RDAsIDB4Q0UsIDB4RjMsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4RTYsIDB4QUMsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4REUsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDUsIDB4RjksIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4RjQsIC8qIDB4OTgtMHg5QiAqLworCTB4Q0QsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDUsIDB4QjgsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjcsIDB4RkQsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4REMsIDB4QTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4REUsIDB4RjYsIDB4MDAsIDB4MDAsIDB4REMsIDB4QUEsIC8qIDB4QUMtMHhBRiAqLworCTB4RjIsIDB4RTMsIDB4RTksIDB4QjQsIDB4RDIsIDB4REMsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4RTYsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4RjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4Q0EsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4RDAsIDB4Q0UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4REEsIDB4RjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4QkMsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4RTgsIDB4REEsIDB4REUsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4RjIsIDB4RjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4RTIsIDB4RkIsIDB4MDAsIDB4MDAsIDB4Q0MsIDB4QTYsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REEsIDB4QkIsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4RTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4RjUsIDB4REEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzkwWzUxMl0gPSB7CisJMHhGNywgMHhEQywgMHhFMSwgMHhFQSwgMHhDRSwgMHhDMSwgMHhENCwgMHhCMSwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHhGRCwgMHhCMSwgMHhFNiwgMHhCRCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHhGQiwgMHhBRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOCwgMHhFNywgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHhDRSwgMHgwMCwgMHgwMCwgMHhGNywgMHhFMiwgLyogMHgwQy0weDBGICovCisJMHhGNSwgMHhFRiwgMHhDRiwgMHhDNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHhENCwgMHhCMiwgMHhDQywgMHhFRiwgMHgwMCwgMHgwMCwgMHhENCwgMHhFOCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHhFRSwgMHhDRiwgMHhGNywgMHhENywgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHhBNiwgMHhENiwgMHhDMSwgMHhFMSwgMHhEQywgLyogMHgxQy0weDFGICovCisJMHhGMCwgMHhFMywgMHhGMSwgMHhFNCwgMHhEQywgMHhGMSwgMHhENiwgMHhBNywgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNCwgMHhGNSwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHhGMSwgMHhDRSwgMHhGMiwgMHhFNCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHhEMCwgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHhFQywgMHhFRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHhGOSwgMHhCQSwgMHgwMCwgMHgwMCwgMHhFQiwgMHhCNSwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHhENCwgMHhFRCwgMHhFMiwgMHhDNCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhFNywgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQiwgMHhCNCwgMHhFQSwgMHhBMSwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHhGOCwgMHhCQywgMHhDRSwgMHhBNiwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHhGOSwgMHhDNiwgMHhGQywgMHhEQSwgMHgwMCwgMHgwMCwgMHhENCwgMHhCMywgLyogMHg1MC0weDUzICovCisJMHhEMywgMHhCOSwgMHhFQSwgMHhERSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHhBQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHhFMSwgMHhFMSwgMHhEMywgMHhDRiwgMHhGNCwgMHhGNiwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHhFQSwgMHhDMCwgMHhFMSwgMHhDRiwgMHgwMCwgMHgwMCwgMHhDQywgMHhCQSwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhFRSwgMHhFQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHhGMCwgMHhFNCwgMHhGMywgMHhCNCwgMHhENCwgMHhFRSwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMiwgMHhDMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHhGMSwgMHhFNSwgMHgwMCwgMHgwMCwgMHhGNCwgMHhDMywgLyogMHg3NC0weDc3ICovCisJMHhFMCwgMHhENCwgMHgwMCwgMHgwMCwgMHhFQiwgMHhCNiwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHhENywgMHhBMSwgMHhDQiwgMHhFOCwgMHgwMCwgMHgwMCwgMHhGOSwgMHhBRCwgLyogMHg3Qy0weDdGICovCisJCisJMHhFOSwgMHhBRCwgMHhEOCwgMHhFNCwgMHhGQSwgMHhCMywgMHhFMiwgMHhDNSwgLyogMHg4MC0weDgzICovCisJMHhGQywgMHhCRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQywgMHhDNCwgLyogMHg4NC0weDg3ICovCisJMHhEOCwgMHhCMSwgMHgwMCwgMHgwMCwgMHhEQywgMHhBQiwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENSwgMHhBNCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHhFQiwgMHhFOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHhFOCwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHhEOCwgMHhENywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQiwgMHhBRSwgMHhEMSwgMHhFMSwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQiwgMHhDMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHhGNSwgMHhCRSwgMHgwMCwgMHgwMCwgMHhERSwgMHhGNywgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQSwgMHhGQiwgLyogMHhBQy0weEFGICovCisJMHhGNywgMHhDNiwgMHhDRiwgMHhDOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHhEMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHhFRSwgMHhEMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHhGNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRSwgMHhGNCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENSwgMHhDRCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHhDRiwgMHhEQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHhERCwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHhDRSwgMHhBQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHhFOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHhENCwgMHhCNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOTFbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweEM3LCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY1LCAweERCLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweEZBLCAweEMxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweERFLCAweEE5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ0LCAweEY4LCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweEVGLCAweEY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQzLCAweEIzLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweEVCLCAweEI3LCAweEVGLCAweEY4LCAweEY1LCAweERDLCAvKiAweDQ4LTB4NEIgKi8KKwkweEVELCAweENDLCAweERCLCAweEQ1LCAweEYxLCAweENGLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYxLCAweEQwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY1LCAweEIyLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweEQ5LCAweEFFLCAweEQ1LCAweEFDLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweEUyLCAweEM2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweEZELCAweEEzLCAweDAwLCAweDAwLCAweEZCLCAweEU1LCAvKiAweDc0LTB4NzcgKi8KKwkweERGLCAweEFCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweEY1LCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweEY2LCAweEFELCAweDAwLCAweDAwLCAweEY1LCAweEIzLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweEYwLCAweEI1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEE1LCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweEY1LCAweERELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVDLCAweEEyLCAvKiAweEE4LTB4QUIgKi8KKwkweEVELCAweEZELCAweDAwLCAweDAwLCAweEY1LCAweEI0LCAweEZCLCAweEI4LCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweERCLCAweEEzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweEQ2LCAweENBLCAweENCLCAweEQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweEU1LCAweEQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYzLCAweEZBLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweEVCLCAweEI4LCAweDAwLCAweDAwLCAweEUwLCAweEI3LCAvKiAweEM4LTB4Q0IgKi8KKwkweEQ3LCAweEVDLCAweEYxLCAweEVDLCAweEU1LCAweEFGLCAweEQ1LCAweEUxLCAvKiAweENDLTB4Q0YgKi8KKwkweEQ3LCAweEVELCAweEQxLCAweEQxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEYyLCAvKiAweEQ0LTB4RDcgKi8KKwkweEVGLCAweEY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweERELCAweEJDLCAweEY2LCAweERDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYwLCAweEU1LCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY0LCAweEM0LCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweEU5LCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweEYzLCAweEZCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185Mls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4RDQsIDB4RUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4Q0MsIDB4QTIsIDB4RjcsIDB4RkUsIDB4REYsIDB4QkMsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUIsIDB4Q0QsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDAsIDB4QjcsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4RDYsIDB4QzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4QUQsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUYsIDB4QUYsIC8qIDB4M0MtMHgzRiAqLworCTB4Q0IsIDB4QTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4Q0IsIDB4RTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4RkEsIDB4RTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0MsIDB4QzYsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4RTcsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4QzcsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REIsIDB4QTQsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4Q0YsIDB4QzksIDB4RTIsIDB4RkMsIDB4RUYsIDB4RkEsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RUIsIDB4REUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjUsIDB4QzgsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4RDQsIDB4REUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4RDUsIDB4MDAsIDB4MDAsIDB4RUYsIDB4QjAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4QzcsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4RDksIDB4QUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4RjksIDB4RTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4RTUsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0YsIDB4Q0EsIDB4RTEsIDB4RDEsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4QzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4RUYsIDB4RkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkEsIDB4RjksIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REMsIDB4RjIsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4RTAsIDB4QTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjgsIDB4RTgsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4Q0IsIDB4RUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4Q0IsIDB4QkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzkzWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHhENiwgMHhFMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHhGNSwgMHhERSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHhGNSwgMHhERiwgMHgwMCwgMHgwMCwgMHhFRSwgMHhCNiwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHhGNiwgMHhEMywgMHhDQSwgLyogMHgxQy0weDFGICovCisJMHhFRiwgMHhGQywgMHhEMSwgMHhDNCwgMHhFRiwgMHhCMSwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHhEMSwgMHhDNSwgMHgwMCwgMHgwMCwgMHhEMCwgMHhERSwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHhEOSwgMHhFMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhCOCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRCwgMHhEMSwgMHhGMywgMHhCOSwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHhFNywgMHhDQywgMHgwMCwgMHgwMCwgMHhENiwgMHhBOCwgMHhDRSwgMHhBNywgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHhENCwgMHhCNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHhFNCwgMHhDOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMywgMHhCNCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQiwgMHhCOSwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHhDQiwgMHhGNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHhGNiwgMHhERCwgMHgwMCwgMHgwMCwgMHhGMSwgMHhBMywgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHhDQywgMHhDNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHhFOSwgMHhDQSwgMHgwMCwgMHgwMCwgMHhFMSwgMHhGMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNSwgMHhFMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQiwgMHhBRiwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQiwgMHhEMSwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHhGQiwgMHhFMCwgMHhGMiwgMHhFNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHhFQywgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMCwgMHhFQywgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHhFRSwgMHhFQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhDQiwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHhDQywgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHhENywgMHhBRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMywgMHhBMSwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOTRbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweEZDLCAweEY1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweEYxLCAweEE0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweEQ2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVGLCAweEIyLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweEY0LCAweEQxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweEY3LCAweEExLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweEYxLCAweEQxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweENBLCAweEZDLCAweENBLCAweEZELCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENFLCAweENFLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweEYzLCAweEM4LCAweDAwLCAweDAwLCAweEYzLCAweEJBLCAvKiAweDdDLTB4N0YgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185NVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4RkUsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4REEsIDB4QTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RUMsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4RjgsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4Q0IsIDB4RDIsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUIsIDB4Q0UsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4RjksIDB4RDgsIDB4RjksIDB4RDksIDB4Q0EsIDB4RTAsIC8qIDB4OTAtMHg5MyAqLworCTB4REEsIDB4Q0EsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4Q0IsIDB4QTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4QzgsIC8qIDB4QTAtMHhBMyAqLworCTB4RjksIDB4RUUsIDB4REIsIDB4RUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4RDAsIDB4QjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4RDUsIDB4RUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4RTYsIDB4RjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTcsIDB4QTIsIC8qIDB4QjgtMHhCQiAqLworCTB4RTQsIDB4RDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4RTEsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkMsIDB4QzQsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4RjksIDB4RUYsIDB4Q0YsIDB4RjQsIDB4RjcsIDB4RTYsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4Q0UsIDB4QkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4RjQsIDB4QzUsIDB4REMsIDB4QTMsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzk2WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHhERCwgMHhCRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHhGNCwgMHhDNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOCwgMHhBMSwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOCwgMHhENiwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQiwgMHhDMSwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMCwgMHhFNiwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhCOSwgLyogMHgzQy0weDNGICovCisJMHhGNiwgMHhFRCwgMHgwMCwgMHgwMCwgMHhGOSwgMHhBRSwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHhERCwgMHhCRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENywgMHhCMCwgLyogMHg0OC0weDRCICovCisJMHhEOCwgMHhFOCwgMHhDQiwgMHhCRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHhGOSwgMHhEQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOCwgMHhDRSwgLyogMHg1OC0weDVCICovCisJMHhGOSwgMHhGMCwgMHhFMCwgMHhFRCwgMHhFMywgMHhCMywgMHhGNCwgMHhCMywgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHhDMiwgMHhGMiwgMHhFNiwgLyogMHg2MC0weDYzICovCisJMHhGMCwgMHhCNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQiwgMHhENiwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHhFQiwgMHhFNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMiwgMHhFNywgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHhENywgMHhENSwgMHhENCwgMHhCNiwgMHhGOSwgMHhFOCwgLyogMHg3NC0weDc3ICovCisJMHhENywgMHhDMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHhENSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHhFQSwgMHhENywgMHhDQywgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMywgMHhFOSwgMHhFMiwgMHhDOSwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHhGQywgMHhEQiwgMHhDRCwgMHhBRCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHhDQywgMHhCMCwgMHhFQSwgMHhBMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHhFNCwgMHhGNiwgMHhEMCwgMHhDMCwgMHgwMCwgMHgwMCwgMHhGMCwgMHhCNywgLyogMHg5OC0weDlCICovCisJMHhFRSwgMHhBMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENywgMHhGNiwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHhDQSwgLyogMHhBNC0weEE3ICovCisJMHhFMiwgMHhDQiwgMHgwMCwgMHgwMCwgMHhGQSwgMHhDRiwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHhFQiwgMHhERiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENiwgMHhDQiwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNCwgMHhCNCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHhFRCwgMHhDRCwgMHhFNCwgMHhEMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHhFQSwgMHhBOSwgMHhFNCwgMHhCQSwgMHhGMywgMHhBMiwgMHhDRCwgMHhEMiwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHhGNiwgMHhDQiwgMHgwMCwgMHgwMCwgMHhGMSwgMHhFNiwgLyogMHhDOC0weENCICovCisJMHhFRCwgMHhDMSwgMHhFOCwgMHhCQywgMHhFRSwgMHhEMSwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHhGMCwgMHhFNywgMHhFMiwgMHhDQywgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHhBQSwgMHgwMCwgMHgwMCwgMHhGNSwgMHhFMSwgLyogMHhEOC0weERCICovCisJMHhFRCwgMHhEQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENywgMHhFRSwgMHhEMSwgMHhGMSwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHhFOSwgMHhFQiwgMHhFOSwgMHhFQywgMHhFMCwgMHhFNCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQSwgMHhBNywgLyogMHhFQy0weEVGICovCisJMHhERCwgMHhENCwgMHgwMCwgMHgwMCwgMHhFQSwgMHhBMywgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENiwgMHhDMywgMHhENiwgMHhGNCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHhEQSwgMHhERiwgMHgwMCwgMHgwMCwgMHhFRiwgMHhCMywgLyogMHhGOC0weEZCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOTdbNTEyXSA9IHsKKwkweEUyLCAweENELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVGLCAweEZELCAweEYyLCAweEU4LCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweEVGLCAweEM1LCAweDAwLCAweDAwLCAweEU3LCAweEU3LCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ3LCAweEZELCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweEU3LCAweENFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweERGLCAweERDLCAweDAwLCAweDAwLCAweEY5LCAweEM3LCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ5LCAweEY2LCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweERGLCAweEFDLCAweDAwLCAweDAwLCAweEQ2LCAweERBLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweERDLCAweEE0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweEYwLCAweEI4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ1LCAweEZBLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweEU0LCAweEY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweEQ2LCAweEM0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweEY0LCAweEVDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVGLCAweEZFLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweEYwLCAweEExLCAweDAwLCAweDAwLCAweERFLCAweEFBLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweERBLCAweEJDLCAweEQ4LCAweEZDLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweEZBLCAweEQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweEVDLCAweEU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweEZDLCAweEE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVDLCAweEU2LCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ4LCAweENCLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZCLCAweEI5LCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweEQzLCAweDAwLCAweDAwLCAweENELCAweEY5LCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweENGLCAweEQzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweENBLCAweEVBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENGLCAweEQ0LCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweEY4LCAweEJELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY0LCAweEM3LCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweERGLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY5LCAweERCLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweEQ0LCAweEI3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVCLCAweEU1LCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEQyLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweEE0LCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZBLCAweEMyLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185OFs1MTJdID0geworCTB4RkIsIDB4RTEsIDB4RkEsIDB4RUQsIDB4RjAsIDB4QTIsIDB4Q0MsIDB4RjEsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4RkEsIDB4QTMsIDB4RTIsIDB4RjcsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4RTIsIDB4Q0UsIDB4MDAsIDB4MDAsIDB4RTksIDB4RjUsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4RTEsIDB4RUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4RTcsIDB4RTgsIDB4RTgsIDB4RDcsIDB4REEsIDB4RjgsIDB4RDQsIDB4Q0IsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjcsIDB4RjYsIC8qIDB4MTQtMHgxNyAqLworCTB4RDYsIDB4QzUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4RDQsIDB4RTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4RkEsIDB4RkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4Q0MsIDB4RjIsIDB4RjcsIDB4REQsIDB4MDAsIDB4MDAsIDB4REUsIDB4QkEsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4QTgsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4RjAsIDB4QjksIDB4RTQsIDB4RkUsIDB4RTQsIDB4QzksIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4RTQsIDB4RDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4RUEsIDB4QzMsIDB4MDAsIDB4MDAsIDB4RUYsIDB4QjQsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDcsIDB4QkUsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4RkIsIDB4RTIsIDB4MDAsIDB4MDAsIDB4Q0QsIDB4RDMsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUYsIDB4QjUsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkEsIDB4RTksIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4RjksIDB4QTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REYsIDB4QkQsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4RjcsIDB4QzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4RjgsIDB4RkQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjgsIDB4RkMsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REUsIDB4QUIsIC8qIDB4RDgtMHhEQiAqLworCTB4REIsIDB4RTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4REQsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4RTEsIDB4RTIsIDB4RDEsIDB4QzYsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4RjYsIDB4RDAsIDB4RUIsIDB4RTYsIDB4REEsIDB4RjksIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4RUMsIDB4QzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4REUsIDB4RjgsIDB4RjgsIDB4RTksIDB4RTMsIDB4REUsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzk5WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRSwgMHhGNSwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHhGQSwgMHhDMywgMHhFNSwgMHhENywgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHhFQywgMHhDOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHhGMywgMHhDOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhCQiwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHhFNiwgMHhBRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRiwgMHhCNiwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHhEQywgMHhCRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHhDRSwgMHhCRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHhEOCwgMHhDMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHhEMCwgMHhDRiwgMHgwMCwgMHgwMCwgMHhDRiwgMHhGQSwgLyogMHg0OC0weDRCICovCisJMHhGMywgMHhDQSwgMHhFMCwgMHhENywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHhEMSwgMHhDNywgMHhFOSwgMHhBRSwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHhFOCwgMHhCRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQSwgMHhDNCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHhDRiwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHhGQSwgMHhDNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHhGOSwgMHhCOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHhEQywgMHhFMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHhGQiwgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHhEOCwgMHhBOSwgMHhFNSwgMHhERiwgMHhGOSwgMHhBNywgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHhGNiwgMHhFRSwgMHgwMCwgMHgwMCwgMHhGNiwgMHhDQywgLyogMHhCMC0weEIzICovCisJMHhFMiwgMHhGOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHhFQywgMHhGMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHhEQSwgMHhFMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHhGMSwgMHhEMiwgMHhEMiwgMHhDQywgMHhDRiwgMHhDQiwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHhDQSwgMHhCRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHhERCwgMHhCRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHhGNiwgMHhFRiwgMHgwMCwgMHgwMCwgMHhERSwgMHhGOSwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHhGQSwgMHhCNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHhENSwgMHhBRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMSwgMHhFNywgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOUFbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweERFLCAweEJFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweERDLCAweEMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQxLCAweEM4LCAweEQxLCAweEM5LCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweEY4LCAweEJFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENCLCAweEY2LCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweEQ0LCAweEY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY1LCAweEUyLCAweEUxLCAweEQzLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweEQ4LCAweEU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY4LCAweEZFLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweENGLCAweENDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweEZELCAweEE0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweENFLCAweEY2LCAweDAwLCAweDAwLCAweEZBLCAweEQwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENDLCAweEYzLCAweEU2LCAweEJFLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY2LCAweEFFLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ1LCAweEYwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweEQxLCAweENBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweEZDLCAweEJFLCAweEQ1LCAweEYxLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweENELCAweEU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweEZBLCAweEI1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUyLCAweEQwLCAvKiAweEQwLTB4RDMgKi8KKwkweEY0LCAweEY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweENELCAweEQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweEU3LCAweEEzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERCLCAweEE1LCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185Qls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4RDEsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDcsIDB4QTIsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjcsIDB4RTMsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4RUEsIDB4QTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4RDAsIDB4QTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4Q0UsIDB4REEsIDB4RkIsIDB4RUIsIDB4REIsIDB4QTYsIC8qIDB4NDAtMHg0MyAqLworCTB4REIsIDB4REUsIDB4RDgsIDB4RTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUEsIDB4RTAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4RDgsIDB4QUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4RTAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDYsIDB4REIsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUYsIDB4QzYsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4RjgsIDB4RUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4RDUsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4RjcsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RDgsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4RDcsIDB4RUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjQsIDB4RUQsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4Q0QsIDB4RTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4Q0MsIDB4RjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzlDWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHhGNSwgMHhFMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHhFNCwgMHhDQSwgMHgwMCwgMHgwMCwgMHhEQywgMHhFMSwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHhGOSwgMHhDOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhGQywgMHhCRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOCwgMHhBNywgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOCwgMHhDNCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQiwgMHhCRSwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHhEQywgMHhBRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENywgMHhGNywgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHhGMCwgMHhFOCwgMHgwMCwgMHgwMCwgMHhERCwgMHhDMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHhDRiwgMHhDRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQywgMHhGMywgLyogMHhGMC0weEYzICovCisJMHhEOSwgMHhCMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhFOSwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOURbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweEJDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweEM0LCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweEVDLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweEU0LCAweEU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZCLCAweEY4LCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweENDLCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweEJELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweENELCAweERDLCAweEQ5LCAweEY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweERELCAweERGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweENFLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweEQ5LCAweEQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweEEzLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweEY5LCAweENELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweENELCAweEFFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENGLCAweENFLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY2LCAweEFGLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweEZELCAweEQzLCAweEVCLCAweEVELCAweEQ2LCAweERDLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185RVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4QTQsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDUsIDB4QjYsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4RDYsIDB4REQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4RjksIDB4RTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4RTcsIDB4QTQsIDB4MDAsIDB4MDAsIDB4RDYsIDB4RTMsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDEsIDB4Q0IsIDB4RDYsIDB4RTQsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDUsIDB4RjIsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4REUsIDB4RkEsIDB4MDAsIDB4MDAsIDB4RDcsIDB4RjgsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4RDgsIDB4RUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4Q0YsIDB4RDUsIDB4RDgsIDB4RkQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDgsIDB4QUIsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4Q0IsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkMsIDB4REMsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4QTgsIDB4RDUsIDB4RjMsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4RkQsIDB4RDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4Q0MsIDB4QTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4RDksIDB4RjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDMsIDB4RUEsIC8qIDB4RDgtMHhEQiAqLworCTB4RjUsIDB4RjUsIDB4MDAsIDB4MDAsIDB4RUYsIDB4QzcsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4RDMsIDB4REEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4REEsIDB4QkQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzlGWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOCwgMHhBOCwgLyogMHgwNC0weDA3ICovCisJMHhEQywgMHhBRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMCwgMHhBMywgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRCwgMHhENSwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHhFMCwgMHhBOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERSwgMHhBQywgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMCwgMHhCQSwgMHhFRSwgMHhCMSwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHhCMiwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNiwgMHhDRCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHhEMiwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHhENiwgMHhDNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHhFNSwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMywgMHhCQiwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHhFNSwgMHhFMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhDQiwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHhENywgMHhBMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHhEQiwgMHhDMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHhDQSwgMHhGRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHhDRiwgMHhDRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfQUNbNTEyXSA9IHsKKwkweEIwLCAweEExLCAweEIwLCAweEEyLCAweDgxLCAweDQxLCAweDgxLCAweDQyLCAvKiAweDAwLTB4MDMgKi8KKwkweEIwLCAweEEzLCAweDgxLCAweDQzLCAweDgxLCAweDQ0LCAweEIwLCAweEE0LCAvKiAweDA0LTB4MDcgKi8KKwkweEIwLCAweEE1LCAweEIwLCAweEE2LCAweEIwLCAweEE3LCAweDgxLCAweDQ1LCAvKiAweDA4LTB4MEIgKi8KKwkweDgxLCAweDQ2LCAweDgxLCAweDQ3LCAweDgxLCAweDQ4LCAweDgxLCAweDQ5LCAvKiAweDBDLTB4MEYgKi8KKwkweEIwLCAweEE4LCAweEIwLCAweEE5LCAweEIwLCAweEFBLCAweEIwLCAweEFCLCAvKiAweDEwLTB4MTMgKi8KKwkweEIwLCAweEFDLCAweEIwLCAweEFELCAweEIwLCAweEFFLCAweEIwLCAweEFGLCAvKiAweDE0LTB4MTcgKi8KKwkweDgxLCAweDRBLCAweEIwLCAweEIwLCAweEIwLCAweEIxLCAweEIwLCAweEIyLCAvKiAweDE4LTB4MUIgKi8KKwkweEIwLCAweEIzLCAweEIwLCAweEI0LCAweDgxLCAweDRCLCAweDgxLCAweDRDLCAvKiAweDFDLTB4MUYgKi8KKwkweEIwLCAweEI1LCAweDgxLCAweDRELCAweDgxLCAweDRFLCAweDgxLCAweDRGLCAvKiAweDIwLTB4MjMgKi8KKwkweEIwLCAweEI2LCAweDgxLCAweDUwLCAweDgxLCAweDUxLCAweDgxLCAweDUyLCAvKiAweDI0LTB4MjcgKi8KKwkweDgxLCAweDUzLCAweDgxLCAweDU0LCAweDgxLCAweDU1LCAweDgxLCAweDU2LCAvKiAweDI4LTB4MkIgKi8KKwkweEIwLCAweEI3LCAweEIwLCAweEI4LCAweDgxLCAweDU3LCAweEIwLCAweEI5LCAvKiAweDJDLTB4MkYgKi8KKwkweEIwLCAweEJBLCAweEIwLCAweEJCLCAweDgxLCAweDU4LCAweDgxLCAweDU5LCAvKiAweDMwLTB4MzMgKi8KKwkweDgxLCAweDVBLCAweDgxLCAweDYxLCAweDgxLCAweDYyLCAweDgxLCAweDYzLCAvKiAweDM0LTB4MzcgKi8KKwkweEIwLCAweEJDLCAweEIwLCAweEJELCAweDgxLCAweDY0LCAweDgxLCAweDY1LCAvKiAweDM4LTB4M0IgKi8KKwkweEIwLCAweEJFLCAweDgxLCAweDY2LCAweDgxLCAweDY3LCAweDgxLCAweDY4LCAvKiAweDNDLTB4M0YgKi8KKwkweEIwLCAweEJGLCAweDgxLCAweDY5LCAweDgxLCAweDZBLCAweDgxLCAweDZCLCAvKiAweDQwLTB4NDMgKi8KKwkweDgxLCAweDZDLCAweDgxLCAweDZELCAweDgxLCAweDZFLCAweDgxLCAweDZGLCAvKiAweDQ0LTB4NDcgKi8KKwkweDgxLCAweDcwLCAweDgxLCAweDcxLCAweDgxLCAweDcyLCAweEIwLCAweEMwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDgxLCAweDczLCAweEIwLCAweEMxLCAweDgxLCAweDc0LCAweDgxLCAweDc1LCAvKiAweDRDLTB4NEYgKi8KKwkweDgxLCAweDc2LCAweDgxLCAweDc3LCAweDgxLCAweDc4LCAweDgxLCAweDc5LCAvKiAweDUwLTB4NTMgKi8KKwkweEIwLCAweEMyLCAweDgxLCAweDdBLCAweDgxLCAweDgxLCAweDgxLCAweDgyLCAvKiAweDU0LTB4NTcgKi8KKwkweEIwLCAweEMzLCAweDgxLCAweDgzLCAweDgxLCAweDg0LCAweDgxLCAweDg1LCAvKiAweDU4LTB4NUIgKi8KKwkweEIwLCAweEM0LCAweDgxLCAweDg2LCAweDgxLCAweDg3LCAweDgxLCAweDg4LCAvKiAweDVDLTB4NUYgKi8KKwkweDgxLCAweDg5LCAweDgxLCAweDhBLCAweDgxLCAweDhCLCAweDgxLCAweDhDLCAvKiAweDYwLTB4NjMgKi8KKwkweDgxLCAweDhELCAweDgxLCAweDhFLCAweDgxLCAweDhGLCAweDgxLCAweDkwLCAvKiAweDY0LTB4NjcgKi8KKwkweDgxLCAweDkxLCAweDgxLCAweDkyLCAweDgxLCAweDkzLCAweDgxLCAweDk0LCAvKiAweDY4LTB4NkIgKi8KKwkweDgxLCAweDk1LCAweDgxLCAweDk2LCAweDgxLCAweDk3LCAweDgxLCAweDk4LCAvKiAweDZDLTB4NkYgKi8KKwkweEIwLCAweEM1LCAweEIwLCAweEM2LCAweDgxLCAweDk5LCAweDgxLCAweDlBLCAvKiAweDcwLTB4NzMgKi8KKwkweEIwLCAweEM3LCAweDgxLCAweDlCLCAweDgxLCAweDlDLCAweEIwLCAweEM4LCAvKiAweDc0LTB4NzcgKi8KKwkweEIwLCAweEM5LCAweDgxLCAweDlELCAweEIwLCAweENBLCAweDgxLCAweDlFLCAvKiAweDc4LTB4N0IgKi8KKwkweDgxLCAweDlGLCAweDgxLCAweEEwLCAweDgxLCAweEExLCAweDgxLCAweEEyLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEIwLCAweENCLCAweEIwLCAweENDLCAweDgxLCAweEEzLCAweEIwLCAweENELCAvKiAweDgwLTB4ODMgKi8KKwkweEIwLCAweENFLCAweEIwLCAweENGLCAweEIwLCAweEQwLCAweDgxLCAweEE0LCAvKiAweDg0LTB4ODcgKi8KKwkweDgxLCAweEE1LCAweEIwLCAweEQxLCAweEIwLCAweEQyLCAweEIwLCAweEQzLCAvKiAweDg4LTB4OEIgKi8KKwkweEIwLCAweEQ0LCAweDgxLCAweEE2LCAweDgxLCAweEE3LCAweDgxLCAweEE4LCAvKiAweDhDLTB4OEYgKi8KKwkweEIwLCAweEQ1LCAweDgxLCAweEE5LCAweDgxLCAweEFBLCAweDgxLCAweEFCLCAvKiAweDkwLTB4OTMgKi8KKwkweEIwLCAweEQ2LCAweDgxLCAweEFDLCAweDgxLCAweEFELCAweDgxLCAweEFFLCAvKiAweDk0LTB4OTcgKi8KKwkweDgxLCAweEFGLCAweDgxLCAweEIwLCAweDgxLCAweEIxLCAweDgxLCAweEIyLCAvKiAweDk4LTB4OUIgKi8KKwkweEIwLCAweEQ3LCAweEIwLCAweEQ4LCAweDgxLCAweEIzLCAweEIwLCAweEQ5LCAvKiAweDlDLTB4OUYgKi8KKwkweEIwLCAweERBLCAweEIwLCAweERCLCAweDgxLCAweEI0LCAweDgxLCAweEI1LCAvKiAweEEwLTB4QTMgKi8KKwkweDgxLCAweEI2LCAweDgxLCAweEI3LCAweDgxLCAweEI4LCAweDgxLCAweEI5LCAvKiAweEE0LTB4QTcgKi8KKwkweEIwLCAweERDLCAweEIwLCAweERELCAweEIwLCAweERFLCAweDgxLCAweEJBLCAvKiAweEE4LTB4QUIgKi8KKwkweEIwLCAweERGLCAweDgxLCAweEJCLCAweDgxLCAweEJDLCAweEIwLCAweEUwLCAvKiAweEFDLTB4QUYgKi8KKwkweEIwLCAweEUxLCAweDgxLCAweEJELCAweDgxLCAweEJFLCAweDgxLCAweEJGLCAvKiAweEIwLTB4QjMgKi8KKwkweDgxLCAweEMwLCAweDgxLCAweEMxLCAweDgxLCAweEMyLCAweDgxLCAweEMzLCAvKiAweEI0LTB4QjcgKi8KKwkweEIwLCAweEUyLCAweEIwLCAweEUzLCAweDgxLCAweEM0LCAweEIwLCAweEU0LCAvKiAweEI4LTB4QkIgKi8KKwkweEIwLCAweEU1LCAweEIwLCAweEU2LCAweDgxLCAweEM1LCAweDgxLCAweEM2LCAvKiAweEJDLTB4QkYgKi8KKwkweDgxLCAweEM3LCAweEIwLCAweEU3LCAweDgxLCAweEM4LCAweDgxLCAweEM5LCAvKiAweEMwLTB4QzMgKi8KKwkweEIwLCAweEU4LCAweDgxLCAweENBLCAweDgxLCAweENCLCAweDgxLCAweENDLCAvKiAweEM0LTB4QzcgKi8KKwkweEIwLCAweEU5LCAweDgxLCAweENELCAweDgxLCAweENFLCAweDgxLCAweENGLCAvKiAweEM4LTB4Q0IgKi8KKwkweEIwLCAweEVBLCAweDgxLCAweEQwLCAweDgxLCAweEQxLCAweDgxLCAweEQyLCAvKiAweENDLTB4Q0YgKi8KKwkweDgxLCAweEQzLCAweDgxLCAweEQ0LCAweDgxLCAweEQ1LCAweDgxLCAweEQ2LCAvKiAweEQwLTB4RDMgKi8KKwkweDgxLCAweEQ3LCAweEIwLCAweEVCLCAweDgxLCAweEQ4LCAweEIwLCAweEVDLCAvKiAweEQ0LTB4RDcgKi8KKwkweDgxLCAweEQ5LCAweDgxLCAweERBLCAweDgxLCAweERCLCAweDgxLCAweERDLCAvKiAweEQ4LTB4REIgKi8KKwkweDgxLCAweERELCAweDgxLCAweERFLCAweDgxLCAweERGLCAweDgxLCAweEUwLCAvKiAweERDLTB4REYgKi8KKwkweEIwLCAweEVELCAweEIwLCAweEVFLCAweDgxLCAweEUxLCAweDgxLCAweEUyLCAvKiAweEUwLTB4RTMgKi8KKwkweEIwLCAweEVGLCAweDgxLCAweEUzLCAweDgxLCAweEU0LCAweEIwLCAweEYwLCAvKiAweEU0LTB4RTcgKi8KKwkweEIwLCAweEYxLCAweDgxLCAweEU1LCAweEIwLCAweEYyLCAweDgxLCAweEU2LCAvKiAweEU4LTB4RUIgKi8KKwkweEIwLCAweEYzLCAweDgxLCAweEU3LCAweDgxLCAweEU4LCAweEIwLCAweEY0LCAvKiAweEVDLTB4RUYgKi8KKwkweEIwLCAweEY1LCAweEIwLCAweEY2LCAweDgxLCAweEU5LCAweEIwLCAweEY3LCAvKiAweEYwLTB4RjMgKi8KKwkweDgxLCAweEVBLCAweEIwLCAweEY4LCAweEIwLCAweEY5LCAweDgxLCAweEVCLCAvKiAweEY0LTB4RjcgKi8KKwkweDgxLCAweEVDLCAweDgxLCAweEVELCAweDgxLCAweEVFLCAweDgxLCAweEVGLCAvKiAweEY4LTB4RkIgKi8KKwkweEIwLCAweEZBLCAweEIwLCAweEZCLCAweDgxLCAweEYwLCAweDgxLCAweEYxLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19BRFs1MTJdID0geworCTB4QjAsIDB4RkMsIDB4ODEsIDB4RjIsIDB4ODEsIDB4RjMsIDB4ODEsIDB4RjQsIC8qIDB4MDAtMHgwMyAqLworCTB4QjAsIDB4RkQsIDB4ODEsIDB4RjUsIDB4QjAsIDB4RkUsIDB4ODEsIDB4RjYsIC8qIDB4MDQtMHgwNyAqLworCTB4ODEsIDB4RjcsIDB4ODEsIDB4RjgsIDB4ODEsIDB4RjksIDB4ODEsIDB4RkEsIC8qIDB4MDgtMHgwQiAqLworCTB4QjEsIDB4QTEsIDB4QjEsIDB4QTIsIDB4ODEsIDB4RkIsIDB4QjEsIDB4QTMsIC8qIDB4MEMtMHgwRiAqLworCTB4ODEsIDB4RkMsIDB4QjEsIDB4QTQsIDB4ODEsIDB4RkQsIDB4ODEsIDB4RkUsIC8qIDB4MTAtMHgxMyAqLworCTB4ODIsIDB4NDEsIDB4ODIsIDB4NDIsIDB4ODIsIDB4NDMsIDB4ODIsIDB4NDQsIC8qIDB4MTQtMHgxNyAqLworCTB4QjEsIDB4QTUsIDB4ODIsIDB4NDUsIDB4ODIsIDB4NDYsIDB4ODIsIDB4NDcsIC8qIDB4MTgtMHgxQiAqLworCTB4QjEsIDB4QTYsIDB4ODIsIDB4NDgsIDB4ODIsIDB4NDksIDB4ODIsIDB4NEEsIC8qIDB4MUMtMHgxRiAqLworCTB4QjEsIDB4QTcsIDB4ODIsIDB4NEIsIDB4ODIsIDB4NEMsIDB4ODIsIDB4NEQsIC8qIDB4MjAtMHgyMyAqLworCTB4ODIsIDB4NEUsIDB4ODIsIDB4NEYsIDB4ODIsIDB4NTAsIDB4ODIsIDB4NTEsIC8qIDB4MjQtMHgyNyAqLworCTB4ODIsIDB4NTIsIDB4QjEsIDB4QTgsIDB4ODIsIDB4NTMsIDB4ODIsIDB4NTQsIC8qIDB4MjgtMHgyQiAqLworCTB4QjEsIDB4QTksIDB4QjEsIDB4QUEsIDB4ODIsIDB4NTUsIDB4ODIsIDB4NTYsIC8qIDB4MkMtMHgyRiAqLworCTB4ODIsIDB4NTcsIDB4ODIsIDB4NTgsIDB4ODIsIDB4NTksIDB4ODIsIDB4NUEsIC8qIDB4MzAtMHgzMyAqLworCTB4QjEsIDB4QUIsIDB4QjEsIDB4QUMsIDB4ODIsIDB4NjEsIDB4ODIsIDB4NjIsIC8qIDB4MzQtMHgzNyAqLworCTB4QjEsIDB4QUQsIDB4ODIsIDB4NjMsIDB4ODIsIDB4NjQsIDB4ODIsIDB4NjUsIC8qIDB4MzgtMHgzQiAqLworCTB4QjEsIDB4QUUsIDB4ODIsIDB4NjYsIDB4ODIsIDB4NjcsIDB4ODIsIDB4NjgsIC8qIDB4M0MtMHgzRiAqLworCTB4ODIsIDB4NjksIDB4ODIsIDB4NkEsIDB4ODIsIDB4NkIsIDB4ODIsIDB4NkMsIC8qIDB4NDAtMHg0MyAqLworCTB4QjEsIDB4QUYsIDB4QjEsIDB4QjAsIDB4ODIsIDB4NkQsIDB4QjEsIDB4QjEsIC8qIDB4NDQtMHg0NyAqLworCTB4ODIsIDB4NkUsIDB4QjEsIDB4QjIsIDB4ODIsIDB4NkYsIDB4ODIsIDB4NzAsIC8qIDB4NDgtMHg0QiAqLworCTB4ODIsIDB4NzEsIDB4ODIsIDB4NzIsIDB4ODIsIDB4NzMsIDB4ODIsIDB4NzQsIC8qIDB4NEMtMHg0RiAqLworCTB4QjEsIDB4QjMsIDB4ODIsIDB4NzUsIDB4ODIsIDB4NzYsIDB4ODIsIDB4NzcsIC8qIDB4NTAtMHg1MyAqLworCTB4QjEsIDB4QjQsIDB4ODIsIDB4NzgsIDB4ODIsIDB4NzksIDB4ODIsIDB4N0EsIC8qIDB4NTQtMHg1NyAqLworCTB4QjEsIDB4QjUsIDB4ODIsIDB4ODEsIDB4ODIsIDB4ODIsIDB4ODIsIDB4ODMsIC8qIDB4NTgtMHg1QiAqLworCTB4ODIsIDB4ODQsIDB4ODIsIDB4ODUsIDB4ODIsIDB4ODYsIDB4ODIsIDB4ODcsIC8qIDB4NUMtMHg1RiAqLworCTB4ODIsIDB4ODgsIDB4QjEsIDB4QjYsIDB4ODIsIDB4ODksIDB4QjEsIDB4QjcsIC8qIDB4NjAtMHg2MyAqLworCTB4ODIsIDB4OEEsIDB4ODIsIDB4OEIsIDB4ODIsIDB4OEMsIDB4ODIsIDB4OEQsIC8qIDB4NjQtMHg2NyAqLworCTB4ODIsIDB4OEUsIDB4ODIsIDB4OEYsIDB4ODIsIDB4OTAsIDB4ODIsIDB4OTEsIC8qIDB4NjgtMHg2QiAqLworCTB4QjEsIDB4QjgsIDB4QjEsIDB4QjksIDB4ODIsIDB4OTIsIDB4ODIsIDB4OTMsIC8qIDB4NkMtMHg2RiAqLworCTB4QjEsIDB4QkEsIDB4ODIsIDB4OTQsIDB4ODIsIDB4OTUsIDB4QjEsIDB4QkIsIC8qIDB4NzAtMHg3MyAqLworCTB4QjEsIDB4QkMsIDB4QjEsIDB4QkQsIDB4QjEsIDB4QkUsIDB4ODIsIDB4OTYsIC8qIDB4NzQtMHg3NyAqLworCTB4ODIsIDB4OTcsIDB4ODIsIDB4OTgsIDB4ODIsIDB4OTksIDB4QjEsIDB4QkYsIC8qIDB4NzgtMHg3QiAqLworCTB4QjEsIDB4QzAsIDB4QjEsIDB4QzEsIDB4ODIsIDB4OUEsIDB4QjEsIDB4QzIsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4ODIsIDB4OUIsIDB4QjEsIDB4QzMsIDB4QjEsIDB4QzQsIDB4ODIsIDB4OUMsIC8qIDB4ODAtMHg4MyAqLworCTB4ODIsIDB4OUQsIDB4ODIsIDB4OUUsIDB4ODIsIDB4OUYsIDB4ODIsIDB4QTAsIC8qIDB4ODQtMHg4NyAqLworCTB4QjEsIDB4QzUsIDB4QjEsIDB4QzYsIDB4ODIsIDB4QTEsIDB4ODIsIDB4QTIsIC8qIDB4ODgtMHg4QiAqLworCTB4QjEsIDB4QzcsIDB4ODIsIDB4QTMsIDB4ODIsIDB4QTQsIDB4ODIsIDB4QTUsIC8qIDB4OEMtMHg4RiAqLworCTB4QjEsIDB4QzgsIDB4ODIsIDB4QTYsIDB4ODIsIDB4QTcsIDB4ODIsIDB4QTgsIC8qIDB4OTAtMHg5MyAqLworCTB4ODIsIDB4QTksIDB4ODIsIDB4QUEsIDB4ODIsIDB4QUIsIDB4ODIsIDB4QUMsIC8qIDB4OTQtMHg5NyAqLworCTB4ODIsIDB4QUQsIDB4ODIsIDB4QUUsIDB4ODIsIDB4QUYsIDB4ODIsIDB4QjAsIC8qIDB4OTgtMHg5QiAqLworCTB4QjEsIDB4QzksIDB4QjEsIDB4Q0EsIDB4ODIsIDB4QjEsIDB4ODIsIDB4QjIsIC8qIDB4OUMtMHg5RiAqLworCTB4ODIsIDB4QjMsIDB4ODIsIDB4QjQsIDB4ODIsIDB4QjUsIDB4ODIsIDB4QjYsIC8qIDB4QTAtMHhBMyAqLworCTB4QjEsIDB4Q0IsIDB4ODIsIDB4QjcsIDB4ODIsIDB4QjgsIDB4ODIsIDB4QjksIC8qIDB4QTQtMHhBNyAqLworCTB4ODIsIDB4QkEsIDB4ODIsIDB4QkIsIDB4ODIsIDB4QkMsIDB4ODIsIDB4QkQsIC8qIDB4QTgtMHhBQiAqLworCTB4ODIsIDB4QkUsIDB4ODIsIDB4QkYsIDB4ODIsIDB4QzAsIDB4ODIsIDB4QzEsIC8qIDB4QUMtMHhBRiAqLworCTB4ODIsIDB4QzIsIDB4ODIsIDB4QzMsIDB4ODIsIDB4QzQsIDB4ODIsIDB4QzUsIC8qIDB4QjAtMHhCMyAqLworCTB4ODIsIDB4QzYsIDB4ODIsIDB4QzcsIDB4ODIsIDB4QzgsIDB4QjEsIDB4Q0MsIC8qIDB4QjQtMHhCNyAqLworCTB4ODIsIDB4QzksIDB4ODIsIDB4Q0EsIDB4ODIsIDB4Q0IsIDB4ODIsIDB4Q0MsIC8qIDB4QjgtMHhCQiAqLworCTB4ODIsIDB4Q0QsIDB4ODIsIDB4Q0UsIDB4ODIsIDB4Q0YsIDB4ODIsIDB4RDAsIC8qIDB4QkMtMHhCRiAqLworCTB4QjEsIDB4Q0QsIDB4QjEsIDB4Q0UsIDB4ODIsIDB4RDEsIDB4ODIsIDB4RDIsIC8qIDB4QzAtMHhDMyAqLworCTB4QjEsIDB4Q0YsIDB4ODIsIDB4RDMsIDB4ODIsIDB4RDQsIDB4ODIsIDB4RDUsIC8qIDB4QzQtMHhDNyAqLworCTB4QjEsIDB4RDAsIDB4ODIsIDB4RDYsIDB4ODIsIDB4RDcsIDB4ODIsIDB4RDgsIC8qIDB4QzgtMHhDQiAqLworCTB4ODIsIDB4RDksIDB4ODIsIDB4REEsIDB4ODIsIDB4REIsIDB4ODIsIDB4REMsIC8qIDB4Q0MtMHhDRiAqLworCTB4QjEsIDB4RDEsIDB4QjEsIDB4RDIsIDB4ODIsIDB4REQsIDB4QjEsIDB4RDMsIC8qIDB4RDAtMHhEMyAqLworCTB4ODIsIDB4REUsIDB4ODIsIDB4REYsIDB4ODIsIDB4RTAsIDB4ODIsIDB4RTEsIC8qIDB4RDQtMHhENyAqLworCTB4ODIsIDB4RTIsIDB4ODIsIDB4RTMsIDB4ODIsIDB4RTQsIDB4ODIsIDB4RTUsIC8qIDB4RDgtMHhEQiAqLworCTB4QjEsIDB4RDQsIDB4ODIsIDB4RTYsIDB4ODIsIDB4RTcsIDB4ODIsIDB4RTgsIC8qIDB4REMtMHhERiAqLworCTB4QjEsIDB4RDUsIDB4ODIsIDB4RTksIDB4ODIsIDB4RUEsIDB4ODIsIDB4RUIsIC8qIDB4RTAtMHhFMyAqLworCTB4QjEsIDB4RDYsIDB4ODIsIDB4RUMsIDB4ODIsIDB4RUQsIDB4ODIsIDB4RUUsIC8qIDB4RTQtMHhFNyAqLworCTB4ODIsIDB4RUYsIDB4ODIsIDB4RjAsIDB4ODIsIDB4RjEsIDB4ODIsIDB4RjIsIC8qIDB4RTgtMHhFQiAqLworCTB4ODIsIDB4RjMsIDB4ODIsIDB4RjQsIDB4ODIsIDB4RjUsIDB4ODIsIDB4RjYsIC8qIDB4RUMtMHhFRiAqLworCTB4ODIsIDB4RjcsIDB4ODIsIDB4RjgsIDB4ODIsIDB4RjksIDB4ODIsIDB4RkEsIC8qIDB4RjAtMHhGMyAqLworCTB4ODIsIDB4RkIsIDB4ODIsIDB4RkMsIDB4ODIsIDB4RkQsIDB4ODIsIDB4RkUsIC8qIDB4RjQtMHhGNyAqLworCTB4QjEsIDB4RDcsIDB4QjEsIDB4RDgsIDB4ODMsIDB4NDEsIDB4ODMsIDB4NDIsIC8qIDB4RjgtMHhGQiAqLworCTB4QjEsIDB4RDksIDB4ODMsIDB4NDMsIDB4ODMsIDB4NDQsIDB4QjEsIDB4REEsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0FFWzUxMl0gPSB7CisJMHhCMSwgMHhEQiwgMHhCMSwgMHhEQywgMHg4MywgMHg0NSwgMHg4MywgMHg0NiwgLyogMHgwMC0weDAzICovCisJMHg4MywgMHg0NywgMHg4MywgMHg0OCwgMHg4MywgMHg0OSwgMHg4MywgMHg0QSwgLyogMHgwNC0weDA3ICovCisJMHhCMSwgMHhERCwgMHhCMSwgMHhERSwgMHg4MywgMHg0QiwgMHhCMSwgMHhERiwgLyogMHgwOC0weDBCICovCisJMHg4MywgMHg0QywgMHhCMSwgMHhFMCwgMHg4MywgMHg0RCwgMHg4MywgMHg0RSwgLyogMHgwQy0weDBGICovCisJMHg4MywgMHg0RiwgMHg4MywgMHg1MCwgMHg4MywgMHg1MSwgMHg4MywgMHg1MiwgLyogMHgxMC0weDEzICovCisJMHhCMSwgMHhFMSwgMHg4MywgMHg1MywgMHg4MywgMHg1NCwgMHg4MywgMHg1NSwgLyogMHgxNC0weDE3ICovCisJMHg4MywgMHg1NiwgMHg4MywgMHg1NywgMHg4MywgMHg1OCwgMHg4MywgMHg1OSwgLyogMHgxOC0weDFCICovCisJMHg4MywgMHg1QSwgMHg4MywgMHg2MSwgMHg4MywgMHg2MiwgMHg4MywgMHg2MywgLyogMHgxQy0weDFGICovCisJMHg4MywgMHg2NCwgMHg4MywgMHg2NSwgMHg4MywgMHg2NiwgMHg4MywgMHg2NywgLyogMHgyMC0weDIzICovCisJMHg4MywgMHg2OCwgMHg4MywgMHg2OSwgMHg4MywgMHg2QSwgMHg4MywgMHg2QiwgLyogMHgyNC0weDI3ICovCisJMHg4MywgMHg2QywgMHg4MywgMHg2RCwgMHg4MywgMHg2RSwgMHg4MywgMHg2RiwgLyogMHgyOC0weDJCICovCisJMHg4MywgMHg3MCwgMHg4MywgMHg3MSwgMHg4MywgMHg3MiwgMHg4MywgMHg3MywgLyogMHgyQy0weDJGICovCisJMHhCMSwgMHhFMiwgMHhCMSwgMHhFMywgMHg4MywgMHg3NCwgMHg4MywgMHg3NSwgLyogMHgzMC0weDMzICovCisJMHhCMSwgMHhFNCwgMHg4MywgMHg3NiwgMHg4MywgMHg3NywgMHhCMSwgMHhFNSwgLyogMHgzNC0weDM3ICovCisJMHhCMSwgMHhFNiwgMHg4MywgMHg3OCwgMHhCMSwgMHhFNywgMHg4MywgMHg3OSwgLyogMHgzOC0weDNCICovCisJMHg4MywgMHg3QSwgMHg4MywgMHg4MSwgMHg4MywgMHg4MiwgMHg4MywgMHg4MywgLyogMHgzQy0weDNGICovCisJMHhCMSwgMHhFOCwgMHhCMSwgMHhFOSwgMHg4MywgMHg4NCwgMHhCMSwgMHhFQSwgLyogMHg0MC0weDQzICovCisJMHg4MywgMHg4NSwgMHhCMSwgMHhFQiwgMHhCMSwgMHhFQywgMHg4MywgMHg4NiwgLyogMHg0NC0weDQ3ICovCisJMHg4MywgMHg4NywgMHg4MywgMHg4OCwgMHhCMSwgMHhFRCwgMHg4MywgMHg4OSwgLyogMHg0OC0weDRCICovCisJMHhCMSwgMHhFRSwgMHhCMSwgMHhFRiwgMHhCMSwgMHhGMCwgMHg4MywgMHg4QSwgLyogMHg0Qy0weDRGICovCisJMHhCMSwgMHhGMSwgMHg4MywgMHg4QiwgMHg4MywgMHg4QywgMHg4MywgMHg4RCwgLyogMHg1MC0weDUzICovCisJMHhCMSwgMHhGMiwgMHg4MywgMHg4RSwgMHhCMSwgMHhGMywgMHg4MywgMHg4RiwgLyogMHg1NC0weDU3ICovCisJMHg4MywgMHg5MCwgMHg4MywgMHg5MSwgMHg4MywgMHg5MiwgMHg4MywgMHg5MywgLyogMHg1OC0weDVCICovCisJMHhCMSwgMHhGNCwgMHhCMSwgMHhGNSwgMHg4MywgMHg5NCwgMHhCMSwgMHhGNiwgLyogMHg1Qy0weDVGICovCisJMHhCMSwgMHhGNywgMHhCMSwgMHhGOCwgMHg4MywgMHg5NSwgMHg4MywgMHg5NiwgLyogMHg2MC0weDYzICovCisJMHg4MywgMHg5NywgMHhCMSwgMHhGOSwgMHg4MywgMHg5OCwgMHg4MywgMHg5OSwgLyogMHg2NC0weDY3ICovCisJMHhCMSwgMHhGQSwgMHhCMSwgMHhGQiwgMHg4MywgMHg5QSwgMHg4MywgMHg5QiwgLyogMHg2OC0weDZCICovCisJMHhCMSwgMHhGQywgMHg4MywgMHg5QywgMHg4MywgMHg5RCwgMHg4MywgMHg5RSwgLyogMHg2Qy0weDZGICovCisJMHhCMSwgMHhGRCwgMHg4MywgMHg5RiwgMHg4MywgMHhBMCwgMHg4MywgMHhBMSwgLyogMHg3MC0weDczICovCisJMHg4MywgMHhBMiwgMHg4MywgMHhBMywgMHg4MywgMHhBNCwgMHg4MywgMHhBNSwgLyogMHg3NC0weDc3ICovCisJMHhCMSwgMHhGRSwgMHhCMiwgMHhBMSwgMHg4MywgMHhBNiwgMHhCMiwgMHhBMiwgLyogMHg3OC0weDdCICovCisJMHhCMiwgMHhBMywgMHhCMiwgMHhBNCwgMHg4MywgMHhBNywgMHg4MywgMHhBOCwgLyogMHg3Qy0weDdGICovCisJCisJMHg4MywgMHhBOSwgMHg4MywgMHhBQSwgMHg4MywgMHhBQiwgMHg4MywgMHhBQywgLyogMHg4MC0weDgzICovCisJMHhCMiwgMHhBNSwgMHhCMiwgMHhBNiwgMHg4MywgMHhBRCwgMHg4MywgMHhBRSwgLyogMHg4NC0weDg3ICovCisJMHg4MywgMHhBRiwgMHg4MywgMHhCMCwgMHg4MywgMHhCMSwgMHg4MywgMHhCMiwgLyogMHg4OC0weDhCICovCisJMHhCMiwgMHhBNywgMHg4MywgMHhCMywgMHg4MywgMHhCNCwgMHg4MywgMHhCNSwgLyogMHg4Qy0weDhGICovCisJMHg4MywgMHhCNiwgMHg4MywgMHhCNywgMHg4MywgMHhCOCwgMHg4MywgMHhCOSwgLyogMHg5MC0weDkzICovCisJMHg4MywgMHhCQSwgMHg4MywgMHhCQiwgMHg4MywgMHhCQywgMHg4MywgMHhCRCwgLyogMHg5NC0weDk3ICovCisJMHg4MywgMHhCRSwgMHg4MywgMHhCRiwgMHg4MywgMHhDMCwgMHg4MywgMHhDMSwgLyogMHg5OC0weDlCICovCisJMHg4MywgMHhDMiwgMHg4MywgMHhDMywgMHg4MywgMHhDNCwgMHg4MywgMHhDNSwgLyogMHg5Qy0weDlGICovCisJMHg4MywgMHhDNiwgMHg4MywgMHhDNywgMHg4MywgMHhDOCwgMHg4MywgMHhDOSwgLyogMHhBMC0weEEzICovCisJMHg4MywgMHhDQSwgMHg4MywgMHhDQiwgMHg4MywgMHhDQywgMHg4MywgMHhDRCwgLyogMHhBNC0weEE3ICovCisJMHg4MywgMHhDRSwgMHg4MywgMHhDRiwgMHg4MywgMHhEMCwgMHg4MywgMHhEMSwgLyogMHhBOC0weEFCICovCisJMHg4MywgMHhEMiwgMHg4MywgMHhEMywgMHg4MywgMHhENCwgMHg4MywgMHhENSwgLyogMHhBQy0weEFGICovCisJMHg4MywgMHhENiwgMHg4MywgMHhENywgMHg4MywgMHhEOCwgMHg4MywgMHhEOSwgLyogMHhCMC0weEIzICovCisJMHg4MywgMHhEQSwgMHg4MywgMHhEQiwgMHg4MywgMHhEQywgMHg4MywgMHhERCwgLyogMHhCNC0weEI3ICovCisJMHg4MywgMHhERSwgMHg4MywgMHhERiwgMHg4MywgMHhFMCwgMHg4MywgMHhFMSwgLyogMHhCOC0weEJCICovCisJMHhCMiwgMHhBOCwgMHhCMiwgMHhBOSwgMHhCMiwgMHhBQSwgMHg4MywgMHhFMiwgLyogMHhCQy0weEJGICovCisJMHhCMiwgMHhBQiwgMHg4MywgMHhFMywgMHg4MywgMHhFNCwgMHg4MywgMHhFNSwgLyogMHhDMC0weEMzICovCisJMHhCMiwgMHhBQywgMHg4MywgMHhFNiwgMHg4MywgMHhFNywgMHg4MywgMHhFOCwgLyogMHhDNC0weEM3ICovCisJMHg4MywgMHhFOSwgMHg4MywgMHhFQSwgMHg4MywgMHhFQiwgMHg4MywgMHhFQywgLyogMHhDOC0weENCICovCisJMHhCMiwgMHhBRCwgMHhCMiwgMHhBRSwgMHg4MywgMHhFRCwgMHhCMiwgMHhBRiwgLyogMHhDQy0weENGICovCisJMHhCMiwgMHhCMCwgMHhCMiwgMHhCMSwgMHg4MywgMHhFRSwgMHg4MywgMHhFRiwgLyogMHhEMC0weEQzICovCisJMHg4MywgMHhGMCwgMHg4MywgMHhGMSwgMHg4MywgMHhGMiwgMHg4MywgMHhGMywgLyogMHhENC0weEQ3ICovCisJMHhCMiwgMHhCMiwgMHhCMiwgMHhCMywgMHg4MywgMHhGNCwgMHg4MywgMHhGNSwgLyogMHhEOC0weERCICovCisJMHhCMiwgMHhCNCwgMHg4MywgMHhGNiwgMHg4MywgMHhGNywgMHg4MywgMHhGOCwgLyogMHhEQy0weERGICovCisJMHg4MywgMHhGOSwgMHg4MywgMHhGQSwgMHg4MywgMHhGQiwgMHg4MywgMHhGQywgLyogMHhFMC0weEUzICovCisJMHg4MywgMHhGRCwgMHg4MywgMHhGRSwgMHg4NCwgMHg0MSwgMHg4NCwgMHg0MiwgLyogMHhFNC0weEU3ICovCisJMHhCMiwgMHhCNSwgMHg4NCwgMHg0MywgMHg4NCwgMHg0NCwgMHhCMiwgMHhCNiwgLyogMHhFOC0weEVCICovCisJMHg4NCwgMHg0NSwgMHhCMiwgMHhCNywgMHg4NCwgMHg0NiwgMHg4NCwgMHg0NywgLyogMHhFQy0weEVGICovCisJMHg4NCwgMHg0OCwgMHg4NCwgMHg0OSwgMHg4NCwgMHg0QSwgMHg4NCwgMHg0QiwgLyogMHhGMC0weEYzICovCisJMHhCMiwgMHhCOCwgMHg4NCwgMHg0QywgMHg4NCwgMHg0RCwgMHg4NCwgMHg0RSwgLyogMHhGNC0weEY3ICovCisJMHhCMiwgMHhCOSwgMHg4NCwgMHg0RiwgMHg4NCwgMHg1MCwgMHg4NCwgMHg1MSwgLyogMHhGOC0weEZCICovCisJMHhCMiwgMHhCQSwgMHg4NCwgMHg1MiwgMHg4NCwgMHg1MywgMHg4NCwgMHg1NCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfQUZbNTEyXSA9IHsKKwkweDg0LCAweDU1LCAweDg0LCAweDU2LCAweDg0LCAweDU3LCAweDg0LCAweDU4LCAvKiAweDAwLTB4MDMgKi8KKwkweDg0LCAweDU5LCAweDg0LCAweDVBLCAweDg0LCAweDYxLCAweEIyLCAweEJCLCAvKiAweDA0LTB4MDcgKi8KKwkweEIyLCAweEJDLCAweDg0LCAweDYyLCAweDg0LCAweDYzLCAweDg0LCAweDY0LCAvKiAweDA4LTB4MEIgKi8KKwkweDg0LCAweDY1LCAweEIyLCAweEJELCAweDg0LCAweDY2LCAweDg0LCAweDY3LCAvKiAweDBDLTB4MEYgKi8KKwkweEIyLCAweEJFLCAweDg0LCAweDY4LCAweDg0LCAweDY5LCAweDg0LCAweDZBLCAvKiAweDEwLTB4MTMgKi8KKwkweDg0LCAweDZCLCAweDg0LCAweDZDLCAweDg0LCAweDZELCAweDg0LCAweDZFLCAvKiAweDE0LTB4MTcgKi8KKwkweDg0LCAweDZGLCAweDg0LCAweDcwLCAweDg0LCAweDcxLCAweDg0LCAweDcyLCAvKiAweDE4LTB4MUIgKi8KKwkweDg0LCAweDczLCAweDg0LCAweDc0LCAweDg0LCAweDc1LCAweDg0LCAweDc2LCAvKiAweDFDLTB4MUYgKi8KKwkweDg0LCAweDc3LCAweDg0LCAweDc4LCAweDg0LCAweDc5LCAweDg0LCAweDdBLCAvKiAweDIwLTB4MjMgKi8KKwkweDg0LCAweDgxLCAweDg0LCAweDgyLCAweDg0LCAweDgzLCAweDg0LCAweDg0LCAvKiAweDI0LTB4MjcgKi8KKwkweDg0LCAweDg1LCAweDg0LCAweDg2LCAweDg0LCAweDg3LCAweDg0LCAweDg4LCAvKiAweDI4LTB4MkIgKi8KKwkweEIyLCAweEJGLCAweEIyLCAweEMwLCAweDg0LCAweDg5LCAweDg0LCAweDhBLCAvKiAweDJDLTB4MkYgKi8KKwkweEIyLCAweEMxLCAweDg0LCAweDhCLCAweEIyLCAweEMyLCAweDg0LCAweDhDLCAvKiAweDMwLTB4MzMgKi8KKwkweEIyLCAweEMzLCAweDg0LCAweDhELCAweDg0LCAweDhFLCAweDg0LCAweDhGLCAvKiAweDM0LTB4MzcgKi8KKwkweDg0LCAweDkwLCAweDg0LCAweDkxLCAweDg0LCAweDkyLCAweDg0LCAweDkzLCAvKiAweDM4LTB4M0IgKi8KKwkweEIyLCAweEM0LCAweEIyLCAweEM1LCAweDg0LCAweDk0LCAweEIyLCAweEM2LCAvKiAweDNDLTB4M0YgKi8KKwkweDg0LCAweDk1LCAweEIyLCAweEM3LCAweEIyLCAweEM4LCAweEIyLCAweEM5LCAvKiAweDQwLTB4NDMgKi8KKwkweDg0LCAweDk2LCAweDg0LCAweDk3LCAweDg0LCAweDk4LCAweDg0LCAweDk5LCAvKiAweDQ0LTB4NDcgKi8KKwkweEIyLCAweENBLCAweEIyLCAweENCLCAweDg0LCAweDlBLCAweDg0LCAweDlCLCAvKiAweDQ4LTB4NEIgKi8KKwkweDg0LCAweDlDLCAweDg0LCAweDlELCAweDg0LCAweDlFLCAweDg0LCAweDlGLCAvKiAweDRDLTB4NEYgKi8KKwkweEIyLCAweENDLCAweDg0LCAweEEwLCAweDg0LCAweEExLCAweDg0LCAweEEyLCAvKiAweDUwLTB4NTMgKi8KKwkweDg0LCAweEEzLCAweDg0LCAweEE0LCAweDg0LCAweEE1LCAweDg0LCAweEE2LCAvKiAweDU0LTB4NTcgKi8KKwkweDg0LCAweEE3LCAweDg0LCAweEE4LCAweDg0LCAweEE5LCAweDg0LCAweEFBLCAvKiAweDU4LTB4NUIgKi8KKwkweEIyLCAweENELCAweEIyLCAweENFLCAweDg0LCAweEFCLCAweDg0LCAweEFDLCAvKiAweDVDLTB4NUYgKi8KKwkweDg0LCAweEFELCAweDg0LCAweEFFLCAweDg0LCAweEFGLCAweDg0LCAweEIwLCAvKiAweDYwLTB4NjMgKi8KKwkweEIyLCAweENGLCAweEIyLCAweEQwLCAweDg0LCAweEIxLCAweDg0LCAweEIyLCAvKiAweDY0LTB4NjcgKi8KKwkweDg0LCAweEIzLCAweDg0LCAweEI0LCAweDg0LCAweEI1LCAweDg0LCAweEI2LCAvKiAweDY4LTB4NkIgKi8KKwkweDg0LCAweEI3LCAweDg0LCAweEI4LCAweDg0LCAweEI5LCAweDg0LCAweEJBLCAvKiAweDZDLTB4NkYgKi8KKwkweDg0LCAweEJCLCAweDg0LCAweEJDLCAweDg0LCAweEJELCAweDg0LCAweEJFLCAvKiAweDcwLTB4NzMgKi8KKwkweDg0LCAweEJGLCAweDg0LCAweEMwLCAweDg0LCAweEMxLCAweDg0LCAweEMyLCAvKiAweDc0LTB4NzcgKi8KKwkweDg0LCAweEMzLCAweEIyLCAweEQxLCAweDg0LCAweEM0LCAweDg0LCAweEM1LCAvKiAweDc4LTB4N0IgKi8KKwkweDg0LCAweEM2LCAweDg0LCAweEM3LCAweDg0LCAweEM4LCAweDg0LCAweEM5LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEIyLCAweEQyLCAweDg0LCAweENBLCAweDg0LCAweENCLCAweDg0LCAweENDLCAvKiAweDgwLTB4ODMgKi8KKwkweEIyLCAweEQzLCAweDg0LCAweENELCAweDg0LCAweENFLCAweDg0LCAweENGLCAvKiAweDg0LTB4ODcgKi8KKwkweEIyLCAweEQ0LCAweDg0LCAweEQwLCAweDg0LCAweEQxLCAweDg0LCAweEQyLCAvKiAweDg4LTB4OEIgKi8KKwkweDg0LCAweEQzLCAweDg0LCAweEQ0LCAweDg0LCAweEQ1LCAweDg0LCAweEQ2LCAvKiAweDhDLTB4OEYgKi8KKwkweEIyLCAweEQ1LCAweEIyLCAweEQ2LCAweDg0LCAweEQ3LCAweDg0LCAweEQ4LCAvKiAweDkwLTB4OTMgKi8KKwkweDg0LCAweEQ5LCAweEIyLCAweEQ3LCAweDg0LCAweERBLCAweDg0LCAweERCLCAvKiAweDk0LTB4OTcgKi8KKwkweDg0LCAweERDLCAweDg0LCAweERELCAweDg0LCAweERFLCAweDg0LCAweERGLCAvKiAweDk4LTB4OUIgKi8KKwkweEIyLCAweEQ4LCAweDg0LCAweEUwLCAweDg0LCAweEUxLCAweDg0LCAweEUyLCAvKiAweDlDLTB4OUYgKi8KKwkweDg0LCAweEUzLCAweDg0LCAweEU0LCAweDg0LCAweEU1LCAweDg0LCAweEU2LCAvKiAweEEwLTB4QTMgKi8KKwkweDg0LCAweEU3LCAweDg0LCAweEU4LCAweDg0LCAweEU5LCAweDg0LCAweEVBLCAvKiAweEE0LTB4QTcgKi8KKwkweDg0LCAweEVCLCAweDg0LCAweEVDLCAweDg0LCAweEVELCAweDg0LCAweEVFLCAvKiAweEE4LTB4QUIgKi8KKwkweDg0LCAweEVGLCAweDg0LCAweEYwLCAweDg0LCAweEYxLCAweDg0LCAweEYyLCAvKiAweEFDLTB4QUYgKi8KKwkweDg0LCAweEYzLCAweDg0LCAweEY0LCAweDg0LCAweEY1LCAweDg0LCAweEY2LCAvKiAweEIwLTB4QjMgKi8KKwkweDg0LCAweEY3LCAweDg0LCAweEY4LCAweDg0LCAweEY5LCAweDg0LCAweEZBLCAvKiAweEI0LTB4QjcgKi8KKwkweEIyLCAweEQ5LCAweEIyLCAweERBLCAweDg0LCAweEZCLCAweDg0LCAweEZDLCAvKiAweEI4LTB4QkIgKi8KKwkweEIyLCAweERCLCAweDg0LCAweEZELCAweDg0LCAweEZFLCAweDg1LCAweDQxLCAvKiAweEJDLTB4QkYgKi8KKwkweEIyLCAweERDLCAweDg1LCAweDQyLCAweDg1LCAweDQzLCAweDg1LCAweDQ0LCAvKiAweEMwLTB4QzMgKi8KKwkweDg1LCAweDQ1LCAweDg1LCAweDQ2LCAweDg1LCAweDQ3LCAweEIyLCAweERELCAvKiAweEM0LTB4QzcgKi8KKwkweEIyLCAweERFLCAweEIyLCAweERGLCAweDg1LCAweDQ4LCAweEIyLCAweEUwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDg1LCAweDQ5LCAweEIyLCAweEUxLCAweEIyLCAweEUyLCAweDg1LCAweDRBLCAvKiAweENDLTB4Q0YgKi8KKwkweDg1LCAweDRCLCAweDg1LCAweDRDLCAweDg1LCAweDRELCAweDg1LCAweDRFLCAvKiAweEQwLTB4RDMgKi8KKwkweEIyLCAweEUzLCAweDg1LCAweDRGLCAweDg1LCAweDUwLCAweDg1LCAweDUxLCAvKiAweEQ0LTB4RDcgKi8KKwkweDg1LCAweDUyLCAweDg1LCAweDUzLCAweDg1LCAweDU0LCAweDg1LCAweDU1LCAvKiAweEQ4LTB4REIgKi8KKwkweEIyLCAweEU0LCAweDg1LCAweDU2LCAweDg1LCAweDU3LCAweDg1LCAweDU4LCAvKiAweERDLTB4REYgKi8KKwkweDg1LCAweDU5LCAweDg1LCAweDVBLCAweDg1LCAweDYxLCAweDg1LCAweDYyLCAvKiAweEUwLTB4RTMgKi8KKwkweDg1LCAweDYzLCAweDg1LCAweDY0LCAweDg1LCAweDY1LCAweDg1LCAweDY2LCAvKiAweEU0LTB4RTcgKi8KKwkweEIyLCAweEU1LCAweEIyLCAweEU2LCAweDg1LCAweDY3LCAweDg1LCAweDY4LCAvKiAweEU4LTB4RUIgKi8KKwkweDg1LCAweDY5LCAweDg1LCAweDZBLCAweDg1LCAweDZCLCAweDg1LCAweDZDLCAvKiAweEVDLTB4RUYgKi8KKwkweEIyLCAweEU3LCAweEIyLCAweEU4LCAweDg1LCAweDZELCAweDg1LCAweDZFLCAvKiAweEYwLTB4RjMgKi8KKwkweEIyLCAweEU5LCAweDg1LCAweDZGLCAweDg1LCAweDcwLCAweDg1LCAweDcxLCAvKiAweEY0LTB4RjcgKi8KKwkweEIyLCAweEVBLCAweDg1LCAweDcyLCAweDg1LCAweDczLCAweDg1LCAweDc0LCAvKiAweEY4LTB4RkIgKi8KKwkweDg1LCAweDc1LCAweDg1LCAweDc2LCAweDg1LCAweDc3LCAweDg1LCAweDc4LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19CMFs1MTJdID0geworCTB4QjIsIDB4RUIsIDB4QjIsIDB4RUMsIDB4ODUsIDB4NzksIDB4ODUsIDB4N0EsIC8qIDB4MDAtMHgwMyAqLworCTB4QjIsIDB4RUQsIDB4ODUsIDB4ODEsIDB4ODUsIDB4ODIsIDB4ODUsIDB4ODMsIC8qIDB4MDQtMHgwNyAqLworCTB4ODUsIDB4ODQsIDB4ODUsIDB4ODUsIDB4ODUsIDB4ODYsIDB4ODUsIDB4ODcsIC8qIDB4MDgtMHgwQiAqLworCTB4QjIsIDB4RUUsIDB4ODUsIDB4ODgsIDB4ODUsIDB4ODksIDB4ODUsIDB4OEEsIC8qIDB4MEMtMHgwRiAqLworCTB4QjIsIDB4RUYsIDB4ODUsIDB4OEIsIDB4ODUsIDB4OEMsIDB4ODUsIDB4OEQsIC8qIDB4MTAtMHgxMyAqLworCTB4QjIsIDB4RjAsIDB4ODUsIDB4OEUsIDB4ODUsIDB4OEYsIDB4ODUsIDB4OTAsIC8qIDB4MTQtMHgxNyAqLworCTB4ODUsIDB4OTEsIDB4ODUsIDB4OTIsIDB4ODUsIDB4OTMsIDB4ODUsIDB4OTQsIC8qIDB4MTgtMHgxQiAqLworCTB4QjIsIDB4RjEsIDB4QjIsIDB4RjIsIDB4ODUsIDB4OTUsIDB4ODUsIDB4OTYsIC8qIDB4MUMtMHgxRiAqLworCTB4ODUsIDB4OTcsIDB4ODUsIDB4OTgsIDB4ODUsIDB4OTksIDB4ODUsIDB4OUEsIC8qIDB4MjAtMHgyMyAqLworCTB4ODUsIDB4OUIsIDB4ODUsIDB4OUMsIDB4ODUsIDB4OUQsIDB4ODUsIDB4OUUsIC8qIDB4MjQtMHgyNyAqLworCTB4QjIsIDB4RjMsIDB4ODUsIDB4OUYsIDB4ODUsIDB4QTAsIDB4ODUsIDB4QTEsIC8qIDB4MjgtMHgyQiAqLworCTB4ODUsIDB4QTIsIDB4ODUsIDB4QTMsIDB4ODUsIDB4QTQsIDB4ODUsIDB4QTUsIC8qIDB4MkMtMHgyRiAqLworCTB4ODUsIDB4QTYsIDB4ODUsIDB4QTcsIDB4ODUsIDB4QTgsIDB4ODUsIDB4QTksIC8qIDB4MzAtMHgzMyAqLworCTB4ODUsIDB4QUEsIDB4ODUsIDB4QUIsIDB4ODUsIDB4QUMsIDB4ODUsIDB4QUQsIC8qIDB4MzQtMHgzNyAqLworCTB4ODUsIDB4QUUsIDB4ODUsIDB4QUYsIDB4ODUsIDB4QjAsIDB4ODUsIDB4QjEsIC8qIDB4MzgtMHgzQiAqLworCTB4ODUsIDB4QjIsIDB4ODUsIDB4QjMsIDB4ODUsIDB4QjQsIDB4ODUsIDB4QjUsIC8qIDB4M0MtMHgzRiAqLworCTB4ODUsIDB4QjYsIDB4ODUsIDB4QjcsIDB4ODUsIDB4QjgsIDB4ODUsIDB4QjksIC8qIDB4NDAtMHg0MyAqLworCTB4QjIsIDB4RjQsIDB4QjIsIDB4RjUsIDB4ODUsIDB4QkEsIDB4ODUsIDB4QkIsIC8qIDB4NDQtMHg0NyAqLworCTB4QjIsIDB4RjYsIDB4ODUsIDB4QkMsIDB4QjIsIDB4RjcsIDB4ODUsIDB4QkQsIC8qIDB4NDgtMHg0QiAqLworCTB4QjIsIDB4RjgsIDB4ODUsIDB4QkUsIDB4QjIsIDB4RjksIDB4ODUsIDB4QkYsIC8qIDB4NEMtMHg0RiAqLworCTB4ODUsIDB4QzAsIDB4ODUsIDB4QzEsIDB4ODUsIDB4QzIsIDB4QjIsIDB4RkEsIC8qIDB4NTAtMHg1MyAqLworCTB4QjIsIDB4RkIsIDB4QjIsIDB4RkMsIDB4ODUsIDB4QzMsIDB4QjIsIDB4RkQsIC8qIDB4NTQtMHg1NyAqLworCTB4ODUsIDB4QzQsIDB4QjIsIDB4RkUsIDB4ODUsIDB4QzUsIDB4ODUsIDB4QzYsIC8qIDB4NTgtMHg1QiAqLworCTB4ODUsIDB4QzcsIDB4QjMsIDB4QTEsIDB4ODUsIDB4QzgsIDB4ODUsIDB4QzksIC8qIDB4NUMtMHg1RiAqLworCTB4ODUsIDB4Q0EsIDB4ODUsIDB4Q0IsIDB4ODUsIDB4Q0MsIDB4ODUsIDB4Q0QsIC8qIDB4NjAtMHg2MyAqLworCTB4ODUsIDB4Q0UsIDB4ODUsIDB4Q0YsIDB4ODUsIDB4RDAsIDB4ODUsIDB4RDEsIC8qIDB4NjQtMHg2NyAqLworCTB4ODUsIDB4RDIsIDB4ODUsIDB4RDMsIDB4ODUsIDB4RDQsIDB4ODUsIDB4RDUsIC8qIDB4NjgtMHg2QiAqLworCTB4ODUsIDB4RDYsIDB4ODUsIDB4RDcsIDB4ODUsIDB4RDgsIDB4ODUsIDB4RDksIC8qIDB4NkMtMHg2RiAqLworCTB4ODUsIDB4REEsIDB4ODUsIDB4REIsIDB4ODUsIDB4REMsIDB4ODUsIDB4REQsIC8qIDB4NzAtMHg3MyAqLworCTB4ODUsIDB4REUsIDB4ODUsIDB4REYsIDB4ODUsIDB4RTAsIDB4ODUsIDB4RTEsIC8qIDB4NzQtMHg3NyAqLworCTB4ODUsIDB4RTIsIDB4ODUsIDB4RTMsIDB4ODUsIDB4RTQsIDB4ODUsIDB4RTUsIC8qIDB4NzgtMHg3QiAqLworCTB4QjMsIDB4QTIsIDB4QjMsIDB4QTMsIDB4ODUsIDB4RTYsIDB4ODUsIDB4RTcsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QjMsIDB4QTQsIDB4ODUsIDB4RTgsIDB4ODUsIDB4RTksIDB4ODUsIDB4RUEsIC8qIDB4ODAtMHg4MyAqLworCTB4QjMsIDB4QTUsIDB4ODUsIDB4RUIsIDB4ODUsIDB4RUMsIDB4ODUsIDB4RUQsIC8qIDB4ODQtMHg4NyAqLworCTB4ODUsIDB4RUUsIDB4ODUsIDB4RUYsIDB4ODUsIDB4RjAsIDB4ODUsIDB4RjEsIC8qIDB4ODgtMHg4QiAqLworCTB4QjMsIDB4QTYsIDB4QjMsIDB4QTcsIDB4ODUsIDB4RjIsIDB4QjMsIDB4QTgsIC8qIDB4OEMtMHg4RiAqLworCTB4ODUsIDB4RjMsIDB4QjMsIDB4QTksIDB4ODUsIDB4RjQsIDB4ODUsIDB4RjUsIC8qIDB4OTAtMHg5MyAqLworCTB4ODUsIDB4RjYsIDB4ODUsIDB4RjcsIDB4ODUsIDB4RjgsIDB4ODUsIDB4RjksIC8qIDB4OTQtMHg5NyAqLworCTB4QjMsIDB4QUEsIDB4QjMsIDB4QUIsIDB4QjMsIDB4QUMsIDB4ODUsIDB4RkEsIC8qIDB4OTgtMHg5QiAqLworCTB4QjMsIDB4QUQsIDB4ODUsIDB4RkIsIDB4ODUsIDB4RkMsIDB4QjMsIDB4QUUsIC8qIDB4OUMtMHg5RiAqLworCTB4QjMsIDB4QUYsIDB4QjMsIDB4QjAsIDB4QjMsIDB4QjEsIDB4ODUsIDB4RkQsIC8qIDB4QTAtMHhBMyAqLworCTB4ODUsIDB4RkUsIDB4ODYsIDB4NDEsIDB4ODYsIDB4NDIsIDB4ODYsIDB4NDMsIC8qIDB4QTQtMHhBNyAqLworCTB4QjMsIDB4QjIsIDB4QjMsIDB4QjMsIDB4ODYsIDB4NDQsIDB4QjMsIDB4QjQsIC8qIDB4QTgtMHhBQiAqLworCTB4QjMsIDB4QjUsIDB4QjMsIDB4QjYsIDB4QjMsIDB4QjcsIDB4QjMsIDB4QjgsIC8qIDB4QUMtMHhBRiAqLworCTB4ODYsIDB4NDUsIDB4QjMsIDB4QjksIDB4ODYsIDB4NDYsIDB4QjMsIDB4QkEsIC8qIDB4QjAtMHhCMyAqLworCTB4QjMsIDB4QkIsIDB4QjMsIDB4QkMsIDB4ODYsIDB4NDcsIDB4ODYsIDB4NDgsIC8qIDB4QjQtMHhCNyAqLworCTB4QjMsIDB4QkQsIDB4ODYsIDB4NDksIDB4ODYsIDB4NEEsIDB4ODYsIDB4NEIsIC8qIDB4QjgtMHhCQiAqLworCTB4QjMsIDB4QkUsIDB4ODYsIDB4NEMsIDB4ODYsIDB4NEQsIDB4ODYsIDB4NEUsIC8qIDB4QkMtMHhCRiAqLworCTB4ODYsIDB4NEYsIDB4ODYsIDB4NTAsIDB4ODYsIDB4NTEsIDB4ODYsIDB4NTIsIC8qIDB4QzAtMHhDMyAqLworCTB4QjMsIDB4QkYsIDB4QjMsIDB4QzAsIDB4ODYsIDB4NTMsIDB4QjMsIDB4QzEsIC8qIDB4QzQtMHhDNyAqLworCTB4QjMsIDB4QzIsIDB4QjMsIDB4QzMsIDB4ODYsIDB4NTQsIDB4ODYsIDB4NTUsIC8qIDB4QzgtMHhDQiAqLworCTB4ODYsIDB4NTYsIDB4ODYsIDB4NTcsIDB4ODYsIDB4NTgsIDB4ODYsIDB4NTksIC8qIDB4Q0MtMHhDRiAqLworCTB4QjMsIDB4QzQsIDB4QjMsIDB4QzUsIDB4ODYsIDB4NUEsIDB4ODYsIDB4NjEsIC8qIDB4RDAtMHhEMyAqLworCTB4QjMsIDB4QzYsIDB4ODYsIDB4NjIsIDB4ODYsIDB4NjMsIDB4ODYsIDB4NjQsIC8qIDB4RDQtMHhENyAqLworCTB4QjMsIDB4QzcsIDB4ODYsIDB4NjUsIDB4ODYsIDB4NjYsIDB4ODYsIDB4NjcsIC8qIDB4RDgtMHhEQiAqLworCTB4ODYsIDB4NjgsIDB4ODYsIDB4NjksIDB4ODYsIDB4NkEsIDB4ODYsIDB4NkIsIC8qIDB4REMtMHhERiAqLworCTB4QjMsIDB4QzgsIDB4ODYsIDB4NkMsIDB4ODYsIDB4NkQsIDB4ODYsIDB4NkUsIC8qIDB4RTAtMHhFMyAqLworCTB4ODYsIDB4NkYsIDB4QjMsIDB4QzksIDB4ODYsIDB4NzAsIDB4ODYsIDB4NzEsIC8qIDB4RTQtMHhFNyAqLworCTB4ODYsIDB4NzIsIDB4ODYsIDB4NzMsIDB4ODYsIDB4NzQsIDB4ODYsIDB4NzUsIC8qIDB4RTgtMHhFQiAqLworCTB4ODYsIDB4NzYsIDB4ODYsIDB4NzcsIDB4ODYsIDB4NzgsIDB4ODYsIDB4NzksIC8qIDB4RUMtMHhFRiAqLworCTB4ODYsIDB4N0EsIDB4ODYsIDB4ODEsIDB4ODYsIDB4ODIsIDB4ODYsIDB4ODMsIC8qIDB4RjAtMHhGMyAqLworCTB4ODYsIDB4ODQsIDB4ODYsIDB4ODUsIDB4ODYsIDB4ODYsIDB4ODYsIDB4ODcsIC8qIDB4RjQtMHhGNyAqLworCTB4ODYsIDB4ODgsIDB4ODYsIDB4ODksIDB4ODYsIDB4OEEsIDB4ODYsIDB4OEIsIC8qIDB4RjgtMHhGQiAqLworCTB4ODYsIDB4OEMsIDB4ODYsIDB4OEQsIDB4ODYsIDB4OEUsIDB4ODYsIDB4OEYsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0IxWzUxMl0gPSB7CisJMHg4NiwgMHg5MCwgMHg4NiwgMHg5MSwgMHg4NiwgMHg5MiwgMHg4NiwgMHg5MywgLyogMHgwMC0weDAzICovCisJMHg4NiwgMHg5NCwgMHg4NiwgMHg5NSwgMHg4NiwgMHg5NiwgMHg4NiwgMHg5NywgLyogMHgwNC0weDA3ICovCisJMHhCMywgMHhDQSwgMHhCMywgMHhDQiwgMHg4NiwgMHg5OCwgMHhCMywgMHhDQywgLyogMHgwOC0weDBCICovCisJMHhCMywgMHhDRCwgMHg4NiwgMHg5OSwgMHg4NiwgMHg5QSwgMHg4NiwgMHg5QiwgLyogMHgwQy0weDBGICovCisJMHhCMywgMHhDRSwgMHg4NiwgMHg5QywgMHhCMywgMHhDRiwgMHhCMywgMHhEMCwgLyogMHgxMC0weDEzICovCisJMHg4NiwgMHg5RCwgMHg4NiwgMHg5RSwgMHg4NiwgMHg5RiwgMHg4NiwgMHhBMCwgLyogMHgxNC0weDE3ICovCisJMHhCMywgMHhEMSwgMHhCMywgMHhEMiwgMHg4NiwgMHhBMSwgMHhCMywgMHhEMywgLyogMHgxOC0weDFCICovCisJMHhCMywgMHhENCwgMHhCMywgMHhENSwgMHg4NiwgMHhBMiwgMHg4NiwgMHhBMywgLyogMHgxQy0weDFGICovCisJMHg4NiwgMHhBNCwgMHg4NiwgMHhBNSwgMHg4NiwgMHhBNiwgMHhCMywgMHhENiwgLyogMHgyMC0weDIzICovCisJMHhCMywgMHhENywgMHhCMywgMHhEOCwgMHg4NiwgMHhBNywgMHg4NiwgMHhBOCwgLyogMHgyNC0weDI3ICovCisJMHhCMywgMHhEOSwgMHg4NiwgMHhBOSwgMHg4NiwgMHhBQSwgMHg4NiwgMHhBQiwgLyogMHgyOC0weDJCICovCisJMHhCMywgMHhEQSwgMHg4NiwgMHhBQywgMHg4NiwgMHhBRCwgMHg4NiwgMHhBRSwgLyogMHgyQy0weDJGICovCisJMHg4NiwgMHhBRiwgMHg4NiwgMHhCMCwgMHg4NiwgMHhCMSwgMHg4NiwgMHhCMiwgLyogMHgzMC0weDMzICovCisJMHhCMywgMHhEQiwgMHhCMywgMHhEQywgMHg4NiwgMHhCMywgMHhCMywgMHhERCwgLyogMHgzNC0weDM3ICovCisJMHhCMywgMHhERSwgMHhCMywgMHhERiwgMHg4NiwgMHhCNCwgMHg4NiwgMHhCNSwgLyogMHgzOC0weDNCICovCisJMHg4NiwgMHhCNiwgMHg4NiwgMHhCNywgMHg4NiwgMHhCOCwgMHg4NiwgMHhCOSwgLyogMHgzQy0weDNGICovCisJMHhCMywgMHhFMCwgMHhCMywgMHhFMSwgMHg4NiwgMHhCQSwgMHg4NiwgMHhCQiwgLyogMHg0MC0weDQzICovCisJMHhCMywgMHhFMiwgMHg4NiwgMHhCQywgMHg4NiwgMHhCRCwgMHg4NiwgMHhCRSwgLyogMHg0NC0weDQ3ICovCisJMHhCMywgMHhFMywgMHg4NiwgMHhCRiwgMHg4NiwgMHhDMCwgMHg4NiwgMHhDMSwgLyogMHg0OC0weDRCICovCisJMHg4NiwgMHhDMiwgMHg4NiwgMHhDMywgMHg4NiwgMHhDNCwgMHg4NiwgMHhDNSwgLyogMHg0Qy0weDRGICovCisJMHhCMywgMHhFNCwgMHhCMywgMHhFNSwgMHg4NiwgMHhDNiwgMHg4NiwgMHhDNywgLyogMHg1MC0weDUzICovCisJMHhCMywgMHhFNiwgMHhCMywgMHhFNywgMHg4NiwgMHhDOCwgMHg4NiwgMHhDOSwgLyogMHg1NC0weDU3ICovCisJMHhCMywgMHhFOCwgMHg4NiwgMHhDQSwgMHg4NiwgMHhDQiwgMHg4NiwgMHhDQywgLyogMHg1OC0weDVCICovCisJMHhCMywgMHhFOSwgMHg4NiwgMHhDRCwgMHg4NiwgMHhDRSwgMHg4NiwgMHhDRiwgLyogMHg1Qy0weDVGICovCisJMHhCMywgMHhFQSwgMHg4NiwgMHhEMCwgMHg4NiwgMHhEMSwgMHg4NiwgMHhEMiwgLyogMHg2MC0weDYzICovCisJMHg4NiwgMHhEMywgMHg4NiwgMHhENCwgMHg4NiwgMHhENSwgMHg4NiwgMHhENiwgLyogMHg2NC0weDY3ICovCisJMHg4NiwgMHhENywgMHg4NiwgMHhEOCwgMHg4NiwgMHhEOSwgMHg4NiwgMHhEQSwgLyogMHg2OC0weDZCICovCisJMHg4NiwgMHhEQiwgMHg4NiwgMHhEQywgMHg4NiwgMHhERCwgMHg4NiwgMHhERSwgLyogMHg2Qy0weDZGICovCisJMHg4NiwgMHhERiwgMHg4NiwgMHhFMCwgMHg4NiwgMHhFMSwgMHg4NiwgMHhFMiwgLyogMHg3MC0weDczICovCisJMHg4NiwgMHhFMywgMHg4NiwgMHhFNCwgMHg4NiwgMHhFNSwgMHg4NiwgMHhFNiwgLyogMHg3NC0weDc3ICovCisJMHhCMywgMHhFQiwgMHhCMywgMHhFQywgMHg4NiwgMHhFNywgMHg4NiwgMHhFOCwgLyogMHg3OC0weDdCICovCisJMHhCMywgMHhFRCwgMHg4NiwgMHhFOSwgMHg4NiwgMHhFQSwgMHg4NiwgMHhFQiwgLyogMHg3Qy0weDdGICovCisJCisJMHhCMywgMHhFRSwgMHg4NiwgMHhFQywgMHhCMywgMHhFRiwgMHg4NiwgMHhFRCwgLyogMHg4MC0weDgzICovCisJMHg4NiwgMHhFRSwgMHg4NiwgMHhFRiwgMHg4NiwgMHhGMCwgMHg4NiwgMHhGMSwgLyogMHg4NC0weDg3ICovCisJMHhCMywgMHhGMCwgMHhCMywgMHhGMSwgMHg4NiwgMHhGMiwgMHhCMywgMHhGMiwgLyogMHg4OC0weDhCICovCisJMHg4NiwgMHhGMywgMHhCMywgMHhGMywgMHg4NiwgMHhGNCwgMHg4NiwgMHhGNSwgLyogMHg4Qy0weDhGICovCisJMHg4NiwgMHhGNiwgMHg4NiwgMHhGNywgMHhCMywgMHhGNCwgMHhCMywgMHhGNSwgLyogMHg5MC0weDkzICovCisJMHhCMywgMHhGNiwgMHg4NiwgMHhGOCwgMHg4NiwgMHhGOSwgMHg4NiwgMHhGQSwgLyogMHg5NC0weDk3ICovCisJMHhCMywgMHhGNywgMHg4NiwgMHhGQiwgMHg4NiwgMHhGQywgMHg4NiwgMHhGRCwgLyogMHg5OC0weDlCICovCisJMHhCMywgMHhGOCwgMHg4NiwgMHhGRSwgMHg4NywgMHg0MSwgMHg4NywgMHg0MiwgLyogMHg5Qy0weDlGICovCisJMHg4NywgMHg0MywgMHg4NywgMHg0NCwgMHg4NywgMHg0NSwgMHg4NywgMHg0NiwgLyogMHhBMC0weEEzICovCisJMHg4NywgMHg0NywgMHg4NywgMHg0OCwgMHg4NywgMHg0OSwgMHg4NywgMHg0QSwgLyogMHhBNC0weEE3ICovCisJMHhCMywgMHhGOSwgMHg4NywgMHg0QiwgMHg4NywgMHg0QywgMHg4NywgMHg0RCwgLyogMHhBOC0weEFCICovCisJMHg4NywgMHg0RSwgMHg4NywgMHg0RiwgMHg4NywgMHg1MCwgMHg4NywgMHg1MSwgLyogMHhBQy0weEFGICovCisJMHg4NywgMHg1MiwgMHg4NywgMHg1MywgMHg4NywgMHg1NCwgMHg4NywgMHg1NSwgLyogMHhCMC0weEIzICovCisJMHg4NywgMHg1NiwgMHg4NywgMHg1NywgMHg4NywgMHg1OCwgMHg4NywgMHg1OSwgLyogMHhCNC0weEI3ICovCisJMHg4NywgMHg1QSwgMHg4NywgMHg2MSwgMHg4NywgMHg2MiwgMHg4NywgMHg2MywgLyogMHhCOC0weEJCICovCisJMHg4NywgMHg2NCwgMHg4NywgMHg2NSwgMHg4NywgMHg2NiwgMHg4NywgMHg2NywgLyogMHhCQy0weEJGICovCisJMHg4NywgMHg2OCwgMHg4NywgMHg2OSwgMHg4NywgMHg2QSwgMHg4NywgMHg2QiwgLyogMHhDMC0weEMzICovCisJMHg4NywgMHg2QywgMHg4NywgMHg2RCwgMHg4NywgMHg2RSwgMHg4NywgMHg2RiwgLyogMHhDNC0weEM3ICovCisJMHg4NywgMHg3MCwgMHg4NywgMHg3MSwgMHg4NywgMHg3MiwgMHg4NywgMHg3MywgLyogMHhDOC0weENCICovCisJMHhCMywgMHhGQSwgMHg4NywgMHg3NCwgMHg4NywgMHg3NSwgMHg4NywgMHg3NiwgLyogMHhDQy0weENGICovCisJMHhCMywgMHhGQiwgMHg4NywgMHg3NywgMHg4NywgMHg3OCwgMHg4NywgMHg3OSwgLyogMHhEMC0weEQzICovCisJMHhCMywgMHhGQywgMHg4NywgMHg3QSwgMHg4NywgMHg4MSwgMHg4NywgMHg4MiwgLyogMHhENC0weEQ3ICovCisJMHg4NywgMHg4MywgMHg4NywgMHg4NCwgMHg4NywgMHg4NSwgMHg4NywgMHg4NiwgLyogMHhEOC0weERCICovCisJMHhCMywgMHhGRCwgMHhCMywgMHhGRSwgMHg4NywgMHg4NywgMHhCNCwgMHhBMSwgLyogMHhEQy0weERGICovCisJMHg4NywgMHg4OCwgMHg4NywgMHg4OSwgMHg4NywgMHg4QSwgMHg4NywgMHg4QiwgLyogMHhFMC0weEUzICovCisJMHg4NywgMHg4QywgMHg4NywgMHg4RCwgMHg4NywgMHg4RSwgMHg4NywgMHg4RiwgLyogMHhFNC0weEU3ICovCisJMHhCNCwgMHhBMiwgMHhCNCwgMHhBMywgMHg4NywgMHg5MCwgMHg4NywgMHg5MSwgLyogMHhFOC0weEVCICovCisJMHhCNCwgMHhBNCwgMHg4NywgMHg5MiwgMHg4NywgMHg5MywgMHg4NywgMHg5NCwgLyogMHhFQy0weEVGICovCisJMHhCNCwgMHhBNSwgMHg4NywgMHg5NSwgMHg4NywgMHg5NiwgMHg4NywgMHg5NywgLyogMHhGMC0weEYzICovCisJMHg4NywgMHg5OCwgMHg4NywgMHg5OSwgMHg4NywgMHg5QSwgMHg4NywgMHg5QiwgLyogMHhGNC0weEY3ICovCisJMHg4NywgMHg5QywgMHhCNCwgMHhBNiwgMHg4NywgMHg5RCwgMHhCNCwgMHhBNywgLyogMHhGOC0weEZCICovCisJMHg4NywgMHg5RSwgMHhCNCwgMHhBOCwgMHg4NywgMHg5RiwgMHg4NywgMHhBMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfQjJbNTEyXSA9IHsKKwkweDg3LCAweEExLCAweDg3LCAweEEyLCAweDg3LCAweEEzLCAweDg3LCAweEE0LCAvKiAweDAwLTB4MDMgKi8KKwkweEI0LCAweEE5LCAweEI0LCAweEFBLCAweDg3LCAweEE1LCAweDg3LCAweEE2LCAvKiAweDA0LTB4MDcgKi8KKwkweEI0LCAweEFCLCAweDg3LCAweEE3LCAweDg3LCAweEE4LCAweEI0LCAweEFDLCAvKiAweDA4LTB4MEIgKi8KKwkweEI0LCAweEFELCAweDg3LCAweEE5LCAweDg3LCAweEFBLCAweDg3LCAweEFCLCAvKiAweDBDLTB4MEYgKi8KKwkweDg3LCAweEFDLCAweDg3LCAweEFELCAweDg3LCAweEFFLCAweDg3LCAweEFGLCAvKiAweDEwLTB4MTMgKi8KKwkweEI0LCAweEFFLCAweEI0LCAweEFGLCAweDg3LCAweEIwLCAweEI0LCAweEIwLCAvKiAweDE0LTB4MTcgKi8KKwkweDg3LCAweEIxLCAweEI0LCAweEIxLCAweDg3LCAweEIyLCAweDg3LCAweEIzLCAvKiAweDE4LTB4MUIgKi8KKwkweDg3LCAweEI0LCAweDg3LCAweEI1LCAweDg3LCAweEI2LCAweDg3LCAweEI3LCAvKiAweDFDLTB4MUYgKi8KKwkweEI0LCAweEIyLCAweDg3LCAweEI4LCAweDg3LCAweEI5LCAweDg3LCAweEJBLCAvKiAweDIwLTB4MjMgKi8KKwkweDg3LCAweEJCLCAweDg3LCAweEJDLCAweDg3LCAweEJELCAweDg3LCAweEJFLCAvKiAweDI0LTB4MjcgKi8KKwkweDg3LCAweEJGLCAweDg3LCAweEMwLCAweDg3LCAweEMxLCAweDg3LCAweEMyLCAvKiAweDI4LTB4MkIgKi8KKwkweDg3LCAweEMzLCAweDg3LCAweEM0LCAweDg3LCAweEM1LCAweDg3LCAweEM2LCAvKiAweDJDLTB4MkYgKi8KKwkweDg3LCAweEM3LCAweDg3LCAweEM4LCAweDg3LCAweEM5LCAweDg3LCAweENBLCAvKiAweDMwLTB4MzMgKi8KKwkweEI0LCAweEIzLCAweDg3LCAweENCLCAweDg3LCAweENDLCAweDg3LCAweENELCAvKiAweDM0LTB4MzcgKi8KKwkweDg3LCAweENFLCAweDg3LCAweENGLCAweDg3LCAweEQwLCAweDg3LCAweEQxLCAvKiAweDM4LTB4M0IgKi8KKwkweEI0LCAweEI0LCAweDg3LCAweEQyLCAweDg3LCAweEQzLCAweDg3LCAweEQ0LCAvKiAweDNDLTB4M0YgKi8KKwkweDg3LCAweEQ1LCAweDg3LCAweEQ2LCAweDg3LCAweEQ3LCAweDg3LCAweEQ4LCAvKiAweDQwLTB4NDMgKi8KKwkweDg3LCAweEQ5LCAweDg3LCAweERBLCAweDg3LCAweERCLCAweDg3LCAweERDLCAvKiAweDQ0LTB4NDcgKi8KKwkweDg3LCAweERELCAweDg3LCAweERFLCAweDg3LCAweERGLCAweDg3LCAweEUwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDg3LCAweEUxLCAweDg3LCAweEUyLCAweDg3LCAweEUzLCAweDg3LCAweEU0LCAvKiAweDRDLTB4NEYgKi8KKwkweDg3LCAweEU1LCAweDg3LCAweEU2LCAweDg3LCAweEU3LCAweDg3LCAweEU4LCAvKiAweDUwLTB4NTMgKi8KKwkweDg3LCAweEU5LCAweDg3LCAweEVBLCAweDg3LCAweEVCLCAweDg3LCAweEVDLCAvKiAweDU0LTB4NTcgKi8KKwkweEI0LCAweEI1LCAweDg3LCAweEVELCAweDg3LCAweEVFLCAweDg3LCAweEVGLCAvKiAweDU4LTB4NUIgKi8KKwkweEI0LCAweEI2LCAweDg3LCAweEYwLCAweDg3LCAweEYxLCAweDg3LCAweEYyLCAvKiAweDVDLTB4NUYgKi8KKwkweEI0LCAweEI3LCAweDg3LCAweEYzLCAweDg3LCAweEY0LCAweDg3LCAweEY1LCAvKiAweDYwLTB4NjMgKi8KKwkweDg3LCAweEY2LCAweDg3LCAweEY3LCAweDg3LCAweEY4LCAweDg3LCAweEY5LCAvKiAweDY0LTB4NjcgKi8KKwkweEI0LCAweEI4LCAweEI0LCAweEI5LCAweDg3LCAweEZBLCAweDg3LCAweEZCLCAvKiAweDY4LTB4NkIgKi8KKwkweDg3LCAweEZDLCAweDg3LCAweEZELCAweDg3LCAweEZFLCAweDg4LCAweDQxLCAvKiAweDZDLTB4NkYgKi8KKwkweDg4LCAweDQyLCAweDg4LCAweDQzLCAweDg4LCAweDQ0LCAweDg4LCAweDQ1LCAvKiAweDcwLTB4NzMgKi8KKwkweEI0LCAweEJBLCAweEI0LCAweEJCLCAweDg4LCAweDQ2LCAweDg4LCAweDQ3LCAvKiAweDc0LTB4NzcgKi8KKwkweDg4LCAweDQ4LCAweDg4LCAweDQ5LCAweDg4LCAweDRBLCAweDg4LCAweDRCLCAvKiAweDc4LTB4N0IgKi8KKwkweEI0LCAweEJDLCAweDg4LCAweDRDLCAweDg4LCAweDRELCAweDg4LCAweDRFLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDg4LCAweDRGLCAweDg4LCAweDUwLCAweDg4LCAweDUxLCAweDg4LCAweDUyLCAvKiAweDgwLTB4ODMgKi8KKwkweEI0LCAweEJELCAweEI0LCAweEJFLCAweDg4LCAweDUzLCAweDg4LCAweDU0LCAvKiAweDg0LTB4ODcgKi8KKwkweDg4LCAweDU1LCAweEI0LCAweEJGLCAweDg4LCAweDU2LCAweDg4LCAweDU3LCAvKiAweDg4LTB4OEIgKi8KKwkweDg4LCAweDU4LCAweDg4LCAweDU5LCAweDg4LCAweDVBLCAweDg4LCAweDYxLCAvKiAweDhDLTB4OEYgKi8KKwkweEI0LCAweEMwLCAweEI0LCAweEMxLCAweDg4LCAweDYyLCAweDg4LCAweDYzLCAvKiAweDkwLTB4OTMgKi8KKwkweEI0LCAweEMyLCAweDg4LCAweDY0LCAweDg4LCAweDY1LCAweDg4LCAweDY2LCAvKiAweDk0LTB4OTcgKi8KKwkweEI0LCAweEMzLCAweEI0LCAweEM0LCAweEI0LCAweEM1LCAweDg4LCAweDY3LCAvKiAweDk4LTB4OUIgKi8KKwkweDg4LCAweDY4LCAweDg4LCAweDY5LCAweDg4LCAweDZBLCAweDg4LCAweDZCLCAvKiAweDlDLTB4OUYgKi8KKwkweEI0LCAweEM2LCAweEI0LCAweEM3LCAweDg4LCAweDZDLCAweEI0LCAweEM4LCAvKiAweEEwLTB4QTMgKi8KKwkweDg4LCAweDZELCAweEI0LCAweEM5LCAweEI0LCAweENBLCAweDg4LCAweDZFLCAvKiAweEE0LTB4QTcgKi8KKwkweDg4LCAweDZGLCAweDg4LCAweDcwLCAweEI0LCAweENCLCAweDg4LCAweDcxLCAvKiAweEE4LTB4QUIgKi8KKwkweEI0LCAweENDLCAweDg4LCAweDcyLCAweDg4LCAweDczLCAweDg4LCAweDc0LCAvKiAweEFDLTB4QUYgKi8KKwkweEI0LCAweENELCAweDg4LCAweDc1LCAweDg4LCAweDc2LCAweDg4LCAweDc3LCAvKiAweEIwLTB4QjMgKi8KKwkweEI0LCAweENFLCAweDg4LCAweDc4LCAweDg4LCAweDc5LCAweDg4LCAweDdBLCAvKiAweEI0LTB4QjcgKi8KKwkweDg4LCAweDgxLCAweDg4LCAweDgyLCAweDg4LCAweDgzLCAweDg4LCAweDg0LCAvKiAweEI4LTB4QkIgKi8KKwkweDg4LCAweDg1LCAweDg4LCAweDg2LCAweDg4LCAweDg3LCAweDg4LCAweDg4LCAvKiAweEJDLTB4QkYgKi8KKwkweDg4LCAweDg5LCAweDg4LCAweDhBLCAweDg4LCAweDhCLCAweDg4LCAweDhDLCAvKiAweEMwLTB4QzMgKi8KKwkweDg4LCAweDhELCAweDg4LCAweDhFLCAweDg4LCAweDhGLCAweDg4LCAweDkwLCAvKiAweEM0LTB4QzcgKi8KKwkweEI0LCAweENGLCAweEI0LCAweEQwLCAweDg4LCAweDkxLCAweDg4LCAweDkyLCAvKiAweEM4LTB4Q0IgKi8KKwkweEI0LCAweEQxLCAweDg4LCAweDkzLCAweDg4LCAweDk0LCAweDg4LCAweDk1LCAvKiAweENDLTB4Q0YgKi8KKwkweEI0LCAweEQyLCAweDg4LCAweDk2LCAweEI0LCAweEQzLCAweDg4LCAweDk3LCAvKiAweEQwLTB4RDMgKi8KKwkweDg4LCAweDk4LCAweDg4LCAweDk5LCAweDg4LCAweDlBLCAweDg4LCAweDlCLCAvKiAweEQ0LTB4RDcgKi8KKwkweEI0LCAweEQ0LCAweEI0LCAweEQ1LCAweDg4LCAweDlDLCAweEI0LCAweEQ2LCAvKiAweEQ4LTB4REIgKi8KKwkweDg4LCAweDlELCAweEI0LCAweEQ3LCAweDg4LCAweDlFLCAweDg4LCAweDlGLCAvKiAweERDLTB4REYgKi8KKwkweDg4LCAweEEwLCAweDg4LCAweEExLCAweEI0LCAweEQ4LCAweDg4LCAweEEyLCAvKiAweEUwLTB4RTMgKi8KKwkweEI0LCAweEQ5LCAweEI0LCAweERBLCAweEI0LCAweERCLCAweDg4LCAweEEzLCAvKiAweEU0LTB4RTcgKi8KKwkweEI0LCAweERDLCAweDg4LCAweEE0LCAweDg4LCAweEE1LCAweEI0LCAweERELCAvKiAweEU4LTB4RUIgKi8KKwkweEI0LCAweERFLCAweEI0LCAweERGLCAweEI0LCAweEUwLCAweEI0LCAweEUxLCAvKiAweEVDLTB4RUYgKi8KKwkweDg4LCAweEE2LCAweDg4LCAweEE3LCAweDg4LCAweEE4LCAweEI0LCAweEUyLCAvKiAweEYwLTB4RjMgKi8KKwkweEI0LCAweEUzLCAweEI0LCAweEU0LCAweDg4LCAweEE5LCAweEI0LCAweEU1LCAvKiAweEY0LTB4RjcgKi8KKwkweEI0LCAweEU2LCAweEI0LCAweEU3LCAweEI0LCAweEU4LCAweEI0LCAweEU5LCAvKiAweEY4LTB4RkIgKi8KKwkweDg4LCAweEFBLCAweDg4LCAweEFCLCAweDg4LCAweEFDLCAweEI0LCAweEVBLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19CM1s1MTJdID0geworCTB4QjQsIDB4RUIsIDB4QjQsIDB4RUMsIDB4ODgsIDB4QUQsIDB4ODgsIDB4QUUsIC8qIDB4MDAtMHgwMyAqLworCTB4QjQsIDB4RUQsIDB4ODgsIDB4QUYsIDB4ODgsIDB4QjAsIDB4ODgsIDB4QjEsIC8qIDB4MDQtMHgwNyAqLworCTB4QjQsIDB4RUUsIDB4ODgsIDB4QjIsIDB4ODgsIDB4QjMsIDB4ODgsIDB4QjQsIC8qIDB4MDgtMHgwQiAqLworCTB4ODgsIDB4QjUsIDB4ODgsIDB4QjYsIDB4ODgsIDB4QjcsIDB4ODgsIDB4QjgsIC8qIDB4MEMtMHgwRiAqLworCTB4QjQsIDB4RUYsIDB4QjQsIDB4RjAsIDB4ODgsIDB4QjksIDB4QjQsIDB4RjEsIC8qIDB4MTAtMHgxMyAqLworCTB4QjQsIDB4RjIsIDB4QjQsIDB4RjMsIDB4ODgsIDB4QkEsIDB4ODgsIDB4QkIsIC8qIDB4MTQtMHgxNyAqLworCTB4ODgsIDB4QkMsIDB4ODgsIDB4QkQsIDB4ODgsIDB4QkUsIDB4ODgsIDB4QkYsIC8qIDB4MTgtMHgxQiAqLworCTB4QjQsIDB4RjQsIDB4ODgsIDB4QzAsIDB4ODgsIDB4QzEsIDB4ODgsIDB4QzIsIC8qIDB4MUMtMHgxRiAqLworCTB4ODgsIDB4QzMsIDB4ODgsIDB4QzQsIDB4ODgsIDB4QzUsIDB4ODgsIDB4QzYsIC8qIDB4MjAtMHgyMyAqLworCTB4ODgsIDB4QzcsIDB4ODgsIDB4QzgsIDB4ODgsIDB4QzksIDB4ODgsIDB4Q0EsIC8qIDB4MjQtMHgyNyAqLworCTB4ODgsIDB4Q0IsIDB4ODgsIDB4Q0MsIDB4ODgsIDB4Q0QsIDB4ODgsIDB4Q0UsIC8qIDB4MjgtMHgyQiAqLworCTB4ODgsIDB4Q0YsIDB4ODgsIDB4RDAsIDB4ODgsIDB4RDEsIDB4ODgsIDB4RDIsIC8qIDB4MkMtMHgyRiAqLworCTB4ODgsIDB4RDMsIDB4ODgsIDB4RDQsIDB4ODgsIDB4RDUsIDB4ODgsIDB4RDYsIC8qIDB4MzAtMHgzMyAqLworCTB4ODgsIDB4RDcsIDB4ODgsIDB4RDgsIDB4ODgsIDB4RDksIDB4ODgsIDB4REEsIC8qIDB4MzQtMHgzNyAqLworCTB4ODgsIDB4REIsIDB4ODgsIDB4REMsIDB4ODgsIDB4REQsIDB4ODgsIDB4REUsIC8qIDB4MzgtMHgzQiAqLworCTB4ODgsIDB4REYsIDB4ODgsIDB4RTAsIDB4ODgsIDB4RTEsIDB4ODgsIDB4RTIsIC8qIDB4M0MtMHgzRiAqLworCTB4ODgsIDB4RTMsIDB4ODgsIDB4RTQsIDB4ODgsIDB4RTUsIDB4ODgsIDB4RTYsIC8qIDB4NDAtMHg0MyAqLworCTB4ODgsIDB4RTcsIDB4ODgsIDB4RTgsIDB4ODgsIDB4RTksIDB4ODgsIDB4RUEsIC8qIDB4NDQtMHg0NyAqLworCTB4ODgsIDB4RUIsIDB4ODgsIDB4RUMsIDB4ODgsIDB4RUQsIDB4ODgsIDB4RUUsIC8qIDB4NDgtMHg0QiAqLworCTB4ODgsIDB4RUYsIDB4ODgsIDB4RjAsIDB4ODgsIDB4RjEsIDB4ODgsIDB4RjIsIC8qIDB4NEMtMHg0RiAqLworCTB4ODgsIDB4RjMsIDB4ODgsIDB4RjQsIDB4ODgsIDB4RjUsIDB4ODgsIDB4RjYsIC8qIDB4NTAtMHg1MyAqLworCTB4QjQsIDB4RjUsIDB4QjQsIDB4RjYsIDB4QjQsIDB4RjcsIDB4ODgsIDB4RjcsIC8qIDB4NTQtMHg1NyAqLworCTB4QjQsIDB4RjgsIDB4ODgsIDB4RjgsIDB4ODgsIDB4RjksIDB4QjQsIDB4RjksIC8qIDB4NTgtMHg1QiAqLworCTB4QjQsIDB4RkEsIDB4ODgsIDB4RkEsIDB4QjQsIDB4RkIsIDB4QjQsIDB4RkMsIC8qIDB4NUMtMHg1RiAqLworCTB4ODgsIDB4RkIsIDB4ODgsIDB4RkMsIDB4ODgsIDB4RkQsIDB4ODgsIDB4RkUsIC8qIDB4NjAtMHg2MyAqLworCTB4QjQsIDB4RkQsIDB4QjQsIDB4RkUsIDB4ODksIDB4NDEsIDB4QjUsIDB4QTEsIC8qIDB4NjQtMHg2NyAqLworCTB4ODksIDB4NDIsIDB4QjUsIDB4QTIsIDB4ODksIDB4NDMsIDB4QjUsIDB4QTMsIC8qIDB4NjgtMHg2QiAqLworCTB4ODksIDB4NDQsIDB4ODksIDB4NDUsIDB4QjUsIDB4QTQsIDB4ODksIDB4NDYsIC8qIDB4NkMtMHg2RiAqLworCTB4QjUsIDB4QTUsIDB4QjUsIDB4QTYsIDB4ODksIDB4NDcsIDB4ODksIDB4NDgsIC8qIDB4NzAtMHg3MyAqLworCTB4QjUsIDB4QTcsIDB4ODksIDB4NDksIDB4ODksIDB4NEEsIDB4ODksIDB4NEIsIC8qIDB4NzQtMHg3NyAqLworCTB4QjUsIDB4QTgsIDB4ODksIDB4NEMsIDB4ODksIDB4NEQsIDB4ODksIDB4NEUsIC8qIDB4NzgtMHg3QiAqLworCTB4ODksIDB4NEYsIDB4ODksIDB4NTAsIDB4ODksIDB4NTEsIDB4ODksIDB4NTIsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QjUsIDB4QTksIDB4QjUsIDB4QUEsIDB4ODksIDB4NTMsIDB4QjUsIDB4QUIsIC8qIDB4ODAtMHg4MyAqLworCTB4QjUsIDB4QUMsIDB4QjUsIDB4QUQsIDB4ODksIDB4NTQsIDB4ODksIDB4NTUsIC8qIDB4ODQtMHg4NyAqLworCTB4ODksIDB4NTYsIDB4ODksIDB4NTcsIDB4ODksIDB4NTgsIDB4ODksIDB4NTksIC8qIDB4ODgtMHg4QiAqLworCTB4QjUsIDB4QUUsIDB4ODksIDB4NUEsIDB4ODksIDB4NjEsIDB4ODksIDB4NjIsIC8qIDB4OEMtMHg4RiAqLworCTB4QjUsIDB4QUYsIDB4ODksIDB4NjMsIDB4ODksIDB4NjQsIDB4ODksIDB4NjUsIC8qIDB4OTAtMHg5MyAqLworCTB4QjUsIDB4QjAsIDB4ODksIDB4NjYsIDB4ODksIDB4NjcsIDB4ODksIDB4NjgsIC8qIDB4OTQtMHg5NyAqLworCTB4ODksIDB4NjksIDB4ODksIDB4NkEsIDB4ODksIDB4NkIsIDB4ODksIDB4NkMsIC8qIDB4OTgtMHg5QiAqLworCTB4ODksIDB4NkQsIDB4ODksIDB4NkUsIDB4ODksIDB4NkYsIDB4ODksIDB4NzAsIC8qIDB4OUMtMHg5RiAqLworCTB4QjUsIDB4QjEsIDB4QjUsIDB4QjIsIDB4ODksIDB4NzEsIDB4ODksIDB4NzIsIC8qIDB4QTAtMHhBMyAqLworCTB4ODksIDB4NzMsIDB4ODksIDB4NzQsIDB4ODksIDB4NzUsIDB4ODksIDB4NzYsIC8qIDB4QTQtMHhBNyAqLworCTB4QjUsIDB4QjMsIDB4ODksIDB4NzcsIDB4ODksIDB4NzgsIDB4ODksIDB4NzksIC8qIDB4QTgtMHhBQiAqLworCTB4QjUsIDB4QjQsIDB4ODksIDB4N0EsIDB4ODksIDB4ODEsIDB4ODksIDB4ODIsIC8qIDB4QUMtMHhBRiAqLworCTB4ODksIDB4ODMsIDB4ODksIDB4ODQsIDB4ODksIDB4ODUsIDB4ODksIDB4ODYsIC8qIDB4QjAtMHhCMyAqLworCTB4ODksIDB4ODcsIDB4ODksIDB4ODgsIDB4ODksIDB4ODksIDB4ODksIDB4OEEsIC8qIDB4QjQtMHhCNyAqLworCTB4ODksIDB4OEIsIDB4ODksIDB4OEMsIDB4ODksIDB4OEQsIDB4ODksIDB4OEUsIC8qIDB4QjgtMHhCQiAqLworCTB4ODksIDB4OEYsIDB4ODksIDB4OTAsIDB4ODksIDB4OTEsIDB4ODksIDB4OTIsIC8qIDB4QkMtMHhCRiAqLworCTB4ODksIDB4OTMsIDB4ODksIDB4OTQsIDB4ODksIDB4OTUsIDB4ODksIDB4OTYsIC8qIDB4QzAtMHhDMyAqLworCTB4QjUsIDB4QjUsIDB4QjUsIDB4QjYsIDB4ODksIDB4OTcsIDB4ODksIDB4OTgsIC8qIDB4QzQtMHhDNyAqLworCTB4QjUsIDB4QjcsIDB4ODksIDB4OTksIDB4ODksIDB4OUEsIDB4QjUsIDB4QjgsIC8qIDB4QzgtMHhDQiAqLworCTB4QjUsIDB4QjksIDB4ODksIDB4OUIsIDB4QjUsIDB4QkEsIDB4ODksIDB4OUMsIC8qIDB4Q0MtMHhDRiAqLworCTB4QjUsIDB4QkIsIDB4ODksIDB4OUQsIDB4ODksIDB4OUUsIDB4ODksIDB4OUYsIC8qIDB4RDAtMHhEMyAqLworCTB4QjUsIDB4QkMsIDB4QjUsIDB4QkQsIDB4ODksIDB4QTAsIDB4QjUsIDB4QkUsIC8qIDB4RDQtMHhENyAqLworCTB4ODksIDB4QTEsIDB4QjUsIDB4QkYsIDB4ODksIDB4QTIsIDB4QjUsIDB4QzAsIC8qIDB4RDgtMHhEQiAqLworCTB4ODksIDB4QTMsIDB4QjUsIDB4QzEsIDB4ODksIDB4QTQsIDB4ODksIDB4QTUsIC8qIDB4REMtMHhERiAqLworCTB4QjUsIDB4QzIsIDB4ODksIDB4QTYsIDB4ODksIDB4QTcsIDB4ODksIDB4QTgsIC8qIDB4RTAtMHhFMyAqLworCTB4QjUsIDB4QzMsIDB4ODksIDB4QTksIDB4ODksIDB4QUEsIDB4ODksIDB4QUIsIC8qIDB4RTQtMHhFNyAqLworCTB4QjUsIDB4QzQsIDB4ODksIDB4QUMsIDB4ODksIDB4QUQsIDB4ODksIDB4QUUsIC8qIDB4RTgtMHhFQiAqLworCTB4ODksIDB4QUYsIDB4ODksIDB4QjAsIDB4ODksIDB4QjEsIDB4ODksIDB4QjIsIC8qIDB4RUMtMHhFRiAqLworCTB4ODksIDB4QjMsIDB4ODksIDB4QjQsIDB4ODksIDB4QjUsIDB4ODksIDB4QjYsIC8qIDB4RjAtMHhGMyAqLworCTB4ODksIDB4QjcsIDB4ODksIDB4QjgsIDB4ODksIDB4QjksIDB4ODksIDB4QkEsIC8qIDB4RjQtMHhGNyAqLworCTB4ODksIDB4QkIsIDB4ODksIDB4QkMsIDB4ODksIDB4QkQsIDB4ODksIDB4QkUsIC8qIDB4RjgtMHhGQiAqLworCTB4QjUsIDB4QzUsIDB4ODksIDB4QkYsIDB4ODksIDB4QzAsIDB4ODksIDB4QzEsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0I0WzUxMl0gPSB7CisJMHg4OSwgMHhDMiwgMHg4OSwgMHhDMywgMHg4OSwgMHhDNCwgMHg4OSwgMHhDNSwgLyogMHgwMC0weDAzICovCisJMHg4OSwgMHhDNiwgMHg4OSwgMHhDNywgMHg4OSwgMHhDOCwgMHg4OSwgMHhDOSwgLyogMHgwNC0weDA3ICovCisJMHg4OSwgMHhDQSwgMHg4OSwgMHhDQiwgMHg4OSwgMHhDQywgMHg4OSwgMHhDRCwgLyogMHgwOC0weDBCICovCisJMHg4OSwgMHhDRSwgMHg4OSwgMHhDRiwgMHg4OSwgMHhEMCwgMHg4OSwgMHhEMSwgLyogMHgwQy0weDBGICovCisJMHhCNSwgMHhDNiwgMHg4OSwgMHhEMiwgMHg4OSwgMHhEMywgMHg4OSwgMHhENCwgLyogMHgxMC0weDEzICovCisJMHg4OSwgMHhENSwgMHg4OSwgMHhENiwgMHg4OSwgMHhENywgMHg4OSwgMHhEOCwgLyogMHgxNC0weDE3ICovCisJMHhCNSwgMHhDNywgMHg4OSwgMHhEOSwgMHg4OSwgMHhEQSwgMHg4OSwgMHhEQiwgLyogMHgxOC0weDFCICovCisJMHhCNSwgMHhDOCwgMHg4OSwgMHhEQywgMHg4OSwgMHhERCwgMHg4OSwgMHhERSwgLyogMHgxQy0weDFGICovCisJMHhCNSwgMHhDOSwgMHg4OSwgMHhERiwgMHg4OSwgMHhFMCwgMHg4OSwgMHhFMSwgLyogMHgyMC0weDIzICovCisJMHg4OSwgMHhFMiwgMHg4OSwgMHhFMywgMHg4OSwgMHhFNCwgMHg4OSwgMHhFNSwgLyogMHgyNC0weDI3ICovCisJMHhCNSwgMHhDQSwgMHhCNSwgMHhDQiwgMHg4OSwgMHhFNiwgMHhCNSwgMHhDQywgLyogMHgyOC0weDJCICovCisJMHg4OSwgMHhFNywgMHg4OSwgMHhFOCwgMHg4OSwgMHhFOSwgMHg4OSwgMHhFQSwgLyogMHgyQy0weDJGICovCisJMHg4OSwgMHhFQiwgMHg4OSwgMHhFQywgMHg4OSwgMHhFRCwgMHg4OSwgMHhFRSwgLyogMHgzMC0weDMzICovCisJMHhCNSwgMHhDRCwgMHg4OSwgMHhFRiwgMHg4OSwgMHhGMCwgMHg4OSwgMHhGMSwgLyogMHgzNC0weDM3ICovCisJMHg4OSwgMHhGMiwgMHg4OSwgMHhGMywgMHg4OSwgMHhGNCwgMHg4OSwgMHhGNSwgLyogMHgzOC0weDNCICovCisJMHg4OSwgMHhGNiwgMHg4OSwgMHhGNywgMHg4OSwgMHhGOCwgMHg4OSwgMHhGOSwgLyogMHgzQy0weDNGICovCisJMHg4OSwgMHhGQSwgMHg4OSwgMHhGQiwgMHg4OSwgMHhGQywgMHg4OSwgMHhGRCwgLyogMHg0MC0weDQzICovCisJMHg4OSwgMHhGRSwgMHg4QSwgMHg0MSwgMHg4QSwgMHg0MiwgMHg4QSwgMHg0MywgLyogMHg0NC0weDQ3ICovCisJMHg4QSwgMHg0NCwgMHg4QSwgMHg0NSwgMHg4QSwgMHg0NiwgMHg4QSwgMHg0NywgLyogMHg0OC0weDRCICovCisJMHg4QSwgMHg0OCwgMHg4QSwgMHg0OSwgMHg4QSwgMHg0QSwgMHg4QSwgMHg0QiwgLyogMHg0Qy0weDRGICovCisJMHhCNSwgMHhDRSwgMHhCNSwgMHhDRiwgMHg4QSwgMHg0QywgMHg4QSwgMHg0RCwgLyogMHg1MC0weDUzICovCisJMHhCNSwgMHhEMCwgMHg4QSwgMHg0RSwgMHg4QSwgMHg0RiwgMHg4QSwgMHg1MCwgLyogMHg1NC0weDU3ICovCisJMHhCNSwgMHhEMSwgMHg4QSwgMHg1MSwgMHg4QSwgMHg1MiwgMHg4QSwgMHg1MywgLyogMHg1OC0weDVCICovCisJMHg4QSwgMHg1NCwgMHg4QSwgMHg1NSwgMHg4QSwgMHg1NiwgMHg4QSwgMHg1NywgLyogMHg1Qy0weDVGICovCisJMHhCNSwgMHhEMiwgMHhCNSwgMHhEMywgMHg4QSwgMHg1OCwgMHhCNSwgMHhENCwgLyogMHg2MC0weDYzICovCisJMHg4QSwgMHg1OSwgMHhCNSwgMHhENSwgMHg4QSwgMHg1QSwgMHg4QSwgMHg2MSwgLyogMHg2NC0weDY3ICovCisJMHg4QSwgMHg2MiwgMHg4QSwgMHg2MywgMHg4QSwgMHg2NCwgMHg4QSwgMHg2NSwgLyogMHg2OC0weDZCICovCisJMHhCNSwgMHhENiwgMHg4QSwgMHg2NiwgMHg4QSwgMHg2NywgMHg4QSwgMHg2OCwgLyogMHg2Qy0weDZGICovCisJMHg4QSwgMHg2OSwgMHg4QSwgMHg2QSwgMHg4QSwgMHg2QiwgMHg4QSwgMHg2QywgLyogMHg3MC0weDczICovCisJMHg4QSwgMHg2RCwgMHg4QSwgMHg2RSwgMHg4QSwgMHg2RiwgMHg4QSwgMHg3MCwgLyogMHg3NC0weDc3ICovCisJMHg4QSwgMHg3MSwgMHg4QSwgMHg3MiwgMHg4QSwgMHg3MywgMHg4QSwgMHg3NCwgLyogMHg3OC0weDdCICovCisJMHg4QSwgMHg3NSwgMHg4QSwgMHg3NiwgMHg4QSwgMHg3NywgMHg4QSwgMHg3OCwgLyogMHg3Qy0weDdGICovCisJCisJMHhCNSwgMHhENywgMHg4QSwgMHg3OSwgMHg4QSwgMHg3QSwgMHg4QSwgMHg4MSwgLyogMHg4MC0weDgzICovCisJMHg4QSwgMHg4MiwgMHg4QSwgMHg4MywgMHg4QSwgMHg4NCwgMHg4QSwgMHg4NSwgLyogMHg4NC0weDg3ICovCisJMHhCNSwgMHhEOCwgMHg4QSwgMHg4NiwgMHg4QSwgMHg4NywgMHg4QSwgMHg4OCwgLyogMHg4OC0weDhCICovCisJMHg4QSwgMHg4OSwgMHg4QSwgMHg4QSwgMHg4QSwgMHg4QiwgMHg4QSwgMHg4QywgLyogMHg4Qy0weDhGICovCisJMHg4QSwgMHg4RCwgMHg4QSwgMHg4RSwgMHg4QSwgMHg4RiwgMHg4QSwgMHg5MCwgLyogMHg5MC0weDkzICovCisJMHg4QSwgMHg5MSwgMHg4QSwgMHg5MiwgMHg4QSwgMHg5MywgMHg4QSwgMHg5NCwgLyogMHg5NC0weDk3ICovCisJMHg4QSwgMHg5NSwgMHg4QSwgMHg5NiwgMHg4QSwgMHg5NywgMHg4QSwgMHg5OCwgLyogMHg5OC0weDlCICovCisJMHg4QSwgMHg5OSwgMHhCNSwgMHhEOSwgMHg4QSwgMHg5QSwgMHg4QSwgMHg5QiwgLyogMHg5Qy0weDlGICovCisJMHg4QSwgMHg5QywgMHg4QSwgMHg5RCwgMHg4QSwgMHg5RSwgMHg4QSwgMHg5RiwgLyogMHhBMC0weEEzICovCisJMHhCNSwgMHhEQSwgMHg4QSwgMHhBMCwgMHg4QSwgMHhBMSwgMHg4QSwgMHhBMiwgLyogMHhBNC0weEE3ICovCisJMHhCNSwgMHhEQiwgMHg4QSwgMHhBMywgMHg4QSwgMHhBNCwgMHg4QSwgMHhBNSwgLyogMHhBOC0weEFCICovCisJMHhCNSwgMHhEQywgMHg4QSwgMHhBNiwgMHg4QSwgMHhBNywgMHg4QSwgMHhBOCwgLyogMHhBQy0weEFGICovCisJMHg4QSwgMHhBOSwgMHg4QSwgMHhBQSwgMHg4QSwgMHhBQiwgMHg4QSwgMHhBQywgLyogMHhCMC0weEIzICovCisJMHg4QSwgMHhBRCwgMHhCNSwgMHhERCwgMHg4QSwgMHhBRSwgMHhCNSwgMHhERSwgLyogMHhCNC0weEI3ICovCisJMHg4QSwgMHhBRiwgMHhCNSwgMHhERiwgMHg4QSwgMHhCMCwgMHg4QSwgMHhCMSwgLyogMHhCOC0weEJCICovCisJMHg4QSwgMHhCMiwgMHg4QSwgMHhCMywgMHg4QSwgMHhCNCwgMHg4QSwgMHhCNSwgLyogMHhCQy0weEJGICovCisJMHhCNSwgMHhFMCwgMHg4QSwgMHhCNiwgMHg4QSwgMHhCNywgMHg4QSwgMHhCOCwgLyogMHhDMC0weEMzICovCisJMHhCNSwgMHhFMSwgMHg4QSwgMHhCOSwgMHg4QSwgMHhCQSwgMHg4QSwgMHhCQiwgLyogMHhDNC0weEM3ICovCisJMHhCNSwgMHhFMiwgMHg4QSwgMHhCQywgMHg4QSwgMHhCRCwgMHg4QSwgMHhCRSwgLyogMHhDOC0weENCICovCisJMHg4QSwgMHhCRiwgMHg4QSwgMHhDMCwgMHg4QSwgMHhDMSwgMHg4QSwgMHhDMiwgLyogMHhDQy0weENGICovCisJMHhCNSwgMHhFMywgMHg4QSwgMHhDMywgMHg4QSwgMHhDNCwgMHg4QSwgMHhDNSwgLyogMHhEMC0weEQzICovCisJMHg4QSwgMHhDNiwgMHhCNSwgMHhFNCwgMHg4QSwgMHhDNywgMHg4QSwgMHhDOCwgLyogMHhENC0weEQ3ICovCisJMHg4QSwgMHhDOSwgMHg4QSwgMHhDQSwgMHg4QSwgMHhDQiwgMHg4QSwgMHhDQywgLyogMHhEOC0weERCICovCisJMHhCNSwgMHhFNSwgMHhCNSwgMHhFNiwgMHg4QSwgMHhDRCwgMHg4QSwgMHhDRSwgLyogMHhEQy0weERGICovCisJMHhCNSwgMHhFNywgMHg4QSwgMHhDRiwgMHg4QSwgMHhEMCwgMHhCNSwgMHhFOCwgLyogMHhFMC0weEUzICovCisJMHhCNSwgMHhFOSwgMHg4QSwgMHhEMSwgMHhCNSwgMHhFQSwgMHg4QSwgMHhEMiwgLyogMHhFNC0weEU3ICovCisJMHg4QSwgMHhEMywgMHg4QSwgMHhENCwgMHg4QSwgMHhENSwgMHg4QSwgMHhENiwgLyogMHhFOC0weEVCICovCisJMHhCNSwgMHhFQiwgMHhCNSwgMHhFQywgMHg4QSwgMHhENywgMHhCNSwgMHhFRCwgLyogMHhFQy0weEVGICovCisJMHg4QSwgMHhEOCwgMHhCNSwgMHhFRSwgMHg4QSwgMHhEOSwgMHg4QSwgMHhEQSwgLyogMHhGMC0weEYzICovCisJMHg4QSwgMHhEQiwgMHg4QSwgMHhEQywgMHg4QSwgMHhERCwgMHg4QSwgMHhERSwgLyogMHhGNC0weEY3ICovCisJMHhCNSwgMHhFRiwgMHg4QSwgMHhERiwgMHg4QSwgMHhFMCwgMHg4QSwgMHhFMSwgLyogMHhGOC0weEZCICovCisJMHg4QSwgMHhFMiwgMHg4QSwgMHhFMywgMHg4QSwgMHhFNCwgMHg4QSwgMHhFNSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfQjVbNTEyXSA9IHsKKwkweDhBLCAweEU2LCAweDhBLCAweEU3LCAweDhBLCAweEU4LCAweDhBLCAweEU5LCAvKiAweDAwLTB4MDMgKi8KKwkweDhBLCAweEVBLCAweDhBLCAweEVCLCAweDhBLCAweEVDLCAweDhBLCAweEVELCAvKiAweDA0LTB4MDcgKi8KKwkweDhBLCAweEVFLCAweDhBLCAweEVGLCAweDhBLCAweEYwLCAweDhBLCAweEYxLCAvKiAweDA4LTB4MEIgKi8KKwkweDhBLCAweEYyLCAweDhBLCAweEYzLCAweDhBLCAweEY0LCAweDhBLCAweEY1LCAvKiAweDBDLTB4MEYgKi8KKwkweDhBLCAweEY2LCAweDhBLCAweEY3LCAweDhBLCAweEY4LCAweDhBLCAweEY5LCAvKiAweDEwLTB4MTMgKi8KKwkweEI1LCAweEYwLCAweEI1LCAweEYxLCAweDhBLCAweEZBLCAweDhBLCAweEZCLCAvKiAweDE0LTB4MTcgKi8KKwkweEI1LCAweEYyLCAweDhBLCAweEZDLCAweDhBLCAweEZELCAweEI1LCAweEYzLCAvKiAweDE4LTB4MUIgKi8KKwkweEI1LCAweEY0LCAweDhBLCAweEZFLCAweDhCLCAweDQxLCAweDhCLCAweDQyLCAvKiAweDFDLTB4MUYgKi8KKwkweDhCLCAweDQzLCAweDhCLCAweDQ0LCAweDhCLCAweDQ1LCAweDhCLCAweDQ2LCAvKiAweDIwLTB4MjMgKi8KKwkweEI1LCAweEY1LCAweEI1LCAweEY2LCAweDhCLCAweDQ3LCAweEI1LCAweEY3LCAvKiAweDI0LTB4MjcgKi8KKwkweEI1LCAweEY4LCAweEI1LCAweEY5LCAweEI1LCAweEZBLCAweDhCLCAweDQ4LCAvKiAweDI4LTB4MkIgKi8KKwkweDhCLCAweDQ5LCAweDhCLCAweDRBLCAweDhCLCAweDRCLCAweDhCLCAweDRDLCAvKiAweDJDLTB4MkYgKi8KKwkweEI1LCAweEZCLCAweEI1LCAweEZDLCAweDhCLCAweDRELCAweDhCLCAweDRFLCAvKiAweDMwLTB4MzMgKi8KKwkweEI1LCAweEZELCAweDhCLCAweDRGLCAweDhCLCAweDUwLCAweDhCLCAweDUxLCAvKiAweDM0LTB4MzcgKi8KKwkweEI1LCAweEZFLCAweDhCLCAweDUyLCAweDhCLCAweDUzLCAweDhCLCAweDU0LCAvKiAweDM4LTB4M0IgKi8KKwkweDhCLCAweDU1LCAweDhCLCAweDU2LCAweDhCLCAweDU3LCAweDhCLCAweDU4LCAvKiAweDNDLTB4M0YgKi8KKwkweEI2LCAweEExLCAweEI2LCAweEEyLCAweDhCLCAweDU5LCAweEI2LCAweEEzLCAvKiAweDQwLTB4NDMgKi8KKwkweEI2LCAweEE0LCAweEI2LCAweEE1LCAweDhCLCAweDVBLCAweDhCLCAweDYxLCAvKiAweDQ0LTB4NDcgKi8KKwkweDhCLCAweDYyLCAweDhCLCAweDYzLCAweDhCLCAweDY0LCAweEI2LCAweEE2LCAvKiAweDQ4LTB4NEIgKi8KKwkweEI2LCAweEE3LCAweEI2LCAweEE4LCAweDhCLCAweDY1LCAweDhCLCAweDY2LCAvKiAweDRDLTB4NEYgKi8KKwkweEI2LCAweEE5LCAweDhCLCAweDY3LCAweDhCLCAweDY4LCAweDhCLCAweDY5LCAvKiAweDUwLTB4NTMgKi8KKwkweEI2LCAweEFBLCAweDhCLCAweDZBLCAweDhCLCAweDZCLCAweDhCLCAweDZDLCAvKiAweDU0LTB4NTcgKi8KKwkweDhCLCAweDZELCAweDhCLCAweDZFLCAweDhCLCAweDZGLCAweDhCLCAweDcwLCAvKiAweDU4LTB4NUIgKi8KKwkweEI2LCAweEFCLCAweEI2LCAweEFDLCAweDhCLCAweDcxLCAweEI2LCAweEFELCAvKiAweDVDLTB4NUYgKi8KKwkweEI2LCAweEFFLCAweEI2LCAweEFGLCAweDhCLCAweDcyLCAweDhCLCAweDczLCAvKiAweDYwLTB4NjMgKi8KKwkweDhCLCAweDc0LCAweDhCLCAweDc1LCAweDhCLCAweDc2LCAweDhCLCAweDc3LCAvKiAweDY0LTB4NjcgKi8KKwkweDhCLCAweDc4LCAweDhCLCAweDc5LCAweDhCLCAweDdBLCAweDhCLCAweDgxLCAvKiAweDY4LTB4NkIgKi8KKwkweDhCLCAweDgyLCAweDhCLCAweDgzLCAweDhCLCAweDg0LCAweDhCLCAweDg1LCAvKiAweDZDLTB4NkYgKi8KKwkweDhCLCAweDg2LCAweDhCLCAweDg3LCAweDhCLCAweDg4LCAweDhCLCAweDg5LCAvKiAweDcwLTB4NzMgKi8KKwkweDhCLCAweDhBLCAweDhCLCAweDhCLCAweDhCLCAweDhDLCAweDhCLCAweDhELCAvKiAweDc0LTB4NzcgKi8KKwkweDhCLCAweDhFLCAweDhCLCAweDhGLCAweDhCLCAweDkwLCAweDhCLCAweDkxLCAvKiAweDc4LTB4N0IgKi8KKwkweDhCLCAweDkyLCAweDhCLCAweDkzLCAweDhCLCAweDk0LCAweDhCLCAweDk1LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDhCLCAweDk2LCAweDhCLCAweDk3LCAweDhCLCAweDk4LCAweDhCLCAweDk5LCAvKiAweDgwLTB4ODMgKi8KKwkweDhCLCAweDlBLCAweDhCLCAweDlCLCAweDhCLCAweDlDLCAweDhCLCAweDlELCAvKiAweDg0LTB4ODcgKi8KKwkweDhCLCAweDlFLCAweDhCLCAweDlGLCAweDhCLCAweEEwLCAweDhCLCAweEExLCAvKiAweDg4LTB4OEIgKi8KKwkweDhCLCAweEEyLCAweDhCLCAweEEzLCAweDhCLCAweEE0LCAweDhCLCAweEE1LCAvKiAweDhDLTB4OEYgKi8KKwkweDhCLCAweEE2LCAweDhCLCAweEE3LCAweDhCLCAweEE4LCAweDhCLCAweEE5LCAvKiAweDkwLTB4OTMgKi8KKwkweDhCLCAweEFBLCAweDhCLCAweEFCLCAweDhCLCAweEFDLCAweDhCLCAweEFELCAvKiAweDk0LTB4OTcgKi8KKwkweDhCLCAweEFFLCAweDhCLCAweEFGLCAweDhCLCAweEIwLCAweDhCLCAweEIxLCAvKiAweDk4LTB4OUIgKi8KKwkweDhCLCAweEIyLCAweDhCLCAweEIzLCAweDhCLCAweEI0LCAweDhCLCAweEI1LCAvKiAweDlDLTB4OUYgKi8KKwkweEI2LCAweEIwLCAweEI2LCAweEIxLCAweDhCLCAweEI2LCAweDhCLCAweEI3LCAvKiAweEEwLTB4QTMgKi8KKwkweEI2LCAweEIyLCAweDhCLCAweEI4LCAweDhCLCAweEI5LCAweDhCLCAweEJBLCAvKiAweEE0LTB4QTcgKi8KKwkweEI2LCAweEIzLCAweDhCLCAweEJCLCAweEI2LCAweEI0LCAweEI2LCAweEI1LCAvKiAweEE4LTB4QUIgKi8KKwkweDhCLCAweEJDLCAweDhCLCAweEJELCAweDhCLCAweEJFLCAweDhCLCAweEJGLCAvKiAweEFDLTB4QUYgKi8KKwkweEI2LCAweEI2LCAweEI2LCAweEI3LCAweDhCLCAweEMwLCAweEI2LCAweEI4LCAvKiAweEIwLTB4QjMgKi8KKwkweEI2LCAweEI5LCAweEI2LCAweEJBLCAweDhCLCAweEMxLCAweDhCLCAweEMyLCAvKiAweEI0LTB4QjcgKi8KKwkweDhCLCAweEMzLCAweDhCLCAweEM0LCAweDhCLCAweEM1LCAweEI2LCAweEJCLCAvKiAweEI4LTB4QkIgKi8KKwkweEI2LCAweEJDLCAweEI2LCAweEJELCAweDhCLCAweEM2LCAweDhCLCAweEM3LCAvKiAweEJDLTB4QkYgKi8KKwkweEI2LCAweEJFLCAweDhCLCAweEM4LCAweDhCLCAweEM5LCAweDhCLCAweENBLCAvKiAweEMwLTB4QzMgKi8KKwkweEI2LCAweEJGLCAweDhCLCAweENCLCAweDhCLCAweENDLCAweDhCLCAweENELCAvKiAweEM0LTB4QzcgKi8KKwkweDhCLCAweENFLCAweDhCLCAweENGLCAweDhCLCAweEQwLCAweDhCLCAweEQxLCAvKiAweEM4LTB4Q0IgKi8KKwkweEI2LCAweEMwLCAweEI2LCAweEMxLCAweDhCLCAweEQyLCAweEI2LCAweEMyLCAvKiAweENDLTB4Q0YgKi8KKwkweEI2LCAweEMzLCAweEI2LCAweEM0LCAweDhCLCAweEQzLCAweDhCLCAweEQ0LCAvKiAweEQwLTB4RDMgKi8KKwkweDhCLCAweEQ1LCAweDhCLCAweEQ2LCAweDhCLCAweEQ3LCAweDhCLCAweEQ4LCAvKiAweEQ0LTB4RDcgKi8KKwkweEI2LCAweEM1LCAweDhCLCAweEQ5LCAweDhCLCAweERBLCAweDhCLCAweERCLCAvKiAweEQ4LTB4REIgKi8KKwkweDhCLCAweERDLCAweDhCLCAweERELCAweDhCLCAweERFLCAweDhCLCAweERGLCAvKiAweERDLTB4REYgKi8KKwkweDhCLCAweEUwLCAweDhCLCAweEUxLCAweDhCLCAweEUyLCAweDhCLCAweEUzLCAvKiAweEUwLTB4RTMgKi8KKwkweDhCLCAweEU0LCAweDhCLCAweEU1LCAweDhCLCAweEU2LCAweDhCLCAweEU3LCAvKiAweEU0LTB4RTcgKi8KKwkweDhCLCAweEU4LCAweDhCLCAweEU5LCAweDhCLCAweEVBLCAweDhCLCAweEVCLCAvKiAweEU4LTB4RUIgKi8KKwkweEI2LCAweEM2LCAweDhCLCAweEVDLCAweDhCLCAweEVELCAweDhCLCAweEVFLCAvKiAweEVDLTB4RUYgKi8KKwkweDhCLCAweEVGLCAweDhCLCAweEYwLCAweDhCLCAweEYxLCAweDhCLCAweEYyLCAvKiAweEYwLTB4RjMgKi8KKwkweDhCLCAweEYzLCAweDhCLCAweEY0LCAweDhCLCAweEY1LCAweDhCLCAweEY2LCAvKiAweEY0LTB4RjcgKi8KKwkweDhCLCAweEY3LCAweDhCLCAweEY4LCAweDhCLCAweEY5LCAweDhCLCAweEZBLCAvKiAweEY4LTB4RkIgKi8KKwkweDhCLCAweEZCLCAweDhCLCAweEZDLCAweDhCLCAweEZELCAweDhCLCAweEZFLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19CNls1MTJdID0geworCTB4OEMsIDB4NDEsIDB4OEMsIDB4NDIsIDB4OEMsIDB4NDMsIDB4OEMsIDB4NDQsIC8qIDB4MDAtMHgwMyAqLworCTB4OEMsIDB4NDUsIDB4OEMsIDB4NDYsIDB4OEMsIDB4NDcsIDB4OEMsIDB4NDgsIC8qIDB4MDQtMHgwNyAqLworCTB4OEMsIDB4NDksIDB4OEMsIDB4NEEsIDB4OEMsIDB4NEIsIDB4OEMsIDB4NEMsIC8qIDB4MDgtMHgwQiAqLworCTB4OEMsIDB4NEQsIDB4OEMsIDB4NEUsIDB4OEMsIDB4NEYsIDB4OEMsIDB4NTAsIC8qIDB4MEMtMHgwRiAqLworCTB4QjYsIDB4QzcsIDB4QjYsIDB4QzgsIDB4OEMsIDB4NTEsIDB4OEMsIDB4NTIsIC8qIDB4MTAtMHgxMyAqLworCTB4QjYsIDB4QzksIDB4OEMsIDB4NTMsIDB4OEMsIDB4NTQsIDB4OEMsIDB4NTUsIC8qIDB4MTQtMHgxNyAqLworCTB4QjYsIDB4Q0EsIDB4OEMsIDB4NTYsIDB4OEMsIDB4NTcsIDB4OEMsIDB4NTgsIC8qIDB4MTgtMHgxQiAqLworCTB4OEMsIDB4NTksIDB4OEMsIDB4NUEsIDB4OEMsIDB4NjEsIDB4OEMsIDB4NjIsIC8qIDB4MUMtMHgxRiAqLworCTB4OEMsIDB4NjMsIDB4OEMsIDB4NjQsIDB4OEMsIDB4NjUsIDB4OEMsIDB4NjYsIC8qIDB4MjAtMHgyMyAqLworCTB4OEMsIDB4NjcsIDB4QjYsIDB4Q0IsIDB4OEMsIDB4NjgsIDB4OEMsIDB4NjksIC8qIDB4MjQtMHgyNyAqLworCTB4OEMsIDB4NkEsIDB4OEMsIDB4NkIsIDB4OEMsIDB4NkMsIDB4OEMsIDB4NkQsIC8qIDB4MjgtMHgyQiAqLworCTB4QjYsIDB4Q0MsIDB4OEMsIDB4NkUsIDB4OEMsIDB4NkYsIDB4OEMsIDB4NzAsIC8qIDB4MkMtMHgyRiAqLworCTB4OEMsIDB4NzEsIDB4OEMsIDB4NzIsIDB4OEMsIDB4NzMsIDB4OEMsIDB4NzQsIC8qIDB4MzAtMHgzMyAqLworCTB4QjYsIDB4Q0QsIDB4OEMsIDB4NzUsIDB4OEMsIDB4NzYsIDB4OEMsIDB4NzcsIC8qIDB4MzQtMHgzNyAqLworCTB4OEMsIDB4NzgsIDB4OEMsIDB4NzksIDB4OEMsIDB4N0EsIDB4OEMsIDB4ODEsIC8qIDB4MzgtMHgzQiAqLworCTB4OEMsIDB4ODIsIDB4OEMsIDB4ODMsIDB4OEMsIDB4ODQsIDB4OEMsIDB4ODUsIC8qIDB4M0MtMHgzRiAqLworCTB4OEMsIDB4ODYsIDB4OEMsIDB4ODcsIDB4OEMsIDB4ODgsIDB4OEMsIDB4ODksIC8qIDB4NDAtMHg0MyAqLworCTB4OEMsIDB4OEEsIDB4OEMsIDB4OEIsIDB4OEMsIDB4OEMsIDB4OEMsIDB4OEQsIC8qIDB4NDQtMHg0NyAqLworCTB4QjYsIDB4Q0UsIDB4OEMsIDB4OEUsIDB4OEMsIDB4OEYsIDB4OEMsIDB4OTAsIC8qIDB4NDgtMHg0QiAqLworCTB4OEMsIDB4OTEsIDB4OEMsIDB4OTIsIDB4OEMsIDB4OTMsIDB4OEMsIDB4OTQsIC8qIDB4NEMtMHg0RiAqLworCTB4OEMsIDB4OTUsIDB4OEMsIDB4OTYsIDB4OEMsIDB4OTcsIDB4OEMsIDB4OTgsIC8qIDB4NTAtMHg1MyAqLworCTB4OEMsIDB4OTksIDB4OEMsIDB4OUEsIDB4OEMsIDB4OUIsIDB4OEMsIDB4OUMsIC8qIDB4NTQtMHg1NyAqLworCTB4OEMsIDB4OUQsIDB4OEMsIDB4OUUsIDB4OEMsIDB4OUYsIDB4OEMsIDB4QTAsIC8qIDB4NTgtMHg1QiAqLworCTB4OEMsIDB4QTEsIDB4OEMsIDB4QTIsIDB4OEMsIDB4QTMsIDB4OEMsIDB4QTQsIC8qIDB4NUMtMHg1RiAqLworCTB4OEMsIDB4QTUsIDB4OEMsIDB4QTYsIDB4OEMsIDB4QTcsIDB4OEMsIDB4QTgsIC8qIDB4NjAtMHg2MyAqLworCTB4QjYsIDB4Q0YsIDB4OEMsIDB4QTksIDB4OEMsIDB4QUEsIDB4OEMsIDB4QUIsIC8qIDB4NjQtMHg2NyAqLworCTB4QjYsIDB4RDAsIDB4OEMsIDB4QUMsIDB4OEMsIDB4QUQsIDB4OEMsIDB4QUUsIC8qIDB4NjgtMHg2QiAqLworCTB4OEMsIDB4QUYsIDB4OEMsIDB4QjAsIDB4OEMsIDB4QjEsIDB4OEMsIDB4QjIsIC8qIDB4NkMtMHg2RiAqLworCTB4OEMsIDB4QjMsIDB4OEMsIDB4QjQsIDB4OEMsIDB4QjUsIDB4OEMsIDB4QjYsIC8qIDB4NzAtMHg3MyAqLworCTB4OEMsIDB4QjcsIDB4OEMsIDB4QjgsIDB4OEMsIDB4QjksIDB4OEMsIDB4QkEsIC8qIDB4NzQtMHg3NyAqLworCTB4OEMsIDB4QkIsIDB4OEMsIDB4QkMsIDB4OEMsIDB4QkQsIDB4OEMsIDB4QkUsIC8qIDB4NzgtMHg3QiAqLworCTB4OEMsIDB4QkYsIDB4OEMsIDB4QzAsIDB4OEMsIDB4QzEsIDB4OEMsIDB4QzIsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4OEMsIDB4QzMsIDB4OEMsIDB4QzQsIDB4OEMsIDB4QzUsIDB4OEMsIDB4QzYsIC8qIDB4ODAtMHg4MyAqLworCTB4OEMsIDB4QzcsIDB4OEMsIDB4QzgsIDB4OEMsIDB4QzksIDB4OEMsIDB4Q0EsIC8qIDB4ODQtMHg4NyAqLworCTB4OEMsIDB4Q0IsIDB4OEMsIDB4Q0MsIDB4OEMsIDB4Q0QsIDB4OEMsIDB4Q0UsIC8qIDB4ODgtMHg4QiAqLworCTB4OEMsIDB4Q0YsIDB4OEMsIDB4RDAsIDB4OEMsIDB4RDEsIDB4OEMsIDB4RDIsIC8qIDB4OEMtMHg4RiAqLworCTB4OEMsIDB4RDMsIDB4OEMsIDB4RDQsIDB4OEMsIDB4RDUsIDB4OEMsIDB4RDYsIC8qIDB4OTAtMHg5MyAqLworCTB4OEMsIDB4RDcsIDB4OEMsIDB4RDgsIDB4OEMsIDB4RDksIDB4OEMsIDB4REEsIC8qIDB4OTQtMHg5NyAqLworCTB4OEMsIDB4REIsIDB4OEMsIDB4REMsIDB4OEMsIDB4REQsIDB4OEMsIDB4REUsIC8qIDB4OTgtMHg5QiAqLworCTB4QjYsIDB4RDEsIDB4QjYsIDB4RDIsIDB4OEMsIDB4REYsIDB4OEMsIDB4RTAsIC8qIDB4OUMtMHg5RiAqLworCTB4QjYsIDB4RDMsIDB4OEMsIDB4RTEsIDB4OEMsIDB4RTIsIDB4OEMsIDB4RTMsIC8qIDB4QTAtMHhBMyAqLworCTB4QjYsIDB4RDQsIDB4OEMsIDB4RTQsIDB4OEMsIDB4RTUsIDB4OEMsIDB4RTYsIC8qIDB4QTQtMHhBNyAqLworCTB4OEMsIDB4RTcsIDB4OEMsIDB4RTgsIDB4OEMsIDB4RTksIDB4QjYsIDB4RDUsIC8qIDB4QTgtMHhBQiAqLworCTB4QjYsIDB4RDYsIDB4OEMsIDB4RUEsIDB4OEMsIDB4RUIsIDB4OEMsIDB4RUMsIC8qIDB4QUMtMHhBRiAqLworCTB4OEMsIDB4RUQsIDB4QjYsIDB4RDcsIDB4OEMsIDB4RUUsIDB4OEMsIDB4RUYsIC8qIDB4QjAtMHhCMyAqLworCTB4OEMsIDB4RjAsIDB4OEMsIDB4RjEsIDB4OEMsIDB4RjIsIDB4OEMsIDB4RjMsIC8qIDB4QjQtMHhCNyAqLworCTB4OEMsIDB4RjQsIDB4OEMsIDB4RjUsIDB4OEMsIDB4RjYsIDB4OEMsIDB4RjcsIC8qIDB4QjgtMHhCQiAqLworCTB4OEMsIDB4RjgsIDB4OEMsIDB4RjksIDB4OEMsIDB4RkEsIDB4OEMsIDB4RkIsIC8qIDB4QkMtMHhCRiAqLworCTB4OEMsIDB4RkMsIDB4OEMsIDB4RkQsIDB4OEMsIDB4RkUsIDB4OEQsIDB4NDEsIC8qIDB4QzAtMHhDMyAqLworCTB4OEQsIDB4NDIsIDB4OEQsIDB4NDMsIDB4OEQsIDB4NDQsIDB4OEQsIDB4NDUsIC8qIDB4QzQtMHhDNyAqLworCTB4OEQsIDB4NDYsIDB4OEQsIDB4NDcsIDB4OEQsIDB4NDgsIDB4OEQsIDB4NDksIC8qIDB4QzgtMHhDQiAqLworCTB4OEQsIDB4NEEsIDB4OEQsIDB4NEIsIDB4OEQsIDB4NEMsIDB4OEQsIDB4NEQsIC8qIDB4Q0MtMHhDRiAqLworCTB4OEQsIDB4NEUsIDB4OEQsIDB4NEYsIDB4OEQsIDB4NTAsIDB4OEQsIDB4NTEsIC8qIDB4RDAtMHhEMyAqLworCTB4QjYsIDB4RDgsIDB4OEQsIDB4NTIsIDB4OEQsIDB4NTMsIDB4OEQsIDB4NTQsIC8qIDB4RDQtMHhENyAqLworCTB4OEQsIDB4NTUsIDB4OEQsIDB4NTYsIDB4OEQsIDB4NTcsIDB4OEQsIDB4NTgsIC8qIDB4RDgtMHhEQiAqLworCTB4OEQsIDB4NTksIDB4OEQsIDB4NUEsIDB4OEQsIDB4NjEsIDB4OEQsIDB4NjIsIC8qIDB4REMtMHhERiAqLworCTB4OEQsIDB4NjMsIDB4OEQsIDB4NjQsIDB4OEQsIDB4NjUsIDB4OEQsIDB4NjYsIC8qIDB4RTAtMHhFMyAqLworCTB4OEQsIDB4NjcsIDB4OEQsIDB4NjgsIDB4OEQsIDB4NjksIDB4OEQsIDB4NkEsIC8qIDB4RTQtMHhFNyAqLworCTB4OEQsIDB4NkIsIDB4OEQsIDB4NkMsIDB4OEQsIDB4NkQsIDB4OEQsIDB4NkUsIC8qIDB4RTgtMHhFQiAqLworCTB4OEQsIDB4NkYsIDB4OEQsIDB4NzAsIDB4OEQsIDB4NzEsIDB4OEQsIDB4NzIsIC8qIDB4RUMtMHhFRiAqLworCTB4QjYsIDB4RDksIDB4OEQsIDB4NzMsIDB4OEQsIDB4NzQsIDB4OEQsIDB4NzUsIC8qIDB4RjAtMHhGMyAqLworCTB4QjYsIDB4REEsIDB4OEQsIDB4NzYsIDB4OEQsIDB4NzcsIDB4OEQsIDB4NzgsIC8qIDB4RjQtMHhGNyAqLworCTB4QjYsIDB4REIsIDB4OEQsIDB4NzksIDB4OEQsIDB4N0EsIDB4OEQsIDB4ODEsIC8qIDB4RjgtMHhGQiAqLworCTB4OEQsIDB4ODIsIDB4OEQsIDB4ODMsIDB4OEQsIDB4ODQsIDB4OEQsIDB4ODUsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0I3WzUxMl0gPSB7CisJMHhCNiwgMHhEQywgMHhCNiwgMHhERCwgMHg4RCwgMHg4NiwgMHg4RCwgMHg4NywgLyogMHgwMC0weDAzICovCisJMHg4RCwgMHg4OCwgMHhCNiwgMHhERSwgMHg4RCwgMHg4OSwgMHg4RCwgMHg4QSwgLyogMHgwNC0weDA3ICovCisJMHg4RCwgMHg4QiwgMHg4RCwgMHg4QywgMHg4RCwgMHg4RCwgMHg4RCwgMHg4RSwgLyogMHgwOC0weDBCICovCisJMHg4RCwgMHg4RiwgMHg4RCwgMHg5MCwgMHg4RCwgMHg5MSwgMHg4RCwgMHg5MiwgLyogMHgwQy0weDBGICovCisJMHg4RCwgMHg5MywgMHg4RCwgMHg5NCwgMHg4RCwgMHg5NSwgMHg4RCwgMHg5NiwgLyogMHgxMC0weDEzICovCisJMHg4RCwgMHg5NywgMHg4RCwgMHg5OCwgMHg4RCwgMHg5OSwgMHg4RCwgMHg5QSwgLyogMHgxNC0weDE3ICovCisJMHg4RCwgMHg5QiwgMHg4RCwgMHg5QywgMHg4RCwgMHg5RCwgMHg4RCwgMHg5RSwgLyogMHgxOC0weDFCICovCisJMHg4RCwgMHg5RiwgMHg4RCwgMHhBMCwgMHg4RCwgMHhBMSwgMHg4RCwgMHhBMiwgLyogMHgxQy0weDFGICovCisJMHg4RCwgMHhBMywgMHg4RCwgMHhBNCwgMHg4RCwgMHhBNSwgMHg4RCwgMHhBNiwgLyogMHgyMC0weDIzICovCisJMHg4RCwgMHhBNywgMHg4RCwgMHhBOCwgMHg4RCwgMHhBOSwgMHg4RCwgMHhBQSwgLyogMHgyNC0weDI3ICovCisJMHhCNiwgMHhERiwgMHhCNiwgMHhFMCwgMHg4RCwgMHhBQiwgMHg4RCwgMHhBQywgLyogMHgyOC0weDJCICovCisJMHhCNiwgMHhFMSwgMHg4RCwgMHhBRCwgMHg4RCwgMHhBRSwgMHhCNiwgMHhFMiwgLyogMHgyQy0weDJGICovCisJMHhCNiwgMHhFMywgMHg4RCwgMHhBRiwgMHg4RCwgMHhCMCwgMHg4RCwgMHhCMSwgLyogMHgzMC0weDMzICovCisJMHg4RCwgMHhCMiwgMHg4RCwgMHhCMywgMHg4RCwgMHhCNCwgMHg4RCwgMHhCNSwgLyogMHgzNC0weDM3ICovCisJMHhCNiwgMHhFNCwgMHhCNiwgMHhFNSwgMHg4RCwgMHhCNiwgMHhCNiwgMHhFNiwgLyogMHgzOC0weDNCICovCisJMHg4RCwgMHhCNywgMHg4RCwgMHhCOCwgMHg4RCwgMHhCOSwgMHg4RCwgMHhCQSwgLyogMHgzQy0weDNGICovCisJMHg4RCwgMHhCQiwgMHg4RCwgMHhCQywgMHg4RCwgMHhCRCwgMHg4RCwgMHhCRSwgLyogMHg0MC0weDQzICovCisJMHhCNiwgMHhFNywgMHg4RCwgMHhCRiwgMHg4RCwgMHhDMCwgMHg4RCwgMHhDMSwgLyogMHg0NC0weDQ3ICovCisJMHhCNiwgMHhFOCwgMHg4RCwgMHhDMiwgMHg4RCwgMHhDMywgMHg4RCwgMHhDNCwgLyogMHg0OC0weDRCICovCisJMHhCNiwgMHhFOSwgMHg4RCwgMHhDNSwgMHg4RCwgMHhDNiwgMHg4RCwgMHhDNywgLyogMHg0Qy0weDRGICovCisJMHg4RCwgMHhDOCwgMHg4RCwgMHhDOSwgMHg4RCwgMHhDQSwgMHg4RCwgMHhDQiwgLyogMHg1MC0weDUzICovCisJMHhCNiwgMHhFQSwgMHhCNiwgMHhFQiwgMHg4RCwgMHhDQywgMHg4RCwgMHhDRCwgLyogMHg1NC0weDU3ICovCisJMHg4RCwgMHhDRSwgMHg4RCwgMHhDRiwgMHg4RCwgMHhEMCwgMHg4RCwgMHhEMSwgLyogMHg1OC0weDVCICovCisJMHg4RCwgMHhEMiwgMHg4RCwgMHhEMywgMHg4RCwgMHhENCwgMHg4RCwgMHhENSwgLyogMHg1Qy0weDVGICovCisJMHhCNiwgMHhFQywgMHg4RCwgMHhENiwgMHg4RCwgMHhENywgMHg4RCwgMHhEOCwgLyogMHg2MC0weDYzICovCisJMHhCNiwgMHhFRCwgMHg4RCwgMHhEOSwgMHg4RCwgMHhEQSwgMHg4RCwgMHhEQiwgLyogMHg2NC0weDY3ICovCisJMHhCNiwgMHhFRSwgMHg4RCwgMHhEQywgMHg4RCwgMHhERCwgMHg4RCwgMHhERSwgLyogMHg2OC0weDZCICovCisJMHg4RCwgMHhERiwgMHg4RCwgMHhFMCwgMHg4RCwgMHhFMSwgMHg4RCwgMHhFMiwgLyogMHg2Qy0weDZGICovCisJMHhCNiwgMHhFRiwgMHhCNiwgMHhGMCwgMHg4RCwgMHhFMywgMHhCNiwgMHhGMSwgLyogMHg3MC0weDczICovCisJMHg4RCwgMHhFNCwgMHhCNiwgMHhGMiwgMHg4RCwgMHhFNSwgMHg4RCwgMHhFNiwgLyogMHg3NC0weDc3ICovCisJMHg4RCwgMHhFNywgMHg4RCwgMHhFOCwgMHg4RCwgMHhFOSwgMHg4RCwgMHhFQSwgLyogMHg3OC0weDdCICovCisJMHhCNiwgMHhGMywgMHhCNiwgMHhGNCwgMHg4RCwgMHhFQiwgMHg4RCwgMHhFQywgLyogMHg3Qy0weDdGICovCisJCisJMHhCNiwgMHhGNSwgMHg4RCwgMHhFRCwgMHg4RCwgMHhFRSwgMHg4RCwgMHhFRiwgLyogMHg4MC0weDgzICovCisJMHhCNiwgMHhGNiwgMHg4RCwgMHhGMCwgMHg4RCwgMHhGMSwgMHg4RCwgMHhGMiwgLyogMHg4NC0weDg3ICovCisJMHg4RCwgMHhGMywgMHg4RCwgMHhGNCwgMHg4RCwgMHhGNSwgMHg4RCwgMHhGNiwgLyogMHg4OC0weDhCICovCisJMHhCNiwgMHhGNywgMHhCNiwgMHhGOCwgMHg4RCwgMHhGNywgMHhCNiwgMHhGOSwgLyogMHg4Qy0weDhGICovCisJMHhCNiwgMHhGQSwgMHhCNiwgMHhGQiwgMHhCNiwgMHhGQywgMHg4RCwgMHhGOCwgLyogMHg5MC0weDkzICovCisJMHg4RCwgMHhGOSwgMHg4RCwgMHhGQSwgMHhCNiwgMHhGRCwgMHhCNiwgMHhGRSwgLyogMHg5NC0weDk3ICovCisJMHhCNywgMHhBMSwgMHhCNywgMHhBMiwgMHg4RCwgMHhGQiwgMHg4RCwgMHhGQywgLyogMHg5OC0weDlCICovCisJMHhCNywgMHhBMywgMHg4RCwgMHhGRCwgMHg4RCwgMHhGRSwgMHg4RSwgMHg0MSwgLyogMHg5Qy0weDlGICovCisJMHhCNywgMHhBNCwgMHg4RSwgMHg0MiwgMHg4RSwgMHg0MywgMHg4RSwgMHg0NCwgLyogMHhBMC0weEEzICovCisJMHg4RSwgMHg0NSwgMHg4RSwgMHg0NiwgMHg4RSwgMHg0NywgMHg4RSwgMHg0OCwgLyogMHhBNC0weEE3ICovCisJMHhCNywgMHhBNSwgMHhCNywgMHhBNiwgMHg4RSwgMHg0OSwgMHhCNywgMHhBNywgLyogMHhBOC0weEFCICovCisJMHhCNywgMHhBOCwgMHhCNywgMHhBOSwgMHg4RSwgMHg0QSwgMHg4RSwgMHg0QiwgLyogMHhBQy0weEFGICovCisJMHg4RSwgMHg0QywgMHg4RSwgMHg0RCwgMHg4RSwgMHg0RSwgMHg4RSwgMHg0RiwgLyogMHhCMC0weEIzICovCisJMHhCNywgMHhBQSwgMHhCNywgMHhBQiwgMHg4RSwgMHg1MCwgMHg4RSwgMHg1MSwgLyogMHhCNC0weEI3ICovCisJMHhCNywgMHhBQywgMHg4RSwgMHg1MiwgMHg4RSwgMHg1MywgMHg4RSwgMHg1NCwgLyogMHhCOC0weEJCICovCisJMHg4RSwgMHg1NSwgMHg4RSwgMHg1NiwgMHg4RSwgMHg1NywgMHg4RSwgMHg1OCwgLyogMHhCQy0weEJGICovCisJMHg4RSwgMHg1OSwgMHg4RSwgMHg1QSwgMHg4RSwgMHg2MSwgMHg4RSwgMHg2MiwgLyogMHhDMC0weEMzICovCisJMHg4RSwgMHg2MywgMHg4RSwgMHg2NCwgMHg4RSwgMHg2NSwgMHhCNywgMHhBRCwgLyogMHhDNC0weEM3ICovCisJMHg4RSwgMHg2NiwgMHhCNywgMHhBRSwgMHg4RSwgMHg2NywgMHg4RSwgMHg2OCwgLyogMHhDOC0weENCICovCisJMHg4RSwgMHg2OSwgMHg4RSwgMHg2QSwgMHg4RSwgMHg2QiwgMHg4RSwgMHg2QywgLyogMHhDQy0weENGICovCisJMHg4RSwgMHg2RCwgMHg4RSwgMHg2RSwgMHg4RSwgMHg2RiwgMHg4RSwgMHg3MCwgLyogMHhEMC0weEQzICovCisJMHg4RSwgMHg3MSwgMHg4RSwgMHg3MiwgMHg4RSwgMHg3MywgMHg4RSwgMHg3NCwgLyogMHhENC0weEQ3ICovCisJMHg4RSwgMHg3NSwgMHg4RSwgMHg3NiwgMHg4RSwgMHg3NywgMHg4RSwgMHg3OCwgLyogMHhEOC0weERCICovCisJMHg4RSwgMHg3OSwgMHg4RSwgMHg3QSwgMHg4RSwgMHg4MSwgMHg4RSwgMHg4MiwgLyogMHhEQy0weERGICovCisJMHg4RSwgMHg4MywgMHg4RSwgMHg4NCwgMHg4RSwgMHg4NSwgMHg4RSwgMHg4NiwgLyogMHhFMC0weEUzICovCisJMHg4RSwgMHg4NywgMHg4RSwgMHg4OCwgMHg4RSwgMHg4OSwgMHg4RSwgMHg4QSwgLyogMHhFNC0weEU3ICovCisJMHg4RSwgMHg4QiwgMHg4RSwgMHg4QywgMHg4RSwgMHg4RCwgMHg4RSwgMHg4RSwgLyogMHhFOC0weEVCICovCisJMHhCNywgMHhBRiwgMHhCNywgMHhCMCwgMHg4RSwgMHg4RiwgMHg4RSwgMHg5MCwgLyogMHhFQy0weEVGICovCisJMHhCNywgMHhCMSwgMHg4RSwgMHg5MSwgMHg4RSwgMHg5MiwgMHg4RSwgMHg5MywgLyogMHhGMC0weEYzICovCisJMHhCNywgMHhCMiwgMHg4RSwgMHg5NCwgMHg4RSwgMHg5NSwgMHg4RSwgMHg5NiwgLyogMHhGNC0weEY3ICovCisJMHg4RSwgMHg5NywgMHg4RSwgMHg5OCwgMHg4RSwgMHg5OSwgMHg4RSwgMHg5QSwgLyogMHhGOC0weEZCICovCisJMHhCNywgMHhCMywgMHhCNywgMHhCNCwgMHg4RSwgMHg5QiwgMHhCNywgMHhCNSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfQjhbNTEyXSA9IHsKKwkweEI3LCAweEI2LCAweEI3LCAweEI3LCAweDhFLCAweDlDLCAweDhFLCAweDlELCAvKiAweDAwLTB4MDMgKi8KKwkweDhFLCAweDlFLCAweDhFLCAweDlGLCAweDhFLCAweEEwLCAweEI3LCAweEI4LCAvKiAweDA0LTB4MDcgKi8KKwkweEI3LCAweEI5LCAweEI3LCAweEJBLCAweDhFLCAweEExLCAweDhFLCAweEEyLCAvKiAweDA4LTB4MEIgKi8KKwkweEI3LCAweEJCLCAweDhFLCAweEEzLCAweDhFLCAweEE0LCAweDhFLCAweEE1LCAvKiAweDBDLTB4MEYgKi8KKwkweEI3LCAweEJDLCAweDhFLCAweEE2LCAweDhFLCAweEE3LCAweDhFLCAweEE4LCAvKiAweDEwLTB4MTMgKi8KKwkweDhFLCAweEE5LCAweDhFLCAweEFBLCAweDhFLCAweEFCLCAweDhFLCAweEFDLCAvKiAweDE0LTB4MTcgKi8KKwkweEI3LCAweEJELCAweEI3LCAweEJFLCAweDhFLCAweEFELCAweEI3LCAweEJGLCAvKiAweDE4LTB4MUIgKi8KKwkweDhFLCAweEFFLCAweEI3LCAweEMwLCAweDhFLCAweEFGLCAweDhFLCAweEIwLCAvKiAweDFDLTB4MUYgKi8KKwkweDhFLCAweEIxLCAweDhFLCAweEIyLCAweDhFLCAweEIzLCAweDhFLCAweEI0LCAvKiAweDIwLTB4MjMgKi8KKwkweEI3LCAweEMxLCAweEI3LCAweEMyLCAweDhFLCAweEI1LCAweDhFLCAweEI2LCAvKiAweDI0LTB4MjcgKi8KKwkweEI3LCAweEMzLCAweDhFLCAweEI3LCAweDhFLCAweEI4LCAweDhFLCAweEI5LCAvKiAweDI4LTB4MkIgKi8KKwkweEI3LCAweEM0LCAweDhFLCAweEJBLCAweDhFLCAweEJCLCAweDhFLCAweEJDLCAvKiAweDJDLTB4MkYgKi8KKwkweDhFLCAweEJELCAweDhFLCAweEJFLCAweDhFLCAweEJGLCAweDhFLCAweEMwLCAvKiAweDMwLTB4MzMgKi8KKwkweEI3LCAweEM1LCAweEI3LCAweEM2LCAweDhFLCAweEMxLCAweEI3LCAweEM3LCAvKiAweDM0LTB4MzcgKi8KKwkweEI3LCAweEM4LCAweEI3LCAweEM5LCAweDhFLCAweEMyLCAweDhFLCAweEMzLCAvKiAweDM4LTB4M0IgKi8KKwkweDhFLCAweEM0LCAweDhFLCAweEM1LCAweDhFLCAweEM2LCAweDhFLCAweEM3LCAvKiAweDNDLTB4M0YgKi8KKwkweEI3LCAweENBLCAweDhFLCAweEM4LCAweDhFLCAweEM5LCAweDhFLCAweENBLCAvKiAweDQwLTB4NDMgKi8KKwkweEI3LCAweENCLCAweDhFLCAweENCLCAweDhFLCAweENDLCAweDhFLCAweENELCAvKiAweDQ0LTB4NDcgKi8KKwkweDhFLCAweENFLCAweDhFLCAweENGLCAweDhFLCAweEQwLCAweDhFLCAweEQxLCAvKiAweDQ4LTB4NEIgKi8KKwkweDhFLCAweEQyLCAweDhFLCAweEQzLCAweDhFLCAweEQ0LCAweDhFLCAweEQ1LCAvKiAweDRDLTB4NEYgKi8KKwkweDhFLCAweEQ2LCAweEI3LCAweENDLCAweDhFLCAweEQ3LCAweEI3LCAweENELCAvKiAweDUwLTB4NTMgKi8KKwkweDhFLCAweEQ4LCAweDhFLCAweEQ5LCAweDhFLCAweERBLCAweDhFLCAweERCLCAvKiAweDU0LTB4NTcgKi8KKwkweDhFLCAweERDLCAweDhFLCAweERELCAweDhFLCAweERFLCAweDhFLCAweERGLCAvKiAweDU4LTB4NUIgKi8KKwkweEI3LCAweENFLCAweEI3LCAweENGLCAweDhFLCAweEUwLCAweDhFLCAweEUxLCAvKiAweDVDLTB4NUYgKi8KKwkweEI3LCAweEQwLCAweDhFLCAweEUyLCAweDhFLCAweEUzLCAweDhFLCAweEU0LCAvKiAweDYwLTB4NjMgKi8KKwkweEI3LCAweEQxLCAweDhFLCAweEU1LCAweDhFLCAweEU2LCAweDhFLCAweEU3LCAvKiAweDY0LTB4NjcgKi8KKwkweDhFLCAweEU4LCAweDhFLCAweEU5LCAweDhFLCAweEVBLCAweDhFLCAweEVCLCAvKiAweDY4LTB4NkIgKi8KKwkweEI3LCAweEQyLCAweEI3LCAweEQzLCAweDhFLCAweEVDLCAweEI3LCAweEQ0LCAvKiAweDZDLTB4NkYgKi8KKwkweDhFLCAweEVELCAweEI3LCAweEQ1LCAweDhFLCAweEVFLCAweDhFLCAweEVGLCAvKiAweDcwLTB4NzMgKi8KKwkweDhFLCAweEYwLCAweDhFLCAweEYxLCAweDhFLCAweEYyLCAweDhFLCAweEYzLCAvKiAweDc0LTB4NzcgKi8KKwkweEI3LCAweEQ2LCAweDhFLCAweEY0LCAweDhFLCAweEY1LCAweDhFLCAweEY2LCAvKiAweDc4LTB4N0IgKi8KKwkweEI3LCAweEQ3LCAweDhFLCAweEY3LCAweDhFLCAweEY4LCAweDhFLCAweEY5LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDhFLCAweEZBLCAweDhFLCAweEZCLCAweDhFLCAweEZDLCAweDhFLCAweEZELCAvKiAweDgwLTB4ODMgKi8KKwkweDhFLCAweEZFLCAweDhGLCAweDQxLCAweDhGLCAweDQyLCAweDhGLCAweDQzLCAvKiAweDg0LTB4ODcgKi8KKwkweDhGLCAweDQ0LCAweDhGLCAweDQ1LCAweDhGLCAweDQ2LCAweDhGLCAweDQ3LCAvKiAweDg4LTB4OEIgKi8KKwkweDhGLCAweDQ4LCAweEI3LCAweEQ4LCAweDhGLCAweDQ5LCAweDhGLCAweDRBLCAvKiAweDhDLTB4OEYgKi8KKwkweDhGLCAweDRCLCAweDhGLCAweDRDLCAweDhGLCAweDRELCAweDhGLCAweDRFLCAvKiAweDkwLTB4OTMgKi8KKwkweDhGLCAweDRGLCAweDhGLCAweDUwLCAweDhGLCAweDUxLCAweDhGLCAweDUyLCAvKiAweDk0LTB4OTcgKi8KKwkweDhGLCAweDUzLCAweDhGLCAweDU0LCAweDhGLCAweDU1LCAweDhGLCAweDU2LCAvKiAweDk4LTB4OUIgKi8KKwkweDhGLCAweDU3LCAweDhGLCAweDU4LCAweDhGLCAweDU5LCAweDhGLCAweDVBLCAvKiAweDlDLTB4OUYgKi8KKwkweDhGLCAweDYxLCAweDhGLCAweDYyLCAweDhGLCAweDYzLCAweDhGLCAweDY0LCAvKiAweEEwLTB4QTMgKi8KKwkweDhGLCAweDY1LCAweDhGLCAweDY2LCAweDhGLCAweDY3LCAweDhGLCAweDY4LCAvKiAweEE0LTB4QTcgKi8KKwkweEI3LCAweEQ5LCAweDhGLCAweDY5LCAweDhGLCAweDZBLCAweDhGLCAweDZCLCAvKiAweEE4LTB4QUIgKi8KKwkweDhGLCAweDZDLCAweDhGLCAweDZELCAweDhGLCAweDZFLCAweDhGLCAweDZGLCAvKiAweEFDLTB4QUYgKi8KKwkweEI3LCAweERBLCAweDhGLCAweDcwLCAweDhGLCAweDcxLCAweDhGLCAweDcyLCAvKiAweEIwLTB4QjMgKi8KKwkweEI3LCAweERCLCAweDhGLCAweDczLCAweDhGLCAweDc0LCAweDhGLCAweDc1LCAvKiAweEI0LTB4QjcgKi8KKwkweEI3LCAweERDLCAweDhGLCAweDc2LCAweDhGLCAweDc3LCAweDhGLCAweDc4LCAvKiAweEI4LTB4QkIgKi8KKwkweDhGLCAweDc5LCAweDhGLCAweDdBLCAweDhGLCAweDgxLCAweDhGLCAweDgyLCAvKiAweEJDLTB4QkYgKi8KKwkweEI3LCAweERELCAweEI3LCAweERFLCAweDhGLCAweDgzLCAweEI3LCAweERGLCAvKiAweEMwLTB4QzMgKi8KKwkweDhGLCAweDg0LCAweEI3LCAweEUwLCAweDhGLCAweDg1LCAweDhGLCAweDg2LCAvKiAweEM0LTB4QzcgKi8KKwkweDhGLCAweDg3LCAweDhGLCAweDg4LCAweDhGLCAweDg5LCAweDhGLCAweDhBLCAvKiAweEM4LTB4Q0IgKi8KKwkweEI3LCAweEUxLCAweDhGLCAweDhCLCAweDhGLCAweDhDLCAweDhGLCAweDhELCAvKiAweENDLTB4Q0YgKi8KKwkweEI3LCAweEUyLCAweDhGLCAweDhFLCAweDhGLCAweDhGLCAweDhGLCAweDkwLCAvKiAweEQwLTB4RDMgKi8KKwkweEI3LCAweEUzLCAweDhGLCAweDkxLCAweDhGLCAweDkyLCAweDhGLCAweDkzLCAvKiAweEQ0LTB4RDcgKi8KKwkweDhGLCAweDk0LCAweDhGLCAweDk1LCAweDhGLCAweDk2LCAweDhGLCAweDk3LCAvKiAweEQ4LTB4REIgKi8KKwkweDhGLCAweDk4LCAweEI3LCAweEU0LCAweDhGLCAweDk5LCAweEI3LCAweEU1LCAvKiAweERDLTB4REYgKi8KKwkweDhGLCAweDlBLCAweEI3LCAweEU2LCAweDhGLCAweDlCLCAweDhGLCAweDlDLCAvKiAweEUwLTB4RTMgKi8KKwkweDhGLCAweDlELCAweDhGLCAweDlFLCAweDhGLCAweDlGLCAweDhGLCAweEEwLCAvKiAweEU0LTB4RTcgKi8KKwkweEI3LCAweEU3LCAweEI3LCAweEU4LCAweDhGLCAweEExLCAweDhGLCAweEEyLCAvKiAweEU4LTB4RUIgKi8KKwkweEI3LCAweEU5LCAweDhGLCAweEEzLCAweDhGLCAweEE0LCAweDhGLCAweEE1LCAvKiAweEVDLTB4RUYgKi8KKwkweEI3LCAweEVBLCAweDhGLCAweEE2LCAweDhGLCAweEE3LCAweDhGLCAweEE4LCAvKiAweEYwLTB4RjMgKi8KKwkweDhGLCAweEE5LCAweDhGLCAweEFBLCAweDhGLCAweEFCLCAweDhGLCAweEFDLCAvKiAweEY0LTB4RjcgKi8KKwkweEI3LCAweEVCLCAweEI3LCAweEVDLCAweDhGLCAweEFELCAweEI3LCAweEVELCAvKiAweEY4LTB4RkIgKi8KKwkweDhGLCAweEFFLCAweEI3LCAweEVFLCAweDhGLCAweEFGLCAweDhGLCAweEIwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19COVs1MTJdID0geworCTB4OEYsIDB4QjEsIDB4OEYsIDB4QjIsIDB4OEYsIDB4QjMsIDB4OEYsIDB4QjQsIC8qIDB4MDAtMHgwMyAqLworCTB4QjcsIDB4RUYsIDB4OEYsIDB4QjUsIDB4OEYsIDB4QjYsIDB4OEYsIDB4QjcsIC8qIDB4MDQtMHgwNyAqLworCTB4OEYsIDB4QjgsIDB4OEYsIDB4QjksIDB4OEYsIDB4QkEsIDB4OEYsIDB4QkIsIC8qIDB4MDgtMHgwQiAqLworCTB4OEYsIDB4QkMsIDB4OEYsIDB4QkQsIDB4OEYsIDB4QkUsIDB4OEYsIDB4QkYsIC8qIDB4MEMtMHgwRiAqLworCTB4OEYsIDB4QzAsIDB4OEYsIDB4QzEsIDB4OEYsIDB4QzIsIDB4OEYsIDB4QzMsIC8qIDB4MTAtMHgxMyAqLworCTB4OEYsIDB4QzQsIDB4OEYsIDB4QzUsIDB4OEYsIDB4QzYsIDB4OEYsIDB4QzcsIC8qIDB4MTQtMHgxNyAqLworCTB4QjcsIDB4RjAsIDB4OEYsIDB4QzgsIDB4OEYsIDB4QzksIDB4OEYsIDB4Q0EsIC8qIDB4MTgtMHgxQiAqLworCTB4OEYsIDB4Q0IsIDB4OEYsIDB4Q0MsIDB4OEYsIDB4Q0QsIDB4OEYsIDB4Q0UsIC8qIDB4MUMtMHgxRiAqLworCTB4QjcsIDB4RjEsIDB4OEYsIDB4Q0YsIDB4OEYsIDB4RDAsIDB4OEYsIDB4RDEsIC8qIDB4MjAtMHgyMyAqLworCTB4OEYsIDB4RDIsIDB4OEYsIDB4RDMsIDB4OEYsIDB4RDQsIDB4OEYsIDB4RDUsIC8qIDB4MjQtMHgyNyAqLworCTB4OEYsIDB4RDYsIDB4OEYsIDB4RDcsIDB4OEYsIDB4RDgsIDB4OEYsIDB4RDksIC8qIDB4MjgtMHgyQiAqLworCTB4OEYsIDB4REEsIDB4OEYsIDB4REIsIDB4OEYsIDB4REMsIDB4OEYsIDB4REQsIC8qIDB4MkMtMHgyRiAqLworCTB4OEYsIDB4REUsIDB4OEYsIDB4REYsIDB4OEYsIDB4RTAsIDB4OEYsIDB4RTEsIC8qIDB4MzAtMHgzMyAqLworCTB4OEYsIDB4RTIsIDB4OEYsIDB4RTMsIDB4OEYsIDB4RTQsIDB4OEYsIDB4RTUsIC8qIDB4MzQtMHgzNyAqLworCTB4OEYsIDB4RTYsIDB4OEYsIDB4RTcsIDB4OEYsIDB4RTgsIDB4OEYsIDB4RTksIC8qIDB4MzgtMHgzQiAqLworCTB4QjcsIDB4RjIsIDB4QjcsIDB4RjMsIDB4OEYsIDB4RUEsIDB4OEYsIDB4RUIsIC8qIDB4M0MtMHgzRiAqLworCTB4QjcsIDB4RjQsIDB4OEYsIDB4RUMsIDB4OEYsIDB4RUQsIDB4OEYsIDB4RUUsIC8qIDB4NDAtMHg0MyAqLworCTB4QjcsIDB4RjUsIDB4OEYsIDB4RUYsIDB4OEYsIDB4RjAsIDB4OEYsIDB4RjEsIC8qIDB4NDQtMHg0NyAqLworCTB4OEYsIDB4RjIsIDB4OEYsIDB4RjMsIDB4OEYsIDB4RjQsIDB4OEYsIDB4RjUsIC8qIDB4NDgtMHg0QiAqLworCTB4QjcsIDB4RjYsIDB4OEYsIDB4RjYsIDB4OEYsIDB4RjcsIDB4QjcsIDB4RjcsIC8qIDB4NEMtMHg0RiAqLworCTB4OEYsIDB4RjgsIDB4QjcsIDB4RjgsIDB4OEYsIDB4RjksIDB4OEYsIDB4RkEsIC8qIDB4NTAtMHg1MyAqLworCTB4OEYsIDB4RkIsIDB4OEYsIDB4RkMsIDB4OEYsIDB4RkQsIDB4OEYsIDB4RkUsIC8qIDB4NTQtMHg1NyAqLworCTB4QjcsIDB4RjksIDB4QjcsIDB4RkEsIDB4OTAsIDB4NDEsIDB4OTAsIDB4NDIsIC8qIDB4NTgtMHg1QiAqLworCTB4QjcsIDB4RkIsIDB4OTAsIDB4NDMsIDB4OTAsIDB4NDQsIDB4OTAsIDB4NDUsIC8qIDB4NUMtMHg1RiAqLworCTB4QjcsIDB4RkMsIDB4OTAsIDB4NDYsIDB4OTAsIDB4NDcsIDB4OTAsIDB4NDgsIC8qIDB4NjAtMHg2MyAqLworCTB4OTAsIDB4NDksIDB4OTAsIDB4NEEsIDB4OTAsIDB4NEIsIDB4OTAsIDB4NEMsIC8qIDB4NjQtMHg2NyAqLworCTB4QjcsIDB4RkQsIDB4QjcsIDB4RkUsIDB4OTAsIDB4NEQsIDB4QjgsIDB4QTEsIC8qIDB4NjgtMHg2QiAqLworCTB4OTAsIDB4NEUsIDB4QjgsIDB4QTIsIDB4OTAsIDB4NEYsIDB4OTAsIDB4NTAsIC8qIDB4NkMtMHg2RiAqLworCTB4OTAsIDB4NTEsIDB4OTAsIDB4NTIsIDB4OTAsIDB4NTMsIDB4OTAsIDB4NTQsIC8qIDB4NzAtMHg3MyAqLworCTB4QjgsIDB4QTMsIDB4QjgsIDB4QTQsIDB4OTAsIDB4NTUsIDB4OTAsIDB4NTYsIC8qIDB4NzQtMHg3NyAqLworCTB4QjgsIDB4QTUsIDB4OTAsIDB4NTcsIDB4OTAsIDB4NTgsIDB4OTAsIDB4NTksIC8qIDB4NzgtMHg3QiAqLworCTB4QjgsIDB4QTYsIDB4OTAsIDB4NUEsIDB4OTAsIDB4NjEsIDB4OTAsIDB4NjIsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4OTAsIDB4NjMsIDB4OTAsIDB4NjQsIDB4OTAsIDB4NjUsIDB4OTAsIDB4NjYsIC8qIDB4ODAtMHg4MyAqLworCTB4QjgsIDB4QTcsIDB4QjgsIDB4QTgsIDB4OTAsIDB4NjcsIDB4QjgsIDB4QTksIC8qIDB4ODQtMHg4NyAqLworCTB4OTAsIDB4NjgsIDB4QjgsIDB4QUEsIDB4QjgsIDB4QUIsIDB4OTAsIDB4NjksIC8qIDB4ODgtMHg4QiAqLworCTB4OTAsIDB4NkEsIDB4QjgsIDB4QUMsIDB4QjgsIDB4QUQsIDB4OTAsIDB4NkIsIC8qIDB4OEMtMHg4RiAqLworCTB4OTAsIDB4NkMsIDB4OTAsIDB4NkQsIDB4OTAsIDB4NkUsIDB4OTAsIDB4NkYsIC8qIDB4OTAtMHg5MyAqLworCTB4OTAsIDB4NzAsIDB4OTAsIDB4NzEsIDB4OTAsIDB4NzIsIDB4OTAsIDB4NzMsIC8qIDB4OTQtMHg5NyAqLworCTB4OTAsIDB4NzQsIDB4OTAsIDB4NzUsIDB4OTAsIDB4NzYsIDB4OTAsIDB4NzcsIC8qIDB4OTgtMHg5QiAqLworCTB4OTAsIDB4NzgsIDB4OTAsIDB4NzksIDB4OTAsIDB4N0EsIDB4OTAsIDB4ODEsIC8qIDB4OUMtMHg5RiAqLworCTB4OTAsIDB4ODIsIDB4OTAsIDB4ODMsIDB4OTAsIDB4ODQsIDB4OTAsIDB4ODUsIC8qIDB4QTAtMHhBMyAqLworCTB4OTAsIDB4ODYsIDB4OTAsIDB4ODcsIDB4OTAsIDB4ODgsIDB4OTAsIDB4ODksIC8qIDB4QTQtMHhBNyAqLworCTB4OTAsIDB4OEEsIDB4OTAsIDB4OEIsIDB4OTAsIDB4OEMsIDB4OTAsIDB4OEQsIC8qIDB4QTgtMHhBQiAqLworCTB4QjgsIDB4QUUsIDB4QjgsIDB4QUYsIDB4OTAsIDB4OEUsIDB4OTAsIDB4OEYsIC8qIDB4QUMtMHhBRiAqLworCTB4QjgsIDB4QjAsIDB4OTAsIDB4OTAsIDB4OTAsIDB4OTEsIDB4OTAsIDB4OTIsIC8qIDB4QjAtMHhCMyAqLworCTB4QjgsIDB4QjEsIDB4OTAsIDB4OTMsIDB4OTAsIDB4OTQsIDB4OTAsIDB4OTUsIC8qIDB4QjQtMHhCNyAqLworCTB4OTAsIDB4OTYsIDB4OTAsIDB4OTcsIDB4OTAsIDB4OTgsIDB4OTAsIDB4OTksIC8qIDB4QjgtMHhCQiAqLworCTB4QjgsIDB4QjIsIDB4QjgsIDB4QjMsIDB4OTAsIDB4OUEsIDB4QjgsIDB4QjQsIC8qIDB4QkMtMHhCRiAqLworCTB4OTAsIDB4OUIsIDB4QjgsIDB4QjUsIDB4OTAsIDB4OUMsIDB4OTAsIDB4OUQsIC8qIDB4QzAtMHhDMyAqLworCTB4OTAsIDB4OUUsIDB4OTAsIDB4OUYsIDB4OTAsIDB4QTAsIDB4OTAsIDB4QTEsIC8qIDB4QzQtMHhDNyAqLworCTB4QjgsIDB4QjYsIDB4QjgsIDB4QjcsIDB4OTAsIDB4QTIsIDB4OTAsIDB4QTMsIC8qIDB4QzgtMHhDQiAqLworCTB4QjgsIDB4QjgsIDB4OTAsIDB4QTQsIDB4QjgsIDB4QjksIDB4QjgsIDB4QkEsIC8qIDB4Q0MtMHhDRiAqLworCTB4QjgsIDB4QkIsIDB4QjgsIDB4QkMsIDB4QjgsIDB4QkQsIDB4OTAsIDB4QTUsIC8qIDB4RDAtMHhEMyAqLworCTB4OTAsIDB4QTYsIDB4OTAsIDB4QTcsIDB4OTAsIDB4QTgsIDB4OTAsIDB4QTksIC8qIDB4RDQtMHhENyAqLworCTB4QjgsIDB4QkUsIDB4QjgsIDB4QkYsIDB4OTAsIDB4QUEsIDB4QjgsIDB4QzAsIC8qIDB4RDgtMHhEQiAqLworCTB4OTAsIDB4QUIsIDB4QjgsIDB4QzEsIDB4QjgsIDB4QzIsIDB4OTAsIDB4QUMsIC8qIDB4REMtMHhERiAqLworCTB4OTAsIDB4QUQsIDB4QjgsIDB4QzMsIDB4OTAsIDB4QUUsIDB4QjgsIDB4QzQsIC8qIDB4RTAtMHhFMyAqLworCTB4QjgsIDB4QzUsIDB4QjgsIDB4QzYsIDB4OTAsIDB4QUYsIDB4OTAsIDB4QjAsIC8qIDB4RTQtMHhFNyAqLworCTB4QjgsIDB4QzcsIDB4OTAsIDB4QjEsIDB4OTAsIDB4QjIsIDB4OTAsIDB4QjMsIC8qIDB4RTgtMHhFQiAqLworCTB4QjgsIDB4QzgsIDB4OTAsIDB4QjQsIDB4OTAsIDB4QjUsIDB4OTAsIDB4QjYsIC8qIDB4RUMtMHhFRiAqLworCTB4OTAsIDB4QjcsIDB4OTAsIDB4QjgsIDB4OTAsIDB4QjksIDB4OTAsIDB4QkEsIC8qIDB4RjAtMHhGMyAqLworCTB4QjgsIDB4QzksIDB4QjgsIDB4Q0EsIDB4OTAsIDB4QkIsIDB4QjgsIDB4Q0IsIC8qIDB4RjQtMHhGNyAqLworCTB4QjgsIDB4Q0MsIDB4QjgsIDB4Q0QsIDB4QjgsIDB4Q0UsIDB4OTAsIDB4QkMsIC8qIDB4RjgtMHhGQiAqLworCTB4OTAsIDB4QkQsIDB4OTAsIDB4QkUsIDB4OTAsIDB4QkYsIDB4OTAsIDB4QzAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0JBWzUxMl0gPSB7CisJMHhCOCwgMHhDRiwgMHhCOCwgMHhEMCwgMHg5MCwgMHhDMSwgMHg5MCwgMHhDMiwgLyogMHgwMC0weDAzICovCisJMHg5MCwgMHhDMywgMHg5MCwgMHhDNCwgMHg5MCwgMHhDNSwgMHg5MCwgMHhDNiwgLyogMHgwNC0weDA3ICovCisJMHhCOCwgMHhEMSwgMHg5MCwgMHhDNywgMHg5MCwgMHhDOCwgMHg5MCwgMHhDOSwgLyogMHgwOC0weDBCICovCisJMHg5MCwgMHhDQSwgMHg5MCwgMHhDQiwgMHg5MCwgMHhDQywgMHg5MCwgMHhDRCwgLyogMHgwQy0weDBGICovCisJMHg5MCwgMHhDRSwgMHg5MCwgMHhDRiwgMHg5MCwgMHhEMCwgMHg5MCwgMHhEMSwgLyogMHgxMC0weDEzICovCisJMHg5MCwgMHhEMiwgMHhCOCwgMHhEMiwgMHg5MCwgMHhEMywgMHg5MCwgMHhENCwgLyogMHgxNC0weDE3ICovCisJMHg5MCwgMHhENSwgMHg5MCwgMHhENiwgMHg5MCwgMHhENywgMHg5MCwgMHhEOCwgLyogMHgxOC0weDFCICovCisJMHg5MCwgMHhEOSwgMHg5MCwgMHhEQSwgMHg5MCwgMHhEQiwgMHg5MCwgMHhEQywgLyogMHgxQy0weDFGICovCisJMHg5MCwgMHhERCwgMHg5MCwgMHhERSwgMHg5MCwgMHhERiwgMHg5MCwgMHhFMCwgLyogMHgyMC0weDIzICovCisJMHg5MCwgMHhFMSwgMHg5MCwgMHhFMiwgMHg5MCwgMHhFMywgMHg5MCwgMHhFNCwgLyogMHgyNC0weDI3ICovCisJMHg5MCwgMHhFNSwgMHg5MCwgMHhFNiwgMHg5MCwgMHhFNywgMHg5MCwgMHhFOCwgLyogMHgyOC0weDJCICovCisJMHg5MCwgMHhFOSwgMHg5MCwgMHhFQSwgMHg5MCwgMHhFQiwgMHg5MCwgMHhFQywgLyogMHgyQy0weDJGICovCisJMHg5MCwgMHhFRCwgMHg5MCwgMHhFRSwgMHg5MCwgMHhFRiwgMHg5MCwgMHhGMCwgLyogMHgzMC0weDMzICovCisJMHg5MCwgMHhGMSwgMHg5MCwgMHhGMiwgMHg5MCwgMHhGMywgMHg5MCwgMHhGNCwgLyogMHgzNC0weDM3ICovCisJMHhCOCwgMHhEMywgMHhCOCwgMHhENCwgMHg5MCwgMHhGNSwgMHg5MCwgMHhGNiwgLyogMHgzOC0weDNCICovCisJMHhCOCwgMHhENSwgMHg5MCwgMHhGNywgMHg5MCwgMHhGOCwgMHg5MCwgMHhGOSwgLyogMHgzQy0weDNGICovCisJMHhCOCwgMHhENiwgMHg5MCwgMHhGQSwgMHhCOCwgMHhENywgMHg5MCwgMHhGQiwgLyogMHg0MC0weDQzICovCisJMHg5MCwgMHhGQywgMHg5MCwgMHhGRCwgMHg5MCwgMHhGRSwgMHg5MSwgMHg0MSwgLyogMHg0NC0weDQ3ICovCisJMHhCOCwgMHhEOCwgMHhCOCwgMHhEOSwgMHg5MSwgMHg0MiwgMHhCOCwgMHhEQSwgLyogMHg0OC0weDRCICovCisJMHg5MSwgMHg0MywgMHhCOCwgMHhEQiwgMHhCOCwgMHhEQywgMHg5MSwgMHg0NCwgLyogMHg0Qy0weDRGICovCisJMHg5MSwgMHg0NSwgMHg5MSwgMHg0NiwgMHg5MSwgMHg0NywgMHhCOCwgMHhERCwgLyogMHg1MC0weDUzICovCisJMHhCOCwgMHhERSwgMHhCOCwgMHhERiwgMHg5MSwgMHg0OCwgMHg5MSwgMHg0OSwgLyogMHg1NC0weDU3ICovCisJMHhCOCwgMHhFMCwgMHg5MSwgMHg0QSwgMHg5MSwgMHg0QiwgMHg5MSwgMHg0QywgLyogMHg1OC0weDVCICovCisJMHhCOCwgMHhFMSwgMHg5MSwgMHg0RCwgMHg5MSwgMHg0RSwgMHg5MSwgMHg0RiwgLyogMHg1Qy0weDVGICovCisJMHg5MSwgMHg1MCwgMHg5MSwgMHg1MSwgMHg5MSwgMHg1MiwgMHg5MSwgMHg1MywgLyogMHg2MC0weDYzICovCisJMHhCOCwgMHhFMiwgMHhCOCwgMHhFMywgMHg5MSwgMHg1NCwgMHhCOCwgMHhFNCwgLyogMHg2NC0weDY3ICovCisJMHhCOCwgMHhFNSwgMHhCOCwgMHhFNiwgMHg5MSwgMHg1NSwgMHg5MSwgMHg1NiwgLyogMHg2OC0weDZCICovCisJMHg5MSwgMHg1NywgMHg5MSwgMHg1OCwgMHg5MSwgMHg1OSwgMHg5MSwgMHg1QSwgLyogMHg2Qy0weDZGICovCisJMHhCOCwgMHhFNywgMHhCOCwgMHhFOCwgMHg5MSwgMHg2MSwgMHg5MSwgMHg2MiwgLyogMHg3MC0weDczICovCisJMHhCOCwgMHhFOSwgMHg5MSwgMHg2MywgMHg5MSwgMHg2NCwgMHg5MSwgMHg2NSwgLyogMHg3NC0weDc3ICovCisJMHhCOCwgMHhFQSwgMHg5MSwgMHg2NiwgMHg5MSwgMHg2NywgMHg5MSwgMHg2OCwgLyogMHg3OC0weDdCICovCisJMHg5MSwgMHg2OSwgMHg5MSwgMHg2QSwgMHg5MSwgMHg2QiwgMHg5MSwgMHg2QywgLyogMHg3Qy0weDdGICovCisJCisJMHg5MSwgMHg2RCwgMHg5MSwgMHg2RSwgMHg5MSwgMHg2RiwgMHhCOCwgMHhFQiwgLyogMHg4MC0weDgzICovCisJMHhCOCwgMHhFQywgMHhCOCwgMHhFRCwgMHg5MSwgMHg3MCwgMHhCOCwgMHhFRSwgLyogMHg4NC0weDg3ICovCisJMHg5MSwgMHg3MSwgMHg5MSwgMHg3MiwgMHg5MSwgMHg3MywgMHg5MSwgMHg3NCwgLyogMHg4OC0weDhCICovCisJMHhCOCwgMHhFRiwgMHg5MSwgMHg3NSwgMHg5MSwgMHg3NiwgMHg5MSwgMHg3NywgLyogMHg4Qy0weDhGICovCisJMHg5MSwgMHg3OCwgMHg5MSwgMHg3OSwgMHg5MSwgMHg3QSwgMHg5MSwgMHg4MSwgLyogMHg5MC0weDkzICovCisJMHg5MSwgMHg4MiwgMHg5MSwgMHg4MywgMHg5MSwgMHg4NCwgMHg5MSwgMHg4NSwgLyogMHg5NC0weDk3ICovCisJMHg5MSwgMHg4NiwgMHg5MSwgMHg4NywgMHg5MSwgMHg4OCwgMHg5MSwgMHg4OSwgLyogMHg5OC0weDlCICovCisJMHg5MSwgMHg4QSwgMHg5MSwgMHg4QiwgMHg5MSwgMHg4QywgMHg5MSwgMHg4RCwgLyogMHg5Qy0weDlGICovCisJMHg5MSwgMHg4RSwgMHg5MSwgMHg4RiwgMHg5MSwgMHg5MCwgMHg5MSwgMHg5MSwgLyogMHhBMC0weEEzICovCisJMHg5MSwgMHg5MiwgMHg5MSwgMHg5MywgMHg5MSwgMHg5NCwgMHg5MSwgMHg5NSwgLyogMHhBNC0weEE3ICovCisJMHhCOCwgMHhGMCwgMHhCOCwgMHhGMSwgMHg5MSwgMHg5NiwgMHhCOCwgMHhGMiwgLyogMHhBOC0weEFCICovCisJMHhCOCwgMHhGMywgMHg5MSwgMHg5NywgMHg5MSwgMHg5OCwgMHg5MSwgMHg5OSwgLyogMHhBQy0weEFGICovCisJMHhCOCwgMHhGNCwgMHg5MSwgMHg5QSwgMHhCOCwgMHhGNSwgMHg5MSwgMHg5QiwgLyogMHhCMC0weEIzICovCisJMHg5MSwgMHg5QywgMHg5MSwgMHg5RCwgMHg5MSwgMHg5RSwgMHg5MSwgMHg5RiwgLyogMHhCNC0weEI3ICovCisJMHhCOCwgMHhGNiwgMHhCOCwgMHhGNywgMHg5MSwgMHhBMCwgMHhCOCwgMHhGOCwgLyogMHhCOC0weEJCICovCisJMHg5MSwgMHhBMSwgMHhCOCwgMHhGOSwgMHg5MSwgMHhBMiwgMHg5MSwgMHhBMywgLyogMHhCQy0weEJGICovCisJMHg5MSwgMHhBNCwgMHg5MSwgMHhBNSwgMHg5MSwgMHhBNiwgMHg5MSwgMHhBNywgLyogMHhDMC0weEMzICovCisJMHhCOCwgMHhGQSwgMHg5MSwgMHhBOCwgMHg5MSwgMHhBOSwgMHg5MSwgMHhBQSwgLyogMHhDNC0weEM3ICovCisJMHhCOCwgMHhGQiwgMHg5MSwgMHhBQiwgMHg5MSwgMHhBQywgMHg5MSwgMHhBRCwgLyogMHhDOC0weENCICovCisJMHg5MSwgMHhBRSwgMHg5MSwgMHhBRiwgMHg5MSwgMHhCMCwgMHg5MSwgMHhCMSwgLyogMHhDQy0weENGICovCisJMHg5MSwgMHhCMiwgMHg5MSwgMHhCMywgMHg5MSwgMHhCNCwgMHg5MSwgMHhCNSwgLyogMHhEMC0weEQzICovCisJMHg5MSwgMHhCNiwgMHg5MSwgMHhCNywgMHg5MSwgMHhCOCwgMHg5MSwgMHhCOSwgLyogMHhENC0weEQ3ICovCisJMHhCOCwgMHhGQywgMHhCOCwgMHhGRCwgMHg5MSwgMHhCQSwgMHg5MSwgMHhCQiwgLyogMHhEOC0weERCICovCisJMHg5MSwgMHhCQywgMHg5MSwgMHhCRCwgMHg5MSwgMHhCRSwgMHg5MSwgMHhCRiwgLyogMHhEQy0weERGICovCisJMHg5MSwgMHhDMCwgMHg5MSwgMHhDMSwgMHg5MSwgMHhDMiwgMHg5MSwgMHhDMywgLyogMHhFMC0weEUzICovCisJMHg5MSwgMHhDNCwgMHg5MSwgMHhDNSwgMHg5MSwgMHhDNiwgMHg5MSwgMHhDNywgLyogMHhFNC0weEU3ICovCisJMHg5MSwgMHhDOCwgMHg5MSwgMHhDOSwgMHg5MSwgMHhDQSwgMHg5MSwgMHhDQiwgLyogMHhFOC0weEVCICovCisJMHg5MSwgMHhDQywgMHg5MSwgMHhDRCwgMHg5MSwgMHhDRSwgMHg5MSwgMHhDRiwgLyogMHhFQy0weEVGICovCisJMHg5MSwgMHhEMCwgMHg5MSwgMHhEMSwgMHg5MSwgMHhEMiwgMHg5MSwgMHhEMywgLyogMHhGMC0weEYzICovCisJMHg5MSwgMHhENCwgMHg5MSwgMHhENSwgMHg5MSwgMHhENiwgMHg5MSwgMHhENywgLyogMHhGNC0weEY3ICovCisJMHg5MSwgMHhEOCwgMHg5MSwgMHhEOSwgMHg5MSwgMHhEQSwgMHg5MSwgMHhEQiwgLyogMHhGOC0weEZCICovCisJMHhCOCwgMHhGRSwgMHg5MSwgMHhEQywgMHg5MSwgMHhERCwgMHg5MSwgMHhERSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfQkJbNTEyXSA9IHsKKwkweEI5LCAweEExLCAweDkxLCAweERGLCAweDkxLCAweEUwLCAweDkxLCAweEUxLCAvKiAweDAwLTB4MDMgKi8KKwkweEI5LCAweEEyLCAweDkxLCAweEUyLCAweDkxLCAweEUzLCAweDkxLCAweEU0LCAvKiAweDA0LTB4MDcgKi8KKwkweDkxLCAweEU1LCAweDkxLCAweEU2LCAweDkxLCAweEU3LCAweDkxLCAweEU4LCAvKiAweDA4LTB4MEIgKi8KKwkweDkxLCAweEU5LCAweEI5LCAweEEzLCAweDkxLCAweEVBLCAweEI5LCAweEE0LCAvKiAweDBDLTB4MEYgKi8KKwkweDkxLCAweEVCLCAweEI5LCAweEE1LCAweDkxLCAweEVDLCAweDkxLCAweEVELCAvKiAweDEwLTB4MTMgKi8KKwkweDkxLCAweEVFLCAweDkxLCAweEVGLCAweDkxLCAweEYwLCAweDkxLCAweEYxLCAvKiAweDE0LTB4MTcgKi8KKwkweEI5LCAweEE2LCAweDkxLCAweEYyLCAweDkxLCAweEYzLCAweDkxLCAweEY0LCAvKiAweDE4LTB4MUIgKi8KKwkweEI5LCAweEE3LCAweDkxLCAweEY1LCAweDkxLCAweEY2LCAweDkxLCAweEY3LCAvKiAweDFDLTB4MUYgKi8KKwkweEI5LCAweEE4LCAweDkxLCAweEY4LCAweDkxLCAweEY5LCAweDkxLCAweEZBLCAvKiAweDIwLTB4MjMgKi8KKwkweDkxLCAweEZCLCAweDkxLCAweEZDLCAweDkxLCAweEZELCAweDkxLCAweEZFLCAvKiAweDI0LTB4MjcgKi8KKwkweDkyLCAweDQxLCAweEI5LCAweEE5LCAweDkyLCAweDQyLCAweEI5LCAweEFBLCAvKiAweDI4LTB4MkIgKi8KKwkweDkyLCAweDQzLCAweDkyLCAweDQ0LCAweDkyLCAweDQ1LCAweDkyLCAweDQ2LCAvKiAweDJDLTB4MkYgKi8KKwkweDkyLCAweDQ3LCAweDkyLCAweDQ4LCAweDkyLCAweDQ5LCAweDkyLCAweDRBLCAvKiAweDMwLTB4MzMgKi8KKwkweEI5LCAweEFCLCAweEI5LCAweEFDLCAweEI5LCAweEFELCAweDkyLCAweDRCLCAvKiAweDM0LTB4MzcgKi8KKwkweEI5LCAweEFFLCAweDkyLCAweDRDLCAweDkyLCAweDRELCAweEI5LCAweEFGLCAvKiAweDM4LTB4M0IgKi8KKwkweEI5LCAweEIwLCAweEI5LCAweEIxLCAweEI5LCAweEIyLCAweDkyLCAweDRFLCAvKiAweDNDLTB4M0YgKi8KKwkweDkyLCAweDRGLCAweDkyLCAweDUwLCAweDkyLCAweDUxLCAweDkyLCAweDUyLCAvKiAweDQwLTB4NDMgKi8KKwkweEI5LCAweEIzLCAweEI5LCAweEI0LCAweDkyLCAweDUzLCAweEI5LCAweEI1LCAvKiAweDQ0LTB4NDcgKi8KKwkweDkyLCAweDU0LCAweEI5LCAweEI2LCAweDkyLCAweDU1LCAweDkyLCAweDU2LCAvKiAweDQ4LTB4NEIgKi8KKwkweDkyLCAweDU3LCAweEI5LCAweEI3LCAweDkyLCAweDU4LCAweEI5LCAweEI4LCAvKiAweDRDLTB4NEYgKi8KKwkweEI5LCAweEI5LCAweDkyLCAweDU5LCAweDkyLCAweDVBLCAweDkyLCAweDYxLCAvKiAweDUwLTB4NTMgKi8KKwkweEI5LCAweEJBLCAweDkyLCAweDYyLCAweDkyLCAweDYzLCAweDkyLCAweDY0LCAvKiAweDU0LTB4NTcgKi8KKwkweEI5LCAweEJCLCAweDkyLCAweDY1LCAweDkyLCAweDY2LCAweDkyLCAweDY3LCAvKiAweDU4LTB4NUIgKi8KKwkweDkyLCAweDY4LCAweDkyLCAweDY5LCAweDkyLCAweDZBLCAweDkyLCAweDZCLCAvKiAweDVDLTB4NUYgKi8KKwkweDkyLCAweDZDLCAweEI5LCAweEJDLCAweDkyLCAweDZELCAweEI5LCAweEJELCAvKiAweDYwLTB4NjMgKi8KKwkweDkyLCAweDZFLCAweDkyLCAweDZGLCAweDkyLCAweDcwLCAweDkyLCAweDcxLCAvKiAweDY0LTB4NjcgKi8KKwkweDkyLCAweDcyLCAweDkyLCAweDczLCAweDkyLCAweDc0LCAweDkyLCAweDc1LCAvKiAweDY4LTB4NkIgKi8KKwkweEI5LCAweEJFLCAweDkyLCAweDc2LCAweDkyLCAweDc3LCAweDkyLCAweDc4LCAvKiAweDZDLTB4NkYgKi8KKwkweDkyLCAweDc5LCAweDkyLCAweDdBLCAweDkyLCAweDgxLCAweDkyLCAweDgyLCAvKiAweDcwLTB4NzMgKi8KKwkweDkyLCAweDgzLCAweDkyLCAweDg0LCAweDkyLCAweDg1LCAweDkyLCAweDg2LCAvKiAweDc0LTB4NzcgKi8KKwkweDkyLCAweDg3LCAweDkyLCAweDg4LCAweDkyLCAweDg5LCAweDkyLCAweDhBLCAvKiAweDc4LTB4N0IgKi8KKwkweDkyLCAweDhCLCAweDkyLCAweDhDLCAweDkyLCAweDhELCAweDkyLCAweDhFLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDkyLCAweDhGLCAweDkyLCAweDkwLCAweDkyLCAweDkxLCAweDkyLCAweDkyLCAvKiAweDgwLTB4ODMgKi8KKwkweDkyLCAweDkzLCAweDkyLCAweDk0LCAweDkyLCAweDk1LCAweDkyLCAweDk2LCAvKiAweDg0LTB4ODcgKi8KKwkweEI5LCAweEJGLCAweDkyLCAweDk3LCAweDkyLCAweDk4LCAweDkyLCAweDk5LCAvKiAweDg4LTB4OEIgKi8KKwkweEI5LCAweEMwLCAweDkyLCAweDlBLCAweDkyLCAweDlCLCAweDkyLCAweDlDLCAvKiAweDhDLTB4OEYgKi8KKwkweEI5LCAweEMxLCAweDkyLCAweDlELCAweDkyLCAweDlFLCAweDkyLCAweDlGLCAvKiAweDkwLTB4OTMgKi8KKwkweDkyLCAweEEwLCAweDkyLCAweEExLCAweDkyLCAweEEyLCAweDkyLCAweEEzLCAvKiAweDk0LTB4OTcgKi8KKwkweDkyLCAweEE0LCAweDkyLCAweEE1LCAweDkyLCAweEE2LCAweDkyLCAweEE3LCAvKiAweDk4LTB4OUIgKi8KKwkweDkyLCAweEE4LCAweDkyLCAweEE5LCAweDkyLCAweEFBLCAweDkyLCAweEFCLCAvKiAweDlDLTB4OUYgKi8KKwkweDkyLCAweEFDLCAweDkyLCAweEFELCAweDkyLCAweEFFLCAweDkyLCAweEFGLCAvKiAweEEwLTB4QTMgKi8KKwkweEI5LCAweEMyLCAweDkyLCAweEIwLCAweDkyLCAweEIxLCAweDkyLCAweEIyLCAvKiAweEE0LTB4QTcgKi8KKwkweEI5LCAweEMzLCAweDkyLCAweEIzLCAweDkyLCAweEI0LCAweDkyLCAweEI1LCAvKiAweEE4LTB4QUIgKi8KKwkweEI5LCAweEM0LCAweDkyLCAweEI2LCAweDkyLCAweEI3LCAweDkyLCAweEI4LCAvKiAweEFDLTB4QUYgKi8KKwkweDkyLCAweEI5LCAweDkyLCAweEJBLCAweDkyLCAweEJCLCAweDkyLCAweEJDLCAvKiAweEIwLTB4QjMgKi8KKwkweEI5LCAweEM1LCAweDkyLCAweEJELCAweDkyLCAweEJFLCAweEI5LCAweEM2LCAvKiAweEI0LTB4QjcgKi8KKwkweDkyLCAweEJGLCAweDkyLCAweEMwLCAweDkyLCAweEMxLCAweDkyLCAweEMyLCAvKiAweEI4LTB4QkIgKi8KKwkweDkyLCAweEMzLCAweDkyLCAweEM0LCAweDkyLCAweEM1LCAweDkyLCAweEM2LCAvKiAweEJDLTB4QkYgKi8KKwkweEI5LCAweEM3LCAweDkyLCAweEM3LCAweDkyLCAweEM4LCAweDkyLCAweEM5LCAvKiAweEMwLTB4QzMgKi8KKwkweEI5LCAweEM4LCAweDkyLCAweENBLCAweDkyLCAweENCLCAweDkyLCAweENDLCAvKiAweEM0LTB4QzcgKi8KKwkweEI5LCAweEM5LCAweDkyLCAweENELCAweDkyLCAweENFLCAweDkyLCAweENGLCAvKiAweEM4LTB4Q0IgKi8KKwkweDkyLCAweEQwLCAweDkyLCAweEQxLCAweDkyLCAweEQyLCAweDkyLCAweEQzLCAvKiAweENDLTB4Q0YgKi8KKwkweEI5LCAweENBLCAweDkyLCAweEQ0LCAweDkyLCAweEQ1LCAweEI5LCAweENCLCAvKiAweEQwLTB4RDMgKi8KKwkweDkyLCAweEQ2LCAweDkyLCAweEQ3LCAweDkyLCAweEQ4LCAweDkyLCAweEQ5LCAvKiAweEQ0LTB4RDcgKi8KKwkweDkyLCAweERBLCAweDkyLCAweERCLCAweDkyLCAweERDLCAweDkyLCAweERELCAvKiAweEQ4LTB4REIgKi8KKwkweDkyLCAweERFLCAweDkyLCAweERGLCAweDkyLCAweEUwLCAweDkyLCAweEUxLCAvKiAweERDLTB4REYgKi8KKwkweDkyLCAweEUyLCAweDkyLCAweEUzLCAweDkyLCAweEU0LCAweDkyLCAweEU1LCAvKiAweEUwLTB4RTMgKi8KKwkweDkyLCAweEU2LCAweDkyLCAweEU3LCAweDkyLCAweEU4LCAweDkyLCAweEU5LCAvKiAweEU0LTB4RTcgKi8KKwkweDkyLCAweEVBLCAweDkyLCAweEVCLCAweDkyLCAweEVDLCAweDkyLCAweEVELCAvKiAweEU4LTB4RUIgKi8KKwkweDkyLCAweEVFLCAweDkyLCAweEVGLCAweDkyLCAweEYwLCAweDkyLCAweEYxLCAvKiAweEVDLTB4RUYgKi8KKwkweDkyLCAweEYyLCAweDkyLCAweEYzLCAweDkyLCAweEY0LCAweDkyLCAweEY1LCAvKiAweEYwLTB4RjMgKi8KKwkweDkyLCAweEY2LCAweDkyLCAweEY3LCAweDkyLCAweEY4LCAweDkyLCAweEY5LCAvKiAweEY0LTB4RjcgKi8KKwkweEI5LCAweENDLCAweEI5LCAweENELCAweDkyLCAweEZBLCAweDkyLCAweEZCLCAvKiAweEY4LTB4RkIgKi8KKwkweEI5LCAweENFLCAweDkyLCAweEZDLCAweDkyLCAweEZELCAweEI5LCAweENGLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19CQ1s1MTJdID0geworCTB4QjksIDB4RDAsIDB4OTIsIDB4RkUsIDB4QjksIDB4RDEsIDB4OTMsIDB4NDEsIC8qIDB4MDAtMHgwMyAqLworCTB4OTMsIDB4NDIsIDB4OTMsIDB4NDMsIDB4OTMsIDB4NDQsIDB4OTMsIDB4NDUsIC8qIDB4MDQtMHgwNyAqLworCTB4QjksIDB4RDIsIDB4QjksIDB4RDMsIDB4OTMsIDB4NDYsIDB4QjksIDB4RDQsIC8qIDB4MDgtMHgwQiAqLworCTB4QjksIDB4RDUsIDB4QjksIDB4RDYsIDB4OTMsIDB4NDcsIDB4QjksIDB4RDcsIC8qIDB4MEMtMHgwRiAqLworCTB4OTMsIDB4NDgsIDB4QjksIDB4RDgsIDB4OTMsIDB4NDksIDB4OTMsIDB4NEEsIC8qIDB4MTAtMHgxMyAqLworCTB4QjksIDB4RDksIDB4QjksIDB4REEsIDB4QjksIDB4REIsIDB4QjksIDB4REMsIC8qIDB4MTQtMHgxNyAqLworCTB4QjksIDB4REQsIDB4OTMsIDB4NEIsIDB4OTMsIDB4NEMsIDB4QjksIDB4REUsIC8qIDB4MTgtMHgxQiAqLworCTB4QjksIDB4REYsIDB4QjksIDB4RTAsIDB4QjksIDB4RTEsIDB4QjksIDB4RTIsIC8qIDB4MUMtMHgxRiAqLworCTB4OTMsIDB4NEQsIDB4OTMsIDB4NEUsIDB4OTMsIDB4NEYsIDB4OTMsIDB4NTAsIC8qIDB4MjAtMHgyMyAqLworCTB4QjksIDB4RTMsIDB4QjksIDB4RTQsIDB4OTMsIDB4NTEsIDB4QjksIDB4RTUsIC8qIDB4MjQtMHgyNyAqLworCTB4OTMsIDB4NTIsIDB4QjksIDB4RTYsIDB4OTMsIDB4NTMsIDB4OTMsIDB4NTQsIC8qIDB4MjgtMHgyQiAqLworCTB4OTMsIDB4NTUsIDB4QjksIDB4RTcsIDB4OTMsIDB4NTYsIDB4OTMsIDB4NTcsIC8qIDB4MkMtMHgyRiAqLworCTB4QjksIDB4RTgsIDB4QjksIDB4RTksIDB4OTMsIDB4NTgsIDB4OTMsIDB4NTksIC8qIDB4MzAtMHgzMyAqLworCTB4QjksIDB4RUEsIDB4OTMsIDB4NUEsIDB4OTMsIDB4NjEsIDB4OTMsIDB4NjIsIC8qIDB4MzQtMHgzNyAqLworCTB4QjksIDB4RUIsIDB4OTMsIDB4NjMsIDB4OTMsIDB4NjQsIDB4OTMsIDB4NjUsIC8qIDB4MzgtMHgzQiAqLworCTB4OTMsIDB4NjYsIDB4OTMsIDB4NjcsIDB4OTMsIDB4NjgsIDB4OTMsIDB4NjksIC8qIDB4M0MtMHgzRiAqLworCTB4QjksIDB4RUMsIDB4QjksIDB4RUQsIDB4OTMsIDB4NkEsIDB4QjksIDB4RUUsIC8qIDB4NDAtMHg0MyAqLworCTB4QjksIDB4RUYsIDB4QjksIDB4RjAsIDB4OTMsIDB4NkIsIDB4OTMsIDB4NkMsIC8qIDB4NDQtMHg0NyAqLworCTB4OTMsIDB4NkQsIDB4QjksIDB4RjEsIDB4OTMsIDB4NkUsIDB4OTMsIDB4NkYsIC8qIDB4NDgtMHg0QiAqLworCTB4QjksIDB4RjIsIDB4QjksIDB4RjMsIDB4OTMsIDB4NzAsIDB4OTMsIDB4NzEsIC8qIDB4NEMtMHg0RiAqLworCTB4QjksIDB4RjQsIDB4OTMsIDB4NzIsIDB4OTMsIDB4NzMsIDB4OTMsIDB4NzQsIC8qIDB4NTAtMHg1MyAqLworCTB4OTMsIDB4NzUsIDB4OTMsIDB4NzYsIDB4OTMsIDB4NzcsIDB4OTMsIDB4NzgsIC8qIDB4NTQtMHg1NyAqLworCTB4OTMsIDB4NzksIDB4OTMsIDB4N0EsIDB4OTMsIDB4ODEsIDB4OTMsIDB4ODIsIC8qIDB4NTgtMHg1QiAqLworCTB4OTMsIDB4ODMsIDB4QjksIDB4RjUsIDB4OTMsIDB4ODQsIDB4OTMsIDB4ODUsIC8qIDB4NUMtMHg1RiAqLworCTB4OTMsIDB4ODYsIDB4OTMsIDB4ODcsIDB4OTMsIDB4ODgsIDB4OTMsIDB4ODksIC8qIDB4NjAtMHg2MyAqLworCTB4OTMsIDB4OEEsIDB4OTMsIDB4OEIsIDB4OTMsIDB4OEMsIDB4OTMsIDB4OEQsIC8qIDB4NjQtMHg2NyAqLworCTB4OTMsIDB4OEUsIDB4OTMsIDB4OEYsIDB4OTMsIDB4OTAsIDB4OTMsIDB4OTEsIC8qIDB4NjgtMHg2QiAqLworCTB4OTMsIDB4OTIsIDB4OTMsIDB4OTMsIDB4OTMsIDB4OTQsIDB4OTMsIDB4OTUsIC8qIDB4NkMtMHg2RiAqLworCTB4OTMsIDB4OTYsIDB4OTMsIDB4OTcsIDB4OTMsIDB4OTgsIDB4OTMsIDB4OTksIC8qIDB4NzAtMHg3MyAqLworCTB4OTMsIDB4OUEsIDB4OTMsIDB4OUIsIDB4OTMsIDB4OUMsIDB4OTMsIDB4OUQsIC8qIDB4NzQtMHg3NyAqLworCTB4OTMsIDB4OUUsIDB4OTMsIDB4OUYsIDB4OTMsIDB4QTAsIDB4OTMsIDB4QTEsIC8qIDB4NzgtMHg3QiAqLworCTB4OTMsIDB4QTIsIDB4OTMsIDB4QTMsIDB4OTMsIDB4QTQsIDB4OTMsIDB4QTUsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4OTMsIDB4QTYsIDB4OTMsIDB4QTcsIDB4OTMsIDB4QTgsIDB4OTMsIDB4QTksIC8qIDB4ODAtMHg4MyAqLworCTB4QjksIDB4RjYsIDB4QjksIDB4RjcsIDB4OTMsIDB4QUEsIDB4OTMsIDB4QUIsIC8qIDB4ODQtMHg4NyAqLworCTB4QjksIDB4RjgsIDB4OTMsIDB4QUMsIDB4OTMsIDB4QUQsIDB4QjksIDB4RjksIC8qIDB4ODgtMHg4QiAqLworCTB4QjksIDB4RkEsIDB4OTMsIDB4QUUsIDB4QjksIDB4RkIsIDB4OTMsIDB4QUYsIC8qIDB4OEMtMHg4RiAqLworCTB4OTMsIDB4QjAsIDB4OTMsIDB4QjEsIDB4OTMsIDB4QjIsIDB4OTMsIDB4QjMsIC8qIDB4OTAtMHg5MyAqLworCTB4QjksIDB4RkMsIDB4QjksIDB4RkQsIDB4OTMsIDB4QjQsIDB4QjksIDB4RkUsIC8qIDB4OTQtMHg5NyAqLworCTB4OTMsIDB4QjUsIDB4QkEsIDB4QTEsIDB4QkEsIDB4QTIsIDB4OTMsIDB4QjYsIC8qIDB4OTgtMHg5QiAqLworCTB4OTMsIDB4QjcsIDB4OTMsIDB4QjgsIDB4OTMsIDB4QjksIDB4OTMsIDB4QkEsIC8qIDB4OUMtMHg5RiAqLworCTB4QkEsIDB4QTMsIDB4QkEsIDB4QTQsIDB4OTMsIDB4QkIsIDB4OTMsIDB4QkMsIC8qIDB4QTAtMHhBMyAqLworCTB4QkEsIDB4QTUsIDB4OTMsIDB4QkQsIDB4OTMsIDB4QkUsIDB4QkEsIDB4QTYsIC8qIDB4QTQtMHhBNyAqLworCTB4QkEsIDB4QTcsIDB4OTMsIDB4QkYsIDB4OTMsIDB4QzAsIDB4OTMsIDB4QzEsIC8qIDB4QTgtMHhBQiAqLworCTB4OTMsIDB4QzIsIDB4OTMsIDB4QzMsIDB4OTMsIDB4QzQsIDB4OTMsIDB4QzUsIC8qIDB4QUMtMHhBRiAqLworCTB4QkEsIDB4QTgsIDB4QkEsIDB4QTksIDB4OTMsIDB4QzYsIDB4QkEsIDB4QUEsIC8qIDB4QjAtMHhCMyAqLworCTB4QkEsIDB4QUIsIDB4QkEsIDB4QUMsIDB4OTMsIDB4QzcsIDB4OTMsIDB4QzgsIC8qIDB4QjQtMHhCNyAqLworCTB4OTMsIDB4QzksIDB4OTMsIDB4Q0EsIDB4OTMsIDB4Q0IsIDB4OTMsIDB4Q0MsIC8qIDB4QjgtMHhCQiAqLworCTB4QkEsIDB4QUQsIDB4QkEsIDB4QUUsIDB4OTMsIDB4Q0QsIDB4OTMsIDB4Q0UsIC8qIDB4QkMtMHhCRiAqLworCTB4QkEsIDB4QUYsIDB4OTMsIDB4Q0YsIDB4OTMsIDB4RDAsIDB4OTMsIDB4RDEsIC8qIDB4QzAtMHhDMyAqLworCTB4QkEsIDB4QjAsIDB4OTMsIDB4RDIsIDB4OTMsIDB4RDMsIDB4OTMsIDB4RDQsIC8qIDB4QzQtMHhDNyAqLworCTB4OTMsIDB4RDUsIDB4OTMsIDB4RDYsIDB4OTMsIDB4RDcsIDB4OTMsIDB4RDgsIC8qIDB4QzgtMHhDQiAqLworCTB4OTMsIDB4RDksIDB4QkEsIDB4QjEsIDB4OTMsIDB4REEsIDB4QkEsIDB4QjIsIC8qIDB4Q0MtMHhDRiAqLworCTB4QkEsIDB4QjMsIDB4QkEsIDB4QjQsIDB4OTMsIDB4REIsIDB4OTMsIDB4REMsIC8qIDB4RDAtMHhEMyAqLworCTB4OTMsIDB4REQsIDB4QkEsIDB4QjUsIDB4OTMsIDB4REUsIDB4OTMsIDB4REYsIC8qIDB4RDQtMHhENyAqLworCTB4QkEsIDB4QjYsIDB4OTMsIDB4RTAsIDB4OTMsIDB4RTEsIDB4OTMsIDB4RTIsIC8qIDB4RDgtMHhEQiAqLworCTB4QkEsIDB4QjcsIDB4OTMsIDB4RTMsIDB4OTMsIDB4RTQsIDB4OTMsIDB4RTUsIC8qIDB4REMtMHhERiAqLworCTB4OTMsIDB4RTYsIDB4OTMsIDB4RTcsIDB4OTMsIDB4RTgsIDB4OTMsIDB4RTksIC8qIDB4RTAtMHhFMyAqLworCTB4OTMsIDB4RUEsIDB4OTMsIDB4RUIsIDB4OTMsIDB4RUMsIDB4OTMsIDB4RUQsIC8qIDB4RTQtMHhFNyAqLworCTB4OTMsIDB4RUUsIDB4OTMsIDB4RUYsIDB4OTMsIDB4RjAsIDB4OTMsIDB4RjEsIC8qIDB4RTgtMHhFQiAqLworCTB4OTMsIDB4RjIsIDB4OTMsIDB4RjMsIDB4OTMsIDB4RjQsIDB4OTMsIDB4RjUsIC8qIDB4RUMtMHhFRiAqLworCTB4OTMsIDB4RjYsIDB4OTMsIDB4RjcsIDB4OTMsIDB4RjgsIDB4OTMsIDB4RjksIC8qIDB4RjAtMHhGMyAqLworCTB4QkEsIDB4QjgsIDB4QkEsIDB4QjksIDB4QkEsIDB4QkEsIDB4OTMsIDB4RkEsIC8qIDB4RjQtMHhGNyAqLworCTB4QkEsIDB4QkIsIDB4OTMsIDB4RkIsIDB4OTMsIDB4RkMsIDB4OTMsIDB4RkQsIC8qIDB4RjgtMHhGQiAqLworCTB4QkEsIDB4QkMsIDB4OTMsIDB4RkUsIDB4OTQsIDB4NDEsIDB4OTQsIDB4NDIsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0JEWzUxMl0gPSB7CisJMHg5NCwgMHg0MywgMHg5NCwgMHg0NCwgMHg5NCwgMHg0NSwgMHg5NCwgMHg0NiwgLyogMHgwMC0weDAzICovCisJMHhCQSwgMHhCRCwgMHhCQSwgMHhCRSwgMHg5NCwgMHg0NywgMHhCQSwgMHhCRiwgLyogMHgwNC0weDA3ICovCisJMHg5NCwgMHg0OCwgMHhCQSwgMHhDMCwgMHg5NCwgMHg0OSwgMHg5NCwgMHg0QSwgLyogMHgwOC0weDBCICovCisJMHg5NCwgMHg0QiwgMHg5NCwgMHg0QywgMHg5NCwgMHg0RCwgMHg5NCwgMHg0RSwgLyogMHgwQy0weDBGICovCisJMHhCQSwgMHhDMSwgMHg5NCwgMHg0RiwgMHg5NCwgMHg1MCwgMHg5NCwgMHg1MSwgLyogMHgxMC0weDEzICovCisJMHhCQSwgMHhDMiwgMHg5NCwgMHg1MiwgMHg5NCwgMHg1MywgMHg5NCwgMHg1NCwgLyogMHgxNC0weDE3ICovCisJMHg5NCwgMHg1NSwgMHg5NCwgMHg1NiwgMHg5NCwgMHg1NywgMHg5NCwgMHg1OCwgLyogMHgxOC0weDFCICovCisJMHg5NCwgMHg1OSwgMHg5NCwgMHg1QSwgMHg5NCwgMHg2MSwgMHg5NCwgMHg2MiwgLyogMHgxQy0weDFGICovCisJMHg5NCwgMHg2MywgMHg5NCwgMHg2NCwgMHg5NCwgMHg2NSwgMHg5NCwgMHg2NiwgLyogMHgyMC0weDIzICovCisJMHhCQSwgMHhDMywgMHg5NCwgMHg2NywgMHg5NCwgMHg2OCwgMHg5NCwgMHg2OSwgLyogMHgyNC0weDI3ICovCisJMHg5NCwgMHg2QSwgMHg5NCwgMHg2QiwgMHg5NCwgMHg2QywgMHg5NCwgMHg2RCwgLyogMHgyOC0weDJCICovCisJMHhCQSwgMHhDNCwgMHg5NCwgMHg2RSwgMHg5NCwgMHg2RiwgMHg5NCwgMHg3MCwgLyogMHgyQy0weDJGICovCisJMHg5NCwgMHg3MSwgMHg5NCwgMHg3MiwgMHg5NCwgMHg3MywgMHg5NCwgMHg3NCwgLyogMHgzMC0weDMzICovCisJMHg5NCwgMHg3NSwgMHg5NCwgMHg3NiwgMHg5NCwgMHg3NywgMHg5NCwgMHg3OCwgLyogMHgzNC0weDM3ICovCisJMHg5NCwgMHg3OSwgMHg5NCwgMHg3QSwgMHg5NCwgMHg4MSwgMHg5NCwgMHg4MiwgLyogMHgzOC0weDNCICovCisJMHg5NCwgMHg4MywgMHg5NCwgMHg4NCwgMHg5NCwgMHg4NSwgMHg5NCwgMHg4NiwgLyogMHgzQy0weDNGICovCisJMHhCQSwgMHhDNSwgMHg5NCwgMHg4NywgMHg5NCwgMHg4OCwgMHg5NCwgMHg4OSwgLyogMHg0MC0weDQzICovCisJMHg5NCwgMHg4QSwgMHg5NCwgMHg4QiwgMHg5NCwgMHg4QywgMHg5NCwgMHg4RCwgLyogMHg0NC0weDQ3ICovCisJMHhCQSwgMHhDNiwgMHhCQSwgMHhDNywgMHg5NCwgMHg4RSwgMHg5NCwgMHg4RiwgLyogMHg0OC0weDRCICovCisJMHhCQSwgMHhDOCwgMHg5NCwgMHg5MCwgMHg5NCwgMHg5MSwgMHg5NCwgMHg5MiwgLyogMHg0Qy0weDRGICovCisJMHhCQSwgMHhDOSwgMHg5NCwgMHg5MywgMHg5NCwgMHg5NCwgMHg5NCwgMHg5NSwgLyogMHg1MC0weDUzICovCisJMHg5NCwgMHg5NiwgMHg5NCwgMHg5NywgMHg5NCwgMHg5OCwgMHg5NCwgMHg5OSwgLyogMHg1NC0weDU3ICovCisJMHhCQSwgMHhDQSwgMHhCQSwgMHhDQiwgMHg5NCwgMHg5QSwgMHg5NCwgMHg5QiwgLyogMHg1OC0weDVCICovCisJMHg5NCwgMHg5QywgMHg5NCwgMHg5RCwgMHg5NCwgMHg5RSwgMHg5NCwgMHg5RiwgLyogMHg1Qy0weDVGICovCisJMHg5NCwgMHhBMCwgMHg5NCwgMHhBMSwgMHg5NCwgMHhBMiwgMHg5NCwgMHhBMywgLyogMHg2MC0weDYzICovCisJMHhCQSwgMHhDQywgMHg5NCwgMHhBNCwgMHg5NCwgMHhBNSwgMHg5NCwgMHhBNiwgLyogMHg2NC0weDY3ICovCisJMHhCQSwgMHhDRCwgMHg5NCwgMHhBNywgMHg5NCwgMHhBOCwgMHg5NCwgMHhBOSwgLyogMHg2OC0weDZCICovCisJMHg5NCwgMHhBQSwgMHg5NCwgMHhBQiwgMHg5NCwgMHhBQywgMHg5NCwgMHhBRCwgLyogMHg2Qy0weDZGICovCisJMHg5NCwgMHhBRSwgMHg5NCwgMHhBRiwgMHg5NCwgMHhCMCwgMHg5NCwgMHhCMSwgLyogMHg3MC0weDczICovCisJMHg5NCwgMHhCMiwgMHg5NCwgMHhCMywgMHg5NCwgMHhCNCwgMHg5NCwgMHhCNSwgLyogMHg3NC0weDc3ICovCisJMHg5NCwgMHhCNiwgMHg5NCwgMHhCNywgMHg5NCwgMHhCOCwgMHg5NCwgMHhCOSwgLyogMHg3OC0weDdCICovCisJMHg5NCwgMHhCQSwgMHg5NCwgMHhCQiwgMHg5NCwgMHhCQywgMHg5NCwgMHhCRCwgLyogMHg3Qy0weDdGICovCisJCisJMHhCQSwgMHhDRSwgMHhCQSwgMHhDRiwgMHg5NCwgMHhCRSwgMHg5NCwgMHhCRiwgLyogMHg4MC0weDgzICovCisJMHhCQSwgMHhEMCwgMHg5NCwgMHhDMCwgMHg5NCwgMHhDMSwgMHhCQSwgMHhEMSwgLyogMHg4NC0weDg3ICovCisJMHhCQSwgMHhEMiwgMHhCQSwgMHhEMywgMHhCQSwgMHhENCwgMHg5NCwgMHhDMiwgLyogMHg4OC0weDhCICovCisJMHg5NCwgMHhDMywgMHg5NCwgMHhDNCwgMHg5NCwgMHhDNSwgMHg5NCwgMHhDNiwgLyogMHg4Qy0weDhGICovCisJMHhCQSwgMHhENSwgMHhCQSwgMHhENiwgMHg5NCwgMHhDNywgMHhCQSwgMHhENywgLyogMHg5MC0weDkzICovCisJMHg5NCwgMHhDOCwgMHhCQSwgMHhEOCwgMHg5NCwgMHhDOSwgMHg5NCwgMHhDQSwgLyogMHg5NC0weDk3ICovCisJMHg5NCwgMHhDQiwgMHhCQSwgMHhEOSwgMHhCQSwgMHhEQSwgMHg5NCwgMHhDQywgLyogMHg5OC0weDlCICovCisJMHhCQSwgMHhEQiwgMHg5NCwgMHhDRCwgMHg5NCwgMHhDRSwgMHg5NCwgMHhDRiwgLyogMHg5Qy0weDlGICovCisJMHg5NCwgMHhEMCwgMHg5NCwgMHhEMSwgMHg5NCwgMHhEMiwgMHg5NCwgMHhEMywgLyogMHhBMC0weEEzICovCisJMHhCQSwgMHhEQywgMHg5NCwgMHhENCwgMHg5NCwgMHhENSwgMHg5NCwgMHhENiwgLyogMHhBNC0weEE3ICovCisJMHg5NCwgMHhENywgMHg5NCwgMHhEOCwgMHg5NCwgMHhEOSwgMHg5NCwgMHhEQSwgLyogMHhBOC0weEFCICovCisJMHg5NCwgMHhEQiwgMHg5NCwgMHhEQywgMHg5NCwgMHhERCwgMHg5NCwgMHhERSwgLyogMHhBQy0weEFGICovCisJMHhCQSwgMHhERCwgMHg5NCwgMHhERiwgMHg5NCwgMHhFMCwgMHg5NCwgMHhFMSwgLyogMHhCMC0weEIzICovCisJMHg5NCwgMHhFMiwgMHg5NCwgMHhFMywgMHg5NCwgMHhFNCwgMHg5NCwgMHhFNSwgLyogMHhCNC0weEI3ICovCisJMHhCQSwgMHhERSwgMHg5NCwgMHhFNiwgMHg5NCwgMHhFNywgMHg5NCwgMHhFOCwgLyogMHhCOC0weEJCICovCisJMHg5NCwgMHhFOSwgMHg5NCwgMHhFQSwgMHg5NCwgMHhFQiwgMHg5NCwgMHhFQywgLyogMHhCQy0weEJGICovCisJMHg5NCwgMHhFRCwgMHg5NCwgMHhFRSwgMHg5NCwgMHhFRiwgMHg5NCwgMHhGMCwgLyogMHhDMC0weEMzICovCisJMHg5NCwgMHhGMSwgMHg5NCwgMHhGMiwgMHg5NCwgMHhGMywgMHg5NCwgMHhGNCwgLyogMHhDNC0weEM3ICovCisJMHg5NCwgMHhGNSwgMHg5NCwgMHhGNiwgMHg5NCwgMHhGNywgMHg5NCwgMHhGOCwgLyogMHhDOC0weENCICovCisJMHg5NCwgMHhGOSwgMHg5NCwgMHhGQSwgMHg5NCwgMHhGQiwgMHg5NCwgMHhGQywgLyogMHhDQy0weENGICovCisJMHg5NCwgMHhGRCwgMHg5NCwgMHhGRSwgMHg5NSwgMHg0MSwgMHg5NSwgMHg0MiwgLyogMHhEMC0weEQzICovCisJMHhCQSwgMHhERiwgMHhCQSwgMHhFMCwgMHg5NSwgMHg0MywgMHg5NSwgMHg0NCwgLyogMHhENC0weEQ3ICovCisJMHhCQSwgMHhFMSwgMHg5NSwgMHg0NSwgMHg5NSwgMHg0NiwgMHg5NSwgMHg0NywgLyogMHhEOC0weERCICovCisJMHhCQSwgMHhFMiwgMHg5NSwgMHg0OCwgMHg5NSwgMHg0OSwgMHg5NSwgMHg0QSwgLyogMHhEQy0weERGICovCisJMHg5NSwgMHg0QiwgMHg5NSwgMHg0QywgMHg5NSwgMHg0RCwgMHg5NSwgMHg0RSwgLyogMHhFMC0weEUzICovCisJMHg5NSwgMHg0RiwgMHg5NSwgMHg1MCwgMHg5NSwgMHg1MSwgMHg5NSwgMHg1MiwgLyogMHhFNC0weEU3ICovCisJMHg5NSwgMHg1MywgMHhCQSwgMHhFMywgMHg5NSwgMHg1NCwgMHg5NSwgMHg1NSwgLyogMHhFOC0weEVCICovCisJMHg5NSwgMHg1NiwgMHg5NSwgMHg1NywgMHg5NSwgMHg1OCwgMHg5NSwgMHg1OSwgLyogMHhFQy0weEVGICovCisJMHhCQSwgMHhFNCwgMHg5NSwgMHg1QSwgMHg5NSwgMHg2MSwgMHg5NSwgMHg2MiwgLyogMHhGMC0weEYzICovCisJMHhCQSwgMHhFNSwgMHg5NSwgMHg2MywgMHg5NSwgMHg2NCwgMHg5NSwgMHg2NSwgLyogMHhGNC0weEY3ICovCisJMHhCQSwgMHhFNiwgMHg5NSwgMHg2NiwgMHg5NSwgMHg2NywgMHg5NSwgMHg2OCwgLyogMHhGOC0weEZCICovCisJMHg5NSwgMHg2OSwgMHg5NSwgMHg2QSwgMHg5NSwgMHg2QiwgMHg5NSwgMHg2QywgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfQkVbNTEyXSA9IHsKKwkweEJBLCAweEU3LCAweDk1LCAweDZELCAweDk1LCAweDZFLCAweEJBLCAweEU4LCAvKiAweDAwLTB4MDMgKi8KKwkweDk1LCAweDZGLCAweEJBLCAweEU5LCAweDk1LCAweDcwLCAweDk1LCAweDcxLCAvKiAweDA0LTB4MDcgKi8KKwkweDk1LCAweDcyLCAweDk1LCAweDczLCAweDk1LCAweDc0LCAweDk1LCAweDc1LCAvKiAweDA4LTB4MEIgKi8KKwkweEJBLCAweEVBLCAweEJBLCAweEVCLCAweDk1LCAweDc2LCAweDk1LCAweDc3LCAvKiAweDBDLTB4MEYgKi8KKwkweEJBLCAweEVDLCAweDk1LCAweDc4LCAweDk1LCAweDc5LCAweDk1LCAweDdBLCAvKiAweDEwLTB4MTMgKi8KKwkweEJBLCAweEVELCAweDk1LCAweDgxLCAweDk1LCAweDgyLCAweDk1LCAweDgzLCAvKiAweDE0LTB4MTcgKi8KKwkweDk1LCAweDg0LCAweDk1LCAweDg1LCAweDk1LCAweDg2LCAweDk1LCAweDg3LCAvKiAweDE4LTB4MUIgKi8KKwkweEJBLCAweEVFLCAweEJBLCAweEVGLCAweDk1LCAweDg4LCAweEJBLCAweEYwLCAvKiAweDFDLTB4MUYgKi8KKwkweDk1LCAweDg5LCAweDk1LCAweDhBLCAweDk1LCAweDhCLCAweDk1LCAweDhDLCAvKiAweDIwLTB4MjMgKi8KKwkweDk1LCAweDhELCAweDk1LCAweDhFLCAweDk1LCAweDhGLCAweDk1LCAweDkwLCAvKiAweDI0LTB4MjcgKi8KKwkweDk1LCAweDkxLCAweDk1LCAweDkyLCAweDk1LCAweDkzLCAweDk1LCAweDk0LCAvKiAweDI4LTB4MkIgKi8KKwkweDk1LCAweDk1LCAweDk1LCAweDk2LCAweDk1LCAweDk3LCAweDk1LCAweDk4LCAvKiAweDJDLTB4MkYgKi8KKwkweDk1LCAweDk5LCAweDk1LCAweDlBLCAweDk1LCAweDlCLCAweDk1LCAweDlDLCAvKiAweDMwLTB4MzMgKi8KKwkweDk1LCAweDlELCAweDk1LCAweDlFLCAweDk1LCAweDlGLCAweDk1LCAweEEwLCAvKiAweDM0LTB4MzcgKi8KKwkweDk1LCAweEExLCAweDk1LCAweEEyLCAweDk1LCAweEEzLCAweDk1LCAweEE0LCAvKiAweDM4LTB4M0IgKi8KKwkweDk1LCAweEE1LCAweDk1LCAweEE2LCAweDk1LCAweEE3LCAweDk1LCAweEE4LCAvKiAweDNDLTB4M0YgKi8KKwkweDk1LCAweEE5LCAweDk1LCAweEFBLCAweDk1LCAweEFCLCAweDk1LCAweEFDLCAvKiAweDQwLTB4NDMgKi8KKwkweEJBLCAweEYxLCAweEJBLCAweEYyLCAweDk1LCAweEFELCAweDk1LCAweEFFLCAvKiAweDQ0LTB4NDcgKi8KKwkweEJBLCAweEYzLCAweDk1LCAweEFGLCAweDk1LCAweEIwLCAweDk1LCAweEIxLCAvKiAweDQ4LTB4NEIgKi8KKwkweEJBLCAweEY0LCAweDk1LCAweEIyLCAweEJBLCAweEY1LCAweDk1LCAweEIzLCAvKiAweDRDLTB4NEYgKi8KKwkweDk1LCAweEI0LCAweDk1LCAweEI1LCAweDk1LCAweEI2LCAweDk1LCAweEI3LCAvKiAweDUwLTB4NTMgKi8KKwkweEJBLCAweEY2LCAweEJBLCAweEY3LCAweDk1LCAweEI4LCAweEJBLCAweEY4LCAvKiAweDU0LTB4NTcgKi8KKwkweDk1LCAweEI5LCAweEJBLCAweEY5LCAweEJBLCAweEZBLCAweEJBLCAweEZCLCAvKiAweDU4LTB4NUIgKi8KKwkweDk1LCAweEJBLCAweDk1LCAweEJCLCAweDk1LCAweEJDLCAweDk1LCAweEJELCAvKiAweDVDLTB4NUYgKi8KKwkweEJBLCAweEZDLCAweEJBLCAweEZELCAweDk1LCAweEJFLCAweDk1LCAweEJGLCAvKiAweDYwLTB4NjMgKi8KKwkweEJBLCAweEZFLCAweDk1LCAweEMwLCAweDk1LCAweEMxLCAweDk1LCAweEMyLCAvKiAweDY0LTB4NjcgKi8KKwkweEJCLCAweEExLCAweDk1LCAweEMzLCAweEJCLCAweEEyLCAweDk1LCAweEM0LCAvKiAweDY4LTB4NkIgKi8KKwkweDk1LCAweEM1LCAweDk1LCAweEM2LCAweDk1LCAweEM3LCAweDk1LCAweEM4LCAvKiAweDZDLTB4NkYgKi8KKwkweEJCLCAweEEzLCAweEJCLCAweEE0LCAweDk1LCAweEM5LCAweEJCLCAweEE1LCAvKiAweDcwLTB4NzMgKi8KKwkweEJCLCAweEE2LCAweEJCLCAweEE3LCAweDk1LCAweENBLCAweDk1LCAweENCLCAvKiAweDc0LTB4NzcgKi8KKwkweDk1LCAweENDLCAweDk1LCAweENELCAweDk1LCAweENFLCAweEJCLCAweEE4LCAvKiAweDc4LTB4N0IgKi8KKwkweEJCLCAweEE5LCAweEJCLCAweEFBLCAweDk1LCAweENGLCAweDk1LCAweEQwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEJCLCAweEFCLCAweDk1LCAweEQxLCAweDk1LCAweEQyLCAweDk1LCAweEQzLCAvKiAweDgwLTB4ODMgKi8KKwkweEJCLCAweEFDLCAweDk1LCAweEQ0LCAweDk1LCAweEQ1LCAweDk1LCAweEQ2LCAvKiAweDg0LTB4ODcgKi8KKwkweDk1LCAweEQ3LCAweDk1LCAweEQ4LCAweDk1LCAweEQ5LCAweDk1LCAweERBLCAvKiAweDg4LTB4OEIgKi8KKwkweEJCLCAweEFELCAweEJCLCAweEFFLCAweDk1LCAweERCLCAweEJCLCAweEFGLCAvKiAweDhDLTB4OEYgKi8KKwkweEJCLCAweEIwLCAweEJCLCAweEIxLCAweDk1LCAweERDLCAweDk1LCAweERELCAvKiAweDkwLTB4OTMgKi8KKwkweDk1LCAweERFLCAweDk1LCAweERGLCAweDk1LCAweEUwLCAweDk1LCAweEUxLCAvKiAweDk0LTB4OTcgKi8KKwkweEJCLCAweEIyLCAweEJCLCAweEIzLCAweDk1LCAweEUyLCAweDk1LCAweEUzLCAvKiAweDk4LTB4OUIgKi8KKwkweDk1LCAweEU0LCAweDk1LCAweEU1LCAweDk1LCAweEU2LCAweDk1LCAweEU3LCAvKiAweDlDLTB4OUYgKi8KKwkweDk1LCAweEU4LCAweDk1LCAweEU5LCAweDk1LCAweEVBLCAweDk1LCAweEVCLCAvKiAweEEwLTB4QTMgKi8KKwkweDk1LCAweEVDLCAweDk1LCAweEVELCAweDk1LCAweEVFLCAweDk1LCAweEVGLCAvKiAweEE0LTB4QTcgKi8KKwkweEJCLCAweEI0LCAweDk1LCAweEYwLCAweDk1LCAweEYxLCAweDk1LCAweEYyLCAvKiAweEE4LTB4QUIgKi8KKwkweDk1LCAweEYzLCAweDk1LCAweEY0LCAweDk1LCAweEY1LCAweDk1LCAweEY2LCAvKiAweEFDLTB4QUYgKi8KKwkweDk1LCAweEY3LCAweDk1LCAweEY4LCAweDk1LCAweEY5LCAweDk1LCAweEZBLCAvKiAweEIwLTB4QjMgKi8KKwkweDk1LCAweEZCLCAweDk1LCAweEZDLCAweDk1LCAweEZELCAweDk1LCAweEZFLCAvKiAweEI0LTB4QjcgKi8KKwkweDk2LCAweDQxLCAweDk2LCAweDQyLCAweDk2LCAweDQzLCAweDk2LCAweDQ0LCAvKiAweEI4LTB4QkIgKi8KKwkweDk2LCAweDQ1LCAweDk2LCAweDQ2LCAweDk2LCAweDQ3LCAweDk2LCAweDQ4LCAvKiAweEJDLTB4QkYgKi8KKwkweDk2LCAweDQ5LCAweDk2LCAweDRBLCAweDk2LCAweDRCLCAweDk2LCAweDRDLCAvKiAweEMwLTB4QzMgKi8KKwkweDk2LCAweDRELCAweDk2LCAweDRFLCAweDk2LCAweDRGLCAweDk2LCAweDUwLCAvKiAweEM0LTB4QzcgKi8KKwkweDk2LCAweDUxLCAweDk2LCAweDUyLCAweDk2LCAweDUzLCAweDk2LCAweDU0LCAvKiAweEM4LTB4Q0IgKi8KKwkweDk2LCAweDU1LCAweDk2LCAweDU2LCAweDk2LCAweDU3LCAweDk2LCAweDU4LCAvKiAweENDLTB4Q0YgKi8KKwkweEJCLCAweEI1LCAweEJCLCAweEI2LCAweDk2LCAweDU5LCAweDk2LCAweDVBLCAvKiAweEQwLTB4RDMgKi8KKwkweEJCLCAweEI3LCAweDk2LCAweDYxLCAweDk2LCAweDYyLCAweEJCLCAweEI4LCAvKiAweEQ0LTB4RDcgKi8KKwkweEJCLCAweEI5LCAweDk2LCAweDYzLCAweDk2LCAweDY0LCAweDk2LCAweDY1LCAvKiAweEQ4LTB4REIgKi8KKwkweDk2LCAweDY2LCAweDk2LCAweDY3LCAweDk2LCAweDY4LCAweDk2LCAweDY5LCAvKiAweERDLTB4REYgKi8KKwkweEJCLCAweEJBLCAweDk2LCAweDZBLCAweDk2LCAweDZCLCAweEJCLCAweEJCLCAvKiAweEUwLTB4RTMgKi8KKwkweEJCLCAweEJDLCAweEJCLCAweEJELCAweDk2LCAweDZDLCAweDk2LCAweDZELCAvKiAweEU0LTB4RTcgKi8KKwkweDk2LCAweDZFLCAweDk2LCAweDZGLCAweDk2LCAweDcwLCAweDk2LCAweDcxLCAvKiAweEU4LTB4RUIgKi8KKwkweEJCLCAweEJFLCAweDk2LCAweDcyLCAweDk2LCAweDczLCAweDk2LCAweDc0LCAvKiAweEVDLTB4RUYgKi8KKwkweDk2LCAweDc1LCAweDk2LCAweDc2LCAweDk2LCAweDc3LCAweDk2LCAweDc4LCAvKiAweEYwLTB4RjMgKi8KKwkweDk2LCAweDc5LCAweDk2LCAweDdBLCAweDk2LCAweDgxLCAweDk2LCAweDgyLCAvKiAweEY0LTB4RjcgKi8KKwkweDk2LCAweDgzLCAweDk2LCAweDg0LCAweDk2LCAweDg1LCAweDk2LCAweDg2LCAvKiAweEY4LTB4RkIgKi8KKwkweDk2LCAweDg3LCAweDk2LCAweDg4LCAweDk2LCAweDg5LCAweDk2LCAweDhBLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19CRls1MTJdID0geworCTB4OTYsIDB4OEIsIDB4QkIsIDB4QkYsIDB4OTYsIDB4OEMsIDB4OTYsIDB4OEQsIC8qIDB4MDAtMHgwMyAqLworCTB4OTYsIDB4OEUsIDB4OTYsIDB4OEYsIDB4OTYsIDB4OTAsIDB4OTYsIDB4OTEsIC8qIDB4MDQtMHgwNyAqLworCTB4QkIsIDB4QzAsIDB4QkIsIDB4QzEsIDB4OTYsIDB4OTIsIDB4OTYsIDB4OTMsIC8qIDB4MDgtMHgwQiAqLworCTB4OTYsIDB4OTQsIDB4OTYsIDB4OTUsIDB4OTYsIDB4OTYsIDB4OTYsIDB4OTcsIC8qIDB4MEMtMHgwRiAqLworCTB4OTYsIDB4OTgsIDB4OTYsIDB4OTksIDB4OTYsIDB4OUEsIDB4OTYsIDB4OUIsIC8qIDB4MTAtMHgxMyAqLworCTB4OTYsIDB4OUMsIDB4OTYsIDB4OUQsIDB4OTYsIDB4OUUsIDB4OTYsIDB4OUYsIC8qIDB4MTQtMHgxNyAqLworCTB4QkIsIDB4QzIsIDB4QkIsIDB4QzMsIDB4OTYsIDB4QTAsIDB4QkIsIDB4QzQsIC8qIDB4MTgtMHgxQiAqLworCTB4QkIsIDB4QzUsIDB4QkIsIDB4QzYsIDB4OTYsIDB4QTEsIDB4OTYsIDB4QTIsIC8qIDB4MUMtMHgxRiAqLworCTB4OTYsIDB4QTMsIDB4OTYsIDB4QTQsIDB4OTYsIDB4QTUsIDB4OTYsIDB4QTYsIC8qIDB4MjAtMHgyMyAqLworCTB4OTYsIDB4QTcsIDB4OTYsIDB4QTgsIDB4OTYsIDB4QTksIDB4OTYsIDB4QUEsIC8qIDB4MjQtMHgyNyAqLworCTB4OTYsIDB4QUIsIDB4OTYsIDB4QUMsIDB4OTYsIDB4QUQsIDB4OTYsIDB4QUUsIC8qIDB4MjgtMHgyQiAqLworCTB4OTYsIDB4QUYsIDB4OTYsIDB4QjAsIDB4OTYsIDB4QjEsIDB4OTYsIDB4QjIsIC8qIDB4MkMtMHgyRiAqLworCTB4OTYsIDB4QjMsIDB4OTYsIDB4QjQsIDB4OTYsIDB4QjUsIDB4OTYsIDB4QjYsIC8qIDB4MzAtMHgzMyAqLworCTB4OTYsIDB4QjcsIDB4OTYsIDB4QjgsIDB4OTYsIDB4QjksIDB4OTYsIDB4QkEsIC8qIDB4MzQtMHgzNyAqLworCTB4OTYsIDB4QkIsIDB4OTYsIDB4QkMsIDB4OTYsIDB4QkQsIDB4OTYsIDB4QkUsIC8qIDB4MzgtMHgzQiAqLworCTB4OTYsIDB4QkYsIDB4OTYsIDB4QzAsIDB4OTYsIDB4QzEsIDB4OTYsIDB4QzIsIC8qIDB4M0MtMHgzRiAqLworCTB4QkIsIDB4QzcsIDB4QkIsIDB4QzgsIDB4OTYsIDB4QzMsIDB4OTYsIDB4QzQsIC8qIDB4NDAtMHg0MyAqLworCTB4QkIsIDB4QzksIDB4OTYsIDB4QzUsIDB4OTYsIDB4QzYsIDB4OTYsIDB4QzcsIC8qIDB4NDQtMHg0NyAqLworCTB4QkIsIDB4Q0EsIDB4OTYsIDB4QzgsIDB4OTYsIDB4QzksIDB4OTYsIDB4Q0EsIC8qIDB4NDgtMHg0QiAqLworCTB4OTYsIDB4Q0IsIDB4OTYsIDB4Q0MsIDB4OTYsIDB4Q0QsIDB4OTYsIDB4Q0UsIC8qIDB4NEMtMHg0RiAqLworCTB4QkIsIDB4Q0IsIDB4QkIsIDB4Q0MsIDB4OTYsIDB4Q0YsIDB4OTYsIDB4RDAsIC8qIDB4NTAtMHg1MyAqLworCTB4OTYsIDB4RDEsIDB4QkIsIDB4Q0QsIDB4OTYsIDB4RDIsIDB4OTYsIDB4RDMsIC8qIDB4NTQtMHg1NyAqLworCTB4OTYsIDB4RDQsIDB4OTYsIDB4RDUsIDB4OTYsIDB4RDYsIDB4OTYsIDB4RDcsIC8qIDB4NTgtMHg1QiAqLworCTB4OTYsIDB4RDgsIDB4OTYsIDB4RDksIDB4OTYsIDB4REEsIDB4OTYsIDB4REIsIC8qIDB4NUMtMHg1RiAqLworCTB4OTYsIDB4REMsIDB4OTYsIDB4REQsIDB4OTYsIDB4REUsIDB4OTYsIDB4REYsIC8qIDB4NjAtMHg2MyAqLworCTB4OTYsIDB4RTAsIDB4OTYsIDB4RTEsIDB4OTYsIDB4RTIsIDB4OTYsIDB4RTMsIC8qIDB4NjQtMHg2NyAqLworCTB4OTYsIDB4RTQsIDB4OTYsIDB4RTUsIDB4OTYsIDB4RTYsIDB4OTYsIDB4RTcsIC8qIDB4NjgtMHg2QiAqLworCTB4OTYsIDB4RTgsIDB4OTYsIDB4RTksIDB4OTYsIDB4RUEsIDB4OTYsIDB4RUIsIC8qIDB4NkMtMHg2RiAqLworCTB4OTYsIDB4RUMsIDB4OTYsIDB4RUQsIDB4OTYsIDB4RUUsIDB4OTYsIDB4RUYsIC8qIDB4NzAtMHg3MyAqLworCTB4OTYsIDB4RjAsIDB4OTYsIDB4RjEsIDB4OTYsIDB4RjIsIDB4OTYsIDB4RjMsIC8qIDB4NzQtMHg3NyAqLworCTB4OTYsIDB4RjQsIDB4OTYsIDB4RjUsIDB4OTYsIDB4RjYsIDB4OTYsIDB4RjcsIC8qIDB4NzgtMHg3QiAqLworCTB4OTYsIDB4RjgsIDB4OTYsIDB4RjksIDB4OTYsIDB4RkEsIDB4OTYsIDB4RkIsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4OTYsIDB4RkMsIDB4OTYsIDB4RkQsIDB4OTYsIDB4RkUsIDB4OTcsIDB4NDEsIC8qIDB4ODAtMHg4MyAqLworCTB4OTcsIDB4NDIsIDB4OTcsIDB4NDMsIDB4OTcsIDB4NDQsIDB4OTcsIDB4NDUsIC8qIDB4ODQtMHg4NyAqLworCTB4OTcsIDB4NDYsIDB4OTcsIDB4NDcsIDB4OTcsIDB4NDgsIDB4OTcsIDB4NDksIC8qIDB4ODgtMHg4QiAqLworCTB4OTcsIDB4NEEsIDB4OTcsIDB4NEIsIDB4OTcsIDB4NEMsIDB4OTcsIDB4NEQsIC8qIDB4OEMtMHg4RiAqLworCTB4OTcsIDB4NEUsIDB4OTcsIDB4NEYsIDB4OTcsIDB4NTAsIDB4OTcsIDB4NTEsIC8qIDB4OTAtMHg5MyAqLworCTB4QkIsIDB4Q0UsIDB4OTcsIDB4NTIsIDB4OTcsIDB4NTMsIDB4OTcsIDB4NTQsIC8qIDB4OTQtMHg5NyAqLworCTB4OTcsIDB4NTUsIDB4OTcsIDB4NTYsIDB4OTcsIDB4NTcsIDB4OTcsIDB4NTgsIC8qIDB4OTgtMHg5QiAqLworCTB4OTcsIDB4NTksIDB4OTcsIDB4NUEsIDB4OTcsIDB4NjEsIDB4OTcsIDB4NjIsIC8qIDB4OUMtMHg5RiAqLworCTB4OTcsIDB4NjMsIDB4OTcsIDB4NjQsIDB4OTcsIDB4NjUsIDB4OTcsIDB4NjYsIC8qIDB4QTAtMHhBMyAqLworCTB4OTcsIDB4NjcsIDB4OTcsIDB4NjgsIDB4OTcsIDB4NjksIDB4OTcsIDB4NkEsIC8qIDB4QTQtMHhBNyAqLworCTB4OTcsIDB4NkIsIDB4OTcsIDB4NkMsIDB4OTcsIDB4NkQsIDB4OTcsIDB4NkUsIC8qIDB4QTgtMHhBQiAqLworCTB4OTcsIDB4NkYsIDB4OTcsIDB4NzAsIDB4OTcsIDB4NzEsIDB4OTcsIDB4NzIsIC8qIDB4QUMtMHhBRiAqLworCTB4QkIsIDB4Q0YsIDB4OTcsIDB4NzMsIDB4OTcsIDB4NzQsIDB4OTcsIDB4NzUsIC8qIDB4QjAtMHhCMyAqLworCTB4OTcsIDB4NzYsIDB4OTcsIDB4NzcsIDB4OTcsIDB4NzgsIDB4OTcsIDB4NzksIC8qIDB4QjQtMHhCNyAqLworCTB4OTcsIDB4N0EsIDB4OTcsIDB4ODEsIDB4OTcsIDB4ODIsIDB4OTcsIDB4ODMsIC8qIDB4QjgtMHhCQiAqLworCTB4OTcsIDB4ODQsIDB4OTcsIDB4ODUsIDB4OTcsIDB4ODYsIDB4OTcsIDB4ODcsIC8qIDB4QkMtMHhCRiAqLworCTB4OTcsIDB4ODgsIDB4OTcsIDB4ODksIDB4OTcsIDB4OEEsIDB4OTcsIDB4OEIsIC8qIDB4QzAtMHhDMyAqLworCTB4OTcsIDB4OEMsIDB4QkIsIDB4RDAsIDB4OTcsIDB4OEQsIDB4OTcsIDB4OEUsIC8qIDB4QzQtMHhDNyAqLworCTB4OTcsIDB4OEYsIDB4OTcsIDB4OTAsIDB4OTcsIDB4OTEsIDB4OTcsIDB4OTIsIC8qIDB4QzgtMHhDQiAqLworCTB4QkIsIDB4RDEsIDB4QkIsIDB4RDIsIDB4OTcsIDB4OTMsIDB4OTcsIDB4OTQsIC8qIDB4Q0MtMHhDRiAqLworCTB4QkIsIDB4RDMsIDB4OTcsIDB4OTUsIDB4OTcsIDB4OTYsIDB4OTcsIDB4OTcsIC8qIDB4RDAtMHhEMyAqLworCTB4QkIsIDB4RDQsIDB4OTcsIDB4OTgsIDB4OTcsIDB4OTksIDB4OTcsIDB4OUEsIC8qIDB4RDQtMHhENyAqLworCTB4OTcsIDB4OUIsIDB4OTcsIDB4OUMsIDB4OTcsIDB4OUQsIDB4OTcsIDB4OUUsIC8qIDB4RDgtMHhEQiAqLworCTB4QkIsIDB4RDUsIDB4OTcsIDB4OUYsIDB4OTcsIDB4QTAsIDB4QkIsIDB4RDYsIC8qIDB4REMtMHhERiAqLworCTB4OTcsIDB4QTEsIDB4QkIsIDB4RDcsIDB4OTcsIDB4QTIsIDB4OTcsIDB4QTMsIC8qIDB4RTAtMHhFMyAqLworCTB4OTcsIDB4QTQsIDB4OTcsIDB4QTUsIDB4OTcsIDB4QTYsIDB4OTcsIDB4QTcsIC8qIDB4RTQtMHhFNyAqLworCTB4OTcsIDB4QTgsIDB4OTcsIDB4QTksIDB4OTcsIDB4QUEsIDB4OTcsIDB4QUIsIC8qIDB4RTgtMHhFQiAqLworCTB4OTcsIDB4QUMsIDB4OTcsIDB4QUQsIDB4OTcsIDB4QUUsIDB4OTcsIDB4QUYsIC8qIDB4RUMtMHhFRiAqLworCTB4OTcsIDB4QjAsIDB4OTcsIDB4QjEsIDB4OTcsIDB4QjIsIDB4OTcsIDB4QjMsIC8qIDB4RjAtMHhGMyAqLworCTB4OTcsIDB4QjQsIDB4OTcsIDB4QjUsIDB4OTcsIDB4QjYsIDB4OTcsIDB4QjcsIC8qIDB4RjQtMHhGNyAqLworCTB4OTcsIDB4QjgsIDB4OTcsIDB4QjksIDB4OTcsIDB4QkEsIDB4OTcsIDB4QkIsIC8qIDB4RjgtMHhGQiAqLworCTB4OTcsIDB4QkMsIDB4OTcsIDB4QkQsIDB4OTcsIDB4QkUsIDB4OTcsIDB4QkYsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0MwWzUxMl0gPSB7CisJMHg5NywgMHhDMCwgMHg5NywgMHhDMSwgMHg5NywgMHhDMiwgMHg5NywgMHhDMywgLyogMHgwMC0weDAzICovCisJMHg5NywgMHhDNCwgMHg5NywgMHhDNSwgMHg5NywgMHhDNiwgMHg5NywgMHhDNywgLyogMHgwNC0weDA3ICovCisJMHg5NywgMHhDOCwgMHg5NywgMHhDOSwgMHg5NywgMHhDQSwgMHg5NywgMHhDQiwgLyogMHgwOC0weDBCICovCisJMHg5NywgMHhDQywgMHg5NywgMHhDRCwgMHg5NywgMHhDRSwgMHg5NywgMHhDRiwgLyogMHgwQy0weDBGICovCisJMHg5NywgMHhEMCwgMHg5NywgMHhEMSwgMHg5NywgMHhEMiwgMHg5NywgMHhEMywgLyogMHgxMC0weDEzICovCisJMHg5NywgMHhENCwgMHg5NywgMHhENSwgMHg5NywgMHhENiwgMHg5NywgMHhENywgLyogMHgxNC0weDE3ICovCisJMHg5NywgMHhEOCwgMHg5NywgMHhEOSwgMHg5NywgMHhEQSwgMHg5NywgMHhEQiwgLyogMHgxOC0weDFCICovCisJMHg5NywgMHhEQywgMHg5NywgMHhERCwgMHg5NywgMHhERSwgMHg5NywgMHhERiwgLyogMHgxQy0weDFGICovCisJMHg5NywgMHhFMCwgMHg5NywgMHhFMSwgMHg5NywgMHhFMiwgMHg5NywgMHhFMywgLyogMHgyMC0weDIzICovCisJMHg5NywgMHhFNCwgMHg5NywgMHhFNSwgMHg5NywgMHhFNiwgMHg5NywgMHhFNywgLyogMHgyNC0weDI3ICovCisJMHg5NywgMHhFOCwgMHg5NywgMHhFOSwgMHg5NywgMHhFQSwgMHg5NywgMHhFQiwgLyogMHgyOC0weDJCICovCisJMHg5NywgMHhFQywgMHg5NywgMHhFRCwgMHg5NywgMHhFRSwgMHg5NywgMHhFRiwgLyogMHgyQy0weDJGICovCisJMHg5NywgMHhGMCwgMHg5NywgMHhGMSwgMHg5NywgMHhGMiwgMHg5NywgMHhGMywgLyogMHgzMC0weDMzICovCisJMHg5NywgMHhGNCwgMHg5NywgMHhGNSwgMHg5NywgMHhGNiwgMHg5NywgMHhGNywgLyogMHgzNC0weDM3ICovCisJMHg5NywgMHhGOCwgMHg5NywgMHhGOSwgMHg5NywgMHhGQSwgMHg5NywgMHhGQiwgLyogMHgzOC0weDNCICovCisJMHhCQiwgMHhEOCwgMHg5NywgMHhGQywgMHg5NywgMHhGRCwgMHg5NywgMHhGRSwgLyogMHgzQy0weDNGICovCisJMHg5OCwgMHg0MSwgMHg5OCwgMHg0MiwgMHg5OCwgMHg0MywgMHg5OCwgMHg0NCwgLyogMHg0MC0weDQzICovCisJMHg5OCwgMHg0NSwgMHg5OCwgMHg0NiwgMHg5OCwgMHg0NywgMHg5OCwgMHg0OCwgLyogMHg0NC0weDQ3ICovCisJMHg5OCwgMHg0OSwgMHg5OCwgMHg0QSwgMHg5OCwgMHg0QiwgMHg5OCwgMHg0QywgLyogMHg0OC0weDRCICovCisJMHg5OCwgMHg0RCwgMHg5OCwgMHg0RSwgMHg5OCwgMHg0RiwgMHg5OCwgMHg1MCwgLyogMHg0Qy0weDRGICovCisJMHg5OCwgMHg1MSwgMHhCQiwgMHhEOSwgMHg5OCwgMHg1MiwgMHg5OCwgMHg1MywgLyogMHg1MC0weDUzICovCisJMHg5OCwgMHg1NCwgMHg5OCwgMHg1NSwgMHg5OCwgMHg1NiwgMHg5OCwgMHg1NywgLyogMHg1NC0weDU3ICovCisJMHhCQiwgMHhEQSwgMHg5OCwgMHg1OCwgMHg5OCwgMHg1OSwgMHg5OCwgMHg1QSwgLyogMHg1OC0weDVCICovCisJMHhCQiwgMHhEQiwgMHg5OCwgMHg2MSwgMHg5OCwgMHg2MiwgMHg5OCwgMHg2MywgLyogMHg1Qy0weDVGICovCisJMHhCQiwgMHhEQywgMHg5OCwgMHg2NCwgMHg5OCwgMHg2NSwgMHg5OCwgMHg2NiwgLyogMHg2MC0weDYzICovCisJMHg5OCwgMHg2NywgMHg5OCwgMHg2OCwgMHg5OCwgMHg2OSwgMHg5OCwgMHg2QSwgLyogMHg2NC0weDY3ICovCisJMHhCQiwgMHhERCwgMHhCQiwgMHhERSwgMHg5OCwgMHg2QiwgMHg5OCwgMHg2QywgLyogMHg2OC0weDZCICovCisJMHg5OCwgMHg2RCwgMHg5OCwgMHg2RSwgMHg5OCwgMHg2RiwgMHg5OCwgMHg3MCwgLyogMHg2Qy0weDZGICovCisJMHg5OCwgMHg3MSwgMHg5OCwgMHg3MiwgMHg5OCwgMHg3MywgMHg5OCwgMHg3NCwgLyogMHg3MC0weDczICovCisJMHg5OCwgMHg3NSwgMHg5OCwgMHg3NiwgMHg5OCwgMHg3NywgMHg5OCwgMHg3OCwgLyogMHg3NC0weDc3ICovCisJMHg5OCwgMHg3OSwgMHg5OCwgMHg3QSwgMHg5OCwgMHg4MSwgMHg5OCwgMHg4MiwgLyogMHg3OC0weDdCICovCisJMHg5OCwgMHg4MywgMHg5OCwgMHg4NCwgMHg5OCwgMHg4NSwgMHg5OCwgMHg4NiwgLyogMHg3Qy0weDdGICovCisJCisJMHg5OCwgMHg4NywgMHg5OCwgMHg4OCwgMHg5OCwgMHg4OSwgMHg5OCwgMHg4QSwgLyogMHg4MC0weDgzICovCisJMHg5OCwgMHg4QiwgMHg5OCwgMHg4QywgMHg5OCwgMHg4RCwgMHg5OCwgMHg4RSwgLyogMHg4NC0weDg3ICovCisJMHg5OCwgMHg4RiwgMHg5OCwgMHg5MCwgMHg5OCwgMHg5MSwgMHg5OCwgMHg5MiwgLyogMHg4OC0weDhCICovCisJMHg5OCwgMHg5MywgMHg5OCwgMHg5NCwgMHg5OCwgMHg5NSwgMHg5OCwgMHg5NiwgLyogMHg4Qy0weDhGICovCisJMHhCQiwgMHhERiwgMHhCQiwgMHhFMCwgMHg5OCwgMHg5NywgMHg5OCwgMHg5OCwgLyogMHg5MC0weDkzICovCisJMHhCQiwgMHhFMSwgMHg5OCwgMHg5OSwgMHg5OCwgMHg5QSwgMHg5OCwgMHg5QiwgLyogMHg5NC0weDk3ICovCisJMHhCQiwgMHhFMiwgMHg5OCwgMHg5QywgMHg5OCwgMHg5RCwgMHg5OCwgMHg5RSwgLyogMHg5OC0weDlCICovCisJMHg5OCwgMHg5RiwgMHg5OCwgMHhBMCwgMHg5OCwgMHhBMSwgMHg5OCwgMHhBMiwgLyogMHg5Qy0weDlGICovCisJMHhCQiwgMHhFMywgMHhCQiwgMHhFNCwgMHg5OCwgMHhBMywgMHhCQiwgMHhFNSwgLyogMHhBMC0weEEzICovCisJMHg5OCwgMHhBNCwgMHhCQiwgMHhFNiwgMHg5OCwgMHhBNSwgMHg5OCwgMHhBNiwgLyogMHhBNC0weEE3ICovCisJMHg5OCwgMHhBNywgMHg5OCwgMHhBOCwgMHg5OCwgMHhBOSwgMHg5OCwgMHhBQSwgLyogMHhBOC0weEFCICovCisJMHhCQiwgMHhFNywgMHhCQiwgMHhFOCwgMHg5OCwgMHhBQiwgMHhCQiwgMHhFOSwgLyogMHhBQy0weEFGICovCisJMHhCQiwgMHhFQSwgMHg5OCwgMHhBQywgMHg5OCwgMHhBRCwgMHhCQiwgMHhFQiwgLyogMHhCMC0weEIzICovCisJMHhCQiwgMHhFQywgMHhCQiwgMHhFRCwgMHhCQiwgMHhFRSwgMHg5OCwgMHhBRSwgLyogMHhCNC0weEI3ICovCisJMHg5OCwgMHhBRiwgMHg5OCwgMHhCMCwgMHg5OCwgMHhCMSwgMHg5OCwgMHhCMiwgLyogMHhCOC0weEJCICovCisJMHhCQiwgMHhFRiwgMHhCQiwgMHhGMCwgMHg5OCwgMHhCMywgMHhCQiwgMHhGMSwgLyogMHhCQy0weEJGICovCisJMHhCQiwgMHhGMiwgMHhCQiwgMHhGMywgMHg5OCwgMHhCNCwgMHg5OCwgMHhCNSwgLyogMHhDMC0weEMzICovCisJMHg5OCwgMHhCNiwgMHhCQiwgMHhGNCwgMHg5OCwgMHhCNywgMHg5OCwgMHhCOCwgLyogMHhDNC0weEM3ICovCisJMHhCQiwgMHhGNSwgMHhCQiwgMHhGNiwgMHg5OCwgMHhCOSwgMHg5OCwgMHhCQSwgLyogMHhDOC0weENCICovCisJMHhCQiwgMHhGNywgMHg5OCwgMHhCQiwgMHg5OCwgMHhCQywgMHg5OCwgMHhCRCwgLyogMHhDQy0weENGICovCisJMHhCQiwgMHhGOCwgMHg5OCwgMHhCRSwgMHg5OCwgMHhCRiwgMHg5OCwgMHhDMCwgLyogMHhEMC0weEQzICovCisJMHg5OCwgMHhDMSwgMHg5OCwgMHhDMiwgMHg5OCwgMHhDMywgMHg5OCwgMHhDNCwgLyogMHhENC0weEQ3ICovCisJMHhCQiwgMHhGOSwgMHhCQiwgMHhGQSwgMHg5OCwgMHhDNSwgMHhCQiwgMHhGQiwgLyogMHhEOC0weERCICovCisJMHhCQiwgMHhGQywgMHhCQiwgMHhGRCwgMHg5OCwgMHhDNiwgMHg5OCwgMHhDNywgLyogMHhEQy0weERGICovCisJMHg5OCwgMHhDOCwgMHg5OCwgMHhDOSwgMHg5OCwgMHhDQSwgMHg5OCwgMHhDQiwgLyogMHhFMC0weEUzICovCisJMHhCQiwgMHhGRSwgMHhCQywgMHhBMSwgMHg5OCwgMHhDQywgMHg5OCwgMHhDRCwgLyogMHhFNC0weEU3ICovCisJMHhCQywgMHhBMiwgMHg5OCwgMHhDRSwgMHg5OCwgMHhDRiwgMHg5OCwgMHhEMCwgLyogMHhFOC0weEVCICovCisJMHhCQywgMHhBMywgMHg5OCwgMHhEMSwgMHg5OCwgMHhEMiwgMHg5OCwgMHhEMywgLyogMHhFQy0weEVGICovCisJMHg5OCwgMHhENCwgMHg5OCwgMHhENSwgMHg5OCwgMHhENiwgMHg5OCwgMHhENywgLyogMHhGMC0weEYzICovCisJMHhCQywgMHhBNCwgMHhCQywgMHhBNSwgMHg5OCwgMHhEOCwgMHhCQywgMHhBNiwgLyogMHhGNC0weEY3ICovCisJMHg5OCwgMHhEOSwgMHhCQywgMHhBNywgMHg5OCwgMHhEQSwgMHg5OCwgMHhEQiwgLyogMHhGOC0weEZCICovCisJMHg5OCwgMHhEQywgMHg5OCwgMHhERCwgMHg5OCwgMHhERSwgMHg5OCwgMHhERiwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfQzFbNTEyXSA9IHsKKwkweEJDLCAweEE4LCAweDk4LCAweEUwLCAweDk4LCAweEUxLCAweDk4LCAweEUyLCAvKiAweDAwLTB4MDMgKi8KKwkweEJDLCAweEE5LCAweDk4LCAweEUzLCAweDk4LCAweEU0LCAweDk4LCAweEU1LCAvKiAweDA0LTB4MDcgKi8KKwkweEJDLCAweEFBLCAweDk4LCAweEU2LCAweDk4LCAweEU3LCAweDk4LCAweEU4LCAvKiAweDA4LTB4MEIgKi8KKwkweDk4LCAweEU5LCAweDk4LCAweEVBLCAweDk4LCAweEVCLCAweDk4LCAweEVDLCAvKiAweDBDLTB4MEYgKi8KKwkweEJDLCAweEFCLCAweDk4LCAweEVELCAweDk4LCAweEVFLCAweDk4LCAweEVGLCAvKiAweDEwLTB4MTMgKi8KKwkweDk4LCAweEYwLCAweEJDLCAweEFDLCAweDk4LCAweEYxLCAweDk4LCAweEYyLCAvKiAweDE0LTB4MTcgKi8KKwkweDk4LCAweEYzLCAweDk4LCAweEY0LCAweDk4LCAweEY1LCAweDk4LCAweEY2LCAvKiAweDE4LTB4MUIgKi8KKwkweEJDLCAweEFELCAweEJDLCAweEFFLCAweEJDLCAweEFGLCAweEJDLCAweEIwLCAvKiAweDFDLTB4MUYgKi8KKwkweEJDLCAweEIxLCAweDk4LCAweEY3LCAweDk4LCAweEY4LCAweEJDLCAweEIyLCAvKiAweDIwLTB4MjMgKi8KKwkweEJDLCAweEIzLCAweDk4LCAweEY5LCAweEJDLCAweEI0LCAweEJDLCAweEI1LCAvKiAweDI0LTB4MjcgKi8KKwkweDk4LCAweEZBLCAweDk4LCAweEZCLCAweDk4LCAweEZDLCAweDk4LCAweEZELCAvKiAweDI4LTB4MkIgKi8KKwkweEJDLCAweEI2LCAweEJDLCAweEI3LCAweDk4LCAweEZFLCAweEJDLCAweEI4LCAvKiAweDJDLTB4MkYgKi8KKwkweEJDLCAweEI5LCAweEJDLCAweEJBLCAweDk5LCAweDQxLCAweDk5LCAweDQyLCAvKiAweDMwLTB4MzMgKi8KKwkweDk5LCAweDQzLCAweDk5LCAweDQ0LCAweEJDLCAweEJCLCAweDk5LCAweDQ1LCAvKiAweDM0LTB4MzcgKi8KKwkweEJDLCAweEJDLCAweEJDLCAweEJELCAweDk5LCAweDQ2LCAweDk5LCAweDQ3LCAvKiAweDM4LTB4M0IgKi8KKwkweEJDLCAweEJFLCAweDk5LCAweDQ4LCAweDk5LCAweDQ5LCAweDk5LCAweDRBLCAvKiAweDNDLTB4M0YgKi8KKwkweEJDLCAweEJGLCAweDk5LCAweDRCLCAweDk5LCAweDRDLCAweDk5LCAweDRELCAvKiAweDQwLTB4NDMgKi8KKwkweDk5LCAweDRFLCAweDk5LCAweDRGLCAweDk5LCAweDUwLCAweDk5LCAweDUxLCAvKiAweDQ0LTB4NDcgKi8KKwkweEJDLCAweEMwLCAweEJDLCAweEMxLCAweDk5LCAweDUyLCAweEJDLCAweEMyLCAvKiAweDQ4LTB4NEIgKi8KKwkweEJDLCAweEMzLCAweEJDLCAweEM0LCAweDk5LCAweDUzLCAweDk5LCAweDU0LCAvKiAweDRDLTB4NEYgKi8KKwkweDk5LCAweDU1LCAweDk5LCAweDU2LCAweDk5LCAweDU3LCAweDk5LCAweDU4LCAvKiAweDUwLTB4NTMgKi8KKwkweEJDLCAweEM1LCAweEJDLCAweEM2LCAweDk5LCAweDU5LCAweDk5LCAweDVBLCAvKiAweDU0LTB4NTcgKi8KKwkweEJDLCAweEM3LCAweDk5LCAweDYxLCAweDk5LCAweDYyLCAweDk5LCAweDYzLCAvKiAweDU4LTB4NUIgKi8KKwkweEJDLCAweEM4LCAweDk5LCAweDY0LCAweDk5LCAweDY1LCAweDk5LCAweDY2LCAvKiAweDVDLTB4NUYgKi8KKwkweDk5LCAweDY3LCAweDk5LCAweDY4LCAweDk5LCAweDY5LCAweDk5LCAweDZBLCAvKiAweDYwLTB4NjMgKi8KKwkweEJDLCAweEM5LCAweEJDLCAweENBLCAweDk5LCAweDZCLCAweEJDLCAweENCLCAvKiAweDY0LTB4NjcgKi8KKwkweEJDLCAweENDLCAweEJDLCAweENELCAweDk5LCAweDZDLCAweDk5LCAweDZELCAvKiAweDY4LTB4NkIgKi8KKwkweDk5LCAweDZFLCAweDk5LCAweDZGLCAweDk5LCAweDcwLCAweDk5LCAweDcxLCAvKiAweDZDLTB4NkYgKi8KKwkweEJDLCAweENFLCAweDk5LCAweDcyLCAweDk5LCAweDczLCAweDk5LCAweDc0LCAvKiAweDcwLTB4NzMgKi8KKwkweEJDLCAweENGLCAweDk5LCAweDc1LCAweDk5LCAweDc2LCAweDk5LCAweDc3LCAvKiAweDc0LTB4NzcgKi8KKwkweEJDLCAweEQwLCAweDk5LCAweDc4LCAweDk5LCAweDc5LCAweDk5LCAweDdBLCAvKiAweDc4LTB4N0IgKi8KKwkweDk5LCAweDgxLCAweDk5LCAweDgyLCAweDk5LCAweDgzLCAweDk5LCAweDg0LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDk5LCAweDg1LCAweDk5LCAweDg2LCAweDk5LCAweDg3LCAweDk5LCAweDg4LCAvKiAweDgwLTB4ODMgKi8KKwkweDk5LCAweDg5LCAweEJDLCAweEQxLCAweDk5LCAweDhBLCAweDk5LCAweDhCLCAvKiAweDg0LTB4ODcgKi8KKwkweDk5LCAweDhDLCAweDk5LCAweDhELCAweDk5LCAweDhFLCAweDk5LCAweDhGLCAvKiAweDg4LTB4OEIgKi8KKwkweEJDLCAweEQyLCAweEJDLCAweEQzLCAweEJDLCAweEQ0LCAweDk5LCAweDkwLCAvKiAweDhDLTB4OEYgKi8KKwkweEJDLCAweEQ1LCAweDk5LCAweDkxLCAweDk5LCAweDkyLCAweDk5LCAweDkzLCAvKiAweDkwLTB4OTMgKi8KKwkweEJDLCAweEQ2LCAweDk5LCAweDk0LCAweEJDLCAweEQ3LCAweDk5LCAweDk1LCAvKiAweDk0LTB4OTcgKi8KKwkweDk5LCAweDk2LCAweDk5LCAweDk3LCAweDk5LCAweDk4LCAweDk5LCAweDk5LCAvKiAweDk4LTB4OUIgKi8KKwkweEJDLCAweEQ4LCAweEJDLCAweEQ5LCAweDk5LCAweDlBLCAweEJDLCAweERBLCAvKiAweDlDLTB4OUYgKi8KKwkweDk5LCAweDlCLCAweEJDLCAweERCLCAweDk5LCAweDlDLCAweDk5LCAweDlELCAvKiAweEEwLTB4QTMgKi8KKwkweDk5LCAweDlFLCAweEJDLCAweERDLCAweDk5LCAweDlGLCAweDk5LCAweEEwLCAvKiAweEE0LTB4QTcgKi8KKwkweEJDLCAweERELCAweEJDLCAweERFLCAweDk5LCAweEExLCAweDk5LCAweEEyLCAvKiAweEE4LTB4QUIgKi8KKwkweEJDLCAweERGLCAweDk5LCAweEEzLCAweDk5LCAweEE0LCAweDk5LCAweEE1LCAvKiAweEFDLTB4QUYgKi8KKwkweEJDLCAweEUwLCAweDk5LCAweEE2LCAweDk5LCAweEE3LCAweDk5LCAweEE4LCAvKiAweEIwLTB4QjMgKi8KKwkweDk5LCAweEE5LCAweDk5LCAweEFBLCAweDk5LCAweEFCLCAweDk5LCAweEFDLCAvKiAweEI0LTB4QjcgKi8KKwkweDk5LCAweEFELCAweDk5LCAweEFFLCAweDk5LCAweEFGLCAweDk5LCAweEIwLCAvKiAweEI4LTB4QkIgKi8KKwkweDk5LCAweEIxLCAweEJDLCAweEUxLCAweDk5LCAweEIyLCAweDk5LCAweEIzLCAvKiAweEJDLTB4QkYgKi8KKwkweDk5LCAweEI0LCAweDk5LCAweEI1LCAweDk5LCAweEI2LCAweDk5LCAweEI3LCAvKiAweEMwLTB4QzMgKi8KKwkweEJDLCAweEUyLCAweDk5LCAweEI4LCAweDk5LCAweEI5LCAweDk5LCAweEJBLCAvKiAweEM0LTB4QzcgKi8KKwkweEJDLCAweEUzLCAweDk5LCAweEJCLCAweDk5LCAweEJDLCAweDk5LCAweEJELCAvKiAweEM4LTB4Q0IgKi8KKwkweEJDLCAweEU0LCAweDk5LCAweEJFLCAweDk5LCAweEJGLCAweDk5LCAweEMwLCAvKiAweENDLTB4Q0YgKi8KKwkweDk5LCAweEMxLCAweDk5LCAweEMyLCAweDk5LCAweEMzLCAweDk5LCAweEM0LCAvKiAweEQwLTB4RDMgKi8KKwkweEJDLCAweEU1LCAweDk5LCAweEM1LCAweDk5LCAweEM2LCAweEJDLCAweEU2LCAvKiAweEQ0LTB4RDcgKi8KKwkweEJDLCAweEU3LCAweDk5LCAweEM3LCAweDk5LCAweEM4LCAweDk5LCAweEM5LCAvKiAweEQ4LTB4REIgKi8KKwkweDk5LCAweENBLCAweDk5LCAweENCLCAweDk5LCAweENDLCAweDk5LCAweENELCAvKiAweERDLTB4REYgKi8KKwkweEJDLCAweEU4LCAweDk5LCAweENFLCAweDk5LCAweENGLCAweDk5LCAweEQwLCAvKiAweEUwLTB4RTMgKi8KKwkweEJDLCAweEU5LCAweDk5LCAweEQxLCAweDk5LCAweEQyLCAweDk5LCAweEQzLCAvKiAweEU0LTB4RTcgKi8KKwkweEJDLCAweEVBLCAweDk5LCAweEQ0LCAweDk5LCAweEQ1LCAweDk5LCAweEQ2LCAvKiAweEU4LTB4RUIgKi8KKwkweDk5LCAweEQ3LCAweDk5LCAweEQ4LCAweDk5LCAweEQ5LCAweDk5LCAweERBLCAvKiAweEVDLTB4RUYgKi8KKwkweEJDLCAweEVCLCAweEJDLCAweEVDLCAweDk5LCAweERCLCAweEJDLCAweEVELCAvKiAweEYwLTB4RjMgKi8KKwkweDk5LCAweERDLCAweDk5LCAweERELCAweDk5LCAweERFLCAweDk5LCAweERGLCAvKiAweEY0LTB4RjcgKi8KKwkweDk5LCAweEUwLCAweDk5LCAweEUxLCAweDk5LCAweEUyLCAweDk5LCAweEUzLCAvKiAweEY4LTB4RkIgKi8KKwkweEJDLCAweEVFLCAweEJDLCAweEVGLCAweDk5LCAweEU0LCAweDk5LCAweEU1LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19DMls1MTJdID0geworCTB4QkMsIDB4RjAsIDB4OTksIDB4RTYsIDB4OTksIDB4RTcsIDB4OTksIDB4RTgsIC8qIDB4MDAtMHgwMyAqLworCTB4QkMsIDB4RjEsIDB4OTksIDB4RTksIDB4OTksIDB4RUEsIDB4OTksIDB4RUIsIC8qIDB4MDQtMHgwNyAqLworCTB4OTksIDB4RUMsIDB4OTksIDB4RUQsIDB4OTksIDB4RUUsIDB4OTksIDB4RUYsIC8qIDB4MDgtMHgwQiAqLworCTB4QkMsIDB4RjIsIDB4QkMsIDB4RjMsIDB4OTksIDB4RjAsIDB4QkMsIDB4RjQsIC8qIDB4MEMtMHgwRiAqLworCTB4OTksIDB4RjEsIDB4QkMsIDB4RjUsIDB4OTksIDB4RjIsIDB4OTksIDB4RjMsIC8qIDB4MTAtMHgxMyAqLworCTB4OTksIDB4RjQsIDB4OTksIDB4RjUsIDB4OTksIDB4RjYsIDB4OTksIDB4RjcsIC8qIDB4MTQtMHgxNyAqLworCTB4QkMsIDB4RjYsIDB4QkMsIDB4RjcsIDB4OTksIDB4RjgsIDB4OTksIDB4RjksIC8qIDB4MTgtMHgxQiAqLworCTB4QkMsIDB4RjgsIDB4OTksIDB4RkEsIDB4OTksIDB4RkIsIDB4QkMsIDB4RjksIC8qIDB4MUMtMHgxRiAqLworCTB4QkMsIDB4RkEsIDB4OTksIDB4RkMsIDB4OTksIDB4RkQsIDB4OTksIDB4RkUsIC8qIDB4MjAtMHgyMyAqLworCTB4OUEsIDB4NDEsIDB4OUEsIDB4NDIsIDB4OUEsIDB4NDMsIDB4OUEsIDB4NDQsIC8qIDB4MjQtMHgyNyAqLworCTB4QkMsIDB4RkIsIDB4QkMsIDB4RkMsIDB4OUEsIDB4NDUsIDB4QkMsIDB4RkQsIC8qIDB4MjgtMHgyQiAqLworCTB4OUEsIDB4NDYsIDB4QkMsIDB4RkUsIDB4OUEsIDB4NDcsIDB4QkQsIDB4QTEsIC8qIDB4MkMtMHgyRiAqLworCTB4OUEsIDB4NDgsIDB4QkQsIDB4QTIsIDB4QkQsIDB4QTMsIDB4OUEsIDB4NDksIC8qIDB4MzAtMHgzMyAqLworCTB4QkQsIDB4QTQsIDB4OUEsIDB4NEEsIDB4OUEsIDB4NEIsIDB4OUEsIDB4NEMsIC8qIDB4MzQtMHgzNyAqLworCTB4OUEsIDB4NEQsIDB4OUEsIDB4NEUsIDB4OUEsIDB4NEYsIDB4OUEsIDB4NTAsIC8qIDB4MzgtMHgzQiAqLworCTB4OUEsIDB4NTEsIDB4OUEsIDB4NTIsIDB4OUEsIDB4NTMsIDB4OUEsIDB4NTQsIC8qIDB4M0MtMHgzRiAqLworCTB4OUEsIDB4NTUsIDB4OUEsIDB4NTYsIDB4OUEsIDB4NTcsIDB4OUEsIDB4NTgsIC8qIDB4NDAtMHg0MyAqLworCTB4OUEsIDB4NTksIDB4OUEsIDB4NUEsIDB4OUEsIDB4NjEsIDB4OUEsIDB4NjIsIC8qIDB4NDQtMHg0NyAqLworCTB4QkQsIDB4QTUsIDB4OUEsIDB4NjMsIDB4OUEsIDB4NjQsIDB4OUEsIDB4NjUsIC8qIDB4NDgtMHg0QiAqLworCTB4OUEsIDB4NjYsIDB4OUEsIDB4NjcsIDB4OUEsIDB4NjgsIDB4OUEsIDB4NjksIC8qIDB4NEMtMHg0RiAqLworCTB4QkQsIDB4QTYsIDB4QkQsIDB4QTcsIDB4OUEsIDB4NkEsIDB4OUEsIDB4NkIsIC8qIDB4NTAtMHg1MyAqLworCTB4QkQsIDB4QTgsIDB4OUEsIDB4NkMsIDB4OUEsIDB4NkQsIDB4OUEsIDB4NkUsIC8qIDB4NTQtMHg1NyAqLworCTB4QkQsIDB4QTksIDB4OUEsIDB4NkYsIDB4OUEsIDB4NzAsIDB4OUEsIDB4NzEsIC8qIDB4NTgtMHg1QiAqLworCTB4OUEsIDB4NzIsIDB4OUEsIDB4NzMsIDB4OUEsIDB4NzQsIDB4OUEsIDB4NzUsIC8qIDB4NUMtMHg1RiAqLworCTB4QkQsIDB4QUEsIDB4OUEsIDB4NzYsIDB4OUEsIDB4NzcsIDB4OUEsIDB4NzgsIC8qIDB4NjAtMHg2MyAqLworCTB4OUEsIDB4NzksIDB4QkQsIDB4QUIsIDB4OUEsIDB4N0EsIDB4OUEsIDB4ODEsIC8qIDB4NjQtMHg2NyAqLworCTB4OUEsIDB4ODIsIDB4OUEsIDB4ODMsIDB4OUEsIDB4ODQsIDB4OUEsIDB4ODUsIC8qIDB4NjgtMHg2QiAqLworCTB4QkQsIDB4QUMsIDB4QkQsIDB4QUQsIDB4OUEsIDB4ODYsIDB4OUEsIDB4ODcsIC8qIDB4NkMtMHg2RiAqLworCTB4QkQsIDB4QUUsIDB4OUEsIDB4ODgsIDB4OUEsIDB4ODksIDB4OUEsIDB4OEEsIC8qIDB4NzAtMHg3MyAqLworCTB4QkQsIDB4QUYsIDB4OUEsIDB4OEIsIDB4OUEsIDB4OEMsIDB4OUEsIDB4OEQsIC8qIDB4NzQtMHg3NyAqLworCTB4OUEsIDB4OEUsIDB4OUEsIDB4OEYsIDB4OUEsIDB4OTAsIDB4OUEsIDB4OTEsIC8qIDB4NzgtMHg3QiAqLworCTB4QkQsIDB4QjAsIDB4QkQsIDB4QjEsIDB4OUEsIDB4OTIsIDB4QkQsIDB4QjIsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4OUEsIDB4OTMsIDB4QkQsIDB4QjMsIDB4OUEsIDB4OTQsIDB4OUEsIDB4OTUsIC8qIDB4ODAtMHg4MyAqLworCTB4OUEsIDB4OTYsIDB4OUEsIDB4OTcsIDB4OUEsIDB4OTgsIDB4OUEsIDB4OTksIC8qIDB4ODQtMHg4NyAqLworCTB4QkQsIDB4QjQsIDB4QkQsIDB4QjUsIDB4OUEsIDB4OUEsIDB4OUEsIDB4OUIsIC8qIDB4ODgtMHg4QiAqLworCTB4OUEsIDB4OUMsIDB4OUEsIDB4OUQsIDB4OUEsIDB4OUUsIDB4OUEsIDB4OUYsIC8qIDB4OEMtMHg4RiAqLworCTB4QkQsIDB4QjYsIDB4OUEsIDB4QTAsIDB4OUEsIDB4QTEsIDB4OUEsIDB4QTIsIC8qIDB4OTAtMHg5MyAqLworCTB4OUEsIDB4QTMsIDB4OUEsIDB4QTQsIDB4OUEsIDB4QTUsIDB4OUEsIDB4QTYsIC8qIDB4OTQtMHg5NyAqLworCTB4QkQsIDB4QjcsIDB4OUEsIDB4QTcsIDB4OUEsIDB4QTgsIDB4QkQsIDB4QjgsIC8qIDB4OTgtMHg5QiAqLworCTB4OUEsIDB4QTksIDB4QkQsIDB4QjksIDB4OUEsIDB4QUEsIDB4OUEsIDB4QUIsIC8qIDB4OUMtMHg5RiAqLworCTB4OUEsIDB4QUMsIDB4OUEsIDB4QUQsIDB4OUEsIDB4QUUsIDB4OUEsIDB4QUYsIC8qIDB4QTAtMHhBMyAqLworCTB4QkQsIDB4QkEsIDB4QkQsIDB4QkIsIDB4OUEsIDB4QjAsIDB4OUEsIDB4QjEsIC8qIDB4QTQtMHhBNyAqLworCTB4QkQsIDB4QkMsIDB4OUEsIDB4QjIsIDB4OUEsIDB4QjMsIDB4OUEsIDB4QjQsIC8qIDB4QTgtMHhBQiAqLworCTB4QkQsIDB4QkQsIDB4QkQsIDB4QkUsIDB4OUEsIDB4QjUsIDB4OUEsIDB4QjYsIC8qIDB4QUMtMHhBRiAqLworCTB4OUEsIDB4QjcsIDB4OUEsIDB4QjgsIDB4OUEsIDB4QjksIDB4OUEsIDB4QkEsIC8qIDB4QjAtMHhCMyAqLworCTB4QkQsIDB4QkYsIDB4QkQsIDB4QzAsIDB4OUEsIDB4QkIsIDB4QkQsIDB4QzEsIC8qIDB4QjQtMHhCNyAqLworCTB4OUEsIDB4QkMsIDB4QkQsIDB4QzIsIDB4OUEsIDB4QkQsIDB4OUEsIDB4QkUsIC8qIDB4QjgtMHhCQiAqLworCTB4OUEsIDB4QkYsIDB4OUEsIDB4QzAsIDB4OUEsIDB4QzEsIDB4OUEsIDB4QzIsIC8qIDB4QkMtMHhCRiAqLworCTB4OUEsIDB4QzMsIDB4OUEsIDB4QzQsIDB4OUEsIDB4QzUsIDB4OUEsIDB4QzYsIC8qIDB4QzAtMHhDMyAqLworCTB4OUEsIDB4QzcsIDB4OUEsIDB4QzgsIDB4OUEsIDB4QzksIDB4OUEsIDB4Q0EsIC8qIDB4QzQtMHhDNyAqLworCTB4OUEsIDB4Q0IsIDB4OUEsIDB4Q0MsIDB4OUEsIDB4Q0QsIDB4OUEsIDB4Q0UsIC8qIDB4QzgtMHhDQiAqLworCTB4OUEsIDB4Q0YsIDB4OUEsIDB4RDAsIDB4OUEsIDB4RDEsIDB4OUEsIDB4RDIsIC8qIDB4Q0MtMHhDRiAqLworCTB4OUEsIDB4RDMsIDB4OUEsIDB4RDQsIDB4OUEsIDB4RDUsIDB4OUEsIDB4RDYsIC8qIDB4RDAtMHhEMyAqLworCTB4OUEsIDB4RDcsIDB4OUEsIDB4RDgsIDB4OUEsIDB4RDksIDB4OUEsIDB4REEsIC8qIDB4RDQtMHhENyAqLworCTB4OUEsIDB4REIsIDB4OUEsIDB4REMsIDB4OUEsIDB4REQsIDB4OUEsIDB4REUsIC8qIDB4RDgtMHhEQiAqLworCTB4QkQsIDB4QzMsIDB4QkQsIDB4QzQsIDB4OUEsIDB4REYsIDB4OUEsIDB4RTAsIC8qIDB4REMtMHhERiAqLworCTB4QkQsIDB4QzUsIDB4OUEsIDB4RTEsIDB4OUEsIDB4RTIsIDB4QkQsIDB4QzYsIC8qIDB4RTAtMHhFMyAqLworCTB4QkQsIDB4QzcsIDB4OUEsIDB4RTMsIDB4OUEsIDB4RTQsIDB4OUEsIDB4RTUsIC8qIDB4RTQtMHhFNyAqLworCTB4OUEsIDB4RTYsIDB4OUEsIDB4RTcsIDB4OUEsIDB4RTgsIDB4QkQsIDB4QzgsIC8qIDB4RTgtMHhFQiAqLworCTB4QkQsIDB4QzksIDB4QkQsIDB4Q0EsIDB4OUEsIDB4RTksIDB4QkQsIDB4Q0IsIC8qIDB4RUMtMHhFRiAqLworCTB4OUEsIDB4RUEsIDB4QkQsIDB4Q0MsIDB4OUEsIDB4RUIsIDB4OUEsIDB4RUMsIC8qIDB4RjAtMHhGMyAqLworCTB4OUEsIDB4RUQsIDB4OUEsIDB4RUUsIDB4QkQsIDB4Q0QsIDB4OUEsIDB4RUYsIC8qIDB4RjQtMHhGNyAqLworCTB4QkQsIDB4Q0UsIDB4QkQsIDB4Q0YsIDB4OUEsIDB4RjAsIDB4QkQsIDB4RDAsIC8qIDB4RjgtMHhGQiAqLworCTB4QkQsIDB4RDEsIDB4OUEsIDB4RjEsIDB4OUEsIDB4RjIsIDB4OUEsIDB4RjMsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0MzWzUxMl0gPSB7CisJMHhCRCwgMHhEMiwgMHg5QSwgMHhGNCwgMHg5QSwgMHhGNSwgMHg5QSwgMHhGNiwgLyogMHgwMC0weDAzICovCisJMHg5QSwgMHhGNywgMHg5QSwgMHhGOCwgMHg5QSwgMHhGOSwgMHg5QSwgMHhGQSwgLyogMHgwNC0weDA3ICovCisJMHhCRCwgMHhEMywgMHhCRCwgMHhENCwgMHg5QSwgMHhGQiwgMHg5QSwgMHhGQywgLyogMHgwOC0weDBCICovCisJMHhCRCwgMHhENSwgMHhCRCwgMHhENiwgMHg5QSwgMHhGRCwgMHg5QSwgMHhGRSwgLyogMHgwQy0weDBGICovCisJMHg5QiwgMHg0MSwgMHg5QiwgMHg0MiwgMHg5QiwgMHg0MywgMHhCRCwgMHhENywgLyogMHgxMC0weDEzICovCisJMHhCRCwgMHhEOCwgMHhCRCwgMHhEOSwgMHg5QiwgMHg0NCwgMHg5QiwgMHg0NSwgLyogMHgxNC0weDE3ICovCisJMHhCRCwgMHhEQSwgMHg5QiwgMHg0NiwgMHg5QiwgMHg0NywgMHg5QiwgMHg0OCwgLyogMHgxOC0weDFCICovCisJMHhCRCwgMHhEQiwgMHg5QiwgMHg0OSwgMHg5QiwgMHg0QSwgMHg5QiwgMHg0QiwgLyogMHgxQy0weDFGICovCisJMHg5QiwgMHg0QywgMHg5QiwgMHg0RCwgMHg5QiwgMHg0RSwgMHg5QiwgMHg0RiwgLyogMHgyMC0weDIzICovCisJMHhCRCwgMHhEQywgMHhCRCwgMHhERCwgMHg5QiwgMHg1MCwgMHg5QiwgMHg1MSwgLyogMHgyNC0weDI3ICovCisJMHhCRCwgMHhERSwgMHhCRCwgMHhERiwgMHg5QiwgMHg1MiwgMHg5QiwgMHg1MywgLyogMHgyOC0weDJCICovCisJMHg5QiwgMHg1NCwgMHg5QiwgMHg1NSwgMHg5QiwgMHg1NiwgMHg5QiwgMHg1NywgLyogMHgyQy0weDJGICovCisJMHg5QiwgMHg1OCwgMHg5QiwgMHg1OSwgMHg5QiwgMHg1QSwgMHg5QiwgMHg2MSwgLyogMHgzMC0weDMzICovCisJMHg5QiwgMHg2MiwgMHg5QiwgMHg2MywgMHg5QiwgMHg2NCwgMHg5QiwgMHg2NSwgLyogMHgzNC0weDM3ICovCisJMHg5QiwgMHg2NiwgMHg5QiwgMHg2NywgMHg5QiwgMHg2OCwgMHg5QiwgMHg2OSwgLyogMHgzOC0weDNCICovCisJMHg5QiwgMHg2QSwgMHg5QiwgMHg2QiwgMHg5QiwgMHg2QywgMHg5QiwgMHg2RCwgLyogMHgzQy0weDNGICovCisJMHg5QiwgMHg2RSwgMHg5QiwgMHg2RiwgMHg5QiwgMHg3MCwgMHg5QiwgMHg3MSwgLyogMHg0MC0weDQzICovCisJMHg5QiwgMHg3MiwgMHhCRCwgMHhFMCwgMHg5QiwgMHg3MywgMHg5QiwgMHg3NCwgLyogMHg0NC0weDQ3ICovCisJMHg5QiwgMHg3NSwgMHg5QiwgMHg3NiwgMHg5QiwgMHg3NywgMHg5QiwgMHg3OCwgLyogMHg0OC0weDRCICovCisJMHg5QiwgMHg3OSwgMHg5QiwgMHg3QSwgMHg5QiwgMHg4MSwgMHg5QiwgMHg4MiwgLyogMHg0Qy0weDRGICovCisJMHg5QiwgMHg4MywgMHg5QiwgMHg4NCwgMHg5QiwgMHg4NSwgMHg5QiwgMHg4NiwgLyogMHg1MC0weDUzICovCisJMHg5QiwgMHg4NywgMHg5QiwgMHg4OCwgMHg5QiwgMHg4OSwgMHg5QiwgMHg4QSwgLyogMHg1NC0weDU3ICovCisJMHg5QiwgMHg4QiwgMHg5QiwgMHg4QywgMHg5QiwgMHg4RCwgMHg5QiwgMHg4RSwgLyogMHg1OC0weDVCICovCisJMHg5QiwgMHg4RiwgMHg5QiwgMHg5MCwgMHg5QiwgMHg5MSwgMHg5QiwgMHg5MiwgLyogMHg1Qy0weDVGICovCisJMHg5QiwgMHg5MywgMHg5QiwgMHg5NCwgMHg5QiwgMHg5NSwgMHg5QiwgMHg5NiwgLyogMHg2MC0weDYzICovCisJMHg5QiwgMHg5NywgMHg5QiwgMHg5OCwgMHg5QiwgMHg5OSwgMHg5QiwgMHg5QSwgLyogMHg2NC0weDY3ICovCisJMHhCRCwgMHhFMSwgMHhCRCwgMHhFMiwgMHg5QiwgMHg5QiwgMHg5QiwgMHg5QywgLyogMHg2OC0weDZCICovCisJMHhCRCwgMHhFMywgMHg5QiwgMHg5RCwgMHg5QiwgMHg5RSwgMHg5QiwgMHg5RiwgLyogMHg2Qy0weDZGICovCisJMHhCRCwgMHhFNCwgMHg5QiwgMHhBMCwgMHhCRCwgMHhFNSwgMHg5QiwgMHhBMSwgLyogMHg3MC0weDczICovCisJMHg5QiwgMHhBMiwgMHg5QiwgMHhBMywgMHg5QiwgMHhBNCwgMHg5QiwgMHhBNSwgLyogMHg3NC0weDc3ICovCisJMHhCRCwgMHhFNiwgMHhCRCwgMHhFNywgMHg5QiwgMHhBNiwgMHg5QiwgMHhBNywgLyogMHg3OC0weDdCICovCisJMHhCRCwgMHhFOCwgMHhCRCwgMHhFOSwgMHg5QiwgMHhBOCwgMHg5QiwgMHhBOSwgLyogMHg3Qy0weDdGICovCisJCisJMHg5QiwgMHhBQSwgMHg5QiwgMHhBQiwgMHg5QiwgMHhBQywgMHg5QiwgMHhBRCwgLyogMHg4MC0weDgzICovCisJMHhCRCwgMHhFQSwgMHg5QiwgMHhBRSwgMHg5QiwgMHhBRiwgMHg5QiwgMHhCMCwgLyogMHg4NC0weDg3ICovCisJMHhCRCwgMHhFQiwgMHg5QiwgMHhCMSwgMHg5QiwgMHhCMiwgMHg5QiwgMHhCMywgLyogMHg4OC0weDhCICovCisJMHhCRCwgMHhFQywgMHg5QiwgMHhCNCwgMHg5QiwgMHhCNSwgMHg5QiwgMHhCNiwgLyogMHg4Qy0weDhGICovCisJMHg5QiwgMHhCNywgMHg5QiwgMHhCOCwgMHg5QiwgMHhCOSwgMHg5QiwgMHhCQSwgLyogMHg5MC0weDkzICovCisJMHg5QiwgMHhCQiwgMHg5QiwgMHhCQywgMHg5QiwgMHhCRCwgMHg5QiwgMHhCRSwgLyogMHg5NC0weDk3ICovCisJMHg5QiwgMHhCRiwgMHg5QiwgMHhDMCwgMHg5QiwgMHhDMSwgMHg5QiwgMHhDMiwgLyogMHg5OC0weDlCICovCisJMHg5QiwgMHhDMywgMHg5QiwgMHhDNCwgMHg5QiwgMHhDNSwgMHg5QiwgMHhDNiwgLyogMHg5Qy0weDlGICovCisJMHg5QiwgMHhDNywgMHg5QiwgMHhDOCwgMHg5QiwgMHhDOSwgMHg5QiwgMHhDQSwgLyogMHhBMC0weEEzICovCisJMHg5QiwgMHhDQiwgMHg5QiwgMHhDQywgMHg5QiwgMHhDRCwgMHg5QiwgMHhDRSwgLyogMHhBNC0weEE3ICovCisJMHg5QiwgMHhDRiwgMHg5QiwgMHhEMCwgMHg5QiwgMHhEMSwgMHg5QiwgMHhEMiwgLyogMHhBOC0weEFCICovCisJMHg5QiwgMHhEMywgMHg5QiwgMHhENCwgMHg5QiwgMHhENSwgMHg5QiwgMHhENiwgLyogMHhBQy0weEFGICovCisJMHg5QiwgMHhENywgMHg5QiwgMHhEOCwgMHg5QiwgMHhEOSwgMHg5QiwgMHhEQSwgLyogMHhCMC0weEIzICovCisJMHg5QiwgMHhEQiwgMHg5QiwgMHhEQywgMHg5QiwgMHhERCwgMHg5QiwgMHhERSwgLyogMHhCNC0weEI3ICovCisJMHg5QiwgMHhERiwgMHg5QiwgMHhFMCwgMHg5QiwgMHhFMSwgMHg5QiwgMHhFMiwgLyogMHhCOC0weEJCICovCisJMHg5QiwgMHhFMywgMHg5QiwgMHhFNCwgMHg5QiwgMHhFNSwgMHg5QiwgMHhFNiwgLyogMHhCQy0weEJGICovCisJMHhCRCwgMHhFRCwgMHg5QiwgMHhFNywgMHg5QiwgMHhFOCwgMHg5QiwgMHhFOSwgLyogMHhDMC0weEMzICovCisJMHg5QiwgMHhFQSwgMHg5QiwgMHhFQiwgMHg5QiwgMHhFQywgMHg5QiwgMHhFRCwgLyogMHhDNC0weEM3ICovCisJMHg5QiwgMHhFRSwgMHg5QiwgMHhFRiwgMHg5QiwgMHhGMCwgMHg5QiwgMHhGMSwgLyogMHhDOC0weENCICovCisJMHg5QiwgMHhGMiwgMHg5QiwgMHhGMywgMHg5QiwgMHhGNCwgMHg5QiwgMHhGNSwgLyogMHhDQy0weENGICovCisJMHg5QiwgMHhGNiwgMHg5QiwgMHhGNywgMHg5QiwgMHhGOCwgMHg5QiwgMHhGOSwgLyogMHhEMC0weEQzICovCisJMHg5QiwgMHhGQSwgMHg5QiwgMHhGQiwgMHg5QiwgMHhGQywgMHg5QiwgMHhGRCwgLyogMHhENC0weEQ3ICovCisJMHhCRCwgMHhFRSwgMHhCRCwgMHhFRiwgMHg5QiwgMHhGRSwgMHg5QywgMHg0MSwgLyogMHhEOC0weERCICovCisJMHhCRCwgMHhGMCwgMHg5QywgMHg0MiwgMHg5QywgMHg0MywgMHhCRCwgMHhGMSwgLyogMHhEQy0weERGICovCisJMHhCRCwgMHhGMiwgMHg5QywgMHg0NCwgMHhCRCwgMHhGMywgMHg5QywgMHg0NSwgLyogMHhFMC0weEUzICovCisJMHg5QywgMHg0NiwgMHg5QywgMHg0NywgMHg5QywgMHg0OCwgMHg5QywgMHg0OSwgLyogMHhFNC0weEU3ICovCisJMHhCRCwgMHhGNCwgMHhCRCwgMHhGNSwgMHg5QywgMHg0QSwgMHg5QywgMHg0QiwgLyogMHhFOC0weEVCICovCisJMHg5QywgMHg0QywgMHhCRCwgMHhGNiwgMHg5QywgMHg0RCwgMHg5QywgMHg0RSwgLyogMHhFQy0weEVGICovCisJMHg5QywgMHg0RiwgMHg5QywgMHg1MCwgMHg5QywgMHg1MSwgMHg5QywgMHg1MiwgLyogMHhGMC0weEYzICovCisJMHhCRCwgMHhGNywgMHhCRCwgMHhGOCwgMHg5QywgMHg1MywgMHg5QywgMHg1NCwgLyogMHhGNC0weEY3ICovCisJMHhCRCwgMHhGOSwgMHg5QywgMHg1NSwgMHg5QywgMHg1NiwgMHg5QywgMHg1NywgLyogMHhGOC0weEZCICovCisJMHg5QywgMHg1OCwgMHg5QywgMHg1OSwgMHg5QywgMHg1QSwgMHg5QywgMHg2MSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfQzRbNTEyXSA9IHsKKwkweDlDLCAweDYyLCAweDlDLCAweDYzLCAweDlDLCAweDY0LCAweDlDLCAweDY1LCAvKiAweDAwLTB4MDMgKi8KKwkweDlDLCAweDY2LCAweDlDLCAweDY3LCAweDlDLCAweDY4LCAweDlDLCAweDY5LCAvKiAweDA0LTB4MDcgKi8KKwkweEJELCAweEZBLCAweDlDLCAweDZBLCAweDlDLCAweDZCLCAweDlDLCAweDZDLCAvKiAweDA4LTB4MEIgKi8KKwkweDlDLCAweDZELCAweDlDLCAweDZFLCAweDlDLCAweDZGLCAweDlDLCAweDcwLCAvKiAweDBDLTB4MEYgKi8KKwkweEJELCAweEZCLCAweDlDLCAweDcxLCAweDlDLCAweDcyLCAweDlDLCAweDczLCAvKiAweDEwLTB4MTMgKi8KKwkweDlDLCAweDc0LCAweDlDLCAweDc1LCAweDlDLCAweDc2LCAweDlDLCAweDc3LCAvKiAweDE0LTB4MTcgKi8KKwkweDlDLCAweDc4LCAweDlDLCAweDc5LCAweDlDLCAweDdBLCAweDlDLCAweDgxLCAvKiAweDE4LTB4MUIgKi8KKwkweDlDLCAweDgyLCAweDlDLCAweDgzLCAweDlDLCAweDg0LCAweDlDLCAweDg1LCAvKiAweDFDLTB4MUYgKi8KKwkweDlDLCAweDg2LCAweDlDLCAweDg3LCAweDlDLCAweDg4LCAweDlDLCAweDg5LCAvKiAweDIwLTB4MjMgKi8KKwkweEJELCAweEZDLCAweDlDLCAweDhBLCAweDlDLCAweDhCLCAweDlDLCAweDhDLCAvKiAweDI0LTB4MjcgKi8KKwkweDlDLCAweDhELCAweDlDLCAweDhFLCAweDlDLCAweDhGLCAweDlDLCAweDkwLCAvKiAweDI4LTB4MkIgKi8KKwkweEJELCAweEZELCAweDlDLCAweDkxLCAweDlDLCAweDkyLCAweDlDLCAweDkzLCAvKiAweDJDLTB4MkYgKi8KKwkweEJELCAweEZFLCAweDlDLCAweDk0LCAweDlDLCAweDk1LCAweDlDLCAweDk2LCAvKiAweDMwLTB4MzMgKi8KKwkweEJFLCAweEExLCAweDlDLCAweDk3LCAweDlDLCAweDk4LCAweDlDLCAweDk5LCAvKiAweDM0LTB4MzcgKi8KKwkweDlDLCAweDlBLCAweDlDLCAweDlCLCAweDlDLCAweDlDLCAweDlDLCAweDlELCAvKiAweDM4LTB4M0IgKi8KKwkweEJFLCAweEEyLCAweEJFLCAweEEzLCAweDlDLCAweDlFLCAweDlDLCAweDlGLCAvKiAweDNDLTB4M0YgKi8KKwkweDlDLCAweEEwLCAweDlDLCAweEExLCAweDlDLCAweEEyLCAweDlDLCAweEEzLCAvKiAweDQwLTB4NDMgKi8KKwkweDlDLCAweEE0LCAweDlDLCAweEE1LCAweDlDLCAweEE2LCAweDlDLCAweEE3LCAvKiAweDQ0LTB4NDcgKi8KKwkweEJFLCAweEE0LCAweDlDLCAweEE4LCAweDlDLCAweEE5LCAweDlDLCAweEFBLCAvKiAweDQ4LTB4NEIgKi8KKwkweDlDLCAweEFCLCAweDlDLCAweEFDLCAweDlDLCAweEFELCAweDlDLCAweEFFLCAvKiAweDRDLTB4NEYgKi8KKwkweDlDLCAweEFGLCAweDlDLCAweEIwLCAweDlDLCAweEIxLCAweDlDLCAweEIyLCAvKiAweDUwLTB4NTMgKi8KKwkweDlDLCAweEIzLCAweDlDLCAweEI0LCAweDlDLCAweEI1LCAweDlDLCAweEI2LCAvKiAweDU0LTB4NTcgKi8KKwkweDlDLCAweEI3LCAweDlDLCAweEI4LCAweDlDLCAweEI5LCAweDlDLCAweEJBLCAvKiAweDU4LTB4NUIgKi8KKwkweDlDLCAweEJCLCAweDlDLCAweEJDLCAweDlDLCAweEJELCAweDlDLCAweEJFLCAvKiAweDVDLTB4NUYgKi8KKwkweDlDLCAweEJGLCAweDlDLCAweEMwLCAweDlDLCAweEMxLCAweDlDLCAweEMyLCAvKiAweDYwLTB4NjMgKi8KKwkweEJFLCAweEE1LCAweEJFLCAweEE2LCAweDlDLCAweEMzLCAweDlDLCAweEM0LCAvKiAweDY0LTB4NjcgKi8KKwkweEJFLCAweEE3LCAweDlDLCAweEM1LCAweDlDLCAweEM2LCAweDlDLCAweEM3LCAvKiAweDY4LTB4NkIgKi8KKwkweEJFLCAweEE4LCAweDlDLCAweEM4LCAweDlDLCAweEM5LCAweDlDLCAweENBLCAvKiAweDZDLTB4NkYgKi8KKwkweDlDLCAweENCLCAweDlDLCAweENDLCAweDlDLCAweENELCAweDlDLCAweENFLCAvKiAweDcwLTB4NzMgKi8KKwkweEJFLCAweEE5LCAweEJFLCAweEFBLCAweDlDLCAweENGLCAweDlDLCAweEQwLCAvKiAweDc0LTB4NzcgKi8KKwkweDlDLCAweEQxLCAweEJFLCAweEFCLCAweDlDLCAweEQyLCAweDlDLCAweEQzLCAvKiAweDc4LTB4N0IgKi8KKwkweDlDLCAweEQ0LCAweDlDLCAweEQ1LCAweDlDLCAweEQ2LCAweDlDLCAweEQ3LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEJFLCAweEFDLCAweDlDLCAweEQ4LCAweDlDLCAweEQ5LCAweDlDLCAweERBLCAvKiAweDgwLTB4ODMgKi8KKwkweDlDLCAweERCLCAweDlDLCAweERDLCAweDlDLCAweERELCAweDlDLCAweERFLCAvKiAweDg0LTB4ODcgKi8KKwkweDlDLCAweERGLCAweDlDLCAweEUwLCAweDlDLCAweEUxLCAweDlDLCAweEUyLCAvKiAweDg4LTB4OEIgKi8KKwkweDlDLCAweEUzLCAweDlDLCAweEU0LCAweDlDLCAweEU1LCAweDlDLCAweEU2LCAvKiAweDhDLTB4OEYgKi8KKwkweDlDLCAweEU3LCAweDlDLCAweEU4LCAweDlDLCAweEU5LCAweDlDLCAweEVBLCAvKiAweDkwLTB4OTMgKi8KKwkweEJFLCAweEFELCAweDlDLCAweEVCLCAweDlDLCAweEVDLCAweDlDLCAweEVELCAvKiAweDk0LTB4OTcgKi8KKwkweDlDLCAweEVFLCAweDlDLCAweEVGLCAweDlDLCAweEYwLCAweDlDLCAweEYxLCAvKiAweDk4LTB4OUIgKi8KKwkweEJFLCAweEFFLCAweDlDLCAweEYyLCAweDlDLCAweEYzLCAweDlDLCAweEY0LCAvKiAweDlDLTB4OUYgKi8KKwkweDlDLCAweEY1LCAweDlDLCAweEY2LCAweDlDLCAweEY3LCAweDlDLCAweEY4LCAvKiAweEEwLTB4QTMgKi8KKwkweDlDLCAweEY5LCAweDlDLCAweEZBLCAweDlDLCAweEZCLCAweDlDLCAweEZDLCAvKiAweEE0LTB4QTcgKi8KKwkweDlDLCAweEZELCAweDlDLCAweEZFLCAweDlELCAweDQxLCAweDlELCAweDQyLCAvKiAweEE4LTB4QUIgKi8KKwkweDlELCAweDQzLCAweDlELCAweDQ0LCAweDlELCAweDQ1LCAweDlELCAweDQ2LCAvKiAweEFDLTB4QUYgKi8KKwkweDlELCAweDQ3LCAweDlELCAweDQ4LCAweDlELCAweDQ5LCAweDlELCAweDRBLCAvKiAweEIwLTB4QjMgKi8KKwkweDlELCAweDRCLCAweDlELCAweDRDLCAweDlELCAweDRELCAweDlELCAweDRFLCAvKiAweEI0LTB4QjcgKi8KKwkweEJFLCAweEFGLCAweDlELCAweDRGLCAweDlELCAweDUwLCAweDlELCAweDUxLCAvKiAweEI4LTB4QkIgKi8KKwkweEJFLCAweEIwLCAweDlELCAweDUyLCAweDlELCAweDUzLCAweDlELCAweDU0LCAvKiAweEJDLTB4QkYgKi8KKwkweDlELCAweDU1LCAweDlELCAweDU2LCAweDlELCAweDU3LCAweDlELCAweDU4LCAvKiAweEMwLTB4QzMgKi8KKwkweDlELCAweDU5LCAweDlELCAweDVBLCAweDlELCAweDYxLCAweDlELCAweDYyLCAvKiAweEM0LTB4QzcgKi8KKwkweDlELCAweDYzLCAweDlELCAweDY0LCAweDlELCAweDY1LCAweDlELCAweDY2LCAvKiAweEM4LTB4Q0IgKi8KKwkweDlELCAweDY3LCAweDlELCAweDY4LCAweDlELCAweDY5LCAweDlELCAweDZBLCAvKiAweENDLTB4Q0YgKi8KKwkweDlELCAweDZCLCAweDlELCAweDZDLCAweDlELCAweDZELCAweDlELCAweDZFLCAvKiAweEQwLTB4RDMgKi8KKwkweDlELCAweDZGLCAweDlELCAweDcwLCAweDlELCAweDcxLCAweDlELCAweDcyLCAvKiAweEQ0LTB4RDcgKi8KKwkweDlELCAweDczLCAweDlELCAweDc0LCAweDlELCAweDc1LCAweDlELCAweDc2LCAvKiAweEQ4LTB4REIgKi8KKwkweDlELCAweDc3LCAweDlELCAweDc4LCAweDlELCAweDc5LCAweDlELCAweDdBLCAvKiAweERDLTB4REYgKi8KKwkweDlELCAweDgxLCAweDlELCAweDgyLCAweDlELCAweDgzLCAweDlELCAweDg0LCAvKiAweEUwLTB4RTMgKi8KKwkweDlELCAweDg1LCAweDlELCAweDg2LCAweDlELCAweDg3LCAweDlELCAweDg4LCAvKiAweEU0LTB4RTcgKi8KKwkweDlELCAweDg5LCAweEJFLCAweEIxLCAweDlELCAweDhBLCAweDlELCAweDhCLCAvKiAweEU4LTB4RUIgKi8KKwkweDlELCAweDhDLCAweDlELCAweDhELCAweDlELCAweDhFLCAweDlELCAweDhGLCAvKiAweEVDLTB4RUYgKi8KKwkweEJFLCAweEIyLCAweEJFLCAweEIzLCAweDlELCAweDkwLCAweDlELCAweDkxLCAvKiAweEYwLTB4RjMgKi8KKwkweEJFLCAweEI0LCAweDlELCAweDkyLCAweDlELCAweDkzLCAweDlELCAweDk0LCAvKiAweEY0LTB4RjcgKi8KKwkweEJFLCAweEI1LCAweDlELCAweDk1LCAweEJFLCAweEI2LCAweDlELCAweDk2LCAvKiAweEY4LTB4RkIgKi8KKwkweDlELCAweDk3LCAweDlELCAweDk4LCAweDlELCAweDk5LCAweEJFLCAweEI3LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19DNVs1MTJdID0geworCTB4QkUsIDB4QjgsIDB4QkUsIDB4QjksIDB4OUQsIDB4OUEsIDB4OUQsIDB4OUIsIC8qIDB4MDAtMHgwMyAqLworCTB4OUQsIDB4OUMsIDB4OUQsIDB4OUQsIDB4OUQsIDB4OUUsIDB4OUQsIDB4OUYsIC8qIDB4MDQtMHgwNyAqLworCTB4OUQsIDB4QTAsIDB4OUQsIDB4QTEsIDB4OUQsIDB4QTIsIDB4OUQsIDB4QTMsIC8qIDB4MDgtMHgwQiAqLworCTB4QkUsIDB4QkEsIDB4OUQsIDB4QTQsIDB4OUQsIDB4QTUsIDB4OUQsIDB4QTYsIC8qIDB4MEMtMHgwRiAqLworCTB4QkUsIDB4QkIsIDB4OUQsIDB4QTcsIDB4OUQsIDB4QTgsIDB4OUQsIDB4QTksIC8qIDB4MTAtMHgxMyAqLworCTB4QkUsIDB4QkMsIDB4OUQsIDB4QUEsIDB4OUQsIDB4QUIsIDB4OUQsIDB4QUMsIC8qIDB4MTQtMHgxNyAqLworCTB4OUQsIDB4QUQsIDB4OUQsIDB4QUUsIDB4OUQsIDB4QUYsIDB4OUQsIDB4QjAsIC8qIDB4MTgtMHgxQiAqLworCTB4QkUsIDB4QkQsIDB4OUQsIDB4QjEsIDB4OUQsIDB4QjIsIDB4OUQsIDB4QjMsIC8qIDB4MUMtMHgxRiAqLworCTB4OUQsIDB4QjQsIDB4OUQsIDB4QjUsIDB4OUQsIDB4QjYsIDB4OUQsIDB4QjcsIC8qIDB4MjAtMHgyMyAqLworCTB4OUQsIDB4QjgsIDB4OUQsIDB4QjksIDB4OUQsIDB4QkEsIDB4OUQsIDB4QkIsIC8qIDB4MjQtMHgyNyAqLworCTB4QkUsIDB4QkUsIDB4QkUsIDB4QkYsIDB4OUQsIDB4QkMsIDB4OUQsIDB4QkQsIC8qIDB4MjgtMHgyQiAqLworCTB4QkUsIDB4QzAsIDB4OUQsIDB4QkUsIDB4OUQsIDB4QkYsIDB4OUQsIDB4QzAsIC8qIDB4MkMtMHgyRiAqLworCTB4QkUsIDB4QzEsIDB4OUQsIDB4QzEsIDB4OUQsIDB4QzIsIDB4OUQsIDB4QzMsIC8qIDB4MzAtMHgzMyAqLworCTB4OUQsIDB4QzQsIDB4OUQsIDB4QzUsIDB4OUQsIDB4QzYsIDB4OUQsIDB4QzcsIC8qIDB4MzQtMHgzNyAqLworCTB4QkUsIDB4QzIsIDB4QkUsIDB4QzMsIDB4OUQsIDB4QzgsIDB4QkUsIDB4QzQsIC8qIDB4MzgtMHgzQiAqLworCTB4OUQsIDB4QzksIDB4QkUsIDB4QzUsIDB4OUQsIDB4Q0EsIDB4OUQsIDB4Q0IsIC8qIDB4M0MtMHgzRiAqLworCTB4OUQsIDB4Q0MsIDB4OUQsIDB4Q0QsIDB4OUQsIDB4Q0UsIDB4OUQsIDB4Q0YsIC8qIDB4NDAtMHg0MyAqLworCTB4QkUsIDB4QzYsIDB4QkUsIDB4QzcsIDB4OUQsIDB4RDAsIDB4OUQsIDB4RDEsIC8qIDB4NDQtMHg0NyAqLworCTB4QkUsIDB4QzgsIDB4QkUsIDB4QzksIDB4QkUsIDB4Q0EsIDB4OUQsIDB4RDIsIC8qIDB4NDgtMHg0QiAqLworCTB4QkUsIDB4Q0IsIDB4QkUsIDB4Q0MsIDB4QkUsIDB4Q0QsIDB4OUQsIDB4RDMsIC8qIDB4NEMtMHg0RiAqLworCTB4OUQsIDB4RDQsIDB4OUQsIDB4RDUsIDB4OUQsIDB4RDYsIDB4QkUsIDB4Q0UsIC8qIDB4NTAtMHg1MyAqLworCTB4QkUsIDB4Q0YsIDB4QkUsIDB4RDAsIDB4OUQsIDB4RDcsIDB4QkUsIDB4RDEsIC8qIDB4NTQtMHg1NyAqLworCTB4QkUsIDB4RDIsIDB4QkUsIDB4RDMsIDB4OUQsIDB4RDgsIDB4OUQsIDB4RDksIC8qIDB4NTgtMHg1QiAqLworCTB4OUQsIDB4REEsIDB4QkUsIDB4RDQsIDB4QkUsIDB4RDUsIDB4OUQsIDB4REIsIC8qIDB4NUMtMHg1RiAqLworCTB4QkUsIDB4RDYsIDB4QkUsIDB4RDcsIDB4OUQsIDB4REMsIDB4OUQsIDB4REQsIC8qIDB4NjAtMHg2MyAqLworCTB4QkUsIDB4RDgsIDB4OUQsIDB4REUsIDB4OUQsIDB4REYsIDB4OUQsIDB4RTAsIC8qIDB4NjQtMHg2NyAqLworCTB4QkUsIDB4RDksIDB4OUQsIDB4RTEsIDB4OUQsIDB4RTIsIDB4OUQsIDB4RTMsIC8qIDB4NjgtMHg2QiAqLworCTB4OUQsIDB4RTQsIDB4OUQsIDB4RTUsIDB4OUQsIDB4RTYsIDB4OUQsIDB4RTcsIC8qIDB4NkMtMHg2RiAqLworCTB4QkUsIDB4REEsIDB4QkUsIDB4REIsIDB4OUQsIDB4RTgsIDB4QkUsIDB4REMsIC8qIDB4NzAtMHg3MyAqLworCTB4QkUsIDB4REQsIDB4QkUsIDB4REUsIDB4OUQsIDB4RTksIDB4OUQsIDB4RUEsIC8qIDB4NzQtMHg3NyAqLworCTB4OUQsIDB4RUIsIDB4OUQsIDB4RUMsIDB4OUQsIDB4RUQsIDB4OUQsIDB4RUUsIC8qIDB4NzgtMHg3QiAqLworCTB4QkUsIDB4REYsIDB4QkUsIDB4RTAsIDB4OUQsIDB4RUYsIDB4OUQsIDB4RjAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QkUsIDB4RTEsIDB4OUQsIDB4RjEsIDB4OUQsIDB4RjIsIDB4OUQsIDB4RjMsIC8qIDB4ODAtMHg4MyAqLworCTB4QkUsIDB4RTIsIDB4OUQsIDB4RjQsIDB4OUQsIDB4RjUsIDB4QkUsIDB4RTMsIC8qIDB4ODQtMHg4NyAqLworCTB4OUQsIDB4RjYsIDB4OUQsIDB4RjcsIDB4OUQsIDB4RjgsIDB4OUQsIDB4RjksIC8qIDB4ODgtMHg4QiAqLworCTB4QkUsIDB4RTQsIDB4QkUsIDB4RTUsIDB4OUQsIDB4RkEsIDB4QkUsIDB4RTYsIC8qIDB4OEMtMHg4RiAqLworCTB4OUQsIDB4RkIsIDB4QkUsIDB4RTcsIDB4OUQsIDB4RkMsIDB4OUQsIDB4RkQsIC8qIDB4OTAtMHg5MyAqLworCTB4OUQsIDB4RkUsIDB4QkUsIDB4RTgsIDB4OUUsIDB4NDEsIDB4QkUsIDB4RTksIC8qIDB4OTQtMHg5NyAqLworCTB4QkUsIDB4RUEsIDB4OUUsIDB4NDIsIDB4OUUsIDB4NDMsIDB4OUUsIDB4NDQsIC8qIDB4OTgtMHg5QiAqLworCTB4QkUsIDB4RUIsIDB4OUUsIDB4NDUsIDB4OUUsIDB4NDYsIDB4OUUsIDB4NDcsIC8qIDB4OUMtMHg5RiAqLworCTB4QkUsIDB4RUMsIDB4OUUsIDB4NDgsIDB4OUUsIDB4NDksIDB4OUUsIDB4NEEsIC8qIDB4QTAtMHhBMyAqLworCTB4OUUsIDB4NEIsIDB4OUUsIDB4NEMsIDB4OUUsIDB4NEQsIDB4OUUsIDB4NEUsIC8qIDB4QTQtMHhBNyAqLworCTB4OUUsIDB4NEYsIDB4QkUsIDB4RUQsIDB4OUUsIDB4NTAsIDB4OUUsIDB4NTEsIC8qIDB4QTgtMHhBQiAqLworCTB4OUUsIDB4NTIsIDB4OUUsIDB4NTMsIDB4OUUsIDB4NTQsIDB4OUUsIDB4NTUsIC8qIDB4QUMtMHhBRiAqLworCTB4OUUsIDB4NTYsIDB4OUUsIDB4NTcsIDB4OUUsIDB4NTgsIDB4OUUsIDB4NTksIC8qIDB4QjAtMHhCMyAqLworCTB4QkUsIDB4RUUsIDB4QkUsIDB4RUYsIDB4OUUsIDB4NUEsIDB4OUUsIDB4NjEsIC8qIDB4QjQtMHhCNyAqLworCTB4QkUsIDB4RjAsIDB4QkUsIDB4RjEsIDB4OUUsIDB4NjIsIDB4QkUsIDB4RjIsIC8qIDB4QjgtMHhCQiAqLworCTB4QkUsIDB4RjMsIDB4QkUsIDB4RjQsIDB4QkUsIDB4RjUsIDB4OUUsIDB4NjMsIC8qIDB4QkMtMHhCRiAqLworCTB4OUUsIDB4NjQsIDB4OUUsIDB4NjUsIDB4OUUsIDB4NjYsIDB4OUUsIDB4NjcsIC8qIDB4QzAtMHhDMyAqLworCTB4QkUsIDB4RjYsIDB4QkUsIDB4RjcsIDB4QkUsIDB4RjgsIDB4QkUsIDB4RjksIC8qIDB4QzQtMHhDNyAqLworCTB4QkUsIDB4RkEsIDB4QkUsIDB4RkIsIDB4QkUsIDB4RkMsIDB4OUUsIDB4NjgsIC8qIDB4QzgtMHhDQiAqLworCTB4QkUsIDB4RkQsIDB4OUUsIDB4NjksIDB4QkUsIDB4RkUsIDB4OUUsIDB4NkEsIC8qIDB4Q0MtMHhDRiAqLworCTB4QkYsIDB4QTEsIDB4QkYsIDB4QTIsIDB4OUUsIDB4NkIsIDB4OUUsIDB4NkMsIC8qIDB4RDAtMHhEMyAqLworCTB4QkYsIDB4QTMsIDB4OUUsIDB4NkQsIDB4OUUsIDB4NkUsIDB4OUUsIDB4NkYsIC8qIDB4RDQtMHhENyAqLworCTB4QkYsIDB4QTQsIDB4OUUsIDB4NzAsIDB4OUUsIDB4NzEsIDB4OUUsIDB4NzIsIC8qIDB4RDgtMHhEQiAqLworCTB4OUUsIDB4NzMsIDB4OUUsIDB4NzQsIDB4OUUsIDB4NzUsIDB4OUUsIDB4NzYsIC8qIDB4REMtMHhERiAqLworCTB4QkYsIDB4QTUsIDB4QkYsIDB4QTYsIDB4OUUsIDB4NzcsIDB4QkYsIDB4QTcsIC8qIDB4RTAtMHhFMyAqLworCTB4OUUsIDB4NzgsIDB4QkYsIDB4QTgsIDB4OUUsIDB4NzksIDB4OUUsIDB4N0EsIC8qIDB4RTQtMHhFNyAqLworCTB4OUUsIDB4ODEsIDB4OUUsIDB4ODIsIDB4OUUsIDB4ODMsIDB4OUUsIDB4ODQsIC8qIDB4RTgtMHhFQiAqLworCTB4QkYsIDB4QTksIDB4QkYsIDB4QUEsIDB4QkYsIDB4QUIsIDB4OUUsIDB4ODUsIC8qIDB4RUMtMHhFRiAqLworCTB4QkYsIDB4QUMsIDB4OUUsIDB4ODYsIDB4OUUsIDB4ODcsIDB4OUUsIDB4ODgsIC8qIDB4RjAtMHhGMyAqLworCTB4QkYsIDB4QUQsIDB4OUUsIDB4ODksIDB4QkYsIDB4QUUsIDB4QkYsIDB4QUYsIC8qIDB4RjQtMHhGNyAqLworCTB4OUUsIDB4OEEsIDB4OUUsIDB4OEIsIDB4OUUsIDB4OEMsIDB4OUUsIDB4OEQsIC8qIDB4RjgtMHhGQiAqLworCTB4QkYsIDB4QjAsIDB4QkYsIDB4QjEsIDB4QkYsIDB4QjIsIDB4QkYsIDB4QjMsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0M2WzUxMl0gPSB7CisJMHhCRiwgMHhCNCwgMHhCRiwgMHhCNSwgMHg5RSwgMHg4RSwgMHg5RSwgMHg4RiwgLyogMHgwMC0weDAzICovCisJMHg5RSwgMHg5MCwgMHhCRiwgMHhCNiwgMHhCRiwgMHhCNywgMHhCRiwgMHhCOCwgLyogMHgwNC0weDA3ICovCisJMHhCRiwgMHhCOSwgMHg5RSwgMHg5MSwgMHg5RSwgMHg5MiwgMHg5RSwgMHg5MywgLyogMHgwOC0weDBCICovCisJMHhCRiwgMHhCQSwgMHg5RSwgMHg5NCwgMHg5RSwgMHg5NSwgMHg5RSwgMHg5NiwgLyogMHgwQy0weDBGICovCisJMHhCRiwgMHhCQiwgMHg5RSwgMHg5NywgMHg5RSwgMHg5OCwgMHg5RSwgMHg5OSwgLyogMHgxMC0weDEzICovCisJMHg5RSwgMHg5QSwgMHg5RSwgMHg5QiwgMHg5RSwgMHg5QywgMHg5RSwgMHg5RCwgLyogMHgxNC0weDE3ICovCisJMHhCRiwgMHhCQywgMHhCRiwgMHhCRCwgMHg5RSwgMHg5RSwgMHhCRiwgMHhCRSwgLyogMHgxOC0weDFCICovCisJMHhCRiwgMHhCRiwgMHg5RSwgMHg5RiwgMHg5RSwgMHhBMCwgMHg5RSwgMHhBMSwgLyogMHgxQy0weDFGICovCisJMHg5RSwgMHhBMiwgMHg5RSwgMHhBMywgMHg5RSwgMHhBNCwgMHg5RSwgMHhBNSwgLyogMHgyMC0weDIzICovCisJMHhCRiwgMHhDMCwgMHhCRiwgMHhDMSwgMHg5RSwgMHhBNiwgMHg5RSwgMHhBNywgLyogMHgyNC0weDI3ICovCisJMHhCRiwgMHhDMiwgMHg5RSwgMHhBOCwgMHg5RSwgMHhBOSwgMHg5RSwgMHhBQSwgLyogMHgyOC0weDJCICovCisJMHhCRiwgMHhDMywgMHhCRiwgMHhDNCwgMHhCRiwgMHhDNSwgMHg5RSwgMHhBQiwgLyogMHgyQy0weDJGICovCisJMHhCRiwgMHhDNiwgMHg5RSwgMHhBQywgMHg5RSwgMHhBRCwgMHhCRiwgMHhDNywgLyogMHgzMC0weDMzICovCisJMHhCRiwgMHhDOCwgMHhCRiwgMHhDOSwgMHg5RSwgMHhBRSwgMHhCRiwgMHhDQSwgLyogMHgzNC0weDM3ICovCisJMHg5RSwgMHhBRiwgMHhCRiwgMHhDQiwgMHg5RSwgMHhCMCwgMHhCRiwgMHhDQywgLyogMHgzOC0weDNCICovCisJMHg5RSwgMHhCMSwgMHg5RSwgMHhCMiwgMHg5RSwgMHhCMywgMHg5RSwgMHhCNCwgLyogMHgzQy0weDNGICovCisJMHhCRiwgMHhDRCwgMHhCRiwgMHhDRSwgMHg5RSwgMHhCNSwgMHg5RSwgMHhCNiwgLyogMHg0MC0weDQzICovCisJMHhCRiwgMHhDRiwgMHg5RSwgMHhCNywgMHg5RSwgMHhCOCwgMHg5RSwgMHhCOSwgLyogMHg0NC0weDQ3ICovCisJMHhCRiwgMHhEMCwgMHg5RSwgMHhCQSwgMHg5RSwgMHhCQiwgMHg5RSwgMHhCQywgLyogMHg0OC0weDRCICovCisJMHg5RSwgMHhCRCwgMHg5RSwgMHhCRSwgMHg5RSwgMHhCRiwgMHg5RSwgMHhDMCwgLyogMHg0Qy0weDRGICovCisJMHhCRiwgMHhEMSwgMHhCRiwgMHhEMiwgMHg5RSwgMHhDMSwgMHhCRiwgMHhEMywgLyogMHg1MC0weDUzICovCisJMHhCRiwgMHhENCwgMHhCRiwgMHhENSwgMHg5RSwgMHhDMiwgMHg5RSwgMHhDMywgLyogMHg1NC0weDU3ICovCisJMHg5RSwgMHhDNCwgMHg5RSwgMHhDNSwgMHg5RSwgMHhDNiwgMHg5RSwgMHhDNywgLyogMHg1OC0weDVCICovCisJMHhCRiwgMHhENiwgMHhCRiwgMHhENywgMHg5RSwgMHhDOCwgMHg5RSwgMHhDOSwgLyogMHg1Qy0weDVGICovCisJMHhCRiwgMHhEOCwgMHg5RSwgMHhDQSwgMHg5RSwgMHhDQiwgMHg5RSwgMHhDQywgLyogMHg2MC0weDYzICovCisJMHg5RSwgMHhDRCwgMHg5RSwgMHhDRSwgMHg5RSwgMHhDRiwgMHg5RSwgMHhEMCwgLyogMHg2NC0weDY3ICovCisJMHg5RSwgMHhEMSwgMHg5RSwgMHhEMiwgMHg5RSwgMHhEMywgMHg5RSwgMHhENCwgLyogMHg2OC0weDZCICovCisJMHhCRiwgMHhEOSwgMHg5RSwgMHhENSwgMHg5RSwgMHhENiwgMHhCRiwgMHhEQSwgLyogMHg2Qy0weDZGICovCisJMHg5RSwgMHhENywgMHhCRiwgMHhEQiwgMHg5RSwgMHhEOCwgMHg5RSwgMHhEOSwgLyogMHg3MC0weDczICovCisJMHg5RSwgMHhEQSwgMHg5RSwgMHhEQiwgMHg5RSwgMHhEQywgMHg5RSwgMHhERCwgLyogMHg3NC0weDc3ICovCisJMHhCRiwgMHhEQywgMHhCRiwgMHhERCwgMHg5RSwgMHhERSwgMHg5RSwgMHhERiwgLyogMHg3OC0weDdCICovCisJMHhCRiwgMHhERSwgMHg5RSwgMHhFMCwgMHg5RSwgMHhFMSwgMHg5RSwgMHhFMiwgLyogMHg3Qy0weDdGICovCisJCisJMHhCRiwgMHhERiwgMHg5RSwgMHhFMywgMHg5RSwgMHhFNCwgMHg5RSwgMHhFNSwgLyogMHg4MC0weDgzICovCisJMHg5RSwgMHhFNiwgMHg5RSwgMHhFNywgMHg5RSwgMHhFOCwgMHg5RSwgMHhFOSwgLyogMHg4NC0weDg3ICovCisJMHhCRiwgMHhFMCwgMHhCRiwgMHhFMSwgMHg5RSwgMHhFQSwgMHhCRiwgMHhFMiwgLyogMHg4OC0weDhCICovCisJMHg5RSwgMHhFQiwgMHhCRiwgMHhFMywgMHg5RSwgMHhFQywgMHg5RSwgMHhFRCwgLyogMHg4Qy0weDhGICovCisJMHg5RSwgMHhFRSwgMHg5RSwgMHhFRiwgMHg5RSwgMHhGMCwgMHg5RSwgMHhGMSwgLyogMHg5MC0weDkzICovCisJMHhCRiwgMHhFNCwgMHhCRiwgMHhFNSwgMHg5RSwgMHhGMiwgMHg5RSwgMHhGMywgLyogMHg5NC0weDk3ICovCisJMHhCRiwgMHhFNiwgMHg5RSwgMHhGNCwgMHg5RSwgMHhGNSwgMHg5RSwgMHhGNiwgLyogMHg5OC0weDlCICovCisJMHhCRiwgMHhFNywgMHg5RSwgMHhGNywgMHg5RSwgMHhGOCwgMHg5RSwgMHhGOSwgLyogMHg5Qy0weDlGICovCisJMHg5RSwgMHhGQSwgMHg5RSwgMHhGQiwgMHg5RSwgMHhGQywgMHg5RSwgMHhGRCwgLyogMHhBMC0weEEzICovCisJMHhCRiwgMHhFOCwgMHhCRiwgMHhFOSwgMHg5RSwgMHhGRSwgMHhCRiwgMHhFQSwgLyogMHhBNC0weEE3ICovCisJMHg5RiwgMHg0MSwgMHhCRiwgMHhFQiwgMHg5RiwgMHg0MiwgMHg5RiwgMHg0MywgLyogMHhBOC0weEFCICovCisJMHg5RiwgMHg0NCwgMHg5RiwgMHg0NSwgMHg5RiwgMHg0NiwgMHg5RiwgMHg0NywgLyogMHhBQy0weEFGICovCisJMHhCRiwgMHhFQywgMHhCRiwgMHhFRCwgMHg5RiwgMHg0OCwgMHg5RiwgMHg0OSwgLyogMHhCMC0weEIzICovCisJMHhCRiwgMHhFRSwgMHg5RiwgMHg0QSwgMHg5RiwgMHg0QiwgMHg5RiwgMHg0QywgLyogMHhCNC0weEI3ICovCisJMHhCRiwgMHhFRiwgMHhCRiwgMHhGMCwgMHhCRiwgMHhGMSwgMHg5RiwgMHg0RCwgLyogMHhCOC0weEJCICovCisJMHg5RiwgMHg0RSwgMHg5RiwgMHg0RiwgMHg5RiwgMHg1MCwgMHg5RiwgMHg1MSwgLyogMHhCQy0weEJGICovCisJMHhCRiwgMHhGMiwgMHhCRiwgMHhGMywgMHg5RiwgMHg1MiwgMHhCRiwgMHhGNCwgLyogMHhDMC0weEMzICovCisJMHg5RiwgMHg1MywgMHhCRiwgMHhGNSwgMHg5RiwgMHg1NCwgMHg5RiwgMHg1NSwgLyogMHhDNC0weEM3ICovCisJMHg5RiwgMHg1NiwgMHg5RiwgMHg1NywgMHg5RiwgMHg1OCwgMHg5RiwgMHg1OSwgLyogMHhDOC0weENCICovCisJMHhCRiwgMHhGNiwgMHhCRiwgMHhGNywgMHg5RiwgMHg1QSwgMHg5RiwgMHg2MSwgLyogMHhDQy0weENGICovCisJMHhCRiwgMHhGOCwgMHg5RiwgMHg2MiwgMHg5RiwgMHg2MywgMHg5RiwgMHg2NCwgLyogMHhEMC0weEQzICovCisJMHhCRiwgMHhGOSwgMHg5RiwgMHg2NSwgMHg5RiwgMHg2NiwgMHg5RiwgMHg2NywgLyogMHhENC0weEQ3ICovCisJMHg5RiwgMHg2OCwgMHg5RiwgMHg2OSwgMHg5RiwgMHg2QSwgMHg5RiwgMHg2QiwgLyogMHhEOC0weERCICovCisJMHhCRiwgMHhGQSwgMHhCRiwgMHhGQiwgMHg5RiwgMHg2QywgMHg5RiwgMHg2RCwgLyogMHhEQy0weERGICovCisJMHhCRiwgMHhGQywgMHhCRiwgMHhGRCwgMHg5RiwgMHg2RSwgMHg5RiwgMHg2RiwgLyogMHhFMC0weEUzICovCisJMHg5RiwgMHg3MCwgMHg5RiwgMHg3MSwgMHg5RiwgMHg3MiwgMHg5RiwgMHg3MywgLyogMHhFNC0weEU3ICovCisJMHhCRiwgMHhGRSwgMHhDMCwgMHhBMSwgMHg5RiwgMHg3NCwgMHg5RiwgMHg3NSwgLyogMHhFOC0weEVCICovCisJMHhDMCwgMHhBMiwgMHg5RiwgMHg3NiwgMHg5RiwgMHg3NywgMHg5RiwgMHg3OCwgLyogMHhFQy0weEVGICovCisJMHhDMCwgMHhBMywgMHg5RiwgMHg3OSwgMHg5RiwgMHg3QSwgMHg5RiwgMHg4MSwgLyogMHhGMC0weEYzICovCisJMHg5RiwgMHg4MiwgMHg5RiwgMHg4MywgMHg5RiwgMHg4NCwgMHg5RiwgMHg4NSwgLyogMHhGNC0weEY3ICovCisJMHhDMCwgMHhBNCwgMHhDMCwgMHhBNSwgMHg5RiwgMHg4NiwgMHg5RiwgMHg4NywgLyogMHhGOC0weEZCICovCisJMHg5RiwgMHg4OCwgMHhDMCwgMHhBNiwgMHg5RiwgMHg4OSwgMHg5RiwgMHg4QSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfQzdbNTEyXSA9IHsKKwkweDlGLCAweDhCLCAweDlGLCAweDhDLCAweDlGLCAweDhELCAweDlGLCAweDhFLCAvKiAweDAwLTB4MDMgKi8KKwkweEMwLCAweEE3LCAweEMwLCAweEE4LCAweDlGLCAweDhGLCAweDlGLCAweDkwLCAvKiAweDA0LTB4MDcgKi8KKwkweEMwLCAweEE5LCAweDlGLCAweDkxLCAweDlGLCAweDkyLCAweDlGLCAweDkzLCAvKiAweDA4LTB4MEIgKi8KKwkweEMwLCAweEFBLCAweDlGLCAweDk0LCAweDlGLCAweDk1LCAweDlGLCAweDk2LCAvKiAweDBDLTB4MEYgKi8KKwkweDlGLCAweDk3LCAweDlGLCAweDk4LCAweDlGLCAweDk5LCAweDlGLCAweDlBLCAvKiAweDEwLTB4MTMgKi8KKwkweEMwLCAweEFCLCAweEMwLCAweEFDLCAweDlGLCAweDlCLCAweEMwLCAweEFELCAvKiAweDE0LTB4MTcgKi8KKwkweDlGLCAweDlDLCAweEMwLCAweEFFLCAweDlGLCAweDlELCAweDlGLCAweDlFLCAvKiAweDE4LTB4MUIgKi8KKwkweDlGLCAweDlGLCAweDlGLCAweEEwLCAweDlGLCAweEExLCAweDlGLCAweEEyLCAvKiAweDFDLTB4MUYgKi8KKwkweEMwLCAweEFGLCAweEMwLCAweEIwLCAweDlGLCAweEEzLCAweDlGLCAweEE0LCAvKiAweDIwLTB4MjMgKi8KKwkweEMwLCAweEIxLCAweDlGLCAweEE1LCAweDlGLCAweEE2LCAweDlGLCAweEE3LCAvKiAweDI0LTB4MjcgKi8KKwkweEMwLCAweEIyLCAweDlGLCAweEE4LCAweDlGLCAweEE5LCAweDlGLCAweEFBLCAvKiAweDI4LTB4MkIgKi8KKwkweDlGLCAweEFCLCAweDlGLCAweEFDLCAweDlGLCAweEFELCAweDlGLCAweEFFLCAvKiAweDJDLTB4MkYgKi8KKwkweEMwLCAweEIzLCAweEMwLCAweEI0LCAweDlGLCAweEFGLCAweEMwLCAweEI1LCAvKiAweDMwLTB4MzMgKi8KKwkweDlGLCAweEIwLCAweEMwLCAweEI2LCAweDlGLCAweEIxLCAweEMwLCAweEI3LCAvKiAweDM0LTB4MzcgKi8KKwkweDlGLCAweEIyLCAweDlGLCAweEIzLCAweDlGLCAweEI0LCAweDlGLCAweEI1LCAvKiAweDM4LTB4M0IgKi8KKwkweEMwLCAweEI4LCAweEMwLCAweEI5LCAweDlGLCAweEI2LCAweDlGLCAweEI3LCAvKiAweDNDLTB4M0YgKi8KKwkweEMwLCAweEJBLCAweDlGLCAweEI4LCAweDlGLCAweEI5LCAweDlGLCAweEJBLCAvKiAweDQwLTB4NDMgKi8KKwkweEMwLCAweEJCLCAweDlGLCAweEJCLCAweDlGLCAweEJDLCAweDlGLCAweEJELCAvKiAweDQ0LTB4NDcgKi8KKwkweDlGLCAweEJFLCAweDlGLCAweEJGLCAweEMwLCAweEJDLCAweDlGLCAweEMwLCAvKiAweDQ4LTB4NEIgKi8KKwkweEMwLCAweEJELCAweEMwLCAweEJFLCAweDlGLCAweEMxLCAweEMwLCAweEJGLCAvKiAweDRDLTB4NEYgKi8KKwkweDlGLCAweEMyLCAweEMwLCAweEMwLCAweEMwLCAweEMxLCAweEMwLCAweEMyLCAvKiAweDUwLTB4NTMgKi8KKwkweEMwLCAweEMzLCAweEMwLCAweEM0LCAweEMwLCAweEM1LCAweEMwLCAweEM2LCAvKiAweDU0LTB4NTcgKi8KKwkweEMwLCAweEM3LCAweDlGLCAweEMzLCAweDlGLCAweEM0LCAweDlGLCAweEM1LCAvKiAweDU4LTB4NUIgKi8KKwkweEMwLCAweEM4LCAweDlGLCAweEM2LCAweDlGLCAweEM3LCAweDlGLCAweEM4LCAvKiAweDVDLTB4NUYgKi8KKwkweEMwLCAweEM5LCAweDlGLCAweEM5LCAweDlGLCAweENBLCAweDlGLCAweENCLCAvKiAweDYwLTB4NjMgKi8KKwkweDlGLCAweENDLCAweDlGLCAweENELCAweDlGLCAweENFLCAweDlGLCAweENGLCAvKiAweDY0LTB4NjcgKi8KKwkweEMwLCAweENBLCAweDlGLCAweEQwLCAweDlGLCAweEQxLCAweEMwLCAweENCLCAvKiAweDY4LTB4NkIgKi8KKwkweDlGLCAweEQyLCAweDlGLCAweEQzLCAweDlGLCAweEQ0LCAweDlGLCAweEQ1LCAvKiAweDZDLTB4NkYgKi8KKwkweDlGLCAweEQ2LCAweDlGLCAweEQ3LCAweDlGLCAweEQ4LCAweDlGLCAweEQ5LCAvKiAweDcwLTB4NzMgKi8KKwkweEMwLCAweENDLCAweEMwLCAweENELCAweDlGLCAweERBLCAweDlGLCAweERCLCAvKiAweDc0LTB4NzcgKi8KKwkweEMwLCAweENFLCAweDlGLCAweERDLCAweDlGLCAweERELCAweDlGLCAweERFLCAvKiAweDc4LTB4N0IgKi8KKwkweEMwLCAweENGLCAweEMwLCAweEQwLCAweEMwLCAweEQxLCAweDlGLCAweERGLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDlGLCAweEUwLCAweDlGLCAweEUxLCAweDlGLCAweEUyLCAweEMwLCAweEQyLCAvKiAweDgwLTB4ODMgKi8KKwkweEMwLCAweEQzLCAweEMwLCAweEQ0LCAweDlGLCAweEUzLCAweEMwLCAweEQ1LCAvKiAweDg0LTB4ODcgKi8KKwkweEMwLCAweEQ2LCAweEMwLCAweEQ3LCAweEMwLCAweEQ4LCAweDlGLCAweEU0LCAvKiAweDg4LTB4OEIgKi8KKwkweDlGLCAweEU1LCAweDlGLCAweEU2LCAweEMwLCAweEQ5LCAweDlGLCAweEU3LCAvKiAweDhDLTB4OEYgKi8KKwkweEMwLCAweERBLCAweEMwLCAweERCLCAweDlGLCAweEU4LCAweDlGLCAweEU5LCAvKiAweDkwLTB4OTMgKi8KKwkweEMwLCAweERDLCAweDlGLCAweEVBLCAweEMwLCAweERELCAweEMwLCAweERFLCAvKiAweDk0LTB4OTcgKi8KKwkweEMwLCAweERGLCAweDlGLCAweEVCLCAweEMwLCAweEUwLCAweDlGLCAweEVDLCAvKiAweDk4LTB4OUIgKi8KKwkweDlGLCAweEVELCAweDlGLCAweEVFLCAweDlGLCAweEVGLCAweDlGLCAweEYwLCAvKiAweDlDLTB4OUYgKi8KKwkweEMwLCAweEUxLCAweEMwLCAweEUyLCAweDlGLCAweEYxLCAweEMwLCAweEUzLCAvKiAweEEwLTB4QTMgKi8KKwkweEMwLCAweEU0LCAweEMwLCAweEU1LCAweEMwLCAweEU2LCAweDlGLCAweEYyLCAvKiAweEE0LTB4QTcgKi8KKwkweDlGLCAweEYzLCAweDlGLCAweEY0LCAweDlGLCAweEY1LCAweDlGLCAweEY2LCAvKiAweEE4LTB4QUIgKi8KKwkweEMwLCAweEU3LCAweEMwLCAweEU4LCAweDlGLCAweEY3LCAweDlGLCAweEY4LCAvKiAweEFDLTB4QUYgKi8KKwkweEMwLCAweEU5LCAweDlGLCAweEY5LCAweDlGLCAweEZBLCAweDlGLCAweEZCLCAvKiAweEIwLTB4QjMgKi8KKwkweEMwLCAweEVBLCAweDlGLCAweEZDLCAweDlGLCAweEZELCAweDlGLCAweEZFLCAvKiAweEI0LTB4QjcgKi8KKwkweEEwLCAweDQxLCAweEEwLCAweDQyLCAweEEwLCAweDQzLCAweEEwLCAweDQ0LCAvKiAweEI4LTB4QkIgKi8KKwkweEMwLCAweEVCLCAweEMwLCAweEVDLCAweEEwLCAweDQ1LCAweEMwLCAweEVELCAvKiAweEJDLTB4QkYgKi8KKwkweEMwLCAweEVFLCAweEMwLCAweEVGLCAweEEwLCAweDQ2LCAweEEwLCAweDQ3LCAvKiAweEMwLTB4QzMgKi8KKwkweEEwLCAweDQ4LCAweEEwLCAweDQ5LCAweEEwLCAweDRBLCAweEEwLCAweDRCLCAvKiAweEM0LTB4QzcgKi8KKwkweEMwLCAweEYwLCAweEMwLCAweEYxLCAweEEwLCAweDRDLCAweEEwLCAweDRELCAvKiAweEM4LTB4Q0IgKi8KKwkweEMwLCAweEYyLCAweEEwLCAweDRFLCAweEMwLCAweEYzLCAweEEwLCAweDRGLCAvKiAweENDLTB4Q0YgKi8KKwkweEMwLCAweEY0LCAweEEwLCAweDUwLCAweEEwLCAweDUxLCAweEEwLCAweDUyLCAvKiAweEQwLTB4RDMgKi8KKwkweEEwLCAweDUzLCAweEEwLCAweDU0LCAweEEwLCAweDU1LCAweEEwLCAweDU2LCAvKiAweEQ0LTB4RDcgKi8KKwkweEMwLCAweEY1LCAweEEwLCAweDU3LCAweEEwLCAweDU4LCAweEEwLCAweDU5LCAvKiAweEQ4LTB4REIgKi8KKwkweEEwLCAweDVBLCAweEMwLCAweEY2LCAweEEwLCAweDYxLCAweEEwLCAweDYyLCAvKiAweERDLTB4REYgKi8KKwkweEEwLCAweDYzLCAweEEwLCAweDY0LCAweEEwLCAweDY1LCAweEEwLCAweDY2LCAvKiAweEUwLTB4RTMgKi8KKwkweEMwLCAweEY3LCAweEEwLCAweDY3LCAweEEwLCAweDY4LCAweEEwLCAweDY5LCAvKiAweEU0LTB4RTcgKi8KKwkweEMwLCAweEY4LCAweEEwLCAweDZBLCAweEEwLCAweDZCLCAweEEwLCAweDZDLCAvKiAweEU4LTB4RUIgKi8KKwkweEMwLCAweEY5LCAweEEwLCAweDZELCAweEEwLCAweDZFLCAweEEwLCAweDZGLCAvKiAweEVDLTB4RUYgKi8KKwkweEEwLCAweDcwLCAweEEwLCAweDcxLCAweEEwLCAweDcyLCAweEEwLCAweDczLCAvKiAweEYwLTB4RjMgKi8KKwkweEEwLCAweDc0LCAweEEwLCAweDc1LCAweEEwLCAweDc2LCAweEEwLCAweDc3LCAvKiAweEY0LTB4RjcgKi8KKwkweEEwLCAweDc4LCAweEEwLCAweDc5LCAweEEwLCAweDdBLCAweEEwLCAweDgxLCAvKiAweEY4LTB4RkIgKi8KKwkweEEwLCAweDgyLCAweEEwLCAweDgzLCAweEEwLCAweDg0LCAweEEwLCAweDg1LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19DOFs1MTJdID0geworCTB4QzAsIDB4RkEsIDB4QzAsIDB4RkIsIDB4QTAsIDB4ODYsIDB4QTAsIDB4ODcsIC8qIDB4MDAtMHgwMyAqLworCTB4QzAsIDB4RkMsIDB4QTAsIDB4ODgsIDB4QTAsIDB4ODksIDB4QTAsIDB4OEEsIC8qIDB4MDQtMHgwNyAqLworCTB4QzAsIDB4RkQsIDB4QTAsIDB4OEIsIDB4QzAsIDB4RkUsIDB4QTAsIDB4OEMsIC8qIDB4MDgtMHgwQiAqLworCTB4QTAsIDB4OEQsIDB4QTAsIDB4OEUsIDB4QTAsIDB4OEYsIDB4QTAsIDB4OTAsIC8qIDB4MEMtMHgwRiAqLworCTB4QzEsIDB4QTEsIDB4QzEsIDB4QTIsIDB4QTAsIDB4OTEsIDB4QzEsIDB4QTMsIC8qIDB4MTAtMHgxMyAqLworCTB4QTAsIDB4OTIsIDB4QzEsIDB4QTQsIDB4QzEsIDB4QTUsIDB4QTAsIDB4OTMsIC8qIDB4MTQtMHgxNyAqLworCTB4QTAsIDB4OTQsIDB4QTAsIDB4OTUsIDB4QTAsIDB4OTYsIDB4QTAsIDB4OTcsIC8qIDB4MTgtMHgxQiAqLworCTB4QzEsIDB4QTYsIDB4QzEsIDB4QTcsIDB4QTAsIDB4OTgsIDB4QTAsIDB4OTksIC8qIDB4MUMtMHgxRiAqLworCTB4QzEsIDB4QTgsIDB4QTAsIDB4OUEsIDB4QTAsIDB4OUIsIDB4QTAsIDB4OUMsIC8qIDB4MjAtMHgyMyAqLworCTB4QzEsIDB4QTksIDB4QTAsIDB4OUQsIDB4QTAsIDB4OUUsIDB4QTAsIDB4OUYsIC8qIDB4MjQtMHgyNyAqLworCTB4QTAsIDB4QTAsIDB4QTAsIDB4QTEsIDB4QTAsIDB4QTIsIDB4QTAsIDB4QTMsIC8qIDB4MjgtMHgyQiAqLworCTB4QzEsIDB4QUEsIDB4QzEsIDB4QUIsIDB4QTAsIDB4QTQsIDB4QzEsIDB4QUMsIC8qIDB4MkMtMHgyRiAqLworCTB4QTAsIDB4QTUsIDB4QzEsIDB4QUQsIDB4QTAsIDB4QTYsIDB4QTAsIDB4QTcsIC8qIDB4MzAtMHgzMyAqLworCTB4QTAsIDB4QTgsIDB4QTAsIDB4QTksIDB4QTAsIDB4QUEsIDB4QTAsIDB4QUIsIC8qIDB4MzQtMHgzNyAqLworCTB4QzEsIDB4QUUsIDB4QTAsIDB4QUMsIDB4QTAsIDB4QUQsIDB4QTAsIDB4QUUsIC8qIDB4MzgtMHgzQiAqLworCTB4QzEsIDB4QUYsIDB4QTAsIDB4QUYsIDB4QTAsIDB4QjAsIDB4QTAsIDB4QjEsIC8qIDB4M0MtMHgzRiAqLworCTB4QzEsIDB4QjAsIDB4QTAsIDB4QjIsIDB4QTAsIDB4QjMsIDB4QTAsIDB4QjQsIC8qIDB4NDAtMHg0MyAqLworCTB4QTAsIDB4QjUsIDB4QTAsIDB4QjYsIDB4QTAsIDB4QjcsIDB4QTAsIDB4QjgsIC8qIDB4NDQtMHg0NyAqLworCTB4QzEsIDB4QjEsIDB4QzEsIDB4QjIsIDB4QTAsIDB4QjksIDB4QTAsIDB4QkEsIC8qIDB4NDgtMHg0QiAqLworCTB4QzEsIDB4QjMsIDB4QzEsIDB4QjQsIDB4QTAsIDB4QkIsIDB4QTAsIDB4QkMsIC8qIDB4NEMtMHg0RiAqLworCTB4QTAsIDB4QkQsIDB4QTAsIDB4QkUsIDB4QTAsIDB4QkYsIDB4QTAsIDB4QzAsIC8qIDB4NTAtMHg1MyAqLworCTB4QzEsIDB4QjUsIDB4QTAsIDB4QzEsIDB4QTAsIDB4QzIsIDB4QTAsIDB4QzMsIC8qIDB4NTQtMHg1NyAqLworCTB4QTAsIDB4QzQsIDB4QTAsIDB4QzUsIDB4QTAsIDB4QzYsIDB4QTAsIDB4QzcsIC8qIDB4NTgtMHg1QiAqLworCTB4QTAsIDB4QzgsIDB4QTAsIDB4QzksIDB4QTAsIDB4Q0EsIDB4QTAsIDB4Q0IsIC8qIDB4NUMtMHg1RiAqLworCTB4QTAsIDB4Q0MsIDB4QTAsIDB4Q0QsIDB4QTAsIDB4Q0UsIDB4QTAsIDB4Q0YsIC8qIDB4NjAtMHg2MyAqLworCTB4QTAsIDB4RDAsIDB4QTAsIDB4RDEsIDB4QTAsIDB4RDIsIDB4QTAsIDB4RDMsIC8qIDB4NjQtMHg2NyAqLworCTB4QTAsIDB4RDQsIDB4QTAsIDB4RDUsIDB4QTAsIDB4RDYsIDB4QTAsIDB4RDcsIC8qIDB4NjgtMHg2QiAqLworCTB4QTAsIDB4RDgsIDB4QTAsIDB4RDksIDB4QTAsIDB4REEsIDB4QTAsIDB4REIsIC8qIDB4NkMtMHg2RiAqLworCTB4QzEsIDB4QjYsIDB4QzEsIDB4QjcsIDB4QTAsIDB4REMsIDB4QTAsIDB4REQsIC8qIDB4NzAtMHg3MyAqLworCTB4QzEsIDB4QjgsIDB4QTAsIDB4REUsIDB4QTAsIDB4REYsIDB4QTAsIDB4RTAsIC8qIDB4NzQtMHg3NyAqLworCTB4QzEsIDB4QjksIDB4QTAsIDB4RTEsIDB4QzEsIDB4QkEsIDB4QTAsIDB4RTIsIC8qIDB4NzgtMHg3QiAqLworCTB4QTAsIDB4RTMsIDB4QTAsIDB4RTQsIDB4QTAsIDB4RTUsIDB4QTAsIDB4RTYsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QzEsIDB4QkIsIDB4QzEsIDB4QkMsIDB4QTAsIDB4RTcsIDB4QzEsIDB4QkQsIC8qIDB4ODAtMHg4MyAqLworCTB4QTAsIDB4RTgsIDB4QzEsIDB4QkUsIDB4QzEsIDB4QkYsIDB4QzEsIDB4QzAsIC8qIDB4ODQtMHg4NyAqLworCTB4QTAsIDB4RTksIDB4QTAsIDB4RUEsIDB4QTAsIDB4RUIsIDB4QzEsIDB4QzEsIC8qIDB4ODgtMHg4QiAqLworCTB4QzEsIDB4QzIsIDB4QzEsIDB4QzMsIDB4QTAsIDB4RUMsIDB4QTAsIDB4RUQsIC8qIDB4OEMtMHg4RiAqLworCTB4QTAsIDB4RUUsIDB4QTAsIDB4RUYsIDB4QTAsIDB4RjAsIDB4QTAsIDB4RjEsIC8qIDB4OTAtMHg5MyAqLworCTB4QzEsIDB4QzQsIDB4QTAsIDB4RjIsIDB4QTAsIDB4RjMsIDB4QTAsIDB4RjQsIC8qIDB4OTQtMHg5NyAqLworCTB4QTAsIDB4RjUsIDB4QTAsIDB4RjYsIDB4QTAsIDB4RjcsIDB4QTAsIDB4RjgsIC8qIDB4OTgtMHg5QiAqLworCTB4QTAsIDB4RjksIDB4QzEsIDB4QzUsIDB4QTAsIDB4RkEsIDB4QzEsIDB4QzYsIC8qIDB4OUMtMHg5RiAqLworCTB4QTAsIDB4RkIsIDB4QzEsIDB4QzcsIDB4QTAsIDB4RkMsIDB4QTAsIDB4RkQsIC8qIDB4QTAtMHhBMyAqLworCTB4QTAsIDB4RkUsIDB4QTEsIDB4NDEsIDB4QTEsIDB4NDIsIDB4QTEsIDB4NDMsIC8qIDB4QTQtMHhBNyAqLworCTB4QzEsIDB4QzgsIDB4QTEsIDB4NDQsIDB4QTEsIDB4NDUsIDB4QTEsIDB4NDYsIC8qIDB4QTgtMHhBQiAqLworCTB4QTEsIDB4NDcsIDB4QTEsIDB4NDgsIDB4QTEsIDB4NDksIDB4QTEsIDB4NEEsIC8qIDB4QUMtMHhBRiAqLworCTB4QTEsIDB4NEIsIDB4QTEsIDB4NEMsIDB4QTEsIDB4NEQsIDB4QTEsIDB4NEUsIC8qIDB4QjAtMHhCMyAqLworCTB4QTEsIDB4NEYsIDB4QTEsIDB4NTAsIDB4QTEsIDB4NTEsIDB4QTEsIDB4NTIsIC8qIDB4QjQtMHhCNyAqLworCTB4QTEsIDB4NTMsIDB4QTEsIDB4NTQsIDB4QTEsIDB4NTUsIDB4QTEsIDB4NTYsIC8qIDB4QjgtMHhCQiAqLworCTB4QzEsIDB4QzksIDB4QzEsIDB4Q0EsIDB4QTEsIDB4NTcsIDB4QTEsIDB4NTgsIC8qIDB4QkMtMHhCRiAqLworCTB4QTEsIDB4NTksIDB4QTEsIDB4NUEsIDB4QTEsIDB4NjEsIDB4QTEsIDB4NjIsIC8qIDB4QzAtMHhDMyAqLworCTB4QzEsIDB4Q0IsIDB4QTEsIDB4NjMsIDB4QTEsIDB4NjQsIDB4QTEsIDB4NjUsIC8qIDB4QzQtMHhDNyAqLworCTB4QzEsIDB4Q0MsIDB4QTEsIDB4NjYsIDB4QTEsIDB4NjcsIDB4QTEsIDB4NjgsIC8qIDB4QzgtMHhDQiAqLworCTB4QzEsIDB4Q0QsIDB4QTEsIDB4NjksIDB4QTEsIDB4NkEsIDB4QTEsIDB4NkIsIC8qIDB4Q0MtMHhDRiAqLworCTB4QTEsIDB4NkMsIDB4QTEsIDB4NkQsIDB4QTEsIDB4NkUsIDB4QTEsIDB4NkYsIC8qIDB4RDAtMHhEMyAqLworCTB4QzEsIDB4Q0UsIDB4QzEsIDB4Q0YsIDB4QTEsIDB4NzAsIDB4QzEsIDB4RDAsIC8qIDB4RDQtMHhENyAqLworCTB4QTEsIDB4NzEsIDB4QzEsIDB4RDEsIDB4QTEsIDB4NzIsIDB4QTEsIDB4NzMsIC8qIDB4RDgtMHhEQiAqLworCTB4QTEsIDB4NzQsIDB4QTEsIDB4NzUsIDB4QTEsIDB4NzYsIDB4QTEsIDB4NzcsIC8qIDB4REMtMHhERiAqLworCTB4QzEsIDB4RDIsIDB4QzEsIDB4RDMsIDB4QTEsIDB4NzgsIDB4QTEsIDB4NzksIC8qIDB4RTAtMHhFMyAqLworCTB4QzEsIDB4RDQsIDB4QTEsIDB4N0EsIDB4QTEsIDB4ODEsIDB4QTEsIDB4ODIsIC8qIDB4RTQtMHhFNyAqLworCTB4QTEsIDB4ODMsIDB4QTEsIDB4ODQsIDB4QTEsIDB4ODUsIDB4QTEsIDB4ODYsIC8qIDB4RTgtMHhFQiAqLworCTB4QTEsIDB4ODcsIDB4QTEsIDB4ODgsIDB4QTEsIDB4ODksIDB4QTEsIDB4OEEsIC8qIDB4RUMtMHhFRiAqLworCTB4QTEsIDB4OEIsIDB4QTEsIDB4OEMsIDB4QTEsIDB4OEQsIDB4QTEsIDB4OEUsIC8qIDB4RjAtMHhGMyAqLworCTB4QTEsIDB4OEYsIDB4QzEsIDB4RDUsIDB4QTEsIDB4OTAsIDB4QTEsIDB4OTEsIC8qIDB4RjQtMHhGNyAqLworCTB4QTEsIDB4OTIsIDB4QTEsIDB4OTMsIDB4QTEsIDB4OTQsIDB4QTEsIDB4OTUsIC8qIDB4RjgtMHhGQiAqLworCTB4QzEsIDB4RDYsIDB4QzEsIDB4RDcsIDB4QTEsIDB4OTYsIDB4QTEsIDB4OTcsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0M5WzUxMl0gPSB7CisJMHhDMSwgMHhEOCwgMHhBMSwgMHg5OCwgMHhBMSwgMHg5OSwgMHhBMSwgMHg5QSwgLyogMHgwMC0weDAzICovCisJMHhDMSwgMHhEOSwgMHhDMSwgMHhEQSwgMHhDMSwgMHhEQiwgMHhBMSwgMHg5QiwgLyogMHgwNC0weDA3ICovCisJMHhBMSwgMHg5QywgMHhBMSwgMHg5RCwgMHhBMSwgMHg5RSwgMHhBMSwgMHg5RiwgLyogMHgwOC0weDBCICovCisJMHhDMSwgMHhEQywgMHhDMSwgMHhERCwgMHhBMSwgMHhBMCwgMHhDMSwgMHhERSwgLyogMHgwQy0weDBGICovCisJMHhBMiwgMHg0MSwgMHhDMSwgMHhERiwgMHhBMiwgMHg0MiwgMHhBMiwgMHg0MywgLyogMHgxMC0weDEzICovCisJMHhBMiwgMHg0NCwgMHhBMiwgMHg0NSwgMHhBMiwgMHg0NiwgMHhBMiwgMHg0NywgLyogMHgxNC0weDE3ICovCisJMHhDMSwgMHhFMCwgMHhBMiwgMHg0OCwgMHhBMiwgMHg0OSwgMHhBMiwgMHg0QSwgLyogMHgxOC0weDFCICovCisJMHhBMiwgMHg0QiwgMHhBMiwgMHg0QywgMHhBMiwgMHg0RCwgMHhBMiwgMHg0RSwgLyogMHgxQy0weDFGICovCisJMHhBMiwgMHg0RiwgMHhBMiwgMHg1MCwgMHhBMiwgMHg1MSwgMHhBMiwgMHg1MiwgLyogMHgyMC0weDIzICovCisJMHhBMiwgMHg1MywgMHhBMiwgMHg1NCwgMHhBMiwgMHg1NSwgMHhBMiwgMHg1NiwgLyogMHgyNC0weDI3ICovCisJMHhBMiwgMHg1NywgMHhBMiwgMHg1OCwgMHhBMiwgMHg1OSwgMHhBMiwgMHg1QSwgLyogMHgyOC0weDJCICovCisJMHhDMSwgMHhFMSwgMHhBMiwgMHg2MSwgMHhBMiwgMHg2MiwgMHhBMiwgMHg2MywgLyogMHgyQy0weDJGICovCisJMHhBMiwgMHg2NCwgMHhBMiwgMHg2NSwgMHhBMiwgMHg2NiwgMHhBMiwgMHg2NywgLyogMHgzMC0weDMzICovCisJMHhDMSwgMHhFMiwgMHhBMiwgMHg2OCwgMHhBMiwgMHg2OSwgMHhBMiwgMHg2QSwgLyogMHgzNC0weDM3ICovCisJMHhBMiwgMHg2QiwgMHhBMiwgMHg2QywgMHhBMiwgMHg2RCwgMHhBMiwgMHg2RSwgLyogMHgzOC0weDNCICovCisJMHhBMiwgMHg2RiwgMHhBMiwgMHg3MCwgMHhBMiwgMHg3MSwgMHhBMiwgMHg3MiwgLyogMHgzQy0weDNGICovCisJMHhBMiwgMHg3MywgMHhBMiwgMHg3NCwgMHhBMiwgMHg3NSwgMHhBMiwgMHg3NiwgLyogMHg0MC0weDQzICovCisJMHhBMiwgMHg3NywgMHhBMiwgMHg3OCwgMHhBMiwgMHg3OSwgMHhBMiwgMHg3QSwgLyogMHg0NC0weDQ3ICovCisJMHhBMiwgMHg4MSwgMHhBMiwgMHg4MiwgMHhBMiwgMHg4MywgMHhBMiwgMHg4NCwgLyogMHg0OC0weDRCICovCisJMHhBMiwgMHg4NSwgMHhBMiwgMHg4NiwgMHhBMiwgMHg4NywgMHhBMiwgMHg4OCwgLyogMHg0Qy0weDRGICovCisJMHhDMSwgMHhFMywgMHhDMSwgMHhFNCwgMHhBMiwgMHg4OSwgMHhBMiwgMHg4QSwgLyogMHg1MC0weDUzICovCisJMHhDMSwgMHhFNSwgMHhBMiwgMHg4QiwgMHhBMiwgMHg4QywgMHhBMiwgMHg4RCwgLyogMHg1NC0weDU3ICovCisJMHhDMSwgMHhFNiwgMHhBMiwgMHg4RSwgMHhBMiwgMHg4RiwgMHhBMiwgMHg5MCwgLyogMHg1OC0weDVCICovCisJMHhBMiwgMHg5MSwgMHhBMiwgMHg5MiwgMHhBMiwgMHg5MywgMHhBMiwgMHg5NCwgLyogMHg1Qy0weDVGICovCisJMHhDMSwgMHhFNywgMHhDMSwgMHhFOCwgMHhBMiwgMHg5NSwgMHhDMSwgMHhFOSwgLyogMHg2MC0weDYzICovCisJMHhBMiwgMHg5NiwgMHhBMiwgMHg5NywgMHhBMiwgMHg5OCwgMHhBMiwgMHg5OSwgLyogMHg2NC0weDY3ICovCisJMHhBMiwgMHg5QSwgMHhBMiwgMHg5QiwgMHhBMiwgMHg5QywgMHhBMiwgMHg5RCwgLyogMHg2OC0weDZCICovCisJMHhDMSwgMHhFQSwgMHhBMiwgMHg5RSwgMHhBMiwgMHg5RiwgMHhBMiwgMHhBMCwgLyogMHg2Qy0weDZGICovCisJMHhDMSwgMHhFQiwgMHhBMywgMHg0MSwgMHhBMywgMHg0MiwgMHhBMywgMHg0MywgLyogMHg3MC0weDczICovCisJMHhDMSwgMHhFQywgMHhBMywgMHg0NCwgMHhBMywgMHg0NSwgMHhBMywgMHg0NiwgLyogMHg3NC0weDc3ICovCisJMHhBMywgMHg0NywgMHhBMywgMHg0OCwgMHhBMywgMHg0OSwgMHhBMywgMHg0QSwgLyogMHg3OC0weDdCICovCisJMHhDMSwgMHhFRCwgMHhBMywgMHg0QiwgMHhBMywgMHg0QywgMHhBMywgMHg0RCwgLyogMHg3Qy0weDdGICovCisJCisJMHhBMywgMHg0RSwgMHhBMywgMHg0RiwgMHhBMywgMHg1MCwgMHhBMywgMHg1MSwgLyogMHg4MC0weDgzICovCisJMHhBMywgMHg1MiwgMHhBMywgMHg1MywgMHhBMywgMHg1NCwgMHhBMywgMHg1NSwgLyogMHg4NC0weDg3ICovCisJMHhDMSwgMHhFRSwgMHhDMSwgMHhFRiwgMHhBMywgMHg1NiwgMHhBMywgMHg1NywgLyogMHg4OC0weDhCICovCisJMHhDMSwgMHhGMCwgMHhBMywgMHg1OCwgMHhBMywgMHg1OSwgMHhBMywgMHg1QSwgLyogMHg4Qy0weDhGICovCisJMHhDMSwgMHhGMSwgMHhBMywgMHg2MSwgMHhBMywgMHg2MiwgMHhBMywgMHg2MywgLyogMHg5MC0weDkzICovCisJMHhBMywgMHg2NCwgMHhBMywgMHg2NSwgMHhBMywgMHg2NiwgMHhBMywgMHg2NywgLyogMHg5NC0weDk3ICovCisJMHhDMSwgMHhGMiwgMHhDMSwgMHhGMywgMHhBMywgMHg2OCwgMHhDMSwgMHhGNCwgLyogMHg5OC0weDlCICovCisJMHhBMywgMHg2OSwgMHhDMSwgMHhGNSwgMHhBMywgMHg2QSwgMHhBMywgMHg2QiwgLyogMHg5Qy0weDlGICovCisJMHhBMywgMHg2QywgMHhBMywgMHg2RCwgMHhBMywgMHg2RSwgMHhBMywgMHg2RiwgLyogMHhBMC0weEEzICovCisJMHhBMywgMHg3MCwgMHhBMywgMHg3MSwgMHhBMywgMHg3MiwgMHhBMywgMHg3MywgLyogMHhBNC0weEE3ICovCisJMHhBMywgMHg3NCwgMHhBMywgMHg3NSwgMHhBMywgMHg3NiwgMHhBMywgMHg3NywgLyogMHhBOC0weEFCICovCisJMHhBMywgMHg3OCwgMHhBMywgMHg3OSwgMHhBMywgMHg3QSwgMHhBMywgMHg4MSwgLyogMHhBQy0weEFGICovCisJMHhBMywgMHg4MiwgMHhBMywgMHg4MywgMHhBMywgMHg4NCwgMHhBMywgMHg4NSwgLyogMHhCMC0weEIzICovCisJMHhBMywgMHg4NiwgMHhBMywgMHg4NywgMHhBMywgMHg4OCwgMHhBMywgMHg4OSwgLyogMHhCNC0weEI3ICovCisJMHhBMywgMHg4QSwgMHhBMywgMHg4QiwgMHhBMywgMHg4QywgMHhBMywgMHg4RCwgLyogMHhCOC0weEJCICovCisJMHhBMywgMHg4RSwgMHhBMywgMHg4RiwgMHhBMywgMHg5MCwgMHhBMywgMHg5MSwgLyogMHhCQy0weEJGICovCisJMHhDMSwgMHhGNiwgMHhDMSwgMHhGNywgMHhBMywgMHg5MiwgMHhBMywgMHg5MywgLyogMHhDMC0weEMzICovCisJMHhDMSwgMHhGOCwgMHhBMywgMHg5NCwgMHhBMywgMHg5NSwgMHhDMSwgMHhGOSwgLyogMHhDNC0weEM3ICovCisJMHhDMSwgMHhGQSwgMHhBMywgMHg5NiwgMHhDMSwgMHhGQiwgMHhBMywgMHg5NywgLyogMHhDOC0weENCICovCisJMHhBMywgMHg5OCwgMHhBMywgMHg5OSwgMHhBMywgMHg5QSwgMHhBMywgMHg5QiwgLyogMHhDQy0weENGICovCisJMHhDMSwgMHhGQywgMHhDMSwgMHhGRCwgMHhBMywgMHg5QywgMHhDMSwgMHhGRSwgLyogMHhEMC0weEQzICovCisJMHhBMywgMHg5RCwgMHhDMiwgMHhBMSwgMHhDMiwgMHhBMiwgMHhBMywgMHg5RSwgLyogMHhENC0weEQ3ICovCisJMHhBMywgMHg5RiwgMHhDMiwgMHhBMywgMHhDMiwgMHhBNCwgMHhBMywgMHhBMCwgLyogMHhEOC0weERCICovCisJMHhDMiwgMHhBNSwgMHhDMiwgMHhBNiwgMHhBNCwgMHg0MSwgMHhBNCwgMHg0MiwgLyogMHhEQy0weERGICovCisJMHhDMiwgMHhBNywgMHhBNCwgMHg0MywgMHhDMiwgMHhBOCwgMHhBNCwgMHg0NCwgLyogMHhFMC0weEUzICovCisJMHhDMiwgMHhBOSwgMHhBNCwgMHg0NSwgMHhBNCwgMHg0NiwgMHhDMiwgMHhBQSwgLyogMHhFNC0weEU3ICovCisJMHhBNCwgMHg0NywgMHhBNCwgMHg0OCwgMHhBNCwgMHg0OSwgMHhBNCwgMHg0QSwgLyogMHhFOC0weEVCICovCisJMHhDMiwgMHhBQiwgMHhDMiwgMHhBQywgMHhBNCwgMHg0QiwgMHhDMiwgMHhBRCwgLyogMHhFQy0weEVGICovCisJMHhDMiwgMHhBRSwgMHhDMiwgMHhBRiwgMHhBNCwgMHg0QywgMHhBNCwgMHg0RCwgLyogMHhGMC0weEYzICovCisJMHhBNCwgMHg0RSwgMHhBNCwgMHg0RiwgMHhBNCwgMHg1MCwgMHhBNCwgMHg1MSwgLyogMHhGNC0weEY3ICovCisJMHhDMiwgMHhCMCwgMHhDMiwgMHhCMSwgMHhBNCwgMHg1MiwgMHhBNCwgMHg1MywgLyogMHhGOC0weEZCICovCisJMHhDMiwgMHhCMiwgMHhBNCwgMHg1NCwgMHhBNCwgMHg1NSwgMHhBNCwgMHg1NiwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfQ0FbNTEyXSA9IHsKKwkweEMyLCAweEIzLCAweEE0LCAweDU3LCAweEE0LCAweDU4LCAweEE0LCAweDU5LCAvKiAweDAwLTB4MDMgKi8KKwkweEE0LCAweDVBLCAweEE0LCAweDYxLCAweEE0LCAweDYyLCAweEE0LCAweDYzLCAvKiAweDA0LTB4MDcgKi8KKwkweEMyLCAweEI0LCAweEMyLCAweEI1LCAweEE0LCAweDY0LCAweEMyLCAweEI2LCAvKiAweDA4LTB4MEIgKi8KKwkweEMyLCAweEI3LCAweEMyLCAweEI4LCAweEE0LCAweDY1LCAweEE0LCAweDY2LCAvKiAweDBDLTB4MEYgKi8KKwkweEE0LCAweDY3LCAweEE0LCAweDY4LCAweEE0LCAweDY5LCAweEE0LCAweDZBLCAvKiAweDEwLTB4MTMgKi8KKwkweEMyLCAweEI5LCAweEE0LCAweDZCLCAweEE0LCAweDZDLCAweEE0LCAweDZELCAvKiAweDE0LTB4MTcgKi8KKwkweEMyLCAweEJBLCAweEE0LCAweDZFLCAweEE0LCAweDZGLCAweEE0LCAweDcwLCAvKiAweDE4LTB4MUIgKi8KKwkweEE0LCAweDcxLCAweEE0LCAweDcyLCAweEE0LCAweDczLCAweEE0LCAweDc0LCAvKiAweDFDLTB4MUYgKi8KKwkweEE0LCAweDc1LCAweEE0LCAweDc2LCAweEE0LCAweDc3LCAweEE0LCAweDc4LCAvKiAweDIwLTB4MjMgKi8KKwkweEE0LCAweDc5LCAweEE0LCAweDdBLCAweEE0LCAweDgxLCAweEE0LCAweDgyLCAvKiAweDI0LTB4MjcgKi8KKwkweEE0LCAweDgzLCAweEMyLCAweEJCLCAweEE0LCAweDg0LCAweEE0LCAweDg1LCAvKiAweDI4LTB4MkIgKi8KKwkweEE0LCAweDg2LCAweEE0LCAweDg3LCAweEE0LCAweDg4LCAweEE0LCAweDg5LCAvKiAweDJDLTB4MkYgKi8KKwkweEE0LCAweDhBLCAweEE0LCAweDhCLCAweEE0LCAweDhDLCAweEE0LCAweDhELCAvKiAweDMwLTB4MzMgKi8KKwkweEE0LCAweDhFLCAweEE0LCAweDhGLCAweEE0LCAweDkwLCAweEE0LCAweDkxLCAvKiAweDM0LTB4MzcgKi8KKwkweEE0LCAweDkyLCAweEE0LCAweDkzLCAweEE0LCAweDk0LCAweEE0LCAweDk1LCAvKiAweDM4LTB4M0IgKi8KKwkweEE0LCAweDk2LCAweEE0LCAweDk3LCAweEE0LCAweDk4LCAweEE0LCAweDk5LCAvKiAweDNDLTB4M0YgKi8KKwkweEE0LCAweDlBLCAweEE0LCAweDlCLCAweEE0LCAweDlDLCAweEE0LCAweDlELCAvKiAweDQwLTB4NDMgKi8KKwkweEE0LCAweDlFLCAweEE0LCAweDlGLCAweEE0LCAweEEwLCAweEE1LCAweDQxLCAvKiAweDQ0LTB4NDcgKi8KKwkweEE1LCAweDQyLCAweEE1LCAweDQzLCAweEE1LCAweDQ0LCAweEE1LCAweDQ1LCAvKiAweDQ4LTB4NEIgKi8KKwkweEMyLCAweEJDLCAweEMyLCAweEJELCAweEE1LCAweDQ2LCAweEE1LCAweDQ3LCAvKiAweDRDLTB4NEYgKi8KKwkweEMyLCAweEJFLCAweEE1LCAweDQ4LCAweEE1LCAweDQ5LCAweEE1LCAweDRBLCAvKiAweDUwLTB4NTMgKi8KKwkweEMyLCAweEJGLCAweEE1LCAweDRCLCAweEE1LCAweDRDLCAweEE1LCAweDRELCAvKiAweDU0LTB4NTcgKi8KKwkweEE1LCAweDRFLCAweEE1LCAweDRGLCAweEE1LCAweDUwLCAweEE1LCAweDUxLCAvKiAweDU4LTB4NUIgKi8KKwkweEMyLCAweEMwLCAweEMyLCAweEMxLCAweEE1LCAweDUyLCAweEMyLCAweEMyLCAvKiAweDVDLTB4NUYgKi8KKwkweEMyLCAweEMzLCAweEMyLCAweEM0LCAweEE1LCAweDUzLCAweEE1LCAweDU0LCAvKiAweDYwLTB4NjMgKi8KKwkweEE1LCAweDU1LCAweEE1LCAweDU2LCAweEE1LCAweDU3LCAweEE1LCAweDU4LCAvKiAweDY0LTB4NjcgKi8KKwkweEMyLCAweEM1LCAweEE1LCAweDU5LCAweEE1LCAweDVBLCAweEE1LCAweDYxLCAvKiAweDY4LTB4NkIgKi8KKwkweEE1LCAweDYyLCAweEE1LCAweDYzLCAweEE1LCAweDY0LCAweEE1LCAweDY1LCAvKiAweDZDLTB4NkYgKi8KKwkweEE1LCAweDY2LCAweEE1LCAweDY3LCAweEE1LCAweDY4LCAweEE1LCAweDY5LCAvKiAweDcwLTB4NzMgKi8KKwkweEE1LCAweDZBLCAweEE1LCAweDZCLCAweEE1LCAweDZDLCAweEE1LCAweDZELCAvKiAweDc0LTB4NzcgKi8KKwkweEE1LCAweDZFLCAweEE1LCAweDZGLCAweEE1LCAweDcwLCAweEE1LCAweDcxLCAvKiAweDc4LTB4N0IgKi8KKwkweEE1LCAweDcyLCAweEMyLCAweEM2LCAweEE1LCAweDczLCAweEE1LCAweDc0LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEE1LCAweDc1LCAweEE1LCAweDc2LCAweEE1LCAweDc3LCAweEE1LCAweDc4LCAvKiAweDgwLTB4ODMgKi8KKwkweEMyLCAweEM3LCAweEE1LCAweDc5LCAweEE1LCAweDdBLCAweEE1LCAweDgxLCAvKiAweDg0LTB4ODcgKi8KKwkweEE1LCAweDgyLCAweEE1LCAweDgzLCAweEE1LCAweDg0LCAweEE1LCAweDg1LCAvKiAweDg4LTB4OEIgKi8KKwkweEE1LCAweDg2LCAweEE1LCAweDg3LCAweEE1LCAweDg4LCAweEE1LCAweDg5LCAvKiAweDhDLTB4OEYgKi8KKwkweEE1LCAweDhBLCAweEE1LCAweDhCLCAweEE1LCAweDhDLCAweEE1LCAweDhELCAvKiAweDkwLTB4OTMgKi8KKwkweEE1LCAweDhFLCAweEE1LCAweDhGLCAweEE1LCAweDkwLCAweEE1LCAweDkxLCAvKiAweDk0LTB4OTcgKi8KKwkweEMyLCAweEM4LCAweEE1LCAweDkyLCAweEE1LCAweDkzLCAweEE1LCAweDk0LCAvKiAweDk4LTB4OUIgKi8KKwkweEE1LCAweDk1LCAweEE1LCAweDk2LCAweEE1LCAweDk3LCAweEE1LCAweDk4LCAvKiAweDlDLTB4OUYgKi8KKwkweEE1LCAweDk5LCAweEE1LCAweDlBLCAweEE1LCAweDlCLCAweEE1LCAweDlDLCAvKiAweEEwLTB4QTMgKi8KKwkweEE1LCAweDlELCAweEE1LCAweDlFLCAweEE1LCAweDlGLCAweEE1LCAweEEwLCAvKiAweEE0LTB4QTcgKi8KKwkweEE2LCAweDQxLCAweEE2LCAweDQyLCAweEE2LCAweDQzLCAweEE2LCAweDQ0LCAvKiAweEE4LTB4QUIgKi8KKwkweEE2LCAweDQ1LCAweEE2LCAweDQ2LCAweEE2LCAweDQ3LCAweEE2LCAweDQ4LCAvKiAweEFDLTB4QUYgKi8KKwkweEE2LCAweDQ5LCAweEE2LCAweDRBLCAweEE2LCAweDRCLCAweEE2LCAweDRDLCAvKiAweEIwLTB4QjMgKi8KKwkweEE2LCAweDRELCAweEE2LCAweDRFLCAweEE2LCAweDRGLCAweEE2LCAweDUwLCAvKiAweEI0LTB4QjcgKi8KKwkweEE2LCAweDUxLCAweEE2LCAweDUyLCAweEE2LCAweDUzLCAweEE2LCAweDU0LCAvKiAweEI4LTB4QkIgKi8KKwkweEMyLCAweEM5LCAweEMyLCAweENBLCAweEE2LCAweDU1LCAweEE2LCAweDU2LCAvKiAweEJDLTB4QkYgKi8KKwkweEMyLCAweENCLCAweEE2LCAweDU3LCAweEE2LCAweDU4LCAweEE2LCAweDU5LCAvKiAweEMwLTB4QzMgKi8KKwkweEMyLCAweENDLCAweEE2LCAweDVBLCAweEE2LCAweDYxLCAweEE2LCAweDYyLCAvKiAweEM0LTB4QzcgKi8KKwkweEE2LCAweDYzLCAweEE2LCAweDY0LCAweEE2LCAweDY1LCAweEE2LCAweDY2LCAvKiAweEM4LTB4Q0IgKi8KKwkweEMyLCAweENELCAweEMyLCAweENFLCAweEE2LCAweDY3LCAweEMyLCAweENGLCAvKiAweENDLTB4Q0YgKi8KKwkweEE2LCAweDY4LCAweEMyLCAweEQwLCAweEE2LCAweDY5LCAweEMyLCAweEQxLCAvKiAweEQwLTB4RDMgKi8KKwkweEE2LCAweDZBLCAweEE2LCAweDZCLCAweEE2LCAweDZDLCAweEE2LCAweDZELCAvKiAweEQ0LTB4RDcgKi8KKwkweEMyLCAweEQyLCAweEMyLCAweEQzLCAweEE2LCAweDZFLCAweEE2LCAweDZGLCAvKiAweEQ4LTB4REIgKi8KKwkweEE2LCAweDcwLCAweEE2LCAweDcxLCAweEE2LCAweDcyLCAweEE2LCAweDczLCAvKiAweERDLTB4REYgKi8KKwkweEMyLCAweEQ0LCAweEE2LCAweDc0LCAweEE2LCAweDc1LCAweEE2LCAweDc2LCAvKiAweEUwLTB4RTMgKi8KKwkweEE2LCAweDc3LCAweEE2LCAweDc4LCAweEE2LCAweDc5LCAweEE2LCAweDdBLCAvKiAweEU0LTB4RTcgKi8KKwkweEE2LCAweDgxLCAweEE2LCAweDgyLCAweEE2LCAweDgzLCAweEE2LCAweDg0LCAvKiAweEU4LTB4RUIgKi8KKwkweEMyLCAweEQ1LCAweEE2LCAweDg1LCAweEE2LCAweDg2LCAweEE2LCAweDg3LCAvKiAweEVDLTB4RUYgKi8KKwkweEE2LCAweDg4LCAweEE2LCAweDg5LCAweEE2LCAweDhBLCAweEE2LCAweDhCLCAvKiAweEYwLTB4RjMgKi8KKwkweEMyLCAweEQ2LCAweEE2LCAweDhDLCAweEE2LCAweDhELCAweEE2LCAweDhFLCAvKiAweEY0LTB4RjcgKi8KKwkweEE2LCAweDhGLCAweEE2LCAweDkwLCAweEE2LCAweDkxLCAweEE2LCAweDkyLCAvKiAweEY4LTB4RkIgKi8KKwkweEE2LCAweDkzLCAweEE2LCAweDk0LCAweEE2LCAweDk1LCAweEE2LCAweDk2LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19DQls1MTJdID0geworCTB4QTYsIDB4OTcsIDB4QTYsIDB4OTgsIDB4QTYsIDB4OTksIDB4QTYsIDB4OUEsIC8qIDB4MDAtMHgwMyAqLworCTB4QTYsIDB4OUIsIDB4QTYsIDB4OUMsIDB4QTYsIDB4OUQsIDB4QTYsIDB4OUUsIC8qIDB4MDQtMHgwNyAqLworCTB4QzIsIDB4RDcsIDB4QTYsIDB4OUYsIDB4QTYsIDB4QTAsIDB4QTcsIDB4NDEsIC8qIDB4MDgtMHgwQiAqLworCTB4QTcsIDB4NDIsIDB4QTcsIDB4NDMsIDB4QTcsIDB4NDQsIDB4QTcsIDB4NDUsIC8qIDB4MEMtMHgwRiAqLworCTB4QzIsIDB4RDgsIDB4QTcsIDB4NDYsIDB4QTcsIDB4NDcsIDB4QTcsIDB4NDgsIC8qIDB4MTAtMHgxMyAqLworCTB4QzIsIDB4RDksIDB4QTcsIDB4NDksIDB4QTcsIDB4NEEsIDB4QTcsIDB4NEIsIC8qIDB4MTQtMHgxNyAqLworCTB4QzIsIDB4REEsIDB4QTcsIDB4NEMsIDB4QTcsIDB4NEQsIDB4QTcsIDB4NEUsIC8qIDB4MTgtMHgxQiAqLworCTB4QTcsIDB4NEYsIDB4QTcsIDB4NTAsIDB4QTcsIDB4NTEsIDB4QTcsIDB4NTIsIC8qIDB4MUMtMHgxRiAqLworCTB4QzIsIDB4REIsIDB4QzIsIDB4REMsIDB4QTcsIDB4NTMsIDB4QTcsIDB4NTQsIC8qIDB4MjAtMHgyMyAqLworCTB4QTcsIDB4NTUsIDB4QTcsIDB4NTYsIDB4QTcsIDB4NTcsIDB4QTcsIDB4NTgsIC8qIDB4MjQtMHgyNyAqLworCTB4QTcsIDB4NTksIDB4QTcsIDB4NUEsIDB4QTcsIDB4NjEsIDB4QTcsIDB4NjIsIC8qIDB4MjgtMHgyQiAqLworCTB4QTcsIDB4NjMsIDB4QTcsIDB4NjQsIDB4QTcsIDB4NjUsIDB4QTcsIDB4NjYsIC8qIDB4MkMtMHgyRiAqLworCTB4QTcsIDB4NjcsIDB4QTcsIDB4NjgsIDB4QTcsIDB4NjksIDB4QTcsIDB4NkEsIC8qIDB4MzAtMHgzMyAqLworCTB4QTcsIDB4NkIsIDB4QTcsIDB4NkMsIDB4QTcsIDB4NkQsIDB4QTcsIDB4NkUsIC8qIDB4MzQtMHgzNyAqLworCTB4QTcsIDB4NkYsIDB4QTcsIDB4NzAsIDB4QTcsIDB4NzEsIDB4QTcsIDB4NzIsIC8qIDB4MzgtMHgzQiAqLworCTB4QTcsIDB4NzMsIDB4QTcsIDB4NzQsIDB4QTcsIDB4NzUsIDB4QTcsIDB4NzYsIC8qIDB4M0MtMHgzRiAqLworCTB4QTcsIDB4NzcsIDB4QzIsIDB4REQsIDB4QTcsIDB4NzgsIDB4QTcsIDB4NzksIC8qIDB4NDAtMHg0MyAqLworCTB4QTcsIDB4N0EsIDB4QTcsIDB4ODEsIDB4QTcsIDB4ODIsIDB4QTcsIDB4ODMsIC8qIDB4NDQtMHg0NyAqLworCTB4QzIsIDB4REUsIDB4QzIsIDB4REYsIDB4QTcsIDB4ODQsIDB4QTcsIDB4ODUsIC8qIDB4NDgtMHg0QiAqLworCTB4QzIsIDB4RTAsIDB4QTcsIDB4ODYsIDB4QTcsIDB4ODcsIDB4QTcsIDB4ODgsIC8qIDB4NEMtMHg0RiAqLworCTB4QzIsIDB4RTEsIDB4QTcsIDB4ODksIDB4QTcsIDB4OEEsIDB4QTcsIDB4OEIsIC8qIDB4NTAtMHg1MyAqLworCTB4QTcsIDB4OEMsIDB4QTcsIDB4OEQsIDB4QTcsIDB4OEUsIDB4QTcsIDB4OEYsIC8qIDB4NTQtMHg1NyAqLworCTB4QzIsIDB4RTIsIDB4QzIsIDB4RTMsIDB4QTcsIDB4OTAsIDB4QTcsIDB4OTEsIC8qIDB4NTgtMHg1QiAqLworCTB4QTcsIDB4OTIsIDB4QzIsIDB4RTQsIDB4QTcsIDB4OTMsIDB4QTcsIDB4OTQsIC8qIDB4NUMtMHg1RiAqLworCTB4QTcsIDB4OTUsIDB4QTcsIDB4OTYsIDB4QTcsIDB4OTcsIDB4QTcsIDB4OTgsIC8qIDB4NjAtMHg2MyAqLworCTB4QzIsIDB4RTUsIDB4QTcsIDB4OTksIDB4QTcsIDB4OUEsIDB4QTcsIDB4OUIsIC8qIDB4NjQtMHg2NyAqLworCTB4QTcsIDB4OUMsIDB4QTcsIDB4OUQsIDB4QTcsIDB4OUUsIDB4QTcsIDB4OUYsIC8qIDB4NjgtMHg2QiAqLworCTB4QTcsIDB4QTAsIDB4QTgsIDB4NDEsIDB4QTgsIDB4NDIsIDB4QTgsIDB4NDMsIC8qIDB4NkMtMHg2RiAqLworCTB4QTgsIDB4NDQsIDB4QTgsIDB4NDUsIDB4QTgsIDB4NDYsIDB4QTgsIDB4NDcsIC8qIDB4NzAtMHg3MyAqLworCTB4QTgsIDB4NDgsIDB4QTgsIDB4NDksIDB4QTgsIDB4NEEsIDB4QTgsIDB4NEIsIC8qIDB4NzQtMHg3NyAqLworCTB4QzIsIDB4RTYsIDB4QzIsIDB4RTcsIDB4QTgsIDB4NEMsIDB4QTgsIDB4NEQsIC8qIDB4NzgtMHg3QiAqLworCTB4QTgsIDB4NEUsIDB4QTgsIDB4NEYsIDB4QTgsIDB4NTAsIDB4QTgsIDB4NTEsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QTgsIDB4NTIsIDB4QTgsIDB4NTMsIDB4QTgsIDB4NTQsIDB4QTgsIDB4NTUsIC8qIDB4ODAtMHg4MyAqLworCTB4QTgsIDB4NTYsIDB4QTgsIDB4NTcsIDB4QTgsIDB4NTgsIDB4QTgsIDB4NTksIC8qIDB4ODQtMHg4NyAqLworCTB4QTgsIDB4NUEsIDB4QTgsIDB4NjEsIDB4QTgsIDB4NjIsIDB4QTgsIDB4NjMsIC8qIDB4ODgtMHg4QiAqLworCTB4QTgsIDB4NjQsIDB4QTgsIDB4NjUsIDB4QTgsIDB4NjYsIDB4QTgsIDB4NjcsIC8qIDB4OEMtMHg4RiAqLworCTB4QTgsIDB4NjgsIDB4QTgsIDB4NjksIDB4QTgsIDB4NkEsIDB4QTgsIDB4NkIsIC8qIDB4OTAtMHg5MyAqLworCTB4QTgsIDB4NkMsIDB4QTgsIDB4NkQsIDB4QTgsIDB4NkUsIDB4QTgsIDB4NkYsIC8qIDB4OTQtMHg5NyAqLworCTB4QTgsIDB4NzAsIDB4QTgsIDB4NzEsIDB4QTgsIDB4NzIsIDB4QTgsIDB4NzMsIC8qIDB4OTgtMHg5QiAqLworCTB4QzIsIDB4RTgsIDB4QTgsIDB4NzQsIDB4QTgsIDB4NzUsIDB4QTgsIDB4NzYsIC8qIDB4OUMtMHg5RiAqLworCTB4QTgsIDB4NzcsIDB4QTgsIDB4NzgsIDB4QTgsIDB4NzksIDB4QTgsIDB4N0EsIC8qIDB4QTAtMHhBMyAqLworCTB4QTgsIDB4ODEsIDB4QTgsIDB4ODIsIDB4QTgsIDB4ODMsIDB4QTgsIDB4ODQsIC8qIDB4QTQtMHhBNyAqLworCTB4QTgsIDB4ODUsIDB4QTgsIDB4ODYsIDB4QTgsIDB4ODcsIDB4QTgsIDB4ODgsIC8qIDB4QTgtMHhBQiAqLworCTB4QTgsIDB4ODksIDB4QTgsIDB4OEEsIDB4QTgsIDB4OEIsIDB4QTgsIDB4OEMsIC8qIDB4QUMtMHhBRiAqLworCTB4QTgsIDB4OEQsIDB4QTgsIDB4OEUsIDB4QTgsIDB4OEYsIDB4QTgsIDB4OTAsIC8qIDB4QjAtMHhCMyAqLworCTB4QTgsIDB4OTEsIDB4QTgsIDB4OTIsIDB4QTgsIDB4OTMsIDB4QTgsIDB4OTQsIC8qIDB4QjQtMHhCNyAqLworCTB4QzIsIDB4RTksIDB4QTgsIDB4OTUsIDB4QTgsIDB4OTYsIDB4QTgsIDB4OTcsIC8qIDB4QjgtMHhCQiAqLworCTB4QTgsIDB4OTgsIDB4QTgsIDB4OTksIDB4QTgsIDB4OUEsIDB4QTgsIDB4OUIsIC8qIDB4QkMtMHhCRiAqLworCTB4QTgsIDB4OUMsIDB4QTgsIDB4OUQsIDB4QTgsIDB4OUUsIDB4QTgsIDB4OUYsIC8qIDB4QzAtMHhDMyAqLworCTB4QTgsIDB4QTAsIDB4QTksIDB4NDEsIDB4QTksIDB4NDIsIDB4QTksIDB4NDMsIC8qIDB4QzQtMHhDNyAqLworCTB4QTksIDB4NDQsIDB4QTksIDB4NDUsIDB4QTksIDB4NDYsIDB4QTksIDB4NDcsIC8qIDB4QzgtMHhDQiAqLworCTB4QTksIDB4NDgsIDB4QTksIDB4NDksIDB4QTksIDB4NEEsIDB4QTksIDB4NEIsIC8qIDB4Q0MtMHhDRiAqLworCTB4QTksIDB4NEMsIDB4QTksIDB4NEQsIDB4QTksIDB4NEUsIDB4QTksIDB4NEYsIC8qIDB4RDAtMHhEMyAqLworCTB4QzIsIDB4RUEsIDB4QTksIDB4NTAsIDB4QTksIDB4NTEsIDB4QTksIDB4NTIsIC8qIDB4RDQtMHhENyAqLworCTB4QTksIDB4NTMsIDB4QTksIDB4NTQsIDB4QTksIDB4NTUsIDB4QTksIDB4NTYsIC8qIDB4RDgtMHhEQiAqLworCTB4QTksIDB4NTcsIDB4QTksIDB4NTgsIDB4QTksIDB4NTksIDB4QTksIDB4NUEsIC8qIDB4REMtMHhERiAqLworCTB4QTksIDB4NjEsIDB4QTksIDB4NjIsIDB4QTksIDB4NjMsIDB4QTksIDB4NjQsIC8qIDB4RTAtMHhFMyAqLworCTB4QzIsIDB4RUIsIDB4QTksIDB4NjUsIDB4QTksIDB4NjYsIDB4QzIsIDB4RUMsIC8qIDB4RTQtMHhFNyAqLworCTB4QTksIDB4NjcsIDB4QzIsIDB4RUQsIDB4QTksIDB4NjgsIDB4QTksIDB4NjksIC8qIDB4RTgtMHhFQiAqLworCTB4QTksIDB4NkEsIDB4QTksIDB4NkIsIDB4QTksIDB4NkMsIDB4QTksIDB4NkQsIC8qIDB4RUMtMHhFRiAqLworCTB4QTksIDB4NkUsIDB4QTksIDB4NkYsIDB4QTksIDB4NzAsIDB4QTksIDB4NzEsIC8qIDB4RjAtMHhGMyAqLworCTB4QTksIDB4NzIsIDB4QTksIDB4NzMsIDB4QTksIDB4NzQsIDB4QTksIDB4NzUsIC8qIDB4RjQtMHhGNyAqLworCTB4QTksIDB4NzYsIDB4QTksIDB4NzcsIDB4QTksIDB4NzgsIDB4QTksIDB4NzksIC8qIDB4RjgtMHhGQiAqLworCTB4QTksIDB4N0EsIDB4QTksIDB4ODEsIDB4QTksIDB4ODIsIDB4QTksIDB4ODMsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0NDWzUxMl0gPSB7CisJMHhBOSwgMHg4NCwgMHhBOSwgMHg4NSwgMHhBOSwgMHg4NiwgMHhBOSwgMHg4NywgLyogMHgwMC0weDAzICovCisJMHhBOSwgMHg4OCwgMHhBOSwgMHg4OSwgMHhBOSwgMHg4QSwgMHhBOSwgMHg4QiwgLyogMHgwNC0weDA3ICovCisJMHhBOSwgMHg4QywgMHhBOSwgMHg4RCwgMHhBOSwgMHg4RSwgMHhBOSwgMHg4RiwgLyogMHgwOC0weDBCICovCisJMHhDMiwgMHhFRSwgMHhDMiwgMHhFRiwgMHhBOSwgMHg5MCwgMHhBOSwgMHg5MSwgLyogMHgwQy0weDBGICovCisJMHhDMiwgMHhGMCwgMHhBOSwgMHg5MiwgMHhBOSwgMHg5MywgMHhBOSwgMHg5NCwgLyogMHgxMC0weDEzICovCisJMHhDMiwgMHhGMSwgMHhBOSwgMHg5NSwgMHhBOSwgMHg5NiwgMHhBOSwgMHg5NywgLyogMHgxNC0weDE3ICovCisJMHhBOSwgMHg5OCwgMHhBOSwgMHg5OSwgMHhBOSwgMHg5QSwgMHhBOSwgMHg5QiwgLyogMHgxOC0weDFCICovCisJMHhDMiwgMHhGMiwgMHhDMiwgMHhGMywgMHhBOSwgMHg5QywgMHhBOSwgMHg5RCwgLyogMHgxQy0weDFGICovCisJMHhBOSwgMHg5RSwgMHhDMiwgMHhGNCwgMHhDMiwgMHhGNSwgMHhBOSwgMHg5RiwgLyogMHgyMC0weDIzICovCisJMHhBOSwgMHhBMCwgMHhBQSwgMHg0MSwgMHhBQSwgMHg0MiwgMHhDMiwgMHhGNiwgLyogMHgyNC0weDI3ICovCisJMHhDMiwgMHhGNywgMHhDMiwgMHhGOCwgMHhBQSwgMHg0MywgMHhBQSwgMHg0NCwgLyogMHgyOC0weDJCICovCisJMHhDMiwgMHhGOSwgMHhBQSwgMHg0NSwgMHhDMiwgMHhGQSwgMHhBQSwgMHg0NiwgLyogMHgyQy0weDJGICovCisJMHhDMiwgMHhGQiwgMHhBQSwgMHg0NywgMHhBQSwgMHg0OCwgMHhBQSwgMHg0OSwgLyogMHgzMC0weDMzICovCisJMHhBQSwgMHg0QSwgMHhBQSwgMHg0QiwgMHhBQSwgMHg0QywgMHhBQSwgMHg0RCwgLyogMHgzNC0weDM3ICovCisJMHhDMiwgMHhGQywgMHhDMiwgMHhGRCwgMHhBQSwgMHg0RSwgMHhDMiwgMHhGRSwgLyogMHgzOC0weDNCICovCisJMHhDMywgMHhBMSwgMHhDMywgMHhBMiwgMHhDMywgMHhBMywgMHhBQSwgMHg0RiwgLyogMHgzQy0weDNGICovCisJMHhBQSwgMHg1MCwgMHhBQSwgMHg1MSwgMHhBQSwgMHg1MiwgMHhBQSwgMHg1MywgLyogMHg0MC0weDQzICovCisJMHhDMywgMHhBNCwgMHhDMywgMHhBNSwgMHhBQSwgMHg1NCwgMHhBQSwgMHg1NSwgLyogMHg0NC0weDQ3ICovCisJMHhDMywgMHhBNiwgMHhBQSwgMHg1NiwgMHhBQSwgMHg1NywgMHhBQSwgMHg1OCwgLyogMHg0OC0weDRCICovCisJMHhDMywgMHhBNywgMHhBQSwgMHg1OSwgMHhBQSwgMHg1QSwgMHhBQSwgMHg2MSwgLyogMHg0Qy0weDRGICovCisJMHhBQSwgMHg2MiwgMHhBQSwgMHg2MywgMHhBQSwgMHg2NCwgMHhBQSwgMHg2NSwgLyogMHg1MC0weDUzICovCisJMHhDMywgMHhBOCwgMHhDMywgMHhBOSwgMHhBQSwgMHg2NiwgMHhDMywgMHhBQSwgLyogMHg1NC0weDU3ICovCisJMHhDMywgMHhBQiwgMHhDMywgMHhBQywgMHhBQSwgMHg2NywgMHhBQSwgMHg2OCwgLyogMHg1OC0weDVCICovCisJMHhBQSwgMHg2OSwgMHhBQSwgMHg2QSwgMHhBQSwgMHg2QiwgMHhBQSwgMHg2QywgLyogMHg1Qy0weDVGICovCisJMHhDMywgMHhBRCwgMHhBQSwgMHg2RCwgMHhBQSwgMHg2RSwgMHhBQSwgMHg2RiwgLyogMHg2MC0weDYzICovCisJMHhDMywgMHhBRSwgMHhBQSwgMHg3MCwgMHhDMywgMHhBRiwgMHhBQSwgMHg3MSwgLyogMHg2NC0weDY3ICovCisJMHhDMywgMHhCMCwgMHhBQSwgMHg3MiwgMHhBQSwgMHg3MywgMHhBQSwgMHg3NCwgLyogMHg2OC0weDZCICovCisJMHhBQSwgMHg3NSwgMHhBQSwgMHg3NiwgMHhBQSwgMHg3NywgMHhBQSwgMHg3OCwgLyogMHg2Qy0weDZGICovCisJMHhDMywgMHhCMSwgMHhBQSwgMHg3OSwgMHhBQSwgMHg3QSwgMHhBQSwgMHg4MSwgLyogMHg3MC0weDczICovCisJMHhBQSwgMHg4MiwgMHhDMywgMHhCMiwgMHhBQSwgMHg4MywgMHhBQSwgMHg4NCwgLyogMHg3NC0weDc3ICovCisJMHhBQSwgMHg4NSwgMHhBQSwgMHg4NiwgMHhBQSwgMHg4NywgMHhBQSwgMHg4OCwgLyogMHg3OC0weDdCICovCisJMHhBQSwgMHg4OSwgMHhBQSwgMHg4QSwgMHhBQSwgMHg4QiwgMHhBQSwgMHg4QywgLyogMHg3Qy0weDdGICovCisJCisJMHhBQSwgMHg4RCwgMHhBQSwgMHg4RSwgMHhBQSwgMHg4RiwgMHhBQSwgMHg5MCwgLyogMHg4MC0weDgzICovCisJMHhBQSwgMHg5MSwgMHhBQSwgMHg5MiwgMHhBQSwgMHg5MywgMHhBQSwgMHg5NCwgLyogMHg4NC0weDg3ICovCisJMHhBQSwgMHg5NSwgMHhBQSwgMHg5NiwgMHhBQSwgMHg5NywgMHhBQSwgMHg5OCwgLyogMHg4OC0weDhCICovCisJMHhBQSwgMHg5OSwgMHhBQSwgMHg5QSwgMHhBQSwgMHg5QiwgMHhBQSwgMHg5QywgLyogMHg4Qy0weDhGICovCisJMHhBQSwgMHg5RCwgMHhBQSwgMHg5RSwgMHhBQSwgMHg5RiwgMHhBQSwgMHhBMCwgLyogMHg5MC0weDkzICovCisJMHhBQiwgMHg0MSwgMHhBQiwgMHg0MiwgMHhBQiwgMHg0MywgMHhBQiwgMHg0NCwgLyogMHg5NC0weDk3ICovCisJMHhDMywgMHhCMywgMHhDMywgMHhCNCwgMHhBQiwgMHg0NSwgMHhBQiwgMHg0NiwgLyogMHg5OC0weDlCICovCisJMHhDMywgMHhCNSwgMHhBQiwgMHg0NywgMHhBQiwgMHg0OCwgMHhBQiwgMHg0OSwgLyogMHg5Qy0weDlGICovCisJMHhDMywgMHhCNiwgMHhBQiwgMHg0QSwgMHhBQiwgMHg0QiwgMHhBQiwgMHg0QywgLyogMHhBMC0weEEzICovCisJMHhBQiwgMHg0RCwgMHhBQiwgMHg0RSwgMHhBQiwgMHg0RiwgMHhBQiwgMHg1MCwgLyogMHhBNC0weEE3ICovCisJMHhDMywgMHhCNywgMHhDMywgMHhCOCwgMHhBQiwgMHg1MSwgMHhDMywgMHhCOSwgLyogMHhBOC0weEFCICovCisJMHhDMywgMHhCQSwgMHhDMywgMHhCQiwgMHhBQiwgMHg1MiwgMHhBQiwgMHg1MywgLyogMHhBQy0weEFGICovCisJMHhBQiwgMHg1NCwgMHhBQiwgMHg1NSwgMHhBQiwgMHg1NiwgMHhBQiwgMHg1NywgLyogMHhCMC0weEIzICovCisJMHhDMywgMHhCQywgMHhDMywgMHhCRCwgMHhBQiwgMHg1OCwgMHhBQiwgMHg1OSwgLyogMHhCNC0weEI3ICovCisJMHhDMywgMHhCRSwgMHhBQiwgMHg1QSwgMHhBQiwgMHg2MSwgMHhBQiwgMHg2MiwgLyogMHhCOC0weEJCICovCisJMHhDMywgMHhCRiwgMHhBQiwgMHg2MywgMHhBQiwgMHg2NCwgMHhBQiwgMHg2NSwgLyogMHhCQy0weEJGICovCisJMHhBQiwgMHg2NiwgMHhBQiwgMHg2NywgMHhBQiwgMHg2OCwgMHhBQiwgMHg2OSwgLyogMHhDMC0weEMzICovCisJMHhDMywgMHhDMCwgMHhDMywgMHhDMSwgMHhBQiwgMHg2QSwgMHhDMywgMHhDMiwgLyogMHhDNC0weEM3ICovCisJMHhBQiwgMHg2QiwgMHhDMywgMHhDMywgMHhBQiwgMHg2QywgMHhBQiwgMHg2RCwgLyogMHhDOC0weENCICovCisJMHhBQiwgMHg2RSwgMHhBQiwgMHg2RiwgMHhBQiwgMHg3MCwgMHhBQiwgMHg3MSwgLyogMHhDQy0weENGICovCisJMHhDMywgMHhDNCwgMHhBQiwgMHg3MiwgMHhBQiwgMHg3MywgMHhBQiwgMHg3NCwgLyogMHhEMC0weEQzICovCisJMHhDMywgMHhDNSwgMHhBQiwgMHg3NSwgMHhBQiwgMHg3NiwgMHhBQiwgMHg3NywgLyogMHhENC0weEQ3ICovCisJMHhBQiwgMHg3OCwgMHhBQiwgMHg3OSwgMHhBQiwgMHg3QSwgMHhBQiwgMHg4MSwgLyogMHhEOC0weERCICovCisJMHhBQiwgMHg4MiwgMHhBQiwgMHg4MywgMHhBQiwgMHg4NCwgMHhBQiwgMHg4NSwgLyogMHhEQy0weERGICovCisJMHhBQiwgMHg4NiwgMHhBQiwgMHg4NywgMHhBQiwgMHg4OCwgMHhBQiwgMHg4OSwgLyogMHhFMC0weEUzICovCisJMHhDMywgMHhDNiwgMHhBQiwgMHg4QSwgMHhBQiwgMHg4QiwgMHhBQiwgMHg4QywgLyogMHhFNC0weEU3ICovCisJMHhBQiwgMHg4RCwgMHhBQiwgMHg4RSwgMHhBQiwgMHg4RiwgMHhBQiwgMHg5MCwgLyogMHhFOC0weEVCICovCisJMHhDMywgMHhDNywgMHhBQiwgMHg5MSwgMHhBQiwgMHg5MiwgMHhBQiwgMHg5MywgLyogMHhFQy0weEVGICovCisJMHhDMywgMHhDOCwgMHhBQiwgMHg5NCwgMHhBQiwgMHg5NSwgMHhBQiwgMHg5NiwgLyogMHhGMC0weEYzICovCisJMHhBQiwgMHg5NywgMHhBQiwgMHg5OCwgMHhBQiwgMHg5OSwgMHhBQiwgMHg5QSwgLyogMHhGNC0weEY3ICovCisJMHhBQiwgMHg5QiwgMHhBQiwgMHg5QywgMHhBQiwgMHg5RCwgMHhBQiwgMHg5RSwgLyogMHhGOC0weEZCICovCisJMHhBQiwgMHg5RiwgMHhBQiwgMHhBMCwgMHhBQywgMHg0MSwgMHhBQywgMHg0MiwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfQ0RbNTEyXSA9IHsKKwkweEFDLCAweDQzLCAweEMzLCAweEM5LCAweEFDLCAweDQ0LCAweEFDLCAweDQ1LCAvKiAweDAwLTB4MDMgKi8KKwkweEFDLCAweDQ2LCAweEFDLCAweDQ3LCAweEFDLCAweDQ4LCAweEFDLCAweDQ5LCAvKiAweDA0LTB4MDcgKi8KKwkweEMzLCAweENBLCAweEMzLCAweENCLCAweEFDLCAweDRBLCAweEFDLCAweDRCLCAvKiAweDA4LTB4MEIgKi8KKwkweEMzLCAweENDLCAweEFDLCAweDRDLCAweEFDLCAweDRELCAweEFDLCAweDRFLCAvKiAweDBDLTB4MEYgKi8KKwkweEMzLCAweENELCAweEFDLCAweDRGLCAweEFDLCAweDUwLCAweEFDLCAweDUxLCAvKiAweDEwLTB4MTMgKi8KKwkweEFDLCAweDUyLCAweEFDLCAweDUzLCAweEFDLCAweDU0LCAweEFDLCAweDU1LCAvKiAweDE0LTB4MTcgKi8KKwkweEMzLCAweENFLCAweEMzLCAweENGLCAweEFDLCAweDU2LCAweEMzLCAweEQwLCAvKiAweDE4LTB4MUIgKi8KKwkweEFDLCAweDU3LCAweEMzLCAweEQxLCAweEFDLCAweDU4LCAweEFDLCAweDU5LCAvKiAweDFDLTB4MUYgKi8KKwkweEFDLCAweDVBLCAweEFDLCAweDYxLCAweEFDLCAweDYyLCAweEFDLCAweDYzLCAvKiAweDIwLTB4MjMgKi8KKwkweEMzLCAweEQyLCAweEFDLCAweDY0LCAweEFDLCAweDY1LCAweEFDLCAweDY2LCAvKiAweDI0LTB4MjcgKi8KKwkweEMzLCAweEQzLCAweEFDLCAweDY3LCAweEFDLCAweDY4LCAweEFDLCAweDY5LCAvKiAweDI4LTB4MkIgKi8KKwkweEMzLCAweEQ0LCAweEFDLCAweDZBLCAweEFDLCAweDZCLCAweEFDLCAweDZDLCAvKiAweDJDLTB4MkYgKi8KKwkweEFDLCAweDZELCAweEFDLCAweDZFLCAweEFDLCAweDZGLCAweEFDLCAweDcwLCAvKiAweDMwLTB4MzMgKi8KKwkweEFDLCAweDcxLCAweEFDLCAweDcyLCAweEFDLCAweDczLCAweEFDLCAweDc0LCAvKiAweDM0LTB4MzcgKi8KKwkweEFDLCAweDc1LCAweEMzLCAweEQ1LCAweEFDLCAweDc2LCAweEFDLCAweDc3LCAvKiAweDM4LTB4M0IgKi8KKwkweEFDLCAweDc4LCAweEFDLCAweDc5LCAweEFDLCAweDdBLCAweEFDLCAweDgxLCAvKiAweDNDLTB4M0YgKi8KKwkweEFDLCAweDgyLCAweEFDLCAweDgzLCAweEFDLCAweDg0LCAweEFDLCAweDg1LCAvKiAweDQwLTB4NDMgKi8KKwkweEFDLCAweDg2LCAweEFDLCAweDg3LCAweEFDLCAweDg4LCAweEFDLCAweDg5LCAvKiAweDQ0LTB4NDcgKi8KKwkweEFDLCAweDhBLCAweEFDLCAweDhCLCAweEFDLCAweDhDLCAweEFDLCAweDhELCAvKiAweDQ4LTB4NEIgKi8KKwkweEFDLCAweDhFLCAweEFDLCAweDhGLCAweEFDLCAweDkwLCAweEFDLCAweDkxLCAvKiAweDRDLTB4NEYgKi8KKwkweEFDLCAweDkyLCAweEFDLCAweDkzLCAweEFDLCAweDk0LCAweEFDLCAweDk1LCAvKiAweDUwLTB4NTMgKi8KKwkweEFDLCAweDk2LCAweEFDLCAweDk3LCAweEFDLCAweDk4LCAweEFDLCAweDk5LCAvKiAweDU0LTB4NTcgKi8KKwkweEFDLCAweDlBLCAweEFDLCAweDlCLCAweEFDLCAweDlDLCAweEFDLCAweDlELCAvKiAweDU4LTB4NUIgKi8KKwkweEMzLCAweEQ2LCAweEFDLCAweDlFLCAweEFDLCAweDlGLCAweEFDLCAweEEwLCAvKiAweDVDLTB4NUYgKi8KKwkweEMzLCAweEQ3LCAweEFELCAweDQxLCAweEFELCAweDQyLCAweEFELCAweDQzLCAvKiAweDYwLTB4NjMgKi8KKwkweEMzLCAweEQ4LCAweEFELCAweDQ0LCAweEFELCAweDQ1LCAweEFELCAweDQ2LCAvKiAweDY0LTB4NjcgKi8KKwkweEFELCAweDQ3LCAweEFELCAweDQ4LCAweEFELCAweDQ5LCAweEFELCAweDRBLCAvKiAweDY4LTB4NkIgKi8KKwkweEMzLCAweEQ5LCAweEMzLCAweERBLCAweEFELCAweDRCLCAweEMzLCAweERCLCAvKiAweDZDLTB4NkYgKi8KKwkweEFELCAweDRDLCAweEMzLCAweERDLCAweEFELCAweDRELCAweEFELCAweDRFLCAvKiAweDcwLTB4NzMgKi8KKwkweEFELCAweDRGLCAweEFELCAweDUwLCAweEFELCAweDUxLCAweEFELCAweDUyLCAvKiAweDc0LTB4NzcgKi8KKwkweEMzLCAweERELCAweEFELCAweDUzLCAweEFELCAweDU0LCAweEFELCAweDU1LCAvKiAweDc4LTB4N0IgKi8KKwkweEFELCAweDU2LCAweEFELCAweDU3LCAweEFELCAweDU4LCAweEFELCAweDU5LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEFELCAweDVBLCAweEFELCAweDYxLCAweEFELCAweDYyLCAweEFELCAweDYzLCAvKiAweDgwLTB4ODMgKi8KKwkweEFELCAweDY0LCAweEFELCAweDY1LCAweEFELCAweDY2LCAweEFELCAweDY3LCAvKiAweDg0LTB4ODcgKi8KKwkweEMzLCAweERFLCAweEFELCAweDY4LCAweEFELCAweDY5LCAweEFELCAweDZBLCAvKiAweDg4LTB4OEIgKi8KKwkweEFELCAweDZCLCAweEFELCAweDZDLCAweEFELCAweDZELCAweEFELCAweDZFLCAvKiAweDhDLTB4OEYgKi8KKwkweEFELCAweDZGLCAweEFELCAweDcwLCAweEFELCAweDcxLCAweEFELCAweDcyLCAvKiAweDkwLTB4OTMgKi8KKwkweEMzLCAweERGLCAweEMzLCAweEUwLCAweEFELCAweDczLCAweEFELCAweDc0LCAvKiAweDk0LTB4OTcgKi8KKwkweEMzLCAweEUxLCAweEFELCAweDc1LCAweEFELCAweDc2LCAweEFELCAweDc3LCAvKiAweDk4LTB4OUIgKi8KKwkweEMzLCAweEUyLCAweEFELCAweDc4LCAweEFELCAweDc5LCAweEFELCAweDdBLCAvKiAweDlDLTB4OUYgKi8KKwkweEFELCAweDgxLCAweEFELCAweDgyLCAweEFELCAweDgzLCAweEFELCAweDg0LCAvKiAweEEwLTB4QTMgKi8KKwkweEMzLCAweEUzLCAweEMzLCAweEU0LCAweEFELCAweDg1LCAweEMzLCAweEU1LCAvKiAweEE0LTB4QTcgKi8KKwkweEFELCAweDg2LCAweEMzLCAweEU2LCAweEFELCAweDg3LCAweEFELCAweDg4LCAvKiAweEE4LTB4QUIgKi8KKwkweEFELCAweDg5LCAweEFELCAweDhBLCAweEFELCAweDhCLCAweEFELCAweDhDLCAvKiAweEFDLTB4QUYgKi8KKwkweEMzLCAweEU3LCAweEFELCAweDhELCAweEFELCAweDhFLCAweEFELCAweDhGLCAvKiAweEIwLTB4QjMgKi8KKwkweEFELCAweDkwLCAweEFELCAweDkxLCAweEFELCAweDkyLCAweEFELCAweDkzLCAvKiAweEI0LTB4QjcgKi8KKwkweEFELCAweDk0LCAweEFELCAweDk1LCAweEFELCAweDk2LCAweEFELCAweDk3LCAvKiAweEI4LTB4QkIgKi8KKwkweEFELCAweDk4LCAweEFELCAweDk5LCAweEFELCAweDlBLCAweEFELCAweDlCLCAvKiAweEJDLTB4QkYgKi8KKwkweEFELCAweDlDLCAweEFELCAweDlELCAweEFELCAweDlFLCAweEFELCAweDlGLCAvKiAweEMwLTB4QzMgKi8KKwkweEMzLCAweEU4LCAweEFELCAweEEwLCAweEFFLCAweDQxLCAweEFFLCAweDQyLCAvKiAweEM0LTB4QzcgKi8KKwkweEFFLCAweDQzLCAweEFFLCAweDQ0LCAweEFFLCAweDQ1LCAweEFFLCAweDQ2LCAvKiAweEM4LTB4Q0IgKi8KKwkweEMzLCAweEU5LCAweEFFLCAweDQ3LCAweEFFLCAweDQ4LCAweEFFLCAweDQ5LCAvKiAweENDLTB4Q0YgKi8KKwkweEMzLCAweEVBLCAweEFFLCAweDRBLCAweEFFLCAweDRCLCAweEFFLCAweDRDLCAvKiAweEQwLTB4RDMgKi8KKwkweEFFLCAweDRELCAweEFFLCAweDRFLCAweEFFLCAweDRGLCAweEFFLCAweDUwLCAvKiAweEQ0LTB4RDcgKi8KKwkweEFFLCAweDUxLCAweEFFLCAweDUyLCAweEFFLCAweDUzLCAweEFFLCAweDU0LCAvKiAweEQ4LTB4REIgKi8KKwkweEFFLCAweDU1LCAweEFFLCAweDU2LCAweEFFLCAweDU3LCAweEFFLCAweDU4LCAvKiAweERDLTB4REYgKi8KKwkweEFFLCAweDU5LCAweEFFLCAweDVBLCAweEFFLCAweDYxLCAweEFFLCAweDYyLCAvKiAweEUwLTB4RTMgKi8KKwkweEFFLCAweDYzLCAweEFFLCAweDY0LCAweEFFLCAweDY1LCAweEFFLCAweDY2LCAvKiAweEU0LTB4RTcgKi8KKwkweEMzLCAweEVCLCAweEFFLCAweDY3LCAweEFFLCAweDY4LCAweEFFLCAweDY5LCAvKiAweEU4LTB4RUIgKi8KKwkweEMzLCAweEVDLCAweEFFLCAweDZBLCAweEFFLCAweDZCLCAweEFFLCAweDZDLCAvKiAweEVDLTB4RUYgKi8KKwkweEMzLCAweEVELCAweEFFLCAweDZELCAweEFFLCAweDZFLCAweEFFLCAweDZGLCAvKiAweEYwLTB4RjMgKi8KKwkweEFFLCAweDcwLCAweEFFLCAweDcxLCAweEFFLCAweDcyLCAweEFFLCAweDczLCAvKiAweEY0LTB4RjcgKi8KKwkweEMzLCAweEVFLCAweEMzLCAweEVGLCAweEFFLCAweDc0LCAweEMzLCAweEYwLCAvKiAweEY4LTB4RkIgKi8KKwkweEFFLCAweDc1LCAweEMzLCAweEYxLCAweEFFLCAweDc2LCAweEFFLCAweDc3LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19DRVs1MTJdID0geworCTB4QUUsIDB4NzgsIDB4QUUsIDB4NzksIDB4QUUsIDB4N0EsIDB4QUUsIDB4ODEsIC8qIDB4MDAtMHgwMyAqLworCTB4QzMsIDB4RjIsIDB4QUUsIDB4ODIsIDB4QUUsIDB4ODMsIDB4QUUsIDB4ODQsIC8qIDB4MDQtMHgwNyAqLworCTB4QzMsIDB4RjMsIDB4QUUsIDB4ODUsIDB4QUUsIDB4ODYsIDB4QUUsIDB4ODcsIC8qIDB4MDgtMHgwQiAqLworCTB4QzMsIDB4RjQsIDB4QUUsIDB4ODgsIDB4QUUsIDB4ODksIDB4QUUsIDB4OEEsIC8qIDB4MEMtMHgwRiAqLworCTB4QUUsIDB4OEIsIDB4QUUsIDB4OEMsIDB4QUUsIDB4OEQsIDB4QUUsIDB4OEUsIC8qIDB4MTAtMHgxMyAqLworCTB4QzMsIDB4RjUsIDB4QUUsIDB4OEYsIDB4QUUsIDB4OTAsIDB4QUUsIDB4OTEsIC8qIDB4MTQtMHgxNyAqLworCTB4QUUsIDB4OTIsIDB4QzMsIDB4RjYsIDB4QUUsIDB4OTMsIDB4QUUsIDB4OTQsIC8qIDB4MTgtMHgxQiAqLworCTB4QUUsIDB4OTUsIDB4QUUsIDB4OTYsIDB4QUUsIDB4OTcsIDB4QUUsIDB4OTgsIC8qIDB4MUMtMHgxRiAqLworCTB4QzMsIDB4RjcsIDB4QzMsIDB4RjgsIDB4QUUsIDB4OTksIDB4QUUsIDB4OUEsIC8qIDB4MjAtMHgyMyAqLworCTB4QzMsIDB4RjksIDB4QUUsIDB4OUIsIDB4QUUsIDB4OUMsIDB4QUUsIDB4OUQsIC8qIDB4MjQtMHgyNyAqLworCTB4QzMsIDB4RkEsIDB4QUUsIDB4OUUsIDB4QUUsIDB4OUYsIDB4QUUsIDB4QTAsIC8qIDB4MjgtMHgyQiAqLworCTB4QUYsIDB4NDEsIDB4QUYsIDB4NDIsIDB4QUYsIDB4NDMsIDB4QUYsIDB4NDQsIC8qIDB4MkMtMHgyRiAqLworCTB4QzMsIDB4RkIsIDB4QzMsIDB4RkMsIDB4QUYsIDB4NDUsIDB4QzMsIDB4RkQsIC8qIDB4MzAtMHgzMyAqLworCTB4QUYsIDB4NDYsIDB4QzMsIDB4RkUsIDB4QUYsIDB4NDcsIDB4QUYsIDB4NDgsIC8qIDB4MzQtMHgzNyAqLworCTB4QUYsIDB4NDksIDB4QUYsIDB4NEEsIDB4QUYsIDB4NEIsIDB4QUYsIDB4NEMsIC8qIDB4MzgtMHgzQiAqLworCTB4QUYsIDB4NEQsIDB4QUYsIDB4NEUsIDB4QUYsIDB4NEYsIDB4QUYsIDB4NTAsIC8qIDB4M0MtMHgzRiAqLworCTB4QUYsIDB4NTEsIDB4QUYsIDB4NTIsIDB4QUYsIDB4NTMsIDB4QUYsIDB4NTQsIC8qIDB4NDAtMHg0MyAqLworCTB4QUYsIDB4NTUsIDB4QUYsIDB4NTYsIDB4QUYsIDB4NTcsIDB4QUYsIDB4NTgsIC8qIDB4NDQtMHg0NyAqLworCTB4QUYsIDB4NTksIDB4QUYsIDB4NUEsIDB4QUYsIDB4NjEsIDB4QUYsIDB4NjIsIC8qIDB4NDgtMHg0QiAqLworCTB4QUYsIDB4NjMsIDB4QUYsIDB4NjQsIDB4QUYsIDB4NjUsIDB4QUYsIDB4NjYsIC8qIDB4NEMtMHg0RiAqLworCTB4QUYsIDB4NjcsIDB4QUYsIDB4NjgsIDB4QUYsIDB4NjksIDB4QUYsIDB4NkEsIC8qIDB4NTAtMHg1MyAqLworCTB4QUYsIDB4NkIsIDB4QUYsIDB4NkMsIDB4QUYsIDB4NkQsIDB4QUYsIDB4NkUsIC8qIDB4NTQtMHg1NyAqLworCTB4QzQsIDB4QTEsIDB4QzQsIDB4QTIsIDB4QUYsIDB4NkYsIDB4QUYsIDB4NzAsIC8qIDB4NTgtMHg1QiAqLworCTB4QzQsIDB4QTMsIDB4QUYsIDB4NzEsIDB4QUYsIDB4NzIsIDB4QzQsIDB4QTQsIC8qIDB4NUMtMHg1RiAqLworCTB4QzQsIDB4QTUsIDB4QzQsIDB4QTYsIDB4QUYsIDB4NzMsIDB4QUYsIDB4NzQsIC8qIDB4NjAtMHg2MyAqLworCTB4QUYsIDB4NzUsIDB4QUYsIDB4NzYsIDB4QUYsIDB4NzcsIDB4QUYsIDB4NzgsIC8qIDB4NjQtMHg2NyAqLworCTB4QzQsIDB4QTcsIDB4QzQsIDB4QTgsIDB4QUYsIDB4NzksIDB4QzQsIDB4QTksIC8qIDB4NjgtMHg2QiAqLworCTB4QUYsIDB4N0EsIDB4QzQsIDB4QUEsIDB4QUYsIDB4ODEsIDB4QUYsIDB4ODIsIC8qIDB4NkMtMHg2RiAqLworCTB4QUYsIDB4ODMsIDB4QUYsIDB4ODQsIDB4QUYsIDB4ODUsIDB4QUYsIDB4ODYsIC8qIDB4NzAtMHg3MyAqLworCTB4QzQsIDB4QUIsIDB4QzQsIDB4QUMsIDB4QUYsIDB4ODcsIDB4QUYsIDB4ODgsIC8qIDB4NzQtMHg3NyAqLworCTB4QzQsIDB4QUQsIDB4QUYsIDB4ODksIDB4QUYsIDB4OEEsIDB4QUYsIDB4OEIsIC8qIDB4NzgtMHg3QiAqLworCTB4QzQsIDB4QUUsIDB4QUYsIDB4OEMsIDB4QUYsIDB4OEQsIDB4QUYsIDB4OEUsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QUYsIDB4OEYsIDB4QUYsIDB4OTAsIDB4QUYsIDB4OTEsIDB4QUYsIDB4OTIsIC8qIDB4ODAtMHg4MyAqLworCTB4QzQsIDB4QUYsIDB4QzQsIDB4QjAsIDB4QUYsIDB4OTMsIDB4QzQsIDB4QjEsIC8qIDB4ODQtMHg4NyAqLworCTB4QUYsIDB4OTQsIDB4QzQsIDB4QjIsIDB4QUYsIDB4OTUsIDB4QUYsIDB4OTYsIC8qIDB4ODgtMHg4QiAqLworCTB4QUYsIDB4OTcsIDB4QUYsIDB4OTgsIDB4QUYsIDB4OTksIDB4QUYsIDB4OUEsIC8qIDB4OEMtMHg4RiAqLworCTB4QzQsIDB4QjMsIDB4QzQsIDB4QjQsIDB4QUYsIDB4OUIsIDB4QUYsIDB4OUMsIC8qIDB4OTAtMHg5MyAqLworCTB4QzQsIDB4QjUsIDB4QUYsIDB4OUQsIDB4QUYsIDB4OUUsIDB4QUYsIDB4OUYsIC8qIDB4OTQtMHg5NyAqLworCTB4QzQsIDB4QjYsIDB4QUYsIDB4QTAsIDB4QjAsIDB4NDEsIDB4QjAsIDB4NDIsIC8qIDB4OTgtMHg5QiAqLworCTB4QjAsIDB4NDMsIDB4QjAsIDB4NDQsIDB4QjAsIDB4NDUsIDB4QjAsIDB4NDYsIC8qIDB4OUMtMHg5RiAqLworCTB4QzQsIDB4QjcsIDB4QzQsIDB4QjgsIDB4QjAsIDB4NDcsIDB4QzQsIDB4QjksIC8qIDB4QTAtMHhBMyAqLworCTB4QzQsIDB4QkEsIDB4QzQsIDB4QkIsIDB4QjAsIDB4NDgsIDB4QjAsIDB4NDksIC8qIDB4QTQtMHhBNyAqLworCTB4QjAsIDB4NEEsIDB4QjAsIDB4NEIsIDB4QjAsIDB4NEMsIDB4QjAsIDB4NEQsIC8qIDB4QTgtMHhBQiAqLworCTB4QzQsIDB4QkMsIDB4QzQsIDB4QkQsIDB4QjAsIDB4NEUsIDB4QjAsIDB4NEYsIC8qIDB4QUMtMHhBRiAqLworCTB4QjAsIDB4NTAsIDB4QjAsIDB4NTEsIDB4QjAsIDB4NTIsIDB4QjAsIDB4NTMsIC8qIDB4QjAtMHhCMyAqLworCTB4QjAsIDB4NTQsIDB4QjAsIDB4NTUsIDB4QjAsIDB4NTYsIDB4QjAsIDB4NTcsIC8qIDB4QjQtMHhCNyAqLworCTB4QjAsIDB4NTgsIDB4QjAsIDB4NTksIDB4QjAsIDB4NUEsIDB4QjAsIDB4NjEsIC8qIDB4QjgtMHhCQiAqLworCTB4QjAsIDB4NjIsIDB4QjAsIDB4NjMsIDB4QjAsIDB4NjQsIDB4QjAsIDB4NjUsIC8qIDB4QkMtMHhCRiAqLworCTB4QjAsIDB4NjYsIDB4QzQsIDB4QkUsIDB4QjAsIDB4NjcsIDB4QjAsIDB4NjgsIC8qIDB4QzAtMHhDMyAqLworCTB4QjAsIDB4NjksIDB4QjAsIDB4NkEsIDB4QjAsIDB4NkIsIDB4QjAsIDB4NkMsIC8qIDB4QzQtMHhDNyAqLworCTB4QjAsIDB4NkQsIDB4QjAsIDB4NkUsIDB4QjAsIDB4NkYsIDB4QjAsIDB4NzAsIC8qIDB4QzgtMHhDQiAqLworCTB4QjAsIDB4NzEsIDB4QjAsIDB4NzIsIDB4QjAsIDB4NzMsIDB4QjAsIDB4NzQsIC8qIDB4Q0MtMHhDRiAqLworCTB4QjAsIDB4NzUsIDB4QjAsIDB4NzYsIDB4QjAsIDB4NzcsIDB4QjAsIDB4NzgsIC8qIDB4RDAtMHhEMyAqLworCTB4QjAsIDB4NzksIDB4QjAsIDB4N0EsIDB4QjAsIDB4ODEsIDB4QjAsIDB4ODIsIC8qIDB4RDQtMHhENyAqLworCTB4QjAsIDB4ODMsIDB4QjAsIDB4ODQsIDB4QjAsIDB4ODUsIDB4QjAsIDB4ODYsIC8qIDB4RDgtMHhEQiAqLworCTB4QjAsIDB4ODcsIDB4QjAsIDB4ODgsIDB4QjAsIDB4ODksIDB4QjAsIDB4OEEsIC8qIDB4REMtMHhERiAqLworCTB4QjAsIDB4OEIsIDB4QjAsIDB4OEMsIDB4QjAsIDB4OEQsIDB4QjAsIDB4OEUsIC8qIDB4RTAtMHhFMyAqLworCTB4QzQsIDB4QkYsIDB4QzQsIDB4QzAsIDB4QjAsIDB4OEYsIDB4QjAsIDB4OTAsIC8qIDB4RTQtMHhFNyAqLworCTB4QzQsIDB4QzEsIDB4QjAsIDB4OTEsIDB4QjAsIDB4OTIsIDB4QzQsIDB4QzIsIC8qIDB4RTgtMHhFQiAqLworCTB4QzQsIDB4QzMsIDB4QjAsIDB4OTMsIDB4QjAsIDB4OTQsIDB4QjAsIDB4OTUsIC8qIDB4RUMtMHhFRiAqLworCTB4QjAsIDB4OTYsIDB4QjAsIDB4OTcsIDB4QjAsIDB4OTgsIDB4QjAsIDB4OTksIC8qIDB4RjAtMHhGMyAqLworCTB4QzQsIDB4QzQsIDB4QzQsIDB4QzUsIDB4QjAsIDB4OUEsIDB4QzQsIDB4QzYsIC8qIDB4RjQtMHhGNyAqLworCTB4QzQsIDB4QzcsIDB4QzQsIDB4QzgsIDB4QjAsIDB4OUIsIDB4QjAsIDB4OUMsIC8qIDB4RjgtMHhGQiAqLworCTB4QjAsIDB4OUQsIDB4QjAsIDB4OUUsIDB4QjAsIDB4OUYsIDB4QjAsIDB4QTAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0NGWzUxMl0gPSB7CisJMHhDNCwgMHhDOSwgMHhDNCwgMHhDQSwgMHhCMSwgMHg0MSwgMHhCMSwgMHg0MiwgLyogMHgwMC0weDAzICovCisJMHhDNCwgMHhDQiwgMHhCMSwgMHg0MywgMHhCMSwgMHg0NCwgMHhCMSwgMHg0NSwgLyogMHgwNC0weDA3ICovCisJMHhDNCwgMHhDQywgMHhCMSwgMHg0NiwgMHhCMSwgMHg0NywgMHhCMSwgMHg0OCwgLyogMHgwOC0weDBCICovCisJMHhCMSwgMHg0OSwgMHhCMSwgMHg0QSwgMHhCMSwgMHg0QiwgMHhCMSwgMHg0QywgLyogMHgwQy0weDBGICovCisJMHhDNCwgMHhDRCwgMHhDNCwgMHhDRSwgMHhCMSwgMHg0RCwgMHhDNCwgMHhDRiwgLyogMHgxMC0weDEzICovCisJMHhCMSwgMHg0RSwgMHhDNCwgMHhEMCwgMHhCMSwgMHg0RiwgMHhCMSwgMHg1MCwgLyogMHgxNC0weDE3ICovCisJMHhCMSwgMHg1MSwgMHhCMSwgMHg1MiwgMHhCMSwgMHg1MywgMHhCMSwgMHg1NCwgLyogMHgxOC0weDFCICovCisJMHhDNCwgMHhEMSwgMHhCMSwgMHg1NSwgMHhCMSwgMHg1NiwgMHhCMSwgMHg1NywgLyogMHgxQy0weDFGICovCisJMHhDNCwgMHhEMiwgMHhCMSwgMHg1OCwgMHhCMSwgMHg1OSwgMHhCMSwgMHg1QSwgLyogMHgyMC0weDIzICovCisJMHhDNCwgMHhEMywgMHhCMSwgMHg2MSwgMHhCMSwgMHg2MiwgMHhCMSwgMHg2MywgLyogMHgyNC0weDI3ICovCisJMHhCMSwgMHg2NCwgMHhCMSwgMHg2NSwgMHhCMSwgMHg2NiwgMHhCMSwgMHg2NywgLyogMHgyOC0weDJCICovCisJMHhDNCwgMHhENCwgMHhDNCwgMHhENSwgMHhCMSwgMHg2OCwgMHhDNCwgMHhENiwgLyogMHgyQy0weDJGICovCisJMHhDNCwgMHhENywgMHhDNCwgMHhEOCwgMHhCMSwgMHg2OSwgMHhCMSwgMHg2QSwgLyogMHgzMC0weDMzICovCisJMHhCMSwgMHg2QiwgMHhCMSwgMHg2QywgMHhCMSwgMHg2RCwgMHhCMSwgMHg2RSwgLyogMHgzNC0weDM3ICovCisJMHhDNCwgMHhEOSwgMHhCMSwgMHg2RiwgMHhCMSwgMHg3MCwgMHhCMSwgMHg3MSwgLyogMHgzOC0weDNCICovCisJMHhCMSwgMHg3MiwgMHhCMSwgMHg3MywgMHhCMSwgMHg3NCwgMHhCMSwgMHg3NSwgLyogMHgzQy0weDNGICovCisJMHhCMSwgMHg3NiwgMHhCMSwgMHg3NywgMHhCMSwgMHg3OCwgMHhCMSwgMHg3OSwgLyogMHg0MC0weDQzICovCisJMHhCMSwgMHg3QSwgMHhCMSwgMHg4MSwgMHhCMSwgMHg4MiwgMHhCMSwgMHg4MywgLyogMHg0NC0weDQ3ICovCisJMHhCMSwgMHg4NCwgMHhCMSwgMHg4NSwgMHhCMSwgMHg4NiwgMHhCMSwgMHg4NywgLyogMHg0OC0weDRCICovCisJMHhCMSwgMHg4OCwgMHhCMSwgMHg4OSwgMHhCMSwgMHg4QSwgMHhCMSwgMHg4QiwgLyogMHg0Qy0weDRGICovCisJMHhCMSwgMHg4QywgMHhCMSwgMHg4RCwgMHhCMSwgMHg4RSwgMHhCMSwgMHg4RiwgLyogMHg1MC0weDUzICovCisJMHhDNCwgMHhEQSwgMHhDNCwgMHhEQiwgMHhCMSwgMHg5MCwgMHhCMSwgMHg5MSwgLyogMHg1NC0weDU3ICovCisJMHhDNCwgMHhEQywgMHhCMSwgMHg5MiwgMHhCMSwgMHg5MywgMHhCMSwgMHg5NCwgLyogMHg1OC0weDVCICovCisJMHhDNCwgMHhERCwgMHhCMSwgMHg5NSwgMHhCMSwgMHg5NiwgMHhCMSwgMHg5NywgLyogMHg1Qy0weDVGICovCisJMHhCMSwgMHg5OCwgMHhCMSwgMHg5OSwgMHhCMSwgMHg5QSwgMHhCMSwgMHg5QiwgLyogMHg2MC0weDYzICovCisJMHhDNCwgMHhERSwgMHhDNCwgMHhERiwgMHhCMSwgMHg5QywgMHhDNCwgMHhFMCwgLyogMHg2NC0weDY3ICovCisJMHhCMSwgMHg5RCwgMHhDNCwgMHhFMSwgMHhCMSwgMHg5RSwgMHhCMSwgMHg5RiwgLyogMHg2OC0weDZCICovCisJMHhCMSwgMHhBMCwgMHhCMiwgMHg0MSwgMHhCMiwgMHg0MiwgMHhCMiwgMHg0MywgLyogMHg2Qy0weDZGICovCisJMHhDNCwgMHhFMiwgMHhDNCwgMHhFMywgMHhCMiwgMHg0NCwgMHhCMiwgMHg0NSwgLyogMHg3MC0weDczICovCisJMHhDNCwgMHhFNCwgMHhCMiwgMHg0NiwgMHhCMiwgMHg0NywgMHhCMiwgMHg0OCwgLyogMHg3NC0weDc3ICovCisJMHhDNCwgMHhFNSwgMHhCMiwgMHg0OSwgMHhCMiwgMHg0QSwgMHhCMiwgMHg0QiwgLyogMHg3OC0weDdCICovCisJMHhCMiwgMHg0QywgMHhCMiwgMHg0RCwgMHhCMiwgMHg0RSwgMHhCMiwgMHg0RiwgLyogMHg3Qy0weDdGICovCisJCisJMHhDNCwgMHhFNiwgMHhCMiwgMHg1MCwgMHhCMiwgMHg1MSwgMHhCMiwgMHg1MiwgLyogMHg4MC0weDgzICovCisJMHhCMiwgMHg1MywgMHhDNCwgMHhFNywgMHhCMiwgMHg1NCwgMHhCMiwgMHg1NSwgLyogMHg4NC0weDg3ICovCisJMHhCMiwgMHg1NiwgMHhCMiwgMHg1NywgMHhCMiwgMHg1OCwgMHhCMiwgMHg1OSwgLyogMHg4OC0weDhCICovCisJMHhDNCwgMHhFOCwgMHhCMiwgMHg1QSwgMHhCMiwgMHg2MSwgMHhCMiwgMHg2MiwgLyogMHg4Qy0weDhGICovCisJMHhCMiwgMHg2MywgMHhCMiwgMHg2NCwgMHhCMiwgMHg2NSwgMHhCMiwgMHg2NiwgLyogMHg5MC0weDkzICovCisJMHhCMiwgMHg2NywgMHhCMiwgMHg2OCwgMHhCMiwgMHg2OSwgMHhCMiwgMHg2QSwgLyogMHg5NC0weDk3ICovCisJMHhCMiwgMHg2QiwgMHhCMiwgMHg2QywgMHhCMiwgMHg2RCwgMHhCMiwgMHg2RSwgLyogMHg5OC0weDlCICovCisJMHhCMiwgMHg2RiwgMHhCMiwgMHg3MCwgMHhCMiwgMHg3MSwgMHhCMiwgMHg3MiwgLyogMHg5Qy0weDlGICovCisJMHhCMiwgMHg3MywgMHhDNCwgMHhFOSwgMHhCMiwgMHg3NCwgMHhCMiwgMHg3NSwgLyogMHhBMC0weEEzICovCisJMHhCMiwgMHg3NiwgMHhCMiwgMHg3NywgMHhCMiwgMHg3OCwgMHhCMiwgMHg3OSwgLyogMHhBNC0weEE3ICovCisJMHhDNCwgMHhFQSwgMHhCMiwgMHg3QSwgMHhCMiwgMHg4MSwgMHhCMiwgMHg4MiwgLyogMHhBOC0weEFCICovCisJMHhCMiwgMHg4MywgMHhCMiwgMHg4NCwgMHhCMiwgMHg4NSwgMHhCMiwgMHg4NiwgLyogMHhBQy0weEFGICovCisJMHhDNCwgMHhFQiwgMHhCMiwgMHg4NywgMHhCMiwgMHg4OCwgMHhCMiwgMHg4OSwgLyogMHhCMC0weEIzICovCisJMHhCMiwgMHg4QSwgMHhCMiwgMHg4QiwgMHhCMiwgMHg4QywgMHhCMiwgMHg4RCwgLyogMHhCNC0weEI3ICovCisJMHhCMiwgMHg4RSwgMHhCMiwgMHg4RiwgMHhCMiwgMHg5MCwgMHhCMiwgMHg5MSwgLyogMHhCOC0weEJCICovCisJMHhCMiwgMHg5MiwgMHhCMiwgMHg5MywgMHhCMiwgMHg5NCwgMHhCMiwgMHg5NSwgLyogMHhCQy0weEJGICovCisJMHhCMiwgMHg5NiwgMHhCMiwgMHg5NywgMHhCMiwgMHg5OCwgMHhCMiwgMHg5OSwgLyogMHhDMC0weEMzICovCisJMHhDNCwgMHhFQywgMHhCMiwgMHg5QSwgMHhCMiwgMHg5QiwgMHhCMiwgMHg5QywgLyogMHhDNC0weEM3ICovCisJMHhCMiwgMHg5RCwgMHhCMiwgMHg5RSwgMHhCMiwgMHg5RiwgMHhCMiwgMHhBMCwgLyogMHhDOC0weENCICovCisJMHhCMywgMHg0MSwgMHhCMywgMHg0MiwgMHhCMywgMHg0MywgMHhCMywgMHg0NCwgLyogMHhDQy0weENGICovCisJMHhCMywgMHg0NSwgMHhCMywgMHg0NiwgMHhCMywgMHg0NywgMHhCMywgMHg0OCwgLyogMHhEMC0weEQzICovCisJMHhCMywgMHg0OSwgMHhCMywgMHg0QSwgMHhCMywgMHg0QiwgMHhCMywgMHg0QywgLyogMHhENC0weEQ3ICovCisJMHhCMywgMHg0RCwgMHhCMywgMHg0RSwgMHhCMywgMHg0RiwgMHhCMywgMHg1MCwgLyogMHhEOC0weERCICovCisJMHhCMywgMHg1MSwgMHhCMywgMHg1MiwgMHhCMywgMHg1MywgMHhCMywgMHg1NCwgLyogMHhEQy0weERGICovCisJMHhDNCwgMHhFRCwgMHhDNCwgMHhFRSwgMHhCMywgMHg1NSwgMHhCMywgMHg1NiwgLyogMHhFMC0weEUzICovCisJMHhDNCwgMHhFRiwgMHhCMywgMHg1NywgMHhCMywgMHg1OCwgMHhCMywgMHg1OSwgLyogMHhFNC0weEU3ICovCisJMHhDNCwgMHhGMCwgMHhCMywgMHg1QSwgMHhCMywgMHg2MSwgMHhCMywgMHg2MiwgLyogMHhFOC0weEVCICovCisJMHhCMywgMHg2MywgMHhCMywgMHg2NCwgMHhCMywgMHg2NSwgMHhCMywgMHg2NiwgLyogMHhFQy0weEVGICovCisJMHhDNCwgMHhGMSwgMHhDNCwgMHhGMiwgMHhCMywgMHg2NywgMHhDNCwgMHhGMywgLyogMHhGMC0weEYzICovCisJMHhCMywgMHg2OCwgMHhDNCwgMHhGNCwgMHhCMywgMHg2OSwgMHhCMywgMHg2QSwgLyogMHhGNC0weEY3ICovCisJMHhCMywgMHg2QiwgMHhCMywgMHg2QywgMHhCMywgMHg2RCwgMHhCMywgMHg2RSwgLyogMHhGOC0weEZCICovCisJMHhDNCwgMHhGNSwgMHhCMywgMHg2RiwgMHhCMywgMHg3MCwgMHhCMywgMHg3MSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfRDBbNTEyXSA9IHsKKwkweEM0LCAweEY2LCAweEIzLCAweDcyLCAweEIzLCAweDczLCAweEIzLCAweDc0LCAvKiAweDAwLTB4MDMgKi8KKwkweEM0LCAweEY3LCAweEIzLCAweDc1LCAweEIzLCAweDc2LCAweEIzLCAweDc3LCAvKiAweDA0LTB4MDcgKi8KKwkweEIzLCAweDc4LCAweEIzLCAweDc5LCAweEIzLCAweDdBLCAweEIzLCAweDgxLCAvKiAweDA4LTB4MEIgKi8KKwkweEIzLCAweDgyLCAweEIzLCAweDgzLCAweEIzLCAweDg0LCAweEIzLCAweDg1LCAvKiAweDBDLTB4MEYgKi8KKwkweEIzLCAweDg2LCAweEM0LCAweEY4LCAweEIzLCAweDg3LCAweEIzLCAweDg4LCAvKiAweDEwLTB4MTMgKi8KKwkweEIzLCAweDg5LCAweEIzLCAweDhBLCAweEIzLCAweDhCLCAweEIzLCAweDhDLCAvKiAweDE0LTB4MTcgKi8KKwkweEM0LCAweEY5LCAweEIzLCAweDhELCAweEIzLCAweDhFLCAweEIzLCAweDhGLCAvKiAweDE4LTB4MUIgKi8KKwkweEIzLCAweDkwLCAweEIzLCAweDkxLCAweEIzLCAweDkyLCAweEIzLCAweDkzLCAvKiAweDFDLTB4MUYgKi8KKwkweEIzLCAweDk0LCAweEIzLCAweDk1LCAweEIzLCAweDk2LCAweEIzLCAweDk3LCAvKiAweDIwLTB4MjMgKi8KKwkweEIzLCAweDk4LCAweEIzLCAweDk5LCAweEIzLCAweDlBLCAweEIzLCAweDlCLCAvKiAweDI0LTB4MjcgKi8KKwkweEIzLCAweDlDLCAweEIzLCAweDlELCAweEIzLCAweDlFLCAweEIzLCAweDlGLCAvKiAweDI4LTB4MkIgKi8KKwkweEIzLCAweEEwLCAweEM0LCAweEZBLCAweEI0LCAweDQxLCAweEI0LCAweDQyLCAvKiAweDJDLTB4MkYgKi8KKwkweEI0LCAweDQzLCAweEI0LCAweDQ0LCAweEI0LCAweDQ1LCAweEI0LCAweDQ2LCAvKiAweDMwLTB4MzMgKi8KKwkweEM0LCAweEZCLCAweEM0LCAweEZDLCAweEI0LCAweDQ3LCAweEI0LCAweDQ4LCAvKiAweDM0LTB4MzcgKi8KKwkweEM0LCAweEZELCAweEI0LCAweDQ5LCAweEI0LCAweDRBLCAweEI0LCAweDRCLCAvKiAweDM4LTB4M0IgKi8KKwkweEM0LCAweEZFLCAweEI0LCAweDRDLCAweEI0LCAweDRELCAweEI0LCAweDRFLCAvKiAweDNDLTB4M0YgKi8KKwkweEI0LCAweDRGLCAweEI0LCAweDUwLCAweEI0LCAweDUxLCAweEI0LCAweDUyLCAvKiAweDQwLTB4NDMgKi8KKwkweEM1LCAweEExLCAweEM1LCAweEEyLCAweEI0LCAweDUzLCAweEM1LCAweEEzLCAvKiAweDQ0LTB4NDcgKi8KKwkweEI0LCAweDU0LCAweEM1LCAweEE0LCAweEI0LCAweDU1LCAweEI0LCAweDU2LCAvKiAweDQ4LTB4NEIgKi8KKwkweEI0LCAweDU3LCAweEI0LCAweDU4LCAweEI0LCAweDU5LCAweEI0LCAweDVBLCAvKiAweDRDLTB4NEYgKi8KKwkweEM1LCAweEE1LCAweEI0LCAweDYxLCAweEI0LCAweDYyLCAweEI0LCAweDYzLCAvKiAweDUwLTB4NTMgKi8KKwkweEM1LCAweEE2LCAweEI0LCAweDY0LCAweEI0LCAweDY1LCAweEI0LCAweDY2LCAvKiAweDU0LTB4NTcgKi8KKwkweEM1LCAweEE3LCAweEI0LCAweDY3LCAweEI0LCAweDY4LCAweEI0LCAweDY5LCAvKiAweDU4LTB4NUIgKi8KKwkweEI0LCAweDZBLCAweEI0LCAweDZCLCAweEI0LCAweDZDLCAweEI0LCAweDZELCAvKiAweDVDLTB4NUYgKi8KKwkweEM1LCAweEE4LCAweEI0LCAweDZFLCAweEI0LCAweDZGLCAweEI0LCAweDcwLCAvKiAweDYwLTB4NjMgKi8KKwkweEI0LCAweDcxLCAweEI0LCAweDcyLCAweEI0LCAweDczLCAweEI0LCAweDc0LCAvKiAweDY0LTB4NjcgKi8KKwkweEI0LCAweDc1LCAweEI0LCAweDc2LCAweEI0LCAweDc3LCAweEI0LCAweDc4LCAvKiAweDY4LTB4NkIgKi8KKwkweEM1LCAweEE5LCAweEM1LCAweEFBLCAweEI0LCAweDc5LCAweEI0LCAweDdBLCAvKiAweDZDLTB4NkYgKi8KKwkweEM1LCAweEFCLCAweEI0LCAweDgxLCAweEI0LCAweDgyLCAweEI0LCAweDgzLCAvKiAweDcwLTB4NzMgKi8KKwkweEM1LCAweEFDLCAweEI0LCAweDg0LCAweEI0LCAweDg1LCAweEI0LCAweDg2LCAvKiAweDc0LTB4NzcgKi8KKwkweEI0LCAweDg3LCAweEI0LCAweDg4LCAweEI0LCAweDg5LCAweEI0LCAweDhBLCAvKiAweDc4LTB4N0IgKi8KKwkweEM1LCAweEFELCAweEM1LCAweEFFLCAweEI0LCAweDhCLCAweEI0LCAweDhDLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEI0LCAweDhELCAweEM1LCAweEFGLCAweEI0LCAweDhFLCAweEI0LCAweDhGLCAvKiAweDgwLTB4ODMgKi8KKwkweEI0LCAweDkwLCAweEI0LCAweDkxLCAweEI0LCAweDkyLCAweEI0LCAweDkzLCAvKiAweDg0LTB4ODcgKi8KKwkweEI0LCAweDk0LCAweEI0LCAweDk1LCAweEI0LCAweDk2LCAweEI0LCAweDk3LCAvKiAweDg4LTB4OEIgKi8KKwkweEI0LCAweDk4LCAweEI0LCAweDk5LCAweEI0LCAweDlBLCAweEI0LCAweDlCLCAvKiAweDhDLTB4OEYgKi8KKwkweEI0LCAweDlDLCAweEI0LCAweDlELCAweEI0LCAweDlFLCAweEI0LCAweDlGLCAvKiAweDkwLTB4OTMgKi8KKwkweEI0LCAweEEwLCAweEI1LCAweDQxLCAweEI1LCAweDQyLCAweEI1LCAweDQzLCAvKiAweDk0LTB4OTcgKi8KKwkweEI1LCAweDQ0LCAweEI1LCAweDQ1LCAweEI1LCAweDQ2LCAweEI1LCAweDQ3LCAvKiAweDk4LTB4OUIgKi8KKwkweEI1LCAweDQ4LCAweEI1LCAweDQ5LCAweEI1LCAweDRBLCAweEI1LCAweDRCLCAvKiAweDlDLTB4OUYgKi8KKwkweEI1LCAweDRDLCAweEI1LCAweDRELCAweEI1LCAweDRFLCAweEI1LCAweDRGLCAvKiAweEEwLTB4QTMgKi8KKwkweEM1LCAweEIwLCAweEM1LCAweEIxLCAweEI1LCAweDUwLCAweEI1LCAweDUxLCAvKiAweEE0LTB4QTcgKi8KKwkweEM1LCAweEIyLCAweEI1LCAweDUyLCAweEI1LCAweDUzLCAweEI1LCAweDU0LCAvKiAweEE4LTB4QUIgKi8KKwkweEM1LCAweEIzLCAweEI1LCAweDU1LCAweEI1LCAweDU2LCAweEI1LCAweDU3LCAvKiAweEFDLTB4QUYgKi8KKwkweEI1LCAweDU4LCAweEI1LCAweDU5LCAweEI1LCAweDVBLCAweEI1LCAweDYxLCAvKiAweEIwLTB4QjMgKi8KKwkweEM1LCAweEI0LCAweEM1LCAweEI1LCAweEI1LCAweDYyLCAweEM1LCAweEI2LCAvKiAweEI0LTB4QjcgKi8KKwkweEI1LCAweDYzLCAweEM1LCAweEI3LCAweEI1LCAweDY0LCAweEI1LCAweDY1LCAvKiAweEI4LTB4QkIgKi8KKwkweEI1LCAweDY2LCAweEI1LCAweDY3LCAweEI1LCAweDY4LCAweEI1LCAweDY5LCAvKiAweEJDLTB4QkYgKi8KKwkweEM1LCAweEI4LCAweEM1LCAweEI5LCAweEI1LCAweDZBLCAweEI1LCAweDZCLCAvKiAweEMwLTB4QzMgKi8KKwkweEM1LCAweEJBLCAweEI1LCAweDZDLCAweEI1LCAweDZELCAweEI1LCAweDZFLCAvKiAweEM0LTB4QzcgKi8KKwkweEM1LCAweEJCLCAweEM1LCAweEJDLCAweEI1LCAweDZGLCAweEI1LCAweDcwLCAvKiAweEM4LTB4Q0IgKi8KKwkweEI1LCAweDcxLCAweEI1LCAweDcyLCAweEI1LCAweDczLCAweEI1LCAweDc0LCAvKiAweENDLTB4Q0YgKi8KKwkweEM1LCAweEJELCAweEM1LCAweEJFLCAweEI1LCAweDc1LCAweEM1LCAweEJGLCAvKiAweEQwLTB4RDMgKi8KKwkweEM1LCAweEMwLCAweEM1LCAweEMxLCAweEI1LCAweDc2LCAweEI1LCAweDc3LCAvKiAweEQ0LTB4RDcgKi8KKwkweEI1LCAweDc4LCAweEI1LCAweDc5LCAweEI1LCAweDdBLCAweEI1LCAweDgxLCAvKiAweEQ4LTB4REIgKi8KKwkweEM1LCAweEMyLCAweEM1LCAweEMzLCAweEI1LCAweDgyLCAweEI1LCAweDgzLCAvKiAweERDLTB4REYgKi8KKwkweEM1LCAweEM0LCAweEI1LCAweDg0LCAweEI1LCAweDg1LCAweEI1LCAweDg2LCAvKiAweEUwLTB4RTMgKi8KKwkweEM1LCAweEM1LCAweEI1LCAweDg3LCAweEI1LCAweDg4LCAweEI1LCAweDg5LCAvKiAweEU0LTB4RTcgKi8KKwkweEI1LCAweDhBLCAweEI1LCAweDhCLCAweEI1LCAweDhDLCAweEI1LCAweDhELCAvKiAweEU4LTB4RUIgKi8KKwkweEM1LCAweEM2LCAweEM1LCAweEM3LCAweEI1LCAweDhFLCAweEM1LCAweEM4LCAvKiAweEVDLTB4RUYgKi8KKwkweEM1LCAweEM5LCAweEM1LCAweENBLCAweEI1LCAweDhGLCAweEI1LCAweDkwLCAvKiAweEYwLTB4RjMgKi8KKwkweEI1LCAweDkxLCAweEI1LCAweDkyLCAweEI1LCAweDkzLCAweEI1LCAweDk0LCAvKiAweEY0LTB4RjcgKi8KKwkweEM1LCAweENCLCAweEI1LCAweDk1LCAweEI1LCAweDk2LCAweEI1LCAweDk3LCAvKiAweEY4LTB4RkIgKi8KKwkweEI1LCAweDk4LCAweEI1LCAweDk5LCAweEI1LCAweDlBLCAweEI1LCAweDlCLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19EMVs1MTJdID0geworCTB4QjUsIDB4OUMsIDB4QjUsIDB4OUQsIDB4QjUsIDB4OUUsIDB4QjUsIDB4OUYsIC8qIDB4MDAtMHgwMyAqLworCTB4QjUsIDB4QTAsIDB4QjYsIDB4NDEsIDB4QjYsIDB4NDIsIDB4QjYsIDB4NDMsIC8qIDB4MDQtMHgwNyAqLworCTB4QjYsIDB4NDQsIDB4QjYsIDB4NDUsIDB4QjYsIDB4NDYsIDB4QjYsIDB4NDcsIC8qIDB4MDgtMHgwQiAqLworCTB4QjYsIDB4NDgsIDB4QzUsIDB4Q0MsIDB4QjYsIDB4NDksIDB4QjYsIDB4NEEsIC8qIDB4MEMtMHgwRiAqLworCTB4QjYsIDB4NEIsIDB4QjYsIDB4NEMsIDB4QjYsIDB4NEQsIDB4QjYsIDB4NEUsIC8qIDB4MTAtMHgxMyAqLworCTB4QjYsIDB4NEYsIDB4QjYsIDB4NTAsIDB4QjYsIDB4NTEsIDB4QjYsIDB4NTIsIC8qIDB4MTQtMHgxNyAqLworCTB4QjYsIDB4NTMsIDB4QjYsIDB4NTQsIDB4QjYsIDB4NTUsIDB4QjYsIDB4NTYsIC8qIDB4MTgtMHgxQiAqLworCTB4QjYsIDB4NTcsIDB4QjYsIDB4NTgsIDB4QjYsIDB4NTksIDB4QjYsIDB4NUEsIC8qIDB4MUMtMHgxRiAqLworCTB4QjYsIDB4NjEsIDB4QjYsIDB4NjIsIDB4QjYsIDB4NjMsIDB4QjYsIDB4NjQsIC8qIDB4MjAtMHgyMyAqLworCTB4QjYsIDB4NjUsIDB4QjYsIDB4NjYsIDB4QjYsIDB4NjcsIDB4QjYsIDB4NjgsIC8qIDB4MjQtMHgyNyAqLworCTB4QjYsIDB4NjksIDB4QjYsIDB4NkEsIDB4QjYsIDB4NkIsIDB4QjYsIDB4NkMsIC8qIDB4MjgtMHgyQiAqLworCTB4QjYsIDB4NkQsIDB4QjYsIDB4NkUsIDB4QjYsIDB4NkYsIDB4QjYsIDB4NzAsIC8qIDB4MkMtMHgyRiAqLworCTB4QzUsIDB4Q0QsIDB4QzUsIDB4Q0UsIDB4QjYsIDB4NzEsIDB4QjYsIDB4NzIsIC8qIDB4MzAtMHgzMyAqLworCTB4QzUsIDB4Q0YsIDB4QjYsIDB4NzMsIDB4QjYsIDB4NzQsIDB4QjYsIDB4NzUsIC8qIDB4MzQtMHgzNyAqLworCTB4QzUsIDB4RDAsIDB4QjYsIDB4NzYsIDB4QzUsIDB4RDEsIDB4QjYsIDB4NzcsIC8qIDB4MzgtMHgzQiAqLworCTB4QjYsIDB4NzgsIDB4QjYsIDB4NzksIDB4QjYsIDB4N0EsIDB4QjYsIDB4ODEsIC8qIDB4M0MtMHgzRiAqLworCTB4QzUsIDB4RDIsIDB4QzUsIDB4RDMsIDB4QjYsIDB4ODIsIDB4QzUsIDB4RDQsIC8qIDB4NDAtMHg0MyAqLworCTB4QzUsIDB4RDUsIDB4QzUsIDB4RDYsIDB4QjYsIDB4ODMsIDB4QjYsIDB4ODQsIC8qIDB4NDQtMHg0NyAqLworCTB4QjYsIDB4ODUsIDB4QjYsIDB4ODYsIDB4QjYsIDB4ODcsIDB4QjYsIDB4ODgsIC8qIDB4NDgtMHg0QiAqLworCTB4QzUsIDB4RDcsIDB4QzUsIDB4RDgsIDB4QjYsIDB4ODksIDB4QjYsIDB4OEEsIC8qIDB4NEMtMHg0RiAqLworCTB4QzUsIDB4RDksIDB4QjYsIDB4OEIsIDB4QjYsIDB4OEMsIDB4QjYsIDB4OEQsIC8qIDB4NTAtMHg1MyAqLworCTB4QzUsIDB4REEsIDB4QjYsIDB4OEUsIDB4QjYsIDB4OEYsIDB4QjYsIDB4OTAsIC8qIDB4NTQtMHg1NyAqLworCTB4QjYsIDB4OTEsIDB4QjYsIDB4OTIsIDB4QjYsIDB4OTMsIDB4QjYsIDB4OTQsIC8qIDB4NTgtMHg1QiAqLworCTB4QzUsIDB4REIsIDB4QzUsIDB4REMsIDB4QjYsIDB4OTUsIDB4QzUsIDB4REQsIC8qIDB4NUMtMHg1RiAqLworCTB4QjYsIDB4OTYsIDB4QzUsIDB4REUsIDB4QjYsIDB4OTcsIDB4QjYsIDB4OTgsIC8qIDB4NjAtMHg2MyAqLworCTB4QjYsIDB4OTksIDB4QjYsIDB4OUEsIDB4QjYsIDB4OUIsIDB4QjYsIDB4OUMsIC8qIDB4NjQtMHg2NyAqLworCTB4QzUsIDB4REYsIDB4QjYsIDB4OUQsIDB4QjYsIDB4OUUsIDB4QjYsIDB4OUYsIC8qIDB4NjgtMHg2QiAqLworCTB4QzUsIDB4RTAsIDB4QjYsIDB4QTAsIDB4QjcsIDB4NDEsIDB4QjcsIDB4NDIsIC8qIDB4NkMtMHg2RiAqLworCTB4QjcsIDB4NDMsIDB4QjcsIDB4NDQsIDB4QjcsIDB4NDUsIDB4QjcsIDB4NDYsIC8qIDB4NzAtMHg3MyAqLworCTB4QjcsIDB4NDcsIDB4QjcsIDB4NDgsIDB4QjcsIDB4NDksIDB4QjcsIDB4NEEsIC8qIDB4NzQtMHg3NyAqLworCTB4QjcsIDB4NEIsIDB4QjcsIDB4NEMsIDB4QjcsIDB4NEQsIDB4QjcsIDB4NEUsIC8qIDB4NzgtMHg3QiAqLworCTB4QzUsIDB4RTEsIDB4QjcsIDB4NEYsIDB4QjcsIDB4NTAsIDB4QjcsIDB4NTEsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QjcsIDB4NTIsIDB4QjcsIDB4NTMsIDB4QjcsIDB4NTQsIDB4QjcsIDB4NTUsIC8qIDB4ODAtMHg4MyAqLworCTB4QzUsIDB4RTIsIDB4QjcsIDB4NTYsIDB4QjcsIDB4NTcsIDB4QjcsIDB4NTgsIC8qIDB4ODQtMHg4NyAqLworCTB4QzUsIDB4RTMsIDB4QjcsIDB4NTksIDB4QjcsIDB4NUEsIDB4QjcsIDB4NjEsIC8qIDB4ODgtMHg4QiAqLworCTB4QjcsIDB4NjIsIDB4QjcsIDB4NjMsIDB4QjcsIDB4NjQsIDB4QjcsIDB4NjUsIC8qIDB4OEMtMHg4RiAqLworCTB4QjcsIDB4NjYsIDB4QjcsIDB4NjcsIDB4QjcsIDB4NjgsIDB4QjcsIDB4NjksIC8qIDB4OTAtMHg5MyAqLworCTB4QjcsIDB4NkEsIDB4QjcsIDB4NkIsIDB4QjcsIDB4NkMsIDB4QjcsIDB4NkQsIC8qIDB4OTQtMHg5NyAqLworCTB4QjcsIDB4NkUsIDB4QjcsIDB4NkYsIDB4QjcsIDB4NzAsIDB4QjcsIDB4NzEsIC8qIDB4OTgtMHg5QiAqLworCTB4QjcsIDB4NzIsIDB4QjcsIDB4NzMsIDB4QjcsIDB4NzQsIDB4QjcsIDB4NzUsIC8qIDB4OUMtMHg5RiAqLworCTB4QzUsIDB4RTQsIDB4QzUsIDB4RTUsIDB4QjcsIDB4NzYsIDB4QjcsIDB4NzcsIC8qIDB4QTAtMHhBMyAqLworCTB4QzUsIDB4RTYsIDB4QjcsIDB4NzgsIDB4QjcsIDB4NzksIDB4QjcsIDB4N0EsIC8qIDB4QTQtMHhBNyAqLworCTB4QzUsIDB4RTcsIDB4QjcsIDB4ODEsIDB4QjcsIDB4ODIsIDB4QjcsIDB4ODMsIC8qIDB4QTgtMHhBQiAqLworCTB4QjcsIDB4ODQsIDB4QjcsIDB4ODUsIDB4QjcsIDB4ODYsIDB4QjcsIDB4ODcsIC8qIDB4QUMtMHhBRiAqLworCTB4QzUsIDB4RTgsIDB4QzUsIDB4RTksIDB4QjcsIDB4ODgsIDB4QzUsIDB4RUEsIC8qIDB4QjAtMHhCMyAqLworCTB4QjcsIDB4ODksIDB4QzUsIDB4RUIsIDB4QjcsIDB4OEEsIDB4QjcsIDB4OEIsIC8qIDB4QjQtMHhCNyAqLworCTB4QjcsIDB4OEMsIDB4QjcsIDB4OEQsIDB4QzUsIDB4RUMsIDB4QjcsIDB4OEUsIC8qIDB4QjgtMHhCQiAqLworCTB4QzUsIDB4RUQsIDB4QjcsIDB4OEYsIDB4QjcsIDB4OTAsIDB4QjcsIDB4OTEsIC8qIDB4QkMtMHhCRiAqLworCTB4QzUsIDB4RUUsIDB4QjcsIDB4OTIsIDB4QjcsIDB4OTMsIDB4QjcsIDB4OTQsIC8qIDB4QzAtMHhDMyAqLworCTB4QjcsIDB4OTUsIDB4QjcsIDB4OTYsIDB4QjcsIDB4OTcsIDB4QjcsIDB4OTgsIC8qIDB4QzQtMHhDNyAqLworCTB4QjcsIDB4OTksIDB4QjcsIDB4OUEsIDB4QjcsIDB4OUIsIDB4QjcsIDB4OUMsIC8qIDB4QzgtMHhDQiAqLworCTB4QjcsIDB4OUQsIDB4QjcsIDB4OUUsIDB4QjcsIDB4OUYsIDB4QjcsIDB4QTAsIC8qIDB4Q0MtMHhDRiAqLworCTB4QjgsIDB4NDEsIDB4QjgsIDB4NDIsIDB4QjgsIDB4NDMsIDB4QjgsIDB4NDQsIC8qIDB4RDAtMHhEMyAqLworCTB4QjgsIDB4NDUsIDB4QjgsIDB4NDYsIDB4QjgsIDB4NDcsIDB4QjgsIDB4NDgsIC8qIDB4RDQtMHhENyAqLworCTB4QzUsIDB4RUYsIDB4QjgsIDB4NDksIDB4QjgsIDB4NEEsIDB4QjgsIDB4NEIsIC8qIDB4RDgtMHhEQiAqLworCTB4QjgsIDB4NEMsIDB4QjgsIDB4NEQsIDB4QjgsIDB4NEUsIDB4QjgsIDB4NEYsIC8qIDB4REMtMHhERiAqLworCTB4QjgsIDB4NTAsIDB4QjgsIDB4NTEsIDB4QjgsIDB4NTIsIDB4QjgsIDB4NTMsIC8qIDB4RTAtMHhFMyAqLworCTB4QjgsIDB4NTQsIDB4QjgsIDB4NTUsIDB4QjgsIDB4NTYsIDB4QjgsIDB4NTcsIC8qIDB4RTQtMHhFNyAqLworCTB4QjgsIDB4NTgsIDB4QjgsIDB4NTksIDB4QjgsIDB4NUEsIDB4QjgsIDB4NjEsIC8qIDB4RTgtMHhFQiAqLworCTB4QjgsIDB4NjIsIDB4QjgsIDB4NjMsIDB4QjgsIDB4NjQsIDB4QjgsIDB4NjUsIC8qIDB4RUMtMHhFRiAqLworCTB4QjgsIDB4NjYsIDB4QjgsIDB4NjcsIDB4QjgsIDB4NjgsIDB4QjgsIDB4NjksIC8qIDB4RjAtMHhGMyAqLworCTB4QzUsIDB4RjAsIDB4QjgsIDB4NkEsIDB4QjgsIDB4NkIsIDB4QjgsIDB4NkMsIC8qIDB4RjQtMHhGNyAqLworCTB4QzUsIDB4RjEsIDB4QjgsIDB4NkQsIDB4QjgsIDB4NkUsIDB4QjgsIDB4NkYsIC8qIDB4RjgtMHhGQiAqLworCTB4QjgsIDB4NzAsIDB4QjgsIDB4NzEsIDB4QjgsIDB4NzIsIDB4QjgsIDB4NzMsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0QyWzUxMl0gPSB7CisJMHhCOCwgMHg3NCwgMHhCOCwgMHg3NSwgMHhCOCwgMHg3NiwgMHhCOCwgMHg3NywgLyogMHgwMC0weDAzICovCisJMHhCOCwgMHg3OCwgMHhCOCwgMHg3OSwgMHhCOCwgMHg3QSwgMHhDNSwgMHhGMiwgLyogMHgwNC0weDA3ICovCisJMHhCOCwgMHg4MSwgMHhDNSwgMHhGMywgMHhCOCwgMHg4MiwgMHhCOCwgMHg4MywgLyogMHgwOC0weDBCICovCisJMHhCOCwgMHg4NCwgMHhCOCwgMHg4NSwgMHhCOCwgMHg4NiwgMHhCOCwgMHg4NywgLyogMHgwQy0weDBGICovCisJMHhDNSwgMHhGNCwgMHhCOCwgMHg4OCwgMHhCOCwgMHg4OSwgMHhCOCwgMHg4QSwgLyogMHgxMC0weDEzICovCisJMHhCOCwgMHg4QiwgMHhCOCwgMHg4QywgMHhCOCwgMHg4RCwgMHhCOCwgMHg4RSwgLyogMHgxNC0weDE3ICovCisJMHhCOCwgMHg4RiwgMHhCOCwgMHg5MCwgMHhCOCwgMHg5MSwgMHhCOCwgMHg5MiwgLyogMHgxOC0weDFCICovCisJMHhCOCwgMHg5MywgMHhCOCwgMHg5NCwgMHhCOCwgMHg5NSwgMHhCOCwgMHg5NiwgLyogMHgxQy0weDFGICovCisJMHhCOCwgMHg5NywgMHhCOCwgMHg5OCwgMHhCOCwgMHg5OSwgMHhCOCwgMHg5QSwgLyogMHgyMC0weDIzICovCisJMHhCOCwgMHg5QiwgMHhCOCwgMHg5QywgMHhCOCwgMHg5RCwgMHhCOCwgMHg5RSwgLyogMHgyNC0weDI3ICovCisJMHhCOCwgMHg5RiwgMHhCOCwgMHhBMCwgMHhCOSwgMHg0MSwgMHhCOSwgMHg0MiwgLyogMHgyOC0weDJCICovCisJMHhDNSwgMHhGNSwgMHhDNSwgMHhGNiwgMHhCOSwgMHg0MywgMHhCOSwgMHg0NCwgLyogMHgyQy0weDJGICovCisJMHhDNSwgMHhGNywgMHhCOSwgMHg0NSwgMHhCOSwgMHg0NiwgMHhCOSwgMHg0NywgLyogMHgzMC0weDMzICovCisJMHhDNSwgMHhGOCwgMHhCOSwgMHg0OCwgMHhCOSwgMHg0OSwgMHhCOSwgMHg0QSwgLyogMHgzNC0weDM3ICovCisJMHhCOSwgMHg0QiwgMHhCOSwgMHg0QywgMHhCOSwgMHg0RCwgMHhCOSwgMHg0RSwgLyogMHgzOC0weDNCICovCisJMHhDNSwgMHhGOSwgMHhDNSwgMHhGQSwgMHhCOSwgMHg0RiwgMHhDNSwgMHhGQiwgLyogMHgzQy0weDNGICovCisJMHhCOSwgMHg1MCwgMHhDNSwgMHhGQywgMHhCOSwgMHg1MSwgMHhCOSwgMHg1MiwgLyogMHg0MC0weDQzICovCisJMHhCOSwgMHg1MywgMHhCOSwgMHg1NCwgMHhCOSwgMHg1NSwgMHhCOSwgMHg1NiwgLyogMHg0NC0weDQ3ICovCisJMHhDNSwgMHhGRCwgMHhCOSwgMHg1NywgMHhCOSwgMHg1OCwgMHhCOSwgMHg1OSwgLyogMHg0OC0weDRCICovCisJMHhCOSwgMHg1QSwgMHhCOSwgMHg2MSwgMHhCOSwgMHg2MiwgMHhCOSwgMHg2MywgLyogMHg0Qy0weDRGICovCisJMHhCOSwgMHg2NCwgMHhCOSwgMHg2NSwgMHhCOSwgMHg2NiwgMHhCOSwgMHg2NywgLyogMHg1MC0weDUzICovCisJMHhCOSwgMHg2OCwgMHhCOSwgMHg2OSwgMHhCOSwgMHg2QSwgMHhCOSwgMHg2QiwgLyogMHg1NC0weDU3ICovCisJMHhCOSwgMHg2QywgMHhCOSwgMHg2RCwgMHhCOSwgMHg2RSwgMHhCOSwgMHg2RiwgLyogMHg1OC0weDVCICovCisJMHhDNSwgMHhGRSwgMHhCOSwgMHg3MCwgMHhCOSwgMHg3MSwgMHhCOSwgMHg3MiwgLyogMHg1Qy0weDVGICovCisJMHhCOSwgMHg3MywgMHhCOSwgMHg3NCwgMHhCOSwgMHg3NSwgMHhCOSwgMHg3NiwgLyogMHg2MC0weDYzICovCisJMHhDNiwgMHhBMSwgMHhCOSwgMHg3NywgMHhCOSwgMHg3OCwgMHhCOSwgMHg3OSwgLyogMHg2NC0weDY3ICovCisJMHhCOSwgMHg3QSwgMHhCOSwgMHg4MSwgMHhCOSwgMHg4MiwgMHhCOSwgMHg4MywgLyogMHg2OC0weDZCICovCisJMHhCOSwgMHg4NCwgMHhCOSwgMHg4NSwgMHhCOSwgMHg4NiwgMHhCOSwgMHg4NywgLyogMHg2Qy0weDZGICovCisJMHhCOSwgMHg4OCwgMHhCOSwgMHg4OSwgMHhCOSwgMHg4QSwgMHhCOSwgMHg4QiwgLyogMHg3MC0weDczICovCisJMHhCOSwgMHg4QywgMHhCOSwgMHg4RCwgMHhCOSwgMHg4RSwgMHhCOSwgMHg4RiwgLyogMHg3NC0weDc3ICovCisJMHhCOSwgMHg5MCwgMHhCOSwgMHg5MSwgMHhCOSwgMHg5MiwgMHhCOSwgMHg5MywgLyogMHg3OC0weDdCICovCisJMHhCOSwgMHg5NCwgMHhCOSwgMHg5NSwgMHhCOSwgMHg5NiwgMHhCOSwgMHg5NywgLyogMHg3Qy0weDdGICovCisJCisJMHhDNiwgMHhBMiwgMHhDNiwgMHhBMywgMHhCOSwgMHg5OCwgMHhCOSwgMHg5OSwgLyogMHg4MC0weDgzICovCisJMHhDNiwgMHhBNCwgMHhCOSwgMHg5QSwgMHhCOSwgMHg5QiwgMHhCOSwgMHg5QywgLyogMHg4NC0weDg3ICovCisJMHhDNiwgMHhBNSwgMHhCOSwgMHg5RCwgMHhCOSwgMHg5RSwgMHhCOSwgMHg5RiwgLyogMHg4OC0weDhCICovCisJMHhCOSwgMHhBMCwgMHhCQSwgMHg0MSwgMHhCQSwgMHg0MiwgMHhCQSwgMHg0MywgLyogMHg4Qy0weDhGICovCisJMHhDNiwgMHhBNiwgMHhDNiwgMHhBNywgMHhCQSwgMHg0NCwgMHhCQSwgMHg0NSwgLyogMHg5MC0weDkzICovCisJMHhCQSwgMHg0NiwgMHhDNiwgMHhBOCwgMHhCQSwgMHg0NywgMHhCQSwgMHg0OCwgLyogMHg5NC0weDk3ICovCisJMHhCQSwgMHg0OSwgMHhCQSwgMHg0QSwgMHhCQSwgMHg0QiwgMHhCQSwgMHg0QywgLyogMHg5OC0weDlCICovCisJMHhDNiwgMHhBOSwgMHhCQSwgMHg0RCwgMHhCQSwgMHg0RSwgMHhCQSwgMHg0RiwgLyogMHg5Qy0weDlGICovCisJMHhDNiwgMHhBQSwgMHhCQSwgMHg1MCwgMHhCQSwgMHg1MSwgMHhCQSwgMHg1MiwgLyogMHhBMC0weEEzICovCisJMHhDNiwgMHhBQiwgMHhCQSwgMHg1MywgMHhCQSwgMHg1NCwgMHhCQSwgMHg1NSwgLyogMHhBNC0weEE3ICovCisJMHhCQSwgMHg1NiwgMHhCQSwgMHg1NywgMHhCQSwgMHg1OCwgMHhCQSwgMHg1OSwgLyogMHhBOC0weEFCICovCisJMHhDNiwgMHhBQywgMHhCQSwgMHg1QSwgMHhCQSwgMHg2MSwgMHhCQSwgMHg2MiwgLyogMHhBQy0weEFGICovCisJMHhCQSwgMHg2MywgMHhDNiwgMHhBRCwgMHhCQSwgMHg2NCwgMHhCQSwgMHg2NSwgLyogMHhCMC0weEIzICovCisJMHhCQSwgMHg2NiwgMHhCQSwgMHg2NywgMHhCQSwgMHg2OCwgMHhCQSwgMHg2OSwgLyogMHhCNC0weEI3ICovCisJMHhDNiwgMHhBRSwgMHhDNiwgMHhBRiwgMHhCQSwgMHg2QSwgMHhCQSwgMHg2QiwgLyogMHhCOC0weEJCICovCisJMHhDNiwgMHhCMCwgMHhCQSwgMHg2QywgMHhCQSwgMHg2RCwgMHhDNiwgMHhCMSwgLyogMHhCQy0weEJGICovCisJMHhDNiwgMHhCMiwgMHhCQSwgMHg2RSwgMHhDNiwgMHhCMywgMHhCQSwgMHg2RiwgLyogMHhDMC0weEMzICovCisJMHhCQSwgMHg3MCwgMHhCQSwgMHg3MSwgMHhCQSwgMHg3MiwgMHhCQSwgMHg3MywgLyogMHhDNC0weEM3ICovCisJMHhDNiwgMHhCNCwgMHhDNiwgMHhCNSwgMHhCQSwgMHg3NCwgMHhDNiwgMHhCNiwgLyogMHhDOC0weENCICovCisJMHhCQSwgMHg3NSwgMHhCQSwgMHg3NiwgMHhCQSwgMHg3NywgMHhCQSwgMHg3OCwgLyogMHhDQy0weENGICovCisJMHhCQSwgMHg3OSwgMHhCQSwgMHg3QSwgMHhCQSwgMHg4MSwgMHhCQSwgMHg4MiwgLyogMHhEMC0weEQzICovCisJMHhDNiwgMHhCNywgMHhCQSwgMHg4MywgMHhCQSwgMHg4NCwgMHhCQSwgMHg4NSwgLyogMHhENC0weEQ3ICovCisJMHhDNiwgMHhCOCwgMHhCQSwgMHg4NiwgMHhCQSwgMHg4NywgMHhCQSwgMHg4OCwgLyogMHhEOC0weERCICovCisJMHhDNiwgMHhCOSwgMHhCQSwgMHg4OSwgMHhCQSwgMHg4QSwgMHhCQSwgMHg4QiwgLyogMHhEQy0weERGICovCisJMHhCQSwgMHg4QywgMHhCQSwgMHg4RCwgMHhCQSwgMHg4RSwgMHhCQSwgMHg4RiwgLyogMHhFMC0weEUzICovCisJMHhDNiwgMHhCQSwgMHhDNiwgMHhCQiwgMHhCQSwgMHg5MCwgMHhCQSwgMHg5MSwgLyogMHhFNC0weEU3ICovCisJMHhCQSwgMHg5MiwgMHhCQSwgMHg5MywgMHhCQSwgMHg5NCwgMHhCQSwgMHg5NSwgLyogMHhFOC0weEVCICovCisJMHhCQSwgMHg5NiwgMHhCQSwgMHg5NywgMHhCQSwgMHg5OCwgMHhCQSwgMHg5OSwgLyogMHhFQy0weEVGICovCisJMHhDNiwgMHhCQywgMHhDNiwgMHhCRCwgMHhCQSwgMHg5QSwgMHhCQSwgMHg5QiwgLyogMHhGMC0weEYzICovCisJMHhDNiwgMHhCRSwgMHhCQSwgMHg5QywgMHhCQSwgMHg5RCwgMHhCQSwgMHg5RSwgLyogMHhGNC0weEY3ICovCisJMHhDNiwgMHhCRiwgMHhCQSwgMHg5RiwgMHhCQSwgMHhBMCwgMHhCQiwgMHg0MSwgLyogMHhGOC0weEZCICovCisJMHhCQiwgMHg0MiwgMHhCQiwgMHg0MywgMHhCQiwgMHg0NCwgMHhCQiwgMHg0NSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfRDNbNTEyXSA9IHsKKwkweEM2LCAweEMwLCAweEM2LCAweEMxLCAweEJCLCAweDQ2LCAweEM2LCAweEMyLCAvKiAweDAwLTB4MDMgKi8KKwkweEJCLCAweDQ3LCAweEM2LCAweEMzLCAweEJCLCAweDQ4LCAweEJCLCAweDQ5LCAvKiAweDA0LTB4MDcgKi8KKwkweEJCLCAweDRBLCAweEJCLCAweDRCLCAweEJCLCAweDRDLCAweEJCLCAweDRELCAvKiAweDA4LTB4MEIgKi8KKwkweEM2LCAweEM0LCAweEM2LCAweEM1LCAweEM2LCAweEM2LCAweEJCLCAweDRFLCAvKiAweDBDLTB4MEYgKi8KKwkweEM2LCAweEM3LCAweEJCLCAweDRGLCAweEJCLCAweDUwLCAweEJCLCAweDUxLCAvKiAweDEwLTB4MTMgKi8KKwkweEM2LCAweEM4LCAweEJCLCAweDUyLCAweEM2LCAweEM5LCAweEJCLCAweDUzLCAvKiAweDE0LTB4MTcgKi8KKwkweEJCLCAweDU0LCAweEJCLCAweDU1LCAweEJCLCAweDU2LCAweEJCLCAweDU3LCAvKiAweDE4LTB4MUIgKi8KKwkweEM2LCAweENBLCAweEM2LCAweENCLCAweEJCLCAweDU4LCAweEM2LCAweENDLCAvKiAweDFDLTB4MUYgKi8KKwkweEM2LCAweENELCAweEM2LCAweENFLCAweEJCLCAweDU5LCAweEJCLCAweDVBLCAvKiAweDIwLTB4MjMgKi8KKwkweEJCLCAweDYxLCAweEM2LCAweENGLCAweEJCLCAweDYyLCAweEJCLCAweDYzLCAvKiAweDI0LTB4MjcgKi8KKwkweEM2LCAweEQwLCAweEM2LCAweEQxLCAweEJCLCAweDY0LCAweEJCLCAweDY1LCAvKiAweDI4LTB4MkIgKi8KKwkweEM2LCAweEQyLCAweEJCLCAweDY2LCAweEJCLCAweDY3LCAweEJCLCAweDY4LCAvKiAweDJDLTB4MkYgKi8KKwkweEM2LCAweEQzLCAweEJCLCAweDY5LCAweEJCLCAweDZBLCAweEJCLCAweDZCLCAvKiAweDMwLTB4MzMgKi8KKwkweEJCLCAweDZDLCAweEJCLCAweDZELCAweEJCLCAweDZFLCAweEJCLCAweDZGLCAvKiAweDM0LTB4MzcgKi8KKwkweEM2LCAweEQ0LCAweEM2LCAweEQ1LCAweEJCLCAweDcwLCAweEM2LCAweEQ2LCAvKiAweDM4LTB4M0IgKi8KKwkweEM2LCAweEQ3LCAweEM2LCAweEQ4LCAweEJCLCAweDcxLCAweEJCLCAweDcyLCAvKiAweDNDLTB4M0YgKi8KKwkweEJCLCAweDczLCAweEJCLCAweDc0LCAweEJCLCAweDc1LCAweEJCLCAweDc2LCAvKiAweDQwLTB4NDMgKi8KKwkweEM2LCAweEQ5LCAweEM2LCAweERBLCAweEJCLCAweDc3LCAweEJCLCAweDc4LCAvKiAweDQ0LTB4NDcgKi8KKwkweEJCLCAweDc5LCAweEJCLCAweDdBLCAweEJCLCAweDgxLCAweEJCLCAweDgyLCAvKiAweDQ4LTB4NEIgKi8KKwkweEJCLCAweDgzLCAweEJCLCAweDg0LCAweEJCLCAweDg1LCAweEJCLCAweDg2LCAvKiAweDRDLTB4NEYgKi8KKwkweEJCLCAweDg3LCAweEJCLCAweDg4LCAweEJCLCAweDg5LCAweEJCLCAweDhBLCAvKiAweDUwLTB4NTMgKi8KKwkweEJCLCAweDhCLCAweEJCLCAweDhDLCAweEJCLCAweDhELCAweEJCLCAweDhFLCAvKiAweDU0LTB4NTcgKi8KKwkweEJCLCAweDhGLCAweEJCLCAweDkwLCAweEJCLCAweDkxLCAweEJCLCAweDkyLCAvKiAweDU4LTB4NUIgKi8KKwkweEJCLCAweDkzLCAweEJCLCAweDk0LCAweEJCLCAweDk1LCAweEJCLCAweDk2LCAvKiAweDVDLTB4NUYgKi8KKwkweEJCLCAweDk3LCAweEJCLCAweDk4LCAweEJCLCAweDk5LCAweEJCLCAweDlBLCAvKiAweDYwLTB4NjMgKi8KKwkweEJCLCAweDlCLCAweEJCLCAweDlDLCAweEJCLCAweDlELCAweEJCLCAweDlFLCAvKiAweDY0LTB4NjcgKi8KKwkweEJCLCAweDlGLCAweEJCLCAweEEwLCAweEJDLCAweDQxLCAweEJDLCAweDQyLCAvKiAweDY4LTB4NkIgKi8KKwkweEJDLCAweDQzLCAweEJDLCAweDQ0LCAweEJDLCAweDQ1LCAweEJDLCAweDQ2LCAvKiAweDZDLTB4NkYgKi8KKwkweEJDLCAweDQ3LCAweEJDLCAweDQ4LCAweEJDLCAweDQ5LCAweEJDLCAweDRBLCAvKiAweDcwLTB4NzMgKi8KKwkweEJDLCAweDRCLCAweEJDLCAweDRDLCAweEJDLCAweDRELCAweEJDLCAweDRFLCAvKiAweDc0LTB4NzcgKi8KKwkweEJDLCAweDRGLCAweEJDLCAweDUwLCAweEJDLCAweDUxLCAweEJDLCAweDUyLCAvKiAweDc4LTB4N0IgKi8KKwkweEM2LCAweERCLCAweEM2LCAweERDLCAweEJDLCAweDUzLCAweEJDLCAweDU0LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEM2LCAweERELCAweEJDLCAweDU1LCAweEJDLCAweDU2LCAweEJDLCAweDU3LCAvKiAweDgwLTB4ODMgKi8KKwkweEM2LCAweERFLCAweEJDLCAweDU4LCAweEJDLCAweDU5LCAweEJDLCAweDVBLCAvKiAweDg0LTB4ODcgKi8KKwkweEJDLCAweDYxLCAweEJDLCAweDYyLCAweEJDLCAweDYzLCAweEJDLCAweDY0LCAvKiAweDg4LTB4OEIgKi8KKwkweEM2LCAweERGLCAweEM2LCAweEUwLCAweEJDLCAweDY1LCAweEM2LCAweEUxLCAvKiAweDhDLTB4OEYgKi8KKwkweEM2LCAweEUyLCAweEM2LCAweEUzLCAweEJDLCAweDY2LCAweEJDLCAweDY3LCAvKiAweDkwLTB4OTMgKi8KKwkweEJDLCAweDY4LCAweEJDLCAweDY5LCAweEJDLCAweDZBLCAweEJDLCAweDZCLCAvKiAweDk0LTB4OTcgKi8KKwkweEM2LCAweEU0LCAweEM2LCAweEU1LCAweEJDLCAweDZDLCAweEJDLCAweDZELCAvKiAweDk4LTB4OUIgKi8KKwkweEM2LCAweEU2LCAweEJDLCAweDZFLCAweEJDLCAweDZGLCAweEJDLCAweDcwLCAvKiAweDlDLTB4OUYgKi8KKwkweEM2LCAweEU3LCAweEJDLCAweDcxLCAweEJDLCAweDcyLCAweEJDLCAweDczLCAvKiAweEEwLTB4QTMgKi8KKwkweEJDLCAweDc0LCAweEJDLCAweDc1LCAweEJDLCAweDc2LCAweEJDLCAweDc3LCAvKiAweEE0LTB4QTcgKi8KKwkweEM2LCAweEU4LCAweEM2LCAweEU5LCAweEJDLCAweDc4LCAweEM2LCAweEVBLCAvKiAweEE4LTB4QUIgKi8KKwkweEJDLCAweDc5LCAweEM2LCAweEVCLCAweEJDLCAweDdBLCAweEJDLCAweDgxLCAvKiAweEFDLTB4QUYgKi8KKwkweEJDLCAweDgyLCAweEJDLCAweDgzLCAweEJDLCAweDg0LCAweEJDLCAweDg1LCAvKiAweEIwLTB4QjMgKi8KKwkweEM2LCAweEVDLCAweEJDLCAweDg2LCAweEJDLCAweDg3LCAweEJDLCAweDg4LCAvKiAweEI0LTB4QjcgKi8KKwkweEM2LCAweEVELCAweEJDLCAweDg5LCAweEJDLCAweDhBLCAweEJDLCAweDhCLCAvKiAweEI4LTB4QkIgKi8KKwkweEM2LCAweEVFLCAweEJDLCAweDhDLCAweEJDLCAweDhELCAweEJDLCAweDhFLCAvKiAweEJDLTB4QkYgKi8KKwkweEJDLCAweDhGLCAweEJDLCAweDkwLCAweEJDLCAweDkxLCAweEJDLCAweDkyLCAvKiAweEMwLTB4QzMgKi8KKwkweEM2LCAweEVGLCAweEM2LCAweEYwLCAweEJDLCAweDkzLCAweEJDLCAweDk0LCAvKiAweEM0LTB4QzcgKi8KKwkweEM2LCAweEYxLCAweEM2LCAweEYyLCAweEJDLCAweDk1LCAweEJDLCAweDk2LCAvKiAweEM4LTB4Q0IgKi8KKwkweEJDLCAweDk3LCAweEJDLCAweDk4LCAweEJDLCAweDk5LCAweEJDLCAweDlBLCAvKiAweENDLTB4Q0YgKi8KKwkweEM2LCAweEYzLCAweEJDLCAweDlCLCAweEJDLCAweDlDLCAweEJDLCAweDlELCAvKiAweEQwLTB4RDMgKi8KKwkweEJDLCAweDlFLCAweEJDLCAweDlGLCAweEJDLCAweEEwLCAweEJELCAweDQxLCAvKiAweEQ0LTB4RDcgKi8KKwkweEM2LCAweEY0LCAweEJELCAweDQyLCAweEJELCAweDQzLCAweEJELCAweDQ0LCAvKiAweEQ4LTB4REIgKi8KKwkweEJELCAweDQ1LCAweEJELCAweDQ2LCAweEJELCAweDQ3LCAweEJELCAweDQ4LCAvKiAweERDLTB4REYgKi8KKwkweEJELCAweDQ5LCAweEM2LCAweEY1LCAweEJELCAweDRBLCAweEM2LCAweEY2LCAvKiAweEUwLTB4RTMgKi8KKwkweEJELCAweDRCLCAweEJELCAweDRDLCAweEJELCAweDRELCAweEJELCAweDRFLCAvKiAweEU0LTB4RTcgKi8KKwkweEJELCAweDRGLCAweEJELCAweDUwLCAweEJELCAweDUxLCAweEJELCAweDUyLCAvKiAweEU4LTB4RUIgKi8KKwkweEM2LCAweEY3LCAweEM2LCAweEY4LCAweEJELCAweDUzLCAweEJELCAweDU0LCAvKiAweEVDLTB4RUYgKi8KKwkweEM2LCAweEY5LCAweEJELCAweDU1LCAweEJELCAweDU2LCAweEJELCAweDU3LCAvKiAweEYwLTB4RjMgKi8KKwkweEM2LCAweEZBLCAweEJELCAweDU4LCAweEJELCAweDU5LCAweEJELCAweDVBLCAvKiAweEY0LTB4RjcgKi8KKwkweEJELCAweDYxLCAweEJELCAweDYyLCAweEJELCAweDYzLCAweEJELCAweDY0LCAvKiAweEY4LTB4RkIgKi8KKwkweEM2LCAweEZCLCAweEM2LCAweEZDLCAweEJELCAweDY1LCAweEM2LCAweEZELCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19ENFs1MTJdID0geworCTB4QkQsIDB4NjYsIDB4QzYsIDB4RkUsIDB4QkQsIDB4NjcsIDB4QkQsIDB4NjgsIC8qIDB4MDAtMHgwMyAqLworCTB4QkQsIDB4NjksIDB4QkQsIDB4NkEsIDB4QkQsIDB4NkIsIDB4QkQsIDB4NkMsIC8qIDB4MDQtMHgwNyAqLworCTB4QzcsIDB4QTEsIDB4QkQsIDB4NkQsIDB4QkQsIDB4NkUsIDB4QkQsIDB4NkYsIC8qIDB4MDgtMHgwQiAqLworCTB4QkQsIDB4NzAsIDB4QkQsIDB4NzEsIDB4QkQsIDB4NzIsIDB4QkQsIDB4NzMsIC8qIDB4MEMtMHgwRiAqLworCTB4QkQsIDB4NzQsIDB4QkQsIDB4NzUsIDB4QkQsIDB4NzYsIDB4QkQsIDB4NzcsIC8qIDB4MTAtMHgxMyAqLworCTB4QkQsIDB4NzgsIDB4QkQsIDB4NzksIDB4QkQsIDB4N0EsIDB4QkQsIDB4ODEsIC8qIDB4MTQtMHgxNyAqLworCTB4QkQsIDB4ODIsIDB4QkQsIDB4ODMsIDB4QkQsIDB4ODQsIDB4QkQsIDB4ODUsIC8qIDB4MTgtMHgxQiAqLworCTB4QkQsIDB4ODYsIDB4QzcsIDB4QTIsIDB4QkQsIDB4ODcsIDB4QkQsIDB4ODgsIC8qIDB4MUMtMHgxRiAqLworCTB4QkQsIDB4ODksIDB4QkQsIDB4OEEsIDB4QkQsIDB4OEIsIDB4QkQsIDB4OEMsIC8qIDB4MjAtMHgyMyAqLworCTB4QkQsIDB4OEQsIDB4QkQsIDB4OEUsIDB4QkQsIDB4OEYsIDB4QkQsIDB4OTAsIC8qIDB4MjQtMHgyNyAqLworCTB4QkQsIDB4OTEsIDB4QkQsIDB4OTIsIDB4QkQsIDB4OTMsIDB4QkQsIDB4OTQsIC8qIDB4MjgtMHgyQiAqLworCTB4QkQsIDB4OTUsIDB4QkQsIDB4OTYsIDB4QkQsIDB4OTcsIDB4QkQsIDB4OTgsIC8qIDB4MkMtMHgyRiAqLworCTB4QkQsIDB4OTksIDB4QkQsIDB4OUEsIDB4QkQsIDB4OUIsIDB4QkQsIDB4OUMsIC8qIDB4MzAtMHgzMyAqLworCTB4QkQsIDB4OUQsIDB4QkQsIDB4OUUsIDB4QkQsIDB4OUYsIDB4QkQsIDB4QTAsIC8qIDB4MzQtMHgzNyAqLworCTB4QkUsIDB4NDEsIDB4QkUsIDB4NDIsIDB4QkUsIDB4NDMsIDB4QkUsIDB4NDQsIC8qIDB4MzgtMHgzQiAqLworCTB4QkUsIDB4NDUsIDB4QkUsIDB4NDYsIDB4QkUsIDB4NDcsIDB4QkUsIDB4NDgsIC8qIDB4M0MtMHgzRiAqLworCTB4QzcsIDB4QTMsIDB4QkUsIDB4NDksIDB4QkUsIDB4NEEsIDB4QkUsIDB4NEIsIC8qIDB4NDAtMHg0MyAqLworCTB4QzcsIDB4QTQsIDB4QkUsIDB4NEMsIDB4QkUsIDB4NEQsIDB4QkUsIDB4NEUsIC8qIDB4NDQtMHg0NyAqLworCTB4QkUsIDB4NEYsIDB4QkUsIDB4NTAsIDB4QkUsIDB4NTEsIDB4QkUsIDB4NTIsIC8qIDB4NDgtMHg0QiAqLworCTB4QkUsIDB4NTMsIDB4QkUsIDB4NTQsIDB4QkUsIDB4NTUsIDB4QkUsIDB4NTYsIC8qIDB4NEMtMHg0RiAqLworCTB4QkUsIDB4NTcsIDB4QkUsIDB4NTgsIDB4QkUsIDB4NTksIDB4QkUsIDB4NUEsIC8qIDB4NTAtMHg1MyAqLworCTB4QkUsIDB4NjEsIDB4QkUsIDB4NjIsIDB4QkUsIDB4NjMsIDB4QkUsIDB4NjQsIC8qIDB4NTQtMHg1NyAqLworCTB4QkUsIDB4NjUsIDB4QkUsIDB4NjYsIDB4QkUsIDB4NjcsIDB4QkUsIDB4NjgsIC8qIDB4NTgtMHg1QiAqLworCTB4QzcsIDB4QTUsIDB4QkUsIDB4NjksIDB4QkUsIDB4NkEsIDB4QkUsIDB4NkIsIC8qIDB4NUMtMHg1RiAqLworCTB4QzcsIDB4QTYsIDB4QkUsIDB4NkMsIDB4QkUsIDB4NkQsIDB4QkUsIDB4NkUsIC8qIDB4NjAtMHg2MyAqLworCTB4QzcsIDB4QTcsIDB4QkUsIDB4NkYsIDB4QkUsIDB4NzAsIDB4QkUsIDB4NzEsIC8qIDB4NjQtMHg2NyAqLworCTB4QkUsIDB4NzIsIDB4QkUsIDB4NzMsIDB4QkUsIDB4NzQsIDB4QkUsIDB4NzUsIC8qIDB4NjgtMHg2QiAqLworCTB4QkUsIDB4NzYsIDB4QzcsIDB4QTgsIDB4QkUsIDB4NzcsIDB4QzcsIDB4QTksIC8qIDB4NkMtMHg2RiAqLworCTB4QkUsIDB4NzgsIDB4QkUsIDB4NzksIDB4QkUsIDB4N0EsIDB4QkUsIDB4ODEsIC8qIDB4NzAtMHg3MyAqLworCTB4QkUsIDB4ODIsIDB4QkUsIDB4ODMsIDB4QkUsIDB4ODQsIDB4QkUsIDB4ODUsIC8qIDB4NzQtMHg3NyAqLworCTB4QzcsIDB4QUEsIDB4QzcsIDB4QUIsIDB4QkUsIDB4ODYsIDB4QkUsIDB4ODcsIC8qIDB4NzgtMHg3QiAqLworCTB4QzcsIDB4QUMsIDB4QkUsIDB4ODgsIDB4QkUsIDB4ODksIDB4QzcsIDB4QUQsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QzcsIDB4QUUsIDB4QkUsIDB4OEEsIDB4QzcsIDB4QUYsIDB4QkUsIDB4OEIsIC8qIDB4ODAtMHg4MyAqLworCTB4QkUsIDB4OEMsIDB4QkUsIDB4OEQsIDB4QkUsIDB4OEUsIDB4QkUsIDB4OEYsIC8qIDB4ODQtMHg4NyAqLworCTB4QzcsIDB4QjAsIDB4QzcsIDB4QjEsIDB4QkUsIDB4OTAsIDB4QzcsIDB4QjIsIC8qIDB4ODgtMHg4QiAqLworCTB4QkUsIDB4OTEsIDB4QzcsIDB4QjMsIDB4QkUsIDB4OTIsIDB4QkUsIDB4OTMsIC8qIDB4OEMtMHg4RiAqLworCTB4QkUsIDB4OTQsIDB4QkUsIDB4OTUsIDB4QkUsIDB4OTYsIDB4QkUsIDB4OTcsIC8qIDB4OTAtMHg5MyAqLworCTB4QzcsIDB4QjQsIDB4QkUsIDB4OTgsIDB4QkUsIDB4OTksIDB4QkUsIDB4OUEsIC8qIDB4OTQtMHg5NyAqLworCTB4QkUsIDB4OUIsIDB4QkUsIDB4OUMsIDB4QkUsIDB4OUQsIDB4QkUsIDB4OUUsIC8qIDB4OTgtMHg5QiAqLworCTB4QkUsIDB4OUYsIDB4QkUsIDB4QTAsIDB4QkYsIDB4NDEsIDB4QkYsIDB4NDIsIC8qIDB4OUMtMHg5RiAqLworCTB4QkYsIDB4NDMsIDB4QkYsIDB4NDQsIDB4QkYsIDB4NDUsIDB4QkYsIDB4NDYsIC8qIDB4QTAtMHhBMyAqLworCTB4QkYsIDB4NDcsIDB4QkYsIDB4NDgsIDB4QkYsIDB4NDksIDB4QkYsIDB4NEEsIC8qIDB4QTQtMHhBNyAqLworCTB4QkYsIDB4NEIsIDB4QzcsIDB4QjUsIDB4QkYsIDB4NEMsIDB4QkYsIDB4NEQsIC8qIDB4QTgtMHhBQiAqLworCTB4QkYsIDB4NEUsIDB4QkYsIDB4NEYsIDB4QkYsIDB4NTAsIDB4QkYsIDB4NTEsIC8qIDB4QUMtMHhBRiAqLworCTB4QkYsIDB4NTIsIDB4QkYsIDB4NTMsIDB4QkYsIDB4NTQsIDB4QkYsIDB4NTUsIC8qIDB4QjAtMHhCMyAqLworCTB4QkYsIDB4NTYsIDB4QkYsIDB4NTcsIDB4QkYsIDB4NTgsIDB4QkYsIDB4NTksIC8qIDB4QjQtMHhCNyAqLworCTB4QkYsIDB4NUEsIDB4QkYsIDB4NjEsIDB4QkYsIDB4NjIsIDB4QkYsIDB4NjMsIC8qIDB4QjgtMHhCQiAqLworCTB4QkYsIDB4NjQsIDB4QkYsIDB4NjUsIDB4QkYsIDB4NjYsIDB4QkYsIDB4NjcsIC8qIDB4QkMtMHhCRiAqLworCTB4QkYsIDB4NjgsIDB4QkYsIDB4NjksIDB4QkYsIDB4NkEsIDB4QkYsIDB4NkIsIC8qIDB4QzAtMHhDMyAqLworCTB4QkYsIDB4NkMsIDB4QkYsIDB4NkQsIDB4QkYsIDB4NkUsIDB4QkYsIDB4NkYsIC8qIDB4QzQtMHhDNyAqLworCTB4QkYsIDB4NzAsIDB4QkYsIDB4NzEsIDB4QkYsIDB4NzIsIDB4QkYsIDB4NzMsIC8qIDB4QzgtMHhDQiAqLworCTB4QzcsIDB4QjYsIDB4QkYsIDB4NzQsIDB4QkYsIDB4NzUsIDB4QkYsIDB4NzYsIC8qIDB4Q0MtMHhDRiAqLworCTB4QzcsIDB4QjcsIDB4QkYsIDB4NzcsIDB4QkYsIDB4NzgsIDB4QkYsIDB4NzksIC8qIDB4RDAtMHhEMyAqLworCTB4QzcsIDB4QjgsIDB4QkYsIDB4N0EsIDB4QkYsIDB4ODEsIDB4QkYsIDB4ODIsIC8qIDB4RDQtMHhENyAqLworCTB4QkYsIDB4ODMsIDB4QkYsIDB4ODQsIDB4QkYsIDB4ODUsIDB4QkYsIDB4ODYsIC8qIDB4RDgtMHhEQiAqLworCTB4QzcsIDB4QjksIDB4QkYsIDB4ODcsIDB4QkYsIDB4ODgsIDB4QzcsIDB4QkEsIC8qIDB4REMtMHhERiAqLworCTB4QkYsIDB4ODksIDB4QkYsIDB4OEEsIDB4QkYsIDB4OEIsIDB4QkYsIDB4OEMsIC8qIDB4RTAtMHhFMyAqLworCTB4QkYsIDB4OEQsIDB4QkYsIDB4OEUsIDB4QkYsIDB4OEYsIDB4QkYsIDB4OTAsIC8qIDB4RTQtMHhFNyAqLworCTB4QzcsIDB4QkIsIDB4QkYsIDB4OTEsIDB4QkYsIDB4OTIsIDB4QkYsIDB4OTMsIC8qIDB4RTgtMHhFQiAqLworCTB4QzcsIDB4QkMsIDB4QkYsIDB4OTQsIDB4QkYsIDB4OTUsIDB4QkYsIDB4OTYsIC8qIDB4RUMtMHhFRiAqLworCTB4QzcsIDB4QkQsIDB4QkYsIDB4OTcsIDB4QkYsIDB4OTgsIDB4QkYsIDB4OTksIC8qIDB4RjAtMHhGMyAqLworCTB4QkYsIDB4OUEsIDB4QkYsIDB4OUIsIDB4QkYsIDB4OUMsIDB4QkYsIDB4OUQsIC8qIDB4RjQtMHhGNyAqLworCTB4QzcsIDB4QkUsIDB4QkYsIDB4OUUsIDB4QkYsIDB4OUYsIDB4QzcsIDB4QkYsIC8qIDB4RjgtMHhGQiAqLworCTB4QkYsIDB4QTAsIDB4QzcsIDB4QzAsIDB4QzAsIDB4NDEsIDB4QzAsIDB4NDIsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0Q1WzUxMl0gPSB7CisJMHhDMCwgMHg0MywgMHhDMCwgMHg0NCwgMHhDMCwgMHg0NSwgMHhDMCwgMHg0NiwgLyogMHgwMC0weDAzICovCisJMHhDNywgMHhDMSwgMHhDMCwgMHg0NywgMHhDMCwgMHg0OCwgMHhDMCwgMHg0OSwgLyogMHgwNC0weDA3ICovCisJMHhDNywgMHhDMiwgMHhDMCwgMHg0QSwgMHhDMCwgMHg0QiwgMHhDMCwgMHg0QywgLyogMHgwOC0weDBCICovCisJMHhDNywgMHhDMywgMHhDMCwgMHg0RCwgMHhDMCwgMHg0RSwgMHhDMCwgMHg0RiwgLyogMHgwQy0weDBGICovCisJMHhDMCwgMHg1MCwgMHhDMCwgMHg1MSwgMHhDMCwgMHg1MiwgMHhDMCwgMHg1MywgLyogMHgxMC0weDEzICovCisJMHhDNywgMHhDNCwgMHhDNywgMHhDNSwgMHhDMCwgMHg1NCwgMHhDNywgMHhDNiwgLyogMHgxNC0weDE3ICovCisJMHhDMCwgMHg1NSwgMHhDMCwgMHg1NiwgMHhDMCwgMHg1NywgMHhDMCwgMHg1OCwgLyogMHgxOC0weDFCICovCisJMHhDMCwgMHg1OSwgMHhDMCwgMHg1QSwgMHhDMCwgMHg2MSwgMHhDMCwgMHg2MiwgLyogMHgxQy0weDFGICovCisJMHhDMCwgMHg2MywgMHhDMCwgMHg2NCwgMHhDMCwgMHg2NSwgMHhDMCwgMHg2NiwgLyogMHgyMC0weDIzICovCisJMHhDMCwgMHg2NywgMHhDMCwgMHg2OCwgMHhDMCwgMHg2OSwgMHhDMCwgMHg2QSwgLyogMHgyNC0weDI3ICovCisJMHhDMCwgMHg2QiwgMHhDMCwgMHg2QywgMHhDMCwgMHg2RCwgMHhDMCwgMHg2RSwgLyogMHgyOC0weDJCICovCisJMHhDMCwgMHg2RiwgMHhDMCwgMHg3MCwgMHhDMCwgMHg3MSwgMHhDMCwgMHg3MiwgLyogMHgyQy0weDJGICovCisJMHhDMCwgMHg3MywgMHhDMCwgMHg3NCwgMHhDMCwgMHg3NSwgMHhDMCwgMHg3NiwgLyogMHgzMC0weDMzICovCisJMHhDMCwgMHg3NywgMHhDMCwgMHg3OCwgMHhDMCwgMHg3OSwgMHhDMCwgMHg3QSwgLyogMHgzNC0weDM3ICovCisJMHhDMCwgMHg4MSwgMHhDMCwgMHg4MiwgMHhDMCwgMHg4MywgMHhDMCwgMHg4NCwgLyogMHgzOC0weDNCICovCisJMHhDNywgMHhDNywgMHhDNywgMHhDOCwgMHhDMCwgMHg4NSwgMHhDMCwgMHg4NiwgLyogMHgzQy0weDNGICovCisJMHhDNywgMHhDOSwgMHhDMCwgMHg4NywgMHhDMCwgMHg4OCwgMHhDMCwgMHg4OSwgLyogMHg0MC0weDQzICovCisJMHhDNywgMHhDQSwgMHhDMCwgMHg4QSwgMHhDMCwgMHg4QiwgMHhDMCwgMHg4QywgLyogMHg0NC0weDQ3ICovCisJMHhDMCwgMHg4RCwgMHhDMCwgMHg4RSwgMHhDMCwgMHg4RiwgMHhDMCwgMHg5MCwgLyogMHg0OC0weDRCICovCisJMHhDNywgMHhDQiwgMHhDNywgMHhDQywgMHhDMCwgMHg5MSwgMHhDNywgMHhDRCwgLyogMHg0Qy0weDRGICovCisJMHhDMCwgMHg5MiwgMHhDNywgMHhDRSwgMHhDMCwgMHg5MywgMHhDMCwgMHg5NCwgLyogMHg1MC0weDUzICovCisJMHhDMCwgMHg5NSwgMHhDMCwgMHg5NiwgMHhDMCwgMHg5NywgMHhDMCwgMHg5OCwgLyogMHg1NC0weDU3ICovCisJMHhDNywgMHhDRiwgMHhDNywgMHhEMCwgMHhDMCwgMHg5OSwgMHhDMCwgMHg5QSwgLyogMHg1OC0weDVCICovCisJMHhDNywgMHhEMSwgMHhDMCwgMHg5QiwgMHhDMCwgMHg5QywgMHhDMCwgMHg5RCwgLyogMHg1Qy0weDVGICovCisJMHhDNywgMHhEMiwgMHhDMCwgMHg5RSwgMHhDMCwgMHg5RiwgMHhDMCwgMHhBMCwgLyogMHg2MC0weDYzICovCisJMHhDMSwgMHg0MSwgMHhDNywgMHhEMywgMHhDMSwgMHg0MiwgMHhDMSwgMHg0MywgLyogMHg2NC0weDY3ICovCisJMHhDNywgMHhENCwgMHhDNywgMHhENSwgMHhDMSwgMHg0NCwgMHhDNywgMHhENiwgLyogMHg2OC0weDZCICovCisJMHhDMSwgMHg0NSwgMHhDNywgMHhENywgMHhDMSwgMHg0NiwgMHhDMSwgMHg0NywgLyogMHg2Qy0weDZGICovCisJMHhDMSwgMHg0OCwgMHhDMSwgMHg0OSwgMHhDMSwgMHg0QSwgMHhDMSwgMHg0QiwgLyogMHg3MC0weDczICovCisJMHhDNywgMHhEOCwgMHhDNywgMHhEOSwgMHhDMSwgMHg0QywgMHhDMSwgMHg0RCwgLyogMHg3NC0weDc3ICovCisJMHhDNywgMHhEQSwgMHhDMSwgMHg0RSwgMHhDMSwgMHg0RiwgMHhDMSwgMHg1MCwgLyogMHg3OC0weDdCICovCisJMHhDNywgMHhEQiwgMHhDMSwgMHg1MSwgMHhDMSwgMHg1MiwgMHhDMSwgMHg1MywgLyogMHg3Qy0weDdGICovCisJCisJMHhDMSwgMHg1NCwgMHhDMSwgMHg1NSwgMHhDMSwgMHg1NiwgMHhDMSwgMHg1NywgLyogMHg4MC0weDgzICovCisJMHhDNywgMHhEQywgMHhDNywgMHhERCwgMHhDMSwgMHg1OCwgMHhDNywgMHhERSwgLyogMHg4NC0weDg3ICovCisJMHhDNywgMHhERiwgMHhDNywgMHhFMCwgMHhDMSwgMHg1OSwgMHhDMSwgMHg1QSwgLyogMHg4OC0weDhCICovCisJMHhDMSwgMHg2MSwgMHhDMSwgMHg2MiwgMHhDMSwgMHg2MywgMHhDMSwgMHg2NCwgLyogMHg4Qy0weDhGICovCisJMHhDNywgMHhFMSwgMHhDMSwgMHg2NSwgMHhDMSwgMHg2NiwgMHhDMSwgMHg2NywgLyogMHg5MC0weDkzICovCisJMHhDMSwgMHg2OCwgMHhDMSwgMHg2OSwgMHhDMSwgMHg2QSwgMHhDMSwgMHg2QiwgLyogMHg5NC0weDk3ICovCisJMHhDMSwgMHg2QywgMHhDMSwgMHg2RCwgMHhDMSwgMHg2RSwgMHhDMSwgMHg2RiwgLyogMHg5OC0weDlCICovCisJMHhDMSwgMHg3MCwgMHhDMSwgMHg3MSwgMHhDMSwgMHg3MiwgMHhDMSwgMHg3MywgLyogMHg5Qy0weDlGICovCisJMHhDMSwgMHg3NCwgMHhDMSwgMHg3NSwgMHhDMSwgMHg3NiwgMHhDMSwgMHg3NywgLyogMHhBMC0weEEzICovCisJMHhDMSwgMHg3OCwgMHhDNywgMHhFMiwgMHhDMSwgMHg3OSwgMHhDMSwgMHg3QSwgLyogMHhBNC0weEE3ICovCisJMHhDMSwgMHg4MSwgMHhDMSwgMHg4MiwgMHhDMSwgMHg4MywgMHhDMSwgMHg4NCwgLyogMHhBOC0weEFCICovCisJMHhDMSwgMHg4NSwgMHhDMSwgMHg4NiwgMHhDMSwgMHg4NywgMHhDMSwgMHg4OCwgLyogMHhBQy0weEFGICovCisJMHhDMSwgMHg4OSwgMHhDMSwgMHg4QSwgMHhDMSwgMHg4QiwgMHhDMSwgMHg4QywgLyogMHhCMC0weEIzICovCisJMHhDMSwgMHg4RCwgMHhDMSwgMHg4RSwgMHhDMSwgMHg4RiwgMHhDMSwgMHg5MCwgLyogMHhCNC0weEI3ICovCisJMHhDMSwgMHg5MSwgMHhDMSwgMHg5MiwgMHhDMSwgMHg5MywgMHhDMSwgMHg5NCwgLyogMHhCOC0weEJCICovCisJMHhDMSwgMHg5NSwgMHhDMSwgMHg5NiwgMHhDMSwgMHg5NywgMHhDMSwgMHg5OCwgLyogMHhCQy0weEJGICovCisJMHhDMSwgMHg5OSwgMHhDMSwgMHg5QSwgMHhDMSwgMHg5QiwgMHhDMSwgMHg5QywgLyogMHhDMC0weEMzICovCisJMHhDMSwgMHg5RCwgMHhDMSwgMHg5RSwgMHhDMSwgMHg5RiwgMHhDMSwgMHhBMCwgLyogMHhDNC0weEM3ICovCisJMHhDNywgMHhFMywgMHhDNywgMHhFNCwgMHhDMiwgMHg0MSwgMHhDMiwgMHg0MiwgLyogMHhDOC0weENCICovCisJMHhDNywgMHhFNSwgMHhDMiwgMHg0MywgMHhDMiwgMHg0NCwgMHhDMiwgMHg0NSwgLyogMHhDQy0weENGICovCisJMHhDNywgMHhFNiwgMHhDMiwgMHg0NiwgMHhDNywgMHhFNywgMHhDMiwgMHg0NywgLyogMHhEMC0weEQzICovCisJMHhDMiwgMHg0OCwgMHhDMiwgMHg0OSwgMHhDMiwgMHg0QSwgMHhDMiwgMHg0QiwgLyogMHhENC0weEQ3ICovCisJMHhDNywgMHhFOCwgMHhDNywgMHhFOSwgMHhDMiwgMHg0QywgMHhDNywgMHhFQSwgLyogMHhEOC0weERCICovCisJMHhDMiwgMHg0RCwgMHhDNywgMHhFQiwgMHhDMiwgMHg0RSwgMHhDMiwgMHg0RiwgLyogMHhEQy0weERGICovCisJMHhDMiwgMHg1MCwgMHhDMiwgMHg1MSwgMHhDMiwgMHg1MiwgMHhDMiwgMHg1MywgLyogMHhFMC0weEUzICovCisJMHhDNywgMHhFQywgMHhDNywgMHhFRCwgMHhDMiwgMHg1NCwgMHhDMiwgMHg1NSwgLyogMHhFNC0weEU3ICovCisJMHhDNywgMHhFRSwgMHhDMiwgMHg1NiwgMHhDMiwgMHg1NywgMHhDMiwgMHg1OCwgLyogMHhFOC0weEVCICovCisJMHhDNywgMHhFRiwgMHhDMiwgMHg1OSwgMHhDMiwgMHg1QSwgMHhDMiwgMHg2MSwgLyogMHhFQy0weEVGICovCisJMHhDMiwgMHg2MiwgMHhDMiwgMHg2MywgMHhDMiwgMHg2NCwgMHhDMiwgMHg2NSwgLyogMHhGMC0weEYzICovCisJMHhDNywgMHhGMCwgMHhDNywgMHhGMSwgMHhDMiwgMHg2NiwgMHhDNywgMHhGMiwgLyogMHhGNC0weEY3ICovCisJMHhDMiwgMHg2NywgMHhDNywgMHhGMywgMHhDMiwgMHg2OCwgMHhDMiwgMHg2OSwgLyogMHhGOC0weEZCICovCisJMHhDMiwgMHg2QSwgMHhDMiwgMHg2QiwgMHhDMiwgMHg2QywgMHhDMiwgMHg2RCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfRDZbNTEyXSA9IHsKKwkweEM3LCAweEY0LCAweEM3LCAweEY1LCAweEMyLCAweDZFLCAweEMyLCAweDZGLCAvKiAweDAwLTB4MDMgKi8KKwkweEM3LCAweEY2LCAweEMyLCAweDcwLCAweEMyLCAweDcxLCAweEMyLCAweDcyLCAvKiAweDA0LTB4MDcgKi8KKwkweEM3LCAweEY3LCAweEMyLCAweDczLCAweEMyLCAweDc0LCAweEMyLCAweDc1LCAvKiAweDA4LTB4MEIgKi8KKwkweEMyLCAweDc2LCAweEMyLCAweDc3LCAweEMyLCAweDc4LCAweEMyLCAweDc5LCAvKiAweDBDLTB4MEYgKi8KKwkweEM3LCAweEY4LCAweEM3LCAweEY5LCAweEMyLCAweDdBLCAweEM3LCAweEZBLCAvKiAweDEwLTB4MTMgKi8KKwkweEM3LCAweEZCLCAweEM3LCAweEZDLCAweEMyLCAweDgxLCAweEMyLCAweDgyLCAvKiAweDE0LTB4MTcgKi8KKwkweEMyLCAweDgzLCAweEMyLCAweDg0LCAweEMyLCAweDg1LCAweEMyLCAweDg2LCAvKiAweDE4LTB4MUIgKi8KKwkweEM3LCAweEZELCAweEMyLCAweDg3LCAweEMyLCAweDg4LCAweEMyLCAweDg5LCAvKiAweDFDLTB4MUYgKi8KKwkweEM3LCAweEZFLCAweEMyLCAweDhBLCAweEMyLCAweDhCLCAweEMyLCAweDhDLCAvKiAweDIwLTB4MjMgKi8KKwkweEM4LCAweEExLCAweEMyLCAweDhELCAweEMyLCAweDhFLCAweEMyLCAweDhGLCAvKiAweDI0LTB4MjcgKi8KKwkweEMyLCAweDkwLCAweEMyLCAweDkxLCAweEMyLCAweDkyLCAweEMyLCAweDkzLCAvKiAweDI4LTB4MkIgKi8KKwkweEMyLCAweDk0LCAweEM4LCAweEEyLCAweEMyLCAweDk1LCAweEMyLCAweDk2LCAvKiAweDJDLTB4MkYgKi8KKwkweEMyLCAweDk3LCAweEMyLCAweDk4LCAweEMyLCAweDk5LCAweEMyLCAweDlBLCAvKiAweDMwLTB4MzMgKi8KKwkweEMyLCAweDlCLCAweEMyLCAweDlDLCAweEMyLCAweDlELCAweEMyLCAweDlFLCAvKiAweDM0LTB4MzcgKi8KKwkweEM4LCAweEEzLCAweEM4LCAweEE0LCAweEMyLCAweDlGLCAweEMyLCAweEEwLCAvKiAweDM4LTB4M0IgKi8KKwkweEM4LCAweEE1LCAweEMzLCAweDQxLCAweEMzLCAweDQyLCAweEMzLCAweDQzLCAvKiAweDNDLTB4M0YgKi8KKwkweEM4LCAweEE2LCAweEMzLCAweDQ0LCAweEMzLCAweDQ1LCAweEMzLCAweDQ2LCAvKiAweDQwLTB4NDMgKi8KKwkweEMzLCAweDQ3LCAweEM4LCAweEE3LCAweEMzLCAweDQ4LCAweEMzLCAweDQ5LCAvKiAweDQ0LTB4NDcgKi8KKwkweEM4LCAweEE4LCAweEM4LCAweEE5LCAweEMzLCAweDRBLCAweEM4LCAweEFBLCAvKiAweDQ4LTB4NEIgKi8KKwkweEMzLCAweDRCLCAweEM4LCAweEFCLCAweEMzLCAweDRDLCAweEMzLCAweDRELCAvKiAweDRDLTB4NEYgKi8KKwkweEMzLCAweDRFLCAweEM4LCAweEFDLCAweEMzLCAweDRGLCAweEMzLCAweDUwLCAvKiAweDUwLTB4NTMgKi8KKwkweEM4LCAweEFELCAweEM4LCAweEFFLCAweEMzLCAweDUxLCAweEMzLCAweDUyLCAvKiAweDU0LTB4NTcgKi8KKwkweEM4LCAweEFGLCAweEMzLCAweDUzLCAweEMzLCAweDU0LCAweEMzLCAweDU1LCAvKiAweDU4LTB4NUIgKi8KKwkweEM4LCAweEIwLCAweEMzLCAweDU2LCAweEMzLCAweDU3LCAweEMzLCAweDU4LCAvKiAweDVDLTB4NUYgKi8KKwkweEMzLCAweDU5LCAweEMzLCAweDVBLCAweEMzLCAweDYxLCAweEMzLCAweDYyLCAvKiAweDYwLTB4NjMgKi8KKwkweEMzLCAweDYzLCAweEMzLCAweDY0LCAweEMzLCAweDY1LCAweEM4LCAweEIxLCAvKiAweDY0LTB4NjcgKi8KKwkweEMzLCAweDY2LCAweEM4LCAweEIyLCAweEMzLCAweDY3LCAweEMzLCAweDY4LCAvKiAweDY4LTB4NkIgKi8KKwkweEMzLCAweDY5LCAweEMzLCAweDZBLCAweEMzLCAweDZCLCAweEMzLCAweDZDLCAvKiAweDZDLTB4NkYgKi8KKwkweEM4LCAweEIzLCAweEM4LCAweEI0LCAweEMzLCAweDZELCAweEMzLCAweDZFLCAvKiAweDcwLTB4NzMgKi8KKwkweEM4LCAweEI1LCAweEMzLCAweDZGLCAweEMzLCAweDcwLCAweEMzLCAweDcxLCAvKiAweDc0LTB4NzcgKi8KKwkweEMzLCAweDcyLCAweEMzLCAweDczLCAweEMzLCAweDc0LCAweEMzLCAweDc1LCAvKiAweDc4LTB4N0IgKi8KKwkweEMzLCAweDc2LCAweEMzLCAweDc3LCAweEMzLCAweDc4LCAweEMzLCAweDc5LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEMzLCAweDdBLCAweEMzLCAweDgxLCAweEMzLCAweDgyLCAweEM4LCAweEI2LCAvKiAweDgwLTB4ODMgKi8KKwkweEMzLCAweDgzLCAweEM4LCAweEI3LCAweEMzLCAweDg0LCAweEMzLCAweDg1LCAvKiAweDg0LTB4ODcgKi8KKwkweEMzLCAweDg2LCAweEMzLCAweDg3LCAweEMzLCAweDg4LCAweEMzLCAweDg5LCAvKiAweDg4LTB4OEIgKi8KKwkweEM4LCAweEI4LCAweEM4LCAweEI5LCAweEMzLCAweDhBLCAweEMzLCAweDhCLCAvKiAweDhDLTB4OEYgKi8KKwkweEM4LCAweEJBLCAweEMzLCAweDhDLCAweEMzLCAweDhELCAweEMzLCAweDhFLCAvKiAweDkwLTB4OTMgKi8KKwkweEM4LCAweEJCLCAweEMzLCAweDhGLCAweEMzLCAweDkwLCAweEMzLCAweDkxLCAvKiAweDk0LTB4OTcgKi8KKwkweEMzLCAweDkyLCAweEMzLCAweDkzLCAweEMzLCAweDk0LCAweEMzLCAweDk1LCAvKiAweDk4LTB4OUIgKi8KKwkweEMzLCAweDk2LCAweEM4LCAweEJDLCAweEMzLCAweDk3LCAweEM4LCAweEJELCAvKiAweDlDLTB4OUYgKi8KKwkweEMzLCAweDk4LCAweEM4LCAweEJFLCAweEMzLCAweDk5LCAweEMzLCAweDlBLCAvKiAweEEwLTB4QTMgKi8KKwkweEMzLCAweDlCLCAweEMzLCAweDlDLCAweEMzLCAweDlELCAweEMzLCAweDlFLCAvKiAweEE0LTB4QTcgKi8KKwkweEM4LCAweEJGLCAweEMzLCAweDlGLCAweEMzLCAweEEwLCAweEM0LCAweDQxLCAvKiAweEE4LTB4QUIgKi8KKwkweEM4LCAweEMwLCAweEM0LCAweDQyLCAweEM0LCAweDQzLCAweEM0LCAweDQ0LCAvKiAweEFDLTB4QUYgKi8KKwkweEM4LCAweEMxLCAweEM0LCAweDQ1LCAweEM0LCAweDQ2LCAweEM0LCAweDQ3LCAvKiAweEIwLTB4QjMgKi8KKwkweEM0LCAweDQ4LCAweEM0LCAweDQ5LCAweEM0LCAweDRBLCAweEM0LCAweDRCLCAvKiAweEI0LTB4QjcgKi8KKwkweEM0LCAweDRDLCAweEM4LCAweEMyLCAweEM0LCAweDRELCAweEM4LCAweEMzLCAvKiAweEI4LTB4QkIgKi8KKwkweEM0LCAweDRFLCAweEM0LCAweDRGLCAweEM0LCAweDUwLCAweEM0LCAweDUxLCAvKiAweEJDLTB4QkYgKi8KKwkweEM0LCAweDUyLCAweEM0LCAweDUzLCAweEM0LCAweDU0LCAweEM0LCAweDU1LCAvKiAweEMwLTB4QzMgKi8KKwkweEM4LCAweEM0LCAweEM4LCAweEM1LCAweEM0LCAweDU2LCAweEM0LCAweDU3LCAvKiAweEM0LTB4QzcgKi8KKwkweEM4LCAweEM2LCAweEM0LCAweDU4LCAweEM0LCAweDU5LCAweEM0LCAweDVBLCAvKiAweEM4LTB4Q0IgKi8KKwkweEM4LCAweEM3LCAweEM0LCAweDYxLCAweEM0LCAweDYyLCAweEM0LCAweDYzLCAvKiAweENDLTB4Q0YgKi8KKwkweEM0LCAweDY0LCAweEM4LCAweEM4LCAweEM0LCAweDY1LCAweEM0LCAweDY2LCAvKiAweEQwLTB4RDMgKi8KKwkweEM4LCAweEM5LCAweEM0LCAweDY3LCAweEM0LCAweDY4LCAweEM4LCAweENBLCAvKiAweEQ0LTB4RDcgKi8KKwkweEM0LCAweDY5LCAweEM4LCAweENCLCAweEM0LCAweDZBLCAweEM0LCAweDZCLCAvKiAweEQ4LTB4REIgKi8KKwkweEM0LCAweDZDLCAweEM0LCAweDZELCAweEM0LCAweDZFLCAweEM0LCAweDZGLCAvKiAweERDLTB4REYgKi8KKwkweEM4LCAweENDLCAweEM0LCAweDcwLCAweEM0LCAweDcxLCAweEM0LCAweDcyLCAvKiAweEUwLTB4RTMgKi8KKwkweEM4LCAweENELCAweEM0LCAweDczLCAweEM0LCAweDc0LCAweEM0LCAweDc1LCAvKiAweEU0LTB4RTcgKi8KKwkweEM4LCAweENFLCAweEM0LCAweDc2LCAweEM0LCAweDc3LCAweEM0LCAweDc4LCAvKiAweEU4LTB4RUIgKi8KKwkweEM0LCAweDc5LCAweEM0LCAweDdBLCAweEM0LCAweDgxLCAweEM0LCAweDgyLCAvKiAweEVDLTB4RUYgKi8KKwkweEM4LCAweENGLCAweEM0LCAweDgzLCAweEM0LCAweDg0LCAweEM0LCAweDg1LCAvKiAweEYwLTB4RjMgKi8KKwkweEM0LCAweDg2LCAweEM4LCAweEQwLCAweEM0LCAweDg3LCAweEM0LCAweDg4LCAvKiAweEY0LTB4RjcgKi8KKwkweEM0LCAweDg5LCAweEM0LCAweDhBLCAweEM0LCAweDhCLCAweEM0LCAweDhDLCAvKiAweEY4LTB4RkIgKi8KKwkweEM4LCAweEQxLCAweEM4LCAweEQyLCAweEM0LCAweDhELCAweEM0LCAweDhFLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19EN1s1MTJdID0geworCTB4QzgsIDB4RDMsIDB4QzQsIDB4OEYsIDB4QzQsIDB4OTAsIDB4QzQsIDB4OTEsIC8qIDB4MDAtMHgwMyAqLworCTB4QzgsIDB4RDQsIDB4QzQsIDB4OTIsIDB4QzQsIDB4OTMsIDB4QzQsIDB4OTQsIC8qIDB4MDQtMHgwNyAqLworCTB4QzQsIDB4OTUsIDB4QzQsIDB4OTYsIDB4QzQsIDB4OTcsIDB4QzQsIDB4OTgsIC8qIDB4MDgtMHgwQiAqLworCTB4QzQsIDB4OTksIDB4QzQsIDB4OUEsIDB4QzQsIDB4OUIsIDB4QzQsIDB4OUMsIC8qIDB4MEMtMHgwRiAqLworCTB4QzQsIDB4OUQsIDB4QzgsIDB4RDUsIDB4QzQsIDB4OUUsIDB4QzQsIDB4OUYsIC8qIDB4MTAtMHgxMyAqLworCTB4QzQsIDB4QTAsIDB4QzUsIDB4NDEsIDB4QzUsIDB4NDIsIDB4QzUsIDB4NDMsIC8qIDB4MTQtMHgxNyAqLworCTB4QzgsIDB4RDYsIDB4QzgsIDB4RDcsIDB4QzUsIDB4NDQsIDB4QzUsIDB4NDUsIC8qIDB4MTgtMHgxQiAqLworCTB4QzgsIDB4RDgsIDB4QzUsIDB4NDYsIDB4QzUsIDB4NDcsIDB4QzUsIDB4NDgsIC8qIDB4MUMtMHgxRiAqLworCTB4QzgsIDB4RDksIDB4QzUsIDB4NDksIDB4QzUsIDB4NEEsIDB4QzUsIDB4NEIsIC8qIDB4MjAtMHgyMyAqLworCTB4QzUsIDB4NEMsIDB4QzUsIDB4NEQsIDB4QzUsIDB4NEUsIDB4QzUsIDB4NEYsIC8qIDB4MjQtMHgyNyAqLworCTB4QzgsIDB4REEsIDB4QzgsIDB4REIsIDB4QzUsIDB4NTAsIDB4QzgsIDB4REMsIC8qIDB4MjgtMHgyQiAqLworCTB4QzUsIDB4NTEsIDB4QzgsIDB4REQsIDB4QzUsIDB4NTIsIDB4QzUsIDB4NTMsIC8qIDB4MkMtMHgyRiAqLworCTB4QzUsIDB4NTQsIDB4QzUsIDB4NTUsIDB4QzUsIDB4NTYsIDB4QzUsIDB4NTcsIC8qIDB4MzAtMHgzMyAqLworCTB4QzgsIDB4REUsIDB4QzgsIDB4REYsIDB4QzUsIDB4NTgsIDB4QzUsIDB4NTksIC8qIDB4MzQtMHgzNyAqLworCTB4QzgsIDB4RTAsIDB4QzUsIDB4NUEsIDB4QzUsIDB4NjEsIDB4QzUsIDB4NjIsIC8qIDB4MzgtMHgzQiAqLworCTB4QzgsIDB4RTEsIDB4QzUsIDB4NjMsIDB4QzUsIDB4NjQsIDB4QzUsIDB4NjUsIC8qIDB4M0MtMHgzRiAqLworCTB4QzUsIDB4NjYsIDB4QzUsIDB4NjcsIDB4QzUsIDB4NjgsIDB4QzUsIDB4NjksIC8qIDB4NDAtMHg0MyAqLworCTB4QzgsIDB4RTIsIDB4QzUsIDB4NkEsIDB4QzUsIDB4NkIsIDB4QzgsIDB4RTMsIC8qIDB4NDQtMHg0NyAqLworCTB4QzUsIDB4NkMsIDB4QzgsIDB4RTQsIDB4QzUsIDB4NkQsIDB4QzUsIDB4NkUsIC8qIDB4NDgtMHg0QiAqLworCTB4QzUsIDB4NkYsIDB4QzUsIDB4NzAsIDB4QzUsIDB4NzEsIDB4QzUsIDB4NzIsIC8qIDB4NEMtMHg0RiAqLworCTB4QzgsIDB4RTUsIDB4QzgsIDB4RTYsIDB4QzUsIDB4NzMsIDB4QzUsIDB4NzQsIC8qIDB4NTAtMHg1MyAqLworCTB4QzgsIDB4RTcsIDB4QzUsIDB4NzUsIDB4QzgsIDB4RTgsIDB4QzgsIDB4RTksIC8qIDB4NTQtMHg1NyAqLworCTB4QzgsIDB4RUEsIDB4QzgsIDB4RUIsIDB4QzUsIDB4NzYsIDB4QzUsIDB4NzcsIC8qIDB4NTgtMHg1QiAqLworCTB4QzUsIDB4NzgsIDB4QzUsIDB4NzksIDB4QzUsIDB4N0EsIDB4QzUsIDB4ODEsIC8qIDB4NUMtMHg1RiAqLworCTB4QzgsIDB4RUMsIDB4QzgsIDB4RUQsIDB4QzUsIDB4ODIsIDB4QzgsIDB4RUUsIC8qIDB4NjAtMHg2MyAqLworCTB4QzUsIDB4ODMsIDB4QzgsIDB4RUYsIDB4QzUsIDB4ODQsIDB4QzUsIDB4ODUsIC8qIDB4NjQtMHg2NyAqLworCTB4QzUsIDB4ODYsIDB4QzgsIDB4RjAsIDB4QzUsIDB4ODcsIDB4QzUsIDB4ODgsIC8qIDB4NjgtMHg2QiAqLworCTB4QzgsIDB4RjEsIDB4QzUsIDB4ODksIDB4QzUsIDB4OEEsIDB4QzUsIDB4OEIsIC8qIDB4NkMtMHg2RiAqLworCTB4QzgsIDB4RjIsIDB4QzUsIDB4OEMsIDB4QzUsIDB4OEQsIDB4QzUsIDB4OEUsIC8qIDB4NzAtMHg3MyAqLworCTB4QzgsIDB4RjMsIDB4QzUsIDB4OEYsIDB4QzUsIDB4OTAsIDB4QzUsIDB4OTEsIC8qIDB4NzQtMHg3NyAqLworCTB4QzUsIDB4OTIsIDB4QzUsIDB4OTMsIDB4QzUsIDB4OTQsIDB4QzUsIDB4OTUsIC8qIDB4NzgtMHg3QiAqLworCTB4QzgsIDB4RjQsIDB4QzgsIDB4RjUsIDB4QzUsIDB4OTYsIDB4QzUsIDB4OTcsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QzUsIDB4OTgsIDB4QzgsIDB4RjYsIDB4QzUsIDB4OTksIDB4QzUsIDB4OUEsIC8qIDB4ODAtMHg4MyAqLworCTB4QzUsIDB4OUIsIDB4QzUsIDB4OUMsIDB4QzUsIDB4OUQsIDB4QzUsIDB4OUUsIC8qIDB4ODQtMHg4NyAqLworCTB4QzgsIDB4RjcsIDB4QzgsIDB4RjgsIDB4QzUsIDB4OUYsIDB4QzUsIDB4QTAsIC8qIDB4ODgtMHg4QiAqLworCTB4QzgsIDB4RjksIDB4QzYsIDB4NDEsIDB4QzYsIDB4NDIsIDB4QzYsIDB4NDMsIC8qIDB4OEMtMHg4RiAqLworCTB4QzgsIDB4RkEsIDB4QzYsIDB4NDQsIDB4QzYsIDB4NDUsIDB4QzYsIDB4NDYsIC8qIDB4OTAtMHg5MyAqLworCTB4QzYsIDB4NDcsIDB4QzYsIDB4NDgsIDB4QzYsIDB4NDksIDB4QzYsIDB4NEEsIC8qIDB4OTQtMHg5NyAqLworCTB4QzgsIDB4RkIsIDB4QzgsIDB4RkMsIDB4QzYsIDB4NEIsIDB4QzgsIDB4RkQsIC8qIDB4OTgtMHg5QiAqLworCTB4QzYsIDB4NEMsIDB4QzgsIDB4RkUsIDB4QzYsIDB4NEQsIDB4QzYsIDB4NEUsIC8qIDB4OUMtMHg5RiAqLworCTB4QzYsIDB4NEYsIDB4QzYsIDB4NTAsIDB4QzYsIDB4NTEsIDB4QzYsIDB4NTIsIC8qIDB4QTAtMHhBMyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0RDWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfRjlbNTEyXSA9IHsKKwkweENCLCAweEQwLCAweENCLCAweEQ2LCAweENCLCAweEU3LCAweENELCAweENGLCAvKiAweDAwLTB4MDMgKi8KKwkweENELCAweEU4LCAweENFLCAweEFELCAweENGLCAweEZCLCAweEQwLCAweEEyLCAvKiAweDA0LTB4MDcgKi8KKwkweEQwLCAweEI4LCAweEQwLCAweEQwLCAweEQwLCAweERELCAweEQxLCAweEQ0LCAvKiAweDA4LTB4MEIgKi8KKwkweEQxLCAweEQ1LCAweEQxLCAweEQ4LCAweEQxLCAweERCLCAweEQxLCAweERDLCAvKiAweDBDLTB4MEYgKi8KKwkweEQxLCAweERELCAweEQxLCAweERFLCAweEQxLCAweERGLCAweEQxLCAweEUwLCAvKiAweDEwLTB4MTMgKi8KKwkweEQxLCAweEUyLCAweEQxLCAweEUzLCAweEQxLCAweEU0LCAweEQxLCAweEU1LCAvKiAweDE0LTB4MTcgKi8KKwkweEQxLCAweEU2LCAweEQxLCAweEU4LCAweEQxLCAweEU5LCAweEQxLCAweEVBLCAvKiAweDE4LTB4MUIgKi8KKwkweEQxLCAweEVCLCAweEQxLCAweEVELCAweEQxLCAweEVGLCAweEQxLCAweEYwLCAvKiAweDFDLTB4MUYgKi8KKwkweEQxLCAweEYyLCAweEQxLCAweEY2LCAweEQxLCAweEZBLCAweEQxLCAweEZDLCAvKiAweDIwLTB4MjMgKi8KKwkweEQxLCAweEZELCAweEQxLCAweEZFLCAweEQyLCAweEEyLCAweEQyLCAweEEzLCAvKiAweDI0LTB4MjcgKi8KKwkweEQyLCAweEE3LCAweEQyLCAweEE4LCAweEQyLCAweEE5LCAweEQyLCAweEFBLCAvKiAweDI4LTB4MkIgKi8KKwkweEQyLCAweEFCLCAweEQyLCAweEFELCAweEQyLCAweEIyLCAweEQyLCAweEJFLCAvKiAweDJDLTB4MkYgKi8KKwkweEQyLCAweEMyLCAweEQyLCAweEMzLCAweEQyLCAweEM0LCAweEQyLCAweEM2LCAvKiAweDMwLTB4MzMgKi8KKwkweEQyLCAweEM3LCAweEQyLCAweEM4LCAweEQyLCAweEM5LCAweEQyLCAweENBLCAvKiAweDM0LTB4MzcgKi8KKwkweEQyLCAweENCLCAweEQyLCAweENELCAweEQyLCAweENFLCAweEQyLCAweENGLCAvKiAweDM4LTB4M0IgKi8KKwkweEQyLCAweEQwLCAweEQyLCAweEQxLCAweEQyLCAweEQyLCAweEQyLCAweEQzLCAvKiAweDNDLTB4M0YgKi8KKwkweEQyLCAweEQ0LCAweEQyLCAweEQ1LCAweEQyLCAweEQ2LCAweEQyLCAweEQ3LCAvKiAweDQwLTB4NDMgKi8KKwkweEQyLCAweEQ5LCAweEQyLCAweERBLCAweEQyLCAweERFLCAweEQyLCAweERGLCAvKiAweDQ0LTB4NDcgKi8KKwkweEQyLCAweEUxLCAweEQyLCAweEUyLCAweEQyLCAweEU0LCAweEQyLCAweEU1LCAvKiAweDQ4LTB4NEIgKi8KKwkweEQyLCAweEU2LCAweEQyLCAweEU3LCAweEQyLCAweEU4LCAweEQyLCAweEU5LCAvKiAweDRDLTB4NEYgKi8KKwkweEQyLCAweEVBLCAweEQyLCAweEVCLCAweEQyLCAweEYwLCAweEQyLCAweEYxLCAvKiAweDUwLTB4NTMgKi8KKwkweEQyLCAweEYyLCAweEQyLCAweEYzLCAweEQyLCAweEY0LCAweEQyLCAweEY1LCAvKiAweDU0LTB4NTcgKi8KKwkweEQyLCAweEY3LCAweEQyLCAweEY4LCAweEQ0LCAweEU2LCAweEQ0LCAweEZDLCAvKiAweDU4LTB4NUIgKi8KKwkweEQ1LCAweEE1LCAweEQ1LCAweEFCLCAweEQ1LCAweEFFLCAweEQ2LCAweEI4LCAvKiAweDVDLTB4NUYgKi8KKwkweEQ2LCAweENELCAweEQ3LCAweENCLCAweEQ3LCAweEU0LCAweERCLCAweEM1LCAvKiAweDYwLTB4NjMgKi8KKwkweERCLCAweEU0LCAweERDLCAweEE1LCAweERELCAweEE1LCAweERELCAweEQ1LCAvKiAweDY0LTB4NjcgKi8KKwkweERELCAweEY0LCAweERFLCAweEZDLCAweERFLCAweEZFLCAweERGLCAweEIzLCAvKiAweDY4LTB4NkIgKi8KKwkweERGLCAweEUxLCAweERGLCAweEU4LCAweEUwLCAweEYxLCAweEUxLCAweEFELCAvKiAweDZDLTB4NkYgKi8KKwkweEUxLCAweEVELCAweEUzLCAweEY1LCAweEU0LCAweEExLCAweEU0LCAweEE5LCAvKiAweDcwLTB4NzMgKi8KKwkweEU1LCAweEFFLCAweEU1LCAweEIxLCAweEU1LCAweEIyLCAweEU1LCAweEI5LCAvKiAweDc0LTB4NzcgKi8KKwkweEU1LCAweEJCLCAweEU1LCAweEJDLCAweEU1LCAweEM0LCAweEU1LCAweENFLCAvKiAweDc4LTB4N0IgKi8KKwkweEU1LCAweEQwLCAweEU1LCAweEQyLCAweEU1LCAweEQ2LCAweEU1LCAweEZBLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEU1LCAweEZCLCAweEU1LCAweEZDLCAweEU1LCAweEZFLCAweEU2LCAweEExLCAvKiAweDgwLTB4ODMgKi8KKwkweEU2LCAweEE0LCAweEU2LCAweEE3LCAweEU2LCAweEFELCAweEU2LCAweEFGLCAvKiAweDg0LTB4ODcgKi8KKwkweEU2LCAweEIwLCAweEU2LCAweEIxLCAweEU2LCAweEIzLCAweEU2LCAweEI3LCAvKiAweDg4LTB4OEIgKi8KKwkweEU2LCAweEI4LCAweEU2LCAweEJDLCAweEU2LCAweEM0LCAweEU2LCAweEM2LCAvKiAweDhDLTB4OEYgKi8KKwkweEU2LCAweEM3LCAweEU2LCAweENBLCAweEU2LCAweEQyLCAweEU2LCAweEQ2LCAvKiAweDkwLTB4OTMgKi8KKwkweEU2LCAweEQ5LCAweEU2LCAweERDLCAweEU2LCAweERGLCAweEU2LCAweEUxLCAvKiAweDk0LTB4OTcgKi8KKwkweEU2LCAweEU0LCAweEU2LCAweEU1LCAweEU2LCAweEU2LCAweEU2LCAweEU4LCAvKiAweDk4LTB4OUIgKi8KKwkweEU2LCAweEVBLCAweEU2LCAweEVCLCAweEU2LCAweEVDLCAweEU2LCAweEVGLCAvKiAweDlDLTB4OUYgKi8KKwkweEU2LCAweEYxLCAweEU2LCAweEYyLCAweEU2LCAweEY1LCAweEU2LCAweEY2LCAvKiAweEEwLTB4QTMgKi8KKwkweEU2LCAweEY3LCAweEU2LCAweEY5LCAweEU3LCAweEExLCAweEU3LCAweEE2LCAvKiAweEE0LTB4QTcgKi8KKwkweEU3LCAweEE5LCAweEU3LCAweEFBLCAweEU3LCAweEFDLCAweEU3LCAweEFELCAvKiAweEE4LTB4QUIgKi8KKwkweEU3LCAweEIwLCAweEU3LCAweEJGLCAweEU3LCAweEMxLCAweEU3LCAweEM2LCAvKiAweEFDLTB4QUYgKi8KKwkweEU3LCAweEM3LCAweEU3LCAweENCLCAweEU3LCAweENELCAweEU3LCAweENGLCAvKiAweEIwLTB4QjMgKi8KKwkweEU3LCAweEQwLCAweEU3LCAweEQzLCAweEU3LCAweERGLCAweEU3LCAweEU0LCAvKiAweEI0LTB4QjcgKi8KKwkweEU3LCAweEU2LCAweEU3LCAweEY3LCAweEU4LCAweEU3LCAweEU4LCAweEU4LCAvKiAweEI4LTB4QkIgKi8KKwkweEU4LCAweEYwLCAweEU4LCAweEYxLCAweEU4LCAweEY3LCAweEU4LCAweEY5LCAvKiAweEJDLTB4QkYgKi8KKwkweEU4LCAweEZCLCAweEU4LCAweEZFLCAweEU5LCAweEE3LCAweEU5LCAweEFDLCAvKiAweEMwLTB4QzMgKi8KKwkweEU5LCAweENDLCAweEU5LCAweEY3LCAweEVBLCAweEMxLCAweEVBLCAweEU1LCAvKiAweEM0LTB4QzcgKi8KKwkweEVBLCAweEY0LCAweEVBLCAweEY3LCAweEVBLCAweEZDLCAweEVBLCAweEZFLCAvKiAweEM4LTB4Q0IgKi8KKwkweEVCLCAweEE0LCAweEVCLCAweEE3LCAweEVCLCAweEE5LCAweEVCLCAweEFBLCAvKiAweENDLTB4Q0YgKi8KKwkweEVCLCAweEJBLCAweEVCLCAweEJCLCAweEVCLCAweEJELCAweEVCLCAweEMxLCAvKiAweEQwLTB4RDMgKi8KKwkweEVCLCAweEMyLCAweEVCLCAweEM2LCAweEVCLCAweEM3LCAweEVCLCAweENDLCAvKiAweEQ0LTB4RDcgKi8KKwkweEVCLCAweENGLCAweEVCLCAweEQwLCAweEVCLCAweEQxLCAweEVCLCAweEQyLCAvKiAweEQ4LTB4REIgKi8KKwkweEVCLCAweEQ4LCAweEVDLCAweEE2LCAweEVDLCAweEE3LCAweEVDLCAweEFBLCAvKiAweERDLTB4REYgKi8KKwkweEVDLCAweEFGLCAweEVDLCAweEIwLCAweEVDLCAweEIxLCAweEVDLCAweEIyLCAvKiAweEUwLTB4RTMgKi8KKwkweEVDLCAweEI1LCAweEVDLCAweEI4LCAweEVDLCAweEJBLCAweEVDLCAweEMwLCAvKiAweEU0LTB4RTcgKi8KKwkweEVDLCAweEMxLCAweEVDLCAweEM1LCAweEVDLCAweEM2LCAweEVDLCAweEM5LCAvKiAweEU4LTB4RUIgKi8KKwkweEVDLCAweENBLCAweEVDLCAweEQ1LCAweEVDLCAweERELCAweEVDLCAweERFLCAvKiAweEVDLTB4RUYgKi8KKwkweEVDLCAweEUxLCAweEVDLCAweEU0LCAweEVDLCAweEU3LCAweEVDLCAweEU4LCAvKiAweEYwLTB4RjMgKi8KKwkweEVDLCAweEY3LCAweEVDLCAweEY4LCAweEVDLCAweEZBLCAweEVELCAweEExLCAvKiAweEY0LTB4RjcgKi8KKwkweEVELCAweEEyLCAweEVELCAweEEzLCAweEVELCAweEVFLCAweEVFLCAweERCLCAvKiAweEY4LTB4RkIgKi8KKwkweEYyLCAweEJELCAweEYyLCAweEZBLCAweEYzLCAweEIxLCAweEY0LCAweEE3LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19GQVs1MTJdID0geworCTB4RjQsIDB4RUUsIDB4RjYsIDB4RjQsIDB4RjYsIDB4RjYsIDB4RjcsIDB4QjgsIC8qIDB4MDAtMHgwMyAqLworCTB4RjcsIDB4QzgsIDB4RjcsIDB4RDMsIDB4RjgsIDB4REIsIDB4RjgsIDB4RjAsIC8qIDB4MDQtMHgwNyAqLworCTB4RkEsIDB4QTEsIDB4RkEsIDB4QTIsIDB4RkEsIDB4RTYsIDB4RkMsIDB4QTksIC8qIDB4MDgtMHgwQiAqLworCTB4RTgsIDB4QjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4RjUsIDB4QzAsIDB4MDAsIDB4MDAsIDB4RjQsIDB4RTcsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4RkQsIDB4RUIsIDB4MDAsIDB4MDAsIDB4RUMsIDB4Q0MsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4RUEsIDB4REYsIDB4RDQsIDB4REMsIDB4RDgsIC8qIDB4MTgtMHgxQiAqLworCTB4RUYsIDB4RkUsIDB4RUYsIDB4RjEsIDB4RTksIDB4RTIsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjAsIDB4QjMsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4RUMsIDB4RUYsIDB4RDQsIDB4QjQsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REEsIDB4RjksIDB4REUsIDB4RjgsIC8qIDB4MjgtMHgyQiAqLworCTB4Q0UsIDB4QkQsIDB4RjksIDB4Q0QsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0ZGWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHhBMywgMHhBMSwgMHhBMywgMHhBMiwgMHhBMywgMHhBMywgLyogMHgwMC0weDAzICovCisJMHhBMywgMHhBNCwgMHhBMywgMHhBNSwgMHhBMywgMHhBNiwgMHhBMywgMHhBNywgLyogMHgwNC0weDA3ICovCisJMHhBMywgMHhBOCwgMHhBMywgMHhBOSwgMHhBMywgMHhBQSwgMHhBMywgMHhBQiwgLyogMHgwOC0weDBCICovCisJMHhBMywgMHhBQywgMHhBMywgMHhBRCwgMHhBMywgMHhBRSwgMHhBMywgMHhBRiwgLyogMHgwQy0weDBGICovCisJMHhBMywgMHhCMCwgMHhBMywgMHhCMSwgMHhBMywgMHhCMiwgMHhBMywgMHhCMywgLyogMHgxMC0weDEzICovCisJMHhBMywgMHhCNCwgMHhBMywgMHhCNSwgMHhBMywgMHhCNiwgMHhBMywgMHhCNywgLyogMHgxNC0weDE3ICovCisJMHhBMywgMHhCOCwgMHhBMywgMHhCOSwgMHhBMywgMHhCQSwgMHhBMywgMHhCQiwgLyogMHgxOC0weDFCICovCisJMHhBMywgMHhCQywgMHhBMywgMHhCRCwgMHhBMywgMHhCRSwgMHhBMywgMHhCRiwgLyogMHgxQy0weDFGICovCisJMHhBMywgMHhDMCwgMHhBMywgMHhDMSwgMHhBMywgMHhDMiwgMHhBMywgMHhDMywgLyogMHgyMC0weDIzICovCisJMHhBMywgMHhDNCwgMHhBMywgMHhDNSwgMHhBMywgMHhDNiwgMHhBMywgMHhDNywgLyogMHgyNC0weDI3ICovCisJMHhBMywgMHhDOCwgMHhBMywgMHhDOSwgMHhBMywgMHhDQSwgMHhBMywgMHhDQiwgLyogMHgyOC0weDJCICovCisJMHhBMywgMHhDQywgMHhBMywgMHhDRCwgMHhBMywgMHhDRSwgMHhBMywgMHhDRiwgLyogMHgyQy0weDJGICovCisJMHhBMywgMHhEMCwgMHhBMywgMHhEMSwgMHhBMywgMHhEMiwgMHhBMywgMHhEMywgLyogMHgzMC0weDMzICovCisJMHhBMywgMHhENCwgMHhBMywgMHhENSwgMHhBMywgMHhENiwgMHhBMywgMHhENywgLyogMHgzNC0weDM3ICovCisJMHhBMywgMHhEOCwgMHhBMywgMHhEOSwgMHhBMywgMHhEQSwgMHhBMywgMHhEQiwgLyogMHgzOC0weDNCICovCisJMHhBMSwgMHhBQywgMHhBMywgMHhERCwgMHhBMywgMHhERSwgMHhBMywgMHhERiwgLyogMHgzQy0weDNGICovCisJMHhBMywgMHhFMCwgMHhBMywgMHhFMSwgMHhBMywgMHhFMiwgMHhBMywgMHhFMywgLyogMHg0MC0weDQzICovCisJMHhBMywgMHhFNCwgMHhBMywgMHhFNSwgMHhBMywgMHhFNiwgMHhBMywgMHhFNywgLyogMHg0NC0weDQ3ICovCisJMHhBMywgMHhFOCwgMHhBMywgMHhFOSwgMHhBMywgMHhFQSwgMHhBMywgMHhFQiwgLyogMHg0OC0weDRCICovCisJMHhBMywgMHhFQywgMHhBMywgMHhFRCwgMHhBMywgMHhFRSwgMHhBMywgMHhFRiwgLyogMHg0Qy0weDRGICovCisJMHhBMywgMHhGMCwgMHhBMywgMHhGMSwgMHhBMywgMHhGMiwgMHhBMywgMHhGMywgLyogMHg1MC0weDUzICovCisJMHhBMywgMHhGNCwgMHhBMywgMHhGNSwgMHhBMywgMHhGNiwgMHhBMywgMHhGNywgLyogMHg1NC0weDU3ICovCisJMHhBMywgMHhGOCwgMHhBMywgMHhGOSwgMHhBMywgMHhGQSwgMHhBMywgMHhGQiwgLyogMHg1OC0weDVCICovCisJMHhBMywgMHhGQywgMHhBMywgMHhGRCwgMHhBMiwgMHhBNiwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHhBNCwgMHhENCwgMHhBNCwgMHhBMSwgMHhBNCwgMHhBMiwgMHhBNCwgMHhBMywgLyogMHhBMC0weEEzICovCisJMHhBNCwgMHhBNCwgMHhBNCwgMHhBNSwgMHhBNCwgMHhBNiwgMHhBNCwgMHhBNywgLyogMHhBNC0weEE3ICovCisJMHhBNCwgMHhBOCwgMHhBNCwgMHhBOSwgMHhBNCwgMHhBQSwgMHhBNCwgMHhBQiwgLyogMHhBOC0weEFCICovCisJMHhBNCwgMHhBQywgMHhBNCwgMHhBRCwgMHhBNCwgMHhBRSwgMHhBNCwgMHhBRiwgLyogMHhBQy0weEFGICovCisJMHhBNCwgMHhCMCwgMHhBNCwgMHhCMSwgMHhBNCwgMHhCMiwgMHhBNCwgMHhCMywgLyogMHhCMC0weEIzICovCisJMHhBNCwgMHhCNCwgMHhBNCwgMHhCNSwgMHhBNCwgMHhCNiwgMHhBNCwgMHhCNywgLyogMHhCNC0weEI3ICovCisJMHhBNCwgMHhCOCwgMHhBNCwgMHhCOSwgMHhBNCwgMHhCQSwgMHhBNCwgMHhCQiwgLyogMHhCOC0weEJCICovCisJMHhBNCwgMHhCQywgMHhBNCwgMHhCRCwgMHhBNCwgMHhCRSwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNCwgMHhCRiwgMHhBNCwgMHhDMCwgLyogMHhDMC0weEMzICovCisJMHhBNCwgMHhDMSwgMHhBNCwgMHhDMiwgMHhBNCwgMHhDMywgMHhBNCwgMHhDNCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNCwgMHhDNSwgMHhBNCwgMHhDNiwgLyogMHhDOC0weENCICovCisJMHhBNCwgMHhDNywgMHhBNCwgMHhDOCwgMHhBNCwgMHhDOSwgMHhBNCwgMHhDQSwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNCwgMHhDQiwgMHhBNCwgMHhDQywgLyogMHhEMC0weEQzICovCisJMHhBNCwgMHhDRCwgMHhBNCwgMHhDRSwgMHhBNCwgMHhDRiwgMHhBNCwgMHhEMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNCwgMHhEMSwgMHhBNCwgMHhEMiwgLyogMHhEOC0weERCICovCisJMHhBNCwgMHhEMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHhBMSwgMHhDQiwgMHhBMSwgMHhDQywgMHhBMSwgMHhGRSwgMHhBMywgMHhGRSwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHhBMSwgMHhDRCwgMHhBMywgMHhEQywgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciAqcGFnZV91bmkyY2hhcnNldFsyNTZdID0geworCU5VTEwsICAgdTJjXzAxLCB1MmNfMDIsIHUyY18wMywgdTJjXzA0LCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICB1MmNfMTEsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwl1MmNfMjAsIHUyY18yMSwgdTJjXzIyLCB1MmNfMjMsIHUyY18yNCwgdTJjXzI1LCB1MmNfMjYsIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCXUyY18zMCwgdTJjXzMxLCB1MmNfMzIsIHUyY18zMywgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIHUyY180RSwgdTJjXzRGLCAKKwl1MmNfNTAsIHUyY181MSwgdTJjXzUyLCB1MmNfNTMsIHUyY181NCwgdTJjXzU1LCB1MmNfNTYsIHUyY181NywgCisJdTJjXzU4LCB1MmNfNTksIHUyY181QSwgdTJjXzVCLCB1MmNfNUMsIHUyY181RCwgdTJjXzVFLCB1MmNfNUYsIAorCXUyY182MCwgdTJjXzYxLCB1MmNfNjIsIHUyY182MywgdTJjXzY0LCB1MmNfNjUsIHUyY182NiwgdTJjXzY3LCAKKwl1MmNfNjgsIHUyY182OSwgdTJjXzZBLCB1MmNfNkIsIHUyY182QywgdTJjXzZELCB1MmNfNkUsIHUyY182RiwgCisJdTJjXzcwLCB1MmNfNzEsIHUyY183MiwgdTJjXzczLCB1MmNfNzQsIHUyY183NSwgdTJjXzc2LCB1MmNfNzcsIAorCXUyY183OCwgdTJjXzc5LCB1MmNfN0EsIHUyY183QiwgdTJjXzdDLCB1MmNfN0QsIHUyY183RSwgdTJjXzdGLCAKKwl1MmNfODAsIHUyY184MSwgdTJjXzgyLCB1MmNfODMsIHUyY184NCwgdTJjXzg1LCB1MmNfODYsIHUyY184NywgCisJdTJjXzg4LCB1MmNfODksIHUyY184QSwgdTJjXzhCLCB1MmNfOEMsIHUyY184RCwgdTJjXzhFLCB1MmNfOEYsIAorCXUyY185MCwgdTJjXzkxLCB1MmNfOTIsIHUyY185MywgdTJjXzk0LCB1MmNfOTUsIHUyY185NiwgdTJjXzk3LCAKKwl1MmNfOTgsIHUyY185OSwgdTJjXzlBLCB1MmNfOUIsIHUyY185QywgdTJjXzlELCB1MmNfOUUsIHUyY185RiwgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgdTJjX0FDLCB1MmNfQUQsIHUyY19BRSwgdTJjX0FGLCAKKwl1MmNfQjAsIHUyY19CMSwgdTJjX0IyLCB1MmNfQjMsIHUyY19CNCwgdTJjX0I1LCB1MmNfQjYsIHUyY19CNywgCisJdTJjX0I4LCB1MmNfQjksIHUyY19CQSwgdTJjX0JCLCB1MmNfQkMsIHUyY19CRCwgdTJjX0JFLCB1MmNfQkYsIAorCXUyY19DMCwgdTJjX0MxLCB1MmNfQzIsIHUyY19DMywgdTJjX0M0LCB1MmNfQzUsIHUyY19DNiwgdTJjX0M3LCAKKwl1MmNfQzgsIHUyY19DOSwgdTJjX0NBLCB1MmNfQ0IsIHUyY19DQywgdTJjX0NELCB1MmNfQ0UsIHUyY19DRiwgCisJdTJjX0QwLCB1MmNfRDEsIHUyY19EMiwgdTJjX0QzLCB1MmNfRDQsIHUyY19ENSwgdTJjX0Q2LCB1MmNfRDcsIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgdTJjX0RDLCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIHUyY19GOSwgdTJjX0ZBLCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIHUyY19GRiwgfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJsb3dlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NDAtMHg0NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NTAtMHg1NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0MnVwcGVyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg2MC0weDY3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg2OC0weDZmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg3MC0weDc3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweGExLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyBpbnQgdW5pMmNoYXIoY29uc3Qgd2NoYXJfdCB1bmksCisJCQl1bnNpZ25lZCBjaGFyICpvdXQsIGludCBib3VuZGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICp1bmkyY2hhcnNldDsKKwl1bnNpZ25lZCBjaGFyIGNsID0gdW5pJjB4RkY7CisJdW5zaWduZWQgY2hhciBjaCA9ICh1bmk+PjgpJjB4RkY7CisJaW50IG47CisKKwlpZiAoYm91bmRsZW4gPD0gMCkKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKworCXVuaTJjaGFyc2V0ID0gcGFnZV91bmkyY2hhcnNldFtjaF07CisJaWYgKHVuaTJjaGFyc2V0KSB7CisJCWlmIChib3VuZGxlbiA8PSAxKQorCQkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisJCW91dFswXSA9IHVuaTJjaGFyc2V0W2NsKjJdOworCQlvdXRbMV0gPSB1bmkyY2hhcnNldFtjbCoyKzFdOworCQlpZiAob3V0WzBdID09IDB4MDAgJiYgb3V0WzFdID09IDB4MDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbiA9IDI7CisJfSBlbHNlIGlmIChjaD09MCAmJiBjbCkgeworCQlvdXRbMF0gPSBjbDsKKwkJbiA9IDE7CisJfQorCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGludCBjaGFyMnVuaShjb25zdCB1bnNpZ25lZCBjaGFyICpyYXdzdHJpbmcsIGludCBib3VuZGxlbiwKKwkJCXdjaGFyX3QgKnVuaSkKK3sKKwl1bnNpZ25lZCBjaGFyIGNoLCBjbDsKKwl3Y2hhcl90ICpjaGFyc2V0MnVuaTsKKwlpbnQgbjsKKworCWlmIChib3VuZGxlbiA8PSAwKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCWlmIChib3VuZGxlbiA9PSAxKSB7CisJCSp1bmkgPSByYXdzdHJpbmdbMF07CisJCXJldHVybiAxOworCX0KKworCWNoID0gcmF3c3RyaW5nWzBdOworCWNsID0gcmF3c3RyaW5nWzFdOworCisJY2hhcnNldDJ1bmkgPSBwYWdlX2NoYXJzZXQydW5pW2NoXTsKKwlpZiAoY2hhcnNldDJ1bmkgJiYgY2wpIHsKKwkJKnVuaSA9IGNoYXJzZXQydW5pW2NsXTsKKwkJaWYgKCp1bmkgPT0gMHgwMDAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCW4gPSAyOworCX0gZWxzZXsKKwkJKnVuaSA9IGNoOworCQluID0gMTsKKwl9CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmxzX3RhYmxlIHRhYmxlID0geworCS5jaGFyc2V0CT0gImNwOTQ5IiwKKwkuYWxpYXMJCT0gImV1Yy1rciIsCisJLnVuaTJjaGFyCT0gdW5pMmNoYXIsCisJLmNoYXIydW5pCT0gY2hhcjJ1bmksCisJLmNoYXJzZXQybG93ZXIJPSBjaGFyc2V0Mmxvd2VyLAorCS5jaGFyc2V0MnVwcGVyCT0gY2hhcnNldDJ1cHBlciwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X25sc19jcDk0OSh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmxzX2NwOTQ5KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ubHNfY3A5NDkpCittb2R1bGVfZXhpdChleGl0X25sc19jcDk0OSkKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworTU9EVUxFX0FMSUFTX05MUyhldWMta3IpOwpkaWZmIC0tZ2l0IGEvZnMvbmxzL25sc19jcDk1MC5jIGIvZnMvbmxzL25sc19jcDk1MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNjdhMjgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ubHMvbmxzX2NwOTUwLmMKQEAgLTAsMCArMSw5NDgzIEBACisvKgorICogbGludXgvZnMvbmxzX2NwOTUwLmMKKyAqCisgKiBDaGFyc2V0IGNwOTUwIHRyYW5zbGF0aW9uIHRhYmxlcy4KKyAqIFRoaXMgdHJhbnNsYXRpb24gdGFibGUgd2FzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LCB0aGUKKyAqIG9yaWdpbmFsIHRhYmxlIGNhbiBiZSBkb3dubG9hZCBmcm9tIHRoZSBNaWNyb3NvZnQgd2Vic2l0ZS4KKyAqIChodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vdHlwb2dyYXBoeS91bmljb2RlL3VuaWNvZGVjcC5odG0pCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKK3N0YXRpYyB3Y2hhcl90IGMydV9BMVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDMwMDAsMHhGRjBDLDB4MzAwMSwweDMwMDIsMHhGRjBFLDB4MjAyNywweEZGMUIsMHhGRjFBLC8qIDB4NDAtMHg0NyAqLworCTB4RkYxRiwweEZGMDEsMHhGRTMwLDB4MjAyNiwweDIwMjUsMHhGRTUwLDB4RkU1MSwweEZFNTIsLyogMHg0OC0weDRGICovCisJMHgwMEI3LDB4RkU1NCwweEZFNTUsMHhGRTU2LDB4RkU1NywweEZGNUMsMHgyMDEzLDB4RkUzMSwvKiAweDUwLTB4NTcgKi8KKwkweDIwMTQsMHhGRTMzLDB4MjU3NCwweEZFMzQsMHhGRTRGLDB4RkYwOCwweEZGMDksMHhGRTM1LC8qIDB4NTgtMHg1RiAqLworCTB4RkUzNiwweEZGNUIsMHhGRjVELDB4RkUzNywweEZFMzgsMHgzMDE0LDB4MzAxNSwweEZFMzksLyogMHg2MC0weDY3ICovCisJMHhGRTNBLDB4MzAxMCwweDMwMTEsMHhGRTNCLDB4RkUzQywweDMwMEEsMHgzMDBCLDB4RkUzRCwvKiAweDY4LTB4NkYgKi8KKwkweEZFM0UsMHgzMDA4LDB4MzAwOSwweEZFM0YsMHhGRTQwLDB4MzAwQywweDMwMEQsMHhGRTQxLC8qIDB4NzAtMHg3NyAqLworCTB4RkU0MiwweDMwMEUsMHgzMDBGLDB4RkU0MywweEZFNDQsMHhGRTU5LDB4RkU1QSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweEZFNUIsMHhGRTVDLDB4RkU1RCwweEZFNUUsMHgyMDE4LDB4MjAxOSwweDIwMUMsLyogMHhBMC0weEE3ICovCisJMHgyMDFELDB4MzAxRCwweDMwMUUsMHgyMDM1LDB4MjAzMiwweEZGMDMsMHhGRjA2LDB4RkYwQSwvKiAweEE4LTB4QUYgKi8KKwkweDIwM0IsMHgwMEE3LDB4MzAwMywweDI1Q0IsMHgyNUNGLDB4MjVCMywweDI1QjIsMHgyNUNFLC8qIDB4QjAtMHhCNyAqLworCTB4MjYwNiwweDI2MDUsMHgyNUM3LDB4MjVDNiwweDI1QTEsMHgyNUEwLDB4MjVCRCwweDI1QkMsLyogMHhCOC0weEJGICovCisJMHgzMkEzLDB4MjEwNSwweDAwQUYsMHhGRkUzLDB4RkYzRiwweDAyQ0QsMHhGRTQ5LDB4RkU0QSwvKiAweEMwLTB4QzcgKi8KKwkweEZFNEQsMHhGRTRFLDB4RkU0QiwweEZFNEMsMHhGRTVGLDB4RkU2MCwweEZFNjEsMHhGRjBCLC8qIDB4QzgtMHhDRiAqLworCTB4RkYwRCwweDAwRDcsMHgwMEY3LDB4MDBCMSwweDIyMUEsMHhGRjFDLDB4RkYxRSwweEZGMUQsLyogMHhEMC0weEQ3ICovCisJMHgyMjY2LDB4MjI2NywweDIyNjAsMHgyMjFFLDB4MjI1MiwweDIyNjEsMHhGRTYyLDB4RkU2MywvKiAweEQ4LTB4REYgKi8KKwkweEZFNjQsMHhGRTY1LDB4RkU2NiwweEZGNUUsMHgyMjI5LDB4MjIyQSwweDIyQTUsMHgyMjIwLC8qIDB4RTAtMHhFNyAqLworCTB4MjIxRiwweDIyQkYsMHgzM0QyLDB4MzNEMSwweDIyMkIsMHgyMjJFLDB4MjIzNSwweDIyMzQsLyogMHhFOC0weEVGICovCisJMHgyNjQwLDB4MjY0MiwweDIyOTUsMHgyMjk5LDB4MjE5MSwweDIxOTMsMHgyMTkwLDB4MjE5MiwvKiAweEYwLTB4RjcgKi8KKwkweDIxOTYsMHgyMTk3LDB4MjE5OSwweDIxOTgsMHgyMjI1LDB4MjIyMywweEZGMEYsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0EyWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4RkYzQywweDIyMTUsMHhGRTY4LDB4RkYwNCwweEZGRTUsMHgzMDEyLDB4RkZFMCwweEZGRTEsLyogMHg0MC0weDQ3ICovCisJMHhGRjA1LDB4RkYyMCwweDIxMDMsMHgyMTA5LDB4RkU2OSwweEZFNkEsMHhGRTZCLDB4MzNENSwvKiAweDQ4LTB4NEYgKi8KKwkweDMzOUMsMHgzMzlELDB4MzM5RSwweDMzQ0UsMHgzM0ExLDB4MzM4RSwweDMzOEYsMHgzM0M0LC8qIDB4NTAtMHg1NyAqLworCTB4MDBCMCwweDUxNTksMHg1MTVCLDB4NTE1RSwweDUxNUQsMHg1MTYxLDB4NTE2MywweDU1RTcsLyogMHg1OC0weDVGICovCisJMHg3NEU5LDB4N0NDRSwweDI1ODEsMHgyNTgyLDB4MjU4MywweDI1ODQsMHgyNTg1LDB4MjU4NiwvKiAweDYwLTB4NjcgKi8KKwkweDI1ODcsMHgyNTg4LDB4MjU4RiwweDI1OEUsMHgyNThELDB4MjU4QywweDI1OEIsMHgyNThBLC8qIDB4NjgtMHg2RiAqLworCTB4MjU4OSwweDI1M0MsMHgyNTM0LDB4MjUyQywweDI1MjQsMHgyNTFDLDB4MjU5NCwweDI1MDAsLyogMHg3MC0weDc3ICovCisJMHgyNTAyLDB4MjU5NSwweDI1MEMsMHgyNTEwLDB4MjUxNCwweDI1MTgsMHgyNTZELDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4MjU2RSwweDI1NzAsMHgyNTZGLDB4MjU1MCwweDI1NUUsMHgyNTZBLDB4MjU2MSwvKiAweEEwLTB4QTcgKi8KKwkweDI1RTIsMHgyNUUzLDB4MjVFNSwweDI1RTQsMHgyNTcxLDB4MjU3MiwweDI1NzMsMHhGRjEwLC8qIDB4QTgtMHhBRiAqLworCTB4RkYxMSwweEZGMTIsMHhGRjEzLDB4RkYxNCwweEZGMTUsMHhGRjE2LDB4RkYxNywweEZGMTgsLyogMHhCMC0weEI3ICovCisJMHhGRjE5LDB4MjE2MCwweDIxNjEsMHgyMTYyLDB4MjE2MywweDIxNjQsMHgyMTY1LDB4MjE2NiwvKiAweEI4LTB4QkYgKi8KKwkweDIxNjcsMHgyMTY4LDB4MjE2OSwweDMwMjEsMHgzMDIyLDB4MzAyMywweDMwMjQsMHgzMDI1LC8qIDB4QzAtMHhDNyAqLworCTB4MzAyNiwweDMwMjcsMHgzMDI4LDB4MzAyOSwweDUzNDEsMHg1MzQ0LDB4NTM0NSwweEZGMjEsLyogMHhDOC0weENGICovCisJMHhGRjIyLDB4RkYyMywweEZGMjQsMHhGRjI1LDB4RkYyNiwweEZGMjcsMHhGRjI4LDB4RkYyOSwvKiAweEQwLTB4RDcgKi8KKwkweEZGMkEsMHhGRjJCLDB4RkYyQywweEZGMkQsMHhGRjJFLDB4RkYyRiwweEZGMzAsMHhGRjMxLC8qIDB4RDgtMHhERiAqLworCTB4RkYzMiwweEZGMzMsMHhGRjM0LDB4RkYzNSwweEZGMzYsMHhGRjM3LDB4RkYzOCwweEZGMzksLyogMHhFMC0weEU3ICovCisJMHhGRjNBLDB4RkY0MSwweEZGNDIsMHhGRjQzLDB4RkY0NCwweEZGNDUsMHhGRjQ2LDB4RkY0NywvKiAweEU4LTB4RUYgKi8KKwkweEZGNDgsMHhGRjQ5LDB4RkY0QSwweEZGNEIsMHhGRjRDLDB4RkY0RCwweEZGNEUsMHhGRjRGLC8qIDB4RjAtMHhGNyAqLworCTB4RkY1MCwweEZGNTEsMHhGRjUyLDB4RkY1MywweEZGNTQsMHhGRjU1LDB4RkY1NiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQTNbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHhGRjU3LDB4RkY1OCwweEZGNTksMHhGRjVBLDB4MDM5MSwweDAzOTIsMHgwMzkzLDB4MDM5NCwvKiAweDQwLTB4NDcgKi8KKwkweDAzOTUsMHgwMzk2LDB4MDM5NywweDAzOTgsMHgwMzk5LDB4MDM5QSwweDAzOUIsMHgwMzlDLC8qIDB4NDgtMHg0RiAqLworCTB4MDM5RCwweDAzOUUsMHgwMzlGLDB4MDNBMCwweDAzQTEsMHgwM0EzLDB4MDNBNCwweDAzQTUsLyogMHg1MC0weDU3ICovCisJMHgwM0E2LDB4MDNBNywweDAzQTgsMHgwM0E5LDB4MDNCMSwweDAzQjIsMHgwM0IzLDB4MDNCNCwvKiAweDU4LTB4NUYgKi8KKwkweDAzQjUsMHgwM0I2LDB4MDNCNywweDAzQjgsMHgwM0I5LDB4MDNCQSwweDAzQkIsMHgwM0JDLC8qIDB4NjAtMHg2NyAqLworCTB4MDNCRCwweDAzQkUsMHgwM0JGLDB4MDNDMCwweDAzQzEsMHgwM0MzLDB4MDNDNCwweDAzQzUsLyogMHg2OC0weDZGICovCisJMHgwM0M2LDB4MDNDNywweDAzQzgsMHgwM0M5LDB4MzEwNSwweDMxMDYsMHgzMTA3LDB4MzEwOCwvKiAweDcwLTB4NzcgKi8KKwkweDMxMDksMHgzMTBBLDB4MzEwQiwweDMxMEMsMHgzMTBELDB4MzEwRSwweDMxMEYsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHgzMTEwLDB4MzExMSwweDMxMTIsMHgzMTEzLDB4MzExNCwweDMxMTUsMHgzMTE2LC8qIDB4QTAtMHhBNyAqLworCTB4MzExNywweDMxMTgsMHgzMTE5LDB4MzExQSwweDMxMUIsMHgzMTFDLDB4MzExRCwweDMxMUUsLyogMHhBOC0weEFGICovCisJMHgzMTFGLDB4MzEyMCwweDMxMjEsMHgzMTIyLDB4MzEyMywweDMxMjQsMHgzMTI1LDB4MzEyNiwvKiAweEIwLTB4QjcgKi8KKwkweDMxMjcsMHgzMTI4LDB4MzEyOSwweDAyRDksMHgwMkM5LDB4MDJDQSwweDAyQzcsMHgwMkNCLC8qIDB4QjgtMHhCRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhDMC0weEM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEM4LTB4Q0YgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4RDAtMHhENyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHhEOC0weERGICovCisJMHgwMDAwLDB4MjBBQywweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweEUwLTB4RTcgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9BNFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDRFMDAsMHg0RTU5LDB4NEUwMSwweDRFMDMsMHg0RTQzLDB4NEU1RCwweDRFODYsMHg0RThDLC8qIDB4NDAtMHg0NyAqLworCTB4NEVCQSwweDUxM0YsMHg1MTY1LDB4NTE2QiwweDUxRTAsMHg1MjAwLDB4NTIwMSwweDUyOUIsLyogMHg0OC0weDRGICovCisJMHg1MzE1LDB4NTM0MSwweDUzNUMsMHg1M0M4LDB4NEUwOSwweDRFMEIsMHg0RTA4LDB4NEUwQSwvKiAweDUwLTB4NTcgKi8KKwkweDRFMkIsMHg0RTM4LDB4NTFFMSwweDRFNDUsMHg0RTQ4LDB4NEU1RiwweDRFNUUsMHg0RThFLC8qIDB4NTgtMHg1RiAqLworCTB4NEVBMSwweDUxNDAsMHg1MjAzLDB4NTJGQSwweDUzNDMsMHg1M0M5LDB4NTNFMywweDU3MUYsLyogMHg2MC0weDY3ICovCisJMHg1OEVCLDB4NTkxNSwweDU5MjcsMHg1OTczLDB4NUI1MCwweDVCNTEsMHg1QjUzLDB4NUJGOCwvKiAweDY4LTB4NkYgKi8KKwkweDVDMEYsMHg1QzIyLDB4NUMzOCwweDVDNzEsMHg1RERELDB4NURFNSwweDVERjEsMHg1REYyLC8qIDB4NzAtMHg3NyAqLworCTB4NURGMywweDVERkUsMHg1RTcyLDB4NUVGRSwweDVGMEIsMHg1RjEzLDB4NjI0RCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDRFMTEsMHg0RTEwLDB4NEUwRCwweDRFMkQsMHg0RTMwLDB4NEUzOSwweDRFNEIsLyogMHhBMC0weEE3ICovCisJMHg1QzM5LDB4NEU4OCwweDRFOTEsMHg0RTk1LDB4NEU5MiwweDRFOTQsMHg0RUEyLDB4NEVDMSwvKiAweEE4LTB4QUYgKi8KKwkweDRFQzAsMHg0RUMzLDB4NEVDNiwweDRFQzcsMHg0RUNELDB4NEVDQSwweDRFQ0IsMHg0RUM0LC8qIDB4QjAtMHhCNyAqLworCTB4NTE0MywweDUxNDEsMHg1MTY3LDB4NTE2RCwweDUxNkUsMHg1MTZDLDB4NTE5NywweDUxRjYsLyogMHhCOC0weEJGICovCisJMHg1MjA2LDB4NTIwNywweDUyMDgsMHg1MkZCLDB4NTJGRSwweDUyRkYsMHg1MzE2LDB4NTMzOSwvKiAweEMwLTB4QzcgKi8KKwkweDUzNDgsMHg1MzQ3LDB4NTM0NSwweDUzNUUsMHg1Mzg0LDB4NTNDQiwweDUzQ0EsMHg1M0NELC8qIDB4QzgtMHhDRiAqLworCTB4NThFQywweDU5MjksMHg1OTJCLDB4NTkyQSwweDU5MkQsMHg1QjU0LDB4NUMxMSwweDVDMjQsLyogMHhEMC0weEQ3ICovCisJMHg1QzNBLDB4NUM2RiwweDVERjQsMHg1RTdCLDB4NUVGRiwweDVGMTQsMHg1RjE1LDB4NUZDMywvKiAweEQ4LTB4REYgKi8KKwkweDYyMDgsMHg2MjM2LDB4NjI0QiwweDYyNEUsMHg2NTJGLDB4NjU4NywweDY1OTcsMHg2NUE0LC8qIDB4RTAtMHhFNyAqLworCTB4NjVCOSwweDY1RTUsMHg2NkYwLDB4NjcwOCwweDY3MjgsMHg2QjIwLDB4NkI2MiwweDZCNzksLyogMHhFOC0weEVGICovCisJMHg2QkNCLDB4NkJENCwweDZCREIsMHg2QzBGLDB4NkMzNCwweDcwNkIsMHg3MjJBLDB4NzIzNiwvKiAweEYwLTB4RjcgKi8KKwkweDcyM0IsMHg3MjQ3LDB4NzI1OSwweDcyNUIsMHg3MkFDLDB4NzM4QiwweDRFMTksMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0E1WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NEUxNiwweDRFMTUsMHg0RTE0LDB4NEUxOCwweDRFM0IsMHg0RTRELDB4NEU0RiwweDRFNEUsLyogMHg0MC0weDQ3ICovCisJMHg0RUU1LDB4NEVEOCwweDRFRDQsMHg0RUQ1LDB4NEVENiwweDRFRDcsMHg0RUUzLDB4NEVFNCwvKiAweDQ4LTB4NEYgKi8KKwkweDRFRDksMHg0RURFLDB4NTE0NSwweDUxNDQsMHg1MTg5LDB4NTE4QSwweDUxQUMsMHg1MUY5LC8qIDB4NTAtMHg1NyAqLworCTB4NTFGQSwweDUxRjgsMHg1MjBBLDB4NTJBMCwweDUyOUYsMHg1MzA1LDB4NTMwNiwweDUzMTcsLyogMHg1OC0weDVGICovCisJMHg1MzFELDB4NEVERiwweDUzNEEsMHg1MzQ5LDB4NTM2MSwweDUzNjAsMHg1MzZGLDB4NTM2RSwvKiAweDYwLTB4NjcgKi8KKwkweDUzQkIsMHg1M0VGLDB4NTNFNCwweDUzRjMsMHg1M0VDLDB4NTNFRSwweDUzRTksMHg1M0U4LC8qIDB4NjgtMHg2RiAqLworCTB4NTNGQywweDUzRjgsMHg1M0Y1LDB4NTNFQiwweDUzRTYsMHg1M0VBLDB4NTNGMiwweDUzRjEsLyogMHg3MC0weDc3ICovCisJMHg1M0YwLDB4NTNFNSwweDUzRUQsMHg1M0ZCLDB4NTZEQiwweDU2REEsMHg1OTE2LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NTkyRSwweDU5MzEsMHg1OTc0LDB4NTk3NiwweDVCNTUsMHg1QjgzLDB4NUMzQywvKiAweEEwLTB4QTcgKi8KKwkweDVERTgsMHg1REU3LDB4NURFNiwweDVFMDIsMHg1RTAzLDB4NUU3MywweDVFN0MsMHg1RjAxLC8qIDB4QTgtMHhBRiAqLworCTB4NUYxOCwweDVGMTcsMHg1RkM1LDB4NjIwQSwweDYyNTMsMHg2MjU0LDB4NjI1MiwweDYyNTEsLyogMHhCMC0weEI3ICovCisJMHg2NUE1LDB4NjVFNiwweDY3MkUsMHg2NzJDLDB4NjcyQSwweDY3MkIsMHg2NzJELDB4NkI2MywvKiAweEI4LTB4QkYgKi8KKwkweDZCQ0QsMHg2QzExLDB4NkMxMCwweDZDMzgsMHg2QzQxLDB4NkM0MCwweDZDM0UsMHg3MkFGLC8qIDB4QzAtMHhDNyAqLworCTB4NzM4NCwweDczODksMHg3NERDLDB4NzRFNiwweDc1MTgsMHg3NTFGLDB4NzUyOCwweDc1MjksLyogMHhDOC0weENGICovCisJMHg3NTMwLDB4NzUzMSwweDc1MzIsMHg3NTMzLDB4NzU4QiwweDc2N0QsMHg3NkFFLDB4NzZCRiwvKiAweEQwLTB4RDcgKi8KKwkweDc2RUUsMHg3N0RCLDB4NzdFMiwweDc3RjMsMHg3OTNBLDB4NzlCRSwweDdBNzQsMHg3QUNCLC8qIDB4RDgtMHhERiAqLworCTB4NEUxRSwweDRFMUYsMHg0RTUyLDB4NEU1MywweDRFNjksMHg0RTk5LDB4NEVBNCwweDRFQTYsLyogMHhFMC0weEU3ICovCisJMHg0RUE1LDB4NEVGRiwweDRGMDksMHg0RjE5LDB4NEYwQSwweDRGMTUsMHg0RjBELDB4NEYxMCwvKiAweEU4LTB4RUYgKi8KKwkweDRGMTEsMHg0RjBGLDB4NEVGMiwweDRFRjYsMHg0RUZCLDB4NEVGMCwweDRFRjMsMHg0RUZELC8qIDB4RjAtMHhGNyAqLworCTB4NEYwMSwweDRGMEIsMHg1MTQ5LDB4NTE0NywweDUxNDYsMHg1MTQ4LDB4NTE2OCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQTZbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg1MTcxLDB4NTE4RCwweDUxQjAsMHg1MjE3LDB4NTIxMSwweDUyMTIsMHg1MjBFLDB4NTIxNiwvKiAweDQwLTB4NDcgKi8KKwkweDUyQTMsMHg1MzA4LDB4NTMyMSwweDUzMjAsMHg1MzcwLDB4NTM3MSwweDU0MDksMHg1NDBGLC8qIDB4NDgtMHg0RiAqLworCTB4NTQwQywweDU0MEEsMHg1NDEwLDB4NTQwMSwweDU0MEIsMHg1NDA0LDB4NTQxMSwweDU0MEQsLyogMHg1MC0weDU3ICovCisJMHg1NDA4LDB4NTQwMywweDU0MEUsMHg1NDA2LDB4NTQxMiwweDU2RTAsMHg1NkRFLDB4NTZERCwvKiAweDU4LTB4NUYgKi8KKwkweDU3MzMsMHg1NzMwLDB4NTcyOCwweDU3MkQsMHg1NzJDLDB4NTcyRiwweDU3MjksMHg1OTE5LC8qIDB4NjAtMHg2NyAqLworCTB4NTkxQSwweDU5MzcsMHg1OTM4LDB4NTk4NCwweDU5NzgsMHg1OTgzLDB4NTk3RCwweDU5NzksLyogMHg2OC0weDZGICovCisJMHg1OTgyLDB4NTk4MSwweDVCNTcsMHg1QjU4LDB4NUI4NywweDVCODgsMHg1Qjg1LDB4NUI4OSwvKiAweDcwLTB4NzcgKi8KKwkweDVCRkEsMHg1QzE2LDB4NUM3OSwweDVEREUsMHg1RTA2LDB4NUU3NiwweDVFNzQsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg1RjBGLDB4NUYxQiwweDVGRDksMHg1RkQ2LDB4NjIwRSwweDYyMEMsMHg2MjBELC8qIDB4QTAtMHhBNyAqLworCTB4NjIxMCwweDYyNjMsMHg2MjVCLDB4NjI1OCwweDY1MzYsMHg2NUU5LDB4NjVFOCwweDY1RUMsLyogMHhBOC0weEFGICovCisJMHg2NUVELDB4NjZGMiwweDY2RjMsMHg2NzA5LDB4NjczRCwweDY3MzQsMHg2NzMxLDB4NjczNSwvKiAweEIwLTB4QjcgKi8KKwkweDZCMjEsMHg2QjY0LDB4NkI3QiwweDZDMTYsMHg2QzVELDB4NkM1NywweDZDNTksMHg2QzVGLC8qIDB4QjgtMHhCRiAqLworCTB4NkM2MCwweDZDNTAsMHg2QzU1LDB4NkM2MSwweDZDNUIsMHg2QzRELDB4NkM0RSwweDcwNzAsLyogMHhDMC0weEM3ICovCisJMHg3MjVGLDB4NzI1RCwweDc2N0UsMHg3QUY5LDB4N0M3MywweDdDRjgsMHg3RjM2LDB4N0Y4QSwvKiAweEM4LTB4Q0YgKi8KKwkweDdGQkQsMHg4MDAxLDB4ODAwMywweDgwMEMsMHg4MDEyLDB4ODAzMywweDgwN0YsMHg4MDg5LC8qIDB4RDAtMHhENyAqLworCTB4ODA4QiwweDgwOEMsMHg4MUUzLDB4ODFFQSwweDgxRjMsMHg4MUZDLDB4ODIwQywweDgyMUIsLyogMHhEOC0weERGICovCisJMHg4MjFGLDB4ODI2RSwweDgyNzIsMHg4MjdFLDB4ODY2QiwweDg4NDAsMHg4ODRDLDB4ODg2MywvKiAweEUwLTB4RTcgKi8KKwkweDg5N0YsMHg5NjIxLDB4NEUzMiwweDRFQTgsMHg0RjRELDB4NEY0RiwweDRGNDcsMHg0RjU3LC8qIDB4RTgtMHhFRiAqLworCTB4NEY1RSwweDRGMzQsMHg0RjVCLDB4NEY1NSwweDRGMzAsMHg0RjUwLDB4NEY1MSwweDRGM0QsLyogMHhGMC0weEY3ICovCisJMHg0RjNBLDB4NEYzOCwweDRGNDMsMHg0RjU0LDB4NEYzQywweDRGNDYsMHg0RjYzLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9BN1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDRGNUMsMHg0RjYwLDB4NEYyRiwweDRGNEUsMHg0RjM2LDB4NEY1OSwweDRGNUQsMHg0RjQ4LC8qIDB4NDAtMHg0NyAqLworCTB4NEY1QSwweDUxNEMsMHg1MTRCLDB4NTE0RCwweDUxNzUsMHg1MUI2LDB4NTFCNywweDUyMjUsLyogMHg0OC0weDRGICovCisJMHg1MjI0LDB4NTIyOSwweDUyMkEsMHg1MjI4LDB4NTJBQiwweDUyQTksMHg1MkFBLDB4NTJBQywvKiAweDUwLTB4NTcgKi8KKwkweDUzMjMsMHg1MzczLDB4NTM3NSwweDU0MUQsMHg1NDJELDB4NTQxRSwweDU0M0UsMHg1NDI2LC8qIDB4NTgtMHg1RiAqLworCTB4NTQ0RSwweDU0MjcsMHg1NDQ2LDB4NTQ0MywweDU0MzMsMHg1NDQ4LDB4NTQ0MiwweDU0MUIsLyogMHg2MC0weDY3ICovCisJMHg1NDI5LDB4NTQ0QSwweDU0MzksMHg1NDNCLDB4NTQzOCwweDU0MkUsMHg1NDM1LDB4NTQzNiwvKiAweDY4LTB4NkYgKi8KKwkweDU0MjAsMHg1NDNDLDB4NTQ0MCwweDU0MzEsMHg1NDJCLDB4NTQxRiwweDU0MkMsMHg1NkVBLC8qIDB4NzAtMHg3NyAqLworCTB4NTZGMCwweDU2RTQsMHg1NkVCLDB4NTc0QSwweDU3NTEsMHg1NzQwLDB4NTc0RCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDU3NDcsMHg1NzRFLDB4NTczRSwweDU3NTAsMHg1NzRGLDB4NTczQiwweDU4RUYsLyogMHhBMC0weEE3ICovCisJMHg1OTNFLDB4NTk5RCwweDU5OTIsMHg1OUE4LDB4NTk5RSwweDU5QTMsMHg1OTk5LDB4NTk5NiwvKiAweEE4LTB4QUYgKi8KKwkweDU5OEQsMHg1OUE0LDB4NTk5MywweDU5OEEsMHg1OUE1LDB4NUI1RCwweDVCNUMsMHg1QjVBLC8qIDB4QjAtMHhCNyAqLworCTB4NUI1QiwweDVCOEMsMHg1QjhCLDB4NUI4RiwweDVDMkMsMHg1QzQwLDB4NUM0MSwweDVDM0YsLyogMHhCOC0weEJGICovCisJMHg1QzNFLDB4NUM5MCwweDVDOTEsMHg1Qzk0LDB4NUM4QywweDVERUIsMHg1RTBDLDB4NUU4RiwvKiAweEMwLTB4QzcgKi8KKwkweDVFODcsMHg1RThBLDB4NUVGNywweDVGMDQsMHg1RjFGLDB4NUY2NCwweDVGNjIsMHg1Rjc3LC8qIDB4QzgtMHhDRiAqLworCTB4NUY3OSwweDVGRDgsMHg1RkNDLDB4NUZENywweDVGQ0QsMHg1RkYxLDB4NUZFQiwweDVGRjgsLyogMHhEMC0weEQ3ICovCisJMHg1RkVBLDB4NjIxMiwweDYyMTEsMHg2Mjg0LDB4NjI5NywweDYyOTYsMHg2MjgwLDB4NjI3NiwvKiAweEQ4LTB4REYgKi8KKwkweDYyODksMHg2MjZELDB4NjI4QSwweDYyN0MsMHg2MjdFLDB4NjI3OSwweDYyNzMsMHg2MjkyLC8qIDB4RTAtMHhFNyAqLworCTB4NjI2RiwweDYyOTgsMHg2MjZFLDB4NjI5NSwweDYyOTMsMHg2MjkxLDB4NjI4NiwweDY1MzksLyogMHhFOC0weEVGICovCisJMHg2NTNCLDB4NjUzOCwweDY1RjEsMHg2NkY0LDB4Njc1RiwweDY3NEUsMHg2NzRGLDB4Njc1MCwvKiAweEYwLTB4RjcgKi8KKwkweDY3NTEsMHg2NzVDLDB4Njc1NiwweDY3NUUsMHg2NzQ5LDB4Njc0NiwweDY3NjAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0E4WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4Njc1MywweDY3NTcsMHg2QjY1LDB4NkJDRiwweDZDNDIsMHg2QzVFLDB4NkM5OSwweDZDODEsLyogMHg0MC0weDQ3ICovCisJMHg2Qzg4LDB4NkM4OSwweDZDODUsMHg2QzlCLDB4NkM2QSwweDZDN0EsMHg2QzkwLDB4NkM3MCwvKiAweDQ4LTB4NEYgKi8KKwkweDZDOEMsMHg2QzY4LDB4NkM5NiwweDZDOTIsMHg2QzdELDB4NkM4MywweDZDNzIsMHg2QzdFLC8qIDB4NTAtMHg1NyAqLworCTB4NkM3NCwweDZDODYsMHg2Qzc2LDB4NkM4RCwweDZDOTQsMHg2Qzk4LDB4NkM4MiwweDcwNzYsLyogMHg1OC0weDVGICovCisJMHg3MDdDLDB4NzA3RCwweDcwNzgsMHg3MjYyLDB4NzI2MSwweDcyNjAsMHg3MkM0LDB4NzJDMiwvKiAweDYwLTB4NjcgKi8KKwkweDczOTYsMHg3NTJDLDB4NzUyQiwweDc1MzcsMHg3NTM4LDB4NzY4MiwweDc2RUYsMHg3N0UzLC8qIDB4NjgtMHg2RiAqLworCTB4NzlDMSwweDc5QzAsMHg3OUJGLDB4N0E3NiwweDdDRkIsMHg3RjU1LDB4ODA5NiwweDgwOTMsLyogMHg3MC0weDc3ICovCisJMHg4MDlELDB4ODA5OCwweDgwOUIsMHg4MDlBLDB4ODBCMiwweDgyNkYsMHg4MjkyLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4ODI4QiwweDgyOEQsMHg4OThCLDB4ODlEMiwweDhBMDAsMHg4QzM3LDB4OEM0NiwvKiAweEEwLTB4QTcgKi8KKwkweDhDNTUsMHg4QzlELDB4OEQ2NCwweDhENzAsMHg4REIzLDB4OEVBQiwweDhFQ0EsMHg4RjlCLC8qIDB4QTgtMHhBRiAqLworCTB4OEZCMCwweDhGQzIsMHg4RkM2LDB4OEZDNSwweDhGQzQsMHg1REUxLDB4OTA5MSwweDkwQTIsLyogMHhCMC0weEI3ICovCisJMHg5MEFBLDB4OTBBNiwweDkwQTMsMHg5MTQ5LDB4OTFDNiwweDkxQ0MsMHg5NjMyLDB4OTYyRSwvKiAweEI4LTB4QkYgKi8KKwkweDk2MzEsMHg5NjJBLDB4OTYyQywweDRFMjYsMHg0RTU2LDB4NEU3MywweDRFOEIsMHg0RTlCLC8qIDB4QzAtMHhDNyAqLworCTB4NEU5RSwweDRFQUIsMHg0RUFDLDB4NEY2RiwweDRGOUQsMHg0RjhELDB4NEY3MywweDRGN0YsLyogMHhDOC0weENGICovCisJMHg0RjZDLDB4NEY5QiwweDRGOEIsMHg0Rjg2LDB4NEY4MywweDRGNzAsMHg0Rjc1LDB4NEY4OCwvKiAweEQwLTB4RDcgKi8KKwkweDRGNjksMHg0RjdCLDB4NEY5NiwweDRGN0UsMHg0RjhGLDB4NEY5MSwweDRGN0EsMHg1MTU0LC8qIDB4RDgtMHhERiAqLworCTB4NTE1MiwweDUxNTUsMHg1MTY5LDB4NTE3NywweDUxNzYsMHg1MTc4LDB4NTFCRCwweDUxRkQsLyogMHhFMC0weEU3ICovCisJMHg1MjNCLDB4NTIzOCwweDUyMzcsMHg1MjNBLDB4NTIzMCwweDUyMkUsMHg1MjM2LDB4NTI0MSwvKiAweEU4LTB4RUYgKi8KKwkweDUyQkUsMHg1MkJCLDB4NTM1MiwweDUzNTQsMHg1MzUzLDB4NTM1MSwweDUzNjYsMHg1Mzc3LC8qIDB4RjAtMHhGNyAqLworCTB4NTM3OCwweDUzNzksMHg1M0Q2LDB4NTNENCwweDUzRDcsMHg1NDczLDB4NTQ3NSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQTlbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg1NDk2LDB4NTQ3OCwweDU0OTUsMHg1NDgwLDB4NTQ3QiwweDU0NzcsMHg1NDg0LDB4NTQ5MiwvKiAweDQwLTB4NDcgKi8KKwkweDU0ODYsMHg1NDdDLDB4NTQ5MCwweDU0NzEsMHg1NDc2LDB4NTQ4QywweDU0OUEsMHg1NDYyLC8qIDB4NDgtMHg0RiAqLworCTB4NTQ2OCwweDU0OEIsMHg1NDdELDB4NTQ4RSwweDU2RkEsMHg1NzgzLDB4NTc3NywweDU3NkEsLyogMHg1MC0weDU3ICovCisJMHg1NzY5LDB4NTc2MSwweDU3NjYsMHg1NzY0LDB4NTc3QywweDU5MUMsMHg1OTQ5LDB4NTk0NywvKiAweDU4LTB4NUYgKi8KKwkweDU5NDgsMHg1OTQ0LDB4NTk1NCwweDU5QkUsMHg1OUJCLDB4NTlENCwweDU5QjksMHg1OUFFLC8qIDB4NjAtMHg2NyAqLworCTB4NTlEMSwweDU5QzYsMHg1OUQwLDB4NTlDRCwweDU5Q0IsMHg1OUQzLDB4NTlDQSwweDU5QUYsLyogMHg2OC0weDZGICovCisJMHg1OUIzLDB4NTlEMiwweDU5QzUsMHg1QjVGLDB4NUI2NCwweDVCNjMsMHg1Qjk3LDB4NUI5QSwvKiAweDcwLTB4NzcgKi8KKwkweDVCOTgsMHg1QjlDLDB4NUI5OSwweDVCOUIsMHg1QzFBLDB4NUM0OCwweDVDNDUsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg1QzQ2LDB4NUNCNywweDVDQTEsMHg1Q0I4LDB4NUNBOSwweDVDQUIsMHg1Q0IxLC8qIDB4QTAtMHhBNyAqLworCTB4NUNCMywweDVFMTgsMHg1RTFBLDB4NUUxNiwweDVFMTUsMHg1RTFCLDB4NUUxMSwweDVFNzgsLyogMHhBOC0weEFGICovCisJMHg1RTlBLDB4NUU5NywweDVFOUMsMHg1RTk1LDB4NUU5NiwweDVFRjYsMHg1RjI2LDB4NUYyNywvKiAweEIwLTB4QjcgKi8KKwkweDVGMjksMHg1RjgwLDB4NUY4MSwweDVGN0YsMHg1RjdDLDB4NUZERCwweDVGRTAsMHg1RkZELC8qIDB4QjgtMHhCRiAqLworCTB4NUZGNSwweDVGRkYsMHg2MDBGLDB4NjAxNCwweDYwMkYsMHg2MDM1LDB4NjAxNiwweDYwMkEsLyogMHhDMC0weEM3ICovCisJMHg2MDE1LDB4NjAyMSwweDYwMjcsMHg2MDI5LDB4NjAyQiwweDYwMUIsMHg2MjE2LDB4NjIxNSwvKiAweEM4LTB4Q0YgKi8KKwkweDYyM0YsMHg2MjNFLDB4NjI0MCwweDYyN0YsMHg2MkM5LDB4NjJDQywweDYyQzQsMHg2MkJGLC8qIDB4RDAtMHhENyAqLworCTB4NjJDMiwweDYyQjksMHg2MkQyLDB4NjJEQiwweDYyQUIsMHg2MkQzLDB4NjJENCwweDYyQ0IsLyogMHhEOC0weERGICovCisJMHg2MkM4LDB4NjJBOCwweDYyQkQsMHg2MkJDLDB4NjJEMCwweDYyRDksMHg2MkM3LDB4NjJDRCwvKiAweEUwLTB4RTcgKi8KKwkweDYyQjUsMHg2MkRBLDB4NjJCMSwweDYyRDgsMHg2MkQ2LDB4NjJENywweDYyQzYsMHg2MkFDLC8qIDB4RTgtMHhFRiAqLworCTB4NjJDRSwweDY1M0UsMHg2NUE3LDB4NjVCQywweDY1RkEsMHg2NjE0LDB4NjYxMywweDY2MEMsLyogMHhGMC0weEY3ICovCisJMHg2NjA2LDB4NjYwMiwweDY2MEUsMHg2NjAwLDB4NjYwRiwweDY2MTUsMHg2NjBBLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9BQVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDY2MDcsMHg2NzBELDB4NjcwQiwweDY3NkQsMHg2NzhCLDB4Njc5NSwweDY3NzEsMHg2NzlDLC8qIDB4NDAtMHg0NyAqLworCTB4Njc3MywweDY3NzcsMHg2Nzg3LDB4Njc5RCwweDY3OTcsMHg2NzZGLDB4Njc3MCwweDY3N0YsLyogMHg0OC0weDRGICovCisJMHg2Nzg5LDB4Njc3RSwweDY3OTAsMHg2Nzc1LDB4Njc5QSwweDY3OTMsMHg2NzdDLDB4Njc2QSwvKiAweDUwLTB4NTcgKi8KKwkweDY3NzIsMHg2QjIzLDB4NkI2NiwweDZCNjcsMHg2QjdGLDB4NkMxMywweDZDMUIsMHg2Q0UzLC8qIDB4NTgtMHg1RiAqLworCTB4NkNFOCwweDZDRjMsMHg2Q0IxLDB4NkNDQywweDZDRTUsMHg2Q0IzLDB4NkNCRCwweDZDQkUsLyogMHg2MC0weDY3ICovCisJMHg2Q0JDLDB4NkNFMiwweDZDQUIsMHg2Q0Q1LDB4NkNEMywweDZDQjgsMHg2Q0M0LDB4NkNCOSwvKiAweDY4LTB4NkYgKi8KKwkweDZDQzEsMHg2Q0FFLDB4NkNENywweDZDQzUsMHg2Q0YxLDB4NkNCRiwweDZDQkIsMHg2Q0UxLC8qIDB4NzAtMHg3NyAqLworCTB4NkNEQiwweDZDQ0EsMHg2Q0FDLDB4NkNFRiwweDZDREMsMHg2Q0Q2LDB4NkNFMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDcwOTUsMHg3MDhFLDB4NzA5MiwweDcwOEEsMHg3MDk5LDB4NzIyQywweDcyMkQsLyogMHhBMC0weEE3ICovCisJMHg3MjM4LDB4NzI0OCwweDcyNjcsMHg3MjY5LDB4NzJDMCwweDcyQ0UsMHg3MkQ5LDB4NzJENywvKiAweEE4LTB4QUYgKi8KKwkweDcyRDAsMHg3M0E5LDB4NzNBOCwweDczOUYsMHg3M0FCLDB4NzNBNSwweDc1M0QsMHg3NTlELC8qIDB4QjAtMHhCNyAqLworCTB4NzU5OSwweDc1OUEsMHg3Njg0LDB4NzZDMiwweDc2RjIsMHg3NkY0LDB4NzdFNSwweDc3RkQsLyogMHhCOC0weEJGICovCisJMHg3OTNFLDB4Nzk0MCwweDc5NDEsMHg3OUM5LDB4NzlDOCwweDdBN0EsMHg3QTc5LDB4N0FGQSwvKiAweEMwLTB4QzcgKi8KKwkweDdDRkUsMHg3RjU0LDB4N0Y4QywweDdGOEIsMHg4MDA1LDB4ODBCQSwweDgwQTUsMHg4MEEyLC8qIDB4QzgtMHhDRiAqLworCTB4ODBCMSwweDgwQTEsMHg4MEFCLDB4ODBBOSwweDgwQjQsMHg4MEFBLDB4ODBBRiwweDgxRTUsLyogMHhEMC0weEQ3ICovCisJMHg4MUZFLDB4ODIwRCwweDgyQjMsMHg4MjlELDB4ODI5OSwweDgyQUQsMHg4MkJELDB4ODI5RiwvKiAweEQ4LTB4REYgKi8KKwkweDgyQjksMHg4MkIxLDB4ODJBQywweDgyQTUsMHg4MkFGLDB4ODJCOCwweDgyQTMsMHg4MkIwLC8qIDB4RTAtMHhFNyAqLworCTB4ODJCRSwweDgyQjcsMHg4NjRFLDB4ODY3MSwweDUyMUQsMHg4ODY4LDB4OEVDQiwweDhGQ0UsLyogMHhFOC0weEVGICovCisJMHg4RkQ0LDB4OEZEMSwweDkwQjUsMHg5MEI4LDB4OTBCMSwweDkwQjYsMHg5MUM3LDB4OTFEMSwvKiAweEYwLTB4RjcgKi8KKwkweDk1NzcsMHg5NTgwLDB4OTYxQywweDk2NDAsMHg5NjNGLDB4OTYzQiwweDk2NDQsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0FCWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OTY0MiwweDk2QjksMHg5NkU4LDB4OTc1MiwweDk3NUUsMHg0RTlGLDB4NEVBRCwweDRFQUUsLyogMHg0MC0weDQ3ICovCisJMHg0RkUxLDB4NEZCNSwweDRGQUYsMHg0RkJGLDB4NEZFMCwweDRGRDEsMHg0RkNGLDB4NEZERCwvKiAweDQ4LTB4NEYgKi8KKwkweDRGQzMsMHg0RkI2LDB4NEZEOCwweDRGREYsMHg0RkNBLDB4NEZENywweDRGQUUsMHg0RkQwLC8qIDB4NTAtMHg1NyAqLworCTB4NEZDNCwweDRGQzIsMHg0RkRBLDB4NEZDRSwweDRGREUsMHg0RkI3LDB4NTE1NywweDUxOTIsLyogMHg1OC0weDVGICovCisJMHg1MTkxLDB4NTFBMCwweDUyNEUsMHg1MjQzLDB4NTI0QSwweDUyNEQsMHg1MjRDLDB4NTI0QiwvKiAweDYwLTB4NjcgKi8KKwkweDUyNDcsMHg1MkM3LDB4NTJDOSwweDUyQzMsMHg1MkMxLDB4NTMwRCwweDUzNTcsMHg1MzdCLC8qIDB4NjgtMHg2RiAqLworCTB4NTM5QSwweDUzREIsMHg1NEFDLDB4NTRDMCwweDU0QTgsMHg1NENFLDB4NTRDOSwweDU0QjgsLyogMHg3MC0weDc3ICovCisJMHg1NEE2LDB4NTRCMywweDU0QzcsMHg1NEMyLDB4NTRCRCwweDU0QUEsMHg1NEMxLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NTRDNCwweDU0QzgsMHg1NEFGLDB4NTRBQiwweDU0QjEsMHg1NEJCLDB4NTRBOSwvKiAweEEwLTB4QTcgKi8KKwkweDU0QTcsMHg1NEJGLDB4NTZGRiwweDU3ODIsMHg1NzhCLDB4NTdBMCwweDU3QTMsMHg1N0EyLC8qIDB4QTgtMHhBRiAqLworCTB4NTdDRSwweDU3QUUsMHg1NzkzLDB4NTk1NSwweDU5NTEsMHg1OTRGLDB4NTk0RSwweDU5NTAsLyogMHhCMC0weEI3ICovCisJMHg1OURDLDB4NTlEOCwweDU5RkYsMHg1OUUzLDB4NTlFOCwweDVBMDMsMHg1OUU1LDB4NTlFQSwvKiAweEI4LTB4QkYgKi8KKwkweDU5REEsMHg1OUU2LDB4NUEwMSwweDU5RkIsMHg1QjY5LDB4NUJBMywweDVCQTYsMHg1QkE0LC8qIDB4QzAtMHhDNyAqLworCTB4NUJBMiwweDVCQTUsMHg1QzAxLDB4NUM0RSwweDVDNEYsMHg1QzRELDB4NUM0QiwweDVDRDksLyogMHhDOC0weENGICovCisJMHg1Q0QyLDB4NURGNywweDVFMUQsMHg1RTI1LDB4NUUxRiwweDVFN0QsMHg1RUEwLDB4NUVBNiwvKiAweEQwLTB4RDcgKi8KKwkweDVFRkEsMHg1RjA4LDB4NUYyRCwweDVGNjUsMHg1Rjg4LDB4NUY4NSwweDVGOEEsMHg1RjhCLC8qIDB4RDgtMHhERiAqLworCTB4NUY4NywweDVGOEMsMHg1Rjg5LDB4NjAxMiwweDYwMUQsMHg2MDIwLDB4NjAyNSwweDYwMEUsLyogMHhFMC0weEU3ICovCisJMHg2MDI4LDB4NjA0RCwweDYwNzAsMHg2MDY4LDB4NjA2MiwweDYwNDYsMHg2MDQzLDB4NjA2QywvKiAweEU4LTB4RUYgKi8KKwkweDYwNkIsMHg2MDZBLDB4NjA2NCwweDYyNDEsMHg2MkRDLDB4NjMxNiwweDYzMDksMHg2MkZDLC8qIDB4RjAtMHhGNyAqLworCTB4NjJFRCwweDYzMDEsMHg2MkVFLDB4NjJGRCwweDYzMDcsMHg2MkYxLDB4NjJGNywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQUNbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg2MkVGLDB4NjJFQywweDYyRkUsMHg2MkY0LDB4NjMxMSwweDYzMDIsMHg2NTNGLDB4NjU0NSwvKiAweDQwLTB4NDcgKi8KKwkweDY1QUIsMHg2NUJELDB4NjVFMiwweDY2MjUsMHg2NjJELDB4NjYyMCwweDY2MjcsMHg2NjJGLC8qIDB4NDgtMHg0RiAqLworCTB4NjYxRiwweDY2MjgsMHg2NjMxLDB4NjYyNCwweDY2RjcsMHg2N0ZGLDB4NjdEMywweDY3RjEsLyogMHg1MC0weDU3ICovCisJMHg2N0Q0LDB4NjdEMCwweDY3RUMsMHg2N0I2LDB4NjdBRiwweDY3RjUsMHg2N0U5LDB4NjdFRiwvKiAweDU4LTB4NUYgKi8KKwkweDY3QzQsMHg2N0QxLDB4NjdCNCwweDY3REEsMHg2N0U1LDB4NjdCOCwweDY3Q0YsMHg2N0RFLC8qIDB4NjAtMHg2NyAqLworCTB4NjdGMywweDY3QjAsMHg2N0Q5LDB4NjdFMiwweDY3REQsMHg2N0QyLDB4NkI2QSwweDZCODMsLyogMHg2OC0weDZGICovCisJMHg2Qjg2LDB4NkJCNSwweDZCRDIsMHg2QkQ3LDB4NkMxRiwweDZDQzksMHg2RDBCLDB4NkQzMiwvKiAweDcwLTB4NzcgKi8KKwkweDZEMkEsMHg2RDQxLDB4NkQyNSwweDZEMEMsMHg2RDMxLDB4NkQxRSwweDZEMTcsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg2RDNCLDB4NkQzRCwweDZEM0UsMHg2RDM2LDB4NkQxQiwweDZDRjUsMHg2RDM5LC8qIDB4QTAtMHhBNyAqLworCTB4NkQyNywweDZEMzgsMHg2RDI5LDB4NkQyRSwweDZEMzUsMHg2RDBFLDB4NkQyQiwweDcwQUIsLyogMHhBOC0weEFGICovCisJMHg3MEJBLDB4NzBCMywweDcwQUMsMHg3MEFGLDB4NzBBRCwweDcwQjgsMHg3MEFFLDB4NzBBNCwvKiAweEIwLTB4QjcgKi8KKwkweDcyMzAsMHg3MjcyLDB4NzI2RiwweDcyNzQsMHg3MkU5LDB4NzJFMCwweDcyRTEsMHg3M0I3LC8qIDB4QjgtMHhCRiAqLworCTB4NzNDQSwweDczQkIsMHg3M0IyLDB4NzNDRCwweDczQzAsMHg3M0IzLDB4NzUxQSwweDc1MkQsLyogMHhDMC0weEM3ICovCisJMHg3NTRGLDB4NzU0QywweDc1NEUsMHg3NTRCLDB4NzVBQiwweDc1QTQsMHg3NUE1LDB4NzVBMiwvKiAweEM4LTB4Q0YgKi8KKwkweDc1QTMsMHg3Njc4LDB4NzY4NiwweDc2ODcsMHg3Njg4LDB4NzZDOCwweDc2QzYsMHg3NkMzLC8qIDB4RDAtMHhENyAqLworCTB4NzZDNSwweDc3MDEsMHg3NkY5LDB4NzZGOCwweDc3MDksMHg3NzBCLDB4NzZGRSwweDc2RkMsLyogMHhEOC0weERGICovCisJMHg3NzA3LDB4NzdEQywweDc4MDIsMHg3ODE0LDB4NzgwQywweDc4MEQsMHg3OTQ2LDB4Nzk0OSwvKiAweEUwLTB4RTcgKi8KKwkweDc5NDgsMHg3OTQ3LDB4NzlCOSwweDc5QkEsMHg3OUQxLDB4NzlEMiwweDc5Q0IsMHg3QTdGLC8qIDB4RTgtMHhFRiAqLworCTB4N0E4MSwweDdBRkYsMHg3QUZELDB4N0M3RCwweDdEMDIsMHg3RDA1LDB4N0QwMCwweDdEMDksLyogMHhGMC0weEY3ICovCisJMHg3RDA3LDB4N0QwNCwweDdEMDYsMHg3RjM4LDB4N0Y4RSwweDdGQkYsMHg4MDA0LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9BRFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDgwMTAsMHg4MDBELDB4ODAxMSwweDgwMzYsMHg4MEQ2LDB4ODBFNSwweDgwREEsMHg4MEMzLC8qIDB4NDAtMHg0NyAqLworCTB4ODBDNCwweDgwQ0MsMHg4MEUxLDB4ODBEQiwweDgwQ0UsMHg4MERFLDB4ODBFNCwweDgwREQsLyogMHg0OC0weDRGICovCisJMHg4MUY0LDB4ODIyMiwweDgyRTcsMHg4MzAzLDB4ODMwNSwweDgyRTMsMHg4MkRCLDB4ODJFNiwvKiAweDUwLTB4NTcgKi8KKwkweDgzMDQsMHg4MkU1LDB4ODMwMiwweDgzMDksMHg4MkQyLDB4ODJENywweDgyRjEsMHg4MzAxLC8qIDB4NTgtMHg1RiAqLworCTB4ODJEQywweDgyRDQsMHg4MkQxLDB4ODJERSwweDgyRDMsMHg4MkRGLDB4ODJFRiwweDgzMDYsLyogMHg2MC0weDY3ICovCisJMHg4NjUwLDB4ODY3OSwweDg2N0IsMHg4NjdBLDB4ODg0RCwweDg4NkIsMHg4OTgxLDB4ODlENCwvKiAweDY4LTB4NkYgKi8KKwkweDhBMDgsMHg4QTAyLDB4OEEwMywweDhDOUUsMHg4Q0EwLDB4OEQ3NCwweDhENzMsMHg4REI0LC8qIDB4NzAtMHg3NyAqLworCTB4OEVDRCwweDhFQ0MsMHg4RkYwLDB4OEZFNiwweDhGRTIsMHg4RkVBLDB4OEZFNSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDhGRUQsMHg4RkVCLDB4OEZFNCwweDhGRTgsMHg5MENBLDB4OTBDRSwweDkwQzEsLyogMHhBMC0weEE3ICovCisJMHg5MEMzLDB4OTE0QiwweDkxNEEsMHg5MUNELDB4OTU4MiwweDk2NTAsMHg5NjRCLDB4OTY0QywvKiAweEE4LTB4QUYgKi8KKwkweDk2NEQsMHg5NzYyLDB4OTc2OSwweDk3Q0IsMHg5N0VELDB4OTdGMywweDk4MDEsMHg5OEE4LC8qIDB4QjAtMHhCNyAqLworCTB4OThEQiwweDk4REYsMHg5OTk2LDB4OTk5OSwweDRFNTgsMHg0RUIzLDB4NTAwQywweDUwMEQsLyogMHhCOC0weEJGICovCisJMHg1MDIzLDB4NEZFRiwweDUwMjYsMHg1MDI1LDB4NEZGOCwweDUwMjksMHg1MDE2LDB4NTAwNiwvKiAweEMwLTB4QzcgKi8KKwkweDUwM0MsMHg1MDFGLDB4NTAxQSwweDUwMTIsMHg1MDExLDB4NEZGQSwweDUwMDAsMHg1MDE0LC8qIDB4QzgtMHhDRiAqLworCTB4NTAyOCwweDRGRjEsMHg1MDIxLDB4NTAwQiwweDUwMTksMHg1MDE4LDB4NEZGMywweDRGRUUsLyogMHhEMC0weEQ3ICovCisJMHg1MDJELDB4NTAyQSwweDRGRkUsMHg1MDJCLDB4NTAwOSwweDUxN0MsMHg1MUE0LDB4NTFBNSwvKiAweEQ4LTB4REYgKi8KKwkweDUxQTIsMHg1MUNELDB4NTFDQywweDUxQzYsMHg1MUNCLDB4NTI1NiwweDUyNUMsMHg1MjU0LC8qIDB4RTAtMHhFNyAqLworCTB4NTI1QiwweDUyNUQsMHg1MzJBLDB4NTM3RiwweDUzOUYsMHg1MzlELDB4NTNERiwweDU0RTgsLyogMHhFOC0weEVGICovCisJMHg1NTEwLDB4NTUwMSwweDU1MzcsMHg1NEZDLDB4NTRFNSwweDU0RjIsMHg1NTA2LDB4NTRGQSwvKiAweEYwLTB4RjcgKi8KKwkweDU1MTQsMHg1NEU5LDB4NTRFRCwweDU0RTEsMHg1NTA5LDB4NTRFRSwweDU0RUEsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0FFWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NTRFNiwweDU1MjcsMHg1NTA3LDB4NTRGRCwweDU1MEYsMHg1NzAzLDB4NTcwNCwweDU3QzIsLyogMHg0MC0weDQ3ICovCisJMHg1N0Q0LDB4NTdDQiwweDU3QzMsMHg1ODA5LDB4NTkwRiwweDU5NTcsMHg1OTU4LDB4NTk1QSwvKiAweDQ4LTB4NEYgKi8KKwkweDVBMTEsMHg1QTE4LDB4NUExQywweDVBMUYsMHg1QTFCLDB4NUExMywweDU5RUMsMHg1QTIwLC8qIDB4NTAtMHg1NyAqLworCTB4NUEyMywweDVBMjksMHg1QTI1LDB4NUEwQywweDVBMDksMHg1QjZCLDB4NUM1OCwweDVCQjAsLyogMHg1OC0weDVGICovCisJMHg1QkIzLDB4NUJCNiwweDVCQjQsMHg1QkFFLDB4NUJCNSwweDVCQjksMHg1QkI4LDB4NUMwNCwvKiAweDYwLTB4NjcgKi8KKwkweDVDNTEsMHg1QzU1LDB4NUM1MCwweDVDRUQsMHg1Q0ZELDB4NUNGQiwweDVDRUEsMHg1Q0U4LC8qIDB4NjgtMHg2RiAqLworCTB4NUNGMCwweDVDRjYsMHg1RDAxLDB4NUNGNCwweDVERUUsMHg1RTJELDB4NUUyQiwweDVFQUIsLyogMHg3MC0weDc3ICovCisJMHg1RUFELDB4NUVBNywweDVGMzEsMHg1RjkyLDB4NUY5MSwweDVGOTAsMHg2MDU5LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NjA2MywweDYwNjUsMHg2MDUwLDB4NjA1NSwweDYwNkQsMHg2MDY5LDB4NjA2RiwvKiAweEEwLTB4QTcgKi8KKwkweDYwODQsMHg2MDlGLDB4NjA5QSwweDYwOEQsMHg2MDk0LDB4NjA4QywweDYwODUsMHg2MDk2LC8qIDB4QTgtMHhBRiAqLworCTB4NjI0NywweDYyRjMsMHg2MzA4LDB4NjJGRiwweDYzNEUsMHg2MzNFLDB4NjMyRiwweDYzNTUsLyogMHhCMC0weEI3ICovCisJMHg2MzQyLDB4NjM0NiwweDYzNEYsMHg2MzQ5LDB4NjMzQSwweDYzNTAsMHg2MzNELDB4NjMyQSwvKiAweEI4LTB4QkYgKi8KKwkweDYzMkIsMHg2MzI4LDB4NjM0RCwweDYzNEMsMHg2NTQ4LDB4NjU0OSwweDY1OTksMHg2NUMxLC8qIDB4QzAtMHhDNyAqLworCTB4NjVDNSwweDY2NDIsMHg2NjQ5LDB4NjY0RiwweDY2NDMsMHg2NjUyLDB4NjY0QywweDY2NDUsLyogMHhDOC0weENGICovCisJMHg2NjQxLDB4NjZGOCwweDY3MTQsMHg2NzE1LDB4NjcxNywweDY4MjEsMHg2ODM4LDB4Njg0OCwvKiAweEQwLTB4RDcgKi8KKwkweDY4NDYsMHg2ODUzLDB4NjgzOSwweDY4NDIsMHg2ODU0LDB4NjgyOSwweDY4QjMsMHg2ODE3LC8qIDB4RDgtMHhERiAqLworCTB4Njg0QywweDY4NTEsMHg2ODNELDB4NjdGNCwweDY4NTAsMHg2ODQwLDB4NjgzQywweDY4NDMsLyogMHhFMC0weEU3ICovCisJMHg2ODJBLDB4Njg0NSwweDY4MTMsMHg2ODE4LDB4Njg0MSwweDZCOEEsMHg2Qjg5LDB4NkJCNywvKiAweEU4LTB4RUYgKi8KKwkweDZDMjMsMHg2QzI3LDB4NkMyOCwweDZDMjYsMHg2QzI0LDB4NkNGMCwweDZENkEsMHg2RDk1LC8qIDB4RjAtMHhGNyAqLworCTB4NkQ4OCwweDZEODcsMHg2RDY2LDB4NkQ3OCwweDZENzcsMHg2RDU5LDB4NkQ5MywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQUZbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg2RDZDLDB4NkQ4OSwweDZENkUsMHg2RDVBLDB4NkQ3NCwweDZENjksMHg2RDhDLDB4NkQ4QSwvKiAweDQwLTB4NDcgKi8KKwkweDZENzksMHg2RDg1LDB4NkQ2NSwweDZEOTQsMHg3MENBLDB4NzBEOCwweDcwRTQsMHg3MEQ5LC8qIDB4NDgtMHg0RiAqLworCTB4NzBDOCwweDcwQ0YsMHg3MjM5LDB4NzI3OSwweDcyRkMsMHg3MkY5LDB4NzJGRCwweDcyRjgsLyogMHg1MC0weDU3ICovCisJMHg3MkY3LDB4NzM4NiwweDczRUQsMHg3NDA5LDB4NzNFRSwweDczRTAsMHg3M0VBLDB4NzNERSwvKiAweDU4LTB4NUYgKi8KKwkweDc1NTQsMHg3NTVELDB4NzU1QywweDc1NUEsMHg3NTU5LDB4NzVCRSwweDc1QzUsMHg3NUM3LC8qIDB4NjAtMHg2NyAqLworCTB4NzVCMiwweDc1QjMsMHg3NUJELDB4NzVCQywweDc1QjksMHg3NUMyLDB4NzVCOCwweDc2OEIsLyogMHg2OC0weDZGICovCisJMHg3NkIwLDB4NzZDQSwweDc2Q0QsMHg3NkNFLDB4NzcyOSwweDc3MUYsMHg3NzIwLDB4NzcyOCwvKiAweDcwLTB4NzcgKi8KKwkweDc3RTksMHg3ODMwLDB4NzgyNywweDc4MzgsMHg3ODFELDB4NzgzNCwweDc4MzcsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg3ODI1LDB4NzgyRCwweDc4MjAsMHg3ODFGLDB4NzgzMiwweDc5NTUsMHg3OTUwLC8qIDB4QTAtMHhBNyAqLworCTB4Nzk2MCwweDc5NUYsMHg3OTU2LDB4Nzk1RSwweDc5NUQsMHg3OTU3LDB4Nzk1QSwweDc5RTQsLyogMHhBOC0weEFGICovCisJMHg3OUUzLDB4NzlFNywweDc5REYsMHg3OUU2LDB4NzlFOSwweDc5RDgsMHg3QTg0LDB4N0E4OCwvKiAweEIwLTB4QjcgKi8KKwkweDdBRDksMHg3QjA2LDB4N0IxMSwweDdDODksMHg3RDIxLDB4N0QxNywweDdEMEIsMHg3RDBBLC8qIDB4QjgtMHhCRiAqLworCTB4N0QyMCwweDdEMjIsMHg3RDE0LDB4N0QxMCwweDdEMTUsMHg3RDFBLDB4N0QxQywweDdEMEQsLyogMHhDMC0weEM3ICovCisJMHg3RDE5LDB4N0QxQiwweDdGM0EsMHg3RjVGLDB4N0Y5NCwweDdGQzUsMHg3RkMxLDB4ODAwNiwvKiAweEM4LTB4Q0YgKi8KKwkweDgwMTgsMHg4MDE1LDB4ODAxOSwweDgwMTcsMHg4MDNELDB4ODAzRiwweDgwRjEsMHg4MTAyLC8qIDB4RDAtMHhENyAqLworCTB4ODBGMCwweDgxMDUsMHg4MEVELDB4ODBGNCwweDgxMDYsMHg4MEY4LDB4ODBGMywweDgxMDgsLyogMHhEOC0weERGICovCisJMHg4MEZELDB4ODEwQSwweDgwRkMsMHg4MEVGLDB4ODFFRCwweDgxRUMsMHg4MjAwLDB4ODIxMCwvKiAweEUwLTB4RTcgKi8KKwkweDgyMkEsMHg4MjJCLDB4ODIyOCwweDgyMkMsMHg4MkJCLDB4ODMyQiwweDgzNTIsMHg4MzU0LC8qIDB4RTgtMHhFRiAqLworCTB4ODM0QSwweDgzMzgsMHg4MzUwLDB4ODM0OSwweDgzMzUsMHg4MzM0LDB4ODM0RiwweDgzMzIsLyogMHhGMC0weEY3ICovCisJMHg4MzM5LDB4ODMzNiwweDgzMTcsMHg4MzQwLDB4ODMzMSwweDgzMjgsMHg4MzQzLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9CMFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDg2NTQsMHg4NjhBLDB4ODZBQSwweDg2OTMsMHg4NkE0LDB4ODZBOSwweDg2OEMsMHg4NkEzLC8qIDB4NDAtMHg0NyAqLworCTB4ODY5QywweDg4NzAsMHg4ODc3LDB4ODg4MSwweDg4ODIsMHg4ODdELDB4ODg3OSwweDhBMTgsLyogMHg0OC0weDRGICovCisJMHg4QTEwLDB4OEEwRSwweDhBMEMsMHg4QTE1LDB4OEEwQSwweDhBMTcsMHg4QTEzLDB4OEExNiwvKiAweDUwLTB4NTcgKi8KKwkweDhBMEYsMHg4QTExLDB4OEM0OCwweDhDN0EsMHg4Qzc5LDB4OENBMSwweDhDQTIsMHg4RDc3LC8qIDB4NTgtMHg1RiAqLworCTB4OEVBQywweDhFRDIsMHg4RUQ0LDB4OEVDRiwweDhGQjEsMHg5MDAxLDB4OTAwNiwweDhGRjcsLyogMHg2MC0weDY3ICovCisJMHg5MDAwLDB4OEZGQSwweDhGRjQsMHg5MDAzLDB4OEZGRCwweDkwMDUsMHg4RkY4LDB4OTA5NSwvKiAweDY4LTB4NkYgKi8KKwkweDkwRTEsMHg5MERELDB4OTBFMiwweDkxNTIsMHg5MTRELDB4OTE0QywweDkxRDgsMHg5MURELC8qIDB4NzAtMHg3NyAqLworCTB4OTFENywweDkxREMsMHg5MUQ5LDB4OTU4MywweDk2NjIsMHg5NjYzLDB4OTY2MSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDk2NUIsMHg5NjVELDB4OTY2NCwweDk2NTgsMHg5NjVFLDB4OTZCQiwweDk4RTIsLyogMHhBMC0weEE3ICovCisJMHg5OUFDLDB4OUFBOCwweDlBRDgsMHg5QjI1LDB4OUIzMiwweDlCM0MsMHg0RTdFLDB4NTA3QSwvKiAweEE4LTB4QUYgKi8KKwkweDUwN0QsMHg1MDVDLDB4NTA0NywweDUwNDMsMHg1MDRDLDB4NTA1QSwweDUwNDksMHg1MDY1LC8qIDB4QjAtMHhCNyAqLworCTB4NTA3NiwweDUwNEUsMHg1MDU1LDB4NTA3NSwweDUwNzQsMHg1MDc3LDB4NTA0RiwweDUwMEYsLyogMHhCOC0weEJGICovCisJMHg1MDZGLDB4NTA2RCwweDUxNUMsMHg1MTk1LDB4NTFGMCwweDUyNkEsMHg1MjZGLDB4NTJEMiwvKiAweEMwLTB4QzcgKi8KKwkweDUyRDksMHg1MkQ4LDB4NTJENSwweDUzMTAsMHg1MzBGLDB4NTMxOSwweDUzM0YsMHg1MzQwLC8qIDB4QzgtMHhDRiAqLworCTB4NTMzRSwweDUzQzMsMHg2NkZDLDB4NTU0NiwweDU1NkEsMHg1NTY2LDB4NTU0NCwweDU1NUUsLyogMHhEMC0weEQ3ICovCisJMHg1NTYxLDB4NTU0MywweDU1NEEsMHg1NTMxLDB4NTU1NiwweDU1NEYsMHg1NTU1LDB4NTUyRiwvKiAweEQ4LTB4REYgKi8KKwkweDU1NjQsMHg1NTM4LDB4NTUyRSwweDU1NUMsMHg1NTJDLDB4NTU2MywweDU1MzMsMHg1NTQxLC8qIDB4RTAtMHhFNyAqLworCTB4NTU1NywweDU3MDgsMHg1NzBCLDB4NTcwOSwweDU3REYsMHg1ODA1LDB4NTgwQSwweDU4MDYsLyogMHhFOC0weEVGICovCisJMHg1N0UwLDB4NTdFNCwweDU3RkEsMHg1ODAyLDB4NTgzNSwweDU3RjcsMHg1N0Y5LDB4NTkyMCwvKiAweEYwLTB4RjcgKi8KKwkweDU5NjIsMHg1QTM2LDB4NUE0MSwweDVBNDksMHg1QTY2LDB4NUE2QSwweDVBNDAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0IxWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NUEzQywweDVBNjIsMHg1QTVBLDB4NUE0NiwweDVBNEEsMHg1QjcwLDB4NUJDNywweDVCQzUsLyogMHg0MC0weDQ3ICovCisJMHg1QkM0LDB4NUJDMiwweDVCQkYsMHg1QkM2LDB4NUMwOSwweDVDMDgsMHg1QzA3LDB4NUM2MCwvKiAweDQ4LTB4NEYgKi8KKwkweDVDNUMsMHg1QzVELDB4NUQwNywweDVEMDYsMHg1RDBFLDB4NUQxQiwweDVEMTYsMHg1RDIyLC8qIDB4NTAtMHg1NyAqLworCTB4NUQxMSwweDVEMjksMHg1RDE0LDB4NUQxOSwweDVEMjQsMHg1RDI3LDB4NUQxNywweDVERTIsLyogMHg1OC0weDVGICovCisJMHg1RTM4LDB4NUUzNiwweDVFMzMsMHg1RTM3LDB4NUVCNywweDVFQjgsMHg1RUI2LDB4NUVCNSwvKiAweDYwLTB4NjcgKi8KKwkweDVFQkUsMHg1RjM1LDB4NUYzNywweDVGNTcsMHg1RjZDLDB4NUY2OSwweDVGNkIsMHg1Rjk3LC8qIDB4NjgtMHg2RiAqLworCTB4NUY5OSwweDVGOUUsMHg1Rjk4LDB4NUZBMSwweDVGQTAsMHg1RjlDLDB4NjA3RiwweDYwQTMsLyogMHg3MC0weDc3ICovCisJMHg2MDg5LDB4NjBBMCwweDYwQTgsMHg2MENCLDB4NjBCNCwweDYwRTYsMHg2MEJELDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NjBDNSwweDYwQkIsMHg2MEI1LDB4NjBEQywweDYwQkMsMHg2MEQ4LDB4NjBENSwvKiAweEEwLTB4QTcgKi8KKwkweDYwQzYsMHg2MERGLDB4NjBCOCwweDYwREEsMHg2MEM3LDB4NjIxQSwweDYyMUIsMHg2MjQ4LC8qIDB4QTgtMHhBRiAqLworCTB4NjNBMCwweDYzQTcsMHg2MzcyLDB4NjM5NiwweDYzQTIsMHg2M0E1LDB4NjM3NywweDYzNjcsLyogMHhCMC0weEI3ICovCisJMHg2Mzk4LDB4NjNBQSwweDYzNzEsMHg2M0E5LDB4NjM4OSwweDYzODMsMHg2MzlCLDB4NjM2QiwvKiAweEI4LTB4QkYgKi8KKwkweDYzQTgsMHg2Mzg0LDB4NjM4OCwweDYzOTksMHg2M0ExLDB4NjNBQywweDYzOTIsMHg2MzhGLC8qIDB4QzAtMHhDNyAqLworCTB4NjM4MCwweDYzN0IsMHg2MzY5LDB4NjM2OCwweDYzN0EsMHg2NTVELDB4NjU1NiwweDY1NTEsLyogMHhDOC0weENGICovCisJMHg2NTU5LDB4NjU1NywweDU1NUYsMHg2NTRGLDB4NjU1OCwweDY1NTUsMHg2NTU0LDB4NjU5QywvKiAweEQwLTB4RDcgKi8KKwkweDY1OUIsMHg2NUFDLDB4NjVDRiwweDY1Q0IsMHg2NUNDLDB4NjVDRSwweDY2NUQsMHg2NjVBLC8qIDB4RDgtMHhERiAqLworCTB4NjY2NCwweDY2NjgsMHg2NjY2LDB4NjY1RSwweDY2RjksMHg1MkQ3LDB4NjcxQiwweDY4ODEsLyogMHhFMC0weEU3ICovCisJMHg2OEFGLDB4NjhBMiwweDY4OTMsMHg2OEI1LDB4Njg3RiwweDY4NzYsMHg2OEIxLDB4NjhBNywvKiAweEU4LTB4RUYgKi8KKwkweDY4OTcsMHg2OEIwLDB4Njg4MywweDY4QzQsMHg2OEFELDB4Njg4NiwweDY4ODUsMHg2ODk0LC8qIDB4RjAtMHhGNyAqLworCTB4Njg5RCwweDY4QTgsMHg2ODlGLDB4NjhBMSwweDY4ODIsMHg2QjMyLDB4NkJCQSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQjJbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg2QkVCLDB4NkJFQywweDZDMkIsMHg2RDhFLDB4NkRCQywweDZERjMsMHg2REQ5LDB4NkRCMiwvKiAweDQwLTB4NDcgKi8KKwkweDZERTEsMHg2RENDLDB4NkRFNCwweDZERkIsMHg2REZBLDB4NkUwNSwweDZEQzcsMHg2RENCLC8qIDB4NDgtMHg0RiAqLworCTB4NkRBRiwweDZERDEsMHg2REFFLDB4NkRERSwweDZERjksMHg2REI4LDB4NkRGNywweDZERjUsLyogMHg1MC0weDU3ICovCisJMHg2REM1LDB4NkREMiwweDZFMUEsMHg2REI1LDB4NkREQSwweDZERUIsMHg2REQ4LDB4NkRFQSwvKiAweDU4LTB4NUYgKi8KKwkweDZERjEsMHg2REVFLDB4NkRFOCwweDZEQzYsMHg2REM0LDB4NkRBQSwweDZERUMsMHg2REJGLC8qIDB4NjAtMHg2NyAqLworCTB4NkRFNiwweDcwRjksMHg3MTA5LDB4NzEwQSwweDcwRkQsMHg3MEVGLDB4NzIzRCwweDcyN0QsLyogMHg2OC0weDZGICovCisJMHg3MjgxLDB4NzMxQywweDczMUIsMHg3MzE2LDB4NzMxMywweDczMTksMHg3Mzg3LDB4NzQwNSwvKiAweDcwLTB4NzcgKi8KKwkweDc0MEEsMHg3NDAzLDB4NzQwNiwweDczRkUsMHg3NDBELDB4NzRFMCwweDc0RjYsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg3NEY3LDB4NzUxQywweDc1MjIsMHg3NTY1LDB4NzU2NiwweDc1NjIsMHg3NTcwLC8qIDB4QTAtMHhBNyAqLworCTB4NzU4RiwweDc1RDQsMHg3NUQ1LDB4NzVCNSwweDc1Q0EsMHg3NUNELDB4NzY4RSwweDc2RDQsLyogMHhBOC0weEFGICovCisJMHg3NkQyLDB4NzZEQiwweDc3MzcsMHg3NzNFLDB4NzczQywweDc3MzYsMHg3NzM4LDB4NzczQSwvKiAweEIwLTB4QjcgKi8KKwkweDc4NkIsMHg3ODQzLDB4Nzg0RSwweDc5NjUsMHg3OTY4LDB4Nzk2RCwweDc5RkIsMHg3QTkyLC8qIDB4QjgtMHhCRiAqLworCTB4N0E5NSwweDdCMjAsMHg3QjI4LDB4N0IxQiwweDdCMkMsMHg3QjI2LDB4N0IxOSwweDdCMUUsLyogMHhDMC0weEM3ICovCisJMHg3QjJFLDB4N0M5MiwweDdDOTcsMHg3Qzk1LDB4N0Q0NiwweDdENDMsMHg3RDcxLDB4N0QyRSwvKiAweEM4LTB4Q0YgKi8KKwkweDdEMzksMHg3RDNDLDB4N0Q0MCwweDdEMzAsMHg3RDMzLDB4N0Q0NCwweDdEMkYsMHg3RDQyLC8qIDB4RDAtMHhENyAqLworCTB4N0QzMiwweDdEMzEsMHg3RjNELDB4N0Y5RSwweDdGOUEsMHg3RkNDLDB4N0ZDRSwweDdGRDIsLyogMHhEOC0weERGICovCisJMHg4MDFDLDB4ODA0QSwweDgwNDYsMHg4MTJGLDB4ODExNiwweDgxMjMsMHg4MTJCLDB4ODEyOSwvKiAweEUwLTB4RTcgKi8KKwkweDgxMzAsMHg4MTI0LDB4ODIwMiwweDgyMzUsMHg4MjM3LDB4ODIzNiwweDgyMzksMHg4MzhFLC8qIDB4RTgtMHhFRiAqLworCTB4ODM5RSwweDgzOTgsMHg4Mzc4LDB4ODNBMiwweDgzOTYsMHg4M0JELDB4ODNBQiwweDgzOTIsLyogMHhGMC0weEY3ICovCisJMHg4MzhBLDB4ODM5MywweDgzODksMHg4M0EwLDB4ODM3NywweDgzN0IsMHg4MzdDLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9CM1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDgzODYsMHg4M0E3LDB4ODY1NSwweDVGNkEsMHg4NkM3LDB4ODZDMCwweDg2QjYsMHg4NkM0LC8qIDB4NDAtMHg0NyAqLworCTB4ODZCNSwweDg2QzYsMHg4NkNCLDB4ODZCMSwweDg2QUYsMHg4NkM5LDB4ODg1MywweDg4OUUsLyogMHg0OC0weDRGICovCisJMHg4ODg4LDB4ODhBQiwweDg4OTIsMHg4ODk2LDB4ODg4RCwweDg4OEIsMHg4OTkzLDB4ODk4RiwvKiAweDUwLTB4NTcgKi8KKwkweDhBMkEsMHg4QTFELDB4OEEyMywweDhBMjUsMHg4QTMxLDB4OEEyRCwweDhBMUYsMHg4QTFCLC8qIDB4NTgtMHg1RiAqLworCTB4OEEyMiwweDhDNDksMHg4QzVBLDB4OENBOSwweDhDQUMsMHg4Q0FCLDB4OENBOCwweDhDQUEsLyogMHg2MC0weDY3ICovCisJMHg4Q0E3LDB4OEQ2NywweDhENjYsMHg4REJFLDB4OERCQSwweDhFREIsMHg4RURGLDB4OTAxOSwvKiAweDY4LTB4NkYgKi8KKwkweDkwMEQsMHg5MDFBLDB4OTAxNywweDkwMjMsMHg5MDFGLDB4OTAxRCwweDkwMTAsMHg5MDE1LC8qIDB4NzAtMHg3NyAqLworCTB4OTAxRSwweDkwMjAsMHg5MDBGLDB4OTAyMiwweDkwMTYsMHg5MDFCLDB4OTAxNCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDkwRTgsMHg5MEVELDB4OTBGRCwweDkxNTcsMHg5MUNFLDB4OTFGNSwweDkxRTYsLyogMHhBMC0weEE3ICovCisJMHg5MUUzLDB4OTFFNywweDkxRUQsMHg5MUU5LDB4OTU4OSwweDk2NkEsMHg5Njc1LDB4OTY3MywvKiAweEE4LTB4QUYgKi8KKwkweDk2NzgsMHg5NjcwLDB4OTY3NCwweDk2NzYsMHg5Njc3LDB4OTY2QywweDk2QzAsMHg5NkVBLC8qIDB4QjAtMHhCNyAqLworCTB4OTZFOSwweDdBRTAsMHg3QURGLDB4OTgwMiwweDk4MDMsMHg5QjVBLDB4OUNFNSwweDlFNzUsLyogMHhCOC0weEJGICovCisJMHg5RTdGLDB4OUVBNSwweDlFQkIsMHg1MEEyLDB4NTA4RCwweDUwODUsMHg1MDk5LDB4NTA5MSwvKiAweEMwLTB4QzcgKi8KKwkweDUwODAsMHg1MDk2LDB4NTA5OCwweDUwOUEsMHg2NzAwLDB4NTFGMSwweDUyNzIsMHg1Mjc0LC8qIDB4QzgtMHhDRiAqLworCTB4NTI3NSwweDUyNjksMHg1MkRFLDB4NTJERCwweDUyREIsMHg1MzVBLDB4NTNBNSwweDU1N0IsLyogMHhEMC0weEQ3ICovCisJMHg1NTgwLDB4NTVBNywweDU1N0MsMHg1NThBLDB4NTU5RCwweDU1OTgsMHg1NTgyLDB4NTU5QywvKiAweEQ4LTB4REYgKi8KKwkweDU1QUEsMHg1NTk0LDB4NTU4NywweDU1OEIsMHg1NTgzLDB4NTVCMywweDU1QUUsMHg1NTlGLC8qIDB4RTAtMHhFNyAqLworCTB4NTUzRSwweDU1QjIsMHg1NTlBLDB4NTVCQiwweDU1QUMsMHg1NUIxLDB4NTU3RSwweDU1ODksLyogMHhFOC0weEVGICovCisJMHg1NUFCLDB4NTU5OSwweDU3MEQsMHg1ODJGLDB4NTgyQSwweDU4MzQsMHg1ODI0LDB4NTgzMCwvKiAweEYwLTB4RjcgKi8KKwkweDU4MzEsMHg1ODIxLDB4NTgxRCwweDU4MjAsMHg1OEY5LDB4NThGQSwweDU5NjAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0I0WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NUE3NywweDVBOUEsMHg1QTdGLDB4NUE5MiwweDVBOUIsMHg1QUE3LDB4NUI3MywweDVCNzEsLyogMHg0MC0weDQ3ICovCisJMHg1QkQyLDB4NUJDQywweDVCRDMsMHg1QkQwLDB4NUMwQSwweDVDMEIsMHg1QzMxLDB4NUQ0QywvKiAweDQ4LTB4NEYgKi8KKwkweDVENTAsMHg1RDM0LDB4NUQ0NywweDVERkQsMHg1RTQ1LDB4NUUzRCwweDVFNDAsMHg1RTQzLC8qIDB4NTAtMHg1NyAqLworCTB4NUU3RSwweDVFQ0EsMHg1RUMxLDB4NUVDMiwweDVFQzQsMHg1RjNDLDB4NUY2RCwweDVGQTksLyogMHg1OC0weDVGICovCisJMHg1RkFBLDB4NUZBOCwweDYwRDEsMHg2MEUxLDB4NjBCMiwweDYwQjYsMHg2MEUwLDB4NjExQywvKiAweDYwLTB4NjcgKi8KKwkweDYxMjMsMHg2MEZBLDB4NjExNSwweDYwRjAsMHg2MEZCLDB4NjBGNCwweDYxNjgsMHg2MEYxLC8qIDB4NjgtMHg2RiAqLworCTB4NjEwRSwweDYwRjYsMHg2MTA5LDB4NjEwMCwweDYxMTIsMHg2MjFGLDB4NjI0OSwweDYzQTMsLyogMHg3MC0weDc3ICovCisJMHg2MzhDLDB4NjNDRiwweDYzQzAsMHg2M0U5LDB4NjNDOSwweDYzQzYsMHg2M0NELDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NjNEMiwweDYzRTMsMHg2M0QwLDB4NjNFMSwweDYzRDYsMHg2M0VELDB4NjNFRSwvKiAweEEwLTB4QTcgKi8KKwkweDYzNzYsMHg2M0Y0LDB4NjNFQSwweDYzREIsMHg2NDUyLDB4NjNEQSwweDYzRjksMHg2NTVFLC8qIDB4QTgtMHhBRiAqLworCTB4NjU2NiwweDY1NjIsMHg2NTYzLDB4NjU5MSwweDY1OTAsMHg2NUFGLDB4NjY2RSwweDY2NzAsLyogMHhCMC0weEI3ICovCisJMHg2Njc0LDB4NjY3NiwweDY2NkYsMHg2NjkxLDB4NjY3QSwweDY2N0UsMHg2Njc3LDB4NjZGRSwvKiAweEI4LTB4QkYgKi8KKwkweDY2RkYsMHg2NzFGLDB4NjcxRCwweDY4RkEsMHg2OEQ1LDB4NjhFMCwweDY4RDgsMHg2OEQ3LC8qIDB4QzAtMHhDNyAqLworCTB4NjkwNSwweDY4REYsMHg2OEY1LDB4NjhFRSwweDY4RTcsMHg2OEY5LDB4NjhEMiwweDY4RjIsLyogMHhDOC0weENGICovCisJMHg2OEUzLDB4NjhDQiwweDY4Q0QsMHg2OTBELDB4NjkxMiwweDY5MEUsMHg2OEM5LDB4NjhEQSwvKiAweEQwLTB4RDcgKi8KKwkweDY5NkUsMHg2OEZCLDB4NkIzRSwweDZCM0EsMHg2QjNELDB4NkI5OCwweDZCOTYsMHg2QkJDLC8qIDB4RDgtMHhERiAqLworCTB4NkJFRiwweDZDMkUsMHg2QzJGLDB4NkMyQywweDZFMkYsMHg2RTM4LDB4NkU1NCwweDZFMjEsLyogMHhFMC0weEU3ICovCisJMHg2RTMyLDB4NkU2NywweDZFNEEsMHg2RTIwLDB4NkUyNSwweDZFMjMsMHg2RTFCLDB4NkU1QiwvKiAweEU4LTB4RUYgKi8KKwkweDZFNTgsMHg2RTI0LDB4NkU1NiwweDZFNkUsMHg2RTJELDB4NkUyNiwweDZFNkYsMHg2RTM0LC8qIDB4RjAtMHhGNyAqLworCTB4NkU0RCwweDZFM0EsMHg2RTJDLDB4NkU0MywweDZFMUQsMHg2RTNFLDB4NkVDQiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQjVbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg2RTg5LDB4NkUxOSwweDZFNEUsMHg2RTYzLDB4NkU0NCwweDZFNzIsMHg2RTY5LDB4NkU1RiwvKiAweDQwLTB4NDcgKi8KKwkweDcxMTksMHg3MTFBLDB4NzEyNiwweDcxMzAsMHg3MTIxLDB4NzEzNiwweDcxNkUsMHg3MTFDLC8qIDB4NDgtMHg0RiAqLworCTB4NzI0QywweDcyODQsMHg3MjgwLDB4NzMzNiwweDczMjUsMHg3MzM0LDB4NzMyOSwweDc0M0EsLyogMHg1MC0weDU3ICovCisJMHg3NDJBLDB4NzQzMywweDc0MjIsMHg3NDI1LDB4NzQzNSwweDc0MzYsMHg3NDM0LDB4NzQyRiwvKiAweDU4LTB4NUYgKi8KKwkweDc0MUIsMHg3NDI2LDB4NzQyOCwweDc1MjUsMHg3NTI2LDB4NzU2QiwweDc1NkEsMHg3NUUyLC8qIDB4NjAtMHg2NyAqLworCTB4NzVEQiwweDc1RTMsMHg3NUQ5LDB4NzVEOCwweDc1REUsMHg3NUUwLDB4NzY3QiwweDc2N0MsLyogMHg2OC0weDZGICovCisJMHg3Njk2LDB4NzY5MywweDc2QjQsMHg3NkRDLDB4Nzc0RiwweDc3RUQsMHg3ODVELDB4Nzg2QywvKiAweDcwLTB4NzcgKi8KKwkweDc4NkYsMHg3QTBELDB4N0EwOCwweDdBMEIsMHg3QTA1LDB4N0EwMCwweDdBOTgsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg3QTk3LDB4N0E5NiwweDdBRTUsMHg3QUUzLDB4N0I0OSwweDdCNTYsMHg3QjQ2LC8qIDB4QTAtMHhBNyAqLworCTB4N0I1MCwweDdCNTIsMHg3QjU0LDB4N0I0RCwweDdCNEIsMHg3QjRGLDB4N0I1MSwweDdDOUYsLyogMHhBOC0weEFGICovCisJMHg3Q0E1LDB4N0Q1RSwweDdENTAsMHg3RDY4LDB4N0Q1NSwweDdEMkIsMHg3RDZFLDB4N0Q3MiwvKiAweEIwLTB4QjcgKi8KKwkweDdENjEsMHg3RDY2LDB4N0Q2MiwweDdENzAsMHg3RDczLDB4NTU4NCwweDdGRDQsMHg3RkQ1LC8qIDB4QjgtMHhCRiAqLworCTB4ODAwQiwweDgwNTIsMHg4MDg1LDB4ODE1NSwweDgxNTQsMHg4MTRCLDB4ODE1MSwweDgxNEUsLyogMHhDMC0weEM3ICovCisJMHg4MTM5LDB4ODE0NiwweDgxM0UsMHg4MTRDLDB4ODE1MywweDgxNzQsMHg4MjEyLDB4ODIxQywvKiAweEM4LTB4Q0YgKi8KKwkweDgzRTksMHg4NDAzLDB4ODNGOCwweDg0MEQsMHg4M0UwLDB4ODNDNSwweDg0MEIsMHg4M0MxLC8qIDB4RDAtMHhENyAqLworCTB4ODNFRiwweDgzRjEsMHg4M0Y0LDB4ODQ1NywweDg0MEEsMHg4M0YwLDB4ODQwQywweDgzQ0MsLyogMHhEOC0weERGICovCisJMHg4M0ZELDB4ODNGMiwweDgzQ0EsMHg4NDM4LDB4ODQwRSwweDg0MDQsMHg4M0RDLDB4ODQwNywvKiAweEUwLTB4RTcgKi8KKwkweDgzRDQsMHg4M0RGLDB4ODY1QiwweDg2REYsMHg4NkQ5LDB4ODZFRCwweDg2RDQsMHg4NkRCLC8qIDB4RTgtMHhFRiAqLworCTB4ODZFNCwweDg2RDAsMHg4NkRFLDB4ODg1NywweDg4QzEsMHg4OEMyLDB4ODhCMSwweDg5ODMsLyogMHhGMC0weEY3ICovCisJMHg4OTk2LDB4OEEzQiwweDhBNjAsMHg4QTU1LDB4OEE1RSwweDhBM0MsMHg4QTQxLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9CNlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDhBNTQsMHg4QTVCLDB4OEE1MCwweDhBNDYsMHg4QTM0LDB4OEEzQSwweDhBMzYsMHg4QTU2LC8qIDB4NDAtMHg0NyAqLworCTB4OEM2MSwweDhDODIsMHg4Q0FGLDB4OENCQywweDhDQjMsMHg4Q0JELDB4OENDMSwweDhDQkIsLyogMHg0OC0weDRGICovCisJMHg4Q0MwLDB4OENCNCwweDhDQjcsMHg4Q0I2LDB4OENCRiwweDhDQjgsMHg4RDhBLDB4OEQ4NSwvKiAweDUwLTB4NTcgKi8KKwkweDhEODEsMHg4RENFLDB4OERERCwweDhEQ0IsMHg4RERBLDB4OEREMSwweDhEQ0MsMHg4RERCLC8qIDB4NTgtMHg1RiAqLworCTB4OERDNiwweDhFRkIsMHg4RUY4LDB4OEVGQywweDhGOUMsMHg5MDJFLDB4OTAzNSwweDkwMzEsLyogMHg2MC0weDY3ICovCisJMHg5MDM4LDB4OTAzMiwweDkwMzYsMHg5MTAyLDB4OTBGNSwweDkxMDksMHg5MEZFLDB4OTE2MywvKiAweDY4LTB4NkYgKi8KKwkweDkxNjUsMHg5MUNGLDB4OTIxNCwweDkyMTUsMHg5MjIzLDB4OTIwOSwweDkyMUUsMHg5MjBELC8qIDB4NzAtMHg3NyAqLworCTB4OTIxMCwweDkyMDcsMHg5MjExLDB4OTU5NCwweDk1OEYsMHg5NThCLDB4OTU5MSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDk1OTMsMHg5NTkyLDB4OTU4RSwweDk2OEEsMHg5NjhFLDB4OTY4QiwweDk2N0QsLyogMHhBMC0weEE3ICovCisJMHg5Njg1LDB4OTY4NiwweDk2OEQsMHg5NjcyLDB4OTY4NCwweDk2QzEsMHg5NkM1LDB4OTZDNCwvKiAweEE4LTB4QUYgKi8KKwkweDk2QzYsMHg5NkM3LDB4OTZFRiwweDk2RjIsMHg5N0NDLDB4OTgwNSwweDk4MDYsMHg5ODA4LC8qIDB4QjAtMHhCNyAqLworCTB4OThFNywweDk4RUEsMHg5OEVGLDB4OThFOSwweDk4RjIsMHg5OEVELDB4OTlBRSwweDk5QUQsLyogMHhCOC0weEJGICovCisJMHg5RUMzLDB4OUVDRCwweDlFRDEsMHg0RTgyLDB4NTBBRCwweDUwQjUsMHg1MEIyLDB4NTBCMywvKiAweEMwLTB4QzcgKi8KKwkweDUwQzUsMHg1MEJFLDB4NTBBQywweDUwQjcsMHg1MEJCLDB4NTBBRiwweDUwQzcsMHg1MjdGLC8qIDB4QzgtMHhDRiAqLworCTB4NTI3NywweDUyN0QsMHg1MkRGLDB4NTJFNiwweDUyRTQsMHg1MkUyLDB4NTJFMywweDUzMkYsLyogMHhEMC0weEQ3ICovCisJMHg1NURGLDB4NTVFOCwweDU1RDMsMHg1NUU2LDB4NTVDRSwweDU1REMsMHg1NUM3LDB4NTVEMSwvKiAweEQ4LTB4REYgKi8KKwkweDU1RTMsMHg1NUU0LDB4NTVFRiwweDU1REEsMHg1NUUxLDB4NTVDNSwweDU1QzYsMHg1NUU1LC8qIDB4RTAtMHhFNyAqLworCTB4NTVDOSwweDU3MTIsMHg1NzEzLDB4NTg1RSwweDU4NTEsMHg1ODU4LDB4NTg1NywweDU4NUEsLyogMHhFOC0weEVGICovCisJMHg1ODU0LDB4NTg2QiwweDU4NEMsMHg1ODZELDB4NTg0QSwweDU4NjIsMHg1ODUyLDB4NTg0QiwvKiAweEYwLTB4RjcgKi8KKwkweDU5NjcsMHg1QUMxLDB4NUFDOSwweDVBQ0MsMHg1QUJFLDB4NUFCRCwweDVBQkMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0I3WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NUFCMywweDVBQzIsMHg1QUIyLDB4NUQ2OSwweDVENkYsMHg1RTRDLDB4NUU3OSwweDVFQzksLyogMHg0MC0weDQ3ICovCisJMHg1RUM4LDB4NUYxMiwweDVGNTksMHg1RkFDLDB4NUZBRSwweDYxMUEsMHg2MTBGLDB4NjE0OCwvKiAweDQ4LTB4NEYgKi8KKwkweDYxMUYsMHg2MEYzLDB4NjExQiwweDYwRjksMHg2MTAxLDB4NjEwOCwweDYxNEUsMHg2MTRDLC8qIDB4NTAtMHg1NyAqLworCTB4NjE0NCwweDYxNEQsMHg2MTNFLDB4NjEzNCwweDYxMjcsMHg2MTBELDB4NjEwNiwweDYxMzcsLyogMHg1OC0weDVGICovCisJMHg2MjIxLDB4NjIyMiwweDY0MTMsMHg2NDNFLDB4NjQxRSwweDY0MkEsMHg2NDJELDB4NjQzRCwvKiAweDYwLTB4NjcgKi8KKwkweDY0MkMsMHg2NDBGLDB4NjQxQywweDY0MTQsMHg2NDBELDB4NjQzNiwweDY0MTYsMHg2NDE3LC8qIDB4NjgtMHg2RiAqLworCTB4NjQwNiwweDY1NkMsMHg2NTlGLDB4NjVCMCwweDY2OTcsMHg2Njg5LDB4NjY4NywweDY2ODgsLyogMHg3MC0weDc3ICovCisJMHg2Njk2LDB4NjY4NCwweDY2OTgsMHg2NjhELDB4NjcwMywweDY5OTQsMHg2OTZELDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4Njk1QSwweDY5NzcsMHg2OTYwLDB4Njk1NCwweDY5NzUsMHg2OTMwLDB4Njk4MiwvKiAweEEwLTB4QTcgKi8KKwkweDY5NEEsMHg2OTY4LDB4Njk2QiwweDY5NUUsMHg2OTUzLDB4Njk3OSwweDY5ODYsMHg2OTVELC8qIDB4QTgtMHhBRiAqLworCTB4Njk2MywweDY5NUIsMHg2QjQ3LDB4NkI3MiwweDZCQzAsMHg2QkJGLDB4NkJEMywweDZCRkQsLyogMHhCMC0weEI3ICovCisJMHg2RUEyLDB4NkVBRiwweDZFRDMsMHg2RUI2LDB4NkVDMiwweDZFOTAsMHg2RTlELDB4NkVDNywvKiAweEI4LTB4QkYgKi8KKwkweDZFQzUsMHg2RUE1LDB4NkU5OCwweDZFQkMsMHg2RUJBLDB4NkVBQiwweDZFRDEsMHg2RTk2LC8qIDB4QzAtMHhDNyAqLworCTB4NkU5QywweDZFQzQsMHg2RUQ0LDB4NkVBQSwweDZFQTcsMHg2RUI0LDB4NzE0RSwweDcxNTksLyogMHhDOC0weENGICovCisJMHg3MTY5LDB4NzE2NCwweDcxNDksMHg3MTY3LDB4NzE1QywweDcxNkMsMHg3MTY2LDB4NzE0QywvKiAweEQwLTB4RDcgKi8KKwkweDcxNjUsMHg3MTVFLDB4NzE0NiwweDcxNjgsMHg3MTU2LDB4NzIzQSwweDcyNTIsMHg3MzM3LC8qIDB4RDgtMHhERiAqLworCTB4NzM0NSwweDczM0YsMHg3MzNFLDB4NzQ2RiwweDc0NUEsMHg3NDU1LDB4NzQ1RiwweDc0NUUsLyogMHhFMC0weEU3ICovCisJMHg3NDQxLDB4NzQzRiwweDc0NTksMHg3NDVCLDB4NzQ1QywweDc1NzYsMHg3NTc4LDB4NzYwMCwvKiAweEU4LTB4RUYgKi8KKwkweDc1RjAsMHg3NjAxLDB4NzVGMiwweDc1RjEsMHg3NUZBLDB4NzVGRiwweDc1RjQsMHg3NUYzLC8qIDB4RjAtMHhGNyAqLworCTB4NzZERSwweDc2REYsMHg3NzVCLDB4Nzc2QiwweDc3NjYsMHg3NzVFLDB4Nzc2MywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQjhbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg3Nzc5LDB4Nzc2QSwweDc3NkMsMHg3NzVDLDB4Nzc2NSwweDc3NjgsMHg3NzYyLDB4NzdFRSwvKiAweDQwLTB4NDcgKi8KKwkweDc4OEUsMHg3OEIwLDB4Nzg5NywweDc4OTgsMHg3ODhDLDB4Nzg4OSwweDc4N0MsMHg3ODkxLC8qIDB4NDgtMHg0RiAqLworCTB4Nzg5MywweDc4N0YsMHg3OTdBLDB4Nzk3RiwweDc5ODEsMHg4NDJDLDB4NzlCRCwweDdBMUMsLyogMHg1MC0weDU3ICovCisJMHg3QTFBLDB4N0EyMCwweDdBMTQsMHg3QTFGLDB4N0ExRSwweDdBOUYsMHg3QUEwLDB4N0I3NywvKiAweDU4LTB4NUYgKi8KKwkweDdCQzAsMHg3QjYwLDB4N0I2RSwweDdCNjcsMHg3Q0IxLDB4N0NCMywweDdDQjUsMHg3RDkzLC8qIDB4NjAtMHg2NyAqLworCTB4N0Q3OSwweDdEOTEsMHg3RDgxLDB4N0Q4RiwweDdENUIsMHg3RjZFLDB4N0Y2OSwweDdGNkEsLyogMHg2OC0weDZGICovCisJMHg3RjcyLDB4N0ZBOSwweDdGQTgsMHg3RkE0LDB4ODA1NiwweDgwNTgsMHg4MDg2LDB4ODA4NCwvKiAweDcwLTB4NzcgKi8KKwkweDgxNzEsMHg4MTcwLDB4ODE3OCwweDgxNjUsMHg4MTZFLDB4ODE3MywweDgxNkIsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg4MTc5LDB4ODE3QSwweDgxNjYsMHg4MjA1LDB4ODI0NywweDg0ODIsMHg4NDc3LC8qIDB4QTAtMHhBNyAqLworCTB4ODQzRCwweDg0MzEsMHg4NDc1LDB4ODQ2NiwweDg0NkIsMHg4NDQ5LDB4ODQ2QywweDg0NUIsLyogMHhBOC0weEFGICovCisJMHg4NDNDLDB4ODQzNSwweDg0NjEsMHg4NDYzLDB4ODQ2OSwweDg0NkQsMHg4NDQ2LDB4ODY1RSwvKiAweEIwLTB4QjcgKi8KKwkweDg2NUMsMHg4NjVGLDB4ODZGOSwweDg3MTMsMHg4NzA4LDB4ODcwNywweDg3MDAsMHg4NkZFLC8qIDB4QjgtMHhCRiAqLworCTB4ODZGQiwweDg3MDIsMHg4NzAzLDB4ODcwNiwweDg3MEEsMHg4ODU5LDB4ODhERiwweDg4RDQsLyogMHhDMC0weEM3ICovCisJMHg4OEQ5LDB4ODhEQywweDg4RDgsMHg4OERELDB4ODhFMSwweDg4Q0EsMHg4OEQ1LDB4ODhEMiwvKiAweEM4LTB4Q0YgKi8KKwkweDg5OUMsMHg4OUUzLDB4OEE2QiwweDhBNzIsMHg4QTczLDB4OEE2NiwweDhBNjksMHg4QTcwLC8qIDB4RDAtMHhENyAqLworCTB4OEE4NywweDhBN0MsMHg4QTYzLDB4OEFBMCwweDhBNzEsMHg4QTg1LDB4OEE2RCwweDhBNjIsLyogMHhEOC0weERGICovCisJMHg4QTZFLDB4OEE2QywweDhBNzksMHg4QTdCLDB4OEEzRSwweDhBNjgsMHg4QzYyLDB4OEM4QSwvKiAweEUwLTB4RTcgKi8KKwkweDhDODksMHg4Q0NBLDB4OENDNywweDhDQzgsMHg4Q0M0LDB4OENCMiwweDhDQzMsMHg4Q0MyLC8qIDB4RTgtMHhFRiAqLworCTB4OENDNSwweDhERTEsMHg4RERGLDB4OERFOCwweDhERUYsMHg4REYzLDB4OERGQSwweDhERUEsLyogMHhGMC0weEY3ICovCisJMHg4REU0LDB4OERFNiwweDhFQjIsMHg4RjAzLDB4OEYwOSwweDhFRkUsMHg4RjBBLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9COVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDhGOUYsMHg4RkIyLDB4OTA0QiwweDkwNEEsMHg5MDUzLDB4OTA0MiwweDkwNTQsMHg5MDNDLC8qIDB4NDAtMHg0NyAqLworCTB4OTA1NSwweDkwNTAsMHg5MDQ3LDB4OTA0RiwweDkwNEUsMHg5MDRELDB4OTA1MSwweDkwM0UsLyogMHg0OC0weDRGICovCisJMHg5MDQxLDB4OTExMiwweDkxMTcsMHg5MTZDLDB4OTE2QSwweDkxNjksMHg5MUM5LDB4OTIzNywvKiAweDUwLTB4NTcgKi8KKwkweDkyNTcsMHg5MjM4LDB4OTIzRCwweDkyNDAsMHg5MjNFLDB4OTI1QiwweDkyNEIsMHg5MjY0LC8qIDB4NTgtMHg1RiAqLworCTB4OTI1MSwweDkyMzQsMHg5MjQ5LDB4OTI0RCwweDkyNDUsMHg5MjM5LDB4OTIzRiwweDkyNUEsLyogMHg2MC0weDY3ICovCisJMHg5NTk4LDB4OTY5OCwweDk2OTQsMHg5Njk1LDB4OTZDRCwweDk2Q0IsMHg5NkM5LDB4OTZDQSwvKiAweDY4LTB4NkYgKi8KKwkweDk2RjcsMHg5NkZCLDB4OTZGOSwweDk2RjYsMHg5NzU2LDB4OTc3NCwweDk3NzYsMHg5ODEwLC8qIDB4NzAtMHg3NyAqLworCTB4OTgxMSwweDk4MTMsMHg5ODBBLDB4OTgxMiwweDk4MEMsMHg5OEZDLDB4OThGNCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDk4RkQsMHg5OEZFLDB4OTlCMywweDk5QjEsMHg5OUI0LDB4OUFFMSwweDlDRTksLyogMHhBMC0weEE3ICovCisJMHg5RTgyLDB4OUYwRSwweDlGMTMsMHg5RjIwLDB4NTBFNywweDUwRUUsMHg1MEU1LDB4NTBENiwvKiAweEE4LTB4QUYgKi8KKwkweDUwRUQsMHg1MERBLDB4NTBENSwweDUwQ0YsMHg1MEQxLDB4NTBGMSwweDUwQ0UsMHg1MEU5LC8qIDB4QjAtMHhCNyAqLworCTB4NTE2MiwweDUxRjMsMHg1MjgzLDB4NTI4MiwweDUzMzEsMHg1M0FELDB4NTVGRSwweDU2MDAsLyogMHhCOC0weEJGICovCisJMHg1NjFCLDB4NTYxNywweDU1RkQsMHg1NjE0LDB4NTYwNiwweDU2MDksMHg1NjBELDB4NTYwRSwvKiAweEMwLTB4QzcgKi8KKwkweDU1RjcsMHg1NjE2LDB4NTYxRiwweDU2MDgsMHg1NjEwLDB4NTVGNiwweDU3MTgsMHg1NzE2LC8qIDB4QzgtMHhDRiAqLworCTB4NTg3NSwweDU4N0UsMHg1ODgzLDB4NTg5MywweDU4OEEsMHg1ODc5LDB4NTg4NSwweDU4N0QsLyogMHhEMC0weEQ3ICovCisJMHg1OEZELDB4NTkyNSwweDU5MjIsMHg1OTI0LDB4NTk2QSwweDU5NjksMHg1QUUxLDB4NUFFNiwvKiAweEQ4LTB4REYgKi8KKwkweDVBRTksMHg1QUQ3LDB4NUFENiwweDVBRDgsMHg1QUUzLDB4NUI3NSwweDVCREUsMHg1QkU3LC8qIDB4RTAtMHhFNyAqLworCTB4NUJFMSwweDVCRTUsMHg1QkU2LDB4NUJFOCwweDVCRTIsMHg1QkU0LDB4NUJERiwweDVDMEQsLyogMHhFOC0weEVGICovCisJMHg1QzYyLDB4NUQ4NCwweDVEODcsMHg1RTVCLDB4NUU2MywweDVFNTUsMHg1RTU3LDB4NUU1NCwvKiAweEYwLTB4RjcgKi8KKwkweDVFRDMsMHg1RUQ2LDB4NUYwQSwweDVGNDYsMHg1RjcwLDB4NUZCOSwweDYxNDcsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0JBWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NjEzRiwweDYxNEIsMHg2MTc3LDB4NjE2MiwweDYxNjMsMHg2MTVGLDB4NjE1QSwweDYxNTgsLyogMHg0MC0weDQ3ICovCisJMHg2MTc1LDB4NjIyQSwweDY0ODcsMHg2NDU4LDB4NjQ1NCwweDY0QTQsMHg2NDc4LDB4NjQ1RiwvKiAweDQ4LTB4NEYgKi8KKwkweDY0N0EsMHg2NDUxLDB4NjQ2NywweDY0MzQsMHg2NDZELDB4NjQ3QiwweDY1NzIsMHg2NUExLC8qIDB4NTAtMHg1NyAqLworCTB4NjVENywweDY1RDYsMHg2NkEyLDB4NjZBOCwweDY2OUQsMHg2OTlDLDB4NjlBOCwweDY5OTUsLyogMHg1OC0weDVGICovCisJMHg2OUMxLDB4NjlBRSwweDY5RDMsMHg2OUNCLDB4Njk5QiwweDY5QjcsMHg2OUJCLDB4NjlBQiwvKiAweDYwLTB4NjcgKi8KKwkweDY5QjQsMHg2OUQwLDB4NjlDRCwweDY5QUQsMHg2OUNDLDB4NjlBNiwweDY5QzMsMHg2OUEzLC8qIDB4NjgtMHg2RiAqLworCTB4NkI0OSwweDZCNEMsMHg2QzMzLDB4NkYzMywweDZGMTQsMHg2RUZFLDB4NkYxMywweDZFRjQsLyogMHg3MC0weDc3ICovCisJMHg2RjI5LDB4NkYzRSwweDZGMjAsMHg2RjJDLDB4NkYwRiwweDZGMDIsMHg2RjIyLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NkVGRiwweDZFRUYsMHg2RjA2LDB4NkYzMSwweDZGMzgsMHg2RjMyLDB4NkYyMywvKiAweEEwLTB4QTcgKi8KKwkweDZGMTUsMHg2RjJCLDB4NkYyRiwweDZGODgsMHg2RjJBLDB4NkVFQywweDZGMDEsMHg2RUYyLC8qIDB4QTgtMHhBRiAqLworCTB4NkVDQywweDZFRjcsMHg3MTk0LDB4NzE5OSwweDcxN0QsMHg3MThBLDB4NzE4NCwweDcxOTIsLyogMHhCMC0weEI3ICovCisJMHg3MjNFLDB4NzI5MiwweDcyOTYsMHg3MzQ0LDB4NzM1MCwweDc0NjQsMHg3NDYzLDB4NzQ2QSwvKiAweEI4LTB4QkYgKi8KKwkweDc0NzAsMHg3NDZELDB4NzUwNCwweDc1OTEsMHg3NjI3LDB4NzYwRCwweDc2MEIsMHg3NjA5LC8qIDB4QzAtMHhDNyAqLworCTB4NzYxMywweDc2RTEsMHg3NkUzLDB4Nzc4NCwweDc3N0QsMHg3NzdGLDB4Nzc2MSwweDc4QzEsLyogMHhDOC0weENGICovCisJMHg3ODlGLDB4NzhBNywweDc4QjMsMHg3OEE5LDB4NzhBMywweDc5OEUsMHg3OThGLDB4Nzk4RCwvKiAweEQwLTB4RDcgKi8KKwkweDdBMkUsMHg3QTMxLDB4N0FBQSwweDdBQTksMHg3QUVELDB4N0FFRiwweDdCQTEsMHg3Qjk1LC8qIDB4RDgtMHhERiAqLworCTB4N0I4QiwweDdCNzUsMHg3Qjk3LDB4N0I5RCwweDdCOTQsMHg3QjhGLDB4N0JCOCwweDdCODcsLyogMHhFMC0weEU3ICovCisJMHg3Qjg0LDB4N0NCOSwweDdDQkQsMHg3Q0JFLDB4N0RCQiwweDdEQjAsMHg3RDlDLDB4N0RCRCwvKiAweEU4LTB4RUYgKi8KKwkweDdEQkUsMHg3REEwLDB4N0RDQSwweDdEQjQsMHg3REIyLDB4N0RCMSwweDdEQkEsMHg3REEyLC8qIDB4RjAtMHhGNyAqLworCTB4N0RCRiwweDdEQjUsMHg3REI4LDB4N0RBRCwweDdERDIsMHg3REM3LDB4N0RBQywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQkJbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg3RjcwLDB4N0ZFMCwweDdGRTEsMHg3RkRGLDB4ODA1RSwweDgwNUEsMHg4MDg3LDB4ODE1MCwvKiAweDQwLTB4NDcgKi8KKwkweDgxODAsMHg4MThGLDB4ODE4OCwweDgxOEEsMHg4MTdGLDB4ODE4MiwweDgxRTcsMHg4MUZBLC8qIDB4NDgtMHg0RiAqLworCTB4ODIwNywweDgyMTQsMHg4MjFFLDB4ODI0QiwweDg0QzksMHg4NEJGLDB4ODRDNiwweDg0QzQsLyogMHg1MC0weDU3ICovCisJMHg4NDk5LDB4ODQ5RSwweDg0QjIsMHg4NDlDLDB4ODRDQiwweDg0QjgsMHg4NEMwLDB4ODREMywvKiAweDU4LTB4NUYgKi8KKwkweDg0OTAsMHg4NEJDLDB4ODREMSwweDg0Q0EsMHg4NzNGLDB4ODcxQywweDg3M0IsMHg4NzIyLC8qIDB4NjAtMHg2NyAqLworCTB4ODcyNSwweDg3MzQsMHg4NzE4LDB4ODc1NSwweDg3MzcsMHg4NzI5LDB4ODhGMywweDg5MDIsLyogMHg2OC0weDZGICovCisJMHg4OEY0LDB4ODhGOSwweDg4RjgsMHg4OEZELDB4ODhFOCwweDg5MUEsMHg4OEVGLDB4OEFBNiwvKiAweDcwLTB4NzcgKi8KKwkweDhBOEMsMHg4QTlFLDB4OEFBMywweDhBOEQsMHg4QUExLDB4OEE5MywweDhBQTQsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg4QUFBLDB4OEFBNSwweDhBQTgsMHg4QTk4LDB4OEE5MSwweDhBOUEsMHg4QUE3LC8qIDB4QTAtMHhBNyAqLworCTB4OEM2QSwweDhDOEQsMHg4QzhDLDB4OENEMywweDhDRDEsMHg4Q0QyLDB4OEQ2QiwweDhEOTksLyogMHhBOC0weEFGICovCisJMHg4RDk1LDB4OERGQywweDhGMTQsMHg4RjEyLDB4OEYxNSwweDhGMTMsMHg4RkEzLDB4OTA2MCwvKiAweEIwLTB4QjcgKi8KKwkweDkwNTgsMHg5MDVDLDB4OTA2MywweDkwNTksMHg5MDVFLDB4OTA2MiwweDkwNUQsMHg5MDVCLC8qIDB4QjgtMHhCRiAqLworCTB4OTExOSwweDkxMTgsMHg5MTFFLDB4OTE3NSwweDkxNzgsMHg5MTc3LDB4OTE3NCwweDkyNzgsLyogMHhDMC0weEM3ICovCisJMHg5MjgwLDB4OTI4NSwweDkyOTgsMHg5Mjk2LDB4OTI3QiwweDkyOTMsMHg5MjlDLDB4OTJBOCwvKiAweEM4LTB4Q0YgKi8KKwkweDkyN0MsMHg5MjkxLDB4OTVBMSwweDk1QTgsMHg5NUE5LDB4OTVBMywweDk1QTUsMHg5NUE0LC8qIDB4RDAtMHhENyAqLworCTB4OTY5OSwweDk2OUMsMHg5NjlCLDB4OTZDQywweDk2RDIsMHg5NzAwLDB4OTc3QywweDk3ODUsLyogMHhEOC0weERGICovCisJMHg5N0Y2LDB4OTgxNywweDk4MTgsMHg5OEFGLDB4OThCMSwweDk5MDMsMHg5OTA1LDB4OTkwQywvKiAweEUwLTB4RTcgKi8KKwkweDk5MDksMHg5OUMxLDB4OUFBRiwweDlBQjAsMHg5QUU2LDB4OUI0MSwweDlCNDIsMHg5Q0Y0LC8qIDB4RTgtMHhFRiAqLworCTB4OUNGNiwweDlDRjMsMHg5RUJDLDB4OUYzQiwweDlGNEEsMHg1MTA0LDB4NTEwMCwweDUwRkIsLyogMHhGMC0weEY3ICovCisJMHg1MEY1LDB4NTBGOSwweDUxMDIsMHg1MTA4LDB4NTEwOSwweDUxMDUsMHg1MURDLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9CQ1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDUyODcsMHg1Mjg4LDB4NTI4OSwweDUyOEQsMHg1MjhBLDB4NTJGMCwweDUzQjIsMHg1NjJFLC8qIDB4NDAtMHg0NyAqLworCTB4NTYzQiwweDU2MzksMHg1NjMyLDB4NTYzRiwweDU2MzQsMHg1NjI5LDB4NTY1MywweDU2NEUsLyogMHg0OC0weDRGICovCisJMHg1NjU3LDB4NTY3NCwweDU2MzYsMHg1NjJGLDB4NTYzMCwweDU4ODAsMHg1ODlGLDB4NTg5RSwvKiAweDUwLTB4NTcgKi8KKwkweDU4QjMsMHg1ODlDLDB4NThBRSwweDU4QTksMHg1OEE2LDB4NTk2RCwweDVCMDksMHg1QUZCLC8qIDB4NTgtMHg1RiAqLworCTB4NUIwQiwweDVBRjUsMHg1QjBDLDB4NUIwOCwweDVCRUUsMHg1QkVDLDB4NUJFOSwweDVCRUIsLyogMHg2MC0weDY3ICovCisJMHg1QzY0LDB4NUM2NSwweDVEOUQsMHg1RDk0LDB4NUU2MiwweDVFNUYsMHg1RTYxLDB4NUVFMiwvKiAweDY4LTB4NkYgKi8KKwkweDVFREEsMHg1RURGLDB4NUVERCwweDVFRTMsMHg1RUUwLDB4NUY0OCwweDVGNzEsMHg1RkI3LC8qIDB4NzAtMHg3NyAqLworCTB4NUZCNSwweDYxNzYsMHg2MTY3LDB4NjE2RSwweDYxNUQsMHg2MTU1LDB4NjE4MiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDYxN0MsMHg2MTcwLDB4NjE2QiwweDYxN0UsMHg2MUE3LDB4NjE5MCwweDYxQUIsLyogMHhBMC0weEE3ICovCisJMHg2MThFLDB4NjFBQywweDYxOUEsMHg2MUE0LDB4NjE5NCwweDYxQUUsMHg2MjJFLDB4NjQ2OSwvKiAweEE4LTB4QUYgKi8KKwkweDY0NkYsMHg2NDc5LDB4NjQ5RSwweDY0QjIsMHg2NDg4LDB4NjQ5MCwweDY0QjAsMHg2NEE1LC8qIDB4QjAtMHhCNyAqLworCTB4NjQ5MywweDY0OTUsMHg2NEE5LDB4NjQ5MiwweDY0QUUsMHg2NEFELDB4NjRBQiwweDY0OUEsLyogMHhCOC0weEJGICovCisJMHg2NEFDLDB4NjQ5OSwweDY0QTIsMHg2NEIzLDB4NjU3NSwweDY1NzcsMHg2NTc4LDB4NjZBRSwvKiAweEMwLTB4QzcgKi8KKwkweDY2QUIsMHg2NkI0LDB4NjZCMSwweDZBMjMsMHg2QTFGLDB4NjlFOCwweDZBMDEsMHg2QTFFLC8qIDB4QzgtMHhDRiAqLworCTB4NkExOSwweDY5RkQsMHg2QTIxLDB4NkExMywweDZBMEEsMHg2OUYzLDB4NkEwMiwweDZBMDUsLyogMHhEMC0weEQ3ICovCisJMHg2OUVELDB4NkExMSwweDZCNTAsMHg2QjRFLDB4NkJBNCwweDZCQzUsMHg2QkM2LDB4NkYzRiwvKiAweEQ4LTB4REYgKi8KKwkweDZGN0MsMHg2Rjg0LDB4NkY1MSwweDZGNjYsMHg2RjU0LDB4NkY4NiwweDZGNkQsMHg2RjVCLC8qIDB4RTAtMHhFNyAqLworCTB4NkY3OCwweDZGNkUsMHg2RjhFLDB4NkY3QSwweDZGNzAsMHg2RjY0LDB4NkY5NywweDZGNTgsLyogMHhFOC0weEVGICovCisJMHg2RUQ1LDB4NkY2RiwweDZGNjAsMHg2RjVGLDB4NzE5RiwweDcxQUMsMHg3MUIxLDB4NzFBOCwvKiAweEYwLTB4RjcgKi8KKwkweDcyNTYsMHg3MjlCLDB4NzM0RSwweDczNTcsMHg3NDY5LDB4NzQ4QiwweDc0ODMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0JEWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NzQ3RSwweDc0ODAsMHg3NTdGLDB4NzYyMCwweDc2MjksMHg3NjFGLDB4NzYyNCwweDc2MjYsLyogMHg0MC0weDQ3ICovCisJMHg3NjIxLDB4NzYyMiwweDc2OUEsMHg3NkJBLDB4NzZFNCwweDc3OEUsMHg3Nzg3LDB4Nzc4QywvKiAweDQ4LTB4NEYgKi8KKwkweDc3OTEsMHg3NzhCLDB4NzhDQiwweDc4QzUsMHg3OEJBLDB4NzhDQSwweDc4QkUsMHg3OEQ1LC8qIDB4NTAtMHg1NyAqLworCTB4NzhCQywweDc4RDAsMHg3QTNGLDB4N0EzQywweDdBNDAsMHg3QTNELDB4N0EzNywweDdBM0IsLyogMHg1OC0weDVGICovCisJMHg3QUFGLDB4N0FBRSwweDdCQUQsMHg3QkIxLDB4N0JDNCwweDdCQjQsMHg3QkM2LDB4N0JDNywvKiAweDYwLTB4NjcgKi8KKwkweDdCQzEsMHg3QkEwLDB4N0JDQywweDdDQ0EsMHg3REUwLDB4N0RGNCwweDdERUYsMHg3REZCLC8qIDB4NjgtMHg2RiAqLworCTB4N0REOCwweDdERUMsMHg3RERELDB4N0RFOCwweDdERTMsMHg3RERBLDB4N0RERSwweDdERTksLyogMHg3MC0weDc3ICovCisJMHg3RDlFLDB4N0REOSwweDdERjIsMHg3REY5LDB4N0Y3NSwweDdGNzcsMHg3RkFGLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4N0ZFOSwweDgwMjYsMHg4MTlCLDB4ODE5QywweDgxOUQsMHg4MUEwLDB4ODE5QSwvKiAweEEwLTB4QTcgKi8KKwkweDgxOTgsMHg4NTE3LDB4ODUzRCwweDg1MUEsMHg4NEVFLDB4ODUyQywweDg1MkQsMHg4NTEzLC8qIDB4QTgtMHhBRiAqLworCTB4ODUxMSwweDg1MjMsMHg4NTIxLDB4ODUxNCwweDg0RUMsMHg4NTI1LDB4ODRGRiwweDg1MDYsLyogMHhCMC0weEI3ICovCisJMHg4NzgyLDB4ODc3NCwweDg3NzYsMHg4NzYwLDB4ODc2NiwweDg3NzgsMHg4NzY4LDB4ODc1OSwvKiAweEI4LTB4QkYgKi8KKwkweDg3NTcsMHg4NzRDLDB4ODc1MywweDg4NUIsMHg4ODVELDB4ODkxMCwweDg5MDcsMHg4OTEyLC8qIDB4QzAtMHhDNyAqLworCTB4ODkxMywweDg5MTUsMHg4OTBBLDB4OEFCQywweDhBRDIsMHg4QUM3LDB4OEFDNCwweDhBOTUsLyogMHhDOC0weENGICovCisJMHg4QUNCLDB4OEFGOCwweDhBQjIsMHg4QUM5LDB4OEFDMiwweDhBQkYsMHg4QUIwLDB4OEFENiwvKiAweEQwLTB4RDcgKi8KKwkweDhBQ0QsMHg4QUI2LDB4OEFCOSwweDhBREIsMHg4QzRDLDB4OEM0RSwweDhDNkMsMHg4Q0UwLC8qIDB4RDgtMHhERiAqLworCTB4OENERSwweDhDRTYsMHg4Q0U0LDB4OENFQywweDhDRUQsMHg4Q0UyLDB4OENFMywweDhDREMsLyogMHhFMC0weEU3ICovCisJMHg4Q0VBLDB4OENFMSwweDhENkQsMHg4RDlGLDB4OERBMywweDhFMkIsMHg4RTEwLDB4OEUxRCwvKiAweEU4LTB4RUYgKi8KKwkweDhFMjIsMHg4RTBGLDB4OEUyOSwweDhFMUYsMHg4RTIxLDB4OEUxRSwweDhFQkEsMHg4RjFELC8qIDB4RjAtMHhGNyAqLworCTB4OEYxQiwweDhGMUYsMHg4RjI5LDB4OEYyNiwweDhGMkEsMHg4RjFDLDB4OEYxRSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQkVbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4RjI1LDB4OTA2OSwweDkwNkUsMHg5MDY4LDB4OTA2RCwweDkwNzcsMHg5MTMwLDB4OTEyRCwvKiAweDQwLTB4NDcgKi8KKwkweDkxMjcsMHg5MTMxLDB4OTE4NywweDkxODksMHg5MThCLDB4OTE4MywweDkyQzUsMHg5MkJCLC8qIDB4NDgtMHg0RiAqLworCTB4OTJCNywweDkyRUEsMHg5MkFDLDB4OTJFNCwweDkyQzEsMHg5MkIzLDB4OTJCQywweDkyRDIsLyogMHg1MC0weDU3ICovCisJMHg5MkM3LDB4OTJGMCwweDkyQjIsMHg5NUFELDB4OTVCMSwweDk3MDQsMHg5NzA2LDB4OTcwNywvKiAweDU4LTB4NUYgKi8KKwkweDk3MDksMHg5NzYwLDB4OTc4RCwweDk3OEIsMHg5NzhGLDB4OTgyMSwweDk4MkIsMHg5ODFDLC8qIDB4NjAtMHg2NyAqLworCTB4OThCMywweDk5MEEsMHg5OTEzLDB4OTkxMiwweDk5MTgsMHg5OURELDB4OTlEMCwweDk5REYsLyogMHg2OC0weDZGICovCisJMHg5OURCLDB4OTlEMSwweDk5RDUsMHg5OUQyLDB4OTlEOSwweDlBQjcsMHg5QUVFLDB4OUFFRiwvKiAweDcwLTB4NzcgKi8KKwkweDlCMjcsMHg5QjQ1LDB4OUI0NCwweDlCNzcsMHg5QjZGLDB4OUQwNiwweDlEMDksMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg5RDAzLDB4OUVBOSwweDlFQkUsMHg5RUNFLDB4NThBOCwweDlGNTIsMHg1MTEyLC8qIDB4QTAtMHhBNyAqLworCTB4NTExOCwweDUxMTQsMHg1MTEwLDB4NTExNSwweDUxODAsMHg1MUFBLDB4NTFERCwweDUyOTEsLyogMHhBOC0weEFGICovCisJMHg1MjkzLDB4NTJGMywweDU2NTksMHg1NjZCLDB4NTY3OSwweDU2NjksMHg1NjY0LDB4NTY3OCwvKiAweEIwLTB4QjcgKi8KKwkweDU2NkEsMHg1NjY4LDB4NTY2NSwweDU2NzEsMHg1NjZGLDB4NTY2QywweDU2NjIsMHg1Njc2LC8qIDB4QjgtMHhCRiAqLworCTB4NThDMSwweDU4QkUsMHg1OEM3LDB4NThDNSwweDU5NkUsMHg1QjFELDB4NUIzNCwweDVCNzgsLyogMHhDMC0weEM3ICovCisJMHg1QkYwLDB4NUMwRSwweDVGNEEsMHg2MUIyLDB4NjE5MSwweDYxQTksMHg2MThBLDB4NjFDRCwvKiAweEM4LTB4Q0YgKi8KKwkweDYxQjYsMHg2MUJFLDB4NjFDQSwweDYxQzgsMHg2MjMwLDB4NjRDNSwweDY0QzEsMHg2NENCLC8qIDB4RDAtMHhENyAqLworCTB4NjRCQiwweDY0QkMsMHg2NERBLDB4NjRDNCwweDY0QzcsMHg2NEMyLDB4NjRDRCwweDY0QkYsLyogMHhEOC0weERGICovCisJMHg2NEQyLDB4NjRENCwweDY0QkUsMHg2NTc0LDB4NjZDNiwweDY2QzksMHg2NkI5LDB4NjZDNCwvKiAweEUwLTB4RTcgKi8KKwkweDY2QzcsMHg2NkI4LDB4NkEzRCwweDZBMzgsMHg2QTNBLDB4NkE1OSwweDZBNkIsMHg2QTU4LC8qIDB4RTgtMHhFRiAqLworCTB4NkEzOSwweDZBNDQsMHg2QTYyLDB4NkE2MSwweDZBNEIsMHg2QTQ3LDB4NkEzNSwweDZBNUYsLyogMHhGMC0weEY3ICovCisJMHg2QTQ4LDB4NkI1OSwweDZCNzcsMHg2QzA1LDB4NkZDMiwweDZGQjEsMHg2RkExLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9CRlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDZGQzMsMHg2RkE0LDB4NkZDMSwweDZGQTcsMHg2RkIzLDB4NkZDMCwweDZGQjksMHg2RkI2LC8qIDB4NDAtMHg0NyAqLworCTB4NkZBNiwweDZGQTAsMHg2RkI0LDB4NzFCRSwweDcxQzksMHg3MUQwLDB4NzFEMiwweDcxQzgsLyogMHg0OC0weDRGICovCisJMHg3MUQ1LDB4NzFCOSwweDcxQ0UsMHg3MUQ5LDB4NzFEQywweDcxQzMsMHg3MUM0LDB4NzM2OCwvKiAweDUwLTB4NTcgKi8KKwkweDc0OUMsMHg3NEEzLDB4NzQ5OCwweDc0OUYsMHg3NDlFLDB4NzRFMiwweDc1MEMsMHg3NTBELC8qIDB4NTgtMHg1RiAqLworCTB4NzYzNCwweDc2MzgsMHg3NjNBLDB4NzZFNywweDc2RTUsMHg3N0EwLDB4Nzc5RSwweDc3OUYsLyogMHg2MC0weDY3ICovCisJMHg3N0E1LDB4NzhFOCwweDc4REEsMHg3OEVDLDB4NzhFNywweDc5QTYsMHg3QTRELDB4N0E0RSwvKiAweDY4LTB4NkYgKi8KKwkweDdBNDYsMHg3QTRDLDB4N0E0QiwweDdBQkEsMHg3QkQ5LDB4N0MxMSwweDdCQzksMHg3QkU0LC8qIDB4NzAtMHg3NyAqLworCTB4N0JEQiwweDdCRTEsMHg3QkU5LDB4N0JFNiwweDdDRDUsMHg3Q0Q2LDB4N0UwQSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDdFMTEsMHg3RTA4LDB4N0UxQiwweDdFMjMsMHg3RTFFLDB4N0UxRCwweDdFMDksLyogMHhBMC0weEE3ICovCisJMHg3RTEwLDB4N0Y3OSwweDdGQjIsMHg3RkYwLDB4N0ZGMSwweDdGRUUsMHg4MDI4LDB4ODFCMywvKiAweEE4LTB4QUYgKi8KKwkweDgxQTksMHg4MUE4LDB4ODFGQiwweDgyMDgsMHg4MjU4LDB4ODI1OSwweDg1NEEsMHg4NTU5LC8qIDB4QjAtMHhCNyAqLworCTB4ODU0OCwweDg1NjgsMHg4NTY5LDB4ODU0MywweDg1NDksMHg4NTZELDB4ODU2QSwweDg1NUUsLyogMHhCOC0weEJGICovCisJMHg4NzgzLDB4ODc5RiwweDg3OUUsMHg4N0EyLDB4ODc4RCwweDg4NjEsMHg4OTJBLDB4ODkzMiwvKiAweEMwLTB4QzcgKi8KKwkweDg5MjUsMHg4OTJCLDB4ODkyMSwweDg5QUEsMHg4OUE2LDB4OEFFNiwweDhBRkEsMHg4QUVCLC8qIDB4QzgtMHhDRiAqLworCTB4OEFGMSwweDhCMDAsMHg4QURDLDB4OEFFNywweDhBRUUsMHg4QUZFLDB4OEIwMSwweDhCMDIsLyogMHhEMC0weEQ3ICovCisJMHg4QUY3LDB4OEFFRCwweDhBRjMsMHg4QUY2LDB4OEFGQywweDhDNkIsMHg4QzZELDB4OEM5MywvKiAweEQ4LTB4REYgKi8KKwkweDhDRjQsMHg4RTQ0LDB4OEUzMSwweDhFMzQsMHg4RTQyLDB4OEUzOSwweDhFMzUsMHg4RjNCLC8qIDB4RTAtMHhFNyAqLworCTB4OEYyRiwweDhGMzgsMHg4RjMzLDB4OEZBOCwweDhGQTYsMHg5MDc1LDB4OTA3NCwweDkwNzgsLyogMHhFOC0weEVGICovCisJMHg5MDcyLDB4OTA3QywweDkwN0EsMHg5MTM0LDB4OTE5MiwweDkzMjAsMHg5MzM2LDB4OTJGOCwvKiAweEYwLTB4RjcgKi8KKwkweDkzMzMsMHg5MzJGLDB4OTMyMiwweDkyRkMsMHg5MzJCLDB4OTMwNCwweDkzMUEsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0MwWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OTMxMCwweDkzMjYsMHg5MzIxLDB4OTMxNSwweDkzMkUsMHg5MzE5LDB4OTVCQiwweDk2QTcsLyogMHg0MC0weDQ3ICovCisJMHg5NkE4LDB4OTZBQSwweDk2RDUsMHg5NzBFLDB4OTcxMSwweDk3MTYsMHg5NzBELDB4OTcxMywvKiAweDQ4LTB4NEYgKi8KKwkweDk3MEYsMHg5NzVCLDB4OTc1QywweDk3NjYsMHg5Nzk4LDB4OTgzMCwweDk4MzgsMHg5ODNCLC8qIDB4NTAtMHg1NyAqLworCTB4OTgzNywweDk4MkQsMHg5ODM5LDB4OTgyNCwweDk5MTAsMHg5OTI4LDB4OTkxRSwweDk5MUIsLyogMHg1OC0weDVGICovCisJMHg5OTIxLDB4OTkxQSwweDk5RUQsMHg5OUUyLDB4OTlGMSwweDlBQjgsMHg5QUJDLDB4OUFGQiwvKiAweDYwLTB4NjcgKi8KKwkweDlBRUQsMHg5QjI4LDB4OUI5MSwweDlEMTUsMHg5RDIzLDB4OUQyNiwweDlEMjgsMHg5RDEyLC8qIDB4NjgtMHg2RiAqLworCTB4OUQxQiwweDlFRDgsMHg5RUQ0LDB4OUY4RCwweDlGOUMsMHg1MTJBLDB4NTExRiwweDUxMjEsLyogMHg3MC0weDc3ICovCisJMHg1MTMyLDB4NTJGNSwweDU2OEUsMHg1NjgwLDB4NTY5MCwweDU2ODUsMHg1Njg3LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NTY4RiwweDU4RDUsMHg1OEQzLDB4NThEMSwweDU4Q0UsMHg1QjMwLDB4NUIyQSwvKiAweEEwLTB4QTcgKi8KKwkweDVCMjQsMHg1QjdBLDB4NUMzNywweDVDNjgsMHg1REJDLDB4NURCQSwweDVEQkQsMHg1REI4LC8qIDB4QTgtMHhBRiAqLworCTB4NUU2QiwweDVGNEMsMHg1RkJELDB4NjFDOSwweDYxQzIsMHg2MUM3LDB4NjFFNiwweDYxQ0IsLyogMHhCMC0weEI3ICovCisJMHg2MjMyLDB4NjIzNCwweDY0Q0UsMHg2NENBLDB4NjREOCwweDY0RTAsMHg2NEYwLDB4NjRFNiwvKiAweEI4LTB4QkYgKi8KKwkweDY0RUMsMHg2NEYxLDB4NjRFMiwweDY0RUQsMHg2NTgyLDB4NjU4MywweDY2RDksMHg2NkQ2LC8qIDB4QzAtMHhDNyAqLworCTB4NkE4MCwweDZBOTQsMHg2QTg0LDB4NkFBMiwweDZBOUMsMHg2QURCLDB4NkFBMywweDZBN0UsLyogMHhDOC0weENGICovCisJMHg2QTk3LDB4NkE5MCwweDZBQTAsMHg2QjVDLDB4NkJBRSwweDZCREEsMHg2QzA4LDB4NkZEOCwvKiAweEQwLTB4RDcgKi8KKwkweDZGRjEsMHg2RkRGLDB4NkZFMCwweDZGREIsMHg2RkU0LDB4NkZFQiwweDZGRUYsMHg2RjgwLC8qIDB4RDgtMHhERiAqLworCTB4NkZFQywweDZGRTEsMHg2RkU5LDB4NkZENSwweDZGRUUsMHg2RkYwLDB4NzFFNywweDcxREYsLyogMHhFMC0weEU3ICovCisJMHg3MUVFLDB4NzFFNiwweDcxRTUsMHg3MUVELDB4NzFFQywweDcxRjQsMHg3MUUwLDB4NzIzNSwvKiAweEU4LTB4RUYgKi8KKwkweDcyNDYsMHg3MzcwLDB4NzM3MiwweDc0QTksMHg3NEIwLDB4NzRBNiwweDc0QTgsMHg3NjQ2LC8qIDB4RjAtMHhGNyAqLworCTB4NzY0MiwweDc2NEMsMHg3NkVBLDB4NzdCMywweDc3QUEsMHg3N0IwLDB4NzdBQywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQzFbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg3N0E3LDB4NzdBRCwweDc3RUYsMHg3OEY3LDB4NzhGQSwweDc4RjQsMHg3OEVGLDB4NzkwMSwvKiAweDQwLTB4NDcgKi8KKwkweDc5QTcsMHg3OUFBLDB4N0E1NywweDdBQkYsMHg3QzA3LDB4N0MwRCwweDdCRkUsMHg3QkY3LC8qIDB4NDgtMHg0RiAqLworCTB4N0MwQywweDdCRTAsMHg3Q0UwLDB4N0NEQywweDdDREUsMHg3Q0UyLDB4N0NERiwweDdDRDksLyogMHg1MC0weDU3ICovCisJMHg3Q0RELDB4N0UyRSwweDdFM0UsMHg3RTQ2LDB4N0UzNywweDdFMzIsMHg3RTQzLDB4N0UyQiwvKiAweDU4LTB4NUYgKi8KKwkweDdFM0QsMHg3RTMxLDB4N0U0NSwweDdFNDEsMHg3RTM0LDB4N0UzOSwweDdFNDgsMHg3RTM1LC8qIDB4NjAtMHg2NyAqLworCTB4N0UzRiwweDdFMkYsMHg3RjQ0LDB4N0ZGMywweDdGRkMsMHg4MDcxLDB4ODA3MiwweDgwNzAsLyogMHg2OC0weDZGICovCisJMHg4MDZGLDB4ODA3MywweDgxQzYsMHg4MUMzLDB4ODFCQSwweDgxQzIsMHg4MUMwLDB4ODFCRiwvKiAweDcwLTB4NzcgKi8KKwkweDgxQkQsMHg4MUM5LDB4ODFCRSwweDgxRTgsMHg4MjA5LDB4ODI3MSwweDg1QUEsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg4NTg0LDB4ODU3RSwweDg1OUMsMHg4NTkxLDB4ODU5NCwweDg1QUYsMHg4NTlCLC8qIDB4QTAtMHhBNyAqLworCTB4ODU4NywweDg1QTgsMHg4NThBLDB4ODY2NywweDg3QzAsMHg4N0QxLDB4ODdCMywweDg3RDIsLyogMHhBOC0weEFGICovCisJMHg4N0M2LDB4ODdBQiwweDg3QkIsMHg4N0JBLDB4ODdDOCwweDg3Q0IsMHg4OTNCLDB4ODkzNiwvKiAweEIwLTB4QjcgKi8KKwkweDg5NDQsMHg4OTM4LDB4ODkzRCwweDg5QUMsMHg4QjBFLDB4OEIxNywweDhCMTksMHg4QjFCLC8qIDB4QjgtMHhCRiAqLworCTB4OEIwQSwweDhCMjAsMHg4QjFELDB4OEIwNCwweDhCMTAsMHg4QzQxLDB4OEMzRiwweDhDNzMsLyogMHhDMC0weEM3ICovCisJMHg4Q0ZBLDB4OENGRCwweDhDRkMsMHg4Q0Y4LDB4OENGQiwweDhEQTgsMHg4RTQ5LDB4OEU0QiwvKiAweEM4LTB4Q0YgKi8KKwkweDhFNDgsMHg4RTRBLDB4OEY0NCwweDhGM0UsMHg4RjQyLDB4OEY0NSwweDhGM0YsMHg5MDdGLC8qIDB4RDAtMHhENyAqLworCTB4OTA3RCwweDkwODQsMHg5MDgxLDB4OTA4MiwweDkwODAsMHg5MTM5LDB4OTFBMywweDkxOUUsLyogMHhEOC0weERGICovCisJMHg5MTlDLDB4OTM0RCwweDkzODIsMHg5MzI4LDB4OTM3NSwweDkzNEEsMHg5MzY1LDB4OTM0QiwvKiAweEUwLTB4RTcgKi8KKwkweDkzMTgsMHg5MzdFLDB4OTM2QywweDkzNUIsMHg5MzcwLDB4OTM1QSwweDkzNTQsMHg5NUNBLC8qIDB4RTgtMHhFRiAqLworCTB4OTVDQiwweDk1Q0MsMHg5NUM4LDB4OTVDNiwweDk2QjEsMHg5NkI4LDB4OTZENiwweDk3MUMsLyogMHhGMC0weEY3ICovCisJMHg5NzFFLDB4OTdBMCwweDk3RDMsMHg5ODQ2LDB4OThCNiwweDk5MzUsMHg5QTAxLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9DMlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDk5RkYsMHg5QkFFLDB4OUJBQiwweDlCQUEsMHg5QkFELDB4OUQzQiwweDlEM0YsMHg5RThCLC8qIDB4NDAtMHg0NyAqLworCTB4OUVDRiwweDlFREUsMHg5RURDLDB4OUVERCwweDlFREIsMHg5RjNFLDB4OUY0QiwweDUzRTIsLyogMHg0OC0weDRGICovCisJMHg1Njk1LDB4NTZBRSwweDU4RDksMHg1OEQ4LDB4NUIzOCwweDVGNUQsMHg2MUUzLDB4NjIzMywvKiAweDUwLTB4NTcgKi8KKwkweDY0RjQsMHg2NEYyLDB4NjRGRSwweDY1MDYsMHg2NEZBLDB4NjRGQiwweDY0RjcsMHg2NUI3LC8qIDB4NTgtMHg1RiAqLworCTB4NjZEQywweDY3MjYsMHg2QUIzLDB4NkFBQywweDZBQzMsMHg2QUJCLDB4NkFCOCwweDZBQzIsLyogMHg2MC0weDY3ICovCisJMHg2QUFFLDB4NkFBRiwweDZCNUYsMHg2Qjc4LDB4NkJBRiwweDcwMDksMHg3MDBCLDB4NkZGRSwvKiAweDY4LTB4NkYgKi8KKwkweDcwMDYsMHg2RkZBLDB4NzAxMSwweDcwMEYsMHg3MUZCLDB4NzFGQywweDcxRkUsMHg3MUY4LC8qIDB4NzAtMHg3NyAqLworCTB4NzM3NywweDczNzUsMHg3NEE3LDB4NzRCRiwweDc1MTUsMHg3NjU2LDB4NzY1OCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDc2NTIsMHg3N0JELDB4NzdCRiwweDc3QkIsMHg3N0JDLDB4NzkwRSwweDc5QUUsLyogMHhBMC0weEE3ICovCisJMHg3QTYxLDB4N0E2MiwweDdBNjAsMHg3QUM0LDB4N0FDNSwweDdDMkIsMHg3QzI3LDB4N0MyQSwvKiAweEE4LTB4QUYgKi8KKwkweDdDMUUsMHg3QzIzLDB4N0MyMSwweDdDRTcsMHg3RTU0LDB4N0U1NSwweDdFNUUsMHg3RTVBLC8qIDB4QjAtMHhCNyAqLworCTB4N0U2MSwweDdFNTIsMHg3RTU5LDB4N0Y0OCwweDdGRjksMHg3RkZCLDB4ODA3NywweDgwNzYsLyogMHhCOC0weEJGICovCisJMHg4MUNELDB4ODFDRiwweDgyMEEsMHg4NUNGLDB4ODVBOSwweDg1Q0QsMHg4NUQwLDB4ODVDOSwvKiAweEMwLTB4QzcgKi8KKwkweDg1QjAsMHg4NUJBLDB4ODVCOSwweDg1QTYsMHg4N0VGLDB4ODdFQywweDg3RjIsMHg4N0UwLC8qIDB4QzgtMHhDRiAqLworCTB4ODk4NiwweDg5QjIsMHg4OUY0LDB4OEIyOCwweDhCMzksMHg4QjJDLDB4OEIyQiwweDhDNTAsLyogMHhEMC0weEQ3ICovCisJMHg4RDA1LDB4OEU1OSwweDhFNjMsMHg4RTY2LDB4OEU2NCwweDhFNUYsMHg4RTU1LDB4OEVDMCwvKiAweEQ4LTB4REYgKi8KKwkweDhGNDksMHg4RjRELDB4OTA4NywweDkwODMsMHg5MDg4LDB4OTFBQiwweDkxQUMsMHg5MUQwLC8qIDB4RTAtMHhFNyAqLworCTB4OTM5NCwweDkzOEEsMHg5Mzk2LDB4OTNBMiwweDkzQjMsMHg5M0FFLDB4OTNBQywweDkzQjAsLyogMHhFOC0weEVGICovCisJMHg5Mzk4LDB4OTM5QSwweDkzOTcsMHg5NUQ0LDB4OTVENiwweDk1RDAsMHg5NUQ1LDB4OTZFMiwvKiAweEYwLTB4RjcgKi8KKwkweDk2REMsMHg5NkQ5LDB4OTZEQiwweDk2REUsMHg5NzI0LDB4OTdBMywweDk3QTYsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0MzWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OTdBRCwweDk3RjksMHg5ODRELDB4OTg0RiwweDk4NEMsMHg5ODRFLDB4OTg1MywweDk4QkEsLyogMHg0MC0weDQ3ICovCisJMHg5OTNFLDB4OTkzRiwweDk5M0QsMHg5OTJFLDB4OTlBNSwweDlBMEUsMHg5QUMxLDB4OUIwMywvKiAweDQ4LTB4NEYgKi8KKwkweDlCMDYsMHg5QjRGLDB4OUI0RSwweDlCNEQsMHg5QkNBLDB4OUJDOSwweDlCRkQsMHg5QkM4LC8qIDB4NTAtMHg1NyAqLworCTB4OUJDMCwweDlENTEsMHg5RDVELDB4OUQ2MCwweDlFRTAsMHg5RjE1LDB4OUYyQywweDUxMzMsLyogMHg1OC0weDVGICovCisJMHg1NkE1LDB4NThERSwweDU4REYsMHg1OEUyLDB4NUJGNSwweDlGOTAsMHg1RUVDLDB4NjFGMiwvKiAweDYwLTB4NjcgKi8KKwkweDYxRjcsMHg2MUY2LDB4NjFGNSwweDY1MDAsMHg2NTBGLDB4NjZFMCwweDY2REQsMHg2QUU1LC8qIDB4NjgtMHg2RiAqLworCTB4NkFERCwweDZBREEsMHg2QUQzLDB4NzAxQiwweDcwMUYsMHg3MDI4LDB4NzAxQSwweDcwMUQsLyogMHg3MC0weDc3ICovCisJMHg3MDE1LDB4NzAxOCwweDcyMDYsMHg3MjBELDB4NzI1OCwweDcyQTIsMHg3Mzc4LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NzM3QSwweDc0QkQsMHg3NENBLDB4NzRFMywweDc1ODcsMHg3NTg2LDB4NzY1RiwvKiAweEEwLTB4QTcgKi8KKwkweDc2NjEsMHg3N0M3LDB4NzkxOSwweDc5QjEsMHg3QTZCLDB4N0E2OSwweDdDM0UsMHg3QzNGLC8qIDB4QTgtMHhBRiAqLworCTB4N0MzOCwweDdDM0QsMHg3QzM3LDB4N0M0MCwweDdFNkIsMHg3RTZELDB4N0U3OSwweDdFNjksLyogMHhCMC0weEI3ICovCisJMHg3RTZBLDB4N0Y4NSwweDdFNzMsMHg3RkI2LDB4N0ZCOSwweDdGQjgsMHg4MUQ4LDB4ODVFOSwvKiAweEI4LTB4QkYgKi8KKwkweDg1REQsMHg4NUVBLDB4ODVENSwweDg1RTQsMHg4NUU1LDB4ODVGNywweDg3RkIsMHg4ODA1LC8qIDB4QzAtMHhDNyAqLworCTB4ODgwRCwweDg3RjksMHg4N0ZFLDB4ODk2MCwweDg5NUYsMHg4OTU2LDB4ODk1RSwweDhCNDEsLyogMHhDOC0weENGICovCisJMHg4QjVDLDB4OEI1OCwweDhCNDksMHg4QjVBLDB4OEI0RSwweDhCNEYsMHg4QjQ2LDB4OEI1OSwvKiAweEQwLTB4RDcgKi8KKwkweDhEMDgsMHg4RDBBLDB4OEU3QywweDhFNzIsMHg4RTg3LDB4OEU3NiwweDhFNkMsMHg4RTdBLC8qIDB4RDgtMHhERiAqLworCTB4OEU3NCwweDhGNTQsMHg4RjRFLDB4OEZBRCwweDkwOEEsMHg5MDhCLDB4OTFCMSwweDkxQUUsLyogMHhFMC0weEU3ICovCisJMHg5M0UxLDB4OTNEMSwweDkzREYsMHg5M0MzLDB4OTNDOCwweDkzREMsMHg5M0RELDB4OTNENiwvKiAweEU4LTB4RUYgKi8KKwkweDkzRTIsMHg5M0NELDB4OTNEOCwweDkzRTQsMHg5M0Q3LDB4OTNFOCwweDk1REMsMHg5NkI0LC8qIDB4RjAtMHhGNyAqLworCTB4OTZFMywweDk3MkEsMHg5NzI3LDB4OTc2MSwweDk3REMsMHg5N0ZCLDB4OTg1RSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQzRbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5ODU4LDB4OTg1QiwweDk4QkMsMHg5OTQ1LDB4OTk0OSwweDlBMTYsMHg5QTE5LDB4OUIwRCwvKiAweDQwLTB4NDcgKi8KKwkweDlCRTgsMHg5QkU3LDB4OUJENiwweDlCREIsMHg5RDg5LDB4OUQ2MSwweDlENzIsMHg5RDZBLC8qIDB4NDgtMHg0RiAqLworCTB4OUQ2QywweDlFOTIsMHg5RTk3LDB4OUU5MywweDlFQjQsMHg1MkY4LDB4NTZBOCwweDU2QjcsLyogMHg1MC0weDU3ICovCisJMHg1NkI2LDB4NTZCNCwweDU2QkMsMHg1OEU0LDB4NUI0MCwweDVCNDMsMHg1QjdELDB4NUJGNiwvKiAweDU4LTB4NUYgKi8KKwkweDVEQzksMHg2MUY4LDB4NjFGQSwweDY1MTgsMHg2NTE0LDB4NjUxOSwweDY2RTYsMHg2NzI3LC8qIDB4NjAtMHg2NyAqLworCTB4NkFFQywweDcwM0UsMHg3MDMwLDB4NzAzMiwweDcyMTAsMHg3MzdCLDB4NzRDRiwweDc2NjIsLyogMHg2OC0weDZGICovCisJMHg3NjY1LDB4NzkyNiwweDc5MkEsMHg3OTJDLDB4NzkyQiwweDdBQzcsMHg3QUY2LDB4N0M0QywvKiAweDcwLTB4NzcgKi8KKwkweDdDNDMsMHg3QzRELDB4N0NFRiwweDdDRjAsMHg4RkFFLDB4N0U3RCwweDdFN0MsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg3RTgyLDB4N0Y0QywweDgwMDAsMHg4MURBLDB4ODI2NiwweDg1RkIsMHg4NUY5LC8qIDB4QTAtMHhBNyAqLworCTB4ODYxMSwweDg1RkEsMHg4NjA2LDB4ODYwQiwweDg2MDcsMHg4NjBBLDB4ODgxNCwweDg4MTUsLyogMHhBOC0weEFGICovCisJMHg4OTY0LDB4ODlCQSwweDg5RjgsMHg4QjcwLDB4OEI2QywweDhCNjYsMHg4QjZGLDB4OEI1RiwvKiAweEIwLTB4QjcgKi8KKwkweDhCNkIsMHg4RDBGLDB4OEQwRCwweDhFODksMHg4RTgxLDB4OEU4NSwweDhFODIsMHg5MUI0LC8qIDB4QjgtMHhCRiAqLworCTB4OTFDQiwweDk0MTgsMHg5NDAzLDB4OTNGRCwweDk1RTEsMHg5NzMwLDB4OThDNCwweDk5NTIsLyogMHhDMC0weEM3ICovCisJMHg5OTUxLDB4OTlBOCwweDlBMkIsMHg5QTMwLDB4OUEzNywweDlBMzUsMHg5QzEzLDB4OUMwRCwvKiAweEM4LTB4Q0YgKi8KKwkweDlFNzksMHg5RUI1LDB4OUVFOCwweDlGMkYsMHg5RjVGLDB4OUY2MywweDlGNjEsMHg1MTM3LC8qIDB4RDAtMHhENyAqLworCTB4NTEzOCwweDU2QzEsMHg1NkMwLDB4NTZDMiwweDU5MTQsMHg1QzZDLDB4NURDRCwweDYxRkMsLyogMHhEOC0weERGICovCisJMHg2MUZFLDB4NjUxRCwweDY1MUMsMHg2NTk1LDB4NjZFOSwweDZBRkIsMHg2QjA0LDB4NkFGQSwvKiAweEUwLTB4RTcgKi8KKwkweDZCQjIsMHg3MDRDLDB4NzIxQiwweDcyQTcsMHg3NEQ2LDB4NzRENCwweDc2NjksMHg3N0QzLC8qIDB4RTgtMHhFRiAqLworCTB4N0M1MCwweDdFOEYsMHg3RThDLDB4N0ZCQywweDg2MTcsMHg4NjJELDB4ODYxQSwweDg4MjMsLyogMHhGMC0weEY3ICovCisJMHg4ODIyLDB4ODgyMSwweDg4MUYsMHg4OTZBLDB4ODk2QywweDg5QkQsMHg4Qjc0LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9DNVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDhCNzcsMHg4QjdELDB4OEQxMywweDhFOEEsMHg4RThELDB4OEU4QiwweDhGNUYsMHg4RkFGLC8qIDB4NDAtMHg0NyAqLworCTB4OTFCQSwweDk0MkUsMHg5NDMzLDB4OTQzNSwweDk0M0EsMHg5NDM4LDB4OTQzMiwweDk0MkIsLyogMHg0OC0weDRGICovCisJMHg5NUUyLDB4OTczOCwweDk3MzksMHg5NzMyLDB4OTdGRiwweDk4NjcsMHg5ODY1LDB4OTk1NywvKiAweDUwLTB4NTcgKi8KKwkweDlBNDUsMHg5QTQzLDB4OUE0MCwweDlBM0UsMHg5QUNGLDB4OUI1NCwweDlCNTEsMHg5QzJELC8qIDB4NTgtMHg1RiAqLworCTB4OUMyNSwweDlEQUYsMHg5REI0LDB4OURDMiwweDlEQjgsMHg5RTlELDB4OUVFRiwweDlGMTksLyogMHg2MC0weDY3ICovCisJMHg5RjVDLDB4OUY2NiwweDlGNjcsMHg1MTNDLDB4NTEzQiwweDU2QzgsMHg1NkNBLDB4NTZDOSwvKiAweDY4LTB4NkYgKi8KKwkweDVCN0YsMHg1REQ0LDB4NUREMiwweDVGNEUsMHg2MUZGLDB4NjUyNCwweDZCMEEsMHg2QjYxLC8qIDB4NzAtMHg3NyAqLworCTB4NzA1MSwweDcwNTgsMHg3MzgwLDB4NzRFNCwweDc1OEEsMHg3NjZFLDB4NzY2QywweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDc5QjMsMHg3QzYwLDB4N0M1RiwweDgwN0UsMHg4MDdELDB4ODFERiwweDg5NzIsLyogMHhBMC0weEE3ICovCisJMHg4OTZGLDB4ODlGQywweDhCODAsMHg4RDE2LDB4OEQxNywweDhFOTEsMHg4RTkzLDB4OEY2MSwvKiAweEE4LTB4QUYgKi8KKwkweDkxNDgsMHg5NDQ0LDB4OTQ1MSwweDk0NTIsMHg5NzNELDB4OTczRSwweDk3QzMsMHg5N0MxLC8qIDB4QjAtMHhCNyAqLworCTB4OTg2QiwweDk5NTUsMHg5QTU1LDB4OUE0RCwweDlBRDIsMHg5QjFBLDB4OUM0OSwweDlDMzEsLyogMHhCOC0weEJGICovCisJMHg5QzNFLDB4OUMzQiwweDlERDMsMHg5REQ3LDB4OUYzNCwweDlGNkMsMHg5RjZBLDB4OUY5NCwvKiAweEMwLTB4QzcgKi8KKwkweDU2Q0MsMHg1REQ2LDB4NjIwMCwweDY1MjMsMHg2NTJCLDB4NjUyQSwweDY2RUMsMHg2QjEwLC8qIDB4QzgtMHhDRiAqLworCTB4NzREQSwweDdBQ0EsMHg3QzY0LDB4N0M2MywweDdDNjUsMHg3RTkzLDB4N0U5NiwweDdFOTQsLyogMHhEMC0weEQ3ICovCisJMHg4MUUyLDB4ODYzOCwweDg2M0YsMHg4ODMxLDB4OEI4QSwweDkwOTAsMHg5MDhGLDB4OTQ2MywvKiAweEQ4LTB4REYgKi8KKwkweDk0NjAsMHg5NDY0LDB4OTc2OCwweDk4NkYsMHg5OTVDLDB4OUE1QSwweDlBNUIsMHg5QTU3LC8qIDB4RTAtMHhFNyAqLworCTB4OUFEMywweDlBRDQsMHg5QUQxLDB4OUM1NCwweDlDNTcsMHg5QzU2LDB4OURFNSwweDlFOUYsLyogMHhFOC0weEVGICovCisJMHg5RUY0LDB4NTZEMSwweDU4RTksMHg2NTJDLDB4NzA1RSwweDc2NzEsMHg3NjcyLDB4NzdENywvKiAweEYwLTB4RjcgKi8KKwkweDdGNTAsMHg3Rjg4LDB4ODgzNiwweDg4MzksMHg4ODYyLDB4OEI5MywweDhCOTIsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0M2WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OEI5NiwweDgyNzcsMHg4RDFCLDB4OTFDMCwweDk0NkEsMHg5NzQyLDB4OTc0OCwweDk3NDQsLyogMHg0MC0weDQ3ICovCisJMHg5N0M2LDB4OTg3MCwweDlBNUYsMHg5QjIyLDB4OUI1OCwweDlDNUYsMHg5REY5LDB4OURGQSwvKiAweDQ4LTB4NEYgKi8KKwkweDlFN0MsMHg5RTdELDB4OUYwNywweDlGNzcsMHg5RjcyLDB4NUVGMywweDZCMTYsMHg3MDYzLC8qIDB4NTAtMHg1NyAqLworCTB4N0M2QywweDdDNkUsMHg4ODNCLDB4ODlDMCwweDhFQTEsMHg5MUMxLDB4OTQ3MiwweDk0NzAsLyogMHg1OC0weDVGICovCisJMHg5ODcxLDB4OTk1RSwweDlBRDYsMHg5QjIzLDB4OUVDQywweDcwNjQsMHg3N0RBLDB4OEI5QSwvKiAweDYwLTB4NjcgKi8KKwkweDk0NzcsMHg5N0M5LDB4OUE2MiwweDlBNjUsMHg3RTlDLDB4OEI5QywweDhFQUEsMHg5MUM1LC8qIDB4NjgtMHg2RiAqLworCTB4OTQ3RCwweDk0N0UsMHg5NDdDLDB4OUM3NywweDlDNzgsMHg5RUY3LDB4OEM1NCwweDk0N0YsLyogMHg3MC0weDc3ICovCisJMHg5RTFBLDB4NzIyOCwweDlBNkEsMHg5QjMxLDB4OUUxQiwweDlFMUUsMHg3QzcyLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9DOVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDRFNDIsMHg0RTVDLDB4NTFGNSwweDUzMUEsMHg1MzgyLDB4NEUwNywweDRFMEMsMHg0RTQ3LC8qIDB4NDAtMHg0NyAqLworCTB4NEU4RCwweDU2RDcsMHhGQTBDLDB4NUM2RSwweDVGNzMsMHg0RTBGLDB4NTE4NywweDRFMEUsLyogMHg0OC0weDRGICovCisJMHg0RTJFLDB4NEU5MywweDRFQzIsMHg0RUM5LDB4NEVDOCwweDUxOTgsMHg1MkZDLDB4NTM2QywvKiAweDUwLTB4NTcgKi8KKwkweDUzQjksMHg1NzIwLDB4NTkwMywweDU5MkMsMHg1QzEwLDB4NURGRiwweDY1RTEsMHg2QkIzLC8qIDB4NTgtMHg1RiAqLworCTB4NkJDQywweDZDMTQsMHg3MjNGLDB4NEUzMSwweDRFM0MsMHg0RUU4LDB4NEVEQywweDRFRTksLyogMHg2MC0weDY3ICovCisJMHg0RUUxLDB4NEVERCwweDRFREEsMHg1MjBDLDB4NTMxQywweDUzNEMsMHg1NzIyLDB4NTcyMywvKiAweDY4LTB4NkYgKi8KKwkweDU5MTcsMHg1OTJGLDB4NUI4MSwweDVCODQsMHg1QzEyLDB4NUMzQiwweDVDNzQsMHg1QzczLC8qIDB4NzAtMHg3NyAqLworCTB4NUUwNCwweDVFODAsMHg1RTgyLDB4NUZDOSwweDYyMDksMHg2MjUwLDB4NkMxNSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDZDMzYsMHg2QzQzLDB4NkMzRiwweDZDM0IsMHg3MkFFLDB4NzJCMCwweDczOEEsLyogMHhBMC0weEE3ICovCisJMHg3OUI4LDB4ODA4QSwweDk2MUUsMHg0RjBFLDB4NEYxOCwweDRGMkMsMHg0RUY1LDB4NEYxNCwvKiAweEE4LTB4QUYgKi8KKwkweDRFRjEsMHg0RjAwLDB4NEVGNywweDRGMDgsMHg0RjFELDB4NEYwMiwweDRGMDUsMHg0RjIyLC8qIDB4QjAtMHhCNyAqLworCTB4NEYxMywweDRGMDQsMHg0RUY0LDB4NEYxMiwweDUxQjEsMHg1MjEzLDB4NTIwOSwweDUyMTAsLyogMHhCOC0weEJGICovCisJMHg1MkE2LDB4NTMyMiwweDUzMUYsMHg1MzRELDB4NTM4QSwweDU0MDcsMHg1NkUxLDB4NTZERiwvKiAweEMwLTB4QzcgKi8KKwkweDU3MkUsMHg1NzJBLDB4NTczNCwweDU5M0MsMHg1OTgwLDB4NTk3QywweDU5ODUsMHg1OTdCLC8qIDB4QzgtMHhDRiAqLworCTB4NTk3RSwweDU5NzcsMHg1OTdGLDB4NUI1NiwweDVDMTUsMHg1QzI1LDB4NUM3QywweDVDN0EsLyogMHhEMC0weEQ3ICovCisJMHg1QzdCLDB4NUM3RSwweDVEREYsMHg1RTc1LDB4NUU4NCwweDVGMDIsMHg1RjFBLDB4NUY3NCwvKiAweEQ4LTB4REYgKi8KKwkweDVGRDUsMHg1RkQ0LDB4NUZDRiwweDYyNUMsMHg2MjVFLDB4NjI2NCwweDYyNjEsMHg2MjY2LC8qIDB4RTAtMHhFNyAqLworCTB4NjI2MiwweDYyNTksMHg2MjYwLDB4NjI1QSwweDYyNjUsMHg2NUVGLDB4NjVFRSwweDY3M0UsLyogMHhFOC0weEVGICovCisJMHg2NzM5LDB4NjczOCwweDY3M0IsMHg2NzNBLDB4NjczRiwweDY3M0MsMHg2NzMzLDB4NkMxOCwvKiAweEYwLTB4RjcgKi8KKwkweDZDNDYsMHg2QzUyLDB4NkM1QywweDZDNEYsMHg2QzRBLDB4NkM1NCwweDZDNEIsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0NBWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NkM0QywweDcwNzEsMHg3MjVFLDB4NzJCNCwweDcyQjUsMHg3MzhFLDB4NzUyQSwweDc2N0YsLyogMHg0MC0weDQ3ICovCisJMHg3QTc1LDB4N0Y1MSwweDgyNzgsMHg4MjdDLDB4ODI4MCwweDgyN0QsMHg4MjdGLDB4ODY0RCwvKiAweDQ4LTB4NEYgKi8KKwkweDg5N0UsMHg5MDk5LDB4OTA5NywweDkwOTgsMHg5MDlCLDB4OTA5NCwweDk2MjIsMHg5NjI0LC8qIDB4NTAtMHg1NyAqLworCTB4OTYyMCwweDk2MjMsMHg0RjU2LDB4NEYzQiwweDRGNjIsMHg0RjQ5LDB4NEY1MywweDRGNjQsLyogMHg1OC0weDVGICovCisJMHg0RjNFLDB4NEY2NywweDRGNTIsMHg0RjVGLDB4NEY0MSwweDRGNTgsMHg0RjJELDB4NEYzMywvKiAweDYwLTB4NjcgKi8KKwkweDRGM0YsMHg0RjYxLDB4NTE4RiwweDUxQjksMHg1MjFDLDB4NTIxRSwweDUyMjEsMHg1MkFELC8qIDB4NjgtMHg2RiAqLworCTB4NTJBRSwweDUzMDksMHg1MzYzLDB4NTM3MiwweDUzOEUsMHg1MzhGLDB4NTQzMCwweDU0MzcsLyogMHg3MC0weDc3ICovCisJMHg1NDJBLDB4NTQ1NCwweDU0NDUsMHg1NDE5LDB4NTQxQywweDU0MjUsMHg1NDE4LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NTQzRCwweDU0NEYsMHg1NDQxLDB4NTQyOCwweDU0MjQsMHg1NDQ3LDB4NTZFRSwvKiAweEEwLTB4QTcgKi8KKwkweDU2RTcsMHg1NkU1LDB4NTc0MSwweDU3NDUsMHg1NzRDLDB4NTc0OSwweDU3NEIsMHg1NzUyLC8qIDB4QTgtMHhBRiAqLworCTB4NTkwNiwweDU5NDAsMHg1OUE2LDB4NTk5OCwweDU5QTAsMHg1OTk3LDB4NTk4RSwweDU5QTIsLyogMHhCMC0weEI3ICovCisJMHg1OTkwLDB4NTk4RiwweDU5QTcsMHg1OUExLDB4NUI4RSwweDVCOTIsMHg1QzI4LDB4NUMyQSwvKiAweEI4LTB4QkYgKi8KKwkweDVDOEQsMHg1QzhGLDB4NUM4OCwweDVDOEIsMHg1Qzg5LDB4NUM5MiwweDVDOEEsMHg1Qzg2LC8qIDB4QzAtMHhDNyAqLworCTB4NUM5MywweDVDOTUsMHg1REUwLDB4NUUwQSwweDVFMEUsMHg1RThCLDB4NUU4OSwweDVFOEMsLyogMHhDOC0weENGICovCisJMHg1RTg4LDB4NUU4RCwweDVGMDUsMHg1RjFELDB4NUY3OCwweDVGNzYsMHg1RkQyLDB4NUZEMSwvKiAweEQwLTB4RDcgKi8KKwkweDVGRDAsMHg1RkVELDB4NUZFOCwweDVGRUUsMHg1RkYzLDB4NUZFMSwweDVGRTQsMHg1RkUzLC8qIDB4RDgtMHhERiAqLworCTB4NUZGQSwweDVGRUYsMHg1RkY3LDB4NUZGQiwweDYwMDAsMHg1RkY0LDB4NjIzQSwweDYyODMsLyogMHhFMC0weEU3ICovCisJMHg2MjhDLDB4NjI4RSwweDYyOEYsMHg2Mjk0LDB4NjI4NywweDYyNzEsMHg2MjdCLDB4NjI3QSwvKiAweEU4LTB4RUYgKi8KKwkweDYyNzAsMHg2MjgxLDB4NjI4OCwweDYyNzcsMHg2MjdELDB4NjI3MiwweDYyNzQsMHg2NTM3LC8qIDB4RjAtMHhGNyAqLworCTB4NjVGMCwweDY1RjQsMHg2NUYzLDB4NjVGMiwweDY1RjUsMHg2NzQ1LDB4Njc0NywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQ0JbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg2NzU5LDB4Njc1NSwweDY3NEMsMHg2NzQ4LDB4Njc1RCwweDY3NEQsMHg2NzVBLDB4Njc0QiwvKiAweDQwLTB4NDcgKi8KKwkweDZCRDAsMHg2QzE5LDB4NkMxQSwweDZDNzgsMHg2QzY3LDB4NkM2QiwweDZDODQsMHg2QzhCLC8qIDB4NDgtMHg0RiAqLworCTB4NkM4RiwweDZDNzEsMHg2QzZGLDB4NkM2OSwweDZDOUEsMHg2QzZELDB4NkM4NywweDZDOTUsLyogMHg1MC0weDU3ICovCisJMHg2QzlDLDB4NkM2NiwweDZDNzMsMHg2QzY1LDB4NkM3QiwweDZDOEUsMHg3MDc0LDB4NzA3QSwvKiAweDU4LTB4NUYgKi8KKwkweDcyNjMsMHg3MkJGLDB4NzJCRCwweDcyQzMsMHg3MkM2LDB4NzJDMSwweDcyQkEsMHg3MkM1LC8qIDB4NjAtMHg2NyAqLworCTB4NzM5NSwweDczOTcsMHg3MzkzLDB4NzM5NCwweDczOTIsMHg3NTNBLDB4NzUzOSwweDc1OTQsLyogMHg2OC0weDZGICovCisJMHg3NTk1LDB4NzY4MSwweDc5M0QsMHg4MDM0LDB4ODA5NSwweDgwOTksMHg4MDkwLDB4ODA5MiwvKiAweDcwLTB4NzcgKi8KKwkweDgwOUMsMHg4MjkwLDB4ODI4RiwweDgyODUsMHg4MjhFLDB4ODI5MSwweDgyOTMsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg4MjhBLDB4ODI4MywweDgyODQsMHg4Qzc4LDB4OEZDOSwweDhGQkYsMHg5MDlGLC8qIDB4QTAtMHhBNyAqLworCTB4OTBBMSwweDkwQTUsMHg5MDlFLDB4OTBBNywweDkwQTAsMHg5NjMwLDB4OTYyOCwweDk2MkYsLyogMHhBOC0weEFGICovCisJMHg5NjJELDB4NEUzMywweDRGOTgsMHg0RjdDLDB4NEY4NSwweDRGN0QsMHg0RjgwLDB4NEY4NywvKiAweEIwLTB4QjcgKi8KKwkweDRGNzYsMHg0Rjc0LDB4NEY4OSwweDRGODQsMHg0Rjc3LDB4NEY0QywweDRGOTcsMHg0RjZBLC8qIDB4QjgtMHhCRiAqLworCTB4NEY5QSwweDRGNzksMHg0RjgxLDB4NEY3OCwweDRGOTAsMHg0RjlDLDB4NEY5NCwweDRGOUUsLyogMHhDMC0weEM3ICovCisJMHg0RjkyLDB4NEY4MiwweDRGOTUsMHg0RjZCLDB4NEY2RSwweDUxOUUsMHg1MUJDLDB4NTFCRSwvKiAweEM4LTB4Q0YgKi8KKwkweDUyMzUsMHg1MjMyLDB4NTIzMywweDUyNDYsMHg1MjMxLDB4NTJCQywweDUzMEEsMHg1MzBCLC8qIDB4RDAtMHhENyAqLworCTB4NTMzQywweDUzOTIsMHg1Mzk0LDB4NTQ4NywweDU0N0YsMHg1NDgxLDB4NTQ5MSwweDU0ODIsLyogMHhEOC0weERGICovCisJMHg1NDg4LDB4NTQ2QiwweDU0N0EsMHg1NDdFLDB4NTQ2NSwweDU0NkMsMHg1NDc0LDB4NTQ2NiwvKiAweEUwLTB4RTcgKi8KKwkweDU0OEQsMHg1NDZGLDB4NTQ2MSwweDU0NjAsMHg1NDk4LDB4NTQ2MywweDU0NjcsMHg1NDY0LC8qIDB4RTgtMHhFRiAqLworCTB4NTZGNywweDU2RjksMHg1NzZGLDB4NTc3MiwweDU3NkQsMHg1NzZCLDB4NTc3MSwweDU3NzAsLyogMHhGMC0weEY3ICovCisJMHg1Nzc2LDB4NTc4MCwweDU3NzUsMHg1NzdCLDB4NTc3MywweDU3NzQsMHg1NzYyLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9DQ1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDU3NjgsMHg1NzdELDB4NTkwQywweDU5NDUsMHg1OUI1LDB4NTlCQSwweDU5Q0YsMHg1OUNFLC8qIDB4NDAtMHg0NyAqLworCTB4NTlCMiwweDU5Q0MsMHg1OUMxLDB4NTlCNiwweDU5QkMsMHg1OUMzLDB4NTlENiwweDU5QjEsLyogMHg0OC0weDRGICovCisJMHg1OUJELDB4NTlDMCwweDU5QzgsMHg1OUI0LDB4NTlDNywweDVCNjIsMHg1QjY1LDB4NUI5MywvKiAweDUwLTB4NTcgKi8KKwkweDVCOTUsMHg1QzQ0LDB4NUM0NywweDVDQUUsMHg1Q0E0LDB4NUNBMCwweDVDQjUsMHg1Q0FGLC8qIDB4NTgtMHg1RiAqLworCTB4NUNBOCwweDVDQUMsMHg1QzlGLDB4NUNBMywweDVDQUQsMHg1Q0EyLDB4NUNBQSwweDVDQTcsLyogMHg2MC0weDY3ICovCisJMHg1QzlELDB4NUNBNSwweDVDQjYsMHg1Q0IwLDB4NUNBNiwweDVFMTcsMHg1RTE0LDB4NUUxOSwvKiAweDY4LTB4NkYgKi8KKwkweDVGMjgsMHg1RjIyLDB4NUYyMywweDVGMjQsMHg1RjU0LDB4NUY4MiwweDVGN0UsMHg1RjdELC8qIDB4NzAtMHg3NyAqLworCTB4NUZERSwweDVGRTUsMHg2MDJELDB4NjAyNiwweDYwMTksMHg2MDMyLDB4NjAwQiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDYwMzQsMHg2MDBBLDB4NjAxNywweDYwMzMsMHg2MDFBLDB4NjAxRSwweDYwMkMsLyogMHhBMC0weEE3ICovCisJMHg2MDIyLDB4NjAwRCwweDYwMTAsMHg2MDJFLDB4NjAxMywweDYwMTEsMHg2MDBDLDB4NjAwOSwvKiAweEE4LTB4QUYgKi8KKwkweDYwMUMsMHg2MjE0LDB4NjIzRCwweDYyQUQsMHg2MkI0LDB4NjJEMSwweDYyQkUsMHg2MkFBLC8qIDB4QjAtMHhCNyAqLworCTB4NjJCNiwweDYyQ0EsMHg2MkFFLDB4NjJCMywweDYyQUYsMHg2MkJCLDB4NjJBOSwweDYyQjAsLyogMHhCOC0weEJGICovCisJMHg2MkI4LDB4NjUzRCwweDY1QTgsMHg2NUJCLDB4NjYwOSwweDY1RkMsMHg2NjA0LDB4NjYxMiwvKiAweEMwLTB4QzcgKi8KKwkweDY2MDgsMHg2NUZCLDB4NjYwMywweDY2MEIsMHg2NjBELDB4NjYwNSwweDY1RkQsMHg2NjExLC8qIDB4QzgtMHhDRiAqLworCTB4NjYxMCwweDY2RjYsMHg2NzBBLDB4Njc4NSwweDY3NkMsMHg2NzhFLDB4Njc5MiwweDY3NzYsLyogMHhEMC0weEQ3ICovCisJMHg2NzdCLDB4Njc5OCwweDY3ODYsMHg2Nzg0LDB4Njc3NCwweDY3OEQsMHg2NzhDLDB4Njc3QSwvKiAweEQ4LTB4REYgKi8KKwkweDY3OUYsMHg2NzkxLDB4Njc5OSwweDY3ODMsMHg2NzdELDB4Njc4MSwweDY3NzgsMHg2Nzc5LC8qIDB4RTAtMHhFNyAqLworCTB4Njc5NCwweDZCMjUsMHg2QjgwLDB4NkI3RSwweDZCREUsMHg2QzFELDB4NkM5MywweDZDRUMsLyogMHhFOC0weEVGICovCisJMHg2Q0VCLDB4NkNFRSwweDZDRDksMHg2Q0I2LDB4NkNENCwweDZDQUQsMHg2Q0U3LDB4NkNCNywvKiAweEYwLTB4RjcgKi8KKwkweDZDRDAsMHg2Q0MyLDB4NkNCQSwweDZDQzMsMHg2Q0M2LDB4NkNFRCwweDZDRjIsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0NEWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NkNEMiwweDZDREQsMHg2Q0I0LDB4NkM4QSwweDZDOUQsMHg2QzgwLDB4NkNERSwweDZDQzAsLyogMHg0MC0weDQ3ICovCisJMHg2RDMwLDB4NkNDRCwweDZDQzcsMHg2Q0IwLDB4NkNGOSwweDZDQ0YsMHg2Q0U5LDB4NkNEMSwvKiAweDQ4LTB4NEYgKi8KKwkweDcwOTQsMHg3MDk4LDB4NzA4NSwweDcwOTMsMHg3MDg2LDB4NzA4NCwweDcwOTEsMHg3MDk2LC8qIDB4NTAtMHg1NyAqLworCTB4NzA4MiwweDcwOUEsMHg3MDgzLDB4NzI2QSwweDcyRDYsMHg3MkNCLDB4NzJEOCwweDcyQzksLyogMHg1OC0weDVGICovCisJMHg3MkRDLDB4NzJEMiwweDcyRDQsMHg3MkRBLDB4NzJDQywweDcyRDEsMHg3M0E0LDB4NzNBMSwvKiAweDYwLTB4NjcgKi8KKwkweDczQUQsMHg3M0E2LDB4NzNBMiwweDczQTAsMHg3M0FDLDB4NzM5RCwweDc0REQsMHg3NEU4LC8qIDB4NjgtMHg2RiAqLworCTB4NzUzRiwweDc1NDAsMHg3NTNFLDB4NzU4QywweDc1OTgsMHg3NkFGLDB4NzZGMywweDc2RjEsLyogMHg3MC0weDc3ICovCisJMHg3NkYwLDB4NzZGNSwweDc3RjgsMHg3N0ZDLDB4NzdGOSwweDc3RkIsMHg3N0ZBLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NzdGNywweDc5NDIsMHg3OTNGLDB4NzlDNSwweDdBNzgsMHg3QTdCLDB4N0FGQiwvKiAweEEwLTB4QTcgKi8KKwkweDdDNzUsMHg3Q0ZELDB4ODAzNSwweDgwOEYsMHg4MEFFLDB4ODBBMywweDgwQjgsMHg4MEI1LC8qIDB4QTgtMHhBRiAqLworCTB4ODBBRCwweDgyMjAsMHg4MkEwLDB4ODJDMCwweDgyQUIsMHg4MjlBLDB4ODI5OCwweDgyOUIsLyogMHhCMC0weEI3ICovCisJMHg4MkI1LDB4ODJBNywweDgyQUUsMHg4MkJDLDB4ODI5RSwweDgyQkEsMHg4MkI0LDB4ODJBOCwvKiAweEI4LTB4QkYgKi8KKwkweDgyQTEsMHg4MkE5LDB4ODJDMiwweDgyQTQsMHg4MkMzLDB4ODJCNiwweDgyQTIsMHg4NjcwLC8qIDB4QzAtMHhDNyAqLworCTB4ODY2RiwweDg2NkQsMHg4NjZFLDB4OEM1NiwweDhGRDIsMHg4RkNCLDB4OEZEMywweDhGQ0QsLyogMHhDOC0weENGICovCisJMHg4RkQ2LDB4OEZENSwweDhGRDcsMHg5MEIyLDB4OTBCNCwweDkwQUYsMHg5MEIzLDB4OTBCMCwvKiAweEQwLTB4RDcgKi8KKwkweDk2MzksMHg5NjNELDB4OTYzQywweDk2M0EsMHg5NjQzLDB4NEZDRCwweDRGQzUsMHg0RkQzLC8qIDB4RDgtMHhERiAqLworCTB4NEZCMiwweDRGQzksMHg0RkNCLDB4NEZDMSwweDRGRDQsMHg0RkRDLDB4NEZEOSwweDRGQkIsLyogMHhFMC0weEU3ICovCisJMHg0RkIzLDB4NEZEQiwweDRGQzcsMHg0RkQ2LDB4NEZCQSwweDRGQzAsMHg0RkI5LDB4NEZFQywvKiAweEU4LTB4RUYgKi8KKwkweDUyNDQsMHg1MjQ5LDB4NTJDMCwweDUyQzIsMHg1MzNELDB4NTM3QywweDUzOTcsMHg1Mzk2LC8qIDB4RjAtMHhGNyAqLworCTB4NTM5OSwweDUzOTgsMHg1NEJBLDB4NTRBMSwweDU0QUQsMHg1NEE1LDB4NTRDRiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfQ0VbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg1NEMzLDB4ODMwRCwweDU0QjcsMHg1NEFFLDB4NTRENiwweDU0QjYsMHg1NEM1LDB4NTRDNiwvKiAweDQwLTB4NDcgKi8KKwkweDU0QTAsMHg1NDcwLDB4NTRCQywweDU0QTIsMHg1NEJFLDB4NTQ3MiwweDU0REUsMHg1NEIwLC8qIDB4NDgtMHg0RiAqLworCTB4NTdCNSwweDU3OUUsMHg1NzlGLDB4NTdBNCwweDU3OEMsMHg1Nzk3LDB4NTc5RCwweDU3OUIsLyogMHg1MC0weDU3ICovCisJMHg1Nzk0LDB4NTc5OCwweDU3OEYsMHg1Nzk5LDB4NTdBNSwweDU3OUEsMHg1Nzk1LDB4NThGNCwvKiAweDU4LTB4NUYgKi8KKwkweDU5MEQsMHg1OTUzLDB4NTlFMSwweDU5REUsMHg1OUVFLDB4NUEwMCwweDU5RjEsMHg1OURELC8qIDB4NjAtMHg2NyAqLworCTB4NTlGQSwweDU5RkQsMHg1OUZDLDB4NTlGNiwweDU5RTQsMHg1OUYyLDB4NTlGNywweDU5REIsLyogMHg2OC0weDZGICovCisJMHg1OUU5LDB4NTlGMywweDU5RjUsMHg1OUUwLDB4NTlGRSwweDU5RjQsMHg1OUVELDB4NUJBOCwvKiAweDcwLTB4NzcgKi8KKwkweDVDNEMsMHg1Q0QwLDB4NUNEOCwweDVDQ0MsMHg1Q0Q3LDB4NUNDQiwweDVDREIsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg1Q0RFLDB4NUNEQSwweDVDQzksMHg1Q0M3LDB4NUNDQSwweDVDRDYsMHg1Q0QzLC8qIDB4QTAtMHhBNyAqLworCTB4NUNENCwweDVDQ0YsMHg1Q0M4LDB4NUNDNiwweDVDQ0UsMHg1Q0RGLDB4NUNGOCwweDVERjksLyogMHhBOC0weEFGICovCisJMHg1RTIxLDB4NUUyMiwweDVFMjMsMHg1RTIwLDB4NUUyNCwweDVFQjAsMHg1RUE0LDB4NUVBMiwvKiAweEIwLTB4QjcgKi8KKwkweDVFOUIsMHg1RUEzLDB4NUVBNSwweDVGMDcsMHg1RjJFLDB4NUY1NiwweDVGODYsMHg2MDM3LC8qIDB4QjgtMHhCRiAqLworCTB4NjAzOSwweDYwNTQsMHg2MDcyLDB4NjA1RSwweDYwNDUsMHg2MDUzLDB4NjA0NywweDYwNDksLyogMHhDMC0weEM3ICovCisJMHg2MDVCLDB4NjA0QywweDYwNDAsMHg2MDQyLDB4NjA1RiwweDYwMjQsMHg2MDQ0LDB4NjA1OCwvKiAweEM4LTB4Q0YgKi8KKwkweDYwNjYsMHg2MDZFLDB4NjI0MiwweDYyNDMsMHg2MkNGLDB4NjMwRCwweDYzMEIsMHg2MkY1LC8qIDB4RDAtMHhENyAqLworCTB4NjMwRSwweDYzMDMsMHg2MkVCLDB4NjJGOSwweDYzMEYsMHg2MzBDLDB4NjJGOCwweDYyRjYsLyogMHhEOC0weERGICovCisJMHg2MzAwLDB4NjMxMywweDYzMTQsMHg2MkZBLDB4NjMxNSwweDYyRkIsMHg2MkYwLDB4NjU0MSwvKiAweEUwLTB4RTcgKi8KKwkweDY1NDMsMHg2NUFBLDB4NjVCRiwweDY2MzYsMHg2NjIxLDB4NjYzMiwweDY2MzUsMHg2NjFDLC8qIDB4RTgtMHhFRiAqLworCTB4NjYyNiwweDY2MjIsMHg2NjMzLDB4NjYyQiwweDY2M0EsMHg2NjFELDB4NjYzNCwweDY2MzksLyogMHhGMC0weEY3ICovCisJMHg2NjJFLDB4NjcwRiwweDY3MTAsMHg2N0MxLDB4NjdGMiwweDY3QzgsMHg2N0JBLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9DRlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDY3REMsMHg2N0JCLDB4NjdGOCwweDY3RDgsMHg2N0MwLDB4NjdCNywweDY3QzUsMHg2N0VCLC8qIDB4NDAtMHg0NyAqLworCTB4NjdFNCwweDY3REYsMHg2N0I1LDB4NjdDRCwweDY3QjMsMHg2N0Y3LDB4NjdGNiwweDY3RUUsLyogMHg0OC0weDRGICovCisJMHg2N0UzLDB4NjdDMiwweDY3QjksMHg2N0NFLDB4NjdFNywweDY3RjAsMHg2N0IyLDB4NjdGQywvKiAweDUwLTB4NTcgKi8KKwkweDY3QzYsMHg2N0VELDB4NjdDQywweDY3QUUsMHg2N0U2LDB4NjdEQiwweDY3RkEsMHg2N0M5LC8qIDB4NTgtMHg1RiAqLworCTB4NjdDQSwweDY3QzMsMHg2N0VBLDB4NjdDQiwweDZCMjgsMHg2QjgyLDB4NkI4NCwweDZCQjYsLyogMHg2MC0weDY3ICovCisJMHg2QkQ2LDB4NkJEOCwweDZCRTAsMHg2QzIwLDB4NkMyMSwweDZEMjgsMHg2RDM0LDB4NkQyRCwvKiAweDY4LTB4NkYgKi8KKwkweDZEMUYsMHg2RDNDLDB4NkQzRiwweDZEMTIsMHg2RDBBLDB4NkNEQSwweDZEMzMsMHg2RDA0LC8qIDB4NzAtMHg3NyAqLworCTB4NkQxOSwweDZEM0EsMHg2RDFBLDB4NkQxMSwweDZEMDAsMHg2RDFELDB4NkQ0MiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDZEMDEsMHg2RDE4LDB4NkQzNywweDZEMDMsMHg2RDBGLDB4NkQ0MCwweDZEMDcsLyogMHhBMC0weEE3ICovCisJMHg2RDIwLDB4NkQyQywweDZEMDgsMHg2RDIyLDB4NkQwOSwweDZEMTAsMHg3MEI3LDB4NzA5RiwvKiAweEE4LTB4QUYgKi8KKwkweDcwQkUsMHg3MEIxLDB4NzBCMCwweDcwQTEsMHg3MEI0LDB4NzBCNSwweDcwQTksMHg3MjQxLC8qIDB4QjAtMHhCNyAqLworCTB4NzI0OSwweDcyNEEsMHg3MjZDLDB4NzI3MCwweDcyNzMsMHg3MjZFLDB4NzJDQSwweDcyRTQsLyogMHhCOC0weEJGICovCisJMHg3MkU4LDB4NzJFQiwweDcyREYsMHg3MkVBLDB4NzJFNiwweDcyRTMsMHg3Mzg1LDB4NzNDQywvKiAweEMwLTB4QzcgKi8KKwkweDczQzIsMHg3M0M4LDB4NzNDNSwweDczQjksMHg3M0I2LDB4NzNCNSwweDczQjQsMHg3M0VCLC8qIDB4QzgtMHhDRiAqLworCTB4NzNCRiwweDczQzcsMHg3M0JFLDB4NzNDMywweDczQzYsMHg3M0I4LDB4NzNDQiwweDc0RUMsLyogMHhEMC0weEQ3ICovCisJMHg3NEVFLDB4NzUyRSwweDc1NDcsMHg3NTQ4LDB4NzVBNywweDc1QUEsMHg3Njc5LDB4NzZDNCwvKiAweEQ4LTB4REYgKi8KKwkweDc3MDgsMHg3NzAzLDB4NzcwNCwweDc3MDUsMHg3NzBBLDB4NzZGNywweDc2RkIsMHg3NkZBLC8qIDB4RTAtMHhFNyAqLworCTB4NzdFNywweDc3RTgsMHg3ODA2LDB4NzgxMSwweDc4MTIsMHg3ODA1LDB4NzgxMCwweDc4MEYsLyogMHhFOC0weEVGICovCisJMHg3ODBFLDB4NzgwOSwweDc4MDMsMHg3ODEzLDB4Nzk0QSwweDc5NEMsMHg3OTRCLDB4Nzk0NSwvKiAweEYwLTB4RjcgKi8KKwkweDc5NDQsMHg3OUQ1LDB4NzlDRCwweDc5Q0YsMHg3OUQ2LDB4NzlDRSwweDdBODAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0QwWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4N0E3RSwweDdBRDEsMHg3QjAwLDB4N0IwMSwweDdDN0EsMHg3Qzc4LDB4N0M3OSwweDdDN0YsLyogMHg0MC0weDQ3ICovCisJMHg3QzgwLDB4N0M4MSwweDdEMDMsMHg3RDA4LDB4N0QwMSwweDdGNTgsMHg3RjkxLDB4N0Y4RCwvKiAweDQ4LTB4NEYgKi8KKwkweDdGQkUsMHg4MDA3LDB4ODAwRSwweDgwMEYsMHg4MDE0LDB4ODAzNywweDgwRDgsMHg4MEM3LC8qIDB4NTAtMHg1NyAqLworCTB4ODBFMCwweDgwRDEsMHg4MEM4LDB4ODBDMiwweDgwRDAsMHg4MEM1LDB4ODBFMywweDgwRDksLyogMHg1OC0weDVGICovCisJMHg4MERDLDB4ODBDQSwweDgwRDUsMHg4MEM5LDB4ODBDRiwweDgwRDcsMHg4MEU2LDB4ODBDRCwvKiAweDYwLTB4NjcgKi8KKwkweDgxRkYsMHg4MjIxLDB4ODI5NCwweDgyRDksMHg4MkZFLDB4ODJGOSwweDgzMDcsMHg4MkU4LC8qIDB4NjgtMHg2RiAqLworCTB4ODMwMCwweDgyRDUsMHg4MzNBLDB4ODJFQiwweDgyRDYsMHg4MkY0LDB4ODJFQywweDgyRTEsLyogMHg3MC0weDc3ICovCisJMHg4MkYyLDB4ODJGNSwweDgzMEMsMHg4MkZCLDB4ODJGNiwweDgyRjAsMHg4MkVBLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4ODJFNCwweDgyRTAsMHg4MkZBLDB4ODJGMywweDgyRUQsMHg4Njc3LDB4ODY3NCwvKiAweEEwLTB4QTcgKi8KKwkweDg2N0MsMHg4NjczLDB4ODg0MSwweDg4NEUsMHg4ODY3LDB4ODg2QSwweDg4NjksMHg4OUQzLC8qIDB4QTgtMHhBRiAqLworCTB4OEEwNCwweDhBMDcsMHg4RDcyLDB4OEZFMywweDhGRTEsMHg4RkVFLDB4OEZFMCwweDkwRjEsLyogMHhCMC0weEI3ICovCisJMHg5MEJELDB4OTBCRiwweDkwRDUsMHg5MEM1LDB4OTBCRSwweDkwQzcsMHg5MENCLDB4OTBDOCwvKiAweEI4LTB4QkYgKi8KKwkweDkxRDQsMHg5MUQzLDB4OTY1NCwweDk2NEYsMHg5NjUxLDB4OTY1MywweDk2NEEsMHg5NjRFLC8qIDB4QzAtMHhDNyAqLworCTB4NTAxRSwweDUwMDUsMHg1MDA3LDB4NTAxMywweDUwMjIsMHg1MDMwLDB4NTAxQiwweDRGRjUsLyogMHhDOC0weENGICovCisJMHg0RkY0LDB4NTAzMywweDUwMzcsMHg1MDJDLDB4NEZGNiwweDRGRjcsMHg1MDE3LDB4NTAxQywvKiAweEQwLTB4RDcgKi8KKwkweDUwMjAsMHg1MDI3LDB4NTAzNSwweDUwMkYsMHg1MDMxLDB4NTAwRSwweDUxNUEsMHg1MTk0LC8qIDB4RDgtMHhERiAqLworCTB4NTE5MywweDUxQ0EsMHg1MUM0LDB4NTFDNSwweDUxQzgsMHg1MUNFLDB4NTI2MSwweDUyNUEsLyogMHhFMC0weEU3ICovCisJMHg1MjUyLDB4NTI1RSwweDUyNUYsMHg1MjU1LDB4NTI2MiwweDUyQ0QsMHg1MzBFLDB4NTM5RSwvKiAweEU4LTB4RUYgKi8KKwkweDU1MjYsMHg1NEUyLDB4NTUxNywweDU1MTIsMHg1NEU3LDB4NTRGMywweDU0RTQsMHg1NTFBLC8qIDB4RjAtMHhGNyAqLworCTB4NTRGRiwweDU1MDQsMHg1NTA4LDB4NTRFQiwweDU1MTEsMHg1NTA1LDB4NTRGMSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRDFbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg1NTBBLDB4NTRGQiwweDU0RjcsMHg1NEY4LDB4NTRFMCwweDU1MEUsMHg1NTAzLDB4NTUwQiwvKiAweDQwLTB4NDcgKi8KKwkweDU3MDEsMHg1NzAyLDB4NTdDQywweDU4MzIsMHg1N0Q1LDB4NTdEMiwweDU3QkEsMHg1N0M2LC8qIDB4NDgtMHg0RiAqLworCTB4NTdCRCwweDU3QkMsMHg1N0I4LDB4NTdCNiwweDU3QkYsMHg1N0M3LDB4NTdEMCwweDU3QjksLyogMHg1MC0weDU3ICovCisJMHg1N0MxLDB4NTkwRSwweDU5NEEsMHg1QTE5LDB4NUExNiwweDVBMkQsMHg1QTJFLDB4NUExNSwvKiAweDU4LTB4NUYgKi8KKwkweDVBMEYsMHg1QTE3LDB4NUEwQSwweDVBMUUsMHg1QTMzLDB4NUI2QywweDVCQTcsMHg1QkFELC8qIDB4NjAtMHg2NyAqLworCTB4NUJBQywweDVDMDMsMHg1QzU2LDB4NUM1NCwweDVDRUMsMHg1Q0ZGLDB4NUNFRSwweDVDRjEsLyogMHg2OC0weDZGICovCisJMHg1Q0Y3LDB4NUQwMCwweDVDRjksMHg1RTI5LDB4NUUyOCwweDVFQTgsMHg1RUFFLDB4NUVBQSwvKiAweDcwLTB4NzcgKi8KKwkweDVFQUMsMHg1RjMzLDB4NUYzMCwweDVGNjcsMHg2MDVELDB4NjA1QSwweDYwNjcsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg2MDQxLDB4NjBBMiwweDYwODgsMHg2MDgwLDB4NjA5MiwweDYwODEsMHg2MDlELC8qIDB4QTAtMHhBNyAqLworCTB4NjA4MywweDYwOTUsMHg2MDlCLDB4NjA5NywweDYwODcsMHg2MDlDLDB4NjA4RSwweDYyMTksLyogMHhBOC0weEFGICovCisJMHg2MjQ2LDB4NjJGMiwweDYzMTAsMHg2MzU2LDB4NjMyQywweDYzNDQsMHg2MzQ1LDB4NjMzNiwvKiAweEIwLTB4QjcgKi8KKwkweDYzNDMsMHg2M0U0LDB4NjMzOSwweDYzNEIsMHg2MzRBLDB4NjMzQywweDYzMjksMHg2MzQxLC8qIDB4QjgtMHhCRiAqLworCTB4NjMzNCwweDYzNTgsMHg2MzU0LDB4NjM1OSwweDYzMkQsMHg2MzQ3LDB4NjMzMywweDYzNUEsLyogMHhDMC0weEM3ICovCisJMHg2MzUxLDB4NjMzOCwweDYzNTcsMHg2MzQwLDB4NjM0OCwweDY1NEEsMHg2NTQ2LDB4NjVDNiwvKiAweEM4LTB4Q0YgKi8KKwkweDY1QzMsMHg2NUM0LDB4NjVDMiwweDY2NEEsMHg2NjVGLDB4NjY0NywweDY2NTEsMHg2NzEyLC8qIDB4RDAtMHhENyAqLworCTB4NjcxMywweDY4MUYsMHg2ODFBLDB4Njg0OSwweDY4MzIsMHg2ODMzLDB4NjgzQiwweDY4NEIsLyogMHhEOC0weERGICovCisJMHg2ODRGLDB4NjgxNiwweDY4MzEsMHg2ODFDLDB4NjgzNSwweDY4MkIsMHg2ODJELDB4NjgyRiwvKiAweEUwLTB4RTcgKi8KKwkweDY4NEUsMHg2ODQ0LDB4NjgzNCwweDY4MUQsMHg2ODEyLDB4NjgxNCwweDY4MjYsMHg2ODI4LC8qIDB4RTgtMHhFRiAqLworCTB4NjgyRSwweDY4NEQsMHg2ODNBLDB4NjgyNSwweDY4MjAsMHg2QjJDLDB4NkIyRiwweDZCMkQsLyogMHhGMC0weEY3ICovCisJMHg2QjMxLDB4NkIzNCwweDZCNkQsMHg4MDgyLDB4NkI4OCwweDZCRTYsMHg2QkU0LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9EMlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDZCRTgsMHg2QkUzLDB4NkJFMiwweDZCRTcsMHg2QzI1LDB4NkQ3QSwweDZENjMsMHg2RDY0LC8qIDB4NDAtMHg0NyAqLworCTB4NkQ3NiwweDZEMEQsMHg2RDYxLDB4NkQ5MiwweDZENTgsMHg2RDYyLDB4NkQ2RCwweDZENkYsLyogMHg0OC0weDRGICovCisJMHg2RDkxLDB4NkQ4RCwweDZERUYsMHg2RDdGLDB4NkQ4NiwweDZENUUsMHg2RDY3LDB4NkQ2MCwvKiAweDUwLTB4NTcgKi8KKwkweDZEOTcsMHg2RDcwLDB4NkQ3QywweDZENUYsMHg2RDgyLDB4NkQ5OCwweDZEMkYsMHg2RDY4LC8qIDB4NTgtMHg1RiAqLworCTB4NkQ4QiwweDZEN0UsMHg2RDgwLDB4NkQ4NCwweDZEMTYsMHg2RDgzLDB4NkQ3QiwweDZEN0QsLyogMHg2MC0weDY3ICovCisJMHg2RDc1LDB4NkQ5MCwweDcwREMsMHg3MEQzLDB4NzBEMSwweDcwREQsMHg3MENCLDB4N0YzOSwvKiAweDY4LTB4NkYgKi8KKwkweDcwRTIsMHg3MEQ3LDB4NzBEMiwweDcwREUsMHg3MEUwLDB4NzBENCwweDcwQ0QsMHg3MEM1LC8qIDB4NzAtMHg3NyAqLworCTB4NzBDNiwweDcwQzcsMHg3MERBLDB4NzBDRSwweDcwRTEsMHg3MjQyLDB4NzI3OCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDcyNzcsMHg3Mjc2LDB4NzMwMCwweDcyRkEsMHg3MkY0LDB4NzJGRSwweDcyRjYsLyogMHhBMC0weEE3ICovCisJMHg3MkYzLDB4NzJGQiwweDczMDEsMHg3M0QzLDB4NzNEOSwweDczRTUsMHg3M0Q2LDB4NzNCQywvKiAweEE4LTB4QUYgKi8KKwkweDczRTcsMHg3M0UzLDB4NzNFOSwweDczREMsMHg3M0QyLDB4NzNEQiwweDczRDQsMHg3M0RELC8qIDB4QjAtMHhCNyAqLworCTB4NzNEQSwweDczRDcsMHg3M0Q4LDB4NzNFOCwweDc0REUsMHg3NERGLDB4NzRGNCwweDc0RjUsLyogMHhCOC0weEJGICovCisJMHg3NTIxLDB4NzU1QiwweDc1NUYsMHg3NUIwLDB4NzVDMSwweDc1QkIsMHg3NUM0LDB4NzVDMCwvKiAweEMwLTB4QzcgKi8KKwkweDc1QkYsMHg3NUI2LDB4NzVCQSwweDc2OEEsMHg3NkM5LDB4NzcxRCwweDc3MUIsMHg3NzEwLC8qIDB4QzgtMHhDRiAqLworCTB4NzcxMywweDc3MTIsMHg3NzIzLDB4NzcxMSwweDc3MTUsMHg3NzE5LDB4NzcxQSwweDc3MjIsLyogMHhEMC0weEQ3ICovCisJMHg3NzI3LDB4NzgyMywweDc4MkMsMHg3ODIyLDB4NzgzNSwweDc4MkYsMHg3ODI4LDB4NzgyRSwvKiAweEQ4LTB4REYgKi8KKwkweDc4MkIsMHg3ODIxLDB4NzgyOSwweDc4MzMsMHg3ODJBLDB4NzgzMSwweDc5NTQsMHg3OTVCLC8qIDB4RTAtMHhFNyAqLworCTB4Nzk0RiwweDc5NUMsMHg3OTUzLDB4Nzk1MiwweDc5NTEsMHg3OUVCLDB4NzlFQywweDc5RTAsLyogMHhFOC0weEVGICovCisJMHg3OUVFLDB4NzlFRCwweDc5RUEsMHg3OURDLDB4NzlERSwweDc5REQsMHg3QTg2LDB4N0E4OSwvKiAweEYwLTB4RjcgKi8KKwkweDdBODUsMHg3QThCLDB4N0E4QywweDdBOEEsMHg3QTg3LDB4N0FEOCwweDdCMTAsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0QzWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4N0IwNCwweDdCMTMsMHg3QjA1LDB4N0IwRiwweDdCMDgsMHg3QjBBLDB4N0IwRSwweDdCMDksLyogMHg0MC0weDQ3ICovCisJMHg3QjEyLDB4N0M4NCwweDdDOTEsMHg3QzhBLDB4N0M4QywweDdDODgsMHg3QzhELDB4N0M4NSwvKiAweDQ4LTB4NEYgKi8KKwkweDdEMUUsMHg3RDFELDB4N0QxMSwweDdEMEUsMHg3RDE4LDB4N0QxNiwweDdEMTMsMHg3RDFGLC8qIDB4NTAtMHg1NyAqLworCTB4N0QxMiwweDdEMEYsMHg3RDBDLDB4N0Y1QywweDdGNjEsMHg3RjVFLDB4N0Y2MCwweDdGNUQsLyogMHg1OC0weDVGICovCisJMHg3RjVCLDB4N0Y5NiwweDdGOTIsMHg3RkMzLDB4N0ZDMiwweDdGQzAsMHg4MDE2LDB4ODAzRSwvKiAweDYwLTB4NjcgKi8KKwkweDgwMzksMHg4MEZBLDB4ODBGMiwweDgwRjksMHg4MEY1LDB4ODEwMSwweDgwRkIsMHg4MTAwLC8qIDB4NjgtMHg2RiAqLworCTB4ODIwMSwweDgyMkYsMHg4MjI1LDB4ODMzMywweDgzMkQsMHg4MzQ0LDB4ODMxOSwweDgzNTEsLyogMHg3MC0weDc3ICovCisJMHg4MzI1LDB4ODM1NiwweDgzM0YsMHg4MzQxLDB4ODMyNiwweDgzMUMsMHg4MzIyLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4ODM0MiwweDgzNEUsMHg4MzFCLDB4ODMyQSwweDgzMDgsMHg4MzNDLDB4ODM0RCwvKiAweEEwLTB4QTcgKi8KKwkweDgzMTYsMHg4MzI0LDB4ODMyMCwweDgzMzcsMHg4MzJGLDB4ODMyOSwweDgzNDcsMHg4MzQ1LC8qIDB4QTgtMHhBRiAqLworCTB4ODM0QywweDgzNTMsMHg4MzFFLDB4ODMyQywweDgzNEIsMHg4MzI3LDB4ODM0OCwweDg2NTMsLyogMHhCMC0weEI3ICovCisJMHg4NjUyLDB4ODZBMiwweDg2QTgsMHg4Njk2LDB4ODY4RCwweDg2OTEsMHg4NjlFLDB4ODY4NywvKiAweEI4LTB4QkYgKi8KKwkweDg2OTcsMHg4Njg2LDB4ODY4QiwweDg2OUEsMHg4Njg1LDB4ODZBNSwweDg2OTksMHg4NkExLC8qIDB4QzAtMHhDNyAqLworCTB4ODZBNywweDg2OTUsMHg4Njk4LDB4ODY4RSwweDg2OUQsMHg4NjkwLDB4ODY5NCwweDg4NDMsLyogMHhDOC0weENGICovCisJMHg4ODQ0LDB4ODg2RCwweDg4NzUsMHg4ODc2LDB4ODg3MiwweDg4ODAsMHg4ODcxLDB4ODg3RiwvKiAweEQwLTB4RDcgKi8KKwkweDg4NkYsMHg4ODgzLDB4ODg3RSwweDg4NzQsMHg4ODdDLDB4OEExMiwweDhDNDcsMHg4QzU3LC8qIDB4RDgtMHhERiAqLworCTB4OEM3QiwweDhDQTQsMHg4Q0EzLDB4OEQ3NiwweDhENzgsMHg4REI1LDB4OERCNywweDhEQjYsLyogMHhFMC0weEU3ICovCisJMHg4RUQxLDB4OEVEMywweDhGRkUsMHg4RkY1LDB4OTAwMiwweDhGRkYsMHg4RkZCLDB4OTAwNCwvKiAweEU4LTB4RUYgKi8KKwkweDhGRkMsMHg4RkY2LDB4OTBENiwweDkwRTAsMHg5MEQ5LDB4OTBEQSwweDkwRTMsMHg5MERGLC8qIDB4RjAtMHhGNyAqLworCTB4OTBFNSwweDkwRDgsMHg5MERCLDB4OTBENywweDkwREMsMHg5MEU0LDB4OTE1MCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRDRbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5MTRFLDB4OTE0RiwweDkxRDUsMHg5MUUyLDB4OTFEQSwweDk2NUMsMHg5NjVGLDB4OTZCQywvKiAweDQwLTB4NDcgKi8KKwkweDk4RTMsMHg5QURGLDB4OUIyRiwweDRFN0YsMHg1MDcwLDB4NTA2QSwweDUwNjEsMHg1MDVFLC8qIDB4NDgtMHg0RiAqLworCTB4NTA2MCwweDUwNTMsMHg1MDRCLDB4NTA1RCwweDUwNzIsMHg1MDQ4LDB4NTA0RCwweDUwNDEsLyogMHg1MC0weDU3ICovCisJMHg1MDVCLDB4NTA0QSwweDUwNjIsMHg1MDE1LDB4NTA0NSwweDUwNUYsMHg1MDY5LDB4NTA2QiwvKiAweDU4LTB4NUYgKi8KKwkweDUwNjMsMHg1MDY0LDB4NTA0NiwweDUwNDAsMHg1MDZFLDB4NTA3MywweDUwNTcsMHg1MDUxLC8qIDB4NjAtMHg2NyAqLworCTB4NTFEMCwweDUyNkIsMHg1MjZELDB4NTI2QywweDUyNkUsMHg1MkQ2LDB4NTJEMywweDUzMkQsLyogMHg2OC0weDZGICovCisJMHg1MzlDLDB4NTU3NSwweDU1NzYsMHg1NTNDLDB4NTU0RCwweDU1NTAsMHg1NTM0LDB4NTUyQSwvKiAweDcwLTB4NzcgKi8KKwkweDU1NTEsMHg1NTYyLDB4NTUzNiwweDU1MzUsMHg1NTMwLDB4NTU1MiwweDU1NDUsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg1NTBDLDB4NTUzMiwweDU1NjUsMHg1NTRFLDB4NTUzOSwweDU1NDgsMHg1NTJELC8qIDB4QTAtMHhBNyAqLworCTB4NTUzQiwweDU1NDAsMHg1NTRCLDB4NTcwQSwweDU3MDcsMHg1N0ZCLDB4NTgxNCwweDU3RTIsLyogMHhBOC0weEFGICovCisJMHg1N0Y2LDB4NTdEQywweDU3RjQsMHg1ODAwLDB4NTdFRCwweDU3RkQsMHg1ODA4LDB4NTdGOCwvKiAweEIwLTB4QjcgKi8KKwkweDU4MEIsMHg1N0YzLDB4NTdDRiwweDU4MDcsMHg1N0VFLDB4NTdFMywweDU3RjIsMHg1N0U1LC8qIDB4QjgtMHhCRiAqLworCTB4NTdFQywweDU3RTEsMHg1ODBFLDB4NTdGQywweDU4MTAsMHg1N0U3LDB4NTgwMSwweDU4MEMsLyogMHhDMC0weEM3ICovCisJMHg1N0YxLDB4NTdFOSwweDU3RjAsMHg1ODBELDB4NTgwNCwweDU5NUMsMHg1QTYwLDB4NUE1OCwvKiAweEM4LTB4Q0YgKi8KKwkweDVBNTUsMHg1QTY3LDB4NUE1RSwweDVBMzgsMHg1QTM1LDB4NUE2RCwweDVBNTAsMHg1QTVGLC8qIDB4RDAtMHhENyAqLworCTB4NUE2NSwweDVBNkMsMHg1QTUzLDB4NUE2NCwweDVBNTcsMHg1QTQzLDB4NUE1RCwweDVBNTIsLyogMHhEOC0weERGICovCisJMHg1QTQ0LDB4NUE1QiwweDVBNDgsMHg1QThFLDB4NUEzRSwweDVBNEQsMHg1QTM5LDB4NUE0QywvKiAweEUwLTB4RTcgKi8KKwkweDVBNzAsMHg1QTY5LDB4NUE0NywweDVBNTEsMHg1QTU2LDB4NUE0MiwweDVBNUMsMHg1QjcyLC8qIDB4RTgtMHhFRiAqLworCTB4NUI2RSwweDVCQzEsMHg1QkMwLDB4NUM1OSwweDVEMUUsMHg1RDBCLDB4NUQxRCwweDVEMUEsLyogMHhGMC0weEY3ICovCisJMHg1RDIwLDB4NUQwQywweDVEMjgsMHg1RDBELDB4NUQyNiwweDVEMjUsMHg1RDBGLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9ENVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDVEMzAsMHg1RDEyLDB4NUQyMywweDVEMUYsMHg1RDJFLDB4NUUzRSwweDVFMzQsMHg1RUIxLC8qIDB4NDAtMHg0NyAqLworCTB4NUVCNCwweDVFQjksMHg1RUIyLDB4NUVCMywweDVGMzYsMHg1RjM4LDB4NUY5QiwweDVGOTYsLyogMHg0OC0weDRGICovCisJMHg1RjlGLDB4NjA4QSwweDYwOTAsMHg2MDg2LDB4NjBCRSwweDYwQjAsMHg2MEJBLDB4NjBEMywvKiAweDUwLTB4NTcgKi8KKwkweDYwRDQsMHg2MENGLDB4NjBFNCwweDYwRDksMHg2MERELDB4NjBDOCwweDYwQjEsMHg2MERCLC8qIDB4NTgtMHg1RiAqLworCTB4NjBCNywweDYwQ0EsMHg2MEJGLDB4NjBDMywweDYwQ0QsMHg2MEMwLDB4NjMzMiwweDYzNjUsLyogMHg2MC0weDY3ICovCisJMHg2MzhBLDB4NjM4MiwweDYzN0QsMHg2M0JELDB4NjM5RSwweDYzQUQsMHg2MzlELDB4NjM5NywvKiAweDY4LTB4NkYgKi8KKwkweDYzQUIsMHg2MzhFLDB4NjM2RiwweDYzODcsMHg2MzkwLDB4NjM2RSwweDYzQUYsMHg2Mzc1LC8qIDB4NzAtMHg3NyAqLworCTB4NjM5QywweDYzNkQsMHg2M0FFLDB4NjM3QywweDYzQTQsMHg2MzNCLDB4NjM5RiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDYzNzgsMHg2Mzg1LDB4NjM4MSwweDYzOTEsMHg2MzhELDB4NjM3MCwweDY1NTMsLyogMHhBMC0weEE3ICovCisJMHg2NUNELDB4NjY2NSwweDY2NjEsMHg2NjVCLDB4NjY1OSwweDY2NUMsMHg2NjYyLDB4NjcxOCwvKiAweEE4LTB4QUYgKi8KKwkweDY4NzksMHg2ODg3LDB4Njg5MCwweDY4OUMsMHg2ODZELDB4Njg2RSwweDY4QUUsMHg2OEFCLC8qIDB4QjAtMHhCNyAqLworCTB4Njk1NiwweDY4NkYsMHg2OEEzLDB4NjhBQywweDY4QTksMHg2ODc1LDB4Njg3NCwweDY4QjIsLyogMHhCOC0weEJGICovCisJMHg2ODhGLDB4Njg3NywweDY4OTIsMHg2ODdDLDB4Njg2QiwweDY4NzIsMHg2OEFBLDB4Njg4MCwvKiAweEMwLTB4QzcgKi8KKwkweDY4NzEsMHg2ODdFLDB4Njg5QiwweDY4OTYsMHg2ODhCLDB4NjhBMCwweDY4ODksMHg2OEE0LC8qIDB4QzgtMHhDRiAqLworCTB4Njg3OCwweDY4N0IsMHg2ODkxLDB4Njg4QywweDY4OEEsMHg2ODdELDB4NkIzNiwweDZCMzMsLyogMHhEMC0weEQ3ICovCisJMHg2QjM3LDB4NkIzOCwweDZCOTEsMHg2QjhGLDB4NkI4RCwweDZCOEUsMHg2QjhDLDB4NkMyQSwvKiAweEQ4LTB4REYgKi8KKwkweDZEQzAsMHg2REFCLDB4NkRCNCwweDZEQjMsMHg2RTc0LDB4NkRBQywweDZERTksMHg2REUyLC8qIDB4RTAtMHhFNyAqLworCTB4NkRCNywweDZERjYsMHg2REQ0LDB4NkUwMCwweDZEQzgsMHg2REUwLDB4NkRERiwweDZERDYsLyogMHhFOC0weEVGICovCisJMHg2REJFLDB4NkRFNSwweDZEREMsMHg2RERELDB4NkREQiwweDZERjQsMHg2RENBLDB4NkRCRCwvKiAweEYwLTB4RjcgKi8KKwkweDZERUQsMHg2REYwLDB4NkRCQSwweDZERDUsMHg2REMyLDB4NkRDRiwweDZEQzksMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0Q2WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NkREMCwweDZERjIsMHg2REQzLDB4NkRGRCwweDZERDcsMHg2RENELDB4NkRFMywweDZEQkIsLyogMHg0MC0weDQ3ICovCisJMHg3MEZBLDB4NzEwRCwweDcwRjcsMHg3MTE3LDB4NzBGNCwweDcxMEMsMHg3MEYwLDB4NzEwNCwvKiAweDQ4LTB4NEYgKi8KKwkweDcwRjMsMHg3MTEwLDB4NzBGQywweDcwRkYsMHg3MTA2LDB4NzExMywweDcxMDAsMHg3MEY4LC8qIDB4NTAtMHg1NyAqLworCTB4NzBGNiwweDcxMEIsMHg3MTAyLDB4NzEwRSwweDcyN0UsMHg3MjdCLDB4NzI3QywweDcyN0YsLyogMHg1OC0weDVGICovCisJMHg3MzFELDB4NzMxNywweDczMDcsMHg3MzExLDB4NzMxOCwweDczMEEsMHg3MzA4LDB4NzJGRiwvKiAweDYwLTB4NjcgKi8KKwkweDczMEYsMHg3MzFFLDB4NzM4OCwweDczRjYsMHg3M0Y4LDB4NzNGNSwweDc0MDQsMHg3NDAxLC8qIDB4NjgtMHg2RiAqLworCTB4NzNGRCwweDc0MDcsMHg3NDAwLDB4NzNGQSwweDczRkMsMHg3M0ZGLDB4NzQwQywweDc0MEIsLyogMHg3MC0weDc3ICovCisJMHg3M0Y0LDB4NzQwOCwweDc1NjQsMHg3NTYzLDB4NzVDRSwweDc1RDIsMHg3NUNGLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NzVDQiwweDc1Q0MsMHg3NUQxLDB4NzVEMCwweDc2OEYsMHg3Njg5LDB4NzZEMywvKiAweEEwLTB4QTcgKi8KKwkweDc3MzksMHg3NzJGLDB4NzcyRCwweDc3MzEsMHg3NzMyLDB4NzczNCwweDc3MzMsMHg3NzNELC8qIDB4QTgtMHhBRiAqLworCTB4NzcyNSwweDc3M0IsMHg3NzM1LDB4Nzg0OCwweDc4NTIsMHg3ODQ5LDB4Nzg0RCwweDc4NEEsLyogMHhCMC0weEI3ICovCisJMHg3ODRDLDB4NzgyNiwweDc4NDUsMHg3ODUwLDB4Nzk2NCwweDc5NjcsMHg3OTY5LDB4Nzk2QSwvKiAweEI4LTB4QkYgKi8KKwkweDc5NjMsMHg3OTZCLDB4Nzk2MSwweDc5QkIsMHg3OUZBLDB4NzlGOCwweDc5RjYsMHg3OUY3LC8qIDB4QzAtMHhDNyAqLworCTB4N0E4RiwweDdBOTQsMHg3QTkwLDB4N0IzNSwweDdCNDcsMHg3QjM0LDB4N0IyNSwweDdCMzAsLyogMHhDOC0weENGICovCisJMHg3QjIyLDB4N0IyNCwweDdCMzMsMHg3QjE4LDB4N0IyQSwweDdCMUQsMHg3QjMxLDB4N0IyQiwvKiAweEQwLTB4RDcgKi8KKwkweDdCMkQsMHg3QjJGLDB4N0IzMiwweDdCMzgsMHg3QjFBLDB4N0IyMywweDdDOTQsMHg3Qzk4LC8qIDB4RDgtMHhERiAqLworCTB4N0M5NiwweDdDQTMsMHg3RDM1LDB4N0QzRCwweDdEMzgsMHg3RDM2LDB4N0QzQSwweDdENDUsLyogMHhFMC0weEU3ICovCisJMHg3RDJDLDB4N0QyOSwweDdENDEsMHg3RDQ3LDB4N0QzRSwweDdEM0YsMHg3RDRBLDB4N0QzQiwvKiAweEU4LTB4RUYgKi8KKwkweDdEMjgsMHg3RjYzLDB4N0Y5NSwweDdGOUMsMHg3RjlELDB4N0Y5QiwweDdGQ0EsMHg3RkNCLC8qIDB4RjAtMHhGNyAqLworCTB4N0ZDRCwweDdGRDAsMHg3RkQxLDB4N0ZDNywweDdGQ0YsMHg3RkM5LDB4ODAxRiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRDdbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4MDFFLDB4ODAxQiwweDgwNDcsMHg4MDQzLDB4ODA0OCwweDgxMTgsMHg4MTI1LDB4ODExOSwvKiAweDQwLTB4NDcgKi8KKwkweDgxMUIsMHg4MTJELDB4ODExRiwweDgxMkMsMHg4MTFFLDB4ODEyMSwweDgxMTUsMHg4MTI3LC8qIDB4NDgtMHg0RiAqLworCTB4ODExRCwweDgxMjIsMHg4MjExLDB4ODIzOCwweDgyMzMsMHg4MjNBLDB4ODIzNCwweDgyMzIsLyogMHg1MC0weDU3ICovCisJMHg4Mjc0LDB4ODM5MCwweDgzQTMsMHg4M0E4LDB4ODM4RCwweDgzN0EsMHg4MzczLDB4ODNBNCwvKiAweDU4LTB4NUYgKi8KKwkweDgzNzQsMHg4MzhGLDB4ODM4MSwweDgzOTUsMHg4Mzk5LDB4ODM3NSwweDgzOTQsMHg4M0E5LC8qIDB4NjAtMHg2NyAqLworCTB4ODM3RCwweDgzODMsMHg4MzhDLDB4ODM5RCwweDgzOUIsMHg4M0FBLDB4ODM4QiwweDgzN0UsLyogMHg2OC0weDZGICovCisJMHg4M0E1LDB4ODNBRiwweDgzODgsMHg4Mzk3LDB4ODNCMCwweDgzN0YsMHg4M0E2LDB4ODM4NywvKiAweDcwLTB4NzcgKi8KKwkweDgzQUUsMHg4Mzc2LDB4ODM5QSwweDg2NTksMHg4NjU2LDB4ODZCRiwweDg2QjcsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg4NkMyLDB4ODZDMSwweDg2QzUsMHg4NkJBLDB4ODZCMCwweDg2QzgsMHg4NkI5LC8qIDB4QTAtMHhBNyAqLworCTB4ODZCMywweDg2QjgsMHg4NkNDLDB4ODZCNCwweDg2QkIsMHg4NkJDLDB4ODZDMywweDg2QkQsLyogMHhBOC0weEFGICovCisJMHg4NkJFLDB4ODg1MiwweDg4ODksMHg4ODk1LDB4ODhBOCwweDg4QTIsMHg4OEFBLDB4ODg5QSwvKiAweEIwLTB4QjcgKi8KKwkweDg4OTEsMHg4OEExLDB4ODg5RiwweDg4OTgsMHg4OEE3LDB4ODg5OSwweDg4OUIsMHg4ODk3LC8qIDB4QjgtMHhCRiAqLworCTB4ODhBNCwweDg4QUMsMHg4ODhDLDB4ODg5MywweDg4OEUsMHg4OTgyLDB4ODlENiwweDg5RDksLyogMHhDMC0weEM3ICovCisJMHg4OUQ1LDB4OEEzMCwweDhBMjcsMHg4QTJDLDB4OEExRSwweDhDMzksMHg4QzNCLDB4OEM1QywvKiAweEM4LTB4Q0YgKi8KKwkweDhDNUQsMHg4QzdELDB4OENBNSwweDhEN0QsMHg4RDdCLDB4OEQ3OSwweDhEQkMsMHg4REMyLC8qIDB4RDAtMHhENyAqLworCTB4OERCOSwweDhEQkYsMHg4REMxLDB4OEVEOCwweDhFREUsMHg4RURELDB4OEVEQywweDhFRDcsLyogMHhEOC0weERGICovCisJMHg4RUUwLDB4OEVFMSwweDkwMjQsMHg5MDBCLDB4OTAxMSwweDkwMUMsMHg5MDBDLDB4OTAyMSwvKiAweEUwLTB4RTcgKi8KKwkweDkwRUYsMHg5MEVBLDB4OTBGMCwweDkwRjQsMHg5MEYyLDB4OTBGMywweDkwRDQsMHg5MEVCLC8qIDB4RTgtMHhFRiAqLworCTB4OTBFQywweDkwRTksMHg5MTU2LDB4OTE1OCwweDkxNUEsMHg5MTUzLDB4OTE1NSwweDkxRUMsLyogMHhGMC0weEY3ICovCisJMHg5MUY0LDB4OTFGMSwweDkxRjMsMHg5MUY4LDB4OTFFNCwweDkxRjksMHg5MUVBLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9EOFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDkxRUIsMHg5MUY3LDB4OTFFOCwweDkxRUUsMHg5NTdBLDB4OTU4NiwweDk1ODgsMHg5NjdDLC8qIDB4NDAtMHg0NyAqLworCTB4OTY2RCwweDk2NkIsMHg5NjcxLDB4OTY2RiwweDk2QkYsMHg5NzZBLDB4OTgwNCwweDk4RTUsLyogMHg0OC0weDRGICovCisJMHg5OTk3LDB4NTA5QiwweDUwOTUsMHg1MDk0LDB4NTA5RSwweDUwOEIsMHg1MEEzLDB4NTA4MywvKiAweDUwLTB4NTcgKi8KKwkweDUwOEMsMHg1MDhFLDB4NTA5RCwweDUwNjgsMHg1MDlDLDB4NTA5MiwweDUwODIsMHg1MDg3LC8qIDB4NTgtMHg1RiAqLworCTB4NTE1RiwweDUxRDQsMHg1MzEyLDB4NTMxMSwweDUzQTQsMHg1M0E3LDB4NTU5MSwweDU1QTgsLyogMHg2MC0weDY3ICovCisJMHg1NUE1LDB4NTVBRCwweDU1NzcsMHg1NjQ1LDB4NTVBMiwweDU1OTMsMHg1NTg4LDB4NTU4RiwvKiAweDY4LTB4NkYgKi8KKwkweDU1QjUsMHg1NTgxLDB4NTVBMywweDU1OTIsMHg1NUE0LDB4NTU3RCwweDU1OEMsMHg1NUE2LC8qIDB4NzAtMHg3NyAqLworCTB4NTU3RiwweDU1OTUsMHg1NUExLDB4NTU4RSwweDU3MEMsMHg1ODI5LDB4NTgzNywweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDU4MTksMHg1ODFFLDB4NTgyNywweDU4MjMsMHg1ODI4LDB4NTdGNSwweDU4NDgsLyogMHhBMC0weEE3ICovCisJMHg1ODI1LDB4NTgxQywweDU4MUIsMHg1ODMzLDB4NTgzRiwweDU4MzYsMHg1ODJFLDB4NTgzOSwvKiAweEE4LTB4QUYgKi8KKwkweDU4MzgsMHg1ODJELDB4NTgyQywweDU4M0IsMHg1OTYxLDB4NUFBRiwweDVBOTQsMHg1QTlGLC8qIDB4QjAtMHhCNyAqLworCTB4NUE3QSwweDVBQTIsMHg1QTlFLDB4NUE3OCwweDVBQTYsMHg1QTdDLDB4NUFBNSwweDVBQUMsLyogMHhCOC0weEJGICovCisJMHg1QTk1LDB4NUFBRSwweDVBMzcsMHg1QTg0LDB4NUE4QSwweDVBOTcsMHg1QTgzLDB4NUE4QiwvKiAweEMwLTB4QzcgKi8KKwkweDVBQTksMHg1QTdCLDB4NUE3RCwweDVBOEMsMHg1QTlDLDB4NUE4RiwweDVBOTMsMHg1QTlELC8qIDB4QzgtMHhDRiAqLworCTB4NUJFQSwweDVCQ0QsMHg1QkNCLDB4NUJENCwweDVCRDEsMHg1QkNBLDB4NUJDRSwweDVDMEMsLyogMHhEMC0weEQ3ICovCisJMHg1QzMwLDB4NUQzNywweDVENDMsMHg1RDZCLDB4NUQ0MSwweDVENEIsMHg1RDNGLDB4NUQzNSwvKiAweEQ4LTB4REYgKi8KKwkweDVENTEsMHg1RDRFLDB4NUQ1NSwweDVEMzMsMHg1RDNBLDB4NUQ1MiwweDVEM0QsMHg1RDMxLC8qIDB4RTAtMHhFNyAqLworCTB4NUQ1OSwweDVENDIsMHg1RDM5LDB4NUQ0OSwweDVEMzgsMHg1RDNDLDB4NUQzMiwweDVEMzYsLyogMHhFOC0weEVGICovCisJMHg1RDQwLDB4NUQ0NSwweDVFNDQsMHg1RTQxLDB4NUY1OCwweDVGQTYsMHg1RkE1LDB4NUZBQiwvKiAweEYwLTB4RjcgKi8KKwkweDYwQzksMHg2MEI5LDB4NjBDQywweDYwRTIsMHg2MENFLDB4NjBDNCwweDYxMTQsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0Q5WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NjBGMiwweDYxMEEsMHg2MTE2LDB4NjEwNSwweDYwRjUsMHg2MTEzLDB4NjBGOCwweDYwRkMsLyogMHg0MC0weDQ3ICovCisJMHg2MEZFLDB4NjBDMSwweDYxMDMsMHg2MTE4LDB4NjExRCwweDYxMTAsMHg2MEZGLDB4NjEwNCwvKiAweDQ4LTB4NEYgKi8KKwkweDYxMEIsMHg2MjRBLDB4NjM5NCwweDYzQjEsMHg2M0IwLDB4NjNDRSwweDYzRTUsMHg2M0U4LC8qIDB4NTAtMHg1NyAqLworCTB4NjNFRiwweDYzQzMsMHg2NDlELDB4NjNGMywweDYzQ0EsMHg2M0UwLDB4NjNGNiwweDYzRDUsLyogMHg1OC0weDVGICovCisJMHg2M0YyLDB4NjNGNSwweDY0NjEsMHg2M0RGLDB4NjNCRSwweDYzREQsMHg2M0RDLDB4NjNDNCwvKiAweDYwLTB4NjcgKi8KKwkweDYzRDgsMHg2M0QzLDB4NjNDMiwweDYzQzcsMHg2M0NDLDB4NjNDQiwweDYzQzgsMHg2M0YwLC8qIDB4NjgtMHg2RiAqLworCTB4NjNENywweDYzRDksMHg2NTMyLDB4NjU2NywweDY1NkEsMHg2NTY0LDB4NjU1QywweDY1NjgsLyogMHg3MC0weDc3ICovCisJMHg2NTY1LDB4NjU4QywweDY1OUQsMHg2NTlFLDB4NjVBRSwweDY1RDAsMHg2NUQyLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NjY3QywweDY2NkMsMHg2NjdCLDB4NjY4MCwweDY2NzEsMHg2Njc5LDB4NjY2QSwvKiAweEEwLTB4QTcgKi8KKwkweDY2NzIsMHg2NzAxLDB4NjkwQywweDY4RDMsMHg2OTA0LDB4NjhEQywweDY5MkEsMHg2OEVDLC8qIDB4QTgtMHhBRiAqLworCTB4NjhFQSwweDY4RjEsMHg2OTBGLDB4NjhENiwweDY4RjcsMHg2OEVCLDB4NjhFNCwweDY4RjYsLyogMHhCMC0weEI3ICovCisJMHg2OTEzLDB4NjkxMCwweDY4RjMsMHg2OEUxLDB4NjkwNywweDY4Q0MsMHg2OTA4LDB4Njk3MCwvKiAweEI4LTB4QkYgKi8KKwkweDY4QjQsMHg2OTExLDB4NjhFRiwweDY4QzYsMHg2OTE0LDB4NjhGOCwweDY4RDAsMHg2OEZELC8qIDB4QzAtMHhDNyAqLworCTB4NjhGQywweDY4RTgsMHg2OTBCLDB4NjkwQSwweDY5MTcsMHg2OENFLDB4NjhDOCwweDY4REQsLyogMHhDOC0weENGICovCisJMHg2OERFLDB4NjhFNiwweDY4RjQsMHg2OEQxLDB4NjkwNiwweDY4RDQsMHg2OEU5LDB4NjkxNSwvKiAweEQwLTB4RDcgKi8KKwkweDY5MjUsMHg2OEM3LDB4NkIzOSwweDZCM0IsMHg2QjNGLDB4NkIzQywweDZCOTQsMHg2Qjk3LC8qIDB4RDgtMHhERiAqLworCTB4NkI5OSwweDZCOTUsMHg2QkJELDB4NkJGMCwweDZCRjIsMHg2QkYzLDB4NkMzMCwweDZERkMsLyogMHhFMC0weEU3ICovCisJMHg2RTQ2LDB4NkU0NywweDZFMUYsMHg2RTQ5LDB4NkU4OCwweDZFM0MsMHg2RTNELDB4NkU0NSwvKiAweEU4LTB4RUYgKi8KKwkweDZFNjIsMHg2RTJCLDB4NkUzRiwweDZFNDEsMHg2RTVELDB4NkU3MywweDZFMUMsMHg2RTMzLC8qIDB4RjAtMHhGNyAqLworCTB4NkU0QiwweDZFNDAsMHg2RTUxLDB4NkUzQiwweDZFMDMsMHg2RTJFLDB4NkU1RSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfREFbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg2RTY4LDB4NkU1QywweDZFNjEsMHg2RTMxLDB4NkUyOCwweDZFNjAsMHg2RTcxLDB4NkU2QiwvKiAweDQwLTB4NDcgKi8KKwkweDZFMzksMHg2RTIyLDB4NkUzMCwweDZFNTMsMHg2RTY1LDB4NkUyNywweDZFNzgsMHg2RTY0LC8qIDB4NDgtMHg0RiAqLworCTB4NkU3NywweDZFNTUsMHg2RTc5LDB4NkU1MiwweDZFNjYsMHg2RTM1LDB4NkUzNiwweDZFNUEsLyogMHg1MC0weDU3ICovCisJMHg3MTIwLDB4NzExRSwweDcxMkYsMHg3MEZCLDB4NzEyRSwweDcxMzEsMHg3MTIzLDB4NzEyNSwvKiAweDU4LTB4NUYgKi8KKwkweDcxMjIsMHg3MTMyLDB4NzExRiwweDcxMjgsMHg3MTNBLDB4NzExQiwweDcyNEIsMHg3MjVBLC8qIDB4NjAtMHg2NyAqLworCTB4NzI4OCwweDcyODksMHg3Mjg2LDB4NzI4NSwweDcyOEIsMHg3MzEyLDB4NzMwQiwweDczMzAsLyogMHg2OC0weDZGICovCisJMHg3MzIyLDB4NzMzMSwweDczMzMsMHg3MzI3LDB4NzMzMiwweDczMkQsMHg3MzI2LDB4NzMyMywvKiAweDcwLTB4NzcgKi8KKwkweDczMzUsMHg3MzBDLDB4NzQyRSwweDc0MkMsMHg3NDMwLDB4NzQyQiwweDc0MTYsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg3NDFBLDB4NzQyMSwweDc0MkQsMHg3NDMxLDB4NzQyNCwweDc0MjMsMHg3NDFELC8qIDB4QTAtMHhBNyAqLworCTB4NzQyOSwweDc0MjAsMHg3NDMyLDB4NzRGQiwweDc1MkYsMHg3NTZGLDB4NzU2QywweDc1RTcsLyogMHhBOC0weEFGICovCisJMHg3NURBLDB4NzVFMSwweDc1RTYsMHg3NURELDB4NzVERiwweDc1RTQsMHg3NUQ3LDB4NzY5NSwvKiAweEIwLTB4QjcgKi8KKwkweDc2OTIsMHg3NkRBLDB4Nzc0NiwweDc3NDcsMHg3NzQ0LDB4Nzc0RCwweDc3NDUsMHg3NzRBLC8qIDB4QjgtMHhCRiAqLworCTB4Nzc0RSwweDc3NEIsMHg3NzRDLDB4NzdERSwweDc3RUMsMHg3ODYwLDB4Nzg2NCwweDc4NjUsLyogMHhDMC0weEM3ICovCisJMHg3ODVDLDB4Nzg2RCwweDc4NzEsMHg3ODZBLDB4Nzg2RSwweDc4NzAsMHg3ODY5LDB4Nzg2OCwvKiAweEM4LTB4Q0YgKi8KKwkweDc4NUUsMHg3ODYyLDB4Nzk3NCwweDc5NzMsMHg3OTcyLDB4Nzk3MCwweDdBMDIsMHg3QTBBLC8qIDB4RDAtMHhENyAqLworCTB4N0EwMywweDdBMEMsMHg3QTA0LDB4N0E5OSwweDdBRTYsMHg3QUU0LDB4N0I0QSwweDdCM0IsLyogMHhEOC0weERGICovCisJMHg3QjQ0LDB4N0I0OCwweDdCNEMsMHg3QjRFLDB4N0I0MCwweDdCNTgsMHg3QjQ1LDB4N0NBMiwvKiAweEUwLTB4RTcgKi8KKwkweDdDOUUsMHg3Q0E4LDB4N0NBMSwweDdENTgsMHg3RDZGLDB4N0Q2MywweDdENTMsMHg3RDU2LC8qIDB4RTgtMHhFRiAqLworCTB4N0Q2NywweDdENkEsMHg3RDRGLDB4N0Q2RCwweDdENUMsMHg3RDZCLDB4N0Q1MiwweDdENTQsLyogMHhGMC0weEY3ICovCisJMHg3RDY5LDB4N0Q1MSwweDdENUYsMHg3RDRFLDB4N0YzRSwweDdGM0YsMHg3RjY1LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9EQlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDdGNjYsMHg3RkEyLDB4N0ZBMCwweDdGQTEsMHg3RkQ3LDB4ODA1MSwweDgwNEYsMHg4MDUwLC8qIDB4NDAtMHg0NyAqLworCTB4ODBGRSwweDgwRDQsMHg4MTQzLDB4ODE0QSwweDgxNTIsMHg4MTRGLDB4ODE0NywweDgxM0QsLyogMHg0OC0weDRGICovCisJMHg4MTRELDB4ODEzQSwweDgxRTYsMHg4MUVFLDB4ODFGNywweDgxRjgsMHg4MUY5LDB4ODIwNCwvKiAweDUwLTB4NTcgKi8KKwkweDgyM0MsMHg4MjNELDB4ODIzRiwweDgyNzUsMHg4MzNCLDB4ODNDRiwweDgzRjksMHg4NDIzLC8qIDB4NTgtMHg1RiAqLworCTB4ODNDMCwweDgzRTgsMHg4NDEyLDB4ODNFNywweDgzRTQsMHg4M0ZDLDB4ODNGNiwweDg0MTAsLyogMHg2MC0weDY3ICovCisJMHg4M0M2LDB4ODNDOCwweDgzRUIsMHg4M0UzLDB4ODNCRiwweDg0MDEsMHg4M0RELDB4ODNFNSwvKiAweDY4LTB4NkYgKi8KKwkweDgzRDgsMHg4M0ZGLDB4ODNFMSwweDgzQ0IsMHg4M0NFLDB4ODNENiwweDgzRjUsMHg4M0M5LC8qIDB4NzAtMHg3NyAqLworCTB4ODQwOSwweDg0MEYsMHg4M0RFLDB4ODQxMSwweDg0MDYsMHg4M0MyLDB4ODNGMywweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDgzRDUsMHg4M0ZBLDB4ODNDNywweDgzRDEsMHg4M0VBLDB4ODQxMywweDgzQzMsLyogMHhBMC0weEE3ICovCisJMHg4M0VDLDB4ODNFRSwweDgzQzQsMHg4M0ZCLDB4ODNENywweDgzRTIsMHg4NDFCLDB4ODNEQiwvKiAweEE4LTB4QUYgKi8KKwkweDgzRkUsMHg4NkQ4LDB4ODZFMiwweDg2RTYsMHg4NkQzLDB4ODZFMywweDg2REEsMHg4NkVBLC8qIDB4QjAtMHhCNyAqLworCTB4ODZERCwweDg2RUIsMHg4NkRDLDB4ODZFQywweDg2RTksMHg4NkQ3LDB4ODZFOCwweDg2RDEsLyogMHhCOC0weEJGICovCisJMHg4ODQ4LDB4ODg1NiwweDg4NTUsMHg4OEJBLDB4ODhENywweDg4QjksMHg4OEI4LDB4ODhDMCwvKiAweEMwLTB4QzcgKi8KKwkweDg4QkUsMHg4OEI2LDB4ODhCQywweDg4QjcsMHg4OEJELDB4ODhCMiwweDg5MDEsMHg4OEM5LC8qIDB4QzgtMHhDRiAqLworCTB4ODk5NSwweDg5OTgsMHg4OTk3LDB4ODlERCwweDg5REEsMHg4OURCLDB4OEE0RSwweDhBNEQsLyogMHhEMC0weEQ3ICovCisJMHg4QTM5LDB4OEE1OSwweDhBNDAsMHg4QTU3LDB4OEE1OCwweDhBNDQsMHg4QTQ1LDB4OEE1MiwvKiAweEQ4LTB4REYgKi8KKwkweDhBNDgsMHg4QTUxLDB4OEE0QSwweDhBNEMsMHg4QTRGLDB4OEM1RiwweDhDODEsMHg4QzgwLC8qIDB4RTAtMHhFNyAqLworCTB4OENCQSwweDhDQkUsMHg4Q0IwLDB4OENCOSwweDhDQjUsMHg4RDg0LDB4OEQ4MCwweDhEODksLyogMHhFOC0weEVGICovCisJMHg4REQ4LDB4OEREMywweDhEQ0QsMHg4REM3LDB4OERENiwweDhEREMsMHg4RENGLDB4OERENSwvKiAweEYwLTB4RjcgKi8KKwkweDhERDksMHg4REM4LDB4OERENywweDhEQzUsMHg4RUVGLDB4OEVGNywweDhFRkEsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0RDWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OEVGOSwweDhFRTYsMHg4RUVFLDB4OEVFNSwweDhFRjUsMHg4RUU3LDB4OEVFOCwweDhFRjYsLyogMHg0MC0weDQ3ICovCisJMHg4RUVCLDB4OEVGMSwweDhFRUMsMHg4RUY0LDB4OEVFOSwweDkwMkQsMHg5MDM0LDB4OTAyRiwvKiAweDQ4LTB4NEYgKi8KKwkweDkxMDYsMHg5MTJDLDB4OTEwNCwweDkwRkYsMHg5MEZDLDB4OTEwOCwweDkwRjksMHg5MEZCLC8qIDB4NTAtMHg1NyAqLworCTB4OTEwMSwweDkxMDAsMHg5MTA3LDB4OTEwNSwweDkxMDMsMHg5MTYxLDB4OTE2NCwweDkxNUYsLyogMHg1OC0weDVGICovCisJMHg5MTYyLDB4OTE2MCwweDkyMDEsMHg5MjBBLDB4OTIyNSwweDkyMDMsMHg5MjFBLDB4OTIyNiwvKiAweDYwLTB4NjcgKi8KKwkweDkyMEYsMHg5MjBDLDB4OTIwMCwweDkyMTIsMHg5MUZGLDB4OTFGRCwweDkyMDYsMHg5MjA0LC8qIDB4NjgtMHg2RiAqLworCTB4OTIyNywweDkyMDIsMHg5MjFDLDB4OTIyNCwweDkyMTksMHg5MjE3LDB4OTIwNSwweDkyMTYsLyogMHg3MC0weDc3ICovCisJMHg5NTdCLDB4OTU4RCwweDk1OEMsMHg5NTkwLDB4OTY4NywweDk2N0UsMHg5Njg4LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4OTY4OSwweDk2ODMsMHg5NjgwLDB4OTZDMiwweDk2QzgsMHg5NkMzLDB4OTZGMSwvKiAweEEwLTB4QTcgKi8KKwkweDk2RjAsMHg5NzZDLDB4OTc3MCwweDk3NkUsMHg5ODA3LDB4OThBOSwweDk4RUIsMHg5Q0U2LC8qIDB4QTgtMHhBRiAqLworCTB4OUVGOSwweDRFODMsMHg0RTg0LDB4NEVCNiwweDUwQkQsMHg1MEJGLDB4NTBDNiwweDUwQUUsLyogMHhCMC0weEI3ICovCisJMHg1MEM0LDB4NTBDQSwweDUwQjQsMHg1MEM4LDB4NTBDMiwweDUwQjAsMHg1MEMxLDB4NTBCQSwvKiAweEI4LTB4QkYgKi8KKwkweDUwQjEsMHg1MENCLDB4NTBDOSwweDUwQjYsMHg1MEI4LDB4NTFENywweDUyN0EsMHg1Mjc4LC8qIDB4QzAtMHhDNyAqLworCTB4NTI3QiwweDUyN0MsMHg1NUMzLDB4NTVEQiwweDU1Q0MsMHg1NUQwLDB4NTVDQiwweDU1Q0EsLyogMHhDOC0weENGICovCisJMHg1NURELDB4NTVDMCwweDU1RDQsMHg1NUM0LDB4NTVFOSwweDU1QkYsMHg1NUQyLDB4NTU4RCwvKiAweEQwLTB4RDcgKi8KKwkweDU1Q0YsMHg1NUQ1LDB4NTVFMiwweDU1RDYsMHg1NUM4LDB4NTVGMiwweDU1Q0QsMHg1NUQ5LC8qIDB4RDgtMHhERiAqLworCTB4NTVDMiwweDU3MTQsMHg1ODUzLDB4NTg2OCwweDU4NjQsMHg1ODRGLDB4NTg0RCwweDU4NDksLyogMHhFMC0weEU3ICovCisJMHg1ODZGLDB4NTg1NSwweDU4NEUsMHg1ODVELDB4NTg1OSwweDU4NjUsMHg1ODVCLDB4NTgzRCwvKiAweEU4LTB4RUYgKi8KKwkweDU4NjMsMHg1ODcxLDB4NThGQywweDVBQzcsMHg1QUM0LDB4NUFDQiwweDVBQkEsMHg1QUI4LC8qIDB4RjAtMHhGNyAqLworCTB4NUFCMSwweDVBQjUsMHg1QUIwLDB4NUFCRiwweDVBQzgsMHg1QUJCLDB4NUFDNiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRERbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg1QUI3LDB4NUFDMCwweDVBQ0EsMHg1QUI0LDB4NUFCNiwweDVBQ0QsMHg1QUI5LDB4NUE5MCwvKiAweDQwLTB4NDcgKi8KKwkweDVCRDYsMHg1QkQ4LDB4NUJEOSwweDVDMUYsMHg1QzMzLDB4NUQ3MSwweDVENjMsMHg1RDRBLC8qIDB4NDgtMHg0RiAqLworCTB4NUQ2NSwweDVENzIsMHg1RDZDLDB4NUQ1RSwweDVENjgsMHg1RDY3LDB4NUQ2MiwweDVERjAsLyogMHg1MC0weDU3ICovCisJMHg1RTRGLDB4NUU0RSwweDVFNEEsMHg1RTRELDB4NUU0QiwweDVFQzUsMHg1RUNDLDB4NUVDNiwvKiAweDU4LTB4NUYgKi8KKwkweDVFQ0IsMHg1RUM3LDB4NUY0MCwweDVGQUYsMHg1RkFELDB4NjBGNywweDYxNDksMHg2MTRBLC8qIDB4NjAtMHg2NyAqLworCTB4NjEyQiwweDYxNDUsMHg2MTM2LDB4NjEzMiwweDYxMkUsMHg2MTQ2LDB4NjEyRiwweDYxNEYsLyogMHg2OC0weDZGICovCisJMHg2MTI5LDB4NjE0MCwweDYyMjAsMHg5MTY4LDB4NjIyMywweDYyMjUsMHg2MjI0LDB4NjNDNSwvKiAweDcwLTB4NzcgKi8KKwkweDYzRjEsMHg2M0VCLDB4NjQxMCwweDY0MTIsMHg2NDA5LDB4NjQyMCwweDY0MjQsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg2NDMzLDB4NjQ0MywweDY0MUYsMHg2NDE1LDB4NjQxOCwweDY0MzksMHg2NDM3LC8qIDB4QTAtMHhBNyAqLworCTB4NjQyMiwweDY0MjMsMHg2NDBDLDB4NjQyNiwweDY0MzAsMHg2NDI4LDB4NjQ0MSwweDY0MzUsLyogMHhBOC0weEFGICovCisJMHg2NDJGLDB4NjQwQSwweDY0MUEsMHg2NDQwLDB4NjQyNSwweDY0MjcsMHg2NDBCLDB4NjNFNywvKiAweEIwLTB4QjcgKi8KKwkweDY0MUIsMHg2NDJFLDB4NjQyMSwweDY0MEUsMHg2NTZGLDB4NjU5MiwweDY1RDMsMHg2Njg2LC8qIDB4QjgtMHhCRiAqLworCTB4NjY4QywweDY2OTUsMHg2NjkwLDB4NjY4QiwweDY2OEEsMHg2Njk5LDB4NjY5NCwweDY2NzgsLyogMHhDMC0weEM3ICovCisJMHg2NzIwLDB4Njk2NiwweDY5NUYsMHg2OTM4LDB4Njk0RSwweDY5NjIsMHg2OTcxLDB4NjkzRiwvKiAweEM4LTB4Q0YgKi8KKwkweDY5NDUsMHg2OTZBLDB4NjkzOSwweDY5NDIsMHg2OTU3LDB4Njk1OSwweDY5N0EsMHg2OTQ4LC8qIDB4RDAtMHhENyAqLworCTB4Njk0OSwweDY5MzUsMHg2OTZDLDB4NjkzMywweDY5M0QsMHg2OTY1LDB4NjhGMCwweDY5NzgsLyogMHhEOC0weERGICovCisJMHg2OTM0LDB4Njk2OSwweDY5NDAsMHg2OTZGLDB4Njk0NCwweDY5NzYsMHg2OTU4LDB4Njk0MSwvKiAweEUwLTB4RTcgKi8KKwkweDY5NzQsMHg2OTRDLDB4NjkzQiwweDY5NEIsMHg2OTM3LDB4Njk1QywweDY5NEYsMHg2OTUxLC8qIDB4RTgtMHhFRiAqLworCTB4NjkzMiwweDY5NTIsMHg2OTJGLDB4Njk3QiwweDY5M0MsMHg2QjQ2LDB4NkI0NSwweDZCNDMsLyogMHhGMC0weEY3ICovCisJMHg2QjQyLDB4NkI0OCwweDZCNDEsMHg2QjlCLDB4RkEwRCwweDZCRkIsMHg2QkZDLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9ERVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDZCRjksMHg2QkY3LDB4NkJGOCwweDZFOUIsMHg2RUQ2LDB4NkVDOCwweDZFOEYsMHg2RUMwLC8qIDB4NDAtMHg0NyAqLworCTB4NkU5RiwweDZFOTMsMHg2RTk0LDB4NkVBMCwweDZFQjEsMHg2RUI5LDB4NkVDNiwweDZFRDIsLyogMHg0OC0weDRGICovCisJMHg2RUJELDB4NkVDMSwweDZFOUUsMHg2RUM5LDB4NkVCNywweDZFQjAsMHg2RUNELDB4NkVBNiwvKiAweDUwLTB4NTcgKi8KKwkweDZFQ0YsMHg2RUIyLDB4NkVCRSwweDZFQzMsMHg2RURDLDB4NkVEOCwweDZFOTksMHg2RTkyLC8qIDB4NTgtMHg1RiAqLworCTB4NkU4RSwweDZFOEQsMHg2RUE0LDB4NkVBMSwweDZFQkYsMHg2RUIzLDB4NkVEMCwweDZFQ0EsLyogMHg2MC0weDY3ICovCisJMHg2RTk3LDB4NkVBRSwweDZFQTMsMHg3MTQ3LDB4NzE1NCwweDcxNTIsMHg3MTYzLDB4NzE2MCwvKiAweDY4LTB4NkYgKi8KKwkweDcxNDEsMHg3MTVELDB4NzE2MiwweDcxNzIsMHg3MTc4LDB4NzE2QSwweDcxNjEsMHg3MTQyLC8qIDB4NzAtMHg3NyAqLworCTB4NzE1OCwweDcxNDMsMHg3MTRCLDB4NzE3MCwweDcxNUYsMHg3MTUwLDB4NzE1MywweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDcxNDQsMHg3MTRELDB4NzE1QSwweDcyNEYsMHg3MjhELDB4NzI4QywweDcyOTEsLyogMHhBMC0weEE3ICovCisJMHg3MjkwLDB4NzI4RSwweDczM0MsMHg3MzQyLDB4NzMzQiwweDczM0EsMHg3MzQwLDB4NzM0QSwvKiAweEE4LTB4QUYgKi8KKwkweDczNDksMHg3NDQ0LDB4NzQ0QSwweDc0NEIsMHg3NDUyLDB4NzQ1MSwweDc0NTcsMHg3NDQwLC8qIDB4QjAtMHhCNyAqLworCTB4NzQ0RiwweDc0NTAsMHg3NDRFLDB4NzQ0MiwweDc0NDYsMHg3NDRELDB4NzQ1NCwweDc0RTEsLyogMHhCOC0weEJGICovCisJMHg3NEZGLDB4NzRGRSwweDc0RkQsMHg3NTFELDB4NzU3OSwweDc1NzcsMHg2OTgzLDB4NzVFRiwvKiAweEMwLTB4QzcgKi8KKwkweDc2MEYsMHg3NjAzLDB4NzVGNywweDc1RkUsMHg3NUZDLDB4NzVGOSwweDc1RjgsMHg3NjEwLC8qIDB4QzgtMHhDRiAqLworCTB4NzVGQiwweDc1RjYsMHg3NUVELDB4NzVGNSwweDc1RkQsMHg3Njk5LDB4NzZCNSwweDc2REQsLyogMHhEMC0weEQ3ICovCisJMHg3NzU1LDB4Nzc1RiwweDc3NjAsMHg3NzUyLDB4Nzc1NiwweDc3NUEsMHg3NzY5LDB4Nzc2NywvKiAweEQ4LTB4REYgKi8KKwkweDc3NTQsMHg3NzU5LDB4Nzc2RCwweDc3RTAsMHg3ODg3LDB4Nzg5QSwweDc4OTQsMHg3ODhGLC8qIDB4RTAtMHhFNyAqLworCTB4Nzg4NCwweDc4OTUsMHg3ODg1LDB4Nzg4NiwweDc4QTEsMHg3ODgzLDB4Nzg3OSwweDc4OTksLyogMHhFOC0weEVGICovCisJMHg3ODgwLDB4Nzg5NiwweDc4N0IsMHg3OTdDLDB4Nzk4MiwweDc5N0QsMHg3OTc5LDB4N0ExMSwvKiAweEYwLTB4RjcgKi8KKwkweDdBMTgsMHg3QTE5LDB4N0ExMiwweDdBMTcsMHg3QTE1LDB4N0EyMiwweDdBMTMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0RGWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4N0ExQiwweDdBMTAsMHg3QUEzLDB4N0FBMiwweDdBOUUsMHg3QUVCLDB4N0I2NiwweDdCNjQsLyogMHg0MC0weDQ3ICovCisJMHg3QjZELDB4N0I3NCwweDdCNjksMHg3QjcyLDB4N0I2NSwweDdCNzMsMHg3QjcxLDB4N0I3MCwvKiAweDQ4LTB4NEYgKi8KKwkweDdCNjEsMHg3Qjc4LDB4N0I3NiwweDdCNjMsMHg3Q0IyLDB4N0NCNCwweDdDQUYsMHg3RDg4LC8qIDB4NTAtMHg1NyAqLworCTB4N0Q4NiwweDdEODAsMHg3RDhELDB4N0Q3RiwweDdEODUsMHg3RDdBLDB4N0Q4RSwweDdEN0IsLyogMHg1OC0weDVGICovCisJMHg3RDgzLDB4N0Q3QywweDdEOEMsMHg3RDk0LDB4N0Q4NCwweDdEN0QsMHg3RDkyLDB4N0Y2RCwvKiAweDYwLTB4NjcgKi8KKwkweDdGNkIsMHg3RjY3LDB4N0Y2OCwweDdGNkMsMHg3RkE2LDB4N0ZBNSwweDdGQTcsMHg3RkRCLC8qIDB4NjgtMHg2RiAqLworCTB4N0ZEQywweDgwMjEsMHg4MTY0LDB4ODE2MCwweDgxNzcsMHg4MTVDLDB4ODE2OSwweDgxNUIsLyogMHg3MC0weDc3ICovCisJMHg4MTYyLDB4ODE3MiwweDY3MjEsMHg4MTVFLDB4ODE3NiwweDgxNjcsMHg4MTZGLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4ODE0NCwweDgxNjEsMHg4MjFELDB4ODI0OSwweDgyNDQsMHg4MjQwLDB4ODI0MiwvKiAweEEwLTB4QTcgKi8KKwkweDgyNDUsMHg4NEYxLDB4ODQzRiwweDg0NTYsMHg4NDc2LDB4ODQ3OSwweDg0OEYsMHg4NDhELC8qIDB4QTgtMHhBRiAqLworCTB4ODQ2NSwweDg0NTEsMHg4NDQwLDB4ODQ4NiwweDg0NjcsMHg4NDMwLDB4ODQ0RCwweDg0N0QsLyogMHhCMC0weEI3ICovCisJMHg4NDVBLDB4ODQ1OSwweDg0NzQsMHg4NDczLDB4ODQ1RCwweDg1MDcsMHg4NDVFLDB4ODQzNywvKiAweEI4LTB4QkYgKi8KKwkweDg0M0EsMHg4NDM0LDB4ODQ3QSwweDg0NDMsMHg4NDc4LDB4ODQzMiwweDg0NDUsMHg4NDI5LC8qIDB4QzAtMHhDNyAqLworCTB4ODNEOSwweDg0NEIsMHg4NDJGLDB4ODQ0MiwweDg0MkQsMHg4NDVGLDB4ODQ3MCwweDg0MzksLyogMHhDOC0weENGICovCisJMHg4NDRFLDB4ODQ0QywweDg0NTIsMHg4NDZGLDB4ODRDNSwweDg0OEUsMHg4NDNCLDB4ODQ0NywvKiAweEQwLTB4RDcgKi8KKwkweDg0MzYsMHg4NDMzLDB4ODQ2OCwweDg0N0UsMHg4NDQ0LDB4ODQyQiwweDg0NjAsMHg4NDU0LC8qIDB4RDgtMHhERiAqLworCTB4ODQ2RSwweDg0NTAsMHg4NzBCLDB4ODcwNCwweDg2RjcsMHg4NzBDLDB4ODZGQSwweDg2RDYsLyogMHhFMC0weEU3ICovCisJMHg4NkY1LDB4ODc0RCwweDg2RjgsMHg4NzBFLDB4ODcwOSwweDg3MDEsMHg4NkY2LDB4ODcwRCwvKiAweEU4LTB4RUYgKi8KKwkweDg3MDUsMHg4OEQ2LDB4ODhDQiwweDg4Q0QsMHg4OENFLDB4ODhERSwweDg4REIsMHg4OERBLC8qIDB4RjAtMHhGNyAqLworCTB4ODhDQywweDg4RDAsMHg4OTg1LDB4ODk5QiwweDg5REYsMHg4OUU1LDB4ODlFNCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRTBbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4OUUxLDB4ODlFMCwweDg5RTIsMHg4OURDLDB4ODlFNiwweDhBNzYsMHg4QTg2LDB4OEE3RiwvKiAweDQwLTB4NDcgKi8KKwkweDhBNjEsMHg4QTNGLDB4OEE3NywweDhBODIsMHg4QTg0LDB4OEE3NSwweDhBODMsMHg4QTgxLC8qIDB4NDgtMHg0RiAqLworCTB4OEE3NCwweDhBN0EsMHg4QzNDLDB4OEM0QiwweDhDNEEsMHg4QzY1LDB4OEM2NCwweDhDNjYsLyogMHg1MC0weDU3ICovCisJMHg4Qzg2LDB4OEM4NCwweDhDODUsMHg4Q0NDLDB4OEQ2OCwweDhENjksMHg4RDkxLDB4OEQ4QywvKiAweDU4LTB4NUYgKi8KKwkweDhEOEUsMHg4RDhGLDB4OEQ4RCwweDhEOTMsMHg4RDk0LDB4OEQ5MCwweDhEOTIsMHg4REYwLC8qIDB4NjAtMHg2NyAqLworCTB4OERFMCwweDhERUMsMHg4REYxLDB4OERFRSwweDhERDAsMHg4REU5LDB4OERFMywweDhERTIsLyogMHg2OC0weDZGICovCisJMHg4REU3LDB4OERGMiwweDhERUIsMHg4REY0LDB4OEYwNiwweDhFRkYsMHg4RjAxLDB4OEYwMCwvKiAweDcwLTB4NzcgKi8KKwkweDhGMDUsMHg4RjA3LDB4OEYwOCwweDhGMDIsMHg4RjBCLDB4OTA1MiwweDkwM0YsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg5MDQ0LDB4OTA0OSwweDkwM0QsMHg5MTEwLDB4OTEwRCwweDkxMEYsMHg5MTExLC8qIDB4QTAtMHhBNyAqLworCTB4OTExNiwweDkxMTQsMHg5MTBCLDB4OTEwRSwweDkxNkUsMHg5MTZGLDB4OTI0OCwweDkyNTIsLyogMHhBOC0weEFGICovCisJMHg5MjMwLDB4OTIzQSwweDkyNjYsMHg5MjMzLDB4OTI2NSwweDkyNUUsMHg5MjgzLDB4OTIyRSwvKiAweEIwLTB4QjcgKi8KKwkweDkyNEEsMHg5MjQ2LDB4OTI2RCwweDkyNkMsMHg5MjRGLDB4OTI2MCwweDkyNjcsMHg5MjZGLC8qIDB4QjgtMHhCRiAqLworCTB4OTIzNiwweDkyNjEsMHg5MjcwLDB4OTIzMSwweDkyNTQsMHg5MjYzLDB4OTI1MCwweDkyNzIsLyogMHhDMC0weEM3ICovCisJMHg5MjRFLDB4OTI1MywweDkyNEMsMHg5MjU2LDB4OTIzMiwweDk1OUYsMHg5NTlDLDB4OTU5RSwvKiAweEM4LTB4Q0YgKi8KKwkweDk1OUIsMHg5NjkyLDB4OTY5MywweDk2OTEsMHg5Njk3LDB4OTZDRSwweDk2RkEsMHg5NkZELC8qIDB4RDAtMHhENyAqLworCTB4OTZGOCwweDk2RjUsMHg5NzczLDB4OTc3NywweDk3NzgsMHg5NzcyLDB4OTgwRiwweDk4MEQsLyogMHhEOC0weERGICovCisJMHg5ODBFLDB4OThBQywweDk4RjYsMHg5OEY5LDB4OTlBRiwweDk5QjIsMHg5OUIwLDB4OTlCNSwvKiAweEUwLTB4RTcgKi8KKwkweDlBQUQsMHg5QUFCLDB4OUI1QiwweDlDRUEsMHg5Q0VELDB4OUNFNywweDlFODAsMHg5RUZELC8qIDB4RTgtMHhFRiAqLworCTB4NTBFNiwweDUwRDQsMHg1MEQ3LDB4NTBFOCwweDUwRjMsMHg1MERCLDB4NTBFQSwweDUwREQsLyogMHhGMC0weEY3ICovCisJMHg1MEU0LDB4NTBEMywweDUwRUMsMHg1MEYwLDB4NTBFRiwweDUwRTMsMHg1MEUwLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FMVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDUxRDgsMHg1MjgwLDB4NTI4MSwweDUyRTksMHg1MkVCLDB4NTMzMCwweDUzQUMsMHg1NjI3LC8qIDB4NDAtMHg0NyAqLworCTB4NTYxNSwweDU2MEMsMHg1NjEyLDB4NTVGQywweDU2MEYsMHg1NjFDLDB4NTYwMSwweDU2MTMsLyogMHg0OC0weDRGICovCisJMHg1NjAyLDB4NTVGQSwweDU2MUQsMHg1NjA0LDB4NTVGRiwweDU1RjksMHg1ODg5LDB4NTg3QywvKiAweDUwLTB4NTcgKi8KKwkweDU4OTAsMHg1ODk4LDB4NTg4NiwweDU4ODEsMHg1ODdGLDB4NTg3NCwweDU4OEIsMHg1ODdBLC8qIDB4NTgtMHg1RiAqLworCTB4NTg4NywweDU4OTEsMHg1ODhFLDB4NTg3NiwweDU4ODIsMHg1ODg4LDB4NTg3QiwweDU4OTQsLyogMHg2MC0weDY3ICovCisJMHg1ODhGLDB4NThGRSwweDU5NkIsMHg1QURDLDB4NUFFRSwweDVBRTUsMHg1QUQ1LDB4NUFFQSwvKiAweDY4LTB4NkYgKi8KKwkweDVBREEsMHg1QUVELDB4NUFFQiwweDVBRjMsMHg1QUUyLDB4NUFFMCwweDVBREIsMHg1QUVDLC8qIDB4NzAtMHg3NyAqLworCTB4NUFERSwweDVBREQsMHg1QUQ5LDB4NUFFOCwweDVBREYsMHg1Qjc3LDB4NUJFMCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDVCRTMsMHg1QzYzLDB4NUQ4MiwweDVEODAsMHg1RDdELDB4NUQ4NiwweDVEN0EsLyogMHhBMC0weEE3ICovCisJMHg1RDgxLDB4NUQ3NywweDVEOEEsMHg1RDg5LDB4NUQ4OCwweDVEN0UsMHg1RDdDLDB4NUQ4RCwvKiAweEE4LTB4QUYgKi8KKwkweDVENzksMHg1RDdGLDB4NUU1OCwweDVFNTksMHg1RTUzLDB4NUVEOCwweDVFRDEsMHg1RUQ3LC8qIDB4QjAtMHhCNyAqLworCTB4NUVDRSwweDVFREMsMHg1RUQ1LDB4NUVEOSwweDVFRDIsMHg1RUQ0LDB4NUY0NCwweDVGNDMsLyogMHhCOC0weEJGICovCisJMHg1RjZGLDB4NUZCNiwweDYxMkMsMHg2MTI4LDB4NjE0MSwweDYxNUUsMHg2MTcxLDB4NjE3MywvKiAweEMwLTB4QzcgKi8KKwkweDYxNTIsMHg2MTUzLDB4NjE3MiwweDYxNkMsMHg2MTgwLDB4NjE3NCwweDYxNTQsMHg2MTdBLC8qIDB4QzgtMHhDRiAqLworCTB4NjE1QiwweDYxNjUsMHg2MTNCLDB4NjE2QSwweDYxNjEsMHg2MTU2LDB4NjIyOSwweDYyMjcsLyogMHhEMC0weEQ3ICovCisJMHg2MjJCLDB4NjQyQiwweDY0NEQsMHg2NDVCLDB4NjQ1RCwweDY0NzQsMHg2NDc2LDB4NjQ3MiwvKiAweEQ4LTB4REYgKi8KKwkweDY0NzMsMHg2NDdELDB4NjQ3NSwweDY0NjYsMHg2NEE2LDB4NjQ0RSwweDY0ODIsMHg2NDVFLC8qIDB4RTAtMHhFNyAqLworCTB4NjQ1QywweDY0NEIsMHg2NDUzLDB4NjQ2MCwweDY0NTAsMHg2NDdGLDB4NjQzRiwweDY0NkMsLyogMHhFOC0weEVGICovCisJMHg2NDZCLDB4NjQ1OSwweDY0NjUsMHg2NDc3LDB4NjU3MywweDY1QTAsMHg2NkExLDB4NjZBMCwvKiAweEYwLTB4RjcgKi8KKwkweDY2OUYsMHg2NzA1LDB4NjcwNCwweDY3MjIsMHg2OUIxLDB4NjlCNiwweDY5QzksMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0UyWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NjlBMCwweDY5Q0UsMHg2OTk2LDB4NjlCMCwweDY5QUMsMHg2OUJDLDB4Njk5MSwweDY5OTksLyogMHg0MC0weDQ3ICovCisJMHg2OThFLDB4NjlBNywweDY5OEQsMHg2OUE5LDB4NjlCRSwweDY5QUYsMHg2OUJGLDB4NjlDNCwvKiAweDQ4LTB4NEYgKi8KKwkweDY5QkQsMHg2OUE0LDB4NjlENCwweDY5QjksMHg2OUNBLDB4Njk5QSwweDY5Q0YsMHg2OUIzLC8qIDB4NTAtMHg1NyAqLworCTB4Njk5MywweDY5QUEsMHg2OUExLDB4Njk5RSwweDY5RDksMHg2OTk3LDB4Njk5MCwweDY5QzIsLyogMHg1OC0weDVGICovCisJMHg2OUI1LDB4NjlBNSwweDY5QzYsMHg2QjRBLDB4NkI0RCwweDZCNEIsMHg2QjlFLDB4NkI5RiwvKiAweDYwLTB4NjcgKi8KKwkweDZCQTAsMHg2QkMzLDB4NkJDNCwweDZCRkUsMHg2RUNFLDB4NkVGNSwweDZFRjEsMHg2RjAzLC8qIDB4NjgtMHg2RiAqLworCTB4NkYyNSwweDZFRjgsMHg2RjM3LDB4NkVGQiwweDZGMkUsMHg2RjA5LDB4NkY0RSwweDZGMTksLyogMHg3MC0weDc3ICovCisJMHg2RjFBLDB4NkYyNywweDZGMTgsMHg2RjNCLDB4NkYxMiwweDZFRUQsMHg2RjBBLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NkYzNiwweDZGNzMsMHg2RUY5LDB4NkVFRSwweDZGMkQsMHg2RjQwLDB4NkYzMCwvKiAweEEwLTB4QTcgKi8KKwkweDZGM0MsMHg2RjM1LDB4NkVFQiwweDZGMDcsMHg2RjBFLDB4NkY0MywweDZGMDUsMHg2RUZELC8qIDB4QTgtMHhBRiAqLworCTB4NkVGNiwweDZGMzksMHg2RjFDLDB4NkVGQywweDZGM0EsMHg2RjFGLDB4NkYwRCwweDZGMUUsLyogMHhCMC0weEI3ICovCisJMHg2RjA4LDB4NkYyMSwweDcxODcsMHg3MTkwLDB4NzE4OSwweDcxODAsMHg3MTg1LDB4NzE4MiwvKiAweEI4LTB4QkYgKi8KKwkweDcxOEYsMHg3MTdCLDB4NzE4NiwweDcxODEsMHg3MTk3LDB4NzI0NCwweDcyNTMsMHg3Mjk3LC8qIDB4QzAtMHhDNyAqLworCTB4NzI5NSwweDcyOTMsMHg3MzQzLDB4NzM0RCwweDczNTEsMHg3MzRDLDB4NzQ2MiwweDc0NzMsLyogMHhDOC0weENGICovCisJMHg3NDcxLDB4NzQ3NSwweDc0NzIsMHg3NDY3LDB4NzQ2RSwweDc1MDAsMHg3NTAyLDB4NzUwMywvKiAweEQwLTB4RDcgKi8KKwkweDc1N0QsMHg3NTkwLDB4NzYxNiwweDc2MDgsMHg3NjBDLDB4NzYxNSwweDc2MTEsMHg3NjBBLC8qIDB4RDgtMHhERiAqLworCTB4NzYxNCwweDc2QjgsMHg3NzgxLDB4Nzc3QywweDc3ODUsMHg3NzgyLDB4Nzc2RSwweDc3ODAsLyogMHhFMC0weEU3ICovCisJMHg3NzZGLDB4Nzc3RSwweDc3ODMsMHg3OEIyLDB4NzhBQSwweDc4QjQsMHg3OEFELDB4NzhBOCwvKiAweEU4LTB4RUYgKi8KKwkweDc4N0UsMHg3OEFCLDB4Nzg5RSwweDc4QTUsMHg3OEEwLDB4NzhBQywweDc4QTIsMHg3OEE0LC8qIDB4RjAtMHhGNyAqLworCTB4Nzk5OCwweDc5OEEsMHg3OThCLDB4Nzk5NiwweDc5OTUsMHg3OTk0LDB4Nzk5MywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRTNbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg3OTk3LDB4Nzk4OCwweDc5OTIsMHg3OTkwLDB4N0EyQiwweDdBNEEsMHg3QTMwLDB4N0EyRiwvKiAweDQwLTB4NDcgKi8KKwkweDdBMjgsMHg3QTI2LDB4N0FBOCwweDdBQUIsMHg3QUFDLDB4N0FFRSwweDdCODgsMHg3QjlDLC8qIDB4NDgtMHg0RiAqLworCTB4N0I4QSwweDdCOTEsMHg3QjkwLDB4N0I5NiwweDdCOEQsMHg3QjhDLDB4N0I5QiwweDdCOEUsLyogMHg1MC0weDU3ICovCisJMHg3Qjg1LDB4N0I5OCwweDUyODQsMHg3Qjk5LDB4N0JBNCwweDdCODIsMHg3Q0JCLDB4N0NCRiwvKiAweDU4LTB4NUYgKi8KKwkweDdDQkMsMHg3Q0JBLDB4N0RBNywweDdEQjcsMHg3REMyLDB4N0RBMywweDdEQUEsMHg3REMxLC8qIDB4NjAtMHg2NyAqLworCTB4N0RDMCwweDdEQzUsMHg3RDlELDB4N0RDRSwweDdEQzQsMHg3REM2LDB4N0RDQiwweDdEQ0MsLyogMHg2OC0weDZGICovCisJMHg3REFGLDB4N0RCOSwweDdEOTYsMHg3REJDLDB4N0Q5RiwweDdEQTYsMHg3REFFLDB4N0RBOSwvKiAweDcwLTB4NzcgKi8KKwkweDdEQTEsMHg3REM5LDB4N0Y3MywweDdGRTIsMHg3RkUzLDB4N0ZFNSwweDdGREUsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg4MDI0LDB4ODA1RCwweDgwNUMsMHg4MTg5LDB4ODE4NiwweDgxODMsMHg4MTg3LC8qIDB4QTAtMHhBNyAqLworCTB4ODE4RCwweDgxOEMsMHg4MThCLDB4ODIxNSwweDg0OTcsMHg4NEE0LDB4ODRBMSwweDg0OUYsLyogMHhBOC0weEFGICovCisJMHg4NEJBLDB4ODRDRSwweDg0QzIsMHg4NEFDLDB4ODRBRSwweDg0QUIsMHg4NEI5LDB4ODRCNCwvKiAweEIwLTB4QjcgKi8KKwkweDg0QzEsMHg4NENELDB4ODRBQSwweDg0OUEsMHg4NEIxLDB4ODREMCwweDg0OUQsMHg4NEE3LC8qIDB4QjgtMHhCRiAqLworCTB4ODRCQiwweDg0QTIsMHg4NDk0LDB4ODRDNywweDg0Q0MsMHg4NDlCLDB4ODRBOSwweDg0QUYsLyogMHhDMC0weEM3ICovCisJMHg4NEE4LDB4ODRENiwweDg0OTgsMHg4NEI2LDB4ODRDRiwweDg0QTAsMHg4NEQ3LDB4ODRENCwvKiAweEM4LTB4Q0YgKi8KKwkweDg0RDIsMHg4NERCLDB4ODRCMCwweDg0OTEsMHg4NjYxLDB4ODczMywweDg3MjMsMHg4NzI4LC8qIDB4RDAtMHhENyAqLworCTB4ODc2QiwweDg3NDAsMHg4NzJFLDB4ODcxRSwweDg3MjEsMHg4NzE5LDB4ODcxQiwweDg3NDMsLyogMHhEOC0weERGICovCisJMHg4NzJDLDB4ODc0MSwweDg3M0UsMHg4NzQ2LDB4ODcyMCwweDg3MzIsMHg4NzJBLDB4ODcyRCwvKiAweEUwLTB4RTcgKi8KKwkweDg3M0MsMHg4NzEyLDB4ODczQSwweDg3MzEsMHg4NzM1LDB4ODc0MiwweDg3MjYsMHg4NzI3LC8qIDB4RTgtMHhFRiAqLworCTB4ODczOCwweDg3MjQsMHg4NzFBLDB4ODczMCwweDg3MTEsMHg4OEY3LDB4ODhFNywweDg4RjEsLyogMHhGMC0weEY3ICovCisJMHg4OEYyLDB4ODhGQSwweDg4RkUsMHg4OEVFLDB4ODhGQywweDg4RjYsMHg4OEZCLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FNFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDg4RjAsMHg4OEVDLDB4ODhFQiwweDg5OUQsMHg4OUExLDB4ODk5RiwweDg5OUUsMHg4OUU5LC8qIDB4NDAtMHg0NyAqLworCTB4ODlFQiwweDg5RTgsMHg4QUFCLDB4OEE5OSwweDhBOEIsMHg4QTkyLDB4OEE4RiwweDhBOTYsLyogMHg0OC0weDRGICovCisJMHg4QzNELDB4OEM2OCwweDhDNjksMHg4Q0Q1LDB4OENDRiwweDhDRDcsMHg4RDk2LDB4OEUwOSwvKiAweDUwLTB4NTcgKi8KKwkweDhFMDIsMHg4REZGLDB4OEUwRCwweDhERkQsMHg4RTBBLDB4OEUwMywweDhFMDcsMHg4RTA2LC8qIDB4NTgtMHg1RiAqLworCTB4OEUwNSwweDhERkUsMHg4RTAwLDB4OEUwNCwweDhGMTAsMHg4RjExLDB4OEYwRSwweDhGMEQsLyogMHg2MC0weDY3ICovCisJMHg5MTIzLDB4OTExQywweDkxMjAsMHg5MTIyLDB4OTExRiwweDkxMUQsMHg5MTFBLDB4OTEyNCwvKiAweDY4LTB4NkYgKi8KKwkweDkxMjEsMHg5MTFCLDB4OTE3QSwweDkxNzIsMHg5MTc5LDB4OTE3MywweDkyQTUsMHg5MkE0LC8qIDB4NzAtMHg3NyAqLworCTB4OTI3NiwweDkyOUIsMHg5MjdBLDB4OTJBMCwweDkyOTQsMHg5MkFBLDB4OTI4RCwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDkyQTYsMHg5MjlBLDB4OTJBQiwweDkyNzksMHg5Mjk3LDB4OTI3RiwweDkyQTMsLyogMHhBMC0weEE3ICovCisJMHg5MkVFLDB4OTI4RSwweDkyODIsMHg5Mjk1LDB4OTJBMiwweDkyN0QsMHg5Mjg4LDB4OTJBMSwvKiAweEE4LTB4QUYgKi8KKwkweDkyOEEsMHg5Mjg2LDB4OTI4QywweDkyOTksMHg5MkE3LDB4OTI3RSwweDkyODcsMHg5MkE5LC8qIDB4QjAtMHhCNyAqLworCTB4OTI5RCwweDkyOEIsMHg5MjJELDB4OTY5RSwweDk2QTEsMHg5NkZGLDB4OTc1OCwweDk3N0QsLyogMHhCOC0weEJGICovCisJMHg5NzdBLDB4OTc3RSwweDk3ODMsMHg5NzgwLDB4OTc4MiwweDk3N0IsMHg5Nzg0LDB4OTc4MSwvKiAweEMwLTB4QzcgKi8KKwkweDk3N0YsMHg5N0NFLDB4OTdDRCwweDk4MTYsMHg5OEFELDB4OThBRSwweDk5MDIsMHg5OTAwLC8qIDB4QzgtMHhDRiAqLworCTB4OTkwNywweDk5OUQsMHg5OTlDLDB4OTlDMywweDk5QjksMHg5OUJCLDB4OTlCQSwweDk5QzIsLyogMHhEMC0weEQ3ICovCisJMHg5OUJELDB4OTlDNywweDlBQjEsMHg5QUUzLDB4OUFFNywweDlCM0UsMHg5QjNGLDB4OUI2MCwvKiAweEQ4LTB4REYgKi8KKwkweDlCNjEsMHg5QjVGLDB4OUNGMSwweDlDRjIsMHg5Q0Y1LDB4OUVBNywweDUwRkYsMHg1MTAzLC8qIDB4RTAtMHhFNyAqLworCTB4NTEzMCwweDUwRjgsMHg1MTA2LDB4NTEwNywweDUwRjYsMHg1MEZFLDB4NTEwQiwweDUxMEMsLyogMHhFOC0weEVGICovCisJMHg1MEZELDB4NTEwQSwweDUyOEIsMHg1MjhDLDB4NTJGMSwweDUyRUYsMHg1NjQ4LDB4NTY0MiwvKiAweEYwLTB4RjcgKi8KKwkweDU2NEMsMHg1NjM1LDB4NTY0MSwweDU2NEEsMHg1NjQ5LDB4NTY0NiwweDU2NTgsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0U1WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NTY1QSwweDU2NDAsMHg1NjMzLDB4NTYzRCwweDU2MkMsMHg1NjNFLDB4NTYzOCwweDU2MkEsLyogMHg0MC0weDQ3ICovCisJMHg1NjNBLDB4NTcxQSwweDU4QUIsMHg1ODlELDB4NThCMSwweDU4QTAsMHg1OEEzLDB4NThBRiwvKiAweDQ4LTB4NEYgKi8KKwkweDU4QUMsMHg1OEE1LDB4NThBMSwweDU4RkYsMHg1QUZGLDB4NUFGNCwweDVBRkQsMHg1QUY3LC8qIDB4NTAtMHg1NyAqLworCTB4NUFGNiwweDVCMDMsMHg1QUY4LDB4NUIwMiwweDVBRjksMHg1QjAxLDB4NUIwNywweDVCMDUsLyogMHg1OC0weDVGICovCisJMHg1QjBGLDB4NUM2NywweDVEOTksMHg1RDk3LDB4NUQ5RiwweDVEOTIsMHg1REEyLDB4NUQ5MywvKiAweDYwLTB4NjcgKi8KKwkweDVEOTUsMHg1REEwLDB4NUQ5QywweDVEQTEsMHg1RDlBLDB4NUQ5RSwweDVFNjksMHg1RTVELC8qIDB4NjgtMHg2RiAqLworCTB4NUU2MCwweDVFNUMsMHg3REYzLDB4NUVEQiwweDVFREUsMHg1RUUxLDB4NUY0OSwweDVGQjIsLyogMHg3MC0weDc3ICovCisJMHg2MThCLDB4NjE4MywweDYxNzksMHg2MUIxLDB4NjFCMCwweDYxQTIsMHg2MTg5LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NjE5QiwweDYxOTMsMHg2MUFGLDB4NjFBRCwweDYxOUYsMHg2MTkyLDB4NjFBQSwvKiAweEEwLTB4QTcgKi8KKwkweDYxQTEsMHg2MThELDB4NjE2NiwweDYxQjMsMHg2MjJELDB4NjQ2RSwweDY0NzAsMHg2NDk2LC8qIDB4QTgtMHhBRiAqLworCTB4NjRBMCwweDY0ODUsMHg2NDk3LDB4NjQ5QywweDY0OEYsMHg2NDhCLDB4NjQ4QSwweDY0OEMsLyogMHhCMC0weEI3ICovCisJMHg2NEEzLDB4NjQ5RiwweDY0NjgsMHg2NEIxLDB4NjQ5OCwweDY1NzYsMHg2NTdBLDB4NjU3OSwvKiAweEI4LTB4QkYgKi8KKwkweDY1N0IsMHg2NUIyLDB4NjVCMywweDY2QjUsMHg2NkIwLDB4NjZBOSwweDY2QjIsMHg2NkI3LC8qIDB4QzAtMHhDNyAqLworCTB4NjZBQSwweDY2QUYsMHg2QTAwLDB4NkEwNiwweDZBMTcsMHg2OUU1LDB4NjlGOCwweDZBMTUsLyogMHhDOC0weENGICovCisJMHg2OUYxLDB4NjlFNCwweDZBMjAsMHg2OUZGLDB4NjlFQywweDY5RTIsMHg2QTFCLDB4NkExRCwvKiAweEQwLTB4RDcgKi8KKwkweDY5RkUsMHg2QTI3LDB4NjlGMiwweDY5RUUsMHg2QTE0LDB4NjlGNywweDY5RTcsMHg2QTQwLC8qIDB4RDgtMHhERiAqLworCTB4NkEwOCwweDY5RTYsMHg2OUZCLDB4NkEwRCwweDY5RkMsMHg2OUVCLDB4NkEwOSwweDZBMDQsLyogMHhFMC0weEU3ICovCisJMHg2QTE4LDB4NkEyNSwweDZBMEYsMHg2OUY2LDB4NkEyNiwweDZBMDcsMHg2OUY0LDB4NkExNiwvKiAweEU4LTB4RUYgKi8KKwkweDZCNTEsMHg2QkE1LDB4NkJBMywweDZCQTIsMHg2QkE2LDB4NkMwMSwweDZDMDAsMHg2QkZGLC8qIDB4RjAtMHhGNyAqLworCTB4NkMwMiwweDZGNDEsMHg2RjI2LDB4NkY3RSwweDZGODcsMHg2RkM2LDB4NkY5MiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRTZbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg2RjhELDB4NkY4OSwweDZGOEMsMHg2RjYyLDB4NkY0RiwweDZGODUsMHg2RjVBLDB4NkY5NiwvKiAweDQwLTB4NDcgKi8KKwkweDZGNzYsMHg2RjZDLDB4NkY4MiwweDZGNTUsMHg2RjcyLDB4NkY1MiwweDZGNTAsMHg2RjU3LC8qIDB4NDgtMHg0RiAqLworCTB4NkY5NCwweDZGOTMsMHg2RjVELDB4NkYwMCwweDZGNjEsMHg2RjZCLDB4NkY3RCwweDZGNjcsLyogMHg1MC0weDU3ICovCisJMHg2RjkwLDB4NkY1MywweDZGOEIsMHg2RjY5LDB4NkY3RiwweDZGOTUsMHg2RjYzLDB4NkY3NywvKiAweDU4LTB4NUYgKi8KKwkweDZGNkEsMHg2RjdCLDB4NzFCMiwweDcxQUYsMHg3MTlCLDB4NzFCMCwweDcxQTAsMHg3MTlBLC8qIDB4NjAtMHg2NyAqLworCTB4NzFBOSwweDcxQjUsMHg3MTlELDB4NzFBNSwweDcxOUUsMHg3MUE0LDB4NzFBMSwweDcxQUEsLyogMHg2OC0weDZGICovCisJMHg3MTlDLDB4NzFBNywweDcxQjMsMHg3Mjk4LDB4NzI5QSwweDczNTgsMHg3MzUyLDB4NzM1RSwvKiAweDcwLTB4NzcgKi8KKwkweDczNUYsMHg3MzYwLDB4NzM1RCwweDczNUIsMHg3MzYxLDB4NzM1QSwweDczNTksMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg3MzYyLDB4NzQ4NywweDc0ODksMHg3NDhBLDB4NzQ4NiwweDc0ODEsMHg3NDdELC8qIDB4QTAtMHhBNyAqLworCTB4NzQ4NSwweDc0ODgsMHg3NDdDLDB4NzQ3OSwweDc1MDgsMHg3NTA3LDB4NzU3RSwweDc2MjUsLyogMHhBOC0weEFGICovCisJMHg3NjFFLDB4NzYxOSwweDc2MUQsMHg3NjFDLDB4NzYyMywweDc2MUEsMHg3NjI4LDB4NzYxQiwvKiAweEIwLTB4QjcgKi8KKwkweDc2OUMsMHg3NjlELDB4NzY5RSwweDc2OUIsMHg3NzhELDB4Nzc4RiwweDc3ODksMHg3Nzg4LC8qIDB4QjgtMHhCRiAqLworCTB4NzhDRCwweDc4QkIsMHg3OENGLDB4NzhDQywweDc4RDEsMHg3OENFLDB4NzhENCwweDc4QzgsLyogMHhDMC0weEM3ICovCisJMHg3OEMzLDB4NzhDNCwweDc4QzksMHg3OTlBLDB4NzlBMSwweDc5QTAsMHg3OTlDLDB4NzlBMiwvKiAweEM4LTB4Q0YgKi8KKwkweDc5OUIsMHg2Qjc2LDB4N0EzOSwweDdBQjIsMHg3QUI0LDB4N0FCMywweDdCQjcsMHg3QkNCLC8qIDB4RDAtMHhENyAqLworCTB4N0JCRSwweDdCQUMsMHg3QkNFLDB4N0JBRiwweDdCQjksMHg3QkNBLDB4N0JCNSwweDdDQzUsLyogMHhEOC0weERGICovCisJMHg3Q0M4LDB4N0NDQywweDdDQ0IsMHg3REY3LDB4N0REQiwweDdERUEsMHg3REU3LDB4N0RENywvKiAweEUwLTB4RTcgKi8KKwkweDdERTEsMHg3RTAzLDB4N0RGQSwweDdERTYsMHg3REY2LDB4N0RGMSwweDdERjAsMHg3REVFLC8qIDB4RTgtMHhFRiAqLworCTB4N0RERiwweDdGNzYsMHg3RkFDLDB4N0ZCMCwweDdGQUQsMHg3RkVELDB4N0ZFQiwweDdGRUEsLyogMHhGMC0weEY3ICovCisJMHg3RkVDLDB4N0ZFNiwweDdGRTgsMHg4MDY0LDB4ODA2NywweDgxQTMsMHg4MTlGLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FN1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDgxOUUsMHg4MTk1LDB4ODFBMiwweDgxOTksMHg4MTk3LDB4ODIxNiwweDgyNEYsMHg4MjUzLC8qIDB4NDAtMHg0NyAqLworCTB4ODI1MiwweDgyNTAsMHg4MjRFLDB4ODI1MSwweDg1MjQsMHg4NTNCLDB4ODUwRiwweDg1MDAsLyogMHg0OC0weDRGICovCisJMHg4NTI5LDB4ODUwRSwweDg1MDksMHg4NTBELDB4ODUxRiwweDg1MEEsMHg4NTI3LDB4ODUxQywvKiAweDUwLTB4NTcgKi8KKwkweDg0RkIsMHg4NTJCLDB4ODRGQSwweDg1MDgsMHg4NTBDLDB4ODRGNCwweDg1MkEsMHg4NEYyLC8qIDB4NTgtMHg1RiAqLworCTB4ODUxNSwweDg0RjcsMHg4NEVCLDB4ODRGMywweDg0RkMsMHg4NTEyLDB4ODRFQSwweDg0RTksLyogMHg2MC0weDY3ICovCisJMHg4NTE2LDB4ODRGRSwweDg1MjgsMHg4NTFELDB4ODUyRSwweDg1MDIsMHg4NEZELDB4ODUxRSwvKiAweDY4LTB4NkYgKi8KKwkweDg0RjYsMHg4NTMxLDB4ODUyNiwweDg0RTcsMHg4NEU4LDB4ODRGMCwweDg0RUYsMHg4NEY5LC8qIDB4NzAtMHg3NyAqLworCTB4ODUxOCwweDg1MjAsMHg4NTMwLDB4ODUwQiwweDg1MTksMHg4NTJGLDB4ODY2MiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDg3NTYsMHg4NzYzLDB4ODc2NCwweDg3NzcsMHg4N0UxLDB4ODc3MywweDg3NTgsLyogMHhBMC0weEE3ICovCisJMHg4NzU0LDB4ODc1QiwweDg3NTIsMHg4NzYxLDB4ODc1QSwweDg3NTEsMHg4NzVFLDB4ODc2RCwvKiAweEE4LTB4QUYgKi8KKwkweDg3NkEsMHg4NzUwLDB4ODc0RSwweDg3NUYsMHg4NzVELDB4ODc2RiwweDg3NkMsMHg4NzdBLC8qIDB4QjAtMHhCNyAqLworCTB4ODc2RSwweDg3NUMsMHg4NzY1LDB4ODc0RiwweDg3N0IsMHg4Nzc1LDB4ODc2MiwweDg3NjcsLyogMHhCOC0weEJGICovCisJMHg4NzY5LDB4ODg1QSwweDg5MDUsMHg4OTBDLDB4ODkxNCwweDg5MEIsMHg4OTE3LDB4ODkxOCwvKiAweEMwLTB4QzcgKi8KKwkweDg5MTksMHg4OTA2LDB4ODkxNiwweDg5MTEsMHg4OTBFLDB4ODkwOSwweDg5QTIsMHg4OUE0LC8qIDB4QzgtMHhDRiAqLworCTB4ODlBMywweDg5RUQsMHg4OUYwLDB4ODlFQywweDhBQ0YsMHg4QUM2LDB4OEFCOCwweDhBRDMsLyogMHhEMC0weEQ3ICovCisJMHg4QUQxLDB4OEFENCwweDhBRDUsMHg4QUJCLDB4OEFENywweDhBQkUsMHg4QUMwLDB4OEFDNSwvKiAweEQ4LTB4REYgKi8KKwkweDhBRDgsMHg4QUMzLDB4OEFCQSwweDhBQkQsMHg4QUQ5LDB4OEMzRSwweDhDNEQsMHg4QzhGLC8qIDB4RTAtMHhFNyAqLworCTB4OENFNSwweDhDREYsMHg4Q0Q5LDB4OENFOCwweDhDREEsMHg4Q0RELDB4OENFNywweDhEQTAsLyogMHhFOC0weEVGICovCisJMHg4RDlDLDB4OERBMSwweDhEOUIsMHg4RTIwLDB4OEUyMywweDhFMjUsMHg4RTI0LDB4OEUyRSwvKiAweEYwLTB4RjcgKi8KKwkweDhFMTUsMHg4RTFCLDB4OEUxNiwweDhFMTEsMHg4RTE5LDB4OEUyNiwweDhFMjcsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0U4WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OEUxNCwweDhFMTIsMHg4RTE4LDB4OEUxMywweDhFMUMsMHg4RTE3LDB4OEUxQSwweDhGMkMsLyogMHg0MC0weDQ3ICovCisJMHg4RjI0LDB4OEYxOCwweDhGMUEsMHg4RjIwLDB4OEYyMywweDhGMTYsMHg4RjE3LDB4OTA3MywvKiAweDQ4LTB4NEYgKi8KKwkweDkwNzAsMHg5MDZGLDB4OTA2NywweDkwNkIsMHg5MTJGLDB4OTEyQiwweDkxMjksMHg5MTJBLC8qIDB4NTAtMHg1NyAqLworCTB4OTEzMiwweDkxMjYsMHg5MTJFLDB4OTE4NSwweDkxODYsMHg5MThBLDB4OTE4MSwweDkxODIsLyogMHg1OC0weDVGICovCisJMHg5MTg0LDB4OTE4MCwweDkyRDAsMHg5MkMzLDB4OTJDNCwweDkyQzAsMHg5MkQ5LDB4OTJCNiwvKiAweDYwLTB4NjcgKi8KKwkweDkyQ0YsMHg5MkYxLDB4OTJERiwweDkyRDgsMHg5MkU5LDB4OTJENywweDkyREQsMHg5MkNDLC8qIDB4NjgtMHg2RiAqLworCTB4OTJFRiwweDkyQzIsMHg5MkU4LDB4OTJDQSwweDkyQzgsMHg5MkNFLDB4OTJFNiwweDkyQ0QsLyogMHg3MC0weDc3ICovCisJMHg5MkQ1LDB4OTJDOSwweDkyRTAsMHg5MkRFLDB4OTJFNywweDkyRDEsMHg5MkQzLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4OTJCNSwweDkyRTEsMHg5MkM2LDB4OTJCNCwweDk1N0MsMHg5NUFDLDB4OTVBQiwvKiAweEEwLTB4QTcgKi8KKwkweDk1QUUsMHg5NUIwLDB4OTZBNCwweDk2QTIsMHg5NkQzLDB4OTcwNSwweDk3MDgsMHg5NzAyLC8qIDB4QTgtMHhBRiAqLworCTB4OTc1QSwweDk3OEEsMHg5NzhFLDB4OTc4OCwweDk3RDAsMHg5N0NGLDB4OTgxRSwweDk4MUQsLyogMHhCMC0weEI3ICovCisJMHg5ODI2LDB4OTgyOSwweDk4MjgsMHg5ODIwLDB4OTgxQiwweDk4MjcsMHg5OEIyLDB4OTkwOCwvKiAweEI4LTB4QkYgKi8KKwkweDk4RkEsMHg5OTExLDB4OTkxNCwweDk5MTYsMHg5OTE3LDB4OTkxNSwweDk5REMsMHg5OUNELC8qIDB4QzAtMHhDNyAqLworCTB4OTlDRiwweDk5RDMsMHg5OUQ0LDB4OTlDRSwweDk5QzksMHg5OUQ2LDB4OTlEOCwweDk5Q0IsLyogMHhDOC0weENGICovCisJMHg5OUQ3LDB4OTlDQywweDlBQjMsMHg5QUVDLDB4OUFFQiwweDlBRjMsMHg5QUYyLDB4OUFGMSwvKiAweEQwLTB4RDcgKi8KKwkweDlCNDYsMHg5QjQzLDB4OUI2NywweDlCNzQsMHg5QjcxLDB4OUI2NiwweDlCNzYsMHg5Qjc1LC8qIDB4RDgtMHhERiAqLworCTB4OUI3MCwweDlCNjgsMHg5QjY0LDB4OUI2QywweDlDRkMsMHg5Q0ZBLDB4OUNGRCwweDlDRkYsLyogMHhFMC0weEU3ICovCisJMHg5Q0Y3LDB4OUQwNywweDlEMDAsMHg5Q0Y5LDB4OUNGQiwweDlEMDgsMHg5RDA1LDB4OUQwNCwvKiAweEU4LTB4RUYgKi8KKwkweDlFODMsMHg5RUQzLDB4OUYwRiwweDlGMTAsMHg1MTFDLDB4NTExMywweDUxMTcsMHg1MTFBLC8qIDB4RjAtMHhGNyAqLworCTB4NTExMSwweDUxREUsMHg1MzM0LDB4NTNFMSwweDU2NzAsMHg1NjYwLDB4NTY2RSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRTlbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg1NjczLDB4NTY2NiwweDU2NjMsMHg1NjZELDB4NTY3MiwweDU2NUUsMHg1Njc3LDB4NTcxQywvKiAweDQwLTB4NDcgKi8KKwkweDU3MUIsMHg1OEM4LDB4NThCRCwweDU4QzksMHg1OEJGLDB4NThCQSwweDU4QzIsMHg1OEJDLC8qIDB4NDgtMHg0RiAqLworCTB4NThDNiwweDVCMTcsMHg1QjE5LDB4NUIxQiwweDVCMjEsMHg1QjE0LDB4NUIxMywweDVCMTAsLyogMHg1MC0weDU3ICovCisJMHg1QjE2LDB4NUIyOCwweDVCMUEsMHg1QjIwLDB4NUIxRSwweDVCRUYsMHg1REFDLDB4NURCMSwvKiAweDU4LTB4NUYgKi8KKwkweDVEQTksMHg1REE3LDB4NURCNSwweDVEQjAsMHg1REFFLDB4NURBQSwweDVEQTgsMHg1REIyLC8qIDB4NjAtMHg2NyAqLworCTB4NURBRCwweDVEQUYsMHg1REI0LDB4NUU2NywweDVFNjgsMHg1RTY2LDB4NUU2RiwweDVFRTksLyogMHg2OC0weDZGICovCisJMHg1RUU3LDB4NUVFNiwweDVFRTgsMHg1RUU1LDB4NUY0QiwweDVGQkMsMHg2MTlELDB4NjFBOCwvKiAweDcwLTB4NzcgKi8KKwkweDYxOTYsMHg2MUM1LDB4NjFCNCwweDYxQzYsMHg2MUMxLDB4NjFDQywweDYxQkEsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg2MUJGLDB4NjFCOCwweDYxOEMsMHg2NEQ3LDB4NjRENiwweDY0RDAsMHg2NENGLC8qIDB4QTAtMHhBNyAqLworCTB4NjRDOSwweDY0QkQsMHg2NDg5LDB4NjRDMywweDY0REIsMHg2NEYzLDB4NjREOSwweDY1MzMsLyogMHhBOC0weEFGICovCisJMHg2NTdGLDB4NjU3QywweDY1QTIsMHg2NkM4LDB4NjZCRSwweDY2QzAsMHg2NkNBLDB4NjZDQiwvKiAweEIwLTB4QjcgKi8KKwkweDY2Q0YsMHg2NkJELDB4NjZCQiwweDY2QkEsMHg2NkNDLDB4NjcyMywweDZBMzQsMHg2QTY2LC8qIDB4QjgtMHhCRiAqLworCTB4NkE0OSwweDZBNjcsMHg2QTMyLDB4NkE2OCwweDZBM0UsMHg2QTVELDB4NkE2RCwweDZBNzYsLyogMHhDMC0weEM3ICovCisJMHg2QTVCLDB4NkE1MSwweDZBMjgsMHg2QTVBLDB4NkEzQiwweDZBM0YsMHg2QTQxLDB4NkE2QSwvKiAweEM4LTB4Q0YgKi8KKwkweDZBNjQsMHg2QTUwLDB4NkE0RiwweDZBNTQsMHg2QTZGLDB4NkE2OSwweDZBNjAsMHg2QTNDLC8qIDB4RDAtMHhENyAqLworCTB4NkE1RSwweDZBNTYsMHg2QTU1LDB4NkE0RCwweDZBNEUsMHg2QTQ2LDB4NkI1NSwweDZCNTQsLyogMHhEOC0weERGICovCisJMHg2QjU2LDB4NkJBNywweDZCQUEsMHg2QkFCLDB4NkJDOCwweDZCQzcsMHg2QzA0LDB4NkMwMywvKiAweEUwLTB4RTcgKi8KKwkweDZDMDYsMHg2RkFELDB4NkZDQiwweDZGQTMsMHg2RkM3LDB4NkZCQywweDZGQ0UsMHg2RkM4LC8qIDB4RTgtMHhFRiAqLworCTB4NkY1RSwweDZGQzQsMHg2RkJELDB4NkY5RSwweDZGQ0EsMHg2RkE4LDB4NzAwNCwweDZGQTUsLyogMHhGMC0weEY3ICovCisJMHg2RkFFLDB4NkZCQSwweDZGQUMsMHg2RkFBLDB4NkZDRiwweDZGQkYsMHg2RkI4LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FQVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDZGQTIsMHg2RkM5LDB4NkZBQiwweDZGQ0QsMHg2RkFGLDB4NkZCMiwweDZGQjAsMHg3MUM1LC8qIDB4NDAtMHg0NyAqLworCTB4NzFDMiwweDcxQkYsMHg3MUI4LDB4NzFENiwweDcxQzAsMHg3MUMxLDB4NzFDQiwweDcxRDQsLyogMHg0OC0weDRGICovCisJMHg3MUNBLDB4NzFDNywweDcxQ0YsMHg3MUJELDB4NzFEOCwweDcxQkMsMHg3MUM2LDB4NzFEQSwvKiAweDUwLTB4NTcgKi8KKwkweDcxREIsMHg3MjlELDB4NzI5RSwweDczNjksMHg3MzY2LDB4NzM2NywweDczNkMsMHg3MzY1LC8qIDB4NTgtMHg1RiAqLworCTB4NzM2QiwweDczNkEsMHg3NDdGLDB4NzQ5QSwweDc0QTAsMHg3NDk0LDB4NzQ5MiwweDc0OTUsLyogMHg2MC0weDY3ICovCisJMHg3NEExLDB4NzUwQiwweDc1ODAsMHg3NjJGLDB4NzYyRCwweDc2MzEsMHg3NjNELDB4NzYzMywvKiAweDY4LTB4NkYgKi8KKwkweDc2M0MsMHg3NjM1LDB4NzYzMiwweDc2MzAsMHg3NkJCLDB4NzZFNiwweDc3OUEsMHg3NzlELC8qIDB4NzAtMHg3NyAqLworCTB4NzdBMSwweDc3OUMsMHg3NzlCLDB4NzdBMiwweDc3QTMsMHg3Nzk1LDB4Nzc5OSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDc3OTcsMHg3OERELDB4NzhFOSwweDc4RTUsMHg3OEVBLDB4NzhERSwweDc4RTMsLyogMHhBMC0weEE3ICovCisJMHg3OERCLDB4NzhFMSwweDc4RTIsMHg3OEVELDB4NzhERiwweDc4RTAsMHg3OUE0LDB4N0E0NCwvKiAweEE4LTB4QUYgKi8KKwkweDdBNDgsMHg3QTQ3LDB4N0FCNiwweDdBQjgsMHg3QUI1LDB4N0FCMSwweDdBQjcsMHg3QkRFLC8qIDB4QjAtMHhCNyAqLworCTB4N0JFMywweDdCRTcsMHg3QkRELDB4N0JENSwweDdCRTUsMHg3QkRBLDB4N0JFOCwweDdCRjksLyogMHhCOC0weEJGICovCisJMHg3QkQ0LDB4N0JFQSwweDdCRTIsMHg3QkRDLDB4N0JFQiwweDdCRDgsMHg3QkRGLDB4N0NEMiwvKiAweEMwLTB4QzcgKi8KKwkweDdDRDQsMHg3Q0Q3LDB4N0NEMCwweDdDRDEsMHg3RTEyLDB4N0UyMSwweDdFMTcsMHg3RTBDLC8qIDB4QzgtMHhDRiAqLworCTB4N0UxRiwweDdFMjAsMHg3RTEzLDB4N0UwRSwweDdFMUMsMHg3RTE1LDB4N0UxQSwweDdFMjIsLyogMHhEMC0weEQ3ICovCisJMHg3RTBCLDB4N0UwRiwweDdFMTYsMHg3RTBELDB4N0UxNCwweDdFMjUsMHg3RTI0LDB4N0Y0MywvKiAweEQ4LTB4REYgKi8KKwkweDdGN0IsMHg3RjdDLDB4N0Y3QSwweDdGQjEsMHg3RkVGLDB4ODAyQSwweDgwMjksMHg4MDZDLC8qIDB4RTAtMHhFNyAqLworCTB4ODFCMSwweDgxQTYsMHg4MUFFLDB4ODFCOSwweDgxQjUsMHg4MUFCLDB4ODFCMCwweDgxQUMsLyogMHhFOC0weEVGICovCisJMHg4MUI0LDB4ODFCMiwweDgxQjcsMHg4MUE3LDB4ODFGMiwweDgyNTUsMHg4MjU2LDB4ODI1NywvKiAweEYwLTB4RjcgKi8KKwkweDg1NTYsMHg4NTQ1LDB4ODU2QiwweDg1NEQsMHg4NTUzLDB4ODU2MSwweDg1NTgsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0VCWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4ODU0MCwweDg1NDYsMHg4NTY0LDB4ODU0MSwweDg1NjIsMHg4NTQ0LDB4ODU1MSwweDg1NDcsLyogMHg0MC0weDQ3ICovCisJMHg4NTYzLDB4ODUzRSwweDg1NUIsMHg4NTcxLDB4ODU0RSwweDg1NkUsMHg4NTc1LDB4ODU1NSwvKiAweDQ4LTB4NEYgKi8KKwkweDg1NjcsMHg4NTYwLDB4ODU4QywweDg1NjYsMHg4NTVELDB4ODU1NCwweDg1NjUsMHg4NTZDLC8qIDB4NTAtMHg1NyAqLworCTB4ODY2MywweDg2NjUsMHg4NjY0LDB4ODc5QiwweDg3OEYsMHg4Nzk3LDB4ODc5MywweDg3OTIsLyogMHg1OC0weDVGICovCisJMHg4Nzg4LDB4ODc4MSwweDg3OTYsMHg4Nzk4LDB4ODc3OSwweDg3ODcsMHg4N0EzLDB4ODc4NSwvKiAweDYwLTB4NjcgKi8KKwkweDg3OTAsMHg4NzkxLDB4ODc5RCwweDg3ODQsMHg4Nzk0LDB4ODc5QywweDg3OUEsMHg4Nzg5LC8qIDB4NjgtMHg2RiAqLworCTB4ODkxRSwweDg5MjYsMHg4OTMwLDB4ODkyRCwweDg5MkUsMHg4OTI3LDB4ODkzMSwweDg5MjIsLyogMHg3MC0weDc3ICovCisJMHg4OTI5LDB4ODkyMywweDg5MkYsMHg4OTJDLDB4ODkxRiwweDg5RjEsMHg4QUUwLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4OEFFMiwweDhBRjIsMHg4QUY0LDB4OEFGNSwweDhBREQsMHg4QjE0LDB4OEFFNCwvKiAweEEwLTB4QTcgKi8KKwkweDhBREYsMHg4QUYwLDB4OEFDOCwweDhBREUsMHg4QUUxLDB4OEFFOCwweDhBRkYsMHg4QUVGLC8qIDB4QTgtMHhBRiAqLworCTB4OEFGQiwweDhDOTEsMHg4QzkyLDB4OEM5MCwweDhDRjUsMHg4Q0VFLDB4OENGMSwweDhDRjAsLyogMHhCMC0weEI3ICovCisJMHg4Q0YzLDB4OEQ2QywweDhENkUsMHg4REE1LDB4OERBNywweDhFMzMsMHg4RTNFLDB4OEUzOCwvKiAweEI4LTB4QkYgKi8KKwkweDhFNDAsMHg4RTQ1LDB4OEUzNiwweDhFM0MsMHg4RTNELDB4OEU0MSwweDhFMzAsMHg4RTNGLC8qIDB4QzAtMHhDNyAqLworCTB4OEVCRCwweDhGMzYsMHg4RjJFLDB4OEYzNSwweDhGMzIsMHg4RjM5LDB4OEYzNywweDhGMzQsLyogMHhDOC0weENGICovCisJMHg5MDc2LDB4OTA3OSwweDkwN0IsMHg5MDg2LDB4OTBGQSwweDkxMzMsMHg5MTM1LDB4OTEzNiwvKiAweEQwLTB4RDcgKi8KKwkweDkxOTMsMHg5MTkwLDB4OTE5MSwweDkxOEQsMHg5MThGLDB4OTMyNywweDkzMUUsMHg5MzA4LC8qIDB4RDgtMHhERiAqLworCTB4OTMxRiwweDkzMDYsMHg5MzBGLDB4OTM3QSwweDkzMzgsMHg5MzNDLDB4OTMxQiwweDkzMjMsLyogMHhFMC0weEU3ICovCisJMHg5MzEyLDB4OTMwMSwweDkzNDYsMHg5MzJELDB4OTMwRSwweDkzMEQsMHg5MkNCLDB4OTMxRCwvKiAweEU4LTB4RUYgKi8KKwkweDkyRkEsMHg5MzI1LDB4OTMxMywweDkyRjksMHg5MkY3LDB4OTMzNCwweDkzMDIsMHg5MzI0LC8qIDB4RjAtMHhGNyAqLworCTB4OTJGRiwweDkzMjksMHg5MzM5LDB4OTMzNSwweDkzMkEsMHg5MzE0LDB4OTMwQywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRUNbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5MzBCLDB4OTJGRSwweDkzMDksMHg5MzAwLDB4OTJGQiwweDkzMTYsMHg5NUJDLDB4OTVDRCwvKiAweDQwLTB4NDcgKi8KKwkweDk1QkUsMHg5NUI5LDB4OTVCQSwweDk1QjYsMHg5NUJGLDB4OTVCNSwweDk1QkQsMHg5NkE5LC8qIDB4NDgtMHg0RiAqLworCTB4OTZENCwweDk3MEIsMHg5NzEyLDB4OTcxMCwweDk3OTksMHg5Nzk3LDB4OTc5NCwweDk3RjAsLyogMHg1MC0weDU3ICovCisJMHg5N0Y4LDB4OTgzNSwweDk4MkYsMHg5ODMyLDB4OTkyNCwweDk5MUYsMHg5OTI3LDB4OTkyOSwvKiAweDU4LTB4NUYgKi8KKwkweDk5OUUsMHg5OUVFLDB4OTlFQywweDk5RTUsMHg5OUU0LDB4OTlGMCwweDk5RTMsMHg5OUVBLC8qIDB4NjAtMHg2NyAqLworCTB4OTlFOSwweDk5RTcsMHg5QUI5LDB4OUFCRiwweDlBQjQsMHg5QUJCLDB4OUFGNiwweDlBRkEsLyogMHg2OC0weDZGICovCisJMHg5QUY5LDB4OUFGNywweDlCMzMsMHg5QjgwLDB4OUI4NSwweDlCODcsMHg5QjdDLDB4OUI3RSwvKiAweDcwLTB4NzcgKi8KKwkweDlCN0IsMHg5QjgyLDB4OUI5MywweDlCOTIsMHg5QjkwLDB4OUI3QSwweDlCOTUsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg5QjdELDB4OUI4OCwweDlEMjUsMHg5RDE3LDB4OUQyMCwweDlEMUUsMHg5RDE0LC8qIDB4QTAtMHhBNyAqLworCTB4OUQyOSwweDlEMUQsMHg5RDE4LDB4OUQyMiwweDlEMTAsMHg5RDE5LDB4OUQxRiwweDlFODgsLyogMHhBOC0weEFGICovCisJMHg5RTg2LDB4OUU4NywweDlFQUUsMHg5RUFELDB4OUVENSwweDlFRDYsMHg5RUZBLDB4OUYxMiwvKiAweEIwLTB4QjcgKi8KKwkweDlGM0QsMHg1MTI2LDB4NTEyNSwweDUxMjIsMHg1MTI0LDB4NTEyMCwweDUxMjksMHg1MkY0LC8qIDB4QjgtMHhCRiAqLworCTB4NTY5MywweDU2OEMsMHg1NjhELDB4NTY4NiwweDU2ODQsMHg1NjgzLDB4NTY3RSwweDU2ODIsLyogMHhDMC0weEM3ICovCisJMHg1NjdGLDB4NTY4MSwweDU4RDYsMHg1OEQ0LDB4NThDRiwweDU4RDIsMHg1QjJELDB4NUIyNSwvKiAweEM4LTB4Q0YgKi8KKwkweDVCMzIsMHg1QjIzLDB4NUIyQywweDVCMjcsMHg1QjI2LDB4NUIyRiwweDVCMkUsMHg1QjdCLC8qIDB4RDAtMHhENyAqLworCTB4NUJGMSwweDVCRjIsMHg1REI3LDB4NUU2QywweDVFNkEsMHg1RkJFLDB4NUZCQiwweDYxQzMsLyogMHhEOC0weERGICovCisJMHg2MUI1LDB4NjFCQywweDYxRTcsMHg2MUUwLDB4NjFFNSwweDYxRTQsMHg2MUU4LDB4NjFERSwvKiAweEUwLTB4RTcgKi8KKwkweDY0RUYsMHg2NEU5LDB4NjRFMywweDY0RUIsMHg2NEU0LDB4NjRFOCwweDY1ODEsMHg2NTgwLC8qIDB4RTgtMHhFRiAqLworCTB4NjVCNiwweDY1REEsMHg2NkQyLDB4NkE4RCwweDZBOTYsMHg2QTgxLDB4NkFBNSwweDZBODksLyogMHhGMC0weEY3ICovCisJMHg2QTlGLDB4NkE5QiwweDZBQTEsMHg2QTlFLDB4NkE4NywweDZBOTMsMHg2QThFLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9FRFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDZBOTUsMHg2QTgzLDB4NkFBOCwweDZBQTQsMHg2QTkxLDB4NkE3RiwweDZBQTYsMHg2QTlBLC8qIDB4NDAtMHg0NyAqLworCTB4NkE4NSwweDZBOEMsMHg2QTkyLDB4NkI1QiwweDZCQUQsMHg2QzA5LDB4NkZDQywweDZGQTksLyogMHg0OC0weDRGICovCisJMHg2RkY0LDB4NkZENCwweDZGRTMsMHg2RkRDLDB4NkZFRCwweDZGRTcsMHg2RkU2LDB4NkZERSwvKiAweDUwLTB4NTcgKi8KKwkweDZGRjIsMHg2RkRELDB4NkZFMiwweDZGRTgsMHg3MUUxLDB4NzFGMSwweDcxRTgsMHg3MUYyLC8qIDB4NTgtMHg1RiAqLworCTB4NzFFNCwweDcxRjAsMHg3MUUyLDB4NzM3MywweDczNkUsMHg3MzZGLDB4NzQ5NywweDc0QjIsLyogMHg2MC0weDY3ICovCisJMHg3NEFCLDB4NzQ5MCwweDc0QUEsMHg3NEFELDB4NzRCMSwweDc0QTUsMHg3NEFGLDB4NzUxMCwvKiAweDY4LTB4NkYgKi8KKwkweDc1MTEsMHg3NTEyLDB4NzUwRiwweDc1ODQsMHg3NjQzLDB4NzY0OCwweDc2NDksMHg3NjQ3LC8qIDB4NzAtMHg3NyAqLworCTB4NzZBNCwweDc2RTksMHg3N0I1LDB4NzdBQiwweDc3QjIsMHg3N0I3LDB4NzdCNiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDc3QjQsMHg3N0IxLDB4NzdBOCwweDc3RjAsMHg3OEYzLDB4NzhGRCwweDc5MDIsLyogMHhBMC0weEE3ICovCisJMHg3OEZCLDB4NzhGQywweDc4RjIsMHg3OTA1LDB4NzhGOSwweDc4RkUsMHg3OTA0LDB4NzlBQiwvKiAweEE4LTB4QUYgKi8KKwkweDc5QTgsMHg3QTVDLDB4N0E1QiwweDdBNTYsMHg3QTU4LDB4N0E1NCwweDdBNUEsMHg3QUJFLC8qIDB4QjAtMHhCNyAqLworCTB4N0FDMCwweDdBQzEsMHg3QzA1LDB4N0MwRiwweDdCRjIsMHg3QzAwLDB4N0JGRiwweDdCRkIsLyogMHhCOC0weEJGICovCisJMHg3QzBFLDB4N0JGNCwweDdDMEIsMHg3QkYzLDB4N0MwMiwweDdDMDksMHg3QzAzLDB4N0MwMSwvKiAweEMwLTB4QzcgKi8KKwkweDdCRjgsMHg3QkZELDB4N0MwNiwweDdCRjAsMHg3QkYxLDB4N0MxMCwweDdDMEEsMHg3Q0U4LC8qIDB4QzgtMHhDRiAqLworCTB4N0UyRCwweDdFM0MsMHg3RTQyLDB4N0UzMywweDk4NDgsMHg3RTM4LDB4N0UyQSwweDdFNDksLyogMHhEMC0weEQ3ICovCisJMHg3RTQwLDB4N0U0NywweDdFMjksMHg3RTRDLDB4N0UzMCwweDdFM0IsMHg3RTM2LDB4N0U0NCwvKiAweEQ4LTB4REYgKi8KKwkweDdFM0EsMHg3RjQ1LDB4N0Y3RiwweDdGN0UsMHg3RjdELDB4N0ZGNCwweDdGRjIsMHg4MDJDLC8qIDB4RTAtMHhFNyAqLworCTB4ODFCQiwweDgxQzQsMHg4MUNDLDB4ODFDQSwweDgxQzUsMHg4MUM3LDB4ODFCQywweDgxRTksLyogMHhFOC0weEVGICovCisJMHg4MjVCLDB4ODI1QSwweDgyNUMsMHg4NTgzLDB4ODU4MCwweDg1OEYsMHg4NUE3LDB4ODU5NSwvKiAweEYwLTB4RjcgKi8KKwkweDg1QTAsMHg4NThCLDB4ODVBMywweDg1N0IsMHg4NUE0LDB4ODU5QSwweDg1OUUsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0VFWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4ODU3NywweDg1N0MsMHg4NTg5LDB4ODVBMSwweDg1N0EsMHg4NTc4LDB4ODU1NywweDg1OEUsLyogMHg0MC0weDQ3ICovCisJMHg4NTk2LDB4ODU4NiwweDg1OEQsMHg4NTk5LDB4ODU5RCwweDg1ODEsMHg4NUEyLDB4ODU4MiwvKiAweDQ4LTB4NEYgKi8KKwkweDg1ODgsMHg4NTg1LDB4ODU3OSwweDg1NzYsMHg4NTk4LDB4ODU5MCwweDg1OUYsMHg4NjY4LC8qIDB4NTAtMHg1NyAqLworCTB4ODdCRSwweDg3QUEsMHg4N0FELDB4ODdDNSwweDg3QjAsMHg4N0FDLDB4ODdCOSwweDg3QjUsLyogMHg1OC0weDVGICovCisJMHg4N0JDLDB4ODdBRSwweDg3QzksMHg4N0MzLDB4ODdDMiwweDg3Q0MsMHg4N0I3LDB4ODdBRiwvKiAweDYwLTB4NjcgKi8KKwkweDg3QzQsMHg4N0NBLDB4ODdCNCwweDg3QjYsMHg4N0JGLDB4ODdCOCwweDg3QkQsMHg4N0RFLC8qIDB4NjgtMHg2RiAqLworCTB4ODdCMiwweDg5MzUsMHg4OTMzLDB4ODkzQywweDg5M0UsMHg4OTQxLDB4ODk1MiwweDg5MzcsLyogMHg3MC0weDc3ICovCisJMHg4OTQyLDB4ODlBRCwweDg5QUYsMHg4OUFFLDB4ODlGMiwweDg5RjMsMHg4QjFFLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4OEIxOCwweDhCMTYsMHg4QjExLDB4OEIwNSwweDhCMEIsMHg4QjIyLDB4OEIwRiwvKiAweEEwLTB4QTcgKi8KKwkweDhCMTIsMHg4QjE1LDB4OEIwNywweDhCMEQsMHg4QjA4LDB4OEIwNiwweDhCMUMsMHg4QjEzLC8qIDB4QTgtMHhBRiAqLworCTB4OEIxQSwweDhDNEYsMHg4QzcwLDB4OEM3MiwweDhDNzEsMHg4QzZGLDB4OEM5NSwweDhDOTQsLyogMHhCMC0weEI3ICovCisJMHg4Q0Y5LDB4OEQ2RiwweDhFNEUsMHg4RTRELDB4OEU1MywweDhFNTAsMHg4RTRDLDB4OEU0NywvKiAweEI4LTB4QkYgKi8KKwkweDhGNDMsMHg4RjQwLDB4OTA4NSwweDkwN0UsMHg5MTM4LDB4OTE5QSwweDkxQTIsMHg5MTlCLC8qIDB4QzAtMHhDNyAqLworCTB4OTE5OSwweDkxOUYsMHg5MUExLDB4OTE5RCwweDkxQTAsMHg5M0ExLDB4OTM4MywweDkzQUYsLyogMHhDOC0weENGICovCisJMHg5MzY0LDB4OTM1NiwweDkzNDcsMHg5MzdDLDB4OTM1OCwweDkzNUMsMHg5Mzc2LDB4OTM0OSwvKiAweEQwLTB4RDcgKi8KKwkweDkzNTAsMHg5MzUxLDB4OTM2MCwweDkzNkQsMHg5MzhGLDB4OTM0QywweDkzNkEsMHg5Mzc5LC8qIDB4RDgtMHhERiAqLworCTB4OTM1NywweDkzNTUsMHg5MzUyLDB4OTM0RiwweDkzNzEsMHg5Mzc3LDB4OTM3QiwweDkzNjEsLyogMHhFMC0weEU3ICovCisJMHg5MzVFLDB4OTM2MywweDkzNjcsMHg5MzgwLDB4OTM0RSwweDkzNTksMHg5NUM3LDB4OTVDMCwvKiAweEU4LTB4RUYgKi8KKwkweDk1QzksMHg5NUMzLDB4OTVDNSwweDk1QjcsMHg5NkFFLDB4OTZCMCwweDk2QUMsMHg5NzIwLC8qIDB4RjAtMHhGNyAqLworCTB4OTcxRiwweDk3MTgsMHg5NzFELDB4OTcxOSwweDk3OUEsMHg5N0ExLDB4OTc5QywweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRUZbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5NzlFLDB4OTc5RCwweDk3RDUsMHg5N0Q0LDB4OTdGMSwweDk4NDEsMHg5ODQ0LDB4OTg0QSwvKiAweDQwLTB4NDcgKi8KKwkweDk4NDksMHg5ODQ1LDB4OTg0MywweDk5MjUsMHg5OTJCLDB4OTkyQywweDk5MkEsMHg5OTMzLC8qIDB4NDgtMHg0RiAqLworCTB4OTkzMiwweDk5MkYsMHg5OTJELDB4OTkzMSwweDk5MzAsMHg5OTk4LDB4OTlBMywweDk5QTEsLyogMHg1MC0weDU3ICovCisJMHg5QTAyLDB4OTlGQSwweDk5RjQsMHg5OUY3LDB4OTlGOSwweDk5RjgsMHg5OUY2LDB4OTlGQiwvKiAweDU4LTB4NUYgKi8KKwkweDk5RkQsMHg5OUZFLDB4OTlGQywweDlBMDMsMHg5QUJFLDB4OUFGRSwweDlBRkQsMHg5QjAxLC8qIDB4NjAtMHg2NyAqLworCTB4OUFGQywweDlCNDgsMHg5QjlBLDB4OUJBOCwweDlCOUUsMHg5QjlCLDB4OUJBNiwweDlCQTEsLyogMHg2OC0weDZGICovCisJMHg5QkE1LDB4OUJBNCwweDlCODYsMHg5QkEyLDB4OUJBMCwweDlCQUYsMHg5RDMzLDB4OUQ0MSwvKiAweDcwLTB4NzcgKi8KKwkweDlENjcsMHg5RDM2LDB4OUQyRSwweDlEMkYsMHg5RDMxLDB4OUQzOCwweDlEMzAsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg5RDQ1LDB4OUQ0MiwweDlENDMsMHg5RDNFLDB4OUQzNywweDlENDAsMHg5RDNELC8qIDB4QTAtMHhBNyAqLworCTB4N0ZGNSwweDlEMkQsMHg5RThBLDB4OUU4OSwweDlFOEQsMHg5RUIwLDB4OUVDOCwweDlFREEsLyogMHhBOC0weEFGICovCisJMHg5RUZCLDB4OUVGRiwweDlGMjQsMHg5RjIzLDB4OUYyMiwweDlGNTQsMHg5RkEwLDB4NTEzMSwvKiAweEIwLTB4QjcgKi8KKwkweDUxMkQsMHg1MTJFLDB4NTY5OCwweDU2OUMsMHg1Njk3LDB4NTY5QSwweDU2OUQsMHg1Njk5LC8qIDB4QjgtMHhCRiAqLworCTB4NTk3MCwweDVCM0MsMHg1QzY5LDB4NUM2QSwweDVEQzAsMHg1RTZELDB4NUU2RSwweDYxRDgsLyogMHhDMC0weEM3ICovCisJMHg2MURGLDB4NjFFRCwweDYxRUUsMHg2MUYxLDB4NjFFQSwweDYxRjAsMHg2MUVCLDB4NjFENiwvKiAweEM4LTB4Q0YgKi8KKwkweDYxRTksMHg2NEZGLDB4NjUwNCwweDY0RkQsMHg2NEY4LDB4NjUwMSwweDY1MDMsMHg2NEZDLC8qIDB4RDAtMHhENyAqLworCTB4NjU5NCwweDY1REIsMHg2NkRBLDB4NjZEQiwweDY2RDgsMHg2QUM1LDB4NkFCOSwweDZBQkQsLyogMHhEOC0weERGICovCisJMHg2QUUxLDB4NkFDNiwweDZBQkEsMHg2QUI2LDB4NkFCNywweDZBQzcsMHg2QUI0LDB4NkFBRCwvKiAweEUwLTB4RTcgKi8KKwkweDZCNUUsMHg2QkM5LDB4NkMwQiwweDcwMDcsMHg3MDBDLDB4NzAwRCwweDcwMDEsMHg3MDA1LC8qIDB4RTgtMHhFRiAqLworCTB4NzAxNCwweDcwMEUsMHg2RkZGLDB4NzAwMCwweDZGRkIsMHg3MDI2LDB4NkZGQywweDZGRjcsLyogMHhGMC0weEY3ICovCisJMHg3MDBBLDB4NzIwMSwweDcxRkYsMHg3MUY5LDB4NzIwMywweDcxRkQsMHg3Mzc2LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9GMFsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDc0QjgsMHg3NEMwLDB4NzRCNSwweDc0QzEsMHg3NEJFLDB4NzRCNiwweDc0QkIsMHg3NEMyLC8qIDB4NDAtMHg0NyAqLworCTB4NzUxNCwweDc1MTMsMHg3NjVDLDB4NzY2NCwweDc2NTksMHg3NjUwLDB4NzY1MywweDc2NTcsLyogMHg0OC0weDRGICovCisJMHg3NjVBLDB4NzZBNiwweDc2QkQsMHg3NkVDLDB4NzdDMiwweDc3QkEsMHg3OEZGLDB4NzkwQywvKiAweDUwLTB4NTcgKi8KKwkweDc5MTMsMHg3OTE0LDB4NzkwOSwweDc5MTAsMHg3OTEyLDB4NzkxMSwweDc5QUQsMHg3OUFDLC8qIDB4NTgtMHg1RiAqLworCTB4N0E1RiwweDdDMUMsMHg3QzI5LDB4N0MxOSwweDdDMjAsMHg3QzFGLDB4N0MyRCwweDdDMUQsLyogMHg2MC0weDY3ICovCisJMHg3QzI2LDB4N0MyOCwweDdDMjIsMHg3QzI1LDB4N0MzMCwweDdFNUMsMHg3RTUwLDB4N0U1NiwvKiAweDY4LTB4NkYgKi8KKwkweDdFNjMsMHg3RTU4LDB4N0U2MiwweDdFNUYsMHg3RTUxLDB4N0U2MCwweDdFNTcsMHg3RTUzLC8qIDB4NzAtMHg3NyAqLworCTB4N0ZCNSwweDdGQjMsMHg3RkY3LDB4N0ZGOCwweDgwNzUsMHg4MUQxLDB4ODFEMiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDgxRDAsMHg4MjVGLDB4ODI1RSwweDg1QjQsMHg4NUM2LDB4ODVDMCwweDg1QzMsLyogMHhBMC0weEE3ICovCisJMHg4NUMyLDB4ODVCMywweDg1QjUsMHg4NUJELDB4ODVDNywweDg1QzQsMHg4NUJGLDB4ODVDQiwvKiAweEE4LTB4QUYgKi8KKwkweDg1Q0UsMHg4NUM4LDB4ODVDNSwweDg1QjEsMHg4NUI2LDB4ODVEMiwweDg2MjQsMHg4NUI4LC8qIDB4QjAtMHhCNyAqLworCTB4ODVCNywweDg1QkUsMHg4NjY5LDB4ODdFNywweDg3RTYsMHg4N0UyLDB4ODdEQiwweDg3RUIsLyogMHhCOC0weEJGICovCisJMHg4N0VBLDB4ODdFNSwweDg3REYsMHg4N0YzLDB4ODdFNCwweDg3RDQsMHg4N0RDLDB4ODdEMywvKiAweEMwLTB4QzcgKi8KKwkweDg3RUQsMHg4N0Q4LDB4ODdFMywweDg3QTQsMHg4N0Q3LDB4ODdEOSwweDg4MDEsMHg4N0Y0LC8qIDB4QzgtMHhDRiAqLworCTB4ODdFOCwweDg3REQsMHg4OTUzLDB4ODk0QiwweDg5NEYsMHg4OTRDLDB4ODk0NiwweDg5NTAsLyogMHhEMC0weEQ3ICovCisJMHg4OTUxLDB4ODk0OSwweDhCMkEsMHg4QjI3LDB4OEIyMywweDhCMzMsMHg4QjMwLDB4OEIzNSwvKiAweEQ4LTB4REYgKi8KKwkweDhCNDcsMHg4QjJGLDB4OEIzQywweDhCM0UsMHg4QjMxLDB4OEIyNSwweDhCMzcsMHg4QjI2LC8qIDB4RTAtMHhFNyAqLworCTB4OEIzNiwweDhCMkUsMHg4QjI0LDB4OEIzQiwweDhCM0QsMHg4QjNBLDB4OEM0MiwweDhDNzUsLyogMHhFOC0weEVGICovCisJMHg4Qzk5LDB4OEM5OCwweDhDOTcsMHg4Q0ZFLDB4OEQwNCwweDhEMDIsMHg4RDAwLDB4OEU1QywvKiAweEYwLTB4RjcgKi8KKwkweDhFNjIsMHg4RTYwLDB4OEU1NywweDhFNTYsMHg4RTVFLDB4OEU2NSwweDhFNjcsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0YxWzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4OEU1QiwweDhFNUEsMHg4RTYxLDB4OEU1RCwweDhFNjksMHg4RTU0LDB4OEY0NiwweDhGNDcsLyogMHg0MC0weDQ3ICovCisJMHg4RjQ4LDB4OEY0QiwweDkxMjgsMHg5MTNBLDB4OTEzQiwweDkxM0UsMHg5MUE4LDB4OTFBNSwvKiAweDQ4LTB4NEYgKi8KKwkweDkxQTcsMHg5MUFGLDB4OTFBQSwweDkzQjUsMHg5MzhDLDB4OTM5MiwweDkzQjcsMHg5MzlCLC8qIDB4NTAtMHg1NyAqLworCTB4OTM5RCwweDkzODksMHg5M0E3LDB4OTM4RSwweDkzQUEsMHg5MzlFLDB4OTNBNiwweDkzOTUsLyogMHg1OC0weDVGICovCisJMHg5Mzg4LDB4OTM5OSwweDkzOUYsMHg5MzhELDB4OTNCMSwweDkzOTEsMHg5M0IyLDB4OTNBNCwvKiAweDYwLTB4NjcgKi8KKwkweDkzQTgsMHg5M0I0LDB4OTNBMywweDkzQTUsMHg5NUQyLDB4OTVEMywweDk1RDEsMHg5NkIzLC8qIDB4NjgtMHg2RiAqLworCTB4OTZENywweDk2REEsMHg1REMyLDB4OTZERiwweDk2RDgsMHg5NkRELDB4OTcyMywweDk3MjIsLyogMHg3MC0weDc3ICovCisJMHg5NzI1LDB4OTdBQywweDk3QUUsMHg5N0E4LDB4OTdBQiwweDk3QTQsMHg5N0FBLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4OTdBMiwweDk3QTUsMHg5N0Q3LDB4OTdEOSwweDk3RDYsMHg5N0Q4LDB4OTdGQSwvKiAweEEwLTB4QTcgKi8KKwkweDk4NTAsMHg5ODUxLDB4OTg1MiwweDk4QjgsMHg5OTQxLDB4OTkzQywweDk5M0EsMHg5QTBGLC8qIDB4QTgtMHhBRiAqLworCTB4OUEwQiwweDlBMDksMHg5QTBELDB4OUEwNCwweDlBMTEsMHg5QTBBLDB4OUEwNSwweDlBMDcsLyogMHhCMC0weEI3ICovCisJMHg5QTA2LDB4OUFDMCwweDlBREMsMHg5QjA4LDB4OUIwNCwweDlCMDUsMHg5QjI5LDB4OUIzNSwvKiAweEI4LTB4QkYgKi8KKwkweDlCNEEsMHg5QjRDLDB4OUI0QiwweDlCQzcsMHg5QkM2LDB4OUJDMywweDlCQkYsMHg5QkMxLC8qIDB4QzAtMHhDNyAqLworCTB4OUJCNSwweDlCQjgsMHg5QkQzLDB4OUJCNiwweDlCQzQsMHg5QkI5LDB4OUJCRCwweDlENUMsLyogMHhDOC0weENGICovCisJMHg5RDUzLDB4OUQ0RiwweDlENEEsMHg5RDVCLDB4OUQ0QiwweDlENTksMHg5RDU2LDB4OUQ0QywvKiAweEQwLTB4RDcgKi8KKwkweDlENTcsMHg5RDUyLDB4OUQ1NCwweDlENUYsMHg5RDU4LDB4OUQ1QSwweDlFOEUsMHg5RThDLC8qIDB4RDgtMHhERiAqLworCTB4OUVERiwweDlGMDEsMHg5RjAwLDB4OUYxNiwweDlGMjUsMHg5RjJCLDB4OUYyQSwweDlGMjksLyogMHhFMC0weEU3ICovCisJMHg5RjI4LDB4OUY0QywweDlGNTUsMHg1MTM0LDB4NTEzNSwweDUyOTYsMHg1MkY3LDB4NTNCNCwvKiAweEU4LTB4RUYgKi8KKwkweDU2QUIsMHg1NkFELDB4NTZBNiwweDU2QTcsMHg1NkFBLDB4NTZBQywweDU4REEsMHg1OERELC8qIDB4RjAtMHhGNyAqLworCTB4NThEQiwweDU5MTIsMHg1QjNELDB4NUIzRSwweDVCM0YsMHg1REMzLDB4NUU3MCwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRjJbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg1RkJGLDB4NjFGQiwweDY1MDcsMHg2NTEwLDB4NjUwRCwweDY1MDksMHg2NTBDLDB4NjUwRSwvKiAweDQwLTB4NDcgKi8KKwkweDY1ODQsMHg2NURFLDB4NjVERCwweDY2REUsMHg2QUU3LDB4NkFFMCwweDZBQ0MsMHg2QUQxLC8qIDB4NDgtMHg0RiAqLworCTB4NkFEOSwweDZBQ0IsMHg2QURGLDB4NkFEQywweDZBRDAsMHg2QUVCLDB4NkFDRiwweDZBQ0QsLyogMHg1MC0weDU3ICovCisJMHg2QURFLDB4NkI2MCwweDZCQjAsMHg2QzBDLDB4NzAxOSwweDcwMjcsMHg3MDIwLDB4NzAxNiwvKiAweDU4LTB4NUYgKi8KKwkweDcwMkIsMHg3MDIxLDB4NzAyMiwweDcwMjMsMHg3MDI5LDB4NzAxNywweDcwMjQsMHg3MDFDLC8qIDB4NjAtMHg2NyAqLworCTB4NzAyQSwweDcyMEMsMHg3MjBBLDB4NzIwNywweDcyMDIsMHg3MjA1LDB4NzJBNSwweDcyQTYsLyogMHg2OC0weDZGICovCisJMHg3MkE0LDB4NzJBMywweDcyQTEsMHg3NENCLDB4NzRDNSwweDc0QjcsMHg3NEMzLDB4NzUxNiwvKiAweDcwLTB4NzcgKi8KKwkweDc2NjAsMHg3N0M5LDB4NzdDQSwweDc3QzQsMHg3N0YxLDB4NzkxRCwweDc5MUIsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg3OTIxLDB4NzkxQywweDc5MTcsMHg3OTFFLDB4NzlCMCwweDdBNjcsMHg3QTY4LC8qIDB4QTAtMHhBNyAqLworCTB4N0MzMywweDdDM0MsMHg3QzM5LDB4N0MyQywweDdDM0IsMHg3Q0VDLDB4N0NFQSwweDdFNzYsLyogMHhBOC0weEFGICovCisJMHg3RTc1LDB4N0U3OCwweDdFNzAsMHg3RTc3LDB4N0U2RiwweDdFN0EsMHg3RTcyLDB4N0U3NCwvKiAweEIwLTB4QjcgKi8KKwkweDdFNjgsMHg3RjRCLDB4N0Y0QSwweDdGODMsMHg3Rjg2LDB4N0ZCNywweDdGRkQsMHg3RkZFLC8qIDB4QjgtMHhCRiAqLworCTB4ODA3OCwweDgxRDcsMHg4MUQ1LDB4ODI2NCwweDgyNjEsMHg4MjYzLDB4ODVFQiwweDg1RjEsLyogMHhDMC0weEM3ICovCisJMHg4NUVELDB4ODVEOSwweDg1RTEsMHg4NUU4LDB4ODVEQSwweDg1RDcsMHg4NUVDLDB4ODVGMiwvKiAweEM4LTB4Q0YgKi8KKwkweDg1RjgsMHg4NUQ4LDB4ODVERiwweDg1RTMsMHg4NURDLDB4ODVEMSwweDg1RjAsMHg4NUU2LC8qIDB4RDAtMHhENyAqLworCTB4ODVFRiwweDg1REUsMHg4NUUyLDB4ODgwMCwweDg3RkEsMHg4ODAzLDB4ODdGNiwweDg3RjcsLyogMHhEOC0weERGICovCisJMHg4ODA5LDB4ODgwQywweDg4MEIsMHg4ODA2LDB4ODdGQywweDg4MDgsMHg4N0ZGLDB4ODgwQSwvKiAweEUwLTB4RTcgKi8KKwkweDg4MDIsMHg4OTYyLDB4ODk1QSwweDg5NUIsMHg4OTU3LDB4ODk2MSwweDg5NUMsMHg4OTU4LC8qIDB4RTgtMHhFRiAqLworCTB4ODk1RCwweDg5NTksMHg4OTg4LDB4ODlCNywweDg5QjYsMHg4OUY2LDB4OEI1MCwweDhCNDgsLyogMHhGMC0weEY3ICovCisJMHg4QjRBLDB4OEI0MCwweDhCNTMsMHg4QjU2LDB4OEI1NCwweDhCNEIsMHg4QjU1LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9GM1syNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDhCNTEsMHg4QjQyLDB4OEI1MiwweDhCNTcsMHg4QzQzLDB4OEM3NywweDhDNzYsMHg4QzlBLC8qIDB4NDAtMHg0NyAqLworCTB4OEQwNiwweDhEMDcsMHg4RDA5LDB4OERBQywweDhEQUEsMHg4REFELDB4OERBQiwweDhFNkQsLyogMHg0OC0weDRGICovCisJMHg4RTc4LDB4OEU3MywweDhFNkEsMHg4RTZGLDB4OEU3QiwweDhFQzIsMHg4RjUyLDB4OEY1MSwvKiAweDUwLTB4NTcgKi8KKwkweDhGNEYsMHg4RjUwLDB4OEY1MywweDhGQjQsMHg5MTQwLDB4OTEzRiwweDkxQjAsMHg5MUFELC8qIDB4NTgtMHg1RiAqLworCTB4OTNERSwweDkzQzcsMHg5M0NGLDB4OTNDMiwweDkzREEsMHg5M0QwLDB4OTNGOSwweDkzRUMsLyogMHg2MC0weDY3ICovCisJMHg5M0NDLDB4OTNEOSwweDkzQTksMHg5M0U2LDB4OTNDQSwweDkzRDQsMHg5M0VFLDB4OTNFMywvKiAweDY4LTB4NkYgKi8KKwkweDkzRDUsMHg5M0M0LDB4OTNDRSwweDkzQzAsMHg5M0QyLDB4OTNFNywweDk1N0QsMHg5NURBLC8qIDB4NzAtMHg3NyAqLworCTB4OTVEQiwweDk2RTEsMHg5NzI5LDB4OTcyQiwweDk3MkMsMHg5NzI4LDB4OTcyNiwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDk3QjMsMHg5N0I3LDB4OTdCNiwweDk3REQsMHg5N0RFLDB4OTdERiwweDk4NUMsLyogMHhBMC0weEE3ICovCisJMHg5ODU5LDB4OTg1RCwweDk4NTcsMHg5OEJGLDB4OThCRCwweDk4QkIsMHg5OEJFLDB4OTk0OCwvKiAweEE4LTB4QUYgKi8KKwkweDk5NDcsMHg5OTQzLDB4OTlBNiwweDk5QTcsMHg5QTFBLDB4OUExNSwweDlBMjUsMHg5QTFELC8qIDB4QjAtMHhCNyAqLworCTB4OUEyNCwweDlBMUIsMHg5QTIyLDB4OUEyMCwweDlBMjcsMHg5QTIzLDB4OUExRSwweDlBMUMsLyogMHhCOC0weEJGICovCisJMHg5QTE0LDB4OUFDMiwweDlCMEIsMHg5QjBBLDB4OUIwRSwweDlCMEMsMHg5QjM3LDB4OUJFQSwvKiAweEMwLTB4QzcgKi8KKwkweDlCRUIsMHg5QkUwLDB4OUJERSwweDlCRTQsMHg5QkU2LDB4OUJFMiwweDlCRjAsMHg5QkQ0LC8qIDB4QzgtMHhDRiAqLworCTB4OUJENywweDlCRUMsMHg5QkRDLDB4OUJEOSwweDlCRTUsMHg5QkQ1LDB4OUJFMSwweDlCREEsLyogMHhEMC0weEQ3ICovCisJMHg5RDc3LDB4OUQ4MSwweDlEOEEsMHg5RDg0LDB4OUQ4OCwweDlENzEsMHg5RDgwLDB4OUQ3OCwvKiAweEQ4LTB4REYgKi8KKwkweDlEODYsMHg5RDhCLDB4OUQ4QywweDlEN0QsMHg5RDZCLDB4OUQ3NCwweDlENzUsMHg5RDcwLC8qIDB4RTAtMHhFNyAqLworCTB4OUQ2OSwweDlEODUsMHg5RDczLDB4OUQ3QiwweDlEODIsMHg5RDZGLDB4OUQ3OSwweDlEN0YsLyogMHhFOC0weEVGICovCisJMHg5RDg3LDB4OUQ2OCwweDlFOTQsMHg5RTkxLDB4OUVDMCwweDlFRkMsMHg5RjJELDB4OUY0MCwvKiAweEYwLTB4RjcgKi8KKwkweDlGNDEsMHg5RjRELDB4OUY1NiwweDlGNTcsMHg5RjU4LDB4NTMzNywweDU2QjIsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0Y0WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4NTZCNSwweDU2QjMsMHg1OEUzLDB4NUI0NSwweDVEQzYsMHg1REM3LDB4NUVFRSwweDVFRUYsLyogMHg0MC0weDQ3ICovCisJMHg1RkMwLDB4NUZDMSwweDYxRjksMHg2NTE3LDB4NjUxNiwweDY1MTUsMHg2NTEzLDB4NjVERiwvKiAweDQ4LTB4NEYgKi8KKwkweDY2RTgsMHg2NkUzLDB4NjZFNCwweDZBRjMsMHg2QUYwLDB4NkFFQSwweDZBRTgsMHg2QUY5LC8qIDB4NTAtMHg1NyAqLworCTB4NkFGMSwweDZBRUUsMHg2QUVGLDB4NzAzQywweDcwMzUsMHg3MDJGLDB4NzAzNywweDcwMzQsLyogMHg1OC0weDVGICovCisJMHg3MDMxLDB4NzA0MiwweDcwMzgsMHg3MDNGLDB4NzAzQSwweDcwMzksMHg3MDQwLDB4NzAzQiwvKiAweDYwLTB4NjcgKi8KKwkweDcwMzMsMHg3MDQxLDB4NzIxMywweDcyMTQsMHg3MkE4LDB4NzM3RCwweDczN0MsMHg3NEJBLC8qIDB4NjgtMHg2RiAqLworCTB4NzZBQiwweDc2QUEsMHg3NkJFLDB4NzZFRCwweDc3Q0MsMHg3N0NFLDB4NzdDRiwweDc3Q0QsLyogMHg3MC0weDc3ICovCisJMHg3N0YyLDB4NzkyNSwweDc5MjMsMHg3OTI3LDB4NzkyOCwweDc5MjQsMHg3OTI5LDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4NzlCMiwweDdBNkUsMHg3QTZDLDB4N0E2RCwweDdBRjcsMHg3QzQ5LDB4N0M0OCwvKiAweEEwLTB4QTcgKi8KKwkweDdDNEEsMHg3QzQ3LDB4N0M0NSwweDdDRUUsMHg3RTdCLDB4N0U3RSwweDdFODEsMHg3RTgwLC8qIDB4QTgtMHhBRiAqLworCTB4N0ZCQSwweDdGRkYsMHg4MDc5LDB4ODFEQiwweDgxRDksMHg4MjBCLDB4ODI2OCwweDgyNjksLyogMHhCMC0weEI3ICovCisJMHg4NjIyLDB4ODVGRiwweDg2MDEsMHg4NUZFLDB4ODYxQiwweDg2MDAsMHg4NUY2LDB4ODYwNCwvKiAweEI4LTB4QkYgKi8KKwkweDg2MDksMHg4NjA1LDB4ODYwQywweDg1RkQsMHg4ODE5LDB4ODgxMCwweDg4MTEsMHg4ODE3LC8qIDB4QzAtMHhDNyAqLworCTB4ODgxMywweDg4MTYsMHg4OTYzLDB4ODk2NiwweDg5QjksMHg4OUY3LDB4OEI2MCwweDhCNkEsLyogMHhDOC0weENGICovCisJMHg4QjVELDB4OEI2OCwweDhCNjMsMHg4QjY1LDB4OEI2NywweDhCNkQsMHg4REFFLDB4OEU4NiwvKiAweEQwLTB4RDcgKi8KKwkweDhFODgsMHg4RTg0LDB4OEY1OSwweDhGNTYsMHg4RjU3LDB4OEY1NSwweDhGNTgsMHg4RjVBLC8qIDB4RDgtMHhERiAqLworCTB4OTA4RCwweDkxNDMsMHg5MTQxLDB4OTFCNywweDkxQjUsMHg5MUIyLDB4OTFCMywweDk0MEIsLyogMHhFMC0weEU3ICovCisJMHg5NDEzLDB4OTNGQiwweDk0MjAsMHg5NDBGLDB4OTQxNCwweDkzRkUsMHg5NDE1LDB4OTQxMCwvKiAweEU4LTB4RUYgKi8KKwkweDk0MjgsMHg5NDE5LDB4OTQwRCwweDkzRjUsMHg5NDAwLDB4OTNGNywweDk0MDcsMHg5NDBFLC8qIDB4RjAtMHhGNyAqLworCTB4OTQxNiwweDk0MTIsMHg5M0ZBLDB4OTQwOSwweDkzRjgsMHg5NDBBLDB4OTNGRiwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRjVbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg5M0ZDLDB4OTQwQywweDkzRjYsMHg5NDExLDB4OTQwNiwweDk1REUsMHg5NUUwLDB4OTVERiwvKiAweDQwLTB4NDcgKi8KKwkweDk3MkUsMHg5NzJGLDB4OTdCOSwweDk3QkIsMHg5N0ZELDB4OTdGRSwweDk4NjAsMHg5ODYyLC8qIDB4NDgtMHg0RiAqLworCTB4OTg2MywweDk4NUYsMHg5OEMxLDB4OThDMiwweDk5NTAsMHg5OTRFLDB4OTk1OSwweDk5NEMsLyogMHg1MC0weDU3ICovCisJMHg5OTRCLDB4OTk1MywweDlBMzIsMHg5QTM0LDB4OUEzMSwweDlBMkMsMHg5QTJBLDB4OUEzNiwvKiAweDU4LTB4NUYgKi8KKwkweDlBMjksMHg5QTJFLDB4OUEzOCwweDlBMkQsMHg5QUM3LDB4OUFDQSwweDlBQzYsMHg5QjEwLC8qIDB4NjAtMHg2NyAqLworCTB4OUIxMiwweDlCMTEsMHg5QzBCLDB4OUMwOCwweDlCRjcsMHg5QzA1LDB4OUMxMiwweDlCRjgsLyogMHg2OC0weDZGICovCisJMHg5QzQwLDB4OUMwNywweDlDMEUsMHg5QzA2LDB4OUMxNywweDlDMTQsMHg5QzA5LDB4OUQ5RiwvKiAweDcwLTB4NzcgKi8KKwkweDlEOTksMHg5REE0LDB4OUQ5RCwweDlEOTIsMHg5RDk4LDB4OUQ5MCwweDlEOUIsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg5REEwLDB4OUQ5NCwweDlEOUMsMHg5REFBLDB4OUQ5NywweDlEQTEsMHg5RDlBLC8qIDB4QTAtMHhBNyAqLworCTB4OURBMiwweDlEQTgsMHg5RDlFLDB4OURBMywweDlEQkYsMHg5REE5LDB4OUQ5NiwweDlEQTYsLyogMHhBOC0weEFGICovCisJMHg5REE3LDB4OUU5OSwweDlFOUIsMHg5RTlBLDB4OUVFNSwweDlFRTQsMHg5RUU3LDB4OUVFNiwvKiAweEIwLTB4QjcgKi8KKwkweDlGMzAsMHg5RjJFLDB4OUY1QiwweDlGNjAsMHg5RjVFLDB4OUY1RCwweDlGNTksMHg5RjkxLC8qIDB4QjgtMHhCRiAqLworCTB4NTEzQSwweDUxMzksMHg1Mjk4LDB4NTI5NywweDU2QzMsMHg1NkJELDB4NTZCRSwweDVCNDgsLyogMHhDMC0weEM3ICovCisJMHg1QjQ3LDB4NURDQiwweDVEQ0YsMHg1RUYxLDB4NjFGRCwweDY1MUIsMHg2QjAyLDB4NkFGQywvKiAweEM4LTB4Q0YgKi8KKwkweDZCMDMsMHg2QUY4LDB4NkIwMCwweDcwNDMsMHg3MDQ0LDB4NzA0QSwweDcwNDgsMHg3MDQ5LC8qIDB4RDAtMHhENyAqLworCTB4NzA0NSwweDcwNDYsMHg3MjFELDB4NzIxQSwweDcyMTksMHg3MzdFLDB4NzUxNywweDc2NkEsLyogMHhEOC0weERGICovCisJMHg3N0QwLDB4NzkyRCwweDc5MzEsMHg3OTJGLDB4N0M1NCwweDdDNTMsMHg3Q0YyLDB4N0U4QSwvKiAweEUwLTB4RTcgKi8KKwkweDdFODcsMHg3RTg4LDB4N0U4QiwweDdFODYsMHg3RThELDB4N0Y0RCwweDdGQkIsMHg4MDMwLC8qIDB4RTgtMHhFRiAqLworCTB4ODFERCwweDg2MTgsMHg4NjJBLDB4ODYyNiwweDg2MUYsMHg4NjIzLDB4ODYxQywweDg2MTksLyogMHhGMC0weEY3ICovCisJMHg4NjI3LDB4ODYyRSwweDg2MjEsMHg4NjIwLDB4ODYyOSwweDg2MUUsMHg4NjI1LDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9GNlsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDg4MjksMHg4ODFELDB4ODgxQiwweDg4MjAsMHg4ODI0LDB4ODgxQywweDg4MkIsMHg4ODRBLC8qIDB4NDAtMHg0NyAqLworCTB4ODk2RCwweDg5NjksMHg4OTZFLDB4ODk2QiwweDg5RkEsMHg4Qjc5LDB4OEI3OCwweDhCNDUsLyogMHg0OC0weDRGICovCisJMHg4QjdBLDB4OEI3QiwweDhEMTAsMHg4RDE0LDB4OERBRiwweDhFOEUsMHg4RThDLDB4OEY1RSwvKiAweDUwLTB4NTcgKi8KKwkweDhGNUIsMHg4RjVELDB4OTE0NiwweDkxNDQsMHg5MTQ1LDB4OTFCOSwweDk0M0YsMHg5NDNCLC8qIDB4NTgtMHg1RiAqLworCTB4OTQzNiwweDk0MjksMHg5NDNELDB4OTQzQywweDk0MzAsMHg5NDM5LDB4OTQyQSwweDk0MzcsLyogMHg2MC0weDY3ICovCisJMHg5NDJDLDB4OTQ0MCwweDk0MzEsMHg5NUU1LDB4OTVFNCwweDk1RTMsMHg5NzM1LDB4OTczQSwvKiAweDY4LTB4NkYgKi8KKwkweDk3QkYsMHg5N0UxLDB4OTg2NCwweDk4QzksMHg5OEM2LDB4OThDMCwweDk5NTgsMHg5OTU2LC8qIDB4NzAtMHg3NyAqLworCTB4OUEzOSwweDlBM0QsMHg5QTQ2LDB4OUE0NCwweDlBNDIsMHg5QTQxLDB4OUEzQSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDlBM0YsMHg5QUNELDB4OUIxNSwweDlCMTcsMHg5QjE4LDB4OUIxNiwweDlCM0EsLyogMHhBMC0weEE3ICovCisJMHg5QjUyLDB4OUMyQiwweDlDMUQsMHg5QzFDLDB4OUMyQywweDlDMjMsMHg5QzI4LDB4OUMyOSwvKiAweEE4LTB4QUYgKi8KKwkweDlDMjQsMHg5QzIxLDB4OURCNywweDlEQjYsMHg5REJDLDB4OURDMSwweDlEQzcsMHg5RENBLC8qIDB4QjAtMHhCNyAqLworCTB4OURDRiwweDlEQkUsMHg5REM1LDB4OURDMywweDlEQkIsMHg5REI1LDB4OURDRSwweDlEQjksLyogMHhCOC0weEJGICovCisJMHg5REJBLDB4OURBQywweDlEQzgsMHg5REIxLDB4OURBRCwweDlEQ0MsMHg5REIzLDB4OURDRCwvKiAweEMwLTB4QzcgKi8KKwkweDlEQjIsMHg5RTdBLDB4OUU5QywweDlFRUIsMHg5RUVFLDB4OUVFRCwweDlGMUIsMHg5RjE4LC8qIDB4QzgtMHhDRiAqLworCTB4OUYxQSwweDlGMzEsMHg5RjRFLDB4OUY2NSwweDlGNjQsMHg5RjkyLDB4NEVCOSwweDU2QzYsLyogMHhEMC0weEQ3ICovCisJMHg1NkM1LDB4NTZDQiwweDU5NzEsMHg1QjRCLDB4NUI0QywweDVERDUsMHg1REQxLDB4NUVGMiwvKiAweEQ4LTB4REYgKi8KKwkweDY1MjEsMHg2NTIwLDB4NjUyNiwweDY1MjIsMHg2QjBCLDB4NkIwOCwweDZCMDksMHg2QzBELC8qIDB4RTAtMHhFNyAqLworCTB4NzA1NSwweDcwNTYsMHg3MDU3LDB4NzA1MiwweDcyMUUsMHg3MjFGLDB4NzJBOSwweDczN0YsLyogMHhFOC0weEVGICovCisJMHg3NEQ4LDB4NzRENSwweDc0RDksMHg3NEQ3LDB4NzY2RCwweDc2QUQsMHg3OTM1LDB4NzlCNCwvKiAweEYwLTB4RjcgKi8KKwkweDdBNzAsMHg3QTcxLDB4N0M1NywweDdDNUMsMHg3QzU5LDB4N0M1QiwweDdDNUEsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgYzJ1X0Y3WzI1Nl0gPSB7CisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDAwLTB4MDcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDgtMHgwRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxMC0weDE3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDE4LTB4MUYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjAtMHgyNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyOC0weDJGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDMwLTB4MzcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzgtMHgzRiAqLworCTB4N0NGNCwweDdDRjEsMHg3RTkxLDB4N0Y0RiwweDdGODcsMHg4MURFLDB4ODI2QiwweDg2MzQsLyogMHg0MC0weDQ3ICovCisJMHg4NjM1LDB4ODYzMywweDg2MkMsMHg4NjMyLDB4ODYzNiwweDg4MkMsMHg4ODI4LDB4ODgyNiwvKiAweDQ4LTB4NEYgKi8KKwkweDg4MkEsMHg4ODI1LDB4ODk3MSwweDg5QkYsMHg4OUJFLDB4ODlGQiwweDhCN0UsMHg4Qjg0LC8qIDB4NTAtMHg1NyAqLworCTB4OEI4MiwweDhCODYsMHg4Qjg1LDB4OEI3RiwweDhEMTUsMHg4RTk1LDB4OEU5NCwweDhFOUEsLyogMHg1OC0weDVGICovCisJMHg4RTkyLDB4OEU5MCwweDhFOTYsMHg4RTk3LDB4OEY2MCwweDhGNjIsMHg5MTQ3LDB4OTQ0QywvKiAweDYwLTB4NjcgKi8KKwkweDk0NTAsMHg5NDRBLDB4OTQ0QiwweDk0NEYsMHg5NDQ3LDB4OTQ0NSwweDk0NDgsMHg5NDQ5LC8qIDB4NjgtMHg2RiAqLworCTB4OTQ0NiwweDk3M0YsMHg5N0UzLDB4OTg2QSwweDk4NjksMHg5OENCLDB4OTk1NCwweDk5NUIsLyogMHg3MC0weDc3ICovCisJMHg5QTRFLDB4OUE1MywweDlBNTQsMHg5QTRDLDB4OUE0RiwweDlBNDgsMHg5QTRBLDB4MDAwMCwvKiAweDc4LTB4N0YgKi8KKworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4MC0weDg3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDg4LTB4OEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTAtMHg5NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5OC0weDlGICovCisJMHgwMDAwLDB4OUE0OSwweDlBNTIsMHg5QTUwLDB4OUFEMCwweDlCMTksMHg5QjJCLDB4OUIzQiwvKiAweEEwLTB4QTcgKi8KKwkweDlCNTYsMHg5QjU1LDB4OUM0NiwweDlDNDgsMHg5QzNGLDB4OUM0NCwweDlDMzksMHg5QzMzLC8qIDB4QTgtMHhBRiAqLworCTB4OUM0MSwweDlDM0MsMHg5QzM3LDB4OUMzNCwweDlDMzIsMHg5QzNELDB4OUMzNiwweDlEREIsLyogMHhCMC0weEI3ICovCisJMHg5REQyLDB4OURERSwweDlEREEsMHg5RENCLDB4OUREMCwweDlEREMsMHg5REQxLDB4OURERiwvKiAweEI4LTB4QkYgKi8KKwkweDlERTksMHg5REQ5LDB4OUREOCwweDlERDYsMHg5REY1LDB4OURENSwweDlEREQsMHg5RUI2LC8qIDB4QzAtMHhDNyAqLworCTB4OUVGMCwweDlGMzUsMHg5RjMzLDB4OUYzMiwweDlGNDIsMHg5RjZCLDB4OUY5NSwweDlGQTIsLyogMHhDOC0weENGICovCisJMHg1MTNELDB4NTI5OSwweDU4RTgsMHg1OEU3LDB4NTk3MiwweDVCNEQsMHg1REQ4LDB4ODgyRiwvKiAweEQwLTB4RDcgKi8KKwkweDVGNEYsMHg2MjAxLDB4NjIwMywweDYyMDQsMHg2NTI5LDB4NjUyNSwweDY1OTYsMHg2NkVCLC8qIDB4RDgtMHhERiAqLworCTB4NkIxMSwweDZCMTIsMHg2QjBGLDB4NkJDQSwweDcwNUIsMHg3MDVBLDB4NzIyMiwweDczODIsLyogMHhFMC0weEU3ICovCisJMHg3MzgxLDB4NzM4MywweDc2NzAsMHg3N0Q0LDB4N0M2NywweDdDNjYsMHg3RTk1LDB4ODI2QywvKiAweEU4LTB4RUYgKi8KKwkweDg2M0EsMHg4NjQwLDB4ODYzOSwweDg2M0MsMHg4NjMxLDB4ODYzQiwweDg2M0UsMHg4ODMwLC8qIDB4RjAtMHhGNyAqLworCTB4ODgzMiwweDg4MkUsMHg4ODMzLDB4ODk3NiwweDg5NzQsMHg4OTczLDB4ODlGRSwweDAwMDAsLyogMHhGOC0weEZGICovCit9OworCitzdGF0aWMgd2NoYXJfdCBjMnVfRjhbMjU2XSA9IHsKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MDAtMHgwNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwOC0weDBGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDEwLTB4MTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTgtMHgxRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgyMC0weDI3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDI4LTB4MkYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MzAtMHgzNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzOC0weDNGICovCisJMHg4QjhDLDB4OEI4RSwweDhCOEIsMHg4Qjg4LDB4OEM0NSwweDhEMTksMHg4RTk4LDB4OEY2NCwvKiAweDQwLTB4NDcgKi8KKwkweDhGNjMsMHg5MUJDLDB4OTQ2MiwweDk0NTUsMHg5NDVELDB4OTQ1NywweDk0NUUsMHg5N0M0LC8qIDB4NDgtMHg0RiAqLworCTB4OTdDNSwweDk4MDAsMHg5QTU2LDB4OUE1OSwweDlCMUUsMHg5QjFGLDB4OUIyMCwweDlDNTIsLyogMHg1MC0weDU3ICovCisJMHg5QzU4LDB4OUM1MCwweDlDNEEsMHg5QzRELDB4OUM0QiwweDlDNTUsMHg5QzU5LDB4OUM0QywvKiAweDU4LTB4NUYgKi8KKwkweDlDNEUsMHg5REZCLDB4OURGNywweDlERUYsMHg5REUzLDB4OURFQiwweDlERjgsMHg5REU0LC8qIDB4NjAtMHg2NyAqLworCTB4OURGNiwweDlERTEsMHg5REVFLDB4OURFNiwweDlERjIsMHg5REYwLDB4OURFMiwweDlERUMsLyogMHg2OC0weDZGICovCisJMHg5REY0LDB4OURGMywweDlERTgsMHg5REVELDB4OUVDMiwweDlFRDAsMHg5RUYyLDB4OUVGMywvKiAweDcwLTB4NzcgKi8KKwkweDlGMDYsMHg5RjFDLDB4OUYzOCwweDlGMzcsMHg5RjM2LDB4OUY0MywweDlGNEYsMHgwMDAwLC8qIDB4NzgtMHg3RiAqLworCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDgwLTB4ODcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODgtMHg4RiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg5MC0weDk3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDk4LTB4OUYgKi8KKwkweDAwMDAsMHg5RjcxLDB4OUY3MCwweDlGNkUsMHg5RjZGLDB4NTZEMywweDU2Q0QsMHg1QjRFLC8qIDB4QTAtMHhBNyAqLworCTB4NUM2RCwweDY1MkQsMHg2NkVELDB4NjZFRSwweDZCMTMsMHg3MDVGLDB4NzA2MSwweDcwNUQsLyogMHhBOC0weEFGICovCisJMHg3MDYwLDB4NzIyMywweDc0REIsMHg3NEU1LDB4NzdENSwweDc5MzgsMHg3OUI3LDB4NzlCNiwvKiAweEIwLTB4QjcgKi8KKwkweDdDNkEsMHg3RTk3LDB4N0Y4OSwweDgyNkQsMHg4NjQzLDB4ODgzOCwweDg4MzcsMHg4ODM1LC8qIDB4QjgtMHhCRiAqLworCTB4ODg0QiwweDhCOTQsMHg4Qjk1LDB4OEU5RSwweDhFOUYsMHg4RUEwLDB4OEU5RCwweDkxQkUsLyogMHhDMC0weEM3ICovCisJMHg5MUJELDB4OTFDMiwweDk0NkIsMHg5NDY4LDB4OTQ2OSwweDk2RTUsMHg5NzQ2LDB4OTc0MywvKiAweEM4LTB4Q0YgKi8KKwkweDk3NDcsMHg5N0M3LDB4OTdFNSwweDlBNUUsMHg5QUQ1LDB4OUI1OSwweDlDNjMsMHg5QzY3LC8qIDB4RDAtMHhENyAqLworCTB4OUM2NiwweDlDNjIsMHg5QzVFLDB4OUM2MCwweDlFMDIsMHg5REZFLDB4OUUwNywweDlFMDMsLyogMHhEOC0weERGICovCisJMHg5RTA2LDB4OUUwNSwweDlFMDAsMHg5RTAxLDB4OUUwOSwweDlERkYsMHg5REZELDB4OUUwNCwvKiAweEUwLTB4RTcgKi8KKwkweDlFQTAsMHg5RjFFLDB4OUY0NiwweDlGNzQsMHg5Rjc1LDB4OUY3NiwweDU2RDQsMHg2NTJFLC8qIDB4RTgtMHhFRiAqLworCTB4NjVCOCwweDZCMTgsMHg2QjE5LDB4NkIxNywweDZCMUEsMHg3MDYyLDB4NzIyNiwweDcyQUEsLyogMHhGMC0weEY3ICovCisJMHg3N0Q4LDB4NzdEOSwweDc5MzksMHg3QzY5LDB4N0M2QiwweDdDRjYsMHg3RTlBLDB4MDAwMCwvKiAweEY4LTB4RkYgKi8KK307CisKK3N0YXRpYyB3Y2hhcl90IGMydV9GOVsyNTZdID0geworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgwMC0weDA3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDA4LTB4MEYgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MTAtMHgxNyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgxOC0weDFGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDIwLTB4MjcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4MjgtMHgyRiAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHgzMC0weDM3ICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDM4LTB4M0YgKi8KKwkweDdFOTgsMHg3RTlCLDB4N0U5OSwweDgxRTAsMHg4MUUxLDB4ODY0NiwweDg2NDcsMHg4NjQ4LC8qIDB4NDAtMHg0NyAqLworCTB4ODk3OSwweDg5N0EsMHg4OTdDLDB4ODk3QiwweDg5RkYsMHg4Qjk4LDB4OEI5OSwweDhFQTUsLyogMHg0OC0weDRGICovCisJMHg4RUE0LDB4OEVBMywweDk0NkUsMHg5NDZELDB4OTQ2RiwweDk0NzEsMHg5NDczLDB4OTc0OSwvKiAweDUwLTB4NTcgKi8KKwkweDk4NzIsMHg5OTVGLDB4OUM2OCwweDlDNkUsMHg5QzZELDB4OUUwQiwweDlFMEQsMHg5RTEwLC8qIDB4NTgtMHg1RiAqLworCTB4OUUwRiwweDlFMTIsMHg5RTExLDB4OUVBMSwweDlFRjUsMHg5RjA5LDB4OUY0NywweDlGNzgsLyogMHg2MC0weDY3ICovCisJMHg5RjdCLDB4OUY3QSwweDlGNzksMHg1NzFFLDB4NzA2NiwweDdDNkYsMHg4ODNDLDB4OERCMiwvKiAweDY4LTB4NkYgKi8KKwkweDhFQTYsMHg5MUMzLDB4OTQ3NCwweDk0NzgsMHg5NDc2LDB4OTQ3NSwweDlBNjAsMHg5Qzc0LC8qIDB4NzAtMHg3NyAqLworCTB4OUM3MywweDlDNzEsMHg5Qzc1LDB4OUUxNCwweDlFMTMsMHg5RUY2LDB4OUYwQSwweDAwMDAsLyogMHg3OC0weDdGICovCisKKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4ODAtMHg4NyAqLworCTB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsLyogMHg4OC0weDhGICovCisJMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwvKiAweDkwLTB4OTcgKi8KKwkweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLDB4MDAwMCwweDAwMDAsMHgwMDAwLC8qIDB4OTgtMHg5RiAqLworCTB4MDAwMCwweDlGQTQsMHg3MDY4LDB4NzA2NSwweDdDRjcsMHg4NjZBLDB4ODgzRSwweDg4M0QsLyogMHhBMC0weEE3ICovCisJMHg4ODNGLDB4OEI5RSwweDhDOUMsMHg4RUE5LDB4OEVDOSwweDk3NEIsMHg5ODczLDB4OTg3NCwvKiAweEE4LTB4QUYgKi8KKwkweDk4Q0MsMHg5OTYxLDB4OTlBQiwweDlBNjQsMHg5QTY2LDB4OUE2NywweDlCMjQsMHg5RTE1LC8qIDB4QjAtMHhCNyAqLworCTB4OUUxNywweDlGNDgsMHg2MjA3LDB4NkIxRSwweDcyMjcsMHg4NjRDLDB4OEVBOCwweDk0ODIsLyogMHhCOC0weEJGICovCisJMHg5NDgwLDB4OTQ4MSwweDlBNjksMHg5QTY4LDB4OUIyRSwweDlFMTksMHg3MjI5LDB4ODY0QiwvKiAweEMwLTB4QzcgKi8KKwkweDhCOUYsMHg5NDgzLDB4OUM3OSwweDlFQjcsMHg3Njc1LDB4OUE2QiwweDlDN0EsMHg5RTFELC8qIDB4QzgtMHhDRiAqLworCTB4NzA2OSwweDcwNkEsMHg5RUE0LDB4OUY3RSwweDlGNDksMHg5Rjk4LDB4Nzg4MSwweDkyQjksLyogMHhEMC0weEQ3ICovCisJMHg4OENGLDB4NThCQiwweDYwNTIsMHg3Q0E3LDB4NUFGQSwweDI1NTQsMHgyNTY2LDB4MjU1NywvKiAweEQ4LTB4REYgKi8KKwkweDI1NjAsMHgyNTZDLDB4MjU2MywweDI1NUEsMHgyNTY5LDB4MjU1RCwweDI1NTIsMHgyNTY0LC8qIDB4RTAtMHhFNyAqLworCTB4MjU1NSwweDI1NUUsMHgyNTZBLDB4MjU2MSwweDI1NTgsMHgyNTY3LDB4MjU1QiwweDI1NTMsLyogMHhFOC0weEVGICovCisJMHgyNTY1LDB4MjU1NiwweDI1NUYsMHgyNTZCLDB4MjU2MiwweDI1NTksMHgyNTY4LDB4MjU1QywvKiAweEYwLTB4RjcgKi8KKwkweDI1NTEsMHgyNTUwLDB4MjU2RCwweDI1NkUsMHgyNTcwLDB4MjU2RiwweDI1OTMsMHgwMDAwLC8qIDB4RjgtMHhGRiAqLworfTsKKworc3RhdGljIHdjaGFyX3QgKnBhZ2VfY2hhcnNldDJ1bmlbMjU2XSA9IHsKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgYzJ1X0ExLCBjMnVfQTIsIGMydV9BMywgYzJ1X0E0LCBjMnVfQTUsIGMydV9BNiwgYzJ1X0E3LCAKKwljMnVfQTgsIGMydV9BOSwgYzJ1X0FBLCBjMnVfQUIsIGMydV9BQywgYzJ1X0FELCBjMnVfQUUsIGMydV9BRiwgCisJYzJ1X0IwLCBjMnVfQjEsIGMydV9CMiwgYzJ1X0IzLCBjMnVfQjQsIGMydV9CNSwgYzJ1X0I2LCBjMnVfQjcsIAorCWMydV9COCwgYzJ1X0I5LCBjMnVfQkEsIGMydV9CQiwgYzJ1X0JDLCBjMnVfQkQsIGMydV9CRSwgYzJ1X0JGLCAKKwljMnVfQzAsIGMydV9DMSwgYzJ1X0MyLCBjMnVfQzMsIGMydV9DNCwgYzJ1X0M1LCBjMnVfQzYsIE5VTEwsICAgCisJTlVMTCwgICBjMnVfQzksIGMydV9DQSwgYzJ1X0NCLCBjMnVfQ0MsIGMydV9DRCwgYzJ1X0NFLCBjMnVfQ0YsIAorCWMydV9EMCwgYzJ1X0QxLCBjMnVfRDIsIGMydV9EMywgYzJ1X0Q0LCBjMnVfRDUsIGMydV9ENiwgYzJ1X0Q3LCAKKwljMnVfRDgsIGMydV9EOSwgYzJ1X0RBLCBjMnVfREIsIGMydV9EQywgYzJ1X0RELCBjMnVfREUsIGMydV9ERiwgCisJYzJ1X0UwLCBjMnVfRTEsIGMydV9FMiwgYzJ1X0UzLCBjMnVfRTQsIGMydV9FNSwgYzJ1X0U2LCBjMnVfRTcsIAorCWMydV9FOCwgYzJ1X0U5LCBjMnVfRUEsIGMydV9FQiwgYzJ1X0VDLCBjMnVfRUQsIGMydV9FRSwgYzJ1X0VGLCAKKwljMnVfRjAsIGMydV9GMSwgYzJ1X0YyLCBjMnVfRjMsIGMydV9GNCwgYzJ1X0Y1LCBjMnVfRjYsIGMydV9GNywgCisJYzJ1X0Y4LCBjMnVfRjksIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzAyWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMywgMHhCRSwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHhBMywgMHhCQywgMHhBMywgMHhCRCwgMHhBMywgMHhCRiwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHhBMSwgMHhDNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHhBMywgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMDNbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweEExLCAweEMyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweEEzLCAweDQ0LCAweEEzLCAweDQ1LCAweEEzLCAweDQ2LCAvKiAweDkwLTB4OTMgKi8KKwkweEEzLCAweDQ3LCAweEEzLCAweDQ4LCAweEEzLCAweDQ5LCAweEEzLCAweDRBLCAvKiAweDk0LTB4OTcgKi8KKwkweEEzLCAweDRCLCAweEEzLCAweDRDLCAweEEzLCAweDRELCAweEEzLCAweDRFLCAvKiAweDk4LTB4OUIgKi8KKwkweEEzLCAweDRGLCAweEEzLCAweDUwLCAweEEzLCAweDUxLCAweEEzLCAweDUyLCAvKiAweDlDLTB4OUYgKi8KKwkweEEzLCAweDUzLCAweEEzLCAweDU0LCAweDAwLCAweDAwLCAweEEzLCAweDU1LCAvKiAweEEwLTB4QTMgKi8KKwkweEEzLCAweDU2LCAweEEzLCAweDU3LCAweEEzLCAweDU4LCAweEEzLCAweDU5LCAvKiAweEE0LTB4QTcgKi8KKwkweEEzLCAweDVBLCAweEEzLCAweDVCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweEEzLCAweDVDLCAweEEzLCAweDVELCAweEEzLCAweDVFLCAvKiAweEIwLTB4QjMgKi8KKwkweEEzLCAweDVGLCAweEEzLCAweDYwLCAweEEzLCAweDYxLCAweEEzLCAweDYyLCAvKiAweEI0LTB4QjcgKi8KKwkweEEzLCAweDYzLCAweEEzLCAweDY0LCAweEEzLCAweDY1LCAweEEzLCAweDY2LCAvKiAweEI4LTB4QkIgKi8KKwkweEEzLCAweDY3LCAweEEzLCAweDY4LCAweEEzLCAweDY5LCAweEEzLCAweDZBLCAvKiAweEJDLTB4QkYgKi8KKwkweEEzLCAweDZCLCAweEEzLCAweDZDLCAweDAwLCAweDAwLCAweEEzLCAweDZELCAvKiAweEMwLTB4QzMgKi8KKwkweEEzLCAweDZFLCAweEEzLCAweDZGLCAweEEzLCAweDcwLCAweEEzLCAweDcxLCAvKiAweEM0LTB4QzcgKi8KKwkweEEzLCAweDcyLCAweEEzLCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18yMFs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4NTYsIC8qIDB4MTAtMHgxMyAqLworCTB4QTEsIDB4NTgsIDB4QTIsIDB4NzcsIDB4QTEsIDB4RkMsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4QTEsIDB4QTUsIDB4QTEsIDB4QTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4QTEsIDB4QTcsIDB4QTEsIDB4QTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4NDUsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4QTMsIDB4QkIsIDB4QTEsIDB4NEMsIDB4QTEsIDB4NEIsIDB4QTEsIDB4NDUsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4QUMsIDB4QTEsIDB4QjIsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4QTEsIDB4QUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4QjAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4QzMsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzIxWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMiwgMHg0QSwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHhBMSwgMHhDMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHhBMiwgMHg0QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHhBMiwgMHhCOSwgMHhBMiwgMHhCQSwgMHhBMiwgMHhCQiwgMHhBMiwgMHhCQywgLyogMHg2MC0weDYzICovCisJMHhBMiwgMHhCRCwgMHhBMiwgMHhCRSwgMHhBMiwgMHhCRiwgMHhBMiwgMHhDMCwgLyogMHg2NC0weDY3ICovCisJMHhBMiwgMHhDMSwgMHhBMiwgMHhDMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHhBMSwgMHhGNiwgMHhBMSwgMHhGNCwgMHhBMSwgMHhGNywgMHhBMSwgMHhGNSwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhGOCwgMHhBMSwgMHhGOSwgLyogMHg5NC0weDk3ICovCisJMHhBMSwgMHhGQiwgMHhBMSwgMHhGQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMjJbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweEEyLCAweDQxLCAweEEyLCAweDQyLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweEEyLCAweDU4LCAweDAwLCAweDAwLCAweEExLCAweEQ0LCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEExLCAweERCLCAweEExLCAweEU4LCAvKiAweDFDLTB4MUYgKi8KKwkweEExLCAweEU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEExLCAweEZELCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweEExLCAweEZDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweEExLCAweEU0LCAweEExLCAweEU1LCAweEExLCAweEVDLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEExLCAweEVELCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweEExLCAweEVGLCAweEExLCAweEVFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEExLCAweERDLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweEExLCAweERBLCAweEExLCAweERELCAweDAwLCAweDAwLCAweEExLCAweERELCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEExLCAweEQ4LCAweEExLCAweEQ5LCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweEExLCAweEYyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweEExLCAweEYzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweEExLCAweEU2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEExLCAweEU5LCAvKiAweEJDLTB4QkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18yM1s1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTEsIDB4NUIsIC8qIDB4MDQtMHgwNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzI1WzUxMl0gPSB7CisJMHhBMiwgMHg3NywgMHgwMCwgMHgwMCwgMHhBMiwgMHg3OCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHhBMiwgMHg3QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHhBMiwgMHg3QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHhBMiwgMHg3QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHhBMiwgMHg3RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHhBMiwgMHg3NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHhBMiwgMHg3NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHhBMiwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHhBMiwgMHg3MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHhBMiwgMHg3MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHhGOSwgMHhGOSwgMHhGOSwgMHhGOCwgMHhGOSwgMHhFNiwgMHhGOSwgMHhFRiwgLyogMHg1MC0weDUzICovCisJMHhGOSwgMHhERCwgMHhGOSwgMHhFOCwgMHhGOSwgMHhGMSwgMHhGOSwgMHhERiwgLyogMHg1NC0weDU3ICovCisJMHhGOSwgMHhFQywgMHhGOSwgMHhGNSwgMHhGOSwgMHhFMywgMHhGOSwgMHhFRSwgLyogMHg1OC0weDVCICovCisJMHhGOSwgMHhGNywgMHhGOSwgMHhFNSwgMHhGOSwgMHhFOSwgMHhGOSwgMHhGMiwgLyogMHg1Qy0weDVGICovCisJMHhGOSwgMHhFMCwgMHhGOSwgMHhFQiwgMHhGOSwgMHhGNCwgMHhGOSwgMHhFMiwgLyogMHg2MC0weDYzICovCisJMHhGOSwgMHhFNywgMHhGOSwgMHhGMCwgMHhGOSwgMHhERSwgMHhGOSwgMHhFRCwgLyogMHg2NC0weDY3ICovCisJMHhGOSwgMHhGNiwgMHhGOSwgMHhFNCwgMHhGOSwgMHhFQSwgMHhGOSwgMHhGMywgLyogMHg2OC0weDZCICovCisJMHhGOSwgMHhFMSwgMHhBMiwgMHg3RSwgMHhBMiwgMHhBMSwgMHhBMiwgMHhBMywgLyogMHg2Qy0weDZGICovCisJMHhBMiwgMHhBMiwgMHhBMiwgMHhBQywgMHhBMiwgMHhBRCwgMHhBMiwgMHhBRSwgLyogMHg3MC0weDczICovCisJMHhBMSwgMHg1QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHhBMiwgMHg2MiwgMHhBMiwgMHg2MywgMHhBMiwgMHg2NCwgLyogMHg4MC0weDgzICovCisJMHhBMiwgMHg2NSwgMHhBMiwgMHg2NiwgMHhBMiwgMHg2NywgMHhBMiwgMHg2OCwgLyogMHg4NC0weDg3ICovCisJMHhBMiwgMHg2OSwgMHhBMiwgMHg3MCwgMHhBMiwgMHg2RiwgMHhBMiwgMHg2RSwgLyogMHg4OC0weDhCICovCisJMHhBMiwgMHg2RCwgMHhBMiwgMHg2QywgMHhBMiwgMHg2QiwgMHhBMiwgMHg2QSwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOSwgMHhGRSwgLyogMHg5MC0weDkzICovCisJMHhBMiwgMHg3NiwgMHhBMiwgMHg3OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHhBMSwgMHhCRCwgMHhBMSwgMHhCQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhCNiwgMHhBMSwgMHhCNSwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHhBMSwgMHhCRiwgMHhBMSwgMHhCRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhCQiwgMHhBMSwgMHhCQSwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhCMywgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMSwgMHhCNywgMHhBMSwgMHhCNCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMiwgMHhBOCwgMHhBMiwgMHhBOSwgLyogMHhFMC0weEUzICovCisJMHhBMiwgMHhBQiwgMHhBMiwgMHhBQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMjZbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweEExLCAweEI5LCAweEExLCAweEI4LCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweEExLCAweEYzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweEExLCAweEYwLCAweEExLCAweEYyLCAweEExLCAweEYxLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18zMFs1MTJdID0geworCTB4QTEsIDB4NDAsIDB4QTEsIDB4NDIsIDB4QTEsIDB4NDMsIDB4QTEsIDB4QjIsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4QTEsIDB4NzEsIDB4QTEsIDB4NzIsIDB4QTEsIDB4NkQsIDB4QTEsIDB4NkUsIC8qIDB4MDgtMHgwQiAqLworCTB4QTEsIDB4NzUsIDB4QTEsIDB4NzYsIDB4QTEsIDB4NzksIDB4QTEsIDB4N0EsIC8qIDB4MEMtMHgwRiAqLworCTB4QTEsIDB4NjksIDB4QTEsIDB4NkEsIDB4QTIsIDB4NDUsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4QTEsIDB4NjUsIDB4QTEsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4QTEsIDB4RTMsIDB4QTEsIDB4QTksIDB4QTEsIDB4QUEsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4QTIsIDB4QzMsIDB4QTIsIDB4QzQsIDB4QTIsIDB4QzUsIC8qIDB4MjAtMHgyMyAqLworCTB4QTIsIDB4QzYsIDB4QTIsIDB4QzcsIDB4QTIsIDB4QzgsIDB4QTIsIDB4QzksIC8qIDB4MjQtMHgyNyAqLworCTB4QTIsIDB4Q0EsIDB4QTIsIDB4Q0IsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4QTEsIDB4Q0EsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzMxWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHhBMywgMHg3NCwgMHhBMywgMHg3NSwgMHhBMywgMHg3NiwgLyogMHgwNC0weDA3ICovCisJMHhBMywgMHg3NywgMHhBMywgMHg3OCwgMHhBMywgMHg3OSwgMHhBMywgMHg3QSwgLyogMHgwOC0weDBCICovCisJMHhBMywgMHg3QiwgMHhBMywgMHg3QywgMHhBMywgMHg3RCwgMHhBMywgMHg3RSwgLyogMHgwQy0weDBGICovCisJMHhBMywgMHhBMSwgMHhBMywgMHhBMiwgMHhBMywgMHhBMywgMHhBMywgMHhBNCwgLyogMHgxMC0weDEzICovCisJMHhBMywgMHhBNSwgMHhBMywgMHhBNiwgMHhBMywgMHhBNywgMHhBMywgMHhBOCwgLyogMHgxNC0weDE3ICovCisJMHhBMywgMHhBOSwgMHhBMywgMHhBQSwgMHhBMywgMHhBQiwgMHhBMywgMHhBQywgLyogMHgxOC0weDFCICovCisJMHhBMywgMHhBRCwgMHhBMywgMHhBRSwgMHhBMywgMHhBRiwgMHhBMywgMHhCMCwgLyogMHgxQy0weDFGICovCisJMHhBMywgMHhCMSwgMHhBMywgMHhCMiwgMHhBMywgMHhCMywgMHhBMywgMHhCNCwgLyogMHgyMC0weDIzICovCisJMHhBMywgMHhCNSwgMHhBMywgMHhCNiwgMHhBMywgMHhCNywgMHhBMywgMHhCOCwgLyogMHgyNC0weDI3ICovCisJMHhBMywgMHhCOSwgMHhBMywgMHhCQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNCwgMHg0MCwgMHhBNCwgMHg0NywgLyogMHg5MC0weDkzICovCisJMHhBNCwgMHg1NCwgMHhBNSwgMHg3QywgMHhBNCwgMHg1NywgMHhBNCwgMHhBNCwgLyogMHg5NC0weDk3ICovCisJMHhBNCwgMHg1NSwgMHhBNSwgMHhEMiwgMHhBNCwgMHg0MSwgMHhBNCwgMHhGRSwgLyogMHg5OC0weDlCICovCisJMHhBNCwgMHg0MiwgMHhBNCwgMHhEMSwgMHhBNiwgMHg2MSwgMHhBNCwgMHg0OCwgLyogMHg5Qy0weDlGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfMzJbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweEE0LCAweDQwLCAweEE0LCAweDQ3LCAweEE0LCAweDU0LCAweEE1LCAweDdDLCAvKiAweDIwLTB4MjMgKi8KKwkweEE0LCAweEFELCAweEE0LCAweEJCLCAweEE0LCAweDQzLCAweEE0LCAweDRCLCAvKiAweDI0LTB4MjcgKi8KKwkweEE0LCAweDQ1LCAweEE0LCAweDUxLCAweEE0LCAweEVCLCAweEE0LCAweEY1LCAvKiAweDI4LTB4MkIgKi8KKwkweEE0LCAweEY0LCAweEE0LCAweEVDLCAweEFBLCAweEY3LCAweEE0LCAweDY3LCAvKiAweDJDLTB4MkYgKi8KKwkweEE0LCAweEU5LCAweEFFLCAweEU4LCAweEE2LCAweEIzLCAweEFBLCAweEMwLCAvKiAweDMwLTB4MzMgKi8KKwkweEE2LCAweDU3LCAweEFGLCAweDUzLCAweEIwLCAweDVELCAweEFGLCAweEFDLCAvKiAweDM0LTB4MzcgKi8KKwkweEIzLCAweEQyLCAweEE1LCAweDRFLCAweEE5LCAweDQ5LCAweEJFLCAweEM3LCAvKiAweDM4LTB4M0IgKi8KKwkweEJBLCAweENBLCAweEE1LCAweEY4LCAweEI4LCAweEVBLCAweEE4LCAweEYzLCAvKiAweDNDLTB4M0YgKi8KKwkweEIyLCAweEJELCAweEE1LCAweEYwLCAweEE2LCAweERCLCAweEE2LCAweERDLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEE0LCAweDQwLCAweEE0LCAweDQ3LCAweEE0LCAweDU0LCAweEE1LCAweDdDLCAvKiAweDgwLTB4ODMgKi8KKwkweEE0LCAweEFELCAweEE0LCAweEJCLCAweEE0LCAweDQzLCAweEE0LCAweDRCLCAvKiAweDg0LTB4ODcgKi8KKwkweEE0LCAweDQ1LCAweEE0LCAweDUxLCAweEE0LCAweEVCLCAweEE0LCAweEY1LCAvKiAweDg4LTB4OEIgKi8KKwkweEE0LCAweEY0LCAweEE0LCAweEVDLCAweEFBLCAweEY3LCAweEE0LCAweDY3LCAvKiAweDhDLTB4OEYgKi8KKwkweEE0LCAweEU5LCAweEFFLCAweEU4LCAweEE2LCAweEIzLCAweEFBLCAweEMwLCAvKiAweDkwLTB4OTMgKi8KKwkweEE2LCAweDU3LCAweEFGLCAweDUzLCAweEIwLCAweDVELCAweEFGLCAweEFDLCAvKiAweDk0LTB4OTcgKi8KKwkweEIzLCAweEQyLCAweEFGLCAweEI1LCAweEE4LCAweDZCLCAweEE0LCAweDZCLCAvKiAweDk4LTB4OUIgKi8KKwkweEJFLCAweDQxLCAweEMwLCAweDc1LCAweEE2LCAweDRDLCAweEFBLCAweDYwLCAvKiAweDlDLTB4OUYgKi8KKwkweEI2LCAweEI1LCAweEE1LCAweEYwLCAweEJDLCAweDY3LCAweEExLCAweEMwLCAvKiAweEEwLTB4QTMgKi8KKwkweEE0LCAweDU3LCAweEE0LCAweEE0LCAweEE0LCAweDU1LCAweEE1LCAweEFBLCAvKiAweEE0LTB4QTcgKi8KKwkweEE1LCAweDZCLCAweEMyLCAweEU1LCAweEE5LCAweDc2LCAweEJFLCAweEM3LCAvKiAweEE4LTB4QUIgKi8KKwkweEJBLCAweENBLCAweEE1LCAweEY4LCAweEI4LCAweEVBLCAweEE4LCAweEYzLCAvKiAweEFDLTB4QUYgKi8KKwkweEE5LCAweDVELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY18zM1s1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTIsIDB4NTUsIDB4QTIsIDB4NTYsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4QTIsIDB4NTAsIDB4QTIsIDB4NTEsIDB4QTIsIDB4NTIsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4QTIsIDB4NTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4QTIsIDB4NTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTIsIDB4NTMsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4QTEsIDB4RUIsIDB4QTEsIDB4RUEsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4QTIsIDB4NEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzRFWzUxMl0gPSB7CisJMHhBNCwgMHg0MCwgMHhBNCwgMHg0MiwgMHgwMCwgMHgwMCwgMHhBNCwgMHg0MywgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDOSwgMHg0NSwgLyogMHgwNC0weDA3ICovCisJMHhBNCwgMHg1NiwgMHhBNCwgMHg1NCwgMHhBNCwgMHg1NywgMHhBNCwgMHg1NSwgLyogMHgwOC0weDBCICovCisJMHhDOSwgMHg0NiwgMHhBNCwgMHhBMywgMHhDOSwgMHg0RiwgMHhDOSwgMHg0RCwgLyogMHgwQy0weDBGICovCisJMHhBNCwgMHhBMiwgMHhBNCwgMHhBMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHhBNSwgMHg0MiwgMHhBNSwgMHg0MSwgMHhBNSwgMHg0MCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHhBNSwgMHg0MywgMHhBNCwgMHhGRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNSwgMHhFMCwgMHhBNSwgMHhFMSwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBOCwgMHhDMywgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNCwgMHg1OCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHhBNCwgMHhBNCwgMHhDOSwgMHg1MCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHhBNCwgMHhBNSwgMHhDOSwgMHg2MywgMHhBNiwgMHhFQSwgMHhDQiwgMHhCMSwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHhBNCwgMHg1OSwgMHhBNCwgMHhBNiwgMHgwMCwgMHgwMCwgMHhBNSwgMHg0NCwgLyogMHgzOC0weDNCICovCisJMHhDOSwgMHg2NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDOSwgMHg0MCwgMHhBNCwgMHg0NCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHhBNCwgMHg1QiwgMHgwMCwgMHgwMCwgMHhDOSwgMHg0NywgLyogMHg0NC0weDQ3ICovCisJMHhBNCwgMHg1QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNCwgMHhBNywgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHhBNSwgMHg0NSwgMHhBNSwgMHg0NywgMHhBNSwgMHg0NiwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNSwgMHhFMiwgMHhBNSwgMHhFMywgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBOCwgMHhDNCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHhBRCwgMHhCQywgMHhBNCwgMHg0MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHhDOSwgMHg0MSwgMHhBNCwgMHg0NSwgMHhBNCwgMHg1RSwgMHhBNCwgMHg1RCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhBNSwgMHhFNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBOCwgMHhDNSwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMCwgMHhBRSwgMHhENCwgMHg0QiwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCNiwgMHhDMywgMHhEQywgMHhCMSwgLyogMHg4MC0weDgzICovCisJMHhEQywgMHhCMiwgMHgwMCwgMHgwMCwgMHhBNCwgMHg0NiwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHhBNCwgMHhBOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBOCwgMHhDNiwgLyogMHg4OC0weDhCICovCisJMHhBNCwgMHg0NywgMHhDOSwgMHg0OCwgMHhBNCwgMHg1RiwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHhBNCwgMHhBQSwgMHhBNCwgMHhBQywgMHhDOSwgMHg1MSwgLyogMHg5MC0weDkzICovCisJMHhBNCwgMHhBRCwgMHhBNCwgMHhBQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHhBNSwgMHhFNSwgMHgwMCwgMHgwMCwgMHhBOCwgMHhDNywgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBOCwgMHhDOCwgMHhBQiwgMHg0NSwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHhBNCwgMHg2MCwgMHhBNCwgMHhBRSwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHhBNSwgMHhFNiwgMHhBNSwgMHhFOCwgMHhBNSwgMHhFNywgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHhBNiwgMHhFQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBOCwgMHhDOSwgLyogMHhBOC0weEFCICovCisJMHhBOCwgMHhDQSwgMHhBQiwgMHg0NiwgMHhBQiwgMHg0NywgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBRCwgMHhCRCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQywgMHhCMywgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHhGNiwgMHhENiwgMHhBNCwgMHg0OCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHhBNCwgMHhCMCwgMHhBNCwgMHhBRiwgMHhDOSwgMHg1MiwgMHhBNCwgMHhCMSwgLyogMHhDMC0weEMzICovCisJMHhBNCwgMHhCNywgMHgwMCwgMHgwMCwgMHhBNCwgMHhCMiwgMHhBNCwgMHhCMywgLyogMHhDNC0weEM3ICovCisJMHhDOSwgMHg1NCwgMHhDOSwgMHg1MywgMHhBNCwgMHhCNSwgMHhBNCwgMHhCNiwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHhBNCwgMHhCNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHhBNSwgMHg0QSwgMHhBNSwgMHg0QiwgMHhBNSwgMHg0QywgMHhBNSwgMHg0RCwgLyogMHhENC0weEQ3ICovCisJMHhBNSwgMHg0OSwgMHhBNSwgMHg1MCwgMHhDOSwgMHg2QSwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHhDOSwgMHg2NiwgMHhDOSwgMHg2OSwgMHhBNSwgMHg1MSwgMHhBNSwgMHg2MSwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHhDOSwgMHg2OCwgMHgwMCwgMHgwMCwgMHhBNSwgMHg0RSwgLyogMHhFMC0weEUzICovCisJMHhBNSwgMHg0RiwgMHhBNSwgMHg0OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHhDOSwgMHg2NSwgMHhDOSwgMHg2NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHhBNSwgMHhGNSwgMHhDOSwgMHhCMCwgMHhBNSwgMHhGMiwgMHhBNSwgMHhGNiwgLyogMHhGMC0weEYzICovCisJMHhDOSwgMHhCQSwgMHhDOSwgMHhBRSwgMHhBNSwgMHhGMywgMHhDOSwgMHhCMiwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNSwgMHhGNCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHhBNSwgMHhGNywgMHgwMCwgMHgwMCwgMHhBNSwgMHhFOSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNEZbNTEyXSA9IHsKKwkweEM5LCAweEIxLCAweEE1LCAweEY4LCAweEM5LCAweEI1LCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweEM5LCAweEI5LCAweEM5LCAweEI2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweEM5LCAweEIzLCAweEE1LCAweEVBLCAweEE1LCAweEVDLCAweEE1LCAweEY5LCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweEE1LCAweEVFLCAweEM5LCAweEFCLCAweEE1LCAweEYxLCAvKiAweDBDLTB4MEYgKi8KKwkweEE1LCAweEVGLCAweEE1LCAweEYwLCAweEM5LCAweEJCLCAweEM5LCAweEI4LCAvKiAweDEwLTB4MTMgKi8KKwkweEM5LCAweEFGLCAweEE1LCAweEVELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweEM5LCAweEFDLCAweEE1LCAweEVCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweEM5LCAweEI0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEM5LCAweEI3LCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweEM5LCAweEFELCAweENBLCAweDY2LCAweDAwLCAweDAwLCAweEE3LCAweDQyLCAvKiAweDJDLTB4MkYgKi8KKwkweEE2LCAweEY0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENBLCAweDY3LCAvKiAweDMwLTB4MzMgKi8KKwkweEE2LCAweEYxLCAweDAwLCAweDAwLCAweEE3LCAweDQ0LCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweEE2LCAweEY5LCAweDAwLCAweDAwLCAweEE2LCAweEY4LCAweENBLCAweDVCLCAvKiAweDM4LTB4M0IgKi8KKwkweEE2LCAweEZDLCAweEE2LCAweEY3LCAweENBLCAweDYwLCAweENBLCAweDY4LCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweENBLCAweDY0LCAweDAwLCAweDAwLCAweEE2LCAweEZBLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE2LCAweEZELCAweEE2LCAweEVFLCAvKiAweDQ0LTB4NDcgKi8KKwkweEE3LCAweDQ3LCAweENBLCAweDVELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweENCLCAweEJELCAweEE2LCAweEVDLCAweEE3LCAweDQzLCAweEE2LCAweEVELCAvKiAweDRDLTB4NEYgKi8KKwkweEE2LCAweEY1LCAweEE2LCAweEY2LCAweENBLCAweDYyLCAweENBLCAweDVFLCAvKiAweDUwLTB4NTMgKi8KKwkweEE2LCAweEZCLCAweEE2LCAweEYzLCAweENBLCAweDVBLCAweEE2LCAweEVGLCAvKiAweDU0LTB4NTcgKi8KKwkweENBLCAweDY1LCAweEE3LCAweDQ1LCAweEE3LCAweDQ4LCAweEE2LCAweEYyLCAvKiAweDU4LTB4NUIgKi8KKwkweEE3LCAweDQwLCAweEE3LCAweDQ2LCAweEE2LCAweEYwLCAweENBLCAweDYzLCAvKiAweDVDLTB4NUYgKi8KKwkweEE3LCAweDQxLCAweENBLCAweDY5LCAweENBLCAweDVDLCAweEE2LCAweEZFLCAvKiAweDYwLTB4NjMgKi8KKwkweENBLCAweDVGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENBLCAweDYxLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweEE4LCAweEQ4LCAweENCLCAweEJGLCAweENCLCAweENCLCAvKiAweDY4LTB4NkIgKi8KKwkweEE4LCAweEQwLCAweDAwLCAweDAwLCAweENCLCAweENDLCAweEE4LCAweENCLCAvKiAweDZDLTB4NkYgKi8KKwkweEE4LCAweEQ1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE4LCAweENFLCAvKiAweDcwLTB4NzMgKi8KKwkweENCLCAweEI5LCAweEE4LCAweEQ2LCAweENCLCAweEI4LCAweENCLCAweEJDLCAvKiAweDc0LTB4NzcgKi8KKwkweENCLCAweEMzLCAweENCLCAweEMxLCAweEE4LCAweERFLCAweEE4LCAweEQ5LCAvKiAweDc4LTB4N0IgKi8KKwkweENCLCAweEIzLCAweENCLCAweEI1LCAweEE4LCAweERCLCAweEE4LCAweENGLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweENCLCAweEI2LCAweENCLCAweEMyLCAweENCLCAweEM5LCAweEE4LCAweEQ0LCAvKiAweDgwLTB4ODMgKi8KKwkweENCLCAweEJCLCAweENCLCAweEI0LCAweEE4LCAweEQzLCAweENCLCAweEI3LCAvKiAweDg0LTB4ODcgKi8KKwkweEE4LCAweEQ3LCAweENCLCAweEJBLCAweDAwLCAweDAwLCAweEE4LCAweEQyLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweEE4LCAweENELCAweDAwLCAweDAwLCAweEE4LCAweERDLCAvKiAweDhDLTB4OEYgKi8KKwkweENCLCAweEM0LCAweEE4LCAweERELCAweENCLCAweEM4LCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweENCLCAweEM2LCAweENCLCAweENBLCAweEE4LCAweERBLCAweENCLCAweEJFLCAvKiAweDk0LTB4OTcgKi8KKwkweENCLCAweEIyLCAweDAwLCAweDAwLCAweENCLCAweEMwLCAweEE4LCAweEQxLCAvKiAweDk4LTB4OUIgKi8KKwkweENCLCAweEM1LCAweEE4LCAweENDLCAweENCLCAweEM3LCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEFCLCAweDU2LCAweEFCLCAweDRBLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENELCAweEUwLCAweENELCAweEU4LCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweEFCLCAweDQ5LCAweEFCLCAweDUxLCAweEFCLCAweDVELCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweENELCAweEVFLCAweENELCAweEVDLCAweENELCAweEU3LCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEFCLCAweDRCLCAvKiAweEJDLTB4QkYgKi8KKwkweENELCAweEVELCAweENELCAweEUzLCAweEFCLCAweDU5LCAweEFCLCAweDUwLCAvKiAweEMwLTB4QzMgKi8KKwkweEFCLCAweDU4LCAweENELCAweERFLCAweDAwLCAweDAwLCAweENELCAweEVBLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweENELCAweEUxLCAweEFCLCAweDU0LCAweENELCAweEUyLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweENELCAweERELCAweEFCLCAweDVCLCAweEFCLCAweDRFLCAvKiAweENDLTB4Q0YgKi8KKwkweEFCLCAweDU3LCAweEFCLCAweDRELCAweDAwLCAweDAwLCAweENELCAweERGLCAvKiAweEQwLTB4RDMgKi8KKwkweENELCAweEU0LCAweDAwLCAweDAwLCAweENELCAweEVCLCAweEFCLCAweDU1LCAvKiAweEQ0LTB4RDcgKi8KKwkweEFCLCAweDUyLCAweENELCAweEU2LCAweEFCLCAweDVBLCAweENELCAweEU5LCAvKiAweEQ4LTB4REIgKi8KKwkweENELCAweEU1LCAweEFCLCAweDRGLCAweEFCLCAweDVDLCAweEFCLCAweDUzLCAvKiAweERDLTB4REYgKi8KKwkweEFCLCAweDRDLCAweEFCLCAweDQ4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweENELCAweEVGLCAweDAwLCAweDAwLCAweEFELCAweEQ3LCAweEFELCAweEMxLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweEFELCAweEQxLCAweDAwLCAweDAwLCAweEFELCAweEQ2LCAvKiAweEYwLTB4RjMgKi8KKwkweEQwLCAweEQwLCAweEQwLCAweENGLCAweEQwLCAweEQ0LCAweEQwLCAweEQ1LCAvKiAweEY0LTB4RjcgKi8KKwkweEFELCAweEM0LCAweDAwLCAweDAwLCAweEFELCAweENELCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEFELCAweERBLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181MFs1MTJdID0geworCTB4QUQsIDB4Q0UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4RDAsIDB4QzksIDB4QUQsIDB4QzcsIDB4RDAsIDB4Q0EsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4QUQsIDB4REMsIDB4MDAsIDB4MDAsIDB4QUQsIDB4RDMsIC8qIDB4MDgtMHgwQiAqLworCTB4QUQsIDB4QkUsIDB4QUQsIDB4QkYsIDB4RDAsIDB4REQsIDB4QjAsIDB4QkYsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4QUQsIDB4Q0MsIDB4QUQsIDB4Q0IsIDB4RDAsIDB4Q0IsIC8qIDB4MTAtMHgxMyAqLworCTB4QUQsIDB4Q0YsIDB4RDQsIDB4NUIsIDB4QUQsIDB4QzYsIDB4RDAsIDB4RDYsIC8qIDB4MTQtMHgxNyAqLworCTB4QUQsIDB4RDUsIDB4QUQsIDB4RDQsIDB4QUQsIDB4Q0EsIDB4RDAsIDB4Q0UsIC8qIDB4MTgtMHgxQiAqLworCTB4RDAsIDB4RDcsIDB4MDAsIDB4MDAsIDB4RDAsIDB4QzgsIDB4QUQsIDB4QzksIC8qIDB4MUMtMHgxRiAqLworCTB4RDAsIDB4RDgsIDB4QUQsIDB4RDIsIDB4RDAsIDB4Q0MsIDB4QUQsIDB4QzAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4QUQsIDB4QzMsIDB4QUQsIDB4QzIsIDB4RDAsIDB4RDksIC8qIDB4MjQtMHgyNyAqLworCTB4QUQsIDB4RDAsIDB4QUQsIDB4QzUsIDB4QUQsIDB4RDksIDB4QUQsIDB4REIsIC8qIDB4MjgtMHgyQiAqLworCTB4RDAsIDB4RDMsIDB4QUQsIDB4RDgsIDB4MDAsIDB4MDAsIDB4RDAsIDB4REIsIC8qIDB4MkMtMHgyRiAqLworCTB4RDAsIDB4Q0QsIDB4RDAsIDB4REMsIDB4MDAsIDB4MDAsIDB4RDAsIDB4RDEsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4RDAsIDB4REEsIDB4MDAsIDB4MDAsIDB4RDAsIDB4RDIsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4QUQsIDB4QzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4RDQsIDB4NjMsIDB4RDQsIDB4NTcsIDB4MDAsIDB4MDAsIDB4QjAsIDB4QjMsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4RDQsIDB4NUMsIDB4RDQsIDB4NjIsIDB4QjAsIDB4QjIsIC8qIDB4NDQtMHg0NyAqLworCTB4RDQsIDB4NTUsIDB4QjAsIDB4QjYsIDB4RDQsIDB4NTksIDB4RDQsIDB4NTIsIC8qIDB4NDgtMHg0QiAqLworCTB4QjAsIDB4QjQsIDB4RDQsIDB4NTYsIDB4QjAsIDB4QjksIDB4QjAsIDB4QkUsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4RDQsIDB4NjcsIDB4MDAsIDB4MDAsIDB4RDQsIDB4NTEsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4QjAsIDB4QkEsIDB4MDAsIDB4MDAsIDB4RDQsIDB4NjYsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjAsIDB4QjUsIDB4RDQsIDB4NTgsIC8qIDB4NTgtMHg1QiAqLworCTB4QjAsIDB4QjEsIDB4RDQsIDB4NTMsIDB4RDQsIDB4NEYsIDB4RDQsIDB4NUQsIC8qIDB4NUMtMHg1RiAqLworCTB4RDQsIDB4NTAsIDB4RDQsIDB4NEUsIDB4RDQsIDB4NUEsIDB4RDQsIDB4NjAsIC8qIDB4NjAtMHg2MyAqLworCTB4RDQsIDB4NjEsIDB4QjAsIDB4QjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4RDgsIDB4NUIsIDB4RDQsIDB4NUUsIDB4RDQsIDB4NEQsIDB4RDQsIDB4NUYsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4QjAsIDB4QzEsIDB4RDQsIDB4NjQsIDB4QjAsIDB4QzAsIC8qIDB4NkMtMHg2RiAqLworCTB4RDQsIDB4NEMsIDB4MDAsIDB4MDAsIDB4RDQsIDB4NTQsIDB4RDQsIDB4NjUsIC8qIDB4NzAtMHg3MyAqLworCTB4QjAsIDB4QkMsIDB4QjAsIDB4QkIsIDB4QjAsIDB4QjgsIDB4QjAsIDB4QkQsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjAsIDB4QUYsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4QjAsIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QjMsIDB4QzgsIDB4MDAsIDB4MDAsIDB4RDgsIDB4NUUsIDB4RDgsIDB4NTcsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4QjMsIDB4QzUsIDB4MDAsIDB4MDAsIDB4RDgsIDB4NUYsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDgsIDB4NTUsIC8qIDB4ODgtMHg4QiAqLworCTB4RDgsIDB4NTgsIDB4QjMsIDB4QzQsIDB4RDgsIDB4NTksIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4QjMsIDB4QzcsIDB4RDgsIDB4NUQsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4RDgsIDB4NTMsIDB4RDgsIDB4NTIsIDB4QjMsIDB4QzksIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4QjMsIDB4Q0EsIDB4QjMsIDB4QzYsIDB4QjMsIDB4Q0IsIDB4RDgsIDB4NTEsIC8qIDB4OTgtMHg5QiAqLworCTB4RDgsIDB4NUMsIDB4RDgsIDB4NUEsIDB4RDgsIDB4NTQsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjMsIDB4QzMsIDB4RDgsIDB4NTYsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4QjYsIDB4Q0EsIDB4QjYsIDB4QzQsIDB4REMsIDB4QjcsIDB4QjYsIDB4Q0QsIC8qIDB4QUMtMHhBRiAqLworCTB4REMsIDB4QkQsIDB4REMsIDB4QzAsIDB4QjYsIDB4QzYsIDB4QjYsIDB4QzcsIC8qIDB4QjAtMHhCMyAqLworCTB4REMsIDB4QkEsIDB4QjYsIDB4QzUsIDB4REMsIDB4QzMsIDB4QjYsIDB4Q0IsIC8qIDB4QjQtMHhCNyAqLworCTB4REMsIDB4QzQsIDB4MDAsIDB4MDAsIDB4REMsIDB4QkYsIDB4QjYsIDB4Q0MsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4REMsIDB4QjQsIDB4QjYsIDB4QzksIDB4REMsIDB4QjUsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4REMsIDB4QkUsIDB4REMsIDB4QkMsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4REMsIDB4QjgsIDB4QjYsIDB4QzgsIDB4REMsIDB4QjYsIDB4QjYsIDB4Q0UsIC8qIDB4QzQtMHhDNyAqLworCTB4REMsIDB4QkIsIDB4REMsIDB4QzIsIDB4REMsIDB4QjksIDB4REMsIDB4QzEsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjksIDB4QjYsIDB4QjksIDB4QjMsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4QjksIDB4QjQsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RjksIC8qIDB4RDAtMHhEMyAqLworCTB4RTAsIDB4RjEsIDB4QjksIDB4QjIsIDB4QjksIDB4QUYsIDB4RTAsIDB4RjIsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjksIDB4QjEsIDB4RTAsIDB4RjUsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4RjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4RTAsIDB4RkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RkQsIC8qIDB4RTAtMHhFMyAqLworCTB4RTAsIDB4RjgsIDB4QjksIDB4QUUsIDB4RTAsIDB4RjAsIDB4QjksIDB4QUMsIC8qIDB4RTQtMHhFNyAqLworCTB4RTAsIDB4RjMsIDB4QjksIDB4QjcsIDB4RTAsIDB4RjYsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4RTAsIDB4RkEsIDB4QjksIDB4QjAsIDB4QjksIDB4QUQsIDB4RTAsIDB4RkMsIC8qIDB4RUMtMHhFRiAqLworCTB4RTAsIDB4RkIsIDB4QjksIDB4QjUsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RjQsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4QkIsIDB4RjgsIDB4RTQsIDB4RUMsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4RTQsIDB4RTksIDB4QkIsIDB4RjksIDB4MDAsIDB4MDAsIDB4QkIsIDB4RjcsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4RjAsIDB4RTQsIDB4RUQsIDB4RTQsIDB4RTYsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzUxWzUxMl0gPSB7CisJMHhCQiwgMHhGNiwgMHgwMCwgMHgwMCwgMHhCQiwgMHhGQSwgMHhFNCwgMHhFNywgLyogMHgwMC0weDAzICovCisJMHhCQiwgMHhGNSwgMHhCQiwgMHhGRCwgMHhFNCwgMHhFQSwgMHhFNCwgMHhFQiwgLyogMHgwNC0weDA3ICovCisJMHhCQiwgMHhGQiwgMHhCQiwgMHhGQywgMHhFNCwgMHhGMSwgMHhFNCwgMHhFRSwgLyogMHgwOC0weDBCICovCisJMHhFNCwgMHhFRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHhCRSwgMHhBQSwgMHhFOCwgMHhGOCwgMHhCRSwgMHhBNywgMHhFOCwgMHhGNSwgLyogMHgxMC0weDEzICovCisJMHhCRSwgMHhBOSwgMHhCRSwgMHhBQiwgMHgwMCwgMHgwMCwgMHhFOCwgMHhGNiwgLyogMHgxNC0weDE3ICovCisJMHhCRSwgMHhBOCwgMHgwMCwgMHgwMCwgMHhFOCwgMHhGNywgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHhFOCwgMHhGNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMCwgMHg3NiwgLyogMHgxQy0weDFGICovCisJMHhFQywgMHhCRCwgMHhDMCwgMHg3NywgMHhFQywgMHhCQiwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHhFQywgMHhCQywgMHhFQywgMHhCQSwgMHhFQywgMHhCOSwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHhFQywgMHhCRSwgMHhDMCwgMHg3NSwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHhFRiwgMHhCOCwgMHhFRiwgMHhCOSwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHhFNCwgMHhFOCwgMHhFRiwgMHhCNywgMHhDMCwgMHg3OCwgMHhDMywgMHg1RiwgLyogMHgzMC0weDMzICovCisJMHhGMSwgMHhFQiwgMHhGMSwgMHhFQywgMHgwMCwgMHgwMCwgMHhDNCwgMHhENywgLyogMHgzNC0weDM3ICovCisJMHhDNCwgMHhEOCwgMHhGNSwgMHhDMSwgMHhGNSwgMHhDMCwgMHhDNSwgMHg2QywgLyogMHgzOC0weDNCICovCisJMHhDNSwgMHg2QiwgMHhGNywgMHhEMCwgMHgwMCwgMHgwMCwgMHhBNCwgMHg0OSwgLyogMHgzQy0weDNGICovCisJMHhBNCwgMHg2MSwgMHhBNCwgMHhCOSwgMHgwMCwgMHgwMCwgMHhBNCwgMHhCOCwgLyogMHg0MC0weDQzICovCisJMHhBNSwgMHg1MywgMHhBNSwgMHg1MiwgMHhBNSwgMHhGQywgMHhBNSwgMHhGQiwgLyogMHg0NC0weDQ3ICovCisJMHhBNSwgMHhGRCwgMHhBNSwgMHhGQSwgMHgwMCwgMHgwMCwgMHhBNywgMHg0QSwgLyogMHg0OC0weDRCICovCisJMHhBNywgMHg0OSwgMHhBNywgMHg0QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBOCwgMHhFMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHhBOCwgMHhERiwgMHhBOCwgMHhFMSwgMHgwMCwgMHgwMCwgMHhBQiwgMHg1RSwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhBMiwgMHg1OSwgMHhEMCwgMHhERSwgMHhBMiwgMHg1QSwgLyogMHg1OC0weDVCICovCisJMHhCMCwgMHhDMiwgMHhBMiwgMHg1QywgMHhBMiwgMHg1QiwgMHhEOCwgMHg2MCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHhBMiwgMHg1RCwgMHhCOSwgMHhCOCwgMHhBMiwgMHg1RSwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHhBNCwgMHg0QSwgMHgwMCwgMHgwMCwgMHhBNCwgMHhCQSwgLyogMHg2NC0weDY3ICovCisJMHhBNSwgMHhGRSwgMHhBOCwgMHhFMiwgMHgwMCwgMHgwMCwgMHhBNCwgMHg0QiwgLyogMHg2OC0weDZCICovCisJMHhBNCwgMHhCRCwgMHhBNCwgMHhCQiwgMHhBNCwgMHhCQywgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHhBNiwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHhBNywgMHg0QywgMHhBOCwgMHhFNCwgMHhBOCwgMHhFMywgLyogMHg3NC0weDc3ICovCisJMHhBOCwgMHhFNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHhBRCwgMHhERCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHhCRSwgMHhBQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDOSwgMHg0RSwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHhBNSwgMHg1NCwgMHhBNSwgMHg1NSwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHhBNiwgMHg0MSwgMHgwMCwgMHgwMCwgMHhDQSwgMHg2QSwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHhBQiwgMHg2MCwgMHhBQiwgMHg1RiwgMHhEMCwgMHhFMCwgLyogMHg5MC0weDkzICovCisJMHhEMCwgMHhERiwgMHhCMCwgMHhDMywgMHgwMCwgMHgwMCwgMHhBNCwgMHhCRSwgLyogMHg5NC0weDk3ICovCisJMHhDOSwgMHg1NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQiwgMHhDRCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHhBQiwgMHg2MSwgMHgwMCwgMHgwMCwgMHhBRCwgMHhFMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHhBRCwgMHhERSwgMHhBRCwgMHhERiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCRSwgMHhBRCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHhBNSwgMHg1NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHhBNiwgMHg0MiwgMHhDOSwgMHhCQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNywgMHg0RCwgMHhBNywgMHg0RSwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHhDQSwgMHg2QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHhDQiwgMHhDRSwgMHhBOCwgMHhFNiwgMHhDQiwgMHhDRiwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHhEMCwgMHhFMiwgMHhEMCwgMHhFMywgMHhBRCwgMHhFMywgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHhEMCwgMHhFNCwgMHgwMCwgMHgwMCwgMHhEMCwgMHhFMSwgMHhBRCwgMHhFNCwgLyogMHhDOC0weENCICovCisJMHhBRCwgMHhFMiwgMHhBRCwgMHhFMSwgMHhEMCwgMHhFNSwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHhENCwgMHg2OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHhEOCwgMHg2MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQywgMHhDNSwgLyogMHhENC0weEQ3ICovCisJMHhFMSwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHhCQiwgMHhGRSwgMHhCRSwgMHhBRSwgMHhFOCwgMHhGOSwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHhBNCwgMHg0QywgMHhBNCwgMHg1QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHhCMCwgMHhDNCwgMHhCMywgMHhDRCwgMHgwMCwgMHgwMCwgMHhCOSwgMHhCOSwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHhDOSwgMHg0MiwgMHhBNCwgMHhCRiwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHhBNSwgMHg1OSwgMHhBNSwgMHg1NywgMHhBNSwgMHg1OCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHhBOCwgMHhFNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNTJbNTEyXSA9IHsKKwkweEE0LCAweDRELCAweEE0LCAweDRFLCAweDAwLCAweDAwLCAweEE0LCAweDYyLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE0LCAweEMwLCAweEE0LCAweEMxLCAvKiAweDA0LTB4MDcgKi8KKwkweEE0LCAweEMyLCAweEM5LCAweEJFLCAweEE1LCAweDVBLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweEM5LCAweDZCLCAweDAwLCAweDAwLCAweEE2LCAweDQ2LCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweEM5LCAweEJGLCAweEE2LCAweDQ0LCAweEE2LCAweDQ1LCAweEM5LCAweEJELCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE2LCAweDQ3LCAweEE2LCAweDQzLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweENBLCAweDZDLCAweEFBLCAweEVDLCAweENBLCAweDZELCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweENBLCAweDZFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweEE3LCAweDUwLCAweEE3LCAweDRGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweEE3LCAweDUzLCAweEE3LCAweDUxLCAweEE3LCAweDUyLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE4LCAweEVELCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweEE4LCAweEVDLCAweENCLCAweEQ0LCAweENCLCAweEQxLCAweENCLCAweEQyLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweENCLCAweEQwLCAweEE4LCAweEVFLCAweEE4LCAweEVBLCAvKiAweDM0LTB4MzcgKi8KKwkweEE4LCAweEU5LCAweDAwLCAweDAwLCAweEE4LCAweEVCLCAweEE4LCAweEU4LCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweEE4LCAweEVGLCAweDAwLCAweDAwLCAweEFCLCAweDYzLCAvKiAweDQwLTB4NDMgKi8KKwkweENELCAweEYwLCAweDAwLCAweDAwLCAweENCLCAweEQzLCAweEFCLCAweDY4LCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweENELCAweEYxLCAweEFCLCAweDY0LCAweEFCLCAweDY3LCAvKiAweDQ4LTB4NEIgKi8KKwkweEFCLCAweDY2LCAweEFCLCAweDY1LCAweEFCLCAweDYyLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQwLCAweEU4LCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweEFELCAweEU3LCAweEQwLCAweEVCLCAweEFELCAweEU1LCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQwLCAweEU3LCAweEFELCAweEU4LCAvKiAweDU4LTB4NUIgKi8KKwkweEFELCAweEU2LCAweEFELCAweEU5LCAweEQwLCAweEU5LCAweEQwLCAweEVBLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweEQwLCAweEU2LCAweEQwLCAweEVDLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweEIzLCAweEQxLCAweEIwLCAweEM1LCAweEQ0LCAweDY5LCAvKiAweDY4LTB4NkIgKi8KKwkweEQ0LCAweDZCLCAweEQ0LCAweDZBLCAweEQ0LCAweDZDLCAweEIwLCAweEM2LCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIzLCAweENFLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweEIzLCAweENGLCAweEIzLCAweEQwLCAweDAwLCAweDAwLCAweEI2LCAweEQwLCAvKiAweDc0LTB4NzcgKi8KKwkweERDLCAweEM3LCAweDAwLCAweDAwLCAweERDLCAweEM2LCAweERDLCAweEM4LCAvKiAweDc4LTB4N0IgKi8KKwkweERDLCAweEM5LCAweEI2LCAweEQxLCAweDAwLCAweDAwLCAweEI2LCAweENGLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEUxLCAweDQxLCAweEUxLCAweDQyLCAweEI5LCAweEJCLCAweEI5LCAweEJBLCAvKiAweDgwLTB4ODMgKi8KKwkweEUzLCAweDVBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJDLCAweDQwLCAvKiAweDg0LTB4ODcgKi8KKwkweEJDLCAweDQxLCAweEJDLCAweDQyLCAweEJDLCAweDQ0LCAweEU0LCAweEYyLCAvKiAweDg4LTB4OEIgKi8KKwkweEU0LCAweEYzLCAweEJDLCAweDQzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweEJFLCAweEFGLCAweDAwLCAweDAwLCAweEJFLCAweEIwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYxLCAweEVELCAweEY1LCAweEMzLCAvKiAweDk0LTB4OTcgKi8KKwkweEY1LCAweEMyLCAweEY3LCAweEQxLCAweDAwLCAweDAwLCAweEE0LCAweDRGLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE1LCAweDVDLCAvKiAweDlDLTB4OUYgKi8KKwkweEE1LCAweDVCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE2LCAweDQ4LCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEM5LCAweEMwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweEE3LCAweDU1LCAweEE3LCAweDU2LCAweEE3LCAweDU0LCAvKiAweEE4LTB4QUIgKi8KKwkweEE3LCAweDU3LCAweENBLCAweDZGLCAweENBLCAweDcwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE4LCAweEYxLCAvKiAweEI4LTB4QkIgKi8KKwkweENCLCAweEQ1LCAweDAwLCAweDAwLCAweEE4LCAweEYwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweENELCAweEYyLCAweEFCLCAweDZDLCAweENELCAweEYzLCAweEFCLCAweDZCLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEFCLCAweDY5LCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweEFCLCAweDZBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweEQwLCAweEVELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIwLCAweEM3LCAweEQ0LCAweDZFLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweEIwLCAweENBLCAweEQ0LCAweDZELCAweEIxLCAweEU1LCAvKiAweEQ0LTB4RDcgKi8KKwkweEIwLCAweEM5LCAweEIwLCAweEM4LCAweDAwLCAweDAwLCAweEIzLCAweEQ0LCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweEIzLCAweEQzLCAweEIzLCAweEQyLCAweEI2LCAweEQyLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI2LCAweEQ1LCAweEI2LCAweEQ2LCAvKiAweEUwLTB4RTMgKi8KKwkweEI2LCAweEQ0LCAweDAwLCAweDAwLCAweEI2LCAweEQzLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweDQzLCAweDAwLCAweDAwLCAweEUxLCAweDQ0LCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweEY1LCAvKiAweEVDLTB4RUYgKi8KKwkweEJDLCAweDQ1LCAweEU0LCAweEY0LCAweDAwLCAweDAwLCAweEJFLCAweEIxLCAvKiAweEYwLTB4RjMgKi8KKwkweEVDLCAweEJGLCAweEMwLCAweDc5LCAweDAwLCAweDAwLCAweEYxLCAweEVFLCAvKiAweEY0LTB4RjcgKi8KKwkweEM0LCAweDU1LCAweDAwLCAweDAwLCAweEE0LCAweDYzLCAweEE0LCAweEMzLCAvKiAweEY4LTB4RkIgKi8KKwkweEM5LCAweDU2LCAweDAwLCAweDAwLCAweEE0LCAweEM0LCAweEE0LCAweEM1LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181M1s1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4QTUsIDB4NUQsIDB4QTUsIDB4NUUsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4QTYsIDB4NDksIDB4Q0EsIDB4NzEsIDB4Q0IsIDB4RDYsIDB4Q0IsIDB4RDcsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4QUIsIDB4NkQsIDB4RDAsIDB4RUUsIDB4QjAsIDB4Q0MsIC8qIDB4MEMtMHgwRiAqLworCTB4QjAsIDB4Q0IsIDB4RDgsIDB4NjMsIDB4RDgsIDB4NjIsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4QTQsIDB4NTAsIDB4QTQsIDB4QzYsIDB4QTUsIDB4NUYsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4QjAsIDB4Q0QsIDB4QzksIDB4NDMsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4QzksIDB4NkMsIDB4QTUsIDB4NjAsIDB4MDAsIDB4MDAsIDB4QzksIDB4QzIsIC8qIDB4MUMtMHgxRiAqLworCTB4QTYsIDB4NEIsIDB4QTYsIDB4NEEsIDB4QzksIDB4QzEsIDB4QTcsIDB4NTgsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QUQsIDB4RUEsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4RDQsIDB4NkYsIDB4MDAsIDB4MDAsIDB4QjYsIDB4RDcsIC8qIDB4MkMtMHgyRiAqLworCTB4RTEsIDB4NDUsIDB4QjksIDB4QkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4RTgsIDB4RkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjMsIDB4RkQsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4QTQsIDB4QzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4Q0IsIDB4RDgsIDB4Q0QsIDB4RjQsIDB4QjAsIDB4RDAsIDB4QjAsIDB4Q0UsIC8qIDB4M0MtMHgzRiAqLworCTB4QjAsIDB4Q0YsIDB4QTQsIDB4NTEsIDB4MDAsIDB4MDAsIDB4QTQsIDB4NjQsIC8qIDB4NDAtMHg0MyAqLworCTB4QTIsIDB4Q0QsIDB4QTQsIDB4Q0EsIDB4MDAsIDB4MDAsIDB4QTQsIDB4QzksIC8qIDB4NDQtMHg0NyAqLworCTB4QTQsIDB4QzgsIDB4QTUsIDB4NjMsIDB4QTUsIDB4NjIsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4QzksIDB4NkQsIDB4QzksIDB4QzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4QTgsIDB4RjUsIDB4QTgsIDB4RjIsIDB4QTgsIDB4RjQsIC8qIDB4NTAtMHg1MyAqLworCTB4QTgsIDB4RjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QUIsIDB4NkUsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjMsIDB4RDUsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4QTQsIDB4NTIsIDB4MDAsIDB4MDAsIDB4QTQsIDB4Q0IsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4QTUsIDB4NjUsIDB4QTUsIDB4NjQsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4NzIsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTgsIDB4RjYsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4QzksIDB4NTcsIDB4MDAsIDB4MDAsIDB4QTUsIDB4NjcsIDB4QTUsIDB4NjYsIC8qIDB4NkMtMHg2RiAqLworCTB4QTYsIDB4NEMsIDB4QTYsIDB4NEQsIDB4Q0EsIDB4NzMsIDB4QTcsIDB4NTksIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4QTcsIDB4NUEsIDB4MDAsIDB4MDAsIDB4QTgsIDB4RjcsIC8qIDB4NzQtMHg3NyAqLworCTB4QTgsIDB4RjgsIDB4QTgsIDB4RjksIDB4MDAsIDB4MDAsIDB4QUIsIDB4NkYsIC8qIDB4NzgtMHg3QiAqLworCTB4Q0QsIDB4RjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QUQsIDB4RUIsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzksIDB4NDQsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4QTQsIDB4Q0MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzksIDB4QzQsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4NzQsIDB4Q0EsIDB4NzUsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0IsIDB4RDksIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4Q0IsIDB4REEsIDB4MDAsIDB4MDAsIDB4Q0QsIDB4RjcsIDB4Q0QsIDB4RjYsIC8qIDB4OTQtMHg5NyAqLworCTB4Q0QsIDB4RjksIDB4Q0QsIDB4RjgsIDB4QUIsIDB4NzAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4RDQsIDB4NzAsIDB4QUQsIDB4RUQsIDB4RDAsIDB4RUYsIDB4QUQsIDB4RUMsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4RDgsIDB4NjQsIDB4QjMsIDB4RDYsIDB4MDAsIDB4MDAsIDB4RDgsIDB4NjUsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4RTEsIDB4NDYsIDB4QjksIDB4QkQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkMsIDB4NDYsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4RjEsIDB4RUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4QzksIDB4NTgsIDB4MDAsIDB4MDAsIDB4QTUsIDB4NjgsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjAsIDB4RDEsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4QTQsIDB4NTMsIDB4QTQsIDB4NjUsIDB4QTQsIDB4Q0UsIDB4QTQsIDB4Q0QsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4QTQsIDB4Q0YsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4QTgsIDB4RkIsIDB4MDAsIDB4MDAsIDB4QTgsIDB4RkEsIDB4QTgsIDB4RkMsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QUIsIDB4NzEsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QUQsIDB4RUUsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4RkIsIDB4QzIsIDB4NEYsIDB4QTQsIDB4NjYsIC8qIDB4RTAtMHhFMyAqLworCTB4QTUsIDB4NkEsIDB4QTUsIDB4NzksIDB4QTUsIDB4NzQsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4QTUsIDB4NkYsIDB4QTUsIDB4NkUsIDB4QTUsIDB4NzUsIDB4QTUsIDB4NzMsIC8qIDB4RTgtMHhFQiAqLworCTB4QTUsIDB4NkMsIDB4QTUsIDB4N0EsIDB4QTUsIDB4NkQsIDB4QTUsIDB4NjksIC8qIDB4RUMtMHhFRiAqLworCTB4QTUsIDB4NzgsIDB4QTUsIDB4NzcsIDB4QTUsIDB4NzYsIDB4QTUsIDB4NkIsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4QTUsIDB4NzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4QTUsIDB4NzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTUsIDB4N0IsIC8qIDB4RjgtMHhGQiAqLworCTB4QTUsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzU0WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHhBNiwgMHg1MywgMHgwMCwgMHgwMCwgMHhBNiwgMHg1OSwgLyogMHgwMC0weDAzICovCisJMHhBNiwgMHg1NSwgMHgwMCwgMHgwMCwgMHhBNiwgMHg1QiwgMHhDOSwgMHhDNSwgLyogMHgwNC0weDA3ICovCisJMHhBNiwgMHg1OCwgMHhBNiwgMHg0RSwgMHhBNiwgMHg1MSwgMHhBNiwgMHg1NCwgLyogMHgwOC0weDBCICovCisJMHhBNiwgMHg1MCwgMHhBNiwgMHg1NywgMHhBNiwgMHg1QSwgMHhBNiwgMHg0RiwgLyogMHgwQy0weDBGICovCisJMHhBNiwgMHg1MiwgMHhBNiwgMHg1NiwgMHhBNiwgMHg1QywgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHhDQSwgMHg3RSwgMHhDQSwgMHg3QiwgMHgwMCwgMHgwMCwgMHhBNywgMHg2NywgLyogMHgxOC0weDFCICovCisJMHhDQSwgMHg3QywgMHhBNywgMHg1QiwgMHhBNywgMHg1RCwgMHhBNywgMHg3NSwgLyogMHgxQy0weDFGICovCisJMHhBNywgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHhDQSwgMHhBNSwgMHhDQSwgMHg3RCwgMHhBNywgMHg1RiwgMHhBNywgMHg2MSwgLyogMHgyNC0weDI3ICovCisJMHhDQSwgMHhBNCwgMHhBNywgMHg2OCwgMHhDQSwgMHg3OCwgMHhBNywgMHg3NCwgLyogMHgyOC0weDJCICovCisJMHhBNywgMHg3NiwgMHhBNywgMHg1QywgMHhBNywgMHg2RCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHhDQSwgMHg3NiwgMHhBNywgMHg3MywgMHgwMCwgMHgwMCwgMHhBNywgMHg2NCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHhBNywgMHg2RSwgMHhBNywgMHg2RiwgMHhDQSwgMHg3NywgLyogMHgzNC0weDM3ICovCisJMHhBNywgMHg2QywgMHhBNywgMHg2QSwgMHgwMCwgMHgwMCwgMHhBNywgMHg2QiwgLyogMHgzOC0weDNCICovCisJMHhBNywgMHg3MSwgMHhDQSwgMHhBMSwgMHhBNywgMHg1RSwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHhBNywgMHg3MiwgMHhDQSwgMHhBMywgMHhBNywgMHg2NiwgMHhBNywgMHg2MywgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHhDQSwgMHg3QSwgMHhBNywgMHg2MiwgMHhDQSwgMHhBNiwgLyogMHg0NC0weDQ3ICovCisJMHhBNywgMHg2NSwgMHgwMCwgMHgwMCwgMHhBNywgMHg2OSwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNywgMHg2MCwgMHhDQSwgMHhBMiwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHhDQSwgMHg3OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHhDQiwgMHhFQiwgMHhDQiwgMHhFQSwgMHhBOSwgMHg0RiwgMHhDQiwgMHhFRCwgLyogMHg2MC0weDYzICovCisJMHhDQiwgMHhFRiwgMHhDQiwgMHhFNCwgMHhDQiwgMHhFNywgMHhDQiwgMHhFRSwgLyogMHg2NC0weDY3ICovCisJMHhBOSwgMHg1MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQiwgMHhFMSwgLyogMHg2OC0weDZCICovCisJMHhDQiwgMHhFNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQiwgMHhFOSwgLyogMHg2Qy0weDZGICovCisJMHhDRSwgMHg0OSwgMHhBOSwgMHg0QiwgMHhDRSwgMHg0RCwgMHhBOCwgMHhGRCwgLyogMHg3MC0weDczICovCisJMHhDQiwgMHhFNiwgMHhBOCwgMHhGRSwgMHhBOSwgMHg0QywgMHhBOSwgMHg0NSwgLyogMHg3NC0weDc3ICovCisJMHhBOSwgMHg0MSwgMHgwMCwgMHgwMCwgMHhDQiwgMHhFMiwgMHhBOSwgMHg0NCwgLyogMHg3OC0weDdCICovCisJMHhBOSwgMHg0OSwgMHhBOSwgMHg1MiwgMHhDQiwgMHhFMywgMHhDQiwgMHhEQywgLyogMHg3Qy0weDdGICovCisJCisJMHhBOSwgMHg0MywgMHhDQiwgMHhERCwgMHhDQiwgMHhERiwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHhBOSwgMHg0NiwgMHgwMCwgMHgwMCwgMHhBOSwgMHg0OCwgMHhDQiwgMHhEQiwgLyogMHg4NC0weDg3ICovCisJMHhDQiwgMHhFMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBOSwgMHg1MSwgLyogMHg4OC0weDhCICovCisJMHhBOSwgMHg0RCwgMHhDQiwgMHhFOCwgMHhBOSwgMHg1MywgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHhBOSwgMHg0QSwgMHhDQiwgMHhERSwgMHhBOSwgMHg0NywgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHhBOSwgMHg0MiwgMHhBOSwgMHg0MCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHhDQiwgMHhFQywgMHgwMCwgMHgwMCwgMHhBOSwgMHg0RSwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHhDRSwgMHg0OCwgMHhDRCwgMHhGQiwgMHhDRSwgMHg0QiwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHhDRCwgMHhGRCwgMHhBQiwgMHg3OCwgMHhBQiwgMHhBOCwgLyogMHhBNC0weEE3ICovCisJMHhBQiwgMHg3NCwgMHhBQiwgMHhBNywgMHhBQiwgMHg3RCwgMHhBQiwgMHhBNCwgLyogMHhBOC0weEFCICovCisJMHhBQiwgMHg3MiwgMHhDRCwgMHhGQywgMHhDRSwgMHg0MywgMHhBQiwgMHhBMywgLyogMHhBQy0weEFGICovCisJMHhDRSwgMHg0RiwgMHhBQiwgMHhBNSwgMHgwMCwgMHgwMCwgMHhBQiwgMHg3OSwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRSwgMHg0NSwgMHhDRSwgMHg0MiwgLyogMHhCNC0weEI3ICovCisJMHhBQiwgMHg3NywgMHgwMCwgMHgwMCwgMHhDRCwgMHhGQSwgMHhBQiwgMHhBNiwgLyogMHhCOC0weEJCICovCisJMHhDRSwgMHg0QSwgMHhBQiwgMHg3QywgMHhDRSwgMHg0QywgMHhBQiwgMHhBOSwgLyogMHhCQy0weEJGICovCisJMHhBQiwgMHg3MywgMHhBQiwgMHg3RSwgMHhBQiwgMHg3QiwgMHhDRSwgMHg0MCwgLyogMHhDMC0weEMzICovCisJMHhBQiwgMHhBMSwgMHhDRSwgMHg0NiwgMHhDRSwgMHg0NywgMHhBQiwgMHg3QSwgLyogMHhDNC0weEM3ICovCisJMHhBQiwgMHhBMiwgMHhBQiwgMHg3NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBQiwgMHg3NSwgMHhDRCwgMHhGRSwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRSwgMHg0NCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRSwgMHg0RSwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHhEMSwgMHg0NCwgMHhBRCwgMHhGQiwgMHhEMCwgMHhGMSwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHhEMCwgMHhGNiwgMHhBRCwgMHhGNCwgMHhBRSwgMHg0MCwgMHhEMCwgMHhGNCwgLyogMHhFNC0weEU3ICovCisJMHhBRCwgMHhFRiwgMHhBRCwgMHhGOSwgMHhBRCwgMHhGRSwgMHhEMCwgMHhGQiwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHhBRCwgMHhGQSwgMHhBRCwgMHhGRCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHhEMCwgMHhGRSwgMHhBRCwgMHhGNSwgMHhEMCwgMHhGNSwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMSwgMHg0MiwgLyogMHhGNC0weEY3ICovCisJMHhEMSwgMHg0MywgMHgwMCwgMHgwMCwgMHhBRCwgMHhGNywgMHhEMSwgMHg0MSwgLyogMHhGOC0weEZCICovCisJMHhBRCwgMHhGMywgMHhBRSwgMHg0MywgMHgwMCwgMHgwMCwgMHhEMCwgMHhGOCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNTVbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweEFELCAweEYxLCAweDAwLCAweDAwLCAweEQxLCAweDQ2LCAvKiAweDAwLTB4MDMgKi8KKwkweEQwLCAweEY5LCAweEQwLCAweEZELCAweEFELCAweEY2LCAweEFFLCAweDQyLCAvKiAweDA0LTB4MDcgKi8KKwkweEQwLCAweEZBLCAweEFELCAweEZDLCAweEQxLCAweDQwLCAweEQxLCAweDQ3LCAvKiAweDA4LTB4MEIgKi8KKwkweEQ0LCAweEExLCAweDAwLCAweDAwLCAweEQxLCAweDQ1LCAweEFFLCAweDQ0LCAvKiAweDBDLTB4MEYgKi8KKwkweEFELCAweEYwLCAweEQwLCAweEZDLCAweEQwLCAweEYzLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweEFELCAweEY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQwLCAweEYyLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQwLCAweEY3LCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQwLCAweEYwLCAweEFFLCAweDQxLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ0LCAweDc3LCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweEIwLCAweEU0LCAweEQ0LCAweEE3LCAweEIwLCAweEUyLCAweEIwLCAweERGLCAvKiAweDJDLTB4MkYgKi8KKwkweEQ0LCAweDdDLCAweEIwLCAweERCLCAweEQ0LCAweEEyLCAweEIwLCAweEU2LCAvKiAweDMwLTB4MzMgKi8KKwkweEQ0LCAweDc2LCAweEQ0LCAweDdCLCAweEQ0LCAweDdBLCAweEFELCAweEYyLCAvKiAweDM0LTB4MzcgKi8KKwkweEIwLCAweEUxLCAweEQ0LCAweEE1LCAweDAwLCAweDAwLCAweEQ0LCAweEE4LCAvKiAweDM4LTB4M0IgKi8KKwkweEQ0LCAweDczLCAweDAwLCAweDAwLCAweEIzLCAweEU4LCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweEQ0LCAweEE5LCAweEIwLCAweEU3LCAweDAwLCAweDAwLCAweEIwLCAweEQ5LCAvKiAweDQwLTB4NDMgKi8KKwkweEIwLCAweEQ2LCAweEQ0LCAweDdFLCAweEIwLCAweEQzLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweEQ0LCAweEE2LCAweDAwLCAweDAwLCAweEIwLCAweERBLCAweEQ0LCAweEFBLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweEQ0LCAweDc0LCAweEQ0LCAweEE0LCAweEIwLCAweERELCAvKiAweDRDLTB4NEYgKi8KKwkweEQ0LCAweDc1LCAweEQ0LCAweDc4LCAweEQ0LCAweDdELCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweEIwLCAweERFLCAweEIwLCAweERDLCAweEIwLCAweEU4LCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweEIwLCAweEUzLCAweDAwLCAweDAwLCAweEIwLCAweEQ3LCAweEIxLCAweEQyLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweEIwLCAweEQ4LCAweEQ0LCAweDc5LCAweEIwLCAweEU1LCAvKiAweDYwLTB4NjMgKi8KKwkweEIwLCAweEUwLCAweEQ0LCAweEEzLCAweEIwLCAweEQ1LCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIwLCAweEQ0LCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweEQ0LCAweDcxLCAweEQ0LCAweDcyLCAweEQ4LCAweDZBLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIzLCAweEQ3LCAvKiAweDc4LTB4N0IgKi8KKwkweEIzLCAweERBLCAweEQ4LCAweDc1LCAweEIzLCAweEVFLCAweEQ4LCAweDc4LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEIzLCAweEQ4LCAweEQ4LCAweDcxLCAweEIzLCAweERFLCAweEIzLCAweEU0LCAvKiAweDgwLTB4ODMgKi8KKwkweEI1LCAweEJELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIzLCAweEUyLCAvKiAweDg0LTB4ODcgKi8KKwkweEQ4LCAweDZFLCAweEIzLCAweEVGLCAweEIzLCAweERCLCAweEIzLCAweEUzLCAvKiAweDg4LTB4OEIgKi8KKwkweEQ4LCAweDc2LCAweERDLCAweEQ3LCAweEQ4LCAweDdCLCAweEQ4LCAweDZGLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweEQ4LCAweDY2LCAweEQ4LCAweDczLCAweEQ4LCAweDZELCAvKiAweDkwLTB4OTMgKi8KKwkweEIzLCAweEUxLCAweEQ4LCAweDc5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweEIzLCAweERELCAweEIzLCAweEYxLCAweEIzLCAweEVBLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweEIzLCAweERGLCAweEIzLCAweERDLCAweDAwLCAweDAwLCAweEIzLCAweEU3LCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweEQ4LCAweDdBLCAweEQ4LCAweDZDLCAweEQ4LCAweDcyLCAvKiAweEEwLTB4QTMgKi8KKwkweEQ4LCAweDc0LCAweEQ4LCAweDY4LCAweEQ4LCAweDc3LCAweEIzLCAweEQ5LCAvKiAweEE0LTB4QTcgKi8KKwkweEQ4LCAweDY3LCAweDAwLCAweDAwLCAweEIzLCAweEUwLCAweEIzLCAweEYwLCAvKiAweEE4LTB4QUIgKi8KKwkweEIzLCAweEVDLCAweEQ4LCAweDY5LCAweEIzLCAweEU2LCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweEIzLCAweEVELCAweEIzLCAweEU5LCAweEIzLCAweEU1LCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweEQ4LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIzLCAweEVCLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERDLCAweEQ1LCAvKiAweEJDLTB4QkYgKi8KKwkweERDLCAweEQxLCAweDAwLCAweDAwLCAweERDLCAweEUwLCAweERDLCAweENBLCAvKiAweEMwLTB4QzMgKi8KKwkweERDLCAweEQzLCAweEI2LCAweEU1LCAweEI2LCAweEU2LCAweEI2LCAweERFLCAvKiAweEM0LTB4QzcgKi8KKwkweERDLCAweERDLCAweEI2LCAweEU4LCAweERDLCAweENGLCAweERDLCAweENFLCAvKiAweEM4LTB4Q0IgKi8KKwkweERDLCAweENDLCAweERDLCAweERFLCAweEI2LCAweERDLCAweERDLCAweEQ4LCAvKiAweENDLTB4Q0YgKi8KKwkweERDLCAweENELCAweEI2LCAweERGLCAweERDLCAweEQ2LCAweEI2LCAweERBLCAvKiAweEQwLTB4RDMgKi8KKwkweERDLCAweEQyLCAweERDLCAweEQ5LCAweERDLCAweERCLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweERDLCAweERGLCAweEI2LCAweEUzLCAweERDLCAweENCLCAvKiAweEQ4LTB4REIgKi8KKwkweEI2LCAweERELCAweERDLCAweEQwLCAweDAwLCAweDAwLCAweEI2LCAweEQ4LCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweEI2LCAweEU0LCAweERDLCAweERBLCAweEI2LCAweEUwLCAvKiAweEUwLTB4RTMgKi8KKwkweEI2LCAweEUxLCAweEI2LCAweEU3LCAweEI2LCAweERCLCAweEEyLCAweDVGLCAvKiAweEU0LTB4RTcgKi8KKwkweEI2LCAweEQ5LCAweERDLCAweEQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI2LCAweEUyLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERDLCAweERELCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI5LCAweENELCAweEI5LCAweEM4LCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweDU1LCAweEUxLCAweDUxLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweEUxLCAweDRCLCAweEI5LCAweEMyLCAweEI5LCAweEJFLCAweEUxLCAweDU0LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181Nls1MTJdID0geworCTB4QjksIDB4QkYsIDB4RTEsIDB4NEUsIDB4RTEsIDB4NTAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4RTEsIDB4NTMsIDB4MDAsIDB4MDAsIDB4QjksIDB4QzQsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4QjksIDB4Q0IsIDB4QjksIDB4QzUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4RTEsIDB4NDksIDB4QjksIDB4QzYsIDB4QjksIDB4QzcsIDB4RTEsIDB4NEMsIC8qIDB4MEMtMHgwRiAqLworCTB4QjksIDB4Q0MsIDB4MDAsIDB4MDAsIDB4RTEsIDB4NEEsIDB4RTEsIDB4NEYsIC8qIDB4MTAtMHgxMyAqLworCTB4QjksIDB4QzMsIDB4RTEsIDB4NDgsIDB4QjksIDB4QzksIDB4QjksIDB4QzEsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjksIDB4QzAsIC8qIDB4MTgtMHgxQiAqLworCTB4RTEsIDB4NEQsIDB4RTEsIDB4NTIsIDB4MDAsIDB4MDAsIDB4QjksIDB4Q0EsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4NDcsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4QkMsIDB4NEQsIDB4RTUsIDB4NDcsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4RTUsIDB4NDQsIDB4MDAsIDB4MDAsIDB4QkMsIDB4NDcsIDB4QkMsIDB4NTMsIC8qIDB4MkMtMHgyRiAqLworCTB4QkMsIDB4NTQsIDB4MDAsIDB4MDAsIDB4QkMsIDB4NEEsIDB4RTUsIDB4NDIsIC8qIDB4MzAtMHgzMyAqLworCTB4QkMsIDB4NEMsIDB4RTQsIDB4RjksIDB4QkMsIDB4NTIsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4RTUsIDB4NDYsIDB4QkMsIDB4NDksIDB4RTUsIDB4NDgsIDB4QkMsIDB4NDgsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4NDMsIDB4RTUsIDB4NDUsIDB4QkMsIDB4NEIsIC8qIDB4M0MtMHgzRiAqLworCTB4RTUsIDB4NDEsIDB4RTQsIDB4RkEsIDB4RTQsIDB4RjcsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4RDgsIDB4NkIsIDB4RTQsIDB4RkQsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4RTQsIDB4RjYsIDB4RTQsIDB4RkMsIDB4RTQsIDB4RkIsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4RTQsIDB4RjgsIDB4MDAsIDB4MDAsIDB4QkMsIDB4NEYsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkMsIDB4NEUsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkMsIDB4NTAsIC8qIDB4NTQtMHg1NyAqLworCTB4RTQsIDB4RkUsIDB4QkUsIDB4QjIsIDB4RTUsIDB4NDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4NDUsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4RTgsIDB4RkQsIDB4MDAsIDB4MDAsIDB4QkUsIDB4QkUsIDB4RTksIDB4NDIsIC8qIDB4NjAtMHg2MyAqLworCTB4QkUsIDB4QjYsIDB4QkUsIDB4QkEsIDB4RTksIDB4NDEsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4QkUsIDB4QjksIDB4QkUsIDB4QjUsIDB4QkUsIDB4QjgsIDB4QkUsIDB4QjMsIC8qIDB4NjgtMHg2QiAqLworCTB4QkUsIDB4QkQsIDB4RTksIDB4NDMsIDB4RTgsIDB4RkUsIDB4QkUsIDB4QkMsIC8qIDB4NkMtMHg2RiAqLworCTB4RTgsIDB4RkMsIDB4QkUsIDB4QkIsIDB4RTksIDB4NDQsIDB4RTksIDB4NDAsIC8qIDB4NzAtMHg3MyAqLworCTB4QkMsIDB4NTEsIDB4MDAsIDB4MDAsIDB4QkUsIDB4QkYsIDB4RTksIDB4NDYsIC8qIDB4NzQtMHg3NyAqLworCTB4QkUsIDB4QjcsIDB4QkUsIDB4QjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUMsIDB4QzYsIDB4RUMsIDB4QzgsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QzAsIDB4N0IsIDB4RUMsIDB4QzksIDB4RUMsIDB4QzcsIDB4RUMsIDB4QzUsIC8qIDB4ODAtMHg4MyAqLworCTB4RUMsIDB4QzQsIDB4QzAsIDB4N0QsIDB4RUMsIDB4QzMsIDB4QzAsIDB4N0UsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4RUMsIDB4QzEsIDB4RUMsIDB4QzIsIDB4QzAsIDB4N0EsIDB4QzAsIDB4QTEsIC8qIDB4OEMtMHg4RiAqLworCTB4QzAsIDB4N0MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUMsIDB4QzAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4QzIsIDB4NTAsIDB4MDAsIDB4MDAsIDB4RUYsIDB4QkMsIC8qIDB4OTQtMHg5NyAqLworCTB4RUYsIDB4QkEsIDB4RUYsIDB4QkYsIDB4RUYsIDB4QkQsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4RUYsIDB4QkIsIDB4RUYsIDB4QkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4QzMsIDB4NjAsIDB4RjEsIDB4RjIsIDB4RjEsIDB4RjMsIC8qIDB4QTQtMHhBNyAqLworCTB4QzQsIDB4NTYsIDB4MDAsIDB4MDAsIDB4RjEsIDB4RjQsIDB4RjEsIDB4RjAsIC8qIDB4QTgtMHhBQiAqLworCTB4RjEsIDB4RjUsIDB4RjEsIDB4RjEsIDB4QzIsIDB4NTEsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjMsIDB4RkUsIDB4RjQsIDB4NDEsIC8qIDB4QjAtMHhCMyAqLworCTB4QzQsIDB4NTksIDB4RjQsIDB4NDAsIDB4QzQsIDB4NTgsIDB4QzQsIDB4NTcsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4QzQsIDB4NUEsIDB4RjUsIDB4QzUsIDB4RjUsIDB4QzYsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4QzQsIDB4REEsIDB4QzQsIDB4RDksIDB4QzQsIDB4REIsIDB4RjUsIDB4QzQsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4RjYsIDB4RDgsIDB4RjYsIDB4RDcsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4QzUsIDB4NkQsIDB4QzUsIDB4NkYsIDB4QzUsIDB4NkUsIDB4RjYsIDB4RDksIC8qIDB4QzgtMHhDQiAqLworCTB4QzUsIDB4QzgsIDB4RjgsIDB4QTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4QzUsIDB4RjEsIDB4MDAsIDB4MDAsIDB4RjgsIDB4QTUsIC8qIDB4RDAtMHhEMyAqLworCTB4RjgsIDB4RUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzksIDB4NDksIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTUsIDB4N0QsIDB4QTUsIDB4N0MsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4QTYsIDB4NUYsIDB4QTYsIDB4NUUsIDB4QzksIDB4QzcsIC8qIDB4REMtMHhERiAqLworCTB4QTYsIDB4NUQsIDB4QzksIDB4QzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4QTcsIDB4NzksIDB4Q0EsIDB4QTksIDB4MDAsIDB4MDAsIDB4Q0EsIDB4QTgsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTcsIDB4NzcsIDB4QTcsIDB4N0EsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4QTcsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4QTcsIDB4NzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0IsIDB4RjAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4Q0IsIDB4RjEsIDB4QTksIDB4NTQsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QUIsIDB4QUEsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzU3WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHhEMSwgMHg0OCwgMHhEMSwgMHg0OSwgMHhBRSwgMHg0NSwgLyogMHgwMC0weDAzICovCisJMHhBRSwgMHg0NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENCwgMHhBQywgLyogMHgwNC0weDA3ICovCisJMHhCMCwgMHhFOSwgMHhCMCwgMHhFQiwgMHhENCwgMHhBQiwgMHhCMCwgMHhFQSwgLyogMHgwOC0weDBCICovCisJMHhEOCwgMHg3QywgMHhCMywgMHhGMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCNiwgMHhFOSwgMHhCNiwgMHhFQSwgLyogMHgxMC0weDEzICovCisJMHhEQywgMHhFMSwgMHgwMCwgMHgwMCwgMHhCOSwgMHhDRiwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHhCOSwgMHhDRSwgMHgwMCwgMHgwMCwgMHhFNSwgMHg0OSwgMHhFOSwgMHg0OCwgLyogMHgxOC0weDFCICovCisJMHhFOSwgMHg0NywgMHgwMCwgMHgwMCwgMHhGOSwgMHg2QiwgMHhBNCwgMHg2NywgLyogMHgxQy0weDFGICovCisJMHhDOSwgMHg1OSwgMHgwMCwgMHgwMCwgMHhDOSwgMHg2RSwgMHhDOSwgMHg2RiwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHhBNiwgMHg2MiwgMHhBNiwgMHg2NiwgMHhDOSwgMHhDOSwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHhBNiwgMHg2NCwgMHhBNiwgMHg2MywgMHhDOSwgMHhDOCwgMHhBNiwgMHg2NSwgLyogMHgyQy0weDJGICovCisJMHhBNiwgMHg2MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNiwgMHg2MCwgLyogMHgzMC0weDMzICovCisJMHhDOSwgMHhDQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNywgMHhBNiwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNywgMHhBMywgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHhBNywgMHg3RCwgMHhDQSwgMHhBQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHhDQSwgMHhBQiwgMHgwMCwgMHgwMCwgMHhBNywgMHhBMSwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHhDQSwgMHhBRCwgMHhBNywgMHg3QiwgMHhDQSwgMHhBRSwgLyogMHg0OC0weDRCICovCisJMHhDQSwgMHhBQywgMHhBNywgMHg3RSwgMHhBNywgMHhBMiwgMHhBNywgMHhBNSwgLyogMHg0Qy0weDRGICovCisJMHhBNywgMHhBNCwgMHhBNywgMHg3QywgMHhDQSwgMHhBRiwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHhBOSwgMHg1OSwgMHhDQiwgMHhGRSwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHhBOSwgMHg1QiwgMHgwMCwgMHgwMCwgMHhBOSwgMHg1QSwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHhDQywgMHg0MCwgMHhBOSwgMHg1OCwgMHhBOSwgMHg1NywgMHhDQiwgMHhGNSwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHhDQiwgMHhGNCwgMHgwMCwgMHgwMCwgMHhDQiwgMHhGMiwgLyogMHg2Qy0weDZGICovCisJMHhDQiwgMHhGNywgMHhDQiwgMHhGNiwgMHhDQiwgMHhGMywgMHhDQiwgMHhGQywgLyogMHg3MC0weDczICovCisJMHhDQiwgMHhGRCwgMHhDQiwgMHhGQSwgMHhDQiwgMHhGOCwgMHhBOSwgMHg1NiwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQiwgMHhGQiwgLyogMHg3OC0weDdCICovCisJMHhBOSwgMHg1QywgMHhDQywgMHg0MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHhDQiwgMHhGOSwgMHgwMCwgMHgwMCwgMHhBQiwgMHhBQiwgMHhBOSwgMHg1NSwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBQiwgMHhBQywgLyogMHg4OC0weDhCICovCisJMHhDRSwgMHg1NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRSwgMHg1QSwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBQiwgMHhCMiwgLyogMHg5MC0weDkzICovCisJMHhDRSwgMHg1OCwgMHhDRSwgMHg1RSwgMHgwMCwgMHgwMCwgMHhDRSwgMHg1NSwgLyogMHg5NC0weDk3ICovCisJMHhDRSwgMHg1OSwgMHhDRSwgMHg1QiwgMHhDRSwgMHg1RCwgMHhDRSwgMHg1NywgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHhDRSwgMHg1NiwgMHhDRSwgMHg1MSwgMHhDRSwgMHg1MiwgLyogMHg5Qy0weDlGICovCisJMHhBQiwgMHhBRCwgMHgwMCwgMHgwMCwgMHhBQiwgMHhBRiwgMHhBQiwgMHhBRSwgLyogMHhBMC0weEEzICovCisJMHhDRSwgMHg1MywgMHhDRSwgMHg1QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBQiwgMHhCMSwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHhDRSwgMHg1MCwgMHhEMSwgMHg1MywgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHhEMSwgMHg1MiwgMHhEMSwgMHg1NywgMHhEMSwgMHg0RSwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHhEMSwgMHg1MSwgMHhEMSwgMHg1MCwgMHgwMCwgMHgwMCwgMHhEMSwgMHg1NCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHhEMSwgMHg1OCwgMHhBRSwgMHg0NywgMHhBRSwgMHg0QSwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMSwgMHg0RiwgMHhEMSwgMHg1NSwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBRSwgMHg0OSwgLyogMHhDOC0weENCICovCisJMHhEMSwgMHg0QSwgMHgwMCwgMHgwMCwgMHhBQiwgMHhCMCwgMHhENCwgMHhCQSwgLyogMHhDQy0weENGICovCisJMHhEMSwgMHg1NiwgMHgwMCwgMHgwMCwgMHhEMSwgMHg0RCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHhBRSwgMHg0OCwgMHhEMSwgMHg0QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHhENCwgMHhCMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMCwgMHhFQywgLyogMHhEQy0weERGICovCisJMHhCMCwgMHhGMCwgMHhENCwgMHhDMSwgMHhENCwgMHhBRiwgMHhENCwgMHhCRCwgLyogMHhFMC0weEUzICovCisJMHhCMCwgMHhGMSwgMHhENCwgMHhCRiwgMHgwMCwgMHgwMCwgMHhENCwgMHhDNSwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHhENCwgMHhDOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHhENCwgMHhDMCwgMHhENCwgMHhCNCwgMHhENCwgMHhCQywgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHhENCwgMHhDQSwgMHhENCwgMHhDOCwgMHhENCwgMHhCRSwgMHhENCwgMHhCOSwgLyogMHhGMC0weEYzICovCisJMHhENCwgMHhCMiwgMHhEOCwgMHhBNiwgMHhENCwgMHhCMCwgMHhCMCwgMHhGNSwgLyogMHhGNC0weEY3ICovCisJMHhENCwgMHhCNywgMHhCMCwgMHhGNiwgMHhCMCwgMHhGMiwgMHhENCwgMHhBRCwgLyogMHhGOC0weEZCICovCisJMHhENCwgMHhDMywgMHhENCwgMHhCNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNThbNTEyXSA9IHsKKwkweEQ0LCAweEIzLCAweEQ0LCAweEM2LCAweEIwLCAweEYzLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweEQ0LCAweENDLCAweEIwLCAweEVELCAweEIwLCAweEVGLCAweEQ0LCAweEJCLCAvKiAweDA0LTB4MDcgKi8KKwkweEQ0LCAweEI2LCAweEFFLCAweDRCLCAweEIwLCAweEVFLCAweEQ0LCAweEI4LCAvKiAweDA4LTB4MEIgKi8KKwkweEQ0LCAweEM3LCAweEQ0LCAweENCLCAweEQ0LCAweEMyLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweEQ0LCAweEM0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweEQ0LCAweEFFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweEQ4LCAweEExLCAweDAwLCAweDAwLCAweEQ4LCAweEFBLCAvKiAweDE4LTB4MUIgKi8KKwkweEQ4LCAweEE5LCAweEIzLCAweEZBLCAweEQ4LCAweEEyLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweEIzLCAweEZCLCAweEIzLCAweEY5LCAweDAwLCAweDAwLCAweEQ4LCAweEE0LCAvKiAweDIwLTB4MjMgKi8KKwkweEIzLCAweEY2LCAweEQ4LCAweEE4LCAweDAwLCAweDAwLCAweEQ4LCAweEEzLCAvKiAweDI0LTB4MjcgKi8KKwkweEQ4LCAweEE1LCAweEQ4LCAweDdELCAweEIzLCAweEY0LCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweEQ4LCAweEIyLCAweEQ4LCAweEIxLCAweEQ4LCAweEFFLCAweEIzLCAweEYzLCAvKiAweDJDLTB4MkYgKi8KKwkweEIzLCAweEY3LCAweEIzLCAweEY4LCAweEQxLCAweDRCLCAweEQ4LCAweEFCLCAvKiAweDMwLTB4MzMgKi8KKwkweEIzLCAweEY1LCAweEIwLCAweEY0LCAweEQ4LCAweEFELCAweEQ4LCAweDdFLCAvKiAweDM0LTB4MzcgKi8KKwkweEQ4LCAweEIwLCAweEQ4LCAweEFGLCAweDAwLCAweDAwLCAweEQ4LCAweEIzLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweERDLCAweEVGLCAweDAwLCAweDAwLCAweEQ4LCAweEFDLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweEQ4LCAweEE3LCAweERDLCAweEU3LCAweEI2LCAweEY0LCAweEI2LCAweEY3LCAvKiAweDQ4LTB4NEIgKi8KKwkweEI2LCAweEYyLCAweERDLCAweEU2LCAweERDLCAweEVBLCAweERDLCAweEU1LCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweEI2LCAweEVDLCAweEI2LCAweEY2LCAweERDLCAweEUyLCAvKiAweDUwLTB4NTMgKi8KKwkweEI2LCAweEYwLCAweERDLCAweEU5LCAweDAwLCAweDAwLCAweEI2LCAweEVFLCAvKiAweDU0LTB4NTcgKi8KKwkweEI2LCAweEVELCAweERDLCAweEVDLCAweEI2LCAweEVGLCAweERDLCAweEVFLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweERDLCAweEVCLCAweEI2LCAweEVCLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI2LCAweEY1LCAweERDLCAweEYwLCAvKiAweDYwLTB4NjMgKi8KKwkweERDLCAweEU0LCAweERDLCAweEVELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweERDLCAweEUzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI2LCAweEYxLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweEI2LCAweEYzLCAweDAwLCAweDAwLCAweERDLCAweEU4LCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweERDLCAweEYxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweEUxLCAweDVELCAweEI5LCAweEQwLCAweEUxLCAweDYzLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweEI5LCAweEQ1LCAweEUxLCAweDVGLCAweEUxLCAweDY2LCAvKiAweDc4LTB4N0IgKi8KKwkweEUxLCAweDU3LCAweEI5LCAweEQ3LCAweEI5LCAweEQxLCAweEUxLCAweDVDLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEJDLCAweDU1LCAweEUxLCAweDVCLCAweEUxLCAweDY0LCAweEI5LCAweEQyLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweEI5LCAweEQ2LCAweEUxLCAweDVBLCAweEUxLCAweDYwLCAvKiAweDg0LTB4ODcgKi8KKwkweEUxLCAweDY1LCAweEUxLCAweDU2LCAweEI5LCAweEQ0LCAweEUxLCAweDVFLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweDYyLCAweEUxLCAweDY4LCAvKiAweDhDLTB4OEYgKi8KKwkweEUxLCAweDU4LCAweEUxLCAweDYxLCAweDAwLCAweDAwLCAweEI5LCAweEQzLCAvKiAweDkwLTB4OTMgKi8KKwkweEUxLCAweDY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweEUxLCAweDU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweEJDLCAweDU5LCAweEU1LCAweDRCLCAweEJDLCAweDU3LCAweEJDLCAweDU2LCAvKiAweDlDLTB4OUYgKi8KKwkweEU1LCAweDRELCAweEU1LCAweDUyLCAweDAwLCAweDAwLCAweEU1LCAweDRFLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweDUxLCAweEJDLCAweDVDLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweEJFLCAweEE1LCAweEJDLCAweDVCLCAweDAwLCAweDAwLCAweEU1LCAweDRBLCAvKiAweEE4LTB4QUIgKi8KKwkweEU1LCAweDUwLCAweDAwLCAweDAwLCAweEJDLCAweDVBLCAweEU1LCAweDRGLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweDRDLCAweDAwLCAweDAwLCAweEJDLCAweDU4LCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweDRELCAweEY5LCAweEQ5LCAvKiAweEI4LTB4QkIgKi8KKwkweEU5LCAweDRGLCAweEU5LCAweDRBLCAweEJFLCAweEMxLCAweEU5LCAweDRDLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweEJFLCAweEMwLCAweEU5LCAweDRFLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweEJFLCAweEMzLCAweEU5LCAweDUwLCAweEJFLCAweEMyLCAvKiAweEM0LTB4QzcgKi8KKwkweEU5LCAweDQ5LCAweEU5LCAweDRCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMwLCAweEE1LCAweEVDLCAweENDLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweEMwLCAweEE0LCAweEVDLCAweENELCAweEMwLCAweEEzLCAvKiAweEQwLTB4RDMgKi8KKwkweEVDLCAweENCLCAweEMwLCAweEEyLCAweEVDLCAweENBLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweEMyLCAweDUzLCAweEMyLCAweDUyLCAweEYxLCAweEY2LCAweEYxLCAweEY4LCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweEYxLCAweEY3LCAweEMzLCAweDYxLCAweEMzLCAweDYyLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMzLCAweDYzLCAweEY0LCAweDQyLCAvKiAweEUwLTB4RTMgKi8KKwkweEM0LCAweDVCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY3LCAweEQzLCAvKiAweEU0LTB4RTcgKi8KKwkweEY3LCAweEQyLCAweEM1LCAweEYyLCAweDAwLCAweDAwLCAweEE0LCAweDY4LCAvKiAweEU4LTB4RUIgKi8KKwkweEE0LCAweEQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE3LCAweEE3LCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweENFLCAweDVGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweEIzLCAweEZDLCAweEIzLCAweEZELCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweERDLCAweEYyLCAweEI5LCAweEQ4LCAweEUxLCAweDY5LCAweEU1LCAweDUzLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181OVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzksIDB4NUEsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4QjAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4Q0MsIDB4NDIsIDB4Q0UsIDB4NjAsIDB4RDEsIDB4NTksIDB4QUUsIDB4NEMsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjEsIDB4RjksIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4QzQsIDB4REMsIDB4QTQsIDB4NjksIDB4QTUsIDB4N0UsIDB4QzksIDB4NzAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4QTYsIDB4NjcsIDB4QTYsIDB4NjgsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4QTksIDB4NUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4QjAsIDB4RjcsIDB4MDAsIDB4MDAsIDB4QjksIDB4REEsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4QjksIDB4REIsIDB4QjksIDB4RDksIDB4MDAsIDB4MDAsIDB4QTQsIDB4NkEsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4QTQsIDB4RDEsIDB4QTQsIDB4RDMsIDB4QTQsIDB4RDIsIC8qIDB4MjgtMHgyQiAqLworCTB4QzksIDB4NUIsIDB4QTQsIDB4RDQsIDB4QTUsIDB4QTEsIDB4QzksIDB4NzEsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4QTUsIDB4QTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTYsIDB4NjksIC8qIDB4MzQtMHgzNyAqLworCTB4QTYsIDB4NkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4QzksIDB4Q0IsIDB4MDAsIDB4MDAsIDB4QTcsIDB4QTgsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4Q0EsIDB4QjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4QTksIDB4NjEsIDB4Q0MsIDB4NDMsIDB4MDAsIDB4MDAsIDB4QTksIDB4NUYsIC8qIDB4NDQtMHg0NyAqLworCTB4QTksIDB4NjAsIDB4QTksIDB4NUUsIDB4RDEsIDB4NUEsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QUIsIDB4QjYsIDB4QUIsIDB4QjUsIC8qIDB4NEMtMHg0RiAqLworCTB4QUIsIDB4QjcsIDB4QUIsIDB4QjQsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4NjEsIC8qIDB4NTAtMHg1MyAqLworCTB4QTksIDB4NjIsIDB4QUIsIDB4QjMsIDB4MDAsIDB4MDAsIDB4QUUsIDB4NEQsIC8qIDB4NTQtMHg1NyAqLworCTB4QUUsIDB4NEUsIDB4MDAsIDB4MDAsIDB4QUUsIDB4NEYsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4RDQsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4QjMsIDB4RkUsIDB4RDgsIDB4QjQsIDB4QjAsIDB4RjgsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjYsIDB4RjgsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4QjksIDB4REQsIDB4QjksIDB4REMsIDB4RTEsIDB4NkEsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4QkMsIDB4NUQsIDB4QkUsIDB4QzQsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4RUYsIDB4QzAsIDB4RjYsIDB4REEsIDB4RjcsIDB4RDQsIDB4QTQsIDB4NkIsIC8qIDB4NzAtMHg3MyAqLworCTB4QTUsIDB4QTMsIDB4MDAsIDB4MDAsIDB4QTUsIDB4QTQsIDB4QzksIDB4RDEsIC8qIDB4NzQtMHg3NyAqLworCTB4QTYsIDB4NkMsIDB4QTYsIDB4NkYsIDB4MDAsIDB4MDAsIDB4QzksIDB4Q0YsIC8qIDB4NzgtMHg3QiAqLworCTB4QzksIDB4Q0QsIDB4QTYsIDB4NkUsIDB4QzksIDB4RDAsIDB4QzksIDB4RDIsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QzksIDB4Q0MsIDB4QTYsIDB4NzEsIDB4QTYsIDB4NzAsIDB4QTYsIDB4NkQsIC8qIDB4ODAtMHg4MyAqLworCTB4QTYsIDB4NkIsIDB4QzksIDB4Q0UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTcsIDB4QjMsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4QTcsIDB4QjAsIDB4Q0EsIDB4QjYsIDB4Q0EsIDB4QjksIC8qIDB4OEMtMHg4RiAqLworCTB4Q0EsIDB4QjgsIDB4MDAsIDB4MDAsIDB4QTcsIDB4QUEsIDB4QTcsIDB4QjIsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTcsIDB4QUYsIDB4Q0EsIDB4QjUsIC8qIDB4OTQtMHg5NyAqLworCTB4Q0EsIDB4QjMsIDB4QTcsIDB4QUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4QTcsIDB4QTksIDB4QTcsIDB4QUMsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4Q0EsIDB4QjQsIDB4Q0EsIDB4QkIsIDB4Q0EsIDB4QjcsIDB4QTcsIDB4QUQsIC8qIDB4QTAtMHhBMyAqLworCTB4QTcsIDB4QjEsIDB4QTcsIDB4QjQsIDB4Q0EsIDB4QjIsIDB4Q0EsIDB4QkEsIC8qIDB4QTQtMHhBNyAqLworCTB4QTcsIDB4QUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTksIDB4NjcsIDB4QTksIDB4NkYsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4Q0MsIDB4NEYsIDB4Q0MsIDB4NDgsIDB4QTksIDB4NzAsIC8qIDB4QjAtMHhCMyAqLworCTB4Q0MsIDB4NTMsIDB4Q0MsIDB4NDQsIDB4Q0MsIDB4NEIsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4QTksIDB4NjYsIDB4Q0MsIDB4NDUsIDB4QTksIDB4NjQsIC8qIDB4QjgtMHhCQiAqLworCTB4Q0MsIDB4NEMsIDB4Q0MsIDB4NTAsIDB4QTksIDB4NjMsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4Q0MsIDB4NTEsIDB4Q0MsIDB4NEEsIDB4MDAsIDB4MDAsIDB4Q0MsIDB4NEQsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4QTksIDB4NzIsIDB4QTksIDB4NjksIDB4Q0MsIDB4NTQsIC8qIDB4QzQtMHhDNyAqLworCTB4Q0MsIDB4NTIsIDB4MDAsIDB4MDAsIDB4QTksIDB4NkUsIDB4QTksIDB4NkMsIC8qIDB4QzgtMHhDQiAqLworCTB4Q0MsIDB4NDksIDB4QTksIDB4NkIsIDB4Q0MsIDB4NDcsIDB4Q0MsIDB4NDYsIC8qIDB4Q0MtMHhDRiAqLworCTB4QTksIDB4NkEsIDB4QTksIDB4NjgsIDB4QTksIDB4NzEsIDB4QTksIDB4NkQsIC8qIDB4RDAtMHhEMyAqLworCTB4QTksIDB4NjUsIDB4MDAsIDB4MDAsIDB4Q0MsIDB4NEUsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4QUIsIDB4QjksIDB4MDAsIDB4MDAsIDB4QUIsIDB4QzAsIDB4Q0UsIDB4NkYsIC8qIDB4RDgtMHhEQiAqLworCTB4QUIsIDB4QjgsIDB4Q0UsIDB4NjcsIDB4Q0UsIDB4NjMsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4Q0UsIDB4NzMsIDB4Q0UsIDB4NjIsIDB4MDAsIDB4MDAsIDB4QUIsIDB4QkIsIC8qIDB4RTAtMHhFMyAqLworCTB4Q0UsIDB4NkMsIDB4QUIsIDB4QkUsIDB4QUIsIDB4QzEsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4QUIsIDB4QkMsIDB4Q0UsIDB4NzAsIDB4QUIsIDB4QkYsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4QUUsIDB4NTYsIDB4Q0UsIDB4NzYsIDB4Q0UsIDB4NjQsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4Q0UsIDB4NjYsIDB4Q0UsIDB4NkQsIDB4Q0UsIDB4NzEsIC8qIDB4RjAtMHhGMyAqLworCTB4Q0UsIDB4NzUsIDB4Q0UsIDB4NzIsIDB4Q0UsIDB4NkIsIDB4Q0UsIDB4NkUsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4NjgsIDB4QUIsIDB4QzMsIC8qIDB4RjgtMHhGQiAqLworCTB4Q0UsIDB4NkEsIDB4Q0UsIDB4NjksIDB4Q0UsIDB4NzQsIDB4QUIsIDB4QkEsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzVBWzUxMl0gPSB7CisJMHhDRSwgMHg2NSwgMHhBQiwgMHhDMiwgMHgwMCwgMHgwMCwgMHhBQiwgMHhCRCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHhBRSwgMHg1QywgMHhEMSwgMHg2MiwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHhBRSwgMHg1QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMSwgMHg2MCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHhBRSwgMHg1MCwgMHgwMCwgMHgwMCwgMHhBRSwgMHg1NSwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHhEMSwgMHg1RiwgMHhEMSwgMHg1QywgMHhEMSwgMHg2MSwgLyogMHgxNC0weDE3ICovCisJMHhBRSwgMHg1MSwgMHhEMSwgMHg1QiwgMHgwMCwgMHgwMCwgMHhBRSwgMHg1NCwgLyogMHgxOC0weDFCICovCisJMHhBRSwgMHg1MiwgMHgwMCwgMHgwMCwgMHhEMSwgMHg2MywgMHhBRSwgMHg1MywgLyogMHgxQy0weDFGICovCisJMHhBRSwgMHg1NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBRSwgMHg1OCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhBRSwgMHg1QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHhBRSwgMHg1OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHhEMSwgMHg1RCwgMHhEMSwgMHg1RSwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMSwgMHg2NCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHhENCwgMHhENCwgMHhCMCwgMHhGOSwgMHhEOCwgMHhDMiwgLyogMHgzNC0weDM3ICovCisJMHhENCwgMHhEMywgMHhENCwgMHhFNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHhCMSwgMHg0MCwgMHgwMCwgMHgwMCwgMHhENCwgMHhFNCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHhCMCwgMHhGRSwgMHhCMCwgMHhGQSwgMHhENCwgMHhFRCwgMHhENCwgMHhERCwgLyogMHg0MC0weDQzICovCisJMHhENCwgMHhFMCwgMHgwMCwgMHgwMCwgMHhCMSwgMHg0MywgMHhENCwgMHhFQSwgLyogMHg0NC0weDQ3ICovCisJMHhENCwgMHhFMiwgMHhCMCwgMHhGQiwgMHhCMSwgMHg0NCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHhENCwgMHhFNywgMHhENCwgMHhFNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHhENCwgMHhENiwgMHhENCwgMHhFQiwgMHhENCwgMHhERiwgMHhENCwgMHhEQSwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHhENCwgMHhEMCwgMHhENCwgMHhFQywgMHhENCwgMHhEQywgLyogMHg1NC0weDU3ICovCisJMHhENCwgMHhDRiwgMHgwMCwgMHgwMCwgMHhCMSwgMHg0MiwgMHhENCwgMHhFMSwgLyogMHg1OC0weDVCICovCisJMHhENCwgMHhFRSwgMHhENCwgMHhERSwgMHhENCwgMHhEMiwgMHhENCwgMHhENywgLyogMHg1Qy0weDVGICovCisJMHhENCwgMHhDRSwgMHgwMCwgMHgwMCwgMHhCMSwgMHg0MSwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHhENCwgMHhEQiwgMHhENCwgMHhEOCwgMHhCMCwgMHhGQywgMHhENCwgMHhEMSwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhENCwgMHhFOSwgMHhCMCwgMHhGRCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHhENCwgMHhEOSwgMHhENCwgMHhENSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHhENCwgMHhFOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCNCwgMHg0MCwgLyogMHg3NC0weDc3ICovCisJMHhEOCwgMHhCQiwgMHgwMCwgMHgwMCwgMHhEOCwgMHhCOCwgMHhEOCwgMHhDOSwgLyogMHg3OC0weDdCICovCisJMHhEOCwgMHhCRCwgMHhEOCwgMHhDQSwgMHgwMCwgMHgwMCwgMHhCNCwgMHg0MiwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOCwgMHhDNiwgLyogMHg4MC0weDgzICovCisJMHhEOCwgMHhDMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOCwgMHhDNCwgMHhEOCwgMHhDNywgLyogMHg4OC0weDhCICovCisJMHhEOCwgMHhDQiwgMHgwMCwgMHgwMCwgMHhENCwgMHhFMywgMHhEOCwgMHhDRCwgLyogMHg4Qy0weDhGICovCisJMHhERCwgMHg0NywgMHgwMCwgMHgwMCwgMHhCNCwgMHg0MywgMHhEOCwgMHhDRSwgLyogMHg5MC0weDkzICovCisJMHhEOCwgMHhCNiwgMHhEOCwgMHhDMCwgMHgwMCwgMHgwMCwgMHhEOCwgMHhDNSwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCNCwgMHg0MSwgMHhCNCwgMHg0NCwgLyogMHg5OC0weDlCICovCisJMHhEOCwgMHhDQywgMHhEOCwgMHhDRiwgMHhEOCwgMHhCQSwgMHhEOCwgMHhCNywgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOCwgMHhCOSwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHhEOCwgMHhCRSwgMHhEOCwgMHhCQywgMHhCNCwgMHg0NSwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHhEOCwgMHhDOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHhEOCwgMHhCRiwgMHgwMCwgMHgwMCwgMHhEOCwgMHhDMSwgMHhEOCwgMHhCNSwgLyogMHhBQy0weEFGICovCisJMHhEQywgMHhGQSwgMHhEQywgMHhGOCwgMHhCNywgMHg0MiwgMHhCNywgMHg0MCwgLyogMHhCMC0weEIzICovCisJMHhERCwgMHg0MywgMHhEQywgMHhGOSwgMHhERCwgMHg0NCwgMHhERCwgMHg0MCwgLyogMHhCNC0weEI3ICovCisJMHhEQywgMHhGNywgMHhERCwgMHg0NiwgMHhEQywgMHhGNiwgMHhEQywgMHhGRCwgLyogMHhCOC0weEJCICovCisJMHhCNiwgMHhGRSwgMHhCNiwgMHhGRCwgMHhCNiwgMHhGQywgMHhEQywgMHhGQiwgLyogMHhCQy0weEJGICovCisJMHhERCwgMHg0MSwgMHhCNiwgMHhGOSwgMHhCNywgMHg0MSwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHhEQywgMHhGNCwgMHgwMCwgMHgwMCwgMHhEQywgMHhGRSwgMHhEQywgMHhGMywgLyogMHhDNC0weEM3ICovCisJMHhEQywgMHhGQywgMHhCNiwgMHhGQSwgMHhERCwgMHg0MiwgMHhEQywgMHhGNSwgLyogMHhDOC0weENCICovCisJMHhCNiwgMHhGQiwgMHhERCwgMHg0NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHg2RSwgMHhCOSwgMHhFMiwgMHhCOSwgMHhFMSwgLyogMHhENC0weEQ3ICovCisJMHhCOSwgMHhFMywgMHhFMSwgMHg3QSwgMHhFMSwgMHg3MCwgMHhFMSwgMHg3NiwgLyogMHhEOC0weERCICovCisJMHhFMSwgMHg2QiwgMHhFMSwgMHg3OSwgMHhFMSwgMHg3OCwgMHhFMSwgMHg3QywgLyogMHhEQy0weERGICovCisJMHhFMSwgMHg3NSwgMHhCOSwgMHhERSwgMHhFMSwgMHg3NCwgMHhCOSwgMHhFNCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHg2RCwgMHhCOSwgMHhERiwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHhFMSwgMHg3QiwgMHhCOSwgMHhFMCwgMHhFMSwgMHg2RiwgMHhFMSwgMHg3MiwgLyogMHhFOC0weEVCICovCisJMHhFMSwgMHg3NywgMHhFMSwgMHg3MSwgMHhFMSwgMHg2QywgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHg3MywgLyogMHhGMC0weEYzICovCisJMHhFNSwgMHg1NSwgMHhCQywgMHg2MSwgMHhFNSwgMHg1OCwgMHhFNSwgMHg1NywgLyogMHhGNC0weEY3ICovCisJMHhFNSwgMHg1QSwgMHhFNSwgMHg1QywgMHhGOSwgMHhEQywgMHhCQywgMHg1RiwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHg1NiwgMHgwMCwgMHgwMCwgMHhFNSwgMHg1NCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNUJbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweEU1LCAweDVELCAweEU1LCAweDVCLCAweEU1LCAweDU5LCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweDVGLCAweDAwLCAweDAwLCAweEU1LCAweDVFLCAvKiAweDA0LTB4MDcgKi8KKwkweEJDLCAweDYzLCAweEJDLCAweDVFLCAweDAwLCAweDAwLCAweEJDLCAweDYwLCAvKiAweDA4LTB4MEIgKi8KKwkweEJDLCAweDYyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweDYwLCAvKiAweDBDLTB4MEYgKi8KKwkweEU5LCAweDU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweDU2LCAvKiAweDEwLTB4MTMgKi8KKwkweEU5LCAweDU1LCAweDAwLCAweDAwLCAweEU5LCAweDU4LCAweEU5LCAweDUxLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweDUyLCAweEU5LCAweDVBLCAweEU5LCAweDUzLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweEJFLCAweEM1LCAweEU5LCAweDVDLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweEU5LCAweDVCLCAweEU5LCAweDU0LCAweDAwLCAweDAwLCAweEVDLCAweEQxLCAvKiAweDIwLTB4MjMgKi8KKwkweEMwLCAweEE4LCAweEVDLCAweENGLCAweEVDLCAweEQ0LCAweEVDLCAweEQzLCAvKiAweDI0LTB4MjcgKi8KKwkweEU5LCAweDU5LCAweDAwLCAweDAwLCAweEMwLCAweEE3LCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweEVDLCAweEQyLCAweEVDLCAweENFLCAweEVDLCAweEQ2LCAweEVDLCAweEQ1LCAvKiAweDJDLTB4MkYgKi8KKwkweEMwLCAweEE2LCAweDAwLCAweDAwLCAweEVDLCAweEQwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweEJFLCAweEM2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweEMyLCAweDU0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweEVGLCAweEMxLCAweEYxLCAweEZBLCAweEYxLCAweEZCLCAweEYxLCAweEZDLCAvKiAweDNDLTB4M0YgKi8KKwkweEM0LCAweDVDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEM0LCAweDVELCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweEY0LCAweDQzLCAweDAwLCAweDAwLCAweEY1LCAweEM4LCAvKiAweDQ0LTB4NDcgKi8KKwkweEY1LCAweEM3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY2LCAweERCLCAvKiAweDQ4LTB4NEIgKi8KKwkweEY2LCAweERDLCAweEY3LCAweEQ1LCAweEY4LCAweEE3LCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweEE0LCAweDZDLCAweEE0LCAweDZELCAweDAwLCAweDAwLCAweEE0LCAweDZFLCAvKiAweDUwLTB4NTMgKi8KKwkweEE0LCAweEQ1LCAweEE1LCAweEE1LCAweEM5LCAweEQzLCAweEE2LCAweDcyLCAvKiAweDU0LTB4NTcgKi8KKwkweEE2LCAweDczLCAweDAwLCAweDAwLCAweEE3LCAweEI3LCAweEE3LCAweEI4LCAvKiAweDU4LTB4NUIgKi8KKwkweEE3LCAweEI2LCAweEE3LCAweEI1LCAweDAwLCAweDAwLCAweEE5LCAweDczLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENDLCAweDU1LCAweEE5LCAweDc1LCAvKiAweDYwLTB4NjMgKi8KKwkweEE5LCAweDc0LCAweENDLCAweDU2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweEFCLCAweEM0LCAweDAwLCAweDAwLCAweEFFLCAweDVELCAvKiAweDY4LTB4NkIgKi8KKwkweEQxLCAweDY1LCAweDAwLCAweDAwLCAweEQ0LCAweEYwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweEIxLCAweDQ1LCAweEI0LCAweDQ3LCAweEQ0LCAweEVGLCAweEI0LCAweDQ2LCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweEI5LCAweEU1LCAweDAwLCAweDAwLCAweEUxLCAweDdELCAvKiAweDc0LTB4NzcgKi8KKwkweEJFLCAweEM3LCAweDAwLCAweDAwLCAweEMwLCAweEE5LCAweEVDLCAweEQ3LCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweEM0LCAweDVFLCAweDAwLCAweDAwLCAweEM1LCAweDcwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweEM5LCAweDcyLCAweDAwLCAweDAwLCAweEE1LCAweEE2LCAvKiAweDgwLTB4ODMgKi8KKwkweEM5LCAweDczLCAweEE2LCAweDc2LCAweDAwLCAweDAwLCAweEE2LCAweDc0LCAvKiAweDg0LTB4ODcgKi8KKwkweEE2LCAweDc1LCAweEE2LCAweDc3LCAweDAwLCAweDAwLCAweEE3LCAweEJBLCAvKiAweDg4LTB4OEIgKi8KKwkweEE3LCAweEI5LCAweDAwLCAweDAwLCAweENBLCAweEJDLCAweEE3LCAweEJCLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENBLCAweEJELCAweENDLCAweDU3LCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweENDLCAweDU4LCAweDAwLCAweDAwLCAweEE5LCAweDc2LCAvKiAweDk0LTB4OTcgKi8KKwkweEE5LCAweDc4LCAweEE5LCAweDdBLCAweEE5LCAweDc3LCAweEE5LCAweDdCLCAvKiAweDk4LTB4OUIgKi8KKwkweEE5LCAweDc5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEFCLCAweEM4LCAweEFCLCAweEM1LCAvKiAweEEwLTB4QTMgKi8KKwkweEFCLCAweEM3LCAweEFCLCAweEM5LCAweEFCLCAweEM2LCAweEQxLCAweDY2LCAvKiAweEE0LTB4QTcgKi8KKwkweENFLCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweEQxLCAweDY4LCAweEQxLCAweDY3LCAweEFFLCAweDYzLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweEFFLCAweDVGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEFFLCAweDYwLCAvKiAweEIwLTB4QjMgKi8KKwkweEFFLCAweDYyLCAweEFFLCAweDY0LCAweEFFLCAweDYxLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweEFFLCAweDY2LCAweEFFLCAweDY1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIxLCAweDRBLCAvKiAweEJDLTB4QkYgKi8KKwkweEQ0LCAweEYyLCAweEQ0LCAweEYxLCAweEIxLCAweDQ5LCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweEIxLCAweDQ4LCAweEIxLCAweDQ3LCAweEIxLCAweDRCLCAweEIxLCAweDQ2LCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ4LCAweEQ1LCAweEQ4LCAweEQyLCAvKiAweEM4LTB4Q0IgKi8KKwkweEI0LCAweDQ5LCAweEQ4LCAweEQxLCAweEQ4LCAweEQ2LCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweEI0LCAweDRCLCAweEQ4LCAweEQ0LCAweEI0LCAweDQ4LCAweEI0LCAweDRBLCAvKiAweEQwLTB4RDMgKi8KKwkweEQ4LCAweEQzLCAweDAwLCAweDAwLCAweERELCAweDQ4LCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweERELCAweDQ5LCAweERELCAweDRBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI5LCAweEU2LCAweEI5LCAweEVFLCAvKiAweERDLTB4REYgKi8KKwkweEUxLCAweDdFLCAweEI5LCAweEU4LCAweEI5LCAweEVDLCAweEUxLCAweEExLCAvKiAweEUwLTB4RTMgKi8KKwkweEI5LCAweEVELCAweEI5LCAweEU5LCAweEI5LCAweEVBLCAweEI5LCAweEU3LCAvKiAweEU0LTB4RTcgKi8KKwkweEI5LCAweEVCLCAweEJDLCAweDY2LCAweEQ4LCAweEQwLCAweEJDLCAweDY3LCAvKiAweEU4LTB4RUIgKi8KKwkweEJDLCAweDY1LCAweDAwLCAweDAwLCAweEJDLCAweDY0LCAweEU5LCAweDVELCAvKiAweEVDLTB4RUYgKi8KKwkweEJFLCAweEM4LCAweEVDLCAweEQ4LCAweEVDLCAweEQ5LCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweEMzLCAweDY0LCAweEM0LCAweDVGLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweEE0LCAweDZGLCAweDAwLCAweDAwLCAweEE2LCAweDc4LCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181Q1s1MTJdID0geworCTB4MDAsIDB4MDAsIDB4QUIsIDB4Q0EsIDB4MDAsIDB4MDAsIDB4RDEsIDB4NjksIC8qIDB4MDAtMHgwMyAqLworCTB4QUUsIDB4NjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjEsIDB4NEUsIC8qIDB4MDQtMHgwNyAqLworCTB4QjEsIDB4NEQsIDB4QjEsIDB4NEMsIDB4QjQsIDB4NEMsIDB4QjQsIDB4NEQsIC8qIDB4MDgtMHgwQiAqLworCTB4RDgsIDB4RDcsIDB4QjksIDB4RUYsIDB4QkUsIDB4QzksIDB4QTQsIDB4NzAsIC8qIDB4MEMtMHgwRiAqLworCTB4QzksIDB4NUMsIDB4QTQsIDB4RDYsIDB4QzksIDB4NzQsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4QzksIDB4RDQsIDB4QTYsIDB4NzksIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTksIDB4N0MsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REQsIDB4NEIsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTQsIDB4NzEsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4QTQsIDB4RDcsIDB4QzksIDB4RDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4Q0EsIDB4QkUsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4QkYsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4QTcsIDB4QkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4RDgsIDB4RDgsIDB4QjQsIDB4NEUsIDB4MDAsIDB4MDAsIDB4REQsIDB4NEMsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzAsIDB4QUEsIC8qIDB4MzQtMHgzNyAqLworCTB4QTQsIDB4NzIsIDB4QTQsIDB4QTgsIDB4QTQsIDB4RDgsIDB4QzksIDB4NzUsIC8qIDB4MzgtMHgzQiAqLworCTB4QTUsIDB4QTcsIDB4MDAsIDB4MDAsIDB4QTcsIDB4QzAsIDB4QTcsIDB4QkYsIC8qIDB4M0MtMHgzRiAqLworCTB4QTcsIDB4QkQsIDB4QTcsIDB4QkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4Q0MsIDB4NTksIDB4QTksIDB4N0UsIDB4QTksIDB4QTEsIDB4Q0MsIDB4NUEsIC8qIDB4NDQtMHg0NyAqLworCTB4QTksIDB4N0QsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QUIsIDB4Q0UsIC8qIDB4NDgtMHg0QiAqLworCTB4Q0UsIDB4NzgsIDB4QUIsIDB4Q0QsIDB4QUIsIDB4Q0IsIDB4QUIsIDB4Q0MsIC8qIDB4NEMtMHg0RiAqLworCTB4QUUsIDB4NkEsIDB4QUUsIDB4NjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4RDEsIDB4NkIsIDB4QUUsIDB4NjksIDB4RDEsIDB4NkEsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4QUUsIDB4NUUsIDB4RDQsIDB4RjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4QjEsIDB4NTAsIDB4QjEsIDB4NTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4QjEsIDB4NEYsIDB4MDAsIDB4MDAsIDB4QjksIDB4RjAsIDB4RTEsIDB4QTIsIC8qIDB4NjAtMHg2MyAqLworCTB4QkMsIDB4NjgsIDB4QkMsIDB4NjksIDB4MDAsIDB4MDAsIDB4RTUsIDB4NjEsIC8qIDB4NjQtMHg2NyAqLworCTB4QzAsIDB4QUIsIDB4RUYsIDB4QzIsIDB4RUYsIDB4QzMsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4QzQsIDB4REQsIDB4RjgsIDB4QTgsIDB4QzksIDB4NEIsIDB4QTQsIDB4RDksIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4QTQsIDB4NzMsIDB4MDAsIDB4MDAsIDB4QzksIDB4NzcsIC8qIDB4NzAtMHg3MyAqLworCTB4QzksIDB4NzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4QTYsIDB4N0EsIDB4QzksIDB4RDcsIDB4QzksIDB4RDgsIC8qIDB4NzgtMHg3QiAqLworCTB4QzksIDB4RDYsIDB4MDAsIDB4MDAsIDB4QzksIDB4RDksIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4QzcsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4Q0EsIDB4QzIsIDB4Q0EsIDB4QzQsIDB4Q0EsIDB4QzYsIDB4Q0EsIDB4QzMsIC8qIDB4ODgtMHg4QiAqLworCTB4QTcsIDB4QzQsIDB4Q0EsIDB4QzAsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4QzEsIC8qIDB4OEMtMHg4RiAqLworCTB4QTcsIDB4QzEsIDB4QTcsIDB4QzIsIDB4Q0EsIDB4QzUsIDB4Q0EsIDB4QzgsIC8qIDB4OTAtMHg5MyAqLworCTB4QTcsIDB4QzMsIDB4Q0EsIDB4QzksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4Q0MsIDB4NjgsIDB4MDAsIDB4MDAsIDB4Q0MsIDB4NjIsIC8qIDB4OUMtMHg5RiAqLworCTB4Q0MsIDB4NUQsIDB4QTksIDB4QTMsIDB4Q0MsIDB4NjUsIDB4Q0MsIDB4NjMsIC8qIDB4QTAtMHhBMyAqLworCTB4Q0MsIDB4NUMsIDB4Q0MsIDB4NjksIDB4Q0MsIDB4NkMsIDB4Q0MsIDB4NjcsIC8qIDB4QTQtMHhBNyAqLworCTB4Q0MsIDB4NjAsIDB4QTksIDB4QTUsIDB4Q0MsIDB4NjYsIDB4QTksIDB4QTYsIC8qIDB4QTgtMHhBQiAqLworCTB4Q0MsIDB4NjEsIDB4Q0MsIDB4NjQsIDB4Q0MsIDB4NUIsIDB4Q0MsIDB4NUYsIC8qIDB4QUMtMHhBRiAqLworCTB4Q0MsIDB4NkIsIDB4QTksIDB4QTcsIDB4MDAsIDB4MDAsIDB4QTksIDB4QTgsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4Q0MsIDB4NUUsIDB4Q0MsIDB4NkEsIDB4QTksIDB4QTIsIC8qIDB4QjQtMHhCNyAqLworCTB4QTksIDB4QTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4QUIsIDB4Q0UsIDB4QTQsIC8qIDB4QzQtMHhDNyAqLworCTB4Q0UsIDB4QUEsIDB4Q0UsIDB4QTMsIDB4Q0UsIDB4QTUsIDB4Q0UsIDB4N0QsIC8qIDB4QzgtMHhDQiAqLworCTB4Q0UsIDB4N0IsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4QUMsIDB4Q0UsIDB4QTksIC8qIDB4Q0MtMHhDRiAqLworCTB4Q0UsIDB4NzksIDB4MDAsIDB4MDAsIDB4QUIsIDB4RDAsIDB4Q0UsIDB4QTcsIC8qIDB4RDAtMHhEMyAqLworCTB4Q0UsIDB4QTgsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4QTYsIDB4Q0UsIDB4N0MsIC8qIDB4RDQtMHhENyAqLworCTB4Q0UsIDB4N0EsIDB4QUIsIDB4Q0YsIDB4Q0UsIDB4QTIsIDB4Q0UsIDB4N0UsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4QTEsIDB4Q0UsIDB4QUQsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4QUUsIDB4NkYsIDB4MDAsIDB4MDAsIDB4QUUsIDB4NkUsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4RDEsIDB4NkMsIDB4QUUsIDB4NkIsIDB4RDEsIDB4NkUsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4QUUsIDB4NzAsIDB4RDEsIDB4NkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4QUUsIDB4NzMsIDB4MDAsIDB4MDAsIDB4QUUsIDB4NzEsIDB4RDEsIDB4NzAsIC8qIDB4RjQtMHhGNyAqLworCTB4Q0UsIDB4QUUsIDB4RDEsIDB4NzIsIDB4MDAsIDB4MDAsIDB4QUUsIDB4NkQsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4QUUsIDB4NkMsIDB4MDAsIDB4MDAsIDB4RDEsIDB4NkQsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzVEWzUxMl0gPSB7CisJMHhEMSwgMHg3MSwgMHhBRSwgMHg3MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMSwgMHg1MywgMHhCMSwgMHg1MiwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENCwgMHhGNSwgLyogMHgwOC0weDBCICovCisJMHhENCwgMHhGOSwgMHhENCwgMHhGQiwgMHhCMSwgMHg1NCwgMHhENCwgMHhGRSwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHhCMSwgMHg1OCwgMHhENSwgMHg0MSwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHhCMSwgMHg1QSwgMHgwMCwgMHgwMCwgMHhCMSwgMHg1NiwgMHhCMSwgMHg1RSwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHhCMSwgMHg1QiwgMHhENCwgMHhGNywgMHhCMSwgMHg1NSwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHhENCwgMHhGNiwgMHhENCwgMHhGNCwgMHhENSwgMHg0MywgLyogMHgxQy0weDFGICovCisJMHhENCwgMHhGOCwgMHgwMCwgMHgwMCwgMHhCMSwgMHg1NywgMHhENSwgMHg0MiwgLyogMHgyMC0weDIzICovCisJMHhCMSwgMHg1QywgMHhENCwgMHhGRCwgMHhENCwgMHhGQywgMHhCMSwgMHg1RCwgLyogMHgyNC0weDI3ICovCisJMHhENCwgMHhGQSwgMHhCMSwgMHg1OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENSwgMHg0NCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHhENSwgMHg0MCwgMHhEOCwgMHhFNywgMHhEOCwgMHhFRSwgMHhEOCwgMHhFMywgLyogMHgzMC0weDMzICovCisJMHhCNCwgMHg1MSwgMHhEOCwgMHhERiwgMHhEOCwgMHhFRiwgMHhEOCwgMHhEOSwgLyogMHgzNC0weDM3ICovCisJMHhEOCwgMHhFQywgMHhEOCwgMHhFQSwgMHhEOCwgMHhFNCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHhEOCwgMHhFRCwgMHhEOCwgMHhFNiwgMHgwMCwgMHgwMCwgMHhEOCwgMHhERSwgLyogMHgzQy0weDNGICovCisJMHhEOCwgMHhGMCwgMHhEOCwgMHhEQywgMHhEOCwgMHhFOSwgMHhEOCwgMHhEQSwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHhEOCwgMHhGMSwgMHgwMCwgMHgwMCwgMHhCNCwgMHg1MiwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHhEOCwgMHhFQiwgMHhERCwgMHg0RiwgMHhEOCwgMHhERCwgLyogMHg0OC0weDRCICovCisJMHhCNCwgMHg0RiwgMHgwMCwgMHgwMCwgMHhEOCwgMHhFMSwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHhCNCwgMHg1MCwgMHhEOCwgMHhFMCwgMHhEOCwgMHhFNSwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHhEOCwgMHhFMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhEOCwgMHhFOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERCwgMHg1MywgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERCwgMHg1NiwgMHhERCwgMHg0RSwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHhERCwgMHg1MCwgMHgwMCwgMHgwMCwgMHhERCwgMHg1NSwgLyogMHg2NC0weDY3ICovCisJMHhERCwgMHg1NCwgMHhCNywgMHg0MywgMHgwMCwgMHgwMCwgMHhEOCwgMHhEQiwgLyogMHg2OC0weDZCICovCisJMHhERCwgMHg1MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCNywgMHg0NCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHhERCwgMHg0RCwgMHhERCwgMHg1MSwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMSwgMHhBOSwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHhCMCwgMHhFMSwgMHhBNywgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHhFMSwgMHhBRSwgMHhFMSwgMHhBNSwgMHhFMSwgMHhBRCwgMHhFMSwgMHhCMSwgLyogMHg3Qy0weDdGICovCisJCisJMHhFMSwgMHhBNCwgMHhFMSwgMHhBOCwgMHhFMSwgMHhBMywgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHhCOSwgMHhGMSwgMHgwMCwgMHgwMCwgMHhFMSwgMHhBNiwgMHhCOSwgMHhGMiwgLyogMHg4NC0weDg3ICovCisJMHhFMSwgMHhBQywgMHhFMSwgMHhBQiwgMHhFMSwgMHhBQSwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHhBRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHg2NSwgMHhFNSwgMHg2NywgLyogMHg5MC0weDkzICovCisJMHhCQywgMHg2QiwgMHhFNSwgMHg2OCwgMHgwMCwgMHgwMCwgMHhFNSwgMHg2MywgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHg2MiwgMHhFNSwgMHg2QywgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHhFNSwgMHg2QSwgMHhCQywgMHg2QSwgMHhFNSwgMHg2RCwgMHhFNSwgMHg2NCwgLyogMHg5Qy0weDlGICovCisJMHhFNSwgMHg2OSwgMHhFNSwgMHg2QiwgMHhFNSwgMHg2NiwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHg2MSwgLyogMHhBNC0weEE3ICovCisJMHhFOSwgMHg2NiwgMHhFOSwgMHg2MCwgMHhFOSwgMHg2NSwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHhFOSwgMHg1RSwgMHhFOSwgMHg2OCwgMHhFOSwgMHg2NCwgMHhFOSwgMHg2OSwgLyogMHhBQy0weEFGICovCisJMHhFOSwgMHg2MywgMHhFOSwgMHg1RiwgMHhFOSwgMHg2NywgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHhFOSwgMHg2QSwgMHhFOSwgMHg2MiwgMHgwMCwgMHgwMCwgMHhFQywgMHhEQSwgLyogMHhCNC0weEI3ICovCisJMHhDMCwgMHhBRiwgMHgwMCwgMHgwMCwgMHhDMCwgMHhBRCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHhDMCwgMHhBQywgMHhDMCwgMHhBRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHhFRiwgMHhDNCwgMHgwMCwgMHgwMCwgMHhGMSwgMHg3MiwgMHhGMSwgMHhGRCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNCwgMHg0NCwgMHhGNCwgMHg0NSwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHhDNCwgMHg2MCwgMHgwMCwgMHgwMCwgMHhGNSwgMHhDOSwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHhDNCwgMHhERSwgMHgwMCwgMHgwMCwgMHhGNSwgMHhDQSwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHhGNiwgMHhERSwgMHhDNSwgMHg3MiwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHhDNSwgMHg3MSwgMHhGNiwgMHhERCwgMHhDNSwgMHhDOSwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHhGNywgMHhENiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHhBNCwgMHg3NCwgMHhBNiwgMHg3QiwgMHhDOSwgMHhEQSwgLyogMHhEQy0weERGICovCisJMHhDQSwgMHhDQSwgMHhBOCwgMHhCNSwgMHhCMSwgMHg1RiwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHhBNCwgMHg3NSwgMHhBNSwgMHhBQSwgMHhBNSwgMHhBOSwgLyogMHhFNC0weEU3ICovCisJMHhBNSwgMHhBOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNywgMHhDNSwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBRSwgMHg3NCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHhERCwgMHg1NywgMHhBNCwgMHg3NiwgMHhBNCwgMHg3NywgMHhBNCwgMHg3OCwgLyogMHhGMC0weEYzICovCisJMHhBNCwgMHhEQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBQiwgMHhEMSwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHhDRSwgMHhBRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHhCNCwgMHg1MywgMHhBNCwgMHg3OSwgMHhDOSwgMHg1RCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNUVbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE1LCAweEFCLCAweEE1LCAweEFDLCAvKiAweDAwLTB4MDMgKi8KKwkweEM5LCAweDc4LCAweDAwLCAweDAwLCAweEE2LCAweDdDLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENBLCAweENCLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweEE3LCAweEM2LCAweDAwLCAweDAwLCAweENBLCAweENDLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweEE5LCAweEFFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweENDLCAweDZFLCAweEE5LCAweEFDLCAweEE5LCAweEFCLCAweENDLCAweDZELCAvKiAweDE0LTB4MTcgKi8KKwkweEE5LCAweEE5LCAweENDLCAweDZGLCAweEE5LCAweEFBLCAweEE5LCAweEFELCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweEFCLCAweEQyLCAweDAwLCAweDAwLCAweEFCLCAweEQ0LCAvKiAweDFDLTB4MUYgKi8KKwkweENFLCAweEIzLCAweENFLCAweEIwLCAweENFLCAweEIxLCAweENFLCAweEIyLCAvKiAweDIwLTB4MjMgKi8KKwkweENFLCAweEI0LCAweEFCLCAweEQzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweEQxLCAweDc0LCAweEQxLCAweDczLCAweDAwLCAweDAwLCAweEFFLCAweDc2LCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweEFFLCAweDc1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIxLCAweDYyLCAvKiAweDMwLTB4MzMgKi8KKwkweEQ1LCAweDQ2LCAweDAwLCAweDAwLCAweEIxLCAweDYxLCAweEIxLCAweDYzLCAvKiAweDM0LTB4MzcgKi8KKwkweEIxLCAweDYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweEI0LCAweDU1LCAweEQ1LCAweDQ1LCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweEI0LCAweDU2LCAweEQ4LCAweEYzLCAweDAwLCAweDAwLCAweEI0LCAweDU3LCAvKiAweDQwLTB4NDMgKi8KKwkweEQ4LCAweEYyLCAweEI0LCAweDU0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERELCAweDVBLCAweERELCAweDVDLCAvKiAweDQ4LTB4NEIgKi8KKwkweEI3LCAweDQ1LCAweERELCAweDVCLCAweERELCAweDU5LCAweERELCAweDU4LCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEI0LCAvKiAweDUwLTB4NTMgKi8KKwkweEI5LCAweEY3LCAweEI5LCAweEY1LCAweDAwLCAweDAwLCAweEI5LCAweEY2LCAvKiAweDU0LTB4NTcgKi8KKwkweEUxLCAweEIyLCAweEUxLCAweEIzLCAweDAwLCAweDAwLCAweEI5LCAweEYzLCAvKiAweDU4LTB4NUIgKi8KKwkweEU1LCAweDcxLCAweEU1LCAweDZGLCAweDAwLCAweDAwLCAweEJDLCAweDZELCAvKiAweDVDLTB4NUYgKi8KKwkweEU1LCAweDcwLCAweEJDLCAweDZFLCAweEJDLCAweDZDLCAweEI5LCAweEY0LCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweDZELCAweEU5LCAweDZCLCAvKiAweDY0LTB4NjcgKi8KKwkweEU5LCAweDZDLCAweEU1LCAweDZFLCAweEVDLCAweERDLCAweEMwLCAweEIwLCAvKiAweDY4LTB4NkIgKi8KKwkweEVDLCAweERCLCAweEVGLCAweEM1LCAweEVGLCAweEM2LCAweEU5LCAweDZFLCAvKiAweDZDLTB4NkYgKi8KKwkweEYxLCAweEZFLCAweDAwLCAweDAwLCAweEE0LCAweDdBLCAweEE1LCAweEFELCAvKiAweDcwLTB4NzMgKi8KKwkweEE2LCAweDdFLCAweEM5LCAweERCLCAweEE2LCAweDdELCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweEE5LCAweEFGLCAweEI3LCAweDQ2LCAweDAwLCAweDAwLCAweEE0LCAweERCLCAvKiAweDc4LTB4N0IgKi8KKwkweEE1LCAweEFFLCAweEFCLCAweEQ1LCAweEI0LCAweDU4LCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEM5LCAweDc5LCAweDAwLCAweDAwLCAweEM5LCAweDdBLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweEM5LCAweERDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE3LCAweEM4LCAvKiAweDg0LTB4ODcgKi8KKwkweENBLCAweEQwLCAweENBLCAweENFLCAweEE3LCAweEM5LCAweENBLCAweENELCAvKiAweDg4LTB4OEIgKi8KKwkweENBLCAweENGLCAweENBLCAweEQxLCAweDAwLCAweDAwLCAweEE3LCAweEM3LCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweEE5LCAweEIzLCAweEE5LCAweEI0LCAweEE5LCAweEIxLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE5LCAweEIwLCAweENFLCAweEI4LCAvKiAweDk4LTB4OUIgKi8KKwkweEE5LCAweEIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweEFCLCAweEQ2LCAweDAwLCAweDAwLCAweENFLCAweEI3LCAweENFLCAweEI5LCAvKiAweEEwLTB4QTMgKi8KKwkweENFLCAweEI2LCAweENFLCAweEJBLCAweEFCLCAweEQ3LCAweEFFLCAweDc5LCAvKiAweEE0LTB4QTcgKi8KKwkweEQxLCAweDc1LCAweDAwLCAweDAwLCAweEQxLCAweDc3LCAweEFFLCAweDc3LCAvKiAweEE4LTB4QUIgKi8KKwkweEQxLCAweDc4LCAweEFFLCAweDc4LCAweEQxLCAweDc2LCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweENFLCAweEI1LCAweEQ1LCAweDQ3LCAweEQ1LCAweDRBLCAweEQ1LCAweDRCLCAvKiAweEIwLTB4QjMgKi8KKwkweEQ1LCAweDQ4LCAweEIxLCAweDY3LCAweEIxLCAweDY2LCAweEIxLCAweDY0LCAvKiAweEI0LTB4QjcgKi8KKwkweEIxLCAweDY1LCAweEQ1LCAweDQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIxLCAweDY4LCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweEI0LCAweDVBLCAweEI0LCAweDVCLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweEI0LCAweDVDLCAweERELCAweDVELCAweERELCAweDVGLCAweERELCAweDYxLCAvKiAweEM0LTB4QzcgKi8KKwkweEI3LCAweDQ4LCAweEI3LCAweDQ3LCAweEI0LCAweDU5LCAweERELCAweDYwLCAvKiAweEM4LTB4Q0IgKi8KKwkweERELCAweDVFLCAweDAwLCAweDAwLCAweEUxLCAweEI4LCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweEI2LCAweEUxLCAweEJDLCAweEI5LCAweEY4LCAvKiAweEQwLTB4RDMgKi8KKwkweEUxLCAweEJELCAweEUxLCAweEJBLCAweEI5LCAweEY5LCAweEUxLCAweEI3LCAvKiAweEQ0LTB4RDcgKi8KKwkweEUxLCAweEI1LCAweEUxLCAweEJCLCAweEJDLCAweDcwLCAweEU1LCAweDczLCAvKiAweEQ4LTB4REIgKi8KKwkweEUxLCAweEI5LCAweEJDLCAweDcyLCAweEU1LCAweDc0LCAweEJDLCAweDcxLCAvKiAweERDLTB4REYgKi8KKwkweEJDLCAweDc0LCAweEU1LCAweDc1LCAweEJDLCAweDZGLCAweEJDLCAweDczLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweDczLCAweEU5LCAweDcxLCAweEU5LCAweDcwLCAvKiAweEU0LTB4RTcgKi8KKwkweEU5LCAweDcyLCAweEU5LCAweDZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweEMzLCAweDY2LCAweDAwLCAweDAwLCAweEY0LCAweDQ2LCAweEY0LCAweDQ3LCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweEY1LCAweENCLCAweEY2LCAweERGLCAweEM2LCAweDU1LCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE5LCAweEI1LCAweEE3LCAweENBLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEFCLCAweEQ4LCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE0LCAweDdCLCAweEE0LCAweERDLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY181Rls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4QTUsIDB4QUYsIDB4QzksIDB4REQsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4QTcsIDB4Q0IsIDB4Q0EsIDB4RDIsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4QkIsIC8qIDB4MDQtMHgwNyAqLworCTB4QUIsIDB4RDksIDB4MDAsIDB4MDAsIDB4QjksIDB4RkEsIDB4QTQsIDB4N0MsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTYsIDB4QTEsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjcsIDB4NDksIDB4QTQsIDB4N0QsIC8qIDB4MTAtMHgxMyAqLworCTB4QTQsIDB4REQsIDB4QTQsIDB4REUsIDB4MDAsIDB4MDAsIDB4QTUsIDB4QjEsIC8qIDB4MTQtMHgxNyAqLworCTB4QTUsIDB4QjAsIDB4MDAsIDB4MDAsIDB4QzksIDB4REUsIDB4QTYsIDB4QTIsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4Q0EsIDB4RDMsIDB4MDAsIDB4MDAsIDB4QTcsIDB4Q0MsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0MsIDB4NzEsIDB4Q0MsIDB4NzIsIC8qIDB4MjAtMHgyMyAqLworCTB4Q0MsIDB4NzMsIDB4MDAsIDB4MDAsIDB4QTksIDB4QjYsIDB4QTksIDB4QjcsIC8qIDB4MjQtMHgyNyAqLworCTB4Q0MsIDB4NzAsIDB4QTksIDB4QjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4QUIsIDB4REEsIDB4Q0UsIDB4QkMsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4RDEsIDB4N0EsIDB4QUUsIDB4N0EsIDB4MDAsIDB4MDAsIDB4RDEsIDB4NzksIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4QjEsIDB4NjksIDB4RDUsIDB4NEMsIDB4QjEsIDB4NkEsIC8qIDB4MzQtMHgzNyAqLworCTB4RDUsIDB4NEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4QjQsIDB4NUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4REQsIDB4NjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTEsIDB4QkYsIC8qIDB4NDAtMHg0MyAqLworCTB4RTEsIDB4QkUsIDB4MDAsIDB4MDAsIDB4QjksIDB4RkIsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4QkMsIDB4NzUsIDB4RTUsIDB4NzYsIDB4QkUsIDB4Q0EsIDB4RTksIDB4NzQsIC8qIDB4NDgtMHg0QiAqLworCTB4QzAsIDB4QjEsIDB4MDAsIDB4MDAsIDB4QzUsIDB4NzMsIDB4RjcsIDB4RDgsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4Q0MsIDB4NzQsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4QkQsIDB4QjEsIDB4NkIsIC8qIDB4NTQtMHg1NyAqLworCTB4RDgsIDB4RjQsIDB4QjcsIDB4NEEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4QzIsIDB4NTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTcsIDB4Q0UsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4QTcsIDB4Q0QsIDB4QUIsIDB4REIsIDB4MDAsIDB4MDAsIDB4RDEsIDB4N0IsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4QjEsIDB4NkQsIDB4QjMsIDB4NDMsIDB4QjEsIDB4NkUsIC8qIDB4NjgtMHg2QiAqLworCTB4QjEsIDB4NkMsIDB4QjQsIDB4NUUsIDB4MDAsIDB4MDAsIDB4RTEsIDB4QzAsIC8qIDB4NkMtMHg2RiAqLworCTB4QjksIDB4RkMsIDB4QkMsIDB4NzYsIDB4MDAsIDB4MDAsIDB4QzksIDB4NEMsIC8qIDB4NzAtMHg3MyAqLworCTB4QzksIDB4REYsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4RDUsIDB4QTcsIDB4Q0YsIC8qIDB4NzQtMHg3NyAqLworCTB4Q0EsIDB4RDQsIDB4QTcsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4QTksIDB4QkMsIDB4Q0MsIDB4NzcsIDB4Q0MsIDB4NzYsIDB4QTksIDB4QkIsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QTksIDB4QjksIDB4QTksIDB4QkEsIDB4Q0MsIDB4NzUsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4QUIsIDB4REQsIDB4Q0UsIDB4QkUsIDB4QUIsIDB4RTAsIC8qIDB4ODQtMHg4NyAqLworCTB4QUIsIDB4REMsIDB4QUIsIDB4RTIsIDB4QUIsIDB4REUsIDB4QUIsIDB4REYsIC8qIDB4ODgtMHg4QiAqLworCTB4QUIsIDB4RTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4QUUsIDB4N0QsIDB4QUUsIDB4N0MsIDB4QUUsIDB4N0IsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDUsIDB4NEYsIDB4QjEsIDB4NkYsIC8qIDB4OTQtMHg5NyAqLworCTB4QjEsIDB4NzIsIDB4QjEsIDB4NzAsIDB4MDAsIDB4MDAsIDB4RDUsIDB4NEUsIC8qIDB4OTgtMHg5QiAqLworCTB4QjEsIDB4NzUsIDB4MDAsIDB4MDAsIDB4QjEsIDB4NzEsIDB4RDUsIDB4NTAsIC8qIDB4OUMtMHg5RiAqLworCTB4QjEsIDB4NzQsIDB4QjEsIDB4NzMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4RDgsIDB4RjYsIDB4RDgsIDB4RjUsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4QjQsIDB4NjEsIDB4QjQsIDB4NUYsIDB4QjQsIDB4NjAsIDB4RDgsIDB4RjcsIC8qIDB4QTgtMHhBQiAqLworCTB4QjcsIDB4NEIsIDB4REQsIDB4NjQsIDB4QjcsIDB4NEMsIDB4REQsIDB4NjMsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTUsIDB4NzcsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4QkMsIDB4NzgsIDB4RTEsIDB4QzEsIDB4QkMsIDB4NzcsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4QjksIDB4RkQsIDB4MDAsIDB4MDAsIDB4RUMsIDB4REUsIC8qIDB4QjgtMHhCQiAqLworCTB4RTksIDB4NzUsIDB4QzAsIDB4QjIsIDB4RUMsIDB4REQsIDB4RjIsIDB4NDAsIC8qIDB4QkMtMHhCRiAqLworCTB4RjQsIDB4NDgsIDB4RjQsIDB4NDksIDB4MDAsIDB4MDAsIDB4QTQsIDB4REYsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4QTUsIDB4QjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4QzksIDB4N0IsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4QTcsIDB4RDIsIDB4QTcsIDB4RDQsIDB4MDAsIDB4MDAsIDB4QzksIDB4RTIsIC8qIDB4Q0MtMHhDRiAqLworCTB4Q0EsIDB4RDgsIDB4Q0EsIDB4RDcsIDB4Q0EsIDB4RDYsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4QzksIDB4RTEsIDB4QzksIDB4RTAsIDB4QTYsIDB4QTQsIDB4QTcsIDB4RDMsIC8qIDB4RDQtMHhENyAqLworCTB4QTcsIDB4RDEsIDB4QTYsIDB4QTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4QTksIDB4QkQsIDB4Q0MsIDB4NzgsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4QTksIDB4QkUsIDB4Q0EsIDB4REQsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4REYsIC8qIDB4RTAtMHhFMyAqLworCTB4Q0EsIDB4REUsIDB4Q0MsIDB4NzksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4Q0EsIDB4REEsIDB4MDAsIDB4MDAsIDB4QTcsIDB4RDgsIDB4QTcsIDB4RDYsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4Q0EsIDB4RDksIDB4Q0EsIDB4REIsIDB4Q0EsIDB4RTEsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4QTcsIDB4RDUsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4REMsIC8qIDB4RjAtMHhGMyAqLworCTB4Q0EsIDB4RTUsIDB4QTksIDB4QzAsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4RTIsIC8qIDB4RjQtMHhGNyAqLworCTB4QTcsIDB4RDcsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4RTAsIDB4Q0EsIDB4RTMsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4QTksIDB4QkYsIDB4MDAsIDB4MDAsIDB4QTksIDB4QzEsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzYwWzUxMl0gPSB7CisJMHhDQSwgMHhFNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHhDQywgMHhBRiwgMHhDQywgMHhBMiwgMHhDQywgMHg3RSwgLyogMHgwOC0weDBCICovCisJMHhDQywgMHhBRSwgMHhDQywgMHhBOSwgMHhBQiwgMHhFNywgMHhBOSwgMHhDMiwgLyogMHgwQy0weDBGICovCisJMHhDQywgMHhBQSwgMHhDQywgMHhBRCwgMHhBQiwgMHhFMywgMHhDQywgMHhBQywgLyogMHgxMC0weDEzICovCisJMHhBOSwgMHhDMywgMHhBOSwgMHhDOCwgMHhBOSwgMHhDNiwgMHhDQywgMHhBMywgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHhDQywgMHg3QywgMHhDQywgMHhBNSwgMHhBOSwgMHhDRCwgLyogMHgxOC0weDFCICovCisJMHhDQywgMHhCMCwgMHhBQiwgMHhFNCwgMHhDQywgMHhBNiwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHhBQiwgMHhFNSwgMHhBOSwgMHhDOSwgMHhDQywgMHhBOCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHhDRSwgMHhDRCwgMHhBQiwgMHhFNiwgMHhDQywgMHg3QiwgMHhBOSwgMHhDQSwgLyogMHgyNC0weDI3ICovCisJMHhBQiwgMHhFOCwgMHhBOSwgMHhDQiwgMHhBOSwgMHhDNywgMHhBOSwgMHhDQywgLyogMHgyOC0weDJCICovCisJMHhDQywgMHhBNywgMHhDQywgMHg3QSwgMHhDQywgMHhBQiwgMHhBOSwgMHhDNCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQywgMHg3RCwgMHhDQywgMHhBNCwgLyogMHgzMC0weDMzICovCisJMHhDQywgMHhBMSwgMHhBOSwgMHhDNSwgMHgwMCwgMHgwMCwgMHhDRSwgMHhCRiwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHhDRSwgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHhDRSwgMHhDQSwgMHhEMSwgMHhBMSwgMHhDRSwgMHhDQiwgMHhBQiwgMHhFRSwgLyogMHg0MC0weDQzICovCisJMHhDRSwgMHhDRSwgMHhDRSwgMHhDNCwgMHhBQiwgMHhFRCwgMHhDRSwgMHhDNiwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHhDRSwgMHhDNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHhDRSwgMHhDOSwgMHhBQiwgMHhFOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHhBRSwgMHhBMywgMHgwMCwgMHgwMCwgMHhGOSwgMHhEQSwgMHhDRSwgMHhDNSwgLyogMHg1MC0weDUzICovCisJMHhDRSwgMHhDMSwgMHhBRSwgMHhBNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHhDRSwgMHhDRiwgMHhBRSwgMHg3RSwgMHhEMSwgMHg3RCwgMHhDRSwgMHhDOCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHhEMSwgMHg3QywgMHhDRSwgMHhDMywgMHhDRSwgMHhDQywgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBQiwgMHhFQywgMHhBRSwgMHhBMSwgLyogMHg2MC0weDYzICovCisJMHhBQiwgMHhGMiwgMHhBRSwgMHhBMiwgMHhDRSwgMHhEMCwgMHhEMSwgMHg3RSwgLyogMHg2NC0weDY3ICovCisJMHhBQiwgMHhFQiwgMHhBRSwgMHhBNiwgMHhBQiwgMHhGMSwgMHhBQiwgMHhGMCwgLyogMHg2OC0weDZCICovCisJMHhBQiwgMHhFRiwgMHhBRSwgMHhBNSwgMHhDRSwgMHhEMSwgMHhBRSwgMHhBNywgLyogMHg2Qy0weDZGICovCisJMHhBQiwgMHhFQSwgMHgwMCwgMHgwMCwgMHhDRSwgMHhDMiwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMSwgMHg3NiwgLyogMHg3Qy0weDdGICovCisJCisJMHhEMSwgMHhBNCwgMHhEMSwgMHhBNiwgMHgwMCwgMHgwMCwgMHhEMSwgMHhBOCwgLyogMHg4MC0weDgzICovCisJMHhBRSwgMHhBOCwgMHhBRSwgMHhBRSwgMHhENSwgMHg1MywgMHhEMSwgMHhBQywgLyogMHg4NC0weDg3ICovCisJMHhEMSwgMHhBMywgMHhCMSwgMHg3OCwgMHhENSwgMHg1MSwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHhBRSwgMHhBRCwgMHhBRSwgMHhBQiwgMHhEMSwgMHhBRSwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHhENSwgMHg1MiwgMHgwMCwgMHgwMCwgMHhEMSwgMHhBNSwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHhBRSwgMHhBQywgMHhEMSwgMHhBOSwgMHhBRSwgMHhBRiwgMHhEMSwgMHhBQiwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBRSwgMHhBQSwgMHhEMSwgMHhBQSwgLyogMHg5OC0weDlCICovCisJMHhEMSwgMHhBRCwgMHhEMSwgMHhBNywgMHgwMCwgMHgwMCwgMHhBRSwgMHhBOSwgLyogMHg5Qy0weDlGICovCisJMHhCMSwgMHg3OSwgMHgwMCwgMHgwMCwgMHhEMSwgMHhBMiwgMHhCMSwgMHg3NywgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHhCMSwgMHg3QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHhENSwgMHg1NSwgMHhENSwgMHg1RSwgMHhCNCwgMHg2NCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHhCMSwgMHg3QywgMHhCMSwgMHhBMywgMHhCNCwgMHg2NSwgMHhENSwgMHg2MCwgLyogMHhCNC0weEI3ICovCisJMHhCMSwgMHhBQSwgMHhEOCwgMHhGOSwgMHhENSwgMHg1NiwgMHhCMSwgMHhBMiwgLyogMHhCOC0weEJCICovCisJMHhCMSwgMHhBNSwgMHhCMSwgMHg3RSwgMHhENSwgMHg1NCwgMHhENSwgMHg2MiwgLyogMHhCQy0weEJGICovCisJMHhENSwgMHg2NSwgMHhEOSwgMHg0OSwgMHgwMCwgMHgwMCwgMHhENSwgMHg2MywgLyogMHhDMC0weEMzICovCisJMHhEOCwgMHhGRCwgMHhCMSwgMHhBMSwgMHhCMSwgMHhBOCwgMHhCMSwgMHhBQywgLyogMHhDNC0weEM3ICovCisJMHhENSwgMHg1RCwgMHhEOCwgMHhGOCwgMHhENSwgMHg2MSwgMHhCMSwgMHg3QiwgLyogMHhDOC0weENCICovCisJMHhEOCwgMHhGQSwgMHhENSwgMHg2NCwgMHhEOCwgMHhGQywgMHhENSwgMHg1OSwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHhCNCwgMHg2MiwgMHgwMCwgMHgwMCwgMHhENSwgMHg1NywgLyogMHhEMC0weEQzICovCisJMHhENSwgMHg1OCwgMHhCMSwgMHhBNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHhCMSwgMHhBNiwgMHhENSwgMHg1QiwgMHhCMSwgMHhBQiwgMHhENSwgMHg1RiwgLyogMHhEOC0weERCICovCisJMHhCMSwgMHhBNCwgMHhENSwgMHg1QywgMHgwMCwgMHgwMCwgMHhCMSwgMHhBOSwgLyogMHhEQy0weERGICovCisJMHhCNCwgMHg2NiwgMHhCNCwgMHg2MywgMHhEOCwgMHhGQiwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHhENSwgMHg1QSwgMHgwMCwgMHgwMCwgMHhCMSwgMHg3RCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHhCNCwgMHg2QiwgMHhCNCwgMHg2RiwgMHhEOSwgMHg0MCwgMHhCNywgMHg1MSwgLyogMHhGMC0weEYzICovCisJMHhCNCwgMHg2RCwgMHhEOSwgMHg0NCwgMHhCNCwgMHg3MSwgMHhERCwgMHg2NSwgLyogMHhGNC0weEY3ICovCisJMHhEOSwgMHg0NiwgMHhCNywgMHg1MywgMHhCNCwgMHg2OSwgMHhCNCwgMHg2QywgLyogMHhGOC0weEZCICovCisJMHhEOSwgMHg0NywgMHgwMCwgMHgwMCwgMHhEOSwgMHg0OCwgMHhEOSwgMHg0RSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNjFbNTEyXSA9IHsKKwkweEI0LCAweDczLCAweEI3LCAweDU0LCAweDAwLCAweDAwLCAweEQ5LCAweDRBLCAvKiAweDAwLTB4MDMgKi8KKwkweEQ5LCAweDRGLCAweEQ5LCAweDQzLCAweEI3LCAweDVFLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweEI3LCAweDU1LCAweEI0LCAweDcyLCAweEQ5LCAweDQxLCAweEQ5LCAweDUwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweEI3LCAweDVELCAweEI0LCAweDcwLCAweEI3LCAweDRFLCAvKiAweDBDLTB4MEYgKi8KKwkweEQ5LCAweDRELCAweDAwLCAweDAwLCAweEI0LCAweDc0LCAweEQ5LCAweDQ1LCAvKiAweDEwLTB4MTMgKi8KKwkweEQ4LCAweEZFLCAweEI0LCAweDZBLCAweEQ5LCAweDQyLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweEQ5LCAweDRCLCAweDAwLCAweDAwLCAweEI3LCAweDRELCAweEI3LCAweDUyLCAvKiAweDE4LTB4MUIgKi8KKwkweEI0LCAweDY3LCAweEQ5LCAweDRDLCAweDAwLCAweDAwLCAweEI3LCAweDUwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI0LCAweDY4LCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI3LCAweDVDLCAvKiAweDI0LTB4MjcgKi8KKwkweEUxLCAweEMzLCAweERELCAweDcwLCAweDAwLCAweDAwLCAweERELCAweDY4LCAvKiAweDI4LTB4MkIgKi8KKwkweEUxLCAweEMyLCAweDAwLCAweDAwLCAweERELCAweDZDLCAweERELCAweDZFLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERELCAweDZCLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweEI3LCAweDVCLCAweDAwLCAweDAwLCAweERELCAweDZBLCAweEI3LCAweDVGLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEQyLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI3LCAweDVBLCAweEJBLCAweDQwLCAvKiAweDNDLTB4M0YgKi8KKwkweERELCAweDcxLCAweEUxLCAweEM0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweEI3LCAweDU4LCAweERELCAweDY5LCAweERELCAweDZELCAweEI5LCAweEZFLCAvKiAweDQ0LTB4NDcgKi8KKwkweEI3LCAweDRGLCAweERELCAweDY2LCAweERELCAweDY3LCAweEJBLCAweDQxLCAvKiAweDQ4LTB4NEIgKi8KKwkweEI3LCAweDU3LCAweEI3LCAweDU5LCAweEI3LCAweDU2LCAweERELCAweDZGLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEM4LCAweEUxLCAweEM5LCAvKiAweDUwLTB4NTMgKi8KKwkweEUxLCAweENFLCAweEJDLCAweDdELCAweEUxLCAweEQ1LCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweEJBLCAweDQ3LCAweDAwLCAweDAwLCAweEJBLCAweDQ2LCAweEUxLCAweEQwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweEJDLCAweDdDLCAweEUxLCAweEM1LCAweEJBLCAweDQ1LCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweEQ0LCAweEJBLCAweDQzLCAweEJBLCAweDQ0LCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweEQxLCAweEU1LCAweEFBLCAweEJDLCAweDdBLCAvKiAweDY0LTB4NjcgKi8KKwkweEI0LCAweDZFLCAweDAwLCAweDAwLCAweEUxLCAweEQzLCAweEJDLCAweEEzLCAvKiAweDY4LTB4NkIgKi8KKwkweEUxLCAweENCLCAweDAwLCAweDAwLCAweEJDLCAweDdCLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweEJDLCAweEEyLCAweEUxLCAweEM2LCAweEUxLCAweENBLCAweEUxLCAweEM3LCAvKiAweDcwLTB4NzMgKi8KKwkweEUxLCAweENELCAweEJBLCAweDQ4LCAweEJDLCAweDc5LCAweEJBLCAweDQyLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweDdBLCAweEUxLCAweENGLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweEJDLCAweEExLCAweDAwLCAweDAwLCAweEJDLCAweEE0LCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEUxLCAweENDLCAweDAwLCAweDAwLCAweEJDLCAweDdFLCAweEU1LCAweDc5LCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweDdFLCAweEJFLCAweENFLCAweEU1LCAweDc4LCAvKiAweDg4LTB4OEIgKi8KKwkweEU5LCAweEEzLCAweEU1LCAweEE5LCAweEJDLCAweEE4LCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweEJDLCAweEE2LCAweEJFLCAweENDLCAweEU1LCAweEE2LCAweEU1LCAweEEyLCAvKiAweDkwLTB4OTMgKi8KKwkweEJDLCAweEFDLCAweDAwLCAweDAwLCAweEU5LCAweDc4LCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJDLCAweEFBLCAweEU1LCAweEExLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweDc2LCAweDAwLCAweDAwLCAweEU1LCAweEE1LCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweEE4LCAweEU1LCAweDdELCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweEJDLCAweEFCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJDLCAweEE1LCAvKiAweEE0LTB4QTcgKi8KKwkweEU5LCAweDc3LCAweEJFLCAweENELCAweEU1LCAweEE3LCAweEJDLCAweEE3LCAvKiAweEE4LTB4QUIgKi8KKwkweEJDLCAweEE5LCAweEU1LCAweEE0LCAweEJDLCAweEFELCAweEU1LCAweEEzLCAvKiAweEFDLTB4QUYgKi8KKwkweEU1LCAweDdDLCAweEU1LCAweDdCLCAweEJFLCAweENCLCAweEU1LCAweEFCLCAvKiAweEIwLTB4QjMgKi8KKwkweEU5LCAweDdBLCAweEVDLCAweEUwLCAweEJFLCAweEQwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweEU5LCAweEEyLCAweDAwLCAweDAwLCAweEU5LCAweDdFLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweEVDLCAweEUxLCAweDAwLCAweDAwLCAweEJFLCAweEQxLCAweEU5LCAweEExLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweDdDLCAweEMwLCAweEI0LCAweEVDLCAweERGLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweDc5LCAweEU5LCAweDdCLCAweEMwLCAweEI1LCAvKiAweEM0LTB4QzcgKi8KKwkweEJFLCAweEQzLCAweEMwLCAweEIzLCAweEJFLCAweEQyLCAweEMwLCAweEI3LCAvKiAweEM4LTB4Q0IgKi8KKwkweEU5LCAweDdELCAweEJFLCAweENGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVGLCAweENGLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweEVGLCAweEM3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVDLCAweEU3LCAweEVGLCAweEM4LCAvKiAweERDLTB4REYgKi8KKwkweEVDLCAweEUzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMyLCAweDU2LCAvKiAweEUwLTB4RTMgKi8KKwkweEVDLCAweEU1LCAweEVDLCAweEU0LCAweEMwLCAweEI2LCAweEVDLCAweEUyLCAvKiAweEU0LTB4RTcgKi8KKwkweEVDLCAweEU2LCAweEVGLCAweEQwLCAweEVGLCAweENDLCAweEVGLCAweENFLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweEVGLCAweEM5LCAweEVGLCAweENBLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweEVGLCAweENELCAweEVGLCAweENCLCAweEMzLCAweDY3LCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweEMzLCAweDZBLCAweEMzLCAweDY5LCAweEMzLCAweDY4LCAvKiAweEY0LTB4RjcgKi8KKwkweEM0LCAweDYxLCAweEY0LCAweDRBLCAweEM0LCAweDYyLCAweEYyLCAweDQxLCAvKiAweEY4LTB4RkIgKi8KKwkweEM0LCAweERGLCAweEY1LCAweENDLCAweEM0LCAweEUwLCAweEM1LCAweDc0LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182Mls1MTJdID0geworCTB4QzUsIDB4Q0EsIDB4RjcsIDB4RDksIDB4MDAsIDB4MDAsIDB4RjcsIDB4REEsIC8qIDB4MDAtMHgwMyAqLworCTB4RjcsIDB4REIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjksIDB4QkEsIC8qIDB4MDQtMHgwNyAqLworCTB4QTQsIDB4RTAsIDB4QzksIDB4N0MsIDB4QTUsIDB4QjMsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4QTYsIDB4QTYsIDB4QTYsIDB4QTcsIDB4QTYsIDB4QTUsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4QTYsIDB4QTgsIDB4QTcsIDB4REEsIDB4QTcsIDB4RDksIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4Q0MsIDB4QjEsIDB4QTksIDB4Q0YsIDB4QTksIDB4Q0UsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4RDEsIDB4QUYsIDB4QjEsIDB4QUQsIDB4QjEsIDB4QUUsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjQsIDB4NzUsIC8qIDB4MUMtMHgxRiAqLworCTB4REQsIDB4NzIsIDB4QjcsIDB4NjAsIDB4QjcsIDB4NjEsIDB4REQsIDB4NzQsIC8qIDB4MjAtMHgyMyAqLworCTB4REQsIDB4NzYsIDB4REQsIDB4NzUsIDB4MDAsIDB4MDAsIDB4RTEsIDB4RDcsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4RTEsIDB4RDYsIDB4QkEsIDB4NDksIDB4RTEsIDB4RDgsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4RTUsIDB4QUMsIDB4QkMsIDB4QUUsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4QkUsIDB4RDQsIDB4MDAsIDB4MDAsIDB4QzAsIDB4QjgsIDB4QzIsIDB4NTcsIC8qIDB4MzAtMHgzMyAqLworCTB4QzAsIDB4QjksIDB4MDAsIDB4MDAsIDB4QTQsIDB4RTEsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4RTYsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4Q0MsIDB4QjIsIDB4QTksIDB4RDEsIDB4QTksIDB4RDAsIC8qIDB4M0MtMHgzRiAqLworCTB4QTksIDB4RDIsIDB4QUIsIDB4RjMsIDB4Q0UsIDB4RDIsIDB4Q0UsIDB4RDMsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDEsIDB4QjAsIDB4QUUsIDB4QjAsIC8qIDB4NDQtMHg0NyAqLworCTB4QjEsIDB4QUYsIDB4QjQsIDB4NzYsIDB4RDksIDB4NTEsIDB4QTQsIDB4RTIsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4QTQsIDB4N0UsIDB4QTQsIDB4RTMsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4QzksIDB4N0QsIDB4QTUsIDB4QjcsIDB4QTUsIDB4QjYsIDB4QTUsIDB4QjQsIC8qIDB4NTAtMHg1MyAqLworCTB4QTUsIDB4QjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4QTYsIDB4QUIsIDB4QzksIDB4RTksIDB4QzksIDB4RUIsIDB4QTYsIDB4QUEsIC8qIDB4NTgtMHg1QiAqLworCTB4QzksIDB4RTMsIDB4MDAsIDB4MDAsIDB4QzksIDB4RTQsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4QzksIDB4RUEsIDB4QzksIDB4RTYsIDB4QzksIDB4RTgsIDB4QTYsIDB4QTksIC8qIDB4NjAtMHg2MyAqLworCTB4QzksIDB4RTUsIDB4QzksIDB4RUMsIDB4QzksIDB4RTcsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4QTcsIDB4RTEsIDB4QTcsIDB4RUEsIDB4QTcsIDB4RTgsIC8qIDB4NkMtMHg2RiAqLworCTB4Q0EsIDB4RjAsIDB4Q0EsIDB4RUQsIDB4Q0EsIDB4RjUsIDB4QTcsIDB4RTYsIC8qIDB4NzAtMHg3MyAqLworCTB4Q0EsIDB4RjYsIDB4MDAsIDB4MDAsIDB4QTcsIDB4REYsIDB4Q0EsIDB4RjMsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4QTcsIDB4RTUsIDB4Q0EsIDB4RUYsIDB4Q0EsIDB4RUUsIC8qIDB4NzgtMHg3QiAqLworCTB4QTcsIDB4RTMsIDB4Q0EsIDB4RjQsIDB4QTcsIDB4RTQsIDB4QTksIDB4RDMsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QTcsIDB4REUsIDB4Q0EsIDB4RjEsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4RTcsIC8qIDB4ODAtMHg4MyAqLworCTB4QTcsIDB4REIsIDB4MDAsIDB4MDAsIDB4QTcsIDB4RUUsIDB4Q0EsIDB4RUMsIC8qIDB4ODQtMHg4NyAqLworCTB4Q0EsIDB4RjIsIDB4QTcsIDB4RTAsIDB4QTcsIDB4RTIsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4Q0EsIDB4RTgsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4RTksIDB4Q0EsIDB4RUEsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4QTcsIDB4RUQsIDB4QTcsIDB4RTcsIDB4QTcsIDB4RUMsIC8qIDB4OTAtMHg5MyAqLworCTB4Q0EsIDB4RUIsIDB4QTcsIDB4RUIsIDB4QTcsIDB4REQsIDB4QTcsIDB4REMsIC8qIDB4OTQtMHg5NyAqLworCTB4QTcsIDB4RTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4QTksIDB4RTEsIDB4Q0MsIDB4QkUsIDB4Q0MsIDB4QjcsIDB4QTksIDB4REMsIC8qIDB4QTgtMHhBQiAqLworCTB4QTksIDB4RUYsIDB4Q0MsIDB4QjMsIDB4Q0MsIDB4QkEsIDB4Q0MsIDB4QkMsIC8qIDB4QUMtMHhBRiAqLworCTB4Q0MsIDB4QkYsIDB4QTksIDB4RUEsIDB4MDAsIDB4MDAsIDB4Q0MsIDB4QkIsIC8qIDB4QjAtMHhCMyAqLworCTB4Q0MsIDB4QjQsIDB4QTksIDB4RTgsIDB4Q0MsIDB4QjgsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4Q0MsIDB4QzAsIDB4QTksIDB4RDksIDB4MDAsIDB4MDAsIDB4Q0MsIDB4QkQsIC8qIDB4QjgtMHhCQiAqLworCTB4QTksIDB4RTMsIDB4QTksIDB4RTIsIDB4Q0MsIDB4QjYsIDB4QTksIDB4RDcsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTksIDB4RDgsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4QTksIDB4RDYsIDB4MDAsIDB4MDAsIDB4QTksIDB4RUUsIDB4QTksIDB4RTYsIC8qIDB4QzQtMHhDNyAqLworCTB4QTksIDB4RTAsIDB4QTksIDB4RDQsIDB4Q0MsIDB4QjksIDB4QTksIDB4REYsIC8qIDB4QzgtMHhDQiAqLworCTB4QTksIDB4RDUsIDB4QTksIDB4RTcsIDB4QTksIDB4RjAsIDB4Q0UsIDB4RDQsIC8qIDB4Q0MtMHhDRiAqLworCTB4QTksIDB4RTQsIDB4Q0MsIDB4QjUsIDB4QTksIDB4REEsIDB4QTksIDB4REQsIC8qIDB4RDAtMHhEMyAqLworCTB4QTksIDB4REUsIDB4MDAsIDB4MDAsIDB4QTksIDB4RUMsIDB4QTksIDB4RUQsIC8qIDB4RDQtMHhENyAqLworCTB4QTksIDB4RUIsIDB4QTksIDB4RTUsIDB4QTksIDB4RTksIDB4QTksIDB4REIsIC8qIDB4RDgtMHhEQiAqLworCTB4QUIsIDB4RjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4REEsIC8qIDB4RTgtMHhFQiAqLworCTB4QUMsIDB4NDEsIDB4QUIsIDB4RjgsIDB4QUIsIDB4RkEsIDB4QUMsIDB4NDAsIC8qIDB4RUMtMHhFRiAqLworCTB4Q0UsIDB4RTYsIDB4QUIsIDB4RkQsIDB4RDEsIDB4QjEsIDB4QUUsIDB4QjEsIC8qIDB4RjAtMHhGMyAqLworCTB4QUMsIDB4NDMsIDB4Q0UsIDB4RDcsIDB4Q0UsIDB4REYsIDB4QUIsIDB4RkUsIC8qIDB4RjQtMHhGNyAqLworCTB4Q0UsIDB4REUsIDB4Q0UsIDB4REIsIDB4Q0UsIDB4RTMsIDB4Q0UsIDB4RTUsIC8qIDB4RjgtMHhGQiAqLworCTB4QUIsIDB4RjcsIDB4QUIsIDB4RkIsIDB4QUMsIDB4NDIsIDB4QUUsIDB4QjMsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzYzWzUxMl0gPSB7CisJMHhDRSwgMHhFMCwgMHhBQiwgMHhGOSwgMHhBQywgMHg0NSwgMHhDRSwgMHhEOSwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBQiwgMHhGQywgLyogMHgwNC0weDA3ICovCisJMHhBRSwgMHhCMiwgMHhBQiwgMHhGNiwgMHgwMCwgMHgwMCwgMHhDRSwgMHhENiwgLyogMHgwOC0weDBCICovCisJMHhDRSwgMHhERCwgMHhDRSwgMHhENSwgMHhDRSwgMHhEOCwgMHhDRSwgMHhEQywgLyogMHgwQy0weDBGICovCisJMHhEMSwgMHhCMiwgMHhBQywgMHg0NCwgMHgwMCwgMHgwMCwgMHhDRSwgMHhFMSwgLyogMHgxMC0weDEzICovCisJMHhDRSwgMHhFMiwgMHhDRSwgMHhFNCwgMHhBQiwgMHhGNSwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHhBRSwgMHhDMSwgMHhEMSwgMHhCRSwgMHhBRSwgMHhCRiwgMHhBRSwgMHhDMCwgLyogMHgyOC0weDJCICovCisJMHhEMSwgMHhCNCwgMHhEMSwgMHhDNCwgMHgwMCwgMHgwMCwgMHhBRSwgMHhCNiwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENSwgMHg2NiwgMHhEMSwgMHhDNiwgLyogMHgzMC0weDMzICovCisJMHhEMSwgMHhDMCwgMHgwMCwgMHgwMCwgMHhEMSwgMHhCNywgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHhEMSwgMHhDOSwgMHhEMSwgMHhCQSwgMHhBRSwgMHhCQywgMHhENSwgMHg3RCwgLyogMHgzOC0weDNCICovCisJMHhEMSwgMHhCRCwgMHhBRSwgMHhCRSwgMHhBRSwgMHhCNSwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHhEMSwgMHhDQiwgMHhEMSwgMHhCRiwgMHhBRSwgMHhCOCwgMHhEMSwgMHhCOCwgLyogMHg0MC0weDQzICovCisJMHhEMSwgMHhCNSwgMHhEMSwgMHhCNiwgMHhBRSwgMHhCOSwgMHhEMSwgMHhDNSwgLyogMHg0NC0weDQ3ICovCisJMHhEMSwgMHhDQywgMHhBRSwgMHhCQiwgMHhEMSwgMHhCQywgMHhEMSwgMHhCQiwgLyogMHg0OC0weDRCICovCisJMHhBRSwgMHhDMywgMHhBRSwgMHhDMiwgMHhBRSwgMHhCNCwgMHhBRSwgMHhCQSwgLyogMHg0Qy0weDRGICovCisJMHhBRSwgMHhCRCwgMHhEMSwgMHhDOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHhEMSwgMHhDMiwgMHhBRSwgMHhCNywgMHhEMSwgMHhCMywgMHhEMSwgMHhDQSwgLyogMHg1NC0weDU3ICovCisJMHhEMSwgMHhDMSwgMHhEMSwgMHhDMywgMHhEMSwgMHhDNywgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHhENSwgMHg2NywgMHgwMCwgMHgwMCwgMHhCMSwgMHhCNywgLyogMHg2NC0weDY3ICovCisJMHhCMSwgMHhDQiwgMHhCMSwgMHhDQSwgMHgwMCwgMHgwMCwgMHhCMSwgMHhCRiwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHhENSwgMHg3OSwgMHhENSwgMHg3NSwgMHhENSwgMHg3MiwgLyogMHg2Qy0weDZGICovCisJMHhENSwgMHhBNiwgMHhCMSwgMHhCQSwgMHhCMSwgMHhCMiwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHhENSwgMHg3NywgMHhCNCwgMHhBOCwgMHhCMSwgMHhCNiwgLyogMHg3NC0weDc3ICovCisJMHhENSwgMHhBMSwgMHgwMCwgMHgwMCwgMHhCMSwgMHhDQywgMHhCMSwgMHhDOSwgLyogMHg3OC0weDdCICovCisJMHhENSwgMHg3QiwgMHhENSwgMHg2QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHhCMSwgMHhDOCwgMHhENSwgMHhBMywgMHhENSwgMHg2OSwgMHhCMSwgMHhCRCwgLyogMHg4MC0weDgzICovCisJMHhCMSwgMHhDMSwgMHhENSwgMHhBMiwgMHgwMCwgMHgwMCwgMHhENSwgMHg3MywgLyogMHg4NC0weDg3ICovCisJMHhCMSwgMHhDMiwgMHhCMSwgMHhCQywgMHhENSwgMHg2OCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHhCNCwgMHg3OCwgMHhENSwgMHhBNSwgMHhENSwgMHg3MSwgMHhCMSwgMHhDNywgLyogMHg4Qy0weDhGICovCisJMHhENSwgMHg3NCwgMHhENSwgMHhBNCwgMHhCMSwgMHhDNiwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHhEOSwgMHg1MiwgMHgwMCwgMHgwMCwgMHhCMSwgMHhCMywgMHhENSwgMHg2RiwgLyogMHg5NC0weDk3ICovCisJMHhCMSwgMHhCOCwgMHhCMSwgMHhDMywgMHgwMCwgMHgwMCwgMHhCMSwgMHhCRSwgLyogMHg5OC0weDlCICovCisJMHhENSwgMHg3OCwgMHhENSwgMHg2RSwgMHhENSwgMHg2QywgMHhENSwgMHg3RSwgLyogMHg5Qy0weDlGICovCisJMHhCMSwgMHhCMCwgMHhCMSwgMHhDNCwgMHhCMSwgMHhCNCwgMHhCNCwgMHg3NywgLyogMHhBMC0weEEzICovCisJMHhENSwgMHg3QywgMHhCMSwgMHhCNSwgMHgwMCwgMHgwMCwgMHhCMSwgMHhCMSwgLyogMHhBNC0weEE3ICovCisJMHhCMSwgMHhDMCwgMHhCMSwgMHhCQiwgMHhCMSwgMHhCOSwgMHhENSwgMHg3MCwgLyogMHhBOC0weEFCICovCisJMHhCMSwgMHhDNSwgMHhENSwgMHg2RCwgMHhENSwgMHg3QSwgMHhENSwgMHg3NiwgLyogMHhBQy0weEFGICovCisJMHhEOSwgMHg1NCwgMHhEOSwgMHg1MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHhENSwgMHg2QiwgMHhEOSwgMHg2NCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHhCNCwgMHg3QSwgMHgwMCwgMHgwMCwgMHhEOSwgMHg2QSwgMHhEOSwgMHg1OSwgLyogMHhDMC0weEMzICovCisJMHhEOSwgMHg2NywgMHhERCwgMHg3NywgMHhCNCwgMHg3RCwgMHhEOSwgMHg2QiwgLyogMHhDNC0weEM3ICovCisJMHhEOSwgMHg2RSwgMHhCNCwgMHg3QywgMHhEOSwgMHg1QywgMHhEOSwgMHg2RCwgLyogMHhDOC0weENCICovCisJMHhEOSwgMHg2QywgMHhCNCwgMHg3RSwgMHhEOSwgMHg1NSwgMHhCNCwgMHg3OSwgLyogMHhDQy0weENGICovCisJMHhCNCwgMHhBMywgMHgwMCwgMHgwMCwgMHhCNCwgMHhBMSwgMHhEOSwgMHg2OSwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHhEOSwgMHg1RiwgMHhCNCwgMHhBNSwgMHhEOSwgMHg3MCwgLyogMHhENC0weEQ3ICovCisJMHhEOSwgMHg2OCwgMHhEOSwgMHg3MSwgMHhCNCwgMHhBRCwgMHhCNCwgMHhBQiwgLyogMHhEOC0weERCICovCisJMHhEOSwgMHg2NiwgMHhEOSwgMHg2NSwgMHgwMCwgMHgwMCwgMHhEOSwgMHg2MywgLyogMHhEQy0weERGICovCisJMHhEOSwgMHg1RCwgMHhCNCwgMHhBNCwgMHgwMCwgMHgwMCwgMHhCNCwgMHhBMiwgLyogMHhFMC0weEUzICovCisJMHhEMSwgMHhCOSwgMHhEOSwgMHg1NiwgMHgwMCwgMHgwMCwgMHhERCwgMHhCNywgLyogMHhFNC0weEU3ICovCisJMHhEOSwgMHg1NywgMHhCNCwgMHg3QiwgMHhCNCwgMHhBQSwgMHhERCwgMHg3OSwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHhCNCwgMHhBNiwgMHhCNCwgMHhBNywgMHhEOSwgMHg1OCwgLyogMHhFQy0weEVGICovCisJMHhEOSwgMHg2RiwgMHhERCwgMHg3OCwgMHhEOSwgMHg2MCwgMHhEOSwgMHg1QiwgLyogMHhGMC0weEYzICovCisJMHhCNCwgMHhBOSwgMHhEOSwgMHg2MSwgMHhEOSwgMHg1RSwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHhCNCwgMHhBRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNjRbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI3LCAweDcwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweERELCAweDdDLCAweERELCAweEIxLCAweERELCAweEI2LCAvKiAweDA4LTB4MEIgKi8KKwkweERELCAweEFBLCAweEI3LCAweDZDLCAweERELCAweEJCLCAweEI3LCAweDY5LCAvKiAweDBDLTB4MEYgKi8KKwkweERELCAweDdBLCAweDAwLCAweDAwLCAweERELCAweDdCLCAweEI3LCAweDYyLCAvKiAweDEwLTB4MTMgKi8KKwkweEI3LCAweDZCLCAweERELCAweEE0LCAweEI3LCAweDZFLCAweEI3LCAweDZGLCAvKiAweDE0LTB4MTcgKi8KKwkweERELCAweEE1LCAweDAwLCAweDAwLCAweERELCAweEIyLCAweERELCAweEI4LCAvKiAweDE4LTB4MUIgKi8KKwkweEI3LCAweDZBLCAweDAwLCAweDAwLCAweEI3LCAweDY0LCAweERELCAweEEzLCAvKiAweDFDLTB4MUYgKi8KKwkweERELCAweDdELCAweERELCAweEJBLCAweERELCAweEE4LCAweERELCAweEE5LCAvKiAweDIwLTB4MjMgKi8KKwkweERELCAweDdFLCAweERELCAweEI0LCAweERELCAweEFCLCAweERELCAweEI1LCAvKiAweDI0LTB4MjcgKi8KKwkweERELCAweEFELCAweDAwLCAweDAwLCAweEI3LCAweDY1LCAweEUxLCAweEQ5LCAvKiAweDI4LTB4MkIgKi8KKwkweEI3LCAweDY4LCAweEI3LCAweDY2LCAweERELCAweEI5LCAweERELCAweEIwLCAvKiAweDJDLTB4MkYgKi8KKwkweERELCAweEFDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERELCAweEExLCAvKiAweDMwLTB4MzMgKi8KKwkweEJBLCAweDUzLCAweERELCAweEFGLCAweEI3LCAweDZELCAweERELCAweEE3LCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweERELCAweEE2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweEI3LCAweDY3LCAweEI3LCAweDYzLCAweEUxLCAweEVFLCAvKiAweDNDLTB4M0YgKi8KKwkweERELCAweEIzLCAweERELCAweEFFLCAweDAwLCAweDAwLCAweERELCAweEEyLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEU5LCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweERBLCAweEUxLCAweEU1LCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweEUxLCAweEVDLCAweEJBLCAweDUxLCAweEI0LCAweEFDLCAweEUxLCAweEVBLCAvKiAweDUwLTB4NTMgKi8KKwkweEJBLCAweDRDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweEJBLCAweDRCLCAweEUxLCAweEYxLCAweDAwLCAweDAwLCAweEUxLCAweERCLCAvKiAweDU4LTB4NUIgKi8KKwkweEUxLCAweEU4LCAweEUxLCAweERDLCAweEUxLCAweEU3LCAweEJBLCAweDRGLCAvKiAweDVDLTB4NUYgKi8KKwkweEUxLCAweEVCLCAweEQ5LCAweDYyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweEYyLCAweEUxLCAweEUzLCAweEJBLCAweDUyLCAvKiAweDY0LTB4NjcgKi8KKwkweEU1LCAweEJBLCAweEJDLCAweEFGLCAweDAwLCAweDAwLCAweEUxLCAweEYwLCAvKiAweDY4LTB4NkIgKi8KKwkweEUxLCAweEVGLCAweEJBLCAweDU0LCAweEU1LCAweEFELCAweEJDLCAweEIwLCAvKiAweDZDLTB4NkYgKi8KKwkweEU1LCAweEFFLCAweDAwLCAweDAwLCAweEUxLCAweERGLCAweEUxLCAweEUwLCAvKiAweDcwLTB4NzMgKi8KKwkweEUxLCAweERELCAweEUxLCAweEUyLCAweEUxLCAweERFLCAweEUxLCAweEYzLCAvKiAweDc0LTB4NzcgKi8KKwkweEJBLCAweDRFLCAweEJDLCAweEIxLCAweEJBLCAweDUwLCAweEJBLCAweDU1LCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweEUxLCAweEUxLCAweDAwLCAweDAwLCAweEUxLCAweEVELCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUxLCAweEU2LCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweEIxLCAweDAwLCAweDAwLCAweEJBLCAweDRBLCAvKiAweDg0LTB4ODcgKi8KKwkweEJDLCAweEI0LCAweEU5LCAweEFBLCAweEU1LCAweEI2LCAweEU1LCAweEI1LCAvKiAweDg4LTB4OEIgKi8KKwkweEU1LCAweEI3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU1LCAweEI0LCAvKiAweDhDLTB4OEYgKi8KKwkweEJDLCAweEI1LCAweDAwLCAweDAwLCAweEJDLCAweEJCLCAweEJDLCAweEI4LCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweEJDLCAweEI5LCAweEU1LCAweEFGLCAweEU1LCAweEIyLCAvKiAweDk0LTB4OTcgKi8KKwkweEU1LCAweEJDLCAweEJDLCAweEMxLCAweEJDLCAweEJGLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweEU1LCAweEIzLCAweEQ5LCAweDVBLCAweEJDLCAweEIyLCAweEU1LCAweEI5LCAvKiAweDlDLTB4OUYgKi8KKwkweEU1LCAweEIwLCAweDAwLCAweDAwLCAweEJDLCAweEMyLCAweEU1LCAweEI4LCAvKiAweEEwLTB4QTMgKi8KKwkweEJBLCAweDRELCAweEJDLCAweEI3LCAweEUxLCAweEU0LCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweEJDLCAweEJBLCAweDAwLCAweDAwLCAweEJDLCAweEJFLCAvKiAweEE4LTB4QUIgKi8KKwkweEJDLCAweEMwLCAweEJDLCAweEJELCAweEJDLCAweEJDLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweEJDLCAweEI2LCAweEU1LCAweEJCLCAweEJDLCAweEIzLCAweEJDLCAweEMzLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJFLCAweEQ4LCAvKiAweEI4LTB4QkIgKi8KKwkweEJFLCAweEQ5LCAweEU5LCAweEE5LCAweEJFLCAweEUyLCAweEJFLCAweERGLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweEJFLCAweEQ2LCAweEJFLCAweERELCAweEU5LCAweEFCLCAvKiAweEMwLTB4QzMgKi8KKwkweEJFLCAweERCLCAweEJFLCAweEQ1LCAweDAwLCAweDAwLCAweEJFLCAweERDLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweEE4LCAweEMwLCAweEJCLCAweEJFLCAweEQ3LCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweEJFLCAweERFLCAweEMwLCAweEJBLCAweEU5LCAweEE3LCAvKiAweENDLTB4Q0YgKi8KKwkweEU5LCAweEE2LCAweDAwLCAweDAwLCAweEJFLCAweEUwLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweEJFLCAweEUxLCAweDAwLCAweDAwLCAweEU5LCAweEE1LCAweEU5LCAweEE0LCAvKiAweEQ0LTB4RDcgKi8KKwkweEMwLCAweEJDLCAweEU5LCAweEFFLCAweEJFLCAweERBLCAweEU5LCAweEFDLCAvKiAweEQ4LTB4REIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweEMwLCAweEJELCAweDAwLCAweDAwLCAweEMwLCAweEMyLCAweEVDLCAweEVBLCAvKiAweEUwLTB4RTMgKi8KKwkweEVDLCAweEVDLCAweDAwLCAweDAwLCAweEMwLCAweEJGLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweEVDLCAweEVELCAweEVDLCAweEU5LCAweDAwLCAweDAwLCAweEVDLCAweEVCLCAvKiAweEU4LTB4RUIgKi8KKwkweEMwLCAweEMwLCAweEMwLCAweEMzLCAweDAwLCAweDAwLCAweEVDLCAweEU4LCAvKiAweEVDLTB4RUYgKi8KKwkweEMwLCAweEJFLCAweEMwLCAweEMxLCAweEMyLCAweDU5LCAweEU5LCAweEFELCAvKiAweEYwLTB4RjMgKi8KKwkweEMyLCAweDU4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMyLCAweDVFLCAvKiAweEY0LTB4RjcgKi8KKwkweEVGLCAweEQ0LCAweDAwLCAweDAwLCAweEMyLCAweDVDLCAweEMyLCAweDVELCAvKiAweEY4LTB4RkIgKi8KKwkweEVGLCAweEQ3LCAweEVGLCAweEQzLCAweEMyLCAweDVBLCAweEVGLCAweEQxLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182NVs1MTJdID0geworCTB4QzMsIDB4NkIsIDB4RUYsIDB4RDUsIDB4MDAsIDB4MDAsIDB4RUYsIDB4RDYsIC8qIDB4MDAtMHgwMyAqLworCTB4RUYsIDB4RDIsIDB4MDAsIDB4MDAsIDB4QzIsIDB4NUIsIDB4RjIsIDB4NDIsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4RjIsIDB4NDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4RjIsIDB4NDYsIDB4RjIsIDB4NDQsIDB4RjIsIDB4NDcsIDB4QzMsIDB4NkMsIC8qIDB4MEMtMHgwRiAqLworCTB4RjIsIDB4NDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjQsIDB4NEUsIC8qIDB4MTAtMHgxMyAqLworCTB4QzQsIDB4NjQsIDB4RjQsIDB4NEQsIDB4RjQsIDB4NEMsIDB4RjQsIDB4NEIsIC8qIDB4MTQtMHgxNyAqLworCTB4QzQsIDB4NjMsIDB4QzQsIDB4NjUsIDB4MDAsIDB4MDAsIDB4RjUsIDB4Q0QsIC8qIDB4MTgtMHgxQiAqLworCTB4QzQsIDB4RTIsIDB4QzQsIDB4RTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4RjYsIDB4RTEsIDB4RjYsIDB4RTAsIDB4RjYsIDB4RTMsIDB4QzUsIDB4Q0IsIC8qIDB4MjAtMHgyMyAqLworCTB4QzUsIDB4NzUsIDB4RjcsIDB4REQsIDB4RjYsIDB4RTIsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4RjcsIDB4REMsIDB4QzUsIDB4Q0QsIDB4QzUsIDB4Q0MsIC8qIDB4MjgtMHgyQiAqLworCTB4QzUsIDB4RjMsIDB4RjgsIDB4QTksIDB4RjgsIDB4RUYsIDB4QTQsIDB4RTQsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDksIDB4NzIsIDB4RTksIDB4QUYsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTYsIDB4QUMsIDB4Q0EsIDB4RjcsIC8qIDB4MzQtMHgzNyAqLworCTB4QTcsIDB4RjEsIDB4QTcsIDB4RUYsIDB4MDAsIDB4MDAsIDB4QTcsIDB4RjAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4Q0MsIDB4QzEsIDB4QTksIDB4RjEsIDB4QUMsIDB4NDYsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4Q0UsIDB4RTcsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4RTgsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4QUMsIDB4NDcsIDB4RDEsIDB4Q0UsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4QUUsIDB4QzQsIDB4QUUsIDB4QzUsIDB4RDEsIDB4Q0QsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjEsIDB4RDMsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4QjEsIDB4Q0YsIDB4MDAsIDB4MDAsIDB4RDUsIDB4QTcsIC8qIDB4NTAtMHg1MyAqLworCTB4QjEsIDB4RDYsIDB4QjEsIDB4RDUsIDB4QjEsIDB4Q0UsIDB4QjEsIDB4RDEsIC8qIDB4NTQtMHg1NyAqLworCTB4QjEsIDB4RDQsIDB4QjEsIDB4RDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4RDksIDB4NzYsIDB4QjEsIDB4Q0QsIDB4QjQsIDB4QUYsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjQsIDB4QjEsIDB4QjQsIDB4QjIsIC8qIDB4NjAtMHg2MyAqLworCTB4RDksIDB4NzUsIDB4RDksIDB4NzgsIDB4QjQsIDB4QjAsIDB4RDksIDB4NzMsIC8qIDB4NjQtMHg2NyAqLworCTB4RDksIDB4NzcsIDB4MDAsIDB4MDAsIDB4RDksIDB4NzQsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4QjcsIDB4NzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REQsIDB4QkMsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkEsIDB4NTYsIDB4RTEsIDB4RjQsIC8qIDB4NzAtMHg3MyAqLworCTB4QkUsIDB4RTMsIDB4QkMsIDB4QzQsIDB4RTUsIDB4QkQsIDB4QkMsIDB4QzUsIC8qIDB4NzQtMHg3NyAqLworCTB4QkMsIDB4QzYsIDB4RTUsIDB4QkYsIDB4RTUsIDB4QkUsIDB4RTUsIDB4QzAsIC8qIDB4NzgtMHg3QiAqLworCTB4RTksIDB4QjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4QjAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RUMsIDB4RUYsIDB4RUMsIDB4RUUsIDB4QzAsIDB4QzQsIDB4QzAsIDB4QzUsIC8qIDB4ODAtMHg4MyAqLworCTB4RjIsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTQsIDB4RTUsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4RDksIDB4NzksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4QjQsIDB4QjQsIDB4QjQsIDB4QjMsIDB4REQsIDB4QkQsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4RUYsIDB4RDgsIDB4QzQsIDB4RTMsIDB4RjcsIDB4REUsIDB4QTQsIDB4RTYsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4QUUsIDB4QzYsIDB4MDAsIDB4MDAsIDB4QjEsIDB4RDgsIC8qIDB4OTgtMHg5QiAqLworCTB4QjEsIDB4RDcsIDB4RDksIDB4N0EsIDB4RDksIDB4N0IsIDB4QjcsIDB4NzIsIC8qIDB4OUMtMHg5RiAqLworCTB4RTEsIDB4RjUsIDB4QkEsIDB4NTcsIDB4RTksIDB4QjIsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4QTQsIDB4RTcsIDB4QTUsIDB4QjgsIDB4MDAsIDB4MDAsIDB4QTksIDB4RjIsIC8qIDB4QTQtMHhBNyAqLworCTB4Q0MsIDB4QzIsIDB4MDAsIDB4MDAsIDB4Q0UsIDB4RTksIDB4QUMsIDB4NDgsIC8qIDB4QTgtMHhBQiAqLworCTB4QjEsIDB4RDksIDB4MDAsIDB4MDAsIDB4RDksIDB4N0MsIDB4QjQsIDB4QjUsIC8qIDB4QUMtMHhBRiAqLworCTB4QjcsIDB4NzMsIDB4MDAsIDB4MDAsIDB4RTUsIDB4QzEsIDB4RTUsIDB4QzIsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUMsIDB4RjAsIDB4QzIsIDB4NUYsIC8qIDB4QjQtMHhCNyAqLworCTB4RjgsIDB4RjAsIDB4QTQsIDB4RTgsIDB4MDAsIDB4MDAsIDB4Q0MsIDB4QzMsIC8qIDB4QjgtMHhCQiAqLworCTB4QTksIDB4RjMsIDB4QUMsIDB4NDksIDB4MDAsIDB4MDAsIDB4Q0UsIDB4RUEsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4QUUsIDB4QzcsIDB4RDEsIDB4RDIsIDB4RDEsIDB4RDAsIC8qIDB4QzAtMHhDMyAqLworCTB4RDEsIDB4RDEsIDB4QUUsIDB4QzgsIDB4RDEsIDB4Q0YsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjEsIDB4REIsIC8qIDB4QzgtMHhDQiAqLworCTB4QjEsIDB4REMsIDB4RDUsIDB4QTgsIDB4QjEsIDB4REQsIDB4QjEsIDB4REEsIC8qIDB4Q0MtMHhDRiAqLworCTB4RDksIDB4N0QsIDB4MDAsIDB4MDAsIDB4RDksIDB4N0UsIDB4REQsIDB4QkUsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkEsIDB4NTksIDB4QkEsIDB4NTgsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUMsIDB4RjEsIDB4RUYsIDB4RDksIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4RjIsIDB4NEEsIDB4RjIsIDB4NDksIDB4RjQsIDB4NEYsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4QzksIDB4NUUsIDB4QUMsIDB4NEEsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4QTQsIDB4RTksIDB4QTUsIDB4QjksIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4QTYsIDB4QUUsIDB4QTYsIDB4QUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4QTYsIDB4QUYsIDB4QTYsIDB4QjAsIDB4QzksIDB4RUUsIDB4QzksIDB4RUQsIC8qIDB4RUMtMHhFRiAqLworCTB4Q0EsIDB4RjgsIDB4QTcsIDB4RjIsIDB4Q0EsIDB4RkIsIDB4Q0EsIDB4RkEsIC8qIDB4RjAtMHhGMyAqLworCTB4Q0EsIDB4RjksIDB4Q0EsIDB4RkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTksIDB4RjQsIDB4Q0MsIDB4QzksIC8qIDB4RjgtMHhGQiAqLworCTB4Q0MsIDB4QzUsIDB4Q0MsIDB4Q0UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzY2WzUxMl0gPSB7CisJMHhBOSwgMHhGQiwgMHgwMCwgMHgwMCwgMHhBOSwgMHhGOSwgMHhDQywgMHhDQSwgLyogMHgwMC0weDAzICovCisJMHhDQywgMHhDNiwgMHhDQywgMHhDRCwgMHhBOSwgMHhGOCwgMHhBQSwgMHg0MCwgLyogMHgwNC0weDA3ICovCisJMHhDQywgMHhDOCwgMHhDQywgMHhDNCwgMHhBOSwgMHhGRSwgMHhDQywgMHhDQiwgLyogMHgwOC0weDBCICovCisJMHhBOSwgMHhGNywgMHhDQywgMHhDQywgMHhBOSwgMHhGQSwgMHhBOSwgMHhGQywgLyogMHgwQy0weDBGICovCisJMHhDQywgMHhEMCwgMHhDQywgMHhDRiwgMHhDQywgMHhDNywgMHhBOSwgMHhGNiwgLyogMHgxMC0weDEzICovCisJMHhBOSwgMHhGNSwgMHhBOSwgMHhGRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHhDRSwgMHhFRiwgMHhDRSwgMHhGNSwgMHgwMCwgMHgwMCwgMHhBQywgMHg1MCwgLyogMHgxQy0weDFGICovCisJMHhBQywgMHg0RCwgMHhDRSwgMHhFQywgMHhDRSwgMHhGMSwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHhBQywgMHg1MywgMHhBQywgMHg0QiwgMHhDRSwgMHhGMCwgMHhBQywgMHg0RSwgLyogMHgyNC0weDI3ICovCisJMHhBQywgMHg1MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRSwgMHhGMywgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHhBQywgMHg0QywgMHhDRSwgMHhGOCwgMHhBQywgMHg0RiwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHhBQywgMHg1MiwgMHhDRSwgMHhFRCwgMHhDRSwgMHhGMiwgLyogMHgzMC0weDMzICovCisJMHhDRSwgMHhGNiwgMHhDRSwgMHhFRSwgMHhDRSwgMHhFQiwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHhDRSwgMHhGNywgMHhDRSwgMHhGNCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHhBRSwgMHhEMCwgMHhBRSwgMHhDOSwgMHhBRSwgMHhDQywgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHhBRSwgMHhDRiwgMHgwMCwgMHgwMCwgMHhEMSwgMHhENSwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHhBRSwgMHhDQSwgMHhEMSwgMHhEMywgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHhBRSwgMHhDRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBRSwgMHhDQiwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHhEMSwgMHhENiwgMHhBRSwgMHhDRCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhENSwgMHhBQywgMHhCMSwgMHhERiwgMHhENSwgMHhBQiwgLyogMHg1OC0weDVCICovCisJMHhENSwgMHhBRCwgMHhCMSwgMHhERSwgMHhCMSwgMHhFMywgMHhEMSwgMHhENCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHhENSwgMHhBQSwgMHhENSwgMHhBRSwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHhCMSwgMHhFMCwgMHhENSwgMHhBOSwgMHhCMSwgMHhFMiwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHhCMSwgMHhFMSwgMHgwMCwgMHgwMCwgMHhEOSwgMHhBNywgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHhEOSwgMHhBMiwgMHgwMCwgMHgwMCwgMHhCNCwgMHhCNiwgMHhCNCwgMHhCQSwgLyogMHg2Qy0weDZGICovCisJMHhCNCwgMHhCNywgMHhEOSwgMHhBNSwgMHhEOSwgMHhBOCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHhCNCwgMHhCOCwgMHgwMCwgMHgwMCwgMHhCNCwgMHhCOSwgMHhCNCwgMHhCRSwgLyogMHg3NC0weDc3ICovCisJMHhERCwgMHhDNywgMHhEOSwgMHhBNiwgMHhCNCwgMHhCQywgMHhEOSwgMHhBMywgLyogMHg3OC0weDdCICovCisJMHhEOSwgMHhBMSwgMHgwMCwgMHgwMCwgMHhCNCwgMHhCRCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHhEOSwgMHhBNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHhCNywgMHg3OSwgMHgwMCwgMHgwMCwgMHhERCwgMHhCRiwgMHhCNywgMHg3NiwgLyogMHg4NC0weDg3ICovCisJMHhCNywgMHg3NywgMHhCNywgMHg3NSwgMHhERCwgMHhDNCwgMHhERCwgMHhDMywgLyogMHg4OC0weDhCICovCisJMHhERCwgMHhDMCwgMHhCNywgMHg3QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHhERCwgMHhDMiwgMHhCNCwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHhERCwgMHhDNiwgMHhERCwgMHhDMSwgMHhCNywgMHg3OCwgMHhCNywgMHg3NCwgLyogMHg5NC0weDk3ICovCisJMHhCNywgMHg3QSwgMHhERCwgMHhDNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHhCQSwgMHg1QywgMHgwMCwgMHgwMCwgMHhFMSwgMHhGOCwgLyogMHg5Qy0weDlGICovCisJMHhFMSwgMHhGNywgMHhFMSwgMHhGNiwgMHhCQSwgMHg1QSwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHhCQSwgMHg1QiwgMHhFNSwgMHhDNSwgMHhFNSwgMHhDOCwgMHhCQywgMHhDOCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQywgMHhDNywgMHhFNSwgMHhDOSwgLyogMHhBQy0weEFGICovCisJMHhFNSwgMHhDNCwgMHhCQywgMHhDQSwgMHhFNSwgMHhDNiwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHhCQywgMHhDOSwgMHhFNSwgMHhDMywgMHgwMCwgMHgwMCwgMHhFNSwgMHhDNywgLyogMHhCNC0weEI3ICovCisJMHhCRSwgMHhFOSwgMHhCRSwgMHhFNiwgMHhFOSwgMHhCQiwgMHhFOSwgMHhCQSwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHhFOSwgMHhCOSwgMHhFOSwgMHhCNCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHhFOSwgMHhCNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHhCRSwgMHhFNywgMHgwMCwgMHgwMCwgMHhCRSwgMHhFNCwgMHhCRSwgMHhFOCwgLyogMHhDNC0weEM3ICovCisJMHhFOSwgMHhCMywgMHhCRSwgMHhFNSwgMHhFOSwgMHhCNiwgMHhFOSwgMHhCNywgLyogMHhDOC0weENCICovCisJMHhFOSwgMHhCQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhCOCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQywgMHhGMiwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMCwgMHhDNywgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHhFRiwgMHhEQywgMHhDMCwgMHhDNiwgMHhFRiwgMHhEQSwgMHhFRiwgMHhEQiwgLyogMHhEOC0weERCICovCisJMHhDMiwgMHg2MCwgMHhDMywgMHg2RSwgMHhGMiwgMHg0QiwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHhDMywgMHg2RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNCwgMHg1MSwgLyogMHhFMC0weEUzICovCisJMHhGNCwgMHg1MiwgMHgwMCwgMHgwMCwgMHhDNCwgMHg2NiwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHhGNCwgMHg1MCwgMHhDNCwgMHhFNCwgMHgwMCwgMHgwMCwgMHhGNywgMHhERiwgLyogMHhFOC0weEVCICovCisJMHhDNSwgMHhDRSwgMHhGOCwgMHhBQSwgMHhGOCwgMHhBQiwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHhBNCwgMHhFQSwgMHgwMCwgMHgwMCwgMHhBNiwgMHhCMSwgMHhBNiwgMHhCMiwgLyogMHhGMC0weEYzICovCisJMHhBNywgMHhGMywgMHgwMCwgMHgwMCwgMHhDQywgMHhEMSwgMHhBQywgMHg1NCwgLyogMHhGNC0weEY3ICovCisJMHhBRSwgMHhEMSwgMHhCMSwgMHhFNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHhCMCwgMHhEMiwgMHgwMCwgMHgwMCwgMHhCNCwgMHhCRiwgMHhCNCwgMHhDMCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNjdbNTEyXSA9IHsKKwkweEIzLCAweENDLCAweEQ5LCAweEE5LCAweDAwLCAweDAwLCAweEI3LCAweDdDLCAvKiAweDAwLTB4MDMgKi8KKwkweEUxLCAweEZBLCAweEUxLCAweEY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweEE0LCAweEVCLCAweEE2LCAweEIzLCAweENDLCAweEQyLCAweEFBLCAweDQyLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweEFBLCAweDQxLCAweDAwLCAweDAwLCAweENFLCAweEY5LCAvKiAweDBDLTB4MEYgKi8KKwkweENFLCAweEZBLCAweDAwLCAweDAwLCAweEQxLCAweEQ3LCAweEQxLCAweEQ4LCAvKiAweDEwLTB4MTMgKi8KKwkweEFFLCAweEQyLCAweEFFLCAweEQzLCAweDAwLCAweDAwLCAweEFFLCAweEQ0LCAvKiAweDE0LTB4MTcgKi8KKwkweEQ1LCAweEFGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIxLCAweEU2LCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweEI0LCAweEMyLCAweDAwLCAweDAwLCAweEI0LCAweEMxLCAvKiAweDFDLTB4MUYgKi8KKwkweERELCAweEM4LCAweERGLCAweDdBLCAweEUxLCAweEZCLCAweEU5LCAweEJELCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMyLCAweDYxLCAweEM0LCAweDY3LCAvKiAweDI0LTB4MjcgKi8KKwkweEE0LCAweEVDLCAweDAwLCAweDAwLCAweEE1LCAweEJDLCAweEE1LCAweEJELCAvKiAweDI4LTB4MkIgKi8KKwkweEE1LCAweEJCLCAweEE1LCAweEJFLCAweEE1LCAweEJBLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweEE2LCAweEI2LCAweDAwLCAweDAwLCAweEM5LCAweEY2LCAvKiAweDMwLTB4MzMgKi8KKwkweEE2LCAweEI1LCAweEE2LCAweEI3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweEM5LCAweEYxLCAweEM5LCAweEYwLCAweEM5LCAweEYzLCAweEM5LCAweEYyLCAvKiAweDM4LTB4M0IgKi8KKwkweEM5LCAweEY1LCAweEE2LCAweEI0LCAweEM5LCAweEVGLCAweEM5LCAweEY0LCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweENBLCAweEZELCAweEE3LCAweEZELCAweENBLCAweEZFLCAvKiAweDQ0LTB4NDcgKi8KKwkweENCLCAweDQzLCAweEE3LCAweEZDLCAweDAwLCAweDAwLCAweENCLCAweDQ3LCAvKiAweDQ4LTB4NEIgKi8KKwkweENCLCAweDQyLCAweENCLCAweDQ1LCAweEE3LCAweEY1LCAweEE3LCAweEY2LCAvKiAweDRDLTB4NEYgKi8KKwkweEE3LCAweEY3LCAweEE3LCAweEY4LCAweDAwLCAweDAwLCAweEE4LCAweDQwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweENCLCAweDQxLCAweEE3LCAweEZBLCAweEE4LCAweDQxLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweENCLCAweDQwLCAweENCLCAweDQ2LCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweEE3LCAweEY5LCAweENCLCAweDQ0LCAweEE3LCAweEZCLCAweEE3LCAweEY0LCAvKiAweDVDLTB4NUYgKi8KKwkweEE3LCAweEZFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEFBLCAweDU3LCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweENDLCAweEQ0LCAweEFBLCAweDQzLCAweDAwLCAweDAwLCAweEFBLCAweDRELCAvKiAweDZDLTB4NkYgKi8KKwkweEFBLCAweDRFLCAweEFBLCAweDQ2LCAweEFBLCAweDU4LCAweEFBLCAweDQ4LCAvKiAweDcwLTB4NzMgKi8KKwkweENDLCAweERDLCAweEFBLCAweDUzLCAweENDLCAweEQ3LCAweEFBLCAweDQ5LCAvKiAweDc0LTB4NzcgKi8KKwkweENDLCAweEU2LCAweENDLCAweEU3LCAweENDLCAweERGLCAweENDLCAweEQ4LCAvKiAweDc4LTB4N0IgKi8KKwkweEFBLCAweDU2LCAweENDLCAweEU0LCAweEFBLCAweDUxLCAweEFBLCAweDRGLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweENDLCAweEU1LCAweDAwLCAweDAwLCAweENDLCAweEUzLCAvKiAweDgwLTB4ODMgKi8KKwkweENDLCAweERCLCAweENDLCAweEQzLCAweENDLCAweERBLCAweEFBLCAweDRBLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweEFBLCAweDUwLCAweDAwLCAweDAwLCAweEFBLCAweDQ0LCAvKiAweDg4LTB4OEIgKi8KKwkweENDLCAweERFLCAweENDLCAweERELCAweENDLCAweEQ1LCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweEFBLCAweDUyLCAweENDLCAweEUxLCAweENDLCAweEQ2LCAweEFBLCAweDU1LCAvKiAweDkwLTB4OTMgKi8KKwkweENDLCAweEU4LCAweEFBLCAweDQ1LCAweDAwLCAweDAwLCAweEFBLCAweDRDLCAvKiAweDk0LTB4OTcgKi8KKwkweENDLCAweEQ5LCAweENDLCAweEUyLCAweEFBLCAweDU0LCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweEFBLCAweDQ3LCAweEFBLCAweDRCLCAweDAwLCAweDAwLCAweENDLCAweEUwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENGLCAweDVCLCAweEFDLCAweDVDLCAvKiAweEFDLTB4QUYgKi8KKwkweEFDLCAweDY5LCAweDAwLCAweDAwLCAweENGLCAweDU2LCAweENGLCAweDRDLCAvKiAweEIwLTB4QjMgKi8KKwkweEFDLCAweDYyLCAweENGLCAweDRBLCAweEFDLCAweDVCLCAweENGLCAweDQ1LCAvKiAweEI0LTB4QjcgKi8KKwkweEFDLCAweDY1LCAweENGLCAweDUyLCAweENFLCAweEZFLCAweENGLCAweDQxLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweENGLCAweDQ0LCAweENFLCAweEZCLCAweENGLCAweDUxLCAweENGLCAweDYxLCAvKiAweEMwLTB4QzMgKi8KKwkweEFDLCAweDYwLCAweENGLCAweDQ2LCAweENGLCAweDU4LCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweENFLCAweEZELCAweENGLCAweDVGLCAweENGLCAweDYwLCAweENGLCAweDYzLCAvKiAweEM4LTB4Q0IgKi8KKwkweENGLCAweDVBLCAweENGLCAweDRCLCAweENGLCAweDUzLCAweEFDLCAweDY2LCAvKiAweENDLTB4Q0YgKi8KKwkweEFDLCAweDU5LCAweEFDLCAweDYxLCAweEFDLCAweDZELCAweEFDLCAweDU2LCAvKiAweEQwLTB4RDMgKi8KKwkweEFDLCAweDU4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweENGLCAweDQzLCAweEFDLCAweDZBLCAweEFDLCAweDYzLCAweENGLCAweDVELCAvKiAweEQ4LTB4REIgKi8KKwkweENGLCAweDQwLCAweEFDLCAweDZDLCAweEFDLCAweDY3LCAweENGLCAweDQ5LCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEFDLCAweDZCLCAweENGLCAweDUwLCAvKiAweEUwLTB4RTMgKi8KKwkweENGLCAweDQ4LCAweEFDLCAweDY0LCAweENGLCAweDVDLCAweENGLCAweDU0LCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweEFDLCAweDVFLCAweENGLCAweDYyLCAweENGLCAweDQ3LCAvKiAweEU4LTB4RUIgKi8KKwkweEFDLCAweDVBLCAweENGLCAweDU5LCAweENGLCAweDRGLCAweEFDLCAweDVGLCAvKiAweEVDLTB4RUYgKi8KKwkweENGLCAweDU1LCAweEFDLCAweDU3LCAweENFLCAweEZDLCAweEFDLCAweDY4LCAvKiAweEYwLTB4RjMgKi8KKwkweEFFLCAweEUzLCAweEFDLCAweDVELCAweENGLCAweDRFLCAweENGLCAweDRELCAvKiAweEY0LTB4RjcgKi8KKwkweENGLCAweDQyLCAweDAwLCAweDAwLCAweENGLCAweDVFLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweENGLCAweDU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEFDLCAweDU1LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182OFs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDEsIDB4RUMsIDB4QUUsIDB4RUEsIC8qIDB4MTAtMHgxMyAqLworCTB4RDEsIDB4RUQsIDB4MDAsIDB4MDAsIDB4RDEsIDB4RTEsIDB4QUUsIDB4REYsIC8qIDB4MTQtMHgxNyAqLworCTB4QUUsIDB4RUIsIDB4MDAsIDB4MDAsIDB4RDEsIDB4REEsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4RDEsIDB4RTMsIDB4RDEsIDB4RUIsIDB4MDAsIDB4MDAsIDB4RDEsIDB4RDksIC8qIDB4MUMtMHgxRiAqLworCTB4RDEsIDB4RjQsIDB4QUUsIDB4RDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4RDEsIDB4RjMsIDB4RDEsIDB4RUUsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4RDEsIDB4RUYsIDB4QUUsIDB4REQsIDB4QUUsIDB4RTgsIDB4RDEsIDB4RTUsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4RDEsIDB4RTYsIDB4RDEsIDB4RjAsIDB4RDEsIDB4RTcsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4RDEsIDB4RTIsIDB4RDEsIDB4REMsIDB4RDEsIDB4REQsIC8qIDB4MzAtMHgzMyAqLworCTB4RDEsIDB4RUEsIDB4RDEsIDB4RTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4QUUsIDB4RDYsIDB4QUUsIDB4REEsIDB4RDEsIDB4RjIsIDB4RDEsIDB4REUsIC8qIDB4MzgtMHgzQiAqLworCTB4QUUsIDB4RTYsIDB4QUUsIDB4RTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4QUUsIDB4RTUsIDB4QUUsIDB4RUMsIDB4QUUsIDB4REIsIDB4QUUsIDB4RTcsIC8qIDB4NDAtMHg0MyAqLworCTB4RDEsIDB4RTksIDB4QUUsIDB4RTksIDB4QUUsIDB4RDgsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4QUUsIDB4RDcsIDB4RDEsIDB4REIsIDB4MDAsIDB4MDAsIDB4RDEsIDB4REYsIC8qIDB4NDgtMHg0QiAqLworCTB4QUUsIDB4RTAsIDB4RDEsIDB4RjEsIDB4RDEsIDB4RTgsIDB4RDEsIDB4RTAsIC8qIDB4NEMtMHg0RiAqLworCTB4QUUsIDB4RTQsIDB4QUUsIDB4RTEsIDB4MDAsIDB4MDAsIDB4QUUsIDB4RDksIC8qIDB4NTAtMHg1MyAqLworCTB4QUUsIDB4REMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDUsIDB4QzQsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4RDUsIDB4QjQsIDB4RDUsIDB4QjUsIDB4RDUsIDB4QjksIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4RDUsIDB4QzgsIDB4RDUsIDB4QzUsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4RDUsIDB4QkUsIDB4RDUsIDB4QkQsIDB4QjEsIDB4RUQsIDB4RDUsIDB4QzEsIC8qIDB4NzQtMHg3NyAqLworCTB4RDUsIDB4RDAsIDB4RDUsIDB4QjAsIDB4MDAsIDB4MDAsIDB4RDUsIDB4RDEsIC8qIDB4NzgtMHg3QiAqLworCTB4RDUsIDB4QzMsIDB4RDUsIDB4RDUsIDB4RDUsIDB4QzksIDB4QjEsIDB4RUMsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RDUsIDB4QzcsIDB4QjEsIDB4RTcsIDB4QjEsIDB4RkMsIDB4QjEsIDB4RjIsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4QjEsIDB4RjYsIDB4QjEsIDB4RjUsIDB4RDUsIDB4QjEsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4RDUsIDB4Q0UsIDB4RDUsIDB4RDQsIDB4RDUsIDB4Q0MsIC8qIDB4ODgtMHg4QiAqLworCTB4RDUsIDB4RDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDUsIDB4QzAsIC8qIDB4OEMtMHg4RiAqLworCTB4RDUsIDB4QjIsIDB4RDUsIDB4RDIsIDB4RDUsIDB4QzIsIDB4QjEsIDB4RUEsIC8qIDB4OTAtMHg5MyAqLworCTB4QjEsIDB4RjcsIDB4MDAsIDB4MDAsIDB4RDUsIDB4Q0IsIDB4QjEsIDB4RjAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDUsIDB4Q0EsIC8qIDB4OTgtMHg5QiAqLworCTB4RDUsIDB4QjMsIDB4QjEsIDB4RjgsIDB4MDAsIDB4MDAsIDB4QjEsIDB4RkEsIC8qIDB4OUMtMHg5RiAqLworCTB4RDUsIDB4Q0QsIDB4QjEsIDB4RkIsIDB4QjEsIDB4RTksIDB4RDUsIDB4QkEsIC8qIDB4QTAtMHhBMyAqLworCTB4RDUsIDB4Q0YsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjEsIDB4RUYsIC8qIDB4QTQtMHhBNyAqLworCTB4QjEsIDB4RjksIDB4RDUsIDB4QkMsIDB4RDUsIDB4QzYsIDB4RDUsIDB4QjcsIC8qIDB4QTgtMHhBQiAqLworCTB4RDUsIDB4QkIsIDB4QjEsIDB4RjQsIDB4RDUsIDB4QjYsIDB4QjEsIDB4RTgsIC8qIDB4QUMtMHhBRiAqLworCTB4QjEsIDB4RjEsIDB4QjEsIDB4RUUsIDB4RDUsIDB4QkYsIDB4QUUsIDB4REUsIC8qIDB4QjAtMHhCMyAqLworCTB4RDksIDB4QzAsIDB4QjEsIDB4RUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4QjEsIDB4RjMsIDB4MDAsIDB4MDAsIDB4RDksIDB4QzMsIDB4RDksIDB4RDksIC8qIDB4QzQtMHhDNyAqLworCTB4RDksIDB4Q0UsIDB4QjQsIDB4RDYsIDB4MDAsIDB4MDAsIDB4QjQsIDB4RDEsIC8qIDB4QzgtMHhDQiAqLworCTB4RDksIDB4QkQsIDB4QjQsIDB4RDIsIDB4RDksIDB4Q0QsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4RDksIDB4QzYsIDB4RDksIDB4RDMsIDB4QjQsIDB4Q0UsIDB4RDksIDB4QUIsIC8qIDB4RDAtMHhEMyAqLworCTB4RDksIDB4RDUsIDB4QjQsIDB4QzQsIDB4RDksIDB4QjMsIDB4QjQsIDB4QzcsIC8qIDB4RDQtMHhENyAqLworCTB4QjQsIDB4QzYsIDB4MDAsIDB4MDAsIDB4QjQsIDB4RDcsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4RDksIDB4QUQsIDB4RDksIDB4Q0YsIDB4RDksIDB4RDAsIDB4QjQsIDB4QzksIC8qIDB4REMtMHhERiAqLworCTB4QjQsIDB4QzUsIDB4RDksIDB4QkIsIDB4MDAsIDB4MDAsIDB4QjQsIDB4RDAsIC8qIDB4RTAtMHhFMyAqLworCTB4RDksIDB4QjYsIDB4MDAsIDB4MDAsIDB4RDksIDB4RDEsIDB4QjQsIDB4Q0MsIC8qIDB4RTQtMHhFNyAqLworCTB4RDksIDB4QzksIDB4RDksIDB4RDYsIDB4RDksIDB4QjAsIDB4RDksIDB4QjUsIC8qIDB4RTgtMHhFQiAqLworCTB4RDksIDB4QUYsIDB4MDAsIDB4MDAsIDB4QjQsIDB4Q0IsIDB4RDksIDB4QzIsIC8qIDB4RUMtMHhFRiAqLworCTB4REQsIDB4REUsIDB4RDksIDB4QjEsIDB4QjQsIDB4Q0YsIDB4RDksIDB4QkEsIC8qIDB4RjAtMHhGMyAqLworCTB4RDksIDB4RDIsIDB4QjQsIDB4Q0EsIDB4RDksIDB4QjcsIDB4RDksIDB4QjQsIC8qIDB4RjQtMHhGNyAqLworCTB4RDksIDB4QzUsIDB4QjQsIDB4Q0QsIDB4QjQsIDB4QzMsIDB4QjQsIDB4RDksIC8qIDB4RjgtMHhGQiAqLworCTB4RDksIDB4QzgsIDB4RDksIDB4QzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzY5WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHhEOSwgMHhBQywgMHhCNCwgMHhDOCwgMHhEOSwgMHhENCwgMHhEOSwgMHhCQywgLyogMHgwNC0weDA3ICovCisJMHhEOSwgMHhCRSwgMHgwMCwgMHgwMCwgMHhEOSwgMHhDQiwgMHhEOSwgMHhDQSwgLyogMHgwOC0weDBCICovCisJMHhEOSwgMHhBQSwgMHhCNCwgMHhEMywgMHhCNCwgMHhENSwgMHhEOSwgMHhCMiwgLyogMHgwQy0weDBGICovCisJMHhEOSwgMHhCOSwgMHhEOSwgMHhDMSwgMHhCNCwgMHhENCwgMHhEOSwgMHhCOCwgLyogMHgxMC0weDEzICovCisJMHhEOSwgMHhDNCwgMHhEOSwgMHhENywgMHgwMCwgMHgwMCwgMHhEOSwgMHhDQywgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhEOSwgMHhEOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOSwgMHhBRSwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERCwgMHhGMiwgLyogMHgyQy0weDJGICovCisJMHhCNywgMHhBNiwgMHgwMCwgMHgwMCwgMHhERCwgMHhGMCwgMHhERCwgMHhEQiwgLyogMHgzMC0weDMzICovCisJMHhERCwgMHhFMCwgMHhERCwgMHhEOSwgMHgwMCwgMHgwMCwgMHhERCwgMHhFQywgLyogMHgzNC0weDM3ICovCisJMHhERCwgMHhDQiwgMHhERCwgMHhEMiwgMHgwMCwgMHgwMCwgMHhERCwgMHhFQSwgLyogMHgzOC0weDNCICovCisJMHhERCwgMHhGNCwgMHhERCwgMHhEQywgMHgwMCwgMHgwMCwgMHhERCwgMHhDRiwgLyogMHgzQy0weDNGICovCisJMHhERCwgMHhFMiwgMHhERCwgMHhFNywgMHhERCwgMHhEMywgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHhERCwgMHhFNCwgMHhERCwgMHhEMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHhERCwgMHhENywgMHhERCwgMHhEOCwgMHhCNywgMHhBOCwgMHhERCwgMHhFQiwgLyogMHg0OC0weDRCICovCisJMHhERCwgMHhFOSwgMHgwMCwgMHgwMCwgMHhERCwgMHhDQywgMHhERCwgMHhFRSwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHhERCwgMHhFRiwgMHhERCwgMHhGMSwgMHhCNywgMHhBQywgLyogMHg1MC0weDUzICovCisJMHhCNywgMHhBNCwgMHgwMCwgMHgwMCwgMHhENSwgMHhCOCwgMHhERCwgMHhENCwgLyogMHg1NC0weDU3ICovCisJMHhERCwgMHhFNiwgMHhERCwgMHhENSwgMHhCNywgMHhBMSwgMHhCNywgMHhCMSwgLyogMHg1OC0weDVCICovCisJMHhERCwgMHhFRCwgMHhCNywgMHhBRiwgMHhCNywgMHhBQiwgMHhERCwgMHhDQSwgLyogMHg1Qy0weDVGICovCisJMHhCNywgMHhBMywgMHgwMCwgMHgwMCwgMHhERCwgMHhDRCwgMHhCNywgMHhCMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHhERCwgMHhERCwgMHhERCwgMHhDOSwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHhCNywgMHhBOSwgMHhERCwgMHhFMSwgMHhERCwgMHhEMSwgMHhCNywgMHhBQSwgLyogMHg2OC0weDZCICovCisJMHhERCwgMHhEQSwgMHhCNywgMHg3RSwgMHhCNCwgMHhEOCwgMHhERCwgMHhFMywgLyogMHg2Qy0weDZGICovCisJMHhEOSwgMHhCRiwgMHhERCwgMHhDRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHhERCwgMHhFOCwgMHhCNywgMHhBNSwgMHhERCwgMHhFNSwgMHhCNywgMHhBMiwgLyogMHg3NC0weDc3ICovCisJMHhERCwgMHhERiwgMHhCNywgMHhBRCwgMHhERCwgMHhENiwgMHhERCwgMHhGMywgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCNywgMHhBNywgMHhERSwgMHhDNiwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCNywgMHhBRSwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHg0QSwgMHhFMiwgMHg0OCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHhFMiwgMHg1RSwgMHhFMiwgMHg0NiwgMHgwMCwgMHgwMCwgMHhFMiwgMHg1OCwgLyogMHg5MC0weDkzICovCisJMHhCNywgMHg3RCwgMHhCQSwgMHg1RiwgMHhFMiwgMHg0MiwgMHhFMiwgMHg1RCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHg0NywgMHhFMiwgMHg1NSwgMHhCQSwgMHg2NCwgLyogMHg5OC0weDlCICovCisJMHhCQSwgMHg1RCwgMHgwMCwgMHgwMCwgMHhFMiwgMHg1QiwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHhFMiwgMHg0MCwgMHhFMiwgMHg1QSwgMHgwMCwgMHgwMCwgMHhCQSwgMHg2RiwgLyogMHhBMC0weEEzICovCisJMHhFMiwgMHg1MSwgMHhFMiwgMHg2MSwgMHhCQSwgMHg2RCwgMHhFMiwgMHg0OSwgLyogMHhBNC0weEE3ICovCisJMHhCQSwgMHg1RSwgMHhFMiwgMHg0QiwgMHhFMiwgMHg1OSwgMHhCQSwgMHg2NywgLyogMHhBOC0weEFCICovCisJMHhFMiwgMHg0NCwgMHhCQSwgMHg2QiwgMHhCQSwgMHg2MSwgMHhFMiwgMHg0RCwgLyogMHhBQy0weEFGICovCisJMHhFMiwgMHg0MywgMHhFMSwgMHhGQywgMHgwMCwgMHgwMCwgMHhFMiwgMHg1NywgLyogMHhCMC0weEIzICovCisJMHhCQSwgMHg2OCwgMHhFMiwgMHg2MCwgMHhFMSwgMHhGRCwgMHhCQSwgMHg2NSwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHg1MywgMHgwMCwgMHgwMCwgMHhCQSwgMHg2NiwgLyogMHhCOC0weEJCICovCisJMHhFMiwgMHg0NSwgMHhFMiwgMHg1MCwgMHhFMiwgMHg0QywgMHhFMiwgMHg0RSwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHhCQSwgMHg2MCwgMHhFMiwgMHg1RiwgMHhCQSwgMHg2RSwgLyogMHhDMC0weEMzICovCisJMHhFMiwgMHg0RiwgMHgwMCwgMHgwMCwgMHhFMiwgMHg2MiwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHhFMSwgMHhGRSwgMHhFMiwgMHg1NCwgMHhCQSwgMHg2MywgLyogMHhDOC0weENCICovCisJMHhCQSwgMHg2QywgMHhCQSwgMHg2QSwgMHhFMiwgMHg0MSwgMHhFMiwgMHg1NiwgLyogMHhDQy0weENGICovCisJMHhCQSwgMHg2OSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQSwgMHg2MiwgLyogMHhEMC0weEQzICovCisJMHhFMiwgMHg1MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHg1QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhENSwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHhFNSwgMHhEMSwgMHhFNSwgMHhDRCwgMHhFNSwgMHhFMSwgMHhFNSwgMHhERSwgLyogMHhFNC0weEU3ICovCisJMHhCQywgMHhDRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhFNSwgLyogMHhFOC0weEVCICovCisJMHhFNSwgMHhENCwgMHhCQywgMHhEOCwgMHhFNSwgMHhEQiwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHhFNSwgMHhEMCwgMHhFNSwgMHhEQSwgMHhCQywgMHhENSwgLyogMHhGMC0weEYzICovCisJMHhFNSwgMHhFRSwgMHgwMCwgMHgwMCwgMHhFNSwgMHhFQiwgMHhFNSwgMHhERCwgLyogMHhGNC0weEY3ICovCisJMHhFNSwgMHhDRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhFMiwgLyogMHhGOC0weEZCICovCisJMHhFNSwgMHhFNCwgMHhCQywgMHhEMSwgMHhFNSwgMHhEOCwgMHhFNSwgMHhEMywgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNkFbNTEyXSA9IHsKKwkweEU1LCAweENBLCAweEJDLCAweENFLCAweEJDLCAweEQ2LCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweEU1LCAweEU3LCAweEJDLCAweEQ3LCAweEU1LCAweENCLCAweEU1LCAweEVELCAvKiAweDA0LTB4MDcgKi8KKwkweEU1LCAweEUwLCAweEU1LCAweEU2LCAweEJDLCAweEQ0LCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweEUzLCAweDAwLCAweDAwLCAweEU1LCAweEVBLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweEJDLCAweEQ5LCAweDAwLCAweDAwLCAweEJDLCAweEQzLCAvKiAweDEwLTB4MTMgKi8KKwkweEU1LCAweERDLCAweEU1LCAweENGLCAweEU1LCAweEVGLCAweEU1LCAweENDLCAvKiAweDE0LTB4MTcgKi8KKwkweEU1LCAweEU4LCAweEJDLCAweEQwLCAweDAwLCAweDAwLCAweEU1LCAweEQ2LCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweEQ3LCAweEJDLCAweENGLCAweEJDLCAweENDLCAvKiAweDFDLTB4MUYgKi8KKwkweEU1LCAweEQyLCAweEJDLCAweEQyLCAweDAwLCAweDAwLCAweEJDLCAweENCLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweEU1LCAweEU5LCAweEU1LCAweEVDLCAweEU1LCAweEQ5LCAvKiAweDI0LTB4MjcgKi8KKwkweEU5LCAweENBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweEMyLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweEU5LCAweEJFLCAweEJFLCAweEY2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweEJFLCAweEVCLCAweEJFLCAweEYwLCAweEJFLCAweEVDLCAweEU5LCAweENDLCAvKiAweDM4LTB4M0IgKi8KKwkweEU5LCAweEQ3LCAweEJFLCAweEVBLCAweEU5LCAweEM0LCAweEU5LCAweENELCAvKiAweDNDLTB4M0YgKi8KKwkweEU1LCAweERGLCAweEU5LCAweENFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweEJFLCAweEYxLCAweDAwLCAweDAwLCAweEU5LCAweERELCAweEJFLCAweEY1LCAvKiAweDQ0LTB4NDcgKi8KKwkweEJFLCAweEY4LCAweEU5LCAweEMwLCAweDAwLCAweDAwLCAweEJFLCAweEY0LCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweERCLCAweEU5LCAweERDLCAweEU5LCAweEQyLCAvKiAweDRDLTB4NEYgKi8KKwkweEU5LCAweEQxLCAweEU5LCAweEM5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweEU5LCAweEQzLCAweEU5LCAweERBLCAweEU5LCAweEQ5LCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweEJFLCAweEVGLCAweEJFLCAweEVELCAweEU5LCAweENCLCAweEU5LCAweEM4LCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweEM1LCAweEU5LCAweEQ4LCAweEJFLCAweEY3LCAvKiAweDVDLTB4NUYgKi8KKwkweEU5LCAweEQ2LCAweEJFLCAweEYzLCAweEJFLCAweEYyLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweEU5LCAweEQwLCAweDAwLCAweDAwLCAweEU5LCAweEJGLCAweEU5LCAweEMxLCAvKiAweDY0LTB4NjcgKi8KKwkweEU5LCAweEMzLCAweEU5LCAweEQ1LCAweEU5LCAweENGLCAweEJFLCAweEVFLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweEU5LCAweEM2LCAweDAwLCAweDAwLCAweEU5LCAweEQ0LCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU5LCAweEM3LCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMwLCAweENGLCAweEVELCAweDQ1LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEMwLCAweEM4LCAweEVDLCAweEY1LCAweDAwLCAweDAwLCAweEVELCAweDQxLCAvKiAweDgwLTB4ODMgKi8KKwkweEMwLCAweENBLCAweEVELCAweDQ4LCAweDAwLCAweDAwLCAweEVDLCAweEZDLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweEVDLCAweEY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweEVELCAweDQ5LCAweEVDLCAweEYzLCAweEVDLCAweEZFLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweEMwLCAweEQxLCAweEVELCAweDQ0LCAweEVELCAweDRBLCAweEVDLCAweEZELCAvKiAweDkwLTB4OTMgKi8KKwkweEMwLCAweEM5LCAweEVELCAweDQwLCAweEVDLCAweEY0LCAweEMwLCAweEQwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVELCAweDQ3LCAweEVDLCAweEY5LCAvKiAweDk4LTB4OUIgKi8KKwkweEMwLCAweENDLCAweDAwLCAweDAwLCAweEVDLCAweEZCLCAweEVDLCAweEY4LCAvKiAweDlDLTB4OUYgKi8KKwkweEMwLCAweEQyLCAweEVDLCAweEZBLCAweEMwLCAweENCLCAweEMwLCAweENFLCAvKiAweEEwLTB4QTMgKi8KKwkweEVELCAweDQzLCAweEVDLCAweEY2LCAweEVELCAweDQ2LCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweEVELCAweDQyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweEMyLCAweDYzLCAweEVGLCAweEU3LCAweEMyLCAweDY4LCAweEMyLCAweDY5LCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMyLCAweDYyLCAvKiAweEIwLTB4QjMgKi8KKwkweEVGLCAweEU2LCAweDAwLCAweDAwLCAweEVGLCAweEUzLCAweEVGLCAweEU0LCAvKiAweEI0LTB4QjcgKi8KKwkweEMyLCAweDY2LCAweEVGLCAweERFLCAweEVGLCAweEUyLCAweEMyLCAweDY1LCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweEVGLCAweERGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMyLCAweDY3LCAweEMyLCAweDY0LCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweEVGLCAweERELCAweEVGLCAweEUxLCAweEVGLCAweEU1LCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYyLCAweDUxLCAvKiAweEM4LTB4Q0IgKi8KKwkweEYyLCAweDRFLCAweEYyLCAweDU3LCAweDAwLCAweDAwLCAweEYyLCAweDU2LCAvKiAweENDLTB4Q0YgKi8KKwkweEYyLCAweDU0LCAweEYyLCAweDRGLCAweDAwLCAweDAwLCAweEMzLCAweDcyLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweEYyLCAweDUwLCAweEMzLCAweDcxLCAweEMwLCAweENELCAvKiAweEQ4LTB4REIgKi8KKwkweEYyLCAweDUzLCAweEMzLCAweDcwLCAweEYyLCAweDU4LCAweEYyLCAweDUyLCAvKiAweERDLTB4REYgKi8KKwkweEYyLCAweDRELCAweEVGLCAweEUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweEMzLCAweDZGLCAweDAwLCAweDAwLCAweEYyLCAweDRDLCAvKiAweEU0LTB4RTcgKi8KKwkweEY0LCAweDU2LCAweDAwLCAweDAwLCAweEY0LCAweDU1LCAweEYyLCAweDU1LCAvKiAweEU4LTB4RUIgKi8KKwkweEM0LCAweDY4LCAweDAwLCAweDAwLCAweEY0LCAweDU5LCAweEY0LCAweDVBLCAvKiAweEVDLTB4RUYgKi8KKwkweEY0LCAweDU0LCAweEY0LCAweDU4LCAweDAwLCAweDAwLCAweEY0LCAweDUzLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweEY1LCAweEQxLCAweEY0LCAweDU3LCAweEM0LCAweEU3LCAweEM0LCAweEU1LCAvKiAweEY4LTB4RkIgKi8KKwkweEY1LCAweENGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182Qls1MTJdID0geworCTB4RjUsIDB4RDIsIDB4MDAsIDB4MDAsIDB4RjUsIDB4Q0UsIDB4RjUsIDB4RDAsIC8qIDB4MDAtMHgwMyAqLworCTB4QzQsIDB4RTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4RjYsIDB4RTUsIDB4RjYsIDB4RTYsIDB4QzUsIDB4NzYsIDB4RjYsIDB4RTQsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjcsIDB4RTIsIC8qIDB4MEMtMHgwRiAqLworCTB4QzUsIDB4Q0YsIDB4RjcsIDB4RTAsIDB4RjcsIDB4RTEsIDB4RjgsIDB4QUMsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzYsIDB4NTYsIDB4RjgsIDB4RjMsIC8qIDB4MTQtMHgxNyAqLworCTB4RjgsIDB4RjEsIDB4RjgsIDB4RjIsIDB4RjgsIDB4RjQsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjksIDB4QkIsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4QTQsIDB4RUQsIDB4QTYsIDB4QjgsIDB4MDAsIDB4MDAsIDB4QUEsIDB4NTksIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4Q0MsIDB4RTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4Q0YsIDB4NjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4RDEsIDB4RjUsIDB4RDEsIDB4RjcsIDB4MDAsIDB4MDAsIDB4RDEsIDB4RjYsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4RDEsIDB4RjgsIDB4QjEsIDB4RkQsIDB4RDUsIDB4RDcsIC8qIDB4MzAtMHgzMyAqLworCTB4RDEsIDB4RjksIDB4MDAsIDB4MDAsIDB4RDUsIDB4RDYsIDB4RDUsIDB4RDgsIC8qIDB4MzQtMHgzNyAqLworCTB4RDUsIDB4RDksIDB4RDksIDB4REEsIDB4QjQsIDB4REIsIDB4RDksIDB4REIsIC8qIDB4MzgtMHgzQiAqLworCTB4RDksIDB4REQsIDB4QjQsIDB4REMsIDB4QjQsIDB4REEsIDB4RDksIDB4REMsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4REQsIDB4RkEsIDB4REQsIDB4RjgsIDB4REQsIDB4RjcsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4REQsIDB4RjYsIDB4REQsIDB4RjUsIDB4QjcsIDB4QjIsIC8qIDB4NDQtMHg0NyAqLworCTB4REQsIDB4RjksIDB4QkEsIDB4NzAsIDB4RTIsIDB4NjMsIDB4RTIsIDB4NjUsIC8qIDB4NDgtMHg0QiAqLworCTB4QkEsIDB4NzEsIDB4RTIsIDB4NjQsIDB4QkMsIDB4REIsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4QkMsIDB4REEsIDB4RTUsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4RTksIDB4REYsIDB4RTksIDB4REUsIDB4RTksIDB4RTAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4QkUsIDB4RjksIDB4MDAsIDB4MDAsIDB4RUQsIDB4NEIsIC8qIDB4NTgtMHg1QiAqLworCTB4QzAsIDB4RDMsIDB4MDAsIDB4MDAsIDB4RUYsIDB4RTgsIDB4QzIsIDB4NkEsIC8qIDB4NUMtMHg1RiAqLworCTB4RjIsIDB4NTksIDB4QzUsIDB4NzcsIDB4QTQsIDB4RUUsIDB4QTUsIDB4QkYsIC8qIDB4NjAtMHg2MyAqLworCTB4QTYsIDB4QjksIDB4QTgsIDB4NDIsIDB4QUEsIDB4NUEsIDB4QUEsIDB4NUIsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QUMsIDB4NkUsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4RDEsIDB4RkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjcsIDB4QjMsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4RDEsIDB4QkUsIDB4RkEsIC8qIDB4NzQtMHg3NyAqLworCTB4QzIsIDB4NkIsIDB4QTQsIDB4RUYsIDB4MDAsIDB4MDAsIDB4QTYsIDB4QkEsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0MsIDB4RUIsIDB4QUEsIDB4NUMsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4Q0MsIDB4RUEsIDB4MDAsIDB4MDAsIDB4Q0YsIDB4NjUsIDB4QUMsIDB4NkYsIC8qIDB4ODAtMHg4MyAqLworCTB4Q0YsIDB4NjYsIDB4MDAsIDB4MDAsIDB4QUMsIDB4NzAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4RDEsIDB4RkMsIDB4QUUsIDB4RUUsIDB4QUUsIDB4RUQsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4RDUsIDB4REUsIDB4RDUsIDB4REMsIDB4RDUsIDB4REQsIDB4RDUsIDB4REIsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4RDUsIDB4REEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4RDksIDB4REUsIDB4RDksIDB4RTEsIDB4QjQsIDB4REUsIDB4RDksIDB4REYsIC8qIDB4OTQtMHg5NyAqLworCTB4QjQsIDB4REQsIDB4RDksIDB4RTAsIDB4MDAsIDB4MDAsIDB4REQsIDB4RkIsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4NjYsIDB4RTIsIDB4NjcsIC8qIDB4OUMtMHg5RiAqLworCTB4RTIsIDB4NjgsIDB4MDAsIDB4MDAsIDB4RTUsIDB4RjMsIDB4RTUsIDB4RjIsIC8qIDB4QTAtMHhBMyAqLworCTB4QkMsIDB4REMsIDB4RTUsIDB4RjEsIDB4RTUsIDB4RjQsIDB4RTksIDB4RTEsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTksIDB4RTIsIDB4RTksIDB4RTMsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4RUQsIDB4NEMsIDB4QzAsIDB4RDQsIDB4QzIsIDB4NkMsIC8qIDB4QUMtMHhBRiAqLworCTB4RjIsIDB4NUEsIDB4MDAsIDB4MDAsIDB4QzQsIDB4RTgsIDB4QzksIDB4NUYsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4QUMsIDB4NzEsIDB4Q0YsIDB4NjcsIDB4QUUsIDB4RUYsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjEsIDB4RkUsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4QjQsIDB4REYsIDB4RDksIDB4RTIsIDB4MDAsIDB4MDAsIDB4QjcsIDB4QjUsIC8qIDB4QkMtMHhCRiAqLworCTB4QjcsIDB4QjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4NjksIC8qIDB4QzAtMHhDMyAqLworCTB4RTIsIDB4NkEsIDB4QkMsIDB4REQsIDB4QkMsIDB4REUsIDB4RTksIDB4RTUsIC8qIDB4QzQtMHhDNyAqLworCTB4RTksIDB4RTQsIDB4RUYsIDB4RTksIDB4RjcsIDB4RTMsIDB4QTQsIDB4RjAsIC8qIDB4QzgtMHhDQiAqLworCTB4QzksIDB4NjAsIDB4QTUsIDB4QzAsIDB4MDAsIDB4MDAsIDB4QTgsIDB4NDMsIC8qIDB4Q0MtMHhDRiAqLworCTB4Q0IsIDB4NDgsIDB4MDAsIDB4MDAsIDB4QUMsIDB4NzIsIDB4QjcsIDB4QjYsIC8qIDB4RDAtMHhEMyAqLworCTB4QTQsIDB4RjEsIDB4MDAsIDB4MDAsIDB4Q0YsIDB4NjgsIDB4QUMsIDB4NzMsIC8qIDB4RDQtMHhENyAqLworCTB4Q0YsIDB4NjksIDB4MDAsIDB4MDAsIDB4QzAsIDB4RDUsIDB4QTQsIDB4RjIsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0MsIDB4RUMsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4Q0YsIDB4NkEsIDB4MDAsIDB4MDAsIDB4RDIsIDB4NDIsIDB4RDIsIDB4NDEsIC8qIDB4RTAtMHhFMyAqLworCTB4RDEsIDB4RkUsIDB4MDAsIDB4MDAsIDB4RDEsIDB4RkQsIDB4RDIsIDB4NDMsIC8qIDB4RTQtMHhFNyAqLworCTB4RDIsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjIsIDB4NDAsIC8qIDB4RTgtMHhFQiAqLworCTB4QjIsIDB4NDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjQsIDB4RTAsIC8qIDB4RUMtMHhFRiAqLworCTB4RDksIDB4RTMsIDB4MDAsIDB4MDAsIDB4RDksIDB4RTQsIDB4RDksIDB4RTUsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REUsIDB4NDEsIC8qIDB4RjQtMHhGNyAqLworCTB4REUsIDB4NDIsIDB4REUsIDB4NDAsIDB4MDAsIDB4MDAsIDB4REQsIDB4RkQsIC8qIDB4RjgtMHhGQiAqLworCTB4REQsIDB4RkUsIDB4QjcsIDB4QjcsIDB4RTIsIDB4NkIsIDB4RTUsIDB4RjcsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzZDWzUxMl0gPSB7CisJMHhFNSwgMHhGNiwgMHhFNSwgMHhGNSwgMHhFNSwgMHhGOCwgMHhFOSwgMHhFNywgLyogMHgwMC0weDAzICovCisJMHhFOSwgMHhFNiwgMHhCRSwgMHhGQiwgMHhFOSwgMHhFOCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHhDMCwgMHhENiwgMHhFRCwgMHg0RCwgMHgwMCwgMHgwMCwgMHhFRiwgMHhFQSwgLyogMHgwOC0weDBCICovCisJMHhGMiwgMHg1QiwgMHhGNiwgMHhFNywgMHgwMCwgMHgwMCwgMHhBNCwgMHhGMywgLyogMHgwQy0weDBGICovCisJMHhBNSwgMHhDMiwgMHhBNSwgMHhDMSwgMHgwMCwgMHgwMCwgMHhBQSwgMHg1RCwgLyogMHgxMC0weDEzICovCisJMHhDOSwgMHg2MSwgMHhDOSwgMHg3RSwgMHhBNiwgMHhCQiwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHhDOSwgMHhGNywgMHhDQiwgMHg0OSwgMHhDQiwgMHg0QSwgMHhBQSwgMHg1RSwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHhDQywgMHhFRCwgMHgwMCwgMHgwMCwgMHhBQywgMHg3NCwgLyogMHgxQy0weDFGICovCisJMHhDRiwgMHg2QiwgMHhDRiwgMHg2QywgMHgwMCwgMHgwMCwgMHhBRSwgMHhGMCwgLyogMHgyMC0weDIzICovCisJMHhBRSwgMHhGNCwgMHhEMiwgMHg0NCwgMHhBRSwgMHhGMywgMHhBRSwgMHhGMSwgLyogMHgyNC0weDI3ICovCisJMHhBRSwgMHhGMiwgMHgwMCwgMHgwMCwgMHhENSwgMHhERiwgMHhCMiwgMHg0MiwgLyogMHgyOC0weDJCICovCisJMHhCNCwgMHhFMywgMHgwMCwgMHgwMCwgMHhCNCwgMHhFMSwgMHhCNCwgMHhFMiwgLyogMHgyQy0weDJGICovCisJMHhEOSwgMHhFNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQSwgMHg3MiwgLyogMHgzMC0weDMzICovCisJMHhBNCwgMHhGNCwgMHgwMCwgMHgwMCwgMHhDOSwgMHhBMSwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHhBNSwgMHhDMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDOSwgMHhBNCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBNSwgMHhDNiwgMHhDOSwgMHhBMywgLyogMHgzQy0weDNGICovCisJMHhBNSwgMHhDNSwgMHhBNSwgMHhDNCwgMHhBOCwgMHg0NCwgMHhDOSwgMHhBMiwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDOSwgMHhGOCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDOSwgMHhGQywgMHhDOSwgMHhGRSwgLyogMHg0OC0weDRCICovCisJMHhDQSwgMHg0MCwgMHhBNiwgMHhDNSwgMHhBNiwgMHhDNiwgMHhDOSwgMHhGQiwgLyogMHg0Qy0weDRGICovCisJMHhBNiwgMHhDMSwgMHgwMCwgMHgwMCwgMHhDOSwgMHhGOSwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHhDOSwgMHhGRCwgMHhBNiwgMHhDMiwgMHgwMCwgMHgwMCwgMHhBNiwgMHhCRCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhBNiwgMHhCRSwgMHgwMCwgMHgwMCwgMHhBNiwgMHhDNCwgLyogMHg1OC0weDVCICovCisJMHhDOSwgMHhGQSwgMHhBNiwgMHhCQywgMHhBOCwgMHg0NSwgMHhBNiwgMHhCRiwgLyogMHg1Qy0weDVGICovCisJMHhBNiwgMHhDMCwgMHhBNiwgMHhDMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHhDQiwgMHg1QiwgMHhDQiwgMHg1OSwgMHhDQiwgMHg0QywgLyogMHg2NC0weDY3ICovCisJMHhBOCwgMHg1MSwgMHhDQiwgMHg1MywgMHhBOCwgMHg0QywgMHhDQiwgMHg0RCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHhDQiwgMHg1NSwgMHgwMCwgMHgwMCwgMHhDQiwgMHg1MiwgLyogMHg2Qy0weDZGICovCisJMHhBOCwgMHg0RiwgMHhDQiwgMHg1MSwgMHhBOCwgMHg1NiwgMHhDQiwgMHg1QSwgLyogMHg3MC0weDczICovCisJMHhBOCwgMHg1OCwgMHgwMCwgMHgwMCwgMHhBOCwgMHg1QSwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHhDQiwgMHg0QiwgMHgwMCwgMHgwMCwgMHhBOCwgMHg0RCwgMHhDQiwgMHg1QywgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHhBOCwgMHg1NCwgMHhBOCwgMHg1NywgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHhDRCwgMHg0NSwgMHhBOCwgMHg0NywgMHhBOCwgMHg1RSwgMHhBOCwgMHg1NSwgLyogMHg4MC0weDgzICovCisJMHhDQiwgMHg0RSwgMHhBOCwgMHg0QSwgMHhBOCwgMHg1OSwgMHhDQiwgMHg1NiwgLyogMHg4NC0weDg3ICovCisJMHhBOCwgMHg0OCwgMHhBOCwgMHg0OSwgMHhDRCwgMHg0MywgMHhDQiwgMHg0RiwgLyogMHg4OC0weDhCICovCisJMHhBOCwgMHg1MCwgMHhBOCwgMHg1QiwgMHhDQiwgMHg1RCwgMHhDQiwgMHg1MCwgLyogMHg4Qy0weDhGICovCisJMHhBOCwgMHg0RSwgMHgwMCwgMHgwMCwgMHhBOCwgMHg1MywgMHhDQywgMHhFRSwgLyogMHg5MC0weDkzICovCisJMHhBOCwgMHg1QywgMHhDQiwgMHg1NywgMHhBOCwgMHg1MiwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHhBOCwgMHg1RCwgMHhBOCwgMHg0NiwgMHhDQiwgMHg1NCwgMHhBOCwgMHg0QiwgLyogMHg5OC0weDlCICovCisJMHhDQiwgMHg1OCwgMHhDRCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBQSwgMHg2QSwgLyogMHhBOC0weEFCICovCisJMHhBQSwgMHg3QSwgMHhDQywgMHhGNSwgMHhBQSwgMHg3MSwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHhDRCwgMHg0QiwgMHhBQSwgMHg2MiwgMHgwMCwgMHgwMCwgMHhBQSwgMHg2NSwgLyogMHhCMC0weEIzICovCisJMHhDRCwgMHg0MiwgMHgwMCwgMHgwMCwgMHhDQywgMHhGMywgMHhDQywgMHhGNywgLyogMHhCNC0weEI3ICovCisJMHhBQSwgMHg2RCwgMHhBQSwgMHg2RiwgMHhDQywgMHhGQSwgMHhBQSwgMHg3NiwgLyogMHhCOC0weEJCICovCisJMHhBQSwgMHg2OCwgMHhBQSwgMHg2NiwgMHhBQSwgMHg2NywgMHhBQSwgMHg3NSwgLyogMHhCQy0weEJGICovCisJMHhDRCwgMHg0NywgMHhBQSwgMHg3MCwgMHhDQywgMHhGOSwgMHhDQywgMHhGQiwgLyogMHhDMC0weEMzICovCisJMHhBQSwgMHg2RSwgMHhBQSwgMHg3MywgMHhDQywgMHhGQywgMHhDRCwgMHg0QSwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHhBQywgMHg3NSwgMHhBQSwgMHg3OSwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHhBQSwgMHg2MywgMHhDRCwgMHg0OSwgMHgwMCwgMHgwMCwgMHhDRCwgMHg0RCwgLyogMHhDQy0weENGICovCisJMHhDQywgMHhGOCwgMHhDRCwgMHg0RiwgMHhDRCwgMHg0MCwgMHhBQSwgMHg2QywgLyogMHhEMC0weEQzICovCisJMHhDQywgMHhGNCwgMHhBQSwgMHg2QiwgMHhBQSwgMHg3RCwgMHhBQSwgMHg3MiwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHhDQywgMHhGMiwgMHhDRiwgMHg3NSwgMHhBQSwgMHg3OCwgLyogMHhEOC0weERCICovCisJMHhBQSwgMHg3QywgMHhDRCwgMHg0MSwgMHhDRCwgMHg0NiwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHhBQSwgMHg3RSwgMHhBQSwgMHg3NywgMHhBQSwgMHg2OSwgMHhBQSwgMHg1RiwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHhBQSwgMHg2NCwgMHgwMCwgMHgwMCwgMHhDQywgMHhGNiwgLyogMHhFNC0weEU3ICovCisJMHhBQSwgMHg2MCwgMHhDRCwgMHg0RSwgMHgwMCwgMHgwMCwgMHhDQywgMHhGMCwgLyogMHhFOC0weEVCICovCisJMHhDQywgMHhFRiwgMHhDQywgMHhGRCwgMHhDQywgMHhGMSwgMHhBQSwgMHg3QiwgLyogMHhFQy0weEVGICovCisJMHhBRSwgMHhGNSwgMHhBQSwgMHg3NCwgMHhDQywgMHhGRSwgMHhBQSwgMHg2MSwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHhBQywgMHhBNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHhDRCwgMHg0QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNkRbNTEyXSA9IHsKKwkweENGLCAweDdDLCAweENGLCAweEExLCAweDAwLCAweDAwLCAweENGLCAweEE0LCAvKiAweDAwLTB4MDMgKi8KKwkweENGLCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENGLCAweEE3LCAvKiAweDA0LTB4MDcgKi8KKwkweENGLCAweEFBLCAweENGLCAweEFDLCAweENGLCAweDc0LCAweEFDLCAweDc2LCAvKiAweDA4LTB4MEIgKi8KKwkweEFDLCAweDdCLCAweEQyLCAweDQ5LCAweEFDLCAweEFELCAweENGLCAweEE1LCAvKiAweDBDLTB4MEYgKi8KKwkweENGLCAweEFELCAweENGLCAweDdCLCAweENGLCAweDczLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQyLCAweDY0LCAweEFDLCAweDdFLCAvKiAweDE0LTB4MTcgKi8KKwkweENGLCAweEEyLCAweENGLCAweDc4LCAweENGLCAweDdBLCAweEFDLCAweEE1LCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweENGLCAweDdELCAweEFDLCAweDdELCAweENGLCAweDcwLCAvKiAweDFDLTB4MUYgKi8KKwkweENGLCAweEE4LCAweDAwLCAweDAwLCAweENGLCAweEFCLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweEFDLCAweDdBLCAweDAwLCAweDAwLCAweEFDLCAweEE4LCAvKiAweDI0LTB4MjcgKi8KKwkweENGLCAweDZELCAweEFDLCAweEFBLCAweEFDLCAweDc4LCAweEFDLCAweEFFLCAvKiAweDI4LTB4MkIgKi8KKwkweENGLCAweEE5LCAweENGLCAweDZGLCAweEFDLCAweEFCLCAweEQyLCAweDVFLCAvKiAweDJDLTB4MkYgKi8KKwkweENELCAweDQ4LCAweEFDLCAweDdDLCAweEFDLCAweDc3LCAweENGLCAweDc2LCAvKiAweDMwLTB4MzMgKi8KKwkweENGLCAweDZFLCAweEFDLCAweEFDLCAweEFDLCAweEE0LCAweENGLCAweEEzLCAvKiAweDM0LTB4MzcgKi8KKwkweEFDLCAweEE5LCAweEFDLCAweEE3LCAweENGLCAweDc5LCAweEFDLCAweEExLCAvKiAweDM4LTB4M0IgKi8KKwkweENGLCAweDcxLCAweEFDLCAweEEyLCAweEFDLCAweEEzLCAweENGLCAweDcyLCAvKiAweDNDLTB4M0YgKi8KKwkweENGLCAweEE2LCAweEFDLCAweDc5LCAweENGLCAweDdFLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweEQyLCAweDRDLCAweEFFLCAweEZELCAweEFGLCAweDQzLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQyLCAweDU1LCAweEQyLCAweDVCLCAvKiAweDVDLTB4NUYgKi8KKwkweEQyLCAweDU3LCAweEQyLCAweDRBLCAweEQyLCAweDRELCAweEQyLCAweDQ2LCAvKiAweDYwLTB4NjMgKi8KKwkweEQyLCAweDQ3LCAweEFGLCAweDRBLCAweEFFLCAweEZBLCAweEQyLCAweDU2LCAvKiAweDY0LTB4NjcgKi8KKwkweEQyLCAweDVGLCAweEFGLCAweDQ1LCAweEFFLCAweEY2LCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweEFGLCAweDQwLCAweEQyLCAweDRFLCAweEFGLCAweDQyLCAweEQyLCAweDRGLCAvKiAweDZDLTB4NkYgKi8KKwkweEQyLCAweDU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweEFGLCAweDQ0LCAweEQyLCAweDY4LCAweEQyLCAweDQ4LCAweEFFLCAweEZDLCAvKiAweDc0LTB4NzcgKi8KKwkweEFFLCAweEZCLCAweEFGLCAweDQ4LCAweEQyLCAweDQ1LCAweEQyLCAweDY2LCAvKiAweDc4LTB4N0IgKi8KKwkweEQyLCAweDVBLCAweEQyLCAweDY3LCAweEQyLCAweDYxLCAweEQyLCAweDUzLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEQyLCAweDYyLCAweDAwLCAweDAwLCAweEQyLCAweDVDLCAweEQyLCAweDY1LCAvKiAweDgwLTB4ODMgKi8KKwkweEQyLCAweDYzLCAweEFGLCAweDQ5LCAweEQyLCAweDU0LCAweEFFLCAweEY5LCAvKiAweDg0LTB4ODcgKi8KKwkweEFFLCAweEY4LCAweEFGLCAweDQxLCAweEFGLCAweDQ3LCAweEQyLCAweDYwLCAvKiAweDg4LTB4OEIgKi8KKwkweEFGLCAweDQ2LCAweEQyLCAweDUxLCAweEIyLCAweDQzLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweEQyLCAweDY5LCAweEQyLCAweDUwLCAweEQyLCAweDRCLCAweEFFLCAweEZFLCAvKiAweDkwLTB4OTMgKi8KKwkweEFGLCAweDRCLCAweEFFLCAweEY3LCAweDAwLCAweDAwLCAweEQyLCAweDU4LCAvKiAweDk0LTB4OTcgKi8KKwkweEQyLCAweDVELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIyLCAweDY1LCAweEQ1LCAweEUxLCAvKiAweEE4LTB4QUIgKi8KKwkweEQ1LCAweEU1LCAweDAwLCAweDAwLCAweEIyLCAweDUyLCAweEIyLCAweDUwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIyLCAweDQ3LCAweEQ1LCAweEUzLCAvKiAweEIwLTB4QjMgKi8KKwkweEQ1LCAweEUyLCAweEIyLCAweDVCLCAweDAwLCAweDAwLCAweEQ1LCAweEU4LCAvKiAweEI0LTB4QjcgKi8KKwkweEIyLCAweDU1LCAweDAwLCAweDAwLCAweEQ1LCAweEZBLCAweEQ2LCAweDQ3LCAvKiAweEI4LTB4QkIgKi8KKwkweEIyLCAweDQ0LCAweEQ1LCAweEY3LCAweEQ1LCAweEYwLCAweEIyLCAweDY3LCAvKiAweEJDLTB4QkYgKi8KKwkweEQ1LCAweEUwLCAweDAwLCAweDAwLCAweEQ1LCAweEZDLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweEIyLCAweDY0LCAweEIyLCAweDU4LCAweEIyLCAweDYzLCAweEIyLCAweDRFLCAvKiAweEM0LTB4QzcgKi8KKwkweEQ1LCAweEVDLCAweEQ1LCAweEZFLCAweEQ1LCAweEY2LCAweEIyLCAweDRGLCAvKiAweEM4LTB4Q0IgKi8KKwkweEIyLCAweDQ5LCAweEQ2LCAweDQ1LCAweDAwLCAweDAwLCAweEQ1LCAweEZELCAvKiAweENDLTB4Q0YgKi8KKwkweEQ2LCAweDQwLCAweEIyLCAweDUxLCAweEIyLCAweDU5LCAweEQ2LCAweDQyLCAvKiAweEQwLTB4RDMgKi8KKwkweEQ1LCAweEVBLCAweEQ1LCAweEZCLCAweEQ1LCAweEVGLCAweEQ2LCAweDQ0LCAvKiAweEQ0LTB4RDcgKi8KKwkweEIyLCAweDVFLCAweEIyLCAweDQ2LCAweEIyLCAweDVDLCAweEQ1LCAweEY0LCAvKiAweEQ4LTB4REIgKi8KKwkweEQ1LCAweEYyLCAweEQ1LCAweEYzLCAweEIyLCAweDUzLCAweEQ1LCAweEVFLCAvKiAweERDLTB4REYgKi8KKwkweEQ1LCAweEVELCAweEIyLCAweDQ4LCAweEQ1LCAweEU3LCAweEQ2LCAweDQ2LCAvKiAweEUwLTB4RTMgKi8KKwkweEIyLCAweDRBLCAweEQ1LCAweEYxLCAweEIyLCAweDY4LCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweEIyLCAweDYyLCAweEQ1LCAweEU2LCAweEIyLCAweDVGLCAweEIyLCAweDVELCAvKiAweEU4LTB4RUIgKi8KKwkweEIyLCAweDY2LCAweEQ1LCAweEY4LCAweEIyLCAweDYxLCAweEQyLCAweDUyLCAvKiAweEVDLTB4RUYgKi8KKwkweEQ1LCAweEY5LCAweEIyLCAweDYwLCAweEQ2LCAweDQxLCAweEIyLCAweDQ1LCAvKiAweEYwLTB4RjMgKi8KKwkweEQ1LCAweEY1LCAweEIyLCAweDU3LCAweEQ1LCAweEU5LCAweEIyLCAweDU2LCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweEIyLCAweDU0LCAweEIyLCAweDRDLCAweEIyLCAweDRCLCAvKiAweEY4LTB4RkIgKi8KKwkweEQ5LCAweEU3LCAweEQ2LCAweDQzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY182RVs1MTJdID0geworCTB4RDUsIDB4RUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDksIDB4RkMsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4QjIsIDB4NEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4QjUsIDB4NDEsIDB4QjIsIDB4NUEsIDB4QjQsIDB4RUUsIC8qIDB4MTgtMHgxQiAqLworCTB4RDksIDB4RjYsIDB4QjQsIDB4RkMsIDB4MDAsIDB4MDAsIDB4RDksIDB4RUEsIC8qIDB4MUMtMHgxRiAqLworCTB4QjQsIDB4RUIsIDB4QjQsIDB4RTcsIDB4REEsIDB4NDksIDB4QjQsIDB4RUQsIC8qIDB4MjAtMHgyMyAqLworCTB4QjQsIDB4RjEsIDB4QjQsIDB4RUMsIDB4QjQsIDB4RjUsIDB4REEsIDB4NEQsIC8qIDB4MjQtMHgyNyAqLworCTB4REEsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDksIDB4RjEsIC8qIDB4MjgtMHgyQiAqLworCTB4QjQsIDB4RkEsIDB4QjQsIDB4RjQsIDB4RDksIDB4RkQsIDB4QjQsIDB4RTQsIC8qIDB4MkMtMHgyRiAqLworCTB4REEsIDB4NEEsIDB4REEsIDB4NDMsIDB4QjQsIDB4RTgsIDB4RDksIDB4RjcsIC8qIDB4MzAtMHgzMyAqLworCTB4QjQsIDB4RjcsIDB4REEsIDB4NTUsIDB4REEsIDB4NTYsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4QjQsIDB4RTUsIDB4REEsIDB4NDgsIDB4QjQsIDB4RjksIDB4RDksIDB4RkIsIC8qIDB4MzgtMHgzQiAqLworCTB4RDksIDB4RUQsIDB4RDksIDB4RUUsIDB4QjQsIDB4RkQsIDB4RDksIDB4RjIsIC8qIDB4M0MtMHgzRiAqLworCTB4RDksIDB4RjksIDB4RDksIDB4RjMsIDB4MDAsIDB4MDAsIDB4QjQsIDB4RkIsIC8qIDB4NDAtMHg0MyAqLworCTB4QjUsIDB4NDQsIDB4RDksIDB4RUYsIDB4RDksIDB4RTgsIDB4RDksIDB4RTksIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4RDksIDB4RUIsIDB4QjQsIDB4RUEsIDB4RDksIDB4RjgsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4QjQsIDB4RjgsIDB4QjUsIDB4NDIsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4RDksIDB4RkEsIDB4REEsIDB4NTMsIDB4REEsIDB4NEIsIC8qIDB4NTAtMHg1MyAqLworCTB4QjQsIDB4RTYsIDB4REEsIDB4NTEsIDB4QjQsIDB4RjIsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4QjQsIDB4RjAsIDB4MDAsIDB4MDAsIDB4REEsIDB4NTcsIDB4QjQsIDB4RUYsIC8qIDB4NTgtMHg1QiAqLworCTB4REEsIDB4NDEsIDB4RDksIDB4RjQsIDB4RDksIDB4RkUsIDB4QjUsIDB4NDcsIC8qIDB4NUMtMHg1RiAqLworCTB4REEsIDB4NDUsIDB4REEsIDB4NDIsIDB4RDksIDB4RjAsIDB4QjUsIDB4NDMsIC8qIDB4NjAtMHg2MyAqLworCTB4REEsIDB4NEYsIDB4REEsIDB4NEMsIDB4REEsIDB4NTQsIDB4QjQsIDB4RTksIC8qIDB4NjQtMHg2NyAqLworCTB4REEsIDB4NDAsIDB4QjUsIDB4NDYsIDB4MDAsIDB4MDAsIDB4REEsIDB4NDcsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjQsIDB4RjMsIDB4QjQsIDB4RjYsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4REEsIDB4NDYsIDB4QjUsIDB4NDUsIDB4RDksIDB4RjUsIC8qIDB4NzAtMHg3MyAqLworCTB4RDUsIDB4RTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REEsIDB4NTAsIC8qIDB4NzQtMHg3NyAqLworCTB4REEsIDB4NEUsIDB4REEsIDB4NTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4RDksIDB4RUMsIDB4QjUsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4REUsIDB4NjEsIDB4REUsIDB4NjAsIDB4REUsIDB4NDYsIC8qIDB4OEMtMHg4RiAqLworCTB4QjcsIDB4QkQsIDB4MDAsIDB4MDAsIDB4REUsIDB4NUYsIDB4REUsIDB4NDksIC8qIDB4OTAtMHg5MyAqLworCTB4REUsIDB4NEEsIDB4MDAsIDB4MDAsIDB4QjcsIDB4QzcsIDB4REUsIDB4NjgsIC8qIDB4OTQtMHg5NyAqLworCTB4QjcsIDB4QzIsIDB4REUsIDB4NUUsIDB4MDAsIDB4MDAsIDB4REUsIDB4NDMsIC8qIDB4OTgtMHg5QiAqLworCTB4QjcsIDB4QzgsIDB4QjcsIDB4QkUsIDB4REUsIDB4NTIsIDB4REUsIDB4NDgsIC8qIDB4OUMtMHg5RiAqLworCTB4REUsIDB4NEIsIDB4REUsIDB4NjMsIDB4QjcsIDB4QjgsIDB4REUsIDB4NkEsIC8qIDB4QTAtMHhBMyAqLworCTB4REUsIDB4NjIsIDB4QjcsIDB4QzEsIDB4REUsIDB4NTcsIDB4QjcsIDB4Q0MsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjcsIDB4Q0IsIDB4QjcsIDB4QzUsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REUsIDB4NjksIDB4QjcsIDB4QjksIC8qIDB4QUMtMHhBRiAqLworCTB4REUsIDB4NTUsIDB4REUsIDB4NEMsIDB4REUsIDB4NTksIDB4REUsIDB4NjUsIC8qIDB4QjAtMHhCMyAqLworCTB4QjcsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4QjcsIDB4QkIsIDB4REUsIDB4NTQsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4REUsIDB4NEQsIDB4QjcsIDB4QzQsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4QjcsIDB4QzMsIDB4REUsIDB4NTAsIDB4REUsIDB4NUEsIDB4REUsIDB4NjQsIC8qIDB4QkMtMHhCRiAqLworCTB4REUsIDB4NDcsIDB4REUsIDB4NTEsIDB4QjcsIDB4QkMsIDB4REUsIDB4NUIsIC8qIDB4QzAtMHhDMyAqLworCTB4QjcsIDB4QzksIDB4QjcsIDB4QzAsIDB4REUsIDB4NEUsIDB4QjcsIDB4QkYsIC8qIDB4QzQtMHhDNyAqLworCTB4REUsIDB4NDUsIDB4REUsIDB4NTMsIDB4REUsIDB4NjcsIDB4QjQsIDB4RkUsIC8qIDB4QzgtMHhDQiAqLworCTB4QkEsIDB4QjAsIDB4REUsIDB4NTYsIDB4RTIsIDB4NkMsIDB4REUsIDB4NTgsIC8qIDB4Q0MtMHhDRiAqLworCTB4REUsIDB4NjYsIDB4QjcsIDB4QzYsIDB4REUsIDB4NEYsIDB4QjcsIDB4QkEsIC8qIDB4RDAtMHhEMyAqLworCTB4QjcsIDB4Q0EsIDB4QkMsIDB4RjAsIDB4REUsIDB4NDQsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4REUsIDB4NUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4REUsIDB4NUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4QUEsIC8qIDB4RTgtMHhFQiAqLworCTB4QkEsIDB4QUQsIDB4RTIsIDB4N0QsIDB4RTIsIDB4QTQsIDB4QkEsIDB4QTIsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4NkUsIDB4QkEsIDB4QUYsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4QkEsIDB4NzcsIDB4RTIsIDB4NkQsIDB4RTIsIDB4QjAsIDB4QkEsIDB4QjEsIC8qIDB4RjQtMHhGNyAqLworCTB4RTIsIDB4NzEsIDB4RTIsIDB4QTMsIDB4MDAsIDB4MDAsIDB4RTIsIDB4NzMsIC8qIDB4RjgtMHhGQiAqLworCTB4RTIsIDB4QjMsIDB4RTIsIDB4QUYsIDB4QkEsIDB4NzUsIDB4QkEsIDB4QTEsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzZGWzUxMl0gPSB7CisJMHhFNiwgMHg1MywgMHhCQSwgMHhBRSwgMHhCQSwgMHg3RCwgMHhFMiwgMHg2RiwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHhBRSwgMHhCQSwgMHhBMywgMHhFMiwgMHhBQiwgLyogMHgwNC0weDA3ICovCisJMHhFMiwgMHhCOCwgMHhFMiwgMHg3NSwgMHhFMiwgMHg3RSwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHhCNiwgMHhFMiwgMHhBQywgMHhCQSwgMHg3QywgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHg3QywgMHhCQSwgMHg3NiwgLyogMHgxMC0weDEzICovCisJMHhCQSwgMHg3NCwgMHhCQSwgMHhBOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHhFMiwgMHg3QSwgMHhFMiwgMHg3NywgMHhFMiwgMHg3OCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHhFMiwgMHhCMiwgMHgwMCwgMHgwMCwgMHhFMiwgMHhCNywgMHhFMiwgMHhCNSwgLyogMHgxQy0weDFGICovCisJMHhCQSwgMHg3QSwgMHhFMiwgMHhCOSwgMHhCQSwgMHg3RSwgMHhCQSwgMHhBNywgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHg3MCwgMHhFNSwgMHhGQSwgMHhFMiwgMHg3OSwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHhCQSwgMHg3OCwgMHhCQSwgMHhBQywgMHhCQSwgMHhBOSwgLyogMHgyOC0weDJCICovCisJMHhCQSwgMHg3QiwgMHhFMiwgMHhBNSwgMHhFMiwgMHg3NCwgMHhCQSwgMHhBQSwgLyogMHgyQy0weDJGICovCisJMHhFMiwgMHhBNywgMHhCQSwgMHhBNCwgMHhCQSwgMHhBNiwgMHhCQSwgMHg3MywgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHhBOSwgMHhFMiwgMHhBMSwgMHhFMiwgMHg3MiwgLyogMHgzNC0weDM3ICovCisJMHhCQSwgMHhBNSwgMHhFMiwgMHhCMSwgMHhFMiwgMHhCNCwgMHhFMiwgMHg3QiwgLyogMHgzOC0weDNCICovCisJMHhFMiwgMHhBOCwgMHgwMCwgMHgwMCwgMHhCQSwgMHg3OSwgMHhCQywgMHhERiwgLyogMHgzQy0weDNGICovCisJMHhFMiwgMHhBNiwgMHhFNSwgMHhGOSwgMHgwMCwgMHgwMCwgMHhFMiwgMHhBRCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHg3NiwgMHhFNiwgMHg0NCwgLyogMHg0Qy0weDRGICovCisJMHhFNiwgMHg0RSwgMHhCQywgMHhFMiwgMHhFNiwgMHg0RCwgMHhFNiwgMHg1OSwgLyogMHg1MC0weDUzICovCisJMHhCQywgMHhFNCwgMHhFNiwgMHg0QiwgMHgwMCwgMHgwMCwgMHhFNiwgMHg0RiwgLyogMHg1NC0weDU3ICovCisJMHhCQywgMHhFRiwgMHgwMCwgMHgwMCwgMHhFNiwgMHg0NiwgMHhCQywgMHhFNywgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHhFNiwgMHg1MiwgMHhFOSwgMHhGMCwgMHhCQywgMHhGMywgLyogMHg1Qy0weDVGICovCisJMHhCQywgMHhGMiwgMHhFNiwgMHg1NCwgMHhFNiwgMHg0MywgMHhFNiwgMHg1RSwgLyogMHg2MC0weDYzICovCisJMHhCQywgMHhFRCwgMHgwMCwgMHgwMCwgMHhCQywgMHhFMywgMHhFNiwgMHg1NywgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhFNiwgMHg1QiwgMHhFNiwgMHg2MCwgMHhFNiwgMHg1NSwgLyogMHg2OC0weDZCICovCisJMHhFNiwgMHg0OSwgMHhCQywgMHhFNiwgMHhCQywgMHhFOSwgMHhCQywgMHhGMSwgLyogMHg2Qy0weDZGICovCisJMHhCQywgMHhFQywgMHgwMCwgMHgwMCwgMHhFNiwgMHg0QywgMHhFMiwgMHhBMiwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHg0OCwgMHhFNiwgMHg1RiwgLyogMHg3NC0weDc3ICovCisJMHhCQywgMHhFOCwgMHgwMCwgMHgwMCwgMHhCQywgMHhFQiwgMHhFNiwgMHg2MSwgLyogMHg3OC0weDdCICovCisJMHhCQywgMHhFMCwgMHhFNiwgMHg1NiwgMHhFNSwgMHhGQiwgMHhFNiwgMHg1QywgLyogMHg3Qy0weDdGICovCisJCisJMHhDMCwgMHhERiwgMHgwMCwgMHgwMCwgMHhFNiwgMHg0QSwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHhCQywgMHhFMSwgMHhFNiwgMHg0NSwgMHhCQywgMHhFNSwgMHhFNSwgMHhGQywgLyogMHg4NC0weDg3ICovCisJMHhCQSwgMHhBQiwgMHhFNiwgMHg0MSwgMHgwMCwgMHgwMCwgMHhFNiwgMHg1QSwgLyogMHg4OC0weDhCICovCisJMHhFNiwgMHg0MiwgMHhFNiwgMHg0MCwgMHhCQywgMHhFQSwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHhFNiwgMHg1OCwgMHgwMCwgMHgwMCwgMHhFNSwgMHhGRSwgMHhFNiwgMHg1MSwgLyogMHg5MC0weDkzICovCisJMHhFNiwgMHg1MCwgMHhFNiwgMHg1RCwgMHhFNiwgMHg0NywgMHhCQywgMHhFRSwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOSwgMHhGMywgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHhCRiwgMHg0OSwgMHhCRSwgMHhGRSwgMHhFQSwgMHg0MCwgMHhFOSwgMHhFQiwgLyogMHhBMC0weEEzICovCisJMHhCRiwgMHg0MSwgMHhFOSwgMHhGNywgMHhCRiwgMHg0OCwgMHhCRiwgMHg0MywgLyogMHhBNC0weEE3ICovCisJMHhFOSwgMHhGNSwgMHhFRCwgMHg0RiwgMHhFOSwgMHhGQiwgMHhFQSwgMHg0MiwgLyogMHhBOC0weEFCICovCisJMHhFOSwgMHhGQSwgMHhFOSwgMHhFOSwgMHhFOSwgMHhGOCwgMHhFQSwgMHg0NCwgLyogMHhBQy0weEFGICovCisJMHhFQSwgMHg0NiwgMHhCRSwgMHhGRCwgMHhFQSwgMHg0NSwgMHhCRiwgMHg0NCwgLyogMHhCMC0weEIzICovCisJMHhCRiwgMHg0QSwgMHgwMCwgMHgwMCwgMHhCRiwgMHg0NywgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHhFOSwgMHhGRSwgMHhCRiwgMHg0NiwgMHhFOSwgMHhGOSwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHhFOSwgMHhFRCwgMHhFOSwgMHhGMiwgMHgwMCwgMHgwMCwgMHhFOSwgMHhGRCwgLyogMHhCQy0weEJGICovCisJMHhCRiwgMHg0NSwgMHhCRiwgMHg0MiwgMHhCRSwgMHhGQywgMHhCRiwgMHg0MCwgLyogMHhDMC0weEMzICovCisJMHhFOSwgMHhGMSwgMHgwMCwgMHgwMCwgMHhFNSwgMHhGRCwgMHhFOSwgMHhFQywgLyogMHhDNC0weEM3ICovCisJMHhFOSwgMHhFRiwgMHhFQSwgMHg0MSwgMHhFOSwgMHhGNCwgMHhFOSwgMHhFQSwgLyogMHhDOC0weENCICovCisJMHhFRCwgMHg0RSwgMHhFQSwgMHg0MywgMHhFOSwgMHhFRSwgMHhFOSwgMHhGQywgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHhFRCwgMHg1MSwgMHhDMCwgMHhFMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHhDMCwgMHhENywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMCwgMHhEQiwgLyogMHhEOC0weERCICovCisJMHhFRCwgMHg1MywgMHhFRCwgMHg1OSwgMHhFRCwgMHg1NywgMHhDMCwgMHhEOSwgLyogMHhEQy0weERGICovCisJMHhDMCwgMHhEQSwgMHhDMCwgMHhFMSwgMHhFRCwgMHg1QSwgMHhFRCwgMHg1MiwgLyogMHhFMC0weEUzICovCisJMHhDMCwgMHhEQywgMHgwMCwgMHgwMCwgMHhFRCwgMHg1NiwgMHhFRCwgMHg1NSwgLyogMHhFNC0weEU3ICovCisJMHhFRCwgMHg1QiwgMHhDMCwgMHhFMiwgMHgwMCwgMHgwMCwgMHhDMCwgMHhERCwgLyogMHhFOC0weEVCICovCisJMHhDMCwgMHhFMCwgMHhFRCwgMHg1NCwgMHhDMCwgMHhFNCwgMHhDMCwgMHhERSwgLyogMHhFQy0weEVGICovCisJMHhDMCwgMHhFNSwgMHhDMCwgMHhEOCwgMHhFRCwgMHg1OCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHhFRCwgMHg1MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRiwgMHhGNywgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMiwgMHg3MSwgMHhFRiwgMHhGNCwgLyogMHhGOC0weEZCICovCisJMHhFRiwgMHhGNiwgMHgwMCwgMHgwMCwgMHhDMiwgMHg2RiwgMHhFRiwgMHhGMiwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNzBbNTEyXSA9IHsKKwkweEVGLCAweEYzLCAweEVGLCAweEVFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweEU5LCAweEY2LCAweEVGLCAweEVGLCAweEMyLCAweDcwLCAweEVGLCAweEVCLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweEMyLCAweDZELCAweEVGLCAweEY4LCAweEMyLCAweDZFLCAvKiAweDA4LTB4MEIgKi8KKwkweEVGLCAweEVDLCAweEVGLCAweEVELCAweEVGLCAweEYxLCAweEMyLCAweDczLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweEMyLCAweDcyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweEVGLCAweEYwLCAweEMzLCAweDc4LCAweEYyLCAweDVGLCAweEYyLCAweDY1LCAvKiAweDE0LTB4MTcgKi8KKwkweEMzLCAweDc5LCAweEYyLCAweDVDLCAweEMzLCAweDc2LCAweEMzLCAweDczLCAvKiAweDE4LTB4MUIgKi8KKwkweEYyLCAweDY3LCAweEMzLCAweDc3LCAweDAwLCAweDAwLCAweEMzLCAweDc0LCAvKiAweDFDLTB4MUYgKi8KKwkweEYyLCAweDVFLCAweEYyLCAweDYxLCAweEYyLCAweDYyLCAweEYyLCAweDYzLCAvKiAweDIwLTB4MjMgKi8KKwkweEYyLCAweDY2LCAweDAwLCAweDAwLCAweEVGLCAweEY1LCAweEYyLCAweDVELCAvKiAweDI0LTB4MjcgKi8KKwkweEMzLCAweDc1LCAweEYyLCAweDY0LCAweEYyLCAweDY4LCAweEYyLCAweDYwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY0LCAweDVELCAvKiAweDJDLTB4MkYgKi8KKwkweEM0LCAweDZBLCAweEY0LCAweDYwLCAweEM0LCAweDZCLCAweEY0LCAweDY4LCAvKiAweDMwLTB4MzMgKi8KKwkweEY0LCAweDVGLCAweEY0LCAweDVDLCAweDAwLCAweDAwLCAweEY0LCAweDVFLCAvKiAweDM0LTB4MzcgKi8KKwkweEY0LCAweDYyLCAweEY0LCAweDY1LCAweEY0LCAweDY0LCAweEY0LCAweDY3LCAvKiAweDM4LTB4M0IgKi8KKwkweEY0LCAweDVCLCAweDAwLCAweDAwLCAweEM0LCAweDY5LCAweEY0LCAweDYzLCAvKiAweDNDLTB4M0YgKi8KKwkweEY0LCAweDY2LCAweEY0LCAweDY5LCAweEY0LCAweDYxLCAweEY1LCAweEQzLCAvKiAweDQwLTB4NDMgKi8KKwkweEY1LCAweEQ0LCAweEY1LCAweEQ4LCAweEY1LCAweEQ5LCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweEY1LCAweEQ2LCAweEY1LCAweEQ3LCAweEY1LCAweEQ1LCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweEM0LCAweEU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweEM1LCAweDc4LCAweEY2LCAweEVCLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweEY2LCAweEU4LCAweEY2LCAweEU5LCAweEY2LCAweEVBLCAvKiAweDU0LTB4NTcgKi8KKwkweEM1LCAweDc5LCAweDAwLCAweDAwLCAweEY3LCAweEU1LCAweEY3LCAweEU0LCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweEY4LCAweEFGLCAweEM1LCAweEY0LCAweEY4LCAweEFELCAvKiAweDVDLTB4NUYgKi8KKwkweEY4LCAweEIwLCAweEY4LCAweEFFLCAweEY4LCAweEY1LCAweEM2LCAweDU3LCAvKiAweDYwLTB4NjMgKi8KKwkweEM2LCAweDY1LCAweEY5LCAweEEzLCAweEY5LCAweDZDLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweEY5LCAweEEyLCAweEY5LCAweEQwLCAweEY5LCAweEQxLCAweEE0LCAweEY1LCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweEE2LCAweEM3LCAweENBLCAweDQxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweENCLCAweDVFLCAweDAwLCAweDAwLCAweEE4LCAweDVGLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweEE4LCAweDYyLCAweDAwLCAweDAwLCAweENCLCAweDVGLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweEE4LCAweDYwLCAweEE4LCAweDYxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENELCAweDU4LCAweENELCAweDVBLCAvKiAweDgwLTB4ODMgKi8KKwkweENELCAweDU1LCAweENELCAweDUyLCAweENELCAweDU0LCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEFBLCAweEE0LCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEFBLCAweEEyLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweENELCAweDU2LCAweEFBLCAweEEzLCAweENELCAweDUzLCAvKiAweDkwLTB4OTMgKi8KKwkweENELCAweDUwLCAweEFBLCAweEExLCAweENELCAweDU3LCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweENELCAweDUxLCAweEFBLCAweEE1LCAweENELCAweDU5LCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENGLCAweEFGLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweENGLCAweEIzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweEFDLCAweEI3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweENGLCAweEI2LCAweDAwLCAweDAwLCAweEFDLCAweEFGLCAvKiAweEE4LTB4QUIgKi8KKwkweEFDLCAweEIyLCAweEFDLCAweEI0LCAweEFDLCAweEI2LCAweEFDLCAweEIzLCAvKiAweEFDLTB4QUYgKi8KKwkweENGLCAweEIyLCAweENGLCAweEIxLCAweDAwLCAweDAwLCAweEFDLCAweEIxLCAvKiAweEIwLTB4QjMgKi8KKwkweENGLCAweEI0LCAweENGLCAweEI1LCAweDAwLCAweDAwLCAweENGLCAweEFFLCAvKiAweEI0LTB4QjcgKi8KKwkweEFDLCAweEI1LCAweDAwLCAweDAwLCAweEFDLCAweEIwLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENGLCAweEIwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweEQyLCAweDc3LCAweEQyLCAweDc4LCAweEQyLCAweDc5LCAvKiAweEM0LTB4QzcgKi8KKwkweEFGLCAweDUwLCAweDAwLCAweDAwLCAweEFGLCAweDRDLCAweEQyLCAweDZFLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweEQyLCAweDc2LCAweEQyLCAweDdCLCAweEFGLCAweDUxLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweEQyLCAweDZDLCAweEQyLCAweDcyLCAweEQyLCAweDZCLCAvKiAweEQwLTB4RDMgKi8KKwkweEQyLCAweDc1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQyLCAweDcxLCAvKiAweEQ0LTB4RDcgKi8KKwkweEFGLCAweDRELCAweEFGLCAweDRGLCAweEQyLCAweDdBLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweEQyLCAweDZBLCAweEQyLCAweDZELCAweEQyLCAweDczLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweEQyLCAweDc0LCAweEQyLCAweDdDLCAweEQyLCAweDcwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweEFGLCAweDRFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIyLCAweDZELCAvKiAweEVDLTB4RUYgKi8KKwkweEQ2LCAweDRFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ2LCAweDUwLCAvKiAweEYwLTB4RjMgKi8KKwkweEQ2LCAweDRDLCAweDAwLCAweDAwLCAweEQ2LCAweDU4LCAweEQ2LCAweDRBLCAvKiAweEY0LTB4RjcgKi8KKwkweEQ2LCAweDU3LCAweEIyLCAweDY5LCAweEQ2LCAweDQ4LCAweERBLCAweDVCLCAvKiAweEY4LTB4RkIgKi8KKwkweEQ2LCAweDUyLCAweEIyLCAweDZDLCAweDAwLCAweDAwLCAweEQ2LCAweDUzLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183MVs1MTJdID0geworCTB4RDYsIDB4NTYsIDB4MDAsIDB4MDAsIDB4RDYsIDB4NUEsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4RDYsIDB4NEYsIDB4MDAsIDB4MDAsIDB4RDYsIDB4NTQsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4QjIsIDB4NkEsIDB4QjIsIDB4NkIsIDB4RDYsIDB4NTksIC8qIDB4MDgtMHgwQiAqLworCTB4RDYsIDB4NEQsIDB4RDYsIDB4NDksIDB4RDYsIDB4NUIsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4RDYsIDB4NTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDYsIDB4NTUsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDYsIDB4NEIsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4QjUsIDB4NDgsIDB4QjUsIDB4NDksIDB4REEsIDB4NjUsIC8qIDB4MTgtMHgxQiAqLworCTB4QjUsIDB4NEYsIDB4MDAsIDB4MDAsIDB4REEsIDB4NTksIDB4REEsIDB4NjIsIC8qIDB4MUMtMHgxRiAqLworCTB4REEsIDB4NTgsIDB4QjUsIDB4NEMsIDB4REEsIDB4NjAsIDB4REEsIDB4NUUsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4REEsIDB4NUYsIDB4QjUsIDB4NEEsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4REEsIDB4NjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REEsIDB4NUMsIDB4REEsIDB4NUEsIC8qIDB4MkMtMHgyRiAqLworCTB4QjUsIDB4NEIsIDB4REEsIDB4NUQsIDB4REEsIDB4NjEsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjUsIDB4NEQsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REEsIDB4NjQsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4REUsIDB4NzAsIDB4REUsIDB4NzcsIDB4REUsIDB4NzksIC8qIDB4NDAtMHg0MyAqLworCTB4REUsIDB4QTEsIDB4MDAsIDB4MDAsIDB4QjcsIDB4REEsIDB4REUsIDB4NkIsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4QjcsIDB4RDIsIDB4MDAsIDB4MDAsIDB4REUsIDB4N0EsIC8qIDB4NDgtMHg0QiAqLworCTB4QjcsIDB4RDcsIDB4REUsIDB4QTIsIDB4QjcsIDB4Q0UsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4REUsIDB4N0QsIDB4MDAsIDB4MDAsIDB4REUsIDB4NkQsIDB4REUsIDB4N0UsIC8qIDB4NTAtMHg1MyAqLworCTB4REUsIDB4NkMsIDB4MDAsIDB4MDAsIDB4QjcsIDB4REMsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4REUsIDB4NzgsIDB4QjcsIDB4Q0YsIDB4REUsIDB4QTMsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4QjcsIDB4RDQsIDB4REUsIDB4NzEsIDB4QjcsIDB4RDksIDB4REUsIDB4N0MsIC8qIDB4NUMtMHg1RiAqLworCTB4REUsIDB4NkYsIDB4REUsIDB4NzYsIDB4REUsIDB4NzIsIDB4REUsIDB4NkUsIC8qIDB4NjAtMHg2MyAqLworCTB4QjcsIDB4RDEsIDB4QjcsIDB4RDgsIDB4QjcsIDB4RDYsIDB4QjcsIDB4RDMsIC8qIDB4NjQtMHg2NyAqLworCTB4QjcsIDB4REIsIDB4QjcsIDB4RDAsIDB4REUsIDB4NzUsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4QjcsIDB4RDUsIDB4MDAsIDB4MDAsIDB4QjUsIDB4NEUsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4REUsIDB4N0IsIDB4MDAsIDB4MDAsIDB4REUsIDB4NzMsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4REUsIDB4NzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4QzEsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4QkEsIDB4QjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RTIsIDB4QkQsIDB4RTIsIDB4QzMsIDB4RTIsIDB4QkYsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4QkEsIDB4QjYsIDB4RTIsIDB4QkUsIDB4RTIsIDB4QzIsIDB4RTIsIDB4QkEsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4QkMsIDB4QkEsIDB4QjUsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4QzAsIC8qIDB4OEMtMHg4RiAqLworCTB4RTIsIDB4QkIsIDB4MDAsIDB4MDAsIDB4QkEsIDB4QjcsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4QkEsIDB4QjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4QzQsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4QkEsIDB4QjMsIDB4RTYsIDB4NjcsIDB4RTYsIDB4NjQsIC8qIDB4OTgtMHg5QiAqLworCTB4RTYsIDB4NzAsIDB4RTYsIDB4NkEsIDB4RTYsIDB4NkMsIDB4QkMsIDB4RjQsIC8qIDB4OUMtMHg5RiAqLworCTB4RTYsIDB4NjYsIDB4RTYsIDB4NkUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4RTYsIDB4NkQsIDB4RTYsIDB4NkIsIDB4MDAsIDB4MDAsIDB4RTYsIDB4NzEsIC8qIDB4QTQtMHhBNyAqLworCTB4QkMsIDB4RjcsIDB4RTYsIDB4NjgsIDB4RTYsIDB4NkYsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4QkMsIDB4RjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4NjMsIC8qIDB4QUMtMHhBRiAqLworCTB4RTYsIDB4NjUsIDB4QkMsIDB4RjYsIDB4RTYsIDB4NjIsIDB4RTYsIDB4NzIsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4RTYsIDB4NjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4RUEsIDB4NEEsIDB4QkYsIDB4NTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4RUEsIDB4NTUsIDB4RUEsIDB4NTMsIDB4QkYsIDB4NEIsIDB4RUEsIDB4NDksIC8qIDB4QkMtMHhCRiAqLworCTB4RUEsIDB4NEMsIDB4RUEsIDB4NEQsIDB4RUEsIDB4NDgsIDB4QkYsIDB4NTUsIC8qIDB4QzAtMHhDMyAqLworCTB4QkYsIDB4NTYsIDB4RUEsIDB4NDcsIDB4RUEsIDB4NTYsIDB4RUEsIDB4NTEsIC8qIDB4QzQtMHhDNyAqLworCTB4QkYsIDB4NEYsIDB4QkYsIDB4NEMsIDB4RUEsIDB4NTAsIDB4RUEsIDB4NEUsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkYsIDB4NTIsIDB4RUEsIDB4NTIsIC8qIDB4Q0MtMHhDRiAqLworCTB4QkYsIDB4NEQsIDB4MDAsIDB4MDAsIDB4QkYsIDB4NEUsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4RUEsIDB4NEYsIDB4QkYsIDB4NTAsIDB4RUEsIDB4NEIsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4RUEsIDB4NTQsIDB4QkYsIDB4NTMsIDB4RUEsIDB4NTcsIDB4RUEsIDB4NTgsIC8qIDB4RDgtMHhEQiAqLworCTB4QkYsIDB4NTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzAsIDB4RTcsIC8qIDB4REMtMHhERiAqLworCTB4QzAsIDB4RUUsIDB4RUQsIDB4NUMsIDB4RUQsIDB4NjIsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4RUQsIDB4NjAsIDB4QzAsIDB4RUEsIDB4QzAsIDB4RTksIDB4QzAsIDB4RTYsIC8qIDB4RTQtMHhFNyAqLworCTB4RUQsIDB4NUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4QzAsIDB4RUMsIDB4QzAsIDB4RUIsIDB4QzAsIDB4RTgsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4RUQsIDB4NjEsIDB4RUQsIDB4NUQsIDB4RUQsIDB4NUYsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4QzAsIDB4RUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4QzIsIDB4NzcsIDB4RUYsIDB4RkIsIDB4MDAsIDB4MDAsIDB4QzIsIDB4NzQsIC8qIDB4RjgtMHhGQiAqLworCTB4QzIsIDB4NzUsIDB4RUYsIDB4RkQsIDB4QzIsIDB4NzYsIDB4RUYsIDB4RkEsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzcyWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHhFRiwgMHhGOSwgMHhGMiwgMHg2QywgMHhFRiwgMHhGQywgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHhGMiwgMHg2RCwgMHhDMywgMHg3QSwgMHhGMiwgMHg2QiwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMiwgMHg2QSwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHhGMiwgMHg2OSwgMHhDMywgMHg3QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHhDNCwgMHg2QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNCwgMHg2QSwgLyogMHgxMC0weDEzICovCisJMHhGNCwgMHg2QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHhGNSwgMHhEQywgMHhGNSwgMHhEQiwgMHhDNCwgMHhFQSwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHhGNSwgMHhEQSwgMHhGNiwgMHhFQywgMHhGNiwgMHhFRCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNywgMHhFNiwgMHhGOCwgMHhCMSwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOCwgMHhGNiwgMHhGOSwgMHhCQywgLyogMHgyNC0weDI3ICovCisJMHhDNiwgMHg3OSwgMHhGOSwgMHhDNiwgMHhBNCwgMHhGNiwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHhBQSwgMHhBNiwgMHhBQSwgMHhBNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHhBQywgMHhCOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHhDMCwgMHhFRiwgMHhBNCwgMHhGNywgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHhBQSwgMHhBOCwgMHhBRiwgMHg1MiwgMHhCNywgMHhERCwgMHhBNCwgMHhGOCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHhCMiwgMHg2RSwgMHhCQSwgMHhCOCwgMHhDOSwgMHg2MiwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHhDRiwgMHhCNywgMHhEMiwgMHg3RCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHhFMiwgMHhDNSwgMHgwMCwgMHgwMCwgMHhDMCwgMHhGMCwgMHhBNCwgMHhGOSwgLyogMHg0NC0weDQ3ICovCisJMHhBQSwgMHhBOSwgMHhDRiwgMHhCOCwgMHhDRiwgMHhCOSwgMHhEQSwgMHg2NiwgLyogMHg0OC0weDRCICovCisJMHhCNSwgMHg1MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERSwgMHhBNCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCNywgMHhERSwgMHhFMiwgMHhDNiwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQywgMHhGOCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHhDMywgMHg3QywgMHhBNCwgMHhGQSwgMHhEQSwgMHg2NywgMHhBNCwgMHhGQiwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHhBNiwgMHhDOSwgMHhDQSwgMHg0MiwgMHhBNiwgMHhDOCwgLyogMHg1Qy0weDVGICovCisJMHhBOCwgMHg2NSwgMHhBOCwgMHg2NCwgMHhBOCwgMHg2MywgMHhDQiwgMHg2MCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBQSwgMHhBQSwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhBQSwgMHhBQiwgMHhDRCwgMHg1QiwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHhDRiwgMHhCQSwgMHgwMCwgMHgwMCwgMHhDRiwgMHhCRCwgMHhBQywgMHhCQSwgLyogMHg2Qy0weDZGICovCisJMHhDRiwgMHhCQiwgMHgwMCwgMHgwMCwgMHhBQywgMHhCOSwgMHhDRiwgMHhCQywgLyogMHg3MC0weDczICovCisJMHhBQywgMHhCQiwgMHgwMCwgMHgwMCwgMHhEMiwgMHhBMiwgMHhEMiwgMHhBMSwgLyogMHg3NC0weDc3ICovCisJMHhEMiwgMHg3RSwgMHhBRiwgMHg1MywgMHgwMCwgMHgwMCwgMHhENiwgMHg1RCwgLyogMHg3OC0weDdCICovCisJMHhENiwgMHg1RSwgMHhCMiwgMHg2RiwgMHhENiwgMHg1QywgMHhENiwgMHg1RiwgLyogMHg3Qy0weDdGICovCisJCisJMHhCNSwgMHg1MiwgMHhCMiwgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHhCNSwgMHg1MSwgMHhEQSwgMHg2QiwgMHhEQSwgMHg2QSwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHhEQSwgMHg2OCwgMHhEQSwgMHg2OSwgMHgwMCwgMHgwMCwgMHhEQSwgMHg2QywgLyogMHg4OC0weDhCICovCisJMHhERSwgMHhBNiwgMHhERSwgMHhBNSwgMHhERSwgMHhBOSwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHhERSwgMHhBOCwgMHhERSwgMHhBNywgMHhCQSwgMHhCOSwgMHhFMiwgMHhDOSwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHhDOCwgMHhCQSwgMHhCQSwgMHhFMiwgMHhDNywgLyogMHg5NC0weDk3ICovCisJMHhFNiwgMHg3MywgMHgwMCwgMHgwMCwgMHhFNiwgMHg3NCwgMHhCQywgMHhGOSwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHhFQSwgMHg1OSwgMHhFQSwgMHg1QSwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHhGMiwgMHg3MiwgMHhDMywgMHg3RCwgMHhGMiwgMHg3MSwgLyogMHhBMC0weEEzICovCisJMHhGMiwgMHg3MCwgMHhGMiwgMHg2RSwgMHhGMiwgMHg2RiwgMHhDNCwgMHhFQiwgLyogMHhBNC0weEE3ICovCisJMHhGNCwgMHg2QywgMHhGNiwgMHhFRSwgMHhGOCwgMHhGNywgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHhBNCwgMHhGQywgMHgwMCwgMHgwMCwgMHhDOSwgMHhBNSwgMHhBNSwgMHhDNywgLyogMHhBQy0weEFGICovCisJMHhDOSwgMHhBNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHhDQSwgMHg0MywgMHhDQSwgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQiwgMHg2NiwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHhDQiwgMHg2MiwgMHgwMCwgMHgwMCwgMHhDQiwgMHg2MSwgLyogMHhCQy0weEJGICovCisJMHhBQSwgMHhBQywgMHhDQiwgMHg2NSwgMHhBOCwgMHg2NywgMHhDQiwgMHg2MywgLyogMHhDMC0weEMzICovCisJMHhBOCwgMHg2NiwgMHhDQiwgMHg2NywgMHhDQiwgMHg2NCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHhDRCwgMHg1RiwgMHhDRiwgMHhCRSwgMHhDRCwgMHg1RCwgLyogMHhDOC0weENCICovCisJMHhDRCwgMHg2NCwgMHgwMCwgMHgwMCwgMHhBQSwgMHhBRCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHhBQSwgMHhCMCwgMHhDRCwgMHg2NSwgMHhDRCwgMHg2MSwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHhDRCwgMHg2MiwgMHgwMCwgMHgwMCwgMHhDRCwgMHg1QywgMHhBQSwgMHhBRiwgLyogMHhENC0weEQ3ICovCisJMHhDRCwgMHg1RSwgMHhBQSwgMHhBRSwgMHhDRCwgMHg2MywgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHhDRCwgMHg2MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRiwgMHhDMiwgLyogMHhEQy0weERGICovCisJMHhBQywgMHhCRCwgMHhBQywgMHhCRSwgMHgwMCwgMHgwMCwgMHhDRiwgMHhDNSwgLyogMHhFMC0weEUzICovCisJMHhDRiwgMHhCRiwgMHgwMCwgMHgwMCwgMHhDRiwgMHhDNCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHhDRiwgMHhDMCwgMHhBQywgMHhCQywgMHhDRiwgMHhDMywgMHhDRiwgMHhDMSwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMiwgMHhBOCwgLyogMHhGMC0weEYzICovCisJMHhEMiwgMHhBNSwgMHgwMCwgMHgwMCwgMHhEMiwgMHhBNywgMHhBRiwgMHg1OCwgLyogMHhGNC0weEY3ICovCisJMHhBRiwgMHg1NywgMHhBRiwgMHg1NSwgMHhEMiwgMHhBNCwgMHhEMiwgMHhBOSwgLyogMHhGOC0weEZCICovCisJMHhBRiwgMHg1NCwgMHhBRiwgMHg1NiwgMHhEMiwgMHhBNiwgMHhENiwgMHg2NywgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNzNbNTEyXSA9IHsKKwkweEQyLCAweEEzLCAweEQyLCAweEFBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ2LCAweDYyLCAvKiAweDA0LTB4MDcgKi8KKwkweEQ2LCAweDY2LCAweDAwLCAweDAwLCAweEQ2LCAweDY1LCAweERBLCAweDZFLCAvKiAweDA4LTB4MEIgKi8KKwkweERBLCAweDc5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ2LCAweDY4LCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweEQ2LCAweDYzLCAweERBLCAweDZELCAweEIyLCAweDc0LCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIyLCAweDczLCAweEQ2LCAweDYxLCAvKiAweDE0LTB4MTcgKi8KKwkweEQ2LCAweDY0LCAweEIyLCAweDc1LCAweDAwLCAweDAwLCAweEIyLCAweDcyLCAvKiAweDE4LTB4MUIgKi8KKwkweEIyLCAweDcxLCAweEQ2LCAweDYwLCAweEQ2LCAweDY5LCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERBLCAweDcwLCAweERBLCAweDc3LCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweEI1LCAweDU0LCAweERBLCAweDc2LCAweERBLCAweDczLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweEI1LCAweDU2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweERBLCAweDc1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweERBLCAweDZGLCAweERBLCAweDcxLCAweERBLCAweDc0LCAweERBLCAweDcyLCAvKiAweDMwLTB4MzMgKi8KKwkweEI1LCAweDU1LCAweERBLCAweDc4LCAweEI1LCAweDUzLCAweEI3LCAweERGLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERFLCAweEFELCAweERFLCAweEFDLCAvKiAweDM4LTB4M0IgKi8KKwkweERFLCAweEFBLCAweDAwLCAweDAwLCAweEI3LCAweEUyLCAweEI3LCAweEUxLCAvKiAweDNDLTB4M0YgKi8KKwkweERFLCAweEFFLCAweDAwLCAweDAwLCAweERFLCAweEFCLCAweEUyLCAweENBLCAvKiAweDQwLTB4NDMgKi8KKwkweEJBLCAweEJCLCAweEI3LCAweEUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweERFLCAweEIwLCAweERFLCAweEFGLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweEUyLCAweENELCAweEUyLCAweENCLCAweEJDLCAweEZBLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweEJBLCAweEJDLCAweEUyLCAweENDLCAweEU2LCAweDc2LCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJDLCAweEZCLCAvKiAweDU0LTB4NTcgKi8KKwkweEU2LCAweDc1LCAweEU2LCAweDdFLCAweEU2LCAweDdELCAweEU2LCAweDdCLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweEU2LCAweDdBLCAweEU2LCAweDc3LCAweEU2LCAweDc4LCAvKiAweDVDLTB4NUYgKi8KKwkweEU2LCAweDc5LCAweEU2LCAweDdDLCAweEU2LCAweEExLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweEVBLCAweDVGLCAweEVBLCAweDVDLCAweEVBLCAweDVELCAvKiAweDY0LTB4NjcgKi8KKwkweEJGLCAweDU3LCAweEVBLCAweDVCLCAweEVBLCAweDYxLCAweEVBLCAweDYwLCAvKiAweDY4LTB4NkIgKi8KKwkweEVBLCAweDVFLCAweDAwLCAweDAwLCAweEVELCAweDY0LCAweEVELCAweDY1LCAvKiAweDZDLTB4NkYgKi8KKwkweEMwLCAweEYxLCAweDAwLCAweDAwLCAweEMwLCAweEYyLCAweEVELCAweDYzLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweEMyLCAweDc5LCAweEVGLCAweEZFLCAweEMyLCAweDc4LCAvKiAweDc0LTB4NzcgKi8KKwkweEMzLCAweDdFLCAweDAwLCAweDAwLCAweEMzLCAweEExLCAweEM0LCAweDZELCAvKiAweDc4LTB4N0IgKi8KKwkweEY0LCAweDZFLCAweEY0LCAweDZELCAweEY1LCAweERELCAweEY2LCAweEVGLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEM1LCAweDdBLCAweEY3LCAweEU4LCAweEY3LCAweEU3LCAweEY3LCAweEU5LCAvKiAweDgwLTB4ODMgKi8KKwkweEE1LCAweEM4LCAweENGLCAweEM2LCAweEFGLCAweDU5LCAweEIyLCAweDc2LCAvKiAweDg0LTB4ODcgKi8KKwkweEQ2LCAweDZBLCAweEE1LCAweEM5LCAweEM5LCAweEE3LCAweEE0LCAweEZELCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENBLCAweDQ1LCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENCLCAweDZDLCAweENCLCAweDZBLCAvKiAweDkwLTB4OTMgKi8KKwkweENCLCAweDZCLCAweENCLCAweDY4LCAweEE4LCAweDY4LCAweENCLCAweDY5LCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweENELCAweDZELCAweDAwLCAweDAwLCAweEFBLCAweEIzLCAvKiAweDlDLTB4OUYgKi8KKwkweENELCAweDZCLCAweENELCAweDY3LCAweENELCAweDZBLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweENELCAweDY2LCAweEFBLCAweEI1LCAweENELCAweDY5LCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweEFBLCAweEIyLCAweEFBLCAweEIxLCAweDAwLCAweDAwLCAweEFBLCAweEI0LCAvKiAweEE4LTB4QUIgKi8KKwkweENELCAweDZDLCAweENELCAweDY4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEFDLCAweEMyLCAweEFDLCAweEM1LCAvKiAweEIwLTB4QjMgKi8KKwkweENGLCAweENFLCAweENGLCAweENELCAweENGLCAweENDLCAweEFDLCAweEJGLCAvKiAweEI0LTB4QjcgKi8KKwkweENGLCAweEQ1LCAweENGLCAweENCLCAweDAwLCAweDAwLCAweEFDLCAweEMxLCAvKiAweEI4LTB4QkIgKi8KKwkweEQyLCAweEFGLCAweDAwLCAweDAwLCAweENGLCAweEQyLCAweENGLCAweEQwLCAvKiAweEJDLTB4QkYgKi8KKwkweEFDLCAweEM0LCAweDAwLCAweDAwLCAweENGLCAweEM4LCAweENGLCAweEQzLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweENGLCAweENBLCAweENGLCAweEQ0LCAweENGLCAweEQxLCAvKiAweEM0LTB4QzcgKi8KKwkweENGLCAweEM5LCAweDAwLCAweDAwLCAweEFDLCAweEMwLCAweENGLCAweEQ2LCAvKiAweEM4LTB4Q0IgKi8KKwkweENGLCAweEM3LCAweEFDLCAweEMzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQyLCAweEI0LCAweEQyLCAweEFCLCAvKiAweEQwLTB4RDMgKi8KKwkweEQyLCAweEI2LCAweDAwLCAweDAwLCAweEQyLCAweEFFLCAweEQyLCAweEI5LCAvKiAweEQ0LTB4RDcgKi8KKwkweEQyLCAweEJBLCAweEQyLCAweEFDLCAweEQyLCAweEI4LCAweEQyLCAweEI1LCAvKiAweEQ4LTB4REIgKi8KKwkweEQyLCAweEIzLCAweEQyLCAweEI3LCAweEFGLCAweDVGLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweEFGLCAweDVELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQyLCAweEIxLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweEQyLCAweEFELCAweDAwLCAweDAwLCAweEQyLCAweEIwLCAvKiAweEU0LTB4RTcgKi8KKwkweEQyLCAweEJCLCAweEQyLCAweEIyLCAweEFGLCAweDVFLCAweENGLCAweENGLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweEFGLCAweDVBLCAweEFGLCAweDVDLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweEQ2LCAweDc4LCAweEQ2LCAweDZELCAweEQ2LCAweDZCLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweEQ2LCAweDZDLCAweDAwLCAweDAwLCAweEQ2LCAweDczLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweEQ2LCAweDc0LCAweEQ2LCAweDcwLCAweEIyLCAweDdCLCAweEQ2LCAweDc1LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183NFs1MTJdID0geworCTB4RDYsIDB4NzIsIDB4RDYsIDB4NkYsIDB4MDAsIDB4MDAsIDB4QjIsIDB4NzksIC8qIDB4MDAtMHgwMyAqLworCTB4RDYsIDB4NkUsIDB4QjIsIDB4NzcsIDB4QjIsIDB4N0EsIDB4RDYsIDB4NzEsIC8qIDB4MDQtMHgwNyAqLworCTB4RDYsIDB4NzksIDB4QUYsIDB4NUIsIDB4QjIsIDB4NzgsIDB4RDYsIDB4NzcsIC8qIDB4MDgtMHgwQiAqLworCTB4RDYsIDB4NzYsIDB4QjIsIDB4N0MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REEsIDB4N0UsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REEsIDB4QTEsIDB4QjUsIDB4NjAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4REEsIDB4QTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4REEsIDB4QTksIDB4REEsIDB4QTIsIDB4QjUsIDB4NUEsIDB4REEsIDB4QTYsIC8qIDB4MjAtMHgyMyAqLworCTB4REEsIDB4QTUsIDB4QjUsIDB4NUIsIDB4QjUsIDB4NjEsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4QjUsIDB4NjIsIDB4REEsIDB4QTgsIDB4QjUsIDB4NTgsIDB4REEsIDB4N0QsIC8qIDB4MjgtMHgyQiAqLworCTB4REEsIDB4N0IsIDB4REEsIDB4QTMsIDB4REEsIDB4N0EsIDB4QjUsIDB4NUYsIC8qIDB4MkMtMHgyRiAqLworCTB4REEsIDB4N0MsIDB4REEsIDB4QTQsIDB4REEsIDB4QUEsIDB4QjUsIDB4NTksIC8qIDB4MzAtMHgzMyAqLworCTB4QjUsIDB4NUUsIDB4QjUsIDB4NUMsIDB4QjUsIDB4NUQsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjUsIDB4NTcsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjcsIDB4RTksIC8qIDB4M0MtMHgzRiAqLworCTB4REUsIDB4QjcsIDB4QjcsIDB4RTgsIDB4REUsIDB4QkIsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4REUsIDB4QjEsIDB4MDAsIDB4MDAsIDB4REUsIDB4QkMsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REUsIDB4QjIsIDB4REUsIDB4QjMsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4REUsIDB4QkQsIDB4REUsIDB4QkEsIDB4REUsIDB4QjgsIC8qIDB4NEMtMHg0RiAqLworCTB4REUsIDB4QjksIDB4REUsIDB4QjUsIDB4REUsIDB4QjQsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4REUsIDB4QkUsIDB4QjcsIDB4RTUsIDB4MDAsIDB4MDAsIDB4REUsIDB4QjYsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4QjcsIDB4RUEsIDB4QjcsIDB4RTQsIDB4QjcsIDB4RUIsIC8qIDB4NTgtMHg1QiAqLworCTB4QjcsIDB4RUMsIDB4MDAsIDB4MDAsIDB4QjcsIDB4RTcsIDB4QjcsIDB4RTYsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4Q0UsIDB4QkEsIDB4QkUsIC8qIDB4NjAtMHg2MyAqLworCTB4QkEsIDB4QkQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTIsIDB4RDMsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4QkMsIDB4RkMsIDB4QkEsIDB4QkYsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4QkEsIDB4QzEsIDB4RTIsIDB4RDQsIDB4QjcsIDB4RTMsIC8qIDB4NkMtMHg2RiAqLworCTB4QkEsIDB4QzAsIDB4RTIsIDB4RDAsIDB4RTIsIDB4RDIsIDB4RTIsIDB4Q0YsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4RTIsIDB4RDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4RTYsIDB4QUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4RTYsIDB4QUEsIDB4RTYsIDB4QTcsIDB4QkQsIDB4NDAsIDB4RUEsIDB4NjIsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QkQsIDB4NDEsIDB4RTYsIDB4QTYsIDB4MDAsIDB4MDAsIDB4QkMsIDB4RkUsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4RTYsIDB4QTgsIDB4RTYsIDB4QTUsIDB4RTYsIDB4QTIsIC8qIDB4ODQtMHg4NyAqLworCTB4RTYsIDB4QTksIDB4RTYsIDB4QTMsIDB4RTYsIDB4QTQsIDB4QkMsIDB4RkQsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4RUQsIDB4NjksIDB4MDAsIDB4MDAsIDB4RUEsIDB4NjYsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4RUEsIDB4NjUsIDB4RUEsIDB4NjcsIDB4MDAsIDB4MDAsIDB4RUQsIDB4NjYsIC8qIDB4OTQtMHg5NyAqLworCTB4QkYsIDB4NUEsIDB4MDAsIDB4MDAsIDB4RUEsIDB4NjMsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4QkYsIDB4NTgsIDB4MDAsIDB4MDAsIDB4QkYsIDB4NUMsIDB4QkYsIDB4NUIsIC8qIDB4OUMtMHg5RiAqLworCTB4RUEsIDB4NjQsIDB4RUEsIDB4NjgsIDB4MDAsIDB4MDAsIDB4QkYsIDB4NTksIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4RUQsIDB4NkQsIDB4QzAsIDB4RjUsIDB4QzIsIDB4N0EsIC8qIDB4QTQtMHhBNyAqLworCTB4QzAsIDB4RjYsIDB4QzAsIDB4RjMsIDB4RUQsIDB4NkEsIDB4RUQsIDB4NjgsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4RUQsIDB4NkIsIDB4MDAsIDB4MDAsIDB4RUQsIDB4NkUsIC8qIDB4QUMtMHhBRiAqLworCTB4QzAsIDB4RjQsIDB4RUQsIDB4NkMsIDB4RUQsIDB4NjcsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4RjAsIDB4NDIsIDB4RjAsIDB4NDUsIDB4RjIsIDB4NzUsIC8qIDB4QjQtMHhCNyAqLworCTB4RjAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4RjQsIDB4NkYsIDB4RjAsIDB4NDYsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4QzMsIDB4QTIsIDB4RjAsIDB4NDQsIDB4QzIsIDB4N0IsIC8qIDB4QkMtMHhCRiAqLworCTB4RjAsIDB4NDEsIDB4RjAsIDB4NDMsIDB4RjAsIDB4NDcsIDB4RjIsIDB4NzYsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4RjIsIDB4NzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzMsIDB4QTMsIDB4RjIsIDB4NzMsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzQsIDB4NkUsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4QzQsIDB4RUQsIDB4RjYsIDB4RjEsIDB4QzQsIDB4RUMsIDB4RjYsIDB4RjMsIC8qIDB4RDQtMHhENyAqLworCTB4RjYsIDB4RjAsIDB4RjYsIDB4RjIsIDB4QzUsIDB4RDAsIDB4RjgsIDB4QjIsIC8qIDB4RDgtMHhEQiAqLworCTB4QTUsIDB4Q0EsIDB4Q0QsIDB4NkUsIDB4RDIsIDB4QkMsIDB4RDIsIDB4QkQsIC8qIDB4REMtMHhERiAqLworCTB4QjIsIDB4N0QsIDB4REUsIDB4QkYsIDB4QkYsIDB4NUQsIDB4QzMsIDB4QTQsIC8qIDB4RTAtMHhFMyAqLworCTB4QzUsIDB4N0IsIDB4RjgsIDB4QjMsIDB4QTUsIDB4Q0IsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4Q0QsIDB4NkYsIDB4QTIsIDB4NjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4Q0YsIDB4RDcsIDB4MDAsIDB4MDAsIDB4Q0YsIDB4RDgsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4RDIsIDB4QkUsIDB4RDIsIDB4QkYsIDB4QjIsIDB4N0UsIDB4QjIsIDB4QTEsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REEsIDB4QUIsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4REUsIDB4QzIsIDB4REUsIDB4QzEsIDB4REUsIDB4QzAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzc1WzUxMl0gPSB7CisJMHhFMiwgMHhENSwgMHgwMCwgMHgwMCwgMHhFMiwgMHhENiwgMHhFMiwgMHhENywgLyogMHgwMC0weDAzICovCisJMHhCQSwgMHhDMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhBRCwgLyogMHgwNC0weDA3ICovCisJMHhFNiwgMHhBQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHg2OSwgLyogMHgwOC0weDBCICovCisJMHhCRiwgMHg1RSwgMHhCRiwgMHg1RiwgMHgwMCwgMHgwMCwgMHhFRCwgMHg3MiwgLyogMHgwQy0weDBGICovCisJMHhFRCwgMHg2RiwgMHhFRCwgMHg3MCwgMHhFRCwgMHg3MSwgMHhGMCwgMHg0OSwgLyogMHgxMC0weDEzICovCisJMHhGMCwgMHg0OCwgMHhDMiwgMHg3QywgMHhGMiwgMHg3NywgMHhGNSwgMHhERSwgLyogMHgxNC0weDE3ICovCisJMHhBNSwgMHhDQywgMHgwMCwgMHgwMCwgMHhBQywgMHhDNiwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHhCMiwgMHhBMiwgMHhERSwgMHhDMywgMHgwMCwgMHgwMCwgMHhBNSwgMHhDRCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHhEMiwgMHhDMCwgMHhCMiwgMHhBMywgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhCNSwgMHg2MywgMHhCNSwgMHg2NCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHhBNSwgMHhDRSwgMHhBNSwgMHhDRiwgMHhDQSwgMHg0NiwgMHhBOCwgMHg2QSwgLyogMHgyOC0weDJCICovCisJMHhBOCwgMHg2OSwgMHhBQywgMHhDNywgMHhDRiwgMHhEOSwgMHhEQSwgMHhBQywgLyogMHgyQy0weDJGICovCisJMHhBNSwgMHhEMCwgMHhBNSwgMHhEMSwgMHhBNSwgMHhEMiwgMHhBNSwgMHhEMywgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBOCwgMHg2QiwgLyogMHgzNC0weDM3ICovCisJMHhBOCwgMHg2QywgMHhDQiwgMHg2RSwgMHhDQiwgMHg2RCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHhBQSwgMHhCNiwgMHhDRCwgMHg3MiwgMHhDRCwgMHg3MCwgLyogMHgzQy0weDNGICovCisJMHhDRCwgMHg3MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRiwgMHhEQSwgLyogMHg0NC0weDQ3ICovCisJMHhDRiwgMHhEQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBQywgMHhDQiwgLyogMHg0OC0weDRCICovCisJMHhBQywgMHhDOSwgMHgwMCwgMHgwMCwgMHhBQywgMHhDQSwgMHhBQywgMHhDOCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHhBRiwgMHg2MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhBRiwgMHg2NCwgMHhBRiwgMHg2MywgMHhEMiwgMHhDMSwgLyogMHg1OC0weDVCICovCisJMHhBRiwgMHg2MiwgMHhBRiwgMHg2MSwgMHgwMCwgMHgwMCwgMHhEMiwgMHhDMiwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMiwgMHhBNiwgMHhENiwgMHg3QiwgLyogMHg2MC0weDYzICovCisJMHhENiwgMHg3QSwgMHhCMiwgMHhBNCwgMHhCMiwgMHhBNSwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCNSwgMHg2NiwgMHhCNSwgMHg2NSwgLyogMHg2OC0weDZCICovCisJMHhEQSwgMHhBRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQSwgMHhBRCwgLyogMHg2Qy0weDZGICovCisJMHhCMiwgMHhBNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCNywgMHhFRCwgMHhERSwgMHhDNSwgLyogMHg3NC0weDc3ICovCisJMHhCNywgMHhFRSwgMHhERSwgMHhDNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHhFMiwgMHhEOCwgMHhFNiwgMHhBRSwgMHhCRCwgMHg0MiwgLyogMHg3Qy0weDdGICovCisJCisJMHhFQSwgMHg2QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHhFRCwgMHg3MywgMHgwMCwgMHgwMCwgMHhDMywgMHhBNiwgMHhDMywgMHhBNSwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDNSwgMHg3QywgMHhBNSwgMHhENCwgLyogMHg4OC0weDhCICovCisJMHhDRCwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMiwgMHhBOCwgLyogMHg4Qy0weDhGICovCisJMHhFMiwgMHhEOSwgMHhCQSwgMHhDMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHhDQiwgMHg2RiwgMHhDQiwgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHhDRCwgMHg3NCwgMHhBQSwgMHhCOCwgMHhBQSwgMHhCOSwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHhBQSwgMHhCNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBQywgMHhDRiwgMHhBQywgMHhEMCwgLyogMHhBMC0weEEzICovCisJMHhBQywgMHhDRCwgMHhBQywgMHhDRSwgMHgwMCwgMHgwMCwgMHhDRiwgMHhEQywgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRiwgMHhERCwgMHhBQywgMHhDQywgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHhEMiwgMHhDMywgMHgwMCwgMHgwMCwgMHhBRiwgMHg2OCwgMHhBRiwgMHg2OSwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHhCMiwgMHhBQiwgMHhEMiwgMHhDOSwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHhBRiwgMHg2RSwgMHhBRiwgMHg2QywgMHhEMiwgMHhDQSwgMHhEMiwgMHhDNSwgLyogMHhCOC0weEJCICovCisJMHhBRiwgMHg2QiwgMHhBRiwgMHg2QSwgMHhBRiwgMHg2NSwgMHhEMiwgMHhDOCwgLyogMHhCQy0weEJGICovCisJMHhEMiwgMHhDNywgMHhEMiwgMHhDNCwgMHhBRiwgMHg2RCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHhEMiwgMHhDNiwgMHhBRiwgMHg2NiwgMHgwMCwgMHgwMCwgMHhBRiwgMHg2NywgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMiwgMHhBQywgMHhENiwgMHhBMSwgLyogMHhDOC0weENCICovCisJMHhENiwgMHhBMiwgMHhCMiwgMHhBRCwgMHhENiwgMHg3QywgMHhENiwgMHg3RSwgLyogMHhDQy0weENGICovCisJMHhENiwgMHhBNCwgMHhENiwgMHhBMywgMHhENiwgMHg3RCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHhCMiwgMHhBOSwgMHhCMiwgMHhBQSwgMHgwMCwgMHgwMCwgMHhEQSwgMHhCNiwgLyogMHhENC0weEQ3ICovCisJMHhCNSwgMHg2QiwgMHhCNSwgMHg2QSwgMHhEQSwgMHhCMCwgMHhCNSwgMHg2OCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHhEQSwgMHhCMywgMHhCNSwgMHg2QywgMHhEQSwgMHhCNCwgLyogMHhEQy0weERGICovCisJMHhCNSwgMHg2RCwgMHhEQSwgMHhCMSwgMHhCNSwgMHg2NywgMHhCNSwgMHg2OSwgLyogMHhFMC0weEUzICovCisJMHhEQSwgMHhCNSwgMHgwMCwgMHgwMCwgMHhEQSwgMHhCMiwgMHhEQSwgMHhBRiwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHhERSwgMHhEMiwgMHgwMCwgMHgwMCwgMHhERSwgMHhDNywgLyogMHhFQy0weEVGICovCisJMHhCNywgMHhGMCwgMHhCNywgMHhGMywgMHhCNywgMHhGMiwgMHhCNywgMHhGNywgLyogMHhGMC0weEYzICovCisJMHhCNywgMHhGNiwgMHhERSwgMHhEMywgMHhERSwgMHhEMSwgMHhERSwgMHhDQSwgLyogMHhGNC0weEY3ICovCisJMHhERSwgMHhDRSwgMHhERSwgMHhDRCwgMHhCNywgMHhGNCwgMHhERSwgMHhEMCwgLyogMHhGOC0weEZCICovCisJMHhERSwgMHhDQywgMHhERSwgMHhENCwgMHhERSwgMHhDQiwgMHhCNywgMHhGNSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNzZbNTEyXSA9IHsKKwkweEI3LCAweEVGLCAweEI3LCAweEYxLCAweDAwLCAweDAwLCAweERFLCAweEM5LCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweEUyLCAweERCLCAweEJBLCAweEM3LCAweEUyLCAweERGLCAweEJBLCAweEM2LCAvKiAweDA4LTB4MEIgKi8KKwkweEUyLCAweERDLCAweEJBLCAweEM1LCAweDAwLCAweDAwLCAweERFLCAweEM4LCAvKiAweDBDLTB4MEYgKi8KKwkweERFLCAweENGLCAweEUyLCAweERFLCAweDAwLCAweDAwLCAweEJBLCAweEM4LCAvKiAweDEwLTB4MTMgKi8KKwkweEUyLCAweEUwLCAweEUyLCAweERELCAweEUyLCAweERBLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweEU2LCAweEIxLCAweEU2LCAweEI1LCAweEU2LCAweEI3LCAvKiAweDE4LTB4MUIgKi8KKwkweEU2LCAweEIzLCAweEU2LCAweEIyLCAweEU2LCAweEIwLCAweEJELCAweDQ1LCAvKiAweDFDLTB4MUYgKi8KKwkweEJELCAweDQzLCAweEJELCAweDQ4LCAweEJELCAweDQ5LCAweEU2LCAweEI0LCAvKiAweDIwLTB4MjMgKi8KKwkweEJELCAweDQ2LCAweEU2LCAweEFGLCAweEJELCAweDQ3LCAweEJBLCAweEM0LCAvKiAweDI0LTB4MjcgKi8KKwkweEU2LCAweEI2LCAweEJELCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweEVBLCAweDZDLCAweDAwLCAweDAwLCAweEVBLCAweDZCLCAvKiAweDJDLTB4MkYgKi8KKwkweEVBLCAweDczLCAweEVBLCAweDZELCAweEVBLCAweDcyLCAweEVBLCAweDZGLCAvKiAweDMwLTB4MzMgKi8KKwkweEJGLCAweDYwLCAweEVBLCAweDcxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweEJGLCAweDYxLCAweDAwLCAweDAwLCAweEJGLCAweDYyLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweEVBLCAweDcwLCAweEVBLCAweDZFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMwLCAweEY4LCAweEVELCAweDc0LCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMwLCAweEY3LCAweEVELCAweDc3LCAvKiAweDQ0LTB4NDcgKi8KKwkweEVELCAweDc1LCAweEVELCAweDc2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweEMwLCAweEY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweEYwLCAweDRELCAweDAwLCAweDAwLCAweEMyLCAweEExLCAweEYwLCAweDRFLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMyLCAweDdELCAweEYwLCAweDRGLCAvKiAweDU0LTB4NTcgKi8KKwkweEMyLCAweDdFLCAweEYwLCAweDRDLCAweEYwLCAweDUwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweEYwLCAweDRBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMzLCAweEE3LCAvKiAweDVDLTB4NUYgKi8KKwkweEYyLCAweDc4LCAweEMzLCAweEE4LCAweEM0LCAweDZGLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweEYwLCAweDRCLCAweEM0LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweEM0LCAweEVFLCAweEY1LCAweERGLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweEM1LCAweDdFLCAweEY2LCAweEY0LCAweEM1LCAweDdELCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweEY3LCAweEVBLCAweEM1LCAweEY1LCAweEM1LCAweEY2LCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweEY5LCAweENDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweEFDLCAweEQxLCAweENGLCAweERFLCAweDAwLCAweDAwLCAweEI1LCAweDZFLCAvKiAweDc4LTB4N0IgKi8KKwkweEI1LCAweDZGLCAweEE1LCAweEQ1LCAweEE2LCAweENBLCAweENBLCAweDQ3LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweENCLCAweDcxLCAweEE4LCAweDZELCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweEFBLCAweEJBLCAweDAwLCAweDAwLCAweEFDLCAweEQyLCAweEFDLCAweEQzLCAvKiAweDg0LTB4ODcgKi8KKwkweEFDLCAweEQ0LCAweEQ2LCAweEE2LCAweEQyLCAweENCLCAweEFGLCAweDZGLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIyLCAweEFFLCAweEQ2LCAweEE1LCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERBLCAweEI4LCAweEI1LCAweDcxLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweERBLCAweEI3LCAweEI1LCAweDcwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweERFLCAweEQ1LCAweEJELCAweDRBLCAweEU2LCAweEJCLCAvKiAweDk4LTB4OUIgKi8KKwkweEU2LCAweEI4LCAweEU2LCAweEI5LCAweEU2LCAweEJBLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweEVELCAweDc4LCAweDAwLCAweDAwLCAweEYwLCAweDUxLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY0LCAweDcxLCAweEY0LCAweDcwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweEY2LCAweEY1LCAweEE1LCAweEQ2LCAweENELCAweDc1LCAvKiAweEFDLTB4QUYgKi8KKwkweEFGLCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweEI1LCAweDcyLCAweERFLCAweEQ2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweEUyLCAweEUxLCAweDAwLCAweDAwLCAweEJELCAweDRCLCAweEVBLCAweDc0LCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweEYwLCAweDUyLCAweEY0LCAweDcyLCAweEE1LCAweEQ3LCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEFBLCAweEJCLCAweEFDLCAweEQ3LCAvKiAweEMwLTB4QzMgKi8KKwkweENGLCAweERGLCAweEFDLCAweEQ4LCAweEFDLCAweEQ2LCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweEFDLCAweEQ1LCAweEQyLCAweENDLCAweEFGLCAweDcxLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweEFGLCAweDcyLCAweEFGLCAweDczLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIyLCAweEIwLCAweEQ2LCAweEE3LCAvKiAweEQwLTB4RDMgKi8KKwkweEIyLCAweEFGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERBLCAweEI5LCAweEIyLCAweEIxLCAvKiAweEQ4LTB4REIgKi8KKwkweEI1LCAweDczLCAweERFLCAweEQ3LCAweEI3LCAweEY4LCAweEI3LCAweEY5LCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweEJBLCAweEM5LCAweDAwLCAweDAwLCAweEJBLCAweENBLCAvKiAweEUwLTB4RTMgKi8KKwkweEJELCAweDRDLCAweEJGLCAweDY0LCAweEVBLCAweDc1LCAweEJGLCAweDYzLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweEVELCAweDc5LCAweEMwLCAweEZBLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweEYwLCAweDUzLCAweEY0LCAweDczLCAweEE1LCAweEQ4LCAweEE4LCAweDZFLCAvKiAweEVDLTB4RUYgKi8KKwkweENELCAweDc4LCAweENELCAweDc3LCAweEFBLCAweEJDLCAweENELCAweDc2LCAvKiAweEYwLTB4RjMgKi8KKwkweEFBLCAweEJELCAweENELCAweDc5LCAweDAwLCAweDAwLCAweENGLCAweEU1LCAvKiAweEY0LTB4RjcgKi8KKwkweEFDLCAweERCLCAweEFDLCAweERBLCAweENGLCAweEU3LCAweENGLCAweEU2LCAvKiAweEY4LTB4RkIgKi8KKwkweEFDLCAweERGLCAweDAwLCAweDAwLCAweEFDLCAweERFLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183N1s1MTJdID0geworCTB4MDAsIDB4MDAsIDB4QUMsIDB4RDksIDB4MDAsIDB4MDAsIDB4Q0YsIDB4RTEsIC8qIDB4MDAtMHgwMyAqLworCTB4Q0YsIDB4RTIsIDB4Q0YsIDB4RTMsIDB4MDAsIDB4MDAsIDB4QUMsIDB4RTAsIC8qIDB4MDQtMHgwNyAqLworCTB4Q0YsIDB4RTAsIDB4QUMsIDB4REMsIDB4Q0YsIDB4RTQsIDB4QUMsIDB4REQsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4RDIsIDB4Q0YsIDB4RDIsIDB4RDMsIDB4RDIsIDB4RDEsIDB4RDIsIDB4RDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4RDIsIDB4RDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4RDIsIDB4RDUsIDB4RDIsIDB4RDYsIDB4RDIsIDB4Q0UsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4RDIsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4QUYsIDB4NzUsIC8qIDB4MUMtMHgxRiAqLworCTB4QUYsIDB4NzYsIDB4MDAsIDB4MDAsIDB4RDIsIDB4RDcsIDB4RDIsIDB4RDIsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4RDYsIDB4QjAsIDB4MDAsIDB4MDAsIDB4RDIsIDB4RDgsIC8qIDB4MjQtMHgyNyAqLworCTB4QUYsIDB4NzcsIDB4QUYsIDB4NzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4RDYsIDB4QUEsIDB4MDAsIDB4MDAsIDB4RDYsIDB4QTksIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4RDYsIDB4QUIsIDB4RDYsIDB4QUMsIDB4RDYsIDB4QUUsIC8qIDB4MzAtMHgzMyAqLworCTB4RDYsIDB4QUQsIDB4RDYsIDB4QjIsIDB4QjIsIDB4QjUsIDB4QjIsIDB4QjIsIC8qIDB4MzQtMHgzNyAqLworCTB4QjIsIDB4QjYsIDB4RDYsIDB4QTgsIDB4QjIsIDB4QjcsIDB4RDYsIDB4QjEsIC8qIDB4MzgtMHgzQiAqLworCTB4QjIsIDB4QjQsIDB4RDYsIDB4QUYsIDB4QjIsIDB4QjMsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4REEsIDB4QkMsIDB4REEsIDB4QkUsIDB4REEsIDB4QkEsIDB4REEsIDB4QkIsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REEsIDB4QkYsIDB4REEsIDB4QzEsIC8qIDB4NDgtMHg0QiAqLworCTB4REEsIDB4QzIsIDB4REEsIDB4QkQsIDB4REEsIDB4QzAsIDB4QjUsIDB4NzQsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REUsIDB4REIsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4REUsIDB4RTAsIDB4REUsIDB4RDgsIDB4REUsIDB4REMsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4REUsIDB4RTEsIDB4REUsIDB4REQsIDB4QjcsIDB4RkEsIC8qIDB4NTgtMHg1QiAqLworCTB4QjgsIDB4NDMsIDB4MDAsIDB4MDAsIDB4QjcsIDB4RkQsIDB4REUsIDB4RDksIC8qIDB4NUMtMHg1RiAqLworCTB4REUsIDB4REEsIDB4QkEsIDB4Q0UsIDB4QjgsIDB4NDYsIDB4QjcsIDB4RkUsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4QjgsIDB4NDQsIDB4QjcsIDB4RkMsIDB4REUsIDB4REYsIC8qIDB4NjQtMHg2NyAqLworCTB4QjgsIDB4NDUsIDB4REUsIDB4REUsIDB4QjgsIDB4NDEsIDB4QjcsIDB4RkIsIC8qIDB4NjgtMHg2QiAqLworCTB4QjgsIDB4NDIsIDB4REUsIDB4RTIsIDB4RTIsIDB4RTYsIDB4RTIsIDB4RTgsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4QjgsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4RTIsIDB4RTMsIDB4QkEsIDB4Q0MsIDB4RTIsIDB4RTksIDB4QkEsIDB4Q0QsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RTIsIDB4RTcsIDB4RTIsIDB4RTIsIDB4RTIsIDB4RTUsIDB4RTIsIDB4RUEsIC8qIDB4ODAtMHg4MyAqLworCTB4QkEsIDB4Q0IsIDB4RTIsIDB4RTQsIDB4MDAsIDB4MDAsIDB4QkQsIDB4NEUsIC8qIDB4ODQtMHg4NyAqLworCTB4RTYsIDB4QkYsIDB4RTYsIDB4QkUsIDB4MDAsIDB4MDAsIDB4QkQsIDB4NTEsIC8qIDB4ODgtMHg4QiAqLworCTB4QkQsIDB4NEYsIDB4RTYsIDB4QkMsIDB4QkQsIDB4NEQsIDB4RTYsIDB4QkQsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4QkQsIDB4NTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4RUEsIDB4N0QsIDB4MDAsIDB4MDAsIDB4RUEsIDB4QTEsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4RUEsIDB4N0UsIDB4RUEsIDB4NzYsIDB4RUEsIDB4N0EsIC8qIDB4OTgtMHg5QiAqLworCTB4RUEsIDB4NzksIDB4RUEsIDB4NzcsIDB4QkYsIDB4NjYsIDB4QkYsIDB4NjcsIC8qIDB4OUMtMHg5RiAqLworCTB4QkYsIDB4NjUsIDB4RUEsIDB4NzgsIDB4RUEsIDB4N0IsIDB4RUEsIDB4N0MsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4QkYsIDB4NjgsIDB4MDAsIDB4MDAsIDB4QzEsIDB4NDAsIC8qIDB4QTQtMHhBNyAqLworCTB4RUQsIDB4QTMsIDB4MDAsIDB4MDAsIDB4QzAsIDB4RkMsIDB4RUQsIDB4N0IsIC8qIDB4QTgtMHhBQiAqLworCTB4QzAsIDB4RkUsIDB4QzEsIDB4NDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4QzAsIDB4RkQsIDB4RUQsIDB4QTIsIDB4RUQsIDB4N0MsIDB4QzAsIDB4RkIsIC8qIDB4QjAtMHhCMyAqLworCTB4RUQsIDB4QTEsIDB4RUQsIDB4N0EsIDB4RUQsIDB4N0UsIDB4RUQsIDB4N0QsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjAsIDB4NTUsIDB4QzIsIDB4QTQsIC8qIDB4QjgtMHhCQiAqLworCTB4QzIsIDB4QTUsIDB4QzIsIDB4QTIsIDB4MDAsIDB4MDAsIDB4QzIsIDB4QTMsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjAsIDB4NTQsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4RjIsIDB4N0IsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzMsIDB4QTksIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4RjIsIDB4NzksIDB4RjIsIDB4N0EsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4RjQsIDB4NzQsIDB4RjQsIDB4NzcsIDB4RjQsIDB4NzUsIDB4RjQsIDB4NzYsIC8qIDB4Q0MtMHhDRiAqLworCTB4RjUsIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzQsIDB4RUYsIC8qIDB4RDAtMHhEMyAqLworCTB4RjcsIDB4RUIsIDB4RjgsIDB4QjQsIDB4MDAsIDB4MDAsIDB4QzUsIDB4RjcsIC8qIDB4RDQtMHhENyAqLworCTB4RjgsIDB4RjgsIDB4RjgsIDB4RjksIDB4QzYsIDB4NjYsIDB4QTUsIDB4RDksIC8qIDB4RDgtMHhEQiAqLworCTB4QUMsIDB4RTEsIDB4MDAsIDB4MDAsIDB4REEsIDB4QzMsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4REUsIDB4RTMsIDB4MDAsIDB4MDAsIDB4QTUsIDB4REEsIDB4QTgsIDB4NkYsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4QUEsIDB4QkUsIDB4MDAsIDB4MDAsIDB4Q0YsIDB4RTgsIC8qIDB4RTQtMHhFNyAqLworCTB4Q0YsIDB4RTksIDB4QUYsIDB4NzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4REEsIDB4QzQsIDB4QjUsIDB4NzUsIDB4QjgsIDB4NDcsIDB4QzEsIDB4NDIsIC8qIDB4RUMtMHhFRiAqLworCTB4RUQsIDB4QTQsIDB4RjIsIDB4N0MsIDB4RjQsIDB4NzgsIDB4QTUsIDB4REIsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0QsIDB4QTEsIC8qIDB4RjQtMHhGNyAqLworCTB4Q0QsIDB4N0EsIDB4Q0QsIDB4N0MsIDB4Q0QsIDB4N0UsIDB4Q0QsIDB4N0QsIC8qIDB4RjgtMHhGQiAqLworCTB4Q0QsIDB4N0IsIDB4QUEsIDB4QkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzc4WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBQywgMHhFMiwgMHhDRiwgMHhGMiwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHhDRiwgMHhFRCwgMHhDRiwgMHhFQSwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHhDRiwgMHhGMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHhBQywgMHhFNCwgMHhBQywgMHhFNSwgMHhDRiwgMHhGMCwgMHhDRiwgMHhFRiwgLyogMHgwQy0weDBGICovCisJMHhDRiwgMHhFRSwgMHhDRiwgMHhFQiwgMHhDRiwgMHhFQywgMHhDRiwgMHhGMywgLyogMHgxMC0weDEzICovCisJMHhBQywgMHhFMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHhBRiwgMHg3QywgMHgwMCwgMHgwMCwgMHhBRiwgMHhBNCwgLyogMHgxQy0weDFGICovCisJMHhBRiwgMHhBMywgMHhEMiwgMHhFMSwgMHhEMiwgMHhEQiwgMHhEMiwgMHhEOSwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhBRiwgMHhBMSwgMHhENiwgMHhCOSwgMHhBRiwgMHg3QSwgLyogMHgyNC0weDI3ICovCisJMHhEMiwgMHhERSwgMHhEMiwgMHhFMiwgMHhEMiwgMHhFNCwgMHhEMiwgMHhFMCwgLyogMHgyOC0weDJCICovCisJMHhEMiwgMHhEQSwgMHhBRiwgMHhBMiwgMHhEMiwgMHhERiwgMHhEMiwgMHhERCwgLyogMHgyQy0weDJGICovCisJMHhBRiwgMHg3OSwgMHhEMiwgMHhFNSwgMHhBRiwgMHhBNSwgMHhEMiwgMHhFMywgLyogMHgzMC0weDMzICovCisJMHhBRiwgMHg3RCwgMHhEMiwgMHhEQywgMHgwMCwgMHgwMCwgMHhBRiwgMHg3RSwgLyogMHgzNC0weDM3ICovCisJMHhBRiwgMHg3QiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMiwgMHhCOSwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHhENiwgMHhCQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHhENiwgMHhCMywgMHhENiwgMHhCNSwgMHhENiwgMHhCNywgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHhENiwgMHhCOCwgMHhENiwgMHhCNiwgMHhCMiwgMHhCQSwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHhENiwgMHhCQiwgMHgwMCwgMHgwMCwgMHhENiwgMHhCNCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHhEQSwgMHhDOCwgMHhCNSwgMHg3NiwgMHhEQSwgMHhEMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHhEQSwgMHhDNSwgMHgwMCwgMHgwMCwgMHhEQSwgMHhEMSwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHhEQSwgMHhDNiwgMHhEQSwgMHhDNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHhEQSwgMHhDRiwgMHhEQSwgMHhDRSwgMHhEQSwgMHhDQiwgMHhCMiwgMHhCOCwgLyogMHg2OC0weDZCICovCisJMHhCNSwgMHg3NywgMHhEQSwgMHhDOSwgMHhEQSwgMHhDQywgMHhCNSwgMHg3OCwgLyogMHg2Qy0weDZGICovCisJMHhEQSwgMHhDRCwgMHhEQSwgMHhDQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHhERSwgMHhFRSwgMHgwMCwgMHgwMCwgMHhERSwgMHhGMiwgLyogMHg3OC0weDdCICovCisJMHhCOCwgMHg0RSwgMHgwMCwgMHgwMCwgMHhFMiwgMHhGMCwgMHhCOCwgMHg1MSwgLyogMHg3Qy0weDdGICovCisJCisJMHhERSwgMHhGMCwgMHhGOSwgMHhENiwgMHgwMCwgMHgwMCwgMHhERSwgMHhFRCwgLyogMHg4MC0weDgzICovCisJMHhERSwgMHhFOCwgMHhERSwgMHhFQSwgMHhERSwgMHhFQiwgMHhERSwgMHhFNCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHhCOCwgMHg0RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHhCOCwgMHg0QywgMHgwMCwgMHgwMCwgMHhCOCwgMHg0OCwgMHhERSwgMHhFNywgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHhCOCwgMHg0RiwgMHgwMCwgMHgwMCwgMHhCOCwgMHg1MCwgLyogMHg5MC0weDkzICovCisJMHhERSwgMHhFNiwgMHhERSwgMHhFOSwgMHhERSwgMHhGMSwgMHhCOCwgMHg0QSwgLyogMHg5NC0weDk3ICovCisJMHhCOCwgMHg0QiwgMHhERSwgMHhFRiwgMHhERSwgMHhFNSwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMiwgMHhGMiwgMHhCQSwgMHhEMCwgLyogMHg5Qy0weDlGICovCisJMHhFMiwgMHhGNCwgMHhERSwgMHhFQywgMHhFMiwgMHhGNiwgMHhCQSwgMHhENCwgLyogMHhBMC0weEEzICovCisJMHhFMiwgMHhGNywgMHhFMiwgMHhGMywgMHgwMCwgMHgwMCwgMHhCQSwgMHhEMSwgLyogMHhBNC0weEE3ICovCisJMHhFMiwgMHhFRiwgMHhCQSwgMHhEMywgMHhFMiwgMHhFQywgMHhFMiwgMHhGMSwgLyogMHhBOC0weEFCICovCisJMHhFMiwgMHhGNSwgMHhFMiwgMHhFRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHhCOCwgMHg0OSwgMHgwMCwgMHgwMCwgMHhFMiwgMHhFQiwgMHhCQSwgMHhEMiwgLyogMHhCMC0weEIzICovCisJMHhFMiwgMHhFRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCRCwgMHg1NCwgMHhFNiwgMHhDMSwgLyogMHhCOC0weEJCICovCisJMHhCRCwgMHg1OCwgMHgwMCwgMHgwMCwgMHhCRCwgMHg1NiwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHhCQSwgMHhDRiwgMHgwMCwgMHgwMCwgMHhFNiwgMHhDOCwgLyogMHhDMC0weEMzICovCisJMHhFNiwgMHhDOSwgMHhCRCwgMHg1MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHhFNiwgMHhDNywgMHhFNiwgMHhDQSwgMHhCRCwgMHg1NSwgMHhCRCwgMHg1MiwgLyogMHhDOC0weENCICovCisJMHhFNiwgMHhDMywgMHhFNiwgMHhDMCwgMHhFNiwgMHhDNSwgMHhFNiwgMHhDMiwgLyogMHhDQy0weENGICovCisJMHhCRCwgMHg1OSwgMHhFNiwgMHhDNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHhFNiwgMHhDNiwgMHhCRCwgMHg1NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCRiwgMHg2QSwgMHhFQSwgMHhBOCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHhFQSwgMHhBMiwgMHhFQSwgMHhBNiwgMHhFQSwgMHhBQywgLyogMHhEQy0weERGICovCisJMHhFQSwgMHhBRCwgMHhFQSwgMHhBOSwgMHhFQSwgMHhBQSwgMHhFQSwgMHhBNywgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHhFQSwgMHhBNCwgMHgwMCwgMHgwMCwgMHhCRiwgMHg2QywgLyogMHhFNC0weEU3ICovCisJMHhCRiwgMHg2OSwgMHhFQSwgMHhBMywgMHhFQSwgMHhBNSwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHhCRiwgMHg2QiwgMHhFQSwgMHhBQiwgMHgwMCwgMHgwMCwgMHhDMSwgMHg0NiwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRCwgMHhBQSwgMHhFRCwgMHhBNSwgLyogMHhGMC0weEYzICovCisJMHhDMSwgMHg0NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMSwgMHg0MywgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHhFRCwgMHhBQywgMHhDMSwgMHg0NCwgMHhFRCwgMHhBOCwgLyogMHhGOC0weEZCICovCisJMHhFRCwgMHhBOSwgMHhFRCwgMHhBNiwgMHhFRCwgMHhBRCwgMHhGMCwgMHg1NiwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfNzlbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweEMxLCAweDQ3LCAweEVELCAweEE3LCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweEVELCAweEFFLCAweEVELCAweEFCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweEYwLCAweDVBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweEYwLCAweDU3LCAweDAwLCAweDAwLCAweEMyLCAweEE2LCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweEYwLCAweDVCLCAweEYwLCAweDVELCAweEYwLCAweDVDLCAweEYwLCAweDU4LCAvKiAweDEwLTB4MTMgKi8KKwkweEYwLCAweDU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYyLCAweEEzLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweEMzLCAweEFBLCAweDAwLCAweDAwLCAweEYyLCAweDdFLCAvKiAweDE4LTB4MUIgKi8KKwkweEYyLCAweEEyLCAweEYyLCAweDdELCAweEYyLCAweEE0LCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweEYyLCAweEExLCAweDAwLCAweDAwLCAweEY0LCAweDdBLCAvKiAweDIwLTB4MjMgKi8KKwkweEY0LCAweDdELCAweEY0LCAweDc5LCAweEM0LCAweDcxLCAweEY0LCAweDdCLCAvKiAweDI0LTB4MjcgKi8KKwkweEY0LCAweDdDLCAweEY0LCAweDdFLCAweEM0LCAweDcyLCAweEM0LCAweDc0LCAvKiAweDI4LTB4MkIgKi8KKwkweEM0LCAweDczLCAweEY1LCAweEUxLCAweDAwLCAweDAwLCAweEY1LCAweEUzLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweEY1LCAweEUyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweEY2LCAweEY2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweEY4LCAweEI1LCAweEY4LCAweEZBLCAweEE1LCAweERDLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweENCLCAweDcyLCAweEFBLCAweEMwLCAweENELCAweEEzLCAvKiAweDNDLTB4M0YgKi8KKwkweEFBLCAweEMxLCAweEFBLCAweEMyLCAweENELCAweEEyLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweENGLCAweEY4LCAweENGLCAweEY3LCAweEFDLCAweEU2LCAweEFDLCAweEU5LCAvKiAweDQ0LTB4NDcgKi8KKwkweEFDLCAweEU4LCAweEFDLCAweEU3LCAweENGLCAweEY0LCAweENGLCAweEY2LCAvKiAweDQ4LTB4NEIgKi8KKwkweENGLCAweEY1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQyLCAweEU4LCAvKiAweDRDLTB4NEYgKi8KKwkweEFGLCAweEE3LCAweEQyLCAweEVDLCAweEQyLCAweEVCLCAweEQyLCAweEVBLCAvKiAweDUwLTB4NTMgKi8KKwkweEQyLCAweEU2LCAweEFGLCAweEE2LCAweEFGLCAweEFBLCAweEFGLCAweEFELCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEFGLCAweEFFLCAweEQyLCAweEU3LCAvKiAweDU4LTB4NUIgKi8KKwkweEQyLCAweEU5LCAweEFGLCAweEFDLCAweEFGLCAweEFCLCAweEFGLCAweEE5LCAvKiAweDVDLTB4NUYgKi8KKwkweEFGLCAweEE4LCAweEQ2LCAweEMyLCAweDAwLCAweDAwLCAweEQ2LCAweEMwLCAvKiAweDYwLTB4NjMgKi8KKwkweEQ2LCAweEJDLCAweEIyLCAweEJCLCAweDAwLCAweDAwLCAweEQ2LCAweEJELCAvKiAweDY0LTB4NjcgKi8KKwkweEIyLCAweEJDLCAweEQ2LCAweEJFLCAweEQ2LCAweEJGLCAweEQ2LCAweEMxLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweEIyLCAweEJELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweERBLCAweEQ1LCAweDAwLCAweDAwLCAweERBLCAweEQ0LCAweERBLCAweEQzLCAvKiAweDcwLTB4NzMgKi8KKwkweERBLCAweEQyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweERFLCAweEY2LCAweEI4LCAweDUyLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweERFLCAweEYzLCAweERFLCAweEY1LCAweDAwLCAweDAwLCAweEI4LCAweDUzLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweEI4LCAweDU0LCAweERFLCAweEY0LCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweEUzLCAweDQxLCAweDAwLCAweDAwLCAweEUyLCAweEY5LCAweEUyLCAweEZBLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweEJBLCAweEQ3LCAweEJBLCAweEQ1LCAweEJBLCAweEQ2LCAvKiAweDhDLTB4OEYgKi8KKwkweEUzLCAweDQzLCAweDAwLCAweDAwLCAweEUzLCAweDQyLCAweEUyLCAweEZFLCAvKiAweDkwLTB4OTMgKi8KKwkweEUyLCAweEZELCAweEUyLCAweEZDLCAweEUyLCAweEZCLCAweEUzLCAweDQwLCAvKiAweDk0LTB4OTcgKi8KKwkweEUyLCAweEY4LCAweDAwLCAweDAwLCAweEU2LCAweENCLCAweEU2LCAweEQwLCAvKiAweDk4LTB4OUIgKi8KKwkweEU2LCAweENFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweEU2LCAweENELCAweEU2LCAweENDLCAweEU2LCAweENGLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweEVBLCAweEFFLCAweDAwLCAweDAwLCAweEJGLCAweDZELCAweEMxLCAweDQ4LCAvKiAweEE0LTB4QTcgKi8KKwkweEVELCAweEIwLCAweDAwLCAweDAwLCAweEMxLCAweDQ5LCAweEVELCAweEFGLCAvKiAweEE4LTB4QUIgKi8KKwkweEYwLCAweDVGLCAweEYwLCAweDVFLCAweEMyLCAweEE3LCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweEYyLCAweEE1LCAweEMzLCAweEFCLCAweEY0LCAweEExLCAweEM1LCAweEExLCAvKiAweEIwLTB4QjMgKi8KKwkweEY2LCAweEY3LCAweDAwLCAweDAwLCAweEY4LCAweEI3LCAweEY4LCAweEI2LCAvKiAweEI0LTB4QjcgKi8KKwkweEM5LCAweEE4LCAweEFDLCAweEVBLCAweEFDLCAweEVCLCAweEQ2LCAweEMzLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweEI4LCAweDU2LCAweEE1LCAweERELCAweEE4LCAweDcyLCAvKiAweEJDLTB4QkYgKi8KKwkweEE4LCAweDcxLCAweEE4LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweENELCAweEE0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweEFBLCAweEM0LCAweEFBLCAweEMzLCAweDAwLCAweDAwLCAweEFDLCAweEVFLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweENGLCAweEZBLCAweENGLCAweEZELCAweENGLCAweEZCLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweEFDLCAweEVDLCAweEFDLCAweEVELCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweENGLCAweEY5LCAweENGLCAweEZDLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweEFGLCAweEI1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweEQyLCAweEYzLCAweEQyLCAweEY1LCAweEQyLCAweEY0LCAweEFGLCAweEIyLCAvKiAweERDLTB4REYgKi8KKwkweEQyLCAweEVGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEFGLCAweEIwLCAvKiAweEUwLTB4RTMgKi8KKwkweEFGLCAweEFGLCAweDAwLCAweDAwLCAweEFGLCAweEIzLCAweEFGLCAweEIxLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweEFGLCAweEI0LCAweEQyLCAweEYyLCAweEQyLCAweEVELCAvKiAweEU4LTB4RUIgKi8KKwkweEQyLCAweEVFLCAweEQyLCAweEYxLCAweEQyLCAweEYwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ2LCAweEM2LCAweEQ2LCAweEM3LCAvKiAweEY0LTB4RjcgKi8KKwkweEQ2LCAweEM1LCAweDAwLCAweDAwLCAweEQ2LCAweEM0LCAweEIyLCAweEJFLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183QVs1MTJdID0geworCTB4QjUsIDB4N0QsIDB4MDAsIDB4MDAsIDB4REEsIDB4RDYsIDB4REEsIDB4RDgsIC8qIDB4MDAtMHgwMyAqLworCTB4REEsIDB4REEsIDB4QjUsIDB4N0MsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4QjUsIDB4N0EsIDB4MDAsIDB4MDAsIDB4REEsIDB4RDcsIDB4QjUsIDB4N0IsIC8qIDB4MDgtMHgwQiAqLworCTB4REEsIDB4RDksIDB4QjUsIDB4NzksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4REYsIDB4NDEsIDB4REUsIDB4RjcsIDB4REUsIDB4RkEsIDB4REUsIDB4RkUsIC8qIDB4MTAtMHgxMyAqLworCTB4QjgsIDB4NUEsIDB4REUsIDB4RkMsIDB4MDAsIDB4MDAsIDB4REUsIDB4RkIsIC8qIDB4MTQtMHgxNyAqLworCTB4REUsIDB4RjgsIDB4REUsIDB4RjksIDB4QjgsIDB4NTgsIDB4REYsIDB4NDAsIC8qIDB4MTgtMHgxQiAqLworCTB4QjgsIDB4NTcsIDB4MDAsIDB4MDAsIDB4QjgsIDB4NUMsIDB4QjgsIDB4NUIsIC8qIDB4MUMtMHgxRiAqLworCTB4QjgsIDB4NTksIDB4MDAsIDB4MDAsIDB4REUsIDB4RkQsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4NDksIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4RTMsIDB4NDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4NDQsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkEsIDB4RDgsIDB4RTMsIDB4NDcsIC8qIDB4MkMtMHgyRiAqLworCTB4RTMsIDB4NDYsIDB4QkEsIDB4RDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkQsIDB4NUUsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4RTYsIDB4RDIsIDB4MDAsIDB4MDAsIDB4QkQsIDB4NUYsIC8qIDB4MzgtMHgzQiAqLworCTB4QkQsIDB4NUIsIDB4QkQsIDB4NUQsIDB4MDAsIDB4MDAsIDB4QkQsIDB4NUEsIC8qIDB4M0MtMHgzRiAqLworCTB4QkQsIDB4NUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4RUEsIDB4QUYsIDB4MDAsIDB4MDAsIDB4QkYsIDB4NzAsIDB4RUEsIDB4QjEsIC8qIDB4NDQtMHg0NyAqLworCTB4RUEsIDB4QjAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4NDUsIDB4QkYsIDB4NzIsIC8qIDB4NDgtMHg0QiAqLworCTB4QkYsIDB4NzEsIDB4QkYsIDB4NkUsIDB4QkYsIDB4NkYsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4RUQsIDB4QjUsIDB4MDAsIDB4MDAsIDB4RUQsIDB4QjMsIDB4QzEsIDB4NEEsIC8qIDB4NTQtMHg1NyAqLworCTB4RUQsIDB4QjQsIDB4MDAsIDB4MDAsIDB4RUQsIDB4QjYsIDB4RUQsIDB4QjIsIC8qIDB4NTgtMHg1QiAqLworCTB4RUQsIDB4QjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjAsIDB4NjAsIC8qIDB4NUMtMHg1RiAqLworCTB4QzIsIDB4QUEsIDB4QzIsIDB4QTgsIDB4QzIsIDB4QTksIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjIsIDB4QTYsIC8qIDB4NjQtMHg2NyAqLworCTB4RjIsIDB4QTcsIDB4QzMsIDB4QUQsIDB4MDAsIDB4MDAsIDB4QzMsIDB4QUMsIC8qIDB4NjgtMHg2QiAqLworCTB4RjQsIDB4QTMsIDB4RjQsIDB4QTQsIDB4RjQsIDB4QTIsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4RjYsIDB4RjgsIDB4RjYsIDB4RjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4QTUsIDB4REUsIDB4Q0EsIDB4NDgsIDB4QTgsIDB4NzMsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4Q0QsIDB4QTUsIDB4QUEsIDB4QzYsIDB4QUEsIDB4QzUsIDB4Q0QsIDB4QTYsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDAsIDB4NDAsIDB4QUMsIDB4RUYsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4Q0YsIDB4RkUsIDB4QUMsIDB4RjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4QUYsIDB4QjYsIDB4RDIsIDB4RjgsIDB4RDIsIDB4RjYsIDB4RDIsIDB4RkMsIC8qIDB4ODQtMHg4NyAqLworCTB4QUYsIDB4QjcsIDB4RDIsIDB4RjcsIDB4RDIsIDB4RkIsIDB4RDIsIDB4RjksIC8qIDB4ODgtMHg4QiAqLworCTB4RDIsIDB4RkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDYsIDB4QzgsIC8qIDB4OEMtMHg4RiAqLworCTB4RDYsIDB4Q0EsIDB4MDAsIDB4MDAsIDB4QjIsIDB4QkYsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4RDYsIDB4QzksIDB4QjIsIDB4QzAsIDB4QjUsIDB4QTIsIDB4QjUsIDB4QTEsIC8qIDB4OTQtMHg5NyAqLworCTB4QjUsIDB4N0UsIDB4REEsIDB4REIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REYsIDB4NDQsIDB4QjgsIDB4NUQsIC8qIDB4OUMtMHg5RiAqLworCTB4QjgsIDB4NUUsIDB4MDAsIDB4MDAsIDB4REYsIDB4NDMsIDB4REYsIDB4NDIsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4RTMsIDB4NEEsIDB4QkEsIDB4REIsIDB4QkEsIDB4REEsIDB4RTMsIDB4NEIsIC8qIDB4QTgtMHhBQiAqLworCTB4RTMsIDB4NEMsIDB4MDAsIDB4MDAsIDB4QkQsIDB4NjEsIDB4QkQsIDB4NjAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4RUEsIDB4QjUsIDB4RTYsIDB4RDMsIDB4RTYsIDB4RDUsIC8qIDB4QjAtMHhCMyAqLworCTB4RTYsIDB4RDQsIDB4RUEsIDB4QjQsIDB4RUEsIDB4QjIsIDB4RUEsIDB4QjYsIC8qIDB4QjQtMHhCNyAqLworCTB4RUEsIDB4QjMsIDB4MDAsIDB4MDAsIDB4QkYsIDB4NzMsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUQsIDB4QjcsIDB4QzEsIDB4NEIsIC8qIDB4QkMtMHhCRiAqLworCTB4RUQsIDB4QjgsIDB4RUQsIDB4QjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4QzIsIDB4QUIsIDB4QzIsIDB4QUMsIDB4MDAsIDB4MDAsIDB4QzQsIDB4NzUsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzUsIDB4RDEsIDB4QTUsIDB4REYsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4RDAsIDB4NDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4RDIsIDB4RkQsIDB4QUYsIDB4QjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjMsIDB4QkEsIC8qIDB4REMtMHhERiAqLworCTB4QjMsIDB4QjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjUsIDB4QTQsIC8qIDB4RTAtMHhFMyAqLworCTB4REEsIDB4REQsIDB4QjUsIDB4QTMsIDB4REEsIDB4REMsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REYsIDB4NDUsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4QkEsIDB4REMsIDB4RTMsIDB4NEQsIDB4QkEsIDB4REQsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzQsIDB4NzYsIDB4RjQsIDB4QTUsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4QTYsIDB4Q0IsIDB4QUEsIDB4QzcsIDB4Q0QsIDB4QTcsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4QUMsIDB4RjIsIDB4MDAsIDB4MDAsIDB4QUMsIDB4RjEsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzdCWzUxMl0gPSB7CisJMHhEMCwgMHg0MiwgMHhEMCwgMHg0MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHhEMywgMHg0MCwgMHhEMywgMHg0MiwgMHhBRiwgMHhCOSwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHhEMywgMHg0NCwgMHhEMywgMHg0NywgMHhEMywgMHg0NSwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMywgMHg0NiwgMHhEMywgMHg0MywgLyogMHgwQy0weDBGICovCisJMHhEMiwgMHhGRSwgMHhBRiwgMHhCQSwgMHhEMywgMHg0OCwgMHhEMywgMHg0MSwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHhENiwgMHhEMywgMHhCMiwgMHhDNiwgMHhENiwgMHhEQywgMHhCMiwgMHhDMywgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHhENiwgMHhENSwgMHhCMiwgMHhDNywgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHhCMiwgMHhDMSwgMHgwMCwgMHgwMCwgMHhENiwgMHhEMCwgMHhENiwgMHhERCwgLyogMHgyMC0weDIzICovCisJMHhENiwgMHhEMSwgMHhENiwgMHhDRSwgMHhCMiwgMHhDNSwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHhCMiwgMHhDMiwgMHgwMCwgMHgwMCwgMHhENiwgMHhENCwgMHhENiwgMHhENywgLyogMHgyOC0weDJCICovCisJMHhCMiwgMHhDNCwgMHhENiwgMHhEOCwgMHhCMiwgMHhDOCwgMHhENiwgMHhEOSwgLyogMHgyQy0weDJGICovCisJMHhENiwgMHhDRiwgMHhENiwgMHhENiwgMHhENiwgMHhEQSwgMHhENiwgMHhEMiwgLyogMHgzMC0weDMzICovCisJMHhENiwgMHhDRCwgMHhENiwgMHhDQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHhENiwgMHhEQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQSwgMHhERiwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHhEQSwgMHhFNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHhEQSwgMHhFMCwgMHhEQSwgMHhFNiwgMHhCNSwgMHhBNywgMHhENiwgMHhDQywgLyogMHg0NC0weDQ3ICovCisJMHhEQSwgMHhFMSwgMHhCNSwgMHhBNSwgMHhEQSwgMHhERSwgMHhCNSwgMHhBQywgLyogMHg0OC0weDRCICovCisJMHhEQSwgMHhFMiwgMHhCNSwgMHhBQiwgMHhEQSwgMHhFMywgMHhCNSwgMHhBRCwgLyogMHg0Qy0weDRGICovCisJMHhCNSwgMHhBOCwgMHhCNSwgMHhBRSwgMHhCNSwgMHhBOSwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHhCNSwgMHhBQSwgMHgwMCwgMHgwMCwgMHhCNSwgMHhBNiwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHhEQSwgMHhFNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHhCOCwgMHg2MSwgMHhERiwgMHg1MCwgMHgwMCwgMHgwMCwgMHhERiwgMHg1MywgLyogMHg2MC0weDYzICovCisJMHhERiwgMHg0NywgMHhERiwgMHg0QywgMHhERiwgMHg0NiwgMHhCOCwgMHg2MywgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhERiwgMHg0QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHhERiwgMHg0OCwgMHhCOCwgMHg2MiwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHhERiwgMHg0RiwgMHhERiwgMHg0RSwgMHhERiwgMHg0QiwgMHhERiwgMHg0RCwgLyogMHg3MC0weDczICovCisJMHhERiwgMHg0OSwgMHhCQSwgMHhFMSwgMHhERiwgMHg1MiwgMHhCOCwgMHg1RiwgLyogMHg3NC0weDc3ICovCisJMHhERiwgMHg1MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHg1RCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHhCQSwgMHhFOCwgMHhFMywgMHg1OCwgMHgwMCwgMHgwMCwgMHhCQSwgMHhFNywgLyogMHg4NC0weDg3ICovCisJMHhFMywgMHg0RSwgMHgwMCwgMHgwMCwgMHhFMywgMHg1MCwgMHhCQSwgMHhFMCwgLyogMHg4OC0weDhCICovCisJMHhFMywgMHg1NSwgMHhFMywgMHg1NCwgMHhFMywgMHg1NywgMHhCQSwgMHhFNSwgLyogMHg4Qy0weDhGICovCisJMHhFMywgMHg1MiwgMHhFMywgMHg1MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHhCQSwgMHhFNCwgMHhCQSwgMHhERiwgMHhFMywgMHg1MywgMHhCQSwgMHhFMiwgLyogMHg5NC0weDk3ICovCisJMHhFMywgMHg1OSwgMHhFMywgMHg1QiwgMHgwMCwgMHgwMCwgMHhFMywgMHg1NiwgLyogMHg5OC0weDlCICovCisJMHhFMywgMHg0RiwgMHhCQSwgMHhFMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHhCRCwgMHg2OSwgMHhCQSwgMHhERSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHhFMywgMHg1QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHhFNiwgMHhEOSwgMHhCRCwgMHg2MiwgMHgwMCwgMHgwMCwgMHhFNiwgMHhEQiwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHhCRCwgMHg2MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHhCRCwgMHg2NSwgMHhFNiwgMHhERSwgMHgwMCwgMHgwMCwgMHhFNiwgMHhENiwgLyogMHhCNC0weEI3ICovCisJMHhCQSwgMHhFNiwgMHhFNiwgMHhEQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhEOCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHhCOCwgMHg2MCwgMHhCRCwgMHg2OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHhCRCwgMHg2NCwgMHgwMCwgMHgwMCwgMHhCRCwgMHg2NiwgMHhCRCwgMHg2NywgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHhCRiwgMHg3NiwgMHhFNiwgMHhERCwgMHhFNiwgMHhENywgLyogMHhDOC0weENCICovCisJMHhCRCwgMHg2QSwgMHgwMCwgMHgwMCwgMHhFNiwgMHhEQSwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHhFQSwgMHhDMCwgMHhFQSwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHhFQSwgMHhDNSwgMHhCRiwgMHg3NCwgMHhFQSwgMHhCRCwgMHhCRiwgMHg3OCwgLyogMHhEOC0weERCICovCisJMHhFQSwgMHhDMywgMHhFQSwgMHhCQSwgMHhFQSwgMHhCNywgMHhFQSwgMHhDNiwgLyogMHhEQy0weERGICovCisJMHhDMSwgMHg1MSwgMHhCRiwgMHg3OSwgMHhFQSwgMHhDMiwgMHhFQSwgMHhCOCwgLyogMHhFMC0weEUzICovCisJMHhCRiwgMHg3NywgMHhFQSwgMHhCQywgMHhCRiwgMHg3QiwgMHhFQSwgMHhCOSwgLyogMHhFNC0weEU3ICovCisJMHhFQSwgMHhCRSwgMHhCRiwgMHg3QSwgMHhFQSwgMHhDMSwgMHhFQSwgMHhDNCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHhFRCwgMHhDQiwgMHhFRCwgMHhDQywgMHhFRCwgMHhCQywgMHhFRCwgMHhDMywgLyogMHhGMC0weEYzICovCisJMHhFRCwgMHhDMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMSwgMHg0RiwgLyogMHhGNC0weEY3ICovCisJMHhFRCwgMHhDOCwgMHhFQSwgMHhCRiwgMHgwMCwgMHgwMCwgMHhFRCwgMHhCRiwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHhFRCwgMHhDOSwgMHhDMSwgMHg0RSwgMHhFRCwgMHhCRSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfN0NbNTEyXSA9IHsKKwkweEVELCAweEJELCAweEVELCAweEM3LCAweEVELCAweEM0LCAweEVELCAweEM2LCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweEVELCAweEJBLCAweEVELCAweENBLCAweEMxLCAweDRDLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweEVELCAweEM1LCAweEVELCAweENFLCAweEVELCAweEMyLCAvKiAweDA4LTB4MEIgKi8KKwkweEMxLCAweDUwLCAweEMxLCAweDRELCAweEVELCAweEMwLCAweEVELCAweEJCLCAvKiAweDBDLTB4MEYgKi8KKwkweEVELCAweENELCAweEJGLCAweDc1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweEYwLCAweDYzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweEYwLCAweDYxLCAweEYwLCAweDY3LCAweEMyLCAweEIwLCAweEYwLCAweDY1LCAvKiAweDFDLTB4MUYgKi8KKwkweEYwLCAweDY0LCAweEMyLCAweEIyLCAweEYwLCAweDZBLCAweEMyLCAweEIxLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweEYwLCAweDZCLCAweEYwLCAweDY4LCAweEMyLCAweEFFLCAvKiAweDI0LTB4MjcgKi8KKwkweEYwLCAweDY5LCAweEYwLCAweDYyLCAweEMyLCAweEFGLCAweEMyLCAweEFELCAvKiAweDI4LTB4MkIgKi8KKwkweEYyLCAweEFCLCAweEYwLCAweDY2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweEYwLCAweDZDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYyLCAweEE4LCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMzLCAweEIyLCAvKiAweDM0LTB4MzcgKi8KKwkweEMzLCAweEIwLCAweEYyLCAweEFBLCAweDAwLCAweDAwLCAweEYyLCAweEFDLCAvKiAweDM4LTB4M0IgKi8KKwkweEYyLCAweEE5LCAweEMzLCAweEIxLCAweEMzLCAweEFFLCAweEMzLCAweEFGLCAvKiAweDNDLTB4M0YgKi8KKwkweEMzLCAweEIzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEM0LCAweDc4LCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweEY0LCAweEFBLCAweDAwLCAweDAwLCAweEY0LCAweEE5LCAvKiAweDQ0LTB4NDcgKi8KKwkweEY0LCAweEE3LCAweEY0LCAweEE2LCAweEY0LCAweEE4LCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweEM0LCAweDc3LCAweEM0LCAweDc5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweEM0LCAweEYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY1LCAweEU1LCAvKiAweDUwLTB4NTMgKi8KKwkweEY1LCAweEU0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY2LCAweEZBLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweEY2LCAweEZDLCAweEY2LCAweEZFLCAweEY2LCAweEZELCAvKiAweDU4LTB4NUIgKi8KKwkweEY2LCAweEZCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEM1LCAweEEzLCAvKiAweDVDLTB4NUYgKi8KKwkweEM1LCAweEEyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEM1LCAweEQzLCAvKiAweDYwLTB4NjMgKi8KKwkweEM1LCAweEQyLCAweEM1LCAweEQ0LCAweEY3LCAweEVELCAweEY3LCAweEVDLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweEY4LCAweEZCLCAweEY4LCAweEI4LCAweEY4LCAweEZDLCAvKiAweDY4LTB4NkIgKi8KKwkweEM2LCAweDU4LCAweDAwLCAweDAwLCAweEM2LCAweDU5LCAweEY5LCAweDZELCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEM2LCAweDdFLCAweEE2LCAweENDLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweENELCAweEE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweEQwLCAweDQ1LCAweEQwLCAweDQ2LCAweEQwLCAweDQ0LCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweEFDLCAweEYzLCAweDAwLCAweDAwLCAweEQwLCAweDQ3LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEQwLCAweDQ4LCAweEQwLCAweDQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweEQzLCAweDQ5LCAweEQzLCAweDRGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweEQzLCAweDRELCAweEFGLCAweEJCLCAweEQzLCAweDRCLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweEQzLCAweDRDLCAweEQzLCAweDRFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweEQzLCAweDRBLCAweEIyLCAweEM5LCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweEQ2LCAweERFLCAweEIyLCAweENCLCAweEQ2LCAweEUwLCAweEIyLCAweENBLCAvKiAweDk0LTB4OTcgKi8KKwkweEQ2LCAweERGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERBLCAweEU4LCAweEI1LCAweEFGLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweERBLCAweEVBLCAweERBLCAweEU3LCAweEQ2LCAweEUxLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweEI1LCAweEIwLCAweDAwLCAweDAwLCAweEY5LCAweERCLCAvKiAweEE0LTB4QTcgKi8KKwkweERBLCAweEU5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERGLCAweDU2LCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweEI4LCAweDY0LCAweERGLCAweDU0LCAweEI4LCAweDY1LCAvKiAweEIwLTB4QjMgKi8KKwkweERGLCAweDU1LCAweEI4LCAweDY2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweEJBLCAweEU5LCAweEUzLCAweDYxLCAweEUzLCAweDVFLCAvKiAweEI4LTB4QkIgKi8KKwkweEUzLCAweDYwLCAweEJBLCAweEVBLCAweEJBLCAweEVCLCAweEUzLCAweDVGLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweEU2LCAweERGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweEU2LCAweEUwLCAweDAwLCAweDAwLCAweEJELCAweDZCLCAweEU2LCAweEUyLCAvKiAweEM4LTB4Q0IgKi8KKwkweEU2LCAweEUxLCAweDAwLCAweDAwLCAweEEyLCAweDYxLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweEVBLCAweENBLCAweEVBLCAweENCLCAweEVBLCAweEM3LCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweEVBLCAweEM4LCAweEJGLCAweDdDLCAweEJGLCAweDdELCAweEVBLCAweEM5LCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweEMxLCAweDU3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweEMxLCAweDUzLCAweEMxLCAweDU4LCAweEMxLCAweDU0LCAweEMxLCAweDU2LCAvKiAweERDLTB4REYgKi8KKwkweEMxLCAweDUyLCAweDAwLCAweDAwLCAweEMxLCAweDU1LCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMyLCAweEIzLCAvKiAweEU0LTB4RTcgKi8KKwkweEVELCAweENGLCAweDAwLCAweDAwLCAweEYyLCAweEFFLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweEYyLCAweEFELCAweDAwLCAweDAwLCAweEY0LCAweEFCLCAweEM0LCAweDdBLCAvKiAweEVDLTB4RUYgKi8KKwkweEM0LCAweDdCLCAweEY3LCAweDQxLCAweEY1LCAweEU2LCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweEY3LCAweDQwLCAweDAwLCAweDAwLCAweEY4LCAweEZELCAweEY5LCAweEE0LCAvKiAweEY0LTB4RjcgKi8KKwkweEE2LCAweENELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE4LCAweDc0LCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweENELCAweEE5LCAweEFBLCAweEM4LCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY183RFs1MTJdID0geworCTB4QUMsIDB4RjYsIDB4RDAsIDB4NEMsIDB4QUMsIDB4RjQsIDB4RDAsIDB4NEEsIC8qIDB4MDAtMHgwMyAqLworCTB4QUMsIDB4RjksIDB4QUMsIDB4RjUsIDB4QUMsIDB4RkEsIDB4QUMsIDB4RjgsIC8qIDB4MDQtMHgwNyAqLworCTB4RDAsIDB4NEIsIDB4QUMsIDB4RjcsIDB4QUYsIDB4QkYsIDB4QUYsIDB4QkUsIC8qIDB4MDgtMHgwQiAqLworCTB4RDMsIDB4NUEsIDB4QUYsIDB4QzcsIDB4RDMsIDB4NTMsIDB4RDMsIDB4NTksIC8qIDB4MEMtMHgwRiAqLworCTB4QUYsIDB4QzMsIDB4RDMsIDB4NTIsIDB4RDMsIDB4NTgsIDB4RDMsIDB4NTYsIC8qIDB4MTAtMHgxMyAqLworCTB4QUYsIDB4QzIsIDB4QUYsIDB4QzQsIDB4RDMsIDB4NTUsIDB4QUYsIDB4QkQsIC8qIDB4MTQtMHgxNyAqLworCTB4RDMsIDB4NTQsIDB4QUYsIDB4QzgsIDB4QUYsIDB4QzUsIDB4QUYsIDB4QzksIC8qIDB4MTgtMHgxQiAqLworCTB4QUYsIDB4QzYsIDB4RDMsIDB4NTEsIDB4RDMsIDB4NTAsIDB4RDMsIDB4NTcsIC8qIDB4MUMtMHgxRiAqLworCTB4QUYsIDB4QzAsIDB4QUYsIDB4QkMsIDB4QUYsIDB4QzEsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4RDYsIDB4RjAsIDB4RDYsIDB4RTksIDB4MDAsIDB4MDAsIDB4QjUsIDB4QjUsIC8qIDB4MjgtMHgyQiAqLworCTB4RDYsIDB4RTgsIDB4MDAsIDB4MDAsIDB4QjIsIDB4Q0YsIDB4QjIsIDB4RDYsIC8qIDB4MkMtMHgyRiAqLworCTB4QjIsIDB4RDMsIDB4QjIsIDB4RDksIDB4QjIsIDB4RDgsIDB4QjIsIDB4RDQsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4RDYsIDB4RTIsIDB4RDYsIDB4RTUsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4RDYsIDB4RTQsIDB4QjIsIDB4RDAsIDB4RDYsIDB4RTYsIDB4RDYsIDB4RUYsIC8qIDB4MzgtMHgzQiAqLworCTB4QjIsIDB4RDEsIDB4RDYsIDB4RTMsIDB4RDYsIDB4RUMsIDB4RDYsIDB4RUQsIC8qIDB4M0MtMHgzRiAqLworCTB4QjIsIDB4RDIsIDB4RDYsIDB4RUEsIDB4QjIsIDB4RDcsIDB4QjIsIDB4Q0QsIC8qIDB4NDAtMHg0MyAqLworCTB4QjIsIDB4RDUsIDB4RDYsIDB4RTcsIDB4QjIsIDB4Q0MsIDB4RDYsIDB4RUIsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDYsIDB4RUUsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REEsIDB4RkIsIDB4REEsIDB4RjIsIC8qIDB4NEMtMHg0RiAqLworCTB4QjUsIDB4QjIsIDB4REEsIDB4RjksIDB4REEsIDB4RjYsIDB4REEsIDB4RUUsIC8qIDB4NTAtMHg1MyAqLworCTB4REEsIDB4RjcsIDB4QjUsIDB4QjQsIDB4REEsIDB4RUYsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4REEsIDB4RUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjgsIDB4NkMsIC8qIDB4NTgtMHg1QiAqLworCTB4REEsIDB4RjQsIDB4MDAsIDB4MDAsIDB4QjUsIDB4QjEsIDB4REEsIDB4RkEsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4QjUsIDB4QjgsIDB4QjUsIDB4QkEsIDB4REEsIDB4RUQsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjUsIDB4QjksIDB4REEsIDB4RjAsIC8qIDB4NjQtMHg2NyAqLworCTB4QjUsIDB4QjMsIDB4REEsIDB4RjgsIDB4REEsIDB4RjEsIDB4REEsIDB4RjUsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4REEsIDB4RjMsIDB4QjUsIDB4QjYsIDB4REEsIDB4RUMsIC8qIDB4NkMtMHg2RiAqLworCTB4QjUsIDB4QkIsIDB4QjIsIDB4Q0UsIDB4QjUsIDB4QjcsIDB4QjUsIDB4QkMsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4QjgsIDB4NjgsIDB4REYsIDB4NUQsIDB4REYsIDB4NUYsIC8qIDB4NzgtMHg3QiAqLworCTB4REYsIDB4NjEsIDB4REYsIDB4NjUsIDB4MDAsIDB4MDAsIDB4REYsIDB4NUIsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4REYsIDB4NTksIDB4QjgsIDB4NkEsIDB4MDAsIDB4MDAsIDB4REYsIDB4NjAsIC8qIDB4ODAtMHg4MyAqLworCTB4REYsIDB4NjQsIDB4REYsIDB4NUMsIDB4REYsIDB4NTgsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4REYsIDB4NTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4REYsIDB4NjIsIDB4REYsIDB4NUEsIDB4REYsIDB4NUUsIDB4QjgsIDB4NkIsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4QjgsIDB4NjksIDB4REYsIDB4NjYsIDB4QjgsIDB4NjcsIC8qIDB4OTAtMHg5MyAqLworCTB4REYsIDB4NjMsIDB4MDAsIDB4MDAsIDB4RTMsIDB4NzIsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4QkEsIDB4RUUsIDB4RTMsIDB4NkEsIDB4QkQsIDB4NzgsIDB4RTMsIDB4NzQsIC8qIDB4OUMtMHg5RiAqLworCTB4QkEsIDB4RjEsIDB4RTMsIDB4NzgsIDB4QkEsIDB4RjcsIDB4RTMsIDB4NjUsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTMsIDB4NzUsIDB4RTMsIDB4NjIsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4NzcsIDB4RTMsIDB4NjYsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4QkEsIDB4RkUsIDB4QkEsIDB4RkIsIDB4RTMsIDB4NzYsIDB4RTMsIDB4NzAsIC8qIDB4QUMtMHhBRiAqLworCTB4QkEsIDB4RUQsIDB4QkEsIDB4RjUsIDB4QkEsIDB4RjQsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4QkEsIDB4RjMsIDB4QkEsIDB4RjksIDB4MDAsIDB4MDAsIDB4RTMsIDB4NjMsIC8qIDB4QjQtMHhCNyAqLworCTB4QkEsIDB4RkEsIDB4RTMsIDB4NzEsIDB4QkEsIDB4RjYsIDB4QkEsIDB4RUMsIC8qIDB4QjgtMHhCQiAqLworCTB4RTMsIDB4NzMsIDB4QkEsIDB4RUYsIDB4QkEsIDB4RjAsIDB4QkEsIDB4RjgsIC8qIDB4QkMtMHhCRiAqLworCTB4RTMsIDB4NjgsIDB4RTMsIDB4NjcsIDB4RTMsIDB4NjQsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4RTMsIDB4NkMsIDB4RTMsIDB4NjksIDB4RTMsIDB4NkQsIDB4QkEsIDB4RkQsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4NzksIDB4QkEsIDB4RjIsIDB4RTMsIDB4NkUsIC8qIDB4QzgtMHhDQiAqLworCTB4RTMsIDB4NkYsIDB4MDAsIDB4MDAsIDB4RTMsIDB4NkIsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkEsIDB4RkMsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4RTcsIC8qIDB4RDQtMHhENyAqLworCTB4QkQsIDB4NzAsIDB4QkQsIDB4NzksIDB4QkQsIDB4NzUsIDB4RTYsIDB4RTQsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4QkQsIDB4NzIsIDB4QkQsIDB4NzYsIDB4RTYsIDB4RjAsIC8qIDB4REMtMHhERiAqLworCTB4QkQsIDB4NkMsIDB4RTYsIDB4RTgsIDB4MDAsIDB4MDAsIDB4QkQsIDB4NzQsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4RUIsIDB4RTYsIDB4RTYsIC8qIDB4RTQtMHhFNyAqLworCTB4QkQsIDB4NzMsIDB4QkQsIDB4NzcsIDB4RTYsIDB4RTUsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4QkQsIDB4NzEsIDB4MDAsIDB4MDAsIDB4RTYsIDB4RUYsIDB4QkQsIDB4NkUsIC8qIDB4RUMtMHhFRiAqLworCTB4RTYsIDB4RUUsIDB4RTYsIDB4RUQsIDB4QkQsIDB4N0EsIDB4RTUsIDB4NzIsIC8qIDB4RjAtMHhGMyAqLworCTB4QkQsIDB4NkQsIDB4MDAsIDB4MDAsIDB4RTYsIDB4RUMsIDB4RTYsIDB4RTMsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4QkQsIDB4N0IsIDB4RTYsIDB4RUEsIDB4QkQsIDB4NkYsIC8qIDB4RjgtMHhGQiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzdFWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNiwgMHhFOSwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHhCRiwgMHhBMiwgMHhCRiwgMHhBNywgMHhCRiwgMHg3RSwgMHhFQSwgMHhEOCwgLyogMHgwOC0weDBCICovCisJMHhFQSwgMHhDRiwgMHhFQSwgMHhEQiwgMHhFQSwgMHhEMywgMHhFQSwgMHhEOSwgLyogMHgwQy0weDBGICovCisJMHhCRiwgMHhBOCwgMHhCRiwgMHhBMSwgMHhFQSwgMHhDQywgMHhFQSwgMHhEMiwgLyogMHgxMC0weDEzICovCisJMHhFQSwgMHhEQywgMHhFQSwgMHhENSwgMHhFQSwgMHhEQSwgMHhFQSwgMHhDRSwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHhENiwgMHhCRiwgMHhBMywgLyogMHgxOC0weDFCICovCisJMHhFQSwgMHhENCwgMHhCRiwgMHhBNiwgMHhCRiwgMHhBNSwgMHhFQSwgMHhEMCwgLyogMHgxQy0weDFGICovCisJMHhFQSwgMHhEMSwgMHhFQSwgMHhDRCwgMHhFQSwgMHhENywgMHhCRiwgMHhBNCwgLyogMHgyMC0weDIzICovCisJMHhFQSwgMHhERSwgMHhFQSwgMHhERCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHhFRCwgMHhEQSwgMHhFRCwgMHhENiwgMHhDMSwgMHg1RiwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHhFRCwgMHhEMCwgMHhDMSwgMHg1OSwgMHhDMSwgMHg2OSwgLyogMHgyQy0weDJGICovCisJMHhFRCwgMHhEQywgMHhDMSwgMHg2MSwgMHhDMSwgMHg1RCwgMHhFRCwgMHhEMywgLyogMHgzMC0weDMzICovCisJMHhDMSwgMHg2NCwgMHhDMSwgMHg2NywgMHhFRCwgMHhERSwgMHhDMSwgMHg1QywgLyogMHgzNC0weDM3ICovCisJMHhFRCwgMHhENSwgMHhDMSwgMHg2NSwgMHhFRCwgMHhFMCwgMHhFRCwgMHhERCwgLyogMHgzOC0weDNCICovCisJMHhFRCwgMHhEMSwgMHhDMSwgMHg2MCwgMHhDMSwgMHg1QSwgMHhDMSwgMHg2OCwgLyogMHgzQy0weDNGICovCisJMHhFRCwgMHhEOCwgMHhDMSwgMHg2MywgMHhFRCwgMHhEMiwgMHhDMSwgMHg1RSwgLyogMHg0MC0weDQzICovCisJMHhFRCwgMHhERiwgMHhDMSwgMHg2MiwgMHhDMSwgMHg1QiwgMHhFRCwgMHhEOSwgLyogMHg0NC0weDQ3ICovCisJMHhDMSwgMHg2NiwgMHhFRCwgMHhENywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHhFRCwgMHhEQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHhGMCwgMHg2RSwgMHhGMCwgMHg3NCwgMHhDMiwgMHhCOSwgMHhGMCwgMHg3NywgLyogMHg1MC0weDUzICovCisJMHhDMiwgMHhCNCwgMHhDMiwgMHhCNSwgMHhGMCwgMHg2RiwgMHhGMCwgMHg3NiwgLyogMHg1NC0weDU3ICovCisJMHhGMCwgMHg3MSwgMHhDMiwgMHhCQSwgMHhDMiwgMHhCNywgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHhGMCwgMHg2RCwgMHgwMCwgMHgwMCwgMHhDMiwgMHhCNiwgMHhGMCwgMHg3MywgLyogMHg1Qy0weDVGICovCisJMHhGMCwgMHg3NSwgMHhDMiwgMHhCOCwgMHhGMCwgMHg3MiwgMHhGMCwgMHg3MCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHhGMiwgMHhCOCwgMHhDMywgMHhCNywgMHhDMywgMHhCOCwgMHhDMywgMHhCNCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHhDMywgMHhCNSwgMHgwMCwgMHgwMCwgMHhGMiwgMHhCNCwgLyogMHg2Qy0weDZGICovCisJMHhGMiwgMHhCMiwgMHgwMCwgMHgwMCwgMHhGMiwgMHhCNiwgMHhDMywgMHhCQSwgLyogMHg3MC0weDczICovCisJMHhGMiwgMHhCNywgMHhGMiwgMHhCMCwgMHhGMiwgMHhBRiwgMHhGMiwgMHhCMywgLyogMHg3NC0weDc3ICovCisJMHhGMiwgMHhCMSwgMHhDMywgMHhCNiwgMHhGMiwgMHhCNSwgMHhGNCwgMHhBQywgLyogMHg3OC0weDdCICovCisJMHhDNCwgMHg3RSwgMHhDNCwgMHg3RCwgMHhGNCwgMHhBRCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHhGNCwgMHhBRiwgMHhGNCwgMHhBRSwgMHhDNCwgMHhBMSwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNSwgMHhFQiwgMHhGNSwgMHhFOCwgLyogMHg4NC0weDg3ICovCisJMHhGNSwgMHhFOSwgMHgwMCwgMHgwMCwgMHhGNSwgMHhFNywgMHhGNSwgMHhFQSwgLyogMHg4OC0weDhCICovCisJMHhDNCwgMHhGMiwgMHhGNSwgMHhFQywgMHgwMCwgMHgwMCwgMHhDNCwgMHhGMSwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHhGNywgMHg0MiwgMHgwMCwgMHgwMCwgMHhDNSwgMHhENSwgLyogMHg5MC0weDkzICovCisJMHhDNSwgMHhENywgMHhGNywgMHhFRSwgMHhDNSwgMHhENiwgMHhGOCwgMHhCOSwgLyogMHg5NC0weDk3ICovCisJMHhGOSwgMHg0MCwgMHhGOSwgMHg0MiwgMHhGOCwgMHhGRSwgMHhGOSwgMHg0MSwgLyogMHg5OC0weDlCICovCisJMHhDNiwgMHg2QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfN0ZbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE2LCAweENFLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweEFDLCAweEZCLCAweEQyLCAweDZGLCAweEFGLCAweENBLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweEIyLCAweERBLCAweERBLCAweEZDLCAweERBLCAweEZELCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVBLCAweERGLCAvKiAweDQwLTB4NDMgKi8KKwkweEMxLCAweDZBLCAweEVELCAweEUxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweEMyLCAweEJCLCAweDAwLCAweDAwLCAweEYyLCAweEJBLCAweEYyLCAweEI5LCAvKiAweDQ4LTB4NEIgKi8KKwkweEM0LCAweEEyLCAweEY1LCAweEVELCAweDAwLCAweDAwLCAweEY3LCAweDQzLCAvKiAweDRDLTB4NEYgKi8KKwkweEM1LCAweEY4LCAweENBLCAweDQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweEFBLCAweEM5LCAweEE4LCAweDc1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweEQwLCAweDRELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQzLCAweDYwLCAvKiAweDU4LTB4NUIgKi8KKwkweEQzLCAweDVCLCAweEQzLCAweDVGLCAweEQzLCAweDVELCAweEFGLCAweENCLCAvKiAweDVDLTB4NUYgKi8KKwkweEQzLCAweDVFLCAweEQzLCAweDVDLCAweDAwLCAweDAwLCAweEQ2LCAweEYxLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweERBLCAweEZFLCAweERCLCAweDQwLCAweERGLCAweDY5LCAvKiAweDY0LTB4NjcgKi8KKwkweERGLCAweDZBLCAweEI4LCAweDZFLCAweEI4LCAweDZGLCAweERGLCAweDY4LCAvKiAweDY4LTB4NkIgKi8KKwkweERGLCAweDZCLCAweERGLCAweDY3LCAweEI4LCAweDZELCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweEJCLCAweDQwLCAweDAwLCAweDAwLCAweEI4LCAweDcwLCAweEUzLCAweDdBLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweEJELCAweDdDLCAweEU2LCAweEYxLCAweEJELCAweDdELCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweEJGLCAweEE5LCAweEVBLCAweEUyLCAweEVBLCAweEUwLCAvKiAweDc4LTB4N0IgKi8KKwkweEVBLCAweEUxLCAweEVELCAweEU0LCAweEVELCAweEUzLCAweEVELCAweEUyLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYyLCAweEJCLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweEMzLCAweEI5LCAweEYyLCAweEJDLCAweEY3LCAweDQ0LCAvKiAweDg0LTB4ODcgKi8KKwkweEM1LCAweEY5LCAweEY4LCAweEJBLCAweEE2LCAweENGLCAweEFBLCAweENCLCAvKiAweDg4LTB4OEIgKi8KKwkweEFBLCAweENBLCAweEQwLCAweDRGLCAweEFDLCAweEZDLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweEQwLCAweDRFLCAweEQzLCAweDYyLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweEFGLCAweENDLCAweEQ2LCAweEYyLCAweEQzLCAweDYxLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIyLCAweERDLCAweEQ2LCAweEY1LCAvKiAweDk4LTB4OUIgKi8KKwkweEQ2LCAweEYzLCAweEQ2LCAweEY0LCAweEIyLCAweERCLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweERCLCAweDQyLCAweERCLCAweDQzLCAweERCLCAweDQxLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweEI4LCAweDczLCAweERGLCAweDZELCAweERGLCAweDZDLCAweERGLCAweDZFLCAvKiAweEE0LTB4QTcgKi8KKwkweEI4LCAweDcyLCAweEI4LCAweDcxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweEU2LCAweEYyLCAweEU2LCAweEY0LCAweDAwLCAweDAwLCAweEJELCAweDdFLCAvKiAweEFDLTB4QUYgKi8KKwkweEU2LCAweEYzLCAweEVBLCAweEUzLCAweEJGLCAweEFBLCAweEYwLCAweDc5LCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweEYwLCAweDc4LCAweEMzLCAweEJCLCAweEYyLCAweEJELCAvKiAweEI0LTB4QjcgKi8KKwkweEMzLCAweEJELCAweEMzLCAweEJDLCAweEY0LCAweEIwLCAweEY1LCAweEVFLCAvKiAweEI4LTB4QkIgKi8KKwkweEM0LCAweEYzLCAweEE2LCAweEQwLCAweEQwLCAweDUwLCAweEFDLCAweEZELCAvKiAweEJDLTB4QkYgKi8KKwkweEQzLCAweDY1LCAweEFGLCAweENFLCAweEQzLCAweDY0LCAweEQzLCAweDYzLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweEFGLCAweENELCAweDAwLCAweDAwLCAweEQ2LCAweEZCLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweEQ2LCAweEZELCAweEQ2LCAweEY2LCAweEQ2LCAweEY3LCAvKiAweEM4LTB4Q0IgKi8KKwkweEIyLCAweERELCAweEQ2LCAweEY4LCAweEIyLCAweERFLCAweEQ2LCAweEZDLCAvKiAweENDLTB4Q0YgKi8KKwkweEQ2LCAweEY5LCAweEQ2LCAweEZBLCAweEIyLCAweERGLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweEI1LCAweEJFLCAweEI1LCAweEJGLCAweDAwLCAweDAwLCAweERCLCAweDQ0LCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERGLCAweDZGLCAvKiAweEQ4LTB4REIgKi8KKwkweERGLCAweDcwLCAweDAwLCAweDAwLCAweEUzLCAweDdFLCAweEJCLCAweDQzLCAvKiAweERDLTB4REYgKi8KKwkweEJCLCAweDQxLCAweEJCLCAweDQyLCAweEUzLCAweDdCLCAweEUzLCAweDdDLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweEUzLCAweDdELCAweEU2LCAweEY5LCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweEU2LCAweEZBLCAweEJELCAweEExLCAweEU2LCAweEY3LCAweEU2LCAweEY2LCAvKiAweEU4LTB4RUIgKi8KKwkweEU2LCAweEY4LCAweEU2LCAweEY1LCAweEJGLCAweEFELCAweEVBLCAweEU0LCAvKiAweEVDLTB4RUYgKi8KKwkweEJGLCAweEFCLCAweEJGLCAweEFDLCAweEVELCAweEU2LCAweEMxLCAweDZCLCAvKiAweEYwLTB4RjMgKi8KKwkweEVELCAweEU1LCAweEVGLCAweEE4LCAweDAwLCAweDAwLCAweEYwLCAweDdBLCAvKiAweEY0LTB4RjcgKi8KKwkweEYwLCAweDdCLCAweEMyLCAweEJDLCAweDAwLCAweDAwLCAweEMyLCAweEJELCAvKiAweEY4LTB4RkIgKi8KKwkweEMxLCAweDZDLCAweEYyLCAweEJFLCAweEYyLCAweEJGLCAweEY0LCAweEIxLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184MFs1MTJdID0geworCTB4QzQsIDB4QTMsIDB4QTYsIDB4RDEsIDB4MDAsIDB4MDAsIDB4QTYsIDB4RDIsIC8qIDB4MDAtMHgwMyAqLworCTB4QUMsIDB4RkUsIDB4QUEsIDB4Q0MsIDB4QUYsIDB4Q0YsIDB4RDAsIDB4NTEsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjUsIDB4QzAsIC8qIDB4MDgtMHgwQiAqLworCTB4QTYsIDB4RDMsIDB4QUQsIDB4NDEsIDB4RDAsIDB4NTIsIDB4RDAsIDB4NTMsIC8qIDB4MEMtMHgwRiAqLworCTB4QUQsIDB4NDAsIDB4QUQsIDB4NDIsIDB4QTYsIDB4RDQsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4RDAsIDB4NTQsIDB4QUYsIDB4RDEsIDB4RDMsIDB4NjYsIDB4QUYsIDB4RDMsIC8qIDB4MTQtMHgxNyAqLworCTB4QUYsIDB4RDAsIDB4QUYsIDB4RDIsIDB4MDAsIDB4MDAsIDB4RDcsIDB4NDEsIC8qIDB4MTgtMHgxQiAqLworCTB4QjIsIDB4RTAsIDB4MDAsIDB4MDAsIDB4RDcsIDB4NDAsIDB4RDYsIDB4RkUsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4REYsIDB4NzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4RTMsIDB4QTEsIDB4MDAsIDB4MDAsIDB4QkQsIDB4QTIsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4QkYsIDB4QUUsIDB4RUEsIDB4RTYsIDB4RUEsIDB4RTUsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4RUQsIDB4RTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4RjUsIDB4RUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTYsIDB4RDUsIC8qIDB4MzAtMHgzMyAqLworCTB4Q0IsIDB4NzMsIDB4Q0QsIDB4QUEsIDB4QUQsIDB4NDMsIDB4RDAsIDB4NTUsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4RDMsIDB4NjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4QUYsIDB4RDQsIDB4RDMsIDB4NjcsIDB4QUYsIDB4RDUsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDcsIDB4NDMsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjIsIDB4RTIsIDB4RDcsIDB4NDIsIC8qIDB4NDQtMHg0NyAqLworCTB4RDcsIDB4NDQsIDB4MDAsIDB4MDAsIDB4QjIsIDB4RTEsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REIsIDB4NDYsIC8qIDB4NEMtMHg0RiAqLworCTB4REIsIDB4NDcsIDB4REIsIDB4NDUsIDB4QjUsIDB4QzEsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjgsIDB4NzQsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4QjgsIDB4NzUsIDB4MDAsIDB4MDAsIDB4QkIsIDB4NDUsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4RTMsIDB4QTMsIDB4RTMsIDB4QTIsIDB4QkIsIDB4NDQsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4RTYsIDB4RkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTYsIDB4RkMsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4RUEsIDB4RTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzEsIDB4NzAsIC8qIDB4NkMtMHg2RiAqLworCTB4QzEsIDB4NkYsIDB4QzEsIDB4NkQsIDB4QzEsIDB4NkUsIDB4QzEsIDB4NzEsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4RjAsIDB4N0MsIDB4QzIsIDB4QkYsIDB4QzIsIDB4QkUsIC8qIDB4NzQtMHg3NyAqLworCTB4RjIsIDB4QzAsIDB4RjQsIDB4QjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4QzUsIDB4QTUsIDB4QzUsIDB4QTQsIDB4QTYsIDB4RDYsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDEsIDB4RkIsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4QjgsIDB4NzcsIDB4QjUsIDB4QzIsIDB4QjgsIDB4NzYsIDB4QkIsIDB4NDYsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4QTYsIDB4RDcsIDB4QzksIDB4QTksIDB4QTYsIDB4RDgsIC8qIDB4ODgtMHg4QiAqLworCTB4QTYsIDB4RDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0QsIDB4QUIsIC8qIDB4OEMtMHg4RiAqLworCTB4Q0IsIDB4NzYsIDB4MDAsIDB4MDAsIDB4Q0IsIDB4NzcsIDB4QTgsIDB4NzcsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4Q0IsIDB4NzQsIDB4QTgsIDB4NzYsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4QTgsIDB4NzksIDB4Q0IsIDB4NzUsIDB4QTgsIDB4N0IsIDB4QTgsIDB4N0EsIC8qIDB4OTgtMHg5QiAqLworCTB4Q0IsIDB4NzgsIDB4QTgsIDB4NzgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4QUEsIDB4RDEsIDB4QUEsIDB4Q0YsIDB4Q0QsIDB4QUQsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4QUEsIDB4Q0UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4QUEsIDB4RDMsIDB4QUEsIDB4RDUsIDB4QUEsIDB4RDIsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4Q0QsIDB4QjAsIDB4Q0QsIDB4QUMsIDB4QUEsIDB4RDYsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4QUEsIDB4RDAsIDB4QTgsIDB4N0MsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4QUEsIDB4RDQsIDB4Q0QsIDB4QUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4Q0QsIDB4QUUsIDB4MDAsIDB4MDAsIDB4QUEsIDB4Q0QsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDAsIDB4NUIsIDB4QUQsIDB4NDcsIC8qIDB4QzAtMHhDMyAqLworCTB4QUQsIDB4NDgsIDB4RDAsIDB4NUQsIDB4MDAsIDB4MDAsIDB4RDAsIDB4NTcsIC8qIDB4QzQtMHhDNyAqLworCTB4RDAsIDB4NUEsIDB4RDAsIDB4NjMsIDB4RDAsIDB4NjEsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4QUQsIDB4NDksIDB4RDAsIDB4NjcsIDB4QUQsIDB4NEMsIDB4RDAsIDB4NjQsIC8qIDB4Q0MtMHhDRiAqLworCTB4RDAsIDB4NUMsIDB4RDAsIDB4NTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4REIsIDB4NDksIDB4RDAsIDB4NjIsIDB4QUQsIDB4NDQsIDB4RDAsIDB4NjUsIC8qIDB4RDQtMHhENyAqLworCTB4RDAsIDB4NTYsIDB4RDAsIDB4NUYsIDB4QUQsIDB4NDYsIDB4QUQsIDB4NEIsIC8qIDB4RDgtMHhEQiAqLworCTB4RDAsIDB4NjAsIDB4QUQsIDB4NEYsIDB4QUQsIDB4NEQsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4RDAsIDB4NTgsIDB4QUQsIDB4NEEsIDB4MDAsIDB4MDAsIDB4RDAsIDB4NUUsIC8qIDB4RTAtMHhFMyAqLworCTB4QUQsIDB4NEUsIDB4QUQsIDB4NDUsIDB4RDAsIDB4NjYsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4QUYsIDB4REEsIDB4MDAsIDB4MDAsIDB4QUYsIDB4RTMsIC8qIDB4RUMtMHhFRiAqLworCTB4QUYsIDB4RDgsIDB4QUYsIDB4RDYsIDB4RDMsIDB4NkEsIDB4QUYsIDB4REUsIC8qIDB4RjAtMHhGMyAqLworCTB4QUYsIDB4REIsIDB4RDMsIDB4NkMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4QUYsIDB4REQsIDB4RDMsIDB4NkIsIDB4RDMsIDB4NjksIDB4RDMsIDB4NkUsIC8qIDB4RjgtMHhGQiAqLworCTB4QUYsIDB4RTIsIDB4QUYsIDB4RTAsIDB4REIsIDB4NDgsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzgxWzUxMl0gPSB7CisJMHhEMywgMHg2RiwgMHhEMywgMHg2RCwgMHhBRiwgMHhENywgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHhBRiwgMHhEOSwgMHhBRiwgMHhEQywgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHhBRiwgMHhERiwgMHgwMCwgMHgwMCwgMHhBRiwgMHhFMSwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHhENywgMHg0RSwgMHhCMiwgMHhFNCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHhENywgMHg0NSwgMHhENywgMHg0NywgMHgwMCwgMHgwMCwgMHhENywgMHg0OCwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHhENywgMHg1MCwgMHhENywgMHg0QywgMHhENywgMHg0QSwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHhENywgMHg0RCwgMHhENywgMHg1MSwgMHhCMiwgMHhFNSwgLyogMHgyMC0weDIzICovCisJMHhCMiwgMHhFOSwgMHhENywgMHg0NiwgMHgwMCwgMHgwMCwgMHhENywgMHg0RiwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHhCMiwgMHhFNywgMHgwMCwgMHgwMCwgMHhCMiwgMHhFNiwgLyogMHgyOC0weDJCICovCisJMHhENywgMHg0QiwgMHhENywgMHg0OSwgMHgwMCwgMHgwMCwgMHhCMiwgMHhFMywgLyogMHgyQy0weDJGICovCisJMHhCMiwgMHhFOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHhCNSwgMHhDOCwgMHhEQiwgMHg1MSwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHhEQiwgMHg0RiwgMHhCNSwgMHhDQSwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQiwgMHg0QSwgLyogMHg0MC0weDQzICovCisJMHhERiwgMHhBMSwgMHgwMCwgMHgwMCwgMHhCNSwgMHhDOSwgMHhEQiwgMHg0RSwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQiwgMHg0QiwgMHhCNSwgMHhDNSwgLyogMHg0OC0weDRCICovCisJMHhCNSwgMHhDQiwgMHhEQiwgMHg1MCwgMHhCNSwgMHhDNywgMHhEQiwgMHg0RCwgLyogMHg0Qy0weDRGICovCisJMHhCQiwgMHg0NywgMHhCNSwgMHhDNiwgMHhEQiwgMHg0QywgMHhCNSwgMHhDQywgLyogMHg1MC0weDUzICovCisJMHhCNSwgMHhDNCwgMHhCNSwgMHhDMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERiwgMHg3NywgLyogMHg1OC0weDVCICovCisJMHhERiwgMHg3NSwgMHgwMCwgMHgwMCwgMHhERiwgMHg3QiwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHhERiwgMHg3MywgMHhERiwgMHhBMiwgMHhERiwgMHg3OCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHhERiwgMHg3MiwgMHhCOCwgMHg3QiwgMHhCOCwgMHhBMywgMHhERiwgMHg3RCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhERiwgMHg3NiwgMHgwMCwgMHgwMCwgMHhCOCwgMHg3RSwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCOCwgMHg3QywgMHhERiwgMHg3RSwgLyogMHg2Qy0weDZGICovCisJMHhCOCwgMHg3OSwgMHhCOCwgMHg3OCwgMHhERiwgMHg3OSwgMHhCOCwgMHg3RCwgLyogMHg3MC0weDczICovCisJMHhCNSwgMHhDRCwgMHgwMCwgMHgwMCwgMHhERiwgMHg3QywgMHhERiwgMHg3NCwgLyogMHg3NC0weDc3ICovCisJMHhCOCwgMHg3QSwgMHhCOCwgMHhBMSwgMHhCOCwgMHhBMiwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQiwgMHg0QywgLyogMHg3Qy0weDdGICovCisJCisJMHhCQiwgMHg0OCwgMHgwMCwgMHgwMCwgMHhCQiwgMHg0RCwgMHhFMywgMHhBNiwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHhBNSwgMHhFMywgMHhBNywgLyogMHg4NC0weDg3ICovCisJMHhCQiwgMHg0QSwgMHhFMywgMHhBNCwgMHhCQiwgMHg0QiwgMHhFMywgMHhBQSwgLyogMHg4OC0weDhCICovCisJMHhFMywgMHhBOSwgMHhFMywgMHhBOCwgMHgwMCwgMHgwMCwgMHhCQiwgMHg0OSwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHhFNywgMHg0MSwgMHgwMCwgMHgwMCwgMHhFNywgMHg0NCwgLyogMHg5NC0weDk3ICovCisJMHhCRCwgMHhBOCwgMHhFNywgMHg0MywgMHhCRCwgMHhBNywgMHhCRCwgMHhBMywgLyogMHg5OC0weDlCICovCisJMHhCRCwgMHhBNCwgMHhCRCwgMHhBNSwgMHhFNywgMHg0MCwgMHhFNiwgMHhGRSwgLyogMHg5Qy0weDlGICovCisJMHhCRCwgMHhBNiwgMHgwMCwgMHgwMCwgMHhFNywgMHg0MiwgMHhFNiwgMHhGRCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHhFOSwgMHhFQSwgMHhGMywgLyogMHhBNC0weEE3ICovCisJMHhCRiwgMHhCMSwgMHhCRiwgMHhCMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHhFRCwgLyogMHhBOC0weEFCICovCisJMHhFQSwgMHhFRiwgMHgwMCwgMHgwMCwgMHhFQSwgMHhFQSwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHhFQSwgMHhFRSwgMHhFQSwgMHhFOCwgMHhFQSwgMHhGMSwgMHhCRiwgMHhBRiwgLyogMHhCMC0weEIzICovCisJMHhFQSwgMHhGMCwgMHhFQSwgMHhFQywgMHgwMCwgMHgwMCwgMHhFQSwgMHhGMiwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHhFQSwgMHhFQiwgMHhDMSwgMHg3NCwgMHhFRCwgMHhFOCwgLyogMHhCOC0weEJCICovCisJMHhFRCwgMHhFRSwgMHhDMSwgMHg3OCwgMHhDMSwgMHg3QSwgMHhDMSwgMHg3NywgLyogMHhCQy0weEJGICovCisJMHhDMSwgMHg3NiwgMHgwMCwgMHgwMCwgMHhDMSwgMHg3NSwgMHhDMSwgMHg3MywgLyogMHhDMC0weEMzICovCisJMHhFRCwgMHhFOSwgMHhFRCwgMHhFQywgMHhDMSwgMHg3MiwgMHhFRCwgMHhFRCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHhDMSwgMHg3OSwgMHhFRCwgMHhFQiwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHhFRCwgMHhFQSwgMHhDMiwgMHhDMCwgMHgwMCwgMHgwMCwgMHhDMiwgMHhDMSwgLyogMHhDQy0weENGICovCisJMHhGMCwgMHhBMSwgMHhGMCwgMHg3RCwgMHhGMCwgMHg3RSwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHhGMiwgMHhDMiwgMHgwMCwgMHgwMCwgMHhGMiwgMHhDMSwgLyogMHhENC0weEQ3ICovCisJMHhDMywgMHhCRSwgMHhGNCwgMHhCNCwgMHhDNCwgMHhBNCwgMHhGNCwgMHhCMywgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHhGNSwgMHhGMCwgMHhGNywgMHg0NSwgMHhDNSwgMHhBNiwgLyogMHhEQy0weERGICovCisJMHhGOSwgMHg0MywgMHhGOSwgMHg0NCwgMHhDNSwgMHhEOCwgMHhBNiwgMHhEQSwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHhBQSwgMHhENywgMHhEQiwgMHg1MiwgMHhCQiwgMHg0RSwgLyogMHhFNC0weEU3ICovCisJMHhDMSwgMHg3QiwgMHhFRCwgMHhFRiwgMHhBNiwgMHhEQiwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHhBRiwgMHhFNSwgMHhBRiwgMHhFNCwgMHhEQiwgMHg1MywgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHhGNCwgMHhBNiwgMHhEQywgLyogMHhGMC0weEYzICovCisJMHhBRCwgMHg1MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQiwgMHg1NCwgLyogMHhGNC0weEY3ICovCisJMHhEQiwgMHg1NSwgMHhEQiwgMHg1NiwgMHhCQiwgMHg0RiwgMHhCRiwgMHhCMiwgLyogMHhGOC0weEZCICovCisJMHhBNiwgMHhERCwgMHgwMCwgMHgwMCwgMHhBQSwgMHhEOCwgMHhEMCwgMHg2OCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfODJbNTEyXSA9IHsKKwkweEFGLCAweEU2LCAweEQzLCAweDcwLCAweEIyLCAweEVBLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweERCLCAweDU3LCAweEI4LCAweEE0LCAweDAwLCAweDAwLCAweEJCLCAweDUwLCAvKiAweDA0LTB4MDcgKi8KKwkweEJGLCAweEIzLCAweEMxLCAweDdDLCAweEMyLCAweEMyLCAweEY0LCAweEI1LCAvKiAweDA4LTB4MEIgKi8KKwkweEE2LCAweERFLCAweEFBLCAweEQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweEFGLCAweEU3LCAweEQ3LCAweDUyLCAweEI1LCAweENFLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweEJCLCAweDUxLCAweEUzLCAweEFCLCAweEU3LCAweDQ1LCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEE2LCAweERGLCAvKiAweDE4LTB4MUIgKi8KKwkweEI1LCAweENGLCAweERGLCAweEEzLCAweEJCLCAweDUyLCAweEE2LCAweEUwLCAvKiAweDFDLTB4MUYgKi8KKwkweENELCAweEIxLCAweEQwLCAweDY5LCAweEFELCAweDUxLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweEQzLCAweDcyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweEFGLCAweEVBLCAweDAwLCAweDAwLCAweEFGLCAweEU4LCAweEFGLCAweEU5LCAvKiAweDI4LTB4MkIgKi8KKwkweEFGLCAweEVCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQzLCAweDcxLCAvKiAweDJDLTB4MkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ3LCAweDU3LCAweEQ3LCAweDU0LCAvKiAweDMwLTB4MzMgKi8KKwkweEQ3LCAweDU2LCAweEIyLCAweEVCLCAweEIyLCAweEVELCAweEIyLCAweEVDLCAvKiAweDM0LTB4MzcgKi8KKwkweEQ3LCAweDUzLCAweEIyLCAweEVFLCAweEQ3LCAweDU1LCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweERCLCAweDU4LCAweERCLCAweDU5LCAweDAwLCAweDAwLCAweERCLCAweDVBLCAvKiAweDNDLTB4M0YgKi8KKwkweERGLCAweEE2LCAweDAwLCAweDAwLCAweERGLCAweEE3LCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweERGLCAweEE1LCAweERGLCAweEE4LCAweDAwLCAweDAwLCAweEI4LCAweEE1LCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweERGLCAweEE0LCAweDAwLCAweDAwLCAweEJCLCAweDUzLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweDRBLCAweEU3LCAweDQ2LCAvKiAweDRDLTB4NEYgKi8KKwkweEU3LCAweDQ5LCAweEU3LCAweDRCLCAweEU3LCAweDQ4LCAweEU3LCAweDQ3LCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweEVBLCAweEY1LCAweEVBLCAweEY2LCAweEVBLCAweEY3LCAvKiAweDU0LTB4NTcgKi8KKwkweEJGLCAweEI0LCAweEJGLCAweEI1LCAweEVELCAweEYxLCAweEVELCAweEYwLCAvKiAweDU4LTB4NUIgKi8KKwkweEVELCAweEYyLCAweDAwLCAweDAwLCAweEYwLCAweEEzLCAweEYwLCAweEEyLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweEYyLCAweEM0LCAweDAwLCAweDAwLCAweEYyLCAweEM1LCAvKiAweDYwLTB4NjMgKi8KKwkweEYyLCAweEMzLCAweDAwLCAweDAwLCAweEM0LCAweEE1LCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweEY0LCAweEI2LCAweEY0LCAweEI3LCAweDAwLCAweDAwLCAweEY3LCAweDQ2LCAvKiAweDY4LTB4NkIgKi8KKwkweEY3LCAweEVGLCAweEY4LCAweEJCLCAweEE2LCAweEUxLCAweEE4LCAweDdELCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweEMxLCAweDdELCAweEE2LCAweEUyLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweEQ3LCAweDU4LCAweERCLCAweDVCLCAweDAwLCAweDAwLCAweEM2LCAweDQxLCAvKiAweDc0LTB4NzcgKi8KKwkweENBLCAweDRBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweENBLCAweDRCLCAweENBLCAweDRELCAweEE2LCAweEUzLCAweENBLCAweDRFLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweENBLCAweDRDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENCLCAweEEyLCAvKiAweDgwLTB4ODMgKi8KKwkweENCLCAweEEzLCAweENCLCAweDdCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweENCLCAweEExLCAweEE4LCAweEExLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweEE4LCAweEEyLCAweENCLCAweDdDLCAweENCLCAweDdBLCAvKiAweDhDLTB4OEYgKi8KKwkweENCLCAweDc5LCAweENCLCAweDdELCAweEE4LCAweDdFLCAweENCLCAweDdFLCAvKiAweDkwLTB4OTMgKi8KKwkweEQwLCAweDZBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweENELCAweEI2LCAweEFBLCAweERDLCAweENELCAweEI1LCAweENELCAweEI3LCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweEFBLCAweERCLCAweENELCAweEJDLCAweEFBLCAweERGLCAvKiAweDlDLTB4OUYgKi8KKwkweENELCAweEIyLCAweENELCAweEMwLCAweENELCAweEM2LCAweEFBLCAweEU2LCAvKiAweEEwLTB4QTMgKi8KKwkweENELCAweEMzLCAweEFBLCAweEUzLCAweDAwLCAweDAwLCAweENELCAweEI5LCAvKiAweEE0LTB4QTcgKi8KKwkweENELCAweEJGLCAweENELCAweEMxLCAweDAwLCAweDAwLCAweENELCAweEI0LCAvKiAweEE4LTB4QUIgKi8KKwkweEFBLCAweEUyLCAweEFBLCAweERELCAweENELCAweEJBLCAweEFBLCAweEU0LCAvKiAweEFDLTB4QUYgKi8KKwkweEFBLCAweEU3LCAweEFBLCAweEUxLCAweDAwLCAweDAwLCAweEFBLCAweERBLCAvKiAweEIwLTB4QjMgKi8KKwkweENELCAweEJFLCAweENELCAweEI4LCAweENELCAweEM1LCAweEFBLCAweEU5LCAvKiAweEI0LTB4QjcgKi8KKwkweEFBLCAweEU1LCAweEFBLCAweEUwLCAweENELCAweEJELCAweEFGLCAweEVDLCAvKiAweEI4LTB4QkIgKi8KKwkweENELCAweEJCLCAweEFBLCAweERFLCAweEFBLCAweEU4LCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweENELCAweEIzLCAweDAwLCAweDAwLCAweENELCAweEMyLCAweENELCAweEM0LCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweEFELCAweDYyLCAweEFELCAweDVDLCAweEFELCAweDY0LCAvKiAweEQwLTB4RDMgKi8KKwkweEFELCAweDYxLCAweEQwLCAweDcxLCAweEQwLCAweDc0LCAweEFELCAweDVELCAvKiAweEQ0LTB4RDcgKi8KKwkweDAwLCAweDAwLCAweEQwLCAweDZCLCAweDAwLCAweDAwLCAweEFELCAweDU2LCAvKiAweEQ4LTB4REIgKi8KKwkweEFELCAweDYwLCAweDAwLCAweDAwLCAweEFELCAweDYzLCAweEFELCAweDY1LCAvKiAweERDLTB4REYgKi8KKwkweEQwLCAweEEyLCAweEQwLCAweDc3LCAweDAwLCAweDAwLCAweEFELCAweDU1LCAvKiAweEUwLTB4RTMgKi8KKwkweEQwLCAweEExLCAweEFELCAweDU5LCAweEFELCAweDU3LCAweEFELCAweDUyLCAvKiAweEU0LTB4RTcgKi8KKwkweEQwLCAweDZGLCAweDAwLCAweDAwLCAweEQwLCAweDdFLCAweEQwLCAweDczLCAvKiAweEU4LTB4RUIgKi8KKwkweEQwLCAweDc2LCAweEQwLCAweEE1LCAweDAwLCAweDAwLCAweEFELCAweDY2LCAvKiAweEVDLTB4RUYgKi8KKwkweEQwLCAweDdELCAweEFELCAweDVFLCAweEQwLCAweDc4LCAweEQwLCAweEE0LCAvKiAweEYwLTB4RjMgKi8KKwkweEQwLCAweDc1LCAweEQwLCAweDc5LCAweEQwLCAweDdDLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweEQwLCAweDZELCAweEQwLCAweEEzLCAweEQwLCAweDdCLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQwLCAweDZDLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184M1s1MTJdID0geworCTB4RDAsIDB4NzAsIDB4QUQsIDB4NUYsIDB4QUQsIDB4NUEsIDB4QUQsIDB4NTMsIC8qIDB4MDAtMHgwMyAqLworCTB4QUQsIDB4NTgsIDB4QUQsIDB4NTQsIDB4QUQsIDB4NjcsIDB4RDAsIDB4NkUsIC8qIDB4MDQtMHgwNyAqLworCTB4RDMsIDB4QTUsIDB4QUQsIDB4NUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4RDAsIDB4N0EsIDB4Q0UsIDB4NDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDMsIDB4QTgsIDB4QUYsIDB4RkEsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4RDMsIDB4NzYsIDB4MDAsIDB4MDAsIDB4RDMsIDB4QTMsIC8qIDB4MTgtMHgxQiAqLworCTB4RDMsIDB4N0QsIDB4MDAsIDB4MDAsIDB4RDMsIDB4QjIsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4RDMsIDB4QUEsIDB4MDAsIDB4MDAsIDB4RDMsIDB4N0UsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4RDMsIDB4QTksIDB4RDMsIDB4NzgsIDB4RDMsIDB4N0MsIDB4RDMsIDB4QjUsIC8qIDB4MjQtMHgyNyAqLworCTB4QUYsIDB4RkQsIDB4RDMsIDB4QUQsIDB4RDMsIDB4QTQsIDB4QUYsIDB4RUQsIC8qIDB4MjgtMHgyQiAqLworCTB4RDMsIDB4QjMsIDB4RDMsIDB4NzQsIDB4MDAsIDB4MDAsIDB4RDMsIDB4QUMsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4QUYsIDB4RkMsIDB4QUYsIDB4RjcsIDB4RDMsIDB4NzMsIC8qIDB4MzAtMHgzMyAqLworCTB4QUYsIDB4RjUsIDB4QUYsIDB4RjQsIDB4QUYsIDB4RjksIDB4RDMsIDB4QUIsIC8qIDB4MzQtMHgzNyAqLworCTB4QUYsIDB4RjEsIDB4QUYsIDB4RjgsIDB4RDAsIDB4NzIsIDB4REIsIDB4NUMsIC8qIDB4MzgtMHgzQiAqLworCTB4RDMsIDB4QTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDMsIDB4N0EsIC8qIDB4M0MtMHgzRiAqLworCTB4QUYsIDB4RkIsIDB4RDMsIDB4N0IsIDB4RDMsIDB4QTEsIDB4QUYsIDB4RkUsIC8qIDB4NDAtMHg0MyAqLworCTB4RDMsIDB4NzUsIDB4RDMsIDB4QUYsIDB4MDAsIDB4MDAsIDB4RDMsIDB4QUUsIC8qIDB4NDQtMHg0NyAqLworCTB4RDMsIDB4QjYsIDB4QUYsIDB4RjMsIDB4QUYsIDB4RjAsIDB4RDMsIDB4QjQsIC8qIDB4NDgtMHg0QiAqLworCTB4RDMsIDB4QjAsIDB4RDMsIDB4QTcsIDB4RDMsIDB4QTIsIDB4QUYsIDB4RjYsIC8qIDB4NEMtMHg0RiAqLworCTB4QUYsIDB4RjIsIDB4RDMsIDB4NzcsIDB4QUYsIDB4RUUsIDB4RDMsIDB4QjEsIC8qIDB4NTAtMHg1MyAqLworCTB4QUYsIDB4RUYsIDB4MDAsIDB4MDAsIDB4RDMsIDB4NzksIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDcsIDB4NUUsIC8qIDB4NzAtMHg3MyAqLworCTB4RDcsIDB4NjAsIDB4RDcsIDB4NjUsIDB4RDcsIDB4NzksIDB4QjIsIDB4RkMsIC8qIDB4NzQtMHg3NyAqLworCTB4QjIsIDB4RjIsIDB4MDAsIDB4MDAsIDB4RDcsIDB4NUQsIDB4QjIsIDB4RkQsIC8qIDB4NzgtMHg3QiAqLworCTB4QjIsIDB4RkUsIDB4RDcsIDB4NjgsIDB4RDcsIDB4NkYsIDB4RDcsIDB4NzUsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4RDcsIDB4NjIsIDB4MDAsIDB4MDAsIDB4RDcsIDB4NjksIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjMsIDB4NDAsIDB4RDcsIDB4NzcsIC8qIDB4ODQtMHg4NyAqLworCTB4RDcsIDB4NzIsIDB4QjIsIDB4RkEsIDB4QjIsIDB4RjgsIDB4RDcsIDB4NkUsIC8qIDB4ODgtMHg4QiAqLworCTB4RDcsIDB4NkEsIDB4RDcsIDB4NUMsIDB4QjIsIDB4RUYsIDB4RDcsIDB4NjEsIC8qIDB4OEMtMHg4RiAqLworCTB4RDcsIDB4NTksIDB4MDAsIDB4MDAsIDB4QjIsIDB4RjcsIDB4QjIsIDB4RjksIC8qIDB4OTAtMHg5MyAqLworCTB4RDcsIDB4NjYsIDB4RDcsIDB4NjMsIDB4QjIsIDB4RjQsIDB4RDcsIDB4NzMsIC8qIDB4OTQtMHg5NyAqLworCTB4QjIsIDB4RjEsIDB4RDcsIDB4NjQsIDB4RDcsIDB4N0EsIDB4RDcsIDB4NkMsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4RDcsIDB4NkIsIDB4QjIsIDB4RjAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4QjIsIDB4RkIsIDB4MDAsIDB4MDAsIDB4QjIsIDB4RjMsIDB4RDcsIDB4NUEsIC8qIDB4QTAtMHhBMyAqLworCTB4RDcsIDB4NUYsIDB4RDcsIDB4NzAsIDB4RDcsIDB4NzYsIDB4QjMsIDB4NDEsIC8qIDB4QTQtMHhBNyAqLworCTB4RDcsIDB4NUIsIDB4RDcsIDB4NjcsIDB4RDcsIDB4NkQsIDB4QjIsIDB4RjYsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDcsIDB4NzgsIDB4RDcsIDB4NzEsIC8qIDB4QUMtMHhBRiAqLworCTB4RDcsIDB4NzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4QjIsIDB4RjUsIDB4MDAsIDB4MDAsIDB4REIsIDB4NkMsIC8qIDB4QkMtMHhCRiAqLworCTB4REIsIDB4NjAsIDB4QjUsIDB4RDcsIDB4REIsIDB4N0QsIDB4REIsIDB4QTcsIC8qIDB4QzAtMHhDMyAqLworCTB4REIsIDB4QUEsIDB4QjUsIDB4RDUsIDB4REIsIDB4NjgsIDB4REIsIDB4QTMsIC8qIDB4QzQtMHhDNyAqLworCTB4REIsIDB4NjksIDB4REIsIDB4NzcsIDB4QjUsIDB4RTIsIDB4REIsIDB4NzMsIC8qIDB4QzgtMHhDQiAqLworCTB4QjUsIDB4REYsIDB4MDAsIDB4MDAsIDB4REIsIDB4NzQsIDB4REIsIDB4NUQsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4REIsIDB4QTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4QjUsIDB4RTgsIDB4REIsIDB4QTEsIDB4REIsIDB4NzUsIDB4REIsIDB4QUMsIC8qIDB4RDQtMHhENyAqLworCTB4REIsIDB4NzAsIDB4REYsIDB4QzgsIDB4MDAsIDB4MDAsIDB4REIsIDB4QUYsIC8qIDB4RDgtMHhEQiAqLworCTB4QjUsIDB4RTYsIDB4REIsIDB4NkUsIDB4REIsIDB4N0EsIDB4QjUsIDB4RTksIC8qIDB4REMtMHhERiAqLworCTB4QjUsIDB4RDQsIDB4REIsIDB4NzIsIDB4REIsIDB4QUQsIDB4REIsIDB4NkIsIC8qIDB4RTAtMHhFMyAqLworCTB4REIsIDB4NjQsIDB4REIsIDB4NkYsIDB4MDAsIDB4MDAsIDB4REIsIDB4NjMsIC8qIDB4RTQtMHhFNyAqLworCTB4REIsIDB4NjEsIDB4QjUsIDB4RDAsIDB4REIsIDB4QTUsIDB4REIsIDB4NkEsIC8qIDB4RTgtMHhFQiAqLworCTB4REIsIDB4QTgsIDB4MDAsIDB4MDAsIDB4REIsIDB4QTksIDB4QjUsIDB4RDgsIC8qIDB4RUMtMHhFRiAqLworCTB4QjUsIDB4REQsIDB4QjUsIDB4RDksIDB4QjUsIDB4RTEsIDB4REIsIDB4N0UsIC8qIDB4RjAtMHhGMyAqLworCTB4QjUsIDB4REEsIDB4REIsIDB4NzYsIDB4REIsIDB4NjYsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4QjUsIDB4RDIsIDB4REIsIDB4NUUsIDB4REIsIDB4QTIsIDB4REIsIDB4QUIsIC8qIDB4RjgtMHhGQiAqLworCTB4REIsIDB4NjUsIDB4QjUsIDB4RTAsIDB4REIsIDB4QjAsIDB4REIsIDB4NzEsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzg0WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHhEQiwgMHg2RCwgMHgwMCwgMHgwMCwgMHhCNSwgMHhEMSwgLyogMHgwMC0weDAzICovCisJMHhCNSwgMHhFNSwgMHgwMCwgMHgwMCwgMHhEQiwgMHg3QywgMHhCNSwgMHhFNywgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHhEQiwgMHg3OCwgMHhCNSwgMHhEQywgMHhCNSwgMHhENiwgLyogMHgwOC0weDBCICovCisJMHhCNSwgMHhERSwgMHhCNSwgMHhEMywgMHhCNSwgMHhFNCwgMHhEQiwgMHg3OSwgLyogMHgwQy0weDBGICovCisJMHhEQiwgMHg2NywgMHhEQiwgMHg3QiwgMHhEQiwgMHg2MiwgMHhEQiwgMHhBNiwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQiwgMHhBRSwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQiwgMHg1RiwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHhERiwgMHhDNywgMHgwMCwgMHgwMCwgMHhERiwgMHhERCwgLyogMHgyOC0weDJCICovCisJMHhCOCwgMHg1NSwgMHhERiwgMHhDQywgMHgwMCwgMHgwMCwgMHhERiwgMHhDQSwgLyogMHgyQy0weDJGICovCisJMHhERiwgMHhCNSwgMHhCOCwgMHhBOSwgMHhERiwgMHhDNSwgMHhERiwgMHhEOSwgLyogMHgzMC0weDMzICovCisJMHhERiwgMHhDMSwgMHhCOCwgMHhCMSwgMHhERiwgMHhEOCwgMHhERiwgMHhCRiwgLyogMHgzNC0weDM3ICovCisJMHhCNSwgMHhFMywgMHhERiwgMHhDRiwgMHhERiwgMHhDMCwgMHhERiwgMHhENiwgLyogMHgzOC0weDNCICovCisJMHhCOCwgMHhCMCwgMHhCOCwgMHhBOCwgMHgwMCwgMHgwMCwgMHhERiwgMHhBQSwgLyogMHgzQy0weDNGICovCisJMHhERiwgMHhCMiwgMHgwMCwgMHgwMCwgMHhERiwgMHhDQiwgMHhERiwgMHhDMywgLyogMHg0MC0weDQzICovCisJMHhERiwgMHhEQywgMHhERiwgMHhDNiwgMHhCOCwgMHhCNiwgMHhERiwgMHhENywgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHhCOCwgMHhBRCwgMHgwMCwgMHgwMCwgMHhERiwgMHhDOSwgLyogMHg0OC0weDRCICovCisJMHhERiwgMHhEMSwgMHhERiwgMHhCNiwgMHhERiwgMHhEMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHhERiwgMHhFMSwgMHhERiwgMHhCMSwgMHhERiwgMHhEMiwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHhERiwgMHhERiwgMHgwMCwgMHgwMCwgMHhERiwgMHhBQiwgMHhCNSwgMHhEQiwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhERiwgMHhCOSwgMHhERiwgMHhCOCwgMHhCOCwgMHhBRiwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHhERiwgMHhCQywgMHhERiwgMHhCRSwgMHhERiwgMHhDRCwgLyogMHg1Qy0weDVGICovCisJMHhERiwgMHhERSwgMHhCOCwgMHhCMiwgMHgwMCwgMHgwMCwgMHhCOCwgMHhCMywgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHhERiwgMHhCMCwgMHhCOCwgMHhBQiwgMHhERiwgMHhCNCwgLyogMHg2NC0weDY3ICovCisJMHhERiwgMHhEQSwgMHhCOCwgMHhCNCwgMHgwMCwgMHgwMCwgMHhCOCwgMHhBQywgLyogMHg2OC0weDZCICovCisJMHhCOCwgMHhBRSwgMHhCOCwgMHhCNSwgMHhERiwgMHhFMCwgMHhERiwgMHhEMywgLyogMHg2Qy0weDZGICovCisJMHhERiwgMHhDRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERiwgMHhCQiwgLyogMHg3MC0weDczICovCisJMHhERiwgMHhCQSwgMHhCOCwgMHhBQSwgMHhERiwgMHhBQywgMHhCOCwgMHhBNywgLyogMHg3NC0weDc3ICovCisJMHhERiwgMHhDNCwgMHhERiwgMHhBRCwgMHhERiwgMHhDMiwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHhERiwgMHhCNywgMHhERiwgMHhEQiwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCOCwgMHhBNiwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhERiwgMHhCMywgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHhERiwgMHhBRiwgMHhERiwgMHhENSwgMHhERiwgMHhBRSwgLyogMHg4Qy0weDhGICovCisJMHhCQiwgMHg2MCwgMHhFMywgMHhEMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHhFMywgMHhDMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHhBQywgLyogMHg5NC0weDk3ICovCisJMHhFMywgMHhDQSwgMHhCQiwgMHg1OCwgMHhFMywgMHhCQiwgMHhFMywgMHhDNSwgLyogMHg5OC0weDlCICovCisJMHhCQiwgMHg1QiwgMHhFMywgMHhCRSwgMHhCQiwgMHg1OSwgMHhFMywgMHhBRiwgLyogMHg5Qy0weDlGICovCisJMHhFMywgMHhDRCwgMHhFMywgMHhBRSwgMHhFMywgMHhDMSwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHhFMywgMHhBRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHhCRiwgLyogMHhBNC0weEE3ICovCisJMHhFMywgMHhDOCwgMHhFMywgMHhDNiwgMHhFMywgMHhCQSwgMHhFMywgMHhCNSwgLyogMHhBOC0weEFCICovCisJMHhFMywgMHhCMywgMHgwMCwgMHgwMCwgMHhFMywgMHhCNCwgMHhFMywgMHhDNywgLyogMHhBQy0weEFGICovCisJMHhFMywgMHhEMiwgMHhFMywgMHhCQywgMHhCQiwgMHg1QSwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHhFMywgMHhCNywgMHgwMCwgMHgwMCwgMHhFMywgMHhDQiwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHhCQiwgMHg1RCwgMHhFMywgMHhCNiwgMHhFMywgMHhCMCwgMHhFMywgMHhDMCwgLyogMHhCOC0weEJCICovCisJMHhCQiwgMHg2MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQiwgMHg1NSwgLyogMHhCQy0weEJGICovCisJMHhCQiwgMHg1RSwgMHhFMywgMHhCOCwgMHhFMywgMHhCMiwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHhCQiwgMHg1NywgMHhERiwgMHhENCwgMHhCQiwgMHg1NiwgMHhFMywgMHhDMywgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHhCQiwgMHg1NCwgMHhCQiwgMHg2MywgMHhCQiwgMHg1QywgLyogMHhDOC0weENCICovCisJMHhFMywgMHhDNCwgMHhFMywgMHhCOSwgMHhFMywgMHhCMSwgMHhFMywgMHhDQywgLyogMHhDQy0weENGICovCisJMHhFMywgMHhCRCwgMHhCQiwgMHg2MiwgMHhFMywgMHhEMCwgMHhCQiwgMHg1RiwgLyogMHhEMC0weEQzICovCisJMHhFMywgMHhDRiwgMHgwMCwgMHgwMCwgMHhFMywgMHhDOSwgMHhFMywgMHhDRSwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHhEMSwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHg3MywgLyogMHhFNC0weEU3ICovCisJMHhFNywgMHg3NCwgMHhFNywgMHg2NywgMHhFNywgMHg2NiwgMHhFNywgMHg2MiwgLyogMHhFOC0weEVCICovCisJMHhCRCwgMHhCNCwgMHgwMCwgMHgwMCwgMHhCRCwgMHhBQywgMHhFNywgMHg3NiwgLyogMHhFQy0weEVGICovCisJMHhFNywgMHg3NSwgMHhERiwgMHhBOSwgMHhFNywgMHg1RiwgMHhFNywgMHg2MywgLyogMHhGMC0weEYzICovCisJMHhFNywgMHg1RCwgMHgwMCwgMHgwMCwgMHhFNywgMHg3MCwgMHhFNywgMHg2MSwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHhFNywgMHg3NywgMHhFNywgMHg1QSwgMHhFNywgMHg1OCwgLyogMHhGOC0weEZCICovCisJMHhFNywgMHg2NCwgMHhFNywgMHg2RSwgMHhFNywgMHg2OSwgMHhCRCwgMHhCNiwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfODVbNTEyXSA9IHsKKwkweEU3LCAweDRGLCAweDAwLCAweDAwLCAweEU3LCAweDZELCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJELCAweEI3LCAweERGLCAweEJELCAvKiAweDA0LTB4MDcgKi8KKwkweEU3LCAweDVCLCAweEU3LCAweDUyLCAweEU3LCAweDU1LCAweEU3LCAweDdCLCAvKiAweDA4LTB4MEIgKi8KKwkweEU3LCAweDVDLCAweEU3LCAweDUzLCAweEU3LCAweDUxLCAweEU3LCAweDRFLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweEJELCAweEIwLCAweEU3LCAweDY1LCAweEJELCAweEFGLCAvKiAweDEwLTB4MTMgKi8KKwkweEJELCAweEIzLCAweEU3LCAweDYwLCAweEU3LCAweDY4LCAweEJELCAweEE5LCAvKiAweDE0LTB4MTcgKi8KKwkweEU3LCAweDc4LCAweEU3LCAweDdDLCAweEJELCAweEFCLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweEU3LCAweDU3LCAweEU3LCAweDZCLCAweEU3LCAweDZGLCAweEU3LCAweDU0LCAvKiAweDFDLTB4MUYgKi8KKwkweEU3LCAweDc5LCAweEJELCAweEIyLCAweDAwLCAweDAwLCAweEJELCAweEIxLCAvKiAweDIwLTB4MjMgKi8KKwkweEU3LCAweDRDLCAweEJELCAweEI1LCAweEU3LCAweDcyLCAweEU3LCAweDU2LCAvKiAweDI0LTB4MjcgKi8KKwkweEU3LCAweDZBLCAweEU3LCAweDUwLCAweEU3LCAweDVFLCAweEU3LCAweDU5LCAvKiAweDI4LTB4MkIgKi8KKwkweEJELCAweEFELCAweEJELCAweEFFLCAweEU3LCAweDZDLCAweEU3LCAweDdELCAvKiAweDJDLTB4MkYgKi8KKwkweEU3LCAweDdBLCAweEU3LCAweDcxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweDRELCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweEJELCAweEFBLCAweEVCLCAweDQ5LCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweEVCLCAweDQwLCAweEVCLCAweDQzLCAweDAwLCAweDAwLCAweEJGLCAweEJCLCAvKiAweDQwLTB4NDMgKi8KKwkweEVCLCAweDQ1LCAweEVBLCAweEY5LCAweEVCLCAweDQxLCAweEVCLCAweDQ3LCAvKiAweDQ0LTB4NDcgKi8KKwkweEJGLCAweEI4LCAweEJGLCAweEJDLCAweEJGLCAweEI2LCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweEVBLCAweEZCLCAweEVCLCAweDRDLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweEVCLCAweDQ2LCAweDAwLCAweDAwLCAweEVBLCAweEZDLCAvKiAweDUwLTB4NTMgKi8KKwkweEVCLCAweDU1LCAweEVCLCAweDRGLCAweEVBLCAweEY4LCAweEVFLCAweDQ2LCAvKiAweDU0LTB4NTcgKi8KKwkweEVBLCAweEZFLCAweEJGLCAweEI3LCAweDAwLCAweDAwLCAweEVCLCAweDRBLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweEVCLCAweDU0LCAweEJGLCAweEJGLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweEVCLCAweDUxLCAweEVBLCAweEZELCAweEVCLCAweDQ0LCAweEVCLCAweDQ4LCAvKiAweDYwLTB4NjMgKi8KKwkweEVCLCAweDQyLCAweEVCLCAweDU2LCAweEVCLCAweDUzLCAweEVCLCAweDUwLCAvKiAweDY0LTB4NjcgKi8KKwkweEJGLCAweEI5LCAweEJGLCAweEJBLCAweEJGLCAweEJFLCAweEVBLCAweEZBLCAvKiAweDY4LTB4NkIgKi8KKwkweEVCLCAweDU3LCAweEJGLCAweEJELCAweEVCLCAweDRELCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweEVCLCAweDRCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweEVCLCAweDRFLCAweEVFLCAweDUzLCAweEVFLCAweDQwLCAvKiAweDc0LTB4NzcgKi8KKwkweEVFLCAweDQ1LCAweEVFLCAweDUyLCAweEVFLCAweDQ0LCAweEVELCAweEZCLCAvKiAweDc4LTB4N0IgKi8KKwkweEVFLCAweDQxLCAweDAwLCAweDAwLCAweEMxLCAweEEyLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEVELCAweEY0LCAweEVFLCAweDRELCAweEVFLCAweDRGLCAweEVELCAweEYzLCAvKiAweDgwLTB4ODMgKi8KKwkweEMxLCAweEExLCAweEVFLCAweDUxLCAweEVFLCAweDQ5LCAweEMxLCAweEE4LCAvKiAweDg0LTB4ODcgKi8KKwkweEVFLCAweDUwLCAweEVFLCAweDQyLCAweEMxLCAweEFBLCAweEVELCAweEY5LCAvKiAweDg4LTB4OEIgKi8KKwkweEVCLCAweDUyLCAweEVFLCAweDRBLCAweEVFLCAweDQ3LCAweEVELCAweEY1LCAvKiAweDhDLTB4OEYgKi8KKwkweEVFLCAweDU1LCAweEMxLCAweEE0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweEMxLCAweEE1LCAweEVELCAweEY3LCAweEVFLCAweDQ4LCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweEVFLCAweDU0LCAweEVFLCAweDRCLCAweEVELCAweEZELCAweEMxLCAweEE3LCAvKiAweDk4LTB4OUIgKi8KKwkweEMxLCAweEEzLCAweEVFLCAweDRDLCAweEVELCAweEZFLCAweEVFLCAweDU2LCAvKiAweDlDLTB4OUYgKi8KKwkweEVELCAweEY4LCAweEVFLCAweDQzLCAweEVFLCAweDRFLCAweEVELCAweEZBLCAvKiAweEEwLTB4QTMgKi8KKwkweEVELCAweEZDLCAweDAwLCAweDAwLCAweEMyLCAweENCLCAweEVELCAweEY2LCAvKiAweEE0LTB4QTcgKi8KKwkweEMxLCAweEE5LCAweEMyLCAweEM0LCAweEMxLCAweDdFLCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMxLCAweEE2LCAvKiAweEFDLTB4QUYgKi8KKwkweEMyLCAweEM4LCAweEYwLCAweEIzLCAweDAwLCAweDAwLCAweEYwLCAweEE5LCAvKiAweEIwLTB4QjMgKi8KKwkweEYwLCAweEE0LCAweEYwLCAweEFBLCAweEYwLCAweEI0LCAweEYwLCAweEI4LCAvKiAweEI0LTB4QjcgKi8KKwkweEYwLCAweEI3LCAweEMyLCAweENBLCAweEMyLCAweEM5LCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweEYwLCAweEFCLCAweEYwLCAweEI5LCAweEYwLCAweEFFLCAvKiAweEJDLTB4QkYgKi8KKwkweEYwLCAweEE2LCAweDAwLCAweDAwLCAweEYwLCAweEE4LCAweEYwLCAweEE3LCAvKiAweEMwLTB4QzMgKi8KKwkweEYwLCAweEFELCAweEYwLCAweEIyLCAweEYwLCAweEE1LCAweEYwLCAweEFDLCAvKiAweEM0LTB4QzcgKi8KKwkweEYwLCAweEIxLCAweEMyLCAweEM3LCAweDAwLCAweDAwLCAweEYwLCAweEFGLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweEMyLCAweEM1LCAweEYwLCAweEIwLCAweEMyLCAweEMzLCAvKiAweENDLTB4Q0YgKi8KKwkweEMyLCAweEM2LCAweEYyLCAweEQ1LCAweEYwLCAweEI1LCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweEMzLCAweEMyLCAweDAwLCAweDAwLCAweEYyLCAweENELCAvKiAweEQ0LTB4RDcgKi8KKwkweEYyLCAweEQxLCAweEYyLCAweEM5LCAweEYyLCAweENDLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweEYyLCAweEQ0LCAweEMzLCAweEMwLCAweEYyLCAweEQ5LCAweEYyLCAweEQyLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweEYyLCAweENBLCAweEYyLCAweERBLCAweEYyLCAweEQzLCAvKiAweEUwLTB4RTMgKi8KKwkweEMzLCAweEMzLCAweEMzLCAweEM0LCAweEYyLCAweEQ3LCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweEYyLCAweENCLCAweEMzLCAweEJGLCAweEMzLCAweEMxLCAweEYyLCAweEM2LCAvKiAweEU4LTB4RUIgKi8KKwkweEYyLCAweENFLCAweEYyLCAweEM4LCAweDAwLCAweDAwLCAweEYyLCAweEQ4LCAvKiAweEVDLTB4RUYgKi8KKwkweEYyLCAweEQ2LCAweEYyLCAweEM3LCAweEYyLCAweENGLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY0LCAweEJFLCAweEMzLCAweEM1LCAvKiAweEY0LTB4RjcgKi8KKwkweEYyLCAweEQwLCAweEM0LCAweEE3LCAweEM0LCAweEE5LCAweEM0LCAweEE2LCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweEY0LCAweEMzLCAweEY0LCAweEJCLCAweEY0LCAweEI5LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184Nls1MTJdID0geworCTB4RjQsIDB4QkQsIDB4RjQsIDB4QkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4RjQsIDB4QkYsIDB4RjQsIDB4QzEsIDB4QzQsIDB4QUEsIDB4QzQsIDB4QUMsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4RjQsIDB4QzAsIDB4QzQsIDB4QUQsIDB4QzQsIDB4QUIsIC8qIDB4MDgtMHgwQiAqLworCTB4RjQsIDB4QzIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4QzQsIDB4QTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzQsIDB4RjQsIC8qIDB4MTQtMHgxNyAqLworCTB4RjUsIDB4RjEsIDB4RjUsIDB4RjcsIDB4QzQsIDB4RjYsIDB4RjQsIDB4QkMsIC8qIDB4MTgtMHgxQiAqLworCTB4RjUsIDB4RjYsIDB4MDAsIDB4MDAsIDB4RjUsIDB4RkQsIDB4RjUsIDB4RjQsIC8qIDB4MUMtMHgxRiAqLworCTB4RjUsIDB4RkIsIDB4RjUsIDB4RkEsIDB4RjQsIDB4QjgsIDB4RjUsIDB4RjUsIC8qIDB4MjAtMHgyMyAqLworCTB4RjAsIDB4QjYsIDB4RjUsIDB4RkUsIDB4RjUsIDB4RjMsIDB4RjUsIDB4RjgsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4RjUsIDB4RkMsIDB4RjUsIDB4RjIsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4RjcsIDB4NEEsIDB4QzQsIDB4RjUsIDB4RjUsIDB4RjksIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4RjcsIDB4RjQsIDB4RjcsIDB4NEIsIDB4RjcsIDB4NDksIC8qIDB4MzAtMHgzMyAqLworCTB4RjcsIDB4NDcsIDB4RjcsIDB4NDgsIDB4RjcsIDB4NEMsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4QzUsIDB4RDksIDB4RjcsIDB4RjIsIDB4RjcsIDB4RjAsIDB4RjcsIDB4RjUsIC8qIDB4MzgtMHgzQiAqLworCTB4RjcsIDB4RjMsIDB4MDAsIDB4MDAsIDB4RjcsIDB4RjYsIDB4QzUsIDB4REEsIC8qIDB4M0MtMHgzRiAqLworCTB4RjcsIDB4RjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjgsIDB4QkMsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjksIDB4NDUsIDB4RjksIDB4NDYsIC8qIDB4NDQtMHg0NyAqLworCTB4RjksIDB4NDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjksIDB4QzcsIC8qIDB4NDgtMHg0QiAqLworCTB4RjksIDB4QkQsIDB4Q0EsIDB4NEYsIDB4QUEsIDB4RUEsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4QUQsIDB4NjgsIDB4MDAsIDB4MDAsIDB4RDMsIDB4QjgsIDB4RDMsIDB4QjcsIC8qIDB4NTAtMHg1MyAqLworCTB4QjAsIDB4NDAsIDB4QjMsIDB4NDIsIDB4RDcsIDB4N0MsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4RDcsIDB4N0IsIDB4MDAsIDB4MDAsIDB4QjUsIDB4RUEsIC8qIDB4NTgtMHg1QiAqLworCTB4QjgsIDB4QjgsIDB4MDAsIDB4MDAsIDB4QjgsIDB4QjcsIDB4QjgsIDB4QjksIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4RTMsIDB4RDQsIDB4RTcsIDB4N0UsIDB4RUIsIDB4NTgsIC8qIDB4NjAtMHg2MyAqLworCTB4RUIsIDB4NUEsIDB4RUIsIDB4NTksIDB4MDAsIDB4MDAsIDB4QzEsIDB4QUIsIC8qIDB4NjQtMHg2NyAqLworCTB4RUUsIDB4NTcsIDB4RjAsIDB4QkEsIDB4RjksIDB4QTUsIDB4QTYsIDB4RTQsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4Q0QsIDB4QzksIDB4Q0QsIDB4Q0EsIDB4Q0QsIDB4QzgsIC8qIDB4NkMtMHg2RiAqLworCTB4Q0QsIDB4QzcsIDB4QUEsIDB4RUIsIDB4MDAsIDB4MDAsIDB4RDAsIDB4QTksIC8qIDB4NzAtMHg3MyAqLworCTB4RDAsIDB4QTcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDAsIDB4QTYsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4QUQsIDB4NjksIDB4QUQsIDB4NkIsIDB4QUQsIDB4NkEsIC8qIDB4NzgtMHg3QiAqLworCTB4RDAsIDB4QTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4RDMsIDB4QzQsIDB4RDMsIDB4QzEsIDB4RDMsIDB4QkYsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjAsIDB4NDEsIDB4RDMsIDB4QzIsIC8qIDB4ODgtMHg4QiAqLworCTB4QjAsIDB4NDYsIDB4RDMsIDB4QkMsIDB4RDMsIDB4Q0IsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4RDMsIDB4Q0QsIDB4RDMsIDB4QkQsIDB4MDAsIDB4MDAsIDB4QjAsIDB4NDMsIC8qIDB4OTAtMHg5MyAqLworCTB4RDMsIDB4Q0UsIDB4RDMsIDB4QzksIDB4RDMsIDB4QkIsIDB4RDMsIDB4QzAsIC8qIDB4OTQtMHg5NyAqLworCTB4RDMsIDB4Q0EsIDB4RDMsIDB4QzYsIDB4RDMsIDB4QzMsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4QjAsIDB4NDgsIDB4RDMsIDB4Q0MsIDB4RDMsIDB4QkUsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4RDMsIDB4QzcsIDB4RDMsIDB4QjksIDB4QjAsIDB4NDcsIC8qIDB4QTAtMHhBMyAqLworCTB4QjAsIDB4NDQsIDB4RDMsIDB4QzUsIDB4MDAsIDB4MDAsIDB4RDMsIDB4QzgsIC8qIDB4QTQtMHhBNyAqLworCTB4RDMsIDB4QkEsIDB4QjAsIDB4NDUsIDB4QjAsIDB4NDIsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjMsIDB4NEMsIC8qIDB4QUMtMHhBRiAqLworCTB4RDcsIDB4QTUsIDB4QjMsIDB4NEIsIDB4MDAsIDB4MDAsIDB4RDcsIDB4QTgsIC8qIDB4QjAtMHhCMyAqLworCTB4RDcsIDB4QUIsIDB4QjMsIDB4NDgsIDB4QjMsIDB4NDYsIDB4RDcsIDB4N0UsIC8qIDB4QjQtMHhCNyAqLworCTB4RDcsIDB4QTksIDB4RDcsIDB4QTcsIDB4RDcsIDB4QTQsIDB4RDcsIDB4QUMsIC8qIDB4QjgtMHhCQiAqLworCTB4RDcsIDB4QUQsIDB4RDcsIDB4QUYsIDB4RDcsIDB4QjAsIDB4RDcsIDB4N0QsIC8qIDB4QkMtMHhCRiAqLworCTB4QjMsIDB4NDUsIDB4RDcsIDB4QTIsIDB4RDcsIDB4QTEsIDB4RDcsIDB4QUUsIC8qIDB4QzAtMHhDMyAqLworCTB4QjMsIDB4NDcsIDB4RDcsIDB4QTMsIDB4QjMsIDB4NDksIDB4QjMsIDB4NDQsIC8qIDB4QzQtMHhDNyAqLworCTB4RDcsIDB4QTYsIDB4QjMsIDB4NEQsIDB4MDAsIDB4MDAsIDB4QjMsIDB4NEEsIC8qIDB4QzgtMHhDQiAqLworCTB4RDcsIDB4QUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4QjUsIDB4RjEsIDB4REIsIDB4QkYsIDB4MDAsIDB4MDAsIDB4REIsIDB4QjQsIC8qIDB4RDAtMHhEMyAqLworCTB4QjUsIDB4RUUsIDB4MDAsIDB4MDAsIDB4REYsIDB4RTcsIDB4REIsIDB4QkQsIC8qIDB4RDQtMHhENyAqLworCTB4REIsIDB4QjEsIDB4QjUsIDB4RUMsIDB4REIsIDB4QjYsIDB4QjUsIDB4RUYsIC8qIDB4RDgtMHhEQiAqLworCTB4REIsIDB4QkEsIDB4REIsIDB4QjgsIDB4QjUsIDB4RjIsIDB4QjUsIDB4RUIsIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REIsIDB4QjIsIDB4REIsIDB4QjUsIC8qIDB4RTAtMHhFMyAqLworCTB4QjUsIDB4RjAsIDB4MDAsIDB4MDAsIDB4REIsIDB4QjMsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4REIsIDB4QkUsIDB4REIsIDB4QkMsIDB4REIsIDB4QjcsIDB4REIsIDB4QjksIC8qIDB4RTgtMHhFQiAqLworCTB4REIsIDB4QkIsIDB4QjUsIDB4RUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4REYsIDB4RTgsIDB4REYsIDB4RUUsIDB4REYsIDB4RTQsIC8qIDB4RjQtMHhGNyAqLworCTB4REYsIDB4RUEsIDB4QjgsIDB4QkEsIDB4REYsIDB4RTYsIDB4QjgsIDB4QzAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjgsIDB4QkYsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzg3WzUxMl0gPSB7CisJMHhCOCwgMHhCRSwgMHhERiwgMHhFRCwgMHhCOCwgMHhDMSwgMHhCOCwgMHhDMiwgLyogMHgwMC0weDAzICovCisJMHhERiwgMHhFMywgMHhERiwgMHhGMCwgMHhCOCwgMHhDMywgMHhCOCwgMHhCRCwgLyogMHgwNC0weDA3ICovCisJMHhCOCwgMHhCQywgMHhERiwgMHhFQywgMHhCOCwgMHhDNCwgMHhERiwgMHhFMiwgLyogMHgwOC0weDBCICovCisJMHhERiwgMHhFNSwgMHhERiwgMHhFRiwgMHhERiwgMHhFQiwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHhFMywgMHhGNCwgMHhFMywgMHhFOSwgMHhCOCwgMHhCQiwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHhCQiwgMHg2QSwgMHhFMywgMHhERCwgMHhFMywgMHhGMiwgMHhFMywgMHhERSwgLyogMHgxOC0weDFCICovCisJMHhCQiwgMHg2NSwgMHgwMCwgMHgwMCwgMHhFMywgMHhEQiwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHhFMywgMHhFNCwgMHhFMywgMHhEQywgMHhCQiwgMHg2NywgMHhFMywgMHhENiwgLyogMHgyMC0weDIzICovCisJMHhFMywgMHhGMSwgMHhCQiwgMHg2OCwgMHhFMywgMHhFRSwgMHhFMywgMHhFRiwgLyogMHgyNC0weDI3ICovCisJMHhFMywgMHhENywgMHhCQiwgMHg2RCwgMHhFMywgMHhFNiwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHhFMywgMHhFMCwgMHhFMywgMHhFNywgMHhFMywgMHhEQSwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHhFMywgMHhGMywgMHhFMywgMHhFQiwgMHhFMywgMHhFNSwgMHhFMywgMHhENSwgLyogMHgzMC0weDMzICovCisJMHhCQiwgMHg2OSwgMHhFMywgMHhFQywgMHgwMCwgMHgwMCwgMHhCQiwgMHg2QywgLyogMHgzNC0weDM3ICovCisJMHhFMywgMHhGMCwgMHgwMCwgMHgwMCwgMHhFMywgMHhFQSwgMHhCQiwgMHg2NiwgLyogMHgzOC0weDNCICovCisJMHhFMywgMHhFOCwgMHgwMCwgMHgwMCwgMHhFMywgMHhFMiwgMHhCQiwgMHg2NCwgLyogMHgzQy0weDNGICovCisJMHhFMywgMHhEOSwgMHhFMywgMHhFMSwgMHhFMywgMHhFRCwgMHhFMywgMHhERiwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMywgMHhFMywgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHhCRCwgMHhDMSwgMHhERiwgMHhFOSwgMHhFNywgMHhCMiwgMHhFNywgMHhCQiwgLyogMHg0Qy0weDRGICovCisJMHhFNywgMHhCMSwgMHhFNywgMHhBRCwgMHhFNywgMHhBQSwgMHhCRCwgMHhDMiwgLyogMHg1MC0weDUzICovCisJMHhFNywgMHhBOCwgMHhCQiwgMHg2QiwgMHhFNywgMHhBMSwgMHhCRCwgMHhDMCwgLyogMHg1NC0weDU3ICovCisJMHhFNywgMHhBNywgMHhCRCwgMHhCRiwgMHhFNywgMHhBQywgMHhFNywgMHhBOSwgLyogMHg1OC0weDVCICovCisJMHhFNywgMHhCOSwgMHhFNywgMHhCNCwgMHhFNywgMHhBRSwgMHhFNywgMHhCMywgLyogMHg1Qy0weDVGICovCisJMHhCRCwgMHhCQiwgMHhFNywgMHhBQiwgMHhFNywgMHhCRSwgMHhFNywgMHhBMiwgLyogMHg2MC0weDYzICovCisJMHhFNywgMHhBMywgMHhFNywgMHhCQSwgMHhCRCwgMHhCQywgMHhFNywgMHhCRiwgLyogMHg2NC0weDY3ICovCisJMHhCRCwgMHhCRSwgMHhFNywgMHhDMCwgMHhFNywgMHhCMCwgMHhFMywgMHhEOCwgLyogMHg2OC0weDZCICovCisJMHhFNywgMHhCNiwgMHhFNywgMHhBRiwgMHhFNywgMHhCOCwgMHhFNywgMHhCNSwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNywgMHhBNiwgLyogMHg3MC0weDczICovCisJMHhCRCwgMHhCOSwgMHhFNywgMHhCRCwgMHhCRCwgMHhCQSwgMHhFNywgMHhBNCwgLyogMHg3NC0weDc3ICovCisJMHhCRCwgMHhCRCwgMHhFQiwgMHg2NCwgMHhFNywgMHhCNywgMHhFNywgMHhCQywgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHhFQiwgMHg2MSwgMHhCRCwgMHhCOCwgMHhCRiwgMHhDMCwgLyogMHg4MC0weDgzICovCisJMHhFQiwgMHg2QiwgMHhFQiwgMHg2NywgMHgwMCwgMHgwMCwgMHhFQiwgMHg2NSwgLyogMHg4NC0weDg3ICovCisJMHhFQiwgMHg2MCwgMHhFQiwgMHg2RiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHhCRiwgMHhDNCwgMHgwMCwgMHgwMCwgMHhFQiwgMHg1QywgLyogMHg4Qy0weDhGICovCisJMHhFQiwgMHg2OCwgMHhFQiwgMHg2OSwgMHhFQiwgMHg1RiwgMHhFQiwgMHg1RSwgLyogMHg5MC0weDkzICovCisJMHhFQiwgMHg2QywgMHgwMCwgMHgwMCwgMHhFQiwgMHg2MiwgMHhFQiwgMHg1RCwgLyogMHg5NC0weDk3ICovCisJMHhFQiwgMHg2MywgMHgwMCwgMHgwMCwgMHhFQiwgMHg2RSwgMHhFQiwgMHg1QiwgLyogMHg5OC0weDlCICovCisJMHhFQiwgMHg2RCwgMHhFQiwgMHg2QSwgMHhCRiwgMHhDMiwgMHhCRiwgMHhDMSwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCRiwgMHhDMywgMHhFQiwgMHg2NiwgLyogMHhBMC0weEEzICovCisJMHhGMCwgMHhDQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHg1OSwgMHhDMSwgMHhCMSwgLyogMHhBOC0weEFCICovCisJMHhFRSwgMHg1RCwgMHhFRSwgMHg1QSwgMHhFRSwgMHg2MSwgMHhFRSwgMHg2NywgLyogMHhBQy0weEFGICovCisJMHhFRSwgMHg1QywgMHgwMCwgMHgwMCwgMHhFRSwgMHg3MCwgMHhDMSwgMHhBRSwgLyogMHhCMC0weEIzICovCisJMHhFRSwgMHg2QSwgMHhFRSwgMHg1RiwgMHhFRSwgMHg2QiwgMHhFRSwgMHg2NiwgLyogMHhCNC0weEI3ICovCisJMHhFRSwgMHg2RCwgMHhFRSwgMHg1RSwgMHhDMSwgMHhCMywgMHhDMSwgMHhCMiwgLyogMHhCOC0weEJCICovCisJMHhFRSwgMHg2MCwgMHhFRSwgMHg2RSwgMHhFRSwgMHg1OCwgMHhFRSwgMHg2QywgLyogMHhCQy0weEJGICovCisJMHhDMSwgMHhBQywgMHgwMCwgMHgwMCwgMHhFRSwgMHg2NCwgMHhFRSwgMHg2MywgLyogMHhDMC0weEMzICovCisJMHhFRSwgMHg2OCwgMHhFRSwgMHg1QiwgMHhDMSwgMHhCMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHhDMSwgMHhCNCwgMHhFRSwgMHg2MiwgMHhFRSwgMHg2OSwgMHhDMSwgMHhCNSwgLyogMHhDOC0weENCICovCisJMHhFRSwgMHg2NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHhDMSwgMHhBRCwgMHhDMSwgMHhBRiwgMHhGMCwgMHhDNywgLyogMHhEMC0weEQzICovCisJMHhGMCwgMHhDNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMCwgMHhDQywgLyogMHhENC0weEQ3ICovCisJMHhGMCwgMHhDOSwgMHhGMCwgMHhDRCwgMHgwMCwgMHgwMCwgMHhGMCwgMHhCRSwgLyogMHhEOC0weERCICovCisJMHhGMCwgMHhDNiwgMHhGMCwgMHhEMSwgMHhFRSwgMHg2RiwgMHhGMCwgMHhDMiwgLyogMHhEQy0weERGICovCisJMHhDMiwgMHhDRiwgMHhFNywgMHhBNSwgMHhGMCwgMHhCRCwgMHhGMCwgMHhDQSwgLyogMHhFMC0weEUzICovCisJMHhGMCwgMHhDNCwgMHhGMCwgMHhDMSwgMHhGMCwgMHhCQywgMHhGMCwgMHhCQiwgLyogMHhFNC0weEU3ICovCisJMHhGMCwgMHhEMCwgMHgwMCwgMHgwMCwgMHhGMCwgMHhDMCwgMHhGMCwgMHhCRiwgLyogMHhFOC0weEVCICovCisJMHhDMiwgMHhDRCwgMHhGMCwgMHhDOCwgMHgwMCwgMHgwMCwgMHhDMiwgMHhDQywgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMiwgMHhDRSwgMHhGMCwgMHhDMywgLyogMHhGMC0weEYzICovCisJMHhGMCwgMHhDRiwgMHgwMCwgMHgwMCwgMHhGMiwgMHhERSwgMHhGMiwgMHhERiwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHhDMywgMHhDOSwgMHhGMiwgMHhEQywgMHhDMywgMHhDNiwgLyogMHhGOC0weEZCICovCisJMHhGMiwgMHhFNCwgMHgwMCwgMHgwMCwgMHhDMywgMHhDQSwgMHhGMiwgMHhFNiwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfODhbNTEyXSA9IHsKKwkweEYyLCAweERCLCAweEYwLCAweENFLCAweEYyLCAweEU4LCAweEYyLCAweERELCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweEMzLCAweEM3LCAweEYyLCAweEUzLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweEYyLCAweEU1LCAweEYyLCAweEUwLCAweEYyLCAweEU3LCAweEYyLCAweEUyLCAvKiAweDA4LTB4MEIgKi8KKwkweEYyLCAweEUxLCAweEMzLCAweEM4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweEY0LCAweEM1LCAweEY0LCAweEM2LCAweDAwLCAweDAwLCAweEY0LCAweEM4LCAvKiAweDEwLTB4MTMgKi8KKwkweEM0LCAweEFFLCAweEM0LCAweEFGLCAweEY0LCAweEM5LCAweEY0LCAweEM3LCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweEY0LCAweEM0LCAweDAwLCAweDAwLCAweEY2LCAweDQyLCAvKiAweDE4LTB4MUIgKi8KKwkweEY2LCAweDQ1LCAweEY2LCAweDQxLCAweDAwLCAweDAwLCAweEM0LCAweEZBLCAvKiAweDFDLTB4MUYgKi8KKwkweEY2LCAweDQzLCAweEM0LCAweEY5LCAweEM0LCAweEY4LCAweEM0LCAweEY3LCAvKiAweDIwLTB4MjMgKi8KKwkweEY2LCAweDQ0LCAweEY3LCAweDUxLCAweEY3LCAweDRGLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweEY3LCAweDRFLCAweEY2LCAweDQwLCAweEY3LCAweDUwLCAweEY2LCAweDQ2LCAvKiAweDI4LTB4MkIgKi8KKwkweEY3LCAweDRELCAweDAwLCAweDAwLCAweEY3LCAweEY5LCAweEY3LCAweEQ3LCAvKiAweDJDLTB4MkYgKi8KKwkweEY3LCAweEY3LCAweEM1LCAweERCLCAweEY3LCAweEY4LCAweEY3LCAweEZBLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweEY4LCAweEJGLCAweEM1LCAweEZBLCAweEY4LCAweEJFLCAvKiAweDM0LTB4MzcgKi8KKwkweEY4LCAweEJELCAweEM1LCAweEZCLCAweDAwLCAweDAwLCAweEM2LCAweDVBLCAvKiAweDM4LTB4M0IgKi8KKwkweEY5LCAweDZFLCAweEY5LCAweEE3LCAweEY5LCAweEE2LCAweEY5LCAweEE4LCAvKiAweDNDLTB4M0YgKi8KKwkweEE2LCAweEU1LCAweEQwLCAweEFBLCAweDAwLCAweDAwLCAweEQzLCAweENGLCAvKiAweDQwLTB4NDMgKi8KKwkweEQzLCAweEQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweERCLCAweEMwLCAweDAwLCAweDAwLCAweEY2LCAweDQ3LCAweEY4LCAweEMwLCAvKiAweDQ4LTB4NEIgKi8KKwkweEE2LCAweEU2LCAweEFELCAweDZDLCAweEQwLCAweEFCLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ3LCAweEIxLCAweEIzLCAweDRFLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweERCLCAweEMyLCAweERCLCAweEMxLCAweEI1LCAweEYzLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweEI4LCAweEM1LCAweEU3LCAweEMxLCAweEJELCAweEMzLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweEJELCAweEM0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweDAwLCAweDAwLCAweEJGLCAweEM1LCAweEM1LCAweEZDLCAweEE2LCAweEU3LCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQwLCAweEFDLCAvKiAweDY0LTB4NjcgKi8KKwkweEFBLCAweEVELCAweEQwLCAweEFFLCAweEQwLCAweEFELCAweEFELCAweDZELCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweEQzLCAweEQxLCAweDAwLCAweDAwLCAweEQzLCAweEQ4LCAvKiAweDZDLTB4NkYgKi8KKwkweEIwLCAweDQ5LCAweEQzLCAweEQ2LCAweEQzLCAweEQ0LCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweEQzLCAweERCLCAweEQzLCAweEQyLCAweEQzLCAweEQzLCAweEIwLCAweDRBLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweEIwLCAweDRFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweEQzLCAweERDLCAweEIwLCAweDRELCAweEQzLCAweERBLCAweEQzLCAweEQ3LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEQzLCAweEQ1LCAweEIwLCAweDRCLCAweEIwLCAweDRDLCAweEQzLCAweEQ5LCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweEIzLCAweDUwLCAweEQ3LCAweEIyLCAweDAwLCAweDAwLCAweEIzLCAweDU1LCAvKiAweDg4LTB4OEIgKi8KKwkweEQ3LCAweEMyLCAweEIzLCAweDU0LCAweEQ3LCAweEM0LCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweEQ3LCAweEI4LCAweEIzLCAweDUyLCAweEQ3LCAweEMzLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweEQ3LCAweEIzLCAweEIzLCAweDUzLCAweEQ3LCAweEJGLCAvKiAweDk0LTB4OTcgKi8KKwkweEQ3LCAweEJCLCAweEQ3LCAweEJELCAweEQ3LCAweEI3LCAweEQ3LCAweEJFLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIzLCAweDRGLCAweEQ3LCAweEJBLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweEQ3LCAweEI5LCAweEQ3LCAweEI1LCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweEQ3LCAweEMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ3LCAweEJDLCAvKiAweEE0LTB4QTcgKi8KKwkweEQ3LCAweEI0LCAweDAwLCAweDAwLCAweEQ3LCAweEI2LCAweEIzLCAweDUxLCAvKiAweEE4LTB4QUIgKi8KKwkweEQ3LCAweEMxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweEI1LCAweEY2LCAweERCLCAweENELCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERCLCAweEM5LCAweERCLCAweENCLCAvKiAweEI0LTB4QjcgKi8KKwkweERCLCAweEM2LCAweERCLCAweEM1LCAweERCLCAweEMzLCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweERCLCAweENBLCAweERCLCAweENDLCAweERCLCAweEM4LCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweERCLCAweEM3LCAweEI1LCAweEY0LCAweEI1LCAweEY1LCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweERCLCAweENGLCAweEI4LCAweENELCAweERGLCAweEYyLCAvKiAweEM4LTB4Q0IgKi8KKwkweERGLCAweEY4LCAweERGLCAweEYzLCAweERGLCAweEY0LCAweEY5LCAweEQ4LCAvKiAweENDLTB4Q0YgKi8KKwkweERGLCAweEY5LCAweDAwLCAweDAwLCAweEI4LCAweENGLCAweDAwLCAweDAwLCAvKiAweEQwLTB4RDMgKi8KKwkweEI4LCAweEM3LCAweEI4LCAweENFLCAweERGLCAweEYxLCAweERCLCAweEM0LCAvKiAweEQ0LTB4RDcgKi8KKwkweEI4LCAweENBLCAweEI4LCAweEM4LCAweERGLCAweEY3LCAweERGLCAweEY2LCAvKiAweEQ4LTB4REIgKi8KKwkweEI4LCAweEM5LCAweEI4LCAweENCLCAweERGLCAweEY1LCAweEI4LCAweEM2LCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweEI4LCAweENDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUzLCAweEY2LCAvKiAweEU0LTB4RTcgKi8KKwkweEJCLCAweDc0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweDQyLCAvKiAweEU4LTB4RUIgKi8KKwkweEU0LCAweDQxLCAweDAwLCAweDAwLCAweEUzLCAweEZCLCAweEJCLCAweDc2LCAvKiAweEVDLTB4RUYgKi8KKwkweEU0LCAweDQwLCAweEUzLCAweEY3LCAweEUzLCAweEY4LCAweEJCLCAweDZFLCAvKiAweEYwLTB4RjMgKi8KKwkweEJCLCAweDcwLCAweDAwLCAweDAwLCAweEUzLCAweEZELCAweEUzLCAweEY1LCAvKiAweEY0LTB4RjcgKi8KKwkweEJCLCAweDcyLCAweEJCLCAweDcxLCAweEUzLCAweEY5LCAweEUzLCAweEZFLCAvKiAweEY4LTB4RkIgKi8KKwkweEUzLCAweEZDLCAweEJCLCAweDczLCAweEUzLCAweEZBLCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184OVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4REIsIDB4Q0UsIDB4QkIsIDB4NkYsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4RTcsIDB4QzIsIDB4RTcsIDB4QzksIDB4QkQsIDB4QzYsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4RTcsIDB4Q0QsIDB4QkQsIDB4Q0EsIDB4RTcsIDB4QzUsIC8qIDB4MDgtMHgwQiAqLworCTB4RTcsIDB4QzMsIDB4MDAsIDB4MDAsIDB4RTcsIDB4Q0MsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4QkQsIDB4QzUsIDB4RTcsIDB4Q0IsIDB4QkQsIDB4QzcsIDB4QkQsIDB4QzgsIC8qIDB4MTAtMHgxMyAqLworCTB4RTcsIDB4QzQsIDB4QkQsIDB4QzksIDB4RTcsIDB4Q0EsIDB4RTcsIDB4QzYsIC8qIDB4MTQtMHgxNyAqLworCTB4RTcsIDB4QzcsIDB4RTcsIDB4QzgsIDB4QkIsIDB4NzUsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUIsIDB4NzAsIDB4RUIsIDB4N0MsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4QkYsIDB4Q0EsIDB4RUIsIDB4NzcsIDB4RUIsIDB4NzksIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4QkYsIDB4QzgsIDB4RUIsIDB4NzEsIDB4RUIsIDB4NzUsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4RUIsIDB4NzgsIDB4QkYsIDB4QzYsIDB4QkYsIDB4QzksIC8qIDB4MjgtMHgyQiAqLworCTB4RUIsIDB4N0IsIDB4RUIsIDB4NzMsIDB4RUIsIDB4NzQsIDB4RUIsIDB4N0EsIC8qIDB4MkMtMHgyRiAqLworCTB4RUIsIDB4NzIsIDB4RUIsIDB4NzYsIDB4QkYsIDB4QzcsIDB4RUUsIDB4NzIsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4NzEsIDB4QzEsIDB4QjcsIDB4RUUsIDB4NzcsIC8qIDB4MzQtMHgzNyAqLworCTB4QzEsIDB4QjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzEsIDB4QjYsIC8qIDB4MzgtMHgzQiAqLworCTB4RUUsIDB4NzMsIDB4QzEsIDB4QkEsIDB4RUUsIDB4NzQsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4NzUsIDB4RUUsIDB4NzgsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4QzEsIDB4QjgsIDB4MDAsIDB4MDAsIDB4RjAsIDB4RDYsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4RjAsIDB4RDksIDB4MDAsIDB4MDAsIDB4RjAsIDB4RDMsIC8qIDB4NDgtMHg0QiAqLworCTB4RjAsIDB4RDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjAsIDB4RDQsIC8qIDB4NEMtMHg0RiAqLworCTB4RjAsIDB4RDcsIDB4RjAsIDB4RDgsIDB4RUUsIDB4NzYsIDB4RjAsIDB4RDIsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzMsIDB4Q0QsIDB4RjIsIDB4RUMsIC8qIDB4NTQtMHg1NyAqLworCTB4RjIsIDB4RUYsIDB4RjIsIDB4RjEsIDB4RjIsIDB4RUEsIDB4RjIsIDB4RUIsIC8qIDB4NTgtMHg1QiAqLworCTB4RjIsIDB4RUUsIDB4RjIsIDB4RjAsIDB4QzMsIDB4Q0UsIDB4QzMsIDB4Q0MsIC8qIDB4NUMtMHg1RiAqLworCTB4QzMsIDB4Q0IsIDB4RjIsIDB4RUQsIDB4RjIsIDB4RTksIDB4RjQsIDB4Q0EsIC8qIDB4NjAtMHg2MyAqLworCTB4QzQsIDB4QjAsIDB4MDAsIDB4MDAsIDB4RjQsIDB4Q0IsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4RjYsIDB4NDksIDB4QzQsIDB4RkIsIDB4RjYsIDB4NEIsIC8qIDB4NjgtMHg2QiAqLworCTB4QzQsIDB4RkMsIDB4RjYsIDB4NDgsIDB4RjYsIDB4NEEsIDB4QzUsIDB4QTgsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4RjcsIDB4NTIsIDB4QzUsIDB4QTcsIDB4RjcsIDB4RkQsIC8qIDB4NzAtMHg3MyAqLworCTB4RjcsIDB4RkMsIDB4MDAsIDB4MDAsIDB4RjcsIDB4RkIsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4RjksIDB4NDgsIDB4RjksIDB4NDksIDB4RjksIDB4NEIsIC8qIDB4NzgtMHg3QiAqLworCTB4RjksIDB4NEEsIDB4MDAsIDB4MDAsIDB4Q0EsIDB4NTAsIDB4QTYsIDB4RTgsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4QUQsIDB4NkUsIDB4RDcsIDB4QzUsIDB4QjUsIDB4RjcsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4REYsIDB4RkEsIDB4QzIsIDB4RDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4RjIsIDB4RjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTgsIDB4QTMsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjMsIDB4NTcsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjMsIDB4NTYsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4REIsIDB4RDAsIDB4QjUsIDB4RjgsIDB4REIsIDB4RDIsIC8qIDB4OTQtMHg5NyAqLworCTB4REIsIDB4RDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4REYsIDB4RkIsIC8qIDB4OTgtMHg5QiAqLworCTB4QjgsIDB4RDAsIDB4RTQsIDB4NDMsIDB4RTQsIDB4NDYsIDB4RTQsIDB4NDUsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4NDQsIDB4RTcsIDB4Q0UsIDB4RTcsIDB4RDAsIC8qIDB4QTAtMHhBMyAqLworCTB4RTcsIDB4Q0YsIDB4MDAsIDB4MDAsIDB4QkYsIDB4Q0MsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkYsIDB4Q0IsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4QzEsIDB4QkIsIDB4RUUsIDB4NzksIDB4RUUsIDB4N0IsIDB4RUUsIDB4N0EsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzIsIDB4RDEsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjIsIDB4RjQsIDB4RjIsIDB4RjMsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4RjQsIDB4Q0MsIDB4QzQsIDB4QjEsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4QzQsIDB4RkQsIDB4RjcsIDB4NTQsIDB4RjcsIDB4NTMsIC8qIDB4QkMtMHhCRiAqLworCTB4QzYsIDB4NUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTgsIDB4QTQsIDB4RDAsIDB4QUYsIC8qIDB4RDAtMHhEMyAqLworCTB4QUQsIDB4NkYsIDB4RDcsIDB4QzgsIDB4RDcsIDB4QzYsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4RDcsIDB4QzcsIDB4REIsIDB4RDQsIDB4REIsIDB4RDUsIC8qIDB4RDgtMHhEQiAqLworCTB4RTAsIDB4NDMsIDB4REIsIDB4RDMsIDB4MDAsIDB4MDAsIDB4REYsIDB4RkMsIC8qIDB4REMtMHhERiAqLworCTB4RTAsIDB4NDEsIDB4RTAsIDB4NDAsIDB4RTAsIDB4NDIsIDB4QjgsIDB4RDEsIC8qIDB4RTAtMHhFMyAqLworCTB4REYsIDB4RkUsIDB4REYsIDB4RkQsIDB4RTAsIDB4NDQsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4RTQsIDB4NDksIDB4RTQsIDB4NDcsIDB4MDAsIDB4MDAsIDB4RTQsIDB4NDgsIC8qIDB4RTgtMHhFQiAqLworCTB4RTcsIDB4RDMsIDB4RTcsIDB4RDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4RTcsIDB4RDIsIDB4RUIsIDB4N0QsIDB4RUUsIDB4N0MsIDB4RUUsIDB4N0QsIC8qIDB4RjAtMHhGMyAqLworCTB4QzIsIDB4RDIsIDB4MDAsIDB4MDAsIDB4RjIsIDB4RjUsIDB4RjQsIDB4Q0QsIC8qIDB4RjQtMHhGNyAqLworCTB4QzQsIDB4QjIsIDB4MDAsIDB4MDAsIDB4RjYsIDB4NEMsIDB4RjcsIDB4NTUsIC8qIDB4RjgtMHhGQiAqLworCTB4QzUsIDB4QTksIDB4MDAsIDB4MDAsIDB4RjcsIDB4RkUsIDB4RjksIDB4NEMsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzhBWzUxMl0gPSB7CisJMHhBOCwgMHhBNSwgMHgwMCwgMHgwMCwgMHhBRCwgMHg3MSwgMHhBRCwgMHg3MiwgLyogMHgwMC0weDAzICovCisJMHhEMCwgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMCwgMHhCMSwgLyogMHgwNC0weDA3ICovCisJMHhBRCwgMHg3MCwgMHgwMCwgMHgwMCwgMHhCMCwgMHg1NCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHhCMCwgMHg1MiwgMHgwMCwgMHgwMCwgMHhCMCwgMHg1MSwgMHhCMCwgMHg1OCwgLyogMHgwQy0weDBGICovCisJMHhCMCwgMHg1MCwgMHhCMCwgMHg1OSwgMHhEMywgMHhERCwgMHhCMCwgMHg1NiwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHhCMCwgMHg1MywgMHhCMCwgMHg1NywgMHhCMCwgMHg1NSwgLyogMHgxNC0weDE3ICovCisJMHhCMCwgMHg0RiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMywgMHg1RiwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHhCMywgMHg1OSwgMHhENywgMHhDQywgMHhCMywgMHg1RSwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMywgMHg2MCwgMHhCMywgMHg1QSwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhCMywgMHg1QiwgMHgwMCwgMHgwMCwgMHhENywgMHhDQSwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMywgMHg1OCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHhENywgMHhDQiwgMHhCMywgMHg1RCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHhENywgMHhDOSwgMHhCMywgMHg1QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHhCNiwgMHg0NCwgMHgwMCwgMHgwMCwgMHhCNiwgMHg0NiwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHhEQiwgMHhEOCwgMHhCNiwgMHg0NSwgMHhCNSwgMHhGOSwgLyogMHgzOC0weDNCICovCisJMHhCNSwgMHhGRCwgMHgwMCwgMHgwMCwgMHhCOCwgMHhFNCwgMHhFMCwgMHg0OSwgLyogMHgzQy0weDNGICovCisJMHhEQiwgMHhEQSwgMHhCNSwgMHhGRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHhEQiwgMHhERCwgMHhEQiwgMHhERSwgMHhCNiwgMHg0MywgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHhEQiwgMHhFMCwgMHgwMCwgMHgwMCwgMHhEQiwgMHhFMiwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHhEQiwgMHhFMywgMHhEQiwgMHhENywgMHhEQiwgMHhENiwgMHhEQiwgMHhFNCwgLyogMHg0Qy0weDRGICovCisJMHhCNiwgMHg0MiwgMHhEQiwgMHhFMSwgMHhEQiwgMHhERiwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHhCNiwgMHg0MCwgMHhCNSwgMHhGQiwgMHhCNiwgMHg0NywgMHhEQiwgMHhEQiwgLyogMHg1NC0weDU3ICovCisJMHhEQiwgMHhEQywgMHhEQiwgMHhEOSwgMHgwMCwgMHgwMCwgMHhCNiwgMHg0MSwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCNSwgMHhGQywgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHhCNSwgMHhGQSwgMHhFMCwgMHg0OCwgMHhCOCwgMHhERiwgMHhCOCwgMHhEQSwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCOCwgMHhENSwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHhCOCwgMHhFNSwgMHhCOCwgMHhENiwgMHgwMCwgMHgwMCwgMHhCOCwgMHhEMiwgLyogMHg2OC0weDZCICovCisJMHhCOCwgMHhFMSwgMHhCOCwgMHhERSwgMHhCOCwgMHhFMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHhCOCwgMHhENywgMHhCOCwgMHhEQywgMHhCOCwgMHhEMywgMHhCOCwgMHhENCwgLyogMHg3MC0weDczICovCisJMHhFMCwgMHg1MCwgMHhFMCwgMHg0RCwgMHhFMCwgMHg0NSwgMHhFMCwgMHg0QSwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHhCOCwgMHhFMiwgMHhFMCwgMHg1MSwgMHhCOCwgMHhFMywgLyogMHg3OC0weDdCICovCisJMHhCOCwgMHhEOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFMCwgMHg0NywgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHhFMCwgMHg0RiwgMHhFMCwgMHg0QiwgMHhFMCwgMHg0RSwgLyogMHg4MC0weDgzICovCisJMHhFMCwgMHg0QywgMHhCOCwgMHhERCwgMHhFMCwgMHg0NiwgMHhCOCwgMHhEOCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHg0QywgLyogMHg4OC0weDhCICovCisJMHhCQiwgMHg3OCwgMHhCQiwgMHg3QiwgMHgwMCwgMHgwMCwgMHhFNCwgMHg0RSwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHhCQiwgMHhBNSwgMHhFNCwgMHg0RCwgMHhCQiwgMHg3RCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHhCRCwgMHhDRiwgMHhFNCwgMHg0RiwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHhCQiwgMHhBNCwgMHhFNCwgMHg0QiwgMHhCQiwgMHhBNiwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQiwgMHg3OSwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHhCOCwgMHhEQiwgMHhCQiwgMHg3QywgMHgwMCwgMHgwMCwgMHhCQiwgMHg3QSwgLyogMHhBMC0weEEzICovCisJMHhCQiwgMHg3RSwgMHhCQiwgMHhBMiwgMHhCQiwgMHg3NywgMHhCQiwgMHhBNywgLyogMHhBNC0weEE3ICovCisJMHhCQiwgMHhBMywgMHgwMCwgMHgwMCwgMHhCQiwgMHhBMSwgMHhFNCwgMHg0QSwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHhCRCwgMHhENiwgMHgwMCwgMHgwMCwgMHhCRCwgMHhEMiwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCRCwgMHhEOSwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHhFNywgMHhENiwgMHhCRCwgMHhEQSwgMHhFNywgMHhFMiwgMHhFNywgMHhEQiwgLyogMHhCOC0weEJCICovCisJMHhCRCwgMHhDQiwgMHhFNywgMHhFMywgMHhFNywgMHhERCwgMHhCRCwgMHhENSwgLyogMHhCQy0weEJGICovCisJMHhFNywgMHhERSwgMHgwMCwgMHgwMCwgMHhCRCwgMHhENCwgMHhFNywgMHhFMSwgLyogMHhDMC0weEMzICovCisJMHhCRCwgMHhDRSwgMHhFNywgMHhERiwgMHhFNywgMHhENSwgMHhCRCwgMHhDRCwgLyogMHhDNC0weEM3ICovCisJMHhFQiwgMHhBQSwgMHhCRCwgMHhEMywgMHgwMCwgMHgwMCwgMHhCRCwgMHhEMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHhCRCwgMHhEOCwgMHgwMCwgMHgwMCwgMHhFNywgMHhENCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHhFNywgMHhEOCwgMHhCRCwgMHhDQywgMHhFNywgMHhENywgLyogMHhEMC0weEQzICovCisJMHhFNywgMHhEOSwgMHhFNywgMHhEQSwgMHhCRCwgMHhENywgMHhFNywgMHhEQywgLyogMHhENC0weEQ3ICovCisJMHhFNywgMHhFMCwgMHhFNywgMHhFNCwgMHgwMCwgMHgwMCwgMHhCRCwgMHhEQiwgLyogMHhEOC0weERCICovCisJMHhCRiwgMHhEMiwgMHhFQiwgMHhBNSwgMHhFQiwgMHhBQiwgMHhFQiwgMHhBOCwgLyogMHhEQy0weERGICovCisJMHhFQiwgMHg3RSwgMHhFQiwgMHhBQywgMHhFQiwgMHhBMSwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHhFQiwgMHhBNywgMHgwMCwgMHgwMCwgMHhCRiwgMHhDRCwgMHhCRiwgMHhEMywgLyogMHhFNC0weEU3ICovCisJMHhFQiwgMHhBRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCRiwgMHhDRiwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHhCRiwgMHhEOSwgMHhCRiwgMHhENCwgMHhFQiwgMHhBRiwgLyogMHhFQy0weEVGICovCisJMHhFQiwgMHhBOSwgMHhCRiwgMHhEMCwgMHhFQiwgMHhBMiwgMHhCRiwgMHhEQSwgLyogMHhGMC0weEYzICovCisJMHhFQiwgMHhBMywgMHhFQiwgMHhBNCwgMHhCRiwgMHhEQiwgMHhCRiwgMHhEOCwgLyogMHhGNC0weEY3ICovCisJMHhCRCwgMHhEMSwgMHgwMCwgMHgwMCwgMHhCRiwgMHhDRSwgMHhFQiwgMHhCMCwgLyogMHhGOC0weEZCICovCisJMHhCRiwgMHhEQywgMHgwMCwgMHgwMCwgMHhCRiwgMHhENSwgMHhFQiwgMHhBRSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOEJbNTEyXSA9IHsKKwkweEJGLCAweEQxLCAweEJGLCAweEQ2LCAweEJGLCAweEQ3LCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweEMxLCAweEMzLCAweEVFLCAweEE0LCAweEVFLCAweEFELCAweEVFLCAweEFBLCAvKiAweDA0LTB4MDcgKi8KKwkweEVFLCAweEFDLCAweDAwLCAweDAwLCAweEMxLCAweEMwLCAweEVFLCAweEE1LCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweEVFLCAweEFCLCAweEMxLCAweEJDLCAweEVFLCAweEE3LCAvKiAweDBDLTB4MEYgKi8KKwkweEMxLCAweEM0LCAweEVFLCAweEEzLCAweEVFLCAweEE4LCAweEVFLCAweEFGLCAvKiAweDEwLTB4MTMgKi8KKwkweEVCLCAweEE2LCAweEVFLCAweEE5LCAweEVFLCAweEEyLCAweEMxLCAweEJELCAvKiAweDE0LTB4MTcgKi8KKwkweEVFLCAweEExLCAweEMxLCAweEJFLCAweEVFLCAweEIwLCAweEMxLCAweEJGLCAvKiAweDE4LTB4MUIgKi8KKwkweEVFLCAweEFFLCAweEMxLCAweEMyLCAweEVFLCAweDdFLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweEMxLCAweEMxLCAweDAwLCAweDAwLCAweEVFLCAweEE2LCAweEYwLCAweERDLCAvKiAweDIwLTB4MjMgKi8KKwkweEYwLCAweEVBLCAweEYwLCAweEU1LCAweEYwLCAweEU3LCAweEYwLCAweERCLCAvKiAweDI0LTB4MjcgKi8KKwkweEMyLCAweEQzLCAweDAwLCAweDAwLCAweEYwLCAweERBLCAweEMyLCAweEQ2LCAvKiAweDI4LTB4MkIgKi8KKwkweEMyLCAweEQ1LCAweDAwLCAweDAwLCAweEYwLCAweEU5LCAweEYwLCAweEUxLCAvKiAweDJDLTB4MkYgKi8KKwkweEYwLCAweERFLCAweEYwLCAweEU0LCAweDAwLCAweDAwLCAweEYwLCAweERELCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweEYwLCAweERGLCAweEYwLCAweEU4LCAweEYwLCAweEU2LCAvKiAweDM0LTB4MzcgKi8KKwkweDAwLCAweDAwLCAweEMyLCAweEQ0LCAweEYwLCAweEVELCAweEYwLCAweEVCLCAvKiAweDM4LTB4M0IgKi8KKwkweEYwLCAweEUyLCAweEYwLCAweEVDLCAweEYwLCAweEUzLCAweDAwLCAweDAwLCAvKiAweDNDLTB4M0YgKi8KKwkweEYyLCAweEY5LCAweEMzLCAweENGLCAweEYzLCAweDQxLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweEY2LCAweDRGLCAweEMzLCAweEQ2LCAweEYwLCAweEUwLCAvKiAweDQ0LTB4NDcgKi8KKwkweEYyLCAweEY3LCAweEMzLCAweEQyLCAweEYyLCAweEY4LCAweEYyLCAweEZELCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMzLCAweEQ0LCAweEMzLCAweEQ1LCAvKiAweDRDLTB4NEYgKi8KKwkweEYyLCAweEY2LCAweEYzLCAweDQwLCAweEYzLCAweDQyLCAweEYyLCAweEZBLCAvKiAweDUwLTB4NTMgKi8KKwkweEYyLCAweEZDLCAweEYyLCAweEZFLCAweEYyLCAweEZCLCAweEYzLCAweDQzLCAvKiAweDU0LTB4NTcgKi8KKwkweEMzLCAweEQxLCAweEMzLCAweEQ3LCAweEMzLCAweEQzLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweEMzLCAweEQwLCAweEY0LCAweEQwLCAweDAwLCAweDAwLCAweEM0LCAweEI3LCAvKiAweDVDLTB4NUYgKi8KKwkweEY0LCAweENFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY0LCAweEQyLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweEY0LCAweEQzLCAweEM0LCAweEI1LCAweEY0LCAweEQ0LCAvKiAweDY0LTB4NjcgKi8KKwkweEY0LCAweEQxLCAweDAwLCAweDAwLCAweEY0LCAweENGLCAweEM0LCAweEI4LCAvKiAweDY4LTB4NkIgKi8KKwkweEM0LCAweEI0LCAweEY0LCAweEQ1LCAweDAwLCAweDAwLCAweEM0LCAweEI2LCAvKiAweDZDLTB4NkYgKi8KKwkweEM0LCAweEIzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweEM0LCAweEZFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEM1LCAweDQwLCAvKiAweDc0LTB4NzcgKi8KKwkweEY2LCAweDRFLCAweEY2LCAweDRELCAweEY2LCAweDUwLCAweEY2LCAweDUxLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweEM1LCAweDQxLCAweEY3LCAweDU2LCAweEY3LCAweDVCLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEM1LCAweEFBLCAweDAwLCAweDAwLCAweEY3LCAweDU4LCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweEY3LCAweDU3LCAweEY3LCAweDVBLCAweEY3LCAweDU5LCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweEY4LCAweDQzLCAweDAwLCAweDAwLCAweEM1LCAweERDLCAweEY4LCAweDQyLCAvKiAweDg4LTB4OEIgKi8KKwkweEY4LCAweDQwLCAweDAwLCAweDAwLCAweEY4LCAweDQxLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEM1LCAweEZFLCAweEM1LCAweEZELCAvKiAweDkwLTB4OTMgKi8KKwkweEY4LCAweEMxLCAweEY4LCAweEMyLCAweEM2LCAweDQwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweEY5LCAweDRELCAweEY5LCAweDRFLCAweEM2LCAweDY3LCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweEM2LCAweDZELCAweDAwLCAweDAwLCAweEY5LCAweEE5LCAweEY5LCAweEM4LCAvKiAweDlDLTB4OUYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184Q1s1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTgsIDB4QTYsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4RDcsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4RDcsIDB4Q0UsIC8qIDB4MzgtMHgzQiAqLworCTB4RTAsIDB4NTIsIDB4RTQsIDB4NTAsIDB4RTcsIDB4RTUsIDB4QzEsIDB4QzYsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4QzEsIDB4QzUsIDB4RjAsIDB4RUUsIDB4RjMsIDB4NDQsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4RjgsIDB4NDQsIDB4QTgsIDB4QTcsIDB4RDMsIDB4REUsIC8qIDB4NDQtMHg0NyAqLworCTB4QjAsIDB4NUEsIDB4QjMsIDB4NjEsIDB4RTAsIDB4NTQsIDB4RTAsIDB4NTMsIC8qIDB4NDgtMHg0QiAqLworCTB4QkQsIDB4REMsIDB4RTcsIDB4RTYsIDB4QkQsIDB4REQsIDB4RUUsIDB4QjEsIC8qIDB4NEMtMHg0RiAqLworCTB4QzIsIDB4RDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4QzYsIDB4NzYsIDB4QTgsIDB4QTgsIDB4Q0QsIDB4Q0IsIDB4RDMsIDB4REYsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjMsIDB4NjIsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4RDcsIDB4Q0YsIDB4RDcsIDB4RDAsIDB4MDAsIDB4MDAsIDB4REIsIDB4RTUsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4QjYsIDB4NDgsIDB4QjgsIDB4RTYsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4RTAsIDB4NTYsIDB4RTAsIDB4NTUsIDB4RTAsIDB4NTcsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4RTQsIDB4NTEsIDB4RTQsIDB4NTIsIDB4QkIsIDB4QTgsIDB4QkYsIDB4REQsIC8qIDB4NjgtMHg2QiAqLworCTB4QkQsIDB4REUsIDB4QkYsIDB4REUsIDB4MDAsIDB4MDAsIDB4RUUsIDB4QjUsIC8qIDB4NkMtMHg2RiAqLworCTB4RUUsIDB4QjIsIDB4RUUsIDB4QjQsIDB4RUUsIDB4QjMsIDB4QzEsIDB4QzcsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4RjAsIDB4RUYsIDB4RjMsIDB4NDYsIDB4RjMsIDB4NDUsIC8qIDB4NzQtMHg3NyAqLworCTB4Q0IsIDB4QTQsIDB4QjAsIDB4NUMsIDB4QjAsIDB4NUIsIDB4RDMsIDB4RTAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4RDcsIDB4RDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4REIsIDB4RTcsIDB4REIsIDB4RTYsIDB4QjYsIDB4NDksIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4RTAsIDB4NTksIDB4RTAsIDB4NUEsIDB4RTAsIDB4NTgsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4QjgsIDB4RTgsIDB4QjgsIDB4RTcsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4QkIsIDB4QUEsIDB4QkIsIDB4QTksIDB4MDAsIDB4MDAsIDB4RTcsIDB4RTcsIC8qIDB4OEMtMHg4RiAqLworCTB4RUIsIDB4QjMsIDB4RUIsIDB4QjEsIDB4RUIsIDB4QjIsIDB4QkYsIDB4REYsIC8qIDB4OTAtMHg5MyAqLworCTB4RUUsIDB4QjcsIDB4RUUsIDB4QjYsIDB4MDAsIDB4MDAsIDB4RjAsIDB4RjIsIC8qIDB4OTQtMHg5NyAqLworCTB4RjAsIDB4RjEsIDB4RjAsIDB4RjAsIDB4RjMsIDB4NDcsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4RjksIDB4QUEsIDB4QTgsIDB4QTksIDB4QUQsIDB4NzMsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4QUQsIDB4NzQsIDB4QjAsIDB4NUQsIDB4QjAsIDB4NUUsIDB4RDMsIDB4RTIsIC8qIDB4QTAtMHhBMyAqLworCTB4RDMsIDB4RTEsIDB4RDcsIDB4RDIsIDB4MDAsIDB4MDAsIDB4QjMsIDB4NjgsIC8qIDB4QTQtMHhBNyAqLworCTB4QjMsIDB4NjYsIDB4QjMsIDB4NjMsIDB4QjMsIDB4NjcsIDB4QjMsIDB4NjUsIC8qIDB4QTgtMHhBQiAqLworCTB4QjMsIDB4NjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjYsIDB4NEEsIC8qIDB4QUMtMHhBRiAqLworCTB4REIsIDB4RUEsIDB4MDAsIDB4MDAsIDB4QjgsIDB4RUQsIDB4QjYsIDB4NEMsIC8qIDB4QjAtMHhCMyAqLworCTB4QjYsIDB4NTEsIDB4REIsIDB4RUMsIDB4QjYsIDB4NTMsIDB4QjYsIDB4NTIsIC8qIDB4QjQtMHhCNyAqLworCTB4QjYsIDB4NTUsIDB4REIsIDB4RUIsIDB4REIsIDB4RTgsIDB4QjYsIDB4NEYsIC8qIDB4QjgtMHhCQiAqLworCTB4QjYsIDB4NEIsIDB4QjYsIDB4NEQsIDB4REIsIDB4RTksIDB4QjYsIDB4NTQsIC8qIDB4QkMtMHhCRiAqLworCTB4QjYsIDB4NTAsIDB4QjYsIDB4NEUsIDB4QjgsIDB4RUYsIDB4QjgsIDB4RUUsIC8qIDB4QzAtMHhDMyAqLworCTB4QjgsIDB4RUMsIDB4QjgsIDB4RjAsIDB4MDAsIDB4MDAsIDB4QjgsIDB4RUEsIC8qIDB4QzQtMHhDNyAqLworCTB4QjgsIDB4RUIsIDB4MDAsIDB4MDAsIDB4QjgsIDB4RTksIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4RTAsIDB4NUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4NTQsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4QkIsIDB4QUMsIDB4QkIsIDB4QUQsIDB4QkIsIDB4QUIsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4NTMsIDB4MDAsIDB4MDAsIDB4RTQsIDB4NTUsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4RTcsIDB4RUEsIDB4RTcsIDB4RUMsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4QkQsIDB4RTcsIDB4RTcsIDB4RUQsIDB4QkQsIDB4RTAsIDB4RTcsIDB4RTksIC8qIDB4REMtMHhERiAqLworCTB4QkQsIDB4REYsIDB4QkQsIDB4RTksIDB4QkQsIDB4RTUsIDB4QkQsIDB4RTYsIC8qIDB4RTAtMHhFMyAqLworCTB4QkQsIDB4RTIsIDB4RTcsIDB4RTgsIDB4QkQsIDB4RTEsIDB4RTcsIDB4RUUsIC8qIDB4RTQtMHhFNyAqLworCTB4RTcsIDB4RUIsIDB4MDAsIDB4MDAsIDB4QkQsIDB4RTgsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4QkQsIDB4RTMsIDB4QkQsIDB4RTQsIDB4RUIsIDB4QjUsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4RUIsIDB4QjcsIDB4RUIsIDB4QjYsIDB4MDAsIDB4MDAsIDB4RUIsIDB4QjgsIC8qIDB4RjAtMHhGMyAqLworCTB4QkYsIDB4RTAsIDB4RUIsIDB4QjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4QzEsIDB4Q0IsIDB4RUUsIDB4QjgsIDB4QzEsIDB4QzgsIDB4QzEsIDB4Q0MsIC8qIDB4RjgtMHhGQiAqLworCTB4QzEsIDB4Q0EsIDB4QzEsIDB4QzksIDB4RjAsIDB4RjMsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzhEWzUxMl0gPSB7CisJMHhGMCwgMHhGNiwgMHgwMCwgMHgwMCwgMHhGMCwgMHhGNSwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHhGMCwgMHhGNCwgMHhDMiwgMHhEOCwgMHhGMywgMHg0OCwgMHhGMywgMHg0OSwgLyogMHgwNC0weDA3ICovCisJMHhDMywgMHhEOCwgMHhGMywgMHg0QSwgMHhDMywgMHhEOSwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHhDNCwgMHhCQSwgMHgwMCwgMHgwMCwgMHhDNCwgMHhCOSwgLyogMHgwQy0weDBGICovCisJMHhGNiwgMHg1MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDNSwgMHg0MiwgLyogMHgxMC0weDEzICovCisJMHhGNiwgMHg1MywgMHhGNywgMHg1QywgMHhDNSwgMHhBQiwgMHhDNSwgMHhBQywgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHhGOCwgMHg0NSwgMHgwMCwgMHgwMCwgMHhDNiwgMHg0MiwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHhBOCwgMHhBQSwgMHgwMCwgMHgwMCwgMHhCMywgMHg2QSwgMHhCMywgMHg2OSwgLyogMHg2NC0weDY3ICovCisJMHhFMCwgMHg1QywgMHhFMCwgMHg1RCwgMHgwMCwgMHgwMCwgMHhCQiwgMHhBRSwgLyogMHg2OC0weDZCICovCisJMHhFQiwgMHhCOSwgMHhCRCwgMHhFQSwgMHhFQiwgMHhCQSwgMHhFRSwgMHhCOSwgLyogMHg2Qy0weDZGICovCisJMHhBOCwgMHhBQiwgMHgwMCwgMHgwMCwgMHhEMCwgMHhCMiwgMHhBRCwgMHg3NiwgLyogMHg3MC0weDczICovCisJMHhBRCwgMHg3NSwgMHgwMCwgMHgwMCwgMHhEMywgMHhFMywgMHhCMCwgMHg1RiwgLyogMHg3NC0weDc3ICovCisJMHhEMywgMHhFNCwgMHhENywgMHhENSwgMHgwMCwgMHgwMCwgMHhENywgMHhENCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHhENywgMHhEMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHhEQiwgMHhFRSwgMHhCNiwgMHg1OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHhEQiwgMHhFRCwgMHhCNiwgMHg1NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHhEQiwgMHhFRiwgMHhCNiwgMHg1NiwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHhFMCwgMHg1RiwgMHhFMCwgMHg2MiwgMHhFMCwgMHg2MCwgMHhFMCwgMHg2MSwgLyogMHg4Qy0weDhGICovCisJMHhFMCwgMHg2NSwgMHhFMCwgMHg1RSwgMHhFMCwgMHg2NiwgMHhFMCwgMHg2MywgLyogMHg5MC0weDkzICovCisJMHhFMCwgMHg2NCwgMHhCQiwgMHhCMCwgMHhFNCwgMHg1NiwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHhCQiwgMHhBRiwgMHgwMCwgMHgwMCwgMHhFNywgMHhGMiwgLyogMHg5OC0weDlCICovCisJMHhFNywgMHhGMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCRCwgMHhFQiwgLyogMHg5Qy0weDlGICovCisJMHhFNywgMHhFRiwgMHhFNywgMHhGMSwgMHgwMCwgMHgwMCwgMHhCRCwgMHhFQywgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHhFQiwgMHhCQiwgMHgwMCwgMHgwMCwgMHhFQiwgMHhCQywgLyogMHhBNC0weEE3ICovCisJMHhDMSwgMHhDRCwgMHgwMCwgMHgwMCwgMHhGMywgMHg0QywgMHhGMywgMHg0RSwgLyogMHhBOC0weEFCICovCisJMHhGMywgMHg0QiwgMHhGMywgMHg0RCwgMHhGNCwgMHhENiwgMHhGNiwgMHg1NCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOSwgMHg2RiwgMHhBOCwgMHhBQywgLyogMHhCMC0weEIzICovCisJMHhBRCwgMHg3NywgMHhEMywgMHhFNSwgMHhEMywgMHhFNywgMHhEMywgMHhFNiwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHhENywgMHhEOCwgMHhCMywgMHg2QywgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHhENywgMHhENiwgMHgwMCwgMHgwMCwgMHhCMywgMHg2QiwgMHhENywgMHhEOSwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHhENywgMHhEQSwgMHhENywgMHhENywgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHhEQiwgMHhGQiwgMHhCNiwgMHg2MCwgMHhEQiwgMHhGMywgLyogMHhDNC0weEM3ICovCisJMHhEQiwgMHhGOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCNiwgMHg1QiwgLyogMHhDOC0weENCICovCisJMHhCNiwgMHg1RSwgMHhEQiwgMHhGMiwgMHhCNiwgMHg1OSwgMHhEQiwgMHhGNiwgLyogMHhDQy0weENGICovCisJMHhFMCwgMHg2QywgMHhCNiwgMHg1RCwgMHgwMCwgMHgwMCwgMHhEQiwgMHhGMSwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHhEQiwgMHhGNywgMHhEQiwgMHhGNCwgMHhEQiwgMHhGQSwgLyogMHhENC0weEQ3ICovCisJMHhEQiwgMHhGMCwgMHhEQiwgMHhGOCwgMHhCNiwgMHg1QywgMHhCNiwgMHg1RiwgLyogMHhEOC0weERCICovCisJMHhEQiwgMHhGNSwgMHhCNiwgMHg1QSwgMHgwMCwgMHgwMCwgMHhCOCwgMHhGMiwgLyogMHhEQy0weERGICovCisJMHhFMCwgMHg2OCwgMHhCOCwgMHhGMSwgMHhFMCwgMHg2RiwgMHhFMCwgMHg2RSwgLyogMHhFMC0weEUzICovCisJMHhCOCwgMHhGOCwgMHgwMCwgMHgwMCwgMHhCOCwgMHhGOSwgMHhFMCwgMHg3MCwgLyogMHhFNC0weEU3ICovCisJMHhCOCwgMHhGMywgMHhFMCwgMHg2RCwgMHhCOCwgMHhGNywgMHhFMCwgMHg3MiwgLyogMHhFOC0weEVCICovCisJMHhFMCwgMHg2OSwgMHgwMCwgMHgwMCwgMHhFMCwgMHg2QiwgMHhCOCwgMHhGNCwgLyogMHhFQy0weEVGICovCisJMHhFMCwgMHg2NywgMHhFMCwgMHg2QSwgMHhFMCwgMHg3MSwgMHhCOCwgMHhGNSwgLyogMHhGMC0weEYzICovCisJMHhFMCwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCOCwgMHhGNiwgMHgwMCwgMHgwMCwgLyogMHhGOC0weEZCICovCisJMHhCQiwgMHhCMSwgMHhFNCwgMHg1QiwgMHhFNCwgMHg2MSwgMHhFNCwgMHg1OSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOEVbNTEyXSA9IHsKKwkweEU0LCAweDYyLCAweDAwLCAweDAwLCAweEU0LCAweDU4LCAweEU0LCAweDVELCAvKiAweDAwLTB4MDMgKi8KKwkweEU0LCAweDYzLCAweEU0LCAweDYwLCAweEU0LCAweDVGLCAweEU0LCAweDVFLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweDU3LCAweEU0LCAweDVDLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweEU0LCAweDVBLCAweDAwLCAweDAwLCAweEJELCAweEYxLCAvKiAweDBDLTB4MEYgKi8KKwkweEJELCAweEVFLCAweEU3LCAweEZCLCAweEU4LCAweDQxLCAweEU4LCAweDQzLCAvKiAweDEwLTB4MTMgKi8KKwkweEU4LCAweDQwLCAweEU3LCAweEY4LCAweEU3LCAweEZBLCAweEU4LCAweDQ1LCAvKiAweDE0LTB4MTcgKi8KKwkweEU4LCAweDQyLCAweEU3LCAweEZDLCAweEU4LCAweDQ2LCAweEU3LCAweEY5LCAvKiAweDE4LTB4MUIgKi8KKwkweEU4LCAweDQ0LCAweEJELCAweEVGLCAweEJELCAweEY1LCAweEJELCAweEYzLCAvKiAweDFDLTB4MUYgKi8KKwkweEU3LCAweEYzLCAweEJELCAweEY0LCAweEJELCAweEYwLCAweEU3LCAweEY0LCAvKiAweDIwLTB4MjMgKi8KKwkweEU3LCAweEY2LCAweEU3LCAweEY1LCAweEU3LCAweEZELCAweEU3LCAweEZFLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweEJELCAweEYyLCAweDAwLCAweDAwLCAweEJELCAweEVELCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU3LCAweEY3LCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweEVCLCAweEM2LCAweEJGLCAweEUyLCAweDAwLCAweDAwLCAweEVCLCAweEJELCAvKiAweDMwLTB4MzMgKi8KKwkweEJGLCAweEUzLCAweEJGLCAweEU2LCAweEVCLCAweEMyLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweEVCLCAweEJGLCAweEJGLCAweEU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweEVCLCAweEMzLCAweEVCLCAweEM0LCAweEVCLCAweEJFLCAweEVCLCAweEM3LCAvKiAweDNDLTB4M0YgKi8KKwkweEVCLCAweEMwLCAweEVCLCAweEM1LCAweEJGLCAweEU0LCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweEJGLCAweEUxLCAweEVCLCAweEMxLCAweDAwLCAweDAwLCAweEVFLCAweEJGLCAvKiAweDQ0LTB4NDcgKi8KKwkweEMxLCAweEQwLCAweEMxLCAweENFLCAweEMxLCAweEQxLCAweEMxLCAweENGLCAvKiAweDQ4LTB4NEIgKi8KKwkweEVFLCAweEJFLCAweEVFLCAweEJCLCAweEVFLCAweEJBLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweEVFLCAweEJELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVFLCAweEJDLCAvKiAweDUwLTB4NTMgKi8KKwkweEYxLCAweDQ1LCAweEMyLCAweERFLCAweEYwLCAweEZCLCAweEYwLCAweEZBLCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweEMyLCAweEQ5LCAweEYxLCAweDQxLCAweEYxLCAweDQwLCAvKiAweDU4LTB4NUIgKi8KKwkweEYwLCAweEY3LCAweEYxLCAweDQzLCAweEYwLCAweEZDLCAweEMyLCAweERELCAvKiAweDVDLTB4NUYgKi8KKwkweEYwLCAweEY5LCAweEYxLCAweDQyLCAweEYwLCAweEY4LCAweEMyLCAweERBLCAvKiAweDYwLTB4NjMgKi8KKwkweEMyLCAweERDLCAweEYwLCAweEZELCAweEMyLCAweERCLCAweEYwLCAweEZFLCAvKiAweDY0LTB4NjcgKi8KKwkweDAwLCAweDAwLCAweEYxLCAweDQ0LCAweEYzLCAweDUyLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweEMzLCAweERFLCAweEYzLCAweDRGLCAweDAwLCAweDAwLCAweEYzLCAweDUzLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMzLCAweERCLCAweEYzLCAweDUxLCAvKiAweDcwLTB4NzMgKi8KKwkweEMzLCAweEUwLCAweDAwLCAweDAwLCAweEMzLCAweERELCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweEYzLCAweDUwLCAweDAwLCAweDAwLCAweEMzLCAweERGLCAweEYzLCAweDU0LCAvKiAweDc4LTB4N0IgKi8KKwkweEMzLCAweERBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweEM0LCAweEJDLCAweEM0LCAweEJFLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweEY0LCAweEQ5LCAweEM0LCAweEJELCAweEY0LCAweEQ3LCAweEMzLCAweERDLCAvKiAweDg0LTB4ODcgKi8KKwkweEY0LCAweEQ4LCAweEM0LCAweEJCLCAweEM1LCAweDQzLCAweEM1LCAweDQ1LCAvKiAweDg4LTB4OEIgKi8KKwkweEY2LCAweDU2LCAweEM1LCAweDQ0LCAweEY2LCAweDU1LCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweEY3LCAweDYxLCAweEM1LCAweEFELCAweEY3LCAweDYwLCAweEM1LCAweEFFLCAvKiAweDkwLTB4OTMgKi8KKwkweEY3LCAweDVFLCAweEY3LCAweDVELCAweEY3LCAweDYyLCAweEY3LCAweDYzLCAvKiAweDk0LTB4OTcgKi8KKwkweEY4LCAweDQ2LCAweDAwLCAweDAwLCAweEY3LCAweDVGLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweEY4LCAweEM2LCAweEY4LCAweEMzLCAweEY4LCAweEM0LCAvKiAweDlDLTB4OUYgKi8KKwkweEY4LCAweEM1LCAweEM2LCAweDVDLCAweDAwLCAweDAwLCAweEY5LCAweDUxLCAvKiAweEEwLTB4QTMgKi8KKwkweEY5LCAweDUwLCAweEY5LCAweDRGLCAweEY5LCAweDcwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweEY5LCAweEJFLCAweEY5LCAweEFCLCAweEM2LCAweDZFLCAweEE4LCAweEFELCAvKiAweEE4LTB4QUIgKi8KKwkweEIwLCAweDYwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI4LCAweEZBLCAweDAwLCAweDAwLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJELCAweEY2LCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweEVCLCAweEM4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweEMyLCAweERGLCAweDAwLCAweDAwLCAweEYzLCAweDU1LCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweEY5LCAweEFDLCAweEE4LCAweEFFLCAweEFBLCAweEVFLCAvKiAweEM4LTB4Q0IgKi8KKwkweEFELCAweDc5LCAweEFELCAweDc4LCAweDAwLCAweDAwLCAweEIwLCAweDYzLCAvKiAweENDLTB4Q0YgKi8KKwkweDAwLCAweDAwLCAweEQzLCAweEU4LCAweEIwLCAweDYxLCAweEQzLCAweEU5LCAvKiAweEQwLTB4RDMgKi8KKwkweEIwLCAweDYyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ3LCAweERGLCAvKiAweEQ0LTB4RDcgKi8KKwkweEQ3LCAweERCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEIzLCAweDZELCAvKiAweEQ4LTB4REIgKi8KKwkweEQ3LCAweERFLCAweEQ3LCAweERELCAweEQ3LCAweERDLCAweEIzLCAweDZFLCAvKiAweERDLTB4REYgKi8KKwkweEQ3LCAweEUwLCAweEQ3LCAweEUxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweERDLCAweDQzLCAweERDLCAweDQxLCAweERDLCAweDQ1LCAvKiAweEU0LTB4RTcgKi8KKwkweERDLCAweDQ2LCAweERDLCAweDRDLCAweDAwLCAweDAwLCAweERDLCAweDQ4LCAvKiAweEU4LTB4RUIgKi8KKwkweERDLCAweDRBLCAweDAwLCAweDAwLCAweERDLCAweDQyLCAweERCLCAweEZDLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweERDLCAweDQ5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEYwLTB4RjMgKi8KKwkweERDLCAweDRCLCAweERDLCAweDQ0LCAweERDLCAweDQ3LCAweERCLCAweEZELCAvKiAweEY0LTB4RjcgKi8KKwkweEI2LCAweDYyLCAweERDLCAweDQwLCAweERCLCAweEZFLCAweEI2LCAweDYxLCAvKiAweEY4LTB4RkIgKi8KKwkweEI2LCAweDYzLCAweDAwLCAweDAwLCAweEI4LCAweEZELCAweEUwLCAweDc1LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY184Rls1MTJdID0geworCTB4RTAsIDB4NzcsIDB4RTAsIDB4NzYsIDB4RTAsIDB4N0IsIDB4QjgsIDB4RkIsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4NzgsIDB4RTAsIDB4NzQsIDB4RTAsIDB4NzksIC8qIDB4MDQtMHgwNyAqLworCTB4RTAsIDB4N0EsIDB4QjgsIDB4RkMsIDB4QjgsIDB4RkUsIDB4RTAsIDB4N0MsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4NjcsIDB4RTQsIDB4NjYsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4RTQsIDB4NjQsIDB4RTQsIDB4NjUsIDB4QkIsIDB4QjMsIDB4QkIsIDB4QjUsIC8qIDB4MTAtMHgxMyAqLworCTB4QkIsIDB4QjIsIDB4QkIsIDB4QjQsIDB4RTgsIDB4NEQsIDB4RTgsIDB4NEUsIC8qIDB4MTQtMHgxNyAqLworCTB4RTgsIDB4NDksIDB4MDAsIDB4MDAsIDB4RTgsIDB4NEEsIDB4QkQsIDB4RjgsIC8qIDB4MTgtMHgxQiAqLworCTB4QkQsIDB4RkQsIDB4QkQsIDB4RjcsIDB4QkQsIDB4RkUsIDB4QkQsIDB4RjksIC8qIDB4MUMtMHgxRiAqLworCTB4RTgsIDB4NEIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4NEMsIC8qIDB4MjAtMHgyMyAqLworCTB4RTgsIDB4NDgsIDB4QkUsIDB4NDAsIDB4QkQsIDB4RkIsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4QkQsIDB4RkEsIDB4QkQsIDB4RkMsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4RTgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4RUIsIDB4Q0EsIDB4QkYsIDB4RTgsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUIsIDB4Q0MsIDB4QkYsIDB4RUEsIC8qIDB4MzAtMHgzMyAqLworCTB4RUIsIDB4Q0YsIDB4RUIsIDB4Q0IsIDB4RUIsIDB4QzksIDB4RUIsIDB4Q0UsIC8qIDB4MzQtMHgzNyAqLworCTB4QkYsIDB4RTksIDB4RUIsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4QkYsIDB4RTcsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzEsIDB4RDMsIDB4QzEsIDB4RDYsIC8qIDB4M0MtMHgzRiAqLworCTB4RUUsIDB4QzEsIDB4MDAsIDB4MDAsIDB4QzEsIDB4RDQsIDB4RUUsIDB4QzAsIC8qIDB4NDAtMHg0MyAqLworCTB4QzEsIDB4RDIsIDB4QzEsIDB4RDUsIDB4RjEsIDB4NDYsIDB4RjEsIDB4NDcsIC8qIDB4NDQtMHg0NyAqLworCTB4RjEsIDB4NDgsIDB4QzIsIDB4RTAsIDB4MDAsIDB4MDAsIDB4RjEsIDB4NDksIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4QzIsIDB4RTEsIDB4QzMsIDB4RTIsIDB4RjMsIDB4NTgsIC8qIDB4NEMtMHg0RiAqLworCTB4RjMsIDB4NTksIDB4RjMsIDB4NTcsIDB4RjMsIDB4NTYsIDB4RjMsIDB4NUEsIC8qIDB4NTAtMHg1MyAqLworCTB4QzMsIDB4RTEsIDB4RjQsIDB4REQsIDB4RjQsIDB4REIsIDB4RjQsIDB4REMsIC8qIDB4NTQtMHg1NyAqLworCTB4RjQsIDB4REUsIDB4RjQsIDB4REEsIDB4RjQsIDB4REYsIDB4RjYsIDB4NTgsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4RjYsIDB4NTksIDB4RjYsIDB4NTcsIDB4QzUsIDB4NDYsIC8qIDB4NUMtMHg1RiAqLworCTB4RjcsIDB4NjQsIDB4QzUsIDB4QUYsIDB4RjcsIDB4NjUsIDB4RjgsIDB4NDgsIC8qIDB4NjAtMHg2MyAqLworCTB4RjgsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTgsIDB4QUYsIC8qIDB4OTgtMHg5QiAqLworCTB4QjYsIDB4NjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjksIDB4NDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkIsIDB4QjYsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkYsIDB4RUMsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4QkYsIDB4RUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4QzMsIDB4RTMsIDB4QzQsIDB4N0MsIDB4QzUsIDB4NDcsIC8qIDB4QUMtMHhBRiAqLworCTB4QTgsIDB4QjAsIDB4QjAsIDB4NjQsIDB4QjksIDB4NDEsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4RjMsIDB4NUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0IsIDB4QTYsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTgsIDB4QjEsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4QTgsIDB4QjQsIDB4QTgsIDB4QjMsIDB4QTgsIDB4QjIsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4Q0IsIDB4QTUsIDB4MDAsIDB4MDAsIDB4Q0QsIDB4Q0QsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4Q0QsIDB4Q0YsIDB4QUEsIDB4RUYsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4QUEsIDB4RjEsIDB4Q0QsIDB4Q0MsIDB4Q0QsIDB4Q0UsIC8qIDB4RDAtMHhEMyAqLworCTB4QUEsIDB4RjAsIDB4Q0QsIDB4RDEsIDB4Q0QsIDB4RDAsIDB4Q0QsIDB4RDIsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4RDAsIDB4QjYsIDB4RDAsIDB4QjQsIDB4QUQsIDB4N0MsIDB4RDAsIDB4QjMsIC8qIDB4RTAtMHhFMyAqLworCTB4QUQsIDB4QTMsIDB4QUQsIDB4N0UsIDB4QUQsIDB4N0IsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4QUQsIDB4QTQsIDB4MDAsIDB4MDAsIDB4QUQsIDB4N0QsIDB4QUQsIDB4QTIsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4QUQsIDB4QTEsIDB4RDAsIDB4QjUsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4QUQsIDB4N0EsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4QjAsIDB4NkEsIDB4RDMsIDB4RUIsIDB4RDMsIDB4RjEsIDB4QjAsIDB4NjcsIC8qIDB4RjQtMHhGNyAqLworCTB4QjAsIDB4NkUsIDB4MDAsIDB4MDAsIDB4QjAsIDB4NjksIDB4RDMsIDB4RUUsIC8qIDB4RjgtMHhGQiAqLworCTB4RDMsIDB4RjAsIDB4QjAsIDB4NkMsIDB4RDMsIDB4RUEsIDB4RDMsIDB4RUQsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzkwWzUxMl0gPSB7CisJMHhCMCwgMHg2OCwgMHhCMCwgMHg2NSwgMHhEMywgMHhFQywgMHhCMCwgMHg2QiwgLyogMHgwMC0weDAzICovCisJMHhEMywgMHhFRiwgMHhCMCwgMHg2RCwgMHhCMCwgMHg2NiwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhENywgMHhFMywgLyogMHgwOC0weDBCICovCisJMHhENywgMHhFNiwgMHhCMywgMHg3MCwgMHgwMCwgMHgwMCwgMHhCMywgMHg3QSwgLyogMHgwQy0weDBGICovCisJMHhCMywgMHg3NiwgMHhENywgMHhFNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHhCMywgMHg3RSwgMHhCMywgMHg3NywgMHhCMywgMHg3QywgMHhCMywgMHg3MiwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHhCMywgMHg2RiwgMHhCMywgMHg3MSwgMHhCMywgMHg3RCwgLyogMHgxOC0weDFCICovCisJMHhENywgMHhFNSwgMHhCMywgMHg3NSwgMHhCMywgMHg3OCwgMHhCMywgMHg3NCwgLyogMHgxQy0weDFGICovCisJMHhCMywgMHg3OSwgMHhENywgMHhFNywgMHhCMywgMHg3QiwgMHhCMywgMHg3MywgLyogMHgyMC0weDIzICovCisJMHhENywgMHhFMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHhEQywgMHg0RCwgMHhCNiwgMHg2NSwgMHhEQywgMHg0RiwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHhCNiwgMHg2NywgMHhCNiwgMHg2OSwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHhEQywgMHg0RSwgMHhCNiwgMHg2NiwgMHhCNiwgMHg2QSwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHhCNiwgMHg2OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHhCOSwgMHg0NywgMHhFMCwgMHhBMywgMHhCOSwgMHg0RiwgMHhFMCwgMHg3RSwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHhCOSwgMHg1MCwgMHhCOSwgMHg0NSwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHhFMCwgMHhBMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCOSwgMHg0QSwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHhBMiwgMHhCOSwgMHg0MywgMHhCOSwgMHg0MiwgLyogMHg0OC0weDRCICovCisJMHgwMCwgMHgwMCwgMHhCOSwgMHg0RCwgMHhCOSwgMHg0QywgMHhCOSwgMHg0QiwgLyogMHg0Qy0weDRGICovCisJMHhCOSwgMHg0OSwgMHhCOSwgMHg0RSwgMHhFMCwgMHg3RCwgMHhCOSwgMHg0NCwgLyogMHg1MC0weDUzICovCisJMHhCOSwgMHg0NiwgMHhCOSwgMHg0OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHhCQiwgMHhCOCwgMHhCQiwgMHhCQiwgMHgwMCwgMHgwMCwgMHhCQiwgMHhCRiwgLyogMHg1OC0weDVCICovCisJMHhCQiwgMHhCOSwgMHhCQiwgMHhCRSwgMHhCQiwgMHhCQywgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHhCQiwgMHhCNywgMHgwMCwgMHgwMCwgMHhCQiwgMHhCRCwgMHhCQiwgMHhCQSwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFOCwgMHg1MiwgLyogMHg2NC0weDY3ICovCisJMHhCRSwgMHg0MywgMHhCRSwgMHg0MSwgMHgwMCwgMHgwMCwgMHhFOCwgMHg1MywgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHhCRSwgMHg0NCwgMHhCRSwgMHg0MiwgMHhFOCwgMHg1MSwgLyogMHg2Qy0weDZGICovCisJMHhFOCwgMHg1MCwgMHgwMCwgMHgwMCwgMHhCRiwgMHhGMCwgMHhFOCwgMHg0RiwgLyogMHg3MC0weDczICovCisJMHhCRiwgMHhFRSwgMHhCRiwgMHhFRCwgMHhFQiwgMHhEMCwgMHhCRSwgMHg0NSwgLyogMHg3NC0weDc3ICovCisJMHhCRiwgMHhFRiwgMHhFQiwgMHhEMSwgMHhCRiwgMHhGMiwgMHhFQiwgMHhEMiwgLyogMHg3OC0weDdCICovCisJMHhCRiwgMHhGMSwgMHhDMSwgMHhEOCwgMHhFRSwgMHhDMywgMHhDMSwgMHhENywgLyogMHg3Qy0weDdGICovCisJCisJMHhDMSwgMHhEQywgMHhDMSwgMHhEQSwgMHhDMSwgMHhEQiwgMHhDMiwgMHhFMywgLyogMHg4MC0weDgzICovCisJMHhDMSwgMHhEOSwgMHhFRSwgMHhDMiwgMHhFQiwgMHhEMywgMHhDMiwgMHhFMiwgLyogMHg4NC0weDg3ICovCisJMHhDMiwgMHhFNCwgMHgwMCwgMHgwMCwgMHhDMywgMHhFNCwgMHhDMywgMHhFNSwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHhGNCwgMHhFMCwgMHgwMCwgMHgwMCwgMHhDNSwgMHhERSwgLyogMHg4Qy0weDhGICovCisJMHhDNSwgMHhERCwgMHhBOCwgMHhCNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHhDQSwgMHg1NSwgMHhCMCwgMHg2RiwgMHgwMCwgMHgwMCwgMHhDQSwgMHg1MiwgLyogMHg5NC0weDk3ICovCisJMHhDQSwgMHg1MywgMHhDQSwgMHg1MSwgMHgwMCwgMHgwMCwgMHhDQSwgMHg1NCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDQiwgMHhBQSwgMHhDQiwgMHhBNywgLyogMHg5Qy0weDlGICovCisJMHhDQiwgMHhBQywgMHhDQiwgMHhBOCwgMHhBOCwgMHhCNywgMHhBOCwgMHhCQSwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHhDQiwgMHhBOSwgMHhBOCwgMHhCOSwgMHhDQiwgMHhBQiwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBOCwgMHhCOCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDRCwgMHhENSwgLyogMHhBQy0weEFGICovCisJMHhDRCwgMHhENywgMHhBQSwgMHhGNCwgMHhDRCwgMHhEMywgMHhDRCwgMHhENiwgLyogMHhCMC0weEIzICovCisJMHhDRCwgMHhENCwgMHhBQSwgMHhGMiwgMHhBQSwgMHhGNSwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHhBQSwgMHhGMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHhEMCwgMHhCOCwgMHhEMCwgMHhCQywgMHhEMCwgMHhCOSwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHhBRCwgMHhBNywgMHgwMCwgMHgwMCwgMHhBRCwgMHhBOCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHhEMCwgMHhCQiwgMHgwMCwgMHgwMCwgMHhEMCwgMHhCRCwgLyogMHhDNC0weEM3ICovCisJMHhEMCwgMHhCRiwgMHgwMCwgMHgwMCwgMHhBRCwgMHhBNSwgMHhEMCwgMHhCRSwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBRCwgMHhBNiwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHhENywgMHhFRSwgMHhEMCwgMHhCQSwgMHhEMywgMHhGMiwgMHhEMywgMHhGQiwgLyogMHhENC0weEQ3ICovCisJMHhEMywgMHhGOSwgMHhEMywgMHhGNCwgMHhEMywgMHhGNSwgMHhEMywgMHhGQSwgLyogMHhEOC0weERCICovCisJMHhEMywgMHhGQywgMHhCMCwgMHg3MSwgMHgwMCwgMHgwMCwgMHhEMywgMHhGNywgLyogMHhEQy0weERGICovCisJMHhEMywgMHhGMywgMHhCMCwgMHg3MCwgMHhCMCwgMHg3MiwgMHhEMywgMHhGNiwgLyogMHhFMC0weEUzICovCisJMHhEMywgMHhGRCwgMHhEMywgMHhGOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHhCMywgMHhBMSwgMHhENywgMHhGMSwgMHhENywgMHhFOSwgMHhENywgMHhFRiwgLyogMHhFOC0weEVCICovCisJMHhENywgMHhGMCwgMHhCMywgMHhBMiwgMHgwMCwgMHgwMCwgMHhENywgMHhFOCwgLyogMHhFQy0weEVGICovCisJMHhENywgMHhFQSwgMHhEMCwgMHhCNywgMHhENywgMHhFQywgMHhENywgMHhFRCwgLyogMHhGMC0weEYzICovCisJMHhENywgMHhFQiwgMHhCNiwgMHg2QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHhEQywgMHg1NiwgMHhFQiwgMHhENCwgMHhEQywgMHg1NywgLyogMHhGOC0weEZCICovCisJMHhEQywgMHg1NCwgMHhCMywgMHhBMywgMHhCNiwgMHg2RSwgMHhEQywgMHg1MywgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOTFbNTEyXSA9IHsKKwkweERDLCAweDU5LCAweERDLCAweDU4LCAweEI2LCAweDZCLCAweERDLCAweDVDLCAvKiAweDAwLTB4MDMgKi8KKwkweERDLCAweDUyLCAweERDLCAweDVCLCAweERDLCAweDUwLCAweERDLCAweDVBLCAvKiAweDA0LTB4MDcgKi8KKwkweERDLCAweDU1LCAweEI2LCAweDZELCAweDAwLCAweDAwLCAweEUwLCAweEFBLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweEE1LCAweEUwLCAweEFCLCAweEUwLCAweEE2LCAvKiAweDBDLTB4MEYgKi8KKwkweEUwLCAweEE0LCAweEUwLCAweEE3LCAweEI5LCAweDUxLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweEUwLCAweEE5LCAweDAwLCAweDAwLCAweEUwLCAweEE4LCAweEI5LCAweDUyLCAvKiAweDE0LTB4MTcgKi8KKwkweEJCLCAweEMxLCAweEJCLCAweEMwLCAweEU0LCAweDZFLCAweEU0LCAweDcxLCAvKiAweDE4LTB4MUIgKi8KKwkweEU0LCAweDY5LCAweEU0LCAweDZELCAweEJCLCAweEMyLCAweEU0LCAweDZDLCAvKiAweDFDLTB4MUYgKi8KKwkweEU0LCAweDZBLCAweEU0LCAweDcwLCAweEU0LCAweDZCLCAweEU0LCAweDY4LCAvKiAweDIwLTB4MjMgKi8KKwkweEU0LCAweDZGLCAweDAwLCAweDAwLCAweEU4LCAweDU5LCAweEJFLCAweDQ4LCAvKiAweDI0LTB4MjcgKi8KKwkweEYxLCAweDRBLCAweEU4LCAweDU2LCAweEU4LCAweDU3LCAweEU4LCAweDU1LCAvKiAweDI4LTB4MkIgKi8KKwkweERDLCAweDUxLCAweEJFLCAweDQ3LCAweEU4LCAweDVBLCAweEU4LCAweDU0LCAvKiAweDJDLTB4MkYgKi8KKwkweEJFLCAweDQ2LCAweEJFLCAweDQ5LCAweEU4LCAweDU4LCAweEVCLCAweEQ1LCAvKiAweDMwLTB4MzMgKi8KKwkweEJGLCAweEYzLCAweEVCLCAweEQ2LCAweEVCLCAweEQ3LCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweEVFLCAweEM0LCAweEMxLCAweERELCAweEYxLCAweDRCLCAweEYxLCAweDRDLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYxLCAweDRELCAweEYzLCAweDVELCAvKiAweDNDLTB4M0YgKi8KKwkweEYzLCAweDVDLCAweEY0LCAweEUyLCAweDAwLCAweDAwLCAweEY0LCAweEUxLCAvKiAweDQwLTB4NDMgKi8KKwkweEY2LCAweDVCLCAweEY2LCAweDVDLCAweEY2LCAweDVBLCAweEY3LCAweDY2LCAvKiAweDQ0LTB4NDcgKi8KKwkweEM1LCAweEIwLCAweEE4LCAweEJCLCAweEFELCAweEFBLCAweEFELCAweEE5LCAvKiAweDQ4LTB4NEIgKi8KKwkweEIwLCAweDc1LCAweEIwLCAweDc0LCAweEQ0LCAweDQwLCAweEQ0LCAweDQxLCAvKiAweDRDLTB4NEYgKi8KKwkweEQzLCAweEZFLCAweDAwLCAweDAwLCAweEIwLCAweDczLCAweEQ3LCAweEY1LCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweEQ3LCAweEY2LCAweEQ3LCAweEYyLCAweEIzLCAweEE0LCAvKiAweDU0LTB4NTcgKi8KKwkweEQ3LCAweEYzLCAweDAwLCAweDAwLCAweEQ3LCAweEY0LCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweERDLCAweDVGLCAvKiAweDVDLTB4NUYgKi8KKwkweERDLCAweDYxLCAweERDLCAweDVELCAweERDLCAweDYwLCAweEI2LCAweDZGLCAvKiAweDYwLTB4NjMgKi8KKwkweERDLCAweDVFLCAweEI2LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweERELCAweDczLCAweEI5LCAweDU1LCAweEI5LCAweDU0LCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweEI5LCAweDUzLCAweDAwLCAweDAwLCAweEUwLCAweEFDLCAweEUwLCAweEFELCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU0LCAweDczLCAweEU0LCAweDc1LCAvKiAweDcwLTB4NzMgKi8KKwkweEJCLCAweEM2LCAweEJCLCAweEMzLCAweDAwLCAweDAwLCAweEJCLCAweEM1LCAvKiAweDc0LTB4NzcgKi8KKwkweEJCLCAweEM0LCAweEU0LCAweDc0LCAweEU0LCAweDcyLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEU4LCAweDYxLCAweEU4LCAweDVFLCAweEU4LCAweDVGLCAweEJFLCAweDRELCAvKiAweDgwLTB4ODMgKi8KKwkweEU4LCAweDYwLCAweEU4LCAweDVCLCAweEU4LCAweDVDLCAweEJFLCAweDRBLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweEJFLCAweDRCLCAweEU4LCAweDVELCAweEJFLCAweDRDLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweEVCLCAweERCLCAweDAwLCAweDAwLCAweEVCLCAweERDLCAvKiAweDhDLTB4OEYgKi8KKwkweEVCLCAweEQ5LCAweEVCLCAweERBLCAweEJGLCAweEY0LCAweEVCLCAweEQ4LCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweEVFLCAweEM4LCAweEVFLCAweEM1LCAweEVFLCAweEM3LCAvKiAweDk4LTB4OUIgKi8KKwkweEMxLCAweEUwLCAweEVFLCAweENCLCAweEMxLCAweERGLCAweEVFLCAweEM5LCAvKiAweDlDLTB4OUYgKi8KKwkweEVFLCAweENDLCAweEVFLCAweENBLCAweEVFLCAweEM2LCAweEMxLCAweERFLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweEYxLCAweDRGLCAweDAwLCAweDAwLCAweEYxLCAweDUwLCAvKiAweEE0LTB4QTcgKi8KKwkweEYxLCAweDRFLCAweDAwLCAweDAwLCAweEYxLCAweDUyLCAweEMyLCAweEU1LCAvKiAweEE4LTB4QUIgKi8KKwkweEMyLCAweEU2LCAweEYzLCAweDVGLCAweEMzLCAweEU3LCAweEYxLCAweDUxLCAvKiAweEFDLTB4QUYgKi8KKwkweEYzLCAweDVFLCAweEMzLCAweEU2LCAweEY0LCAweEU1LCAweEY0LCAweEU2LCAvKiAweEIwLTB4QjMgKi8KKwkweEM0LCAweEJGLCAweEY0LCAweEU0LCAweDAwLCAweDAwLCAweEY0LCAweEUzLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweEY2LCAweDVELCAweEM1LCAweDQ4LCAweDAwLCAweDAwLCAvKiAweEI4LTB4QkIgKi8KKwkweEY4LCAweDQ5LCAweEY4LCAweEM4LCAweEY4LCAweEM3LCAweDAwLCAweDAwLCAvKiAweEJDLTB4QkYgKi8KKwkweEM2LCAweDQzLCAweEM2LCAweDVELCAweEY4LCAweEM5LCAweEY5LCAweDcxLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweEM2LCAweDZGLCAweEE4LCAweEJDLCAweEFBLCAweEY2LCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweEI5LCAweDU2LCAweDAwLCAweDAwLCAweEM0LCAweEMwLCAvKiAweEM4LTB4Q0IgKi8KKwkweEE4LCAweEJELCAweEFELCAweEFCLCAweEIzLCAweEE1LCAweEI2LCAweDcxLCAvKiAweENDLTB4Q0YgKi8KKwkweEMyLCAweEU3LCAweEFBLCAweEY3LCAweDAwLCAweDAwLCAweEQwLCAweEMxLCAvKiAweEQwLTB4RDMgKi8KKwkweEQwLCAweEMwLCAweEQ0LCAweDQyLCAweDAwLCAweDAwLCAweEIwLCAweDc4LCAvKiAweEQ0LTB4RDcgKi8KKwkweEIwLCAweDc2LCAweEIwLCAweDdBLCAweEQ0LCAweDQ0LCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweEIwLCAweDc5LCAweEIwLCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ0LCAweDQzLCAweEIzLCAweEE4LCAvKiAweEUwLTB4RTMgKi8KKwkweEQ3LCAweEZDLCAweDAwLCAweDAwLCAweEIzLCAweEE3LCAweEIzLCAweEE5LCAvKiAweEU0LTB4RTcgKi8KKwkweEQ4LCAweDQyLCAweEIzLCAweEFCLCAweEQ3LCAweEZFLCAweEQ4LCAweDQwLCAvKiAweEU4LTB4RUIgKi8KKwkweEQ3LCAweEY3LCAweEIzLCAweEFBLCAweEQ4LCAweDQzLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweEQ3LCAweEY5LCAweDAwLCAweDAwLCAweEQ3LCAweEZBLCAvKiAweEYwLTB4RjMgKi8KKwkweEQ3LCAweEY4LCAweEIzLCAweEE2LCAweDAwLCAweDAwLCAweEQ4LCAweDQxLCAvKiAweEY0LTB4RjcgKi8KKwkweEQ3LCAweEZCLCAweEQ3LCAweEZELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweERDLCAweDZELCAweDAwLCAweDAwLCAweERDLCAweDZDLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185Mls1MTJdID0geworCTB4REMsIDB4NkEsIDB4REMsIDB4NjIsIDB4REMsIDB4NzEsIDB4REMsIDB4NjUsIC8qIDB4MDAtMHgwMyAqLworCTB4REMsIDB4NkYsIDB4REMsIDB4NzYsIDB4REMsIDB4NkUsIDB4QjYsIDB4NzksIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4QjYsIDB4NzUsIDB4REMsIDB4NjMsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4REMsIDB4NjksIDB4QjYsIDB4NzcsIDB4MDAsIDB4MDAsIDB4REMsIDB4NjgsIC8qIDB4MEMtMHgwRiAqLworCTB4QjYsIDB4NzgsIDB4QjYsIDB4N0EsIDB4REMsIDB4NkIsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4QjYsIDB4NzIsIDB4QjYsIDB4NzMsIDB4REMsIDB4NzcsIDB4REMsIDB4NzUsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4REMsIDB4NzQsIDB4REMsIDB4NjYsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4REMsIDB4NzIsIDB4MDAsIDB4MDAsIDB4QjYsIDB4NzYsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjYsIDB4NzQsIC8qIDB4MjAtMHgyMyAqLworCTB4REMsIDB4NzMsIDB4REMsIDB4NjQsIDB4REMsIDB4NjcsIDB4REMsIDB4NzAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4RTQsIDB4QkEsIDB4RTAsIDB4QjcsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4RTAsIDB4QjAsIDB4RTAsIDB4QzMsIDB4RTAsIDB4Q0MsIDB4RTAsIDB4QjMsIC8qIDB4MzAtMHgzMyAqLworCTB4QjksIDB4NjEsIDB4MDAsIDB4MDAsIDB4RTAsIDB4QzAsIDB4QjksIDB4NTcsIC8qIDB4MzQtMHgzNyAqLworCTB4QjksIDB4NTksIDB4QjksIDB4NjUsIDB4RTAsIDB4QjEsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4QjksIDB4NUEsIDB4QjksIDB4NUMsIDB4QjksIDB4NjYsIC8qIDB4M0MtMHgzRiAqLworCTB4QjksIDB4NUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4QjksIDB4NjQsIDB4RTAsIDB4QjksIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4RTAsIDB4QUUsIDB4QjksIDB4NjIsIDB4RTAsIDB4QjgsIDB4QjksIDB4NUUsIC8qIDB4NDgtMHg0QiAqLworCTB4RTAsIDB4Q0EsIDB4QjksIDB4NjMsIDB4RTAsIDB4QzgsIDB4RTAsIDB4QkMsIC8qIDB4NEMtMHg0RiAqLworCTB4RTAsIDB4QzYsIDB4QjksIDB4NjAsIDB4RTAsIDB4QUYsIDB4RTAsIDB4QzksIC8qIDB4NTAtMHg1MyAqLworCTB4RTAsIDB4QzQsIDB4MDAsIDB4MDAsIDB4RTAsIDB4Q0IsIDB4QjksIDB4NTgsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjksIDB4NjcsIDB4QjksIDB4NUQsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4QjUsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4RTAsIDB4QkQsIDB4RTAsIDB4QzEsIDB4MDAsIDB4MDAsIDB4RTAsIDB4QzUsIC8qIDB4NjAtMHg2MyAqLworCTB4QjksIDB4NUYsIDB4RTAsIDB4QjQsIDB4RTAsIDB4QjIsIDB4RTAsIDB4QkUsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4RTAsIDB4QkIsIDB4RTAsIDB4QkEsIDB4MDAsIDB4MDAsIDB4RTAsIDB4QkYsIC8qIDB4NkMtMHg2RiAqLworCTB4RTAsIDB4QzIsIDB4MDAsIDB4MDAsIDB4RTAsIDB4QzcsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4NzgsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4QkIsIDB4QzcsIDB4RTQsIDB4QTQsIDB4RTQsIDB4N0EsIDB4QkIsIDB4Q0MsIC8qIDB4NzgtMHg3QiAqLworCTB4QkIsIDB4RDAsIDB4RTQsIDB4QUQsIDB4RTQsIDB4QjUsIDB4RTQsIDB4QTYsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QkIsIDB4QzgsIDB4MDAsIDB4MDAsIDB4RTQsIDB4QUEsIDB4RTAsIDB4QjYsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4QkIsIDB4QzksIDB4RTQsIDB4QjEsIDB4RTQsIDB4QjYsIC8qIDB4ODQtMHg4NyAqLworCTB4RTQsIDB4QUUsIDB4MDAsIDB4MDAsIDB4RTQsIDB4QjAsIDB4RTQsIDB4QjksIC8qIDB4ODgtMHg4QiAqLworCTB4RTQsIDB4QjIsIDB4RTQsIDB4N0UsIDB4RTQsIDB4QTksIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4QkIsIDB4RDEsIDB4MDAsIDB4MDAsIDB4QkIsIDB4Q0QsIC8qIDB4OTAtMHg5MyAqLworCTB4RTQsIDB4N0MsIDB4RTQsIDB4QUIsIDB4QkIsIDB4Q0IsIDB4RTQsIDB4QTUsIC8qIDB4OTQtMHg5NyAqLworCTB4QkIsIDB4Q0EsIDB4RTQsIDB4QjMsIDB4RTQsIDB4QTIsIDB4RTQsIDB4NzksIC8qIDB4OTgtMHg5QiAqLworCTB4QkIsIDB4Q0UsIDB4RTQsIDB4QjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4RTQsIDB4N0IsIDB4RTQsIDB4QUYsIDB4RTQsIDB4QUMsIDB4RTQsIDB4QTcsIC8qIDB4QTAtMHhBMyAqLworCTB4RTQsIDB4NzcsIDB4RTQsIDB4NzYsIDB4RTQsIDB4QTEsIDB4RTQsIDB4QjQsIC8qIDB4QTQtMHhBNyAqLworCTB4QkIsIDB4Q0YsIDB4RTQsIDB4QjcsIDB4RTQsIDB4N0QsIDB4RTQsIDB4QTMsIC8qIDB4QTgtMHhBQiAqLworCTB4QkUsIDB4NTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkUsIDB4NUEsIDB4QkUsIDB4NTUsIC8qIDB4QjAtMHhCMyAqLworCTB4RTgsIDB4QTQsIDB4RTgsIDB4QTEsIDB4RTgsIDB4NjcsIDB4QkUsIDB4NTAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4RjksIDB4RDcsIDB4MDAsIDB4MDAsIDB4QkUsIDB4NEYsIC8qIDB4QjgtMHhCQiAqLworCTB4QkUsIDB4NTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4RTgsIDB4NjUsIDB4QkUsIDB4NTQsIDB4RTgsIDB4NzEsIDB4RTgsIDB4NjMsIC8qIDB4QzAtMHhDMyAqLworCTB4RTgsIDB4NjQsIDB4QkUsIDB4NEUsIDB4RTgsIDB4QTMsIDB4QkUsIDB4NTgsIC8qIDB4QzQtMHhDNyAqLworCTB4RTgsIDB4NzQsIDB4RTgsIDB4NzksIDB4RTgsIDB4NzMsIDB4RUIsIDB4RUUsIC8qIDB4QzgtMHhDQiAqLworCTB4RTgsIDB4NkYsIDB4RTgsIDB4NzcsIDB4RTgsIDB4NzUsIDB4RTgsIDB4NjgsIC8qIDB4Q0MtMHhDRiAqLworCTB4RTgsIDB4NjIsIDB4RTgsIDB4N0QsIDB4QkUsIDB4NTcsIDB4RTgsIDB4N0UsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4NzgsIDB4MDAsIDB4MDAsIDB4RTgsIDB4NkQsIC8qIDB4RDQtMHhENyAqLworCTB4RTgsIDB4NkIsIDB4RTgsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4RTgsIDB4NkUsIDB4RTgsIDB4N0IsIDB4RTgsIDB4NkEsIC8qIDB4REMtMHhERiAqLworCTB4RTgsIDB4N0EsIDB4RTgsIDB4QTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4QkUsIDB4NTMsIDB4MDAsIDB4MDAsIDB4RTgsIDB4NzYsIDB4RTgsIDB4N0MsIC8qIDB4RTQtMHhFNyAqLworCTB4RTgsIDB4NzIsIDB4RTgsIDB4NkMsIDB4QkUsIDB4NTEsIDB4MDAsIDB4MDAsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4QTgsIDB4RTgsIDB4NzAsIC8qIDB4RUMtMHhFRiAqLworCTB4QkUsIDB4NTksIDB4RTgsIDB4NjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUIsIDB4RjQsIC8qIDB4RjQtMHhGNyAqLworCTB4QkYsIDB4RjcsIDB4RUIsIDB4RjMsIDB4RUIsIDB4RjAsIDB4RUMsIDB4NDQsIC8qIDB4RjgtMHhGQiAqLworCTB4QkYsIDB4RkIsIDB4MDAsIDB4MDAsIDB4RUMsIDB4NDEsIDB4RUIsIDB4RjgsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzkzWzUxMl0gPSB7CisJMHhFQywgMHg0MywgMHhFQiwgMHhFOSwgMHhFQiwgMHhGNiwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHhCRiwgMHhGRCwgMHgwMCwgMHgwMCwgMHhFQiwgMHhFMSwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHhFQiwgMHhERiwgMHhFQywgMHg0MiwgMHgwMCwgMHgwMCwgMHhFQywgMHg0MCwgLyogMHgwOC0weDBCICovCisJMHhFQiwgMHhGRSwgMHhFQiwgMHhFRCwgMHhFQiwgMHhFQywgMHhFQiwgMHhFMiwgLyogMHgwQy0weDBGICovCisJMHhDMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHhFQiwgMHhFOCwgMHhFQiwgMHhGMiwgLyogMHgxMC0weDEzICovCisJMHhFQiwgMHhGRCwgMHhDMCwgMHg0MywgMHhFQywgMHg0NSwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHhDMSwgMHhFOCwgMHhDMCwgMHg0NSwgMHhCRiwgMHhGRSwgMHhFQiwgMHhFNiwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHhFQiwgMHhFRiwgMHhFQiwgMHhERSwgMHhFQiwgMHhFMCwgLyogMHgxQy0weDFGICovCisJMHhCRiwgMHhGNSwgMHhDMCwgMHg0MiwgMHhCRiwgMHhGQSwgMHhFQiwgMHhFNywgLyogMHgyMC0weDIzICovCisJMHhFQiwgMHhGNywgMHhFQiwgMHhGMSwgMHhDMCwgMHg0MSwgMHhFQiwgMHhERCwgLyogMHgyNC0weDI3ICovCisJMHhDMSwgMHhFMywgMHhFQiwgMHhGOSwgMHhFQiwgMHhGQywgMHhCRiwgMHhGQywgLyogMHgyOC0weDJCICovCisJMHgwMCwgMHgwMCwgMHhFQiwgMHhFQiwgMHhDMCwgMHg0NCwgMHhCRiwgMHhGOSwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCRiwgMHhGOCwgLyogMHgzMC0weDMzICovCisJMHhFQiwgMHhGNSwgMHhFQiwgMHhGQiwgMHhCRiwgMHhGNiwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHhFQiwgMHhFNCwgMHhFQiwgMHhGQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHhFQiwgMHhFNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQiwgMHhFQSwgMHhFRSwgMHhEMiwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHhFRSwgMHhENywgMHhDMSwgMHhFNSwgMHhDMSwgMHhFNywgLyogMHg0OC0weDRCICovCisJMHhFRSwgMHhERCwgMHhDMSwgMHhFMSwgMHhFRSwgMHhFQywgMHhFRSwgMHhFMywgLyogMHg0Qy0weDRGICovCisJMHhFRSwgMHhEOCwgMHhFRSwgMHhEOSwgMHhFRSwgMHhFMiwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHhDMSwgMHhFRSwgMHhFRSwgMHhFMSwgMHhFRSwgMHhEMSwgMHhFRSwgMHhFMCwgLyogMHg1NC0weDU3ICovCisJMHhFRSwgMHhENCwgMHhFRSwgMHhFRCwgMHhDMSwgMHhFRCwgMHhDMSwgMHhFQiwgLyogMHg1OC0weDVCICovCisJMHhFRSwgMHhENSwgMHgwMCwgMHgwMCwgMHhFRSwgMHhFOCwgMHgwMCwgMHgwMCwgLyogMHg1Qy0weDVGICovCisJMHhFRSwgMHhEQSwgMHhFRSwgMHhFNywgMHgwMCwgMHgwMCwgMHhFRSwgMHhFOSwgLyogMHg2MC0weDYzICovCisJMHhFRSwgMHhEMCwgMHhDMSwgMHhFNiwgMHgwMCwgMHgwMCwgMHhFRSwgMHhFQSwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFRSwgMHhERSwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHhDMSwgMHhFQSwgMHhFRSwgMHhEQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHhDMSwgMHhFQywgMHhFRSwgMHhFNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHhDMSwgMHhFNCwgMHhFRSwgMHhENiwgMHhFRSwgMHhFNSwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHhFRSwgMHhERiwgMHhFQiwgMHhFMywgMHhFRSwgMHhFNiwgLyogMHg3OC0weDdCICovCisJMHhFRSwgMHhEMywgMHgwMCwgMHgwMCwgMHhDMSwgMHhFOSwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHhFRSwgMHhFQiwgMHgwMCwgMHgwMCwgMHhDMSwgMHhFMiwgMHhFRSwgMHhDRSwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHhGMSwgMHg2MCwgMHhGMSwgMHg1OSwgMHhDMiwgMHhFOSwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHhGMSwgMHg1NCwgMHhGMSwgMHg2MywgMHhGMSwgMHg1QiwgMHhFRSwgMHhEQywgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHhGMSwgMHg2NSwgMHhGMSwgMHg1NSwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHhDMiwgMHhFOCwgMHhGMSwgMHg1RiwgMHhDMiwgMHhFQSwgMHhDMiwgMHhGMiwgLyogMHg5NC0weDk3ICovCisJMHhDMiwgMHhGMCwgMHhGMSwgMHg2MSwgMHhDMiwgMHhGMSwgMHhGMSwgMHg1NywgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHhGMSwgMHg1OCwgMHhGMSwgMHg1RCwgMHhGMSwgMHg2MiwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHhFRSwgMHhDRCwgMHhDMiwgMHhFQiwgMHhGMSwgMHg2QSwgLyogMHhBMC0weEEzICovCisJMHhGMSwgMHg2NywgMHhGMSwgMHg2QiwgMHhGMSwgMHg1RSwgMHhGMSwgMHg1QSwgLyogMHhBNC0weEE3ICovCisJMHhGMSwgMHg2OCwgMHhGMywgMHg2QSwgMHhGMSwgMHg1QywgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHhDMiwgMHhFRSwgMHgwMCwgMHgwMCwgMHhDMiwgMHhFRCwgMHhFRSwgMHhDRiwgLyogMHhBQy0weEFGICovCisJMHhDMiwgMHhFRiwgMHhGMSwgMHg2NCwgMHhGMSwgMHg2NiwgMHhDMiwgMHhFQywgLyogMHhCMC0weEIzICovCisJMHhGMSwgMHg2OSwgMHhGMSwgMHg1MywgMHgwMCwgMHgwMCwgMHhGMSwgMHg1NiwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHhGMywgMHg3MywgMHgwMCwgMHgwMCwgMHhGMywgMHg2MywgMHhDMywgMHhFQiwgLyogMHhDMC0weEMzICovCisJMHhGMywgMHg3MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMywgMHg2MSwgLyogMHhDNC0weEM3ICovCisJMHhDMywgMHhFQywgMHgwMCwgMHgwMCwgMHhGMywgMHg2QywgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHhGMywgMHg2OCwgMHhDMywgMHhGMSwgMHhGMywgMHg3MiwgMHhGMywgMHg2MiwgLyogMHhDQy0weENGICovCisJMHhGMywgMHg2NSwgMHhDMywgMHhFOSwgMHhGMywgMHg3NCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHhGMywgMHg2RCwgMHhGMywgMHg3MCwgMHhDMywgMHhFRiwgMHhDMywgMHhGNCwgLyogMHhENC0weEQ3ICovCisJMHhDMywgMHhGMiwgMHhGMywgMHg2OSwgMHhGMywgMHg2NCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHhDMywgMHhFRCwgMHhDMywgMHhFRSwgMHhGMywgMHg2MCwgMHhDMywgMHhFQSwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHhDMywgMHhFOCwgMHhDMywgMHhGMCwgMHhGMywgMHg2RiwgLyogMHhFMC0weEUzICovCisJMHhDMywgMHhGMywgMHgwMCwgMHgwMCwgMHhGMywgMHg2QiwgMHhGMywgMHg3NSwgLyogMHhFNC0weEU3ICovCisJMHhDMywgMHhGNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHhGMywgMHg2NywgMHgwMCwgMHgwMCwgMHhGMywgMHg2RSwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHhGNCwgMHhGMywgMHhGNSwgMHg0MiwgMHhGNCwgMHhGNSwgLyogMHhGNC0weEY3ICovCisJMHhGNCwgMHhGQywgMHhGMywgMHg2NiwgMHhGNCwgMHhGQSwgMHhGNCwgMHhFOSwgLyogMHhGOC0weEZCICovCisJMHhGNSwgMHg0MCwgMHhDNCwgMHhDMywgMHhGNCwgMHhFRCwgMHhGNCwgMHhGRSwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOTRbNTEyXSA9IHsKKwkweEY0LCAweEY0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEM0LCAweEMyLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY1LCAweDQ0LCAweEY0LCAweEY2LCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweEY0LCAweEZCLCAweEY0LCAweEZELCAweEY0LCAweEU3LCAvKiAweDA4LTB4MEIgKi8KKwkweEY1LCAweDQxLCAweEY0LCAweEYyLCAweEY0LCAweEY3LCAweEY0LCAweEVCLCAvKiAweDBDLTB4MEYgKi8KKwkweEY0LCAweEVGLCAweEY1LCAweDQzLCAweEY0LCAweEY5LCAweEY0LCAweEU4LCAvKiAweDEwLTB4MTMgKi8KKwkweEY0LCAweEVDLCAweEY0LCAweEVFLCAweEY0LCAweEY4LCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweEM0LCAweEMxLCAweEY0LCAweEYxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweEY0LCAweEVBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweEY0LCAweEYwLCAweEY2LCAweDYxLCAweEY2LCAweDY2LCAweEM1LCAweDRGLCAvKiAweDI4LTB4MkIgKi8KKwkweEY2LCAweDY4LCAweDAwLCAweDAwLCAweEM1LCAweDQ5LCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweEY2LCAweDY0LCAweEY2LCAweDZBLCAweEM1LCAweDRFLCAweEM1LCAweDRBLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweEM1LCAweDRCLCAweEY2LCAweDYwLCAweEY2LCAweDY3LCAvKiAweDM0LTB4MzcgKi8KKwkweEM1LCAweDRELCAweEY2LCAweDY1LCAweEM1LCAweDRDLCAweEY2LCAweDVGLCAvKiAweDM4LTB4M0IgKi8KKwkweEY2LCAweDYzLCAweEY2LCAweDYyLCAweDAwLCAweDAwLCAweEY2LCAweDVFLCAvKiAweDNDLTB4M0YgKi8KKwkweEY2LCAweDY5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDMgKi8KKwkweEM1LCAweEIxLCAweEY3LCAweDZELCAweEY3LCAweDcwLCAweEY3LCAweDZDLCAvKiAweDQ0LTB4NDcgKi8KKwkweEY3LCAweDZFLCAweEY3LCAweDZGLCAweEY3LCAweDY5LCAweEY3LCAweDZBLCAvKiAweDQ4LTB4NEIgKi8KKwkweEY3LCAweDY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY3LCAweDZCLCAvKiAweDRDLTB4NEYgKi8KKwkweEY3LCAweDY4LCAweEM1LCAweEIyLCAweEM1LCAweEIzLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweEY4LCAweDRCLCAweDAwLCAweDAwLCAweEY4LCAweDRELCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweEY4LCAweDRDLCAweEY4LCAweDRFLCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweEM1LCAweEUwLCAweDAwLCAweDAwLCAweEY4LCAweDRBLCAweEM1LCAweERGLCAvKiAweDYwLTB4NjMgKi8KKwkweEM1LCAweEUxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweEY4LCAweENCLCAweEY4LCAweENDLCAweEM2LCAweDQ0LCAweEY4LCAweENBLCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweEY5LCAweDUzLCAweEY5LCAweDUyLCAweEY5LCAweDU0LCAvKiAweDZDLTB4NkYgKi8KKwkweEM2LCAweDVGLCAweEY5LCAweDU1LCAweEM2LCAweDVFLCAweEY5LCAweDU2LCAvKiAweDcwLTB4NzMgKi8KKwkweEY5LCAweDcyLCAweEY5LCAweDc1LCAweEY5LCAweDc0LCAweEM2LCAweDY4LCAvKiAweDc0LTB4NzcgKi8KKwkweEY5LCAweDczLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweEM2LCAweDcyLCAweEM2LCAweDcwLCAweEM2LCAweDcxLCAweEM2LCAweDc3LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEY5LCAweEMwLCAweEY5LCAweEMxLCAweEY5LCAweEJGLCAweEY5LCAweEM5LCAvKiAweDgwLTB4ODMgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185NVs1MTJdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QUEsIDB4RjgsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDgsIDB4NDQsIDB4REMsIDB4NzgsIC8qIDB4NzgtMHg3QiAqLworCTB4RTgsIDB4QTUsIDB4RjMsIDB4NzYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QUEsIDB4RjksIDB4MDAsIDB4MDAsIDB4QUQsIDB4QUMsIDB4QjAsIDB4N0IsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDgsIDB4NDUsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4RDgsIDB4NDYsIDB4QjMsIDB4QUMsIDB4MDAsIDB4MDAsIDB4QjYsIDB4N0QsIC8qIDB4ODgtMHg4QiAqLworCTB4REMsIDB4N0EsIDB4REMsIDB4NzksIDB4QjYsIDB4QTMsIDB4QjYsIDB4N0MsIC8qIDB4OEMtMHg4RiAqLworCTB4REMsIDB4N0IsIDB4QjYsIDB4N0UsIDB4QjYsIDB4QTIsIDB4QjYsIDB4QTEsIC8qIDB4OTAtMHg5MyAqLworCTB4QjYsIDB4N0IsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4QjksIDB4NjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RDAsIC8qIDB4OTgtMHg5QiAqLworCTB4RTAsIDB4Q0UsIDB4MDAsIDB4MDAsIDB4RTAsIDB4Q0YsIDB4RTAsIDB4Q0QsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4QkIsIDB4RDIsIDB4MDAsIDB4MDAsIDB4QkIsIDB4RDUsIC8qIDB4QTAtMHhBMyAqLworCTB4QkIsIDB4RDcsIDB4QkIsIDB4RDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4QkIsIDB4RDMsIDB4QkIsIDB4RDQsIDB4MDAsIDB4MDAsIDB4RTgsIDB4QTcsIC8qIDB4QTgtMHhBQiAqLworCTB4RTgsIDB4QTYsIDB4QkUsIDB4NUIsIDB4RTgsIDB4QTgsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4RTgsIDB4QTksIDB4QkUsIDB4NUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4RUMsIDB4NEQsIDB4RUMsIDB4NEIsIDB4RUUsIDB4RjMsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4RUMsIDB4NDksIDB4RUMsIDB4NEEsIDB4QzAsIDB4NDYsIC8qIDB4QjgtMHhCQiAqLworCTB4RUMsIDB4NDYsIDB4RUMsIDB4NEUsIDB4RUMsIDB4NDgsIDB4RUMsIDB4NEMsIC8qIDB4QkMtMHhCRiAqLworCTB4RUUsIDB4RUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUUsIDB4RjEsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4RUUsIDB4RjIsIDB4QzEsIDB4RjMsIDB4RUUsIDB4RUUsIC8qIDB4QzQtMHhDNyAqLworCTB4QzEsIDB4RjIsIDB4RUUsIDB4RjAsIDB4QzEsIDB4RUYsIDB4QzEsIDB4RjAsIC8qIDB4QzgtMHhDQiAqLworCTB4QzEsIDB4RjEsIDB4RUMsIDB4NDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4QzIsIDB4RjUsIDB4RjEsIDB4NkUsIDB4RjEsIDB4NkMsIDB4RjEsIDB4NkQsIC8qIDB4RDAtMHhEMyAqLworCTB4QzIsIDB4RjMsIDB4QzIsIDB4RjYsIDB4QzIsIDB4RjQsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjMsIDB4NzcsIDB4RjMsIDB4NzgsIC8qIDB4RDgtMHhEQiAqLworCTB4QzMsIDB4RjYsIDB4MDAsIDB4MDAsIDB4RjUsIDB4NDUsIDB4RjUsIDB4NDcsIC8qIDB4REMtMHhERiAqLworCTB4RjUsIDB4NDYsIDB4QzQsIDB4QzQsIDB4QzUsIDB4NTAsIDB4RjYsIDB4NkQsIC8qIDB4RTAtMHhFMyAqLworCTB4RjYsIDB4NkMsIDB4RjYsIDB4NkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzk2WzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHhBQSwgMHhGQSwgMHgwMCwgMHgwMCwgMHhDOSwgMHhBQSwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHhDQSwgMHg1OCwgMHhBNiwgMHhFOSwgMHhDQSwgMHg1NiwgMHhDQSwgMHg1OSwgLyogMHgyMC0weDIzICovCisJMHhDQSwgMHg1NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHhDQiwgMHhBRSwgMHgwMCwgMHgwMCwgMHhBOCwgMHhDMSwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJCICovCisJMHhBOCwgMHhDMiwgMHhDQiwgMHhCMCwgMHhBOCwgMHhCRiwgMHhDQiwgMHhBRiwgLyogMHgyQy0weDJGICovCisJMHhDQiwgMHhBRCwgMHhBOCwgMHhDMCwgMHhBOCwgMHhCRSwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHhDRCwgMHhEOCwgMHhDRCwgMHhEQiwgMHhBQSwgMHhGRCwgLyogMHgzOC0weDNCICovCisJMHhDRCwgMHhEQSwgMHhDRCwgMHhEOSwgMHgwMCwgMHgwMCwgMHhBQSwgMHhGQywgLyogMHgzQy0weDNGICovCisJMHhBQSwgMHhGQiwgMHgwMCwgMHgwMCwgMHhBQiwgMHg0MCwgMHhDRCwgMHhEQywgLyogMHg0MC0weDQzICovCisJMHhBQSwgMHhGRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEMCwgMHhDNiwgMHhBRCwgMHhBRSwgLyogMHg0OC0weDRCICovCisJMHhBRCwgMHhBRiwgMHhBRCwgMHhCMCwgMHhEMCwgMHhDNywgMHhEMCwgMHhDMywgLyogMHg0Qy0weDRGICovCisJMHhBRCwgMHhBRCwgMHhEMCwgMHhDNCwgMHgwMCwgMHgwMCwgMHhEMCwgMHhDNSwgLyogMHg1MC0weDUzICovCisJMHhEMCwgMHhDMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1NC0weDU3ICovCisJMHhCMCwgMHhBNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMCwgMHhBMSwgLyogMHg1OC0weDVCICovCisJMHhENCwgMHg0NSwgMHhCMCwgMHhBMiwgMHhCMCwgMHhBNSwgMHhENCwgMHg0NiwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHhCMCwgMHg3RSwgMHhCMCwgMHg3QywgMHhCMCwgMHg3RCwgLyogMHg2MC0weDYzICovCisJMHhCMCwgMHhBMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCMywgMHhBRCwgMHhEOCwgMHg0OSwgLyogMHg2OC0weDZCICovCisJMHhCMywgMHhCNSwgMHhEOCwgMHg0OCwgMHgwMCwgMHgwMCwgMHhEOCwgMHg0QiwgLyogMHg2Qy0weDZGICovCisJMHhCMywgMHhCMSwgMHhEOCwgMHg0QSwgMHhCNiwgMHhBQiwgMHhCMywgMHhBRiwgLyogMHg3MC0weDczICovCisJMHhCMywgMHhCMiwgMHhCMywgMHhBRSwgMHhCMywgMHhCMywgMHhCMywgMHhCNCwgLyogMHg3NC0weDc3ICovCisJMHhCMywgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHhEOCwgMHg0NywgMHhCNiwgMHhBNywgMHhEQywgMHg3RCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHhEQywgMHhBMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEQywgMHhBMiwgLyogMHg4MC0weDgzICovCisJMHhCNiwgMHhBQywgMHhCNiwgMHhBOCwgMHhCNiwgMHhBOSwgMHhEQywgMHg3QywgLyogMHg4NC0weDg3ICovCisJMHhEQywgMHg3RSwgMHhEQywgMHhBMSwgMHhCNiwgMHhBNCwgMHhCNiwgMHhBNiwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHhCNiwgMHhBQSwgMHhCNiwgMHhBNSwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHhEMywgMHhFMCwgMHhEMSwgMHhFMCwgMHhEMiwgLyogMHg5MC0weDkzICovCisJMHhCOSwgMHg2QSwgMHhCOSwgMHg2QiwgMHgwMCwgMHgwMCwgMHhFMCwgMHhENCwgLyogMHg5NC0weDk3ICovCisJMHhCOSwgMHg2OSwgMHhCQiwgMHhEOCwgMHgwMCwgMHgwMCwgMHhCQiwgMHhEQSwgLyogMHg5OC0weDlCICovCisJMHhCQiwgMHhEOSwgMHgwMCwgMHgwMCwgMHhFNCwgMHhCQiwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHhCQywgMHhFOCwgMHhBQiwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHhFOCwgMHhBQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMCwgMHg0NywgLyogMHhBNC0weEE3ICovCisJMHhDMCwgMHg0OCwgMHhFQywgMHg0RiwgMHhDMCwgMHg0OSwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHhFRSwgMHhGNiwgMHgwMCwgMHgwMCwgMHhFRSwgMHhGNCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHhFRSwgMHhGNSwgMHhDMSwgMHhGNCwgMHgwMCwgMHgwMCwgMHhGMSwgMHg2RiwgLyogMHhCMC0weEIzICovCisJMHhDMywgMHhGNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHhDMSwgMHhGNSwgMHhBQiwgMHg0MSwgMHgwMCwgMHgwMCwgMHhCMCwgMHhBNiwgLyogMHhCOC0weEJCICovCisJMHhENCwgMHg0NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhEOCwgMHg0QywgLyogMHhCQy0weEJGICovCisJMHhCMywgMHhCNiwgMHhCNiwgMHhBRCwgMHhEQywgMHhBNCwgMHhEQywgMHhBNiwgLyogMHhDMC0weEMzICovCisJMHhCNiwgMHhBRiwgMHhCNiwgMHhBRSwgMHhCNiwgMHhCMCwgMHhCNiwgMHhCMSwgLyogMHhDNC0weEM3ICovCisJMHhEQywgMHhBNSwgMHhCOSwgMHg2RSwgMHhCOSwgMHg2RiwgMHhCOSwgMHg2RCwgLyogMHhDOC0weENCICovCisJMHhCQiwgMHhEQiwgMHhCOSwgMHg2QywgMHhFMCwgMHhENSwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQiwgMHhEQywgMHhFOCwgMHhBQywgLyogMHhEMC0weEQzICovCisJMHhFQywgMHg1MCwgMHhDMCwgMHg0QSwgMHhDMSwgMHhGNiwgMHhGMSwgMHg3MCwgLyogMHhENC0weEQ3ICovCisJMHhGMSwgMHg3NCwgMHhDMiwgMHhGOSwgMHhGMSwgMHg3MSwgMHhDMiwgMHhGQSwgLyogMHhEOC0weERCICovCisJMHhDMiwgMHhGOCwgMHhGMSwgMHg3NSwgMHhDMiwgMHhGQiwgMHhGMSwgMHg3MywgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHhGMywgMHg3OSwgMHhDMiwgMHhGNywgMHhDMywgMHhGOCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHhGOCwgMHhDRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFNC0weEU3ICovCisJMHhBQiwgMHg0MiwgMHhCMywgMHhCOCwgMHhCMywgMHhCNywgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCNiwgMHhCMiwgLyogMHhFQy0weEVGICovCisJMHhEQywgMHhBOCwgMHhEQywgMHhBNywgMHhCNiwgMHhCMywgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHhEOSwgMHhCOSwgMHg3MywgMHhCOSwgMHg3MCwgLyogMHhGNC0weEY3ICovCisJMHhFMCwgMHhEOCwgMHhCOSwgMHg3MiwgMHhFMCwgMHhENiwgMHhCOSwgMHg3MSwgLyogMHhGOC0weEZCICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHhENywgMHgwMCwgMHgwMCwgMHhFNCwgMHhCRCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOTdbNTEyXSA9IHsKKwkweEJCLCAweERELCAweDAwLCAweDAwLCAweEU4LCAweEFGLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweEJFLCAweDVELCAweEU4LCAweEFELCAweEJFLCAweDVFLCAweEJFLCAweDVGLCAvKiAweDA0LTB4MDcgKi8KKwkweEU4LCAweEFFLCAweEJFLCAweDYwLCAweDAwLCAweDAwLCAweEVDLCAweDUxLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweEMwLCAweDRFLCAweEMwLCAweDRCLCAweEMwLCAweDUwLCAvKiAweDBDLTB4MEYgKi8KKwkweEVDLCAweDUzLCAweEMwLCAweDRDLCAweEVDLCAweDUyLCAweEMwLCAweDRGLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMwLCAweDRELCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweEVFLCAweEY5LCAweEVFLCAweEZCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweEMxLCAweEY3LCAweEVFLCAweEZBLCAweEMxLCAweEY4LCAweEVFLCAweEY4LCAvKiAweDFDLTB4MUYgKi8KKwkweEVFLCAweEY3LCAweDAwLCAweDAwLCAweEYxLCAweDc3LCAweEYxLCAweDc2LCAvKiAweDIwLTB4MjMgKi8KKwkweEMyLCAweEZDLCAweEYxLCAweDc4LCAweEYzLCAweDdFLCAweEMzLCAweEZBLCAvKiAweDI0LTB4MjcgKi8KKwkweEYzLCAweDdELCAweEYzLCAweDdBLCAweEMzLCAweEY5LCAweEYzLCAweDdCLCAvKiAweDI4LTB4MkIgKi8KKwkweEYzLCAweDdDLCAweDAwLCAweDAwLCAweEY1LCAweDQ4LCAweEY1LCAweDQ5LCAvKiAweDJDLTB4MkYgKi8KKwkweEM0LCAweEM1LCAweDAwLCAweDAwLCAweEM1LCAweDUzLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweEY2LCAweDZFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM0LTB4MzcgKi8KKwkweEM1LCAweDUxLCAweEM1LCAweDUyLCAweEY2LCAweDZGLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweEM1LCAweEI0LCAweEM1LCAweEI1LCAweEY3LCAweDcxLCAvKiAweDNDLTB4M0YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEM2LCAweDQ1LCAweEY4LCAweENGLCAvKiAweDQwLTB4NDMgKi8KKwkweEM2LCAweDQ3LCAweDAwLCAweDAwLCAweEY4LCAweENFLCAweEY4LCAweEQwLCAvKiAweDQ0LTB4NDcgKi8KKwkweEM2LCAweDQ2LCAweEY5LCAweDU3LCAweDAwLCAweDAwLCAweEY5LCAweEFELCAvKiAweDQ4LTB4NEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEFCLCAweDQzLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEI5LCAweDc0LCAweDAwLCAweDAwLCAvKiAweDU0LTB4NTcgKi8KKwkweEU0LCAweEJFLCAweDAwLCAweDAwLCAweEU4LCAweEIwLCAweEMwLCAweDUxLCAvKiAweDU4LTB4NUIgKi8KKwkweEMwLCAweDUyLCAweDAwLCAweDAwLCAweEFCLCAweDQ0LCAweDAwLCAweDAwLCAvKiAweDVDLTB4NUYgKi8KKwkweEJFLCAweDYxLCAweEMzLCAweEZCLCAweEFELCAweEIxLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMwLCAweDUzLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweEM1LCAweEUyLCAweEFELCAweEIyLCAweEQ4LCAweDRELCAweDAwLCAweDAwLCAvKiAweDY4LTB4NkIgKi8KKwkweERDLCAweEE5LCAweDAwLCAweDAwLCAweERDLCAweEFCLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweERDLCAweEFBLCAweDAwLCAweDAwLCAweEUwLCAweERELCAweEUwLCAweERBLCAvKiAweDcwLTB4NzMgKi8KKwkweEI5LCAweDc1LCAweDAwLCAweDAwLCAweEI5LCAweDc2LCAweEUwLCAweERCLCAvKiAweDc0LTB4NzcgKi8KKwkweEUwLCAweERDLCAweDAwLCAweDAwLCAweEU0LCAweEMwLCAweEU0LCAweEM1LCAvKiAweDc4LTB4N0IgKi8KKwkweEJCLCAweERFLCAweEU0LCAweEJGLCAweEU0LCAweEMxLCAweEU0LCAweEM4LCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEU0LCAweEMzLCAweEU0LCAweEM3LCAweEU0LCAweEM0LCAweEU0LCAweEMyLCAvKiAweDgwLTB4ODMgKi8KKwkweEU0LCAweEM2LCAweEJCLCAweERGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweEU4LCAweEIzLCAweDAwLCAweDAwLCAweEU4LCAweEIxLCAweEJFLCAweDYzLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweEJFLCAweDYyLCAweEU4LCAweEIyLCAweEJFLCAweDY0LCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweEVDLCAweDU2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVDLCAweDU1LCAvKiAweDk0LTB4OTcgKi8KKwkweEMwLCAweDU0LCAweEVDLCAweDU0LCAweEVFLCAweEZDLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweEVFLCAweEZFLCAweEVGLCAweDQxLCAweEVGLCAweDQwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweEMxLCAweEY5LCAweEVFLCAweEZELCAweEYxLCAweEExLCAweEMyLCAweEZELCAvKiAweEEwLTB4QTMgKi8KKwkweEYxLCAweDdELCAweEYxLCAweEEyLCAweEMyLCAweEZFLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweEYxLCAweDdCLCAweDAwLCAweDAwLCAweEYxLCAweDdFLCAweEYxLCAweDdDLCAvKiAweEE4LTB4QUIgKi8KKwkweEYxLCAweDc5LCAweEMzLCAweDQwLCAweEYxLCAweDdBLCAweDAwLCAweDAwLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYzLCAweEExLCAvKiAweEIwLTB4QjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYzLCAweEEzLCAweEYzLCAweEEyLCAvKiAweEI0LTB4QjcgKi8KKwkweDAwLCAweDAwLCAweEY1LCAweDRBLCAweDAwLCAweDAwLCAweEY1LCAweDRCLCAvKiAweEI4LTB4QkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY2LCAweDcwLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweEM1LCAweEI3LCAweDAwLCAweDAwLCAweEM1LCAweEI2LCAvKiAweEMwLTB4QzMgKi8KKwkweEY4LCAweDRGLCAweEY4LCAweDUwLCAweEM2LCAweDQ4LCAweEY4LCAweEQxLCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweEM2LCAweDY5LCAweDAwLCAweDAwLCAweEFELCAweEIzLCAvKiAweEM4LTB4Q0IgKi8KKwkweEI2LCAweEI0LCAweEU0LCAweENBLCAweEU0LCAweEM5LCAweEU4LCAweEI1LCAvKiAweENDLTB4Q0YgKi8KKwkweEU4LCAweEI0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMxLCAweEZBLCAvKiAweEQwLTB4RDMgKi8KKwkweEVGLCAweDQzLCAweEVGLCAweDQyLCAweEYxLCAweEE1LCAweEYxLCAweEEzLCAvKiAweEQ0LTB4RDcgKi8KKwkweEYxLCAweEE2LCAweEYxLCAweEE0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweEMzLCAweEZDLCAweEYzLCAweEE0LCAweEYzLCAweEE1LCAweEYzLCAweEE2LCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweEY2LCAweDcxLCAweDAwLCAweDAwLCAweEY3LCAweDcyLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweEY4LCAweEQyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEU4LTB4RUIgKi8KKwkweDAwLCAweDAwLCAweEFELCAweEI0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEVDLTB4RUYgKi8KKwkweEVDLCAweDU3LCAweEVGLCAweDQ0LCAweDAwLCAweDAwLCAweEFELCAweEI1LCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJCLCAweEUwLCAweDAwLCAweDAwLCAvKiAweEY0LTB4RjcgKi8KKwkweEVDLCAweDU4LCAweEMzLCAweDQxLCAweEYxLCAweEE3LCAweEMzLCAweEZELCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweEY1LCAweDRDLCAweEY1LCAweDRELCAweEM1LCAweDU0LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185OFs1MTJdID0geworCTB4RjgsIDB4NTEsIDB4QUQsIDB4QjYsIDB4QjMsIDB4QkIsIDB4QjMsIDB4QkMsIC8qIDB4MDAtMHgwMyAqLworCTB4RDgsIDB4NEUsIDB4QjYsIDB4QjUsIDB4QjYsIDB4QjYsIDB4REMsIDB4QUMsIC8qIDB4MDQtMHgwNyAqLworCTB4QjYsIDB4QjcsIDB4MDAsIDB4MDAsIDB4QjksIDB4N0EsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwQiAqLworCTB4QjksIDB4N0MsIDB4RTAsIDB4REYsIDB4RTAsIDB4RTAsIDB4RTAsIDB4REUsIC8qIDB4MEMtMHgwRiAqLworCTB4QjksIDB4NzcsIDB4QjksIDB4NzgsIDB4QjksIDB4N0IsIDB4QjksIDB4NzksIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4Q0IsIDB4QkIsIDB4RTEsIC8qIDB4MTQtMHgxNyAqLworCTB4QkIsIDB4RTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTgsIDB4QkMsIC8qIDB4MTgtMHgxQiAqLworCTB4QkUsIDB4NjcsIDB4RTgsIDB4QjcsIDB4RTgsIDB4QjYsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4RTgsIDB4QkIsIDB4QkUsIDB4NjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4QzAsIDB4NUIsIDB4MDAsIDB4MDAsIDB4RTgsIDB4QjgsIDB4RTgsIDB4QkQsIC8qIDB4MjQtMHgyNyAqLworCTB4RTgsIDB4QkEsIDB4RTgsIDB4QjksIDB4MDAsIDB4MDAsIDB4QkUsIDB4NjYsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4QzAsIDB4NTksIDB4MDAsIDB4MDAsIDB4RUMsIDB4NUEsIC8qIDB4MkMtMHgyRiAqLworCTB4QzAsIDB4NTUsIDB4MDAsIDB4MDAsIDB4RUMsIDB4NUIsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4RUMsIDB4NTksIDB4MDAsIDB4MDAsIDB4QzAsIDB4NTgsIC8qIDB4MzQtMHgzNyAqLworCTB4QzAsIDB4NTYsIDB4QzAsIDB4NUEsIDB4MDAsIDB4MDAsIDB4QzAsIDB4NTcsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4RUYsIDB4NDUsIDB4MDAsIDB4MDAsIDB4RUYsIDB4NEEsIC8qIDB4NDAtMHg0MyAqLworCTB4RUYsIDB4NDYsIDB4RUYsIDB4NDksIDB4QzEsIDB4RkIsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4RUQsIDB4RDQsIDB4RUYsIDB4NDgsIDB4RUYsIDB4NDcsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4QzMsIDB4NDQsIDB4QzMsIDB4NDIsIDB4QzMsIDB4NDUsIDB4QzMsIDB4NDMsIC8qIDB4NEMtMHg0RiAqLworCTB4RjEsIDB4QTgsIDB4RjEsIDB4QTksIDB4RjEsIDB4QUEsIDB4QzMsIDB4NDYsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjMsIDB4QUEsIC8qIDB4NTQtMHg1NyAqLworCTB4QzQsIDB4NDAsIDB4RjMsIDB4QTgsIDB4MDAsIDB4MDAsIDB4QzQsIDB4NDEsIC8qIDB4NTgtMHg1QiAqLworCTB4RjMsIDB4QTcsIDB4RjMsIDB4QTksIDB4QzMsIDB4RkUsIDB4RjUsIDB4NTEsIC8qIDB4NUMtMHg1RiAqLworCTB4RjUsIDB4NEUsIDB4MDAsIDB4MDAsIDB4RjUsIDB4NEYsIDB4RjUsIDB4NTAsIC8qIDB4NjAtMHg2MyAqLworCTB4RjYsIDB4NzIsIDB4QzUsIDB4NTYsIDB4MDAsIDB4MDAsIDB4QzUsIDB4NTUsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4RjcsIDB4NzQsIDB4RjcsIDB4NzMsIDB4QzUsIDB4QjgsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzUsIDB4RTMsIC8qIDB4NkMtMHg2RiAqLworCTB4QzYsIDB4NDksIDB4QzYsIDB4NjAsIDB4RjksIDB4NTgsIDB4RjksIDB4QUUsIC8qIDB4NzAtMHg3MyAqLworCTB4RjksIDB4QUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4QUQsIDB4QjcsIDB4REMsIDB4QUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4RTAsIDB4RTEsIDB4RTQsIDB4Q0MsIDB4RTQsIDB4Q0QsIDB4QkIsIDB4RTMsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4QkIsIDB4RTQsIDB4RTgsIDB4QkUsIDB4QkUsIDB4NjgsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzEsIDB4RkMsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4RjEsIDB4QUIsIDB4MDAsIDB4MDAsIDB4QzMsIDB4NDcsIDB4RjMsIDB4QUQsIC8qIDB4QjgtMHhCQiAqLworCTB4QzQsIDB4NDIsIDB4RjMsIDB4QUMsIDB4RjMsIDB4QUUsIDB4RjMsIDB4QUIsIC8qIDB4QkMtMHhCRiAqLworCTB4RjYsIDB4NzUsIDB4RjUsIDB4NTIsIDB4RjUsIDB4NTMsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4QzQsIDB4QzYsIDB4MDAsIDB4MDAsIDB4RjYsIDB4NzQsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4RjYsIDB4NzMsIDB4MDAsIDB4MDAsIDB4RjcsIDB4NzUsIC8qIDB4QzgtMHhDQiAqLworCTB4RjksIDB4QjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QUQsIDB4QjgsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QUQsIDB4QjksIC8qIDB4REMtMHhERiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjAsIDB4QTcsIDB4RDQsIDB4NDgsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4RDgsIDB4NEYsIDB4MDAsIDB4MDAsIDB4QjYsIDB4QjgsIC8qIDB4RTQtMHhFNyAqLworCTB4MDAsIDB4MDAsIDB4QjYsIDB4QkIsIDB4QjYsIDB4QjksIDB4REMsIDB4QUUsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4QjYsIDB4QkQsIDB4MDAsIDB4MDAsIDB4QjYsIDB4QkEsIC8qIDB4RUMtMHhFRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjYsIDB4QkMsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4QjksIDB4N0UsIDB4MDAsIDB4MDAsIDB4RTAsIDB4RTIsIDB4MDAsIDB4MDAsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4RTAsIDB4RTMsIDB4RTgsIDB4QzAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4QjksIDB4N0QsIDB4QjksIDB4QTEsIDB4QjksIDB4QTIsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzk5WzUxMl0gPSB7CisJMHhFNCwgMHhDRiwgMHgwMCwgMHgwMCwgMHhFNCwgMHhDRSwgMHhCQiwgMHhFNSwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHhCQiwgMHhFNiwgMHgwMCwgMHgwMCwgMHhFNCwgMHhEMCwgLyogMHgwNC0weDA3ICovCisJMHhFOCwgMHhCRiwgMHhCQiwgMHhFOCwgMHhCRSwgMHg2OSwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHhCQiwgMHhFNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHhDMCwgMHg1QywgMHhFOCwgMHhDMSwgMHhCRSwgMHg2QiwgMHhCRSwgMHg2QSwgLyogMHgxMC0weDEzICovCisJMHhFOCwgMHhDMiwgMHhFOCwgMHhDNSwgMHhFOCwgMHhDMywgMHhFOCwgMHhDNCwgLyogMHgxNC0weDE3ICovCisJMHhCRSwgMHg2QywgMHgwMCwgMHgwMCwgMHhDMCwgMHg2MSwgMHhDMCwgMHg1RiwgLyogMHgxOC0weDFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMCwgMHg1RSwgMHhFQywgMHg1RCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHhDMCwgMHg2MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHhFQywgMHg1QywgMHhFRiwgMHg0QiwgMHgwMCwgMHgwMCwgMHhFQywgMHg1RSwgLyogMHgyNC0weDI3ICovCisJMHhDMCwgMHg1RCwgMHhFQywgMHg1RiwgMHhFRiwgMHg0RSwgMHhFRiwgMHg0QywgLyogMHgyOC0weDJCICovCisJMHhFRiwgMHg0RCwgMHhFRiwgMHg1MiwgMHhDMywgMHg0QiwgMHhFRiwgMHg1MSwgLyogMHgyQy0weDJGICovCisJMHhFRiwgMHg1NCwgMHhFRiwgMHg1MywgMHhFRiwgMHg1MCwgMHhFRiwgMHg0RiwgLyogMHgzMC0weDMzICovCisJMHgwMCwgMHgwMCwgMHhDMSwgMHhGRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMSwgMHhBRSwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNCICovCisJMHhGMSwgMHhBRCwgMHhDMywgMHg0QSwgMHhDMywgMHg0OCwgMHhDMywgMHg0OSwgLyogMHgzQy0weDNGICovCisJMHgwMCwgMHgwMCwgMHhGMSwgMHhBQywgMHgwMCwgMHgwMCwgMHhGMywgMHhCMSwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHhDNCwgMHg0MywgMHgwMCwgMHgwMCwgMHhGMywgMHhCMCwgLyogMHg0NC0weDQ3ICovCisJMHhGMywgMHhBRiwgMHhDNCwgMHg0NCwgMHgwMCwgMHgwMCwgMHhGNSwgMHg1OCwgLyogMHg0OC0weDRCICovCisJMHhGNSwgMHg1NywgMHgwMCwgMHgwMCwgMHhGNSwgMHg1NSwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHhGNSwgMHg1NCwgMHhDNCwgMHhDOCwgMHhDNCwgMHhDNywgMHhGNSwgMHg1OSwgLyogMHg1MC0weDUzICovCisJMHhGNywgMHg3NiwgMHhDNSwgMHhCOSwgMHhGNiwgMHg3NywgMHhDNSwgMHg1NywgLyogMHg1NC0weDU3ICovCisJMHhGNiwgMHg3NiwgMHhGNSwgMHg1NiwgMHgwMCwgMHgwMCwgMHhGNywgMHg3NywgLyogMHg1OC0weDVCICovCisJMHhDNSwgMHhFNCwgMHgwMCwgMHgwMCwgMHhDNiwgMHg2MSwgMHhGOSwgMHg1OSwgLyogMHg1Qy0weDVGICovCisJMHgwMCwgMHgwMCwgMHhGOSwgMHhCMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3NC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBRCwgMHhCQSwgMHhEOCwgMHg1MCwgLyogMHg5NC0weDk3ICovCisJMHhFRiwgMHg1NSwgMHhBRCwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHhFNCwgMHhEMiwgMHhFNCwgMHhEMSwgMHhFQywgMHg2MCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHhFRiwgMHg1NywgMHgwMCwgMHgwMCwgMHhFRiwgMHg1NiwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHhDMywgMHg0QywgMHhGMywgMHhCMiwgMHhGMywgMHhCMywgLyogMHhBNC0weEE3ICovCisJMHhDNCwgMHhDOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOSwgMHhCMiwgLyogMHhBOC0weEFCICovCisJMHhCMCwgMHhBOCwgMHhCNiwgMHhCRiwgMHhCNiwgMHhCRSwgMHhFMCwgMHhFNCwgLyogMHhBQy0weEFGICovCisJMHhFMCwgMHhFNiwgMHhCOSwgMHhBNCwgMHhFMCwgMHhFNSwgMHhCOSwgMHhBMywgLyogMHhCMC0weEIzICovCisJMHhCOSwgMHhBNSwgMHhFMCwgMHhFNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHhENCwgMHhFNCwgMHhENiwgMHhFNCwgMHhENSwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHhEOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHhCQiwgMHhFOSwgMHhFNCwgMHhENywgMHhFNCwgMHhEMywgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFNCwgMHhEOSwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHhFOCwgMHhDQywgMHgwMCwgMHgwMCwgMHhFOCwgMHhDRiwgLyogMHhDOC0weENCICovCisJMHhFOCwgMHhEMSwgMHhFOCwgMHhDNywgMHhFOCwgMHhDQiwgMHhFOCwgMHhDOCwgLyogMHhDQy0weENGICovCisJMHhCRSwgMHg2RSwgMHhCRSwgMHg3MSwgMHhCRSwgMHg3MywgMHhFOCwgMHhDOSwgLyogMHhEMC0weEQzICovCisJMHhFOCwgMHhDQSwgMHhCRSwgMHg3MiwgMHhFOCwgMHhDRCwgMHhFOCwgMHhEMCwgLyogMHhENC0weEQ3ICovCisJMHhFOCwgMHhDRSwgMHhCRSwgMHg3NCwgMHgwMCwgMHgwMCwgMHhCRSwgMHg3MCwgLyogMHhEOC0weERCICovCisJMHhFOCwgMHhDNiwgMHhCRSwgMHg2RCwgMHgwMCwgMHgwMCwgMHhCRSwgMHg2RiwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMCwgMHg2MywgMHhFQywgMHg2NiwgLyogMHhFMC0weEUzICovCisJMHhFQywgMHg2NCwgMHhFQywgMHg2MywgMHgwMCwgMHgwMCwgMHhFQywgMHg2OSwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHhFQywgMHg2OCwgMHhFQywgMHg2NywgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHhFQywgMHg2MiwgMHhDMCwgMHg2MiwgMHhFQywgMHg2MSwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHhFQywgMHg2NSwgMHhDMCwgMHg2NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhGMC0weEYzICovCisJMHhFRiwgMHg1QSwgMHgwMCwgMHgwMCwgMHhFRiwgMHg1RSwgMHhFRiwgMHg1QiwgLyogMHhGNC0weEY3ICovCisJMHhFRiwgMHg1RCwgMHhFRiwgMHg1QywgMHhFRiwgMHg1OSwgMHhFRiwgMHg1RiwgLyogMHhGOC0weEZCICovCisJMHhFRiwgMHg2MiwgMHhFRiwgMHg2MCwgMHhFRiwgMHg2MSwgMHhDMiwgMHg0MCwgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOUFbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweEMxLCAweEZFLCAweEVGLCAweDU4LCAweEVGLCAweDYzLCAvKiAweDAwLTB4MDMgKi8KKwkweEYxLCAweEIzLCAweEYxLCAweEI2LCAweEYxLCAweEI4LCAweEYxLCAweEI3LCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweEYxLCAweEIxLCAweEYxLCAweEI1LCAweEYxLCAweEIwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweEYxLCAweEIyLCAweEMzLCAweDRELCAweEYxLCAweEFGLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweEYxLCAweEI0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweEYzLCAweEMwLCAweEYzLCAweEI1LCAweEM0LCAweDQ1LCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweEM0LCAweDQ2LCAweEYzLCAweEI0LCAweEYzLCAweEI5LCAvKiAweDE4LTB4MUIgKi8KKwkweEYzLCAweEJGLCAweEYzLCAweEI3LCAweEYzLCAweEJFLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweEYzLCAweEJCLCAweDAwLCAweDAwLCAweEYzLCAweEJBLCAweEYzLCAweEJELCAvKiAweDIwLTB4MjMgKi8KKwkweEYzLCAweEI4LCAweEYzLCAweEI2LCAweDAwLCAweDAwLCAweEYzLCAweEJDLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweEY1LCAweDYwLCAweEY1LCAweDVFLCAweEM0LCAweENBLCAvKiAweDI4LTB4MkIgKi8KKwkweEY1LCAweDVELCAweEY1LCAweDYzLCAweEY1LCAweDYxLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweEM0LCAweENCLCAweEY1LCAweDVDLCAweEY1LCAweDVBLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzMgKi8KKwkweEY1LCAweDVCLCAweEM0LCAweENELCAweEY1LCAweDVGLCAweEM0LCAweENDLCAvKiAweDM0LTB4MzcgKi8KKwkweEY1LCAweDYyLCAweEY2LCAweDc4LCAweEY2LCAweDdFLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweEY2LCAweDc5LCAweEM1LCAweDVCLCAweEY2LCAweEExLCAvKiAweDNDLTB4M0YgKi8KKwkweEM1LCAweDVBLCAweEY2LCAweDdELCAweEY2LCAweDdDLCAweEM1LCAweDU5LCAvKiAweDQwLTB4NDMgKi8KKwkweEY2LCAweDdCLCAweEM1LCAweDU4LCAweEY2LCAweDdBLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweEY3LCAweDdELCAweEY3LCAweEExLCAweEY3LCAweDdFLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NEIgKi8KKwkweEY3LCAweDdCLCAweEM1LCAweEJCLCAweEY3LCAweDc4LCAweEY3LCAweDdDLCAvKiAweDRDLTB4NEYgKi8KKwkweEY3LCAweEEzLCAweDAwLCAweDAwLCAweEY3LCAweEEyLCAweEY3LCAweDc5LCAvKiAweDUwLTB4NTMgKi8KKwkweEY3LCAweDdBLCAweEM1LCAweEJBLCAweEY4LCAweDUyLCAweEM1LCAweEU3LCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweEY4LCAweDUzLCAweEM1LCAweEU1LCAweEM1LCAweEU2LCAvKiAweDU4LTB4NUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY4LCAweEQzLCAweEM2LCAweDRBLCAvKiAweDVDLTB4NUYgKi8KKwkweEY5LCAweDc2LCAweDAwLCAweDAwLCAweEM2LCAweDZBLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweEY5LCAweEIzLCAweEM2LCAweDZCLCAweEY5LCAweEI0LCAweEY5LCAweEI1LCAvKiAweDY0LTB4NjcgKi8KKwkweEY5LCAweEMzLCAweEY5LCAweEMyLCAweEM2LCAweDdBLCAweEY5LCAweENELCAvKiAweDY4LTB4NkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDZDLTB4NkYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc0LTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg0LTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk0LTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDlDLTB4OUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEEwLTB4QTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEE0LTB4QTcgKi8KKwkweEIwLCAweEE5LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEUwLCAweEU5LCAvKiAweEE4LTB4QUIgKi8KKwkweDAwLCAweDAwLCAweEUwLCAweEU4LCAweDAwLCAweDAwLCAweEJCLCAweEVBLCAvKiAweEFDLTB4QUYgKi8KKwkweEJCLCAweEVCLCAweEU0LCAweERBLCAweDAwLCAweDAwLCAweEU4LCAweEQyLCAvKiAweEIwLTB4QjMgKi8KKwkweEVDLCAweDZDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJFLCAweDc1LCAvKiAweEI0LTB4QjcgKi8KKwkweEMwLCAweDY1LCAweEVDLCAweDZBLCAweDAwLCAweDAwLCAweEVDLCAweDZELCAvKiAweEI4LTB4QkIgKi8KKwkweEMwLCAweDY2LCAweDAwLCAweDAwLCAweEVGLCAweDY0LCAweEVDLCAweDZCLCAvKiAweEJDLTB4QkYgKi8KKwkweEYxLCAweEI5LCAweEMzLCAweDRFLCAweEYzLCAweEMxLCAweDAwLCAweDAwLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY1LCAweDY2LCAweEY1LCAweDY0LCAvKiAweEM0LTB4QzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEY1LCAweDY1LCAweDAwLCAweDAwLCAvKiAweEM4LTB4Q0IgKi8KKwkweDAwLCAweDAwLCAweEY2LCAweEEyLCAweDAwLCAweDAwLCAweEM1LCAweDVDLCAvKiAweENDLTB4Q0YgKi8KKwkweEY3LCAweEE0LCAweEM1LCAweEVBLCAweEM1LCAweEJDLCAweEM1LCAweEU4LCAvKiAweEQwLTB4RDMgKi8KKwkweEM1LCAweEU5LCAweEY4LCAweEQ0LCAweEM2LCAweDYyLCAweDAwLCAweDAwLCAvKiAweEQ0LTB4RDcgKi8KKwkweEIwLCAweEFBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweEQ4LTB4REIgKi8KKwkweEYxLCAweEJBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEQ0LCAweDQ5LCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweEI5LCAweEE2LCAweDAwLCAweDAwLCAweEU0LCAweERCLCAvKiAweEUwLTB4RTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJCLCAweEVDLCAweEU0LCAweERDLCAvKiAweEU0LTB4RTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEU4LCAweEQ0LCAvKiAweEU4LTB4RUIgKi8KKwkweEU4LCAweEQzLCAweEMwLCAweDY4LCAweEJFLCAweDc2LCAweEJFLCAweDc3LCAvKiAweEVDLTB4RUYgKi8KKwkweDAwLCAweDAwLCAweEU4LCAweEQ3LCAweEU4LCAweEQ2LCAweEU4LCAweEQ1LCAvKiAweEYwLTB4RjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVDLCAweDZFLCAweEVDLCAweDcxLCAvKiAweEY0LTB4RjcgKi8KKwkweDAwLCAweDAwLCAweEVDLCAweDcwLCAweEVDLCAweDZGLCAweEMwLCAweDY3LCAvKiAweEY4LTB4RkIgKi8KKwkweEVGLCAweDY4LCAweEVGLCAweDY2LCAweEVGLCAweDY1LCAweDAwLCAweDAwLCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185Qls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4RUYsIDB4NjcsIDB4MDAsIDB4MDAsIDB4QzMsIDB4NEYsIC8qIDB4MDAtMHgwMyAqLworCTB4RjEsIDB4QkMsIDB4RjEsIDB4QkQsIDB4QzMsIDB4NTAsIDB4MDAsIDB4MDAsIC8qIDB4MDQtMHgwNyAqLworCTB4RjEsIDB4QkIsIDB4MDAsIDB4MDAsIDB4RjMsIDB4QzMsIDB4RjMsIDB4QzIsIC8qIDB4MDgtMHgwQiAqLworCTB4RjMsIDB4QzUsIDB4QzQsIDB4NDcsIDB4RjMsIDB4QzQsIDB4MDAsIDB4MDAsIC8qIDB4MEMtMHgwRiAqLworCTB4RjUsIDB4NjcsIDB4RjUsIDB4NjksIDB4RjUsIDB4NjgsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxMyAqLworCTB4MDAsIDB4MDAsIDB4RjYsIDB4QTMsIDB4RjYsIDB4QTYsIDB4RjYsIDB4QTQsIC8qIDB4MTQtMHgxNyAqLworCTB4RjYsIDB4QTUsIDB4RjcsIDB4QTUsIDB4QzUsIDB4QkQsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjgsIDB4NTQsIDB4RjgsIDB4NTUsIC8qIDB4MUMtMHgxRiAqLworCTB4RjgsIDB4NTYsIDB4MDAsIDB4MDAsIDB4QzYsIDB4NEIsIDB4QzYsIDB4NjMsIC8qIDB4MjAtMHgyMyAqLworCTB4RjksIDB4QjYsIDB4QjAsIDB4QUIsIDB4MDAsIDB4MDAsIDB4QkUsIDB4NzgsIC8qIDB4MjQtMHgyNyAqLworCTB4QzAsIDB4NjksIDB4RjEsIDB4QkUsIDB4MDAsIDB4MDAsIDB4RjcsIDB4QTYsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjksIDB4QzQsIDB4RDQsIDB4NEEsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4QzYsIDB4N0IsIDB4QjAsIDB4QUMsIDB4RUMsIDB4NzIsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4RjEsIDB4QkYsIDB4MDAsIDB4MDAsIDB4RjMsIDB4QzYsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjYsIDB4QTcsIDB4RjcsIDB4QTcsIC8qIDB4MzgtMHgzQiAqLworCTB4QjAsIDB4QUQsIDB4MDAsIDB4MDAsIDB4RTQsIDB4REQsIDB4RTQsIDB4REUsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4QkIsIDB4RUQsIDB4QkIsIDB4RUUsIDB4RTgsIDB4RDksIC8qIDB4NDAtMHg0MyAqLworCTB4QkUsIDB4N0EsIDB4QkUsIDB4NzksIDB4RTgsIDB4RDgsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4RUYsIDB4NjksIDB4MDAsIDB4MDAsIDB4RjEsIDB4QzAsIDB4RjEsIDB4QzIsIC8qIDB4NDgtMHg0QiAqLworCTB4RjEsIDB4QzEsIDB4QzMsIDB4NTMsIDB4QzMsIDB4NTIsIDB4QzMsIDB4NTEsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4QzUsIDB4NUUsIDB4RjYsIDB4QTgsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4QzUsIDB4NUQsIDB4RjcsIDB4QTksIDB4RjcsIDB4QTgsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4QzYsIDB4NEMsIDB4RjgsIDB4RDUsIDB4QjMsIDB4QkQsIDB4RTAsIDB4RUEsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RTQsIDB4RTEsIC8qIDB4NUMtMHg1RiAqLworCTB4RTQsIDB4REYsIDB4RTQsIDB4RTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4RTgsIDB4RTIsIDB4MDAsIDB4MDAsIDB4RTgsIDB4REQsIDB4RTgsIDB4REEsIC8qIDB4NjQtMHg2NyAqLworCTB4RTgsIDB4RTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4RTgsIDB4RTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkUsIDB4N0MsIC8qIDB4NkMtMHg2RiAqLworCTB4RTgsIDB4RTAsIDB4RTgsIDB4REMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4RTgsIDB4REIsIDB4RTgsIDB4REYsIDB4RTgsIDB4REUsIDB4QkUsIDB4N0IsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUMsIDB4N0QsIDB4RUMsIDB4NzgsIC8qIDB4NzgtMHg3QiAqLworCTB4RUMsIDB4NzYsIDB4RUMsIDB4QTEsIDB4RUMsIDB4NzcsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RUMsIDB4NzMsIDB4MDAsIDB4MDAsIDB4RUMsIDB4NzksIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4RUMsIDB4NzQsIDB4RUYsIDB4NzIsIDB4RUMsIDB4NzUsIC8qIDB4ODQtMHg4NyAqLworCTB4RUMsIDB4QTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4RUMsIDB4N0MsIDB4QzAsIDB4NkEsIDB4RUMsIDB4N0IsIDB4RUMsIDB4N0EsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4RUMsIDB4N0UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUYsIDB4NkEsIDB4RUYsIDB4NkQsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUYsIDB4NkMsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4RUYsIDB4NzQsIDB4RUYsIDB4NkYsIDB4RUYsIDB4NzMsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4RUYsIDB4NzEsIDB4RUYsIDB4NzAsIDB4RUYsIDB4NkUsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4RUYsIDB4NkIsIDB4MDAsIDB4MDAsIDB4QzIsIDB4NDMsIDB4QzIsIDB4NDIsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4QzIsIDB4NDQsIDB4QzIsIDB4NDEsIDB4RUYsIDB4NzUsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4RjEsIDB4QzgsIDB4RjEsIDB4Q0IsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4RjEsIDB4QzksIDB4RjEsIDB4Q0QsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4RjEsIDB4Q0UsIDB4MDAsIDB4MDAsIDB4RjEsIDB4QzYsIC8qIDB4QkMtMHhCRiAqLworCTB4QzMsIDB4NTgsIDB4RjEsIDB4QzcsIDB4MDAsIDB4MDAsIDB4RjEsIDB4QzUsIC8qIDB4QzAtMHhDMyAqLworCTB4RjEsIDB4Q0MsIDB4MDAsIDB4MDAsIDB4RjEsIDB4QzQsIDB4RjEsIDB4QzMsIC8qIDB4QzQtMHhDNyAqLworCTB4QzMsIDB4NTcsIDB4QzMsIDB4NTUsIDB4QzMsIDB4NTQsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjEsIDB4Q0EsIC8qIDB4RDAtMHhEMyAqLworCTB4RjMsIDB4Q0YsIDB4RjMsIDB4RDUsIDB4QzQsIDB4NEEsIDB4RjMsIDB4RDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4RjMsIDB4RDMsIDB4RjMsIDB4RDcsIDB4QzQsIDB4NEIsIC8qIDB4RDgtMHhEQiAqLworCTB4RjMsIDB4RDIsIDB4MDAsIDB4MDAsIDB4RjMsIDB4Q0EsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4RjMsIDB4QzksIDB4RjMsIDB4RDYsIDB4RjMsIDB4Q0QsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4RjMsIDB4Q0IsIDB4RjMsIDB4RDQsIDB4RjMsIDB4Q0MsIDB4QzQsIDB4NDksIC8qIDB4RTQtMHhFNyAqLworCTB4QzQsIDB4NDgsIDB4MDAsIDB4MDAsIDB4RjMsIDB4QzcsIDB4RjMsIDB4QzgsIC8qIDB4RTgtMHhFQiAqLworCTB4RjMsIDB4RDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RUMtMHhFRiAqLworCTB4RjMsIDB4Q0UsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjAtMHhGMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjUsIDB4NkMsIC8qIDB4RjQtMHhGNyAqLworCTB4RjUsIDB4NkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RjgtMHhGQiAqLworCTB4MDAsIDB4MDAsIDB4QzMsIDB4NTYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzlDWzUxMl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHhGNSwgMHg2RCwgMHhGNSwgMHg3MywgMHhGNSwgMHg3MSwgLyogMHgwNC0weDA3ICovCisJMHhGNSwgMHg2QiwgMHhGNSwgMHg3NiwgMHgwMCwgMHgwMCwgMHhGNSwgMHg2QSwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHhDNCwgMHhDRiwgMHhGNSwgMHg3MiwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNSwgMHg2RSwgMHhDNCwgMHhDRSwgLyogMHgxMC0weDEzICovCisJMHhGNSwgMHg3NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGNSwgMHg3NCwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFCICovCisJMHhGNiwgMHhBQiwgMHhGNiwgMHhBQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHhGNiwgMHhCMSwgMHgwMCwgMHgwMCwgMHhGNiwgMHhBRCwgLyogMHgyMC0weDIzICovCisJMHhGNiwgMHhCMCwgMHhDNSwgMHg2MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHhGNiwgMHhBRSwgMHhGNiwgMHhBRiwgMHgwMCwgMHgwMCwgMHhGNiwgMHhBOSwgLyogMHgyOC0weDJCICovCisJMHhGNiwgMHhBQywgMHhDNSwgMHg1RiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCisJMHgwMCwgMHgwMCwgMHhDNSwgMHhCRiwgMHhGNywgMHhCNCwgMHhGNywgMHhBRiwgLyogMHgzMC0weDMzICovCisJMHhGNywgMHhCMywgMHgwMCwgMHgwMCwgMHhGNywgMHhCNiwgMHhGNywgMHhCMiwgLyogMHgzNC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHhGNywgMHhBRSwgMHgwMCwgMHgwMCwgMHhDNSwgMHhDMSwgLyogMHgzOC0weDNCICovCisJMHhGNywgMHhCMSwgMHhGNywgMHhCNSwgMHhDNSwgMHhDMCwgMHhGNywgMHhBQywgLyogMHgzQy0weDNGICovCisJMHhGNSwgMHg3MCwgMHhGNywgMHhCMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQzICovCisJMHhGNywgMHhBRCwgMHgwMCwgMHgwMCwgMHhGNywgMHhBQSwgMHgwMCwgMHgwMCwgLyogMHg0NC0weDQ3ICovCisJMHhGNywgMHhBQiwgMHhDNSwgMHhCRSwgMHhGOCwgMHg1QSwgMHhGOCwgMHg1QywgLyogMHg0OC0weDRCICovCisJMHhGOCwgMHg1RiwgMHhGOCwgMHg1QiwgMHhGOCwgMHg2MCwgMHgwMCwgMHgwMCwgLyogMHg0Qy0weDRGICovCisJMHhGOCwgMHg1OSwgMHgwMCwgMHgwMCwgMHhGOCwgMHg1NywgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHhDNSwgMHhFQiwgMHhGOCwgMHg1RCwgMHhDNSwgMHhFRCwgMHhDNSwgMHhFQywgLyogMHg1NC0weDU3ICovCisJMHhGOCwgMHg1OCwgMHhGOCwgMHg1RSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOCwgMHhEQSwgMHhDNiwgMHg0RCwgLyogMHg1Qy0weDVGICovCisJMHhGOCwgMHhEQiwgMHgwMCwgMHgwMCwgMHhGOCwgMHhEOSwgMHhGOCwgMHhENiwgLyogMHg2MC0weDYzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOCwgMHhEOCwgMHhGOCwgMHhENywgLyogMHg2NC0weDY3ICovCisJMHhGOSwgMHg1QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZCICovCisJMHgwMCwgMHgwMCwgMHhGOSwgMHg1QywgMHhGOSwgMHg1QiwgMHgwMCwgMHgwMCwgLyogMHg2Qy0weDZGICovCisJMHgwMCwgMHgwMCwgMHhGOSwgMHg3OSwgMHgwMCwgMHgwMCwgMHhGOSwgMHg3OCwgLyogMHg3MC0weDczICovCisJMHhGOSwgMHg3NywgMHhGOSwgMHg3QSwgMHgwMCwgMHgwMCwgMHhDNiwgMHg3MywgLyogMHg3NC0weDc3ICovCisJMHhDNiwgMHg3NCwgMHhGOSwgMHhDQSwgMHhGOSwgMHhDRSwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBOC0weEFCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBQy0weEFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCMC0weEIzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCNC0weEI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCOC0weEJCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhCQy0weEJGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDMC0weEMzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDNC0weEM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDOC0weENCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhDQy0weENGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEMC0weEQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhENC0weEQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEOC0weERCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhEQy0weERGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFMC0weEUzICovCisJMHgwMCwgMHgwMCwgMHhCMywgMHhCRSwgMHhEQywgMHhBRiwgMHhFMCwgMHhFRCwgLyogMHhFNC0weEU3ICovCisJMHgwMCwgMHgwMCwgMHhCOSwgMHhBNywgMHhFMCwgMHhFQiwgMHgwMCwgMHgwMCwgLyogMHhFOC0weEVCICovCisJMHgwMCwgMHgwMCwgMHhFMCwgMHhFQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhFQy0weEVGICovCisJMHgwMCwgMHgwMCwgMHhFNCwgMHhFMiwgMHhFNCwgMHhFMywgMHhCQiwgMHhGMSwgLyogMHhGMC0weEYzICovCisJMHhCQiwgMHhFRiwgMHhFNCwgMHhFNCwgMHhCQiwgMHhGMCwgMHhFOCwgMHhFOCwgLyogMHhGNC0weEY3ICovCisJMHgwMCwgMHgwMCwgMHhFOCwgMHhFQiwgMHhFOCwgMHhFNSwgMHhFOCwgMHhFQywgLyogMHhGOC0weEZCICovCisJMHhFOCwgMHhFNCwgMHhFOCwgMHhFNiwgMHgwMCwgMHgwMCwgMHhFOCwgMHhFNywgLyogMHhGQy0weEZGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfOURbNTEyXSA9IHsKKwkweEU4LCAweEVBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJFLCAweEExLCAvKiAweDAwLTB4MDMgKi8KKwkweEU4LCAweEVGLCAweEU4LCAweEVFLCAweEJFLCAweDdELCAweEU4LCAweEU5LCAvKiAweDA0LTB4MDcgKi8KKwkweEU4LCAweEVELCAweEJFLCAweDdFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweEVDLCAweEFDLCAweDAwLCAweDAwLCAweEMwLCAweDZGLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweEVDLCAweEE3LCAweEMwLCAweDZCLCAweDAwLCAweDAwLCAweEVDLCAweEE0LCAvKiAweDE0LTB4MTcgKi8KKwkweEVDLCAweEFBLCAweEVDLCAweEFELCAweDAwLCAweDAwLCAweEMwLCAweDcwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweEVDLCAweEE5LCAweEVDLCAweEE2LCAweEVDLCAweEFFLCAvKiAweDFDLTB4MUYgKi8KKwkweEVDLCAweEE1LCAweDAwLCAweDAwLCAweEVDLCAweEFCLCAweEMwLCAweDZDLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweEVDLCAweEEzLCAweEMwLCAweDZELCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweEMwLCAweDZFLCAweEVDLCAweEE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweEVGLCAweEE5LCAweEVGLCAweDdBLCAweEVGLCAweDdCLCAvKiAweDJDLTB4MkYgKi8KKwkweEVGLCAweDdFLCAweEVGLCAweDdDLCAweDAwLCAweDAwLCAweEVGLCAweDc2LCAvKiAweDMwLTB4MzMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVGLCAweDc5LCAweEVGLCAweEE1LCAvKiAweDM0LTB4MzcgKi8KKwkweEVGLCAweDdELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMyLCAweDQ1LCAvKiAweDM4LTB4M0IgKi8KKwkweDAwLCAweDAwLCAweEVGLCAweEE3LCAweEVGLCAweEE0LCAweEMyLCAweDQ2LCAvKiAweDNDLTB4M0YgKi8KKwkweEVGLCAweEE2LCAweEVGLCAweDc3LCAweEVGLCAweEEyLCAweEVGLCAweEEzLCAvKiAweDQwLTB4NDMgKi8KKwkweDAwLCAweDAwLCAweEVGLCAweEExLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYxLCAweEQyLCAweEYxLCAweEQ0LCAvKiAweDQ4LTB4NEIgKi8KKwkweEYxLCAweEQ3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYxLCAweEQxLCAvKiAweDRDLTB4NEYgKi8KKwkweDAwLCAweDAwLCAweEMzLCAweDU5LCAweEYxLCAweEQ5LCAweEYxLCAweEQwLCAvKiAweDUwLTB4NTMgKi8KKwkweEYxLCAweERBLCAweDAwLCAweDAwLCAweEYxLCAweEQ2LCAweEYxLCAweEQ4LCAvKiAweDU0LTB4NTcgKi8KKwkweEYxLCAweERDLCAweEYxLCAweEQ1LCAweEYxLCAweERELCAweEYxLCAweEQzLCAvKiAweDU4LTB4NUIgKi8KKwkweEYxLCAweENGLCAweEMzLCAweDVBLCAweDAwLCAweDAwLCAweEYxLCAweERCLCAvKiAweDVDLTB4NUYgKi8KKwkweEMzLCAweDVCLCAweEM0LCAweDRELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEVGLCAweDc4LCAvKiAweDY0LTB4NjcgKi8KKwkweEYzLCAweEYxLCAweEYzLCAweEU4LCAweEM0LCAweDRGLCAweEYzLCAweEU0LCAvKiAweDY4LTB4NkIgKi8KKwkweEM0LCAweDUwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEYzLCAweEVELCAvKiAweDZDLTB4NkYgKi8KKwkweEYzLCAweEU3LCAweEYzLCAweERELCAweEM0LCAweDRFLCAweEYzLCAweEVBLCAvKiAweDcwLTB4NzMgKi8KKwkweEYzLCAweEU1LCAweEYzLCAweEU2LCAweDAwLCAweDAwLCAweEYzLCAweEQ4LCAvKiAweDc0LTB4NzcgKi8KKwkweEYzLCAweERGLCAweEYzLCAweEVFLCAweDAwLCAweDAwLCAweEYzLCAweEVCLCAvKiAweDc4LTB4N0IgKi8KKwkweDAwLCAweDAwLCAweEYzLCAweEUzLCAweDAwLCAweDAwLCAweEYzLCAweEVGLCAvKiAweDdDLTB4N0YgKi8KKwkKKwkweEYzLCAweERFLCAweEYzLCAweEQ5LCAweEYzLCAweEVDLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODMgKi8KKwkweEYzLCAweERCLCAweEYzLCAweEU5LCAweEYzLCAweEUwLCAweEYzLCAweEYwLCAvKiAweDg0LTB4ODcgKi8KKwkweEYzLCAweERDLCAweEM0LCAweDRDLCAweEYzLCAweERBLCAweEYzLCAweEUxLCAvKiAweDg4LTB4OEIgKi8KKwkweEYzLCAweEUyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDhDLTB4OEYgKi8KKwkweEY1LCAweDdELCAweDAwLCAweDAwLCAweEY1LCAweDdCLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTMgKi8KKwkweEY1LCAweEEyLCAweDAwLCAweDAwLCAweEY1LCAweEFFLCAweEY1LCAweEE1LCAvKiAweDk0LTB4OTcgKi8KKwkweEY1LCAweDdDLCAweEY1LCAweDc4LCAweEY1LCAweEE3LCAweEY1LCAweDdFLCAvKiAweDk4LTB4OUIgKi8KKwkweEY1LCAweEEzLCAweEY1LCAweDdBLCAweEY1LCAweEFBLCAweEY1LCAweDc3LCAvKiAweDlDLTB4OUYgKi8KKwkweEY1LCAweEExLCAweEY1LCAweEE2LCAweEY1LCAweEE4LCAweEY1LCAweEFCLCAvKiAweEEwLTB4QTMgKi8KKwkweEY1LCAweDc5LCAweDAwLCAweDAwLCAweEY1LCAweEFGLCAweEY1LCAweEIwLCAvKiAweEE0LTB4QTcgKi8KKwkweEY1LCAweEE5LCAweEY1LCAweEFELCAweEY1LCAweEE0LCAweDAwLCAweDAwLCAvKiAweEE4LTB4QUIgKi8KKwkweEY2LCAweEMxLCAweEY2LCAweEM0LCAweDAwLCAweDAwLCAweEM1LCAweDYxLCAvKiAweEFDLTB4QUYgKi8KKwkweDAwLCAweDAwLCAweEY2LCAweEMzLCAweEY2LCAweEM4LCAweEY2LCAweEM2LCAvKiAweEIwLTB4QjMgKi8KKwkweEM1LCAweDYyLCAweEY2LCAweEJELCAweEY2LCAweEIzLCAweEY2LCAweEIyLCAvKiAweEI0LTB4QjcgKi8KKwkweEM1LCAweDY0LCAweEY2LCAweEJGLCAweEY2LCAweEMwLCAweEY2LCAweEJDLCAvKiAweEI4LTB4QkIgKi8KKwkweEY2LCAweEI0LCAweDAwLCAweDAwLCAweEY2LCAweEI5LCAweEY1LCAweEFDLCAvKiAweEJDLTB4QkYgKi8KKwkweDAwLCAweDAwLCAweEY2LCAweEI1LCAweEM1LCAweDYzLCAweEY2LCAweEJCLCAvKiAweEMwLTB4QzMgKi8KKwkweDAwLCAweDAwLCAweEY2LCAweEJBLCAweDAwLCAweDAwLCAweEY2LCAweEI2LCAvKiAweEM0LTB4QzcgKi8KKwkweEY2LCAweEMyLCAweDAwLCAweDAwLCAweEY2LCAweEI3LCAweEY3LCAweEJCLCAvKiAweEM4LTB4Q0IgKi8KKwkweEY2LCAweEM1LCAweEY2LCAweEM3LCAweEY2LCAweEJFLCAweEY2LCAweEI4LCAvKiAweENDLTB4Q0YgKi8KKwkweEY3LCAweEJDLCAweEY3LCAweEJFLCAweEY3LCAweEI4LCAweEM1LCAweEMyLCAvKiAweEQwLTB4RDMgKi8KKwkweDAwLCAweDAwLCAweEY3LCAweEM1LCAweEY3LCAweEMzLCAweEM1LCAweEMzLCAvKiAweEQ0LTB4RDcgKi8KKwkweEY3LCAweEMyLCAweEY3LCAweEMxLCAweEY3LCAweEJBLCAweEY3LCAweEI3LCAvKiAweEQ4LTB4REIgKi8KKwkweEY3LCAweEJELCAweEY3LCAweEM2LCAweEY3LCAweEI5LCAweEY3LCAweEJGLCAvKiAweERDLTB4REYgKi8KKwkweDAwLCAweDAwLCAweEY4LCAweDY5LCAweEY4LCAweDZFLCAweEY4LCAweDY0LCAvKiAweEUwLTB4RTMgKi8KKwkweEY4LCAweDY3LCAweEM1LCAweEVFLCAweEY4LCAweDZCLCAweDAwLCAweDAwLCAvKiAweEU0LTB4RTcgKi8KKwkweEY4LCAweDcyLCAweEY3LCAweEMwLCAweDAwLCAweDAwLCAweEY4LCAweDY1LCAvKiAweEU4LTB4RUIgKi8KKwkweEY4LCAweDZGLCAweEY4LCAweDczLCAweEY4LCAweDZBLCAweEY4LCAweDYzLCAvKiAweEVDLTB4RUYgKi8KKwkweEY4LCAweDZELCAweDAwLCAweDAwLCAweEY4LCAweDZDLCAweEY4LCAweDcxLCAvKiAweEYwLTB4RjMgKi8KKwkweEY4LCAweDcwLCAweEY3LCAweEM0LCAweEY4LCAweDY4LCAweEY4LCAweDYyLCAvKiAweEY0LTB4RjcgKi8KKwkweEY4LCAweDY2LCAweEM2LCAweDRFLCAweEM2LCAweDRGLCAweEY4LCAweDYxLCAvKiAweEY4LTB4RkIgKi8KKwkweDAwLCAweDAwLCAweEY4LCAweEU2LCAweEY4LCAweERELCAweEY4LCAweEU1LCAvKiAweEZDLTB4RkYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY185RVs1MTJdID0geworCTB4RjgsIDB4RTIsIDB4RjgsIDB4RTMsIDB4RjgsIDB4REMsIDB4RjgsIDB4REYsIC8qIDB4MDAtMHgwMyAqLworCTB4RjgsIDB4RTcsIDB4RjgsIDB4RTEsIDB4RjgsIDB4RTAsIDB4RjgsIDB4REUsIC8qIDB4MDQtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4RjgsIDB4RTQsIDB4MDAsIDB4MDAsIDB4RjksIDB4NUQsIC8qIDB4MDgtMHgwQiAqLworCTB4MDAsIDB4MDAsIDB4RjksIDB4NUUsIDB4MDAsIDB4MDAsIDB4RjksIDB4NjAsIC8qIDB4MEMtMHgwRiAqLworCTB4RjksIDB4NUYsIDB4RjksIDB4NjIsIDB4RjksIDB4NjEsIDB4RjksIDB4N0MsIC8qIDB4MTAtMHgxMyAqLworCTB4RjksIDB4N0IsIDB4RjksIDB4QjcsIDB4MDAsIDB4MDAsIDB4RjksIDB4QjgsIC8qIDB4MTQtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4RjksIDB4QzUsIDB4QzYsIDB4NzgsIDB4QzYsIDB4N0MsIC8qIDB4MTgtMHgxQiAqLworCTB4MDAsIDB4MDAsIDB4RjksIDB4Q0YsIDB4QzYsIDB4N0QsIDB4MDAsIDB4MDAsIC8qIDB4MUMtMHgxRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjQtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MkMtMHgyRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzQtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4M0MtMHgzRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDQtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NEMtMHg0RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTQtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4QjMsIDB4QkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4QzQsIDB4RDAsIDB4RjYsIDB4QzksIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4QzYsIDB4NTAsIDB4QzYsIDB4NTEsIDB4MDAsIDB4MDAsIDB4QjMsIDB4QzAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4RTAsIDB4RUUsIDB4MDAsIDB4MDAsIDB4QjksIDB4QTgsIDB4RTgsIDB4RjAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RUMsIDB4QjAsIDB4RUMsIDB4QjEsIC8qIDB4ODQtMHg4NyAqLworCTB4RUMsIDB4QUYsIDB4RUYsIDB4QUIsIDB4RUYsIDB4QUEsIDB4QzIsIDB4NDcsIC8qIDB4ODgtMHg4QiAqLworCTB4RjEsIDB4REYsIDB4RUYsIDB4QUMsIDB4RjEsIDB4REUsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4RjMsIDB4RjMsIDB4QzQsIDB4NTEsIDB4QzQsIDB4NTMsIC8qIDB4OTAtMHg5MyAqLworCTB4RjMsIDB4RjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QzQsIDB4NTIsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4RjUsIDB4QjEsIDB4RjUsIDB4QjMsIDB4RjUsIDB4QjIsIC8qIDB4OTgtMHg5QiAqLworCTB4RjYsIDB4Q0EsIDB4QzUsIDB4NjUsIDB4MDAsIDB4MDAsIDB4QzUsIDB4RUYsIC8qIDB4OUMtMHg5RiAqLworCTB4RjgsIDB4RTgsIDB4RjksIDB4NjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4RjksIDB4RDIsIDB4QjMsIDB4QzEsIDB4MDAsIDB4MDAsIDB4RTQsIDB4RTUsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4QkUsIDB4QTIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4RUMsIDB4QjMsIDB4RUMsIDB4QjIsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4RUYsIDB4QUQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4QzQsIDB4NTQsIDB4QzQsIDB4RDEsIDB4RjcsIDB4QzcsIDB4RjksIDB4Q0IsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QjMsIDB4QzIsIC8qIDB4QjgtMHhCQiAqLworCTB4QkIsIDB4RjIsIDB4MDAsIDB4MDAsIDB4QkUsIDB4QTMsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4RjMsIDB4RjQsIDB4MDAsIDB4MDAsIDB4RjgsIDB4NzQsIDB4QjYsIDB4QzAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4RUYsIDB4QUUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4QzYsIDB4NjQsIDB4QjYsIDB4QzEsIDB4QkUsIDB4QTQsIDB4QzIsIDB4NDgsIC8qIDB4Q0MtMHhDRiAqLworCTB4RjgsIDB4NzUsIDB4QjYsIDB4QzIsIDB4MDAsIDB4MDAsIDB4RTgsIDB4RjEsIC8qIDB4RDAtMHhEMyAqLworCTB4QzAsIDB4NzIsIDB4RUMsIDB4QjQsIDB4RUMsIDB4QjUsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4QzAsIDB4NzEsIDB4MDAsIDB4MDAsIDB4RUYsIDB4QUYsIDB4QzIsIDB4NEMsIC8qIDB4RDgtMHhEQiAqLworCTB4QzIsIDB4NEEsIDB4QzIsIDB4NEIsIDB4QzIsIDB4NDksIDB4RjEsIDB4RTAsIC8qIDB4REMtMHhERiAqLworCTB4QzMsIDB4NUMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTAtMHhFMyAqLworCTB4RjUsIDB4QjUsIDB4RjUsIDB4QjQsIDB4RjUsIDB4QjcsIDB4RjUsIDB4QjYsIC8qIDB4RTQtMHhFNyAqLworCTB4QzQsIDB4RDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RjYsIDB4Q0IsIC8qIDB4RTgtMHhFQiAqLworCTB4MDAsIDB4MDAsIDB4RjYsIDB4Q0QsIDB4RjYsIDB4Q0MsIDB4QzUsIDB4NjYsIC8qIDB4RUMtMHhFRiAqLworCTB4RjcsIDB4QzgsIDB4MDAsIDB4MDAsIDB4RjgsIDB4NzYsIDB4RjgsIDB4NzcsIC8qIDB4RjAtMHhGMyAqLworCTB4QzUsIDB4RjAsIDB4RjksIDB4NjQsIDB4RjksIDB4N0QsIDB4QzYsIDB4NzUsIC8qIDB4RjQtMHhGNyAqLworCTB4MDAsIDB4MDAsIDB4REMsIDB4QjAsIDB4RUMsIDB4QjYsIDB4RUYsIDB4QjAsIC8qIDB4RjgtMHhGQiAqLworCTB4RjMsIDB4RjUsIDB4RTAsIDB4RUYsIDB4MDAsIDB4MDAsIDB4RUYsIDB4QjEsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjXzlGWzUxMl0gPSB7CisJMHhGMSwgMHhFMiwgMHhGMSwgMHhFMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDAzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOCwgMHg3OCwgMHhDNiwgMHg1MiwgLyogMHgwNC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHhGOSwgMHg2NSwgMHhGOSwgMHg3RSwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCOSwgMHhBOSwgMHhFOCwgMHhGMiwgLyogMHgwQy0weDBGICovCisJMHhFOCwgMHhGMywgMHgwMCwgMHgwMCwgMHhFQywgMHhCNywgMHhCOSwgMHhBQSwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHhDMywgMHg1RCwgMHhGMSwgMHhFMywgMHgwMCwgMHgwMCwgLyogMHgxNC0weDE3ICovCisJMHhGNiwgMHhDRiwgMHhDNSwgMHg2NywgMHhGNiwgMHhEMCwgMHhGNiwgMHhDRSwgLyogMHgxOC0weDFCICovCisJMHhGOCwgMHg3OSwgMHgwMCwgMHgwMCwgMHhGOCwgMHhFOSwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHhCOSwgMHhBQiwgMHgwMCwgMHgwMCwgMHhFRiwgMHhCNCwgMHhFRiwgMHhCMywgLyogMHgyMC0weDIzICovCisJMHhFRiwgMHhCMiwgMHhGMSwgMHhFNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHhGMSwgMHhFOCwgMHhGMSwgMHhFNywgMHhGMSwgMHhFNiwgMHhGMSwgMHhFNSwgLyogMHgyOC0weDJCICovCisJMHhDMywgMHg1RSwgMHhGMywgMHhGNiwgMHhGNSwgMHhCOSwgMHhDNCwgMHhEMywgLyogMHgyQy0weDJGICovCisJMHhGNSwgMHhCOCwgMHhGNiwgMHhEMSwgMHhGNywgMHhDQiwgMHhGNywgMHhDQSwgLyogMHgzMC0weDMzICovCisJMHhDNSwgMHhDNCwgMHhGNywgMHhDOSwgMHhGOCwgMHg3QywgMHhGOCwgMHg3QiwgLyogMHgzNC0weDM3ICovCisJMHhGOCwgMHg3QSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQiwgMHhGMywgLyogMHgzOC0weDNCICovCisJMHgwMCwgMHgwMCwgMHhFQywgMHhCOCwgMHhDMiwgMHg0RCwgMHgwMCwgMHgwMCwgLyogMHgzQy0weDNGICovCisJMHhGMywgMHhGNywgMHhGMywgMHhGOCwgMHhGNywgMHhDQywgMHhGOCwgMHg3RCwgLyogMHg0MC0weDQzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOCwgMHhFQSwgMHhGOSwgMHg2NiwgLyogMHg0NC0weDQ3ICovCisJMHhGOSwgMHhCOSwgMHhGOSwgMHhENCwgMHhCQiwgMHhGNCwgMHhDMiwgMHg0RSwgLyogMHg0OC0weDRCICovCisJMHhGMSwgMHhFOSwgMHhGMywgMHhGOSwgMHhGNiwgMHhEMiwgMHhGOCwgMHg3RSwgLyogMHg0Qy0weDRGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCRSwgMHhBNiwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDUzICovCisJMHhFRiwgMHhCNSwgMHhGMSwgMHhFQSwgMHhGMywgMHhGQSwgMHhGMywgMHhGQiwgLyogMHg1NC0weDU3ICovCisJMHhGMywgMHhGQywgMHhGNSwgMHhCRSwgMHgwMCwgMHgwMCwgMHhGNSwgMHhCQSwgLyogMHg1OC0weDVCICovCisJMHhDNSwgMHg2OCwgMHhGNSwgMHhCRCwgMHhGNSwgMHhCQywgMHhDNCwgMHhENCwgLyogMHg1Qy0weDVGICovCisJMHhGNSwgMHhCQiwgMHhDNCwgMHhENiwgMHgwMCwgMHgwMCwgMHhDNCwgMHhENSwgLyogMHg2MC0weDYzICovCisJMHhGNiwgMHhENCwgMHhGNiwgMHhEMywgMHhDNSwgMHg2OSwgMHhDNSwgMHg2QSwgLyogMHg2NC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDNSwgMHhDNiwgMHhGNywgMHhDRCwgLyogMHg2OC0weDZCICovCisJMHhDNSwgMHhDNSwgMHgwMCwgMHgwMCwgMHhGOCwgMHhBMywgMHhGOCwgMHhBNCwgLyogMHg2Qy0weDZGICovCisJMHhGOCwgMHhBMiwgMHhGOCwgMHhBMSwgMHhDNiwgMHg1NCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDczICovCisJMHhGOCwgMHhFQiwgMHhGOCwgMHhFQywgMHhGOCwgMHhFRCwgMHhDNiwgMHg1MywgLyogMHg3NC0weDc3ICovCisJMHhGOSwgMHg2NywgMHhGOSwgMHg2QSwgMHhGOSwgMHg2OSwgMHhGOSwgMHg2OCwgLyogMHg3OC0weDdCICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGOSwgMHhEMywgMHgwMCwgMHgwMCwgLyogMHg3Qy0weDdGICovCisJCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDgzICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4NC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhCICovCisJMHgwMCwgMHgwMCwgMHhDMCwgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4Qy0weDhGICovCisJMHhDMywgMHg2NSwgMHhGNSwgMHhCRiwgMHhGNiwgMHhENSwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDkzICovCisJMHhDNSwgMHhDNywgMHhGNywgMHhDRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5NC0weDk3ICovCisJMHhGOSwgMHhENSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlCICovCisJMHhDMCwgMHg3NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5Qy0weDlGICovCisJMHhFRiwgMHhCNiwgMHgwMCwgMHgwMCwgMHhGNywgMHhDRiwgMHgwMCwgMHgwMCwgLyogMHhBMC0weEEzICovCisJMHhGOSwgMHhBMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhBNC0weEE3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfRENbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19GOVs1MTJdID0geworCTB4QjAsIDB4NUEsIDB4QTcsIDB4RjMsIDB4QTgsIDB4QUUsIDB4QjgsIDB4RUIsIC8qIDB4MDAtMHgwMyAqLworCTB4QjcsIDB4QzYsIDB4QTYsIDB4RUEsIDB4QTUsIDB4NzksIDB4QzAsIDB4NzQsIC8qIDB4MDQtMHgwNyAqLworCTB4QzAsIDB4NzQsIDB4QUIsIDB4QjQsIDB4QUEsIDB4RjcsIDB4QjMsIDB4RTIsIC8qIDB4MDgtMHgwQiAqLworCTB4QTksIDB4NjAsIDB4QzMsIDB4NjksIDB4QzQsIDB4RUUsIDB4QzMsIDB4QjksIC8qIDB4MEMtMHgwRiAqLworCTB4QzUsIDB4REEsIDB4QzEsIDB4QjMsIDB4QkIsIDB4NzIsIDB4QzUsIDB4REUsIC8qIDB4MTAtMHgxMyAqLworCTB4QkMsIDB4RDYsIDB4QUMsIDB4QTUsIDB4QUYsIDB4NEYsIDB4QUYsIDB4NUYsIC8qIDB4MTQtMHgxNyAqLworCTB4QjgsIDB4QTgsIDB4QjksIDB4NTQsIDB4QzAsIDB4NjQsIDB4QjYsIDB4QzMsIC8qIDB4MTgtMHgxQiAqLworCTB4QTcsIDB4NUEsIDB4QzQsIDB4RTYsIDB4QzQsIDB4RUEsIDB4QzQsIDB4RjUsIC8qIDB4MUMtMHgxRiAqLworCTB4QzYsIDB4N0QsIDB4QjQsIDB4NTAsIDB4QzAsIDB4REQsIDB4QzIsIDB4QzUsIC8qIDB4MjAtMHgyMyAqLworCTB4QzQsIDB4QjAsIDB4QTksIDB4RDQsIDB4QzMsIDB4QkUsIDB4QzQsIDB4RkEsIC8qIDB4MjQtMHgyNyAqLworCTB4QjQsIDB4NTksIDB4QUUsIDB4RDQsIDB4QUUsIDB4RjYsIDB4QUYsIDB4NTQsIC8qIDB4MjgtMHgyQiAqLworCTB4MDAsIDB4MDAsIDB4QTgsIDB4RDMsIDB4QTcsIDB4NEUsIDB4QjMsIDB4RDIsIC8qIDB4MkMtMHgyRiAqLworCTB4QkUsIDB4REIsIDB4QzMsIDB4NzIsIDB4QzQsIDB4NkMsIDB4QkYsIDB4NjMsIC8qIDB4MzAtMHgzMyAqLworCTB4QTYsIDB4RDEsIDB4QzQsIDB4QUEsIDB4QjgsIDB4QjgsIDB4QjgsIDB4RjQsIC8qIDB4MzQtMHgzNyAqLworCTB4QzUsIDB4NTMsIDB4QkUsIDB4N0MsIDB4QzYsIDB4NEYsIDB4QjgsIDB4NEMsIC8qIDB4MzgtMHgzQiAqLworCTB4QjgsIDB4NTMsIDB4QkEsIDB4RjEsIDB4REIsIDB4NzcsIDB4QkYsIDB4RkQsIC8qIDB4M0MtMHgzRiAqLworCTB4QjMsIDB4QzAsIDB4QkQsIDB4RDcsIDB4QzMsIDB4NjIsIDB4QTcsIDB4Q0IsIC8qIDB4NDAtMHg0MyAqLworCTB4QzUsIDB4QTIsIDB4QzUsIDB4QTQsIDB4QTgsIDB4NjMsIDB4QkQsIDB4NTUsIC8qIDB4NDQtMHg0NyAqLworCTB4QjgsIDB4RUYsIDB4QjksIDB4NzAsIDB4QzIsIDB4NTMsIDB4QjksIDB4RjAsIC8qIDB4NDgtMHg0QiAqLworCTB4QkMsIDB4RDMsIDB4QjIsIDB4NUMsIDB4QkEsIDB4N0MsIDB4QjIsIDB4RDYsIC8qIDB4NEMtMHg0RiAqLworCTB4QzEsIDB4NUMsIDB4QUQsIDB4QUUsIDB4QjAsIDB4QzcsIDB4QTYsIDB4RDgsIC8qIDB4NTAtMHg1MyAqLworCTB4QkIsIDB4RkUsIDB4QUQsIDB4RTIsIDB4QjgsIDB4NTcsIDB4QkEsIDB4RjAsIC8qIDB4NTQtMHg1NyAqLworCTB4QjUsIDB4RDksIDB4QjMsIDB4QUUsIDB4QzUsIDB4QUEsIDB4Q0UsIDB4RDQsIC8qIDB4NTgtMHg1QiAqLworCTB4QkMsIDB4RDYsIDB4QkYsIDB4RDUsIDB4QTQsIDB4QTYsIDB4QjksIDB4RTcsIC8qIDB4NUMtMHg1RiAqLworCTB4QUIsIDB4RTMsIDB4QjIsIDB4NzYsIDB4QjIsIDB4QTcsIDB4QTUsIDB4NUYsIC8qIDB4NjAtMHg2MyAqLworCTB4RUQsIDB4QTgsIDB4QUIsIDB4NEIsIDB4QjQsIDB4NUYsIDB4QTQsIDB4QTMsIC8qIDB4NjQtMHg2NyAqLworCTB4QUEsIDB4NjMsIDB4QkMsIDB4QzYsIDB4QUYsIDB4QzEsIDB4QjAsIDB4RDEsIC8qIDB4NjgtMHg2QiAqLworCTB4QjYsIDB4RUIsIDB4QUMsIDB4RDksIDB4QjgsIDB4QUQsIDB4QkIsIDB4QTEsIC8qIDB4NkMtMHg2RiAqLworCTB4QjEsIDB4RkUsIDB4QTgsIDB4QjAsIDB4QTgsIDB4NDgsIDB4QUMsIDB4NDIsIC8qIDB4NzAtMHg3MyAqLworCTB4QUQsIDB4NTksIDB4QjEsIDB4QjAsIDB4QjIsIDB4QTQsIDB4QUIsIDB4NDcsIC8qIDB4NzQtMHg3NyAqLworCTB4QTgsIDB4RTIsIDB4MDAsIDB4MDAsIDB4QjEsIDB4RTcsIDB4QzIsIDB4QjMsIC8qIDB4NzgtMHg3QiAqLworCTB4QTgsIDB4N0QsIDB4QkQsIDB4Q0MsIDB4QjYsIDB4NzEsIDB4QzAsIDB4NzksIC8qIDB4N0MtMHg3RiAqLworCQorCTB4QTcsIDB4NjYsIDB4QTQsIDB4NkIsIDB4QzMsIDB4NjYsIDB4QUUsIDB4QzgsIC8qIDB4ODAtMHg4MyAqLworCTB4QzIsIDB4NkYsIDB4QzQsIDB4NzIsIDB4QkUsIDB4NUIsIDB4QzYsIDB4N0EsIC8qIDB4ODQtMHg4NyAqLworCTB4QzQsIDB4NTIsIDB4QkUsIDB4QTQsIDB4QTQsIDB4NEYsIDB4QkUsIDB4RTQsIC8qIDB4ODgtMHg4QiAqLworCTB4QkUsIDB4RkEsIDB4RjcsIDB4NjUsIDB4QTYsIDB4N0UsIDB4QkMsIDB4QTYsIC8qIDB4OEMtMHg4RiAqLworCTB4QzUsIDB4Q0EsIDB4QkMsIDB4QkYsIDB4QkEsIDB4QTcsIDB4QjcsIDB4RDIsIC8qIDB4OTAtMHg5MyAqLworCTB4RTYsIDB4QTMsIDB4MDAsIDB4MDAsIDB4QkQsIDB4NkQsIDB4QzEsIDB4NzAsIC8qIDB4OTQtMHg5NyAqLworCTB4QkQsIDB4RkIsIDB4QkQsIDB4QUMsIDB4QjMsIDB4NzMsIDB4QzEsIDB4RTUsIC8qIDB4OTgtMHg5QiAqLworCTB4QTYsIDB4NDMsIDB4QTYsIDB4NDgsIDB4QUIsIDB4N0MsIDB4QUYsIDB4NTAsIC8qIDB4OUMtMHg5RiAqLworCTB4QjUsIDB4RjUsIDB4QkIsIDB4QTEsIDB4QjcsIDB4NDcsIDB4QTksIDB4QzAsIC8qIDB4QTAtMHhBMyAqLworCTB4QjEsIDB4QzksIDB4QzAsIDB4RDQsIDB4QzMsIDB4QUUsIDB4QzIsIDB4NzksIC8qIDB4QTQtMHhBNyAqLworCTB4QTUsIDB4NEYsIDB4Q0IsIDB4RjEsIDB4QjksIDB4RTcsIDB4QzAsIDB4QUQsIC8qIDB4QTgtMHhBQiAqLworCTB4Q0MsIDB4QjAsIDB4QUMsIDB4QzIsIDB4QkMsIDB4RkMsIDB4QjIsIDB4REMsIC8qIDB4QUMtMHhBRiAqLworCTB4QjIsIDB4RTIsIDB4QjksIDB4NjEsIDB4QjksIDB4NzMsIDB4QzYsIDB4NDYsIC8qIDB4QjAtMHhCMyAqLworCTB4QkIsIDB4RTIsIDB4QTgsIDB4RDIsIDB4QzIsIDB4QTcsIDB4QzQsIDB4QkYsIC8qIDB4QjQtMHhCNyAqLworCTB4QzEsIDB4RjUsIDB4QjQsIDB4NjMsIDB4QTQsIDB4NDYsIDB4QjksIDB4QjEsIC8qIDB4QjgtMHhCQiAqLworCTB4QkMsIDB4NjQsIDB4QTcsIDB4QkYsIDB4QUUsIDB4QzYsIDB4QkMsIDB4RDYsIC8qIDB4QkMtMHhCRiAqLworCTB4QkYsIDB4NTIsIDB4QzAsIDB4RjgsIDB4RTcsIDB4NjQsIDB4QkYsIDB4RjEsIC8qIDB4QzAtMHhDMyAqLworCTB4QzAsIDB4NzMsIDB4QjcsIDB4NzcsIDB4QTgsIDB4QkYsIDB4QkMsIDB4NDIsIC8qIDB4QzQtMHhDNyAqLworCTB4Q0MsIDB4RDgsIDB4QUMsIDB4NjgsIDB4QUMsIDB4NzksIDB4QjcsIDB4QzgsIC8qIDB4QzgtMHhDQiAqLworCTB4QUYsIDB4NUIsIDB4QUYsIDB4NjQsIDB4QjIsIDB4QjgsIDB4QUYsIDB4QzMsIC8qIDB4Q0MtMHhDRiAqLworCTB4QzMsIDB4RkUsIDB4QTQsIDB4QkIsIDB4QkMsIDB4QUUsIDB4QjMsIDB4QjAsIC8qIDB4RDAtMHhEMyAqLworCTB4QUQsIDB4REIsIDB4QjEsIDB4NUIsIDB4QjIsIDB4NUYsIDB4QkQsIDB4RkMsIC8qIDB4RDQtMHhENyAqLworCTB4QUIsIDB4REYsIDB4QjcsIDB4NTgsIDB4QUUsIDB4REYsIDB4QjIsIDB4NzYsIC8qIDB4RDgtMHhEQiAqLworCTB4QjYsIDB4QTksIDB4QTcsIDB4NTEsIDB4QTYsIDB4NEYsIDB4QkMsIDB4NjksIC8qIDB4REMtMHhERiAqLworCTB4QTksIDB4RjYsIDB4QTcsIDB4RjUsIDB4QjEsIDB4RjksIDB4QUEsIDB4NjQsIC8qIDB4RTAtMHhFMyAqLworCTB4QjIsIDB4N0EsIDB4QjUsIDB4NjcsIDB4QkYsIDB4QTksIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworCTB4QjgsIDB4Q0MsIDB4QTgsIDB4QkQsIDB4QzIsIDB4RjcsIDB4QjAsIDB4Q0UsIC8qIDB4RTgtMHhFQiAqLworCTB4QjcsIDB4QzQsIDB4QTcsIDB4NUIsIDB4QkYsIDB4NEQsIDB4QkYsIDB4NUEsIC8qIDB4RUMtMHhFRiAqLworCTB4QzQsIDB4QTksIDB4MDAsIDB4MDAsIDB4QzUsIDB4RUMsIDB4QzUsIDB4RUYsIC8qIDB4RjAtMHhGMyAqLworCTB4QUEsIDB4NEMsIDB4QjIsIDB4NEYsIDB4QzEsIDB4N0IsIDB4QTUsIDB4REYsIC8qIDB4RjQtMHhGNyAqLworCTB4QjIsIDB4QzEsIDB4QjIsIDB4QzksIDB4QUEsIDB4QUMsIDB4QUEsIDB4QTUsIC8qIDB4RjgtMHhGQiAqLworCTB4QzMsIDB4RDEsIDB4QTQsIDB4QjAsIDB4QUYsIDB4RjksIDB4QTgsIDB4RUIsIC8qIDB4RkMtMHhGRiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdTJjX0ZBWzUxMl0gPSB7CisJMHhBNCwgMHhDMSwgMHhBQiwgMHhENywgMHhBOSwgMHhERCwgMHhCRiwgMHg3RCwgLyogMHgwMC0weDAzICovCisJMHhBNiwgMHg3NiwgMHhBQywgMHg3RCwgMHhCQywgMHhDOSwgMHhCRiwgMHhFNywgLyogMHgwNC0weDA3ICovCisJMHhBNiwgMHhFNiwgMHhBRCwgMHhCMCwgMHhBOCwgMHhBMywgMHhCOSwgMHhGOCwgLyogMHgwOC0weDBCICovCisJMHhDOSwgMHg0QSwgMHhERCwgMHhGQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwQy0weDBGICovCisJMHhCNiwgMHhFRiwgMHgwMCwgMHgwMCwgMHhCNCwgMHhCOCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDEzICovCisJMHgwMCwgMHgwMCwgMHhFOCwgMHhGOSwgMHhCRCwgMHhERSwgMHhBRiwgMHg3MSwgLyogMHgxNC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHhBRiwgMHhBQiwgMHhCMiwgMHhCQiwgMHhCQSwgMHhENiwgLyogMHgxOC0weDFCICovCisJMHhCOSwgMHg3NCwgMHhCQSwgMHhFQiwgMHhBNiwgMHhEMCwgMHgwMCwgMHgwMCwgLyogMHgxQy0weDFGICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCRCwgMHhEMSwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDIzICovCisJMHgwMCwgMHgwMCwgMHhCNiwgMHg2OCwgMHhCMywgMHhBMywgMHgwMCwgMHgwMCwgLyogMHgyNC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCNiwgMHhCQSwgMHhCOSwgMHg3RCwgLyogMHgyOC0weDJCICovCisJMHhDMCwgMHg1RCwgMHhDNSwgMHg2MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyQy0weDJGICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1MmNfRkVbNTEyXSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA0LTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MEIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDBDLTB4MEYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE0LTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MUIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDFDLTB4MUYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjMgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI0LTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MkIgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDJDLTB4MkYgKi8KKwkweEExLCAweDRBLCAweEExLCAweDU3LCAweDAwLCAweDAwLCAweEExLCAweDU5LCAvKiAweDMwLTB4MzMgKi8KKwkweEExLCAweDVCLCAweEExLCAweDVGLCAweEExLCAweDYwLCAweEExLCAweDYzLCAvKiAweDM0LTB4MzcgKi8KKwkweEExLCAweDY0LCAweEExLCAweDY3LCAweEExLCAweDY4LCAweEExLCAweDZCLCAvKiAweDM4LTB4M0IgKi8KKwkweEExLCAweDZDLCAweEExLCAweDZGLCAweEExLCAweDcwLCAweEExLCAweDczLCAvKiAweDNDLTB4M0YgKi8KKwkweEExLCAweDc0LCAweEExLCAweDc3LCAweEExLCAweDc4LCAweEExLCAweDdCLCAvKiAweDQwLTB4NDMgKi8KKwkweEExLCAweDdDLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ0LTB4NDcgKi8KKwkweDAwLCAweDAwLCAweEExLCAweEM2LCAweEExLCAweEM3LCAweEExLCAweENBLCAvKiAweDQ4LTB4NEIgKi8KKwkweEExLCAweENCLCAweEExLCAweEM4LCAweEExLCAweEM5LCAweEExLCAweDVDLCAvKiAweDRDLTB4NEYgKi8KKwkweEExLCAweDRELCAweEExLCAweDRFLCAweEExLCAweDRGLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTMgKi8KKwkweEExLCAweDUxLCAweEExLCAweDUyLCAweEExLCAweDUzLCAweEExLCAweDU0LCAvKiAweDU0LTB4NTcgKi8KKwkweDAwLCAweDAwLCAweEExLCAweDdELCAweEExLCAweDdFLCAweEExLCAweEExLCAvKiAweDU4LTB4NUIgKi8KKwkweEExLCAweEEyLCAweEExLCAweEEzLCAweEExLCAweEE0LCAweEExLCAweENDLCAvKiAweDVDLTB4NUYgKi8KKwkweEExLCAweENELCAweEExLCAweENFLCAweEExLCAweERFLCAweEExLCAweERGLCAvKiAweDYwLTB4NjMgKi8KKwkweEExLCAweEUwLCAweEExLCAweEUxLCAweEExLCAweEUyLCAweDAwLCAweDAwLCAvKiAweDY0LTB4NjcgKi8KKwkweEEyLCAweDQyLCAweEEyLCAweDRDLCAweEEyLCAweDRELCAweEEyLCAweDRFLCAvKiAweDY4LTB4NkIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHUyY19GRls1MTJdID0geworCTB4MDAsIDB4MDAsIDB4QTEsIDB4NDksIDB4QTEsIDB4QTgsIDB4QTEsIDB4QUQsIC8qIDB4MDAtMHgwMyAqLworCTB4QTIsIDB4NDMsIDB4QTIsIDB4NDgsIDB4QTEsIDB4QUUsIDB4QTEsIDB4QTYsIC8qIDB4MDQtMHgwNyAqLworCTB4QTEsIDB4NUQsIDB4QTEsIDB4NUUsIDB4QTEsIDB4QUYsIDB4QTEsIDB4Q0YsIC8qIDB4MDgtMHgwQiAqLworCTB4QTEsIDB4NDEsIDB4QTEsIDB4RDAsIDB4QTEsIDB4NDQsIDB4QTEsIDB4RkUsIC8qIDB4MEMtMHgwRiAqLworCTB4QTIsIDB4QUYsIDB4QTIsIDB4QjAsIDB4QTIsIDB4QjEsIDB4QTIsIDB4QjIsIC8qIDB4MTAtMHgxMyAqLworCTB4QTIsIDB4QjMsIDB4QTIsIDB4QjQsIDB4QTIsIDB4QjUsIDB4QTIsIDB4QjYsIC8qIDB4MTQtMHgxNyAqLworCTB4QTIsIDB4QjcsIDB4QTIsIDB4QjgsIDB4QTEsIDB4NDcsIDB4QTEsIDB4NDYsIC8qIDB4MTgtMHgxQiAqLworCTB4QTEsIDB4RDUsIDB4QTEsIDB4RDcsIDB4QTEsIDB4RDYsIDB4QTEsIDB4NDgsIC8qIDB4MUMtMHgxRiAqLworCTB4QTIsIDB4NDksIDB4QTIsIDB4Q0YsIDB4QTIsIDB4RDAsIDB4QTIsIDB4RDEsIC8qIDB4MjAtMHgyMyAqLworCTB4QTIsIDB4RDIsIDB4QTIsIDB4RDMsIDB4QTIsIDB4RDQsIDB4QTIsIDB4RDUsIC8qIDB4MjQtMHgyNyAqLworCTB4QTIsIDB4RDYsIDB4QTIsIDB4RDcsIDB4QTIsIDB4RDgsIDB4QTIsIDB4RDksIC8qIDB4MjgtMHgyQiAqLworCTB4QTIsIDB4REEsIDB4QTIsIDB4REIsIDB4QTIsIDB4REMsIDB4QTIsIDB4REQsIC8qIDB4MkMtMHgyRiAqLworCTB4QTIsIDB4REUsIDB4QTIsIDB4REYsIDB4QTIsIDB4RTAsIDB4QTIsIDB4RTEsIC8qIDB4MzAtMHgzMyAqLworCTB4QTIsIDB4RTIsIDB4QTIsIDB4RTMsIDB4QTIsIDB4RTQsIDB4QTIsIDB4RTUsIC8qIDB4MzQtMHgzNyAqLworCTB4QTIsIDB4RTYsIDB4QTIsIDB4RTcsIDB4QTIsIDB4RTgsIDB4QTEsIDB4NjUsIC8qIDB4MzgtMHgzQiAqLworCTB4QTIsIDB4NDAsIDB4QTEsIDB4NjYsIDB4QTEsIDB4NzMsIDB4QTEsIDB4QzQsIC8qIDB4M0MtMHgzRiAqLworCTB4QTEsIDB4QTUsIDB4QTIsIDB4RTksIDB4QTIsIDB4RUEsIDB4QTIsIDB4RUIsIC8qIDB4NDAtMHg0MyAqLworCTB4QTIsIDB4RUMsIDB4QTIsIDB4RUQsIDB4QTIsIDB4RUUsIDB4QTIsIDB4RUYsIC8qIDB4NDQtMHg0NyAqLworCTB4QTIsIDB4RjAsIDB4QTIsIDB4RjEsIDB4QTIsIDB4RjIsIDB4QTIsIDB4RjMsIC8qIDB4NDgtMHg0QiAqLworCTB4QTIsIDB4RjQsIDB4QTIsIDB4RjUsIDB4QTIsIDB4RjYsIDB4QTIsIDB4RjcsIC8qIDB4NEMtMHg0RiAqLworCTB4QTIsIDB4RjgsIDB4QTIsIDB4RjksIDB4QTIsIDB4RkEsIDB4QTIsIDB4RkIsIC8qIDB4NTAtMHg1MyAqLworCTB4QTIsIDB4RkMsIDB4QTIsIDB4RkQsIDB4QTIsIDB4RkUsIDB4QTMsIDB4NDAsIC8qIDB4NTQtMHg1NyAqLworCTB4QTMsIDB4NDEsIDB4QTMsIDB4NDIsIDB4QTMsIDB4NDMsIDB4QTEsIDB4NjEsIC8qIDB4NTgtMHg1QiAqLworCTB4QTEsIDB4NTUsIDB4QTEsIDB4NjIsIDB4QTEsIDB4RTMsIDB4MDAsIDB4MDAsIC8qIDB4NUMtMHg1RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2MyAqLworCTB4QTEsIDB4NEUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjQtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NkMtMHg2RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzQtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4N0MtMHg3RiAqLworCQorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODQtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OEMtMHg4RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5MyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTQtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5QiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OUMtMHg5RiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTAtMHhBMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTQtMHhBNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QTgtMHhBQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QUMtMHhBRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjAtMHhCMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjQtMHhCNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QjgtMHhCQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QkMtMHhCRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzAtMHhDMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzQtMHhDNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4QzgtMHhDQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4Q0MtMHhDRiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDAtMHhEMyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDQtMHhENyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RDgtMHhEQiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4REMtMHhERiAqLworCTB4QTIsIDB4NDYsIDB4QTIsIDB4NDcsIDB4MDAsIDB4MDAsIDB4QTEsIDB4QzMsIC8qIDB4RTAtMHhFMyAqLworCTB4MDAsIDB4MDAsIDB4QTIsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4RTQtMHhFNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnBhZ2VfdW5pMmNoYXJzZXRbMjU2XSA9IHsKKwlOVUxMLCAgIE5VTEwsICAgdTJjXzAyLCB1MmNfMDMsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJdTJjXzIwLCB1MmNfMjEsIHUyY18yMiwgdTJjXzIzLCBOVUxMLCAgIHUyY18yNSwgdTJjXzI2LCBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwl1MmNfMzAsIHUyY18zMSwgdTJjXzMyLCB1MmNfMzMsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICB1MmNfNEUsIHUyY180RiwgCisJdTJjXzUwLCB1MmNfNTEsIHUyY181MiwgdTJjXzUzLCB1MmNfNTQsIHUyY181NSwgdTJjXzU2LCB1MmNfNTcsIAorCXUyY181OCwgdTJjXzU5LCB1MmNfNUEsIHUyY181QiwgdTJjXzVDLCB1MmNfNUQsIHUyY181RSwgdTJjXzVGLCAKKwl1MmNfNjAsIHUyY182MSwgdTJjXzYyLCB1MmNfNjMsIHUyY182NCwgdTJjXzY1LCB1MmNfNjYsIHUyY182NywgCisJdTJjXzY4LCB1MmNfNjksIHUyY182QSwgdTJjXzZCLCB1MmNfNkMsIHUyY182RCwgdTJjXzZFLCB1MmNfNkYsIAorCXUyY183MCwgdTJjXzcxLCB1MmNfNzIsIHUyY183MywgdTJjXzc0LCB1MmNfNzUsIHUyY183NiwgdTJjXzc3LCAKKwl1MmNfNzgsIHUyY183OSwgdTJjXzdBLCB1MmNfN0IsIHUyY183QywgdTJjXzdELCB1MmNfN0UsIHUyY183RiwgCisJdTJjXzgwLCB1MmNfODEsIHUyY184MiwgdTJjXzgzLCB1MmNfODQsIHUyY184NSwgdTJjXzg2LCB1MmNfODcsIAorCXUyY184OCwgdTJjXzg5LCB1MmNfOEEsIHUyY184QiwgdTJjXzhDLCB1MmNfOEQsIHUyY184RSwgdTJjXzhGLCAKKwl1MmNfOTAsIHUyY185MSwgdTJjXzkyLCB1MmNfOTMsIHUyY185NCwgdTJjXzk1LCB1MmNfOTYsIHUyY185NywgCisJdTJjXzk4LCB1MmNfOTksIHUyY185QSwgdTJjXzlCLCB1MmNfOUMsIHUyY185RCwgdTJjXzlFLCB1MmNfOUYsIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIHUyY19EQywgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICB1MmNfRjksIHUyY19GQSwgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgdTJjX0ZFLCB1MmNfRkYsIH07CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQybG93ZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDQwLTB4NDcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDUwLTB4NTcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJ1cHBlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NjAtMHg2NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NzAtMHg3NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgaW50IHVuaTJjaGFyKGNvbnN0IHdjaGFyX3QgdW5pLAorCQkJdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgYm91bmRsZW4pCit7CisJdW5zaWduZWQgY2hhciAqdW5pMmNoYXJzZXQ7CisJdW5zaWduZWQgY2hhciBjbCA9IHVuaSYweEZGOworCXVuc2lnbmVkIGNoYXIgY2ggPSAodW5pPj44KSYweEZGOworCWludCBuOworCisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisKKwl1bmkyY2hhcnNldCA9IHBhZ2VfdW5pMmNoYXJzZXRbY2hdOworCWlmICh1bmkyY2hhcnNldCkgeworCQlpZiAoYm91bmRsZW4gPD0gMSkKKwkJCXJldHVybiAtRU5BTUVUT09MT05HOworCQlvdXRbMF0gPSB1bmkyY2hhcnNldFtjbCoyXTsKKwkJb3V0WzFdID0gdW5pMmNoYXJzZXRbY2wqMisxXTsKKwkJaWYgKG91dFswXSA9PSAweDAwICYmIG91dFsxXSA9PSAweDAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCW4gPSAyOworCX0gZWxzZSBpZiAoY2g9PTAgJiYgY2wpIHsKKwkJb3V0WzBdID0gY2w7CisJCW4gPSAxOworCX0KKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbnQgY2hhcjJ1bmkoY29uc3QgdW5zaWduZWQgY2hhciAqcmF3c3RyaW5nLCBpbnQgYm91bmRsZW4sCisJCQl3Y2hhcl90ICp1bmkpCit7CisJdW5zaWduZWQgY2hhciBjaCwgY2w7CisJd2NoYXJfdCAqY2hhcnNldDJ1bmk7CisJaW50IG47CisKKwlpZiAoYm91bmRsZW4gPD0gMCkKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwlpZiAoYm91bmRsZW4gPT0gMSkgeworCQkqdW5pID0gcmF3c3RyaW5nWzBdOworCQlyZXR1cm4gMTsKKwl9CisKKwljaCA9IHJhd3N0cmluZ1swXTsKKwljbCA9IHJhd3N0cmluZ1sxXTsKKworCWNoYXJzZXQydW5pID0gcGFnZV9jaGFyc2V0MnVuaVtjaF07CisJaWYgKGNoYXJzZXQydW5pICYmIGNsKSB7CisJCSp1bmkgPSBjaGFyc2V0MnVuaVtjbF07CisJCWlmICgqdW5pID09IDB4MDAwMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQluID0gMjsKKwl9IGVsc2V7CisJCSp1bmkgPSBjaDsKKwkJbiA9IDE7CisJfQorCXJldHVybiBuOworfQorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSB0YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJjcDk1MCIsCisJLmFsaWFzCQk9ICJiaWc1IiwKKwkudW5pMmNoYXIJPSB1bmkyY2hhciwKKwkuY2hhcjJ1bmkJPSBjaGFyMnVuaSwKKwkuY2hhcnNldDJsb3dlcgk9IGNoYXJzZXQybG93ZXIsCisJLmNoYXJzZXQydXBwZXIJPSBjaGFyc2V0MnVwcGVyLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmxzX2NwOTUwKHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX25scygmdGFibGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9ubHNfY3A5NTAodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25scygmdGFibGUpOworfQorCittb2R1bGVfaW5pdChpbml0X25sc19jcDk1MCkKK21vZHVsZV9leGl0KGV4aXRfbmxzX2NwOTUwKQorCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CitNT0RVTEVfQUxJQVNfTkxTKGJpZzUpOwpkaWZmIC0tZ2l0IGEvZnMvbmxzL25sc19ldWMtanAuYyBiL2ZzL25scy9ubHNfZXVjLWpwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBmMTA4YQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25scy9ubHNfZXVjLWpwLmMKQEAgLTAsMCArMSw1ODMgQEAKKy8qCisgKiBsaW51eC9mcy9ubHNfZXVjLWpwLmMKKyAqCisgKiBBZGRlZCBgT1NGL0pWQyBSZWNvbW1lbmRlZCBDb2RlIFNldCBDb252ZXJzaW9uIFNwZWNpZmljYXRpb24KKyAqIGJldHdlZW4gSmFwYW5lc2UgRVVDIGFuZCBTaGlmdC1KSVMnIHN1cHBvcnQ6IDxoaXJvZnVtaUBtYWlsLnBhcmtuZXQuY28uanA+CisgKiAoaHR0cDovL3d3dy5vcGVuZ3JvdXAub3IuanAvanZjL2NkZS9zamlzLWV1Yy1lLmh0bWwpCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKK3N0YXRpYyBzdHJ1Y3QgbmxzX3RhYmxlICpwX25sczsKKworI2RlZmluZSBJU19TSklTX0xPV19CWVRFKGwpCSgoMHg0MCA8PSAobCkpICYmICgobCkgPD0gMHhGQykgJiYgKChsKSAhPSAweDdGKSkKKy8qIEpJUyBYIDAyMDggKGluY2x1ZGUgTkVDIHNwZXNpYWwgY2hhcmFjdGVycykgKi8KKyNkZWZpbmUgSVNfU0pJU19KSVNYMDIwOChoLCBsKQkoKCgoMHg4MSA8PSAoaCkpICYmICgoaCkgPD0gMHg5RikpCVwKKwkJCQkgfHwgKCgweEUwIDw9IChoKSkgJiYgKChoKSA8PSAweEVBKSkpCVwKKwkJCQkgJiYgSVNfU0pJU19MT1dfQllURShsKSkKKyNkZWZpbmUgSVNfU0pJU19KSVNYMDIwMUtBTkEoYykJKCgweEExIDw9IChjKSkgJiYgKChjKSA8PSAweERGKSkKKyNkZWZpbmUgSVNfU0pJU19VRENfTE9XKGgsIGwpCSgoKDB4RjAgPD0gKGgpKSAmJiAoKGgpIDw9IDB4RjQpKQlcCisJCQkJICYmIElTX1NKSVNfTE9XX0JZVEUobCkpCisjZGVmaW5lIElTX1NKSVNfVURDX0hJKGgsIGwpCSgoKDB4RjUgPD0gKGgpKSAmJiAoKGgpIDw9IDB4RjkpKQlcCisJCQkJICYmIElTX1NKSVNfTE9XX0JZVEUobCkpCisjZGVmaW5lIElTX1NKSVNfSUJNKGgsIGwpCSgoKDB4RkEgPD0gKGgpKSAmJiAoKGgpIDw9IDB4RkMpKQlcCisJCQkJICYmIElTX1NKSVNfTE9XX0JZVEUobCkpCisjZGVmaW5lIElTX1NKSVNfTkVDSUJNKGgsIGwpCSgoKDB4RUQgPD0gKGgpKSAmJiAoKGgpIDw9IDB4RUUpKQlcCisJCQkJICYmIElTX1NKSVNfTE9XX0JZVEUobCkpCisjZGVmaW5lIE1BUF9TSklTMkVVQyhzamlzX2hpLCBzamlzX2xvLCBzamlzX3AsIGV1Y19oaSwgZXVjX2xvLCBldWNfcCkgewkJXAorCWlmICgoc2ppc19sbykgPj0gMHg5RikgewkJCQkJCVwKKwkJKGV1Y19oaSkgPSAoc2ppc19oaSkgKiAyIC0gKCgoc2ppc19wKSAqIDIgLSAoZXVjX3ApKSAtIDEpOwlcCisJCShldWNfbG8pID0gKHNqaXNfbG8pICsgMjsJCQkJCVwKKwl9IGVsc2UgewkJCQkJCQkJXAorCQkoZXVjX2hpKSA9IChzamlzX2hpKSAqIDIgLSAoKHNqaXNfcCkgKiAyIC0gKGV1Y19wKSk7CQlcCisJCShldWNfbG8pID0gKHNqaXNfbG8pICsgKChzamlzX2xvKSA+PSAweDdGID8gMHg2MCA6IDB4NjEpOwlcCisJfQkJCQkJCQkJCVwKK30gd2hpbGUoMCkKKworI2RlZmluZSBTUzIJCSgweDhFKQkJLyogU2luZ2xlIFNoaWZ0IDIgKi8KKyNkZWZpbmUgU1MzCQkoMHg4RikJCS8qIFNpbmdsZSBTaGlmdCAzICovCisjZGVmaW5lIElTX0VVQ19CWVRFKGMpCQkoKDB4QTEgPD0gKGMpKSAmJiAoKGMpIDw9IDB4RkUpKQorI2RlZmluZSBJU19FVUNfSklTWDAyMDgoaCwgbCkJKElTX0VVQ19CWVRFKGgpICYmIElTX0VVQ19CWVRFKGwpKQorI2RlZmluZSBJU19FVUNfSklTWDAyMDFLQU5BKGgsIGwpCSgoKGgpID09IFNTMikgJiYgKDB4QTEgPD0gKGwpICYmIChsKSA8PSAweERGKSkKKyNkZWZpbmUgSVNfRVVDX1VEQ19MT1coaCwgbCkJKCgoMHhGNSA8PSAoaCkpICYmICgoaCkgPD0gMHhGRSkpCVwKKwkJCQkgJiYgSVNfRVVDX0JZVEUobCkpCisjZGVmaW5lIElTX0VVQ19VRENfSEkoaCwgbCkJSVNfRVVDX1VEQ19MT1coaCwgbCkgLyogRzMgYmxvY2sgKi8KKyNkZWZpbmUgTUFQX0VVQzJTSklTKGV1Y19oaSwgZXVjX2xvLCBldWNfcCwgc2ppc19oaSwgc2ppc19sbywgc2ppc19wKSB7CQlcCisJaWYgKChldWNfaGkpICYgMSkgewkJCQkJCQlcCisJCShzamlzX2hpKSA9IChldWNfaGkpIC8gMiArICgoc2ppc19wKSAtIChldWNfcCkgLyAyKTsJCVwKKwkJKHNqaXNfbG8pID0gKGV1Y19sbykgLSAoKGV1Y19sbykgPj0gMHhFMCA/IDB4NjAgOiAweDYxKTsJXAorCX0gZWxzZSB7CQkJCQkJCQlcCisJCShzamlzX2hpKSA9IChldWNfaGkpIC8gMiArICgoKHNqaXNfcCkgLSAoZXVjX3ApIC8gMikgLSAxKTsJXAorCQkoc2ppc19sbykgPSAoZXVjX2xvKSAtIDI7CQkJCQlcCisJfQkJCQkJCQkJCVwKK30gd2hpbGUoMCkKKworLyogU0pJUyBJQk0gZXh0ZW5kZWQgY2hhcmFjdGVycyB0byBFVUMgbWFwICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBzamlzaWJtMmV1Y19tYXBbXVsyXSA9IHsKKwl7MHhGMywgMHhGM30sIHsweEYzLCAweEY0fSwgezB4RjMsIDB4RjV9LCB7MHhGMywgMHhGNn0sIHsweEYzLCAweEY3fSwKKwl7MHhGMywgMHhGOH0sIHsweEYzLCAweEY5fSwgezB4RjMsIDB4RkF9LCB7MHhGMywgMHhGQn0sIHsweEYzLCAweEZDfSwKKwl7MHhGMywgMHhGRH0sIHsweEYzLCAweEZFfSwgezB4RjQsIDB4QTF9LCB7MHhGNCwgMHhBMn0sIHsweEY0LCAweEEzfSwKKwl7MHhGNCwgMHhBNH0sIHsweEY0LCAweEE1fSwgezB4RjQsIDB4QTZ9LCB7MHhGNCwgMHhBN30sIHsweEY0LCAweEE4fSwKKwl7MHhBMiwgMHhDQ30sIHsweEEyLCAweEMzfSwgezB4RjQsIDB4QTl9LCB7MHhGNCwgMHhBQX0sIHsweEY0LCAweEFCfSwKKwl7MHhGNCwgMHhBQ30sIHsweEY0LCAweEFEfSwgezB4QTIsIDB4RTh9LCB7MHhENCwgMHhFM30sIHsweERDLCAweERGfSwKKwl7MHhFNCwgMHhFOX0sIHsweEUzLCAweEY4fSwgezB4RDksIDB4QTF9LCB7MHhCMSwgMHhCQn0sIHsweEY0LCAweEFFfSwKKwl7MHhDMiwgMHhBRH0sIHsweEMzLCAweEZDfSwgezB4RTQsIDB4RDB9LCB7MHhDMiwgMHhCRn0sIHsweEJDLCAweEY0fSwKKwl7MHhCMCwgMHhBOX0sIHsweEIwLCAweEM4fSwgezB4RjQsIDB4QUZ9LCB7MHhCMCwgMHhEMn0sIHsweEIwLCAweEQ0fSwKKwl7MHhCMCwgMHhFM30sIHsweEIwLCAweEVFfSwgezB4QjEsIDB4QTd9LCB7MHhCMSwgMHhBM30sIHsweEIxLCAweEFDfSwKKwl7MHhCMSwgMHhBOX0sIHsweEIxLCAweEJFfSwgezB4QjEsIDB4REZ9LCB7MHhCMSwgMHhEOH0sIHsweEIxLCAweEM4fSwKKwl7MHhCMSwgMHhEN30sIHsweEIxLCAweEUzfSwgezB4QjEsIDB4RjR9LCB7MHhCMSwgMHhFMX0sIHsweEIyLCAweEEzfSwKKwl7MHhGNCwgMHhCMH0sIHsweEIyLCAweEJCfSwgezB4QjIsIDB4RTZ9LCB7MHgwMCwgMHgwMH0sIHsweEIyLCAweEVEfSwKKwl7MHhCMiwgMHhGNX0sIHsweEIyLCAweEZDfSwgezB4RjQsIDB4QjF9LCB7MHhCMywgMHhCNX0sIHsweEIzLCAweEQ4fSwKKwl7MHhCMywgMHhEQn0sIHsweEIzLCAweEU1fSwgezB4QjMsIDB4RUV9LCB7MHhCMywgMHhGQn0sIHsweEY0LCAweEIyfSwKKwl7MHhGNCwgMHhCM30sIHsweEI0LCAweEMwfSwgezB4QjQsIDB4Qzd9LCB7MHhCNCwgMHhEMH0sIHsweEI0LCAweERFfSwKKwl7MHhGNCwgMHhCNH0sIHsweEI1LCAweEFBfSwgezB4RjQsIDB4QjV9LCB7MHhCNSwgMHhBRn0sIHsweEI1LCAweEM0fSwKKwl7MHhCNSwgMHhFOH0sIHsweEY0LCAweEI2fSwgezB4QjcsIDB4QzJ9LCB7MHhCNywgMHhFNH0sIHsweEI3LCAweEU4fSwKKwl7MHhCNywgMHhFN30sIHsweEY0LCAweEI3fSwgezB4RjQsIDB4Qjh9LCB7MHhGNCwgMHhCOX0sIHsweEI4LCAweENFfSwKKwl7MHhCOCwgMHhFMX0sIHsweEI4LCAweEY1fSwgezB4QjgsIDB4Rjd9LCB7MHhCOCwgMHhGOH0sIHsweEI4LCAweEZDfSwKKwl7MHhCOSwgMHhBRn0sIHsweEI5LCAweEI3fSwgezB4QkEsIDB4QkV9LCB7MHhCQSwgMHhEQn0sIHsweENELCAweEFBfSwKKwl7MHhCQSwgMHhFMX0sIHsweEY0LCAweEJBfSwgezB4QkEsIDB4RUJ9LCB7MHhCQiwgMHhCM30sIHsweEJCLCAweEI4fSwKKwl7MHhGNCwgMHhCQn0sIHsweEJCLCAweENBfSwgezB4RjQsIDB4QkN9LCB7MHhGNCwgMHhCRH0sIHsweEJCLCAweEQwfSwKKwl7MHhCQiwgMHhERX0sIHsweEJCLCAweEY0fSwgezB4QkIsIDB4RjV9LCB7MHhCQiwgMHhGOX0sIHsweEJDLCAweEU0fSwKKwl7MHhCQywgMHhFRH0sIHsweEJDLCAweEZFfSwgezB4RjQsIDB4QkV9LCB7MHhCRCwgMHhDMn0sIHsweEJELCAweEU3fSwKKwl7MHhGNCwgMHhCRn0sIHsweEJELCAweEYwfSwgezB4QkUsIDB4QjB9LCB7MHhCRSwgMHhBQ30sIHsweEY0LCAweEMwfSwKKwl7MHhCRSwgMHhCM30sIHsweEJFLCAweEJEfSwgezB4QkUsIDB4Q0R9LCB7MHhCRSwgMHhDOX0sIHsweEJFLCAweEU0fSwKKwl7MHhCRiwgMHhBOH0sIHsweEJGLCAweEM5fSwgezB4QzAsIDB4QzR9LCB7MHhDMCwgMHhFNH0sIHsweEMwLCAweEY0fSwKKwl7MHhDMSwgMHhBNn0sIHsweEY0LCAweEMxfSwgezB4QzEsIDB4RjV9LCB7MHhDMSwgMHhGQ30sIHsweEY0LCAweEMyfSwKKwl7MHhDMSwgMHhGOH0sIHsweEMyLCAweEFCfSwgezB4QzIsIDB4QTF9LCB7MHhDMiwgMHhBNX0sIHsweEY0LCAweEMzfSwKKwl7MHhDMiwgMHhCOH0sIHsweEMyLCAweEJBfSwgezB4RjQsIDB4QzR9LCB7MHhDMiwgMHhDNH0sIHsweEMyLCAweEQyfSwKKwl7MHhDMiwgMHhEN30sIHsweEMyLCAweERCfSwgezB4QzIsIDB4REV9LCB7MHhDMiwgMHhFRH0sIHsweEMyLCAweEYwfSwKKwl7MHhGNCwgMHhDNX0sIHsweEMzLCAweEExfSwgezB4QzMsIDB4QjV9LCB7MHhDMywgMHhDOX0sIHsweEMzLCAweEI5fSwKKwl7MHhGNCwgMHhDNn0sIHsweEMzLCAweEQ4fSwgezB4QzMsIDB4RkV9LCB7MHhGNCwgMHhDN30sIHsweEM0LCAweENDfSwKKwl7MHhGNCwgMHhDOH0sIHsweEM0LCAweEQ5fSwgezB4QzQsIDB4RUF9LCB7MHhDNCwgMHhGRH0sIHsweEY0LCAweEM5fSwKKwl7MHhDNSwgMHhBN30sIHsweEM1LCAweEI1fSwgezB4QzUsIDB4QjZ9LCB7MHhGNCwgMHhDQX0sIHsweEM1LCAweEQ1fSwKKwl7MHhDNiwgMHhCOH0sIHsweEM2LCAweEQ3fSwgezB4QzYsIDB4RTB9LCB7MHhDNiwgMHhFQX0sIHsweEM2LCAweEUzfSwKKwl7MHhDNywgMHhBMX0sIHsweEM3LCAweEFCfSwgezB4QzcsIDB4Qzd9LCB7MHhDNywgMHhDM30sIHsweEM3LCAweENCfSwKKwl7MHhDNywgMHhDRn0sIHsweEM3LCAweEQ5fSwgezB4RjQsIDB4Q0J9LCB7MHhGNCwgMHhDQ30sIHsweEM3LCAweEU2fSwKKwl7MHhDNywgMHhFRX0sIHsweEM3LCAweEZDfSwgezB4QzcsIDB4RUJ9LCB7MHhDNywgMHhGMH0sIHsweEM4LCAweEIxfSwKKwl7MHhDOCwgMHhFNX0sIHsweEM4LCAweEY4fSwgezB4QzksIDB4QTZ9LCB7MHhDOSwgMHhBQn0sIHsweEM5LCAweEFEfSwKKwl7MHhGNCwgMHhDRH0sIHsweEM5LCAweENBfSwgezB4QzksIDB4RDN9LCB7MHhDOSwgMHhFOX0sIHsweEM5LCAweEUzfSwKKwl7MHhDOSwgMHhGQ30sIHsweEM5LCAweEY0fSwgezB4QzksIDB4RjV9LCB7MHhGNCwgMHhDRX0sIHsweENBLCAweEIzfSwKKwl7MHhDQSwgMHhCRH0sIHsweENBLCAweEVGfSwgezB4Q0EsIDB4RjF9LCB7MHhDQiwgMHhBRX0sIHsweEY0LCAweENGfSwKKwl7MHhDQiwgMHhDQX0sIHsweENCLCAweEU2fSwgezB4Q0IsIDB4RUF9LCB7MHhDQiwgMHhGMH0sIHsweENCLCAweEY0fSwKKwl7MHhDQiwgMHhFRX0sIHsweENDLCAweEE1fSwgezB4Q0IsIDB4Rjl9LCB7MHhDQywgMHhBQn0sIHsweENDLCAweEFFfSwKKwl7MHhDQywgMHhBRH0sIHsweENDLCAweEIyfSwgezB4Q0MsIDB4QzJ9LCB7MHhDQywgMHhEMH0sIHsweENDLCAweEQ5fSwKKwl7MHhGNCwgMHhEMH0sIHsweENELCAweEJCfSwgezB4RjQsIDB4RDF9LCB7MHhDRSwgMHhCQn0sIHsweEY0LCAweEQyfSwKKwl7MHhDRSwgMHhCQX0sIHsweENFLCAweEMzfSwgezB4RjQsIDB4RDN9LCB7MHhDRSwgMHhGMn0sIHsweEIzLCAweEREfSwKKwl7MHhDRiwgMHhENX0sIHsweENGLCAweEUyfSwgezB4Q0YsIDB4RTl9LCB7MHhDRiwgMHhFRH0sIHsweEY0LCAweEQ0fSwKKwl7MHhGNCwgMHhENX0sIHsweEY0LCAweEQ2fSwgezB4MDAsIDB4MDB9LCB7MHhGNCwgMHhEN30sIHsweEQwLCAweEU1fSwKKwl7MHhGNCwgMHhEOH0sIHsweEQwLCAweEU5fSwgezB4RDEsIDB4RTh9LCB7MHhGNCwgMHhEOX0sIHsweEY0LCAweERBfSwKKwl7MHhEMSwgMHhFQ30sIHsweEQyLCAweEJCfSwgezB4RjQsIDB4REJ9LCB7MHhEMywgMHhFMX0sIHsweEQzLCAweEU4fSwKKwl7MHhENCwgMHhBN30sIHsweEY0LCAweERDfSwgezB4RjQsIDB4RER9LCB7MHhENCwgMHhENH0sIHsweEQ0LCAweEYyfSwKKwl7MHhENSwgMHhBRX0sIHsweEY0LCAweERFfSwgezB4RDcsIDB4REV9LCB7MHhGNCwgMHhERn0sIHsweEQ4LCAweEEyfSwKKwl7MHhEOCwgMHhCN30sIHsweEQ4LCAweEMxfSwgezB4RDgsIDB4RDF9LCB7MHhEOCwgMHhGNH0sIHsweEQ5LCAweEM2fSwKKwl7MHhEOSwgMHhDOH0sIHsweEQ5LCAweEQxfSwgezB4RjQsIDB4RTB9LCB7MHhGNCwgMHhFMX0sIHsweEY0LCAweEUyfSwKKwl7MHhGNCwgMHhFM30sIHsweEY0LCAweEU0fSwgezB4REMsIDB4RDN9LCB7MHhERCwgMHhDOH0sIHsweERELCAweEQ0fSwKKwl7MHhERCwgMHhFQX0sIHsweERELCAweEZBfSwgezB4REUsIDB4QTR9LCB7MHhERSwgMHhCMH0sIHsweEY0LCAweEU1fSwKKwl7MHhERSwgMHhCNX0sIHsweERFLCAweENCfSwgezB4RjQsIDB4RTZ9LCB7MHhERiwgMHhCOX0sIHsweEY0LCAweEU3fSwKKwl7MHhERiwgMHhDM30sIHsweEY0LCAweEU4fSwgezB4RjQsIDB4RTl9LCB7MHhFMCwgMHhEOX0sIHsweEY0LCAweEVBfSwKKwl7MHhGNCwgMHhFQn0sIHsweEUxLCAweEUyfSwgezB4RjQsIDB4RUN9LCB7MHhGNCwgMHhFRH0sIHsweEY0LCAweEVFfSwKKwl7MHhFMiwgMHhDN30sIHsweEUzLCAweEE4fSwgezB4RTMsIDB4QTZ9LCB7MHhFMywgMHhBOX0sIHsweEUzLCAweEFGfSwKKwl7MHhFMywgMHhCMH0sIHsweEUzLCAweEFBfSwgezB4RTMsIDB4QUJ9LCB7MHhFMywgMHhCQ30sIHsweEUzLCAweEMxfSwKKwl7MHhFMywgMHhCRn0sIHsweEUzLCAweEQ1fSwgezB4RTMsIDB4RDh9LCB7MHhFMywgMHhENn0sIHsweEUzLCAweERGfSwKKwl7MHhFMywgMHhFM30sIHsweEUzLCAweEUxfSwgezB4RTMsIDB4RDR9LCB7MHhFMywgMHhFOX0sIHsweEU0LCAweEE2fSwKKwl7MHhFMywgMHhGMX0sIHsweEUzLCAweEYyfSwgezB4RTQsIDB4Q0J9LCB7MHhFNCwgMHhDMX0sIHsweEU0LCAweEMzfSwKKwl7MHhFNCwgMHhCRX0sIHsweEY0LCAweEVGfSwgezB4RTQsIDB4QzB9LCB7MHhFNCwgMHhDN30sIHsweEU0LCAweEJGfSwKKwl7MHhFNCwgMHhFMH0sIHsweEU0LCAweERFfSwgezB4RTQsIDB4RDF9LCB7MHhGNCwgMHhGMH0sIHsweEU0LCAweERDfSwKKwl7MHhFNCwgMHhEMn0sIHsweEU0LCAweERCfSwgezB4RTQsIDB4RDR9LCB7MHhFNCwgMHhGQX0sIHsweEU0LCAweEVGfSwKKwl7MHhFNSwgMHhCM30sIHsweEU1LCAweEJGfSwgezB4RTUsIDB4Qzl9LCB7MHhFNSwgMHhEMH0sIHsweEU1LCAweEUyfSwKKwl7MHhFNSwgMHhFQX0sIHsweEU1LCAweEVCfSwgezB4RjQsIDB4RjF9LCB7MHhGNCwgMHhGMn0sIHsweEY0LCAweEYzfSwKKwl7MHhFNiwgMHhFOH0sIHsweEU2LCAweEVGfSwgezB4RTcsIDB4QUN9LCB7MHhGNCwgMHhGNH0sIHsweEU3LCAweEFFfSwKKwl7MHhGNCwgMHhGNX0sIHsweEU3LCAweEIxfSwgezB4RjQsIDB4RjZ9LCB7MHhFNywgMHhCMn0sIHsweEU4LCAweEIxfSwKKwl7MHhFOCwgMHhCNn0sIHsweEY0LCAweEY3fSwgezB4RjQsIDB4Rjh9LCB7MHhFOCwgMHhERH0sIHsweEY0LCAweEY5fSwKKwl7MHhGNCwgMHhGQX0sIHsweEU5LCAweEQxfSwgezB4RjQsIDB4RkJ9LCB7MHhFOSwgMHhFRH0sIHsweEVBLCAweENEfSwKKwl7MHhGNCwgMHhGQ30sIHsweEVBLCAweERCfSwgezB4RUEsIDB4RTZ9LCB7MHhFQSwgMHhFQX0sIHsweEVCLCAweEE1fSwKKwl7MHhFQiwgMHhGQn0sIHsweEVCLCAweEZBfSwgezB4RjQsIDB4RkR9LCB7MHhFQywgMHhENn0sIHsweEY0LCAweEZFfSwKK307CisKKyNkZWZpbmUgSVNfRVVDX0lCTTJKSVNYMDIwOChoLCBsKSBcCisJCSgoKGgpID09IDB4QTIgJiYgKGwpID09IDB4Q0MpIHx8ICgoaCkgPT0gMHhBMiAmJiAobCkgPT0gMHhFOCkpCisKKy8qIEVVQyB0byBTSklTIElCTSBleHRlbmRlZCBjaGFyYWN0ZXJzIG1hcCAoRzMgSklTIFggMDIxMiBibG9jaykgKi8KK3N0YXRpYyBzdHJ1Y3QgeworCXVuc2lnbmVkIHNob3J0IGV1YzsKKwl1bnNpZ25lZCBjaGFyIHNqaXNbMl07Cit9IGV1YzJzamlzaWJtX2ppc3gwMjEyX21hcFtdID0geworCXsweEEyQzMsIHsweEZBLCAweDU1fX0sIHsweEIwQTksIHsweEZBLCAweDY4fX0sIHsweEIwQzgsIHsweEZBLCAweDY5fX0sCisJezB4QjBEMiwgezB4RkEsIDB4NkJ9fSwgezB4QjBENCwgezB4RkEsIDB4NkN9fSwgezB4QjBFMywgezB4RkEsIDB4NkR9fSwKKwl7MHhCMEVFLCB7MHhGQSwgMHg2RX19LCB7MHhCMUEzLCB7MHhGQSwgMHg3MH19LCB7MHhCMUE3LCB7MHhGQSwgMHg2Rn19LAorCXsweEIxQTksIHsweEZBLCAweDcyfX0sIHsweEIxQUMsIHsweEZBLCAweDcxfX0sIHsweEIxQkIsIHsweEZBLCAweDYxfX0sCisJezB4QjFCRSwgezB4RkEsIDB4NzN9fSwgezB4QjFDOCwgezB4RkEsIDB4NzZ9fSwgezB4QjFENywgezB4RkEsIDB4Nzd9fSwKKwl7MHhCMUQ4LCB7MHhGQSwgMHg3NX19LCB7MHhCMURGLCB7MHhGQSwgMHg3NH19LCB7MHhCMUUxLCB7MHhGQSwgMHg3QX19LAorCXsweEIxRTMsIHsweEZBLCAweDc4fX0sIHsweEIxRjQsIHsweEZBLCAweDc5fX0sIHsweEIyQTMsIHsweEZBLCAweDdCfX0sCisJezB4QjJCQiwgezB4RkEsIDB4N0R9fSwgezB4QjJFNiwgezB4RkEsIDB4N0V9fSwgezB4QjJFRCwgezB4RkEsIDB4ODB9fSwKKwl7MHhCMkY1LCB7MHhGQSwgMHg4MX19LCB7MHhCMkZDLCB7MHhGQSwgMHg4Mn19LCB7MHhCM0I1LCB7MHhGQSwgMHg4NH19LAorCXsweEIzRDgsIHsweEZBLCAweDg1fX0sIHsweEIzREIsIHsweEZBLCAweDg2fX0sIHsweEIzREQsIHsweEZCLCAweDc3fX0sCisJezB4QjNFNSwgezB4RkEsIDB4ODd9fSwgezB4QjNFRSwgezB4RkEsIDB4ODh9fSwgezB4QjNGQiwgezB4RkEsIDB4ODl9fSwKKwl7MHhCNEMwLCB7MHhGQSwgMHg4Q319LCB7MHhCNEM3LCB7MHhGQSwgMHg4RH19LCB7MHhCNEQwLCB7MHhGQSwgMHg4RX19LAorCXsweEI0REUsIHsweEZBLCAweDhGfX0sIHsweEI1QUEsIHsweEZBLCAweDkxfX0sIHsweEI1QUYsIHsweEZBLCAweDkzfX0sCisJezB4QjVDNCwgezB4RkEsIDB4OTR9fSwgezB4QjVFOCwgezB4RkEsIDB4OTV9fSwgezB4QjdDMiwgezB4RkEsIDB4OTd9fSwKKwl7MHhCN0U0LCB7MHhGQSwgMHg5OH19LCB7MHhCN0U3LCB7MHhGQSwgMHg5QX19LCB7MHhCN0U4LCB7MHhGQSwgMHg5OX19LAorCXsweEI4Q0UsIHsweEZBLCAweDlFfX0sIHsweEI4RTEsIHsweEZBLCAweDlGfX0sIHsweEI4RjUsIHsweEZBLCAweEEwfX0sCisJezB4QjhGNywgezB4RkEsIDB4QTF9fSwgezB4QjhGOCwgezB4RkEsIDB4QTJ9fSwgezB4QjhGQywgezB4RkEsIDB4QTN9fSwKKwl7MHhCOUFGLCB7MHhGQSwgMHhBNH19LCB7MHhCOUI3LCB7MHhGQSwgMHhBNX19LCB7MHhCQUJFLCB7MHhGQSwgMHhBNn19LAorCXsweEJBREIsIHsweEZBLCAweEE3fX0sIHsweEJBRTEsIHsweEZBLCAweEE5fX0sIHsweEJBRUIsIHsweEZBLCAweEFCfX0sCisJezB4QkJCMywgezB4RkEsIDB4QUN9fSwgezB4QkJCOCwgezB4RkEsIDB4QUR9fSwgezB4QkJDQSwgezB4RkEsIDB4QUZ9fSwKKwl7MHhCQkQwLCB7MHhGQSwgMHhCMn19LCB7MHhCQkRFLCB7MHhGQSwgMHhCM319LCB7MHhCQkY0LCB7MHhGQSwgMHhCNH19LAorCXsweEJCRjUsIHsweEZBLCAweEI1fX0sIHsweEJCRjksIHsweEZBLCAweEI2fX0sIHsweEJDRTQsIHsweEZBLCAweEI3fX0sCisJezB4QkNFRCwgezB4RkEsIDB4Qjh9fSwgezB4QkNGNCwgezB4RkEsIDB4Njd9fSwgezB4QkNGRSwgezB4RkEsIDB4Qjl9fSwKKwl7MHhCREMyLCB7MHhGQSwgMHhCQn19LCB7MHhCREU3LCB7MHhGQSwgMHhCQ319LCB7MHhCREYwLCB7MHhGQSwgMHhCRX19LAorCXsweEJFQUMsIHsweEZBLCAweEMwfX0sIHsweEJFQjAsIHsweEZBLCAweEJGfX0sIHsweEJFQjMsIHsweEZBLCAweEMyfX0sCisJezB4QkVCRCwgezB4RkEsIDB4QzN9fSwgezB4QkVDOSwgezB4RkEsIDB4QzV9fSwgezB4QkVDRCwgezB4RkEsIDB4QzR9fSwKKwl7MHhCRUU0LCB7MHhGQSwgMHhDNn19LCB7MHhCRkE4LCB7MHhGQSwgMHhDN319LCB7MHhCRkM5LCB7MHhGQSwgMHhDOH19LAorCXsweEMwQzQsIHsweEZBLCAweEM5fX0sIHsweEMwRTQsIHsweEZBLCAweENBfX0sIHsweEMwRjQsIHsweEZBLCAweENCfX0sCisJezB4QzFBNiwgezB4RkEsIDB4Q0N9fSwgezB4QzFGNSwgezB4RkEsIDB4Q0V9fSwgezB4QzFGOCwgezB4RkEsIDB4RDF9fSwKKwl7MHhDMUZDLCB7MHhGQSwgMHhDRn19LCB7MHhDMkExLCB7MHhGQSwgMHhEM319LCB7MHhDMkE1LCB7MHhGQSwgMHhENH19LAorCXsweEMyQUIsIHsweEZBLCAweEQyfX0sIHsweEMyQUQsIHsweEZBLCAweDYzfX0sIHsweEMyQjgsIHsweEZBLCAweEQ2fX0sCisJezB4QzJCQSwgezB4RkEsIDB4RDd9fSwgezB4QzJCRiwgezB4RkEsIDB4NjZ9fSwgezB4QzJDNCwgezB4RkEsIDB4RDl9fSwKKwl7MHhDMkQyLCB7MHhGQSwgMHhEQX19LCB7MHhDMkQ3LCB7MHhGQSwgMHhEQn19LCB7MHhDMkRCLCB7MHhGQSwgMHhEQ319LAorCXsweEMyREUsIHsweEZBLCAweEREfX0sIHsweEMyRUQsIHsweEZBLCAweERFfX0sIHsweEMyRjAsIHsweEZBLCAweERGfX0sCisJezB4QzNBMSwgezB4RkEsIDB4RTF9fSwgezB4QzNCNSwgezB4RkEsIDB4RTJ9fSwgezB4QzNCOSwgezB4RkEsIDB4RTR9fSwKKwl7MHhDM0M5LCB7MHhGQSwgMHhFM319LCB7MHhDM0Q4LCB7MHhGQSwgMHhFNn19LCB7MHhDM0ZDLCB7MHhGQSwgMHg2NH19LAorCXsweEMzRkUsIHsweEZBLCAweEU3fX0sIHsweEM0Q0MsIHsweEZBLCAweEU5fX0sIHsweEM0RDksIHsweEZBLCAweEVCfX0sCisJezB4QzRFQSwgezB4RkEsIDB4RUN9fSwgezB4QzRGRCwgezB4RkEsIDB4RUR9fSwgezB4QzVBNywgezB4RkEsIDB4RUZ9fSwKKwl7MHhDNUI1LCB7MHhGQSwgMHhGMH19LCB7MHhDNUI2LCB7MHhGQSwgMHhGMX19LCB7MHhDNUQ1LCB7MHhGQSwgMHhGM319LAorCXsweEM2QjgsIHsweEZBLCAweEY0fX0sIHsweEM2RDcsIHsweEZBLCAweEY1fX0sIHsweEM2RTAsIHsweEZBLCAweEY2fX0sCisJezB4QzZFMywgezB4RkEsIDB4Rjh9fSwgezB4QzZFQSwgezB4RkEsIDB4Rjd9fSwgezB4QzdBMSwgezB4RkEsIDB4Rjl9fSwKKwl7MHhDN0FCLCB7MHhGQSwgMHhGQX19LCB7MHhDN0MzLCB7MHhGQSwgMHhGQ319LCB7MHhDN0M3LCB7MHhGQSwgMHhGQn19LAorCXsweEM3Q0IsIHsweEZCLCAweDQwfX0sIHsweEM3Q0YsIHsweEZCLCAweDQxfX0sIHsweEM3RDksIHsweEZCLCAweDQyfX0sCisJezB4QzdFNiwgezB4RkIsIDB4NDV9fSwgezB4QzdFQiwgezB4RkIsIDB4NDh9fSwgezB4QzdFRSwgezB4RkIsIDB4NDZ9fSwKKwl7MHhDN0YwLCB7MHhGQiwgMHg0OX19LCB7MHhDN0ZDLCB7MHhGQiwgMHg0N319LCB7MHhDOEIxLCB7MHhGQiwgMHg0QX19LAorCXsweEM4RTUsIHsweEZCLCAweDRCfX0sIHsweEM4RjgsIHsweEZCLCAweDRDfX0sIHsweEM5QTYsIHsweEZCLCAweDREfX0sCisJezB4QzlBQiwgezB4RkIsIDB4NEV9fSwgezB4QzlBRCwgezB4RkIsIDB4NEZ9fSwgezB4QzlDQSwgezB4RkIsIDB4NTF9fSwKKwl7MHhDOUQzLCB7MHhGQiwgMHg1Mn19LCB7MHhDOUUzLCB7MHhGQiwgMHg1NH19LCB7MHhDOUU5LCB7MHhGQiwgMHg1M319LAorCXsweEM5RjQsIHsweEZCLCAweDU2fX0sIHsweEM5RjUsIHsweEZCLCAweDU3fX0sIHsweEM5RkMsIHsweEZCLCAweDU1fX0sCisJezB4Q0FCMywgezB4RkIsIDB4NTl9fSwgezB4Q0FCRCwgezB4RkIsIDB4NUF9fSwgezB4Q0FFRiwgezB4RkIsIDB4NUJ9fSwKKwl7MHhDQUYxLCB7MHhGQiwgMHg1Q319LCB7MHhDQkFFLCB7MHhGQiwgMHg1RH19LCB7MHhDQkNBLCB7MHhGQiwgMHg1Rn19LAorCXsweENCRTYsIHsweEZCLCAweDYwfX0sIHsweENCRUEsIHsweEZCLCAweDYxfX0sIHsweENCRUUsIHsweEZCLCAweDY0fX0sCisJezB4Q0JGMCwgezB4RkIsIDB4NjJ9fSwgezB4Q0JGNCwgezB4RkIsIDB4NjN9fSwgezB4Q0JGOSwgezB4RkIsIDB4NjZ9fSwKKwl7MHhDQ0E1LCB7MHhGQiwgMHg2NX19LCB7MHhDQ0FCLCB7MHhGQiwgMHg2N319LCB7MHhDQ0FELCB7MHhGQiwgMHg2OX19LAorCXsweENDQUUsIHsweEZCLCAweDY4fX0sIHsweENDQjIsIHsweEZCLCAweDZBfX0sIHsweENDQzIsIHsweEZCLCAweDZCfX0sCisJezB4Q0NEMCwgezB4RkIsIDB4NkN9fSwgezB4Q0NEOSwgezB4RkIsIDB4NkR9fSwgezB4Q0RBQSwgezB4RkEsIDB4QTh9fSwKKwl7MHhDREJCLCB7MHhGQiwgMHg2Rn19LCB7MHhDRUJBLCB7MHhGQiwgMHg3M319LCB7MHhDRUJCLCB7MHhGQiwgMHg3MX19LAorCXsweENFQzMsIHsweEZCLCAweDc0fX0sIHsweENFRjIsIHsweEZCLCAweDc2fX0sIHsweENGRDUsIHsweEZCLCAweDc4fX0sCisJezB4Q0ZFMiwgezB4RkIsIDB4Nzl9fSwgezB4Q0ZFOSwgezB4RkIsIDB4N0F9fSwgezB4Q0ZFRCwgezB4RkIsIDB4N0J9fSwKKwl7MHhEMEU1LCB7MHhGQiwgMHg4MX19LCB7MHhEMEU5LCB7MHhGQiwgMHg4M319LCB7MHhEMUU4LCB7MHhGQiwgMHg4NH19LAorCXsweEQxRUMsIHsweEZCLCAweDg3fX0sIHsweEQyQkIsIHsweEZCLCAweDg4fX0sIHsweEQzRTEsIHsweEZCLCAweDhBfX0sCisJezB4RDNFOCwgezB4RkIsIDB4OEJ9fSwgezB4RDRBNywgezB4RkIsIDB4OEN9fSwgezB4RDRENCwgezB4RkIsIDB4OEZ9fSwKKwl7MHhENEUzLCB7MHhGQSwgMHg1Q319LCB7MHhENEYyLCB7MHhGQiwgMHg5MH19LCB7MHhENUFFLCB7MHhGQiwgMHg5MX19LAorCXsweEQ3REUsIHsweEZCLCAweDkzfX0sIHsweEQ4QTIsIHsweEZCLCAweDk1fX0sIHsweEQ4QjcsIHsweEZCLCAweDk2fX0sCisJezB4RDhDMSwgezB4RkIsIDB4OTd9fSwgezB4RDhEMSwgezB4RkIsIDB4OTh9fSwgezB4RDhGNCwgezB4RkIsIDB4OTl9fSwKKwl7MHhEOUExLCB7MHhGQSwgMHg2MH19LCB7MHhEOUM2LCB7MHhGQiwgMHg5QX19LCB7MHhEOUM4LCB7MHhGQiwgMHg5Qn19LAorCXsweEQ5RDEsIHsweEZCLCAweDlDfX0sIHsweERDRDMsIHsweEZCLCAweEEyfX0sIHsweERDREYsIHsweEZBLCAweDVEfX0sCisJezB4RERDOCwgezB4RkIsIDB4QTN9fSwgezB4RERENCwgezB4RkIsIDB4QTR9fSwgezB4RERFQSwgezB4RkIsIDB4QTV9fSwKKwl7MHhEREZBLCB7MHhGQiwgMHhBNn19LCB7MHhERUE0LCB7MHhGQiwgMHhBN319LCB7MHhERUIwLCB7MHhGQiwgMHhBOH19LAorCXsweERFQjUsIHsweEZCLCAweEFBfX0sIHsweERFQ0IsIHsweEZCLCAweEFCfX0sIHsweERGQjksIHsweEZCLCAweEFEfX0sCisJezB4REZDMywgezB4RkIsIDB4QUZ9fSwgezB4RTBEOSwgezB4RkIsIDB4QjJ9fSwgezB4RTFFMiwgezB4RkIsIDB4QjV9fSwKKwl7MHhFMkM3LCB7MHhGQiwgMHhCOX19LCB7MHhFM0E2LCB7MHhGQiwgMHhCQn19LCB7MHhFM0E4LCB7MHhGQiwgMHhCQX19LAorCXsweEUzQTksIHsweEZCLCAweEJDfX0sIHsweEUzQUEsIHsweEZCLCAweEJGfX0sIHsweEUzQUIsIHsweEZCLCAweEMwfX0sCisJezB4RTNBRiwgezB4RkIsIDB4QkR9fSwgezB4RTNCMCwgezB4RkIsIDB4QkV9fSwgezB4RTNCQywgezB4RkIsIDB4QzF9fSwKKwl7MHhFM0JGLCB7MHhGQiwgMHhDM319LCB7MHhFM0MxLCB7MHhGQiwgMHhDMn19LCB7MHhFM0Q0LCB7MHhGQiwgMHhDQX19LAorCXsweEUzRDUsIHsweEZCLCAweEM0fX0sIHsweEUzRDYsIHsweEZCLCAweEM2fX0sIHsweEUzRDgsIHsweEZCLCAweEM1fX0sCisJezB4RTNERiwgezB4RkIsIDB4Qzd9fSwgezB4RTNFMSwgezB4RkIsIDB4Qzl9fSwgezB4RTNFMywgezB4RkIsIDB4Qzh9fSwKKwl7MHhFM0U5LCB7MHhGQiwgMHhDQn19LCB7MHhFM0YxLCB7MHhGQiwgMHhDRH19LCB7MHhFM0YyLCB7MHhGQiwgMHhDRX19LAorCXsweEUzRjgsIHsweEZBLCAweDVGfX0sIHsweEU0QTYsIHsweEZCLCAweENDfX0sIHsweEU0QkUsIHsweEZCLCAweEQyfX0sCisJezB4RTRCRiwgezB4RkIsIDB4RDZ9fSwgezB4RTRDMCwgezB4RkIsIDB4RDR9fSwgezB4RTRDMSwgezB4RkIsIDB4RDB9fSwKKwl7MHhFNEMzLCB7MHhGQiwgMHhEMX19LCB7MHhFNEM3LCB7MHhGQiwgMHhENX19LCB7MHhFNENCLCB7MHhGQiwgMHhDRn19LAorCXsweEU0RDAsIHsweEZBLCAweDY1fX0sIHsweEU0RDEsIHsweEZCLCAweEQ5fX0sIHsweEU0RDIsIHsweEZCLCAweERDfX0sCisJezB4RTRENCwgezB4RkIsIDB4REV9fSwgezB4RTREQiwgezB4RkIsIDB4RER9fSwgezB4RTREQywgezB4RkIsIDB4REJ9fSwKKwl7MHhFNERFLCB7MHhGQiwgMHhEOH19LCB7MHhFNEUwLCB7MHhGQiwgMHhEN319LCB7MHhFNEU5LCB7MHhGQSwgMHg1RX19LAorCXsweEU0RUYsIHsweEZCLCAweEUwfX0sIHsweEU0RkEsIHsweEZCLCAweERGfX0sIHsweEU1QjMsIHsweEZCLCAweEUxfX0sCisJezB4RTVCRiwgezB4RkIsIDB4RTJ9fSwgezB4RTVDOSwgezB4RkIsIDB4RTN9fSwgezB4RTVEMCwgezB4RkIsIDB4RTR9fSwKKwl7MHhFNUUyLCB7MHhGQiwgMHhFNX19LCB7MHhFNUVBLCB7MHhGQiwgMHhFNn19LCB7MHhFNUVCLCB7MHhGQiwgMHhFN319LAorCXsweEU2RTgsIHsweEZCLCAweEVCfX0sIHsweEU2RUYsIHsweEZCLCAweEVDfX0sIHsweEU3QUMsIHsweEZCLCAweEVEfX0sCisJezB4RTdBRSwgezB4RkIsIDB4RUZ9fSwgezB4RTdCMSwgezB4RkIsIDB4RjF9fSwgezB4RTdCMiwgezB4RkIsIDB4RjN9fSwKKwl7MHhFOEIxLCB7MHhGQiwgMHhGNH19LCB7MHhFOEI2LCB7MHhGQiwgMHhGNX19LCB7MHhFOERELCB7MHhGQiwgMHhGOH19LAorCXsweEU5RDEsIHsweEZCLCAweEZCfX0sIHsweEU5RUQsIHsweEZDLCAweDQwfX0sIHsweEVBQ0QsIHsweEZDLCAweDQxfX0sCisJezB4RUFEQiwgezB4RkMsIDB4NDN9fSwgezB4RUFFNiwgezB4RkMsIDB4NDR9fSwgezB4RUFFQSwgezB4RkMsIDB4NDV9fSwKKwl7MHhFQkE1LCB7MHhGQywgMHg0Nn19LCB7MHhFQkZBLCB7MHhGQywgMHg0OH19LCB7MHhFQkZCLCB7MHhGQywgMHg0N319LAorCXsweEVDRDYsIHsweEZDLCAweDRBfX0sCit9OworCisvKiBFVUMgdG8gU0pJUyBJQk0gZXh0ZW5kZWQgY2hhcmFjdGVycyBtYXAgKEczIFVwcGVyIGJsb2NrKSAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgZXVjMnNqaXNpYm1fZzN1cHBlcl9tYXBbXVsyXSA9IHsKKwl7MHhGQSwgMHg0MH0sIHsweEZBLCAweDQxfSwgezB4RkEsIDB4NDJ9LCB7MHhGQSwgMHg0M30sIHsweEZBLCAweDQ0fSwKKwl7MHhGQSwgMHg0NX0sIHsweEZBLCAweDQ2fSwgezB4RkEsIDB4NDd9LCB7MHhGQSwgMHg0OH0sIHsweEZBLCAweDQ5fSwKKwl7MHhGQSwgMHg0QX0sIHsweEZBLCAweDRCfSwgezB4RkEsIDB4NEN9LCB7MHhGQSwgMHg0RH0sIHsweEZBLCAweDRFfSwKKwl7MHhGQSwgMHg0Rn0sIHsweEZBLCAweDUwfSwgezB4RkEsIDB4NTF9LCB7MHhGQSwgMHg1Mn0sIHsweEZBLCAweDUzfSwKKwl7MHhGQSwgMHg1Nn0sIHsweEZBLCAweDU3fSwgezB4RkEsIDB4NTh9LCB7MHhGQSwgMHg1OX0sIHsweEZBLCAweDVBfSwKKwl7MHhGQSwgMHg2Mn0sIHsweEZBLCAweDZBfSwgezB4RkEsIDB4N0N9LCB7MHhGQSwgMHg4M30sIHsweEZBLCAweDhBfSwKKwl7MHhGQSwgMHg4Qn0sIHsweEZBLCAweDkwfSwgezB4RkEsIDB4OTJ9LCB7MHhGQSwgMHg5Nn0sIHsweEZBLCAweDlCfSwKKwl7MHhGQSwgMHg5Q30sIHsweEZBLCAweDlEfSwgezB4RkEsIDB4QUF9LCB7MHhGQSwgMHhBRX0sIHsweEZBLCAweEIwfSwKKwl7MHhGQSwgMHhCMX0sIHsweEZBLCAweEJBfSwgezB4RkEsIDB4QkR9LCB7MHhGQSwgMHhDMX0sIHsweEZBLCAweENEfSwKKwl7MHhGQSwgMHhEMH0sIHsweEZBLCAweEQ1fSwgezB4RkEsIDB4RDh9LCB7MHhGQSwgMHhFMH0sIHsweEZBLCAweEU1fSwKKwl7MHhGQSwgMHhFOH0sIHsweEZBLCAweEVBfSwgezB4RkEsIDB4RUV9LCB7MHhGQSwgMHhGMn0sIHsweEZCLCAweDQzfSwKKwl7MHhGQiwgMHg0NH0sIHsweEZCLCAweDUwfSwgezB4RkIsIDB4NTh9LCB7MHhGQiwgMHg1RX0sIHsweEZCLCAweDZFfSwKKwl7MHhGQiwgMHg3MH0sIHsweEZCLCAweDcyfSwgezB4RkIsIDB4NzV9LCB7MHhGQiwgMHg3Q30sIHsweEZCLCAweDdEfSwKKwl7MHhGQiwgMHg3RX0sIHsweEZCLCAweDgwfSwgezB4RkIsIDB4ODJ9LCB7MHhGQiwgMHg4NX0sIHsweEZCLCAweDg2fSwKKwl7MHhGQiwgMHg4OX0sIHsweEZCLCAweDhEfSwgezB4RkIsIDB4OEV9LCB7MHhGQiwgMHg5Mn0sIHsweEZCLCAweDk0fSwKKwl7MHhGQiwgMHg5RH0sIHsweEZCLCAweDlFfSwgezB4RkIsIDB4OUZ9LCB7MHhGQiwgMHhBMH0sIHsweEZCLCAweEExfSwKKwl7MHhGQiwgMHhBOX0sIHsweEZCLCAweEFDfSwgezB4RkIsIDB4QUV9LCB7MHhGQiwgMHhCMH0sIHsweEZCLCAweEIxfSwKKwl7MHhGQiwgMHhCM30sIHsweEZCLCAweEI0fSwgezB4RkIsIDB4QjZ9LCB7MHhGQiwgMHhCN30sIHsweEZCLCAweEI4fSwKKwl7MHhGQiwgMHhEM30sIHsweEZCLCAweERBfSwgezB4RkIsIDB4RTh9LCB7MHhGQiwgMHhFOX0sIHsweEZCLCAweEVBfSwKKwl7MHhGQiwgMHhFRX0sIHsweEZCLCAweEYwfSwgezB4RkIsIDB4RjJ9LCB7MHhGQiwgMHhGNn0sIHsweEZCLCAweEY3fSwKKwl7MHhGQiwgMHhGOX0sIHsweEZCLCAweEZBfSwgezB4RkIsIDB4RkN9LCB7MHhGQywgMHg0Mn0sIHsweEZDLCAweDQ5fSwKKwl7MHhGQywgMHg0Qn0sCit9OworCisjZGVmaW5lIE1BUF9FTEVNRU5UX09GKG1hcCkJKHNpemVvZihtYXApIC8gc2l6ZW9mKG1hcFswXSkpCisKK3N0YXRpYyBpbmxpbmUgaW50IHNqaXNpYm0yZXVjKHVuc2lnbmVkIGNoYXIgKmV1YywgY29uc3QgdW5zaWduZWQgY2hhciBzamlzX2hpLAorCQkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBzamlzX2xvKTsKK3N0YXRpYyBpbmxpbmUgaW50IGV1YzJzamlzaWJtX2ppc3gwMjEyKHVuc2lnbmVkIGNoYXIgKnNqaXMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgZXVjX2hpLAorCQkJCSAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGV1Y19sbyk7CitzdGF0aWMgaW5saW5lIGludCBldWMyc2ppc2libV9nM3VwcGVyKHVuc2lnbmVkIGNoYXIgKnNqaXMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgZXVjX2hpLAorCQkJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgZXVjX2xvKTsKK3N0YXRpYyBpbmxpbmUgaW50IGV1YzJzamlzaWJtKHVuc2lnbmVkIGNoYXIgKnNqaXMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgZXVjX2hpLAorCQkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciBldWNfbG8pOworc3RhdGljIGlubGluZSBpbnQgc2ppc25lYzJzamlzaWJtKHVuc2lnbmVkIGNoYXIgKnNqaXNpYm0sCisJCQkJICBjb25zdCB1bnNpZ25lZCBjaGFyIHNqaXNuZWNfaGksCisJCQkJICBjb25zdCB1bnNpZ25lZCBjaGFyIHNqaXNuZWNfbG8pOworCisvKiBTSklTIElCTSBleHRlbmRlZCBjaGFyYWN0ZXJzIHRvIEVVQyAqLworc3RhdGljIGlubGluZSBpbnQgc2ppc2libTJldWModW5zaWduZWQgY2hhciAqZXVjLCBjb25zdCB1bnNpZ25lZCBjaGFyIHNqaXNfaGksCisJCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyIHNqaXNfbG8pCit7CisJaW50IGluZGV4OworCisJaW5kZXggPSAoKHNqaXNfaGkgLSAweEZBKSAqICgweEZEIC0gMHg0MCkpICsgKHNqaXNfbG8gLSAweDQwKTsKKwlpZiAoSVNfRVVDX0lCTTJKSVNYMDIwOChzamlzaWJtMmV1Y19tYXBbaW5kZXhdWzBdLAorCQkJCXNqaXNpYm0yZXVjX21hcFtpbmRleF1bMV0pKSB7CisJCWV1Y1swXSA9IHNqaXNpYm0yZXVjX21hcFtpbmRleF1bMF07CisJCWV1Y1sxXSA9IHNqaXNpYm0yZXVjX21hcFtpbmRleF1bMV07CisJCXJldHVybiAyOworCX0gZWxzZSB7CisJCWV1Y1swXSA9IFNTMzsKKwkJZXVjWzFdID0gc2ppc2libTJldWNfbWFwW2luZGV4XVswXTsKKwkJZXVjWzJdID0gc2ppc2libTJldWNfbWFwW2luZGV4XVsxXTsKKwkJcmV0dXJuIDM7CisJfQorfQorCisvKiBFVUMgdG8gU0pJUyBJQk0gZXh0ZW5kZWQgY2hhcmFjdGVycyAoRzMgSklTIFggMDIxMiBibG9jaykgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGV1YzJzamlzaWJtX2ppc3gwMjEyKHVuc2lnbmVkIGNoYXIgKnNqaXMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgZXVjX2hpLAorCQkJCSAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGV1Y19sbykKK3sKKwlpbnQgaW5kZXgsIG1pbl9pbmRleCwgbWF4X2luZGV4OworCXVuc2lnbmVkIHNob3J0IGV1YzsKKworCW1pbl9pbmRleCA9IDA7CisJbWF4X2luZGV4ID0gTUFQX0VMRU1FTlRfT0YoZXVjMnNqaXNpYm1famlzeDAyMTJfbWFwKSAtIDE7CisJZXVjID0gKGV1Y19oaSA8PCA4KSB8IGV1Y19sbzsKKworCXdoaWxlIChtaW5faW5kZXggPD0gbWF4X2luZGV4KSB7CisJCWluZGV4ID0gKG1pbl9pbmRleCArIG1heF9pbmRleCkgLyAyOworCQlpZiAoZXVjIDwgZXVjMnNqaXNpYm1famlzeDAyMTJfbWFwW2luZGV4XS5ldWMpCisJCQltYXhfaW5kZXggPSBpbmRleCAtIDE7CisJCWVsc2UKKwkJCW1pbl9pbmRleCA9IGluZGV4ICsgMTsKKwkJaWYgKGV1YyA9PSBldWMyc2ppc2libV9qaXN4MDIxMl9tYXBbaW5kZXhdLmV1YykgeworCQkJc2ppc1swXSA9IGV1YzJzamlzaWJtX2ppc3gwMjEyX21hcFtpbmRleF0uc2ppc1swXTsKKwkJCXNqaXNbMV0gPSBldWMyc2ppc2libV9qaXN4MDIxMl9tYXBbaW5kZXhdLnNqaXNbMV07CisJCQlyZXR1cm4gMzsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyogRVVDIHRvIFNKSVMgSUJNIGV4dGVuZGVkIGNoYXJhY3RlcnMgKEczIFVwcGVyIGJsb2NrKSAqLworc3RhdGljIGlubGluZSBpbnQgZXVjMnNqaXNpYm1fZzN1cHBlcih1bnNpZ25lZCBjaGFyICpzamlzLCBjb25zdCB1bnNpZ25lZCBjaGFyIGV1Y19oaSwKKwkJCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGV1Y19sbykKK3sKKwlpbnQgaW5kZXg7CisKKwlpZiAoZXVjX2hpID09IDB4RjMpCisJCWluZGV4ID0gKChldWNfaGkgPDwgOCkgfCBldWNfbG8pIC0gMHhGM0YzOworCWVsc2UKKwkJaW5kZXggPSAoKGV1Y19oaSA8PCA4KSB8IGV1Y19sbykgLSAweEY0QTEgKyAxMjsKKworCWlmICgoaW5kZXggPCAwKSB8fCAoaW5kZXggPj0gTUFQX0VMRU1FTlRfT0YoZXVjMnNqaXNpYm1fZzN1cHBlcl9tYXApKSkKKwkJcmV0dXJuIDA7CisKKwlzamlzWzBdID0gZXVjMnNqaXNpYm1fZzN1cHBlcl9tYXBbaW5kZXhdWzBdOworCXNqaXNbMV0gPSBldWMyc2ppc2libV9nM3VwcGVyX21hcFtpbmRleF1bMV07CisKKwlyZXR1cm4gMzsKK30KKworLyogRVVDIHRvIFNKSVMgSUJNIGV4dGVuZGVkIGNoYXJhY3RlcnMgKEczIGJsb2NrKSAqLworc3RhdGljIGlubGluZSBpbnQgZXVjMnNqaXNpYm0odW5zaWduZWQgY2hhciAqc2ppcywgY29uc3QgdW5zaWduZWQgY2hhciBldWNfaGksCisJCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyIGV1Y19sbykKK3sKKwlpbnQgbjsKKworI2lmIDAKKwlpZiAoKGV1Y19oaSA9PSAweEEyKSAmJiAoZXVjX2xvID09IDB4Q0MpKSB7CisJCXNqaXNbMF0gPSAweEZBOworCQlzamlzWzFdID0gMHg1NDsKKwkJcmV0dXJuIDI7CisJfSBlbHNlIGlmICgoZXVjX2hpID09IDB4QTIpICYmIChldWNfbG8gPT0gMHhFOCkpIHsKKwkJc2ppc1swXSA9IDB4RkE7CisJCXNqaXNbMV0gPSAweDVCOworCQlyZXR1cm4gMjsKKwl9CisjZW5kaWYKKwlpZiAoKG4gPSBldWMyc2ppc2libV9nM3VwcGVyKHNqaXMsIGV1Y19oaSwgZXVjX2xvKSkpIHsKKwkJcmV0dXJuIG47CisJfSBlbHNlIGlmICgobiA9IGV1YzJzamlzaWJtX2ppc3gwMjEyKHNqaXMsIGV1Y19oaSwgZXVjX2xvKSkpIHsKKwkJcmV0dXJuIG47CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIE5FQy9JQk0gZXh0ZW5kZWQgY2hhcmFjdGVycyB0byBJQk0gZXh0ZW5kZWQgY2hhcmFjdGVycyAqLworc3RhdGljIGlubGluZSBpbnQgc2ppc25lYzJzamlzaWJtKHVuc2lnbmVkIGNoYXIgKnNqaXNpYm0sCisJCQkJICBjb25zdCB1bnNpZ25lZCBjaGFyIHNqaXNuZWNfaGksCisJCQkJICBjb25zdCB1bnNpZ25lZCBjaGFyIHNqaXNuZWNfbG8pCit7CisJaW50IGNvdW50OworCisJaWYgKCEgSVNfU0pJU19ORUNJQk0oc2ppc25lY19oaSwgc2ppc25lY19sbykpCisJCXJldHVybiAwOworCisJaWYgKChzamlzbmVjX2hpID09IDB4RUUpICYmIChzamlzbmVjX2xvID09IDB4RjkpKSB7CisJCXNqaXNpYm1bMF0gPSAweDgxOworCQlzamlzaWJtWzFdID0gMHhDQTsKKwkJcmV0dXJuIDI7CisJfQorCisJaWYgKChzamlzbmVjX2hpID09IDB4RUUpICYmIChzamlzbmVjX2xvID49IDB4RUYpKSB7CisJCWNvdW50ID0gKHNqaXNuZWNfaGkgPDwgOCB8IHNqaXNuZWNfbG8pCisJCQktIChzamlzbmVjX2xvIDw9IDB4RjkgPyAweEVFRUYgOiAoMHhFRUVGIC0gMTApKTsKKwl9IGVsc2UgeworCQljb3VudCA9IChzamlzbmVjX2hpIC0gMHhFRCkgKiAoMHhGQyAtIDB4NDApCisJCQkrIChzamlzbmVjX2xvIC0gMHg0MCkgKyAoMHg1QyAtIDB4NDApOworCQlpZiAoc2ppc25lY19sbyA+PSAweDdGKQorCQkJY291bnQtLTsKKwl9CisKKwlzamlzaWJtWzBdID0gMHhGQSArIChjb3VudCAvICgweEZDIC0gMHg0MCkpOworCXNqaXNpYm1bMV0gPSAweDQwICsgKGNvdW50ICUgKDB4RkMgLSAweDQwKSk7CisJaWYgKHNqaXNpYm1bMV0gPj0gMHg3RikKKwkJc2ppc2libVsxXSsrOworCisJcmV0dXJuIDI7Cit9CisKK3N0YXRpYyBpbnQgdW5pMmNoYXIoY29uc3Qgd2NoYXJfdCB1bmksCisJCSAgICB1bnNpZ25lZCBjaGFyICpvdXQsIGludCBib3VuZGxlbikKK3sKKwlpbnQgbjsKKworCWlmICghcF9ubHMpCisJCXJldHVybiAtRUlOVkFMOworCWlmICgobiA9IHBfbmxzLT51bmkyY2hhcih1bmksIG91dCwgYm91bmRsZW4pKSA8IDApCisJCXJldHVybiBuOworCisJLyogdHJhbnNsYXRlIFNKSVMgaW50byBFVUMtSlAgKi8KKwlpZiAobiA9PSAxKSB7CisJCWlmIChJU19TSklTX0pJU1gwMjAxS0FOQShvdXRbMF0pKSB7CisJCQkvKiBKSVMgWCAwMjAxIEtBTkEgKi8KKwkJCWlmIChib3VuZGxlbiA8IDIpCisJCQkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwkJCW91dFsxXSA9IG91dFswXTsKKwkJCW91dFswXSA9IFNTMjsKKwkJCXJldHVybiAyOworCQl9CisJfSBlbHNlIGlmIChuID09IDIpIHsKKwkJLyogTkVDL0lCTSBleHRlbmRlZCBjaGFyYWN0ZXJzIHRvIElCTSBleHRlbmRlZCBjaGFyYWN0ZXJzICovCisJCXNqaXNuZWMyc2ppc2libShvdXQsIG91dFswXSwgb3V0WzFdKTsKKworCQlpZiAoSVNfU0pJU19VRENfTE9XKG91dFswXSwgb3V0WzFdKSkgeworCQkJLyogVXNlciBkZWZpbmVkIGNoYXJhY3RlcnMgaGFsZiBsb3cgKi8KKwkJCU1BUF9TSklTMkVVQyhvdXRbMF0sIG91dFsxXSwgMHhGMCwgb3V0WzBdLCBvdXRbMV0sIDB4RjUpOworCQl9IGVsc2UgaWYgKElTX1NKSVNfVURDX0hJKG91dFswXSwgb3V0WzFdKSkgeworCQkJLyogVXNlciBkZWZpbmVkIGNoYXJhY3RlcnMgaGFsZiBoaWdoICovCisJCQl1bnNpZ25lZCBjaGFyIGNoLCBjbDsKKworCQkJaWYgKGJvdW5kbGVuIDwgMykKKwkJCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCQkJbiA9IDM7IGNoID0gb3V0WzBdOyBjbCA9IG91dFsxXTsKKwkJCW91dFswXSA9IFNTMzsKKwkJCU1BUF9TSklTMkVVQyhjaCwgY2wsIDB4RjUsIG91dFsxXSwgb3V0WzJdLCAweEY1KTsKKwkJfSBlbHNlIGlmIChJU19TSklTX0lCTShvdXRbMF0sIG91dFsxXSkpIHsKKwkJCS8qIElCTSBleHRlbmRlZCBjaGFyYWN0ZXJzICovCisJCQl1bnNpZ25lZCBjaGFyIGV1Y1szXSwgaTsKKworCQkJbiA9IHNqaXNpYm0yZXVjKGV1Yywgb3V0WzBdLCBvdXRbMV0pOworCQkJaWYgKGJvdW5kbGVuIDwgbikKKwkJCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKwkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCQkJb3V0W2ldID0gZXVjW2ldOworCQl9IGVsc2UgaWYgKElTX1NKSVNfSklTWDAyMDgob3V0WzBdLCBvdXRbMV0pKSB7CisJCQkvKiBKSVMgWCAwMjA4IChpbmNsdWRlIE5FQyBzcGVjaWFsIGNoYXJhY3RlcnMpICovCisJCQlvdXRbMF0gPSAob3V0WzBdXjB4QTApKjIgKyAweDVGOworCQkJaWYgKG91dFsxXSA+IDB4OUUpCisJCQkJb3V0WzBdKys7CisKKwkJCWlmIChvdXRbMV0gPCAweDdGKQorCQkJCW91dFsxXSA9IG91dFsxXSArIDB4NjE7CisJCQllbHNlIGlmIChvdXRbMV0gPCAweDlGKQorCQkJCW91dFsxXSA9IG91dFsxXSArIDB4NjA7CisJCQllbHNlCisJCQkJb3V0WzFdID0gb3V0WzFdICsgMHgwMjsKKwkJfSBlbHNlIHsKKwkJCS8qIEludmFsaWQgY2hhcmFjdGVycyAqLworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBuOworfQorCitzdGF0aWMgaW50IGNoYXIydW5pKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJhd3N0cmluZywgaW50IGJvdW5kbGVuLAorCQkgICAgd2NoYXJfdCAqdW5pKQoreworCXVuc2lnbmVkIGNoYXIgc2ppc190ZW1wWzJdOworCWludCBldWNfb2Zmc2V0LCBuOworCisJaWYgKCAhcF9ubHMgKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoYm91bmRsZW4gPD0gMCkKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwkvKiB0cmFuc2xhdGUgRVVDLUpQIGludG8gU0pJUyAqLworCWlmIChyYXdzdHJpbmdbMF0gPiAweDdGKSB7CisJCWlmIChyYXdzdHJpbmdbMF0gPT0gU1MzKSB7CisJCQlpZiAoYm91bmRsZW4gPCAzKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJZXVjX29mZnNldCA9IDM7CisKKwkJCWlmIChJU19FVUNfVURDX0hJKHJhd3N0cmluZ1sxXSwgcmF3c3RyaW5nWzJdKSkgeworCQkJCS8qIFVzZXIgZGVmaW5lZCBjaGFyYWN0ZXJzIGhhbGYgaGlnaCAqLworCQkJCU1BUF9FVUMyU0pJUyhyYXdzdHJpbmdbMV0sIHJhd3N0cmluZ1syXSwgMHhGNSwKKwkJCQkJICAgICBzamlzX3RlbXBbMF0sIHNqaXNfdGVtcFsxXSwgMHhGNSk7CisJCQl9IGVsc2UgaWYgKGV1YzJzamlzaWJtKHNqaXNfdGVtcCxyYXdzdHJpbmdbMV0scmF3c3RyaW5nWzJdKSkgeworCQkJCS8qIElCTSBleHRlbmRlZCBjaGFyYWN0ZXJzICovCisJCQl9IGVsc2UgeworCQkJCS8qIEpJUyBYIDAyMTIgYW5kIEludmFsaWQgY2hhcmFjdGVycyovCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCQkvKiAnR0VUQScgd2l0aCBTSklTIGNvZGluZyAqLworCQkJCS8qIHNqaXNfdGVtcFswXSA9IDB4ODE7ICovCisJCQkJLyogc2ppc190ZW1wWzFdID0gMHhBQzsgKi8KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChib3VuZGxlbiA8IDIpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlldWNfb2Zmc2V0ID0gMjsKKworCQkJaWYgKElTX0VVQ19KSVNYMDIwMUtBTkEocmF3c3RyaW5nWzBdLCByYXdzdHJpbmdbMV0pKSB7CisJCQkJLyogSklTIFggMDIwMSBLQU5BICovCisJCQkJc2ppc190ZW1wWzBdID0gcmF3c3RyaW5nWzFdOworCQkJCXNqaXNfdGVtcFsxXSA9IDB4MDA7CisJCQl9IGVsc2UgaWYgKElTX0VVQ19VRENfTE9XKHJhd3N0cmluZ1swXSwgcmF3c3RyaW5nWzFdKSkgeworCQkJCS8qIFVzZXIgZGVmaW5lZCBjaGFyYWN0ZXJzIGhhbGYgbG93ICovCisJCQkJTUFQX0VVQzJTSklTKHJhd3N0cmluZ1swXSwgcmF3c3RyaW5nWzFdLCAweEY1LAorCQkJCQkgICAgIHNqaXNfdGVtcFswXSwgc2ppc190ZW1wWzFdLCAweEYwKTsKKwkJCX0gZWxzZSBpZiAoSVNfRVVDX0pJU1gwMjA4KHJhd3N0cmluZ1swXSwgcmF3c3RyaW5nWzFdKSkgeworCQkJCS8qIEpJUyBYIDAyMDggKGluY2x1ZGUgTkVDIHNwZXNpYWwgY2hhcmFjdGVycykgKi8KKwkJCQlzamlzX3RlbXBbMF0gPSAoKHJhd3N0cmluZ1swXS0weDVmKS8yKSBeIDB4QTA7CisJCQkJaWYgKCEocmF3c3RyaW5nWzBdICYgMSkpCisJCQkJCXNqaXNfdGVtcFsxXSA9IHJhd3N0cmluZ1sxXSAtIDB4MDI7CisJCQkJZWxzZSBpZiAocmF3c3RyaW5nWzFdIDwgMHhFMCkKKwkJCQkJc2ppc190ZW1wWzFdID0gcmF3c3RyaW5nWzFdIC0gMHg2MTsKKwkJCQllbHNlCisJCQkJCXNqaXNfdGVtcFsxXSA9IHJhd3N0cmluZ1sxXSAtIDB4NjA7CisJCQl9IGVsc2UgeworCQkJCS8qIEludmFsaWQgY2hhcmFjdGVycyAqLworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJZXVjX29mZnNldCA9IDE7CisKKwkJLyogSklTIFggMDIwMSBST01BSkkgKi8KKwkJc2ppc190ZW1wWzBdID0gcmF3c3RyaW5nWzBdOworCQlzamlzX3RlbXBbMV0gPSAweDAwOworCX0KKworCWlmICggKG4gPSBwX25scy0+Y2hhcjJ1bmkoc2ppc190ZW1wLCBzaXplb2Yoc2ppc190ZW1wKSwgdW5pKSkgPCAwKQorCQlyZXR1cm4gbjsKKworCXJldHVybiBldWNfb2Zmc2V0OworfQorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSB0YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJldWMtanAiLAorCS51bmkyY2hhcgk9IHVuaTJjaGFyLAorCS5jaGFyMnVuaQk9IGNoYXIydW5pLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmxzX2V1Y19qcCh2b2lkKQoreworCXBfbmxzID0gbG9hZF9ubHMoImNwOTMyIik7CisKKwlpZiAocF9ubHMpIHsKKwkJdGFibGUuY2hhcnNldDJ1cHBlciA9IHBfbmxzLT5jaGFyc2V0MnVwcGVyOworCQl0YWJsZS5jaGFyc2V0Mmxvd2VyID0gcF9ubHMtPmNoYXJzZXQybG93ZXI7CisJCXJldHVybiByZWdpc3Rlcl9ubHMoJnRhYmxlKTsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmxzX2V1Y19qcCh2b2lkKQoreworCXVucmVnaXN0ZXJfbmxzKCZ0YWJsZSk7CisJdW5sb2FkX25scyhwX25scyk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbmxzX2V1Y19qcCkKK21vZHVsZV9leGl0KGV4aXRfbmxzX2V1Y19qcCkKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvbmxzL25sc19pc284ODU5LTEuYyBiL2ZzL25scy9ubHNfaXNvODg1OS0xLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBhMmMxOQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25scy9ubHNfaXNvODg1OS0xLmMKQEAgLTAsMCArMSwyNTggQEAKKy8qCisgKiBsaW51eC9mcy9ubHNfaXNvODg1OS0xLmMKKyAqCisgKiBDaGFyc2V0IGlzbzg4NTktMSB0cmFuc2xhdGlvbiB0YWJsZXMuCisgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBVbmljb2RlIGFuZCBjaGFyc2V0CisgKiB0YWJsZXMgZnJvbSB0aGUgVW5pY29kZSBPcmdhbml6YXRpb24gKHd3dy51bmljb2RlLm9yZykuCisgKiBUaGUgVW5pY29kZSB0byBjaGFyc2V0IHRhYmxlIGhhcyBvbmx5IGV4YWN0IG1hcHBpbmdzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCitzdGF0aWMgd2NoYXJfdCBjaGFyc2V0MnVuaVsyNTZdID0geworCS8qIDB4MDAqLworCTB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywKKwkweDAwMDQsIDB4MDAwNSwgMHgwMDA2LCAweDAwMDcsCisJMHgwMDA4LCAweDAwMDksIDB4MDAwYSwgMHgwMDBiLAorCTB4MDAwYywgMHgwMDBkLCAweDAwMGUsIDB4MDAwZiwKKwkvKiAweDEwKi8KKwkweDAwMTAsIDB4MDAxMSwgMHgwMDEyLCAweDAwMTMsCisJMHgwMDE0LCAweDAwMTUsIDB4MDAxNiwgMHgwMDE3LAorCTB4MDAxOCwgMHgwMDE5LCAweDAwMWEsIDB4MDAxYiwKKwkweDAwMWMsIDB4MDAxZCwgMHgwMDFlLCAweDAwMWYsCisJLyogMHgyMCovCisJMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLAorCTB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKwkweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsCisJMHgwMDJjLCAweDAwMmQsIDB4MDAyZSwgMHgwMDJmLAorCS8qIDB4MzAqLworCTB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywKKwkweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisJMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLAorCTB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKwkvKiAweDQwKi8KKwkweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsCisJMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAorCTB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwKKwkweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsCisJLyogMHg1MCovCisJMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLAorCTB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKwkweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsCisJMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLAorCS8qIDB4NjAqLworCTB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywKKwkweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisJMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLAorCTB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKKwkvKiAweDcwKi8KKwkweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsCisJMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LAorCTB4MDA3OCwgMHgwMDc5LCAweDAwN2EsIDB4MDA3YiwKKwkweDAwN2MsIDB4MDA3ZCwgMHgwMDdlLCAweDAwN2YsCisJLyogMHg4MCovCisJMHgwMDgwLCAweDAwODEsIDB4MDA4MiwgMHgwMDgzLAorCTB4MDA4NCwgMHgwMDg1LCAweDAwODYsIDB4MDA4NywKKwkweDAwODgsIDB4MDA4OSwgMHgwMDhhLCAweDAwOGIsCisJMHgwMDhjLCAweDAwOGQsIDB4MDA4ZSwgMHgwMDhmLAorCS8qIDB4OTAqLworCTB4MDA5MCwgMHgwMDkxLCAweDAwOTIsIDB4MDA5MywKKwkweDAwOTQsIDB4MDA5NSwgMHgwMDk2LCAweDAwOTcsCisJMHgwMDk4LCAweDAwOTksIDB4MDA5YSwgMHgwMDliLAorCTB4MDA5YywgMHgwMDlkLCAweDAwOWUsIDB4MDA5ZiwKKwkvKiAweGEwKi8KKwkweDAwYTAsIDB4MDBhMSwgMHgwMGEyLCAweDAwYTMsCisJMHgwMGE0LCAweDAwYTUsIDB4MDBhNiwgMHgwMGE3LAorCTB4MDBhOCwgMHgwMGE5LCAweDAwYWEsIDB4MDBhYiwKKwkweDAwYWMsIDB4MDBhZCwgMHgwMGFlLCAweDAwYWYsCisJLyogMHhiMCovCisJMHgwMGIwLCAweDAwYjEsIDB4MDBiMiwgMHgwMGIzLAorCTB4MDBiNCwgMHgwMGI1LCAweDAwYjYsIDB4MDBiNywKKwkweDAwYjgsIDB4MDBiOSwgMHgwMGJhLCAweDAwYmIsCisJMHgwMGJjLCAweDAwYmQsIDB4MDBiZSwgMHgwMGJmLAorCS8qIDB4YzAqLworCTB4MDBjMCwgMHgwMGMxLCAweDAwYzIsIDB4MDBjMywKKwkweDAwYzQsIDB4MDBjNSwgMHgwMGM2LCAweDAwYzcsCisJMHgwMGM4LCAweDAwYzksIDB4MDBjYSwgMHgwMGNiLAorCTB4MDBjYywgMHgwMGNkLCAweDAwY2UsIDB4MDBjZiwKKwkvKiAweGQwKi8KKwkweDAwZDAsIDB4MDBkMSwgMHgwMGQyLCAweDAwZDMsCisJMHgwMGQ0LCAweDAwZDUsIDB4MDBkNiwgMHgwMGQ3LAorCTB4MDBkOCwgMHgwMGQ5LCAweDAwZGEsIDB4MDBkYiwKKwkweDAwZGMsIDB4MDBkZCwgMHgwMGRlLCAweDAwZGYsCisJLyogMHhlMCovCisJMHgwMGUwLCAweDAwZTEsIDB4MDBlMiwgMHgwMGUzLAorCTB4MDBlNCwgMHgwMGU1LCAweDAwZTYsIDB4MDBlNywKKwkweDAwZTgsIDB4MDBlOSwgMHgwMGVhLCAweDAwZWIsCisJMHgwMGVjLCAweDAwZWQsIDB4MDBlZSwgMHgwMGVmLAorCS8qIDB4ZjAqLworCTB4MDBmMCwgMHgwMGYxLCAweDAwZjIsIDB4MDBmMywKKwkweDAwZjQsIDB4MDBmNSwgMHgwMGY2LCAweDAwZjcsCisJMHgwMGY4LCAweDAwZjksIDB4MDBmYSwgMHgwMGZiLAorCTB4MDBmYywgMHgwMGZkLCAweDAwZmUsIDB4MDBmZiwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMFsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciAqcGFnZV91bmkyY2hhcnNldFsyNTZdID0geworCXBhZ2UwMCwgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQybG93ZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDQwLTB4NDcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDUwLTB4NTcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4YzAtMHhjNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4YzgtMHhjZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJ1cHBlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NjAtMHg2NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NzAtMHg3NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHgwMCwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhlMC0weGU3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhlOC0weGVmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHgwMCwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgaW50IHVuaTJjaGFyKHdjaGFyX3QgdW5pLCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCBib3VuZGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICp1bmkyY2hhcnNldDsKKwl1bnNpZ25lZCBjaGFyIGNsID0gdW5pICYgMHgwMGZmOworCXVuc2lnbmVkIGNoYXIgY2ggPSAodW5pICYgMHhmZjAwKSA+PiA4OworCisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJdW5pMmNoYXJzZXQgPSBwYWdlX3VuaTJjaGFyc2V0W2NoXTsKKwlpZiAodW5pMmNoYXJzZXQgJiYgdW5pMmNoYXJzZXRbY2xdKQorCQlvdXRbMF0gPSB1bmkyY2hhcnNldFtjbF07CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGFyMnVuaShjb25zdCB1bnNpZ25lZCBjaGFyICpyYXdzdHJpbmcsIGludCBib3VuZGxlbiwgd2NoYXJfdCAqdW5pKQoreworCSp1bmkgPSBjaGFyc2V0MnVuaVsqcmF3c3RyaW5nXTsKKwlpZiAoKnVuaSA9PSAweDAwMDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSB0YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJpc284ODU5LTEiLAorCS51bmkyY2hhcgk9IHVuaTJjaGFyLAorCS5jaGFyMnVuaQk9IGNoYXIydW5pLAorCS5jaGFyc2V0Mmxvd2VyCT0gY2hhcnNldDJsb3dlciwKKwkuY2hhcnNldDJ1cHBlcgk9IGNoYXJzZXQydXBwZXIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9ubHNfaXNvODg1OV8xKHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX25scygmdGFibGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9ubHNfaXNvODg1OV8xKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ubHNfaXNvODg1OV8xKQorbW9kdWxlX2V4aXQoZXhpdF9ubHNfaXNvODg1OV8xKQorCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CmRpZmYgLS1naXQgYS9mcy9ubHMvbmxzX2lzbzg4NTktMTMuYyBiL2ZzL25scy9ubHNfaXNvODg1OS0xMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NDcwMzUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ubHMvbmxzX2lzbzg4NTktMTMuYwpAQCAtMCwwICsxLDI4NiBAQAorLyoKKyAqIGxpbnV4L2ZzL25sc19pc284ODU5LTEzLmMKKyAqCisgKiBDaGFyc2V0IGlzbzg4NTktMTMgdHJhbnNsYXRpb24gdGFibGVzLgorICogVGhlIFVuaWNvZGUgdG8gY2hhcnNldCB0YWJsZSBoYXMgb25seSBleGFjdCBtYXBwaW5ncy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworc3RhdGljIHdjaGFyX3QgY2hhcnNldDJ1bmlbMjU2XSA9IHsKKwkvKiAweDAwKi8KKwkweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsCisJMHgwMDA0LCAweDAwMDUsIDB4MDAwNiwgMHgwMDA3LAorCTB4MDAwOCwgMHgwMDA5LCAweDAwMGEsIDB4MDAwYiwKKwkweDAwMGMsIDB4MDAwZCwgMHgwMDBlLCAweDAwMGYsCisJLyogMHgxMCovCisJMHgwMDEwLCAweDAwMTEsIDB4MDAxMiwgMHgwMDEzLAorCTB4MDAxNCwgMHgwMDE1LCAweDAwMTYsIDB4MDAxNywKKwkweDAwMTgsIDB4MDAxOSwgMHgwMDFhLCAweDAwMWIsCisJMHgwMDFjLCAweDAwMWQsIDB4MDAxZSwgMHgwMDFmLAorCS8qIDB4MjAqLworCTB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywKKwkweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisJMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLAorCTB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKwkvKiAweDMwKi8KKwkweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsCisJMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAorCTB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwKKwkweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsCisJLyogMHg0MCovCisJMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLAorCTB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKwkweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsCisJMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLAorCS8qIDB4NTAqLworCTB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywKKwkweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisJMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMDViLAorCTB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwKKwkvKiAweDYwKi8KKwkweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsCisJMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LAorCTB4MDA2OCwgMHgwMDY5LCAweDAwNmEsIDB4MDA2YiwKKwkweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsCisJLyogMHg3MCovCisJMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLAorCTB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKwkweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsCisJMHgwMDdjLCAweDAwN2QsIDB4MDA3ZSwgMHgwMDdmLAorCS8qIDB4ODAqLworCTB4MDA4MCwgMHgwMDgxLCAweDAwODIsIDB4MDA4MywKKwkweDAwODQsIDB4MDA4NSwgMHgwMDg2LCAweDAwODcsCisJMHgwMDg4LCAweDAwODksIDB4MDA4YSwgMHgwMDhiLAorCTB4MDA4YywgMHgwMDhkLCAweDAwOGUsIDB4MDA4ZiwKKwkvKiAweDkwKi8KKwkweDAwOTAsIDB4MDA5MSwgMHgwMDkyLCAweDAwOTMsCisJMHgwMDk0LCAweDAwOTUsIDB4MDA5NiwgMHgwMDk3LAorCTB4MDA5OCwgMHgwMDk5LCAweDAwOWEsIDB4MDA5YiwKKwkweDAwOWMsIDB4MDA5ZCwgMHgwMDllLCAweDAwOWYsCisJLyogMHhhMCovCisJMHgwMGEwLCAweDIwMWQsIDB4MDBhMiwgMHgwMGEzLAorCTB4MDBhNCwgMHgyMDFlLCAweDAwYTYsIDB4MDBhNywKKwkweDAwZDgsIDB4MDBhOSwgMHgwMTU2LCAweDAwYWIsCisJMHgwMGFjLCAweDAwYWQsIDB4MDBhZSwgMHgwMGM2LAorCS8qIDB4YjAqLworCTB4MDBiMCwgMHgwMGIxLCAweDAwYjIsIDB4MDBiMywKKwkweDIwMWMsIDB4MDBiNSwgMHgwMGI2LCAweDAwYjcsCisJMHgwMGY4LCAweDAwYjksIDB4MDE1NywgMHgwMGJiLAorCTB4MDBiYywgMHgwMGJkLCAweDAwYmUsIDB4MDBlNiwKKwkvKiAweGMwKi8KKwkweDAxMDQsIDB4MDEyZSwgMHgwMTAwLCAweDAxMDYsCisJMHgwMGM0LCAweDAwYzUsIDB4MDExOCwgMHgwMTEyLAorCTB4MDEwYywgMHgwMGM5LCAweDAxNzksIDB4MDExNiwKKwkweDAxMjIsIDB4MDEzNiwgMHgwMTJhLCAweDAxM2IsCisJLyogMHhkMCovCisJMHgwMTYwLCAweDAxNDMsIDB4MDE0NSwgMHgwMGQzLAorCTB4MDE0YywgMHgwMGQ1LCAweDAwZDYsIDB4MDBkNywKKwkweDAxNzIsIDB4MDE0MSwgMHgwMTVhLCAweDAxNmEsCisJMHgwMGRjLCAweDAxN2IsIDB4MDE3ZCwgMHgwMGRmLAorCS8qIDB4ZTAqLworCTB4MDEwNSwgMHgwMTJmLCAweDAxMDEsIDB4MDEwNywKKwkweDAwZTQsIDB4MDBlNSwgMHgwMTE5LCAweDAxMTMsCisJMHgwMTBkLCAweDAwZTksIDB4MDE3YSwgMHgwMTE3LAorCTB4MDEyMywgMHgwMTM3LCAweDAxMmIsIDB4MDEzYywKKwkvKiAweGYwKi8KKwkweDAxNjEsIDB4MDE0NCwgMHgwMTQ2LCAweDAwZjMsCisJMHgwMTRkLCAweDAwZjUsIDB4MDBmNiwgMHgwMGY3LAorCTB4MDE3MywgMHgwMTQyLCAweDAxNWIsIDB4MDE2YiwKKwkweDAwZmMsIDB4MDE3YywgMHgwMTdlLCAweDIwMTksCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDBbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4MDAsIDB4YTIsIDB4YTMsIDB4YTQsIDB4MDAsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4MDAsIDB4YTksIDB4MDAsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4MDAsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4MDAsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4MDAsIDB4YjksIDB4MDAsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4MDAsIC8qIDB4YjgtMHhiZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzQsIDB4YzUsIDB4YWYsIDB4MDAsIC8qIDB4YzAtMHhjNyAqLworCTB4MDAsIDB4YzksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YzgtMHhjZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4ZDMsIDB4MDAsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4YTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZGMsIDB4MDAsIDB4MDAsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZTQsIDB4ZTUsIDB4YmYsIDB4MDAsIC8qIDB4ZTAtMHhlNyAqLworCTB4MDAsIDB4ZTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZTgtMHhlZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4ZjMsIDB4MDAsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4YjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmMsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAxWzI1Nl0gPSB7CisJMHhjMiwgMHhlMiwgMHgwMCwgMHgwMCwgMHhjMCwgMHhlMCwgMHhjMywgMHhlMywgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjOCwgMHhlOCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHhjNywgMHhlNywgMHgwMCwgMHgwMCwgMHhjYiwgMHhlYiwgLyogMHgxMC0weDE3ICovCisJMHhjNiwgMHhlNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHhjYywgMHhlYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHhjZSwgMHhlZSwgMHgwMCwgMHgwMCwgMHhjMSwgMHhlMSwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjZCwgMHhlZCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhjZiwgMHhlZiwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHhkOSwgMHhmOSwgMHhkMSwgMHhmMSwgMHhkMiwgMHhmMiwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkNCwgMHhmNCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhYSwgMHhiYSwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHhkYSwgMHhmYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHhkMCwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhkYiwgMHhmYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHhkOCwgMHhmOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHhjYSwgMHhlYSwgMHhkZCwgMHhmZCwgMHhkZSwgMHhmZSwgMHgwMCwgLyogMHg3OC0weDdmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjBbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweGZmLCAweDAwLCAweDAwLCAweGI0LCAweGExLCAweGE1LCAweDAwLCAvKiAweDE4LTB4MWYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwYWdlX3VuaTJjaGFyc2V0WzI1Nl0gPSB7CisJcGFnZTAwLCBwYWdlMDEsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJcGFnZTIwLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0Mmxvd2VyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg0MC0weDQ3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg0OC0weDRmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg1MC0weDU3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweGIxLCAweGEyLCAweGIzLCAweGE0LCAweGI1LCAweGI2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGFkLCAweGJlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJmLCAweGJlLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGMwLTB4YzcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQydXBwZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDYwLTB4NjcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDY4LTB4NmYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDcwLTB4NzcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YTEsIDB4YjIsIDB4YTMsIDB4YjQsIDB4YTUsIDB4YTYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YmQsIDB4YWUsIDB4YmQsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4ZTAtMHhlNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIGludCB1bmkyY2hhcih3Y2hhcl90IHVuaSwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgYm91bmRsZW4pCit7CisJdW5zaWduZWQgY2hhciAqdW5pMmNoYXJzZXQ7CisJdW5zaWduZWQgY2hhciBjbCA9IHVuaSAmIDB4MDBmZjsKKwl1bnNpZ25lZCBjaGFyIGNoID0gKHVuaSAmIDB4ZmYwMCkgPj4gODsKKworCWlmIChib3VuZGxlbiA8PSAwKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCXVuaTJjaGFyc2V0ID0gcGFnZV91bmkyY2hhcnNldFtjaF07CisJaWYgKHVuaTJjaGFyc2V0ICYmIHVuaTJjaGFyc2V0W2NsXSkKKwkJb3V0WzBdID0gdW5pMmNoYXJzZXRbY2xdOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY2hhcjJ1bmkoY29uc3QgdW5zaWduZWQgY2hhciAqcmF3c3RyaW5nLCBpbnQgYm91bmRsZW4sIHdjaGFyX3QgKnVuaSkKK3sKKwkqdW5pID0gY2hhcnNldDJ1bmlbKnJhd3N0cmluZ107CisJaWYgKCp1bmkgPT0gMHgwMDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBubHNfdGFibGUgdGFibGUgPSB7CisJLmNoYXJzZXQJPSAiaXNvODg1OS0xMyIsCisJLnVuaTJjaGFyCT0gdW5pMmNoYXIsCisJLmNoYXIydW5pCT0gY2hhcjJ1bmksCisJLmNoYXJzZXQybG93ZXIJPSBjaGFyc2V0Mmxvd2VyLAorCS5jaGFyc2V0MnVwcGVyCT0gY2hhcnNldDJ1cHBlciwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X25sc19pc284ODU5XzEzKHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX25scygmdGFibGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9ubHNfaXNvODg1OV8xMyh2b2lkKQoreworCXVucmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbmxzX2lzbzg4NTlfMTMpCittb2R1bGVfZXhpdChleGl0X25sc19pc284ODU5XzEzKQorCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CmRpZmYgLS1naXQgYS9mcy9ubHMvbmxzX2lzbzg4NTktMTQuYyBiL2ZzL25scy9ubHNfaXNvODg1OS0xNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNjI4ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ubHMvbmxzX2lzbzg4NTktMTQuYwpAQCAtMCwwICsxLDM0MiBAQAorLyoKKyAqIGxpbnV4L2ZzL25sc19pc284ODU5LTE0LmMKKyAqCisgKiBDaGFyc2V0IGlzbzg4NTktMTQgdHJhbnNsYXRpb24gdGFibGVzLgorICoKKyAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIFVuaWNvZGUgYW5kIGNoYXJzZXQgdGFibGUKKyAqIHByb3ZpZGVkIGJ5IHRoZSBVbmljb2RlIE9yZ2FuaXNhdGlvbiBhdAorICogaHR0cDovL3d3dy51bmljb2RlLm9yZy8KKyAqIFRoZSBVbmljb2RlIHRvIGNoYXJzZXQgdGFibGUgaGFzIG9ubHkgZXhhY3QgbWFwcGluZ3MuCisgKgorICogUmh5cyBKb25lcywgU3dhbnNlYSBVbml2ZXJzaXR5IENvbXB1dGVyIFNvY2lldHkKKyAqIHJoeXNAc3Vjcy5zd2FuLmFjLnVrCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKK3N0YXRpYyB3Y2hhcl90IGNoYXJzZXQydW5pWzI1Nl0gPSB7CisJLyogMHgwMCovCisJMHgwMDAwLCAweDAwMDEsIDB4MDAwMiwgMHgwMDAzLCAKKwkweDAwMDQsIDB4MDAwNSwgMHgwMDA2LCAweDAwMDcsIAorCTB4MDAwOCwgMHgwMDA5LCAweDAwMGEsIDB4MDAwYiwgCisJMHgwMDBjLCAweDAwMGQsIDB4MDAwZSwgMHgwMDBmLCAKKwkvKiAweDEwKi8KKwkweDAwMTAsIDB4MDAxMSwgMHgwMDEyLCAweDAwMTMsIAorCTB4MDAxNCwgMHgwMDE1LCAweDAwMTYsIDB4MDAxNywgCisJMHgwMDE4LCAweDAwMTksIDB4MDAxYSwgMHgwMDFiLCAKKwkweDAwMWMsIDB4MDAxZCwgMHgwMDFlLCAweDAwMWYsIAorCS8qIDB4MjAqLworCTB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywgCisJMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LCAKKwkweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsIAorCTB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwgCisJLyogMHgzMCovCisJMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLCAKKwkweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIAorCTB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwgCisJMHgwMDNjLCAweDAwM2QsIDB4MDAzZSwgMHgwMDNmLCAKKwkvKiAweDQwKi8KKwkweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIAorCTB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywgCisJMHgwMDQ4LCAweDAwNDksIDB4MDA0YSwgMHgwMDRiLCAKKwkweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsIAorCS8qIDB4NTAqLworCTB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywgCisJMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LCAKKwkweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsIAorCTB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwgCisJLyogMHg2MCovCisJMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLCAKKwkweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsIAorCTB4MDA2OCwgMHgwMDY5LCAweDAwNmEsIDB4MDA2YiwgCisJMHgwMDZjLCAweDAwNmQsIDB4MDA2ZSwgMHgwMDZmLCAKKwkvKiAweDcwKi8KKwkweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsIAorCTB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywgCisJMHgwMDc4LCAweDAwNzksIDB4MDA3YSwgMHgwMDdiLCAKKwkweDAwN2MsIDB4MDA3ZCwgMHgwMDdlLCAweDAwN2YsIAorCS8qIDB4ODAqLworCTB4MDA4MCwgMHgwMDgxLCAweDAwODIsIDB4MDA4MywKKwkweDAwODQsIDB4MDA4NSwgMHgwMDg2LCAweDAwODcsCisJMHgwMDg4LCAweDAwODksIDB4MDA4YSwgMHgwMDhiLAorCTB4MDA4YywgMHgwMDhkLCAweDAwOGUsIDB4MDA4ZiwKKwkvKiAweDkwKi8KKwkweDAwOTAsIDB4MDA5MSwgMHgwMDkyLCAweDAwOTMsCisJMHgwMDk0LCAweDAwOTUsIDB4MDA5NiwgMHgwMDk3LAorCTB4MDA5OCwgMHgwMDk5LCAweDAwOWEsIDB4MDA5YiwKKwkweDAwOWMsIDB4MDA5ZCwgMHgwMDllLCAweDAwOWYsCisJLyogMHhhMCovCisJMHgwMGEwLCAweDFlMDIsIDB4MWUwMywgMHgwMGEzLCAKKwkweDAxMGEsIDB4MDEwYiwgMHgxZTBhLCAweDAwYTcsIAorCTB4MWU4MCwgMHgwMGE5LCAweDFlODIsIDB4MWUwYiwgCisJMHgxZWYyLCAweDAwYWQsIDB4MDBhZSwgMHgwMTc4LCAKKwkvKiAweGIwKi8KKwkweDFlMWUsIDB4MWUxZiwgMHgwMTIwLCAweDAxMjEsIAorCTB4MWU0MCwgMHgxZTQxLCAweDAwYjYsIDB4MWU1NiwgCisJMHgxZTgxLCAweDFlNTcsIDB4MWU4MywgMHgxZTYwLCAKKwkweDFlZjMsIDB4MWU4NCwgMHgxZTg1LCAweDFlNjEsIAorCS8qIDB4YzAqLworCTB4MDBjMCwgMHgwMGMxLCAweDAwYzIsIDB4MDBjMywgCisJMHgwMGM0LCAweDAwYzUsIDB4MDBjNiwgMHgwMGM3LCAKKwkweDAwYzgsIDB4MDBjOSwgMHgwMGNhLCAweDAwY2IsIAorCTB4MDBjYywgMHgwMGNkLCAweDAwY2UsIDB4MDBjZiwgCisJLyogMHhkMCovCisJMHgwMTc0LCAweDAwZDEsIDB4MDBkMiwgMHgwMGQzLCAKKwkweDAwZDQsIDB4MDBkNSwgMHgwMGQ2LCAweDFlNmEsIAorCTB4MDBkOCwgMHgwMGQ5LCAweDAwZGEsIDB4MDBkYiwgCisJMHgwMGRjLCAweDAwZGQsIDB4MDE3NiwgMHgwMGRmLCAKKwkvKiAweGUwKi8KKwkweDAwZTAsIDB4MDBlMSwgMHgwMGUyLCAweDAwZTMsIAorCTB4MDBlNCwgMHgwMGU1LCAweDAwZTYsIDB4MDBlNywgCisJMHgwMGU4LCAweDAwZTksIDB4MDBlYSwgMHgwMGViLCAKKwkweDAwZWMsIDB4MDBlZCwgMHgwMGVlLCAweDAwZWYsIAorCS8qIDB4ZjAqLworCTB4MDE3NSwgMHgwMGYxLCAweDAwZjIsIDB4MDBmMywgCisJMHgwMGY0LCAweDAwZjUsIDB4MDBmNiwgMHgxZTZiLCAKKwkweDAwZjgsIDB4MDBmOSwgMHgwMGZhLCAweDAwZmIsIAorCTB4MDBmYywgMHgwMGZkLCAweDAxNzcsIDB4MDBmZiwgCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDBbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4MDAsIDB4MDAsIDB4YTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4MDAsIDB4YTksIDB4MDAsIDB4MDAsIDB4MDAsIDB4YWQsIDB4YWUsIDB4MDAsIC8qIDB4YTgtMHhhZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YjYsIDB4MDAsIC8qIDB4YjAtMHhiNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4MDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4MDAsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4MDAsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4MDAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4MDAsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4MDAsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAxWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHhhMSwgMHhhMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHhhNiwgMHhhYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiMCwgMHhiMSwgLyogMHgxOC0weDFmICovCisJMHhiMiwgMHhiMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHhiNCwgMHhiNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiNywgMHhiOSwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHhiYiwgMHhiZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHhkNywgMHhmNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkMCwgMHhmMCwgMHhkZSwgMHhmZSwgLyogMHg3MC0weDc3ICovCisJMHhhZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisJCisJMHhhOCwgMHhiOCwgMHhhYSwgMHhiYSwgMHhiZCwgMHhiZSwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhMC0weGE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhOC0weGFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhiMC0weGI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhiOC0weGJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhjMC0weGM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhjOC0weGNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhkMC0weGQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhkOC0weGRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhlMC0weGU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhlOC0weGVmICovCisJMHgwMCwgMHgwMCwgMHhhYywgMHhiYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhmMC0weGY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMWVbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweGExLCAweGEyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweGE2LCAweGFiLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGIwLCAweGIxLCAvKiAweDE4LTB4MWYgKi8KKwkweGIyLCAweGIzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweGI0LCAweGI1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGI3LCAweGI5LCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweGJiLCAweGJmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweDAwLCAweGQ3LCAweGY3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGQwLCAweGYwLCAweGRlLCAweGZlLCAvKiAweDcwLTB4NzcgKi8KKwkweGFmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCTB4YTgsIDB4YjgsIDB4YWEsIDB4YmEsIDB4YmQsIDB4YmUsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTgtMHhhZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YjAtMHhiNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YjgtMHhiZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YzAtMHhjNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YzgtMHhjZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZDAtMHhkNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZDgtMHhkZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZTAtMHhlNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZTgtMHhlZiAqLworCTB4MDAsIDB4MDAsIDB4YWMsIDB4YmMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZjAtMHhmNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnBhZ2VfdW5pMmNoYXJzZXRbMjU2XSA9IHsKKwlwYWdlMDAsCXBhZ2UwMSwgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwKKworCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCisJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwJcGFnZTFlLAlOVUxMLAorCisJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwKKwlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJsb3dlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NDAtMHg0NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NTAtMHg1NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMiwgMHhhMiwgMHhhMywgMHhhYiwgMHhhYiwgMHhhYiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhiOCwgMHhhOSwgMHhiYSwgMHhhYiwgMHhiYywgMHhhZCwgMHhhZSwgMHhmZiwgLyogMHhhOC0weGFmICovCisJMHhiMSwgMHhiMSwgMHhiMywgMHhiMywgMHhiNSwgMHhiNSwgMHhiNiwgMHhiOSwgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiZiwgMHhiYywgMHhiZSwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhjMC0weGM3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhjOC0weGNmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhkMC0weGQ3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0MnVwcGVyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg2MC0weDY3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg2OC0weDZmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg3MC0weDc3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweGExLCAweGExLCAweGEzLCAweGE2LCAweGE2LCAweGE2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE5LCAweGFhLCAweGE2LCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIwLCAweGIyLCAweGIyLCAweGI0LCAweGI0LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGE4LCAweGI3LCAweGFhLCAweGJiLCAweGFjLCAweGJkLCAweGJkLCAweGJiLCAvKiAweGI4LTB4YmYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGFmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyBpbnQgdW5pMmNoYXIod2NoYXJfdCB1bmksIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50IGJvdW5kbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnVuaTJjaGFyc2V0OworCXVuc2lnbmVkIGNoYXIgY2wgPSB1bmkgJiAweDAwZmY7CisJdW5zaWduZWQgY2hhciBjaCA9ICh1bmkgJiAweGZmMDApID4+IDg7CisKKwlpZiAoYm91bmRsZW4gPD0gMCkKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwl1bmkyY2hhcnNldCA9IHBhZ2VfdW5pMmNoYXJzZXRbY2hdOworCWlmICh1bmkyY2hhcnNldCAmJiB1bmkyY2hhcnNldFtjbF0pCisJCW91dFswXSA9IHVuaTJjaGFyc2V0W2NsXTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNoYXIydW5pKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJhd3N0cmluZywgaW50IGJvdW5kbGVuLCB3Y2hhcl90ICp1bmkpCit7CisJKnVuaSA9IGNoYXJzZXQydW5pWypyYXdzdHJpbmddOworCWlmICgqdW5pID09IDB4MDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmxzX3RhYmxlIHRhYmxlID0geworCS5jaGFyc2V0CT0gImlzbzg4NTktMTQiLAorCS51bmkyY2hhcgk9IHVuaTJjaGFyLAorCS5jaGFyMnVuaQk9IGNoYXIydW5pLAorCS5jaGFyc2V0Mmxvd2VyCT0gY2hhcnNldDJsb3dlciwKKwkuY2hhcnNldDJ1cHBlcgk9IGNoYXJzZXQydXBwZXIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9ubHNfaXNvODg1OV8xNCh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmxzX2lzbzg4NTlfMTQodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25scygmdGFibGUpOworfQorCittb2R1bGVfaW5pdChpbml0X25sc19pc284ODU5XzE0KQorbW9kdWxlX2V4aXQoZXhpdF9ubHNfaXNvODg1OV8xNCkKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvbmxzL25sc19pc284ODU5LTE1LmMgYi9mcy9ubHMvbmxzX2lzbzg4NTktMTUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGI5MjRiCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmxzL25sc19pc284ODU5LTE1LmMKQEAgLTAsMCArMSwzMDggQEAKKy8qCisgKiBsaW51eC9mcy9ubHNfaXNvODg1OS0xNS5jCisgKgorICogQ2hhcnNldCBpc284ODU5LTE1IHRyYW5zbGF0aW9uIHRhYmxlcy4KKyAqIFRoZSBVbmljb2RlIHRvIGNoYXJzZXQgdGFibGUgaGFzIG9ubHkgZXhhY3QgbWFwcGluZ3MuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKK3N0YXRpYyB3Y2hhcl90IGNoYXJzZXQydW5pWzI1Nl0gPSB7CisJLyogMHgwMCovCisJMHgwMDAwLCAweDAwMDEsIDB4MDAwMiwgMHgwMDAzLAorCTB4MDAwNCwgMHgwMDA1LCAweDAwMDYsIDB4MDAwNywKKwkweDAwMDgsIDB4MDAwOSwgMHgwMDBhLCAweDAwMGIsCisJMHgwMDBjLCAweDAwMGQsIDB4MDAwZSwgMHgwMDBmLAorCS8qIDB4MTAqLworCTB4MDAxMCwgMHgwMDExLCAweDAwMTIsIDB4MDAxMywKKwkweDAwMTQsIDB4MDAxNSwgMHgwMDE2LCAweDAwMTcsCisJMHgwMDE4LCAweDAwMTksIDB4MDAxYSwgMHgwMDFiLAorCTB4MDAxYywgMHgwMDFkLCAweDAwMWUsIDB4MDAxZiwKKwkvKiAweDIwKi8KKwkweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsCisJMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LAorCTB4MDAyOCwgMHgwMDI5LCAweDAwMmEsIDB4MDAyYiwKKwkweDAwMmMsIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsCisJLyogMHgzMCovCisJMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLAorCTB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKwkweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsCisJMHgwMDNjLCAweDAwM2QsIDB4MDAzZSwgMHgwMDNmLAorCS8qIDB4NDAqLworCTB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywKKwkweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCisJMHgwMDQ4LCAweDAwNDksIDB4MDA0YSwgMHgwMDRiLAorCTB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKKwkvKiAweDUwKi8KKwkweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsCisJMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LAorCTB4MDA1OCwgMHgwMDU5LCAweDAwNWEsIDB4MDA1YiwKKwkweDAwNWMsIDB4MDA1ZCwgMHgwMDVlLCAweDAwNWYsCisJLyogMHg2MCovCisJMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLAorCTB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywKKwkweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsCisJMHgwMDZjLCAweDAwNmQsIDB4MDA2ZSwgMHgwMDZmLAorCS8qIDB4NzAqLworCTB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywKKwkweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCisJMHgwMDc4LCAweDAwNzksIDB4MDA3YSwgMHgwMDdiLAorCTB4MDA3YywgMHgwMDdkLCAweDAwN2UsIDB4MDA3ZiwKKwkvKiAweDgwKi8KKwkweDAwODAsIDB4MDA4MSwgMHgwMDgyLCAweDAwODMsCisJMHgwMDg0LCAweDAwODUsIDB4MDA4NiwgMHgwMDg3LAorCTB4MDA4OCwgMHgwMDg5LCAweDAwOGEsIDB4MDA4YiwKKwkweDAwOGMsIDB4MDA4ZCwgMHgwMDhlLCAweDAwOGYsCisJLyogMHg5MCovCisJMHgwMDkwLCAweDAwOTEsIDB4MDA5MiwgMHgwMDkzLAorCTB4MDA5NCwgMHgwMDk1LCAweDAwOTYsIDB4MDA5NywKKwkweDAwOTgsIDB4MDA5OSwgMHgwMDlhLCAweDAwOWIsCisJMHgwMDljLCAweDAwOWQsIDB4MDA5ZSwgMHgwMDlmLAorCS8qIDB4YTAqLworCTB4MDBhMCwgMHgwMGExLCAweDAwYTIsIDB4MDBhMywKKwkweDIwYWMsIDB4MDBhNSwgMHgwMTYwLCAweDAwYTcsCisJMHgwMTYxLCAweDAwYTksIDB4MDBhYSwgMHgwMGFiLAorCTB4MDBhYywgMHgwMGFkLCAweDAwYWUsIDB4MDBhZiwKKwkvKiAweGIwKi8KKwkweDAwYjAsIDB4MDBiMSwgMHgwMGIyLCAweDAwYjMsCisJMHgwMTdkLCAweDAwYjUsIDB4MDBiNiwgMHgwMGI3LAorCTB4MDE3ZSwgMHgwMGI5LCAweDAwYmEsIDB4MDBiYiwKKwkweDAxNTIsIDB4MDE1MywgMHgwMTc4LCAweDAwYmYsCisJLyogMHhjMCovCisJMHgwMGMwLCAweDAwYzEsIDB4MDBjMiwgMHgwMGMzLAorCTB4MDBjNCwgMHgwMGM1LCAweDAwYzYsIDB4MDBjNywKKwkweDAwYzgsIDB4MDBjOSwgMHgwMGNhLCAweDAwY2IsCisJMHgwMGNjLCAweDAwY2QsIDB4MDBjZSwgMHgwMGNmLAorCS8qIDB4ZDAqLworCTB4MDBkMCwgMHgwMGQxLCAweDAwZDIsIDB4MDBkMywKKwkweDAwZDQsIDB4MDBkNSwgMHgwMGQ2LCAweDAwZDcsCisJMHgwMGQ4LCAweDAwZDksIDB4MDBkYSwgMHgwMGRiLAorCTB4MDBkYywgMHgwMGRkLCAweDAwZGUsIDB4MDBkZiwKKwkvKiAweGUwKi8KKwkweDAwZTAsIDB4MDBlMSwgMHgwMGUyLCAweDAwZTMsCisJMHgwMGU0LCAweDAwZTUsIDB4MDBlNiwgMHgwMGU3LAorCTB4MDBlOCwgMHgwMGU5LCAweDAwZWEsIDB4MDBlYiwKKwkweDAwZWMsIDB4MDBlZCwgMHgwMGVlLCAweDAwZWYsCisJLyogMHhmMCovCisJMHgwMGYwLCAweDAwZjEsIDB4MDBmMiwgMHgwMGYzLAorCTB4MDBmNCwgMHgwMGY1LCAweDAwZjYsIDB4MDBmNywKKwkweDAwZjgsIDB4MDBmOSwgMHgwMGZhLCAweDAwZmIsCisJMHgwMGZjLCAweDAwZmQsIDB4MDBmZSwgMHgwMGZmLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAwWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweGExLCAweGEyLCAweGEzLCAweDAwLCAweGE1LCAweDAwLCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweDAwLCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweDAwLCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweDAwLCAweGI5LCAweGJhLCAweGJiLCAweDAwLCAweDAwLCAweDAwLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMVsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4YmMsIDB4YmQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4YTYsIDB4YTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4YmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YjQsIDB4YjgsIDB4MDAsIC8qIDB4NzgtMHg3ZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTIwWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGE0LCAweDAwLCAweDAwLCAweDAwLCAvKiAweGE4LTB4YWYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwYWdlX3VuaTJjaGFyc2V0WzI1Nl0gPSB7CisJcGFnZTAwLCBwYWdlMDEsCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCisKKwlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAlOVUxMLAorCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCisKKwlwYWdlMjAsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCU5VTEwsCisJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwJTlVMTCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQybG93ZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDQwLTB4NDcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDUwLTB4NTcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTgsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjgsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmQsIDB4YmQsIDB4ZmYsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4YzAtMHhjNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4YzgtMHhjZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJ1cHBlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NjAtMHg2NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NzAtMHg3NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhNiwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHgwMCwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiNCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiYywgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhlMC0weGU3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhlOC0weGVmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhiZSwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgaW50IHVuaTJjaGFyKHdjaGFyX3QgdW5pLCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCBib3VuZGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICp1bmkyY2hhcnNldDsKKwl1bnNpZ25lZCBjaGFyIGNsID0gdW5pICYgMHgwMGZmOworCXVuc2lnbmVkIGNoYXIgY2ggPSAodW5pICYgMHhmZjAwKSA+PiA4OworCisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJdW5pMmNoYXJzZXQgPSBwYWdlX3VuaTJjaGFyc2V0W2NoXTsKKwlpZiAodW5pMmNoYXJzZXQgJiYgdW5pMmNoYXJzZXRbY2xdKQorCQlvdXRbMF0gPSB1bmkyY2hhcnNldFtjbF07CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGFyMnVuaShjb25zdCB1bnNpZ25lZCBjaGFyICpyYXdzdHJpbmcsIGludCBib3VuZGxlbiwgd2NoYXJfdCAqdW5pKQoreworCSp1bmkgPSBjaGFyc2V0MnVuaVsqcmF3c3RyaW5nXTsKKwlpZiAoKnVuaSA9PSAweDAwMDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSB0YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJpc284ODU5LTE1IiwKKwkudW5pMmNoYXIJPSB1bmkyY2hhciwKKwkuY2hhcjJ1bmkJPSBjaGFyMnVuaSwKKwkuY2hhcnNldDJsb3dlcgk9IGNoYXJzZXQybG93ZXIsCisJLmNoYXJzZXQydXBwZXIJPSBjaGFyc2V0MnVwcGVyLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmxzX2lzbzg4NTlfMTUodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X25sc19pc284ODU5XzE1KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ubHNfaXNvODg1OV8xNSkKK21vZHVsZV9leGl0KGV4aXRfbmxzX2lzbzg4NTlfMTUpCisKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL25scy9ubHNfaXNvODg1OS0yLmMgYi9mcy9ubHMvbmxzX2lzbzg4NTktMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MjUyOGEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ubHMvbmxzX2lzbzg4NTktMi5jCkBAIC0wLDAgKzEsMzA5IEBACisvKgorICogbGludXgvZnMvbmxzX2lzbzg4NTktMi5jCisgKgorICogQ2hhcnNldCBpc284ODU5LTIgdHJhbnNsYXRpb24gdGFibGVzLgorICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgVW5pY29kZSBhbmQgY2hhcnNldAorICogdGFibGVzIGZyb20gdGhlIFVuaWNvZGUgT3JnYW5pemF0aW9uICh3d3cudW5pY29kZS5vcmcpLgorICogVGhlIFVuaWNvZGUgdG8gY2hhcnNldCB0YWJsZSBoYXMgb25seSBleGFjdCBtYXBwaW5ncy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworc3RhdGljIHdjaGFyX3QgY2hhcnNldDJ1bmlbMjU2XSA9IHsKKwkvKiAweDAwKi8KKwkweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsCisJMHgwMDA0LCAweDAwMDUsIDB4MDAwNiwgMHgwMDA3LAorCTB4MDAwOCwgMHgwMDA5LCAweDAwMGEsIDB4MDAwYiwKKwkweDAwMGMsIDB4MDAwZCwgMHgwMDBlLCAweDAwMGYsCisJLyogMHgxMCovCisJMHgwMDEwLCAweDAwMTEsIDB4MDAxMiwgMHgwMDEzLAorCTB4MDAxNCwgMHgwMDE1LCAweDAwMTYsIDB4MDAxNywKKwkweDAwMTgsIDB4MDAxOSwgMHgwMDFhLCAweDAwMWIsCisJMHgwMDFjLCAweDAwMWQsIDB4MDAxZSwgMHgwMDFmLAorCS8qIDB4MjAqLworCTB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywKKwkweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisJMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLAorCTB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKwkvKiAweDMwKi8KKwkweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsCisJMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAorCTB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwKKwkweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsCisJLyogMHg0MCovCisJMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLAorCTB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKwkweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsCisJMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLAorCS8qIDB4NTAqLworCTB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywKKwkweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisJMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMDViLAorCTB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwKKwkvKiAweDYwKi8KKwkweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsCisJMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LAorCTB4MDA2OCwgMHgwMDY5LCAweDAwNmEsIDB4MDA2YiwKKwkweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsCisJLyogMHg3MCovCisJMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLAorCTB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKwkweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsCisJMHgwMDdjLCAweDAwN2QsIDB4MDA3ZSwgMHgwMDdmLAorCS8qIDB4ODAqLworCTB4MDA4MCwgMHgwMDgxLCAweDAwODIsIDB4MDA4MywKKwkweDAwODQsIDB4MDA4NSwgMHgwMDg2LCAweDAwODcsCisJMHgwMDg4LCAweDAwODksIDB4MDA4YSwgMHgwMDhiLAorCTB4MDA4YywgMHgwMDhkLCAweDAwOGUsIDB4MDA4ZiwKKwkvKiAweDkwKi8KKwkweDAwOTAsIDB4MDA5MSwgMHgwMDkyLCAweDAwOTMsCisJMHgwMDk0LCAweDAwOTUsIDB4MDA5NiwgMHgwMDk3LAorCTB4MDA5OCwgMHgwMDk5LCAweDAwOWEsIDB4MDA5YiwKKwkweDAwOWMsIDB4MDA5ZCwgMHgwMDllLCAweDAwOWYsCisJLyogMHhhMCovCisJMHgwMGEwLCAweDAxMDQsIDB4MDJkOCwgMHgwMTQxLAorCTB4MDBhNCwgMHgwMTNkLCAweDAxNWEsIDB4MDBhNywKKwkweDAwYTgsIDB4MDE2MCwgMHgwMTVlLCAweDAxNjQsCisJMHgwMTc5LCAweDAwYWQsIDB4MDE3ZCwgMHgwMTdiLAorCS8qIDB4YjAqLworCTB4MDBiMCwgMHgwMTA1LCAweDAyZGIsIDB4MDE0MiwKKwkweDAwYjQsIDB4MDEzZSwgMHgwMTViLCAweDAyYzcsCisJMHgwMGI4LCAweDAxNjEsIDB4MDE1ZiwgMHgwMTY1LAorCTB4MDE3YSwgMHgwMmRkLCAweDAxN2UsIDB4MDE3YywKKwkvKiAweGMwKi8KKwkweDAxNTQsIDB4MDBjMSwgMHgwMGMyLCAweDAxMDIsCisJMHgwMGM0LCAweDAxMzksIDB4MDEwNiwgMHgwMGM3LAorCTB4MDEwYywgMHgwMGM5LCAweDAxMTgsIDB4MDBjYiwKKwkweDAxMWEsIDB4MDBjZCwgMHgwMGNlLCAweDAxMGUsCisJLyogMHhkMCovCisJMHgwMTEwLCAweDAxNDMsIDB4MDE0NywgMHgwMGQzLAorCTB4MDBkNCwgMHgwMTUwLCAweDAwZDYsIDB4MDBkNywKKwkweDAxNTgsIDB4MDE2ZSwgMHgwMGRhLCAweDAxNzAsCisJMHgwMGRjLCAweDAwZGQsIDB4MDE2MiwgMHgwMGRmLAorCS8qIDB4ZTAqLworCTB4MDE1NSwgMHgwMGUxLCAweDAwZTIsIDB4MDEwMywKKwkweDAwZTQsIDB4MDEzYSwgMHgwMTA3LCAweDAwZTcsCisJMHgwMTBkLCAweDAwZTksIDB4MDExOSwgMHgwMGViLAorCTB4MDExYiwgMHgwMGVkLCAweDAwZWUsIDB4MDEwZiwKKwkvKiAweGYwKi8KKwkweDAxMTEsIDB4MDE0NCwgMHgwMTQ4LCAweDAwZjMsCisJMHgwMGY0LCAweDAxNTEsIDB4MDBmNiwgMHgwMGY3LAorCTB4MDE1OSwgMHgwMTZmLCAweDAwZmEsIDB4MDE3MSwKKwkweDAwZmMsIDB4MDBmZCwgMHgwMTYzLCAweDAyZDksCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDBbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YTQsIDB4MDAsIDB4MDAsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YWQsIDB4MDAsIDB4MDAsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YjQsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YjgtMHhiZiAqLworCTB4MDAsIDB4YzEsIDB4YzIsIDB4MDAsIDB4YzQsIDB4MDAsIDB4MDAsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4MDAsIDB4YzksIDB4MDAsIDB4Y2IsIDB4MDAsIDB4Y2QsIDB4Y2UsIDB4MDAsIC8qIDB4YzgtMHhjZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4ZDMsIDB4ZDQsIDB4MDAsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4MDAsIDB4MDAsIDB4ZGEsIDB4MDAsIDB4ZGMsIDB4ZGQsIDB4MDAsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4MDAsIDB4ZTEsIDB4ZTIsIDB4MDAsIDB4ZTQsIDB4MDAsIDB4MDAsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4MDAsIDB4ZTksIDB4MDAsIDB4ZWIsIDB4MDAsIDB4ZWQsIDB4ZWUsIDB4MDAsIC8qIDB4ZTgtMHhlZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4ZjMsIDB4ZjQsIDB4MDAsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4MDAsIDB4MDAsIDB4ZmEsIDB4MDAsIDB4ZmMsIDB4ZmQsIDB4MDAsIDB4MDAsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAxWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHhjMywgMHhlMywgMHhhMSwgMHhiMSwgMHhjNiwgMHhlNiwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjOCwgMHhlOCwgMHhjZiwgMHhlZiwgLyogMHgwOC0weDBmICovCisJMHhkMCwgMHhmMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHhjYSwgMHhlYSwgMHhjYywgMHhlYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHhjNSwgMHhlNSwgMHgwMCwgMHgwMCwgMHhhNSwgMHhiNSwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHhhMywgMHhiMywgMHhkMSwgMHhmMSwgMHgwMCwgMHgwMCwgMHhkMiwgLyogMHg0MC0weDQ3ICovCisJMHhmMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHhkNSwgMHhmNSwgMHgwMCwgMHgwMCwgMHhjMCwgMHhlMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHhkOCwgMHhmOCwgMHhhNiwgMHhiNiwgMHgwMCwgMHgwMCwgMHhhYSwgMHhiYSwgLyogMHg1OC0weDVmICovCisJMHhhOSwgMHhiOSwgMHhkZSwgMHhmZSwgMHhhYiwgMHhiYiwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkOSwgMHhmOSwgLyogMHg2OC0weDZmICovCisJMHhkYiwgMHhmYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHhhYywgMHhiYywgMHhhZiwgMHhiZiwgMHhhZSwgMHhiZSwgMHgwMCwgLyogMHg3OC0weDdmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDJbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTgtMHhhZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YjAtMHhiNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YjgtMHhiZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YjcsIC8qIDB4YzAtMHhjNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YzgtMHhjZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZDAtMHhkNyAqLworCTB4YTIsIDB4ZmYsIDB4MDAsIDB4YjIsIDB4MDAsIDB4YmQsIDB4MDAsIDB4MDAsIC8qIDB4ZDgtMHhkZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnBhZ2VfdW5pMmNoYXJzZXRbMjU2XSA9IHsKKwlwYWdlMDAsIHBhZ2UwMSwgcGFnZTAyLCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0Mmxvd2VyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg0MC0weDQ3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg0OC0weDRmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg1MC0weDU3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweGIxLCAweGEyLCAweGIzLCAweGE0LCAweGI1LCAweGI2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGFkLCAweGJlLCAweGJmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGMwLTB4YzcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQydXBwZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDYwLTB4NjcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDY4LTB4NmYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDcwLTB4NzcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YTEsIDB4YjIsIDB4YTMsIDB4YjQsIDB4YTUsIDB4YTYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YmQsIDB4YWUsIDB4YWYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4ZTAtMHhlNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIGludCB1bmkyY2hhcih3Y2hhcl90IHVuaSwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgYm91bmRsZW4pCit7CisJdW5zaWduZWQgY2hhciAqdW5pMmNoYXJzZXQ7CisJdW5zaWduZWQgY2hhciBjbCA9IHVuaSAmIDB4MDBmZjsKKwl1bnNpZ25lZCBjaGFyIGNoID0gKHVuaSAmIDB4ZmYwMCkgPj4gODsKKworCWlmIChib3VuZGxlbiA8PSAwKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCXVuaTJjaGFyc2V0ID0gcGFnZV91bmkyY2hhcnNldFtjaF07CisJaWYgKHVuaTJjaGFyc2V0ICYmIHVuaTJjaGFyc2V0W2NsXSkKKwkJb3V0WzBdID0gdW5pMmNoYXJzZXRbY2xdOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY2hhcjJ1bmkoY29uc3QgdW5zaWduZWQgY2hhciAqcmF3c3RyaW5nLCBpbnQgYm91bmRsZW4sIHdjaGFyX3QgKnVuaSkKK3sKKwkqdW5pID0gY2hhcnNldDJ1bmlbKnJhd3N0cmluZ107CisJaWYgKCp1bmkgPT0gMHgwMDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBubHNfdGFibGUgdGFibGUgPSB7CisJLmNoYXJzZXQJPSAiaXNvODg1OS0yIiwKKwkudW5pMmNoYXIJPSB1bmkyY2hhciwKKwkuY2hhcjJ1bmkJPSBjaGFyMnVuaSwKKwkuY2hhcnNldDJsb3dlcgk9IGNoYXJzZXQybG93ZXIsCisJLmNoYXJzZXQydXBwZXIJPSBjaGFyc2V0MnVwcGVyLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmxzX2lzbzg4NTlfMih2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmxzX2lzbzg4NTlfMih2b2lkKQoreworCXVucmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbmxzX2lzbzg4NTlfMikKK21vZHVsZV9leGl0KGV4aXRfbmxzX2lzbzg4NTlfMikKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvbmxzL25sc19pc284ODU5LTMuYyBiL2ZzL25scy9ubHNfaXNvODg1OS0zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFiNDVhMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25scy9ubHNfaXNvODg1OS0zLmMKQEAgLTAsMCArMSwzMDkgQEAKKy8qCisgKiBsaW51eC9mcy9ubHNfaXNvODg1OS0zLmMKKyAqCisgKiBDaGFyc2V0IGlzbzg4NTktMyB0cmFuc2xhdGlvbiB0YWJsZXMuCisgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBVbmljb2RlIGFuZCBjaGFyc2V0CisgKiB0YWJsZXMgZnJvbSB0aGUgVW5pY29kZSBPcmdhbml6YXRpb24gKHd3dy51bmljb2RlLm9yZykuCisgKiBUaGUgVW5pY29kZSB0byBjaGFyc2V0IHRhYmxlIGhhcyBvbmx5IGV4YWN0IG1hcHBpbmdzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCitzdGF0aWMgd2NoYXJfdCBjaGFyc2V0MnVuaVsyNTZdID0geworCS8qIDB4MDAqLworCTB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywKKwkweDAwMDQsIDB4MDAwNSwgMHgwMDA2LCAweDAwMDcsCisJMHgwMDA4LCAweDAwMDksIDB4MDAwYSwgMHgwMDBiLAorCTB4MDAwYywgMHgwMDBkLCAweDAwMGUsIDB4MDAwZiwKKwkvKiAweDEwKi8KKwkweDAwMTAsIDB4MDAxMSwgMHgwMDEyLCAweDAwMTMsCisJMHgwMDE0LCAweDAwMTUsIDB4MDAxNiwgMHgwMDE3LAorCTB4MDAxOCwgMHgwMDE5LCAweDAwMWEsIDB4MDAxYiwKKwkweDAwMWMsIDB4MDAxZCwgMHgwMDFlLCAweDAwMWYsCisJLyogMHgyMCovCisJMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLAorCTB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKwkweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsCisJMHgwMDJjLCAweDAwMmQsIDB4MDAyZSwgMHgwMDJmLAorCS8qIDB4MzAqLworCTB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywKKwkweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisJMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLAorCTB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKwkvKiAweDQwKi8KKwkweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsCisJMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAorCTB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwKKwkweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsCisJLyogMHg1MCovCisJMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLAorCTB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKwkweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsCisJMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLAorCS8qIDB4NjAqLworCTB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywKKwkweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisJMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLAorCTB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKKwkvKiAweDcwKi8KKwkweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsCisJMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LAorCTB4MDA3OCwgMHgwMDc5LCAweDAwN2EsIDB4MDA3YiwKKwkweDAwN2MsIDB4MDA3ZCwgMHgwMDdlLCAweDAwN2YsCisJLyogMHg4MCovCisJMHgwMDgwLCAweDAwODEsIDB4MDA4MiwgMHgwMDgzLAorCTB4MDA4NCwgMHgwMDg1LCAweDAwODYsIDB4MDA4NywKKwkweDAwODgsIDB4MDA4OSwgMHgwMDhhLCAweDAwOGIsCisJMHgwMDhjLCAweDAwOGQsIDB4MDA4ZSwgMHgwMDhmLAorCS8qIDB4OTAqLworCTB4MDA5MCwgMHgwMDkxLCAweDAwOTIsIDB4MDA5MywKKwkweDAwOTQsIDB4MDA5NSwgMHgwMDk2LCAweDAwOTcsCisJMHgwMDk4LCAweDAwOTksIDB4MDA5YSwgMHgwMDliLAorCTB4MDA5YywgMHgwMDlkLCAweDAwOWUsIDB4MDA5ZiwKKwkvKiAweGEwKi8KKwkweDAwYTAsIDB4MDEyNiwgMHgwMmQ4LCAweDAwYTMsCisJMHgwMGE0LCAweDAwMDAsIDB4MDEyNCwgMHgwMGE3LAorCTB4MDBhOCwgMHgwMTMwLCAweDAxNWUsIDB4MDExZSwKKwkweDAxMzQsIDB4MDBhZCwgMHgwMDAwLCAweDAxN2IsCisJLyogMHhiMCovCisJMHgwMGIwLCAweDAxMjcsIDB4MDBiMiwgMHgwMGIzLAorCTB4MDBiNCwgMHgwMGI1LCAweDAxMjUsIDB4MDBiNywKKwkweDAwYjgsIDB4MDEzMSwgMHgwMTVmLCAweDAxMWYsCisJMHgwMTM1LCAweDAwYmQsIDB4MDAwMCwgMHgwMTdjLAorCS8qIDB4YzAqLworCTB4MDBjMCwgMHgwMGMxLCAweDAwYzIsIDB4MDAwMCwKKwkweDAwYzQsIDB4MDEwYSwgMHgwMTA4LCAweDAwYzcsCisJMHgwMGM4LCAweDAwYzksIDB4MDBjYSwgMHgwMGNiLAorCTB4MDBjYywgMHgwMGNkLCAweDAwY2UsIDB4MDBjZiwKKwkvKiAweGQwKi8KKwkweDAwMDAsIDB4MDBkMSwgMHgwMGQyLCAweDAwZDMsCisJMHgwMGQ0LCAweDAxMjAsIDB4MDBkNiwgMHgwMGQ3LAorCTB4MDExYywgMHgwMGQ5LCAweDAwZGEsIDB4MDBkYiwKKwkweDAwZGMsIDB4MDE2YywgMHgwMTVjLCAweDAwZGYsCisJLyogMHhlMCovCisJMHgwMGUwLCAweDAwZTEsIDB4MDBlMiwgMHgwMDAwLAorCTB4MDBlNCwgMHgwMTBiLCAweDAxMDksIDB4MDBlNywKKwkweDAwZTgsIDB4MDBlOSwgMHgwMGVhLCAweDAwZWIsCisJMHgwMGVjLCAweDAwZWQsIDB4MDBlZSwgMHgwMGVmLAorCS8qIDB4ZjAqLworCTB4MDAwMCwgMHgwMGYxLCAweDAwZjIsIDB4MDBmMywKKwkweDAwZjQsIDB4MDEyMSwgMHgwMGY2LCAweDAwZjcsCisJMHgwMTFkLCAweDAwZjksIDB4MDBmYSwgMHgwMGZiLAorCTB4MDBmYywgMHgwMTZkLCAweDAxNWQsIDB4MDJkOSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMFsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHgwMCwgMHgwMCwgMHhhMywgMHhhNCwgMHgwMCwgMHgwMCwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhZCwgMHgwMCwgMHgwMCwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHgwMCwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHgwMCwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiZCwgMHgwMCwgMHgwMCwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHgwMCwgMHhjNCwgMHgwMCwgMHgwMCwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHgwMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHgwMCwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHgwMCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHgwMCwgMHgwMCwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHgwMCwgMHhlNCwgMHgwMCwgMHgwMCwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHgwMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHgwMCwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHgwMCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDFbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweGM2LCAweGU2LCAweGM1LCAweGU1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGQ4LCAweGY4LCAweGFiLCAweGJiLCAvKiAweDE4LTB4MWYgKi8KKwkweGQ1LCAweGY1LCAweDAwLCAweDAwLCAweGE2LCAweGI2LCAweGExLCAweGIxLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweGE5LCAweGI5LCAweDAwLCAweDAwLCAweGFjLCAweGJjLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGRlLCAweGZlLCAweGFhLCAweGJhLCAvKiAweDU4LTB4NWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGRkLCAweGZkLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweGFmLCAweGJmLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMlsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhMC0weGE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhOC0weGFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhiMC0weGI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhiOC0weGJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhjMC0weGM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhjOC0weGNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhkMC0weGQ3ICovCisJMHhhMiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhkOC0weGRmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciAqcGFnZV91bmkyY2hhcnNldFsyNTZdID0geworCXBhZ2UwMCwgcGFnZTAxLCBwYWdlMDIsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQybG93ZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDQwLTB4NDcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDUwLTB4NTcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YjEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4MDAsIDB4YjYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4NjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YWQsIDB4MDAsIDB4YmYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4MDAsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4MDAsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4YzAtMHhjNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4YzgtMHhjZiAqLworCTB4MDAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4MDAsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4MDAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJ1cHBlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NjAtMHg2NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NzAtMHg3NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHgwMCwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHgwMCwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhhMSwgMHhiMiwgMHhiMywgMHhiNCwgMHgwMCwgMHhhNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHg0OSwgMHhhYSwgMHhhYiwgMHhhYywgMHhiZCwgMHgwMCwgMHhhZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHgwMCwgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHgwMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHgwMCwgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhlMC0weGU3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhlOC0weGVmICovCisJMHgwMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgaW50IHVuaTJjaGFyKHdjaGFyX3QgdW5pLCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCBib3VuZGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICp1bmkyY2hhcnNldDsKKwl1bnNpZ25lZCBjaGFyIGNsID0gdW5pICYgMHgwMGZmOworCXVuc2lnbmVkIGNoYXIgY2ggPSAodW5pICYgMHhmZjAwKSA+PiA4OworCisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJdW5pMmNoYXJzZXQgPSBwYWdlX3VuaTJjaGFyc2V0W2NoXTsKKwlpZiAodW5pMmNoYXJzZXQgJiYgdW5pMmNoYXJzZXRbY2xdKQorCQlvdXRbMF0gPSB1bmkyY2hhcnNldFtjbF07CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGFyMnVuaShjb25zdCB1bnNpZ25lZCBjaGFyICpyYXdzdHJpbmcsIGludCBib3VuZGxlbiwgd2NoYXJfdCAqdW5pKQoreworCSp1bmkgPSBjaGFyc2V0MnVuaVsqcmF3c3RyaW5nXTsKKwlpZiAoKnVuaSA9PSAweDAwMDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSB0YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJpc284ODU5LTMiLAorCS51bmkyY2hhcgk9IHVuaTJjaGFyLAorCS5jaGFyMnVuaQk9IGNoYXIydW5pLAorCS5jaGFyc2V0Mmxvd2VyCT0gY2hhcnNldDJsb3dlciwKKwkuY2hhcnNldDJ1cHBlcgk9IGNoYXJzZXQydXBwZXIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9ubHNfaXNvODg1OV8zKHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX25scygmdGFibGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9ubHNfaXNvODg1OV8zKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ubHNfaXNvODg1OV8zKQorbW9kdWxlX2V4aXQoZXhpdF9ubHNfaXNvODg1OV8zKQorCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CmRpZmYgLS1naXQgYS9mcy9ubHMvbmxzX2lzbzg4NTktNC5jIGIvZnMvbmxzL25sc19pc284ODU5LTQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDFiODdmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmxzL25sc19pc284ODU5LTQuYwpAQCAtMCwwICsxLDMwOSBAQAorLyoKKyAqIGxpbnV4L2ZzL25sc19pc284ODU5LTQuYworICoKKyAqIENoYXJzZXQgaXNvODg1OS00IHRyYW5zbGF0aW9uIHRhYmxlcy4KKyAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIFVuaWNvZGUgYW5kIGNoYXJzZXQKKyAqIHRhYmxlcyBmcm9tIHRoZSBVbmljb2RlIE9yZ2FuaXphdGlvbiAod3d3LnVuaWNvZGUub3JnKS4KKyAqIFRoZSBVbmljb2RlIHRvIGNoYXJzZXQgdGFibGUgaGFzIG9ubHkgZXhhY3QgbWFwcGluZ3MuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKK3N0YXRpYyB3Y2hhcl90IGNoYXJzZXQydW5pWzI1Nl0gPSB7CisJLyogMHgwMCovCisJMHgwMDAwLCAweDAwMDEsIDB4MDAwMiwgMHgwMDAzLAorCTB4MDAwNCwgMHgwMDA1LCAweDAwMDYsIDB4MDAwNywKKwkweDAwMDgsIDB4MDAwOSwgMHgwMDBhLCAweDAwMGIsCisJMHgwMDBjLCAweDAwMGQsIDB4MDAwZSwgMHgwMDBmLAorCS8qIDB4MTAqLworCTB4MDAxMCwgMHgwMDExLCAweDAwMTIsIDB4MDAxMywKKwkweDAwMTQsIDB4MDAxNSwgMHgwMDE2LCAweDAwMTcsCisJMHgwMDE4LCAweDAwMTksIDB4MDAxYSwgMHgwMDFiLAorCTB4MDAxYywgMHgwMDFkLCAweDAwMWUsIDB4MDAxZiwKKwkvKiAweDIwKi8KKwkweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsCisJMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LAorCTB4MDAyOCwgMHgwMDI5LCAweDAwMmEsIDB4MDAyYiwKKwkweDAwMmMsIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsCisJLyogMHgzMCovCisJMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLAorCTB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKwkweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsCisJMHgwMDNjLCAweDAwM2QsIDB4MDAzZSwgMHgwMDNmLAorCS8qIDB4NDAqLworCTB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywKKwkweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCisJMHgwMDQ4LCAweDAwNDksIDB4MDA0YSwgMHgwMDRiLAorCTB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKKwkvKiAweDUwKi8KKwkweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsCisJMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LAorCTB4MDA1OCwgMHgwMDU5LCAweDAwNWEsIDB4MDA1YiwKKwkweDAwNWMsIDB4MDA1ZCwgMHgwMDVlLCAweDAwNWYsCisJLyogMHg2MCovCisJMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLAorCTB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywKKwkweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsCisJMHgwMDZjLCAweDAwNmQsIDB4MDA2ZSwgMHgwMDZmLAorCS8qIDB4NzAqLworCTB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywKKwkweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCisJMHgwMDc4LCAweDAwNzksIDB4MDA3YSwgMHgwMDdiLAorCTB4MDA3YywgMHgwMDdkLCAweDAwN2UsIDB4MDA3ZiwKKwkvKiAweDgwKi8KKwkweDAwODAsIDB4MDA4MSwgMHgwMDgyLCAweDAwODMsCisJMHgwMDg0LCAweDAwODUsIDB4MDA4NiwgMHgwMDg3LAorCTB4MDA4OCwgMHgwMDg5LCAweDAwOGEsIDB4MDA4YiwKKwkweDAwOGMsIDB4MDA4ZCwgMHgwMDhlLCAweDAwOGYsCisJLyogMHg5MCovCisJMHgwMDkwLCAweDAwOTEsIDB4MDA5MiwgMHgwMDkzLAorCTB4MDA5NCwgMHgwMDk1LCAweDAwOTYsIDB4MDA5NywKKwkweDAwOTgsIDB4MDA5OSwgMHgwMDlhLCAweDAwOWIsCisJMHgwMDljLCAweDAwOWQsIDB4MDA5ZSwgMHgwMDlmLAorCS8qIDB4YTAqLworCTB4MDBhMCwgMHgwMTA0LCAweDAxMzgsIDB4MDE1NiwKKwkweDAwYTQsIDB4MDEyOCwgMHgwMTNiLCAweDAwYTcsCisJMHgwMGE4LCAweDAxNjAsIDB4MDExMiwgMHgwMTIyLAorCTB4MDE2NiwgMHgwMGFkLCAweDAxN2QsIDB4MDBhZiwKKwkvKiAweGIwKi8KKwkweDAwYjAsIDB4MDEwNSwgMHgwMmRiLCAweDAxNTcsCisJMHgwMGI0LCAweDAxMjksIDB4MDEzYywgMHgwMmM3LAorCTB4MDBiOCwgMHgwMTYxLCAweDAxMTMsIDB4MDEyMywKKwkweDAxNjcsIDB4MDE0YSwgMHgwMTdlLCAweDAxNGIsCisJLyogMHhjMCovCisJMHgwMTAwLCAweDAwYzEsIDB4MDBjMiwgMHgwMGMzLAorCTB4MDBjNCwgMHgwMGM1LCAweDAwYzYsIDB4MDEyZSwKKwkweDAxMGMsIDB4MDBjOSwgMHgwMTE4LCAweDAwY2IsCisJMHgwMTE2LCAweDAwY2QsIDB4MDBjZSwgMHgwMTJhLAorCS8qIDB4ZDAqLworCTB4MDExMCwgMHgwMTQ1LCAweDAxNGMsIDB4MDEzNiwKKwkweDAwZDQsIDB4MDBkNSwgMHgwMGQ2LCAweDAwZDcsCisJMHgwMGQ4LCAweDAxNzIsIDB4MDBkYSwgMHgwMGRiLAorCTB4MDBkYywgMHgwMTY4LCAweDAxNmEsIDB4MDBkZiwKKwkvKiAweGUwKi8KKwkweDAxMDEsIDB4MDBlMSwgMHgwMGUyLCAweDAwZTMsCisJMHgwMGU0LCAweDAwZTUsIDB4MDBlNiwgMHgwMTJmLAorCTB4MDEwZCwgMHgwMGU5LCAweDAxMTksIDB4MDBlYiwKKwkweDAxMTcsIDB4MDBlZCwgMHgwMGVlLCAweDAxMmIsCisJLyogMHhmMCovCisJMHgwMTExLCAweDAxNDYsIDB4MDE0ZCwgMHgwMTM3LAorCTB4MDBmNCwgMHgwMGY1LCAweDAwZjYsIDB4MDBmNywKKwkweDAwZjgsIDB4MDE3MywgMHgwMGZhLCAweDAwZmIsCisJMHgwMGZjLCAweDAxNjksIDB4MDE2YiwgMHgwMmQ5LAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAwWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweDAwLCAweDAwLCAweDAwLCAweGE0LCAweDAwLCAweDAwLCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGFkLCAweDAwLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweDAwLCAweDAwLCAweDAwLCAweGI0LCAweDAwLCAweDAwLCAweDAwLCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGI4LTB4YmYgKi8KKwkweDAwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweDAwLCAvKiAweGMwLTB4YzcgKi8KKwkweDAwLCAweGM5LCAweDAwLCAweGNiLCAweDAwLCAweGNkLCAweGNlLCAweDAwLCAvKiAweGM4LTB4Y2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweDAwLCAweGRhLCAweGRiLCAweGRjLCAweDAwLCAweDAwLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweDAwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweDAwLCAvKiAweGUwLTB4ZTcgKi8KKwkweDAwLCAweGU5LCAweDAwLCAweGViLCAweDAwLCAweGVkLCAweGVlLCAweDAwLCAvKiAweGU4LTB4ZWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGY4LCAweDAwLCAweGZhLCAweGZiLCAweGZjLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMVsyNTZdID0geworCTB4YzAsIDB4ZTAsIDB4MDAsIDB4MDAsIDB4YTEsIDB4YjEsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzgsIDB4ZTgsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4ZDAsIDB4ZjAsIDB4YWEsIDB4YmEsIDB4MDAsIDB4MDAsIDB4Y2MsIDB4ZWMsIC8qIDB4MTAtMHgxNyAqLworCTB4Y2EsIDB4ZWEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4YWIsIDB4YmIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4YTUsIDB4YjUsIDB4Y2YsIDB4ZWYsIDB4MDAsIDB4MDAsIDB4YzcsIDB4ZTcsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZDMsIDB4ZjMsIC8qIDB4MzAtMHgzNyAqLworCTB4YTIsIDB4MDAsIDB4MDAsIDB4YTYsIDB4YjYsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZDEsIDB4ZjEsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4YmQsIDB4YmYsIDB4ZDIsIDB4ZjIsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YTMsIDB4YjMsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4YTksIDB4YjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YWMsIDB4YmMsIC8qIDB4NjAtMHg2NyAqLworCTB4ZGQsIDB4ZmQsIDB4ZGUsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4ZDksIDB4ZjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YWUsIDB4YmUsIDB4MDAsIC8qIDB4NzgtMHg3ZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGE4LTB4YWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGIwLTB4YjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGI4LTB4YmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGI3LCAvKiAweGMwLTB4YzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGM4LTB4Y2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGQwLTB4ZDcgKi8KKwkweDAwLCAweGZmLCAweDAwLCAweGIyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGQ4LTB4ZGYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwYWdlX3VuaTJjaGFyc2V0WzI1Nl0gPSB7CisJcGFnZTAwLCBwYWdlMDEsIHBhZ2UwMiwgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJsb3dlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NDAtMHg0NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NTAtMHg1NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhiMSwgMHhhMiwgMHhiMywgMHhhNCwgMHhiNSwgMHhiNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhhZCwgMHhiZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZiwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhjMC0weGM3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhjOC0weGNmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0MnVwcGVyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg2MC0weDY3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg2OC0weDZmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg3MC0weDc3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweGExLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGExLCAweGIyLCAweGEzLCAweGI0LCAweGE1LCAweGE2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGJkLCAweGFlLCAweGJkLCAvKiAweGI4LTB4YmYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGY3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGZmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyBpbnQgdW5pMmNoYXIod2NoYXJfdCB1bmksIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50IGJvdW5kbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnVuaTJjaGFyc2V0OworCXVuc2lnbmVkIGNoYXIgY2wgPSB1bmkgJiAweDAwZmY7CisJdW5zaWduZWQgY2hhciBjaCA9ICh1bmkgJiAweGZmMDApID4+IDg7CisKKwlpZiAoYm91bmRsZW4gPD0gMCkKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwl1bmkyY2hhcnNldCA9IHBhZ2VfdW5pMmNoYXJzZXRbY2hdOworCWlmICh1bmkyY2hhcnNldCAmJiB1bmkyY2hhcnNldFtjbF0pCisJCW91dFswXSA9IHVuaTJjaGFyc2V0W2NsXTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNoYXIydW5pKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJhd3N0cmluZywgaW50IGJvdW5kbGVuLCB3Y2hhcl90ICp1bmkpCit7CisJKnVuaSA9IGNoYXJzZXQydW5pWypyYXdzdHJpbmddOworCWlmICgqdW5pID09IDB4MDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmxzX3RhYmxlIHRhYmxlID0geworCS5jaGFyc2V0CT0gImlzbzg4NTktNCIsCisJLnVuaTJjaGFyCT0gdW5pMmNoYXIsCisJLmNoYXIydW5pCT0gY2hhcjJ1bmksCisJLmNoYXJzZXQybG93ZXIJPSBjaGFyc2V0Mmxvd2VyLAorCS5jaGFyc2V0MnVwcGVyCT0gY2hhcnNldDJ1cHBlciwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X25sc19pc284ODU5XzQodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X25sc19pc284ODU5XzQodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25scygmdGFibGUpOworfQorCittb2R1bGVfaW5pdChpbml0X25sc19pc284ODU5XzQpCittb2R1bGVfZXhpdChleGl0X25sc19pc284ODU5XzQpCisKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL25scy9ubHNfaXNvODg1OS01LmMgYi9mcy9ubHMvbmxzX2lzbzg4NTktNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYjAwODQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ubHMvbmxzX2lzbzg4NTktNS5jCkBAIC0wLDAgKzEsMjczIEBACisvKgorICogbGludXgvZnMvbmxzX2lzbzg4NTktNS5jCisgKgorICogQ2hhcnNldCBpc284ODU5LTUgdHJhbnNsYXRpb24gdGFibGVzLgorICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgVW5pY29kZSBhbmQgY2hhcnNldAorICogdGFibGVzIGZyb20gdGhlIFVuaWNvZGUgT3JnYW5pemF0aW9uICh3d3cudW5pY29kZS5vcmcpLgorICogVGhlIFVuaWNvZGUgdG8gY2hhcnNldCB0YWJsZSBoYXMgb25seSBleGFjdCBtYXBwaW5ncy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworc3RhdGljIHdjaGFyX3QgY2hhcnNldDJ1bmlbMjU2XSA9IHsKKwkvKiAweDAwKi8KKwkweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsCisJMHgwMDA0LCAweDAwMDUsIDB4MDAwNiwgMHgwMDA3LAorCTB4MDAwOCwgMHgwMDA5LCAweDAwMGEsIDB4MDAwYiwKKwkweDAwMGMsIDB4MDAwZCwgMHgwMDBlLCAweDAwMGYsCisJLyogMHgxMCovCisJMHgwMDEwLCAweDAwMTEsIDB4MDAxMiwgMHgwMDEzLAorCTB4MDAxNCwgMHgwMDE1LCAweDAwMTYsIDB4MDAxNywKKwkweDAwMTgsIDB4MDAxOSwgMHgwMDFhLCAweDAwMWIsCisJMHgwMDFjLCAweDAwMWQsIDB4MDAxZSwgMHgwMDFmLAorCS8qIDB4MjAqLworCTB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywKKwkweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisJMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLAorCTB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKwkvKiAweDMwKi8KKwkweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsCisJMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAorCTB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwKKwkweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsCisJLyogMHg0MCovCisJMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLAorCTB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKwkweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsCisJMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLAorCS8qIDB4NTAqLworCTB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywKKwkweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisJMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMDViLAorCTB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwKKwkvKiAweDYwKi8KKwkweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsCisJMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LAorCTB4MDA2OCwgMHgwMDY5LCAweDAwNmEsIDB4MDA2YiwKKwkweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsCisJLyogMHg3MCovCisJMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLAorCTB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKwkweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsCisJMHgwMDdjLCAweDAwN2QsIDB4MDA3ZSwgMHgwMDdmLAorCS8qIDB4ODAqLworCTB4MDA4MCwgMHgwMDgxLCAweDAwODIsIDB4MDA4MywKKwkweDAwODQsIDB4MDA4NSwgMHgwMDg2LCAweDAwODcsCisJMHgwMDg4LCAweDAwODksIDB4MDA4YSwgMHgwMDhiLAorCTB4MDA4YywgMHgwMDhkLCAweDAwOGUsIDB4MDA4ZiwKKwkvKiAweDkwKi8KKwkweDAwOTAsIDB4MDA5MSwgMHgwMDkyLCAweDAwOTMsCisJMHgwMDk0LCAweDAwOTUsIDB4MDA5NiwgMHgwMDk3LAorCTB4MDA5OCwgMHgwMDk5LCAweDAwOWEsIDB4MDA5YiwKKwkweDAwOWMsIDB4MDA5ZCwgMHgwMDllLCAweDAwOWYsCisJLyogMHhhMCovCisJMHgwMGEwLCAweDA0MDEsIDB4MDQwMiwgMHgwNDAzLAorCTB4MDQwNCwgMHgwNDA1LCAweDA0MDYsIDB4MDQwNywKKwkweDA0MDgsIDB4MDQwOSwgMHgwNDBhLCAweDA0MGIsCisJMHgwNDBjLCAweDAwYWQsIDB4MDQwZSwgMHgwNDBmLAorCS8qIDB4YjAqLworCTB4MDQxMCwgMHgwNDExLCAweDA0MTIsIDB4MDQxMywKKwkweDA0MTQsIDB4MDQxNSwgMHgwNDE2LCAweDA0MTcsCisJMHgwNDE4LCAweDA0MTksIDB4MDQxYSwgMHgwNDFiLAorCTB4MDQxYywgMHgwNDFkLCAweDA0MWUsIDB4MDQxZiwKKwkvKiAweGMwKi8KKwkweDA0MjAsIDB4MDQyMSwgMHgwNDIyLCAweDA0MjMsCisJMHgwNDI0LCAweDA0MjUsIDB4MDQyNiwgMHgwNDI3LAorCTB4MDQyOCwgMHgwNDI5LCAweDA0MmEsIDB4MDQyYiwKKwkweDA0MmMsIDB4MDQyZCwgMHgwNDJlLCAweDA0MmYsCisJLyogMHhkMCovCisJMHgwNDMwLCAweDA0MzEsIDB4MDQzMiwgMHgwNDMzLAorCTB4MDQzNCwgMHgwNDM1LCAweDA0MzYsIDB4MDQzNywKKwkweDA0MzgsIDB4MDQzOSwgMHgwNDNhLCAweDA0M2IsCisJMHgwNDNjLCAweDA0M2QsIDB4MDQzZSwgMHgwNDNmLAorCS8qIDB4ZTAqLworCTB4MDQ0MCwgMHgwNDQxLCAweDA0NDIsIDB4MDQ0MywKKwkweDA0NDQsIDB4MDQ0NSwgMHgwNDQ2LCAweDA0NDcsCisJMHgwNDQ4LCAweDA0NDksIDB4MDQ0YSwgMHgwNDRiLAorCTB4MDQ0YywgMHgwNDRkLCAweDA0NGUsIDB4MDQ0ZiwKKwkvKiAweGYwKi8KKwkweDIxMTYsIDB4MDQ1MSwgMHgwNDUyLCAweDA0NTMsCisJMHgwNDU0LCAweDA0NTUsIDB4MDQ1NiwgMHgwNDU3LAorCTB4MDQ1OCwgMHgwNDU5LCAweDA0NWEsIDB4MDQ1YiwKKwkweDA0NWMsIDB4MDBhNywgMHgwNDVlLCAweDA0NWYsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDBbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmQsIC8qIDB4YTAtMHhhNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YWQsIDB4MDAsIDB4MDAsIC8qIDB4YTgtMHhhZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTA0WzI1Nl0gPSB7CisJMHgwMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHgwMC0weDA3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHgwMCwgMHhhZSwgMHhhZiwgLyogMHgwOC0weDBmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHgxMC0weDE3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHgxOC0weDFmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHgyMC0weDI3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHgyOC0weDJmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHgzMC0weDM3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHgzOC0weDNmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHg0MC0weDQ3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHg1MC0weDU3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHgwMCwgMHhmZSwgMHhmZiwgLyogMHg1OC0weDVmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjFbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGYwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwYWdlX3VuaTJjaGFyc2V0WzI1Nl0gPSB7CisJcGFnZTAwLCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBwYWdlMDQsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgcGFnZTIxLCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQybG93ZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDQwLTB4NDcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDUwLTB4NTcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4YTAtMHhhNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4YWQsIDB4ZmUsIDB4ZmYsIC8qIDB4YTgtMHhhZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4YjAtMHhiNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4YjgtMHhiZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4YzAtMHhjNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJ1cHBlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NjAtMHg2NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NzAtMHg3NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhkMC0weGQ3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhkOC0weGRmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhlMC0weGU3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHhmMC0weGY3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhmZCwgMHhhZSwgMHhhZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgaW50IHVuaTJjaGFyKHdjaGFyX3QgdW5pLCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCBib3VuZGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICp1bmkyY2hhcnNldDsKKwl1bnNpZ25lZCBjaGFyIGNsID0gdW5pICYgMHgwMGZmOworCXVuc2lnbmVkIGNoYXIgY2ggPSAodW5pICYgMHhmZjAwKSA+PiA4OworCisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJdW5pMmNoYXJzZXQgPSBwYWdlX3VuaTJjaGFyc2V0W2NoXTsKKwlpZiAodW5pMmNoYXJzZXQgJiYgdW5pMmNoYXJzZXRbY2xdKQorCQlvdXRbMF0gPSB1bmkyY2hhcnNldFtjbF07CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGFyMnVuaShjb25zdCB1bnNpZ25lZCBjaGFyICpyYXdzdHJpbmcsIGludCBib3VuZGxlbiwgd2NoYXJfdCAqdW5pKQoreworCSp1bmkgPSBjaGFyc2V0MnVuaVsqcmF3c3RyaW5nXTsKKwlpZiAoKnVuaSA9PSAweDAwMDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSB0YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJpc284ODU5LTUiLAorCS51bmkyY2hhcgk9IHVuaTJjaGFyLAorCS5jaGFyMnVuaQk9IGNoYXIydW5pLAorCS5jaGFyc2V0Mmxvd2VyCT0gY2hhcnNldDJsb3dlciwKKwkuY2hhcnNldDJ1cHBlcgk9IGNoYXJzZXQydXBwZXIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9ubHNfaXNvODg1OV81KHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX25scygmdGFibGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9ubHNfaXNvODg1OV81KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ubHNfaXNvODg1OV81KQorbW9kdWxlX2V4aXQoZXhpdF9ubHNfaXNvODg1OV81KQorCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CmRpZmYgLS1naXQgYS9mcy9ubHMvbmxzX2lzbzg4NTktNi5jIGIvZnMvbmxzL25sc19pc284ODU5LTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzUxOWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbmxzL25sc19pc284ODU5LTYuYwpAQCAtMCwwICsxLDI2NCBAQAorLyoKKyAqIGxpbnV4L2ZzL25sc19pc284ODU5LTYuYworICoKKyAqIENoYXJzZXQgaXNvODg1OS02IHRyYW5zbGF0aW9uIHRhYmxlcy4KKyAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIFVuaWNvZGUgYW5kIGNoYXJzZXQKKyAqIHRhYmxlcyBmcm9tIHRoZSBVbmljb2RlIE9yZ2FuaXphdGlvbiAod3d3LnVuaWNvZGUub3JnKS4KKyAqIFRoZSBVbmljb2RlIHRvIGNoYXJzZXQgdGFibGUgaGFzIG9ubHkgZXhhY3QgbWFwcGluZ3MuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKK3N0YXRpYyB3Y2hhcl90IGNoYXJzZXQydW5pWzI1Nl0gPSB7CisJLyogMHgwMCovCisJMHgwMDAwLCAweDAwMDEsIDB4MDAwMiwgMHgwMDAzLAorCTB4MDAwNCwgMHgwMDA1LCAweDAwMDYsIDB4MDAwNywKKwkweDAwMDgsIDB4MDAwOSwgMHgwMDBhLCAweDAwMGIsCisJMHgwMDBjLCAweDAwMGQsIDB4MDAwZSwgMHgwMDBmLAorCS8qIDB4MTAqLworCTB4MDAxMCwgMHgwMDExLCAweDAwMTIsIDB4MDAxMywKKwkweDAwMTQsIDB4MDAxNSwgMHgwMDE2LCAweDAwMTcsCisJMHgwMDE4LCAweDAwMTksIDB4MDAxYSwgMHgwMDFiLAorCTB4MDAxYywgMHgwMDFkLCAweDAwMWUsIDB4MDAxZiwKKwkvKiAweDIwKi8KKwkweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsCisJMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LAorCTB4MDAyOCwgMHgwMDI5LCAweDAwMmEsIDB4MDAyYiwKKwkweDAwMmMsIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsCisJLyogMHgzMCovCisJMHgwNjYwLCAweDA2NjEsIDB4MDY2MiwgMHgwNjYzLAorCTB4MDY2NCwgMHgwNjY1LCAweDA2NjYsIDB4MDY2NywKKwkweDA2NjgsIDB4MDY2OSwgMHgwMDNhLCAweDAwM2IsCisJMHgwMDNjLCAweDAwM2QsIDB4MDAzZSwgMHgwMDNmLAorCS8qIDB4NDAqLworCTB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywKKwkweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCisJMHgwMDQ4LCAweDAwNDksIDB4MDA0YSwgMHgwMDRiLAorCTB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKKwkvKiAweDUwKi8KKwkweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsCisJMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LAorCTB4MDA1OCwgMHgwMDU5LCAweDAwNWEsIDB4MDA1YiwKKwkweDAwNWMsIDB4MDA1ZCwgMHgwMDVlLCAweDAwNWYsCisJLyogMHg2MCovCisJMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLAorCTB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywKKwkweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsCisJMHgwMDZjLCAweDAwNmQsIDB4MDA2ZSwgMHgwMDZmLAorCS8qIDB4NzAqLworCTB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywKKwkweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCisJMHgwMDc4LCAweDAwNzksIDB4MDA3YSwgMHgwMDdiLAorCTB4MDA3YywgMHgwMDdkLCAweDAwN2UsIDB4MDA3ZiwKKwkvKiAweDgwKi8KKwkweDAwODAsIDB4MDA4MSwgMHgwMDgyLCAweDAwODMsCisJMHgwMDg0LCAweDAwODUsIDB4MDA4NiwgMHgwMDg3LAorCTB4MDA4OCwgMHgwMDg5LCAweDAwOGEsIDB4MDA4YiwKKwkweDAwOGMsIDB4MDA4ZCwgMHgwMDhlLCAweDAwOGYsCisJLyogMHg5MCovCisJMHgwMDkwLCAweDAwOTEsIDB4MDA5MiwgMHgwMDkzLAorCTB4MDA5NCwgMHgwMDk1LCAweDAwOTYsIDB4MDA5NywKKwkweDAwOTgsIDB4MDA5OSwgMHgwMDlhLCAweDAwOWIsCisJMHgwMDljLCAweDAwOWQsIDB4MDA5ZSwgMHgwMDlmLAorCS8qIDB4YTAqLworCTB4MDBhMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwYTQsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDYwYywgMHgwMGFkLCAweDAwMDAsIDB4MDAwMCwKKwkvKiAweGIwKi8KKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDYxYiwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDA2MWYsCisJLyogMHhjMCovCisJMHgwMDAwLCAweDA2MjEsIDB4MDYyMiwgMHgwNjIzLAorCTB4MDYyNCwgMHgwNjI1LCAweDA2MjYsIDB4MDYyNywKKwkweDA2MjgsIDB4MDYyOSwgMHgwNjJhLCAweDA2MmIsCisJMHgwNjJjLCAweDA2MmQsIDB4MDYyZSwgMHgwNjJmLAorCS8qIDB4ZDAqLworCTB4MDYzMCwgMHgwNjMxLCAweDA2MzIsIDB4MDYzMywKKwkweDA2MzQsIDB4MDYzNSwgMHgwNjM2LCAweDA2MzcsCisJMHgwNjM4LCAweDA2MzksIDB4MDYzYSwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkvKiAweGUwKi8KKwkweDA2NDAsIDB4MDY0MSwgMHgwNjQyLCAweDA2NDMsCisJMHgwNjQ0LCAweDA2NDUsIDB4MDY0NiwgMHgwNjQ3LAorCTB4MDY0OCwgMHgwNjQ5LCAweDA2NGEsIDB4MDY0YiwKKwkweDA2NGMsIDB4MDY0ZCwgMHgwNjRlLCAweDA2NGYsCisJLyogMHhmMCovCisJMHgwNjUwLCAweDA2NTEsIDB4MDY1MiwgMHgwMDAwLAorCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKwkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAwWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweDAwLCAweDAwLCAweDAwLCAweGE0LCAweDAwLCAweDAwLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGFkLCAweDAwLCAweDAwLCAvKiAweGE4LTB4YWYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwNlsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YWMsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4YmIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YmYsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4MjAtMHgyNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4MjgtMHgyZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4MzAtMHgzNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4NDAtMHg0NyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4NDgtMHg0ZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4NjAtMHg2NyAqLworCTB4MzgsIDB4MzksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnBhZ2VfdW5pMmNoYXJzZXRbMjU2XSA9IHsKKwlwYWdlMDAsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBwYWdlMDYsIE5VTEwsICAgCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0Mmxvd2VyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg0MC0weDQ3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg0OC0weDRmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg1MC0weDU3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweDAwLCAweDAwLCAweDAwLCAweGE0LCAweDAwLCAweDAwLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGFjLCAweGFkLCAweDAwLCAweDAwLCAvKiAweGE4LTB4YWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGIwLTB4YjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweGJiLCAweDAwLCAweDAwLCAweDAwLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweDAwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGYwLTB4ZjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQydXBwZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDYwLTB4NjcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDY4LTB4NmYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDcwLTB4NzcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YTQsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YWMsIDB4YWQsIDB4MDAsIDB4MDAsIC8qIDB4YTgtMHhhZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YjAtMHhiNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4YmIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4MDAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ZjAtMHhmNyAqLworfTsKKworc3RhdGljIGludCB1bmkyY2hhcih3Y2hhcl90IHVuaSwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgYm91bmRsZW4pCit7CisJdW5zaWduZWQgY2hhciAqdW5pMmNoYXJzZXQ7CisJdW5zaWduZWQgY2hhciBjbCA9IHVuaSAmIDB4MDBmZjsKKwl1bnNpZ25lZCBjaGFyIGNoID0gKHVuaSAmIDB4ZmYwMCkgPj4gODsKKworCWlmIChib3VuZGxlbiA8PSAwKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCXVuaTJjaGFyc2V0ID0gcGFnZV91bmkyY2hhcnNldFtjaF07CisJaWYgKHVuaTJjaGFyc2V0ICYmIHVuaTJjaGFyc2V0W2NsXSkKKwkJb3V0WzBdID0gdW5pMmNoYXJzZXRbY2xdOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY2hhcjJ1bmkoY29uc3QgdW5zaWduZWQgY2hhciAqcmF3c3RyaW5nLCBpbnQgYm91bmRsZW4sIHdjaGFyX3QgKnVuaSkKK3sKKwkqdW5pID0gY2hhcnNldDJ1bmlbKnJhd3N0cmluZ107CisJaWYgKCp1bmkgPT0gMHgwMDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBubHNfdGFibGUgdGFibGUgPSB7CisJLmNoYXJzZXQJPSAiaXNvODg1OS02IiwKKwkudW5pMmNoYXIJPSB1bmkyY2hhciwKKwkuY2hhcjJ1bmkJPSBjaGFyMnVuaSwKKwkuY2hhcnNldDJsb3dlcgk9IGNoYXJzZXQybG93ZXIsCisJLmNoYXJzZXQydXBwZXIJPSBjaGFyc2V0MnVwcGVyLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmxzX2lzbzg4NTlfNih2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmxzX2lzbzg4NTlfNih2b2lkKQoreworCXVucmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbmxzX2lzbzg4NTlfNikKK21vZHVsZV9leGl0KGV4aXRfbmxzX2lzbzg4NTlfNikKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvbmxzL25sc19pc284ODU5LTcuYyBiL2ZzL25scy9ubHNfaXNvODg1OS03LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQwODU0NgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL25scy9ubHNfaXNvODg1OS03LmMKQEAgLTAsMCArMSwzMTggQEAKKy8qCisgKiBsaW51eC9mcy9ubHNfaXNvODg1OS03LmMKKyAqCisgKiBDaGFyc2V0IGlzbzg4NTktNyB0cmFuc2xhdGlvbiB0YWJsZXMuCisgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBVbmljb2RlIGFuZCBjaGFyc2V0CisgKiB0YWJsZXMgZnJvbSB0aGUgVW5pY29kZSBPcmdhbml6YXRpb24gKHd3dy51bmljb2RlLm9yZykuCisgKiBUaGUgVW5pY29kZSB0byBjaGFyc2V0IHRhYmxlIGhhcyBvbmx5IGV4YWN0IG1hcHBpbmdzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCitzdGF0aWMgd2NoYXJfdCBjaGFyc2V0MnVuaVsyNTZdID0geworCS8qIDB4MDAqLworCTB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMywKKwkweDAwMDQsIDB4MDAwNSwgMHgwMDA2LCAweDAwMDcsCisJMHgwMDA4LCAweDAwMDksIDB4MDAwYSwgMHgwMDBiLAorCTB4MDAwYywgMHgwMDBkLCAweDAwMGUsIDB4MDAwZiwKKwkvKiAweDEwKi8KKwkweDAwMTAsIDB4MDAxMSwgMHgwMDEyLCAweDAwMTMsCisJMHgwMDE0LCAweDAwMTUsIDB4MDAxNiwgMHgwMDE3LAorCTB4MDAxOCwgMHgwMDE5LCAweDAwMWEsIDB4MDAxYiwKKwkweDAwMWMsIDB4MDAxZCwgMHgwMDFlLCAweDAwMWYsCisJLyogMHgyMCovCisJMHgwMDIwLCAweDAwMjEsIDB4MDAyMiwgMHgwMDIzLAorCTB4MDAyNCwgMHgwMDI1LCAweDAwMjYsIDB4MDAyNywKKwkweDAwMjgsIDB4MDAyOSwgMHgwMDJhLCAweDAwMmIsCisJMHgwMDJjLCAweDAwMmQsIDB4MDAyZSwgMHgwMDJmLAorCS8qIDB4MzAqLworCTB4MDAzMCwgMHgwMDMxLCAweDAwMzIsIDB4MDAzMywKKwkweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsCisJMHgwMDM4LCAweDAwMzksIDB4MDAzYSwgMHgwMDNiLAorCTB4MDAzYywgMHgwMDNkLCAweDAwM2UsIDB4MDAzZiwKKwkvKiAweDQwKi8KKwkweDAwNDAsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsCisJMHgwMDQ0LCAweDAwNDUsIDB4MDA0NiwgMHgwMDQ3LAorCTB4MDA0OCwgMHgwMDQ5LCAweDAwNGEsIDB4MDA0YiwKKwkweDAwNGMsIDB4MDA0ZCwgMHgwMDRlLCAweDAwNGYsCisJLyogMHg1MCovCisJMHgwMDUwLCAweDAwNTEsIDB4MDA1MiwgMHgwMDUzLAorCTB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKKwkweDAwNTgsIDB4MDA1OSwgMHgwMDVhLCAweDAwNWIsCisJMHgwMDVjLCAweDAwNWQsIDB4MDA1ZSwgMHgwMDVmLAorCS8qIDB4NjAqLworCTB4MDA2MCwgMHgwMDYxLCAweDAwNjIsIDB4MDA2MywKKwkweDAwNjQsIDB4MDA2NSwgMHgwMDY2LCAweDAwNjcsCisJMHgwMDY4LCAweDAwNjksIDB4MDA2YSwgMHgwMDZiLAorCTB4MDA2YywgMHgwMDZkLCAweDAwNmUsIDB4MDA2ZiwKKwkvKiAweDcwKi8KKwkweDAwNzAsIDB4MDA3MSwgMHgwMDcyLCAweDAwNzMsCisJMHgwMDc0LCAweDAwNzUsIDB4MDA3NiwgMHgwMDc3LAorCTB4MDA3OCwgMHgwMDc5LCAweDAwN2EsIDB4MDA3YiwKKwkweDAwN2MsIDB4MDA3ZCwgMHgwMDdlLCAweDAwN2YsCisJLyogMHg4MCovCisJMHgwMDgwLCAweDAwODEsIDB4MDA4MiwgMHgwMDgzLAorCTB4MDA4NCwgMHgwMDg1LCAweDAwODYsIDB4MDA4NywKKwkweDAwODgsIDB4MDA4OSwgMHgwMDhhLCAweDAwOGIsCisJMHgwMDhjLCAweDAwOGQsIDB4MDA4ZSwgMHgwMDhmLAorCS8qIDB4OTAqLworCTB4MDA5MCwgMHgwMDkxLCAweDAwOTIsIDB4MDA5MywKKwkweDAwOTQsIDB4MDA5NSwgMHgwMDk2LCAweDAwOTcsCisJMHgwMDk4LCAweDAwOTksIDB4MDA5YSwgMHgwMDliLAorCTB4MDA5YywgMHgwMDlkLCAweDAwOWUsIDB4MDA5ZiwKKwkvKiAweGEwKi8KKwkweDAwYTAsIDB4MDJiZCwgMHgwMmJjLCAweDAwYTMsCisJMHgwMDAwLCAweDAwMDAsIDB4MDBhNiwgMHgwMGE3LAorCTB4MDBhOCwgMHgwMGE5LCAweDAwMDAsIDB4MDBhYiwKKwkweDAwYWMsIDB4MDBhZCwgMHgwMDAwLCAweDIwMTUsCisJLyogMHhiMCovCisJMHgwMGIwLCAweDAwYjEsIDB4MDBiMiwgMHgwMGIzLAorCTB4MDM4NCwgMHgwMzg1LCAweDAzODYsIDB4MDBiNywKKwkweDAzODgsIDB4MDM4OSwgMHgwMzhhLCAweDAwYmIsCisJMHgwMzhjLCAweDAwYmQsIDB4MDM4ZSwgMHgwMzhmLAorCS8qIDB4YzAqLworCTB4MDM5MCwgMHgwMzkxLCAweDAzOTIsIDB4MDM5MywKKwkweDAzOTQsIDB4MDM5NSwgMHgwMzk2LCAweDAzOTcsCisJMHgwMzk4LCAweDAzOTksIDB4MDM5YSwgMHgwMzliLAorCTB4MDM5YywgMHgwMzlkLCAweDAzOWUsIDB4MDM5ZiwKKwkvKiAweGQwKi8KKwkweDAzYTAsIDB4MDNhMSwgMHgwMDAwLCAweDAzYTMsCisJMHgwM2E0LCAweDAzYTUsIDB4MDNhNiwgMHgwM2E3LAorCTB4MDNhOCwgMHgwM2E5LCAweDAzYWEsIDB4MDNhYiwKKwkweDAzYWMsIDB4MDNhZCwgMHgwM2FlLCAweDAzYWYsCisJLyogMHhlMCovCisJMHgwM2IwLCAweDAzYjEsIDB4MDNiMiwgMHgwM2IzLAorCTB4MDNiNCwgMHgwM2I1LCAweDAzYjYsIDB4MDNiNywKKwkweDAzYjgsIDB4MDNiOSwgMHgwM2JhLCAweDAzYmIsCisJMHgwM2JjLCAweDAzYmQsIDB4MDNiZSwgMHgwM2JmLAorCS8qIDB4ZjAqLworCTB4MDNjMCwgMHgwM2MxLCAweDAzYzIsIDB4MDNjMywKKwkweDAzYzQsIDB4MDNjNSwgMHgwM2M2LCAweDAzYzcsCisJMHgwM2M4LCAweDAzYzksIDB4MDNjYSwgMHgwM2NiLAorCTB4MDNjYywgMHgwM2NkLCAweDAzY2UsIDB4MDAwMCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwMFsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHgwMCwgMHgwMCwgMHhhMywgMHgwMCwgMHgwMCwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHgwMCwgMHhhYiwgMHhhYywgMHhhZCwgMHgwMCwgMHgwMCwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHgwMCwgMHgwMCwgMHgwMCwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhiYiwgMHgwMCwgMHhiZCwgMHgwMCwgMHgwMCwgLyogMHhiOC0weGJmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDJbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDY4LTB4NmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDcwLTB4NzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDc4LTB4N2YgKi8KKworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODAtMHg4NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4ODgtMHg4ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTAtMHg5NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4OTgtMHg5ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTAtMHhhNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YTgtMHhhZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4YjAtMHhiNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YTIsIDB4YTEsIDB4MDAsIDB4MDAsIC8qIDB4YjgtMHhiZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAzWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGI0LCAweGI1LCAweGI2LCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweDAwLCAweGJjLCAweDAwLCAweGJlLCAweGJmLCAvKiAweDg4LTB4OGYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweDkwLTB4OTcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweDk4LTB4OWYgKi8KKwkweGQwLCAweGQxLCAweDAwLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGEwLTB4YTcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweGE4LTB4YWYgKi8KKwkweGUwLCAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAvKiAweGIwLTB4YjcgKi8KKwkweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLCAweGVkLCAweGVlLCAweGVmLCAvKiAweGI4LTB4YmYgKi8KKwkweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAvKiAweGMwLTB4YzcgKi8KKwkweGY4LCAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweDAwLCAvKiAweGM4LTB4Y2YgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyMFsyNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YWYsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnBhZ2VfdW5pMmNoYXJzZXRbMjU2XSA9IHsKKwlwYWdlMDAsIE5VTEwsICAgcGFnZTAyLCBwYWdlMDMsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJcGFnZTIwLCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJsb3dlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NDAtMHg0NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NTAtMHg1NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NjEsIDB4NjIsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIC8qIDB4NjAtMHg2NyAqLworCTB4NjgsIDB4NjksIDB4NmEsIDB4NmIsIDB4NmMsIDB4NmQsIDB4NmUsIDB4NmYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NzAsIDB4NzEsIDB4NzIsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIC8qIDB4NzAtMHg3NyAqLworCTB4NzgsIDB4NzksIDB4N2EsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHgwMCwgMHgwMCwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHgwMCwgMHhhYiwgMHhhYywgMHhhZCwgMHgwMCwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhkYywgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhkZCwgMHhkZSwgMHhkZiwgMHhiYiwgMHhmYywgMHhiZCwgMHhmZCwgMHhmZSwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhjMC0weGM3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhjOC0weGNmICovCisJMHhmMCwgMHhmMSwgMHgwMCwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhkMC0weGQ3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHgwMCwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0MnVwcGVyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg2MC0weDY3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg2OC0weDZmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg3MC0weDc3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweGExLCAweGEyLCAweGEzLCAweDAwLCAweDAwLCAweGE2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE5LCAweDAwLCAweGFiLCAweGFjLCAweGFkLCAweDAwLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGQwLCAweGQxLCAweDAwLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGI2LCAweGI4LCAweGI5LCAweGJhLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGUwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGQwLCAweGQxLCAweGQzLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGJjLCAweGJlLCAweGJmLCAweDAwLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyBpbnQgdW5pMmNoYXIod2NoYXJfdCB1bmksIHVuc2lnbmVkIGNoYXIgKm91dCwgaW50IGJvdW5kbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKnVuaTJjaGFyc2V0OworCXVuc2lnbmVkIGNoYXIgY2wgPSB1bmkgJiAweDAwZmY7CisJdW5zaWduZWQgY2hhciBjaCA9ICh1bmkgJiAweGZmMDApID4+IDg7CisKKwlpZiAoYm91bmRsZW4gPD0gMCkKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwl1bmkyY2hhcnNldCA9IHBhZ2VfdW5pMmNoYXJzZXRbY2hdOworCWlmICh1bmkyY2hhcnNldCAmJiB1bmkyY2hhcnNldFtjbF0pCisJCW91dFswXSA9IHVuaTJjaGFyc2V0W2NsXTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNoYXIydW5pKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnJhd3N0cmluZywgaW50IGJvdW5kbGVuLCB3Y2hhcl90ICp1bmkpCit7CisJKnVuaSA9IGNoYXJzZXQydW5pWypyYXdzdHJpbmddOworCWlmICgqdW5pID09IDB4MDAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmxzX3RhYmxlIHRhYmxlID0geworCS5jaGFyc2V0CT0gImlzbzg4NTktNyIsCisJLnVuaTJjaGFyCT0gdW5pMmNoYXIsCisJLmNoYXIydW5pCT0gY2hhcjJ1bmksCisJLmNoYXJzZXQybG93ZXIJPSBjaGFyc2V0Mmxvd2VyLAorCS5jaGFyc2V0MnVwcGVyCT0gY2hhcnNldDJ1cHBlciwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X25sc19pc284ODU5Xzcodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X25sc19pc284ODU5Xzcodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25scygmdGFibGUpOworfQorCittb2R1bGVfaW5pdChpbml0X25sc19pc284ODU5XzcpCittb2R1bGVfZXhpdChleGl0X25sc19pc284ODU5XzcpCisKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL25scy9ubHNfaXNvODg1OS05LmMgYi9mcy9ubHMvbmxzX2lzbzg4NTktOS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4OGVmZjcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ubHMvbmxzX2lzbzg4NTktOS5jCkBAIC0wLDAgKzEsMjczIEBACisvKgorICogbGludXgvZnMvbmxzX2lzbzg4NTktOS5jCisgKgorICogQ2hhcnNldCBpc284ODU5LTkgdHJhbnNsYXRpb24gdGFibGVzLgorICogR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSB0aGUgVW5pY29kZSBhbmQgY2hhcnNldAorICogdGFibGVzIGZyb20gdGhlIFVuaWNvZGUgT3JnYW5pemF0aW9uICh3d3cudW5pY29kZS5vcmcpLgorICogVGhlIFVuaWNvZGUgdG8gY2hhcnNldCB0YWJsZSBoYXMgb25seSBleGFjdCBtYXBwaW5ncy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworc3RhdGljIHdjaGFyX3QgY2hhcnNldDJ1bmlbMjU2XSA9IHsKKwkvKiAweDAwKi8KKwkweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsCisJMHgwMDA0LCAweDAwMDUsIDB4MDAwNiwgMHgwMDA3LAorCTB4MDAwOCwgMHgwMDA5LCAweDAwMGEsIDB4MDAwYiwKKwkweDAwMGMsIDB4MDAwZCwgMHgwMDBlLCAweDAwMGYsCisJLyogMHgxMCovCisJMHgwMDEwLCAweDAwMTEsIDB4MDAxMiwgMHgwMDEzLAorCTB4MDAxNCwgMHgwMDE1LCAweDAwMTYsIDB4MDAxNywKKwkweDAwMTgsIDB4MDAxOSwgMHgwMDFhLCAweDAwMWIsCisJMHgwMDFjLCAweDAwMWQsIDB4MDAxZSwgMHgwMDFmLAorCS8qIDB4MjAqLworCTB4MDAyMCwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywKKwkweDAwMjQsIDB4MDAyNSwgMHgwMDI2LCAweDAwMjcsCisJMHgwMDI4LCAweDAwMjksIDB4MDAyYSwgMHgwMDJiLAorCTB4MDAyYywgMHgwMDJkLCAweDAwMmUsIDB4MDAyZiwKKwkvKiAweDMwKi8KKwkweDAwMzAsIDB4MDAzMSwgMHgwMDMyLCAweDAwMzMsCisJMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LAorCTB4MDAzOCwgMHgwMDM5LCAweDAwM2EsIDB4MDAzYiwKKwkweDAwM2MsIDB4MDAzZCwgMHgwMDNlLCAweDAwM2YsCisJLyogMHg0MCovCisJMHgwMDQwLCAweDAwNDEsIDB4MDA0MiwgMHgwMDQzLAorCTB4MDA0NCwgMHgwMDQ1LCAweDAwNDYsIDB4MDA0NywKKwkweDAwNDgsIDB4MDA0OSwgMHgwMDRhLCAweDAwNGIsCisJMHgwMDRjLCAweDAwNGQsIDB4MDA0ZSwgMHgwMDRmLAorCS8qIDB4NTAqLworCTB4MDA1MCwgMHgwMDUxLCAweDAwNTIsIDB4MDA1MywKKwkweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisJMHgwMDU4LCAweDAwNTksIDB4MDA1YSwgMHgwMDViLAorCTB4MDA1YywgMHgwMDVkLCAweDAwNWUsIDB4MDA1ZiwKKwkvKiAweDYwKi8KKwkweDAwNjAsIDB4MDA2MSwgMHgwMDYyLCAweDAwNjMsCisJMHgwMDY0LCAweDAwNjUsIDB4MDA2NiwgMHgwMDY3LAorCTB4MDA2OCwgMHgwMDY5LCAweDAwNmEsIDB4MDA2YiwKKwkweDAwNmMsIDB4MDA2ZCwgMHgwMDZlLCAweDAwNmYsCisJLyogMHg3MCovCisJMHgwMDcwLCAweDAwNzEsIDB4MDA3MiwgMHgwMDczLAorCTB4MDA3NCwgMHgwMDc1LCAweDAwNzYsIDB4MDA3NywKKwkweDAwNzgsIDB4MDA3OSwgMHgwMDdhLCAweDAwN2IsCisJMHgwMDdjLCAweDAwN2QsIDB4MDA3ZSwgMHgwMDdmLAorCS8qIDB4ODAqLworCTB4MDA4MCwgMHgwMDgxLCAweDAwODIsIDB4MDA4MywKKwkweDAwODQsIDB4MDA4NSwgMHgwMDg2LCAweDAwODcsCisJMHgwMDg4LCAweDAwODksIDB4MDA4YSwgMHgwMDhiLAorCTB4MDA4YywgMHgwMDhkLCAweDAwOGUsIDB4MDA4ZiwKKwkvKiAweDkwKi8KKwkweDAwOTAsIDB4MDA5MSwgMHgwMDkyLCAweDAwOTMsCisJMHgwMDk0LCAweDAwOTUsIDB4MDA5NiwgMHgwMDk3LAorCTB4MDA5OCwgMHgwMDk5LCAweDAwOWEsIDB4MDA5YiwKKwkweDAwOWMsIDB4MDA5ZCwgMHgwMDllLCAweDAwOWYsCisJLyogMHhhMCovCisJMHgwMGEwLCAweDAwYTEsIDB4MDBhMiwgMHgwMGEzLAorCTB4MDBhNCwgMHgwMGE1LCAweDAwYTYsIDB4MDBhNywKKwkweDAwYTgsIDB4MDBhOSwgMHgwMGFhLCAweDAwYWIsCisJMHgwMGFjLCAweDAwYWQsIDB4MDBhZSwgMHgwMGFmLAorCS8qIDB4YjAqLworCTB4MDBiMCwgMHgwMGIxLCAweDAwYjIsIDB4MDBiMywKKwkweDAwYjQsIDB4MDBiNSwgMHgwMGI2LCAweDAwYjcsCisJMHgwMGI4LCAweDAwYjksIDB4MDBiYSwgMHgwMGJiLAorCTB4MDBiYywgMHgwMGJkLCAweDAwYmUsIDB4MDBiZiwKKwkvKiAweGMwKi8KKwkweDAwYzAsIDB4MDBjMSwgMHgwMGMyLCAweDAwYzMsCisJMHgwMGM0LCAweDAwYzUsIDB4MDBjNiwgMHgwMGM3LAorCTB4MDBjOCwgMHgwMGM5LCAweDAwY2EsIDB4MDBjYiwKKwkweDAwY2MsIDB4MDBjZCwgMHgwMGNlLCAweDAwY2YsCisJLyogMHhkMCovCisJMHgwMTFlLCAweDAwZDEsIDB4MDBkMiwgMHgwMGQzLAorCTB4MDBkNCwgMHgwMGQ1LCAweDAwZDYsIDB4MDBkNywKKwkweDAwZDgsIDB4MDBkOSwgMHgwMGRhLCAweDAwZGIsCisJMHgwMGRjLCAweDAxMzAsIDB4MDE1ZSwgMHgwMGRmLAorCS8qIDB4ZTAqLworCTB4MDBlMCwgMHgwMGUxLCAweDAwZTIsIDB4MDBlMywKKwkweDAwZTQsIDB4MDBlNSwgMHgwMGU2LCAweDAwZTcsCisJMHgwMGU4LCAweDAwZTksIDB4MDBlYSwgMHgwMGViLAorCTB4MDBlYywgMHgwMGVkLCAweDAwZWUsIDB4MDBlZiwKKwkvKiAweGYwKi8KKwkweDAxMWYsIDB4MDBmMSwgMHgwMGYyLCAweDAwZjMsCisJMHgwMGY0LCAweDAwZjUsIDB4MDBmNiwgMHgwMGY3LAorCTB4MDBmOCwgMHgwMGY5LCAweDAwZmEsIDB4MDBmYiwKKwkweDAwZmMsIDB4MDEzMSwgMHgwMTVmLCAweDAwZmYsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMDBbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4MDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4MDAsIDB4MDAsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4MDAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4MDAsIDB4MDAsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAxWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkMCwgMHhmMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHhkZCwgMHhmZCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkZSwgMHhmZSwgLyogMHg1OC0weDVmICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciAqcGFnZV91bmkyY2hhcnNldFsyNTZdID0geworCXBhZ2UwMCwgcGFnZTAxLCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQybG93ZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDQwLTB4NDcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDUwLTB4NTcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4YzAtMHhjNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4YzgtMHhjZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4NjksIDB4ZmUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJ1cHBlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NjAtMHg2NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NzAtMHg3NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHgwMCwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhjMC0weGM3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhjOC0weGNmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgLyogMHhkMC0weGQ3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgLyogMHhkOC0weGRmICovCisJMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgLyogMHhlMC0weGU3ICovCisJMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgLyogMHhlOC0weGVmICovCisJMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHg0OSwgMHhkZSwgMHgwMCwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgaW50IHVuaTJjaGFyKHdjaGFyX3QgdW5pLCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCBib3VuZGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICp1bmkyY2hhcnNldDsKKwl1bnNpZ25lZCBjaGFyIGNsID0gdW5pICYgMHgwMGZmOworCXVuc2lnbmVkIGNoYXIgY2ggPSAodW5pICYgMHhmZjAwKSA+PiA4OworCisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJdW5pMmNoYXJzZXQgPSBwYWdlX3VuaTJjaGFyc2V0W2NoXTsKKwlpZiAodW5pMmNoYXJzZXQgJiYgdW5pMmNoYXJzZXRbY2xdKQorCQlvdXRbMF0gPSB1bmkyY2hhcnNldFtjbF07CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGFyMnVuaShjb25zdCB1bnNpZ25lZCBjaGFyICpyYXdzdHJpbmcsIGludCBib3VuZGxlbiwgd2NoYXJfdCAqdW5pKQoreworCSp1bmkgPSBjaGFyc2V0MnVuaVsqcmF3c3RyaW5nXTsKKwlpZiAoKnVuaSA9PSAweDAwMDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSB0YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJpc284ODU5LTkiLAorCS51bmkyY2hhcgk9IHVuaTJjaGFyLAorCS5jaGFyMnVuaQk9IGNoYXIydW5pLAorCS5jaGFyc2V0Mmxvd2VyCT0gY2hhcnNldDJsb3dlciwKKwkuY2hhcnNldDJ1cHBlcgk9IGNoYXJzZXQydXBwZXIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9ubHNfaXNvODg1OV85KHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX25scygmdGFibGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9ubHNfaXNvODg1OV85KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ubHNfaXNvODg1OV85KQorbW9kdWxlX2V4aXQoZXhpdF9ubHNfaXNvODg1OV85KQorCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CmRpZmYgLS1naXQgYS9mcy9ubHMvbmxzX2tvaTgtci5jIGIvZnMvbmxzL25sc19rb2k4LXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWQyMmMyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmxzL25sc19rb2k4LXIuYwpAQCAtMCwwICsxLDMyNCBAQAorLyoKKyAqIGxpbnV4L2ZzL25sc19rb2k4LXIuYworICoKKyAqIENoYXJzZXQga29pOC1yIHRyYW5zbGF0aW9uIHRhYmxlcy4KKyAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIFVuaWNvZGUgYW5kIGNoYXJzZXQKKyAqIHRhYmxlcyBmcm9tIHRoZSBVbmljb2RlIE9yZ2FuaXphdGlvbiAod3d3LnVuaWNvZGUub3JnKS4KKyAqIFRoZSBVbmljb2RlIHRvIGNoYXJzZXQgdGFibGUgaGFzIG9ubHkgZXhhY3QgbWFwcGluZ3MuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKK3N0YXRpYyB3Y2hhcl90IGNoYXJzZXQydW5pWzI1Nl0gPSB7CisJLyogMHgwMCovCisJMHgwMDAwLCAweDAwMDEsIDB4MDAwMiwgMHgwMDAzLAorCTB4MDAwNCwgMHgwMDA1LCAweDAwMDYsIDB4MDAwNywKKwkweDAwMDgsIDB4MDAwOSwgMHgwMDBhLCAweDAwMGIsCisJMHgwMDBjLCAweDAwMGQsIDB4MDAwZSwgMHgwMDBmLAorCS8qIDB4MTAqLworCTB4MDAxMCwgMHgwMDExLCAweDAwMTIsIDB4MDAxMywKKwkweDAwMTQsIDB4MDAxNSwgMHgwMDE2LCAweDAwMTcsCisJMHgwMDE4LCAweDAwMTksIDB4MDAxYSwgMHgwMDFiLAorCTB4MDAxYywgMHgwMDFkLCAweDAwMWUsIDB4MDAxZiwKKwkvKiAweDIwKi8KKwkweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsCisJMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LAorCTB4MDAyOCwgMHgwMDI5LCAweDAwMmEsIDB4MDAyYiwKKwkweDAwMmMsIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsCisJLyogMHgzMCovCisJMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLAorCTB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKwkweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsCisJMHgwMDNjLCAweDAwM2QsIDB4MDAzZSwgMHgwMDNmLAorCS8qIDB4NDAqLworCTB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywKKwkweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCisJMHgwMDQ4LCAweDAwNDksIDB4MDA0YSwgMHgwMDRiLAorCTB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKKwkvKiAweDUwKi8KKwkweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsCisJMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LAorCTB4MDA1OCwgMHgwMDU5LCAweDAwNWEsIDB4MDA1YiwKKwkweDAwNWMsIDB4MDA1ZCwgMHgwMDVlLCAweDAwNWYsCisJLyogMHg2MCovCisJMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLAorCTB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywKKwkweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsCisJMHgwMDZjLCAweDAwNmQsIDB4MDA2ZSwgMHgwMDZmLAorCS8qIDB4NzAqLworCTB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywKKwkweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCisJMHgwMDc4LCAweDAwNzksIDB4MDA3YSwgMHgwMDdiLAorCTB4MDA3YywgMHgwMDdkLCAweDAwN2UsIDB4MDA3ZiwKKwkvKiAweDgwKi8KKwkweDI1MDAsIDB4MjUwMiwgMHgyNTBjLCAweDI1MTAsCisJMHgyNTE0LCAweDI1MTgsIDB4MjUxYywgMHgyNTI0LAorCTB4MjUyYywgMHgyNTM0LCAweDI1M2MsIDB4MjU4MCwKKwkweDI1ODQsIDB4MjU4OCwgMHgyNThjLCAweDI1OTAsCisJLyogMHg5MCovCisJMHgyNTkxLCAweDI1OTIsIDB4MjU5MywgMHgyMzIwLAorCTB4MjVhMCwgMHgyMjE5LCAweDIyMWEsIDB4MjI0OCwKKwkweDIyNjQsIDB4MjI2NSwgMHgwMGEwLCAweDIzMjEsCisJMHgwMGIwLCAweDAwYjIsIDB4MDBiNywgMHgwMGY3LAorCS8qIDB4YTAqLworCTB4MjU1MCwgMHgyNTUxLCAweDI1NTIsIDB4MDQ1MSwKKwkweDI1NTMsIDB4MjU1NCwgMHgyNTU1LCAweDI1NTYsCisJMHgyNTU3LCAweDI1NTgsIDB4MjU1OSwgMHgyNTVhLAorCTB4MjU1YiwgMHgyNTVjLCAweDI1NWQsIDB4MjU1ZSwKKwkvKiAweGIwKi8KKwkweDI1NWYsIDB4MjU2MCwgMHgyNTYxLCAweDA0MDEsCisJMHgyNTYyLCAweDI1NjMsIDB4MjU2NCwgMHgyNTY1LAorCTB4MjU2NiwgMHgyNTY3LCAweDI1NjgsIDB4MjU2OSwKKwkweDI1NmEsIDB4MjU2YiwgMHgyNTZjLCAweDAwYTksCisJLyogMHhjMCovCisJMHgwNDRlLCAweDA0MzAsIDB4MDQzMSwgMHgwNDQ2LAorCTB4MDQzNCwgMHgwNDM1LCAweDA0NDQsIDB4MDQzMywKKwkweDA0NDUsIDB4MDQzOCwgMHgwNDM5LCAweDA0M2EsCisJMHgwNDNiLCAweDA0M2MsIDB4MDQzZCwgMHgwNDNlLAorCS8qIDB4ZDAqLworCTB4MDQzZiwgMHgwNDRmLCAweDA0NDAsIDB4MDQ0MSwKKwkweDA0NDIsIDB4MDQ0MywgMHgwNDM2LCAweDA0MzIsCisJMHgwNDRjLCAweDA0NGIsIDB4MDQzNywgMHgwNDQ4LAorCTB4MDQ0ZCwgMHgwNDQ5LCAweDA0NDcsIDB4MDQ0YSwKKwkvKiAweGUwKi8KKwkweDA0MmUsIDB4MDQxMCwgMHgwNDExLCAweDA0MjYsCisJMHgwNDE0LCAweDA0MTUsIDB4MDQyNCwgMHgwNDEzLAorCTB4MDQyNSwgMHgwNDE4LCAweDA0MTksIDB4MDQxYSwKKwkweDA0MWIsIDB4MDQxYywgMHgwNDFkLCAweDA0MWUsCisJLyogMHhmMCovCisJMHgwNDFmLCAweDA0MmYsIDB4MDQyMCwgMHgwNDIxLAorCTB4MDQyMiwgMHgwNDIzLCAweDA0MTYsIDB4MDQxMiwKKwkweDA0MmMsIDB4MDQyYiwgMHgwNDE3LCAweDA0MjgsCisJMHgwNDJkLCAweDA0MjksIDB4MDQyNywgMHgwNDJhLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAwWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweDlhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KKwkweDAwLCAweGJmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGE4LTB4YWYgKi8KKwkweDljLCAweDAwLCAweDlkLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDllLCAvKiAweGIwLTB4YjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGI4LTB4YmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGMwLTB4YzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGM4LTB4Y2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGQwLTB4ZDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGQ4LTB4ZGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGUwLTB4ZTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGU4LTB4ZWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlmLCAvKiAweGYwLTB4ZjcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwNFsyNTZdID0geworCTB4MDAsIDB4YjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4ZTEsIDB4ZTIsIDB4ZjcsIDB4ZTcsIDB4ZTQsIDB4ZTUsIDB4ZjYsIDB4ZmEsIC8qIDB4MTAtMHgxNyAqLworCTB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIDB4ZjAsIC8qIDB4MTgtMHgxZiAqLworCTB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZTYsIDB4ZTgsIDB4ZTMsIDB4ZmUsIC8qIDB4MjAtMHgyNyAqLworCTB4ZmIsIDB4ZmQsIDB4ZmYsIDB4ZjksIDB4ZjgsIDB4ZmMsIDB4ZTAsIDB4ZjEsIC8qIDB4MjgtMHgyZiAqLworCTB4YzEsIDB4YzIsIDB4ZDcsIDB4YzcsIDB4YzQsIDB4YzUsIDB4ZDYsIDB4ZGEsIC8qIDB4MzAtMHgzNyAqLworCTB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIDB4ZDAsIC8qIDB4MzgtMHgzZiAqLworCTB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4YzYsIDB4YzgsIDB4YzMsIDB4ZGUsIC8qIDB4NDAtMHg0NyAqLworCTB4ZGIsIDB4ZGQsIDB4ZGYsIDB4ZDksIDB4ZDgsIDB4ZGMsIDB4YzAsIDB4ZDEsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4YTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTAtMHg1NyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTIyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHgwMCwgMHg5NSwgMHg5NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHg5NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1MC0weDU3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg1OC0weDVmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OCwgMHg5OSwgMHgwMCwgMHgwMCwgLyogMHg2MC0weDY3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjNbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDkzLCAweDliLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyNVsyNTZdID0geworCTB4ODAsIDB4MDAsIDB4ODEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODIsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4ODMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODQsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4ODUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODYsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODcsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODgsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjgtMHgyZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODksIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzAtMHgzNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OGEsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MzgtMHgzZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDAtMHg0NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NDgtMHg0ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIDB4YTgsIC8qIDB4NTAtMHg1NyAqLworCTB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIDB4YjAsIC8qIDB4NTgtMHg1ZiAqLworCTB4YjEsIDB4YjIsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIDB4YjgsIDB4YjksIC8qIDB4NjAtMHg2NyAqLworCTB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4YiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4YywgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHg4ZCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4ZSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHg4ZiwgMHg5MCwgMHg5MSwgMHg5MiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5OC0weDlmICovCisJMHg5NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHhhMC0weGE3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciAqcGFnZV91bmkyY2hhcnNldFsyNTZdID0geworCXBhZ2UwMCwgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgcGFnZTA0LCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgcGFnZTIyLCBwYWdlMjMsIE5VTEwsICAgcGFnZTI1LCBOVUxMLCAgIE5VTEwsICAgCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBjaGFyc2V0Mmxvd2VyWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg0MC0weDQ3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg0OC0weDRmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg1MC0weDU3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAvKiAweDgwLTB4ODcgKi8KKwkweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLCAweDhkLCAweDhlLCAweDhmLCAvKiAweDg4LTB4OGYgKi8KKwkweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAvKiAweDkwLTB4OTcgKi8KKwkweDk4LCAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAvKiAweDk4LTB4OWYgKi8KKwkweGEwLCAweGExLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LCAweGE3LCAvKiAweGEwLTB4YTcgKi8KKwkweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAvKiAweGE4LTB4YWYgKi8KKwkweGIwLCAweGIxLCAweGIyLCAweGEzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAvKiAweGIwLTB4YjcgKi8KKwkweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLCAweGJkLCAweGJlLCAweGJmLCAvKiAweGI4LTB4YmYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGMwLTB4YzcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGM4LTB4Y2YgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGQwLTB4ZDcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweGQ4LTB4ZGYgKi8KKwkweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAvKiAweGUwLTB4ZTcgKi8KKwkweGM4LCAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAvKiAweGU4LTB4ZWYgKi8KKwkweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LCAweGQ1LCAweGQ2LCAweGQ3LCAvKiAweGYwLTB4ZjcgKi8KKwkweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAvKiAweGY4LTB4ZmYgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQydXBwZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDQwLTB4NDcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDUwLTB4NTcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAvKiAweDYwLTB4NjcgKi8KKwkweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAvKiAweDY4LTB4NmYgKi8KKwkweDUwLCAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAvKiAweDcwLTB4NzcgKi8KKwkweDU4LCAweDU5LCAweDVhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YjMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YjMsIDB4YjQsIDB4YjUsIDB4YjYsIDB4YjcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YmQsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4YzAtMHhjNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4YzgtMHhjZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZDgtMHhkZiAqLworCTB4ZTAsIDB4ZTEsIDB4ZTIsIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIC8qIDB4ZTAtMHhlNyAqLworCTB4ZTgsIDB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZjAsIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZjgsIDB4ZjksIDB4ZmEsIDB4ZmIsIDB4ZmMsIDB4ZmQsIDB4ZmUsIDB4ZmYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIGludCB1bmkyY2hhcih3Y2hhcl90IHVuaSwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgYm91bmRsZW4pCit7CisJdW5zaWduZWQgY2hhciAqdW5pMmNoYXJzZXQ7CisJdW5zaWduZWQgY2hhciBjbCA9IHVuaSAmIDB4MDBmZjsKKwl1bnNpZ25lZCBjaGFyIGNoID0gKHVuaSAmIDB4ZmYwMCkgPj4gODsKKworCWlmIChib3VuZGxlbiA8PSAwKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCXVuaTJjaGFyc2V0ID0gcGFnZV91bmkyY2hhcnNldFtjaF07CisJaWYgKHVuaTJjaGFyc2V0ICYmIHVuaTJjaGFyc2V0W2NsXSkKKwkJb3V0WzBdID0gdW5pMmNoYXJzZXRbY2xdOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY2hhcjJ1bmkoY29uc3QgdW5zaWduZWQgY2hhciAqcmF3c3RyaW5nLCBpbnQgYm91bmRsZW4sIHdjaGFyX3QgKnVuaSkKK3sKKwkqdW5pID0gY2hhcnNldDJ1bmlbKnJhd3N0cmluZ107CisJaWYgKCp1bmkgPT0gMHgwMDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBubHNfdGFibGUgdGFibGUgPSB7CisJLmNoYXJzZXQJPSAia29pOC1yIiwKKwkudW5pMmNoYXIJPSB1bmkyY2hhciwKKwkuY2hhcjJ1bmkJPSBjaGFyMnVuaSwKKwkuY2hhcnNldDJsb3dlcgk9IGNoYXJzZXQybG93ZXIsCisJLmNoYXJzZXQydXBwZXIJPSBjaGFyc2V0MnVwcGVyLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmxzX2tvaThfcih2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfbmxzX2tvaThfcih2b2lkKQoreworCXVucmVnaXN0ZXJfbmxzKCZ0YWJsZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbmxzX2tvaThfcikKK21vZHVsZV9leGl0KGV4aXRfbmxzX2tvaThfcikKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvbmxzL25sc19rb2k4LXJ1LmMgYi9mcy9ubHMvbmxzX2tvaTgtcnUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGI4M2VmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmxzL25sc19rb2k4LXJ1LmMKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIGxpbnV4L2ZzL25sc19rb2k4LXJ1LmMKKyAqCisgKiBDaGFyc2V0IGtvaTgtcnUgdHJhbnNsYXRpb24gYmFzZWQgb24gY2hhcnNldCBrb2k4LXUuCisgKiBUaGUgVW5pY29kZSB0byBjaGFyc2V0IHRhYmxlIGhhcyBvbmx5IGV4YWN0IG1hcHBpbmdzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSAqcF9ubHM7CisKK3N0YXRpYyBpbnQgdW5pMmNoYXIoY29uc3Qgd2NoYXJfdCB1bmksCisJCSAgICB1bnNpZ25lZCBjaGFyICpvdXQsIGludCBib3VuZGxlbikKK3sKKwlpZiAoYm91bmRsZW4gPD0gMCkKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisKKwlpZiAoKHVuaSAmIDB4ZmZhZikgPT0gMHgwNDBlIHx8ICh1bmkgJiAweGZmY2UpID09IDB4MjU0YykgeworCQkvKiBrb2k4LXJ1IGFuZCBrb2k4LXUgZGlmZmVyIG9ubHkgb24gdHdvIGNoYXJhY3RlcnMgKi8KKwkJaWYgKHVuaSA9PSAweDA0MGUpCisJCQlvdXRbMF0gPSAweGJlOworCQllbHNlIGlmICh1bmkgPT0gMHgwNDVlKQorCQkJb3V0WzBdID0gMHhhZTsKKwkJZWxzZSBpZiAodW5pID09IDB4MjU1ZCB8fCB1bmkgPT0gMHgyNTZjKQorCQkJcmV0dXJuIDA7CisJCWVsc2UKKwkJCXJldHVybiBwX25scy0+dW5pMmNoYXIodW5pLCBvdXQsIGJvdW5kbGVuKTsKKwkJcmV0dXJuIDE7CisJfQorCWVsc2UKKwkJLyogZmFzdCBwYXRoICovCisJCXJldHVybiBwX25scy0+dW5pMmNoYXIodW5pLCBvdXQsIGJvdW5kbGVuKTsKK30KKworc3RhdGljIGludCBjaGFyMnVuaShjb25zdCB1bnNpZ25lZCBjaGFyICpyYXdzdHJpbmcsIGludCBib3VuZGxlbiwKKwkJICAgIHdjaGFyX3QgKnVuaSkKK3sKKwlpbnQgbjsKKworCWlmICgoKnJhd3N0cmluZyAmIDB4ZWYpICE9IDB4YWUpIHsKKwkJLyoga29pOC1ydSBhbmQga29pOC11IGRpZmZlciBvbmx5IG9uIHR3byBjaGFyYWN0ZXJzICovCisJCSp1bmkgPSAoKnJhd3N0cmluZyAmIDB4MTApID8gMHgwNDBlIDogMHgwNDVlOworCQlyZXR1cm4gMTsKKwl9CisKKwluID0gcF9ubHMtPmNoYXIydW5pKHJhd3N0cmluZywgYm91bmRsZW4sIHVuaSk7CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbmxzX3RhYmxlIHRhYmxlID0geworCS5jaGFyc2V0CT0gImtvaTgtcnUiLAorCS51bmkyY2hhcgk9IHVuaTJjaGFyLAorCS5jaGFyMnVuaQk9IGNoYXIydW5pLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbmxzX2tvaThfcnUodm9pZCkKK3sKKwlwX25scyA9IGxvYWRfbmxzKCJrb2k4LXUiKTsKKworCWlmIChwX25scykgeworCQl0YWJsZS5jaGFyc2V0MnVwcGVyID0gcF9ubHMtPmNoYXJzZXQydXBwZXI7CisJCXRhYmxlLmNoYXJzZXQybG93ZXIgPSBwX25scy0+Y2hhcnNldDJsb3dlcjsKKwkJcmV0dXJuIHJlZ2lzdGVyX25scygmdGFibGUpOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9ubHNfa29pOF9ydSh2b2lkKQoreworCXVucmVnaXN0ZXJfbmxzKCZ0YWJsZSk7CisJdW5sb2FkX25scyhwX25scyk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbmxzX2tvaThfcnUpCittb2R1bGVfZXhpdChleGl0X25sc19rb2k4X3J1KQorCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CmRpZmYgLS1naXQgYS9mcy9ubHMvbmxzX2tvaTgtdS5jIGIvZnMvbmxzL25sc19rb2k4LXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDMwZmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbmxzL25sc19rb2k4LXUuYwpAQCAtMCwwICsxLDMzMSBAQAorLyoKKyAqIGxpbnV4L2ZzL25sc19rb2k4LXUuYworICoKKyAqIENoYXJzZXQga29pOC11IHRyYW5zbGF0aW9uIHRhYmxlcy4KKyAqIFRoZSBVbmljb2RlIHRvIGNoYXJzZXQgdGFibGUgaGFzIG9ubHkgZXhhY3QgbWFwcGluZ3MuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKK3N0YXRpYyB3Y2hhcl90IGNoYXJzZXQydW5pWzI1Nl0gPSB7CisJLyogMHgwMCovCisJMHgwMDAwLCAweDAwMDEsIDB4MDAwMiwgMHgwMDAzLAorCTB4MDAwNCwgMHgwMDA1LCAweDAwMDYsIDB4MDAwNywKKwkweDAwMDgsIDB4MDAwOSwgMHgwMDBhLCAweDAwMGIsCisJMHgwMDBjLCAweDAwMGQsIDB4MDAwZSwgMHgwMDBmLAorCS8qIDB4MTAqLworCTB4MDAxMCwgMHgwMDExLCAweDAwMTIsIDB4MDAxMywKKwkweDAwMTQsIDB4MDAxNSwgMHgwMDE2LCAweDAwMTcsCisJMHgwMDE4LCAweDAwMTksIDB4MDAxYSwgMHgwMDFiLAorCTB4MDAxYywgMHgwMDFkLCAweDAwMWUsIDB4MDAxZiwKKwkvKiAweDIwKi8KKwkweDAwMjAsIDB4MDAyMSwgMHgwMDIyLCAweDAwMjMsCisJMHgwMDI0LCAweDAwMjUsIDB4MDAyNiwgMHgwMDI3LAorCTB4MDAyOCwgMHgwMDI5LCAweDAwMmEsIDB4MDAyYiwKKwkweDAwMmMsIDB4MDAyZCwgMHgwMDJlLCAweDAwMmYsCisJLyogMHgzMCovCisJMHgwMDMwLCAweDAwMzEsIDB4MDAzMiwgMHgwMDMzLAorCTB4MDAzNCwgMHgwMDM1LCAweDAwMzYsIDB4MDAzNywKKwkweDAwMzgsIDB4MDAzOSwgMHgwMDNhLCAweDAwM2IsCisJMHgwMDNjLCAweDAwM2QsIDB4MDAzZSwgMHgwMDNmLAorCS8qIDB4NDAqLworCTB4MDA0MCwgMHgwMDQxLCAweDAwNDIsIDB4MDA0MywKKwkweDAwNDQsIDB4MDA0NSwgMHgwMDQ2LCAweDAwNDcsCisJMHgwMDQ4LCAweDAwNDksIDB4MDA0YSwgMHgwMDRiLAorCTB4MDA0YywgMHgwMDRkLCAweDAwNGUsIDB4MDA0ZiwKKwkvKiAweDUwKi8KKwkweDAwNTAsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsCisJMHgwMDU0LCAweDAwNTUsIDB4MDA1NiwgMHgwMDU3LAorCTB4MDA1OCwgMHgwMDU5LCAweDAwNWEsIDB4MDA1YiwKKwkweDAwNWMsIDB4MDA1ZCwgMHgwMDVlLCAweDAwNWYsCisJLyogMHg2MCovCisJMHgwMDYwLCAweDAwNjEsIDB4MDA2MiwgMHgwMDYzLAorCTB4MDA2NCwgMHgwMDY1LCAweDAwNjYsIDB4MDA2NywKKwkweDAwNjgsIDB4MDA2OSwgMHgwMDZhLCAweDAwNmIsCisJMHgwMDZjLCAweDAwNmQsIDB4MDA2ZSwgMHgwMDZmLAorCS8qIDB4NzAqLworCTB4MDA3MCwgMHgwMDcxLCAweDAwNzIsIDB4MDA3MywKKwkweDAwNzQsIDB4MDA3NSwgMHgwMDc2LCAweDAwNzcsCisJMHgwMDc4LCAweDAwNzksIDB4MDA3YSwgMHgwMDdiLAorCTB4MDA3YywgMHgwMDdkLCAweDAwN2UsIDB4MDA3ZiwKKwkvKiAweDgwKi8KKwkweDI1MDAsIDB4MjUwMiwgMHgyNTBjLCAweDI1MTAsCisJMHgyNTE0LCAweDI1MTgsIDB4MjUxYywgMHgyNTI0LAorCTB4MjUyYywgMHgyNTM0LCAweDI1M2MsIDB4MjU4MCwKKwkweDI1ODQsIDB4MjU4OCwgMHgyNThjLCAweDI1OTAsCisJLyogMHg5MCovCisJMHgyNTkxLCAweDI1OTIsIDB4MjU5MywgMHgyMzIwLAorCTB4MjVhMCwgMHgyMjE5LCAweDIyMWEsIDB4MjI0OCwKKwkweDIyNjQsIDB4MjI2NSwgMHgwMGEwLCAweDIzMjEsCisJMHgwMGIwLCAweDAwYjIsIDB4MDBiNywgMHgwMGY3LAorCS8qIDB4YTAqLworCTB4MjU1MCwgMHgyNTUxLCAweDI1NTIsIDB4MDQ1MSwKKwkweDA0NTQsIDB4MjU1NCwgMHgwNDU2LCAweDA0NTcsCisJMHgyNTU3LCAweDI1NTgsIDB4MjU1OSwgMHgyNTVhLAorCTB4MjU1YiwgMHgwNDkxLCAweDI1NWQsIDB4MjU1ZSwKKwkvKiAweGIwKi8KKwkweDI1NWYsIDB4MjU2MCwgMHgyNTYxLCAweDA0MDEsCisJMHgwNDA0LCAweDI1NjMsIDB4MDQwNiwgMHgwNDA3LAorCTB4MjU2NiwgMHgyNTY3LCAweDI1NjgsIDB4MjU2OSwKKwkweDI1NmEsIDB4MDQ5MCwgMHgyNTZjLCAweDAwYTksCisJLyogMHhjMCovCisJMHgwNDRlLCAweDA0MzAsIDB4MDQzMSwgMHgwNDQ2LAorCTB4MDQzNCwgMHgwNDM1LCAweDA0NDQsIDB4MDQzMywKKwkweDA0NDUsIDB4MDQzOCwgMHgwNDM5LCAweDA0M2EsCisJMHgwNDNiLCAweDA0M2MsIDB4MDQzZCwgMHgwNDNlLAorCS8qIDB4ZDAqLworCTB4MDQzZiwgMHgwNDRmLCAweDA0NDAsIDB4MDQ0MSwKKwkweDA0NDIsIDB4MDQ0MywgMHgwNDM2LCAweDA0MzIsCisJMHgwNDRjLCAweDA0NGIsIDB4MDQzNywgMHgwNDQ4LAorCTB4MDQ0ZCwgMHgwNDQ5LCAweDA0NDcsIDB4MDQ0YSwKKwkvKiAweGUwKi8KKwkweDA0MmUsIDB4MDQxMCwgMHgwNDExLCAweDA0MjYsCisJMHgwNDE0LCAweDA0MTUsIDB4MDQyNCwgMHgwNDEzLAorCTB4MDQyNSwgMHgwNDE4LCAweDA0MTksIDB4MDQxYSwKKwkweDA0MWIsIDB4MDQxYywgMHgwNDFkLCAweDA0MWUsCisJLyogMHhmMCovCisJMHgwNDFmLCAweDA0MmYsIDB4MDQyMCwgMHgwNDIxLAorCTB4MDQyMiwgMHgwNDIzLCAweDA0MTYsIDB4MDQxMiwKKwkweDA0MmMsIDB4MDQyYiwgMHgwNDE3LCAweDA0MjgsCisJMHgwNDJkLCAweDA0MjksIDB4MDQyNywgMHgwNDJhLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTAwWzI1Nl0gPSB7CisJMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgLyogMHgwMC0weDA3ICovCisJMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgLyogMHgwOC0weDBmICovCisJMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywgLyogMHgxMC0weDE3ICovCisJMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgLyogMHgxOC0weDFmICovCisJMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgLyogMHgyMC0weDI3ICovCisJMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwgLyogMHgyOC0weDJmICovCisJMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgLyogMHgzMC0weDM3ICovCisJMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgLyogMHgzOC0weDNmICovCisJMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgLyogMHg0MC0weDQ3ICovCisJMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgLyogMHg0OC0weDRmICovCisJMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgLyogMHg1MC0weDU3ICovCisJMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwgLyogMHg1OC0weDVmICovCisJMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgLyogMHg2MC0weDY3ICovCisJMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgLyogMHg2OC0weDZmICovCisJMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgLyogMHg3MC0weDc3ICovCisJMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgLyogMHg3OC0weDdmICovCisKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweDlhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KKwkweDAwLCAweGJmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGE4LTB4YWYgKi8KKwkweDljLCAweDAwLCAweDlkLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDllLCAvKiAweGIwLTB4YjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGI4LTB4YmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGMwLTB4YzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGM4LTB4Y2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGQwLTB4ZDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGQ4LTB4ZGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGUwLTB4ZTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGU4LTB4ZWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDlmLCAvKiAweGYwLTB4ZjcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UwNFsyNTZdID0geworCTB4MDAsIDB4YjMsIDB4MDAsIDB4MDAsIDB4YjQsIDB4MDAsIDB4YjYsIDB4YjcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4ZTEsIDB4ZTIsIDB4ZjcsIDB4ZTcsIDB4ZTQsIDB4ZTUsIDB4ZjYsIDB4ZmEsIC8qIDB4MTAtMHgxNyAqLworCTB4ZTksIDB4ZWEsIDB4ZWIsIDB4ZWMsIDB4ZWQsIDB4ZWUsIDB4ZWYsIDB4ZjAsIC8qIDB4MTgtMHgxZiAqLworCTB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZTYsIDB4ZTgsIDB4ZTMsIDB4ZmUsIC8qIDB4MjAtMHgyNyAqLworCTB4ZmIsIDB4ZmQsIDB4ZmYsIDB4ZjksIDB4ZjgsIDB4ZmMsIDB4ZTAsIDB4ZjEsIC8qIDB4MjgtMHgyZiAqLworCTB4YzEsIDB4YzIsIDB4ZDcsIDB4YzcsIDB4YzQsIDB4YzUsIDB4ZDYsIDB4ZGEsIC8qIDB4MzAtMHgzNyAqLworCTB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIDB4ZDAsIC8qIDB4MzgtMHgzZiAqLworCTB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4YzYsIDB4YzgsIDB4YzMsIDB4ZGUsIC8qIDB4NDAtMHg0NyAqLworCTB4ZGIsIDB4ZGQsIDB4ZGYsIDB4ZDksIDB4ZDgsIDB4ZGMsIDB4YzAsIDB4ZDEsIC8qIDB4NDgtMHg0ZiAqLworCTB4MDAsIDB4YTMsIDB4MDAsIDB4MDAsIDB4YTQsIDB4MDAsIDB4YTYsIDB4YTcsIC8qIDB4NTAtMHg1NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NTgtMHg1ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjAtMHg2NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NjgtMHg2ZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzAtMHg3NyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4NzgtMHg3ZiAqLworCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4MC0weDg3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg4OC0weDhmICovCisJMHhiZCwgMHhhZCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg5MC0weDk3ICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBwYWdlMjJbMjU2XSA9IHsKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDAwLTB4MDcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDA4LTB4MGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDEwLTB4MTcgKi8KKwkweDAwLCAweDk1LCAweDk2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDE4LTB4MWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDIwLTB4MjcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDI4LTB4MmYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDMwLTB4MzcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDM4LTB4M2YgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQwLTB4NDcgKi8KKwkweDk3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDQ4LTB4NGYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDUwLTB4NTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDU4LTB4NWYgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDk4LCAweDk5LCAweDAwLCAweDAwLCAvKiAweDYwLTB4NjcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBhZ2UyM1syNTZdID0geworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDAtMHgwNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MDgtMHgwZiAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTAtMHgxNyAqLworCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MTgtMHgxZiAqLworCTB4OTMsIDB4OWIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDB4MjAtMHgyNyAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFnZTI1WzI1Nl0gPSB7CisJMHg4MCwgMHgwMCwgMHg4MSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwMC0weDA3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MiwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgwOC0weDBmICovCisJMHg4MywgMHgwMCwgMHgwMCwgMHgwMCwgMHg4NCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxMC0weDE3ICovCisJMHg4NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4NiwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgxOC0weDFmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4NywgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyMC0weDI3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgyOC0weDJmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4OSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzMC0weDM3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4YSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHgzOC0weDNmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0MC0weDQ3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg0OC0weDRmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHgwMCwgMHhhNSwgMHgwMCwgMHgwMCwgMHhhOCwgLyogMHg1MC0weDU3ICovCisJMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHgwMCwgMHhhZSwgMHhhZiwgMHhiMCwgLyogMHg1OC0weDVmICovCisJMHhiMSwgMHhiMiwgMHgwMCwgMHhiNSwgMHgwMCwgMHgwMCwgMHhiOCwgMHhiOSwgLyogMHg2MC0weDY3ICovCisJMHhiYSwgMHhiYiwgMHhiYywgMHgwMCwgMHhiZSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg2OC0weDZmICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3MC0weDc3ICovCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMHg3OC0weDdmICovCisKKwkweDhiLCAweDAwLCAweDAwLCAweDAwLCAweDhjLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDgwLTB4ODcgKi8KKwkweDhkLCAweDAwLCAweDAwLCAweDAwLCAweDhlLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDg4LTB4OGYgKi8KKwkweDhmLCAweDkwLCAweDkxLCAweDkyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDkwLTB4OTcgKi8KKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweDk4LTB4OWYgKi8KKwkweDk0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAweGEwLTB4YTcgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpwYWdlX3VuaTJjaGFyc2V0WzI1Nl0gPSB7CisJcGFnZTAwLCBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBwYWdlMDQsIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICAKKwlOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgCisJTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIE5VTEwsICAgTlVMTCwgICBOVUxMLCAgIAorCU5VTEwsICAgTlVMTCwgICBwYWdlMjIsIHBhZ2UyMywgTlVMTCwgICBwYWdlMjUsIE5VTEwsICAgTlVMTCwgICAKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGNoYXJzZXQybG93ZXJbMjU2XSA9IHsKKwkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAvKiAweDAwLTB4MDcgKi8KKwkweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAvKiAweDA4LTB4MGYgKi8KKwkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAvKiAweDEwLTB4MTcgKi8KKwkweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAvKiAweDE4LTB4MWYgKi8KKwkweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAvKiAweDIwLTB4MjcgKi8KKwkweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLCAweDJkLCAweDJlLCAweDJmLCAvKiAweDI4LTB4MmYgKi8KKwkweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAvKiAweDMwLTB4MzcgKi8KKwkweDM4LCAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAvKiAweDM4LTB4M2YgKi8KKwkweDQwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDQwLTB4NDcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDQ4LTB4NGYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDUwLTB4NTcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDViLCAweDVjLCAweDVkLCAweDVlLCAweDVmLCAvKiAweDU4LTB4NWYgKi8KKwkweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAvKiAweDYwLTB4NjcgKi8KKwkweDY4LCAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAvKiAweDY4LTB4NmYgKi8KKwkweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAvKiAweDcwLTB4NzcgKi8KKwkweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAvKiAweDc4LTB4N2YgKi8KKworCTB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsIC8qIDB4ODAtMHg4NyAqLworCTB4ODgsIDB4ODksIDB4OGEsIDB4OGIsIDB4OGMsIDB4OGQsIDB4OGUsIDB4OGYsIC8qIDB4ODgtMHg4ZiAqLworCTB4OTAsIDB4OTEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIC8qIDB4OTAtMHg5NyAqLworCTB4OTgsIDB4OTksIDB4OWEsIDB4OWIsIDB4OWMsIDB4OWQsIDB4OWUsIDB4OWYsIC8qIDB4OTgtMHg5ZiAqLworCTB4YTAsIDB4YTEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsIC8qIDB4YTAtMHhhNyAqLworCTB4YTgsIDB4YTksIDB4YWEsIDB4YWIsIDB4YWMsIDB4YWQsIDB4YWUsIDB4YWYsIC8qIDB4YTgtMHhhZiAqLworCTB4YjAsIDB4YjEsIDB4YjIsIDB4YTMsIDB4YTQsIDB4YjUsIDB4YTYsIDB4YTcsIC8qIDB4YjAtMHhiNyAqLworCTB4YjgsIDB4YjksIDB4YmEsIDB4YmIsIDB4YmMsIDB4YWQsIDB4YmUsIDB4YmYsIC8qIDB4YjgtMHhiZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4YzAtMHhjNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4YzgtMHhjZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZDAtMHhkNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4ZDgtMHhkZiAqLworCTB4YzAsIDB4YzEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIC8qIDB4ZTAtMHhlNyAqLworCTB4YzgsIDB4YzksIDB4Y2EsIDB4Y2IsIDB4Y2MsIDB4Y2QsIDB4Y2UsIDB4Y2YsIC8qIDB4ZTgtMHhlZiAqLworCTB4ZDAsIDB4ZDEsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIC8qIDB4ZjAtMHhmNyAqLworCTB4ZDgsIDB4ZDksIDB4ZGEsIDB4ZGIsIDB4ZGMsIDB4ZGQsIDB4ZGUsIDB4ZGYsIC8qIDB4ZjgtMHhmZiAqLworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgY2hhcnNldDJ1cHBlclsyNTZdID0geworCTB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIC8qIDB4MDAtMHgwNyAqLworCTB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYsIC8qIDB4MDgtMHgwZiAqLworCTB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIC8qIDB4MTAtMHgxNyAqLworCTB4MTgsIDB4MTksIDB4MWEsIDB4MWIsIDB4MWMsIDB4MWQsIDB4MWUsIDB4MWYsIC8qIDB4MTgtMHgxZiAqLworCTB4MjAsIDB4MjEsIDB4MjIsIDB4MjMsIDB4MjQsIDB4MjUsIDB4MjYsIDB4MjcsIC8qIDB4MjAtMHgyNyAqLworCTB4MjgsIDB4MjksIDB4MmEsIDB4MmIsIDB4MmMsIDB4MmQsIDB4MmUsIDB4MmYsIC8qIDB4MjgtMHgyZiAqLworCTB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIC8qIDB4MzAtMHgzNyAqLworCTB4MzgsIDB4MzksIDB4M2EsIDB4M2IsIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2YsIC8qIDB4MzgtMHgzZiAqLworCTB4NDAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NDAtMHg0NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NDgtMHg0ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NTAtMHg1NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4NWIsIDB4NWMsIDB4NWQsIDB4NWUsIDB4NWYsIC8qIDB4NTgtMHg1ZiAqLworCTB4NjAsIDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIC8qIDB4NjAtMHg2NyAqLworCTB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsIDB4NGQsIDB4NGUsIDB4NGYsIC8qIDB4NjgtMHg2ZiAqLworCTB4NTAsIDB4NTEsIDB4NTIsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIC8qIDB4NzAtMHg3NyAqLworCTB4NTgsIDB4NTksIDB4NWEsIDB4N2IsIDB4N2MsIDB4N2QsIDB4N2UsIDB4N2YsIC8qIDB4NzgtMHg3ZiAqLworCisJMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgLyogMHg4MC0weDg3ICovCisJMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgLyogMHg4OC0weDhmICovCisJMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgLyogMHg5MC0weDk3ICovCisJMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgLyogMHg5OC0weDlmICovCisJMHhhMCwgMHhhMSwgMHhhMiwgMHhiMywgMHhiNCwgMHhhNSwgMHhiNiwgMHhiNywgLyogMHhhMC0weGE3ICovCisJMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhiZCwgMHhhZSwgMHhhZiwgLyogMHhhOC0weGFmICovCisJMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgLyogMHhiMC0weGI3ICovCisJMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgLyogMHhiOC0weGJmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhjMC0weGM3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhjOC0weGNmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhkMC0weGQ3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhkOC0weGRmICovCisJMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgLyogMHhlMC0weGU3ICovCisJMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgLyogMHhlOC0weGVmICovCisJMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgLyogMHhmMC0weGY3ICovCisJMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgLyogMHhmOC0weGZmICovCit9OworCitzdGF0aWMgaW50IHVuaTJjaGFyKHdjaGFyX3QgdW5pLCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCBib3VuZGxlbikKK3sKKwl1bnNpZ25lZCBjaGFyICp1bmkyY2hhcnNldDsKKwl1bnNpZ25lZCBjaGFyIGNsID0gdW5pICYgMHgwMGZmOworCXVuc2lnbmVkIGNoYXIgY2ggPSAodW5pICYgMHhmZjAwKSA+PiA4OworCisJaWYgKGJvdW5kbGVuIDw9IDApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJdW5pMmNoYXJzZXQgPSBwYWdlX3VuaTJjaGFyc2V0W2NoXTsKKwlpZiAodW5pMmNoYXJzZXQgJiYgdW5pMmNoYXJzZXRbY2xdKQorCQlvdXRbMF0gPSB1bmkyY2hhcnNldFtjbF07CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGFyMnVuaShjb25zdCB1bnNpZ25lZCBjaGFyICpyYXdzdHJpbmcsIGludCBib3VuZGxlbiwgd2NoYXJfdCAqdW5pKQoreworCSp1bmkgPSBjaGFyc2V0MnVuaVsqcmF3c3RyaW5nXTsKKwlpZiAoKnVuaSA9PSAweDAwMDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSB0YWJsZSA9IHsKKwkuY2hhcnNldAk9ICJrb2k4LXUiLAorCS51bmkyY2hhcgk9IHVuaTJjaGFyLAorCS5jaGFyMnVuaQk9IGNoYXIydW5pLAorCS5jaGFyc2V0Mmxvd2VyCT0gY2hhcnNldDJsb3dlciwKKwkuY2hhcnNldDJ1cHBlcgk9IGNoYXJzZXQydXBwZXIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9ubHNfa29pOF91KHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX25scygmdGFibGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9ubHNfa29pOF91KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9ubHMoJnRhYmxlKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ubHNfa29pOF91KQorbW9kdWxlX2V4aXQoZXhpdF9ubHNfa29pOF91KQorCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CmRpZmYgLS1naXQgYS9mcy9ubHMvbmxzX3V0ZjguYyBiL2ZzL25scy9ubHNfdXRmOC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMmM0MmYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9ubHMvbmxzX3V0ZjguYwpAQCAtMCwwICsxLDYxIEBACisvKgorICogTW9kdWxlIGZvciBoYW5kbGluZyB1dGY4IGp1c3QgbGlrZSBhbnkgb3RoZXIgY2hhcnNldC4KKyAqIEJ5IFVyYmFuIFdpZG1hcmsgMjAwMAorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCitzdGF0aWMgdW5zaWduZWQgY2hhciBpZGVudGl0eVsyNTZdOworCitzdGF0aWMgaW50IHVuaTJjaGFyKHdjaGFyX3QgdW5pLCB1bnNpZ25lZCBjaGFyICpvdXQsIGludCBib3VuZGxlbikKK3sKKwlpbnQgbjsKKworCWlmICggKG4gPSB1dGY4X3djdG9tYihvdXQsIHVuaSwgYm91bmRsZW4pKSA9PSAtMSkgeworCQkqb3V0ID0gJz8nOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbnQgY2hhcjJ1bmkoY29uc3QgdW5zaWduZWQgY2hhciAqcmF3c3RyaW5nLCBpbnQgYm91bmRsZW4sIHdjaGFyX3QgKnVuaSkKK3sKKwlpbnQgbjsKKworCWlmICggKG4gPSB1dGY4X21idG93Yyh1bmksIHJhd3N0cmluZywgYm91bmRsZW4pKSA9PSAtMSkgeworCQkqdW5pID0gMHgwMDNmOwkvKiA/ICovCisJCW4gPSAtRUlOVkFMOworCX0KKwlyZXR1cm4gbjsKK30KKworc3RhdGljIHN0cnVjdCBubHNfdGFibGUgdGFibGUgPSB7CisJLmNoYXJzZXQJPSAidXRmOCIsCisJLnVuaTJjaGFyCT0gdW5pMmNoYXIsCisJLmNoYXIydW5pCT0gY2hhcjJ1bmksCisJLmNoYXJzZXQybG93ZXIJPSBpZGVudGl0eSwJLyogbm8gY29udmVyc2lvbiAqLworCS5jaGFyc2V0MnVwcGVyCT0gaWRlbnRpdHksCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9ubHNfdXRmOCh2b2lkKQoreworCWludCBpOworCWZvciAoaT0wOyBpPDI1NjsgaSsrKQorCQlpZGVudGl0eVtpXSA9IGk7CisKKyAgICAgICAgcmV0dXJuIHJlZ2lzdGVyX25scygmdGFibGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9ubHNfdXRmOCh2b2lkKQoreworICAgICAgICB1bnJlZ2lzdGVyX25scygmdGFibGUpOworfQorCittb2R1bGVfaW5pdChpbml0X25sc191dGY4KQorbW9kdWxlX2V4aXQoZXhpdF9ubHNfdXRmOCkKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL250ZnMvQ2hhbmdlTG9nIGIvZnMvbnRmcy9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQyYWQxNQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsMTM1MCBAQAorVG9Eby9Ob3RlczoKKwktIEZpbmQgYW5kIGZpeCBidWdzLgorCS0gQ2hlY2twb2ludCBvciBkaXNhYmxlIHRoZSB1c2VyIHNwYWNlIGpvdXJuYWwgKCRVc25Kcm5sKS4KKwktIEluIGJldHdlZW4gbnRmc19wcmVwYXJlL2NvbW1pdF93cml0ZSwgbmVlZCBleGNsdXNpb24gYmV0d2VlbgorCSAgc2ltdWx0YW5lb3VzIGZpbGUgZXh0ZW5zaW9ucy4gTmVlZCBwZXJoYXBzIGFuIE5Jbm9SZXNpemVVbmRlcndheSgpCisJICBmbGFnIHdoaWNoIHdlIGNhbiBzZXQgaW4gbnRmc19wcmVwYXJlX3dyaXRlKCkgYW5kIGNsZWFyIGFnYWluIGluCisJICBudGZzX2NvbW1pdF93cml0ZSgpLiBKdXN0IGhhdmUgdG8gYmUgY2FyZWZ1bCBpbiByZWFkcGFnZS93cml0ZXBhZ2UsCisJICBhcyB3ZWxsIGFzIGluIHRydW5jYXRlLCB0aGF0IHdlIHBsYXkgbmljZS4uLiBXZSBtaWdodCBuZWVkIHRvIGhhdmUKKwkgIGEgZGF0YV9zaXplIGZpZWxkIGluIHRoZSBudGZzX2lub2RlIHRvIHN0b3JlIHRoZSByZWFsIGF0dHJpYnV0ZQorCSAgbGVuZ3RoLiBBbHNvIG5lZWQgdG8gYmUgY2FyZWZ1bCB3aXRoIGluaXRpYWxpemVkX3NpemUgZXh0ZW50aW9uIGluCisJICBudGZzX3ByZXBhcmVfd3JpdGUuIEJhc2ljYWxseSwganVzdCBiZSBfdmVyeV8gY2FyZWZ1bCBpbiB0aGlzIGNvZGUuLi4KKwkgIE9UT0gsIHBlcmhhcHMgaV9zZW0sIHdoaWNoIGlzIGhlbGQgYWNjcm9zcyBnZW5lcmljX2ZpbGVfd3JpdGUgaXMKKwkgIHN1ZmZpY2llbnQgZm9yIHN5bmNocm9uaXNhdGlvbiBoZXJlLiBXZSB0aGVuIGp1c3QgbmVlZCB0byBtYWtlIHN1cmUKKwkgIG50ZnNfcmVhZHBhZ2Uvd3JpdGVwYWdlL3RydW5jYXRlIGludGVyb3BlcmF0ZSBwcm9wZXJseSB3aXRoIHVzLgorCSAgVVBEQVRFOiBUaGUgYWJvdmUgaXMgYWxsIG9rIGFzIGl0IGlzIGR1ZSB0byBpX3NlbSBoZWxkLiAgVGhlIG9ubHkKKwkgIHRoaW5nIHRoYXQgbmVlZHMgdG8gYmUgY2hlY2tlZCBpcyBudGZzX3dyaXRlcGFnZSgpIHdoaWNoIGRvZXMgbm90CisJICBob2xkIGlfc2VtLiAgSXQgY2Fubm90IGNoYW5nZSBpX3NpemUgYnV0IGl0IG5lZWRzIHRvIGNvcGUgd2l0aCBhCisJICBjb25jdXJyZW50IGlfc2l6ZSBjaGFuZ2UuCisJLSBJbXBsZW1lbnQgbWZ0LmM6OnN5bmNfbWZ0X21pcnJvcl91bW91bnQoKS4gIFdlIGN1cnJlbnRseSB3aWxsIGp1c3QKKwkgIGxlYXZlIHRoZSB2b2x1bWUgZGlydHkgb24gdW1vdW50IGlmIHRoZSBmaW5hbCBpcHV0KHZvbC0+bWZ0X2lubykKKwkgIGNhdXNlcyBhIHdyaXRlIG9mIGFueSBtaXJyb3JlZCBtZnQgcmVjb3JkcyBkdWUgdG8gdGhlIG1mdCBtaXJyb3IKKwkgIGlub2RlIGhhdmluZyBiZWVuIGRpc2NhcmRlZCBhbHJlYWR5LiAgV2hldGhlciB0aGlzIGNhbiBhY3R1YWxseSBldmVyCisJICBoYXBwZW4gaXMgdW5jbGVhciBob3dldmVyIHNvIGl0IGlzIHdvcnRoIHdhaXRpbmcgdW50aWwgc29tZW9uZSBoaXRzCisJICB0aGUgcHJvYmxlbS4KKwktIEVuYWJsZSB0aGUgY29kZSBmb3Igc2V0dGluZyB0aGUgTlQ0IGNvbXBhdGliaWxpdHkgZmxhZyB3aGVuIHdlIHN0YXJ0CisJICBtYWtpbmcgTlRGUyAxLjIgc3BlY2lmaWMgbW9kaWZpY2F0aW9ucy4KKworMi4xLjIzLVdJUAorCisJLSBBZGQgcHJpbnRrIHJhdGUgbGltaXRpbmcgZm9yIG50ZnNfd2FybmluZygpIGFuZCBudGZzX2Vycm9yKCkgd2hlbgorCSAgY29tcGlsZWQgd2l0aG91dCBkZWJ1Zy4gIFRoaXMgYXZvaWRzIGEgcG9zc2libGUgZGVuaWFsIG9mIHNlcnZpY2UKKwkgIGF0dGFjay4gIFRoYW5rcyB0byBDYXJsLURhbmllbCBIYWlsZmluZ2VyIGZyb20gU3VTRSBmb3IgcG9pbnRpbmcgdGhpcworCSAgb3V0LgorCisyLjEuMjIgLSBNYW55IGJ1ZyBhbmQgcmFjZSBmaXhlcyBhbmQgZXJyb3IgaGFuZGxpbmcgaW1wcm92ZW1lbnRzLgorCisJLSBJbXByb3ZlIGVycm9yIGhhbmRsaW5nIGluIGZzL250ZnMvaW5vZGUuYzo6bnRmc190cnVuY2F0ZSgpLgorCS0gQ2hhbmdlIGZzL250ZnMvaW5vZGUuYzo6bnRmc190cnVuY2F0ZSgpIHRvIHJldHVybiBhbiBlcnJvciBjb2RlCisJICBpbnN0ZWFkIG9mIHZvaWQgYW5kIHByb3ZpZGUgYSBoZWxwZXIgbnRmc190cnVuY2F0ZV92ZnMoKSBmb3IgdGhlCisJICB2ZnMgLT50cnVuY2F0ZSBtZXRob2QuCisJLSBBZGQgYSBuZXcgbnRmcyBpbm9kZSBmbGFnIE5Jbm9UcnVuY2F0ZUZhaWxlZCgpIGFuZCBtb2RpZnkKKwkgIGZzL250ZnMvaW5vZGUuYzo6bnRmc190cnVuY2F0ZSgpIHRvIHNldCBhbmQgY2xlYXIgaXQgYXBwcm9wcmlhdGVseS4KKwktIEZpeCBtaW5fc2l6ZSBhbmQgbWF4X3NpemUgZGVmaW5pdGlvbnMgaW4gQVRUUl9ERUYgc3RydWN0dXJlIGluCisJICBmcy9udGZzL2xheW91dC5oIHRvIGJlIHNpZ25lZC4KKwktIEFkZCBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBoYW5kbGluZyBoZWxwZXJzIHRvIGZzL250ZnMvYXR0cmliLltoY106CisJICBudGZzX2F0dHJfc2l6ZV9ib3VuZHNfY2hlY2soKSwgbnRmc19hdHRyX2Nhbl9iZV9ub25fcmVzaWRlbnQoKSwgYW5kCisJICBudGZzX2F0dHJfY2FuX2JlX3Jlc2lkZW50KCksIHdoaWNoIGluIHR1cm4gdXNlIHRoZSBuZXcgcHJpdmF0ZSBoZWxwZXIKKwkgIG50ZnNfYXR0cl9maW5kX2luX2F0dHJkZWYoKS4KKwktIEluIGZzL250ZnMvYW9wcy5jOjptYXJrX250ZnNfcmVjb3JkX2RpcnR5KCksIHRha2UgdGhlCisJICBtYXBwaW5nLT5wcml2YXRlX2xvY2sgYXJvdW5kIHRoZSBkaXJ0eWluZyBvZiB0aGUgYnVmZmVyIGhlYWRzCisJICBhbmFsYWdvdXMgdG8gdGhlIHdheSBpdCBpcyBkb25lIGluIF9fc2V0X3BhZ2VfZGlydHlfYnVmZmVycygpLgorCS0gRW5zdXJlIHRoZSBtZnQgcmVjb3JkIHNpemUgZG9lcyBub3QgZXhjZWVkIHRoZSBQQUdFX0NBQ0hFX1NJWkUgYXQKKwkgIG1vdW50IHRpbWUgYXMgdGhpcyBjYW5ub3Qgd29yayB3aXRoIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLgorCS0gQ2hlY2sgZm9yIGxvY2F0aW9uIG9mIGF0dHJpYnV0ZSBuYW1lIGFuZCBpbXByb3ZlIGVycm9yIGhhbmRsaW5nIGluCisJICBnZW5lcmFsIGluIGZzL250ZnMvaW5vZGUuYzo6bnRmc19yZWFkX2xvY2tlZF9pbm9kZSgpIGFuZCBmcmllbmRzLgorCS0gSW4gZnMvbnRmcy9hb3BzLmM6Om50ZnNfd3JpdGVwYWdlKCksIGlmIHRoZSBwYWdlIGlzIGZ1bGx5IG91dHNpZGUKKwkgIGlfc2l6ZSwgaS5lLiByYWNlIHdpdGggdHJ1bmNhdGUsIGludmFsaWRhdGUgdGhlIGJ1ZmZlcnMgb24gdGhlIHBhZ2UKKwkgIHNvIHRoYXQgdGhleSBiZWNvbWUgZnJlZWFibGUgYW5kIGhlbmNlIHRoZSBwYWdlIGRvZXMgbm90IGxlYWsuCisJLSBSZW1vdmUgdW51c2VkIGZ1bmN0aW9uIGZzL250ZnMvcnVubGlzdC5jOjpudGZzX3JsX21lcmdlKCkuICAoQWRyaWFuCisJICBCdW5rKQorCS0gRml4IHN0dXBpZCBidWcgaW4gZnMvbnRmcy9hdHRyaWIuYzo6bnRmc19hdHRyX2ZpbmQoKSB0aGF0IHJlc3VsdGVkIGluCisJICBhIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZSBpbiB0aGUgZXJyb3IgY29kZSBwYXRoIHdoZW4gYSBjb3JydXB0CisJICBhdHRyaWJ1dGUgd2FzIGZvdW5kLiAgKFRoYW5rcyB0byBEb21lbiBQdW5jZXIgZm9yIHRoZSBidWcgcmVwb3J0LikKKwktIEFkZCBNT0RVTEVfVkVSU0lPTigpIHRvIGZzL250ZnMvc3VwZXIuYy4KKwktIE1ha2Ugc2V2ZXJhbCBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcyBzdGF0aWMuICAoQWRyaWFuIEJ1bmspCisJLSBNb2RpZnkgZnMvbnRmcy9hb3BzLmM6Om1hcmtfbnRmc19yZWNvcmRfZGlydHkoKSBzbyBpdCBhbGxvY2F0ZXMKKwkgIGJ1ZmZlcnMgZm9yIHRoZSBwYWdlIGlmIHRoZXkgYXJlIG5vdCBwcmVzZW50IGFuZCB0aGVuIG1hcmtzIHRoZQorCSAgYnVmZmVycyBiZWxvbmdpbmcgdG8gdGhlIG50ZnMgcmVjb3JkIGRpcnR5LiAgVGhpcyBjYXVzZXMgdGhlIGJ1ZmZlcnMKKwkgIHRvIGJlY29tZSBidXN5IGFuZCBoZW5jZSB0aGV5IGFyZSBzYWZlIGZyb20gcmVtb3ZhbCB1bnRpbCB0aGUgcGFnZQorCSAgaGFzIGJlZW4gd3JpdHRlbiBvdXQuCisJLSBGaXggc3R1cGlkIGJ1ZyBpbiBmcy9udGZzL2F0dHJpYi5jOjpudGZzX2V4dGVybmFsX2F0dHJfZmluZCgpIGluIHRoZQorCSAgZXJyb3IgaGFuZGxpbmcgY29kZSBwYXRoIHRoYXQgcmVzdWx0ZWQgaW4gYSBCVUcoKSBkdWUgdG8gdHJ5aW5nIHRvCisJICB1bm1hcCBhbiBleHRlbnQgbWZ0IHJlY29yZCB3aGVuIHRoZSBtYXBwaW5nIG9mIGl0IGhhZCBmYWlsZWQgYW5kIGl0CisJICB0aHVzIHdhcyBub3QgbWFwcGVkLiAgKFRoYW5rcyB0byBLZW4gTWFjRmVycmluIGZvciB0aGUgYnVnIHJlcG9ydC4pCisJLSBEcm9wIHRoZSBydW5saXN0IGxvY2sgYWZ0ZXIgdGhlIHZjbiBoYXMgYmVlbiByZWFkIGluCisJICBmcy9udGZzL2xjbmFsbG9jLmM6Ol9fbnRmc19jbHVzdGVyX2ZyZWUoKS4KKwktIFJld3JpdGUgaGFuZGxpbmcgb2YgbXVsdGkgc2VjdG9yIHRyYW5zZmVyIGVycm9ycy4gIFdlIG5vdyBkbyBub3Qgc2V0CisJICBQYWdlRXJyb3IoKSB3aGVuIHN1Y2ggZXJyb3JzIGFyZSBkZXRlY3RlZCBpbiB0aGUgYXN5bmMgaS9vIGhhbmRsZXIKKwkgIGZzL250ZnMvYW9wcy5jOjpudGZzX2VuZF9idWZmZXJfYXN5bmNfcmVhZCgpLiAgQWxsIHVzZXJzIG9mIG1zdAorCSAgcHJvdGVjdGVkIGF0dHJpYnV0ZXMgbm93IGNoZWNrIHRoZSBtYWdpYyBvZiBlYWNoIG50ZnMgcmVjb3JkIGFzIHRoZXkKKwkgIHVzZSBpdCBhbmQgYWN0IGFwcHJvcHJpYXRlbHkuICBUaGlzIGhhcyB0aGUgZWZmZWN0IG9mIG1ha2luZyBlcnJvcnMKKwkgIGdyYW51bGFyIHBlciBudGZzIHJlY29yZCByYXRoZXIgdGhhbiBwZXIgcGFnZSB3aGljaCBzb2x2ZXMgdGhlIGNhc2UKKwkgIHdoZXJlIHdlIGNhbm5vdCBhY2Nlc3MgYW55IG9mIHRoZSBudGZzIHJlY29yZHMgaW4gYSBwYWdlIHdoZW4gYQorCSAgc2luZ2xlIG9uZSBvZiB0aGVtIGhhZCBhbiBtc3QgZXJyb3IuICAoVGhhbmtzIHRvIEtlbiBNYWNGZXJyaW4gZm9yCisJICB0aGUgYnVnIHJlcG9ydC4pCisJLSBGaXggZXJyb3IgaGFuZGxpbmcgaW4gZnMvbnRmcy9xdW90YS5jOjpudGZzX21hcmtfcXVvdGFzX291dF9vZl9kYXRlKCkKKwkgIHdoZXJlIHdlIGZhaWxlZCB0byByZWxlYXNlIGlfc2VtIG9uIHRoZSAkUXVvdGEvJFEgYXR0cmlidXRlIGlub2RlLgorCS0gRml4IGJ1ZyBpbiBoYW5kbGluZyBvZiBiYWQgaW5vZGVzIGluIGZzL250ZnMvbmFtZWkuYzo6bnRmc19sb29rdXAoKS4KKwktIEFkZCBtYXBwaW5nIG9mIHVubWFwcGVkIGJ1ZmZlcnMgdG8gYWxsIHJlbWFpbmluZyBjb2RlIHBhdGhzLCBpLmUuCisJICBmcy9udGZzL2FvcHMuYzo6bnRmc193cml0ZV9tc3RfYmxvY2soKSwgbWZ0LmM6Om50ZnNfc3luY19tZnRfbWlycm9yKCksCisJICBhbmQgd3JpdGVfbWZ0X3JlY29yZF9ub2xvY2soKS4gIEZyb20gbm93IG9uIHdlIHJlcXVpcmUgdGhhdCB0aGUKKwkgIGNvbXBsZXRlIHJ1bmxpc3QgZm9yIHRoZSBtZnQgbWlycm9yIGlzIGFsd2F5cyBtYXBwZWQgaW50byBtZW1vcnkuCisJLSBBZGQgY3JlYXRpb24gb2YgYnVmZmVycyB0byBmcy9udGZzL21mdC5jOjpudGZzX3N5bmNfbWZ0X21pcnJvcigpLgorCS0gSW1wcm92ZSBlcnJvciBoYW5kbGluZyBpbiBmcy9udGZzL2FvcHMuYzo6bnRmc197cmVhZCx3cml0ZX1fYmxvY2soKS4KKwktIENsZWFudXAgZnMvbnRmcy9hb3BzLmM6Om50ZnNfe3JlYWQsd3JpdGV9cGFnZSgpIHNpbmNlIHdlIGtub3cgdGhhdCBhCisJICByZXNpZGVudCBhdHRyaWJ1dGUgd2lsbCBiZSBzbWFsbGVyIHRoYW4gYSBwYWdlIHdoaWNoIG1ha2VzIHRoZSBjb2RlCisJICBzaW1wbGVyLiAgQWxzbyBtYWtlIHRoZSBjb2RlIG1vcmUgdG9sZXJhbnQgdG8gY29uY3VycmVudCAtPnRydW5jYXRlLgorCisyLjEuMjEgLSBGaXggc29tZSByYWNlcyBhbmQgYnVncywgcmV3cml0ZSBtZnQgd3JpdGUgY29kZSwgYWRkIG1mdCBhbGxvY2F0b3IuCisKKwktIEltcGxlbWVudCBleHRlbnQgbWZ0IHJlY29yZCBkZWFsbG9jYXRpb24KKwkgIGZzL250ZnMvbWZ0LmM6Om50ZnNfZXh0ZW50X21mdF9yZWNvcmRfZnJlZSgpLgorCS0gU3BsaXR0IHJ1bmxpc3QgcmVsYXRlZCBmdW5jdGlvbnMgb2ZmIGZyb20gYXR0cmliLltoY10gdG8gcnVubGlzdC5baGNdLgorCS0gQWRkIHZvbC0+bWZ0X2RhdGFfcG9zIGFuZCBpbml0aWFsaXplIGl0IGF0IG1vdW50IHRpbWUuCisJLSBSZW5hbWUgaW5pdF9ydW5saXN0KCkgdG8gbnRmc19pbml0X3J1bmxpc3QoKSwgbnRmc192Y25fdG9fbGNuKCkgdG8KKwkgIG50ZnNfcmxfdmNuX3RvX2xjbigpLCBkZWNvbXByZXNzX21hcHBpbmdfcGFpcnMoKSB0bworCSAgbnRmc19tYXBwaW5nX3BhaXJzX2RlY29tcHJlc3MoKSwgbnRmc19tZXJnZV9ydW5saXN0cygpIHRvCisJICBudGZzX3J1bmxpc3RzX21lcmdlKCkgYW5kIGFkYXB0IGFsbCBjYWxsZXJzLgorCS0gQWRkIGZzL250ZnMvcnVubGlzdC5baGNdOjpudGZzX2dldF9ucl9zaWduaWZpY2FudF9ieXRlcygpLAorCSAgbnRmc19nZXRfc2l6ZV9mb3JfbWFwcGluZ19wYWlycygpLCBudGZzX3dyaXRlX3NpZ25pZmljYW50X2J5dGVzKCksCisJICBhbmQgbnRmc19tYXBwaW5nX3BhaXJzX2J1aWxkKCksIGFkYXB0ZWQgZnJvbSBsaWJudGZzLgorCS0gTWFrZSBmcy9udGZzL2xjbmFsbG9jLmM6Om50ZnNfY2x1c3Rlcl9mcmVlX2Zyb21fcmxfbm9sb2NrKCkgbm90CisJICBzdGF0aWMgYW5kIGFkZCBhIGRlY2xhcmF0aW9uIGZvciBpdCB0byBsY25hbGxvYy5oLgorCS0gQWRkIGZzL250ZnMvbGNuYWxsb2MuaDo6bnRmc19jbHVzdGVyX2ZyZWVfZnJvbV9ybCgpIHdoaWNoIGlzIGEgc3RhdGljCisJICBpbmxpbmUgd3JhcHBlciBmb3IgbnRmc19jbHVzdGVyX2ZyZWVfZnJvbV9ybF9ub2xvY2soKSB3aGljaCB0YWtlcyB0aGUKKwkgIGNsdXN0ZXIgYml0bWFwIGxvY2sgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgY2FsbC4KKwktIEFkZCBmcy9udGZzL2F0dHJpYi5baGNdOjpudGZzX2F0dHJfcmVjb3JkX3Jlc2l6ZSgpLgorCS0gSW1wbGVtZW50IHRoZSBlcXVpdmFsZW50IG9mIG1lbXNldCgpIGZvciBhbiBudGZzIGF0dHJpYnV0ZSBpbgorCSAgZnMvbnRmcy9hdHRyaWIuW2hjXTo6bnRmc19hdHRyX3NldCgpIGFuZCBzd2l0Y2gKKwkgIGZzL250ZnMvbG9nZmlsZS5jOjpudGZzX2VtcHR5X2xvZ2ZpbGUoKSB0byB1c2luZyBpdC4KKwktIFJlbW92ZSB1bm5lY2Vzc2FyeSBjYXN0cyBmcm9tIExDTl8qIGNvbnN0YW50cy4KKwktIEltcGxlbWVudCBmcy9udGZzL3J1bmxpc3QuYzo6bnRmc19ybF90cnVuY2F0ZV9ub2xvY2soKS4KKwktIEFkZCBNRlRfUkVDT1JEX09MRCBhcyBhIGNvcHkgb2YgTUZUX1JFQ09SRCBpbiBmcy9udGZzL2xheW91dC5oIGFuZAorCSAgY2hhbmdlIE1GVF9SRUNPUkQgdG8gY29udGFpbiB0aGUgTlRGUyAzLjErIHNwZWNpZmljIGZpZWxkcy4KKwktIEFkZCBhIGhlbHBlciBmdW5jdGlvbiBmcy9udGZzL2FvcHMuYzo6bWFya19udGZzX3JlY29yZF9kaXJ0eSgpIHdoaWNoCisJICBtYXJrcyBhbGwgYnVmZmVycyBiZWxvbmdpbmcgdG8gYW4gbnRmcyByZWNvcmQgZGlydHksIGZvbGxvd2VkIGJ5CisJICBtYXJraW5nIHRoZSBwYWdlIHRoZSBudGZzIHJlY29yZCBpcyBpbiBkaXJ0eSBhbmQgYWxzbyBtYXJraW5nIHRoZSB2ZnMKKwkgIGlub2RlIGNvbnRhaW5pbmcgdGhlIG50ZnMgcmVjb3JkIGRpcnR5IChJX0RJUlRZX1BBR0VTKS4KKwktIFN3aXRjaCBmcy9udGZzL2luZGV4Lmg6Om50ZnNfaW5kZXhfZW50cnlfbWFya19kaXJ0eSgpIHRvIHVzaW5nIHRoZQorCSAgbmV3IGhlbHBlciBmcy9udGZzL2FvcHMuYzo6bWFya19udGZzX3JlY29yZF9kaXJ0eSgpIGFuZCByZW1vdmUgdGhlIG5vCisJICBsb25nZXIgbmVlZGVkIGZzL250ZnMvaW5kZXguW2hjXTo6X19udGZzX2luZGV4X2VudHJ5X21hcmtfZGlydHkoKS4KKwktIE1vdmUgbnRmc197dW4sfW1hcF9wYWdlKCkgZnJvbSBudGZzLmggdG8gYW9wcy5oIGFuZCBmaXggcmVzdWx0aW5nCisJICBpbmNsdWRlIGVycm9ycy4KKwktIE1vdmUgdGhlIHR5cGVkZWZzIGZvciBydW5saXN0X2VsZW1lbnQgYW5kIHJ1bmxpc3QgZnJvbSB0eXBlcy5oIHRvCisJICBydW5saXN0LmggYW5kIGZpeCByZXN1bHRpbmcgaW5jbHVkZSBlcnJvcnMuCisJLSBSZW1vdmUgdW51c2VkIHtfXyx9Zm9ybWF0X21mdF9yZWNvcmQoKSBmcm9tIGZzL250ZnMvbWZ0LmMuCisJLSBNb2RpZnkgZnMvbnRmcy9tZnQuYzo6X19tYXJrX21mdF9yZWNvcmRfZGlydHkoKSB0byB1c2UgdGhlIGhlbHBlcgorCSAgbWFya19udGZzX3JlY29yZF9kaXJ0eSgpIHdoaWNoIGFsc28gY2hhbmdlcyB0aGUgYmVoYXZpb3VyIGluIHRoYXQgd2UKKwkgIG5vdyBzZXQgdGhlIGJ1ZmZlcnMgYmVsb25naW5nIHRvIHRoZSBtZnQgcmVjb3JkIGRpcnR5IGFzIHdlbGwgYXMgdGhlCisJICBwYWdlIGl0c2VsZi4KKwktIFVwZGF0ZSBmcy9udGZzL21mdC5jOjp3cml0ZV9tZnRfcmVjb3JkX25vbG9jaygpIGFuZCBzeW5jX21mdF9taXJyb3IoKQorCSAgdG8gY29wZSB3aXRoIHRoZSBmYWN0IHRoYXQgdGhlcmUgbm93IGFyZSBkaXJ0eSBidWZmZXJzIGluIG1mdCBwYWdlcy4KKwktIFVwZGF0ZSBmcy9udGZzL2lub2RlLmM6Om50ZnNfd3JpdGVfaW5vZGUoKSB0byBhbHNvIHVzZSB0aGUgaGVscGVyCisJICBtYXJrX250ZnNfcmVjb3JkX2RpcnR5KCkgYW5kIHRodXMgdG8gc2V0IHRoZSBidWZmZXJzIGJlbG9uZ2luZyB0byB0aGUKKwkgIG1mdCByZWNvcmQgZGlydHkgYXMgd2VsbCBhcyB0aGUgcGFnZSBpdHNlbGYuCisJLSBGaXggY29tcGlsZXIgd2FybmluZ3Mgb24geDg2LTY0IGluIGZzL250ZnMvZGlyLmMuICAoUmFuZHkgRHVubGFwLAorCSAgc2xpZ2h0bHkgbW9kaWZpZWQgYnkgbWUpCisJLSBBZGQgZnMvbnRmcy9tZnQuYzo6dHJ5X21hcF9tZnRfcmVjb3JkKCkgd2hpY2ggZmFpbHMgd2l0aCAtRUFMUkVBRFkgaWYKKwkgIHRoZSBtZnQgcmVjb3JkIGlzIGFscmVhZHkgbG9ja2VkIGFuZCBvdGhlcndpc2UgYmVoYXZlcyB0aGUgc2FtZSB3YXkKKwkgIGFzIGZzL250ZnMvbWZ0LmM6Om1hcF9tZnRfcmVjb3JkKCkuCisJLSBNb2RpZnkgZnMvbnRmcy9tZnQuYzo6d3JpdGVfbWZ0X3JlY29yZF9ub2xvY2soKSBzbyB0aGF0IGl0IG9ubHkKKwkgIHdyaXRlcyB0aGUgbWZ0IHJlY29yZCBpZiB0aGUgYnVmZmVycyBiZWxvbmdpbmcgdG8gaXQgYXJlIGRpcnR5LgorCSAgT3RoZXJ3aXNlIHdlIGFzc3VtZSB0aGF0IGl0IHdhcyB3cml0dGVuIG91dCBieSBvdGhlciBtZWFucyBhbHJlYWR5LgorCS0gQXR0ZW1wdGluZyB0byB3cml0ZSBvdXRzaWRlIGluaXRpYWxpemVkIHNpemUgaXMgX25vdF8gYSBidWcgc28gcmVtb3ZlCisJICB0aGUgYnVnIGNoZWNrIGZyb20gZnMvbnRmcy9hb3BzLmM6Om50ZnNfd3JpdGVfbXN0X2Jsb2NrKCkuICBJdCBpcyBpbgorCSAgZmFjdCByZXF1aXJlZCB0byB3cml0ZSBvdXRzaWRlIGluaXRpYWxpemVkIHNpemUgd2hlbiBwcmVwYXJpbmcgdG8KKwkgIGV4dGVuZCB0aGUgaW5pdGlhbGl6ZWQgc2l6ZS4KKwktIE1hcCB0aGUgcGFnZSBpbnN0ZWFkIG9mIHVzaW5nIHBhZ2VfYWRkcmVzcygpIGJlZm9yZSB3cml0aW5nIHRvIGl0IGluCisJICBmcy9udGZzL2FvcHMuYzo6bnRmc19tZnRfd3JpdGVwYWdlKCkuCisJLSBQcm92aWRlIGV4Y2x1c2lvbiBiZXR3ZWVuIG9wZW5pbmcgYW4gaW5vZGUgLyBtYXBwaW5nIGFuIG1mdCByZWNvcmQKKwkgIGFuZCBhY2Nlc3NpbmcgdGhlIG1mdCByZWNvcmQgaW4gZnMvbnRmcy9tZnQuYzo6bnRmc19tZnRfd3JpdGVwYWdlKCkKKwkgIGJ5IHNldHRpbmcgdGhlIHBhZ2Ugbm90IHVwdG9kYXRlIHRocm91Z2hvdXQgbnRmc19tZnRfd3JpdGVwYWdlKCkuCisJLSBDbGVhciB0aGUgcGFnZSB1cHRvZGF0ZSBmbGFnIGluIGZzL250ZnMvYW9wcy5jOjpudGZzX3dyaXRlX21zdF9ibG9jaygpCisJICB0byBlbnN1cmUgbm9vbmUgY2FuIHNlZSB0aGUgcGFnZSB3aGlsc3QgdGhlIG1zdCBmaXh1cHMgYXJlIGFwcGxpZWQuCisJLSBBZGQgdGhlIGhlbHBlciBmcy9udGZzL21mdC5jOjpudGZzX21heV93cml0ZV9tZnRfcmVjb3JkKCkgd2hpY2gKKwkgIGNoZWNrcyBpZiBhbiBtZnQgcmVjb3JkIG1heSBiZSB3cml0dGVuIG91dCBzYWZlbHkgb2J0YWluaW5nIGFueQorCSAgbmVjZXNzYXJ5IGxvY2tzIGluIHRoZSBwcm9jZXNzLiAgVGhpcyBpcyB1c2VkIGJ5CisJICBmcy9udGZzL2FvcHMuYzo6bnRmc193cml0ZV9tc3RfYmxvY2soKS4KKwktIE1vZGlmeSBmcy9udGZzL2FvcHMuYzo6bnRmc193cml0ZV9tc3RfYmxvY2soKSB0byBhbHNvIHdvcmsgZm9yCisJICB3cml0aW5nIG1mdCByZWNvcmRzIGFuZCBpbXByb3ZlIGl0cyBlcnJvciBoYW5kbGluZyBpbiB0aGUgcHJvY2Vzcy4KKwkgIE5vdyBpZiBhbnkgb2YgdGhlIHJlY29yZHMgaW4gdGhlIHBhZ2UgZmFpbCB0byBiZSB3cml0dGVuIG91dCwgYWxsCisJICBvdGhlciByZWNvcmRzIHdpbGwgYmUgd3JpdHRlbiBvdXQgaW5zdGVhZCBvZiBhYm9ydGluZyBjb21wbGV0ZWx5LgorCS0gUmVtb3ZlIG50ZnNfbWZ0X2FvcHMgYW5kIHVwZGF0ZSBhbGwgdXNlcnMgdG8gdXNlIG50ZnNfbXN0X2FvcHMuCisJLSBNb2RpZnkgZnMvbnRmcy9pbm9kZS5jOjpudGZzX3JlYWRfbG9ja2VkX2lub2RlKCkgdG8gc2V0IHRoZQorCSAgbnRmc19tc3RfYW9wcyBmb3IgYWxsIGlub2RlcyB3aGljaCBhcmUgTklub01zdFByb3RlY3RlZCgpIGFuZAorCSAgbnRmc19hb3BzIGZvciBhbGwgb3RoZXIgaW5vZGVzLgorCS0gUmVuYW1lIGZzL250ZnMvbWZ0LmM6OnN5bmNfbWZ0X21pcnJvcnssX3Vtb3VudH0oKSB0bworCSAgbnRmc19zeW5jX21mdF9taXJyb3J7LF91bW91bnR9KCkgYW5kIGNoYW5nZSB0aGVpciBwYXJhbWV0ZXJzIHNvIHRoZXkKKwkgIG5vIGxvbmdlciByZXF1aXJlIGFuIG50ZnMgaW5vZGUgdG8gYmUgcHJlc2VudC4gIFVwZGF0ZSBhbGwgY2FsbGVycy4KKwktIENsZWFudXAgdGhlIGVycm9yIGhhbmRsaW5nIGluIGZzL250ZnMvbWZ0LmM6Om50ZnNfc3luY19tZnRfbWlycm9yKCkuCisJLSBDbGVhciB0aGUgcGFnZSB1cHRvZGF0ZSBmbGFnIGluIGZzL250ZnMvbWZ0LmM6Om50ZnNfc3luY19tZnRfbWlycm9yKCkKKwkgIHRvIGVuc3VyZSBub29uZSBjYW4gc2VlIHRoZSBwYWdlIHdoaWxzdCB0aGUgbXN0IGZpeHVwcyBhcmUgYXBwbGllZC4KKwktIFJlbW92ZSB0aGUgbm8gbG9uZ2VyIG5lZWRlZCBmcy9udGZzL21mdC5jOjpudGZzX21mdF93cml0ZXBhZ2UoKSBhbmQKKwkgIGZzL250ZnMvbWZ0LmM6OnRyeV9tYXBfbWZ0X3JlY29yZCgpLgorCS0gRml4IGNhbGxlcnMgb2YgZnMvbnRmcy9hb3BzLmM6Om1hcmtfbnRmc19yZWNvcmRfZGlydHkoKSB0byBjYWxsIGl0CisJICB3aXRoIHRoZSBudGZzIGlub2RlIHdoaWNoIGNvbnRhaW5zIHRoZSBwYWdlIHJhdGhlciB0aGFuIHRoZSBudGZzCisJICBpbm9kZSB0aGUgbWZ0IHJlY29yZCBvZiB3aGljaCBpcyBpbiB0aGUgcGFnZS4KKwktIEZpeCByYWNlIGNvbmRpdGlvbiBpbiBmcy9udGZzL2lub2RlLmM6Om50ZnNfcHV0X2lub2RlKCkgYnkgbW92aW5nIHRoZQorCSAgaW5kZXggaW5vZGUgYml0bWFwIGlub2RlIHJlbGVhc2UgY29kZSBmcm9tIHRoZXJlIHRvCisJICBmcy9udGZzL2lub2RlLmM6Om50ZnNfY2xlYXJfYmlnX2lub2RlKCkuICAoVGhhbmtzIHRvIENocmlzdG9waAorCSAgSGVsbHdpZyBmb3Igc3BvdHRpbmcgdGhpcy4pCisJLSBGaXggcmFjZSBjb25kaXRpb24gaW4gZnMvbnRmcy9pbm9kZS5jOjpudGZzX3B1dF9pbm9kZSgpIGJ5IHRha2luZyB0aGUKKwkgIGlub2RlIHNlbWFwaG9yZSBhcm91bmQgdGhlIGNvZGUgdGhhdCBzZXRzIG5pLT5pdHlwZS5pbmRleC5ibXBfaW5vIHRvCisJICBOVUxMIGFuZCByZW9yZ2FuaXplIHRoZSBjb2RlIHRvIG9wdGltaXplIGl0IGEgYml0LiAgKFRoYW5rcyB0bworCSAgQ2hyaXN0b3BoIEhlbGx3aWcgZm9yIHNwb3R0aW5nIHRoaXMuKQorCS0gTW9kaWZ5IGZzL250ZnMvYW9wcy5jOjptYXJrX250ZnNfcmVjb3JkX2RpcnR5KCkgdG8gbm8gbG9uZ2VyIHRha2UgdGhlCisJICBudGZzIGlub2RlIGFzIGEgcGFyYW1ldGVyIGFzIHRoaXMgaXMgY29uZnVzaW5nIGFuZCBtaXNsZWFkaW5nIGFuZCB0aGUKKwkgIG5lZWRlZCBudGZzIGlub2RlIGlzIGF2YWlsYWJsZSB2aWEgTlRGU19JKHBhZ2UtPm1hcHBpbmctPmhvc3QpLgorCSAgQWRhcHQgYWxsIGNhbGxlcnMgdG8gdGhpcyBjaGFuZ2UuCisJLSBNb2RpZnkgZnMvbnRmcy9tZnQuYzo6d3JpdGVfbWZ0X3JlY29yZF9ub2xvY2soKSBhbmQKKwkgIGZzL250ZnMvYW9wcy5jOjpudGZzX3dyaXRlX21zdF9ibG9jaygpIHRvIG9ubHkgY2hlY2sgdGhlIGRpcnR5IHN0YXRlCisJICBvZiB0aGUgZmlyc3QgYnVmZmVyIGluIGEgcmVjb3JkIGFuZCB0byB0YWtlIHRoaXMgYXMgdGhlIG50ZnMgcmVjb3JkCisJICBkaXJ0eSBzdGF0ZS4gIFdlIGNhbm5vdCBsb29rIGF0IHRoZSBkaXJ0eSBzdGF0ZSBmb3Igc3Vic2VxdWVudAorCSAgYnVmZmVycyBiZWNhdXNlIHdlIG1pZ2h0IGJlIHJhY2luZyB3aXRoCisJICBmcy9udGZzL2FvcHMuYzo6bWFya19udGZzX3JlY29yZF9kaXJ0eSgpLgorCS0gTW92ZSB0aGUgc3RhdGljIGlubGluZSBudGZzX2luaXRfYmlnX2lub2RlKCkgZnJvbSBmcy9udGZzL2lub2RlLmMgdG8KKwkgIGlub2RlLmggYW5kIG1ha2UgZnMvbnRmcy9pbm9kZS5jOjpfX250ZnNfaW5pdF9pbm9kZSgpIG5vbi1zdGF0aWMgYW5kCisJICBhZGQgYSBkZWNsYXJhdGlvbiBmb3IgaXQgdG8gaW5vZGUuaC4gIEZpeCBzb21lIGNvbXBpbGF0aW9uIGlzc3VlcworCSAgdGhhdCByZXN1bHRlZCBkdWUgdG8gI2luY2x1ZGVzIGFuZCBoZWFkZXIgZmlsZSBpbnRlcmRlcGVuZGVuY2llcy4KKwktIFNpbXBsaWZ5IHNldHVwIG9mIGlfbW9kZSBpbiBmcy9udGZzL2lub2RlLmM6Om50ZnNfcmVhZF9sb2NrZWRfaW5vZGUoKS4KKwktIEFkZCBoZWxwZXJzIGZzL250ZnMvbGF5b3V0Lmg6Ok1LX01SRUYoKSBhbmQgTUtfTEVfTVJFRigpLgorCS0gTW9kaWZ5IGZzL250ZnMvbWZ0LmM6Om1hcF9leHRlbnRfbWZ0X3JlY29yZCgpIHRvIG9ubHkgdmVyaWZ5IHRoZSBtZnQKKwkgIHJlY29yZCBzZXF1ZW5jZSBudW1iZXIgaWYgaXQgaXMgc3BlY2lmaWVkIChpLmUuIG5vdCB6ZXJvKS4KKwktIEFkZCBmcy9udGZzL21mdC5baGNdOjpudGZzX21mdF9yZWNvcmRfYWxsb2MoKSBhbmQgdmFyaW91cyBoZWxwZXIKKwkgIGZ1bmN0aW9ucyB1c2VkIGJ5IGl0LgorCS0gVXBkYXRlIERvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbnRmcy50eHQgd2l0aCBpbnN0cnVjdGlvbnMgb24gaG93IHRvCisJICB1c2UgdGhlIERldmljZS1NYXBwZXIgZHJpdmVyIHdpdGggTlRGUyBmdGRpc2svTERNIHJhaWQuICBUaGlzIHJlbW92ZXMKKwkgIHRoZSBsaW5lYXIgcmFpZCBwcm9ibGVtIHdpdGggdGhlIFNvZnR3YXJlIFJBSUQgLyBNRCBkcml2ZXIgd2hlbiBvbmUKKwkgIG9yIG1vcmUgb2YgdGhlIGRldmljZXMgaGFzIGFuIG9kZCBudW1iZXIgb2Ygc2VjdG9ycy4KKworMi4xLjIwIC0gRml4IHR3byBzdHVwaWQgYnVncyBpbnRyb2R1Y2VkIGluIDIuMS4xOCByZWxlYXNlLgorCisJLSBGaXggc3R1cGlkIGJ1ZyBpbiBmcy9udGZzL2F0dHJpYi5jOjpudGZzX2F0dHJfcmVpbml0X3NlYXJjaF9jdHgoKQorCSAgd2hlcmUgd2UgZGlkIG5vdCBjbGVhciBjdHgtPmFsX2VudHJ5IGJ1dCBpdCB3YXMgc3RpbGwgc2V0IGR1ZSB0bworCSAgY2hhbmdlcyBpbiBudGZzX2F0dHJfbG9va3VwKCkgYW5kIG50ZnNfZXh0ZXJuYWxfYXR0cl9maW5kKCkgaW4KKwkgIHBhcnRpY3VsYXIuCisJLSBGaXggYW5vdGhlciBzdHVwaWQgYnVnIGluIGZzL250ZnMvYXR0cmliLmM6Om50ZnNfZXh0ZXJuYWxfYXR0cl9maW5kKCkKKwkgIHdoZXJlIHdlIGZvcmdvdCB0byB1bm1hcCB0aGUgZXh0ZW50IG1mdCByZWNvcmQgd2hlbiB3ZSBoYWQgZmluaXNoZWQKKwkgIGVudW1lcmF0aW5nIGFuIGF0dHJpYnV0ZSB3aGljaCBjYXVzZWQgYSBidWcgY2hlY2sgdG8gdHJpZ2dlciB3aGVuIHRoZQorCSAgVkZTIGNhbGxzIC0+Y2xlYXJfaW5vZGUuCisKKzIuMS4xOSAtIE1hbnkgY2xlYW51cHMsIGltcHJvdmVtZW50cywgYW5kIGEgbWlub3IgYnVnIGZpeC4KKworCS0gVXBkYXRlIC0+c2V0YXR0ciAoZnMvbnRmcy9pbm9kZS5jOjpudGZzX3NldGF0dHIoKSkgdG8gcmVmdXNlIHRvCisJICBjaGFuZ2UgdGhlIHVpZCwgZ2lkLCBhbmQgbW9kZSBvZiBhbiBpbm9kZSBhcyB3ZSBkbyBub3Qgc3VwcG9ydCBOVEZTCisJICBBQ0xzIHlldC4KKwktIFJlbW92ZSBCS0wgdXNlIGZyb20gbnRmc19zZXRhdHRyKCkgc3luY2luZyB1cCB3aXRoIHRoZSByZXN0IG9mIHRoZQorCSAga2VybmVsLgorCS0gR2V0IHJpZCBvZiB0aGUgdWdseSB0cmFuc3BhcmVudCB1bmlvbiBpbiBmcy9udGZzL2Rpci5jOjpudGZzX3JlYWRkaXIoKQorCSAgYW5kIG50ZnNfZmlsbGRpcigpIGFzIHBlciBzdWdnZXN0aW9uIGZyb20gQWwgVmlyby4KKwktIENoYW5nZSAnXDAnIGFuZCBMJ1wwJyB0byBzaW1wbHkgMCBhcyBwZXIgYWR2aWNlIGZyb20gTGludXMgVG9ydmFsZHMuCisJLSBVcGRhdGUgLT50cnVuY2F0ZSAoZnMvbnRmcy9pbm9kZS5jOjpudGZzX3RydW5jYXRlKCkpIHRvIGNoZWNrIGlmIHRoZQorCSAgaW5vZGUgc2l6ZSBoYXMgY2hhbmdlZCBhbmQgdG8gb25seSBvdXRwdXQgYW4gZXJyb3IgaWYgc28uCisJLSBSZW5hbWUgZnMvbnRmcy9hdHRyaWIuaDo6YXR0cmlidXRlX3ZhbHVlX2xlbmd0aCgpIHRvIG50ZnNfYXR0cl9zaXplKCkuCisJLSBBZGQgbGV7MTYsMzIsNjR9IGFzIHdlbGwgYXMgc2xlezE2LDMyLDY0fSBkYXRhIHR5cGVzIHRvCisJICBmcy9udGZzL3R5cGVzLmguCisJLSBDaGFuZ2UgbnRmc2NoYXIgdG8gYmUgbGUxNiBpbnN0ZWFkIG9mIHUxNiBpbiBmcy9udGZzL3R5cGVzLmguCisJLSBBZGQgbGUgdmVyc2lvbnMgb2YgVkNOLCBMQ04sIGFuZCBMU04gY2FsbGVkIGxlVkNOLCBsZUxDTiwgYW5kIGxlTFNOLAorCSAgcmVzcGVjdGl2ZWx5LCB0byBmcy9udGZzL3R5cGVzLmguCisJLSBVcGRhdGUgZW5kaWFubmVzcyBjb252ZXJzaW9uIG1hY3JvcyBpbiBmcy9udGZzL2VuZGlhbi5oIHRvIHVzZSB0aGUKKwkgIG5ldyB0eXBlcyBhcyBhcHByb3ByaWF0ZS4KKwktIERvIHByb3BlciB0eXBlIGNhc3Rpbmcgd2hlbiB1c2luZyBzbGU2NF90b19jcHVwKCkgaW4gZnMvbnRmcy9kaXIuYworCSAgYW5kIGluZGV4LmMuCisJLSBBZGQgbGVNRlRfUkVGIGRhdGEgdHlwZSB0byBmcy9udGZzL2xheW91dC5oLgorCS0gVXBkYXRlIGFsbCBOVEZTIGhlYWRlciBmaWxlcyB3aXRoIHRoZSBuZXcgbGl0dGxlIGVuZGlhbiBkYXRhIHR5cGVzLgorCSAgQWZmZWN0ZWQgZmlsZXMgYXJlIGZzL250ZnMvbGF5b3V0LmgsIGxvZ2ZpbGUuaCwgYW5kIHRpbWUuaC4KKwktIERvIHByb3BlciB0eXBlIGNhc3Rpbmcgd2hlbiB1c2luZyBudGZzX2lzXypfcmVjb3JkcCgpIGluCisJICBmcy9udGZzL2xvZ2ZpbGUuYywgbWZ0LmMsIGFuZCBzdXBlci5jLiAKKwktIEZpeCBhbGwgdGhlIHNwYXJzZSBiaXR3aXNlIHdhcm5pbmdzLiAgSGFkIHRvIGNoYW5nZSBhbGwgdGhlIHR5cGVkZWYKKwkgIGVudW1zIHN0b3JpbmcgbGl0dGxlIGVuZGlhbiB2YWx1ZXMgdG8gc2ltcGxlIGVudW1zIHBsdXMgYSB0eXBlZGVmIGZvcgorCSAgdGhlIGRhdGF0eXBlIHRvIG1ha2Ugc3BhcnNlIGhhcHB5LgorCS0gRml4IGEgYnVnIGZvdW5kIGJ5IHRoZSBuZXcgc3BhcnNlIGJpdHdpc2Ugd2FybmluZ3Mgd2hlcmUgdGhlIGRlZmF1bHQKKwkgIHVwY2FzZSB0YWJsZSB3YXMgZGVmaW5lZCBhcyBhIHBvaW50ZXIgdG8gd2NoYXJfdCByYXRoZXIgdGhhbiBudGZzY2hhcgorCSAgaW4gZnMvbnRmcy9udGZzLmggYW5kIHN1cGVyLmMuCisJLSBDaGFuZ2Uge2NvbnN0Xyx9Y3B1X3RvX2xlezE2LDMyfSgwKSB0byBqdXN0IDAgYXMgc3VnZ2VzdGVkIGJ5IEFsIFZpcm8uCisKKzIuMS4xOCAtIEZpeCBzY2hlZHVsaW5nIGxhdGVuY2llcyBhdCBtb3VudCB0aW1lIGFzIHdlbGwgYXMgYW4gZW5kaWFubmVzcyBidWcuCisKKwktIFJlbW92ZSB2b2wtPm5yX21mdF9yZWNvcmRzIGFzIGl0IHdhcyBwcmV0dHkgbWVhbmluZ2xlc3MgYW5kIG9wdGltaXplCisJICB0aGUgY2FsY3VsYXRpb24gb2YgdG90YWwvZnJlZSBpbm9kZXMgYXMgdXNlZCBieSBzdGF0ZnMoKS4KKwktIEZpeCBzY2hlZHVsaW5nIGxhdGVuY2llcyBpbiBudGZzX2ZpbGxfc3VwZXIoKSBieSBkcm9wcGluZyB0aGUgQktMCisJICBiZWNhdXNlIHRoZSBjb2RlIGl0c2VsZiBpcyB1c2luZyB0aGUgbnRmc19sb2NrIHNlbWFwaG9yZSB3aGljaAorCSAgcHJvdmlkZXMgc2FmZSBsb2NraW5nLiAgKEluZ28gTW9sbmFyKQorCS0gRml4IGEgcG90ZW50aWFsIGJ1ZyBpbiBmcy9udGZzL21mdC5jOjptYXBfZXh0ZW50X21mdF9yZWNvcmQoKSB0aGF0CisJICBjb3VsZCBvY2N1ciBpbiB0aGUgZnV0dXJlIGZvciB3aGVuIHdlIHN0YXJ0IGNsb3NpbmcvZnJlZWluZyBleHRlbnQKKwkgIGlub2RlcyBpZiB3ZSBkb24ndCBzZXQgYmFzZV9uaS0+ZXh0LmV4dGVudF9udGZzX2lub3MgdG8gTlVMTCBhZnRlcgorCSAgd2UgZnJlZSBpdC4KKwktIFJlbmFtZSB7ZmluZCxsb29rdXB9X2F0dHIoKSB0byBudGZzX2F0dHJfe2ZpbmQsbG9va3VwfSgpIGFzIHdlbGwgYXMKKwkgIGZpbmRfZXh0ZXJuYWxfYXR0cigpIHRvIG50ZnNfZXh0ZXJuYWxfYXR0cl9maW5kKCkgdG8gY2xlYW51cCB0aGUKKwkgIG5hbWVzcGFjZSBhIGJpdCBhbmQgdG8gYmUgbW9yZSBjb25zaXN0ZW50IHdpdGggbGlibnRmcy4KKwktIFJlbmFtZSB7e3JlLH1pbml0LGdldCxwdXR9X2F0dHJfc2VhcmNoX2N0eCgpIHRvCisJICBudGZzX2F0dHJfe3tyZSx9aW5pdCxnZXQscHV0fV9zZWFyY2hfY3R4KCkgYXMgd2VsbCBhcyB0aGUgdHlwZQorCSAgYXR0cl9zZWFyY2hfY29udGV4dCB0byBudGZzX2F0dHJfc2VhcmNoX2N0eC4KKwktIEZvcmNlIHVzZSBvZiBudGZzX2F0dHJfZmluZCgpIGluIG50ZnNfYXR0cl9sb29rdXAoKSB3aGVuIHNlYXJjaGluZworCSAgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCBhdHRyaWJ1dGUgaXRzZWxmLgorCS0gRml4IGVuZGlhbm5lc3MgYnVnIGluIG50ZnNfZXh0ZXJuYWxfYXR0cl9maW5kKCkuCisJLSBDaGFuZ2UgbnRmc197ZXh0ZXJuYWxfLH1hdHRyX2ZpbmQoKSB0byByZXR1cm4gMCBvbiBzdWNjZXNzLCAtRU5PRU5UCisJICBpZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBmb3VuZCwgYW5kIC1FSU8gb24gcmVhbCBlcnJvci4gIEluIHRoZSBjYXNlCisJICBvZiAtRU5PRU5ULCB0aGUgc2VhcmNoIGNvbnRleHQgaXMgdXBkYXRlZCB0byBkZXNjcmliZSB0aGUgYXR0cmlidXRlCisJICBiZWZvcmUgd2hpY2ggdGhlIGF0dHJpYnV0ZSBiZWluZyBzZWFyY2hlZCBmb3Igd291bGQgbmVlZCB0byBiZQorCSAgaW5zZXJ0ZWQgaWYgc3VjaCBhbiBhY3Rpb24gd2VyZSB0byBiZSBkZXNpcmVkIGFuZCBpbiB0aGUgY2FzZSBvZgorCSAgbnRmc19leHRlcm5hbF9hdHRyX2ZpbmQoKSB0aGUgc2VhcmNoIGNvbnRleHQgaXMgYWxzbyB1cGRhdGVkIHRvCisJICBpbmRpY2F0ZSB0aGUgYXR0cmlidXRlIGxpc3QgZW50cnkgYmVmb3JlIHdoaWNoIHRoZSBhdHRyaWJ1dGUgbGlzdAorCSAgZW50cnkgb2YgdGhlIGF0dHJpYnV0ZSBiZWluZyBzZWFyY2hlZCBmb3Igd291bGQgbmVlZCB0byBiZSBpbnNlcnRlZAorCSAgaWYgc3VjaCBhbiBhY3Rpb24gd2VyZSB0byBiZSBkZXNpcmVkLiAgQWxzbyBtYWtlIG50ZnNfZmluZF9hdHRyKCkKKwkgIHN0YXRpYyBhbmQgcmVtb3ZlIGl0cyBwcm90b3R5cGUgZnJvbSBhdHRyaWIuaCBhcyBpdCBpcyBub3QgdXNlZAorCSAgYW55d2hlcmUgb3RoZXIgdGhhbiBhdHRyaWIuYy4gIFVwZGF0ZSBudGZzX2F0dHJfbG9va3VwKCkgYW5kIGFsbAorCSAgY2FsbGVycyBvZiBudGZzX3tleHRlcm5hbCx9YXR0cl97ZmluZCxsb29rdXB9KCkgZm9yIHRoZSBuZXcgcmV0dXJuCisJICB2YWx1ZXMuCisJLSBNaW5vciBjbGVhbnVwIG9mIGZzL250ZnMvaW5vZGUuYzo6bnRmc19pbml0X2xvY2tlZF9pbm9kZSgpLgorCisyLjEuMTcgLSBGaXggYnVncyBpbiBtb3VudCB0aW1lIGVycm9yIGNvZGUgcGF0aHMgYW5kIG90aGVyIHVwZGF0ZXMuCisKKwktIEltcGxlbWVudCBiaXRtYXAgbW9kaWZpY2F0aW9uIGNvZGUgKGZzL250ZnMvYml0bWFwLltoY10pLiAgVGhpcworCSAgaW5jbHVkZXMgZnVuY3Rpb25zIHRvIHNldC9jbGVhciBhIHNpbmdsZSBiaXQgb3IgYSBydW4gb2YgYml0cy4KKwktIEFkZCBmcy9udGZzL2F0dHJpYi5baGNdOjpudGZzX2ZpbmRfdmNuKCkgd2hpY2ggcmV0dXJucyB0aGUgbG9ja2VkCisJICBydW5saXN0IGVsZW1lbnQgY29udGFpbmluZyBhIHBhcnRpY3VsYXIgdmNuLiAgSXQgYWxzbyB0YWtlcyBjYXJlIG9mCisJICBtYXBwaW5nIGFueSBuZWVkZWQgcnVubGlzdCBmcmFnbWVudHMuCisJLSBJbXBsZW1lbnQgY2x1c3RlciAoZGUtKWFsbG9jYXRpb24gY29kZSAoZnMvbnRmcy9sY25hbGxvYy5baGNdKS4KKwktIExvYWQgYXR0cmlidXRlIGRlZmluaXRpb24gdGFibGUgZnJvbSAkQXR0ckRlZiBhdCBtb3VudCB0aW1lLgorCS0gRml4IGJ1Z3MgaW4gbW91bnQgdGltZSBlcnJvciBjb2RlIHBhdGhzIGludm9sdmluZyAoZGUpYWxsb2NhdGlvbiBvZgorCSAgdGhlIGRlZmF1bHQgYW5kIHZvbHVtZSB1cGNhc2UgdGFibGVzLgorCS0gUmVtb3ZlIG50ZnNfbnJfbW91bnRzIGFzIGl0IGlzIG5vIGxvbmdlciB1c2VkLgorCisyLjEuMTYgLSBJbXBsZW1lbnQgYWNjZXNzIHRpbWUgdXBkYXRlcywgZmlsZSBzeW5jLCBhc3luYyBpbywgYW5kIHJlYWQvd3JpdGV2LgorCisJLSBBZGQgc3VwcG9ydCBmb3IgcmVhZHYvd3JpdGV2IGFuZCBhaW9fcmVhZC9haW9fd3JpdGUgKGZzL250ZnMvZmlsZS5jKS4KKwkgIFRoaXMgaXMgZG9uZSBieSBzZXR0aW5nIHRoZSBhcHByb3ByaWF0ZSBmaWxlIG9wZXJhdGlvbnMgcG9pbnRlcnMgdG8KKwkgIHRoZSBnZW5lcmljIGhlbHBlciBmdW5jdGlvbnMgcHJvdmlkZWQgYnkgbW0vZmlsZW1hcC5jLgorCS0gSW1wbGVtZW50IGZzeW5jLCBmZGF0YXN5bmMsIGFuZCBtc3luYyBib3RoIGZvciBmaWxlcyAoZnMvbnRmcy9maWxlLmMpCisJICBhbmQgZGlyZWN0b3JpZXMgKGZzL250ZnMvZGlyLmMpLgorCS0gQWRkIHN1cHBvcnQgZm9yIHthLG0sY310aW1lIHVwZGF0ZXMgdG8gaW5vZGUuYzo6bnRmc193cml0ZV9pbm9kZSgpLgorCSAgTm90ZSwgZXhjZXB0IGZvciB0aGUgcm9vdCBkaXJlY3RvcnkgYW5kIGFueSBvdGhlciBzeXN0ZW0gZmlsZXMgb3BlbmVkCisJICBieSB0aGUgdXNlciwgdGhlIHN5c3RlbSBmaWxlcyB3aWxsIG5vdCBoYXZlIHRoZWlyIGFjY2VzcyB0aW1lcworCSAgdXBkYXRlZCBhcyB0aGV5IGFyZSBvbmx5IGFjY2Vzc2VkIGF0IHRoZSBpbm9kZSBsZXZlbCBhbiBoZW5jZSB0aGUKKwkgIGZpbGUgbGV2ZWwgZnVuY3Rpb25zIHdoaWNoIGNhdXNlIHRoZSB0aW1lcyB0byBiZSB1cGRhdGVkIGFyZSBuZXZlcgorCSAgaW52b2tlZC4KKworMi4xLjE1IC0gSW52YWxpZGF0ZSBxdW90YXMgd2hlbiAocmUpbW91bnRpbmcgcmVhZC13cml0ZS4KKworCS0gQWRkIG5ldyBlbGVtZW50IGl0eXBlLmluZGV4LmNvbGxhdGlvbl9ydWxlIHRvIHRoZSBudGZzIGlub2RlCisJICBzdHJ1Y3R1cmUgYW5kIHNldCBpdCBhcHByb3ByaWF0ZWx5IGluIG50ZnNfcmVhZF9sb2NrZWRfaW5vZGUoKS4KKwktIEltcGxlbWVudCBhIG5ldyBpbm9kZSB0eXBlICJpbmRleCIgdG8gYWxsb3cgZWZmaWNpZW50IGFjY2VzcyB0byB0aGUKKwkgIGluZGljZXMgZm91bmQgaW4gdmFyaW91cyBzeXN0ZW0gZmlsZXMgYW5kIGFkYXB0IGlub2RlIGhhbmRsaW5nCisJICBhY2NvcmRpbmdseSAoZnMvbnRmcy9pbm9kZS5baGNdKS4gIEFuIGluZGV4IGlub2RlIGlzIGVzc2VudGlhbGx5IGFuCisJICBhdHRyaWJ1dGUgaW5vZGUgKE5Jbm9BdHRyKCkgaXMgdHJ1ZSkgd2l0aCBhbiBhdHRyaWJ1dGUgdHlwZSBvZgorCSAgQVRfSU5ERVhfQUxMT0NBVElPTi4gIEFzIHN1Y2gsIGl0IGlzIG5vIGxvbmdlciBhbGxvd2VkIHRvIGNhbGwKKwkgIG50ZnNfYXR0cl9pZ2V0KCkgd2l0aCBhbiBhdHRyaWJ1dGUgdHlwZSBvZiBBVF9JTkRFWF9BTExPQ0FUSU9OIGFzCisJICB0aGVyZSB3b3VsZCBiZSBubyB3YXkgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBub3JtYWwgYXR0cmlidXRlIGlub2RlcworCSAgYW5kIGluZGV4IGlub2Rlcy4gIFRoZSBmdW5jdGlvbiB0byBvYnRhaW4gYW4gaW5kZXggaW5vZGUgaXMKKwkgIG50ZnNfaW5kZXhfaWdldCgpIGFuZCBpdCB1c2VzIHRoZSBoZWxwZXIgZnVuY3Rpb24KKwkgIG50ZnNfcmVhZF9sb2NrZWRfaW5kZXhfaW5vZGUoKS4gIE5vdGUsIHdlIGRvIG5vdCBvdmVybG9hZAorCSAgbnRmc19hdHRyX2lnZXQoKSBhcyBpbmRpY2VzIGNvbnNpc3Qgb2YgbXVsdGlwbGUgYXR0cmlidXRlcyBzbyB1c2luZworCSAgbnRmc19hdHRyX2lnZXQoKSB0byBvYnRhaW4gYW4gaW5kZXggaW5vZGUgd291bGQgYmUgY29uZnVzaW5nLgorCS0gRW5zdXJlIHRoYXQgdGhlcmUgaXMgbm8gb3ZlcmZsb3cgd2hlbiBkb2luZyBwYWdlLT5pbmRleCA8PAorCSAgUEFHRV9DQUNIRV9TSElGVCBieSBjYXN0aW5nIHBhZ2UtPmluZGV4IHRvIHM2NCBpbiBmcy9udGZzL2FvcHMuYy4KKwktIFVzZSBhdG9taWMga21hcCBpbnN0ZWFkIG9mIGttYXAoKSBpbiBmcy9udGZzL2FvcHMuYzo6bnRmc19yZWFkX3BhZ2UoKQorCSAgYW5kIG50ZnNfcmVhZF9ibG9jaygpLgorCS0gVXNlIGNhc2Ugc2Vuc2l0aXZlIGF0dHJpYnV0ZSBsb29rdXBzIGluc3RlYWQgb2YgY2FzZSBpbnNlbnNpdGl2ZSBvbmVzLgorCS0gTG9jayBhbGwgcGFnZSBjYWNoZSBwYWdlcyBiZWxvbmdpbmcgdG8gbXN0IHByb3RlY3RlZCBhdHRyaWJ1dGVzIHdoaWxlCisJICBhY2Nlc3NpbmcgdGhlbSB0byBlbnN1cmUgd2UgbmV2ZXIgc2VlIGNvcnJ1cHQgZGF0YSB3aGlsZSB0aGUgcGFnZSBpcworCSAgdW5kZXIgd3JpdGVvdXQuCisJLSBBZGQgZnJhbWV3b3JrIGZvciBnZW5lcmljIG50ZnMgY29sbGF0aW9uIChmcy9udGZzL2NvbGxhdGlvbi5baGNdKS4KKwkgIFdlIGhhdmUgbnRmc19pc19jb2xsYXRpb25fcnVsZV9zdXBwb3J0ZWQoKSB0byBjaGVjayBpZiB0aGUgY29sbGF0aW9uCisJICBydWxlIHlvdSB3YW50IHRvIHVzZSBpcyBzdXBwb3J0ZWQgYW5kIG50ZnNfY29sbGF0aW9uKCkgd2hpY2ggYWN0dWFsbHkKKwkgIGNvbGxhdGVzIHR3byBkYXRhIGl0ZW1zLiAgV2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCBDT0xMQVRJT05fQklOQVJZCisJICBhbmQgQ09MTEFUSU9OX05UT0ZTX1VMT05HIGJ1dCBzdXBwb3J0IGZvciBvdGhlciBjb2xsYXRpb24gcnVsZXMgd2lsbAorCSAgYmUgYWRkZWQgYXMgdGhlIG5lZWQgYXJpc2VzLgorCS0gQWRkIGEgbmV3IHR5cGUsIG50ZnNfaW5kZXhfY29udGV4dCwgdG8gYWxsb3cgcmV0cmlldmFsIG9mIGFuIGluZGV4CisJICBlbnRyeSB1c2luZyB0aGUgY29ycmVzcG9uZGluZyBpbmRleCBrZXkuICBUbyBnZXQgYW4gaW5kZXggY29udGV4dCwKKwkgIHVzZSBudGZzX2luZGV4X2N0eF9nZXQoKSBhbmQgdG8gcmVsZWFzZSBpdCwgdXNlIG50ZnNfaW5kZXhfY3R4X3B1dCgpLgorCSAgVGhpcyBhbHNvIGFkZHMgYSBuZXcgc2xhYiBjYWNoZSBmb3IgdGhlIGluZGV4IGNvbnRleHRzLiAgVG8gbG9va3VwIGEKKwkgIGtleSBpbiBhbiBpbmRleCBpbm9kZSwgdXNlIG50ZnNfaW5kZXhfbG9va3VwKCkuICBBZnRlciBtb2RpZnlpbmcgYW4KKwkgIGluZGV4IGVudHJ5LCBjYWxsIG50ZnNfaW5kZXhfZW50cnlfZmx1c2hfZGNhY2hlX3BhZ2UoKSBmb2xsb3dlZCBieQorCSAgbnRmc19pbmRleF9lbnRyeV9tYXJrX2RpcnR5KCkgdG8gZW5zdXJlIHRoZSBjaGFuZ2VzIGFyZSB3cml0dGVuIG91dAorCSAgdG8gZGlzay4gIEZvciBkZXRhaWxzIHNlZSBmcy9udGZzL2luZGV4LltoY10uICBOb3RlLCBhdCBwcmVzZW50LCBpZgorCSAgYW4gaW5kZXggZW50cnkgaXMgaW4gdGhlIGluZGV4IGFsbG9jYXRpb24gYXR0cmlidXRlIHJhdGhlciB0aGFuIHRoZQorCSAgaW5kZXggcm9vdCBhdHRyaWJ1dGUgaXQgd2lsbCBub3QgYmUgd3JpdHRlbiBvdXQgKHlvdSB3aWxsIGdldCBhCisJICB3YXJuaW5nIG1lc3NhZ2UgYWJvdXQgZGlzY2FyZGVkIGNoYW5nZXMgaW5zdGVhZCkuCisJLSBMb2FkIHRoZSBxdW90YSBmaWxlICgkUXVvdGEpIGFuZCBjaGVjayBpZiBxdW90YSB0cmFja2luZyBpcyBlbmFibGVkCisJICBhbmQgaWYgc28sIG1hcmsgdGhlIHF1b3RhcyBvdXQgb2YgZGF0ZS4gIFRoaXMgY2F1c2VzIHdpbmRvd3MgdG8KKwkgIHJlc2NhbiB0aGUgdm9sdW1lIG9uIGJvb3QgYW5kIHVwZGF0ZSBhbGwgcXVvdGEgZW50cmllcy4KKwktIEFkZCBhIHNldF9wYWdlX2RpcnR5IGFkZHJlc3Mgc3BhY2Ugb3BlcmF0aW9uIGZvciBudGZzX21bZnNddF9hb3BzLgorCSAgSXQgaXMgc2ltcGx5IHNldCB0byBfX3NldF9wYWdlX2RpcnR5X25vYnVmZmVycygpIHRvIG1ha2Ugc3VyZSB0aGF0CisJICBydW5uaW5nIHNldF9wYWdlX2RpcnR5KCkgb24gYSBwYWdlIGNvbnRhaW5pbmcgbWZ0L250ZnMgcmVjb3JkcyB3aWxsCisJICBub3QgYWZmZWN0IHRoZSBkaXJ0eSBzdGF0ZSBvZiB0aGUgcGFnZSBidWZmZXJzLgorCS0gQWRkIGZzL250ZnMvaW5kZXguYzo6X19udGZzX2luZGV4X2VudHJ5X21hcmtfZGlydHkoKSB3aGljaCBzZXRzIGFsbAorCSAgYnVmZmVycyB0aGF0IGFyZSBpbnNpZGUgdGhlIG50ZnMgcmVjb3JkIGluIHRoZSBwYWdlIGRpcnR5IGFmdGVyIHdoaWNoCisJICBpdCBzZXRzIHRoZSBwYWdlIGRpcnR5LiAgVGhpcyBhbGxvd3MgLT53cml0ZXBhZ2UgdG8gb25seSB3cml0ZSB0aGUKKwkgIGRpcnR5IGluZGV4IHJlY29yZHMgcmF0aGVyIHRoYW4gaGF2aW5nIHRvIHdyaXRlIGFsbCB0aGUgcmVjb3JkcyBpbgorCSAgdGhlIHBhZ2UuICBNb2RpZnkgZnMvbnRmcy9pbmRleC5oOjpudGZzX2luZGV4X2VudHJ5X21hcmtfZGlydHkoKSB0bworCSAgdXNlIHRoaXMgcmF0aGVyIHRoYW4gX19zZXRfcGFnZV9kaXJ0eV9ub2J1ZmZlcnMoKS4KKwktIEltcGxlbWVudCBmcy9udGZzL2FvcHMuYzo6bnRmc193cml0ZV9tc3RfYmxvY2soKSB3aGljaCBlbmFibGVzIHRoZQorCSAgd3JpdGluZyBvZiBwYWdlIGNhY2hlIHBhZ2VzIGJlbG9uZ2luZyB0byBtc3QgcHJvdGVjdGVkIGF0dHJpYnV0ZXMKKwkgIGxpa2UgdGhlIGluZGV4IGFsbG9jYXRpb24gYXR0cmlidXRlIGluIGRpcmVjdG9yeSBpbmRpY2VzIGFuZCBvdGhlcgorCSAgaW5kaWNlcyBsaWtlICRRdW90YS8kUSwgZXRjLiAgVGhpcyBtZWFucyB0aGF0IHRoZSBxdW90YSBpcyBub3cgbWFya2VkCisJICBvdXQgb2YgZGF0ZSBvbiBhbGwgdm9sdW1lcyByYXRoZXIgdGhhbiBvbmx5IG9uIG9uZXMgd2hlcmUgdGhlIHF1b3RhCisJICBkZWZhdWx0cyBlbnRyeSBpcyBpbiB0aGUgaW5kZXggcm9vdCBhdHRyaWJ1dGUgb2YgdGhlICRRdW90YS8kUSBpbmRleC4KKworMi4xLjE0IC0gRml4IGFuIE5GU2QgY2F1c2VkIGRlYWRsb2NrIHJlcG9ydGVkIGJ5IHNldmVyYWwgdXNlcnMuCisKKwktIE1vZGlmeSBmcy9udGZzL250ZnNfcmVhZGRpcigpIHRvIGNvcHkgdGhlIGluZGV4IHJvb3QgYXR0cmlidXRlIHZhbHVlCisJICB0byBhIGJ1ZmZlciBzbyB0aGF0IHdlIGNhbiBwdXQgdGhlIHNlYXJjaCBjb250ZXh0IGFuZCB1bm1hcCB0aGUgbWZ0CisJICByZWNvcmQgYmVmb3JlIGNhbGxpbmcgdGhlIGZpbGxkaXIoKSBjYWxsYmFjay4gIFdlIG5lZWQgdG8gZG8gdGhpcworCSAgYmVjYXVzZSBvZiBORlNkIHdoaWNoIGNhbGxzIC0+bG9va3VwKCkgZnJvbSBpdHMgZmlsbGRpciBjYWxsYmFjaygpCisJICBhbmQgdGhpcyBjYXVzZXMgTlRGUyB0byBkZWFkbG9jayBhcyBudGZzX2xvb2t1cCgpIG1hcHMgdGhlIG1mdCByZWNvcmQKKwkgIG9mIHRoZSBkaXJlY3RvcnkgYW5kIHNpbmNlIG50ZnNfcmVhZGRpcigpIGhhcyBnb3QgaXQgbWFwcGVkIGFscmVhZHkKKwkgIG50ZnNfbG9va3VwKCkgZGVhZGxvY2tzLgorCisyLjEuMTMgLSBFbmFibGUgb3ZlcndyaXRpbmcgb2YgcmVzaWRlbnQgZmlsZXMgYW5kIGhvdXNla2VlcGluZyBvZiBzeXN0ZW0gZmlsZXMuCisKKwktIEltcGxlbWVudCB3cml0aW5nIG9mIG1mdCByZWNvcmRzIChmcy9udGZzL21mdC5baGNdKSwgd2hpY2ggaW5jbHVkZXMKKwkgIGtlZXBpbmcgdGhlIG1mdCBtaXJyb3IgaW4gc3luYyB3aXRoIHRoZSBtZnQgd2hlbiBtaXJyb3JlZCBtZnQgcmVjb3JkcworCSAgYXJlIHdyaXR0ZW4uICBUaGUgZnVuY3Rpb25zIGFyZSB3cml0ZV9tZnRfcmVjb3Jkeyxfbm9sb2NrfSgpLiAgVGhlCisJICBpbXBsZW1lbnRhdGlvbiBpcyBxdWl0ZSBydWRpbWVudGFyeSBmb3Igbm93IHdpdGggbG90cyBvZiB0aGluZ3Mgbm90CisJICBpbXBsZW1lbnRlZCB5ZXQgYnV0IEkgYW0gbm90IHN1cmUgYW55IG9mIHRoZW0gY2FuIGFjdHVhbGx5IG9jY3VyIHNvCisJICBJIHdpbGwgd2FpdCBmb3IgcGVvcGxlIHRvIGhpdCBlYWNoIG9uZSBhbmQgb25seSB0aGVuIGltcGxlbWVudCBpdC4KKwktIENvbW1pdCBvcGVuIHN5c3RlbSBpbm9kZXMgYXQgdW1vdW50IHRpbWUuICBUaGlzIHNob3VsZCBtYWtlIGl0CisJICB2aXJ0dWFsbHkgaW1wb3NzaWJsZSBmb3Igc3luY19tZnRfbWlycm9yX3Vtb3VudCgpIHRvIGV2ZXIgYmUgbmVlZGVkLgorCS0gSW1wbGVtZW50IC0+d3JpdGVfaW5vZGUgKGZzL250ZnMvaW5vZGUuYzo6bnRmc193cml0ZV9pbm9kZSgpKSBmb3IgdGhlCisJICBudGZzIHN1cGVyIG9wZXJhdGlvbnMuICBUaGlzIGdpdmVzIHVzIGlub2RlIHdyaXRpbmcgdmlhIHRoZSBWRlMgaW5vZGUKKwkgIGRpcnR5IGNvZGUgcGF0aHMuICBOb3RlOiAgQWNjZXNzIHRpbWUgdXBkYXRlcyBhcmUgbm90IGltcGxlbWVudGVkIHlldC4KKwktIEltcGxlbWVudCBmcy9udGZzL21mdC5baGNdOjp7LF9ffW1hcmtfbWZ0X3JlY29yZF9kaXJ0eSgpIGFuZCBtYWtlCisJICBmcy9udGZzL2FvcHMuYzo6bnRmc193cml0ZXBhZ2UoKSBhbmQgbnRmc19jb21taXRfd3JpdGUoKSB1c2UgaXQsIHRodXMKKwkgIGZpbmFsbHkgZW5hYmxpbmcgcmVzaWRlbnQgZmlsZSBvdmVyd3JpdGUhICAoLTggIFRoaXMgYWxzbyBpbmNsdWRlcyBhCisJICBwbGFjZWhvbGRlciBmb3IgLT53cml0ZXBhZ2UgKG50ZnNfbWZ0X3dyaXRlcGFnZSgpKSwgd2hpY2ggZm9yIG5vdworCSAganVzdCByZWRpcnRpZXMgdGhlIHBhZ2UgYW5kIHJldHVybnMuICBBbHNvLCBhdCB1bW91bnQgdGltZSwgd2UgZm9yCisJICBub3cgdGhyb3cgYXdheSBhbGwgbWZ0IGRhdGEgcGFnZSBjYWNoZSBwYWdlcyBhZnRlciB0aGUgbGFzdCBjYWxsIHRvCisJICBudGZzX2NvbW1pdF9pbm9kZSgpIGluIHRoZSBob3BlIHRoYXQgYWxsIGlub2RlcyB3aWxsIGhhdmUgYmVlbgorCSAgd3JpdHRlbiBvdXQgYnkgdGhlbiBhbmQgaGVuY2Ugbm8gZGlydHkgKG1ldGEpZGF0YSB3aWxsIGJlIGxvc3QuICBXZQorCSAgYWxzbyBjaGVjayBmb3IgdGhpcyBjYXNlIGFuZCBlbWl0IGFuIGVycm9yIG1lc3NhZ2UgdGVsbGluZyB0aGUgdXNlcgorCSAgdG8gcnVuIGNoa2Rzay4KKwktIFVzZSBzZXRfcGFnZV93cml0ZWJhY2soKSBhbmQgZW5kX3BhZ2Vfd3JpdGViYWNrKCkgaW4gdGhlIHJlc2lkZW50CisJICBhdHRyaWJ1dGUgY29kZSBwYXRoIG9mIGZzL250ZnMvYW9wcy5jOjpudGZzX3dyaXRlcGFnZSgpIG90aGVyd2lzZQorCSAgdGhlIHJhZGl4LXRyZWUgdGFnIFBBR0VDQUNIRV9UQUdfRElSVFkgcmVtYWlucyBzZXQgZXZlbiB0aG91Z2ggdGhlCisJICBwYWdlIGlzIGNsZWFuLgorCS0gSW1wbGVtZW50IG50ZnNfbWZ0X3dyaXRlcGFnZSgpIHNvIGl0IG5vdyBjaGVja3MgaWYgYW55IG9mIHRoZSBtZnQKKwkgIHJlY29yZHMgaW4gdGhlIHBhZ2UgYXJlIGRpcnR5IGFuZCBpZiBzbyByZWRpcnRpZXMgdGhlIHBhZ2UgYW5kCisJICByZXR1cm5zLiAgT3RoZXJ3aXNlIGl0IGp1c3QgcmV0dXJucyAoYWZ0ZXIgZG9pbmcgc2V0X3BhZ2Vfd3JpdGViYWNrKCksCisJICB1bmxvY2tfcGFnZSgpLCBlbmRfcGFnZV93cml0ZWJhY2soKSBvciB0aGUgcmFkaXgtdHJlZSB0YWcKKwkgIFBBR0VDQUNIRV9UQUdfRElSVFkgcmVtYWlucyBzZXQgZXZlbiB0aG91Z2ggdGhlIHBhZ2UgaXMgY2xlYW4pLCB0aHVzCisJICBhbG93aW5nIHRoZSBWTSB0byBkbyB3aXRoIHRoZSBwYWdlIGFzIGl0IHBsZWFzZXMuICBBbHNvLCBhdCB1bW91bnQKKwkgIHRpbWUsIG5vdyBvbmx5IHRocm93IGF3YXkgZGlydHkgbWZ0IChtZXRhKWRhdGEgcGFnZXMgaWYgZGlydHkgaW5vZGVzCisJICBhcmUgcHJlc2VudCBhbmQgYXNrIHRoZSB1c2VyIHRvIGVtYWlsIHVzIGlmIHRoZXkgc2VlIHRoaXMgaGFwcGVuaW5nLgorCS0gQWRkIGZ1bmN0aW9ucyBudGZzX3tjbGVhcixzZXR9X3ZvbHVtZV9mbGFncygpLCB0byBtb2RpZnkgdGhlIHZvbHVtZQorCSAgaW5mb3JtYXRpb24gZmxhZ3MgKGZzL250ZnMvc3VwZXIuYykuCisJLSBNYXJrIHRoZSB2b2x1bWUgZGlydHkgd2hlbiAocmUpbW91bnRpbmcgcmVhZC13cml0ZSBhbmQgbWFyayBpdCBjbGVhbgorCSAgd2hlbiB1bm1vdW50aW5nIG9yIHJlbW91bnRpbmcgcmVhZC1vbmx5LiAgSWYgYW55IHZvbHVtZSBlcnJvcnMgYXJlCisJICBmb3VuZCwgdGhlIHZvbHVtZSBpcyBsZWZ0IG1hcmtlZCBkaXJ0eSB0byBmb3JjZSBjaGtkc2sgdG8gcnVuLgorCS0gQWRkIGNvZGUgdG8gc2V0IHRoZSBOVDQgY29tcGF0aWJpbGl0eSBmbGFnIHdoZW4gKHJlKW1vdW50aW5nCisJICByZWFkLXdyaXRlIGZvciBuZXdlciBOVEZTIHZlcnNpb25zIGJ1dCBsZWF2ZSBpdCBjb21tZW50ZWQgb3V0IGZvciBub3cKKwkgIHNpbmNlIHdlIGRvIG5vdCBtYWtlIGFueSBtb2RpZmljYXRpb25zIHRoYXQgYXJlIE5URlMgMS4yIHNwZWNpZmljIHlldAorCSAgYW5kIHNpbmNlIHNldHRpbmcgdGhpcyBmbGFnIGJyZWFrcyBDYXB0aXZlLU5URlMgd2hpY2ggaXMgbm90IG5pY2UuCisJICBUaGlzIGNvZGUgbXVzdCBiZSBlbmFibGVkIG9uY2Ugd2Ugc3RhcnQgd3JpdGluZyBOVEZTIDEuMiBzcGVjaWZpYworCSAgY2hhbmdlcyBvdGhlcndpc2UgV2luZG93cyBOVEZTIGRyaXZlciBtaWdodCBjcmFzaCAvIGNhdXNlIGNvcnJ1cHRpb24uCisKKzIuMS4xMiAtIEZpeCB0aGUgc2Vjb25kIGZpeCB0byB0aGUgZGVjb21wcmVzc2lvbiBlbmdpbmUgYW5kIHNvbWUgY2xlYW51cHMuCisKKwktIEFkZCBhIG5ldyBhZGRyZXNzIHNwYWNlIG9wZXJhdGlvbnMgc3RydWN0LCBudGZzX21zdF9hb3BzLCBmb3IgbXN0CisJICBwcm90ZWN0ZWQgYXR0cmlidXRlcy4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgZGVmYXVsdCBudGZzX2FvcHMgZG8gbm90CisJICBtYWtlIHNlbnNlIHdpdGggbXN0IHByb3RlY3RlZCBkYXRhIGFuZCB3ZXJlIHRoZXkgdG8gd3JpdGUgYW55dGhpbmcgdG8KKwkgIHN1Y2ggYW4gYXR0cmlidXRlIHRoZXkgd291bGQgY2F1c2UgZGF0YSBjb3JydXB0aW9uIHNvIHdlIHByb3ZpZGUKKwkgIG50ZnNfbXN0X2FvcHMgd2hpY2ggZG9lcyBub3QgaGF2ZSBhbnkgd3JpdGUgcmVsYXRlZCBvcGVyYXRpb25zIHNldC4KKwktIENsZWFudXAgZGlydHkgbnRmcyBpbm9kZSBoYW5kbGluZyAoZnMvbnRmcy9pbm9kZS5baGNdKSB3aGljaCBhbHNvCisJICBpbmNsdWRlcyBhbiBhZGFwdGVkIG50ZnNfY29tbWl0X2lub2RlKCkgYW5kIGFuIGltcGxlbWVudGF0aW9uIG9mCisJICBudGZzX3dyaXRlX2lub2RlKCkgd2hpY2ggZm9yIG5vdyBqdXN0IGNsZWFucyBkaXJ0eSBpbm9kZXMgd2l0aG91dAorCSAgd3JpdGluZyB0aGVtIChpdCBkb2VzIGVtaXQgYSB3YXJuaW5nIHRoYXQgdGhpcyBpcyBoYXBwZW5pbmcpLgorCS0gVW5kbyB0aGUgc2Vjb25kIGRlY29tcHJlc3Npb24gZW5naW5lIGZpeCAoc2VlIDIuMS45IHJlbGVhc2UgQ2hhbmdlTG9nCisJICBlbnRyeSkgYXMgaXQgd2FzIG9ubHkgZml4aW5nIGEgdGhlb3JldGljYWwgYnVnIGJ1dCBhdCB0aGUgc2FtZSB0aW1lCisJICBpdCBiYWRseSBicm9rZSB0aGUgaGFuZGxpbmcgb2Ygc3BhcnNlIGFuZCB1bmNvbXByZXNzZWQgY29tcHJlc3Npb24KKwkgIGJsb2Nrcy4KKworMi4xLjExIC0gRHJpdmVyIGludGVybmFsIGNsZWFudXBzLgorCisJLSBPbmx5IGJ1aWxkIGxvZ2ZpbGUubyBpZiBidWlsZGluZyB0aGUgZHJpdmVyIHdpdGggcmVhZC13cml0ZSBzdXBwb3J0LgorCS0gUmVhbGx5IGZpbmFsIHdoaXRlIHNwYWNlIGNsZWFudXBzLgorCS0gVXNlIGdlbmVyaWNfZmZzKCkgaW5zdGVhZCBvZiBmZnMoKSBpbiBsb2dmaWxlLmMgd2hpY2ggYWxsb3dzIHRoZQorCSAgbG9nX3BhZ2Vfc2l6ZSB2YXJpYWJsZSB0byBiZSBvcHRpbWl6ZWQgYnkgZ2NjIGludG8gYSBjb25zdGFudC4KKwktIFJlbmFtZSB1Y2hhcl90IHRvIG50ZnNjaGFyIGV2ZXJ5d2hlcmUgYXMgdWNoYXJfdCBpcyB1bnNpZ25lZCAxLWJ5dGUKKwkgIGNoYXIgYXMgZGVmaW5lZCBieSBQT1NJWCBhbmQgYXMgZm91bmQgb24gc29tZSBzeXN0ZW1zLgorCisyLjEuMTAgLSBGb3JjZSByZWFkLW9ubHkgKHJlKW1vdW50aW5nIG9mIHZvbHVtZXMgd2l0aCB1bnN1cHBvcnRlZCB2b2x1bWUgZmxhZ3MuCisKKwktIEZpbmlzaCBvZmYgdGhlIHdoaXRlIHNwYWNlIGNsZWFudXBzIChyZW1vdmUgdHJhaWxpbmcgc3BhY2VzLCBldGMpLgorCS0gQ2xlYW4gdXAgbnRmc19maWxsX3N1cGVyKCkgYW5kIG50ZnNfcmVhZF9pbm9kZV9tb3VudCgpIGJ5IHJlbW92aW5nCisJICB0aGUga2x1ZGdlcyBhcm91bmQgdGhlIGZpcnN0IGlnZXQoKS4gIEluc3RlYWQgb2YgKHJlKXNldHRpbmcgLT5zX29wCisJICB3ZSBoYXZlIHRoZSAkTUZUIGlub2RlIHNldCB1cCBieSBleHBsaWNpdCBuZXdfaW5vZGUoKSAvIHNldCAtPmlfaW5vIC8KKwkgIGluc2VydF9pbm9kZV9oYXNoKCkgLyBjYWxsIG50ZnNfcmVhZF9pbm9kZV9tb3VudCgpIGRpcmVjdGx5LiAgVGhpcworCSAga2lsbHMgdGhlIG5lZWQgZm9yIHNlY29uZCBzdXBlcl9vcGVyYXRpb25zIGFuZCBhbGxvd3MgdG8gcmV0dXJuIGVycm9yCisJICBmcm9tIG50ZnNfcmVhZF9pbm9kZV9tb3VudCgpIHdpdGhvdXQgcmVzb3J0aW5nIHRvIHVnbHkgInBvaXNvbmluZyIKKwkgIHRyaWNrcy4gIChBbCBWaXJvKQorCS0gRm9yY2UgcmVhZC1vbmx5IChyZSltb3VudGluZyBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBiaXRzIGFyZSBzZXQgaW4KKwkgIHRoZSB2b2x1bWUgaW5mb3JtYXRpb24gZmxhZ3M6CisJICAJVk9MVU1FX0lTX0RJUlRZLCBWT0xVTUVfUkVTSVpFX0xPR19GSUxFLAorCQlWT0xVTUVfVVBHUkFERV9PTl9NT1VOVCwgVk9MVU1FX0RFTEVURV9VU05fVU5ERVJXQVksCisJCVZPTFVNRV9SRVBBSVJfT0JKRUNUX0lELCBWT0xVTUVfTU9ESUZJRURfQllfQ0hLRFNLCisJICBUbyBtYWtlIHRoaXMgZWFzaWVyIHdlIGRlZmluZSBWT0xVTUVfTVVTVF9NT1VOVF9ST19NQVNLIHdpdGggYWxsIHRoZQorCSAgYWJvdmUgYml0cyBzZXQgc28gdGhlIHRlc3QgaXMgbWFkZSBlYXN5LgorCisyLjEuOSAtIEZpeCB0d28gYnVncyBpbiBkZWNvbXByZXNzaW9uIGVuZ2luZS4KKworCS0gRml4IGEgYnVnIHdoZXJlIHdlIHdvdWxkIG5vdCBhbHdheXMgZGV0ZWN0IHRoYXQgd2UgaGF2ZSByZWFjaGVkIHRoZQorCSAgZW5kIG9mIGEgY29tcHJlc3Npb24gYmxvY2sgYmVjYXVzZSB3ZSB3ZXJlIGVuZGluZyBhdCBtaW51cyBvbmUgYnl0ZQorCSAgd2hpY2ggaXMgZWZmZWN0aXZlbHkgdGhlIHNhbWUgYXMgYmVpbmcgYXQgdGhlIGVuZC4gIFRoZSBmaXggaXMgdG8KKwkgIGNoZWNrIHdoZXRoZXIgdGhlIHVuY29tcHJlc3NlZCBidWZmZXIgaGFzIGJlZW4gZnVsbHkgZmlsbGVkIGFuZCBpZiBzbworCSAgd2UgYXNzdW1lIHdlIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBjb21wcmVzc2lvbiBibG9jay4gIEEgYmlnCisJICB0aGFuayB5b3UgdG8gTWFyY2luIEdpYnXFgmEgZm9yIHRoZSBidWcgcmVwb3J0LCB0aGUgYXNzaXN0YW5jZSBpbgorCSAgdHJhY2tpbmcgZG93biB0aGUgYnVnIGFuZCB0ZXN0aW5nIHRoZSBmaXguCisJLSBGaXggYSBwb3NzaWJsZSBidWcgd2hlcmUgd2hlbiBhIGNvbXByZXNzZWQgcmVhZCBpcyB0cnVuY2F0ZWQgdG8gdGhlCisJICBlbmQgb2YgdGhlIGZpbGUsIHRoZSBvZmZzZXQgaW5zaWRlIHRoZSBsYXN0IHBhZ2Ugd2FzIG5vdCB0cnVuY2F0ZWQuCisKKzIuMS44IC0gSGFuZGxlICRNRlQgbWlycm9yIGFuZCAkTG9nRmlsZSwgaW1wcm92ZSB0aW1lIGhhbmRsaW5nLCBhbmQgY2xlYW51cHMuCisKKwktIFVzZSBnZXRfYmgoKSBpbnN0ZWFkIG9mIG1hbnVhbCBhdG9taWNfaW5jKCkgaW4gZnMvbnRmcy9jb21wcmVzcy5jLgorCS0gTW9kaWZ5IGZzL250ZnMvdGltZS5jOjpudGZzMnV0YygpLCBnZXRfY3VycmVudF9udGZzX3RpbWUoKSwgYW5kCisJICB1dGMybnRmcygpIHRvIHdvcmsgd2l0aCBzdHJ1Y3QgdGltZXNwZWMgaW5zdGVhZCBvZiB0aW1lX3Qgb24gdGhlCisJICBMaW51eCBVVEMgdGltZSBzaWRlIHRodXMgcHJlc2VydmluZyB0aGUgZnVsbCBwcmVjaXNpb24gb2YgdGhlIE5URlMKKwkgIHRpbWUgYW5kIG9ubHkgbG9vc2luZyB1cCB0byA5OSBuYW5vLXNlY29uZHMgaW4gdGhlIExpbnV4IFVUQyB0aW1lLgorCS0gTW92ZSBmcy9udGZzL3RpbWUuYyB0byBmcy9udGZzL3RpbWUuaCBhbmQgbWFrZSB0aGUgdGltZSBmdW5jdGlvbnMKKwkgIHN0YXRpYyBpbmxpbmUuCisJLSBSZW1vdmUgdW51c2VkIG50ZnNfZGlydHlfaW5vZGUoKS4KKwktIENsZWFudXAgc3VwZXIgb3BlcmF0aW9ucyBkZWNsYXJhdGlvbiBpbiBmcy9udGZzL3N1cGVyLmMuCisJLSBXcmFwIGZsdXNoX2RjYWNoZV9tZnRfcmVjb3JkX3BhZ2UoKSBpbiAjaWZkZWYgTlRGU19SVy4KKwktIEFkZCBOSW5vVGVzdFNldEZvbygpIGFuZCBOSW5vVGVzdENsZWFyRm9vKCkgbWFjcm8gbWFnaWMgdG8KKwkgIGZzL250ZnMvaW5vZGUuaCBhbmQgdXNlIGl0IHRvIGRlY2xhcmUgTklub1Rlc3R7U2V0LENsZWFyfURpcnR5LgorCS0gTW92ZSB0eXBlZGVmcyBmb3IgbnRmc19hdHRyIGFuZCB0ZXN0X3QgZnJvbSBmcy9udGZzL2lub2RlLmMgdG8KKwkgIGZzL250ZnMvaW5vZGUuaCBzbyB0aGV5IGNhbiBiZSB1c2VkIGVsc2V3aGVyZS4KKwktIERldGVybWluZSB0aGUgbWZ0IG1pcnJvciBzaXplIGFzIHRoZSBudW1iZXIgb2YgbWlycm9yZWQgbWZ0IHJlY29yZHMKKwkgIGFuZCBzdG9yZSBpdCBpbiBudGZzX3ZvbHVtZS0+bWZ0bWlycl9zaXplIChmcy9udGZzL3N1cGVyLmMpLgorCS0gTG9hZCB0aGUgbWZ0IG1pcnJvciBhdCBtb3VudCB0aW1lIGFuZCBjb21wYXJlIHRoZSBtZnQgcmVjb3JkcyBzdG9yZWQKKwkgIGluIGl0IHRvIHRoZSBvbmVzIGluIHRoZSBtZnQuICBGb3JjZSBhIHJlYWQtb25seSBtb3VudCBpZiB0aGUgdHdvIGRvCisJICBub3QgbWF0Y2ggKGZzL250ZnMvc3VwZXIuYykuCisJLSBGaXggdHlwZSBjYXN0aW5nIHJlbGF0ZWQgd2FybmluZ3Mgb24gNjQtYml0IGFyY2hpdGVjdHVyZXMuICBUaGFua3MKKwkgIHRvIE1lZWxpcyBSb29zIGZvciByZXBvcnRpbmcgdGhlbS4KKwktIE1vdmUgJUwgdG8gJWxsIGFzICVMIGlzIGZsb2F0aW5nIHBvaW50IGFuZCAlbGwgaXMgaW50ZWdlciB3aGljaCBpcworCSAgd2hhdCB3ZSB3YW50LgorCS0gUmVhZCB0aGUgam91cm5hbCAoJExvZ0ZpbGUpIGFuZCBkZXRlcm1pbmUgaWYgdGhlIHZvbHVtZSBoYXMgYmVlbgorCSAgc2h1dGRvd24gY2xlYW5seSBhbmQgZm9yY2UgYSByZWFkLW9ubHkgbW91bnQgaWYgbm90IChmcy9udGZzL3N1cGVyLmMKKwkgIGFuZCBmcy9udGZzL2xvZ2ZpbGUuYykuICBUaGlzIGlzIGEgbGl0dGxlIGJpdCBvZiBhIGNydWRlIGNoZWNrIGluCisJICB0aGF0IHdlIG9ubHkgbG9vayBhdCB0aGUgcmVzdGFydCBhcmVhcyBhbmQgbm90IGF0IHRoZSBhY3R1YWwgbG9nCisJICByZWNvcmRzIHNvIHRoYXQgdGhlcmUgd2lsbCBiZSBhIHZlcnkgc21hbGwgbnVtYmVyIG9mIGNhc2VzIHdoZXJlIHdlCisJICB0aGluayB0aGF0IGEgdm9sdW1lIGlzIGRpcnR5IHdoZW4gaW4gZmFjdCBpdCBpcyBjbGVhbi4gIFRoaXMgc2hvdWxkCisJICBvbmx5IGFmZmVjdCB2b2x1bWVzIHRoYXQgaGF2ZSBub3QgYmVlbiBzaHV0ZG93biBjbGVhbmx5IGFuZCBkaWQgbm90CisJICBoYXZlIGFueSBwZW5kaW5nLCBub24tY2hlY2stcG9pbnRlZCBpL28uCisJLSBJZiB0aGUgJExvZ0ZpbGUgaW5kaWNhdGVzIGEgY2xlYW4gc2h1dGRvd24gYW5kIGEgcmVhZC13cml0ZSAocmUpbW91bnQKKwkgIGlzIHJlcXVlc3RlZCwgZW1wdHkgJExvZ0ZpbGUgYnkgb3ZlcndyaXRpbmcgaXQgd2l0aCAweGZmIGJ5dGVzIHRvCisJICBlbnN1cmUgdGhhdCBXaW5kb3dzIGNhbm5vdCBjYXVzZSBkYXRhIGNvcnJ1cHRpb24gYnkgcmVwbGF5aW5nIGEgc3RhbGUKKwkgIGpvdXJuYWwgYWZ0ZXIgTGludXggaGFzIHdyaXR0ZW4gdG8gdGhlIHZvbHVtZS4KKworMi4xLjcgLSBFbmFibGUgTkZTIGV4cG9ydGluZyBvZiBtb3VudGVkIE5URlMgdm9sdW1lcy4KKworCS0gU2V0IGlfZ2VuZXJhdGlvbiBpbiB0aGUgVkZTIGlub2RlIGZyb20gdGhlIHNlcV9ubyBvZiB0aGUgTlRGUyBpbm9kZS4KKwktIE1ha2UgbnRmc19sb29rdXAoKSBORlMgZXhwb3J0IHNhZmUsIGkuZS4gdXNlIGRfc3BsaWNlX2FsaWFzKCksIGV0Yy4KKwktIEltcGxlbWVudCAtPmdldF9kZW50cnkoKSBpbiBmcy9udGZzL25hbWVpLmM6Om50ZnNfZ2V0X2RlbnRyeSgpIGFzIHRoZQorCSAgZGVmYXVsdCBkb2Vzbid0IGFsbG93IGlub2RlIG51bWJlciAwIHdoaWNoIGlzIGEgdmFsaWQgaW5vZGUgb24gTlRGUworCSAgYW5kIGV2ZW4gaWYgaXQgZGlkIGFsbG93IHRoYXQgaXQgdXNlcyBpZ2V0KCkgaW5zdGVhZCBvZiBudGZzX2lnZXQoKQorCSAgd2hpY2ggbWFrZXMgaXQgdXNlbGVzcyBmb3IgdXMuCisJLSBJbXBsZW1lbnQgLT5nZXRfcGFyZW50KCkgaW4gZnMvbnRmcy9uYW1laS5jOjpudGZzX2dldF9wYXJlbnQoKSBhcyB0aGUKKwkgIGRlZmF1bHQganVzdCByZXR1cm5zIC1FQUNDRVMgd2hpY2ggaXMgbm90IHZlcnkgdXNlZnVsLgorCS0gRGVmaW5lIGV4cG9ydCBvcGVyYXRpb25zICgtPnNfZXhwb3J0X29wKSBmb3IgTlRGUyAobnRmc19leHBvcnRfb3BzKQorCSAgYW5kIHNldCB0aGVtIHVwIGluIHRoZSBzdXBlciBibG9jayBhdCBtb3VudCB0aW1lIChzdXBlci5jKSB0aGlzCisJICBhbGxvd3MgbW91bnRlZCBOVEZTIHZvbHVtZXMgdG8gYmUgZXhwb3J0ZWQgdmlhIE5GUy4KKwktIEFkZCBtaXNzaW5nIHJldHVybiAtRU9QTk9UU1VQUDsgaW4KKwkgIGZzL250ZnMvYW9wcy5jOjpudGZzX2NvbW1pdF9ub25yZXNpZGVudF93cml0ZSgpLgorCS0gRW5mb3JjZSBubyBhdGltZSBhbmQgbm8gZGlyIGF0aW1lIHVwZGF0ZXMgYXQgbW91bnQvcmVtb3VudCB0aW1lIGFzCisJICB0aGV5IGFyZSBub3QgaW1wbGVtZW50ZWQgeWV0IGFueXdheS4KKwktIE1vdmUgYSBmZXcgYXNzaWdubWVudHMgaW4gZnMvbnRmcy9hdHRyaWIuYzo6bG9hZF9hdHRyaWJ1dGVfbGlzdCgpIHRvCisJICBhZnRlciBhIE5VTEwgY2hlY2suICBUaGFua3MgdG8gRGF2ZSBKb25lcyBmb3IgcG9pbnRpbmcgdGhpcyBvdXQuCisKKzIuMS42IC0gRml4IG1pbm9yIGJ1ZyBpbiBoYW5kbGluZyBvZiBjb21wcmVzc2VkIGRpcmVjdG9yaWVzLgorCisJLSBGaXggYnVnIGluIGhhbmRsaW5nIG9mIGNvbXByZXNzZWQgZGlyZWN0b3JpZXMuICBBIGNvbXByZXNzZWQKKwkgIGRpcmVjdG9yeSBpcyBub3QgcmVhbGx5IGNvbXByZXNzZWQgc28gd2hlbiB3ZSBzZXQgdGhlIC0+aV9ibG9ja3MKKwkgIGZpZWxkIG9mIGEgY29tcHJlc3NlZCBkaXJlY3RvcnkgaW5vZGUgd2Ugd2VyZSBzZXR0aW5nIGl0IGZyb20gdGhlCisJICBub24tZXhpc3RpbmcgZmllbGQgbmktPml0eXBlLmNvbXByZXNzZWQuc2l6ZSB3aGljaCBnYXZlIHJhbmRvbQorCSAgcmVzdWx0cy4uLiAgRm9yIGRpcmVjdG9yaWVzIHdlIG5vdyBhbHdheXMgdXNlIG5pLT5hbGxvY2F0ZWRfc2l6ZS4KKworMi4xLjUgLSBGaXggbWlub3IgYnVnIGluIGF0dHJpYnV0ZSBsaXN0IGF0dHJpYnV0ZSBoYW5kbGluZy4KKworCS0gRml4IGJ1ZyBpbiBhdHRyaWJ1dGUgbGlzdCBoYW5kbGluZy4gIEFjdHVhbGx5IGl0IGlzIG5vdCBhcyBtdWNoIGEgYnVnCisJICBhcyB0b28gbXVjaCBwcm90ZWN0aW9uIGluIHRoYXQgd2Ugd2VyZSBub3QgYWxsb3dpbmcgYXR0cmlidXRlIGxpc3RzCisJICB3aGljaCB3YXN0ZSBzcGFjZSBvbiBkaXNrIHdoaWxlIFdpbmRvd3MgWFAgY2xlYXJseSBhbGxvd3MgaXQgYW5kIGluCisJICBmYWN0IGNyZWF0ZXMgc3VjaCBhdHRyaWJ1dGUgbGlzdHMgc28gb3VyIGRyaXZlciB3YXMgZmFpbGluZy4KKwktIFVwZGF0ZSBOVEZTIGRvY3VtZW50YXRpb24gcmVhZHkgZm9yIDIuNiBrZXJuZWwgcmVsZWFzZS4KKworMi4xLjQgLSBSZWR1Y2UgY29tcGlsZXIgcmVxdWlyZW1lbnRzLgorCisJLSBSZW1vdmUgYWxsIHVzZXMgb2YgdW5uYW1lZCBzdHJ1Y3RzIGFuZCB1bmlvbnMgaW4gdGhlIGRyaXZlciB0byBtYWtlCisJICBvbGQgYW5kIG5ld2VyIGdjYyB2ZXJzaW9ucyBoYXBweS4gTWFrZXMgaXQgYSBiaXQgdWdsaWVyIElNTyBidXQgYXQKKwkgIGxlYXN0IHBlb3BsZSB3aWxsIHN0b3AgaGFzc2xpbmcgbWUgYWJvdXQgaXQuCisKKzIuMS4zIC0gSW1wb3J0YW50IGJ1ZyBmaXhlcyBpbiBjb3JuZXIgY2FzZXMuCisKKwktIHN1cGVyLmM6OnBhcnNlX250ZnNfYm9vdF9zZWN0b3IoKTogQ29ycmVjdCB0aGUgY2hlY2sgZm9yIDY0LWJpdAorCSAgY2x1c3RlcnMuIChQaGlsaXBwIFRob21hcykKKwktIGF0dHJpYi5jOjpsb2FkX2F0dHJpYnV0ZV9saXN0KCk6IEZpeCBidWcgd2hlbiBpbml0aWFsaXplZF9zaXplIGlzIGEKKwkgIG11bHRpcGxlIG9mIHRoZSBibG9ja19zaXplIGJ1dCBub3QgdGhlIGNsdXN0ZXIgc2l6ZS4gKFN6YWJvbGNzCisJICBTemFrYWNzaXRzIDxzemFrYUBzaWVuZXQuaHU+KQorCisyLjEuMiAtIEltcG9ydGFudCBidWcgZml4ZXMgYWxldmlhdGluZyB0aGUgaGFuZ3MgaW4gc3RhdGZzLgorCisJLSBGaXggYnVnZ3kgZnJlZSBjbHVzdGVyIGFuZCBmcmVlIGlub2RlIGRldGVybWluYXRpb24gbG9naWMuCisKKzIuMS4xIC0gTWlub3IgdXBkYXRlcy4KKworCS0gQWRkIGhhbmRsaW5nIGZvciBpbml0aWFsaXplZF9zaXplICE9IGRhdGFfc2l6ZSBpbiBjb21wcmVzc2VkIGZpbGVzLgorCS0gUmVkdWNlIGZ1bmN0aW9uIGxvY2FsIHN0YWNrIHVzYWdlIGZyb20gMHgzZDQgYnl0ZXMgdG8ganVzdCBub2lzZSBpbgorCSAgZnMvbnRmcy91cGNhc2UuYy4gKFJhbmR5IER1bmxhcCA8cmRkdW5sYXBAb3NkbC5vcmQ+KQorCS0gUmVtb3ZlIGNvbXBpbGVyIHdhcm5pbmdzIGZvciBuZXdlciBnY2MuCisJLSBQYWdlcyBhcmUgbm8gbG9uZ2VyIGttYXBwZWQgYnkgbW0vZmlsZW1hcC5jOjpnZW5lcmljX2ZpbGVfd3JpdGUoKQorCSAgYXJvdW5kIGNhbGxzIHRvIC0+e3ByZXBhcmUsY29tbWl0fV93cml0ZS4gIEFkYXB0IE5URlMgYXBwcm9wcmlhdGVseQorCSAgaW4gZnMvbnRmcy9hb3BzLmM6Om50ZnNfcHJlcGFyZV9ub25yZXNpZGVudF93cml0ZSgpIGJ5IHVzaW5nCisJICBrbWFwX2F0b21pYyhLTV9VU0VSMCkuCisKKzIuMS4wIC0gRmlyc3Qgc3RlcHMgdG93YXJkcyB3cml0ZSBzdXBwb3J0OiBpbXBsZW1lbnQgZmlsZSBvdmVyd3JpdGUuCisKKwktIEFkZCBjb25maWd1cmF0aW9uIG9wdGlvbiBmb3IgZGV2ZWxvcG1lbnRhbCB3cml0ZSBzdXBwb3J0IHdpdGggYW4KKwkgIGFwcHJvcHJpYXRlbHkgc2NhcnkgY29uZmlndXJhdGlvbiBoZWxwIHRleHQuCisJLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIG9mIGZzL250ZnMvYW9wcy5jOjpudGZzX3dyaXRlcGFnZSgpIGFuZCBpdHMKKwkgIGhlbHBlciBmcy9udGZzL2FvcHMuYzo6bnRmc193cml0ZV9ibG9jaygpLiBUaGlzIGVuYWJsZXMgbW1hcCgyKSBiYXNlZAorCSAgb3ZlcndyaXRpbmcgb2YgZXhpc3RpbmcgZmlsZXMgb24gbnRmcy4gTm90ZTogUmVzaWRlbnQgZmlsZXMgYXJlCisJICBvbmx5IHdyaXR0ZW4gaW50byBtZW1vcnksIGFuZCBub3Qgd3JpdHRlbiBvdXQgdG8gZGlzayBhdCBwcmVzZW50LCBzbworCSAgYXZvaWQgd3JpdGluZyB0byBmaWxlcyBzbWFsbGVyIHRoYW4gYWJvdXQgMWtpQi4KKwktIEluaXRpYWwgaW1wbGVtZW50YXRpb24gb2YgZnMvbnRmcy9hb3BzLmM6Om50ZnNfcHJlcGFyZV93cml0ZSgpLCBpdHMKKwkgIGhlbHBlciBmcy9udGZzL2FvcHMuYzo6bnRmc19wcmVwYXJlX25vbnJlc2lkZW50X3dyaXRlKCkgYW5kIHRoZWlyCisJICBjb3VudGVycGFydHMsIGZzL250ZnMvYW9wcy5jOjpudGZzX2NvbW1pdF93cml0ZSgpLCBhbmQKKwkgIGZzL250ZnMvYW9wcy5jOjpudGZzX2NvbW1pdF9ub25yZXNpZGVudF93cml0ZSgpLCByZXNwZWN0aXZlbHkuIEFsc28sCisJICBhZGQgZ2VuZXJpY19maWxlX3dyaXRlKCkgdG8gdGhlIG50ZnMgZmlsZSBvcGVyYXRpb25zIChmcy9udGZzL2ZpbGUuYykuCisJICBUaGlzIGVuYWJsZXMgd3JpdGUoMikgYmFzZWQgb3ZlcndyaXRpbmcgb2YgZXhpc3RpbmcgZmlsZXMgb24gbnRmcy4KKwkgIE5vdGU6IEFzIHdpdGggbW1hcCgyKSBiYXNlZCBvdmVyd3JpdGluZywgcmVzaWRlbnQgZmlsZXMgYXJlIG9ubHkKKwkgIHdyaXR0ZW4gaW50byBtZW1vcnksIGFuZCBub3Qgd3JpdHRlbiBvdXQgdG8gZGlzayBhdCBwcmVzZW50LCBzbyBhdm9pZAorCSAgd3JpdGluZyB0byBmaWxlcyBzbWFsbGVyIHRoYW4gYWJvdXQgMWtpQi4KKwktIEltcGxlbWVudCAtPnRydW5jYXRlIChmcy9udGZzL2lub2RlLmM6Om50ZnNfdHJ1bmNhdGUoKSkgYW5kCisJICAtPnNldGF0dHIoKSAoZnMvbnRmcy9pbm9kZS5jOjpudGZzX3NldGF0dHIoKSkgaW5vZGUgb3BlcmF0aW9ucyBmb3IKKwkgIGZpbGVzIHdpdGggdGhlIHB1cnBvc2Ugb2YgaW50ZXJjZXB0aW5nIGFuZCBhYm9ydGluZyBhbGwgaV9zaXplCisJICBjaGFuZ2VzIHdoaWNoIHdlIGRvIG5vdCBzdXBwb3J0IHlldC4gbnRmc190cnVuY2F0ZSgpIGFjdHVhbGx5IG9ubHkKKwkgIGVtaXRzIGEgd2FybmluZyBtZXNzYWdlIGJ1dCBBRkFJQ1Mgb3VyIGludGVyY2VwdGlvbiBvZiBpX3NpemUgY2hhbmdlcworCSAgZWxzZXdoZXJlIG1lYW5zIG50ZnNfdHJ1bmNhdGUoKSBuZXZlciBnZXRzIGNhbGxlZCBmb3IgaV9zaXplIGNoYW5nZXMuCisJICBJdCBpcyBvbmx5IGNhbGxlZCBmcm9tIGdlbmVyaWNfZmlsZV93cml0ZSgpIHdoZW4gd2UgZmFpbCBpbgorCSAgbnRmc19wcmVwYXJlX3ssbm9ucmVzaWRlbnRffXdyaXRlKCkgaW4gb3JkZXIgdG8gZGlzY2FyZCBhbnkKKwkgIGluc3RhbnRpYXRlZCBidWZmZXJzIGJleW9uZCBpX3NpemUuIFRodXMgaV9zaXplIGlzIG5vdCBhY3R1YWxseQorCSAgY2hhbmdlZCBzbyBvdXIgd2FybmluZyBtZXNzYWdlIGlzIGVub3VnaC4gVW5mb3J0dW5hdGVseSBpdCBpcyBub3QKKwkgIHBvc3NpYmxlIHRvIGVhc2lseSBkZXRlcm1pbmUgaWYgaV9zaXplIGlzIGJlaW5nIGNoYW5nZWQgb3Igbm90IGhlbmNlCisJICB3ZSBqdXN0IGVtaXQgYW4gYXBwcm9wcmlhdGVseSB3b3JkZWQgZXJyb3IgbWVzc2FnZS4KKworMi4wLjI1IC0gU21hbGwgYnVnIGZpeGVzIGFuZCBjbGVhbnVwcy4KKworCS0gVW5sb2NrIHRoZSBwYWdlIGluIGFuIG91dCBvZiBtZW1vcnkgZXJyb3IgY29kZSBwYXRoIGluCisJICBmcy9udGZzL2FvcHMuYzo6bnRmc19yZWFkX2Jsb2NrKCkuCisJLSBJZiBmcy9udGZzL2FvcHMuYzo6bnRmc19yZWFkX3BhZ2UoKSBpcyBjYWxsZWQgb24gYW4gdXB0b2RhdGUgcGFnZSwKKwkgIGp1c3QgdW5sb2NrIHRoZSBwYWdlIGFuZCByZXR1cm4uIChUaGlzIGNhbiBoYXBwZW4gZHVlIHRvIC0+d3JpdGVwYWdlCisJICBjbGVhcmluZyBQYWdlVXB0b2RhdGUoKSBkdXJpbmcgd3JpdGUgb3V0IG9mIE1zdFByb3RlY3RlZCgpCisJICBhdHRyaWJ1dGVzLgorCS0gUmVtb3ZlIGxlYWtlZCB3cml0ZSBjb2RlIGFnYWluLgorCisyLjAuMjQgLSBDbGVhbnVwcy4KKworCS0gVHJlYXQgQlVHX09OKCkgYXMgQVNTRVJUKCkgbm90IFZFUklGWSgpLCBpLmUuIGRvIG5vdCB1c2Ugc2lkZSBlZmZlY3RzCisJICBpbnNpZGUgQlVHX09OKCkuIChBZGFtIEouIFJpY2h0ZXIpCisJLSBTcGxpdCBsb2dpY2FsIE9SIGV4cHJlc3Npb25zIGluc2lkZSBCVUdfT04oKSBpbnRvIGluZGl2aWR1YWwgQlVHX09OKCkKKwkgIGNhbGxzIGZvciBpbXByb3ZlZCBkZWJ1Z2dpbmcuIChBZGFtIEouIFJpY2h0ZXIpCisJLSBBZGQgZXJyb3JzIGZsYWcgdG8gdGhlIG50ZnMgdm9sdW1lIHN0YXRlLCBhY2Nlc3NlZCB2aWEKKwkgIE5Wb2x7LFNldCxDbGVhcn1FcnJvcnModm9sKS4KKwktIERvIG5vdCBhbGxvdyByZWFkLXdyaXRlIHJlbW91bnRzIG9mIHJlYWQtb25seSB2b2x1bWVzIHdpdGggZXJyb3JzLgorCS0gQ2xhcmlmeSBjb21tZW50IGZvciBudGZzIGZpbGUgb3BlcmF0aW9uIHNlbmRmaWxlIHdoaWNoIHdhcyBhZGRlZCBieQorCSAgQ2hyaXN0b3BoIEhlbGx3aWcgYSB3aGlsZSBhZ28gKGp1c3QgdXNpbmcgZ2VuZXJpY19maWxlX3NlbmRmaWxlKCkpCisJICB0byBzYXkgdGhhdCBudGZzIC0+c2VuZGZpbGUgaXMgb25seSB1c2VkIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUKKwkgIHNvdXJjZSBkYXRhIGlzIG9uIHRoZSBudGZzIHBhcnRpdGlvbiBhbmQgdGhlIGRlc3RpbmF0aW9uIGlzCisJICBzb21ld2hlcmUgZWxzZSwgaS5lLiBub3RoaW5nIHdlIG5lZWQgdG8gY29uY2VybiBvdXJzZWx2ZXMgd2l0aC4KKwktIEFkZCBnZW5lcmljX2ZpbGVfd3JpdGUoKSBhcyBvdXIgbnRmcyBmaWxlIHdyaXRlIG9wZXJhdGlvbi4KKworMi4wLjIzIC0gTWFqb3IgYnVnIGZpeGVzIChyYWNlcywgZGVhZGxvY2tzLCBub24taTM4NiBhcmNoaXRlY3R1cmVzKS4KKworCS0gTWFzc2l2ZSBpbnRlcm5hbCBsb2NraW5nIGNoYW5nZXMgdG8gbWZ0IHJlY29yZCBsb2NraW5nLiBGaXhlcyBsb2NrCisJICByZWN1cnNpb24gYW5kIHJlcGxhY2VzIHRoZSBtcmVjX2xvY2sgcmVhZC93cml0ZSBzZW1hcGhvcmUgd2l0aCBhCisJICBtdXRleC4gQWxzbyByZW1vdmVzIHRoZSBub3cgc3VwZXJmbHVvdXMgbWZ0X2NvdW50LiBUaGlzIGZpeGVzIHNldmVyYWwKKwkgIHJhY2UgY29uZGl0aW9ucyBhbmQgZGVhZGxvY2tzLCBlc3BlY2lhbGx5IGluIHRoZSBmdXR1cmUgd3JpdGUgY29kZS4KKwktIEZpeCBudGZzIG92ZXIgbG9vcGJhY2sgZm9yIGNvbXByZXNzZWQgZmlsZXMgYnkgYWRkaW5nIGFuCisJICBvcHRpbWl6YXRpb24gYmFycmllci4gKGdjYyB3YXMgc2NyZXdpbmcgdXAgb3RoZXJ3aXNlID8pCisJLSBNaXNjZWxsYW5lb3VzIGNsZWFudXBzIGFsbCBvdmVyIHRoZSBjb2RlIGFuZCBhIGZpeCBvciB0d28gaW4gZXJyb3IKKwkgIGhhbmRsaW5nIGNvZGUgcGF0aHMuCisJVGhhbmtzIGdvIHRvIENocmlzdG9waCBIZWxsd2lnIGZvciBwb2ludGluZyBvdXQgdGhlIGZvbGxvd2luZyB0d286CisJLSBSZW1vdmUgbm93IHVudXNlZCBmdW5jdGlvbiBmcy9udGZzL21hbGxvYy5oOjp2bWFsbG9jX25vZnMoKS4KKwktIEZpeCBudGZzX2ZyZWUoKSBmb3IgaWE2NCBhbmQgcGFyaXNjIGJ5IGNoZWNraW5nIGZvciBWTUFMTE9DX0VORCwgdG9vLgorCisyLjAuMjIgLSBDbGVhbnVwcywgbWFpbmx5IHRvIG50ZnNfcmVhZGRpcigpLCBhbmQgdXNlIEM5OSBpbml0aWFsaXplcnMuCisKKwktIENoYW5nZSBmcy9udGZzL2Rpci5jOjpudGZzX3JlZGRpcigpIHRvIG9ubHkgcmVhZC93cml0ZSAtPmZfcG9zIG9uY2UKKwkgIGF0IGVudHJ5L2V4aXQgcmVzcGVjdGl2ZWx5LgorCS0gVXNlIEM5OSBpbml0aWFsaXplcnMgZm9yIHN0cnVjdHVyZXMuCisJLSBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGJsb2NrcyBmcm9tIGZzL250ZnMvYW9wcy5jOjpudGZzX3JlYWRfYmxvY2soKS4KKworMi4wLjIxIC0gQ2hlY2sgZm9yLCBhbmQgcmVmdXNlIHRvIHdvcmsgd2l0aCB0b28gbGFyZ2UgZmlsZXMvZGlyZWN0b3JpZXMvdm9sdW1lcy4KKworCS0gTGltaXQgdm9sdW1lIHNpemUgYXQgbW91bnQgdGltZSB0byAyVGlCIG9uIGFyY2hpdGVjdHVyZXMgd2hlcmUKKwkgIHVuc2lnbmVkIGxvbmcgaXMgMzItYml0cyAoZnMvbnRmcy9zdXBlci5jOjpwYXJzZV9udGZzX2Jvb3Rfc2VjdG9yKCkpLgorCSAgVGhpcyBpcyB0aGUgbW9zdCB3ZSBjYW4gZG8gd2l0aG91dCBvdmVyZmxvd2luZyB0aGUgMzItYml0IGxpbWl0IG9mCisJICB0aGUgYmxvY2sgZGV2aWNlIHNpemUgaW1wb3NlZCBvbiB1cyBieSBzYl9icmVhZCgpIGFuZCBzYl9nZXRibGsoKQorCSAgZm9yIHRoZSB0aW1lIGJlaW5nLgorCS0gTGltaXQgZmlsZS9kaXJlY3Rvcnkgc2l6ZSBhdCBvcGVuKCkgdGltZSB0byAxNlRpQiBvbiBhcmNoaXRlY3R1cmVzCisJICB3aGVyZSB1bnNpZ25lZCBsb25nIGlzIDMyLWJpdHMgKGZzL250ZnMvZmlsZS5jOjpudGZzX2ZpbGVfb3BlbigpIGFuZAorCSAgZnMvbnRmcy9kaXIuYzo6bnRmc19kaXJfb3BlbigpKS4gVGhpcyBpcyB0aGUgbW9zdCB3ZSBjYW4gZG8gd2l0aG91dAorCSAgb3ZlcmZsb3dpbmcgdGhlIHBhZ2UgY2FjaGUgcGFnZSBpbmRleC4KKworMi4wLjIwIC0gU3VwcG9ydCBub24tcmVzaWRlbnQgZGlyZWN0b3J5IGluZGV4IGJpdG1hcHMsIGZpeCBwYWdlIGxlYWsgaW4gcmVhZGRpci4KKworCS0gTW92ZSB0aGUgZGlyZWN0b3J5IGluZGV4IGJpdG1hcCB0byB1c2UgYW4gYXR0cmlidXRlIGlub2RlIGluc3RlYWQgb2YKKwkgIGhhdmluZyBzcGVjaWFsIGZpZWxkcyBmb3IgaXQgaW5zaWRlIHRoZSBudGZzIGlub2RlIHN0cnVjdHVyZS4gVGhpcworCSAgbWVhbnMgdGhhdCB0aGUgaW5kZXggYml0bWFwcyBub3cgdXNlIHRoZSBwYWdlIGNhY2hlIGZvciBpL28sIHRvbywKKwkgIGFuZCBhbHNvIGFzIGEgc2lkZSBlZmZlY3Qgd2UgZ2V0IHN1cHBvcnQgZm9yIG5vbi1yZXNpZGVudCBpbmRleAorCSAgYml0bWFwcyBmb3IgZnJlZS4KKwktIFNpbXBsaWZ5L2NsZWFudXAgZXJyb3IgaGFuZGxpbmcgaW4gZnMvbnRmcy9kaXIuYzo6bnRmc19yZWFkZGlyKCkgYW5kCisJICBmaXggYSBwYWdlIGxlYWsgdGhhdCBtYW5pZmVzdGVkIGl0c2VsZiBpbiBzb21lIGNhc2VzLgorCS0gQWRkIGZzL250ZnMvaW5vZGUuYzo6bnRmc19wdXRfaW5vZGUoKSwgd2hpY2ggd2UgbmVlZCB0byByZWxlYXNlIHRoZQorCSAgaW5kZXggYml0bWFwIGlub2RlIG9uIHRoZSBmaW5hbCBpcHV0KCkuCisKKzIuMC4xOSAtIEZpeCByYWNlIGNvbmRpdGlvbiwgaW1wcm92ZW1lbnRzLCBhbmQgb3B0aW1pemF0aW9ucyBpbiBpL28gaW50ZXJmYWNlLgorCisJLSBBcHBseSBibG9jayBvcHRpbWl6YXRpb24gYWRkZWQgdG8gZnMvbnRmcy9hb3BzLmM6Om50ZnNfcmVhZF9ibG9jaygpCisJICB0byBmcy9udGZzL2NvbXByZXNzLmM6Om50ZnNfZmlsZV9yZWFkX2NvbXByZXNzZWRfYmxvY2soKSBhcyB3ZWxsLgorCS0gRHJvcCB0aGUgImZpbGUiIGZyb20gbnRmc19maWxlX3JlYWRfY29tcHJlc3NlZF9ibG9jaygpLgorCS0gUmVuYW1lIGZzL250ZnMvYW9wcy5jOjpudGZzX2VuYl9idWZmZXJfcmVhZF9hc3luYygpIHRvCisJICBudGZzX2VuZF9idWZmZXJfYXN5bmNfcmVhZCgpIChtb3JlIGxpa2UgdGhlIGZzL2J1ZmZlci5jIGNvdW50ZXJwYXJ0KS4KKwktIFVwZGF0ZSBudGZzX2VuZF9idWZmZXJfYXN5bmNfcmVhZCgpIHdpdGggdGhlIGltcHJvdmVkIGxvZ2ljIGZyb20KKwkgIGl0cyB1cGRhdGVkIGNvdW50ZXJwYXJ0IGZzL2J1ZmZlci5jOjplbmRfYnVmZmVyX2FzeW5jX3JlYWQoKS4gQXBwbHkKKwkgIGZ1cnRoZXIgbG9naWMgaW1wcm92ZW1lbnRzIHRvIGJldHRlciBkZXRlcm1pbmUgd2hlbiB3ZSBzZXQgUGFnZUVycm9yLgorCS0gVXBkYXRlIHN1Ym1pc3Npb24gb2YgYnVmZmVycyBpbiBmcy9udGZzL2FvcHMuYzo6bnRmc19yZWFkX2Jsb2NrKCkgdG8KKwkgIGNoZWNrIGZvciB0aGUgYnVmZmVycyBiZWluZyB1cHRvZGF0ZSBmaXJzdCBpbiBsaW5lIHdpdGggdGhlIHVwZGF0ZWQKKwkgIGZzL2J1ZmZlci5jOjpibG9ja19yZWFkX2Z1bGxfcGFnZSgpLiBUaGlzIHBsdWdzIGEgc21hbGwgcmFjZQorCSAgY29uZGl0aW9uLgorCisyLjAuMTggLSBGaXggcmFjZSBjb25kaXRpb24gaW4gcmVhZGluZyBvZiBjb21wcmVzc2VkIGZpbGVzLgorCisJLSBUaGVyZSB3YXMgYSBuYXJyb3cgd2luZG93IGJldHdlZW4gY2hlY2tpbmcgYSBidWZmZXIgaGVhZCBmb3IgYmVpbmcKKwkgIHVwdG9kYXRlIGFuZCBsb2NraW5nIGl0IGluIG50ZnNfZmlsZV9yZWFkX2NvbXByZXNzZWRfYmxvY2soKS4gV2Ugbm93CisJICBsb2NrIHRoZSBidWZmZXIgYW5kIHRoZW4gY2hlY2sgd2hldGhlciBpdCBpcyB1cHRvZGF0ZSBvciBub3QuCisKKzIuMC4xNyAtIENsZWFudXBzIGFuZCBvcHRpbWl6YXRpb25zIC0gc2hyaW5raW5nIHRoZSBUb0RvIGxpc3QuCisKKwktIE1vZGlmeSBmcy9udGZzL2lub2RlLmM6Om50ZnNfcmVhZF9sb2NrZWRfaW5vZGUoKSB0byByZXR1cm4gYW4gZXJyb3IKKwkgIGNvZGUgYW5kIHVwZGF0ZSBjYWxsZXJzLCBpLmUuIG50ZnNfaWdldCgpLCB0byBwYXNzIHRoYXQgZXJyb3IgY29kZQorCSAgdXAgaW5zdGVhZCBvZiBqdXN0IHVzaW5nIC1FSU8uCisJLSBNb2RpZmljYXRpb25zIHRvIHN1cGVyLmMgdG8gZW5zdXJlIHRoYXQgYm90aCBtb3VudCBhbmQgcmVtb3VudAorCSAgY2Fubm90IHNldCBhbnkgd3JpdGUgcmVsYXRlZCBvcHRpb25zIHdoZW4gdGhlIGRyaXZlciBpcyBjb21waWxlZAorCSAgcmVhZC1vbmx5LgorCS0gT3B0aW1pemUgYmxvY2sgcmVzb2x1dGlvbiBpbiBmcy9udGZzL2FvcHMuYzo6bnRmc19yZWFkX2Jsb2NrKCkgdG8KKwkgIGNhY2hlIHRoZSBjdXJyZW50IHJ1bmxpc3QgZWxlbWVudC4gVGhpcyBzaG91bGQgaW1wcm92ZSBwZXJmb3JtYW5jZQorCSAgd2hlbiByZWFkaW5nIHZlcnkgbGFyZ2UgYW5kL29yIHZlcnkgZnJhZ21lbnRlZCBkYXRhLgorCisyLjAuMTYgLSBDb252ZXJ0IGFjY2VzcyB0byAkTUZULyRCSVRNQVAgdG8gYXR0cmlidXRlIGlub2RlIEFQSS4KKworCS0gRml4IGEgc3R1cGlkIGJ1ZyBpbnRyb2R1Y2VkIGluIDIuMC4xNSB3aGVyZSB3ZSB3ZXJlIHVubWFwcGluZyB0aGUKKwkgIHdyb25nIGlub2RlIGluIGZzL250ZnMvaW5vZGUuYzo6bnRmc19hdHRyX2lnZXQoKS4KKwktIEZpeCBkZWJ1Z2dpbmcgY2hlY2sgaW4gZnMvbnRmcy9hb3BzLmM6Om50ZnNfcmVhZF9ibG9jaygpLgorCS0gQ29udmVydCAkTUZULyRCSVRNQVAgYWNjZXNzIHRvIGF0dHJpYnV0ZSBpbm9kZSBBUEkgYW5kIHJlbW92ZSBhbGwKKwkgIHJlbW5hbnRzIG9mIHRoZSB1Z2x5IG1mdGJtcCBhZGRyZXNzIHNwYWNlIGFuZCBvcGVyYXRpb25zIGhhY2suIFRoaXMKKwkgIG1lYW5zIHdlIGZpbmFsbHkgaGF2ZSBvbmx5IG9uZSByZWFkcGFnZSBmdW5jdGlvbiBhcyB3ZWxsIGFzIG9ubHkgb25lCisJICBhc3luYyBpbyBjb21wbGV0aW9uIGhhbmRsZXIuIFlleSEgVGhlIG1mdCBiaXRtYXAgaXMgbm93IGp1c3QgYW4KKwkgIGF0dHJpYnV0ZSBpbm9kZSBhbmQgaXMgYWNjZXNzZWQgZnJvbSB2b2wtPm1mdGJtcF9pbm8ganVzdCBhcyBpZiBpdAorCSAgd2VyZSBhIG5vcm1hbCBmaWxlLiBGYWtlIGlub2RlcyBydWxlLiAoLToKKworMi4wLjE1IC0gRmFrZSBpbm9kZXMgYmFzZWQgYXR0cmlidXRlIGkvbyB2aWEgdGhlIHBhZ2VjYWNoZSwgZml4ZXMgYW5kIGNsZWFudXBzLgorCisJLSBGaXggc2lsbHkgYnVnIGluIGZzL250ZnMvc3VwZXIuYzo6cGFyc2Vfb3B0aW9ucygpIHdoaWNoIHdhcyBjYXVzaW5nCisJICByZW1vdW50cyB0byBmYWlsIHdoZW4gdGhlIHBhcnRpdGlvbiBoYWQgYW4gZW50cnkgaW4gL2V0Yy9mc3RhYiBhbmQKKwkgIHRoZSBlbnRyeSBzcGVjaWZpZWQgdGhlIG5scz0gb3B0aW9uLgorCS0gQXBwbHkgc2FtZSBtYWNybyBtYWdpYyB1c2VkIGluIGZzL250ZnMvaW5vZGUuaCB0byBmcy9udGZzL3ZvbHVtZS5oIHRvCisJICBleHBhbmQgYWxsIHRoZSBoZWxwZXIgZnVuY3Rpb25zIE5Wb2xGb28oKSwgTlZvbFNldEZvbygpLCBhbmQKKwkgIE5Wb2xDbGVhckZvbygpLgorCS0gTW92ZSBjb3B5cmlnaHQgc3RhdGVtZW50IGZyb20gZHJpdmVyIGluaXRpYWxpc2F0aW9uIG1lc3NhZ2UgdG8KKwkgIG1vZHVsZSBkZXNjcmlwdGlvbiAoZnMvc3VwZXIuYykuIFRoaXMgbWFrZXMgdGhlIGluaXRpYWxpc2F0aW9uCisJICBtZXNzYWdlIGZpdCBvbiBvbmUgbGluZSBhbmQgZml0cyBpbiBiZXR0ZXIgd2l0aCByZXN0IG9mIGtlcm5lbC4KKwktIFVwZGF0ZSBmcy9udGZzL2F0dHJpYi5jOjptYXBfcnVuX2xpc3QoKSB0byB3b3JrIG9uIGJvdGggcmVhbCBhbmQKKwkgIGF0dHJpYnV0ZSBpbm9kZXMsIGFuZCBib3RoIGZvciBmaWxlcyBhbmQgZGlyZWN0b3JpZXMuCisJLSBJbXBsZW1lbnQgZmFrZSBhdHRyaWJ1dGUgaW5vZGVzIGFsbG93aW5nIGFsbCBhdHRyaWJ1dGUgaS9vIHRvIGdvIHZpYQorCSAgdGhlIHBhZ2UgY2FjaGUgYW5kIHRvIHVzZSBhbGwgdGhlIG5vcm1hbCB2ZnMvbW0gZnVuY3Rpb25hbGl0eToKKwkgIC0gQWRkIG50ZnNfYXR0cl9pZ2V0KCkgYW5kIGl0cyBoZWxwZXIgbnRmc19yZWFkX2xvY2tlZF9hdHRyX2lub2RlKCkKKwkgICAgdG8gZnMvbnRmcy9pbm9kZS5jLgorCSAgLSBBZGQgbmVlZGVkIGNsZWFudXAgY29kZSB0byBudGZzX2NsZWFyX2JpZ19pbm9kZSgpLgorCS0gTWVyZ2UgYWRkcmVzcyBzcGFjZSBvcGVyYXRpb25zIGZvciBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgKGFvcHMuYyksCisJICBub3cganVzdCBoYXZlIG50ZnNfYW9wczoKKwkgIC0gUmVuYW1lOgorCQllbmRfYnVmZmVyX3JlYWRfYXR0cl9hc3luYygpIC0+CW50ZnNfZW5kX2J1ZmZlcl9yZWFkX2FzeW5jKCksCisJCW50ZnNfYXR0cl9yZWFkX2Jsb2NrKCkJICAgICAtPgludGZzX3JlYWRfYmxvY2soKSwKKwkJbnRmc19maWxlX3JlYWRfcGFnZSgpCSAgICAgLT4JbnRmc19yZWFkcGFnZSgpLgorCSAgLSBSZXdyaXRlIGZzL250ZnMvYW9wcy5jOjpudGZzX3JlYWRwYWdlKCkgdG8gd29yayBvbiBib3RoIHJlYWwgYW5kCisJICAgIGF0dHJpYnV0ZSBpbm9kZXMsIGFuZCBib3RoIGZvciBmaWxlcyBhbmQgZGlyZWN0b3JpZXMuCisJICAtIFJlbW92ZSBvYnNvbGV0ZSBmcy9udGZzL2FvcHMuYzo6bnRmc19tc3RfcmVhZHBhZ2UoKS4KKworMi4wLjE0IC0gUnVuIGxpc3QgbWVyZ2luZyBjb2RlIGNsZWFudXAsIG1pbm9yIGxvY2tpbmcgY2hhbmdlcywgdHlwbyBmaXhlcy4KKworCS0gQ2hhbmdlIGZzL250ZnMvc3VwZXIuYzo6bnRmc19zdGF0ZnMoKSB0byBub3QgcmVseSBvbiBCS0wgYnkgbW92aW5nCisJICB0aGUgbG9ja2luZyBvdXQgb2Ygc3VwZXIuYzo6Z2V0X25yX2ZyZWVfbWZ0X3JlY29yZHMoKSBhbmQgdGFraW5nIGFuZAorCSAgZHJvcHBpbmcgdGhlIG1mdGJtcF9sb2NrIHJ3X3NlbWFwaG9yZSBpbiBudGZzX3N0YXRmcygpIGl0c2VsZi4KKwktIEJyaW5nIGF0dHJpYnV0ZSBydW5saXN0IG1lcmdpbmcgY29kZSAoZnMvbnRmcy9hdHRyaWIuYykgaW4gc3luYyB3aXRoCisJICBjdXJyZW50IHVzZXJzcGFjZSBudGZzIGxpYnJhcnkgY29kZS4gVGhpcyBtZWFucyB0aGF0IGlmIGEgbWVyZ2UKKwkgIGZhaWxzIHRoZSBvcmlnaW5hbCBydW5saXN0cyBhcmUgYWx3YXlzIGxlZnQgdW5tb2RpZmllZCBpbnN0ZWFkIG9mCisJICBiZWluZyBzaWxlbnRseSBjb3JydXB0ZWQuCisJLSBNaXNjIHR5cG8gZml4ZXMuCisKKzIuMC4xMyAtIFVzZSBpZ2V0NV9sb2NrZWQoKSBpbiBwcmVwYXJhdGlvbiBmb3IgZmFrZSBpbm9kZXMgYW5kIHNtYWxsIGNsZWFudXBzLgorCisJLSBSZW1vdmUgbnJfbWZ0X2JpdHMgYW5kIHRoZSBub3cgc3VwZXJmbHVvdXMgdW5pb24gd2l0aCBucl9tZnRfcmVjb3JkcworCSAgZnJvbSBudGZzX3ZvbHVtZSBzdHJ1Y3R1cmUuCisJLSBSZW1vdmUgbnJfbGNuX2JpdHMgYW5kIHRoZSBub3cgc3VwZXJmbHVvdXMgdW5pb24gd2l0aCBucl9jbHVzdGVycworCSAgZnJvbSBudGZzX3ZvbHVtZSBzdHJ1Y3R1cmUuCisJLSBVc2UgaWdldDVfbG9ja2VkKCkgYW5kIGZyaWVuZHMgaW5zdGVhZCBvZiBjb252ZW50aW9uYWwgaWdldCgpLiBXcmFwCisJICB0aGUgY2FsbCBpbiBmcy9udGZzL2lub2RlLmM6Om50ZnNfaWdldCgpIGFuZCB1cGRhdGUgY2FsbGVycyBvZiBpZ2V0KCkKKwkgIHRvIHVzZSBudGZzX2lnZXQoKS4gTGVhdmUgb25seSBvbmUgaWdldCgpIGNhbGwgYXQgbW91bnQgdGltZSBzbyB3ZQorCSAgZG9uJ3QgbmVlZCBhbiBudGZzX2lnZXRfbW91bnQoKS4KKwktIENoYW5nZSBmcy9udGZzL2lub2RlLmM6Om50ZnNfbmV3X2V4dGVudF9pbm9kZSgpIHRvIHRha2UgbWZ0X25vIGFzIGFuCisJICBhZGRpdGlvbmFsIGFyZ3VtZW50LgorCisyLjAuMTIgLSBJbml0aWFsIGNsZWFudXAgb2YgYWRkcmVzcyBzcGFjZSBvcGVyYXRpb25zIGZvbGxvd2luZyAyLjAuMTEgY2hhbmdlcy4KKworCS0gTWVyZ2UgZnMvbnRmcy9hb3BzLmM6OmVuZF9idWZmZXJfcmVhZF9tc3RfYXN5bmMoKSBhbmQKKwkgIGZzL250ZnMvYW9wcy5jOjplbmRfYnVmZmVyX3JlYWRfZmlsZV9hc3luYygpIGludG8gb25lIGZ1bmN0aW9uCisJICBmcy9udGZzL2FvcHMuYzo6ZW5kX2J1ZmZlcl9yZWFkX2F0dHJfYXN5bmMoKSB1c2luZyBOSW5vTXN0UHJvdGVjdGVkKCkKKwkgIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIGFwcGx5IG1zdCBmaXh1cHMgb3Igbm90LgorCS0gQWJvdmUgY2hhbmdlIGFsbG93cyBtZXJnaW5nIGZzL250ZnMvYW9wcy5jOjpudGZzX2ZpbGVfcmVhZF9ibG9jaygpCisJICBhbmQgZnMvbnRmcy9hb3BzLmM6Om50ZnNfbXN0X3JlYWRwYWdlKCkgaW50byBvbmUgZnVuY3Rpb24KKwkgIGZzL250ZnMvYW9wcy5jOjpudGZzX2F0dHJfcmVhZF9ibG9jaygpLiBBbHNvLCBjcmVhdGUgYSB0aW55IHdyYXBwZXIKKwkgIGZzL250ZnMvYW9wcy5jOjpudGZzX21zdF9yZWFkcGFnZSgpIHRvIHRyYW5zZm9ybSB0aGUgcGFyYW1ldGVycyBmcm9tCisJICB0aGUgVkZTIHJlYWRwYWdlIGZ1bmN0aW9uIHByb3RvdHlwZSB0byB0aGUgbnRmc19hdHRyX3JlYWRfYmxvY2soKQorCSAgZnVuY3Rpb24gcHJvdG90eXBlLgorCisyLjAuMTEgLSBJbml0aWFsIHByZXBhcmF0aW9ucyBmb3IgZmFrZSBpbm9kZSBiYXNlZCBhdHRyaWJ1dGUgaS9vLgorCisJLSBNb3ZlIGRlZmluaXRpb24gb2YgbnRmc19pbm9kZV9zdGF0ZV9iaXRzIHRvIGZzL250ZnMvaW5vZGUuaCBhbmQKKwkgIGRvIHNvbWUgbWFjcm8gbWFnaWMgKGFkYXB0ZWQgZnJvbSBpbmNsdWRlL2xpbnV4L2J1ZmZlcl9oZWFkLmgpIHRvCisJICBleHBhbmQgYWxsIHRoZSBoZWxwZXIgZnVuY3Rpb25zIE5Jbm9Gb28oKSwgTklub1NldEZvbygpLCBhbmQKKwkgIE5Jbm9DbGVhckZvbygpLgorCS0gQWRkIG5ldyBmbGFnIHRvIG50ZnNfaW5vZGVfc3RhdGVfYml0czogTklfU3BhcnNlLgorCS0gQWRkIG5ldyBmaWVsZHMgdG8gbnRmc19pbm9kZSBzdHJ1Y3R1cmUgdG8gYWxsb3cgdXNlIG9mIGZha2UgaW5vZGVzCisJICBmb3IgYXR0cmlidXRlIGkvbzogdHlwZSwgbmFtZSwgbmFtZV9sZW4uIEFsc28gYWRkIG5ldyBzdGF0ZSBiaXRzOgorCSAgTklfQXR0ciwgd2hpY2gsIGlmIHNldCwgaW5kaWNhdGVzIHRoZSBpbm9kZSBpcyBhIGZha2UgaW5vZGUsIGFuZAorCSAgTklfTXN0UHJvdGVjdGVkLCB3aGljaCwgaWYgc2V0LCBpbmRpY2F0ZXMgdGhlIGF0dHJpYnV0ZSB1c2VzIG11bHRpCisJICBzZWN0b3IgdHJhbnNmZXIgcHJvdGVjdGlvbiwgaS5lLiBmaXh1cHMgbmVlZCB0byBiZSBhcHBsaWVkIGFmdGVyCisJICByZWFkcyBhbmQgYmVmb3JlL2FmdGVyIHdyaXRlcy4KKwktIFJlbmFtZSBmcy9udGZzL2lub2RlLmM6Om50ZnNfe25ldyxjbGVhcixkZXN0cm95fV9pbm9kZSgpIHRvCisJICBudGZzX3tuZXcsY2xlYXIsZGVzdHJveX1fZXh0ZW50X2lub2RlKCkgYW5kIHVwZGF0ZSBjYWxsZXJzLgorCS0gVXNlIG50ZnNfY2xlYXJfZXh0ZW50X2lub2RlKCkgaW4gZnMvbnRmcy9pbm9kZS5jOjpfX250ZnNfY2xlYXJfaW5vZGUoKQorCSAgaW5zdGVhZCBvZiBudGZzX2Rlc3Ryb3lfZXh0ZW50X2lub2RlKCkuCisJLSBDbGVhbnVwIG1lbW9yeSBkZWFsbG9jYXRpb25zIGluIHtfXyx9bnRmc19jbGVhcl97LGJpZ199aW5vZGUoKS4KKwktIE1ha2UgYWxsIG9wZXJhdGlvbnMgb24gbnRmcyBpbm9kZSBzdGF0ZSBiaXRzIHVzZSB0aGUgTklubyogZnVuY3Rpb25zLgorCS0gU2V0IHVwIHRoZSBuZXcgbnRmcyBpbm9kZSBmaWVsZHMgYW5kIHN0YXRlIGJpdHMgaW4KKwkgIGZzL250ZnMvaW5vZGUuYzo6bnRmc19yZWFkX2lub2RlKCkgYW5kIGFkZCBhcHByb3ByaWF0ZSBjbGVhbnVwIG9mCisJICBhbGxvY2F0ZWQgbWVtb3J5IHRvIF9fbnRmc19jbGVhcl9pbm9kZSgpLgorCS0gQ2xlYW51cCBudGZzX2lub2RlIHN0cnVjdHVyZSBhIGJpdCBmb3IgYmV0dGVyIG9yZGVyaW5nIG9mIGVsZW1lbnRzCisJICB3LnIudC4gdGhlaXIgc2l6ZSB0byBhbGxvdyBiZXR0ZXIgcGFja2luZyBvZiB0aGUgc3RydWN0dXJlIGluIG1lbW9yeS4KKworMi4wLjEwIC0gVGhlcmUgY2FuIG9ubHkgYmUgMl4zMiAtIDEgaW5vZGVzIG9uIGFuIE5URlMgdm9sdW1lLgorCisJLSBBZGQgY2hlY2sgYXQgbW91bnQgdGltZSB0byB2ZXJpZnkgdGhhdCB0aGUgbnVtYmVyIG9mIGlub2RlcyBvbiB0aGUKKwkgIHZvbHVtZSBkb2VzIG5vdCBleGNlZWQgMl4zMiAtIDEsIHdoaWNoIGlzIHRoZSBtYXhpbXVtIGFsbG93ZWQgZm9yCisJICBOVEZTIGFjY29yZGluZyB0byBNaWNyb3NvZnQuCisJLSBDaGFuZ2UgbWZ0X25vIG1lbWJlciBvZiBudGZzX2lub2RlIHN0cnVjdHVyZSB0byBiZSB1bnNpZ25lZCBsb25nLgorCSAgVXBkYXRlIGFsbCB1c2Vycy4gVGhpcyBtYWtlcyBudGZzX2lub2RlLT5tZnRfbm8ganVzdCBhIGNvcHkgb2Ygc3RydWN0CisJICBpbm9kZS0+aV9pbm8uIEJ1dCB3ZSBjYW4ndCBqdXN0IGFsd2F5cyB1c2Ugc3RydWN0IGlub2RlLT5pX2lubyBhbmQKKwkgIHJlbW92ZSBtZnRfbm8gYmVjYXVzZSBleHRlbnQgaW5vZGVzIGRvIG5vdCBoYXZlIGFuIGF0dGFjaGVkIHN0cnVjdAorCSAgaW5vZGUuCisKKzIuMC45IC0gRGVjb21wcmVzc2lvbiBlbmdpbmUgbm93IHVzZXMgYSBzaW5nbGUgYnVmZmVyIGFuZCBvdGhlciBjbGVhbnVwcy4KKworCS0gQ2hhbmdlIGRlY29tcHJlc3Npb24gZW5naW5lIHRvIHVzZSBhIHNpbmdsZSBidWZmZXIgcHJvdGVjdGVkIGJ5IGEKKwkgIHNwaW4gbG9jayBpbnN0ZWFkIG9mIHBlci1DUFUgYnVmZmVycy4gKFJ1c3R5IFJ1c3NlbGwpCisJLSBEbyBub3QgdXBkYXRlIGNiX3BvcyB3aGVuIGhhbmRsaW5nIGEgcGFydGlhbCBmaW5hbCBwYWdlIGR1cmluZworCSAgZGVjb21wcmVzc2lvbiBvZiBhIHNwYXJzZSBjb21wcmVzc2lvbiBibG9jaywgYXMgdGhlIHZhbHVlIGlzIGxhdGVyCisJICByZXNldCB3aXRob3V0IGJlaW5nIHJlYWQvdXNlZC4gKFJ1c3R5IFJ1c3NlbGwpCisJLSBTd2l0Y2ggdG8gdXNpbmcgdGhlIG5ldyBLTV9CSU9fU1JDX0lSUSBmb3IgYXRvbWljIGttYXAoKXMuIChBbmRyZXcKKwkgIE1vcnRvbikKKwktIENoYW5nZSBidWZmZXIgc2l6ZSBpbiBudGZzX3JlYWRkaXIoKS9udGZzX2ZpbGxkaXIoKSB0byB1c2UKKwkgIE5MU19NQVhfQ0hBUlNFVF9TSVpFIHdoaWNoIG1ha2VzIHRoZSBidWZmZXJzIGFsbW9zdCAxa2lCIGVhY2ggYnV0CisJICBpdCBhbHNvIG1ha2VzIGV2ZXJ5dGhpbmcgc2FmZXIgc28gaXQgaXMgYSBnb29kIHRoaW5nLgorCS0gTWlzY2VsbGFuZW91cyBtaW5vciBjbGVhbnVwcyB0byBjb21tZW50cy4KKworMi4wLjggLSBNYWpvciB1cGRhdGVzIGZvciBoYW5kbGluZyBvZiBjYXNlIHNlbnNpdGl2aXR5IGFuZCBkY2FjaGUgYWxpYXNpbmcuCisKKwlCaWcgdGhhbmtzIGdvIHRvIEFsIFZpcm8gYW5kIG90aGVyIGluaGFiaXRhbnRzIG9mICNrZXJuZWwgZm9yIGludmVzdGluZworCXRoZWlyIHRpbWUgdG8gZGlzY3VzcyB0aGUgY2FzZSBzZW5zaXRpdml0eSBhbmQgZGNhY2hlIGFsaWFzaW5nIGlzc3Vlcy4KKworCS0gUmVtb3ZlIHVudXNlZCBzb3VyY2UgZmlsZSBmcy9udGZzL2F0dHJhb3BzLmMuCisJLSBSZW1vdmUgc2hvd19pbm9kZXMgbW91bnQgb3B0aW9uKHMpLCB0aHVzIGRyb3BwaW5nIHN1cHBvcnQgZm9yCisJICBkaXNwbGF5aW5nIG9mIHNob3J0IGZpbGUgbmFtZXMuCisJLSBSZW1vdmUgZGVwcmVjYXRlZCBtb3VudCBvcHRpb24gcG9zaXguCisJLSBSZXN0b3JlIHNob3dfc3lzX2ZpbGVzIG1vdW50IG9wdGlvbi4KKwktIEFkZCBuZXcgbW91bnQgb3B0aW9uIGNhc2Vfc2Vuc2l0aXZlLCB0byBkZXRlcm1pbmUgaWYgdGhlIGRyaXZlcgorCSAgdHJlYXRzIGZpbGUgbmFtZXMgYXMgY2FzZSBzZW5zaXRpdmUgb3Igbm90LiBJZiBjYXNlIHNlbnNpdGl2ZSwgY3JlYXRlCisJICBmaWxlIG5hbWVzIGluIHRoZSBQT1NJWCBuYW1lc3BhY2UuIE90aGVyd2lzZSBjcmVhdGUgZmlsZSBuYW1lcyBpbiB0aGUKKwkgIExPTkcvV0lOMzIgbmFtZXNwYWNlLiBOb3RlLCBmaWxlcyByZW1haW4gYWNjZXNzaWJsZSB2aWEgdGhlaXIgc2hvcnQKKwkgIGZpbGUgbmFtZSwgaWYgaXQgZXhpc3RzLgorCS0gUmVtb3ZlIHJlYWxseSBkdW1iIGxvZ2ljIGJ1ZyBpbiBib290IHNlY3RvciByZWNvdmVyeSBjb2RlLgorCS0gRml4IGRjYWNoZSBhbGlhc2luZyBpc3N1ZXMgd3J0IHNob3J0L2xvbmcgZmlsZSBuYW1lcyB2aWEgY2hhbmdlcworCSAgdG8gZnMvbnRmcy9kaXIuYzo6bnRmc19sb29rdXBfaW5vZGVfYnlfbmFtZSgpIGFuZAorCSAgZnMvbnRmcy9uYW1laS5jOjpudGZzX2xvb2t1cCgpOgorCSAgLSBBZGQgYWRkaXRpb25hbCBhcmd1bWVudCB0byBudGZzX2xvb2t1cF9pbm9kZV9ieV9uYW1lKCkgaW4gd2hpY2ggd2UKKwkgICAgcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtYXRjaGluZyBmaWxlIG5hbWUgaWYgdGhlIGNhc2UgaXMgbm90CisJICAgIG1hdGNoaW5nIG9yIHRoZSBtYXRjaCBpcyBhIHNob3J0IGZpbGUgbmFtZS4gU2VlIGNvbW1lbnRzIGFib3ZlIHRoZQorCSAgICBmdW5jdGlvbiBkZWZpbml0aW9uIGZvciBkZXRhaWxzLgorCSAgLSBDaGFuZ2UgbnRmc19sb29rdXAoKSB0byBvbmx5IGNyZWF0ZSBkY2FjaGUgZW50cmllcyBmb3IgdGhlIGNvcnJlY3RseQorCSAgICBjYXNlZCBmaWxlIG5hbWUgYW5kIG9ubHkgZm9yIHRoZSBXSU4zMiBuYW1lc3BhY2UgY291bnRlcnBhcnQgb2YgRE9TCisJICAgIG5hbWVzcGFjZSBmaWxlIG5hbWVzLiBUaGlzIGVuc3VyZXMgd2UgaGF2ZSBvbmx5IG9uZSBkZW50cnkgcGVyCisJICAgIGRpcmVjdG9yeSBhbmQgYWxzbyByZW1vdmVzIGFsbCBkY2FjaGUgYWxpYXNpbmcgaXNzdWVzIGJldHdlZW4gc2hvcnQKKwkgICAgYW5kIGxvbmcgZmlsZSBuYW1lcyBvbmNlIHdlIGFkZCB3cml0ZSBzdXBwb3J0LiBTZWUgY29tbWVudHMgYWJvdmUKKwkgICAgZnVuY3Rpb24gZm9yIGRldGFpbHMuCisJLSBGaXggcG90ZW50aWFsIDEgYnl0ZSBvdmVyZmxvdyBpbiBmcy9udGZzL3VuaXN0ci5jOjpudGZzX3Vjc3RvbmxzKCkuCisKKzIuMC43IC0gTWlub3IgY2xlYW51cHMgYW5kIHVwZGF0ZXMgZm9yIGNoYW5nZXMgaW4gY29yZSBrZXJuZWwgY29kZS4KKworCS0gUmVtb3ZlIG11Y2ggb2YgdGhlIE5VTEwgc3RydWN0IGVsZW1lbnQgaW5pdGlhbGl6ZXJzLgorCS0gVmFyaW91cyB1cGRhdGVzIHRvIG1ha2UgY29tcGF0aWJsZSB3aXRoIHJlY2VudCBrZXJuZWxzLgorCS0gUmVtb3ZlIGRlZmluZXMgb2YgTUFYX0JVRl9QRVJfUEFHRSBhbmQgaW5jbHVkZSBsaW51eC9idWZmZXJfaGVhZC5oCisJICBpbiBmcy9udGZzL250ZnMuaCBpbnN0ZWFkLgorCS0gUmVtb3ZlIG5vIGxvbmdlciBuZWVkZWQgS0VSTkVMX1ZFUlNJT04gY2hlY2tzLiBXZSBhcmUgbm93IGluIHRoZQorCSAga2VybmVsIHByb3BlciBzbyB0aGV5IGFyZSBubyBsb25nZXIgbmVlZGVkLgorCisyLjAuNiAtIE1ham9yIGJ1Z2ZpeCB0byBtYWtlIGNvbXBhdGlibGUgd2l0aCBvdGhlciBrZXJuZWwgY2hhbmdlcy4KKworCS0gSW5pdGlhbGl6ZSB0aGUgbWZ0Ym1wIGFkZHJlc3Mgc3BhY2UgcHJvcGVybHkgbm93IHRoYXQgdGhlcmUgYXJlIG1vcmUKKwkgIGZpZWxkcyBpbiB0aGUgc3RydWN0IGFkZHJlc3Nfc3BhY2UuIFRoaXMgd2FzIGxlYWRpbmcgdG8gaGFuZ3MgYW5kCisJICBvb3BzZXMgb24gdW1vdW50IHNpbmNlIDIuNS4xMiBiZWNhdXNlIG9mIGNoYW5nZXMgdG8gb3RoZXIgcGFydHMgb2YKKwkgIHRoZSBrZXJuZWwuIFdlIHByb2JhYmx5IHdhbnQgYSBrZXJuZWwgZ2VuZXJpYyBpbml0X2FkZHJlc3Nfc3BhY2UoKQorCSAgZnVuY3Rpb24uLi4KKwktIERyb3AgQktMIGZyb20gbnRmc19yZWFkZGlyKCkgYWZ0ZXIgY29uc3VsdGF0aW9uIHdpdGggQWwgVmlyby4gVGhlCisJICBvbmx5IGNhbGxlciBvZiAtPnJlYWRkaXIoKSBpcyB2ZnNfcmVhZGRpcigpIHdoaWNoIGhvbGRzIGlfc2VtIGR1cmluZworCSAgdGhlIGNhbGwsIGFuZCBpX3NlbSBpcyBzdWZmaWNpZW50IHByb3RlY3Rpb24gYWdhaW5zdCBjaGFuZ2VzIGluIHRoZQorCSAgZGlyZWN0b3J5IGlub2RlIChpbmNsdWRpbmcgLT5pX3NpemUpLgorCS0gVXNlIGdlbmVyaWNfZmlsZV9sbHNlZWsoKSBmb3IgZGlyZWN0b3JpZXMgKGFzIG9wcG9zZWQgdG8KKwkgIGRlZmF1bHRfbGxzZWVrKCkpIGFzIHRoaXMgZG93bnMgaV9zZW0gaW5zdGVhZCBvZiB0aGUgQktMIHdoaWNoIGlzCisJICB3aGF0IHdlIG5vdyBuZWVkIGZvciBleGNsdXNpb24gYWdhaW5zdCAtPmZfcG9zIGNoYW5nZXMgY29uc2lkZXJpbmcgd2UKKwkgIG5vIGxvbmdlciB0YWtlIHRoZSBCS0wgaW4gbnRmc19yZWFkZGlyKCkuCisKKzIuMC41IC0gTWFqb3IgYnVnZml4LiBCdWZmZXIgb3ZlcmZsb3cgaW4gZXh0ZW50IGlub2RlIGhhbmRsaW5nLgorCisJLSBObyBuZWVkIHRvIHNldCBvbGQgYmxvY2tzaXplIGluIHN1cGVyLmM6Om50ZnNfZmlsbF9zdXBlcigpIGFzIHRoZQorCSAgVkZTIGRvZXMgc28gdmlhIGludm9jYXRpb24gb2YgZGVhY3RpdmF0ZV9zdXBlcigpIGNhbGxpbmcKKwkgIGZzLT5maWxsX3N1cGVyKCkgY2FsbGluZyBibG9ja19raWxsX3N1cGVyKCkgd2hpY2ggZG9lcyBpdC4KKwktIEJLTCBtb3ZlZCBmcm9tIFZGUyBpbnRvIGRpci5jOjpudGZzX3JlYWRkaXIoKS4gKExpbnVzIFRvcnZhbGRzKQorCSAgLT4gRG8gd2UgcmVhbGx5IG5lZWQgaXQ/IEkgZG9uJ3QgdGhpbmsgc28gYXMgd2UgaGF2ZSBleGNsdXNpb24gb24KKwkgIHRoZSBkaXJlY3RvcnkgbnRmc19pbm9kZSByd19zZW1hcGhvcmUgbXJlY19sb2NrLiBXZSBtbWlnaHQgaGF2ZSB0bworCSAgbW92ZSB0aGUgLT5mX3BvcyBhY2Nlc3NlcyB1bmRlciB0aGUgbXJlY19sb2NrIHRob3VnaC4gQ2hlY2sgdGhpcy4uLgorCS0gRml4IHJlYWxseSwgcmVhbGx5LCByZWFsbHkgc3R1cGlkIGJ1ZmZlciBvdmVyZmxvdyBpbiBleHRlbnQgaW5vZGUKKwkgIGhhbmRsaW5nIGluIG1mdC5jOjptYXBfZXh0ZW50X21mdF9yZWNvcmQoKS4KKworMi4wLjQgLSBDbGVhbnVwcyBhbmQgdXBkYXRlcyBmb3Iga2VybmVsIDIuNS4xMS4KKworCS0gQWRkIGRvY3VtZW50YXRpb24gb24gaG93IHRvIHVzZSB0aGUgTUQgZHJpdmVyIHRvIGJlIGFibGUgdG8gdXNlIE5URlMKKwkgIHN0cmlwZSBhbmQgdm9sdW1lIHNldHMgaW4gTGludXggYW5kIGdlbmVyYWxseSBjbGVhbnVwIGRvY3VtZW50YXRpb24KKwkgIGEgYml0LgorCVJlbW92ZSBhbGwgdXNlcyBvZiBrZGV2X3QgaW4gZmF2b3VyIG9mIHN0cnVjdCBibG9ja19kZXZpY2UgKjoKKwktIENoYW5nZSBjb21wcmVzcy5jOjpudGZzX2ZpbGVfcmVhZF9jb21wcmVzc2VkX2Jsb2NrKCkgdG8gdXNlCisJICBzYl9nZXRibGsoKSBpbnN0ZWFkIG9mIGdldGJsaygpLgorCS0gQ2hhbmdlIHN1cGVyLmM6Om50ZnNfZmlsbF9zdXBlcigpIHRvIHVzZSBiZGV2X2hhcmRzZWN0X3NpemUoKSBpbnN0ZWFkCisJICBvZiBnZXRfaGFyZHNlY3Rfc2l6ZSgpLgorCS0gTm8gbmVlZCB0byBnZXQgb2xkIGJsb2Nrc2l6ZSBpbiBzdXBlci5jOjpudGZzX2ZpbGxfc3VwZXIoKSBhcworCSAgZnMvc3VwZXIuYzo6Z2V0X3NiX2JkZXYoKSBhbHJlYWR5IGRvZXMgdGhpcy4KKwktIFNldCBiaC0+Yl9iZGV2IGluc3RlYWQgb2YgYmgtPmJfZGV2IHRocm91Z2hvdXQgYW9wcy5jLgorCisyLjAuMyAtIFNtYWxsIGJ1ZyBmaXhlcywgY2xlYW51cHMsIGFuZCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMuCisKKwktIFJlbW92ZSBzb21lIGRlYWQgY29kZSBmcm9tIG1mdC5jLgorCS0gT3B0aW1pemUgcmVhZHBhZ2UgYW5kIHJlYWRfYmxvY2sgZnVuY3Rpb25zIHRocm91Z2hvdXQgYW9wcy5jIHNvIHRoYXQKKwkgIG9ubHkgaW5pdGlhbGl6ZWQgYmxvY2tzIGFyZSByZWFkLiBOb24taW5pdGlhbGl6ZWQgb25lcyBoYXZlIHRoZWlyCisJICBidWZmZXIgaGVhZCBtYXBwZWQsIHplcm9lZCwgYW5kIHNldCB1cCB0byBkYXRlLCB3aXRob3V0IHNjaGVkdWxpbmcKKwkgIGFueSBpL28uIFRoYW5rcyB0byBBbCBWaXJvIGZvciBhZHZpY2Ugb24gaG93IHRvIGF2b2lkIHRoZSBkZXZpY2UgaS9vLgorCVRoYW5rcyBnbyB0byBBbmRyZXcgTW9ydG9uIGZvciBzcG90dGluZyB0aGUgYmVsb3c6CisJLSBGaXggYnVnbGV0IGluIGFsbG9jYXRlX2NvbXByZXNzaW9uX2J1ZmZlcnMoKSBlcnJvciBjb2RlIHBhdGguCisJLSBDYWxsIGZsdXNoX2RjYWNoZV9wYWdlKCkgYWZ0ZXIgbW9kaWZ5aW5nIHBhZ2UgY2FjaGUgcGFnZSBjb250ZW50cyBpbgorCSAgbnRmc19maWxlX3JlYWRwYWdlKCkuCisJLSBDaGVjayBmb3IgZXhpc3RlbmNlIG9mIHBhZ2UgYnVmZmVycyB0aHJvdWdob3V0IGFvcHMuYyBiZWZvcmUgY2FsbGluZworCSAgY3JlYXRlX2VtcHR5X2J1ZmZlcnMoKS4gVGhpcyBoYXBwZW5zIHdoZW4gYW4gSS9PIGVycm9yIG9jY3VycyBhbmQgdGhlCisJICByZWFkIGlzIHJldHJpZWQuIChJdCBhbHNvIGhhcHBlbnMgb25jZSB3cml0aW5nIGlzIGltcGxlbWVudGVkIHNvIHRoYXQKKwkgIG5lZWRlZCBkb2luZyBhbnl3YXkgYnV0IEkgaGFkIGxlZnQgaXQgZm9yIGxhdGVyLi4uKQorCS0gRG9uJ3QgQlVHX09OKCkgdXB0b2RhdGUgYW5kL29yIG1hcHBlZCBidWZmZXJzIHRocm91Z2hvdXQgYW9wcy5jIGluCisJICByZWFkcGFnZSBhbmQgcmVhZF9ibG9jayBmdW5jdGlvbnMuIFJlYXNvbmluZyBzYW1lIGFzIGFib3ZlIChpLmUuIEkvTworCSAgZXJyb3IgcmV0cmllcyBhbmQgZnV0dXJlIHdyaXRlIGNvZGUgcGF0aHMuKQorCisyLjAuMiAtIE1pbm9yIHVwZGF0ZXMgYW5kIGNsZWFudXBzLgorCisJLSBDbGVhbnVwOiByZW5hbWUgbXN0LmM6Ol9fcG9zdF9yZWFkX21zdF9maXh1cCB0byBwb3N0X3dyaXRlX21zdF9maXh1cAorCSAgYW5kIGNsZWFudXAgdGhlIGNvZGUgYSBiaXQsIHJlbW92aW5nIHRoZSB1bnVzZWQgc2l6ZSBwYXJhbWV0ZXIuCisJLSBDaGFuZ2UgZGVmYXVsdCBmbWFzayB0byAwMTc3IGFuZCB1cGRhdGUgZG9jdW1lbnRhdGlvbi4KKwktIENoYW5nZSBhdHRyaWIuYzo6Z2V0X2F0dHJfc2VhcmNoX2N0eCgpIHRvIHJldHVybiB0aGUgc2VhcmNoIGNvbnRleHQKKwkgIGRpcmVjdGx5IGluc3RlYWQgb2YgdGFraW5nIHRoZSBhZGRyZXNzIG9mIGEgcG9pbnRlci4gQSByZXR1cm4gdmFsdWUKKwkgIG9mIE5VTEwgbWVhbnMgdGhlIGFsbG9jYXRpb24gZmFpbGVkLiBVcGRhdGVkIGFsbCBjYWxsZXJzCisJICBhcHByb3ByaWF0ZWx5LgorCS0gVXBkYXRlIHRvIDIuNS45IGtlcm5lbCAocHJlc2VydmluZyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSkgYnkKKwkgIHJlcGxhY2luZyBhbGwgb2NjdXJlbmNlcyBvZiBwYWdlLT5idWZmZXJzIHdpdGggcGFnZV9idWZmZXJzKHBhZ2UpLgorCS0gRml4IG1pbm9yIGJ1Z3MgaW4gcnVubGlzdCBtZXJnaW5nLCBhbHNvIG1pbm9yIGNsZWFudXAuCisJLSBVcGRhdGVzIHRvIGJvb3RzZWN0b3IgbGF5b3V0IGFuZCBtZnQgbWlycm9yIGNvbnRlbnRzIGRlc2NyaXB0aW9ucy4KKwktIFNtYWxsIGJ1ZyBmaXggaW4gZXJyb3IgZGV0ZWN0aW9uIGluIHVuaXN0ci5jIGFuZCBzb21lIGNsZWFudXBzLgorCS0gR3JvdyBuYW1lIGJ1ZmZlciBhbGxvY2F0aW9ucyBpbiB1bmlzdHIuYyBpbiBhbGlnbmVkIG11dGxpcGxlZCBvZiA2NAorCSAgYnl0ZXMuCisKKzIuMC4xIC0gTWlub3IgdXBkYXRlcy4KKworCS0gTWFrZSBkZWZhdWx0IHVtYXNrIGNvcnJlc3BvbmQgdG8gZG9jdW1lbnRhdGlvbi4KKwktIEltcHJvdmUgZG9jdW1lbnRhdGlvbi4KKwktIFNldCBkZWZhdWx0IG1vZGUgdG8gaW5jbHVkZSBleGVjdXRlIGJpdC4gVGhlIHt1LGYsZH1tYXNrIGNhbiBiZSB1c2VkCisJICB0byB0YWtlIGl0IGF3YXkgaWYgZGVzaXJlZC4gVGhpcyBhbGxvd3MgYmluYXJpZXMgdG8gYmUgZXhlY3V0ZWQgZnJvbQorCSAgYSBtb3VudGVkIG50ZnMgcGFydGl0aW9uLgorCisyLjAuMCAtIE5ldyB2ZXJzaW9uIG51bWJlci4gUmVtb3ZlIFRORyBmcm9tIHRoZSBuYW1lLiBOb3cgaW4gdGhlIGtlcm5lbC4KKworCS0gQWRkIGtpbGxfc3VwZXIsIGp1c3Qga2VlcGluZyB1cCB3aXRoIHRoZSB2ZnMgY2hhbmdlcyBpbiB0aGUga2VybmVsLgorCS0gUmVwZWF0IHNvbWUgY2hhbmdlcyBmcm9tIHRuZy0wLjAuOCB0aGF0IHNvbWVob3cgZ290IGxvc3Qgb24gdGhlIHdheQorCSAgZnJvbSB0aGUgQ1ZTIGltcG9ydCBpbnRvIEJpdEtlZXBlci4KKwktIEJlZ2luIHRvIGltcGxlbWVudCBwcm9wZXIgaGFuZGxpbmcgb2YgYWxsb2NhdGVkX3NpemUgdnMKKwkgIGluaXRpYWxpemVkX3NpemUgdnMgZGF0YV9zaXplIChpLmUuIGlfc2l6ZSkuIERvbmUgYXJlCisJICBtZnQuYzo6bnRmc19tZnRfcmVhZHBhZ2UoKSwgYW9wcy5jOjplbmRfYnVmZmVyX3JlYWRfaW5kZXhfYXN5bmMoKSwKKwkgIGFuZCBhdHRyaWIuYzo6bG9hZF9hdHRyaWJ1dGVfbGlzdCgpLgorCS0gTG9jayB0aGUgcnVubGlzdCBpbiBhdHRyaWIuYzo6bG9hZF9hdHRyaWJ1dGVfbGlzdCgpIHdoaWxlIHVzaW5nIGl0LgorCS0gRml4IG1lbW9yeSBsZWFrIGluIG50ZnNfZmlsZV9yZWFkX2NvbXByZXNzZWRfYmxvY2soKSBhbmQgZ2VuZXJhbGx5CisJICBjbGVhbiB1cCBjb21wcmVzcy5jIGEgbGl0dGxlLCByZW1vdmluZyBzb21lIHVuY29tbWVudGVkL3VudXNlZCBkZWJ1ZworCSAgY29kZS4KKwktIFRpZHkgdXAgZGlyLmMgYSBsaXR0bGUgYml0LgorCS0gRG9uJ3QgYm90aGVyIGdldHRpbmcgdGhlIHJ1bmxpc3QgaW4gaW5vZGUuYzo6bnRmc19yZWFkX2lub2RlKCkuCisJLSBNZXJnZSBtZnQuYzo6bnRmc19tZnRfcmVhZHBhZ2UoKSBhbmQgYW9wcy5jOjpudGZzX2luZGV4X3JlYWRwYWdlKCkKKwkgIGNyZWF0aW5nIGFvcHMuYzo6bnRmc19tc3RfcmVhZHBhZ2UoKSwgaW1wcm92aW5nIHRoZSBoYW5kbGluZyBvZgorCSAgaG9sZXMgYW5kIG92ZXJmbG93IGluIHRoZSBwcm9jZXNzIGFuZCBpbXBsZW1lbnRpbmcgdGhlIGNvcnJlY3QKKwkgIGVxdWl2YWxlbnQgb2YgbnRmc19maWxlX2dldF9ibG9jaygpIGluIG50ZnNfbXN0X3JlYWRwYWdlKCkgaXRzZWxmLgorCSAgSSBhbSBhaW1pbmcgZm9yIGNvcnJlY3RuZXNzIGF0IHRoZSBtb21lbnQuIE1vZHVsYXJpc2F0aW9uIGNhbiBjb21lCisJICBsYXRlci4KKwktIFJlbmFtZSBhb3BzLmM6OmVuZF9idWZmZXJfcmVhZF9pbmRleF9hc3luYygpIHRvCisJICBlbmRfYnVmZmVyX3JlYWRfbXN0X2FzeW5jKCkgYW5kIG9wdGltaXplIHRoZSBvdmVyZmxvdyBjaGVja2luZyBhbmQKKwkgIGhhbmRsaW5nLgorCS0gVXNlIHRoZSBob3N0IG9mIHRoZSBtZnRibXAgYWRkcmVzcyBzcGFjZSBtYXBwaW5nIHRvIGhvbGQgdGhlIG50ZnMKKwkgIHZvbHVtZS4gVGhpcyBpcyBuZWVkZWQgc28gdGhlIGFzeW5jIGkvbyBjb21wbGV0aW9uIGhhbmRsZXIgY2FuCisJICByZXRyaWV2ZSBhIHBvaW50ZXIgdG8gdGhlIHZvbHVtZS4gSG9wZWZ1bGx5IHRoaXMgd2lsbCBub3QgY2F1c2UKKwkgIHByb2JsZW1zIGVsc2V3aGVyZSBpbiB0aGUga2VybmVsLi4uIE90aGVyd2lzZSB3aWxsIG5lZWQgdG8gdXNlIGEKKwkgIGZha2UgaW5vZGUuCisJLSBDb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBwcm9wZXIgaGFuZGxpbmcgb2YgYWxsb2NhdGVkX3NpemUgdnMKKwkgIGluaXRpYWxpemVkX3NpemUgdnMgZGF0YV9zaXplIChpLmUuIGlfc2l6ZSkgaW4gd2hvbGUgZHJpdmVyLgorCSAgQmFzaWNhbGx5IGFvcHMuYyBpcyBub3cgY29tcGxldGVseSByZXdyaXR0ZW4uCisJLSBDaGFuZ2UgTlRGUyBkcml2ZXIgbmFtZSB0byBqdXN0IE5URlMgYW5kIHNldCB2ZXJzaW9uIG51bWJlciB0byAyLjAuMAorCSAgdG8gbWFrZSBhIGNsZWFyIGRpc3RpbmN0aW9uIGZyb20gdGhlIG9sZCBkcml2ZXIgd2hpY2ggaXMgc3RpbGwgb24KKwkgIHZlcnNpb24gMS4xLjIyLgorCit0bmctMC4wLjggLSAwOC8wMy8yMDAyIC0gTm93IHVzaW5nIEJpdEtlZXBlciwgaHR0cDovL2xpbnV4LW50ZnMuYmtiaXRzLm5ldC8KKworCS0gUmVwbGFjZSBiZGV2bmFtZShzYi0+c19kZXYpIHdpdGggc2ItPnNfaWQuCisJLSBSZW1vdmUgbm93IHN1cGVyZmx1b3VzIG5ldy1saW5lIGNoYXJhY3RlcnMgaW4gYWxsIGNhbGxlcnMgb2YKKwkgIG50ZnNfZGVidWcoKS4KKwktIEFwcGx5IGtsdWRnZSBpbiBudGZzX3JlYWRfaW5vZGUoKSwgc2V0dGluZyBpX25saW5rIHRvIDEgZm9yCisJICBkaXJlY3Rvcmllcy4gV2l0aG91dCB0aGlzIHRoZSAiZmluZCIgdXRpbGl0eSBnZXRzIHZlcnkgdXBzZXQgd2hpY2ggaXMKKwkgIGZhaXIgZW5vdWdoIGFzIExpbnV4L1VuaXggZG8gbm90IHN1cHBvcnQgZGlyZWN0b3J5IGhhcmQgbGlua3MuCisJLSBGdXJ0aGVyIHJ1bmxpc3QgbWVyZ2luZyB3b3JrLiAoUmljaGFyZCBSdXNzb24pCisJLSBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgZ2NjLTIuOTUuIChSaWNoYXJkIFJ1c3NvbikKKwktIFVwZGF0ZSB0byBrZXJuZWwgMi41LjUtcHJlMSBhbmQgcmVkaWZmIHRoZSBub3cgdGlueSBwYXRjaC4KKwktIENvbnZlcnQgdG8gbmV3IGZpbGUgc3lzdGVtIGRlY2xhcmF0aW9uIHVzaW5nIC0+bnRmc19nZXRfc2IoKSBhbmQKKwkgIHJlcGxhY2luZyBudGZzX3JlYWRfc3VwZXIoKSB3aXRoIG50ZnNfZmlsbF9zdXBlcigpLgorCS0gU2V0IHNfbWF4Ynl0ZXMgdG8gTUFYX0xGU19GSUxFU0laRSB0byBhdm9pZCBwYWdlIGNhY2hlIHBhZ2UgaW5kZXgKKwkgIG92ZXJmbG93IG9uIDMyLWJpdCBhcmNoaXRlY3R1cmVzLgorCS0gQ2xlYW51cCB1cGNhc2UgbG9hZGluZyBjb2RlIHRvIHVzZSBudGZzXyh1biltYXBfcGFnZSgpLgorCS0gRGlzYWJsZS9yZWVuYWJsZSBwcmVlbXRpb24gaW4gY3JpdGljYWwgc2VjdGlvbnMgb2YgY29tcGVzc2lvbiBlbmdpbmUuCisJLSBSZXBsYWNlIGRldmljZSBzaXplIGRldGVybWluYXRpb24gaW4gbnRmc19maWxsX3N1cGVyKCkgd2l0aAorCSAgc2ItPnNfYmRldi0+YmRfaW5vZGUtPmlfc2l6ZSAoaW4gYnl0ZXMpIGFuZCByZW1vdmUgbm93IHN1cGVyZmx1b3VzCisJICBmdW5jdGlvbiBzdXBlci5jOjpnZXRfbnJfYmxvY2tzKCkuCisJLSBJbXBsZW1lbnQgYSBtb3VudCB0aW1lIG9wdGlvbiAoc2hvd19pbm9kZXMpIGFsbG93aW5nIGNob2ljZSBvZiB3aGljaAorCSAgdHlwZXMgb2YgaW5vZGUgbmFtZXMgcmVhZGRpcigpIHJldHVybnMgYW5kIG1vZGlmeSBudGZzX2ZpbGxkaXIoKQorCSAgYWNjb3JkaW5nbHkuIFRoZXJlIGFyZSBzZXZlcmFsIHBhcmFtZXRlcnMgdG8gc2hvd19pbm9kZXM6CisJCXN5c3RlbToJc3lzdGVtIGZpbGVzCisJCXdpbjMyOglsb25nIGZpbGUgbmFtZXMgKGluY2x1ZGluZyBQT1NJWCBmaWxlIG5hbWVzKSBbREVGQVVMVF0KKwkJbG9uZzoJc2FtZSBhcyB3aW4zMgorCQlkb3M6CXNob3J0IGZpbGUgbmFtZXMgb25seSAoZXhjbHVkaW5nIFBPU0lYIGZpbGUgbmFtZXMpCisJCXNob3J0OglzYW1lIGFzIGRvcworCQlwb3NpeDoJc2FtZSBhcyBib3RoIHdpbjMyIGFuZCBkb3MKKwkJYWxsOglhbGwgZmlsZSBuYW1lcworCSAgTm90ZSB0aGF0IHRoZSBvcHRpb25zIGFyZSBhZGRpdGl2ZSwgaS5lLiBzcGVjaWZ5aW5nOgorCQktbyBzaG93X2lub2Rlcz1zeXN0ZW0sc2hvd19pbm9kZXM9d2luMzIsc2hvd19pbm9kZXM9ZG9zCisJICBpcyB0aGUgc2FtZSBhcyBzcGVjaWZ5aW5nOgorCQktbyBzaG93X2lub2Rlcz1hbGwKKwkgIE5vdGUgdGhhdCB0aGUgInBvc2l4IiBhbmQgImFsbCIgb3B0aW9ucyB3aWxsIHNob3cgYWxsIGRpcmVjdG9yeQorCSAgbmFtZXMsIEJVVCB0aGUgbGluayBjb3VudCBvbiBlYWNoIGRpcmVjdG9yeSBpbm9kZSBlbnRyeSBpcyBzZXQgdG8gMSwKKwkgIGR1ZSB0byBMaW51eCBub3Qgc3VwcG9ydGluZyBkaXJlY3RvcnkgaGFyZCBsaW5rcy4gVGhpcyBtYXkgd2VsbAorCSAgY29uZnVzZSBzb21lIHVzZXJzcGFjZSBhcHBsaWNhdGlvbnMsIHNpbmNlIHRoZSBkaXJlY3RvcnkgbmFtZXMgd2lsbAorCSAgaGF2ZSB0aGUgc2FtZSBpbm9kZSBudW1iZXJzLiBUaHVzIGl0IGlzIE5PVCBhZHZpc2FibGUgdG8gdXNlIHRoZQorCSAgInBvc2l4IiBvciAiYWxsIiBvcHRpb25zLiBXZSBwcm92aWRlIHRoZW0gb25seSBmb3IgY29tcGxldGVuZXNzIHNha2UuCisJLSBBZGQgY29waWVzIG9mIGFsbG9jYXRlZF9zaXplLCBpbml0aWFsaXplZF9zaXplLCBhbmQgY29tcHJlc3NlZF9zaXplIHRvCisJICB0aGUgbnRmcyBpbm9kZSBzdHJ1Y3R1cmUgYW5kIHNldCB0aGVtIHVwIGluCisJICBpbm9kZS5jOjpudGZzX3JlYWRfaW5vZGUoKS4gVGhlc2UgcmVmbGVjdCB0aGUgdW5uYW1lZCBkYXRhIGF0dHJpYnV0ZQorCSAgZm9yIGZpbGVzIGFuZCB0aGUgaW5kZXggYWxsb2NhdGlvbiBhdHRyaWJ1dGUgZm9yIGRpcmVjdG9yaWVzLgorCS0gQWRkIGNvcGllcyBvZiBhbGxvY2F0ZWRfc2l6ZSBhbmQgaW5pdGlhbGl6ZWRfc2l6ZSB0byBudGZzIGlub2RlIGZvcgorCSAgJEJJVE1BUCBhdHRyaWJ1dGUgb2YgbGFyZ2UgZGlyZWN0b3JpZXMgYW5kIHNldCB0aGVtIHVwIGluCisJICBpbm9kZS5jOjpudGZzX3JlYWRfaW5vZGUoKS4KKwktIEFkZCBjb3BpZXMgb2YgYWxsb2NhdGVkX3NpemUgYW5kIGluaXRpYWxpemVkX3NpemUgdG8gbnRmcyB2b2x1bWUgZm9yCisJICAkQklUTUFQIGF0dHJpYnV0ZSBvZiAkTUZUIGFuZCBzZXQgdGhlbSB1cCBpbgorCSAgc3VwZXIuYzo6bG9hZF9zeXN0ZW1fZmlsZXMoKS4KKwktIFBhcnNlIGRlcHJlY2F0ZWQgbnRmcyBkcml2ZXIgb3B0aW9ucyAoaW9jaGFyc2V0LCBzaG93X3N5c19maWxlcywKKwkgIHBvc2l4LCBhbmQgdXRmOCkgYW5kIHRlbGwgdXNlciB3aGF0IHRoZSBuZXcgb3B0aW9ucyB0byB1c2UgYXJlLiBOb3RlCisJICB3ZSBzdGlsbCBkbyBzdXBwb3J0IHRoZW0gYnV0IHRoZXkgd2lsbCBiZSByZW1vdmVkIHdpdGgga2VybmVsIDIuNy54LgorCS0gQ2hhbmdlIGFsbCBvY2N1cmVuY2VzIG9mIGludGVnZXIgbG9uZyBsb25nIHByaW50ZiBmb3JtYXR0aW5nIHRvIGhleAorCSAgYXMgcHJpbnRrKCkgd2lsbCBub3Qgc3VwcG9ydCBsb25nIGxvbmcgaW50ZWdlciBmb3JtYXQgaWYvd2hlbiB0aGUKKwkgIGRpdjY0IHBhdGNoIGdvZXMgaW50byB0aGUga2VybmVsLgorCS0gTWFrZSBzbGFiIGNhY2hlcyBoYXZlIHN0YWJsZSBuYW1lcyBhbmQgY2hhbmdlIHRoZSBuYW1lcyB0byB3aGF0IHRoZXkKKwkgIHdlcmUgaW50ZW5kZWQgdG8gYmUuIFRoZXNlIGNoYW5nZXMgYXJlIHJlcXVpcmVkL21hZGUgcG9zc2libGUgYnkgdGhlCisJICBuZXcgc2xhYiBjYWNoZSBuYW1lIGhhbmRsaW5nIHdoaWNoIHJlbW92ZXMgdGhlIGxlbmd0aCBsaW1pdGF0aW9uIGJ5CisJICByZXF1aXJpbmcgdGhlIGNhbGxlciBvZiBrbWVtX2NhY2hlX2NyZWF0ZSgpIHRvIHN1cHBseSBhIHN0YWJsZSBuYW1lCisJICB3aGljaCBpcyB0aGVuIHJlZmVyZW5jZWQgYnV0IG5vdCBjb3BpZWQuCisJLSBSZW5hbWUgcnVuX2xpc3Qgc3RydWN0dXJlIHRvIHJ1bl9saXN0X2VsZW1lbnQgYW5kIGNyZWF0ZSBhIG5ldworCSAgcnVuX2xpc3Qgc3RydWN0dXJlIGNvbnRhaW5pbmcgYSBwb2ludGVyIHRvIGEgcnVuX2xpc3RfZWxlbWVudAorCSAgc3RydWN0dXJlIGFuZCBhIHJlYWQvd3JpdGUgc2VtYXBob3JlLiBBZGFwdCBhbGwgdXNlcnMgb2YgcnVubGlzdHMKKwkgIHRvIG5ldyBzY2hlbWUgYW5kIHRha2UgYW5kIHJlbGVhc2UgdGhlIGxvY2sgYXMgbmVlZGVkLiBUaGlzIGZpeGVzIGEKKwkgIG5hc3R5IHJhY2UgYXMgdGhlIHJ1bl9saXN0IGNoYW5nZXMgZXZlbiB3aGVuIGlub2RlcyBhcmUgbG9ja2VkIGZvcgorCSAgcmVhZGluZyBhbmQgZXZlbiB3aGVuIHRoZSBpbm9kZSBpc24ndCBsb2NrZWQgYXQgYWxsLCBzbyB3ZSByZWFsbHkKKwkgIG5lZWRlZCB0aGUgc2VyaWFsaXphdGlvbi4gV2UgdXNlIGEgc2VtYXBob3JlIHJhdGhlciB0aGFuIGEgc3BpbmxvY2sKKwkgIGFzIG1lbW9yeSBhbGxvY2F0aW9ucyBjYW4gc2xlZXAgYW5kIGRvaW5nIGV2ZXJ5dGhpbmcgR0ZQX0FUT01JQworCSAgd291bGQgYmUgc2lsbHkuCisJLSBDbGVhbnVwIHJlYWRfaW5vZGUoKSByZW1vdmluZyBhbGwgY29kZSBjaGVja2luZyBmb3IgbG93ZXN0X3ZjbiAhPSAwLgorCSAgVGhpcyBjYW4gbmV2ZXIgaGFwcGVuIGR1ZSB0byB0aGUgbmF0dXJlIG9mIGxvb2t1cF9hdHRyKCkgYW5kIGhvdyB3ZQorCSAgc3VwcG9ydCBhdHRyaWJ1dGUgbGlzdHMuIElmIGl0IGRpZCBoYXBwZW4gaXQgd291bGQgaW1wbHkgdGhlIGlub2RlCisJICBiZWluZyBjb3JydXB0LgorCS0gQ2hlY2sgZm9yIGxvd2VzdF92Y24gIT0gMCBpbiBudGZzX3JlYWRfaW5vZGUoKSBhbmQgbWFyayB0aGUgaW5vZGUgYXMKKwkgIGJhZCBpZiBmb3VuZC4KKwktIFVwZGF0ZSB0byAyLjUuNi1wcmUyIGNoYW5nZXMgaW4gc3RydWN0IGFkZHJlc3Nfc3BhY2UuCisJLSBVc2UgcGFyZW50X2lubygpIHdoZW4gYWNjZXNzaW5nIGRfcGFyZW50IGlub2RlIG51bWJlciBpbiBkaXIuYy4KKwktIEltcG9ydCBTb3VyY2Vmb3JnZSBDVlMgcmVwb3NpdG9yeSBpbnRvIEJpdEtlZXBlciByZXBvc2l0b3J5OgorCQlodHRwOi8vbGludXgtbnRmcy5ia2JpdHMubmV0L250ZnMtdG5nLTIuNQorCS0gVXBkYXRlIGZzL01ha2VmaWxlLCBmcy9Db25maWcuaGVscCwgZnMvQ29uZmlnLmluLCBhbmQKKwkgIERvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvbnRmcy50eHQgZm9yIE5URlMgVE5HLgorCS0gQ3JlYXRlIGtlcm5lbCBjb25maWd1cmF0aW9uIG9wdGlvbiBjb250cm9sbGluZyB3aGV0aGVyIGRlYnVnZ2luZworCSAgaXMgZW5hYmxlZCBvciBub3QuCisJLSBBZGQgdGhlIHJlcXVpcmVkIGV4cG9ydCBvZiBlbmRfYnVmZmVyX2lvX3N5bmMoKSBmcm9tIHRoZSBwYXRjaGVzCisJICBkaXJlY3RvcnkgdG8gdGhlIGtlcm5lbCBjb2RlLgorCS0gVXBkYXRlIGlub2RlLmM6Om50ZnNfc2hvd19vcHRpb25zKCkgd2l0aCBzaG93X2lub2RlcyBtb3VudCBvcHRpb24uCisJLSBVcGRhdGUgZXJyb3JzIG1vdW50IG9wdGlvbi4KKwordG5nLTAuMC43IC0gMTMvMDIvMjAwMiAtIFRoZSBkcml2ZXIgaXMgbm93IGZlYXR1cmUgY29tcGxldGUgZm9yIHJlYWQtb25seSEKKworCS0gQ2xlYW51cCBtZnQuYyBhbmQgaXQncyBkZWJ1Zy9lcnJvciBvdXRwdXQgaW4gcGFydGljdWxhci4gRml4IGEgbWlub3IKKwkgIGJ1ZyBpbiBtYXBwaW5nIG9mIGV4dGVudCBpbm9kZXMuIFVwZGF0ZSBhbGwgdGhlIGNvbW1lbnRzIHRvIGZpdCBhbGwKKwkgIHRoZSByZWNlbnQgY29kZSBjaGFuZ2VzLgorCS0gTW9kaWZ5IHZjbl90b19sY24oKSB0byBjb3BlIHdpdGggZW50aXJlbHkgdW5tYXBwZWQgcnVubGlzdHMuCisJLSBDbGVhbnVwcyBpbiBjb21wcmVzcy5jLCBtb3N0bHkgY29tbWVudHMgYW5kIGZvbGRpbmcgaGVscC4KKwktIEltcGxlbWVudCBhdHRyaWIuYzo6bWFwX3J1bl9saXN0KCkgYXMgYSBnZW5lcmljIGhlbHBlci4KKwktIE1ha2UgY29tcHJlc3MuYzo6bnRmc19maWxlX3JlYWRfY29tcHJlc3NlZF9ibG9jaygpIHVzZSBtYXBfcnVuX2xpc3QoKQorCSAgdGh1cyBtYWtpbmcgY29kZSBzaG9ydGVyIGFuZCBlbmFibGluZyBhdHRyaWJ1dGUgbGlzdCBzdXBwb3J0LgorCS0gQ2xlYW51cCBpbmNvcnJlY3QgdXNlIG9mIFtzdV02NCB3aXRoICVMIHByaW50ZiBmb3JtYXQgc3BlY2lmaWVyIGluCisJICBhbGwgc291cmNlIGZpbGVzLiBUeXBlIGNhc3RzIHRvIFt1bnNpZ25lZF0gbG9uZyBsb25nIGFkZGVkIHRvIGNvcnJlY3QKKwkgIHRoZSBtaXNtYXRjaGVzIChpbXBvcnRhbnQgZm9yIGFyY2hpdGVjdHVyZXMgd2hpY2ggaGF2ZSBsb25nIGxvbmcgbm90CisJICBiZWluZyA2NCBiaXRzKS4KKwktIE1lcmdlIGFzeW5jIGlvIGNvbXBsZXRpb24gaGFuZGxlcnMgZm9yIGRpcmVjdG9yeSBpbmRleGVzIGFuZCAkTUZUCisJICBkYXRhIGludG8gb25lIGJ5IHNldHRpbmcgdGhlIGluZGV4X2Jsb2NrX3NpemV7X2JpdHN9IG9mIHRoZSBudGZzCisJICBpbm9kZSBmb3IgJE1GVCB0byB0aGUgbWZ0X3JlY29yZF9zaXple19iaXRzfSBvZiB0aGUgbnRmc192b2x1bWUuCisJLSBDbGVhbnVwIGFvcHMuYywgdXBkYXRlIGNvbW1lbnRzLgorCS0gTWFrZSBudGZzX2ZpbGVfZ2V0X2Jsb2NrKCkgdXNlIG1hcF9ydW5fbGlzdCgpIHNvIGFsbCBmaWxlcyBub3cKKwkgIHN1cHBvcnQgYXR0cmlidXRlIGxpc3RzLgorCS0gTWFrZSBudGZzX2Rpcl9yZWFkcGFnZSgpIGFsbW9zdCB2ZXJiYXRpbSBjb3B5IG9mCisJICBibG9ja19yZWFkX2Z1bGxfcGFnZSgpIGJ5IHVzaW5nIG50ZnNfZmlsZV9nZXRfYmxvY2soKSB3aXRoIG9ubHkgcmVhbAorCSAgZGlmZmVyZW5jZSBiZWluZyB0aGUgdXNlIG9mIG91ciBvd24gYXN5bmMgaW8gY29tcGxldGlvbiBoYW5kbGVyCisJICByYXRoZXIgdGhhbiB0aGUgZGVmYXVsdCBvbmUsIHRodXMgcmVkdWNpbmcgdGhlIGFtb3VudCBvZiBjb2RlIGFuZAorCSAgYXV0b21hdGljYWxseSBlbmFibGluZyBhdHRyaWJ1dGUgbGlzdCBzdXBwb3J0IGZvciBkaXJlY3RvcnkgaW5kaWNlcy4KKwktIEZpeCBidWcgaW4gbG9hZF9hdHRyaWJ1dGVfbGlzdCgpIC0gZm9yZ290IHRvIGNhbGwgYnJlbHNlIGluIGVycm9yCisJICBjb2RlIHBhdGguCisJLSBDaGFuZ2UgcGFyYW1ldGVycyB0byBmaW5kX2F0dHIoKSBhbmQgbG9va3VwX2F0dHIoKS4gV2Ugbm8gbG9uZ2VyCisJICBwYXNzIGluIHRoZSB1cGNhc2UgdGFibGUgYW5kIGl0cyBsZW5ndGguIFRoZXNlIGNhbiBiZSBnb3R0ZW4gZnJvbQorCSAgY3R4LT5udGZzX2luby0+dm9sLT51cGNhc2V7X2xlbn0uIFVwZGF0ZSBhbGwgY2FsbGVycy4KKwktIENsZWFudXBzIGluIGF0dHJpYi5jLgorCS0gSW1wbGVtZW50IG1lcmdpbmcgb2YgcnVubGlzdHMsIGF0dHJpYi5jOjptZXJnZV9ydW5fbGlzdHMoKSBhbmQgaXRzCisJICBoZWxwZXJzLiAoUmljaGFyZCBSdXNzb24pCisJLSBBdHRyaWJ1dGUgbGlzdHMgcGFydCAyLCBhdHRyaWJ1dGUgZXh0ZW50cyBhbmQgbXVsdGkgcGFydCBydW5saXN0czoKKwkgIGVuYWJsZSBwcm9wZXIgc3VwcG9ydCBmb3IgTENOX1JMX05PVF9NQVBQRUQgYW5kIGF1dG9tYXRpYyBtYXBwaW5nIG9mCisJICBmdXJ0aGVyIHJ1bmxpc3QgcGFydHMgdmlhIGF0dHJpYi5jOjptYXBfcnVuX2xpc3QoKS4KKwktIFRpbnkgZW5kaWFubmVzcyBidWcgZml4IGluIGRlY29tcHJlc3NfbWFwcGluZ19wYWlycygpLgorCit0bmctMC4wLjYgLSBFbmNyeXB0ZWQgZGlyZWN0b3JpZXMsIGJ1ZyBmaXhlcywgY2xlYW51cHMsIGRlYnVnZ2luZyBlbmhhbmNlbWVudHMuCisKKwktIEVuYWJsZSBlbmNyeXB0ZWQgZGlyZWN0b3JpZXMuIChUaGVpciBpbmRleCByb290IGlzIG1hcmtlZCBlbmNyeXB0ZWQKKwkgIHRvIGluZGljYXRlIHRoYXQgbmV3IGZpbGVzIGluIHRoYXQgZGlyZWN0b3J5IHNob3VsZCBiZSBjcmVhdGVkCisJICBlbmNyeXB0ZWQuKQorCS0gRml4IGJ1ZyBpbiBOSW5vQm1wTm9uUmVzaWRlbnQoKSBtYWNyby4gKEN1dCBhbmQgcGFzdGUgZXJyb3IuKQorCS0gRW5hYmxlICRFeHRlbmQgc3lzdGVtIGRpcmVjdG9yeS4gTW9zdCAoaWYgbm90IGFsbCkgZXh0ZW5kZWQgc3lzdGVtCisJICBmaWxlcyBkbyBub3QgaGF2ZSB1bm5hbWVkIGRhdGEgYXR0cmlidXRlcyBzbyBudGZzX3JlYWRfaW5vZGUoKSBoYWQgdG8KKwkgIHNwZWNpYWwgY2FzZSB0aGVtIGJ1dCB0aGF0IGlzIG9rLCBhcyB0aGUgc3BlY2lhbCBjYXNpbmcgcmVjb3ZlcnkKKwkgIGhhcHBlbnMgaW5zaWRlIGFuIGVycm9yIGNvZGUgcGF0aCBzbyB0aGVyZSBpcyB6ZXJvIHNsb3cgZG93biBpbiB0aGUKKwkgIG5vcm1hbCBmYXN0IHBhdGguIFRoZSBzcGVjaWFsIGNhc2luZyBpcyBkb25lIGJ5IGludHJvZHVjaW5nIGEgbmV3CisJICBmdW5jdGlvbiBpbm9kZS5jOjpudGZzX2lzX2V4dGVuZGVkX3N5c3RlbV9maWxlKCkgd2hpY2ggY2hlY2tzIGlmIGFueQorCSAgb2YgdGhlIGhhcmQgbGlua3MgaW4gdGhlIGlub2RlIHBvaW50IHRvICRFeHRlbmQgYXMgYmVpbmcgdGhlaXIgcGFyZW50CisJICBkaXJlY3RvcnkgYW5kIGlmIHRoZXkgZG8gd2UgYXNzdW1lIHRoaXMgaXMgYW4gZXh0ZW5kZWQgc3lzdGVtIGZpbGUuCisJLSBDcmVhdGUgYSBzeXNjdGwvcHJvYyBpbnRlcmZhY2UgdG8gYWxsb3cge2Rpcyxlbn1hYmxpbmcgb2YgZGVidWcgb3V0cHV0CisJICB3aGVuIGNvbXBpbGVkIHdpdGggLURERUJVRy4gRGVmYXVsdCBpcyBkZWJ1ZyBtZXNzYWdlcyB0byBiZSBkaXNhYmxlZC4KKwkgIFRvIGVuYWJsZSB0aGVtLCBvbmUgd3JpdGVzIGEgbm9uLXplcm8gdmFsdWUgdG8gL3Byb2Mvc3lzL2ZzL250ZnMtZGVidWcKKwkgIChpZiAvcHJvYyBpcyBlbmFibGVkKSBvciB1c2VzIHN5c2N0bCgyKSB0byBlZmZlY3QgdGhlIHNhbWUgKGlmIHN5c2N0bAorCSAgaW50ZXJmYWNlIGlzIGVuYWJsZWQpLiBJbnNwaXJlZCBieSBvbGQgbnRmcyBkcml2ZXIuCisJLSBBZGQgZGVidWdfbXNncyBpbnNtb2Qva2VybmVsIGJvb3QgcGFyYW1ldGVyIHRvIHNldCB3aGV0aGVyIGRlYnVnCisJICBtZXNzYWdlcyBhcmUge2Rpcyxlbn1hYmxlZC4gVGhpcyBpcyB1c2VmdWwgdG8gZW5hYmxlIGRlYnVnIG1lc3NhZ2VzCisJICBkdXJpbmcgbnRmcyBpbml0aWFsaXphdGlvbiBhbmQgaXMgdGhlIG9ubHkgd2F5IHRvIGFjdGl2YXRlIGRlYnVnZ2luZworCSAgd2hlbiB0aGUgc3lzY3RsIGludGVyZmFjZSBpcyBub3QgZW5hYmxlZC4KKwktIENsZWFudXAgZGVidWcgb3V0cHV0IGluIHZhcmlvdXMgcGxhY2VzLgorCS0gUmVtb3ZlIGFsbCBkb2xsYXIgc2lnbnMgKCQpIGZyb20gdGhlIHNvdXJjZSAoZXhjZXB0IGNvbW1lbnRzKSB0bworCSAgZW5hYmxlIGNvbXBpbGF0aW9uIG9uIGFyY2hpdGVjdHVyZXMgd2hvc2UgZ2NjIGNvbXBpbGVyIGRvZXMgbm90CisJICBzdXBwb3J0IGRvbGxhciBzaWducyBpbiB0aGUgbmFtZXMgb2YgdmFyaWFibGVzL2NvbnN0YW50cy4gQXR0cmlidXRlCisJICB0eXBlcyBub3cgc3RhcnQgd2l0aCBBVF8gaW5zdGVhZCBvZiAkIGFuZCAkSTMwIGlzIG5vdyBqdXN0IEkzMC4KKwktIENsZWFudXAgbnRmc19sb29rdXAoKSBhbmQgYWRkIGNvbnNpc3RlbmN5IGNoZWNrIG9mIHNlcXVlbmNlIG51bWJlcnMuCisJLSBMb2FkIGNvbXBsZXRlIHJ1bmxpc3QgZm9yICRNRlQvJEJJVE1BUCBkdXJpbmcgbW91bnQgYW5kIGNsZWFudXAKKwkgIGFjY2VzcyBmdW5jdGlvbnMuIFRoaXMgbWVhbnMgd2Ugbm93IGNvcGUgd2l0aCAkTUZULyRCSVRNQVAgYmVpbmcKKwkgIHNwcmVhZCBhY2Nyb3NzIHNldmVyYWwgbWZ0IHJlY29yZHMuCisJLSBEaXNhYmxlIG1vZGlmaWNhdGlvbiBvZiBtZnRfem9uZV9tdWx0aXBsaWVyIG9uIHJlbW91bnQuIFdlIGNhbiBhbHdheXMKKwkgIHJlZW5hYmxlIHRoaXMgbGF0ZXIgb24gaWYgd2UgcmVhbGx5IHdhbnQgdG8sIGJ1dCB3ZSB3aWxsIG5lZWQgdG8gbWFrZQorCSAgc3VyZSB3ZSByZWFkanVzdCB0aGUgbWZ0X3pvbmUgc2l6ZSAvIGxheW91dCBhY2NvcmRpbmdseS4KKwordG5nLTAuMC41IC0gTW9kZXJuaXplIGZvciAyLjUueCBhbmQgZnVydGhlciBpbiBsaW5lLWluZyB3aXRoIEFsIFZpcm8ncyBjb21tZW50cy4KKworCS0gVXNlIHNiX3NldF9ibG9ja3NpemUoKSBpbnN0ZWFkIG9mIHNldF9ibG9ja3NpemUoKSBhbmQgdmVyaWZ5IHRoZQorCSAgcmV0dXJuIHZhbHVlLgorCS0gVXNlIHNiX2JyZWFkKCkgaW5zdGVhZCBvZiBicmVhZCgpIHRocm91Z2hvdXQuCisJLSBBZGQgaW5kZXhfdmNuX3NpemV7X2JpdHN9IHRvIG50ZnNfaW5vZGUgc3RydWN0dXJlIHRvIHN0b3JlIHRoZSBzaXplCisJICBvZiBhIGRpcmVjdG9yeSBpbmRleCBibG9jayB2Y24uIEFwcGx5IHJlc3VsdGluZyBzaW1wbGlmaWNhdGlvbnMgaW4KKwkgIGRpci5jIGV2ZXJ5d2hlcmUuCisJLSBGaXggYSBzbWFsbCBidWcgc29tZXdoZXJlIChidXQgZm9yZ290IHdoYXQgaXQgd2FzKS4KKwktIENoYW5nZSBudGZzX3tkZWJ1ZyxlcnJvcix3YXJuaW5nfSB0byBlbmFibGUgZ2NjIHRvIGRvIHR5cGUgY2hlY2tpbmcKKwkgIG9uIHRoZSBwcmludGYtZm9ybWF0IHBhcmFtZXRlciBsaXN0IGFuZCBmaXggYnVncyByZXBvcnRlZCBieSBnY2MKKwkgIGFzIGEgcmVzdWx0LiAoUmljaGFyZCBSdXNzb24pCisJLSBNb3ZlIGlub2RlIGFsbG9jYXRpb24gc3RyYXRlZ3kgdG8gQWwncyBuZXcgc3R1ZmYgYnV0IG1haW50YWluIHRoZQorCSAgZGl2b3JjZSBvZiBudGZzX2lub2RlIGZyb20gc3RydWN0IGlub2RlLiBUbyBhY2hpZXZlIHRoaXMgd2UgaGF2ZSB0d28KKwkgIHNlcGFyYXRlIHNsYWIgY2FjaGVzLCBvbmUgZm9yIGJpZyBudGZzIGlub2RlcyBjb250YWluaW5nIGEgc3RydWN0CisJICBpbm9kZSBhbmQgcHVyZSBudGZzIGlub2RlcyBhbmQgYXQgdGhlIHNhbWUgdGltZSBmaXggc29tZSBmYXVsdHkKKwkgIGVycm9yIGNvZGUgcGF0aHMgaW4gbnRmc19yZWFkX2lub2RlKCkuCisJLSBTaG93IG1vdW50IG9wdGlvbnMgaW4gcHJvYyAoaW5vZGUuYzo6bnRmc19zaG93X29wdGlvbnMoKSkuCisKK3RuZy0wLjAuNCAtIEJpZyBjaGFuZ2VzLCBnZXR0aW5nIGluIGxpbmUgd2l0aCBBbCBWaXJvJ3MgY29tbWVudHMuCisKKwktIE1vZGlmaWVkICh1biltYXBfbWZ0X3JlY29yZCBmdW5jdGlvbnMgdG8gYmUgY29tbW9uIGZvciByZWFkIGFuZCB3cml0ZQorCSAgY2FzZS4gVG8gc3BlY2lmeSB3aGljaCBpcyB3aGljaCwgYWRkZWQgZXh0cmEgcGFyYW1ldGVyIGF0IGZyb250IG9mCisJICBwYXJhbWV0ZXIgbGlzdC4gUGFzcyBlaXRoZXIgUkVBRCBvciBXUklURSB0byB0aGlzLCBlYWNoIGhhcyB0aGUKKwkgIG9idmlvdXMgbWVhbmluZy4KKwktIEdlbmVyYWwgY2xlYW51cHMgdG8gYWxsb3cgZm9yIGVhc2llciBmb2xkaW5nIGluIHZpLgorCS0gYXR0cmliLmM6OmRlY29tcHJlc3NfbWFwcGluZ19wYWlycygpIG5vdyBhY2NlcHRzIHRoZSBvbGQgcnVubGlzdAorCSAgYXJndW1lbnQsIGFuZCBpbnZva2VzIGF0dHJpYi5jOjptZXJnZV9ydW5fbGlzdHMoKSB0byBtZXJnZSB0aGUgb2xkCisJICBhbmQgdGhlIG5ldyBydW5saXN0cy4KKwktIFJlbW92ZWQgYXR0cmliLmM6OmZpbmRfZmlyc3RfYXR0cigpLgorCS0gSW1wbGVtZW50ZWQgbG9hZGluZyBvZiBhdHRyaWJ1dGUgbGlzdCBhbmQgY29tcGxldGUgcnVubGlzdCBmb3IgJE1GVC4KKwkgIFRoaXMgbWVhbnMgd2Ugbm93IGNvcGUgd2l0aCAkTUZUIGJlaW5nIHNwcmVhZCBhY3Jvc3Mgc2V2ZXJhbCBtZnQKKwkgIHJlY29yZHMuCisJLSBBZGFwdCB0byAyLjUuMi1wcmU5IGFuZCB0aGUgY2hhbmdlZCBjcmVhdGVfZW1wdHlfYnVmZmVycygpIHN5bnRheC4KKwktIEFkYXB0IG1ham9yL21pbm9yL2tkZXZfdC9bYmtdZGV2bmFtZSBzdHVmZiB0byBuZXcgMi41Lngga2VybmVscy4KKwktIE1ha2UgbnRmc192b2x1bWUgYmUgYWxsb2NhdGVkIHZpYSBrbWFsbG9jKCkgaW5zdGVhZCBvZiB1c2luZyBhIHNsYWIKKwkgIGNhY2hlLiBUaGVyZSBhcmUgdG9vIGxpdHRsZSBudGZzX3ZvbHVtZSBzdHJ1Y3R1cmVzIGF0IGFueSBvbmUgdGltZQorCSAgdG8ganVzdGlmeSBhIHByaXZhdGUgc2xhYiBjYWNoZS4KKwktIEZpeCBib2d1cyBrbWFwKCkgdXNlIGluIGFzeW5jIGlvIGNvbXBsZXRpb24uIE5vdyB1c2Uga21hcF9hdG9taWMoKS4KKwkgIFVzZSBLTV9CSU9fSVJRIG9uIGFkdmljZSBmcm9tIElSQy9rZXJuZWwuLi4KKwktIFVzZSBudGZzX21hcF9wYWdlKCkgaW4gbWFwX21mdF9yZWNvcmQoKSBhbmQgY3JlYXRlIC0+cmVhZHBhZ2UgbWV0aG9kCisJICBmb3IgcmVhZGluZyAkTUZUIChudGZzX21mdF9yZWFkcGFnZSkuIEluIHRoZSBwcm9jZXNzIGNyZWF0ZSBkZWRpY2F0ZWQKKwkgIGFkZHJlc3Mgc3BhY2Ugb3BlcmF0aW9ucyAobnRmc19tZnRfYW9wcykgZm9yICRNRlQgaW5vZGUgbWFwcGluZy4gQWxzbworCSAgcmVtb3ZlZCB0aGUgbm93IHN1cGVyZmx1b3VzIGV4cG9ydHMgZnJvbSB0aGUga2VybmVsIGNvcmUgcGF0Y2guCisJLSBGaXggYSBidWcgd2hlcmUga2ZyZWUoKSB3YXMgdXNlZCBpbnN0ZWQgb2YgbnRmc19mcmVlKCkuCisJLSBDaGFuZ2UgbWFwX21mdF9yZWNvcmQoKSB0byB0YWtlIG50ZnNfaW5vZGUgYXMgYXJndW1lbnQgaW5zdGVhZCBvZgorCSAgdmZzIGlub2RlLiBEaXRvIGZvciB1bm1hcF9tZnRfcmVjb3JkKCkuIEFkYXB0IGFsbCBjYWxsZXJzLgorCS0gQWRkIHBvaW50ZXIgdG8gbnRmc192b2x1bWUgdG8gbnRmc19pbm9kZS4KKwktIEFkZCBtZnQgcmVjb3JkIG51bWJlciBhbmQgc2VxdWVuY2UgbnVtYmVyIHRvIG50ZnNfaW5vZGUuIFN0b3AgdXNpbmcKKwkgIGlfaW5vIGFuZCBpX2dlbmVyYXRpb24gZm9yIGluLWRyaXZlciBwdXJwb3Nlcy4KKwktIEltcGxlbWVudCBhdHRyaWIuYzo6bWVyZ2VfcnVuX2xpc3RzKCkuIChSaWNoYXJkIFJ1c3NvbikKKwktIFJlbW92ZSB1c2Ugb2YgcHJvcGVyIGlub2RlcyBieSBleHRlbnQgaW5vZGVzLiBNb3ZlIGlfaW5vIGFuZAorCSAgaV9nZW5lcmF0aW9uIHRvIG50ZnNfaW5vZGUgdG8gZG8gdGhpcy4gQXBwbHkgc2ltcGxpZmljYXRpb25zIHRoYXQKKwkgIHJlc3VsdCBhbmQgcmVtb3ZlIGlnZXRfbm9fd2FpdCgpLCBldGMuCisJLSBQYXNzIG50ZnNfaW5vZGUgZXZlcnl3aGVyZSBpbiB0aGUgZHJpdmVyICh1c2VkIHRvIGJlIHN0cnVjdCBpbm9kZSkuCisJLSBBZGQgcmVmZXJlbmNlIGNvdW50aW5nIGluIG50ZnNfaW5vZGUgZm9yIHRoZSBudGZzIGlub2RlIGl0c2VsZiBhbmQKKwkgIGZvciB0aGUgbWFwcGVkIG1mdCByZWNvcmQuCisJLSBFeHRlbmQgbWZ0IHJlY29yZCBtYXBwaW5nIHNvIHdlIGNhbiAodW4pbWFwIGV4dGVudCBtZnQgcmVjb3JkcyAobmV3CisJICBmdW5jdGlvbnMgKHVuKW1hcF9leHRlbnRfbWZ0X3JlY29yZCksIGFuZCBzbyBtYXBwaW5ncyBhcmUgcmVmZXJlbmNlCisJICBjb3VudGVkIGFuZCBkb24ndCBoYXZlIHRvIGhhcHBlbiB0d2ljZSBpZiBhbHJlYWR5IG1hcHBlZCAtIGp1c3QgcmVmCisJICBjb3VudCBpbmNyZWFzZXMuCisJLSBBZGQgLW8gaW9jaGFyc2V0IGFzIGFsaWFzIHRvIC1vIG5scyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisJLSBUaGUgbGF0ZXN0IGNvcmUgcGF0Y2ggaXMgbm93IHRpbnkuIEluIGZhY3QganVzdCBhIHNpbmdsZSBhZGRpdGlvbmFsCisJICBleHBvcnQgaXMgbmVjZXNzYXJ5IG92ZXIgdGhlIGJhc2Uga2VybmVsLgorCit0bmctMC4wLjMgLSBDbGVhbnVwcywgZW5oYW5jZW1lbnRzLCBidWcgZml4ZXMuCisKKwktIFdvcmsgb24gYXR0cmliLmM6OmRlY29tcHJlc3NfbWFwcGluZ19wYWlycygpIHRvIGRldGVjdCBiYXNlIGV4dGVudHMKKwkgIGFuZCBzZXR1cCB0aGUgcnVubGlzdCBhcHByb3ByaWF0ZWx5IHVzaW5nIGtub3dsZWRnZSBwcm92aWRlZCBieSB0aGUKKwkgIHNpemVzIGluIHRoZSBiYXNlIGF0dHJpYnV0ZSByZWNvcmQuCisJLSBCYWxhbmNlIHRoZSBnZXRfL3B1dF9hdHRyX3NlYXJjaF9jdHgoKSBjYWxscyBzbyB3ZSBkb24ndCBsZWFrIG1lbW9yeQorCSAgYW55IG1vcmUuCisJLSBJbnRyb2R1Y2UgbnRmc19tYWxsb2Nfbm9mcygpIGFuZCBudGZzX2ZyZWUoKSB0byBhbGxvY2F0ZS9mcmVlIGEgc2luZ2xlCisJICBwYWdlIG9yIHVzZSB2bWFsbG9jIGRlcGVuZGluZyBvbiB0aGUgYW1vdW50IG9mIG1lbW9yeSByZXF1ZXN0ZWQuCisJLSBDbGVhbnVwIGVycm9yIG91dHB1dC4gVGhlIF9fRlVOQ1RJT05fXyAiKCk6ICIgaXMgbm93IGFkZGVkCisJICBhdXRvbWF0aWNhbGx5LiBJbnRyb2R1Y2VkIGEgbmV3IGhlYWRlciBmaWxlIGRlYnVnLmggdG8gc3VwcG9ydCB0aGlzCisJICBhbmQgYWxzbyBtb3ZlZCBudGZzX2RlYnVnKCkgZnVuY3Rpb24gaW50byBpdC4KKwktIE1ha2UgcmVhZGluZyBvZiBjb21wcmVzc2VkIGZpbGVzIG1vcmUgaW50ZWxsaWdlbnQgYW5kIGVzcGVjaWFsbHkgZ2V0CisJICByaWQgb2YgdGhlIHZtYWxsb2Nfbm9mcygpIGZyb20gcmVhZHBhZ2UoKS4gVGhpcyBub3cgdXNlcyBwZXIgQ1BVCisJICBidWZmZXJzIChhbGxvY2F0ZWQgYXQgZmlyc3QgbW91bnQgd2l0aCBjbHVzdGVyIHNpemUgPD0gNGtpQiBhbmQKKwkgIGRlYWxsb2NhdGVkIG9uIGxhc3QgdW1vdW50IHdpdGggY2x1c3RlciBzaXplIDw9IDRraUIpLCBhbmQKKwkgIGFzeW5jaHJvbm91cyBpbyBmb3IgdGhlIGNvbXByZXNzZWQgZGF0YSB1c2luZyBhIGxpc3Qgb2YgYnVmZmVyIGhlYWRzLgorCSAgRXIsIHdlIHVzZSBzeW5jaHJvbm91cyBpbyBhcyBhc3luYyBpbyBvbmx5IHdvcmtzIG9uIHdob2xlIHBhZ2VzCisJICBjb3ZlcmVkIGJ5IGJ1ZmZlcnMgYW5kIG5vdCBvbiBpbmRpdmlkdWFsIGJ1ZmZlciBoZWFkcy4uLgorCS0gQnVnIGZpeCBmb3IgcmVhZGluZyBjb21wcmVzc2VkIGZpbGVzIHdpdGggc3BhcnNlIGNvbXByZXNzaW9uIGJsb2Nrcy4KKwordG5nLTAuMC4yIC0gTm93IGhhbmRsZXMgbGFyZ2VyL2ZyYWdtZW50ZWQvY29tcHJlc3NlZCB2b2x1bWVzL2ZpbGVzL2RpcnMuCisKKwktIEZpeGVkIGhhbmRsaW5nIG9mIGRpcmVjdG9yaWVzIHdoZW4gY2x1c3RlciBzaXplIGV4Y2VlZHMgaW5kZXggYmxvY2sKKwkgIHNpemUuCisJLSBIaWRlIERPUyBvbmx5IG5hbWUgc3BhY2UgZGlyZWN0b3J5IGVudHJpZXMgZnJvbSByZWFkZGlyKCkgYnV0IGFsbG93CisJICB0aGVtIGluIGxvb2t1cCgpLiBUaGlzIHNob3VsZCBmaXggdGhlIHByb2JsZW0gdGhhdCBMaW51eCBkb2Vzbid0CisJICBzdXBwb3J0IGRpcmVjdG9yeSBoYXJkIGxpbmtzLCB3aGlsZSBzdGlsbCBhbGxvd2luZyBhY2Nlc3MgdG8gZW50cmllcworCSAgdmlhIHRoZWlyIHNob3J0IGZpbGUgbmFtZS4gVGhpcyBhbHNvIGhhcyB0aGUgYmVuZWZpdCBvZiBtaW1pY2tpbmcKKwkgIHdoYXQgV2luZG93cyB1c2VycyBhcmUgdXNlZCB0bywgc28gaXQgaXMgdGhlIGlkZWFsIHNvbHV0aW9uLgorCS0gSW1wbGVtZW50ZWQgc3luY19wYWdlIGV2ZXJ5d2hlcmUgc28gbm8gbW9yZSBoYW5ncyBpbiBEIHN0YXRlIHdoZW4KKwkgIHdhaXRpbmcgZm9yIGEgcGFnZS4KKwktIFN0b3AgdXNpbmcgYmZvcmdldCgpIGluIGZhdm91ciBvZiBicmVsc2UoKS4KKwktIFN0b3AgbG9ja2luZyBidWZmZXJzIHVubmVjZXNzYXJpbHkuCisJLSBJbXBsZW1lbnRlZCBjb21wcmVzc2VkIGZpbGVzIChpbm9kZS0+bWFwcGluZyBjb250YWlucyB1bmNvbXByZXNzZWQKKwkgIGRhdGEsIHJhdyBjb21wcmVzc2VkIGRhdGEgaXMgY3VycmVudGx5IGJyZWFkKCkgaW50byBhIHZtYWxsb2MoKWVkCisJICBtZW1vcnkgYnVmZmVyKS4KKwktIEVuYWJsZSBjb21wcmVzc2VkIGRpcmVjdG9yaWVzLiAoVGhlaXIgaW5kZXggcm9vdCBpcyBtYXJrZWQgY29tcHJlc3NlZAorCSAgdG8gaW5kaWNhdGUgdGhhdCBuZXcgZmlsZXMgaW4gdGhhdCBkaXJlY3Rvcnkgc2hvdWxkIGJlIGNyZWF0ZWQKKwkgIGNvbXByZXNzZWQuKQorCS0gVXNlIHZzbnByaW50ZiByYXRoZXIgdGhhbiB2c3ByaW50ZiBpbiB0aGUgbnRmc19lcnJvciBhbmQgbnRmc193YXJuaW5nCisJICBmdW5jdGlvbnMuIChUaGFua3MgdG8gV2lsbCBEeXNvbiBmb3IgcG9pbnRpbmcgdGhpcyBvdXQuKQorCS0gTW92ZWQgdGhlIG50ZnNfaW5vZGUgYW5kIG50ZnNfdm9sdW1lICh0aGUgZm9ybWVyIG50ZnNfaW5vZGVfaW5mbyBhbmQKKwkgIG50ZnNfc2JfaW5mbykgb3V0IG9mIHRoZSBjb21tb24gaW5vZGUgYW5kIHN1cGVyX2Jsb2NrIHN0cnVjdHVyZXMgYW5kCisJICBzdGFydGVkIHVzaW5nIHRoZSBnZW5lcmljX2lwIGFuZCBnZW5lcmljX3NicCBwb2ludGVycyBpbnN0ZWFkLiBUaGlzCisJICBtYWtlcyBudGZzIGVudGlyZWx5IHByaXZhdGUgd2l0aCByZXNwZWN0IHRvIHRoZSBrZXJuZWwgdHJlZS4KKwktIERldGVjdCBjb21waWxlciB2ZXJzaW9uIGFuZCBhYm9ydCB3aXRoIGVycm9yIG1lc3NhZ2UgaWYgZ2NjIGxlc3MgdGhhbgorCSAgMi45NiBpcyB1c2VkLgorCS0gRml4IGJ1ZyBpbiBuYW1lIGNvbXBhcmlzb24gZnVuY3Rpb24gaW4gdW5pc3RyLmMuCisJLSBJbXBsZW1lbnQgYXR0cmlidXRlIGxpc3RzIHBhcnQgMSwgdGhlIGluZnJhc3RydWN0dXJlOiBzZWFyY2ggY29udGV4dHMKKwkgIGFuZCBvcGVyYXRpb25zLCBmaW5kX2V4dGVybmFsX2F0dHIoKSwgbG9va3VwX2F0dHIoKSkgYW5kIG1ha2UgdGhlCisJICBjb2RlIHVzZSB0aGUgaW5mcmFzdHJ1Y3R1cmUuCisJLSBGaXggc3R1cGlkIGJ1ZmZlciBvdmVyZmxvdyBidWcgdGhhdCBiZWNhbWUgYXBwYXJlbnQgb24gbGFyZ2VyIHJ1bgorCSAgbGlzdCBjb250YWluaW5nIGF0dHJpYnV0ZXMuCisJLSBGaXggYnVncyBpbiByZWFkZGlyKCkgdGhhdCBiZWNhbWUgYXBwYXJlbnQgb24gbGFyZ2VyIGRpcmVjdG9yaWVzLgorCisJVGhlIGRyaXZlciBpcyBub3cgcmVhbGx5IHVzZWZ1bCBhbmQgc3Vydml2ZXMgdGhlIHRlc3QKKwkJZmluZCAuIC10eXBlIGYgLWV4ZWMgbWQ1c3VtICJ7fSIgXDsKKwl3aXRob3V0IGFueSBlcnJvciBtZXNzYWdlcyBvbiBhIG92ZXIgMUdpQiBzaXplZCBwYXJ0aXRpb24gd2l0aCA+MTZrCisJZmlsZXMgb24gaXQsIGluY2x1ZGluZyBjb21wcmVzc2VkIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBhbmQgbWFueSBmaWxlcworCWFuZCBkaXJlY3RvcmllcyB3aXRoIGF0dHJpYnV0ZSBsaXN0cy4KKwordG5nLTAuMC4xIC0gVGhlIGZpcnN0IHVzZWZ1bCB2ZXJzaW9uLgorCisJLSBBZGRlZCBudGZzX2xvb2t1cCgpLgorCS0gQWRkZWQgZGVmYXVsdCB1cGNhc2UgZ2VuZXJhdGlvbiBhbmQgaGFuZGxpbmcuCisJLSBBZGRlZCBjb21waWxlIG9wdGlvbnMgdG8gYmUgc2hvd24gb24gbW9kdWxlIGluaXQuCisJLSBNYW55IGJ1ZyBmaXhlcyB0aGF0IHdlcmUgImhpZGRlbiIgYmVmb3JlLgorCS0gVXBkYXRlIHRvIGxhdGVzdCBrZXJuZWwuCisJLSBBZGRlZCBudGZzX3JlYWRkaXIoKS4KKwktIEFkZGVkIGZpbGUgb3BlcmF0aW9ucyBmb3IgbW1hcCgpLCByZWFkKCksIG9wZW4oKSBhbmQgbGxzZWVrKCkuIFdlIGp1c3QKKwkgIHVzZSB0aGUgZ2VuZXJpYyBvbmVzLiBUaGUgd2hvbGUgcG9pbnQgb2YgZ29pbmcgdGhyb3VnaCBpbXBsZW1lbnRpbmcKKwkgIHJlYWRwYWdlKCkgbWV0aG9kcyBhbmQgd2hlcmUgcG9zc2libGUgZ2V0X2Jsb2NrKCkgY2FsbCBiYWNrcyBpcyB0aGF0CisJICB0aGlzIGFsbG93cyB1cyB0byBtYWtlIHVzZSBvZiB0aGUgZ2VuZXJpYyBoaWdoIGxldmVsIG1ldGhvZHMgcHJvdmlkZWQKKwkgIGJ5IHRoZSBrZXJuZWwuCisKKwlUaGUgZHJpdmVyIGlzIG5vdyBhY3R1YWxseSB1c2VmdWwhIFlleS4gKC06IEl0IHVuZG91YnRlZGx5IGhhcyBnb3QgYnVncworCXRob3VnaCBhbmQgaXQgZG9lc24ndCBpbXBsZW1lbnQgYWNjZXNzc2luZyBjb21wcmVzc2VkIGZpbGVzIHlldC4gQWxzbywKKwlhY2Nlc3NpbmcgZmlsZXMgd2l0aCBhdHRyaWJ1dGUgbGlzdCBhdHRyaWJ1dGVzIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQKKwllaXRoZXIuIEJ1dCBmb3Igc21hbGwgb3Igc2ltcGxlIGZpbGUgc3lzdGVtcyBpdCBzaG91bGQgd29yayBhbmQgYWxsb3cKKwl5b3UgdG8gbGlzdCBkaXJlY3RvcmllcywgdXNlIHN0YXQgb24gZGlyZWN0b3J5IGVudHJpZXMgYW5kIHRoZSBmaWxlCisJc3lzdGVtLCBvcGVuLCByZWFkLCBtbWFwIGFuZCBsbHNlZWsgYXJvdW5kIGluIGZpbGVzLiBBIGJpZyBtaWxlIHN0b25lCisJaGFzIGJlZW4gcmVhY2hlZCEKKwordG5nLTAuMC4wIC0gSW5pdGlhbCB2ZXJzaW9uIHRhZy4KKworCUluaXRpYWwgZHJpdmVyIGltcGxlbWVudGF0aW9uLiBUaGUgZHJpdmVyIGNhbiBtb3VudCBhbmQgdW1vdW50IHNpbXBsZQorCU5URlMgZmlsZSBzeXN0ZW1zIChpLmUuIG9uZXMgd2l0aG91dCBhdHRyaWJ1dGUgbGlzdHMgaW4gdGhlIHN5c3RlbQorCWZpbGVzKS4gSWYgdGhlIG1vdW50IGZhaWxzIHRoZXJlIG1pZ2h0IGJlIHByb2JsZW1zIGluIHRoZSBlcnJvciBoYW5kbGluZworCWNvZGUgcGF0aHMsIHNvIGJlIHdhcm5lZC4gT3RoZXJ3aXNlIGl0IHNlZW1zIHRvIGJlIGxvYWRpbmcgdGhlIHN5c3RlbQorCWZpbGVzIG5pY2VseSBhbmQgdGhlIG1mdCByZWNvcmQgcmVhZCBtYXBwaW5nL3VubWFwcGluZyBzZWVtcyB0byBiZQorCXdvcmtpbmcgbmljZWx5LCB0b28uIFByb29mIG9mIGlub2RlIG1ldGFkYXRhIGluIHRoZSBwYWdlIGNhY2hlIGFuZCBub24tCisJcmVzaWRlbnQgZmlsZSB1bm5hbWVkIHN0cmVhbSBkYXRhIGluIHRoZSBwYWdlIGNhY2hlIGNvbmNlcHRzIGlzIHRodXMKKwljb21wbGV0ZS4KZGlmZiAtLWdpdCBhL2ZzL250ZnMvTWFrZWZpbGUgYi9mcy9udGZzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNjYzODEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL01ha2VmaWxlCkBAIC0wLDAgKzEsMTkgQEAKKyMgUnVsZXMgZm9yIG1ha2luZyB0aGUgTlRGUyBkcml2ZXIuCisKK29iai0kKENPTkZJR19OVEZTX0ZTKSArPSBudGZzLm8KKworbnRmcy1vYmpzIDo9IGFvcHMubyBhdHRyaWIubyBjb2xsYXRlLm8gY29tcHJlc3MubyBkZWJ1Zy5vIGRpci5vIGZpbGUubyBcCisJICAgICBpbmRleC5vIGlub2RlLm8gbWZ0Lm8gbXN0Lm8gbmFtZWkubyBydW5saXN0Lm8gc3VwZXIubyBzeXNjdGwubyBcCisJICAgICB1bmlzdHIubyB1cGNhc2UubworCitFWFRSQV9DRkxBR1MgPSAtRE5URlNfVkVSU0lPTj1cIjIuMS4yMlwiCisKK2lmZXEgKCQoQ09ORklHX05URlNfREVCVUcpLHkpCitFWFRSQV9DRkxBR1MgKz0gLURERUJVRworZW5kaWYKKworaWZlcSAoJChDT05GSUdfTlRGU19SVykseSkKK0VYVFJBX0NGTEFHUyArPSAtRE5URlNfUlcKKworbnRmcy1vYmpzICs9IGJpdG1hcC5vIGxjbmFsbG9jLm8gbG9nZmlsZS5vIHF1b3RhLm8KK2VuZGlmCmRpZmYgLS1naXQgYS9mcy9udGZzL2FvcHMuYyBiL2ZzL250ZnMvYW9wcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZDU2ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL2FvcHMuYwpAQCAtMCwwICsxLDIzMjQgQEAKKy8qKgorICogYW9wcy5jIC0gTlRGUyBrZXJuZWwgYWRkcmVzcyBzcGFjZSBvcGVyYXRpb25zIGFuZCBwYWdlIGNhY2hlIGhhbmRsaW5nLgorICoJICAgIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqIENvcHlyaWdodCAoYykgMjAwMiBSaWNoYXJkIFJ1c3NvbgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgorCisjaW5jbHVkZSAiYW9wcy5oIgorI2luY2x1ZGUgImF0dHJpYi5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAiaW5vZGUuaCIKKyNpbmNsdWRlICJtZnQuaCIKKyNpbmNsdWRlICJydW5saXN0LmgiCisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJudGZzLmgiCisKKy8qKgorICogbnRmc19lbmRfYnVmZmVyX2FzeW5jX3JlYWQgLSBhc3luYyBpbyBjb21wbGV0aW9uIGZvciByZWFkaW5nIGF0dHJpYnV0ZXMKKyAqIEBiaDoJCWJ1ZmZlciBoZWFkIG9uIHdoaWNoIGlvIGlzIGNvbXBsZXRlZAorICogQHVwdG9kYXRlOgl3aGV0aGVyIEBiaCBpcyBub3cgdXB0b2RhdGUgb3Igbm90CisgKgorICogQXN5bmNocm9ub3VzIEkvTyBjb21wbGV0aW9uIGhhbmRsZXIgZm9yIHJlYWRpbmcgcGFnZXMgYmVsb25naW5nIHRvIHRoZQorICogYXR0cmlidXRlIGFkZHJlc3Mgc3BhY2Ugb2YgYW4gaW5vZGUuICBUaGUgaW5vZGVzIGNhbiBlaXRoZXIgYmUgZmlsZXMgb3IKKyAqIGRpcmVjdG9yaWVzIG9yIHRoZXkgY2FuIGJlIGZha2UgaW5vZGVzIGRlc2NyaWJpbmcgc29tZSBhdHRyaWJ1dGUuCisgKgorICogSWYgTklub01zdFByb3RlY3RlZCgpLCBwZXJmb3JtIHRoZSBwb3N0IHJlYWQgbXN0IGZpeHVwcyB3aGVuIGFsbCBJTyBvbiB0aGUKKyAqIHBhZ2UgaGFzIGJlZW4gY29tcGxldGVkIGFuZCBtYXJrIHRoZSBwYWdlIHVwdG9kYXRlIG9yIHNldCB0aGUgZXJyb3IgYml0IG9uCisgKiB0aGUgcGFnZS4gIFRvIGRldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgcmVjb3JkcyB0aGF0IG5lZWQgZml4aW5nIHVwLCB3ZQorICogY2hlYXQgYSBsaXR0bGUgYml0IGJ5IHNldHRpbmcgdGhlIGluZGV4X2Jsb2NrX3NpemUgaW4gbnRmc19pbm9kZSB0byB0aGUgbnRmcworICogcmVjb3JkIHNpemUsIGFuZCBpbmRleF9ibG9ja19zaXplX2JpdHMsIHRvIHRoZSBsb2coYmFzZSAyKSBvZiB0aGUgbnRmcworICogcmVjb3JkIHNpemUuCisgKi8KK3N0YXRpYyB2b2lkIG50ZnNfZW5kX2J1ZmZlcl9hc3luY19yZWFkKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB1cHRvZGF0ZSkKK3sKKwlzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHBhZ2VfdXB0b2RhdGVfbG9jayk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRtcDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwludGZzX2lub2RlICpuaTsKKwlpbnQgcGFnZV91cHRvZGF0ZSA9IDE7CisKKwlwYWdlID0gYmgtPmJfcGFnZTsKKwluaSA9IE5URlNfSShwYWdlLT5tYXBwaW5nLT5ob3N0KTsKKworCWlmIChsaWtlbHkodXB0b2RhdGUpKSB7CisJCXM2NCBmaWxlX29mczsKKworCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKworCQlmaWxlX29mcyA9ICgoczY0KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpICsKKwkJCQliaF9vZmZzZXQoYmgpOworCQkvKiBDaGVjayBmb3IgdGhlIGN1cnJlbnQgYnVmZmVyIGhlYWQgb3ZlcmZsb3dpbmcuICovCisJCWlmIChmaWxlX29mcyArIGJoLT5iX3NpemUgPiBuaS0+aW5pdGlhbGl6ZWRfc2l6ZSkgeworCQkJY2hhciAqYWRkcjsKKwkJCWludCBvZnMgPSAwOworCisJCQlpZiAoZmlsZV9vZnMgPCBuaS0+aW5pdGlhbGl6ZWRfc2l6ZSkKKwkJCQlvZnMgPSBuaS0+aW5pdGlhbGl6ZWRfc2l6ZSAtIGZpbGVfb2ZzOworCQkJYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX0JJT19TUkNfSVJRKTsKKwkJCW1lbXNldChhZGRyICsgYmhfb2Zmc2V0KGJoKSArIG9mcywgMCwgYmgtPmJfc2l6ZSAtIG9mcyk7CisJCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJCWt1bm1hcF9hdG9taWMoYWRkciwgS01fQklPX1NSQ19JUlEpOworCQl9CisJfSBlbHNlIHsKKwkJY2xlYXJfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJbnRmc19lcnJvcihuaS0+dm9sLT5zYiwgIkJ1ZmZlciBJL08gZXJyb3IsIGxvZ2ljYWwgYmxvY2sgJWxsdS4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tucik7CisJCVNldFBhZ2VFcnJvcihwYWdlKTsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBhZ2VfdXB0b2RhdGVfbG9jaywgZmxhZ3MpOworCWNsZWFyX2J1ZmZlcl9hc3luY19yZWFkKGJoKTsKKwl1bmxvY2tfYnVmZmVyKGJoKTsKKwl0bXAgPSBiaDsKKwlkbyB7CisJCWlmICghYnVmZmVyX3VwdG9kYXRlKHRtcCkpCisJCQlwYWdlX3VwdG9kYXRlID0gMDsKKwkJaWYgKGJ1ZmZlcl9hc3luY19yZWFkKHRtcCkpIHsKKwkJCWlmIChsaWtlbHkoYnVmZmVyX2xvY2tlZCh0bXApKSkKKwkJCQlnb3RvIHN0aWxsX2J1c3k7CisJCQkvKiBBc3luYyBidWZmZXJzIG11c3QgYmUgbG9ja2VkLiAqLworCQkJQlVHKCk7CisJCX0KKwkJdG1wID0gdG1wLT5iX3RoaXNfcGFnZTsKKwl9IHdoaWxlICh0bXAgIT0gYmgpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBhZ2VfdXB0b2RhdGVfbG9jaywgZmxhZ3MpOworCS8qCisJICogSWYgbm9uZSBvZiB0aGUgYnVmZmVycyBoYWQgZXJyb3JzIHRoZW4gd2UgY2FuIHNldCB0aGUgcGFnZSB1cHRvZGF0ZSwKKwkgKiBidXQgd2UgZmlyc3QgaGF2ZSB0byBwZXJmb3JtIHRoZSBwb3N0IHJlYWQgbXN0IGZpeHVwcywgaWYgdGhlCisJICogYXR0cmlidXRlIGlzIG1zdCBwcm90ZWN0ZWQsIGkuZS4gaWYgTklub01zdFByb3RlY2VkKG5pKSBpcyB0cnVlLgorCSAqIE5vdGUgd2UgaWdub3JlIGZpeHVwIGVycm9ycyBhcyB0aG9zZSBhcmUgZGV0ZWN0ZWQgd2hlbgorCSAqIG1hcF9tZnRfcmVjb3JkKCkgaXMgY2FsbGVkIHdoaWNoIGdpdmVzIHVzIHBlciByZWNvcmQgZ3JhbnVsYXJpdHkKKwkgKiByYXRoZXIgdGhhbiBwZXIgcGFnZSBncmFudWxhcml0eS4KKwkgKi8KKwlpZiAoIU5Jbm9Nc3RQcm90ZWN0ZWQobmkpKSB7CisJCWlmIChsaWtlbHkocGFnZV91cHRvZGF0ZSAmJiAhUGFnZUVycm9yKHBhZ2UpKSkKKwkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwl9IGVsc2UgeworCQljaGFyICphZGRyOworCQl1bnNpZ25lZCBpbnQgaSwgcmVjczsKKwkJdTMyIHJlY19zaXplOworCisJCXJlY19zaXplID0gbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemU7CisJCXJlY3MgPSBQQUdFX0NBQ0hFX1NJWkUgLyByZWNfc2l6ZTsKKwkJLyogU2hvdWxkIGhhdmUgYmVlbiB2ZXJpZmllZCBiZWZvcmUgd2UgZ290IGhlcmUuLi4gKi8KKwkJQlVHX09OKCFyZWNzKTsKKwkJYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX0JJT19TUkNfSVJRKTsKKwkJZm9yIChpID0gMDsgaSA8IHJlY3M7IGkrKykKKwkJCXBvc3RfcmVhZF9tc3RfZml4dXAoKE5URlNfUkVDT1JEKikoYWRkciArCisJCQkJCWkgKiByZWNfc2l6ZSksIHJlY19zaXplKTsKKwkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCWt1bm1hcF9hdG9taWMoYWRkciwgS01fQklPX1NSQ19JUlEpOworCQlpZiAobGlrZWx5KCFQYWdlRXJyb3IocGFnZSkgJiYgcGFnZV91cHRvZGF0ZSkpCisJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJfQorCXVubG9ja19wYWdlKHBhZ2UpOworCXJldHVybjsKK3N0aWxsX2J1c3k6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGFnZV91cHRvZGF0ZV9sb2NrLCBmbGFncyk7CisJcmV0dXJuOworfQorCisvKioKKyAqIG50ZnNfcmVhZF9ibG9jayAtIGZpbGwgYSBAcGFnZSBvZiBhbiBhZGRyZXNzIHNwYWNlIHdpdGggZGF0YQorICogQHBhZ2U6CXBhZ2UgY2FjaGUgcGFnZSB0byBmaWxsIHdpdGggZGF0YQorICoKKyAqIEZpbGwgdGhlIHBhZ2UgQHBhZ2Ugb2YgdGhlIGFkZHJlc3Mgc3BhY2UgYmVsb25naW5nIHRvIHRoZSBAcGFnZS0+aG9zdCBpbm9kZS4KKyAqIFdlIHJlYWQgZWFjaCBidWZmZXIgYXN5bmNocm9ub3VzbHkgYW5kIHdoZW4gYWxsIGJ1ZmZlcnMgYXJlIHJlYWQgaW4sIG91ciBpbworICogY29tcGxldGlvbiBoYW5kbGVyIG50ZnNfZW5kX2J1ZmZlcl9yZWFkX2FzeW5jKCksIGlmIHJlcXVpcmVkLCBhdXRvbWF0aWNhbGx5CisgKiBhcHBsaWVzIHRoZSBtc3QgZml4dXBzIHRvIHRoZSBwYWdlIGJlZm9yZSBmaW5hbGx5IG1hcmtpbmcgaXQgdXB0b2RhdGUgYW5kCisgKiB1bmxvY2tpbmcgaXQuCisgKgorICogV2Ugb25seSBlbmZvcmNlIGFsbG9jYXRlZF9zaXplIGxpbWl0IGJlY2F1c2UgaV9zaXplIGlzIGNoZWNrZWQgZm9yIGluCisgKiBnZW5lcmljX2ZpbGVfcmVhZCgpLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4KKyAqCisgKiBDb250YWlucyBhbiBhZGFwdGVkIHZlcnNpb24gb2YgZnMvYnVmZmVyLmM6OmJsb2NrX3JlYWRfZnVsbF9wYWdlKCkuCisgKi8KK3N0YXRpYyBpbnQgbnRmc19yZWFkX2Jsb2NrKHN0cnVjdCBwYWdlICpwYWdlKQoreworCVZDTiB2Y247CisJTENOIGxjbjsKKwludGZzX2lub2RlICpuaTsKKwludGZzX3ZvbHVtZSAqdm9sOworCXJ1bmxpc3RfZWxlbWVudCAqcmw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKmhlYWQsICphcnJbTUFYX0JVRl9QRVJfUEFHRV07CisJc2VjdG9yX3QgaWJsb2NrLCBsYmxvY2ssIHpibG9jazsKKwl1bnNpZ25lZCBpbnQgYmxvY2tzaXplLCB2Y25fb2ZzOworCWludCBpLCBucjsKKwl1bnNpZ25lZCBjaGFyIGJsb2Nrc2l6ZV9iaXRzOworCisJbmkgPSBOVEZTX0kocGFnZS0+bWFwcGluZy0+aG9zdCk7CisJdm9sID0gbmktPnZvbDsKKworCS8qICRNRlQvJERBVEEgbXVzdCBoYXZlIGl0cyBjb21wbGV0ZSBydW5saXN0IGluIG1lbW9yeSBhdCBhbGwgdGltZXMuICovCisJQlVHX09OKCFuaS0+cnVubGlzdC5ybCAmJiAhbmktPm1mdF9ubyAmJiAhTklub0F0dHIobmkpKTsKKworCWJsb2Nrc2l6ZV9iaXRzID0gVkZTX0kobmkpLT5pX2Jsa2JpdHM7CisJYmxvY2tzaXplID0gMSA8PCBibG9ja3NpemVfYml0czsKKworCWlmICghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkKKwkJY3JlYXRlX2VtcHR5X2J1ZmZlcnMocGFnZSwgYmxvY2tzaXplLCAwKTsKKwliaCA9IGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJaWYgKHVubGlrZWx5KCFiaCkpIHsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlibG9jayA9IChzNjQpcGFnZS0+aW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBibG9ja3NpemVfYml0cyk7CisJbGJsb2NrID0gKG5pLT5hbGxvY2F0ZWRfc2l6ZSArIGJsb2Nrc2l6ZSAtIDEpID4+IGJsb2Nrc2l6ZV9iaXRzOworCXpibG9jayA9IChuaS0+aW5pdGlhbGl6ZWRfc2l6ZSArIGJsb2Nrc2l6ZSAtIDEpID4+IGJsb2Nrc2l6ZV9iaXRzOworCisJLyogTG9vcCB0aHJvdWdoIGFsbCB0aGUgYnVmZmVycyBpbiB0aGUgcGFnZS4gKi8KKwlybCA9IE5VTEw7CisJbnIgPSBpID0gMDsKKwlkbyB7CisJCXU4ICprYWRkcjsKKworCQlpZiAodW5saWtlbHkoYnVmZmVyX3VwdG9kYXRlKGJoKSkpCisJCQljb250aW51ZTsKKwkJaWYgKHVubGlrZWx5KGJ1ZmZlcl9tYXBwZWQoYmgpKSkgeworCQkJYXJyW25yKytdID0gYmg7CisJCQljb250aW51ZTsKKwkJfQorCQliaC0+Yl9iZGV2ID0gdm9sLT5zYi0+c19iZGV2OworCQkvKiBJcyB0aGUgYmxvY2sgd2l0aGluIHRoZSBhbGxvd2VkIGxpbWl0cz8gKi8KKwkJaWYgKGlibG9jayA8IGxibG9jaykgeworCQkJQk9PTCBpc19yZXRyeSA9IEZBTFNFOworCisJCQkvKiBDb252ZXJ0IGlibG9jayBpbnRvIGNvcnJlc3BvbmRpbmcgdmNuIGFuZCBvZmZzZXQuICovCisJCQl2Y24gPSAoVkNOKWlibG9jayA8PCBibG9ja3NpemVfYml0cyA+PgorCQkJCQl2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzOworCQkJdmNuX29mcyA9ICgoVkNOKWlibG9jayA8PCBibG9ja3NpemVfYml0cykgJgorCQkJCQl2b2wtPmNsdXN0ZXJfc2l6ZV9tYXNrOworCQkJaWYgKCFybCkgeworbG9ja19yZXRyeV9yZW1hcDoKKwkJCQlkb3duX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCQkJCXJsID0gbmktPnJ1bmxpc3Qucmw7CisJCQl9CisJCQlpZiAobGlrZWx5KHJsICE9IE5VTEwpKSB7CisJCQkJLyogU2VlayB0byBlbGVtZW50IGNvbnRhaW5pbmcgdGFyZ2V0IHZjbi4gKi8KKwkJCQl3aGlsZSAocmwtPmxlbmd0aCAmJiBybFsxXS52Y24gPD0gdmNuKQorCQkJCQlybCsrOworCQkJCWxjbiA9IG50ZnNfcmxfdmNuX3RvX2xjbihybCwgdmNuKTsKKwkJCX0gZWxzZQorCQkJCWxjbiA9IExDTl9STF9OT1RfTUFQUEVEOworCQkJLyogU3VjY2Vzc2Z1bCByZW1hcC4gKi8KKwkJCWlmIChsY24gPj0gMCkgeworCQkJCS8qIFNldHVwIGJ1ZmZlciBoZWFkIHRvIGNvcnJlY3QgYmxvY2suICovCisJCQkJYmgtPmJfYmxvY2tuciA9ICgobGNuIDw8IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMpCisJCQkJCQkrIHZjbl9vZnMpID4+IGJsb2Nrc2l6ZV9iaXRzOworCQkJCXNldF9idWZmZXJfbWFwcGVkKGJoKTsKKwkJCQkvKiBPbmx5IHJlYWQgaW5pdGlhbGl6ZWQgZGF0YSBibG9ja3MuICovCisJCQkJaWYgKGlibG9jayA8IHpibG9jaykgeworCQkJCQlhcnJbbnIrK10gPSBiaDsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCS8qIEZ1bGx5IG5vbi1pbml0aWFsaXplZCBkYXRhIGJsb2NrLCB6ZXJvIGl0LiAqLworCQkJCWdvdG8gaGFuZGxlX3pibG9jazsKKwkJCX0KKwkJCS8qIEl0IGlzIGEgaG9sZSwgbmVlZCB0byB6ZXJvIGl0LiAqLworCQkJaWYgKGxjbiA9PSBMQ05fSE9MRSkKKwkJCQlnb3RvIGhhbmRsZV9ob2xlOworCQkJLyogSWYgZmlyc3QgdHJ5IGFuZCBydW5saXN0IHVubWFwcGVkLCBtYXAgYW5kIHJldHJ5LiAqLworCQkJaWYgKCFpc19yZXRyeSAmJiBsY24gPT0gTENOX1JMX05PVF9NQVBQRUQpIHsKKwkJCQlpbnQgZXJyOworCQkJCWlzX3JldHJ5ID0gVFJVRTsKKwkJCQkvKgorCQkJCSAqIEF0dGVtcHQgdG8gbWFwIHJ1bmxpc3QsIGRyb3BwaW5nIGxvY2sgZm9yCisJCQkJICogdGhlIGR1cmF0aW9uLgorCQkJCSAqLworCQkJCXVwX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCQkJCWVyciA9IG50ZnNfbWFwX3J1bmxpc3QobmksIHZjbik7CisJCQkJaWYgKGxpa2VseSghZXJyKSkKKwkJCQkJZ290byBsb2NrX3JldHJ5X3JlbWFwOworCQkJCXJsID0gTlVMTDsKKwkJCQlsY24gPSBlcnI7CisJCQl9CisJCQkvKiBIYXJkIGVycm9yLCB6ZXJvIG91dCByZWdpb24uICovCisJCQliaC0+Yl9ibG9ja25yID0gLTE7CisJCQlTZXRQYWdlRXJyb3IocGFnZSk7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gcmVhZCBmcm9tIGlub2RlIDB4JWx4LCAiCisJCQkJCSJhdHRyaWJ1dGUgdHlwZSAweCV4LCB2Y24gMHglbGx4LCAiCisJCQkJCSJvZmZzZXQgMHgleCBiZWNhdXNlIGl0cyBsb2NhdGlvbiBvbiAiCisJCQkJCSJkaXNrIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkJXMgIgorCQkJCQkiKGVycm9yIGNvZGUgJWxsaSkuIiwgbmktPm1mdF9ubywKKwkJCQkJbmktPnR5cGUsICh1bnNpZ25lZCBsb25nIGxvbmcpdmNuLAorCQkJCQl2Y25fb2ZzLCBpc19yZXRyeSA/ICIgZXZlbiBhZnRlciAiCisJCQkJCSJyZXRyeWluZyIgOiAiIiwgKGxvbmcgbG9uZylsY24pOworCQl9CisJCS8qCisJCSAqIEVpdGhlciBpYmxvY2sgd2FzIG91dHNpZGUgbGJsb2NrIGxpbWl0cyBvcgorCQkgKiBudGZzX3JsX3Zjbl90b19sY24oKSByZXR1cm5lZCBlcnJvci4gIEp1c3QgemVybyB0aGF0IHBvcnRpb24KKwkJICogb2YgdGhlIHBhZ2UgYW5kIHNldCB0aGUgYnVmZmVyIHVwdG9kYXRlLgorCQkgKi8KK2hhbmRsZV9ob2xlOgorCQliaC0+Yl9ibG9ja25yID0gLTFVTDsKKwkJY2xlYXJfYnVmZmVyX21hcHBlZChiaCk7CitoYW5kbGVfemJsb2NrOgorCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkJbWVtc2V0KGthZGRyICsgaSAqIGJsb2Nrc2l6ZSwgMCwgYmxvY2tzaXplKTsKKwkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJfSB3aGlsZSAoaSsrLCBpYmxvY2srKywgKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKKworCS8qIFJlbGVhc2UgdGhlIGxvY2sgaWYgd2UgdG9vayBpdC4gKi8KKwlpZiAocmwpCisJCXVwX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCisJLyogQ2hlY2sgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgYnVmZmVyIHJlYWR5IGZvciBpL28uICovCisJaWYgKG5yKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqdGJoOworCisJCS8qIExvY2sgdGhlIGJ1ZmZlcnMuICovCisJCWZvciAoaSA9IDA7IGkgPCBucjsgaSsrKSB7CisJCQl0YmggPSBhcnJbaV07CisJCQlsb2NrX2J1ZmZlcih0YmgpOworCQkJdGJoLT5iX2VuZF9pbyA9IG50ZnNfZW5kX2J1ZmZlcl9hc3luY19yZWFkOworCQkJc2V0X2J1ZmZlcl9hc3luY19yZWFkKHRiaCk7CisJCX0KKwkJLyogRmluYWxseSwgc3RhcnQgaS9vIG9uIHRoZSBidWZmZXJzLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKykgeworCQkJdGJoID0gYXJyW2ldOworCQkJaWYgKGxpa2VseSghYnVmZmVyX3VwdG9kYXRlKHRiaCkpKQorCQkJCXN1Ym1pdF9iaChSRUFELCB0YmgpOworCQkJZWxzZQorCQkJCW50ZnNfZW5kX2J1ZmZlcl9hc3luY19yZWFkKHRiaCwgMSk7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCS8qIE5vIGkvbyB3YXMgc2NoZWR1bGVkIG9uIGFueSBvZiB0aGUgYnVmZmVycy4gKi8KKwlpZiAobGlrZWx5KCFQYWdlRXJyb3IocGFnZSkpKQorCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJZWxzZSAvKiBTaWduYWwgc3luY2hyb25vdXMgaS9vIGVycm9yLiAqLworCQluciA9IC1FSU87CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIG5yOworfQorCisvKioKKyAqIG50ZnNfcmVhZHBhZ2UgLSBmaWxsIGEgQHBhZ2Ugb2YgYSBAZmlsZSB3aXRoIGRhdGEgZnJvbSB0aGUgZGV2aWNlCisgKiBAZmlsZToJb3BlbiBmaWxlIHRvIHdoaWNoIHRoZSBwYWdlIEBwYWdlIGJlbG9uZ3Mgb3IgTlVMTAorICogQHBhZ2U6CXBhZ2UgY2FjaGUgcGFnZSB0byBmaWxsIHdpdGggZGF0YQorICoKKyAqIEZvciBub24tcmVzaWRlbnQgYXR0cmlidXRlcywgbnRmc19yZWFkcGFnZSgpIGZpbGxzIHRoZSBAcGFnZSBvZiB0aGUgb3BlbgorICogZmlsZSBAZmlsZSBieSBjYWxsaW5nIHRoZSBudGZzIHZlcnNpb24gb2YgdGhlIGdlbmVyaWMgYmxvY2tfcmVhZF9mdWxsX3BhZ2UoKQorICogZnVuY3Rpb24sIG50ZnNfcmVhZF9ibG9jaygpLCB3aGljaCBpbiB0dXJuIGNyZWF0ZXMgYW5kIHJlYWRzIGluIHRoZSBidWZmZXJzCisgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHBhZ2UgYXN5bmNocm9ub3VzbHkuCisgKgorICogRm9yIHJlc2lkZW50IGF0dHJpYnV0ZXMsIE9UT0gsIG50ZnNfcmVhZHBhZ2UoKSBmaWxscyBAcGFnZSBieSBjb3B5aW5nIHRoZQorICogZGF0YSBmcm9tIHRoZSBtZnQgcmVjb3JkICh3aGljaCBhdCB0aGlzIHN0YWdlIGlzIG1vc3QgbGlrZWx5IGluIG1lbW9yeSkgYW5kCisgKiBmaWxscyB0aGUgcmVtYWluZGVyIHdpdGggemVyb2VzLiBUaHVzLCBpbiB0aGlzIGNhc2UsIEkvTyBpcyBzeW5jaHJvbm91cywgYXMKKyAqIGV2ZW4gaWYgdGhlIG1mdCByZWNvcmQgaXMgbm90IGNhY2hlZCBhdCB0aGlzIHBvaW50IGluIHRpbWUsIHdlIG5lZWQgdG8gd2FpdAorICogZm9yIGl0IHRvIGJlIHJlYWQgaW4gYmVmb3JlIHdlIGNhbiBkbyB0aGUgY29weS4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgbnRmc19yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJbG9mZl90IGlfc2l6ZTsKKwludGZzX2lub2RlICpuaSwgKmJhc2Vfbmk7CisJdTggKmthZGRyOworCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHg7CisJTUZUX1JFQ09SRCAqbXJlYzsKKwl1MzIgYXR0cl9sZW47CisJaW50IGVyciA9IDA7CisKKwlCVUdfT04oIVBhZ2VMb2NrZWQocGFnZSkpOworCS8qCisJICogVGhpcyBjYW4gcG90ZW50aWFsbHkgaGFwcGVuIGJlY2F1c2Ugd2UgY2xlYXIgUGFnZVVwdG9kYXRlKCkgZHVyaW5nCisJICogbnRmc193cml0ZXBhZ2UoKSBvZiBNc3RQcm90ZWN0ZWQoKSBhdHRyaWJ1dGVzLgorCSAqLworCWlmIChQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCXJldHVybiAwOworCX0KKwluaSA9IE5URlNfSShwYWdlLT5tYXBwaW5nLT5ob3N0KTsKKworCS8qIE5Jbm9Ob25SZXNpZGVudCgpID09IE5Jbm9JbmRleEFsbG9jUHJlc2VudCgpICovCisJaWYgKE5Jbm9Ob25SZXNpZGVudChuaSkpIHsKKwkJLyoKKwkJICogT25seSB1bm5hbWVkICREQVRBIGF0dHJpYnV0ZXMgY2FuIGJlIGNvbXByZXNzZWQgb3IKKwkJICogZW5jcnlwdGVkLgorCQkgKi8KKwkJaWYgKG5pLT50eXBlID09IEFUX0RBVEEgJiYgIW5pLT5uYW1lX2xlbikgeworCQkJLyogSWYgZmlsZSBpcyBlbmNyeXB0ZWQsIGRlbnkgYWNjZXNzLCBqdXN0IGxpa2UgTlQ0LiAqLworCQkJaWYgKE5Jbm9FbmNyeXB0ZWQobmkpKSB7CisJCQkJZXJyID0gLUVBQ0NFUzsKKwkJCQlnb3RvIGVycl9vdXQ7CisJCQl9CisJCQkvKiBDb21wcmVzc2VkIGRhdGEgc3RyZWFtcyBhcmUgaGFuZGxlZCBpbiBjb21wcmVzcy5jLiAqLworCQkJaWYgKE5Jbm9Db21wcmVzc2VkKG5pKSkKKwkJCQlyZXR1cm4gbnRmc19yZWFkX2NvbXByZXNzZWRfYmxvY2socGFnZSk7CisJCX0KKwkJLyogTm9ybWFsIGRhdGEgc3RyZWFtLiAqLworCQlyZXR1cm4gbnRmc19yZWFkX2Jsb2NrKHBhZ2UpOworCX0KKwkvKgorCSAqIEF0dHJpYnV0ZSBpcyByZXNpZGVudCwgaW1wbHlpbmcgaXQgaXMgbm90IGNvbXByZXNzZWQgb3IgZW5jcnlwdGVkLgorCSAqIFRoaXMgYWxzbyBtZWFucyB0aGUgYXR0cmlidXRlIGlzIHNtYWxsZXIgdGhhbiBhbiBtZnQgcmVjb3JkIGFuZAorCSAqIGhlbmNlIHNtYWxsZXIgdGhhbiBhIHBhZ2UsIHNvIGNhbiBzaW1wbHkgemVybyBvdXQgYW55IHBhZ2VzIHdpdGgKKwkgKiBpbmRleCBhYm92ZSAwLiAgV2UgY2FuIGFsc28gZG8gdGhpcyBpZiB0aGUgZmlsZSBzaXplIGlzIDAuCisJICovCisJaWYgKHVubGlrZWx5KHBhZ2UtPmluZGV4ID4gMCB8fCAhaV9zaXplX3JlYWQoVkZTX0kobmkpKSkpIHsKKwkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCW1lbXNldChrYWRkciwgMCwgUEFHRV9DQUNIRV9TSVpFKTsKKwkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJZ290byBkb25lOworCX0KKwlpZiAoIU5Jbm9BdHRyKG5pKSkKKwkJYmFzZV9uaSA9IG5pOworCWVsc2UKKwkJYmFzZV9uaSA9IG5pLT5leHQuYmFzZV9udGZzX2lubzsKKwkvKiBNYXAsIHBpbiwgYW5kIGxvY2sgdGhlIG1mdCByZWNvcmQuICovCisJbXJlYyA9IG1hcF9tZnRfcmVjb3JkKGJhc2VfbmkpOworCWlmIChJU19FUlIobXJlYykpIHsKKwkJZXJyID0gUFRSX0VSUihtcmVjKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwljdHggPSBudGZzX2F0dHJfZ2V0X3NlYXJjaF9jdHgoYmFzZV9uaSwgbXJlYyk7CisJaWYgKHVubGlrZWx5KCFjdHgpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCWVyciA9IG50ZnNfYXR0cl9sb29rdXAobmktPnR5cGUsIG5pLT5uYW1lLCBuaS0+bmFtZV9sZW4sCisJCQlDQVNFX1NFTlNJVElWRSwgMCwgTlVMTCwgMCwgY3R4KTsKKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJZ290byBwdXRfdW5tX2Vycl9vdXQ7CisJYXR0cl9sZW4gPSBsZTMyX3RvX2NwdShjdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKTsKKwlpX3NpemUgPSBpX3NpemVfcmVhZChWRlNfSShuaSkpOworCWlmICh1bmxpa2VseShhdHRyX2xlbiA+IGlfc2l6ZSkpCisJCWF0dHJfbGVuID0gaV9zaXplOworCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCS8qIENvcHkgdGhlIGRhdGEgdG8gdGhlIHBhZ2UuICovCisJbWVtY3B5KGthZGRyLCAodTgqKWN0eC0+YXR0ciArCisJCQlsZTE2X3RvX2NwdShjdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSwKKwkJCWF0dHJfbGVuKTsKKwkvKiBaZXJvIHRoZSByZW1haW5kZXIgb2YgdGhlIHBhZ2UuICovCisJbWVtc2V0KGthZGRyICsgYXR0cl9sZW4sIDAsIFBBR0VfQ0FDSEVfU0laRSAtIGF0dHJfbGVuKTsKKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CitwdXRfdW5tX2Vycl9vdXQ6CisJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7Cit1bm1fZXJyX291dDoKKwl1bm1hcF9tZnRfcmVjb3JkKGJhc2VfbmkpOworZG9uZToKKwlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CitlcnJfb3V0OgorCXVubG9ja19wYWdlKHBhZ2UpOworCXJldHVybiBlcnI7Cit9CisKKyNpZmRlZiBOVEZTX1JXCisKKy8qKgorICogbnRmc193cml0ZV9ibG9jayAtIHdyaXRlIGEgQHBhZ2UgdG8gdGhlIGJhY2tpbmcgc3RvcmUKKyAqIEBwYWdlOglwYWdlIGNhY2hlIHBhZ2UgdG8gd3JpdGUgb3V0CisgKiBAd2JjOgl3cml0ZWJhY2sgY29udHJvbCBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGZvciB3cml0aW5nIHBhZ2VzIGJlbG9uZ2luZyB0byBub24tcmVzaWRlbnQsIG5vbi1tc3QKKyAqIHByb3RlY3RlZCBhdHRyaWJ1dGVzIHRvIHRoZWlyIGJhY2tpbmcgc3RvcmUuCisgKgorICogRm9yIGEgcGFnZSB3aXRoIGJ1ZmZlcnMsIG1hcCBhbmQgd3JpdGUgdGhlIGRpcnR5IGJ1ZmZlcnMgYXN5bmNocm9ub3VzbHkKKyAqIHVuZGVyIHBhZ2Ugd3JpdGViYWNrLiBGb3IgYSBwYWdlIHdpdGhvdXQgYnVmZmVycywgY3JlYXRlIGJ1ZmZlcnMgZm9yIHRoZQorICogcGFnZSwgdGhlbiBwcm9jZWVkIGFzIGFib3ZlLgorICoKKyAqIElmIGEgcGFnZSBkb2Vzbid0IGhhdmUgYnVmZmVycyB0aGUgcGFnZSBkaXJ0eSBzdGF0ZSBpcyBkZWZpbml0aXZlLiBJZiBhIHBhZ2UKKyAqIGRvZXMgaGF2ZSBidWZmZXJzLCB0aGUgcGFnZSBkaXJ0eSBzdGF0ZSBpcyBqdXN0IGEgaGludCwgYW5kIHRoZSBidWZmZXIgZGlydHkKKyAqIHN0YXRlIGlzIGRlZmluaXRpdmUuIChBIGhpbnQgd2hpY2ggaGFzIHJ1bGVzOiBkaXJ0eSBidWZmZXJzIGFnYWluc3QgYSBjbGVhbgorICogcGFnZSBpcyBpbGxlZ2FsLiBPdGhlciBjb21iaW5hdGlvbnMgYXJlIGxlZ2FsIGFuZCBuZWVkIHRvIGJlIGhhbmRsZWQuIEluCisgKiBwYXJ0aWN1bGFyIGEgZGlydHkgcGFnZSBjb250YWluaW5nIGNsZWFuIGJ1ZmZlcnMgZm9yIGV4YW1wbGUuKQorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4KKyAqCisgKiBCYXNlZCBvbiBudGZzX3JlYWRfYmxvY2soKSBhbmQgX19ibG9ja193cml0ZV9mdWxsX3BhZ2UoKS4KKyAqLworc3RhdGljIGludCBudGZzX3dyaXRlX2Jsb2NrKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlWQ04gdmNuOworCUxDTiBsY247CisJc2VjdG9yX3QgYmxvY2ssIGRibG9jaywgaWJsb2NrOworCXN0cnVjdCBpbm9kZSAqdmk7CisJbnRmc19pbm9kZSAqbmk7CisJbnRmc192b2x1bWUgKnZvbDsKKwlydW5saXN0X2VsZW1lbnQgKnJsOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICpoZWFkOworCXVuc2lnbmVkIGludCBibG9ja3NpemUsIHZjbl9vZnM7CisJaW50IGVycjsKKwlCT09MIG5lZWRfZW5kX3dyaXRlYmFjazsKKwl1bnNpZ25lZCBjaGFyIGJsb2Nrc2l6ZV9iaXRzOworCisJdmkgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCW5pID0gTlRGU19JKHZpKTsKKwl2b2wgPSBuaS0+dm9sOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIGlub2RlIDB4JWx4LCBhdHRyaWJ1dGUgdHlwZSAweCV4LCBwYWdlIGluZGV4ICIKKwkJCSIweCVseC4iLCBuaS0+bWZ0X25vLCBuaS0+dHlwZSwgcGFnZS0+aW5kZXgpOworCisJQlVHX09OKCFOSW5vTm9uUmVzaWRlbnQobmkpKTsKKwlCVUdfT04oTklub01zdFByb3RlY3RlZChuaSkpOworCisJYmxvY2tzaXplX2JpdHMgPSB2aS0+aV9ibGtiaXRzOworCWJsb2Nrc2l6ZSA9IDEgPDwgYmxvY2tzaXplX2JpdHM7CisKKwlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpIHsKKwkJQlVHX09OKCFQYWdlVXB0b2RhdGUocGFnZSkpOworCQljcmVhdGVfZW1wdHlfYnVmZmVycyhwYWdlLCBibG9ja3NpemUsCisJCQkJKDEgPDwgQkhfVXB0b2RhdGUpIHwgKDEgPDwgQkhfRGlydHkpKTsKKwl9CisJYmggPSBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCWlmICh1bmxpa2VseSghYmgpKSB7CisJCW50ZnNfd2FybmluZyh2b2wtPnNiLCAiRXJyb3IgYWxsb2NhdGluZyBwYWdlIGJ1ZmZlcnMuICIKKwkJCQkiUmVkaXJ0eWluZyBwYWdlIHNvIHdlIHRyeSBhZ2FpbiBsYXRlci4iKTsKKwkJLyoKKwkJICogUHV0IHRoZSBwYWdlIGJhY2sgb24gbWFwcGluZy0+ZGlydHlfcGFnZXMsIGJ1dCBsZWF2ZSBpdHMKKwkJICogYnVmZmVyJ3MgZGlydHkgc3RhdGUgYXMtaXMuCisJCSAqLworCQlyZWRpcnR5X3BhZ2VfZm9yX3dyaXRlcGFnZSh3YmMsIHBhZ2UpOworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogTk9URTogRGlmZmVyZW50IG5hbWluZyBzY2hlbWUgdG8gbnRmc19yZWFkX2Jsb2NrKCkhICovCisKKwkvKiBUaGUgZmlyc3QgYmxvY2sgaW4gdGhlIHBhZ2UuICovCisJYmxvY2sgPSAoczY0KXBhZ2UtPmluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gYmxvY2tzaXplX2JpdHMpOworCisJLyogVGhlIGZpcnN0IG91dCBvZiBib3VuZHMgYmxvY2sgZm9yIHRoZSBkYXRhIHNpemUuICovCisJZGJsb2NrID0gKHZpLT5pX3NpemUgKyBibG9ja3NpemUgLSAxKSA+PiBibG9ja3NpemVfYml0czsKKworCS8qIFRoZSBsYXN0IChmdWxseSBvciBwYXJ0aWFsbHkpIGluaXRpYWxpemVkIGJsb2NrLiAqLworCWlibG9jayA9IG5pLT5pbml0aWFsaXplZF9zaXplID4+IGJsb2Nrc2l6ZV9iaXRzOworCisJLyoKKwkgKiBCZSB2ZXJ5IGNhcmVmdWwuICBXZSBoYXZlIG5vIGV4Y2x1c2lvbiBmcm9tIF9fc2V0X3BhZ2VfZGlydHlfYnVmZmVycworCSAqIGhlcmUsIGFuZCB0aGUgKHBvdGVudGlhbGx5IHVubWFwcGVkKSBidWZmZXJzIG1heSBiZWNvbWUgZGlydHkgYXQKKwkgKiBhbnkgdGltZS4gIElmIGEgYnVmZmVyIGJlY29tZXMgZGlydHkgaGVyZSBhZnRlciB3ZSd2ZSBpbnNwZWN0ZWQgaXQKKwkgKiB0aGVuIHdlIGp1c3QgbWlzcyB0aGF0IGZhY3QsIGFuZCB0aGUgcGFnZSBzdGF5cyBkaXJ0eS4KKwkgKgorCSAqIEJ1ZmZlcnMgb3V0c2lkZSBpX3NpemUgbWF5IGJlIGRpcnRpZWQgYnkgX19zZXRfcGFnZV9kaXJ0eV9idWZmZXJzOworCSAqIGhhbmRsZSB0aGF0IGhlcmUgYnkganVzdCBjbGVhbmluZyB0aGVtLgorCSAqLworCisJLyoKKwkgKiBMb29wIHRocm91Z2ggYWxsIHRoZSBidWZmZXJzIGluIHRoZSBwYWdlLCBtYXBwaW5nIGFsbCB0aGUgZGlydHkKKwkgKiBidWZmZXJzIHRvIGRpc2sgYWRkcmVzc2VzIGFuZCBoYW5kbGluZyBhbnkgYWxpYXNlcyBmcm9tIHRoZQorCSAqIHVuZGVybHlpbmcgYmxvY2sgZGV2aWNlJ3MgbWFwcGluZy4KKwkgKi8KKwlybCA9IE5VTEw7CisJZXJyID0gMDsKKwlkbyB7CisJCUJPT0wgaXNfcmV0cnkgPSBGQUxTRTsKKworCQlpZiAodW5saWtlbHkoYmxvY2sgPj0gZGJsb2NrKSkgeworCQkJLyoKKwkJCSAqIE1hcHBlZCBidWZmZXJzIG91dHNpZGUgaV9zaXplIHdpbGwgb2NjdXIsIGJlY2F1c2UKKwkJCSAqIHRoaXMgcGFnZSBjYW4gYmUgb3V0c2lkZSBpX3NpemUgd2hlbiB0aGVyZSBpcyBhCisJCQkgKiB0cnVuY2F0ZSBpbiBwcm9ncmVzcy4gVGhlIGNvbnRlbnRzIG9mIHN1Y2ggYnVmZmVycworCQkJICogd2VyZSB6ZXJvZWQgYnkgbnRmc193cml0ZXBhZ2UoKS4KKwkJCSAqCisJCQkgKiBGSVhNRTogV2hhdCBhYm91dCB0aGUgc21hbGwgcmFjZSB3aW5kb3cgd2hlcmUKKwkJCSAqIG50ZnNfd3JpdGVwYWdlKCkgaGFzIG5vdCBkb25lIGFueSBjbGVhcmluZyBiZWNhdXNlCisJCQkgKiB0aGUgcGFnZSB3YXMgd2l0aGluIGlfc2l6ZSBidXQgYmVmb3JlIHdlIGdldCBoZXJlLAorCQkJICogdm10cnVuY2F0ZSgpIG1vZGlmaWVzIGlfc2l6ZT8KKwkJCSAqLworCQkJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKKwkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBDbGVhbiBidWZmZXJzIGFyZSBub3Qgd3JpdHRlbiBvdXQsIHNvIG5vIG5lZWQgdG8gbWFwIHRoZW0uICovCisJCWlmICghYnVmZmVyX2RpcnR5KGJoKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGVub3VnaCBpbml0aWFsaXplZCBzaXplLiAqLworCQlpZiAodW5saWtlbHkoKGJsb2NrID49IGlibG9jaykgJiYKKwkJCQkobmktPmluaXRpYWxpemVkX3NpemUgPCB2aS0+aV9zaXplKSkpIHsKKwkJCS8qCisJCQkgKiBJZiB0aGlzIHBhZ2UgaXMgZnVsbHkgb3V0c2lkZSBpbml0aWFsaXplZCBzaXplLCB6ZXJvCisJCQkgKiBvdXQgYWxsIHBhZ2VzIGJldHdlZW4gdGhlIGN1cnJlbnQgaW5pdGlhbGl6ZWQgc2l6ZQorCQkJICogYW5kIHRoZSBjdXJyZW50IHBhZ2UuIEp1c3QgdXNlIG50ZnNfcmVhZHBhZ2UoKSB0byBkbworCQkJICogdGhlIHplcm9pbmcgdHJhbnNwYXJlbnRseS4KKwkJCSAqLworCQkJaWYgKGJsb2NrID4gaWJsb2NrKSB7CisJCQkJLy8gVE9ETzoKKwkJCQkvLyBGb3IgZWFjaCBwYWdlIGRvOgorCQkJCS8vIC0gcmVhZF9jYWNoZV9wYWdlKCkKKwkJCQkvLyBBZ2FpbiBmb3IgZWFjaCBwYWdlIGRvOgorCQkJCS8vIC0gd2FpdF9vbl9wYWdlX2xvY2tlZCgpCisJCQkJLy8gLSBDaGVjayAoUGFnZVVwdG9kYXRlKHBhZ2UpICYmCisJCQkJLy8JCQkhUGFnZUVycm9yKHBhZ2UpKQorCQkJCS8vIFVwZGF0ZSBpbml0aWFsaXplZCBzaXplIGluIHRoZSBhdHRyaWJ1dGUgYW5kCisJCQkJLy8gaW4gdGhlIGlub2RlLgorCQkJCS8vIEFnYWluLCBmb3IgZWFjaCBwYWdlIGRvOgorCQkJCS8vCV9fc2V0X3BhZ2VfZGlydHlfYnVmZmVycygpOworCQkJCS8vIHBhZ2VfY2FjaGVfcmVsZWFzZSgpCisJCQkJLy8gV2UgZG9uJ3QgbmVlZCB0byB3YWl0IG9uIHRoZSB3cml0ZXMuCisJCQkJLy8gVXBkYXRlIGlibG9jay4KKwkJCX0KKwkJCS8qCisJCQkgKiBUaGUgY3VycmVudCBwYWdlIHN0cmFkZGxlcyBpbml0aWFsaXplZCBzaXplLiBaZXJvCisJCQkgKiBhbGwgbm9uLXVwdG9kYXRlIGJ1ZmZlcnMgYW5kIHNldCB0aGVtIHVwdG9kYXRlIChhbmQKKwkJCSAqIGRpcnR5PykuIE5vdGUsIHRoZXJlIGFyZW4ndCBhbnkgbm9uLXVwdG9kYXRlIGJ1ZmZlcnMKKwkJCSAqIGlmIHRoZSBwYWdlIGlzIHVwdG9kYXRlLgorCQkJICogRklYTUU6IEZvciBhbiB1cHRvZGF0ZSBwYWdlLCB0aGUgYnVmZmVycyBtYXkgbmVlZCB0bworCQkJICogYmUgd3JpdHRlbiBvdXQgYmVjYXVzZSB0aGV5IHdlcmUgbm90IGluaXRpYWxpemVkIG9uCisJCQkgKiBkaXNrIGJlZm9yZS4KKwkJCSAqLworCQkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJCQkvLyBUT0RPOgorCQkJCS8vIFplcm8gYW55IG5vbi11cHRvZGF0ZSBidWZmZXJzIHVwIHRvIGlfc2l6ZS4KKwkJCQkvLyBTZXQgdGhlbSB1cHRvZGF0ZSBhbmQgZGlydHkuCisJCQl9CisJCQkvLyBUT0RPOgorCQkJLy8gVXBkYXRlIGluaXRpYWxpemVkIHNpemUgaW4gdGhlIGF0dHJpYnV0ZSBhbmQgaW4gdGhlCisJCQkvLyBpbm9kZSAodXAgdG8gaV9zaXplKS4KKwkJCS8vIFVwZGF0ZSBpYmxvY2suCisJCQkvLyBGSVhNRTogVGhpcyBpcyBpbmVmZmljaWVudC4gVHJ5IHRvIGJhdGNoIHRoZSB0d28KKwkJCS8vIHNpemUgY2hhbmdlcyB0byBoYXBwZW4gaW4gb25lIGdvLgorCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiV3JpdGluZyBiZXlvbmQgaW5pdGlhbGl6ZWQgc2l6ZSAiCisJCQkJCSJpcyBub3Qgc3VwcG9ydGVkIHlldC4gU29ycnkuIik7CisJCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJCWJyZWFrOworCQkJLy8gRG8gTk9UIHNldF9idWZmZXJfbmV3KCkgQlVUIERPIGNsZWFyIGJ1ZmZlciByYW5nZQorCQkJLy8gb3V0c2lkZSB3cml0ZSByZXF1ZXN0IHJhbmdlLgorCQkJLy8gc2V0X2J1ZmZlcl91cHRvZGF0ZSgpIG9uIGNvbXBsZXRlIGJ1ZmZlcnMgYXMgd2VsbCBhcworCQkJLy8gc2V0X2J1ZmZlcl9kaXJ0eSgpLgorCQl9CisKKwkJLyogTm8gbmVlZCB0byBtYXAgYnVmZmVycyB0aGF0IGFyZSBhbHJlYWR5IG1hcHBlZC4gKi8KKwkJaWYgKGJ1ZmZlcl9tYXBwZWQoYmgpKQorCQkJY29udGludWU7CisKKwkJLyogVW5tYXBwZWQsIGRpcnR5IGJ1ZmZlci4gTmVlZCB0byBtYXAgaXQuICovCisJCWJoLT5iX2JkZXYgPSB2b2wtPnNiLT5zX2JkZXY7CisKKwkJLyogQ29udmVydCBibG9jayBpbnRvIGNvcnJlc3BvbmRpbmcgdmNuIGFuZCBvZmZzZXQuICovCisJCXZjbiA9IChWQ04pYmxvY2sgPDwgYmxvY2tzaXplX2JpdHM7CisJCXZjbl9vZnMgPSB2Y24gJiB2b2wtPmNsdXN0ZXJfc2l6ZV9tYXNrOworCQl2Y24gPj49IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHM7CisJCWlmICghcmwpIHsKK2xvY2tfcmV0cnlfcmVtYXA6CisJCQlkb3duX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCQkJcmwgPSBuaS0+cnVubGlzdC5ybDsKKwkJfQorCQlpZiAobGlrZWx5KHJsICE9IE5VTEwpKSB7CisJCQkvKiBTZWVrIHRvIGVsZW1lbnQgY29udGFpbmluZyB0YXJnZXQgdmNuLiAqLworCQkJd2hpbGUgKHJsLT5sZW5ndGggJiYgcmxbMV0udmNuIDw9IHZjbikKKwkJCQlybCsrOworCQkJbGNuID0gbnRmc19ybF92Y25fdG9fbGNuKHJsLCB2Y24pOworCQl9IGVsc2UKKwkJCWxjbiA9IExDTl9STF9OT1RfTUFQUEVEOworCQkvKiBTdWNjZXNzZnVsIHJlbWFwLiAqLworCQlpZiAobGNuID49IDApIHsKKwkJCS8qIFNldHVwIGJ1ZmZlciBoZWFkIHRvIHBvaW50IHRvIGNvcnJlY3QgYmxvY2suICovCisJCQliaC0+Yl9ibG9ja25yID0gKChsY24gPDwgdm9sLT5jbHVzdGVyX3NpemVfYml0cykgKworCQkJCQl2Y25fb2ZzKSA+PiBibG9ja3NpemVfYml0czsKKwkJCXNldF9idWZmZXJfbWFwcGVkKGJoKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIEl0IGlzIGEgaG9sZSwgbmVlZCB0byBpbnN0YW50aWF0ZSBpdC4gKi8KKwkJaWYgKGxjbiA9PSBMQ05fSE9MRSkgeworCQkJLy8gVE9ETzogSW5zdGFudGlhdGUgdGhlIGhvbGUuCisJCQkvLyBjbGVhcl9idWZmZXJfbmV3KGJoKTsKKwkJCS8vIHVubWFwX3VuZGVybHlpbmdfbWV0YWRhdGEoYmgtPmJfYmRldiwgYmgtPmJfYmxvY2tucik7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJXcml0aW5nIGludG8gc3BhcnNlIHJlZ2lvbnMgaXMgIgorCQkJCQkibm90IHN1cHBvcnRlZCB5ZXQuIFNvcnJ5LiIpOworCQkJZXJyID0gLUVPUE5PVFNVUFA7CisJCQlicmVhazsKKwkJfQorCQkvKiBJZiBmaXJzdCB0cnkgYW5kIHJ1bmxpc3QgdW5tYXBwZWQsIG1hcCBhbmQgcmV0cnkuICovCisJCWlmICghaXNfcmV0cnkgJiYgbGNuID09IExDTl9STF9OT1RfTUFQUEVEKSB7CisJCQlpc19yZXRyeSA9IFRSVUU7CisJCQkvKgorCQkJICogQXR0ZW1wdCB0byBtYXAgcnVubGlzdCwgZHJvcHBpbmcgbG9jayBmb3IKKwkJCSAqIHRoZSBkdXJhdGlvbi4KKwkJCSAqLworCQkJdXBfcmVhZCgmbmktPnJ1bmxpc3QubG9jayk7CisJCQllcnIgPSBudGZzX21hcF9ydW5saXN0KG5pLCB2Y24pOworCQkJaWYgKGxpa2VseSghZXJyKSkKKwkJCQlnb3RvIGxvY2tfcmV0cnlfcmVtYXA7CisJCQlybCA9IE5VTEw7CisJCQlsY24gPSBlcnI7CisJCX0KKwkJLyogRmFpbGVkIHRvIG1hcCB0aGUgYnVmZmVyLCBldmVuIGFmdGVyIHJldHJ5aW5nLiAqLworCQliaC0+Yl9ibG9ja25yID0gLTE7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byB3cml0ZSB0byBpbm9kZSAweCVseCwgIgorCQkJCSJhdHRyaWJ1dGUgdHlwZSAweCV4LCB2Y24gMHglbGx4LCBvZmZzZXQgMHgleCAiCisJCQkJImJlY2F1c2UgaXRzIGxvY2F0aW9uIG9uIGRpc2sgY291bGQgbm90IGJlICIKKwkJCQkiZGV0ZXJtaW5lZCVzIChlcnJvciBjb2RlICVsbGkpLiIsIG5pLT5tZnRfbm8sCisJCQkJbmktPnR5cGUsICh1bnNpZ25lZCBsb25nIGxvbmcpdmNuLAorCQkJCXZjbl9vZnMsIGlzX3JldHJ5ID8gIiBldmVuIGFmdGVyICIKKwkJCQkicmV0cnlpbmciIDogIiIsIChsb25nIGxvbmcpbGNuKTsKKwkJaWYgKCFlcnIpCisJCQllcnIgPSAtRUlPOworCQlicmVhazsKKwl9IHdoaWxlIChibG9jaysrLCAoYmggPSBiaC0+Yl90aGlzX3BhZ2UpICE9IGhlYWQpOworCisJLyogUmVsZWFzZSB0aGUgbG9jayBpZiB3ZSB0b29rIGl0LiAqLworCWlmIChybCkKKwkJdXBfcmVhZCgmbmktPnJ1bmxpc3QubG9jayk7CisKKwkvKiBGb3IgdGhlIGVycm9yIGNhc2UsIG5lZWQgdG8gcmVzZXQgYmggdG8gdGhlIGJlZ2lubmluZy4gKi8KKwliaCA9IGhlYWQ7CisKKwkvKiBKdXN0IGFuIG9wdGltaXphdGlvbiwgc28gLT5yZWFkcGFnZSgpIGlzbid0IGNhbGxlZCBsYXRlci4gKi8KKwlpZiAodW5saWtlbHkoIVBhZ2VVcHRvZGF0ZShwYWdlKSkpIHsKKwkJaW50IHVwdG9kYXRlID0gMTsKKwkJZG8geworCQkJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKSB7CisJCQkJdXB0b2RhdGUgPSAwOworCQkJCWJoID0gaGVhZDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSB3aGlsZSAoKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKKwkJaWYgKHVwdG9kYXRlKQorCQkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCX0KKworCS8qIFNldHVwIGFsbCBtYXBwZWQsIGRpcnR5IGJ1ZmZlcnMgZm9yIGFzeW5jIHdyaXRlIGkvby4gKi8KKwlkbyB7CisJCWdldF9iaChiaCk7CisJCWlmIChidWZmZXJfbWFwcGVkKGJoKSAmJiBidWZmZXJfZGlydHkoYmgpKSB7CisJCQlsb2NrX2J1ZmZlcihiaCk7CisJCQlpZiAodGVzdF9jbGVhcl9idWZmZXJfZGlydHkoYmgpKSB7CisJCQkJQlVHX09OKCFidWZmZXJfdXB0b2RhdGUoYmgpKTsKKwkJCQltYXJrX2J1ZmZlcl9hc3luY193cml0ZShiaCk7CisJCQl9IGVsc2UKKwkJCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJfSBlbHNlIGlmICh1bmxpa2VseShlcnIpKSB7CisJCQkvKgorCQkJICogRm9yIHRoZSBlcnJvciBjYXNlLiBUaGUgYnVmZmVyIG1heSBoYXZlIGJlZW4gc2V0CisJCQkgKiBkaXJ0eSBkdXJpbmcgYXR0YWNobWVudCB0byBhIGRpcnR5IHBhZ2UuCisJCQkgKi8KKwkJCWlmIChlcnIgIT0gLUVOT01FTSkKKwkJCQljbGVhcl9idWZmZXJfZGlydHkoYmgpOworCQl9CisJfSB3aGlsZSAoKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKKworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCS8vIFRPRE86IFJlbW92ZSB0aGUgLUVPUE5PVFNVUFAgY2hlY2sgbGF0ZXIgb24uLi4KKwkJaWYgKHVubGlrZWx5KGVyciA9PSAtRU9QTk9UU1VQUCkpCisJCQllcnIgPSAwOworCQllbHNlIGlmIChlcnIgPT0gLUVOT01FTSkgeworCQkJbnRmc193YXJuaW5nKHZvbC0+c2IsICJFcnJvciBhbGxvY2F0aW5nIG1lbW9yeS4gIgorCQkJCQkiUmVkaXJ0eWluZyBwYWdlIHNvIHdlIHRyeSBhZ2FpbiAiCisJCQkJCSJsYXRlci4iKTsKKwkJCS8qCisJCQkgKiBQdXQgdGhlIHBhZ2UgYmFjayBvbiBtYXBwaW5nLT5kaXJ0eV9wYWdlcywgYnV0CisJCQkgKiBsZWF2ZSBpdHMgYnVmZmVyJ3MgZGlydHkgc3RhdGUgYXMtaXMuCisJCQkgKi8KKwkJCXJlZGlydHlfcGFnZV9mb3Jfd3JpdGVwYWdlKHdiYywgcGFnZSk7CisJCQllcnIgPSAwOworCQl9IGVsc2UKKwkJCVNldFBhZ2VFcnJvcihwYWdlKTsKKwl9CisKKwlCVUdfT04oUGFnZVdyaXRlYmFjayhwYWdlKSk7CisJc2V0X3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwkvKiBLZWVwcyB0cnlfdG9fZnJlZV9idWZmZXJzKCkgYXdheS4gKi8KKwl1bmxvY2tfcGFnZShwYWdlKTsKKworCS8qCisJICogU3VibWl0IHRoZSBwcmVwYXJlZCBidWZmZXJzIGZvciBpL28uIE5vdGUgdGhlIHBhZ2UgaXMgdW5sb2NrZWQsCisJICogYW5kIHRoZSBhc3luYyB3cml0ZSBpL28gY29tcGxldGlvbiBoYW5kbGVyIGNhbiBlbmRfcGFnZV93cml0ZWJhY2soKQorCSAqIGF0IGFueSB0aW1lIGFmdGVyIHRoZSAqZmlyc3QqIHN1Ym1pdF9iaCgpLiBTbyB0aGUgYnVmZmVycyBjYW4gdGhlbgorCSAqIGRpc2FwcGVhci4uLgorCSAqLworCW5lZWRfZW5kX3dyaXRlYmFjayA9IFRSVUU7CisJZG8geworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5leHQgPSBiaC0+Yl90aGlzX3BhZ2U7CisJCWlmIChidWZmZXJfYXN5bmNfd3JpdGUoYmgpKSB7CisJCQlzdWJtaXRfYmgoV1JJVEUsIGJoKTsKKwkJCW5lZWRfZW5kX3dyaXRlYmFjayA9IEZBTFNFOworCQl9CisJCXB1dF9iaChiaCk7CisJCWJoID0gbmV4dDsKKwl9IHdoaWxlIChiaCAhPSBoZWFkKTsKKworCS8qIElmIG5vIGkvbyB3YXMgc3RhcnRlZCwgbmVlZCB0byBlbmRfcGFnZV93cml0ZWJhY2soKS4gKi8KKwlpZiAodW5saWtlbHkobmVlZF9lbmRfd3JpdGViYWNrKSkKKwkJZW5kX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIG50ZnNfd3JpdGVfbXN0X2Jsb2NrIC0gd3JpdGUgYSBAcGFnZSB0byB0aGUgYmFja2luZyBzdG9yZQorICogQHBhZ2U6CXBhZ2UgY2FjaGUgcGFnZSB0byB3cml0ZSBvdXQKKyAqIEB3YmM6CXdyaXRlYmFjayBjb250cm9sIHN0cnVjdHVyZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgZm9yIHdyaXRpbmcgcGFnZXMgYmVsb25naW5nIHRvIG5vbi1yZXNpZGVudCwgbXN0IHByb3RlY3RlZAorICogYXR0cmlidXRlcyB0byB0aGVpciBiYWNraW5nIHN0b3JlLiAgVGhlIG9ubHkgc3VwcG9ydGVkIGF0dHJpYnV0ZXMgYXJlIGluZGV4CisgKiBhbGxvY2F0aW9uIGFuZCAkTUZULyREQVRBLiAgQm90aCBkaXJlY3RvcnkgaW5vZGVzIGFuZCBpbmRleCBpbm9kZXMgYXJlCisgKiBzdXBwb3J0ZWQgZm9yIHRoZSBpbmRleCBhbGxvY2F0aW9uIGNhc2UuCisgKgorICogVGhlIHBhZ2UgbXVzdCByZW1haW4gbG9ja2VkIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHdyaXRlIGJlY2F1c2Ugd2UgYXBwbHkKKyAqIHRoZSBtc3QgZml4dXBzLCB3cml0ZSwgYW5kIHRoZW4gdW5kbyB0aGUgZml4dXBzLCBzbyBpZiB3ZSB3ZXJlIHRvIHVubG9jayB0aGUKKyAqIHBhZ2UgYmVmb3JlIHVuZG9pbmcgdGhlIGZpeHVwcywgYW55IG90aGVyIHVzZXIgb2YgdGhlIHBhZ2Ugd2lsbCBzZWUgdGhlCisgKiBwYWdlIGNvbnRlbnRzIGFzIGNvcnJ1cHQuCisgKgorICogV2UgY2xlYXIgdGhlIHBhZ2UgdXB0b2RhdGUgZmxhZyBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBmdW5jdGlvbiB0byBlbnN1cmUKKyAqIGV4Y2x1c2lvbiBmb3IgdGhlICRNRlQvJERBVEEgY2FzZSBhZ2FpbnN0IHNvbWVvbmUgbWFwcGluZyBhbiBtZnQgcmVjb3JkIHdlCisgKiBhcmUgYWJvdXQgdG8gYXBwbHkgdGhlIG1zdCBmaXh1cHMgdG8uCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLgorICoKKyAqIEJhc2VkIG9uIG50ZnNfd3JpdGVfYmxvY2soKSwgbnRmc19tZnRfd3JpdGVwYWdlKCksIGFuZAorICogd3JpdGVfbWZ0X3JlY29yZF9ub2xvY2soKS4KKyAqLworc3RhdGljIGludCBudGZzX3dyaXRlX21zdF9ibG9jayhzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7CisJc2VjdG9yX3QgYmxvY2ssIGRibG9jaywgcmVjX2Jsb2NrOworCXN0cnVjdCBpbm9kZSAqdmkgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCW50ZnNfaW5vZGUgKm5pID0gTlRGU19JKHZpKTsKKwludGZzX3ZvbHVtZSAqdm9sID0gbmktPnZvbDsKKwl1OCAqa2FkZHI7CisJdW5zaWduZWQgY2hhciBiaF9zaXplX2JpdHMgPSB2aS0+aV9ibGtiaXRzOworCXVuc2lnbmVkIGludCBiaF9zaXplID0gMSA8PCBiaF9zaXplX2JpdHM7CisJdW5zaWduZWQgaW50IHJlY19zaXplID0gbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemU7CisJbnRmc19pbm9kZSAqbG9ja2VkX25pc1tQQUdFX0NBQ0hFX1NJWkUgLyByZWNfc2l6ZV07CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKmhlYWQsICp0YmgsICpyZWNfc3RhcnRfYmg7CisJaW50IG1heF9iaHMgPSBQQUdFX0NBQ0hFX1NJWkUgLyBiaF9zaXplOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmhzW21heF9iaHNdOworCXJ1bmxpc3RfZWxlbWVudCAqcmw7CisJaW50IGksIG5yX2xvY2tlZF9uaXMsIG5yX3JlY3MsIG5yX2JocywgYmhzX3Blcl9yZWMsIGVyciwgZXJyMjsKKwl1bnNpZ25lZCByZWNfc2l6ZV9iaXRzOworCUJPT0wgc3luYywgaXNfbWZ0LCBwYWdlX2lzX2RpcnR5LCByZWNfaXNfZGlydHk7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3IgaW5vZGUgMHglbHgsIGF0dHJpYnV0ZSB0eXBlIDB4JXgsIHBhZ2UgaW5kZXggIgorCQkJIjB4JWx4LiIsIHZpLT5pX2lubywgbmktPnR5cGUsIHBhZ2UtPmluZGV4KTsKKwlCVUdfT04oIU5Jbm9Ob25SZXNpZGVudChuaSkpOworCUJVR19PTighTklub01zdFByb3RlY3RlZChuaSkpOworCWlzX21mdCA9IChTX0lTUkVHKHZpLT5pX21vZGUpICYmICF2aS0+aV9pbm8pOworCS8qCisJICogTk9URTogbnRmc193cml0ZV9tc3RfYmxvY2soKSB3b3VsZCBiZSBjYWxsZWQgZm9yICRNRlRNaXJyIGlmIGEgcGFnZQorCSAqIGluIGl0cyBwYWdlIGNhY2hlIHdlcmUgdG8gYmUgbWFya2VkIGRpcnR5LiAgSG93ZXZlciB0aGlzIHNob3VsZAorCSAqIG5ldmVyIGhhcHBlbiB3aXRoIHRoZSBjdXJyZW50IGRyaXZlciBhbmQgY29uc2lkZXJpbmcgd2UgZG8gbm90CisJICogaGFuZGxlIHRoaXMgY2FzZSBoZXJlIHdlIGRvIHdhbnQgdG8gQlVHKCksIGF0IGxlYXN0IGZvciBub3cuCisJICovCisJQlVHX09OKCEoaXNfbWZ0IHx8IFNfSVNESVIodmktPmlfbW9kZSkgfHwKKwkJCShOSW5vQXR0cihuaSkgJiYgbmktPnR5cGUgPT0gQVRfSU5ERVhfQUxMT0NBVElPTikpKTsKKwlCVUdfT04oIW1heF9iaHMpOworCisJLyogV2VyZSB3ZSBjYWxsZWQgZm9yIHN5bmMgcHVycG9zZXM/ICovCisJc3luYyA9ICh3YmMtPnN5bmNfbW9kZSA9PSBXQl9TWU5DX0FMTCk7CisKKwkvKiBNYWtlIHN1cmUgd2UgaGF2ZSBtYXBwZWQgYnVmZmVycy4gKi8KKwlCVUdfT04oIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpOworCWJoID0gaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwlCVUdfT04oIWJoKTsKKworCXJlY19zaXplX2JpdHMgPSBuaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZV9iaXRzOworCUJVR19PTighKFBBR0VfQ0FDSEVfU0laRSA+PiByZWNfc2l6ZV9iaXRzKSk7CisJYmhzX3Blcl9yZWMgPSByZWNfc2l6ZSA+PiBiaF9zaXplX2JpdHM7CisJQlVHX09OKCFiaHNfcGVyX3JlYyk7CisKKwkvKiBUaGUgZmlyc3QgYmxvY2sgaW4gdGhlIHBhZ2UuICovCisJcmVjX2Jsb2NrID0gYmxvY2sgPSAoc2VjdG9yX3QpcGFnZS0+aW5kZXggPDwKKwkJCShQQUdFX0NBQ0hFX1NISUZUIC0gYmhfc2l6ZV9iaXRzKTsKKworCS8qIFRoZSBmaXJzdCBvdXQgb2YgYm91bmRzIGJsb2NrIGZvciB0aGUgZGF0YSBzaXplLiAqLworCWRibG9jayA9ICh2aS0+aV9zaXplICsgYmhfc2l6ZSAtIDEpID4+IGJoX3NpemVfYml0czsKKworCXJsID0gTlVMTDsKKwllcnIgPSBlcnIyID0gbnJfYmhzID0gbnJfcmVjcyA9IG5yX2xvY2tlZF9uaXMgPSAwOworCXBhZ2VfaXNfZGlydHkgPSByZWNfaXNfZGlydHkgPSBGQUxTRTsKKwlyZWNfc3RhcnRfYmggPSBOVUxMOworCWRvIHsKKwkJQk9PTCBpc19yZXRyeSA9IEZBTFNFOworCisJCWlmIChsaWtlbHkoYmxvY2sgPCByZWNfYmxvY2spKSB7CisJCQlpZiAodW5saWtlbHkoYmxvY2sgPj0gZGJsb2NrKSkgeworCQkJCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKgorCQkJICogVGhpcyBibG9jayBpcyBub3QgdGhlIGZpcnN0IG9uZSBpbiB0aGUgcmVjb3JkLiAgV2UKKwkJCSAqIGlnbm9yZSB0aGUgYnVmZmVyJ3MgZGlydHkgc3RhdGUgYmVjYXVzZSB3ZSBjb3VsZAorCQkJICogaGF2ZSByYWNlZCB3aXRoIGEgcGFyYWxsZWwgbWFya19udGZzX3JlY29yZF9kaXJ0eSgpLgorCQkJICovCisJCQlpZiAoIXJlY19pc19kaXJ0eSkKKwkJCQljb250aW51ZTsKKwkJCWlmICh1bmxpa2VseShlcnIyKSkgeworCQkJCWlmIChlcnIyICE9IC1FTk9NRU0pCisJCQkJCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisJCQkJY29udGludWU7CisJCQl9CisJCX0gZWxzZSAvKiBpZiAoYmxvY2sgPT0gcmVjX2Jsb2NrKSAqLyB7CisJCQlCVUdfT04oYmxvY2sgPiByZWNfYmxvY2spOworCQkJLyogVGhpcyBibG9jayBpcyB0aGUgZmlyc3Qgb25lIGluIHRoZSByZWNvcmQuICovCisJCQlyZWNfYmxvY2sgKz0gYmhzX3Blcl9yZWM7CisJCQllcnIyID0gMDsKKwkJCWlmICh1bmxpa2VseShibG9jayA+PSBkYmxvY2spKSB7CisJCQkJY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghYnVmZmVyX2RpcnR5KGJoKSkgeworCQkJCS8qIENsZWFuIHJlY29yZHMgYXJlIG5vdCB3cml0dGVuIG91dC4gKi8KKwkJCQlyZWNfaXNfZGlydHkgPSBGQUxTRTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXJlY19pc19kaXJ0eSA9IFRSVUU7CisJCQlyZWNfc3RhcnRfYmggPSBiaDsKKwkJfQorCQkvKiBOZWVkIHRvIG1hcCB0aGUgYnVmZmVyIGlmIGl0IGlzIG5vdCBtYXBwZWQgYWxyZWFkeS4gKi8KKwkJaWYgKHVubGlrZWx5KCFidWZmZXJfbWFwcGVkKGJoKSkpIHsKKwkJCVZDTiB2Y247CisJCQlMQ04gbGNuOworCQkJdW5zaWduZWQgaW50IHZjbl9vZnM7CisKKwkJCS8qIE9idGFpbiB0aGUgdmNuIGFuZCBvZmZzZXQgb2YgdGhlIGN1cnJlbnQgYmxvY2suICovCisJCQl2Y24gPSAoVkNOKWJsb2NrIDw8IGJoX3NpemVfYml0czsKKwkJCXZjbl9vZnMgPSB2Y24gJiB2b2wtPmNsdXN0ZXJfc2l6ZV9tYXNrOworCQkJdmNuID4+PSB2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzOworCQkJaWYgKCFybCkgeworbG9ja19yZXRyeV9yZW1hcDoKKwkJCQlkb3duX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCQkJCXJsID0gbmktPnJ1bmxpc3Qucmw7CisJCQl9CisJCQlpZiAobGlrZWx5KHJsICE9IE5VTEwpKSB7CisJCQkJLyogU2VlayB0byBlbGVtZW50IGNvbnRhaW5pbmcgdGFyZ2V0IHZjbi4gKi8KKwkJCQl3aGlsZSAocmwtPmxlbmd0aCAmJiBybFsxXS52Y24gPD0gdmNuKQorCQkJCQlybCsrOworCQkJCWxjbiA9IG50ZnNfcmxfdmNuX3RvX2xjbihybCwgdmNuKTsKKwkJCX0gZWxzZQorCQkJCWxjbiA9IExDTl9STF9OT1RfTUFQUEVEOworCQkJLyogU3VjY2Vzc2Z1bCByZW1hcC4gKi8KKwkJCWlmIChsaWtlbHkobGNuID49IDApKSB7CisJCQkJLyogU2V0dXAgYnVmZmVyIGhlYWQgdG8gY29ycmVjdCBibG9jay4gKi8KKwkJCQliaC0+Yl9ibG9ja25yID0gKChsY24gPDwKKwkJCQkJCXZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMpICsKKwkJCQkJCXZjbl9vZnMpID4+IGJoX3NpemVfYml0czsKKwkJCQlzZXRfYnVmZmVyX21hcHBlZChiaCk7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogUmVtYXAgZmFpbGVkLiAgUmV0cnkgdG8gbWFwIHRoZSBydW5saXN0IG9uY2UKKwkJCQkgKiB1bmxlc3Mgd2UgYXJlIHdvcmtpbmcgb24gJE1GVCB3aGljaCBhbHdheXMKKwkJCQkgKiBoYXMgdGhlIHdob2xlIG9mIGl0cyBydW5saXN0IGluIG1lbW9yeS4KKwkJCQkgKi8KKwkJCQlpZiAoIWlzX21mdCAmJiAhaXNfcmV0cnkgJiYKKwkJCQkJCWxjbiA9PSBMQ05fUkxfTk9UX01BUFBFRCkgeworCQkJCQlpc19yZXRyeSA9IFRSVUU7CisJCQkJCS8qCisJCQkJCSAqIEF0dGVtcHQgdG8gbWFwIHJ1bmxpc3QsIGRyb3BwaW5nCisJCQkJCSAqIGxvY2sgZm9yIHRoZSBkdXJhdGlvbi4KKwkJCQkJICovCisJCQkJCXVwX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCQkJCQllcnIyID0gbnRmc19tYXBfcnVubGlzdChuaSwgdmNuKTsKKwkJCQkJaWYgKGxpa2VseSghZXJyMikpCisJCQkJCQlnb3RvIGxvY2tfcmV0cnlfcmVtYXA7CisJCQkJCWlmIChlcnIyID09IC1FTk9NRU0pCisJCQkJCQlwYWdlX2lzX2RpcnR5ID0gVFJVRTsKKwkJCQkJbGNuID0gZXJyMjsKKwkJCQl9IGVsc2UKKwkJCQkJZXJyMiA9IC1FSU87CisJCQkJLyogSGFyZCBlcnJvci4gIEFib3J0IHdyaXRpbmcgdGhpcyByZWNvcmQuICovCisJCQkJaWYgKCFlcnIgfHwgZXJyID09IC1FTk9NRU0pCisJCQkJCWVyciA9IGVycjI7CisJCQkJYmgtPmJfYmxvY2tuciA9IC0xOworCQkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkNhbm5vdCB3cml0ZSBudGZzIHJlY29yZCAiCisJCQkJCQkiMHglbGx4IChpbm9kZSAweCVseCwgIgorCQkJCQkJImF0dHJpYnV0ZSB0eXBlIDB4JXgpIGJlY2F1c2UgIgorCQkJCQkJIml0cyBsb2NhdGlvbiBvbiBkaXNrIGNvdWxkICIKKwkJCQkJCSJub3QgYmUgZGV0ZXJtaW5lZCAoZXJyb3IgIgorCQkJCQkJImNvZGUgJWxsaSkuIiwgKHM2NClibG9jayA8PAorCQkJCQkJYmhfc2l6ZV9iaXRzID4+CisJCQkJCQl2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzLAorCQkJCQkJbmktPm1mdF9ubywgbmktPnR5cGUsCisJCQkJCQkobG9uZyBsb25nKWxjbik7CisJCQkJLyoKKwkJCQkgKiBJZiB0aGlzIGlzIG5vdCB0aGUgZmlyc3QgYnVmZmVyLCByZW1vdmUgdGhlCisJCQkJICogYnVmZmVycyBpbiB0aGlzIHJlY29yZCBmcm9tIHRoZSBsaXN0IG9mCisJCQkJICogYnVmZmVycyB0byB3cml0ZSBhbmQgY2xlYXIgdGhlaXIgZGlydHkgYml0CisJCQkJICogaWYgbm90IGVycm9yIC1FTk9NRU0uCisJCQkJICovCisJCQkJaWYgKHJlY19zdGFydF9iaCAhPSBiaCkgeworCQkJCQl3aGlsZSAoYmhzWy0tbnJfYmhzXSAhPSByZWNfc3RhcnRfYmgpCisJCQkJCQk7CisJCQkJCWlmIChlcnIyICE9IC1FTk9NRU0pIHsKKwkJCQkJCWRvIHsKKwkJCQkJCQljbGVhcl9idWZmZXJfZGlydHkoCisJCQkJCQkJCXJlY19zdGFydF9iaCk7CisJCQkJCQl9IHdoaWxlICgocmVjX3N0YXJ0X2JoID0KKwkJCQkJCQkJcmVjX3N0YXJ0X2JoLT4KKwkJCQkJCQkJYl90aGlzX3BhZ2UpICE9CisJCQkJCQkJCWJoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQlCVUdfT04oIWJ1ZmZlcl91cHRvZGF0ZShiaCkpOworCQlCVUdfT04obnJfYmhzID49IG1heF9iaHMpOworCQliaHNbbnJfYmhzKytdID0gYmg7CisJfSB3aGlsZSAoYmxvY2srKywgKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKKwlpZiAodW5saWtlbHkocmwpKQorCQl1cF9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKKwkvKiBJZiB0aGVyZSB3ZXJlIG5vIGRpcnR5IGJ1ZmZlcnMsIHdlIGFyZSBkb25lLiAqLworCWlmICghbnJfYmhzKQorCQlnb3RvIGRvbmU7CisJLyogTWFwIHRoZSBwYWdlIHNvIHdlIGNhbiBhY2Nlc3MgaXRzIGNvbnRlbnRzLiAqLworCWthZGRyID0ga21hcChwYWdlKTsKKwkvKiBDbGVhciB0aGUgcGFnZSB1cHRvZGF0ZSBmbGFnIHdoaWxzdCB0aGUgbXN0IGZpeHVwcyBhcmUgYXBwbGllZC4gKi8KKwlCVUdfT04oIVBhZ2VVcHRvZGF0ZShwYWdlKSk7CisJQ2xlYXJQYWdlVXB0b2RhdGUocGFnZSk7CisJZm9yIChpID0gMDsgaSA8IG5yX2JoczsgaSsrKSB7CisJCXVuc2lnbmVkIGludCBvZnM7CisKKwkJLyogU2tpcCBidWZmZXJzIHdoaWNoIGFyZSBub3QgYXQgdGhlIGJlZ2lubmluZyBvZiByZWNvcmRzLiAqLworCQlpZiAoaSAlIGJoc19wZXJfcmVjKQorCQkJY29udGludWU7CisJCXRiaCA9IGJoc1tpXTsKKwkJb2ZzID0gYmhfb2Zmc2V0KHRiaCk7CisJCWlmIChpc19tZnQpIHsKKwkJCW50ZnNfaW5vZGUgKnRuaTsKKwkJCXVuc2lnbmVkIGxvbmcgbWZ0X25vOworCisJCQkvKiBHZXQgdGhlIG1mdCByZWNvcmQgbnVtYmVyLiAqLworCQkJbWZ0X25vID0gKCgoczY0KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpICsgb2ZzKQorCQkJCQk+PiByZWNfc2l6ZV9iaXRzOworCQkJLyogQ2hlY2sgd2hldGhlciB0byB3cml0ZSB0aGlzIG1mdCByZWNvcmQuICovCisJCQl0bmkgPSBOVUxMOworCQkJaWYgKCFudGZzX21heV93cml0ZV9tZnRfcmVjb3JkKHZvbCwgbWZ0X25vLAorCQkJCQkoTUZUX1JFQ09SRCopKGthZGRyICsgb2ZzKSwgJnRuaSkpIHsKKwkJCQkvKgorCQkJCSAqIFRoZSByZWNvcmQgc2hvdWxkIG5vdCBiZSB3cml0dGVuLiAgVGhpcworCQkJCSAqIG1lYW5zIHdlIG5lZWQgdG8gcmVkaXJ0eSB0aGUgcGFnZSBiZWZvcmUKKwkJCQkgKiByZXR1cm5pbmcuCisJCQkJICovCisJCQkJcGFnZV9pc19kaXJ0eSA9IFRSVUU7CisJCQkJLyoKKwkJCQkgKiBSZW1vdmUgdGhlIGJ1ZmZlcnMgaW4gdGhpcyBtZnQgcmVjb3JkIGZyb20KKwkJCQkgKiB0aGUgbGlzdCBvZiBidWZmZXJzIHRvIHdyaXRlLgorCQkJCSAqLworCQkJCWRvIHsKKwkJCQkJYmhzW2ldID0gTlVMTDsKKwkJCQl9IHdoaWxlICgrK2kgJSBiaHNfcGVyX3JlYyk7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKgorCQkJICogVGhlIHJlY29yZCBzaG91bGQgYmUgd3JpdHRlbi4gIElmIGEgbG9ja2VkIG50ZnMKKwkJCSAqIGlub2RlIHdhcyByZXR1cm5lZCwgYWRkIGl0IHRvIHRoZSBhcnJheSBvZiBsb2NrZWQKKwkJCSAqIG50ZnMgaW5vZGVzLgorCQkJICovCisJCQlpZiAodG5pKQorCQkJCWxvY2tlZF9uaXNbbnJfbG9ja2VkX25pcysrXSA9IHRuaTsKKwkJfQorCQkvKiBBcHBseSB0aGUgbXN0IHByb3RlY3Rpb24gZml4dXBzLiAqLworCQllcnIyID0gcHJlX3dyaXRlX21zdF9maXh1cCgoTlRGU19SRUNPUkQqKShrYWRkciArIG9mcyksCisJCQkJcmVjX3NpemUpOworCQlpZiAodW5saWtlbHkoZXJyMikpIHsKKwkJCWlmICghZXJyIHx8IGVyciA9PSAtRU5PTUVNKQorCQkJCWVyciA9IC1FSU87CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gYXBwbHkgbXN0IGZpeHVwcyAiCisJCQkJCSIoaW5vZGUgMHglbHgsIGF0dHJpYnV0ZSB0eXBlIDB4JXgsICIKKwkJCQkJInBhZ2UgaW5kZXggMHglbHgsIHBhZ2Ugb2Zmc2V0IDB4JXgpISIKKwkJCQkJIiAgVW5tb3VudCBhbmQgcnVuIGNoa2Rzay4iLCB2aS0+aV9pbm8sCisJCQkJCW5pLT50eXBlLCBwYWdlLT5pbmRleCwgb2ZzKTsKKwkJCS8qCisJCQkgKiBNYXJrIGFsbCB0aGUgYnVmZmVycyBpbiB0aGlzIHJlY29yZCBjbGVhbiBhcyB3ZSBkbworCQkJICogbm90IHdhbnQgdG8gd3JpdGUgY29ycnVwdCBkYXRhIHRvIGRpc2suCisJCQkgKi8KKwkJCWRvIHsKKwkJCQljbGVhcl9idWZmZXJfZGlydHkoYmhzW2ldKTsKKwkJCQliaHNbaV0gPSBOVUxMOworCQkJfSB3aGlsZSAoKytpICUgYmhzX3Blcl9yZWMpOworCQkJY29udGludWU7CisJCX0KKwkJbnJfcmVjcysrOworCX0KKwkvKiBJZiBubyByZWNvcmRzIGFyZSB0byBiZSB3cml0dGVuIG91dCwgd2UgYXJlIGRvbmUuICovCisJaWYgKCFucl9yZWNzKQorCQlnb3RvIHVubV9kb25lOworCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCS8qIExvY2sgYnVmZmVycyBhbmQgc3RhcnQgc3luY2hyb25vdXMgd3JpdGUgaS9vIG9uIHRoZW0uICovCisJZm9yIChpID0gMDsgaSA8IG5yX2JoczsgaSsrKSB7CisJCXRiaCA9IGJoc1tpXTsKKwkJaWYgKCF0YmgpCisJCQljb250aW51ZTsKKwkJaWYgKHVubGlrZWx5KHRlc3Rfc2V0X2J1ZmZlcl9sb2NrZWQodGJoKSkpCisJCQlCVUcoKTsKKwkJLyogVGhlIGJ1ZmZlciBkaXJ0eSBzdGF0ZSBpcyBub3cgaXJyZWxldmFudCwganVzdCBjbGVhbiBpdC4gKi8KKwkJY2xlYXJfYnVmZmVyX2RpcnR5KHRiaCk7CisJCUJVR19PTighYnVmZmVyX3VwdG9kYXRlKHRiaCkpOworCQlCVUdfT04oIWJ1ZmZlcl9tYXBwZWQodGJoKSk7CisJCWdldF9iaCh0YmgpOworCQl0YmgtPmJfZW5kX2lvID0gZW5kX2J1ZmZlcl93cml0ZV9zeW5jOworCQlzdWJtaXRfYmgoV1JJVEUsIHRiaCk7CisJfQorCS8qIFN5bmNocm9uaXplIHRoZSBtZnQgbWlycm9yIG5vdyBpZiBub3QgQHN5bmMuICovCisJaWYgKGlzX21mdCAmJiAhc3luYykKKwkJZ290byBkb19taXJyb3I7Citkb193YWl0OgorCS8qIFdhaXQgb24gaS9vIGNvbXBsZXRpb24gb2YgYnVmZmVycy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnJfYmhzOyBpKyspIHsKKwkJdGJoID0gYmhzW2ldOworCQlpZiAoIXRiaCkKKwkJCWNvbnRpbnVlOworCQl3YWl0X29uX2J1ZmZlcih0YmgpOworCQlpZiAodW5saWtlbHkoIWJ1ZmZlcl91cHRvZGF0ZSh0YmgpKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiSS9PIGVycm9yIHdoaWxlIHdyaXRpbmcgbnRmcyAiCisJCQkJCSJyZWNvcmQgYnVmZmVyIChpbm9kZSAweCVseCwgIgorCQkJCQkiYXR0cmlidXRlIHR5cGUgMHgleCwgcGFnZSBpbmRleCAiCisJCQkJCSIweCVseCwgcGFnZSBvZmZzZXQgMHglbHgpISAgVW5tb3VudCAiCisJCQkJCSJhbmQgcnVuIGNoa2Rzay4iLCB2aS0+aV9pbm8sIG5pLT50eXBlLAorCQkJCQlwYWdlLT5pbmRleCwgYmhfb2Zmc2V0KHRiaCkpOworCQkJaWYgKCFlcnIgfHwgZXJyID09IC1FTk9NRU0pCisJCQkJZXJyID0gLUVJTzsKKwkJCS8qCisJCQkgKiBTZXQgdGhlIGJ1ZmZlciB1cHRvZGF0ZSBzbyB0aGUgcGFnZSBhbmQgYnVmZmVyCisJCQkgKiBzdGF0ZXMgZG8gbm90IGJlY29tZSBvdXQgb2Ygc3luYy4KKwkJCSAqLworCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZSh0YmgpOworCQl9CisJfQorCS8qIElmIEBzeW5jLCBub3cgc3luY2hyb25pemUgdGhlIG1mdCBtaXJyb3IuICovCisJaWYgKGlzX21mdCAmJiBzeW5jKSB7Citkb19taXJyb3I6CisJCWZvciAoaSA9IDA7IGkgPCBucl9iaHM7IGkrKykgeworCQkJdW5zaWduZWQgbG9uZyBtZnRfbm87CisJCQl1bnNpZ25lZCBpbnQgb2ZzOworCisJCQkvKgorCQkJICogU2tpcCBidWZmZXJzIHdoaWNoIGFyZSBub3QgYXQgdGhlIGJlZ2lubmluZyBvZgorCQkJICogcmVjb3Jkcy4KKwkJCSAqLworCQkJaWYgKGkgJSBiaHNfcGVyX3JlYykKKwkJCQljb250aW51ZTsKKwkJCXRiaCA9IGJoc1tpXTsKKwkJCS8qIFNraXAgcmVtb3ZlZCBidWZmZXJzIChhbmQgaGVuY2UgcmVjb3JkcykuICovCisJCQlpZiAoIXRiaCkKKwkJCQljb250aW51ZTsKKwkJCW9mcyA9IGJoX29mZnNldCh0YmgpOworCQkJLyogR2V0IHRoZSBtZnQgcmVjb3JkIG51bWJlci4gKi8KKwkJCW1mdF9ubyA9ICgoKHM2NClwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKSArIG9mcykKKwkJCQkJPj4gcmVjX3NpemVfYml0czsKKwkJCWlmIChtZnRfbm8gPCB2b2wtPm1mdG1pcnJfc2l6ZSkKKwkJCQludGZzX3N5bmNfbWZ0X21pcnJvcih2b2wsIG1mdF9ubywKKwkJCQkJCShNRlRfUkVDT1JEKikoa2FkZHIgKyBvZnMpLAorCQkJCQkJc3luYyk7CisJCX0KKwkJaWYgKCFzeW5jKQorCQkJZ290byBkb193YWl0OworCX0KKwkvKiBSZW1vdmUgdGhlIG1zdCBwcm90ZWN0aW9uIGZpeHVwcyBhZ2Fpbi4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnJfYmhzOyBpKyspIHsKKwkJaWYgKCEoaSAlIGJoc19wZXJfcmVjKSkgeworCQkJdGJoID0gYmhzW2ldOworCQkJaWYgKCF0YmgpCisJCQkJY29udGludWU7CisJCQlwb3N0X3dyaXRlX21zdF9maXh1cCgoTlRGU19SRUNPUkQqKShrYWRkciArCisJCQkJCWJoX29mZnNldCh0YmgpKSk7CisJCX0KKwl9CisJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7Cit1bm1fZG9uZToKKwkvKiBVbmxvY2sgYW55IGxvY2tlZCBpbm9kZXMuICovCisJd2hpbGUgKG5yX2xvY2tlZF9uaXMtLSA+IDApIHsKKwkJbnRmc19pbm9kZSAqdG5pLCAqYmFzZV90bmk7CisJCQorCQl0bmkgPSBsb2NrZWRfbmlzW25yX2xvY2tlZF9uaXNdOworCQkvKiBHZXQgdGhlIGJhc2UgaW5vZGUuICovCisJCWRvd24oJnRuaS0+ZXh0ZW50X2xvY2spOworCQlpZiAodG5pLT5ucl9leHRlbnRzID49IDApCisJCQliYXNlX3RuaSA9IHRuaTsKKwkJZWxzZSB7CisJCQliYXNlX3RuaSA9IHRuaS0+ZXh0LmJhc2VfbnRmc19pbm87CisJCQlCVUdfT04oIWJhc2VfdG5pKTsKKwkJfQorCQl1cCgmdG5pLT5leHRlbnRfbG9jayk7CisJCW50ZnNfZGVidWcoIlVubG9ja2luZyAlcyBpbm9kZSAweCVseC4iLAorCQkJCXRuaSA9PSBiYXNlX3RuaSA/ICJiYXNlIiA6ICJleHRlbnQiLAorCQkJCXRuaS0+bWZ0X25vKTsKKwkJdXAoJnRuaS0+bXJlY19sb2NrKTsKKwkJYXRvbWljX2RlYygmdG5pLT5jb3VudCk7CisJCWlwdXQoVkZTX0koYmFzZV90bmkpKTsKKwl9CisJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCWt1bm1hcChwYWdlKTsKK2RvbmU6CisJaWYgKHVubGlrZWx5KGVyciAmJiBlcnIgIT0gLUVOT01FTSkpIHsKKwkJLyoKKwkJICogU2V0IHBhZ2UgZXJyb3IgaWYgdGhlcmUgaXMgb25seSBvbmUgbnRmcyByZWNvcmQgaW4gdGhlIHBhZ2UuCisJCSAqIE90aGVyd2lzZSB3ZSB3b3VsZCBsb29zZSBwZXItcmVjb3JkIGdyYW51bGFyaXR5LgorCQkgKi8KKwkJaWYgKG5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplID09IFBBR0VfQ0FDSEVfU0laRSkKKwkJCVNldFBhZ2VFcnJvcihwYWdlKTsKKwkJTlZvbFNldEVycm9ycyh2b2wpOworCX0KKwlpZiAocGFnZV9pc19kaXJ0eSkgeworCQludGZzX2RlYnVnKCJQYWdlIHN0aWxsIGNvbnRhaW5zIG9uZSBvciBtb3JlIGRpcnR5IG50ZnMgIgorCQkJCSJyZWNvcmRzLiAgUmVkaXJ0eWluZyB0aGUgcGFnZSBzdGFydGluZyBhdCAiCisJCQkJInJlY29yZCAweCVseC4iLCBwYWdlLT5pbmRleCA8PAorCQkJCShQQUdFX0NBQ0hFX1NISUZUIC0gcmVjX3NpemVfYml0cykpOworCQlyZWRpcnR5X3BhZ2VfZm9yX3dyaXRlcGFnZSh3YmMsIHBhZ2UpOworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBLZWVwIHRoZSBWTSBoYXBweS4gIFRoaXMgbXVzdCBiZSBkb25lIG90aGVyd2lzZSB0aGUKKwkJICogcmFkaXgtdHJlZSB0YWcgUEFHRUNBQ0hFX1RBR19ESVJUWSByZW1haW5zIHNldCBldmVuIHRob3VnaAorCQkgKiB0aGUgcGFnZSBpcyBjbGVhbi4KKwkJICovCisJCUJVR19PTihQYWdlV3JpdGViYWNrKHBhZ2UpKTsKKwkJc2V0X3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJZW5kX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCX0KKwlpZiAobGlrZWx5KCFlcnIpKQorCQludGZzX2RlYnVnKCJEb25lLiIpOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogbnRmc193cml0ZXBhZ2UgLSB3cml0ZSBhIEBwYWdlIHRvIHRoZSBiYWNraW5nIHN0b3JlCisgKiBAcGFnZToJcGFnZSBjYWNoZSBwYWdlIHRvIHdyaXRlIG91dAorICogQHdiYzoJd3JpdGViYWNrIGNvbnRyb2wgc3RydWN0dXJlCisgKgorICogVGhpcyBpcyBjYWxsZWQgZnJvbSB0aGUgVk0gd2hlbiBpdCB3YW50cyB0byBoYXZlIGEgZGlydHkgbnRmcyBwYWdlIGNhY2hlCisgKiBwYWdlIGNsZWFuZWQuICBUaGUgVk0gaGFzIGFscmVhZHkgbG9ja2VkIHRoZSBwYWdlIGFuZCBtYXJrZWQgaXQgY2xlYW4uCisgKgorICogRm9yIG5vbi1yZXNpZGVudCBhdHRyaWJ1dGVzLCBudGZzX3dyaXRlcGFnZSgpIHdyaXRlcyB0aGUgQHBhZ2UgYnkgY2FsbGluZworICogdGhlIG50ZnMgdmVyc2lvbiBvZiB0aGUgZ2VuZXJpYyBibG9ja193cml0ZV9mdWxsX3BhZ2UoKSBmdW5jdGlvbiwKKyAqIG50ZnNfd3JpdGVfYmxvY2soKSwgd2hpY2ggaW4gdHVybiBpZiBuZWNlc3NhcnkgY3JlYXRlcyBhbmQgd3JpdGVzIHRoZQorICogYnVmZmVycyBhc3NvY2lhdGVkIHdpdGggdGhlIHBhZ2UgYXN5bmNocm9ub3VzbHkuCisgKgorICogRm9yIHJlc2lkZW50IGF0dHJpYnV0ZXMsIE9UT0gsIG50ZnNfd3JpdGVwYWdlKCkgd3JpdGVzIHRoZSBAcGFnZSBieSBjb3B5aW5nCisgKiB0aGUgZGF0YSB0byB0aGUgbWZ0IHJlY29yZCAod2hpY2ggYXQgdGhpcyBzdGFnZSBpcyBtb3N0IGxpa2VseSBpbiBtZW1vcnkpLgorICogVGhlIG1mdCByZWNvcmQgaXMgdGhlbiBtYXJrZWQgZGlydHkgYW5kIHdyaXR0ZW4gb3V0IGFzeW5jaHJvbm91c2x5IHZpYSB0aGUKKyAqIHZmcyBpbm9kZSBkaXJ0eSBjb2RlIHBhdGggZm9yIHRoZSBpbm9kZSB0aGUgbWZ0IHJlY29yZCBiZWxvbmdzIHRvIG9yIHZpYSB0aGUKKyAqIHZtIHBhZ2UgZGlydHkgY29kZSBwYXRoIGZvciB0aGUgcGFnZSB0aGUgbWZ0IHJlY29yZCBpcyBpbi4KKyAqCisgKiBCYXNlZCBvbiBudGZzX3JlYWRwYWdlKCkgYW5kIGZzL2J1ZmZlci5jOjpibG9ja193cml0ZV9mdWxsX3BhZ2UoKS4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgbnRmc193cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQoreworCWxvZmZfdCBpX3NpemU7CisJc3RydWN0IGlub2RlICp2aTsKKwludGZzX2lub2RlICpuaSwgKmJhc2Vfbmk7CisJY2hhciAqa2FkZHI7CisJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eDsKKwlNRlRfUkVDT1JEICptOworCXUzMiBhdHRyX2xlbjsKKwlpbnQgZXJyOworCisJQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKKworCXZpID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlpX3NpemUgPSBpX3NpemVfcmVhZCh2aSk7CisKKwkvKiBJcyB0aGUgcGFnZSBmdWxseSBvdXRzaWRlIGlfc2l6ZT8gKHRydW5jYXRlIGluIHByb2dyZXNzKSAqLworCWlmICh1bmxpa2VseShwYWdlLT5pbmRleCA+PSAoaV9zaXplICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4KKwkJCVBBR0VfQ0FDSEVfU0hJRlQpKSB7CisJCS8qCisJCSAqIFRoZSBwYWdlIG1heSBoYXZlIGRpcnR5LCB1bm1hcHBlZCBidWZmZXJzLiAgTWFrZSB0aGVtCisJCSAqIGZyZWVhYmxlIGhlcmUsIHNvIHRoZSBwYWdlIGRvZXMgbm90IGxlYWsuCisJCSAqLworCQlibG9ja19pbnZhbGlkYXRlcGFnZShwYWdlLCAwKTsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCW50ZnNfZGVidWcoIldyaXRlIG91dHNpZGUgaV9zaXplIC0gdHJ1bmNhdGVkPyIpOworCQlyZXR1cm4gMDsKKwl9CisJbmkgPSBOVEZTX0kodmkpOworCisJLyogTklub05vblJlc2lkZW50KCkgPT0gTklub0luZGV4QWxsb2NQcmVzZW50KCkgKi8KKwlpZiAoTklub05vblJlc2lkZW50KG5pKSkgeworCQkvKgorCQkgKiBPbmx5IHVubmFtZWQgJERBVEEgYXR0cmlidXRlcyBjYW4gYmUgY29tcHJlc3NlZCwgZW5jcnlwdGVkLAorCQkgKiBhbmQvb3Igc3BhcnNlLgorCQkgKi8KKwkJaWYgKG5pLT50eXBlID09IEFUX0RBVEEgJiYgIW5pLT5uYW1lX2xlbikgeworCQkJLyogSWYgZmlsZSBpcyBlbmNyeXB0ZWQsIGRlbnkgYWNjZXNzLCBqdXN0IGxpa2UgTlQ0LiAqLworCQkJaWYgKE5Jbm9FbmNyeXB0ZWQobmkpKSB7CisJCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQkJbnRmc19kZWJ1ZygiRGVueWluZyB3cml0ZSBhY2Nlc3MgdG8gZW5jcnlwdGVkICIKKwkJCQkJCSJmaWxlLiIpOworCQkJCXJldHVybiAtRUFDQ0VTOworCQkJfQorCQkJLyogQ29tcHJlc3NlZCBkYXRhIHN0cmVhbXMgYXJlIGhhbmRsZWQgaW4gY29tcHJlc3MuYy4gKi8KKwkJCWlmIChOSW5vQ29tcHJlc3NlZChuaSkpIHsKKwkJCQkvLyBUT0RPOiBJbXBsZW1lbnQgYW5kIHJlcGxhY2UgdGhpcyBjaGVjayB3aXRoCisJCQkJLy8gcmV0dXJuIG50ZnNfd3JpdGVfY29tcHJlc3NlZF9ibG9jayhwYWdlKTsKKwkJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiV3JpdGluZyB0byBjb21wcmVzc2VkICIKKwkJCQkJCSJmaWxlcyBpcyBub3Qgc3VwcG9ydGVkIHlldC4gIgorCQkJCQkJIlNvcnJ5LiIpOworCQkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJCX0KKwkJCS8vIFRPRE86IEltcGxlbWVudCBhbmQgcmVtb3ZlIHRoaXMgY2hlY2suCisJCQlpZiAoTklub1NwYXJzZShuaSkpIHsKKwkJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiV3JpdGluZyB0byBzcGFyc2UgZmlsZXMgIgorCQkJCQkJImlzIG5vdCBzdXBwb3J0ZWQgeWV0LiBTb3JyeS4iKTsKKwkJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCQl9CisJCX0KKwkJLyogV2UgaGF2ZSB0byB6ZXJvIGV2ZXJ5IHRpbWUgZHVlIHRvIG1tYXAtYXQtZW5kLW9mLWZpbGUuICovCisJCWlmIChwYWdlLT5pbmRleCA+PSAoaV9zaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQpKSB7CisJCQkvKiBUaGUgcGFnZSBzdHJhZGRsZXMgaV9zaXplLiAqLworCQkJdW5zaWduZWQgaW50IG9mcyA9IGlfc2l6ZSAmIH5QQUdFX0NBQ0hFX01BU0s7CisJCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkJCW1lbXNldChrYWRkciArIG9mcywgMCwgUEFHRV9DQUNIRV9TSVpFIC0gb2ZzKTsKKwkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCQl9CisJCS8qIEhhbmRsZSBtc3QgcHJvdGVjdGVkIGF0dHJpYnV0ZXMuICovCisJCWlmIChOSW5vTXN0UHJvdGVjdGVkKG5pKSkKKwkJCXJldHVybiBudGZzX3dyaXRlX21zdF9ibG9jayhwYWdlLCB3YmMpOworCQkvKiBOb3JtYWwgZGF0YSBzdHJlYW0uICovCisJCXJldHVybiBudGZzX3dyaXRlX2Jsb2NrKHBhZ2UsIHdiYyk7CisJfQorCS8qCisJICogQXR0cmlidXRlIGlzIHJlc2lkZW50LCBpbXBseWluZyBpdCBpcyBub3QgY29tcHJlc3NlZCwgZW5jcnlwdGVkLAorCSAqIHNwYXJzZSwgb3IgbXN0IHByb3RlY3RlZC4gIFRoaXMgYWxzbyBtZWFucyB0aGUgYXR0cmlidXRlIGlzIHNtYWxsZXIKKwkgKiB0aGFuIGFuIG1mdCByZWNvcmQgYW5kIGhlbmNlIHNtYWxsZXIgdGhhbiBhIHBhZ2UsIHNvIGNhbiBzaW1wbHkKKwkgKiByZXR1cm4gZXJyb3Igb24gYW55IHBhZ2VzIHdpdGggaW5kZXggYWJvdmUgMC4KKwkgKi8KKwlCVUdfT04ocGFnZV9oYXNfYnVmZmVycyhwYWdlKSk7CisJQlVHX09OKCFQYWdlVXB0b2RhdGUocGFnZSkpOworCWlmICh1bmxpa2VseShwYWdlLT5pbmRleCA+IDApKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICJCVUcoKSEgcGFnZS0+aW5kZXggKDB4JWx4KSA+IDAuICAiCisJCQkJIkFib3J0aW5nIHdyaXRlLiIsIHBhZ2UtPmluZGV4KTsKKwkJQlVHX09OKFBhZ2VXcml0ZWJhY2socGFnZSkpOworCQlzZXRfcGFnZV93cml0ZWJhY2socGFnZSk7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQllbmRfcGFnZV93cml0ZWJhY2socGFnZSk7CisJCXJldHVybiAtRUlPOworCX0KKwlpZiAoIU5Jbm9BdHRyKG5pKSkKKwkJYmFzZV9uaSA9IG5pOworCWVsc2UKKwkJYmFzZV9uaSA9IG5pLT5leHQuYmFzZV9udGZzX2lubzsKKwkvKiBNYXAsIHBpbiwgYW5kIGxvY2sgdGhlIG1mdCByZWNvcmQuICovCisJbSA9IG1hcF9tZnRfcmVjb3JkKGJhc2VfbmkpOworCWlmIChJU19FUlIobSkpIHsKKwkJZXJyID0gUFRSX0VSUihtKTsKKwkJbSA9IE5VTEw7CisJCWN0eCA9IE5VTEw7CisJCWdvdG8gZXJyX291dDsKKwl9CisJY3R4ID0gbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4KGJhc2VfbmksIG0pOworCWlmICh1bmxpa2VseSghY3R4KSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWVyciA9IG50ZnNfYXR0cl9sb29rdXAobmktPnR5cGUsIG5pLT5uYW1lLCBuaS0+bmFtZV9sZW4sCisJCQlDQVNFX1NFTlNJVElWRSwgMCwgTlVMTCwgMCwgY3R4KTsKKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJZ290byBlcnJfb3V0OworCS8qCisJICogS2VlcCB0aGUgVk0gaGFwcHkuICBUaGlzIG11c3QgYmUgZG9uZSBvdGhlcndpc2UgdGhlIHJhZGl4LXRyZWUgdGFnCisJICogUEFHRUNBQ0hFX1RBR19ESVJUWSByZW1haW5zIHNldCBldmVuIHRob3VnaCB0aGUgcGFnZSBpcyBjbGVhbi4KKwkgKi8KKwlCVUdfT04oUGFnZVdyaXRlYmFjayhwYWdlKSk7CisJc2V0X3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCisJLyoKKwkgKiBIZXJlLCB3ZSBkb24ndCBuZWVkIHRvIHplcm8gdGhlIG91dCBvZiBib3VuZHMgYXJlYSBldmVyeXRpbWUgYmVjYXVzZQorCSAqIHRoZSBiZWxvdyBtZW1jcHkoKSBhbHJlYWR5IHRha2VzIGNhcmUgb2YgdGhlIG1tYXAtYXQtZW5kLW9mLWZpbGUKKwkgKiByZXF1aXJlbWVudHMuIElmIHRoZSBmaWxlIGlzIGNvbnZlcnRlZCB0byBhIG5vbi1yZXNpZGVudCBvbmUsIHRoZW4KKwkgKiB0aGUgY29kZSBwYXRoIHVzZSBpcyBzd2l0Y2hlZCB0byB0aGUgbm9uLXJlc2lkZW50IG9uZSB3aGVyZSB0aGUKKwkgKiB6ZXJvaW5nIGhhcHBlbnMgb24gZWFjaCBudGZzX3dyaXRlcGFnZSgpIGludm9jYXRpb24uCisJICoKKwkgKiBUaGUgYWJvdmUgYWxzbyBhcHBsaWVzIG5pY2VseSB3aGVuIGlfc2l6ZSBpcyBkZWNyZWFzZWQuCisJICoKKwkgKiBXaGVuIGlfc2l6ZSBpcyBpbmNyZWFzZWQsIHRoZSBtZW1vcnkgYmV0d2VlbiB0aGUgb2xkIGFuZCBuZXcgaV9zaXplCisJICogX211c3RfIGJlIHplcm9lZCAob3Igb3ZlcndyaXR0ZW4gd2l0aCBuZXcgZGF0YSkuIE90aGVyd2lzZSB3ZSB3aWxsCisJICogZXhwb3NlIGRhdGEgdG8gdXNlcnNwYWNlL2Rpc2sgd2hpY2ggc2hvdWxkIG5ldmVyIGhhdmUgYmVlbiBleHBvc2VkLgorCSAqCisJICogRklYTUU6IEVuc3VyZSB0aGF0IGlfc2l6ZSBpbmNyZWFzZXMgZG8gdGhlIHplcm9pbmcvb3ZlcndyaXRpbmcgYW5kCisJICogaWYgd2UgY2Fubm90IGd1YXJhbnRlZSB0aGF0LCB0aGVuIGVuYWJsZSB0aGUgemVyb2luZyBiZWxvdy4gIElmIHRoZQorCSAqIHplcm9pbmcgYmVsb3cgaXMgZW5hYmxlZCwgd2UgTVVTVCBtb3ZlIHRoZSB1bmxvY2tfcGFnZSgpIGZyb20gYWJvdmUKKwkgKiB0byBhZnRlciB0aGUga3VubWFwX2F0b21pYygpLCBpLmUuIGp1c3QgYmVmb3JlIHRoZQorCSAqIGVuZF9wYWdlX3dyaXRlYmFjaygpLgorCSAqIFVQREFURTogbnRmc19wcmVwYXJlL2NvbW1pdF93cml0ZSgpIGRvIHRoZSB6ZXJvaW5nIG9uIGlfc2l6ZQorCSAqIGluY3JlYXNlcyBmb3IgcmVzaWRlbnQgYXR0cmlidXRlcyBzbyB0aG9zZSBhcmUgb2suCisJICogVE9ETzogbnRmc190cnVuY2F0ZSgpLCBvdGhlcnM/CisJICovCisKKwlhdHRyX2xlbiA9IGxlMzJfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpOworCWlfc2l6ZSA9IGlfc2l6ZV9yZWFkKFZGU19JKG5pKSk7CisJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJaWYgKHVubGlrZWx5KGF0dHJfbGVuID4gaV9zaXplKSkgeworCQkvKiBaZXJvIG91dCBvZiBib3VuZHMgYXJlYSBpbiB0aGUgbWZ0IHJlY29yZC4gKi8KKwkJbWVtc2V0KCh1OCopY3R4LT5hdHRyICsgbGUxNl90b19jcHUoCisJCQkJY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCkgKworCQkJCWlfc2l6ZSwgMCwgYXR0cl9sZW4gLSBpX3NpemUpOworCQlhdHRyX2xlbiA9IGlfc2l6ZTsKKwl9CisJLyogQ29weSB0aGUgZGF0YSBmcm9tIHRoZSBwYWdlIHRvIHRoZSBtZnQgcmVjb3JkLiAqLworCW1lbWNweSgodTgqKWN0eC0+YXR0ciArCisJCQlsZTE2X3RvX2NwdShjdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSwKKwkJCWthZGRyLCBhdHRyX2xlbik7CisJZmx1c2hfZGNhY2hlX21mdF9yZWNvcmRfcGFnZShjdHgtPm50ZnNfaW5vKTsKKwkvKiBaZXJvIG91dCBvZiBib3VuZHMgYXJlYSBpbiB0aGUgcGFnZSBjYWNoZSBwYWdlLiAqLworCW1lbXNldChrYWRkciArIGF0dHJfbGVuLCAwLCBQQUdFX0NBQ0hFX1NJWkUgLSBhdHRyX2xlbik7CisJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCisJZW5kX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCisJLyogTWFyayB0aGUgbWZ0IHJlY29yZCBkaXJ0eSwgc28gaXQgZ2V0cyB3cml0dGVuIGJhY2suICovCisJbWFya19tZnRfcmVjb3JkX2RpcnR5KGN0eC0+bnRmc19pbm8pOworCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCXVubWFwX21mdF9yZWNvcmQoYmFzZV9uaSk7CisJcmV0dXJuIDA7CitlcnJfb3V0OgorCWlmIChlcnIgPT0gLUVOT01FTSkgeworCQludGZzX3dhcm5pbmcodmktPmlfc2IsICJFcnJvciBhbGxvY2F0aW5nIG1lbW9yeS4gUmVkaXJ0eWluZyAiCisJCQkJInBhZ2Ugc28gd2UgdHJ5IGFnYWluIGxhdGVyLiIpOworCQkvKgorCQkgKiBQdXQgdGhlIHBhZ2UgYmFjayBvbiBtYXBwaW5nLT5kaXJ0eV9wYWdlcywgYnV0IGxlYXZlIGl0cworCQkgKiBidWZmZXJzJyBkaXJ0eSBzdGF0ZSBhcy1pcy4KKwkJICovCisJCXJlZGlydHlfcGFnZV9mb3Jfd3JpdGVwYWdlKHdiYywgcGFnZSk7CisJCWVyciA9IDA7CisJfSBlbHNlIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIlJlc2lkZW50IGF0dHJpYnV0ZSB3cml0ZSBmYWlsZWQgd2l0aCAiCisJCQkJImVycm9yICVpLiAgU2V0dGluZyBwYWdlIGVycm9yIGZsYWcuIiwgZXJyKTsKKwkJU2V0UGFnZUVycm9yKHBhZ2UpOworCX0KKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlpZiAoY3R4KQorCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwlpZiAobSkKKwkJdW5tYXBfbWZ0X3JlY29yZChiYXNlX25pKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIG50ZnNfcHJlcGFyZV9ub25yZXNpZGVudF93cml0ZSAtCisgKgorICovCitzdGF0aWMgaW50IG50ZnNfcHJlcGFyZV9ub25yZXNpZGVudF93cml0ZShzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCit7CisJVkNOIHZjbjsKKwlMQ04gbGNuOworCXNlY3Rvcl90IGJsb2NrLCBhYmxvY2ssIGlibG9jazsKKwlzdHJ1Y3QgaW5vZGUgKnZpOworCW50ZnNfaW5vZGUgKm5pOworCW50ZnNfdm9sdW1lICp2b2w7CisJcnVubGlzdF9lbGVtZW50ICpybDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqaGVhZCwgKndhaXRbMl0sICoqd2FpdF9iaCA9IHdhaXQ7CisJdW5zaWduZWQgaW50IHZjbl9vZnMsIGJsb2NrX3N0YXJ0LCBibG9ja19lbmQsIGJsb2Nrc2l6ZTsKKwlpbnQgZXJyOworCUJPT0wgaXNfcmV0cnk7CisJdW5zaWduZWQgY2hhciBibG9ja3NpemVfYml0czsKKworCXZpID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwluaSA9IE5URlNfSSh2aSk7CisJdm9sID0gbmktPnZvbDsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBpbm9kZSAweCVseCwgYXR0cmlidXRlIHR5cGUgMHgleCwgcGFnZSBpbmRleCAiCisJCQkiMHglbHgsIGZyb20gPSAldSwgdG8gPSAldS4iLCBuaS0+bWZ0X25vLCBuaS0+dHlwZSwKKwkJCXBhZ2UtPmluZGV4LCBmcm9tLCB0byk7CisKKwlCVUdfT04oIU5Jbm9Ob25SZXNpZGVudChuaSkpOworCisJYmxvY2tzaXplX2JpdHMgPSB2aS0+aV9ibGtiaXRzOworCWJsb2Nrc2l6ZSA9IDEgPDwgYmxvY2tzaXplX2JpdHM7CisKKwkvKgorCSAqIGNyZWF0ZV9lbXB0eV9idWZmZXJzKCkgd2lsbCBjcmVhdGUgdXB0b2RhdGUvZGlydHkgYnVmZmVycyBpZiB0aGUKKwkgKiBwYWdlIGlzIHVwdG9kYXRlL2RpcnR5LgorCSAqLworCWlmICghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkKKwkJY3JlYXRlX2VtcHR5X2J1ZmZlcnMocGFnZSwgYmxvY2tzaXplLCAwKTsKKwliaCA9IGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJaWYgKHVubGlrZWx5KCFiaCkpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogVGhlIGZpcnN0IGJsb2NrIGluIHRoZSBwYWdlLiAqLworCWJsb2NrID0gKHM2NClwYWdlLT5pbmRleCA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIGJsb2Nrc2l6ZV9iaXRzKTsKKworCS8qCisJICogVGhlIGZpcnN0IG91dCBvZiBib3VuZHMgYmxvY2sgZm9yIHRoZSBhbGxvY2F0ZWQgc2l6ZS4gTm8gbmVlZCB0bworCSAqIHJvdW5kIHVwIGFzIGFsbG9jYXRlZF9zaXplIGlzIGluIG11bHRpcGxlcyBvZiBjbHVzdGVyIHNpemUgYW5kIHRoZQorCSAqIG1pbmltdW0gY2x1c3RlciBzaXplIGlzIDUxMiBieXRlcywgd2hpY2ggaXMgZXF1YWwgdG8gdGhlIHNtYWxsZXN0CisJICogYmxvY2tzaXplLgorCSAqLworCWFibG9jayA9IG5pLT5hbGxvY2F0ZWRfc2l6ZSA+PiBibG9ja3NpemVfYml0czsKKworCS8qIFRoZSBsYXN0IChmdWxseSBvciBwYXJ0aWFsbHkpIGluaXRpYWxpemVkIGJsb2NrLiAqLworCWlibG9jayA9IG5pLT5pbml0aWFsaXplZF9zaXplID4+IGJsb2Nrc2l6ZV9iaXRzOworCisJLyogTG9vcCB0aHJvdWdoIGFsbCB0aGUgYnVmZmVycyBpbiB0aGUgcGFnZS4gKi8KKwlibG9ja19zdGFydCA9IDA7CisJcmwgPSBOVUxMOworCWVyciA9IDA7CisJZG8geworCQlibG9ja19lbmQgPSBibG9ja19zdGFydCArIGJsb2Nrc2l6ZTsKKwkJLyoKKwkJICogSWYgYnVmZmVyIEBiaCBpcyBvdXRzaWRlIHRoZSB3cml0ZSwganVzdCBtYXJrIGl0IHVwdG9kYXRlCisJCSAqIGlmIHRoZSBwYWdlIGlzIHVwdG9kYXRlIGFuZCBjb250aW51ZSB3aXRoIHRoZSBuZXh0IGJ1ZmZlci4KKwkJICovCisJCWlmIChibG9ja19lbmQgPD0gZnJvbSB8fCBibG9ja19zdGFydCA+PSB0bykgeworCQkJaWYgKFBhZ2VVcHRvZGF0ZShwYWdlKSkgeworCQkJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkKKwkJCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQkvKgorCQkgKiBAYmggaXMgYXQgbGVhc3QgcGFydGlhbGx5IGJlaW5nIHdyaXR0ZW4gdG8uCisJCSAqIE1ha2Ugc3VyZSBpdCBpcyBub3QgbWFya2VkIGFzIG5ldy4KKwkJICovCisJCS8vaWYgKGJ1ZmZlcl9uZXcoYmgpKQorCQkvLwljbGVhcl9idWZmZXJfbmV3KGJoKTsKKworCQlpZiAoYmxvY2sgPj0gYWJsb2NrKSB7CisJCQkvLyBUT0RPOiBibG9jayBpcyBhYm92ZSBhbGxvY2F0ZWRfc2l6ZSwgbmVlZCB0bworCQkJLy8gYWxsb2NhdGUgaXQuIEJlc3QgZG9uZSBpbiBvbmUgZ28gdG8gYWNjb21tb2RhdGUgbm90CisJCQkvLyBvbmx5IGJsb2NrIGJ1dCBhbGwgYWJvdmUgYmxvY2tzIHVwIHRvIGFuZCBpbmNsdWRpbmc6CisJCQkvLyAoKHBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpICsgdG8gKyBibG9ja3NpemUKKwkJCS8vIC0gMSkgPj4gYmxvYmtzaXplX2JpdHMuIE9idmlvdXNseSB3aWxsIG5lZWQgdG8gcm91bmQKKwkJCS8vIHVwIHRvIG5leHQgY2x1c3RlciBib3VuZGFyeSwgdG9vLiBUaGlzIHNob3VsZCBiZQorCQkJLy8gZG9uZSB3aXRoIGEgaGVscGVyIGZ1bmN0aW9uLCBzbyBpdCBjYW4gYmUgcmV1c2VkLgorCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiV3JpdGluZyBiZXlvbmQgYWxsb2NhdGVkIHNpemUgIgorCQkJCQkiaXMgbm90IHN1cHBvcnRlZCB5ZXQuIFNvcnJ5LiIpOworCQkJZXJyID0gLUVPUE5PVFNVUFA7CisJCQlnb3RvIGVycl9vdXQ7CisJCQkvLyBOZWVkIHRvIHVwZGF0ZSBhYmxvY2suCisJCQkvLyBOZWVkIHRvIHNldF9idWZmZXJfbmV3KCkgb24gYWxsIGJsb2NrIGJocyB0aGF0IGFyZQorCQkJLy8gbmV3bHkgYWxsb2NhdGVkLgorCQl9CisJCS8qCisJCSAqIE5vdyB3ZSBoYXZlIGVub3VnaCBhbGxvY2F0ZWQgc2l6ZSB0byBmdWxmaWxsIHRoZSB3aG9sZQorCQkgKiByZXF1ZXN0LCBpLmUuIGJsb2NrIDwgYWJsb2NrIGlzIHRydWUuCisJCSAqLworCQlpZiAodW5saWtlbHkoKGJsb2NrID49IGlibG9jaykgJiYKKwkJCQkobmktPmluaXRpYWxpemVkX3NpemUgPCB2aS0+aV9zaXplKSkpIHsKKwkJCS8qCisJCQkgKiBJZiB0aGlzIHBhZ2UgaXMgZnVsbHkgb3V0c2lkZSBpbml0aWFsaXplZCBzaXplLCB6ZXJvCisJCQkgKiBvdXQgYWxsIHBhZ2VzIGJldHdlZW4gdGhlIGN1cnJlbnQgaW5pdGlhbGl6ZWQgc2l6ZQorCQkJICogYW5kIHRoZSBjdXJyZW50IHBhZ2UuIEp1c3QgdXNlIG50ZnNfcmVhZHBhZ2UoKSB0byBkbworCQkJICogdGhlIHplcm9pbmcgdHJhbnNwYXJlbnRseS4KKwkJCSAqLworCQkJaWYgKGJsb2NrID4gaWJsb2NrKSB7CisJCQkJLy8gVE9ETzoKKwkJCQkvLyBGb3IgZWFjaCBwYWdlIGRvOgorCQkJCS8vIC0gcmVhZF9jYWNoZV9wYWdlKCkKKwkJCQkvLyBBZ2FpbiBmb3IgZWFjaCBwYWdlIGRvOgorCQkJCS8vIC0gd2FpdF9vbl9wYWdlX2xvY2tlZCgpCisJCQkJLy8gLSBDaGVjayAoUGFnZVVwdG9kYXRlKHBhZ2UpICYmCisJCQkJLy8JCQkhUGFnZUVycm9yKHBhZ2UpKQorCQkJCS8vIFVwZGF0ZSBpbml0aWFsaXplZCBzaXplIGluIHRoZSBhdHRyaWJ1dGUgYW5kCisJCQkJLy8gaW4gdGhlIGlub2RlLgorCQkJCS8vIEFnYWluLCBmb3IgZWFjaCBwYWdlIGRvOgorCQkJCS8vCV9fc2V0X3BhZ2VfZGlydHlfYnVmZmVycygpOworCQkJCS8vIHBhZ2VfY2FjaGVfcmVsZWFzZSgpCisJCQkJLy8gV2UgZG9uJ3QgbmVlZCB0byB3YWl0IG9uIHRoZSB3cml0ZXMuCisJCQkJLy8gVXBkYXRlIGlibG9jay4KKwkJCX0KKwkJCS8qCisJCQkgKiBUaGUgY3VycmVudCBwYWdlIHN0cmFkZGxlcyBpbml0aWFsaXplZCBzaXplLiBaZXJvCisJCQkgKiBhbGwgbm9uLXVwdG9kYXRlIGJ1ZmZlcnMgYW5kIHNldCB0aGVtIHVwdG9kYXRlIChhbmQKKwkJCSAqIGRpcnR5PykuIE5vdGUsIHRoZXJlIGFyZW4ndCBhbnkgbm9uLXVwdG9kYXRlIGJ1ZmZlcnMKKwkJCSAqIGlmIHRoZSBwYWdlIGlzIHVwdG9kYXRlLgorCQkJICogRklYTUU6IEZvciBhbiB1cHRvZGF0ZSBwYWdlLCB0aGUgYnVmZmVycyBtYXkgbmVlZCB0bworCQkJICogYmUgd3JpdHRlbiBvdXQgYmVjYXVzZSB0aGV5IHdlcmUgbm90IGluaXRpYWxpemVkIG9uCisJCQkgKiBkaXNrIGJlZm9yZS4KKwkJCSAqLworCQkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJCQkvLyBUT0RPOgorCQkJCS8vIFplcm8gYW55IG5vbi11cHRvZGF0ZSBidWZmZXJzIHVwIHRvIGlfc2l6ZS4KKwkJCQkvLyBTZXQgdGhlbSB1cHRvZGF0ZSBhbmQgZGlydHkuCisJCQl9CisJCQkvLyBUT0RPOgorCQkJLy8gVXBkYXRlIGluaXRpYWxpemVkIHNpemUgaW4gdGhlIGF0dHJpYnV0ZSBhbmQgaW4gdGhlCisJCQkvLyBpbm9kZSAodXAgdG8gaV9zaXplKS4KKwkJCS8vIFVwZGF0ZSBpYmxvY2suCisJCQkvLyBGSVhNRTogVGhpcyBpcyBpbmVmZmljaWVudC4gVHJ5IHRvIGJhdGNoIHRoZSB0d28KKwkJCS8vIHNpemUgY2hhbmdlcyB0byBoYXBwZW4gaW4gb25lIGdvLgorCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiV3JpdGluZyBiZXlvbmQgaW5pdGlhbGl6ZWQgc2l6ZSAiCisJCQkJCSJpcyBub3Qgc3VwcG9ydGVkIHlldC4gU29ycnkuIik7CisJCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJCWdvdG8gZXJyX291dDsKKwkJCS8vIERvIE5PVCBzZXRfYnVmZmVyX25ldygpIEJVVCBETyBjbGVhciBidWZmZXIgcmFuZ2UKKwkJCS8vIG91dHNpZGUgd3JpdGUgcmVxdWVzdCByYW5nZS4KKwkJCS8vIHNldF9idWZmZXJfdXB0b2RhdGUoKSBvbiBjb21wbGV0ZSBidWZmZXJzIGFzIHdlbGwgYXMKKwkJCS8vIHNldF9idWZmZXJfZGlydHkoKS4KKwkJfQorCisJCS8qIE5lZWQgdG8gbWFwIHVubWFwcGVkIGJ1ZmZlcnMuICovCisJCWlmICghYnVmZmVyX21hcHBlZChiaCkpIHsKKwkJCS8qIFVubWFwcGVkIGJ1ZmZlci4gTmVlZCB0byBtYXAgaXQuICovCisJCQliaC0+Yl9iZGV2ID0gdm9sLT5zYi0+c19iZGV2OworCisJCQkvKiBDb252ZXJ0IGJsb2NrIGludG8gY29ycmVzcG9uZGluZyB2Y24gYW5kIG9mZnNldC4gKi8KKwkJCXZjbiA9IChWQ04pYmxvY2sgPDwgYmxvY2tzaXplX2JpdHMgPj4KKwkJCQkJdm9sLT5jbHVzdGVyX3NpemVfYml0czsKKwkJCXZjbl9vZnMgPSAoKFZDTilibG9jayA8PCBibG9ja3NpemVfYml0cykgJgorCQkJCQl2b2wtPmNsdXN0ZXJfc2l6ZV9tYXNrOworCisJCQlpc19yZXRyeSA9IEZBTFNFOworCQkJaWYgKCFybCkgeworbG9ja19yZXRyeV9yZW1hcDoKKwkJCQlkb3duX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCQkJCXJsID0gbmktPnJ1bmxpc3Qucmw7CisJCQl9CisJCQlpZiAobGlrZWx5KHJsICE9IE5VTEwpKSB7CisJCQkJLyogU2VlayB0byBlbGVtZW50IGNvbnRhaW5pbmcgdGFyZ2V0IHZjbi4gKi8KKwkJCQl3aGlsZSAocmwtPmxlbmd0aCAmJiBybFsxXS52Y24gPD0gdmNuKQorCQkJCQlybCsrOworCQkJCWxjbiA9IG50ZnNfcmxfdmNuX3RvX2xjbihybCwgdmNuKTsKKwkJCX0gZWxzZQorCQkJCWxjbiA9IExDTl9STF9OT1RfTUFQUEVEOworCQkJaWYgKHVubGlrZWx5KGxjbiA8IDApKSB7CisJCQkJLyoKKwkJCQkgKiBXZSBleHRlbmRlZCB0aGUgYXR0cmlidXRlIGFsbG9jYXRpb24gYWJvdmUuCisJCQkJICogSWYgd2UgaGl0IGFuIEVOT0VOVCBoZXJlIGl0IG1lYW5zIHRoYXQgdGhlCisJCQkJICogYWxsb2NhdGlvbiB3YXMgaW5zdWZmaWNpZW50IHdoaWNoIGlzIGEgYnVnLgorCQkJCSAqLworCQkJCUJVR19PTihsY24gPT0gTENOX0VOT0VOVCk7CisKKwkJCQkvKiBJdCBpcyBhIGhvbGUsIG5lZWQgdG8gaW5zdGFudGlhdGUgaXQuICovCisJCQkJaWYgKGxjbiA9PSBMQ05fSE9MRSkgeworCQkJCQkvLyBUT0RPOiBJbnN0YW50aWF0ZSB0aGUgaG9sZS4KKwkJCQkJLy8gY2xlYXJfYnVmZmVyX25ldyhiaCk7CisJCQkJCS8vIHVubWFwX3VuZGVybHlpbmdfbWV0YWRhdGEoYmgtPmJfYmRldiwKKwkJCQkJLy8JCWJoLT5iX2Jsb2NrbnIpOworCQkJCQkvLyBGb3Igbm9uLXVwdG9kYXRlIGJ1ZmZlcnMsIG5lZWQgdG8KKwkJCQkJLy8gemVybyBvdXQgdGhlIHJlZ2lvbiBvdXRzaWRlIHRoZQorCQkJCQkvLyByZXF1ZXN0IGluIHRoaXMgYmggb3IgYWxsIGJocywKKwkJCQkJLy8gZGVwZW5kaW5nIG9uIHdoYXQgd2UgaW1wbGVtZW50ZWQKKwkJCQkJLy8gYWJvdmUuCisJCQkJCS8vIE5lZWQgdG8gZmx1c2hfZGNhY2hlX3BhZ2UoKS4KKwkJCQkJLy8gT3IgY291bGQgdXNlIHNldF9idWZmZXJfbmV3KCkKKwkJCQkJLy8gaW5zdGVhZD8KKwkJCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiV3JpdGluZyBpbnRvICIKKwkJCQkJCQkic3BhcnNlIHJlZ2lvbnMgaXMgIgorCQkJCQkJCSJub3Qgc3VwcG9ydGVkIHlldC4gIgorCQkJCQkJCSJTb3JyeS4iKTsKKwkJCQkJZXJyID0gLUVPUE5PVFNVUFA7CisJCQkJCWdvdG8gZXJyX291dDsKKwkJCQl9IGVsc2UgaWYgKCFpc19yZXRyeSAmJgorCQkJCQkJbGNuID09IExDTl9STF9OT1RfTUFQUEVEKSB7CisJCQkJCWlzX3JldHJ5ID0gVFJVRTsKKwkJCQkJLyoKKwkJCQkJICogQXR0ZW1wdCB0byBtYXAgcnVubGlzdCwgZHJvcHBpbmcKKwkJCQkJICogbG9jayBmb3IgdGhlIGR1cmF0aW9uLgorCQkJCQkgKi8KKwkJCQkJdXBfcmVhZCgmbmktPnJ1bmxpc3QubG9jayk7CisJCQkJCWVyciA9IG50ZnNfbWFwX3J1bmxpc3QobmksIHZjbik7CisJCQkJCWlmIChsaWtlbHkoIWVycikpCisJCQkJCQlnb3RvIGxvY2tfcmV0cnlfcmVtYXA7CisJCQkJCXJsID0gTlVMTDsKKwkJCQkJbGNuID0gZXJyOworCQkJCX0KKwkJCQkvKgorCQkJCSAqIEZhaWxlZCB0byBtYXAgdGhlIGJ1ZmZlciwgZXZlbiBhZnRlcgorCQkJCSAqIHJldHJ5aW5nLgorCQkJCSAqLworCQkJCWJoLT5iX2Jsb2NrbnIgPSAtMTsKKwkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gd3JpdGUgdG8gaW5vZGUgIgorCQkJCQkJIjB4JWx4LCBhdHRyaWJ1dGUgdHlwZSAweCV4LCAiCisJCQkJCQkidmNuIDB4JWxseCwgb2Zmc2V0IDB4JXggIgorCQkJCQkJImJlY2F1c2UgaXRzIGxvY2F0aW9uIG9uIGRpc2sgIgorCQkJCQkJImNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkJXMgIgorCQkJCQkJIihlcnJvciBjb2RlICVsbGkpLiIsCisJCQkJCQluaS0+bWZ0X25vLCBuaS0+dHlwZSwKKwkJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdmNuLAorCQkJCQkJdmNuX29mcywgaXNfcmV0cnkgPyAiIGV2ZW4gIgorCQkJCQkJImFmdGVyIHJldHJ5aW5nIiA6ICIiLAorCQkJCQkJKGxvbmcgbG9uZylsY24pOworCQkJCWlmICghZXJyKQorCQkJCQllcnIgPSAtRUlPOworCQkJCWdvdG8gZXJyX291dDsKKwkJCX0KKwkJCS8qIFdlIG5vdyBoYXZlIGEgc3VjY2Vzc2Z1bCByZW1hcCwgaS5lLiBsY24gPj0gMC4gKi8KKworCQkJLyogU2V0dXAgYnVmZmVyIGhlYWQgdG8gY29ycmVjdCBibG9jay4gKi8KKwkJCWJoLT5iX2Jsb2NrbnIgPSAoKGxjbiA8PCB2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzKQorCQkJCQkrIHZjbl9vZnMpID4+IGJsb2Nrc2l6ZV9iaXRzOworCQkJc2V0X2J1ZmZlcl9tYXBwZWQoYmgpOworCisJCQkvLyBGSVhNRTogU29tZXRoaW5nIGFuYWxvZ291cyB0byB0aGlzIGlzIG5lZWRlZCBmb3IKKwkJCS8vIGVhY2ggbmV3bHkgYWxsb2NhdGVkIGJsb2NrLCBpLmUuIEJIX05ldy4KKwkJCS8vIEZJWE1FOiBNaWdodCBuZWVkIHRvIHRha2UgdGhpcyBvdXQgb2YgdGhlCisJCQkvLyBpZiAoIWJ1ZmZlcl9tYXBwZWQoYmgpKSB7fSwgZGVwZW5kaW5nIG9uIGhvdyB3ZQorCQkJLy8gaW1wbGVtZW50IHRoaW5ncyBkdXJpbmcgdGhlIGFsbG9jYXRlZF9zaXplIGFuZAorCQkJLy8gaW5pdGlhbGl6ZWRfc2l6ZSBleHRlbnNpb24gY29kZSBhYm92ZS4KKwkJCWlmIChidWZmZXJfbmV3KGJoKSkgeworCQkJCWNsZWFyX2J1ZmZlcl9uZXcoYmgpOworCQkJCXVubWFwX3VuZGVybHlpbmdfbWV0YWRhdGEoYmgtPmJfYmRldiwKKwkJCQkJCWJoLT5iX2Jsb2NrbnIpOworCQkJCWlmIChQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQkvKgorCQkJCSAqIFBhZ2UgaXMgX25vdF8gdXB0b2RhdGUsIHplcm8gc3Vycm91bmRpbmcKKwkJCQkgKiByZWdpb24uIE5PVEU6IFRoaXMgaXMgaG93IHdlIGRlY2lkZSBpZiB0bworCQkJCSAqIHplcm8gb3Igbm90IQorCQkJCSAqLworCQkJCWlmIChibG9ja19lbmQgPiB0byB8fCBibG9ja19zdGFydCA8IGZyb20pIHsKKwkJCQkJdm9pZCAqa2FkZHI7CisKKwkJCQkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCQkJCWlmIChibG9ja19lbmQgPiB0bykKKwkJCQkJCW1lbXNldChrYWRkciArIHRvLCAwLAorCQkJCQkJCQlibG9ja19lbmQgLSB0byk7CisJCQkJCWlmIChibG9ja19zdGFydCA8IGZyb20pCisJCQkJCQltZW1zZXQoa2FkZHIgKyBibG9ja19zdGFydCwgMCwKKwkJCQkJCQkJZnJvbSAtCisJCQkJCQkJCWJsb2NrX3N0YXJ0KTsKKwkJCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCQkJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJLyogQGJoIGlzIG1hcHBlZCwgc2V0IGl0IHVwdG9kYXRlIGlmIHRoZSBwYWdlIGlzIHVwdG9kYXRlLiAqLworCQlpZiAoUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCQlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKgorCQkgKiBUaGUgcGFnZSBpcyBub3QgdXB0b2RhdGUuIFRoZSBidWZmZXIgaXMgbWFwcGVkLiBJZiBpdCBpcyBub3QKKwkJICogdXB0b2RhdGUsIGFuZCBpdCBpcyBvbmx5IHBhcnRpYWxseSBiZWluZyB3cml0dGVuIHRvLCB3ZSBuZWVkCisJCSAqIHRvIHJlYWQgdGhlIGJ1ZmZlciBpbiBiZWZvcmUgdGhlIHdyaXRlLCBpLmUuIHJpZ2h0IG5vdy4KKwkJICovCisJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSAmJgorCQkJCShibG9ja19zdGFydCA8IGZyb20gfHwgYmxvY2tfZW5kID4gdG8pKSB7CisJCQlsbF9yd19ibG9jayhSRUFELCAxLCAmYmgpOworCQkJKndhaXRfYmgrKyA9IGJoOworCQl9CisJfSB3aGlsZSAoYmxvY2srKywgYmxvY2tfc3RhcnQgPSBibG9ja19lbmQsCisJCQkoYmggPSBiaC0+Yl90aGlzX3BhZ2UpICE9IGhlYWQpOworCisJLyogUmVsZWFzZSB0aGUgbG9jayBpZiB3ZSB0b29rIGl0LiAqLworCWlmIChybCkgeworCQl1cF9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKKwkJcmwgPSBOVUxMOworCX0KKworCS8qIElmIHdlIGlzc3VlZCByZWFkIHJlcXVlc3RzLCBsZXQgdGhlbSBjb21wbGV0ZS4gKi8KKwl3aGlsZSAod2FpdF9iaCA+IHdhaXQpIHsKKwkJd2FpdF9vbl9idWZmZXIoKi0td2FpdF9iaCk7CisJCWlmICghYnVmZmVyX3VwdG9kYXRlKCp3YWl0X2JoKSkKKwkJCXJldHVybiAtRUlPOworCX0KKworCW50ZnNfZGVidWcoIkRvbmUuIik7CisJcmV0dXJuIDA7CitlcnJfb3V0OgorCS8qCisJICogWmVybyBvdXQgYW55IG5ld2x5IGFsbG9jYXRlZCBibG9ja3MgdG8gYXZvaWQgZXhwb3Npbmcgc3RhbGUgZGF0YS4KKwkgKiBJZiBCSF9OZXcgaXMgc2V0LCB3ZSBrbm93IHRoYXQgdGhlIGJsb2NrIHdhcyBuZXdseSBhbGxvY2F0ZWQgaW4gdGhlCisJICogYWJvdmUgbG9vcC4KKwkgKiBGSVhNRTogV2hhdCBhYm91dCBpbml0aWFsaXplZF9zaXplIGluY3JlbWVudHM/IEhhdmUgd2UgZG9uZSBhbGwgdGhlCisJICogcmVxdWlyZWQgemVyb2luZyBhYm92ZT8gSWYgbm90IHRoaXMgZXJyb3IgaGFuZGxpbmcgaXMgYnJva2VuLCBhbmQKKwkgKiBpbiBwYXJ0aWN1bGFyIHRoZSBpZiAoYmxvY2tfZW5kIDw9IGZyb20pIGNoZWNrIGlzIGNvbXBsZXRlbHkgYm9ndXMuCisJICovCisJYmggPSBoZWFkOworCWJsb2NrX3N0YXJ0ID0gMDsKKwlpc19yZXRyeSA9IEZBTFNFOworCWRvIHsKKwkJYmxvY2tfZW5kID0gYmxvY2tfc3RhcnQgKyBibG9ja3NpemU7CisJCWlmIChibG9ja19lbmQgPD0gZnJvbSkKKwkJCWNvbnRpbnVlOworCQlpZiAoYmxvY2tfc3RhcnQgPj0gdG8pCisJCQlicmVhazsKKwkJaWYgKGJ1ZmZlcl9uZXcoYmgpKSB7CisJCQl2b2lkICprYWRkcjsKKworCQkJY2xlYXJfYnVmZmVyX25ldyhiaCk7CisJCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkJCW1lbXNldChrYWRkciArIGJsb2NrX3N0YXJ0LCAwLCBiaC0+Yl9zaXplKTsKKwkJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQkJaXNfcmV0cnkgPSBUUlVFOworCQl9CisJfSB3aGlsZSAoYmxvY2tfc3RhcnQgPSBibG9ja19lbmQsIChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CisJaWYgKGlzX3JldHJ5KQorCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwlpZiAocmwpCisJCXVwX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogbnRmc19wcmVwYXJlX3dyaXRlIC0gcHJlcGFyZSBhIHBhZ2UgZm9yIHJlY2VpdmluZyBkYXRhCisgKgorICogVGhpcyBpcyBjYWxsZWQgZnJvbSBnZW5lcmljX2ZpbGVfd3JpdGUoKSB3aXRoIGlfc2VtIGhlbGQgb24gdGhlIGlub2RlCisgKiAoQHBhZ2UtPm1hcHBpbmctPmhvc3QpLiAgVGhlIEBwYWdlIGlzIGxvY2tlZCBidXQgbm90IGttYXAoKXBlZC4gIFRoZSBzb3VyY2UKKyAqIGRhdGEgaGFzIG5vdCB5ZXQgYmVlbiBjb3BpZWQgaW50byB0aGUgQHBhZ2UuCisgKgorICogTmVlZCB0byBleHRlbmQgdGhlIGF0dHJpYnV0ZS9maWxsIGluIGhvbGVzIGlmIG5lY2Vzc2FyeSwgY3JlYXRlIGJsb2NrcyBhbmQKKyAqIG1ha2UgcGFydGlhbGx5IG92ZXJ3cml0dGVuIGJsb2NrcyB1cHRvZGF0ZSwKKyAqCisgKiBpX3NpemUgaXMgbm90IHRvIGJlIG1vZGlmaWVkIHlldC4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIG9yIC1lcnJubyBvbiBlcnJvci4KKyAqCisgKiBTaG91bGQgYmUgdXNpbmcgYmxvY2tfcHJlcGFyZV93cml0ZSgpIFtzdXBwb3J0IGZvciBzcGFyc2UgZmlsZXNdIG9yCisgKiBjb250X3ByZXBhcmVfd3JpdGUoKSBbbm8gc3VwcG9ydCBmb3Igc3BhcnNlIGZpbGVzXS4gIENhbm5vdCBkbyB0aGF0IGR1ZSB0bworICogbnRmcyBzcGVjaWZpY3MgYnV0IGNhbiBsb29rIGF0IHRoZW0gZm9yIGltcGxlbWVudGF0aW9uIGd1aWRhbmNlLgorICoKKyAqIE5vdGU6IEluIHRoZSByYW5nZSwgQGZyb20gaXMgaW5jbHVzaXZlIGFuZCBAdG8gaXMgZXhjbHVzaXZlLCBpLmUuIEBmcm9tIGlzCisgKiB0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgcGFnZSB0aGF0IHdpbGwgYmUgd3JpdHRlbiB0byBhbmQgQHRvIGlzIHRoZSBmaXJzdCBieXRlCisgKiBhZnRlciB0aGUgbGFzdCBieXRlIHRoYXQgd2lsbCBiZSB3cml0dGVuIHRvLgorICovCitzdGF0aWMgaW50IG50ZnNfcHJlcGFyZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCXVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCXM2NCBuZXdfc2l6ZTsKKwlzdHJ1Y3QgaW5vZGUgKnZpID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwludGZzX2lub2RlICpiYXNlX25pID0gTlVMTCwgKm5pID0gTlRGU19JKHZpKTsKKwludGZzX3ZvbHVtZSAqdm9sID0gbmktPnZvbDsKKwludGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4ID0gTlVMTDsKKwlNRlRfUkVDT1JEICptID0gTlVMTDsKKwlBVFRSX1JFQ09SRCAqYTsKKwl1OCAqa2FkZHI7CisJdTMyIGF0dHJfbGVuOworCWludCBlcnI7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3IgaW5vZGUgMHglbHgsIGF0dHJpYnV0ZSB0eXBlIDB4JXgsIHBhZ2UgaW5kZXggIgorCQkJIjB4JWx4LCBmcm9tID0gJXUsIHRvID0gJXUuIiwgdmktPmlfaW5vLCBuaS0+dHlwZSwKKwkJCXBhZ2UtPmluZGV4LCBmcm9tLCB0byk7CisJQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKKwlCVUdfT04oZnJvbSA+IFBBR0VfQ0FDSEVfU0laRSk7CisJQlVHX09OKHRvID4gUEFHRV9DQUNIRV9TSVpFKTsKKwlCVUdfT04oZnJvbSA+IHRvKTsKKwlCVUdfT04oTklub01zdFByb3RlY3RlZChuaSkpOworCS8qCisJICogSWYgYSBwcmV2aW91cyBudGZzX3RydW5jYXRlKCkgZmFpbGVkLCByZXBlYXQgaXQgYW5kIGFib3J0IGlmIGl0CisJICogZmFpbHMgYWdhaW4uCisJICovCisJaWYgKHVubGlrZWx5KE5Jbm9UcnVuY2F0ZUZhaWxlZChuaSkpKSB7CisJCWRvd25fd3JpdGUoJnZpLT5pX2FsbG9jX3NlbSk7CisJCWVyciA9IG50ZnNfdHJ1bmNhdGUodmkpOworCQl1cF93cml0ZSgmdmktPmlfYWxsb2Nfc2VtKTsKKwkJaWYgKGVyciB8fCBOSW5vVHJ1bmNhdGVGYWlsZWQobmkpKSB7CisJCQlpZiAoIWVycikKKwkJCQllcnIgPSAtRUlPOworCQkJZ290byBlcnJfb3V0OworCQl9CisJfQorCS8qIElmIHRoZSBhdHRyaWJ1dGUgaXMgbm90IHJlc2lkZW50LCBkZWFsIHdpdGggaXQgZWxzZXdoZXJlLiAqLworCWlmIChOSW5vTm9uUmVzaWRlbnQobmkpKSB7CisJCS8qCisJCSAqIE9ubHkgdW5uYW1lZCAkREFUQSBhdHRyaWJ1dGVzIGNhbiBiZSBjb21wcmVzc2VkLCBlbmNyeXB0ZWQsCisJCSAqIGFuZC9vciBzcGFyc2UuCisJCSAqLworCQlpZiAobmktPnR5cGUgPT0gQVRfREFUQSAmJiAhbmktPm5hbWVfbGVuKSB7CisJCQkvKiBJZiBmaWxlIGlzIGVuY3J5cHRlZCwgZGVueSBhY2Nlc3MsIGp1c3QgbGlrZSBOVDQuICovCisJCQlpZiAoTklub0VuY3J5cHRlZChuaSkpIHsKKwkJCQludGZzX2RlYnVnKCJEZW55aW5nIHdyaXRlIGFjY2VzcyB0byBlbmNyeXB0ZWQgIgorCQkJCQkJImZpbGUuIik7CisJCQkJcmV0dXJuIC1FQUNDRVM7CisJCQl9CisJCQkvKiBDb21wcmVzc2VkIGRhdGEgc3RyZWFtcyBhcmUgaGFuZGxlZCBpbiBjb21wcmVzcy5jLiAqLworCQkJaWYgKE5Jbm9Db21wcmVzc2VkKG5pKSkgeworCQkJCS8vIFRPRE86IEltcGxlbWVudCBhbmQgcmVwbGFjZSB0aGlzIGNoZWNrIHdpdGgKKwkJCQkvLyByZXR1cm4gbnRmc193cml0ZV9jb21wcmVzc2VkX2Jsb2NrKHBhZ2UpOworCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJXcml0aW5nIHRvIGNvbXByZXNzZWQgIgorCQkJCQkJImZpbGVzIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LiAiCisJCQkJCQkiU29ycnkuIik7CisJCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQkJfQorCQkJLy8gVE9ETzogSW1wbGVtZW50IGFuZCByZW1vdmUgdGhpcyBjaGVjay4KKwkJCWlmIChOSW5vU3BhcnNlKG5pKSkgeworCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJXcml0aW5nIHRvIHNwYXJzZSBmaWxlcyAiCisJCQkJCQkiaXMgbm90IHN1cHBvcnRlZCB5ZXQuIFNvcnJ5LiIpOworCQkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJCX0KKwkJfQorCQkvKiBOb3JtYWwgZGF0YSBzdHJlYW0uICovCisJCXJldHVybiBudGZzX3ByZXBhcmVfbm9ucmVzaWRlbnRfd3JpdGUocGFnZSwgZnJvbSwgdG8pOworCX0KKwkvKgorCSAqIEF0dHJpYnV0ZSBpcyByZXNpZGVudCwgaW1wbHlpbmcgaXQgaXMgbm90IGNvbXByZXNzZWQsIGVuY3J5cHRlZCwgb3IKKwkgKiBzcGFyc2UuCisJICovCisJQlVHX09OKHBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpOworCW5ld19zaXplID0gKChzNjQpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgKyB0bzsKKwkvKiBJZiB3ZSBkbyBub3QgbmVlZCB0byByZXNpemUgdGhlIGF0dHJpYnV0ZSBhbGxvY2F0aW9uIHdlIGFyZSBkb25lLiAqLworCWlmIChuZXdfc2l6ZSA8PSB2aS0+aV9zaXplKQorCQlnb3RvIGRvbmU7CisKKwkvLyBGSVhNRTogV2UgYWJvcnQgZm9yIG5vdyBhcyB0aGlzIGNvZGUgaXMgbm90IHNhZmUuCisJbnRmc19lcnJvcih2aS0+aV9zYiwgIkNoYW5naW5nIHRoZSBmaWxlIHNpemUgaXMgbm90IHN1cHBvcnRlZCB5ZXQuICAiCisJCQkiU29ycnkuIik7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJLyogTWFwLCBwaW4sIGFuZCBsb2NrIHRoZSAoYmFzZSkgbWZ0IHJlY29yZC4gKi8KKwlpZiAoIU5Jbm9BdHRyKG5pKSkKKwkJYmFzZV9uaSA9IG5pOworCWVsc2UKKwkJYmFzZV9uaSA9IG5pLT5leHQuYmFzZV9udGZzX2lubzsKKwltID0gbWFwX21mdF9yZWNvcmQoYmFzZV9uaSk7CisJaWYgKElTX0VSUihtKSkgeworCQllcnIgPSBQVFJfRVJSKG0pOworCQltID0gTlVMTDsKKwkJY3R4ID0gTlVMTDsKKwkJZ290byBlcnJfb3V0OworCX0KKwljdHggPSBudGZzX2F0dHJfZ2V0X3NlYXJjaF9jdHgoYmFzZV9uaSwgbSk7CisJaWYgKHVubGlrZWx5KCFjdHgpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CisJZXJyID0gbnRmc19hdHRyX2xvb2t1cChuaS0+dHlwZSwgbmktPm5hbWUsIG5pLT5uYW1lX2xlbiwKKwkJCUNBU0VfU0VOU0lUSVZFLCAwLCBOVUxMLCAwLCBjdHgpOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCWlmIChlcnIgPT0gLUVOT0VOVCkKKwkJCWVyciA9IC1FSU87CisJCWdvdG8gZXJyX291dDsKKwl9CisJbSA9IGN0eC0+bXJlYzsKKwlhID0gY3R4LT5hdHRyOworCS8qIFRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZS4gKi8KKwlhdHRyX2xlbiA9IGxlMzJfdG9fY3B1KGEtPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKTsKKwlCVUdfT04odmktPmlfc2l6ZSAhPSBhdHRyX2xlbik7CisJLyogQ2hlY2sgaWYgbmV3IHNpemUgaXMgYWxsb3dlZCBpbiAkQXR0ckRlZi4gKi8KKwllcnIgPSBudGZzX2F0dHJfc2l6ZV9ib3VuZHNfY2hlY2sodm9sLCBuaS0+dHlwZSwgbmV3X3NpemUpOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCWlmIChlcnIgPT0gLUVSQU5HRSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiV3JpdGUgd291bGQgY2F1c2UgdGhlIGlub2RlICIKKwkJCQkJIjB4JWx4IHRvIGV4Y2VlZCB0aGUgbWF4aW11bSBzaXplIGZvciAiCisJCQkJCSJpdHMgYXR0cmlidXRlIHR5cGUgKDB4JXgpLiAgQWJvcnRpbmcgIgorCQkJCQkid3JpdGUuIiwgdmktPmlfaW5vLAorCQkJCQlsZTMyX3RvX2NwdShuaS0+dHlwZSkpOworCQl9IGVsc2UgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiSW5vZGUgMHglbHggaGFzIHVua25vd24gIgorCQkJCQkiYXR0cmlidXRlIHR5cGUgMHgleC4gIEFib3J0aW5nICIKKwkJCQkJIndyaXRlLiIsIHZpLT5pX2lubywKKwkJCQkJbGUzMl90b19jcHUobmktPnR5cGUpKTsKKwkJCWVyciA9IC1FSU87CisJCX0KKwkJZ290byBlcnJfb3V0MjsKKwl9CisJLyoKKwkgKiBFeHRlbmQgdGhlIGF0dHJpYnV0ZSByZWNvcmQgdG8gYmUgYWJsZSB0byBzdG9yZSB0aGUgbmV3IGF0dHJpYnV0ZQorCSAqIHNpemUuCisJICovCisJaWYgKG5ld19zaXplID49IHZvbC0+bWZ0X3JlY29yZF9zaXplIHx8IG50ZnNfYXR0cl9yZWNvcmRfcmVzaXplKG0sIGEsCisJCQlsZTE2X3RvX2NwdShhLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCkgKworCQkJbmV3X3NpemUpKSB7CisJCS8qIE5vdCBlbm91Z2ggc3BhY2UgaW4gdGhlIG1mdCByZWNvcmQuICovCisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIk5vdCBlbm91Z2ggc3BhY2UgaW4gdGhlIG1mdCByZWNvcmQgZm9yICIKKwkJCQkidGhlIHJlc2l6ZWQgYXR0cmlidXRlIHZhbHVlLiAgVGhpcyBpcyBub3QgIgorCQkJCSJzdXBwb3J0ZWQgeWV0LiAgQWJvcnRpbmcgd3JpdGUuIik7CisJCWVyciA9IC1FT1BOT1RTVVBQOworCQlnb3RvIGVycl9vdXQyOworCX0KKwkvKgorCSAqIFdlIGhhdmUgZW5vdWdoIHNwYWNlIGluIHRoZSBtZnQgcmVjb3JkIHRvIGZpdCB0aGUgd3JpdGUuICBUaGlzCisJICogaW1wbGllcyB0aGUgYXR0cmlidXRlIGlzIHNtYWxsZXIgdGhhbiB0aGUgbWZ0IHJlY29yZCBhbmQgaGVuY2UgdGhlCisJICogYXR0cmlidXRlIG11c3QgYmUgaW4gYSBzaW5nbGUgcGFnZSBhbmQgaGVuY2UgcGFnZS0+aW5kZXggbXVzdCBiZSAwLgorCSAqLworCUJVR19PTihwYWdlLT5pbmRleCk7CisJLyoKKwkgKiBJZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSB3cml0ZSBpcyBwYXN0IHRoZSBvbGQgc2l6ZSwgZW5sYXJnZSB0aGUKKwkgKiBhdHRyaWJ1dGUgdmFsdWUgdXAgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgd3JpdGUgYW5kIGZpbGwgaXQgd2l0aAorCSAqIHplcm9lcy4KKwkgKi8KKwlpZiAoZnJvbSA+IGF0dHJfbGVuKSB7CisJCW1lbXNldCgodTgqKWEgKyBsZTE2X3RvX2NwdShhLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCkgKworCQkJCWF0dHJfbGVuLCAwLCBmcm9tIC0gYXR0cl9sZW4pOworCQlhLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCA9IGNwdV90b19sZTMyKGZyb20pOworCQkvKiBaZXJvIHRoZSBjb3JyZXNwb25kaW5nIGFyZWEgaW4gdGhlIHBhZ2UgYXMgd2VsbC4gKi8KKwkJaWYgKFBhZ2VVcHRvZGF0ZShwYWdlKSkgeworCQkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCQltZW1zZXQoa2FkZHIgKyBhdHRyX2xlbiwgMCwgZnJvbSAtIGF0dHJfbGVuKTsKKwkJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQl9CisJfQorCWZsdXNoX2RjYWNoZV9tZnRfcmVjb3JkX3BhZ2UoY3R4LT5udGZzX2lubyk7CisJbWFya19tZnRfcmVjb3JkX2RpcnR5KGN0eC0+bnRmc19pbm8pOworCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCXVubWFwX21mdF9yZWNvcmQoYmFzZV9uaSk7CisJLyoKKwkgKiBCZWNhdXNlIHJlc2lkZW50IGF0dHJpYnV0ZXMgYXJlIGhhbmRsZWQgYnkgbWVtY3B5KCkgdG8vZnJvbSB0aGUKKwkgKiBjb3JyZXNwb25kaW5nIE1GVCByZWNvcmQsIGFuZCBiZWNhdXNlIHRoaXMgZm9ybSBvZiBpL28gaXMgYnl0ZQorCSAqIGFsaWduZWQgcmF0aGVyIHRoYW4gYmxvY2sgYWxpZ25lZCwgdGhlcmUgaXMgbm8gbmVlZCB0byBicmluZyB0aGUKKwkgKiBwYWdlIHVwdG9kYXRlIGhlcmUgYXMgaW4gdGhlIG5vbi1yZXNpZGVudCBjYXNlIHdoZXJlIHdlIG5lZWQgdG8KKwkgKiBicmluZyB0aGUgYnVmZmVycyBzdHJhZGRsZWQgYnkgdGhlIHdyaXRlIHVwdG9kYXRlIGJlZm9yZQorCSAqIGdlbmVyaWNfZmlsZV93cml0ZSgpIGRvZXMgdGhlIGNvcHlpbmcgZnJvbSB1c2Vyc3BhY2UuCisJICoKKwkgKiBXZSB0aHVzIGRlZmVyIHRoZSB1cHRvZGF0ZSBicmluZ2luZyBvZiB0aGUgcGFnZSByZWdpb24gb3V0c2lkZSB0aGUKKwkgKiByZWdpb24gd3JpdHRlbiB0byB0byBudGZzX2NvbW1pdF93cml0ZSgpLCB3aGljaCBtYWtlcyB0aGUgY29kZQorCSAqIHNpbXBsZXIgYW5kIHNhdmVzIG9uZSBhdG9taWMga21hcCB3aGljaCBpcyBnb29kLgorCSAqLworZG9uZToKKwludGZzX2RlYnVnKCJEb25lLiIpOworCXJldHVybiAwOworZXJyX291dDoKKwlpZiAoZXJyID09IC1FTk9NRU0pCisJCW50ZnNfd2FybmluZyh2aS0+aV9zYiwgIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5IHJlcXVpcmVkIHRvICIKKwkJCQkicHJlcGFyZSB0aGUgd3JpdGUuIik7CisJZWxzZSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICJSZXNpZGVudCBhdHRyaWJ1dGUgcHJlcGFyZSB3cml0ZSBmYWlsZWQgIgorCQkJCSJ3aXRoIGVycm9yICVpLiIsIGVycik7CisJCU5Wb2xTZXRFcnJvcnModm9sKTsKKwkJbWFrZV9iYWRfaW5vZGUodmkpOworCX0KK2Vycl9vdXQyOgorCWlmIChjdHgpCisJCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCWlmIChtKQorCQl1bm1hcF9tZnRfcmVjb3JkKGJhc2VfbmkpOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogbnRmc19jb21taXRfbm9ucmVzaWRlbnRfd3JpdGUgLQorICoKKyAqLworc3RhdGljIGludCBudGZzX2NvbW1pdF9ub25yZXNpZGVudF93cml0ZShzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCit7CisJczY0IHBvcyA9ICgoczY0KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpICsgdG87CisJc3RydWN0IGlub2RlICp2aSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKmhlYWQ7CisJdW5zaWduZWQgaW50IGJsb2NrX3N0YXJ0LCBibG9ja19lbmQsIGJsb2Nrc2l6ZTsKKwlCT09MIHBhcnRpYWw7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3IgaW5vZGUgMHglbHgsIGF0dHJpYnV0ZSB0eXBlIDB4JXgsIHBhZ2UgaW5kZXggIgorCQkJIjB4JWx4LCBmcm9tID0gJXUsIHRvID0gJXUuIiwgdmktPmlfaW5vLAorCQkJTlRGU19JKHZpKS0+dHlwZSwgcGFnZS0+aW5kZXgsIGZyb20sIHRvKTsKKwlibG9ja3NpemUgPSAxIDw8IHZpLT5pX2Jsa2JpdHM7CisKKwkvLyBGSVhNRTogV2UgbmVlZCBhIHdob2xlIHNsZXcgb2Ygc3BlY2lhbCBjYXNlcyBpbiBoZXJlIGZvciBjb21wcmVzc2VkCisJLy8gZmlsZXMgZm9yIGV4YW1wbGUuLi4KKwkvLyBGb3Igbm93LCB3ZSBrbm93IG50ZnNfcHJlcGFyZV93cml0ZSgpIHdvdWxkIGhhdmUgZmFpbGVkIHNvIHdlIGNhbid0CisJLy8gZ2V0IGhlcmUgaW4gYW55IG9mIHRoZSBjYXNlcyB3aGljaCB3ZSBoYXZlIHRvIHNwZWNpYWwgY2FzZSwgc28gd2UKKwkvLyBhcmUganVzdCBhIHJpcHBlZCBvZmYsIHVucm9sbGVkIGdlbmVyaWNfY29tbWl0X3dyaXRlKCkuCisKKwliaCA9IGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJYmxvY2tfc3RhcnQgPSAwOworCXBhcnRpYWwgPSBGQUxTRTsKKwlkbyB7CisJCWJsb2NrX2VuZCA9IGJsb2NrX3N0YXJ0ICsgYmxvY2tzaXplOworCQlpZiAoYmxvY2tfZW5kIDw9IGZyb20gfHwgYmxvY2tfc3RhcnQgPj0gdG8pIHsKKwkJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkKKwkJCQlwYXJ0aWFsID0gVFJVRTsKKwkJfSBlbHNlIHsKKwkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQl9CisJfSB3aGlsZSAoYmxvY2tfc3RhcnQgPSBibG9ja19lbmQsIChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CisJLyoKKwkgKiBJZiB0aGlzIGlzIGEgcGFydGlhbCB3cml0ZSB3aGljaCBoYXBwZW5lZCB0byBtYWtlIGFsbCBidWZmZXJzCisJICogdXB0b2RhdGUgdGhlbiB3ZSBjYW4gb3B0aW1pemUgYXdheSBhIGJvZ3VzIC0+cmVhZHBhZ2UoKSBmb3IgdGhlIG5leHQKKwkgKiByZWFkKCkuICBIZXJlIHdlICdkaXNjb3Zlcicgd2hldGhlciB0aGUgcGFnZSB3ZW50IHVwdG9kYXRlIGFzIGEKKwkgKiByZXN1bHQgb2YgdGhpcyAocG90ZW50aWFsbHkgcGFydGlhbCkgd3JpdGUuCisJICovCisJaWYgKCFwYXJ0aWFsKQorCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJLyoKKwkgKiBOb3QgY29udmluY2VkIGFib3V0IHRoaXMgYXQgYWxsLiAgU2VlIGRpc3Bhcml0eSBjb21tZW50IGFib3ZlLiAgRm9yCisJICogbm93IHdlIGtub3cgbnRmc19wcmVwYXJlX3dyaXRlKCkgd291bGQgaGF2ZSBmYWlsZWQgaW4gdGhlIHdyaXRlCisJICogZXhjZWVkcyBpX3NpemUgY2FzZSwgc28gdGhpcyB3aWxsIG5ldmVyIHRyaWdnZXIgd2hpY2ggaXMgZmluZS4KKwkgKi8KKwlpZiAocG9zID4gdmktPmlfc2l6ZSkgeworCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiV3JpdGluZyBiZXlvbmQgdGhlIGV4aXN0aW5nIGZpbGUgc2l6ZSBpcyAiCisJCQkJIm5vdCBzdXBwb3J0ZWQgeWV0LiAgU29ycnkuIik7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJLy8gdmktPmlfc2l6ZSA9IHBvczsKKwkJLy8gbWFya19pbm9kZV9kaXJ0eSh2aSk7CisJfQorCW50ZnNfZGVidWcoIkRvbmUuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbnRmc19jb21taXRfd3JpdGUgLSBjb21taXQgdGhlIHJlY2VpdmVkIGRhdGEKKyAqCisgKiBUaGlzIGlzIGNhbGxlZCBmcm9tIGdlbmVyaWNfZmlsZV93cml0ZSgpIHdpdGggaV9zZW0gaGVsZCBvbiB0aGUgaW5vZGUKKyAqIChAcGFnZS0+bWFwcGluZy0+aG9zdCkuICBUaGUgQHBhZ2UgaXMgbG9ja2VkIGJ1dCBub3Qga21hcCgpcGVkLiAgVGhlIHNvdXJjZQorICogZGF0YSBoYXMgYWxyZWFkeSBiZWVuIGNvcGllZCBpbnRvIHRoZSBAcGFnZS4gIG50ZnNfcHJlcGFyZV93cml0ZSgpIGhhcyBiZWVuCisgKiBjYWxsZWQgYmVmb3JlIHRoZSBkYXRhIGNvcGllZCBhbmQgaXQgcmV0dXJuZWQgc3VjY2VzcyBzbyB3ZSBjYW4gdGFrZSB0aGUKKyAqIHJlc3VsdHMgb2YgdmFyaW91cyBCVUcgY2hlY2tzIGFuZCBzb21lIGVycm9yIGhhbmRsaW5nIGZvciBncmFudGVkLgorICoKKyAqIE5lZWQgdG8gbWFyayBtb2RpZmllZCBibG9ja3MgZGlydHkgc28gdGhleSBnZXQgd3JpdHRlbiBvdXQgbGF0ZXIgd2hlbgorICogbnRmc193cml0ZXBhZ2UoKSBpcyBpbnZva2VkIGJ5IHRoZSBWTS4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIG9yIC1lcnJubyBvbiBlcnJvci4KKyAqCisgKiBTaG91bGQgYmUgdXNpbmcgZ2VuZXJpY19jb21taXRfd3JpdGUoKS4gIFRoaXMgbWFya3MgYnVmZmVycyB1cHRvZGF0ZSBhbmQKKyAqIGRpcnR5LCBzZXRzIHRoZSBwYWdlIHVwdG9kYXRlIGlmIGFsbCBidWZmZXJzIGluIHRoZSBwYWdlIGFyZSB1cHRvZGF0ZSwgYW5kCisgKiB1cGRhdGVzIGlfc2l6ZSBpZiB0aGUgZW5kIG9mIGlvIGlzIGJleW9uZCBpX3NpemUuICBJbiB0aGF0IGNhc2UsIGl0IGFsc28KKyAqIG1hcmtzIHRoZSBpbm9kZSBkaXJ0eS4KKyAqCisgKiBDYW5ub3QgdXNlIGdlbmVyaWNfY29tbWl0X3dyaXRlKCkgZHVlIHRvIG50ZnMgc3BlY2lhbGl0aWVzIGJ1dCBjYW4gbG9vayBhdAorICogaXQgZm9yIGltcGxlbWVudGF0aW9uIGd1aWRhbmNlLgorICoKKyAqIElmIHRoaW5ncyBoYXZlIGdvbmUgYXMgb3V0bGluZWQgaW4gbnRmc19wcmVwYXJlX3dyaXRlKCksIHRoZW4gd2UgZG8gbm90CisgKiBuZWVkIHRvIGRvIGFueSBwYWdlIGNvbnRlbnQgbW9kaWZpY2F0aW9ucyBoZXJlIGF0IGFsbCwgZXhjZXB0IGluIHRoZSB3cml0ZQorICogdG8gcmVzaWRlbnQgYXR0cmlidXRlIGNhc2UsIHdoZXJlIHdlIG5lZWQgdG8gZG8gdGhlIHVwdG9kYXRlIGJyaW5naW5nIGhlcmUKKyAqIHdoaWNoIHdlIGNvbWJpbmUgd2l0aCB0aGUgY29weWluZyBpbnRvIHRoZSBtZnQgcmVjb3JkIHdoaWNoIG1lYW5zIHdlIHNhdmUKKyAqIG9uZSBhdG9taWMga21hcC4KKyAqLworc3RhdGljIGludCBudGZzX2NvbW1pdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCXVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCXN0cnVjdCBpbm9kZSAqdmkgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCW50ZnNfaW5vZGUgKmJhc2VfbmksICpuaSA9IE5URlNfSSh2aSk7CisJY2hhciAqa2FkZHIsICprYXR0cjsKKwludGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4OworCU1GVF9SRUNPUkQgKm07CisJQVRUUl9SRUNPUkQgKmE7CisJdTMyIGF0dHJfbGVuOworCWludCBlcnI7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3IgaW5vZGUgMHglbHgsIGF0dHJpYnV0ZSB0eXBlIDB4JXgsIHBhZ2UgaW5kZXggIgorCQkJIjB4JWx4LCBmcm9tID0gJXUsIHRvID0gJXUuIiwgdmktPmlfaW5vLCBuaS0+dHlwZSwKKwkJCXBhZ2UtPmluZGV4LCBmcm9tLCB0byk7CisJLyogSWYgdGhlIGF0dHJpYnV0ZSBpcyBub3QgcmVzaWRlbnQsIGRlYWwgd2l0aCBpdCBlbHNld2hlcmUuICovCisJaWYgKE5Jbm9Ob25SZXNpZGVudChuaSkpIHsKKwkJLyogT25seSB1bm5hbWVkICREQVRBIGF0dHJpYnV0ZXMgY2FuIGJlIGNvbXByZXNzZWQvZW5jcnlwdGVkLiAqLworCQlpZiAobmktPnR5cGUgPT0gQVRfREFUQSAmJiAhbmktPm5hbWVfbGVuKSB7CisJCQkvKiBFbmNyeXB0ZWQgZmlsZXMgbmVlZCBzZXBhcmF0ZSBoYW5kbGluZy4gKi8KKwkJCWlmIChOSW5vRW5jcnlwdGVkKG5pKSkgeworCQkJCS8vIFdlIG5ldmVyIGdldCBoZXJlIGF0IHByZXNlbnQhCisJCQkJQlVHKCk7CisJCQl9CisJCQkvKiBDb21wcmVzc2VkIGRhdGEgc3RyZWFtcyBhcmUgaGFuZGxlZCBpbiBjb21wcmVzcy5jLiAqLworCQkJaWYgKE5Jbm9Db21wcmVzc2VkKG5pKSkgeworCQkJCS8vIFRPRE86IEltcGxlbWVudCB0aGlzIQorCQkJCS8vIHJldHVybiBudGZzX3dyaXRlX2NvbXByZXNzZWRfYmxvY2socGFnZSk7CisJCQkJLy8gV2UgbmV2ZXIgZ2V0IGhlcmUgYXQgcHJlc2VudCEKKwkJCQlCVUcoKTsKKwkJCX0KKwkJfQorCQkvKiBOb3JtYWwgZGF0YSBzdHJlYW0uICovCisJCXJldHVybiBudGZzX2NvbW1pdF9ub25yZXNpZGVudF93cml0ZShwYWdlLCBmcm9tLCB0byk7CisJfQorCS8qCisJICogQXR0cmlidXRlIGlzIHJlc2lkZW50LCBpbXBseWluZyBpdCBpcyBub3QgY29tcHJlc3NlZCwgZW5jcnlwdGVkLCBvcgorCSAqIHNwYXJzZS4KKwkgKi8KKwlpZiAoIU5Jbm9BdHRyKG5pKSkKKwkJYmFzZV9uaSA9IG5pOworCWVsc2UKKwkJYmFzZV9uaSA9IG5pLT5leHQuYmFzZV9udGZzX2lubzsKKwkvKiBNYXAsIHBpbiwgYW5kIGxvY2sgdGhlIG1mdCByZWNvcmQuICovCisJbSA9IG1hcF9tZnRfcmVjb3JkKGJhc2VfbmkpOworCWlmIChJU19FUlIobSkpIHsKKwkJZXJyID0gUFRSX0VSUihtKTsKKwkJbSA9IE5VTEw7CisJCWN0eCA9IE5VTEw7CisJCWdvdG8gZXJyX291dDsKKwl9CisJY3R4ID0gbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4KGJhc2VfbmksIG0pOworCWlmICh1bmxpa2VseSghY3R4KSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWVyciA9IG50ZnNfYXR0cl9sb29rdXAobmktPnR5cGUsIG5pLT5uYW1lLCBuaS0+bmFtZV9sZW4sCisJCQlDQVNFX1NFTlNJVElWRSwgMCwgTlVMTCwgMCwgY3R4KTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQlpZiAoZXJyID09IC1FTk9FTlQpCisJCQllcnIgPSAtRUlPOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWEgPSBjdHgtPmF0dHI7CisJLyogVGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgYXR0cmlidXRlIHZhbHVlLiAqLworCWF0dHJfbGVuID0gbGUzMl90b19jcHUoYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpOworCUJVR19PTihmcm9tID4gYXR0cl9sZW4pOworCWthdHRyID0gKHU4KilhICsgbGUxNl90b19jcHUoYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpOworCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCS8qIENvcHkgdGhlIHJlY2VpdmVkIGRhdGEgZnJvbSB0aGUgcGFnZSB0byB0aGUgbWZ0IHJlY29yZC4gKi8KKwltZW1jcHkoa2F0dHIgKyBmcm9tLCBrYWRkciArIGZyb20sIHRvIC0gZnJvbSk7CisJLyogVXBkYXRlIHRoZSBhdHRyaWJ1dGUgbGVuZ3RoIGlmIG5lY2Vzc2FyeS4gKi8KKwlpZiAodG8gPiBhdHRyX2xlbikgeworCQlhdHRyX2xlbiA9IHRvOworCQlhLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCA9IGNwdV90b19sZTMyKGF0dHJfbGVuKTsKKwl9CisJLyoKKwkgKiBJZiB0aGUgcGFnZSBpcyBub3QgdXB0b2RhdGUsIGJyaW5nIHRoZSBvdXQgb2YgYm91bmRzIGFyZWEocykKKwkgKiB1cHRvZGF0ZSBieSBjb3B5aW5nIGRhdGEgZnJvbSB0aGUgbWZ0IHJlY29yZCB0byB0aGUgcGFnZS4KKwkgKi8KKwlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkgeworCQlpZiAoZnJvbSA+IDApCisJCQltZW1jcHkoa2FkZHIsIGthdHRyLCBmcm9tKTsKKwkJaWYgKHRvIDwgYXR0cl9sZW4pCisJCQltZW1jcHkoa2FkZHIgKyB0bywga2F0dHIgKyB0bywgYXR0cl9sZW4gLSB0byk7CisJCS8qIFplcm8gdGhlIHJlZ2lvbiBvdXRzaWRlIHRoZSBlbmQgb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZS4gKi8KKwkJaWYgKGF0dHJfbGVuIDwgUEFHRV9DQUNIRV9TSVpFKQorCQkJbWVtc2V0KGthZGRyICsgYXR0cl9sZW4sIDAsIFBBR0VfQ0FDSEVfU0laRSAtIGF0dHJfbGVuKTsKKwkJLyoKKwkJICogVGhlIHByb2JhYmlsaXR5IG9mIG5vdCBoYXZpbmcgZG9uZSBhbnkgb2YgdGhlIGFib3ZlIGlzCisJCSAqIGV4dHJlbWVseSBzbWFsbCwgc28gd2UganVzdCBmbHVzaCB1bmNvbmRpdGlvbmFsbHkuCisJCSAqLworCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCX0KKwlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJLyogVXBkYXRlIGlfc2l6ZSBpZiBuZWNlc3NhcnkuICovCisJaWYgKHZpLT5pX3NpemUgPCBhdHRyX2xlbikgeworCQluaS0+YWxsb2NhdGVkX3NpemUgPSBuaS0+aW5pdGlhbGl6ZWRfc2l6ZSA9IGF0dHJfbGVuOworCQlpX3NpemVfd3JpdGUodmksIGF0dHJfbGVuKTsKKwl9CisJLyogTWFyayB0aGUgbWZ0IHJlY29yZCBkaXJ0eSwgc28gaXQgZ2V0cyB3cml0dGVuIGJhY2suICovCisJZmx1c2hfZGNhY2hlX21mdF9yZWNvcmRfcGFnZShjdHgtPm50ZnNfaW5vKTsKKwltYXJrX21mdF9yZWNvcmRfZGlydHkoY3R4LT5udGZzX2lubyk7CisJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJdW5tYXBfbWZ0X3JlY29yZChiYXNlX25pKTsKKwludGZzX2RlYnVnKCJEb25lLiIpOworCXJldHVybiAwOworZXJyX291dDoKKwlpZiAoZXJyID09IC1FTk9NRU0pIHsKKwkJbnRmc193YXJuaW5nKHZpLT5pX3NiLCAiRXJyb3IgYWxsb2NhdGluZyBtZW1vcnkgcmVxdWlyZWQgdG8gIgorCQkJCSJjb21taXQgdGhlIHdyaXRlLiIpOworCQlpZiAoUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCQludGZzX3dhcm5pbmcodmktPmlfc2IsICJQYWdlIGlzIHVwdG9kYXRlLCBzZXR0aW5nICIKKwkJCQkJImRpcnR5IHNvIHRoZSB3cml0ZSB3aWxsIGJlIHJldHJpZWQgIgorCQkJCQkibGF0ZXIgb24gYnkgdGhlIFZNLiIpOworCQkJLyoKKwkJCSAqIFB1dCB0aGUgcGFnZSBvbiBtYXBwaW5nLT5kaXJ0eV9wYWdlcywgYnV0IGxlYXZlIGl0cworCQkJICogYnVmZmVycycgZGlydHkgc3RhdGUgYXMtaXMuCisJCQkgKi8KKwkJCV9fc2V0X3BhZ2VfZGlydHlfbm9idWZmZXJzKHBhZ2UpOworCQkJZXJyID0gMDsKKwkJfSBlbHNlCisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiUGFnZSBpcyBub3QgdXB0b2RhdGUuICBXcml0dGVuICIKKwkJCQkJImRhdGEgaGFzIGJlZW4gbG9zdC4iKTsKKwl9IGVsc2UgeworCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiUmVzaWRlbnQgYXR0cmlidXRlIGNvbW1pdCB3cml0ZSBmYWlsZWQgIgorCQkJCSJ3aXRoIGVycm9yICVpLiIsIGVycik7CisJCU5Wb2xTZXRFcnJvcnMobmktPnZvbCk7CisJCW1ha2VfYmFkX2lub2RlKHZpKTsKKwl9CisJaWYgKGN0eCkKKwkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJaWYgKG0pCisJCXVubWFwX21mdF9yZWNvcmQoYmFzZV9uaSk7CisJcmV0dXJuIGVycjsKK30KKworI2VuZGlmCS8qIE5URlNfUlcgKi8KKworLyoqCisgKiBudGZzX2FvcHMgLSBnZW5lcmFsIGFkZHJlc3Mgc3BhY2Ugb3BlcmF0aW9ucyBmb3IgaW5vZGVzIGFuZCBhdHRyaWJ1dGVzCisgKi8KK3N0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgbnRmc19hb3BzID0geworCS5yZWFkcGFnZQk9IG50ZnNfcmVhZHBhZ2UsCS8qIEZpbGwgcGFnZSB3aXRoIGRhdGEuICovCisJLnN5bmNfcGFnZQk9IGJsb2NrX3N5bmNfcGFnZSwJLyogQ3VycmVudGx5LCBqdXN0IHVucGx1Z3MgdGhlCisJCQkJCQkgICBkaXNrIHJlcXVlc3QgcXVldWUuICovCisjaWZkZWYgTlRGU19SVworCS53cml0ZXBhZ2UJPSBudGZzX3dyaXRlcGFnZSwJLyogV3JpdGUgZGlydHkgcGFnZSB0byBkaXNrLiAqLworCS5wcmVwYXJlX3dyaXRlCT0gbnRmc19wcmVwYXJlX3dyaXRlLAkvKiBQcmVwYXJlIHBhZ2UgYW5kIGJ1ZmZlcnMKKwkJCQkJCSAgIHJlYWR5IHRvIHJlY2VpdmUgZGF0YS4gKi8KKwkuY29tbWl0X3dyaXRlCT0gbnRmc19jb21taXRfd3JpdGUsCS8qIENvbW1pdCByZWNlaXZlZCBkYXRhLiAqLworI2VuZGlmIC8qIE5URlNfUlcgKi8KK307CisKKy8qKgorICogbnRmc19tc3RfYW9wcyAtIGdlbmVyYWwgYWRkcmVzcyBzcGFjZSBvcGVyYXRpb25zIGZvciBtc3QgcHJvdGVjdGVlZCBpbm9kZXMKKyAqCQkgICBhbmQgYXR0cmlidXRlcworICovCitzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIG50ZnNfbXN0X2FvcHMgPSB7CisJLnJlYWRwYWdlCT0gbnRmc19yZWFkcGFnZSwJLyogRmlsbCBwYWdlIHdpdGggZGF0YS4gKi8KKwkuc3luY19wYWdlCT0gYmxvY2tfc3luY19wYWdlLAkvKiBDdXJyZW50bHksIGp1c3QgdW5wbHVncyB0aGUKKwkJCQkJCSAgIGRpc2sgcmVxdWVzdCBxdWV1ZS4gKi8KKyNpZmRlZiBOVEZTX1JXCisJLndyaXRlcGFnZQk9IG50ZnNfd3JpdGVwYWdlLAkvKiBXcml0ZSBkaXJ0eSBwYWdlIHRvIGRpc2suICovCisJLnNldF9wYWdlX2RpcnR5CT0gX19zZXRfcGFnZV9kaXJ0eV9ub2J1ZmZlcnMsCS8qIFNldCB0aGUgcGFnZSBkaXJ0eQorCQkJCQkJICAgd2l0aG91dCB0b3VjaGluZyB0aGUgYnVmZmVycworCQkJCQkJICAgYmVsb25naW5nIHRvIHRoZSBwYWdlLiAqLworI2VuZGlmIC8qIE5URlNfUlcgKi8KK307CisKKyNpZmRlZiBOVEZTX1JXCisKKy8qKgorICogbWFya19udGZzX3JlY29yZF9kaXJ0eSAtIG1hcmsgYW4gbnRmcyByZWNvcmQgZGlydHkKKyAqIEBwYWdlOglwYWdlIGNvbnRhaW5pbmcgdGhlIG50ZnMgcmVjb3JkIHRvIG1hcmsgZGlydHkKKyAqIEBvZnM6CWJ5dGUgb2Zmc2V0IHdpdGhpbiBAcGFnZSBhdCB3aGljaCB0aGUgbnRmcyByZWNvcmQgYmVnaW5zCisgKgorICogU2V0IHRoZSBidWZmZXJzIGFuZCB0aGUgcGFnZSBpbiB3aGljaCB0aGUgbnRmcyByZWNvcmQgaXMgbG9jYXRlZCBkaXJ0eS4KKyAqCisgKiBUaGUgbGF0dGVyIGFsc28gbWFya3MgdGhlIHZmcyBpbm9kZSB0aGUgbnRmcyByZWNvcmQgYmVsb25ncyB0byBkaXJ0eQorICogKElfRElSVFlfUEFHRVMgb25seSkuCisgKgorICogSWYgdGhlIHBhZ2UgZG9lcyBub3QgaGF2ZSBidWZmZXJzLCB3ZSBjcmVhdGUgdGhlbSBhbmQgc2V0IHRoZW0gdXB0b2RhdGUuCisgKiBUaGUgcGFnZSBtYXkgbm90IGJlIGxvY2tlZCB3aGljaCBpcyB3aHkgd2UgbmVlZCB0byBoYW5kbGUgdGhlIGJ1ZmZlcnMgdW5kZXIKKyAqIHRoZSBtYXBwaW5nLT5wcml2YXRlX2xvY2suICBPbmNlIHRoZSBidWZmZXJzIGFyZSBtYXJrZWQgZGlydHkgd2Ugbm8gbG9uZ2VyCisgKiBuZWVkIHRoZSBsb2NrIHNpbmNlIHRyeV90b19mcmVlX2J1ZmZlcnMoKSBkb2VzIG5vdCBmcmVlIGRpcnR5IGJ1ZmZlcnMuCisgKi8KK3ZvaWQgbWFya19udGZzX3JlY29yZF9kaXJ0eShzdHJ1Y3QgcGFnZSAqcGFnZSwgY29uc3QgdW5zaWduZWQgaW50IG9mcykgeworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gcGFnZS0+bWFwcGluZzsKKwludGZzX2lub2RlICpuaSA9IE5URlNfSShtYXBwaW5nLT5ob3N0KTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqaGVhZCwgKmJ1ZmZlcnNfdG9fZnJlZSA9IE5VTEw7CisJdW5zaWduZWQgaW50IGVuZCwgYmhfc2l6ZSwgYmhfb2ZzOworCisJQlVHX09OKCFQYWdlVXB0b2RhdGUocGFnZSkpOworCWVuZCA9IG9mcyArIG5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplOworCWJoX3NpemUgPSAxIDw8IFZGU19JKG5pKS0+aV9ibGtiaXRzOworCXNwaW5fbG9jaygmbWFwcGluZy0+cHJpdmF0ZV9sb2NrKTsKKwlpZiAodW5saWtlbHkoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpKSB7CisJCXNwaW5fdW5sb2NrKCZtYXBwaW5nLT5wcml2YXRlX2xvY2spOworCQliaCA9IGhlYWQgPSBhbGxvY19wYWdlX2J1ZmZlcnMocGFnZSwgYmhfc2l6ZSwgMSk7CisJCXNwaW5fbG9jaygmbWFwcGluZy0+cHJpdmF0ZV9sb2NrKTsKKwkJaWYgKGxpa2VseSghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkpIHsKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqdGFpbDsKKworCQkJZG8geworCQkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQkJCXRhaWwgPSBiaDsKKwkJCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKKwkJCX0gd2hpbGUgKGJoKTsKKwkJCXRhaWwtPmJfdGhpc19wYWdlID0gaGVhZDsKKwkJCWF0dGFjaF9wYWdlX2J1ZmZlcnMocGFnZSwgaGVhZCk7CisJCX0gZWxzZQorCQkJYnVmZmVyc190b19mcmVlID0gYmg7CisJfQorCWJoID0gaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwlkbyB7CisJCWJoX29mcyA9IGJoX29mZnNldChiaCk7CisJCWlmIChiaF9vZnMgKyBiaF9zaXplIDw9IG9mcykKKwkJCWNvbnRpbnVlOworCQlpZiAodW5saWtlbHkoYmhfb2ZzID49IGVuZCkpCisJCQlicmVhazsKKwkJc2V0X2J1ZmZlcl9kaXJ0eShiaCk7CisJfSB3aGlsZSAoKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKKwlzcGluX3VubG9jaygmbWFwcGluZy0+cHJpdmF0ZV9sb2NrKTsKKwlfX3NldF9wYWdlX2RpcnR5X25vYnVmZmVycyhwYWdlKTsKKwlpZiAodW5saWtlbHkoYnVmZmVyc190b19mcmVlKSkgeworCQlkbyB7CisJCQliaCA9IGJ1ZmZlcnNfdG9fZnJlZS0+Yl90aGlzX3BhZ2U7CisJCQlmcmVlX2J1ZmZlcl9oZWFkKGJ1ZmZlcnNfdG9fZnJlZSk7CisJCQlidWZmZXJzX3RvX2ZyZWUgPSBiaDsKKwkJfSB3aGlsZSAoYnVmZmVyc190b19mcmVlKTsKKwl9Cit9CisKKyNlbmRpZiAvKiBOVEZTX1JXICovCmRpZmYgLS1naXQgYS9mcy9udGZzL2FvcHMuaCBiL2ZzL250ZnMvYW9wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNzRlNjYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL2FvcHMuaApAQCAtMCwwICsxLDEwOSBAQAorLyoqCisgKiBhb3BzLmggLSBEZWZpbmVzIGZvciBOVEZTIGtlcm5lbCBhZGRyZXNzIHNwYWNlIG9wZXJhdGlvbnMgYW5kIHBhZ2UgY2FjaGUKKyAqCSAgICBoYW5kbGluZy4gIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqIENvcHlyaWdodCAoYykgMjAwMiBSaWNoYXJkIFJ1c3NvbgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX0xJTlVYX05URlNfQU9QU19ICisjZGVmaW5lIF9MSU5VWF9OVEZTX0FPUFNfSAorCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisKKyNpbmNsdWRlICJpbm9kZS5oIgorCisvKioKKyAqIG50ZnNfdW5tYXBfcGFnZSAtIHJlbGVhc2UgYSBwYWdlIHRoYXQgd2FzIG1hcHBlZCB1c2luZyBudGZzX21hcF9wYWdlKCkKKyAqIEBwYWdlOgl0aGUgcGFnZSB0byByZWxlYXNlCisgKgorICogVW5waW4sIHVubWFwIGFuZCByZWxlYXNlIGEgcGFnZSB0aGF0IHdhcyBvYnRhaW5lZCBmcm9tIG50ZnNfbWFwX3BhZ2UoKS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIG50ZnNfdW5tYXBfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlrdW5tYXAocGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworfQorCisvKioKKyAqIG50ZnNfbWFwX3BhZ2UgLSBtYXAgYSBwYWdlIGludG8gYWNjZXNzaWJsZSBtZW1vcnksIHJlYWRpbmcgaXQgaWYgbmVjZXNzYXJ5CisgKiBAbWFwcGluZzoJYWRkcmVzcyBzcGFjZSBmb3Igd2hpY2ggdG8gb2J0YWluIHRoZSBwYWdlCisgKiBAaW5kZXg6CWluZGV4IGludG8gdGhlIHBhZ2UgY2FjaGUgZm9yIEBtYXBwaW5nIG9mIHRoZSBwYWdlIHRvIG1hcAorICoKKyAqIFJlYWQgYSBwYWdlIGZyb20gdGhlIHBhZ2UgY2FjaGUgb2YgdGhlIGFkZHJlc3Mgc3BhY2UgQG1hcHBpbmcgYXQgcG9zaXRpb24KKyAqIEBpbmRleCwgd2hlcmUgQGluZGV4IGlzIGluIHVuaXRzIG9mIFBBR0VfQ0FDSEVfU0laRSwgYW5kIG5vdCBpbiBieXRlcy4KKyAqCisgKiBJZiB0aGUgcGFnZSBpcyBub3QgaW4gbWVtb3J5IGl0IGlzIGxvYWRlZCBmcm9tIGRpc2sgZmlyc3QgdXNpbmcgdGhlIHJlYWRwYWdlCisgKiBtZXRob2QgZGVmaW5lZCBpbiB0aGUgYWRkcmVzcyBzcGFjZSBvcGVyYXRpb25zIG9mIEBtYXBwaW5nIGFuZCB0aGUgcGFnZSBpcworICogYWRkZWQgdG8gdGhlIHBhZ2UgY2FjaGUgb2YgQG1hcHBpbmcgaW4gdGhlIHByb2Nlc3MuCisgKgorICogSWYgdGhlIHBhZ2UgYmVsb25ncyB0byBhbiBtc3QgcHJvdGVjdGVkIGF0dHJpYnV0ZSBhbmQgaXQgaXMgbWFya2VkIGFzIHN1Y2gKKyAqIGluIGl0cyBudGZzIGlub2RlIChOSW5vTXN0UHJvdGVjdGVkKCkpIHRoZSBtc3QgZml4dXBzIGFyZSBhcHBsaWVkIGJ1dCBubworICogZXJyb3IgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLiAgVGhpcyBtZWFucyB0aGUgY2FsbGVyIGhhcyB0byB2ZXJpZnkgd2hldGhlcgorICogdGhlIG50ZnMgcmVjb3JkKHMpIGNvbnRhaW5lZCBpbiB0aGUgcGFnZSBhcmUgdmFsaWQgb3Igbm90IHVzaW5nIG9uZSBvZiB0aGUKKyAqIG50ZnNfaXNfWFhYWF9yZWNvcmR7LHB9KCkgbWFjcm9zLCB3aGVyZSBYWFhYIGlzIHRoZSByZWNvcmQgdHlwZSB5b3UgYXJlCisgKiBleHBlY3RpbmcgdG8gc2VlLiAgKEZvciBkZXRhaWxzIG9mIHRoZSBtYWNyb3MsIHNlZSBmcy9udGZzL2xheW91dC5oLikKKyAqCisgKiBJZiB0aGUgcGFnZSBpcyBpbiBoaWdoIG1lbW9yeSBpdCBpcyBtYXBwZWQgaW50byBtZW1vcnkgZGlyZWN0bHkgYWRkcmVzc2libGUKKyAqIGJ5IHRoZSBrZXJuZWwuCisgKgorICogRmluYWxseSB0aGUgcGFnZSBjb3VudCBpcyBpbmNyZW1lbnRlZCwgdGh1cyBwaW5uaW5nIHRoZSBwYWdlIGludG8gcGxhY2UuCisgKgorICogVGhlIGFib3ZlIG1lYW5zIHRoYXQgcGFnZV9hZGRyZXNzKHBhZ2UpIGNhbiBiZSB1c2VkIG9uIGFsbCBwYWdlcyBvYnRhaW5lZAorICogd2l0aCBudGZzX21hcF9wYWdlKCkgdG8gZ2V0IHRoZSBrZXJuZWwgdmlydHVhbCBhZGRyZXNzIG9mIHRoZSBwYWdlLgorICoKKyAqIFdoZW4gZmluaXNoZWQgd2l0aCB0aGUgcGFnZSwgdGhlIGNhbGxlciBoYXMgdG8gY2FsbCBudGZzX3VubWFwX3BhZ2UoKSB0bworICogdW5waW4sIHVubWFwIGFuZCByZWxlYXNlIHRoZSBwYWdlLgorICoKKyAqIE5vdGUgdGhpcyBkb2VzIG5vdCBncmFudCBleGNsdXNpdmUgYWNjZXNzLiBJZiBzdWNoIGlzIGRlc2lyZWQsIHRoZSBjYWxsZXIKKyAqIG11c3QgcHJvdmlkZSBpdCBpbmRlcGVuZGVudGx5IG9mIHRoZSBudGZzX3t1bn1tYXBfcGFnZSgpIGNhbGxzIGJ5IHVzaW5nCisgKiBhIHtyd199c2VtYXBob3JlIG9yIG90aGVyIG1lYW5zIG9mIHNlcmlhbGl6YXRpb24uIEEgc3BpbiBsb2NrIGNhbm5vdCBiZQorICogdXNlZCBhcyBudGZzX21hcF9wYWdlKCkgY2FuIGJsb2NrLgorICoKKyAqIFRoZSB1bmxvY2tlZCBhbmQgdXB0b2RhdGUgcGFnZSBpcyByZXR1cm5lZCBvbiBzdWNjZXNzIG9yIGFuIGVuY29kZWQgZXJyb3IKKyAqIG9uIGZhaWx1cmUuIENhbGxlciBoYXMgdG8gdGVzdCBmb3IgZXJyb3IgdXNpbmcgdGhlIElTX0VSUigpIG1hY3JvIG9uIHRoZQorICogcmV0dXJuIHZhbHVlLiBJZiB0aGF0IGV2YWx1YXRlcyB0byBUUlVFLCB0aGUgbmVnYXRpdmUgZXJyb3IgY29kZSBjYW4gYmUKKyAqIG9idGFpbmVkIHVzaW5nIFBUUl9FUlIoKSBvbiB0aGUgcmV0dXJuIHZhbHVlIG9mIG50ZnNfbWFwX3BhZ2UoKS4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqbnRmc19tYXBfcGFnZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJdW5zaWduZWQgbG9uZyBpbmRleCkKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHJlYWRfY2FjaGVfcGFnZShtYXBwaW5nLCBpbmRleCwKKwkJCShmaWxsZXJfdCopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlLCBOVUxMKTsKKworCWlmICghSVNfRVJSKHBhZ2UpKSB7CisJCXdhaXRfb25fcGFnZV9sb2NrZWQocGFnZSk7CisJCWttYXAocGFnZSk7CisJCWlmIChQYWdlVXB0b2RhdGUocGFnZSkgJiYgIVBhZ2VFcnJvcihwYWdlKSkKKwkJCXJldHVybiBwYWdlOworCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJCXJldHVybiBFUlJfUFRSKC1FSU8pOworCX0KKwlyZXR1cm4gcGFnZTsKK30KKworI2lmZGVmIE5URlNfUlcKKworZXh0ZXJuIHZvaWQgbWFya19udGZzX3JlY29yZF9kaXJ0eShzdHJ1Y3QgcGFnZSAqcGFnZSwgY29uc3QgdW5zaWduZWQgaW50IG9mcyk7CisKKyNlbmRpZiAvKiBOVEZTX1JXICovCisKKyNlbmRpZiAvKiBfTElOVVhfTlRGU19BT1BTX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvYXR0cmliLmMgYi9mcy9udGZzL2F0dHJpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZjdmOTAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL2F0dHJpYi5jCkBAIC0wLDAgKzEsMTI1OCBAQAorLyoqCisgKiBhdHRyaWIuYyAtIE5URlMgYXR0cmlidXRlIG9wZXJhdGlvbnMuICBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgUmljaGFyZCBSdXNzb24KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKworI2luY2x1ZGUgImF0dHJpYi5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAibGF5b3V0LmgiCisjaW5jbHVkZSAibWZ0LmgiCisjaW5jbHVkZSAibnRmcy5oIgorI2luY2x1ZGUgInR5cGVzLmgiCisKKy8qKgorICogbnRmc19tYXBfcnVubGlzdCAtIG1hcCAoYSBwYXJ0IG9mKSBhIHJ1bmxpc3Qgb2YgYW4gbnRmcyBpbm9kZQorICogQG5pOgkJbnRmcyBpbm9kZSBmb3Igd2hpY2ggdG8gbWFwIChwYXJ0IG9mKSBhIHJ1bmxpc3QKKyAqIEB2Y246CW1hcCBydW5saXN0IHBhcnQgY29udGFpbmluZyB0aGlzIHZjbgorICoKKyAqIE1hcCB0aGUgcGFydCBvZiBhIHJ1bmxpc3QgY29udGFpbmluZyB0aGUgQHZjbiBvZiB0aGUgbnRmcyBpbm9kZSBAbmkuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLgorICoKKyAqIExvY2tpbmc6IC0gVGhlIHJ1bmxpc3QgbXVzdCBiZSB1bmxvY2tlZCBvbiBlbnRyeSBhbmQgaXMgdW5sb2NrZWQgb24gcmV0dXJuLgorICoJICAgIC0gVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgbG9jayBmb3Igd3JpdGluZyBhbmQgbW9kaWZpZXMgdGhlIHJ1bmxpc3QuCisgKi8KK2ludCBudGZzX21hcF9ydW5saXN0KG50ZnNfaW5vZGUgKm5pLCBWQ04gdmNuKQoreworCW50ZnNfaW5vZGUgKmJhc2Vfbmk7CisJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eDsKKwlNRlRfUkVDT1JEICptcmVjOworCWludCBlcnIgPSAwOworCisJbnRmc19kZWJ1ZygiTWFwcGluZyBydW5saXN0IHBhcnQgY29udGFpbmluZyB2Y24gMHglbGx4LiIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXZjbik7CisKKwlpZiAoIU5Jbm9BdHRyKG5pKSkKKwkJYmFzZV9uaSA9IG5pOworCWVsc2UKKwkJYmFzZV9uaSA9IG5pLT5leHQuYmFzZV9udGZzX2lubzsKKworCW1yZWMgPSBtYXBfbWZ0X3JlY29yZChiYXNlX25pKTsKKwlpZiAoSVNfRVJSKG1yZWMpKQorCQlyZXR1cm4gUFRSX0VSUihtcmVjKTsKKwljdHggPSBudGZzX2F0dHJfZ2V0X3NlYXJjaF9jdHgoYmFzZV9uaSwgbXJlYyk7CisJaWYgKHVubGlrZWx5KCFjdHgpKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CisJZXJyID0gbnRmc19hdHRyX2xvb2t1cChuaS0+dHlwZSwgbmktPm5hbWUsIG5pLT5uYW1lX2xlbiwKKwkJCUNBU0VfU0VOU0lUSVZFLCB2Y24sIE5VTEwsIDAsIGN0eCk7CisJaWYgKHVubGlrZWx5KGVycikpCisJCWdvdG8gcHV0X2Vycl9vdXQ7CisKKwlkb3duX3dyaXRlKCZuaS0+cnVubGlzdC5sb2NrKTsKKwkvKiBNYWtlIHN1cmUgc29tZW9uZSBlbHNlIGRpZG4ndCBkbyB0aGUgd29yayB3aGlsZSB3ZSB3ZXJlIHNsZWVwaW5nLiAqLworCWlmIChsaWtlbHkobnRmc19ybF92Y25fdG9fbGNuKG5pLT5ydW5saXN0LnJsLCB2Y24pIDw9CisJCQlMQ05fUkxfTk9UX01BUFBFRCkpIHsKKwkJcnVubGlzdF9lbGVtZW50ICpybDsKKworCQlybCA9IG50ZnNfbWFwcGluZ19wYWlyc19kZWNvbXByZXNzKG5pLT52b2wsIGN0eC0+YXR0ciwKKwkJCQluaS0+cnVubGlzdC5ybCk7CisJCWlmIChJU19FUlIocmwpKQorCQkJZXJyID0gUFRSX0VSUihybCk7CisJCWVsc2UKKwkJCW5pLT5ydW5saXN0LnJsID0gcmw7CisJfQorCXVwX3dyaXRlKCZuaS0+cnVubGlzdC5sb2NrKTsKKworcHV0X2Vycl9vdXQ6CisJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CitlcnJfb3V0OgorCXVubWFwX21mdF9yZWNvcmQoYmFzZV9uaSk7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBudGZzX2ZpbmRfdmNuIC0gZmluZCBhIHZjbiBpbiB0aGUgcnVubGlzdCBkZXNjcmliZWQgYnkgYW4gbnRmcyBpbm9kZQorICogQG5pOgkJbnRmcyBpbm9kZSBkZXNjcmliaW5nIHRoZSBydW5saXN0IHRvIHNlYXJjaAorICogQHZjbjoJdmNuIHRvIGZpbmQKKyAqIEBuZWVkX3dyaXRlOglpZiBmYWxzZSwgbG9jayBmb3IgcmVhZGluZyBhbmQgaWYgdHJ1ZSwgbG9jayBmb3Igd3JpdGluZworICoKKyAqIEZpbmQgdGhlIHZpcnR1YWwgY2x1c3RlciBudW1iZXIgQHZjbiBpbiB0aGUgcnVubGlzdCBkZXNjcmliZWQgYnkgdGhlIG50ZnMKKyAqIGlub2RlIEBuaSBhbmQgcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBydW5saXN0IGVsZW1lbnQgY29udGFpbmluZyB0aGUgQHZjbi4KKyAqIFRoZSBydW5saXN0IGlzIGxlZnQgbG9ja2VkIGFuZCB0aGUgY2FsbGVyIGhhcyB0byB1bmxvY2sgaXQuICBJZiBAbmVlZF93cml0ZQorICogaXMgdHJ1ZSwgdGhlIHJ1bmxpc3QgaXMgbG9ja2VkIGZvciB3cml0aW5nIGFuZCBpZiBAbmVlZF93cml0ZSBpcyBmYWxzZSwgdGhlCisgKiBydW5saXN0IGlzIGxvY2tlZCBmb3IgcmVhZGluZy4gIEluIHRoZSBlcnJvciBjYXNlLCB0aGUgcnVubGlzdCBpcyBub3QgbGVmdAorICogbG9ja2VkLgorICoKKyAqIE5vdGUgeW91IG5lZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgbGNuIG9mIHRoZSByZXR1cm5lZCBydW5saXN0IGVsZW1lbnQKKyAqIGJlaW5nID49IDAgYW5kIExDTl9IT0xFLiAgSW4gdGhlIGxhdGVyIGNhc2UgeW91IGhhdmUgdG8gcmV0dXJuIHplcm9lcyBvbgorICogcmVhZCBhbmQgYWxsb2NhdGUgY2x1c3RlcnMgb24gd3JpdGUuCisgKgorICogUmV0dXJuIHRoZSBydW5saXN0IGVsZW1lbnQgY29udGFpbmluZyB0aGUgQHZjbiBvbiBzdWNjZXNzIGFuZAorICogRVJSX1BUUigtZXJybm8pIG9uIGVycm9yLiAgWW91IG5lZWQgdG8gdGVzdCB0aGUgcmV0dXJuIHZhbHVlIHdpdGggSVNfRVJSKCkKKyAqIHRvIGRlY2lkZSBpZiB0aGUgcmV0dXJuIGlzIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBhbmQgUFRSX0VSUigpIHRvIGdldCB0byB0aGUKKyAqIGVycm9yIGNvZGUgaWYgSVNfRVJSKCkgaXMgdHJ1ZS4KKyAqCisgKiBUaGUgcG9zc2libGUgZXJyb3IgcmV0dXJuIGNvZGVzIGFyZToKKyAqCS1FTk9FTlQgLSBObyBzdWNoIHZjbiBpbiB0aGUgcnVubGlzdCwgaS5lLiBAdmNuIGlzIG91dCBvZiBib3VuZHMuCisgKgktRU5PTUVNIC0gTm90IGVub3VnaCBtZW1vcnkgdG8gbWFwIHJ1bmxpc3QuCisgKgktRUlPCS0gQ3JpdGljYWwgZXJyb3IgKHJ1bmxpc3QvZmlsZSBpcyBjb3JydXB0LCBpL28gZXJyb3IsIGV0YykuCisgKgorICogTG9ja2luZzogLSBUaGUgcnVubGlzdCBtdXN0IGJlIHVubG9ja2VkIG9uIGVudHJ5LgorICoJICAgIC0gT24gZmFpbGluZyByZXR1cm4sIHRoZSBydW5saXN0IGlzIHVubG9ja2VkLgorICoJICAgIC0gT24gc3VjY2Vzc2Z1bCByZXR1cm4sIHRoZSBydW5saXN0IGlzIGxvY2tlZC4gIElmIEBuZWVkX3dyaXRlIHVzCisgKgkgICAgICB0cnVlLCBpdCBpcyBsb2NrZWQgZm9yIHdyaXRpbmcuICBPdGhlcndpc2UgaXMgaXMgbG9ja2VkIGZvcgorICoJICAgICAgcmVhZGluZy4KKyAqLworcnVubGlzdF9lbGVtZW50ICpudGZzX2ZpbmRfdmNuKG50ZnNfaW5vZGUgKm5pLCBjb25zdCBWQ04gdmNuLAorCQljb25zdCBCT09MIG5lZWRfd3JpdGUpCit7CisJcnVubGlzdF9lbGVtZW50ICpybDsKKwlpbnQgZXJyID0gMDsKKwlCT09MIGlzX3JldHJ5ID0gRkFMU0U7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3IgaV9pbm8gMHglbHgsIHZjbiAweCVsbHgsIGxvY2sgZm9yICVzaW5nLiIsCisJCQluaS0+bWZ0X25vLCAodW5zaWduZWQgbG9uZyBsb25nKXZjbiwKKwkJCSFuZWVkX3dyaXRlID8gInJlYWQiIDogIndyaXQiKTsKKwlCVUdfT04oIW5pKTsKKwlCVUdfT04oIU5Jbm9Ob25SZXNpZGVudChuaSkpOworCUJVR19PTih2Y24gPCAwKTsKK2xvY2tfcmV0cnlfcmVtYXA6CisJaWYgKCFuZWVkX3dyaXRlKQorCQlkb3duX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCWVsc2UKKwkJZG93bl93cml0ZSgmbmktPnJ1bmxpc3QubG9jayk7CisJcmwgPSBuaS0+cnVubGlzdC5ybDsKKwlpZiAobGlrZWx5KHJsICYmIHZjbiA+PSBybFswXS52Y24pKSB7CisJCXdoaWxlIChsaWtlbHkocmwtPmxlbmd0aCkpIHsKKwkJCWlmIChsaWtlbHkodmNuIDwgcmxbMV0udmNuKSkgeworCQkJCWlmIChsaWtlbHkocmwtPmxjbiA+PSBMQ05fSE9MRSkpIHsKKwkJCQkJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwkJCQkJcmV0dXJuIHJsOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJCXJsKys7CisJCX0KKwkJaWYgKGxpa2VseShybC0+bGNuICE9IExDTl9STF9OT1RfTUFQUEVEKSkgeworCQkJaWYgKGxpa2VseShybC0+bGNuID09IExDTl9FTk9FTlQpKQorCQkJCWVyciA9IC1FTk9FTlQ7CisJCQllbHNlCisJCQkJZXJyID0gLUVJTzsKKwkJfQorCX0KKwlpZiAoIW5lZWRfd3JpdGUpCisJCXVwX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCWVsc2UKKwkJdXBfd3JpdGUoJm5pLT5ydW5saXN0LmxvY2spOworCWlmICghZXJyICYmICFpc19yZXRyeSkgeworCQkvKgorCQkgKiBUaGUgQHZjbiBpcyBpbiBhbiB1bm1hcHBlZCByZWdpb24sIG1hcCB0aGUgcnVubGlzdCBhbmQKKwkJICogcmV0cnkuCisJCSAqLworCQllcnIgPSBudGZzX21hcF9ydW5saXN0KG5pLCB2Y24pOworCQlpZiAobGlrZWx5KCFlcnIpKSB7CisJCQlpc19yZXRyeSA9IFRSVUU7CisJCQlnb3RvIGxvY2tfcmV0cnlfcmVtYXA7CisJCX0KKwkJLyoKKwkJICogLUVJTlZBTCBhbmQgLUVOT0VOVCBjb21pbmcgZnJvbSBhIGZhaWxlZCBtYXBwaW5nIGF0dGVtcHQgYXJlCisJCSAqIGVxdWl2YWxlbnQgdG8gaS9vIGVycm9ycyBmb3IgdXMgYXMgdGhleSBzaG91bGQgbm90IGhhcHBlbiBpbgorCQkgKiBvdXIgY29kZSBwYXRocy4KKwkJICovCisJCWlmIChlcnIgPT0gLUVJTlZBTCB8fCBlcnIgPT0gLUVOT0VOVCkKKwkJCWVyciA9IC1FSU87CisJfSBlbHNlIGlmICghZXJyKQorCQllcnIgPSAtRUlPOworCW50ZnNfZXJyb3IobmktPnZvbC0+c2IsICJGYWlsZWQgd2l0aCBlcnJvciBjb2RlICVpLiIsIGVycik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworLyoqCisgKiBudGZzX2F0dHJfZmluZCAtIGZpbmQgKG5leHQpIGF0dHJpYnV0ZSBpbiBtZnQgcmVjb3JkCisgKiBAdHlwZToJYXR0cmlidXRlIHR5cGUgdG8gZmluZAorICogQG5hbWU6CWF0dHJpYnV0ZSBuYW1lIHRvIGZpbmQgKG9wdGlvbmFsLCBpLmUuIE5VTEwgbWVhbnMgZG9uJ3QgY2FyZSkKKyAqIEBuYW1lX2xlbjoJYXR0cmlidXRlIG5hbWUgbGVuZ3RoIChvbmx5IG5lZWRlZCBpZiBAbmFtZSBwcmVzZW50KQorICogQGljOgkJSUdOT1JFX0NBU0Ugb3IgQ0FTRV9TRU5TSVRJVkUgKGlnbm9yZWQgaWYgQG5hbWUgbm90IHByZXNlbnQpCisgKiBAdmFsOglhdHRyaWJ1dGUgdmFsdWUgdG8gZmluZCAob3B0aW9uYWwsIHJlc2lkZW50IGF0dHJpYnV0ZXMgb25seSkKKyAqIEB2YWxfbGVuOglhdHRyaWJ1dGUgdmFsdWUgbGVuZ3RoCisgKiBAY3R4OglzZWFyY2ggY29udGV4dCB3aXRoIG1mdCByZWNvcmQgYW5kIGF0dHJpYnV0ZSB0byBzZWFyY2ggZnJvbQorICoKKyAqIFlvdSBzaG91bGQgbm90IG5lZWQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5LiAgVXNlIG50ZnNfYXR0cl9sb29rdXAoKQorICogaW5zdGVhZC4KKyAqCisgKiBudGZzX2F0dHJfZmluZCgpIHRha2VzIGEgc2VhcmNoIGNvbnRleHQgQGN0eCBhcyBwYXJhbWV0ZXIgYW5kIHNlYXJjaGVzIHRoZQorICogbWZ0IHJlY29yZCBzcGVjaWZpZWQgYnkgQGN0eC0+bXJlYywgYmVnaW5uaW5nIGF0IEBjdHgtPmF0dHIsIGZvciBhbgorICogYXR0cmlidXRlIG9mIEB0eXBlLCBvcHRpb25hbGx5IEBuYW1lIGFuZCBAdmFsLgorICoKKyAqIElmIHRoZSBhdHRyaWJ1dGUgaXMgZm91bmQsIG50ZnNfYXR0cl9maW5kKCkgcmV0dXJucyAwIGFuZCBAY3R4LT5hdHRyIHdpbGwKKyAqIHBvaW50IHRvIHRoZSBmb3VuZCBhdHRyaWJ1dGUuCisgKgorICogSWYgdGhlIGF0dHJpYnV0ZSBpcyBub3QgZm91bmQsIG50ZnNfYXR0cl9maW5kKCkgcmV0dXJucyAtRU5PRU5UIGFuZAorICogQGN0eC0+YXR0ciB3aWxsIHBvaW50IHRvIHRoZSBhdHRyaWJ1dGUgYmVmb3JlIHdoaWNoIHRoZSBhdHRyaWJ1dGUgYmVpbmcKKyAqIHNlYXJjaGVkIGZvciB3b3VsZCBuZWVkIHRvIGJlIGluc2VydGVkIGlmIHN1Y2ggYW4gYWN0aW9uIHdlcmUgdG8gYmUgZGVzaXJlZC4KKyAqCisgKiBPbiBhY3R1YWwgZXJyb3IsIG50ZnNfYXR0cl9maW5kKCkgcmV0dXJucyAtRUlPLiAgSW4gdGhpcyBjYXNlIEBjdHgtPmF0dHIgaXMKKyAqIHVuZGVmaW5lZCBhbmQgaW4gcGFydGljdWxhciBkbyBub3QgcmVseSBvbiBpdCBub3QgY2hhbmdpbmcuCisgKgorICogSWYgQGN0eC0+aXNfZmlyc3QgaXMgVFJVRSwgdGhlIHNlYXJjaCBiZWdpbnMgd2l0aCBAY3R4LT5hdHRyIGl0c2VsZi4gIElmIGl0CisgKiBpcyBGQUxTRSwgdGhlIHNlYXJjaCBiZWdpbnMgYWZ0ZXIgQGN0eC0+YXR0ci4KKyAqCisgKiBJZiBAaWMgaXMgSUdOT1JFX0NBU0UsIHRoZSBAbmFtZSBjb21wYXJpc3NvbiBpcyBub3QgY2FzZSBzZW5zaXRpdmUgYW5kCisgKiBAY3R4LT5udGZzX2lubyBtdXN0IGJlIHNldCB0byB0aGUgbnRmcyBpbm9kZSB0byB3aGljaCB0aGUgbWZ0IHJlY29yZAorICogQGN0eC0+bXJlYyBiZWxvbmdzLiAgVGhpcyBpcyBzbyB3ZSBjYW4gZ2V0IGF0IHRoZSBudGZzIHZvbHVtZSBhbmQgaGVuY2UgYXQKKyAqIHRoZSB1cGNhc2UgdGFibGUuICBJZiBAaWMgaXMgQ0FTRV9TRU5TSVRJVkUsIHRoZSBjb21wYXJpc29uIGlzIGNhc2UKKyAqIHNlbnNpdGl2ZS4gIFdoZW4gQG5hbWUgaXMgcHJlc2VudCwgQG5hbWVfbGVuIGlzIHRoZSBAbmFtZSBsZW5ndGggaW4gVW5pY29kZQorICogY2hhcmFjdGVycy4KKyAqCisgKiBJZiBAbmFtZSBpcyBub3QgcHJlc2VudCAoTlVMTCksIHdlIGFzc3VtZSB0aGF0IHRoZSB1bm5hbWVkIGF0dHJpYnV0ZSBpcworICogYmVpbmcgc2VhcmNoZWQgZm9yLgorICoKKyAqIEZpbmFsbHksIHRoZSByZXNpZGVudCBhdHRyaWJ1dGUgdmFsdWUgQHZhbCBpcyBsb29rZWQgZm9yLCBpZiBwcmVzZW50LiAgSWYKKyAqIEB2YWwgaXMgbm90IHByZXNlbnQgKE5VTEwpLCBAdmFsX2xlbiBpcyBpZ25vcmVkLgorICoKKyAqIG50ZnNfYXR0cl9maW5kKCkgb25seSBzZWFyY2hlcyB0aGUgc3BlY2lmaWVkIG1mdCByZWNvcmQgYW5kIGl0IGlnbm9yZXMgdGhlCisgKiBwcmVzZW5jZSBvZiBhbiBhdHRyaWJ1dGUgbGlzdCBhdHRyaWJ1dGUgKHVubGVzcyBpdCBpcyB0aGUgb25lIGJlaW5nIHNlYXJjaGVkCisgKiBmb3IsIG9idmlvdXNseSkuICBJZiB5b3UgbmVlZCB0byB0YWtlIGF0dHJpYnV0ZSBsaXN0cyBpbnRvIGNvbnNpZGVyYXRpb24sCisgKiB1c2UgbnRmc19hdHRyX2xvb2t1cCgpIGluc3RlYWQgKHNlZSBiZWxvdykuICBUaGlzIGFsc28gbWVhbnMgdGhhdCB5b3UgY2Fubm90CisgKiB1c2UgbnRmc19hdHRyX2ZpbmQoKSB0byBzZWFyY2ggZm9yIGV4dGVudCByZWNvcmRzIG9mIG5vbi1yZXNpZGVudAorICogYXR0cmlidXRlcywgYXMgZXh0ZW50cyB3aXRoIGxvd2VzdF92Y24gIT0gMCBhcmUgdXN1YWxseSBkZXNjcmliZWQgYnkgdGhlCisgKiBhdHRyaWJ1dGUgbGlzdCBhdHRyaWJ1dGUgb25seS4gLSBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgZmlyc3QKKyAqIGV4dGVudCBpcyBvbmx5IGluIHRoZSBhdHRyaWJ1dGUgbGlzdCB3aGlsZSB0aGUgbGFzdCBleHRlbnQgaXMgaW4gdGhlIGJhc2UKKyAqIG1mdCByZWNvcmQsIHNvIGRvIG5vdCByZWx5IG9uIGJlaW5nIGFibGUgdG8gZmluZCB0aGUgZmlyc3QgZXh0ZW50IGluIHRoZQorICogYmFzZSBtZnQgcmVjb3JkLgorICoKKyAqIFdhcm5pbmc6IE5ldmVyIHVzZSBAdmFsIHdoZW4gbG9va2luZyBmb3IgYXR0cmlidXRlIHR5cGVzIHdoaWNoIGNhbiBiZQorICoJICAgIG5vbi1yZXNpZGVudCBhcyB0aGlzIG1vc3QgbGlrZWx5IHdpbGwgcmVzdWx0IGluIGEgY3Jhc2ghCisgKi8KK3N0YXRpYyBpbnQgbnRmc19hdHRyX2ZpbmQoY29uc3QgQVRUUl9UWVBFIHR5cGUsIGNvbnN0IG50ZnNjaGFyICpuYW1lLAorCQljb25zdCB1MzIgbmFtZV9sZW4sIGNvbnN0IElHTk9SRV9DQVNFX0JPT0wgaWMsCisJCWNvbnN0IHU4ICp2YWwsIGNvbnN0IHUzMiB2YWxfbGVuLCBudGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4KQoreworCUFUVFJfUkVDT1JEICphOworCW50ZnNfdm9sdW1lICp2b2wgPSBjdHgtPm50ZnNfaW5vLT52b2w7CisJbnRmc2NoYXIgKnVwY2FzZSA9IHZvbC0+dXBjYXNlOworCXUzMiB1cGNhc2VfbGVuID0gdm9sLT51cGNhc2VfbGVuOworCisJLyoKKwkgKiBJdGVyYXRlIG92ZXIgYXR0cmlidXRlcyBpbiBtZnQgcmVjb3JkIHN0YXJ0aW5nIGF0IEBjdHgtPmF0dHIsIG9yIHRoZQorCSAqIGF0dHJpYnV0ZSBmb2xsb3dpbmcgdGhhdCwgaWYgQGN0eC0+aXNfZmlyc3QgaXMgVFJVRS4KKwkgKi8KKwlpZiAoY3R4LT5pc19maXJzdCkgeworCQlhID0gY3R4LT5hdHRyOworCQljdHgtPmlzX2ZpcnN0ID0gRkFMU0U7CisJfSBlbHNlCisJCWEgPSAoQVRUUl9SRUNPUkQqKSgodTgqKWN0eC0+YXR0ciArCisJCQkJbGUzMl90b19jcHUoY3R4LT5hdHRyLT5sZW5ndGgpKTsKKwlmb3IgKDs7CWEgPSAoQVRUUl9SRUNPUkQqKSgodTgqKWEgKyBsZTMyX3RvX2NwdShhLT5sZW5ndGgpKSkgeworCQlpZiAoKHU4KilhIDwgKHU4KiljdHgtPm1yZWMgfHwgKHU4KilhID4gKHU4KiljdHgtPm1yZWMgKworCQkJCWxlMzJfdG9fY3B1KGN0eC0+bXJlYy0+Ynl0ZXNfYWxsb2NhdGVkKSkKKwkJCWJyZWFrOworCQljdHgtPmF0dHIgPSBhOworCQlpZiAodW5saWtlbHkobGUzMl90b19jcHUoYS0+dHlwZSkgPiBsZTMyX3RvX2NwdSh0eXBlKSB8fAorCQkJCWEtPnR5cGUgPT0gQVRfRU5EKSkKKwkJCXJldHVybiAtRU5PRU5UOworCQlpZiAodW5saWtlbHkoIWEtPmxlbmd0aCkpCisJCQlicmVhazsKKwkJaWYgKGEtPnR5cGUgIT0gdHlwZSkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBJZiBAbmFtZSBpcyBwcmVzZW50LCBjb21wYXJlIHRoZSB0d28gbmFtZXMuICBJZiBAbmFtZSBpcworCQkgKiBtaXNzaW5nLCBhc3N1bWUgd2Ugd2FudCBhbiB1bm5hbWVkIGF0dHJpYnV0ZS4KKwkJICovCisJCWlmICghbmFtZSkgeworCQkJLyogVGhlIHNlYXJjaCBmYWlsZWQgaWYgdGhlIGZvdW5kIGF0dHJpYnV0ZSBpcyBuYW1lZC4gKi8KKwkJCWlmIChhLT5uYW1lX2xlbmd0aCkKKwkJCQlyZXR1cm4gLUVOT0VOVDsKKwkJfSBlbHNlIGlmICghbnRmc19hcmVfbmFtZXNfZXF1YWwobmFtZSwgbmFtZV9sZW4sCisJCQkgICAgKG50ZnNjaGFyKikoKHU4KilhICsgbGUxNl90b19jcHUoYS0+bmFtZV9vZmZzZXQpKSwKKwkJCSAgICBhLT5uYW1lX2xlbmd0aCwgaWMsIHVwY2FzZSwgdXBjYXNlX2xlbikpIHsKKwkJCXJlZ2lzdGVyIGludCByYzsKKworCQkJcmMgPSBudGZzX2NvbGxhdGVfbmFtZXMobmFtZSwgbmFtZV9sZW4sCisJCQkJCShudGZzY2hhciopKCh1OCopYSArCisJCQkJCWxlMTZfdG9fY3B1KGEtPm5hbWVfb2Zmc2V0KSksCisJCQkJCWEtPm5hbWVfbGVuZ3RoLCAxLCBJR05PUkVfQ0FTRSwKKwkJCQkJdXBjYXNlLCB1cGNhc2VfbGVuKTsKKwkJCS8qCisJCQkgKiBJZiBAbmFtZSBjb2xsYXRlcyBiZWZvcmUgYS0+bmFtZSwgdGhlcmUgaXMgbm8KKwkJCSAqIG1hdGNoaW5nIGF0dHJpYnV0ZS4KKwkJCSAqLworCQkJaWYgKHJjID09IC0xKQorCQkJCXJldHVybiAtRU5PRU5UOworCQkJLyogSWYgdGhlIHN0cmluZ3MgYXJlIG5vdCBlcXVhbCwgY29udGludWUgc2VhcmNoLiAqLworCQkJaWYgKHJjKQorCQkJCWNvbnRpbnVlOworCQkJcmMgPSBudGZzX2NvbGxhdGVfbmFtZXMobmFtZSwgbmFtZV9sZW4sCisJCQkJCShudGZzY2hhciopKCh1OCopYSArCisJCQkJCWxlMTZfdG9fY3B1KGEtPm5hbWVfb2Zmc2V0KSksCisJCQkJCWEtPm5hbWVfbGVuZ3RoLCAxLCBDQVNFX1NFTlNJVElWRSwKKwkJCQkJdXBjYXNlLCB1cGNhc2VfbGVuKTsKKwkJCWlmIChyYyA9PSAtMSkKKwkJCQlyZXR1cm4gLUVOT0VOVDsKKwkJCWlmIChyYykKKwkJCQljb250aW51ZTsKKwkJfQorCQkvKgorCQkgKiBUaGUgbmFtZXMgbWF0Y2ggb3IgQG5hbWUgbm90IHByZXNlbnQgYW5kIGF0dHJpYnV0ZSBpcworCQkgKiB1bm5hbWVkLiAgSWYgbm8gQHZhbCBzcGVjaWZpZWQsIHdlIGhhdmUgZm91bmQgdGhlIGF0dHJpYnV0ZQorCQkgKiBhbmQgYXJlIGRvbmUuCisJCSAqLworCQlpZiAoIXZhbCkKKwkJCXJldHVybiAwOworCQkvKiBAdmFsIGlzIHByZXNlbnQ7IGNvbXBhcmUgdmFsdWVzLiAqLworCQllbHNlIHsKKwkJCXJlZ2lzdGVyIGludCByYzsKKworCQkJcmMgPSBtZW1jbXAodmFsLCAodTgqKWEgKyBsZTE2X3RvX2NwdSgKKwkJCQkJYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpLAorCQkJCQltaW5fdCh1MzIsIHZhbF9sZW4sIGxlMzJfdG9fY3B1KAorCQkJCQlhLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCkpKTsKKwkJCS8qCisJCQkgKiBJZiBAdmFsIGNvbGxhdGVzIGJlZm9yZSB0aGUgY3VycmVudCBhdHRyaWJ1dGUncworCQkJICogdmFsdWUsIHRoZXJlIGlzIG5vIG1hdGNoaW5nIGF0dHJpYnV0ZS4KKwkJCSAqLworCQkJaWYgKCFyYykgeworCQkJCXJlZ2lzdGVyIHUzMiBhdmw7CisKKwkJCQlhdmwgPSBsZTMyX3RvX2NwdSgKKwkJCQkJCWEtPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKTsKKwkJCQlpZiAodmFsX2xlbiA9PSBhdmwpCisJCQkJCXJldHVybiAwOworCQkJCWlmICh2YWxfbGVuIDwgYXZsKQorCQkJCQlyZXR1cm4gLUVOT0VOVDsKKwkJCX0gZWxzZSBpZiAocmMgPCAwKQorCQkJCXJldHVybiAtRU5PRU5UOworCQl9CisJfQorCW50ZnNfZXJyb3Iodm9sLT5zYiwgIklub2RlIGlzIGNvcnJ1cHQuICBSdW4gY2hrZHNrLiIpOworCU5Wb2xTZXRFcnJvcnModm9sKTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyoqCisgKiBsb2FkX2F0dHJpYnV0ZV9saXN0IC0gbG9hZCBhbiBhdHRyaWJ1dGUgbGlzdCBpbnRvIG1lbW9yeQorICogQHZvbDoJCW50ZnMgdm9sdW1lIGZyb20gd2hpY2ggdG8gcmVhZAorICogQHJ1bmxpc3Q6CQlydW5saXN0IG9mIHRoZSBhdHRyaWJ1dGUgbGlzdAorICogQGFsX3N0YXJ0OgkJZGVzdGluYXRpb24gYnVmZmVyCisgKiBAc2l6ZToJCXNpemUgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciBpbiBieXRlcworICogQGluaXRpYWxpemVkX3NpemU6CWluaXRpYWxpemVkIHNpemUgb2YgdGhlIGF0dHJpYnV0ZSBsaXN0CisgKgorICogV2FsayB0aGUgcnVubGlzdCBAcnVubGlzdCBhbmQgbG9hZCBhbGwgY2x1c3RlcnMgZnJvbSBpdCBjb3B5aW5nIHRoZW0gaW50bworICogdGhlIGxpbmVhciBidWZmZXIgQGFsLiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIHRvIEBhbCBpcyBAc2l6ZQorICogYnl0ZXMuIE5vdGUsIEBzaXplIGRvZXMgbm90IG5lZWQgdG8gYmUgYSBtdWx0aXBsZSBvZiB0aGUgY2x1c3RlciBzaXplLiBJZgorICogQGluaXRpYWxpemVkX3NpemUgaXMgbGVzcyB0aGFuIEBzaXplLCB0aGUgcmVnaW9uIGluIEBhbCBiZXR3ZWVuCisgKiBAaW5pdGlhbGl6ZWRfc2l6ZSBhbmQgQHNpemUgd2lsbCBiZSB6ZXJvZWQgYW5kIG5vdCByZWFkIGZyb20gZGlzay4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIG9yIC1lcnJubyBvbiBlcnJvci4KKyAqLworaW50IGxvYWRfYXR0cmlidXRlX2xpc3QobnRmc192b2x1bWUgKnZvbCwgcnVubGlzdCAqcnVubGlzdCwgdTggKmFsX3N0YXJ0LAorCQljb25zdCBzNjQgc2l6ZSwgY29uc3QgczY0IGluaXRpYWxpemVkX3NpemUpCit7CisJTENOIGxjbjsKKwl1OCAqYWwgPSBhbF9zdGFydDsKKwl1OCAqYWxfZW5kID0gYWwgKyBpbml0aWFsaXplZF9zaXplOworCXJ1bmxpc3RfZWxlbWVudCAqcmw7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiOworCXVuc2lnbmVkIGxvbmcgYmxvY2tfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGJsb2NrLCBtYXhfYmxvY2s7CisJaW50IGVyciA9IDA7CisJdW5zaWduZWQgY2hhciBibG9ja19zaXplX2JpdHM7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwlpZiAoIXZvbCB8fCAhcnVubGlzdCB8fCAhYWwgfHwgc2l6ZSA8PSAwIHx8IGluaXRpYWxpemVkX3NpemUgPCAwIHx8CisJCQlpbml0aWFsaXplZF9zaXplID4gc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFpbml0aWFsaXplZF9zaXplKSB7CisJCW1lbXNldChhbCwgMCwgc2l6ZSk7CisJCXJldHVybiAwOworCX0KKwlzYiA9IHZvbC0+c2I7CisJYmxvY2tfc2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKKwlibG9ja19zaXplX2JpdHMgPSBzYi0+c19ibG9ja3NpemVfYml0czsKKwlkb3duX3JlYWQoJnJ1bmxpc3QtPmxvY2spOworCXJsID0gcnVubGlzdC0+cmw7CisJLyogUmVhZCBhbGwgY2x1c3RlcnMgc3BlY2lmaWVkIGJ5IHRoZSBydW5saXN0IG9uZSBydW4gYXQgYSB0aW1lLiAqLworCXdoaWxlIChybC0+bGVuZ3RoKSB7CisJCWxjbiA9IG50ZnNfcmxfdmNuX3RvX2xjbihybCwgcmwtPnZjbik7CisJCW50ZnNfZGVidWcoIlJlYWRpbmcgdmNuID0gMHglbGx4LCBsY24gPSAweCVsbHguIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXJsLT52Y24sCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylsY24pOworCQkvKiBUaGUgYXR0cmlidXRlIGxpc3QgY2Fubm90IGJlIHNwYXJzZS4gKi8KKwkJaWYgKGxjbiA8IDApIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICJudGZzX3JsX3Zjbl90b19sY24oKSBmYWlsZWQuICBDYW5ub3QgIgorCQkJCQkicmVhZCBhdHRyaWJ1dGUgbGlzdC4iKTsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCQlibG9jayA9IGxjbiA8PCB2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzID4+IGJsb2NrX3NpemVfYml0czsKKwkJLyogUmVhZCB0aGUgcnVuIGZyb20gZGV2aWNlIGluIGNodW5rcyBvZiBibG9ja19zaXplIGJ5dGVzLiAqLworCQltYXhfYmxvY2sgPSBibG9jayArIChybC0+bGVuZ3RoIDw8IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMgPj4KKwkJCQlibG9ja19zaXplX2JpdHMpOworCQludGZzX2RlYnVnKCJtYXhfYmxvY2sgPSAweCVseC4iLCBtYXhfYmxvY2spOworCQlkbyB7CisJCQludGZzX2RlYnVnKCJSZWFkaW5nIGJsb2NrID0gMHglbHguIiwgYmxvY2spOworCQkJYmggPSBzYl9icmVhZChzYiwgYmxvY2spOworCQkJaWYgKCFiaCkgeworCQkJCW50ZnNfZXJyb3Ioc2IsICJzYl9icmVhZCgpIGZhaWxlZC4gQ2Fubm90ICIKKwkJCQkJCSJyZWFkIGF0dHJpYnV0ZSBsaXN0LiIpOworCQkJCWdvdG8gZXJyX291dDsKKwkJCX0KKwkJCWlmIChhbCArIGJsb2NrX3NpemUgPj0gYWxfZW5kKQorCQkJCWdvdG8gZG9fZmluYWw7CisJCQltZW1jcHkoYWwsIGJoLT5iX2RhdGEsIGJsb2NrX3NpemUpOworCQkJYnJlbHNlKGJoKTsKKwkJCWFsICs9IGJsb2NrX3NpemU7CisJCX0gd2hpbGUgKCsrYmxvY2sgPCBtYXhfYmxvY2spOworCQlybCsrOworCX0KKwlpZiAoaW5pdGlhbGl6ZWRfc2l6ZSA8IHNpemUpIHsKK2luaXRpYWxpemU6CisJCW1lbXNldChhbF9zdGFydCArIGluaXRpYWxpemVkX3NpemUsIDAsIHNpemUgLSBpbml0aWFsaXplZF9zaXplKTsKKwl9Citkb25lOgorCXVwX3JlYWQoJnJ1bmxpc3QtPmxvY2spOworCXJldHVybiBlcnI7Citkb19maW5hbDoKKwlpZiAoYWwgPCBhbF9lbmQpIHsKKwkJLyoKKwkJICogUGFydGlhbCBibG9jay4KKwkJICoKKwkJICogTm90ZTogVGhlIGF0dHJpYnV0ZSBsaXN0IGNhbiBiZSBzbWFsbGVyIHRoYW4gaXRzIGFsbG9jYXRpb24KKwkJICogYnkgbXVsdGlwbGUgY2x1c3RlcnMuICBUaGlzIGhhcyBiZWVuIGVuY291bnRlcmVkIGJ5IGF0IGxlYXN0CisJCSAqIHR3byBwZW9wbGUgcnVubmluZyBXaW5kb3dzIFhQLCB0aHVzIHdlIGNhbm5vdCBkbyBhbnkKKwkJICogdHJ1bmNhdGlvbiBzYW5pdHkgY2hlY2tpbmcgaGVyZS4gKEFJQSkKKwkJICovCisJCW1lbWNweShhbCwgYmgtPmJfZGF0YSwgYWxfZW5kIC0gYWwpOworCQlicmVsc2UoYmgpOworCQlpZiAoaW5pdGlhbGl6ZWRfc2l6ZSA8IHNpemUpCisJCQlnb3RvIGluaXRpYWxpemU7CisJCWdvdG8gZG9uZTsKKwl9CisJYnJlbHNlKGJoKTsKKwkvKiBSZWFsIG92ZXJmbG93ISAqLworCW50ZnNfZXJyb3Ioc2IsICJBdHRyaWJ1dGUgbGlzdCBidWZmZXIgb3ZlcmZsb3cuIFJlYWQgYXR0cmlidXRlIGxpc3QgIgorCQkJImlzIHRydW5jYXRlZC4iKTsKK2Vycl9vdXQ6CisJZXJyID0gLUVJTzsKKwlnb3RvIGRvbmU7Cit9CisKKy8qKgorICogbnRmc19leHRlcm5hbF9hdHRyX2ZpbmQgLSBmaW5kIGFuIGF0dHJpYnV0ZSBpbiB0aGUgYXR0cmlidXRlIGxpc3Qgb2YgYW4gaW5vZGUKKyAqIEB0eXBlOglhdHRyaWJ1dGUgdHlwZSB0byBmaW5kCisgKiBAbmFtZToJYXR0cmlidXRlIG5hbWUgdG8gZmluZCAob3B0aW9uYWwsIGkuZS4gTlVMTCBtZWFucyBkb24ndCBjYXJlKQorICogQG5hbWVfbGVuOglhdHRyaWJ1dGUgbmFtZSBsZW5ndGggKG9ubHkgbmVlZGVkIGlmIEBuYW1lIHByZXNlbnQpCisgKiBAaWM6CQlJR05PUkVfQ0FTRSBvciBDQVNFX1NFTlNJVElWRSAoaWdub3JlZCBpZiBAbmFtZSBub3QgcHJlc2VudCkKKyAqIEBsb3dlc3RfdmNuOglsb3dlc3QgdmNuIHRvIGZpbmQgKG9wdGlvbmFsLCBub24tcmVzaWRlbnQgYXR0cmlidXRlcyBvbmx5KQorICogQHZhbDoJYXR0cmlidXRlIHZhbHVlIHRvIGZpbmQgKG9wdGlvbmFsLCByZXNpZGVudCBhdHRyaWJ1dGVzIG9ubHkpCisgKiBAdmFsX2xlbjoJYXR0cmlidXRlIHZhbHVlIGxlbmd0aAorICogQGN0eDoJc2VhcmNoIGNvbnRleHQgd2l0aCBtZnQgcmVjb3JkIGFuZCBhdHRyaWJ1dGUgdG8gc2VhcmNoIGZyb20KKyAqCisgKiBZb3Ugc2hvdWxkIG5vdCBuZWVkIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBkaXJlY3RseS4gIFVzZSBudGZzX2F0dHJfbG9va3VwKCkKKyAqIGluc3RlYWQuCisgKgorICogRmluZCBhbiBhdHRyaWJ1dGUgYnkgc2VhcmNoaW5nIHRoZSBhdHRyaWJ1dGUgbGlzdCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcKKyAqIGF0dHJpYnV0ZSBsaXN0IGVudHJ5LiAgSGF2aW5nIGZvdW5kIHRoZSBlbnRyeSwgbWFwIHRoZSBtZnQgcmVjb3JkIGlmIHRoZQorICogYXR0cmlidXRlIGlzIGluIGEgZGlmZmVyZW50IG1mdCByZWNvcmQvaW5vZGUsIG50ZnNfYXR0cl9maW5kKCkgdGhlIGF0dHJpYnV0ZQorICogaW4gdGhlcmUgYW5kIHJldHVybiBpdC4KKyAqCisgKiBPbiBmaXJzdCBzZWFyY2ggQGN0eC0+bnRmc19pbm8gbXVzdCBiZSB0aGUgYmFzZSBtZnQgcmVjb3JkIGFuZCBAY3R4IG11c3QKKyAqIGhhdmUgYmVlbiBvYnRhaW5lZCBmcm9tIGEgY2FsbCB0byBudGZzX2F0dHJfZ2V0X3NlYXJjaF9jdHgoKS4gIE9uIHN1YnNlcXVlbnQKKyAqIGNhbGxzIEBjdHgtPm50ZnNfaW5vIGNhbiBiZSBhbnkgZXh0ZW50IGlub2RlLCB0b28gKEBjdHgtPmJhc2VfbnRmc19pbm8gaXMKKyAqIHRoZW4gdGhlIGJhc2UgaW5vZGUpLgorICoKKyAqIEFmdGVyIGZpbmlzaGluZyB3aXRoIHRoZSBhdHRyaWJ1dGUvbWZ0IHJlY29yZCB5b3UgbmVlZCB0byBjYWxsCisgKiBudGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoKSB0byBjbGVhbnVwIHRoZSBzZWFyY2ggY29udGV4dCAodW5tYXBwaW5nIGFueQorICogbWFwcGVkIGlub2RlcywgZXRjKS4KKyAqCisgKiBJZiB0aGUgYXR0cmlidXRlIGlzIGZvdW5kLCBudGZzX2V4dGVybmFsX2F0dHJfZmluZCgpIHJldHVybnMgMCBhbmQKKyAqIEBjdHgtPmF0dHIgd2lsbCBwb2ludCB0byB0aGUgZm91bmQgYXR0cmlidXRlLiAgQGN0eC0+bXJlYyB3aWxsIHBvaW50IHRvIHRoZQorICogbWZ0IHJlY29yZCBpbiB3aGljaCBAY3R4LT5hdHRyIGlzIGxvY2F0ZWQgYW5kIEBjdHgtPmFsX2VudHJ5IHdpbGwgcG9pbnQgdG8KKyAqIHRoZSBhdHRyaWJ1dGUgbGlzdCBlbnRyeSBmb3IgdGhlIGF0dHJpYnV0ZS4KKyAqCisgKiBJZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBmb3VuZCwgbnRmc19leHRlcm5hbF9hdHRyX2ZpbmQoKSByZXR1cm5zIC1FTk9FTlQgYW5kCisgKiBAY3R4LT5hdHRyIHdpbGwgcG9pbnQgdG8gdGhlIGF0dHJpYnV0ZSBpbiB0aGUgYmFzZSBtZnQgcmVjb3JkIGJlZm9yZSB3aGljaAorICogdGhlIGF0dHJpYnV0ZSBiZWluZyBzZWFyY2hlZCBmb3Igd291bGQgbmVlZCB0byBiZSBpbnNlcnRlZCBpZiBzdWNoIGFuIGFjdGlvbgorICogd2VyZSB0byBiZSBkZXNpcmVkLiAgQGN0eC0+bXJlYyB3aWxsIHBvaW50IHRvIHRoZSBtZnQgcmVjb3JkIGluIHdoaWNoCisgKiBAY3R4LT5hdHRyIGlzIGxvY2F0ZWQgYW5kIEBjdHgtPmFsX2VudHJ5IHdpbGwgcG9pbnQgdG8gdGhlIGF0dHJpYnV0ZSBsaXN0CisgKiBlbnRyeSBvZiB0aGUgYXR0cmlidXRlIGJlZm9yZSB3aGljaCB0aGUgYXR0cmlidXRlIGJlaW5nIHNlYXJjaGVkIGZvciB3b3VsZAorICogbmVlZCB0byBiZSBpbnNlcnRlZCBpZiBzdWNoIGFuIGFjdGlvbiB3ZXJlIHRvIGJlIGRlc2lyZWQuCisgKgorICogVGh1cyB0byBpbnNlcnQgdGhlIG5vdCBmb3VuZCBhdHRyaWJ1dGUsIG9uZSB3YW50cyB0byBhZGQgdGhlIGF0dHJpYnV0ZSB0bworICogQGN0eC0+bXJlYyAodGhlIGJhc2UgbWZ0IHJlY29yZCkgYW5kIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggc3BhY2UsIHRoZQorICogYXR0cmlidXRlIHNob3VsZCBiZSBwbGFjZWQgaW4gYSBuZXdseSBhbGxvY2F0ZWQgZXh0ZW50IG1mdCByZWNvcmQuICBUaGUKKyAqIGF0dHJpYnV0ZSBsaXN0IGVudHJ5IGZvciB0aGUgaW5zZXJ0ZWQgYXR0cmlidXRlIHNob3VsZCBiZSBpbnNlcnRlZCBpbiB0aGUKKyAqIGF0dHJpYnV0ZSBsaXN0IGF0dHJpYnV0ZSBhdCBAY3R4LT5hbF9lbnRyeS4KKyAqCisgKiBPbiBhY3R1YWwgZXJyb3IsIG50ZnNfZXh0ZXJuYWxfYXR0cl9maW5kKCkgcmV0dXJucyAtRUlPLiAgSW4gdGhpcyBjYXNlCisgKiBAY3R4LT5hdHRyIGlzIHVuZGVmaW5lZCBhbmQgaW4gcGFydGljdWxhciBkbyBub3QgcmVseSBvbiBpdCBub3QgY2hhbmdpbmcuCisgKi8KK3N0YXRpYyBpbnQgbnRmc19leHRlcm5hbF9hdHRyX2ZpbmQoY29uc3QgQVRUUl9UWVBFIHR5cGUsCisJCWNvbnN0IG50ZnNjaGFyICpuYW1lLCBjb25zdCB1MzIgbmFtZV9sZW4sCisJCWNvbnN0IElHTk9SRV9DQVNFX0JPT0wgaWMsIGNvbnN0IFZDTiBsb3dlc3RfdmNuLAorCQljb25zdCB1OCAqdmFsLCBjb25zdCB1MzIgdmFsX2xlbiwgbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eCkKK3sKKwludGZzX2lub2RlICpiYXNlX25pLCAqbmk7CisJbnRmc192b2x1bWUgKnZvbDsKKwlBVFRSX0xJU1RfRU5UUlkgKmFsX2VudHJ5LCAqbmV4dF9hbF9lbnRyeTsKKwl1OCAqYWxfc3RhcnQsICphbF9lbmQ7CisJQVRUUl9SRUNPUkQgKmE7CisJbnRmc2NoYXIgKmFsX25hbWU7CisJdTMyIGFsX25hbWVfbGVuOworCWludCBlcnIgPSAwOworCXN0YXRpYyBjb25zdCBjaGFyICplcyA9ICIgVW5tb3VudCBhbmQgcnVuIGNoa2Rzay4iOworCisJbmkgPSBjdHgtPm50ZnNfaW5vOworCWJhc2VfbmkgPSBjdHgtPmJhc2VfbnRmc19pbm87CisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIGlub2RlIDB4JWx4LCB0eXBlIDB4JXguIiwgbmktPm1mdF9ubywgdHlwZSk7CisJaWYgKCFiYXNlX25pKSB7CisJCS8qIEZpcnN0IGNhbGwgaGFwcGVucyB3aXRoIHRoZSBiYXNlIG1mdCByZWNvcmQuICovCisJCWJhc2VfbmkgPSBjdHgtPmJhc2VfbnRmc19pbm8gPSBjdHgtPm50ZnNfaW5vOworCQljdHgtPmJhc2VfbXJlYyA9IGN0eC0+bXJlYzsKKwl9CisJaWYgKG5pID09IGJhc2VfbmkpCisJCWN0eC0+YmFzZV9hdHRyID0gY3R4LT5hdHRyOworCWlmICh0eXBlID09IEFUX0VORCkKKwkJZ290byBub3RfZm91bmQ7CisJdm9sID0gYmFzZV9uaS0+dm9sOworCWFsX3N0YXJ0ID0gYmFzZV9uaS0+YXR0cl9saXN0OworCWFsX2VuZCA9IGFsX3N0YXJ0ICsgYmFzZV9uaS0+YXR0cl9saXN0X3NpemU7CisJaWYgKCFjdHgtPmFsX2VudHJ5KQorCQljdHgtPmFsX2VudHJ5ID0gKEFUVFJfTElTVF9FTlRSWSopYWxfc3RhcnQ7CisJLyoKKwkgKiBJdGVyYXRlIG92ZXIgZW50cmllcyBpbiBhdHRyaWJ1dGUgbGlzdCBzdGFydGluZyBhdCBAY3R4LT5hbF9lbnRyeSwKKwkgKiBvciB0aGUgZW50cnkgZm9sbG93aW5nIHRoYXQsIGlmIEBjdHgtPmlzX2ZpcnN0IGlzIFRSVUUuCisJICovCisJaWYgKGN0eC0+aXNfZmlyc3QpIHsKKwkJYWxfZW50cnkgPSBjdHgtPmFsX2VudHJ5OworCQljdHgtPmlzX2ZpcnN0ID0gRkFMU0U7CisJfSBlbHNlCisJCWFsX2VudHJ5ID0gKEFUVFJfTElTVF9FTlRSWSopKCh1OCopY3R4LT5hbF9lbnRyeSArCisJCQkJbGUxNl90b19jcHUoY3R4LT5hbF9lbnRyeS0+bGVuZ3RoKSk7CisJZm9yICg7OyBhbF9lbnRyeSA9IG5leHRfYWxfZW50cnkpIHsKKwkJLyogT3V0IG9mIGJvdW5kcyBjaGVjay4gKi8KKwkJaWYgKCh1OCopYWxfZW50cnkgPCBiYXNlX25pLT5hdHRyX2xpc3QgfHwKKwkJCQkodTgqKWFsX2VudHJ5ID4gYWxfZW5kKQorCQkJYnJlYWs7CS8qIElub2RlIGlzIGNvcnJ1cHQuICovCisJCWN0eC0+YWxfZW50cnkgPSBhbF9lbnRyeTsKKwkJLyogQ2F0Y2ggdGhlIGVuZCBvZiB0aGUgYXR0cmlidXRlIGxpc3QuICovCisJCWlmICgodTgqKWFsX2VudHJ5ID09IGFsX2VuZCkKKwkJCWdvdG8gbm90X2ZvdW5kOworCQlpZiAoIWFsX2VudHJ5LT5sZW5ndGgpCisJCQlicmVhazsKKwkJaWYgKCh1OCopYWxfZW50cnkgKyA2ID4gYWxfZW5kIHx8ICh1OCopYWxfZW50cnkgKworCQkJCWxlMTZfdG9fY3B1KGFsX2VudHJ5LT5sZW5ndGgpID4gYWxfZW5kKQorCQkJYnJlYWs7CisJCW5leHRfYWxfZW50cnkgPSAoQVRUUl9MSVNUX0VOVFJZKikoKHU4KilhbF9lbnRyeSArCisJCQkJbGUxNl90b19jcHUoYWxfZW50cnktPmxlbmd0aCkpOworCQlpZiAobGUzMl90b19jcHUoYWxfZW50cnktPnR5cGUpID4gbGUzMl90b19jcHUodHlwZSkpCisJCQlnb3RvIG5vdF9mb3VuZDsKKwkJaWYgKHR5cGUgIT0gYWxfZW50cnktPnR5cGUpCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogSWYgQG5hbWUgaXMgcHJlc2VudCwgY29tcGFyZSB0aGUgdHdvIG5hbWVzLiAgSWYgQG5hbWUgaXMKKwkJICogbWlzc2luZywgYXNzdW1lIHdlIHdhbnQgYW4gdW5uYW1lZCBhdHRyaWJ1dGUuCisJCSAqLworCQlhbF9uYW1lX2xlbiA9IGFsX2VudHJ5LT5uYW1lX2xlbmd0aDsKKwkJYWxfbmFtZSA9IChudGZzY2hhciopKCh1OCopYWxfZW50cnkgKyBhbF9lbnRyeS0+bmFtZV9vZmZzZXQpOworCQlpZiAoIW5hbWUpIHsKKwkJCWlmIChhbF9uYW1lX2xlbikKKwkJCQlnb3RvIG5vdF9mb3VuZDsKKwkJfSBlbHNlIGlmICghbnRmc19hcmVfbmFtZXNfZXF1YWwoYWxfbmFtZSwgYWxfbmFtZV9sZW4sIG5hbWUsCisJCQkJbmFtZV9sZW4sIGljLCB2b2wtPnVwY2FzZSwgdm9sLT51cGNhc2VfbGVuKSkgeworCQkJcmVnaXN0ZXIgaW50IHJjOworCisJCQlyYyA9IG50ZnNfY29sbGF0ZV9uYW1lcyhuYW1lLCBuYW1lX2xlbiwgYWxfbmFtZSwKKwkJCQkJYWxfbmFtZV9sZW4sIDEsIElHTk9SRV9DQVNFLAorCQkJCQl2b2wtPnVwY2FzZSwgdm9sLT51cGNhc2VfbGVuKTsKKwkJCS8qCisJCQkgKiBJZiBAbmFtZSBjb2xsYXRlcyBiZWZvcmUgYWxfbmFtZSwgdGhlcmUgaXMgbm8KKwkJCSAqIG1hdGNoaW5nIGF0dHJpYnV0ZS4KKwkJCSAqLworCQkJaWYgKHJjID09IC0xKQorCQkJCWdvdG8gbm90X2ZvdW5kOworCQkJLyogSWYgdGhlIHN0cmluZ3MgYXJlIG5vdCBlcXVhbCwgY29udGludWUgc2VhcmNoLiAqLworCQkJaWYgKHJjKQorCQkJCWNvbnRpbnVlOworCQkJLyoKKwkJCSAqIEZJWE1FOiBSZXZlcnNlIGVuZ2luZWVyaW5nIHNob3dlZCAwLCBJR05PUkVfQ0FTRSBidXQKKwkJCSAqIHRoYXQgaXMgaW5jb25zaXN0ZW50IHdpdGggbnRmc19hdHRyX2ZpbmQoKS4gIFRoZQorCQkJICogc3Vic2VxdWVudCByYyBjaGVja3Mgd2VyZSBhbHNvIGRpZmZlcmVudC4gIFBlcmhhcHMgSQorCQkJICogbWFkZSBhIG1pc3Rha2UgaW4gb25lIG9mIHRoZSB0d28uICBOZWVkIHRvIHJlY2hlY2sKKwkJCSAqIHdoaWNoIGlzIGNvcnJlY3Qgb3IgYXQgbGVhc3Qgc2VlIHdoYXQgaXMgZ29pbmcgb24uLi4KKwkJCSAqIChBSUEpCisJCQkgKi8KKwkJCXJjID0gbnRmc19jb2xsYXRlX25hbWVzKG5hbWUsIG5hbWVfbGVuLCBhbF9uYW1lLAorCQkJCQlhbF9uYW1lX2xlbiwgMSwgQ0FTRV9TRU5TSVRJVkUsCisJCQkJCXZvbC0+dXBjYXNlLCB2b2wtPnVwY2FzZV9sZW4pOworCQkJaWYgKHJjID09IC0xKQorCQkJCWdvdG8gbm90X2ZvdW5kOworCQkJaWYgKHJjKQorCQkJCWNvbnRpbnVlOworCQl9CisJCS8qCisJCSAqIFRoZSBuYW1lcyBtYXRjaCBvciBAbmFtZSBub3QgcHJlc2VudCBhbmQgYXR0cmlidXRlIGlzCisJCSAqIHVubmFtZWQuICBOb3cgY2hlY2sgQGxvd2VzdF92Y24uICBDb250aW51ZSBzZWFyY2ggaWYgdGhlCisJCSAqIG5leHQgYXR0cmlidXRlIGxpc3QgZW50cnkgc3RpbGwgZml0cyBAbG93ZXN0X3Zjbi4gIE90aGVyd2lzZQorCQkgKiB3ZSBoYXZlIHJlYWNoZWQgdGhlIHJpZ2h0IG9uZSBvciB0aGUgc2VhcmNoIGhhcyBmYWlsZWQuCisJCSAqLworCQlpZiAobG93ZXN0X3ZjbiAmJiAodTgqKW5leHRfYWxfZW50cnkgPj0gYWxfc3RhcnQJICAgICYmCisJCQkJKHU4KiluZXh0X2FsX2VudHJ5ICsgNiA8IGFsX2VuZAkJICAgICYmCisJCQkJKHU4KiluZXh0X2FsX2VudHJ5ICsgbGUxNl90b19jcHUoCisJCQkJCW5leHRfYWxfZW50cnktPmxlbmd0aCkgPD0gYWxfZW5kICAgICYmCisJCQkJc2xlNjRfdG9fY3B1KG5leHRfYWxfZW50cnktPmxvd2VzdF92Y24pIDw9CisJCQkJCWxvd2VzdF92Y24JCQkgICAgJiYKKwkJCQluZXh0X2FsX2VudHJ5LT50eXBlID09IGFsX2VudHJ5LT50eXBlCSAgICAmJgorCQkJCW5leHRfYWxfZW50cnktPm5hbWVfbGVuZ3RoID09IGFsX25hbWVfbGVuICAgJiYKKwkJCQludGZzX2FyZV9uYW1lc19lcXVhbCgobnRmc2NoYXIqKSgodTgqKQorCQkJCQluZXh0X2FsX2VudHJ5ICsKKwkJCQkJbmV4dF9hbF9lbnRyeS0+bmFtZV9vZmZzZXQpLAorCQkJCQluZXh0X2FsX2VudHJ5LT5uYW1lX2xlbmd0aCwKKwkJCQkJYWxfbmFtZSwgYWxfbmFtZV9sZW4sIENBU0VfU0VOU0lUSVZFLAorCQkJCQl2b2wtPnVwY2FzZSwgdm9sLT51cGNhc2VfbGVuKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoTVJFRl9MRShhbF9lbnRyeS0+bWZ0X3JlZmVyZW5jZSkgPT0gbmktPm1mdF9ubykgeworCQkJaWYgKE1TRVFOT19MRShhbF9lbnRyeS0+bWZ0X3JlZmVyZW5jZSkgIT0gbmktPnNlcV9ubykgeworCQkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZvdW5kIHN0YWxlIG1mdCAiCisJCQkJCQkicmVmZXJlbmNlIGluIGF0dHJpYnV0ZSBsaXN0ICIKKwkJCQkJCSJvZiBiYXNlIGlub2RlIDB4JWx4LiVzIiwKKwkJCQkJCWJhc2VfbmktPm1mdF9ubywgZXMpOworCQkJCWVyciA9IC1FSU87CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7IC8qIE1mdCByZWZlcmVuY2VzIGRvIG5vdCBtYXRjaC4gKi8KKwkJCS8qIElmIHRoZXJlIGlzIGEgbWFwcGVkIHJlY29yZCB1bm1hcCBpdCBmaXJzdC4gKi8KKwkJCWlmIChuaSAhPSBiYXNlX25pKQorCQkJCXVubWFwX2V4dGVudF9tZnRfcmVjb3JkKG5pKTsKKwkJCS8qIERvIHdlIHdhbnQgdGhlIGJhc2UgcmVjb3JkIGJhY2s/ICovCisJCQlpZiAoTVJFRl9MRShhbF9lbnRyeS0+bWZ0X3JlZmVyZW5jZSkgPT0KKwkJCQkJYmFzZV9uaS0+bWZ0X25vKSB7CisJCQkJbmkgPSBjdHgtPm50ZnNfaW5vID0gYmFzZV9uaTsKKwkJCQljdHgtPm1yZWMgPSBjdHgtPmJhc2VfbXJlYzsKKwkJCX0gZWxzZSB7CisJCQkJLyogV2Ugd2FudCBhbiBleHRlbnQgcmVjb3JkLiAqLworCQkJCWN0eC0+bXJlYyA9IG1hcF9leHRlbnRfbWZ0X3JlY29yZChiYXNlX25pLAorCQkJCQkJbGU2NF90b19jcHUoCisJCQkJCQlhbF9lbnRyeS0+bWZ0X3JlZmVyZW5jZSksICZuaSk7CisJCQkJaWYgKElTX0VSUihjdHgtPm1yZWMpKSB7CisJCQkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBtYXAgIgorCQkJCQkJCSJleHRlbnQgbWZ0IHJlY29yZCAiCisJCQkJCQkJIjB4JWx4IG9mIGJhc2UgaW5vZGUgIgorCQkJCQkJCSIweCVseC4lcyIsCisJCQkJCQkJTVJFRl9MRShhbF9lbnRyeS0+CisJCQkJCQkJbWZ0X3JlZmVyZW5jZSksCisJCQkJCQkJYmFzZV9uaS0+bWZ0X25vLCBlcyk7CisJCQkJCWVyciA9IFBUUl9FUlIoY3R4LT5tcmVjKTsKKwkJCQkJaWYgKGVyciA9PSAtRU5PRU5UKQorCQkJCQkJZXJyID0gLUVJTzsKKwkJCQkJLyogQ2F1c2UgQGN0eCB0byBiZSBzYW5pdGl6ZWQgYmVsb3cuICovCisJCQkJCW5pID0gTlVMTDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWN0eC0+bnRmc19pbm8gPSBuaTsKKwkJCX0KKwkJCWN0eC0+YXR0ciA9IChBVFRSX1JFQ09SRCopKCh1OCopY3R4LT5tcmVjICsKKwkJCQkJbGUxNl90b19jcHUoY3R4LT5tcmVjLT5hdHRyc19vZmZzZXQpKTsKKwkJfQorCQkvKgorCQkgKiBjdHgtPnZmc19pbm8sIGN0eC0+bXJlYywgYW5kIGN0eC0+YXR0ciBub3cgcG9pbnQgdG8gdGhlCisJCSAqIG1mdCByZWNvcmQgY29udGFpbmluZyB0aGUgYXR0cmlidXRlIHJlcHJlc2VudGVkIGJ5IHRoZQorCQkgKiBjdXJyZW50IGFsX2VudHJ5LgorCQkgKi8KKwkJLyoKKwkJICogV2UgY291bGQgY2FsbCBpbnRvIG50ZnNfYXR0cl9maW5kKCkgdG8gZmluZCB0aGUgcmlnaHQKKwkJICogYXR0cmlidXRlIGluIHRoaXMgbWZ0IHJlY29yZCBidXQgdGhpcyB3b3VsZCBiZSBsZXNzCisJCSAqIGVmZmljaWVudCBhbmQgbm90IHF1aXRlIGFjY3VyYXRlIGFzIG50ZnNfYXR0cl9maW5kKCkgaWdub3JlcworCQkgKiB0aGUgYXR0cmlidXRlIGluc3RhbmNlIG51bWJlcnMgZm9yIGV4YW1wbGUgd2hpY2ggYmVjb21lCisJCSAqIGltcG9ydGFudCB3aGVuIG9uZSBwbGF5cyB3aXRoIGF0dHJpYnV0ZSBsaXN0cy4gIEFsc28sCisJCSAqIGJlY2F1c2UgYSBwcm9wZXIgbWF0Y2ggaGFzIGJlZW4gZm91bmQgaW4gdGhlIGF0dHJpYnV0ZSBsaXN0CisJCSAqIGVudHJ5IGFib3ZlLCB0aGUgY29tcGFyaXNvbiBjYW4gbm93IGJlIG9wdGltaXplZC4gIFNvIGl0IGlzCisJCSAqIHdvcnRoIHJlLWltcGxlbWVudGluZyBhIHNpbXBsaWZpZWQgbnRmc19hdHRyX2ZpbmQoKSBoZXJlLgorCQkgKi8KKwkJYSA9IGN0eC0+YXR0cjsKKwkJLyoKKwkJICogVXNlIGEgbWFudWFsIGxvb3Agc28gd2UgY2FuIHN0aWxsIHVzZSBicmVhayBhbmQgY29udGludWUKKwkJICogd2l0aCB0aGUgc2FtZSBtZWFuaW5ncyBhcyBhYm92ZS4KKwkJICovCitkb19uZXh0X2F0dHJfbG9vcDoKKwkJaWYgKCh1OCopYSA8ICh1OCopY3R4LT5tcmVjIHx8ICh1OCopYSA+ICh1OCopY3R4LT5tcmVjICsKKwkJCQlsZTMyX3RvX2NwdShjdHgtPm1yZWMtPmJ5dGVzX2FsbG9jYXRlZCkpCisJCQlicmVhazsKKwkJaWYgKGEtPnR5cGUgPT0gQVRfRU5EKQorCQkJY29udGludWU7CisJCWlmICghYS0+bGVuZ3RoKQorCQkJYnJlYWs7CisJCWlmIChhbF9lbnRyeS0+aW5zdGFuY2UgIT0gYS0+aW5zdGFuY2UpCisJCQlnb3RvIGRvX25leHRfYXR0cjsKKwkJLyoKKwkJICogSWYgdGhlIHR5cGUgYW5kL29yIHRoZSBuYW1lIGFyZSBtaXNtYXRjaGVkIGJldHdlZW4gdGhlCisJCSAqIGF0dHJpYnV0ZSBsaXN0IGVudHJ5IGFuZCB0aGUgYXR0cmlidXRlIHJlY29yZCwgdGhlcmUgaXMKKwkJICogY29ycnVwdGlvbiBzbyB3ZSBicmVhayBhbmQgcmV0dXJuIGVycm9yIEVJTy4KKwkJICovCisJCWlmIChhbF9lbnRyeS0+dHlwZSAhPSBhLT50eXBlKQorCQkJYnJlYWs7CisJCWlmICghbnRmc19hcmVfbmFtZXNfZXF1YWwoKG50ZnNjaGFyKikoKHU4KilhICsKKwkJCQlsZTE2X3RvX2NwdShhLT5uYW1lX29mZnNldCkpLCBhLT5uYW1lX2xlbmd0aCwKKwkJCQlhbF9uYW1lLCBhbF9uYW1lX2xlbiwgQ0FTRV9TRU5TSVRJVkUsCisJCQkJdm9sLT51cGNhc2UsIHZvbC0+dXBjYXNlX2xlbikpCisJCQlicmVhazsKKwkJY3R4LT5hdHRyID0gYTsKKwkJLyoKKwkJICogSWYgbm8gQHZhbCBzcGVjaWZpZWQgb3IgQHZhbCBzcGVjaWZpZWQgYW5kIGl0IG1hdGNoZXMsIHdlCisJCSAqIGhhdmUgZm91bmQgaXQhCisJCSAqLworCQlpZiAoIXZhbCB8fCAoIWEtPm5vbl9yZXNpZGVudCAmJiBsZTMyX3RvX2NwdSgKKwkJCQlhLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCkgPT0gdmFsX2xlbiAmJgorCQkJCSFtZW1jbXAoKHU4KilhICsKKwkJCQlsZTE2X3RvX2NwdShhLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCksCisJCQkJdmFsLCB2YWxfbGVuKSkpIHsKKwkJCW50ZnNfZGVidWcoIkRvbmUsIGZvdW5kLiIpOworCQkJcmV0dXJuIDA7CisJCX0KK2RvX25leHRfYXR0cjoKKwkJLyogUHJvY2VlZCB0byB0aGUgbmV4dCBhdHRyaWJ1dGUgaW4gdGhlIGN1cnJlbnQgbWZ0IHJlY29yZC4gKi8KKwkJYSA9IChBVFRSX1JFQ09SRCopKCh1OCopYSArIGxlMzJfdG9fY3B1KGEtPmxlbmd0aCkpOworCQlnb3RvIGRvX25leHRfYXR0cl9sb29wOworCX0KKwlpZiAoIWVycikgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJCYXNlIGlub2RlIDB4JWx4IGNvbnRhaW5zIGNvcnJ1cHQgIgorCQkJCSJhdHRyaWJ1dGUgbGlzdCBhdHRyaWJ1dGUuJXMiLCBiYXNlX25pLT5tZnRfbm8sCisJCQkJZXMpOworCQllcnIgPSAtRUlPOworCX0KKwlpZiAobmkgIT0gYmFzZV9uaSkgeworCQlpZiAobmkpCisJCQl1bm1hcF9leHRlbnRfbWZ0X3JlY29yZChuaSk7CisJCWN0eC0+bnRmc19pbm8gPSBiYXNlX25pOworCQljdHgtPm1yZWMgPSBjdHgtPmJhc2VfbXJlYzsKKwkJY3R4LT5hdHRyID0gY3R4LT5iYXNlX2F0dHI7CisJfQorCWlmIChlcnIgIT0gLUVOT01FTSkKKwkJTlZvbFNldEVycm9ycyh2b2wpOworCXJldHVybiBlcnI7Citub3RfZm91bmQ6CisJLyoKKwkgKiBJZiB3ZSB3ZXJlIGxvb2tpbmcgZm9yIEFUX0VORCwgd2UgcmVzZXQgdGhlIHNlYXJjaCBjb250ZXh0IEBjdHggYW5kCisJICogdXNlIG50ZnNfYXR0cl9maW5kKCkgdG8gc2VlayB0byB0aGUgZW5kIG9mIHRoZSBiYXNlIG1mdCByZWNvcmQuCisJICovCisJaWYgKHR5cGUgPT0gQVRfRU5EKSB7CisJCW50ZnNfYXR0cl9yZWluaXRfc2VhcmNoX2N0eChjdHgpOworCQlyZXR1cm4gbnRmc19hdHRyX2ZpbmQoQVRfRU5ELCBuYW1lLCBuYW1lX2xlbiwgaWMsIHZhbCwgdmFsX2xlbiwKKwkJCQljdHgpOworCX0KKwkvKgorCSAqIFRoZSBhdHRyaWJ1dGUgd2FzIG5vdCBmb3VuZC4gIEJlZm9yZSB3ZSByZXR1cm4sIHdlIHdhbnQgdG8gZW5zdXJlCisJICogQGN0eC0+bXJlYyBhbmQgQGN0eC0+YXR0ciBpbmRpY2F0ZSB0aGUgcG9zaXRpb24gYXQgd2hpY2ggdGhlCisJICogYXR0cmlidXRlIHNob3VsZCBiZSBpbnNlcnRlZCBpbiB0aGUgYmFzZSBtZnQgcmVjb3JkLiAgU2luY2Ugd2UgYWxzbworCSAqIHdhbnQgdG8gcHJlc2VydmUgQGN0eC0+YWxfZW50cnkgd2UgY2Fubm90IHJlaW5pdGlhbGl6ZSB0aGUgc2VhcmNoCisJICogY29udGV4dCB1c2luZyBudGZzX2F0dHJfcmVpbml0X3NlYXJjaF9jdHgoKSBhcyB0aGlzIHdvdWxkIHNldAorCSAqIEBjdHgtPmFsX2VudHJ5IHRvIE5VTEwuICBUaHVzIHdlIGRvIHRoZSBuZWNlc3NhcnkgYml0cyBtYW51YWxseSAoc2VlCisJICogbnRmc19hdHRyX2luaXRfc2VhcmNoX2N0eCgpIGJlbG93KS4gIE5vdGUsIHdlIF9vbmx5XyBwcmVzZXJ2ZQorCSAqIEBjdHgtPmFsX2VudHJ5IGFzIHRoZSByZW1haW5pbmcgZmllbGRzIChiYXNlXyopIGFyZSBpZGVudGljYWwgdG8KKwkgKiB0aGVpciBub24gYmFzZV8gY291bnRlcnBhcnRzIGFuZCB3ZSBjYW5ub3Qgc2V0IEBjdHgtPmJhc2VfYXR0cgorCSAqIGNvcnJlY3RseSB5ZXQgYXMgd2UgZG8gbm90IGtub3cgd2hhdCBAY3R4LT5hdHRyIHdpbGwgYmUgc2V0IHRvIGJ5CisJICogdGhlIGNhbGwgdG8gbnRmc19hdHRyX2ZpbmQoKSBiZWxvdy4KKwkgKi8KKwlpZiAobmkgIT0gYmFzZV9uaSkKKwkJdW5tYXBfZXh0ZW50X21mdF9yZWNvcmQobmkpOworCWN0eC0+bXJlYyA9IGN0eC0+YmFzZV9tcmVjOworCWN0eC0+YXR0ciA9IChBVFRSX1JFQ09SRCopKCh1OCopY3R4LT5tcmVjICsKKwkJCWxlMTZfdG9fY3B1KGN0eC0+bXJlYy0+YXR0cnNfb2Zmc2V0KSk7CisJY3R4LT5pc19maXJzdCA9IFRSVUU7CisJY3R4LT5udGZzX2lubyA9IGJhc2Vfbmk7CisJY3R4LT5iYXNlX250ZnNfaW5vID0gTlVMTDsKKwljdHgtPmJhc2VfbXJlYyA9IE5VTEw7CisJY3R4LT5iYXNlX2F0dHIgPSBOVUxMOworCS8qCisJICogSW4gY2FzZSB0aGVyZSBhcmUgbXVsdGlwbGUgbWF0Y2hlcyBpbiB0aGUgYmFzZSBtZnQgcmVjb3JkLCBuZWVkIHRvCisJICoga2VlcCBlbnVtZXJhdGluZyB1bnRpbCB3ZSBnZXQgYW4gYXR0cmlidXRlIG5vdCBmb3VuZCByZXNwb25zZSAob3IKKwkgKiBhbm90aGVyIGVycm9yKSwgb3RoZXJ3aXNlIHdlIHdvdWxkIGtlZXAgcmV0dXJuaW5nIHRoZSBzYW1lIGF0dHJpYnV0ZQorCSAqIG92ZXIgYW5kIG92ZXIgYWdhaW4gYW5kIGFsbCBwcm9ncmFtcyB1c2luZyB1cyBmb3IgZW51bWVyYXRpb24gd291bGQKKwkgKiBsb2NrIHVwIGluIGEgdGlnaHQgbG9vcC4KKwkgKi8KKwlkbyB7CisJCWVyciA9IG50ZnNfYXR0cl9maW5kKHR5cGUsIG5hbWUsIG5hbWVfbGVuLCBpYywgdmFsLCB2YWxfbGVuLAorCQkJCWN0eCk7CisJfSB3aGlsZSAoIWVycik7CisJbnRmc19kZWJ1ZygiRG9uZSwgbm90IGZvdW5kLiIpOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogbnRmc19hdHRyX2xvb2t1cCAtIGZpbmQgYW4gYXR0cmlidXRlIGluIGFuIG50ZnMgaW5vZGUKKyAqIEB0eXBlOglhdHRyaWJ1dGUgdHlwZSB0byBmaW5kCisgKiBAbmFtZToJYXR0cmlidXRlIG5hbWUgdG8gZmluZCAob3B0aW9uYWwsIGkuZS4gTlVMTCBtZWFucyBkb24ndCBjYXJlKQorICogQG5hbWVfbGVuOglhdHRyaWJ1dGUgbmFtZSBsZW5ndGggKG9ubHkgbmVlZGVkIGlmIEBuYW1lIHByZXNlbnQpCisgKiBAaWM6CQlJR05PUkVfQ0FTRSBvciBDQVNFX1NFTlNJVElWRSAoaWdub3JlZCBpZiBAbmFtZSBub3QgcHJlc2VudCkKKyAqIEBsb3dlc3RfdmNuOglsb3dlc3QgdmNuIHRvIGZpbmQgKG9wdGlvbmFsLCBub24tcmVzaWRlbnQgYXR0cmlidXRlcyBvbmx5KQorICogQHZhbDoJYXR0cmlidXRlIHZhbHVlIHRvIGZpbmQgKG9wdGlvbmFsLCByZXNpZGVudCBhdHRyaWJ1dGVzIG9ubHkpCisgKiBAdmFsX2xlbjoJYXR0cmlidXRlIHZhbHVlIGxlbmd0aAorICogQGN0eDoJc2VhcmNoIGNvbnRleHQgd2l0aCBtZnQgcmVjb3JkIGFuZCBhdHRyaWJ1dGUgdG8gc2VhcmNoIGZyb20KKyAqCisgKiBGaW5kIGFuIGF0dHJpYnV0ZSBpbiBhbiBudGZzIGlub2RlLiAgT24gZmlyc3Qgc2VhcmNoIEBjdHgtPm50ZnNfaW5vIG11c3QKKyAqIGJlIHRoZSBiYXNlIG1mdCByZWNvcmQgYW5kIEBjdHggbXVzdCBoYXZlIGJlZW4gb2J0YWluZWQgZnJvbSBhIGNhbGwgdG8KKyAqIG50ZnNfYXR0cl9nZXRfc2VhcmNoX2N0eCgpLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gdHJhbnNwYXJlbnRseSBoYW5kbGVzIGF0dHJpYnV0ZSBsaXN0cyBhbmQgQGN0eCBpcyB1c2VkIHRvCisgKiBjb250aW51ZSBzZWFyY2hlcyB3aGVyZSB0aGV5IHdlcmUgbGVmdCBvZmYgYXQuCisgKgorICogQWZ0ZXIgZmluaXNoaW5nIHdpdGggdGhlIGF0dHJpYnV0ZS9tZnQgcmVjb3JkIHlvdSBuZWVkIHRvIGNhbGwKKyAqIG50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eCgpIHRvIGNsZWFudXAgdGhlIHNlYXJjaCBjb250ZXh0ICh1bm1hcHBpbmcgYW55CisgKiBtYXBwZWQgaW5vZGVzLCBldGMpLgorICoKKyAqIFJldHVybiAwIGlmIHRoZSBzZWFyY2ggd2FzIHN1Y2Nlc3NmdWwgYW5kIC1lcnJubyBpZiBub3QuCisgKgorICogV2hlbiAwLCBAY3R4LT5hdHRyIGlzIHRoZSBmb3VuZCBhdHRyaWJ1dGUgYW5kIGl0IGlzIGluIG1mdCByZWNvcmQKKyAqIEBjdHgtPm1yZWMuICBJZiBhbiBhdHRyaWJ1dGUgbGlzdCBhdHRyaWJ1dGUgaXMgcHJlc2VudCwgQGN0eC0+YWxfZW50cnkgaXMKKyAqIHRoZSBhdHRyaWJ1dGUgbGlzdCBlbnRyeSBvZiB0aGUgZm91bmQgYXR0cmlidXRlLgorICoKKyAqIFdoZW4gLUVOT0VOVCwgQGN0eC0+YXR0ciBpcyB0aGUgYXR0cmlidXRlIHdoaWNoIGNvbGxhdGVzIGp1c3QgYWZ0ZXIgdGhlCisgKiBhdHRyaWJ1dGUgYmVpbmcgc2VhcmNoZWQgZm9yLCBpLmUuIGlmIG9uZSB3YW50cyB0byBhZGQgdGhlIGF0dHJpYnV0ZSB0byB0aGUKKyAqIG1mdCByZWNvcmQgdGhpcyBpcyB0aGUgY29ycmVjdCBwbGFjZSB0byBpbnNlcnQgaXQgaW50by4gIElmIGFuIGF0dHJpYnV0ZQorICogbGlzdCBhdHRyaWJ1dGUgaXMgcHJlc2VudCwgQGN0eC0+YWxfZW50cnkgaXMgdGhlIGF0dHJpYnV0ZSBsaXN0IGVudHJ5IHdoaWNoCisgKiBjb2xsYXRlcyBqdXN0IGFmdGVyIHRoZSBhdHRyaWJ1dGUgbGlzdCBlbnRyeSBvZiB0aGUgYXR0cmlidXRlIGJlaW5nIHNlYXJjaGVkCisgKiBmb3IsIGkuZS4gaWYgb25lIHdhbnRzIHRvIGFkZCB0aGUgYXR0cmlidXRlIHRvIHRoZSBtZnQgcmVjb3JkIHRoaXMgaXMgdGhlCisgKiBjb3JyZWN0IHBsYWNlIHRvIGluc2VydCBpdHMgYXR0cmlidXRlIGxpc3QgZW50cnkgaW50by4KKyAqCisgKiBXaGVuIC1lcnJubyAhPSAtRU5PRU5ULCBhbiBlcnJvciBvY2N1cmVkIGR1cmluZyB0aGUgbG9va3VwLiAgQGN0eC0+YXR0ciBpcworICogdGhlbiB1bmRlZmluZWQgYW5kIGluIHBhcnRpY3VsYXIgeW91IHNob3VsZCBub3QgcmVseSBvbiBpdCBub3QgY2hhbmdpbmcuCisgKi8KK2ludCBudGZzX2F0dHJfbG9va3VwKGNvbnN0IEFUVFJfVFlQRSB0eXBlLCBjb25zdCBudGZzY2hhciAqbmFtZSwKKwkJY29uc3QgdTMyIG5hbWVfbGVuLCBjb25zdCBJR05PUkVfQ0FTRV9CT09MIGljLAorCQljb25zdCBWQ04gbG93ZXN0X3ZjbiwgY29uc3QgdTggKnZhbCwgY29uc3QgdTMyIHZhbF9sZW4sCisJCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHgpCit7CisJbnRmc19pbm9kZSAqYmFzZV9uaTsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworCWlmIChjdHgtPmJhc2VfbnRmc19pbm8pCisJCWJhc2VfbmkgPSBjdHgtPmJhc2VfbnRmc19pbm87CisJZWxzZQorCQliYXNlX25pID0gY3R4LT5udGZzX2lubzsKKwkvKiBTYW5pdHkgY2hlY2ssIGp1c3QgZm9yIGRlYnVnZ2luZyByZWFsbHkuICovCisJQlVHX09OKCFiYXNlX25pKTsKKwlpZiAoIU5Jbm9BdHRyTGlzdChiYXNlX25pKSB8fCB0eXBlID09IEFUX0FUVFJJQlVURV9MSVNUKQorCQlyZXR1cm4gbnRmc19hdHRyX2ZpbmQodHlwZSwgbmFtZSwgbmFtZV9sZW4sIGljLCB2YWwsIHZhbF9sZW4sCisJCQkJY3R4KTsKKwlyZXR1cm4gbnRmc19leHRlcm5hbF9hdHRyX2ZpbmQodHlwZSwgbmFtZSwgbmFtZV9sZW4sIGljLCBsb3dlc3RfdmNuLAorCQkJdmFsLCB2YWxfbGVuLCBjdHgpOworfQorCisvKioKKyAqIG50ZnNfYXR0cl9pbml0X3NlYXJjaF9jdHggLSBpbml0aWFsaXplIGFuIGF0dHJpYnV0ZSBzZWFyY2ggY29udGV4dAorICogQGN0eDoJYXR0cmlidXRlIHNlYXJjaCBjb250ZXh0IHRvIGluaXRpYWxpemUKKyAqIEBuaToJCW50ZnMgaW5vZGUgd2l0aCB3aGljaCB0byBpbml0aWFsaXplIHRoZSBzZWFyY2ggY29udGV4dAorICogQG1yZWM6CW1mdCByZWNvcmQgd2l0aCB3aGljaCB0byBpbml0aWFsaXplIHRoZSBzZWFyY2ggY29udGV4dAorICoKKyAqIEluaXRpYWxpemUgdGhlIGF0dHJpYnV0ZSBzZWFyY2ggY29udGV4dCBAY3R4IHdpdGggQG5pIGFuZCBAbXJlYy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIG50ZnNfYXR0cl9pbml0X3NlYXJjaF9jdHgobnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eCwKKwkJbnRmc19pbm9kZSAqbmksIE1GVF9SRUNPUkQgKm1yZWMpCit7CisJY3R4LT5tcmVjID0gbXJlYzsKKwkvKiBTYW5pdHkgY2hlY2tzIGFyZSBwZXJmb3JtZWQgZWxzZXdoZXJlLiAqLworCWN0eC0+YXR0ciA9IChBVFRSX1JFQ09SRCopKCh1OCopbXJlYyArIGxlMTZfdG9fY3B1KG1yZWMtPmF0dHJzX29mZnNldCkpOworCWN0eC0+aXNfZmlyc3QgPSBUUlVFOworCWN0eC0+bnRmc19pbm8gPSBuaTsKKwljdHgtPmFsX2VudHJ5ID0gTlVMTDsKKwljdHgtPmJhc2VfbnRmc19pbm8gPSBOVUxMOworCWN0eC0+YmFzZV9tcmVjID0gTlVMTDsKKwljdHgtPmJhc2VfYXR0ciA9IE5VTEw7Cit9CisKKy8qKgorICogbnRmc19hdHRyX3JlaW5pdF9zZWFyY2hfY3R4IC0gcmVpbml0aWFsaXplIGFuIGF0dHJpYnV0ZSBzZWFyY2ggY29udGV4dAorICogQGN0eDoJYXR0cmlidXRlIHNlYXJjaCBjb250ZXh0IHRvIHJlaW5pdGlhbGl6ZQorICoKKyAqIFJlaW5pdGlhbGl6ZSB0aGUgYXR0cmlidXRlIHNlYXJjaCBjb250ZXh0IEBjdHgsIHVubWFwcGluZyBhbiBhc3NvY2lhdGVkCisgKiBleHRlbnQgbWZ0IHJlY29yZCBpZiBwcmVzZW50LCBhbmQgaW5pdGlhbGl6ZSB0aGUgc2VhcmNoIGNvbnRleHQgYWdhaW4uCisgKgorICogVGhpcyBpcyB1c2VkIHdoZW4gYSBzZWFyY2ggZm9yIGEgbmV3IGF0dHJpYnV0ZSBpcyBiZWluZyBzdGFydGVkIHRvIHJlc2V0CisgKiB0aGUgc2VhcmNoIGNvbnRleHQgdG8gdGhlIGJlZ2lubmluZy4KKyAqLwordm9pZCBudGZzX2F0dHJfcmVpbml0X3NlYXJjaF9jdHgobnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eCkKK3sKKwlpZiAobGlrZWx5KCFjdHgtPmJhc2VfbnRmc19pbm8pKSB7CisJCS8qIE5vIGF0dHJpYnV0ZSBsaXN0LiAqLworCQljdHgtPmlzX2ZpcnN0ID0gVFJVRTsKKwkJLyogU2FuaXR5IGNoZWNrcyBhcmUgcGVyZm9ybWVkIGVsc2V3aGVyZS4gKi8KKwkJY3R4LT5hdHRyID0gKEFUVFJfUkVDT1JEKikoKHU4KiljdHgtPm1yZWMgKworCQkJCWxlMTZfdG9fY3B1KGN0eC0+bXJlYy0+YXR0cnNfb2Zmc2V0KSk7CisJCS8qCisJCSAqIFRoaXMgbmVlZHMgcmVzZXR0aW5nIGR1ZSB0byBudGZzX2V4dGVybmFsX2F0dHJfZmluZCgpIHdoaWNoCisJCSAqIGNhbiBsZWF2ZSBpdCBzZXQgZGVzcGl0ZSBoYXZpbmcgemVyb2VkIGN0eC0+YmFzZV9udGZzX2luby4KKwkJICovCisJCWN0eC0+YWxfZW50cnkgPSBOVUxMOworCQlyZXR1cm47CisJfSAvKiBBdHRyaWJ1dGUgbGlzdC4gKi8KKwlpZiAoY3R4LT5udGZzX2lubyAhPSBjdHgtPmJhc2VfbnRmc19pbm8pCisJCXVubWFwX2V4dGVudF9tZnRfcmVjb3JkKGN0eC0+bnRmc19pbm8pOworCW50ZnNfYXR0cl9pbml0X3NlYXJjaF9jdHgoY3R4LCBjdHgtPmJhc2VfbnRmc19pbm8sIGN0eC0+YmFzZV9tcmVjKTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4IC0gYWxsb2NhdGUvaW5pdGlhbGl6ZSBhIG5ldyBhdHRyaWJ1dGUgc2VhcmNoIGNvbnRleHQKKyAqIEBuaToJCW50ZnMgaW5vZGUgd2l0aCB3aGljaCB0byBpbml0aWFsaXplIHRoZSBzZWFyY2ggY29udGV4dAorICogQG1yZWM6CW1mdCByZWNvcmQgd2l0aCB3aGljaCB0byBpbml0aWFsaXplIHRoZSBzZWFyY2ggY29udGV4dAorICoKKyAqIEFsbG9jYXRlIGEgbmV3IGF0dHJpYnV0ZSBzZWFyY2ggY29udGV4dCwgaW5pdGlhbGl6ZSBpdCB3aXRoIEBuaSBhbmQgQG1yZWMsCisgKiBhbmQgcmV0dXJuIGl0LiBSZXR1cm4gTlVMTCBpZiBhbGxvY2F0aW9uIGZhaWxlZC4KKyAqLworbnRmc19hdHRyX3NlYXJjaF9jdHggKm50ZnNfYXR0cl9nZXRfc2VhcmNoX2N0eChudGZzX2lub2RlICpuaSwgTUZUX1JFQ09SRCAqbXJlYykKK3sKKwludGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4OworCisJY3R4ID0ga21lbV9jYWNoZV9hbGxvYyhudGZzX2F0dHJfY3R4X2NhY2hlLCBTTEFCX05PRlMpOworCWlmIChjdHgpCisJCW50ZnNfYXR0cl9pbml0X3NlYXJjaF9jdHgoY3R4LCBuaSwgbXJlYyk7CisJcmV0dXJuIGN0eDsKK30KKworLyoqCisgKiBudGZzX2F0dHJfcHV0X3NlYXJjaF9jdHggLSByZWxlYXNlIGFuIGF0dHJpYnV0ZSBzZWFyY2ggY29udGV4dAorICogQGN0eDoJYXR0cmlidXRlIHNlYXJjaCBjb250ZXh0IHRvIGZyZWUKKyAqCisgKiBSZWxlYXNlIHRoZSBhdHRyaWJ1dGUgc2VhcmNoIGNvbnRleHQgQGN0eCwgdW5tYXBwaW5nIGFuIGFzc29jaWF0ZWQgZXh0ZW50CisgKiBtZnQgcmVjb3JkIGlmIHByZXNlbnQuCisgKi8KK3ZvaWQgbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KG50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHgpCit7CisJaWYgKGN0eC0+YmFzZV9udGZzX2lubyAmJiBjdHgtPm50ZnNfaW5vICE9IGN0eC0+YmFzZV9udGZzX2lubykKKwkJdW5tYXBfZXh0ZW50X21mdF9yZWNvcmQoY3R4LT5udGZzX2lubyk7CisJa21lbV9jYWNoZV9mcmVlKG50ZnNfYXR0cl9jdHhfY2FjaGUsIGN0eCk7CisJcmV0dXJuOworfQorCisvKioKKyAqIG50ZnNfYXR0cl9maW5kX2luX2F0dHJkZWYgLSBmaW5kIGFuIGF0dHJpYnV0ZSBpbiB0aGUgJEF0dHJEZWYgc3lzdGVtIGZpbGUKKyAqIEB2b2w6CW50ZnMgdm9sdW1lIHRvIHdoaWNoIHRoZSBhdHRyaWJ1dGUgYmVsb25ncworICogQHR5cGU6CWF0dHJpYnV0ZSB0eXBlIHdoaWNoIHRvIGZpbmQKKyAqCisgKiBTZWFyY2ggZm9yIHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiByZWNvcmQgY29ycmVzcG9uZGluZyB0byB0aGUgYXR0cmlidXRlCisgKiBAdHlwZSBpbiB0aGUgJEF0dHJEZWYgc3lzdGVtIGZpbGUuCisgKgorICogUmV0dXJuIHRoZSBhdHRyaWJ1dGUgdHlwZSBkZWZpbml0aW9uIHJlY29yZCBpZiBmb3VuZCBhbmQgTlVMTCBpZiBub3QgZm91bmQuCisgKi8KK3N0YXRpYyBBVFRSX0RFRiAqbnRmc19hdHRyX2ZpbmRfaW5fYXR0cmRlZihjb25zdCBudGZzX3ZvbHVtZSAqdm9sLAorCQljb25zdCBBVFRSX1RZUEUgdHlwZSkKK3sKKwlBVFRSX0RFRiAqYWQ7CisKKwlCVUdfT04oIXZvbC0+YXR0cmRlZik7CisJQlVHX09OKCF0eXBlKTsKKwlmb3IgKGFkID0gdm9sLT5hdHRyZGVmOyAodTgqKWFkIC0gKHU4Kil2b2wtPmF0dHJkZWYgPAorCQkJdm9sLT5hdHRyZGVmX3NpemUgJiYgYWQtPnR5cGU7ICsrYWQpIHsKKwkJLyogV2UgaGF2ZSBub3QgZm91bmQgaXQgeWV0LCBjYXJyeSBvbiBzZWFyY2hpbmcuICovCisJCWlmIChsaWtlbHkobGUzMl90b19jcHUoYWQtPnR5cGUpIDwgbGUzMl90b19jcHUodHlwZSkpKQorCQkJY29udGludWU7CisJCS8qIFdlIGZvdW5kIHRoZSBhdHRyaWJ1dGU7IHJldHVybiBpdC4gKi8KKwkJaWYgKGxpa2VseShhZC0+dHlwZSA9PSB0eXBlKSkKKwkJCXJldHVybiBhZDsKKwkJLyogV2UgaGF2ZSBnb25lIHRvbyBmYXIgYWxyZWFkeS4gIE5vIHBvaW50IGluIGNvbnRpbnVpbmcuICovCisJCWJyZWFrOworCX0KKwkvKiBBdHRyaWJ1dGUgbm90IGZvdW5kLiAqLworCW50ZnNfZGVidWcoIkF0dHJpYnV0ZSB0eXBlIDB4JXggbm90IGZvdW5kIGluICRBdHRyRGVmLiIsCisJCQlsZTMyX3RvX2NwdSh0eXBlKSk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogbnRmc19hdHRyX3NpemVfYm91bmRzX2NoZWNrIC0gY2hlY2sgYSBzaXplIG9mIGFuIGF0dHJpYnV0ZSB0eXBlIGZvciB2YWxpZGl0eQorICogQHZvbDoJbnRmcyB2b2x1bWUgdG8gd2hpY2ggdGhlIGF0dHJpYnV0ZSBiZWxvbmdzCisgKiBAdHlwZToJYXR0cmlidXRlIHR5cGUgd2hpY2ggdG8gY2hlY2sKKyAqIEBzaXplOglzaXplIHdoaWNoIHRvIGNoZWNrCisgKgorICogQ2hlY2sgd2hldGhlciB0aGUgQHNpemUgaW4gYnl0ZXMgaXMgdmFsaWQgZm9yIGFuIGF0dHJpYnV0ZSBvZiBAdHlwZSBvbiB0aGUKKyAqIG50ZnMgdm9sdW1lIEB2b2wuICBUaGlzIGluZm9ybWF0aW9uIGlzIG9idGFpbmVkIGZyb20gJEF0dHJEZWYgc3lzdGVtIGZpbGUuCisgKgorICogUmV0dXJuIDAgaWYgdmFsaWQsIC1FUkFOR0UgaWYgbm90IHZhbGlkLCBvciAtRU5PRU5UIGlmIHRoZSBhdHRyaWJ1dGUgaXMgbm90CisgKiBsaXN0ZWQgaW4gJEF0dHJEZWYuCisgKi8KK2ludCBudGZzX2F0dHJfc2l6ZV9ib3VuZHNfY2hlY2soY29uc3QgbnRmc192b2x1bWUgKnZvbCwgY29uc3QgQVRUUl9UWVBFIHR5cGUsCisJCWNvbnN0IHM2NCBzaXplKQoreworCUFUVFJfREVGICphZDsKKworCUJVR19PTihzaXplIDwgMCk7CisJLyoKKwkgKiAkQVRUUklCVVRFX0xJU1QgaGFzIGEgbWF4aW11bSBzaXplIG9mIDI1NmtpQiwgYnV0IHRoaXMgaXMgbm90CisJICogbGlzdGVkIGluICRBdHRyRGVmLgorCSAqLworCWlmICh1bmxpa2VseSh0eXBlID09IEFUX0FUVFJJQlVURV9MSVNUICYmIHNpemUgPiAyNTYgKiAxMDI0KSkKKwkJcmV0dXJuIC1FUkFOR0U7CisJLyogR2V0IHRoZSAkQXR0ckRlZiBlbnRyeSBmb3IgdGhlIGF0dHJpYnV0ZSBAdHlwZS4gKi8KKwlhZCA9IG50ZnNfYXR0cl9maW5kX2luX2F0dHJkZWYodm9sLCB0eXBlKTsKKwlpZiAodW5saWtlbHkoIWFkKSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJLyogRG8gdGhlIGJvdW5kcyBjaGVjay4gKi8KKwlpZiAoKChzbGU2NF90b19jcHUoYWQtPm1pbl9zaXplKSA+IDApICYmCisJCQlzaXplIDwgc2xlNjRfdG9fY3B1KGFkLT5taW5fc2l6ZSkpIHx8CisJCQkoKHNsZTY0X3RvX2NwdShhZC0+bWF4X3NpemUpID4gMCkgJiYgc2l6ZSA+CisJCQlzbGU2NF90b19jcHUoYWQtPm1heF9zaXplKSkpCisJCXJldHVybiAtRVJBTkdFOworCXJldHVybiAwOworfQorCisvKioKKyAqIG50ZnNfYXR0cl9jYW5fYmVfbm9uX3Jlc2lkZW50IC0gY2hlY2sgaWYgYW4gYXR0cmlidXRlIGNhbiBiZSBub24tcmVzaWRlbnQKKyAqIEB2b2w6CW50ZnMgdm9sdW1lIHRvIHdoaWNoIHRoZSBhdHRyaWJ1dGUgYmVsb25ncworICogQHR5cGU6CWF0dHJpYnV0ZSB0eXBlIHdoaWNoIHRvIGNoZWNrCisgKgorICogQ2hlY2sgd2hldGhlciB0aGUgYXR0cmlidXRlIG9mIEB0eXBlIG9uIHRoZSBudGZzIHZvbHVtZSBAdm9sIGlzIGFsbG93ZWQgdG8KKyAqIGJlIG5vbi1yZXNpZGVudC4gIFRoaXMgaW5mb3JtYXRpb24gaXMgb2J0YWluZWQgZnJvbSAkQXR0ckRlZiBzeXN0ZW0gZmlsZS4KKyAqCisgKiBSZXR1cm4gMCBpZiB0aGUgYXR0cmlidXRlIGlzIGFsbG93ZWQgdG8gYmUgbm9uLXJlc2lkZW50LCAtRVBFUk0gaWYgbm90LCBvcgorICogLUVOT0VOVCBpZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBsaXN0ZWQgaW4gJEF0dHJEZWYuCisgKi8KK2ludCBudGZzX2F0dHJfY2FuX2JlX25vbl9yZXNpZGVudChjb25zdCBudGZzX3ZvbHVtZSAqdm9sLCBjb25zdCBBVFRSX1RZUEUgdHlwZSkKK3sKKwlBVFRSX0RFRiAqYWQ7CisKKwkvKgorCSAqICREQVRBIGlzIGFsd2F5cyBhbGxvd2VkIHRvIGJlIG5vbi1yZXNpZGVudCBldmVuIGlmICRBdHRyRGVmIGRvZXMgbm90CisJICogc3BlY2lmeSB0aGlzIGluIHRoZSBmbGFncyBvZiB0aGUgJERBVEEgYXR0cmlidXRlIGRlZmluaXRpb24gcmVjb3JkLgorCSAqLworCWlmICh0eXBlID09IEFUX0RBVEEpCisJCXJldHVybiAwOworCS8qIEZpbmQgdGhlIGF0dHJpYnV0ZSBkZWZpbml0aW9uIHJlY29yZCBpbiAkQXR0ckRlZi4gKi8KKwlhZCA9IG50ZnNfYXR0cl9maW5kX2luX2F0dHJkZWYodm9sLCB0eXBlKTsKKwlpZiAodW5saWtlbHkoIWFkKSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJLyogQ2hlY2sgdGhlIGZsYWdzIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4gKi8KKwlpZiAoYWQtPmZsYWdzICYgQ0FOX0JFX05PTl9SRVNJREVOVCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIC1FUEVSTTsKK30KKworLyoqCisgKiBudGZzX2F0dHJfY2FuX2JlX3Jlc2lkZW50IC0gY2hlY2sgaWYgYW4gYXR0cmlidXRlIGNhbiBiZSByZXNpZGVudAorICogQHZvbDoJbnRmcyB2b2x1bWUgdG8gd2hpY2ggdGhlIGF0dHJpYnV0ZSBiZWxvbmdzCisgKiBAdHlwZToJYXR0cmlidXRlIHR5cGUgd2hpY2ggdG8gY2hlY2sKKyAqCisgKiBDaGVjayB3aGV0aGVyIHRoZSBhdHRyaWJ1dGUgb2YgQHR5cGUgb24gdGhlIG50ZnMgdm9sdW1lIEB2b2wgaXMgYWxsb3dlZCB0bworICogYmUgcmVzaWRlbnQuICBUaGlzIGluZm9ybWF0aW9uIGlzIGRlcml2ZWQgZnJvbSBvdXIgbnRmcyBrbm93bGVkZ2UgYW5kIG1heQorICogbm90IGJlIGNvbXBsZXRlbHkgYWNjdXJhdGUsIGVzcGVjaWFsbHkgd2hlbiB1c2VyIGRlZmluZWQgYXR0cmlidXRlcyBhcmUKKyAqIHByZXNlbnQuICBCYXNpY2FsbHkgd2UgYWxsb3cgZXZlcnl0aGluZyB0byBiZSByZXNpZGVudCBleGNlcHQgZm9yIGluZGV4CisgKiBhbGxvY2F0aW9uIGFuZCAkRUEgYXR0cmlidXRlcy4KKyAqCisgKiBSZXR1cm4gMCBpZiB0aGUgYXR0cmlidXRlIGlzIGFsbG93ZWQgdG8gYmUgbm9uLXJlc2lkZW50IGFuZCAtRVBFUk0gaWYgbm90LgorICoKKyAqIFdhcm5pbmc6IEluIHRoZSBzeXN0ZW0gZmlsZSAkTUZUIHRoZSBhdHRyaWJ1dGUgJEJpdG1hcCBtdXN0IGJlIG5vbi1yZXNpZGVudAorICoJICAgIG90aGVyd2lzZSB3aW5kb3dzIHdpbGwgbm90IGJvb3QgKGJsdWUgc2NyZWVuIG9mIGRlYXRoKSEgIFdlIGNhbm5vdAorICoJICAgIGNoZWNrIGZvciB0aGlzIGhlcmUgYXMgd2UgZG8gbm90IGtub3cgd2hpY2ggaW5vZGUncyAkQml0bWFwIGlzCisgKgkgICAgYmVpbmcgYXNrZWQgYWJvdXQgc28gdGhlIGNhbGxlciBuZWVkcyB0byBzcGVjaWFsIGNhc2UgdGhpcy4KKyAqLworaW50IG50ZnNfYXR0cl9jYW5fYmVfcmVzaWRlbnQoY29uc3QgbnRmc192b2x1bWUgKnZvbCwgY29uc3QgQVRUUl9UWVBFIHR5cGUpCit7CisJaWYgKHR5cGUgIT0gQVRfSU5ERVhfQUxMT0NBVElPTiAmJiB0eXBlICE9IEFUX0VBKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVQRVJNOworfQorCisvKioKKyAqIG50ZnNfYXR0cl9yZWNvcmRfcmVzaXplIC0gcmVzaXplIGFuIGF0dHJpYnV0ZSByZWNvcmQKKyAqIEBtOgkJbWZ0IHJlY29yZCBjb250YWluaW5nIGF0dHJpYnV0ZSByZWNvcmQKKyAqIEBhOgkJYXR0cmlidXRlIHJlY29yZCB0byByZXNpemUKKyAqIEBuZXdfc2l6ZToJbmV3IHNpemUgaW4gYnl0ZXMgdG8gd2hpY2ggdG8gcmVzaXplIHRoZSBhdHRyaWJ1dGUgcmVjb3JkIEBhCisgKgorICogUmVzaXplIHRoZSBhdHRyaWJ1dGUgcmVjb3JkIEBhLCBpLmUuIHRoZSByZXNpZGVudCBwYXJ0IG9mIHRoZSBhdHRyaWJ1dGUsIGluCisgKiB0aGUgbWZ0IHJlY29yZCBAbSB0byBAbmV3X3NpemUgYnl0ZXMuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLiAgVGhlIGZvbGxvd2luZyBlcnJvciBjb2RlcyBhcmUKKyAqIGRlZmluZWQ6CisgKgktRU5PU1BDCS0gTm90IGVub3VnaCBzcGFjZSBpbiB0aGUgbWZ0IHJlY29yZCBAbSB0byBwZXJmb3JtIHRoZSByZXNpemUuCisgKgorICogTm90ZTogT24gZXJyb3IsIG5vIG1vZGlmaWNhdGlvbnMgaGF2ZSBiZWVuIHBlcmZvcm1lZCB3aGF0c29ldmVyLgorICoKKyAqIFdhcm5pbmc6IElmIHlvdSBtYWtlIGEgcmVjb3JkIHNtYWxsZXIgd2l0aG91dCBoYXZpbmcgY29waWVkIGFsbCB0aGUgZGF0YSB5b3UKKyAqCSAgICBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgZGF0YSBtYXkgYmUgb3ZlcndyaXR0ZW4uCisgKi8KK2ludCBudGZzX2F0dHJfcmVjb3JkX3Jlc2l6ZShNRlRfUkVDT1JEICptLCBBVFRSX1JFQ09SRCAqYSwgdTMyIG5ld19zaXplKQoreworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBuZXdfc2l6ZSAldS4iLCBuZXdfc2l6ZSk7CisJLyogQWxpZ24gdG8gOCBieXRlcyBpZiBpdCBpcyBub3QgYWxyZWFkeSBkb25lLiAqLworCWlmIChuZXdfc2l6ZSAmIDcpCisJCW5ld19zaXplID0gKG5ld19zaXplICsgNykgJiB+NzsKKwkvKiBJZiB0aGUgYWN0dWFsIGF0dHJpYnV0ZSBsZW5ndGggaGFzIGNoYW5nZWQsIG1vdmUgdGhpbmdzIGFyb3VuZC4gKi8KKwlpZiAobmV3X3NpemUgIT0gbGUzMl90b19jcHUoYS0+bGVuZ3RoKSkgeworCQl1MzIgbmV3X211c2UgPSBsZTMyX3RvX2NwdShtLT5ieXRlc19pbl91c2UpIC0KKwkJCQlsZTMyX3RvX2NwdShhLT5sZW5ndGgpICsgbmV3X3NpemU7CisJCS8qIE5vdCBlbm91Z2ggc3BhY2UgaW4gdGhpcyBtZnQgcmVjb3JkLiAqLworCQlpZiAobmV3X211c2UgPiBsZTMyX3RvX2NwdShtLT5ieXRlc19hbGxvY2F0ZWQpKQorCQkJcmV0dXJuIC1FTk9TUEM7CisJCS8qIE1vdmUgYXR0cmlidXRlcyBmb2xsb3dpbmcgQGEgdG8gdGhlaXIgbmV3IGxvY2F0aW9uLiAqLworCQltZW1tb3ZlKCh1OCopYSArIG5ld19zaXplLCAodTgqKWEgKyBsZTMyX3RvX2NwdShhLT5sZW5ndGgpLAorCQkJCWxlMzJfdG9fY3B1KG0tPmJ5dGVzX2luX3VzZSkgLSAoKHU4KilhIC0KKwkJCQkodTgqKW0pIC0gbGUzMl90b19jcHUoYS0+bGVuZ3RoKSk7CisJCS8qIEFkanVzdCBAbSB0byByZWZsZWN0IHRoZSBjaGFuZ2UgaW4gdXNlZCBzcGFjZS4gKi8KKwkJbS0+Ynl0ZXNfaW5fdXNlID0gY3B1X3RvX2xlMzIobmV3X211c2UpOworCQkvKiBBZGp1c3QgQGEgdG8gcmVmbGVjdCB0aGUgbmV3IHNpemUuICovCisJCWlmIChuZXdfc2l6ZSA+PSBvZmZzZXRvZihBVFRSX1JFQywgbGVuZ3RoKSArIHNpemVvZihhLT5sZW5ndGgpKQorCQkJYS0+bGVuZ3RoID0gY3B1X3RvX2xlMzIobmV3X3NpemUpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBudGZzX2F0dHJfc2V0IC0gZmlsbCAoYSBwYXJ0IG9mKSBhbiBhdHRyaWJ1dGUgd2l0aCBhIGJ5dGUKKyAqIEBuaToJCW50ZnMgaW5vZGUgZGVzY3JpYmluZyB0aGUgYXR0cmlidXRlIHRvIGZpbGwKKyAqIEBvZnM6CW9mZnNldCBpbnNpZGUgdGhlIGF0dHJpYnV0ZSBhdCB3aGljaCB0byBzdGFydCB0byBmaWxsCisgKiBAY250OgludW1iZXIgb2YgYnl0ZXMgdG8gZmlsbAorICogQHZhbDoJdGhlIHVuc2lnbmVkIDgtYml0IHZhbHVlIHdpdGggd2hpY2ggdG8gZmlsbCB0aGUgYXR0cmlidXRlCisgKgorICogRmlsbCBAY250IGJ5dGVzIG9mIHRoZSBhdHRyaWJ1dGUgZGVzY3JpYmVkIGJ5IHRoZSBudGZzIGlub2RlIEBuaSBzdGFydGluZyBhdAorICogYnl0ZSBvZmZzZXQgQG9mcyBpbnNpZGUgdGhlIGF0dHJpYnV0ZSB3aXRoIHRoZSBjb25zdGFudCBieXRlIEB2YWwuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBlZmZlY3RpdmVseSBsaWtlIG1lbXNldCgpIGFwcGxpZWQgdG8gYW4gbnRmcyBhdHRyaWJ1dGUuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLiAgQW4gZXJyb3IgY29kZSBvZiAtRVNQSVBFIG1lYW5zCisgKiB0aGF0IEBvZnMgKyBAY250IHdlcmUgb3V0c2lkZSB0aGUgZW5kIG9mIHRoZSBhdHRyaWJ1dGUgYW5kIG5vIHdyaXRlIHdhcworICogcGVyZm9ybWVkLgorICovCitpbnQgbnRmc19hdHRyX3NldChudGZzX2lub2RlICpuaSwgY29uc3QgczY0IG9mcywgY29uc3QgczY0IGNudCwgY29uc3QgdTggdmFsKQoreworCW50ZnNfdm9sdW1lICp2b2wgPSBuaS0+dm9sOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOworCXN0cnVjdCBwYWdlICpwYWdlOworCXU4ICprYWRkcjsKKwlwZ29mZl90IGlkeCwgZW5kOworCXVuc2lnbmVkIGludCBzdGFydF9vZnMsIGVuZF9vZnMsIHNpemU7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3Igb2ZzIDB4JWxseCwgY250IDB4JWxseCwgdmFsIDB4JWh4LiIsCisJCQkobG9uZyBsb25nKW9mcywgKGxvbmcgbG9uZyljbnQsIHZhbCk7CisJQlVHX09OKG9mcyA8IDApOworCUJVR19PTihjbnQgPCAwKTsKKwlpZiAoIWNudCkKKwkJZ290byBkb25lOworCW1hcHBpbmcgPSBWRlNfSShuaSktPmlfbWFwcGluZzsKKwkvKiBXb3JrIG91dCB0aGUgc3RhcnRpbmcgaW5kZXggYW5kIHBhZ2Ugb2Zmc2V0LiAqLworCWlkeCA9IG9mcyA+PiBQQUdFX0NBQ0hFX1NISUZUOworCXN0YXJ0X29mcyA9IG9mcyAmIH5QQUdFX0NBQ0hFX01BU0s7CisJLyogV29yayBvdXQgdGhlIGVuZGluZyBpbmRleCBhbmQgcGFnZSBvZmZzZXQuICovCisJZW5kID0gb2ZzICsgY250OworCWVuZF9vZnMgPSBlbmQgJiB+UEFHRV9DQUNIRV9NQVNLOworCS8qIElmIHRoZSBlbmQgaXMgb3V0c2lkZSB0aGUgaW5vZGUgc2l6ZSByZXR1cm4gLUVTUElQRS4gKi8KKwlpZiAodW5saWtlbHkoZW5kID4gVkZTX0kobmkpLT5pX3NpemUpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIlJlcXVlc3QgZXhjZWVkcyBlbmQgb2YgYXR0cmlidXRlLiIpOworCQlyZXR1cm4gLUVTUElQRTsKKwl9CisJZW5kID4+PSBQQUdFX0NBQ0hFX1NISUZUOworCS8qIElmIHRoZXJlIGlzIGEgZmlyc3QgcGFydGlhbCBwYWdlLCBuZWVkIHRvIGRvIGl0IHRoZSBzbG93IHdheS4gKi8KKwlpZiAoc3RhcnRfb2ZzKSB7CisJCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UobWFwcGluZywgaWR4LAorCQkJCShmaWxsZXJfdCopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlLCBOVUxMKTsKKwkJaWYgKElTX0VSUihwYWdlKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHJlYWQgZmlyc3QgcGFydGlhbCAiCisJCQkJCSJwYWdlIChzeW5jIGVycm9yLCBpbmRleCAweCVseCkuIiwgaWR4KTsKKwkJCXJldHVybiBQVFJfRVJSKHBhZ2UpOworCQl9CisJCXdhaXRfb25fcGFnZV9sb2NrZWQocGFnZSk7CisJCWlmICh1bmxpa2VseSghUGFnZVVwdG9kYXRlKHBhZ2UpKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHJlYWQgZmlyc3QgcGFydGlhbCBwYWdlICIKKwkJCQkJIihhc3luYyBlcnJvciwgaW5kZXggMHglbHgpLiIsIGlkeCk7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCQlyZXR1cm4gUFRSX0VSUihwYWdlKTsKKwkJfQorCQkvKgorCQkgKiBJZiB0aGUgbGFzdCBwYWdlIGlzIHRoZSBzYW1lIGFzIHRoZSBmaXJzdCBwYWdlLCBuZWVkIHRvCisJCSAqIGxpbWl0IHRoZSB3cml0ZSB0byB0aGUgZW5kIG9mZnNldC4KKwkJICovCisJCXNpemUgPSBQQUdFX0NBQ0hFX1NJWkU7CisJCWlmIChpZHggPT0gZW5kKQorCQkJc2l6ZSA9IGVuZF9vZnM7CisJCWthZGRyID0ga21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQltZW1zZXQoa2FkZHIgKyBzdGFydF9vZnMsIHZhbCwgc2l6ZSAtIHN0YXJ0X29mcyk7CisJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCk7CisJCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCWlmIChpZHggPT0gZW5kKQorCQkJZ290byBkb25lOworCQlpZHgrKzsKKwl9CisJLyogRG8gdGhlIHdob2xlIHBhZ2VzIHRoZSBmYXN0IHdheS4gKi8KKwlmb3IgKDsgaWR4IDwgZW5kOyBpZHgrKykgeworCQkvKiBGaW5kIG9yIGNyZWF0ZSB0aGUgY3VycmVudCBwYWdlLiAgKFRoZSBwYWdlIGlzIGxvY2tlZC4pICovCisJCXBhZ2UgPSBncmFiX2NhY2hlX3BhZ2UobWFwcGluZywgaWR4KTsKKwkJaWYgKHVubGlrZWx5KCFwYWdlKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiSW5zdWZmaWNpZW50IG1lbW9yeSB0byBncmFiICIKKwkJCQkJInBhZ2UgKGluZGV4IDB4JWx4KS4iLCBpZHgpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCW1lbXNldChrYWRkciwgdmFsLCBQQUdFX0NBQ0hFX1NJWkUpOworCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCQkvKgorCQkgKiBJZiB0aGUgcGFnZSBoYXMgYnVmZmVycywgbWFyayB0aGVtIHVwdG9kYXRlIHNpbmNlIGJ1ZmZlcgorCQkgKiBzdGF0ZSBhbmQgbm90IHBhZ2Ugc3RhdGUgaXMgZGVmaW5pdGl2ZSBpbiAyLjYga2VybmVscy4KKwkJICovCisJCWlmIChwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSB7CisJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqaGVhZDsKKworCQkJYmggPSBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCQkJZG8geworCQkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQkJfSB3aGlsZSAoKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKKwkJfQorCQkvKiBOb3cgdGhhdCBidWZmZXJzIGFyZSB1cHRvZGF0ZSwgc2V0IHRoZSBwYWdlIHVwdG9kYXRlLCB0b28uICovCisJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJLyoKKwkJICogU2V0IHRoZSBwYWdlIGFuZCBhbGwgaXRzIGJ1ZmZlcnMgZGlydHkgYW5kIG1hcmsgdGhlIGlub2RlCisJCSAqIGRpcnR5LCB0b28uICBUaGUgVk0gd2lsbCB3cml0ZSB0aGUgcGFnZSBsYXRlciBvbi4KKwkJICovCisJCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworCQkvKiBGaW5hbGx5IHVubG9jayBhbmQgcmVsZWFzZSB0aGUgcGFnZS4gKi8KKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwl9CisJLyogSWYgdGhlcmUgaXMgYSBsYXN0IHBhcnRpYWwgcGFnZSwgbmVlZCB0byBkbyBpdCB0aGUgc2xvdyB3YXkuICovCisJaWYgKGVuZF9vZnMpIHsKKwkJcGFnZSA9IHJlYWRfY2FjaGVfcGFnZShtYXBwaW5nLCBpZHgsCisJCQkJKGZpbGxlcl90KiltYXBwaW5nLT5hX29wcy0+cmVhZHBhZ2UsIE5VTEwpOworCQlpZiAoSVNfRVJSKHBhZ2UpKSB7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gcmVhZCBsYXN0IHBhcnRpYWwgcGFnZSAiCisJCQkJCSIoc3luYyBlcnJvciwgaW5kZXggMHglbHgpLiIsIGlkeCk7CisJCQlyZXR1cm4gUFRSX0VSUihwYWdlKTsKKwkJfQorCQl3YWl0X29uX3BhZ2VfbG9ja2VkKHBhZ2UpOworCQlpZiAodW5saWtlbHkoIVBhZ2VVcHRvZGF0ZShwYWdlKSkpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byByZWFkIGxhc3QgcGFydGlhbCBwYWdlICIKKwkJCQkJIihhc3luYyBlcnJvciwgaW5kZXggMHglbHgpLiIsIGlkeCk7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCQlyZXR1cm4gUFRSX0VSUihwYWdlKTsKKwkJfQorCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKKwkJbWVtc2V0KGthZGRyLCB2YWwsIGVuZF9vZnMpOworCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCX0KK2RvbmU6CisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL250ZnMvYXR0cmliLmggYi9mcy9udGZzL2F0dHJpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYzJjNmMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL2F0dHJpYi5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogYXR0cmliLmggLSBEZWZpbmVzIGZvciBhdHRyaWJ1dGUgaGFuZGxpbmcgaW4gTlRGUyBMaW51eCBrZXJuZWwgZHJpdmVyLgorICoJICAgICAgUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChjKSAyMDAyIFJpY2hhcmQgUnVzc29uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfTElOVVhfTlRGU19BVFRSSUJfSAorI2RlZmluZSBfTElOVVhfTlRGU19BVFRSSUJfSAorCisjaW5jbHVkZSAiZW5kaWFuLmgiCisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJsYXlvdXQuaCIKKyNpbmNsdWRlICJpbm9kZS5oIgorI2luY2x1ZGUgInJ1bmxpc3QuaCIKKyNpbmNsdWRlICJ2b2x1bWUuaCIKKworLyoqCisgKiBudGZzX2F0dHJfc2VhcmNoX2N0eCAtIHVzZWQgaW4gYXR0cmlidXRlIHNlYXJjaCBmdW5jdGlvbnMKKyAqIEBtcmVjOglidWZmZXIgY29udGFpbmluZyBtZnQgcmVjb3JkIHRvIHNlYXJjaAorICogQGF0dHI6CWF0dHJpYnV0ZSByZWNvcmQgaW4gQG1yZWMgd2hlcmUgdG8gYmVnaW4vY29udGludWUgc2VhcmNoCisgKiBAaXNfZmlyc3Q6CWlmIHRydWUgbnRmc19hdHRyX2xvb2t1cCgpIGJlZ2lucyBzZWFyY2ggd2l0aCBAYXR0ciwgZWxzZSBhZnRlcgorICoKKyAqIFN0cnVjdHVyZSBtdXN0IGJlIGluaXRpYWxpemVkIHRvIHplcm8gYmVmb3JlIHRoZSBmaXJzdCBjYWxsIHRvIG9uZSBvZiB0aGUKKyAqIGF0dHJpYnV0ZSBzZWFyY2ggZnVuY3Rpb25zLiBJbml0aWFsaXplIEBtcmVjIHRvIHBvaW50IHRvIHRoZSBtZnQgcmVjb3JkIHRvCisgKiBzZWFyY2gsIGFuZCBAYXR0ciB0byBwb2ludCB0byB0aGUgZmlyc3QgYXR0cmlidXRlIHdpdGhpbiBAbXJlYyAobm90IG5lY2Vzc2FyeQorICogaWYgY2FsbGluZyB0aGUgX2ZpcnN0KCkgZnVuY3Rpb25zKSwgYW5kIHNldCBAaXNfZmlyc3QgdG8gVFJVRSAobm90IG5lY2Vzc2FyeQorICogaWYgY2FsbGluZyB0aGUgX2ZpcnN0KCkgZnVuY3Rpb25zKS4KKyAqCisgKiBJZiBAaXNfZmlyc3QgaXMgVFJVRSwgdGhlIHNlYXJjaCBiZWdpbnMgd2l0aCBAYXR0ci4gSWYgQGlzX2ZpcnN0IGlzIEZBTFNFLAorICogdGhlIHNlYXJjaCBiZWdpbnMgYWZ0ZXIgQGF0dHIuIFRoaXMgaXMgc28gdGhhdCwgYWZ0ZXIgdGhlIGZpcnN0IGNhbGwgdG8gb25lCisgKiBvZiB0aGUgc2VhcmNoIGF0dHJpYnV0ZSBmdW5jdGlvbnMsIHdlIGNhbiBjYWxsIHRoZSBmdW5jdGlvbiBhZ2Fpbiwgd2l0aG91dAorICogYW55IG1vZGlmaWNhdGlvbiBvZiB0aGUgc2VhcmNoIGNvbnRleHQsIHRvIGF1dG9tYWdpY2FsbHkgZ2V0IHRoZSBuZXh0CisgKiBtYXRjaGluZyBhdHRyaWJ1dGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlNRlRfUkVDT1JEICptcmVjOworCUFUVFJfUkVDT1JEICphdHRyOworCUJPT0wgaXNfZmlyc3Q7CisJbnRmc19pbm9kZSAqbnRmc19pbm87CisJQVRUUl9MSVNUX0VOVFJZICphbF9lbnRyeTsKKwludGZzX2lub2RlICpiYXNlX250ZnNfaW5vOworCU1GVF9SRUNPUkQgKmJhc2VfbXJlYzsKKwlBVFRSX1JFQ09SRCAqYmFzZV9hdHRyOworfSBudGZzX2F0dHJfc2VhcmNoX2N0eDsKKworZXh0ZXJuIGludCBudGZzX21hcF9ydW5saXN0KG50ZnNfaW5vZGUgKm5pLCBWQ04gdmNuKTsKKworZXh0ZXJuIHJ1bmxpc3RfZWxlbWVudCAqbnRmc19maW5kX3ZjbihudGZzX2lub2RlICpuaSwgY29uc3QgVkNOIHZjbiwKKwkJY29uc3QgQk9PTCBuZWVkX3dyaXRlKTsKKworaW50IG50ZnNfYXR0cl9sb29rdXAoY29uc3QgQVRUUl9UWVBFIHR5cGUsIGNvbnN0IG50ZnNjaGFyICpuYW1lLAorCQljb25zdCB1MzIgbmFtZV9sZW4sIGNvbnN0IElHTk9SRV9DQVNFX0JPT0wgaWMsCisJCWNvbnN0IFZDTiBsb3dlc3RfdmNuLCBjb25zdCB1OCAqdmFsLCBjb25zdCB1MzIgdmFsX2xlbiwKKwkJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eCk7CisKK2V4dGVybiBpbnQgbG9hZF9hdHRyaWJ1dGVfbGlzdChudGZzX3ZvbHVtZSAqdm9sLCBydW5saXN0ICpybCwgdTggKmFsX3N0YXJ0LAorCQljb25zdCBzNjQgc2l6ZSwgY29uc3QgczY0IGluaXRpYWxpemVkX3NpemUpOworCitzdGF0aWMgaW5saW5lIHM2NCBudGZzX2F0dHJfc2l6ZShjb25zdCBBVFRSX1JFQ09SRCAqYSkKK3sKKwlpZiAoIWEtPm5vbl9yZXNpZGVudCkKKwkJcmV0dXJuIChzNjQpbGUzMl90b19jcHUoYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpOworCXJldHVybiBzbGU2NF90b19jcHUoYS0+ZGF0YS5ub25fcmVzaWRlbnQuZGF0YV9zaXplKTsKK30KKworZXh0ZXJuIHZvaWQgbnRmc19hdHRyX3JlaW5pdF9zZWFyY2hfY3R4KG50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHgpOworZXh0ZXJuIG50ZnNfYXR0cl9zZWFyY2hfY3R4ICpudGZzX2F0dHJfZ2V0X3NlYXJjaF9jdHgobnRmc19pbm9kZSAqbmksCisJCU1GVF9SRUNPUkQgKm1yZWMpOworZXh0ZXJuIHZvaWQgbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KG50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHgpOworCitleHRlcm4gaW50IG50ZnNfYXR0cl9zaXplX2JvdW5kc19jaGVjayhjb25zdCBudGZzX3ZvbHVtZSAqdm9sLAorCQljb25zdCBBVFRSX1RZUEUgdHlwZSwgY29uc3QgczY0IHNpemUpOworZXh0ZXJuIGludCBudGZzX2F0dHJfY2FuX2JlX25vbl9yZXNpZGVudChjb25zdCBudGZzX3ZvbHVtZSAqdm9sLAorCQljb25zdCBBVFRSX1RZUEUgdHlwZSk7CitleHRlcm4gaW50IG50ZnNfYXR0cl9jYW5fYmVfcmVzaWRlbnQoY29uc3QgbnRmc192b2x1bWUgKnZvbCwKKwkJY29uc3QgQVRUUl9UWVBFIHR5cGUpOworCitleHRlcm4gaW50IG50ZnNfYXR0cl9yZWNvcmRfcmVzaXplKE1GVF9SRUNPUkQgKm0sIEFUVFJfUkVDT1JEICphLCB1MzIgbmV3X3NpemUpOworCitleHRlcm4gaW50IG50ZnNfYXR0cl9zZXQobnRmc19pbm9kZSAqbmksIGNvbnN0IHM2NCBvZnMsIGNvbnN0IHM2NCBjbnQsCisJCWNvbnN0IHU4IHZhbCk7CisKKyNlbmRpZiAvKiBfTElOVVhfTlRGU19BVFRSSUJfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9iaXRtYXAuYyBiL2ZzL250ZnMvYml0bWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJjZjJlMwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvYml0bWFwLmMKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisgKiBiaXRtYXAuYyAtIE5URlMga2VybmVsIGJpdG1hcCBoYW5kbGluZy4gIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmZGVmIE5URlNfUlcKKworI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKworI2luY2x1ZGUgImJpdG1hcC5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAiYW9wcy5oIgorI2luY2x1ZGUgIm50ZnMuaCIKKworLyoqCisgKiBfX250ZnNfYml0bWFwX3NldF9iaXRzX2luX3J1biAtIHNldCBhIHJ1biBvZiBiaXRzIGluIGEgYml0bWFwIHRvIGEgdmFsdWUKKyAqIEB2aToJCQl2ZnMgaW5vZGUgZGVzY3JpYmluZyB0aGUgYml0bWFwCisgKiBAc3RhcnRfYml0OgkJZmlyc3QgYml0IHRvIHNldAorICogQGNvdW50OgkJbnVtYmVyIG9mIGJpdHMgdG8gc2V0CisgKiBAdmFsdWU6CQl2YWx1ZSB0byBzZXQgdGhlIGJpdHMgdG8gKGkuZS4gMCBvciAxKQorICogQGlzX3JvbGxiYWNrOglpZiBUUlVFIHRoaXMgaXMgYSByb2xsYmFjayBvcGVyYXRpb24KKyAqCisgKiBTZXQgQGNvdW50IGJpdHMgc3RhcnRpbmcgYXQgYml0IEBzdGFydF9iaXQgaW4gdGhlIGJpdG1hcCBkZXNjcmliZWQgYnkgdGhlCisgKiB2ZnMgaW5vZGUgQHZpIHRvIEB2YWx1ZSwgd2hlcmUgQHZhbHVlIGlzIGVpdGhlciAwIG9yIDEuCisgKgorICogQGlzX3JvbGxiYWNrIHNob3VsZCBhbHdheXMgYmUgRkFMU0UsIGl0IGlzIGZvciBpbnRlcm5hbCB1c2UgdG8gcm9sbGJhY2sKKyAqIGVycm9ycy4gIFlvdSBwcm9iYWJseSB3YW50IHRvIHVzZSBudGZzX2JpdG1hcF9zZXRfYml0c19pbl9ydW4oKSBpbnN0ZWFkLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4KKyAqLworaW50IF9fbnRmc19iaXRtYXBfc2V0X2JpdHNfaW5fcnVuKHN0cnVjdCBpbm9kZSAqdmksIGNvbnN0IHM2NCBzdGFydF9iaXQsCisJCWNvbnN0IHM2NCBjb3VudCwgY29uc3QgdTggdmFsdWUsIGNvbnN0IEJPT0wgaXNfcm9sbGJhY2spCit7CisJczY0IGNudCA9IGNvdW50OworCXBnb2ZmX3QgaW5kZXgsIGVuZF9pbmRleDsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1OCAqa2FkZHI7CisJaW50IHBvcywgbGVuOworCXU4IGJpdDsKKworCUJVR19PTighdmkpOworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBpX2lubyAweCVseCwgc3RhcnRfYml0IDB4JWxseCwgY291bnQgMHglbGx4LCAiCisJCQkidmFsdWUgJXUuJXMiLCB2aS0+aV9pbm8sICh1bnNpZ25lZCBsb25nIGxvbmcpc3RhcnRfYml0LAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyljbnQsICh1bnNpZ25lZCBpbnQpdmFsdWUsCisJCQlpc19yb2xsYmFjayA/ICIgKHJvbGxiYWNrKSIgOiAiIik7CisJQlVHX09OKHN0YXJ0X2JpdCA8IDApOworCUJVR19PTihjbnQgPCAwKTsKKwlCVUdfT04odmFsdWUgPiAxKTsKKwkvKgorCSAqIENhbGN1bGF0ZSB0aGUgaW5kaWNlcyBmb3IgdGhlIHBhZ2VzIGNvbnRhaW5pbmcgdGhlIGZpcnN0IGFuZCBsYXN0CisJICogYml0cywgaS5lLiBAc3RhcnRfYml0IGFuZCBAc3RhcnRfYml0ICsgQGNudCAtIDEsIHJlc3BlY3RpdmVseS4KKwkgKi8KKwlpbmRleCA9IHN0YXJ0X2JpdCA+PiAoMyArIFBBR0VfQ0FDSEVfU0hJRlQpOworCWVuZF9pbmRleCA9IChzdGFydF9iaXQgKyBjbnQgLSAxKSA+PiAoMyArIFBBR0VfQ0FDSEVfU0hJRlQpOworCisJLyogR2V0IHRoZSBwYWdlIGNvbnRhaW5pbmcgdGhlIGZpcnN0IGJpdCAoQHN0YXJ0X2JpdCkuICovCisJbWFwcGluZyA9IHZpLT5pX21hcHBpbmc7CisJcGFnZSA9IG50ZnNfbWFwX3BhZ2UobWFwcGluZywgaW5kZXgpOworCWlmIChJU19FUlIocGFnZSkpIHsKKwkJaWYgKCFpc19yb2xsYmFjaykKKwkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGYWlsZWQgdG8gbWFwIGZpcnN0IHBhZ2UgKGVycm9yICIKKwkJCQkJIiVsaSksIGFib3J0aW5nLiIsIFBUUl9FUlIocGFnZSkpOworCQlyZXR1cm4gUFRSX0VSUihwYWdlKTsKKwl9CisJa2FkZHIgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisKKwkvKiBTZXQgQHBvcyB0byB0aGUgcG9zaXRpb24gb2YgdGhlIGJ5dGUgY29udGFpbmluZyBAc3RhcnRfYml0LiAqLworCXBvcyA9IChzdGFydF9iaXQgPj4gMykgJiB+UEFHRV9DQUNIRV9NQVNLOworCisJLyogQ2FsY3VsYXRlIHRoZSBwb3NpdGlvbiBvZiBAc3RhcnRfYml0IGluIHRoZSBmaXJzdCBieXRlLiAqLworCWJpdCA9IHN0YXJ0X2JpdCAmIDc7CisKKwkvKiBJZiB0aGUgZmlyc3QgYnl0ZSBpcyBwYXJ0aWFsLCBtb2RpZnkgdGhlIGFwcHJvcHJpYXRlIGJpdHMgaW4gaXQuICovCisJaWYgKGJpdCkgeworCQl1OCAqYnl0ZSA9IGthZGRyICsgcG9zOworCQl3aGlsZSAoKGJpdCAmIDcpICYmIGNudC0tKSB7CisJCQlpZiAodmFsdWUpCisJCQkJKmJ5dGUgfD0gMSA8PCBiaXQrKzsKKwkJCWVsc2UKKwkJCQkqYnl0ZSAmPSB+KDEgPDwgYml0KyspOworCQl9CisJCS8qIElmIHdlIGFyZSBkb25lLCB1bm1hcCB0aGUgcGFnZSBhbmQgcmV0dXJuIHN1Y2Nlc3MuICovCisJCWlmICghY250KQorCQkJZ290byBkb25lOworCisJCS8qIFVwZGF0ZSBAcG9zIHRvIHRoZSBuZXcgcG9zaXRpb24uICovCisJCXBvcysrOworCX0KKwkvKgorCSAqIERlcGVuZGluZyBvbiBAdmFsdWUsIG1vZGlmeSBhbGwgcmVtYWluaW5nIHdob2xlIGJ5dGVzIGluIHRoZSBwYWdlIHVwCisJICogdG8gQGNudC4KKwkgKi8KKwlsZW4gPSBtaW5fdChzNjQsIGNudCA+PiAzLCBQQUdFX0NBQ0hFX1NJWkUgLSBwb3MpOworCW1lbXNldChrYWRkciArIHBvcywgdmFsdWUgPyAweGZmIDogMCwgbGVuKTsKKwljbnQgLT0gbGVuIDw8IDM7CisKKwkvKiBVcGRhdGUgQGxlbiB0byBwb2ludCB0byB0aGUgZmlyc3Qgbm90LWRvbmUgYnl0ZSBpbiB0aGUgcGFnZS4gKi8KKwlpZiAoY250IDwgOCkKKwkJbGVuICs9IHBvczsKKworCS8qIElmIHdlIGFyZSBub3QgaW4gdGhlIGxhc3QgcGFnZSwgZGVhbCB3aXRoIGFsbCBzdWJzZXF1ZW50IHBhZ2VzLiAqLworCXdoaWxlIChpbmRleCA8IGVuZF9pbmRleCkgeworCQlCVUdfT04oY250IDw9IDApOworCisJCS8qIFVwZGF0ZSBAaW5kZXggYW5kIGdldCB0aGUgbmV4dCBwYWdlLiAqLworCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJc2V0X3BhZ2VfZGlydHkocGFnZSk7CisJCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwkJcGFnZSA9IG50ZnNfbWFwX3BhZ2UobWFwcGluZywgKytpbmRleCk7CisJCWlmIChJU19FUlIocGFnZSkpCisJCQlnb3RvIHJvbGxiYWNrOworCQlrYWRkciA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwkJLyoKKwkJICogRGVwZW5kaW5nIG9uIEB2YWx1ZSwgbW9kaWZ5IGFsbCByZW1haW5pbmcgd2hvbGUgYnl0ZXMgaW4gdGhlCisJCSAqIHBhZ2UgdXAgdG8gQGNudC4KKwkJICovCisJCWxlbiA9IG1pbl90KHM2NCwgY250ID4+IDMsIFBBR0VfQ0FDSEVfU0laRSk7CisJCW1lbXNldChrYWRkciwgdmFsdWUgPyAweGZmIDogMCwgbGVuKTsKKwkJY250IC09IGxlbiA8PCAzOworCX0KKwkvKgorCSAqIFRoZSBjdXJyZW50bHkgbWFwcGVkIHBhZ2UgaXMgdGhlIGxhc3Qgb25lLiAgSWYgdGhlIGxhc3QgYnl0ZSBpcworCSAqIHBhcnRpYWwsIG1vZGlmeSB0aGUgYXBwcm9wcmlhdGUgYml0cyBpbiBpdC4gIE5vdGUsIEBsZW4gaXMgdGhlCisJICogcG9zaXRpb24gb2YgdGhlIGxhc3QgYnl0ZSBpbnNpZGUgdGhlIHBhZ2UuCisJICovCisJaWYgKGNudCkgeworCQl1OCAqYnl0ZTsKKworCQlCVUdfT04oY250ID4gNyk7CisKKwkJYml0ID0gY250OworCQlieXRlID0ga2FkZHIgKyBsZW47CisJCXdoaWxlIChiaXQtLSkgeworCQkJaWYgKHZhbHVlKQorCQkJCSpieXRlIHw9IDEgPDwgYml0OworCQkJZWxzZQorCQkJCSpieXRlICY9IH4oMSA8PCBiaXQpOworCQl9CisJfQorZG9uZToKKwkvKiBXZSBhcmUgZG9uZS4gIFVubWFwIHRoZSBwYWdlIGFuZCByZXR1cm4gc3VjY2Vzcy4gKi8KKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKwludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gMDsKK3JvbGxiYWNrOgorCS8qCisJICogQ3VycmVudCBzdGF0ZToKKwkgKgktIG5vIHBhZ2VzIGFyZSBtYXBwZWQKKwkgKgktIEBjb3VudCAtIEBjbnQgaXMgdGhlIG51bWJlciBvZiBiaXRzIHRoYXQgaGF2ZSBiZWVuIG1vZGlmaWVkCisJICovCisJaWYgKGlzX3JvbGxiYWNrKQorCQlyZXR1cm4gUFRSX0VSUihwYWdlKTsKKwlpZiAoY291bnQgIT0gY250KQorCQlwb3MgPSBfX250ZnNfYml0bWFwX3NldF9iaXRzX2luX3J1bih2aSwgc3RhcnRfYml0LCBjb3VudCAtIGNudCwKKwkJCQl2YWx1ZSA/IDAgOiAxLCBUUlVFKTsKKwllbHNlCisJCXBvcyA9IDA7CisJaWYgKCFwb3MpIHsKKwkJLyogUm9sbGJhY2sgd2FzIHN1Y2Nlc3NmdWwuICovCisJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGYWlsZWQgdG8gbWFwIHN1YnNlcXVlbnQgcGFnZSAoZXJyb3IgIgorCQkJCSIlbGkpLCBhYm9ydGluZy4iLCBQVFJfRVJSKHBhZ2UpKTsKKwl9IGVsc2UgeworCQkvKiBSb2xsYmFjayBmYWlsZWQuICovCisJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGYWlsZWQgdG8gbWFwIHN1YnNlcXVlbnQgcGFnZSAoZXJyb3IgIgorCQkJCSIlbGkpIGFuZCByb2xsYmFjayBmYWlsZWQgKGVycm9yICVpKS4gICIKKwkJCQkiQWJvcnRpbmcgYW5kIGxlYXZpbmcgaW5jb25zaXN0ZW50IG1ldGFkYXRhLiAgIgorCQkJCSJVbm1vdW50IGFuZCBydW4gY2hrZHNrLiIsIFBUUl9FUlIocGFnZSksIHBvcyk7CisJCU5Wb2xTZXRFcnJvcnMoTlRGU19TQih2aS0+aV9zYikpOworCX0KKwlyZXR1cm4gUFRSX0VSUihwYWdlKTsKK30KKworI2VuZGlmIC8qIE5URlNfUlcgKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvYml0bWFwLmggYi9mcy9udGZzL2JpdG1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNTBkNmIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL2JpdG1hcC5oCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogYml0bWFwLmggLSBEZWZpbmVzIGZvciBOVEZTIGtlcm5lbCBiaXRtYXAgaGFuZGxpbmcuICBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTCisgKgkgICAgICBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZuZGVmIF9MSU5VWF9OVEZTX0JJVE1BUF9ICisjZGVmaW5lIF9MSU5VWF9OVEZTX0JJVE1BUF9ICisKKyNpZmRlZiBOVEZTX1JXCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorCisjaW5jbHVkZSAidHlwZXMuaCIKKworZXh0ZXJuIGludCBfX250ZnNfYml0bWFwX3NldF9iaXRzX2luX3J1bihzdHJ1Y3QgaW5vZGUgKnZpLCBjb25zdCBzNjQgc3RhcnRfYml0LAorCQljb25zdCBzNjQgY291bnQsIGNvbnN0IHU4IHZhbHVlLCBjb25zdCBCT09MIGlzX3JvbGxiYWNrKTsKKworLyoqCisgKiBudGZzX2JpdG1hcF9zZXRfYml0c19pbl9ydW4gLSBzZXQgYSBydW4gb2YgYml0cyBpbiBhIGJpdG1hcCB0byBhIHZhbHVlCisgKiBAdmk6CQkJdmZzIGlub2RlIGRlc2NyaWJpbmcgdGhlIGJpdG1hcAorICogQHN0YXJ0X2JpdDoJCWZpcnN0IGJpdCB0byBzZXQKKyAqIEBjb3VudDoJCW51bWJlciBvZiBiaXRzIHRvIHNldAorICogQHZhbHVlOgkJdmFsdWUgdG8gc2V0IHRoZSBiaXRzIHRvIChpLmUuIDAgb3IgMSkKKyAqCisgKiBTZXQgQGNvdW50IGJpdHMgc3RhcnRpbmcgYXQgYml0IEBzdGFydF9iaXQgaW4gdGhlIGJpdG1hcCBkZXNjcmliZWQgYnkgdGhlCisgKiB2ZnMgaW5vZGUgQHZpIHRvIEB2YWx1ZSwgd2hlcmUgQHZhbHVlIGlzIGVpdGhlciAwIG9yIDEuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLgorICovCitzdGF0aWMgaW5saW5lIGludCBudGZzX2JpdG1hcF9zZXRfYml0c19pbl9ydW4oc3RydWN0IGlub2RlICp2aSwKKwkJY29uc3QgczY0IHN0YXJ0X2JpdCwgY29uc3QgczY0IGNvdW50LCBjb25zdCB1OCB2YWx1ZSkKK3sKKwlyZXR1cm4gX19udGZzX2JpdG1hcF9zZXRfYml0c19pbl9ydW4odmksIHN0YXJ0X2JpdCwgY291bnQsIHZhbHVlLAorCQkJRkFMU0UpOworfQorCisvKioKKyAqIG50ZnNfYml0bWFwX3NldF9ydW4gLSBzZXQgYSBydW4gb2YgYml0cyBpbiBhIGJpdG1hcAorICogQHZpOgkJdmZzIGlub2RlIGRlc2NyaWJpbmcgdGhlIGJpdG1hcAorICogQHN0YXJ0X2JpdDoJZmlyc3QgYml0IHRvIHNldAorICogQGNvdW50OgludW1iZXIgb2YgYml0cyB0byBzZXQKKyAqCisgKiBTZXQgQGNvdW50IGJpdHMgc3RhcnRpbmcgYXQgYml0IEBzdGFydF9iaXQgaW4gdGhlIGJpdG1hcCBkZXNjcmliZWQgYnkgdGhlCisgKiB2ZnMgaW5vZGUgQHZpLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbnRmc19iaXRtYXBfc2V0X3J1bihzdHJ1Y3QgaW5vZGUgKnZpLCBjb25zdCBzNjQgc3RhcnRfYml0LAorCQljb25zdCBzNjQgY291bnQpCit7CisJcmV0dXJuIG50ZnNfYml0bWFwX3NldF9iaXRzX2luX3J1bih2aSwgc3RhcnRfYml0LCBjb3VudCwgMSk7Cit9CisKKy8qKgorICogbnRmc19iaXRtYXBfY2xlYXJfcnVuIC0gY2xlYXIgYSBydW4gb2YgYml0cyBpbiBhIGJpdG1hcAorICogQHZpOgkJdmZzIGlub2RlIGRlc2NyaWJpbmcgdGhlIGJpdG1hcAorICogQHN0YXJ0X2JpdDoJZmlyc3QgYml0IHRvIGNsZWFyCisgKiBAY291bnQ6CW51bWJlciBvZiBiaXRzIHRvIGNsZWFyCisgKgorICogQ2xlYXIgQGNvdW50IGJpdHMgc3RhcnRpbmcgYXQgYml0IEBzdGFydF9iaXQgaW4gdGhlIGJpdG1hcCBkZXNjcmliZWQgYnkgdGhlCisgKiB2ZnMgaW5vZGUgQHZpLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbnRmc19iaXRtYXBfY2xlYXJfcnVuKHN0cnVjdCBpbm9kZSAqdmksIGNvbnN0IHM2NCBzdGFydF9iaXQsCisJCWNvbnN0IHM2NCBjb3VudCkKK3sKKwlyZXR1cm4gbnRmc19iaXRtYXBfc2V0X2JpdHNfaW5fcnVuKHZpLCBzdGFydF9iaXQsIGNvdW50LCAwKTsKK30KKworLyoqCisgKiBudGZzX2JpdG1hcF9zZXRfYml0IC0gc2V0IGEgYml0IGluIGEgYml0bWFwCisgKiBAdmk6CQl2ZnMgaW5vZGUgZGVzY3JpYmluZyB0aGUgYml0bWFwCisgKiBAYml0OgliaXQgdG8gc2V0CisgKgorICogU2V0IGJpdCBAYml0IGluIHRoZSBiaXRtYXAgZGVzY3JpYmVkIGJ5IHRoZSB2ZnMgaW5vZGUgQHZpLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbnRmc19iaXRtYXBfc2V0X2JpdChzdHJ1Y3QgaW5vZGUgKnZpLCBjb25zdCBzNjQgYml0KQoreworCXJldHVybiBudGZzX2JpdG1hcF9zZXRfcnVuKHZpLCBiaXQsIDEpOworfQorCisvKioKKyAqIG50ZnNfYml0bWFwX2NsZWFyX2JpdCAtIGNsZWFyIGEgYml0IGluIGEgYml0bWFwCisgKiBAdmk6CQl2ZnMgaW5vZGUgZGVzY3JpYmluZyB0aGUgYml0bWFwCisgKiBAYml0OgliaXQgdG8gY2xlYXIKKyAqCisgKiBDbGVhciBiaXQgQGJpdCBpbiB0aGUgYml0bWFwIGRlc2NyaWJlZCBieSB0aGUgdmZzIGlub2RlIEB2aS4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG50ZnNfYml0bWFwX2NsZWFyX2JpdChzdHJ1Y3QgaW5vZGUgKnZpLCBjb25zdCBzNjQgYml0KQoreworCXJldHVybiBudGZzX2JpdG1hcF9jbGVhcl9ydW4odmksIGJpdCwgMSk7Cit9CisKKyNlbmRpZiAvKiBOVEZTX1JXICovCisKKyNlbmRpZiAvKiBkZWZpbmVkIF9MSU5VWF9OVEZTX0JJVE1BUF9IICovCmRpZmYgLS1naXQgYS9mcy9udGZzL2NvbGxhdGUuYyBiL2ZzL250ZnMvY29sbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMjhhYjMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL2NvbGxhdGUuYwpAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIGNvbGxhdGUuYyAtIE5URlMga2VybmVsIGNvbGxhdGlvbiBoYW5kbGluZy4gIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbGxhdGUuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgIm50ZnMuaCIKKworc3RhdGljIGludCBudGZzX2NvbGxhdGVfYmluYXJ5KG50ZnNfdm9sdW1lICp2b2wsCisJCWNvbnN0IHZvaWQgKmRhdGExLCBjb25zdCBpbnQgZGF0YTFfbGVuLAorCQljb25zdCB2b2lkICpkYXRhMiwgY29uc3QgaW50IGRhdGEyX2xlbikKK3sKKwlpbnQgcmM7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwlyYyA9IG1lbWNtcChkYXRhMSwgZGF0YTIsIG1pbihkYXRhMV9sZW4sIGRhdGEyX2xlbikpOworCWlmICghcmMgJiYgKGRhdGExX2xlbiAhPSBkYXRhMl9sZW4pKSB7CisJCWlmIChkYXRhMV9sZW4gPCBkYXRhMl9sZW4pCisJCQlyYyA9IC0xOworCQllbHNlCisJCQlyYyA9IDE7CisJfQorCW50ZnNfZGVidWcoIkRvbmUsIHJldHVybmluZyAlaSIsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbnRmc19jb2xsYXRlX250b2ZzX3Vsb25nKG50ZnNfdm9sdW1lICp2b2wsCisJCWNvbnN0IHZvaWQgKmRhdGExLCBjb25zdCBpbnQgZGF0YTFfbGVuLAorCQljb25zdCB2b2lkICpkYXRhMiwgY29uc3QgaW50IGRhdGEyX2xlbikKK3sKKwlpbnQgcmM7CisJdTMyIGQxLCBkMjsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworCS8vIEZJWE1FOiAgV2UgZG9uJ3QgcmVhbGx5IHdhbnQgdG8gYnVnIGhlcmUuCisJQlVHX09OKGRhdGExX2xlbiAhPSBkYXRhMl9sZW4pOworCUJVR19PTihkYXRhMV9sZW4gIT0gNCk7CisJZDEgPSBsZTMyX3RvX2NwdXAoZGF0YTEpOworCWQyID0gbGUzMl90b19jcHVwKGRhdGEyKTsKKwlpZiAoZDEgPCBkMikKKwkJcmMgPSAtMTsKKwllbHNlIHsKKwkJaWYgKGQxID09IGQyKQorCQkJcmMgPSAwOworCQllbHNlCisJCQlyYyA9IDE7CisJfQorCW50ZnNfZGVidWcoIkRvbmUsIHJldHVybmluZyAlaSIsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKK3R5cGVkZWYgaW50ICgqbnRmc19jb2xsYXRlX2Z1bmNfdCkobnRmc192b2x1bWUgKiwgY29uc3Qgdm9pZCAqLCBjb25zdCBpbnQsCisJCWNvbnN0IHZvaWQgKiwgY29uc3QgaW50KTsKKworc3RhdGljIG50ZnNfY29sbGF0ZV9mdW5jX3QgbnRmc19kb19jb2xsYXRlMHgwWzNdID0geworCW50ZnNfY29sbGF0ZV9iaW5hcnksCisJTlVMTC8qbnRmc19jb2xsYXRlX2ZpbGVfbmFtZSovLAorCU5VTEwvKm50ZnNfY29sbGF0ZV91bmljb2RlX3N0cmluZyovLAorfTsKKworc3RhdGljIG50ZnNfY29sbGF0ZV9mdW5jX3QgbnRmc19kb19jb2xsYXRlMHgxWzRdID0geworCW50ZnNfY29sbGF0ZV9udG9mc191bG9uZywKKwlOVUxMLypudGZzX2NvbGxhdGVfbnRvZnNfc2lkKi8sCisJTlVMTC8qbnRmc19jb2xsYXRlX250b2ZzX3NlY3VyaXR5X2hhc2gqLywKKwlOVUxMLypudGZzX2NvbGxhdGVfbnRvZnNfdWxvbmdzKi8sCit9OworCisvKioKKyAqIG50ZnNfY29sbGF0ZSAtIGNvbGxhdGUgdHdvIGRhdGEgaXRlbXMgdXNpbmcgYSBzcGVjaWZpZWQgY29sbGF0aW9uIHJ1bGUKKyAqIEB2b2w6CW50ZnMgdm9sdW1lIHRvIHdoaWNoIHRoZSBkYXRhIGl0ZW1zIGJlbG9uZworICogQGNyOgkJY29sbGF0aW9uIHJ1bGUgdG8gdXNlIHdoZW4gY29tcGFyaW5nIHRoZSBpdGVtcworICogQGRhdGExOglmaXJzdCBkYXRhIGl0ZW0gdG8gY29sbGF0ZQorICogQGRhdGExX2xlbjoJbGVuZ3RoIGluIGJ5dGVzIG9mIEBkYXRhMQorICogQGRhdGEyOglzZWNvbmQgZGF0YSBpdGVtIHRvIGNvbGxhdGUKKyAqIEBkYXRhMl9sZW46CWxlbmd0aCBpbiBieXRlcyBvZiBAZGF0YTIKKyAqCisgKiBDb2xsYXRlIHRoZSB0d28gZGF0YSBpdGVtcyBAZGF0YTEgYW5kIEBkYXRhMiB1c2luZyB0aGUgY29sbGF0aW9uIHJ1bGUgQGNyCisgKiBhbmQgcmV0dXJuIC0xLCAwLCBpciAxIGlmIEBkYXRhMSBpcyBmb3VuZCwgcmVzcGVjdGl2ZWx5LCB0byBjb2xsYXRlIGJlZm9yZSwKKyAqIHRvIG1hdGNoLCBvciB0byBjb2xsYXRlIGFmdGVyIEBkYXRhMi4KKyAqCisgKiBGb3Igc3BlZWQgd2UgdXNlIHRoZSBjb2xsYXRpb24gcnVsZSBAY3IgYXMgYW4gaW5kZXggaW50byB0d28gdGFibGVzIG9mCisgKiBmdW5jdGlvbiBwb2ludGVycyB0byBjYWxsIHRoZSBhcHByb3ByaWF0ZSBjb2xsYXRpb24gZnVuY3Rpb24uCisgKi8KK2ludCBudGZzX2NvbGxhdGUobnRmc192b2x1bWUgKnZvbCwgQ09MTEFUSU9OX1JVTEUgY3IsCisJCWNvbnN0IHZvaWQgKmRhdGExLCBjb25zdCBpbnQgZGF0YTFfbGVuLAorCQljb25zdCB2b2lkICpkYXRhMiwgY29uc3QgaW50IGRhdGEyX2xlbikgeworCWludCBpOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CisJLyoKKwkgKiBGSVhNRTogIEF0IHRoZSBtb21lbnQgd2Ugb25seSBzdXBwb3J0IENPTExBVElPTl9CSU5BUlkgYW5kCisJICogQ09MTEFUSU9OX05UT0ZTX1VMT05HLCBzbyB3ZSBCVUcoKSBmb3IgZXZlcnl0aGluZyBlbHNlIGZvciBub3cuCisJICovCisJQlVHX09OKGNyICE9IENPTExBVElPTl9CSU5BUlkgJiYgY3IgIT0gQ09MTEFUSU9OX05UT0ZTX1VMT05HKTsKKwlpID0gbGUzMl90b19jcHUoY3IpOworCUJVR19PTihpIDwgMCk7CisJaWYgKGkgPD0gMHgwMikKKwkJcmV0dXJuIG50ZnNfZG9fY29sbGF0ZTB4MFtpXSh2b2wsIGRhdGExLCBkYXRhMV9sZW4sCisJCQkJZGF0YTIsIGRhdGEyX2xlbik7CisJQlVHX09OKGkgPCAweDEwKTsKKwlpIC09IDB4MTA7CisJaWYgKGxpa2VseShpIDw9IDMpKQorCQlyZXR1cm4gbnRmc19kb19jb2xsYXRlMHgxW2ldKHZvbCwgZGF0YTEsIGRhdGExX2xlbiwKKwkJCQlkYXRhMiwgZGF0YTJfbGVuKTsKKwlCVUcoKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL250ZnMvY29sbGF0ZS5oIGIvZnMvbnRmcy9jb2xsYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAyN2YzNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvY29sbGF0ZS5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBjb2xsYXRlLmggLSBEZWZpbmVzIGZvciBOVEZTIGtlcm5lbCBjb2xsYXRpb24gaGFuZGxpbmcuICBQYXJ0IG9mIHRoZQorICoJICAgICAgIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfTElOVVhfTlRGU19DT0xMQVRFX0gKKyNkZWZpbmUgX0xJTlVYX05URlNfQ09MTEFURV9ICisKKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgInZvbHVtZS5oIgorCitzdGF0aWMgaW5saW5lIEJPT0wgbnRmc19pc19jb2xsYXRpb25fcnVsZV9zdXBwb3J0ZWQoQ09MTEFUSU9OX1JVTEUgY3IpIHsKKwlpbnQgaTsKKworCS8qCisJICogRklYTUU6ICBBdCB0aGUgbW9tZW50IHdlIG9ubHkgc3VwcG9ydCBDT0xMQVRJT05fQklOQVJZIGFuZAorCSAqIENPTExBVElPTl9OVE9GU19VTE9ORywgc28gd2UgcmV0dXJuIGZhbHNlIGZvciBldmVyeXRoaW5nIGVsc2UgZm9yCisJICogbm93LgorCSAqLworCWlmICh1bmxpa2VseShjciAhPSBDT0xMQVRJT05fQklOQVJZICYmIGNyICE9IENPTExBVElPTl9OVE9GU19VTE9ORykpCisJCXJldHVybiBGQUxTRTsKKwlpID0gbGUzMl90b19jcHUoY3IpOworCWlmIChsaWtlbHkoKChpID49IDApICYmIChpIDw9IDB4MDIpKSB8fAorCQkJKChpID49IDB4MTApICYmIChpIDw9IDB4MTMpKSkpCisJCXJldHVybiBUUlVFOworCXJldHVybiBGQUxTRTsKK30KKworZXh0ZXJuIGludCBudGZzX2NvbGxhdGUobnRmc192b2x1bWUgKnZvbCwgQ09MTEFUSU9OX1JVTEUgY3IsCisJCWNvbnN0IHZvaWQgKmRhdGExLCBjb25zdCBpbnQgZGF0YTFfbGVuLAorCQljb25zdCB2b2lkICpkYXRhMiwgY29uc3QgaW50IGRhdGEyX2xlbik7CisKKyNlbmRpZiAvKiBfTElOVVhfTlRGU19DT0xMQVRFX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvY29tcHJlc3MuYyBiL2ZzL250ZnMvY29tcHJlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTVhZTcwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9jb21wcmVzcy5jCkBAIC0wLDAgKzEsOTU3IEBACisvKioKKyAqIGNvbXByZXNzLmMgLSBOVEZTIGtlcm5lbCBjb21wcmVzc2VkIGF0dHJpYnV0ZXMgaGFuZGxpbmcuCisgKgkJUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChjKSAyMDAyIFJpY2hhcmQgUnVzc29uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisKKyNpbmNsdWRlICJhdHRyaWIuaCIKKyNpbmNsdWRlICJpbm9kZS5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAibnRmcy5oIgorCisvKioKKyAqIG50ZnNfY29tcHJlc3Npb25fY29uc3RhbnRzIC0gZW51bSBvZiBjb25zdGFudHMgdXNlZCBpbiB0aGUgY29tcHJlc3Npb24gY29kZQorICovCit0eXBlZGVmIGVudW0geworCS8qIFRva2VuIHR5cGVzIGFuZCBhY2Nlc3MgbWFzay4gKi8KKwlOVEZTX1NZTUJPTF9UT0tFTgk9CTAsCisJTlRGU19QSFJBU0VfVE9LRU4JPQkxLAorCU5URlNfVE9LRU5fTUFTSwkJPQkxLAorCisJLyogQ29tcHJlc3Npb24gc3ViLWJsb2NrIGNvbnN0YW50cy4gKi8KKwlOVEZTX1NCX1NJWkVfTUFTSwk9CTB4MGZmZiwKKwlOVEZTX1NCX1NJWkUJCT0JMHgxMDAwLAorCU5URlNfU0JfSVNfQ09NUFJFU1NFRAk9CTB4ODAwMCwKKworCS8qCisJICogVGhlIG1heGltdW0gY29tcHJlc3Npb24gYmxvY2sgc2l6ZSBpcyBieSBkZWZpbml0aW9uIDE2ICogdGhlIGNsdXN0ZXIKKwkgKiBzaXplLCB3aXRoIHRoZSBtYXhpbXVtIHN1cHBvcnRlZCBjbHVzdGVyIHNpemUgYmVpbmcgNGtpQi4gVGh1cyB0aGUKKwkgKiBtYXhpbXVtIGNvbXByZXNzaW9uIGJ1ZmZlciBzaXplIGlzIDY0a2lCLCBzbyB3ZSB1c2UgdGhpcyB3aGVuCisJICogaW5pdGlhbGl6aW5nIHRoZSBjb21wcmVzc2lvbiBidWZmZXIuCisJICovCisJTlRGU19NQVhfQ0JfU0laRQk9IDY0ICogMTAyNCwKK30gbnRmc19jb21wcmVzc2lvbl9jb25zdGFudHM7CisKKy8qKgorICogbnRmc19jb21wcmVzc2lvbl9idWZmZXIgLSBvbmUgYnVmZmVyIGZvciB0aGUgZGVjb21wcmVzc2lvbiBlbmdpbmUKKyAqLworc3RhdGljIHU4ICpudGZzX2NvbXByZXNzaW9uX2J1ZmZlciA9IE5VTEw7CisKKy8qKgorICogbnRmc19jYl9sb2NrIC0gc3BpbmxvY2sgd2hpY2ggcHJvdGVjdHMgbnRmc19jb21wcmVzc2lvbl9idWZmZXIKKyAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhudGZzX2NiX2xvY2spOworCisvKioKKyAqIGFsbG9jYXRlX2NvbXByZXNzaW9uX2J1ZmZlcnMgLSBhbGxvY2F0ZSB0aGUgZGVjb21wcmVzc2lvbiBidWZmZXJzCisgKgorICogQ2FsbGVyIGhhcyB0byBob2xkIHRoZSBudGZzX2xvY2sgc2VtYXBob3JlLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgLUVOT01FTSBpZiB0aGUgYWxsb2NhdGlvbnMgZmFpbGVkLgorICovCitpbnQgYWxsb2NhdGVfY29tcHJlc3Npb25fYnVmZmVycyh2b2lkKQoreworCUJVR19PTihudGZzX2NvbXByZXNzaW9uX2J1ZmZlcik7CisKKwludGZzX2NvbXByZXNzaW9uX2J1ZmZlciA9IHZtYWxsb2MoTlRGU19NQVhfQ0JfU0laRSk7CisJaWYgKCFudGZzX2NvbXByZXNzaW9uX2J1ZmZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZnJlZV9jb21wcmVzc2lvbl9idWZmZXJzIC0gZnJlZSB0aGUgZGVjb21wcmVzc2lvbiBidWZmZXJzCisgKgorICogQ2FsbGVyIGhhcyB0byBob2xkIHRoZSBudGZzX2xvY2sgc2VtYXBob3JlLgorICovCit2b2lkIGZyZWVfY29tcHJlc3Npb25fYnVmZmVycyh2b2lkKQoreworCUJVR19PTighbnRmc19jb21wcmVzc2lvbl9idWZmZXIpOworCXZmcmVlKG50ZnNfY29tcHJlc3Npb25fYnVmZmVyKTsKKwludGZzX2NvbXByZXNzaW9uX2J1ZmZlciA9IE5VTEw7Cit9CisKKy8qKgorICogemVyb19wYXJ0aWFsX2NvbXByZXNzZWRfcGFnZSAtIHplcm8gb3V0IG9mIGJvdW5kcyBjb21wcmVzc2VkIHBhZ2UgcmVnaW9uCisgKi8KK3N0YXRpYyB2b2lkIHplcm9fcGFydGlhbF9jb21wcmVzc2VkX3BhZ2UobnRmc19pbm9kZSAqbmksIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXU4ICprcCA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwl1bnNpZ25lZCBpbnQga3Bfb2ZzOworCisJbnRmc19kZWJ1ZygiWmVyb2luZyBwYWdlIHJlZ2lvbiBvdXRzaWRlIGluaXRpYWxpemVkIHNpemUuIik7CisJaWYgKCgoczY0KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpID49IG5pLT5pbml0aWFsaXplZF9zaXplKSB7CisJCS8qCisJCSAqIEZJWE1FOiBVc2luZyBjbGVhcl9wYWdlKCkgd2lsbCBiZWNvbWUgd3Jvbmcgd2hlbiB3ZSBnZXQKKwkJICogUEFHRV9DQUNIRV9TSVpFICE9IFBBR0VfU0laRSBidXQgZm9yIG5vdyB0aGVyZSBpcyBubyBwcm9ibGVtLgorCQkgKi8KKwkJY2xlYXJfcGFnZShrcCk7CisJCXJldHVybjsKKwl9CisJa3Bfb2ZzID0gbmktPmluaXRpYWxpemVkX3NpemUgJiB+UEFHRV9DQUNIRV9NQVNLOworCW1lbXNldChrcCArIGtwX29mcywgMCwgUEFHRV9DQUNIRV9TSVpFIC0ga3Bfb2ZzKTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogaGFuZGxlX2JvdW5kc19jb21wcmVzc2VkX3BhZ2UgLSB0ZXN0IGZvciZoYW5kbGUgb3V0IG9mIGJvdW5kcyBjb21wcmVzc2VkIHBhZ2UKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGhhbmRsZV9ib3VuZHNfY29tcHJlc3NlZF9wYWdlKG50ZnNfaW5vZGUgKm5pLAorCQlzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlpZiAoKHBhZ2UtPmluZGV4ID49IChuaS0+aW5pdGlhbGl6ZWRfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUKSkgJiYKKwkJCShuaS0+aW5pdGlhbGl6ZWRfc2l6ZSA8IFZGU19JKG5pKS0+aV9zaXplKSkKKwkJemVyb19wYXJ0aWFsX2NvbXByZXNzZWRfcGFnZShuaSwgcGFnZSk7CisJcmV0dXJuOworfQorCisvKioKKyAqIG50ZnNfZGVjb21wcmVzcyAtIGRlY29tcHJlc3MgYSBjb21wcmVzc2lvbiBibG9jayBpbnRvIGFuIGFycmF5IG9mIHBhZ2VzCisgKiBAZGVzdF9wYWdlczoJCWRlc3RpbmF0aW9uIGFycmF5IG9mIHBhZ2VzCisgKiBAZGVzdF9pbmRleDoJCWN1cnJlbnQgaW5kZXggaW50byBAZGVzdF9wYWdlcyAoSU4vT1VUKQorICogQGRlc3Rfb2ZzOgkJY3VycmVudCBvZmZzZXQgd2l0aGluIEBkZXN0X3BhZ2VzW0BkZXN0X2luZGV4XSAoSU4vT1VUKQorICogQGRlc3RfbWF4X2luZGV4OgltYXhpbXVtIGluZGV4IGludG8gQGRlc3RfcGFnZXMgKElOKQorICogQGRlc3RfbWF4X29mczoJbWF4aW11bSBvZmZzZXQgd2l0aGluIEBkZXN0X3BhZ2VzW0BkZXN0X21heF9pbmRleF0gKElOKQorICogQHhwYWdlOgkJdGhlIHRhcmdldCBwYWdlICgtMSBpZiBub25lKSAoSU4pCisgKiBAeHBhZ2VfZG9uZToJCXNldCB0byAxIGlmIHhwYWdlIHdhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IChJTi9PVVQpCisgKiBAY2Jfc3RhcnQ6CQljb21wcmVzc2lvbiBibG9jayB0byBkZWNvbXByZXNzIChJTikKKyAqIEBjYl9zaXplOgkJc2l6ZSBvZiBjb21wcmVzc2lvbiBibG9jayBAY2Jfc3RhcnQgaW4gYnl0ZXMgKElOKQorICoKKyAqIFRoZSBjYWxsZXIgbXVzdCBoYXZlIGRpc2FibGVkIHByZWVtcHRpb24uIG50ZnNfZGVjb21wcmVzcygpIHJlZW5hYmxlcyBpdCB3aGVuCisgKiB0aGUgY3JpdGljYWwgc2VjdGlvbiBpcyBmaW5pc2hlZC4KKyAqCisgKiBUaGlzIGRlY29tcHJlc3NlcyB0aGUgY29tcHJlc3Npb24gYmxvY2sgQGNiX3N0YXJ0IGludG8gdGhlIGFycmF5IG9mCisgKiBkZXN0aW5hdGlvbiBwYWdlcyBAZGVzdF9wYWdlcyBzdGFydGluZyBhdCBpbmRleCBAZGVzdF9pbmRleCBpbnRvIEBkZXN0X3BhZ2VzCisgKiBhbmQgYXQgb2Zmc2V0IEBkZXN0X3BvcyBpbnRvIHRoZSBwYWdlIEBkZXN0X3BhZ2VzW0BkZXN0X2luZGV4XS4KKyAqCisgKiBXaGVuIHRoZSBwYWdlIEBkZXN0X3BhZ2VzW0B4cGFnZV0gaXMgY29tcGxldGVkLCBAeHBhZ2VfZG9uZSBpcyBzZXQgdG8gMS4KKyAqIElmIHhwYWdlIGlzIC0xIG9yIEB4cGFnZSBoYXMgbm90IGJlZW4gY29tcGxldGVkLCBAeHBhZ2VfZG9uZSBpcyBub3QgbW9kaWZpZWQuCisgKgorICogQGNiX3N0YXJ0IGlzIGEgcG9pbnRlciB0byB0aGUgY29tcHJlc3Npb24gYmxvY2sgd2hpY2ggbmVlZHMgZGVjb21wcmVzc2luZworICogYW5kIEBjYl9zaXplIGlzIHRoZSBzaXplIG9mIEBjYl9zdGFydCBpbiBieXRlcyAoOC02NGtpQikuCisgKgorICogUmV0dXJuIDAgaWYgc3VjY2VzcyBvciAtRU9WRVJGTE9XIG9uIGVycm9yIGluIHRoZSBjb21wcmVzc2VkIHN0cmVhbS4KKyAqIEB4cGFnZV9kb25lIGluZGljYXRlcyB3aGV0aGVyIHRoZSB0YXJnZXQgcGFnZSAoQGRlc3RfcGFnZXNbQHhwYWdlXSkgd2FzCisgKiBjb21wbGV0ZWQgZHVyaW5nIHRoZSBkZWNvbXByZXNzaW9uIG9mIHRoZSBjb21wcmVzc2lvbiBibG9jayAoQGNiX3N0YXJ0KS4KKyAqCisgKiBXYXJuaW5nOiBUaGlzIGZ1bmN0aW9uICpSRVFVSVJFUyogUEFHRV9DQUNIRV9TSVpFID49IDQwOTYgb3IgaXQgd2lsbCBibG93IHVwCisgKiB1bnByZWRpY2F0Ymx5ISBZb3UgaGF2ZSBiZWVuIHdhcm5lZCEKKyAqCisgKiBOb3RlIHRvIGhhY2tlcnM6IFRoaXMgZnVuY3Rpb24gbWF5IG5vdCBzbGVlcCB1bnRpbCBpdCBoYXMgZmluaXNoZWQgYWNjZXNzaW5nCisgKiB0aGUgY29tcHJlc3Npb24gYmxvY2sgQGNiX3N0YXJ0IGFzIGl0IGlzIGEgcGVyLUNQVSBidWZmZXIuCisgKi8KK3N0YXRpYyBpbnQgbnRmc19kZWNvbXByZXNzKHN0cnVjdCBwYWdlICpkZXN0X3BhZ2VzW10sIGludCAqZGVzdF9pbmRleCwKKwkJaW50ICpkZXN0X29mcywgY29uc3QgaW50IGRlc3RfbWF4X2luZGV4LCBjb25zdCBpbnQgZGVzdF9tYXhfb2ZzLAorCQljb25zdCBpbnQgeHBhZ2UsIGNoYXIgKnhwYWdlX2RvbmUsIHU4ICpjb25zdCBjYl9zdGFydCwKKwkJY29uc3QgdTMyIGNiX3NpemUpCit7CisJLyoKKwkgKiBQb2ludGVycyBpbnRvIHRoZSBjb21wcmVzc2VkIGRhdGEsIGkuZS4gdGhlIGNvbXByZXNzaW9uIGJsb2NrIChjYiksCisJICogYW5kIHRoZSB0aGVyZWluIGNvbnRhaW5lZCBzdWItYmxvY2tzIChzYikuCisJICovCisJdTggKmNiX2VuZCA9IGNiX3N0YXJ0ICsgY2Jfc2l6ZTsgLyogRW5kIG9mIGNiLiAqLworCXU4ICpjYiA9IGNiX3N0YXJ0OwkvKiBDdXJyZW50IHBvc2l0aW9uIGluIGNiLiAqLworCXU4ICpjYl9zYl9zdGFydCA9IGNiOwkvKiBCZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgc2IgaW4gdGhlIGNiLiAqLworCXU4ICpjYl9zYl9lbmQ7CQkvKiBFbmQgb2YgY3VycmVudCBzYiAvIGJlZ2lubmluZyBvZiBuZXh0IHNiLiAqLworCisJLyogVmFyaWFibGVzIGZvciB1bmNvbXByZXNzZWQgZGF0YSAvIGRlc3RpbmF0aW9uLiAqLworCXN0cnVjdCBwYWdlICpkcDsJLyogQ3VycmVudCBkZXN0aW5hdGlvbiBwYWdlIGJlaW5nIHdvcmtlZCBvbi4gKi8KKwl1OCAqZHBfYWRkcjsJCS8qIEN1cnJlbnQgcG9pbnRlciBpbnRvIGRwLiAqLworCXU4ICpkcF9zYl9zdGFydDsJLyogU3RhcnQgb2YgY3VycmVudCBzdWItYmxvY2sgaW4gZHAuICovCisJdTggKmRwX3NiX2VuZDsJCS8qIEVuZCBvZiBjdXJyZW50IHNiIGluIGRwIChkcF9zYl9zdGFydCArCisJCQkJICAgTlRGU19TQl9TSVpFKS4gKi8KKwl1MTYgZG9fc2Jfc3RhcnQ7CS8qIEBkZXN0X29mcyB3aGVuIHN0YXJ0aW5nIHRoaXMgc3ViLWJsb2NrLiAqLworCXUxNiBkb19zYl9lbmQ7CQkvKiBAZGVzdF9vZnMgb2YgZW5kIG9mIHRoaXMgc2IgKGRvX3NiX3N0YXJ0ICsKKwkJCQkgICBOVEZTX1NCX1NJWkUpLiAqLworCisJLyogVmFyaWFibGVzIGZvciB0YWcgYW5kIHRva2VuIHBhcnNpbmcuICovCisJdTggdGFnOwkJCS8qIEN1cnJlbnQgdGFnLiAqLworCWludCB0b2tlbjsJCS8qIExvb3AgY291bnRlciBmb3IgdGhlIGVpZ2h0IHRva2VucyBpbiB0YWcuICovCisKKwkvKiBOZWVkIHRoaXMgYmVjYXVzZSB3ZSBjYW4ndCBzbGVlcCwgc28gbmVlZCB0d28gc3RhZ2VzLiAqLworCWludCBjb21wbGV0ZWRfcGFnZXNbZGVzdF9tYXhfaW5kZXggLSAqZGVzdF9pbmRleCArIDFdOworCWludCBucl9jb21wbGV0ZWRfcGFnZXMgPSAwOworCisJLyogRGVmYXVsdCBlcnJvciBjb2RlLiAqLworCWludCBlcnIgPSAtRU9WRVJGTE9XOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcsIGNiX3NpemUgPSAweCV4LiIsIGNiX3NpemUpOworZG9fbmV4dF9zYjoKKwludGZzX2RlYnVnKCJCZWdpbm5pbmcgc3ViLWJsb2NrIGF0IG9mZnNldCA9IDB4JXp4IGluIHRoZSBjYi4iLAorCQkJY2IgLSBjYl9zdGFydCk7CisJLyoKKwkgKiBIYXZlIHdlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgY29tcHJlc3Npb24gYmxvY2sgb3IgdGhlIGVuZCBvZiB0aGUKKwkgKiBkZWNvbXByZXNzZWQgZGF0YT8gIFRoZSBsYXR0ZXIgY2FuIGhhcHBlbiBmb3IgZXhhbXBsZSBpZiB0aGUgY3VycmVudAorCSAqIHBvc2l0aW9uIGluIHRoZSBjb21wcmVzc2lvbiBibG9jayBpcyBvbmUgYnl0ZSBiZWZvcmUgaXRzIGVuZCBzbyB0aGUKKwkgKiBmaXJzdCB0d28gY2hlY2tzIGRvIG5vdCBkZXRlY3QgaXQuCisJICovCisJaWYgKGNiID09IGNiX2VuZCB8fCAhbGUxNl90b19jcHVwKChsZTE2KiljYikgfHwKKwkJCSgqZGVzdF9pbmRleCA9PSBkZXN0X21heF9pbmRleCAmJgorCQkJKmRlc3Rfb2ZzID09IGRlc3RfbWF4X29mcykpIHsKKwkJaW50IGk7CisKKwkJbnRmc19kZWJ1ZygiQ29tcGxldGVkLiBSZXR1cm5pbmcgc3VjY2VzcyAoMCkuIik7CisJCWVyciA9IDA7CityZXR1cm5fZXJyb3I6CisJCS8qIFdlIGNhbiBzbGVlcCBmcm9tIG5vdyBvbiwgc28gd2UgZHJvcCBsb2NrLiAqLworCQlzcGluX3VubG9jaygmbnRmc19jYl9sb2NrKTsKKwkJLyogU2Vjb25kIHN0YWdlOiBmaW5hbGl6ZSBjb21wbGV0ZWQgcGFnZXMuICovCisJCWlmIChucl9jb21wbGV0ZWRfcGFnZXMgPiAwKSB7CisJCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGRlc3RfcGFnZXNbY29tcGxldGVkX3BhZ2VzWzBdXTsKKwkJCW50ZnNfaW5vZGUgKm5pID0gTlRGU19JKHBhZ2UtPm1hcHBpbmctPmhvc3QpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgbnJfY29tcGxldGVkX3BhZ2VzOyBpKyspIHsKKwkJCQlpbnQgZGkgPSBjb21wbGV0ZWRfcGFnZXNbaV07CisKKwkJCQlkcCA9IGRlc3RfcGFnZXNbZGldOworCQkJCS8qCisJCQkJICogSWYgd2UgYXJlIG91dHNpZGUgdGhlIGluaXRpYWxpemVkIHNpemUsIHplcm8KKwkJCQkgKiB0aGUgb3V0IG9mIGJvdW5kcyBwYWdlIHJhbmdlLgorCQkJCSAqLworCQkJCWhhbmRsZV9ib3VuZHNfY29tcHJlc3NlZF9wYWdlKG5pLCBkcCk7CisJCQkJZmx1c2hfZGNhY2hlX3BhZ2UoZHApOworCQkJCWt1bm1hcChkcCk7CisJCQkJU2V0UGFnZVVwdG9kYXRlKGRwKTsKKwkJCQl1bmxvY2tfcGFnZShkcCk7CisJCQkJaWYgKGRpID09IHhwYWdlKQorCQkJCQkqeHBhZ2VfZG9uZSA9IDE7CisJCQkJZWxzZQorCQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UoZHApOworCQkJCWRlc3RfcGFnZXNbZGldID0gTlVMTDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZXJyOworCX0KKworCS8qIFNldHVwIG9mZnNldHMgZm9yIHRoZSBjdXJyZW50IHN1Yi1ibG9jayBkZXN0aW5hdGlvbi4gKi8KKwlkb19zYl9zdGFydCA9ICpkZXN0X29mczsKKwlkb19zYl9lbmQgPSBkb19zYl9zdGFydCArIE5URlNfU0JfU0laRTsKKworCS8qIENoZWNrIHRoYXQgd2UgYXJlIHN0aWxsIHdpdGhpbiBhbGxvd2VkIGJvdW5kYXJpZXMuICovCisJaWYgKCpkZXN0X2luZGV4ID09IGRlc3RfbWF4X2luZGV4ICYmIGRvX3NiX2VuZCA+IGRlc3RfbWF4X29mcykKKwkJZ290byByZXR1cm5fb3ZlcmZsb3c7CisKKwkvKiBEb2VzIHRoZSBtaW5pbXVtIHNpemUgb2YgYSBjb21wcmVzc2VkIHNiIG92ZXJmbG93IHZhbGlkIHJhbmdlPyAqLworCWlmIChjYiArIDYgPiBjYl9lbmQpCisJCWdvdG8gcmV0dXJuX292ZXJmbG93OworCisJLyogU2V0dXAgdGhlIGN1cnJlbnQgc3ViLWJsb2NrIHNvdXJjZSBwb2ludGVycyBhbmQgdmFsaWRhdGUgcmFuZ2UuICovCisJY2Jfc2Jfc3RhcnQgPSBjYjsKKwljYl9zYl9lbmQgPSBjYl9zYl9zdGFydCArIChsZTE2X3RvX2NwdXAoKGxlMTYqKWNiKSAmIE5URlNfU0JfU0laRV9NQVNLKQorCQkJKyAzOworCWlmIChjYl9zYl9lbmQgPiBjYl9lbmQpCisJCWdvdG8gcmV0dXJuX292ZXJmbG93OworCisJLyogR2V0IHRoZSBjdXJyZW50IGRlc3RpbmF0aW9uIHBhZ2UuICovCisJZHAgPSBkZXN0X3BhZ2VzWypkZXN0X2luZGV4XTsKKwlpZiAoIWRwKSB7CisJCS8qIE5vIHBhZ2UgcHJlc2VudC4gU2tpcCBkZWNvbXByZXNzaW9uIG9mIHRoaXMgc3ViLWJsb2NrLiAqLworCQljYiA9IGNiX3NiX2VuZDsKKworCQkvKiBBZHZhbmNlIGRlc3RpbmF0aW9uIHBvc2l0aW9uIHRvIG5leHQgc3ViLWJsb2NrLiAqLworCQkqZGVzdF9vZnMgPSAoKmRlc3Rfb2ZzICsgTlRGU19TQl9TSVpFKSAmIH5QQUdFX0NBQ0hFX01BU0s7CisJCWlmICghKmRlc3Rfb2ZzICYmICgrKypkZXN0X2luZGV4ID4gZGVzdF9tYXhfaW5kZXgpKQorCQkJZ290byByZXR1cm5fb3ZlcmZsb3c7CisJCWdvdG8gZG9fbmV4dF9zYjsKKwl9CisKKwkvKiBXZSBoYXZlIGEgdmFsaWQgZGVzdGluYXRpb24gcGFnZS4gU2V0dXAgdGhlIGRlc3RpbmF0aW9uIHBvaW50ZXJzLiAqLworCWRwX2FkZHIgPSAodTgqKXBhZ2VfYWRkcmVzcyhkcCkgKyBkb19zYl9zdGFydDsKKworCS8qIE5vdywgd2UgYXJlIHJlYWR5IHRvIHByb2Nlc3MgdGhlIGN1cnJlbnQgc3ViLWJsb2NrIChzYikuICovCisJaWYgKCEobGUxNl90b19jcHVwKChsZTE2KiljYikgJiBOVEZTX1NCX0lTX0NPTVBSRVNTRUQpKSB7CisJCW50ZnNfZGVidWcoIkZvdW5kIHVuY29tcHJlc3NlZCBzdWItYmxvY2suIik7CisJCS8qIFRoaXMgc2IgaXMgbm90IGNvbXByZXNzZWQsIGp1c3QgY29weSBpdCBpbnRvIGRlc3RpbmF0aW9uLiAqLworCisJCS8qIEFkdmFuY2Ugc291cmNlIHBvc2l0aW9uIHRvIGZpcnN0IGRhdGEgYnl0ZS4gKi8KKwkJY2IgKz0gMjsKKworCQkvKiBBbiB1bmNvbXByZXNzZWQgc2IgbXVzdCBiZSBmdWxsIHNpemUuICovCisJCWlmIChjYl9zYl9lbmQgLSBjYiAhPSBOVEZTX1NCX1NJWkUpCisJCQlnb3RvIHJldHVybl9vdmVyZmxvdzsKKworCQkvKiBDb3B5IHRoZSBibG9jayBhbmQgYWR2YW5jZSB0aGUgc291cmNlIHBvc2l0aW9uLiAqLworCQltZW1jcHkoZHBfYWRkciwgY2IsIE5URlNfU0JfU0laRSk7CisJCWNiICs9IE5URlNfU0JfU0laRTsKKworCQkvKiBBZHZhbmNlIGRlc3RpbmF0aW9uIHBvc2l0aW9uIHRvIG5leHQgc3ViLWJsb2NrLiAqLworCQkqZGVzdF9vZnMgKz0gTlRGU19TQl9TSVpFOworCQlpZiAoISgqZGVzdF9vZnMgJj0gflBBR0VfQ0FDSEVfTUFTSykpIHsKK2ZpbmFsaXplX3BhZ2U6CisJCQkvKgorCQkJICogRmlyc3Qgc3RhZ2U6IGFkZCBjdXJyZW50IHBhZ2UgaW5kZXggdG8gYXJyYXkgb2YKKwkJCSAqIGNvbXBsZXRlZCBwYWdlcy4KKwkJCSAqLworCQkJY29tcGxldGVkX3BhZ2VzW25yX2NvbXBsZXRlZF9wYWdlcysrXSA9ICpkZXN0X2luZGV4OworCQkJaWYgKCsrKmRlc3RfaW5kZXggPiBkZXN0X21heF9pbmRleCkKKwkJCQlnb3RvIHJldHVybl9vdmVyZmxvdzsKKwkJfQorCQlnb3RvIGRvX25leHRfc2I7CisJfQorCW50ZnNfZGVidWcoIkZvdW5kIGNvbXByZXNzZWQgc3ViLWJsb2NrLiIpOworCS8qIFRoaXMgc2IgaXMgY29tcHJlc3NlZCwgZGVjb21wcmVzcyBpdCBpbnRvIGRlc3RpbmF0aW9uLiAqLworCisJLyogU2V0dXAgZGVzdGluYXRpb24gcG9pbnRlcnMuICovCisJZHBfc2Jfc3RhcnQgPSBkcF9hZGRyOworCWRwX3NiX2VuZCA9IGRwX3NiX3N0YXJ0ICsgTlRGU19TQl9TSVpFOworCisJLyogRm9yd2FyZCB0byB0aGUgZmlyc3QgdGFnIGluIHRoZSBzdWItYmxvY2suICovCisJY2IgKz0gMjsKK2RvX25leHRfdGFnOgorCWlmIChjYiA9PSBjYl9zYl9lbmQpIHsKKwkJLyogQ2hlY2sgaWYgdGhlIGRlY29tcHJlc3NlZCBzdWItYmxvY2sgd2FzIG5vdCBmdWxsLWxlbmd0aC4gKi8KKwkJaWYgKGRwX2FkZHIgPCBkcF9zYl9lbmQpIHsKKwkJCWludCBucl9ieXRlcyA9IGRvX3NiX2VuZCAtICpkZXN0X29mczsKKworCQkJbnRmc19kZWJ1ZygiRmlsbGluZyBpbmNvbXBsZXRlIHN1Yi1ibG9jayB3aXRoICIKKwkJCQkJInplcm9lcy4iKTsKKwkJCS8qIFplcm8gcmVtYWluZGVyIGFuZCB1cGRhdGUgZGVzdGluYXRpb24gcG9zaXRpb24uICovCisJCQltZW1zZXQoZHBfYWRkciwgMCwgbnJfYnl0ZXMpOworCQkJKmRlc3Rfb2ZzICs9IG5yX2J5dGVzOworCQl9CisJCS8qIFdlIGhhdmUgZmluaXNoZWQgdGhlIGN1cnJlbnQgc3ViLWJsb2NrLiAqLworCQlpZiAoISgqZGVzdF9vZnMgJj0gflBBR0VfQ0FDSEVfTUFTSykpCisJCQlnb3RvIGZpbmFsaXplX3BhZ2U7CisJCWdvdG8gZG9fbmV4dF9zYjsKKwl9CisKKwkvKiBDaGVjayB3ZSBhcmUgc3RpbGwgaW4gcmFuZ2UuICovCisJaWYgKGNiID4gY2Jfc2JfZW5kIHx8IGRwX2FkZHIgPiBkcF9zYl9lbmQpCisJCWdvdG8gcmV0dXJuX292ZXJmbG93OworCisJLyogR2V0IHRoZSBuZXh0IHRhZyBhbmQgYWR2YW5jZSB0byBmaXJzdCB0b2tlbi4gKi8KKwl0YWcgPSAqY2IrKzsKKworCS8qIFBhcnNlIHRoZSBlaWdodCB0b2tlbnMgZGVzY3JpYmVkIGJ5IHRoZSB0YWcuICovCisJZm9yICh0b2tlbiA9IDA7IHRva2VuIDwgODsgdG9rZW4rKywgdGFnID4+PSAxKSB7CisJCXUxNiBsZywgcHQsIGxlbmd0aCwgbWF4X25vbl9vdmVybGFwOworCQlyZWdpc3RlciB1MTYgaTsKKwkJdTggKmRwX2JhY2tfYWRkcjsKKworCQkvKiBDaGVjayBpZiB3ZSBhcmUgZG9uZSAvIHN0aWxsIGluIHJhbmdlLiAqLworCQlpZiAoY2IgPj0gY2Jfc2JfZW5kIHx8IGRwX2FkZHIgPiBkcF9zYl9lbmQpCisJCQlicmVhazsKKworCQkvKiBEZXRlcm1pbmUgdG9rZW4gdHlwZSBhbmQgcGFyc2UgYXBwcm9wcmlhdGVseS4qLworCQlpZiAoKHRhZyAmIE5URlNfVE9LRU5fTUFTSykgPT0gTlRGU19TWU1CT0xfVE9LRU4pIHsKKwkJCS8qCisJCQkgKiBXZSBoYXZlIGEgc3ltYm9sIHRva2VuLCBjb3B5IHRoZSBzeW1ib2wgYWNyb3NzLCBhbmQKKwkJCSAqIGFkdmFuY2UgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcG9zaXRpb25zLgorCQkJICovCisJCQkqZHBfYWRkcisrID0gKmNiKys7CisJCQkrKypkZXN0X29mczsKKworCQkJLyogQ29udGludWUgd2l0aCB0aGUgbmV4dCB0b2tlbi4gKi8KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogV2UgaGF2ZSBhIHBocmFzZSB0b2tlbi4gTWFrZSBzdXJlIGl0IGlzIG5vdCB0aGUgZmlyc3QgdGFnIGluCisJCSAqIHRoZSBzYiBhcyB0aGlzIGlzIGlsbGVnYWwgYW5kIHdvdWxkIGNvbmZ1c2UgdGhlIGNvZGUgYmVsb3cuCisJCSAqLworCQlpZiAoZHBfYWRkciA9PSBkcF9zYl9zdGFydCkKKwkJCWdvdG8gcmV0dXJuX292ZXJmbG93OworCisJCS8qCisJCSAqIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGdvIGJhY2sgKHApIGFuZCB0aGUgbnVtYmVyCisJCSAqIG9mIGJ5dGVzIHRvIGNvcHkgKGwpLiBXZSB1c2UgYW4gb3B0aW1pemVkIGFsZ29yaXRobSBpbiB3aGljaAorCQkgKiB3ZSBmaXJzdCBjYWxjdWxhdGUgbG9nMihjdXJyZW50IGRlc3RpbmF0aW9uIHBvc2l0aW9uIGluIHNiKSwKKwkJICogd2hpY2ggYWxsb3dzIGRldGVybWluYXRpb24gb2YgbCBhbmQgcCBpbiBPKDEpIHJhdGhlciB0aGFuCisJCSAqIE8obikuIFdlIGp1c3QgbmVlZCBhbiBhcmNoLW9wdGltaXplZCBsb2cyKCkgZnVuY3Rpb24gbm93LgorCQkgKi8KKwkJbGcgPSAwOworCQlmb3IgKGkgPSAqZGVzdF9vZnMgLSBkb19zYl9zdGFydCAtIDE7IGkgPj0gMHgxMDsgaSA+Pj0gMSkKKwkJCWxnKys7CisKKwkJLyogR2V0IHRoZSBwaHJhc2UgdG9rZW4gaW50byBpLiAqLworCQlwdCA9IGxlMTZfdG9fY3B1cCgobGUxNiopY2IpOworCisJCS8qCisJCSAqIENhbGN1bGF0ZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgYnl0ZSBzZXF1ZW5jZSBpbgorCQkgKiB0aGUgZGVzdGluYXRpb24gdXNpbmcgdGhlIGZhY3QgdGhhdCBwID0gKHB0ID4+ICgxMiAtIGxnKSkgKyAxCisJCSAqIGFuZCBtYWtlIHN1cmUgd2UgZG9uJ3QgZ28gdG9vIGZhciBiYWNrLgorCQkgKi8KKwkJZHBfYmFja19hZGRyID0gZHBfYWRkciAtIChwdCA+PiAoMTIgLSBsZykpIC0gMTsKKwkJaWYgKGRwX2JhY2tfYWRkciA8IGRwX3NiX3N0YXJ0KQorCQkJZ290byByZXR1cm5fb3ZlcmZsb3c7CisKKwkJLyogTm93IGNhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBieXRlIHNlcXVlbmNlLiAqLworCQlsZW5ndGggPSAocHQgJiAoMHhmZmYgPj4gbGcpKSArIDM7CisKKwkJLyogQWR2YW5jZSBkZXN0aW5hdGlvbiBwb3NpdGlvbiBhbmQgdmVyaWZ5IGl0IGlzIGluIHJhbmdlLiAqLworCQkqZGVzdF9vZnMgKz0gbGVuZ3RoOworCQlpZiAoKmRlc3Rfb2ZzID4gZG9fc2JfZW5kKQorCQkJZ290byByZXR1cm5fb3ZlcmZsb3c7CisKKwkJLyogVGhlIG51bWJlciBvZiBub24tb3ZlcmxhcHBpbmcgYnl0ZXMuICovCisJCW1heF9ub25fb3ZlcmxhcCA9IGRwX2FkZHIgLSBkcF9iYWNrX2FkZHI7CisKKwkJaWYgKGxlbmd0aCA8PSBtYXhfbm9uX292ZXJsYXApIHsKKwkJCS8qIFRoZSBieXRlIHNlcXVlbmNlIGRvZXNuJ3Qgb3ZlcmxhcCwganVzdCBjb3B5IGl0LiAqLworCQkJbWVtY3B5KGRwX2FkZHIsIGRwX2JhY2tfYWRkciwgbGVuZ3RoKTsKKworCQkJLyogQWR2YW5jZSBkZXN0aW5hdGlvbiBwb2ludGVyLiAqLworCQkJZHBfYWRkciArPSBsZW5ndGg7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogVGhlIGJ5dGUgc2VxdWVuY2UgZG9lcyBvdmVybGFwLCBjb3B5IG5vbi1vdmVybGFwcGluZworCQkJICogcGFydCBhbmQgdGhlbiBkbyBhIHNsb3cgYnl0ZSBieSBieXRlIGNvcHkgZm9yIHRoZQorCQkJICogb3ZlcmxhcHBpbmcgcGFydC4gQWxzbywgYWR2YW5jZSB0aGUgZGVzdGluYXRpb24KKwkJCSAqIHBvaW50ZXIuCisJCQkgKi8KKwkJCW1lbWNweShkcF9hZGRyLCBkcF9iYWNrX2FkZHIsIG1heF9ub25fb3ZlcmxhcCk7CisJCQlkcF9hZGRyICs9IG1heF9ub25fb3ZlcmxhcDsKKwkJCWRwX2JhY2tfYWRkciArPSBtYXhfbm9uX292ZXJsYXA7CisJCQlsZW5ndGggLT0gbWF4X25vbl9vdmVybGFwOworCQkJd2hpbGUgKGxlbmd0aC0tKQorCQkJCSpkcF9hZGRyKysgPSAqZHBfYmFja19hZGRyKys7CisJCX0KKworCQkvKiBBZHZhbmNlIHNvdXJjZSBwb3NpdGlvbiBhbmQgY29udGludWUgd2l0aCB0aGUgbmV4dCB0b2tlbi4gKi8KKwkJY2IgKz0gMjsKKwl9CisKKwkvKiBObyB0b2tlbnMgbGVmdCBpbiB0aGUgY3VycmVudCB0YWcuIENvbnRpbnVlIHdpdGggdGhlIG5leHQgdGFnLiAqLworCWdvdG8gZG9fbmV4dF90YWc7CisKK3JldHVybl9vdmVyZmxvdzoKKwludGZzX2Vycm9yKE5VTEwsICJGYWlsZWQuIFJldHVybmluZyAtRU9WRVJGTE9XLiIpOworCWdvdG8gcmV0dXJuX2Vycm9yOworfQorCisvKioKKyAqIG50ZnNfcmVhZF9jb21wcmVzc2VkX2Jsb2NrIC0gcmVhZCBhIGNvbXByZXNzZWQgYmxvY2sgaW50byB0aGUgcGFnZSBjYWNoZQorICogQHBhZ2U6CWxvY2tlZCBwYWdlIGluIHRoZSBjb21wcmVzc2lvbiBibG9jayhzKSB3ZSBuZWVkIHRvIHJlYWQKKyAqCisgKiBXaGVuIHdlIGFyZSBjYWxsZWQgdGhlIHBhZ2UgaGFzIGFscmVhZHkgYmVlbiB2ZXJpZmllZCB0byBiZSBsb2NrZWQgYW5kIHRoZQorICogYXR0cmlidXRlIGlzIGtub3duIHRvIGJlIG5vbi1yZXNpZGVudCwgbm90IGVuY3J5cHRlZCwgYnV0IGNvbXByZXNzZWQuCisgKgorICogMS4gRGV0ZXJtaW5lIHdoaWNoIGNvbXByZXNzaW9uIGJsb2NrKHMpIEBwYWdlIGlzIGluLgorICogMi4gR2V0IGhvbGQgb2YgYWxsIHBhZ2VzIGNvcnJlc3BvbmRpbmcgdG8gdGhpcy90aGVzZSBjb21wcmVzc2lvbiBibG9jayhzKS4KKyAqIDMuIFJlYWQgdGhlIChmaXJzdCkgY29tcHJlc3Npb24gYmxvY2suCisgKiA0LiBEZWNvbXByZXNzIGl0IGludG8gdGhlIGNvcnJlc3BvbmRpbmcgcGFnZXMuCisgKiA1LiBUaHJvdyB0aGUgY29tcHJlc3NlZCBkYXRhIGF3YXkgYW5kIHByb2NlZWQgdG8gMy4gZm9yIHRoZSBuZXh0IGNvbXByZXNzaW9uCisgKiAgICBibG9jayBvciByZXR1cm4gc3VjY2VzcyBpZiBubyBtb3JlIGNvbXByZXNzaW9uIGJsb2NrcyBsZWZ0LgorICoKKyAqIFdhcm5pbmc6IFdlIGhhdmUgdG8gYmUgY2FyZWZ1bCB3aGF0IHdlIGRvIGFib3V0IGV4aXN0aW5nIHBhZ2VzLiBUaGV5IG1pZ2h0CisgKiBoYXZlIGJlZW4gd3JpdHRlbiB0byBzbyB0aGF0IHdlIHdvdWxkIGxvc2UgZGF0YSBpZiB3ZSB3ZXJlIHRvIGp1c3Qgb3ZlcndyaXRlCisgKiB0aGVtIHdpdGggdGhlIG91dC1vZi1kYXRlIHVuY29tcHJlc3NlZCBkYXRhLgorICoKKyAqIEZJWE1FOiBGb3IgUEFHRV9DQUNIRV9TSVpFID4gY2Jfc2l6ZSB3ZSBhcmUgbm90IGRvaW5nIHRoZSBSaWdodCBUaGluZyhUTSkgYXQKKyAqIHRoZSBlbmQgb2YgdGhlIGZpbGUgSSB0aGluay4gV2UgbmVlZCB0byBkZXRlY3QgdGhpcyBjYXNlIGFuZCB6ZXJvIHRoZSBvdXQKKyAqIG9mIGJvdW5kcyByZW1haW5kZXIgb2YgdGhlIHBhZ2UgaW4gcXVlc3Rpb24gYW5kIG1hcmsgaXQgYXMgaGFuZGxlZC4gQXQgdGhlCisgKiBtb21lbnQgd2Ugd291bGQganVzdCByZXR1cm4gLUVJTyBvbiBzdWNoIGEgcGFnZS4gVGhpcyBidWcgd2lsbCBvbmx5IGJlY29tZQorICogYXBwYXJlbnQgaWYgcGFnZXMgYXJlIGFib3ZlIDhraUIgYW5kIHRoZSBOVEZTIHZvbHVtZSBvbmx5IHVzZXMgNTEyIGJ5dGUKKyAqIGNsdXN0ZXJzIHNvIGlzIHByb2JhYmx5IG5vdCBnb2luZyB0byBiZSBzZWVuIGJ5IGFueW9uZS4gU3RpbGwgdGhpcyBzaG91bGQKKyAqIGJlIGZpeGVkLiAoQUlBKQorICoKKyAqIEZJWE1FOiBBZ2FpbiBmb3IgUEFHRV9DQUNIRV9TSVpFID4gY2Jfc2l6ZSB3ZSBhcmUgc2NyZXdpbmcgdXAgYm90aCBpbgorICogaGFuZGxpbmcgc3BhcnNlIGFuZCBjb21wcmVzc2VkIGNicy4gKEFJQSkKKyAqCisgKiBGSVhNRTogQXQgdGhlIG1vbWVudCB3ZSBkb24ndCBkbyBhbnkgemVyb2luZyBvdXQgaW4gdGhlIGNhc2UgdGhhdAorICogaW5pdGlhbGl6ZWRfc2l6ZSBpcyBsZXNzIHRoYW4gZGF0YV9zaXplLiBUaGlzIHNob3VsZCBiZSBzYWZlIGJlY2F1c2Ugb2YgdGhlCisgKiBuYXR1cmUgb2YgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobSB1c2VkLiBKdXN0IGluIGNhc2Ugd2UgY2hlY2sgYW5kIG91dHB1dAorICogYW4gZXJyb3IgbWVzc2FnZSBpbiByZWFkIGlub2RlIGlmIHRoZSB0d28gc2l6ZXMgYXJlIG5vdCBlcXVhbCBmb3IgYQorICogY29tcHJlc3NlZCBmaWxlLiAoQUlBKQorICovCitpbnQgbnRmc19yZWFkX2NvbXByZXNzZWRfYmxvY2soc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBwYWdlLT5tYXBwaW5nOworCW50ZnNfaW5vZGUgKm5pID0gTlRGU19JKG1hcHBpbmctPmhvc3QpOworCW50ZnNfdm9sdW1lICp2b2wgPSBuaS0+dm9sOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSB2b2wtPnNiOworCXJ1bmxpc3RfZWxlbWVudCAqcmw7CisJdW5zaWduZWQgbG9uZyBibG9ja19zaXplID0gc2ItPnNfYmxvY2tzaXplOworCXVuc2lnbmVkIGNoYXIgYmxvY2tfc2l6ZV9iaXRzID0gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJdTggKmNiLCAqY2JfcG9zLCAqY2JfZW5kOworCXN0cnVjdCBidWZmZXJfaGVhZCAqKmJoczsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCwgaW5kZXggPSBwYWdlLT5pbmRleDsKKwl1MzIgY2Jfc2l6ZSA9IG5pLT5pdHlwZS5jb21wcmVzc2VkLmJsb2NrX3NpemU7CisJdTY0IGNiX3NpemVfbWFzayA9IGNiX3NpemUgLSAxVUw7CisJVkNOIHZjbjsKKwlMQ04gbGNuOworCS8qIFRoZSBmaXJzdCB3YW50ZWQgdmNuIChtaW5pbXVtIGFsaWdubWVudCBpcyBQQUdFX0NBQ0hFX1NJWkUpLiAqLworCVZDTiBzdGFydF92Y24gPSAoKChzNjQpaW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgJiB+Y2Jfc2l6ZV9tYXNrKSA+PgorCQkJdm9sLT5jbHVzdGVyX3NpemVfYml0czsKKwkvKgorCSAqIFRoZSBmaXJzdCB2Y24gYWZ0ZXIgdGhlIGxhc3Qgd2FudGVkIHZjbiAobWludW11bSBhbGlnbm1lbnQgaXMgYWdhaW4KKwkgKiBQQUdFX0NBQ0hFX1NJWkUuCisJICovCisJVkNOIGVuZF92Y24gPSAoKCgoczY0KShpbmRleCArIDFVTCkgPDwgUEFHRV9DQUNIRV9TSElGVCkgKyBjYl9zaXplIC0gMSkKKwkJCSYgfmNiX3NpemVfbWFzaykgPj4gdm9sLT5jbHVzdGVyX3NpemVfYml0czsKKwkvKiBOdW1iZXIgb2YgY29tcHJlc3Npb24gYmxvY2tzIChjYnMpIGluIHRoZSB3YW50ZWQgdmNuIHJhbmdlLiAqLworCXVuc2lnbmVkIGludCBucl9jYnMgPSAoZW5kX3ZjbiAtIHN0YXJ0X3ZjbikgPDwgdm9sLT5jbHVzdGVyX3NpemVfYml0cworCQkJPj4gbmktPml0eXBlLmNvbXByZXNzZWQuYmxvY2tfc2l6ZV9iaXRzOworCS8qCisJICogTnVtYmVyIG9mIHBhZ2VzIHJlcXVpcmVkIHRvIHN0b3JlIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBmcm9tIGFsbAorCSAqIGNvbXByZXNzaW9uIGJsb2NrcyAoY2JzKSBvdmVybGFwcGluZyBAcGFnZS4gRHVlIHRvIGFsaWdubWVudAorCSAqIGd1YXJhbnRlZXMgb2Ygc3RhcnRfdmNuIGFuZCBlbmRfdmNuLCBubyBuZWVkIHRvIHJvdW5kIHVwIGhlcmUuCisJICovCisJdW5zaWduZWQgaW50IG5yX3BhZ2VzID0gKGVuZF92Y24gLSBzdGFydF92Y24pIDw8CisJCQl2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJdW5zaWduZWQgaW50IHhwYWdlLCBtYXhfcGFnZSwgY3VyX3BhZ2UsIGN1cl9vZnMsIGk7CisJdW5zaWduZWQgaW50IGNiX2NsdXN0ZXJzLCBjYl9tYXhfb2ZzOworCWludCBibG9jaywgbWF4X2Jsb2NrLCBjYl9tYXhfcGFnZSwgYmhzX3NpemUsIG5yX2JocywgZXJyID0gMDsKKwlzdHJ1Y3QgcGFnZSAqKnBhZ2VzOworCXVuc2lnbmVkIGNoYXIgeHBhZ2VfZG9uZSA9IDA7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZywgcGFnZS0+aW5kZXggPSAweCVseCwgY2Jfc2l6ZSA9IDB4JXgsIG5yX3BhZ2VzID0gIgorCQkJIiVpLiIsIGluZGV4LCBjYl9zaXplLCBucl9wYWdlcyk7CisJLyoKKwkgKiBCYWQgdGhpbmdzIGhhcHBlbiBpZiB3ZSBnZXQgaGVyZSBmb3IgYW55dGhpbmcgdGhhdCBpcyBub3QgYW4KKwkgKiB1bm5hbWVkICREQVRBIGF0dHJpYnV0ZS4KKwkgKi8KKwlCVUdfT04obmktPnR5cGUgIT0gQVRfREFUQSk7CisJQlVHX09OKG5pLT5uYW1lX2xlbik7CisKKwlwYWdlcyA9IGttYWxsb2MobnJfcGFnZXMgKiBzaXplb2Yoc3RydWN0IHBhZ2UgKiksIEdGUF9OT0ZTKTsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSB0byBzdG9yZSB0aGUgYnVmZmVyIGhlYWRzIHdlIG5lZWQuICovCisJYmhzX3NpemUgPSBjYl9zaXplIC8gYmxvY2tfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKik7CisJYmhzID0ga21hbGxvYyhiaHNfc2l6ZSwgR0ZQX05PRlMpOworCisJaWYgKHVubGlrZWx5KCFwYWdlcyB8fCAhYmhzKSkgeworCQlrZnJlZShiaHMpOworCQlrZnJlZShwYWdlcyk7CisJCVNldFBhZ2VFcnJvcihwYWdlKTsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBpbnRlcm5hbCBidWZmZXJzLiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKgorCSAqIFdlIGhhdmUgYWxyZWFkeSBiZWVuIGdpdmVuIG9uZSBwYWdlLCB0aGlzIGlzIHRoZSBvbmUgd2UgbXVzdCBkby4KKwkgKiBPbmNlIGFnYWluLCB0aGUgYWxpZ25tZW50IGd1YXJhbnRlZXMga2VlcCBpdCBzaW1wbGUuCisJICovCisJb2Zmc2V0ID0gc3RhcnRfdmNuIDw8IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwl4cGFnZSA9IGluZGV4IC0gb2Zmc2V0OworCXBhZ2VzW3hwYWdlXSA9IHBhZ2U7CisJLyoKKwkgKiBUaGUgcmVtYWluaW5nIHBhZ2VzIG5lZWQgdG8gYmUgYWxsb2NhdGVkIGFuZCBpbnNlcnRlZCBpbnRvIHRoZSBwYWdlCisJICogY2FjaGUsIGFsaWdubWVudCBndWFyYW50ZWVzIGtlZXAgYWxsIHRoZSBiZWxvdyBtdWNoIHNpbXBsZXIuICgtOAorCSAqLworCW1heF9wYWdlID0gKChWRlNfSShuaSktPmlfc2l6ZSArIFBBR0VfQ0FDSEVfU0laRSAtIDEpID4+CisJCQlQQUdFX0NBQ0hFX1NISUZUKSAtIG9mZnNldDsKKwlpZiAobnJfcGFnZXMgPCBtYXhfcGFnZSkKKwkJbWF4X3BhZ2UgPSBucl9wYWdlczsKKwlmb3IgKGkgPSAwOyBpIDwgbWF4X3BhZ2U7IGkrKywgb2Zmc2V0KyspIHsKKwkJaWYgKGkgIT0geHBhZ2UpCisJCQlwYWdlc1tpXSA9IGdyYWJfY2FjaGVfcGFnZV9ub3dhaXQobWFwcGluZywgb2Zmc2V0KTsKKwkJcGFnZSA9IHBhZ2VzW2ldOworCQlpZiAocGFnZSkgeworCQkJLyoKKwkJCSAqIFdlIG9ubHkgKHJlKXJlYWQgdGhlIHBhZ2UgaWYgaXQgaXNuJ3QgYWxyZWFkeSByZWFkCisJCQkgKiBpbiBhbmQvb3IgZGlydHkgb3Igd2Ugd291bGQgYmUgbG9zaW5nIGRhdGEgb3IgYXQKKwkJCSAqIGxlYXN0IHdhc3Rpbmcgb3VyIHRpbWUuCisJCQkgKi8KKwkJCWlmICghUGFnZURpcnR5KHBhZ2UpICYmICghUGFnZVVwdG9kYXRlKHBhZ2UpIHx8CisJCQkJCVBhZ2VFcnJvcihwYWdlKSkpIHsKKwkJCQlDbGVhclBhZ2VFcnJvcihwYWdlKTsKKwkJCQlrbWFwKHBhZ2UpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCQlwYWdlc1tpXSA9IE5VTEw7CisJCX0KKwl9CisKKwkvKgorCSAqIFdlIGhhdmUgdGhlIHJ1bmxpc3QsIGFuZCBhbGwgdGhlIGRlc3RpbmF0aW9uIHBhZ2VzIHdlIG5lZWQgdG8gZmlsbC4KKwkgKiBOb3cgcmVhZCB0aGUgZmlyc3QgY29tcHJlc3Npb24gYmxvY2suCisJICovCisJY3VyX3BhZ2UgPSAwOworCWN1cl9vZnMgPSAwOworCWNiX2NsdXN0ZXJzID0gbmktPml0eXBlLmNvbXByZXNzZWQuYmxvY2tfY2x1c3RlcnM7Citkb19uZXh0X2NiOgorCW5yX2Nicy0tOworCW5yX2JocyA9IDA7CisKKwkvKiBSZWFkIGFsbCBjYiBidWZmZXIgaGVhZHMgb25lIGNsdXN0ZXIgYXQgYSB0aW1lLiAqLworCXJsID0gTlVMTDsKKwlmb3IgKHZjbiA9IHN0YXJ0X3Zjbiwgc3RhcnRfdmNuICs9IGNiX2NsdXN0ZXJzOyB2Y24gPCBzdGFydF92Y247CisJCQl2Y24rKykgeworCQlCT09MIGlzX3JldHJ5ID0gRkFMU0U7CisKKwkJaWYgKCFybCkgeworbG9ja19yZXRyeV9yZW1hcDoKKwkJCWRvd25fcmVhZCgmbmktPnJ1bmxpc3QubG9jayk7CisJCQlybCA9IG5pLT5ydW5saXN0LnJsOworCQl9CisJCWlmIChsaWtlbHkocmwgIT0gTlVMTCkpIHsKKwkJCS8qIFNlZWsgdG8gZWxlbWVudCBjb250YWluaW5nIHRhcmdldCB2Y24uICovCisJCQl3aGlsZSAocmwtPmxlbmd0aCAmJiBybFsxXS52Y24gPD0gdmNuKQorCQkJCXJsKys7CisJCQlsY24gPSBudGZzX3JsX3Zjbl90b19sY24ocmwsIHZjbik7CisJCX0gZWxzZQorCQkJbGNuID0gTENOX1JMX05PVF9NQVBQRUQ7CisJCW50ZnNfZGVidWcoIlJlYWRpbmcgdmNuID0gMHglbGx4LCBsY24gPSAweCVsbHguIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXZjbiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKWxjbik7CisJCWlmIChsY24gPCAwKSB7CisJCQkvKgorCQkJICogV2hlbiB3ZSByZWFjaCB0aGUgZmlyc3Qgc3BhcnNlIGNsdXN0ZXIgd2UgaGF2ZQorCQkJICogZmluaXNoZWQgd2l0aCB0aGUgY2IuCisJCQkgKi8KKwkJCWlmIChsY24gPT0gTENOX0hPTEUpCisJCQkJYnJlYWs7CisJCQlpZiAoaXNfcmV0cnkgfHwgbGNuICE9IExDTl9STF9OT1RfTUFQUEVEKQorCQkJCWdvdG8gcmxfZXJyOworCQkJaXNfcmV0cnkgPSBUUlVFOworCQkJLyoKKwkJCSAqIEF0dGVtcHQgdG8gbWFwIHJ1bmxpc3QsIGRyb3BwaW5nIGxvY2sgZm9yIHRoZQorCQkJICogZHVyYXRpb24uCisJCQkgKi8KKwkJCXVwX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCQkJaWYgKCFudGZzX21hcF9ydW5saXN0KG5pLCB2Y24pKQorCQkJCWdvdG8gbG9ja19yZXRyeV9yZW1hcDsKKwkJCWdvdG8gbWFwX3JsX2VycjsKKwkJfQorCQlibG9jayA9IGxjbiA8PCB2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzID4+IGJsb2NrX3NpemVfYml0czsKKwkJLyogUmVhZCB0aGUgbGNuIGZyb20gZGV2aWNlIGluIGNodW5rcyBvZiBibG9ja19zaXplIGJ5dGVzLiAqLworCQltYXhfYmxvY2sgPSBibG9jayArICh2b2wtPmNsdXN0ZXJfc2l6ZSA+PiBibG9ja19zaXplX2JpdHMpOworCQlkbyB7CisJCQludGZzX2RlYnVnKCJibG9jayA9IDB4JXguIiwgYmxvY2spOworCQkJaWYgKHVubGlrZWx5KCEoYmhzW25yX2Joc10gPSBzYl9nZXRibGsoc2IsIGJsb2NrKSkpKQorCQkJCWdvdG8gZ2V0YmxrX2VycjsKKwkJCW5yX2JocysrOworCQl9IHdoaWxlICgrK2Jsb2NrIDwgbWF4X2Jsb2NrKTsKKwl9CisKKwkvKiBSZWxlYXNlIHRoZSBsb2NrIGlmIHdlIHRvb2sgaXQuICovCisJaWYgKHJsKQorCQl1cF9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKKworCS8qIFNldHVwIGFuZCBpbml0aWF0ZSBpbyBvbiBhbGwgYnVmZmVyIGhlYWRzLiAqLworCWZvciAoaSA9IDA7IGkgPCBucl9iaHM7IGkrKykgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRiaCA9IGJoc1tpXTsKKworCQlpZiAodW5saWtlbHkodGVzdF9zZXRfYnVmZmVyX2xvY2tlZCh0YmgpKSkKKwkJCWNvbnRpbnVlOworCQlpZiAodW5saWtlbHkoYnVmZmVyX3VwdG9kYXRlKHRiaCkpKSB7CisJCQl1bmxvY2tfYnVmZmVyKHRiaCk7CisJCQljb250aW51ZTsKKwkJfQorCQlnZXRfYmgodGJoKTsKKwkJdGJoLT5iX2VuZF9pbyA9IGVuZF9idWZmZXJfcmVhZF9zeW5jOworCQlzdWJtaXRfYmgoUkVBRCwgdGJoKTsKKwl9CisKKwkvKiBXYWl0IGZvciBpbyBjb21wbGV0aW9uIG9uIGFsbCBidWZmZXIgaGVhZHMuICovCisJZm9yIChpID0gMDsgaSA8IG5yX2JoczsgaSsrKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqdGJoID0gYmhzW2ldOworCisJCWlmIChidWZmZXJfdXB0b2RhdGUodGJoKSkKKwkJCWNvbnRpbnVlOworCQl3YWl0X29uX2J1ZmZlcih0YmgpOworCQkvKgorCQkgKiBXZSBuZWVkIGFuIG9wdGltaXphdGlvbiBiYXJyaWVyIGhlcmUsIG90aGVyd2lzZSB3ZSBzdGFydAorCQkgKiBoaXR0aW5nIHRoZSBiZWxvdyBmaXh1cCBjb2RlIHdoZW4gYWNjZXNzaW5nIGEgbG9vcGJhY2sKKwkJICogbW91bnRlZCBudGZzIHBhcnRpdGlvbi4gVGhpcyBpbmRpY2F0ZXMgZWl0aGVyIHRoZXJlIGlzIGEKKwkJICogcmFjZSBjb25kaXRpb24gaW4gdGhlIGxvb3AgZHJpdmVyIG9yLCBtb3JlIGxpa2VseSwgZ2NjCisJCSAqIG92ZXJvcHRpbWlzZXMgdGhlIGNvZGUgd2l0aG91dCB0aGUgYmFycmllciBhbmQgaXQgZG9lc24ndAorCQkgKiBkbyB0aGUgUmlnaHQgVGhpbmcoVE0pLgorCQkgKi8KKwkJYmFycmllcigpOworCQlpZiAodW5saWtlbHkoIWJ1ZmZlcl91cHRvZGF0ZSh0YmgpKSkgeworCQkJbnRmc193YXJuaW5nKHZvbC0+c2IsICJCdWZmZXIgaXMgdW5sb2NrZWQgYnV0IG5vdCAiCisJCQkJCSJ1cHRvZGF0ZSEgVW5wbHVnZ2luZyB0aGUgZGlzayBxdWV1ZSAiCisJCQkJCSJhbmQgcmVzY2hlZHVsaW5nLiIpOworCQkJZ2V0X2JoKHRiaCk7CisJCQlibGtfcnVuX2FkZHJlc3Nfc3BhY2UobWFwcGluZyk7CisJCQlzY2hlZHVsZSgpOworCQkJcHV0X2JoKHRiaCk7CisJCQlpZiAodW5saWtlbHkoIWJ1ZmZlcl91cHRvZGF0ZSh0YmgpKSkKKwkJCQlnb3RvIHJlYWRfZXJyOworCQkJbnRmc193YXJuaW5nKHZvbC0+c2IsICJCdWZmZXIgaXMgbm93IHVwdG9kYXRlLiBHb29kLiIpOworCQl9CisJfQorCisJLyoKKwkgKiBHZXQgdGhlIGNvbXByZXNzaW9uIGJ1ZmZlci4gV2UgbXVzdCBub3Qgc2xlZXAgYW55IG1vcmUKKwkgKiB1bnRpbCB3ZSBhcmUgZmluaXNoZWQgd2l0aCBpdC4KKwkgKi8KKwlzcGluX2xvY2soJm50ZnNfY2JfbG9jayk7CisJY2IgPSBudGZzX2NvbXByZXNzaW9uX2J1ZmZlcjsKKworCUJVR19PTighY2IpOworCisJY2JfcG9zID0gY2I7CisJY2JfZW5kID0gY2IgKyBjYl9zaXplOworCisJLyogQ29weSB0aGUgYnVmZmVyIGhlYWRzIGludG8gdGhlIGNvbnRpZ3VvdXMgYnVmZmVyLiAqLworCWZvciAoaSA9IDA7IGkgPCBucl9iaHM7IGkrKykgeworCQltZW1jcHkoY2JfcG9zLCBiaHNbaV0tPmJfZGF0YSwgYmxvY2tfc2l6ZSk7CisJCWNiX3BvcyArPSBibG9ja19zaXplOworCX0KKworCS8qIEp1c3QgYSBwcmVjYXV0aW9uLiAqLworCWlmIChjYl9wb3MgKyAyIDw9IGNiICsgY2Jfc2l6ZSkKKwkJKih1MTYqKWNiX3BvcyA9IDA7CisKKwkvKiBSZXNldCBjYl9wb3MgYmFjayB0byB0aGUgYmVnaW5uaW5nLiAqLworCWNiX3BvcyA9IGNiOworCisJLyogV2Ugbm93IGhhdmUgYm90aCBzb3VyY2UgKGlmIHByZXNlbnQpIGFuZCBkZXN0aW5hdGlvbi4gKi8KKwludGZzX2RlYnVnKCJTdWNjZXNzZnVsbHkgcmVhZCB0aGUgY29tcHJlc3Npb24gYmxvY2suIik7CisKKwkvKiBUaGUgbGFzdCBwYWdlIGFuZCBtYXhpbXVtIG9mZnNldCB3aXRoaW4gaXQgZm9yIHRoZSBjdXJyZW50IGNiLiAqLworCWNiX21heF9wYWdlID0gKGN1cl9wYWdlIDw8IFBBR0VfQ0FDSEVfU0hJRlQpICsgY3VyX29mcyArIGNiX3NpemU7CisJY2JfbWF4X29mcyA9IGNiX21heF9wYWdlICYgflBBR0VfQ0FDSEVfTUFTSzsKKwljYl9tYXhfcGFnZSA+Pj0gUEFHRV9DQUNIRV9TSElGVDsKKworCS8qIENhdGNoIGVuZCBvZiBmaWxlIGluc2lkZSBhIGNvbXByZXNzaW9uIGJsb2NrLiAqLworCWlmIChjYl9tYXhfcGFnZSA+IG1heF9wYWdlKQorCQljYl9tYXhfcGFnZSA9IG1heF9wYWdlOworCisJaWYgKHZjbiA9PSBzdGFydF92Y24gLSBjYl9jbHVzdGVycykgeworCQkvKiBTcGFyc2UgY2IsIHplcm8gb3V0IHBhZ2UgcmFuZ2Ugb3ZlcmxhcHBpbmcgdGhlIGNiLiAqLworCQludGZzX2RlYnVnKCJGb3VuZCBzcGFyc2UgY29tcHJlc3Npb24gYmxvY2suIik7CisJCS8qIFdlIGNhbiBzbGVlcCBmcm9tIG5vdyBvbiwgc28gd2UgZHJvcCBsb2NrLiAqLworCQlzcGluX3VubG9jaygmbnRmc19jYl9sb2NrKTsKKwkJaWYgKGNiX21heF9vZnMpCisJCQljYl9tYXhfcGFnZS0tOworCQlmb3IgKDsgY3VyX3BhZ2UgPCBjYl9tYXhfcGFnZTsgY3VyX3BhZ2UrKykgeworCQkJcGFnZSA9IHBhZ2VzW2N1cl9wYWdlXTsKKwkJCWlmIChwYWdlKSB7CisJCQkJLyoKKwkJCQkgKiBGSVhNRTogVXNpbmcgY2xlYXJfcGFnZSgpIHdpbGwgYmVjb21lIHdyb25nCisJCQkJICogd2hlbiB3ZSBnZXQgUEFHRV9DQUNIRV9TSVpFICE9IFBBR0VfU0laRSBidXQKKwkJCQkgKiBmb3Igbm93IHRoZXJlIGlzIG5vIHByb2JsZW0uCisJCQkJICovCisJCQkJaWYgKGxpa2VseSghY3VyX29mcykpCisJCQkJCWNsZWFyX3BhZ2UocGFnZV9hZGRyZXNzKHBhZ2UpKTsKKwkJCQllbHNlCisJCQkJCW1lbXNldChwYWdlX2FkZHJlc3MocGFnZSkgKyBjdXJfb2ZzLCAwLAorCQkJCQkJCVBBR0VfQ0FDSEVfU0laRSAtCisJCQkJCQkJY3VyX29mcyk7CisJCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCQkJa3VubWFwKHBhZ2UpOworCQkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCQlpZiAoY3VyX3BhZ2UgPT0geHBhZ2UpCisJCQkJCXhwYWdlX2RvbmUgPSAxOworCQkJCWVsc2UKKwkJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJCXBhZ2VzW2N1cl9wYWdlXSA9IE5VTEw7CisJCQl9CisJCQljYl9wb3MgKz0gUEFHRV9DQUNIRV9TSVpFIC0gY3VyX29mczsKKwkJCWN1cl9vZnMgPSAwOworCQkJaWYgKGNiX3BvcyA+PSBjYl9lbmQpCisJCQkJYnJlYWs7CisJCX0KKwkJLyogSWYgd2UgaGF2ZSBhIHBhcnRpYWwgZmluYWwgcGFnZSwgZGVhbCB3aXRoIGl0IG5vdy4gKi8KKwkJaWYgKGNiX21heF9vZnMgJiYgY2JfcG9zIDwgY2JfZW5kKSB7CisJCQlwYWdlID0gcGFnZXNbY3VyX3BhZ2VdOworCQkJaWYgKHBhZ2UpCisJCQkJbWVtc2V0KHBhZ2VfYWRkcmVzcyhwYWdlKSArIGN1cl9vZnMsIDAsCisJCQkJCQljYl9tYXhfb2ZzIC0gY3VyX29mcyk7CisJCQkvKgorCQkJICogTm8gbmVlZCB0byB1cGRhdGUgY2JfcG9zIGF0IHRoaXMgc3RhZ2U6CisJCQkgKgljYl9wb3MgKz0gY2JfbWF4X29mcyAtIGN1cl9vZnM7CisJCQkgKi8KKwkJCWN1cl9vZnMgPSBjYl9tYXhfb2ZzOworCQl9CisJfSBlbHNlIGlmICh2Y24gPT0gc3RhcnRfdmNuKSB7CisJCS8qIFdlIGNhbid0IHNsZWVwIHNvIHdlIG5lZWQgdHdvIHN0YWdlcy4gKi8KKwkJdW5zaWduZWQgaW50IGN1cjJfcGFnZSA9IGN1cl9wYWdlOworCQl1bnNpZ25lZCBpbnQgY3VyX29mczIgPSBjdXJfb2ZzOworCQl1OCAqY2JfcG9zMiA9IGNiX3BvczsKKworCQludGZzX2RlYnVnKCJGb3VuZCB1bmNvbXByZXNzZWQgY29tcHJlc3Npb24gYmxvY2suIik7CisJCS8qIFVuY29tcHJlc3NlZCBjYiwgY29weSBpdCB0byB0aGUgZGVzdGluYXRpb24gcGFnZXMuICovCisJCS8qCisJCSAqIFRPRE86IEFzIGEgYmlnIG9wdGltaXphdGlvbiwgd2UgY291bGQgZGV0ZWN0IHRoaXMgY2FzZQorCQkgKiBiZWZvcmUgd2UgcmVhZCBhbGwgdGhlIHBhZ2VzIGFuZCB1c2UgYmxvY2tfcmVhZF9mdWxsX3BhZ2UoKQorCQkgKiBvbiBhbGwgZnVsbCBwYWdlcyBpbnN0ZWFkICh3ZSBzdGlsbCBoYXZlIHRvIHRyZWF0IHBhcnRpYWwKKwkJICogcGFnZXMgZXNwZWNpYWxseSBidXQgYXQgbGVhc3Qgd2UgYXJlIGdldHRpbmcgcmlkIG9mIHRoZQorCQkgKiBzeW5jaHJvbm91cyBpbyBmb3IgdGhlIG1ham9yaXR5IG9mIHBhZ2VzLgorCQkgKiBPciBpZiB3ZSBjaG9vc2Ugbm90IHRvIGRvIHRoZSByZWFkLWFoZWFkLy1iZWhpbmQgc3R1ZmYsIHdlCisJCSAqIGNvdWxkIGp1c3QgcmV0dXJuIGJsb2NrX3JlYWRfZnVsbF9wYWdlKHBhZ2VzW3hwYWdlXSkgYXMgbG9uZworCQkgKiBhcyBQQUdFX0NBQ0hFX1NJWkUgPD0gY2Jfc2l6ZS4KKwkJICovCisJCWlmIChjYl9tYXhfb2ZzKQorCQkJY2JfbWF4X3BhZ2UtLTsKKwkJLyogRmlyc3Qgc3RhZ2U6IGNvcHkgZGF0YSBpbnRvIGRlc3RpbmF0aW9uIHBhZ2VzLiAqLworCQlmb3IgKDsgY3VyX3BhZ2UgPCBjYl9tYXhfcGFnZTsgY3VyX3BhZ2UrKykgeworCQkJcGFnZSA9IHBhZ2VzW2N1cl9wYWdlXTsKKwkJCWlmIChwYWdlKQorCQkJCW1lbWNweShwYWdlX2FkZHJlc3MocGFnZSkgKyBjdXJfb2ZzLCBjYl9wb3MsCisJCQkJCQlQQUdFX0NBQ0hFX1NJWkUgLSBjdXJfb2ZzKTsKKwkJCWNiX3BvcyArPSBQQUdFX0NBQ0hFX1NJWkUgLSBjdXJfb2ZzOworCQkJY3VyX29mcyA9IDA7CisJCQlpZiAoY2JfcG9zID49IGNiX2VuZCkKKwkJCQlicmVhazsKKwkJfQorCQkvKiBJZiB3ZSBoYXZlIGEgcGFydGlhbCBmaW5hbCBwYWdlLCBkZWFsIHdpdGggaXQgbm93LiAqLworCQlpZiAoY2JfbWF4X29mcyAmJiBjYl9wb3MgPCBjYl9lbmQpIHsKKwkJCXBhZ2UgPSBwYWdlc1tjdXJfcGFnZV07CisJCQlpZiAocGFnZSkKKwkJCQltZW1jcHkocGFnZV9hZGRyZXNzKHBhZ2UpICsgY3VyX29mcywgY2JfcG9zLAorCQkJCQkJY2JfbWF4X29mcyAtIGN1cl9vZnMpOworCQkJY2JfcG9zICs9IGNiX21heF9vZnMgLSBjdXJfb2ZzOworCQkJY3VyX29mcyA9IGNiX21heF9vZnM7CisJCX0KKwkJLyogV2UgY2FuIHNsZWVwIGZyb20gbm93IG9uLCBzbyBkcm9wIGxvY2suICovCisJCXNwaW5fdW5sb2NrKCZudGZzX2NiX2xvY2spOworCQkvKiBTZWNvbmQgc3RhZ2U6IGZpbmFsaXplIHBhZ2VzLiAqLworCQlmb3IgKDsgY3VyMl9wYWdlIDwgY2JfbWF4X3BhZ2U7IGN1cjJfcGFnZSsrKSB7CisJCQlwYWdlID0gcGFnZXNbY3VyMl9wYWdlXTsKKwkJCWlmIChwYWdlKSB7CisJCQkJLyoKKwkJCQkgKiBJZiB3ZSBhcmUgb3V0c2lkZSB0aGUgaW5pdGlhbGl6ZWQgc2l6ZSwgemVybworCQkJCSAqIHRoZSBvdXQgb2YgYm91bmRzIHBhZ2UgcmFuZ2UuCisJCQkJICovCisJCQkJaGFuZGxlX2JvdW5kc19jb21wcmVzc2VkX3BhZ2UobmksIHBhZ2UpOworCQkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQkJCWt1bm1hcChwYWdlKTsKKwkJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQkJaWYgKGN1cjJfcGFnZSA9PSB4cGFnZSkKKwkJCQkJeHBhZ2VfZG9uZSA9IDE7CisJCQkJZWxzZQorCQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCQkJcGFnZXNbY3VyMl9wYWdlXSA9IE5VTEw7CisJCQl9CisJCQljYl9wb3MyICs9IFBBR0VfQ0FDSEVfU0laRSAtIGN1cl9vZnMyOworCQkJY3VyX29mczIgPSAwOworCQkJaWYgKGNiX3BvczIgPj0gY2JfZW5kKQorCQkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJLyogQ29tcHJlc3NlZCBjYiwgZGVjb21wcmVzcyBpdCBpbnRvIHRoZSBkZXN0aW5hdGlvbiBwYWdlKHMpLiAqLworCQl1bnNpZ25lZCBpbnQgcHJldl9jdXJfcGFnZSA9IGN1cl9wYWdlOworCisJCW50ZnNfZGVidWcoIkZvdW5kIGNvbXByZXNzZWQgY29tcHJlc3Npb24gYmxvY2suIik7CisJCWVyciA9IG50ZnNfZGVjb21wcmVzcyhwYWdlcywgJmN1cl9wYWdlLCAmY3VyX29mcywKKwkJCQljYl9tYXhfcGFnZSwgY2JfbWF4X29mcywgeHBhZ2UsICZ4cGFnZV9kb25lLAorCQkJCWNiX3BvcywJY2Jfc2l6ZSAtIChjYl9wb3MgLSBjYikpOworCQkvKgorCQkgKiBXZSBjYW4gc2xlZXAgZnJvbSBub3cgb24sIGxvY2sgYWxyZWFkeSBkcm9wcGVkIGJ5CisJCSAqIG50ZnNfZGVjb21wcmVzcygpLgorCQkgKi8KKwkJaWYgKGVycikgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAibnRmc19kZWNvbXByZXNzKCkgZmFpbGVkIGluIGlub2RlICIKKwkJCQkJIjB4JWx4IHdpdGggZXJyb3IgY29kZSAlaS4gU2tpcHBpbmcgIgorCQkJCQkidGhpcyBjb21wcmVzc2lvbiBibG9jay4iLAorCQkJCQluaS0+bWZ0X25vLCAtZXJyKTsKKwkJCS8qIFJlbGVhc2UgdGhlIHVuZmluaXNoZWQgcGFnZXMuICovCisJCQlmb3IgKDsgcHJldl9jdXJfcGFnZSA8IGN1cl9wYWdlOyBwcmV2X2N1cl9wYWdlKyspIHsKKwkJCQlwYWdlID0gcGFnZXNbcHJldl9jdXJfcGFnZV07CisJCQkJaWYgKHBhZ2UpIHsKKwkJCQkJaWYgKHByZXZfY3VyX3BhZ2UgPT0geHBhZ2UgJiYKKwkJCQkJCQkheHBhZ2VfZG9uZSkKKwkJCQkJCVNldFBhZ2VFcnJvcihwYWdlKTsKKwkJCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCQkJCWt1bm1hcChwYWdlKTsKKwkJCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQkJCWlmIChwcmV2X2N1cl9wYWdlICE9IHhwYWdlKQorCQkJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJCQlwYWdlc1twcmV2X2N1cl9wYWdlXSA9IE5VTEw7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyogUmVsZWFzZSB0aGUgYnVmZmVyIGhlYWRzLiAqLworCWZvciAoaSA9IDA7IGkgPCBucl9iaHM7IGkrKykKKwkJYnJlbHNlKGJoc1tpXSk7CisKKwkvKiBEbyB3ZSBoYXZlIG1vcmUgd29yayB0byBkbz8gKi8KKwlpZiAobnJfY2JzKQorCQlnb3RvIGRvX25leHRfY2I7CisKKwkvKiBXZSBubyBsb25nZXIgbmVlZCB0aGUgbGlzdCBvZiBidWZmZXIgaGVhZHMuICovCisJa2ZyZWUoYmhzKTsKKworCS8qIENsZWFuIHVwIGlmIHdlIGhhdmUgYW55IHBhZ2VzIGxlZnQuIFNob3VsZCBuZXZlciBoYXBwZW4uICovCisJZm9yIChjdXJfcGFnZSA9IDA7IGN1cl9wYWdlIDwgbWF4X3BhZ2U7IGN1cl9wYWdlKyspIHsKKwkJcGFnZSA9IHBhZ2VzW2N1cl9wYWdlXTsKKwkJaWYgKHBhZ2UpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIlN0aWxsIGhhdmUgcGFnZXMgbGVmdCEgIgorCQkJCQkiVGVybWluYXRpbmcgdGhlbSB3aXRoIGV4dHJlbWUgIgorCQkJCQkicHJlanVkaWNlLiAgSW5vZGUgMHglbHgsIHBhZ2UgaW5kZXggIgorCQkJCQkiMHglbHguIiwgbmktPm1mdF9ubywgcGFnZS0+aW5kZXgpOworCQkJaWYgKGN1cl9wYWdlID09IHhwYWdlICYmICF4cGFnZV9kb25lKQorCQkJCVNldFBhZ2VFcnJvcihwYWdlKTsKKwkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQkJa3VubWFwKHBhZ2UpOworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQlpZiAoY3VyX3BhZ2UgIT0geHBhZ2UpCisJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJcGFnZXNbY3VyX3BhZ2VdID0gTlVMTDsKKwkJfQorCX0KKworCS8qIFdlIG5vIGxvbmdlciBuZWVkIHRoZSBsaXN0IG9mIHBhZ2VzLiAqLworCWtmcmVlKHBhZ2VzKTsKKworCS8qIElmIHdlIGhhdmUgY29tcGxldGVkIHRoZSByZXF1ZXN0ZWQgcGFnZSwgd2UgcmV0dXJuIHN1Y2Nlc3MuICovCisJaWYgKGxpa2VseSh4cGFnZV9kb25lKSkKKwkJcmV0dXJuIDA7CisKKwludGZzX2RlYnVnKCJGYWlsZWQuIFJldHVybmluZyBlcnJvciBjb2RlICVzLiIsIGVyciA9PSAtRU9WRVJGTE9XID8KKwkJCSJFT1ZFUkZMT1ciIDogKCFlcnIgPyAiRUlPIiA6ICJ1bmtvd24gZXJyb3IiKSk7CisJcmV0dXJuIGVyciA8IDAgPyBlcnIgOiAtRUlPOworCityZWFkX2VycjoKKwludGZzX2Vycm9yKHZvbC0+c2IsICJJTyBlcnJvciB3aGlsZSByZWFkaW5nIGNvbXByZXNzZWQgZGF0YS4iKTsKKwkvKiBSZWxlYXNlIHRoZSBidWZmZXIgaGVhZHMuICovCisJZm9yIChpID0gMDsgaSA8IG5yX2JoczsgaSsrKQorCQlicmVsc2UoYmhzW2ldKTsKKwlnb3RvIGVycl9vdXQ7CisKK21hcF9ybF9lcnI6CisJbnRmc19lcnJvcih2b2wtPnNiLCAibnRmc19tYXBfcnVubGlzdCgpIGZhaWxlZC4gQ2Fubm90IHJlYWQgIgorCQkJImNvbXByZXNzaW9uIGJsb2NrLiIpOworCWdvdG8gZXJyX291dDsKKworcmxfZXJyOgorCXVwX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCW50ZnNfZXJyb3Iodm9sLT5zYiwgIm50ZnNfcmxfdmNuX3RvX2xjbigpIGZhaWxlZC4gQ2Fubm90IHJlYWQgIgorCQkJImNvbXByZXNzaW9uIGJsb2NrLiIpOworCWdvdG8gZXJyX291dDsKKworZ2V0YmxrX2VycjoKKwl1cF9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKKwludGZzX2Vycm9yKHZvbC0+c2IsICJnZXRibGsoKSBmYWlsZWQuIENhbm5vdCByZWFkIGNvbXByZXNzaW9uIGJsb2NrLiIpOworCitlcnJfb3V0OgorCWtmcmVlKGJocyk7CisJZm9yIChpID0gY3VyX3BhZ2U7IGkgPCBtYXhfcGFnZTsgaSsrKSB7CisJCXBhZ2UgPSBwYWdlc1tpXTsKKwkJaWYgKHBhZ2UpIHsKKwkJCWlmIChpID09IHhwYWdlICYmICF4cGFnZV9kb25lKQorCQkJCVNldFBhZ2VFcnJvcihwYWdlKTsKKwkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQkJa3VubWFwKHBhZ2UpOworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQlpZiAoaSAhPSB4cGFnZSkKKwkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCX0KKwl9CisJa2ZyZWUocGFnZXMpOworCXJldHVybiAtRUlPOworfQpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9kZWJ1Zy5jIGIvZnMvbnRmcy9kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmYjZiYjUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL2RlYnVnLmMKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBkZWJ1Zy5jIC0gTlRGUyBrZXJuZWwgZGVidWcgc3VwcG9ydC4gUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlICJkZWJ1Zy5oIgorCisvKgorICogQSBzdGF0aWMgYnVmZmVyIHRvIGhvbGQgdGhlIGVycm9yIHN0cmluZyBiZWluZyBkaXNwbGF5ZWQgYW5kIGEgc3BpbmxvY2sKKyAqIHRvIHByb3RlY3QgY29uY3VycmVudCBhY2Nlc3NlcyB0byBpdC4KKyAqLworc3RhdGljIGNoYXIgZXJyX2J1ZlsxMDI0XTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soZXJyX2J1Zl9sb2NrKTsKKworLyoqCisgKiBfX250ZnNfd2FybmluZyAtIG91dHB1dCBhIHdhcm5pbmcgdG8gdGhlIHN5c2xvZworICogQGZ1bmN0aW9uOgluYW1lIG9mIGZ1bmN0aW9uIG91dHB1dHRpbmcgdGhlIHdhcm5pbmcKKyAqIEBzYjoJCXN1cGVyIGJsb2NrIG9mIG1vdW50ZWQgbnRmcyBmaWxlc3lzdGVtCisgKiBAZm10Ogl3YXJuaW5nIHN0cmluZyBjb250YWluaW5nIGZvcm1hdCBzcGVjaWZpY2F0aW9ucworICogQC4uLjoJYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzIHNwZWNpZmllZCBpbiBAZm10CisgKgorICogT3V0cHV0cyBhIHdhcm5pbmcgdG8gdGhlIHN5c2xvZyBmb3IgdGhlIG1vdW50ZWQgbnRmcyBmaWxlc3lzdGVtIGRlc2NyaWJlZAorICogYnkgQHNiLgorICoKKyAqIEBmbXQgYW5kIHRoZSBjb3JyZXNwb25kaW5nIEAuLi4gaXMgcHJpbnRmIHN0eWxlIGZvcm1hdCBzdHJpbmcgY29udGFpbmluZworICogdGhlIHdhcm5pbmcgc3RyaW5nIGFuZCB0aGUgY29ycmVzcG9uZGluZyBmb3JtYXQgYXJndW1lbnRzLCByZXNwZWN0aXZlbHkuCisgKgorICogQGZ1bmN0aW9uIGlzIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiBmcm9tIHdoaWNoIF9fbnRmc193YXJuaW5nIGlzIGJlaW5nCisgKiBjYWxsZWQuCisgKgorICogTm90ZSwgeW91IHNob3VsZCBiZSB1c2luZyBkZWJ1Zy5oOjpudGZzX3dhcm5pbmcoQHNiLCBAZm10LCBALi4uKSBpbnN0ZWFkCisgKiBhcyB0aGlzIHByb3ZpZGVzIHRoZSBAZnVuY3Rpb24gcGFyYW1ldGVyIGF1dG9tYXRpY2FsbHkuCisgKi8KK3ZvaWQgX19udGZzX3dhcm5pbmcoY29uc3QgY2hhciAqZnVuY3Rpb24sIGNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCWNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwlpbnQgZmxlbiA9IDA7CisKKyNpZm5kZWYgREVCVUcKKwlpZiAoIXByaW50a19yYXRlbGltaXQoKSkKKwkJcmV0dXJuOworI2VuZGlmCisJaWYgKGZ1bmN0aW9uKQorCQlmbGVuID0gc3RybGVuKGZ1bmN0aW9uKTsKKwlzcGluX2xvY2soJmVycl9idWZfbG9jayk7CisJdmFfc3RhcnQoYXJncywgZm10KTsKKwl2c25wcmludGYoZXJyX2J1Ziwgc2l6ZW9mKGVycl9idWYpLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKwlpZiAoc2IpCisJCXByaW50ayhLRVJOX0VSUiAiTlRGUy1mcyB3YXJuaW5nIChkZXZpY2UgJXMpOiAlcygpOiAlc1xuIiwKKwkJCQlzYi0+c19pZCwgZmxlbiA/IGZ1bmN0aW9uIDogIiIsIGVycl9idWYpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fRVJSICJOVEZTLWZzIHdhcm5pbmc6ICVzKCk6ICVzXG4iLAorCQkJCWZsZW4gPyBmdW5jdGlvbiA6ICIiLCBlcnJfYnVmKTsKKwlzcGluX3VubG9jaygmZXJyX2J1Zl9sb2NrKTsKK30KKworLyoqCisgKiBfX250ZnNfZXJyb3IgLSBvdXRwdXQgYW4gZXJyb3IgdG8gdGhlIHN5c2xvZworICogQGZ1bmN0aW9uOgluYW1lIG9mIGZ1bmN0aW9uIG91dHB1dHRpbmcgdGhlIGVycm9yCisgKiBAc2I6CQlzdXBlciBibG9jayBvZiBtb3VudGVkIG50ZnMgZmlsZXN5c3RlbQorICogQGZtdDoJZXJyb3Igc3RyaW5nIGNvbnRhaW5pbmcgZm9ybWF0IHNwZWNpZmljYXRpb25zCisgKiBALi4uOglhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMgc3BlY2lmaWVkIGluIEBmbXQKKyAqCisgKiBPdXRwdXRzIGFuIGVycm9yIHRvIHRoZSBzeXNsb2cgZm9yIHRoZSBtb3VudGVkIG50ZnMgZmlsZXN5c3RlbSBkZXNjcmliZWQKKyAqIGJ5IEBzYi4KKyAqCisgKiBAZm10IGFuZCB0aGUgY29ycmVzcG9uZGluZyBALi4uIGlzIHByaW50ZiBzdHlsZSBmb3JtYXQgc3RyaW5nIGNvbnRhaW5pbmcKKyAqIHRoZSBlcnJvciBzdHJpbmcgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGZvcm1hdCBhcmd1bWVudHMsIHJlc3BlY3RpdmVseS4KKyAqCisgKiBAZnVuY3Rpb24gaXMgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGZyb20gd2hpY2ggX19udGZzX2Vycm9yIGlzIGJlaW5nCisgKiBjYWxsZWQuCisgKgorICogTm90ZSwgeW91IHNob3VsZCBiZSB1c2luZyBkZWJ1Zy5oOjpudGZzX2Vycm9yKEBzYiwgQGZtdCwgQC4uLikgaW5zdGVhZAorICogYXMgdGhpcyBwcm92aWRlcyB0aGUgQGZ1bmN0aW9uIHBhcmFtZXRlciBhdXRvbWF0aWNhbGx5LgorICovCit2b2lkIF9fbnRmc19lcnJvcihjb25zdCBjaGFyICpmdW5jdGlvbiwgY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCWludCBmbGVuID0gMDsKKworI2lmbmRlZiBERUJVRworCWlmICghcHJpbnRrX3JhdGVsaW1pdCgpKQorCQlyZXR1cm47CisjZW5kaWYKKwlpZiAoZnVuY3Rpb24pCisJCWZsZW4gPSBzdHJsZW4oZnVuY3Rpb24pOworCXNwaW5fbG9jaygmZXJyX2J1Zl9sb2NrKTsKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXZzbnByaW50ZihlcnJfYnVmLCBzaXplb2YoZXJyX2J1ZiksIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCWlmIChzYikKKwkJcHJpbnRrKEtFUk5fRVJSICJOVEZTLWZzIGVycm9yIChkZXZpY2UgJXMpOiAlcygpOiAlc1xuIiwKKwkJCQlzYi0+c19pZCwgZmxlbiA/IGZ1bmN0aW9uIDogIiIsIGVycl9idWYpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fRVJSICJOVEZTLWZzIGVycm9yOiAlcygpOiAlc1xuIiwKKwkJCQlmbGVuID8gZnVuY3Rpb24gOiAiIiwgZXJyX2J1Zik7CisJc3Bpbl91bmxvY2soJmVycl9idWZfbG9jayk7Cit9CisKKyNpZmRlZiBERUJVRworCisvKiBJZiAxLCBvdXRwdXQgZGVidWcgbWVzc2FnZXMsIGFuZCBpZiAwLCBkb24ndC4gKi8KK2ludCBkZWJ1Z19tc2dzID0gMDsKKwordm9pZCBfX250ZnNfZGVidWcgKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyICpmdW5jdGlvbiwKKwkJY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCWludCBmbGVuID0gMDsKKworCWlmICghZGVidWdfbXNncykKKwkJcmV0dXJuOworCWlmIChmdW5jdGlvbikKKwkJZmxlbiA9IHN0cmxlbihmdW5jdGlvbik7CisJc3Bpbl9sb2NrKCZlcnJfYnVmX2xvY2spOworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJdnNucHJpbnRmKGVycl9idWYsIHNpemVvZihlcnJfYnVmKSwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisJcHJpbnRrKEtFUk5fREVCVUcgIk5URlMtZnMgREVCVUcgKCVzLCAlZCk6ICVzKCk6ICVzXG4iLCBmaWxlLCBsaW5lLAorCQkJZmxlbiA/IGZ1bmN0aW9uIDogIiIsIGVycl9idWYpOworCXNwaW5fdW5sb2NrKCZlcnJfYnVmX2xvY2spOworfQorCisvKiBEdW1wIGEgcnVubGlzdC4gQ2FsbGVyIGhhcyB0byBwcm92aWRlIHN5bmNocm9uaXNhdGlvbiBmb3IgQHJsLiAqLwordm9pZCBudGZzX2RlYnVnX2R1bXBfcnVubGlzdChjb25zdCBydW5saXN0X2VsZW1lbnQgKnJsKQoreworCWludCBpOworCWNvbnN0IGNoYXIgKmxjbl9zdHJbNV0gPSB7ICJMQ05fSE9MRSAgICAgICAgICIsICJMQ05fUkxfTk9UX01BUFBFRCIsCisJCQkJICAgIkxDTl9FTk9FTlQgICAgICAgIiwgIkxDTl91bmtub3duICAgICAgIiB9OworCisJaWYgKCFkZWJ1Z19tc2dzKQorCQlyZXR1cm47CisJcHJpbnRrKEtFUk5fREVCVUcgIk5URlMtZnMgREVCVUc6IER1bXBpbmcgcnVubGlzdCAodmFsdWVzIGluIGhleCk6XG4iKTsKKwlpZiAoIXJsKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJSdW4gbGlzdCBub3QgcHJlc2VudC5cbiIpOworCQlyZXR1cm47CisJfQorCXByaW50ayhLRVJOX0RFQlVHICJWQ04gICAgICAgICAgICAgIExDTiAgICAgICAgICAgICAgIFJ1biBsZW5ndGhcbiIpOworCWZvciAoaSA9IDA7IDsgaSsrKSB7CisJCUxDTiBsY24gPSAocmwgKyBpKS0+bGNuOworCisJCWlmIChsY24gPCAoTENOKTApIHsKKwkJCWludCBpbmRleCA9IC1sY24gLSAxOworCisJCQlpZiAoaW5kZXggPiAtTENOX0VOT0VOVCAtIDEpCisJCQkJaW5kZXggPSAzOworCQkJcHJpbnRrKEtFUk5fREVCVUcgIiUtMTZMeCAlcyAlLTE2THglc1xuIiwKKwkJCQkJKHJsICsgaSktPnZjbiwgbGNuX3N0cltpbmRleF0sCisJCQkJCShybCArIGkpLT5sZW5ndGgsIChybCArIGkpLT5sZW5ndGggPworCQkJCQkiIiA6ICIgKHJ1bmxpc3QgZW5kKSIpOworCQl9IGVsc2UKKwkJCXByaW50ayhLRVJOX0RFQlVHICIlLTE2THggJS0xNkx4ICAlLTE2THglc1xuIiwKKwkJCQkJKHJsICsgaSktPnZjbiwgKHJsICsgaSktPmxjbiwKKwkJCQkJKHJsICsgaSktPmxlbmd0aCwgKHJsICsgaSktPmxlbmd0aCA/CisJCQkJCSIiIDogIiAocnVubGlzdCBlbmQpIik7CisJCWlmICghKHJsICsgaSktPmxlbmd0aCkKKwkJCWJyZWFrOworCX0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9udGZzL2RlYnVnLmggYi9mcy9udGZzL2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFjMzdjMwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvZGVidWcuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogZGVidWcuaCAtIE5URlMga2VybmVsIGRlYnVnIHN1cHBvcnQuIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZuZGVmIF9MSU5VWF9OVEZTX0RFQlVHX0gKKyNkZWZpbmUgX0xJTlVYX05URlNfREVCVUdfSAorCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKworI2luY2x1ZGUgInJ1bmxpc3QuaCIKKworI2lmZGVmIERFQlVHCisKK2V4dGVybiBpbnQgZGVidWdfbXNnczsKKworI2lmIDAgLyogRm9vbCBrZXJuZWwtZG9jIHNpbmNlIGl0IGRvZXNuJ3QgZG8gbWFjcm9zIHlldCAqLworLyoqCisgKiBudGZzX2RlYnVnIC0gd3JpdGUgYSBkZWJ1ZyBsZXZlbCBtZXNzYWdlIHRvIHN5c2xvZworICogQGY6CQlhIHByaW50ZiBmb3JtYXQgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2UKKyAqIEAuLi46CXRoZSB2YXJpYWJsZXMgdG8gc3Vic3RpdHV0ZSBpbnRvIEBmCisgKgorICogbnRmc19kZWJ1ZygpIHdyaXRlcyBhIERFQlVHIGxldmVsIG1lc3NhZ2UgdG8gdGhlIHN5c2xvZyBidXQgb25seSBpZiB0aGUKKyAqIGRyaXZlciB3YXMgY29tcGlsZWQgd2l0aCAtRERFQlVHLiBPdGhlcndpc2UsIHRoZSBjYWxsIHR1cm5zIGludG8gYSBOT1AuCisgKi8KK3N0YXRpYyB2b2lkIG50ZnNfZGVidWcoY29uc3QgY2hhciAqZiwgLi4uKTsKKyNlbmRpZgorCitleHRlcm4gdm9pZCBfX250ZnNfZGVidWcgKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjb25zdCBjaGFyICpmdW5jdGlvbiwKKwljb25zdCBjaGFyICpmb3JtYXQsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA0LCA1KSkpOworI2RlZmluZSBudGZzX2RlYnVnKGYsIGEuLi4pCQkJCQkJXAorCV9fbnRmc19kZWJ1ZyhfX0ZJTEVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXywgZiwgIyNhKQorCitleHRlcm4gdm9pZCBudGZzX2RlYnVnX2R1bXBfcnVubGlzdChjb25zdCBydW5saXN0X2VsZW1lbnQgKnJsKTsKKworI2Vsc2UJLyogIURFQlVHICovCisKKyNkZWZpbmUgbnRmc19kZWJ1ZyhmLCBhLi4uKQkJZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIG50ZnNfZGVidWdfZHVtcF9ydW5saXN0KHJsKQlkbyB7fSB3aGlsZSAoMCkKKworI2VuZGlmCS8qICFERUJVRyAqLworCitleHRlcm4gdm9pZCBfX250ZnNfd2FybmluZyhjb25zdCBjaGFyICpmdW5jdGlvbiwgY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJY29uc3QgY2hhciAqZm10LCAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKKyNkZWZpbmUgbnRmc193YXJuaW5nKHNiLCBmLCBhLi4uKQlfX250ZnNfd2FybmluZyhfX0ZVTkNUSU9OX18sIHNiLCBmLCAjI2EpCisKK2V4dGVybiB2b2lkIF9fbnRmc19lcnJvcihjb25zdCBjaGFyICpmdW5jdGlvbiwgY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJY29uc3QgY2hhciAqZm10LCAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKKyNkZWZpbmUgbnRmc19lcnJvcihzYiwgZiwgYS4uLikJCV9fbnRmc19lcnJvcihfX0ZVTkNUSU9OX18sIHNiLCBmLCAjI2EpCisKKyNlbmRpZiAvKiBfTElOVVhfTlRGU19ERUJVR19IICovCmRpZmYgLS1naXQgYS9mcy9udGZzL2Rpci5jIGIvZnMvbnRmcy9kaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzU3NzU2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9kaXIuYwpAQCAtMCwwICsxLDE1NjkgQEAKKy8qKgorICogZGlyLmMgLSBOVEZTIGtlcm5lbCBkaXJlY3Rvcnkgb3BlcmF0aW9ucy4gUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChjKSAyMDAyIFJpY2hhcmQgUnVzc29uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKworI2luY2x1ZGUgImRpci5oIgorI2luY2x1ZGUgImFvcHMuaCIKKyNpbmNsdWRlICJhdHRyaWIuaCIKKyNpbmNsdWRlICJtZnQuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgIm50ZnMuaCIKKworLyoqCisgKiBUaGUgbGl0dGxlIGVuZGlhbiBVbmljb2RlIHN0cmluZyAkSTMwIGFzIGEgZ2xvYmFsIGNvbnN0YW50LgorICovCitudGZzY2hhciBJMzBbNV0gPSB7IGNvbnN0X2NwdV90b19sZTE2KCckJyksIGNvbnN0X2NwdV90b19sZTE2KCdJJyksCisJCWNvbnN0X2NwdV90b19sZTE2KCczJyksCWNvbnN0X2NwdV90b19sZTE2KCcwJyksIDAgfTsKKworLyoqCisgKiBudGZzX2xvb2t1cF9pbm9kZV9ieV9uYW1lIC0gZmluZCBhbiBpbm9kZSBpbiBhIGRpcmVjdG9yeSBnaXZlbiBpdHMgbmFtZQorICogQGRpcl9uaToJbnRmcyBpbm9kZSBvZiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRvIHNlYXJjaCBmb3IgdGhlIG5hbWUKKyAqIEB1bmFtZToJVW5pY29kZSBuYW1lIGZvciB3aGljaCB0byBzZWFyY2ggaW4gdGhlIGRpcmVjdG9yeQorICogQHVuYW1lX2xlbjoJbGVuZ3RoIG9mIHRoZSBuYW1lIEB1bmFtZSBpbiBVbmljb2RlIGNoYXJhY3RlcnMKKyAqIEByZXM6CXJldHVybiB0aGUgZm91bmQgZmlsZSBuYW1lIGlmIG5lY2Vzc2FyeSAoc2VlIGJlbG93KQorICoKKyAqIExvb2sgZm9yIGFuIGlub2RlIHdpdGggbmFtZSBAdW5hbWUgaW4gdGhlIGRpcmVjdG9yeSB3aXRoIGlub2RlIEBkaXJfbmkuCisgKiBudGZzX2xvb2t1cF9pbm9kZV9ieV9uYW1lKCkgd2Fsa3MgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3RvcnkgbG9va2luZyBmb3IKKyAqIHRoZSBVbmljb2RlIG5hbWUuIElmIHRoZSBuYW1lIGlzIGZvdW5kIGluIHRoZSBkaXJlY3RvcnksIHRoZSBjb3JyZXNwb25kaW5nCisgKiBpbm9kZSBudW1iZXIgKD49IDApIGlzIHJldHVybmVkIGFzIGEgbWZ0IHJlZmVyZW5jZSBpbiBjcHUgZm9ybWF0LCBpLmUuIGl0CisgKiBpcyBhIDY0LWJpdCBudW1iZXIgY29udGFpbmluZyB0aGUgc2VxdWVuY2UgbnVtYmVyLgorICoKKyAqIE9uIGVycm9yLCBhIG5lZ2F0aXZlIHZhbHVlIGlzIHJldHVybmVkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVycm9yIGNvZGUuIEluCisgKiBwYXJ0aWN1bGFyIGlmIHRoZSBpbm9kZSBpcyBub3QgZm91bmQgLUVOT0VOVCBpcyByZXR1cm5lZC4gTm90ZSB0aGF0IHlvdQorICogY2FuJ3QganVzdCBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIGZvciBiZWluZyBuZWdhdGl2ZSwgeW91IGhhdmUgdG8gY2hlY2sgdGhlCisgKiBpbm9kZSBudW1iZXIgZm9yIGJlaW5nIG5lZ2F0aXZlIHdoaWNoIHlvdSBjYW4gZXh0cmFjdCB1c2luZyBNUkVDKHJldHVybgorICogdmFsdWUpLgorICoKKyAqIE5vdGUsIEB1bmFtZV9sZW4gZG9lcyBub3QgaW5jbHVkZSB0aGUgKG9wdGlvbmFsKSB0ZXJtaW5hdGluZyBOVUxMIGNoYXJhY3Rlci4KKyAqCisgKiBOb3RlLCB3ZSBsb29rIGZvciBhIGNhc2Ugc2Vuc2l0aXZlIG1hdGNoIGZpcnN0IGJ1dCB3ZSBhbHNvIGxvb2sgZm9yIGEgY2FzZQorICogaW5zZW5zaXRpdmUgbWF0Y2ggYXQgdGhlIHNhbWUgdGltZS4gSWYgd2UgZmluZCBhIGNhc2UgaW5zZW5zaXRpdmUgbWF0Y2gsIHdlCisgKiBzYXZlIHRoYXQgZm9yIHRoZSBjYXNlIHRoYXQgd2UgZG9uJ3QgZmluZCBhbiBleGFjdCBtYXRjaCwgd2hlcmUgd2UgcmV0dXJuCisgKiB0aGUgY2FzZSBpbnNlbnNpdGl2ZSBtYXRjaCBhbmQgc2V0dXAgQHJlcyAod2hpY2ggd2UgYWxsb2NhdGUhKSB3aXRoIHRoZSBtZnQKKyAqIHJlZmVyZW5jZSwgdGhlIGZpbGUgbmFtZSB0eXBlLCBsZW5ndGggYW5kIHdpdGggYSBjb3B5IG9mIHRoZSBsaXR0bGUgZW5kaWFuCisgKiBVbmljb2RlIGZpbGUgbmFtZSBpdHNlbGYuIElmIHdlIG1hdGNoIGEgZmlsZSBuYW1lIHdoaWNoIGlzIGluIHRoZSBET1MgbmFtZQorICogc3BhY2UsIHdlIG9ubHkgcmV0dXJuIHRoZSBtZnQgcmVmZXJlbmNlIGFuZCBmaWxlIG5hbWUgdHlwZSBpbiBAcmVzLgorICogbnRmc19sb29rdXAoKSB0aGVuIHVzZXMgdGhpcyB0byBmaW5kIHRoZSBsb25nIGZpbGUgbmFtZSBpbiB0aGUgaW5vZGUgaXRzZWxmLgorICogVGhpcyBpcyB0byBhdm9pZCBwb2xsdXRpbmcgdGhlIGRjYWNoZSB3aXRoIHNob3J0IGZpbGUgbmFtZXMuIFdlIHdhbnQgdGhlbSB0bworICogd29yayBidXQgd2UgZG9uJ3QgY2FyZSBmb3IgaG93IHF1aWNrbHkgb25lIGNhbiBhY2Nlc3MgdGhlbS4gVGhpcyBhbHNvIGZpeGVzCisgKiB0aGUgZGNhY2hlIGFsaWFzaW5nIGlzc3Vlcy4KKyAqCisgKiBMb2NraW5nOiAgLSBDYWxsZXIgbXVzdCBob2xkIGlfc2VtIG9uIHRoZSBkaXJlY3RvcnkuCisgKgkgICAgIC0gRWFjaCBwYWdlIGNhY2hlIHBhZ2UgaW4gdGhlIGluZGV4IGFsbG9jYXRpb24gbWFwcGluZyBtdXN0IGJlCisgKgkgICAgICAgbG9ja2VkIHdoaWxzdCBiZWluZyBhY2Nlc3NlZCBvdGhlcndpc2Ugd2UgbWF5IGZpbmQgYSBjb3JydXB0CisgKgkgICAgICAgcGFnZSBkdWUgdG8gaXQgYmVpbmcgdW5kZXIgLT53cml0ZXBhZ2UgYXQgdGhlIG1vbWVudCB3aGljaAorICoJICAgICAgIGFwcGxpZXMgdGhlIG1zdCBwcm90ZWN0aW9uIGZpeHVwcyBiZWZvcmUgd3JpdGluZyBvdXQgYW5kIHRoZW4KKyAqCSAgICAgICByZW1vdmVzIHRoZW0gYWdhaW4gYWZ0ZXIgdGhlIHdyaXRlIGlzIGNvbXBsZXRlIGFmdGVyIHdoaWNoIGl0IAorICoJICAgICAgIHVubG9ja3MgdGhlIHBhZ2UuCisgKi8KK01GVF9SRUYgbnRmc19sb29rdXBfaW5vZGVfYnlfbmFtZShudGZzX2lub2RlICpkaXJfbmksIGNvbnN0IG50ZnNjaGFyICp1bmFtZSwKKwkJY29uc3QgaW50IHVuYW1lX2xlbiwgbnRmc19uYW1lICoqcmVzKQoreworCW50ZnNfdm9sdW1lICp2b2wgPSBkaXJfbmktPnZvbDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gdm9sLT5zYjsKKwlNRlRfUkVDT1JEICptOworCUlOREVYX1JPT1QgKmlyOworCUlOREVYX0VOVFJZICppZTsKKwlJTkRFWF9BTExPQ0FUSU9OICppYTsKKwl1OCAqaW5kZXhfZW5kOworCXU2NCBtcmVmOworCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHg7CisJaW50IGVyciwgcmM7CisJVkNOIHZjbiwgb2xkX3ZjbjsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqaWFfbWFwcGluZzsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1OCAqa2FkZHI7CisJbnRmc19uYW1lICpuYW1lID0gTlVMTDsKKworCUJVR19PTighU19JU0RJUihWRlNfSShkaXJfbmkpLT5pX21vZGUpKTsKKwlCVUdfT04oTklub0F0dHIoZGlyX25pKSk7CisJLyogR2V0IGhvbGQgb2YgdGhlIG1mdCByZWNvcmQgZm9yIHRoZSBkaXJlY3RvcnkuICovCisJbSA9IG1hcF9tZnRfcmVjb3JkKGRpcl9uaSk7CisJaWYgKElTX0VSUihtKSkgeworCQludGZzX2Vycm9yKHNiLCAibWFwX21mdF9yZWNvcmQoKSBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVsZC4iLAorCQkJCS1QVFJfRVJSKG0pKTsKKwkJcmV0dXJuIEVSUl9NUkVGKFBUUl9FUlIobSkpOworCX0KKwljdHggPSBudGZzX2F0dHJfZ2V0X3NlYXJjaF9jdHgoZGlyX25pLCBtKTsKKwlpZiAodW5saWtlbHkoIWN0eCkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0OworCX0KKwkvKiBGaW5kIHRoZSBpbmRleCByb290IGF0dHJpYnV0ZSBpbiB0aGUgbWZ0IHJlY29yZC4gKi8KKwllcnIgPSBudGZzX2F0dHJfbG9va3VwKEFUX0lOREVYX1JPT1QsIEkzMCwgNCwgQ0FTRV9TRU5TSVRJVkUsIDAsIE5VTEwsCisJCQkwLCBjdHgpOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCWlmIChlcnIgPT0gLUVOT0VOVCkgeworCQkJbnRmc19lcnJvcihzYiwgIkluZGV4IHJvb3QgYXR0cmlidXRlIG1pc3NpbmcgaW4gIgorCQkJCQkiZGlyZWN0b3J5IGlub2RlIDB4JWx4LiIsCisJCQkJCWRpcl9uaS0+bWZ0X25vKTsKKwkJCWVyciA9IC1FSU87CisJCX0KKwkJZ290byBlcnJfb3V0OworCX0KKwkvKiBHZXQgdG8gdGhlIGluZGV4IHJvb3QgdmFsdWUgKGl0J3MgYmVlbiB2ZXJpZmllZCBpbiByZWFkX2lub2RlKS4gKi8KKwlpciA9IChJTkRFWF9ST09UKikoKHU4KiljdHgtPmF0dHIgKworCQkJbGUxNl90b19jcHUoY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCkpOworCWluZGV4X2VuZCA9ICh1OCopJmlyLT5pbmRleCArIGxlMzJfdG9fY3B1KGlyLT5pbmRleC5pbmRleF9sZW5ndGgpOworCS8qIFRoZSBmaXJzdCBpbmRleCBlbnRyeS4gKi8KKwlpZSA9IChJTkRFWF9FTlRSWSopKCh1OCopJmlyLT5pbmRleCArCisJCQlsZTMyX3RvX2NwdShpci0+aW5kZXguZW50cmllc19vZmZzZXQpKTsKKwkvKgorCSAqIExvb3AgdW50aWwgd2UgZXhjZWVkIHZhbGlkIG1lbW9yeSAoY29ycnVwdGlvbiBjYXNlKSBvciB1bnRpbCB3ZQorCSAqIHJlYWNoIHRoZSBsYXN0IGVudHJ5LgorCSAqLworCWZvciAoOzsgaWUgPSAoSU5ERVhfRU5UUlkqKSgodTgqKWllICsgbGUxNl90b19jcHUoaWUtPmxlbmd0aCkpKSB7CisJCS8qIEJvdW5kcyBjaGVja3MuICovCisJCWlmICgodTgqKWllIDwgKHU4KiljdHgtPm1yZWMgfHwgKHU4KilpZSArCisJCQkJc2l6ZW9mKElOREVYX0VOVFJZX0hFQURFUikgPiBpbmRleF9lbmQgfHwKKwkJCQkodTgqKWllICsgbGUxNl90b19jcHUoaWUtPmtleV9sZW5ndGgpID4KKwkJCQlpbmRleF9lbmQpCisJCQlnb3RvIGRpcl9lcnJfb3V0OworCQkvKgorCQkgKiBUaGUgbGFzdCBlbnRyeSBjYW5ub3QgY29udGFpbiBhIG5hbWUuIEl0IGNhbiBob3dldmVyIGNvbnRhaW4KKwkJICogYSBwb2ludGVyIHRvIGEgY2hpbGQgbm9kZSBpbiB0aGUgQit0cmVlIHNvIHdlIGp1c3QgYnJlYWsgb3V0LgorCQkgKi8KKwkJaWYgKGllLT5mbGFncyAmIElOREVYX0VOVFJZX0VORCkKKwkJCWJyZWFrOworCQkvKgorCQkgKiBXZSBwZXJmb3JtIGEgY2FzZSBzZW5zaXRpdmUgY29tcGFyaXNvbiBhbmQgaWYgdGhhdCBtYXRjaGVzCisJCSAqIHdlIGFyZSBkb25lIGFuZCByZXR1cm4gdGhlIG1mdCByZWZlcmVuY2Ugb2YgdGhlIGlub2RlIChpLmUuCisJCSAqIHRoZSBpbm9kZSBudW1iZXIgdG9nZXRoZXIgd2l0aCB0aGUgc2VxdWVuY2UgbnVtYmVyIGZvcgorCQkgKiBjb25zaXN0ZW5jeSBjaGVja2luZykuIFdlIGNvbnZlcnQgaXQgdG8gY3B1IGZvcm1hdCBiZWZvcmUKKwkJICogcmV0dXJuaW5nLgorCQkgKi8KKwkJaWYgKG50ZnNfYXJlX25hbWVzX2VxdWFsKHVuYW1lLCB1bmFtZV9sZW4sCisJCQkJKG50ZnNjaGFyKikmaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lLAorCQkJCWllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV9sZW5ndGgsCisJCQkJQ0FTRV9TRU5TSVRJVkUsIHZvbC0+dXBjYXNlLCB2b2wtPnVwY2FzZV9sZW4pKSB7Citmb3VuZF9pdDoKKwkJCS8qCisJCQkgKiBXZSBoYXZlIGEgcGVyZmVjdCBtYXRjaCwgc28gd2UgZG9uJ3QgbmVlZCB0byBjYXJlCisJCQkgKiBhYm91dCBoYXZpbmcgbWF0Y2hlZCBpbXBlcmZlY3RseSBiZWZvcmUsIHNvIHdlIGNhbgorCQkJICogZnJlZSBuYW1lIGFuZCBzZXQgKnJlcyB0byBOVUxMLgorCQkJICogSG93ZXZlciwgaWYgdGhlIHBlcmZlY3QgbWF0Y2ggaXMgYSBzaG9ydCBmaWxlIG5hbWUsCisJCQkgKiB3ZSBuZWVkIHRvIHNpZ25hbCB0aGlzIHRocm91Z2ggKnJlcywgc28gdGhhdAorCQkJICogbnRmc19sb29rdXAoKSBjYW4gZml4IGRjYWNoZSBhbGlhc2luZyBpc3N1ZXMuCisJCQkgKiBBcyBhbiBvcHRpbWl6YXRpb24gd2UganVzdCByZXVzZSBhbiBleGlzdGluZworCQkJICogYWxsb2NhdGlvbiBvZiAqcmVzLgorCQkJICovCisJCQlpZiAoaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lX3R5cGUgPT0gRklMRV9OQU1FX0RPUykgeworCQkJCWlmICghbmFtZSkgeworCQkJCQluYW1lID0ga21hbGxvYyhzaXplb2YobnRmc19uYW1lKSwKKwkJCQkJCQlHRlBfTk9GUyk7CisJCQkJCWlmICghbmFtZSkgeworCQkJCQkJZXJyID0gLUVOT01FTTsKKwkJCQkJCWdvdG8gZXJyX291dDsKKwkJCQkJfQorCQkJCX0KKwkJCQluYW1lLT5tcmVmID0gbGU2NF90b19jcHUoCisJCQkJCQlpZS0+ZGF0YS5kaXIuaW5kZXhlZF9maWxlKTsKKwkJCQluYW1lLT50eXBlID0gRklMRV9OQU1FX0RPUzsKKwkJCQluYW1lLT5sZW4gPSAwOworCQkJCSpyZXMgPSBuYW1lOworCQkJfSBlbHNlIHsKKwkJCQlpZiAobmFtZSkKKwkJCQkJa2ZyZWUobmFtZSk7CisJCQkJKnJlcyA9IE5VTEw7CisJCQl9CisJCQltcmVmID0gbGU2NF90b19jcHUoaWUtPmRhdGEuZGlyLmluZGV4ZWRfZmlsZSk7CisJCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwkJCXVubWFwX21mdF9yZWNvcmQoZGlyX25pKTsKKwkJCXJldHVybiBtcmVmOworCQl9CisJCS8qCisJCSAqIEZvciBhIGNhc2UgaW5zZW5zaXRpdmUgbW91bnQsIHdlIGFsc28gcGVyZm9ybSBhIGNhc2UKKwkJICogaW5zZW5zaXRpdmUgY29tcGFyaXNvbiAocHJvdmlkZWQgdGhlIGZpbGUgbmFtZSBpcyBub3QgaW4gdGhlCisJCSAqIFBPU0lYIG5hbWVzcGFjZSkuIElmIHRoZSBjb21wYXJpc29uIG1hdGNoZXMsIGFuZCB0aGUgbmFtZSBpcworCQkgKiBpbiB0aGUgV0lOMzIgbmFtZXNwYWNlLCB3ZSBjYWNoZSB0aGUgZmlsZW5hbWUgaW4gKnJlcyBzbworCQkgKiB0aGF0IHRoZSBjYWxsZXIsIG50ZnNfbG9va3VwKCksIGNhbiB3b3JrIG9uIGl0LiBJZiB0aGUKKwkJICogY29tcGFyaXNvbiBtYXRjaGVzLCBhbmQgdGhlIG5hbWUgaXMgaW4gdGhlIERPUyBuYW1lc3BhY2UsIHdlCisJCSAqIG9ubHkgY2FjaGUgdGhlIG1mdCByZWZlcmVuY2UgYW5kIHRoZSBmaWxlIG5hbWUgdHlwZSAod2Ugc2V0CisJCSAqIHRoZSBuYW1lIGxlbmd0aCB0byB6ZXJvIGZvciBzaW1wbGljaXR5KS4KKwkJICovCisJCWlmICghTlZvbENhc2VTZW5zaXRpdmUodm9sKSAmJgorCQkJCWllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV90eXBlICYmCisJCQkJbnRmc19hcmVfbmFtZXNfZXF1YWwodW5hbWUsIHVuYW1lX2xlbiwKKwkJCQkobnRmc2NoYXIqKSZpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWUsCisJCQkJaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lX2xlbmd0aCwKKwkJCQlJR05PUkVfQ0FTRSwgdm9sLT51cGNhc2UsIHZvbC0+dXBjYXNlX2xlbikpIHsKKwkJCWludCBuYW1lX3NpemUgPSBzaXplb2YobnRmc19uYW1lKTsKKwkJCXU4IHR5cGUgPSBpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWVfdHlwZTsKKwkJCXU4IGxlbiA9IGllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV9sZW5ndGg7CisKKwkJCS8qIE9ubHkgb25lIGNhc2UgaW5zZW5zaXRpdmUgbWF0Y2hpbmcgbmFtZSBhbGxvd2VkLiAqLworCQkJaWYgKG5hbWUpIHsKKwkJCQludGZzX2Vycm9yKHNiLCAiRm91bmQgYWxyZWFkeSBhbGxvY2F0ZWQgbmFtZSAiCisJCQkJCQkiaW4gcGhhc2UgMS4gUGxlYXNlIHJ1biBjaGtkc2sgIgorCQkJCQkJImFuZCBpZiB0aGF0IGRvZXNuJ3QgZmluZCBhbnkgIgorCQkJCQkJImVycm9ycyBwbGVhc2UgcmVwb3J0IHlvdSBzYXcgIgorCQkJCQkJInRoaXMgbWVzc2FnZSB0byAiCisJCQkJCQkibGludXgtbnRmcy1kZXZAbGlzdHMuIgorCQkJCQkJInNvdXJjZWZvcmdlLm5ldC4iKTsKKwkJCQlnb3RvIGRpcl9lcnJfb3V0OworCQkJfQorCisJCQlpZiAodHlwZSAhPSBGSUxFX05BTUVfRE9TKQorCQkJCW5hbWVfc2l6ZSArPSBsZW4gKiBzaXplb2YobnRmc2NoYXIpOworCQkJbmFtZSA9IGttYWxsb2MobmFtZV9zaXplLCBHRlBfTk9GUyk7CisJCQlpZiAoIW5hbWUpIHsKKwkJCQllcnIgPSAtRU5PTUVNOworCQkJCWdvdG8gZXJyX291dDsKKwkJCX0KKwkJCW5hbWUtPm1yZWYgPSBsZTY0X3RvX2NwdShpZS0+ZGF0YS5kaXIuaW5kZXhlZF9maWxlKTsKKwkJCW5hbWUtPnR5cGUgPSB0eXBlOworCQkJaWYgKHR5cGUgIT0gRklMRV9OQU1FX0RPUykgeworCQkJCW5hbWUtPmxlbiA9IGxlbjsKKwkJCQltZW1jcHkobmFtZS0+bmFtZSwgaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lLAorCQkJCQkJbGVuICogc2l6ZW9mKG50ZnNjaGFyKSk7CisJCQl9IGVsc2UKKwkJCQluYW1lLT5sZW4gPSAwOworCQkJKnJlcyA9IG5hbWU7CisJCX0KKwkJLyoKKwkJICogTm90IGEgcGVyZmVjdCBtYXRjaCwgbmVlZCB0byBkbyBmdWxsIGJsb3duIGNvbGxhdGlvbiBzbyB3ZQorCQkgKiBrbm93IHdoaWNoIHdheSBpbiB0aGUgQit0cmVlIHdlIGhhdmUgdG8gZ28uCisJCSAqLworCQlyYyA9IG50ZnNfY29sbGF0ZV9uYW1lcyh1bmFtZSwgdW5hbWVfbGVuLAorCQkJCShudGZzY2hhciopJmllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZSwKKwkJCQlpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWVfbGVuZ3RoLCAxLAorCQkJCUlHTk9SRV9DQVNFLCB2b2wtPnVwY2FzZSwgdm9sLT51cGNhc2VfbGVuKTsKKwkJLyoKKwkJICogSWYgdW5hbWUgY29sbGF0ZXMgYmVmb3JlIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGVudHJ5LCB0aGVyZQorCQkgKiBpcyBkZWZpbml0ZWx5IG5vIHN1Y2ggbmFtZSBpbiB0aGlzIGluZGV4IGJ1dCB3ZSBtaWdodCBuZWVkIHRvCisJCSAqIGRlc2NlbmQgaW50byB0aGUgQit0cmVlIHNvIHdlIGp1c3QgYnJlYWsgb3V0IG9mIHRoZSBsb29wLgorCQkgKi8KKwkJaWYgKHJjID09IC0xKQorCQkJYnJlYWs7CisJCS8qIFRoZSBuYW1lcyBhcmUgbm90IGVxdWFsLCBjb250aW51ZSB0aGUgc2VhcmNoLiAqLworCQlpZiAocmMpCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogTmFtZXMgbWF0Y2ggd2l0aCBjYXNlIGluc2Vuc2l0aXZlIGNvbXBhcmlzb24sIG5vdyB0cnkgdGhlCisJCSAqIGNhc2Ugc2Vuc2l0aXZlIGNvbXBhcmlzb24sIHdoaWNoIGlzIHJlcXVpcmVkIGZvciBwcm9wZXIKKwkJICogY29sbGF0aW9uLgorCQkgKi8KKwkJcmMgPSBudGZzX2NvbGxhdGVfbmFtZXModW5hbWUsIHVuYW1lX2xlbiwKKwkJCQkobnRmc2NoYXIqKSZpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWUsCisJCQkJaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lX2xlbmd0aCwgMSwKKwkJCQlDQVNFX1NFTlNJVElWRSwgdm9sLT51cGNhc2UsIHZvbC0+dXBjYXNlX2xlbik7CisJCWlmIChyYyA9PSAtMSkKKwkJCWJyZWFrOworCQlpZiAocmMpCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogUGVyZmVjdCBtYXRjaCwgdGhpcyB3aWxsIG5ldmVyIGhhcHBlbiBhcyB0aGUKKwkJICogbnRmc19hcmVfbmFtZXNfZXF1YWwoKSBjYWxsIHdpbGwgaGF2ZSBnb3R0ZW4gYSBtYXRjaCBidXQgd2UKKwkJICogc3RpbGwgdHJlYXQgaXQgY29ycmVjdGx5LgorCQkgKi8KKwkJZ290byBmb3VuZF9pdDsKKwl9CisJLyoKKwkgKiBXZSBoYXZlIGZpbmlzaGVkIHdpdGggdGhpcyBpbmRleCB3aXRob3V0IHN1Y2Nlc3MuIENoZWNrIGZvciB0aGUKKwkgKiBwcmVzZW5jZSBvZiBhIGNoaWxkIG5vZGUgYW5kIGlmIG5vdCBwcmVzZW50IHJldHVybiAtRU5PRU5ULCB1bmxlc3MKKwkgKiB3ZSBoYXZlIGdvdCBhIG1hdGNoaW5nIG5hbWUgY2FjaGVkIGluIG5hbWUgaW4gd2hpY2ggY2FzZSByZXR1cm4gdGhlCisJICogbWZ0IHJlZmVyZW5jZSBhc3NvY2lhdGVkIHdpdGggaXQuCisJICovCisJaWYgKCEoaWUtPmZsYWdzICYgSU5ERVhfRU5UUllfTk9ERSkpIHsKKwkJaWYgKG5hbWUpIHsKKwkJCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCQkJdW5tYXBfbWZ0X3JlY29yZChkaXJfbmkpOworCQkJcmV0dXJuIG5hbWUtPm1yZWY7CisJCX0KKwkJbnRmc19kZWJ1ZygiRW50cnkgbm90IGZvdW5kLiIpOworCQllcnIgPSAtRU5PRU5UOworCQlnb3RvIGVycl9vdXQ7CisJfSAvKiBDaGlsZCBub2RlIHByZXNlbnQsIGRlc2NlbmQgaW50byBpdC4gKi8KKwkvKiBDb25zaXN0ZW5jeSBjaGVjazogVmVyaWZ5IHRoYXQgYW4gaW5kZXggYWxsb2NhdGlvbiBleGlzdHMuICovCisJaWYgKCFOSW5vSW5kZXhBbGxvY1ByZXNlbnQoZGlyX25pKSkgeworCQludGZzX2Vycm9yKHNiLCAiTm8gaW5kZXggYWxsb2NhdGlvbiBhdHRyaWJ1dGUgYnV0IGluZGV4IGVudHJ5ICIKKwkJCQkicmVxdWlyZXMgb25lLiBEaXJlY3RvcnkgaW5vZGUgMHglbHggaXMgIgorCQkJCSJjb3JydXB0IG9yIGRyaXZlciBidWcuIiwgZGlyX25pLT5tZnRfbm8pOworCQlnb3RvIGVycl9vdXQ7CisJfQorCS8qIEdldCB0aGUgc3RhcnRpbmcgdmNuIG9mIHRoZSBpbmRleF9ibG9jayBob2xkaW5nIHRoZSBjaGlsZCBub2RlLiAqLworCXZjbiA9IHNsZTY0X3RvX2NwdXAoKHNsZTY0KikoKHU4KilpZSArIGxlMTZfdG9fY3B1KGllLT5sZW5ndGgpIC0gOCkpOworCWlhX21hcHBpbmcgPSBWRlNfSShkaXJfbmkpLT5pX21hcHBpbmc7CisJLyoKKwkgKiBXZSBhcmUgZG9uZSB3aXRoIHRoZSBpbmRleCByb290IGFuZCB0aGUgbWZ0IHJlY29yZC4gUmVsZWFzZSB0aGVtLAorCSAqIG90aGVyd2lzZSB3ZSBkZWFkbG9jayB3aXRoIG50ZnNfbWFwX3BhZ2UoKS4KKwkgKi8KKwludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwl1bm1hcF9tZnRfcmVjb3JkKGRpcl9uaSk7CisJbSA9IE5VTEw7CisJY3R4ID0gTlVMTDsKK2Rlc2NlbmRfaW50b19jaGlsZF9ub2RlOgorCS8qCisJICogQ29udmVydCB2Y24gdG8gaW5kZXggaW50byB0aGUgaW5kZXggYWxsb2NhdGlvbiBhdHRyaWJ1dGUgaW4gdW5pdHMKKwkgKiBvZiBQQUdFX0NBQ0hFX1NJWkUgYW5kIG1hcCB0aGUgcGFnZSBjYWNoZSBwYWdlLCByZWFkaW5nIGl0IGZyb20KKwkgKiBkaXNrIGlmIG5lY2Vzc2FyeS4KKwkgKi8KKwlwYWdlID0gbnRmc19tYXBfcGFnZShpYV9tYXBwaW5nLCB2Y24gPDwKKwkJCWRpcl9uaS0+aXR5cGUuaW5kZXgudmNuX3NpemVfYml0cyA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwlpZiAoSVNfRVJSKHBhZ2UpKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gbWFwIGRpcmVjdG9yeSBpbmRleCBwYWdlLCBlcnJvciAlbGQuIiwKKwkJCQktUFRSX0VSUihwYWdlKSk7CisJCWVyciA9IFBUUl9FUlIocGFnZSk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJbG9ja19wYWdlKHBhZ2UpOworCWthZGRyID0gKHU4KilwYWdlX2FkZHJlc3MocGFnZSk7CitmYXN0X2Rlc2NlbmRfaW50b19jaGlsZF9ub2RlOgorCS8qIEdldCB0byB0aGUgaW5kZXggYWxsb2NhdGlvbiBibG9jay4gKi8KKwlpYSA9IChJTkRFWF9BTExPQ0FUSU9OKikoa2FkZHIgKyAoKHZjbiA8PAorCQkJZGlyX25pLT5pdHlwZS5pbmRleC52Y25fc2l6ZV9iaXRzKSAmIH5QQUdFX0NBQ0hFX01BU0spKTsKKwkvKiBCb3VuZHMgY2hlY2tzLiAqLworCWlmICgodTgqKWlhIDwga2FkZHIgfHwgKHU4KilpYSA+IGthZGRyICsgUEFHRV9DQUNIRV9TSVpFKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJPdXQgb2YgYm91bmRzIGNoZWNrIGZhaWxlZC4gQ29ycnVwdCBkaXJlY3RvcnkgIgorCQkJCSJpbm9kZSAweCVseCBvciBkcml2ZXIgYnVnLiIsIGRpcl9uaS0+bWZ0X25vKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJLyogQ2F0Y2ggbXVsdGkgc2VjdG9yIHRyYW5zZmVyIGZpeHVwIGVycm9ycy4gKi8KKwlpZiAodW5saWtlbHkoIW50ZnNfaXNfaW5keF9yZWNvcmQoaWEtPm1hZ2ljKSkpIHsKKwkJbnRmc19lcnJvcihzYiwgIkRpcmVjdG9yeSBpbmRleCByZWNvcmQgd2l0aCB2Y24gMHglbGx4IGlzICIKKwkJCQkiY29ycnVwdC4gIENvcnJ1cHQgaW5vZGUgMHglbHguICBSdW4gY2hrZHNrLiIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2Y24sIGRpcl9uaS0+bWZ0X25vKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJaWYgKHNsZTY0X3RvX2NwdShpYS0+aW5kZXhfYmxvY2tfdmNuKSAhPSB2Y24pIHsKKwkJbnRmc19lcnJvcihzYiwgIkFjdHVhbCBWQ04gKDB4JWxseCkgb2YgaW5kZXggYnVmZmVyIGlzICIKKwkJCQkiZGlmZmVyZW50IGZyb20gZXhwZWN0ZWQgVkNOICgweCVsbHgpLiAiCisJCQkJIkRpcmVjdG9yeSBpbm9kZSAweCVseCBpcyBjb3JydXB0IG9yIGRyaXZlciAiCisJCQkJImJ1Zy4iLCAodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCXNsZTY0X3RvX2NwdShpYS0+aW5kZXhfYmxvY2tfdmNuKSwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXZjbiwgZGlyX25pLT5tZnRfbm8pOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwlpZiAobGUzMl90b19jcHUoaWEtPmluZGV4LmFsbG9jYXRlZF9zaXplKSArIDB4MTggIT0KKwkJCWRpcl9uaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSkgeworCQludGZzX2Vycm9yKHNiLCAiSW5kZXggYnVmZmVyIChWQ04gMHglbGx4KSBvZiBkaXJlY3RvcnkgaW5vZGUgIgorCQkJCSIweCVseCBoYXMgYSBzaXplICgldSkgZGlmZmVyaW5nIGZyb20gdGhlICIKKwkJCQkiZGlyZWN0b3J5IHNwZWNpZmllZCBzaXplICgldSkuIERpcmVjdG9yeSAiCisJCQkJImlub2RlIGlzIGNvcnJ1cHQgb3IgZHJpdmVyIGJ1Zy4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdmNuLCBkaXJfbmktPm1mdF9ubywKKwkJCQlsZTMyX3RvX2NwdShpYS0+aW5kZXguYWxsb2NhdGVkX3NpemUpICsgMHgxOCwKKwkJCQlkaXJfbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUpOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwlpbmRleF9lbmQgPSAodTgqKWlhICsgZGlyX25pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplOworCWlmIChpbmRleF9lbmQgPiBrYWRkciArIFBBR0VfQ0FDSEVfU0laRSkgeworCQludGZzX2Vycm9yKHNiLCAiSW5kZXggYnVmZmVyIChWQ04gMHglbGx4KSBvZiBkaXJlY3RvcnkgaW5vZGUgIgorCQkJCSIweCVseCBjcm9zc2VzIHBhZ2UgYm91bmRhcnkuIEltcG9zc2libGUhICIKKwkJCQkiQ2Fubm90IGFjY2VzcyEgVGhpcyBpcyBwcm9iYWJseSBhIGJ1ZyBpbiB0aGUgIgorCQkJCSJkcml2ZXIuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyl2Y24sCisJCQkJZGlyX25pLT5tZnRfbm8pOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwlpbmRleF9lbmQgPSAodTgqKSZpYS0+aW5kZXggKyBsZTMyX3RvX2NwdShpYS0+aW5kZXguaW5kZXhfbGVuZ3RoKTsKKwlpZiAoaW5kZXhfZW5kID4gKHU4KilpYSArIGRpcl9uaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSkgeworCQludGZzX2Vycm9yKHNiLCAiU2l6ZSBvZiBpbmRleCBidWZmZXIgKFZDTiAweCVsbHgpIG9mIGRpcmVjdG9yeSAiCisJCQkJImlub2RlIDB4JWx4IGV4Y2VlZHMgbWF4aW11bSBzaXplLiIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2Y24sIGRpcl9uaS0+bWZ0X25vKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJLyogVGhlIGZpcnN0IGluZGV4IGVudHJ5LiAqLworCWllID0gKElOREVYX0VOVFJZKikoKHU4KikmaWEtPmluZGV4ICsKKwkJCWxlMzJfdG9fY3B1KGlhLT5pbmRleC5lbnRyaWVzX29mZnNldCkpOworCS8qCisJICogSXRlcmF0ZSBzaW1pbGFyIHRvIGFib3ZlIGJpZyBsb29wIGJ1dCBhcHBsaWVkIHRvIGluZGV4IGJ1ZmZlciwgdGh1cworCSAqIGxvb3AgdW50aWwgd2UgZXhjZWVkIHZhbGlkIG1lbW9yeSAoY29ycnVwdGlvbiBjYXNlKSBvciB1bnRpbCB3ZQorCSAqIHJlYWNoIHRoZSBsYXN0IGVudHJ5LgorCSAqLworCWZvciAoOzsgaWUgPSAoSU5ERVhfRU5UUlkqKSgodTgqKWllICsgbGUxNl90b19jcHUoaWUtPmxlbmd0aCkpKSB7CisJCS8qIEJvdW5kcyBjaGVjay4gKi8KKwkJaWYgKCh1OCopaWUgPCAodTgqKWlhIHx8ICh1OCopaWUgKworCQkJCXNpemVvZihJTkRFWF9FTlRSWV9IRUFERVIpID4gaW5kZXhfZW5kIHx8CisJCQkJKHU4KilpZSArIGxlMTZfdG9fY3B1KGllLT5rZXlfbGVuZ3RoKSA+CisJCQkJaW5kZXhfZW5kKSB7CisJCQludGZzX2Vycm9yKHNiLCAiSW5kZXggZW50cnkgb3V0IG9mIGJvdW5kcyBpbiAiCisJCQkJCSJkaXJlY3RvcnkgaW5vZGUgMHglbHguIiwKKwkJCQkJZGlyX25pLT5tZnRfbm8pOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQkvKgorCQkgKiBUaGUgbGFzdCBlbnRyeSBjYW5ub3QgY29udGFpbiBhIG5hbWUuIEl0IGNhbiBob3dldmVyIGNvbnRhaW4KKwkJICogYSBwb2ludGVyIHRvIGEgY2hpbGQgbm9kZSBpbiB0aGUgQit0cmVlIHNvIHdlIGp1c3QgYnJlYWsgb3V0LgorCQkgKi8KKwkJaWYgKGllLT5mbGFncyAmIElOREVYX0VOVFJZX0VORCkKKwkJCWJyZWFrOworCQkvKgorCQkgKiBXZSBwZXJmb3JtIGEgY2FzZSBzZW5zaXRpdmUgY29tcGFyaXNvbiBhbmQgaWYgdGhhdCBtYXRjaGVzCisJCSAqIHdlIGFyZSBkb25lIGFuZCByZXR1cm4gdGhlIG1mdCByZWZlcmVuY2Ugb2YgdGhlIGlub2RlIChpLmUuCisJCSAqIHRoZSBpbm9kZSBudW1iZXIgdG9nZXRoZXIgd2l0aCB0aGUgc2VxdWVuY2UgbnVtYmVyIGZvcgorCQkgKiBjb25zaXN0ZW5jeSBjaGVja2luZykuIFdlIGNvbnZlcnQgaXQgdG8gY3B1IGZvcm1hdCBiZWZvcmUKKwkJICogcmV0dXJuaW5nLgorCQkgKi8KKwkJaWYgKG50ZnNfYXJlX25hbWVzX2VxdWFsKHVuYW1lLCB1bmFtZV9sZW4sCisJCQkJKG50ZnNjaGFyKikmaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lLAorCQkJCWllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV9sZW5ndGgsCisJCQkJQ0FTRV9TRU5TSVRJVkUsIHZvbC0+dXBjYXNlLCB2b2wtPnVwY2FzZV9sZW4pKSB7Citmb3VuZF9pdDI6CisJCQkvKgorCQkJICogV2UgaGF2ZSBhIHBlcmZlY3QgbWF0Y2gsIHNvIHdlIGRvbid0IG5lZWQgdG8gY2FyZQorCQkJICogYWJvdXQgaGF2aW5nIG1hdGNoZWQgaW1wZXJmZWN0bHkgYmVmb3JlLCBzbyB3ZSBjYW4KKwkJCSAqIGZyZWUgbmFtZSBhbmQgc2V0ICpyZXMgdG8gTlVMTC4KKwkJCSAqIEhvd2V2ZXIsIGlmIHRoZSBwZXJmZWN0IG1hdGNoIGlzIGEgc2hvcnQgZmlsZSBuYW1lLAorCQkJICogd2UgbmVlZCB0byBzaWduYWwgdGhpcyB0aHJvdWdoICpyZXMsIHNvIHRoYXQKKwkJCSAqIG50ZnNfbG9va3VwKCkgY2FuIGZpeCBkY2FjaGUgYWxpYXNpbmcgaXNzdWVzLgorCQkJICogQXMgYW4gb3B0aW1pemF0aW9uIHdlIGp1c3QgcmV1c2UgYW4gZXhpc3RpbmcKKwkJCSAqIGFsbG9jYXRpb24gb2YgKnJlcy4KKwkJCSAqLworCQkJaWYgKGllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV90eXBlID09IEZJTEVfTkFNRV9ET1MpIHsKKwkJCQlpZiAoIW5hbWUpIHsKKwkJCQkJbmFtZSA9IGttYWxsb2Moc2l6ZW9mKG50ZnNfbmFtZSksCisJCQkJCQkJR0ZQX05PRlMpOworCQkJCQlpZiAoIW5hbWUpIHsKKwkJCQkJCWVyciA9IC1FTk9NRU07CisJCQkJCQlnb3RvIHVubV9lcnJfb3V0OworCQkJCQl9CisJCQkJfQorCQkJCW5hbWUtPm1yZWYgPSBsZTY0X3RvX2NwdSgKKwkJCQkJCWllLT5kYXRhLmRpci5pbmRleGVkX2ZpbGUpOworCQkJCW5hbWUtPnR5cGUgPSBGSUxFX05BTUVfRE9TOworCQkJCW5hbWUtPmxlbiA9IDA7CisJCQkJKnJlcyA9IG5hbWU7CisJCQl9IGVsc2UgeworCQkJCWlmIChuYW1lKQorCQkJCQlrZnJlZShuYW1lKTsKKwkJCQkqcmVzID0gTlVMTDsKKwkJCX0KKwkJCW1yZWYgPSBsZTY0X3RvX2NwdShpZS0+ZGF0YS5kaXIuaW5kZXhlZF9maWxlKTsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCQkJcmV0dXJuIG1yZWY7CisJCX0KKwkJLyoKKwkJICogRm9yIGEgY2FzZSBpbnNlbnNpdGl2ZSBtb3VudCwgd2UgYWxzbyBwZXJmb3JtIGEgY2FzZQorCQkgKiBpbnNlbnNpdGl2ZSBjb21wYXJpc29uIChwcm92aWRlZCB0aGUgZmlsZSBuYW1lIGlzIG5vdCBpbiB0aGUKKwkJICogUE9TSVggbmFtZXNwYWNlKS4gSWYgdGhlIGNvbXBhcmlzb24gbWF0Y2hlcywgYW5kIHRoZSBuYW1lIGlzCisJCSAqIGluIHRoZSBXSU4zMiBuYW1lc3BhY2UsIHdlIGNhY2hlIHRoZSBmaWxlbmFtZSBpbiAqcmVzIHNvCisJCSAqIHRoYXQgdGhlIGNhbGxlciwgbnRmc19sb29rdXAoKSwgY2FuIHdvcmsgb24gaXQuIElmIHRoZQorCQkgKiBjb21wYXJpc29uIG1hdGNoZXMsIGFuZCB0aGUgbmFtZSBpcyBpbiB0aGUgRE9TIG5hbWVzcGFjZSwgd2UKKwkJICogb25seSBjYWNoZSB0aGUgbWZ0IHJlZmVyZW5jZSBhbmQgdGhlIGZpbGUgbmFtZSB0eXBlICh3ZSBzZXQKKwkJICogdGhlIG5hbWUgbGVuZ3RoIHRvIHplcm8gZm9yIHNpbXBsaWNpdHkpLgorCQkgKi8KKwkJaWYgKCFOVm9sQ2FzZVNlbnNpdGl2ZSh2b2wpICYmCisJCQkJaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lX3R5cGUgJiYKKwkJCQludGZzX2FyZV9uYW1lc19lcXVhbCh1bmFtZSwgdW5hbWVfbGVuLAorCQkJCShudGZzY2hhciopJmllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZSwKKwkJCQlpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWVfbGVuZ3RoLAorCQkJCUlHTk9SRV9DQVNFLCB2b2wtPnVwY2FzZSwgdm9sLT51cGNhc2VfbGVuKSkgeworCQkJaW50IG5hbWVfc2l6ZSA9IHNpemVvZihudGZzX25hbWUpOworCQkJdTggdHlwZSA9IGllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV90eXBlOworCQkJdTggbGVuID0gaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lX2xlbmd0aDsKKworCQkJLyogT25seSBvbmUgY2FzZSBpbnNlbnNpdGl2ZSBtYXRjaGluZyBuYW1lIGFsbG93ZWQuICovCisJCQlpZiAobmFtZSkgeworCQkJCW50ZnNfZXJyb3Ioc2IsICJGb3VuZCBhbHJlYWR5IGFsbG9jYXRlZCBuYW1lICIKKwkJCQkJCSJpbiBwaGFzZSAyLiBQbGVhc2UgcnVuIGNoa2RzayAiCisJCQkJCQkiYW5kIGlmIHRoYXQgZG9lc24ndCBmaW5kIGFueSAiCisJCQkJCQkiZXJyb3JzIHBsZWFzZSByZXBvcnQgeW91IHNhdyAiCisJCQkJCQkidGhpcyBtZXNzYWdlIHRvICIKKwkJCQkJCSJsaW51eC1udGZzLWRldkBsaXN0cy4iCisJCQkJCQkic291cmNlZm9yZ2UubmV0LiIpOworCQkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwkJCQlnb3RvIGRpcl9lcnJfb3V0OworCQkJfQorCisJCQlpZiAodHlwZSAhPSBGSUxFX05BTUVfRE9TKQorCQkJCW5hbWVfc2l6ZSArPSBsZW4gKiBzaXplb2YobnRmc2NoYXIpOworCQkJbmFtZSA9IGttYWxsb2MobmFtZV9zaXplLCBHRlBfTk9GUyk7CisJCQlpZiAoIW5hbWUpIHsKKwkJCQllcnIgPSAtRU5PTUVNOworCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCQl9CisJCQluYW1lLT5tcmVmID0gbGU2NF90b19jcHUoaWUtPmRhdGEuZGlyLmluZGV4ZWRfZmlsZSk7CisJCQluYW1lLT50eXBlID0gdHlwZTsKKwkJCWlmICh0eXBlICE9IEZJTEVfTkFNRV9ET1MpIHsKKwkJCQluYW1lLT5sZW4gPSBsZW47CisJCQkJbWVtY3B5KG5hbWUtPm5hbWUsIGllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZSwKKwkJCQkJCWxlbiAqIHNpemVvZihudGZzY2hhcikpOworCQkJfSBlbHNlCisJCQkJbmFtZS0+bGVuID0gMDsKKwkJCSpyZXMgPSBuYW1lOworCQl9CisJCS8qCisJCSAqIE5vdCBhIHBlcmZlY3QgbWF0Y2gsIG5lZWQgdG8gZG8gZnVsbCBibG93biBjb2xsYXRpb24gc28gd2UKKwkJICoga25vdyB3aGljaCB3YXkgaW4gdGhlIEIrdHJlZSB3ZSBoYXZlIHRvIGdvLgorCQkgKi8KKwkJcmMgPSBudGZzX2NvbGxhdGVfbmFtZXModW5hbWUsIHVuYW1lX2xlbiwKKwkJCQkobnRmc2NoYXIqKSZpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWUsCisJCQkJaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lX2xlbmd0aCwgMSwKKwkJCQlJR05PUkVfQ0FTRSwgdm9sLT51cGNhc2UsIHZvbC0+dXBjYXNlX2xlbik7CisJCS8qCisJCSAqIElmIHVuYW1lIGNvbGxhdGVzIGJlZm9yZSB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBlbnRyeSwgdGhlcmUKKwkJICogaXMgZGVmaW5pdGVseSBubyBzdWNoIG5hbWUgaW4gdGhpcyBpbmRleCBidXQgd2UgbWlnaHQgbmVlZCB0bworCQkgKiBkZXNjZW5kIGludG8gdGhlIEIrdHJlZSBzbyB3ZSBqdXN0IGJyZWFrIG91dCBvZiB0aGUgbG9vcC4KKwkJICovCisJCWlmIChyYyA9PSAtMSkKKwkJCWJyZWFrOworCQkvKiBUaGUgbmFtZXMgYXJlIG5vdCBlcXVhbCwgY29udGludWUgdGhlIHNlYXJjaC4gKi8KKwkJaWYgKHJjKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIE5hbWVzIG1hdGNoIHdpdGggY2FzZSBpbnNlbnNpdGl2ZSBjb21wYXJpc29uLCBub3cgdHJ5IHRoZQorCQkgKiBjYXNlIHNlbnNpdGl2ZSBjb21wYXJpc29uLCB3aGljaCBpcyByZXF1aXJlZCBmb3IgcHJvcGVyCisJCSAqIGNvbGxhdGlvbi4KKwkJICovCisJCXJjID0gbnRmc19jb2xsYXRlX25hbWVzKHVuYW1lLCB1bmFtZV9sZW4sCisJCQkJKG50ZnNjaGFyKikmaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lLAorCQkJCWllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV9sZW5ndGgsIDEsCisJCQkJQ0FTRV9TRU5TSVRJVkUsIHZvbC0+dXBjYXNlLCB2b2wtPnVwY2FzZV9sZW4pOworCQlpZiAocmMgPT0gLTEpCisJCQlicmVhazsKKwkJaWYgKHJjKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIFBlcmZlY3QgbWF0Y2gsIHRoaXMgd2lsbCBuZXZlciBoYXBwZW4gYXMgdGhlCisJCSAqIG50ZnNfYXJlX25hbWVzX2VxdWFsKCkgY2FsbCB3aWxsIGhhdmUgZ290dGVuIGEgbWF0Y2ggYnV0IHdlCisJCSAqIHN0aWxsIHRyZWF0IGl0IGNvcnJlY3RseS4KKwkJICovCisJCWdvdG8gZm91bmRfaXQyOworCX0KKwkvKgorCSAqIFdlIGhhdmUgZmluaXNoZWQgd2l0aCB0aGlzIGluZGV4IGJ1ZmZlciB3aXRob3V0IHN1Y2Nlc3MuIENoZWNrIGZvcgorCSAqIHRoZSBwcmVzZW5jZSBvZiBhIGNoaWxkIG5vZGUuCisJICovCisJaWYgKGllLT5mbGFncyAmIElOREVYX0VOVFJZX05PREUpIHsKKwkJaWYgKChpYS0+aW5kZXguZmxhZ3MgJiBOT0RFX01BU0spID09IExFQUZfTk9ERSkgeworCQkJbnRmc19lcnJvcihzYiwgIkluZGV4IGVudHJ5IHdpdGggY2hpbGQgbm9kZSBmb3VuZCBpbiAiCisJCQkJCSJhIGxlYWYgbm9kZSBpbiBkaXJlY3RvcnkgaW5vZGUgMHglbHguIiwKKwkJCQkJZGlyX25pLT5tZnRfbm8pOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQkvKiBDaGlsZCBub2RlIHByZXNlbnQsIGRlc2NlbmQgaW50byBpdC4gKi8KKwkJb2xkX3ZjbiA9IHZjbjsKKwkJdmNuID0gc2xlNjRfdG9fY3B1cCgoc2xlNjQqKSgodTgqKWllICsKKwkJCQlsZTE2X3RvX2NwdShpZS0+bGVuZ3RoKSAtIDgpKTsKKwkJaWYgKHZjbiA+PSAwKSB7CisJCQkvKiBJZiB2Y24gaXMgaW4gdGhlIHNhbWUgcGFnZSBjYWNoZSBwYWdlIGFzIG9sZF92Y24gd2UKKwkJCSAqIHJlY3ljbGUgdGhlIG1hcHBlZCBwYWdlLiAqLworCQkJaWYgKG9sZF92Y24gPDwgdm9sLT5jbHVzdGVyX3NpemVfYml0cyA+PgorCQkJCQlQQUdFX0NBQ0hFX1NISUZUID09IHZjbiA8PAorCQkJCQl2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzID4+CisJCQkJCVBBR0VfQ0FDSEVfU0hJRlQpCisJCQkJZ290byBmYXN0X2Rlc2NlbmRfaW50b19jaGlsZF9ub2RlOworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJCQlnb3RvIGRlc2NlbmRfaW50b19jaGlsZF9ub2RlOworCQl9CisJCW50ZnNfZXJyb3Ioc2IsICJOZWdhdGl2ZSBjaGlsZCBub2RlIHZjbiBpbiBkaXJlY3RvcnkgaW5vZGUgIgorCQkJCSIweCVseC4iLCBkaXJfbmktPm1mdF9ubyk7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCS8qCisJICogTm8gY2hpbGQgbm9kZSBwcmVzZW50LCByZXR1cm4gLUVOT0VOVCwgdW5sZXNzIHdlIGhhdmUgZ290IGEgbWF0Y2hpbmcKKwkgKiBuYW1lIGNhY2hlZCBpbiBuYW1lIGluIHdoaWNoIGNhc2UgcmV0dXJuIHRoZSBtZnQgcmVmZXJlbmNlCisJICogYXNzb2NpYXRlZCB3aXRoIGl0LgorCSAqLworCWlmIChuYW1lKSB7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJCXJldHVybiBuYW1lLT5tcmVmOworCX0KKwludGZzX2RlYnVnKCJFbnRyeSBub3QgZm91bmQuIik7CisJZXJyID0gLUVOT0VOVDsKK3VubV9lcnJfb3V0OgorCXVubG9ja19wYWdlKHBhZ2UpOworCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKK2Vycl9vdXQ6CisJaWYgKCFlcnIpCisJCWVyciA9IC1FSU87CisJaWYgKGN0eCkKKwkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJaWYgKG0pCisJCXVubWFwX21mdF9yZWNvcmQoZGlyX25pKTsKKwlpZiAobmFtZSkgeworCQlrZnJlZShuYW1lKTsKKwkJKnJlcyA9IE5VTEw7CisJfQorCXJldHVybiBFUlJfTVJFRihlcnIpOworZGlyX2Vycl9vdXQ6CisJbnRmc19lcnJvcihzYiwgIkNvcnJ1cHQgZGlyZWN0b3J5LiAgQWJvcnRpbmcgbG9va3VwLiIpOworCWdvdG8gZXJyX291dDsKK30KKworI2lmIDAKKworLy8gVE9ETzogKEFJQSkKKy8vIFRoZSBhbGdvcml0aG0gZW1iZWRkZWQgaW4gdGhpcyBjb2RlIHdpbGwgYmUgcmVxdWlyZWQgZm9yIHRoZSB0aW1lIHdoZW4gd2UKKy8vIHdhbnQgdG8gc3VwcG9ydCBhZGRpbmcgb2YgZW50cmllcyB0byBkaXJlY3Rvcmllcywgd2hlcmUgd2UgcmVxdWlyZSBjb3JyZWN0CisvLyBjb2xsYXRpb24gb2YgZmlsZSBuYW1lcyBpbiBvcmRlciBub3QgdG8gY2F1c2UgY29ycnVwdGlvbiBvZiB0aGUgZmlsZSBzeXN0ZW0uCisKKy8qKgorICogbnRmc19sb29rdXBfaW5vZGVfYnlfbmFtZSAtIGZpbmQgYW4gaW5vZGUgaW4gYSBkaXJlY3RvcnkgZ2l2ZW4gaXRzIG5hbWUKKyAqIEBkaXJfbmk6CW50ZnMgaW5vZGUgb2YgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0byBzZWFyY2ggZm9yIHRoZSBuYW1lCisgKiBAdW5hbWU6CVVuaWNvZGUgbmFtZSBmb3Igd2hpY2ggdG8gc2VhcmNoIGluIHRoZSBkaXJlY3RvcnkKKyAqIEB1bmFtZV9sZW46CWxlbmd0aCBvZiB0aGUgbmFtZSBAdW5hbWUgaW4gVW5pY29kZSBjaGFyYWN0ZXJzCisgKgorICogTG9vayBmb3IgYW4gaW5vZGUgd2l0aCBuYW1lIEB1bmFtZSBpbiB0aGUgZGlyZWN0b3J5IHdpdGggaW5vZGUgQGRpcl9uaS4KKyAqIG50ZnNfbG9va3VwX2lub2RlX2J5X25hbWUoKSB3YWxrcyB0aGUgY29udGVudHMgb2YgdGhlIGRpcmVjdG9yeSBsb29raW5nIGZvcgorICogdGhlIFVuaWNvZGUgbmFtZS4gSWYgdGhlIG5hbWUgaXMgZm91bmQgaW4gdGhlIGRpcmVjdG9yeSwgdGhlIGNvcnJlc3BvbmRpbmcKKyAqIGlub2RlIG51bWJlciAoPj0gMCkgaXMgcmV0dXJuZWQgYXMgYSBtZnQgcmVmZXJlbmNlIGluIGNwdSBmb3JtYXQsIGkuZS4gaXQKKyAqIGlzIGEgNjQtYml0IG51bWJlciBjb250YWluaW5nIHRoZSBzZXF1ZW5jZSBudW1iZXIuCisgKgorICogT24gZXJyb3IsIGEgbmVnYXRpdmUgdmFsdWUgaXMgcmV0dXJuZWQgY29ycmVzcG9uZGluZyB0byB0aGUgZXJyb3IgY29kZS4gSW4KKyAqIHBhcnRpY3VsYXIgaWYgdGhlIGlub2RlIGlzIG5vdCBmb3VuZCAtRU5PRU5UIGlzIHJldHVybmVkLiBOb3RlIHRoYXQgeW91CisgKiBjYW4ndCBqdXN0IGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgZm9yIGJlaW5nIG5lZ2F0aXZlLCB5b3UgaGF2ZSB0byBjaGVjayB0aGUKKyAqIGlub2RlIG51bWJlciBmb3IgYmVpbmcgbmVnYXRpdmUgd2hpY2ggeW91IGNhbiBleHRyYWN0IHVzaW5nIE1SRUMocmV0dXJuCisgKiB2YWx1ZSkuCisgKgorICogTm90ZSwgQHVuYW1lX2xlbiBkb2VzIG5vdCBpbmNsdWRlIHRoZSAob3B0aW9uYWwpIHRlcm1pbmF0aW5nIE5VTEwgY2hhcmFjdGVyLgorICovCit1NjQgbnRmc19sb29rdXBfaW5vZGVfYnlfbmFtZShudGZzX2lub2RlICpkaXJfbmksIGNvbnN0IG50ZnNjaGFyICp1bmFtZSwKKwkJY29uc3QgaW50IHVuYW1lX2xlbikKK3sKKwludGZzX3ZvbHVtZSAqdm9sID0gZGlyX25pLT52b2w7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IHZvbC0+c2I7CisJTUZUX1JFQ09SRCAqbTsKKwlJTkRFWF9ST09UICppcjsKKwlJTkRFWF9FTlRSWSAqaWU7CisJSU5ERVhfQUxMT0NBVElPTiAqaWE7CisJdTggKmluZGV4X2VuZDsKKwl1NjQgbXJlZjsKKwludGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4OworCWludCBlcnIsIHJjOworCUlHTk9SRV9DQVNFX0JPT0wgaWM7CisJVkNOIHZjbiwgb2xkX3ZjbjsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqaWFfbWFwcGluZzsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1OCAqa2FkZHI7CisKKwkvKiBHZXQgaG9sZCBvZiB0aGUgbWZ0IHJlY29yZCBmb3IgdGhlIGRpcmVjdG9yeS4gKi8KKwltID0gbWFwX21mdF9yZWNvcmQoZGlyX25pKTsKKwlpZiAoSVNfRVJSKG0pKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJtYXBfbWZ0X3JlY29yZCgpIGZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJWxkLiIsCisJCQkJLVBUUl9FUlIobSkpOworCQlyZXR1cm4gRVJSX01SRUYoUFRSX0VSUihtKSk7CisJfQorCWN0eCA9IG50ZnNfYXR0cl9nZXRfc2VhcmNoX2N0eChkaXJfbmksIG0pOworCWlmICghY3R4KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX291dDsKKwl9CisJLyogRmluZCB0aGUgaW5kZXggcm9vdCBhdHRyaWJ1dGUgaW4gdGhlIG1mdCByZWNvcmQuICovCisJZXJyID0gbnRmc19hdHRyX2xvb2t1cChBVF9JTkRFWF9ST09ULCBJMzAsIDQsIENBU0VfU0VOU0lUSVZFLCAwLCBOVUxMLAorCQkJMCwgY3R4KTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQlpZiAoZXJyID09IC1FTk9FTlQpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICJJbmRleCByb290IGF0dHJpYnV0ZSBtaXNzaW5nIGluICIKKwkJCQkJImRpcmVjdG9yeSBpbm9kZSAweCVseC4iLAorCQkJCQlkaXJfbmktPm1mdF9ubyk7CisJCQllcnIgPSAtRUlPOworCQl9CisJCWdvdG8gZXJyX291dDsKKwl9CisJLyogR2V0IHRvIHRoZSBpbmRleCByb290IHZhbHVlIChpdCdzIGJlZW4gdmVyaWZpZWQgaW4gcmVhZF9pbm9kZSkuICovCisJaXIgPSAoSU5ERVhfUk9PVCopKCh1OCopY3R4LT5hdHRyICsKKwkJCWxlMTZfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpKTsKKwlpbmRleF9lbmQgPSAodTgqKSZpci0+aW5kZXggKyBsZTMyX3RvX2NwdShpci0+aW5kZXguaW5kZXhfbGVuZ3RoKTsKKwkvKiBUaGUgZmlyc3QgaW5kZXggZW50cnkuICovCisJaWUgPSAoSU5ERVhfRU5UUlkqKSgodTgqKSZpci0+aW5kZXggKworCQkJbGUzMl90b19jcHUoaXItPmluZGV4LmVudHJpZXNfb2Zmc2V0KSk7CisJLyoKKwkgKiBMb29wIHVudGlsIHdlIGV4Y2VlZCB2YWxpZCBtZW1vcnkgKGNvcnJ1cHRpb24gY2FzZSkgb3IgdW50aWwgd2UKKwkgKiByZWFjaCB0aGUgbGFzdCBlbnRyeS4KKwkgKi8KKwlmb3IgKDs7IGllID0gKElOREVYX0VOVFJZKikoKHU4KilpZSArIGxlMTZfdG9fY3B1KGllLT5sZW5ndGgpKSkgeworCQkvKiBCb3VuZHMgY2hlY2tzLiAqLworCQlpZiAoKHU4KilpZSA8ICh1OCopY3R4LT5tcmVjIHx8ICh1OCopaWUgKworCQkJCXNpemVvZihJTkRFWF9FTlRSWV9IRUFERVIpID4gaW5kZXhfZW5kIHx8CisJCQkJKHU4KilpZSArIGxlMTZfdG9fY3B1KGllLT5rZXlfbGVuZ3RoKSA+CisJCQkJaW5kZXhfZW5kKQorCQkJZ290byBkaXJfZXJyX291dDsKKwkJLyoKKwkJICogVGhlIGxhc3QgZW50cnkgY2Fubm90IGNvbnRhaW4gYSBuYW1lLiBJdCBjYW4gaG93ZXZlciBjb250YWluCisJCSAqIGEgcG9pbnRlciB0byBhIGNoaWxkIG5vZGUgaW4gdGhlIEIrdHJlZSBzbyB3ZSBqdXN0IGJyZWFrIG91dC4KKwkJICovCisJCWlmIChpZS0+ZmxhZ3MgJiBJTkRFWF9FTlRSWV9FTkQpCisJCQlicmVhazsKKwkJLyoKKwkJICogSWYgdGhlIGN1cnJlbnQgZW50cnkgaGFzIGEgbmFtZSB0eXBlIG9mIFBPU0lYLCB0aGUgbmFtZSBpcworCQkgKiBjYXNlIHNlbnNpdGl2ZSBhbmQgbm90IG90aGVyd2lzZS4gVGhpcyBoYXMgdGhlIGVmZmVjdCBvZiB1cworCQkgKiBub3QgYmVpbmcgYWJsZSB0byBhY2Nlc3MgYW55IFBPU0lYIGZpbGUgbmFtZXMgd2hpY2ggY29sbGF0ZQorCQkgKiBhZnRlciB0aGUgbm9uLVBPU0lYIG9uZSB3aGVuIHRoZXkgb25seSBkaWZmZXIgaW4gY2FzZSwgYnV0CisJCSAqIGFueW9uZSBkb2luZyBzY3Jld3kgc3R1ZmYgbGlrZSB0aGF0IGRlc2VydmVzIHRvIGJ1cm4gaW4KKwkJICogaGVsbC4uLiBEb2luZyB0aGF0IGtpbmQgb2Ygc3R1ZmYgb24gTlQ0IGFjdHVhbGx5IGNhdXNlcworCQkgKiBjb3JydXB0aW9uIG9uIHRoZSBwYXJ0aXRpb24gZXZlbiB3aGVuIHVzaW5nIFNQNmEgYW5kIExpbnV4CisJCSAqIGlzIG5vdCBpbnZvbHZlZCBhdCBhbGwuCisJCSAqLworCQlpYyA9IGllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV90eXBlID8gSUdOT1JFX0NBU0UgOgorCQkJCUNBU0VfU0VOU0lUSVZFOworCQkvKgorCQkgKiBJZiB0aGUgbmFtZXMgbWF0Y2ggcGVyZmVjdGx5LCB3ZSBhcmUgZG9uZSBhbmQgcmV0dXJuIHRoZQorCQkgKiBtZnQgcmVmZXJlbmNlIG9mIHRoZSBpbm9kZSAoaS5lLiB0aGUgaW5vZGUgbnVtYmVyIHRvZ2V0aGVyCisJCSAqIHdpdGggdGhlIHNlcXVlbmNlIG51bWJlciBmb3IgY29uc2lzdGVuY3kgY2hlY2tpbmcuIFdlCisJCSAqIGNvbnZlcnQgaXQgdG8gY3B1IGZvcm1hdCBiZWZvcmUgcmV0dXJuaW5nLgorCQkgKi8KKwkJaWYgKG50ZnNfYXJlX25hbWVzX2VxdWFsKHVuYW1lLCB1bmFtZV9sZW4sCisJCQkJKG50ZnNjaGFyKikmaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lLAorCQkJCWllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV9sZW5ndGgsIGljLAorCQkJCXZvbC0+dXBjYXNlLCB2b2wtPnVwY2FzZV9sZW4pKSB7Citmb3VuZF9pdDoKKwkJCW1yZWYgPSBsZTY0X3RvX2NwdShpZS0+ZGF0YS5kaXIuaW5kZXhlZF9maWxlKTsKKwkJCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCQkJdW5tYXBfbWZ0X3JlY29yZChkaXJfbmkpOworCQkJcmV0dXJuIG1yZWY7CisJCX0KKwkJLyoKKwkJICogTm90IGEgcGVyZmVjdCBtYXRjaCwgbmVlZCB0byBkbyBmdWxsIGJsb3duIGNvbGxhdGlvbiBzbyB3ZQorCQkgKiBrbm93IHdoaWNoIHdheSBpbiB0aGUgQit0cmVlIHdlIGhhdmUgdG8gZ28uCisJCSAqLworCQlyYyA9IG50ZnNfY29sbGF0ZV9uYW1lcyh1bmFtZSwgdW5hbWVfbGVuLAorCQkJCShudGZzY2hhciopJmllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZSwKKwkJCQlpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWVfbGVuZ3RoLCAxLAorCQkJCUlHTk9SRV9DQVNFLCB2b2wtPnVwY2FzZSwgdm9sLT51cGNhc2VfbGVuKTsKKwkJLyoKKwkJICogSWYgdW5hbWUgY29sbGF0ZXMgYmVmb3JlIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGVudHJ5LCB0aGVyZQorCQkgKiBpcyBkZWZpbml0ZWx5IG5vIHN1Y2ggbmFtZSBpbiB0aGlzIGluZGV4IGJ1dCB3ZSBtaWdodCBuZWVkIHRvCisJCSAqIGRlc2NlbmQgaW50byB0aGUgQit0cmVlIHNvIHdlIGp1c3QgYnJlYWsgb3V0IG9mIHRoZSBsb29wLgorCQkgKi8KKwkJaWYgKHJjID09IC0xKQorCQkJYnJlYWs7CisJCS8qIFRoZSBuYW1lcyBhcmUgbm90IGVxdWFsLCBjb250aW51ZSB0aGUgc2VhcmNoLiAqLworCQlpZiAocmMpCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogTmFtZXMgbWF0Y2ggd2l0aCBjYXNlIGluc2Vuc2l0aXZlIGNvbXBhcmlzb24sIG5vdyB0cnkgdGhlCisJCSAqIGNhc2Ugc2Vuc2l0aXZlIGNvbXBhcmlzb24sIHdoaWNoIGlzIHJlcXVpcmVkIGZvciBwcm9wZXIKKwkJICogY29sbGF0aW9uLgorCQkgKi8KKwkJcmMgPSBudGZzX2NvbGxhdGVfbmFtZXModW5hbWUsIHVuYW1lX2xlbiwKKwkJCQkobnRmc2NoYXIqKSZpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWUsCisJCQkJaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lX2xlbmd0aCwgMSwKKwkJCQlDQVNFX1NFTlNJVElWRSwgdm9sLT51cGNhc2UsIHZvbC0+dXBjYXNlX2xlbik7CisJCWlmIChyYyA9PSAtMSkKKwkJCWJyZWFrOworCQlpZiAocmMpCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogUGVyZmVjdCBtYXRjaCwgdGhpcyB3aWxsIG5ldmVyIGhhcHBlbiBhcyB0aGUKKwkJICogbnRmc19hcmVfbmFtZXNfZXF1YWwoKSBjYWxsIHdpbGwgaGF2ZSBnb3R0ZW4gYSBtYXRjaCBidXQgd2UKKwkJICogc3RpbGwgdHJlYXQgaXQgY29ycmVjdGx5LgorCQkgKi8KKwkJZ290byBmb3VuZF9pdDsKKwl9CisJLyoKKwkgKiBXZSBoYXZlIGZpbmlzaGVkIHdpdGggdGhpcyBpbmRleCB3aXRob3V0IHN1Y2Nlc3MuIENoZWNrIGZvciB0aGUKKwkgKiBwcmVzZW5jZSBvZiBhIGNoaWxkIG5vZGUuCisJICovCisJaWYgKCEoaWUtPmZsYWdzICYgSU5ERVhfRU5UUllfTk9ERSkpIHsKKwkJLyogTm8gY2hpbGQgbm9kZSwgcmV0dXJuIC1FTk9FTlQuICovCisJCWVyciA9IC1FTk9FTlQ7CisJCWdvdG8gZXJyX291dDsKKwl9IC8qIENoaWxkIG5vZGUgcHJlc2VudCwgZGVzY2VuZCBpbnRvIGl0LiAqLworCS8qIENvbnNpc3RlbmN5IGNoZWNrOiBWZXJpZnkgdGhhdCBhbiBpbmRleCBhbGxvY2F0aW9uIGV4aXN0cy4gKi8KKwlpZiAoIU5Jbm9JbmRleEFsbG9jUHJlc2VudChkaXJfbmkpKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJObyBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZSBidXQgaW5kZXggZW50cnkgIgorCQkJCSJyZXF1aXJlcyBvbmUuIERpcmVjdG9yeSBpbm9kZSAweCVseCBpcyAiCisJCQkJImNvcnJ1cHQgb3IgZHJpdmVyIGJ1Zy4iLCBkaXJfbmktPm1mdF9ubyk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJLyogR2V0IHRoZSBzdGFydGluZyB2Y24gb2YgdGhlIGluZGV4X2Jsb2NrIGhvbGRpbmcgdGhlIGNoaWxkIG5vZGUuICovCisJdmNuID0gc2xlNjRfdG9fY3B1cCgodTgqKWllICsgbGUxNl90b19jcHUoaWUtPmxlbmd0aCkgLSA4KTsKKwlpYV9tYXBwaW5nID0gVkZTX0koZGlyX25pKS0+aV9tYXBwaW5nOworCS8qCisJICogV2UgYXJlIGRvbmUgd2l0aCB0aGUgaW5kZXggcm9vdCBhbmQgdGhlIG1mdCByZWNvcmQuIFJlbGVhc2UgdGhlbSwKKwkgKiBvdGhlcndpc2Ugd2UgZGVhZGxvY2sgd2l0aCBudGZzX21hcF9wYWdlKCkuCisJICovCisJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJdW5tYXBfbWZ0X3JlY29yZChkaXJfbmkpOworCW0gPSBOVUxMOworCWN0eCA9IE5VTEw7CitkZXNjZW5kX2ludG9fY2hpbGRfbm9kZToKKwkvKgorCSAqIENvbnZlcnQgdmNuIHRvIGluZGV4IGludG8gdGhlIGluZGV4IGFsbG9jYXRpb24gYXR0cmlidXRlIGluIHVuaXRzCisJICogb2YgUEFHRV9DQUNIRV9TSVpFIGFuZCBtYXAgdGhlIHBhZ2UgY2FjaGUgcGFnZSwgcmVhZGluZyBpdCBmcm9tCisJICogZGlzayBpZiBuZWNlc3NhcnkuCisJICovCisJcGFnZSA9IG50ZnNfbWFwX3BhZ2UoaWFfbWFwcGluZywgdmNuIDw8CisJCQlkaXJfbmktPml0eXBlLmluZGV4LnZjbl9zaXplX2JpdHMgPj4gUEFHRV9DQUNIRV9TSElGVCk7CisJaWYgKElTX0VSUihwYWdlKSkgeworCQludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIG1hcCBkaXJlY3RvcnkgaW5kZXggcGFnZSwgZXJyb3IgJWxkLiIsCisJCQkJLVBUUl9FUlIocGFnZSkpOworCQllcnIgPSBQVFJfRVJSKHBhZ2UpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWxvY2tfcGFnZShwYWdlKTsKKwlrYWRkciA9ICh1OCopcGFnZV9hZGRyZXNzKHBhZ2UpOworZmFzdF9kZXNjZW5kX2ludG9fY2hpbGRfbm9kZToKKwkvKiBHZXQgdG8gdGhlIGluZGV4IGFsbG9jYXRpb24gYmxvY2suICovCisJaWEgPSAoSU5ERVhfQUxMT0NBVElPTiopKGthZGRyICsgKCh2Y24gPDwKKwkJCWRpcl9uaS0+aXR5cGUuaW5kZXgudmNuX3NpemVfYml0cykgJiB+UEFHRV9DQUNIRV9NQVNLKSk7CisJLyogQm91bmRzIGNoZWNrcy4gKi8KKwlpZiAoKHU4KilpYSA8IGthZGRyIHx8ICh1OCopaWEgPiBrYWRkciArIFBBR0VfQ0FDSEVfU0laRSkgeworCQludGZzX2Vycm9yKHNiLCAiT3V0IG9mIGJvdW5kcyBjaGVjayBmYWlsZWQuIENvcnJ1cHQgZGlyZWN0b3J5ICIKKwkJCQkiaW5vZGUgMHglbHggb3IgZHJpdmVyIGJ1Zy4iLCBkaXJfbmktPm1mdF9ubyk7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCS8qIENhdGNoIG11bHRpIHNlY3RvciB0cmFuc2ZlciBmaXh1cCBlcnJvcnMuICovCisJaWYgKHVubGlrZWx5KCFudGZzX2lzX2luZHhfcmVjb3JkKGlhLT5tYWdpYykpKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJEaXJlY3RvcnkgaW5kZXggcmVjb3JkIHdpdGggdmNuIDB4JWxseCBpcyAiCisJCQkJImNvcnJ1cHQuICBDb3JydXB0IGlub2RlIDB4JWx4LiAgUnVuIGNoa2Rzay4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdmNuLCBkaXJfbmktPm1mdF9ubyk7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCWlmIChzbGU2NF90b19jcHUoaWEtPmluZGV4X2Jsb2NrX3ZjbikgIT0gdmNuKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJBY3R1YWwgVkNOICgweCVsbHgpIG9mIGluZGV4IGJ1ZmZlciBpcyAiCisJCQkJImRpZmZlcmVudCBmcm9tIGV4cGVjdGVkIFZDTiAoMHglbGx4KS4gIgorCQkJCSJEaXJlY3RvcnkgaW5vZGUgMHglbHggaXMgY29ycnVwdCBvciBkcml2ZXIgIgorCQkJCSJidWcuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQlzbGU2NF90b19jcHUoaWEtPmluZGV4X2Jsb2NrX3ZjbiksCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2Y24sIGRpcl9uaS0+bWZ0X25vKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJaWYgKGxlMzJfdG9fY3B1KGlhLT5pbmRleC5hbGxvY2F0ZWRfc2l6ZSkgKyAweDE4ICE9CisJCQlkaXJfbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUpIHsKKwkJbnRmc19lcnJvcihzYiwgIkluZGV4IGJ1ZmZlciAoVkNOIDB4JWxseCkgb2YgZGlyZWN0b3J5IGlub2RlICIKKwkJCQkiMHglbHggaGFzIGEgc2l6ZSAoJXUpIGRpZmZlcmluZyBmcm9tIHRoZSAiCisJCQkJImRpcmVjdG9yeSBzcGVjaWZpZWQgc2l6ZSAoJXUpLiBEaXJlY3RvcnkgIgorCQkJCSJpbm9kZSBpcyBjb3JydXB0IG9yIGRyaXZlciBidWcuIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXZjbiwgZGlyX25pLT5tZnRfbm8sCisJCQkJbGUzMl90b19jcHUoaWEtPmluZGV4LmFsbG9jYXRlZF9zaXplKSArIDB4MTgsCisJCQkJZGlyX25pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJaW5kZXhfZW5kID0gKHU4KilpYSArIGRpcl9uaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZTsKKwlpZiAoaW5kZXhfZW5kID4ga2FkZHIgKyBQQUdFX0NBQ0hFX1NJWkUpIHsKKwkJbnRmc19lcnJvcihzYiwgIkluZGV4IGJ1ZmZlciAoVkNOIDB4JWxseCkgb2YgZGlyZWN0b3J5IGlub2RlICIKKwkJCQkiMHglbHggY3Jvc3NlcyBwYWdlIGJvdW5kYXJ5LiBJbXBvc3NpYmxlISAiCisJCQkJIkNhbm5vdCBhY2Nlc3MhIFRoaXMgaXMgcHJvYmFibHkgYSBidWcgaW4gdGhlICIKKwkJCQkiZHJpdmVyLiIsICh1bnNpZ25lZCBsb25nIGxvbmcpdmNuLAorCQkJCWRpcl9uaS0+bWZ0X25vKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJaW5kZXhfZW5kID0gKHU4KikmaWEtPmluZGV4ICsgbGUzMl90b19jcHUoaWEtPmluZGV4LmluZGV4X2xlbmd0aCk7CisJaWYgKGluZGV4X2VuZCA+ICh1OCopaWEgKyBkaXJfbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUpIHsKKwkJbnRmc19lcnJvcihzYiwgIlNpemUgb2YgaW5kZXggYnVmZmVyIChWQ04gMHglbGx4KSBvZiBkaXJlY3RvcnkgIgorCQkJCSJpbm9kZSAweCVseCBleGNlZWRzIG1heGltdW0gc2l6ZS4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdmNuLCBkaXJfbmktPm1mdF9ubyk7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCS8qIFRoZSBmaXJzdCBpbmRleCBlbnRyeS4gKi8KKwlpZSA9IChJTkRFWF9FTlRSWSopKCh1OCopJmlhLT5pbmRleCArCisJCQlsZTMyX3RvX2NwdShpYS0+aW5kZXguZW50cmllc19vZmZzZXQpKTsKKwkvKgorCSAqIEl0ZXJhdGUgc2ltaWxhciB0byBhYm92ZSBiaWcgbG9vcCBidXQgYXBwbGllZCB0byBpbmRleCBidWZmZXIsIHRodXMKKwkgKiBsb29wIHVudGlsIHdlIGV4Y2VlZCB2YWxpZCBtZW1vcnkgKGNvcnJ1cHRpb24gY2FzZSkgb3IgdW50aWwgd2UKKwkgKiByZWFjaCB0aGUgbGFzdCBlbnRyeS4KKwkgKi8KKwlmb3IgKDs7IGllID0gKElOREVYX0VOVFJZKikoKHU4KilpZSArIGxlMTZfdG9fY3B1KGllLT5sZW5ndGgpKSkgeworCQkvKiBCb3VuZHMgY2hlY2suICovCisJCWlmICgodTgqKWllIDwgKHU4KilpYSB8fCAodTgqKWllICsKKwkJCQlzaXplb2YoSU5ERVhfRU5UUllfSEVBREVSKSA+IGluZGV4X2VuZCB8fAorCQkJCSh1OCopaWUgKyBsZTE2X3RvX2NwdShpZS0+a2V5X2xlbmd0aCkgPgorCQkJCWluZGV4X2VuZCkgeworCQkJbnRmc19lcnJvcihzYiwgIkluZGV4IGVudHJ5IG91dCBvZiBib3VuZHMgaW4gIgorCQkJCQkiZGlyZWN0b3J5IGlub2RlIDB4JWx4LiIsCisJCQkJCWRpcl9uaS0+bWZ0X25vKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJLyoKKwkJICogVGhlIGxhc3QgZW50cnkgY2Fubm90IGNvbnRhaW4gYSBuYW1lLiBJdCBjYW4gaG93ZXZlciBjb250YWluCisJCSAqIGEgcG9pbnRlciB0byBhIGNoaWxkIG5vZGUgaW4gdGhlIEIrdHJlZSBzbyB3ZSBqdXN0IGJyZWFrIG91dC4KKwkJICovCisJCWlmIChpZS0+ZmxhZ3MgJiBJTkRFWF9FTlRSWV9FTkQpCisJCQlicmVhazsKKwkJLyoKKwkJICogSWYgdGhlIGN1cnJlbnQgZW50cnkgaGFzIGEgbmFtZSB0eXBlIG9mIFBPU0lYLCB0aGUgbmFtZSBpcworCQkgKiBjYXNlIHNlbnNpdGl2ZSBhbmQgbm90IG90aGVyd2lzZS4gVGhpcyBoYXMgdGhlIGVmZmVjdCBvZiB1cworCQkgKiBub3QgYmVpbmcgYWJsZSB0byBhY2Nlc3MgYW55IFBPU0lYIGZpbGUgbmFtZXMgd2hpY2ggY29sbGF0ZQorCQkgKiBhZnRlciB0aGUgbm9uLVBPU0lYIG9uZSB3aGVuIHRoZXkgb25seSBkaWZmZXIgaW4gY2FzZSwgYnV0CisJCSAqIGFueW9uZSBkb2luZyBzY3Jld3kgc3R1ZmYgbGlrZSB0aGF0IGRlc2VydmVzIHRvIGJ1cm4gaW4KKwkJICogaGVsbC4uLiBEb2luZyB0aGF0IGtpbmQgb2Ygc3R1ZmYgb24gTlQ0IGFjdHVhbGx5IGNhdXNlcworCQkgKiBjb3JydXB0aW9uIG9uIHRoZSBwYXJ0aXRpb24gZXZlbiB3aGVuIHVzaW5nIFNQNmEgYW5kIExpbnV4CisJCSAqIGlzIG5vdCBpbnZvbHZlZCBhdCBhbGwuCisJCSAqLworCQlpYyA9IGllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV90eXBlID8gSUdOT1JFX0NBU0UgOgorCQkJCUNBU0VfU0VOU0lUSVZFOworCQkvKgorCQkgKiBJZiB0aGUgbmFtZXMgbWF0Y2ggcGVyZmVjdGx5LCB3ZSBhcmUgZG9uZSBhbmQgcmV0dXJuIHRoZQorCQkgKiBtZnQgcmVmZXJlbmNlIG9mIHRoZSBpbm9kZSAoaS5lLiB0aGUgaW5vZGUgbnVtYmVyIHRvZ2V0aGVyCisJCSAqIHdpdGggdGhlIHNlcXVlbmNlIG51bWJlciBmb3IgY29uc2lzdGVuY3kgY2hlY2tpbmcuIFdlCisJCSAqIGNvbnZlcnQgaXQgdG8gY3B1IGZvcm1hdCBiZWZvcmUgcmV0dXJuaW5nLgorCQkgKi8KKwkJaWYgKG50ZnNfYXJlX25hbWVzX2VxdWFsKHVuYW1lLCB1bmFtZV9sZW4sCisJCQkJKG50ZnNjaGFyKikmaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lLAorCQkJCWllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV9sZW5ndGgsIGljLAorCQkJCXZvbC0+dXBjYXNlLCB2b2wtPnVwY2FzZV9sZW4pKSB7Citmb3VuZF9pdDI6CisJCQltcmVmID0gbGU2NF90b19jcHUoaWUtPmRhdGEuZGlyLmluZGV4ZWRfZmlsZSk7CisJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwkJCXJldHVybiBtcmVmOworCQl9CisJCS8qCisJCSAqIE5vdCBhIHBlcmZlY3QgbWF0Y2gsIG5lZWQgdG8gZG8gZnVsbCBibG93biBjb2xsYXRpb24gc28gd2UKKwkJICoga25vdyB3aGljaCB3YXkgaW4gdGhlIEIrdHJlZSB3ZSBoYXZlIHRvIGdvLgorCQkgKi8KKwkJcmMgPSBudGZzX2NvbGxhdGVfbmFtZXModW5hbWUsIHVuYW1lX2xlbiwKKwkJCQkobnRmc2NoYXIqKSZpZS0+a2V5LmZpbGVfbmFtZS5maWxlX25hbWUsCisJCQkJaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lX2xlbmd0aCwgMSwKKwkJCQlJR05PUkVfQ0FTRSwgdm9sLT51cGNhc2UsIHZvbC0+dXBjYXNlX2xlbik7CisJCS8qCisJCSAqIElmIHVuYW1lIGNvbGxhdGVzIGJlZm9yZSB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBlbnRyeSwgdGhlcmUKKwkJICogaXMgZGVmaW5pdGVseSBubyBzdWNoIG5hbWUgaW4gdGhpcyBpbmRleCBidXQgd2UgbWlnaHQgbmVlZCB0bworCQkgKiBkZXNjZW5kIGludG8gdGhlIEIrdHJlZSBzbyB3ZSBqdXN0IGJyZWFrIG91dCBvZiB0aGUgbG9vcC4KKwkJICovCisJCWlmIChyYyA9PSAtMSkKKwkJCWJyZWFrOworCQkvKiBUaGUgbmFtZXMgYXJlIG5vdCBlcXVhbCwgY29udGludWUgdGhlIHNlYXJjaC4gKi8KKwkJaWYgKHJjKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIE5hbWVzIG1hdGNoIHdpdGggY2FzZSBpbnNlbnNpdGl2ZSBjb21wYXJpc29uLCBub3cgdHJ5IHRoZQorCQkgKiBjYXNlIHNlbnNpdGl2ZSBjb21wYXJpc29uLCB3aGljaCBpcyByZXF1aXJlZCBmb3IgcHJvcGVyCisJCSAqIGNvbGxhdGlvbi4KKwkJICovCisJCXJjID0gbnRmc19jb2xsYXRlX25hbWVzKHVuYW1lLCB1bmFtZV9sZW4sCisJCQkJKG50ZnNjaGFyKikmaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lLAorCQkJCWllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV9sZW5ndGgsIDEsCisJCQkJQ0FTRV9TRU5TSVRJVkUsIHZvbC0+dXBjYXNlLCB2b2wtPnVwY2FzZV9sZW4pOworCQlpZiAocmMgPT0gLTEpCisJCQlicmVhazsKKwkJaWYgKHJjKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIFBlcmZlY3QgbWF0Y2gsIHRoaXMgd2lsbCBuZXZlciBoYXBwZW4gYXMgdGhlCisJCSAqIG50ZnNfYXJlX25hbWVzX2VxdWFsKCkgY2FsbCB3aWxsIGhhdmUgZ290dGVuIGEgbWF0Y2ggYnV0IHdlCisJCSAqIHN0aWxsIHRyZWF0IGl0IGNvcnJlY3RseS4KKwkJICovCisJCWdvdG8gZm91bmRfaXQyOworCX0KKwkvKgorCSAqIFdlIGhhdmUgZmluaXNoZWQgd2l0aCB0aGlzIGluZGV4IGJ1ZmZlciB3aXRob3V0IHN1Y2Nlc3MuIENoZWNrIGZvcgorCSAqIHRoZSBwcmVzZW5jZSBvZiBhIGNoaWxkIG5vZGUuCisJICovCisJaWYgKGllLT5mbGFncyAmIElOREVYX0VOVFJZX05PREUpIHsKKwkJaWYgKChpYS0+aW5kZXguZmxhZ3MgJiBOT0RFX01BU0spID09IExFQUZfTk9ERSkgeworCQkJbnRmc19lcnJvcihzYiwgIkluZGV4IGVudHJ5IHdpdGggY2hpbGQgbm9kZSBmb3VuZCBpbiAiCisJCQkJCSJhIGxlYWYgbm9kZSBpbiBkaXJlY3RvcnkgaW5vZGUgMHglbHguIiwKKwkJCQkJZGlyX25pLT5tZnRfbm8pOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQkvKiBDaGlsZCBub2RlIHByZXNlbnQsIGRlc2NlbmQgaW50byBpdC4gKi8KKwkJb2xkX3ZjbiA9IHZjbjsKKwkJdmNuID0gc2xlNjRfdG9fY3B1cCgodTgqKWllICsgbGUxNl90b19jcHUoaWUtPmxlbmd0aCkgLSA4KTsKKwkJaWYgKHZjbiA+PSAwKSB7CisJCQkvKiBJZiB2Y24gaXMgaW4gdGhlIHNhbWUgcGFnZSBjYWNoZSBwYWdlIGFzIG9sZF92Y24gd2UKKwkJCSAqIHJlY3ljbGUgdGhlIG1hcHBlZCBwYWdlLiAqLworCQkJaWYgKG9sZF92Y24gPDwgdm9sLT5jbHVzdGVyX3NpemVfYml0cyA+PgorCQkJCQlQQUdFX0NBQ0hFX1NISUZUID09IHZjbiA8PAorCQkJCQl2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzID4+CisJCQkJCVBBR0VfQ0FDSEVfU0hJRlQpCisJCQkJZ290byBmYXN0X2Rlc2NlbmRfaW50b19jaGlsZF9ub2RlOworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJCQlnb3RvIGRlc2NlbmRfaW50b19jaGlsZF9ub2RlOworCQl9CisJCW50ZnNfZXJyb3Ioc2IsICJOZWdhdGl2ZSBjaGlsZCBub2RlIHZjbiBpbiBkaXJlY3RvcnkgaW5vZGUgIgorCQkJCSIweCVseC4iLCBkaXJfbmktPm1mdF9ubyk7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCS8qIE5vIGNoaWxkIG5vZGUsIHJldHVybiAtRU5PRU5ULiAqLworCW50ZnNfZGVidWcoIkVudHJ5IG5vdCBmb3VuZC4iKTsKKwllcnIgPSAtRU5PRU5UOwordW5tX2Vycl9vdXQ6CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworZXJyX291dDoKKwlpZiAoIWVycikKKwkJZXJyID0gLUVJTzsKKwlpZiAoY3R4KQorCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwlpZiAobSkKKwkJdW5tYXBfbWZ0X3JlY29yZChkaXJfbmkpOworCXJldHVybiBFUlJfTVJFRihlcnIpOworZGlyX2Vycl9vdXQ6CisJbnRmc19lcnJvcihzYiwgIkNvcnJ1cHQgZGlyZWN0b3J5LiBBYm9ydGluZyBsb29rdXAuIik7CisJZ290byBlcnJfb3V0OworfQorCisjZW5kaWYKKworLyoqCisgKiBudGZzX2ZpbGxkaXIgLSBudGZzIHNwZWNpZmljIGZpbGxkaXIgbWV0aG9kCisgKiBAdm9sOgljdXJyZW50IG50ZnMgdm9sdW1lCisgKiBAZnBvczoJcG9zaXRpb24gaW4gdGhlIGRpcmVjdG9yeQorICogQG5kaXI6CW50ZnMgaW5vZGUgb2YgY3VycmVudCBkaXJlY3RvcnkKKyAqIEBpYV9wYWdlOglwYWdlIGluIHdoaWNoIHRoZSBpbmRleCBhbGxvY2F0aW9uIGJ1ZmZlciBAaWUgaXMgaW4gcmVzaWRlcworICogQGllOgkJY3VycmVudCBpbmRleCBlbnRyeQorICogQG5hbWU6CWJ1ZmZlciB0byB1c2UgZm9yIHRoZSBjb252ZXJ0ZWQgbmFtZQorICogQGRpcmVudDoJdmZzIGZpbGxkaXIgY2FsbGJhY2sgY29udGV4dAorICogQGZpbGxkaXI6CXZmcyBmaWxsZGlyIGNhbGxiYWNrCisgKgorICogQ29udmVydCB0aGUgVW5pY29kZSBAbmFtZSB0byB0aGUgbG9hZGVkIE5MUyBhbmQgcGFzcyBpdCB0byB0aGUgQGZpbGxkaXIKKyAqIGNhbGxiYWNrLgorICoKKyAqIElmIEBpYV9wYWdlIGlzIG5vdCBOVUxMIGl0IGlzIHRoZSBsb2NrZWQgcGFnZSBjb250YWluaW5nIHRoZSBpbmRleAorICogYWxsb2NhdGlvbiBibG9jayBjb250YWluaW5nIHRoZSBpbmRleCBlbnRyeSBAaWUuCisgKgorICogTm90ZSwgd2UgZHJvcCAoYW5kIHRoZW4gcmVhY3F1aXJlKSB0aGUgcGFnZSBsb2NrIG9uIEBpYV9wYWdlIGFjcm9zcyB0aGUKKyAqIEBmaWxsZGlyKCkgY2FsbCBvdGhlcndpc2Ugd2Ugd291bGQgZGVhZGxvY2sgd2l0aCBORlNkIHdoZW4gaXQgY2FsbHMgLT5sb29rdXAKKyAqIHNpbmNlIG50ZnNfbG9va3VwKCkgd2lsbCBsb2NrIHRoZSBzYW1lIHBhZ2UuICBBcyBhbiBvcHRpbWl6YXRpb24sIHdlIGRvIG5vdAorICogcmV0YWtlIHRoZSBsb2NrIGlmIHdlIGFyZSByZXR1cm5pbmcgYSBub24temVybyB2YWx1ZSBhcyBudGZzX3JlYWRkaXIoKQorICogd291bGQgbmVlZCB0byBkcm9wIHRoZSBsb2NrIGltbWVkaWF0ZWx5IGFueXdheS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbnRmc19maWxsZGlyKG50ZnNfdm9sdW1lICp2b2wsIGxvZmZfdCBmcG9zLAorCQludGZzX2lub2RlICpuZGlyLCBzdHJ1Y3QgcGFnZSAqaWFfcGFnZSwgSU5ERVhfRU5UUlkgKmllLAorCQl1OCAqbmFtZSwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwl1bnNpZ25lZCBsb25nIG1yZWY7CisJaW50IG5hbWVfbGVuLCByYzsKKwl1bnNpZ25lZCBkdF90eXBlOworCUZJTEVfTkFNRV9UWVBFX0ZMQUdTIG5hbWVfdHlwZTsKKworCW5hbWVfdHlwZSA9IGllLT5rZXkuZmlsZV9uYW1lLmZpbGVfbmFtZV90eXBlOworCWlmIChuYW1lX3R5cGUgPT0gRklMRV9OQU1FX0RPUykgeworCQludGZzX2RlYnVnKCJTa2lwcGluZyBET1MgbmFtZSBzcGFjZSBlbnRyeS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChNUkVGX0xFKGllLT5kYXRhLmRpci5pbmRleGVkX2ZpbGUpID09IEZJTEVfcm9vdCkgeworCQludGZzX2RlYnVnKCJTa2lwcGluZyByb290IGRpcmVjdG9yeSBzZWxmIHJlZmVyZW5jZSBlbnRyeS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChNUkVGX0xFKGllLT5kYXRhLmRpci5pbmRleGVkX2ZpbGUpIDwgRklMRV9maXJzdF91c2VyICYmCisJCQkhTlZvbFNob3dTeXN0ZW1GaWxlcyh2b2wpKSB7CisJCW50ZnNfZGVidWcoIlNraXBwaW5nIHN5c3RlbSBmaWxlLiIpOworCQlyZXR1cm4gMDsKKwl9CisJbmFtZV9sZW4gPSBudGZzX3Vjc3RvbmxzKHZvbCwgKG50ZnNjaGFyKikmaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lLAorCQkJaWUtPmtleS5maWxlX25hbWUuZmlsZV9uYW1lX2xlbmd0aCwgJm5hbWUsCisJCQlOVEZTX01BWF9OQU1FX0xFTiAqIE5MU19NQVhfQ0hBUlNFVF9TSVpFICsgMSk7CisJaWYgKG5hbWVfbGVuIDw9IDApIHsKKwkJbnRmc19kZWJ1ZygiU2tpcHBpbmcgdW5yZXByZXNlbnRhYmxlIGZpbGUuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAoaWUtPmtleS5maWxlX25hbWUuZmlsZV9hdHRyaWJ1dGVzICYKKwkJCUZJTEVfQVRUUl9EVVBfRklMRV9OQU1FX0lOREVYX1BSRVNFTlQpCisJCWR0X3R5cGUgPSBEVF9ESVI7CisJZWxzZQorCQlkdF90eXBlID0gRFRfUkVHOworCW1yZWYgPSBNUkVGX0xFKGllLT5kYXRhLmRpci5pbmRleGVkX2ZpbGUpOworCS8qCisJICogRHJvcCB0aGUgcGFnZSBsb2NrIG90aGVyd2lzZSB3ZSBkZWFkbG9jayB3aXRoIE5GUyB3aGVuIGl0IGNhbGxzCisJICogLT5sb29rdXAgc2luY2UgbnRmc19sb29rdXAoKSB3aWxsIGxvY2sgdGhlIHNhbWUgcGFnZS4KKwkgKi8KKwlpZiAoaWFfcGFnZSkKKwkJdW5sb2NrX3BhZ2UoaWFfcGFnZSk7CisJbnRmc19kZWJ1ZygiQ2FsbGluZyBmaWxsZGlyIGZvciAlcyB3aXRoIGxlbiAlaSwgZnBvcyAweCVsbHgsIGlub2RlICIKKwkJCSIweCVseCwgRFRfJXMuIiwgbmFtZSwgbmFtZV9sZW4sIGZwb3MsIG1yZWYsCisJCQlkdF90eXBlID09IERUX0RJUiA/ICJESVIiIDogIlJFRyIpOworCXJjID0gZmlsbGRpcihkaXJlbnQsIG5hbWUsIG5hbWVfbGVuLCBmcG9zLCBtcmVmLCBkdF90eXBlKTsKKwkvKiBSZWxvY2sgdGhlIHBhZ2UgYnV0IG5vdCBpZiB3ZSBhcmUgYWJvcnRpbmcgLT5yZWFkZGlyLiAqLworCWlmICghcmMgJiYgaWFfcGFnZSkKKwkJbG9ja19wYWdlKGlhX3BhZ2UpOworCXJldHVybiByYzsKK30KKworLyoKKyAqIFdlIHVzZSB0aGUgc2FtZSBiYXNpYyBhcHByb2FjaCBhcyB0aGUgb2xkIE5URlMgZHJpdmVyLCBpLmUuIHdlIHBhcnNlIHRoZQorICogaW5kZXggcm9vdCBlbnRyaWVzIGFuZCB0aGVuIHRoZSBpbmRleCBhbGxvY2F0aW9uIGVudHJpZXMgdGhhdCBhcmUgbWFya2VkCisgKiBhcyBpbiB1c2UgaW4gdGhlIGluZGV4IGJpdG1hcC4KKyAqCisgKiBXaGlsZSB0aGlzIHdpbGwgcmV0dXJuIHRoZSBuYW1lcyBpbiByYW5kb20gb3JkZXIgdGhpcyBkb2Vzbid0IG1hdHRlciBmb3IKKyAqIC0+cmVhZGRpciBidXQgT1RPSCByZXN1bHRzIGluIGEgZmFzdGVyIC0+cmVhZGRpci4KKyAqCisgKiBWRlMgY2FsbHMgLT5yZWFkZGlyIHdpdGhvdXQgQktMIGJ1dCB3aXRoIGlfc2VtIGhlbGQuIFRoaXMgcHJvdGVjdHMgdGhlIFZGUworICogcGFydHMgKGUuZy4gLT5mX3BvcyBhbmQgLT5pX3NpemUsIGFuZCBpdCBhbHNvIHByb3RlY3RzIGFnYWluc3QgZGlyZWN0b3J5CisgKiBtb2RpZmljYXRpb25zKS4KKyAqCisgKiBMb2NraW5nOiAgLSBDYWxsZXIgbXVzdCBob2xkIGlfc2VtIG9uIHRoZSBkaXJlY3RvcnkuCisgKgkgICAgIC0gRWFjaCBwYWdlIGNhY2hlIHBhZ2UgaW4gdGhlIGluZGV4IGFsbG9jYXRpb24gbWFwcGluZyBtdXN0IGJlCisgKgkgICAgICAgbG9ja2VkIHdoaWxzdCBiZWluZyBhY2Nlc3NlZCBvdGhlcndpc2Ugd2UgbWF5IGZpbmQgYSBjb3JydXB0CisgKgkgICAgICAgcGFnZSBkdWUgdG8gaXQgYmVpbmcgdW5kZXIgLT53cml0ZXBhZ2UgYXQgdGhlIG1vbWVudCB3aGljaAorICoJICAgICAgIGFwcGxpZXMgdGhlIG1zdCBwcm90ZWN0aW9uIGZpeHVwcyBiZWZvcmUgd3JpdGluZyBvdXQgYW5kIHRoZW4KKyAqCSAgICAgICByZW1vdmVzIHRoZW0gYWdhaW4gYWZ0ZXIgdGhlIHdyaXRlIGlzIGNvbXBsZXRlIGFmdGVyIHdoaWNoIGl0IAorICoJICAgICAgIHVubG9ja3MgdGhlIHBhZ2UuCisgKi8KK3N0YXRpYyBpbnQgbnRmc19yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCXM2NCBpYV9wb3MsIGlhX3N0YXJ0LCBwcmV2X2lhX3BvcywgYm1wX3BvczsKKwlsb2ZmX3QgZnBvczsKKwlzdHJ1Y3QgaW5vZGUgKmJtcF92aSwgKnZkaXIgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gdmRpci0+aV9zYjsKKwludGZzX2lub2RlICpuZGlyID0gTlRGU19JKHZkaXIpOworCW50ZnNfdm9sdW1lICp2b2wgPSBOVEZTX1NCKHNiKTsKKwlNRlRfUkVDT1JEICptOworCUlOREVYX1JPT1QgKmlyID0gTlVMTDsKKwlJTkRFWF9FTlRSWSAqaWU7CisJSU5ERVhfQUxMT0NBVElPTiAqaWE7CisJdTggKm5hbWUgPSBOVUxMOworCWludCByYywgZXJyLCBpcl9wb3MsIGN1cl9ibXBfcG9zOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICppYV9tYXBwaW5nLCAqYm1wX21hcHBpbmc7CisJc3RydWN0IHBhZ2UgKmJtcF9wYWdlID0gTlVMTCwgKmlhX3BhZ2UgPSBOVUxMOworCXU4ICprYWRkciwgKmJtcCwgKmluZGV4X2VuZDsKKwludGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4OworCisJZnBvcyA9IGZpbHAtPmZfcG9zOworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBpbm9kZSAweCVseCwgZnBvcyAweCVsbHguIiwKKwkJCXZkaXItPmlfaW5vLCBmcG9zKTsKKwlyYyA9IGVyciA9IDA7CisJLyogQXJlIHdlIGF0IGVuZCBvZiBkaXIgeWV0PyAqLworCWlmIChmcG9zID49IHZkaXItPmlfc2l6ZSArIHZvbC0+bWZ0X3JlY29yZF9zaXplKQorCQlnb3RvIGRvbmU7CisJLyogRW11bGF0ZSAuIGFuZCAuLiBmb3IgYWxsIGRpcmVjdG9yaWVzLiAqLworCWlmICghZnBvcykgeworCQludGZzX2RlYnVnKCJDYWxsaW5nIGZpbGxkaXIgZm9yIC4gd2l0aCBsZW4gMSwgZnBvcyAweDAsICIKKwkJCQkiaW5vZGUgMHglbHgsIERUX0RJUi4iLCB2ZGlyLT5pX2lubyk7CisJCXJjID0gZmlsbGRpcihkaXJlbnQsICIuIiwgMSwgZnBvcywgdmRpci0+aV9pbm8sIERUX0RJUik7CisJCWlmIChyYykKKwkJCWdvdG8gZG9uZTsKKwkJZnBvcysrOworCX0KKwlpZiAoZnBvcyA9PSAxKSB7CisJCW50ZnNfZGVidWcoIkNhbGxpbmcgZmlsbGRpciBmb3IgLi4gd2l0aCBsZW4gMiwgZnBvcyAweDEsICIKKwkJCQkiaW5vZGUgMHglbHgsIERUX0RJUi4iLAorCQkJCXBhcmVudF9pbm8oZmlscC0+Zl9kZW50cnkpKTsKKwkJcmMgPSBmaWxsZGlyKGRpcmVudCwgIi4uIiwgMiwgZnBvcywKKwkJCQlwYXJlbnRfaW5vKGZpbHAtPmZfZGVudHJ5KSwgRFRfRElSKTsKKwkJaWYgKHJjKQorCQkJZ290byBkb25lOworCQlmcG9zKys7CisJfQorCW0gPSBOVUxMOworCWN0eCA9IE5VTEw7CisJLyoKKwkgKiBBbGxvY2F0ZSBhIGJ1ZmZlciB0byBzdG9yZSB0aGUgY3VycmVudCBuYW1lIGJlaW5nIHByb2Nlc3NlZAorCSAqIGNvbnZlcnRlZCB0byBmb3JtYXQgZGV0ZXJtaW5lZCBieSBjdXJyZW50IE5MUy4KKwkgKi8KKwluYW1lID0gKHU4KilrbWFsbG9jKE5URlNfTUFYX05BTUVfTEVOICogTkxTX01BWF9DSEFSU0VUX1NJWkUgKyAxLAorCQkJR0ZQX05PRlMpOworCWlmICh1bmxpa2VseSghbmFtZSkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0OworCX0KKwkvKiBBcmUgd2UganVtcGluZyBzdHJhaWdodCBpbnRvIHRoZSBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZT8gKi8KKwlpZiAoZnBvcyA+PSB2b2wtPm1mdF9yZWNvcmRfc2l6ZSkKKwkJZ290byBza2lwX2luZGV4X3Jvb3Q7CisJLyogR2V0IGhvbGQgb2YgdGhlIG1mdCByZWNvcmQgZm9yIHRoZSBkaXJlY3RvcnkuICovCisJbSA9IG1hcF9tZnRfcmVjb3JkKG5kaXIpOworCWlmIChJU19FUlIobSkpIHsKKwkJZXJyID0gUFRSX0VSUihtKTsKKwkJbSA9IE5VTEw7CisJCWdvdG8gZXJyX291dDsKKwl9CisJY3R4ID0gbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4KG5kaXIsIG0pOworCWlmICh1bmxpa2VseSghY3R4KSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQ7CisJfQorCS8qIEdldCB0aGUgb2Zmc2V0IGludG8gdGhlIGluZGV4IHJvb3QgYXR0cmlidXRlLiAqLworCWlyX3BvcyA9IChzNjQpZnBvczsKKwkvKiBGaW5kIHRoZSBpbmRleCByb290IGF0dHJpYnV0ZSBpbiB0aGUgbWZ0IHJlY29yZC4gKi8KKwllcnIgPSBudGZzX2F0dHJfbG9va3VwKEFUX0lOREVYX1JPT1QsIEkzMCwgNCwgQ0FTRV9TRU5TSVRJVkUsIDAsIE5VTEwsCisJCQkwLCBjdHgpOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJJbmRleCByb290IGF0dHJpYnV0ZSBtaXNzaW5nIGluIGRpcmVjdG9yeSAiCisJCQkJImlub2RlIDB4JWx4LiIsIHZkaXItPmlfaW5vKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwkvKgorCSAqIENvcHkgdGhlIGluZGV4IHJvb3QgYXR0cmlidXRlIHZhbHVlIHRvIGEgYnVmZmVyIHNvIHRoYXQgd2UgY2FuIHB1dAorCSAqIHRoZSBzZWFyY2ggY29udGV4dCBhbmQgdW5tYXAgdGhlIG1mdCByZWNvcmQgYmVmb3JlIGNhbGxpbmcgdGhlCisJICogZmlsbGRpcigpIGNhbGxiYWNrLiAgV2UgbmVlZCB0byBkbyB0aGlzIGJlY2F1c2Ugb2YgTkZTZCB3aGljaCBjYWxscworCSAqIC0+bG9va3VwKCkgZnJvbSBpdHMgZmlsbGRpciBjYWxsYmFjaygpIGFuZCB0aGlzIGNhdXNlcyBOVEZTIHRvCisJICogZGVhZGxvY2sgYXMgbnRmc19sb29rdXAoKSBtYXBzIHRoZSBtZnQgcmVjb3JkIG9mIHRoZSBkaXJlY3RvcnkgYW5kCisJICogd2UgaGF2ZSBnb3QgaXQgbWFwcGVkIGhlcmUgYWxyZWFkeS4gIFRoZSBvbmx5IHNvbHV0aW9uIGlzIGZvciB1cyB0bworCSAqIHVubWFwIHRoZSBtZnQgcmVjb3JkIGhlcmUgc28gdGhhdCBhIGNhbGwgdG8gbnRmc19sb29rdXAoKSBpcyBhYmxlIHRvCisJICogbWFwIHRoZSBtZnQgcmVjb3JkIHdpdGhvdXQgZGVhZGxvY2tpbmcuCisJICovCisJcmMgPSBsZTMyX3RvX2NwdShjdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKTsKKwlpciA9IChJTkRFWF9ST09UKilrbWFsbG9jKHJjLCBHRlBfTk9GUyk7CisJaWYgKHVubGlrZWx5KCFpcikpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0OworCX0KKwkvKiBDb3B5IHRoZSBpbmRleCByb290IHZhbHVlIChpdCBoYXMgYmVlbiB2ZXJpZmllZCBpbiByZWFkX2lub2RlKS4gKi8KKwltZW1jcHkoaXIsICh1OCopY3R4LT5hdHRyICsKKwkJCWxlMTZfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpLCByYyk7CisJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJdW5tYXBfbWZ0X3JlY29yZChuZGlyKTsKKwljdHggPSBOVUxMOworCW0gPSBOVUxMOworCWluZGV4X2VuZCA9ICh1OCopJmlyLT5pbmRleCArIGxlMzJfdG9fY3B1KGlyLT5pbmRleC5pbmRleF9sZW5ndGgpOworCS8qIFRoZSBmaXJzdCBpbmRleCBlbnRyeS4gKi8KKwlpZSA9IChJTkRFWF9FTlRSWSopKCh1OCopJmlyLT5pbmRleCArCisJCQlsZTMyX3RvX2NwdShpci0+aW5kZXguZW50cmllc19vZmZzZXQpKTsKKwkvKgorCSAqIExvb3AgdW50aWwgd2UgZXhjZWVkIHZhbGlkIG1lbW9yeSAoY29ycnVwdGlvbiBjYXNlKSBvciB1bnRpbCB3ZQorCSAqIHJlYWNoIHRoZSBsYXN0IGVudHJ5IG9yIHVudGlsIGZpbGxkaXIgdGVsbHMgdXMgaXQgaGFzIGhhZCBlbm91Z2gKKwkgKiBvciBzaWduYWxzIGFuIGVycm9yIChib3RoIGNvdmVyZWQgYnkgdGhlIHJjIHRlc3QpLgorCSAqLworCWZvciAoOzsgaWUgPSAoSU5ERVhfRU5UUlkqKSgodTgqKWllICsgbGUxNl90b19jcHUoaWUtPmxlbmd0aCkpKSB7CisJCW50ZnNfZGVidWcoIkluIGluZGV4IHJvb3QsIG9mZnNldCAweCV6eC4iLCAodTgqKWllIC0gKHU4Kilpcik7CisJCS8qIEJvdW5kcyBjaGVja3MuICovCisJCWlmICh1bmxpa2VseSgodTgqKWllIDwgKHU4KilpciB8fCAodTgqKWllICsKKwkJCQlzaXplb2YoSU5ERVhfRU5UUllfSEVBREVSKSA+IGluZGV4X2VuZCB8fAorCQkJCSh1OCopaWUgKyBsZTE2X3RvX2NwdShpZS0+a2V5X2xlbmd0aCkgPgorCQkJCWluZGV4X2VuZCkpCisJCQlnb3RvIGVycl9vdXQ7CisJCS8qIFRoZSBsYXN0IGVudHJ5IGNhbm5vdCBjb250YWluIGEgbmFtZS4gKi8KKwkJaWYgKGllLT5mbGFncyAmIElOREVYX0VOVFJZX0VORCkKKwkJCWJyZWFrOworCQkvKiBTa2lwIGluZGV4IHJvb3QgZW50cnkgaWYgY29udGludWluZyBwcmV2aW91cyByZWFkZGlyLiAqLworCQlpZiAoaXJfcG9zID4gKHU4KilpZSAtICh1OCopaXIpCisJCQljb250aW51ZTsKKwkJLyogQWR2YW5jZSB0aGUgcG9zaXRpb24gZXZlbiBpZiBnb2luZyB0byBza2lwIHRoZSBlbnRyeS4gKi8KKwkJZnBvcyA9ICh1OCopaWUgLSAodTgqKWlyOworCQkvKiBTdWJtaXQgdGhlIG5hbWUgdG8gdGhlIGZpbGxkaXIgY2FsbGJhY2suICovCisJCXJjID0gbnRmc19maWxsZGlyKHZvbCwgZnBvcywgbmRpciwgTlVMTCwgaWUsIG5hbWUsIGRpcmVudCwKKwkJCQlmaWxsZGlyKTsKKwkJaWYgKHJjKSB7CisJCQlrZnJlZShpcik7CisJCQlnb3RvIGFib3J0OworCQl9CisJfQorCS8qIFdlIGFyZSBkb25lIHdpdGggdGhlIGluZGV4IHJvb3QgYW5kIGNhbiBmcmVlIHRoZSBidWZmZXIuICovCisJa2ZyZWUoaXIpOworCWlyID0gTlVMTDsKKwkvKiBJZiB0aGVyZSBpcyBubyBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZSB3ZSBhcmUgZmluaXNoZWQuICovCisJaWYgKCFOSW5vSW5kZXhBbGxvY1ByZXNlbnQobmRpcikpCisJCWdvdG8gRU9EOworCS8qIEFkdmFuY2UgZnBvcyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbmRleCBhbGxvY2F0aW9uLiAqLworCWZwb3MgPSB2b2wtPm1mdF9yZWNvcmRfc2l6ZTsKK3NraXBfaW5kZXhfcm9vdDoKKwlrYWRkciA9IE5VTEw7CisJcHJldl9pYV9wb3MgPSAtMUxMOworCS8qIEdldCB0aGUgb2Zmc2V0IGludG8gdGhlIGluZGV4IGFsbG9jYXRpb24gYXR0cmlidXRlLiAqLworCWlhX3BvcyA9IChzNjQpZnBvcyAtIHZvbC0+bWZ0X3JlY29yZF9zaXplOworCWlhX21hcHBpbmcgPSB2ZGlyLT5pX21hcHBpbmc7CisJYm1wX3ZpID0gbmRpci0+aXR5cGUuaW5kZXguYm1wX2lubzsKKwlpZiAodW5saWtlbHkoIWJtcF92aSkpIHsKKwkJbnRmc19kZWJ1ZygiSW5vZGUgMHglbHgsIHJlZ2V0dGluZyBpbmRleCBiaXRtYXAuIiwgdmRpci0+aV9pbm8pOworCQlibXBfdmkgPSBudGZzX2F0dHJfaWdldCh2ZGlyLCBBVF9CSVRNQVAsIEkzMCwgNCk7CisJCWlmIChJU19FUlIoYm1wX3ZpKSkgeworCQkJbnRmc19lcnJvcihzYiwgIkZhaWxlZCB0byBnZXQgYml0bWFwIGF0dHJpYnV0ZS4iKTsKKwkJCWVyciA9IFBUUl9FUlIoYm1wX3ZpKTsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCQluZGlyLT5pdHlwZS5pbmRleC5ibXBfaW5vID0gYm1wX3ZpOworCX0KKwlibXBfbWFwcGluZyA9IGJtcF92aS0+aV9tYXBwaW5nOworCS8qIEdldCB0aGUgc3RhcnRpbmcgYml0bWFwIGJpdCBwb3NpdGlvbiBhbmQgc2FuaXR5IGNoZWNrIGl0LiAqLworCWJtcF9wb3MgPSBpYV9wb3MgPj4gbmRpci0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZV9iaXRzOworCWlmICh1bmxpa2VseShibXBfcG9zID4+IDMgPj0gYm1wX3ZpLT5pX3NpemUpKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJDdXJyZW50IGluZGV4IGFsbG9jYXRpb24gcG9zaXRpb24gZXhjZWVkcyAiCisJCQkJImluZGV4IGJpdG1hcCBzaXplLiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCS8qIEdldCB0aGUgc3RhcnRpbmcgYml0IHBvc2l0aW9uIGluIHRoZSBjdXJyZW50IGJpdG1hcCBwYWdlLiAqLworCWN1cl9ibXBfcG9zID0gYm1wX3BvcyAmICgoUEFHRV9DQUNIRV9TSVpFICogOCkgLSAxKTsKKwlibXBfcG9zICY9IH4odTY0KSgoUEFHRV9DQUNIRV9TSVpFICogOCkgLSAxKTsKK2dldF9uZXh0X2JtcF9wYWdlOgorCW50ZnNfZGVidWcoIlJlYWRpbmcgYml0bWFwIHdpdGggcGFnZSBpbmRleCAweCVsbHgsIGJpdCBvZnMgMHglbGx4IiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYm1wX3BvcyA+PiAoMyArIFBBR0VfQ0FDSEVfU0hJRlQpLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylibXBfcG9zICYKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpKChQQUdFX0NBQ0hFX1NJWkUgKiA4KSAtIDEpKTsKKwlibXBfcGFnZSA9IG50ZnNfbWFwX3BhZ2UoYm1wX21hcHBpbmcsCisJCQlibXBfcG9zID4+ICgzICsgUEFHRV9DQUNIRV9TSElGVCkpOworCWlmIChJU19FUlIoYm1wX3BhZ2UpKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJSZWFkaW5nIGluZGV4IGJpdG1hcCBmYWlsZWQuIik7CisJCWVyciA9IFBUUl9FUlIoYm1wX3BhZ2UpOworCQlibXBfcGFnZSA9IE5VTEw7CisJCWdvdG8gZXJyX291dDsKKwl9CisJYm1wID0gKHU4KilwYWdlX2FkZHJlc3MoYm1wX3BhZ2UpOworCS8qIEZpbmQgbmV4dCBpbmRleCBibG9jayBpbiB1c2UuICovCisJd2hpbGUgKCEoYm1wW2N1cl9ibXBfcG9zID4+IDNdICYgKDEgPDwgKGN1cl9ibXBfcG9zICYgNykpKSkgeworZmluZF9uZXh0X2luZGV4X2J1ZmZlcjoKKwkJY3VyX2JtcF9wb3MrKzsKKwkJLyoKKwkJICogSWYgd2UgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGJpdG1hcCBwYWdlLCBnZXQgdGhlIG5leHQKKwkJICogcGFnZSwgYW5kIHB1dCBhd2F5IHRoZSBvbGQgb25lLgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KChjdXJfYm1wX3BvcyA+PiAzKSA+PSBQQUdFX0NBQ0hFX1NJWkUpKSB7CisJCQludGZzX3VubWFwX3BhZ2UoYm1wX3BhZ2UpOworCQkJYm1wX3BvcyArPSBQQUdFX0NBQ0hFX1NJWkUgKiA4OworCQkJY3VyX2JtcF9wb3MgPSAwOworCQkJZ290byBnZXRfbmV4dF9ibXBfcGFnZTsKKwkJfQorCQkvKiBJZiB3ZSBoYXZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgYml0bWFwLCB3ZSBhcmUgZG9uZS4gKi8KKwkJaWYgKHVubGlrZWx5KCgoYm1wX3BvcyArIGN1cl9ibXBfcG9zKSA+PiAzKSA+PSB2ZGlyLT5pX3NpemUpKQorCQkJZ290byB1bm1fRU9EOworCQlpYV9wb3MgPSAoYm1wX3BvcyArIGN1cl9ibXBfcG9zKSA8PAorCQkJCW5kaXItPml0eXBlLmluZGV4LmJsb2NrX3NpemVfYml0czsKKwl9CisJbnRmc19kZWJ1ZygiSGFuZGxpbmcgaW5kZXggYnVmZmVyIDB4JWxseC4iLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylibXBfcG9zICsgY3VyX2JtcF9wb3MpOworCS8qIElmIHRoZSBjdXJyZW50IGluZGV4IGJ1ZmZlciBpcyBpbiB0aGUgc2FtZSBwYWdlIHdlIHJldXNlIHRoZSBwYWdlLiAqLworCWlmICgocHJldl9pYV9wb3MgJiBQQUdFX0NBQ0hFX01BU0spICE9IChpYV9wb3MgJiBQQUdFX0NBQ0hFX01BU0spKSB7CisJCXByZXZfaWFfcG9zID0gaWFfcG9zOworCQlpZiAobGlrZWx5KGlhX3BhZ2UgIT0gTlVMTCkpIHsKKwkJCXVubG9ja19wYWdlKGlhX3BhZ2UpOworCQkJbnRmc191bm1hcF9wYWdlKGlhX3BhZ2UpOworCQl9CisJCS8qCisJCSAqIE1hcCB0aGUgcGFnZSBjYWNoZSBwYWdlIGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgaWFfcG9zLAorCQkgKiByZWFkaW5nIGl0IGZyb20gZGlzayBpZiBuZWNlc3NhcnkuCisJCSAqLworCQlpYV9wYWdlID0gbnRmc19tYXBfcGFnZShpYV9tYXBwaW5nLCBpYV9wb3MgPj4gUEFHRV9DQUNIRV9TSElGVCk7CisJCWlmIChJU19FUlIoaWFfcGFnZSkpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICJSZWFkaW5nIGluZGV4IGFsbG9jYXRpb24gZGF0YSBmYWlsZWQuIik7CisJCQllcnIgPSBQVFJfRVJSKGlhX3BhZ2UpOworCQkJaWFfcGFnZSA9IE5VTEw7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwkJbG9ja19wYWdlKGlhX3BhZ2UpOworCQlrYWRkciA9ICh1OCopcGFnZV9hZGRyZXNzKGlhX3BhZ2UpOworCX0KKwkvKiBHZXQgdGhlIGN1cnJlbnQgaW5kZXggYnVmZmVyLiAqLworCWlhID0gKElOREVYX0FMTE9DQVRJT04qKShrYWRkciArIChpYV9wb3MgJiB+UEFHRV9DQUNIRV9NQVNLICYKKwkJCX4oczY0KShuZGlyLT5pdHlwZS5pbmRleC5ibG9ja19zaXplIC0gMSkpKTsKKwkvKiBCb3VuZHMgY2hlY2tzLiAqLworCWlmICh1bmxpa2VseSgodTgqKWlhIDwga2FkZHIgfHwgKHU4KilpYSA+IGthZGRyICsgUEFHRV9DQUNIRV9TSVpFKSkgeworCQludGZzX2Vycm9yKHNiLCAiT3V0IG9mIGJvdW5kcyBjaGVjayBmYWlsZWQuIENvcnJ1cHQgZGlyZWN0b3J5ICIKKwkJCQkiaW5vZGUgMHglbHggb3IgZHJpdmVyIGJ1Zy4iLCB2ZGlyLT5pX2lubyk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJLyogQ2F0Y2ggbXVsdGkgc2VjdG9yIHRyYW5zZmVyIGZpeHVwIGVycm9ycy4gKi8KKwlpZiAodW5saWtlbHkoIW50ZnNfaXNfaW5keF9yZWNvcmQoaWEtPm1hZ2ljKSkpIHsKKwkJbnRmc19lcnJvcihzYiwgIkRpcmVjdG9yeSBpbmRleCByZWNvcmQgd2l0aCB2Y24gMHglbGx4IGlzICIKKwkJCQkiY29ycnVwdC4gIENvcnJ1cHQgaW5vZGUgMHglbHguICBSdW4gY2hrZHNrLiIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylpYV9wb3MgPj4KKwkJCQluZGlyLT5pdHlwZS5pbmRleC52Y25fc2l6ZV9iaXRzLCB2ZGlyLT5pX2lubyk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJaWYgKHVubGlrZWx5KHNsZTY0X3RvX2NwdShpYS0+aW5kZXhfYmxvY2tfdmNuKSAhPSAoaWFfcG9zICYKKwkJCX4oczY0KShuZGlyLT5pdHlwZS5pbmRleC5ibG9ja19zaXplIC0gMSkpID4+CisJCQluZGlyLT5pdHlwZS5pbmRleC52Y25fc2l6ZV9iaXRzKSkgeworCQludGZzX2Vycm9yKHNiLCAiQWN0dWFsIFZDTiAoMHglbGx4KSBvZiBpbmRleCBidWZmZXIgaXMgIgorCQkJCSJkaWZmZXJlbnQgZnJvbSBleHBlY3RlZCBWQ04gKDB4JWxseCkuICIKKwkJCQkiRGlyZWN0b3J5IGlub2RlIDB4JWx4IGlzIGNvcnJ1cHQgb3IgZHJpdmVyICIKKwkJCQkiYnVnLiAiLCAodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCXNsZTY0X3RvX2NwdShpYS0+aW5kZXhfYmxvY2tfdmNuKSwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKWlhX3BvcyA+PgorCQkJCW5kaXItPml0eXBlLmluZGV4LnZjbl9zaXplX2JpdHMsIHZkaXItPmlfaW5vKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwlpZiAodW5saWtlbHkobGUzMl90b19jcHUoaWEtPmluZGV4LmFsbG9jYXRlZF9zaXplKSArIDB4MTggIT0KKwkJCW5kaXItPml0eXBlLmluZGV4LmJsb2NrX3NpemUpKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJJbmRleCBidWZmZXIgKFZDTiAweCVsbHgpIG9mIGRpcmVjdG9yeSBpbm9kZSAiCisJCQkJIjB4JWx4IGhhcyBhIHNpemUgKCV1KSBkaWZmZXJpbmcgZnJvbSB0aGUgIgorCQkJCSJkaXJlY3Rvcnkgc3BlY2lmaWVkIHNpemUgKCV1KS4gRGlyZWN0b3J5ICIKKwkJCQkiaW5vZGUgaXMgY29ycnVwdCBvciBkcml2ZXIgYnVnLiIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylpYV9wb3MgPj4KKwkJCQluZGlyLT5pdHlwZS5pbmRleC52Y25fc2l6ZV9iaXRzLCB2ZGlyLT5pX2lubywKKwkJCQlsZTMyX3RvX2NwdShpYS0+aW5kZXguYWxsb2NhdGVkX3NpemUpICsgMHgxOCwKKwkJCQluZGlyLT5pdHlwZS5pbmRleC5ibG9ja19zaXplKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwlpbmRleF9lbmQgPSAodTgqKWlhICsgbmRpci0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZTsKKwlpZiAodW5saWtlbHkoaW5kZXhfZW5kID4ga2FkZHIgKyBQQUdFX0NBQ0hFX1NJWkUpKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJJbmRleCBidWZmZXIgKFZDTiAweCVsbHgpIG9mIGRpcmVjdG9yeSBpbm9kZSAiCisJCQkJIjB4JWx4IGNyb3NzZXMgcGFnZSBib3VuZGFyeS4gSW1wb3NzaWJsZSEgIgorCQkJCSJDYW5ub3QgYWNjZXNzISBUaGlzIGlzIHByb2JhYmx5IGEgYnVnIGluIHRoZSAiCisJCQkJImRyaXZlci4iLCAodW5zaWduZWQgbG9uZyBsb25nKWlhX3BvcyA+PgorCQkJCW5kaXItPml0eXBlLmluZGV4LnZjbl9zaXplX2JpdHMsIHZkaXItPmlfaW5vKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwlpYV9zdGFydCA9IGlhX3BvcyAmIH4oczY0KShuZGlyLT5pdHlwZS5pbmRleC5ibG9ja19zaXplIC0gMSk7CisJaW5kZXhfZW5kID0gKHU4KikmaWEtPmluZGV4ICsgbGUzMl90b19jcHUoaWEtPmluZGV4LmluZGV4X2xlbmd0aCk7CisJaWYgKHVubGlrZWx5KGluZGV4X2VuZCA+ICh1OCopaWEgKyBuZGlyLT5pdHlwZS5pbmRleC5ibG9ja19zaXplKSkgeworCQludGZzX2Vycm9yKHNiLCAiU2l6ZSBvZiBpbmRleCBidWZmZXIgKFZDTiAweCVsbHgpIG9mIGRpcmVjdG9yeSAiCisJCQkJImlub2RlIDB4JWx4IGV4Y2VlZHMgbWF4aW11bSBzaXplLiIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylpYV9wb3MgPj4KKwkJCQluZGlyLT5pdHlwZS5pbmRleC52Y25fc2l6ZV9iaXRzLCB2ZGlyLT5pX2lubyk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJLyogVGhlIGZpcnN0IGluZGV4IGVudHJ5IGluIHRoaXMgaW5kZXggYnVmZmVyLiAqLworCWllID0gKElOREVYX0VOVFJZKikoKHU4KikmaWEtPmluZGV4ICsKKwkJCWxlMzJfdG9fY3B1KGlhLT5pbmRleC5lbnRyaWVzX29mZnNldCkpOworCS8qCisJICogTG9vcCB1bnRpbCB3ZSBleGNlZWQgdmFsaWQgbWVtb3J5IChjb3JydXB0aW9uIGNhc2UpIG9yIHVudGlsIHdlCisJICogcmVhY2ggdGhlIGxhc3QgZW50cnkgb3IgdW50aWwgZmlsbGRpciB0ZWxscyB1cyBpdCBoYXMgaGFkIGVub3VnaAorCSAqIG9yIHNpZ25hbHMgYW4gZXJyb3IgKGJvdGggY292ZXJlZCBieSB0aGUgcmMgdGVzdCkuCisJICovCisJZm9yICg7OyBpZSA9IChJTkRFWF9FTlRSWSopKCh1OCopaWUgKyBsZTE2X3RvX2NwdShpZS0+bGVuZ3RoKSkpIHsKKwkJbnRmc19kZWJ1ZygiSW4gaW5kZXggYWxsb2NhdGlvbiwgb2Zmc2V0IDB4JWxseC4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpaWFfc3RhcnQgKworCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpKCh1OCopaWUgLSAodTgqKWlhKSk7CisJCS8qIEJvdW5kcyBjaGVja3MuICovCisJCWlmICh1bmxpa2VseSgodTgqKWllIDwgKHU4KilpYSB8fCAodTgqKWllICsKKwkJCQlzaXplb2YoSU5ERVhfRU5UUllfSEVBREVSKSA+IGluZGV4X2VuZCB8fAorCQkJCSh1OCopaWUgKyBsZTE2X3RvX2NwdShpZS0+a2V5X2xlbmd0aCkgPgorCQkJCWluZGV4X2VuZCkpCisJCQlnb3RvIGVycl9vdXQ7CisJCS8qIFRoZSBsYXN0IGVudHJ5IGNhbm5vdCBjb250YWluIGEgbmFtZS4gKi8KKwkJaWYgKGllLT5mbGFncyAmIElOREVYX0VOVFJZX0VORCkKKwkJCWJyZWFrOworCQkvKiBTa2lwIGluZGV4IGJsb2NrIGVudHJ5IGlmIGNvbnRpbnVpbmcgcHJldmlvdXMgcmVhZGRpci4gKi8KKwkJaWYgKGlhX3BvcyAtIGlhX3N0YXJ0ID4gKHU4KilpZSAtICh1OCopaWEpCisJCQljb250aW51ZTsKKwkJLyogQWR2YW5jZSB0aGUgcG9zaXRpb24gZXZlbiBpZiBnb2luZyB0byBza2lwIHRoZSBlbnRyeS4gKi8KKwkJZnBvcyA9ICh1OCopaWUgLSAodTgqKWlhICsKKwkJCQkoc2xlNjRfdG9fY3B1KGlhLT5pbmRleF9ibG9ja192Y24pIDw8CisJCQkJbmRpci0+aXR5cGUuaW5kZXgudmNuX3NpemVfYml0cykgKworCQkJCXZvbC0+bWZ0X3JlY29yZF9zaXplOworCQkvKgorCQkgKiBTdWJtaXQgdGhlIG5hbWUgdG8gdGhlIEBmaWxsZGlyIGNhbGxiYWNrLiAgTm90ZSwKKwkJICogbnRmc19maWxsZGlyKCkgZHJvcHMgdGhlIGxvY2sgb24gQGlhX3BhZ2UgYnV0IGl0IHJldGFrZXMgaXQKKwkJICogYmVmb3JlIHJldHVybmluZywgdW5sZXNzIGEgbm9uLXplcm8gdmFsdWUgaXMgcmV0dXJuZWQgaW4KKwkJICogd2hpY2ggY2FzZSB0aGUgcGFnZSBpcyBsZWZ0IHVubG9ja2VkLgorCQkgKi8KKwkJcmMgPSBudGZzX2ZpbGxkaXIodm9sLCBmcG9zLCBuZGlyLCBpYV9wYWdlLCBpZSwgbmFtZSwgZGlyZW50LAorCQkJCWZpbGxkaXIpOworCQlpZiAocmMpIHsKKwkJCS8qIEBpYV9wYWdlIGlzIGFscmVhZHkgdW5sb2NrZWQgaW4gdGhpcyBjYXNlLiAqLworCQkJbnRmc191bm1hcF9wYWdlKGlhX3BhZ2UpOworCQkJbnRmc191bm1hcF9wYWdlKGJtcF9wYWdlKTsKKwkJCWdvdG8gYWJvcnQ7CisJCX0KKwl9CisJZ290byBmaW5kX25leHRfaW5kZXhfYnVmZmVyOwordW5tX0VPRDoKKwlpZiAoaWFfcGFnZSkgeworCQl1bmxvY2tfcGFnZShpYV9wYWdlKTsKKwkJbnRmc191bm1hcF9wYWdlKGlhX3BhZ2UpOworCX0KKwludGZzX3VubWFwX3BhZ2UoYm1wX3BhZ2UpOworRU9EOgorCS8qIFdlIGFyZSBmaW5pc2hlZCwgc2V0IGZwb3MgdG8gRU9ELiAqLworCWZwb3MgPSB2ZGlyLT5pX3NpemUgKyB2b2wtPm1mdF9yZWNvcmRfc2l6ZTsKK2Fib3J0OgorCWtmcmVlKG5hbWUpOworZG9uZToKKyNpZmRlZiBERUJVRworCWlmICghcmMpCisJCW50ZnNfZGVidWcoIkVPRCwgZnBvcyAweCVsbHgsIHJldHVybmluZyAwLiIsIGZwb3MpOworCWVsc2UKKwkJbnRmc19kZWJ1ZygiZmlsbGRpciByZXR1cm5lZCAlaSwgZnBvcyAweCVsbHgsIHJldHVybmluZyAwLiIsCisJCQkJcmMsIGZwb3MpOworI2VuZGlmCisJZmlscC0+Zl9wb3MgPSBmcG9zOworCXJldHVybiAwOworZXJyX291dDoKKwlpZiAoYm1wX3BhZ2UpCisJCW50ZnNfdW5tYXBfcGFnZShibXBfcGFnZSk7CisJaWYgKGlhX3BhZ2UpIHsKKwkJdW5sb2NrX3BhZ2UoaWFfcGFnZSk7CisJCW50ZnNfdW5tYXBfcGFnZShpYV9wYWdlKTsKKwl9CisJaWYgKGlyKQorCQlrZnJlZShpcik7CisJaWYgKG5hbWUpCisJCWtmcmVlKG5hbWUpOworCWlmIChjdHgpCisJCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCWlmIChtKQorCQl1bm1hcF9tZnRfcmVjb3JkKG5kaXIpOworCWlmICghZXJyKQorCQllcnIgPSAtRUlPOworCW50ZnNfZGVidWcoIkZhaWxlZC4gUmV0dXJuaW5nIGVycm9yIGNvZGUgJWkuIiwgLWVycik7CisJZmlscC0+Zl9wb3MgPSBmcG9zOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogbnRmc19kaXJfb3BlbiAtIGNhbGxlZCB3aGVuIGFuIGlub2RlIGlzIGFib3V0IHRvIGJlIG9wZW5lZAorICogQHZpOgkJaW5vZGUgdG8gYmUgb3BlbmVkCisgKiBAZmlscDoJZmlsZSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgaW5vZGUKKyAqCisgKiBMaW1pdCBkaXJlY3Rvcnkgc2l6ZSB0byB0aGUgcGFnZSBjYWNoZSBsaW1pdCBvbiBhcmNoaXRlY3R1cmVzIHdoZXJlIHVuc2lnbmVkCisgKiBsb25nIGlzIDMyLWJpdHMuIFRoaXMgaXMgdGhlIG1vc3Qgd2UgY2FuIGRvIGZvciBub3cgd2l0aG91dCBvdmVyZmxvd2luZyB0aGUKKyAqIHBhZ2UgY2FjaGUgcGFnZSBpbmRleC4gRG9pbmcgaXQgdGhpcyB3YXkgbWVhbnMgd2UgZG9uJ3QgcnVuIGludG8gcHJvYmxlbXMKKyAqIGJlY2F1c2Ugb2YgZXhpc3RpbmcgdG9vIGxhcmdlIGRpcmVjdG9yaWVzLiBJdCB3b3VsZCBiZSBiZXR0ZXIgdG8gYWxsb3cgdGhlCisgKiB1c2VyIHRvIHJlYWQgdGhlIGFjY2Vzc2libGUgcGFydCBvZiB0aGUgZGlyZWN0b3J5IGJ1dCBJIGRvdWJ0IHZlcnkgbXVjaAorICogYW55b25lIGlzIGdvaW5nIHRvIGhpdCB0aGlzIGNoZWNrIG9uIGEgMzItYml0IGFyY2hpdGVjdHVyZSwgc28gdGhlcmUgaXMgbm8KKyAqIHBvaW50IGluIGFkZGluZyB0aGUgZXh0cmEgY29tcGxleGl0eSByZXF1aXJlZCB0byBzdXBwb3J0IHRoaXMuCisgKgorICogT24gNjQtYml0IGFyY2hpdGVjdHVyZXMsIHRoZSBjaGVjayBpcyBob3BlZnVsbHkgb3B0aW1pemVkIGF3YXkgYnkgdGhlCisgKiBjb21waWxlci4KKyAqLworc3RhdGljIGludCBudGZzX2Rpcl9vcGVuKHN0cnVjdCBpbm9kZSAqdmksIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWlmIChzaXplb2YodW5zaWduZWQgbG9uZykgPCA4KSB7CisJCWlmICh2aS0+aV9zaXplID4gTUFYX0xGU19GSUxFU0laRSkKKwkJCXJldHVybiAtRUZCSUc7CisJfQorCXJldHVybiAwOworfQorCisjaWZkZWYgTlRGU19SVworCisvKioKKyAqIG50ZnNfZGlyX2ZzeW5jIC0gc3luYyBhIGRpcmVjdG9yeSB0byBkaXNrCisgKiBAZmlscDoJZGlyZWN0b3J5IHRvIGJlIHN5bmNlZAorICogQGRlbnRyeToJZGVudHJ5IGRlc2NyaWJpbmcgdGhlIGRpcmVjdG9yeSB0byBzeW5jCisgKiBAZGF0YXN5bmM6CWlmIG5vbi16ZXJvIG9ubHkgZmx1c2ggdXNlciBkYXRhIGFuZCBub3QgbWV0YWRhdGEKKyAqCisgKiBEYXRhIGludGVncml0eSBzeW5jIG9mIGEgZGlyZWN0b3J5IHRvIGRpc2suICBVc2VkIGZvciBmc3luYywgZmRhdGFzeW5jLCBhbmQKKyAqIG1zeW5jIHN5c3RlbSBjYWxscy4gIFRoaXMgZnVuY3Rpb24gaXMgYmFzZWQgb24gZmlsZS5jOjpudGZzX2ZpbGVfZnN5bmMoKS4KKyAqCisgKiBXcml0ZSB0aGUgbWZ0IHJlY29yZCBhbmQgYWxsIGFzc29jaWF0ZWQgZXh0ZW50IG1mdCByZWNvcmRzIGFzIHdlbGwgYXMgdGhlCisgKiAkSU5ERVhfQUxMT0NBVElPTiBhbmQgJEJJVE1BUCBhdHRyaWJ1dGVzIGFuZCB0aGVuIHN5bmMgdGhlIGJsb2NrIGRldmljZS4KKyAqCisgKiBJZiBAZGF0YXN5bmMgaXMgdHJ1ZSwgd2UgZG8gbm90IHdhaXQgb24gdGhlIGlub2RlKHMpIHRvIGJlIHdyaXR0ZW4gb3V0CisgKiBidXQgd2UgYWx3YXlzIHdhaXQgb24gdGhlIHBhZ2UgY2FjaGUgcGFnZXMgdG8gYmUgd3JpdHRlbiBvdXQuCisgKgorICogTm90ZTogSW4gdGhlIHBhc3QgQGZpbHAgY291bGQgYmUgTlVMTCBzbyB3ZSBpZ25vcmUgaXQgYXMgd2UgZG9uJ3QgbmVlZCBpdAorICogYW55d2F5LgorICoKKyAqIExvY2tpbmc6IENhbGxlciBtdXN0IGhvbGQgaV9zZW0gb24gdGhlIGlub2RlLgorICoKKyAqIFRPRE86IFdlIHNob3VsZCBwcm9iYWJseSBhbHNvIHdyaXRlIGFsbCBhdHRyaWJ1dGUvaW5kZXggaW5vZGVzIGFzc29jaWF0ZWQKKyAqIHdpdGggdGhpcyBpbm9kZSBidXQgc2luY2Ugd2UgaGF2ZSBubyBzaW1wbGUgd2F5IG9mIGdldHRpbmcgdG8gdGhlbSB3ZSBpZ25vcmUKKyAqIHRoaXMgcHJvYmxlbSBmb3Igbm93LiAgV2UgZG8gd3JpdGUgdGhlICRCSVRNQVAgYXR0cmlidXRlIGlmIGl0IGlzIHByZXNlbnQKKyAqIHdoaWNoIGlzIHRoZSBpbXBvcnRhbnQgb25lIGZvciBhIGRpcmVjdG9yeSBzbyB0aGluZ3MgYXJlIG5vdCB0b28gYmFkLgorICovCitzdGF0aWMgaW50IG50ZnNfZGlyX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCWludCBkYXRhc3luYykKK3sKKwlzdHJ1Y3QgaW5vZGUgKnZpID0gZGVudHJ5LT5kX2lub2RlOworCW50ZnNfaW5vZGUgKm5pID0gTlRGU19JKHZpKTsKKwlpbnQgZXJyLCByZXQ7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3IgaW5vZGUgMHglbHguIiwgdmktPmlfaW5vKTsKKwlCVUdfT04oIVNfSVNESVIodmktPmlfbW9kZSkpOworCWlmIChOSW5vSW5kZXhBbGxvY1ByZXNlbnQobmkpICYmIG5pLT5pdHlwZS5pbmRleC5ibXBfaW5vKQorCQl3cml0ZV9pbm9kZV9ub3cobmktPml0eXBlLmluZGV4LmJtcF9pbm8sICFkYXRhc3luYyk7CisJcmV0ID0gbnRmc193cml0ZV9pbm9kZSh2aSwgMSk7CisJd3JpdGVfaW5vZGVfbm93KHZpLCAhZGF0YXN5bmMpOworCWVyciA9IHN5bmNfYmxvY2tkZXYodmktPmlfc2ItPnNfYmRldik7CisJaWYgKHVubGlrZWx5KGVyciAmJiAhcmV0KSkKKwkJcmV0ID0gZXJyOworCWlmIChsaWtlbHkoIXJldCkpCisJCW50ZnNfZGVidWcoIkRvbmUuIik7CisJZWxzZQorCQludGZzX3dhcm5pbmcodmktPmlfc2IsICJGYWlsZWQgdG8gZiVzc3luYyBpbm9kZSAweCVseC4gIEVycm9yICIKKwkJCQkiJXUuIiwgZGF0YXN5bmMgPyAiZGF0YSIgOiAiIiwgdmktPmlfaW5vLCAtcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYgLyogTlRGU19SVyAqLworCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG50ZnNfZGlyX29wcyA9IHsKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCS8qIFNlZWsgaW5zaWRlIGRpcmVjdG9yeS4gKi8KKwkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAkvKiBSZXR1cm4gLUVJU0RJUi4gKi8KKwkucmVhZGRpcgk9IG50ZnNfcmVhZGRpciwJCS8qIFJlYWQgZGlyZWN0b3J5IGNvbnRlbnRzLiAqLworI2lmZGVmIE5URlNfUlcKKwkuZnN5bmMJCT0gbnRmc19kaXJfZnN5bmMsCS8qIFN5bmMgYSBkaXJlY3RvcnkgdG8gZGlzay4gKi8KKwkvKi5haW9fZnN5bmMJPSAsKi8JCQkvKiBTeW5jIGFsbCBvdXRzdGFuZGluZyBhc3luYworCQkJCQkJICAgaS9vIG9wZXJhdGlvbnMgb24gYSBraW9jYi4gKi8KKyNlbmRpZiAvKiBOVEZTX1JXICovCisJLyouaW9jdGwJPSAsKi8JCQkvKiBQZXJmb3JtIGZ1bmN0aW9uIG9uIHRoZQorCQkJCQkJICAgbW91bnRlZCBmaWxlc3lzdGVtLiAqLworCS5vcGVuCQk9IG50ZnNfZGlyX29wZW4sCS8qIE9wZW4gZGlyZWN0b3J5LiAqLworfTsKZGlmZiAtLWdpdCBhL2ZzL250ZnMvZGlyLmggYi9mcy9udGZzL2Rpci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYTc1ODIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL2Rpci5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBkaXIuaCAtIERlZmluZXMgZm9yIGRpcmVjdG9yeSBoYW5kbGluZyBpbiBOVEZTIExpbnV4IGtlcm5lbCBkcml2ZXIuIFBhcnQgb2YKKyAqCSAgIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfTElOVVhfTlRGU19ESVJfSAorI2RlZmluZSBfTElOVVhfTlRGU19ESVJfSAorCisjaW5jbHVkZSAibGF5b3V0LmgiCisjaW5jbHVkZSAiaW5vZGUuaCIKKyNpbmNsdWRlICJ0eXBlcy5oIgorCisvKgorICogbnRmc19uYW1lIGlzIHVzZWQgdG8gcmV0dXJuIHRoZSBmaWxlIG5hbWUgdG8gdGhlIGNhbGxlciBvZgorICogbnRmc19sb29rdXBfaW5vZGVfYnlfbmFtZSgpIGluIG9yZGVyIGZvciB0aGUgY2FsbGVyIChuYW1laS5jOjpudGZzX2xvb2t1cCgpKQorICogdG8gYmUgYWJsZSB0byBkZWFsIHdpdGggZGNhY2hlIGFsaWFzaW5nIGlzc3Vlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCU1GVF9SRUYgbXJlZjsKKwlGSUxFX05BTUVfVFlQRV9GTEFHUyB0eXBlOworCXU4IGxlbjsKKwludGZzY2hhciBuYW1lWzBdOworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIG50ZnNfbmFtZTsKKworLyogVGhlIGxpdHRsZSBlbmRpYW4gVW5pY29kZSBzdHJpbmcgJEkzMCBhcyBhIGdsb2JhbCBjb25zdGFudC4gKi8KK2V4dGVybiBudGZzY2hhciBJMzBbNV07CisKK2V4dGVybiBNRlRfUkVGIG50ZnNfbG9va3VwX2lub2RlX2J5X25hbWUobnRmc19pbm9kZSAqZGlyX25pLAorCQljb25zdCBudGZzY2hhciAqdW5hbWUsIGNvbnN0IGludCB1bmFtZV9sZW4sIG50ZnNfbmFtZSAqKnJlcyk7CisKKyNlbmRpZiAvKiBfTElOVVhfTlRGU19GU19ESVJfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9lbmRpYW4uaCBiL2ZzL250ZnMvZW5kaWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI3YjViZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvZW5kaWFuLmgKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIGVuZGlhbi5oIC0gRGVmaW5lcyBmb3IgZW5kaWFubmVzcyBoYW5kbGluZyBpbiBOVEZTIExpbnV4IGtlcm5lbCBkcml2ZXIuCisgKgkgICAgICBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfTElOVVhfTlRGU19FTkRJQU5fSAorI2RlZmluZSBfTElOVVhfTlRGU19FTkRJQU5fSAorCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgInR5cGVzLmgiCisKKy8qCisgKiBTaWduZWQgZW5kaWFubmVzcyBjb252ZXJzaW9uIGZ1bmN0aW9ucy4KKyAqLworCitzdGF0aWMgaW5saW5lIHMxNiBzbGUxNl90b19jcHUoc2xlMTYgeCkKK3sKKwlyZXR1cm4gbGUxNl90b19jcHUoKF9fZm9yY2UgbGUxNil4KTsKK30KKworc3RhdGljIGlubGluZSBzMzIgc2xlMzJfdG9fY3B1KHNsZTMyIHgpCit7CisJcmV0dXJuIGxlMzJfdG9fY3B1KChfX2ZvcmNlIGxlMzIpeCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgczY0IHNsZTY0X3RvX2NwdShzbGU2NCB4KQoreworCXJldHVybiBsZTY0X3RvX2NwdSgoX19mb3JjZSBsZTY0KXgpOworfQorCitzdGF0aWMgaW5saW5lIHMxNiBzbGUxNl90b19jcHVwKHNsZTE2ICp4KQoreworCXJldHVybiBsZTE2X3RvX2NwdSgqKF9fZm9yY2UgbGUxNiopeCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgczMyIHNsZTMyX3RvX2NwdXAoc2xlMzIgKngpCit7CisJcmV0dXJuIGxlMzJfdG9fY3B1KCooX19mb3JjZSBsZTMyKil4KTsKK30KKworc3RhdGljIGlubGluZSBzNjQgc2xlNjRfdG9fY3B1cChzbGU2NCAqeCkKK3sKKwlyZXR1cm4gbGU2NF90b19jcHUoKihfX2ZvcmNlIGxlNjQqKXgpOworfQorCitzdGF0aWMgaW5saW5lIHNsZTE2IGNwdV90b19zbGUxNihzMTYgeCkKK3sKKwlyZXR1cm4gKF9fZm9yY2Ugc2xlMTYpY3B1X3RvX2xlMTYoeCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc2xlMzIgY3B1X3RvX3NsZTMyKHMzMiB4KQoreworCXJldHVybiAoX19mb3JjZSBzbGUzMiljcHVfdG9fbGUzMih4KTsKK30KKworc3RhdGljIGlubGluZSBzbGU2NCBjcHVfdG9fc2xlNjQoczY0IHgpCit7CisJcmV0dXJuIChfX2ZvcmNlIHNsZTY0KWNwdV90b19sZTY0KHgpOworfQorCitzdGF0aWMgaW5saW5lIHNsZTE2IGNwdV90b19zbGUxNnAoczE2ICp4KQoreworCXJldHVybiAoX19mb3JjZSBzbGUxNiljcHVfdG9fbGUxNigqeCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc2xlMzIgY3B1X3RvX3NsZTMycChzMzIgKngpCit7CisJcmV0dXJuIChfX2ZvcmNlIHNsZTMyKWNwdV90b19sZTMyKCp4KTsKK30KKworc3RhdGljIGlubGluZSBzbGU2NCBjcHVfdG9fc2xlNjRwKHM2NCAqeCkKK3sKKwlyZXR1cm4gKF9fZm9yY2Ugc2xlNjQpY3B1X3RvX2xlNjQoKngpOworfQorCisjZW5kaWYgLyogX0xJTlVYX05URlNfRU5ESUFOX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvZmlsZS5jIGIvZnMvbnRmcy9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI4NzEzZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvZmlsZS5jCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogZmlsZS5jIC0gTlRGUyBrZXJuZWwgZmlsZSBvcGVyYXRpb25zLiBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorCisjaW5jbHVkZSAiaW5vZGUuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgIm50ZnMuaCIKKworLyoqCisgKiBudGZzX2ZpbGVfb3BlbiAtIGNhbGxlZCB3aGVuIGFuIGlub2RlIGlzIGFib3V0IHRvIGJlIG9wZW5lZAorICogQHZpOgkJaW5vZGUgdG8gYmUgb3BlbmVkCisgKiBAZmlscDoJZmlsZSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgaW5vZGUKKyAqCisgKiBMaW1pdCBmaWxlIHNpemUgdG8gdGhlIHBhZ2UgY2FjaGUgbGltaXQgb24gYXJjaGl0ZWN0dXJlcyB3aGVyZSB1bnNpZ25lZCBsb25nCisgKiBpcyAzMi1iaXRzLiBUaGlzIGlzIHRoZSBtb3N0IHdlIGNhbiBkbyBmb3Igbm93IHdpdGhvdXQgb3ZlcmZsb3dpbmcgdGhlIHBhZ2UKKyAqIGNhY2hlIHBhZ2UgaW5kZXguIERvaW5nIGl0IHRoaXMgd2F5IG1lYW5zIHdlIGRvbid0IHJ1biBpbnRvIHByb2JsZW1zIGJlY2F1c2UKKyAqIG9mIGV4aXN0aW5nIHRvbyBsYXJnZSBmaWxlcy4gSXQgd291bGQgYmUgYmV0dGVyIHRvIGFsbG93IHRoZSB1c2VyIHRvIHJlYWQKKyAqIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUgYnV0IEkgZG91YnQgdmVyeSBtdWNoIGFueW9uZSBpcyBnb2luZyB0byBoaXQgdGhpcworICogY2hlY2sgb24gYSAzMi1iaXQgYXJjaGl0ZWN0dXJlLCBzbyB0aGVyZSBpcyBubyBwb2ludCBpbiBhZGRpbmcgdGhlIGV4dHJhCisgKiBjb21wbGV4aXR5IHJlcXVpcmVkIHRvIHN1cHBvcnQgdGhpcy4KKyAqCisgKiBPbiA2NC1iaXQgYXJjaGl0ZWN0dXJlcywgdGhlIGNoZWNrIGlzIGhvcGVmdWxseSBvcHRpbWl6ZWQgYXdheSBieSB0aGUKKyAqIGNvbXBpbGVyLgorICoKKyAqIEFmdGVyIHRoZSBjaGVjayBwYXNzZXMsIGp1c3QgY2FsbCBnZW5lcmljX2ZpbGVfb3BlbigpIHRvIGRvIGl0cyB3b3JrLgorICovCitzdGF0aWMgaW50IG50ZnNfZmlsZV9vcGVuKHN0cnVjdCBpbm9kZSAqdmksIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWlmIChzaXplb2YodW5zaWduZWQgbG9uZykgPCA4KSB7CisJCWlmICh2aS0+aV9zaXplID4gTUFYX0xGU19GSUxFU0laRSkKKwkJCXJldHVybiAtRUZCSUc7CisJfQorCXJldHVybiBnZW5lcmljX2ZpbGVfb3Blbih2aSwgZmlscCk7Cit9CisKKyNpZmRlZiBOVEZTX1JXCisKKy8qKgorICogbnRmc19maWxlX2ZzeW5jIC0gc3luYyBhIGZpbGUgdG8gZGlzaworICogQGZpbHA6CWZpbGUgdG8gYmUgc3luY2VkCisgKiBAZGVudHJ5OglkZW50cnkgZGVzY3JpYmluZyB0aGUgZmlsZSB0byBzeW5jCisgKiBAZGF0YXN5bmM6CWlmIG5vbi16ZXJvIG9ubHkgZmx1c2ggdXNlciBkYXRhIGFuZCBub3QgbWV0YWRhdGEKKyAqCisgKiBEYXRhIGludGVncml0eSBzeW5jIG9mIGEgZmlsZSB0byBkaXNrLiAgVXNlZCBmb3IgZnN5bmMsIGZkYXRhc3luYywgYW5kIG1zeW5jCisgKiBzeXN0ZW0gY2FsbHMuICBUaGlzIGZ1bmN0aW9uIGlzIGluc3BpcmVkIGJ5IGZzL2J1ZmZlci5jOjpmaWxlX2ZzeW5jKCkuCisgKgorICogSWYgQGRhdGFzeW5jIGlzIGZhbHNlLCB3cml0ZSB0aGUgbWZ0IHJlY29yZCBhbmQgYWxsIGFzc29jaWF0ZWQgZXh0ZW50IG1mdAorICogcmVjb3JkcyBhcyB3ZWxsIGFzIHRoZSAkREFUQSBhdHRyaWJ1dGUgYW5kIHRoZW4gc3luYyB0aGUgYmxvY2sgZGV2aWNlLgorICoKKyAqIElmIEBkYXRhc3luYyBpcyB0cnVlIGFuZCB0aGUgYXR0cmlidXRlIGlzIG5vbi1yZXNpZGVudCwgd2Ugc2tpcCB0aGUgd3JpdGluZworICogb2YgdGhlIG1mdCByZWNvcmQgYW5kIGFsbCBhc3NvY2lhdGVkIGV4dGVudCBtZnQgcmVjb3JkcyAodGhpcyBtaWdodCBzdGlsbAorICogaGFwcGVuIGR1ZSB0byB0aGUgd3JpdGVfaW5vZGVfbm93KCkgY2FsbCkuCisgKgorICogQWxzbywgaWYgQGRhdGFzeW5jIGlzIHRydWUsIHdlIGRvIG5vdCB3YWl0IG9uIHRoZSBpbm9kZSB0byBiZSB3cml0dGVuIG91dAorICogYnV0IHdlIGFsd2F5cyB3YWl0IG9uIHRoZSBwYWdlIGNhY2hlIHBhZ2VzIHRvIGJlIHdyaXR0ZW4gb3V0LgorICoKKyAqIE5vdGU6IEluIHRoZSBwYXN0IEBmaWxwIGNvdWxkIGJlIE5VTEwgc28gd2UgaWdub3JlIGl0IGFzIHdlIGRvbid0IG5lZWQgaXQKKyAqIGFueXdheS4KKyAqCisgKiBMb2NraW5nOiBDYWxsZXIgbXVzdCBob2xkIGlfc2VtIG9uIHRoZSBpbm9kZS4KKyAqCisgKiBUT0RPOiBXZSBzaG91bGQgcHJvYmFibHkgYWxzbyB3cml0ZSBhbGwgYXR0cmlidXRlL2luZGV4IGlub2RlcyBhc3NvY2lhdGVkCisgKiB3aXRoIHRoaXMgaW5vZGUgYnV0IHNpbmNlIHdlIGhhdmUgbm8gc2ltcGxlIHdheSBvZiBnZXR0aW5nIHRvIHRoZW0gd2UgaWdub3JlCisgKiB0aGlzIHByb2JsZW0gZm9yIG5vdy4KKyAqLworc3RhdGljIGludCBudGZzX2ZpbGVfZnN5bmMoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJaW50IGRhdGFzeW5jKQoreworCXN0cnVjdCBpbm9kZSAqdmkgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IGVyciwgcmV0ID0gMDsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBpbm9kZSAweCVseC4iLCB2aS0+aV9pbm8pOworCUJVR19PTihTX0lTRElSKHZpLT5pX21vZGUpKTsKKwlpZiAoIWRhdGFzeW5jIHx8ICFOSW5vTm9uUmVzaWRlbnQoTlRGU19JKHZpKSkpCisJCXJldCA9IG50ZnNfd3JpdGVfaW5vZGUodmksIDEpOworCXdyaXRlX2lub2RlX25vdyh2aSwgIWRhdGFzeW5jKTsKKwllcnIgPSBzeW5jX2Jsb2NrZGV2KHZpLT5pX3NiLT5zX2JkZXYpOworCWlmICh1bmxpa2VseShlcnIgJiYgIXJldCkpCisJCXJldCA9IGVycjsKKwlpZiAobGlrZWx5KCFyZXQpKQorCQludGZzX2RlYnVnKCJEb25lLiIpOworCWVsc2UKKwkJbnRmc193YXJuaW5nKHZpLT5pX3NiLCAiRmFpbGVkIHRvIGYlc3N5bmMgaW5vZGUgMHglbHguICBFcnJvciAiCisJCQkJIiV1LiIsIGRhdGFzeW5jID8gImRhdGEiIDogIiIsIHZpLT5pX2lubywgLXJldCk7CisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmIC8qIE5URlNfUlcgKi8KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBudGZzX2ZpbGVfb3BzID0geworCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywJICAvKiBTZWVrIGluc2lkZSBmaWxlLiAqLworCS5yZWFkCQk9IGdlbmVyaWNfZmlsZV9yZWFkLAkgIC8qIFJlYWQgZnJvbSBmaWxlLiAqLworCS5haW9fcmVhZAk9IGdlbmVyaWNfZmlsZV9haW9fcmVhZCwgIC8qIEFzeW5jIHJlYWQgZnJvbSBmaWxlLiAqLworCS5yZWFkdgkJPSBnZW5lcmljX2ZpbGVfcmVhZHYsCSAgLyogUmVhZCBmcm9tIGZpbGUuICovCisjaWZkZWYgTlRGU19SVworCS53cml0ZQkJPSBnZW5lcmljX2ZpbGVfd3JpdGUsCSAgLyogV3JpdGUgdG8gZmlsZS4gKi8KKwkuYWlvX3dyaXRlCT0gZ2VuZXJpY19maWxlX2Fpb193cml0ZSwgLyogQXN5bmMgd3JpdGUgdG8gZmlsZS4gKi8KKwkud3JpdGV2CQk9IGdlbmVyaWNfZmlsZV93cml0ZXYsCSAgLyogV3JpdGUgdG8gZmlsZS4gKi8KKwkvKi5yZWxlYXNlCT0gLCovCQkJICAvKiBMYXN0IGZpbGUgaXMgY2xvc2VkLiAgU2VlCisJCQkJCQkgICAgIGZzL2V4dDIvZmlsZS5jOjoKKwkJCQkJCSAgICAgZXh0Ml9yZWxlYXNlX2ZpbGUoKSBmb3IKKwkJCQkJCSAgICAgaG93IHRvIHVzZSB0aGlzIHRvIGRpc2NhcmQKKwkJCQkJCSAgICAgcHJlYWxsb2NhdGVkIHNwYWNlIGZvcgorCQkJCQkJICAgICB3cml0ZSBvcGVuZWQgZmlsZXMuICovCisJLmZzeW5jCQk9IG50ZnNfZmlsZV9mc3luYywJICAvKiBTeW5jIGEgZmlsZSB0byBkaXNrLiAqLworCS8qLmFpb19mc3luYwk9ICwqLwkJCSAgLyogU3luYyBhbGwgb3V0c3RhbmRpbmcgYXN5bmMKKwkJCQkJCSAgICAgaS9vIG9wZXJhdGlvbnMgb24gYQorCQkJCQkJICAgICBraW9jYi4gKi8KKyNlbmRpZiAvKiBOVEZTX1JXICovCisJLyouaW9jdGwJPSAsKi8JCQkgIC8qIFBlcmZvcm0gZnVuY3Rpb24gb24gdGhlCisJCQkJCQkgICAgIG1vdW50ZWQgZmlsZXN5c3RlbS4gKi8KKwkubW1hcAkJPSBnZW5lcmljX2ZpbGVfbW1hcCwJICAvKiBNbWFwIGZpbGUuICovCisJLm9wZW4JCT0gbnRmc19maWxlX29wZW4sCSAgLyogT3BlbiBmaWxlLiAqLworCS5zZW5kZmlsZQk9IGdlbmVyaWNfZmlsZV9zZW5kZmlsZSwgIC8qIFplcm8tY29weSBkYXRhIHNlbmQgd2l0aAorCQkJCQkJICAgICB0aGUgZGF0YSBzb3VyY2UgYmVpbmcgb24KKwkJCQkJCSAgICAgdGhlIG50ZnMgcGFydGl0aW9uLiAgV2UKKwkJCQkJCSAgICAgZG8gbm90IG5lZWQgdG8gY2FyZSBhYm91dAorCQkJCQkJICAgICB0aGUgZGF0YSBkZXN0aW5hdGlvbi4gKi8KKwkvKi5zZW5kcGFnZQk9ICwqLwkJCSAgLyogWmVyby1jb3B5IGRhdGEgc2VuZCB3aXRoCisJCQkJCQkgICAgIHRoZSBkYXRhIGRlc3RpbmF0aW9uIGJlaW5nCisJCQkJCQkgICAgIG9uIHRoZSBudGZzIHBhcnRpdGlvbi4gIFdlCisJCQkJCQkgICAgIGRvIG5vdCBuZWVkIHRvIGNhcmUgYWJvdXQKKwkJCQkJCSAgICAgdGhlIGRhdGEgc291cmNlLiAqLworfTsKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgbnRmc19maWxlX2lub2RlX29wcyA9IHsKKyNpZmRlZiBOVEZTX1JXCisJLnRydW5jYXRlCT0gbnRmc190cnVuY2F0ZV92ZnMsCisJLnNldGF0dHIJPSBudGZzX3NldGF0dHIsCisjZW5kaWYgLyogTlRGU19SVyAqLworfTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBudGZzX2VtcHR5X2ZpbGVfb3BzID0ge307CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIG50ZnNfZW1wdHlfaW5vZGVfb3BzID0ge307CmRpZmYgLS1naXQgYS9mcy9udGZzL2luZGV4LmMgYi9mcy9udGZzL2luZGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFiZDJjZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvaW5kZXguYwpAQCAtMCwwICsxLDQ2MSBAQAorLyoKKyAqIGluZGV4LmMgLSBOVEZTIGtlcm5lbCBpbmRleCBoYW5kbGluZy4gIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgImFvcHMuaCIKKyNpbmNsdWRlICJjb2xsYXRlLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJpbmRleC5oIgorI2luY2x1ZGUgIm50ZnMuaCIKKworLyoqCisgKiBudGZzX2luZGV4X2N0eF9nZXQgLSBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBpbmRleCBjb250ZXh0CisgKiBAaWR4X25pOgludGZzIGluZGV4IGlub2RlIHdpdGggd2hpY2ggdG8gaW5pdGlhbGl6ZSB0aGUgY29udGV4dAorICoKKyAqIEFsbG9jYXRlIGEgbmV3IGluZGV4IGNvbnRleHQsIGluaXRpYWxpemUgaXQgd2l0aCBAaWR4X25pIGFuZCByZXR1cm4gaXQuCisgKiBSZXR1cm4gTlVMTCBpZiBhbGxvY2F0aW9uIGZhaWxlZC4KKyAqCisgKiBMb2NraW5nOiAgQ2FsbGVyIG11c3QgaG9sZCBpX3NlbSBvbiB0aGUgaW5kZXggaW5vZGUuCisgKi8KK250ZnNfaW5kZXhfY29udGV4dCAqbnRmc19pbmRleF9jdHhfZ2V0KG50ZnNfaW5vZGUgKmlkeF9uaSkKK3sKKwludGZzX2luZGV4X2NvbnRleHQgKmljdHg7CisKKwlpY3R4ID0ga21lbV9jYWNoZV9hbGxvYyhudGZzX2luZGV4X2N0eF9jYWNoZSwgU0xBQl9OT0ZTKTsKKwlpZiAoaWN0eCkgeworCQlpY3R4LT5pZHhfbmkgPSBpZHhfbmk7CisJCWljdHgtPmVudHJ5ID0gTlVMTDsKKwkJaWN0eC0+ZGF0YSA9IE5VTEw7CisJCWljdHgtPmRhdGFfbGVuID0gMDsKKwkJaWN0eC0+aXNfaW5fcm9vdCA9IDA7CisJCWljdHgtPmlyID0gTlVMTDsKKwkJaWN0eC0+YWN0eCA9IE5VTEw7CisJCWljdHgtPmJhc2VfbmkgPSBOVUxMOworCQlpY3R4LT5pYSA9IE5VTEw7CisJCWljdHgtPnBhZ2UgPSBOVUxMOworCX0KKwlyZXR1cm4gaWN0eDsKK30KKworLyoqCisgKiBudGZzX2luZGV4X2N0eF9wdXQgLSByZWxlYXNlIGFuIGluZGV4IGNvbnRleHQKKyAqIEBpY3R4OglpbmRleCBjb250ZXh0IHRvIGZyZWUKKyAqCisgKiBSZWxlYXNlIHRoZSBpbmRleCBjb250ZXh0IEBpY3R4LCByZWxlYXNpbmcgYWxsIGFzc29jaWF0ZWQgcmVzb3VyY2VzLgorICoKKyAqIExvY2tpbmc6ICBDYWxsZXIgbXVzdCBob2xkIGlfc2VtIG9uIHRoZSBpbmRleCBpbm9kZS4KKyAqLwordm9pZCBudGZzX2luZGV4X2N0eF9wdXQobnRmc19pbmRleF9jb250ZXh0ICppY3R4KQoreworCWlmIChpY3R4LT5lbnRyeSkgeworCQlpZiAoaWN0eC0+aXNfaW5fcm9vdCkgeworCQkJaWYgKGljdHgtPmFjdHgpCisJCQkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGljdHgtPmFjdHgpOworCQkJaWYgKGljdHgtPmJhc2VfbmkpCisJCQkJdW5tYXBfbWZ0X3JlY29yZChpY3R4LT5iYXNlX25pKTsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBwYWdlICpwYWdlID0gaWN0eC0+cGFnZTsKKwkJCWlmIChwYWdlKSB7CisJCQkJQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKKwkJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJCQl9CisJCX0KKwl9CisJa21lbV9jYWNoZV9mcmVlKG50ZnNfaW5kZXhfY3R4X2NhY2hlLCBpY3R4KTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogbnRmc19pbmRleF9sb29rdXAgLSBmaW5kIGEga2V5IGluIGFuIGluZGV4IGFuZCByZXR1cm4gaXRzIGluZGV4IGVudHJ5CisgKiBAa2V5OglbSU5dIGtleSBmb3Igd2hpY2ggdG8gc2VhcmNoIGluIHRoZSBpbmRleAorICogQGtleV9sZW46CVtJTl0gbGVuZ3RoIG9mIEBrZXkgaW4gYnl0ZXMKKyAqIEBpY3R4OglbSU4vT1VUXSBjb250ZXh0IGRlc2NyaWJpbmcgdGhlIGluZGV4IGFuZCB0aGUgcmV0dXJuZWQgZW50cnkKKyAqCisgKiBCZWZvcmUgY2FsbGluZyBudGZzX2luZGV4X2xvb2t1cCgpLCBAaWN0eCBtdXN0IGhhdmUgYmVlbiBvYnRhaW5lZCBmcm9tIGEKKyAqIGNhbGwgdG8gbnRmc19pbmRleF9jdHhfZ2V0KCkuCisgKgorICogTG9vayBmb3IgdGhlIEBrZXkgaW4gdGhlIGluZGV4IHNwZWNpZmllZCBieSB0aGUgaW5kZXggbG9va3VwIGNvbnRleHQgQGljdHguCisgKiBudGZzX2luZGV4X2xvb2t1cCgpIHdhbGtzIHRoZSBjb250ZW50cyBvZiB0aGUgaW5kZXggbG9va2luZyBmb3IgdGhlIEBrZXkuCisgKgorICogSWYgdGhlIEBrZXkgaXMgZm91bmQgaW4gdGhlIGluZGV4LCAwIGlzIHJldHVybmVkIGFuZCBAaWN0eCBpcyBzZXR1cCB0bworICogZGVzY3JpYmUgdGhlIGluZGV4IGVudHJ5IGNvbnRhaW5pbmcgdGhlIG1hdGNoaW5nIEBrZXkuICBAaWN0eC0+ZW50cnkgaXMgdGhlCisgKiBpbmRleCBlbnRyeSBhbmQgQGljdHgtPmRhdGEgYW5kIEBpY3R4LT5kYXRhX2xlbiBhcmUgdGhlIGluZGV4IGVudHJ5IGRhdGEgYW5kCisgKiBpdHMgbGVuZ3RoIGluIGJ5dGVzLCByZXNwZWN0aXZlbHkuCisgKgorICogSWYgdGhlIEBrZXkgaXMgbm90IGZvdW5kIGluIHRoZSBpbmRleCwgLUVOT0VOVCBpcyByZXR1cm5lZCBhbmQgQGljdHggaXMKKyAqIHNldHVwIHRvIGRlc2NyaWJlIHRoZSBpbmRleCBlbnRyeSB3aG9zZSBrZXkgY29sbGF0ZXMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlCisgKiBzZWFyY2ggQGtleSwgaS5lLiB0aGlzIGlzIHRoZSBwb3NpdGlvbiBpbiB0aGUgaW5kZXggYXQgd2hpY2ggYW4gaW5kZXggZW50cnkKKyAqIHdpdGggYSBrZXkgb2YgQGtleSB3b3VsZCBuZWVkIHRvIGJlIGluc2VydGVkLgorICoKKyAqIElmIGFuIGVycm9yIG9jY3VycyByZXR1cm4gdGhlIG5lZ2F0aXZlIGVycm9yIGNvZGUgYW5kIEBpY3R4IGlzIGxlZnQKKyAqIHVudG91Y2hlZC4KKyAqCisgKiBXaGVuIGZpbmlzaGVkIHdpdGggdGhlIGVudHJ5IGFuZCBpdHMgZGF0YSwgY2FsbCBudGZzX2luZGV4X2N0eF9wdXQoKSB0byBmcmVlCisgKiB0aGUgY29udGV4dCBhbmQgb3RoZXIgYXNzb2NpYXRlZCByZXNvdXJjZXMuCisgKgorICogSWYgdGhlIGluZGV4IGVudHJ5IHdhcyBtb2RpZmllZCwgY2FsbCBmbHVzaF9kY2FjaGVfaW5kZXhfZW50cnlfcGFnZSgpCisgKiBpbW1lZGlhdGVseSBhZnRlciB0aGUgbW9kaWZpY2F0aW9uIGFuZCBlaXRoZXIgbnRmc19pbmRleF9lbnRyeV9tYXJrX2RpcnR5KCkKKyAqIG9yIG50ZnNfaW5kZXhfZW50cnlfd3JpdGUoKSBiZWZvcmUgdGhlIGNhbGwgdG8gbnRmc19pbmRleF9jdHhfcHV0KCkgdG8KKyAqIGVuc3VyZSB0aGF0IHRoZSBjaGFuZ2VzIGFyZSB3cml0dGVuIHRvIGRpc2suCisgKgorICogTG9ja2luZzogIC0gQ2FsbGVyIG11c3QgaG9sZCBpX3NlbSBvbiB0aGUgaW5kZXggaW5vZGUuCisgKgkgICAgIC0gRWFjaCBwYWdlIGNhY2hlIHBhZ2UgaW4gdGhlIGluZGV4IGFsbG9jYXRpb24gbWFwcGluZyBtdXN0IGJlCisgKgkgICAgICAgbG9ja2VkIHdoaWxzdCBiZWluZyBhY2Nlc3NlZCBvdGhlcndpc2Ugd2UgbWF5IGZpbmQgYSBjb3JydXB0CisgKgkgICAgICAgcGFnZSBkdWUgdG8gaXQgYmVpbmcgdW5kZXIgLT53cml0ZXBhZ2UgYXQgdGhlIG1vbWVudCB3aGljaAorICoJICAgICAgIGFwcGxpZXMgdGhlIG1zdCBwcm90ZWN0aW9uIGZpeHVwcyBiZWZvcmUgd3JpdGluZyBvdXQgYW5kIHRoZW4KKyAqCSAgICAgICByZW1vdmVzIHRoZW0gYWdhaW4gYWZ0ZXIgdGhlIHdyaXRlIGlzIGNvbXBsZXRlIGFmdGVyIHdoaWNoIGl0IAorICoJICAgICAgIHVubG9ja3MgdGhlIHBhZ2UuCisgKi8KK2ludCBudGZzX2luZGV4X2xvb2t1cChjb25zdCB2b2lkICprZXksIGNvbnN0IGludCBrZXlfbGVuLAorCQludGZzX2luZGV4X2NvbnRleHQgKmljdHgpCit7CisJVkNOIHZjbiwgb2xkX3ZjbjsKKwludGZzX2lub2RlICppZHhfbmkgPSBpY3R4LT5pZHhfbmk7CisJbnRmc192b2x1bWUgKnZvbCA9IGlkeF9uaS0+dm9sOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSB2b2wtPnNiOworCW50ZnNfaW5vZGUgKmJhc2VfbmkgPSBpZHhfbmktPmV4dC5iYXNlX250ZnNfaW5vOworCU1GVF9SRUNPUkQgKm07CisJSU5ERVhfUk9PVCAqaXI7CisJSU5ERVhfRU5UUlkgKmllOworCUlOREVYX0FMTE9DQVRJT04gKmlhOworCXU4ICppbmRleF9lbmQsICprYWRkcjsKKwludGZzX2F0dHJfc2VhcmNoX2N0eCAqYWN0eDsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqaWFfbWFwcGluZzsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlpbnQgcmMsIGVyciA9IDA7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwlCVUdfT04oIU5Jbm9BdHRyKGlkeF9uaSkpOworCUJVR19PTihpZHhfbmktPnR5cGUgIT0gQVRfSU5ERVhfQUxMT0NBVElPTik7CisJQlVHX09OKGlkeF9uaS0+bnJfZXh0ZW50cyAhPSAtMSk7CisJQlVHX09OKCFiYXNlX25pKTsKKwlCVUdfT04oIWtleSk7CisJQlVHX09OKGtleV9sZW4gPD0gMCk7CisJaWYgKCFudGZzX2lzX2NvbGxhdGlvbl9ydWxlX3N1cHBvcnRlZCgKKwkJCWlkeF9uaS0+aXR5cGUuaW5kZXguY29sbGF0aW9uX3J1bGUpKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJJbmRleCB1c2VzIHVuc3VwcG9ydGVkIGNvbGxhdGlvbiBydWxlIDB4JXguICAiCisJCQkJIkFib3J0aW5nIGxvb2t1cC4iLCBsZTMyX3RvX2NwdSgKKwkJCQlpZHhfbmktPml0eXBlLmluZGV4LmNvbGxhdGlvbl9ydWxlKSk7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisJLyogR2V0IGhvbGQgb2YgdGhlIG1mdCByZWNvcmQgZm9yIHRoZSBpbmRleCBpbm9kZS4gKi8KKwltID0gbWFwX21mdF9yZWNvcmQoYmFzZV9uaSk7CisJaWYgKElTX0VSUihtKSkgeworCQludGZzX2Vycm9yKHNiLCAibWFwX21mdF9yZWNvcmQoKSBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVsZC4iLAorCQkJCS1QVFJfRVJSKG0pKTsKKwkJcmV0dXJuIFBUUl9FUlIobSk7CisJfQorCWFjdHggPSBudGZzX2F0dHJfZ2V0X3NlYXJjaF9jdHgoYmFzZV9uaSwgbSk7CisJaWYgKHVubGlrZWx5KCFhY3R4KSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQ7CisJfQorCS8qIEZpbmQgdGhlIGluZGV4IHJvb3QgYXR0cmlidXRlIGluIHRoZSBtZnQgcmVjb3JkLiAqLworCWVyciA9IG50ZnNfYXR0cl9sb29rdXAoQVRfSU5ERVhfUk9PVCwgaWR4X25pLT5uYW1lLCBpZHhfbmktPm5hbWVfbGVuLAorCQkJQ0FTRV9TRU5TSVRJVkUsIDAsIE5VTEwsIDAsIGFjdHgpOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCWlmIChlcnIgPT0gLUVOT0VOVCkgeworCQkJbnRmc19lcnJvcihzYiwgIkluZGV4IHJvb3QgYXR0cmlidXRlIG1pc3NpbmcgaW4gaW5vZGUgIgorCQkJCQkiMHglbHguIiwgaWR4X25pLT5tZnRfbm8pOworCQkJZXJyID0gLUVJTzsKKwkJfQorCQlnb3RvIGVycl9vdXQ7CisJfQorCS8qIEdldCB0byB0aGUgaW5kZXggcm9vdCB2YWx1ZSAoaXQgaGFzIGJlZW4gdmVyaWZpZWQgaW4gcmVhZF9pbm9kZSkuICovCisJaXIgPSAoSU5ERVhfUk9PVCopKCh1OCopYWN0eC0+YXR0ciArCisJCQlsZTE2X3RvX2NwdShhY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCkpOworCWluZGV4X2VuZCA9ICh1OCopJmlyLT5pbmRleCArIGxlMzJfdG9fY3B1KGlyLT5pbmRleC5pbmRleF9sZW5ndGgpOworCS8qIFRoZSBmaXJzdCBpbmRleCBlbnRyeS4gKi8KKwlpZSA9IChJTkRFWF9FTlRSWSopKCh1OCopJmlyLT5pbmRleCArCisJCQlsZTMyX3RvX2NwdShpci0+aW5kZXguZW50cmllc19vZmZzZXQpKTsKKwkvKgorCSAqIExvb3AgdW50aWwgd2UgZXhjZWVkIHZhbGlkIG1lbW9yeSAoY29ycnVwdGlvbiBjYXNlKSBvciB1bnRpbCB3ZQorCSAqIHJlYWNoIHRoZSBsYXN0IGVudHJ5LgorCSAqLworCWZvciAoOzsgaWUgPSAoSU5ERVhfRU5UUlkqKSgodTgqKWllICsgbGUxNl90b19jcHUoaWUtPmxlbmd0aCkpKSB7CisJCS8qIEJvdW5kcyBjaGVja3MuICovCisJCWlmICgodTgqKWllIDwgKHU4KilhY3R4LT5tcmVjIHx8ICh1OCopaWUgKworCQkJCXNpemVvZihJTkRFWF9FTlRSWV9IRUFERVIpID4gaW5kZXhfZW5kIHx8CisJCQkJKHU4KilpZSArIGxlMTZfdG9fY3B1KGllLT5sZW5ndGgpID4gaW5kZXhfZW5kKQorCQkJZ290byBpZHhfZXJyX291dDsKKwkJLyoKKwkJICogVGhlIGxhc3QgZW50cnkgY2Fubm90IGNvbnRhaW4gYSBrZXkuICBJdCBjYW4gaG93ZXZlciBjb250YWluCisJCSAqIGEgcG9pbnRlciB0byBhIGNoaWxkIG5vZGUgaW4gdGhlIEIrdHJlZSBzbyB3ZSBqdXN0IGJyZWFrIG91dC4KKwkJICovCisJCWlmIChpZS0+ZmxhZ3MgJiBJTkRFWF9FTlRSWV9FTkQpCisJCQlicmVhazsKKwkJLyogRnVydGhlciBib3VuZHMgY2hlY2tzLiAqLworCQlpZiAoKHUzMilzaXplb2YoSU5ERVhfRU5UUllfSEVBREVSKSArCisJCQkJbGUxNl90b19jcHUoaWUtPmtleV9sZW5ndGgpID4KKwkJCQlsZTE2X3RvX2NwdShpZS0+ZGF0YS52aS5kYXRhX29mZnNldCkgfHwKKwkJCQkodTMyKWxlMTZfdG9fY3B1KGllLT5kYXRhLnZpLmRhdGFfb2Zmc2V0KSArCisJCQkJbGUxNl90b19jcHUoaWUtPmRhdGEudmkuZGF0YV9sZW5ndGgpID4KKwkJCQlsZTE2X3RvX2NwdShpZS0+bGVuZ3RoKSkKKwkJCWdvdG8gaWR4X2Vycl9vdXQ7CisJCS8qIElmIHRoZSBrZXlzIG1hdGNoIHBlcmZlY3RseSwgd2Ugc2V0dXAgQGljdHggYW5kIHJldHVybiAwLiAqLworCQlpZiAoKGtleV9sZW4gPT0gbGUxNl90b19jcHUoaWUtPmtleV9sZW5ndGgpKSAmJiAhbWVtY21wKGtleSwKKwkJCQkmaWUtPmtleSwga2V5X2xlbikpIHsKK2lyX2RvbmU6CisJCQlpY3R4LT5pc19pbl9yb290ID0gVFJVRTsKKwkJCWljdHgtPmFjdHggPSBhY3R4OworCQkJaWN0eC0+YmFzZV9uaSA9IGJhc2Vfbmk7CisJCQlpY3R4LT5pYSA9IE5VTEw7CisJCQlpY3R4LT5wYWdlID0gTlVMTDsKK2RvbmU6CisJCQlpY3R4LT5lbnRyeSA9IGllOworCQkJaWN0eC0+ZGF0YSA9ICh1OCopaWUgKworCQkJCQlsZTE2X3RvX2NwdShpZS0+ZGF0YS52aS5kYXRhX29mZnNldCk7CisJCQlpY3R4LT5kYXRhX2xlbiA9IGxlMTZfdG9fY3B1KGllLT5kYXRhLnZpLmRhdGFfbGVuZ3RoKTsKKwkJCW50ZnNfZGVidWcoIkRvbmUuIik7CisJCQlyZXR1cm4gZXJyOworCQl9CisJCS8qCisJCSAqIE5vdCBhIHBlcmZlY3QgbWF0Y2gsIG5lZWQgdG8gZG8gZnVsbCBibG93biBjb2xsYXRpb24gc28gd2UKKwkJICoga25vdyB3aGljaCB3YXkgaW4gdGhlIEIrdHJlZSB3ZSBoYXZlIHRvIGdvLgorCQkgKi8KKwkJcmMgPSBudGZzX2NvbGxhdGUodm9sLCBpZHhfbmktPml0eXBlLmluZGV4LmNvbGxhdGlvbl9ydWxlLCBrZXksCisJCQkJa2V5X2xlbiwgJmllLT5rZXksIGxlMTZfdG9fY3B1KGllLT5rZXlfbGVuZ3RoKSk7CisJCS8qCisJCSAqIElmIEBrZXkgY29sbGF0ZXMgYmVmb3JlIHRoZSBrZXkgb2YgdGhlIGN1cnJlbnQgZW50cnksIHRoZXJlCisJCSAqIGlzIGRlZmluaXRlbHkgbm8gc3VjaCBrZXkgaW4gdGhpcyBpbmRleCBidXQgd2UgbWlnaHQgbmVlZCB0bworCQkgKiBkZXNjZW5kIGludG8gdGhlIEIrdHJlZSBzbyB3ZSBqdXN0IGJyZWFrIG91dCBvZiB0aGUgbG9vcC4KKwkJICovCisJCWlmIChyYyA9PSAtMSkKKwkJCWJyZWFrOworCQkvKgorCQkgKiBBIG1hdGNoIHNob3VsZCBuZXZlciBoYXBwZW4gYXMgdGhlIG1lbWNtcCgpIGNhbGwgc2hvdWxkIGhhdmUKKwkJICogY291Z2h0IGl0LCBidXQgd2Ugc3RpbGwgdHJlYXQgaXQgY29ycmVjdGx5LgorCQkgKi8KKwkJaWYgKCFyYykKKwkJCWdvdG8gaXJfZG9uZTsKKwkJLyogVGhlIGtleXMgYXJlIG5vdCBlcXVhbCwgY29udGludWUgdGhlIHNlYXJjaC4gKi8KKwl9CisJLyoKKwkgKiBXZSBoYXZlIGZpbmlzaGVkIHdpdGggdGhpcyBpbmRleCB3aXRob3V0IHN1Y2Nlc3MuICBDaGVjayBmb3IgdGhlCisJICogcHJlc2VuY2Ugb2YgYSBjaGlsZCBub2RlIGFuZCBpZiBub3QgcHJlc2VudCBzZXR1cCBAaWN0eCBhbmQgcmV0dXJuCisJICogLUVOT0VOVC4KKwkgKi8KKwlpZiAoIShpZS0+ZmxhZ3MgJiBJTkRFWF9FTlRSWV9OT0RFKSkgeworCQludGZzX2RlYnVnKCJFbnRyeSBub3QgZm91bmQuIik7CisJCWVyciA9IC1FTk9FTlQ7CisJCWdvdG8gaXJfZG9uZTsKKwl9IC8qIENoaWxkIG5vZGUgcHJlc2VudCwgZGVzY2VuZCBpbnRvIGl0LiAqLworCS8qIENvbnNpc3RlbmN5IGNoZWNrOiBWZXJpZnkgdGhhdCBhbiBpbmRleCBhbGxvY2F0aW9uIGV4aXN0cy4gKi8KKwlpZiAoIU5Jbm9JbmRleEFsbG9jUHJlc2VudChpZHhfbmkpKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJObyBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZSBidXQgaW5kZXggZW50cnkgIgorCQkJCSJyZXF1aXJlcyBvbmUuICBJbm9kZSAweCVseCBpcyBjb3JydXB0IG9yICIKKwkJCQkiZHJpdmVyIGJ1Zy4iLCBpZHhfbmktPm1mdF9ubyk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJLyogR2V0IHRoZSBzdGFydGluZyB2Y24gb2YgdGhlIGluZGV4X2Jsb2NrIGhvbGRpbmcgdGhlIGNoaWxkIG5vZGUuICovCisJdmNuID0gc2xlNjRfdG9fY3B1cCgoc2xlNjQqKSgodTgqKWllICsgbGUxNl90b19jcHUoaWUtPmxlbmd0aCkgLSA4KSk7CisJaWFfbWFwcGluZyA9IFZGU19JKGlkeF9uaSktPmlfbWFwcGluZzsKKwkvKgorCSAqIFdlIGFyZSBkb25lIHdpdGggdGhlIGluZGV4IHJvb3QgYW5kIHRoZSBtZnQgcmVjb3JkLiAgUmVsZWFzZSB0aGVtLAorCSAqIG90aGVyd2lzZSB3ZSBkZWFkbG9jayB3aXRoIG50ZnNfbWFwX3BhZ2UoKS4KKwkgKi8KKwludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoYWN0eCk7CisJdW5tYXBfbWZ0X3JlY29yZChiYXNlX25pKTsKKwltID0gTlVMTDsKKwlhY3R4ID0gTlVMTDsKK2Rlc2NlbmRfaW50b19jaGlsZF9ub2RlOgorCS8qCisJICogQ29udmVydCB2Y24gdG8gaW5kZXggaW50byB0aGUgaW5kZXggYWxsb2NhdGlvbiBhdHRyaWJ1dGUgaW4gdW5pdHMKKwkgKiBvZiBQQUdFX0NBQ0hFX1NJWkUgYW5kIG1hcCB0aGUgcGFnZSBjYWNoZSBwYWdlLCByZWFkaW5nIGl0IGZyb20KKwkgKiBkaXNrIGlmIG5lY2Vzc2FyeS4KKwkgKi8KKwlwYWdlID0gbnRmc19tYXBfcGFnZShpYV9tYXBwaW5nLCB2Y24gPDwKKwkJCWlkeF9uaS0+aXR5cGUuaW5kZXgudmNuX3NpemVfYml0cyA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwlpZiAoSVNfRVJSKHBhZ2UpKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gbWFwIGluZGV4IHBhZ2UsIGVycm9yICVsZC4iLAorCQkJCS1QVFJfRVJSKHBhZ2UpKTsKKwkJZXJyID0gUFRSX0VSUihwYWdlKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwlsb2NrX3BhZ2UocGFnZSk7CisJa2FkZHIgPSAodTgqKXBhZ2VfYWRkcmVzcyhwYWdlKTsKK2Zhc3RfZGVzY2VuZF9pbnRvX2NoaWxkX25vZGU6CisJLyogR2V0IHRvIHRoZSBpbmRleCBhbGxvY2F0aW9uIGJsb2NrLiAqLworCWlhID0gKElOREVYX0FMTE9DQVRJT04qKShrYWRkciArICgodmNuIDw8CisJCQlpZHhfbmktPml0eXBlLmluZGV4LnZjbl9zaXplX2JpdHMpICYgflBBR0VfQ0FDSEVfTUFTSykpOworCS8qIEJvdW5kcyBjaGVja3MuICovCisJaWYgKCh1OCopaWEgPCBrYWRkciB8fCAodTgqKWlhID4ga2FkZHIgKyBQQUdFX0NBQ0hFX1NJWkUpIHsKKwkJbnRmc19lcnJvcihzYiwgIk91dCBvZiBib3VuZHMgY2hlY2sgZmFpbGVkLiAgQ29ycnVwdCBpbm9kZSAiCisJCQkJIjB4JWx4IG9yIGRyaXZlciBidWcuIiwgaWR4X25pLT5tZnRfbm8pOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwkvKiBDYXRjaCBtdWx0aSBzZWN0b3IgdHJhbnNmZXIgZml4dXAgZXJyb3JzLiAqLworCWlmICh1bmxpa2VseSghbnRmc19pc19pbmR4X3JlY29yZChpYS0+bWFnaWMpKSkgeworCQludGZzX2Vycm9yKHNiLCAiSW5kZXggcmVjb3JkIHdpdGggdmNuIDB4JWxseCBpcyBjb3JydXB0LiAgIgorCQkJCSJDb3JydXB0IGlub2RlIDB4JWx4LiAgUnVuIGNoa2Rzay4iLAorCQkJCShsb25nIGxvbmcpdmNuLCBpZHhfbmktPm1mdF9ubyk7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCWlmIChzbGU2NF90b19jcHUoaWEtPmluZGV4X2Jsb2NrX3ZjbikgIT0gdmNuKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJBY3R1YWwgVkNOICgweCVsbHgpIG9mIGluZGV4IGJ1ZmZlciBpcyAiCisJCQkJImRpZmZlcmVudCBmcm9tIGV4cGVjdGVkIFZDTiAoMHglbGx4KS4gIElub2RlICIKKwkJCQkiMHglbHggaXMgY29ycnVwdCBvciBkcml2ZXIgYnVnLiIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQlzbGU2NF90b19jcHUoaWEtPmluZGV4X2Jsb2NrX3ZjbiksCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2Y24sIGlkeF9uaS0+bWZ0X25vKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJaWYgKGxlMzJfdG9fY3B1KGlhLT5pbmRleC5hbGxvY2F0ZWRfc2l6ZSkgKyAweDE4ICE9CisJCQlpZHhfbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUpIHsKKwkJbnRmc19lcnJvcihzYiwgIkluZGV4IGJ1ZmZlciAoVkNOIDB4JWxseCkgb2YgaW5vZGUgMHglbHggaGFzICIKKwkJCQkiYSBzaXplICgldSkgZGlmZmVyaW5nIGZyb20gdGhlIGluZGV4ICIKKwkJCQkic3BlY2lmaWVkIHNpemUgKCV1KS4gIElub2RlIGlzIGNvcnJ1cHQgb3IgIgorCQkJCSJkcml2ZXIgYnVnLiIsICh1bnNpZ25lZCBsb25nIGxvbmcpdmNuLAorCQkJCWlkeF9uaS0+bWZ0X25vLAorCQkJCWxlMzJfdG9fY3B1KGlhLT5pbmRleC5hbGxvY2F0ZWRfc2l6ZSkgKyAweDE4LAorCQkJCWlkeF9uaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSk7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCWluZGV4X2VuZCA9ICh1OCopaWEgKyBpZHhfbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemU7CisJaWYgKGluZGV4X2VuZCA+IGthZGRyICsgUEFHRV9DQUNIRV9TSVpFKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJJbmRleCBidWZmZXIgKFZDTiAweCVsbHgpIG9mIGlub2RlIDB4JWx4ICIKKwkJCQkiY3Jvc3NlcyBwYWdlIGJvdW5kYXJ5LiAgSW1wb3NzaWJsZSEgIENhbm5vdCAiCisJCQkJImFjY2VzcyEgIFRoaXMgaXMgcHJvYmFibHkgYSBidWcgaW4gdGhlICIKKwkJCQkiZHJpdmVyLiIsICh1bnNpZ25lZCBsb25nIGxvbmcpdmNuLAorCQkJCWlkeF9uaS0+bWZ0X25vKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJaW5kZXhfZW5kID0gKHU4KikmaWEtPmluZGV4ICsgbGUzMl90b19jcHUoaWEtPmluZGV4LmluZGV4X2xlbmd0aCk7CisJaWYgKGluZGV4X2VuZCA+ICh1OCopaWEgKyBpZHhfbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUpIHsKKwkJbnRmc19lcnJvcihzYiwgIlNpemUgb2YgaW5kZXggYnVmZmVyIChWQ04gMHglbGx4KSBvZiBpbm9kZSAiCisJCQkJIjB4JWx4IGV4Y2VlZHMgbWF4aW11bSBzaXplLiIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2Y24sIGlkeF9uaS0+bWZ0X25vKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJLyogVGhlIGZpcnN0IGluZGV4IGVudHJ5LiAqLworCWllID0gKElOREVYX0VOVFJZKikoKHU4KikmaWEtPmluZGV4ICsKKwkJCWxlMzJfdG9fY3B1KGlhLT5pbmRleC5lbnRyaWVzX29mZnNldCkpOworCS8qCisJICogSXRlcmF0ZSBzaW1pbGFyIHRvIGFib3ZlIGJpZyBsb29wIGJ1dCBhcHBsaWVkIHRvIGluZGV4IGJ1ZmZlciwgdGh1cworCSAqIGxvb3AgdW50aWwgd2UgZXhjZWVkIHZhbGlkIG1lbW9yeSAoY29ycnVwdGlvbiBjYXNlKSBvciB1bnRpbCB3ZQorCSAqIHJlYWNoIHRoZSBsYXN0IGVudHJ5LgorCSAqLworCWZvciAoOzsgaWUgPSAoSU5ERVhfRU5UUlkqKSgodTgqKWllICsgbGUxNl90b19jcHUoaWUtPmxlbmd0aCkpKSB7CisJCS8qIEJvdW5kcyBjaGVja3MuICovCisJCWlmICgodTgqKWllIDwgKHU4KilpYSB8fCAodTgqKWllICsKKwkJCQlzaXplb2YoSU5ERVhfRU5UUllfSEVBREVSKSA+IGluZGV4X2VuZCB8fAorCQkJCSh1OCopaWUgKyBsZTE2X3RvX2NwdShpZS0+bGVuZ3RoKSA+IGluZGV4X2VuZCkgeworCQkJbnRmc19lcnJvcihzYiwgIkluZGV4IGVudHJ5IG91dCBvZiBib3VuZHMgaW4gaW5vZGUgIgorCQkJCQkiMHglbHguIiwgaWR4X25pLT5tZnRfbm8pOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQkvKgorCQkgKiBUaGUgbGFzdCBlbnRyeSBjYW5ub3QgY29udGFpbiBhIGtleS4gIEl0IGNhbiBob3dldmVyIGNvbnRhaW4KKwkJICogYSBwb2ludGVyIHRvIGEgY2hpbGQgbm9kZSBpbiB0aGUgQit0cmVlIHNvIHdlIGp1c3QgYnJlYWsgb3V0LgorCQkgKi8KKwkJaWYgKGllLT5mbGFncyAmIElOREVYX0VOVFJZX0VORCkKKwkJCWJyZWFrOworCQkvKiBGdXJ0aGVyIGJvdW5kcyBjaGVja3MuICovCisJCWlmICgodTMyKXNpemVvZihJTkRFWF9FTlRSWV9IRUFERVIpICsKKwkJCQlsZTE2X3RvX2NwdShpZS0+a2V5X2xlbmd0aCkgPgorCQkJCWxlMTZfdG9fY3B1KGllLT5kYXRhLnZpLmRhdGFfb2Zmc2V0KSB8fAorCQkJCSh1MzIpbGUxNl90b19jcHUoaWUtPmRhdGEudmkuZGF0YV9vZmZzZXQpICsKKwkJCQlsZTE2X3RvX2NwdShpZS0+ZGF0YS52aS5kYXRhX2xlbmd0aCkgPgorCQkJCWxlMTZfdG9fY3B1KGllLT5sZW5ndGgpKSB7CisJCQludGZzX2Vycm9yKHNiLCAiSW5kZXggZW50cnkgb3V0IG9mIGJvdW5kcyBpbiBpbm9kZSAiCisJCQkJCSIweCVseC4iLCBpZHhfbmktPm1mdF9ubyk7CisJCQlnb3RvIHVubV9lcnJfb3V0OworCQl9CisJCS8qIElmIHRoZSBrZXlzIG1hdGNoIHBlcmZlY3RseSwgd2Ugc2V0dXAgQGljdHggYW5kIHJldHVybiAwLiAqLworCQlpZiAoKGtleV9sZW4gPT0gbGUxNl90b19jcHUoaWUtPmtleV9sZW5ndGgpKSAmJiAhbWVtY21wKGtleSwKKwkJCQkmaWUtPmtleSwga2V5X2xlbikpIHsKK2lhX2RvbmU6CisJCQlpY3R4LT5pc19pbl9yb290ID0gRkFMU0U7CisJCQlpY3R4LT5hY3R4ID0gTlVMTDsKKwkJCWljdHgtPmJhc2VfbmkgPSBOVUxMOworCQkJaWN0eC0+aWEgPSBpYTsKKwkJCWljdHgtPnBhZ2UgPSBwYWdlOworCQkJZ290byBkb25lOworCQl9CisJCS8qCisJCSAqIE5vdCBhIHBlcmZlY3QgbWF0Y2gsIG5lZWQgdG8gZG8gZnVsbCBibG93biBjb2xsYXRpb24gc28gd2UKKwkJICoga25vdyB3aGljaCB3YXkgaW4gdGhlIEIrdHJlZSB3ZSBoYXZlIHRvIGdvLgorCQkgKi8KKwkJcmMgPSBudGZzX2NvbGxhdGUodm9sLCBpZHhfbmktPml0eXBlLmluZGV4LmNvbGxhdGlvbl9ydWxlLCBrZXksCisJCQkJa2V5X2xlbiwgJmllLT5rZXksIGxlMTZfdG9fY3B1KGllLT5rZXlfbGVuZ3RoKSk7CisJCS8qCisJCSAqIElmIEBrZXkgY29sbGF0ZXMgYmVmb3JlIHRoZSBrZXkgb2YgdGhlIGN1cnJlbnQgZW50cnksIHRoZXJlCisJCSAqIGlzIGRlZmluaXRlbHkgbm8gc3VjaCBrZXkgaW4gdGhpcyBpbmRleCBidXQgd2UgbWlnaHQgbmVlZCB0bworCQkgKiBkZXNjZW5kIGludG8gdGhlIEIrdHJlZSBzbyB3ZSBqdXN0IGJyZWFrIG91dCBvZiB0aGUgbG9vcC4KKwkJICovCisJCWlmIChyYyA9PSAtMSkKKwkJCWJyZWFrOworCQkvKgorCQkgKiBBIG1hdGNoIHNob3VsZCBuZXZlciBoYXBwZW4gYXMgdGhlIG1lbWNtcCgpIGNhbGwgc2hvdWxkIGhhdmUKKwkJICogY291Z2h0IGl0LCBidXQgd2Ugc3RpbGwgdHJlYXQgaXQgY29ycmVjdGx5LgorCQkgKi8KKwkJaWYgKCFyYykKKwkJCWdvdG8gaWFfZG9uZTsKKwkJLyogVGhlIGtleXMgYXJlIG5vdCBlcXVhbCwgY29udGludWUgdGhlIHNlYXJjaC4gKi8KKwl9CisJLyoKKwkgKiBXZSBoYXZlIGZpbmlzaGVkIHdpdGggdGhpcyBpbmRleCBidWZmZXIgd2l0aG91dCBzdWNjZXNzLiAgQ2hlY2sgZm9yCisJICogdGhlIHByZXNlbmNlIG9mIGEgY2hpbGQgbm9kZSBhbmQgaWYgbm90IHByZXNlbnQgcmV0dXJuIC1FTk9FTlQuCisJICovCisJaWYgKCEoaWUtPmZsYWdzICYgSU5ERVhfRU5UUllfTk9ERSkpIHsKKwkJbnRmc19kZWJ1ZygiRW50cnkgbm90IGZvdW5kLiIpOworCQllcnIgPSAtRU5PRU5UOworCQlnb3RvIGlhX2RvbmU7CisJfQorCWlmICgoaWEtPmluZGV4LmZsYWdzICYgTk9ERV9NQVNLKSA9PSBMRUFGX05PREUpIHsKKwkJbnRmc19lcnJvcihzYiwgIkluZGV4IGVudHJ5IHdpdGggY2hpbGQgbm9kZSBmb3VuZCBpbiBhIGxlYWYgIgorCQkJCSJub2RlIGluIGlub2RlIDB4JWx4LiIsIGlkeF9uaS0+bWZ0X25vKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJLyogQ2hpbGQgbm9kZSBwcmVzZW50LCBkZXNjZW5kIGludG8gaXQuICovCisJb2xkX3ZjbiA9IHZjbjsKKwl2Y24gPSBzbGU2NF90b19jcHVwKChzbGU2NCopKCh1OCopaWUgKyBsZTE2X3RvX2NwdShpZS0+bGVuZ3RoKSAtIDgpKTsKKwlpZiAodmNuID49IDApIHsKKwkJLyoKKwkJICogSWYgdmNuIGlzIGluIHRoZSBzYW1lIHBhZ2UgY2FjaGUgcGFnZSBhcyBvbGRfdmNuIHdlIHJlY3ljbGUKKwkJICogdGhlIG1hcHBlZCBwYWdlLgorCQkgKi8KKwkJaWYgKG9sZF92Y24gPDwgdm9sLT5jbHVzdGVyX3NpemVfYml0cyA+PgorCQkJCVBBR0VfQ0FDSEVfU0hJRlQgPT0gdmNuIDw8CisJCQkJdm9sLT5jbHVzdGVyX3NpemVfYml0cyA+PgorCQkJCVBBR0VfQ0FDSEVfU0hJRlQpCisJCQlnb3RvIGZhc3RfZGVzY2VuZF9pbnRvX2NoaWxkX25vZGU7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJCWdvdG8gZGVzY2VuZF9pbnRvX2NoaWxkX25vZGU7CisJfQorCW50ZnNfZXJyb3Ioc2IsICJOZWdhdGl2ZSBjaGlsZCBub2RlIHZjbiBpbiBpbm9kZSAweCVseC4iLAorCQkJaWR4X25pLT5tZnRfbm8pOwordW5tX2Vycl9vdXQ6CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworZXJyX291dDoKKwlpZiAoIWVycikKKwkJZXJyID0gLUVJTzsKKwlpZiAoYWN0eCkKKwkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGFjdHgpOworCWlmIChtKQorCQl1bm1hcF9tZnRfcmVjb3JkKGJhc2VfbmkpOworCXJldHVybiBlcnI7CitpZHhfZXJyX291dDoKKwludGZzX2Vycm9yKHNiLCAiQ29ycnVwdCBpbmRleC4gIEFib3J0aW5nIGxvb2t1cC4iKTsKKwlnb3RvIGVycl9vdXQ7Cit9CmRpZmYgLS1naXQgYS9mcy9udGZzL2luZGV4LmggYi9mcy9udGZzL2luZGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ2YTQ4OQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvaW5kZXguaApAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIGluZGV4LmggLSBEZWZpbmVzIGZvciBOVEZTIGtlcm5lbCBpbmRleCBoYW5kbGluZy4gIFBhcnQgb2YgdGhlIExpbnV4LU5URlMKKyAqCSAgICAgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfTElOVVhfTlRGU19JTkRFWF9ICisjZGVmaW5lIF9MSU5VWF9OVEZTX0lOREVYX0gKKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisKKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgImxheW91dC5oIgorI2luY2x1ZGUgImlub2RlLmgiCisjaW5jbHVkZSAiYXR0cmliLmgiCisjaW5jbHVkZSAibWZ0LmgiCisjaW5jbHVkZSAiYW9wcy5oIgorCisvKioKKyAqIEBpZHhfbmk6CWluZGV4IGlub2RlIGNvbnRhaW5pbmcgdGhlIEBlbnRyeSBkZXNjcmliZWQgYnkgdGhpcyBjb250ZXh0CisgKiBAZW50cnk6CWluZGV4IGVudHJ5IChwb2ludHMgaW50byBAaXIgb3IgQGlhKQorICogQGRhdGE6CWluZGV4IGVudHJ5IGRhdGEgKHBvaW50cyBpbnRvIEBlbnRyeSkKKyAqIEBkYXRhX2xlbjoJbGVuZ3RoIGluIGJ5dGVzIG9mIEBkYXRhCisgKiBAaXNfaW5fcm9vdDoJVFJVRSBpZiBAZW50cnkgaXMgaW4gQGlyIGFuZCBGQUxTRSBpZiBpdCBpcyBpbiBAaWEKKyAqIEBpcjoJCWluZGV4IHJvb3QgaWYgQGlzX2luX3Jvb3QgYW5kIE5VTEwgb3RoZXJ3aXNlCisgKiBAYWN0eDoJYXR0cmlidXRlIHNlYXJjaCBjb250ZXh0IGlmIEBpc19pbl9yb290IGFuZCBOVUxMIG90aGVyd2lzZQorICogQGJhc2Vfbmk6CWJhc2UgaW5vZGUgaWYgQGlzX2luX3Jvb3QgYW5kIE5VTEwgb3RoZXJ3aXNlCisgKiBAaWE6CQlpbmRleCBibG9jayBpZiBAaXNfaW5fcm9vdCBpcyBGQUxTRSBhbmQgTlVMTCBvdGhlcndpc2UKKyAqIEBwYWdlOglwYWdlIGlmIEBpc19pbl9yb290IGlzIEZBTFNFIGFuZCBOVUxMIG90aGVyd2lzZQorICoKKyAqIEBpZHhfbmkgaXMgdGhlIGluZGV4IGlub2RlIHRoaXMgY29udGV4dCBiZWxvbmdzIHRvLgorICoKKyAqIEBlbnRyeSBpcyB0aGUgaW5kZXggZW50cnkgZGVzY3JpYmVkIGJ5IHRoaXMgY29udGV4dC4gIEBkYXRhIGFuZCBAZGF0YV9sZW4KKyAqIGFyZSB0aGUgaW5kZXggZW50cnkgZGF0YSBhbmQgaXRzIGxlbmd0aCBpbiBieXRlcywgcmVzcGVjdGl2ZWx5LiAgQGRhdGEKKyAqIHNpbXBseSBwb2ludHMgaW50byBAZW50cnkuICBUaGlzIGlzIHByb2JhYmx5IHdoYXQgdGhlIHVzZXIgaXMgaW50ZXJlc3RlZCBpbi4KKyAqCisgKiBJZiBAaXNfaW5fcm9vdCBpcyBUUlVFLCBAZW50cnkgaXMgaW4gdGhlIGluZGV4IHJvb3QgYXR0cmlidXRlIEBpciBkZXNjcmliZWQKKyAqIGJ5IHRoZSBhdHRyaWJ1dGUgc2VhcmNoIGNvbnRleHQgQGFjdHggYW5kIHRoZSBiYXNlIGlub2RlIEBiYXNlX25pLiAgQGlhIGFuZAorICogQHBhZ2UgYXJlIE5VTEwgaW4gdGhpcyBjYXNlLgorICoKKyAqIElmIEBpc19pbl9yb290IGlzIEZBTFNFLCBAZW50cnkgaXMgaW4gdGhlIGluZGV4IGFsbG9jYXRpb24gYXR0cmlidXRlIGFuZCBAaWEKKyAqIGFuZCBAcGFnZSBwb2ludCB0byB0aGUgaW5kZXggYWxsb2NhdGlvbiBibG9jayBhbmQgdGhlIG1hcHBlZCwgbG9ja2VkIHBhZ2UgaXQKKyAqIGlzIGluLCByZXNwZWN0aXZlbHkuICBAaXIsIEBhY3R4IGFuZCBAYmFzZV9uaSBhcmUgTlVMTCBpbiB0aGlzIGNhc2UuCisgKgorICogVG8gb2J0YWluIGEgY29udGV4dCBjYWxsIG50ZnNfaW5kZXhfY3R4X2dldCgpLgorICoKKyAqIFdlIHVzZSB0aGlzIGNvbnRleHQgdG8gYWxsb3cgbnRmc19pbmRleF9sb29rdXAoKSB0byByZXR1cm4gdGhlIGZvdW5kIGluZGV4CisgKiBAZW50cnkgYW5kIGl0cyBAZGF0YSB3aXRob3V0IGhhdmluZyB0byBhbGxvY2F0ZSBhIGJ1ZmZlciBhbmQgY29weSB0aGUgQGVudHJ5CisgKiBhbmQvb3IgaXRzIEBkYXRhIGludG8gaXQuCisgKgorICogV2hlbiBmaW5pc2hlZCB3aXRoIHRoZSBAZW50cnkgYW5kIGl0cyBAZGF0YSwgY2FsbCBudGZzX2luZGV4X2N0eF9wdXQoKSB0bworICogZnJlZSB0aGUgY29udGV4dCBhbmQgb3RoZXIgYXNzb2NpYXRlZCByZXNvdXJjZXMuCisgKgorICogSWYgdGhlIGluZGV4IGVudHJ5IHdhcyBtb2RpZmllZCwgY2FsbCBmbHVzaF9kY2FjaGVfaW5kZXhfZW50cnlfcGFnZSgpCisgKiBpbW1lZGlhdGVseSBhZnRlciB0aGUgbW9kaWZpY2F0aW9uIGFuZCBlaXRoZXIgbnRmc19pbmRleF9lbnRyeV9tYXJrX2RpcnR5KCkKKyAqIG9yIG50ZnNfaW5kZXhfZW50cnlfd3JpdGUoKSBiZWZvcmUgdGhlIGNhbGwgdG8gbnRmc19pbmRleF9jdHhfcHV0KCkgdG8KKyAqIGVuc3VyZSB0aGF0IHRoZSBjaGFuZ2VzIGFyZSB3cml0dGVuIHRvIGRpc2suCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwludGZzX2lub2RlICppZHhfbmk7CisJSU5ERVhfRU5UUlkgKmVudHJ5OworCXZvaWQgKmRhdGE7CisJdTE2IGRhdGFfbGVuOworCUJPT0wgaXNfaW5fcm9vdDsKKwlJTkRFWF9ST09UICppcjsKKwludGZzX2F0dHJfc2VhcmNoX2N0eCAqYWN0eDsKKwludGZzX2lub2RlICpiYXNlX25pOworCUlOREVYX0FMTE9DQVRJT04gKmlhOworCXN0cnVjdCBwYWdlICpwYWdlOworfSBudGZzX2luZGV4X2NvbnRleHQ7CisKK2V4dGVybiBudGZzX2luZGV4X2NvbnRleHQgKm50ZnNfaW5kZXhfY3R4X2dldChudGZzX2lub2RlICppZHhfbmkpOworZXh0ZXJuIHZvaWQgbnRmc19pbmRleF9jdHhfcHV0KG50ZnNfaW5kZXhfY29udGV4dCAqaWN0eCk7CisKK2V4dGVybiBpbnQgbnRmc19pbmRleF9sb29rdXAoY29uc3Qgdm9pZCAqa2V5LCBjb25zdCBpbnQga2V5X2xlbiwKKwkJbnRmc19pbmRleF9jb250ZXh0ICppY3R4KTsKKworI2lmZGVmIE5URlNfUlcKKworLyoqCisgKiBudGZzX2luZGV4X2VudHJ5X2ZsdXNoX2RjYWNoZV9wYWdlIC0gZmx1c2hfZGNhY2hlX3BhZ2UoKSBmb3IgaW5kZXggZW50cmllcworICogQGljdHg6CW50ZnMgaW5kZXggY29udGV4dCBkZXNjcmliaW5nIHRoZSBpbmRleCBlbnRyeQorICoKKyAqIENhbGwgZmx1c2hfZGNhY2hlX3BhZ2UoKSBmb3IgdGhlIHBhZ2UgaW4gd2hpY2ggYW4gaW5kZXggZW50cnkgcmVzaWRlcy4KKyAqCisgKiBUaGlzIG11c3QgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgYW4gaW5kZXggZW50cnkgaXMgbW9kaWZpZWQsIGp1c3QgYWZ0ZXIgdGhlCisgKiBtb2RpZmljYXRpb24uCisgKgorICogSWYgdGhlIGluZGV4IGVudHJ5IGlzIGluIHRoZSBpbmRleCByb290IGF0dHJpYnV0ZSwgc2ltcGx5IGZsdXNoIHRoZSBwYWdlCisgKiBjb250YWluaW5nIHRoZSBtZnQgcmVjb3JkIGNvbnRhaW5pbmcgdGhlIGluZGV4IHJvb3QgYXR0cmlidXRlLgorICoKKyAqIElmIHRoZSBpbmRleCBlbnRyeSBpcyBpbiBhbiBpbmRleCBibG9jayBiZWxvbmdpbmcgdG8gdGhlIGluZGV4IGFsbG9jYXRpb24KKyAqIGF0dHJpYnV0ZSwgc2ltcGx5IGZsdXNoIHRoZSBwYWdlIGNhY2hlIHBhZ2UgY29udGFpbmluZyB0aGUgaW5kZXggYmxvY2suCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBudGZzX2luZGV4X2VudHJ5X2ZsdXNoX2RjYWNoZV9wYWdlKG50ZnNfaW5kZXhfY29udGV4dCAqaWN0eCkKK3sKKwlpZiAoaWN0eC0+aXNfaW5fcm9vdCkKKwkJZmx1c2hfZGNhY2hlX21mdF9yZWNvcmRfcGFnZShpY3R4LT5hY3R4LT5udGZzX2lubyk7CisJZWxzZQorCQlmbHVzaF9kY2FjaGVfcGFnZShpY3R4LT5wYWdlKTsKK30KKworLyoqCisgKiBudGZzX2luZGV4X2VudHJ5X21hcmtfZGlydHkgLSBtYXJrIGFuIGluZGV4IGVudHJ5IGRpcnR5CisgKiBAaWN0eDoJbnRmcyBpbmRleCBjb250ZXh0IGRlc2NyaWJpbmcgdGhlIGluZGV4IGVudHJ5CisgKgorICogTWFyayB0aGUgaW5kZXggZW50cnkgZGVzY3JpYmVkIGJ5IHRoZSBpbmRleCBlbnRyeSBjb250ZXh0IEBpY3R4IGRpcnR5LgorICoKKyAqIElmIHRoZSBpbmRleCBlbnRyeSBpcyBpbiB0aGUgaW5kZXggcm9vdCBhdHRyaWJ1dGUsIHNpbXBseSBtYXJrIHRoZSBtZnQKKyAqIHJlY29yZCBjb250YWluaW5nIHRoZSBpbmRleCByb290IGF0dHJpYnV0ZSBkaXJ0eS4gIFRoaXMgZW5zdXJlcyB0aGUgbWZ0CisgKiByZWNvcmQsIGFuZCBoZW5jZSB0aGUgaW5kZXggcm9vdCBhdHRyaWJ1dGUsIHdpbGwgYmUgd3JpdHRlbiBvdXQgdG8gZGlzaworICogbGF0ZXIuCisgKgorICogSWYgdGhlIGluZGV4IGVudHJ5IGlzIGluIGFuIGluZGV4IGJsb2NrIGJlbG9uZ2luZyB0byB0aGUgaW5kZXggYWxsb2NhdGlvbgorICogYXR0cmlidXRlLCBtYXJrIHRoZSBidWZmZXJzIGJlbG9uZ2luZyB0byB0aGUgaW5kZXggcmVjb3JkIGFzIHdlbGwgYXMgdGhlCisgKiBwYWdlIGNhY2hlIHBhZ2UgdGhlIGluZGV4IGJsb2NrIGlzIGluIGRpcnR5LiAgVGhpcyBhdXRvbWF0aWNhbGx5IG1hcmtzIHRoZQorICogVkZTIGlub2RlIG9mIHRoZSBudGZzIGluZGV4IGlub2RlIHRvIHdoaWNoIHRoZSBpbmRleCBlbnRyeSBiZWxvbmdzIGRpcnR5LAorICogdG9vIChJX0RJUlRZX1BBR0VTKSBhbmQgdGhpcyBpbiB0dXJuIGVuc3VyZXMgdGhlIHBhZ2UgYnVmZmVycywgYW5kIGhlbmNlIHRoZQorICogZGlydHkgaW5kZXggYmxvY2ssIHdpbGwgYmUgd3JpdHRlbiBvdXQgdG8gZGlzayBsYXRlci4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIG50ZnNfaW5kZXhfZW50cnlfbWFya19kaXJ0eShudGZzX2luZGV4X2NvbnRleHQgKmljdHgpCit7CisJaWYgKGljdHgtPmlzX2luX3Jvb3QpCisJCW1hcmtfbWZ0X3JlY29yZF9kaXJ0eShpY3R4LT5hY3R4LT5udGZzX2lubyk7CisJZWxzZQorCQltYXJrX250ZnNfcmVjb3JkX2RpcnR5KGljdHgtPnBhZ2UsCisJCQkJKHU4KilpY3R4LT5pYSAtICh1OCopcGFnZV9hZGRyZXNzKGljdHgtPnBhZ2UpKTsKK30KKworI2VuZGlmIC8qIE5URlNfUlcgKi8KKworI2VuZGlmIC8qIF9MSU5VWF9OVEZTX0lOREVYX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvaW5vZGUuYyBiL2ZzL250ZnMvaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTg0MGJhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9pbm9kZS5jCkBAIC0wLDAgKzEsMjYxNiBAQAorLyoqCisgKiBpbm9kZS5jIC0gTlRGUyBrZXJuZWwgaW5vZGUgaGFuZGxpbmcuIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisKKyNpbmNsdWRlICJhb3BzLmgiCisjaW5jbHVkZSAiZGlyLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJpbm9kZS5oIgorI2luY2x1ZGUgImF0dHJpYi5oIgorI2luY2x1ZGUgIm1hbGxvYy5oIgorI2luY2x1ZGUgIm1mdC5oIgorI2luY2x1ZGUgInRpbWUuaCIKKyNpbmNsdWRlICJudGZzLmgiCisKKy8qKgorICogbnRmc190ZXN0X2lub2RlIC0gY29tcGFyZSB0d28gKHBvc3NpYmx5IGZha2UpIGlub2RlcyBmb3IgZXF1YWxpdHkKKyAqIEB2aToJCXZmcyBpbm9kZSB3aGljaCB0byB0ZXN0CisgKiBAbmE6CQludGZzIGF0dHJpYnV0ZSB3aGljaCBpcyBiZWluZyB0ZXN0ZWQgd2l0aAorICoKKyAqIENvbXBhcmUgdGhlIG50ZnMgYXR0cmlidXRlIGVtYmVkZGVkIGluIHRoZSBudGZzIHNwZWNpZmljIHBhcnQgb2YgdGhlIHZmcworICogaW5vZGUgQHZpIGZvciBlcXVhbGl0eSB3aXRoIHRoZSBudGZzIGF0dHJpYnV0ZSBAbmEuCisgKgorICogSWYgc2VhcmNoaW5nIGZvciB0aGUgbm9ybWFsIGZpbGUvZGlyZWN0b3J5IGlub2RlLCBzZXQgQG5hLT50eXBlIHRvIEFUX1VOVVNFRC4KKyAqIEBuYS0+bmFtZSBhbmQgQG5hLT5uYW1lX2xlbiBhcmUgdGhlbiBpZ25vcmVkLgorICoKKyAqIFJldHVybiAxIGlmIHRoZSBhdHRyaWJ1dGVzIG1hdGNoIGFuZCAwIGlmIG5vdC4KKyAqCisgKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHJ1bnMgd2l0aCB0aGUgaW5vZGVfbG9jayBzcGluIGxvY2sgaGVsZCBzbyBpdCBpcyBub3QKKyAqIGFsbG93ZWQgdG8gc2xlZXAuCisgKi8KK2ludCBudGZzX3Rlc3RfaW5vZGUoc3RydWN0IGlub2RlICp2aSwgbnRmc19hdHRyICpuYSkKK3sKKwludGZzX2lub2RlICpuaTsKKworCWlmICh2aS0+aV9pbm8gIT0gbmEtPm1mdF9ubykKKwkJcmV0dXJuIDA7CisJbmkgPSBOVEZTX0kodmkpOworCS8qIElmICFOSW5vQXR0cihuaSksIEB2aSBpcyBhIG5vcm1hbCBmaWxlIG9yIGRpcmVjdG9yeSBpbm9kZS4gKi8KKwlpZiAobGlrZWx5KCFOSW5vQXR0cihuaSkpKSB7CisJCS8qIElmIG5vdCBsb29raW5nIGZvciBhIG5vcm1hbCBpbm9kZSB0aGlzIGlzIGEgbWlzbWF0Y2guICovCisJCWlmICh1bmxpa2VseShuYS0+dHlwZSAhPSBBVF9VTlVTRUQpKQorCQkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJLyogQSBmYWtlIGlub2RlIGRlc2NyaWJpbmcgYW4gYXR0cmlidXRlLiAqLworCQlpZiAobmktPnR5cGUgIT0gbmEtPnR5cGUpCisJCQlyZXR1cm4gMDsKKwkJaWYgKG5pLT5uYW1lX2xlbiAhPSBuYS0+bmFtZV9sZW4pCisJCQlyZXR1cm4gMDsKKwkJaWYgKG5hLT5uYW1lX2xlbiAmJiBtZW1jbXAobmktPm5hbWUsIG5hLT5uYW1lLAorCQkJCW5hLT5uYW1lX2xlbiAqIHNpemVvZihudGZzY2hhcikpKQorCQkJcmV0dXJuIDA7CisJfQorCS8qIE1hdGNoISAqLworCXJldHVybiAxOworfQorCisvKioKKyAqIG50ZnNfaW5pdF9sb2NrZWRfaW5vZGUgLSBpbml0aWFsaXplIGFuIGlub2RlCisgKiBAdmk6CQl2ZnMgaW5vZGUgdG8gaW5pdGlhbGl6ZQorICogQG5hOgkJbnRmcyBhdHRyaWJ1dGUgd2hpY2ggdG8gaW5pdGlhbGl6ZSBAdmkgdG8KKyAqCisgKiBJbml0aWFsaXplIHRoZSB2ZnMgaW5vZGUgQHZpIHdpdGggdGhlIHZhbHVlcyBmcm9tIHRoZSBudGZzIGF0dHJpYnV0ZSBAbmEgaW4KKyAqIG9yZGVyIHRvIGVuYWJsZSBudGZzX3Rlc3RfaW5vZGUoKSB0byBkbyBpdHMgd29yay4KKyAqCisgKiBJZiBpbml0aWFsaXppbmcgdGhlIG5vcm1hbCBmaWxlL2RpcmVjdG9yeSBpbm9kZSwgc2V0IEBuYS0+dHlwZSB0byBBVF9VTlVTRUQuCisgKiBJbiB0aGF0IGNhc2UsIEBuYS0+bmFtZSBhbmQgQG5hLT5uYW1lX2xlbiBzaG91bGQgYmUgc2V0IHRvIE5VTEwgYW5kIDAsCisgKiByZXNwZWN0aXZlbHkuIEFsdGhvdWdoIHRoYXQgaXMgbm90IHN0cmljdGx5IG5lY2Vzc2FyeSBhcworICogbnRmc19yZWFkX2lub2RlX2xvY2tlZCgpIHdpbGwgZmlsbCB0aGVtIGluIGxhdGVyLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4KKyAqCisgKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHJ1bnMgd2l0aCB0aGUgaW5vZGVfbG9jayBzcGluIGxvY2sgaGVsZCBzbyBpdCBpcyBub3QKKyAqIGFsbG93ZWQgdG8gc2xlZXAuIChIZW5jZSB0aGUgR0ZQX0FUT01JQyBhbGxvY2F0aW9uLikKKyAqLworc3RhdGljIGludCBudGZzX2luaXRfbG9ja2VkX2lub2RlKHN0cnVjdCBpbm9kZSAqdmksIG50ZnNfYXR0ciAqbmEpCit7CisJbnRmc19pbm9kZSAqbmkgPSBOVEZTX0kodmkpOworCisJdmktPmlfaW5vID0gbmEtPm1mdF9ubzsKKworCW5pLT50eXBlID0gbmEtPnR5cGU7CisJaWYgKG5hLT50eXBlID09IEFUX0lOREVYX0FMTE9DQVRJT04pCisJCU5Jbm9TZXRNc3RQcm90ZWN0ZWQobmkpOworCisJbmktPm5hbWUgPSBuYS0+bmFtZTsKKwluaS0+bmFtZV9sZW4gPSBuYS0+bmFtZV9sZW47CisKKwkvKiBJZiBpbml0aWFsaXppbmcgYSBub3JtYWwgaW5vZGUsIHdlIGFyZSBkb25lLiAqLworCWlmIChsaWtlbHkobmEtPnR5cGUgPT0gQVRfVU5VU0VEKSkgeworCQlCVUdfT04obmEtPm5hbWUpOworCQlCVUdfT04obmEtPm5hbWVfbGVuKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogSXQgaXMgYSBmYWtlIGlub2RlLiAqLworCU5Jbm9TZXRBdHRyKG5pKTsKKworCS8qCisJICogV2UgaGF2ZSBJMzAgZ2xvYmFsIGNvbnN0YW50IGFzIGFuIG9wdGltaXphdGlvbiBhcyBpdCBpcyB0aGUgbmFtZQorCSAqIGluID45OS45JSBvZiBuYW1lZCBhdHRyaWJ1dGVzISBUaGUgb3RoZXIgPDAuMSUgaW5jdXIgYSBHRlBfQVRPTUlDCisJICogYWxsb2NhdGlvbiBidXQgdGhhdCBpcyBvay4gQW5kIG1vc3QgYXR0cmlidXRlcyBhcmUgdW5uYW1lZCBhbnl3YXksCisJICogdGh1cyB0aGUgZnJhY3Rpb24gb2YgbmFtZWQgYXR0cmlidXRlcyB3aXRoIG5hbWUgIT0gSTMwIGlzIGFjdHVhbGx5CisJICogYWJzb2x1dGVseSB0aW55LgorCSAqLworCWlmIChuYS0+bmFtZV9sZW4gJiYgbmEtPm5hbWUgIT0gSTMwKSB7CisJCXVuc2lnbmVkIGludCBpOworCisJCUJVR19PTighbmEtPm5hbWUpOworCQlpID0gbmEtPm5hbWVfbGVuICogc2l6ZW9mKG50ZnNjaGFyKTsKKwkJbmktPm5hbWUgPSAobnRmc2NoYXIqKWttYWxsb2MoaSArIHNpemVvZihudGZzY2hhciksIEdGUF9BVE9NSUMpOworCQlpZiAoIW5pLT5uYW1lKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCW1lbWNweShuaS0+bmFtZSwgbmEtPm5hbWUsIGkpOworCQluaS0+bmFtZVtpXSA9IDA7CisJfQorCXJldHVybiAwOworfQorCit0eXBlZGVmIGludCAoKnNldF90KShzdHJ1Y3QgaW5vZGUgKiwgdm9pZCAqKTsKK3N0YXRpYyBpbnQgbnRmc19yZWFkX2xvY2tlZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKnZpKTsKK3N0YXRpYyBpbnQgbnRmc19yZWFkX2xvY2tlZF9hdHRyX2lub2RlKHN0cnVjdCBpbm9kZSAqYmFzZV92aSwgc3RydWN0IGlub2RlICp2aSk7CitzdGF0aWMgaW50IG50ZnNfcmVhZF9sb2NrZWRfaW5kZXhfaW5vZGUoc3RydWN0IGlub2RlICpiYXNlX3ZpLAorCQlzdHJ1Y3QgaW5vZGUgKnZpKTsKKworLyoqCisgKiBudGZzX2lnZXQgLSBvYnRhaW4gYSBzdHJ1Y3QgaW5vZGUgY29ycmVzcG9uZGluZyB0byBhIHNwZWNpZmljIG5vcm1hbCBpbm9kZQorICogQHNiOgkJc3VwZXIgYmxvY2sgb2YgbW91bnRlZCB2b2x1bWUKKyAqIEBtZnRfbm86CW1mdCByZWNvcmQgbnVtYmVyIC8gaW5vZGUgbnVtYmVyIHRvIG9idGFpbgorICoKKyAqIE9idGFpbiB0aGUgc3RydWN0IGlub2RlIGNvcnJlc3BvbmRpbmcgdG8gYSBzcGVjaWZpYyBub3JtYWwgaW5vZGUgKGkuZS4gYQorICogZmlsZSBvciBkaXJlY3RvcnkpLgorICoKKyAqIElmIHRoZSBpbm9kZSBpcyBpbiB0aGUgY2FjaGUsIGl0IGlzIGp1c3QgcmV0dXJuZWQgd2l0aCBhbiBpbmNyZWFzZWQKKyAqIHJlZmVyZW5jZSBjb3VudC4gT3RoZXJ3aXNlLCBhIG5ldyBzdHJ1Y3QgaW5vZGUgaXMgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCwKKyAqIGFuZCBmaW5hbGx5IG50ZnNfcmVhZF9sb2NrZWRfaW5vZGUoKSBpcyBjYWxsZWQgdG8gcmVhZCBpbiB0aGUgaW5vZGUgYW5kCisgKiBmaWxsIGluIHRoZSByZW1haW5kZXIgb2YgdGhlIGlub2RlIHN0cnVjdHVyZS4KKyAqCisgKiBSZXR1cm4gdGhlIHN0cnVjdCBpbm9kZSBvbiBzdWNjZXNzLiBDaGVjayB0aGUgcmV0dXJuIHZhbHVlIHdpdGggSVNfRVJSKCkgYW5kCisgKiBpZiB0cnVlLCB0aGUgZnVuY3Rpb24gZmFpbGVkIGFuZCB0aGUgZXJyb3IgY29kZSBpcyBvYnRhaW5lZCBmcm9tIFBUUl9FUlIoKS4KKyAqLworc3RydWN0IGlub2RlICpudGZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbG9uZyBtZnRfbm8pCit7CisJc3RydWN0IGlub2RlICp2aTsKKwludGZzX2F0dHIgbmE7CisJaW50IGVycjsKKworCW5hLm1mdF9ubyA9IG1mdF9ubzsKKwluYS50eXBlID0gQVRfVU5VU0VEOworCW5hLm5hbWUgPSBOVUxMOworCW5hLm5hbWVfbGVuID0gMDsKKworCXZpID0gaWdldDVfbG9ja2VkKHNiLCBtZnRfbm8sICh0ZXN0X3QpbnRmc190ZXN0X2lub2RlLAorCQkJKHNldF90KW50ZnNfaW5pdF9sb2NrZWRfaW5vZGUsICZuYSk7CisJaWYgKCF2aSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwllcnIgPSAwOworCisJLyogSWYgdGhpcyBpcyBhIGZyZXNobHkgYWxsb2NhdGVkIGlub2RlLCBuZWVkIHRvIHJlYWQgaXQgbm93LiAqLworCWlmICh2aS0+aV9zdGF0ZSAmIElfTkVXKSB7CisJCWVyciA9IG50ZnNfcmVhZF9sb2NrZWRfaW5vZGUodmkpOworCQl1bmxvY2tfbmV3X2lub2RlKHZpKTsKKwl9CisJLyoKKwkgKiBUaGVyZSBpcyBubyBwb2ludCBpbiBrZWVwaW5nIGJhZCBpbm9kZXMgYXJvdW5kIGlmIHRoZSBmYWlsdXJlIHdhcworCSAqIGR1ZSB0byBFTk9NRU0uIFdlIHdhbnQgdG8gYmUgYWJsZSB0byByZXRyeSBhZ2FpbiBsYXRlci4KKwkgKi8KKwlpZiAoZXJyID09IC1FTk9NRU0pIHsKKwkJaXB1dCh2aSk7CisJCXZpID0gRVJSX1BUUihlcnIpOworCX0KKwlyZXR1cm4gdmk7Cit9CisKKy8qKgorICogbnRmc19hdHRyX2lnZXQgLSBvYnRhaW4gYSBzdHJ1Y3QgaW5vZGUgY29ycmVzcG9uZGluZyB0byBhbiBhdHRyaWJ1dGUKKyAqIEBiYXNlX3ZpOgl2ZnMgYmFzZSBpbm9kZSBjb250YWluaW5nIHRoZSBhdHRyaWJ1dGUKKyAqIEB0eXBlOglhdHRyaWJ1dGUgdHlwZQorICogQG5hbWU6CVVuaWNvZGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIChOVUxMIGlmIHVubmFtZWQpCisgKiBAbmFtZV9sZW46CWxlbmd0aCBvZiBAbmFtZSBpbiBVbmljb2RlIGNoYXJhY3RlcnMgKDAgaWYgdW5uYW1lZCkKKyAqCisgKiBPYnRhaW4gdGhlIChmYWtlKSBzdHJ1Y3QgaW5vZGUgY29ycmVzcG9uZGluZyB0byB0aGUgYXR0cmlidXRlIHNwZWNpZmllZCBieQorICogQHR5cGUsIEBuYW1lLCBhbmQgQG5hbWVfbGVuLCB3aGljaCBpcyBwcmVzZW50IGluIHRoZSBiYXNlIG1mdCByZWNvcmQKKyAqIHNwZWNpZmllZCBieSB0aGUgdmZzIGlub2RlIEBiYXNlX3ZpLgorICoKKyAqIElmIHRoZSBhdHRyaWJ1dGUgaW5vZGUgaXMgaW4gdGhlIGNhY2hlLCBpdCBpcyBqdXN0IHJldHVybmVkIHdpdGggYW4KKyAqIGluY3JlYXNlZCByZWZlcmVuY2UgY291bnQuIE90aGVyd2lzZSwgYSBuZXcgc3RydWN0IGlub2RlIGlzIGFsbG9jYXRlZCBhbmQKKyAqIGluaXRpYWxpemVkLCBhbmQgZmluYWxseSBudGZzX3JlYWRfbG9ja2VkX2F0dHJfaW5vZGUoKSBpcyBjYWxsZWQgdG8gcmVhZCB0aGUKKyAqIGF0dHJpYnV0ZSBhbmQgZmlsbCBpbiB0aGUgaW5vZGUgc3RydWN0dXJlLgorICoKKyAqIE5vdGUsIGZvciBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZXMsIHlvdSBuZWVkIHRvIHVzZSBudGZzX2luZGV4X2lnZXQoKQorICogaW5zdGVhZCBvZiBudGZzX2F0dHJfaWdldCgpIGFzIHdvcmtpbmcgd2l0aCBpbmRpY2VzIGlzIGEgbG90IG1vcmUgY29tcGxleC4KKyAqCisgKiBSZXR1cm4gdGhlIHN0cnVjdCBpbm9kZSBvZiB0aGUgYXR0cmlidXRlIGlub2RlIG9uIHN1Y2Nlc3MuIENoZWNrIHRoZSByZXR1cm4KKyAqIHZhbHVlIHdpdGggSVNfRVJSKCkgYW5kIGlmIHRydWUsIHRoZSBmdW5jdGlvbiBmYWlsZWQgYW5kIHRoZSBlcnJvciBjb2RlIGlzCisgKiBvYnRhaW5lZCBmcm9tIFBUUl9FUlIoKS4KKyAqLworc3RydWN0IGlub2RlICpudGZzX2F0dHJfaWdldChzdHJ1Y3QgaW5vZGUgKmJhc2VfdmksIEFUVFJfVFlQRSB0eXBlLAorCQludGZzY2hhciAqbmFtZSwgdTMyIG5hbWVfbGVuKQoreworCXN0cnVjdCBpbm9kZSAqdmk7CisJbnRmc19hdHRyIG5hOworCWludCBlcnI7CisKKwkvKiBNYWtlIHN1cmUgbm8gb25lIGNhbGxzIG50ZnNfYXR0cl9pZ2V0KCkgZm9yIGluZGljZXMuICovCisJQlVHX09OKHR5cGUgPT0gQVRfSU5ERVhfQUxMT0NBVElPTik7CisKKwluYS5tZnRfbm8gPSBiYXNlX3ZpLT5pX2lubzsKKwluYS50eXBlID0gdHlwZTsKKwluYS5uYW1lID0gbmFtZTsKKwluYS5uYW1lX2xlbiA9IG5hbWVfbGVuOworCisJdmkgPSBpZ2V0NV9sb2NrZWQoYmFzZV92aS0+aV9zYiwgbmEubWZ0X25vLCAodGVzdF90KW50ZnNfdGVzdF9pbm9kZSwKKwkJCShzZXRfdCludGZzX2luaXRfbG9ja2VkX2lub2RlLCAmbmEpOworCWlmICghdmkpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJZXJyID0gMDsKKworCS8qIElmIHRoaXMgaXMgYSBmcmVzaGx5IGFsbG9jYXRlZCBpbm9kZSwgbmVlZCB0byByZWFkIGl0IG5vdy4gKi8KKwlpZiAodmktPmlfc3RhdGUgJiBJX05FVykgeworCQllcnIgPSBudGZzX3JlYWRfbG9ja2VkX2F0dHJfaW5vZGUoYmFzZV92aSwgdmkpOworCQl1bmxvY2tfbmV3X2lub2RlKHZpKTsKKwl9CisJLyoKKwkgKiBUaGVyZSBpcyBubyBwb2ludCBpbiBrZWVwaW5nIGJhZCBhdHRyaWJ1dGUgaW5vZGVzIGFyb3VuZC4gVGhpcyBhbHNvCisJICogc2ltcGxpZmllcyB0aGluZ3MgaW4gdGhhdCB3ZSBuZXZlciBuZWVkIHRvIGNoZWNrIGZvciBiYWQgYXR0cmlidXRlCisJICogaW5vZGVzIGVsc2V3aGVyZS4KKwkgKi8KKwlpZiAoZXJyKSB7CisJCWlwdXQodmkpOworCQl2aSA9IEVSUl9QVFIoZXJyKTsKKwl9CisJcmV0dXJuIHZpOworfQorCisvKioKKyAqIG50ZnNfaW5kZXhfaWdldCAtIG9idGFpbiBhIHN0cnVjdCBpbm9kZSBjb3JyZXNwb25kaW5nIHRvIGFuIGluZGV4CisgKiBAYmFzZV92aToJdmZzIGJhc2UgaW5vZGUgY29udGFpbmluZyB0aGUgaW5kZXggcmVsYXRlZCBhdHRyaWJ1dGVzCisgKiBAbmFtZToJVW5pY29kZSBuYW1lIG9mIHRoZSBpbmRleAorICogQG5hbWVfbGVuOglsZW5ndGggb2YgQG5hbWUgaW4gVW5pY29kZSBjaGFyYWN0ZXJzCisgKgorICogT2J0YWluIHRoZSAoZmFrZSkgc3RydWN0IGlub2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGluZGV4IHNwZWNpZmllZCBieSBAbmFtZQorICogYW5kIEBuYW1lX2xlbiwgd2hpY2ggaXMgcHJlc2VudCBpbiB0aGUgYmFzZSBtZnQgcmVjb3JkIHNwZWNpZmllZCBieSB0aGUgdmZzCisgKiBpbm9kZSBAYmFzZV92aS4KKyAqCisgKiBJZiB0aGUgaW5kZXggaW5vZGUgaXMgaW4gdGhlIGNhY2hlLCBpdCBpcyBqdXN0IHJldHVybmVkIHdpdGggYW4gaW5jcmVhc2VkCisgKiByZWZlcmVuY2UgY291bnQuICBPdGhlcndpc2UsIGEgbmV3IHN0cnVjdCBpbm9kZSBpcyBhbGxvY2F0ZWQgYW5kCisgKiBpbml0aWFsaXplZCwgYW5kIGZpbmFsbHkgbnRmc19yZWFkX2xvY2tlZF9pbmRleF9pbm9kZSgpIGlzIGNhbGxlZCB0byByZWFkCisgKiB0aGUgaW5kZXggcmVsYXRlZCBhdHRyaWJ1dGVzIGFuZCBmaWxsIGluIHRoZSBpbm9kZSBzdHJ1Y3R1cmUuCisgKgorICogUmV0dXJuIHRoZSBzdHJ1Y3QgaW5vZGUgb2YgdGhlIGluZGV4IGlub2RlIG9uIHN1Y2Nlc3MuIENoZWNrIHRoZSByZXR1cm4KKyAqIHZhbHVlIHdpdGggSVNfRVJSKCkgYW5kIGlmIHRydWUsIHRoZSBmdW5jdGlvbiBmYWlsZWQgYW5kIHRoZSBlcnJvciBjb2RlIGlzCisgKiBvYnRhaW5lZCBmcm9tIFBUUl9FUlIoKS4KKyAqLworc3RydWN0IGlub2RlICpudGZzX2luZGV4X2lnZXQoc3RydWN0IGlub2RlICpiYXNlX3ZpLCBudGZzY2hhciAqbmFtZSwKKwkJdTMyIG5hbWVfbGVuKQoreworCXN0cnVjdCBpbm9kZSAqdmk7CisJbnRmc19hdHRyIG5hOworCWludCBlcnI7CisKKwluYS5tZnRfbm8gPSBiYXNlX3ZpLT5pX2lubzsKKwluYS50eXBlID0gQVRfSU5ERVhfQUxMT0NBVElPTjsKKwluYS5uYW1lID0gbmFtZTsKKwluYS5uYW1lX2xlbiA9IG5hbWVfbGVuOworCisJdmkgPSBpZ2V0NV9sb2NrZWQoYmFzZV92aS0+aV9zYiwgbmEubWZ0X25vLCAodGVzdF90KW50ZnNfdGVzdF9pbm9kZSwKKwkJCShzZXRfdCludGZzX2luaXRfbG9ja2VkX2lub2RlLCAmbmEpOworCWlmICghdmkpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJZXJyID0gMDsKKworCS8qIElmIHRoaXMgaXMgYSBmcmVzaGx5IGFsbG9jYXRlZCBpbm9kZSwgbmVlZCB0byByZWFkIGl0IG5vdy4gKi8KKwlpZiAodmktPmlfc3RhdGUgJiBJX05FVykgeworCQllcnIgPSBudGZzX3JlYWRfbG9ja2VkX2luZGV4X2lub2RlKGJhc2VfdmksIHZpKTsKKwkJdW5sb2NrX25ld19pbm9kZSh2aSk7CisJfQorCS8qCisJICogVGhlcmUgaXMgbm8gcG9pbnQgaW4ga2VlcGluZyBiYWQgaW5kZXggaW5vZGVzIGFyb3VuZC4gIFRoaXMgYWxzbworCSAqIHNpbXBsaWZpZXMgdGhpbmdzIGluIHRoYXQgd2UgbmV2ZXIgbmVlZCB0byBjaGVjayBmb3IgYmFkIGluZGV4CisJICogaW5vZGVzIGVsc2V3aGVyZS4KKwkgKi8KKwlpZiAoZXJyKSB7CisJCWlwdXQodmkpOworCQl2aSA9IEVSUl9QVFIoZXJyKTsKKwl9CisJcmV0dXJuIHZpOworfQorCitzdHJ1Y3QgaW5vZGUgKm50ZnNfYWxsb2NfYmlnX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJbnRmc19pbm9kZSAqbmk7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwluaSA9IChudGZzX2lub2RlICopa21lbV9jYWNoZV9hbGxvYyhudGZzX2JpZ19pbm9kZV9jYWNoZSwKKwkJCVNMQUJfTk9GUyk7CisJaWYgKGxpa2VseShuaSAhPSBOVUxMKSkgeworCQluaS0+c3RhdGUgPSAwOworCQlyZXR1cm4gVkZTX0kobmkpOworCX0KKwludGZzX2Vycm9yKHNiLCAiQWxsb2NhdGlvbiBvZiBOVEZTIGJpZyBpbm9kZSBzdHJ1Y3R1cmUgZmFpbGVkLiIpOworCXJldHVybiBOVUxMOworfQorCit2b2lkIG50ZnNfZGVzdHJveV9iaWdfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwludGZzX2lub2RlICpuaSA9IE5URlNfSShpbm9kZSk7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwlCVUdfT04obmktPnBhZ2UpOworCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmbmktPmNvdW50KSkKKwkJQlVHKCk7CisJa21lbV9jYWNoZV9mcmVlKG50ZnNfYmlnX2lub2RlX2NhY2hlLCBOVEZTX0koaW5vZGUpKTsKK30KKworc3RhdGljIGlubGluZSBudGZzX2lub2RlICpudGZzX2FsbG9jX2V4dGVudF9pbm9kZSh2b2lkKQoreworCW50ZnNfaW5vZGUgKm5pOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CisJbmkgPSAobnRmc19pbm9kZSAqKWttZW1fY2FjaGVfYWxsb2MobnRmc19pbm9kZV9jYWNoZSwgU0xBQl9OT0ZTKTsKKwlpZiAobGlrZWx5KG5pICE9IE5VTEwpKSB7CisJCW5pLT5zdGF0ZSA9IDA7CisJCXJldHVybiBuaTsKKwl9CisJbnRmc19lcnJvcihOVUxMLCAiQWxsb2NhdGlvbiBvZiBOVEZTIGlub2RlIHN0cnVjdHVyZSBmYWlsZWQuIik7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIG50ZnNfZGVzdHJveV9leHRlbnRfaW5vZGUobnRmc19pbm9kZSAqbmkpCit7CisJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CisJQlVHX09OKG5pLT5wYWdlKTsKKwlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJm5pLT5jb3VudCkpCisJCUJVRygpOworCWttZW1fY2FjaGVfZnJlZShudGZzX2lub2RlX2NhY2hlLCBuaSk7Cit9CisKKy8qKgorICogX19udGZzX2luaXRfaW5vZGUgLSBpbml0aWFsaXplIG50ZnMgc3BlY2lmaWMgcGFydCBvZiBhbiBpbm9kZQorICogQHNiOgkJc3VwZXIgYmxvY2sgb2YgbW91bnRlZCB2b2x1bWUKKyAqIEBuaToJCWZyZXNobHkgYWxsb2NhdGVkIG50ZnMgaW5vZGUgd2hpY2ggdG8gaW5pdGlhbGl6ZQorICoKKyAqIEluaXRpYWxpemUgYW4gbnRmcyBpbm9kZSB0byBkZWZhdWx0cy4KKyAqCisgKiBOT1RFOiBuaS0+bWZ0X25vLCBuaS0+c3RhdGUsIG5pLT50eXBlLCBuaS0+bmFtZSwgYW5kIG5pLT5uYW1lX2xlbiBhcmUgbGVmdAorICogdW50b3VjaGVkLiBNYWtlIHN1cmUgdG8gaW5pdGlhbGl6ZSB0aGVtIGVsc2V3aGVyZS4KKyAqCisgKiBSZXR1cm4gemVybyBvbiBzdWNjZXNzIGFuZCAtRU5PTUVNIG9uIGVycm9yLgorICovCit2b2lkIF9fbnRmc19pbml0X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIG50ZnNfaW5vZGUgKm5pKQoreworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworCW5pLT5pbml0aWFsaXplZF9zaXplID0gbmktPmFsbG9jYXRlZF9zaXplID0gMDsKKwluaS0+c2VxX25vID0gMDsKKwlhdG9taWNfc2V0KCZuaS0+Y291bnQsIDEpOworCW5pLT52b2wgPSBOVEZTX1NCKHNiKTsKKwludGZzX2luaXRfcnVubGlzdCgmbmktPnJ1bmxpc3QpOworCWluaXRfTVVURVgoJm5pLT5tcmVjX2xvY2spOworCW5pLT5wYWdlID0gTlVMTDsKKwluaS0+cGFnZV9vZnMgPSAwOworCW5pLT5hdHRyX2xpc3Rfc2l6ZSA9IDA7CisJbmktPmF0dHJfbGlzdCA9IE5VTEw7CisJbnRmc19pbml0X3J1bmxpc3QoJm5pLT5hdHRyX2xpc3RfcmwpOworCW5pLT5pdHlwZS5pbmRleC5ibXBfaW5vID0gTlVMTDsKKwluaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSA9IDA7CisJbmktPml0eXBlLmluZGV4LnZjbl9zaXplID0gMDsKKwluaS0+aXR5cGUuaW5kZXguY29sbGF0aW9uX3J1bGUgPSAwOworCW5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplX2JpdHMgPSAwOworCW5pLT5pdHlwZS5pbmRleC52Y25fc2l6ZV9iaXRzID0gMDsKKwlpbml0X01VVEVYKCZuaS0+ZXh0ZW50X2xvY2spOworCW5pLT5ucl9leHRlbnRzID0gMDsKKwluaS0+ZXh0LmJhc2VfbnRmc19pbm8gPSBOVUxMOworfQorCitpbmxpbmUgbnRmc19pbm9kZSAqbnRmc19uZXdfZXh0ZW50X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCXVuc2lnbmVkIGxvbmcgbWZ0X25vKQoreworCW50ZnNfaW5vZGUgKm5pID0gbnRmc19hbGxvY19leHRlbnRfaW5vZGUoKTsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworCWlmIChsaWtlbHkobmkgIT0gTlVMTCkpIHsKKwkJX19udGZzX2luaXRfaW5vZGUoc2IsIG5pKTsKKwkJbmktPm1mdF9ubyA9IG1mdF9ubzsKKwkJbmktPnR5cGUgPSBBVF9VTlVTRUQ7CisJCW5pLT5uYW1lID0gTlVMTDsKKwkJbmktPm5hbWVfbGVuID0gMDsKKwl9CisJcmV0dXJuIG5pOworfQorCisvKioKKyAqIG50ZnNfaXNfZXh0ZW5kZWRfc3lzdGVtX2ZpbGUgLSBjaGVjayBpZiBhIGZpbGUgaXMgaW4gdGhlICRFeHRlbmQgZGlyZWN0b3J5CisgKiBAY3R4Oglpbml0aWFsaXplZCBhdHRyaWJ1dGUgc2VhcmNoIGNvbnRleHQKKyAqCisgKiBTZWFyY2ggYWxsIGZpbGUgbmFtZSBhdHRyaWJ1dGVzIGluIHRoZSBpbm9kZSBkZXNjcmliZWQgYnkgdGhlIGF0dHJpYnV0ZQorICogc2VhcmNoIGNvbnRleHQgQGN0eCBhbmQgY2hlY2sgaWYgYW55IG9mIHRoZSBuYW1lcyBhcmUgaW4gdGhlICRFeHRlbmQgc3lzdGVtCisgKiBkaXJlY3RvcnkuCisgKgorICogUmV0dXJuIHZhbHVlczoKKyAqCSAgIDE6IGZpbGUgaXMgaW4gJEV4dGVuZCBkaXJlY3RvcnkKKyAqCSAgIDA6IGZpbGUgaXMgbm90IGluICRFeHRlbmQgZGlyZWN0b3J5CisgKiAgICAtZXJybm86IGZhaWxlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGZpbGUgaXMgaW4gdGhlICRFeHRlbmQgZGlyZWN0b3J5CisgKi8KK3N0YXRpYyBpbnQgbnRmc19pc19leHRlbmRlZF9zeXN0ZW1fZmlsZShudGZzX2F0dHJfc2VhcmNoX2N0eCAqY3R4KQoreworCWludCBucl9saW5rcywgZXJyOworCisJLyogUmVzdGFydCBzZWFyY2guICovCisJbnRmc19hdHRyX3JlaW5pdF9zZWFyY2hfY3R4KGN0eCk7CisKKwkvKiBHZXQgbnVtYmVyIG9mIGhhcmQgbGlua3MuICovCisJbnJfbGlua3MgPSBsZTE2X3RvX2NwdShjdHgtPm1yZWMtPmxpbmtfY291bnQpOworCisJLyogTG9vcCB0aHJvdWdoIGFsbCBoYXJkIGxpbmtzLiAqLworCXdoaWxlICghKGVyciA9IG50ZnNfYXR0cl9sb29rdXAoQVRfRklMRV9OQU1FLCBOVUxMLCAwLCAwLCAwLCBOVUxMLCAwLAorCQkJY3R4KSkpIHsKKwkJRklMRV9OQU1FX0FUVFIgKmZpbGVfbmFtZV9hdHRyOworCQlBVFRSX1JFQ09SRCAqYXR0ciA9IGN0eC0+YXR0cjsKKwkJdTggKnAsICpwMjsKKworCQlucl9saW5rcy0tOworCQkvKgorCQkgKiBNYXhpbXVtIHNhbml0eSBjaGVja2luZyBhcyB3ZSBhcmUgY2FsbGVkIG9uIGFuIGlub2RlIHRoYXQKKwkJICogd2Ugc3VzcGVjdCBtaWdodCBiZSBjb3JydXB0LgorCQkgKi8KKwkJcCA9ICh1OCopYXR0ciArIGxlMzJfdG9fY3B1KGF0dHItPmxlbmd0aCk7CisJCWlmIChwIDwgKHU4KiljdHgtPm1yZWMgfHwgKHU4KilwID4gKHU4KiljdHgtPm1yZWMgKworCQkJCWxlMzJfdG9fY3B1KGN0eC0+bXJlYy0+Ynl0ZXNfaW5fdXNlKSkgeworZXJyX2NvcnJ1cHRfYXR0cjoKKwkJCW50ZnNfZXJyb3IoY3R4LT5udGZzX2luby0+dm9sLT5zYiwgIkNvcnJ1cHQgZmlsZSBuYW1lICIKKwkJCQkJImF0dHJpYnV0ZS4gWW91IHNob3VsZCBydW4gY2hrZHNrLiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJaWYgKGF0dHItPm5vbl9yZXNpZGVudCkgeworCQkJbnRmc19lcnJvcihjdHgtPm50ZnNfaW5vLT52b2wtPnNiLCAiTm9uLXJlc2lkZW50IGZpbGUgIgorCQkJCQkibmFtZS4gWW91IHNob3VsZCBydW4gY2hrZHNrLiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJaWYgKGF0dHItPmZsYWdzKSB7CisJCQludGZzX2Vycm9yKGN0eC0+bnRmc19pbm8tPnZvbC0+c2IsICJGaWxlIG5hbWUgd2l0aCAiCisJCQkJCSJpbnZhbGlkIGZsYWdzLiBZb3Ugc2hvdWxkIHJ1biAiCisJCQkJCSJjaGtkc2suIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlpZiAoIShhdHRyLT5kYXRhLnJlc2lkZW50LmZsYWdzICYgUkVTSURFTlRfQVRUUl9JU19JTkRFWEVEKSkgeworCQkJbnRmc19lcnJvcihjdHgtPm50ZnNfaW5vLT52b2wtPnNiLCAiVW5pbmRleGVkIGZpbGUgIgorCQkJCQkibmFtZS4gWW91IHNob3VsZCBydW4gY2hrZHNrLiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJZmlsZV9uYW1lX2F0dHIgPSAoRklMRV9OQU1FX0FUVFIqKSgodTgqKWF0dHIgKworCQkJCWxlMTZfdG9fY3B1KGF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSk7CisJCXAyID0gKHU4KilhdHRyICsgbGUzMl90b19jcHUoYXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpOworCQlpZiAocDIgPCAodTgqKWF0dHIgfHwgcDIgPiBwKQorCQkJZ290byBlcnJfY29ycnVwdF9hdHRyOworCQkvKiBUaGlzIGF0dHJpYnV0ZSBpcyBvaywgYnV0IGlzIGl0IGluIHRoZSAkRXh0ZW5kIGRpcmVjdG9yeT8gKi8KKwkJaWYgKE1SRUZfTEUoZmlsZV9uYW1lX2F0dHItPnBhcmVudF9kaXJlY3RvcnkpID09IEZJTEVfRXh0ZW5kKQorCQkJcmV0dXJuIDE7CS8qIFlFUywgaXQncyBhbiBleHRlbmRlZCBzeXN0ZW0gZmlsZS4gKi8KKwl9CisJaWYgKHVubGlrZWx5KGVyciAhPSAtRU5PRU5UKSkKKwkJcmV0dXJuIGVycjsKKwlpZiAodW5saWtlbHkobnJfbGlua3MpKSB7CisJCW50ZnNfZXJyb3IoY3R4LT5udGZzX2luby0+dm9sLT5zYiwgIklub2RlIGhhcmQgbGluayBjb3VudCAiCisJCQkJImRvZXNuJ3QgbWF0Y2ggbnVtYmVyIG9mIG5hbWUgYXR0cmlidXRlcy4gWW91ICIKKwkJCQkic2hvdWxkIHJ1biBjaGtkc2suIik7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsJLyogTk8sIGl0IGlzIG5vdCBhbiBleHRlbmRlZCBzeXN0ZW0gZmlsZS4gKi8KK30KKworLyoqCisgKiBudGZzX3JlYWRfbG9ja2VkX2lub2RlIC0gcmVhZCBhbiBpbm9kZSBmcm9tIGl0cyBkZXZpY2UKKyAqIEB2aToJCWlub2RlIHRvIHJlYWQKKyAqCisgKiBudGZzX3JlYWRfbG9ja2VkX2lub2RlKCkgaXMgY2FsbGVkIGZyb20gbnRmc19pZ2V0KCkgdG8gcmVhZCB0aGUgaW5vZGUKKyAqIGRlc2NyaWJlZCBieSBAdmkgaW50byBtZW1vcnkgZnJvbSB0aGUgZGV2aWNlLgorICoKKyAqIFRoZSBvbmx5IGZpZWxkcyBpbiBAdmkgdGhhdCB3ZSBuZWVkIHRvL2NhbiBsb29rIGF0IHdoZW4gdGhlIGZ1bmN0aW9uIGlzCisgKiBjYWxsZWQgYXJlIGlfc2IsIHBvaW50aW5nIHRvIHRoZSBtb3VudGVkIGRldmljZSdzIHN1cGVyIGJsb2NrLCBhbmQgaV9pbm8sCisgKiB0aGUgbnVtYmVyIG9mIHRoZSBpbm9kZSB0byBsb2FkLgorICoKKyAqIG50ZnNfcmVhZF9sb2NrZWRfaW5vZGUoKSBtYXBzLCBwaW5zIGFuZCBsb2NrcyB0aGUgbWZ0IHJlY29yZCBudW1iZXIgaV9pbm8KKyAqIGZvciByZWFkaW5nIGFuZCBzZXRzIHVwIHRoZSBuZWNlc3NhcnkgQHZpIGZpZWxkcyBhcyB3ZWxsIGFzIGluaXRpYWxpemluZworICogdGhlIG50ZnMgaW5vZGUuCisgKgorICogUTogV2hhdCBsb2NrcyBhcmUgaGVsZCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQ/CisgKiBBOiBpX3N0YXRlIGhhcyBJX0xPQ0sgc2V0LCBoZW5jZSB0aGUgaW5vZGUgaXMgbG9ja2VkLCBhbHNvCisgKiAgICBpX2NvdW50IGlzIHNldCB0byAxLCBzbyBpdCBpcyBub3QgZ29pbmcgdG8gZ28gYXdheQorICogICAgaV9mbGFncyBpcyBzZXQgdG8gMCBhbmQgd2UgaGF2ZSBubyBidXNpbmVzcyB0b3VjaGluZyBpdC4gIE9ubHkgYW4gaW9jdGwoKQorICogICAgaXMgYWxsb3dlZCB0byB3cml0ZSB0byB0aGVtLiBXZSBzaG91bGQgb2YgY291cnNlIGJlIGhvbm91cmluZyB0aGVtIGJ1dAorICogICAgd2UgbmVlZCB0byBkbyB0aGF0IHVzaW5nIHRoZSBJU18qIG1hY3JvcyBkZWZpbmVkIGluIGluY2x1ZGUvbGludXgvZnMuaC4KKyAqICAgIEluIGFueSBjYXNlIG50ZnNfcmVhZF9sb2NrZWRfaW5vZGUoKSBoYXMgbm90aGluZyB0byBkbyB3aXRoIGlfZmxhZ3MuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLiAgSW4gdGhlIGVycm9yIGNhc2UsIHRoZSBpbm9kZSB3aWxsCisgKiBoYXZlIGhhZCBtYWtlX2JhZF9pbm9kZSgpIGV4ZWN1dGVkIG9uIGl0LgorICovCitzdGF0aWMgaW50IG50ZnNfcmVhZF9sb2NrZWRfaW5vZGUoc3RydWN0IGlub2RlICp2aSkKK3sKKwludGZzX3ZvbHVtZSAqdm9sID0gTlRGU19TQih2aS0+aV9zYik7CisJbnRmc19pbm9kZSAqbmk7CisJTUZUX1JFQ09SRCAqbTsKKwlTVEFOREFSRF9JTkZPUk1BVElPTiAqc2k7CisJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eDsKKwlpbnQgZXJyID0gMDsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBpX2lubyAweCVseC4iLCB2aS0+aV9pbm8pOworCisJLyogU2V0dXAgdGhlIGdlbmVyaWMgdmZzIGlub2RlIHBhcnRzIG5vdy4gKi8KKworCS8qIFRoaXMgaXMgdGhlIG9wdGltYWwgSU8gc2l6ZSAoZm9yIHN0YXQpLCBub3QgdGhlIGZzIGJsb2NrIHNpemUuICovCisJdmktPmlfYmxrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKKwkvKgorCSAqIFRoaXMgaXMgZm9yIGNoZWNraW5nIHdoZXRoZXIgYW4gaW5vZGUgaGFzIGNoYW5nZWQgdy5yLnQuIGEgZmlsZSBzbworCSAqIHRoYXQgdGhlIGZpbGUgY2FuIGJlIHVwZGF0ZWQgaWYgbmVjZXNzYXJ5IChjb21wYXJlIHdpdGggZl92ZXJzaW9uKS4KKwkgKi8KKwl2aS0+aV92ZXJzaW9uID0gMTsKKworCXZpLT5pX3VpZCA9IHZvbC0+dWlkOworCXZpLT5pX2dpZCA9IHZvbC0+Z2lkOworCXZpLT5pX21vZGUgPSAwOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBudGZzIHNwZWNpZmljIHBhcnQgb2YgQHZpIHNwZWNpYWwgY2FzaW5nCisJICogRklMRV9NRlQgd2hpY2ggd2UgbmVlZCB0byBkbyBhdCBtb3VudCB0aW1lLgorCSAqLworCWlmICh2aS0+aV9pbm8gIT0gRklMRV9NRlQpCisJCW50ZnNfaW5pdF9iaWdfaW5vZGUodmkpOworCW5pID0gTlRGU19JKHZpKTsKKworCW0gPSBtYXBfbWZ0X3JlY29yZChuaSk7CisJaWYgKElTX0VSUihtKSkgeworCQllcnIgPSBQVFJfRVJSKG0pOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWN0eCA9IG50ZnNfYXR0cl9nZXRfc2VhcmNoX2N0eChuaSwgbSk7CisJaWYgKCFjdHgpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisKKwlpZiAoIShtLT5mbGFncyAmIE1GVF9SRUNPUkRfSU5fVVNFKSkgeworCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiSW5vZGUgaXMgbm90IGluIHVzZSEiKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJaWYgKG0tPmJhc2VfbWZ0X3JlY29yZCkgeworCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiSW5vZGUgaXMgYW4gZXh0ZW50IGlub2RlISIpOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKworCS8qIFRyYW5zZmVyIGluZm9ybWF0aW9uIGZyb20gbWZ0IHJlY29yZCBpbnRvIHZmcyBhbmQgbnRmcyBpbm9kZXMuICovCisJdmktPmlfZ2VuZXJhdGlvbiA9IG5pLT5zZXFfbm8gPSBsZTE2X3RvX2NwdShtLT5zZXF1ZW5jZV9udW1iZXIpOworCisJLyoKKwkgKiBGSVhNRTogS2VlcCBpbiBtaW5kIHRoYXQgbGlua19jb3VudCBpcyB0d28gZm9yIGZpbGVzIHdoaWNoIGhhdmUgYm90aAorCSAqIGEgbG9uZyBmaWxlIG5hbWUgYW5kIGEgc2hvcnQgZmlsZSBuYW1lIGFzIHNlcGFyYXRlIGVudHJpZXMsIHNvIGlmCisJICogd2UgYXJlIGhpZGluZyBzaG9ydCBmaWxlIG5hbWVzIHRoaXMgd2lsbCBiZSB0b28gaGlnaC4gRWl0aGVyIHdlIG5lZWQKKwkgKiB0byBhY2NvdW50IGZvciB0aGUgc2hvcnQgZmlsZSBuYW1lcyBieSBzdWJ0cmFjdGluZyB0aGVtIG9yIHdlIG5lZWQKKwkgKiB0byBtYWtlIHN1cmUgd2UgZGVsZXRlIGZpbGVzIGV2ZW4gdGhvdWdoIGlfbmxpbmsgaXMgbm90IHplcm8gd2hpY2gKKwkgKiBtaWdodCBiZSB0cmlja3kgZHVlIHRvIHZmcyBpbnRlcmFjdGlvbnMuIE5lZWQgdG8gdGhpbmsgYWJvdXQgdGhpcworCSAqIHNvbWUgbW9yZSB3aGVuIGltcGxlbWVudGluZyB0aGUgdW5saW5rIGNvbW1hbmQuCisJICovCisJdmktPmlfbmxpbmsgPSBsZTE2X3RvX2NwdShtLT5saW5rX2NvdW50KTsKKwkvKgorCSAqIEZJWE1FOiBSZXBhcnNlIHBvaW50cyBjYW4gaGF2ZSB0aGUgZGlyZWN0b3J5IGJpdCBzZXQgZXZlbiB0aG91Z2gKKwkgKiB0aGV5IHdvdWxkIGJlIFNfSUZMTksuIE5lZWQgdG8gZGVhbCB3aXRoIHRoaXMgZnVydGhlciBiZWxvdyB3aGVuIHdlCisJICogaW1wbGVtZW50IHJlcGFyc2UgcG9pbnRzIC8gc3ltYm9saWMgbGlua3MgYnV0IGl0IHdpbGwgZG8gZm9yIG5vdy4KKwkgKiBBbHNvIGlmIG5vdCBhIGRpcmVjdG9yeSwgaXQgY291bGQgYmUgc29tZXRoaW5nIGVsc2UsIHJhdGhlciB0aGFuCisJICogYSByZWd1bGFyIGZpbGUuIEJ1dCBhZ2Fpbiwgd2lsbCBkbyBmb3Igbm93LgorCSAqLworCS8qIEV2ZXJ5b25lIGdldHMgYWxsIHBlcm1pc3Npb25zLiAqLworCXZpLT5pX21vZGUgfD0gU19JUldYVUdPOworCS8qIElmIHJlYWQtb25seSwgbm9vbmUgZ2V0cyB3cml0ZSBwZXJtaXNzaW9ucy4gKi8KKwlpZiAoSVNfUkRPTkxZKHZpKSkKKwkJdmktPmlfbW9kZSAmPSB+U19JV1VHTzsKKwlpZiAobS0+ZmxhZ3MgJiBNRlRfUkVDT1JEX0lTX0RJUkVDVE9SWSkgeworCQl2aS0+aV9tb2RlIHw9IFNfSUZESVI7CisJCS8qCisJCSAqIEFwcGx5IHRoZSBkaXJlY3RvcnkgcGVybWlzc2lvbnMgbWFzayBzZXQgaW4gdGhlIG1vdW50CisJCSAqIG9wdGlvbnMuCisJCSAqLworCQl2aS0+aV9tb2RlICY9IH52b2wtPmRtYXNrOworCQkvKiBUaGluZ3MgYnJlYWsgd2l0aG91dCB0aGlzIGtsdWRnZSEgKi8KKwkJaWYgKHZpLT5pX25saW5rID4gMSkKKwkJCXZpLT5pX25saW5rID0gMTsKKwl9IGVsc2UgeworCQl2aS0+aV9tb2RlIHw9IFNfSUZSRUc7CisJCS8qIEFwcGx5IHRoZSBmaWxlIHBlcm1pc3Npb25zIG1hc2sgc2V0IGluIHRoZSBtb3VudCBvcHRpb25zLiAqLworCQl2aS0+aV9tb2RlICY9IH52b2wtPmZtYXNrOworCX0KKwkvKgorCSAqIEZpbmQgdGhlIHN0YW5kYXJkIGluZm9ybWF0aW9uIGF0dHJpYnV0ZSBpbiB0aGUgbWZ0IHJlY29yZC4gQXQgdGhpcworCSAqIHN0YWdlIHdlIGhhdmVuJ3Qgc2V0dXAgdGhlIGF0dHJpYnV0ZSBsaXN0IHN0dWZmIHlldCwgc28gdGhpcyBjb3VsZAorCSAqIGluIGZhY3QgZmFpbCBpZiB0aGUgc3RhbmRhcmQgaW5mb3JtYXRpb24gaXMgaW4gYW4gZXh0ZW50IHJlY29yZCwgYnV0CisJICogSSBkb24ndCB0aGluayB0aGlzIGFjdHVhbGx5IGV2ZXIgaGFwcGVucy4KKwkgKi8KKwllcnIgPSBudGZzX2F0dHJfbG9va3VwKEFUX1NUQU5EQVJEX0lORk9STUFUSU9OLCBOVUxMLCAwLCAwLCAwLCBOVUxMLCAwLAorCQkJY3R4KTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQlpZiAoZXJyID09IC1FTk9FTlQpIHsKKwkJCS8qCisJCQkgKiBUT0RPOiBXZSBzaG91bGQgYmUgcGVyZm9ybWluZyBhIGhvdCBmaXggaGVyZSAoaWYgdGhlCisJCQkgKiByZWNvdmVyIG1vdW50IG9wdGlvbiBpcyBzZXQpIGJ5IGNyZWF0aW5nIGEgbmV3CisJCQkgKiBhdHRyaWJ1dGUuCisJCQkgKi8KKwkJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkU1RBTkRBUkRfSU5GT1JNQVRJT04gYXR0cmlidXRlICIKKwkJCQkJImlzIG1pc3NpbmcuIik7CisJCX0KKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJLyogR2V0IHRoZSBzdGFuZGFyZCBpbmZvcm1hdGlvbiBhdHRyaWJ1dGUgdmFsdWUuICovCisJc2kgPSAoU1RBTkRBUkRfSU5GT1JNQVRJT04qKSgoY2hhciopY3R4LT5hdHRyICsKKwkJCWxlMTZfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpKTsKKworCS8qIFRyYW5zZmVyIGluZm9ybWF0aW9uIGZyb20gdGhlIHN0YW5kYXJkIGluZm9ybWF0aW9uIGludG8gdmkuICovCisJLyoKKwkgKiBOb3RlOiBUaGUgaV8/dGltZXMgZG8gbm90IHF1aXRlIG1hcCBwZXJmZWN0bHkgb250byB0aGUgTlRGUyB0aW1lcywKKwkgKiBidXQgdGhleSBhcmUgY2xvc2UgZW5vdWdoLCBhbmQgaW4gdGhlIGVuZCBpdCBkb2Vzbid0IHJlYWxseSBtYXR0ZXIKKwkgKiB0aGF0IG11Y2guLi4KKwkgKi8KKwkvKgorCSAqIG10aW1lIGlzIHRoZSBsYXN0IGNoYW5nZSBvZiB0aGUgZGF0YSB3aXRoaW4gdGhlIGZpbGUuIE5vdCBjaGFuZ2VkCisJICogd2hlbiBvbmx5IG1ldGFkYXRhIGlzIGNoYW5nZWQsIGUuZy4gYSByZW5hbWUgZG9lc24ndCBhZmZlY3QgbXRpbWUuCisJICovCisJdmktPmlfbXRpbWUgPSBudGZzMnV0YyhzaS0+bGFzdF9kYXRhX2NoYW5nZV90aW1lKTsKKwkvKgorCSAqIGN0aW1lIGlzIHRoZSBsYXN0IGNoYW5nZSBvZiB0aGUgbWV0YWRhdGEgb2YgdGhlIGZpbGUuIFRoaXMgb2J2aW91c2x5CisJICogYWx3YXlzIGNoYW5nZXMsIHdoZW4gbXRpbWUgaXMgY2hhbmdlZC4gY3RpbWUgY2FuIGJlIGNoYW5nZWQgb24gaXRzCisJICogb3duLCBtdGltZSBpcyB0aGVuIG5vdCBjaGFuZ2VkLCBlLmcuIHdoZW4gYSBmaWxlIGlzIHJlbmFtZWQuCisJICovCisJdmktPmlfY3RpbWUgPSBudGZzMnV0YyhzaS0+bGFzdF9tZnRfY2hhbmdlX3RpbWUpOworCS8qCisJICogTGFzdCBhY2Nlc3MgdG8gdGhlIGRhdGEgd2l0aGluIHRoZSBmaWxlLiBOb3QgY2hhbmdlZCBkdXJpbmcgYSByZW5hbWUKKwkgKiBmb3IgZXhhbXBsZSBidXQgY2hhbmdlZCB3aGVuZXZlciB0aGUgZmlsZSBpcyB3cml0dGVuIHRvLgorCSAqLworCXZpLT5pX2F0aW1lID0gbnRmczJ1dGMoc2ktPmxhc3RfYWNjZXNzX3RpbWUpOworCisJLyogRmluZCB0aGUgYXR0cmlidXRlIGxpc3QgYXR0cmlidXRlIGlmIHByZXNlbnQuICovCisJbnRmc19hdHRyX3JlaW5pdF9zZWFyY2hfY3R4KGN0eCk7CisJZXJyID0gbnRmc19hdHRyX2xvb2t1cChBVF9BVFRSSUJVVEVfTElTVCwgTlVMTCwgMCwgMCwgMCwgTlVMTCwgMCwgY3R4KTsKKwlpZiAoZXJyKSB7CisJCWlmICh1bmxpa2VseShlcnIgIT0gLUVOT0VOVCkpIHsKKwkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGYWlsZWQgdG8gbG9va3VwIGF0dHJpYnV0ZSBsaXN0ICIKKwkJCQkJImF0dHJpYnV0ZS4iKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwl9IGVsc2UgLyogaWYgKCFlcnIpICovIHsKKwkJaWYgKHZpLT5pX2lubyA9PSBGSUxFX01GVCkKKwkJCWdvdG8gc2tpcF9hdHRyX2xpc3RfbG9hZDsKKwkJbnRmc19kZWJ1ZygiQXR0cmlidXRlIGxpc3QgZm91bmQgaW4gaW5vZGUgMHglbHguIiwgdmktPmlfaW5vKTsKKwkJTklub1NldEF0dHJMaXN0KG5pKTsKKwkJaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0lTX0VOQ1JZUFRFRCB8fAorCQkJCWN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0sgfHwKKwkJCQljdHgtPmF0dHItPmZsYWdzICYgQVRUUl9JU19TUEFSU0UpIHsKKwkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJBdHRyaWJ1dGUgbGlzdCBhdHRyaWJ1dGUgaXMgIgorCQkJCQkiY29tcHJlc3NlZC9lbmNyeXB0ZWQvc3BhcnNlLiIpOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQkvKiBOb3cgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgYXR0cmlidXRlIGxpc3QuICovCisJCW5pLT5hdHRyX2xpc3Rfc2l6ZSA9ICh1MzIpbnRmc19hdHRyX3NpemUoY3R4LT5hdHRyKTsKKwkJbmktPmF0dHJfbGlzdCA9IG50ZnNfbWFsbG9jX25vZnMobmktPmF0dHJfbGlzdF9zaXplKTsKKwkJaWYgKCFuaS0+YXR0cl9saXN0KSB7CisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgIgorCQkJCQkiYnVmZmVyIGZvciBhdHRyaWJ1dGUgbGlzdC4iKTsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIHVubV9lcnJfb3V0OworCQl9CisJCWlmIChjdHgtPmF0dHItPm5vbl9yZXNpZGVudCkgeworCQkJTklub1NldEF0dHJMaXN0Tm9uUmVzaWRlbnQobmkpOworCQkJaWYgKGN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQubG93ZXN0X3ZjbikgeworCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJBdHRyaWJ1dGUgbGlzdCBoYXMgbm9uICIKKwkJCQkJCSJ6ZXJvIGxvd2VzdF92Y24uIik7CisJCQkJZ290byB1bm1fZXJyX291dDsKKwkJCX0KKwkJCS8qCisJCQkgKiBTZXR1cCB0aGUgcnVubGlzdC4gTm8gbmVlZCBmb3IgbG9ja2luZyBhcyB3ZSBoYXZlCisJCQkgKiBleGNsdXNpdmUgYWNjZXNzIHRvIHRoZSBpbm9kZSBhdCB0aGlzIHRpbWUuCisJCQkgKi8KKwkJCW5pLT5hdHRyX2xpc3RfcmwucmwgPSBudGZzX21hcHBpbmdfcGFpcnNfZGVjb21wcmVzcyh2b2wsCisJCQkJCWN0eC0+YXR0ciwgTlVMTCk7CisJCQlpZiAoSVNfRVJSKG5pLT5hdHRyX2xpc3RfcmwucmwpKSB7CisJCQkJZXJyID0gUFRSX0VSUihuaS0+YXR0cl9saXN0X3JsLnJsKTsKKwkJCQluaS0+YXR0cl9saXN0X3JsLnJsID0gTlVMTDsKKwkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiTWFwcGluZyBwYWlycyAiCisJCQkJCQkiZGVjb21wcmVzc2lvbiBmYWlsZWQuIik7CisJCQkJZ290byB1bm1fZXJyX291dDsKKwkJCX0KKwkJCS8qIE5vdyBsb2FkIHRoZSBhdHRyaWJ1dGUgbGlzdC4gKi8KKwkJCWlmICgoZXJyID0gbG9hZF9hdHRyaWJ1dGVfbGlzdCh2b2wsICZuaS0+YXR0cl9saXN0X3JsLAorCQkJCQluaS0+YXR0cl9saXN0LCBuaS0+YXR0cl9saXN0X3NpemUsCisJCQkJCXNsZTY0X3RvX2NwdShjdHgtPmF0dHItPmRhdGEuCisJCQkJCW5vbl9yZXNpZGVudC5pbml0aWFsaXplZF9zaXplKSkpKSB7CisJCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZhaWxlZCB0byBsb2FkICIKKwkJCQkJCSJhdHRyaWJ1dGUgbGlzdCBhdHRyaWJ1dGUuIik7CisJCQkJZ290byB1bm1fZXJyX291dDsKKwkJCX0KKwkJfSBlbHNlIC8qIGlmICghY3R4LmF0dHItPm5vbl9yZXNpZGVudCkgKi8geworCQkJaWYgKCh1OCopY3R4LT5hdHRyICsgbGUxNl90b19jcHUoCisJCQkJCWN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpICsKKwkJCQkJbGUzMl90b19jcHUoCisJCQkJCWN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpID4KKwkJCQkJKHU4KiljdHgtPm1yZWMgKyB2b2wtPm1mdF9yZWNvcmRfc2l6ZSkgeworCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJDb3JydXB0IGF0dHJpYnV0ZSBsaXN0ICIKKwkJCQkJCSJpbiBpbm9kZS4iKTsKKwkJCQlnb3RvIHVubV9lcnJfb3V0OworCQkJfQorCQkJLyogTm93IGNvcHkgdGhlIGF0dHJpYnV0ZSBsaXN0LiAqLworCQkJbWVtY3B5KG5pLT5hdHRyX2xpc3QsICh1OCopY3R4LT5hdHRyICsgbGUxNl90b19jcHUoCisJCQkJCWN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpLAorCQkJCQlsZTMyX3RvX2NwdSgKKwkJCQkJY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCkpOworCQl9CisJfQorc2tpcF9hdHRyX2xpc3RfbG9hZDoKKwkvKgorCSAqIElmIGFuIGF0dHJpYnV0ZSBsaXN0IGlzIHByZXNlbnQgd2Ugbm93IGhhdmUgdGhlIGF0dHJpYnV0ZSBsaXN0IHZhbHVlCisJICogaW4gbnRmc19pbm8tPmF0dHJfbGlzdCBhbmQgaXQgaXMgbnRmc19pbm8tPmF0dHJfbGlzdF9zaXplIGJ5dGVzLgorCSAqLworCWlmIChTX0lTRElSKHZpLT5pX21vZGUpKSB7CisJCXN0cnVjdCBpbm9kZSAqYnZpOworCQludGZzX2lub2RlICpibmk7CisJCUlOREVYX1JPT1QgKmlyOworCQljaGFyICppcl9lbmQsICppbmRleF9lbmQ7CisKKwkJLyogSXQgaXMgYSBkaXJlY3RvcnksIGZpbmQgaW5kZXggcm9vdCBhdHRyaWJ1dGUuICovCisJCW50ZnNfYXR0cl9yZWluaXRfc2VhcmNoX2N0eChjdHgpOworCQllcnIgPSBudGZzX2F0dHJfbG9va3VwKEFUX0lOREVYX1JPT1QsIEkzMCwgNCwgQ0FTRV9TRU5TSVRJVkUsCisJCQkJMCwgTlVMTCwgMCwgY3R4KTsKKwkJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJCWlmIChlcnIgPT0gLUVOT0VOVCkgeworCQkJCS8vIEZJWE1FOiBGaWxlIGlzIGNvcnJ1cHQhIEhvdC1maXggd2l0aCBlbXB0eQorCQkJCS8vIGluZGV4IHJvb3QgYXR0cmlidXRlIGlmIHJlY292ZXJ5IG9wdGlvbiBpcworCQkJCS8vIHNldC4KKwkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiJElOREVYX1JPT1QgYXR0cmlidXRlICIKKwkJCQkJCSJpcyBtaXNzaW5nLiIpOworCQkJfQorCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQkvKiBTZXQgdXAgdGhlIHN0YXRlLiAqLworCQlpZiAodW5saWtlbHkoY3R4LT5hdHRyLT5ub25fcmVzaWRlbnQpKSB7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICIkSU5ERVhfUk9PVCBhdHRyaWJ1dGUgaXMgbm90ICIKKwkJCQkJInJlc2lkZW50LiIpOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQkvKiBFbnN1cmUgdGhlIGF0dHJpYnV0ZSBuYW1lIGlzIHBsYWNlZCBiZWZvcmUgdGhlIHZhbHVlLiAqLworCQlpZiAodW5saWtlbHkoY3R4LT5hdHRyLT5uYW1lX2xlbmd0aCAmJgorCQkJCShsZTE2X3RvX2NwdShjdHgtPmF0dHItPm5hbWVfb2Zmc2V0KSA+PQorCQkJCWxlMTZfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC4KKwkJCQl2YWx1ZV9vZmZzZXQpKSkpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIiRJTkRFWF9ST09UIGF0dHJpYnV0ZSBuYW1lIGlzICIKKwkJCQkJInBsYWNlZCBhZnRlciB0aGUgYXR0cmlidXRlIHZhbHVlLiIpOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQkvKgorCQkgKiBDb21wcmVzc2VkL2VuY3J5cHRlZCBpbmRleCByb290IGp1c3QgbWVhbnMgdGhhdCB0aGUgbmV3bHkKKwkJICogY3JlYXRlZCBmaWxlcyBpbiB0aGF0IGRpcmVjdG9yeSBzaG91bGQgYmUgY3JlYXRlZCBjb21wcmVzc2VkLworCQkgKiBlbmNyeXB0ZWQuIEhvd2V2ZXIgaW5kZXggcm9vdCBjYW5ub3QgYmUgYm90aCBjb21wcmVzc2VkIGFuZAorCQkgKiBlbmNyeXB0ZWQuCisJCSAqLworCQlpZiAoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSykKKwkJCU5Jbm9TZXRDb21wcmVzc2VkKG5pKTsKKwkJaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0lTX0VOQ1JZUFRFRCkgeworCQkJaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0spIHsKKwkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgZW5jcnlwdGVkIGFuZCAiCisJCQkJCQkiY29tcHJlc3NlZCBhdHRyaWJ1dGUuIik7CisJCQkJZ290byB1bm1fZXJyX291dDsKKwkJCX0KKwkJCU5Jbm9TZXRFbmNyeXB0ZWQobmkpOworCQl9CisJCWlmIChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9JU19TUEFSU0UpCisJCQlOSW5vU2V0U3BhcnNlKG5pKTsKKwkJaXIgPSAoSU5ERVhfUk9PVCopKChjaGFyKiljdHgtPmF0dHIgKyBsZTE2X3RvX2NwdSgKKwkJCQljdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSk7CisJCWlyX2VuZCA9IChjaGFyKilpciArIGxlMzJfdG9fY3B1KAorCQkJCWN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpOworCQlpZiAoaXJfZW5kID4gKGNoYXIqKWN0eC0+bXJlYyArIHZvbC0+bWZ0X3JlY29yZF9zaXplKSB7CisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiJElOREVYX1JPT1QgYXR0cmlidXRlIGlzICIKKwkJCQkJImNvcnJ1cHQuIik7CisJCQlnb3RvIHVubV9lcnJfb3V0OworCQl9CisJCWluZGV4X2VuZCA9IChjaGFyKikmaXItPmluZGV4ICsKKwkJCQlsZTMyX3RvX2NwdShpci0+aW5kZXguaW5kZXhfbGVuZ3RoKTsKKwkJaWYgKGluZGV4X2VuZCA+IGlyX2VuZCkgeworCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkRpcmVjdG9yeSBpbmRleCBpcyBjb3JydXB0LiIpOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQlpZiAoaXItPnR5cGUgIT0gQVRfRklMRV9OQU1FKSB7CisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiSW5kZXhlZCBhdHRyaWJ1dGUgaXMgbm90ICIKKwkJCQkJIiRGSUxFX05BTUUuIik7CisJCQlnb3RvIHVubV9lcnJfb3V0OworCQl9CisJCWlmIChpci0+Y29sbGF0aW9uX3J1bGUgIT0gQ09MTEFUSU9OX0ZJTEVfTkFNRSkgeworCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkluZGV4IGNvbGxhdGlvbiBydWxlIGlzIG5vdCAiCisJCQkJCSJDT0xMQVRJT05fRklMRV9OQU1FLiIpOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQluaS0+aXR5cGUuaW5kZXguY29sbGF0aW9uX3J1bGUgPSBpci0+Y29sbGF0aW9uX3J1bGU7CisJCW5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplID0gbGUzMl90b19jcHUoaXItPmluZGV4X2Jsb2NrX3NpemUpOworCQlpZiAobmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUgJgorCQkJCShuaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSAtIDEpKSB7CisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiSW5kZXggYmxvY2sgc2l6ZSAoJXUpIGlzIG5vdCBhICIKKwkJCQkJInBvd2VyIG9mIHR3by4iLAorCQkJCQluaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSk7CisJCQlnb3RvIHVubV9lcnJfb3V0OworCQl9CisJCWlmIChuaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSA+IFBBR0VfQ0FDSEVfU0laRSkgeworCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkluZGV4IGJsb2NrIHNpemUgKCV1KSA+ICIKKwkJCQkJIlBBR0VfQ0FDSEVfU0laRSAoJWxkKSBpcyBub3QgIgorCQkJCQkic3VwcG9ydGVkLiAgU29ycnkuIiwKKwkJCQkJbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUsCisJCQkJCVBBR0VfQ0FDSEVfU0laRSk7CisJCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJaWYgKG5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplIDwgTlRGU19CTE9DS19TSVpFKSB7CisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiSW5kZXggYmxvY2sgc2l6ZSAoJXUpIDwgIgorCQkJCQkiTlRGU19CTE9DS19TSVpFICglaSkgaXMgbm90ICIKKwkJCQkJInN1cHBvcnRlZC4gIFNvcnJ5LiIsCisJCQkJCW5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplLAorCQkJCQlOVEZTX0JMT0NLX1NJWkUpOworCQkJZXJyID0gLUVPUE5PVFNVUFA7CisJCQlnb3RvIHVubV9lcnJfb3V0OworCQl9CisJCW5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplX2JpdHMgPQorCQkJCWZmcyhuaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSkgLSAxOworCQkvKiBEZXRlcm1pbmUgdGhlIHNpemUgb2YgYSB2Y24gaW4gdGhlIGRpcmVjdG9yeSBpbmRleC4gKi8KKwkJaWYgKHZvbC0+Y2x1c3Rlcl9zaXplIDw9IG5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplKSB7CisJCQluaS0+aXR5cGUuaW5kZXgudmNuX3NpemUgPSB2b2wtPmNsdXN0ZXJfc2l6ZTsKKwkJCW5pLT5pdHlwZS5pbmRleC52Y25fc2l6ZV9iaXRzID0gdm9sLT5jbHVzdGVyX3NpemVfYml0czsKKwkJfSBlbHNlIHsKKwkJCW5pLT5pdHlwZS5pbmRleC52Y25fc2l6ZSA9IHZvbC0+c2VjdG9yX3NpemU7CisJCQluaS0+aXR5cGUuaW5kZXgudmNuX3NpemVfYml0cyA9IHZvbC0+c2VjdG9yX3NpemVfYml0czsKKwkJfQorCisJCS8qIFNldHVwIHRoZSBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZSwgZXZlbiBpZiBub3QgcHJlc2VudC4gKi8KKwkJTklub1NldE1zdFByb3RlY3RlZChuaSk7CisJCW5pLT50eXBlID0gQVRfSU5ERVhfQUxMT0NBVElPTjsKKwkJbmktPm5hbWUgPSBJMzA7CisJCW5pLT5uYW1lX2xlbiA9IDQ7CisKKwkJaWYgKCEoaXItPmluZGV4LmZsYWdzICYgTEFSR0VfSU5ERVgpKSB7CisJCQkvKiBObyBpbmRleCBhbGxvY2F0aW9uLiAqLworCQkJdmktPmlfc2l6ZSA9IG5pLT5pbml0aWFsaXplZF9zaXplID0KKwkJCQkJbmktPmFsbG9jYXRlZF9zaXplID0gMDsKKwkJCS8qIFdlIGFyZSBkb25lIHdpdGggdGhlIG1mdCByZWNvcmQsIHNvIHdlIHJlbGVhc2UgaXQuICovCisJCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwkJCXVubWFwX21mdF9yZWNvcmQobmkpOworCQkJbSA9IE5VTEw7CisJCQljdHggPSBOVUxMOworCQkJZ290byBza2lwX2xhcmdlX2Rpcl9zdHVmZjsKKwkJfSAvKiBMQVJHRV9JTkRFWDogSW5kZXggYWxsb2NhdGlvbiBwcmVzZW50LiBTZXR1cCBzdGF0ZS4gKi8KKwkJTklub1NldEluZGV4QWxsb2NQcmVzZW50KG5pKTsKKwkJLyogRmluZCBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZS4gKi8KKwkJbnRmc19hdHRyX3JlaW5pdF9zZWFyY2hfY3R4KGN0eCk7CisJCWVyciA9IG50ZnNfYXR0cl9sb29rdXAoQVRfSU5ERVhfQUxMT0NBVElPTiwgSTMwLCA0LAorCQkJCUNBU0VfU0VOU0lUSVZFLCAwLCBOVUxMLCAwLCBjdHgpOworCQlpZiAodW5saWtlbHkoZXJyKSkgeworCQkJaWYgKGVyciA9PSAtRU5PRU5UKQorCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkSU5ERVhfQUxMT0NBVElPTiAiCisJCQkJCQkiYXR0cmlidXRlIGlzIG5vdCBwcmVzZW50IGJ1dCAiCisJCQkJCQkiJElOREVYX1JPT1QgaW5kaWNhdGVkIGl0IGlzLiIpOworCQkJZWxzZQorCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGYWlsZWQgdG8gbG9va3VwICIKKwkJCQkJCSIkSU5ERVhfQUxMT0NBVElPTiAiCisJCQkJCQkiYXR0cmlidXRlLiIpOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQlpZiAoIWN0eC0+YXR0ci0+bm9uX3Jlc2lkZW50KSB7CisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiJElOREVYX0FMTE9DQVRJT04gYXR0cmlidXRlICIKKwkJCQkJImlzIHJlc2lkZW50LiIpOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQkvKgorCQkgKiBFbnN1cmUgdGhlIGF0dHJpYnV0ZSBuYW1lIGlzIHBsYWNlZCBiZWZvcmUgdGhlIG1hcHBpbmcgcGFpcnMKKwkJICogYXJyYXkuCisJCSAqLworCQlpZiAodW5saWtlbHkoY3R4LT5hdHRyLT5uYW1lX2xlbmd0aCAmJgorCQkJCShsZTE2X3RvX2NwdShjdHgtPmF0dHItPm5hbWVfb2Zmc2V0KSA+PQorCQkJCWxlMTZfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuCisJCQkJbWFwcGluZ19wYWlyc19vZmZzZXQpKSkpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIiRJTkRFWF9BTExPQ0FUSU9OIGF0dHJpYnV0ZSBuYW1lICIKKwkJCQkJImlzIHBsYWNlZCBhZnRlciB0aGUgbWFwcGluZyBwYWlycyAiCisJCQkJCSJhcnJheS4iKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0lTX0VOQ1JZUFRFRCkgeworCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRJTkRFWF9BTExPQ0FUSU9OIGF0dHJpYnV0ZSAiCisJCQkJCSJpcyBlbmNyeXB0ZWQuIik7CisJCQlnb3RvIHVubV9lcnJfb3V0OworCQl9CisJCWlmIChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9JU19TUEFSU0UpIHsKKwkJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkSU5ERVhfQUxMT0NBVElPTiBhdHRyaWJ1dGUgIgorCQkJCQkiaXMgc3BhcnNlLiIpOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQlpZiAoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSykgeworCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRJTkRFWF9BTExPQ0FUSU9OIGF0dHJpYnV0ZSAiCisJCQkJCSJpcyBjb21wcmVzc2VkLiIpOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQlpZiAoY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5sb3dlc3RfdmNuKSB7CisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRmlyc3QgZXh0ZW50IG9mICIKKwkJCQkJIiRJTkRFWF9BTExPQ0FUSU9OIGF0dHJpYnV0ZSBoYXMgbm9uICIKKwkJCQkJInplcm8gbG93ZXN0X3Zjbi4iKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJdmktPmlfc2l6ZSA9IHNsZTY0X3RvX2NwdSgKKwkJCQljdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LmRhdGFfc2l6ZSk7CisJCW5pLT5pbml0aWFsaXplZF9zaXplID0gc2xlNjRfdG9fY3B1KAorCQkJCWN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuaW5pdGlhbGl6ZWRfc2l6ZSk7CisJCW5pLT5hbGxvY2F0ZWRfc2l6ZSA9IHNsZTY0X3RvX2NwdSgKKwkJCQljdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LmFsbG9jYXRlZF9zaXplKTsKKwkJLyoKKwkJICogV2UgYXJlIGRvbmUgd2l0aCB0aGUgbWZ0IHJlY29yZCwgc28gd2UgcmVsZWFzZSBpdC4gT3RoZXJ3aXNlCisJCSAqIHdlIHdvdWxkIGRlYWRsb2NrIGluIG50ZnNfYXR0cl9pZ2V0KCkuCisJCSAqLworCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwkJdW5tYXBfbWZ0X3JlY29yZChuaSk7CisJCW0gPSBOVUxMOworCQljdHggPSBOVUxMOworCQkvKiBHZXQgdGhlIGluZGV4IGJpdG1hcCBhdHRyaWJ1dGUgaW5vZGUuICovCisJCWJ2aSA9IG50ZnNfYXR0cl9pZ2V0KHZpLCBBVF9CSVRNQVAsIEkzMCwgNCk7CisJCWlmIChJU19FUlIoYnZpKSkgeworCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZhaWxlZCB0byBnZXQgYml0bWFwIGF0dHJpYnV0ZS4iKTsKKwkJCWVyciA9IFBUUl9FUlIoYnZpKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJbmktPml0eXBlLmluZGV4LmJtcF9pbm8gPSBidmk7CisJCWJuaSA9IE5URlNfSShidmkpOworCQlpZiAoTklub0NvbXByZXNzZWQoYm5pKSB8fCBOSW5vRW5jcnlwdGVkKGJuaSkgfHwKKwkJCQlOSW5vU3BhcnNlKGJuaSkpIHsKKwkJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkQklUTUFQIGF0dHJpYnV0ZSBpcyBjb21wcmVzc2VkICIKKwkJCQkJImFuZC9vciBlbmNyeXB0ZWQgYW5kL29yIHNwYXJzZS4iKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJLyogQ29uc2lzdGVuY3kgY2hlY2sgYml0bWFwIHNpemUgdnMuIGluZGV4IGFsbG9jYXRpb24gc2l6ZS4gKi8KKwkJaWYgKChidmktPmlfc2l6ZSA8PCAzKSA8ICh2aS0+aV9zaXplID4+CisJCQkJbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemVfYml0cykpIHsKKwkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJJbmRleCBiaXRtYXAgdG9vIHNtYWxsICgweCVsbHgpICIKKwkJCQkJImZvciBpbmRleCBhbGxvY2F0aW9uICgweCVsbHgpLiIsCisJCQkJCWJ2aS0+aV9zaXplIDw8IDMsIHZpLT5pX3NpemUpOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorc2tpcF9sYXJnZV9kaXJfc3R1ZmY6CisJCS8qIFNldHVwIHRoZSBvcGVyYXRpb25zIGZvciB0aGlzIGlub2RlLiAqLworCQl2aS0+aV9vcCA9ICZudGZzX2Rpcl9pbm9kZV9vcHM7CisJCXZpLT5pX2ZvcCA9ICZudGZzX2Rpcl9vcHM7CisJfSBlbHNlIHsKKwkJLyogSXQgaXMgYSBmaWxlLiAqLworCQludGZzX2F0dHJfcmVpbml0X3NlYXJjaF9jdHgoY3R4KTsKKworCQkvKiBTZXR1cCB0aGUgZGF0YSBhdHRyaWJ1dGUsIGV2ZW4gaWYgbm90IHByZXNlbnQuICovCisJCW5pLT50eXBlID0gQVRfREFUQTsKKwkJbmktPm5hbWUgPSBOVUxMOworCQluaS0+bmFtZV9sZW4gPSAwOworCisJCS8qIEZpbmQgZmlyc3QgZXh0ZW50IG9mIHRoZSB1bm5hbWVkIGRhdGEgYXR0cmlidXRlLiAqLworCQllcnIgPSBudGZzX2F0dHJfbG9va3VwKEFUX0RBVEEsIE5VTEwsIDAsIDAsIDAsIE5VTEwsIDAsIGN0eCk7CisJCWlmICh1bmxpa2VseShlcnIpKSB7CisJCQl2aS0+aV9zaXplID0gbmktPmluaXRpYWxpemVkX3NpemUgPQorCQkJCQluaS0+YWxsb2NhdGVkX3NpemUgPSAwOworCQkJaWYgKGVyciAhPSAtRU5PRU5UKSB7CisJCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZhaWxlZCB0byBsb29rdXAgJERBVEEgIgorCQkJCQkJImF0dHJpYnV0ZS4iKTsKKwkJCQlnb3RvIHVubV9lcnJfb3V0OworCQkJfQorCQkJLyoKKwkJCSAqIEZJTEVfU2VjdXJlIGRvZXMgbm90IGhhdmUgYW4gdW5uYW1lZCAkREFUQQorCQkJICogYXR0cmlidXRlLCBzbyB3ZSBzcGVjaWFsIGNhc2UgaXQgaGVyZS4KKwkJCSAqLworCQkJaWYgKHZpLT5pX2lubyA9PSBGSUxFX1NlY3VyZSkKKwkJCQlnb3RvIG5vX2RhdGFfYXR0cl9zcGVjaWFsX2Nhc2U7CisJCQkvKgorCQkJICogTW9zdCBpZiBub3QgYWxsIHRoZSBzeXN0ZW0gZmlsZXMgaW4gdGhlICRFeHRlbmQKKwkJCSAqIHN5c3RlbSBkaXJlY3RvcnkgZG8gbm90IGhhdmUgdW5uYW1lZCBkYXRhCisJCQkgKiBhdHRyaWJ1dGVzIHNvIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIHBhcmVudAorCQkJICogZGlyZWN0b3J5IG9mIHRoZSBmaWxlIGlzIEZJTEVfRXh0ZW5kIGFuZCBpZiBpdCBpcworCQkJICogaWdub3JlIHRoaXMgZXJyb3IuIFRvIGRvIHRoaXMgd2UgbmVlZCB0byBnZXQgdGhlCisJCQkgKiBuYW1lIG9mIHRoaXMgaW5vZGUgZnJvbSB0aGUgbWZ0IHJlY29yZCBhcyB0aGUgbmFtZQorCQkJICogY29udGFpbnMgdGhlIGJhY2sgcmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQgZGlyZWN0b3J5LgorCQkJICovCisJCQlpZiAobnRmc19pc19leHRlbmRlZF9zeXN0ZW1fZmlsZShjdHgpID4gMCkKKwkJCQlnb3RvIG5vX2RhdGFfYXR0cl9zcGVjaWFsX2Nhc2U7CisJCQkvLyBGSVhNRTogRmlsZSBpcyBjb3JydXB0ISBIb3QtZml4IHdpdGggZW1wdHkgZGF0YQorCQkJLy8gYXR0cmlidXRlIGlmIHJlY292ZXJ5IG9wdGlvbiBpcyBzZXQuCisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiJERBVEEgYXR0cmlidXRlIGlzIG1pc3NpbmcuIik7CisJCQlnb3RvIHVubV9lcnJfb3V0OworCQl9CisJCS8qIFNldHVwIHRoZSBzdGF0ZS4gKi8KKwkJaWYgKGN0eC0+YXR0ci0+bm9uX3Jlc2lkZW50KSB7CisJCQlOSW5vU2V0Tm9uUmVzaWRlbnQobmkpOworCQkJaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0spIHsKKwkJCQlOSW5vU2V0Q29tcHJlc3NlZChuaSk7CisJCQkJaWYgKHZvbC0+Y2x1c3Rlcl9zaXplID4gNDA5NikgeworCQkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgIgorCQkJCQkJImNvbXByZXNzZWQgZGF0YSBidXQgIgorCQkJCQkJImNvbXByZXNzaW9uIGlzIGRpc2FibGVkIGR1ZSAiCisJCQkJCQkidG8gY2x1c3RlciBzaXplICglaSkgPiA0a2lCLiIsCisJCQkJCQl2b2wtPmNsdXN0ZXJfc2l6ZSk7CisJCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCQkJfQorCQkJCWlmICgoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSykKKwkJCQkJCSE9IEFUVFJfSVNfQ09NUFJFU1NFRCkgeworCQkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgIgorCQkJCQkJInVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIG9yICIKKwkJCQkJCSJjb3JydXB0IGZpbGUuIik7CisJCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCQkJfQorCQkJCW5pLT5pdHlwZS5jb21wcmVzc2VkLmJsb2NrX2NsdXN0ZXJzID0gMVUgPDwKKwkJCQkJCWN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuCisJCQkJCQljb21wcmVzc2lvbl91bml0OworCQkJCWlmIChjdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LgorCQkJCQkJY29tcHJlc3Npb25fdW5pdCAhPSA0KSB7CisJCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCAiCisJCQkJCQkibm9uc3RhbmRhcmQgY29tcHJlc3Npb24gdW5pdCAiCisJCQkJCQkiKCV1IGluc3RlYWQgb2YgNCkuICBDYW5ub3QgIgorCQkJCQkJImhhbmRsZSB0aGlzLiIsCisJCQkJCQljdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LgorCQkJCQkJY29tcHJlc3Npb25fdW5pdCk7CisJCQkJCWVyciA9IC1FT1BOT1RTVVBQOworCQkJCQlnb3RvIHVubV9lcnJfb3V0OworCQkJCX0KKwkJCQluaS0+aXR5cGUuY29tcHJlc3NlZC5ibG9ja19zaXplID0gMVUgPDwgKAorCQkJCQkJY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC4KKwkJCQkJCWNvbXByZXNzaW9uX3VuaXQgKworCQkJCQkJdm9sLT5jbHVzdGVyX3NpemVfYml0cyk7CisJCQkJbmktPml0eXBlLmNvbXByZXNzZWQuYmxvY2tfc2l6ZV9iaXRzID0gZmZzKAorCQkJCQluaS0+aXR5cGUuY29tcHJlc3NlZC5ibG9ja19zaXplKSAtIDE7CisJCQl9CisJCQlpZiAoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfSVNfRU5DUllQVEVEKSB7CisJCQkJaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0spIHsKKwkJCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZvdW5kIGVuY3J5cHRlZCAiCisJCQkJCQkJImFuZCBjb21wcmVzc2VkIGRhdGEuIik7CisJCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCQkJfQorCQkJCU5Jbm9TZXRFbmNyeXB0ZWQobmkpOworCQkJfQorCQkJaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0lTX1NQQVJTRSkKKwkJCQlOSW5vU2V0U3BhcnNlKG5pKTsKKwkJCWlmIChjdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50Lmxvd2VzdF92Y24pIHsKKwkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRmlyc3QgZXh0ZW50IG9mICREQVRBICIKKwkJCQkJCSJhdHRyaWJ1dGUgaGFzIG5vbiB6ZXJvICIKKwkJCQkJCSJsb3dlc3RfdmNuLiIpOworCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCQl9CisJCQkvKiBTZXR1cCBhbGwgdGhlIHNpemVzLiAqLworCQkJdmktPmlfc2l6ZSA9IHNsZTY0X3RvX2NwdSgKKwkJCQkJY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5kYXRhX3NpemUpOworCQkJbmktPmluaXRpYWxpemVkX3NpemUgPSBzbGU2NF90b19jcHUoCisJCQkJCWN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuCisJCQkJCWluaXRpYWxpemVkX3NpemUpOworCQkJbmktPmFsbG9jYXRlZF9zaXplID0gc2xlNjRfdG9fY3B1KAorCQkJCQljdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LgorCQkJCQlhbGxvY2F0ZWRfc2l6ZSk7CisJCQlpZiAoTklub0NvbXByZXNzZWQobmkpKSB7CisJCQkJbmktPml0eXBlLmNvbXByZXNzZWQuc2l6ZSA9IHNsZTY0X3RvX2NwdSgKKwkJCQkJCWN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuCisJCQkJCQljb21wcmVzc2VkX3NpemUpOworCQkJfQorCQl9IGVsc2UgeyAvKiBSZXNpZGVudCBhdHRyaWJ1dGUuICovCisJCQkvKgorCQkJICogTWFrZSBhbGwgc2l6ZXMgZXF1YWwgZm9yIHNpbXBsaWNpdHkgaW4gcmVhZCBjb2RlCisJCQkgKiBwYXRocy4gRklYTUU6IE5lZWQgdG8ga2VlcCB0aGlzIGluIG1pbmQgd2hlbgorCQkJICogY29udmVydGluZyB0byBub24tcmVzaWRlbnQgYXR0cmlidXRlIGluIHdyaXRlIGNvZGUKKwkJCSAqIHBhdGguIChQcm9iYWJseSBvbmx5IGFmZmVjdHMgdHJ1bmNhdGUoKS4pCisJCQkgKi8KKwkJCXZpLT5pX3NpemUgPSBuaS0+aW5pdGlhbGl6ZWRfc2l6ZSA9IG5pLT5hbGxvY2F0ZWRfc2l6ZSA9CisJCQkJCWxlMzJfdG9fY3B1KAorCQkJCQljdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKTsKKwkJfQorbm9fZGF0YV9hdHRyX3NwZWNpYWxfY2FzZToKKwkJLyogV2UgYXJlIGRvbmUgd2l0aCB0aGUgbWZ0IHJlY29yZCwgc28gd2UgcmVsZWFzZSBpdC4gKi8KKwkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJCXVubWFwX21mdF9yZWNvcmQobmkpOworCQltID0gTlVMTDsKKwkJY3R4ID0gTlVMTDsKKwkJLyogU2V0dXAgdGhlIG9wZXJhdGlvbnMgZm9yIHRoaXMgaW5vZGUuICovCisJCXZpLT5pX29wID0gJm50ZnNfZmlsZV9pbm9kZV9vcHM7CisJCXZpLT5pX2ZvcCA9ICZudGZzX2ZpbGVfb3BzOworCX0KKwlpZiAoTklub01zdFByb3RlY3RlZChuaSkpCisJCXZpLT5pX21hcHBpbmctPmFfb3BzID0gJm50ZnNfbXN0X2FvcHM7CisJZWxzZQorCQl2aS0+aV9tYXBwaW5nLT5hX29wcyA9ICZudGZzX2FvcHM7CisJLyoKKwkgKiBUaGUgbnVtYmVyIG9mIDUxMi1ieXRlIGJsb2NrcyB1c2VkIG9uIGRpc2sgKGZvciBzdGF0KS4gVGhpcyBpcyBpbiBzbworCSAqIGZhciBpbmFjY3VyYXRlIGFzIGl0IGRvZXNuJ3QgYWNjb3VudCBmb3IgYW55IG5hbWVkIHN0cmVhbXMgb3Igb3RoZXIKKwkgKiBzcGVjaWFsIG5vbi1yZXNpZGVudCBhdHRyaWJ1dGVzLCBidXQgdGhhdCBpcyBob3cgV2luZG93cyB3b3JrcywgdG9vLAorCSAqIHNvIHdlIGFyZSBhdCBsZWFzdCBjb25zaXN0ZW50IHdpdGggV2luZG93cywgaWYgbm90IGVudGlyZWx5CisJICogY29uc2lzdGVudCB3aXRoIHRoZSBMaW51eCBXYXkuIERvaW5nIGl0IHRoZSBMaW51eCBXYXkgd291bGQgY2F1c2UgYQorCSAqIHNpZ25pZmljYW50IHNsb3dkb3duIGFzIGl0IHdvdWxkIGludm9sdmUgaXRlcmF0aW5nIG92ZXIgYWxsCisJICogYXR0cmlidXRlcyBpbiB0aGUgbWZ0IHJlY29yZCBhbmQgYWRkaW5nIHRoZSBhbGxvY2F0ZWQvY29tcHJlc3NlZAorCSAqIHNpemVzIG9mIGFsbCBub24tcmVzaWRlbnQgYXR0cmlidXRlcyBwcmVzZW50IHRvIGdpdmUgdXMgdGhlIExpbnV4CisJICogY29ycmVjdCBzaXplIHRoYXQgc2hvdWxkIGdvIGludG8gaV9ibG9ja3MgKGFmdGVyIGRpdmlzaW9uIGJ5IDUxMikuCisJICovCisJaWYgKFNfSVNESVIodmktPmlfbW9kZSkgfHwgIU5Jbm9Db21wcmVzc2VkKG5pKSkKKwkJdmktPmlfYmxvY2tzID0gbmktPmFsbG9jYXRlZF9zaXplID4+IDk7CisJZWxzZQorCQl2aS0+aV9ibG9ja3MgPSBuaS0+aXR5cGUuY29tcHJlc3NlZC5zaXplID4+IDk7CisKKwludGZzX2RlYnVnKCJEb25lLiIpOworCXJldHVybiAwOworCit1bm1fZXJyX291dDoKKwlpZiAoIWVycikKKwkJZXJyID0gLUVJTzsKKwlpZiAoY3R4KQorCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwlpZiAobSkKKwkJdW5tYXBfbWZ0X3JlY29yZChuaSk7CitlcnJfb3V0OgorCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJWkuICBNYXJraW5nIGNvcnJ1cHQgIgorCQkJImlub2RlIDB4JWx4IGFzIGJhZC4gIFJ1biBjaGtkc2suIiwgZXJyLCB2aS0+aV9pbm8pOworCW1ha2VfYmFkX2lub2RlKHZpKTsKKwlpZiAoZXJyICE9IC1FT1BOT1RTVVBQICYmIGVyciAhPSAtRU5PTUVNKQorCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBudGZzX3JlYWRfbG9ja2VkX2F0dHJfaW5vZGUgLSByZWFkIGFuIGF0dHJpYnV0ZSBpbm9kZSBmcm9tIGl0cyBiYXNlIGlub2RlCisgKiBAYmFzZV92aToJYmFzZSBpbm9kZQorICogQHZpOgkJYXR0cmlidXRlIGlub2RlIHRvIHJlYWQKKyAqCisgKiBudGZzX3JlYWRfbG9ja2VkX2F0dHJfaW5vZGUoKSBpcyBjYWxsZWQgZnJvbSBudGZzX2F0dHJfaWdldCgpIHRvIHJlYWQgdGhlCisgKiBhdHRyaWJ1dGUgaW5vZGUgZGVzY3JpYmVkIGJ5IEB2aSBpbnRvIG1lbW9yeSBmcm9tIHRoZSBiYXNlIG1mdCByZWNvcmQKKyAqIGRlc2NyaWJlZCBieSBAYmFzZV9uaS4KKyAqCisgKiBudGZzX3JlYWRfbG9ja2VkX2F0dHJfaW5vZGUoKSBtYXBzLCBwaW5zIGFuZCBsb2NrcyB0aGUgYmFzZSBpbm9kZSBmb3IKKyAqIHJlYWRpbmcgYW5kIGxvb2tzIHVwIHRoZSBhdHRyaWJ1dGUgZGVzY3JpYmVkIGJ5IEB2aSBiZWZvcmUgc2V0dGluZyB1cCB0aGUKKyAqIG5lY2Vzc2FyeSBmaWVsZHMgaW4gQHZpIGFzIHdlbGwgYXMgaW5pdGlhbGl6aW5nIHRoZSBudGZzIGlub2RlLgorICoKKyAqIFE6IFdoYXQgbG9ja3MgYXJlIGhlbGQgd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkPworICogQTogaV9zdGF0ZSBoYXMgSV9MT0NLIHNldCwgaGVuY2UgdGhlIGlub2RlIGlzIGxvY2tlZCwgYWxzbworICogICAgaV9jb3VudCBpcyBzZXQgdG8gMSwgc28gaXQgaXMgbm90IGdvaW5nIHRvIGdvIGF3YXkKKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuICBJbiB0aGUgZXJyb3IgY2FzZSwgdGhlIGlub2RlIHdpbGwKKyAqIGhhdmUgaGFkIG1ha2VfYmFkX2lub2RlKCkgZXhlY3V0ZWQgb24gaXQuCisgKi8KK3N0YXRpYyBpbnQgbnRmc19yZWFkX2xvY2tlZF9hdHRyX2lub2RlKHN0cnVjdCBpbm9kZSAqYmFzZV92aSwgc3RydWN0IGlub2RlICp2aSkKK3sKKwludGZzX3ZvbHVtZSAqdm9sID0gTlRGU19TQih2aS0+aV9zYik7CisJbnRmc19pbm9kZSAqbmksICpiYXNlX25pOworCU1GVF9SRUNPUkQgKm07CisJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eDsKKwlpbnQgZXJyID0gMDsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBpX2lubyAweCVseC4iLCB2aS0+aV9pbm8pOworCisJbnRmc19pbml0X2JpZ19pbm9kZSh2aSk7CisKKwluaQk9IE5URlNfSSh2aSk7CisJYmFzZV9uaSA9IE5URlNfSShiYXNlX3ZpKTsKKworCS8qIEp1c3QgbWlycm9yIHRoZSB2YWx1ZXMgZnJvbSB0aGUgYmFzZSBpbm9kZS4gKi8KKwl2aS0+aV9ibGtzaXplCT0gYmFzZV92aS0+aV9ibGtzaXplOworCXZpLT5pX3ZlcnNpb24JPSBiYXNlX3ZpLT5pX3ZlcnNpb247CisJdmktPmlfdWlkCT0gYmFzZV92aS0+aV91aWQ7CisJdmktPmlfZ2lkCT0gYmFzZV92aS0+aV9naWQ7CisJdmktPmlfbmxpbmsJPSBiYXNlX3ZpLT5pX25saW5rOworCXZpLT5pX210aW1lCT0gYmFzZV92aS0+aV9tdGltZTsKKwl2aS0+aV9jdGltZQk9IGJhc2VfdmktPmlfY3RpbWU7CisJdmktPmlfYXRpbWUJPSBiYXNlX3ZpLT5pX2F0aW1lOworCXZpLT5pX2dlbmVyYXRpb24gPSBuaS0+c2VxX25vID0gYmFzZV9uaS0+c2VxX25vOworCisJLyogU2V0IGlub2RlIHR5cGUgdG8gemVybyBidXQgcHJlc2VydmUgcGVybWlzc2lvbnMuICovCisJdmktPmlfbW9kZQk9IGJhc2VfdmktPmlfbW9kZSAmIH5TX0lGTVQ7CisKKwltID0gbWFwX21mdF9yZWNvcmQoYmFzZV9uaSk7CisJaWYgKElTX0VSUihtKSkgeworCQllcnIgPSBQVFJfRVJSKG0pOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWN0eCA9IG50ZnNfYXR0cl9nZXRfc2VhcmNoX2N0eChiYXNlX25pLCBtKTsKKwlpZiAoIWN0eCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKworCS8qIEZpbmQgdGhlIGF0dHJpYnV0ZS4gKi8KKwllcnIgPSBudGZzX2F0dHJfbG9va3VwKG5pLT50eXBlLCBuaS0+bmFtZSwgbmktPm5hbWVfbGVuLAorCQkJQ0FTRV9TRU5TSVRJVkUsIDAsIE5VTEwsIDAsIGN0eCk7CisJaWYgKHVubGlrZWx5KGVycikpCisJCWdvdG8gdW5tX2Vycl9vdXQ7CisKKwlpZiAoIWN0eC0+YXR0ci0+bm9uX3Jlc2lkZW50KSB7CisJCS8qIEVuc3VyZSB0aGUgYXR0cmlidXRlIG5hbWUgaXMgcGxhY2VkIGJlZm9yZSB0aGUgdmFsdWUuICovCisJCWlmICh1bmxpa2VseShjdHgtPmF0dHItPm5hbWVfbGVuZ3RoICYmCisJCQkJKGxlMTZfdG9fY3B1KGN0eC0+YXR0ci0+bmFtZV9vZmZzZXQpID49CisJCQkJbGUxNl90b19jcHUoY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LgorCQkJCXZhbHVlX29mZnNldCkpKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiQXR0cmlidXRlIG5hbWUgaXMgcGxhY2VkIGFmdGVyICIKKwkJCQkJInRoZSBhdHRyaWJ1dGUgdmFsdWUuIik7CisJCQlnb3RvIHVubV9lcnJfb3V0OworCQl9CisJCWlmIChOSW5vTXN0UHJvdGVjdGVkKG5pKSB8fCBjdHgtPmF0dHItPmZsYWdzKSB7CisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgbXN0IHByb3RlY3RlZCBhdHRyaWJ1dGUgIgorCQkJCQkib3IgYXR0cmlidXRlIHdpdGggbm9uLXplcm8gZmxhZ3MgYnV0ICIKKwkJCQkJInRoZSBhdHRyaWJ1dGUgaXMgcmVzaWRlbnQuICBQbGVhc2UgIgorCQkJCQkicmVwb3J0IHlvdSBzYXcgdGhpcyBtZXNzYWdlIHRvICIKKwkJCQkJImxpbnV4LW50ZnMtZGV2QGxpc3RzLnNvdXJjZWZvcmdlLm5ldCIpOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQkvKgorCQkgKiBSZXNpZGVudCBhdHRyaWJ1dGUuIE1ha2UgYWxsIHNpemVzIGVxdWFsIGZvciBzaW1wbGljaXR5IGluCisJCSAqIHJlYWQgY29kZSBwYXRocy4KKwkJICovCisJCXZpLT5pX3NpemUgPSBuaS0+aW5pdGlhbGl6ZWRfc2l6ZSA9IG5pLT5hbGxvY2F0ZWRfc2l6ZSA9CisJCQlsZTMyX3RvX2NwdShjdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKTsKKwl9IGVsc2UgeworCQlOSW5vU2V0Tm9uUmVzaWRlbnQobmkpOworCQkvKgorCQkgKiBFbnN1cmUgdGhlIGF0dHJpYnV0ZSBuYW1lIGlzIHBsYWNlZCBiZWZvcmUgdGhlIG1hcHBpbmcgcGFpcnMKKwkJICogYXJyYXkuCisJCSAqLworCQlpZiAodW5saWtlbHkoY3R4LT5hdHRyLT5uYW1lX2xlbmd0aCAmJgorCQkJCShsZTE2X3RvX2NwdShjdHgtPmF0dHItPm5hbWVfb2Zmc2V0KSA+PQorCQkJCWxlMTZfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuCisJCQkJbWFwcGluZ19wYWlyc19vZmZzZXQpKSkpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkF0dHJpYnV0ZSBuYW1lIGlzIHBsYWNlZCBhZnRlciAiCisJCQkJCSJ0aGUgbWFwcGluZyBwYWlycyBhcnJheS4iKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0spIHsKKwkJCWlmIChOSW5vTXN0UHJvdGVjdGVkKG5pKSkgeworCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCBtc3QgcHJvdGVjdGVkICIKKwkJCQkJCSJhdHRyaWJ1dGUgYnV0IHRoZSBhdHRyaWJ1dGUgIgorCQkJCQkJImlzIGNvbXByZXNzZWQuICBQbGVhc2UgcmVwb3J0ICIKKwkJCQkJCSJ5b3Ugc2F3IHRoaXMgbWVzc2FnZSB0byAiCisJCQkJCQkibGludXgtbnRmcy1kZXZAbGlzdHMuIgorCQkJCQkJInNvdXJjZWZvcmdlLm5ldCIpOworCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCQl9CisJCQlOSW5vU2V0Q29tcHJlc3NlZChuaSk7CisJCQlpZiAoKG5pLT50eXBlICE9IEFUX0RBVEEpIHx8IChuaS0+dHlwZSA9PSBBVF9EQVRBICYmCisJCQkJCW5pLT5uYW1lX2xlbikpIHsKKwkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgY29tcHJlc3NlZCAiCisJCQkJCQkibm9uLWRhdGEgb3IgbmFtZWQgZGF0YSAiCisJCQkJCQkiYXR0cmlidXRlLiAgUGxlYXNlIHJlcG9ydCAiCisJCQkJCQkieW91IHNhdyB0aGlzIG1lc3NhZ2UgdG8gIgorCQkJCQkJImxpbnV4LW50ZnMtZGV2QGxpc3RzLiIKKwkJCQkJCSJzb3VyY2Vmb3JnZS5uZXQiKTsKKwkJCQlnb3RvIHVubV9lcnJfb3V0OworCQkJfQorCQkJaWYgKHZvbC0+Y2x1c3Rlcl9zaXplID4gNDA5NikgeworCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCBjb21wcmVzc2VkICIKKwkJCQkJCSJhdHRyaWJ1dGUgYnV0IGNvbXByZXNzaW9uIGlzICIKKwkJCQkJCSJkaXNhYmxlZCBkdWUgdG8gY2x1c3RlciBzaXplICIKKwkJCQkJCSIoJWkpID4gNGtpQi4iLAorCQkJCQkJdm9sLT5jbHVzdGVyX3NpemUpOworCQkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCQl9CisJCQlpZiAoKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0spCisJCQkJCSE9IEFUVFJfSVNfQ09NUFJFU1NFRCkgeworCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCB1bmtub3duICIKKwkJCQkJCSJjb21wcmVzc2lvbiBtZXRob2QuIik7CisJCQkJZ290byB1bm1fZXJyX291dDsKKwkJCX0KKwkJCW5pLT5pdHlwZS5jb21wcmVzc2VkLmJsb2NrX2NsdXN0ZXJzID0gMVUgPDwKKwkJCQkJY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC4KKwkJCQkJY29tcHJlc3Npb25fdW5pdDsKKwkJCWlmIChjdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LmNvbXByZXNzaW9uX3VuaXQgIT0KKwkJCQkJNCkgeworCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCBub25zdGFuZGFyZCAiCisJCQkJCQkiY29tcHJlc3Npb24gdW5pdCAoJXUgaW5zdGVhZCAiCisJCQkJCQkib2YgNCkuICBDYW5ub3QgaGFuZGxlIHRoaXMuIiwKKwkJCQkJCWN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuCisJCQkJCQljb21wcmVzc2lvbl91bml0KTsKKwkJCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJCQlnb3RvIHVubV9lcnJfb3V0OworCQkJfQorCQkJbmktPml0eXBlLmNvbXByZXNzZWQuYmxvY2tfc2l6ZSA9IDFVIDw8ICgKKwkJCQkJY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC4KKwkJCQkJY29tcHJlc3Npb25fdW5pdCArCisJCQkJCXZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMpOworCQkJbmktPml0eXBlLmNvbXByZXNzZWQuYmxvY2tfc2l6ZV9iaXRzID0gZmZzKAorCQkJCW5pLT5pdHlwZS5jb21wcmVzc2VkLmJsb2NrX3NpemUpIC0gMTsKKwkJfQorCQlpZiAoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfSVNfRU5DUllQVEVEKSB7CisJCQlpZiAoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfQ09NUFJFU1NJT05fTUFTSykgeworCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCBlbmNyeXB0ZWQgIgorCQkJCQkJImFuZCBjb21wcmVzc2VkIGRhdGEuIik7CisJCQkJZ290byB1bm1fZXJyX291dDsKKwkJCX0KKwkJCWlmIChOSW5vTXN0UHJvdGVjdGVkKG5pKSkgeworCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCBtc3QgcHJvdGVjdGVkICIKKwkJCQkJCSJhdHRyaWJ1dGUgYnV0IHRoZSBhdHRyaWJ1dGUgIgorCQkJCQkJImlzIGVuY3J5cHRlZC4gIFBsZWFzZSByZXBvcnQgIgorCQkJCQkJInlvdSBzYXcgdGhpcyBtZXNzYWdlIHRvICIKKwkJCQkJCSJsaW51eC1udGZzLWRldkBsaXN0cy4iCisJCQkJCQkic291cmNlZm9yZ2UubmV0Iik7CisJCQkJZ290byB1bm1fZXJyX291dDsKKwkJCX0KKwkJCU5Jbm9TZXRFbmNyeXB0ZWQobmkpOworCQl9CisJCWlmIChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9JU19TUEFSU0UpIHsKKwkJCWlmIChOSW5vTXN0UHJvdGVjdGVkKG5pKSkgeworCQkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCBtc3QgcHJvdGVjdGVkICIKKwkJCQkJCSJhdHRyaWJ1dGUgYnV0IHRoZSBhdHRyaWJ1dGUgIgorCQkJCQkJImlzIHNwYXJzZS4gIFBsZWFzZSByZXBvcnQgIgorCQkJCQkJInlvdSBzYXcgdGhpcyBtZXNzYWdlIHRvICIKKwkJCQkJCSJsaW51eC1udGZzLWRldkBsaXN0cy4iCisJCQkJCQkic291cmNlZm9yZ2UubmV0Iik7CisJCQkJZ290byB1bm1fZXJyX291dDsKKwkJCX0KKwkJCU5Jbm9TZXRTcGFyc2UobmkpOworCQl9CisJCWlmIChjdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50Lmxvd2VzdF92Y24pIHsKKwkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGaXJzdCBleHRlbnQgb2YgYXR0cmlidXRlIGhhcyAiCisJCQkJCSJub24temVybyBsb3dlc3RfdmNuLiIpOworCQkJZ290byB1bm1fZXJyX291dDsKKwkJfQorCQkvKiBTZXR1cCBhbGwgdGhlIHNpemVzLiAqLworCQl2aS0+aV9zaXplID0gc2xlNjRfdG9fY3B1KAorCQkJCWN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuZGF0YV9zaXplKTsKKwkJbmktPmluaXRpYWxpemVkX3NpemUgPSBzbGU2NF90b19jcHUoCisJCQkJY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5pbml0aWFsaXplZF9zaXplKTsKKwkJbmktPmFsbG9jYXRlZF9zaXplID0gc2xlNjRfdG9fY3B1KAorCQkJCWN0eC0+YXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuYWxsb2NhdGVkX3NpemUpOworCQlpZiAoTklub0NvbXByZXNzZWQobmkpKSB7CisJCQluaS0+aXR5cGUuY29tcHJlc3NlZC5zaXplID0gc2xlNjRfdG9fY3B1KAorCQkJCQljdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LgorCQkJCQljb21wcmVzc2VkX3NpemUpOworCQl9CisJfQorCisJLyogU2V0dXAgdGhlIG9wZXJhdGlvbnMgZm9yIHRoaXMgYXR0cmlidXRlIGlub2RlLiAqLworCXZpLT5pX29wID0gTlVMTDsKKwl2aS0+aV9mb3AgPSBOVUxMOworCWlmIChOSW5vTXN0UHJvdGVjdGVkKG5pKSkKKwkJdmktPmlfbWFwcGluZy0+YV9vcHMgPSAmbnRmc19tc3RfYW9wczsKKwllbHNlCisJCXZpLT5pX21hcHBpbmctPmFfb3BzID0gJm50ZnNfYW9wczsKKworCWlmICghTklub0NvbXByZXNzZWQobmkpKQorCQl2aS0+aV9ibG9ja3MgPSBuaS0+YWxsb2NhdGVkX3NpemUgPj4gOTsKKwllbHNlCisJCXZpLT5pX2Jsb2NrcyA9IG5pLT5pdHlwZS5jb21wcmVzc2VkLnNpemUgPj4gOTsKKworCS8qCisJICogTWFrZSBzdXJlIHRoZSBiYXNlIGlub2RlIGRvZXNuJ3QgZ28gYXdheSBhbmQgYXR0YWNoIGl0IHRvIHRoZQorCSAqIGF0dHJpYnV0ZSBpbm9kZS4KKwkgKi8KKwlpZ3JhYihiYXNlX3ZpKTsKKwluaS0+ZXh0LmJhc2VfbnRmc19pbm8gPSBiYXNlX25pOworCW5pLT5ucl9leHRlbnRzID0gLTE7CisKKwludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwl1bm1hcF9tZnRfcmVjb3JkKGJhc2VfbmkpOworCisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gMDsKKwordW5tX2Vycl9vdXQ6CisJaWYgKCFlcnIpCisJCWVyciA9IC1FSU87CisJaWYgKGN0eCkKKwkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJdW5tYXBfbWZ0X3JlY29yZChiYXNlX25pKTsKK2Vycl9vdXQ6CisJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHdpdGggZXJyb3IgY29kZSAlaSB3aGlsZSByZWFkaW5nIGF0dHJpYnV0ZSAiCisJCQkiaW5vZGUgKG1mdF9ubyAweCVseCwgdHlwZSAweCV4LCBuYW1lX2xlbiAlaSkuICAiCisJCQkiTWFya2luZyBjb3JydXB0IGlub2RlIGFuZCBiYXNlIGlub2RlIDB4JWx4IGFzIGJhZC4gICIKKwkJCSJSdW4gY2hrZHNrLiIsIGVyciwgdmktPmlfaW5vLCBuaS0+dHlwZSwgbmktPm5hbWVfbGVuLAorCQkJYmFzZV92aS0+aV9pbm8pOworCW1ha2VfYmFkX2lub2RlKHZpKTsKKwltYWtlX2JhZF9pbm9kZShiYXNlX3ZpKTsKKwlpZiAoZXJyICE9IC1FTk9NRU0pCisJCU5Wb2xTZXRFcnJvcnModm9sKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIG50ZnNfcmVhZF9sb2NrZWRfaW5kZXhfaW5vZGUgLSByZWFkIGFuIGluZGV4IGlub2RlIGZyb20gaXRzIGJhc2UgaW5vZGUKKyAqIEBiYXNlX3ZpOgliYXNlIGlub2RlCisgKiBAdmk6CQlpbmRleCBpbm9kZSB0byByZWFkCisgKgorICogbnRmc19yZWFkX2xvY2tlZF9pbmRleF9pbm9kZSgpIGlzIGNhbGxlZCBmcm9tIG50ZnNfaW5kZXhfaWdldCgpIHRvIHJlYWQgdGhlCisgKiBpbmRleCBpbm9kZSBkZXNjcmliZWQgYnkgQHZpIGludG8gbWVtb3J5IGZyb20gdGhlIGJhc2UgbWZ0IHJlY29yZCBkZXNjcmliZWQKKyAqIGJ5IEBiYXNlX25pLgorICoKKyAqIG50ZnNfcmVhZF9sb2NrZWRfaW5kZXhfaW5vZGUoKSBtYXBzLCBwaW5zIGFuZCBsb2NrcyB0aGUgYmFzZSBpbm9kZSBmb3IKKyAqIHJlYWRpbmcgYW5kIGxvb2tzIHVwIHRoZSBhdHRyaWJ1dGVzIHJlbGF0aW5nIHRvIHRoZSBpbmRleCBkZXNjcmliZWQgYnkgQHZpCisgKiBiZWZvcmUgc2V0dGluZyB1cCB0aGUgbmVjZXNzYXJ5IGZpZWxkcyBpbiBAdmkgYXMgd2VsbCBhcyBpbml0aWFsaXppbmcgdGhlCisgKiBudGZzIGlub2RlLgorICoKKyAqIE5vdGUsIGluZGV4IGlub2RlcyBhcmUgZXNzZW50aWFsbHkgYXR0cmlidXRlIGlub2RlcyAoTklub0F0dHIoKSBpcyB0cnVlKQorICogd2l0aCB0aGUgYXR0cmlidXRlIHR5cGUgc2V0IHRvIEFUX0lOREVYX0FMTE9DQVRJT04uICBBcGFydCBmcm9tIHRoYXQsIHRoZXkKKyAqIGFyZSBzZXR1cCBsaWtlIGRpcmVjdG9yeSBpbm9kZXMgc2luY2UgZGlyZWN0b3JpZXMgYXJlIGEgc3BlY2lhbCBjYXNlIG9mCisgKiBpbmRpY2VzIGFvIHRoZXkgbmVlZCB0byBiZSB0cmVhdGVkIGluIG11Y2ggdGhlIHNhbWUgd2F5LiAgTW9zdCBpbXBvcnRhbnRseSwKKyAqIGZvciBzbWFsbCBpbmRpY2VzIHRoZSBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZSBtaWdodCBub3QgYWN0dWFsbHkgZXhpc3QuCisgKiBIb3dldmVyLCB0aGUgaW5kZXggcm9vdCBhdHRyaWJ1dGUgYWx3YXlzIGV4aXN0cyBidXQgdGhpcyBkb2VzIG5vdCBuZWVkIHRvCisgKiBoYXZlIGFuIGlub2RlIGFzc29jaWF0ZWQgd2l0aCBpdCBhbmQgdGhpcyBpcyB3aHkgd2UgZGVmaW5lIGEgbmV3IGlub2RlIHR5cGUKKyAqIGluZGV4LiAgQWxzbywgbGlrZSBmb3IgZGlyZWN0b3JpZXMsIHdlIG5lZWQgdG8gaGF2ZSBhbiBhdHRyaWJ1dGUgaW5vZGUgZm9yCisgKiB0aGUgYml0bWFwIGF0dHJpYnV0ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZSBhbmQgd2UKKyAqIGNhbiBzdG9yZSB0aGlzIGluIHRoZSBhcHByb3ByaWF0ZSBmaWVsZCBvZiB0aGUgaW5vZGUsIGp1c3QgbGlrZSB3ZSBkbyBmb3IKKyAqIG5vcm1hbCBkaXJlY3RvcnkgaW5vZGVzLgorICoKKyAqIFE6IFdoYXQgbG9ja3MgYXJlIGhlbGQgd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkPworICogQTogaV9zdGF0ZSBoYXMgSV9MT0NLIHNldCwgaGVuY2UgdGhlIGlub2RlIGlzIGxvY2tlZCwgYWxzbworICogICAgaV9jb3VudCBpcyBzZXQgdG8gMSwgc28gaXQgaXMgbm90IGdvaW5nIHRvIGdvIGF3YXkKKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuICBJbiB0aGUgZXJyb3IgY2FzZSwgdGhlIGlub2RlIHdpbGwKKyAqIGhhdmUgaGFkIG1ha2VfYmFkX2lub2RlKCkgZXhlY3V0ZWQgb24gaXQuCisgKi8KK3N0YXRpYyBpbnQgbnRmc19yZWFkX2xvY2tlZF9pbmRleF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmJhc2VfdmksIHN0cnVjdCBpbm9kZSAqdmkpCit7CisJbnRmc192b2x1bWUgKnZvbCA9IE5URlNfU0IodmktPmlfc2IpOworCW50ZnNfaW5vZGUgKm5pLCAqYmFzZV9uaSwgKmJuaTsKKwlzdHJ1Y3QgaW5vZGUgKmJ2aTsKKwlNRlRfUkVDT1JEICptOworCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHg7CisJSU5ERVhfUk9PVCAqaXI7CisJdTggKmlyX2VuZCwgKmluZGV4X2VuZDsKKwlpbnQgZXJyID0gMDsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBpX2lubyAweCVseC4iLCB2aS0+aV9pbm8pOworCW50ZnNfaW5pdF9iaWdfaW5vZGUodmkpOworCW5pCT0gTlRGU19JKHZpKTsKKwliYXNlX25pID0gTlRGU19JKGJhc2VfdmkpOworCS8qIEp1c3QgbWlycm9yIHRoZSB2YWx1ZXMgZnJvbSB0aGUgYmFzZSBpbm9kZS4gKi8KKwl2aS0+aV9ibGtzaXplCT0gYmFzZV92aS0+aV9ibGtzaXplOworCXZpLT5pX3ZlcnNpb24JPSBiYXNlX3ZpLT5pX3ZlcnNpb247CisJdmktPmlfdWlkCT0gYmFzZV92aS0+aV91aWQ7CisJdmktPmlfZ2lkCT0gYmFzZV92aS0+aV9naWQ7CisJdmktPmlfbmxpbmsJPSBiYXNlX3ZpLT5pX25saW5rOworCXZpLT5pX210aW1lCT0gYmFzZV92aS0+aV9tdGltZTsKKwl2aS0+aV9jdGltZQk9IGJhc2VfdmktPmlfY3RpbWU7CisJdmktPmlfYXRpbWUJPSBiYXNlX3ZpLT5pX2F0aW1lOworCXZpLT5pX2dlbmVyYXRpb24gPSBuaS0+c2VxX25vID0gYmFzZV9uaS0+c2VxX25vOworCS8qIFNldCBpbm9kZSB0eXBlIHRvIHplcm8gYnV0IHByZXNlcnZlIHBlcm1pc3Npb25zLiAqLworCXZpLT5pX21vZGUJPSBiYXNlX3ZpLT5pX21vZGUgJiB+U19JRk1UOworCS8qIE1hcCB0aGUgbWZ0IHJlY29yZCBmb3IgdGhlIGJhc2UgaW5vZGUuICovCisJbSA9IG1hcF9tZnRfcmVjb3JkKGJhc2VfbmkpOworCWlmIChJU19FUlIobSkpIHsKKwkJZXJyID0gUFRSX0VSUihtKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwljdHggPSBudGZzX2F0dHJfZ2V0X3NlYXJjaF9jdHgoYmFzZV9uaSwgbSk7CisJaWYgKCFjdHgpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJLyogRmluZCB0aGUgaW5kZXggcm9vdCBhdHRyaWJ1dGUuICovCisJZXJyID0gbnRmc19hdHRyX2xvb2t1cChBVF9JTkRFWF9ST09ULCBuaS0+bmFtZSwgbmktPm5hbWVfbGVuLAorCQkJQ0FTRV9TRU5TSVRJVkUsIDAsIE5VTEwsIDAsIGN0eCk7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJaWYgKGVyciA9PSAtRU5PRU5UKQorCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRJTkRFWF9ST09UIGF0dHJpYnV0ZSBpcyAiCisJCQkJCSJtaXNzaW5nLiIpOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwkvKiBTZXQgdXAgdGhlIHN0YXRlLiAqLworCWlmICh1bmxpa2VseShjdHgtPmF0dHItPm5vbl9yZXNpZGVudCkpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiJElOREVYX1JPT1QgYXR0cmlidXRlIGlzIG5vdCByZXNpZGVudC4iKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJLyogRW5zdXJlIHRoZSBhdHRyaWJ1dGUgbmFtZSBpcyBwbGFjZWQgYmVmb3JlIHRoZSB2YWx1ZS4gKi8KKwlpZiAodW5saWtlbHkoY3R4LT5hdHRyLT5uYW1lX2xlbmd0aCAmJgorCQkJKGxlMTZfdG9fY3B1KGN0eC0+YXR0ci0+bmFtZV9vZmZzZXQpID49CisJCQlsZTE2X3RvX2NwdShjdHgtPmF0dHItPmRhdGEucmVzaWRlbnQuCisJCQl2YWx1ZV9vZmZzZXQpKSkpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiJElOREVYX1JPT1QgYXR0cmlidXRlIG5hbWUgaXMgcGxhY2VkICIKKwkJCQkiYWZ0ZXIgdGhlIGF0dHJpYnV0ZSB2YWx1ZS4iKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJLyogQ29tcHJlc3NlZC9lbmNyeXB0ZWQvc3BhcnNlIGluZGV4IHJvb3QgaXMgbm90IGFsbG93ZWQuICovCisJaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiAoQVRUUl9DT01QUkVTU0lPTl9NQVNLIHwgQVRUUl9JU19FTkNSWVBURUQgfAorCQkJQVRUUl9JU19TUEFSU0UpKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGb3VuZCBjb21wcmVzc2VkL2VuY3J5cHRlZC9zcGFyc2UgaW5kZXggIgorCQkJCSJyb290IGF0dHJpYnV0ZS4iKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJaXIgPSAoSU5ERVhfUk9PVCopKCh1OCopY3R4LT5hdHRyICsKKwkJCWxlMTZfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpKTsKKwlpcl9lbmQgPSAodTgqKWlyICsgbGUzMl90b19jcHUoY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCk7CisJaWYgKGlyX2VuZCA+ICh1OCopY3R4LT5tcmVjICsgdm9sLT5tZnRfcmVjb3JkX3NpemUpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRJTkRFWF9ST09UIGF0dHJpYnV0ZSBpcyBjb3JydXB0LiIpOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwlpbmRleF9lbmQgPSAodTgqKSZpci0+aW5kZXggKyBsZTMyX3RvX2NwdShpci0+aW5kZXguaW5kZXhfbGVuZ3RoKTsKKwlpZiAoaW5kZXhfZW5kID4gaXJfZW5kKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICJJbmRleCBpcyBjb3JydXB0LiIpOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwlpZiAoaXItPnR5cGUpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkluZGV4IHR5cGUgaXMgbm90IDAgKHR5cGUgaXMgMHgleCkuIiwKKwkJCQlsZTMyX3RvX2NwdShpci0+dHlwZSkpOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwluaS0+aXR5cGUuaW5kZXguY29sbGF0aW9uX3J1bGUgPSBpci0+Y29sbGF0aW9uX3J1bGU7CisJbnRmc19kZWJ1ZygiSW5kZXggY29sbGF0aW9uIHJ1bGUgaXMgMHgleC4iLAorCQkJbGUzMl90b19jcHUoaXItPmNvbGxhdGlvbl9ydWxlKSk7CisJbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUgPSBsZTMyX3RvX2NwdShpci0+aW5kZXhfYmxvY2tfc2l6ZSk7CisJaWYgKG5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplICYgKG5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplIC0gMSkpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkluZGV4IGJsb2NrIHNpemUgKCV1KSBpcyBub3QgYSBwb3dlciBvZiAiCisJCQkJInR3by4iLCBuaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSk7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCWlmIChuaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSA+IFBBR0VfQ0FDSEVfU0laRSkgeworCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiSW5kZXggYmxvY2sgc2l6ZSAoJXUpID4gUEFHRV9DQUNIRV9TSVpFICIKKwkJCQkiKCVsZCkgaXMgbm90IHN1cHBvcnRlZC4gIFNvcnJ5LiIsCisJCQkJbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUsIFBBR0VfQ0FDSEVfU0laRSk7CisJCWVyciA9IC1FT1BOT1RTVVBQOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwlpZiAobmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUgPCBOVEZTX0JMT0NLX1NJWkUpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkluZGV4IGJsb2NrIHNpemUgKCV1KSA8IE5URlNfQkxPQ0tfU0laRSAiCisJCQkJIiglaSkgaXMgbm90IHN1cHBvcnRlZC4gIFNvcnJ5LiIsCisJCQkJbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUsIE5URlNfQkxPQ0tfU0laRSk7CisJCWVyciA9IC1FT1BOT1RTVVBQOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwluaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZV9iaXRzID0gZmZzKG5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplKSAtIDE7CisJLyogRGV0ZXJtaW5lIHRoZSBzaXplIG9mIGEgdmNuIGluIHRoZSBpbmRleC4gKi8KKwlpZiAodm9sLT5jbHVzdGVyX3NpemUgPD0gbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemUpIHsKKwkJbmktPml0eXBlLmluZGV4LnZjbl9zaXplID0gdm9sLT5jbHVzdGVyX3NpemU7CisJCW5pLT5pdHlwZS5pbmRleC52Y25fc2l6ZV9iaXRzID0gdm9sLT5jbHVzdGVyX3NpemVfYml0czsKKwl9IGVsc2UgeworCQluaS0+aXR5cGUuaW5kZXgudmNuX3NpemUgPSB2b2wtPnNlY3Rvcl9zaXplOworCQluaS0+aXR5cGUuaW5kZXgudmNuX3NpemVfYml0cyA9IHZvbC0+c2VjdG9yX3NpemVfYml0czsKKwl9CisJLyogQ2hlY2sgZm9yIHByZXNlbmNlIG9mIGluZGV4IGFsbG9jYXRpb24gYXR0cmlidXRlLiAqLworCWlmICghKGlyLT5pbmRleC5mbGFncyAmIExBUkdFX0lOREVYKSkgeworCQkvKiBObyBpbmRleCBhbGxvY2F0aW9uLiAqLworCQl2aS0+aV9zaXplID0gbmktPmluaXRpYWxpemVkX3NpemUgPSBuaS0+YWxsb2NhdGVkX3NpemUgPSAwOworCQkvKiBXZSBhcmUgZG9uZSB3aXRoIHRoZSBtZnQgcmVjb3JkLCBzbyB3ZSByZWxlYXNlIGl0LiAqLworCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwkJdW5tYXBfbWZ0X3JlY29yZChiYXNlX25pKTsKKwkJbSA9IE5VTEw7CisJCWN0eCA9IE5VTEw7CisJCWdvdG8gc2tpcF9sYXJnZV9pbmRleF9zdHVmZjsKKwl9IC8qIExBUkdFX0lOREVYOiAgSW5kZXggYWxsb2NhdGlvbiBwcmVzZW50LiAgU2V0dXAgc3RhdGUuICovCisJTklub1NldEluZGV4QWxsb2NQcmVzZW50KG5pKTsKKwkvKiBGaW5kIGluZGV4IGFsbG9jYXRpb24gYXR0cmlidXRlLiAqLworCW50ZnNfYXR0cl9yZWluaXRfc2VhcmNoX2N0eChjdHgpOworCWVyciA9IG50ZnNfYXR0cl9sb29rdXAoQVRfSU5ERVhfQUxMT0NBVElPTiwgbmktPm5hbWUsIG5pLT5uYW1lX2xlbiwKKwkJCUNBU0VfU0VOU0lUSVZFLCAwLCBOVUxMLCAwLCBjdHgpOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCWlmIChlcnIgPT0gLUVOT0VOVCkKKwkJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkSU5ERVhfQUxMT0NBVElPTiBhdHRyaWJ1dGUgaXMgIgorCQkJCQkibm90IHByZXNlbnQgYnV0ICRJTkRFWF9ST09UICIKKwkJCQkJImluZGljYXRlZCBpdCBpcy4iKTsKKwkJZWxzZQorCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZhaWxlZCB0byBsb29rdXAgIgorCQkJCQkiJElOREVYX0FMTE9DQVRJT04gYXR0cmlidXRlLiIpOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwlpZiAoIWN0eC0+YXR0ci0+bm9uX3Jlc2lkZW50KSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkSU5ERVhfQUxMT0NBVElPTiBhdHRyaWJ1dGUgaXMgIgorCQkJCSJyZXNpZGVudC4iKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJLyoKKwkgKiBFbnN1cmUgdGhlIGF0dHJpYnV0ZSBuYW1lIGlzIHBsYWNlZCBiZWZvcmUgdGhlIG1hcHBpbmcgcGFpcnMgYXJyYXkuCisJICovCisJaWYgKHVubGlrZWx5KGN0eC0+YXR0ci0+bmFtZV9sZW5ndGggJiYgKGxlMTZfdG9fY3B1KAorCQkJY3R4LT5hdHRyLT5uYW1lX29mZnNldCkgPj0gbGUxNl90b19jcHUoCisJCQljdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50Lm1hcHBpbmdfcGFpcnNfb2Zmc2V0KSkpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIiRJTkRFWF9BTExPQ0FUSU9OIGF0dHJpYnV0ZSBuYW1lIGlzICIKKwkJCQkicGxhY2VkIGFmdGVyIHRoZSBtYXBwaW5nIHBhaXJzIGFycmF5LiIpOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwlpZiAoY3R4LT5hdHRyLT5mbGFncyAmIEFUVFJfSVNfRU5DUllQVEVEKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkSU5ERVhfQUxMT0NBVElPTiBhdHRyaWJ1dGUgaXMgIgorCQkJCSJlbmNyeXB0ZWQuIik7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCWlmIChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9JU19TUEFSU0UpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRJTkRFWF9BTExPQ0FUSU9OIGF0dHJpYnV0ZSBpcyBzcGFyc2UuIik7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCWlmIChjdHgtPmF0dHItPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkSU5ERVhfQUxMT0NBVElPTiBhdHRyaWJ1dGUgaXMgIgorCQkJCSJjb21wcmVzc2VkLiIpOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwlpZiAoY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5sb3dlc3RfdmNuKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGaXJzdCBleHRlbnQgb2YgJElOREVYX0FMTE9DQVRJT04gIgorCQkJCSJhdHRyaWJ1dGUgaGFzIG5vbiB6ZXJvIGxvd2VzdF92Y24uIik7CisJCWdvdG8gdW5tX2Vycl9vdXQ7CisJfQorCXZpLT5pX3NpemUgPSBzbGU2NF90b19jcHUoY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5kYXRhX3NpemUpOworCW5pLT5pbml0aWFsaXplZF9zaXplID0gc2xlNjRfdG9fY3B1KAorCQkJY3R4LT5hdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5pbml0aWFsaXplZF9zaXplKTsKKwluaS0+YWxsb2NhdGVkX3NpemUgPSBzbGU2NF90b19jcHUoCisJCQljdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50LmFsbG9jYXRlZF9zaXplKTsKKwkvKgorCSAqIFdlIGFyZSBkb25lIHdpdGggdGhlIG1mdCByZWNvcmQsIHNvIHdlIHJlbGVhc2UgaXQuICBPdGhlcndpc2UKKwkgKiB3ZSB3b3VsZCBkZWFkbG9jayBpbiBudGZzX2F0dHJfaWdldCgpLgorCSAqLworCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCXVubWFwX21mdF9yZWNvcmQoYmFzZV9uaSk7CisJbSA9IE5VTEw7CisJY3R4ID0gTlVMTDsKKwkvKiBHZXQgdGhlIGluZGV4IGJpdG1hcCBhdHRyaWJ1dGUgaW5vZGUuICovCisJYnZpID0gbnRmc19hdHRyX2lnZXQoYmFzZV92aSwgQVRfQklUTUFQLCBuaS0+bmFtZSwgbmktPm5hbWVfbGVuKTsKKwlpZiAoSVNfRVJSKGJ2aSkpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZhaWxlZCB0byBnZXQgYml0bWFwIGF0dHJpYnV0ZS4iKTsKKwkJZXJyID0gUFRSX0VSUihidmkpOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwlibmkgPSBOVEZTX0koYnZpKTsKKwlpZiAoTklub0NvbXByZXNzZWQoYm5pKSB8fCBOSW5vRW5jcnlwdGVkKGJuaSkgfHwKKwkJCU5Jbm9TcGFyc2UoYm5pKSkgeworCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiJEJJVE1BUCBhdHRyaWJ1dGUgaXMgY29tcHJlc3NlZCBhbmQvb3IgIgorCQkJCSJlbmNyeXB0ZWQgYW5kL29yIHNwYXJzZS4iKTsKKwkJZ290byBpcHV0X3VubV9lcnJfb3V0OworCX0KKwkvKiBDb25zaXN0ZW5jeSBjaGVjayBiaXRtYXAgc2l6ZSB2cy4gaW5kZXggYWxsb2NhdGlvbiBzaXplLiAqLworCWlmICgoYnZpLT5pX3NpemUgPDwgMykgPCAodmktPmlfc2l6ZSA+PgorCQkJbmktPml0eXBlLmluZGV4LmJsb2NrX3NpemVfYml0cykpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkluZGV4IGJpdG1hcCB0b28gc21hbGwgKDB4JWxseCkgZm9yICIKKwkJCQkiaW5kZXggYWxsb2NhdGlvbiAoMHglbGx4KS4iLCBidmktPmlfc2l6ZSA8PCAzLAorCQkJCXZpLT5pX3NpemUpOworCQlnb3RvIGlwdXRfdW5tX2Vycl9vdXQ7CisJfQorCW5pLT5pdHlwZS5pbmRleC5ibXBfaW5vID0gYnZpOworc2tpcF9sYXJnZV9pbmRleF9zdHVmZjoKKwkvKiBTZXR1cCB0aGUgb3BlcmF0aW9ucyBmb3IgdGhpcyBpbmRleCBpbm9kZS4gKi8KKwl2aS0+aV9vcCA9IE5VTEw7CisJdmktPmlfZm9wID0gTlVMTDsKKwl2aS0+aV9tYXBwaW5nLT5hX29wcyA9ICZudGZzX21zdF9hb3BzOworCXZpLT5pX2Jsb2NrcyA9IG5pLT5hbGxvY2F0ZWRfc2l6ZSA+PiA5OworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhlIGJhc2UgaW5vZGUgZG9lc24ndCBnbyBhd2F5IGFuZCBhdHRhY2ggaXQgdG8gdGhlCisJICogaW5kZXggaW5vZGUuCisJICovCisJaWdyYWIoYmFzZV92aSk7CisJbmktPmV4dC5iYXNlX250ZnNfaW5vID0gYmFzZV9uaTsKKwluaS0+bnJfZXh0ZW50cyA9IC0xOworCisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gMDsKKworaXB1dF91bm1fZXJyX291dDoKKwlpcHV0KGJ2aSk7Cit1bm1fZXJyX291dDoKKwlpZiAoIWVycikKKwkJZXJyID0gLUVJTzsKKwlpZiAoY3R4KQorCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwlpZiAobSkKKwkJdW5tYXBfbWZ0X3JlY29yZChiYXNlX25pKTsKK2Vycl9vdXQ6CisJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJWkgd2hpbGUgcmVhZGluZyBpbmRleCAiCisJCQkiaW5vZGUgKG1mdF9ubyAweCVseCwgbmFtZV9sZW4gJWkuIiwgZXJyLCB2aS0+aV9pbm8sCisJCQluaS0+bmFtZV9sZW4pOworCW1ha2VfYmFkX2lub2RlKHZpKTsKKwlpZiAoZXJyICE9IC1FT1BOT1RTVVBQICYmIGVyciAhPSAtRU5PTUVNKQorCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBudGZzX3JlYWRfaW5vZGVfbW91bnQgLSBzcGVjaWFsIHJlYWRfaW5vZGUgZm9yIG1vdW50IHRpbWUgdXNlIG9ubHkKKyAqIEB2aToJCWlub2RlIHRvIHJlYWQKKyAqCisgKiBSZWFkIGlub2RlIEZJTEVfTUZUIGF0IG1vdW50IHRpbWUsIG9ubHkgY2FsbGVkIHdpdGggc3VwZXJfYmxvY2sgbG9jaworICogaGVsZCBmcm9tIHdpdGhpbiB0aGUgcmVhZF9zdXBlcigpIGNvZGUgcGF0aC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGV4aXN0cyBiZWNhdXNlIHdoZW4gaXQgaXMgY2FsbGVkIHRoZSBwYWdlIGNhY2hlIGZvciAkTUZULyREQVRBCisgKiBpcyBub3QgaW5pdGlhbGl6ZWQgYW5kIGhlbmNlIHdlIGNhbm5vdCBnZXQgYXQgdGhlIGNvbnRlbnRzIG9mIG1mdCByZWNvcmRzCisgKiBieSBjYWxsaW5nIG1hcF9tZnRfcmVjb3JkKigpLgorICoKKyAqIEZ1cnRoZXIgaXQgbmVlZHMgdG8gY29wZSB3aXRoIHRoZSBjaXJjdWxhciByZWZlcmVuY2VzIHByb2JsZW0sIGkuZS4gY2Fubm90CisgKiBsb2FkIGFueSBhdHRyaWJ1dGVzIG90aGVyIHRoYW4gJEFUVFJJQlVURV9MSVNUIHVudGlsICREQVRBIGlzIGxvYWRlZCwgYmVjYXVzZQorICogd2UgZG8gbm90IGtub3cgd2hlcmUgdGhlIG90aGVyIGV4dGVudCBtZnQgcmVjb3JkcyBhcmUgeWV0IGFuZCBhZ2FpbiwgYmVjYXVzZQorICogd2UgY2Fubm90IGNhbGwgbWFwX21mdF9yZWNvcmQqKCkgeWV0LiAgT2J2aW91c2x5IHRoaXMgYXBwbGllcyBvbmx5IHdoZW4gYW4KKyAqIGF0dHJpYnV0ZSBsaXN0IGlzIGFjdHVhbGx5IHByZXNlbnQgaW4gJE1GVCBpbm9kZS4KKyAqCisgKiBXZSBzb2x2ZSB0aGVzZSBwcm9ibGVtcyBieSBzdGFydGluZyB3aXRoIHRoZSAkREFUQSBhdHRyaWJ1dGUgYmVmb3JlIGFueXRoaW5nCisgKiBlbHNlIGFuZCBpdGVyYXRpbmcgdXNpbmcgbnRmc19hdHRyX2xvb2t1cCgkREFUQSkgb3ZlciBhbGwgZXh0ZW50cy4gIEFzIGVhY2gKKyAqIGV4dGVudCBpcyBmb3VuZCwgd2UgbnRmc19tYXBwaW5nX3BhaXJzX2RlY29tcHJlc3MoKSBpbmNsdWRpbmcgdGhlIGltcGxpZWQKKyAqIG50ZnNfcnVubGlzdHNfbWVyZ2UoKS4gIEVhY2ggc3RlcCBvZiB0aGUgaXRlcmF0aW9uIG5lY2Vzc2FyaWx5IHByb3ZpZGVzCisgKiBzdWZmaWNpZW50IGluZm9ybWF0aW9uIGZvciB0aGUgbmV4dCBzdGVwIHRvIGNvbXBsZXRlLgorICoKKyAqIFRoaXMgc2hvdWxkIHdvcmsgYnV0IHRoZXJlIGFyZSB0d28gcG9zc2libGUgcGl0IGZhbGxzIChzZWUgaW5saW5lIGNvbW1lbnRzCisgKiBiZWxvdyksIGJ1dCBvbmx5IHRpbWUgd2lsbCB0ZWxsIGlmIHRoZXkgYXJlIHJlYWwgcGl0cyBvciBqdXN0IHNtb2tlLi4uCisgKi8KK2ludCBudGZzX3JlYWRfaW5vZGVfbW91bnQoc3RydWN0IGlub2RlICp2aSkKK3sKKwlWQ04gbmV4dF92Y24sIGxhc3RfdmNuLCBoaWdoZXN0X3ZjbjsKKwlzNjQgYmxvY2s7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IHZpLT5pX3NiOworCW50ZnNfdm9sdW1lICp2b2wgPSBOVEZTX1NCKHNiKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCW50ZnNfaW5vZGUgKm5pOworCU1GVF9SRUNPUkQgKm0gPSBOVUxMOworCUFUVFJfUkVDT1JEICphdHRyOworCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHg7CisJdW5zaWduZWQgaW50IGksIG5yX2Jsb2NrczsKKwlpbnQgZXJyOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CisKKwkvKiBJbml0aWFsaXplIHRoZSBudGZzIHNwZWNpZmljIHBhcnQgb2YgQHZpLiAqLworCW50ZnNfaW5pdF9iaWdfaW5vZGUodmkpOworCisJbmkgPSBOVEZTX0kodmkpOworCisJLyogU2V0dXAgdGhlIGRhdGEgYXR0cmlidXRlLiBJdCBpcyBzcGVjaWFsIGFzIGl0IGlzIG1zdCBwcm90ZWN0ZWQuICovCisJTklub1NldE5vblJlc2lkZW50KG5pKTsKKwlOSW5vU2V0TXN0UHJvdGVjdGVkKG5pKTsKKwluaS0+dHlwZSA9IEFUX0RBVEE7CisJbmktPm5hbWUgPSBOVUxMOworCW5pLT5uYW1lX2xlbiA9IDA7CisKKwkvKgorCSAqIFRoaXMgc2V0cyB1cCBvdXIgbGl0dGxlIGNoZWF0IGFsbG93aW5nIHVzIHRvIHJldXNlIHRoZSBhc3luYyByZWFkIGlvCisJICogY29tcGxldGlvbiBoYW5kbGVyIGZvciBkaXJlY3Rvcmllcy4KKwkgKi8KKwluaS0+aXR5cGUuaW5kZXguYmxvY2tfc2l6ZSA9IHZvbC0+bWZ0X3JlY29yZF9zaXplOworCW5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplX2JpdHMgPSB2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzOworCisJLyogVmVyeSBpbXBvcnRhbnQhIE5lZWRlZCB0byBiZSBhYmxlIHRvIGNhbGwgbWFwX21mdF9yZWNvcmQqKCkuICovCisJdm9sLT5tZnRfaW5vID0gdmk7CisKKwkvKiBBbGxvY2F0ZSBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgdGhlIGZpcnN0IG1mdCByZWNvcmQuICovCisJaWYgKHZvbC0+bWZ0X3JlY29yZF9zaXplID4gNjQgKiAxMDI0KSB7CisJCW50ZnNfZXJyb3Ioc2IsICJVbnN1cHBvcnRlZCBtZnQgcmVjb3JkIHNpemUgJWkgKG1heCA2NGtpQikuIiwKKwkJCQl2b2wtPm1mdF9yZWNvcmRfc2l6ZSk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJaSA9IHZvbC0+bWZ0X3JlY29yZF9zaXplOworCWlmIChpIDwgc2ItPnNfYmxvY2tzaXplKQorCQlpID0gc2ItPnNfYmxvY2tzaXplOworCW0gPSAoTUZUX1JFQ09SRCopbnRmc19tYWxsb2Nfbm9mcyhpKTsKKwlpZiAoIW0pIHsKKwkJbnRmc19lcnJvcihzYiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIgZm9yICRNRlQgcmVjb3JkIDAuIik7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwkvKiBEZXRlcm1pbmUgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSAkTUZULyREQVRBIGF0dHJpYnV0ZS4gKi8KKwlibG9jayA9IHZvbC0+bWZ0X2xjbiA8PCB2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzID4+CisJCQlzYi0+c19ibG9ja3NpemVfYml0czsKKwlucl9ibG9ja3MgPSB2b2wtPm1mdF9yZWNvcmRfc2l6ZSA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKKwlpZiAoIW5yX2Jsb2NrcykKKwkJbnJfYmxvY2tzID0gMTsKKworCS8qIExvYWQgJE1GVC8kREFUQSdzIGZpcnN0IG1mdCByZWNvcmQuICovCisJZm9yIChpID0gMDsgaSA8IG5yX2Jsb2NrczsgaSsrKSB7CisJCWJoID0gc2JfYnJlYWQoc2IsIGJsb2NrKyspOworCQlpZiAoIWJoKSB7CisJCQludGZzX2Vycm9yKHNiLCAiRGV2aWNlIHJlYWQgZmFpbGVkLiIpOworCQkJZ290byBlcnJfb3V0OworCQl9CisJCW1lbWNweSgoY2hhciopbSArIChpIDw8IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSwgYmgtPmJfZGF0YSwKKwkJCQlzYi0+c19ibG9ja3NpemUpOworCQlicmVsc2UoYmgpOworCX0KKworCS8qIEFwcGx5IHRoZSBtc3QgZml4dXBzLiAqLworCWlmIChwb3N0X3JlYWRfbXN0X2ZpeHVwKChOVEZTX1JFQ09SRCopbSwgdm9sLT5tZnRfcmVjb3JkX3NpemUpKSB7CisJCS8qIEZJWE1FOiBUcnkgdG8gdXNlIHRoZSAkTUZUTWlyciBub3cuICovCisJCW50ZnNfZXJyb3Ioc2IsICJNU1QgZml4dXAgZmFpbGVkLiAkTUZUIGlzIGNvcnJ1cHQuIik7CisJCWdvdG8gZXJyX291dDsKKwl9CisKKwkvKiBOZWVkIHRoaXMgdG8gc2FuaXR5IGNoZWNrIGF0dHJpYnV0ZSBsaXN0IHJlZmVyZW5jZXMgdG8gJE1GVC4gKi8KKwl2aS0+aV9nZW5lcmF0aW9uID0gbmktPnNlcV9ubyA9IGxlMTZfdG9fY3B1KG0tPnNlcXVlbmNlX251bWJlcik7CisKKwkvKiBQcm92aWRlcyByZWFkcGFnZSgpIGFuZCBzeW5jX3BhZ2UoKSBmb3IgbWFwX21mdF9yZWNvcmQoKS4gKi8KKwl2aS0+aV9tYXBwaW5nLT5hX29wcyA9ICZudGZzX21zdF9hb3BzOworCisJY3R4ID0gbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4KG5pLCBtKTsKKwlpZiAoIWN0eCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJLyogRmluZCB0aGUgYXR0cmlidXRlIGxpc3QgYXR0cmlidXRlIGlmIHByZXNlbnQuICovCisJZXJyID0gbnRmc19hdHRyX2xvb2t1cChBVF9BVFRSSUJVVEVfTElTVCwgTlVMTCwgMCwgMCwgMCwgTlVMTCwgMCwgY3R4KTsKKwlpZiAoZXJyKSB7CisJCWlmICh1bmxpa2VseShlcnIgIT0gLUVOT0VOVCkpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gbG9va3VwIGF0dHJpYnV0ZSBsaXN0ICIKKwkJCQkJImF0dHJpYnV0ZS4gWW91IHNob3VsZCBydW4gY2hrZHNrLiIpOworCQkJZ290byBwdXRfZXJyX291dDsKKwkJfQorCX0gZWxzZSAvKiBpZiAoIWVycikgKi8geworCQlBVFRSX0xJU1RfRU5UUlkgKmFsX2VudHJ5LCAqbmV4dF9hbF9lbnRyeTsKKwkJdTggKmFsX2VuZDsKKworCQludGZzX2RlYnVnKCJBdHRyaWJ1dGUgbGlzdCBhdHRyaWJ1dGUgZm91bmQgaW4gJE1GVC4iKTsKKwkJTklub1NldEF0dHJMaXN0KG5pKTsKKwkJaWYgKGN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0lTX0VOQ1JZUFRFRCB8fAorCQkJCWN0eC0+YXR0ci0+ZmxhZ3MgJiBBVFRSX0NPTVBSRVNTSU9OX01BU0sgfHwKKwkJCQljdHgtPmF0dHItPmZsYWdzICYgQVRUUl9JU19TUEFSU0UpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICJBdHRyaWJ1dGUgbGlzdCBhdHRyaWJ1dGUgaXMgIgorCQkJCQkiY29tcHJlc3NlZC9lbmNyeXB0ZWQvc3BhcnNlLiBOb3QgIgorCQkJCQkiYWxsb3dlZC4gJE1GVCBpcyBjb3JydXB0LiBZb3Ugc2hvdWxkICIKKwkJCQkJInJ1biBjaGtkc2suIik7CisJCQlnb3RvIHB1dF9lcnJfb3V0OworCQl9CisJCS8qIE5vdyBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdC4gKi8KKwkJbmktPmF0dHJfbGlzdF9zaXplID0gKHUzMiludGZzX2F0dHJfc2l6ZShjdHgtPmF0dHIpOworCQluaS0+YXR0cl9saXN0ID0gbnRmc19tYWxsb2Nfbm9mcyhuaS0+YXR0cl9saXN0X3NpemUpOworCQlpZiAoIW5pLT5hdHRyX2xpc3QpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSBidWZmZXIgIgorCQkJCQkiZm9yIGF0dHJpYnV0ZSBsaXN0LiIpOworCQkJZ290byBwdXRfZXJyX291dDsKKwkJfQorCQlpZiAoY3R4LT5hdHRyLT5ub25fcmVzaWRlbnQpIHsKKwkJCU5Jbm9TZXRBdHRyTGlzdE5vblJlc2lkZW50KG5pKTsKKwkJCWlmIChjdHgtPmF0dHItPmRhdGEubm9uX3Jlc2lkZW50Lmxvd2VzdF92Y24pIHsKKwkJCQludGZzX2Vycm9yKHNiLCAiQXR0cmlidXRlIGxpc3QgaGFzIG5vbiB6ZXJvICIKKwkJCQkJCSJsb3dlc3RfdmNuLiAkTUZUIGlzIGNvcnJ1cHQuICIKKwkJCQkJCSJZb3Ugc2hvdWxkIHJ1biBjaGtkc2suIik7CisJCQkJZ290byBwdXRfZXJyX291dDsKKwkJCX0KKwkJCS8qIFNldHVwIHRoZSBydW5saXN0LiAqLworCQkJbmktPmF0dHJfbGlzdF9ybC5ybCA9IG50ZnNfbWFwcGluZ19wYWlyc19kZWNvbXByZXNzKHZvbCwKKwkJCQkJY3R4LT5hdHRyLCBOVUxMKTsKKwkJCWlmIChJU19FUlIobmktPmF0dHJfbGlzdF9ybC5ybCkpIHsKKwkJCQllcnIgPSBQVFJfRVJSKG5pLT5hdHRyX2xpc3RfcmwucmwpOworCQkJCW5pLT5hdHRyX2xpc3RfcmwucmwgPSBOVUxMOworCQkJCW50ZnNfZXJyb3Ioc2IsICJNYXBwaW5nIHBhaXJzIGRlY29tcHJlc3Npb24gIgorCQkJCQkJImZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJWkuIiwKKwkJCQkJCS1lcnIpOworCQkJCWdvdG8gcHV0X2Vycl9vdXQ7CisJCQl9CisJCQkvKiBOb3cgbG9hZCB0aGUgYXR0cmlidXRlIGxpc3QuICovCisJCQlpZiAoKGVyciA9IGxvYWRfYXR0cmlidXRlX2xpc3Qodm9sLCAmbmktPmF0dHJfbGlzdF9ybCwKKwkJCQkJbmktPmF0dHJfbGlzdCwgbmktPmF0dHJfbGlzdF9zaXplLAorCQkJCQlzbGU2NF90b19jcHUoY3R4LT5hdHRyLT5kYXRhLgorCQkJCQlub25fcmVzaWRlbnQuaW5pdGlhbGl6ZWRfc2l6ZSkpKSkgeworCQkJCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gbG9hZCBhdHRyaWJ1dGUgbGlzdCAiCisJCQkJCQkiYXR0cmlidXRlIHdpdGggZXJyb3IgY29kZSAlaS4iLAorCQkJCQkJLWVycik7CisJCQkJZ290byBwdXRfZXJyX291dDsKKwkJCX0KKwkJfSBlbHNlIC8qIGlmICghY3R4LmF0dHItPm5vbl9yZXNpZGVudCkgKi8geworCQkJaWYgKCh1OCopY3R4LT5hdHRyICsgbGUxNl90b19jcHUoCisJCQkJCWN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpICsKKwkJCQkJbGUzMl90b19jcHUoCisJCQkJCWN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpID4KKwkJCQkJKHU4KiljdHgtPm1yZWMgKyB2b2wtPm1mdF9yZWNvcmRfc2l6ZSkgeworCQkJCW50ZnNfZXJyb3Ioc2IsICJDb3JydXB0IGF0dHJpYnV0ZSBsaXN0ICIKKwkJCQkJCSJhdHRyaWJ1dGUuIik7CisJCQkJZ290byBwdXRfZXJyX291dDsKKwkJCX0KKwkJCS8qIE5vdyBjb3B5IHRoZSBhdHRyaWJ1dGUgbGlzdC4gKi8KKwkJCW1lbWNweShuaS0+YXR0cl9saXN0LCAodTgqKWN0eC0+YXR0ciArIGxlMTZfdG9fY3B1KAorCQkJCQljdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSwKKwkJCQkJbGUzMl90b19jcHUoCisJCQkJCWN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpKTsKKwkJfQorCQkvKiBUaGUgYXR0cmlidXRlIGxpc3QgaXMgbm93IHNldHVwIGluIG1lbW9yeS4gKi8KKwkJLyoKKwkJICogRklYTUU6IEkgZG9uJ3Qga25vdyBpZiB0aGlzIGNhc2UgaXMgYWN0dWFsbHkgcG9zc2libGUuCisJCSAqIEFjY29yZGluZyB0byBsb2dpYyBpdCBpcyBub3QgcG9zc2libGUgYnV0IEkgaGF2ZSBzZWVuIHRvbworCQkgKiBtYW55IHdlaXJkIHRoaW5ncyBpbiBNUyBzb2Z0d2FyZSB0byByZWx5IG9uIGxvZ2ljLi4uIFRodXMgd2UKKwkJICogcGVyZm9ybSBhIG1hbnVhbCBzZWFyY2ggYW5kIG1ha2Ugc3VyZSB0aGUgZmlyc3QgJE1GVC8kREFUQQorCQkgKiBleHRlbnQgaXMgaW4gdGhlIGJhc2UgaW5vZGUuIElmIGl0IGlzIG5vdCB3ZSBhYm9ydCB3aXRoIGFuCisJCSAqIGVycm9yIGFuZCBpZiB3ZSBldmVyIHNlZSBhIHJlcG9ydCBvZiB0aGlzIGVycm9yIHdlIHdpbGwgbmVlZAorCQkgKiB0byBkbyBzb21lIG1hZ2ljIGluIG9yZGVyIHRvIGhhdmUgdGhlIG5lY2Vzc2FyeSBtZnQgcmVjb3JkCisJCSAqIGxvYWRlZCBhbmQgaW4gdGhlIHJpZ2h0IHBsYWNlIGluIHRoZSBwYWdlIGNhY2hlLiBCdXQKKwkJICogaG9wZWZ1bGx5IGxvZ2ljIHdpbGwgcHJldmFpbCBhbmQgdGhpcyBuZXZlciBoYXBwZW5zLi4uCisJCSAqLworCQlhbF9lbnRyeSA9IChBVFRSX0xJU1RfRU5UUlkqKW5pLT5hdHRyX2xpc3Q7CisJCWFsX2VuZCA9ICh1OCopYWxfZW50cnkgKyBuaS0+YXR0cl9saXN0X3NpemU7CisJCWZvciAoOzsgYWxfZW50cnkgPSBuZXh0X2FsX2VudHJ5KSB7CisJCQkvKiBPdXQgb2YgYm91bmRzIGNoZWNrLiAqLworCQkJaWYgKCh1OCopYWxfZW50cnkgPCBuaS0+YXR0cl9saXN0IHx8CisJCQkJCSh1OCopYWxfZW50cnkgPiBhbF9lbmQpCisJCQkJZ290byBlbV9wdXRfZXJyX291dDsKKwkJCS8qIENhdGNoIHRoZSBlbmQgb2YgdGhlIGF0dHJpYnV0ZSBsaXN0LiAqLworCQkJaWYgKCh1OCopYWxfZW50cnkgPT0gYWxfZW5kKQorCQkJCWdvdG8gZW1fcHV0X2Vycl9vdXQ7CisJCQlpZiAoIWFsX2VudHJ5LT5sZW5ndGgpCisJCQkJZ290byBlbV9wdXRfZXJyX291dDsKKwkJCWlmICgodTgqKWFsX2VudHJ5ICsgNiA+IGFsX2VuZCB8fCAodTgqKWFsX2VudHJ5ICsKKwkJCQkJbGUxNl90b19jcHUoYWxfZW50cnktPmxlbmd0aCkgPiBhbF9lbmQpCisJCQkJZ290byBlbV9wdXRfZXJyX291dDsKKwkJCW5leHRfYWxfZW50cnkgPSAoQVRUUl9MSVNUX0VOVFJZKikoKHU4KilhbF9lbnRyeSArCisJCQkJCWxlMTZfdG9fY3B1KGFsX2VudHJ5LT5sZW5ndGgpKTsKKwkJCWlmIChsZTMyX3RvX2NwdShhbF9lbnRyeS0+dHlwZSkgPgorCQkJCQljb25zdF9sZTMyX3RvX2NwdShBVF9EQVRBKSkKKwkJCQlnb3RvIGVtX3B1dF9lcnJfb3V0OworCQkJaWYgKEFUX0RBVEEgIT0gYWxfZW50cnktPnR5cGUpCisJCQkJY29udGludWU7CisJCQkvKiBXZSB3YW50IGFuIHVubmFtZWQgYXR0cmlidXRlLiAqLworCQkJaWYgKGFsX2VudHJ5LT5uYW1lX2xlbmd0aCkKKwkJCQlnb3RvIGVtX3B1dF9lcnJfb3V0OworCQkJLyogV2FudCB0aGUgZmlyc3QgZW50cnksIGkuZS4gbG93ZXN0X3ZjbiA9PSAwLiAqLworCQkJaWYgKGFsX2VudHJ5LT5sb3dlc3RfdmNuKQorCQkJCWdvdG8gZW1fcHV0X2Vycl9vdXQ7CisJCQkvKiBGaXJzdCBlbnRyeSBoYXMgdG8gYmUgaW4gdGhlIGJhc2UgbWZ0IHJlY29yZC4gKi8KKwkJCWlmIChNUkVGX0xFKGFsX2VudHJ5LT5tZnRfcmVmZXJlbmNlKSAhPSB2aS0+aV9pbm8pIHsKKwkJCQkvKiBNRlQgcmVmZXJlbmNlcyBkbyBub3QgbWF0Y2gsIGxvZ2ljIGZhaWxzLiAqLworCQkJCW50ZnNfZXJyb3Ioc2IsICJCVUc6IFRoZSBmaXJzdCAkREFUQSBleHRlbnQgIgorCQkJCQkJIm9mICRNRlQgaXMgbm90IGluIHRoZSBiYXNlICIKKwkJCQkJCSJtZnQgcmVjb3JkLiBQbGVhc2UgcmVwb3J0ICIKKwkJCQkJCSJ5b3Ugc2F3IHRoaXMgbWVzc2FnZSB0byAiCisJCQkJCQkibGludXgtbnRmcy1kZXZAbGlzdHMuIgorCQkJCQkJInNvdXJjZWZvcmdlLm5ldCIpOworCQkJCWdvdG8gcHV0X2Vycl9vdXQ7CisJCQl9IGVsc2UgeworCQkJCS8qIFNlcXVlbmNlIG51bWJlcnMgbXVzdCBtYXRjaC4gKi8KKwkJCQlpZiAoTVNFUU5PX0xFKGFsX2VudHJ5LT5tZnRfcmVmZXJlbmNlKSAhPQorCQkJCQkJbmktPnNlcV9ubykKKwkJCQkJZ290byBlbV9wdXRfZXJyX291dDsKKwkJCQkvKiBHb3QgaXQuIEFsbCBpcyBvay4gV2UgY2FuIHN0b3Agbm93LiAqLworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJbnRmc19hdHRyX3JlaW5pdF9zZWFyY2hfY3R4KGN0eCk7CisKKwkvKiBOb3cgbG9hZCBhbGwgYXR0cmlidXRlIGV4dGVudHMuICovCisJYXR0ciA9IE5VTEw7CisJbmV4dF92Y24gPSBsYXN0X3ZjbiA9IGhpZ2hlc3RfdmNuID0gMDsKKwl3aGlsZSAoIShlcnIgPSBudGZzX2F0dHJfbG9va3VwKEFUX0RBVEEsIE5VTEwsIDAsIDAsIG5leHRfdmNuLCBOVUxMLCAwLAorCQkJY3R4KSkpIHsKKwkJcnVubGlzdF9lbGVtZW50ICpucmw7CisKKwkJLyogQ2FjaGUgdGhlIGN1cnJlbnQgYXR0cmlidXRlLiAqLworCQlhdHRyID0gY3R4LT5hdHRyOworCQkvKiAkTUZUIG11c3QgYmUgbm9uLXJlc2lkZW50LiAqLworCQlpZiAoIWF0dHItPm5vbl9yZXNpZGVudCkgeworCQkJbnRmc19lcnJvcihzYiwgIiRNRlQgbXVzdCBiZSBub24tcmVzaWRlbnQgYnV0IGEgIgorCQkJCQkicmVzaWRlbnQgZXh0ZW50IHdhcyBmb3VuZC4gJE1GVCBpcyAiCisJCQkJCSJjb3JydXB0LiBSdW4gY2hrZHNrLiIpOworCQkJZ290byBwdXRfZXJyX291dDsKKwkJfQorCQkvKiAkTUZUIG11c3QgYmUgdW5jb21wcmVzc2VkIGFuZCB1bmVuY3J5cHRlZC4gKi8KKwkJaWYgKGF0dHItPmZsYWdzICYgQVRUUl9DT01QUkVTU0lPTl9NQVNLIHx8CisJCQkJYXR0ci0+ZmxhZ3MgJiBBVFRSX0lTX0VOQ1JZUFRFRCB8fAorCQkJCWF0dHItPmZsYWdzICYgQVRUUl9JU19TUEFSU0UpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICIkTUZUIG11c3QgYmUgdW5jb21wcmVzc2VkLCAiCisJCQkJCSJub24tc3BhcnNlLCBhbmQgdW5lbmNyeXB0ZWQgYnV0IGEgIgorCQkJCQkiY29tcHJlc3NlZC9zcGFyc2UvZW5jcnlwdGVkIGV4dGVudCAiCisJCQkJCSJ3YXMgZm91bmQuICRNRlQgaXMgY29ycnVwdC4gUnVuICIKKwkJCQkJImNoa2Rzay4iKTsKKwkJCWdvdG8gcHV0X2Vycl9vdXQ7CisJCX0KKwkJLyoKKwkJICogRGVjb21wcmVzcyB0aGUgbWFwcGluZyBwYWlycyBhcnJheSBvZiB0aGlzIGV4dGVudCBhbmQgbWVyZ2UKKwkJICogdGhlIHJlc3VsdCBpbnRvIHRoZSBleGlzdGluZyBydW5saXN0LiBObyBuZWVkIGZvciBsb2NraW5nCisJCSAqIGFzIHdlIGhhdmUgZXhjbHVzaXZlIGFjY2VzcyB0byB0aGUgaW5vZGUgYXQgdGhpcyB0aW1lIGFuZCB3ZQorCQkgKiBhcmUgYSBtb3VudCBpbiBwcm9ncmVzcyB0YXNrLCB0b28uCisJCSAqLworCQlucmwgPSBudGZzX21hcHBpbmdfcGFpcnNfZGVjb21wcmVzcyh2b2wsIGF0dHIsIG5pLT5ydW5saXN0LnJsKTsKKwkJaWYgKElTX0VSUihucmwpKSB7CisJCQludGZzX2Vycm9yKHNiLCAibnRmc19tYXBwaW5nX3BhaXJzX2RlY29tcHJlc3MoKSAiCisJCQkJCSJmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVsZC4gICRNRlQgaXMgIgorCQkJCQkiY29ycnVwdC4iLCBQVFJfRVJSKG5ybCkpOworCQkJZ290byBwdXRfZXJyX291dDsKKwkJfQorCQluaS0+cnVubGlzdC5ybCA9IG5ybDsKKworCQkvKiBBcmUgd2UgaW4gdGhlIGZpcnN0IGV4dGVudD8gKi8KKwkJaWYgKCFuZXh0X3ZjbikgeworCQkJaWYgKGF0dHItPmRhdGEubm9uX3Jlc2lkZW50Lmxvd2VzdF92Y24pIHsKKwkJCQludGZzX2Vycm9yKHNiLCAiRmlyc3QgZXh0ZW50IG9mICREQVRBICIKKwkJCQkJCSJhdHRyaWJ1dGUgaGFzIG5vbiB6ZXJvICIKKwkJCQkJCSJsb3dlc3RfdmNuLiAkTUZUIGlzIGNvcnJ1cHQuICIKKwkJCQkJCSJZb3Ugc2hvdWxkIHJ1biBjaGtkc2suIik7CisJCQkJZ290byBwdXRfZXJyX291dDsKKwkJCX0KKwkJCS8qIEdldCB0aGUgbGFzdCB2Y24gaW4gdGhlICREQVRBIGF0dHJpYnV0ZS4gKi8KKwkJCWxhc3RfdmNuID0gc2xlNjRfdG9fY3B1KAorCQkJCQlhdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5hbGxvY2F0ZWRfc2l6ZSkKKwkJCQkJPj4gdm9sLT5jbHVzdGVyX3NpemVfYml0czsKKwkJCS8qIEZpbGwgaW4gdGhlIGlub2RlIHNpemUuICovCisJCQl2aS0+aV9zaXplID0gc2xlNjRfdG9fY3B1KAorCQkJCQlhdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5kYXRhX3NpemUpOworCQkJbmktPmluaXRpYWxpemVkX3NpemUgPSBzbGU2NF90b19jcHUoYXR0ci0+ZGF0YS4KKwkJCQkJbm9uX3Jlc2lkZW50LmluaXRpYWxpemVkX3NpemUpOworCQkJbmktPmFsbG9jYXRlZF9zaXplID0gc2xlNjRfdG9fY3B1KAorCQkJCQlhdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5hbGxvY2F0ZWRfc2l6ZSk7CisJCQkvKgorCQkJICogVmVyaWZ5IHRoZSBudW1iZXIgb2YgbWZ0IHJlY29yZHMgZG9lcyBub3QgZXhjZWVkCisJCQkgKiAyXjMyIC0gMS4KKwkJCSAqLworCQkJaWYgKCh2aS0+aV9zaXplID4+IHZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHMpID49CisJCQkJCSgxVUxMIDw8IDMyKSkgeworCQkJCW50ZnNfZXJyb3Ioc2IsICIkTUZUIGlzIHRvbyBiaWchIEFib3J0aW5nLiIpOworCQkJCWdvdG8gcHV0X2Vycl9vdXQ7CisJCQl9CisJCQkvKgorCQkJICogV2UgaGF2ZSBnb3QgdGhlIGZpcnN0IGV4dGVudCBvZiB0aGUgcnVubGlzdCBmb3IKKwkJCSAqICRNRlQgd2hpY2ggbWVhbnMgaXQgaXMgbm93IHJlbGF0aXZlbHkgc2FmZSB0byBjYWxsCisJCQkgKiB0aGUgbm9ybWFsIG50ZnNfcmVhZF9pbm9kZSgpIGZ1bmN0aW9uLgorCQkJICogQ29tcGxldGUgcmVhZGluZyB0aGUgaW5vZGUsIHRoaXMgd2lsbCBhY3R1YWxseQorCQkJICogcmUtcmVhZCB0aGUgbWZ0IHJlY29yZCBmb3IgJE1GVCwgdGhpcyB0aW1lIGVudGVyaW5nCisJCQkgKiBpdCBpbnRvIHRoZSBwYWdlIGNhY2hlIHdpdGggd2hpY2ggd2UgY29tcGxldGUgdGhlCisJCQkgKiBraWNrIHN0YXJ0IG9mIHRoZSB2b2x1bWUuIEl0IHNob3VsZCBiZSBzYWZlIHRvIGRvCisJCQkgKiB0aGlzIG5vdyBhcyB0aGUgZmlyc3QgZXh0ZW50IG9mICRNRlQvJERBVEEgaXMKKwkJCSAqIGFscmVhZHkga25vd24gYW5kIHdlIHdvdWxkIGhvcGUgdGhhdCB3ZSBkb24ndCBuZWVkCisJCQkgKiBmdXJ0aGVyIGV4dGVudHMgaW4gb3JkZXIgdG8gZmluZCB0aGUgb3RoZXIKKwkJCSAqIGF0dHJpYnV0ZXMgYmVsb25naW5nIHRvICRNRlQuIE9ubHkgdGltZSB3aWxsIHRlbGwgaWYKKwkJCSAqIHRoaXMgaXMgcmVhbGx5IHRoZSBjYXNlLiBJZiBub3Qgd2Ugd2lsbCBoYXZlIHRvIHBsYXkKKwkJCSAqIG1hZ2ljIGF0IHRoaXMgcG9pbnQsIHBvc3NpYmx5IGR1cGxpY2F0aW5nIGEgbG90IG9mCisJCQkgKiBudGZzX3JlYWRfaW5vZGUoKSBhdCB0aGlzIHBvaW50LiBXZSB3aWxsIG5lZWQgdG8KKwkJCSAqIGVuc3VyZSB3ZSBkbyBlbm91Z2ggb2YgaXRzIHdvcmsgdG8gYmUgYWJsZSB0byBjYWxsCisJCQkgKiBudGZzX3JlYWRfaW5vZGUoKSBvbiBleHRlbnRzIG9mICRNRlQvJERBVEEuIEJ1dCBsZXRzCisJCQkgKiBob3BlIHRoaXMgbmV2ZXIgaGFwcGVucy4uLgorCQkJICovCisJCQludGZzX3JlYWRfbG9ja2VkX2lub2RlKHZpKTsKKwkJCWlmIChpc19iYWRfaW5vZGUodmkpKSB7CisJCQkJbnRmc19lcnJvcihzYiwgIm50ZnNfcmVhZF9pbm9kZSgpIG9mICRNRlQgIgorCQkJCQkJImZhaWxlZC4gQlVHIG9yIGNvcnJ1cHQgJE1GVC4gIgorCQkJCQkJIlJ1biBjaGtkc2sgYW5kIGlmIG5vIGVycm9ycyAiCisJCQkJCQkiYXJlIGZvdW5kLCBwbGVhc2UgcmVwb3J0IHlvdSAiCisJCQkJCQkic2F3IHRoaXMgbWVzc2FnZSB0byAiCisJCQkJCQkibGludXgtbnRmcy1kZXZAbGlzdHMuIgorCQkJCQkJInNvdXJjZWZvcmdlLm5ldCIpOworCQkJCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCQkJCS8qIFJldmVydCB0byB0aGUgc2FmZSBzdXBlciBvcGVyYXRpb25zLiAqLworCQkJCW50ZnNfZnJlZShtKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQkvKgorCQkJICogUmUtaW5pdGlhbGl6ZSBzb21lIHNwZWNpZmljcyBhYm91dCAkTUZUJ3MgaW5vZGUgYXMKKwkJCSAqIG50ZnNfcmVhZF9pbm9kZSgpIHdpbGwgaGF2ZSBzZXQgdXAgdGhlIGRlZmF1bHQgb25lcy4KKwkJCSAqLworCQkJLyogU2V0IHVpZCBhbmQgZ2lkIHRvIHJvb3QuICovCisJCQl2aS0+aV91aWQgPSB2aS0+aV9naWQgPSAwOworCQkJLyogUmVndWxhciBmaWxlLiBObyBhY2Nlc3MgZm9yIGFueW9uZS4gKi8KKwkJCXZpLT5pX21vZGUgPSBTX0lGUkVHOworCQkJLyogTm8gVkZTIGluaXRpYXRlZCBvcGVyYXRpb25zIGFsbG93ZWQgZm9yICRNRlQuICovCisJCQl2aS0+aV9vcCA9ICZudGZzX2VtcHR5X2lub2RlX29wczsKKwkJCXZpLT5pX2ZvcCA9ICZudGZzX2VtcHR5X2ZpbGVfb3BzOworCQl9CisKKwkJLyogR2V0IHRoZSBsb3dlc3QgdmNuIGZvciB0aGUgbmV4dCBleHRlbnQuICovCisJCWhpZ2hlc3RfdmNuID0gc2xlNjRfdG9fY3B1KGF0dHItPmRhdGEubm9uX3Jlc2lkZW50LmhpZ2hlc3RfdmNuKTsKKwkJbmV4dF92Y24gPSBoaWdoZXN0X3ZjbiArIDE7CisKKwkJLyogT25seSBvbmUgZXh0ZW50IG9yIGVycm9yLCB3aGljaCB3ZSBjYXRjaCBiZWxvdy4gKi8KKwkJaWYgKG5leHRfdmNuIDw9IDApCisJCQlicmVhazsKKworCQkvKiBBdm9pZCBlbmRsZXNzIGxvb3BzIGR1ZSB0byBjb3JydXB0aW9uLiAqLworCQlpZiAobmV4dF92Y24gPCBzbGU2NF90b19jcHUoCisJCQkJYXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQubG93ZXN0X3ZjbikpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICIkTUZUIGhhcyBjb3JydXB0IGF0dHJpYnV0ZSBsaXN0ICIKKwkJCQkJImF0dHJpYnV0ZS4gUnVuIGNoa2Rzay4iKTsKKwkJCWdvdG8gcHV0X2Vycl9vdXQ7CisJCX0KKwl9CisJaWYgKGVyciAhPSAtRU5PRU5UKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gbG9va3VwICRNRlQvJERBVEEgYXR0cmlidXRlIGV4dGVudC4gIgorCQkJCSIkTUZUIGlzIGNvcnJ1cHQuIFJ1biBjaGtkc2suIik7CisJCWdvdG8gcHV0X2Vycl9vdXQ7CisJfQorCWlmICghYXR0cikgeworCQludGZzX2Vycm9yKHNiLCAiJE1GVC8kREFUQSBhdHRyaWJ1dGUgbm90IGZvdW5kLiAkTUZUIGlzICIKKwkJCQkiY29ycnVwdC4gUnVuIGNoa2Rzay4iKTsKKwkJZ290byBwdXRfZXJyX291dDsKKwl9CisJaWYgKGhpZ2hlc3RfdmNuICYmIGhpZ2hlc3RfdmNuICE9IGxhc3RfdmNuIC0gMSkgeworCQludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIGxvYWQgdGhlIGNvbXBsZXRlIHJ1bmxpc3QgZm9yICIKKwkJCQkiJE1GVC8kREFUQS4gRHJpdmVyIGJ1ZyBvciBjb3JydXB0ICRNRlQuICIKKwkJCQkiUnVuIGNoa2Rzay4iKTsKKwkJbnRmc19kZWJ1ZygiaGlnaGVzdF92Y24gPSAweCVsbHgsIGxhc3RfdmNuIC0gMSA9IDB4JWxseCIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyloaWdoZXN0X3ZjbiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKWxhc3RfdmNuIC0gMSk7CisJCWdvdG8gcHV0X2Vycl9vdXQ7CisJfQorCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCW50ZnNfZGVidWcoIkRvbmUuIik7CisJbnRmc19mcmVlKG0pOworCXJldHVybiAwOworCitlbV9wdXRfZXJyX291dDoKKwludGZzX2Vycm9yKHNiLCAiQ291bGRuJ3QgZmluZCBmaXJzdCBleHRlbnQgb2YgJERBVEEgYXR0cmlidXRlIGluICIKKwkJCSJhdHRyaWJ1dGUgbGlzdC4gJE1GVCBpcyBjb3JydXB0LiBSdW4gY2hrZHNrLiIpOworcHV0X2Vycl9vdXQ6CisJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CitlcnJfb3V0OgorCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQuIE1hcmtpbmcgaW5vZGUgYXMgYmFkLiIpOworCW1ha2VfYmFkX2lub2RlKHZpKTsKKwludGZzX2ZyZWUobSk7CisJcmV0dXJuIC0xOworfQorCisvKioKKyAqIG50ZnNfcHV0X2lub2RlIC0gaGFuZGxlciBmb3Igd2hlbiB0aGUgaW5vZGUgcmVmZXJlbmNlIGNvdW50IGlzIGRlY3JlbWVudGVkCisgKiBAdmk6CQl2ZnMgaW5vZGUKKyAqCisgKiBUaGUgVkZTIGNhbGxzIG50ZnNfcHV0X2lub2RlKCkgZXZlcnkgdGltZSB0aGUgaW5vZGUgcmVmZXJlbmNlIGNvdW50IChpX2NvdW50KQorICogaXMgYWJvdXQgdG8gYmUgZGVjcmVtZW50ZWQgKGJ1dCBiZWZvcmUgdGhlIGRlY3JlbWVudCBpdHNlbGYuCisgKgorICogSWYgdGhlIGlub2RlIEB2aSBpcyBhIGRpcmVjdG9yeSB3aXRoIHR3byByZWZlcmVuY2VzLCBvbmUgb2Ygd2hpY2ggaXMgYmVpbmcKKyAqIGRyb3BwZWQsIHdlIG5lZWQgdG8gcHV0IHRoZSBhdHRyaWJ1dGUgaW5vZGUgZm9yIHRoZSBkaXJlY3RvcnkgaW5kZXggYml0bWFwLAorICogaWYgaXQgaXMgcHJlc2VudCwgb3RoZXJ3aXNlIHRoZSBkaXJlY3RvcnkgaW5vZGUgd291bGQgcmVtYWluIHBpbm5lZCBmb3IKKyAqIGV2ZXIuCisgKi8KK3ZvaWQgbnRmc19wdXRfaW5vZGUoc3RydWN0IGlub2RlICp2aSkKK3sKKwlpZiAoU19JU0RJUih2aS0+aV9tb2RlKSAmJiBhdG9taWNfcmVhZCgmdmktPmlfY291bnQpID09IDIpIHsKKwkJbnRmc19pbm9kZSAqbmkgPSBOVEZTX0kodmkpOworCQlpZiAoTklub0luZGV4QWxsb2NQcmVzZW50KG5pKSkgeworCQkJc3RydWN0IGlub2RlICpidmkgPSBOVUxMOworCQkJZG93bigmdmktPmlfc2VtKTsKKwkJCWlmIChhdG9taWNfcmVhZCgmdmktPmlfY291bnQpID09IDIpIHsKKwkJCQlidmkgPSBuaS0+aXR5cGUuaW5kZXguYm1wX2lubzsKKwkJCQlpZiAoYnZpKQorCQkJCQluaS0+aXR5cGUuaW5kZXguYm1wX2lubyA9IE5VTEw7CisJCQl9CisJCQl1cCgmdmktPmlfc2VtKTsKKwkJCWlmIChidmkpCisJCQkJaXB1dChidmkpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBfX250ZnNfY2xlYXJfaW5vZGUobnRmc19pbm9kZSAqbmkpCit7CisJLyogRnJlZSBhbGwgYWxvY2F0ZWQgbWVtb3J5LiAqLworCWRvd25fd3JpdGUoJm5pLT5ydW5saXN0LmxvY2spOworCWlmIChuaS0+cnVubGlzdC5ybCkgeworCQludGZzX2ZyZWUobmktPnJ1bmxpc3QucmwpOworCQluaS0+cnVubGlzdC5ybCA9IE5VTEw7CisJfQorCXVwX3dyaXRlKCZuaS0+cnVubGlzdC5sb2NrKTsKKworCWlmIChuaS0+YXR0cl9saXN0KSB7CisJCW50ZnNfZnJlZShuaS0+YXR0cl9saXN0KTsKKwkJbmktPmF0dHJfbGlzdCA9IE5VTEw7CisJfQorCisJZG93bl93cml0ZSgmbmktPmF0dHJfbGlzdF9ybC5sb2NrKTsKKwlpZiAobmktPmF0dHJfbGlzdF9ybC5ybCkgeworCQludGZzX2ZyZWUobmktPmF0dHJfbGlzdF9ybC5ybCk7CisJCW5pLT5hdHRyX2xpc3RfcmwucmwgPSBOVUxMOworCX0KKwl1cF93cml0ZSgmbmktPmF0dHJfbGlzdF9ybC5sb2NrKTsKKworCWlmIChuaS0+bmFtZV9sZW4gJiYgbmktPm5hbWUgIT0gSTMwKSB7CisJCS8qIENhdGNoIGJ1Z3MuLi4gKi8KKwkJQlVHX09OKCFuaS0+bmFtZSk7CisJCWtmcmVlKG5pLT5uYW1lKTsKKwl9Cit9CisKK3ZvaWQgbnRmc19jbGVhcl9leHRlbnRfaW5vZGUobnRmc19pbm9kZSAqbmkpCit7CisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIGlub2RlIDB4JWx4LiIsIG5pLT5tZnRfbm8pOworCisJQlVHX09OKE5Jbm9BdHRyKG5pKSk7CisJQlVHX09OKG5pLT5ucl9leHRlbnRzICE9IC0xKTsKKworI2lmZGVmIE5URlNfUlcKKwlpZiAoTklub0RpcnR5KG5pKSkgeworCQlpZiAoIWlzX2JhZF9pbm9kZShWRlNfSShuaS0+ZXh0LmJhc2VfbnRmc19pbm8pKSkKKwkJCW50ZnNfZXJyb3IobmktPnZvbC0+c2IsICJDbGVhcmluZyBkaXJ0eSBleHRlbnQgaW5vZGUhICAiCisJCQkJCSJMb3NpbmcgZGF0YSEgIFRoaXMgaXMgYSBCVUchISEiKTsKKwkJLy8gRklYTUU6ICBEbyBzb21ldGhpbmchISEKKwl9CisjZW5kaWYgLyogTlRGU19SVyAqLworCisJX19udGZzX2NsZWFyX2lub2RlKG5pKTsKKworCS8qIEJ5ZSwgYnllLi4uICovCisJbnRmc19kZXN0cm95X2V4dGVudF9pbm9kZShuaSk7Cit9CisKKy8qKgorICogbnRmc19jbGVhcl9iaWdfaW5vZGUgLSBjbGVhbiB1cCB0aGUgbnRmcyBzcGVjaWZpYyBwYXJ0IG9mIGFuIGlub2RlCisgKiBAdmk6CQl2ZnMgaW5vZGUgcGVuZGluZyBhbm5paGlsYXRpb24KKyAqCisgKiBXaGVuIHRoZSBWRlMgaXMgZ29pbmcgdG8gcmVtb3ZlIGFuIGlub2RlIGZyb20gbWVtb3J5LCBudGZzX2NsZWFyX2JpZ19pbm9kZSgpCisgKiBpcyBjYWxsZWQsIHdoaWNoIGRlYWxsb2NhdGVzIGFsbCBtZW1vcnkgYmVsb25naW5nIHRvIHRoZSBOVEZTIHNwZWNpZmljIHBhcnQKKyAqIG9mIHRoZSBpbm9kZSBhbmQgcmV0dXJucy4KKyAqCisgKiBJZiB0aGUgTUZUIHJlY29yZCBpcyBkaXJ0eSwgd2UgY29tbWl0IGl0IGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLgorICovCit2b2lkIG50ZnNfY2xlYXJfYmlnX2lub2RlKHN0cnVjdCBpbm9kZSAqdmkpCit7CisJbnRmc19pbm9kZSAqbmkgPSBOVEZTX0kodmkpOworCisJLyoKKwkgKiBJZiB0aGUgaW5vZGUgQHZpIGlzIGFuIGluZGV4IGlub2RlIHdlIG5lZWQgdG8gcHV0IHRoZSBhdHRyaWJ1dGUKKwkgKiBpbm9kZSBmb3IgdGhlIGluZGV4IGJpdG1hcCwgaWYgaXQgaXMgcHJlc2VudCwgb3RoZXJ3aXNlIHRoZSBpbmRleAorCSAqIGlub2RlIHdvdWxkIGRpc2FwcGVhciBhbmQgdGhlIGF0dHJpYnV0ZSBpbm9kZSBmb3IgdGhlIGluZGV4IGJpdG1hcAorCSAqIHdvdWxkIG5vIGxvbmdlciBiZSByZWZlcmVuY2VkIGZyb20gYW55d2hlcmUgYW5kIHRodXMgaXQgd291bGQgcmVtYWluCisJICogcGlubmVkIGZvciBldmVyLgorCSAqLworCWlmIChOSW5vQXR0cihuaSkgJiYgKG5pLT50eXBlID09IEFUX0lOREVYX0FMTE9DQVRJT04pICYmCisJCQlOSW5vSW5kZXhBbGxvY1ByZXNlbnQobmkpICYmIG5pLT5pdHlwZS5pbmRleC5ibXBfaW5vKSB7CisJCWlwdXQobmktPml0eXBlLmluZGV4LmJtcF9pbm8pOworCQluaS0+aXR5cGUuaW5kZXguYm1wX2lubyA9IE5VTEw7CisJfQorI2lmZGVmIE5URlNfUlcKKwlpZiAoTklub0RpcnR5KG5pKSkgeworCQlCT09MIHdhc19iYWQgPSAoaXNfYmFkX2lub2RlKHZpKSk7CisKKwkJLyogQ29tbWl0dGluZyB0aGUgaW5vZGUgYWxzbyBjb21taXRzIGFsbCBleHRlbnQgaW5vZGVzLiAqLworCQludGZzX2NvbW1pdF9pbm9kZSh2aSk7CisKKwkJaWYgKCF3YXNfYmFkICYmIChpc19iYWRfaW5vZGUodmkpIHx8IE5Jbm9EaXJ0eShuaSkpKSB7CisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRmFpbGVkIHRvIGNvbW1pdCBkaXJ0eSBpbm9kZSAiCisJCQkJCSIweCVseC4gIExvc2luZyBkYXRhISIsIHZpLT5pX2lubyk7CisJCQkvLyBGSVhNRTogIERvIHNvbWV0aGluZyEhIQorCQl9CisJfQorI2VuZGlmIC8qIE5URlNfUlcgKi8KKworCS8qIE5vIG5lZWQgdG8gbG9jayBhdCB0aGlzIHN0YWdlIGFzIG5vIG9uZSBlbHNlIGhhcyBhIHJlZmVyZW5jZS4gKi8KKwlpZiAobmktPm5yX2V4dGVudHMgPiAwKSB7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBuaS0+bnJfZXh0ZW50czsgaSsrKQorCQkJbnRmc19jbGVhcl9leHRlbnRfaW5vZGUobmktPmV4dC5leHRlbnRfbnRmc19pbm9zW2ldKTsKKwkJa2ZyZWUobmktPmV4dC5leHRlbnRfbnRmc19pbm9zKTsKKwl9CisKKwlfX250ZnNfY2xlYXJfaW5vZGUobmkpOworCisJaWYgKE5Jbm9BdHRyKG5pKSkgeworCQkvKiBSZWxlYXNlIHRoZSBiYXNlIGlub2RlIGlmIHdlIGFyZSBob2xkaW5nIGl0LiAqLworCQlpZiAobmktPm5yX2V4dGVudHMgPT0gLTEpIHsKKwkJCWlwdXQoVkZTX0kobmktPmV4dC5iYXNlX250ZnNfaW5vKSk7CisJCQluaS0+bnJfZXh0ZW50cyA9IDA7CisJCQluaS0+ZXh0LmJhc2VfbnRmc19pbm8gPSBOVUxMOworCQl9CisJfQorCXJldHVybjsKK30KKworLyoqCisgKiBudGZzX3Nob3dfb3B0aW9ucyAtIHNob3cgbW91bnQgb3B0aW9ucyBpbiAvcHJvYy9tb3VudHMKKyAqIEBzZjoJCXNlcV9maWxlIGluIHdoaWNoIHRvIHdyaXRlIG91ciBtb3VudCBvcHRpb25zCisgKiBAbW50Ogl2ZnMgbW91bnQgd2hvc2UgbW91bnQgb3B0aW9ucyB0byBkaXNwbGF5CisgKgorICogQ2FsbGVkIGJ5IHRoZSBWRlMgb25jZSBmb3IgZWFjaCBtb3VudGVkIG50ZnMgdm9sdW1lIHdoZW4gc29tZW9uZSByZWFkcworICogL3Byb2MvbW91bnRzIGluIG9yZGVyIHRvIGRpc3BsYXkgdGhlIE5URlMgc3BlY2lmaWMgbW91bnQgb3B0aW9ucyBvZiBlYWNoCisgKiBtb3VudC4gVGhlIG1vdW50IG9wdGlvbnMgb2YgdGhlIHZmcyBtb3VudCBAbW50IGFyZSB3cml0dGVuIHRvIHRoZSBzZXEgZmlsZQorICogQHNmIGFuZCBzdWNjZXNzIGlzIHJldHVybmVkLgorICovCitpbnQgbnRmc19zaG93X29wdGlvbnMoc3RydWN0IHNlcV9maWxlICpzZiwgc3RydWN0IHZmc21vdW50ICptbnQpCit7CisJbnRmc192b2x1bWUgKnZvbCA9IE5URlNfU0IobW50LT5tbnRfc2IpOworCWludCBpOworCisJc2VxX3ByaW50ZihzZiwgIix1aWQ9JWkiLCB2b2wtPnVpZCk7CisJc2VxX3ByaW50ZihzZiwgIixnaWQ9JWkiLCB2b2wtPmdpZCk7CisJaWYgKHZvbC0+Zm1hc2sgPT0gdm9sLT5kbWFzaykKKwkJc2VxX3ByaW50ZihzZiwgIix1bWFzaz0wJW8iLCB2b2wtPmZtYXNrKTsKKwllbHNlIHsKKwkJc2VxX3ByaW50ZihzZiwgIixmbWFzaz0wJW8iLCB2b2wtPmZtYXNrKTsKKwkJc2VxX3ByaW50ZihzZiwgIixkbWFzaz0wJW8iLCB2b2wtPmRtYXNrKTsKKwl9CisJc2VxX3ByaW50ZihzZiwgIixubHM9JXMiLCB2b2wtPm5sc19tYXAtPmNoYXJzZXQpOworCWlmIChOVm9sQ2FzZVNlbnNpdGl2ZSh2b2wpKQorCQlzZXFfcHJpbnRmKHNmLCAiLGNhc2Vfc2Vuc2l0aXZlIik7CisJaWYgKE5Wb2xTaG93U3lzdGVtRmlsZXModm9sKSkKKwkJc2VxX3ByaW50ZihzZiwgIixzaG93X3N5c19maWxlcyIpOworCWZvciAoaSA9IDA7IG9uX2Vycm9yc19hcnJbaV0udmFsOyBpKyspIHsKKwkJaWYgKG9uX2Vycm9yc19hcnJbaV0udmFsICYgdm9sLT5vbl9lcnJvcnMpCisJCQlzZXFfcHJpbnRmKHNmLCAiLGVycm9ycz0lcyIsIG9uX2Vycm9yc19hcnJbaV0uc3RyKTsKKwl9CisJc2VxX3ByaW50ZihzZiwgIixtZnRfem9uZV9tdWx0aXBsaWVyPSVpIiwgdm9sLT5tZnRfem9uZV9tdWx0aXBsaWVyKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIE5URlNfUlcKKworLyoqCisgKiBudGZzX3RydW5jYXRlIC0gY2FsbGVkIHdoZW4gdGhlIGlfc2l6ZSBvZiBhbiBudGZzIGlub2RlIGlzIGNoYW5nZWQKKyAqIEB2aToJCWlub2RlIGZvciB3aGljaCB0aGUgaV9zaXplIHdhcyBjaGFuZ2VkCisgKgorICogV2UgZG8gbm90IHN1cHBvcnQgaV9zaXplIGNoYW5nZXMgeWV0LgorICoKKyAqIFRoZSBrZXJuZWwgZ3VhcmFudGVlcyB0aGF0IEB2aSBpcyBhIHJlZ3VsYXIgZmlsZSAoU19JU1JFRygpIGlzIHRydWUpIGFuZAorICogdGhhdCB0aGUgY2hhbmdlIGlzIGFsbG93ZWQuCisgKgorICogVGhpcyBpbXBsaWVzIGZvciB1cyB0aGF0IEB2aSBpcyBhIGZpbGUgaW5vZGUgcmF0aGVyIHRoYW4gYSBkaXJlY3RvcnksIGluZGV4LAorICogb3IgYXR0cmlidXRlIGlub2RlIGFzIHdlbGwgYXMgdGhhdCBAdmkgaXMgYSBiYXNlIGlub2RlLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIC1lcnJubyBvbiBlcnJvci4KKyAqCisgKiBDYWxsZWQgd2l0aCAtPmlfc2VtIGhlbGQuICBJbiBhbGwgYnV0IG9uZSBjYXNlIC0+aV9hbGxvY19zZW0gaXMgaGVsZCBmb3IKKyAqIHdyaXRpbmcuICBUaGUgb25seSBjYXNlIHdoZXJlIC0+aV9hbGxvY19zZW0gaXMgbm90IGhlbGQgaXMKKyAqIG1tL2ZpbGVtYXAuYzo6Z2VuZXJpY19maWxlX2J1ZmZlcmVkX3dyaXRlKCkgd2hlcmUgdm10cnVuY2F0ZSgpIGlzIGNhbGxlZAorICogd2l0aCB0aGUgY3VycmVudCBpX3NpemUgYXMgdGhlIG9mZnNldCB3aGljaCBtZWFucyB0aGF0IGl0IGlzIGEgbm9vcCBhcyBmYXIKKyAqIGFzIG50ZnNfdHJ1bmNhdGUoKSBpcyBjb25jZXJuZWQuCisgKi8KK2ludCBudGZzX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqdmkpCit7CisJbnRmc19pbm9kZSAqbmkgPSBOVEZTX0kodmkpOworCW50ZnNfdm9sdW1lICp2b2wgPSBuaS0+dm9sOworCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHg7CisJTUZUX1JFQ09SRCAqbTsKKwljb25zdCBjaGFyICp0ZSA9ICIgIExlYXZpbmcgZmlsZSBsZW5ndGggb3V0IG9mIHN5bmMgd2l0aCBpX3NpemUuIjsKKwlpbnQgZXJyOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIGlub2RlIDB4JWx4LiIsIHZpLT5pX2lubyk7CisJQlVHX09OKE5Jbm9BdHRyKG5pKSk7CisJQlVHX09OKG5pLT5ucl9leHRlbnRzIDwgMCk7CisJbSA9IG1hcF9tZnRfcmVjb3JkKG5pKTsKKwlpZiAoSVNfRVJSKG0pKSB7CisJCWVyciA9IFBUUl9FUlIobSk7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGYWlsZWQgdG8gbWFwIG1mdCByZWNvcmQgZm9yIGlub2RlIDB4JWx4ICIKKwkJCQkiKGVycm9yIGNvZGUgJWQpLiVzIiwgdmktPmlfaW5vLCBlcnIsIHRlKTsKKwkJY3R4ID0gTlVMTDsKKwkJbSA9IE5VTEw7CisJCWdvdG8gZXJyX291dDsKKwl9CisJY3R4ID0gbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4KG5pLCBtKTsKKwlpZiAodW5saWtlbHkoIWN0eCkpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBhIHNlYXJjaCBjb250ZXh0IGZvciAiCisJCQkJImlub2RlIDB4JWx4IChub3QgZW5vdWdoIG1lbW9yeSkuJXMiLAorCQkJCXZpLT5pX2lubywgdGUpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWVyciA9IG50ZnNfYXR0cl9sb29rdXAobmktPnR5cGUsIG5pLT5uYW1lLCBuaS0+bmFtZV9sZW4sCisJCQlDQVNFX1NFTlNJVElWRSwgMCwgTlVMTCwgMCwgY3R4KTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQlpZiAoZXJyID09IC1FTk9FTlQpCisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiT3BlbiBhdHRyaWJ1dGUgaXMgbWlzc2luZyBmcm9tICIKKwkJCQkJIm1mdCByZWNvcmQuICBJbm9kZSAweCVseCBpcyBjb3JydXB0LiAgIgorCQkJCQkiUnVuIGNoa2Rzay4iLCB2aS0+aV9pbm8pOworCQllbHNlCisJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRmFpbGVkIHRvIGxvb2t1cCBhdHRyaWJ1dGUgaW4gIgorCQkJCQkiaW5vZGUgMHglbHggKGVycm9yIGNvZGUgJWQpLiIsCisJCQkJCXZpLT5pX2lubywgZXJyKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwkvKiBJZiB0aGUgc2l6ZSBoYXMgbm90IGNoYW5nZWQgdGhlcmUgaXMgbm90aGluZyB0byBkby4gKi8KKwlpZiAobnRmc19hdHRyX3NpemUoY3R4LT5hdHRyKSA9PSBpX3NpemVfcmVhZCh2aSkpCisJCWdvdG8gZG9uZTsKKwkvLyBUT0RPOiBJbXBsZW1lbnQgdGhlIHRydW5jYXRlLi4uCisJbnRmc19lcnJvcih2aS0+aV9zYiwgIklub2RlIHNpemUgaGFzIGNoYW5nZWQgYnV0IHRoaXMgaXMgbm90ICIKKwkJCSJpbXBsZW1lbnRlZCB5ZXQuICBSZXNldHRpbmcgaW5vZGUgc2l6ZSB0byBvbGQgdmFsdWUuICIKKwkJCSIgVGhpcyBpcyBtb3N0IGxpa2VseSBhIGJ1ZyBpbiB0aGUgbnRmcyBkcml2ZXIhIik7CisJaV9zaXplX3dyaXRlKHZpLCBudGZzX2F0dHJfc2l6ZShjdHgtPmF0dHIpKTsgCitkb25lOgorCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCXVubWFwX21mdF9yZWNvcmQobmkpOworCU5Jbm9DbGVhclRydW5jYXRlRmFpbGVkKG5pKTsKKwludGZzX2RlYnVnKCJEb25lLiIpOworCXJldHVybiAwOworZXJyX291dDoKKwlpZiAoZXJyICE9IC1FTk9NRU0pIHsKKwkJTlZvbFNldEVycm9ycyh2b2wpOworCQltYWtlX2JhZF9pbm9kZSh2aSk7CisJfQorCWlmIChjdHgpCisJCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCWlmIChtKQorCQl1bm1hcF9tZnRfcmVjb3JkKG5pKTsKKwlOSW5vU2V0VHJ1bmNhdGVGYWlsZWQobmkpOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogbnRmc190cnVuY2F0ZV92ZnMgLSB3cmFwcGVyIGZvciBudGZzX3RydW5jYXRlKCkgdGhhdCBoYXMgbm8gcmV0dXJuIHZhbHVlCisgKiBAdmk6CQlpbm9kZSBmb3Igd2hpY2ggdGhlIGlfc2l6ZSB3YXMgY2hhbmdlZAorICoKKyAqIFdyYXBwZXIgZm9yIG50ZnNfdHJ1bmNhdGUoKSB0aGF0IGhhcyBubyByZXR1cm4gdmFsdWUuCisgKgorICogU2VlIG50ZnNfdHJ1bmNhdGUoKSBkZXNjcmlwdGlvbiBhYm92ZSBmb3IgZGV0YWlscy4KKyAqLwordm9pZCBudGZzX3RydW5jYXRlX3ZmcyhzdHJ1Y3QgaW5vZGUgKnZpKSB7CisJbnRmc190cnVuY2F0ZSh2aSk7Cit9CisKKy8qKgorICogbnRmc19zZXRhdHRyIC0gY2FsbGVkIGZyb20gbm90aWZ5X2NoYW5nZSgpIHdoZW4gYW4gYXR0cmlidXRlIGlzIGJlaW5nIGNoYW5nZWQKKyAqIEBkZW50cnk6CWRlbnRyeSB3aG9zZSBhdHRyaWJ1dGVzIHRvIGNoYW5nZQorICogQGF0dHI6CXN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBhdHRyaWJ1dGVzIGFuZCB0aGUgY2hhbmdlcworICoKKyAqIFdlIGhhdmUgdG8gdHJhcCBWRlMgYXR0ZW1wdHMgdG8gdHJ1bmNhdGUgdGhlIGZpbGUgZGVzY3JpYmVkIGJ5IEBkZW50cnkgYXMKKyAqIHNvb24gYXMgcG9zc2libGUsIGJlY2F1c2Ugd2UgZG8gbm90IGltcGxlbWVudCBjaGFuZ2VzIGluIGlfc2l6ZSB5ZXQuICBTbyB3ZQorICogYWJvcnQgYWxsIGlfc2l6ZSBjaGFuZ2VzIGhlcmUuCisgKgorICogV2UgYWxzbyBhYm9ydCBhbGwgY2hhbmdlcyBvZiB1c2VyLCBncm91cCwgYW5kIG1vZGUgYXMgd2UgZG8gbm90IGltcGxlbWVudAorICogdGhlIE5URlMgQUNMcyB5ZXQuCisgKgorICogQ2FsbGVkIHdpdGggLT5pX3NlbSBoZWxkLiAgRm9yIHRoZSBBVFRSX1NJWkUgKGkuZS4gLT50cnVuY2F0ZSkgY2FzZSwgYWxzbworICogY2FsbGVkIHdpdGggLT5pX2FsbG9jX3NlbSBoZWxkIGZvciB3cml0aW5nLgorICoKKyAqIEJhc2ljYWxseSB0aGlzIGlzIGEgY29weSBvZiBnZW5lcmljIG5vdGlmeV9jaGFuZ2UoKSBhbmQgaW5vZGVfc2V0YXR0cigpCisgKiBmdW5jdGlvbmFsaXR5LCBleGNlcHQgd2UgaW50ZXJjZXB0IGFuZCBhYm9ydCBjaGFuZ2VzIGluIGlfc2l6ZS4KKyAqLworaW50IG50ZnNfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqYXR0cikKK3sKKwlzdHJ1Y3QgaW5vZGUgKnZpID0gZGVudHJ5LT5kX2lub2RlOworCWludCBlcnI7CisJdW5zaWduZWQgaW50IGlhX3ZhbGlkID0gYXR0ci0+aWFfdmFsaWQ7CisKKwllcnIgPSBpbm9kZV9jaGFuZ2Vfb2sodmksIGF0dHIpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiBXZSBkbyBub3Qgc3VwcG9ydCBOVEZTIEFDTHMgeWV0LiAqLworCWlmIChpYV92YWxpZCAmIChBVFRSX1VJRCB8IEFUVFJfR0lEIHwgQVRUUl9NT0RFKSkgeworCQludGZzX3dhcm5pbmcodmktPmlfc2IsICJDaGFuZ2VzIGluIHVzZXIvZ3JvdXAvbW9kZSBhcmUgbm90ICIKKwkJCQkic3VwcG9ydGVkIHlldCwgaWdub3JpbmcuIik7CisJCWVyciA9IC1FT1BOT1RTVVBQOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoaWFfdmFsaWQgJiBBVFRSX1NJWkUpIHsKKwkJaWYgKGF0dHItPmlhX3NpemUgIT0gaV9zaXplX3JlYWQodmkpKSB7CisJCQludGZzX3dhcm5pbmcodmktPmlfc2IsICJDaGFuZ2VzIGluIGlub2RlIHNpemUgYXJlIG5vdCAiCisJCQkJCSJzdXBwb3J0ZWQgeWV0LCBpZ25vcmluZy4iKTsKKwkJCWVyciA9IC1FT1BOT1RTVVBQOworCQkJLy8gVE9ETzogSW1wbGVtZW50Li4uCisJCQkvLyBlcnIgPSB2bXRydW5jYXRlKHZpLCBhdHRyLT5pYV9zaXplKTsKKwkJCWlmIChlcnIgfHwgaWFfdmFsaWQgPT0gQVRUUl9TSVpFKQorCQkJCWdvdG8gb3V0OworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFdlIHNraXBwZWQgdGhlIHRydW5jYXRlIGJ1dCBtdXN0IHN0aWxsIHVwZGF0ZQorCQkJICogdGltZXN0YW1wcy4KKwkJCSAqLworCQkJaWFfdmFsaWQgfD0gQVRUUl9NVElNRXxBVFRSX0NUSU1FOworCQl9CisJfQorCisJaWYgKGlhX3ZhbGlkICYgQVRUUl9BVElNRSkKKwkJdmktPmlfYXRpbWUgPSBhdHRyLT5pYV9hdGltZTsKKwlpZiAoaWFfdmFsaWQgJiBBVFRSX01USU1FKQorCQl2aS0+aV9tdGltZSA9IGF0dHItPmlhX210aW1lOworCWlmIChpYV92YWxpZCAmIEFUVFJfQ1RJTUUpCisJCXZpLT5pX2N0aW1lID0gYXR0ci0+aWFfY3RpbWU7CisJbWFya19pbm9kZV9kaXJ0eSh2aSk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBudGZzX3dyaXRlX2lub2RlIC0gd3JpdGUgb3V0IGEgZGlydHkgaW5vZGUKKyAqIEB2aToJCWlub2RlIHRvIHdyaXRlIG91dAorICogQHN5bmM6CWlmIHRydWUsIHdyaXRlIG91dCBzeW5jaHJvbm91c2x5CisgKgorICogV3JpdGUgb3V0IGEgZGlydHkgaW5vZGUgdG8gZGlzayBpbmNsdWRpbmcgYW55IGV4dGVudCBpbm9kZXMgaWYgcHJlc2VudC4KKyAqCisgKiBJZiBAc3luYyBpcyB0cnVlLCBjb21taXQgdGhlIGlub2RlIHRvIGRpc2sgYW5kIHdhaXQgZm9yIGlvIGNvbXBsZXRpb24uICBUaGlzCisgKiBpcyBkb25lIHVzaW5nIHdyaXRlX21mdF9yZWNvcmQoKS4KKyAqCisgKiBJZiBAc3luYyBpcyBmYWxzZSwganVzdCBzY2hlZHVsZSB0aGUgd3JpdGUgdG8gaGFwcGVuIGJ1dCBkbyBub3Qgd2FpdCBmb3IgaS9vCisgKiBjb21wbGV0aW9uLiAgSW4gMi42IGtlcm5lbHMsIHNjaGVkdWxpbmcgdXN1YWxseSBoYXBwZW5zIGp1c3QgYnkgdmlydHVlIG9mCisgKiBtYXJraW5nIHRoZSBwYWdlIChhbmQgaW4gdGhpcyBjYXNlIG1mdCByZWNvcmQpIGRpcnR5IGJ1dCB3ZSBkbyBub3QgaW1wbGVtZW50CisgKiB0aGlzIHlldCBhcyB3cml0ZV9tZnRfcmVjb3JkKCkgbGFyZ2VseSBpZ25vcmVzIHRoZSBAc3luYyBwYXJhbWV0ZXIgYW5kCisgKiBhbHdheXMgcGVyZm9ybXMgc3luY2hyb25vdXMgd3JpdGVzLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4KKyAqLworaW50IG50ZnNfd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICp2aSwgaW50IHN5bmMpCit7CisJc2xlNjQgbnQ7CisJbnRmc19pbm9kZSAqbmkgPSBOVEZTX0kodmkpOworCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHg7CisJTUZUX1JFQ09SRCAqbTsKKwlTVEFOREFSRF9JTkZPUk1BVElPTiAqc2k7CisJaW50IGVyciA9IDA7CisJQk9PTCBtb2RpZmllZCA9IEZBTFNFOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yICVzaW5vZGUgMHglbHguIiwgTklub0F0dHIobmkpID8gImF0dHIgIiA6ICIiLAorCQkJdmktPmlfaW5vKTsKKwkvKgorCSAqIERpcnR5IGF0dHJpYnV0ZSBpbm9kZXMgYXJlIHdyaXR0ZW4gdmlhIHRoZWlyIHJlYWwgaW5vZGVzIHNvIGp1c3QKKwkgKiBjbGVhbiB0aGVtIGhlcmUuICBBY2Nlc3MgdGltZSB1cGRhdGVzIGFyZSB0YWtlbiBjYXJlIG9mZiB3aGVuIHRoZQorCSAqIHJlYWwgaW5vZGUgaXMgd3JpdHRlbi4KKwkgKi8KKwlpZiAoTklub0F0dHIobmkpKSB7CisJCU5Jbm9DbGVhckRpcnR5KG5pKTsKKwkJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIE1hcCwgcGluLCBhbmQgbG9jayB0aGUgbWZ0IHJlY29yZCBiZWxvbmdpbmcgdG8gdGhlIGlub2RlLiAqLworCW0gPSBtYXBfbWZ0X3JlY29yZChuaSk7CisJaWYgKElTX0VSUihtKSkgeworCQllcnIgPSBQVFJfRVJSKG0pOworCQlnb3RvIGVycl9vdXQ7CisJfQorCS8qIFVwZGF0ZSB0aGUgYWNjZXNzIHRpbWVzIGluIHRoZSBzdGFuZGFyZCBpbmZvcm1hdGlvbiBhdHRyaWJ1dGUuICovCisJY3R4ID0gbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4KG5pLCBtKTsKKwlpZiAodW5saWtlbHkoIWN0eCkpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJZXJyID0gbnRmc19hdHRyX2xvb2t1cChBVF9TVEFOREFSRF9JTkZPUk1BVElPTiwgTlVMTCwgMCwKKwkJCUNBU0VfU0VOU0lUSVZFLCAwLCBOVUxMLCAwLCBjdHgpOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCQlnb3RvIHVubV9lcnJfb3V0OworCX0KKwlzaSA9IChTVEFOREFSRF9JTkZPUk1BVElPTiopKCh1OCopY3R4LT5hdHRyICsKKwkJCWxlMTZfdG9fY3B1KGN0eC0+YXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpKTsKKwkvKiBVcGRhdGUgdGhlIGFjY2VzcyB0aW1lcyBpZiB0aGV5IGhhdmUgY2hhbmdlZC4gKi8KKwludCA9IHV0YzJudGZzKHZpLT5pX210aW1lKTsKKwlpZiAoc2ktPmxhc3RfZGF0YV9jaGFuZ2VfdGltZSAhPSBudCkgeworCQludGZzX2RlYnVnKCJVcGRhdGluZyBtdGltZSBmb3IgaW5vZGUgMHglbHg6IG9sZCA9IDB4JWxseCwgIgorCQkJCSJuZXcgPSAweCVsbHgiLCB2aS0+aV9pbm8sCisJCQkJc2xlNjRfdG9fY3B1KHNpLT5sYXN0X2RhdGFfY2hhbmdlX3RpbWUpLAorCQkJCXNsZTY0X3RvX2NwdShudCkpOworCQlzaS0+bGFzdF9kYXRhX2NoYW5nZV90aW1lID0gbnQ7CisJCW1vZGlmaWVkID0gVFJVRTsKKwl9CisJbnQgPSB1dGMybnRmcyh2aS0+aV9jdGltZSk7CisJaWYgKHNpLT5sYXN0X21mdF9jaGFuZ2VfdGltZSAhPSBudCkgeworCQludGZzX2RlYnVnKCJVcGRhdGluZyBjdGltZSBmb3IgaW5vZGUgMHglbHg6IG9sZCA9IDB4JWxseCwgIgorCQkJCSJuZXcgPSAweCVsbHgiLCB2aS0+aV9pbm8sCisJCQkJc2xlNjRfdG9fY3B1KHNpLT5sYXN0X21mdF9jaGFuZ2VfdGltZSksCisJCQkJc2xlNjRfdG9fY3B1KG50KSk7CisJCXNpLT5sYXN0X21mdF9jaGFuZ2VfdGltZSA9IG50OworCQltb2RpZmllZCA9IFRSVUU7CisJfQorCW50ID0gdXRjMm50ZnModmktPmlfYXRpbWUpOworCWlmIChzaS0+bGFzdF9hY2Nlc3NfdGltZSAhPSBudCkgeworCQludGZzX2RlYnVnKCJVcGRhdGluZyBhdGltZSBmb3IgaW5vZGUgMHglbHg6IG9sZCA9IDB4JWxseCwgIgorCQkJCSJuZXcgPSAweCVsbHgiLCB2aS0+aV9pbm8sCisJCQkJc2xlNjRfdG9fY3B1KHNpLT5sYXN0X2FjY2Vzc190aW1lKSwKKwkJCQlzbGU2NF90b19jcHUobnQpKTsKKwkJc2ktPmxhc3RfYWNjZXNzX3RpbWUgPSBudDsKKwkJbW9kaWZpZWQgPSBUUlVFOworCX0KKwkvKgorCSAqIElmIHdlIGp1c3QgbW9kaWZpZWQgdGhlIHN0YW5kYXJkIGluZm9ybWF0aW9uIGF0dHJpYnV0ZSB3ZSBuZWVkIHRvCisJICogbWFyayB0aGUgbWZ0IHJlY29yZCBpdCBpcyBpbiBkaXJ0eS4gIFdlIGRvIHRoaXMgbWFudWFsbHkgc28gdGhhdAorCSAqIG1hcmtfaW5vZGVfZGlydHkoKSBpcyBub3QgY2FsbGVkIHdoaWNoIHdvdWxkIHJlZGlydHkgdGhlIGlub2RlIGFuZAorCSAqIGhlbmNlIHJlc3VsdCBpbiBhbiBpbmZpbml0ZSBsb29wIG9mIHRyeWluZyB0byB3cml0ZSB0aGUgaW5vZGUuCisJICogVGhlcmUgaXMgbm8gbmVlZCB0byBtYXJrIHRoZSBiYXNlIGlub2RlIG5vciB0aGUgYmFzZSBtZnQgcmVjb3JkCisJICogZGlydHksIHNpbmNlIHdlIGFyZSBnb2luZyB0byB3cml0ZSB0aGlzIG1mdCByZWNvcmQgYmVsb3cgaW4gYW55IGNhc2UKKwkgKiBhbmQgdGhlIGJhc2UgbWZ0IHJlY29yZCBtYXkgYWN0dWFsbHkgbm90IGhhdmUgYmVlbiBtb2RpZmllZCBzbyBpdAorCSAqIG1pZ2h0IG5vdCBuZWVkIHRvIGJlIHdyaXR0ZW4gb3V0LgorCSAqIE5PVEU6IEl0IGlzIG5vdCBhIHByb2JsZW0gd2hlbiB0aGUgaW5vZGUgZm9yICRNRlQgaXRzZWxmIGlzIGJlaW5nCisJICogd3JpdHRlbiBvdXQgYXMgbWFya19udGZzX3JlY29yZF9kaXJ0eSgpIHdpbGwgb25seSBzZXQgSV9ESVJUWV9QQUdFUworCSAqIG9uIHRoZSAkTUZUIGlub2RlIGFuZCBoZW5jZSBudGZzX3dyaXRlX2lub2RlKCkgd2lsbCBub3QgYmUKKwkgKiByZS1pbnZva2VkIGJlY2F1c2Ugb2YgaXQgd2hpY2ggaW4gdHVybiBpcyBvayBzaW5jZSB0aGUgZGlydGllZCBtZnQKKwkgKiByZWNvcmQgd2lsbCBiZSBjbGVhbmVkIGFuZCB3cml0dGVuIG91dCB0byBkaXNrIGJlbG93LCBpLmUuIGJlZm9yZQorCSAqIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4KKwkgKi8KKwlpZiAobW9kaWZpZWQgJiYgIU5Jbm9UZXN0U2V0RGlydHkoY3R4LT5udGZzX2lubykpCisJCW1hcmtfbnRmc19yZWNvcmRfZGlydHkoY3R4LT5udGZzX2luby0+cGFnZSwKKwkJCQljdHgtPm50ZnNfaW5vLT5wYWdlX29mcyk7CisJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJLyogTm93IHRoZSBhY2Nlc3MgdGltZXMgYXJlIHVwZGF0ZWQsIHdyaXRlIHRoZSBiYXNlIG1mdCByZWNvcmQuICovCisJaWYgKE5Jbm9EaXJ0eShuaSkpCisJCWVyciA9IHdyaXRlX21mdF9yZWNvcmQobmksIG0sIHN5bmMpOworCS8qIFdyaXRlIGFsbCBhdHRhY2hlZCBleHRlbnQgbWZ0IHJlY29yZHMuICovCisJZG93bigmbmktPmV4dGVudF9sb2NrKTsKKwlpZiAobmktPm5yX2V4dGVudHMgPiAwKSB7CisJCW50ZnNfaW5vZGUgKipleHRlbnRfbmlzID0gbmktPmV4dC5leHRlbnRfbnRmc19pbm9zOworCQlpbnQgaTsKKworCQludGZzX2RlYnVnKCJXcml0aW5nICVpIGV4dGVudCBpbm9kZXMuIiwgbmktPm5yX2V4dGVudHMpOworCQlmb3IgKGkgPSAwOyBpIDwgbmktPm5yX2V4dGVudHM7IGkrKykgeworCQkJbnRmc19pbm9kZSAqdG5pID0gZXh0ZW50X25pc1tpXTsKKworCQkJaWYgKE5Jbm9EaXJ0eSh0bmkpKSB7CisJCQkJTUZUX1JFQ09SRCAqdG0gPSBtYXBfbWZ0X3JlY29yZCh0bmkpOworCQkJCWludCByZXQ7CisKKwkJCQlpZiAoSVNfRVJSKHRtKSkgeworCQkJCQlpZiAoIWVyciB8fCBlcnIgPT0gLUVOT01FTSkKKwkJCQkJCWVyciA9IFBUUl9FUlIodG0pOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJcmV0ID0gd3JpdGVfbWZ0X3JlY29yZCh0bmksIHRtLCBzeW5jKTsKKwkJCQl1bm1hcF9tZnRfcmVjb3JkKHRuaSk7CisJCQkJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJCQkJaWYgKCFlcnIgfHwgZXJyID09IC1FTk9NRU0pCisJCQkJCQllcnIgPSByZXQ7CisJCQkJfQorCQkJfQorCQl9CisJfQorCXVwKCZuaS0+ZXh0ZW50X2xvY2spOworCXVubWFwX21mdF9yZWNvcmQobmkpOworCWlmICh1bmxpa2VseShlcnIpKQorCQlnb3RvIGVycl9vdXQ7CisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gMDsKK3VubV9lcnJfb3V0OgorCXVubWFwX21mdF9yZWNvcmQobmkpOworZXJyX291dDoKKwlpZiAoZXJyID09IC1FTk9NRU0pIHsKKwkJbnRmc193YXJuaW5nKHZpLT5pX3NiLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gd3JpdGUgaW5vZGUuICAiCisJCQkJIk1hcmtpbmcgdGhlIGlub2RlIGRpcnR5IGFnYWluLCBzbyB0aGUgVkZTICIKKwkJCQkicmV0cmllcyBsYXRlci4iKTsKKwkJbWFya19pbm9kZV9kaXJ0eSh2aSk7CisJfSBlbHNlIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkZhaWxlZCAoZXJyb3IgY29kZSAlaSk6ICBNYXJraW5nIGlub2RlICIKKwkJCQkiYXMgYmFkLiAgWW91IHNob3VsZCBydW4gY2hrZHNrLiIsIC1lcnIpOworCQltYWtlX2JhZF9pbm9kZSh2aSk7CisJCU5Wb2xTZXRFcnJvcnMobmktPnZvbCk7CisJfQorCXJldHVybiBlcnI7Cit9CisKKyNlbmRpZiAvKiBOVEZTX1JXICovCmRpZmYgLS1naXQgYS9mcy9udGZzL2lub2RlLmggYi9mcy9udGZzL2lub2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk1ODA0NQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvaW5vZGUuaApAQCAtMCwwICsxLDMyMSBAQAorLyoKKyAqIGlub2RlLmggLSBEZWZpbmVzIGZvciBpbm9kZSBzdHJ1Y3R1cmVzIE5URlMgTGludXgga2VybmVsIGRyaXZlci4gUGFydCBvZgorICoJICAgICB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChjKSAyMDAyIFJpY2hhcmQgUnVzc29uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfTElOVVhfTlRGU19JTk9ERV9ICisjZGVmaW5lIF9MSU5VWF9OVEZTX0lOT0RFX0gKKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorCisjaW5jbHVkZSAibGF5b3V0LmgiCisjaW5jbHVkZSAidm9sdW1lLmgiCisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJydW5saXN0LmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKwordHlwZWRlZiBzdHJ1Y3QgX250ZnNfaW5vZGUgbnRmc19pbm9kZTsKKworLyoKKyAqIFRoZSBOVEZTIGluLW1lbW9yeSBpbm9kZSBzdHJ1Y3R1cmUuIEl0IGlzIGp1c3QgdXNlZCBhcyBhbiBleHRlbnNpb24gdG8gdGhlCisgKiBmaWVsZHMgYWxyZWFkeSBwcm92aWRlZCBpbiB0aGUgVkZTIGlub2RlLgorICovCitzdHJ1Y3QgX250ZnNfaW5vZGUgeworCXM2NCBpbml0aWFsaXplZF9zaXplOwkvKiBDb3B5IGZyb20gdGhlIGF0dHJpYnV0ZSByZWNvcmQuICovCisJczY0IGFsbG9jYXRlZF9zaXplOwkvKiBDb3B5IGZyb20gdGhlIGF0dHJpYnV0ZSByZWNvcmQuICovCisJdW5zaWduZWQgbG9uZyBzdGF0ZTsJLyogTlRGUyBzcGVjaWZpYyBmbGFncyBkZXNjcmliaW5nIHRoaXMgaW5vZGUuCisJCQkJICAgU2VlIG50ZnNfaW5vZGVfc3RhdGVfYml0cyBiZWxvdy4gKi8KKwl1bnNpZ25lZCBsb25nIG1mdF9ubzsJLyogTnVtYmVyIG9mIHRoZSBtZnQgcmVjb3JkIC8gaW5vZGUuICovCisJdTE2IHNlcV9ubzsJCS8qIFNlcXVlbmNlIG51bWJlciBvZiB0aGUgbWZ0IHJlY29yZC4gKi8KKwlhdG9taWNfdCBjb3VudDsJCS8qIElub2RlIHJlZmVyZW5jZSBjb3VudCBmb3IgYm9vayBrZWVwaW5nLiAqLworCW50ZnNfdm9sdW1lICp2b2w7CS8qIFBvaW50ZXIgdG8gdGhlIG50ZnMgdm9sdW1lIG9mIHRoaXMgaW5vZGUuICovCisJLyoKKwkgKiBJZiBOSW5vQXR0cigpIGlzIHRydWUsIHRoZSBiZWxvdyBmaWVsZHMgZGVzY3JpYmUgdGhlIGF0dHJpYnV0ZSB3aGljaAorCSAqIHRoaXMgZmFrZSBpbm9kZSBiZWxvbmdzIHRvLiBUaGUgYWN0dWFsIGlub2RlIG9mIHRoaXMgYXR0cmlidXRlIGlzCisJICogcG9pbnRlZCB0byBieSBiYXNlX250ZnNfaW5vIGFuZCBucl9leHRlbnRzIGlzIGFsd2F5cyBzZXQgdG8gLTEgKHNlZQorCSAqIGJlbG93KS4gRm9yIHJlYWwgaW5vZGVzLCB3ZSBhbHNvIHNldCB0aGUgdHlwZSAoQVRfREFUQSBmb3IgZmlsZXMgYW5kCisJICogQVRfSU5ERVhfQUxMT0NBVElPTiBmb3IgZGlyZWN0b3JpZXMpLCB3aXRoIHRoZSBuYW1lID0gTlVMTCBhbmQKKwkgKiBuYW1lX2xlbiA9IDAgZm9yIGZpbGVzIGFuZCBuYW1lID0gSTMwIChnbG9iYWwgY29uc3RhbnQpIGFuZAorCSAqIG5hbWVfbGVuID0gNCBmb3IgZGlyZWN0b3JpZXMuCisJICovCisJQVRUUl9UWVBFIHR5cGU7CS8qIEF0dHJpYnV0ZSB0eXBlIG9mIHRoaXMgZmFrZSBpbm9kZS4gKi8KKwludGZzY2hhciAqbmFtZTsJCS8qIEF0dHJpYnV0ZSBuYW1lIG9mIHRoaXMgZmFrZSBpbm9kZS4gKi8KKwl1MzIgbmFtZV9sZW47CQkvKiBBdHRyaWJ1dGUgbmFtZSBsZW5ndGggb2YgdGhpcyBmYWtlIGlub2RlLiAqLworCXJ1bmxpc3QgcnVubGlzdDsJLyogSWYgc3RhdGUgaGFzIHRoZSBOSV9Ob25SZXNpZGVudCBiaXQgc2V0LAorCQkJCSAgIHRoZSBydW5saXN0IG9mIHRoZSB1bm5hbWVkIGRhdGEgYXR0cmlidXRlCisJCQkJICAgKGlmIGEgZmlsZSkgb3Igb2YgdGhlIGluZGV4IGFsbG9jYXRpb24KKwkJCQkgICBhdHRyaWJ1dGUgKGRpcmVjdG9yeSkgb3Igb2YgdGhlIGF0dHJpYnV0ZQorCQkJCSAgIGRlc2NyaWJlZCBieSB0aGUgZmFrZSBpbm9kZSAoaWYgTklub0F0dHIoKSkuCisJCQkJICAgSWYgcnVubGlzdC5ybCBpcyBOVUxMLCB0aGUgcnVubGlzdCBoYXMgbm90CisJCQkJICAgYmVlbiByZWFkIGluIHlldCBvciBoYXMgYmVlbiB1bm1hcHBlZC4gSWYKKwkJCQkgICBOSV9Ob25SZXNpZGVudCBpcyBjbGVhciwgdGhlIGF0dHJpYnV0ZSBpcworCQkJCSAgIHJlc2lkZW50IChmaWxlIGFuZCBmYWtlIGlub2RlKSBvciB0aGVyZSBpcworCQkJCSAgIG5vICRJMzAgaW5kZXggYWxsb2NhdGlvbiBhdHRyaWJ1dGUKKwkJCQkgICAoc21hbGwgZGlyZWN0b3J5KS4gSW4gdGhlIGxhdHRlciBjYXNlCisJCQkJICAgcnVubGlzdC5ybCBpcyBhbHdheXMgTlVMTC4qLworCS8qCisJICogVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIG9ubHkgdmFsaWQgZm9yIHJlYWwgaW5vZGVzIGFuZCBleHRlbnQKKwkgKiBpbm9kZXMuCisJICovCisJc3RydWN0IHNlbWFwaG9yZSBtcmVjX2xvY2s7IC8qIExvY2sgZm9yIHNlcmlhbGl6aW5nIGFjY2VzcyB0byB0aGUKKwkJCQkgICBtZnQgcmVjb3JkIGJlbG9uZ2luZyB0byB0aGlzIGlub2RlLiAqLworCXN0cnVjdCBwYWdlICpwYWdlOwkvKiBUaGUgcGFnZSBjb250YWluaW5nIHRoZSBtZnQgcmVjb3JkIG9mIHRoZQorCQkJCSAgIGlub2RlLiBUaGlzIHNob3VsZCBvbmx5IGJlIHRvdWNoZWQgYnkgdGhlCisJCQkJICAgKHVuKW1hcF9tZnRfcmVjb3JkKigpIGZ1bmN0aW9ucy4gKi8KKwlpbnQgcGFnZV9vZnM7CQkvKiBPZmZzZXQgaW50byB0aGUgcGFnZSBhdCB3aGljaCB0aGUgbWZ0IHJlY29yZAorCQkJCSAgIGJlZ2lucy4gVGhpcyBzaG91bGQgb25seSBiZSB0b3VjaGVkIGJ5IHRoZQorCQkJCSAgICh1biltYXBfbWZ0X3JlY29yZCooKSBmdW5jdGlvbnMuICovCisJLyoKKwkgKiBBdHRyaWJ1dGUgbGlzdCBzdXBwb3J0IChvbmx5IGZvciB1c2UgYnkgdGhlIGF0dHJpYnV0ZSBsb29rdXAKKwkgKiBmdW5jdGlvbnMpLiBTZXR1cCBkdXJpbmcgcmVhZF9pbm9kZSBmb3IgYWxsIGlub2RlcyB3aXRoIGF0dHJpYnV0ZQorCSAqIGxpc3RzLiBPbmx5IHZhbGlkIGlmIE5JX0F0dHJMaXN0IGlzIHNldCBpbiBzdGF0ZSwgYW5kIGF0dHJfbGlzdF9ybCBpcworCSAqIGZ1cnRoZXIgb25seSB2YWxpZCBpZiBOSV9BdHRyTGlzdE5vblJlc2lkZW50IGlzIHNldC4KKwkgKi8KKwl1MzIgYXR0cl9saXN0X3NpemU7CS8qIExlbmd0aCBvZiBhdHRyaWJ1dGUgbGlzdCB2YWx1ZSBpbiBieXRlcy4gKi8KKwl1OCAqYXR0cl9saXN0OwkJLyogQXR0cmlidXRlIGxpc3QgdmFsdWUgaXRzZWxmLiAqLworCXJ1bmxpc3QgYXR0cl9saXN0X3JsOwkvKiBSdW4gbGlzdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0IHZhbHVlLiAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsgLyogSXQgaXMgYSBkaXJlY3RvcnksICRNRlQsIG9yIGFuIGluZGV4IGlub2RlLiAqLworCQkJc3RydWN0IGlub2RlICpibXBfaW5vOwkvKiBBdHRyaWJ1dGUgaW5vZGUgZm9yIHRoZQorCQkJCQkJICAgaW5kZXggJEJJVE1BUC4gKi8KKwkJCXUzMiBibG9ja19zaXplOwkJLyogU2l6ZSBvZiBhbiBpbmRleCBibG9jay4gKi8KKwkJCXUzMiB2Y25fc2l6ZTsJCS8qIFNpemUgb2YgYSB2Y24gaW4gdGhpcworCQkJCQkJICAgaW5kZXguICovCisJCQlDT0xMQVRJT05fUlVMRSBjb2xsYXRpb25fcnVsZTsgLyogVGhlIGNvbGxhdGlvbiBydWxlCisJCQkJCQkgICBmb3IgdGhlIGluZGV4LiAqLworCQkJdTggYmxvY2tfc2l6ZV9iaXRzOyAJLyogTG9nMiBvZiB0aGUgYWJvdmUuICovCisJCQl1OCB2Y25fc2l6ZV9iaXRzOwkvKiBMb2cyIG9mIHRoZSBhYm92ZS4gKi8KKwkJfSBpbmRleDsKKwkJc3RydWN0IHsgLyogSXQgaXMgYSBjb21wcmVzc2VkIGZpbGUgb3IgYW4gYXR0cmlidXRlIGlub2RlLiAqLworCQkJczY0IHNpemU7CQkvKiBDb3B5IG9mIGNvbXByZXNzZWRfc2l6ZSBmcm9tCisJCQkJCQkgICAkREFUQS4gKi8KKwkJCXUzMiBibG9ja19zaXplOwkJLyogU2l6ZSBvZiBhIGNvbXByZXNzaW9uIGJsb2NrCisJCQkJCQkgICAoY2IpLiAqLworCQkJdTggYmxvY2tfc2l6ZV9iaXRzOwkvKiBMb2cyIG9mIHRoZSBzaXplIG9mIGEgY2IuICovCisJCQl1OCBibG9ja19jbHVzdGVyczsJLyogTnVtYmVyIG9mIGNsdXN0ZXJzIHBlciBjYi4gKi8KKwkJfSBjb21wcmVzc2VkOworCX0gaXR5cGU7CisJc3RydWN0IHNlbWFwaG9yZSBleHRlbnRfbG9jazsJLyogTG9jayBmb3IgYWNjZXNzaW5nL21vZGlmeWluZyB0aGUKKwkJCQkJICAgYmVsb3cgLiAqLworCXMzMiBucl9leHRlbnRzOwkvKiBGb3IgYSBiYXNlIG1mdCByZWNvcmQsIHRoZSBudW1iZXIgb2YgYXR0YWNoZWQgZXh0ZW50CisJCQkgICBpbm9kZXMgKDAgaWYgbm9uZSksIGZvciBleHRlbnQgcmVjb3JkcyBhbmQgZm9yIGZha2UKKwkJCSAgIGlub2RlcyBkZXNjcmliaW5nIGFuIGF0dHJpYnV0ZSB0aGlzIGlzIC0xLiAqLworCXVuaW9uIHsJCS8qIFRoaXMgdW5pb24gaXMgb25seSB1c2VkIGlmIG5yX2V4dGVudHMgIT0gMC4gKi8KKwkJbnRmc19pbm9kZSAqKmV4dGVudF9udGZzX2lub3M7CS8qIEZvciBucl9leHRlbnRzID4gMCwgYXJyYXkgb2YKKwkJCQkJCSAgIHRoZSBudGZzIGlub2RlcyBvZiB0aGUgZXh0ZW50CisJCQkJCQkgICBtZnQgcmVjb3JkcyBiZWxvbmdpbmcgdG8KKwkJCQkJCSAgIHRoaXMgYmFzZSBpbm9kZSB3aGljaCBoYXZlCisJCQkJCQkgICBiZWVuIGxvYWRlZC4gKi8KKwkJbnRmc19pbm9kZSAqYmFzZV9udGZzX2lubzsJLyogRm9yIG5yX2V4dGVudHMgPT0gLTEsIHRoZQorCQkJCQkJICAgbnRmcyBpbm9kZSBvZiB0aGUgYmFzZSBtZnQKKwkJCQkJCSAgIHJlY29yZC4gRm9yIGZha2UgaW5vZGVzLCB0aGUKKwkJCQkJCSAgIHJlYWwgKGJhc2UpIGlub2RlIHRvIHdoaWNoCisJCQkJCQkgICB0aGUgYXR0cmlidXRlIGJlbG9uZ3MuICovCisJfSBleHQ7Cit9OworCisvKgorICogRGVmaW5lZCBiaXRzIGZvciB0aGUgc3RhdGUgZmllbGQgaW4gdGhlIG50ZnNfaW5vZGUgc3RydWN0dXJlLgorICogKGYpID0gZmlsZXMgb25seSwgKGQpID0gZGlyZWN0b3JpZXMgb25seSwgKGEpID0gYXR0cmlidXRlcy9mYWtlIGlub2RlcyBvbmx5CisgKi8KK3R5cGVkZWYgZW51bSB7CisJTklfRGlydHksCQkvKiAxOiBNZnQgcmVjb3JkIG5lZWRzIHRvIGJlIHdyaXR0ZW4gdG8gZGlzay4gKi8KKwlOSV9BdHRyTGlzdCwJCS8qIDE6IE1mdCByZWNvcmQgY29udGFpbnMgYW4gYXR0cmlidXRlIGxpc3QuICovCisJTklfQXR0ckxpc3ROb25SZXNpZGVudCwJLyogMTogQXR0cmlidXRlIGxpc3QgaXMgbm9uLXJlc2lkZW50LiBJbXBsaWVzCisJCQkJICAgICAgTklfQXR0ckxpc3QgaXMgc2V0LiAqLworCisJTklfQXR0ciwJCS8qIDE6IEZha2UgaW5vZGUgZm9yIGF0dHJpYnV0ZSBpL28uCisJCQkJICAgMDogUmVhbCBpbm9kZSBvciBleHRlbnQgaW5vZGUuICovCisKKwlOSV9Nc3RQcm90ZWN0ZWQsCS8qIDE6IEF0dHJpYnV0ZSBpcyBwcm90ZWN0ZWQgYnkgTVNUIGZpeHVwcy4KKwkJCQkgICAwOiBBdHRyaWJ1dGUgaXMgbm90IHByb3RlY3RlZCBieSBmaXh1cHMuICovCisJTklfTm9uUmVzaWRlbnQsCQkvKiAxOiBVbm5hbWVkIGRhdGEgYXR0ciBpcyBub24tcmVzaWRlbnQgKGYpLgorCQkJCSAgIDE6IEF0dHJpYnV0ZSBpcyBub24tcmVzaWRlbnQgKGEpLiAqLworCU5JX0luZGV4QWxsb2NQcmVzZW50ID0gTklfTm9uUmVzaWRlbnQsCS8qIDE6ICRJMzAgaW5kZXggYWxsb2MgYXR0ciBpcworCQkJCQkJICAgcHJlc2VudCAoZCkuICovCisJTklfQ29tcHJlc3NlZCwJCS8qIDE6IFVubmFtZWQgZGF0YSBhdHRyIGlzIGNvbXByZXNzZWQgKGYpLgorCQkJCSAgIDE6IENyZWF0ZSBjb21wcmVzc2VkIGZpbGVzIGJ5IGRlZmF1bHQgKGQpLgorCQkJCSAgIDE6IEF0dHJpYnV0ZSBpcyBjb21wcmVzc2VkIChhKS4gKi8KKwlOSV9FbmNyeXB0ZWQsCQkvKiAxOiBVbm5hbWVkIGRhdGEgYXR0ciBpcyBlbmNyeXB0ZWQgKGYpLgorCQkJCSAgIDE6IENyZWF0ZSBlbmNyeXB0ZWQgZmlsZXMgYnkgZGVmYXVsdCAoZCkuCisJCQkJICAgMTogQXR0cmlidXRlIGlzIGVuY3J5cHRlZCAoYSkuICovCisJTklfU3BhcnNlLAkJLyogMTogVW5uYW1lZCBkYXRhIGF0dHIgaXMgc3BhcnNlIChmKS4KKwkJCQkgICAxOiBDcmVhdGUgc3BhcnNlIGZpbGVzIGJ5IGRlZmF1bHQgKGQpLgorCQkJCSAgIDE6IEF0dHJpYnV0ZSBpcyBzcGFyc2UgKGEpLiAqLworCU5JX1RydW5jYXRlRmFpbGVkLAkvKiAxOiBMYXN0IG50ZnNfdHJ1bmNhdGUoKSBjYWxsIGZhaWxlZC4gKi8KK30gbnRmc19pbm9kZV9zdGF0ZV9iaXRzOworCisvKgorICogTk9URTogV2Ugc2hvdWxkIGJlIGFkZGluZyBkaXJ0eSBtZnQgcmVjb3JkcyB0byBhIGxpc3Qgc29tZXdoZXJlIGFuZCB0aGV5CisgKiBzaG91bGQgYmUgaW5kZXBlbmRlbnQgb2YgdGhlIChudGZzL3ZmcykgaW5vZGUgc3RydWN0dXJlIHNvIHRoYXQgYW4gaW5vZGUgY2FuCisgKiBiZSByZW1vdmVkIGJ1dCB0aGUgcmVjb3JkIGNhbiBiZSBsZWZ0IGRpcnR5IGZvciBzeW5jaW5nIGxhdGVyLgorICovCisKKy8qCisgKiBNYWNybyB0cmlja3MgdG8gZXhwYW5kIHRoZSBOSW5vRm9vKCksIE5Jbm9TZXRGb28oKSwgYW5kIE5Jbm9DbGVhckZvbygpCisgKiBmdW5jdGlvbnMuCisgKi8KKyNkZWZpbmUgTklOT19GTlMoZmxhZykJCQkJCVwKK3N0YXRpYyBpbmxpbmUgaW50IE5Jbm8jI2ZsYWcobnRmc19pbm9kZSAqbmkpCQlcCit7CQkJCQkJCVwKKwlyZXR1cm4gdGVzdF9iaXQoTklfIyNmbGFnLCAmKG5pKS0+c3RhdGUpOwlcCit9CQkJCQkJCVwKK3N0YXRpYyBpbmxpbmUgdm9pZCBOSW5vU2V0IyNmbGFnKG50ZnNfaW5vZGUgKm5pKQlcCit7CQkJCQkJCVwKKwlzZXRfYml0KE5JXyMjZmxhZywgJihuaSktPnN0YXRlKTsJCVwKK30JCQkJCQkJXAorc3RhdGljIGlubGluZSB2b2lkIE5Jbm9DbGVhciMjZmxhZyhudGZzX2lub2RlICpuaSkJXAorewkJCQkJCQlcCisJY2xlYXJfYml0KE5JXyMjZmxhZywgJihuaSktPnN0YXRlKTsJCVwKK30KKworLyoKKyAqIEFzIGFib3ZlIGZvciBOSW5vVGVzdFNldEZvbygpIGFuZCBOSW5vVGVzdENsZWFyRm9vKCkuCisgKi8KKyNkZWZpbmUgVEFTX05JTk9fRk5TKGZsYWcpCQkJCQlcCitzdGF0aWMgaW5saW5lIGludCBOSW5vVGVzdFNldCMjZmxhZyhudGZzX2lub2RlICpuaSkJCVwKK3sJCQkJCQkJCVwKKwlyZXR1cm4gdGVzdF9hbmRfc2V0X2JpdChOSV8jI2ZsYWcsICYobmkpLT5zdGF0ZSk7CVwKK30JCQkJCQkJCVwKK3N0YXRpYyBpbmxpbmUgaW50IE5Jbm9UZXN0Q2xlYXIjI2ZsYWcobnRmc19pbm9kZSAqbmkpCQlcCit7CQkJCQkJCQlcCisJcmV0dXJuIHRlc3RfYW5kX2NsZWFyX2JpdChOSV8jI2ZsYWcsICYobmkpLT5zdGF0ZSk7CVwKK30KKworLyogRW1pdCB0aGUgbnRmcyBpbm9kZSBiaXRvcHMgZnVuY3Rpb25zLiAqLworTklOT19GTlMoRGlydHkpCitUQVNfTklOT19GTlMoRGlydHkpCitOSU5PX0ZOUyhBdHRyTGlzdCkKK05JTk9fRk5TKEF0dHJMaXN0Tm9uUmVzaWRlbnQpCitOSU5PX0ZOUyhBdHRyKQorTklOT19GTlMoTXN0UHJvdGVjdGVkKQorTklOT19GTlMoTm9uUmVzaWRlbnQpCitOSU5PX0ZOUyhJbmRleEFsbG9jUHJlc2VudCkKK05JTk9fRk5TKENvbXByZXNzZWQpCitOSU5PX0ZOUyhFbmNyeXB0ZWQpCitOSU5PX0ZOUyhTcGFyc2UpCitOSU5PX0ZOUyhUcnVuY2F0ZUZhaWxlZCkKKworLyoKKyAqIFRoZSBmdWxsIHN0cnVjdHVyZSBjb250YWluaW5nIGEgbnRmc19pbm9kZSBhbmQgYSB2ZnMgc3RydWN0IGlub2RlLiBVc2VkIGZvcgorICogYWxsIHJlYWwgYW5kIGZha2UgaW5vZGVzIGJ1dCBub3QgZm9yIGV4dGVudCBpbm9kZXMgd2hpY2ggbGFjayB0aGUgdmZzIHN0cnVjdAorICogaW5vZGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwludGZzX2lub2RlIG50ZnNfaW5vZGU7CisJc3RydWN0IGlub2RlIHZmc19pbm9kZTsJCS8qIFRoZSB2ZnMgaW5vZGUgc3RydWN0dXJlLiAqLworfSBiaWdfbnRmc19pbm9kZTsKKworLyoqCisgKiBOVEZTX0kgLSByZXR1cm4gdGhlIG50ZnMgaW5vZGUgZ2l2ZW4gYSB2ZnMgaW5vZGUKKyAqIEBpbm9kZToJVkZTIGlub2RlCisgKgorICogTlRGU19JKCkgcmV0dXJucyB0aGUgbnRmcyBpbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhlIFZGUyBAaW5vZGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgbnRmc19pbm9kZSAqTlRGU19JKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIChudGZzX2lub2RlICopbGlzdF9lbnRyeShpbm9kZSwgYmlnX250ZnNfaW5vZGUsIHZmc19pbm9kZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlub2RlICpWRlNfSShudGZzX2lub2RlICpuaSkKK3sKKwlyZXR1cm4gJigoYmlnX250ZnNfaW5vZGUgKiluaSktPnZmc19pbm9kZTsKK30KKworLyoqCisgKiBudGZzX2F0dHIgLSBudGZzIGluIG1lbW9yeSBhdHRyaWJ1dGUgc3RydWN0dXJlCisgKiBAbWZ0X25vOgltZnQgcmVjb3JkIG51bWJlciBvZiB0aGUgYmFzZSBtZnQgcmVjb3JkIG9mIHRoaXMgYXR0cmlidXRlCisgKiBAbmFtZToJVW5pY29kZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgKE5VTEwgaWYgdW5uYW1lZCkKKyAqIEBuYW1lX2xlbjoJbGVuZ3RoIG9mIEBuYW1lIGluIFVuaWNvZGUgY2hhcmFjdGVycyAoMCBpZiB1bm5hbWVkKQorICogQHR5cGU6CWF0dHJpYnV0ZSB0eXBlIChzZWUgbGF5b3V0LmgpCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgZXhpc3RzIG9ubHkgdG8gcHJvdmlkZSBhIHNtYWxsIHN0cnVjdHVyZSBmb3IgdGhlCisgKiBudGZzX3thdHRyX31pZ2V0KCkvbnRmc190ZXN0X2lub2RlKCkvbnRmc19pbml0X2xvY2tlZF9pbm9kZSgpIG1lY2hhbmlzbS4KKyAqCisgKiBOT1RFOiBFbGVtZW50cyBhcmUgb3JkZXJlZCBieSBzaXplIHRvIG1ha2UgdGhlIHN0cnVjdHVyZSBhcyBjb21wYWN0IGFzCisgKiBwb3NzaWJsZSBvbiBhbGwgYXJjaGl0ZWN0dXJlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgbWZ0X25vOworCW50ZnNjaGFyICpuYW1lOworCXUzMiBuYW1lX2xlbjsKKwlBVFRSX1RZUEUgdHlwZTsKK30gbnRmc19hdHRyOworCit0eXBlZGVmIGludCAoKnRlc3RfdCkoc3RydWN0IGlub2RlICosIHZvaWQgKik7CisKK2V4dGVybiBpbnQgbnRmc190ZXN0X2lub2RlKHN0cnVjdCBpbm9kZSAqdmksIG50ZnNfYXR0ciAqbmEpOworCitleHRlcm4gc3RydWN0IGlub2RlICpudGZzX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdW5zaWduZWQgbG9uZyBtZnRfbm8pOworZXh0ZXJuIHN0cnVjdCBpbm9kZSAqbnRmc19hdHRyX2lnZXQoc3RydWN0IGlub2RlICpiYXNlX3ZpLCBBVFRSX1RZUEUgdHlwZSwKKwkJbnRmc2NoYXIgKm5hbWUsIHUzMiBuYW1lX2xlbik7CitleHRlcm4gc3RydWN0IGlub2RlICpudGZzX2luZGV4X2lnZXQoc3RydWN0IGlub2RlICpiYXNlX3ZpLCBudGZzY2hhciAqbmFtZSwKKwkJdTMyIG5hbWVfbGVuKTsKKworZXh0ZXJuIHN0cnVjdCBpbm9kZSAqbnRmc19hbGxvY19iaWdfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CitleHRlcm4gdm9pZCBudGZzX2Rlc3Ryb3lfYmlnX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworZXh0ZXJuIHZvaWQgbnRmc19jbGVhcl9iaWdfaW5vZGUoc3RydWN0IGlub2RlICp2aSk7CisKK2V4dGVybiB2b2lkIF9fbnRmc19pbml0X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIG50ZnNfaW5vZGUgKm5pKTsKKworc3RhdGljIGlubGluZSB2b2lkIG50ZnNfaW5pdF9iaWdfaW5vZGUoc3RydWN0IGlub2RlICp2aSkKK3sKKwludGZzX2lub2RlICpuaSA9IE5URlNfSSh2aSk7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwlfX250ZnNfaW5pdF9pbm9kZSh2aS0+aV9zYiwgbmkpOworCW5pLT5tZnRfbm8gPSB2aS0+aV9pbm87Cit9CisKK2V4dGVybiBudGZzX2lub2RlICpudGZzX25ld19leHRlbnRfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJdW5zaWduZWQgbG9uZyBtZnRfbm8pOworZXh0ZXJuIHZvaWQgbnRmc19jbGVhcl9leHRlbnRfaW5vZGUobnRmc19pbm9kZSAqbmkpOworCitleHRlcm4gaW50IG50ZnNfcmVhZF9pbm9kZV9tb3VudChzdHJ1Y3QgaW5vZGUgKnZpKTsKKworZXh0ZXJuIHZvaWQgbnRmc19wdXRfaW5vZGUoc3RydWN0IGlub2RlICp2aSk7CisKK2V4dGVybiBpbnQgbnRmc19zaG93X29wdGlvbnMoc3RydWN0IHNlcV9maWxlICpzZiwgc3RydWN0IHZmc21vdW50ICptbnQpOworCisjaWZkZWYgTlRGU19SVworCitleHRlcm4gaW50IG50ZnNfdHJ1bmNhdGUoc3RydWN0IGlub2RlICp2aSk7CitleHRlcm4gdm9pZCBudGZzX3RydW5jYXRlX3ZmcyhzdHJ1Y3QgaW5vZGUgKnZpKTsKKworZXh0ZXJuIGludCBudGZzX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmF0dHIpOworCitleHRlcm4gaW50IG50ZnNfd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICp2aSwgaW50IHN5bmMpOworCitzdGF0aWMgaW5saW5lIHZvaWQgbnRmc19jb21taXRfaW5vZGUoc3RydWN0IGlub2RlICp2aSkKK3sKKwlpZiAoIWlzX2JhZF9pbm9kZSh2aSkpCisJCW50ZnNfd3JpdGVfaW5vZGUodmksIDEpOworCXJldHVybjsKK30KKworI2VuZGlmIC8qIE5URlNfUlcgKi8KKworI2VuZGlmIC8qIF9MSU5VWF9OVEZTX0lOT0RFX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvbGF5b3V0LmggYi9mcy9udGZzL2xheW91dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YjMzODkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL2xheW91dC5oCkBAIC0wLDAgKzEsMjQxMyBAQAorLyoKKyAqIGxheW91dC5oIC0gQWxsIE5URlMgYXNzb2NpYXRlZCBvbi1kaXNrIHN0cnVjdHVyZXMuIFBhcnQgb2YgdGhlIExpbnV4LU5URlMKKyAqCSAgICAgIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgUmljaGFyZCBSdXNzb24KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZuZGVmIF9MSU5VWF9OVEZTX0xBWU9VVF9ICisjZGVmaW5lIF9MSU5VWF9OVEZTX0xBWU9VVF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpbmNsdWRlICJ0eXBlcy5oIgorCisvKgorICogQ29uc3RhbnQgZW5kaWFubmVzcyBjb252ZXJzaW9uIGRlZmluZXMuCisgKi8KKyNkZWZpbmUgY29uc3RfbGUxNl90b19jcHUoeCkJX19jb25zdGFudF9sZTE2X3RvX2NwdSh4KQorI2RlZmluZSBjb25zdF9sZTMyX3RvX2NwdSh4KQlfX2NvbnN0YW50X2xlMzJfdG9fY3B1KHgpCisjZGVmaW5lIGNvbnN0X2xlNjRfdG9fY3B1KHgpCV9fY29uc3RhbnRfbGU2NF90b19jcHUoeCkKKworI2RlZmluZSBjb25zdF9jcHVfdG9fbGUxNih4KQlfX2NvbnN0YW50X2NwdV90b19sZTE2KHgpCisjZGVmaW5lIGNvbnN0X2NwdV90b19sZTMyKHgpCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoeCkKKyNkZWZpbmUgY29uc3RfY3B1X3RvX2xlNjQoeCkJX19jb25zdGFudF9jcHVfdG9fbGU2NCh4KQorCisvKiBUaGUgTlRGUyBvZW1faWQgIk5URlMgICAgIiAqLworI2RlZmluZSBtYWdpY05URlMJY29uc3RfY3B1X3RvX2xlNjQoMHgyMDIwMjAyMDUzNDY1NDRlVUxMKQorCisvKgorICogTG9jYXRpb24gb2YgYm9vdHNlY3RvciBvbiBwYXJ0aXRpb246CisgKglUaGUgc3RhbmRhcmQgTlRGU19CT09UX1NFQ1RPUiBpcyBvbiBzZWN0b3IgMCBvZiB0aGUgcGFydGl0aW9uLgorICoJT24gTlQ0IGFuZCBhYm92ZSB0aGVyZSBpcyBvbmUgYmFja3VwIGNvcHkgb2YgdGhlIGJvb3Qgc2VjdG9yIHRvCisgKgliZSBmb3VuZCBvbiB0aGUgbGFzdCBzZWN0b3Igb2YgdGhlIHBhcnRpdGlvbiAobm90IG5vcm1hbGx5IGFjY2Vzc2libGUKKyAqCWZyb20gd2l0aGluIFdpbmRvd3MgYXMgdGhlIGJvb3RzZWN0b3IgY29udGFpbmVkIG51bWJlciBvZiBzZWN0b3JzCisgKgl2YWx1ZSBpcyBvbmUgbGVzcyB0aGFuIHRoZSBhY3R1YWwgdmFsdWUhKS4KKyAqCU9uIHZlcnNpb25zIG9mIE5UIDMuNTEgYW5kIGVhcmxpZXIsIHRoZSBiYWNrdXAgY29weSB3YXMgbG9jYXRlZCBhdAorICoJbnVtYmVyIG9mIHNlY3RvcnMvMiAoaW50ZWdlciBkaXZpZGUpLCBpLmUuIGluIHRoZSBtaWRkbGUgb2YgdGhlIHZvbHVtZS4KKyAqLworCisvKgorICogQklPUyBwYXJhbWV0ZXIgYmxvY2sgKGJwYikgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJbGUxNiBieXRlc19wZXJfc2VjdG9yOwkJLyogU2l6ZSBvZiBhIHNlY3RvciBpbiBieXRlcy4gKi8KKwl1OCAgc2VjdG9yc19wZXJfY2x1c3RlcjsJLyogU2l6ZSBvZiBhIGNsdXN0ZXIgaW4gc2VjdG9ycy4gKi8KKwlsZTE2IHJlc2VydmVkX3NlY3RvcnM7CQkvKiB6ZXJvICovCisJdTggIGZhdHM7CQkJLyogemVybyAqLworCWxlMTYgcm9vdF9lbnRyaWVzOwkJLyogemVybyAqLworCWxlMTYgc2VjdG9yczsJCQkvKiB6ZXJvICovCisJdTggIG1lZGlhX3R5cGU7CQkJLyogMHhmOCA9IGhhcmQgZGlzayAqLworCWxlMTYgc2VjdG9yc19wZXJfZmF0OwkJLyogemVybyAqLworCWxlMTYgc2VjdG9yc19wZXJfdHJhY2s7CQkvKiBpcnJlbGV2YW50ICovCisJbGUxNiBoZWFkczsJCQkvKiBpcnJlbGV2YW50ICovCisJbGUzMiBoaWRkZW5fc2VjdG9yczsJCS8qIHplcm8gKi8KKwlsZTMyIGxhcmdlX3NlY3RvcnM7CQkvKiB6ZXJvICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgQklPU19QQVJBTUVURVJfQkxPQ0s7CisKKy8qCisgKiBOVEZTIGJvb3Qgc2VjdG9yIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXU4ICBqdW1wWzNdOwkJCS8qIElycmVsZXZhbnQgKGp1bXAgdG8gYm9vdCB1cCBjb2RlKS4qLworCWxlNjQgb2VtX2lkOwkJCS8qIE1hZ2ljICJOVEZTICAgICIuICovCisJQklPU19QQVJBTUVURVJfQkxPQ0sgYnBiOwkvKiBTZWUgQklPU19QQVJBTUVURVJfQkxPQ0suICovCisJdTggIHVudXNlZFs0XTsJCQkvKiB6ZXJvLCBOVEZTIGRpc2tlZGl0LmV4ZSBzdGF0ZXMgdGhhdAorCQkJCQkgICB0aGlzIGlzIGFjdHVhbGx5OgorCQkJCQkJX191OCBwaHlzaWNhbF9kcml2ZTsJLy8gMHg4MAorCQkJCQkJX191OCBjdXJyZW50X2hlYWQ7CS8vIHplcm8KKwkJCQkJCV9fdTggZXh0ZW5kZWRfYm9vdF9zaWduYXR1cmU7CisJCQkJCQkJCQkvLyAweDgwCisJCQkJCQlfX3U4IHVudXNlZDsJCS8vIHplcm8KKwkJCQkJICovCisvKjB4MjgqL3NsZTY0IG51bWJlcl9vZl9zZWN0b3JzOwkvKiBOdW1iZXIgb2Ygc2VjdG9ycyBpbiB2b2x1bWUuIEdpdmVzCisJCQkJCSAgIG1heGltdW0gdm9sdW1lIHNpemUgb2YgMl42MyBzZWN0b3JzLgorCQkJCQkgICBBc3N1bWluZyBzdGFuZGFyZCBzZWN0b3Igc2l6ZSBvZiA1MTIKKwkJCQkJICAgYnl0ZXMsIHRoZSBtYXhpbXVtIGJ5dGUgc2l6ZSBpcworCQkJCQkgICBhcHByb3guIDQuN3gxMF4yMSBieXRlcy4gKC07ICovCisJc2xlNjQgbWZ0X2xjbjsJCQkvKiBDbHVzdGVyIGxvY2F0aW9uIG9mIG1mdCBkYXRhLiAqLworCXNsZTY0IG1mdG1pcnJfbGNuOwkJLyogQ2x1c3RlciBsb2NhdGlvbiBvZiBjb3B5IG9mIG1mdC4gKi8KKwlzOCAgY2x1c3RlcnNfcGVyX21mdF9yZWNvcmQ7CS8qIE1mdCByZWNvcmQgc2l6ZSBpbiBjbHVzdGVycy4gKi8KKwl1OCAgcmVzZXJ2ZWQwWzNdOwkJLyogemVybyAqLworCXM4ICBjbHVzdGVyc19wZXJfaW5kZXhfcmVjb3JkOwkvKiBJbmRleCBibG9jayBzaXplIGluIGNsdXN0ZXJzLiAqLworCXU4ICByZXNlcnZlZDFbM107CQkvKiB6ZXJvICovCisJbGU2NCB2b2x1bWVfc2VyaWFsX251bWJlcjsJLyogSXJyZWxldmFudCAoc2VyaWFsIG51bWJlcikuICovCisJbGUzMiBjaGVja3N1bTsJCQkvKiBCb290IHNlY3RvciBjaGVja3N1bS4gKi8KKy8qMHg1NCovdTggIGJvb3RzdHJhcFs0MjZdOwkJLyogSXJyZWxldmFudCAoYm9vdCB1cCBjb2RlKS4gKi8KKwlsZTE2IGVuZF9vZl9zZWN0b3JfbWFya2VyOwkvKiBFbmQgb2YgYm9vdHNlY3RvciBtYWdpYy4gQWx3YXlzIGlzCisJCQkJCSAgIDB4YWE1NSBpbiBsaXR0bGUgZW5kaWFuLiAqLworLyogc2l6ZW9mKCkgPSA1MTIgKDB4MjAwKSBieXRlcyAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIE5URlNfQk9PVF9TRUNUT1I7CisKKy8qCisgKiBNYWdpYyBpZGVudGlmaWVycyBwcmVzZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgYWxsIG50ZnMgcmVjb3JkIGNvbnRhaW5pbmcKKyAqIHJlY29yZHMgKGxpa2UgbWZ0IHJlY29yZHMgZm9yIGV4YW1wbGUpLgorICovCitlbnVtIHsKKwkvKiBGb3VuZCBpbiAkTUZULyREQVRBLiAqLworCW1hZ2ljX0ZJTEUgPSBjb25zdF9jcHVfdG9fbGUzMigweDQ1NGM0OTQ2KSwgLyogTWZ0IGVudHJ5LiAqLworCW1hZ2ljX0lORFggPSBjb25zdF9jcHVfdG9fbGUzMigweDU4NDQ0ZTQ5KSwgLyogSW5kZXggYnVmZmVyLiAqLworCW1hZ2ljX0hPTEUgPSBjb25zdF9jcHVfdG9fbGUzMigweDQ1NGM0ZjQ4KSwgLyogPyAoTlRGUyAzLjArPykgKi8KKworCS8qIEZvdW5kIGluICRMb2dGaWxlLyREQVRBLiAqLworCW1hZ2ljX1JTVFIgPSBjb25zdF9jcHVfdG9fbGUzMigweDUyNTQ1MzUyKSwgLyogUmVzdGFydCBwYWdlLiAqLworCW1hZ2ljX1JDUkQgPSBjb25zdF9jcHVfdG9fbGUzMigweDQ0NTI0MzUyKSwgLyogTG9nIHJlY29yZCBwYWdlLiAqLworCisJLyogRm91bmQgaW4gJExvZ0ZpbGUvJERBVEEuICAoTWF5IGJlIGZvdW5kIGluICRNRlQvJERBVEEsIGFsc28/KSAqLworCW1hZ2ljX0NIS0QgPSBjb25zdF9jcHVfdG9fbGUzMigweDQyNGI0ODQzKSwgLyogTW9kaWZpZWQgYnkgY2hrZHNrLiAqLworCisJLyogRm91bmQgaW4gYWxsIG50ZnMgcmVjb3JkIGNvbnRhaW5pbmcgcmVjb3Jkcy4gKi8KKwltYWdpY19CQUFEID0gY29uc3RfY3B1X3RvX2xlMzIoMHg0NDQxNDE0MiksIC8qIEZhaWxlZCBtdWx0aSBzZWN0b3IKKwkJCQkJCSAgICAgICB0cmFuc2ZlciB3YXMgZGV0ZWN0ZWQuICovCisJLyoKKwkgKiBGb3VuZCBpbiAkTG9nRmlsZS8kREFUQSB3aGVuIGEgcGFnZSBpcyBmdWxsIG9mIDB4ZmYgYnl0ZXMgYW5kIGlzCisJICogdGh1cyBub3QgaW5pdGlhbGl6ZWQuICBQYWdlIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzaW5nIGl0LgorCSAqLworCW1hZ2ljX2VtcHR5ID0gY29uc3RfY3B1X3RvX2xlMzIoMHhmZmZmZmZmZikgLyogUmVjb3JkIGlzIGVtcHR5LiAqLworfTsKKwordHlwZWRlZiBsZTMyIE5URlNfUkVDT1JEX1RZUEU7CisKKy8qCisgKiBHZW5lcmljIG1hZ2ljIGNvbXBhcmlzb24gbWFjcm9zLiBGaW5hbGx5IGZvdW5kIGEgdXNlIGZvciB0aGUgIyMgcHJlcHJvY2Vzc29yCisgKiBvcGVyYXRvciEgKC04CisgKi8KKworc3RhdGljIGlubGluZSBCT09MIF9fbnRmc19pc19tYWdpYyhsZTMyIHgsIE5URlNfUkVDT1JEX1RZUEUgcikKK3sKKwlyZXR1cm4gKHggPT0gcik7Cit9CisjZGVmaW5lIG50ZnNfaXNfbWFnaWMoeCwgbSkJX19udGZzX2lzX21hZ2ljKHgsIG1hZ2ljXyMjbSkKKworc3RhdGljIGlubGluZSBCT09MIF9fbnRmc19pc19tYWdpY3AobGUzMiAqcCwgTlRGU19SRUNPUkRfVFlQRSByKQoreworCXJldHVybiAoKnAgPT0gcik7Cit9CisjZGVmaW5lIG50ZnNfaXNfbWFnaWNwKHAsIG0pCV9fbnRmc19pc19tYWdpY3AocCwgbWFnaWNfIyNtKQorCisvKgorICogU3BlY2lhbGlzZWQgbWFnaWMgY29tcGFyaXNvbiBtYWNyb3MgZm9yIHRoZSBOVEZTX1JFQ09SRF9UWVBFcyBkZWZpbmVkIGFib3ZlLgorICovCisjZGVmaW5lIG50ZnNfaXNfZmlsZV9yZWNvcmQoeCkJCSggbnRmc19pc19tYWdpYyAoeCwgRklMRSkgKQorI2RlZmluZSBudGZzX2lzX2ZpbGVfcmVjb3JkcChwKQkJKCBudGZzX2lzX21hZ2ljcChwLCBGSUxFKSApCisjZGVmaW5lIG50ZnNfaXNfbWZ0X3JlY29yZCh4KQkJKCBudGZzX2lzX2ZpbGVfcmVjb3JkICh4KSApCisjZGVmaW5lIG50ZnNfaXNfbWZ0X3JlY29yZHAocCkJCSggbnRmc19pc19maWxlX3JlY29yZHAocCkgKQorI2RlZmluZSBudGZzX2lzX2luZHhfcmVjb3JkKHgpCQkoIG50ZnNfaXNfbWFnaWMgKHgsIElORFgpICkKKyNkZWZpbmUgbnRmc19pc19pbmR4X3JlY29yZHAocCkJCSggbnRmc19pc19tYWdpY3AocCwgSU5EWCkgKQorI2RlZmluZSBudGZzX2lzX2hvbGVfcmVjb3JkKHgpCQkoIG50ZnNfaXNfbWFnaWMgKHgsIEhPTEUpICkKKyNkZWZpbmUgbnRmc19pc19ob2xlX3JlY29yZHAocCkJCSggbnRmc19pc19tYWdpY3AocCwgSE9MRSkgKQorCisjZGVmaW5lIG50ZnNfaXNfcnN0cl9yZWNvcmQoeCkJCSggbnRmc19pc19tYWdpYyAoeCwgUlNUUikgKQorI2RlZmluZSBudGZzX2lzX3JzdHJfcmVjb3JkcChwKQkJKCBudGZzX2lzX21hZ2ljcChwLCBSU1RSKSApCisjZGVmaW5lIG50ZnNfaXNfcmNyZF9yZWNvcmQoeCkJCSggbnRmc19pc19tYWdpYyAoeCwgUkNSRCkgKQorI2RlZmluZSBudGZzX2lzX3JjcmRfcmVjb3JkcChwKQkJKCBudGZzX2lzX21hZ2ljcChwLCBSQ1JEKSApCisKKyNkZWZpbmUgbnRmc19pc19jaGtkX3JlY29yZCh4KQkJKCBudGZzX2lzX21hZ2ljICh4LCBDSEtEKSApCisjZGVmaW5lIG50ZnNfaXNfY2hrZF9yZWNvcmRwKHApCQkoIG50ZnNfaXNfbWFnaWNwKHAsIENIS0QpICkKKworI2RlZmluZSBudGZzX2lzX2JhYWRfcmVjb3JkKHgpCQkoIG50ZnNfaXNfbWFnaWMgKHgsIEJBQUQpICkKKyNkZWZpbmUgbnRmc19pc19iYWFkX3JlY29yZHAocCkJCSggbnRmc19pc19tYWdpY3AocCwgQkFBRCkgKQorCisjZGVmaW5lIG50ZnNfaXNfZW1wdHlfcmVjb3JkKHgpCQkoIG50ZnNfaXNfbWFnaWMgKHgsIGVtcHR5KSApCisjZGVmaW5lIG50ZnNfaXNfZW1wdHlfcmVjb3JkcChwKQkoIG50ZnNfaXNfbWFnaWNwKHAsIGVtcHR5KSApCisKKy8qCisgKiBUaGUgVXBkYXRlIFNlcXVlbmNlIEFycmF5ICh1c2EpIGlzIGFuIGFycmF5IG9mIHRoZSBsZTE2IHZhbHVlcyB3aGljaCBiZWxvbmcKKyAqIHRvIHRoZSBlbmQgb2YgZWFjaCBzZWN0b3IgcHJvdGVjdGVkIGJ5IHRoZSB1cGRhdGUgc2VxdWVuY2UgcmVjb3JkIGluIHdoaWNoCisgKiB0aGlzIGFycmF5IGlzIGNvbnRhaW5lZC4gTm90ZSB0aGF0IHRoZSBmaXJzdCBlbnRyeSBpcyB0aGUgVXBkYXRlIFNlcXVlbmNlCisgKiBOdW1iZXIgKHVzbiksIGEgY3ljbGljIGNvdW50ZXIgb2YgaG93IG1hbnkgdGltZXMgdGhlIHByb3RlY3RlZCByZWNvcmQgaGFzCisgKiBiZWVuIHdyaXR0ZW4gdG8gZGlzay4gVGhlIHZhbHVlcyAwIGFuZCAtMSAoaWUuIDB4ZmZmZikgYXJlIG5vdCB1c2VkLiBBbGwKKyAqIGxhc3QgbGUxNidzIG9mIGVhY2ggc2VjdG9yIGhhdmUgdG8gYmUgZXF1YWwgdG8gdGhlIHVzbiAoZHVyaW5nIHJlYWRpbmcpIG9yCisgKiBhcmUgc2V0IHRvIGl0IChkdXJpbmcgd3JpdGluZykuIElmIHRoZXkgYXJlIG5vdCwgYW4gaW5jb21wbGV0ZSBtdWx0aSBzZWN0b3IKKyAqIHRyYW5zZmVyIGhhcyBvY2N1cnJlZCB3aGVuIHRoZSBkYXRhIHdhcyB3cml0dGVuLgorICogVGhlIG1heGltdW0gc2l6ZSBmb3IgdGhlIHVwZGF0ZSBzZXF1ZW5jZSBhcnJheSBpcyBmaXhlZCB0bzoKKyAqCW1heGltdW0gc2l6ZSA9IHVzYV9vZnMgKyAodXNhX2NvdW50ICogMikgPSA1MTAgYnl0ZXMKKyAqIFRoZSA1MTAgYnl0ZXMgY29tZXMgZnJvbSB0aGUgZmFjdCB0aGF0IHRoZSBsYXN0IGxlMTYgaW4gdGhlIGFycmF5IGhhcyB0bworICogKG9idmlvdXNseSkgZmluaXNoIGJlZm9yZSB0aGUgbGFzdCBsZTE2IG9mIHRoZSBmaXJzdCA1MTItYnl0ZSBzZWN0b3IuCisgKiBUaGlzIGZvcm11bGEgY2FuIGJlIHVzZWQgYXMgYSBjb25zaXN0ZW5jeSBjaGVjayBpbiB0aGF0IHVzYV9vZnMgKworICogKHVzYV9jb3VudCAqIDIpIGhhcyB0byBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gNTEwLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJTlRGU19SRUNPUkRfVFlQRSBtYWdpYzsJLyogQSBmb3VyLWJ5dGUgbWFnaWMgaWRlbnRpZnlpbmcgdGhlIHJlY29yZAorCQkJCSAgIHR5cGUgYW5kL29yIHN0YXR1cy4gKi8KKwlsZTE2IHVzYV9vZnM7CQkvKiBPZmZzZXQgdG8gdGhlIFVwZGF0ZSBTZXF1ZW5jZSBBcnJheSAodXNhKQorCQkJCSAgIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBudGZzIHJlY29yZC4gKi8KKwlsZTE2IHVzYV9jb3VudDsJCS8qIE51bWJlciBvZiBsZTE2IHNpemVkIGVudHJpZXMgaW4gdGhlIHVzYQorCQkJCSAgIGluY2x1ZGluZyB0aGUgVXBkYXRlIFNlcXVlbmNlIE51bWJlciAodXNuKSwKKwkJCQkgICB0aHVzIHRoZSBudW1iZXIgb2YgZml4dXBzIGlzIHRoZSB1c2FfY291bnQKKwkJCQkgICBtaW51cyAxLiAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIE5URlNfUkVDT1JEOworCisvKgorICogU3lzdGVtIGZpbGVzIG1mdCByZWNvcmQgbnVtYmVycy4gQWxsIHRoZXNlIGZpbGVzIGFyZSBhbHdheXMgbWFya2VkIGFzIHVzZWQKKyAqIGluIHRoZSBiaXRtYXAgYXR0cmlidXRlIG9mIHRoZSBtZnQ7IHByZXN1bWFibHkgaW4gb3JkZXIgdG8gYXZvaWQgYWNjaWRlbnRhbAorICogYWxsb2NhdGlvbiBmb3IgcmFuZG9tIG90aGVyIG1mdCByZWNvcmRzLiBBbHNvLCB0aGUgc2VxdWVuY2UgbnVtYmVyIGZvciBlYWNoCisgKiBvZiB0aGUgc3lzdGVtIGZpbGVzIGlzIGFsd2F5cyBlcXVhbCB0byB0aGVpciBtZnQgcmVjb3JkIG51bWJlciBhbmQgaXQgaXMKKyAqIG5ldmVyIG1vZGlmaWVkLgorICovCit0eXBlZGVmIGVudW0geworCUZJTEVfTUZUICAgICAgID0gMCwJLyogTWFzdGVyIGZpbGUgdGFibGUgKG1mdCkuIERhdGEgYXR0cmlidXRlCisJCQkJICAgY29udGFpbnMgdGhlIGVudHJpZXMgYW5kIGJpdG1hcCBhdHRyaWJ1dGUKKwkJCQkgICByZWNvcmRzIHdoaWNoIG9uZXMgYXJlIGluIHVzZSAoYml0PT0xKS4gKi8KKwlGSUxFX01GVE1pcnIgICA9IDEsCS8qIE1mdCBtaXJyb3I6IGNvcHkgb2YgZmlyc3QgZm91ciBtZnQgcmVjb3JkcworCQkJCSAgIGluIGRhdGEgYXR0cmlidXRlLiBJZiBjbHVzdGVyIHNpemUgPiA0a2lCLAorCQkJCSAgIGNvcHkgb2YgZmlyc3QgTiBtZnQgcmVjb3Jkcywgd2l0aAorCQkJCQlOID0gY2x1c3Rlcl9zaXplIC8gbWZ0X3JlY29yZF9zaXplLiAqLworCUZJTEVfTG9nRmlsZSAgID0gMiwJLyogSm91cm5hbGxpbmcgbG9nIGluIGRhdGEgYXR0cmlidXRlLiAqLworCUZJTEVfVm9sdW1lICAgID0gMywJLyogVm9sdW1lIG5hbWUgYXR0cmlidXRlIGFuZCB2b2x1bWUgaW5mb3JtYXRpb24KKwkJCQkgICBhdHRyaWJ1dGUgKGZsYWdzIGFuZCBudGZzIHZlcnNpb24pLiBXaW5kb3dzCisJCQkJICAgcmVmZXJzIHRvIHRoaXMgZmlsZSBhcyB2b2x1bWUgREFTRCAoRGlyZWN0CisJCQkJICAgQWNjZXNzIFN0b3JhZ2UgRGV2aWNlKS4gKi8KKwlGSUxFX0F0dHJEZWYgICA9IDQsCS8qIEFycmF5IG9mIGF0dHJpYnV0ZSBkZWZpbml0aW9ucyBpbiBkYXRhCisJCQkJICAgYXR0cmlidXRlLiAqLworCUZJTEVfcm9vdCAgICAgID0gNSwJLyogUm9vdCBkaXJlY3RvcnkuICovCisJRklMRV9CaXRtYXAgICAgPSA2LAkvKiBBbGxvY2F0aW9uIGJpdG1hcCBvZiBhbGwgY2x1c3RlcnMgKGxjbnMpIGluCisJCQkJICAgZGF0YSBhdHRyaWJ1dGUuICovCisJRklMRV9Cb290ICAgICAgPSA3LAkvKiBCb290IHNlY3RvciAoYWx3YXlzIGF0IGNsdXN0ZXIgMCkgaW4gZGF0YQorCQkJCSAgIGF0dHJpYnV0ZS4gKi8KKwlGSUxFX0JhZENsdXMgICA9IDgsCS8qIENvbnRhaW5zIGFsbCBiYWQgY2x1c3RlcnMgaW4gdGhlIG5vbi1yZXNpZGVudAorCQkJCSAgIGRhdGEgYXR0cmlidXRlLiAqLworCUZJTEVfU2VjdXJlICAgID0gOSwJLyogU2hhcmVkIHNlY3VyaXR5IGRlc2NyaXB0b3JzIGluIGRhdGEgYXR0cmlidXRlCisJCQkJICAgYW5kIHR3byBpbmRleGVzIGludG8gdGhlIGRlc2NyaXB0b3JzLgorCQkJCSAgIEFwcGVhcmVkIGluIFdpbmRvd3MgMjAwMC4gQmVmb3JlIHRoYXQsIHRoaXMKKwkJCQkgICBmaWxlIHdhcyBuYW1lZCAkUXVvdGEgYnV0IHdhcyB1bnVzZWQuICovCisJRklMRV9VcENhc2UgICAgPSAxMCwJLyogVXBwZXJjYXNlIGVxdWl2YWxlbnRzIG9mIGFsbCA2NTUzNiBVbmljb2RlCisJCQkJICAgY2hhcmFjdGVycyBpbiBkYXRhIGF0dHJpYnV0ZS4gKi8KKwlGSUxFX0V4dGVuZCAgICA9IDExLAkvKiBEaXJlY3RvcnkgY29udGFpbmluZyBvdGhlciBzeXN0ZW0gZmlsZXMgKGVnLgorCQkJCSAgICRPYmpJZCwgJFF1b3RhLCAkUmVwYXJzZSBhbmQgJFVzbkpybmwpLiBUaGlzCisJCQkJICAgaXMgbmV3IHRvIE5URlMzLjAuICovCisJRklMRV9yZXNlcnZlZDEyID0gMTIsCS8qIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlIChyZWNvcmRzIDEyLTE1KS4gKi8KKwlGSUxFX3Jlc2VydmVkMTMgPSAxMywKKwlGSUxFX3Jlc2VydmVkMTQgPSAxNCwKKwlGSUxFX3Jlc2VydmVkMTUgPSAxNSwKKwlGSUxFX2ZpcnN0X3VzZXIgPSAxNiwJLyogRmlyc3QgdXNlciBmaWxlLCB1c2VkIGFzIHRlc3QgbGltaXQgZm9yCisJCQkJICAgd2hldGhlciB0byBhbGxvdyBvcGVuaW5nIGEgZmlsZSBvciBub3QuICovCit9IE5URlNfU1lTVEVNX0ZJTEVTOworCisvKgorICogVGhlc2UgYXJlIHRoZSBzbyBmYXIga25vd24gTUZUX1JFQ09SRF8qIGZsYWdzICgxNi1iaXQpIHdoaWNoIGNvbnRhaW4KKyAqIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtZnQgcmVjb3JkIGluIHdoaWNoIHRoZXkgYXJlIHByZXNlbnQuCisgKi8KK2VudW0geworCU1GVF9SRUNPUkRfSU5fVVNFCT0gY29uc3RfY3B1X3RvX2xlMTYoMHgwMDAxKSwKKwlNRlRfUkVDT1JEX0lTX0RJUkVDVE9SWSA9IGNvbnN0X2NwdV90b19sZTE2KDB4MDAwMiksCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3R5cGVkZWYgbGUxNiBNRlRfUkVDT1JEX0ZMQUdTOworCisvKgorICogbWZ0IHJlZmVyZW5jZXMgKGFrYSBmaWxlIHJlZmVyZW5jZXMgb3IgZmlsZSByZWNvcmQgc2VnbWVudCByZWZlcmVuY2VzKSBhcmUKKyAqIHVzZWQgd2hlbmV2ZXIgYSBzdHJ1Y3R1cmUgbmVlZHMgdG8gcmVmZXIgdG8gYSByZWNvcmQgaW4gdGhlIG1mdC4KKyAqCisgKiBBIHJlZmVyZW5jZSBjb25zaXN0cyBvZiBhIDQ4LWJpdCBpbmRleCBpbnRvIHRoZSBtZnQgYW5kIGEgMTYtYml0IHNlcXVlbmNlCisgKiBudW1iZXIgdXNlZCB0byBkZXRlY3Qgc3RhbGUgcmVmZXJlbmNlcy4KKyAqCisgKiBGb3IgZXJyb3IgcmVwb3J0aW5nIHB1cnBvc2VzIHdlIHRyZWF0IHRoZSA0OC1iaXQgaW5kZXggYXMgYSBzaWduZWQgcXVhbnRpdHkuCisgKgorICogVGhlIHNlcXVlbmNlIG51bWJlciBpcyBhIGNpcmN1bGFyIGNvdW50ZXIgKHNraXBwaW5nIDApIGRlc2NyaWJpbmcgaG93IG1hbnkKKyAqIHRpbWVzIHRoZSByZWZlcmVuY2VkIG1mdCByZWNvcmQgaGFzIGJlZW4gKHJlKXVzZWQuIFRoaXMgaGFzIHRvIG1hdGNoIHRoZQorICogc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBtZnQgcmVjb3JkIGJlaW5nIHJlZmVyZW5jZWQsIG90aGVyd2lzZSB0aGUgcmVmZXJlbmNlCisgKiBpcyBjb25zaWRlcmVkIHN0YWxlIGFuZCByZW1vdmVkIChGSVhNRTogb25seSBudGZzY2sgb3IgdGhlIGRyaXZlciBpdHNlbGY/KS4KKyAqCisgKiBJZiB0aGUgc2VxdWVuY2UgbnVtYmVyIGlzIHplcm8gaXQgaXMgYXNzdW1lZCB0aGF0IG5vIHNlcXVlbmNlIG51bWJlcgorICogY29uc2lzdGVuY3kgY2hlY2tpbmcgc2hvdWxkIGJlIHBlcmZvcm1lZC4KKyAqCisgKiBGSVhNRTogU2luY2UgaW5vZGVzIGFyZSAzMi1iaXQgYXMgb2Ygbm93LCB0aGUgZHJpdmVyIG5lZWRzIHRvIGFsd2F5cyBjaGVjaworICogZm9yIGhpZ2hfcGFydCBiZWluZyAwIGFuZCBpZiBub3QgZWl0aGVyIEJVRygpLCBjYXVzZSBhIHBhbmljKCkgb3IgaGFuZGxlCisgKiB0aGUgc2l0dWF0aW9uIGluIHNvbWUgb3RoZXIgd2F5LiBUaGlzIHNob3VsZG4ndCBiZSBhIHByb2JsZW0gYXMgYSB2b2x1bWUgaGFzCisgKiB0byBiZWNvbWUgSFVHRSBpbiBvcmRlciB0byBuZWVkIG1vcmUgdGhhbiAzMi1iaXRzIHdvcnRoIG9mIG1mdCByZWNvcmRzLgorICogQXNzdW1pbmcgdGhlIHN0YW5kYXJkIG1mdCByZWNvcmQgc2l6ZSBvZiAxa2Igb25seSB0aGUgcmVjb3JkcyAobmV2ZXIgbWluZAorICogdGhlIG5vbi1yZXNpZGVudCBhdHRyaWJ1dGVzLCBldGMuKSB3b3VsZCByZXF1aXJlIDRUYiBvZiBzcGFjZSBvbiB0aGVpciBvd24KKyAqIGZvciB0aGUgZmlyc3QgMzIgYml0cyB3b3J0aCBvZiByZWNvcmRzLiBUaGlzIGlzIG9ubHkgaWYgc29tZSBzdHJhbmdlIHBlcnNvbgorICogZG9lc24ndCBkZWNpZGUgdG8gZm91bCBwbGF5IGFuZCBtYWtlIHRoZSBtZnQgc3BhcnNlIHdoaWNoIHdvdWxkIGJlIGEgcmVhbGx5CisgKiBob3JyaWJsZSB0aGluZyB0byBkbyBhcyBpdCB3b3VsZCB0cmFzaCBvdXIgY3VycmVudCBkcml2ZXIgaW1wbGVtZW50YXRpb24uICktOgorICogRG8gSSBoZWFyIHNjcmVhbXMgIndlIHdhbnQgNjQtYml0IGlub2RlcyEiID8hPyAoLTsKKyAqCisgKiBGSVhNRTogVGhlIG1mdCB6b25lIGlzIGRlZmluZWQgYXMgdGhlIGZpcnN0IDEyJSBvZiB0aGUgdm9sdW1lLiBUaGlzIHNwYWNlIGlzCisgKiByZXNlcnZlZCBzbyB0aGF0IHRoZSBtZnQgY2FuIGdyb3cgY29udGlndW91c2x5IGFuZCBoZW5jZSBkb2Vzbid0IGJlY29tZQorICogZnJhZ21lbnRlZC4gVm9sdW1lIGZyZWUgc3BhY2UgaW5jbHVkZXMgdGhlIGVtcHR5IHBhcnQgb2YgdGhlIG1mdCB6b25lIGFuZAorICogd2hlbiB0aGUgdm9sdW1lJ3MgZnJlZSA4OCUgYXJlIHVzZWQgdXAsIHRoZSBtZnQgem9uZSBpcyBzaHJ1bmsgYnkgYSBmYWN0b3IKKyAqIG9mIDIsIHRodXMgbWFraW5nIG1vcmUgc3BhY2UgYXZhaWxhYmxlIGZvciBtb3JlIGZpbGVzL2RhdGEuIFRoaXMgcHJvY2VzcyBpcworICogcmVwZWF0ZWQgZXZlcnl0aW1lIHRoZXJlIGlzIG5vIG1vcmUgZnJlZSBzcGFjZSBleGNlcHQgZm9yIHRoZSBtZnQgem9uZSB1bnRpbAorICogdGhlcmUgcmVhbGx5IGlzIG5vIG1vcmUgZnJlZSBzcGFjZS4KKyAqLworCisvKgorICogVHlwZWRlZiB0aGUgTUZUX1JFRiBhcyBhIDY0LWJpdCB2YWx1ZSBmb3IgZWFzaWVyIGhhbmRsaW5nLgorICogQWxzbyBkZWZpbmUgdHdvIHVucGFja2luZyBtYWNyb3MgdG8gZ2V0IHRvIHRoZSByZWZlcmVuY2UgKE1SRUYpIGFuZAorICogc2VxdWVuY2UgbnVtYmVyIChNU0VRTk8pIHJlc3BlY3RpdmVseS4KKyAqIFRoZSBfTEUgdmVyc2lvbnMgYXJlIHRvIGJlIGFwcGxpZWQgb24gbGl0dGxlIGVuZGlhbiBNRlRfUkVGcy4KKyAqIE5vdGU6IFRoZSBfTEUgdmVyc2lvbnMgd2lsbCByZXR1cm4gYSBDUFUgZW5kaWFuIGZvcm1hdHRlZCB2YWx1ZSEKKyAqLwordHlwZWRlZiBlbnVtIHsKKwlNRlRfUkVGX01BU0tfQ1BVCT0gMHgwMDAwZmZmZmZmZmZmZmZmVUxMLAorCU1GVF9SRUZfTUFTS19MRQkJPSBjb25zdF9jcHVfdG9fbGU2NCgweDAwMDBmZmZmZmZmZmZmZmZVTEwpLAorfSBNRlRfUkVGX0NPTlNUUzsKKwordHlwZWRlZiB1NjQgTUZUX1JFRjsKK3R5cGVkZWYgbGU2NCBsZU1GVF9SRUY7CisKKyNkZWZpbmUgTUtfTVJFRihtLCBzKQkoKE1GVF9SRUYpKCgoTUZUX1JFRikocykgPDwgNDgpIHwJCVwKKwkJCQkJKChNRlRfUkVGKShtKSAmIE1GVF9SRUZfTUFTS19DUFUpKSkKKyNkZWZpbmUgTUtfTEVfTVJFRihtLCBzKSBjcHVfdG9fbGU2NChNS19NUkVGKG0sIHMpKQorCisjZGVmaW5lIE1SRUYoeCkJCSgodW5zaWduZWQgbG9uZykoKHgpICYgTUZUX1JFRl9NQVNLX0NQVSkpCisjZGVmaW5lIE1TRVFOTyh4KQkoKHUxNikoKCh4KSA+PiA0OCkgJiAweGZmZmYpKQorI2RlZmluZSBNUkVGX0xFKHgpCSgodW5zaWduZWQgbG9uZykobGU2NF90b19jcHUoeCkgJiBNRlRfUkVGX01BU0tfQ1BVKSkKKyNkZWZpbmUgTVNFUU5PX0xFKHgpCSgodTE2KSgobGU2NF90b19jcHUoeCkgPj4gNDgpICYgMHhmZmZmKSkKKworI2RlZmluZSBJU19FUlJfTVJFRih4KQkoKCh4KSAmIDB4MDAwMDgwMDAwMDAwMDAwMFVMTCkgPyAxIDogMCkKKyNkZWZpbmUgRVJSX01SRUYoeCkJKCh1NjQpKChzNjQpKHgpKSkKKyNkZWZpbmUgTVJFRl9FUlIoeCkJKChpbnQpKChzNjQpKHgpKSkKKworLyoKKyAqIFRoZSBtZnQgcmVjb3JkIGhlYWRlciBwcmVzZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgZXZlcnkgcmVjb3JkIGluIHRoZSBtZnQuCisgKiBUaGlzIGlzIGZvbGxvd2VkIGJ5IGEgc2VxdWVuY2Ugb2YgdmFyaWFibGUgbGVuZ3RoIGF0dHJpYnV0ZSByZWNvcmRzIHdoaWNoCisgKiBpcyB0ZXJtaW5hdGVkIGJ5IGFuIGF0dHJpYnV0ZSBvZiB0eXBlIEFUX0VORCB3aGljaCBpcyBhIHRydW5jYXRlZCBhdHRyaWJ1dGUKKyAqIGluIHRoYXQgaXQgb25seSBjb25zaXN0cyBvZiB0aGUgYXR0cmlidXRlIHR5cGUgY29kZSBBVF9FTkQgYW5kIG5vbmUgb2YgdGhlCisgKiBvdGhlciBtZW1iZXJzIG9mIHRoZSBhdHRyaWJ1dGUgc3RydWN0dXJlIGFyZSBwcmVzZW50LgorICovCit0eXBlZGVmIHN0cnVjdCB7CisvKk9mcyovCisvKiAgMAlOVEZTX1JFQ09SRDsgLS0gVW5mb2xkZWQgaGVyZSBhcyBnY2MgZG9lc24ndCBsaWtlIHVubmFtZWQgc3RydWN0cy4gKi8KKwlOVEZTX1JFQ09SRF9UWVBFIG1hZ2ljOwkvKiBVc3VhbGx5IHRoZSBtYWdpYyBpcyAiRklMRSIuICovCisJbGUxNiB1c2Ffb2ZzOwkJLyogU2VlIE5URlNfUkVDT1JEIGRlZmluaXRpb24gYWJvdmUuICovCisJbGUxNiB1c2FfY291bnQ7CQkvKiBTZWUgTlRGU19SRUNPUkQgZGVmaW5pdGlvbiBhYm92ZS4gKi8KKworLyogIDgqLwlsZTY0IGxzbjsJCS8qICRMb2dGaWxlIHNlcXVlbmNlIG51bWJlciBmb3IgdGhpcyByZWNvcmQuCisJCQkJICAgQ2hhbmdlZCBldmVyeSB0aW1lIHRoZSByZWNvcmQgaXMgbW9kaWZpZWQuICovCisvKiAxNiovCWxlMTYgc2VxdWVuY2VfbnVtYmVyOwkvKiBOdW1iZXIgb2YgdGltZXMgdGhpcyBtZnQgcmVjb3JkIGhhcyBiZWVuCisJCQkJICAgcmV1c2VkLiAoU2VlIGRlc2NyaXB0aW9uIGZvciBNRlRfUkVGCisJCQkJICAgYWJvdmUuKSBOT1RFOiBUaGUgaW5jcmVtZW50IChza2lwcGluZyB6ZXJvKQorCQkJCSAgIGlzIGRvbmUgd2hlbiB0aGUgZmlsZSBpcyBkZWxldGVkLiBOT1RFOiBJZgorCQkJCSAgIHRoaXMgaXMgemVybyBpdCBpcyBsZWZ0IHplcm8uICovCisvKiAxOCovCWxlMTYgbGlua19jb3VudDsJLyogTnVtYmVyIG9mIGhhcmQgbGlua3MsIGkuZS4gdGhlIG51bWJlciBvZgorCQkJCSAgIGRpcmVjdG9yeSBlbnRyaWVzIHJlZmVyZW5jaW5nIHRoaXMgcmVjb3JkLgorCQkJCSAgIE5PVEU6IE9ubHkgdXNlZCBpbiBtZnQgYmFzZSByZWNvcmRzLgorCQkJCSAgIE5PVEU6IFdoZW4gZGVsZXRpbmcgYSBkaXJlY3RvcnkgZW50cnkgd2UKKwkJCQkgICBjaGVjayB0aGUgbGlua19jb3VudCBhbmQgaWYgaXQgaXMgMSB3ZQorCQkJCSAgIGRlbGV0ZSB0aGUgZmlsZS4gT3RoZXJ3aXNlIHdlIGRlbGV0ZSB0aGUKKwkJCQkgICBGSUxFX05BTUVfQVRUUiBiZWluZyByZWZlcmVuY2VkIGJ5IHRoZQorCQkJCSAgIGRpcmVjdG9yeSBlbnRyeSBmcm9tIHRoZSBtZnQgcmVjb3JkIGFuZAorCQkJCSAgIGRlY3JlbWVudCB0aGUgbGlua19jb3VudC4KKwkJCQkgICBGSVhNRTogQ2FyZWZ1bCB3aXRoIFdpbjMyICsgRE9TIG5hbWVzISAqLworLyogMjAqLwlsZTE2IGF0dHJzX29mZnNldDsJLyogQnl0ZSBvZmZzZXQgdG8gdGhlIGZpcnN0IGF0dHJpYnV0ZSBpbiB0aGlzCisJCQkJICAgbWZ0IHJlY29yZCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgbWZ0IHJlY29yZC4KKwkJCQkgICBOT1RFOiBNdXN0IGJlIGFsaWduZWQgdG8gOC1ieXRlIGJvdW5kYXJ5LiAqLworLyogMjIqLwlNRlRfUkVDT1JEX0ZMQUdTIGZsYWdzOwkvKiBCaXQgYXJyYXkgb2YgTUZUX1JFQ09SRF9GTEFHUy4gV2hlbiBhIGZpbGUKKwkJCQkgICBpcyBkZWxldGVkLCB0aGUgTUZUX1JFQ09SRF9JTl9VU0UgZmxhZyBpcworCQkJCSAgIHNldCB0byB6ZXJvLiAqLworLyogMjQqLwlsZTMyIGJ5dGVzX2luX3VzZTsJLyogTnVtYmVyIG9mIGJ5dGVzIHVzZWQgaW4gdGhpcyBtZnQgcmVjb3JkLgorCQkJCSAgIE5PVEU6IE11c3QgYmUgYWxpZ25lZCB0byA4LWJ5dGUgYm91bmRhcnkuICovCisvKiAyOCovCWxlMzIgYnl0ZXNfYWxsb2NhdGVkOwkvKiBOdW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkIGZvciB0aGlzIG1mdAorCQkJCSAgIHJlY29yZC4gVGhpcyBzaG91bGQgYmUgZXF1YWwgdG8gdGhlIG1mdAorCQkJCSAgIHJlY29yZCBzaXplLiAqLworLyogMzIqLwlsZU1GVF9SRUYgYmFzZV9tZnRfcmVjb3JkOy8qIFRoaXMgaXMgemVybyBmb3IgYmFzZSBtZnQgcmVjb3Jkcy4KKwkJCQkgICBXaGVuIGl0IGlzIG5vdCB6ZXJvIGl0IGlzIGEgbWZ0IHJlZmVyZW5jZQorCQkJCSAgIHBvaW50aW5nIHRvIHRoZSBiYXNlIG1mdCByZWNvcmQgdG8gd2hpY2gKKwkJCQkgICB0aGlzIHJlY29yZCBiZWxvbmdzICh0aGlzIGlzIHRoZW4gdXNlZCB0bworCQkJCSAgIGxvY2F0ZSB0aGUgYXR0cmlidXRlIGxpc3QgYXR0cmlidXRlIHByZXNlbnQKKwkJCQkgICBpbiB0aGUgYmFzZSByZWNvcmQgd2hpY2ggZGVzY3JpYmVzIHRoaXMKKwkJCQkgICBleHRlbnNpb24gcmVjb3JkIGFuZCBoZW5jZSBtaWdodCBuZWVkCisJCQkJICAgbW9kaWZpY2F0aW9uIHdoZW4gdGhlIGV4dGVuc2lvbiByZWNvcmQKKwkJCQkgICBpdHNlbGYgaXMgbW9kaWZpZWQsIGFsc28gbG9jYXRpbmcgdGhlCisJCQkJICAgYXR0cmlidXRlIGxpc3QgYWxzbyBtZWFucyBmaW5kaW5nIHRoZSBvdGhlcgorCQkJCSAgIHBvdGVudGlhbCBleHRlbnRzLCBiZWxvbmdpbmcgdG8gdGhlIG5vbi1iYXNlCisJCQkJICAgbWZ0IHJlY29yZCkuICovCisvKiA0MCovCWxlMTYgbmV4dF9hdHRyX2luc3RhbmNlOy8qIFRoZSBpbnN0YW5jZSBudW1iZXIgdGhhdCB3aWxsIGJlIGFzc2lnbmVkIHRvCisJCQkJICAgdGhlIG5leHQgYXR0cmlidXRlIGFkZGVkIHRvIHRoaXMgbWZ0IHJlY29yZC4KKwkJCQkgICBOT1RFOiBJbmNyZW1lbnRlZCBlYWNoIHRpbWUgYWZ0ZXIgaXQgaXMgdXNlZC4KKwkJCQkgICBOT1RFOiBFdmVyeSB0aW1lIHRoZSBtZnQgcmVjb3JkIGlzIHJldXNlZAorCQkJCSAgIHRoaXMgbnVtYmVyIGlzIHNldCB0byB6ZXJvLiAgTk9URTogVGhlIGZpcnN0CisJCQkJICAgaW5zdGFuY2UgbnVtYmVyIGlzIGFsd2F5cyAwLiAqLworLyogVGhlIGJlbG93IGZpZWxkcyBhcmUgc3BlY2lmaWMgdG8gTlRGUyAzLjErIChXaW5kb3dzIFhQIGFuZCBhYm92ZSk6ICovCisvKiA0MiovIGxlMTYgcmVzZXJ2ZWQ7CQkvKiBSZXNlcnZlZC9hbGlnbm1lbnQuICovCisvKiA0NCovIGxlMzIgbWZ0X3JlY29yZF9udW1iZXI7CS8qIE51bWJlciBvZiB0aGlzIG1mdCByZWNvcmQuICovCisvKiBzaXplb2YoKSA9IDQ4IGJ5dGVzICovCisvKgorICogV2hlbiAocmUpdXNpbmcgdGhlIG1mdCByZWNvcmQsIHdlIHBsYWNlIHRoZSB1cGRhdGUgc2VxdWVuY2UgYXJyYXkgYXQgdGhpcworICogb2Zmc2V0LCBpLmUuIGJlZm9yZSB3ZSBzdGFydCB3aXRoIHRoZSBhdHRyaWJ1dGVzLiAgVGhpcyBhbHNvIG1ha2VzIHNlbnNlLAorICogb3RoZXJ3aXNlIHdlIGNvdWxkIHJ1biBpbnRvIHByb2JsZW1zIHdpdGggdGhlIHVwZGF0ZSBzZXF1ZW5jZSBhcnJheQorICogY29udGFpbmluZyBpbiBpdHNlbGYgdGhlIGxhc3QgdHdvIGJ5dGVzIG9mIGEgc2VjdG9yIHdoaWNoIHdvdWxkIG1lYW4gdGhhdAorICogbXVsdGkgc2VjdG9yIHRyYW5zZmVyIHByb3RlY3Rpb24gd291bGRuJ3Qgd29yay4gIEFzIHlvdSBjYW4ndCBwcm90ZWN0IGRhdGEKKyAqIGJ5IG92ZXJ3cml0aW5nIGl0IHNpbmNlIHlvdSB0aGVuIGNhbid0IGdldCBpdCBiYWNrLi4uCisgKiBXaGVuIHJlYWRpbmcgd2Ugb2J2aW91c2x5IHVzZSB0aGUgZGF0YSBmcm9tIHRoZSBudGZzIHJlY29yZCBoZWFkZXIuCisgKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBNRlRfUkVDT1JEOworCisvKiBUaGlzIGlzIHRoZSB2ZXJzaW9uIHdpdGhvdXQgdGhlIE5URlMgMy4xKyBzcGVjaWZpYyBmaWVsZHMuICovCit0eXBlZGVmIHN0cnVjdCB7CisvKk9mcyovCisvKiAgMAlOVEZTX1JFQ09SRDsgLS0gVW5mb2xkZWQgaGVyZSBhcyBnY2MgZG9lc24ndCBsaWtlIHVubmFtZWQgc3RydWN0cy4gKi8KKwlOVEZTX1JFQ09SRF9UWVBFIG1hZ2ljOwkvKiBVc3VhbGx5IHRoZSBtYWdpYyBpcyAiRklMRSIuICovCisJbGUxNiB1c2Ffb2ZzOwkJLyogU2VlIE5URlNfUkVDT1JEIGRlZmluaXRpb24gYWJvdmUuICovCisJbGUxNiB1c2FfY291bnQ7CQkvKiBTZWUgTlRGU19SRUNPUkQgZGVmaW5pdGlvbiBhYm92ZS4gKi8KKworLyogIDgqLwlsZTY0IGxzbjsJCS8qICRMb2dGaWxlIHNlcXVlbmNlIG51bWJlciBmb3IgdGhpcyByZWNvcmQuCisJCQkJICAgQ2hhbmdlZCBldmVyeSB0aW1lIHRoZSByZWNvcmQgaXMgbW9kaWZpZWQuICovCisvKiAxNiovCWxlMTYgc2VxdWVuY2VfbnVtYmVyOwkvKiBOdW1iZXIgb2YgdGltZXMgdGhpcyBtZnQgcmVjb3JkIGhhcyBiZWVuCisJCQkJICAgcmV1c2VkLiAoU2VlIGRlc2NyaXB0aW9uIGZvciBNRlRfUkVGCisJCQkJICAgYWJvdmUuKSBOT1RFOiBUaGUgaW5jcmVtZW50IChza2lwcGluZyB6ZXJvKQorCQkJCSAgIGlzIGRvbmUgd2hlbiB0aGUgZmlsZSBpcyBkZWxldGVkLiBOT1RFOiBJZgorCQkJCSAgIHRoaXMgaXMgemVybyBpdCBpcyBsZWZ0IHplcm8uICovCisvKiAxOCovCWxlMTYgbGlua19jb3VudDsJLyogTnVtYmVyIG9mIGhhcmQgbGlua3MsIGkuZS4gdGhlIG51bWJlciBvZgorCQkJCSAgIGRpcmVjdG9yeSBlbnRyaWVzIHJlZmVyZW5jaW5nIHRoaXMgcmVjb3JkLgorCQkJCSAgIE5PVEU6IE9ubHkgdXNlZCBpbiBtZnQgYmFzZSByZWNvcmRzLgorCQkJCSAgIE5PVEU6IFdoZW4gZGVsZXRpbmcgYSBkaXJlY3RvcnkgZW50cnkgd2UKKwkJCQkgICBjaGVjayB0aGUgbGlua19jb3VudCBhbmQgaWYgaXQgaXMgMSB3ZQorCQkJCSAgIGRlbGV0ZSB0aGUgZmlsZS4gT3RoZXJ3aXNlIHdlIGRlbGV0ZSB0aGUKKwkJCQkgICBGSUxFX05BTUVfQVRUUiBiZWluZyByZWZlcmVuY2VkIGJ5IHRoZQorCQkJCSAgIGRpcmVjdG9yeSBlbnRyeSBmcm9tIHRoZSBtZnQgcmVjb3JkIGFuZAorCQkJCSAgIGRlY3JlbWVudCB0aGUgbGlua19jb3VudC4KKwkJCQkgICBGSVhNRTogQ2FyZWZ1bCB3aXRoIFdpbjMyICsgRE9TIG5hbWVzISAqLworLyogMjAqLwlsZTE2IGF0dHJzX29mZnNldDsJLyogQnl0ZSBvZmZzZXQgdG8gdGhlIGZpcnN0IGF0dHJpYnV0ZSBpbiB0aGlzCisJCQkJICAgbWZ0IHJlY29yZCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgbWZ0IHJlY29yZC4KKwkJCQkgICBOT1RFOiBNdXN0IGJlIGFsaWduZWQgdG8gOC1ieXRlIGJvdW5kYXJ5LiAqLworLyogMjIqLwlNRlRfUkVDT1JEX0ZMQUdTIGZsYWdzOwkvKiBCaXQgYXJyYXkgb2YgTUZUX1JFQ09SRF9GTEFHUy4gV2hlbiBhIGZpbGUKKwkJCQkgICBpcyBkZWxldGVkLCB0aGUgTUZUX1JFQ09SRF9JTl9VU0UgZmxhZyBpcworCQkJCSAgIHNldCB0byB6ZXJvLiAqLworLyogMjQqLwlsZTMyIGJ5dGVzX2luX3VzZTsJLyogTnVtYmVyIG9mIGJ5dGVzIHVzZWQgaW4gdGhpcyBtZnQgcmVjb3JkLgorCQkJCSAgIE5PVEU6IE11c3QgYmUgYWxpZ25lZCB0byA4LWJ5dGUgYm91bmRhcnkuICovCisvKiAyOCovCWxlMzIgYnl0ZXNfYWxsb2NhdGVkOwkvKiBOdW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkIGZvciB0aGlzIG1mdAorCQkJCSAgIHJlY29yZC4gVGhpcyBzaG91bGQgYmUgZXF1YWwgdG8gdGhlIG1mdAorCQkJCSAgIHJlY29yZCBzaXplLiAqLworLyogMzIqLwlsZU1GVF9SRUYgYmFzZV9tZnRfcmVjb3JkOy8qIFRoaXMgaXMgemVybyBmb3IgYmFzZSBtZnQgcmVjb3Jkcy4KKwkJCQkgICBXaGVuIGl0IGlzIG5vdCB6ZXJvIGl0IGlzIGEgbWZ0IHJlZmVyZW5jZQorCQkJCSAgIHBvaW50aW5nIHRvIHRoZSBiYXNlIG1mdCByZWNvcmQgdG8gd2hpY2gKKwkJCQkgICB0aGlzIHJlY29yZCBiZWxvbmdzICh0aGlzIGlzIHRoZW4gdXNlZCB0bworCQkJCSAgIGxvY2F0ZSB0aGUgYXR0cmlidXRlIGxpc3QgYXR0cmlidXRlIHByZXNlbnQKKwkJCQkgICBpbiB0aGUgYmFzZSByZWNvcmQgd2hpY2ggZGVzY3JpYmVzIHRoaXMKKwkJCQkgICBleHRlbnNpb24gcmVjb3JkIGFuZCBoZW5jZSBtaWdodCBuZWVkCisJCQkJICAgbW9kaWZpY2F0aW9uIHdoZW4gdGhlIGV4dGVuc2lvbiByZWNvcmQKKwkJCQkgICBpdHNlbGYgaXMgbW9kaWZpZWQsIGFsc28gbG9jYXRpbmcgdGhlCisJCQkJICAgYXR0cmlidXRlIGxpc3QgYWxzbyBtZWFucyBmaW5kaW5nIHRoZSBvdGhlcgorCQkJCSAgIHBvdGVudGlhbCBleHRlbnRzLCBiZWxvbmdpbmcgdG8gdGhlIG5vbi1iYXNlCisJCQkJICAgbWZ0IHJlY29yZCkuICovCisvKiA0MCovCWxlMTYgbmV4dF9hdHRyX2luc3RhbmNlOy8qIFRoZSBpbnN0YW5jZSBudW1iZXIgdGhhdCB3aWxsIGJlIGFzc2lnbmVkIHRvCisJCQkJICAgdGhlIG5leHQgYXR0cmlidXRlIGFkZGVkIHRvIHRoaXMgbWZ0IHJlY29yZC4KKwkJCQkgICBOT1RFOiBJbmNyZW1lbnRlZCBlYWNoIHRpbWUgYWZ0ZXIgaXQgaXMgdXNlZC4KKwkJCQkgICBOT1RFOiBFdmVyeSB0aW1lIHRoZSBtZnQgcmVjb3JkIGlzIHJldXNlZAorCQkJCSAgIHRoaXMgbnVtYmVyIGlzIHNldCB0byB6ZXJvLiAgTk9URTogVGhlIGZpcnN0CisJCQkJICAgaW5zdGFuY2UgbnVtYmVyIGlzIGFsd2F5cyAwLiAqLworLyogc2l6ZW9mKCkgPSA0MiBieXRlcyAqLworLyoKKyAqIFdoZW4gKHJlKXVzaW5nIHRoZSBtZnQgcmVjb3JkLCB3ZSBwbGFjZSB0aGUgdXBkYXRlIHNlcXVlbmNlIGFycmF5IGF0IHRoaXMKKyAqIG9mZnNldCwgaS5lLiBiZWZvcmUgd2Ugc3RhcnQgd2l0aCB0aGUgYXR0cmlidXRlcy4gIFRoaXMgYWxzbyBtYWtlcyBzZW5zZSwKKyAqIG90aGVyd2lzZSB3ZSBjb3VsZCBydW4gaW50byBwcm9ibGVtcyB3aXRoIHRoZSB1cGRhdGUgc2VxdWVuY2UgYXJyYXkKKyAqIGNvbnRhaW5pbmcgaW4gaXRzZWxmIHRoZSBsYXN0IHR3byBieXRlcyBvZiBhIHNlY3RvciB3aGljaCB3b3VsZCBtZWFuIHRoYXQKKyAqIG11bHRpIHNlY3RvciB0cmFuc2ZlciBwcm90ZWN0aW9uIHdvdWxkbid0IHdvcmsuICBBcyB5b3UgY2FuJ3QgcHJvdGVjdCBkYXRhCisgKiBieSBvdmVyd3JpdGluZyBpdCBzaW5jZSB5b3UgdGhlbiBjYW4ndCBnZXQgaXQgYmFjay4uLgorICogV2hlbiByZWFkaW5nIHdlIG9idmlvdXNseSB1c2UgdGhlIGRhdGEgZnJvbSB0aGUgbnRmcyByZWNvcmQgaGVhZGVyLgorICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgTUZUX1JFQ09SRF9PTEQ7CisKKy8qCisgKiBTeXN0ZW0gZGVmaW5lZCBhdHRyaWJ1dGVzICgzMi1iaXQpLiAgRWFjaCBhdHRyaWJ1dGUgdHlwZSBoYXMgYSBjb3JyZXNwb25kaW5nCisgKiBhdHRyaWJ1dGUgbmFtZSAoVW5pY29kZSBzdHJpbmcgb2YgbWF4aW11bSA2NCBjaGFyYWN0ZXIgbGVuZ3RoKSBhcyBkZXNjcmliZWQKKyAqIGJ5IHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMgcHJlc2VudCBpbiB0aGUgZGF0YSBhdHRyaWJ1dGUgb2YgdGhlICRBdHRyRGVmCisgKiBzeXN0ZW0gZmlsZS4gIE9uIE5URlMgMy4wIHZvbHVtZXMgdGhlIG5hbWVzIGFyZSBqdXN0IGFzIHRoZSB0eXBlcyBhcmUgbmFtZWQKKyAqIGluIHRoZSBiZWxvdyBkZWZpbmVzIGV4Y2hhbmdpbmcgQVRfIGZvciB0aGUgZG9sbGFyIHNpZ24gKCQpLiAgSWYgdGhhdCBpcyBub3QKKyAqIGEgcmV2ZWFsaW5nIGNob2ljZSBvZiBzeW1ib2wgSSBkbyBub3Qga25vdyB3aGF0IGlzLi4uICgtOworICovCitlbnVtIHsKKwlBVF9VTlVTRUQJCQk9IGNvbnN0X2NwdV90b19sZTMyKCAgICAgICAgIDApLAorCUFUX1NUQU5EQVJEX0lORk9STUFUSU9OCQk9IGNvbnN0X2NwdV90b19sZTMyKCAgICAgIDB4MTApLAorCUFUX0FUVFJJQlVURV9MSVNUCQk9IGNvbnN0X2NwdV90b19sZTMyKCAgICAgIDB4MjApLAorCUFUX0ZJTEVfTkFNRQkJCT0gY29uc3RfY3B1X3RvX2xlMzIoICAgICAgMHgzMCksCisJQVRfT0JKRUNUX0lECQkJPSBjb25zdF9jcHVfdG9fbGUzMiggICAgICAweDQwKSwKKwlBVF9TRUNVUklUWV9ERVNDUklQVE9SCQk9IGNvbnN0X2NwdV90b19sZTMyKCAgICAgIDB4NTApLAorCUFUX1ZPTFVNRV9OQU1FCQkJPSBjb25zdF9jcHVfdG9fbGUzMiggICAgICAweDYwKSwKKwlBVF9WT0xVTUVfSU5GT1JNQVRJT04JCT0gY29uc3RfY3B1X3RvX2xlMzIoICAgICAgMHg3MCksCisJQVRfREFUQQkJCQk9IGNvbnN0X2NwdV90b19sZTMyKCAgICAgIDB4ODApLAorCUFUX0lOREVYX1JPT1QJCQk9IGNvbnN0X2NwdV90b19sZTMyKCAgICAgIDB4OTApLAorCUFUX0lOREVYX0FMTE9DQVRJT04JCT0gY29uc3RfY3B1X3RvX2xlMzIoICAgICAgMHhhMCksCisJQVRfQklUTUFQCQkJPSBjb25zdF9jcHVfdG9fbGUzMiggICAgICAweGIwKSwKKwlBVF9SRVBBUlNFX1BPSU5UCQk9IGNvbnN0X2NwdV90b19sZTMyKCAgICAgIDB4YzApLAorCUFUX0VBX0lORk9STUFUSU9OCQk9IGNvbnN0X2NwdV90b19sZTMyKCAgICAgIDB4ZDApLAorCUFUX0VBCQkJCT0gY29uc3RfY3B1X3RvX2xlMzIoICAgICAgMHhlMCksCisJQVRfUFJPUEVSVFlfU0VUCQkJPSBjb25zdF9jcHVfdG9fbGUzMiggICAgICAweGYwKSwKKwlBVF9MT0dHRURfVVRJTElUWV9TVFJFQU0JPSBjb25zdF9jcHVfdG9fbGUzMiggICAgIDB4MTAwKSwKKwlBVF9GSVJTVF9VU0VSX0RFRklORURfQVRUUklCVVRFCT0gY29uc3RfY3B1X3RvX2xlMzIoICAgIDB4MTAwMCksCisJQVRfRU5ECQkJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHhmZmZmZmZmZikKK307CisKK3R5cGVkZWYgbGUzMiBBVFRSX1RZUEU7CisKKy8qCisgKiBUaGUgY29sbGF0aW9uIHJ1bGVzIGZvciBzb3J0aW5nIHZpZXdzL2luZGV4ZXMvZXRjICgzMi1iaXQpLgorICoKKyAqIENPTExBVElPTl9CSU5BUlkgLSBDb2xsYXRlIGJ5IGJpbmFyeSBjb21wYXJlIHdoZXJlIHRoZSBmaXJzdCBieXRlIGlzIG1vc3QKKyAqCXNpZ25pZmljYW50LgorICogQ09MTEFUSU9OX1VOSUNPREVfU1RSSU5HIC0gQ29sbGF0ZSBVbmljb2RlIHN0cmluZ3MgYnkgY29tcGFyaW5nIHRoZWlyIGJpbmFyeQorICoJVW5pY29kZSB2YWx1ZXMsIGV4Y2VwdCB0aGF0IHdoZW4gYSBjaGFyYWN0ZXIgY2FuIGJlIHVwcGVyY2FzZWQsIHRoZQorICoJdXBwZXIgY2FzZSB2YWx1ZSBjb2xsYXRlcyBiZWZvcmUgdGhlIGxvd2VyIGNhc2Ugb25lLgorICogQ09MTEFUSU9OX0ZJTEVfTkFNRSAtIENvbGxhdGUgZmlsZSBuYW1lcyBhcyBVbmljb2RlIHN0cmluZ3MuIFRoZSBjb2xsYXRpb24KKyAqCWlzIGRvbmUgdmVyeSBtdWNoIGxpa2UgQ09MTEFUSU9OX1VOSUNPREVfU1RSSU5HLiBJbiBmYWN0IEkgaGF2ZSBubyBpZGVhCisgKgl3aGF0IHRoZSBkaWZmZXJlbmNlIGlzLiBQZXJoYXBzIHRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgZmlsZSBuYW1lcworICoJd291bGQgdHJlYXQgc29tZSBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gYW4gb2RkIHdheSAoc2VlCisgKgl1bmlzdHIuYzo6bnRmc19jb2xsYXRlX25hbWVzKCkgYW5kIHVuaXN0ci5jOjpsZWdhbF9hbnNpX2NoYXJfYXJyYXlbXQorICoJZm9yIHdoYXQgSSBtZWFuIGJ1dCBDT0xMQVRJT05fVU5JQ09ERV9TVFJJTkcgd291bGQgbm90IGdpdmUgYW55IHNwZWNpYWwKKyAqCXRyZWF0bWVudCB0byBhbnkgY2hhcmFjdGVycyBhdCBhbGwsIGJ1dCB0aGlzIGlzIHNwZWN1bGF0aW9uLgorICogQ09MTEFUSU9OX05UT0ZTX1VMT05HIC0gU29ydGluZyBpcyBkb25lIGFjY29yZGluZyB0byBhc2NlbmRpbmcgbGUzMiBrZXkKKyAqCXZhbHVlcy4gRS5nLiB1c2VkIGZvciAkU0lJIGluZGV4IGluIEZJTEVfU2VjdXJlLCB3aGljaCBzb3J0cyBieQorICoJc2VjdXJpdHlfaWQgKGxlMzIpLgorICogQ09MTEFUSU9OX05UT0ZTX1NJRCAtIFNvcnRpbmcgaXMgZG9uZSBhY2NvcmRpbmcgdG8gYXNjZW5kaW5nIFNJRCB2YWx1ZXMuCisgKglFLmcuIHVzZWQgZm9yICRPIGluZGV4IGluIEZJTEVfRXh0ZW5kLyRRdW90YS4KKyAqIENPTExBVElPTl9OVE9GU19TRUNVUklUWV9IQVNIIC0gU29ydGluZyBpcyBkb25lIGZpcnN0IGJ5IGFzY2VuZGluZyBoYXNoCisgKgl2YWx1ZXMgYW5kIHNlY29uZCBieSBhc2NlbmRpbmcgc2VjdXJpdHlfaWQgdmFsdWVzLiBFLmcuIHVzZWQgZm9yICRTREgKKyAqCWluZGV4IGluIEZJTEVfU2VjdXJlLgorICogQ09MTEFUSU9OX05UT0ZTX1VMT05HUyAtIFNvcnRpbmcgaXMgZG9uZSBhY2NvcmRpbmcgdG8gYSBzZXF1ZW5jZSBvZiBhc2NlbmRpbmcKKyAqCWxlMzIga2V5IHZhbHVlcy4gRS5nLiB1c2VkIGZvciAkTyBpbmRleCBpbiBGSUxFX0V4dGVuZC8kT2JqSWQsIHdoaWNoCisgKglzb3J0cyBieSBvYmplY3RfaWQgKDE2LWJ5dGUpLCBieSBzcGxpdHRpbmcgdXAgdGhlIG9iamVjdF9pZCBpbiBmb3VyCisgKglsZTMyIHZhbHVlcyBhbmQgdXNpbmcgdGhlbSBhcyBpbmRpdmlkdWFsIGtleXMuIEUuZy4gdGFrZSB0aGUgZm9sbG93aW5nCisgKgl0d28gc2VjdXJpdHlfaWRzLCBzdG9yZWQgYXMgZm9sbG93cyBvbiBkaXNrOgorICoJCTFzdDogYTEgNjEgNjUgYjcgNjUgN2IgZDQgMTEgOWUgM2QgMDAgZTAgODEgMTAgNDIgNTkKKyAqCQkybmQ6IDM4IDE0IDM3IGQyIGQyIGYzIGQ0IDExIGE1IDIxIGM4IDZiIDc5IGIxIDk3IDQ1CisgKglUbyBjb21wYXJlIHRoZW0sIHRoZXkgYXJlIHNwbGl0IGludG8gZm91ciBsZTMyIHZhbHVlcyBlYWNoLCBsaWtlIHNvOgorICoJCTFzdDogMHhiNzY1NjFhMSAweDExZDQ3YjY1IDB4ZTAwMDNkOWUgMHg1OTQyMTA4MQorICoJCTJuZDogMHhkMjM3MTQzOCAweDExZDRmM2QyIDB4NmJjODIxYTUgMHg0NTk3YjE3OQorICoJTm93LCBpdCBpcyBhcHBhcmVudCB3aHkgdGhlIDJuZCBvYmplY3RfaWQgY29sbGF0ZXMgYWZ0ZXIgdGhlIDFzdDogdGhlCisgKglmaXJzdCBsZTMyIHZhbHVlIG9mIHRoZSAxc3Qgb2JqZWN0X2lkIGlzIGxlc3MgdGhhbiB0aGUgZmlyc3QgbGUzMiBvZgorICoJdGhlIDJuZCBvYmplY3RfaWQuIElmIHRoZSBmaXJzdCBsZTMyIHZhbHVlcyBvZiBib3RoIG9iamVjdF9pZHMgd2VyZQorICoJZXF1YWwgdGhlbiB0aGUgc2Vjb25kIGxlMzIgdmFsdWVzIHdvdWxkIGJlIGNvbXBhcmVkLCBldGMuCisgKi8KK2VudW0geworCUNPTExBVElPTl9CSU5BUlkJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMCksCisJQ09MTEFUSU9OX0ZJTEVfTkFNRQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAxKSwKKwlDT0xMQVRJT05fVU5JQ09ERV9TVFJJTkcJPSBjb25zdF9jcHVfdG9fbGUzMigweDAyKSwKKwlDT0xMQVRJT05fTlRPRlNfVUxPTkcJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgxMCksCisJQ09MTEFUSU9OX05UT0ZTX1NJRAkJPSBjb25zdF9jcHVfdG9fbGUzMigweDExKSwKKwlDT0xMQVRJT05fTlRPRlNfU0VDVVJJVFlfSEFTSAk9IGNvbnN0X2NwdV90b19sZTMyKDB4MTIpLAorCUNPTExBVElPTl9OVE9GU19VTE9OR1MJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgxMykKK307CisKK3R5cGVkZWYgbGUzMiBDT0xMQVRJT05fUlVMRTsKKworLyoKKyAqIFRoZSBmbGFncyAoMzItYml0KSBkZXNjcmliaW5nIGF0dHJpYnV0ZSBwcm9wZXJ0aWVzIGluIHRoZSBhdHRyaWJ1dGUKKyAqIGRlZmluaXRpb24gc3RydWN0dXJlLiAgRklYTUU6IFRoaXMgaW5mb3JtYXRpb24gaXMgZnJvbSBSZWdpcydzIGluZm9ybWF0aW9uCisgKiBhbmQsIGFjY29yZGluZyB0byBoaW0sIGl0IGlzIG5vdCBjZXJ0YWluIGFuZCBwcm9iYWJseSBpbmNvbXBsZXRlLgorICogVGhlIElOREVYQUJMRSBmbGFnIGlzIGZhaXJseSBjZXJ0YWlubHkgY29ycmVjdCBhcyBvbmx5IHRoZSBmaWxlIG5hbWUKKyAqIGF0dHJpYnV0ZSBoYXMgdGhpcyBmbGFnIHNldCBhbmQgdGhpcyBpcyB0aGUgb25seSBhdHRyaWJ1dGUgaW5kZXhlZCBpbiBOVDQuCisgKi8KK2VudW0geworCUlOREVYQUJMRQkgICAgPSBjb25zdF9jcHVfdG9fbGUzMigweDAyKSwgLyogQXR0cmlidXRlIGNhbiBiZQorCQkJCQkJCSAgaW5kZXhlZC4gKi8KKwlORUVEX1RPX1JFR0VORVJBVEUgID0gY29uc3RfY3B1X3RvX2xlMzIoMHg0MCksIC8qIE5lZWQgdG8gcmVnZW5lcmF0ZQorCQkJCQkJCSAgZHVyaW5nIHJlZ2VuZXJhdGlvbgorCQkJCQkJCSAgcGhhc2UuICovCisJQ0FOX0JFX05PTl9SRVNJREVOVCA9IGNvbnN0X2NwdV90b19sZTMyKDB4ODApLCAvKiBBdHRyaWJ1dGUgY2FuIGJlCisJCQkJCQkJICBub24tcmVzaWRlbnQuICovCit9OworCit0eXBlZGVmIGxlMzIgQVRUUl9ERUZfRkxBR1M7CisKKy8qCisgKiBUaGUgZGF0YSBhdHRyaWJ1dGUgb2YgRklMRV9BdHRyRGVmIGNvbnRhaW5zIGEgc2VxdWVuY2Ugb2YgYXR0cmlidXRlCisgKiBkZWZpbml0aW9ucyBmb3IgdGhlIE5URlMgdm9sdW1lLiBXaXRoIHRoaXMsIGl0IGlzIHN1cHBvc2VkIHRvIGJlIHNhZmUgZm9yIGFuCisgKiBvbGRlciBOVEZTIGRyaXZlciB0byBtb3VudCBhIHZvbHVtZSBjb250YWluaW5nIGEgbmV3ZXIgTlRGUyB2ZXJzaW9uIHdpdGhvdXQKKyAqIGRhbWFnaW5nIGl0ICh0aGF0J3MgdGhlIHRoZW9yeS4gSW4gcHJhY3RpY2UgaXQnczogbm90IGRhbWFnaW5nIGl0IHRvbyBtdWNoKS4KKyAqIEVudHJpZXMgYXJlIHNvcnRlZCBieSBhdHRyaWJ1dGUgdHlwZS4gVGhlIGZsYWdzIGRlc2NyaWJlIHdoZXRoZXIgdGhlCisgKiBhdHRyaWJ1dGUgY2FuIGJlIHJlc2lkZW50L25vbi1yZXNpZGVudCBhbmQgcG9zc2libHkgb3RoZXIgdGhpbmdzLCBidXQgdGhlCisgKiBhY3R1YWwgYml0cyBhcmUgdW5rbm93bi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworLypoZXggb2ZzKi8KKy8qICAwKi8JbnRmc2NoYXIgbmFtZVsweDQwXTsJCS8qIFVuaWNvZGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLiBaZXJvCisJCQkJCSAgIHRlcm1pbmF0ZWQuICovCisvKiA4MCovCUFUVFJfVFlQRSB0eXBlOwkJCS8qIFR5cGUgb2YgdGhlIGF0dHJpYnV0ZS4gKi8KKy8qIDg0Ki8JbGUzMiBkaXNwbGF5X3J1bGU7CQkvKiBEZWZhdWx0IGRpc3BsYXkgcnVsZS4KKwkJCQkJICAgRklYTUU6IFdoYXQgZG9lcyBpdCBtZWFuPyAoQUlBKSAqLworLyogODgqLyBDT0xMQVRJT05fUlVMRSBjb2xsYXRpb25fcnVsZTsJLyogRGVmYXVsdCBjb2xsYXRpb24gcnVsZS4gKi8KKy8qIDhjKi8JQVRUUl9ERUZfRkxBR1MgZmxhZ3M7CQkvKiBGbGFncyBkZXNjcmliaW5nIHRoZSBhdHRyaWJ1dGUuICovCisvKiA5MCovCXNsZTY0IG1pbl9zaXplOwkJCS8qIE9wdGlvbmFsIG1pbmltdW0gYXR0cmlidXRlIHNpemUuICovCisvKiA5OCovCXNsZTY0IG1heF9zaXplOwkJCS8qIE1heGltdW0gc2l6ZSBvZiBhdHRyaWJ1dGUuICovCisvKiBzaXplb2YoKSA9IDB4YTAgb3IgMTYwIGJ5dGVzICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgQVRUUl9ERUY7CisKKy8qCisgKiBBdHRyaWJ1dGUgZmxhZ3MgKDE2LWJpdCkuCisgKi8KK2VudW0geworCUFUVFJfSVNfQ09NUFJFU1NFRCAgICA9IGNvbnN0X2NwdV90b19sZTE2KDB4MDAwMSksCisJQVRUUl9DT01QUkVTU0lPTl9NQVNLID0gY29uc3RfY3B1X3RvX2xlMTYoMHgwMGZmKSwgLyogQ29tcHJlc3Npb24gbWV0aG9kCisJCQkJCQkJICAgICAgbWFzay4gIEFsc28sIGZpcnN0CisJCQkJCQkJICAgICAgaWxsZWdhbCB2YWx1ZS4gKi8KKwlBVFRSX0lTX0VOQ1JZUFRFRCAgICAgPSBjb25zdF9jcHVfdG9fbGUxNigweDQwMDApLAorCUFUVFJfSVNfU1BBUlNFCSAgICAgID0gY29uc3RfY3B1X3RvX2xlMTYoMHg4MDAwKSwKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKwordHlwZWRlZiBsZTE2IEFUVFJfRkxBR1M7CisKKy8qCisgKiBBdHRyaWJ1dGUgY29tcHJlc3Npb24uCisgKgorICogT25seSB0aGUgZGF0YSBhdHRyaWJ1dGUgaXMgZXZlciBjb21wcmVzc2VkIGluIHRoZSBjdXJyZW50IG50ZnMgZHJpdmVyIGluCisgKiBXaW5kb3dzLiBGdXJ0aGVyLCBjb21wcmVzc2lvbiBpcyBvbmx5IGFwcGxpZWQgd2hlbiB0aGUgZGF0YSBhdHRyaWJ1dGUgaXMKKyAqIG5vbi1yZXNpZGVudC4gRmluYWxseSwgdG8gdXNlIGNvbXByZXNzaW9uLCB0aGUgbWF4aW11bSBhbGxvd2VkIGNsdXN0ZXIgc2l6ZQorICogb24gYSB2b2x1bWUgaXMgNGtpYi4KKyAqCisgKiBUaGUgY29tcHJlc3Npb24gbWV0aG9kIGlzIGJhc2VkIG9uIGluZGVwZW5kZW50bHkgY29tcHJlc3NpbmcgYmxvY2tzIG9mIFgKKyAqIGNsdXN0ZXJzLCB3aGVyZSBYIGlzIGRldGVybWluZWQgZnJvbSB0aGUgY29tcHJlc3Npb25fdW5pdCB2YWx1ZSBmb3VuZCBpbiB0aGUKKyAqIG5vbi1yZXNpZGVudCBhdHRyaWJ1dGUgcmVjb3JkIGhlYWRlciAobW9yZSBwcmVjaXNlbHk6IFggPSAyXmNvbXByZXNzaW9uX3VuaXQKKyAqIGNsdXN0ZXJzKS4gT24gV2luZG93cyBOVC8yaywgWCBhbHdheXMgaXMgMTYgY2x1c3RlcnMgKGNvbXByZXNzaW9uX3VuaXQgPSA0KS4KKyAqCisgKiBUaGVyZSBhcmUgdGhyZWUgZGlmZmVyZW50IGNhc2VzIG9mIGhvdyBhIGNvbXByZXNzaW9uIGJsb2NrIG9mIFggY2x1c3RlcnMKKyAqIGNhbiBiZSBzdG9yZWQ6CisgKgorICogICAxKSBUaGUgZGF0YSBpbiB0aGUgYmxvY2sgaXMgYWxsIHplcm8gKGEgc3BhcnNlIGJsb2NrKToKKyAqCSAgVGhpcyBpcyBzdG9yZWQgYXMgYSBzcGFyc2UgYmxvY2sgaW4gdGhlIHJ1bmxpc3QsIGkuZS4gdGhlIHJ1bmxpc3QKKyAqCSAgZW50cnkgaGFzIGxlbmd0aCA9IFggYW5kIGxjbiA9IC0xLiBUaGUgbWFwcGluZyBwYWlycyBhcnJheSBhY3R1YWxseQorICoJICB1c2VzIGEgZGVsdGFfbGNuIHZhbHVlIGxlbmd0aCBvZiAwLCBpLmUuIGRlbHRhX2xjbiBpcyBub3QgcHJlc2VudCBhdAorICoJICBhbGwsIHdoaWNoIGlzIHRoZW4gaW50ZXJwcmV0ZWQgYnkgdGhlIGRyaXZlciBhcyBsY24gPSAtMS4KKyAqCSAgTk9URTogRXZlbiB1bmNvbXByZXNzZWQgZmlsZXMgY2FuIGJlIHNwYXJzZSBvbiBOVEZTIDMuMCB2b2x1bWVzLCB0aGVuCisgKgkgIHRoZSBzYW1lIHByaW5jaXBsZXMgYXBwbHkgYXMgYWJvdmUsIGV4Y2VwdCB0aGF0IHRoZSBsZW5ndGggaXMgbm90CisgKgkgIHJlc3RyaWN0ZWQgdG8gYmVpbmcgYW55IHBhcnRpY3VsYXIgdmFsdWUuCisgKgorICogICAyKSBUaGUgZGF0YSBpbiB0aGUgYmxvY2sgaXMgbm90IGNvbXByZXNzZWQ6CisgKgkgIFRoaXMgaGFwcGVucyB3aGVuIGNvbXByZXNzaW9uIGRvZXNuJ3QgcmVkdWNlIHRoZSBzaXplIG9mIHRoZSBibG9jaworICoJICBpbiBjbHVzdGVycy4gSS5lLiBpZiBjb21wcmVzc2lvbiBoYXMgYSBzbWFsbCBlZmZlY3Qgc28gdGhhdCB0aGUKKyAqCSAgY29tcHJlc3NlZCBkYXRhIHN0aWxsIG9jY3VwaWVzIFggY2x1c3RlcnMsIHRoZW4gdGhlIHVuY29tcHJlc3NlZCBkYXRhCisgKgkgIGlzIHN0b3JlZCBpbiB0aGUgYmxvY2suCisgKgkgIFRoaXMgY2FzZSBpcyByZWNvZ25pc2VkIGJ5IHRoZSBmYWN0IHRoYXQgdGhlIHJ1bmxpc3QgZW50cnkgaGFzCisgKgkgIGxlbmd0aCA9IFggYW5kIGxjbiA+PSAwLiBUaGUgbWFwcGluZyBwYWlycyBhcnJheSBzdG9yZXMgdGhpcyBhcworICoJICBub3JtYWwgd2l0aCBhIHJ1biBsZW5ndGggb2YgWCBhbmQgc29tZSBzcGVjaWZpYyBkZWx0YV9sY24sIGkuZS4KKyAqCSAgZGVsdGFfbGNuIGhhcyB0byBiZSBwcmVzZW50LgorICoKKyAqICAgMykgVGhlIGRhdGEgaW4gdGhlIGJsb2NrIGlzIGNvbXByZXNzZWQ6CisgKgkgIFRoZSBjb21tb24gY2FzZS4gVGhpcyBjYXNlIGlzIHJlY29nbmlzZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgcnVuCisgKgkgIGxpc3QgZW50cnkgaGFzIGxlbmd0aCBMIDwgWCBhbmQgbGNuID49IDAuIFRoZSBtYXBwaW5nIHBhaXJzIGFycmF5CisgKgkgIHN0b3JlcyB0aGlzIGFzIG5vcm1hbCB3aXRoIGEgcnVuIGxlbmd0aCBvZiBYIGFuZCBzb21lIHNwZWNpZmljCisgKgkgIGRlbHRhX2xjbiwgaS5lLiBkZWx0YV9sY24gaGFzIHRvIGJlIHByZXNlbnQuIFRoaXMgcnVubGlzdCBlbnRyeSBpcworICoJICBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIHNwYXJzZSBlbnRyeSB3aXRoIGxlbmd0aCA9IFggLSBMIGFuZAorICoJICBsY24gPSAtMS4gVGhlIGxhdHRlciBlbnRyeSBpcyB0byBtYWtlIHVwIHRoZSB2Y24gY291bnRpbmcgdG8gdGhlCisgKgkgIGZ1bGwgY29tcHJlc3Npb24gYmxvY2sgc2l6ZSBYLgorICoKKyAqIEluIGZhY3QsIGxpZmUgaXMgbW9yZSBjb21wbGljYXRlZCBiZWNhdXNlIGFkamFjZW50IGVudHJpZXMgb2YgdGhlIHNhbWUgdHlwZQorICogY2FuIGJlIGNvYWxlc2NlZC4gVGhpcyBtZWFucyB0aGF0IG9uZSBoYXMgdG8ga2VlcCB0cmFjayBvZiB0aGUgbnVtYmVyIG9mCisgKiBjbHVzdGVycyBoYW5kbGVkIGFuZCB3b3JrIG9uIGEgYmFzaXMgb2YgWCBjbHVzdGVycyBhdCBhIHRpbWUgYmVpbmcgb25lCisgKiBibG9jay4gQW4gZXhhbXBsZTogaWYgbGVuZ3RoIEwgPiBYIHRoaXMgbWVhbnMgdGhhdCB0aGlzIHBhcnRpY3VsYXIgcnVubGlzdAorICogZW50cnkgY29udGFpbnMgYSBibG9jayBvZiBsZW5ndGggWCBhbmQgcGFydCBvZiBvbmUgb3IgbW9yZSBibG9ja3Mgb2YgbGVuZ3RoCisgKiBMIC0gWC4gQW5vdGhlciBleGFtcGxlOiBpZiBsZW5ndGggTCA8IFgsIHRoaXMgZG9lcyBub3QgbmVjZXNzYXJpbHkgbWVhbiB0aGF0CisgKiB0aGUgYmxvY2sgaXMgY29tcHJlc3NlZCBhcyBpdCBtaWdodCBiZSB0aGF0IHRoZSBsY24gY2hhbmdlcyBpbnNpZGUgdGhlIGJsb2NrCisgKiBhbmQgaGVuY2UgdGhlIGZvbGxvd2luZyBydW5saXN0IGVudHJ5IGRlc2NyaWJlcyB0aGUgY29udGludWF0aW9uIG9mIHRoZQorICogcG90ZW50aWFsbHkgY29tcHJlc3NlZCBibG9jay4gVGhlIGJsb2NrIHdvdWxkIGJlIGNvbXByZXNzZWQgaWYgdGhlCisgKiBmb2xsb3dpbmcgcnVubGlzdCBlbnRyeSBkZXNjcmliZXMgYXQgbGVhc3QgWCAtIEwgc3BhcnNlIGNsdXN0ZXJzLCB0aHVzCisgKiBtYWtpbmcgdXAgdGhlIGNvbXByZXNzaW9uIGJsb2NrIGxlbmd0aCBhcyBkZXNjcmliZWQgaW4gcG9pbnQgMyBhYm92ZS4gKE9mCisgKiBjb3Vyc2UsIHRoZXJlIGNhbiBiZSBzZXZlcmFsIHJ1bmxpc3QgZW50cmllcyB3aXRoIHNtYWxsIGxlbmd0aHMgc28gdGhhdCB0aGUKKyAqIHNwYXJzZSBlbnRyeSBkb2VzIG5vdCBmb2xsb3cgdGhlIGZpcnN0IGRhdGEgY29udGFpbmluZyBlbnRyeSB3aXRoCisgKiBsZW5ndGggPCBYLikKKyAqCisgKiBOT1RFOiBBdCB0aGUgZW5kIG9mIHRoZSBjb21wcmVzc2VkIGF0dHJpYnV0ZSB2YWx1ZSwgdGhlcmUgbW9zdCBsaWtlbHkgaXMgbm90CisgKiBqdXN0IHRoZSByaWdodCBhbW91bnQgb2YgZGF0YSB0byBtYWtlIHVwIGEgY29tcHJlc3Npb24gYmxvY2ssIHRodXMgdGhpcyBkYXRhCisgKiBpcyBub3QgZXZlbiBhdHRlbXB0ZWQgdG8gYmUgY29tcHJlc3NlZC4gSXQgaXMganVzdCBzdG9yZWQgYXMgaXMsIHVubGVzcworICogdGhlIG51bWJlciBvZiBjbHVzdGVycyBpdCBvY2N1cGllcyBpcyByZWR1Y2VkIHdoZW4gY29tcHJlc3NlZCBpbiB3aGljaCBjYXNlCisgKiBpdCBpcyBzdG9yZWQgYXMgYSBjb21wcmVzc2VkIGNvbXByZXNzaW9uIGJsb2NrLCBjb21wbGV0ZSB3aXRoIHNwYXJzZQorICogY2x1c3RlcnMgYXQgdGhlIGVuZC4KKyAqLworCisvKgorICogRmxhZ3Mgb2YgcmVzaWRlbnQgYXR0cmlidXRlcyAoOC1iaXQpLgorICovCitlbnVtIHsKKwlSRVNJREVOVF9BVFRSX0lTX0lOREVYRUQgPSAweDAxLCAvKiBBdHRyaWJ1dGUgaXMgcmVmZXJlbmNlZCBpbiBhbiBpbmRleAorCQkJCQkgICAgKGhhcyBpbXBsaWNhdGlvbnMgZm9yIGRlbGV0aW5nIGFuZAorCQkJCQkgICAgbW9kaWZ5aW5nIHRoZSBhdHRyaWJ1dGUpLiAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCit0eXBlZGVmIHU4IFJFU0lERU5UX0FUVFJfRkxBR1M7CisKKy8qCisgKiBBdHRyaWJ1dGUgcmVjb3JkIGhlYWRlci4gQWx3YXlzIGFsaWduZWQgdG8gOC1ieXRlIGJvdW5kYXJ5LgorICovCit0eXBlZGVmIHN0cnVjdCB7CisvKk9mcyovCisvKiAgMCovCUFUVFJfVFlQRSB0eXBlOwkJLyogVGhlICgzMi1iaXQpIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZS4gKi8KKy8qICA0Ki8JbGUzMiBsZW5ndGg7CQkvKiBCeXRlIHNpemUgb2YgdGhlIHJlc2lkZW50IHBhcnQgb2YgdGhlCisJCQkJICAgYXR0cmlidXRlIChhbGlnbmVkIHRvIDgtYnl0ZSBib3VuZGFyeSkuCisJCQkJICAgVXNlZCB0byBnZXQgdG8gdGhlIG5leHQgYXR0cmlidXRlLiAqLworLyogIDgqLwl1OCBub25fcmVzaWRlbnQ7CS8qIElmIDAsIGF0dHJpYnV0ZSBpcyByZXNpZGVudC4KKwkJCQkgICBJZiAxLCBhdHRyaWJ1dGUgaXMgbm9uLXJlc2lkZW50LiAqLworLyogIDkqLwl1OCBuYW1lX2xlbmd0aDsJCS8qIFVuaWNvZGUgY2hhcmFjdGVyIHNpemUgb2YgbmFtZSBvZiBhdHRyaWJ1dGUuCisJCQkJICAgMCBpZiB1bm5hbWVkLiAqLworLyogMTAqLwlsZTE2IG5hbWVfb2Zmc2V0OwkvKiBJZiBuYW1lX2xlbmd0aCAhPSAwLCB0aGUgYnl0ZSBvZmZzZXQgdG8gdGhlCisJCQkJICAgYmVnaW5uaW5nIG9mIHRoZSBuYW1lIGZyb20gdGhlIGF0dHJpYnV0ZQorCQkJCSAgIHJlY29yZC4gTm90ZSB0aGF0IHRoZSBuYW1lIGlzIHN0b3JlZCBhcyBhCisJCQkJICAgVW5pY29kZSBzdHJpbmcuIFdoZW4gY3JlYXRpbmcsIHBsYWNlIG9mZnNldAorCQkJCSAgIGp1c3QgYXQgdGhlIGVuZCBvZiB0aGUgcmVjb3JkIGhlYWRlci4gVGhlbiwKKwkJCQkgICBmb2xsb3cgd2l0aCBhdHRyaWJ1dGUgdmFsdWUgb3IgbWFwcGluZyBwYWlycworCQkJCSAgIGFycmF5LCByZXNpZGVudCBhbmQgbm9uLXJlc2lkZW50IGF0dHJpYnV0ZXMKKwkJCQkgICByZXNwZWN0aXZlbHksIGFsaWduaW5nIHRvIGFuIDgtYnl0ZQorCQkJCSAgIGJvdW5kYXJ5LiAqLworLyogMTIqLwlBVFRSX0ZMQUdTIGZsYWdzOwkvKiBGbGFncyBkZXNjcmliaW5nIHRoZSBhdHRyaWJ1dGUuICovCisvKiAxNCovCWxlMTYgaW5zdGFuY2U7CQkvKiBUaGUgaW5zdGFuY2Ugb2YgdGhpcyBhdHRyaWJ1dGUgcmVjb3JkLiBUaGlzCisJCQkJICAgbnVtYmVyIGlzIHVuaXF1ZSB3aXRoaW4gdGhpcyBtZnQgcmVjb3JkIChzZWUKKwkJCQkgICBNRlRfUkVDT1JEL25leHRfYXR0cmlidXRlX2luc3RhbmNlIG5vdGVzIGluCisJCQkJICAgaW4gbWZ0LmggZm9yIG1vcmUgZGV0YWlscykuICovCisvKiAxNiovCXVuaW9uIHsKKwkJLyogUmVzaWRlbnQgYXR0cmlidXRlcy4gKi8KKwkJc3RydWN0IHsKKy8qIDE2ICovCQlsZTMyIHZhbHVlX2xlbmd0aDsvKiBCeXRlIHNpemUgb2YgYXR0cmlidXRlIHZhbHVlLiAqLworLyogMjAgKi8JCWxlMTYgdmFsdWVfb2Zmc2V0Oy8qIEJ5dGUgb2Zmc2V0IG9mIHRoZSBhdHRyaWJ1dGUKKwkJCQkJICAgICB2YWx1ZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUKKwkJCQkJICAgICBhdHRyaWJ1dGUgcmVjb3JkLiBXaGVuIGNyZWF0aW5nLAorCQkJCQkgICAgIGFsaWduIHRvIDgtYnl0ZSBib3VuZGFyeSBpZiB3ZQorCQkJCQkgICAgIGhhdmUgYSBuYW1lIHByZXNlbnQgYXMgdGhpcyBtaWdodAorCQkJCQkgICAgIG5vdCBoYXZlIGEgbGVuZ3RoIG9mIGEgbXVsdGlwbGUKKwkJCQkJICAgICBvZiA4LWJ5dGVzLiAqLworLyogMjIgKi8JCVJFU0lERU5UX0FUVFJfRkxBR1MgZmxhZ3M7IC8qIFNlZSBhYm92ZS4gKi8KKy8qIDIzICovCQlzOCByZXNlcnZlZDsJICAvKiBSZXNlcnZlZC9hbGlnbm1lbnQgdG8gOC1ieXRlCisJCQkJCSAgICAgYm91bmRhcnkuICovCisJCX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSByZXNpZGVudDsKKwkJLyogTm9uLXJlc2lkZW50IGF0dHJpYnV0ZXMuICovCisJCXN0cnVjdCB7CisvKiAxNiovCQkJbGVWQ04gbG93ZXN0X3ZjbjsvKiBMb3dlc3QgdmFsaWQgdmlydHVhbCBjbHVzdGVyIG51bWJlcgorCQkJCWZvciB0aGlzIHBvcnRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBvcgorCQkJCTAgaWYgdGhpcyBpcyB0aGUgb25seSBleHRlbnQgKHVzdWFsbHkgdGhlCisJCQkJY2FzZSkuIC0gT25seSB3aGVuIGFuIGF0dHJpYnV0ZSBsaXN0IGlzIHVzZWQKKwkJCQlkb2VzIGxvd2VzdF92Y24gIT0gMCBldmVyIG9jY3VyLiAqLworLyogMjQqLwkJCWxlVkNOIGhpZ2hlc3RfdmNuOy8qIEhpZ2hlc3QgdmFsaWQgdmNuIG9mIHRoaXMgZXh0ZW50IG9mCisJCQkJdGhlIGF0dHJpYnV0ZSB2YWx1ZS4gLSBVc3VhbGx5IHRoZXJlIGlzIG9ubHkgb25lCisJCQkJcG9ydGlvbiwgc28gdGhpcyB1c3VhbGx5IGVxdWFscyB0aGUgYXR0cmlidXRlCisJCQkJdmFsdWUgc2l6ZSBpbiBjbHVzdGVycyBtaW51cyAxLiBDYW4gYmUgLTEgZm9yCisJCQkJemVybyBsZW5ndGggZmlsZXMuIENhbiBiZSAwIGZvciAic2luZ2xlIGV4dGVudCIKKwkJCQlhdHRyaWJ1dGVzLiAqLworLyogMzIqLwkJCWxlMTYgbWFwcGluZ19wYWlyc19vZmZzZXQ7IC8qIEJ5dGUgb2Zmc2V0IGZyb20gdGhlCisJCQkJYmVnaW5uaW5nIG9mIHRoZSBzdHJ1Y3R1cmUgdG8gdGhlIG1hcHBpbmcgcGFpcnMKKwkJCQlhcnJheSB3aGljaCBjb250YWlucyB0aGUgbWFwcGluZ3MgYmV0d2VlbiB0aGUKKwkJCQl2Y25zIGFuZCB0aGUgbG9naWNhbCBjbHVzdGVyIG51bWJlcnMgKGxjbnMpLgorCQkJCVdoZW4gY3JlYXRpbmcsIHBsYWNlIHRoaXMgYXQgdGhlIGVuZCBvZiB0aGlzCisJCQkJcmVjb3JkIGhlYWRlciBhbGlnbmVkIHRvIDgtYnl0ZSBib3VuZGFyeS4gKi8KKy8qIDM0Ki8JCQl1OCBjb21wcmVzc2lvbl91bml0OyAvKiBUaGUgY29tcHJlc3Npb24gdW5pdCBleHByZXNzZWQKKwkJCQlhcyB0aGUgbG9nIHRvIHRoZSBiYXNlIDIgb2YgdGhlIG51bWJlciBvZgorCQkJCWNsdXN0ZXJzIGluIGEgY29tcHJlc3Npb24gdW5pdC4gMCBtZWFucyBub3QKKwkJCQljb21wcmVzc2VkLiAoVGhpcyBlZmZlY3RpdmVseSBsaW1pdHMgdGhlCisJCQkJY29tcHJlc3Npb24gdW5pdCBzaXplIHRvIGJlIGEgcG93ZXIgb2YgdHdvCisJCQkJY2x1c3RlcnMuKSBXaW5OVDQgb25seSB1c2VzIGEgdmFsdWUgb2YgNC4gKi8KKy8qIDM1Ki8JCQl1OCByZXNlcnZlZFs1XTsJCS8qIEFsaWduIHRvIDgtYnl0ZSBib3VuZGFyeS4gKi8KKy8qIFRoZSBzaXplcyBiZWxvdyBhcmUgb25seSB1c2VkIHdoZW4gbG93ZXN0X3ZjbiBpcyB6ZXJvLCBhcyBvdGhlcndpc2UgaXQgd291bGQKKyAgIGJlIGRpZmZpY3VsdCB0byBrZWVwIHRoZW0gdXAtdG8tZGF0ZS4qLworLyogNDAqLwkJCXNsZTY0IGFsbG9jYXRlZF9zaXplOwkvKiBCeXRlIHNpemUgb2YgZGlzayBzcGFjZQorCQkJCWFsbG9jYXRlZCB0byBob2xkIHRoZSBhdHRyaWJ1dGUgdmFsdWUuIEFsd2F5cworCQkJCWlzIGEgbXVsdGlwbGUgb2YgdGhlIGNsdXN0ZXIgc2l6ZS4gV2hlbiBhIGZpbGUKKwkJCQlpcyBjb21wcmVzc2VkLCB0aGlzIGZpZWxkIGlzIGEgbXVsdGlwbGUgb2YgdGhlCisJCQkJY29tcHJlc3Npb24gYmxvY2sgc2l6ZSAoMl5jb21wcmVzc2lvbl91bml0KSBhbmQKKwkJCQlpdCByZXByZXNlbnRzIHRoZSBsb2dpY2FsbHkgYWxsb2NhdGVkIHNwYWNlCisJCQkJcmF0aGVyIHRoYW4gdGhlIGFjdHVhbCBvbiBkaXNrIHVzYWdlLiBGb3IgdGhpcworCQkJCXVzZSB0aGUgY29tcHJlc3NlZF9zaXplIChzZWUgYmVsb3cpLiAqLworLyogNDgqLwkJCXNsZTY0IGRhdGFfc2l6ZTsJLyogQnl0ZSBzaXplIG9mIHRoZSBhdHRyaWJ1dGUKKwkJCQl2YWx1ZS4gQ2FuIGJlIGxhcmdlciB0aGFuIGFsbG9jYXRlZF9zaXplIGlmCisJCQkJYXR0cmlidXRlIHZhbHVlIGlzIGNvbXByZXNzZWQgb3Igc3BhcnNlLiAqLworLyogNTYqLwkJCXNsZTY0IGluaXRpYWxpemVkX3NpemU7CS8qIEJ5dGUgc2l6ZSBvZiBpbml0aWFsaXplZAorCQkJCXBvcnRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZS4gVXN1YWxseSBlcXVhbHMKKwkJCQlkYXRhX3NpemUuICovCisvKiBzaXplb2YodW5jb21wcmVzc2VkIGF0dHIpID0gNjQqLworLyogNjQqLwkJCXNsZTY0IGNvbXByZXNzZWRfc2l6ZTsJLyogQnl0ZSBzaXplIG9mIHRoZSBhdHRyaWJ1dGUKKwkJCQl2YWx1ZSBhZnRlciBjb21wcmVzc2lvbi4gT25seSBwcmVzZW50IHdoZW4KKwkJCQljb21wcmVzc2VkLiBBbHdheXMgaXMgYSBtdWx0aXBsZSBvZiB0aGUKKwkJCQljbHVzdGVyIHNpemUuIFJlcHJlc2VudHMgdGhlIGFjdHVhbCBhbW91bnQgb2YKKwkJCQlkaXNrIHNwYWNlIGJlaW5nIHVzZWQgb24gdGhlIGRpc2suICovCisvKiBzaXplb2YoY29tcHJlc3NlZCBhdHRyKSA9IDcyKi8KKwkJfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIG5vbl9yZXNpZGVudDsKKwl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgZGF0YTsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBBVFRSX1JFQ09SRDsKKwordHlwZWRlZiBBVFRSX1JFQ09SRCBBVFRSX1JFQzsKKworLyoKKyAqIEZpbGUgYXR0cmlidXRlIGZsYWdzICgzMi1iaXQpLgorICovCitlbnVtIHsKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgZmxhZ3MgYXJlIG9ubHkgcHJlc2VudCBpbiB0aGUgU1RBTkRBUkRfSU5GT1JNQVRJT04KKwkgKiBhdHRyaWJ1dGUgKGluIHRoZSBmaWVsZCBmaWxlX2F0dHJpYnV0ZXMpLgorCSAqLworCUZJTEVfQVRUUl9SRUFET05MWQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDAxKSwKKwlGSUxFX0FUVFJfSElEREVOCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMDIpLAorCUZJTEVfQVRUUl9TWVNURU0JCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDAwNCksCisJLyogT2xkIERPUyB2b2xpZC4gVW51c2VkIGluIE5ULgk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMDgpLCAqLworCisJRklMRV9BVFRSX0RJUkVDVE9SWQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDEwKSwKKwkvKiBOb3RlLCBGSUxFX0FUVFJfRElSRUNUT1JZIGlzIG5vdCBjb25zaWRlcmVkIHZhbGlkIGluIE5ULiAgSXQgaXMKKwkgICByZXNlcnZlZCBmb3IgdGhlIERPUyBTVUJESVJFQ1RPUlkgZmxhZy4gKi8KKwlGSUxFX0FUVFJfQVJDSElWRQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDIwKSwKKwlGSUxFX0FUVFJfREVWSUNFCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwNDApLAorCUZJTEVfQVRUUl9OT1JNQUwJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDA4MCksCisKKwlGSUxFX0FUVFJfVEVNUE9SQVJZCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAxMDApLAorCUZJTEVfQVRUUl9TUEFSU0VfRklMRQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMjAwKSwKKwlGSUxFX0FUVFJfUkVQQVJTRV9QT0lOVAkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwNDAwKSwKKwlGSUxFX0FUVFJfQ09NUFJFU1NFRAkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwODAwKSwKKworCUZJTEVfQVRUUl9PRkZMSU5FCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDEwMDApLAorCUZJTEVfQVRUUl9OT1RfQ09OVEVOVF9JTkRFWEVECT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMjAwMCksCisJRklMRV9BVFRSX0VOQ1JZUFRFRAkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDA0MDAwKSwKKworCUZJTEVfQVRUUl9WQUxJRF9GTEFHUwkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDA3ZmI3KSwKKwkvKiBOb3RlLCBGSUxFX0FUVFJfVkFMSURfRkxBR1MgbWFza3Mgb3V0IHRoZSBvbGQgRE9TIFZvbElkIGFuZCB0aGUKKwkgICBGSUxFX0FUVFJfREVWSUNFIGFuZCBwcmVzZXJ2ZXMgZXZlcnl0aGluZyBlbHNlLiAgVGhpcyBtYXNrIGlzIHVzZWQKKwkgICB0byBvYnRhaW4gYWxsIGZsYWdzIHRoYXQgYXJlIHZhbGlkIGZvciByZWFkaW5nLiAqLworCUZJTEVfQVRUUl9WQUxJRF9TRVRfRkxBR1MJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAzMWE3KSwKKwkvKiBOb3RlLCBGSUxFX0FUVFJfVkFMSURfU0VUX0ZMQUdTIG1hc2tzIG91dCB0aGUgb2xkIERPUyBWb2xJZCwgdGhlCisJICAgRl9BX0RFVklDRSwgRl9BX0RJUkVDVE9SWSwgRl9BX1NQQVJTRV9GSUxFLCBGX0FfUkVQQVJTRV9QT0lOVCwKKwkgICBGX0FfQ09NUFJFU1NFRCwgYW5kIEZfQV9FTkNSWVBURUQgYW5kIHByZXNlcnZlcyB0aGUgcmVzdC4gIFRoaXMgbWFzaworCSAgIGlzIHVzZWQgdG8gdG8gb2J0YWluIGFsbCBmbGFncyB0aGF0IGFyZSB2YWxpZCBmb3Igc2V0dGluZy4gKi8KKworCS8qCisJICogVGhlIGZvbGxvd2luZyBmbGFncyBhcmUgb25seSBwcmVzZW50IGluIHRoZSBGSUxFX05BTUUgYXR0cmlidXRlIChpbgorCSAqIHRoZSBmaWVsZCBmaWxlX2F0dHJpYnV0ZXMpLgorCSAqLworCUZJTEVfQVRUUl9EVVBfRklMRV9OQU1FX0lOREVYX1BSRVNFTlQJPSBjb25zdF9jcHVfdG9fbGUzMigweDEwMDAwMDAwKSwKKwkvKiBOb3RlLCB0aGlzIGlzIGEgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBiaXQgZnJvbSB0aGUgbWZ0IHJlY29yZCwKKwkgICB0ZWxsaW5nIHVzIHdoZXRoZXIgdGhpcyBpcyBhIGRpcmVjdG9yeSBvciBub3QsIGkuZS4gd2hldGhlciBpdCBoYXMKKwkgICBhbiBpbmRleCByb290IGF0dHJpYnV0ZSBvciBub3QuICovCisJRklMRV9BVFRSX0RVUF9WSUVXX0lOREVYX1BSRVNFTlQJPSBjb25zdF9jcHVfdG9fbGUzMigweDIwMDAwMDAwKSwKKwkvKiBOb3RlLCB0aGlzIGlzIGEgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBiaXQgZnJvbSB0aGUgbWZ0IHJlY29yZCwKKwkgICB0ZWxsaW5nIHVzIHdoZXRoZXIgdGhpcyBmaWxlIGhhcyBhIHZpZXcgaW5kZXggcHJlc2VudCAoZWcuIG9iamVjdCBpZAorCSAgIGluZGV4LCBxdW90YSBpbmRleCwgb25lIG9mIHRoZSBzZWN1cml0eSBpbmRleGVzIG9yIHRoZSBlbmNyeXB0aW5nCisJICAgZmlsZSBzeXN0ZW0gcmVsYXRlZCBpbmRleGVzKS4gKi8KK307CisKK3R5cGVkZWYgbGUzMiBGSUxFX0FUVFJfRkxBR1M7CisKKy8qCisgKiBOT1RFIG9uIHRpbWVzIGluIE5URlM6IEFsbCB0aW1lcyBhcmUgaW4gTVMgc3RhbmRhcmQgdGltZSBmb3JtYXQsIGkuZS4gdGhleQorICogYXJlIHRoZSBudW1iZXIgb2YgMTAwLW5hbm9zZWNvbmQgaW50ZXJ2YWxzIHNpbmNlIDFzdCBKYW51YXJ5IDE2MDEsIDAwOjAwOjAwCisgKiB1bml2ZXJzYWwgY29vcmRpbmF0ZWQgdGltZSAoVVRDKS4gKEluIExpbnV4IHRpbWUgc3RhcnRzIDFzdCBKYW51YXJ5IDE5NzAsCisgKiAwMDowMDowMCBVVEMgYW5kIGlzIHN0b3JlZCBhcyB0aGUgbnVtYmVyIG9mIDEtc2Vjb25kIGludGVydmFscyBzaW5jZSB0aGVuLikKKyAqLworCisvKgorICogQXR0cmlidXRlOiBTdGFuZGFyZCBpbmZvcm1hdGlvbiAoMHgxMCkuCisgKgorICogTk9URTogQWx3YXlzIHJlc2lkZW50LgorICogTk9URTogUHJlc2VudCBpbiBhbGwgYmFzZSBmaWxlIHJlY29yZHMgb24gYSB2b2x1bWUuCisgKiBOT1RFOiBUaGVyZSBpcyBjb25mbGljdGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVhbmluZyBvZiBlYWNoIG9mIHRoZSB0aW1lCisgKgkgZmllbGRzIGJ1dCB0aGUgbWVhbmluZyBhcyBkZWZpbmVkIGJlbG93IGhhcyBiZWVuIHZlcmlmaWVkIHRvIGJlCisgKgkgY29ycmVjdCBieSBwcmFjdGljYWwgZXhwZXJpbWVudGF0aW9uIG9uIFdpbmRvd3MgTlQ0IFNQNmEgYW5kIGlzIGhlbmNlCisgKgkgYXNzdW1lZCB0byBiZSB0aGUgb25lIGFuZCBvbmx5IGNvcnJlY3QgaW50ZXJwcmV0YXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKy8qT2ZzKi8KKy8qICAwKi8Jc2xlNjQgY3JlYXRpb25fdGltZTsJCS8qIFRpbWUgZmlsZSB3YXMgY3JlYXRlZC4gVXBkYXRlZCB3aGVuCisJCQkJCSAgIGEgZmlsZW5hbWUgaXMgY2hhbmdlZCg/KS4gKi8KKy8qICA4Ki8Jc2xlNjQgbGFzdF9kYXRhX2NoYW5nZV90aW1lOwkvKiBUaW1lIHRoZSBkYXRhIGF0dHJpYnV0ZSB3YXMgbGFzdAorCQkJCQkgICBtb2RpZmllZC4gKi8KKy8qIDE2Ki8Jc2xlNjQgbGFzdF9tZnRfY2hhbmdlX3RpbWU7CS8qIFRpbWUgdGhpcyBtZnQgcmVjb3JkIHdhcyBsYXN0CisJCQkJCSAgIG1vZGlmaWVkLiAqLworLyogMjQqLwlzbGU2NCBsYXN0X2FjY2Vzc190aW1lOwkJLyogQXBwcm94aW1hdGUgdGltZSB3aGVuIHRoZSBmaWxlIHdhcworCQkJCQkgICBsYXN0IGFjY2Vzc2VkIChvYnZpb3VzbHkgdGhpcyBpcyBub3QKKwkJCQkJICAgdXBkYXRlZCBvbiByZWFkLW9ubHkgdm9sdW1lcykuIEluCisJCQkJCSAgIFdpbmRvd3MgdGhpcyBpcyBvbmx5IHVwZGF0ZWQgd2hlbgorCQkJCQkgICBhY2Nlc3NlZCBpZiBzb21lIHRpbWUgZGVsdGEgaGFzCisJCQkJCSAgIHBhc3NlZCBzaW5jZSB0aGUgbGFzdCB1cGRhdGUuIEFsc28sCisJCQkJCSAgIGxhc3QgYWNjZXNzIHRpbWVzIHVwZGF0ZXMgY2FuIGJlCisJCQkJCSAgIGRpc2FibGVkIGFsdG9nZXRoZXIgZm9yIHNwZWVkLiAqLworLyogMzIqLwlGSUxFX0FUVFJfRkxBR1MgZmlsZV9hdHRyaWJ1dGVzOyAvKiBGbGFncyBkZXNjcmliaW5nIHRoZSBmaWxlLiAqLworLyogMzYqLwl1bmlvbiB7CisJLyogTlRGUyAxLjIgKi8KKwkJc3RydWN0IHsKKwkJLyogMzYqLwl1OCByZXNlcnZlZDEyWzEyXTsJLyogUmVzZXJ2ZWQvYWxpZ25tZW50IHRvIDgtYnl0ZQorCQkJCQkJICAgYm91bmRhcnkuICovCisJCX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSB2MTsKKwkvKiBzaXplb2YoKSA9IDQ4IGJ5dGVzICovCisJLyogTlRGUyAzLnggKi8KKwkJc3RydWN0IHsKKy8qCisgKiBJZiBhIHZvbHVtZSBoYXMgYmVlbiB1cGdyYWRlZCBmcm9tIGEgcHJldmlvdXMgTlRGUyB2ZXJzaW9uLCB0aGVuIHRoZXNlCisgKiBmaWVsZHMgYXJlIHByZXNlbnQgb25seSBpZiB0aGUgZmlsZSBoYXMgYmVlbiBhY2Nlc3NlZCBzaW5jZSB0aGUgdXBncmFkZS4KKyAqIFJlY29nbml6ZSB0aGUgZGlmZmVyZW5jZSBieSBjb21wYXJpbmcgdGhlIGxlbmd0aCBvZiB0aGUgcmVzaWRlbnQgYXR0cmlidXRlCisgKiB2YWx1ZS4gSWYgaXQgaXMgNDgsIHRoZW4gdGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIG1pc3NpbmcuIElmIGl0IGlzIDcyIHRoZW4KKyAqIHRoZSBmaWVsZHMgYXJlIHByZXNlbnQuIE1heWJlIGp1c3QgY2hlY2sgbGlrZSB0aGlzOgorICoJaWYgKHJlc2lkZW50LlZhbHVlTGVuZ3RoIDwgc2l6ZW9mKFNUQU5EQVJEX0lORk9STUFUSU9OKSkgeworICoJCUFzc3VtZSBOVEZTIDEuMi0gZm9ybWF0LgorICoJCUlmICh2b2x1bWUgdmVyc2lvbiBpcyAzLngpCisgKgkJCVVwZ3JhZGUgYXR0cmlidXRlIHRvIE5URlMgMy54IGZvcm1hdC4KKyAqCQllbHNlCisgKgkJCVVzZSBOVEZTIDEuMi0gZm9ybWF0IGZvciBhY2Nlc3MuCisgKgl9IGVsc2UKKyAqCQlVc2UgTlRGUyAzLnggZm9ybWF0IGZvciBhY2Nlc3MuCisgKiBPbmx5IHByb2JsZW0gaXMgdGhhdCBpdCBtaWdodCBiZSBsZWdhbCB0byBzZXQgdGhlIGxlbmd0aCBvZiB0aGUgdmFsdWUgdG8KKyAqIGFyYml0cmFyaWx5IGxhcmdlIHZhbHVlcyB0aHVzIHNwb2lsaW5nIHRoaXMgY2hlY2suIC0gQnV0IGNoa2RzayBwcm9iYWJseQorICogdmlld3MgdGhhdCBhcyBhIGNvcnJ1cHRpb24sIGFzc3VtaW5nIHRoYXQgaXQgYmVoYXZlcyBsaWtlIHRoaXMgZm9yIGFsbAorICogYXR0cmlidXRlcy4KKyAqLworCQkvKiAzNiovCWxlMzIgbWF4aW11bV92ZXJzaW9uczsJLyogTWF4aW11bSBhbGxvd2VkIHZlcnNpb25zIGZvcgorCQkJCWZpbGUuIFplcm8gaWYgdmVyc2lvbiBudW1iZXJpbmcgaXMgZGlzYWJsZWQuICovCisJCS8qIDQwKi8JbGUzMiB2ZXJzaW9uX251bWJlcjsJLyogVGhpcyBmaWxlJ3MgdmVyc2lvbiAoaWYgYW55KS4KKwkJCQlTZXQgdG8gemVybyBpZiBtYXhpbXVtX3ZlcnNpb25zIGlzIHplcm8uICovCisJCS8qIDQ0Ki8JbGUzMiBjbGFzc19pZDsJCS8qIENsYXNzIGlkIGZyb20gYmlkaXJlY3Rpb25hbAorCQkJCWNsYXNzIGlkIGluZGV4ICg/KS4gKi8KKwkJLyogNDgqLwlsZTMyIG93bmVyX2lkOwkJLyogT3duZXJfaWQgb2YgdGhlIHVzZXIgb3duaW5nCisJCQkJdGhlIGZpbGUuIFRyYW5zbGF0ZSB2aWEgJFEgaW5kZXggaW4gRklMRV9FeHRlbmQKKwkJCQkvJFF1b3RhIHRvIHRoZSBxdW90YSBjb250cm9sIGVudHJ5IGZvciB0aGUgdXNlcgorCQkJCW93bmluZyB0aGUgZmlsZS4gWmVybyBpZiBxdW90YXMgYXJlIGRpc2FibGVkLiAqLworCQkvKiA1MiovCWxlMzIgc2VjdXJpdHlfaWQ7CS8qIFNlY3VyaXR5X2lkIGZvciB0aGUgZmlsZS4KKwkJCQlUcmFuc2xhdGUgdmlhICRTSUkgaW5kZXggYW5kICRTRFMgZGF0YSBzdHJlYW0KKwkJCQlpbiBGSUxFX1NlY3VyZSB0byB0aGUgc2VjdXJpdHkgZGVzY3JpcHRvci4gKi8KKwkJLyogNTYqLwlsZTY0IHF1b3RhX2NoYXJnZWQ7CS8qIEJ5dGUgc2l6ZSBvZiB0aGUgY2hhcmdlIHRvCisJCQkJdGhlIHF1b3RhIGZvciBhbGwgc3RyZWFtcyBvZiB0aGUgZmlsZS4gTm90ZTogSXMKKwkJCQl6ZXJvIGlmIHF1b3RhcyBhcmUgZGlzYWJsZWQuICovCisJCS8qIDY0Ki8JbGU2NCB1c247CQkvKiBMYXN0IHVwZGF0ZSBzZXF1ZW5jZSBudW1iZXIKKwkJCQlvZiB0aGUgZmlsZS4gVGhpcyBpcyBhIGRpcmVjdCBpbmRleCBpbnRvIHRoZQorCQkJCWNoYW5nZSAoYWthIHVzbikgam91cm5hbCBmaWxlLiBJdCBpcyB6ZXJvIGlmCisJCQkJdGhlIHVzbiBqb3VybmFsIGlzIGRpc2FibGVkLgorCQkJCU5PVEU6IFRvIGRpc2FibGUgdGhlIGpvdXJuYWwgbmVlZCB0byBkZWxldGUKKwkJCQl0aGUgam91cm5hbCBmaWxlIGl0c2VsZiBhbmQgdG8gdGhlbiB3YWxrIHRoZQorCQkJCXdob2xlIG1mdCBhbmQgc2V0IGFsbCBVc24gZW50cmllcyBpbiBhbGwgbWZ0CisJCQkJcmVjb3JkcyB0byB6ZXJvISAoVGhpcyBjYW4gdGFrZSBhIHdoaWxlISkKKwkJCQlUaGUgam91cm5hbCBpcyBGSUxFX0V4dGVuZC8kVXNuSnJubC4gV2luMmsKKwkJCQl3aWxsIHJlY3JlYXRlIHRoZSBqb3VybmFsIGFuZCBpbml0aWF0ZQorCQkJCWxvZ2dpbmcgaWYgbmVjZXNzYXJ5IHdoZW4gbW91bnRpbmcgdGhlCisJCQkJcGFydGl0aW9uLiBUaGlzLCBpbiBjb250cmFzdCB0byBkaXNhYmxpbmcgdGhlCisJCQkJam91cm5hbCBpcyBhIHZlcnkgZmFzdCBwcm9jZXNzLCBzbyB0aGUgdXNlcgorCQkJCXdvbid0IGV2ZW4gbm90aWNlIGl0LiAqLworCQl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgdjM7CisJLyogc2l6ZW9mKCkgPSA3MiBieXRlcyAoTlRGUyAzLngpICovCisJfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIHZlcjsKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBTVEFOREFSRF9JTkZPUk1BVElPTjsKKworLyoKKyAqIEF0dHJpYnV0ZTogQXR0cmlidXRlIGxpc3QgKDB4MjApLgorICoKKyAqIC0gQ2FuIGJlIGVpdGhlciByZXNpZGVudCBvciBub24tcmVzaWRlbnQuCisgKiAtIFZhbHVlIGNvbnNpc3RzIG9mIGEgc2VxdWVuY2Ugb2YgdmFyaWFibGUgbGVuZ3RoLCA4LWJ5dGUgYWxpZ25lZCwKKyAqIEFUVFJfTElTVF9FTlRSWSByZWNvcmRzLgorICogLSBUaGUgbGlzdCBpcyBub3QgdGVybWluYXRlZCBieSBhbnl0aGluZyBhdCBhbGwhIFRoZSBvbmx5IHdheSB0byBrbm93IHdoZW4KKyAqIHRoZSBlbmQgaXMgcmVhY2hlZCBpcyB0byBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IG9mZnNldCBhbmQgY29tcGFyZSBpdCB0bworICogdGhlIGF0dHJpYnV0ZSB2YWx1ZSBzaXplLgorICogLSBUaGUgYXR0cmlidXRlIGxpc3QgYXR0cmlidXRlIGNvbnRhaW5zIG9uZSBlbnRyeSBmb3IgZWFjaCBhdHRyaWJ1dGUgb2YKKyAqIHRoZSBmaWxlIGluIHdoaWNoIHRoZSBsaXN0IGlzIGxvY2F0ZWQsIGV4Y2VwdCBmb3IgdGhlIGxpc3QgYXR0cmlidXRlCisgKiBpdHNlbGYuIFRoZSBsaXN0IGlzIHNvcnRlZDogZmlyc3QgYnkgYXR0cmlidXRlIHR5cGUsIHNlY29uZCBieSBhdHRyaWJ1dGUKKyAqIG5hbWUgKGlmIHByZXNlbnQpLCB0aGlyZCBieSBpbnN0YW5jZSBudW1iZXIuIFRoZSBleHRlbnRzIG9mIG9uZQorICogbm9uLXJlc2lkZW50IGF0dHJpYnV0ZSAoaWYgcHJlc2VudCkgaW1tZWRpYXRlbHkgZm9sbG93IGFmdGVyIHRoZSBpbml0aWFsCisgKiBleHRlbnQuIFRoZXkgYXJlIG9yZGVyZWQgYnkgbG93ZXN0X3ZjbiBhbmQgaGF2ZSB0aGVpciBpbnN0YWNlIHNldCB0byB6ZXJvLgorICogSXQgaXMgbm90IGFsbG93ZWQgdG8gaGF2ZSB0d28gYXR0cmlidXRlcyB3aXRoIGFsbCBzb3J0aW5nIGtleXMgZXF1YWwuCisgKiAtIEZ1cnRoZXIgcmVzdHJpY3Rpb25zOgorICoJLSBJZiBub3QgcmVzaWRlbnQsIHRoZSB2Y24gdG8gbGNuIG1hcHBpbmcgYXJyYXkgaGFzIHRvIGZpdCBpbnNpZGUgdGhlCisgKgkgIGJhc2UgbWZ0IHJlY29yZC4KKyAqCS0gVGhlIGF0dHJpYnV0ZSBsaXN0IGF0dHJpYnV0ZSB2YWx1ZSBoYXMgYSBtYXhpbXVtIHNpemUgb2YgMjU2a2IuIFRoaXMKKyAqCSAgaXMgaW1wb3NlZCBieSB0aGUgV2luZG93cyBjYWNoZSBtYW5hZ2VyLgorICogLSBBdHRyaWJ1dGUgbGlzdHMgYXJlIG9ubHkgdXNlZCB3aGVuIHRoZSBhdHRyaWJ1dGVzIG9mIG1mdCByZWNvcmQgZG8gbm90CisgKiBmaXQgaW5zaWRlIHRoZSBtZnQgcmVjb3JkIGRlc3BpdGUgYWxsIGF0dHJpYnV0ZXMgKHRoYXQgY2FuIGJlIG1hZGUKKyAqIG5vbi1yZXNpZGVudCkgaGF2aW5nIGJlZW4gbWFkZSBub24tcmVzaWRlbnQuIFRoaXMgY2FuIGhhcHBlbiBlLmcuIHdoZW46CisgKgktIEZpbGUgaGFzIGEgbGFyZ2UgbnVtYmVyIG9mIGhhcmQgbGlua3MgKGxvdHMgb2YgZmlsZSBuYW1lCisgKgkgIGF0dHJpYnV0ZXMgcHJlc2VudCkuCisgKgktIFRoZSBtYXBwaW5nIHBhaXJzIGFycmF5IG9mIHNvbWUgbm9uLXJlc2lkZW50IGF0dHJpYnV0ZSBiZWNvbWVzIHNvCisgKgkgIGxhcmdlIGR1ZSB0byBmcmFnbWVudGF0aW9uIHRoYXQgaXQgb3ZlcmZsb3dzIHRoZSBtZnQgcmVjb3JkLgorICoJLSBUaGUgc2VjdXJpdHkgZGVzY3JpcHRvciBpcyB2ZXJ5IGNvbXBsZXggKG5vdCBhcHBsaWNhYmxlIHRvCisgKgkgIE5URlMgMy4wIHZvbHVtZXMpLgorICoJLSBUaGVyZSBhcmUgbWFueSBuYW1lZCBzdHJlYW1zLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisvKk9mcyovCisvKiAgMCovCUFUVFJfVFlQRSB0eXBlOwkJLyogVHlwZSBvZiByZWZlcmVuY2VkIGF0dHJpYnV0ZS4gKi8KKy8qICA0Ki8JbGUxNiBsZW5ndGg7CQkvKiBCeXRlIHNpemUgb2YgdGhpcyBlbnRyeSAoOC1ieXRlIGFsaWduZWQpLiAqLworLyogIDYqLwl1OCBuYW1lX2xlbmd0aDsJCS8qIFNpemUgaW4gVW5pY29kZSBjaGFycyBvZiB0aGUgbmFtZSBvZiB0aGUKKwkJCQkgICBhdHRyaWJ1dGUgb3IgMCBpZiB1bm5hbWVkLiAqLworLyogIDcqLwl1OCBuYW1lX29mZnNldDsJCS8qIEJ5dGUgb2Zmc2V0IHRvIGJlZ2lubmluZyBvZiBhdHRyaWJ1dGUgbmFtZQorCQkJCSAgIChhbHdheXMgc2V0IHRoaXMgdG8gd2hlcmUgdGhlIG5hbWUgd291bGQKKwkJCQkgICBzdGFydCBldmVuIGlmIHVubmFtZWQpLiAqLworLyogIDgqLwlsZVZDTiBsb3dlc3RfdmNuOwkvKiBMb3dlc3QgdmlydHVhbCBjbHVzdGVyIG51bWJlciBvZiB0aGlzIHBvcnRpb24KKwkJCQkgICBvZiB0aGUgYXR0cmlidXRlIHZhbHVlLiBUaGlzIGlzIHVzdWFsbHkgMC4gSXQKKwkJCQkgICBpcyBub24temVybyBmb3IgdGhlIGNhc2Ugd2hlcmUgb25lIGF0dHJpYnV0ZQorCQkJCSAgIGRvZXMgbm90IGZpdCBpbnRvIG9uZSBtZnQgcmVjb3JkIGFuZCB0aHVzCisJCQkJICAgc2V2ZXJhbCBtZnQgcmVjb3JkcyBhcmUgYWxsb2NhdGVkIHRvIGhvbGQKKwkJCQkgICB0aGlzIGF0dHJpYnV0ZS4gSW4gdGhlIGxhdHRlciBjYXNlLCBlYWNoIG1mdAorCQkJCSAgIHJlY29yZCBob2xkcyBvbmUgZXh0ZW50IG9mIHRoZSBhdHRyaWJ1dGUgYW5kCisJCQkJICAgdGhlcmUgaXMgb25lIGF0dHJpYnV0ZSBsaXN0IGVudHJ5IGZvciBlYWNoCisJCQkJICAgZXh0ZW50LiBOT1RFOiBUaGlzIGlzIERFRklOSVRFTFkgYSBzaWduZWQKKwkJCQkgICB2YWx1ZSEgVGhlIHdpbmRvd3MgZHJpdmVyIHVzZXMgY21wLCBmb2xsb3dlZAorCQkJCSAgIGJ5IGpnIHdoZW4gY29tcGFyaW5nIHRoaXMsIHRodXMgaXQgdHJlYXRzIGl0CisJCQkJICAgYXMgc2lnbmVkLiAqLworLyogMTYqLwlsZU1GVF9SRUYgbWZ0X3JlZmVyZW5jZTsvKiBUaGUgcmVmZXJlbmNlIG9mIHRoZSBtZnQgcmVjb3JkIGhvbGRpbmcKKwkJCQkgICB0aGUgQVRUUl9SRUNPUkQgZm9yIHRoaXMgcG9ydGlvbiBvZiB0aGUKKwkJCQkgICBhdHRyaWJ1dGUgdmFsdWUuICovCisvKiAyNCovCWxlMTYgaW5zdGFuY2U7CQkvKiBJZiBsb3dlc3RfdmNuID0gMCwgdGhlIGluc3RhbmNlIG9mIHRoZQorCQkJCSAgIGF0dHJpYnV0ZSBiZWluZyByZWZlcmVuY2VkOyBvdGhlcndpc2UgMC4gKi8KKy8qIDI2Ki8JbnRmc2NoYXIgbmFtZVswXTsJLyogVXNlIHdoZW4gY3JlYXRpbmcgb25seS4gV2hlbiByZWFkaW5nIHVzZQorCQkJCSAgIG5hbWVfb2Zmc2V0IHRvIGRldGVybWluZSB0aGUgbG9jYXRpb24gb2YgdGhlCisJCQkJICAgbmFtZS4gKi8KKy8qIHNpemVvZigpID0gMjYgKyAoYXR0cmlidXRlX25hbWVfbGVuZ3RoICogMikgYnl0ZXMgKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBBVFRSX0xJU1RfRU5UUlk7CisKKy8qCisgKiBUaGUgbWF4aW11bSBhbGxvd2VkIGxlbmd0aCBmb3IgYSBmaWxlIG5hbWUuCisgKi8KKyNkZWZpbmUgTUFYSU1VTV9GSUxFX05BTUVfTEVOR1RICTI1NQorCisvKgorICogUG9zc2libGUgbmFtZXNwYWNlcyBmb3IgZmlsZW5hbWVzIGluIG50ZnMgKDgtYml0KS4KKyAqLworZW51bSB7CisJRklMRV9OQU1FX1BPU0lYCQk9IDB4MDAsCisJLyogVGhpcyBpcyB0aGUgbGFyZ2VzdCBuYW1lc3BhY2UuIEl0IGlzIGNhc2Ugc2Vuc2l0aXZlIGFuZCBhbGxvd3MgYWxsCisJICAgVW5pY29kZSBjaGFyYWN0ZXJzIGV4Y2VwdCBmb3I6ICdcMCcgYW5kICcvJy4gIEJld2FyZSB0aGF0IGluCisJICAgV2luTlQvMmsgZmlsZXMgd2hpY2ggZWcgaGF2ZSB0aGUgc2FtZSBuYW1lIGV4Y2VwdCBmb3IgdGhlaXIgY2FzZQorCSAgIHdpbGwgbm90IGJlIGRpc3Rpbmd1aXNoZWQgYnkgdGhlIHN0YW5kYXJkIHV0aWxpdGllcyBhbmQgdGh1cyBhICJkZWwKKwkgICBmaWxlbmFtZSIgd2lsbCBkZWxldGUgYm90aCAiZmlsZW5hbWUiIGFuZCAiZmlsZU5hbWUiIHdpdGhvdXQKKwkgICB3YXJuaW5nLiAqLworCUZJTEVfTkFNRV9XSU4zMgkJPSAweDAxLAorCS8qIFRoZSBzdGFuZGFyZCBXaW5OVC8yayBOVEZTIGxvbmcgZmlsZW5hbWVzLiBDYXNlIGluc2Vuc2l0aXZlLiAgQWxsCisJICAgVW5pY29kZSBjaGFycyBleGNlcHQ6ICdcMCcsICciJywgJyonLCAnLycsICc6JywgJzwnLCAnPicsICc/JywgJ1wnLAorCSAgIGFuZCAnfCcuICBGdXJ0aGVyLCBuYW1lcyBjYW5ub3QgZW5kIHdpdGggYSAnLicgb3IgYSBzcGFjZS4gKi8KKwlGSUxFX05BTUVfRE9TCQk9IDB4MDIsCisJLyogVGhlIHN0YW5kYXJkIERPUyBmaWxlbmFtZXMgKDguMyBmb3JtYXQpLiBVcHBlcmNhc2Ugb25seS4gIEFsbCA4LWJpdAorCSAgIGNoYXJhY3RlcnMgZ3JlYXRlciBzcGFjZSwgZXhjZXB0OiAnIicsICcqJywgJysnLCAnLCcsICcvJywgJzonLCAnOycsCisJICAgJzwnLCAnPScsICc+JywgJz8nLCBhbmQgJ1wnLiAqLworCUZJTEVfTkFNRV9XSU4zMl9BTkRfRE9TCT0gMHgwMywKKwkvKiAzIG1lYW5zIHRoYXQgYm90aCB0aGUgV2luMzIgYW5kIHRoZSBET1MgZmlsZW5hbWVzIGFyZSBpZGVudGljYWwgYW5kCisJICAgaGVuY2UgaGF2ZSBiZWVuIHNhdmVkIGluIHRoaXMgc2luZ2xlIGZpbGVuYW1lIHJlY29yZC4gKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKwordHlwZWRlZiB1OCBGSUxFX05BTUVfVFlQRV9GTEFHUzsKKworLyoKKyAqIEF0dHJpYnV0ZTogRmlsZW5hbWUgKDB4MzApLgorICoKKyAqIE5PVEU6IEFsd2F5cyByZXNpZGVudC4KKyAqIE5PVEU6IEFsbCBmaWVsZHMsIGV4Y2VwdCB0aGUgcGFyZW50X2RpcmVjdG9yeSwgYXJlIG9ubHkgdXBkYXRlZCB3aGVuIHRoZQorICoJIGZpbGVuYW1lIGlzIGNoYW5nZWQuIFVudGlsIHRoZW4sIHRoZXkganVzdCBiZWNvbWUgb3V0IG9mIHN5bmMgd2l0aAorICoJIHJlYWxpdHkgYW5kIHRoZSBtb3JlIHVwIHRvIGRhdGUgdmFsdWVzIGFyZSBwcmVzZW50IGluIHRoZSBzdGFuZGFyZAorICoJIGluZm9ybWF0aW9uIGF0dHJpYnV0ZS4KKyAqIE5PVEU6IFRoZXJlIGlzIGNvbmZsaWN0aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtZWFuaW5nIG9mIGVhY2ggb2YgdGhlIHRpbWUKKyAqCSBmaWVsZHMgYnV0IHRoZSBtZWFuaW5nIGFzIGRlZmluZWQgYmVsb3cgaGFzIGJlZW4gdmVyaWZpZWQgdG8gYmUKKyAqCSBjb3JyZWN0IGJ5IHByYWN0aWNhbCBleHBlcmltZW50YXRpb24gb24gV2luZG93cyBOVDQgU1A2YSBhbmQgaXMgaGVuY2UKKyAqCSBhc3N1bWVkIHRvIGJlIHRoZSBvbmUgYW5kIG9ubHkgY29ycmVjdCBpbnRlcnByZXRhdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworLypoZXggb2ZzKi8KKy8qICAwKi8JbGVNRlRfUkVGIHBhcmVudF9kaXJlY3Rvcnk7CS8qIERpcmVjdG9yeSB0aGlzIGZpbGVuYW1lIGlzCisJCQkJCSAgIHJlZmVyZW5jZWQgZnJvbS4gKi8KKy8qICA4Ki8Jc2xlNjQgY3JlYXRpb25fdGltZTsJCS8qIFRpbWUgZmlsZSB3YXMgY3JlYXRlZC4gKi8KKy8qIDEwKi8Jc2xlNjQgbGFzdF9kYXRhX2NoYW5nZV90aW1lOwkvKiBUaW1lIHRoZSBkYXRhIGF0dHJpYnV0ZSB3YXMgbGFzdAorCQkJCQkgICBtb2RpZmllZC4gKi8KKy8qIDE4Ki8Jc2xlNjQgbGFzdF9tZnRfY2hhbmdlX3RpbWU7CS8qIFRpbWUgdGhpcyBtZnQgcmVjb3JkIHdhcyBsYXN0CisJCQkJCSAgIG1vZGlmaWVkLiAqLworLyogMjAqLwlzbGU2NCBsYXN0X2FjY2Vzc190aW1lOwkJLyogVGltZSB0aGlzIG1mdCByZWNvcmQgd2FzIGxhc3QKKwkJCQkJICAgYWNjZXNzZWQuICovCisvKiAyOCovCXNsZTY0IGFsbG9jYXRlZF9zaXplOwkJLyogQnl0ZSBzaXplIG9mIGFsbG9jYXRlZCBzcGFjZSBmb3IgdGhlCisJCQkJCSAgIGRhdGEgYXR0cmlidXRlLiBOT1RFOiBJcyBhIG11bHRpcGxlCisJCQkJCSAgIG9mIHRoZSBjbHVzdGVyIHNpemUuICovCisvKiAzMCovCXNsZTY0IGRhdGFfc2l6ZTsJCS8qIEJ5dGUgc2l6ZSBvZiBhY3R1YWwgZGF0YSBpbiBkYXRhCisJCQkJCSAgIGF0dHJpYnV0ZS4gKi8KKy8qIDM4Ki8JRklMRV9BVFRSX0ZMQUdTIGZpbGVfYXR0cmlidXRlczsJLyogRmxhZ3MgZGVzY3JpYmluZyB0aGUgZmlsZS4gKi8KKy8qIDNjKi8JdW5pb24geworCS8qIDNjKi8Jc3RydWN0IHsKKwkJLyogM2MqLwlsZTE2IHBhY2tlZF9lYV9zaXplOwkvKiBTaXplIG9mIHRoZSBidWZmZXIgbmVlZGVkIHRvCisJCQkJCQkgICBwYWNrIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGVzCisJCQkJCQkgICAoRUFzKSwgaWYgc3VjaCBhcmUgcHJlc2VudC4qLworCQkvKiAzZSovCWxlMTYgcmVzZXJ2ZWQ7CQkvKiBSZXNlcnZlZCBmb3IgYWxpZ25tZW50LiAqLworCQl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgZWE7CisJLyogM2MqLwlzdHJ1Y3QgeworCQkvKiAzYyovCWxlMzIgcmVwYXJzZV9wb2ludF90YWc7CS8qIFR5cGUgb2YgcmVwYXJzZSBwb2ludCwKKwkJCQkJCSAgIHByZXNlbnQgb25seSBpbiByZXBhcnNlCisJCQkJCQkgICBwb2ludHMgYW5kIG9ubHkgaWYgdGhlcmUgYXJlCisJCQkJCQkgICBubyBFQXMuICovCisJCX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBycDsKKwl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgdHlwZTsKKy8qIDQwKi8JdTggZmlsZV9uYW1lX2xlbmd0aDsJCQkvKiBMZW5ndGggb2YgZmlsZSBuYW1lIGluCisJCQkJCQkgICAoVW5pY29kZSkgY2hhcmFjdGVycy4gKi8KKy8qIDQxKi8JRklMRV9OQU1FX1RZUEVfRkxBR1MgZmlsZV9uYW1lX3R5cGU7CS8qIE5hbWVzcGFjZSBvZiB0aGUgZmlsZSBuYW1lLiovCisvKiA0MiovCW50ZnNjaGFyIGZpbGVfbmFtZVswXTsJCQkvKiBGaWxlIG5hbWUgaW4gVW5pY29kZS4gKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBGSUxFX05BTUVfQVRUUjsKKworLyoKKyAqIEdVSUQgc3RydWN0dXJlcyBzdG9yZSBnbG9iYWxseSB1bmlxdWUgaWRlbnRpZmllcnMgKEdVSUQpLiBBIEdVSUQgaXMgYQorICogMTI4LWJpdCB2YWx1ZSBjb25zaXN0aW5nIG9mIG9uZSBncm91cCBvZiBlaWdodCBoZXhhZGVjaW1hbCBkaWdpdHMsIGZvbGxvd2VkCisgKiBieSB0aHJlZSBncm91cHMgb2YgZm91ciBoZXhhZGVjaW1hbCBkaWdpdHMgZWFjaCwgZm9sbG93ZWQgYnkgb25lIGdyb3VwIG9mCisgKiB0d2VsdmUgaGV4YWRlY2ltYWwgZGlnaXRzLiBHVUlEcyBhcmUgTWljcm9zb2Z0J3MgaW1wbGVtZW50YXRpb24gb2YgdGhlCisgKiBkaXN0cmlidXRlZCBjb21wdXRpbmcgZW52aXJvbm1lbnQgKERDRSkgdW5pdmVyc2FsbHkgdW5pcXVlIGlkZW50aWZpZXIgKFVVSUQpLgorICogRXhhbXBsZSBvZiBhIEdVSUQ6CisgKgkxRjAxMDc2OC01QTczLUJDOTEtMDAxMEE1MjIxNkE3CisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlsZTMyIGRhdGExOwkvKiBUaGUgZmlyc3QgZWlnaHQgaGV4YWRlY2ltYWwgZGlnaXRzIG9mIHRoZSBHVUlELiAqLworCWxlMTYgZGF0YTI7CS8qIFRoZSBmaXJzdCBncm91cCBvZiBmb3VyIGhleGFkZWNpbWFsIGRpZ2l0cy4gKi8KKwlsZTE2IGRhdGEzOwkvKiBUaGUgc2Vjb25kIGdyb3VwIG9mIGZvdXIgaGV4YWRlY2ltYWwgZGlnaXRzLiAqLworCXU4IGRhdGE0WzhdOwkvKiBUaGUgZmlyc3QgdHdvIGJ5dGVzIGFyZSB0aGUgdGhpcmQgZ3JvdXAgb2YgZm91cgorCQkJICAgaGV4YWRlY2ltYWwgZGlnaXRzLiBUaGUgcmVtYWluaW5nIHNpeCBieXRlcyBhcmUgdGhlCisJCQkgICBmaW5hbCAxMiBoZXhhZGVjaW1hbCBkaWdpdHMuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgR1VJRDsKKworLyoKKyAqIEZJTEVfRXh0ZW5kLyRPYmpJZCBjb250YWlucyBhbiBpbmRleCBuYW1lZCAkTy4gVGhpcyBpbmRleCBjb250YWlucyBhbGwKKyAqIG9iamVjdF9pZHMgcHJlc2VudCBvbiB0aGUgdm9sdW1lIGFzIHRoZSBpbmRleCBrZXlzIGFuZCB0aGUgY29ycmVzcG9uZGluZworICogbWZ0X3JlY29yZCBudW1iZXJzIGFzIHRoZSBpbmRleCBlbnRyeSBkYXRhIHBhcnRzLiBUaGUgZGF0YSBwYXJ0IChkZWZpbmVkCisgKiBiZWxvdykgYWxzbyBjb250YWlucyB0aHJlZSBvdGhlciBvYmplY3RfaWRzOgorICoJYmlydGhfdm9sdW1lX2lkIC0gb2JqZWN0X2lkIG9mIEZJTEVfVm9sdW1lIG9uIHdoaWNoIHRoZSBmaWxlIHdhcyBmaXJzdAorICoJCQkgIGNyZWF0ZWQuIE9wdGlvbmFsIChpLmUuIGNhbiBiZSB6ZXJvKS4KKyAqCWJpcnRoX29iamVjdF9pZCAtIG9iamVjdF9pZCBvZiBmaWxlIHdoZW4gaXQgd2FzIGZpcnN0IGNyZWF0ZWQuIFVzdWFsbHkKKyAqCQkJICBlcXVhbHMgdGhlIG9iamVjdF9pZC4gT3B0aW9uYWwgKGkuZS4gY2FuIGJlIHplcm8pLgorICoJZG9tYWluX2lkCS0gUmVzZXJ2ZWQgKGFsd2F5cyB6ZXJvKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWxlTUZUX1JFRiBtZnRfcmVmZXJlbmNlOy8qIE1mdCByZWNvcmQgY29udGFpbmluZyB0aGUgb2JqZWN0X2lkIGluCisJCQkJICAgdGhlIGluZGV4IGVudHJ5IGtleS4gKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlHVUlEIGJpcnRoX3ZvbHVtZV9pZDsKKwkJCUdVSUQgYmlydGhfb2JqZWN0X2lkOworCQkJR1VJRCBkb21haW5faWQ7CisJCX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBvcmlnaW47CisJCXU4IGV4dGVuZGVkX2luZm9bNDhdOworCX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBvcHQ7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgT0JKX0lEX0lOREVYX0RBVEE7CisKKy8qCisgKiBBdHRyaWJ1dGU6IE9iamVjdCBpZCAoTlRGUyAzLjArKSAoMHg0MCkuCisgKgorICogTk9URTogQWx3YXlzIHJlc2lkZW50LgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJR1VJRCBvYmplY3RfaWQ7CQkJCS8qIFVuaXF1ZSBpZCBhc3NpZ25lZCB0byB0aGUKKwkJCQkJCSAgIGZpbGUuKi8KKwkvKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgb3B0aW9uYWwuIFRoZSBhdHRyaWJ1dGUgdmFsdWUgc2l6ZSBpcyAxNgorCSAgIGJ5dGVzLCBpLmUuIHNpemVvZihHVUlEKSwgaWYgdGhlc2UgYXJlIG5vdCBwcmVzZW50IGF0IGFsbC4gTm90ZSwKKwkgICB0aGUgZW50cmllcyBjYW4gYmUgcHJlc2VudCBidXQgb25lIG9yIG1vcmUgKG9yIGFsbCkgY2FuIGJlIHplcm8KKwkgICBtZWFuaW5nIHRoYXQgdGhhdCBwYXJ0aWN1bGFyIHZhbHVlKHMpIGlzKGFyZSkgbm90IGRlZmluZWQuICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJR1VJRCBiaXJ0aF92b2x1bWVfaWQ7CS8qIFVuaXF1ZSBpZCBvZiB2b2x1bWUgb24gd2hpY2gKKwkJCQkJCSAgIHRoZSBmaWxlIHdhcyBmaXJzdCBjcmVhdGVkLiovCisJCQlHVUlEIGJpcnRoX29iamVjdF9pZDsJLyogVW5pcXVlIGlkIG9mIGZpbGUgd2hlbiBpdCB3YXMKKwkJCQkJCSAgIGZpcnN0IGNyZWF0ZWQuICovCisJCQlHVUlEIGRvbWFpbl9pZDsJCS8qIFJlc2VydmVkLCB6ZXJvLiAqLworCQl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgb3JpZ2luOworCQl1OCBleHRlbmRlZF9pbmZvWzQ4XTsKKwl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgb3B0OworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIE9CSkVDVF9JRF9BVFRSOworCisvKgorICogVGhlIHByZS1kZWZpbmVkIElERU5USUZJRVJfQVVUSE9SSVRJRVMgdXNlZCBhcyBTSURfSURFTlRJRklFUl9BVVRIT1JJVFkgaW4KKyAqIHRoZSBTSUQgc3RydWN0dXJlIChzZWUgYmVsb3cpLgorICovCisvL3R5cGVkZWYgZW51bSB7CQkJCQkvKiBTSUQgc3RyaW5nIHByZWZpeC4gKi8KKy8vCVNFQ1VSSVRZX05VTExfU0lEX0FVVEhPUklUWQk9IHswLCAwLCAwLCAwLCAwLCAwfSwJLyogUy0xLTAgKi8KKy8vCVNFQ1VSSVRZX1dPUkxEX1NJRF9BVVRIT1JJVFkJPSB7MCwgMCwgMCwgMCwgMCwgMX0sCS8qIFMtMS0xICovCisvLwlTRUNVUklUWV9MT0NBTF9TSURfQVVUSE9SSVRZCT0gezAsIDAsIDAsIDAsIDAsIDJ9LAkvKiBTLTEtMiAqLworLy8JU0VDVVJJVFlfQ1JFQVRPUl9TSURfQVVUSE9SSVRZCT0gezAsIDAsIDAsIDAsIDAsIDN9LAkvKiBTLTEtMyAqLworLy8JU0VDVVJJVFlfTk9OX1VOSVFVRV9BVVRIT1JJVFkJPSB7MCwgMCwgMCwgMCwgMCwgNH0sCS8qIFMtMS00ICovCisvLwlTRUNVUklUWV9OVF9TSURfQVVUSE9SSVRZCT0gezAsIDAsIDAsIDAsIDAsIDV9LAkvKiBTLTEtNSAqLworLy99IElERU5USUZJRVJfQVVUSE9SSVRJRVM7CisKKy8qCisgKiBUaGVzZSByZWxhdGl2ZSBpZGVudGlmaWVycyAoUklEcykgYXJlIHVzZWQgd2l0aCB0aGUgYWJvdmUgaWRlbnRpZmllcgorICogYXV0aG9yaXRpZXMgdG8gbWFrZSB1cCB1bml2ZXJzYWwgd2VsbC1rbm93biBTSURzLgorICoKKyAqIE5vdGU6IFRoZSByZWxhdGl2ZSBpZGVudGlmaWVyIChSSUQpIHJlZmVycyB0byB0aGUgcG9ydGlvbiBvZiBhIFNJRCwgd2hpY2gKKyAqIGlkZW50aWZpZXMgYSB1c2VyIG9yIGdyb3VwIGluIHJlbGF0aW9uIHRvIHRoZSBhdXRob3JpdHkgdGhhdCBpc3N1ZWQgdGhlIFNJRC4KKyAqIEZvciBleGFtcGxlLCB0aGUgdW5pdmVyc2FsIHdlbGwta25vd24gU0lEIENyZWF0b3IgT3duZXIgSUQgKFMtMS0zLTApIGlzCisgKiBtYWRlIHVwIG9mIHRoZSBpZGVudGlmaWVyIGF1dGhvcml0eSBTRUNVUklUWV9DUkVBVE9SX1NJRF9BVVRIT1JJVFkgKDMpIGFuZAorICogdGhlIHJlbGF0aXZlIGlkZW50aWZpZXIgU0VDVVJJVFlfQ1JFQVRPUl9PV05FUl9SSUQgKDApLgorICovCit0eXBlZGVmIGVudW0gewkJCQkJLyogSWRlbnRpZmllciBhdXRob3JpdHkuICovCisJU0VDVVJJVFlfTlVMTF9SSUQJCSAgPSAwLAkvKiBTLTEtMCAqLworCVNFQ1VSSVRZX1dPUkxEX1JJRAkJICA9IDAsCS8qIFMtMS0xICovCisJU0VDVVJJVFlfTE9DQUxfUklECQkgID0gMCwJLyogUy0xLTIgKi8KKworCVNFQ1VSSVRZX0NSRUFUT1JfT1dORVJfUklECSAgPSAwLAkvKiBTLTEtMyAqLworCVNFQ1VSSVRZX0NSRUFUT1JfR1JPVVBfUklECSAgPSAxLAkvKiBTLTEtMyAqLworCisJU0VDVVJJVFlfQ1JFQVRPUl9PV05FUl9TRVJWRVJfUklEID0gMiwJLyogUy0xLTMgKi8KKwlTRUNVUklUWV9DUkVBVE9SX0dST1VQX1NFUlZFUl9SSUQgPSAzLAkvKiBTLTEtMyAqLworCisJU0VDVVJJVFlfRElBTFVQX1JJRAkJICA9IDEsCisJU0VDVVJJVFlfTkVUV09SS19SSUQJCSAgPSAyLAorCVNFQ1VSSVRZX0JBVENIX1JJRAkJICA9IDMsCisJU0VDVVJJVFlfSU5URVJBQ1RJVkVfUklECSAgPSA0LAorCVNFQ1VSSVRZX1NFUlZJQ0VfUklECQkgID0gNiwKKwlTRUNVUklUWV9BTk9OWU1PVVNfTE9HT05fUklECSAgPSA3LAorCVNFQ1VSSVRZX1BST1hZX1JJRAkJICA9IDgsCisJU0VDVVJJVFlfRU5URVJQUklTRV9DT05UUk9MTEVSU19SSUQ9OSwKKwlTRUNVUklUWV9TRVJWRVJfTE9HT05fUklECSAgPSA5LAorCVNFQ1VSSVRZX1BSSU5DSVBBTF9TRUxGX1JJRAkgID0gMHhhLAorCVNFQ1VSSVRZX0FVVEhFTlRJQ0FURURfVVNFUl9SSUQJICA9IDB4YiwKKwlTRUNVUklUWV9SRVNUUklDVEVEX0NPREVfUklECSAgPSAweGMsCisJU0VDVVJJVFlfVEVSTUlOQUxfU0VSVkVSX1JJRAkgID0gMHhkLAorCisJU0VDVVJJVFlfTE9HT05fSURTX1JJRAkJICA9IDUsCisJU0VDVVJJVFlfTE9HT05fSURTX1JJRF9DT1VOVAkgID0gMywKKworCVNFQ1VSSVRZX0xPQ0FMX1NZU1RFTV9SSUQJICA9IDB4MTIsCisKKwlTRUNVUklUWV9OVF9OT05fVU5JUVVFCQkgID0gMHgxNSwKKworCVNFQ1VSSVRZX0JVSUxUSU5fRE9NQUlOX1JJRAkgID0gMHgyMCwKKworCS8qCisJICogV2VsbC1rbm93biBkb21haW4gcmVsYXRpdmUgc3ViLWF1dGhvcml0eSB2YWx1ZXMgKFJJRHMpLgorCSAqLworCisJLyogVXNlcnMuICovCisJRE9NQUlOX1VTRVJfUklEX0FETUlOCQkgID0gMHgxZjQsCisJRE9NQUlOX1VTRVJfUklEX0dVRVNUCQkgID0gMHgxZjUsCisJRE9NQUlOX1VTRVJfUklEX0tSQlRHVAkJICA9IDB4MWY2LAorCisJLyogR3JvdXBzLiAqLworCURPTUFJTl9HUk9VUF9SSURfQURNSU5TCQkgID0gMHgyMDAsCisJRE9NQUlOX0dST1VQX1JJRF9VU0VSUwkJICA9IDB4MjAxLAorCURPTUFJTl9HUk9VUF9SSURfR1VFU1RTCQkgID0gMHgyMDIsCisJRE9NQUlOX0dST1VQX1JJRF9DT01QVVRFUlMJICA9IDB4MjAzLAorCURPTUFJTl9HUk9VUF9SSURfQ09OVFJPTExFUlMJICA9IDB4MjA0LAorCURPTUFJTl9HUk9VUF9SSURfQ0VSVF9BRE1JTlMJICA9IDB4MjA1LAorCURPTUFJTl9HUk9VUF9SSURfU0NIRU1BX0FETUlOUwkgID0gMHgyMDYsCisJRE9NQUlOX0dST1VQX1JJRF9FTlRFUlBSSVNFX0FETUlOUz0gMHgyMDcsCisJRE9NQUlOX0dST1VQX1JJRF9QT0xJQ1lfQURNSU5TCSAgPSAweDIwOCwKKworCS8qIEFsaWFzZXMuICovCisJRE9NQUlOX0FMSUFTX1JJRF9BRE1JTlMJCSAgPSAweDIyMCwKKwlET01BSU5fQUxJQVNfUklEX1VTRVJTCQkgID0gMHgyMjEsCisJRE9NQUlOX0FMSUFTX1JJRF9HVUVTVFMJCSAgPSAweDIyMiwKKwlET01BSU5fQUxJQVNfUklEX1BPV0VSX1VTRVJTCSAgPSAweDIyMywKKworCURPTUFJTl9BTElBU19SSURfQUNDT1VOVF9PUFMJICA9IDB4MjI0LAorCURPTUFJTl9BTElBU19SSURfU1lTVEVNX09QUwkgID0gMHgyMjUsCisJRE9NQUlOX0FMSUFTX1JJRF9QUklOVF9PUFMJICA9IDB4MjI2LAorCURPTUFJTl9BTElBU19SSURfQkFDS1VQX09QUwkgID0gMHgyMjcsCisKKwlET01BSU5fQUxJQVNfUklEX1JFUExJQ0FUT1IJICA9IDB4MjI4LAorCURPTUFJTl9BTElBU19SSURfUkFTX1NFUlZFUlMJICA9IDB4MjI5LAorCURPTUFJTl9BTElBU19SSURfUFJFVzJLQ09NUEFDQ0VTUyA9IDB4MjJhLAorfSBSRUxBVElWRV9JREVOVElGSUVSUzsKKworLyoKKyAqIFRoZSB1bml2ZXJzYWwgd2VsbC1rbm93biBTSURzOgorICoKKyAqCU5VTExfU0lECQkJUy0xLTAtMAorICoJV09STERfU0lECQkJUy0xLTEtMAorICoJTE9DQUxfU0lECQkJUy0xLTItMAorICoJQ1JFQVRPUl9PV05FUl9TSUQJCVMtMS0zLTAKKyAqCUNSRUFUT1JfR1JPVVBfU0lECQlTLTEtMy0xCisgKglDUkVBVE9SX09XTkVSX1NFUlZFUl9TSUQJUy0xLTMtMgorICoJQ1JFQVRPUl9HUk9VUF9TRVJWRVJfU0lECVMtMS0zLTMKKyAqCisgKgkoTm9uLXVuaXF1ZSBJRHMpCQlTLTEtNAorICoKKyAqIE5UIHdlbGwta25vd24gU0lEczoKKyAqCisgKglOVF9BVVRIT1JJVFlfU0lECVMtMS01CisgKglESUFMVVBfU0lECQlTLTEtNS0xCisgKgorICoJTkVUV09SRF9TSUQJCVMtMS01LTIKKyAqCUJBVENIX1NJRAkJUy0xLTUtMworICoJSU5URVJBQ1RJVkVfU0lECQlTLTEtNS00CisgKglTRVJWSUNFX1NJRAkJUy0xLTUtNgorICoJQU5PTllNT1VTX0xPR09OX1NJRAlTLTEtNS03CQkoYWthIG51bGwgbG9nb24gc2Vzc2lvbikKKyAqCVBST1hZX1NJRAkJUy0xLTUtOAorICoJU0VSVkVSX0xPR09OX1NJRAlTLTEtNS05CQkoYWthIGRvbWFpbiBjb250cm9sbGVyIGFjY291bnQpCisgKglTRUxGX1NJRAkJUy0xLTUtMTAJKHNlbGYgUklEKQorICoJQVVUSEVOVElDQVRFRF9VU0VSX1NJRAlTLTEtNS0xMQorICoJUkVTVFJJQ1RFRF9DT0RFX1NJRAlTLTEtNS0xMgkocnVubmluZyByZXN0cmljdGVkIGNvZGUpCisgKglURVJNSU5BTF9TRVJWRVJfU0lECVMtMS01LTEzCShydW5uaW5nIG9uIHRlcm1pbmFsIHNlcnZlcikKKyAqCisgKgkoTG9nb24gSURzKQkJUy0xLTUtNS1YLVkKKyAqCisgKgkoTlQgbm9uLXVuaXF1ZSBJRHMpCVMtMS01LTB4MTUtLi4uCisgKgorICoJKEJ1aWx0LWluIGRvbWFpbikJUy0xLTUtMHgyMAorICovCisKKy8qCisgKiBUaGUgU0lEX0lERU5USUZJRVJfQVVUSE9SSVRZIGlzIGEgNDgtYml0IHZhbHVlIHVzZWQgaW4gdGhlIFNJRCBzdHJ1Y3R1cmUuCisgKgorICogTk9URTogVGhpcyBpcyBzdG9yZWQgYXMgYSBiaWcgZW5kaWFuIG51bWJlciwgaGVuY2UgdGhlIGhpZ2hfcGFydCBjb21lcworICogYmVmb3JlIHRoZSBsb3dfcGFydC4KKyAqLwordHlwZWRlZiB1bmlvbiB7CisJc3RydWN0IHsKKwkJdTE2IGhpZ2hfcGFydDsJLyogSGlnaCAxNi1iaXRzLiAqLworCQl1MzIgbG93X3BhcnQ7CS8qIExvdyAzMi1iaXRzLiAqLworCX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBwYXJ0czsKKwl1OCB2YWx1ZVs2XTsJCS8qIFZhbHVlIGFzIGluZGl2aWR1YWwgYnl0ZXMuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgU0lEX0lERU5USUZJRVJfQVVUSE9SSVRZOworCisvKgorICogVGhlIFNJRCBzdHJ1Y3R1cmUgaXMgYSB2YXJpYWJsZS1sZW5ndGggc3RydWN0dXJlIHVzZWQgdG8gdW5pcXVlbHkgaWRlbnRpZnkKKyAqIHVzZXJzIG9yIGdyb3Vwcy4gU0lEIHN0YW5kcyBmb3Igc2VjdXJpdHkgaWRlbnRpZmllci4KKyAqCisgKiBUaGUgc3RhbmRhcmQgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgU0lEIGlzIG9mIHRoZSBmb3JtOgorICoJUy1SLUktUy1TLi4uCisgKiBXaGVyZToKKyAqICAgIC0gVGhlIGZpcnN0ICJTIiBpcyB0aGUgbGl0ZXJhbCBjaGFyYWN0ZXIgJ1MnIGlkZW50aWZ5aW5nIHRoZSBmb2xsb3dpbmcKKyAqCWRpZ2l0cyBhcyBhIFNJRC4KKyAqICAgIC0gUiBpcyB0aGUgcmV2aXNpb24gbGV2ZWwgb2YgdGhlIFNJRCBleHByZXNzZWQgYXMgYSBzZXF1ZW5jZSBvZiBkaWdpdHMKKyAqCWVpdGhlciBpbiBkZWNpbWFsIG9yIGhleGFkZWNpbWFsIChpZiB0aGUgbGF0ZXIsIHByZWZpeGVkIGJ5ICIweCIpLgorICogICAgLSBJIGlzIHRoZSA0OC1iaXQgaWRlbnRpZmllcl9hdXRob3JpdHksIGV4cHJlc3NlZCBhcyBkaWdpdHMgYXMgUiBhYm92ZS4KKyAqICAgIC0gUy4uLiBpcyBvbmUgb3IgbW9yZSBzdWJfYXV0aG9yaXR5IHZhbHVlcywgZXhwcmVzc2VkIGFzIGRpZ2l0cyBhcyBhYm92ZS4KKyAqCisgKiBFeGFtcGxlIFNJRDsgdGhlIGRvbWFpbi1yZWxhdGl2ZSBTSUQgb2YgdGhlIGxvY2FsIEFkbWluaXN0cmF0b3JzIGdyb3VwIG9uCisgKiBXaW5kb3dzIE5ULzJrOgorICoJUy0xLTUtMzItNTQ0CisgKiBUaGlzIHRyYW5zbGF0ZXMgdG8gYSBTSUQgd2l0aDoKKyAqCXJldmlzaW9uID0gMSwKKyAqCXN1Yl9hdXRob3JpdHlfY291bnQgPSAyLAorICoJaWRlbnRpZmllcl9hdXRob3JpdHkgPSB7MCwwLDAsMCwwLDV9LAkvLyBTRUNVUklUWV9OVF9BVVRIT1JJVFkKKyAqCXN1Yl9hdXRob3JpdHlbMF0gPSAzMiwJCQkvLyBTRUNVUklUWV9CVUlMVElOX0RPTUFJTl9SSUQKKyAqCXN1Yl9hdXRob3JpdHlbMV0gPSA1NDQJCQkvLyBET01BSU5fQUxJQVNfUklEX0FETUlOUworICovCit0eXBlZGVmIHN0cnVjdCB7CisJdTggcmV2aXNpb247CisJdTggc3ViX2F1dGhvcml0eV9jb3VudDsKKwlTSURfSURFTlRJRklFUl9BVVRIT1JJVFkgaWRlbnRpZmllcl9hdXRob3JpdHk7CisJbGUzMiBzdWJfYXV0aG9yaXR5WzFdOwkJLyogQXQgbGVhc3Qgb25lIHN1Yl9hdXRob3JpdHkuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgU0lEOworCisvKgorICogQ3VycmVudCBjb25zdGFudHMgZm9yIFNJRHMuCisgKi8KK3R5cGVkZWYgZW51bSB7CisJU0lEX1JFVklTSU9OCQkJPSAgMSwJLyogQ3VycmVudCByZXZpc2lvbiBsZXZlbC4gKi8KKwlTSURfTUFYX1NVQl9BVVRIT1JJVElFUwkJPSAxNSwJLyogTWF4aW11bSBudW1iZXIgb2YgdGhvc2UuICovCisJU0lEX1JFQ09NTUVOREVEX1NVQl9BVVRIT1JJVElFUwk9ICAxLAkvKiBXaWxsIGNoYW5nZSB0byBhcm91bmQgNiBpbgorCQkJCQkJICAgYSBmdXR1cmUgcmV2aXNpb24uICovCit9IFNJRF9DT05TVEFOVFM7CisKKy8qCisgKiBUaGUgcHJlZGVmaW5lZCBBQ0UgdHlwZXMgKDgtYml0LCBzZWUgYmVsb3cpLgorICovCitlbnVtIHsKKwlBQ0NFU1NfTUlOX01TX0FDRV9UWVBFCQk9IDAsCisJQUNDRVNTX0FMTE9XRURfQUNFX1RZUEUJCT0gMCwKKwlBQ0NFU1NfREVOSUVEX0FDRV9UWVBFCQk9IDEsCisJU1lTVEVNX0FVRElUX0FDRV9UWVBFCQk9IDIsCisJU1lTVEVNX0FMQVJNX0FDRV9UWVBFCQk9IDMsIC8qIE5vdCBpbXBsZW1lbnRlZCBhcyBvZiBXaW4yay4gKi8KKwlBQ0NFU1NfTUFYX01TX1YyX0FDRV9UWVBFCT0gMywKKworCUFDQ0VTU19BTExPV0VEX0NPTVBPVU5EX0FDRV9UWVBFPSA0LAorCUFDQ0VTU19NQVhfTVNfVjNfQUNFX1RZUEUJPSA0LAorCisJLyogVGhlIGZvbGxvd2luZyBhcmUgV2luMmsgb25seS4gKi8KKwlBQ0NFU1NfTUlOX01TX09CSkVDVF9BQ0VfVFlQRQk9IDUsCisJQUNDRVNTX0FMTE9XRURfT0JKRUNUX0FDRV9UWVBFCT0gNSwKKwlBQ0NFU1NfREVOSUVEX09CSkVDVF9BQ0VfVFlQRQk9IDYsCisJU1lTVEVNX0FVRElUX09CSkVDVF9BQ0VfVFlQRQk9IDcsCisJU1lTVEVNX0FMQVJNX09CSkVDVF9BQ0VfVFlQRQk9IDgsCisJQUNDRVNTX01BWF9NU19PQkpFQ1RfQUNFX1RZUEUJPSA4LAorCisJQUNDRVNTX01BWF9NU19WNF9BQ0VfVFlQRQk9IDgsCisKKwkvKiBUaGlzIG9uZSBpcyBmb3IgV2luTlQvMmsuICovCisJQUNDRVNTX01BWF9NU19BQ0VfVFlQRQkJPSA4LAorfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCit0eXBlZGVmIHU4IEFDRV9UWVBFUzsKKworLyoKKyAqIFRoZSBBQ0UgZmxhZ3MgKDgtYml0KSBmb3IgYXVkaXQgYW5kIGluaGVyaXRhbmNlIChzZWUgYmVsb3cpLgorICoKKyAqIFNVQ0NFU1NGVUxfQUNDRVNTX0FDRV9GTEFHIGlzIG9ubHkgdXNlZCB3aXRoIHN5c3RlbSBhdWRpdCBhbmQgYWxhcm0gQUNFCisgKiB0eXBlcyB0byBpbmRpY2F0ZSB0aGF0IGEgbWVzc2FnZSBpcyBnZW5lcmF0ZWQgKGluIFdpbmRvd3MhKSBmb3Igc3VjY2Vzc2Z1bAorICogYWNjZXNzZXMuCisgKgorICogRkFJTEVEX0FDQ0VTU19BQ0VfRkxBRyBpcyBvbmx5IHVzZWQgd2l0aCBzeXN0ZW0gYXVkaXQgYW5kIGFsYXJtIEFDRSB0eXBlcworICogdG8gaW5kaWNhdGUgdGhhdCBhIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkIChpbiBXaW5kb3dzISkgZm9yIGZhaWxlZCBhY2Nlc3Nlcy4KKyAqLworZW51bSB7CisJLyogVGhlIGluaGVyaXRhbmNlIGZsYWdzLiAqLworCU9CSkVDVF9JTkhFUklUX0FDRQkJPSAweDAxLAorCUNPTlRBSU5FUl9JTkhFUklUX0FDRQkJPSAweDAyLAorCU5PX1BST1BBR0FURV9JTkhFUklUX0FDRQk9IDB4MDQsCisJSU5IRVJJVF9PTkxZX0FDRQkJPSAweDA4LAorCUlOSEVSSVRFRF9BQ0UJCQk9IDB4MTAsCS8qIFdpbjJrIG9ubHkuICovCisJVkFMSURfSU5IRVJJVF9GTEFHUwkJPSAweDFmLAorCisJLyogVGhlIGF1ZGl0IGZsYWdzLiAqLworCVNVQ0NFU1NGVUxfQUNDRVNTX0FDRV9GTEFHCT0gMHg0MCwKKwlGQUlMRURfQUNDRVNTX0FDRV9GTEFHCQk9IDB4ODAsCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3R5cGVkZWYgdTggQUNFX0ZMQUdTOworCisvKgorICogQW4gQUNFIGlzIGFuIGFjY2Vzcy1jb250cm9sIGVudHJ5IGluIGFuIGFjY2Vzcy1jb250cm9sIGxpc3QgKEFDTCkuCisgKiBBbiBBQ0UgZGVmaW5lcyBhY2Nlc3MgdG8gYW4gb2JqZWN0IGZvciBhIHNwZWNpZmljIHVzZXIgb3IgZ3JvdXAgb3IgZGVmaW5lcworICogdGhlIHR5cGVzIG9mIGFjY2VzcyB0aGF0IGdlbmVyYXRlIHN5c3RlbS1hZG1pbmlzdHJhdGlvbiBtZXNzYWdlcyBvciBhbGFybXMKKyAqIGZvciBhIHNwZWNpZmljIHVzZXIgb3IgZ3JvdXAuIFRoZSB1c2VyIG9yIGdyb3VwIGlzIGlkZW50aWZpZWQgYnkgYSBzZWN1cml0eQorICogaWRlbnRpZmllciAoU0lEKS4KKyAqCisgKiBFYWNoIEFDRSBzdGFydHMgd2l0aCBhbiBBQ0VfSEVBREVSIHN0cnVjdHVyZSAoYWxpZ25lZCBvbiA0LWJ5dGUgYm91bmRhcnkpLAorICogd2hpY2ggc3BlY2lmaWVzIHRoZSB0eXBlIGFuZCBzaXplIG9mIHRoZSBBQ0UuIFRoZSBmb3JtYXQgb2YgdGhlIHN1YnNlcXVlbnQKKyAqIGRhdGEgZGVwZW5kcyBvbiB0aGUgQUNFIHR5cGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKy8qT2ZzKi8KKy8qICAwKi8JQUNFX1RZUEVTIHR5cGU7CQkvKiBUeXBlIG9mIHRoZSBBQ0UuICovCisvKiAgMSovCUFDRV9GTEFHUyBmbGFnczsJLyogRmxhZ3MgZGVzY3JpYmluZyB0aGUgQUNFLiAqLworLyogIDIqLwlsZTE2IHNpemU7CQkvKiBTaXplIGluIGJ5dGVzIG9mIHRoZSBBQ0UuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgQUNFX0hFQURFUjsKKworLyoKKyAqIFRoZSBhY2Nlc3MgbWFzayAoMzItYml0KS4gRGVmaW5lcyB0aGUgYWNjZXNzIHJpZ2h0cy4KKyAqCisgKiBUaGUgc3BlY2lmaWMgcmlnaHRzIChiaXRzIDAgdG8gMTUpLiAgVGhlc2UgZGVwZW5kIG9uIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QKKyAqIGJlaW5nIHNlY3VyZWQgYnkgdGhlIEFDRS4KKyAqLworZW51bSB7CisJLyogU3BlY2lmaWMgcmlnaHRzIGZvciBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgYXJlIGFzIGZvbGxvd3M6ICovCisKKwkvKiBSaWdodCB0byByZWFkIGRhdGEgZnJvbSB0aGUgZmlsZS4gKEZJTEUpICovCisJRklMRV9SRUFEX0RBVEEJCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMDEpLAorCS8qIFJpZ2h0IHRvIGxpc3QgY29udGVudHMgb2YgYSBkaXJlY3RvcnkuIChESVJFQ1RPUlkpICovCisJRklMRV9MSVNUX0RJUkVDVE9SWQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDAxKSwKKworCS8qIFJpZ2h0IHRvIHdyaXRlIGRhdGEgdG8gdGhlIGZpbGUuIChGSUxFKSAqLworCUZJTEVfV1JJVEVfREFUQQkJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDAwMiksCisJLyogUmlnaHQgdG8gY3JlYXRlIGEgZmlsZSBpbiB0aGUgZGlyZWN0b3J5LiAoRElSRUNUT1JZKSAqLworCUZJTEVfQUREX0ZJTEUJCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMDIpLAorCisJLyogUmlnaHQgdG8gYXBwZW5kIGRhdGEgdG8gdGhlIGZpbGUuIChGSUxFKSAqLworCUZJTEVfQVBQRU5EX0RBVEEJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDAwNCksCisJLyogUmlnaHQgdG8gY3JlYXRlIGEgc3ViZGlyZWN0b3J5LiAoRElSRUNUT1JZKSAqLworCUZJTEVfQUREX1NVQkRJUkVDVE9SWQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDA0KSwKKworCS8qIFJpZ2h0IHRvIHJlYWQgZXh0ZW5kZWQgYXR0cmlidXRlcy4gKEZJTEUvRElSRUNUT1JZKSAqLworCUZJTEVfUkVBRF9FQQkJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDAwOCksCisKKwkvKiBSaWdodCB0byB3cml0ZSBleHRlbmRlZCBhdHRyaWJ1dGVzLiAoRklMRS9ESVJFQ1RPUlkpICovCisJRklMRV9XUklURV9FQQkJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDAxMCksCisKKwkvKiBSaWdodCB0byBleGVjdXRlIGEgZmlsZS4gKEZJTEUpICovCisJRklMRV9FWEVDVVRFCQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDIwKSwKKwkvKiBSaWdodCB0byB0cmF2ZXJzZSB0aGUgZGlyZWN0b3J5LiAoRElSRUNUT1JZKSAqLworCUZJTEVfVFJBVkVSU0UJCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMjApLAorCisJLyoKKwkgKiBSaWdodCB0byBkZWxldGUgYSBkaXJlY3RvcnkgYW5kIGFsbCB0aGUgZmlsZXMgaXQgY29udGFpbnMgKGl0cworCSAqIGNoaWxkcmVuKSwgZXZlbiBpZiB0aGUgZmlsZXMgYXJlIHJlYWQtb25seS4gKERJUkVDVE9SWSkKKwkgKi8KKwlGSUxFX0RFTEVURV9DSElMRAkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDQwKSwKKworCS8qIFJpZ2h0IHRvIHJlYWQgZmlsZSBhdHRyaWJ1dGVzLiAoRklMRS9ESVJFQ1RPUlkpICovCisJRklMRV9SRUFEX0FUVFJJQlVURVMJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDA4MCksCisKKwkvKiBSaWdodCB0byBjaGFuZ2UgZmlsZSBhdHRyaWJ1dGVzLiAoRklMRS9ESVJFQ1RPUlkpICovCisJRklMRV9XUklURV9BVFRSSUJVVEVTCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAxMDApLAorCisJLyoKKwkgKiBUaGUgc3RhbmRhcmQgcmlnaHRzIChiaXRzIDE2IHRvIDIzKS4gIFRoZXNlIGFyZSBpbmRlcGVuZGVudCBvZiB0aGUKKwkgKiB0eXBlIG9mIG9iamVjdCBiZWluZyBzZWN1cmVkLgorCSAqLworCisJLyogUmlnaHQgdG8gZGVsZXRlIHRoZSBvYmplY3QuICovCisJREVMRVRFCQkJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAxMDAwMCksCisKKwkvKgorCSAqIFJpZ2h0IHRvIHJlYWQgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBvYmplY3QncyBzZWN1cml0eSBkZXNjcmlwdG9yLAorCSAqIG5vdCBpbmNsdWRpbmcgdGhlIGluZm9ybWF0aW9uIGluIHRoZSBTQUNMLCBpLmUuIHJpZ2h0IHRvIHJlYWQgdGhlCisJICogc2VjdXJpdHkgZGVzY3JpcHRvciBhbmQgb3duZXIuCisJICovCisJUkVBRF9DT05UUk9MCQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDIwMDAwKSwKKworCS8qIFJpZ2h0IHRvIG1vZGlmeSB0aGUgREFDTCBpbiB0aGUgb2JqZWN0J3Mgc2VjdXJpdHkgZGVzY3JpcHRvci4gKi8KKwlXUklURV9EQUMJCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwNDAwMDApLAorCisJLyogUmlnaHQgdG8gY2hhbmdlIHRoZSBvd25lciBpbiB0aGUgb2JqZWN0J3Mgc2VjdXJpdHkgZGVzY3JpcHRvci4gKi8KKwlXUklURV9PV05FUgkJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDA4MDAwMCksCisKKwkvKgorCSAqIFJpZ2h0IHRvIHVzZSB0aGUgb2JqZWN0IGZvciBzeW5jaHJvbml6YXRpb24uICBFbmFibGVzIGEgcHJvY2VzcyB0bworCSAqIHdhaXQgdW50aWwgdGhlIG9iamVjdCBpcyBpbiB0aGUgc2lnbmFsbGVkIHN0YXRlLiAgU29tZSBvYmplY3QgdHlwZXMKKwkgKiBkbyBub3Qgc3VwcG9ydCB0aGlzIGFjY2VzcyByaWdodC4KKwkgKi8KKwlTWU5DSFJPTklaRQkJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDEwMDAwMCksCisKKwkvKgorCSAqIFRoZSBmb2xsb3dpbmcgU1RBTkRBUkRfUklHSFRTXyogYXJlIGNvbWJpbmF0aW9ucyBvZiB0aGUgYWJvdmUgZm9yCisJICogY29udmVuaWVuY2UgYW5kIGFyZSBkZWZpbmVkIGJ5IHRoZSBXaW4zMiBBUEkuCisJICovCisKKwkvKiBUaGVzZSBhcmUgY3VycmVudGx5IGRlZmluZWQgdG8gUkVBRF9DT05UUk9MLiAqLworCVNUQU5EQVJEX1JJR0hUU19SRUFECQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMjAwMDApLAorCVNUQU5EQVJEX1JJR0hUU19XUklURQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDIwMDAwKSwKKwlTVEFOREFSRF9SSUdIVFNfRVhFQ1VURQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDIwMDAwKSwKKworCS8qIENvbWJpbmVzIERFTEVURSwgUkVBRF9DT05UUk9MLCBXUklURV9EQUMsIGFuZCBXUklURV9PV05FUiBhY2Nlc3MuICovCisJU1RBTkRBUkRfUklHSFRTX1JFUVVJUkVECT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDBmMDAwMCksCisKKwkvKgorCSAqIENvbWJpbmVzIERFTEVURSwgUkVBRF9DT05UUk9MLCBXUklURV9EQUMsIFdSSVRFX09XTkVSLCBhbmQKKwkgKiBTWU5DSFJPTklaRSBhY2Nlc3MuCisJICovCisJU1RBTkRBUkRfUklHSFRTX0FMTAkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMWYwMDAwKSwKKworCS8qCisJICogVGhlIGFjY2VzcyBzeXN0ZW0gQUNMIGFuZCBtYXhpbXVtIGFsbG93ZWQgYWNjZXNzIHR5cGVzIChiaXRzIDI0IHRvCisJICogMjUsIGJpdHMgMjYgdG8gMjcgYXJlIHJlc2VydmVkKS4KKwkgKi8KKwlBQ0NFU1NfU1lTVEVNX1NFQ1VSSVRZCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDEwMDAwMDApLAorCU1BWElNVU1fQUxMT1dFRAkJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMjAwMDAwMCksCisKKwkvKgorCSAqIFRoZSBnZW5lcmljIHJpZ2h0cyAoYml0cyAyOCB0byAzMSkuICBUaGVzZSBtYXAgb250byB0aGUgc3RhbmRhcmQgYW5kCisJICogc3BlY2lmaWMgcmlnaHRzLgorCSAqLworCisJLyogUmVhZCwgd3JpdGUsIGFuZCBleGVjdXRlIGFjY2Vzcy4gKi8KKwlHRU5FUklDX0FMTAkJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgxMDAwMDAwMCksCisKKwkvKiBFeGVjdXRlIGFjY2Vzcy4gKi8KKwlHRU5FUklDX0VYRUNVVEUJCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MjAwMDAwMDApLAorCisJLyoKKwkgKiBXcml0ZSBhY2Nlc3MuICBGb3IgZmlsZXMsIHRoaXMgbWFwcyBvbnRvOgorCSAqCUZJTEVfQVBQRU5EX0RBVEEgfCBGSUxFX1dSSVRFX0FUVFJJQlVURVMgfCBGSUxFX1dSSVRFX0RBVEEgfAorCSAqCUZJTEVfV1JJVEVfRUEgfCBTVEFOREFSRF9SSUdIVFNfV1JJVEUgfCBTWU5DSFJPTklaRQorCSAqIEZvciBkaXJlY3RvcmllcywgdGhlIG1hcHBpbmcgaGFzIHRoZSBzYW1lIG51bWVyaWNhbCB2YWx1ZS4gIFNlZQorCSAqIGFib3ZlIGZvciB0aGUgZGVzY3JpcHRpb25zIG9mIHRoZSByaWdodHMgZ3JhbnRlZC4KKwkgKi8KKwlHRU5FUklDX1dSSVRFCQkJPSBjb25zdF9jcHVfdG9fbGUzMigweDQwMDAwMDAwKSwKKworCS8qCisJICogUmVhZCBhY2Nlc3MuICBGb3IgZmlsZXMsIHRoaXMgbWFwcyBvbnRvOgorCSAqCUZJTEVfUkVBRF9BVFRSSUJVVEVTIHwgRklMRV9SRUFEX0RBVEEgfCBGSUxFX1JFQURfRUEgfAorCSAqCVNUQU5EQVJEX1JJR0hUU19SRUFEIHwgU1lOQ0hST05JWkUKKwkgKiBGb3IgZGlyZWN0b3JpZXMsIHRoZSBtYXBwaW5nIGhhcyB0aGUgc2FtZSBudW1iZXJpY2FsIHZhbHVlLiAgU2VlCisJICogYWJvdmUgZm9yIHRoZSBkZXNjcmlwdGlvbnMgb2YgdGhlIHJpZ2h0cyBncmFudGVkLgorCSAqLworCUdFTkVSSUNfUkVBRAkJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHg4MDAwMDAwMCksCit9OworCit0eXBlZGVmIGxlMzIgQUNDRVNTX01BU0s7CisKKy8qCisgKiBUaGUgZ2VuZXJpYyBtYXBwaW5nIGFycmF5LiBVc2VkIHRvIGRlbm90ZSB0aGUgbWFwcGluZyBvZiBlYWNoIGdlbmVyaWMKKyAqIGFjY2VzcyByaWdodCB0byBhIHNwZWNpZmljIGFjY2VzcyBtYXNrLgorICoKKyAqIEZJWE1FOiBXaGF0IGV4YWN0bHkgaXMgdGhpcyBhbmQgd2hhdCBpcyBpdCBmb3I/IChBSUEpCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlBQ0NFU1NfTUFTSyBnZW5lcmljX3JlYWQ7CisJQUNDRVNTX01BU0sgZ2VuZXJpY193cml0ZTsKKwlBQ0NFU1NfTUFTSyBnZW5lcmljX2V4ZWN1dGU7CisJQUNDRVNTX01BU0sgZ2VuZXJpY19hbGw7Cit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgR0VORVJJQ19NQVBQSU5HOworCisvKgorICogVGhlIHByZWRlZmluZWQgQUNFIHR5cGUgc3RydWN0dXJlcyBhcmUgYXMgZGVmaW5lZCBiZWxvdy4KKyAqLworCisvKgorICogQUNDRVNTX0FMTE9XRURfQUNFLCBBQ0NFU1NfREVOSUVEX0FDRSwgU1lTVEVNX0FVRElUX0FDRSwgU1lTVEVNX0FMQVJNX0FDRQorICovCit0eXBlZGVmIHN0cnVjdCB7CisvKiAgMAlBQ0VfSEVBREVSOyAtLSBVbmZvbGRlZCBoZXJlIGFzIGdjYyBkb2Vzbid0IGxpa2UgdW5uYW1lZCBzdHJ1Y3RzLiAqLworCUFDRV9UWVBFUyB0eXBlOwkJLyogVHlwZSBvZiB0aGUgQUNFLiAqLworCUFDRV9GTEFHUyBmbGFnczsJLyogRmxhZ3MgZGVzY3JpYmluZyB0aGUgQUNFLiAqLworCWxlMTYgc2l6ZTsJCS8qIFNpemUgaW4gYnl0ZXMgb2YgdGhlIEFDRS4gKi8KKy8qICA0Ki8JQUNDRVNTX01BU0sgbWFzazsJLyogQWNjZXNzIG1hc2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBBQ0UuICovCisKKy8qICA4Ki8JU0lEIHNpZDsJCS8qIFRoZSBTSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBBQ0UuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgQUNDRVNTX0FMTE9XRURfQUNFLCBBQ0NFU1NfREVOSUVEX0FDRSwKKwkJCSAgICAgICBTWVNURU1fQVVESVRfQUNFLCBTWVNURU1fQUxBUk1fQUNFOworCisvKgorICogVGhlIG9iamVjdCBBQ0UgZmxhZ3MgKDMyLWJpdCkuCisgKi8KK2VudW0geworCUFDRV9PQkpFQ1RfVFlQRV9QUkVTRU5UCQkJPSBjb25zdF9jcHVfdG9fbGUzMigxKSwKKwlBQ0VfSU5IRVJJVEVEX09CSkVDVF9UWVBFX1BSRVNFTlQJPSBjb25zdF9jcHVfdG9fbGUzMigyKSwKK307CisKK3R5cGVkZWYgbGUzMiBPQkpFQ1RfQUNFX0ZMQUdTOworCit0eXBlZGVmIHN0cnVjdCB7CisvKiAgMAlBQ0VfSEVBREVSOyAtLSBVbmZvbGRlZCBoZXJlIGFzIGdjYyBkb2Vzbid0IGxpa2UgdW5uYW1lZCBzdHJ1Y3RzLiAqLworCUFDRV9UWVBFUyB0eXBlOwkJLyogVHlwZSBvZiB0aGUgQUNFLiAqLworCUFDRV9GTEFHUyBmbGFnczsJLyogRmxhZ3MgZGVzY3JpYmluZyB0aGUgQUNFLiAqLworCWxlMTYgc2l6ZTsJCS8qIFNpemUgaW4gYnl0ZXMgb2YgdGhlIEFDRS4gKi8KKy8qICA0Ki8JQUNDRVNTX01BU0sgbWFzazsJLyogQWNjZXNzIG1hc2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBBQ0UuICovCisKKy8qICA4Ki8JT0JKRUNUX0FDRV9GTEFHUyBvYmplY3RfZmxhZ3M7CS8qIEZsYWdzIGRlc2NyaWJpbmcgdGhlIG9iamVjdCBBQ0UuICovCisvKiAxMiovCUdVSUQgb2JqZWN0X3R5cGU7CisvKiAyOCovCUdVSUQgaW5oZXJpdGVkX29iamVjdF90eXBlOworCisvKiA0NCovCVNJRCBzaWQ7CQkvKiBUaGUgU0lEIGFzc29jaWF0ZWQgd2l0aCB0aGUgQUNFLiAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIEFDQ0VTU19BTExPV0VEX09CSkVDVF9BQ0UsCisJCQkgICAgICAgQUNDRVNTX0RFTklFRF9PQkpFQ1RfQUNFLAorCQkJICAgICAgIFNZU1RFTV9BVURJVF9PQkpFQ1RfQUNFLAorCQkJICAgICAgIFNZU1RFTV9BTEFSTV9PQkpFQ1RfQUNFOworCisvKgorICogQW4gQUNMIGlzIGFuIGFjY2Vzcy1jb250cm9sIGxpc3QgKEFDTCkuCisgKiBBbiBBQ0wgc3RhcnRzIHdpdGggYW4gQUNMIGhlYWRlciBzdHJ1Y3R1cmUsIHdoaWNoIHNwZWNpZmllcyB0aGUgc2l6ZSBvZgorICogdGhlIEFDTCBhbmQgdGhlIG51bWJlciBvZiBBQ0VzIGl0IGNvbnRhaW5zLiBUaGUgQUNMIGhlYWRlciBpcyBmb2xsb3dlZCBieQorICogemVybyBvciBtb3JlIGFjY2VzcyBjb250cm9sIGVudHJpZXMgKEFDRXMpLiBUaGUgQUNMIGFzIHdlbGwgYXMgZWFjaCBBQ0UKKyAqIGFyZSBhbGlnbmVkIG9uIDQtYnl0ZSBib3VuZGFyaWVzLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdTggcmV2aXNpb247CS8qIFJldmlzaW9uIG9mIHRoaXMgQUNMLiAqLworCXU4IGFsaWdubWVudDE7CisJbGUxNiBzaXplOwkvKiBBbGxvY2F0ZWQgc3BhY2UgaW4gYnl0ZXMgZm9yIEFDTC4gSW5jbHVkZXMgdGhpcworCQkJICAgaGVhZGVyLCB0aGUgQUNFcyBhbmQgdGhlIHJlbWFpbmluZyBmcmVlIHNwYWNlLiAqLworCWxlMTYgYWNlX2NvdW50OwkvKiBOdW1iZXIgb2YgQUNFcyBpbiB0aGUgQUNMLiAqLworCWxlMTYgYWxpZ25tZW50MjsKKy8qIHNpemVvZigpID0gOCBieXRlcyAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIEFDTDsKKworLyoKKyAqIEN1cnJlbnQgY29uc3RhbnRzIGZvciBBQ0xzLgorICovCit0eXBlZGVmIGVudW0geworCS8qIEN1cnJlbnQgcmV2aXNpb24uICovCisJQUNMX1JFVklTSU9OCQk9IDIsCisJQUNMX1JFVklTSU9OX0RTCQk9IDQsCisKKwkvKiBIaXN0b3J5IG9mIHJldmlzaW9ucy4gKi8KKwlBQ0xfUkVWSVNJT04xCQk9IDEsCisJTUlOX0FDTF9SRVZJU0lPTgk9IDIsCisJQUNMX1JFVklTSU9OMgkJPSAyLAorCUFDTF9SRVZJU0lPTjMJCT0gMywKKwlBQ0xfUkVWSVNJT040CQk9IDQsCisJTUFYX0FDTF9SRVZJU0lPTgk9IDQsCit9IEFDTF9DT05TVEFOVFM7CisKKy8qCisgKiBUaGUgc2VjdXJpdHkgZGVzY3JpcHRvciBjb250cm9sIGZsYWdzICgxNi1iaXQpLgorICoKKyAqIFNFX09XTkVSX0RFRkFVTFRFRCAtIFRoaXMgYm9vbGVhbiBmbGFnLCB3aGVuIHNldCwgaW5kaWNhdGVzIHRoYXQgdGhlIFNJRAorICoJcG9pbnRlZCB0byBieSB0aGUgT3duZXIgZmllbGQgd2FzIHByb3ZpZGVkIGJ5IGEgZGVmYXVsdGluZyBtZWNoYW5pc20KKyAqCXJhdGhlciB0aGFuIGV4cGxpY2l0bHkgcHJvdmlkZWQgYnkgdGhlIG9yaWdpbmFsIHByb3ZpZGVyIG9mIHRoZQorICoJc2VjdXJpdHkgZGVzY3JpcHRvci4gIFRoaXMgbWF5IGFmZmVjdCB0aGUgdHJlYXRtZW50IG9mIHRoZSBTSUQgd2l0aAorICoJcmVzcGVjdCB0byBpbmhlcml0ZW5jZSBvZiBhbiBvd25lci4KKyAqCisgKiBTRV9HUk9VUF9ERUZBVUxURUQgLSBUaGlzIGJvb2xlYW4gZmxhZywgd2hlbiBzZXQsIGluZGljYXRlcyB0aGF0IHRoZSBTSUQgaW4KKyAqCXRoZSBHcm91cCBmaWVsZCB3YXMgcHJvdmlkZWQgYnkgYSBkZWZhdWx0aW5nIG1lY2hhbmlzbSByYXRoZXIgdGhhbgorICoJZXhwbGljaXRseSBwcm92aWRlZCBieSB0aGUgb3JpZ2luYWwgcHJvdmlkZXIgb2YgdGhlIHNlY3VyaXR5CisgKglkZXNjcmlwdG9yLiAgVGhpcyBtYXkgYWZmZWN0IHRoZSB0cmVhdG1lbnQgb2YgdGhlIFNJRCB3aXRoIHJlc3BlY3QgdG8KKyAqCWluaGVyaXRlbmNlIG9mIGEgcHJpbWFyeSBncm91cC4KKyAqCisgKiBTRV9EQUNMX1BSRVNFTlQgLSBUaGlzIGJvb2xlYW4gZmxhZywgd2hlbiBzZXQsIGluZGljYXRlcyB0aGF0IHRoZSBzZWN1cml0eQorICoJZGVzY3JpcHRvciBjb250YWlucyBhIGRpc2NyZXRpb25hcnkgQUNMLiAgSWYgdGhpcyBmbGFnIGlzIHNldCBhbmQgdGhlCisgKglEYWNsIGZpZWxkIG9mIHRoZSBTRUNVUklUWV9ERVNDUklQVE9SIGlzIG51bGwsIHRoZW4gYSBudWxsIEFDTCBpcworICoJZXhwbGljaXRseSBiZWluZyBzcGVjaWZpZWQuCisgKgorICogU0VfREFDTF9ERUZBVUxURUQgLSBUaGlzIGJvb2xlYW4gZmxhZywgd2hlbiBzZXQsIGluZGljYXRlcyB0aGF0IHRoZSBBQ0wKKyAqCXBvaW50ZWQgdG8gYnkgdGhlIERhY2wgZmllbGQgd2FzIHByb3ZpZGVkIGJ5IGEgZGVmYXVsdGluZyBtZWNoYW5pc20KKyAqCXJhdGhlciB0aGFuIGV4cGxpY2l0bHkgcHJvdmlkZWQgYnkgdGhlIG9yaWdpbmFsIHByb3ZpZGVyIG9mIHRoZQorICoJc2VjdXJpdHkgZGVzY3JpcHRvci4gIFRoaXMgbWF5IGFmZmVjdCB0aGUgdHJlYXRtZW50IG9mIHRoZSBBQ0wgd2l0aAorICoJcmVzcGVjdCB0byBpbmhlcml0ZW5jZSBvZiBhbiBBQ0wuICBUaGlzIGZsYWcgaXMgaWdub3JlZCBpZiB0aGUKKyAqCURhY2xQcmVzZW50IGZsYWcgaXMgbm90IHNldC4KKyAqCisgKiBTRV9TQUNMX1BSRVNFTlQgLSBUaGlzIGJvb2xlYW4gZmxhZywgd2hlbiBzZXQsICBpbmRpY2F0ZXMgdGhhdCB0aGUgc2VjdXJpdHkKKyAqCWRlc2NyaXB0b3IgY29udGFpbnMgYSBzeXN0ZW0gQUNMIHBvaW50ZWQgdG8gYnkgdGhlIFNhY2wgZmllbGQuICBJZiB0aGlzCisgKglmbGFnIGlzIHNldCBhbmQgdGhlIFNhY2wgZmllbGQgb2YgdGhlIFNFQ1VSSVRZX0RFU0NSSVBUT1IgaXMgbnVsbCwgdGhlbgorICoJYW4gZW1wdHkgKGJ1dCBwcmVzZW50KSBBQ0wgaXMgYmVpbmcgc3BlY2lmaWVkLgorICoKKyAqIFNFX1NBQ0xfREVGQVVMVEVEIC0gVGhpcyBib29sZWFuIGZsYWcsIHdoZW4gc2V0LCBpbmRpY2F0ZXMgdGhhdCB0aGUgQUNMCisgKglwb2ludGVkIHRvIGJ5IHRoZSBTYWNsIGZpZWxkIHdhcyBwcm92aWRlZCBieSBhIGRlZmF1bHRpbmcgbWVjaGFuaXNtCisgKglyYXRoZXIgdGhhbiBleHBsaWNpdGx5IHByb3ZpZGVkIGJ5IHRoZSBvcmlnaW5hbCBwcm92aWRlciBvZiB0aGUKKyAqCXNlY3VyaXR5IGRlc2NyaXB0b3IuICBUaGlzIG1heSBhZmZlY3QgdGhlIHRyZWF0bWVudCBvZiB0aGUgQUNMIHdpdGgKKyAqCXJlc3BlY3QgdG8gaW5oZXJpdGVuY2Ugb2YgYW4gQUNMLiAgVGhpcyBmbGFnIGlzIGlnbm9yZWQgaWYgdGhlCisgKglTYWNsUHJlc2VudCBmbGFnIGlzIG5vdCBzZXQuCisgKgorICogU0VfU0VMRl9SRUxBVElWRSAtIFRoaXMgYm9vbGVhbiBmbGFnLCB3aGVuIHNldCwgaW5kaWNhdGVzIHRoYXQgdGhlIHNlY3VyaXR5CisgKglkZXNjcmlwdG9yIGlzIGluIHNlbGYtcmVsYXRpdmUgZm9ybS4gIEluIHRoaXMgZm9ybSwgYWxsIGZpZWxkcyBvZiB0aGUKKyAqCXNlY3VyaXR5IGRlc2NyaXB0b3IgYXJlIGNvbnRpZ3VvdXMgaW4gbWVtb3J5IGFuZCBhbGwgcG9pbnRlciBmaWVsZHMgYXJlCisgKglleHByZXNzZWQgYXMgb2Zmc2V0cyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlY3VyaXR5IGRlc2NyaXB0b3IuCisgKi8KK2VudW0geworCVNFX09XTkVSX0RFRkFVTFRFRAkJPSBjb25zdF9jcHVfdG9fbGUxNigweDAwMDEpLAorCVNFX0dST1VQX0RFRkFVTFRFRAkJPSBjb25zdF9jcHVfdG9fbGUxNigweDAwMDIpLAorCVNFX0RBQ0xfUFJFU0VOVAkJCT0gY29uc3RfY3B1X3RvX2xlMTYoMHgwMDA0KSwKKwlTRV9EQUNMX0RFRkFVTFRFRAkJPSBjb25zdF9jcHVfdG9fbGUxNigweDAwMDgpLAorCisJU0VfU0FDTF9QUkVTRU5UCQkJPSBjb25zdF9jcHVfdG9fbGUxNigweDAwMTApLAorCVNFX1NBQ0xfREVGQVVMVEVECQk9IGNvbnN0X2NwdV90b19sZTE2KDB4MDAyMCksCisKKwlTRV9EQUNMX0FVVE9fSU5IRVJJVF9SRVEJPSBjb25zdF9jcHVfdG9fbGUxNigweDAxMDApLAorCVNFX1NBQ0xfQVVUT19JTkhFUklUX1JFUQk9IGNvbnN0X2NwdV90b19sZTE2KDB4MDIwMCksCisJU0VfREFDTF9BVVRPX0lOSEVSSVRFRAkJPSBjb25zdF9jcHVfdG9fbGUxNigweDA0MDApLAorCVNFX1NBQ0xfQVVUT19JTkhFUklURUQJCT0gY29uc3RfY3B1X3RvX2xlMTYoMHgwODAwKSwKKworCVNFX0RBQ0xfUFJPVEVDVEVECQk9IGNvbnN0X2NwdV90b19sZTE2KDB4MTAwMCksCisJU0VfU0FDTF9QUk9URUNURUQJCT0gY29uc3RfY3B1X3RvX2xlMTYoMHgyMDAwKSwKKwlTRV9STV9DT05UUk9MX1ZBTElECQk9IGNvbnN0X2NwdV90b19sZTE2KDB4NDAwMCksCisJU0VfU0VMRl9SRUxBVElWRQkJPSBjb25zdF9jcHVfdG9fbGUxNigweDgwMDApCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3R5cGVkZWYgbGUxNiBTRUNVUklUWV9ERVNDUklQVE9SX0NPTlRST0w7CisKKy8qCisgKiBTZWxmLXJlbGF0aXZlIHNlY3VyaXR5IGRlc2NyaXB0b3IuIENvbnRhaW5zIHRoZSBvd25lciBhbmQgZ3JvdXAgU0lEcyBhcyB3ZWxsCisgKiBhcyB0aGUgc2FjbCBhbmQgZGFjbCBBQ0xzIGluc2lkZSB0aGUgc2VjdXJpdHkgZGVzY3JpcHRvciBpdHNlbGYuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1OCByZXZpc2lvbjsJLyogUmV2aXNpb24gbGV2ZWwgb2YgdGhlIHNlY3VyaXR5IGRlc2NyaXB0b3IuICovCisJdTggYWxpZ25tZW50OworCVNFQ1VSSVRZX0RFU0NSSVBUT1JfQ09OVFJPTCBjb250cm9sOyAvKiBGbGFncyBxdWFsaWZ5aW5nIHRoZSB0eXBlIG9mCisJCQkgICB0aGUgZGVzY3JpcHRvciBhcyB3ZWxsIGFzIHRoZSBmb2xsb3dpbmcgZmllbGRzLiAqLworCWxlMzIgb3duZXI7CS8qIEJ5dGUgb2Zmc2V0IHRvIGEgU0lEIHJlcHJlc2VudGluZyBhbiBvYmplY3QncworCQkJICAgb3duZXIuIElmIHRoaXMgaXMgTlVMTCwgbm8gb3duZXIgU0lEIGlzIHByZXNlbnQgaW4KKwkJCSAgIHRoZSBkZXNjcmlwdG9yLiAqLworCWxlMzIgZ3JvdXA7CS8qIEJ5dGUgb2Zmc2V0IHRvIGEgU0lEIHJlcHJlc2VudGluZyBhbiBvYmplY3QncworCQkJICAgcHJpbWFyeSBncm91cC4gSWYgdGhpcyBpcyBOVUxMLCBubyBwcmltYXJ5IGdyb3VwCisJCQkgICBTSUQgaXMgcHJlc2VudCBpbiB0aGUgZGVzY3JpcHRvci4gKi8KKwlsZTMyIHNhY2w7CS8qIEJ5dGUgb2Zmc2V0IHRvIGEgc3lzdGVtIEFDTC4gT25seSB2YWxpZCwgaWYKKwkJCSAgIFNFX1NBQ0xfUFJFU0VOVCBpcyBzZXQgaW4gdGhlIGNvbnRyb2wgZmllbGQuIElmCisJCQkgICBTRV9TQUNMX1BSRVNFTlQgaXMgc2V0IGJ1dCBzYWNsIGlzIE5VTEwsIGEgTlVMTCBBQ0wKKwkJCSAgIGlzIHNwZWNpZmllZC4gKi8KKwlsZTMyIGRhY2w7CS8qIEJ5dGUgb2Zmc2V0IHRvIGEgZGlzY3JldGlvbmFyeSBBQ0wuIE9ubHkgdmFsaWQsIGlmCisJCQkgICBTRV9EQUNMX1BSRVNFTlQgaXMgc2V0IGluIHRoZSBjb250cm9sIGZpZWxkLiBJZgorCQkJICAgU0VfREFDTF9QUkVTRU5UIGlzIHNldCBidXQgZGFjbCBpcyBOVUxMLCBhIE5VTEwgQUNMCisJCQkgICAodW5jb25kaXRpb25hbGx5IGdyYW50aW5nIGFjY2VzcykgaXMgc3BlY2lmaWVkLiAqLworLyogc2l6ZW9mKCkgPSAweDE0IGJ5dGVzICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgU0VDVVJJVFlfREVTQ1JJUFRPUl9SRUxBVElWRTsKKworLyoKKyAqIEFic29sdXRlIHNlY3VyaXR5IGRlc2NyaXB0b3IuIERvZXMgbm90IGNvbnRhaW4gdGhlIG93bmVyIGFuZCBncm91cCBTSURzLCBub3IKKyAqIHRoZSBzYWNsIGFuZCBkYWNsIEFDTHMgaW5zaWRlIHRoZSBzZWN1cml0eSBkZXNjcmlwdG9yLiBJbnN0ZWFkLCBpdCBjb250YWlucworICogcG9pbnRlcnMgdG8gdGhlc2Ugc3RydWN0dXJlcyBpbiBtZW1vcnkuIE9idmlvdXNseSwgYWJzb2x1dGUgc2VjdXJpdHkKKyAqIGRlc2NyaXB0b3JzIGFyZSBvbmx5IHVzZWZ1bCBmb3IgaW4gbWVtb3J5IHJlcHJlc2VudGF0aW9ucyBvZiBzZWN1cml0eQorICogZGVzY3JpcHRvcnMuIE9uIGRpc2ssIGEgc2VsZi1yZWxhdGl2ZSBzZWN1cml0eSBkZXNjcmlwdG9yIGlzIHVzZWQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwl1OCByZXZpc2lvbjsJLyogUmV2aXNpb24gbGV2ZWwgb2YgdGhlIHNlY3VyaXR5IGRlc2NyaXB0b3IuICovCisJdTggYWxpZ25tZW50OworCVNFQ1VSSVRZX0RFU0NSSVBUT1JfQ09OVFJPTCBjb250cm9sOwkvKiBGbGFncyBxdWFsaWZ5aW5nIHRoZSB0eXBlIG9mCisJCQkgICB0aGUgZGVzY3JpcHRvciBhcyB3ZWxsIGFzIHRoZSBmb2xsb3dpbmcgZmllbGRzLiAqLworCVNJRCAqb3duZXI7CS8qIFBvaW50cyB0byBhIFNJRCByZXByZXNlbnRpbmcgYW4gb2JqZWN0J3Mgb3duZXIuIElmCisJCQkgICB0aGlzIGlzIE5VTEwsIG5vIG93bmVyIFNJRCBpcyBwcmVzZW50IGluIHRoZQorCQkJICAgZGVzY3JpcHRvci4gKi8KKwlTSUQgKmdyb3VwOwkvKiBQb2ludHMgdG8gYSBTSUQgcmVwcmVzZW50aW5nIGFuIG9iamVjdCdzIHByaW1hcnkKKwkJCSAgIGdyb3VwLiBJZiB0aGlzIGlzIE5VTEwsIG5vIHByaW1hcnkgZ3JvdXAgU0lEIGlzCisJCQkgICBwcmVzZW50IGluIHRoZSBkZXNjcmlwdG9yLiAqLworCUFDTCAqc2FjbDsJLyogUG9pbnRzIHRvIGEgc3lzdGVtIEFDTC4gT25seSB2YWxpZCwgaWYKKwkJCSAgIFNFX1NBQ0xfUFJFU0VOVCBpcyBzZXQgaW4gdGhlIGNvbnRyb2wgZmllbGQuIElmCisJCQkgICBTRV9TQUNMX1BSRVNFTlQgaXMgc2V0IGJ1dCBzYWNsIGlzIE5VTEwsIGEgTlVMTCBBQ0wKKwkJCSAgIGlzIHNwZWNpZmllZC4gKi8KKwlBQ0wgKmRhY2w7CS8qIFBvaW50cyB0byBhIGRpc2NyZXRpb25hcnkgQUNMLiBPbmx5IHZhbGlkLCBpZgorCQkJICAgU0VfREFDTF9QUkVTRU5UIGlzIHNldCBpbiB0aGUgY29udHJvbCBmaWVsZC4gSWYKKwkJCSAgIFNFX0RBQ0xfUFJFU0VOVCBpcyBzZXQgYnV0IGRhY2wgaXMgTlVMTCwgYSBOVUxMIEFDTAorCQkJICAgKHVuY29uZGl0aW9uYWxseSBncmFudGluZyBhY2Nlc3MpIGlzIHNwZWNpZmllZC4gKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBTRUNVUklUWV9ERVNDUklQVE9SOworCisvKgorICogQ3VycmVudCBjb25zdGFudHMgZm9yIHNlY3VyaXR5IGRlc2NyaXB0b3JzLgorICovCit0eXBlZGVmIGVudW0geworCS8qIEN1cnJlbnQgcmV2aXNpb24uICovCisJU0VDVVJJVFlfREVTQ1JJUFRPUl9SRVZJU0lPTgk9IDEsCisJU0VDVVJJVFlfREVTQ1JJUFRPUl9SRVZJU0lPTjEJPSAxLAorCisJLyogVGhlIHNpemVzIG9mIGJvdGggdGhlIGFic29sdXRlIGFuZCByZWxhdGl2ZSBzZWN1cml0eSBkZXNjcmlwdG9ycyBpcworCSAgIHRoZSBzYW1lIGFzIHBvaW50ZXJzLCBhdCBsZWFzdCBvbiBpYTMyIGFyY2hpdGVjdHVyZSBhcmUgMzItYml0LiAqLworCVNFQ1VSSVRZX0RFU0NSSVBUT1JfTUlOX0xFTkdUSAk9IHNpemVvZihTRUNVUklUWV9ERVNDUklQVE9SKSwKK30gU0VDVVJJVFlfREVTQ1JJUFRPUl9DT05TVEFOVFM7CisKKy8qCisgKiBBdHRyaWJ1dGU6IFNlY3VyaXR5IGRlc2NyaXB0b3IgKDB4NTApLiBBIHN0YW5kYXJkIHNlbGYtcmVsYXRpdmUgc2VjdXJpdHkKKyAqIGRlc2NyaXB0b3IuCisgKgorICogTk9URTogQ2FuIGJlIHJlc2lkZW50IG9yIG5vbi1yZXNpZGVudC4KKyAqIE5PVEU6IE5vdCB1c2VkIGluIE5URlMgMy4wKywgYXMgc2VjdXJpdHkgZGVzY3JpcHRvcnMgYXJlIHN0b3JlZCBjZW50cmFsbHkKKyAqIGluIEZJTEVfU2VjdXJlIGFuZCB0aGUgY29ycmVjdCBkZXNjcmlwdG9yIGlzIGZvdW5kIHVzaW5nIHRoZSBzZWN1cml0eV9pZAorICogZnJvbSB0aGUgc3RhbmRhcmQgaW5mb3JtYXRpb24gYXR0cmlidXRlLgorICovCit0eXBlZGVmIFNFQ1VSSVRZX0RFU0NSSVBUT1JfUkVMQVRJVkUgU0VDVVJJVFlfREVTQ1JJUFRPUl9BVFRSOworCisvKgorICogT24gTlRGUyAzLjArLCBhbGwgc2VjdXJpdHkgZGVzY3JpcHRvcnMgYXJlIHN0b3JlZCBpbiBGSUxFX1NlY3VyZS4gT25seSBvbmUKKyAqIHJlZmVyZW5jZWQgaW5zdGFuY2Ugb2YgZWFjaCB1bmlxdWUgc2VjdXJpdHkgZGVzY3JpcHRvciBpcyBzdG9yZWQuCisgKgorICogRklMRV9TZWN1cmUgY29udGFpbnMgbm8gdW5uYW1lZCBkYXRhIGF0dHJpYnV0ZSwgaS5lLiBpdCBoYXMgemVybyBsZW5ndGguIEl0CisgKiBkb2VzLCBob3dldmVyLCBjb250YWluIHR3byBpbmRleGVzICgkU0RIIGFuZCAkU0lJKSBhcyB3ZWxsIGFzIGEgbmFtZWQgZGF0YQorICogc3RyZWFtICgkU0RTKS4KKyAqCisgKiBFdmVyeSB1bmlxdWUgc2VjdXJpdHkgZGVzY3JpcHRvciBpcyBhc3NpZ25lZCBhIHVuaXF1ZSBzZWN1cml0eSBpZGVudGlmaWVyCisgKiAoc2VjdXJpdHlfaWQsIG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIGEgU0lEKS4gVGhlIHNlY3VyaXR5X2lkIGlzIHVuaXF1ZSBmb3IKKyAqIHRoZSBOVEZTIHZvbHVtZSBhbmQgaXMgdXNlZCBhcyBhbiBpbmRleCBpbnRvIHRoZSAkU0lJIGluZGV4LCB3aGljaCBtYXBzCisgKiBzZWN1cml0eV9pZHMgdG8gdGhlIHNlY3VyaXR5IGRlc2NyaXB0b3IncyBzdG9yYWdlIGxvY2F0aW9uIHdpdGhpbiB0aGUgJFNEUworICogZGF0YSBhdHRyaWJ1dGUuIFRoZSAkU0lJIGluZGV4IGlzIHNvcnRlZCBieSBhc2NlbmRpbmcgc2VjdXJpdHlfaWQuCisgKgorICogQSBzaW1wbGUgaGFzaCBpcyBjb21wdXRlZCBmcm9tIGVhY2ggc2VjdXJpdHkgZGVzY3JpcHRvci4gVGhpcyBoYXNoIGlzIHVzZWQKKyAqIGFzIGFuIGluZGV4IGludG8gdGhlICRTREggaW5kZXgsIHdoaWNoIG1hcHMgc2VjdXJpdHkgZGVzY3JpcHRvciBoYXNoZXMgdG8KKyAqIHRoZSBzZWN1cml0eSBkZXNjcmlwdG9yJ3Mgc3RvcmFnZSBsb2NhdGlvbiB3aXRoaW4gdGhlICRTRFMgZGF0YSBhdHRyaWJ1dGUuCisgKiBUaGUgJFNESCBpbmRleCBpcyBzb3J0ZWQgYnkgc2VjdXJpdHkgZGVzY3JpcHRvciBoYXNoIGFuZCBpcyBzdG9yZWQgaW4gYSBCKworICogdHJlZS4gV2hlbiBzZWFyY2hpbmcgJFNESCAod2l0aCB0aGUgaW50ZW50IG9mIGRldGVybWluaW5nIHdoZXRoZXIgb3Igbm90IGEKKyAqIG5ldyBzZWN1cml0eSBkZXNjcmlwdG9yIGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgJFNEUyBkYXRhIHN0cmVhbSksIGlmIGEKKyAqIG1hdGNoaW5nIGhhc2ggaXMgZm91bmQsIGJ1dCB0aGUgc2VjdXJpdHkgZGVzY3JpcHRvcnMgZG8gbm90IG1hdGNoLCB0aGUKKyAqIHNlYXJjaCBpbiB0aGUgJFNESCBpbmRleCBpcyBjb250aW51ZWQsIHNlYXJjaGluZyBmb3IgYSBuZXh0IG1hdGNoaW5nIGhhc2guCisgKgorICogV2hlbiBhIHByZWNpc2UgbWF0Y2ggaXMgZm91bmQsIHRoZSBzZWN1cml0eV9pZCBjb3Jlc3BvbmRpbmcgdG8gdGhlIHNlY3VyaXR5CisgKiBkZXNjcmlwdG9yIGluIHRoZSAkU0RTIGF0dHJpYnV0ZSBpcyByZWFkIGZyb20gdGhlIGZvdW5kICRTREggaW5kZXggZW50cnkgYW5kCisgKiBpcyBzdG9yZWQgaW4gdGhlICRTVEFOREFSRF9JTkZPUk1BVElPTiBhdHRyaWJ1dGUgb2YgdGhlIGZpbGUvZGlyZWN0b3J5IHRvCisgKiB3aGljaCB0aGUgc2VjdXJpdHkgZGVzY3JpcHRvciBpcyBiZWluZyBhcHBsaWVkLiBUaGUgJFNUQU5EQVJEX0lORk9STUFUSU9OCisgKiBhdHRyaWJ1dGUgaXMgcHJlc2VudCBpbiBhbGwgYmFzZSBtZnQgcmVjb3JkcyAoaS5lLiBpbiBhbGwgZmlsZXMgYW5kCisgKiBkaXJlY3RvcmllcykuCisgKgorICogSWYgYSBtYXRjaCBpcyBub3QgZm91bmQsIHRoZSBzZWN1cml0eSBkZXNjcmlwdG9yIGlzIGFzc2lnbmVkIGEgbmV3IHVuaXF1ZQorICogc2VjdXJpdHlfaWQgYW5kIGlzIGFkZGVkIHRvIHRoZSAkU0RTIGRhdGEgYXR0cmlidXRlLiBUaGVuLCBlbnRyaWVzCisgKiByZWZlcmVuY2luZyB0aGUgdGhpcyBzZWN1cml0eSBkZXNjcmlwdG9yIGluIHRoZSAkU0RTIGRhdGEgYXR0cmlidXRlIGFyZQorICogYWRkZWQgdG8gdGhlICRTREggYW5kICRTSUkgaW5kZXhlcy4KKyAqCisgKiBOb3RlOiBFbnRyaWVzIGFyZSBuZXZlciBkZWxldGVkIGZyb20gRklMRV9TZWN1cmUsIGV2ZW4gaWYgbm90aGluZworICogcmVmZXJlbmNlcyBhbiBlbnRyeSBhbnkgbW9yZS4KKyAqLworCisvKgorICogVGhpcyBoZWFkZXIgcHJlY2VkZXMgZWFjaCBzZWN1cml0eSBkZXNjcmlwdG9yIGluIHRoZSAkU0RTIGRhdGEgc3RyZWFtLgorICogVGhpcyBpcyBhbHNvIHRoZSBpbmRleCBlbnRyeSBkYXRhIHBhcnQgb2YgYm90aCB0aGUgJFNJSSBhbmQgJFNESCBpbmRleGVzLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJbGUzMiBoYXNoOwkgIC8qIEhhc2ggb2YgdGhlIHNlY3VyaXR5IGRlc2NyaXB0b3IuICovCisJbGUzMiBzZWN1cml0eV9pZDsgLyogVGhlIHNlY3VyaXR5X2lkIGFzc2lnbmVkIHRvIHRoZSBkZXNjcmlwdG9yLiAqLworCWxlNjQgb2Zmc2V0OwkgIC8qIEJ5dGUgb2Zmc2V0IG9mIHRoaXMgZW50cnkgaW4gdGhlICRTRFMgc3RyZWFtLiAqLworCWxlMzIgbGVuZ3RoOwkgIC8qIFNpemUgaW4gYnl0ZXMgb2YgdGhpcyBlbnRyeSBpbiAkU0RTIHN0cmVhbS4gKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBTRUNVUklUWV9ERVNDUklQVE9SX0hFQURFUjsKKworLyoKKyAqIFRoZSAkU0RTIGRhdGEgc3RyZWFtIGNvbnRhaW5zIHRoZSBzZWN1cml0eSBkZXNjcmlwdG9ycywgYWxpZ25lZCBvbiAxNi1ieXRlCisgKiBib3VuZGFyaWVzLCBzb3J0ZWQgYnkgc2VjdXJpdHlfaWQgaW4gYSBCKyB0cmVlLiBTZWN1cml0eSBkZXNjcmlwdG9ycyBjYW5ub3QKKyAqIGNyb3NzIDI1NmtpYiBib3VuZGFyaWVzICh0aGlzIHJlc3RyaWN0aW9uIGlzIGltcG9zZWQgYnkgdGhlIFdpbmRvd3MgY2FjaGUKKyAqIG1hbmFnZXIpLiBFYWNoIHNlY3VyaXR5IGRlc2NyaXB0b3IgaXMgY29udGFpbmVkIGluIGEgU0RTX0VOVFJZIHN0cnVjdHVyZS4KKyAqIEFsc28sIGVhY2ggc2VjdXJpdHkgZGVzY3JpcHRvciBpcyBzdG9yZWQgdHdpY2UgaW4gdGhlICRTRFMgc3RyZWFtIHdpdGggYQorICogZml4ZWQgb2Zmc2V0IG9mIDB4NDAwMDAgYnl0ZXMgKDI1NmtpYiwgdGhlIFdpbmRvd3MgY2FjaGUgbWFuYWdlcidzIG1heCBzaXplKQorICogYmV0d2VlbiB0aGVtOyBpLmUuIGlmIGEgU0RTX0VOVFJZIHNwZWNpZmllcyBhbiBvZmZzZXQgb2YgMHg1MWQwLCB0aGVuIHRoZQorICogdGhlIGZpcnN0IGNvcHkgb2YgdGhlIHNlY3VyaXR5IGRlc2NyaXB0b3Igd2lsbCBiZSBhdCBvZmZzZXQgMHg1MWQwIGluIHRoZQorICogJFNEUyBkYXRhIHN0cmVhbSBhbmQgdGhlIHNlY29uZCBjb3B5IHdpbGwgYmUgYXQgb2Zmc2V0IDB4NDUxZDAuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKy8qT2ZzKi8KKy8qICAwCVNFQ1VSSVRZX0RFU0NSSVBUT1JfSEVBREVSOyAtLSBVbmZvbGRlZCBoZXJlIGFzIGdjYyBkb2Vzbid0IGxpa2UKKwkJCQkgICAgICAgdW5uYW1lZCBzdHJ1Y3RzLiAqLworCWxlMzIgaGFzaDsJICAvKiBIYXNoIG9mIHRoZSBzZWN1cml0eSBkZXNjcmlwdG9yLiAqLworCWxlMzIgc2VjdXJpdHlfaWQ7IC8qIFRoZSBzZWN1cml0eV9pZCBhc3NpZ25lZCB0byB0aGUgZGVzY3JpcHRvci4gKi8KKwlsZTY0IG9mZnNldDsJICAvKiBCeXRlIG9mZnNldCBvZiB0aGlzIGVudHJ5IGluIHRoZSAkU0RTIHN0cmVhbS4gKi8KKwlsZTMyIGxlbmd0aDsJICAvKiBTaXplIGluIGJ5dGVzIG9mIHRoaXMgZW50cnkgaW4gJFNEUyBzdHJlYW0uICovCisvKiAyMCovCVNFQ1VSSVRZX0RFU0NSSVBUT1JfUkVMQVRJVkUgc2lkOyAvKiBUaGUgc2VsZi1yZWxhdGl2ZSBzZWN1cml0eQorCQkJCQkgICAgIGRlc2NyaXB0b3IuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgU0RTX0VOVFJZOworCisvKgorICogVGhlIGluZGV4IGVudHJ5IGtleSB1c2VkIGluIHRoZSAkU0lJIGluZGV4LiBUaGUgY29sbGF0aW9uIHR5cGUgaXMKKyAqIENPTExBVElPTl9OVE9GU19VTE9ORy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWxlMzIgc2VjdXJpdHlfaWQ7IC8qIFRoZSBzZWN1cml0eV9pZCBhc3NpZ25lZCB0byB0aGUgZGVzY3JpcHRvci4gKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBTSUlfSU5ERVhfS0VZOworCisvKgorICogVGhlIGluZGV4IGVudHJ5IGtleSB1c2VkIGluIHRoZSAkU0RIIGluZGV4LiBUaGUga2V5cyBhcmUgc29ydGVkIGZpcnN0IGJ5CisgKiBoYXNoIGFuZCB0aGVuIGJ5IHNlY3VyaXR5X2lkLiBUaGUgY29sbGF0aW9uIHJ1bGUgaXMKKyAqIENPTExBVElPTl9OVE9GU19TRUNVUklUWV9IQVNILgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJbGUzMiBoYXNoOwkgIC8qIEhhc2ggb2YgdGhlIHNlY3VyaXR5IGRlc2NyaXB0b3IuICovCisJbGUzMiBzZWN1cml0eV9pZDsgLyogVGhlIHNlY3VyaXR5X2lkIGFzc2lnbmVkIHRvIHRoZSBkZXNjcmlwdG9yLiAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIFNESF9JTkRFWF9LRVk7CisKKy8qCisgKiBBdHRyaWJ1dGU6IFZvbHVtZSBuYW1lICgweDYwKS4KKyAqCisgKiBOT1RFOiBBbHdheXMgcmVzaWRlbnQuCisgKiBOT1RFOiBQcmVzZW50IG9ubHkgaW4gRklMRV9Wb2x1bWUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwludGZzY2hhciBuYW1lWzBdOwkvKiBUaGUgbmFtZSBvZiB0aGUgdm9sdW1lIGluIFVuaWNvZGUuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgVk9MVU1FX05BTUU7CisKKy8qCisgKiBQb3NzaWJsZSBmbGFncyBmb3IgdGhlIHZvbHVtZSAoMTYtYml0KS4KKyAqLworZW51bSB7CisJVk9MVU1FX0lTX0RJUlRZCQkJPSBjb25zdF9jcHVfdG9fbGUxNigweDAwMDEpLAorCVZPTFVNRV9SRVNJWkVfTE9HX0ZJTEUJCT0gY29uc3RfY3B1X3RvX2xlMTYoMHgwMDAyKSwKKwlWT0xVTUVfVVBHUkFERV9PTl9NT1VOVAkJPSBjb25zdF9jcHVfdG9fbGUxNigweDAwMDQpLAorCVZPTFVNRV9NT1VOVEVEX09OX05UNAkJPSBjb25zdF9jcHVfdG9fbGUxNigweDAwMDgpLAorCisJVk9MVU1FX0RFTEVURV9VU05fVU5ERVJXQVkJPSBjb25zdF9jcHVfdG9fbGUxNigweDAwMTApLAorCVZPTFVNRV9SRVBBSVJfT0JKRUNUX0lECQk9IGNvbnN0X2NwdV90b19sZTE2KDB4MDAyMCksCisKKwlWT0xVTUVfTU9ESUZJRURfQllfQ0hLRFNLCT0gY29uc3RfY3B1X3RvX2xlMTYoMHg4MDAwKSwKKworCVZPTFVNRV9GTEFHU19NQVNLCQk9IGNvbnN0X2NwdV90b19sZTE2KDB4ODAzZiksCisKKwkvKiBUbyBtYWtlIG91ciBsaWZlIGVhc2llciB3aGVuIGNoZWNraW5nIGlmIHdlIG11c3QgbW91bnQgcmVhZC1vbmx5LiAqLworCVZPTFVNRV9NVVNUX01PVU5UX1JPX01BU0sJPSBjb25zdF9jcHVfdG9fbGUxNigweDgwMzcpLAorfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpOworCit0eXBlZGVmIGxlMTYgVk9MVU1FX0ZMQUdTOworCisvKgorICogQXR0cmlidXRlOiBWb2x1bWUgaW5mb3JtYXRpb24gKDB4NzApLgorICoKKyAqIE5PVEU6IEFsd2F5cyByZXNpZGVudC4KKyAqIE5PVEU6IFByZXNlbnQgb25seSBpbiBGSUxFX1ZvbHVtZS4KKyAqIE5PVEU6IFdpbmRvd3MgMjAwMCB1c2VzIE5URlMgMy4wIHdoaWxlIFdpbmRvd3MgTlQ0IHNlcnZpY2UgcGFjayA2YSB1c2VzCisgKgkgTlRGUyAxLjIuIEkgaGF2ZW4ndCBwZXJzb25hbGx5IHNlZW4gb3RoZXIgdmFsdWVzIHlldC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWxlNjQgcmVzZXJ2ZWQ7CQkvKiBOb3QgdXNlZCAoeWV0PykuICovCisJdTggbWFqb3JfdmVyOwkJLyogTWFqb3IgdmVyc2lvbiBvZiB0aGUgbnRmcyBmb3JtYXQuICovCisJdTggbWlub3JfdmVyOwkJLyogTWlub3IgdmVyc2lvbiBvZiB0aGUgbnRmcyBmb3JtYXQuICovCisJVk9MVU1FX0ZMQUdTIGZsYWdzOwkvKiBCaXQgYXJyYXkgb2YgVk9MVU1FXyogZmxhZ3MuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgVk9MVU1FX0lORk9STUFUSU9OOworCisvKgorICogQXR0cmlidXRlOiBEYXRhIGF0dHJpYnV0ZSAoMHg4MCkuCisgKgorICogTk9URTogQ2FuIGJlIHJlc2lkZW50IG9yIG5vbi1yZXNpZGVudC4KKyAqCisgKiBEYXRhIGNvbnRlbnRzIG9mIGEgZmlsZSAoaS5lLiB0aGUgdW5uYW1lZCBzdHJlYW0pIG9yIG9mIGEgbmFtZWQgc3RyZWFtLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdTggZGF0YVswXTsJCS8qIFRoZSBmaWxlJ3MgZGF0YSBjb250ZW50cy4gKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBEQVRBX0FUVFI7CisKKy8qCisgKiBJbmRleCBoZWFkZXIgZmxhZ3MgKDgtYml0KS4KKyAqLworZW51bSB7CisJLyoKKwkgKiBXaGVuIGluZGV4IGhlYWRlciBpcyBpbiBhbiBpbmRleCByb290IGF0dHJpYnV0ZToKKwkgKi8KKwlTTUFMTF9JTkRFWCA9IDAsIC8qIFRoZSBpbmRleCBpcyBzbWFsbCBlbm91Z2ggdG8gZml0IGluc2lkZSB0aGUgaW5kZXgKKwkJCSAgICByb290IGF0dHJpYnV0ZSBhbmQgdGhlcmUgaXMgbm8gaW5kZXggYWxsb2NhdGlvbgorCQkJICAgIGF0dHJpYnV0ZSBwcmVzZW50LiAqLworCUxBUkdFX0lOREVYID0gMSwgLyogVGhlIGluZGV4IGlzIHRvbyBsYXJnZSB0byBmaXQgaW4gdGhlIGluZGV4IHJvb3QKKwkJCSAgICBhdHRyaWJ1dGUgYW5kL29yIGFuIGluZGV4IGFsbG9jYXRpb24gYXR0cmlidXRlIGlzCisJCQkgICAgcHJlc2VudC4gKi8KKwkvKgorCSAqIFdoZW4gaW5kZXggaGVhZGVyIGlzIGluIGFuIGluZGV4IGJsb2NrLCBpLmUuIGlzIHBhcnQgb2YgaW5kZXgKKwkgKiBhbGxvY2F0aW9uIGF0dHJpYnV0ZToKKwkgKi8KKwlMRUFGX05PREUgID0gMCwgLyogVGhpcyBpcyBhIGxlYWYgbm9kZSwgaS5lLiB0aGVyZSBhcmUgbm8gbW9yZSBub2RlcworCQkJICAgYnJhbmNoaW5nIG9mZiBpdC4gKi8KKwlJTkRFWF9OT0RFID0gMSwgLyogVGhpcyBub2RlIGluZGV4ZXMgb3RoZXIgbm9kZXMsIGkuZS4gaXQgaXMgbm90IGEgbGVhZgorCQkJICAgbm9kZS4gKi8KKwlOT0RFX01BU0sgID0gMSwgLyogTWFzayBmb3IgYWNjZXNzaW5nIHRoZSAqX05PREUgYml0cy4gKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKwordHlwZWRlZiB1OCBJTkRFWF9IRUFERVJfRkxBR1M7CisKKy8qCisgKiBUaGlzIGlzIHRoZSBoZWFkZXIgZm9yIGluZGV4ZXMsIGRlc2NyaWJpbmcgdGhlIElOREVYX0VOVFJZIHJlY29yZHMsIHdoaWNoCisgKiBmb2xsb3cgdGhlIElOREVYX0hFQURFUi4gVG9nZXRoZXIgdGhlIGluZGV4IGhlYWRlciBhbmQgdGhlIGluZGV4IGVudHJpZXMKKyAqIG1ha2UgdXAgYSBjb21wbGV0ZSBpbmRleC4KKyAqCisgKiBJTVBPUlRBTlQgTk9URTogVGhlIG9mZnNldCwgbGVuZ3RoIGFuZCBzaXplIHN0cnVjdHVyZSBtZW1iZXJzIGFyZSBjb3VudGVkCisgKiByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGluZGV4IGhlYWRlciBzdHJ1Y3R1cmUgYW5kIG5vdCByZWxhdGl2ZSB0byB0aGUKKyAqIHN0YXJ0IG9mIHRoZSBpbmRleCByb290IG9yIGluZGV4IGFsbG9jYXRpb24gc3RydWN0dXJlcyB0aGVtc2VsdmVzLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJbGUzMiBlbnRyaWVzX29mZnNldDsJCS8qIEJ5dGUgb2Zmc2V0IHRvIGZpcnN0IElOREVYX0VOVFJZCisJCQkJCSAgIGFsaWduZWQgdG8gOC1ieXRlIGJvdW5kYXJ5LiAqLworCWxlMzIgaW5kZXhfbGVuZ3RoOwkJLyogRGF0YSBzaXplIG9mIHRoZSBpbmRleCBpbiBieXRlcywKKwkJCQkJICAgaS5lLiBieXRlcyB1c2VkIGZyb20gYWxsb2NhdGVkCisJCQkJCSAgIHNpemUsIGFsaWduZWQgdG8gOC1ieXRlIGJvdW5kYXJ5LiAqLworCWxlMzIgYWxsb2NhdGVkX3NpemU7CQkvKiBCeXRlIHNpemUgb2YgdGhpcyBpbmRleCAoYmxvY2spLAorCQkJCQkgICBtdWx0aXBsZSBvZiA4IGJ5dGVzLiAqLworCS8qIE5PVEU6IEZvciB0aGUgaW5kZXggcm9vdCBhdHRyaWJ1dGUsIHRoZSBhYm92ZSB0d28gbnVtYmVycyBhcmUgYWx3YXlzCisJICAgZXF1YWwsIGFzIHRoZSBhdHRyaWJ1dGUgaXMgcmVzaWRlbnQgYW5kIGl0IGlzIHJlc2l6ZWQgYXMgbmVlZGVkLiBJbgorCSAgIHRoZSBjYXNlIG9mIHRoZSBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZSB0aGUgYXR0cmlidXRlIGlzIG5vdAorCSAgIHJlc2lkZW50IGFuZCBoZW5jZSB0aGUgYWxsb2NhdGVkX3NpemUgaXMgYSBmaXhlZCB2YWx1ZSBhbmQgbXVzdAorCSAgIGVxdWFsIHRoZSBpbmRleF9ibG9ja19zaXplIHNwZWNpZmllZCBieSB0aGUgSU5ERVhfUk9PVCBhdHRyaWJ1dGUKKwkgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBJTkRFWF9BTExPQ0FUSU9OIGF0dHJpYnV0ZSB0aGlzIElOREVYX0JMT0NLCisJICAgYmVsb25ncyB0by4gKi8KKwlJTkRFWF9IRUFERVJfRkxBR1MgZmxhZ3M7CS8qIEJpdCBmaWVsZCBvZiBJTkRFWF9IRUFERVJfRkxBR1MuICovCisJdTggcmVzZXJ2ZWRbM107CQkJLyogUmVzZXJ2ZWQvYWxpZ24gdG8gOC1ieXRlIGJvdW5kYXJ5LiAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIElOREVYX0hFQURFUjsKKworLyoKKyAqIEF0dHJpYnV0ZTogSW5kZXggcm9vdCAoMHg5MCkuCisgKgorICogTk9URTogQWx3YXlzIHJlc2lkZW50LgorICoKKyAqIFRoaXMgaXMgZm9sbG93ZWQgYnkgYSBzZXF1ZW5jZSBvZiBpbmRleCBlbnRyaWVzIChJTkRFWF9FTlRSWSBzdHJ1Y3R1cmVzKQorICogYXMgZGVzY3JpYmVkIGJ5IHRoZSBpbmRleCBoZWFkZXIuCisgKgorICogV2hlbiBhIGRpcmVjdG9yeSBpcyBzbWFsbCBlbm91Z2ggdG8gZml0IGluc2lkZSB0aGUgaW5kZXggcm9vdCB0aGVuIHRoaXMKKyAqIGlzIHRoZSBvbmx5IGF0dHJpYnV0ZSBkZXNjcmliaW5nIHRoZSBkaXJlY3RvcnkuIFdoZW4gdGhlIGRpcmVjdG9yeSBpcyB0b28KKyAqIGxhcmdlIHRvIGZpdCBpbiB0aGUgaW5kZXggcm9vdCwgb24gdGhlIG90aGVyIGhhbmQsIHR3byBhZGl0aW9uYWwgYXR0cmlidXRlcworICogYXJlIHByZXNlbnQ6IGFuIGluZGV4IGFsbG9jYXRpb24gYXR0cmlidXRlLCBjb250YWluaW5nIHN1Yi1ub2RlcyBvZiB0aGUgQisKKyAqIGRpcmVjdG9yeSB0cmVlIChzZWUgYmVsb3cpLCBhbmQgYSBiaXRtYXAgYXR0cmlidXRlLCBkZXNjcmliaW5nIHdoaWNoIHZpcnR1YWwKKyAqIGNsdXN0ZXIgbnVtYmVycyAodmNucykgaW4gdGhlIGluZGV4IGFsbG9jYXRpb24gYXR0cmlidXRlIGFyZSBpbiB1c2UgYnkgYW4KKyAqIGluZGV4IGJsb2NrLgorICoKKyAqIE5PVEU6IFRoZSByb290IGRpcmVjdG9yeSAoRklMRV9yb290KSBjb250YWlucyBhbiBlbnRyeSBmb3IgaXRzZWxmLiBPdGhlcgorICogZGlyY2V0b3JpZXMgZG8gbm90IGNvbnRhaW4gZW50cmllcyBmb3IgdGhlbXNlbHZlcywgdGhvdWdoLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJQVRUUl9UWVBFIHR5cGU7CQkJLyogVHlwZSBvZiB0aGUgaW5kZXhlZCBhdHRyaWJ1dGUuIElzCisJCQkJCSAgICRGSUxFX05BTUUgZm9yIGRpcmVjdG9yaWVzLCB6ZXJvCisJCQkJCSAgIGZvciB2aWV3IGluZGV4ZXMuIE5vIG90aGVyIHZhbHVlcworCQkJCQkgICBhbGxvd2VkLiAqLworCUNPTExBVElPTl9SVUxFIGNvbGxhdGlvbl9ydWxlOwkvKiBDb2xsYXRpb24gcnVsZSB1c2VkIHRvIHNvcnQgdGhlCisJCQkJCSAgIGluZGV4IGVudHJpZXMuIElmIHR5cGUgaXMgJEZJTEVfTkFNRSwKKwkJCQkJICAgdGhpcyBtdXN0IGJlIENPTExBVElPTl9GSUxFX05BTUUuICovCisJbGUzMiBpbmRleF9ibG9ja19zaXplOwkJLyogU2l6ZSBvZiBlYWNoIGluZGV4IGJsb2NrIGluIGJ5dGVzIChpbgorCQkJCQkgICB0aGUgaW5kZXggYWxsb2NhdGlvbiBhdHRyaWJ1dGUpLiAqLworCXU4IGNsdXN0ZXJzX3Blcl9pbmRleF9ibG9jazsJLyogQ2x1c3RlciBzaXplIG9mIGVhY2ggaW5kZXggYmxvY2sgKGluCisJCQkJCSAgIHRoZSBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZSksIHdoZW4KKwkJCQkJICAgYW4gaW5kZXggYmxvY2sgaXMgPj0gdGhhbiBhIGNsdXN0ZXIsCisJCQkJCSAgIG90aGVyd2lzZSB0aGlzIHdpbGwgYmUgdGhlIGxvZyBvZgorCQkJCQkgICB0aGUgc2l6ZSAobGlrZSBob3cgdGhlIGVuY29kaW5nIG9mCisJCQkJCSAgIHRoZSBtZnQgcmVjb3JkIHNpemUgYW5kIHRoZSBpbmRleAorCQkJCQkgICByZWNvcmQgc2l6ZSBmb3VuZCBpbiB0aGUgYm9vdCBzZWN0b3IKKwkJCQkJICAgd29yaykuIEhhcyB0byBiZSBhIHBvd2VyIG9mIDIuICovCisJdTggcmVzZXJ2ZWRbM107CQkJLyogUmVzZXJ2ZWQvYWxpZ24gdG8gOC1ieXRlIGJvdW5kYXJ5LiAqLworCUlOREVYX0hFQURFUiBpbmRleDsJCS8qIEluZGV4IGhlYWRlciBkZXNjcmliaW5nIHRoZQorCQkJCQkgICBmb2xsb3dpbmcgaW5kZXggZW50cmllcy4gKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBJTkRFWF9ST09UOworCisvKgorICogQXR0cmlidXRlOiBJbmRleCBhbGxvY2F0aW9uICgweGEwKS4KKyAqCisgKiBOT1RFOiBBbHdheXMgbm9uLXJlc2lkZW50IChkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gYmUgcmVzaWRlbnQgYW55d2F5ISkuCisgKgorICogVGhpcyBpcyBhbiBhcnJheSBvZiBpbmRleCBibG9ja3MuIEVhY2ggaW5kZXggYmxvY2sgc3RhcnRzIHdpdGggYW4KKyAqIElOREVYX0JMT0NLIHN0cnVjdHVyZSBjb250YWluaW5nIGFuIGluZGV4IGhlYWRlciwgZm9sbG93ZWQgYnkgYSBzZXF1ZW5jZSBvZgorICogaW5kZXggZW50cmllcyAoSU5ERVhfRU5UUlkgc3RydWN0dXJlcyksIGFzIGRlc2NyaWJlZCBieSB0aGUgSU5ERVhfSEVBREVSLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisvKiAgMAlOVEZTX1JFQ09SRDsgLS0gVW5mb2xkZWQgaGVyZSBhcyBnY2MgZG9lc24ndCBsaWtlIHVubmFtZWQgc3RydWN0cy4gKi8KKwlOVEZTX1JFQ09SRF9UWVBFIG1hZ2ljOwkvKiBNYWdpYyBpcyAiSU5EWCIuICovCisJbGUxNiB1c2Ffb2ZzOwkJLyogU2VlIE5URlNfUkVDT1JEIGRlZmluaXRpb24uICovCisJbGUxNiB1c2FfY291bnQ7CQkvKiBTZWUgTlRGU19SRUNPUkQgZGVmaW5pdGlvbi4gKi8KKworLyogIDgqLwlzbGU2NCBsc247CQkvKiAkTG9nRmlsZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGxhc3QKKwkJCQkgICBtb2RpZmljYXRpb24gb2YgdGhpcyBpbmRleCBibG9jay4gKi8KKy8qIDE2Ki8JbGVWQ04gaW5kZXhfYmxvY2tfdmNuOwkvKiBWaXJ0dWFsIGNsdXN0ZXIgbnVtYmVyIG9mIHRoZSBpbmRleCBibG9jay4KKwkJCQkgICBJZiB0aGUgY2x1c3Rlcl9zaXplIG9uIHRoZSB2b2x1bWUgaXMgPD0gdGhlCisJCQkJICAgaW5kZXhfYmxvY2tfc2l6ZSBvZiB0aGUgZGlyZWN0b3J5LAorCQkJCSAgIGluZGV4X2Jsb2NrX3ZjbiBjb3VudHMgaW4gdW5pdHMgb2YgY2x1c3RlcnMsCisJCQkJICAgYW5kIGluIHVuaXRzIG9mIHNlY3RvcnMgb3RoZXJ3aXNlLiAqLworLyogMjQqLwlJTkRFWF9IRUFERVIgaW5kZXg7CS8qIERlc2NyaWJlcyB0aGUgZm9sbG93aW5nIGluZGV4IGVudHJpZXMuICovCisvKiBzaXplb2YoKT0gNDAgKDB4MjgpIGJ5dGVzICovCisvKgorICogV2hlbiBjcmVhdGluZyB0aGUgaW5kZXggYmxvY2ssIHdlIHBsYWNlIHRoZSB1cGRhdGUgc2VxdWVuY2UgYXJyYXkgYXQgdGhpcworICogb2Zmc2V0LCBpLmUuIGJlZm9yZSB3ZSBzdGFydCB3aXRoIHRoZSBpbmRleCBlbnRyaWVzLiBUaGlzIGFsc28gbWFrZXMgc2Vuc2UsCisgKiBvdGhlcndpc2Ugd2UgY291bGQgcnVuIGludG8gcHJvYmxlbXMgd2l0aCB0aGUgdXBkYXRlIHNlcXVlbmNlIGFycmF5CisgKiBjb250YWluaW5nIGluIGl0c2VsZiB0aGUgbGFzdCB0d28gYnl0ZXMgb2YgYSBzZWN0b3Igd2hpY2ggd291bGQgbWVhbiB0aGF0CisgKiBtdWx0aSBzZWN0b3IgdHJhbnNmZXIgcHJvdGVjdGlvbiB3b3VsZG4ndCB3b3JrLiBBcyB5b3UgY2FuJ3QgcHJvdGVjdCBkYXRhCisgKiBieSBvdmVyd3JpdGluZyBpdCBzaW5jZSB5b3UgdGhlbiBjYW4ndCBnZXQgaXQgYmFjay4uLgorICogV2hlbiByZWFkaW5nIHVzZSB0aGUgZGF0YSBmcm9tIHRoZSBudGZzIHJlY29yZCBoZWFkZXIuCisgKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBJTkRFWF9CTE9DSzsKKwordHlwZWRlZiBJTkRFWF9CTE9DSyBJTkRFWF9BTExPQ0FUSU9OOworCisvKgorICogVGhlIHN5c3RlbSBmaWxlIEZJTEVfRXh0ZW5kLyRSZXBhcnNlIGNvbnRhaW5zIGFuIGluZGV4IG5hbWVkICRSIGxpc3RpbmcKKyAqIGFsbCByZXBhcnNlIHBvaW50cyBvbiB0aGUgdm9sdW1lLiBUaGUgaW5kZXggZW50cnkga2V5cyBhcmUgYXMgZGVmaW5lZAorICogYmVsb3cuIE5vdGUsIHRoYXQgdGhlcmUgaXMgbm8gaW5kZXggZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGluZGV4IGVudHJpZXMuCisgKgorICogVGhlIGluZGV4IGVudHJpZXMgYXJlIHNvcnRlZCBieSB0aGUgaW5kZXgga2V5IGZpbGVfaWQuIFRoZSBjb2xsYXRpb24gcnVsZSBpcworICogQ09MTEFUSU9OX05UT0ZTX1VMT05HUy4gRklYTUU6IFZlcmlmeSB3aGV0aGVyIHRoZSByZXBhcnNlX3RhZyBpcyBub3QgdGhlCisgKiBwcmltYXJ5IGtleSAvIGlzIG5vdCBhIGtleSBhdCBhbGwuIChBSUEpCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlsZTMyIHJlcGFyc2VfdGFnOwkvKiBSZXBhcnNlIHBvaW50IHR5cGUgKGluYy4gZmxhZ3MpLiAqLworCWxlTUZUX1JFRiBmaWxlX2lkOwkvKiBNZnQgcmVjb3JkIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisJCQkJICAgcmVwYXJzZSBwb2ludCBhdHRyaWJ1dGUuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgUkVQQVJTRV9JTkRFWF9LRVk7CisKKy8qCisgKiBRdW90YSBmbGFncyAoMzItYml0KS4KKyAqCisgKiBUaGUgdXNlciBxdW90YSBmbGFncy4gIE5hbWVzIGV4cGxhaW4gbWVhbmluZy4KKyAqLworZW51bSB7CisJUVVPVEFfRkxBR19ERUZBVUxUX0xJTUlUUwk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMDEpLAorCVFVT1RBX0ZMQUdfTElNSVRfUkVBQ0hFRAk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMDIpLAorCVFVT1RBX0ZMQUdfSURfREVMRVRFRAkJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDA0KSwKKworCVFVT1RBX0ZMQUdfVVNFUl9NQVNLCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMDcpLAorCS8qIFRoaXMgaXMgYSBiaXQgbWFzayBmb3IgdGhlIHVzZXIgcXVvdGEgZmxhZ3MuICovCisKKwkvKgorCSAqIFRoZXNlIGZsYWdzIGFyZSBvbmx5IHByZXNlbnQgaW4gdGhlIHF1b3RhIGRlZmF1bHRzIGluZGV4IGVudHJ5LCBpLmUuCisJICogaW4gdGhlIGVudHJ5IHdoZXJlIG93bmVyX2lkID0gUVVPVEFfREVGQVVMVFNfSUQuCisJICovCisJUVVPVEFfRkxBR19UUkFDS0lOR19FTkFCTEVECT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDAxMCksCisJUVVPVEFfRkxBR19FTkZPUkNFTUVOVF9FTkFCTEVECT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDAyMCksCisJUVVPVEFfRkxBR19UUkFDS0lOR19SRVFVRVNURUQJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDQwKSwKKwlRVU9UQV9GTEFHX0xPR19USFJFU0hPTEQJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDgwKSwKKworCVFVT1RBX0ZMQUdfTE9HX0xJTUlUCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAxMDApLAorCVFVT1RBX0ZMQUdfT1VUX09GX0RBVEUJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDIwMCksCisJUVVPVEFfRkxBR19DT1JSVVBUCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDA0MDApLAorCVFVT1RBX0ZMQUdfUEVORElOR19ERUxFVEVTCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDgwMCksCit9OworCit0eXBlZGVmIGxlMzIgUVVPVEFfRkxBR1M7CisKKy8qCisgKiBUaGUgc3lzdGVtIGZpbGUgRklMRV9FeHRlbmQvJFF1b3RhIGNvbnRhaW5zIHR3byBpbmRleGVzICRPIGFuZCAkUS4gUXVvdGFzCisgKiBhcmUgb24gYSBwZXIgdm9sdW1lIGFuZCBwZXIgdXNlciBiYXNpcy4KKyAqCisgKiBUaGUgJFEgaW5kZXggY29udGFpbnMgb25lIGVudHJ5IGZvciBlYWNoIGV4aXN0aW5nIHVzZXJfaWQgb24gdGhlIHZvbHVtZS4gVGhlCisgKiBpbmRleCBrZXkgaXMgdGhlIHVzZXJfaWQgb2YgdGhlIHVzZXIvZ3JvdXAgb3duaW5nIHRoaXMgcXVvdGEgY29udHJvbCBlbnRyeSwKKyAqIGkuZS4gdGhlIGtleSBpcyB0aGUgb3duZXJfaWQuIFRoZSB1c2VyX2lkIG9mIHRoZSBvd25lciBvZiBhIGZpbGUsIGkuZS4gdGhlCisgKiBvd25lcl9pZCwgaXMgZm91bmQgaW4gdGhlIHN0YW5kYXJkIGluZm9ybWF0aW9uIGF0dHJpYnV0ZS4gVGhlIGNvbGxhdGlvbiBydWxlCisgKiBmb3IgJFEgaXMgQ09MTEFUSU9OX05UT0ZTX1VMT05HLgorICoKKyAqIFRoZSAkTyBpbmRleCBjb250YWlucyBvbmUgZW50cnkgZm9yIGVhY2ggdXNlci9ncm91cCB3aG8gaGFzIGJlZW4gYXNzaWduZWQKKyAqIGEgcXVvdGEgb24gdGhhdCB2b2x1bWUuIFRoZSBpbmRleCBrZXkgaG9sZHMgdGhlIFNJRCBvZiB0aGUgdXNlcl9pZCB0aGUKKyAqIGVudHJ5IGJlbG9uZ3MgdG8sIGkuZS4gdGhlIG93bmVyX2lkLiBUaGUgY29sbGF0aW9uIHJ1bGUgZm9yICRPIGlzCisgKiBDT0xMQVRJT05fTlRPRlNfU0lELgorICoKKyAqIFRoZSAkTyBpbmRleCBlbnRyeSBkYXRhIGlzIHRoZSB1c2VyX2lkIG9mIHRoZSB1c2VyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFNJRC4KKyAqIFRoaXMgdXNlcl9pZCBpcyB1c2VkIGFzIGFuIGluZGV4IGludG8gJFEgdG8gZmluZCB0aGUgcXVvdGEgY29udHJvbCBlbnRyeQorICogYXNzb2NpYXRlZCB3aXRoIHRoZSBTSUQuCisgKgorICogVGhlICRRIGluZGV4IGVudHJ5IGRhdGEgaXMgdGhlIHF1b3RhIGNvbnRyb2wgZW50cnkgYW5kIGlzIGRlZmluZWQgYmVsb3cuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlsZTMyIHZlcnNpb247CQkvKiBDdXJyZW50bHkgZXF1YWxzIDIuICovCisJUVVPVEFfRkxBR1MgZmxhZ3M7CS8qIEZsYWdzIGRlc2NyaWJpbmcgdGhpcyBxdW90YSBlbnRyeS4gKi8KKwlsZTY0IGJ5dGVzX3VzZWQ7CS8qIEhvdyBtYW55IGJ5dGVzIG9mIHRoZSBxdW90YSBhcmUgaW4gdXNlLiAqLworCXNsZTY0IGNoYW5nZV90aW1lOwkvKiBMYXN0IHRpbWUgdGhpcyBxdW90YSBlbnRyeSB3YXMgY2hhbmdlZC4gKi8KKwlzbGU2NCB0aHJlc2hvbGQ7CS8qIFNvZnQgcXVvdGEgKC0xIGlmIG5vdCBsaW1pdGVkKS4gKi8KKwlzbGU2NCBsaW1pdDsJCS8qIEhhcmQgcXVvdGEgKC0xIGlmIG5vdCBsaW1pdGVkKS4gKi8KKwlzbGU2NCBleGNlZWRlZF90aW1lOwkvKiBIb3cgbG9uZyB0aGUgc29mdCBxdW90YSBoYXMgYmVlbiBleGNlZWRlZC4gKi8KKwlTSUQgc2lkOwkJLyogVGhlIFNJRCBvZiB0aGUgdXNlci9vYmplY3QgYXNzb2NpYXRlZCB3aXRoCisJCQkJICAgdGhpcyBxdW90YSBlbnRyeS4gIEVxdWFscyB6ZXJvIGZvciB0aGUgcXVvdGEKKwkJCQkgICBkZWZhdWx0cyBlbnRyeSAoYW5kIGluIGZhY3Qgb24gYSBXaW5YUAorCQkJCSAgIHZvbHVtZSwgaXQgaXMgbm90IHByZXNlbnQgYXQgYWxsKS4gKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBRVU9UQV9DT05UUk9MX0VOVFJZOworCisvKgorICogUHJlZGVmaW5lZCBvd25lcl9pZCB2YWx1ZXMgKDMyLWJpdCkuCisgKi8KK2VudW0geworCVFVT1RBX0lOVkFMSURfSUQJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMDAwKSwKKwlRVU9UQV9ERUZBVUxUU19JRAk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMDEpLAorCVFVT1RBX0ZJUlNUX1VTRVJfSUQJPSBjb25zdF9jcHVfdG9fbGUzMigweDAwMDAwMTAwKSwKK307CisKKy8qCisgKiBDdXJyZW50IGNvbnN0YW50cyBmb3IgcXVvdGEgY29udHJvbCBlbnRyaWVzLgorICovCit0eXBlZGVmIGVudW0geworCS8qIEN1cnJlbnQgdmVyc2lvbi4gKi8KKwlRVU9UQV9WRVJTSU9OCT0gMiwKK30gUVVPVEFfQ09OVFJPTF9FTlRSWV9DT05TVEFOVFM7CisKKy8qCisgKiBJbmRleCBlbnRyeSBmbGFncyAoMTYtYml0KS4KKyAqLworZW51bSB7CisJSU5ERVhfRU5UUllfTk9ERSA9IGNvbnN0X2NwdV90b19sZTE2KDEpLCAvKiBUaGlzIGVudHJ5IGNvbnRhaW5zIGEKKwkJCXN1Yi1ub2RlLCBpLmUuIGEgcmVmZXJlbmNlIHRvIGFuIGluZGV4IGJsb2NrIGluIGZvcm0gb2YKKwkJCWEgdmlydHVhbCBjbHVzdGVyIG51bWJlciAoc2VlIGJlbG93KS4gKi8KKwlJTkRFWF9FTlRSWV9FTkQgID0gY29uc3RfY3B1X3RvX2xlMTYoMiksIC8qIFRoaXMgc2lnbmlmaWVzIHRoZSBsYXN0CisJCQllbnRyeSBpbiBhbiBpbmRleCBibG9jay4gIFRoZSBpbmRleCBlbnRyeSBkb2VzIG5vdAorCQkJcmVwcmVzZW50IGEgZmlsZSBidXQgaXQgY2FuIHBvaW50IHRvIGEgc3ViLW5vZGUuICovCisKKwlJTkRFWF9FTlRSWV9TUEFDRV9GSUxMRVIgPSBjb25zdF9jcHVfdG9fbGUxNigweGZmZmYpLCAvKiBnY2M6IEZvcmNlCisJCQllbnVtIGJpdCB3aWR0aCB0byAxNi1iaXQuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3R5cGVkZWYgbGUxNiBJTkRFWF9FTlRSWV9GTEFHUzsKKworLyoKKyAqIFRoaXMgdGhlIGluZGV4IGVudHJ5IGhlYWRlciAoc2VlIGJlbG93KS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworLyogIDAqLwl1bmlvbiB7CisJCXN0cnVjdCB7IC8qIE9ubHkgdmFsaWQgd2hlbiBJTkRFWF9FTlRSWV9FTkQgaXMgbm90IHNldC4gKi8KKwkJCWxlTUZUX1JFRiBpbmRleGVkX2ZpbGU7CS8qIFRoZSBtZnQgcmVmZXJlbmNlIG9mIHRoZSBmaWxlCisJCQkJCQkgICBkZXNjcmliZWQgYnkgdGhpcyBpbmRleAorCQkJCQkJICAgZW50cnkuIFVzZWQgZm9yIGRpcmVjdG9yeQorCQkJCQkJICAgaW5kZXhlcy4gKi8KKwkJfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIGRpcjsKKwkJc3RydWN0IHsgLyogVXNlZCBmb3Igdmlld3MvaW5kZXhlcyB0byBmaW5kIHRoZSBlbnRyeSdzIGRhdGEuICovCisJCQlsZTE2IGRhdGFfb2Zmc2V0OwkvKiBEYXRhIGJ5dGUgb2Zmc2V0IGZyb20gdGhpcworCQkJCQkJICAgSU5ERVhfRU5UUlkuIEZvbGxvd3MgdGhlCisJCQkJCQkgICBpbmRleCBrZXkuICovCisJCQlsZTE2IGRhdGFfbGVuZ3RoOwkvKiBEYXRhIGxlbmd0aCBpbiBieXRlcy4gKi8KKwkJCWxlMzIgcmVzZXJ2ZWRWOwkJLyogUmVzZXJ2ZWQgKHplcm8pLiAqLworCQl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgdmk7CisJfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIGRhdGE7CisvKiAgOCovCWxlMTYgbGVuZ3RoOwkJIC8qIEJ5dGUgc2l6ZSBvZiB0aGlzIGluZGV4IGVudHJ5LCBtdWx0aXBsZSBvZgorCQkJCSAgICA4LWJ5dGVzLiAqLworLyogMTAqLwlsZTE2IGtleV9sZW5ndGg7CSAvKiBCeXRlIHNpemUgb2YgdGhlIGtleSB2YWx1ZSwgd2hpY2ggaXMgaW4gdGhlCisJCQkJICAgIGluZGV4IGVudHJ5LiBJdCBmb2xsb3dzIGZpZWxkIHJlc2VydmVkLiBOb3QKKwkJCQkgICAgbXVsdGlwbGUgb2YgOC1ieXRlcy4gKi8KKy8qIDEyKi8JSU5ERVhfRU5UUllfRkxBR1MgZmxhZ3M7IC8qIEJpdCBmaWVsZCBvZiBJTkRFWF9FTlRSWV8qIGZsYWdzLiAqLworLyogMTQqLwlsZTE2IHJlc2VydmVkOwkJIC8qIFJlc2VydmVkL2FsaWduIHRvIDgtYnl0ZSBib3VuZGFyeS4gKi8KKy8qIHNpemVvZigpID0gMTYgYnl0ZXMgKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBJTkRFWF9FTlRSWV9IRUFERVI7CisKKy8qCisgKiBUaGlzIGlzIGFuIGluZGV4IGVudHJ5LiBBIHNlcXVlbmNlIG9mIHN1Y2ggZW50cmllcyBmb2xsb3dzIGVhY2ggSU5ERVhfSEVBREVSCisgKiBzdHJ1Y3R1cmUuIFRvZ2V0aGVyIHRoZXkgbWFrZSB1cCBhIGNvbXBsZXRlIGluZGV4LiBUaGUgaW5kZXggZm9sbG93cyBlaXRoZXIKKyAqIGFuIGluZGV4IHJvb3QgYXR0cmlidXRlIG9yIGFuIGluZGV4IGFsbG9jYXRpb24gYXR0cmlidXRlLgorICoKKyAqIE5PVEU6IEJlZm9yZSBOVEZTIDMuMCBvbmx5IGZpbGVuYW1lIGF0dHJpYnV0ZXMgd2VyZSBpbmRleGVkLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisvKk9mcyovCisvKiAgMAlJTkRFWF9FTlRSWV9IRUFERVI7IC0tIFVuZm9sZGVkIGhlcmUgYXMgZ2NjIGRpc2xpa2VzIHVubmFtZWQgc3RydWN0cy4gKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7IC8qIE9ubHkgdmFsaWQgd2hlbiBJTkRFWF9FTlRSWV9FTkQgaXMgbm90IHNldC4gKi8KKwkJCWxlTUZUX1JFRiBpbmRleGVkX2ZpbGU7CS8qIFRoZSBtZnQgcmVmZXJlbmNlIG9mIHRoZSBmaWxlCisJCQkJCQkgICBkZXNjcmliZWQgYnkgdGhpcyBpbmRleAorCQkJCQkJICAgZW50cnkuIFVzZWQgZm9yIGRpcmVjdG9yeQorCQkJCQkJICAgaW5kZXhlcy4gKi8KKwkJfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIGRpcjsKKwkJc3RydWN0IHsgLyogVXNlZCBmb3Igdmlld3MvaW5kZXhlcyB0byBmaW5kIHRoZSBlbnRyeSdzIGRhdGEuICovCisJCQlsZTE2IGRhdGFfb2Zmc2V0OwkvKiBEYXRhIGJ5dGUgb2Zmc2V0IGZyb20gdGhpcworCQkJCQkJICAgSU5ERVhfRU5UUlkuIEZvbGxvd3MgdGhlCisJCQkJCQkgICBpbmRleCBrZXkuICovCisJCQlsZTE2IGRhdGFfbGVuZ3RoOwkvKiBEYXRhIGxlbmd0aCBpbiBieXRlcy4gKi8KKwkJCWxlMzIgcmVzZXJ2ZWRWOwkJLyogUmVzZXJ2ZWQgKHplcm8pLiAqLworCQl9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgdmk7CisJfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIGRhdGE7CisJbGUxNiBsZW5ndGg7CQkgLyogQnl0ZSBzaXplIG9mIHRoaXMgaW5kZXggZW50cnksIG11bHRpcGxlIG9mCisJCQkJICAgIDgtYnl0ZXMuICovCisJbGUxNiBrZXlfbGVuZ3RoOwkgLyogQnl0ZSBzaXplIG9mIHRoZSBrZXkgdmFsdWUsIHdoaWNoIGlzIGluIHRoZQorCQkJCSAgICBpbmRleCBlbnRyeS4gSXQgZm9sbG93cyBmaWVsZCByZXNlcnZlZC4gTm90CisJCQkJICAgIG11bHRpcGxlIG9mIDgtYnl0ZXMuICovCisJSU5ERVhfRU5UUllfRkxBR1MgZmxhZ3M7IC8qIEJpdCBmaWVsZCBvZiBJTkRFWF9FTlRSWV8qIGZsYWdzLiAqLworCWxlMTYgcmVzZXJ2ZWQ7CQkgLyogUmVzZXJ2ZWQvYWxpZ24gdG8gOC1ieXRlIGJvdW5kYXJ5LiAqLworCisvKiAxNiovCXVuaW9uIHsJCS8qIFRoZSBrZXkgb2YgdGhlIGluZGV4ZWQgYXR0cmlidXRlLiBOT1RFOiBPbmx5IHByZXNlbnQKKwkJCSAgIGlmIElOREVYX0VOVFJZX0VORCBiaXQgaW4gZmxhZ3MgaXMgbm90IHNldC4gTk9URTogT24KKwkJCSAgIE5URlMgdmVyc2lvbnMgYmVmb3JlIDMuMCB0aGUgb25seSB2YWxpZCBrZXkgaXMgdGhlCisJCQkgICBGSUxFX05BTUVfQVRUUi4gT24gTlRGUyAzLjArIHRoZSBmb2xsb3dpbmcKKwkJCSAgIGFkZGl0aW9uYWwgaW5kZXgga2V5cyBhcmUgZGVmaW5lZDogKi8KKwkJRklMRV9OQU1FX0FUVFIgZmlsZV9uYW1lOy8qICRJMzAgaW5kZXggaW4gZGlyZWN0b3JpZXMuICovCisJCVNJSV9JTkRFWF9LRVkgc2lpOwkvKiAkU0lJIGluZGV4IGluICRTZWN1cmUuICovCisJCVNESF9JTkRFWF9LRVkgc2RoOwkvKiAkU0RIIGluZGV4IGluICRTZWN1cmUuICovCisJCUdVSUQgb2JqZWN0X2lkOwkJLyogJE8gaW5kZXggaW4gRklMRV9FeHRlbmQvJE9iaklkOiBUaGUKKwkJCQkJICAgb2JqZWN0X2lkIG9mIHRoZSBtZnQgcmVjb3JkIGZvdW5kIGluCisJCQkJCSAgIHRoZSBkYXRhIHBhcnQgb2YgdGhlIGluZGV4LiAqLworCQlSRVBBUlNFX0lOREVYX0tFWSByZXBhcnNlOwkvKiAkUiBpbmRleCBpbgorCQkJCQkJICAgRklMRV9FeHRlbmQvJFJlcGFyc2UuICovCisJCVNJRCBzaWQ7CQkvKiAkTyBpbmRleCBpbiBGSUxFX0V4dGVuZC8kUXVvdGE6CisJCQkJCSAgIFNJRCBvZiB0aGUgb3duZXIgb2YgdGhlIHVzZXJfaWQuICovCisJCWxlMzIgb3duZXJfaWQ7CQkvKiAkUSBpbmRleCBpbiBGSUxFX0V4dGVuZC8kUXVvdGE6CisJCQkJCSAgIHVzZXJfaWQgb2YgdGhlIG93bmVyIG9mIHRoZSBxdW90YQorCQkJCQkgICBjb250cm9sIGVudHJ5IGluIHRoZSBkYXRhIHBhcnQgb2YKKwkJCQkJICAgdGhlIGluZGV4LiAqLworCX0gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBrZXk7CisJLyogVGhlIChvcHRpb25hbCkgaW5kZXggZGF0YSBpcyBpbnNlcnRlZCBoZXJlIHdoZW4gY3JlYXRpbmcuICovCisJLy8gbGVWQ04gdmNuOwkvKiBJZiBJTkRFWF9FTlRSWV9OT0RFIGJpdCBpbiBmbGFncyBpcyBzZXQsIHRoZSBsYXN0CisJLy8JCSAgIGVpZ2h0IGJ5dGVzIG9mIHRoaXMgaW5kZXggZW50cnkgY29udGFpbiB0aGUgdmlydHVhbAorCS8vCQkgICBjbHVzdGVyIG51bWJlciBvZiB0aGUgaW5kZXggYmxvY2sgdGhhdCBob2xkcyB0aGUKKwkvLwkJICAgZW50cmllcyBpbW1lZGlhdGVseSBwcmVjZWRpbmcgdGhlIGN1cnJlbnQgZW50cnkgKHRoZQorCS8vCQkgICB2Y24gcmVmZXJlbmNlcyB0aGUgY29ycmVzcG9uZGluZyBjbHVzdGVyIGluIHRoZSBkYXRhCisJLy8JCSAgIG9mIHRoZSBub24tcmVzaWRlbnQgaW5kZXggYWxsb2NhdGlvbiBhdHRyaWJ1dGUpLiBJZgorCS8vCQkgICB0aGUga2V5X2xlbmd0aCBpcyB6ZXJvLCB0aGVuIHRoZSB2Y24gaW1tZWRpYXRlbHkKKwkvLwkJICAgZm9sbG93cyB0aGUgSU5ERVhfRU5UUllfSEVBREVSLiBSZWdhcmRsZXNzIG9mCisJLy8JCSAgIGtleV9sZW5ndGgsIHRoZSBhZGRyZXNzIG9mIHRoZSA4LWJ5dGUgYm91bmRhcnkKKwkvLwkJICAgYWxsaWduZWQgdmNuIG9mIElOREVYX0VOVFJZe19IRUFERVJ9ICppZSBpcyBnaXZlbiBieQorCS8vCQkgICAoY2hhciopaWUgKyBsZTE2X3RvX2NwdShpZSopLT5sZW5ndGgpIC0gc2l6ZW9mKFZDTiksCisJLy8JCSAgIHdoZXJlIHNpemVvZihWQ04pIGNhbiBiZSBoYXJkY29kZWQgYXMgOCBpZiB3YW50ZWQuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgSU5ERVhfRU5UUlk7CisKKy8qCisgKiBBdHRyaWJ1dGU6IEJpdG1hcCAoMHhiMCkuCisgKgorICogQ29udGFpbnMgYW4gYXJyYXkgb2YgYml0cyAoYWthIGEgYml0ZmllbGQpLgorICoKKyAqIFdoZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBpbmRleCBhbGxvY2F0aW9uIGF0dHJpYnV0ZSwgZWFjaCBiaXQKKyAqIGNvcnJlc3BvbmRzIHRvIG9uZSBpbmRleCBibG9jayB3aXRoaW4gdGhlIGluZGV4IGFsbG9jYXRpb24gYXR0cmlidXRlLiBUaHVzCisgKiB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGJpdG1hcCAqIGluZGV4IGJsb2NrIHNpemUgLyBjbHVzdGVyIHNpemUgaXMgdGhlCisgKiBudW1iZXIgb2YgY2x1c3RlcnMgaW4gdGhlIGluZGV4IGFsbG9jYXRpb24gYXR0cmlidXRlLgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJdTggYml0bWFwWzBdOwkJCS8qIEFycmF5IG9mIGJpdHMuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgQklUTUFQX0FUVFI7CisKKy8qCisgKiBUaGUgcmVwYXJzZSBwb2ludCB0YWcgZGVmaW5lcyB0aGUgdHlwZSBvZiB0aGUgcmVwYXJzZSBwb2ludC4gSXQgYWxzbworICogaW5jbHVkZXMgc2V2ZXJhbCBmbGFncywgd2hpY2ggZnVydGhlciBkZXNjcmliZSB0aGUgcmVwYXJzZSBwb2ludC4KKyAqCisgKiBUaGUgcmVwYXJzZSBwb2ludCB0YWcgaXMgYW4gdW5zaWduZWQgMzItYml0IHZhbHVlIGRpdmlkZWQgaW4gdGhyZWUgcGFydHM6CisgKgorICogMS4gVGhlIGxlYXN0IHNpZ25pZmljYW50IDE2IGJpdHMgKGkuZS4gYml0cyAwIHRvIDE1KSBzcGVjaWZpeSB0aGUgdHlwZSBvZgorICogICAgdGhlIHJlcGFyc2UgcG9pbnQuCisgKiAyLiBUaGUgMTMgYml0cyBhZnRlciB0aGlzIChpLmUuIGJpdHMgMTYgdG8gMjgpIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4KKyAqIDMuIFRoZSBtb3N0IHNpZ25pZmljYW50IHRocmVlIGJpdHMgYXJlIGZsYWdzIGRlc2NyaWJpbmcgdGhlIHJlcGFyc2UgcG9pbnQuCisgKiAgICBUaGV5IGFyZSBkZWZpbmVkIGFzIGZvbGxvd3M6CisgKgliaXQgMjk6IE5hbWUgc3Vycm9nYXRlIGJpdC4gSWYgc2V0LCB0aGUgZmlsZW5hbWUgaXMgYW4gYWxpYXMgZm9yCisgKgkJYW5vdGhlciBvYmplY3QgaW4gdGhlIHN5c3RlbS4KKyAqCWJpdCAzMDogSGlnaC1sYXRlbmN5IGJpdC4gSWYgc2V0LCBhY2Nlc3NpbmcgdGhlIGZpcnN0IGJ5dGUgb2YgZGF0YSB3aWxsCisgKgkJYmUgc2xvdy4gKEUuZy4gdGhlIGRhdGEgaXMgc3RvcmVkIG9uIGEgdGFwZSBkcml2ZS4pCisgKgliaXQgMzE6IE1pY3Jvc29mdCBiaXQuIElmIHNldCwgdGhlIHRhZyBpcyBvd25lZCBieSBNaWNyb3NvZnQuIFVzZXIKKyAqCQlkZWZpbmVkIHRhZ3MgaGF2ZSB0byB1c2UgemVybyBoZXJlLgorICoKKyAqIFRoZXNlIGFyZSB0aGUgcHJlZGVmaW5lZCByZXBhcnNlIHBvaW50IHRhZ3M6CisgKi8KK2VudW0geworCUlPX1JFUEFSU0VfVEFHX0lTX0FMSUFTCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MjAwMDAwMDApLAorCUlPX1JFUEFSU0VfVEFHX0lTX0hJR0hfTEFURU5DWQk9IGNvbnN0X2NwdV90b19sZTMyKDB4NDAwMDAwMDApLAorCUlPX1JFUEFSU0VfVEFHX0lTX01JQ1JPU09GVAk9IGNvbnN0X2NwdV90b19sZTMyKDB4ODAwMDAwMDApLAorCisJSU9fUkVQQVJTRV9UQUdfUkVTRVJWRURfWkVSTwk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMDApLAorCUlPX1JFUEFSU0VfVEFHX1JFU0VSVkVEX09ORQk9IGNvbnN0X2NwdV90b19sZTMyKDB4MDAwMDAwMDEpLAorCUlPX1JFUEFSU0VfVEFHX1JFU0VSVkVEX1JBTkdFCT0gY29uc3RfY3B1X3RvX2xlMzIoMHgwMDAwMDAwMSksCisKKwlJT19SRVBBUlNFX1RBR19OU1MJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHg2ODAwMDAwNSksCisJSU9fUkVQQVJTRV9UQUdfTlNTX1JFQ09WRVIJPSBjb25zdF9jcHVfdG9fbGUzMigweDY4MDAwMDA2KSwKKwlJT19SRVBBUlNFX1RBR19TSVMJCT0gY29uc3RfY3B1X3RvX2xlMzIoMHg2ODAwMDAwNyksCisJSU9fUkVQQVJTRV9UQUdfREZTCQk9IGNvbnN0X2NwdV90b19sZTMyKDB4NjgwMDAwMDgpLAorCisJSU9fUkVQQVJTRV9UQUdfTU9VTlRfUE9JTlQJPSBjb25zdF9jcHVfdG9fbGUzMigweDg4MDAwMDAzKSwKKworCUlPX1JFUEFSU0VfVEFHX0hTTQkJPSBjb25zdF9jcHVfdG9fbGUzMigweGE4MDAwMDA0KSwKKworCUlPX1JFUEFSU0VfVEFHX1NZTUJPTElDX0xJTksJPSBjb25zdF9jcHVfdG9fbGUzMigweGU4MDAwMDAwKSwKKworCUlPX1JFUEFSU0VfVEFHX1ZBTElEX1ZBTFVFUwk9IGNvbnN0X2NwdV90b19sZTMyKDB4ZTAwMGZmZmYpLAorfTsKKworLyoKKyAqIEF0dHJpYnV0ZTogUmVwYXJzZSBwb2ludCAoMHhjMCkuCisgKgorICogTk9URTogQ2FuIGJlIHJlc2lkZW50IG9yIG5vbi1yZXNpZGVudC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWxlMzIgcmVwYXJzZV90YWc7CQkvKiBSZXBhcnNlIHBvaW50IHR5cGUgKGluYy4gZmxhZ3MpLiAqLworCWxlMTYgcmVwYXJzZV9kYXRhX2xlbmd0aDsJLyogQnl0ZSBzaXplIG9mIHJlcGFyc2UgZGF0YS4gKi8KKwlsZTE2IHJlc2VydmVkOwkJCS8qIEFsaWduIHRvIDgtYnl0ZSBib3VuZGFyeS4gKi8KKwl1OCByZXBhcnNlX2RhdGFbMF07CQkvKiBNZWFuaW5nIGRlcGVuZHMgb24gcmVwYXJzZV90YWcuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgUkVQQVJTRV9QT0lOVDsKKworLyoKKyAqIEF0dHJpYnV0ZTogRXh0ZW5kZWQgYXR0cmlidXRlIChFQSkgaW5mb3JtYXRpb24gKDB4ZDApLgorICoKKyAqIE5PVEU6IEFsd2F5cyByZXNpZGVudC4gKElzIHRoaXMgdHJ1ZT8/PykKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWxlMTYgZWFfbGVuZ3RoOwkJLyogQnl0ZSBzaXplIG9mIHRoZSBwYWNrZWQgZXh0ZW5kZWQKKwkJCQkgICBhdHRyaWJ1dGVzLiAqLworCWxlMTYgbmVlZF9lYV9jb3VudDsJLyogVGhlIG51bWJlciBvZiBleHRlbmRlZCBhdHRyaWJ1dGVzIHdoaWNoIGhhdmUKKwkJCQkgICB0aGUgTkVFRF9FQSBiaXQgc2V0LiAqLworCWxlMzIgZWFfcXVlcnlfbGVuZ3RoOwkvKiBCeXRlIHNpemUgb2YgdGhlIGJ1ZmZlciByZXF1aXJlZCB0byBxdWVyeQorCQkJCSAgIHRoZSBleHRlbmRlZCBhdHRyaWJ1dGVzIHdoZW4gY2FsbGluZworCQkJCSAgIFp3UXVlcnlFYUZpbGUoKSBpbiBXaW5kb3dzIE5ULzJrLiBJLmUuIHRoZQorCQkJCSAgIGJ5dGUgc2l6ZSBvZiB0aGUgdW5wYWNrZWQgZXh0ZW5kZWQKKwkJCQkgICBhdHRyaWJ1dGVzLiAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIEVBX0lORk9STUFUSU9OOworCisvKgorICogRXh0ZW5kZWQgYXR0cmlidXRlIGZsYWdzICg4LWJpdCkuCisgKi8KK2VudW0geworCU5FRURfRUEJPSAweDgwCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSk7CisKK3R5cGVkZWYgdTggRUFfRkxBR1M7CisKKy8qCisgKiBBdHRyaWJ1dGU6IEV4dGVuZGVkIGF0dHJpYnV0ZSAoRUEpICgweGUwKS4KKyAqCisgKiBOT1RFOiBBbHdheXMgbm9uLXJlc2lkZW50LiAoSXMgdGhpcyB0cnVlPykKKyAqCisgKiBMaWtlIHRoZSBhdHRyaWJ1dGUgbGlzdCBhbmQgdGhlIGluZGV4IGJ1ZmZlciBsaXN0LCB0aGUgRUEgYXR0cmlidXRlIHZhbHVlIGlzCisgKiBhIHNlcXVlbmNlIG9mIEVBX0FUVFIgdmFyaWFibGUgbGVuZ3RoIHJlY29yZHMuCisgKgorICogRklYTUU6IEl0IGFwcGVhcnMgd2VpcmQgdGhhdCB0aGUgRUEgbmFtZSBpcyBub3QgdW5pY29kZS4gSXMgaXQgdHJ1ZT8KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWxlMzIgbmV4dF9lbnRyeV9vZmZzZXQ7CS8qIE9mZnNldCB0byB0aGUgbmV4dCBFQV9BVFRSLiAqLworCUVBX0ZMQUdTIGZsYWdzOwkJLyogRmxhZ3MgZGVzY3JpYmluZyB0aGUgRUEuICovCisJdTggZWFfbmFtZV9sZW5ndGg7CS8qIExlbmd0aCBvZiB0aGUgbmFtZSBvZiB0aGUgRUEgaW4gYnl0ZXMuICovCisJbGUxNiBlYV92YWx1ZV9sZW5ndGg7CS8qIEJ5dGUgc2l6ZSBvZiB0aGUgRUEncyB2YWx1ZS4gKi8KKwl1OCBlYV9uYW1lWzBdOwkJLyogTmFtZSBvZiB0aGUgRUEuICovCisJdTggZWFfdmFsdWVbMF07CQkvKiBUaGUgdmFsdWUgb2YgdGhlIEVBLiBJbW1lZGlhdGVseSBmb2xsb3dzCisJCQkJICAgdGhlIG5hbWUuICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgRUFfQVRUUjsKKworLyoKKyAqIEF0dHJpYnV0ZTogUHJvcGVydHkgc2V0ICgweGYwKS4KKyAqCisgKiBJbnRlbmRlZCB0byBzdXBwb3J0IE5hdGl2ZSBTdHJ1Y3R1cmUgU3RvcmFnZSAoTlNTKSAtIGEgZmVhdHVyZSByZW1vdmVkIGZyb20KKyAqIE5URlMgMy4wIGR1cmluZyBiZXRhIHRlc3RpbmcuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKiBJcnJlbGV2YW50IGFzIGZlYXR1cmUgdW51c2VkLiAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIFBST1BFUlRZX1NFVDsKKworLyoKKyAqIEF0dHJpYnV0ZTogTG9nZ2VkIHV0aWxpdHkgc3RyZWFtICgweDEwMCkuCisgKgorICogTk9URTogQ2FuIGJlIHJlc2lkZW50IG9yIG5vbi1yZXNpZGVudC4KKyAqCisgKiBPcGVyYXRpb25zIG9uIHRoaXMgYXR0cmlidXRlIGFyZSBsb2dnZWQgdG8gdGhlIGpvdXJuYWwgKCRMb2dGaWxlKSBsaWtlCisgKiBub3JtYWwgbWV0YWRhdGEgY2hhbmdlcy4KKyAqCisgKiBVc2VkIGJ5IHRoZSBFbmNyeXB0aW5nIEZpbGUgU3lzdGVtIChFRlMpLiBBbGwgZW5jcnlwdGVkIGZpbGVzIGhhdmUgdGhpcworICogYXR0cmlidXRlIHdpdGggdGhlIG5hbWUgJEVGUy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCS8qIENhbiBiZSBhbnl0aGluZyB0aGUgY3JlYXRvciBjaG9vc2VzLiAqLworCS8qIEVGUyB1c2VzIGl0IGFzIGZvbGxvd3M6ICovCisJLy8gRklYTUU6IFR5cGUgdGhpcyBpbmZvLCB2ZXJpZnlpbmcgaXQgYWxvbmcgdGhlIHdheS4gKEFJQSkKK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBMT0dHRURfVVRJTElUWV9TVFJFQU0sIEVGU19BVFRSOworCisjZW5kaWYgLyogX0xJTlVYX05URlNfTEFZT1VUX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvbGNuYWxsb2MuYyBiL2ZzL250ZnMvbGNuYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2ZkOTExCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9sY25hbGxvYy5jCkBAIC0wLDAgKzEsMTAwMiBAQAorLyoKKyAqIGxjbmFsbG9jLmMgLSBDbHVzdGVyIChkZSlhbGxvY2F0aW9uIGNvZGUuICBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZmRlZiBOVEZTX1JXCisKKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisKKyNpbmNsdWRlICJsY25hbGxvYy5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAiYml0bWFwLmgiCisjaW5jbHVkZSAiaW5vZGUuaCIKKyNpbmNsdWRlICJ2b2x1bWUuaCIKKyNpbmNsdWRlICJhdHRyaWIuaCIKKyNpbmNsdWRlICJtYWxsb2MuaCIKKyNpbmNsdWRlICJhb3BzLmgiCisjaW5jbHVkZSAibnRmcy5oIgorCisvKioKKyAqIG50ZnNfY2x1c3Rlcl9mcmVlX2Zyb21fcmxfbm9sb2NrIC0gZnJlZSBjbHVzdGVycyBmcm9tIHJ1bmxpc3QKKyAqIEB2b2w6CW1vdW50ZWQgbnRmcyB2b2x1bWUgb24gd2hpY2ggdG8gZnJlZSB0aGUgY2x1c3RlcnMKKyAqIEBybDoJCXJ1bmxpc3QgZGVzY3JpYmluZyB0aGUgY2x1c3RlcnMgdG8gZnJlZQorICoKKyAqIEZyZWUgYWxsIHRoZSBjbHVzdGVycyBkZXNjcmliZWQgYnkgdGhlIHJ1bmxpc3QgQHJsIG9uIHRoZSB2b2x1bWUgQHZvbC4gIEluCisgKiB0aGUgY2FzZSBvZiBhbiBlcnJvciBiZWluZyByZXR1cm5lZCwgYXQgbGVhc3Qgc29tZSBvZiB0aGUgY2x1c3RlcnMgd2VyZSBub3QKKyAqIGZyZWVkLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4KKyAqCisgKiBMb2NraW5nOiAtIFRoZSB2b2x1bWUgbGNuIGJpdG1hcCBtdXN0IGJlIGxvY2tlZCBmb3Igd3JpdGluZyBvbiBlbnRyeSBhbmQgaXMKKyAqCSAgICAgIGxlZnQgbG9ja2VkIG9uIHJldHVybi4KKyAqLworaW50IG50ZnNfY2x1c3Rlcl9mcmVlX2Zyb21fcmxfbm9sb2NrKG50ZnNfdm9sdW1lICp2b2wsCisJCWNvbnN0IHJ1bmxpc3RfZWxlbWVudCAqcmwpCit7CisJc3RydWN0IGlub2RlICpsY25ibXBfdmkgPSB2b2wtPmxjbmJtcF9pbm87CisJaW50IHJldCA9IDA7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwlmb3IgKDsgcmwtPmxlbmd0aDsgcmwrKykgeworCQlpbnQgZXJyOworCisJCWlmIChybC0+bGNuIDwgMCkKKwkJCWNvbnRpbnVlOworCQllcnIgPSBudGZzX2JpdG1hcF9jbGVhcl9ydW4obGNuYm1wX3ZpLCBybC0+bGNuLCBybC0+bGVuZ3RoKTsKKwkJaWYgKHVubGlrZWx5KGVyciAmJiAoIXJldCB8fCByZXQgPT0gRU5PTUVNKSAmJiByZXQgIT0gZXJyKSkKKwkJCXJldCA9IGVycjsKKwl9CisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIG50ZnNfY2x1c3Rlcl9hbGxvYyAtIGFsbG9jYXRlIGNsdXN0ZXJzIG9uIGFuIG50ZnMgdm9sdW1lCisgKiBAdm9sOgltb3VudGVkIG50ZnMgdm9sdW1lIG9uIHdoaWNoIHRvIGFsbG9jYXRlIHRoZSBjbHVzdGVycworICogQHN0YXJ0X3ZjbjoJdmNuIHRvIHVzZSBmb3IgdGhlIGZpcnN0IGFsbG9jYXRlZCBjbHVzdGVyCisgKiBAY291bnQ6CW51bWJlciBvZiBjbHVzdGVycyB0byBhbGxvY2F0ZQorICogQHN0YXJ0X2xjbjoJc3RhcnRpbmcgbGNuIGF0IHdoaWNoIHRvIGFsbG9jYXRlIHRoZSBjbHVzdGVycyAob3IgLTEgaWYgbm9uZSkKKyAqIEB6b25lOgl6b25lIGZyb20gd2hpY2ggdG8gYWxsb2NhdGUgdGhlIGNsdXN0ZXJzCisgKgorICogQWxsb2NhdGUgQGNvdW50IGNsdXN0ZXJzIHByZWZlcmFibHkgc3RhcnRpbmcgYXQgY2x1c3RlciBAc3RhcnRfbGNuIG9yIGF0IHRoZQorICogY3VycmVudCBhbGxvY2F0b3IgcG9zaXRpb24gaWYgQHN0YXJ0X2xjbiBpcyAtMSwgb24gdGhlIG1vdW50ZWQgbnRmcyB2b2x1bWUKKyAqIEB2b2wuIEB6b25lIGlzIGVpdGhlciBEQVRBX1pPTkUgZm9yIGFsbG9jYXRpb24gb2Ygbm9ybWFsIGNsdXN0ZXJzIG9yCisgKiBNRlRfWk9ORSBmb3IgYWxsb2NhdGlvbiBvZiBjbHVzdGVycyBmb3IgdGhlIG1hc3RlciBmaWxlIHRhYmxlLCBpLmUuIHRoZQorICogJE1GVC8kREFUQSBhdHRyaWJ1dGUuCisgKgorICogQHN0YXJ0X3ZjbiBzcGVjaWZpZXMgdGhlIHZjbiBvZiB0aGUgZmlyc3QgYWxsb2NhdGVkIGNsdXN0ZXIuICBUaGlzIG1ha2VzCisgKiBtZXJnaW5nIHRoZSByZXN1bHRpbmcgcnVubGlzdCB3aXRoIHRoZSBvbGQgcnVubGlzdCBlYXNpZXIuCisgKgorICogWW91IG5lZWQgdG8gY2hlY2sgdGhlIHJldHVybiB2YWx1ZSB3aXRoIElTX0VSUigpLiAgSWYgdGhpcyBpcyBmYWxzZSwgdGhlCisgKiBmdW5jdGlvbiB3YXMgc3VjY2Vzc2Z1bCBhbmQgdGhlIHJldHVybiB2YWx1ZSBpcyBhIHJ1bmxpc3QgZGVzY3JpYmluZyB0aGUKKyAqIGFsbG9jYXRlZCBjbHVzdGVyKHMpLiAgSWYgSVNfRVJSKCkgaXMgdHJ1ZSwgdGhlIGZ1bmN0aW9uIGZhaWxlZCBhbmQKKyAqIFBUUl9FUlIoKSBnaXZlcyB5b3UgdGhlIGVycm9yIGNvZGUuCisgKgorICogTm90ZXMgb24gdGhlIGFsbG9jYXRpb24gYWxnb3JpdGhtCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGVyZSBhcmUgdHdvIGRhdGEgem9uZXMuICBGaXJzdCBpcyB0aGUgYXJlYSBiZXR3ZWVuIHRoZSBlbmQgb2YgdGhlIG1mdCB6b25lCisgKiBhbmQgdGhlIGVuZCBvZiB0aGUgdm9sdW1lLCBhbmQgc2Vjb25kIGlzIHRoZSBhcmVhIGJldHdlZW4gdGhlIHN0YXJ0IG9mIHRoZQorICogdm9sdW1lIGFuZCB0aGUgc3RhcnQgb2YgdGhlIG1mdCB6b25lLiAgT24gdW5tb2RpZmllZC9zdGFuZGFyZCBOVEZTIDEueAorICogdm9sdW1lcywgdGhlIHNlY29uZCBkYXRhIHpvbmUgZG9lcyBub3QgZXhpc3QgZHVlIHRvIHRoZSBtZnQgem9uZSBiZWluZworICogZXhwYW5kZWQgdG8gY292ZXIgdGhlIHN0YXJ0IG9mIHRoZSB2b2x1bWUgaW4gb3JkZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgdGhlCisgKiBtZnQgYml0bWFwIGF0dHJpYnV0ZS4KKyAqCisgKiBUaGlzIGlzIG5vdCB0aGUgcHJldHRpZXN0IGZ1bmN0aW9uIGJ1dCB0aGUgY29tcGxleGl0eSBzdGVtcyBmcm9tIHRoZSBuZWVkIG9mCisgKiBpbXBsZW1lbnRpbmcgdGhlIG1mdCB2cyBkYXRhIHpvbmVkIGFwcHJvYWNoIGFuZCBmcm9tIHRoZSBmYWN0IHRoYXQgd2UgaGF2ZQorICogYWNjZXNzIHRvIHRoZSBsY24gYml0bWFwIGluIHBvcnRpb25zIG9mIHVwIHRvIDgxOTIgYnl0ZXMgYXQgYSB0aW1lLCBzbyB3ZQorICogbmVlZCB0byBjb3BlIHdpdGggY3Jvc3Npbmcgb3ZlciBib3VuZGFyaWVzIG9mIHR3byBidWZmZXJzLiAgRnVydGhlciwgdGhlCisgKiBmYWN0IHRoYXQgdGhlIGFsbG9jYXRvciBhbGxvd3MgZm9yIGNhbGxlciBzdXBwbGllZCBoaW50cyBhcyB0byB0aGUgbG9jYXRpb24KKyAqIG9mIHdoZXJlIGFsbG9jYXRpb24gc2hvdWxkIGJlZ2luIGFuZCB0aGUgZmFjdCB0aGF0IHRoZSBhbGxvY2F0b3Iga2VlcHMgdHJhY2sKKyAqIG9mIHdoZXJlIGluIHRoZSBkYXRhIHpvbmVzIHRoZSBuZXh0IG5hdHVyYWwgYWxsb2NhdGlvbiBzaG91bGQgb2NjdXIsCisgKiBjb250cmlidXRlIHRvIHRoZSBjb21wbGV4aXR5IG9mIHRoZSBmdW5jdGlvbi4gIEJ1dCBpdCBzaG91bGQgYWxsIGJlCisgKiB3b3J0aHdoaWxlLCBiZWNhdXNlIHRoaXMgYWxsb2NhdG9yIHNob3VsZDogMSkgYmUgYSBmdWxsIGltcGxlbWVudGF0aW9uIG9mCisgKiB0aGUgTUZUIHpvbmUgYXBwcm9hY2ggdXNlZCBieSBXaW5kb3dzIE5ULCAyKSBjYXVzZSByZWR1Y3Rpb24gaW4KKyAqIGZyYWdtZW50YXRpb24sIGFuZCAzKSBiZSBzcGVlZHkgaW4gYWxsb2NhdGlvbnMgKHRoZSBjb2RlIGlzIG5vdCBvcHRpbWl6ZWQKKyAqIGZvciBzcGVlZCwgYnV0IHRoZSBhbGdvcml0aG0gaXMsIHNvIGZ1cnRoZXIgc3BlZWQgaW1wcm92ZW1lbnRzIGFyZSBwcm9iYWJseQorICogcG9zc2libGUpLgorICoKKyAqIEZJWE1FOiBXZSBzaG91bGQgYmUgbW9uaXRvcmluZyBjbHVzdGVyIGFsbG9jYXRpb24gYW5kIGluY3JlbWVudCB0aGUgTUZUIHpvbmUKKyAqIHNpemUgZHluYW1pY2FsbHkgYnV0IHRoaXMgaXMgc29tZXRoaW5nIGZvciB0aGUgZnV0dXJlLiAgV2Ugd2lsbCBqdXN0IGNhdXNlCisgKiBoZWF2aWVyIGZyYWdtZW50YXRpb24gYnkgbm90IGRvaW5nIGl0IGFuZCBJIGFtIG5vdCBldmVuIHN1cmUgV2luZG93cyB3b3VsZAorICogZ3JvdyB0aGUgTUZUIHpvbmUgZHluYW1pY2FsbHksIHNvIGl0IG1pZ2h0IGV2ZW4gYmUgY29ycmVjdCBub3QgdG8gZG8gdGhpcy4KKyAqIFRoZSBvdmVyaGVhZCBpbiBkb2luZyBkeW5hbWljIE1GVCB6b25lIGV4cGFuc2lvbiB3b3VsZCBiZSB2ZXJ5IGxhcmdlIGFuZAorICogdW5saWtlbHkgd29ydGggdGhlIGVmZm9ydC4gKEFJQSkKKyAqCisgKiBUT0RPOiBJIGhhdmUgYWRkZWQgaW4gZG91YmxlIHRoZSByZXF1aXJlZCB6b25lIHBvc2l0aW9uIHBvaW50ZXIgd3JhcCBhcm91bmQKKyAqIGxvZ2ljIHdoaWNoIGNhbiBiZSBvcHRpbWl6ZWQgdG8gaGF2aW5nIG9ubHkgb25lIG9mIHRoZSB0d28gbG9naWMgc2V0cy4KKyAqIEhvd2V2ZXIsIGhhdmluZyB0aGUgZG91YmxlIGxvZ2ljIHdpbGwgd29yayBmaW5lLCBidXQgaWYgd2UgaGF2ZSBvbmx5IG9uZSBvZgorICogdGhlIHNldHMgYW5kIHdlIGdldCBpdCB3cm9uZyBzb21ld2hlcmUsIHRoZW4gd2UgZ2V0IGludG8gdHJvdWJsZSwgc28KKyAqIHJlbW92aW5nIHRoZSBkdXBsaWNhdGUgbG9naWMgcmVxdWlyZXMgX3ZlcnlfIGNhcmVmdWwgY29uc2lkZXJhdGlvbiBvZiBfYWxsXworICogcG9zc2libGUgY29kZSBwYXRocy4gIFNvIGF0IGxlYXN0IGZvciBub3csIEkgYW0gbGVhdmluZyB0aGUgZG91YmxlIGxvZ2ljIC0KKyAqIGJldHRlciBzYWZlIHRoYW4gc29ycnkuLi4gKEFJQSkKKyAqCisgKiBMb2NraW5nOiAtIFRoZSB2b2x1bWUgbGNuIGJpdG1hcCBtdXN0IGJlIHVubG9ja2VkIG9uIGVudHJ5IGFuZCBpcyB1bmxvY2tlZAorICoJICAgICAgb24gcmV0dXJuLgorICoJICAgIC0gVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgdm9sdW1lIGxjbiBiaXRtYXAgbG9jayBmb3Igd3JpdGluZyBhbmQKKyAqCSAgICAgIG1vZGlmaWVzIHRoZSBiaXRtYXAgY29udGVudHMuCisgKi8KK3J1bmxpc3RfZWxlbWVudCAqbnRmc19jbHVzdGVyX2FsbG9jKG50ZnNfdm9sdW1lICp2b2wsIGNvbnN0IFZDTiBzdGFydF92Y24sCisJCWNvbnN0IHM2NCBjb3VudCwgY29uc3QgTENOIHN0YXJ0X2xjbiwKKwkJY29uc3QgTlRGU19DTFVTVEVSX0FMTE9DQVRJT05fWk9ORVMgem9uZSkKK3sKKwlMQ04gem9uZV9zdGFydCwgem9uZV9lbmQsIGJtcF9wb3MsIGJtcF9pbml0aWFsX3BvcywgbGFzdF9yZWFkX3BvcywgbGNuOworCUxDTiBwcmV2X2xjbiA9IDAsIHByZXZfcnVuX2xlbiA9IDAsIG1mdF96b25lX3NpemU7CisJczY0IGNsdXN0ZXJzOworCXN0cnVjdCBpbm9kZSAqbGNuYm1wX3ZpOworCXJ1bmxpc3RfZWxlbWVudCAqcmwgPSBOVUxMOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOworCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKKwl1OCAqYnVmLCAqYnl0ZTsKKwlpbnQgZXJyID0gMCwgcmxwb3MsIHJsc2l6ZSwgYnVmX3NpemU7CisJdTggcGFzcywgZG9uZV96b25lcywgc2VhcmNoX3pvbmUsIG5lZWRfd3JpdGViYWNrID0gMCwgYml0OworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIHN0YXJ0X3ZjbiAweCVsbHgsIGNvdW50IDB4JWxseCwgc3RhcnRfbGNuICIKKwkJCSIweCVsbHgsIHpvbmUgJXNfWk9ORS4iLCAodW5zaWduZWQgbG9uZyBsb25nKXN0YXJ0X3ZjbiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpY291bnQsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXN0YXJ0X2xjbiwKKwkJCXpvbmUgPT0gTUZUX1pPTkUgPyAiTUZUIiA6ICJEQVRBIik7CisJQlVHX09OKCF2b2wpOworCWxjbmJtcF92aSA9IHZvbC0+bGNuYm1wX2lubzsKKwlCVUdfT04oIWxjbmJtcF92aSk7CisJQlVHX09OKHN0YXJ0X3ZjbiA8IDApOworCUJVR19PTihjb3VudCA8IDApOworCUJVR19PTihzdGFydF9sY24gPCAtMSk7CisJQlVHX09OKHpvbmUgPCBGSVJTVF9aT05FKTsKKwlCVUdfT04oem9uZSA+IExBU1RfWk9ORSk7CisKKwkvKiBSZXR1cm4gZW1wdHkgcnVubGlzdCBpZiBAY291bnQgPT0gMCAqLworCS8vIEZJWE1FOiBEbyB3ZSB3YW50IHRvIGp1c3QgcmV0dXJuIE5VTEwgaW5zdGVhZD8gKEFJQSkKKwlpZiAoIWNvdW50KSB7CisJCXJsID0gbnRmc19tYWxsb2Nfbm9mcyhQQUdFX1NJWkUpOworCQlpZiAoIXJsKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJCXJsWzBdLnZjbiA9IHN0YXJ0X3ZjbjsKKwkJcmxbMF0ubGNuID0gTENOX1JMX05PVF9NQVBQRUQ7CisJCXJsWzBdLmxlbmd0aCA9IDA7CisJCXJldHVybiBybDsKKwl9CisJLyogVGFrZSB0aGUgbGNuYm1wIGxvY2sgZm9yIHdyaXRpbmcuICovCisJZG93bl93cml0ZSgmdm9sLT5sY25ibXBfbG9jayk7CisJLyoKKwkgKiBJZiBubyBzcGVjaWZpYyBAc3RhcnRfbGNuIHdhcyByZXF1ZXN0ZWQsIHVzZSB0aGUgY3VycmVudCBkYXRhIHpvbmUKKwkgKiBwb3NpdGlvbiwgb3RoZXJ3aXNlIHVzZSB0aGUgcmVxdWVzdGVkIEBzdGFydF9sY24gYnV0IG1ha2Ugc3VyZSBpdAorCSAqIGxpZXMgb3V0c2lkZSB0aGUgbWZ0IHpvbmUuICBBbHNvIHNldCBkb25lX3pvbmVzIHRvIDAgKG5vIHpvbmVzIGRvbmUpCisJICogYW5kIHBhc3MgZGVwZW5kaW5nIG9uIHdoZXRoZXIgd2UgYXJlIHN0YXJ0aW5nIGluc2lkZSBhIHpvbmUgKDEpIG9yCisJICogYXQgdGhlIGJlZ2lubmluZyBvZiBhIHpvbmUgKDIpLiAgSWYgcmVxdWVzdGluZyBmcm9tIHRoZSBNRlRfWk9ORSwKKwkgKiB3ZSBlaXRoZXIgc3RhcnQgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gd2l0aGluIHRoZSBtZnQgem9uZSBvciBhdAorCSAqIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uICBJZiB0aGUgbGF0dGVyIGlzIG91dCBvZiBib3VuZHMgdGhlbiB3ZSBzdGFydAorCSAqIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIE1GVF9aT05FLgorCSAqLworCWRvbmVfem9uZXMgPSAwOworCXBhc3MgPSAxOworCS8qCisJICogem9uZV9zdGFydCBhbmQgem9uZV9lbmQgYXJlIHRoZSBjdXJyZW50IHNlYXJjaCByYW5nZS4gIHNlYXJjaF96b25lCisJICogaXMgMSBmb3IgbWZ0IHpvbmUsIDIgZm9yIGRhdGEgem9uZSAxIChlbmQgb2YgbWZ0IHpvbmUgdGlsbCBlbmQgb2YKKwkgKiB2b2x1bWUpIGFuZCA0IGZvciBkYXRhIHpvbmUgMiAoc3RhcnQgb2Ygdm9sdW1lIHRpbGwgc3RhcnQgb2YgbWZ0CisJICogem9uZSkuCisJICovCisJem9uZV9zdGFydCA9IHN0YXJ0X2xjbjsKKwlpZiAoem9uZV9zdGFydCA8IDApIHsKKwkJaWYgKHpvbmUgPT0gREFUQV9aT05FKQorCQkJem9uZV9zdGFydCA9IHZvbC0+ZGF0YTFfem9uZV9wb3M7CisJCWVsc2UKKwkJCXpvbmVfc3RhcnQgPSB2b2wtPm1mdF96b25lX3BvczsKKwkJaWYgKCF6b25lX3N0YXJ0KSB7CisJCQkvKgorCQkJICogWm9uZSBzdGFydHMgYXQgYmVnaW5uaW5nIG9mIHZvbHVtZSB3aGljaCBtZWFucyBhCisJCQkgKiBzaW5nbGUgcGFzcyBpcyBzdWZmaWNpZW50LgorCQkJICovCisJCQlwYXNzID0gMjsKKwkJfQorCX0gZWxzZSBpZiAoem9uZSA9PSBEQVRBX1pPTkUgJiYgem9uZV9zdGFydCA+PSB2b2wtPm1mdF96b25lX3N0YXJ0ICYmCisJCQl6b25lX3N0YXJ0IDwgdm9sLT5tZnRfem9uZV9lbmQpIHsKKwkJem9uZV9zdGFydCA9IHZvbC0+bWZ0X3pvbmVfZW5kOworCQkvKgorCQkgKiBTdGFydGluZyBhdCBiZWdpbm5pbmcgb2YgZGF0YTFfem9uZSB3aGljaCBtZWFucyBhIHNpbmdsZQorCQkgKiBwYXNzIGluIHRoaXMgem9uZSBpcyBzdWZmaWNpZW50LgorCQkgKi8KKwkJcGFzcyA9IDI7CisJfSBlbHNlIGlmICh6b25lID09IE1GVF9aT05FICYmICh6b25lX3N0YXJ0IDwgdm9sLT5tZnRfem9uZV9zdGFydCB8fAorCQkJem9uZV9zdGFydCA+PSB2b2wtPm1mdF96b25lX2VuZCkpIHsKKwkJem9uZV9zdGFydCA9IHZvbC0+bWZ0X2xjbjsKKwkJaWYgKCF2b2wtPm1mdF96b25lX2VuZCkKKwkJCXpvbmVfc3RhcnQgPSAwOworCQkvKgorCQkgKiBTdGFydGluZyBhdCBiZWdpbm5pbmcgb2Ygdm9sdW1lIHdoaWNoIG1lYW5zIGEgc2luZ2xlIHBhc3MKKwkJICogaXMgc3VmZmljaWVudC4KKwkJICovCisJCXBhc3MgPSAyOworCX0KKwlpZiAoem9uZSA9PSBNRlRfWk9ORSkgeworCQl6b25lX2VuZCA9IHZvbC0+bWZ0X3pvbmVfZW5kOworCQlzZWFyY2hfem9uZSA9IDE7CisJfSBlbHNlIC8qIGlmICh6b25lID09IERBVEFfWk9ORSkgKi8geworCQkvKiBTa2lwIHNlYXJjaGluZyB0aGUgbWZ0IHpvbmUuICovCisJCWRvbmVfem9uZXMgfD0gMTsKKwkJaWYgKHpvbmVfc3RhcnQgPj0gdm9sLT5tZnRfem9uZV9lbmQpIHsKKwkJCXpvbmVfZW5kID0gdm9sLT5ucl9jbHVzdGVyczsKKwkJCXNlYXJjaF96b25lID0gMjsKKwkJfSBlbHNlIHsKKwkJCXpvbmVfZW5kID0gdm9sLT5tZnRfem9uZV9zdGFydDsKKwkJCXNlYXJjaF96b25lID0gNDsKKwkJfQorCX0KKwkvKgorCSAqIGJtcF9wb3MgaXMgdGhlIGN1cnJlbnQgYml0IHBvc2l0aW9uIGluc2lkZSB0aGUgYml0bWFwLiAgV2UgdXNlCisJICogYm1wX2luaXRpYWxfcG9zIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0byBkbyBhIHpvbmUgc3dpdGNoLgorCSAqLworCWJtcF9wb3MgPSBibXBfaW5pdGlhbF9wb3MgPSB6b25lX3N0YXJ0OworCisJLyogTG9vcCB1bnRpbCBhbGwgY2x1c3RlcnMgYXJlIGFsbG9jYXRlZCwgaS5lLiBjbHVzdGVycyA9PSAwLiAqLworCWNsdXN0ZXJzID0gY291bnQ7CisJcmxwb3MgPSBybHNpemUgPSAwOworCW1hcHBpbmcgPSBsY25ibXBfdmktPmlfbWFwcGluZzsKKwl3aGlsZSAoMSkgeworCQludGZzX2RlYnVnKCJTdGFydCBvZiBvdXRlciB3aGlsZSBsb29wOiBkb25lX3pvbmVzIDB4JXgsICIKKwkJCQkic2VhcmNoX3pvbmUgJWksIHBhc3MgJWksIHpvbmVfc3RhcnQgMHglbGx4LCAiCisJCQkJInpvbmVfZW5kIDB4JWxseCwgYm1wX2luaXRpYWxfcG9zIDB4JWxseCwgIgorCQkJCSJibXBfcG9zIDB4JWxseCwgcmxwb3MgJWksIHJsc2l6ZSAlaS4iLAorCQkJCWRvbmVfem9uZXMsIHNlYXJjaF96b25lLCBwYXNzLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpem9uZV9zdGFydCwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXpvbmVfZW5kLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYm1wX2luaXRpYWxfcG9zLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYm1wX3Bvcywgcmxwb3MsIHJsc2l6ZSk7CisJCS8qIExvb3AgdW50aWwgd2UgcnVuIG91dCBvZiBmcmVlIGNsdXN0ZXJzLiAqLworCQlsYXN0X3JlYWRfcG9zID0gYm1wX3BvcyA+PiAzOworCQludGZzX2RlYnVnKCJsYXN0X3JlYWRfcG9zIDB4JWxseC4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbGFzdF9yZWFkX3Bvcyk7CisJCWlmIChsYXN0X3JlYWRfcG9zID4gbGNuYm1wX3ZpLT5pX3NpemUpIHsKKwkJCW50ZnNfZGVidWcoIkVuZCBvZiBhdHRyaWJ1dGUgcmVhY2hlZC4gICIKKwkJCQkJIlNraXBwaW5nIHRvIHpvbmVfcGFzc19kb25lLiIpOworCQkJZ290byB6b25lX3Bhc3NfZG9uZTsKKwkJfQorCQlpZiAobGlrZWx5KHBhZ2UpKSB7CisJCQlpZiAobmVlZF93cml0ZWJhY2spIHsKKwkJCQludGZzX2RlYnVnKCJNYXJraW5nIHBhZ2UgZGlydHkuIik7CisJCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCQkJc2V0X3BhZ2VfZGlydHkocGFnZSk7CisJCQkJbmVlZF93cml0ZWJhY2sgPSAwOworCQkJfQorCQkJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCQl9CisJCXBhZ2UgPSBudGZzX21hcF9wYWdlKG1hcHBpbmcsIGxhc3RfcmVhZF9wb3MgPj4KKwkJCQlQQUdFX0NBQ0hFX1NISUZUKTsKKwkJaWYgKElTX0VSUihwYWdlKSkgeworCQkJZXJyID0gUFRSX0VSUihwYWdlKTsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBtYXAgcGFnZS4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWJ1Zl9zaXplID0gbGFzdF9yZWFkX3BvcyAmIH5QQUdFX0NBQ0hFX01BU0s7CisJCWJ1ZiA9IHBhZ2VfYWRkcmVzcyhwYWdlKSArIGJ1Zl9zaXplOworCQlidWZfc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRSAtIGJ1Zl9zaXplOworCQlpZiAodW5saWtlbHkobGFzdF9yZWFkX3BvcyArIGJ1Zl9zaXplID4gbGNuYm1wX3ZpLT5pX3NpemUpKQorCQkJYnVmX3NpemUgPSBsY25ibXBfdmktPmlfc2l6ZSAtIGxhc3RfcmVhZF9wb3M7CisJCWJ1Zl9zaXplIDw8PSAzOworCQlsY24gPSBibXBfcG9zICYgNzsKKwkJYm1wX3BvcyAmPSB+NzsKKwkJbnRmc19kZWJ1ZygiQmVmb3JlIGlubmVyIHdoaWxlIGxvb3A6IGJ1Zl9zaXplICVpLCBsY24gMHglbGx4LCAiCisJCQkJImJtcF9wb3MgMHglbGx4LCBuZWVkX3dyaXRlYmFjayAlaS4iLCBidWZfc2l6ZSwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKWxjbiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKWJtcF9wb3MsIG5lZWRfd3JpdGViYWNrKTsKKwkJd2hpbGUgKGxjbiA8IGJ1Zl9zaXplICYmIGxjbiArIGJtcF9wb3MgPCB6b25lX2VuZCkgeworCQkJYnl0ZSA9IGJ1ZiArIChsY24gPj4gMyk7CisJCQludGZzX2RlYnVnKCJJbiBpbm5lciB3aGlsZSBsb29wOiBidWZfc2l6ZSAlaSwgIgorCQkJCQkibGNuIDB4JWxseCwgYm1wX3BvcyAweCVsbHgsICIKKwkJCQkJIm5lZWRfd3JpdGViYWNrICVpLCBieXRlIG9mcyAweCV4LCAiCisJCQkJCSIqYnl0ZSAweCV4LiIsIGJ1Zl9zaXplLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWxjbiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylibXBfcG9zLAorCQkJCQluZWVkX3dyaXRlYmFjaywKKwkJCQkJKHVuc2lnbmVkIGludCkobGNuID4+IDMpLAorCQkJCQkodW5zaWduZWQgaW50KSpieXRlKTsKKwkJCS8qIFNraXAgZnVsbCBieXRlcy4gKi8KKwkJCWlmICgqYnl0ZSA9PSAweGZmKSB7CisJCQkJbGNuID0gKGxjbiArIDgpICYgfjc7CisJCQkJbnRmc19kZWJ1ZygiQ29udGludWluZyB3aGlsZSBsb29wIDEuIik7CisJCQkJY29udGludWU7CisJCQl9CisJCQliaXQgPSAxIDw8IChsY24gJiA3KTsKKwkJCW50ZnNfZGVidWcoImJpdCAlaS4iLCBiaXQpOworCQkJLyogSWYgdGhlIGJpdCBpcyBhbHJlYWR5IHNldCwgZ28gb250byB0aGUgbmV4dCBvbmUuICovCisJCQlpZiAoKmJ5dGUgJiBiaXQpIHsKKwkJCQlsY24rKzsKKwkJCQludGZzX2RlYnVnKCJDb250aW51aW5nIHdoaWxlIGxvb3AgMi4iKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qCisJCQkgKiBBbGxvY2F0ZSBtb3JlIG1lbW9yeSBpZiBuZWVkZWQsIGluY2x1ZGluZyBzcGFjZSBmb3IKKwkJCSAqIHRoZSB0ZXJtaW5hdG9yIGVsZW1lbnQuCisJCQkgKiBudGZzX21hbGxvY19ub2ZzKCkgb3BlcmF0ZXMgb24gd2hvbGUgcGFnZXMgb25seS4KKwkJCSAqLworCQkJaWYgKChybHBvcyArIDIpICogc2l6ZW9mKCpybCkgPiBybHNpemUpIHsKKwkJCQlydW5saXN0X2VsZW1lbnQgKnJsMjsKKworCQkJCW50ZnNfZGVidWcoIlJlYWxsb2NhdGluZyBtZW1vcnkuIik7CisJCQkJaWYgKCFybCkKKwkJCQkJbnRmc19kZWJ1ZygiRmlyc3QgZnJlZSBiaXQgaXMgYXQgTENOICIKKwkJCQkJCQkiMHglbGx4LiIsCisJCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJCQkobGNuICsgYm1wX3BvcykpOworCQkJCXJsMiA9IG50ZnNfbWFsbG9jX25vZnMocmxzaXplICsgKGludClQQUdFX1NJWkUpOworCQkJCWlmICh1bmxpa2VseSghcmwyKSkgeworCQkJCQllcnIgPSAtRU5PTUVNOworCQkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gIgorCQkJCQkJCSJhbGxvY2F0ZSBtZW1vcnkuIik7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQltZW1jcHkocmwyLCBybCwgcmxzaXplKTsKKwkJCQludGZzX2ZyZWUocmwpOworCQkJCXJsID0gcmwyOworCQkJCXJsc2l6ZSArPSBQQUdFX1NJWkU7CisJCQkJbnRmc19kZWJ1ZygiUmVhbGxvY2F0ZWQgbWVtb3J5LCBybHNpemUgMHgleC4iLAorCQkJCQkJcmxzaXplKTsKKwkJCX0KKwkJCS8qIEFsbG9jYXRlIHRoZSBiaXRtYXAgYml0LiAqLworCQkJKmJ5dGUgfD0gYml0OworCQkJLyogV2UgbmVlZCB0byB3cml0ZSB0aGlzIGJpdG1hcCBwYWdlIHRvIGRpc2suICovCisJCQluZWVkX3dyaXRlYmFjayA9IDE7CisJCQludGZzX2RlYnVnKCIqYnl0ZSAweCV4LCBuZWVkX3dyaXRlYmFjayBpcyBzZXQuIiwKKwkJCQkJKHVuc2lnbmVkIGludCkqYnl0ZSk7CisJCQkvKgorCQkJICogQ29hbGVzY2Ugd2l0aCBwcmV2aW91cyBydW4gaWYgYWRqYWNlbnQgTENOcy4KKwkJCSAqIE90aGVyd2lzZSwgYXBwZW5kIGEgbmV3IHJ1bi4KKwkJCSAqLworCQkJbnRmc19kZWJ1ZygiQWRkaW5nIHJ1biAobGNuIDB4JWxseCwgbGVuIDB4JWxseCksICIKKwkJCQkJInByZXZfbGNuIDB4JWxseCwgbGNuIDB4JWxseCwgIgorCQkJCQkiYm1wX3BvcyAweCVsbHgsIHByZXZfcnVuX2xlbiAweCVsbHgsICIKKwkJCQkJInJscG9zICVpLiIsCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpKGxjbiArIGJtcF9wb3MpLAorCQkJCQkxVUxMLCAodW5zaWduZWQgbG9uZyBsb25nKXByZXZfbGNuLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWxjbiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylibXBfcG9zLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXByZXZfcnVuX2xlbiwKKwkJCQkJcmxwb3MpOworCQkJaWYgKHByZXZfbGNuID09IGxjbiArIGJtcF9wb3MgLSBwcmV2X3J1bl9sZW4gJiYgcmxwb3MpIHsKKwkJCQludGZzX2RlYnVnKCJDb2FsZXNjaW5nIHRvIHJ1biAobGNuIDB4JWxseCwgIgorCQkJCQkJImxlbiAweCVsbHgpLiIsCisJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkJcmxbcmxwb3MgLSAxXS5sY24sCisJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkJcmxbcmxwb3MgLSAxXS5sZW5ndGgpOworCQkJCXJsW3JscG9zIC0gMV0ubGVuZ3RoID0gKytwcmV2X3J1bl9sZW47CisJCQkJbnRmc19kZWJ1ZygiUnVuIG5vdyAobGNuIDB4JWxseCwgbGVuIDB4JWxseCksICIKKwkJCQkJCSJwcmV2X3J1bl9sZW4gMHglbGx4LiIsCisJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkJcmxbcmxwb3MgLSAxXS5sY24sCisJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkJcmxbcmxwb3MgLSAxXS5sZW5ndGgsCisJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkJcHJldl9ydW5fbGVuKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGxpa2VseShybHBvcykpIHsKKwkJCQkJbnRmc19kZWJ1ZygiQWRkaW5nIG5ldyBydW4sIChwcmV2aW91cyAiCisJCQkJCQkJInJ1biBsY24gMHglbGx4LCAiCisJCQkJCQkJImxlbiAweCVsbHgpLiIsCisJCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJCQlybFtybHBvcyAtIDFdLmxjbiwKKwkJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkJCXJsW3JscG9zIC0gMV0ubGVuZ3RoKTsKKwkJCQkJcmxbcmxwb3NdLnZjbiA9IHJsW3JscG9zIC0gMV0udmNuICsKKwkJCQkJCQlwcmV2X3J1bl9sZW47CisJCQkJfSBlbHNlIHsKKwkJCQkJbnRmc19kZWJ1ZygiQWRkaW5nIG5ldyBydW4sIGlzIGZpcnN0ICIKKwkJCQkJCQkicnVuLiIpOworCQkJCQlybFtybHBvc10udmNuID0gc3RhcnRfdmNuOworCQkJCX0KKwkJCQlybFtybHBvc10ubGNuID0gcHJldl9sY24gPSBsY24gKyBibXBfcG9zOworCQkJCXJsW3JscG9zXS5sZW5ndGggPSBwcmV2X3J1bl9sZW4gPSAxOworCQkJCXJscG9zKys7CisJCQl9CisJCQkvKiBEb25lPyAqLworCQkJaWYgKCEtLWNsdXN0ZXJzKSB7CisJCQkJTENOIHRjOworCQkJCS8qCisJCQkJICogVXBkYXRlIHRoZSBjdXJyZW50IHpvbmUgcG9zaXRpb24uICBQb3NpdGlvbnMKKwkJCQkgKiBvZiBhbHJlYWR5IHNjYW5uZWQgem9uZXMgaGF2ZSBiZWVuIHVwZGF0ZWQKKwkJCQkgKiBkdXJpbmcgdGhlIHJlc3BlY3RpdmUgem9uZSBzd2l0Y2hlcy4KKwkJCQkgKi8KKwkJCQl0YyA9IGxjbiArIGJtcF9wb3MgKyAxOworCQkJCW50ZnNfZGVidWcoIkRvbmUuIFVwZGF0aW5nIGN1cnJlbnQgem9uZSAiCisJCQkJCQkicG9zaXRpb24sIHRjIDB4JWxseCwgIgorCQkJCQkJInNlYXJjaF96b25lICVpLiIsCisJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXRjLAorCQkJCQkJc2VhcmNoX3pvbmUpOworCQkJCXN3aXRjaCAoc2VhcmNoX3pvbmUpIHsKKwkJCQljYXNlIDE6CisJCQkJCW50ZnNfZGVidWcoIkJlZm9yZSBjaGVja3MsICIKKwkJCQkJCQkidm9sLT5tZnRfem9uZV9wb3MgIgorCQkJCQkJCSIweCVsbHguIiwKKwkJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkJCXZvbC0+bWZ0X3pvbmVfcG9zKTsKKwkJCQkJaWYgKHRjID49IHZvbC0+bWZ0X3pvbmVfZW5kKSB7CisJCQkJCQl2b2wtPm1mdF96b25lX3BvcyA9CisJCQkJCQkJCXZvbC0+bWZ0X2xjbjsKKwkJCQkJCWlmICghdm9sLT5tZnRfem9uZV9lbmQpCisJCQkJCQkJdm9sLT5tZnRfem9uZV9wb3MgPSAwOworCQkJCQl9IGVsc2UgaWYgKChibXBfaW5pdGlhbF9wb3MgPj0KKwkJCQkJCQl2b2wtPm1mdF96b25lX3BvcyB8fAorCQkJCQkJCXRjID4gdm9sLT5tZnRfem9uZV9wb3MpCisJCQkJCQkJJiYgdGMgPj0gdm9sLT5tZnRfbGNuKQorCQkJCQkJdm9sLT5tZnRfem9uZV9wb3MgPSB0YzsKKwkJCQkJbnRmc19kZWJ1ZygiQWZ0ZXIgY2hlY2tzLCAiCisJCQkJCQkJInZvbC0+bWZ0X3pvbmVfcG9zICIKKwkJCQkJCQkiMHglbGx4LiIsCisJCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJCQl2b2wtPm1mdF96b25lX3Bvcyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMjoKKwkJCQkJbnRmc19kZWJ1ZygiQmVmb3JlIGNoZWNrcywgIgorCQkJCQkJCSJ2b2wtPmRhdGExX3pvbmVfcG9zICIKKwkJCQkJCQkiMHglbGx4LiIsCisJCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJCQl2b2wtPmRhdGExX3pvbmVfcG9zKTsKKwkJCQkJaWYgKHRjID49IHZvbC0+bnJfY2x1c3RlcnMpCisJCQkJCQl2b2wtPmRhdGExX3pvbmVfcG9zID0KKwkJCQkJCQkgICAgIHZvbC0+bWZ0X3pvbmVfZW5kOworCQkJCQllbHNlIGlmICgoYm1wX2luaXRpYWxfcG9zID49CisJCQkJCQkgICAgdm9sLT5kYXRhMV96b25lX3BvcyB8fAorCQkJCQkJICAgIHRjID4gdm9sLT5kYXRhMV96b25lX3BvcykKKwkJCQkJCSAgICAmJiB0YyA+PSB2b2wtPm1mdF96b25lX2VuZCkKKwkJCQkJCXZvbC0+ZGF0YTFfem9uZV9wb3MgPSB0YzsKKwkJCQkJbnRmc19kZWJ1ZygiQWZ0ZXIgY2hlY2tzLCAiCisJCQkJCQkJInZvbC0+ZGF0YTFfem9uZV9wb3MgIgorCQkJCQkJCSIweCVsbHguIiwKKwkJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkJCXZvbC0+ZGF0YTFfem9uZV9wb3MpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDQ6CisJCQkJCW50ZnNfZGVidWcoIkJlZm9yZSBjaGVja3MsICIKKwkJCQkJCQkidm9sLT5kYXRhMl96b25lX3BvcyAiCisJCQkJCQkJIjB4JWxseC4iLAorCQkJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpCisJCQkJCQkJdm9sLT5kYXRhMl96b25lX3Bvcyk7CisJCQkJCWlmICh0YyA+PSB2b2wtPm1mdF96b25lX3N0YXJ0KQorCQkJCQkJdm9sLT5kYXRhMl96b25lX3BvcyA9IDA7CisJCQkJCWVsc2UgaWYgKGJtcF9pbml0aWFsX3BvcyA+PQorCQkJCQkJICAgICAgdm9sLT5kYXRhMl96b25lX3BvcyB8fAorCQkJCQkJICAgICAgdGMgPiB2b2wtPmRhdGEyX3pvbmVfcG9zKQorCQkJCQkJdm9sLT5kYXRhMl96b25lX3BvcyA9IHRjOworCQkJCQludGZzX2RlYnVnKCJBZnRlciBjaGVja3MsICIKKwkJCQkJCQkidm9sLT5kYXRhMl96b25lX3BvcyAiCisJCQkJCQkJIjB4JWxseC4iLAorCQkJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpCisJCQkJCQkJdm9sLT5kYXRhMl96b25lX3Bvcyk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUJVRygpOworCQkJCX0KKwkJCQludGZzX2RlYnVnKCJGaW5pc2hlZC4gIEdvaW5nIHRvIG91dC4iKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWxjbisrOworCQl9CisJCWJtcF9wb3MgKz0gYnVmX3NpemU7CisJCW50ZnNfZGVidWcoIkFmdGVyIGlubmVyIHdoaWxlIGxvb3A6IGJ1Zl9zaXplIDB4JXgsIGxjbiAiCisJCQkJIjB4JWxseCwgYm1wX3BvcyAweCVsbHgsIG5lZWRfd3JpdGViYWNrICVpLiIsCisJCQkJYnVmX3NpemUsICh1bnNpZ25lZCBsb25nIGxvbmcpbGNuLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYm1wX3BvcywgbmVlZF93cml0ZWJhY2spOworCQlpZiAoYm1wX3BvcyA8IHpvbmVfZW5kKSB7CisJCQludGZzX2RlYnVnKCJDb250aW51aW5nIG91dGVyIHdoaWxlIGxvb3AsICIKKwkJCQkJImJtcF9wb3MgMHglbGx4LCB6b25lX2VuZCAweCVsbHguIiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylibXBfcG9zLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXpvbmVfZW5kKTsKKwkJCWNvbnRpbnVlOworCQl9Cit6b25lX3Bhc3NfZG9uZToJLyogRmluaXNoZWQgd2l0aCB0aGUgY3VycmVudCB6b25lIHBhc3MuICovCisJCW50ZnNfZGVidWcoIkF0IHpvbmVfcGFzc19kb25lLCBwYXNzICVpLiIsIHBhc3MpOworCQlpZiAocGFzcyA9PSAxKSB7CisJCQkvKgorCQkJICogTm93IGRvIHBhc3MgMiwgc2Nhbm5pbmcgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHpvbmUKKwkJCSAqIHdlIG9taXR0ZWQgaW4gcGFzcyAxLgorCQkJICovCisJCQlwYXNzID0gMjsKKwkJCXpvbmVfZW5kID0gem9uZV9zdGFydDsKKwkJCXN3aXRjaCAoc2VhcmNoX3pvbmUpIHsKKwkJCWNhc2UgMTogLyogbWZ0X3pvbmUgKi8KKwkJCQl6b25lX3N0YXJ0ID0gdm9sLT5tZnRfem9uZV9zdGFydDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjogLyogZGF0YTFfem9uZSAqLworCQkJCXpvbmVfc3RhcnQgPSB2b2wtPm1mdF96b25lX2VuZDsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDogLyogZGF0YTJfem9uZSAqLworCQkJCXpvbmVfc3RhcnQgPSAwOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlCVUcoKTsKKwkJCX0KKwkJCS8qIFNhbml0eSBjaGVjay4gKi8KKwkJCWlmICh6b25lX2VuZCA8IHpvbmVfc3RhcnQpCisJCQkJem9uZV9lbmQgPSB6b25lX3N0YXJ0OworCQkJYm1wX3BvcyA9IHpvbmVfc3RhcnQ7CisJCQludGZzX2RlYnVnKCJDb250aW51aW5nIG91dGVyIHdoaWxlIGxvb3AsIHBhc3MgMiwgIgorCQkJCQkiem9uZV9zdGFydCAweCVsbHgsIHpvbmVfZW5kIDB4JWxseCwgIgorCQkJCQkiYm1wX3BvcyAweCVsbHguIiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl6b25lX3N0YXJ0LAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXpvbmVfZW5kLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWJtcF9wb3MpOworCQkJY29udGludWU7CisJCX0gLyogcGFzcyA9PSAyICovCitkb25lX3pvbmVzX2NoZWNrOgorCQludGZzX2RlYnVnKCJBdCBkb25lX3pvbmVzX2NoZWNrLCBzZWFyY2hfem9uZSAlaSwgZG9uZV96b25lcyAiCisJCQkJImJlZm9yZSAweCV4LCBkb25lX3pvbmVzIGFmdGVyIDB4JXguIiwKKwkJCQlzZWFyY2hfem9uZSwgZG9uZV96b25lcywKKwkJCQlkb25lX3pvbmVzIHwgc2VhcmNoX3pvbmUpOworCQlkb25lX3pvbmVzIHw9IHNlYXJjaF96b25lOworCQlpZiAoZG9uZV96b25lcyA8IDcpIHsKKwkJCW50ZnNfZGVidWcoIlN3aXRjaGluZyB6b25lLiIpOworCQkJLyogTm93IHN3aXRjaCB0byB0aGUgbmV4dCB6b25lIHdlIGhhdmVuJ3QgZG9uZSB5ZXQuICovCisJCQlwYXNzID0gMTsKKwkJCXN3aXRjaCAoc2VhcmNoX3pvbmUpIHsKKwkJCWNhc2UgMToKKwkJCQludGZzX2RlYnVnKCJTd2l0Y2hpbmcgZnJvbSBtZnQgem9uZSB0byBkYXRhMSAiCisJCQkJCQkiem9uZS4iKTsKKwkJCQkvKiBVcGRhdGUgbWZ0IHpvbmUgcG9zaXRpb24uICovCisJCQkJaWYgKHJscG9zKSB7CisJCQkJCUxDTiB0YzsKKworCQkJCQludGZzX2RlYnVnKCJCZWZvcmUgY2hlY2tzLCAiCisJCQkJCQkJInZvbC0+bWZ0X3pvbmVfcG9zICIKKwkJCQkJCQkiMHglbGx4LiIsCisJCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJCQl2b2wtPm1mdF96b25lX3Bvcyk7CisJCQkJCXRjID0gcmxbcmxwb3MgLSAxXS5sY24gKworCQkJCQkJCXJsW3JscG9zIC0gMV0ubGVuZ3RoOworCQkJCQlpZiAodGMgPj0gdm9sLT5tZnRfem9uZV9lbmQpIHsKKwkJCQkJCXZvbC0+bWZ0X3pvbmVfcG9zID0KKwkJCQkJCQkJdm9sLT5tZnRfbGNuOworCQkJCQkJaWYgKCF2b2wtPm1mdF96b25lX2VuZCkKKwkJCQkJCQl2b2wtPm1mdF96b25lX3BvcyA9IDA7CisJCQkJCX0gZWxzZSBpZiAoKGJtcF9pbml0aWFsX3BvcyA+PQorCQkJCQkJCXZvbC0+bWZ0X3pvbmVfcG9zIHx8CisJCQkJCQkJdGMgPiB2b2wtPm1mdF96b25lX3BvcykKKwkJCQkJCQkmJiB0YyA+PSB2b2wtPm1mdF9sY24pCisJCQkJCQl2b2wtPm1mdF96b25lX3BvcyA9IHRjOworCQkJCQludGZzX2RlYnVnKCJBZnRlciBjaGVja3MsICIKKwkJCQkJCQkidm9sLT5tZnRfem9uZV9wb3MgIgorCQkJCQkJCSIweCVsbHguIiwKKwkJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkJCXZvbC0+bWZ0X3pvbmVfcG9zKTsKKwkJCQl9CisJCQkJLyogU3dpdGNoIGZyb20gbWZ0IHpvbmUgdG8gZGF0YTEgem9uZS4gKi8KK3N3aXRjaF90b19kYXRhMV96b25lOgkJc2VhcmNoX3pvbmUgPSAyOworCQkJCXpvbmVfc3RhcnQgPSBibXBfaW5pdGlhbF9wb3MgPQorCQkJCQkJdm9sLT5kYXRhMV96b25lX3BvczsKKwkJCQl6b25lX2VuZCA9IHZvbC0+bnJfY2x1c3RlcnM7CisJCQkJaWYgKHpvbmVfc3RhcnQgPT0gdm9sLT5tZnRfem9uZV9lbmQpCisJCQkJCXBhc3MgPSAyOworCQkJCWlmICh6b25lX3N0YXJ0ID49IHpvbmVfZW5kKSB7CisJCQkJCXZvbC0+ZGF0YTFfem9uZV9wb3MgPSB6b25lX3N0YXJ0ID0KKwkJCQkJCQl2b2wtPm1mdF96b25lX2VuZDsKKwkJCQkJcGFzcyA9IDI7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSAyOgorCQkJCW50ZnNfZGVidWcoIlN3aXRjaGluZyBmcm9tIGRhdGExIHpvbmUgdG8gIgorCQkJCQkJImRhdGEyIHpvbmUuIik7CisJCQkJLyogVXBkYXRlIGRhdGExIHpvbmUgcG9zaXRpb24uICovCisJCQkJaWYgKHJscG9zKSB7CisJCQkJCUxDTiB0YzsKKworCQkJCQludGZzX2RlYnVnKCJCZWZvcmUgY2hlY2tzLCAiCisJCQkJCQkJInZvbC0+ZGF0YTFfem9uZV9wb3MgIgorCQkJCQkJCSIweCVsbHguIiwKKwkJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkJCXZvbC0+ZGF0YTFfem9uZV9wb3MpOworCQkJCQl0YyA9IHJsW3JscG9zIC0gMV0ubGNuICsKKwkJCQkJCQlybFtybHBvcyAtIDFdLmxlbmd0aDsKKwkJCQkJaWYgKHRjID49IHZvbC0+bnJfY2x1c3RlcnMpCisJCQkJCQl2b2wtPmRhdGExX3pvbmVfcG9zID0KKwkJCQkJCQkgICAgIHZvbC0+bWZ0X3pvbmVfZW5kOworCQkJCQllbHNlIGlmICgoYm1wX2luaXRpYWxfcG9zID49CisJCQkJCQkgICAgdm9sLT5kYXRhMV96b25lX3BvcyB8fAorCQkJCQkJICAgIHRjID4gdm9sLT5kYXRhMV96b25lX3BvcykKKwkJCQkJCSAgICAmJiB0YyA+PSB2b2wtPm1mdF96b25lX2VuZCkKKwkJCQkJCXZvbC0+ZGF0YTFfem9uZV9wb3MgPSB0YzsKKwkJCQkJbnRmc19kZWJ1ZygiQWZ0ZXIgY2hlY2tzLCAiCisJCQkJCQkJInZvbC0+ZGF0YTFfem9uZV9wb3MgIgorCQkJCQkJCSIweCVsbHguIiwKKwkJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkJCXZvbC0+ZGF0YTFfem9uZV9wb3MpOworCQkJCX0KKwkJCQkvKiBTd2l0Y2ggZnJvbSBkYXRhMSB6b25lIHRvIGRhdGEyIHpvbmUuICovCisJCQkJc2VhcmNoX3pvbmUgPSA0OworCQkJCXpvbmVfc3RhcnQgPSBibXBfaW5pdGlhbF9wb3MgPQorCQkJCQkJdm9sLT5kYXRhMl96b25lX3BvczsKKwkJCQl6b25lX2VuZCA9IHZvbC0+bWZ0X3pvbmVfc3RhcnQ7CisJCQkJaWYgKCF6b25lX3N0YXJ0KQorCQkJCQlwYXNzID0gMjsKKwkJCQlpZiAoem9uZV9zdGFydCA+PSB6b25lX2VuZCkgeworCQkJCQl2b2wtPmRhdGEyX3pvbmVfcG9zID0gem9uZV9zdGFydCA9CisJCQkJCQkJYm1wX2luaXRpYWxfcG9zID0gMDsKKwkJCQkJcGFzcyA9IDI7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCW50ZnNfZGVidWcoIlN3aXRjaGluZyBmcm9tIGRhdGEyIHpvbmUgdG8gIgorCQkJCQkJImRhdGExIHpvbmUuIik7CisJCQkJLyogVXBkYXRlIGRhdGEyIHpvbmUgcG9zaXRpb24uICovCisJCQkJaWYgKHJscG9zKSB7CisJCQkJCUxDTiB0YzsKKworCQkJCQludGZzX2RlYnVnKCJCZWZvcmUgY2hlY2tzLCAiCisJCQkJCQkJInZvbC0+ZGF0YTJfem9uZV9wb3MgIgorCQkJCQkJCSIweCVsbHguIiwKKwkJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkJCXZvbC0+ZGF0YTJfem9uZV9wb3MpOworCQkJCQl0YyA9IHJsW3JscG9zIC0gMV0ubGNuICsKKwkJCQkJCQlybFtybHBvcyAtIDFdLmxlbmd0aDsKKwkJCQkJaWYgKHRjID49IHZvbC0+bWZ0X3pvbmVfc3RhcnQpCisJCQkJCQl2b2wtPmRhdGEyX3pvbmVfcG9zID0gMDsKKwkJCQkJZWxzZSBpZiAoYm1wX2luaXRpYWxfcG9zID49CisJCQkJCQkgICAgICB2b2wtPmRhdGEyX3pvbmVfcG9zIHx8CisJCQkJCQkgICAgICB0YyA+IHZvbC0+ZGF0YTJfem9uZV9wb3MpCisJCQkJCQl2b2wtPmRhdGEyX3pvbmVfcG9zID0gdGM7CisJCQkJCW50ZnNfZGVidWcoIkFmdGVyIGNoZWNrcywgIgorCQkJCQkJCSJ2b2wtPmRhdGEyX3pvbmVfcG9zICIKKwkJCQkJCQkiMHglbGx4LiIsCisJCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJCQl2b2wtPmRhdGEyX3pvbmVfcG9zKTsKKwkJCQl9CisJCQkJLyogU3dpdGNoIGZyb20gZGF0YTIgem9uZSB0byBkYXRhMSB6b25lLiAqLworCQkJCWdvdG8gc3dpdGNoX3RvX2RhdGExX3pvbmU7CisJCQlkZWZhdWx0OgorCQkJCUJVRygpOworCQkJfQorCQkJbnRmc19kZWJ1ZygiQWZ0ZXIgem9uZSBzd2l0Y2gsIHNlYXJjaF96b25lICVpLCAiCisJCQkJCSJwYXNzICVpLCBibXBfaW5pdGlhbF9wb3MgMHglbGx4LCAiCisJCQkJCSJ6b25lX3N0YXJ0IDB4JWxseCwgem9uZV9lbmQgMHglbGx4LiIsCisJCQkJCXNlYXJjaF96b25lLCBwYXNzLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWJtcF9pbml0aWFsX3BvcywKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl6b25lX3N0YXJ0LAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXpvbmVfZW5kKTsKKwkJCWJtcF9wb3MgPSB6b25lX3N0YXJ0OworCQkJaWYgKHpvbmVfc3RhcnQgPT0gem9uZV9lbmQpIHsKKwkJCQludGZzX2RlYnVnKCJFbXB0eSB6b25lLCBnb2luZyB0byAiCisJCQkJCQkiZG9uZV96b25lc19jaGVjay4iKTsKKwkJCQkvKiBFbXB0eSB6b25lLiBEb24ndCBib3RoZXIgc2VhcmNoaW5nIGl0LiAqLworCQkJCWdvdG8gZG9uZV96b25lc19jaGVjazsKKwkJCX0KKwkJCW50ZnNfZGVidWcoIkNvbnRpbnVpbmcgb3V0ZXIgd2hpbGUgbG9vcC4iKTsKKwkJCWNvbnRpbnVlOworCQl9IC8qIGRvbmVfem9uZXMgPT0gNyAqLworCQludGZzX2RlYnVnKCJBbGwgem9uZXMgYXJlIGZpbmlzaGVkLiIpOworCQkvKgorCQkgKiBBbGwgem9uZXMgYXJlIGZpbmlzaGVkISAgSWYgREFUQV9aT05FLCBzaHJpbmsgbWZ0IHpvbmUuICBJZgorCQkgKiBNRlRfWk9ORSwgd2UgaGF2ZSByZWFsbHkgcnVuIG91dCBvZiBzcGFjZS4KKwkJICovCisJCW1mdF96b25lX3NpemUgPSB2b2wtPm1mdF96b25lX2VuZCAtIHZvbC0+bWZ0X3pvbmVfc3RhcnQ7CisJCW50ZnNfZGVidWcoInZvbC0+bWZ0X3pvbmVfc3RhcnQgMHglbGx4LCB2b2wtPm1mdF96b25lX2VuZCAiCisJCQkJIjB4JWxseCwgbWZ0X3pvbmVfc2l6ZSAweCVsbHguIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXZvbC0+bWZ0X3pvbmVfc3RhcnQsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2b2wtPm1mdF96b25lX2VuZCwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKW1mdF96b25lX3NpemUpOworCQlpZiAoem9uZSA9PSBNRlRfWk9ORSB8fCBtZnRfem9uZV9zaXplIDw9IDApIHsKKwkJCW50ZnNfZGVidWcoIk5vIGZyZWUgY2x1c3RlcnMgbGVmdCwgZ29pbmcgdG8gb3V0LiIpOworCQkJLyogUmVhbGx5IG5vIG1vcmUgc3BhY2UgbGVmdCBvbiBkZXZpY2UuICovCisJCQllcnIgPSBFTk9TUEM7CisJCQlnb3RvIG91dDsKKwkJfSAvKiB6b25lID09IERBVEFfWk9ORSAmJiBtZnRfem9uZV9zaXplID4gMCAqLworCQludGZzX2RlYnVnKCJTaHJpbmtpbmcgbWZ0IHpvbmUuIik7CisJCXpvbmVfZW5kID0gdm9sLT5tZnRfem9uZV9lbmQ7CisJCW1mdF96b25lX3NpemUgPj49IDE7CisJCWlmIChtZnRfem9uZV9zaXplID4gMCkKKwkJCXZvbC0+bWZ0X3pvbmVfZW5kID0gdm9sLT5tZnRfem9uZV9zdGFydCArIG1mdF96b25lX3NpemU7CisJCWVsc2UgLyogbWZ0IHpvbmUgYW5kIGRhdGEyIHpvbmUgbm8gbG9uZ2VyIGV4aXN0LiAqLworCQkJdm9sLT5kYXRhMl96b25lX3BvcyA9IHZvbC0+bWZ0X3pvbmVfc3RhcnQgPQorCQkJCQl2b2wtPm1mdF96b25lX2VuZCA9IDA7CisJCWlmICh2b2wtPm1mdF96b25lX3BvcyA+PSB2b2wtPm1mdF96b25lX2VuZCkgeworCQkJdm9sLT5tZnRfem9uZV9wb3MgPSB2b2wtPm1mdF9sY247CisJCQlpZiAoIXZvbC0+bWZ0X3pvbmVfZW5kKQorCQkJCXZvbC0+bWZ0X3pvbmVfcG9zID0gMDsKKwkJfQorCQlibXBfcG9zID0gem9uZV9zdGFydCA9IGJtcF9pbml0aWFsX3BvcyA9CisJCQkJdm9sLT5kYXRhMV96b25lX3BvcyA9IHZvbC0+bWZ0X3pvbmVfZW5kOworCQlzZWFyY2hfem9uZSA9IDI7CisJCXBhc3MgPSAyOworCQlkb25lX3pvbmVzICY9IH4yOworCQludGZzX2RlYnVnKCJBZnRlciBzaHJpbmtpbmcgbWZ0IHpvbmUsIG1mdF96b25lX3NpemUgMHglbGx4LCAiCisJCQkJInZvbC0+bWZ0X3pvbmVfc3RhcnQgMHglbGx4LCAiCisJCQkJInZvbC0+bWZ0X3pvbmVfZW5kIDB4JWxseCwgIgorCQkJCSJ2b2wtPm1mdF96b25lX3BvcyAweCVsbHgsIHNlYXJjaF96b25lIDIsICIKKwkJCQkicGFzcyAyLCBkb25lc196b25lcyAweCV4LCB6b25lX3N0YXJ0IDB4JWxseCwgIgorCQkJCSJ6b25lX2VuZCAweCVsbHgsIHZvbC0+ZGF0YTFfem9uZV9wb3MgMHglbGx4LCAiCisJCQkJImNvbnRpbnVpbmcgb3V0ZXIgd2hpbGUgbG9vcC4iLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbWZ0X3pvbmVfc2l6ZSwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXZvbC0+bWZ0X3pvbmVfc3RhcnQsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2b2wtPm1mdF96b25lX2VuZCwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXZvbC0+bWZ0X3pvbmVfcG9zLAorCQkJCWRvbmVfem9uZXMsICh1bnNpZ25lZCBsb25nIGxvbmcpem9uZV9zdGFydCwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXpvbmVfZW5kLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdm9sLT5kYXRhMV96b25lX3Bvcyk7CisJfQorCW50ZnNfZGVidWcoIkFmdGVyIG91dGVyIHdoaWxlIGxvb3AuIik7CitvdXQ6CisJbnRmc19kZWJ1ZygiQXQgb3V0LiIpOworCS8qIEFkZCBydW5saXN0IHRlcm1pbmF0b3IgZWxlbWVudC4gKi8KKwlpZiAobGlrZWx5KHJsKSkgeworCQlybFtybHBvc10udmNuID0gcmxbcmxwb3MgLSAxXS52Y24gKyBybFtybHBvcyAtIDFdLmxlbmd0aDsKKwkJcmxbcmxwb3NdLmxjbiA9IExDTl9STF9OT1RfTUFQUEVEOworCQlybFtybHBvc10ubGVuZ3RoID0gMDsKKwl9CisJaWYgKGxpa2VseShwYWdlICYmICFJU19FUlIocGFnZSkpKSB7CisJCWlmIChuZWVkX3dyaXRlYmFjaykgeworCQkJbnRmc19kZWJ1ZygiTWFya2luZyBwYWdlIGRpcnR5LiIpOworCQkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKwkJCW5lZWRfd3JpdGViYWNrID0gMDsKKwkJfQorCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJfQorCWlmIChsaWtlbHkoIWVycikpIHsKKwkJdXBfd3JpdGUoJnZvbC0+bGNuYm1wX2xvY2spOworCQludGZzX2RlYnVnKCJEb25lLiIpOworCQlyZXR1cm4gcmw7CisJfQorCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBjbHVzdGVycywgYWJvcnRpbmcgIgorCQkJIihlcnJvciAlaSkuIiwgZXJyKTsKKwlpZiAocmwpIHsKKwkJaW50IGVycjI7CisKKwkJaWYgKGVyciA9PSBFTk9TUEMpCisJCQludGZzX2RlYnVnKCJOb3QgZW5vdWdoIHNwYWNlIHRvIGNvbXBsZXRlIGFsbG9jYXRpb24sICIKKwkJCQkJImVyciBFTk9TUEMsIGZpcnN0IGZyZWUgbGNuIDB4JWxseCwgIgorCQkJCQkiY291bGQgYWxsb2NhdGUgdXAgdG8gMHglbGx4ICIKKwkJCQkJImNsdXN0ZXJzLiIsCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcmxbMF0ubGNuLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWNvdW50IC0gY2x1c3RlcnMpOworCQkvKiBEZWFsbG9jYXRlIGFsbCBhbGxvY2F0ZWQgY2x1c3RlcnMuICovCisJCW50ZnNfZGVidWcoIkF0dGVtcHRpbmcgcm9sbGJhY2suLi4iKTsKKwkJZXJyMiA9IG50ZnNfY2x1c3Rlcl9mcmVlX2Zyb21fcmxfbm9sb2NrKHZvbCwgcmwpOworCQlpZiAoZXJyMikgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHJvbGxiYWNrIChlcnJvciAlaSkuICAiCisJCQkJCSJMZWF2aW5nIGluY29uc2lzdGVudCBtZXRhZGF0YSEgICIKKwkJCQkJIlVubW91bnQgYW5kIHJ1biBjaGtkc2suIiwgZXJyMik7CisJCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJCX0KKwkJLyogRnJlZSB0aGUgcnVubGlzdC4gKi8KKwkJbnRmc19mcmVlKHJsKTsKKwl9IGVsc2UgaWYgKGVyciA9PSBFTk9TUEMpCisJCW50ZnNfZGVidWcoIk5vIHNwYWNlIGxlZnQgYXQgYWxsLCBlcnIgPSBFTk9TUEMsICIKKwkJCQkiZmlyc3QgZnJlZSBsY24gPSAweCVsbHguIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXZvbC0+ZGF0YTFfem9uZV9wb3MpOworCXVwX3dyaXRlKCZ2b2wtPmxjbmJtcF9sb2NrKTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCisvKioKKyAqIF9fbnRmc19jbHVzdGVyX2ZyZWUgLSBmcmVlIGNsdXN0ZXJzIG9uIGFuIG50ZnMgdm9sdW1lCisgKiBAdmk6CQl2ZnMgaW5vZGUgd2hvc2UgcnVubGlzdCBkZXNjcmliZXMgdGhlIGNsdXN0ZXJzIHRvIGZyZWUKKyAqIEBzdGFydF92Y246CXZjbiBpbiB0aGUgcnVubGlzdCBvZiBAdmkgYXQgd2hpY2ggdG8gc3RhcnQgZnJlZWluZyBjbHVzdGVycworICogQGNvdW50OgludW1iZXIgb2YgY2x1c3RlcnMgdG8gZnJlZSBvciAtMSBmb3IgYWxsIGNsdXN0ZXJzCisgKiBAaXNfcm9sbGJhY2s6CWlmIFRSVUUgdGhpcyBpcyBhIHJvbGxiYWNrIG9wZXJhdGlvbgorICoKKyAqIEZyZWUgQGNvdW50IGNsdXN0ZXJzIHN0YXJ0aW5nIGF0IHRoZSBjbHVzdGVyIEBzdGFydF92Y24gaW4gdGhlIHJ1bmxpc3QKKyAqIGRlc2NyaWJlZCBieSB0aGUgdmZzIGlub2RlIEB2aS4KKyAqCisgKiBJZiBAY291bnQgaXMgLTEsIGFsbCBjbHVzdGVycyBmcm9tIEBzdGFydF92Y24gdG8gdGhlIGVuZCBvZiB0aGUgcnVubGlzdCBhcmUKKyAqIGRlYWxsb2NhdGVkLiAgVGh1cywgdG8gY29tcGxldGVseSBmcmVlIGFsbCBjbHVzdGVycyBpbiBhIHJ1bmxpc3QsIHVzZQorICogQHN0YXJ0X3ZjbiA9IDAgYW5kIEBjb3VudCA9IC0xLgorICoKKyAqIEBpc19yb2xsYmFjayBzaG91bGQgYWx3YXlzIGJlIEZBTFNFLCBpdCBpcyBmb3IgaW50ZXJuYWwgdXNlIHRvIHJvbGxiYWNrCisgKiBlcnJvcnMuICBZb3UgcHJvYmFibHkgd2FudCB0byB1c2UgbnRmc19jbHVzdGVyX2ZyZWUoKSBpbnN0ZWFkLgorICoKKyAqIE5vdGUsIG50ZnNfY2x1c3Rlcl9mcmVlKCkgZG9lcyBub3QgbW9kaWZ5IHRoZSBydW5saXN0IGF0IGFsbCwgc28gdGhlIGNhbGxlcgorICogaGFzIHRvIGRlYWwgd2l0aCBpdCBsYXRlci4KKyAqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBkZWFsbG9jYXRlZCBjbHVzdGVycyAobm90IGNvdW50aW5nIHNwYXJzZSBvbmVzKSBvbgorICogc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLgorICoKKyAqIExvY2tpbmc6IC0gVGhlIHJ1bmxpc3QgZGVzY3JpYmVkIGJ5IEB2aSBtdXN0IGJlIHVubG9ja2VkIG9uIGVudHJ5IGFuZCBpcworICoJICAgICAgdW5sb2NrZWQgb24gcmV0dXJuLgorICoJICAgIC0gVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgcnVubGlzdCBsb2NrIG9mIEB2aSBmb3IgcmVhZGluZyBhbmQKKyAqCSAgICAgIHNvbWV0aW1lcyBmb3Igd3JpdGluZyBhbmQgc29tZXRpbWVzIG1vZGlmaWVzIHRoZSBydW5saXN0LgorICoJICAgIC0gVGhlIHZvbHVtZSBsY24gYml0bWFwIG11c3QgYmUgdW5sb2NrZWQgb24gZW50cnkgYW5kIGlzIHVubG9ja2VkCisgKgkgICAgICBvbiByZXR1cm4uCisgKgkgICAgLSBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSB2b2x1bWUgbGNuIGJpdG1hcCBsb2NrIGZvciB3cml0aW5nIGFuZAorICoJICAgICAgbW9kaWZpZXMgdGhlIGJpdG1hcCBjb250ZW50cy4KKyAqLworczY0IF9fbnRmc19jbHVzdGVyX2ZyZWUoc3RydWN0IGlub2RlICp2aSwgY29uc3QgVkNOIHN0YXJ0X3ZjbiwgczY0IGNvdW50LAorCQljb25zdCBCT09MIGlzX3JvbGxiYWNrKQoreworCXM2NCBkZWx0YSwgdG9fZnJlZSwgdG90YWxfZnJlZWQsIHJlYWxfZnJlZWQ7CisJbnRmc19pbm9kZSAqbmk7CisJbnRmc192b2x1bWUgKnZvbDsKKwlzdHJ1Y3QgaW5vZGUgKmxjbmJtcF92aTsKKwlydW5saXN0X2VsZW1lbnQgKnJsOworCWludCBlcnI7CisKKwlCVUdfT04oIXZpKTsKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3IgaV9pbm8gMHglbHgsIHN0YXJ0X3ZjbiAweCVsbHgsIGNvdW50ICIKKwkJCSIweCVsbHguJXMiLCB2aS0+aV9pbm8sICh1bnNpZ25lZCBsb25nIGxvbmcpc3RhcnRfdmNuLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyljb3VudCwKKwkJCWlzX3JvbGxiYWNrID8gIiAocm9sbGJhY2spIiA6ICIiKTsKKwluaSA9IE5URlNfSSh2aSk7CisJdm9sID0gbmktPnZvbDsKKwlsY25ibXBfdmkgPSB2b2wtPmxjbmJtcF9pbm87CisJQlVHX09OKCFsY25ibXBfdmkpOworCUJVR19PTihzdGFydF92Y24gPCAwKTsKKwlCVUdfT04oY291bnQgPCAtMSk7CisJLyoKKwkgKiBMb2NrIHRoZSBsY24gYml0bWFwIGZvciB3cml0aW5nIGJ1dCBvbmx5IGlmIG5vdCByb2xsaW5nIGJhY2suICBXZQorCSAqIG11c3QgaG9sZCB0aGUgbG9jayBhbGwgdGhlIHdheSBpbmNsdWRpbmcgdGhyb3VnaCByb2xsYmFjayBvdGhlcndpc2UKKwkgKiByb2xsYmFjayBpcyBub3QgcG9zc2libGUgYmVjYXVzZSBvbmNlIHdlIGhhdmUgY2xlYXJlZCBhIGJpdCBhbmQKKwkgKiBkcm9wcGVkIHRoZSBsb2NrLCBhbnlvbmUgY291bGQgaGF2ZSBzZXQgdGhlIGJpdCBhZ2FpbiwgdGh1cworCSAqIGFsbG9jYXRpbmcgdGhlIGNsdXN0ZXIgZm9yIGFub3RoZXIgdXNlLgorCSAqLworCWlmIChsaWtlbHkoIWlzX3JvbGxiYWNrKSkKKwkJZG93bl93cml0ZSgmdm9sLT5sY25ibXBfbG9jayk7CisKKwl0b3RhbF9mcmVlZCA9IHJlYWxfZnJlZWQgPSAwOworCisJLyogVGhpcyByZXR1cm5zIHdpdGggbmktPnJ1bmxpc3QgbG9ja2VkIGZvciByZWFkaW5nIG9uIHN1Y2Nlc3MuICovCisJcmwgPSBudGZzX2ZpbmRfdmNuKG5pLCBzdGFydF92Y24sIEZBTFNFKTsKKwlpZiAoSVNfRVJSKHJsKSkgeworCQlpZiAoIWlzX3JvbGxiYWNrKQorCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGZpbmQgZmlyc3QgcnVubGlzdCAiCisJCQkJCSJlbGVtZW50IChlcnJvciAlbGkpLCBhYm9ydGluZy4iLAorCQkJCQlQVFJfRVJSKHJsKSk7CisJCWVyciA9IFBUUl9FUlIocmwpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCWlmICh1bmxpa2VseShybC0+bGNuIDwgTENOX0hPTEUpKSB7CisJCWlmICghaXNfcm9sbGJhY2spCisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGaXJzdCBydW5saXN0IGVsZW1lbnQgaGFzICIKKwkJCQkJImludmFsaWQgbGNuLCBhYm9ydGluZy4iKTsKKwkJZXJyID0gLUVJTzsKKwkJZ290byB1bmxfZXJyX291dDsKKwl9CisJLyogRmluZCB0aGUgc3RhcnRpbmcgY2x1c3RlciBpbnNpZGUgdGhlIHJ1biB0aGF0IG5lZWRzIGZyZWVpbmcuICovCisJZGVsdGEgPSBzdGFydF92Y24gLSBybC0+dmNuOworCisJLyogVGhlIG51bWJlciBvZiBjbHVzdGVycyBpbiB0aGlzIHJ1biB0aGF0IG5lZWQgZnJlZWluZy4gKi8KKwl0b19mcmVlID0gcmwtPmxlbmd0aCAtIGRlbHRhOworCWlmIChjb3VudCA+PSAwICYmIHRvX2ZyZWUgPiBjb3VudCkKKwkJdG9fZnJlZSA9IGNvdW50OworCisJaWYgKGxpa2VseShybC0+bGNuID49IDApKSB7CisJCS8qIERvIHRoZSBhY3R1YWwgZnJlZWluZyBvZiB0aGUgY2x1c3RlcnMgaW4gdGhpcyBydW4uICovCisJCWVyciA9IG50ZnNfYml0bWFwX3NldF9iaXRzX2luX3J1bihsY25ibXBfdmksIHJsLT5sY24gKyBkZWx0YSwKKwkJCQl0b19mcmVlLCBsaWtlbHkoIWlzX3JvbGxiYWNrKSA/IDAgOiAxKTsKKwkJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJCWlmICghaXNfcm9sbGJhY2spCisJCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGNsZWFyIGZpcnN0IHJ1biAiCisJCQkJCQkiKGVycm9yICVpKSwgYWJvcnRpbmcuIiwgZXJyKTsKKwkJCWdvdG8gdW5sX2Vycl9vdXQ7CisJCX0KKwkJLyogV2UgaGF2ZSBmcmVlZCBAdG9fZnJlZSByZWFsIGNsdXN0ZXJzLiAqLworCQlyZWFsX2ZyZWVkID0gdG9fZnJlZTsKKwl9OworCS8qIEdvIHRvIHRoZSBuZXh0IHJ1biBhbmQgYWRqdXN0IHRoZSBudW1iZXIgb2YgY2x1c3RlcnMgbGVmdCB0byBmcmVlLiAqLworCSsrcmw7CisJaWYgKGNvdW50ID49IDApCisJCWNvdW50IC09IHRvX2ZyZWU7CisKKwkvKiBLZWVwIHRyYWNrIG9mIHRoZSB0b3RhbCAiZnJlZWQiIGNsdXN0ZXJzLCBpbmNsdWRpbmcgc3BhcnNlIG9uZXMuICovCisJdG90YWxfZnJlZWQgPSB0b19mcmVlOworCS8qCisJICogTG9vcCBvdmVyIHRoZSByZW1haW5pbmcgcnVucywgdXNpbmcgQGNvdW50IGFzIGEgY2FwcGluZyB2YWx1ZSwgYW5kCisJICogZnJlZSB0aGVtLgorCSAqLworCWZvciAoOyBybC0+bGVuZ3RoICYmIGNvdW50ICE9IDA7ICsrcmwpIHsKKwkJaWYgKHVubGlrZWx5KHJsLT5sY24gPCBMQ05fSE9MRSkpIHsKKwkJCVZDTiB2Y247CisKKwkJCS8qCisJCQkgKiBBdHRlbXB0IHRvIG1hcCBydW5saXN0LCBkcm9wcGluZyBydW5saXN0IGxvY2sgZm9yCisJCQkgKiB0aGUgZHVyYXRpb24uCisJCQkgKi8KKwkJCXZjbiA9IHJsLT52Y247CisJCQl1cF9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKKwkJCWVyciA9IG50ZnNfbWFwX3J1bmxpc3QobmksIHZjbik7CisJCQlpZiAoZXJyKSB7CisJCQkJaWYgKCFpc19yb2xsYmFjaykKKwkJCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIG1hcCAiCisJCQkJCQkJInJ1bmxpc3QgZnJhZ21lbnQuIik7CisJCQkJaWYgKGVyciA9PSAtRUlOVkFMIHx8IGVyciA9PSAtRU5PRU5UKQorCQkJCQllcnIgPSAtRUlPOworCQkJCWdvdG8gZXJyX291dDsKKwkJCX0KKwkJCS8qCisJCQkgKiBUaGlzIHJldHVybnMgd2l0aCBuaS0+cnVubGlzdCBsb2NrZWQgZm9yIHJlYWRpbmcgb24KKwkJCSAqIHN1Y2Nlc3MuCisJCQkgKi8KKwkJCXJsID0gbnRmc19maW5kX3ZjbihuaSwgdmNuLCBGQUxTRSk7CisJCQlpZiAoSVNfRVJSKHJsKSkgeworCQkJCWVyciA9IFBUUl9FUlIocmwpOworCQkJCWlmICghaXNfcm9sbGJhY2spCisJCQkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBmaW5kICIKKwkJCQkJCQkic3Vic2VxdWVudCBydW5saXN0ICIKKwkJCQkJCQkiZWxlbWVudC4iKTsKKwkJCQlnb3RvIGVycl9vdXQ7CisJCQl9CisJCQlpZiAodW5saWtlbHkocmwtPmxjbiA8IExDTl9IT0xFKSkgeworCQkJCWlmICghaXNfcm9sbGJhY2spCisJCQkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIlJ1bmxpc3QgZWxlbWVudCAiCisJCQkJCQkJImhhcyBpbnZhbGlkIGxjbiAiCisJCQkJCQkJIigweCVsbHgpLiIsCisJCQkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCQkJCQlybC0+bGNuKTsKKwkJCQllcnIgPSAtRUlPOworCQkJCWdvdG8gdW5sX2Vycl9vdXQ7CisJCQl9CisJCX0KKwkJLyogVGhlIG51bWJlciBvZiBjbHVzdGVycyBpbiB0aGlzIHJ1biB0aGF0IG5lZWQgZnJlZWluZy4gKi8KKwkJdG9fZnJlZSA9IHJsLT5sZW5ndGg7CisJCWlmIChjb3VudCA+PSAwICYmIHRvX2ZyZWUgPiBjb3VudCkKKwkJCXRvX2ZyZWUgPSBjb3VudDsKKworCQlpZiAobGlrZWx5KHJsLT5sY24gPj0gMCkpIHsKKwkJCS8qIERvIHRoZSBhY3R1YWwgZnJlZWluZyBvZiB0aGUgY2x1c3RlcnMgaW4gdGhlIHJ1bi4gKi8KKwkJCWVyciA9IG50ZnNfYml0bWFwX3NldF9iaXRzX2luX3J1bihsY25ibXBfdmksIHJsLT5sY24sCisJCQkJCXRvX2ZyZWUsIGxpa2VseSghaXNfcm9sbGJhY2spID8gMCA6IDEpOworCQkJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJCQlpZiAoIWlzX3JvbGxiYWNrKQorCQkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gY2xlYXIgIgorCQkJCQkJCSJzdWJzZXF1ZW50IHJ1bi4iKTsKKwkJCQlnb3RvIHVubF9lcnJfb3V0OworCQkJfQorCQkJLyogV2UgaGF2ZSBmcmVlZCBAdG9fZnJlZSByZWFsIGNsdXN0ZXJzLiAqLworCQkJcmVhbF9mcmVlZCArPSB0b19mcmVlOworCQl9CisJCS8qIEFkanVzdCB0aGUgbnVtYmVyIG9mIGNsdXN0ZXJzIGxlZnQgdG8gZnJlZS4gKi8KKwkJaWYgKGNvdW50ID49IDApCisJCQljb3VudCAtPSB0b19mcmVlOworCQorCQkvKiBVcGRhdGUgdGhlIHRvdGFsIGRvbmUgY2x1c3RlcnMuICovCisJCXRvdGFsX2ZyZWVkICs9IHRvX2ZyZWU7CisJfQorCXVwX3JlYWQoJm5pLT5ydW5saXN0LmxvY2spOworCWlmIChsaWtlbHkoIWlzX3JvbGxiYWNrKSkKKwkJdXBfd3JpdGUoJnZvbC0+bGNuYm1wX2xvY2spOworCisJQlVHX09OKGNvdW50ID4gMCk7CisKKwkvKiBXZSBhcmUgZG9uZS4gIFJldHVybiB0aGUgbnVtYmVyIG9mIGFjdHVhbGx5IGZyZWVkIGNsdXN0ZXJzLiAqLworCW50ZnNfZGVidWcoIkRvbmUuIik7CisJcmV0dXJuIHJlYWxfZnJlZWQ7Cit1bmxfZXJyX291dDoKKwl1cF9yZWFkKCZuaS0+cnVubGlzdC5sb2NrKTsKK2Vycl9vdXQ6CisJaWYgKGlzX3JvbGxiYWNrKQorCQlyZXR1cm4gZXJyOworCS8qIElmIG5vIHJlYWwgY2x1c3RlcnMgd2VyZSBmcmVlZCwgbm8gbmVlZCB0byByb2xsYmFjay4gKi8KKwlpZiAoIXJlYWxfZnJlZWQpIHsKKwkJdXBfd3JpdGUoJnZvbC0+bGNuYm1wX2xvY2spOworCQlyZXR1cm4gZXJyOworCX0KKwkvKgorCSAqIEF0dGVtcHQgdG8gcm9sbGJhY2sgYW5kIGlmIHRoYXQgc3VjY2VlZHMganVzdCByZXR1cm4gdGhlIGVycm9yIGNvZGUuCisJICogSWYgcm9sbGJhY2sgZmFpbHMsIHNldCB0aGUgdm9sdW1lIGVycm9ycyBmbGFnLCBlbWl0IGFuIGVycm9yCisJICogbWVzc2FnZSwgYW5kIHJldHVybiB0aGUgZXJyb3IgY29kZS4KKwkgKi8KKwlkZWx0YSA9IF9fbnRmc19jbHVzdGVyX2ZyZWUodmksIHN0YXJ0X3ZjbiwgdG90YWxfZnJlZWQsIFRSVUUpOworCWlmIChkZWx0YSA8IDApIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHJvbGxiYWNrIChlcnJvciAlaSkuICBMZWF2aW5nICIKKwkJCQkiaW5jb25zaXN0ZW50IG1ldGFkYXRhISAgVW5tb3VudCBhbmQgcnVuICIKKwkJCQkiY2hrZHNrLiIsIChpbnQpZGVsdGEpOworCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJfQorCXVwX3dyaXRlKCZ2b2wtPmxjbmJtcF9sb2NrKTsKKwludGZzX2Vycm9yKHZvbC0+c2IsICJBYm9ydGluZyAoZXJyb3IgJWkpLiIsIGVycik7CisJcmV0dXJuIGVycjsKK30KKworI2VuZGlmIC8qIE5URlNfUlcgKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvbGNuYWxsb2MuaCBiL2ZzL250ZnMvbGNuYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2FjMWMwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9sY25hbGxvYy5oCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogbGNuYWxsb2MuaCAtIEV4cG9ydHMgZm9yIE5URlMga2VybmVsIGNsdXN0ZXIgKGRlKWFsbG9jYXRpb24uICBQYXJ0IG9mIHRoZQorICoJCUxpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfTElOVVhfTlRGU19MQ05BTExPQ19ICisjZGVmaW5lIF9MSU5VWF9OVEZTX0xDTkFMTE9DX0gKKworI2lmZGVmIE5URlNfUlcKKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisKKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgInJ1bmxpc3QuaCIKKyNpbmNsdWRlICJ2b2x1bWUuaCIKKwordHlwZWRlZiBlbnVtIHsKKwlGSVJTVF9aT05FCT0gMCwJLyogRm9yIHNhbml0eSBjaGVja2luZy4gKi8KKwlNRlRfWk9ORQk9IDAsCS8qIEFsbG9jYXRlIGZyb20gJE1GVCB6b25lLiAqLworCURBVEFfWk9ORQk9IDEsCS8qIEFsbG9jYXRlIGZyb20gJERBVEEgem9uZS4gKi8KKwlMQVNUX1pPTkUJPSAxLAkvKiBGb3Igc2FuaXR5IGNoZWNraW5nLiAqLworfSBOVEZTX0NMVVNURVJfQUxMT0NBVElPTl9aT05FUzsKKworZXh0ZXJuIHJ1bmxpc3RfZWxlbWVudCAqbnRmc19jbHVzdGVyX2FsbG9jKG50ZnNfdm9sdW1lICp2b2wsCisJCWNvbnN0IFZDTiBzdGFydF92Y24sIGNvbnN0IHM2NCBjb3VudCwgY29uc3QgTENOIHN0YXJ0X2xjbiwKKwkJY29uc3QgTlRGU19DTFVTVEVSX0FMTE9DQVRJT05fWk9ORVMgem9uZSk7CisKK2V4dGVybiBzNjQgX19udGZzX2NsdXN0ZXJfZnJlZShzdHJ1Y3QgaW5vZGUgKnZpLCBjb25zdCBWQ04gc3RhcnRfdmNuLAorCQlzNjQgY291bnQsIGNvbnN0IEJPT0wgaXNfcm9sbGJhY2spOworCisvKioKKyAqIG50ZnNfY2x1c3Rlcl9mcmVlIC0gZnJlZSBjbHVzdGVycyBvbiBhbiBudGZzIHZvbHVtZQorICogQHZpOgkJdmZzIGlub2RlIHdob3NlIHJ1bmxpc3QgZGVzY3JpYmVzIHRoZSBjbHVzdGVycyB0byBmcmVlCisgKiBAc3RhcnRfdmNuOgl2Y24gaW4gdGhlIHJ1bmxpc3Qgb2YgQHZpIGF0IHdoaWNoIHRvIHN0YXJ0IGZyZWVpbmcgY2x1c3RlcnMKKyAqIEBjb3VudDoJbnVtYmVyIG9mIGNsdXN0ZXJzIHRvIGZyZWUgb3IgLTEgZm9yIGFsbCBjbHVzdGVycworICoKKyAqIEZyZWUgQGNvdW50IGNsdXN0ZXJzIHN0YXJ0aW5nIGF0IHRoZSBjbHVzdGVyIEBzdGFydF92Y24gaW4gdGhlIHJ1bmxpc3QKKyAqIGRlc2NyaWJlZCBieSB0aGUgdmZzIGlub2RlIEB2aS4KKyAqCisgKiBJZiBAY291bnQgaXMgLTEsIGFsbCBjbHVzdGVycyBmcm9tIEBzdGFydF92Y24gdG8gdGhlIGVuZCBvZiB0aGUgcnVubGlzdCBhcmUKKyAqIGRlYWxsb2NhdGVkLiAgVGh1cywgdG8gY29tcGxldGVseSBmcmVlIGFsbCBjbHVzdGVycyBpbiBhIHJ1bmxpc3QsIHVzZQorICogQHN0YXJ0X3ZjbiA9IDAgYW5kIEBjb3VudCA9IC0xLgorICoKKyAqIE5vdGUsIG50ZnNfY2x1c3Rlcl9mcmVlKCkgZG9lcyBub3QgbW9kaWZ5IHRoZSBydW5saXN0IGF0IGFsbCwgc28gdGhlIGNhbGxlcgorICogaGFzIHRvIGRlYWwgd2l0aCBpdCBsYXRlci4KKyAqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBkZWFsbG9jYXRlZCBjbHVzdGVycyAobm90IGNvdW50aW5nIHNwYXJzZSBvbmVzKSBvbgorICogc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLgorICoKKyAqIExvY2tpbmc6IC0gVGhlIHJ1bmxpc3QgZGVzY3JpYmVkIGJ5IEB2aSBtdXN0IGJlIHVubG9ja2VkIG9uIGVudHJ5IGFuZCBpcworICoJICAgICAgdW5sb2NrZWQgb24gcmV0dXJuLgorICoJICAgIC0gVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgcnVubGlzdCBsb2NrIG9mIEB2aSBmb3IgcmVhZGluZyBhbmQKKyAqCSAgICAgIHNvbWV0aW1lcyBmb3Igd3JpdGluZyBhbmQgc29tZXRpbWVzIG1vZGlmaWVzIHRoZSBydW5saXN0LgorICoJICAgIC0gVGhlIHZvbHVtZSBsY24gYml0bWFwIG11c3QgYmUgdW5sb2NrZWQgb24gZW50cnkgYW5kIGlzIHVubG9ja2VkCisgKgkgICAgICBvbiByZXR1cm4uCisgKgkgICAgLSBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSB2b2x1bWUgbGNuIGJpdG1hcCBsb2NrIGZvciB3cml0aW5nIGFuZAorICoJICAgICAgbW9kaWZpZXMgdGhlIGJpdG1hcCBjb250ZW50cy4KKyAqLworc3RhdGljIGlubGluZSBzNjQgbnRmc19jbHVzdGVyX2ZyZWUoc3RydWN0IGlub2RlICp2aSwgY29uc3QgVkNOIHN0YXJ0X3ZjbiwKKwkJczY0IGNvdW50KQoreworCXJldHVybiBfX250ZnNfY2x1c3Rlcl9mcmVlKHZpLCBzdGFydF92Y24sIGNvdW50LCBGQUxTRSk7Cit9CisKK2V4dGVybiBpbnQgbnRmc19jbHVzdGVyX2ZyZWVfZnJvbV9ybF9ub2xvY2sobnRmc192b2x1bWUgKnZvbCwKKwkJY29uc3QgcnVubGlzdF9lbGVtZW50ICpybCk7CisKKy8qKgorICogbnRmc19jbHVzdGVyX2ZyZWVfZnJvbV9ybCAtIGZyZWUgY2x1c3RlcnMgZnJvbSBydW5saXN0CisgKiBAdm9sOgltb3VudGVkIG50ZnMgdm9sdW1lIG9uIHdoaWNoIHRvIGZyZWUgdGhlIGNsdXN0ZXJzCisgKiBAcmw6CQlydW5saXN0IGRlc2NyaWJpbmcgdGhlIGNsdXN0ZXJzIHRvIGZyZWUKKyAqCisgKiBGcmVlIGFsbCB0aGUgY2x1c3RlcnMgZGVzY3JpYmVkIGJ5IHRoZSBydW5saXN0IEBybCBvbiB0aGUgdm9sdW1lIEB2b2wuICBJbgorICogdGhlIGNhc2Ugb2YgYW4gZXJyb3IgYmVpbmcgcmV0dXJuZWQsIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGNsdXN0ZXJzIHdlcmUgbm90CisgKiBmcmVlZC4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuCisgKgorICogTG9ja2luZzogVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgdm9sdW1lIGxjbiBiaXRtYXAgbG9jayBmb3Igd3JpdGluZyBhbmQKKyAqCSAgICBtb2RpZmllcyB0aGUgYml0bWFwIGNvbnRlbnRzLgorICovCitzdGF0aWMgaW5saW5lIGludCBudGZzX2NsdXN0ZXJfZnJlZV9mcm9tX3JsKG50ZnNfdm9sdW1lICp2b2wsCisJCWNvbnN0IHJ1bmxpc3RfZWxlbWVudCAqcmwpCit7CisJaW50IHJldDsKKworCWRvd25fd3JpdGUoJnZvbC0+bGNuYm1wX2xvY2spOworCXJldCA9IG50ZnNfY2x1c3Rlcl9mcmVlX2Zyb21fcmxfbm9sb2NrKHZvbCwgcmwpOworCXVwX3dyaXRlKCZ2b2wtPmxjbmJtcF9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYgLyogTlRGU19SVyAqLworCisjZW5kaWYgLyogZGVmaW5lZCBfTElOVVhfTlRGU19MQ05BTExPQ19IICovCmRpZmYgLS1naXQgYS9mcy9udGZzL2xvZ2ZpbGUuYyBiL2ZzL250ZnMvbG9nZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMjgwYWIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL2xvZ2ZpbGUuYwpAQCAtMCwwICsxLDcwNSBAQAorLyoKKyAqIGxvZ2ZpbGUuYyAtIE5URlMga2VybmVsIGpvdXJuYWwgaGFuZGxpbmcuIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZkZWYgTlRGU19SVworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSAiYXR0cmliLmgiCisjaW5jbHVkZSAiYW9wcy5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAibG9nZmlsZS5oIgorI2luY2x1ZGUgIm1hbGxvYy5oIgorI2luY2x1ZGUgInZvbHVtZS5oIgorI2luY2x1ZGUgIm50ZnMuaCIKKworLyoqCisgKiBudGZzX2NoZWNrX3Jlc3RhcnRfcGFnZV9oZWFkZXIgLSBjaGVjayB0aGUgcGFnZSBoZWFkZXIgZm9yIGNvbnNpc3RlbmN5CisgKiBAdmk6CQkkTG9nRmlsZSBpbm9kZSB0byB3aGljaCB0aGUgcmVzdGFydCBwYWdlIGhlYWRlciBiZWxvbmdzCisgKiBAcnA6CQlyZXN0YXJ0IHBhZ2UgaGVhZGVyIHRvIGNoZWNrCisgKiBAcG9zOglwb3NpdGlvbiBpbiBAdmkgYXQgd2hpY2ggdGhlIHJlc3RhcnQgcGFnZSBoZWFkZXIgcmVzaWRlcworICoKKyAqIENoZWNrIHRoZSByZXN0YXJ0IHBhZ2UgaGVhZGVyIEBycCBmb3IgY29uc2lzdGVuY3kgYW5kIHJldHVybiBUUlVFIGlmIGl0IGlzCisgKiBjb25zaXN0ZW50IGFuZCBGQUxTRSBvdGhlcndpc2UuCisgKgorICogVGhpcyBmdW5jdGlvbiBvbmx5IG5lZWRzIE5URlNfQkxPQ0tfU0laRSBieXRlcyBpbiBAcnAsIGkuZS4gaXQgZG9lcyBub3QKKyAqIHJlcXVpcmUgdGhlIGZ1bGwgcmVzdGFydCBwYWdlLgorICovCitzdGF0aWMgQk9PTCBudGZzX2NoZWNrX3Jlc3RhcnRfcGFnZV9oZWFkZXIoc3RydWN0IGlub2RlICp2aSwKKwkJUkVTVEFSVF9QQUdFX0hFQURFUiAqcnAsIHM2NCBwb3MpCit7CisJdTMyIGxvZ2ZpbGVfc3lzdGVtX3BhZ2Vfc2l6ZSwgbG9nZmlsZV9sb2dfcGFnZV9zaXplOworCXUxNiB1c2FfY291bnQsIHVzYV9vZnMsIHVzYV9lbmQsIHJhX29mczsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworCS8qCisJICogSWYgdGhlIHN5c3RlbSBvciBsb2cgcGFnZSBzaXplcyBhcmUgc21hbGxlciB0aGFuIHRoZSBudGZzIGJsb2NrIHNpemUKKwkgKiBvciBlaXRoZXIgaXMgbm90IGEgcG93ZXIgb2YgMiB3ZSBjYW5ub3QgaGFuZGxlIHRoaXMgbG9nIGZpbGUuCisJICovCisJbG9nZmlsZV9zeXN0ZW1fcGFnZV9zaXplID0gbGUzMl90b19jcHUocnAtPnN5c3RlbV9wYWdlX3NpemUpOworCWxvZ2ZpbGVfbG9nX3BhZ2Vfc2l6ZSA9IGxlMzJfdG9fY3B1KHJwLT5sb2dfcGFnZV9zaXplKTsKKwlpZiAobG9nZmlsZV9zeXN0ZW1fcGFnZV9zaXplIDwgTlRGU19CTE9DS19TSVpFIHx8CisJCQlsb2dmaWxlX2xvZ19wYWdlX3NpemUgPCBOVEZTX0JMT0NLX1NJWkUgfHwKKwkJCWxvZ2ZpbGVfc3lzdGVtX3BhZ2Vfc2l6ZSAmCisJCQkobG9nZmlsZV9zeXN0ZW1fcGFnZV9zaXplIC0gMSkgfHwKKwkJCWxvZ2ZpbGVfbG9nX3BhZ2Vfc2l6ZSAmIChsb2dmaWxlX2xvZ19wYWdlX3NpemUgLSAxKSkgeworCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiJExvZ0ZpbGUgdXNlcyB1bnN1cHBvcnRlZCBwYWdlIHNpemUuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJLyoKKwkgKiBXZSBtdXN0IGJlIGVpdGhlciBhdCAhcG9zICgxc3QgcmVzdGFydCBwYWdlKSBvciBhdCBwb3MgPSBzeXN0ZW0gcGFnZQorCSAqIHNpemUgKDJuZCByZXN0YXJ0IHBhZ2UpLgorCSAqLworCWlmIChwb3MgJiYgcG9zICE9IGxvZ2ZpbGVfc3lzdGVtX3BhZ2Vfc2l6ZSkgeworCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRm91bmQgcmVzdGFydCBhcmVhIGluIGluY29ycmVjdCAiCisJCQkJInBvc2l0aW9uIGluICRMb2dGaWxlLiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCS8qIFdlIG9ubHkga25vdyBob3cgdG8gaGFuZGxlIHZlcnNpb24gMS4xLiAqLworCWlmIChzbGUxNl90b19jcHUocnAtPm1ham9yX3ZlcikgIT0gMSB8fAorCQkJc2xlMTZfdG9fY3B1KHJwLT5taW5vcl92ZXIpICE9IDEpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRMb2dGaWxlIHZlcnNpb24gJWkuJWkgaXMgbm90ICIKKwkJCQkic3VwcG9ydGVkLiAgKFRoaXMgZHJpdmVyIHN1cHBvcnRzIHZlcnNpb24gIgorCQkJCSIxLjEgb25seS4pIiwgKGludClzbGUxNl90b19jcHUocnAtPm1ham9yX3ZlciksCisJCQkJKGludClzbGUxNl90b19jcHUocnAtPm1pbm9yX3ZlcikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCS8qIFZlcmlmeSB0aGUgc2l6ZSBvZiB0aGUgdXBkYXRlIHNlcXVlbmNlIGFycmF5LiAqLworCXVzYV9jb3VudCA9IDEgKyAobG9nZmlsZV9zeXN0ZW1fcGFnZV9zaXplID4+IE5URlNfQkxPQ0tfU0laRV9CSVRTKTsKKwlpZiAodXNhX2NvdW50ICE9IGxlMTZfdG9fY3B1KHJwLT51c2FfY291bnQpKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkTG9nRmlsZSByZXN0YXJ0IHBhZ2Ugc3BlY2lmaWVzICIKKwkJCQkiaW5jb25zaXN0ZW50IHVwZGF0ZSBzZXF1ZW5jZSBhcnJheSBjb3VudC4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvKiBWZXJpZnkgdGhlIHBvc2l0aW9uIG9mIHRoZSB1cGRhdGUgc2VxdWVuY2UgYXJyYXkuICovCisJdXNhX29mcyA9IGxlMTZfdG9fY3B1KHJwLT51c2Ffb2ZzKTsKKwl1c2FfZW5kID0gdXNhX29mcyArIHVzYV9jb3VudCAqIHNpemVvZih1MTYpOworCWlmICh1c2Ffb2ZzIDwgc2l6ZW9mKFJFU1RBUlRfUEFHRV9IRUFERVIpIHx8CisJCQl1c2FfZW5kID4gTlRGU19CTE9DS19TSVpFIC0gc2l6ZW9mKHUxNikpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRMb2dGaWxlIHJlc3RhcnQgcGFnZSBzcGVjaWZpZXMgIgorCQkJCSJpbmNvbnNpc3RlbnQgdXBkYXRlIHNlcXVlbmNlIGFycmF5IG9mZnNldC4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvKgorCSAqIFZlcmlmeSB0aGUgcG9zaXRpb24gb2YgdGhlIHJlc3RhcnQgYXJlYS4gIEl0IG11c3QgYmU6CisJICoJLSBhbGlnbmVkIHRvIDgtYnl0ZSBib3VuZGFyeSwKKwkgKgktIGFmdGVyIHRoZSB1cGRhdGUgc2VxdWVuY2UgYXJyYXksIGFuZAorCSAqCS0gd2l0aGluIHRoZSBzeXN0ZW0gcGFnZSBzaXplLgorCSAqLworCXJhX29mcyA9IGxlMTZfdG9fY3B1KHJwLT5yZXN0YXJ0X2FyZWFfb2Zmc2V0KTsKKwlpZiAocmFfb2ZzICYgNyB8fCByYV9vZnMgPCB1c2FfZW5kIHx8CisJCQlyYV9vZnMgPiBsb2dmaWxlX3N5c3RlbV9wYWdlX3NpemUpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRMb2dGaWxlIHJlc3RhcnQgcGFnZSBzcGVjaWZpZXMgIgorCQkJCSJpbmNvbnNpc3RlbnQgcmVzdGFydCBhcmVhIG9mZnNldC4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvKgorCSAqIE9ubHkgcmVzdGFydCBwYWdlcyBtb2RpZmllZCBieSBjaGtkc2sgYXJlIGFsbG93ZWQgdG8gaGF2ZSBjaGtkc2tfbHNuCisJICogc2V0LgorCSAqLworCWlmICghbnRmc19pc19jaGtkX3JlY29yZChycC0+bWFnaWMpICYmIHNsZTY0X3RvX2NwdShycC0+Y2hrZHNrX2xzbikpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRMb2dGaWxlIHJlc3RhcnQgcGFnZSBpcyBub3QgbW9kaWZpZWQgIgorCQkJCSJjaGtkc2sgYnV0IGEgY2hrZHNrIExTTiBpcyBzcGVjaWZpZWQuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBudGZzX2NoZWNrX3Jlc3RhcnRfYXJlYSAtIGNoZWNrIHRoZSByZXN0YXJ0IGFyZWEgZm9yIGNvbnNpc3RlbmN5CisgKiBAdmk6CQkkTG9nRmlsZSBpbm9kZSB0byB3aGljaCB0aGUgcmVzdGFydCBwYWdlIGJlbG9uZ3MKKyAqIEBycDoJCXJlc3RhcnQgcGFnZSB3aG9zZSByZXN0YXJ0IGFyZWEgdG8gY2hlY2sKKyAqCisgKiBDaGVjayB0aGUgcmVzdGFydCBhcmVhIG9mIHRoZSByZXN0YXJ0IHBhZ2UgQHJwIGZvciBjb25zaXN0ZW5jeSBhbmQgcmV0dXJuCisgKiBUUlVFIGlmIGl0IGlzIGNvbnNpc3RlbnQgYW5kIEZBTFNFIG90aGVyd2lzZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB0aGUgcmVzdGFydCBwYWdlIGhlYWRlciBoYXMgYWxyZWFkeSBiZWVuCisgKiBjb25zaXN0ZW5jeSBjaGVja2VkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gb25seSBuZWVkcyBOVEZTX0JMT0NLX1NJWkUgYnl0ZXMgaW4gQHJwLCBpLmUuIGl0IGRvZXMgbm90CisgKiByZXF1aXJlIHRoZSBmdWxsIHJlc3RhcnQgcGFnZS4KKyAqLworc3RhdGljIEJPT0wgbnRmc19jaGVja19yZXN0YXJ0X2FyZWEoc3RydWN0IGlub2RlICp2aSwgUkVTVEFSVF9QQUdFX0hFQURFUiAqcnApCit7CisJdTY0IGZpbGVfc2l6ZTsKKwlSRVNUQVJUX0FSRUEgKnJhOworCXUxNiByYV9vZnMsIHJhX2xlbiwgY2Ffb2ZzOworCXU4IGZzX2JpdHM7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwlyYV9vZnMgPSBsZTE2X3RvX2NwdShycC0+cmVzdGFydF9hcmVhX29mZnNldCk7CisJcmEgPSAoUkVTVEFSVF9BUkVBKikoKHU4KilycCArIHJhX29mcyk7CisJLyoKKwkgKiBFdmVyeXRoaW5nIGJlZm9yZSByYS0+ZmlsZV9zaXplIG11c3QgYmUgYmVmb3JlIHRoZSBmaXJzdCB3b3JkCisJICogcHJvdGVjdGVkIGJ5IGFuIHVwZGF0ZSBzZXF1ZW5jZSBudW1iZXIuICBUaGlzIGVuc3VyZXMgdGhhdCBpdCBpcworCSAqIHNhZmUgdG8gYWNjZXNzIHJhLT5jbGllbnRfYXJyYXlfb2Zmc2V0LgorCSAqLworCWlmIChyYV9vZnMgKyBvZmZzZXRvZihSRVNUQVJUX0FSRUEsIGZpbGVfc2l6ZSkgPgorCQkJTlRGU19CTE9DS19TSVpFIC0gc2l6ZW9mKHUxNikpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRMb2dGaWxlIHJlc3RhcnQgYXJlYSBzcGVjaWZpZXMgIgorCQkJCSJpbmNvbnNpc3RlbnQgZmlsZSBvZmZzZXQuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJLyoKKwkgKiBOb3cgdGhhdCB3ZSBjYW4gYWNjZXNzIHJhLT5jbGllbnRfYXJyYXlfb2Zmc2V0LCBtYWtlIHN1cmUgZXZlcnl0aGluZworCSAqIHVwIHRvIHRoZSBsb2cgY2xpZW50IGFycmF5IGlzIGJlZm9yZSB0aGUgZmlyc3Qgd29yZCBwcm90ZWN0ZWQgYnkgYW4KKwkgKiB1cGRhdGUgc2VxdWVuY2UgbnVtYmVyLiAgVGhpcyBlbnN1cmVzIHdlIGNhbiBhY2Nlc3MgYWxsIG9mIHRoZQorCSAqIHJlc3RhcnQgYXJlYSBlbGVtZW50cyBzYWZlbHkuICBBbHNvLCB0aGUgY2xpZW50IGFycmF5IG9mZnNldCBtdXN0IGJlCisJICogYWxpZ25lZCB0byBhbiA4LWJ5dGUgYm91bmRhcnkuCisJICovCisJY2Ffb2ZzID0gbGUxNl90b19jcHUocmEtPmNsaWVudF9hcnJheV9vZmZzZXQpOworCWlmICgoKGNhX29mcyArIDcpICYgfjcpICE9IGNhX29mcyB8fAorCQkJcmFfb2ZzICsgY2Ffb2ZzID4gTlRGU19CTE9DS19TSVpFIC0gc2l6ZW9mKHUxNikpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRMb2dGaWxlIHJlc3RhcnQgYXJlYSBzcGVjaWZpZXMgIgorCQkJCSJpbmNvbnNpc3RlbnQgY2xpZW50IGFycmF5IG9mZnNldC4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvKgorCSAqIFRoZSByZXN0YXJ0IGFyZWEgbXVzdCBlbmQgd2l0aGluIHRoZSBzeXN0ZW0gcGFnZSBzaXplIGJvdGggd2hlbgorCSAqIGNhbGN1bGF0ZWQgbWFudWFsbHkgYW5kIGFzIHNwZWNpZmllZCBieSByYS0+cmVzdGFydF9hcmVhX2xlbmd0aC4KKwkgKiBBbHNvLCB0aGUgY2FsY3VsYXRlZCBsZW5ndGggbXVzdCBub3QgZXhjZWVkIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgorCSAqLworCXJhX2xlbiA9IGNhX29mcyArIGxlMTZfdG9fY3B1KHJhLT5sb2dfY2xpZW50cykgKgorCQkJc2l6ZW9mKExPR19DTElFTlRfUkVDT1JEKTsKKwlpZiAocmFfb2ZzICsgcmFfbGVuID4gbGUzMl90b19jcHUocnAtPnN5c3RlbV9wYWdlX3NpemUpIHx8CisJCQlyYV9vZnMgKyBsZTE2X3RvX2NwdShyYS0+cmVzdGFydF9hcmVhX2xlbmd0aCkgPgorCQkJbGUzMl90b19jcHUocnAtPnN5c3RlbV9wYWdlX3NpemUpIHx8CisJCQlyYV9sZW4gPiBsZTE2X3RvX2NwdShyYS0+cmVzdGFydF9hcmVhX2xlbmd0aCkpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRMb2dGaWxlIHJlc3RhcnQgYXJlYSBpcyBvdXQgb2YgYm91bmRzICIKKwkJCQkib2YgdGhlIHN5c3RlbSBwYWdlIHNpemUgc3BlY2lmaWVkIGJ5IHRoZSAiCisJCQkJInJlc3RhcnQgcGFnZSBoZWFkZXIgYW5kL29yIHRoZSBzcGVjaWZpZWQgIgorCQkJCSJyZXN0YXJ0IGFyZWEgbGVuZ3RoIGlzIGluY29uc2lzdGVudC4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvKgorCSAqIFRoZSByYS0+Y2xpZW50X2ZyZWVfbGlzdCBhbmQgcmEtPmNsaWVudF9pbl91c2VfbGlzdCBtdXN0IGJlIGVpdGhlcgorCSAqIExPR0ZJTEVfTk9fQ0xJRU5UIG9yIGxlc3MgdGhhbiByYS0+bG9nX2NsaWVudHMgb3IgdGhleSBhcmUKKwkgKiBvdmVyZmxvd2luZyB0aGUgY2xpZW50IGFycmF5LgorCSAqLworCWlmICgocmEtPmNsaWVudF9mcmVlX2xpc3QgIT0gTE9HRklMRV9OT19DTElFTlQgJiYKKwkJCWxlMTZfdG9fY3B1KHJhLT5jbGllbnRfZnJlZV9saXN0KSA+PQorCQkJbGUxNl90b19jcHUocmEtPmxvZ19jbGllbnRzKSkgfHwKKwkJCShyYS0+Y2xpZW50X2luX3VzZV9saXN0ICE9IExPR0ZJTEVfTk9fQ0xJRU5UICYmCisJCQlsZTE2X3RvX2NwdShyYS0+Y2xpZW50X2luX3VzZV9saXN0KSA+PQorCQkJbGUxNl90b19jcHUocmEtPmxvZ19jbGllbnRzKSkpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRMb2dGaWxlIHJlc3RhcnQgYXJlYSBzcGVjaWZpZXMgIgorCQkJCSJvdmVyZmxvd2luZyBjbGllbnQgZnJlZSBhbmQvb3IgaW4gdXNlIGxpc3RzLiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCS8qCisJICogQ2hlY2sgcmEtPnNlcV9udW1iZXJfYml0cyBhZ2FpbnN0IHJhLT5maWxlX3NpemUgZm9yIGNvbnNpc3RlbmN5LgorCSAqIFdlIGNhbm5vdCBqdXN0IHVzZSBmZnMoKSBiZWNhdXNlIHRoZSBmaWxlIHNpemUgaXMgbm90IGEgcG93ZXIgb2YgMi4KKwkgKi8KKwlmaWxlX3NpemUgPSAodTY0KXNsZTY0X3RvX2NwdShyYS0+ZmlsZV9zaXplKTsKKwlmc19iaXRzID0gMDsKKwl3aGlsZSAoZmlsZV9zaXplKSB7CisJCWZpbGVfc2l6ZSA+Pj0gMTsKKwkJZnNfYml0cysrOworCX0KKwlpZiAobGUzMl90b19jcHUocmEtPnNlcV9udW1iZXJfYml0cykgIT0gNjcgLSBmc19iaXRzKSB7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICIkTG9nRmlsZSByZXN0YXJ0IGFyZWEgc3BlY2lmaWVzICIKKwkJCQkiaW5jb25zaXN0ZW50IHNlcXVlbmNlIG51bWJlciBiaXRzLiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCS8qIFRoZSBsb2cgcmVjb3JkIGhlYWRlciBsZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDguICovCisJaWYgKCgobGUxNl90b19jcHUocmEtPmxvZ19yZWNvcmRfaGVhZGVyX2xlbmd0aCkgKyA3KSAmIH43KSAhPQorCQkJbGUxNl90b19jcHUocmEtPmxvZ19yZWNvcmRfaGVhZGVyX2xlbmd0aCkpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRMb2dGaWxlIHJlc3RhcnQgYXJlYSBzcGVjaWZpZXMgIgorCQkJCSJpbmNvbnNpc3RlbnQgbG9nIHJlY29yZCBoZWFkZXIgbGVuZ3RoLiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCS8qIERpdG8gZm9yIHRoZSBsb2cgcGFnZSBkYXRhIG9mZnNldC4gKi8KKwlpZiAoKChsZTE2X3RvX2NwdShyYS0+bG9nX3BhZ2VfZGF0YV9vZmZzZXQpICsgNykgJiB+NykgIT0KKwkJCWxlMTZfdG9fY3B1KHJhLT5sb2dfcGFnZV9kYXRhX29mZnNldCkpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIiRMb2dGaWxlIHJlc3RhcnQgYXJlYSBzcGVjaWZpZXMgIgorCQkJCSJpbmNvbnNpc3RlbnQgbG9nIHBhZ2UgZGF0YSBvZmZzZXQuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBudGZzX2NoZWNrX2xvZ19jbGllbnRfYXJyYXkgLSBjaGVjayB0aGUgbG9nIGNsaWVudCBhcnJheSBmb3IgY29uc2lzdGVuY3kKKyAqIEB2aToJCSRMb2dGaWxlIGlub2RlIHRvIHdoaWNoIHRoZSByZXN0YXJ0IHBhZ2UgYmVsb25ncworICogQHJwOgkJcmVzdGFydCBwYWdlIHdob3NlIGxvZyBjbGllbnQgYXJyYXkgdG8gY2hlY2sKKyAqCisgKiBDaGVjayB0aGUgbG9nIGNsaWVudCBhcnJheSBvZiB0aGUgcmVzdGFydCBwYWdlIEBycCBmb3IgY29uc2lzdGVuY3kgYW5kCisgKiByZXR1cm4gVFJVRSBpZiBpdCBpcyBjb25zaXN0ZW50IGFuZCBGQUxTRSBvdGhlcndpc2UuCisgKgorICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgdGhlIHJlc3RhcnQgcGFnZSBoZWFkZXIgYW5kIHRoZSByZXN0YXJ0IGFyZWEgaGF2ZQorICogYWxyZWFkeSBiZWVuIGNvbnNpc3RlbmN5IGNoZWNrZWQuCisgKgorICogVW5saWtlIG50ZnNfY2hlY2tfcmVzdGFydF9wYWdlX2hlYWRlcigpIGFuZCBudGZzX2NoZWNrX3Jlc3RhcnRfYXJlYSgpLCB0aGlzCisgKiBmdW5jdGlvbiBuZWVkcyBAcnAtPnN5c3RlbV9wYWdlX3NpemUgYnl0ZXMgaW4gQHJwLCBpLmUuIGl0IHJlcXVpcmVzIHRoZSBmdWxsCisgKiByZXN0YXJ0IHBhZ2UgYW5kIHRoZSBwYWdlIG11c3QgYmUgbXVsdGkgc2VjdG9yIHRyYW5zZmVyIGRlcHJvdGVjdGVkLgorICovCitzdGF0aWMgQk9PTCBudGZzX2NoZWNrX2xvZ19jbGllbnRfYXJyYXkoc3RydWN0IGlub2RlICp2aSwKKwkJUkVTVEFSVF9QQUdFX0hFQURFUiAqcnApCit7CisJUkVTVEFSVF9BUkVBICpyYTsKKwlMT0dfQ0xJRU5UX1JFQ09SRCAqY2EsICpjcjsKKwl1MTYgbnJfY2xpZW50cywgaWR4OworCUJPT0wgaW5fZnJlZV9saXN0LCBpZHhfaXNfZmlyc3Q7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwlyYSA9IChSRVNUQVJUX0FSRUEqKSgodTgqKXJwICsgbGUxNl90b19jcHUocnAtPnJlc3RhcnRfYXJlYV9vZmZzZXQpKTsKKwljYSA9IChMT0dfQ0xJRU5UX1JFQ09SRCopKCh1OCopcmEgKworCQkJbGUxNl90b19jcHUocmEtPmNsaWVudF9hcnJheV9vZmZzZXQpKTsKKwkvKgorCSAqIENoZWNrIHRoZSByYS0+Y2xpZW50X2ZyZWVfbGlzdCBmaXJzdCBhbmQgdGhlbiBjaGVjayB0aGUKKwkgKiByYS0+Y2xpZW50X2luX3VzZV9saXN0LiAgQ2hlY2sgZWFjaCBvZiB0aGUgbG9nIGNsaWVudCByZWNvcmRzIGluCisJICogZWFjaCBvZiB0aGUgbGlzdHMgYW5kIGNoZWNrIHRoYXQgdGhlIGFycmF5IGRvZXMgbm90IG92ZXJmbG93IHRoZQorCSAqIHJhLT5sb2dfY2xpZW50cyB2YWx1ZS4gIEFsc28ga2VlcCB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIHJlY29yZHMKKwkgKiB2aXNpdGVkIGFzIHRoZXJlIGNhbm5vdCBiZSBtb3JlIHRoYW4gcmEtPmxvZ19jbGllbnRzIHJlY29yZHMgYW5kCisJICogdGhhdCB3YXkgd2UgZGV0ZWN0IGV2ZW50dWFsIGxvb3BzIGluIHdpdGhpbiBhIGxpc3QuCisJICovCisJbnJfY2xpZW50cyA9IGxlMTZfdG9fY3B1KHJhLT5sb2dfY2xpZW50cyk7CisJaWR4ID0gbGUxNl90b19jcHUocmEtPmNsaWVudF9mcmVlX2xpc3QpOworCWluX2ZyZWVfbGlzdCA9IFRSVUU7CitjaGVja19saXN0OgorCWZvciAoaWR4X2lzX2ZpcnN0ID0gVFJVRTsgaWR4ICE9IExPR0ZJTEVfTk9fQ0xJRU5UX0NQVTsgbnJfY2xpZW50cy0tLAorCQkJaWR4ID0gbGUxNl90b19jcHUoY3ItPm5leHRfY2xpZW50KSkgeworCQlpZiAoIW5yX2NsaWVudHMgfHwgaWR4ID49IGxlMTZfdG9fY3B1KHJhLT5sb2dfY2xpZW50cykpCisJCQlnb3RvIGVycl9vdXQ7CisJCS8qIFNldCBAY3IgdG8gdGhlIGN1cnJlbnQgbG9nIGNsaWVudCByZWNvcmQuICovCisJCWNyID0gY2EgKyBpZHg7CisJCS8qIFRoZSBmaXJzdCBsb2cgY2xpZW50IHJlY29yZCBtdXN0IG5vdCBoYXZlIGEgcHJldl9jbGllbnQuICovCisJCWlmIChpZHhfaXNfZmlyc3QpIHsKKwkJCWlmIChjci0+cHJldl9jbGllbnQgIT0gTE9HRklMRV9OT19DTElFTlQpCisJCQkJZ290byBlcnJfb3V0OworCQkJaWR4X2lzX2ZpcnN0ID0gRkFMU0U7CisJCX0KKwl9CisJLyogU3dpdGNoIHRvIGFuZCBjaGVjayB0aGUgaW4gdXNlIGxpc3QgaWYgd2UganVzdCBkaWQgdGhlIGZyZWUgbGlzdC4gKi8KKwlpZiAoaW5fZnJlZV9saXN0KSB7CisJCWluX2ZyZWVfbGlzdCA9IEZBTFNFOworCQlpZHggPSBsZTE2X3RvX2NwdShyYS0+Y2xpZW50X2luX3VzZV9saXN0KTsKKwkJZ290byBjaGVja19saXN0OworCX0KKwludGZzX2RlYnVnKCJEb25lLiIpOworCXJldHVybiBUUlVFOworZXJyX291dDoKKwludGZzX2Vycm9yKHZpLT5pX3NiLCAiJExvZ0ZpbGUgbG9nIGNsaWVudCBhcnJheSBpcyBjb3JydXB0LiIpOworCXJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBudGZzX2NoZWNrX2FuZF9sb2FkX3Jlc3RhcnRfcGFnZSAtIGNoZWNrIHRoZSByZXN0YXJ0IHBhZ2UgZm9yIGNvbnNpc3RlbmN5CisgKiBAdmk6CQkkTG9nRmlsZSBpbm9kZSB0byB3aGljaCB0aGUgcmVzdGFydCBwYWdlIGJlbG9uZ3MKKyAqIEBycDoJCXJlc3RhcnQgcGFnZSB0byBjaGVjaworICogQHBvczoJcG9zaXRpb24gaW4gQHZpIGF0IHdoaWNoIHRoZSByZXN0YXJ0IHBhZ2UgcmVzaWRlcworICogQHdycDoJY29weSBvZiB0aGUgbXVsdGkgc2VjdG9yIHRyYW5zZmVyIGRlcHJvdGVjdGVkIHJlc3RhcnQgcGFnZQorICoKKyAqIENoZWNrIHRoZSByZXN0YXJ0IHBhZ2UgQHJwIGZvciBjb25zaXN0ZW5jeSBhbmQgcmV0dXJuIFRSVUUgaWYgaXQgaXMKKyAqIGNvbnNpc3RlbnQgYW5kIEZBTFNFIG90aGVyd2lzZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG9ubHkgbmVlZHMgTlRGU19CTE9DS19TSVpFIGJ5dGVzIGluIEBycCwgaS5lLiBpdCBkb2VzIG5vdAorICogcmVxdWlyZSB0aGUgZnVsbCByZXN0YXJ0IHBhZ2UuCisgKgorICogSWYgQHdycCBpcyBub3QgTlVMTCwgb24gc3VjY2VzcywgKkB3cnAgd2lsbCBwb2ludCB0byBhIGJ1ZmZlciBjb250YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhlIGNvbXBsZXRlIG11bHRpIHNlY3RvciB0cmFuc2ZlciBkZXByb3RlY3RlZCBwYWdlLiAgT24gZmFpbHVyZSwKKyAqICpAd3JwIGlzIHVuZGVmaW5lZC4KKyAqLworc3RhdGljIEJPT0wgbnRmc19jaGVja19hbmRfbG9hZF9yZXN0YXJ0X3BhZ2Uoc3RydWN0IGlub2RlICp2aSwKKwkJUkVTVEFSVF9QQUdFX0hFQURFUiAqcnAsIHM2NCBwb3MsIFJFU1RBUlRfUEFHRV9IRUFERVIgKip3cnApCit7CisJUkVTVEFSVF9BUkVBICpyYTsKKwlSRVNUQVJUX1BBR0VfSEVBREVSICp0cnA7CisJaW50IHNpemU7CisJQk9PTCByZXQ7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwkvKiBDaGVjayB0aGUgcmVzdGFydCBwYWdlIGhlYWRlciBmb3IgY29uc2lzdGVuY3kuICovCisJaWYgKCFudGZzX2NoZWNrX3Jlc3RhcnRfcGFnZV9oZWFkZXIodmksIHJwLCBwb3MpKSB7CisJCS8qIEVycm9yIG91dHB1dCBhbHJlYWR5IGRvbmUgaW5zaWRlIHRoZSBmdW5jdGlvbi4gKi8KKwkJcmV0dXJuIEZBTFNFOworCX0KKwkvKiBDaGVjayB0aGUgcmVzdGFydCBhcmVhIGZvciBjb25zaXN0ZW5jeS4gKi8KKwlpZiAoIW50ZnNfY2hlY2tfcmVzdGFydF9hcmVhKHZpLCBycCkpIHsKKwkJLyogRXJyb3Igb3V0cHV0IGFscmVhZHkgZG9uZSBpbnNpZGUgdGhlIGZ1bmN0aW9uLiAqLworCQlyZXR1cm4gRkFMU0U7CisJfQorCXJhID0gKFJFU1RBUlRfQVJFQSopKCh1OCopcnAgKyBsZTE2X3RvX2NwdShycC0+cmVzdGFydF9hcmVhX29mZnNldCkpOworCS8qCisJICogQWxsb2NhdGUgYSBidWZmZXIgdG8gc3RvcmUgdGhlIHdob2xlIHJlc3RhcnQgcGFnZSBzbyB3ZSBjYW4gbXVsdGkKKwkgKiBzZWN0b3IgdHJhbnNmZXIgZGVwcm90ZWN0IGl0LgorCSAqLworCXRycCA9IG50ZnNfbWFsbG9jX25vZnMobGUzMl90b19jcHUocnAtPnN5c3RlbV9wYWdlX3NpemUpKTsKKwlpZiAoIXRycCkgeworCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgJExvZ0ZpbGUgIgorCQkJCSJyZXN0YXJ0IHBhZ2UgYnVmZmVyLiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCS8qCisJICogUmVhZCB0aGUgd2hvbGUgb2YgdGhlIHJlc3RhcnQgcGFnZSBpbnRvIHRoZSBidWZmZXIuICBJZiBpdCBmaXRzCisJICogY29tcGxldGVseSBpbnNpZGUgQHJwLCBqdXN0IGNvcHkgaXQgZnJvbSB0aGVyZS4gIE90aGVyd2lzZSBtYXAgYWxsCisJICogdGhlIHJlcXVpcmVkIHBhZ2VzIGFuZCBjb3B5IHRoZSBkYXRhIGZyb20gdGhlbS4KKwkgKi8KKwlzaXplID0gUEFHRV9DQUNIRV9TSVpFIC0gKHBvcyAmIH5QQUdFX0NBQ0hFX01BU0spOworCWlmIChzaXplID49IGxlMzJfdG9fY3B1KHJwLT5zeXN0ZW1fcGFnZV9zaXplKSkgeworCQltZW1jcHkodHJwLCBycCwgbGUzMl90b19jcHUocnAtPnN5c3RlbV9wYWdlX3NpemUpKTsKKwl9IGVsc2UgeworCQlwZ29mZl90IGlkeDsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisJCWludCBoYXZlX3JlYWQsIHRvX3JlYWQ7CisKKwkJLyogRmlyc3QgY29weSB3aGF0IHdlIGFscmVhZHkgaGF2ZSBpbiBAcnAuICovCisJCW1lbWNweSh0cnAsIHJwLCBzaXplKTsKKwkJLyogQ29weSB0aGUgcmVtYWluaW5nIGRhdGEgb25lIHBhZ2UgYXQgYSB0aW1lLiAqLworCQloYXZlX3JlYWQgPSBzaXplOworCQl0b19yZWFkID0gbGUzMl90b19jcHUocnAtPnN5c3RlbV9wYWdlX3NpemUpIC0gc2l6ZTsKKwkJaWR4ID0gKHBvcyArIHNpemUpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJCUJVR19PTigocG9zICsgc2l6ZSkgJiB+UEFHRV9DQUNIRV9NQVNLKTsKKwkJZG8geworCQkJcGFnZSA9IG50ZnNfbWFwX3BhZ2UodmktPmlfbWFwcGluZywgaWR4KTsKKwkJCWlmIChJU19FUlIocGFnZSkpIHsKKwkJCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiRXJyb3IgbWFwcGluZyAkTG9nRmlsZSAiCisJCQkJCQkicGFnZSAoaW5kZXggJWx1KS4iLCBpZHgpOworCQkJCWdvdG8gZXJyX291dDsKKwkJCX0KKwkJCXNpemUgPSBtaW5fdChpbnQsIHRvX3JlYWQsIFBBR0VfQ0FDSEVfU0laRSk7CisJCQltZW1jcHkoKHU4Kil0cnAgKyBoYXZlX3JlYWQsIHBhZ2VfYWRkcmVzcyhwYWdlKSwgc2l6ZSk7CisJCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJCQloYXZlX3JlYWQgKz0gc2l6ZTsKKwkJCXRvX3JlYWQgLT0gc2l6ZTsKKwkJCWlkeCsrOworCQl9IHdoaWxlICh0b19yZWFkID4gMCk7CisJfQorCS8qIFBlcmZvcm0gdGhlIG11bHRpIHNlY3RvciB0cmFuc2ZlciBkZXByb3RlY3Rpb24gb24gdGhlIGJ1ZmZlci4gKi8KKwlpZiAocG9zdF9yZWFkX21zdF9maXh1cCgoTlRGU19SRUNPUkQqKXRycCwKKwkJCWxlMzJfdG9fY3B1KHJwLT5zeXN0ZW1fcGFnZV9zaXplKSkpIHsKKwkJbnRmc19lcnJvcih2aS0+aV9zYiwgIk11bHRpIHNlY3RvciB0cmFuc2ZlciBlcnJvciBkZXRlY3RlZCBpbiAiCisJCQkJIiRMb2dGaWxlIHJlc3RhcnQgcGFnZS4iKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwkvKiBDaGVjayB0aGUgbG9nIGNsaWVudCByZWNvcmRzIGZvciBjb25zaXN0ZW5jeS4gKi8KKwlyZXQgPSBudGZzX2NoZWNrX2xvZ19jbGllbnRfYXJyYXkodmksIHRycCk7CisJaWYgKHJldCAmJiB3cnApCisJCSp3cnAgPSB0cnA7CisJZWxzZQorCQludGZzX2ZyZWUodHJwKTsKKwludGZzX2RlYnVnKCJEb25lLiIpOworCXJldHVybiByZXQ7CitlcnJfb3V0OgorCW50ZnNfZnJlZSh0cnApOworCXJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBudGZzX2NrZWNrX2xvZ2ZpbGUgLSBjaGVjayBpbiB0aGUgam91cm5hbCBpZiB0aGUgdm9sdW1lIGlzIGNvbnNpc3RlbnQKKyAqIEBsb2dfdmk6CXN0cnVjdCBpbm9kZSBvZiBsb2FkZWQgam91cm5hbCAkTG9nRmlsZSB0byBjaGVjaworICoKKyAqIENoZWNrIHRoZSAkTG9nRmlsZSBqb3VybmFsIGZvciBjb25zaXN0ZW5jeSBhbmQgcmV0dXJuIFRSVUUgaWYgaXQgaXMKKyAqIGNvbnNpc3RlbnQgYW5kIEZBTFNFIGlmIG5vdC4KKyAqCisgKiBBdCBwcmVzZW50IHdlIG9ubHkgY2hlY2sgdGhlIHR3byByZXN0YXJ0IHBhZ2VzIGFuZCBpZ25vcmUgdGhlIGxvZyByZWNvcmQKKyAqIHBhZ2VzLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgTXN0UHJvdGVjdGVkIGZsYWcgaXMgbm90IHNldCBvbiB0aGUgJExvZ0ZpbGUgaW5vZGUgYW5kIGhlbmNlCisgKiB3aGVuIHJlYWRpbmcgcGFnZXMgdGhleSBhcmUgbm90IGRlcHJvdGVjdGVkLiAgVGhpcyBpcyBiZWNhdXNlIHdlIGRvIG5vdCBrbm93CisgKiBpZiB0aGUgJExvZ0ZpbGUgd2FzIGNyZWF0ZWQgb24gYSBzeXN0ZW0gd2l0aCBhIGRpZmZlcmVudCBwYWdlIHNpemUgdG8gb3VycworICogeWV0IGFuZCBtc3QgZGVwcm90ZWN0aW9uIHdvdWxkIGZhaWwgaWYgb3VyIHBhZ2Ugc2l6ZSBpcyBzbWFsbGVyLgorICovCitCT09MIG50ZnNfY2hlY2tfbG9nZmlsZShzdHJ1Y3QgaW5vZGUgKmxvZ192aSkKK3sKKwlzNjQgc2l6ZSwgcG9zLCByc3RyMV9wb3MsIHJzdHIyX3BvczsKKwludGZzX3ZvbHVtZSAqdm9sID0gTlRGU19TQihsb2dfdmktPmlfc2IpOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gbG9nX3ZpLT5pX21hcHBpbmc7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOworCXU4ICprYWRkciA9IE5VTEw7CisJUkVTVEFSVF9QQUdFX0hFQURFUiAqcnN0cjFfcGggPSBOVUxMOworCVJFU1RBUlRfUEFHRV9IRUFERVIgKnJzdHIyX3BoID0gTlVMTDsKKwlpbnQgbG9nX3BhZ2Vfc2l6ZSwgbG9nX3BhZ2VfbWFzaywgb2ZzOworCUJPT0wgbG9nZmlsZV9pc19lbXB0eSA9IFRSVUU7CisJQk9PTCByc3RyMV9mb3VuZCA9IEZBTFNFOworCUJPT0wgcnN0cjJfZm91bmQgPSBGQUxTRTsKKwl1OCBsb2dfcGFnZV9iaXRzOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CisJLyogQW4gZW1wdHkgJExvZ0ZpbGUgbXVzdCBoYXZlIGJlZW4gY2xlYW4gYmVmb3JlIGl0IGdvdCBlbXB0aWVkLiAqLworCWlmIChOVm9sTG9nRmlsZUVtcHR5KHZvbCkpCisJCWdvdG8gaXNfZW1wdHk7CisJc2l6ZSA9IGxvZ192aS0+aV9zaXplOworCS8qIE1ha2Ugc3VyZSB0aGUgZmlsZSBkb2Vzbid0IGV4Y2VlZCB0aGUgbWF4aW11bSBhbGxvd2VkIHNpemUuICovCisJaWYgKHNpemUgPiBNYXhMb2dGaWxlU2l6ZSkKKwkJc2l6ZSA9IE1heExvZ0ZpbGVTaXplOworCS8qCisJICogVHJ1bmNhdGUgc2l6ZSB0byBhIG11bHRpcGxlIG9mIHRoZSBwYWdlIGNhY2hlIHNpemUgb3IgdGhlIGRlZmF1bHQKKwkgKiBsb2cgcGFnZSBzaXplIGlmIHRoZSBwYWdlIGNhY2hlIHNpemUgaXMgYmV0d2VlbiB0aGUgZGVmYXVsdCBsb2cgcGFnZQorCSAqIGxvZyBwYWdlIHNpemUgaWYgdGhlIHBhZ2UgY2FjaGUgc2l6ZSBpcyBiZXR3ZWVuIHRoZSBkZWZhdWx0IGxvZyBwYWdlCisJICogc2l6ZSBhbmQgdHdpY2UgdGhhdC4KKwkgKi8KKwlpZiAoUEFHRV9DQUNIRV9TSVpFID49IERlZmF1bHRMb2dQYWdlU2l6ZSAmJiBQQUdFX0NBQ0hFX1NJWkUgPD0KKwkJCURlZmF1bHRMb2dQYWdlU2l6ZSAqIDIpCisJCWxvZ19wYWdlX3NpemUgPSBEZWZhdWx0TG9nUGFnZVNpemU7CisJZWxzZQorCQlsb2dfcGFnZV9zaXplID0gUEFHRV9DQUNIRV9TSVpFOworCWxvZ19wYWdlX21hc2sgPSBsb2dfcGFnZV9zaXplIC0gMTsKKwkvKgorCSAqIFVzZSBnZW5lcmljX2ZmcygpIGluc3RlYWQgb2YgZmZzKCkgdG8gZW5hYmxlIHRoZSBjb21waWxlciB0bworCSAqIG9wdGltaXplIGxvZ19wYWdlX3NpemUgYW5kIGxvZ19wYWdlX2JpdHMgaW50byBjb25zdGFudHMuCisJICovCisJbG9nX3BhZ2VfYml0cyA9IGdlbmVyaWNfZmZzKGxvZ19wYWdlX3NpemUpIC0gMTsKKwlzaXplICY9IH4obG9nX3BhZ2Vfc2l6ZSAtIDEpOworCS8qCisJICogRW5zdXJlIHRoZSBsb2cgZmlsZSBpcyBiaWcgZW5vdWdoIHRvIHN0b3JlIGF0IGxlYXN0IHRoZSB0d28gcmVzdGFydAorCSAqIHBhZ2VzIGFuZCB0aGUgbWluaW11bSBudW1iZXIgb2YgbG9nIHJlY29yZCBwYWdlcy4KKwkgKi8KKwlpZiAoc2l6ZSA8IGxvZ19wYWdlX3NpemUgKiAyIHx8IChzaXplIC0gbG9nX3BhZ2Vfc2l6ZSAqIDIpID4+CisJCQlsb2dfcGFnZV9iaXRzIDwgTWluTG9nUmVjb3JkUGFnZXMpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiJExvZ0ZpbGUgaXMgdG9vIHNtYWxsLiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCS8qCisJICogUmVhZCB0aHJvdWdoIHRoZSBmaWxlIGxvb2tpbmcgZm9yIGEgcmVzdGFydCBwYWdlLiAgU2luY2UgdGhlIHJlc3RhcnQKKwkgKiBwYWdlIGhlYWRlciBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgcGFnZSB3ZSBvbmx5IG5lZWQgdG8gc2VhcmNoIGF0CisJICogd2hhdCBjb3VsZCBiZSB0aGUgYmVnaW5uaW5nIG9mIGEgcGFnZSAoZm9yIGVhY2ggcGFnZSBzaXplKSByYXRoZXIKKwkgKiB0aGFuIHNjYW5uaW5nIHRoZSB3aG9sZSBmaWxlIGJ5dGUgYnkgYnl0ZS4gIElmIGFsbCBwb3RlbnRpYWwgcGxhY2VzCisJICogY29udGFpbiBlbXB0eSBhbmQgdW5pbml0aWFsemVkIHJlY29yZHMsIHRoZSBsb2cgZmlsZSBjYW4gYmUgYXNzdW1lZAorCSAqIHRvIGJlIGVtcHR5LgorCSAqLworCWZvciAocG9zID0gMDsgcG9zIDwgc2l6ZTsgcG9zIDw8PSAxKSB7CisJCXBnb2ZmX3QgaWR4ID0gcG9zID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJCWlmICghcGFnZSB8fCBwYWdlLT5pbmRleCAhPSBpZHgpIHsKKwkJCWlmIChwYWdlKQorCQkJCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwkJCXBhZ2UgPSBudGZzX21hcF9wYWdlKG1hcHBpbmcsIGlkeCk7CisJCQlpZiAoSVNfRVJSKHBhZ2UpKSB7CisJCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRXJyb3IgbWFwcGluZyAkTG9nRmlsZSAiCisJCQkJCQkicGFnZSAoaW5kZXggJWx1KS4iLCBpZHgpOworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJfQorCQlrYWRkciA9ICh1OCopcGFnZV9hZGRyZXNzKHBhZ2UpICsgKHBvcyAmIH5QQUdFX0NBQ0hFX01BU0spOworCQkvKgorCQkgKiBBIG5vbi1lbXB0eSBibG9jayBtZWFucyB0aGUgbG9nZmlsZSBpcyBub3QgZW1wdHkgd2hpbGUgYW4KKwkJICogZW1wdHkgYmxvY2sgYWZ0ZXIgYSBub24tZW1wdHkgYmxvY2sgaGFzIGJlZW4gZW5jb3VudGVyZWQKKwkJICogbWVhbnMgd2UgYXJlIGRvbmUuCisJCSAqLworCQlpZiAoIW50ZnNfaXNfZW1wdHlfcmVjb3JkcCgobGUzMiopa2FkZHIpKQorCQkJbG9nZmlsZV9pc19lbXB0eSA9IEZBTFNFOworCQllbHNlIGlmICghbG9nZmlsZV9pc19lbXB0eSkKKwkJCWJyZWFrOworCQkvKgorCQkgKiBBIGxvZyByZWNvcmQgcGFnZSBtZWFucyB0aGVyZSBjYW5ub3QgYmUgYSByZXN0YXJ0IHBhZ2UgYWZ0ZXIKKwkJICogdGhpcyBzbyBubyBuZWVkIHRvIGNvbnRpbnVlIHNlYXJjaGluZy4KKwkJICovCisJCWlmIChudGZzX2lzX3JjcmRfcmVjb3JkcCgobGUzMiopa2FkZHIpKQorCQkJYnJlYWs7CisJCS8qCisJCSAqIEEgbW9kaWZpZWQgYnkgY2hrZHNrIHJlc3RhcnQgcGFnZSBtZWFucyB3ZSBjYW5ub3QgaGFuZGxlCisJCSAqIHRoaXMgbG9nIGZpbGUuCisJCSAqLworCQlpZiAobnRmc19pc19jaGtkX3JlY29yZHAoKGxlMzIqKWthZGRyKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiJExvZ0ZpbGUgaGFzIGJlZW4gbW9kaWZpZWQgYnkgIgorCQkJCQkiY2hrZHNrLiAgTW91bnQgdGhpcyB2b2x1bWUgaW4gIgorCQkJCQkiV2luZG93cy4iKTsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCQkvKiBJZiBub3QgYSByZXN0YXJ0IHBhZ2UsIGNvbnRpbnVlLiAqLworCQlpZiAoIW50ZnNfaXNfcnN0cl9yZWNvcmRwKChsZTMyKilrYWRkcikpIHsKKwkJCS8qIFNraXAgdG8gdGhlIG1pbmltdW0gcGFnZSBzaXplIGZvciB0aGUgbmV4dCBvbmUuICovCisJCQlpZiAoIXBvcykKKwkJCQlwb3MgPSBOVEZTX0JMT0NLX1NJWkUgPj4gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIFdlIG5vdyBrbm93IHdlIGhhdmUgYSByZXN0YXJ0IHBhZ2UuICovCisJCWlmICghcG9zKSB7CisJCQlyc3RyMV9mb3VuZCA9IFRSVUU7CisJCQlyc3RyMV9wb3MgPSBwb3M7CisJCX0gZWxzZSB7CisJCQlpZiAocnN0cjJfZm91bmQpIHsKKwkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGb3VuZCBtb3JlIHRoYW4gdHdvICIKKwkJCQkJCSJyZXN0YXJ0IHBhZ2VzIGluICRMb2dGaWxlLiIpOworCQkJCWdvdG8gZXJyX291dDsKKwkJCX0KKwkJCXJzdHIyX2ZvdW5kID0gVFJVRTsKKwkJCXJzdHIyX3BvcyA9IHBvczsKKwkJfQorCQkvKgorCQkgKiBDaGVjayB0aGUgcmVzdGFydCBwYWdlIGZvciBjb25zaXN0ZW5jeSBhbmQgZ2V0IGEgY29weSBvZiB0aGUKKwkJICogY29tcGxldGUgbXVsdGkgc2VjdG9yIHRyYW5zZmVyIGRlcHJvdGVjdGVkIHJlc3RhcnQgcGFnZS4KKwkJICovCisJCWlmICghbnRmc19jaGVja19hbmRfbG9hZF9yZXN0YXJ0X3BhZ2UobG9nX3ZpLAorCQkJCShSRVNUQVJUX1BBR0VfSEVBREVSKilrYWRkciwgcG9zLAorCQkJCSFwb3MgPyAmcnN0cjFfcGggOiAmcnN0cjJfcGgpKSB7CisJCQkvKiBFcnJvciBvdXRwdXQgYWxyZWFkeSBkb25lIGluc2lkZSB0aGUgZnVuY3Rpb24uICovCisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwkJLyoKKwkJICogV2UgaGF2ZSBhIHZhbGlkIHJlc3RhcnQgcGFnZS4gIFRoZSBuZXh0IG9uZSBtdXN0IGJlIGFmdGVyCisJCSAqIGEgd2hvbGUgc3lzdGVtIHBhZ2Ugc2l6ZSBhcyBzcGVjaWZpZWQgYnkgdGhlIHZhbGlkIHJlc3RhcnQKKwkJICogcGFnZS4KKwkJICovCisJCWlmICghcG9zKQorCQkJcG9zID0gbGUzMl90b19jcHUocnN0cjFfcGgtPnN5c3RlbV9wYWdlX3NpemUpID4+IDE7CisJfQorCWlmIChwYWdlKSB7CisJCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwkJcGFnZSA9IE5VTEw7CisJfQorCWlmIChsb2dmaWxlX2lzX2VtcHR5KSB7CisJCU5Wb2xTZXRMb2dGaWxlRW1wdHkodm9sKTsKK2lzX2VtcHR5OgorCQludGZzX2RlYnVnKCJEb25lLiAgKCRMb2dGaWxlIGlzIGVtcHR5LikiKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCWlmICghcnN0cjFfZm91bmQgfHwgIXJzdHIyX2ZvdW5kKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkRpZCBub3QgZmluZCB0d28gcmVzdGFydCBwYWdlcyBpbiAiCisJCQkJIiRMb2dGaWxlLiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCS8qCisJICogVGhlIHR3byByZXN0YXJ0IGFyZWFzIG11c3QgYmUgaWRlbnRpY2FsIGV4Y2VwdCBmb3IgdGhlIHVwZGF0ZQorCSAqIHNlcXVlbmNlIG51bWJlci4KKwkgKi8KKwlvZnMgPSBsZTE2X3RvX2NwdShyc3RyMV9waC0+dXNhX29mcyk7CisJaWYgKG1lbWNtcChyc3RyMV9waCwgcnN0cjJfcGgsIG9mcykgfHwgKG9mcyArPSBzaXplb2YodTE2KSwKKwkJCW1lbWNtcCgodTgqKXJzdHIxX3BoICsgb2ZzLCAodTgqKXJzdHIyX3BoICsgb2ZzLAorCQkJbGUzMl90b19jcHUocnN0cjFfcGgtPnN5c3RlbV9wYWdlX3NpemUpIC0gb2ZzKSkpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiVGhlIHR3byByZXN0YXJ0IHBhZ2VzIGluICRMb2dGaWxlIGRvIG5vdCAiCisJCQkJIm1hdGNoLiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCW50ZnNfZnJlZShyc3RyMV9waCk7CisJbnRmc19mcmVlKHJzdHIyX3BoKTsKKwkvKiBBbGwgY29uc2lzdGVuY3kgY2hlY2tzIHBhc3NlZC4gKi8KKwludGZzX2RlYnVnKCJEb25lLiIpOworCXJldHVybiBUUlVFOworZXJyX291dDoKKwlpZiAocGFnZSkKKwkJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCWlmIChyc3RyMV9waCkKKwkJbnRmc19mcmVlKHJzdHIxX3BoKTsKKwlpZiAocnN0cjJfcGgpCisJCW50ZnNfZnJlZShyc3RyMl9waCk7CisJcmV0dXJuIEZBTFNFOworfQorCisvKioKKyAqIG50ZnNfaXNfbG9nZmlsZV9jbGVhbiAtIGNoZWNrIGluIHRoZSBqb3VybmFsIGlmIHRoZSB2b2x1bWUgaXMgY2xlYW4KKyAqIEBsb2dfdmk6CXN0cnVjdCBpbm9kZSBvZiBsb2FkZWQgam91cm5hbCAkTG9nRmlsZSB0byBjaGVjaworICoKKyAqIEFuYWx5emUgdGhlICRMb2dGaWxlIGpvdXJuYWwgYW5kIHJldHVybiBUUlVFIGlmIGl0IGluZGljYXRlcyB0aGUgdm9sdW1lIHdhcworICogc2h1dGRvd24gY2xlYW5seSBhbmQgRkFMU0UgaWYgbm90LgorICoKKyAqIEF0IHByZXNlbnQgd2Ugb25seSBsb29rIGF0IHRoZSB0d28gcmVzdGFydCBwYWdlcyBhbmQgaWdub3JlIHRoZSBsb2cgcmVjb3JkCisgKiBwYWdlcy4gIFRoaXMgaXMgYSBsaXR0bGUgYml0IGNydWRlIGluIHRoYXQgdGhlcmUgd2lsbCBiZSBhIHZlcnkgc21hbGwgbnVtYmVyCisgKiBvZiBjYXNlcyB3aGVyZSB3ZSB0aGluayB0aGF0IGEgdm9sdW1lIGlzIGRpcnR5IHdoZW4gaW4gZmFjdCBpdCBpcyBjbGVhbi4KKyAqIFRoaXMgc2hvdWxkIG9ubHkgYWZmZWN0IHZvbHVtZXMgdGhhdCBoYXZlIG5vdCBiZWVuIHNodXRkb3duIGNsZWFubHkgYnV0IGRpZAorICogbm90IGhhdmUgYW55IHBlbmRpbmcsIG5vbi1jaGVjay1wb2ludGVkIGkvbywgaS5lLiB0aGV5IHdlcmUgY29tcGxldGVseSBpZGxlCisgKiBhdCBsZWFzdCBmb3IgdGhlIGZpdmUgc2Vjb25kcyBwcmVjZWVkaW5nIHRoZSB1bmNsZWFuIHNodXRkb3duLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IHRoZSAkTG9nRmlsZSBqb3VybmFsIGhhcyBhbHJlYWR5IGJlZW4gY29uc2lzdGVuY3kKKyAqIGNoZWNrZWQgYnkgYSBjYWxsIHRvIG50ZnNfY2hlY2tfbG9nZmlsZSgpIGFuZCBpbiBwYXJ0aWN1bGFyIGlmIHRoZSAkTG9nRmlsZQorICogaXMgZW1wdHkgdGhpcyBmdW5jdGlvbiByZXF1aXJlcyB0aGF0IE5Wb2xMb2dGaWxlRW1wdHkoKSBpcyB0cnVlIG90aGVyd2lzZSBhbgorICogZW1wdHkgdm9sdW1lIHdpbGwgYmUgcmVwb3J0ZWQgYXMgZGlydHkuCisgKi8KK0JPT0wgbnRmc19pc19sb2dmaWxlX2NsZWFuKHN0cnVjdCBpbm9kZSAqbG9nX3ZpKQoreworCW50ZnNfdm9sdW1lICp2b2wgPSBOVEZTX1NCKGxvZ192aS0+aV9zYik7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJUkVTVEFSVF9QQUdFX0hFQURFUiAqcnA7CisJUkVTVEFSVF9BUkVBICpyYTsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworCS8qIEFuIGVtcHR5ICRMb2dGaWxlIG11c3QgaGF2ZSBiZWVuIGNsZWFuIGJlZm9yZSBpdCBnb3QgZW1wdGllZC4gKi8KKwlpZiAoTlZvbExvZ0ZpbGVFbXB0eSh2b2wpKSB7CisJCW50ZnNfZGVidWcoIkRvbmUuICAoJExvZ0ZpbGUgaXMgZW1wdHkuKSIpOworCQlyZXR1cm4gVFJVRTsKKwl9CisJLyoKKwkgKiBSZWFkIHRoZSBmaXJzdCByZXN0YXJ0IHBhZ2UuICBJdCB3aWxsIGJlIHBvc3NpYmx5IGluY29tcGxldGUgYW5kCisJICogd2lsbCBub3QgYmUgbXVsdGkgc2VjdG9yIHRyYW5zZmVyIGRlcHJvdGVjdGVkIGJ1dCB3ZSBvbmx5IG5lZWQgdGhlCisJICogZmlyc3QgTlRGU19CTE9DS19TSVpFIGJ5dGVzIHNvIGl0IGRvZXMgbm90IG1hdHRlci4KKwkgKi8KKwlwYWdlID0gbnRmc19tYXBfcGFnZShsb2dfdmktPmlfbWFwcGluZywgMCk7CisJaWYgKElTX0VSUihwYWdlKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJFcnJvciBtYXBwaW5nICRMb2dGaWxlIHBhZ2UgKGluZGV4IDApLiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCXJwID0gKFJFU1RBUlRfUEFHRV9IRUFERVIqKXBhZ2VfYWRkcmVzcyhwYWdlKTsKKwlpZiAoIW50ZnNfaXNfcnN0cl9yZWNvcmQocnAtPm1hZ2ljKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJObyByZXN0YXJ0IHBhZ2UgZm91bmQgYXQgb2Zmc2V0IHplcm8gaW4gIgorCQkJCSIkTG9nRmlsZS4gIFRoaXMgaXMgcHJvYmFibHkgYSBidWcgaW4gdGhhdCAiCisJCQkJInRoZSAkTG9nRmlsZSBzaG91bGQgaGF2ZSBiZWVuIGNvbnNpc3RlbmN5ICIKKwkJCQkiY2hlY2tlZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCXJhID0gKFJFU1RBUlRfQVJFQSopKCh1OCopcnAgKyBsZTE2X3RvX2NwdShycC0+cmVzdGFydF9hcmVhX29mZnNldCkpOworCS8qCisJICogSWYgdGhlICRMb2dGaWxlIGhhcyBhY3RpdmUgY2xpZW50cywgaS5lLiBpdCBpcyBvcGVuLCBhbmQgd2UgZG8gbm90CisJICogaGF2ZSB0aGUgUkVTVEFSVF9WT0xVTUVfSVNfQ0xFQU4gYml0IHNldCBpbiB0aGUgcmVzdGFydCBhcmVhIGZsYWdzLAorCSAqIHdlIGFzc3VtZSB0aGVyZSB3YXMgYW4gdW5jbGVhbiBzaHV0ZG93bi4KKwkgKi8KKwlpZiAocmEtPmNsaWVudF9pbl91c2VfbGlzdCAhPSBMT0dGSUxFX05PX0NMSUVOVCAmJgorCQkJIShyYS0+ZmxhZ3MgJiBSRVNUQVJUX1ZPTFVNRV9JU19DTEVBTikpIHsKKwkJbnRmc19kZWJ1ZygiRG9uZS4gICRMb2dGaWxlIGluZGljYXRlcyBhIGRpcnR5IHNodXRkb3duLiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwkvKiAkTG9nRmlsZSBpbmRpY2F0ZXMgYSBjbGVhbiBzaHV0ZG93bi4gKi8KKwludGZzX2RlYnVnKCJEb25lLiAgJExvZ0ZpbGUgaW5kaWNhdGVzIGEgY2xlYW4gc2h1dGRvd24uIik7CisJcmV0dXJuIFRSVUU7CitlcnJfb3V0OgorCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwlyZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogbnRmc19lbXB0eV9sb2dmaWxlIC0gZW1wdHkgdGhlIGNvbnRlbnRzIG9mIHRoZSAkTG9nRmlsZSBqb3VybmFsCisgKiBAbG9nX3ZpOglzdHJ1Y3QgaW5vZGUgb2YgbG9hZGVkIGpvdXJuYWwgJExvZ0ZpbGUgdG8gZW1wdHkKKyAqCisgKiBFbXB0eSB0aGUgY29udGVudHMgb2YgdGhlICRMb2dGaWxlIGpvdXJuYWwgQGxvZ192aSBhbmQgcmV0dXJuIFRSVUUgb24KKyAqIHN1Y2Nlc3MgYW5kIEZBTFNFIG9uIGVycm9yLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IHRoZSAkTG9nRmlsZSBqb3VybmFsIGhhcyBhbHJlYWR5IGJlZW4gY29uc2lzdGVuY3kKKyAqIGNoZWNrZWQgYnkgYSBjYWxsIHRvIG50ZnNfY2hlY2tfbG9nZmlsZSgpIGFuZCB0aGF0IG50ZnNfaXNfbG9nZmlsZV9jbGVhbigpCisgKiBoYXMgYmVlbiB1c2VkIHRvIGVuc3VyZSB0aGF0IHRoZSAkTG9nRmlsZSBpcyBjbGVhbi4KKyAqLworQk9PTCBudGZzX2VtcHR5X2xvZ2ZpbGUoc3RydWN0IGlub2RlICpsb2dfdmkpCit7CisJbnRmc192b2x1bWUgKnZvbCA9IE5URlNfU0IobG9nX3ZpLT5pX3NiKTsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworCWlmICghTlZvbExvZ0ZpbGVFbXB0eSh2b2wpKSB7CisJCWludCBlcnI7CisJCQorCQllcnIgPSBudGZzX2F0dHJfc2V0KE5URlNfSShsb2dfdmkpLCAwLCBsb2dfdmktPmlfc2l6ZSwgMHhmZik7CisJCWlmICh1bmxpa2VseShlcnIpKSB7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZmlsbCAkTG9nRmlsZSB3aXRoICIKKwkJCQkJIjB4ZmYgYnl0ZXMgKGVycm9yIGNvZGUgJWkpLiIsIGVycik7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwkJLyogU2V0IHRoZSBmbGFnIHNvIHdlIGRvIG5vdCBoYXZlIHRvIGRvIGl0IGFnYWluIG9uIHJlbW91bnQuICovCisJCU5Wb2xTZXRMb2dGaWxlRW1wdHkodm9sKTsKKwl9CisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gVFJVRTsKK30KKworI2VuZGlmIC8qIE5URlNfUlcgKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvbG9nZmlsZS5oIGIvZnMvbnRmcy9sb2dmaWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVlNDM3OAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvbG9nZmlsZS5oCkBAIC0wLDAgKzEsMzA3IEBACisvKgorICogbG9nZmlsZS5oIC0gRGVmaW5lcyBmb3IgTlRGUyBrZXJuZWwgam91cm5hbCAoJExvZ0ZpbGUpIGhhbmRsaW5nLiAgUGFydCBvZgorICoJICAgICAgIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfTElOVVhfTlRGU19MT0dGSUxFX0gKKyNkZWZpbmUgX0xJTlVYX05URlNfTE9HRklMRV9ICisKKyNpZmRlZiBOVEZTX1JXCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorCisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJlbmRpYW4uaCIKKyNpbmNsdWRlICJsYXlvdXQuaCIKKworLyoKKyAqIEpvdXJuYWwgKCRMb2dGaWxlKSBvcmdhbml6YXRpb246CisgKgorICogVHdvIHJlc3RhcnQgYXJlYXMgcHJlc2VudCBpbiB0aGUgZmlyc3QgdHdvIHBhZ2VzIChyZXN0YXJ0IHBhZ2VzLCBvbmUgcmVzdGFydAorICogYXJlYSBpbiBlYWNoIHBhZ2UpLiAgV2hlbiB0aGUgdm9sdW1lIGlzIGRpc21vdW50ZWQgdGhleSBzaG91bGQgYmUgaWRlbnRpY2FsLAorICogZXhjZXB0IGZvciB0aGUgdXBkYXRlIHNlcXVlbmNlIGFycmF5IHdoaWNoIHVzdWFsbHkgaGFzIGEgZGlmZmVyZW50IHVwZGF0ZQorICogc2VxdWVuY2UgbnVtYmVyLgorICoKKyAqIFRoZXNlIGFyZSBmb2xsb3dlZCBieSBsb2cgcmVjb3JkcyBvcmdhbml6ZWQgaW4gcGFnZXMgaGVhZGVkIGJ5IGEgbG9nIHJlY29yZAorICogaGVhZGVyIGdvaW5nIHVwIHRvIGxvZyBmaWxlIHNpemUuICBOb3QgYWxsIHBhZ2VzIGNvbnRhaW4gbG9nIHJlY29yZHMgd2hlbiBhCisgKiB2b2x1bWUgaXMgZmlyc3QgZm9ybWF0dGVkLCBidXQgYXMgdGhlIHZvbHVtZSBhZ2VzLCBhbGwgcmVjb3JkcyB3aWxsIGJlIHVzZWQuCisgKiBXaGVuIHRoZSBsb2cgZmlsZSBmaWxscyB1cCwgdGhlIHJlY29yZHMgYXQgdGhlIGJlZ2lubmluZyBhcmUgcHVyZ2VkIChieQorICogbW9kaWZ5aW5nIHRoZSBvbGRlc3RfbHNuIHRvIGEgaGlnaGVyIHZhbHVlIHByZXN1bWFibHkpIGFuZCB3cml0aW5nIGJlZ2lucworICogYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4gIEVmZmVjdGl2ZWx5LCB0aGUgbG9nIGZpbGUgaXMgdmlld2VkIGFzIGEKKyAqIGNpcmN1bGFyIGVudGl0eS4KKyAqCisgKiBOT1RFOiBXaW5kb3dzIE5ULCAyMDAwLCBhbmQgWFAgYWxsIHVzZSBsb2cgZmlsZSB2ZXJzaW9uIDEuMSBidXQgdGhleSBhY2NlcHQKKyAqIHZlcnNpb25zIDw9IDEueCwgaW5jbHVkaW5nIDAuLTEuICAoWWVzLCB0aGF0IGlzIGEgbWludXMgb25lIGluIHRoZXJlISkgIFdlCisgKiBwcm9iYWJseSBvbmx5IHdhbnQgdG8gc3VwcG9ydCAxLjEgYXMgdGhpcyBzZWVtcyB0byBiZSB0aGUgY3VycmVudCB2ZXJzaW9uCisgKiBhbmQgd2UgZG9uJ3Qga25vdyBob3cgdGhhdCBkaWZmZXJzIGZyb20gdGhlIG9sZGVyIHZlcnNpb25zLiAgVGhlIG9ubHkKKyAqIGV4Y2VwdGlvbiBpcyBpZiB0aGUgam91cm5hbCBpcyBjbGVhbiBhcyBtYXJrZWQgYnkgdGhlIHR3byByZXN0YXJ0IHBhZ2VzCisgKiB0aGVuIGl0IGRvZXNuJ3QgbWF0dGVyIHdoZXRoZXIgd2UgYXJlIG9uIGFuIGVhcmxpZXIgdmVyc2lvbi4gIFdlIGNhbiBqdXN0CisgKiByZWluaXRpYWxpemUgdGhlIGxvZ2ZpbGUgYW5kIHN0YXJ0IGFnYWluIHdpdGggdmVyc2lvbiAxLjEuCisgKi8KKworLyogU29tZSAkTG9nRmlsZSByZWxhdGVkIGNvbnN0YW50cy4gKi8KKyNkZWZpbmUgTWF4TG9nRmlsZVNpemUJCTB4MTAwMDAwMDAwVUxMCisjZGVmaW5lIERlZmF1bHRMb2dQYWdlU2l6ZQk0MDk2CisjZGVmaW5lIE1pbkxvZ1JlY29yZFBhZ2VzCTQ4CisKKy8qCisgKiBMb2cgZmlsZSByZXN0YXJ0IHBhZ2UgaGVhZGVyIChiZWdpbnMgdGhlIHJlc3RhcnQgYXJlYSkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKy8qT2ZzKi8KKy8qICAwCU5URlNfUkVDT1JEOyAtLSBVbmZvbGRlZCBoZXJlIGFzIGdjYyBkb2Vzbid0IGxpa2UgdW5uYW1lZCBzdHJ1Y3RzLiAqLworLyogIDAqLwlOVEZTX1JFQ09SRF9UWVBFIG1hZ2ljOwkvKiBUaGUgbWFnaWMgaXMgIlJTVFIiLiAqLworLyogIDQqLwlsZTE2IHVzYV9vZnM7CQkvKiBTZWUgTlRGU19SRUNPUkQgZGVmaW5pdGlvbiBpbiBsYXlvdXQuaC4KKwkJCQkgICBXaGVuIGNyZWF0aW5nLCBzZXQgdGhpcyB0byBiZSBpbW1lZGlhdGVseQorCQkJCSAgIGFmdGVyIHRoaXMgaGVhZGVyIHN0cnVjdHVyZSAod2l0aG91dCBhbnkKKwkJCQkgICBhbGlnbm1lbnQpLiAqLworLyogIDYqLwlsZTE2IHVzYV9jb3VudDsJCS8qIFNlZSBOVEZTX1JFQ09SRCBkZWZpbml0aW9uIGluIGxheW91dC5oLiAqLworCisvKiAgOCovCWxlTFNOIGNoa2Rza19sc247CS8qIFRoZSBsYXN0IGxvZyBmaWxlIHNlcXVlbmNlIG51bWJlciBmb3VuZCBieQorCQkJCSAgIGNoa2Rzay4gIE9ubHkgdXNlZCB3aGVuIHRoZSBtYWdpYyBpcyBjaGFuZ2VkCisJCQkJICAgdG8gIkNIS0QiLiAgT3RoZXJ3aXNlIHRoaXMgaXMgemVyby4gKi8KKy8qIDE2Ki8JbGUzMiBzeXN0ZW1fcGFnZV9zaXplOwkvKiBCeXRlIHNpemUgb2Ygc3lzdGVtIHBhZ2VzIHdoZW4gdGhlIGxvZyBmaWxlCisJCQkJICAgd2FzIGNyZWF0ZWQsIGhhcyB0byBiZSA+PSA1MTIgYW5kIGEgcG93ZXIgb2YKKwkJCQkgICAyLiAgVXNlIHRoaXMgdG8gY2FsY3VsYXRlIHRoZSByZXF1aXJlZCBzaXplCisJCQkJICAgb2YgdGhlIHVzYSAodXNhX2NvdW50KSBhbmQgYWRkIGl0IHRvIHVzYV9vZnMuCisJCQkJICAgVGhlbiB2ZXJpZnkgdGhhdCB0aGUgcmVzdWx0IGlzIGxlc3MgdGhhbiB0aGUKKwkJCQkgICB2YWx1ZSBvZiB0aGUgcmVzdGFydF9hcmVhX29mZnNldC4gKi8KKy8qIDIwKi8JbGUzMiBsb2dfcGFnZV9zaXplOwkvKiBCeXRlIHNpemUgb2YgbG9nIGZpbGUgcGFnZXMsIGhhcyB0byBiZSA+PQorCQkJCSAgIDUxMiBhbmQgYSBwb3dlciBvZiAyLiAgVGhlIGRlZmF1bHQgaXMgNDA5NgorCQkJCSAgIGFuZCBpcyB1c2VkIHdoZW4gdGhlIHN5c3RlbSBwYWdlIHNpemUgaXMKKwkJCQkgICBiZXR3ZWVuIDQwOTYgYW5kIDgxOTIuICBPdGhlcndpc2UgdGhpcyBpcworCQkJCSAgIHNldCB0byB0aGUgc3lzdGVtIHBhZ2Ugc2l6ZSBpbnN0ZWFkLiAqLworLyogMjQqLwlsZTE2IHJlc3RhcnRfYXJlYV9vZmZzZXQ7LyogQnl0ZSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhpcyBoZWFkZXIgdG8KKwkJCQkgICB0aGUgUkVTVEFSVF9BUkVBLiAgVmFsdWUgaGFzIHRvIGJlIGFsaWduZWQKKwkJCQkgICB0byA4LWJ5dGUgYm91bmRhcnkuICBXaGVuIGNyZWF0aW5nLCBzZXQgdGhpcworCQkJCSAgIHRvIGJlIGFmdGVyIHRoZSB1c2EuICovCisvKiAyNiovCXNsZTE2IG1pbm9yX3ZlcjsJLyogTG9nIGZpbGUgbWlub3IgdmVyc2lvbi4gIE9ubHkgY2hlY2sgaWYgbWFqb3IKKwkJCQkgICB2ZXJzaW9uIGlzIDEuICovCisvKiAyOCovCXNsZTE2IG1ham9yX3ZlcjsJLyogTG9nIGZpbGUgbWFqb3IgdmVyc2lvbi4gIFdlIG9ubHkgc3VwcG9ydAorCQkJCSAgIHZlcnNpb24gMS4xLiAqLworLyogc2l6ZW9mKCkgPSAzMCAoMHgxZSkgYnl0ZXMgKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKSBSRVNUQVJUX1BBR0VfSEVBREVSOworCisvKgorICogQ29uc3RhbnQgZm9yIHRoZSBsb2cgY2xpZW50IGluZGljZXMgbWVhbmluZyB0aGF0IHRoZXJlIGFyZSBubyBjbGllbnQgcmVjb3JkcworICogaW4gdGhpcyBwYXJ0aWN1bGFyIGNsaWVudCBhcnJheS4gIEFsc28gaW5zaWRlIHRoZSBjbGllbnQgcmVjb3JkcyB0aGVtc2VsdmVzLAorICogdGhpcyBtZWFucyB0aGF0IHRoZXJlIGFyZSBubyBjbGllbnQgcmVjb3JkcyBwcmVjZWRpbmcgb3IgZm9sbG93aW5nIHRoaXMgb25lLgorICovCisjZGVmaW5lIExPR0ZJTEVfTk9fQ0xJRU5UCWNvbnN0X2NwdV90b19sZTE2KDB4ZmZmZikKKyNkZWZpbmUgTE9HRklMRV9OT19DTElFTlRfQ1BVCTB4ZmZmZgorCisvKgorICogVGhlc2UgYXJlIHRoZSBzbyBmYXIga25vd24gUkVTVEFSVF9BUkVBXyogZmxhZ3MgKDE2LWJpdCkgd2hpY2ggY29udGFpbgorICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxvZyBmaWxlIGluIHdoaWNoIHRoZXkgYXJlIHByZXNlbnQuCisgKi8KK2VudW0geworCVJFU1RBUlRfVk9MVU1FX0lTX0NMRUFOCT0gY29uc3RfY3B1X3RvX2xlMTYoMHgwMDAyKSwKKwlSRVNUQVJUX1NQQUNFX0ZJTExFUgk9IDB4ZmZmZiwgLyogZ2NjOiBGb3JjZSBlbnVtIGJpdCB3aWR0aCB0byAxNi4gKi8KK30gX19hdHRyaWJ1dGVfXyAoKF9fcGFja2VkX18pKTsKKwordHlwZWRlZiBsZTE2IFJFU1RBUlRfQVJFQV9GTEFHUzsKKworLyoKKyAqIExvZyBmaWxlIHJlc3RhcnQgYXJlYSByZWNvcmQuICBUaGUgb2Zmc2V0IG9mIHRoaXMgcmVjb3JkIGlzIGZvdW5kIGJ5IGFkZGluZworICogdGhlIG9mZnNldCBvZiB0aGUgUkVTVEFSVF9QQUdFX0hFQURFUiB0byB0aGUgcmVzdGFydF9hcmVhX29mZnNldCB2YWx1ZSBmb3VuZAorICogaW4gaXQuICBTZWUgbm90ZXMgYXQgcmVzdGFydF9hcmVhX29mZnNldCBhYm92ZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworLypPZnMqLworLyogIDAqLwlsZUxTTiBjdXJyZW50X2xzbjsJLyogVGhlIGN1cnJlbnQsIGkuZS4gbGFzdCBMU04gaW5zaWRlIHRoZSBsb2cKKwkJCQkgICB3aGVuIHRoZSByZXN0YXJ0IGFyZWEgd2FzIGxhc3Qgd3JpdHRlbi4KKwkJCQkgICBUaGlzIGhhcHBlbnMgb2Z0ZW4gYnV0IHdoYXQgaXMgdGhlIGludGVydmFsPworCQkJCSAgIElzIGl0IGp1c3QgZml4ZWQgdGltZSBvciBpcyBpdCBldmVyeSB0aW1lIGEKKwkJCQkgICBjaGVjayBwb2ludCBpcyB3cml0dGVuIG9yIHNvbWV0aGluZSBlbHNlPworCQkJCSAgIE9uIGNyZWF0ZSBzZXQgdG8gMC4gKi8KKy8qICA4Ki8JbGUxNiBsb2dfY2xpZW50czsJLyogTnVtYmVyIG9mIGxvZyBjbGllbnQgcmVjb3JkcyBpbiB0aGUgYXJyYXkgb2YKKwkJCQkgICBsb2cgY2xpZW50IHJlY29yZHMgd2hpY2ggZm9sbG93cyB0aGlzCisJCQkJICAgcmVzdGFydCBhcmVhLiAgTXVzdCBiZSAxLiAgKi8KKy8qIDEwKi8JbGUxNiBjbGllbnRfZnJlZV9saXN0OwkvKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGZyZWUgbG9nIGNsaWVudCByZWNvcmQKKwkJCQkgICBpbiB0aGUgYXJyYXkgb2YgbG9nIGNsaWVudCByZWNvcmRzLgorCQkJCSAgIExPR0ZJTEVfTk9fQ0xJRU5UIG1lYW5zIHRoYXQgdGhlcmUgYXJlIG5vCisJCQkJICAgZnJlZSBsb2cgY2xpZW50IHJlY29yZHMgaW4gdGhlIGFycmF5LgorCQkJCSAgIElmICE9IExPR0ZJTEVfTk9fQ0xJRU5ULCBjaGVjayB0aGF0CisJCQkJICAgbG9nX2NsaWVudHMgPiBjbGllbnRfZnJlZV9saXN0LiAgT24gV2luMmsKKwkJCQkgICBhbmQgcHJlc3VtYWJseSBlYXJsaWVyLCBvbiBhIGNsZWFuIHZvbHVtZQorCQkJCSAgIHRoaXMgaXMgIT0gTE9HRklMRV9OT19DTElFTlQsIGFuZCBpdCBzaG91bGQKKwkJCQkgICBiZSAwLCBpLmUuIHRoZSBmaXJzdCAoYW5kIG9ubHkpIGNsaWVudAorCQkJCSAgIHJlY29yZCBpcyBmcmVlIGFuZCB0aHVzIHRoZSBsb2dmaWxlIGlzCisJCQkJICAgY2xvc2VkIGFuZCBoZW5jZSBjbGVhbi4gIEEgZGlydHkgdm9sdW1lCisJCQkJICAgd291bGQgaGF2ZSBsZWZ0IHRoZSBsb2dmaWxlIG9wZW4gYW5kIGhlbmNlCisJCQkJICAgdGhpcyB3b3VsZCBiZSBMT0dGSUxFX05PX0NMSUVOVC4gIE9uIFdpblhQCisJCQkJICAgYW5kIHByZXN1bWFibHkgbGF0ZXIsIHRoZSBsb2dmaWxlIGlzIGFsd2F5cworCQkJCSAgIG9wZW4sIGV2ZW4gb24gY2xlYW4gc2h1dGRvd24gc28gdGhpcyBzaG91bGQKKwkJCQkgICBhbHdheXMgYmUgTE9HRklMRV9OT19DTElFTlQuICovCisvKiAxMiovCWxlMTYgY2xpZW50X2luX3VzZV9saXN0Oy8qIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgaW4tdXNlIGxvZyBjbGllbnQKKwkJCQkgICByZWNvcmQgaW4gdGhlIGFycmF5IG9mIGxvZyBjbGllbnQgcmVjb3Jkcy4KKwkJCQkgICBMT0dGSUxFX05PX0NMSUVOVCBtZWFucyB0aGF0IHRoZXJlIGFyZSBubworCQkJCSAgIGluLXVzZSBsb2cgY2xpZW50IHJlY29yZHMgaW4gdGhlIGFycmF5LiAgSWYKKwkJCQkgICAhPSBMT0dGSUxFX05PX0NMSUVOVCBjaGVjayB0aGF0IGxvZ19jbGllbnRzCisJCQkJICAgPiBjbGllbnRfaW5fdXNlX2xpc3QuICBPbiBXaW4yayBhbmQKKwkJCQkgICBwcmVzdW1hYmx5IGVhcmxpZXIsIG9uIGEgY2xlYW4gdm9sdW1lIHRoaXMKKwkJCQkgICBpcyBMT0dGSUxFX05PX0NMSUVOVCwgaS5lLiB0aGVyZSBhcmUgbm8KKwkJCQkgICBjbGllbnQgcmVjb3JkcyBpbiB1c2UgYW5kIHRodXMgdGhlIGxvZ2ZpbGUKKwkJCQkgICBpcyBjbG9zZWQgYW5kIGhlbmNlIGNsZWFuLiAgQSBkaXJ0eSB2b2x1bWUKKwkJCQkgICB3b3VsZCBoYXZlIGxlZnQgdGhlIGxvZ2ZpbGUgb3BlbiBhbmQgaGVuY2UKKwkJCQkgICB0aGlzIHdvdWxkIGJlICE9IExPR0ZJTEVfTk9fQ0xJRU5ULCBhbmQgaXQKKwkJCQkgICBzaG91bGQgYmUgMCwgaS5lLiB0aGUgZmlyc3QgKGFuZCBvbmx5KQorCQkJCSAgIGNsaWVudCByZWNvcmQgaXMgaW4gdXNlLiAgT24gV2luWFAgYW5kCisJCQkJICAgcHJlc3VtYWJseSBsYXRlciwgdGhlIGxvZ2ZpbGUgaXMgYWx3YXlzCisJCQkJICAgb3BlbiwgZXZlbiBvbiBjbGVhbiBzaHV0ZG93biBzbyB0aGlzIHNob3VsZAorCQkJCSAgIGFsd2F5cyBiZSAwLiAqLworLyogMTQqLwlSRVNUQVJUX0FSRUFfRkxBR1MgZmxhZ3M7LyogRmxhZ3MgbW9kaWZ5aW5nIExGUyBiZWhhdmlvdXIuICBPbiBXaW4yaworCQkJCSAgIGFuZCBwcmVzdW1hYmx5IGVhcmxpZXIgdGhpcyBpcyBhbHdheXMgMC4gIE9uCisJCQkJICAgV2luWFAgYW5kIHByZXN1bWFibHkgbGF0ZXIsIGlmIHRoZSBsb2dmaWxlCisJCQkJICAgd2FzIHNodXRkb3duIGNsZWFubHksIHRoZSBzZWNvbmQgYml0LAorCQkJCSAgIFJFU1RBUlRfVk9MVU1FX0lTX0NMRUFOLCBpcyBzZXQuICBUaGlzIGJpdAorCQkJCSAgIGlzIGNsZWFyZWQgd2hlbiB0aGUgdm9sdW1lIGlzIG1vdW50ZWQgYnkKKwkJCQkgICBXaW5YUCBhbmQgc2V0IHdoZW4gdGhlIHZvbHVtZSBpcyBkaXNtb3VudGVkLAorCQkJCSAgIHRodXMgaWYgdGhlIGxvZ2ZpbGUgaXMgZGlydHksIHRoaXMgYml0IGlzCisJCQkJICAgY2xlYXIuICBUaHVzIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgdGhlCisJCQkJICAgV2luZG93cyB2ZXJzaW9uIHRvIGRldGVybWluZSBpZiB0aGUgbG9nZmlsZQorCQkJCSAgIGlzIGNsZWFuLiAgSW5zdGVhZCBpZiB0aGUgbG9nZmlsZSBpcyBjbG9zZWQsCisJCQkJICAgd2Uga25vdyBpdCBtdXN0IGJlIGNsZWFuLiAgSWYgaXQgaXMgb3BlbiBhbmQKKwkJCQkgICB0aGlzIGJpdCBpcyBzZXQsIHdlIGFsc28ga25vdyBpdCBtdXN0IGJlCisJCQkJICAgY2xlYW4uICBJZiBvbiB0aGUgb3RoZXIgaGFuZCB0aGUgbG9nZmlsZSBpcworCQkJCSAgIG9wZW4gYW5kIHRoaXMgYml0IGlzIGNsZWFyLCB3ZSBjYW4gYmUgYWxtb3N0CisJCQkJICAgY2VydGFpbiB0aGF0IHRoZSBsb2dmaWxlIGlzIGRpcnR5LiAqLworLyogMTYqLwlsZTMyIHNlcV9udW1iZXJfYml0czsJLyogSG93IG1hbnkgYml0cyB0byB1c2UgZm9yIHRoZSBzZXF1ZW5jZQorCQkJCSAgIG51bWJlci4gIFRoaXMgaXMgY2FsY3VsYXRlZCBhcyA2NyAtIHRoZQorCQkJCSAgIG51bWJlciBvZiBiaXRzIHJlcXVpcmVkIHRvIHN0b3JlIHRoZSBsb2dmaWxlCisJCQkJICAgc2l6ZSBpbiBieXRlcyBhbmQgdGhpcyBjYW4gYmUgdXNlZCBpbiB3aXRoCisJCQkJICAgdGhlIHNwZWNpZmllZCBmaWxlX3NpemUgYXMgYSBjb25zaXN0ZW5jeQorCQkJCSAgIGNoZWNrLiAqLworLyogMjAqLwlsZTE2IHJlc3RhcnRfYXJlYV9sZW5ndGg7LyogTGVuZ3RoIG9mIHRoZSByZXN0YXJ0IGFyZWEgaW5jbHVkaW5nIHRoZQorCQkJCSAgIGNsaWVudCBhcnJheS4gIEZvbGxvd2luZyBjaGVja3MgcmVxdWlyZWQgaWYKKwkJCQkgICB2ZXJzaW9uIG1hdGNoZXMuICBPdGhlcndpc2UsIHNraXAgdGhlbS4KKwkJCQkgICByZXN0YXJ0X2FyZWFfb2Zmc2V0ICsgcmVzdGFydF9hcmVhX2xlbmd0aAorCQkJCSAgIGhhcyB0byBiZSA8PSBzeXN0ZW1fcGFnZV9zaXplLiAgQWxzbywKKwkJCQkgICByZXN0YXJ0X2FyZWFfbGVuZ3RoIGhhcyB0byBiZSA+PQorCQkJCSAgIGNsaWVudF9hcnJheV9vZmZzZXQgKyAobG9nX2NsaWVudHMgKgorCQkJCSAgIHNpemVvZihsb2cgY2xpZW50IHJlY29yZCkpLiAqLworLyogMjIqLwlsZTE2IGNsaWVudF9hcnJheV9vZmZzZXQ7LyogT2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoaXMgcmVjb3JkIHRvCisJCQkJICAgdGhlIGZpcnN0IGxvZyBjbGllbnQgcmVjb3JkIGlmIHZlcnNpb25zIGFyZQorCQkJCSAgIG1hdGNoZWQuICBXaGVuIGNyZWF0aW5nLCBzZXQgdGhpcyB0byBiZQorCQkJCSAgIGFmdGVyIHRoaXMgcmVzdGFydCBhcmVhIHN0cnVjdHVyZSwgYWxpZ25lZAorCQkJCSAgIHRvIDgtYnl0ZXMgYm91bmRhcnkuICBJZiB0aGUgdmVyc2lvbnMgZG8gbm90CisJCQkJICAgbWF0Y2gsIHRoaXMgaXMgaWdub3JlZCBhbmQgdGhlIG9mZnNldCBpcworCQkJCSAgIGFzc3VtZWQgdG8gYmUgKHNpemVvZihSRVNUQVJUX0FSRUEpICsgNykgJgorCQkJCSAgIH43LCBpLmUuIHJvdW5kZWQgdXAgdG8gZmlyc3QgOC1ieXRlCisJCQkJICAgYm91bmRhcnkuICBFaXRoZXIgd2F5LCBjbGllbnRfYXJyYXlfb2Zmc2V0CisJCQkJICAgaGFzIHRvIGJlIGFsaWduZWQgdG8gYW4gOC1ieXRlIGJvdW5kYXJ5LgorCQkJCSAgIEFsc28sIHJlc3RhcnRfYXJlYV9vZmZzZXQgKworCQkJCSAgIGNsaWVudF9hcnJheV9vZmZzZXQgaGFzIHRvIGJlIDw9IDUxMC4KKwkJCQkgICBGaW5hbGx5LCBjbGllbnRfYXJyYXlfb2Zmc2V0ICsgKGxvZ19jbGllbnRzCisJCQkJICAgKiBzaXplb2YobG9nIGNsaWVudCByZWNvcmQpKSBoYXMgdG8gYmUgPD0KKwkJCQkgICBzeXN0ZW1fcGFnZV9zaXplLiAgT24gV2luMmsgYW5kIHByZXN1bWFibHkKKwkJCQkgICBlYXJsaWVyLCB0aGlzIGlzIDB4MzAsIGkuZS4gaW1tZWRpYXRlbHkKKwkJCQkgICBmb2xsb3dpbmcgdGhpcyByZWNvcmQuICBPbiBXaW5YUCBhbmQKKwkJCQkgICBwcmVzdW1hYmx5IGxhdGVyLCB0aGlzIGlzIDB4NDAsIGkuZS4gdGhlcmUKKwkJCQkgICBhcmUgMTYgZXh0cmEgYnl0ZXMgYmV0d2VlbiB0aGlzIHJlY29yZCBhbmQKKwkJCQkgICB0aGUgY2xpZW50IGFycmF5LiAgVGhpcyBwcm9iYWJseSBtZWFucyB0aGF0CisJCQkJICAgdGhlIFJFU1RBUlRfQVJFQSByZWNvcmQgaXMgYWN0dWFsbHkgYmlnZ2VyCisJCQkJICAgaW4gV2luWFAgYW5kIGxhdGVyLiAqLworLyogMjQqLwlzbGU2NCBmaWxlX3NpemU7CS8qIFVzYWJsZSBieXRlIHNpemUgb2YgdGhlIGxvZyBmaWxlLiAgSWYgdGhlCisJCQkJICAgcmVzdGFydF9hcmVhX29mZnNldCArIHRoZSBvZmZzZXQgb2YgdGhlCisJCQkJICAgZmlsZV9zaXplIGFyZSA+IDUxMCB0aGVuIGNvcnJ1cHRpb24gaGFzCisJCQkJICAgb2NjdXJlZC4gIFRoaXMgaXMgdGhlIHZlcnkgZmlyc3QgY2hlY2sgd2hlbgorCQkJCSAgIHN0YXJ0aW5nIHdpdGggdGhlIHJlc3RhcnRfYXJlYSBhcyBpZiBpdAorCQkJCSAgIGZhaWxzIGl0IG1lYW5zIHRoYXQgc29tZSBvZiB0aGUgYWJvdmUgdmFsdWVzCisJCQkJICAgd2lsbCBiZSBjb3JydXB0ZWQgYnkgdGhlIG11bHRpIHNlY3RvcgorCQkJCSAgIHRyYW5zZmVyIHByb3RlY3Rpb24uICBUaGUgZmlsZV9zaXplIGhhcyB0bworCQkJCSAgIGJlIHJvdW5kZWQgZG93biB0byBiZSBhIG11bHRpcGxlIG9mIHRoZQorCQkJCSAgIGxvZ19wYWdlX3NpemUgaW4gdGhlIFJFU1RBUlRfUEFHRV9IRUFERVIgYW5kCisJCQkJICAgdGhlbiBpdCBoYXMgdG8gYmUgYXQgbGVhc3QgYmlnIGVub3VnaCB0bworCQkJCSAgIHN0b3JlIHRoZSB0d28gcmVzdGFydCBwYWdlcyBhbmQgNDggKDB4MzApCisJCQkJICAgbG9nIHJlY29yZCBwYWdlcy4gKi8KKy8qIDMyKi8JbGUzMiBsYXN0X2xzbl9kYXRhX2xlbmd0aDsvKiBMZW5ndGggb2YgZGF0YSBvZiBsYXN0IExTTiwgbm90IGluY2x1ZGluZworCQkJCSAgIHRoZSBsb2cgcmVjb3JkIGhlYWRlci4gIE9uIGNyZWF0ZSBzZXQgdG8KKwkJCQkgICAwLiAqLworLyogMzYqLwlsZTE2IGxvZ19yZWNvcmRfaGVhZGVyX2xlbmd0aDsvKiBCeXRlIHNpemUgb2YgdGhlIGxvZyByZWNvcmQgaGVhZGVyLgorCQkJCSAgIElmIHRoZSB2ZXJzaW9uIG1hdGNoZXMgdGhlbiBjaGVjayB0aGF0IHRoZQorCQkJCSAgIHZhbHVlIG9mIGxvZ19yZWNvcmRfaGVhZGVyX2xlbmd0aCBpcyBhCisJCQkJICAgbXVsdGlwbGUgb2YgOCwgaS5lLgorCQkJCSAgIChsb2dfcmVjb3JkX2hlYWRlcl9sZW5ndGggKyA3KSAmIH43ID09CisJCQkJICAgbG9nX3JlY29yZF9oZWFkZXJfbGVuZ3RoLiAgV2hlbiBjcmVhdGluZyBzZXQKKwkJCQkgICBpdCB0byBzaXplb2YoTE9HX1JFQ09SRF9IRUFERVIpLCBhbGlnbmVkIHRvCisJCQkJICAgOCBieXRlcy4gKi8KKy8qIDM4Ki8JbGUxNiBsb2dfcGFnZV9kYXRhX29mZnNldDsvKiBPZmZzZXQgdG8gdGhlIHN0YXJ0IG9mIGRhdGEgaW4gYSBsb2cgcmVjb3JkCisJCQkJICAgcGFnZS4gIE11c3QgYmUgYSBtdWx0aXBsZSBvZiA4LiAgT24gY3JlYXRlCisJCQkJICAgc2V0IGl0IHRvIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSB1cGRhdGUKKwkJCQkgICBzZXF1ZW5jZSBhcnJheSBvZiB0aGUgbG9nIHJlY29yZCBwYWdlLiAqLworLyogNDAqLwlsZTMyIHJlc3RhcnRfbG9nX29wZW5fY291bnQ7LyogQSBjb3VudGVyIHRoYXQgZ2V0cyBpbmNyZW1lbnRlZCBldmVyeQorCQkJCSAgIHRpbWUgdGhlIGxvZ2ZpbGUgaXMgcmVzdGFydGVkIHdoaWNoIGhhcHBlbnMKKwkJCQkgICBhdCBtb3VudCB0aW1lIHdoZW4gdGhlIGxvZ2ZpbGUgaXMgb3BlbmVkLgorCQkJCSAgIFdoZW4gY3JlYXRpbmcgc2V0IHRvIGEgcmFuZG9tIHZhbHVlLiAgV2luMmsKKwkJCQkgICBzZXRzIGl0IHRvIHRoZSBsb3cgMzIgYml0cyBvZiB0aGUgY3VycmVudAorCQkJCSAgIHN5c3RlbSB0aW1lIGluIE5URlMgZm9ybWF0IChzZWUgdGltZS5oKS4gKi8KKy8qIDQ0Ki8JbGUzMiByZXNlcnZlZDsJCS8qIFJlc2VydmVkL2FsaWdubWVudCB0byA4LWJ5dGUgYm91bmRhcnkuICovCisvKiBzaXplb2YoKSA9IDQ4ICgweDMwKSBieXRlcyAqLworfSBfX2F0dHJpYnV0ZV9fICgoX19wYWNrZWRfXykpIFJFU1RBUlRfQVJFQTsKKworLyoKKyAqIExvZyBjbGllbnQgcmVjb3JkLiAgVGhlIG9mZnNldCBvZiB0aGlzIHJlY29yZCBpcyBmb3VuZCBieSBhZGRpbmcgdGhlIG9mZnNldAorICogb2YgdGhlIFJFU1RBUlRfQVJFQSB0byB0aGUgY2xpZW50X2FycmF5X29mZnNldCB2YWx1ZSBmb3VuZCBpbiBpdC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworLypPZnMqLworLyogIDAqLwlsZUxTTiBvbGRlc3RfbHNuOwkvKiBPbGRlc3QgTFNOIG5lZWRlZCBieSB0aGlzIGNsaWVudC4gIE9uIGNyZWF0ZQorCQkJCSAgIHNldCB0byAwLiAqLworLyogIDgqLwlsZUxTTiBjbGllbnRfcmVzdGFydF9sc247LyogTFNOIGF0IHdoaWNoIHRoaXMgY2xpZW50IG5lZWRzIHRvIHJlc3RhcnQKKwkJCQkgICB0aGUgdm9sdW1lLCBpLmUuIHRoZSBjdXJyZW50IHBvc2l0aW9uIHdpdGhpbgorCQkJCSAgIHRoZSBsb2cgZmlsZS4gIEF0IHByZXNlbnQsIGlmIGNsZWFuIHRoaXMKKwkJCQkgICBzaG91bGQgPSBjdXJyZW50X2xzbiBpbiByZXN0YXJ0IGFyZWEgYnV0IGl0CisJCQkJICAgcHJvYmFibHkgYWxzbyA9IGN1cnJlbnRfbHNuIHdoZW4gZGlydHkgbW9zdAorCQkJCSAgIG9mIHRoZSB0aW1lLiAgQXQgY3JlYXRlIHNldCB0byAwLiAqLworLyogMTYqLwlsZTE2IHByZXZfY2xpZW50OwkvKiBUaGUgb2Zmc2V0IHRvIHRoZSBwcmV2aW91cyBsb2cgY2xpZW50IHJlY29yZAorCQkJCSAgIGluIHRoZSBhcnJheSBvZiBsb2cgY2xpZW50IHJlY29yZHMuCisJCQkJICAgTE9HRklMRV9OT19DTElFTlQgbWVhbnMgdGhlcmUgaXMgbm8gcHJldmlvdXMKKwkJCQkgICBjbGllbnQgcmVjb3JkLCBpLmUuIHRoaXMgaXMgdGhlIGZpcnN0IG9uZS4KKwkJCQkgICBUaGlzIGlzIGFsd2F5cyBMT0dGSUxFX05PX0NMSUVOVC4gKi8KKy8qIDE4Ki8JbGUxNiBuZXh0X2NsaWVudDsJLyogVGhlIG9mZnNldCB0byB0aGUgbmV4dCBsb2cgY2xpZW50IHJlY29yZCBpbgorCQkJCSAgIHRoZSBhcnJheSBvZiBsb2cgY2xpZW50IHJlY29yZHMuCisJCQkJICAgTE9HRklMRV9OT19DTElFTlQgbWVhbnMgdGhlcmUgYXJlIG5vIG5leHQKKwkJCQkgICBjbGllbnQgcmVjb3JkcywgaS5lLiB0aGlzIGlzIHRoZSBsYXN0IG9uZS4KKwkJCQkgICBUaGlzIGlzIGFsd2F5cyBMT0dGSUxFX05PX0NMSUVOVC4gKi8KKy8qIDIwKi8JbGUxNiBzZXFfbnVtYmVyOwkvKiBPbiBXaW4yayBhbmQgcHJlc3VtYWJseSBlYXJsaWVyLCB0aGlzIGlzIHNldAorCQkJCSAgIHRvIHplcm8gZXZlcnkgdGltZSB0aGUgbG9nZmlsZSBpcyByZXN0YXJ0ZWQKKwkJCQkgICBhbmQgaXQgaXMgaW5jcmVtZW50ZWQgd2hlbiB0aGUgbG9nZmlsZSBpcworCQkJCSAgIGNsb3NlZCBhdCBkaXNtb3VudCB0aW1lLiAgVGh1cyBpdCBpcyAwIHdoZW4KKwkJCQkgICBkaXJ0eSBhbmQgMSB3aGVuIGNsZWFuLiAgT24gV2luWFAgYW5kCisJCQkJICAgcHJlc3VtYWJseSBsYXRlciwgdGhpcyBpcyBhbHdheXMgMC4gKi8KKy8qIDIyKi8JdTggcmVzZXJ2ZWRbNl07CQkvKiBSZXNlcnZlZC9hbGlnbm1lbnQuICovCisvKiAyOCovCWxlMzIgY2xpZW50X25hbWVfbGVuZ3RoOy8qIExlbmd0aCBvZiBjbGllbnQgbmFtZSBpbiBieXRlcy4gIFNob3VsZAorCQkJCSAgIGFsd2F5cyBiZSA4LiAqLworLyogMzIqLwludGZzY2hhciBjbGllbnRfbmFtZVs2NF07LyogTmFtZSBvZiB0aGUgY2xpZW50IGluIFVuaWNvZGUuICBTaG91bGQKKwkJCQkgICBhbHdheXMgYmUgIk5URlMiIHdpdGggdGhlIHJlbWFpbmluZyBieXRlcworCQkJCSAgIHNldCB0byAwLiAqLworLyogc2l6ZW9mKCkgPSAxNjAgKDB4YTApIGJ5dGVzICovCit9IF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkgTE9HX0NMSUVOVF9SRUNPUkQ7CisKK2V4dGVybiBCT09MIG50ZnNfY2hlY2tfbG9nZmlsZShzdHJ1Y3QgaW5vZGUgKmxvZ192aSk7CisKK2V4dGVybiBCT09MIG50ZnNfaXNfbG9nZmlsZV9jbGVhbihzdHJ1Y3QgaW5vZGUgKmxvZ192aSk7CisKK2V4dGVybiBCT09MIG50ZnNfZW1wdHlfbG9nZmlsZShzdHJ1Y3QgaW5vZGUgKmxvZ192aSk7CisKKyNlbmRpZiAvKiBOVEZTX1JXICovCisKKyNlbmRpZiAvKiBfTElOVVhfTlRGU19MT0dGSUxFX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvbWFsbG9jLmggYi9mcy9udGZzL21hbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYzU5NDQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL21hbGxvYy5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBtYWxsb2MuaCAtIE5URlMga2VybmVsIG1lbW9yeSBoYW5kbGluZy4gUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX0xJTlVYX05URlNfTUFMTE9DX0gKKyNkZWZpbmUgX0xJTlVYX05URlNfTUFMTE9DX0gKKworI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorCisvKioKKyAqIG50ZnNfbWFsbG9jX25vZnMgLSBhbGxvY2F0ZSBtZW1vcnkgaW4gbXVsdGlwbGVzIG9mIHBhZ2VzCisgKiBAc2l6ZQludW1iZXIgb2YgYnl0ZXMgdG8gYWxsb2NhdGUKKyAqCisgKiBBbGxvY2F0ZXMgQHNpemUgYnl0ZXMgb2YgbWVtb3J5LCByb3VuZGVkIHVwIHRvIG11bHRpcGxlcyBvZiBQQUdFX1NJWkUgYW5kCisgKiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIG1lbW9yeS4KKyAqCisgKiBJZiB0aGVyZSB3YXMgaW5zdWZmaWNpZW50IG1lbW9yeSB0byBjb21wbGV0ZSB0aGUgcmVxdWVzdCwgcmV0dXJuIE5VTEwuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqbnRmc19tYWxsb2Nfbm9mcyh1bnNpZ25lZCBsb25nIHNpemUpCit7CisJaWYgKGxpa2VseShzaXplIDw9IFBBR0VfU0laRSkpIHsKKwkJQlVHX09OKCFzaXplKTsKKwkJLyoga21hbGxvYygpIGhhcyBwZXItQ1BVIGNhY2hlcyBzbyBpcyBmYXN0ZXIgZm9yIG5vdy4gKi8KKwkJcmV0dXJuIGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfTk9GUyk7CisJCS8qIHJldHVybiAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfTk9GUyB8IF9fR0ZQX0hJR0hNRU0pOyAqLworCX0KKwlpZiAobGlrZWx5KHNpemUgPj4gUEFHRV9TSElGVCA8IG51bV9waHlzcGFnZXMpKQorCQlyZXR1cm4gX192bWFsbG9jKHNpemUsIEdGUF9OT0ZTIHwgX19HRlBfSElHSE1FTSwgUEFHRV9LRVJORUwpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbnRmc19mcmVlKHZvaWQgKmFkZHIpCit7CisJaWYgKGxpa2VseSgoKHVuc2lnbmVkIGxvbmcpYWRkciA8IFZNQUxMT0NfU1RBUlQpIHx8CisJCQkoKHVuc2lnbmVkIGxvbmcpYWRkciA+PSBWTUFMTE9DX0VORCApKSkgeworCQlrZnJlZShhZGRyKTsKKwkJLyogZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWFkZHIpOyAqLworCQlyZXR1cm47CisJfQorCXZmcmVlKGFkZHIpOworfQorCisjZW5kaWYgLyogX0xJTlVYX05URlNfTUFMTE9DX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvbWZ0LmMgYi9mcy9udGZzL21mdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYTg1YWMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL21mdC5jCkBAIC0wLDAgKzEsMjgyOSBAQAorLyoqCisgKiBtZnQuYyAtIE5URlMga2VybmVsIG1mdCByZWNvcmQgb3BlcmF0aW9ucy4gUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChjKSAyMDAyIFJpY2hhcmQgUnVzc29uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvc3dhcC5oPgorCisjaW5jbHVkZSAiYXR0cmliLmgiCisjaW5jbHVkZSAiYW9wcy5oIgorI2luY2x1ZGUgImJpdG1hcC5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAiZGlyLmgiCisjaW5jbHVkZSAibGNuYWxsb2MuaCIKKyNpbmNsdWRlICJtYWxsb2MuaCIKKyNpbmNsdWRlICJtZnQuaCIKKyNpbmNsdWRlICJudGZzLmgiCisKKy8qKgorICogbWFwX21mdF9yZWNvcmRfcGFnZSAtIG1hcCB0aGUgcGFnZSBpbiB3aGljaCBhIHNwZWNpZmljIG1mdCByZWNvcmQgcmVzaWRlcworICogQG5pOgkJbnRmcyBpbm9kZSB3aG9zZSBtZnQgcmVjb3JkIHBhZ2UgdG8gbWFwCisgKgorICogVGhpcyBtYXBzIHRoZSBwYWdlIGluIHdoaWNoIHRoZSBtZnQgcmVjb3JkIG9mIHRoZSBudGZzIGlub2RlIEBuaSBpcyBzaXR1YXRlZAorICogYW5kIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBtZnQgcmVjb3JkIHdpdGhpbiB0aGUgbWFwcGVkIHBhZ2UuCisgKgorICogUmV0dXJuIHZhbHVlIG5lZWRzIHRvIGJlIGNoZWNrZWQgd2l0aCBJU19FUlIoKSBhbmQgaWYgdGhhdCBpcyB0cnVlIFBUUl9FUlIoKQorICogY29udGFpbnMgdGhlIG5lZ2F0aXZlIGVycm9yIGNvZGUgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgTUZUX1JFQ09SRCAqbWFwX21mdF9yZWNvcmRfcGFnZShudGZzX2lub2RlICpuaSkKK3sKKwludGZzX3ZvbHVtZSAqdm9sID0gbmktPnZvbDsKKwlzdHJ1Y3QgaW5vZGUgKm1mdF92aSA9IHZvbC0+bWZ0X2lubzsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bnNpZ25lZCBsb25nIGluZGV4LCBvZnMsIGVuZF9pbmRleDsKKworCUJVR19PTihuaS0+cGFnZSk7CisJLyoKKwkgKiBUaGUgaW5kZXggaW50byB0aGUgcGFnZSBjYWNoZSBhbmQgdGhlIG9mZnNldCB3aXRoaW4gdGhlIHBhZ2UgY2FjaGUKKwkgKiBwYWdlIG9mIHRoZSB3YW50ZWQgbWZ0IHJlY29yZC4gRklYTUU6IFdlIG5lZWQgdG8gY2hlY2sgZm9yCisJICogb3ZlcmZsb3dpbmcgdGhlIHVuc2lnbmVkIGxvbmcsIGJ1dCBJIGRvbid0IHRoaW5rIHdlIHdvdWxkIGV2ZXIgZ2V0CisJICogaGVyZSBpZiB0aGUgdm9sdW1lIHdhcyB0aGF0IGJpZy4uLgorCSAqLworCWluZGV4ID0gbmktPm1mdF9ubyA8PCB2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJb2ZzID0gKG5pLT5tZnRfbm8gPDwgdm9sLT5tZnRfcmVjb3JkX3NpemVfYml0cykgJiB+UEFHRV9DQUNIRV9NQVNLOworCisJLyogVGhlIG1heGltdW0gdmFsaWQgaW5kZXggaW50byB0aGUgcGFnZSBjYWNoZSBmb3IgJE1GVCdzIGRhdGEuICovCisJZW5kX2luZGV4ID0gbWZ0X3ZpLT5pX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKKworCS8qIElmIHRoZSB3YW50ZWQgaW5kZXggaXMgb3V0IG9mIGJvdW5kcyB0aGUgbWZ0IHJlY29yZCBkb2Vzbid0IGV4aXN0LiAqLworCWlmICh1bmxpa2VseShpbmRleCA+PSBlbmRfaW5kZXgpKSB7CisJCWlmIChpbmRleCA+IGVuZF9pbmRleCB8fCAobWZ0X3ZpLT5pX3NpemUgJiB+UEFHRV9DQUNIRV9NQVNLKSA8CisJCQkJb2ZzICsgdm9sLT5tZnRfcmVjb3JkX3NpemUpIHsKKwkJCXBhZ2UgPSBFUlJfUFRSKC1FTk9FTlQpOworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiQXR0ZW10IHRvIHJlYWQgbWZ0IHJlY29yZCAweCVseCwgIgorCQkJCQkid2hpY2ggaXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIG1mdC4gICIKKwkJCQkJIlRoaXMgaXMgcHJvYmFibHkgYSBidWcgaW4gdGhlIG50ZnMgIgorCQkJCQkiZHJpdmVyLiIsIG5pLT5tZnRfbm8pOworCQkJZ290byBlcnJfb3V0OworCQl9CisJfQorCS8qIFJlYWQsIG1hcCwgYW5kIHBpbiB0aGUgcGFnZS4gKi8KKwlwYWdlID0gbnRmc19tYXBfcGFnZShtZnRfdmktPmlfbWFwcGluZywgaW5kZXgpOworCWlmIChsaWtlbHkoIUlTX0VSUihwYWdlKSkpIHsKKwkJLyogQ2F0Y2ggbXVsdGkgc2VjdG9yIHRyYW5zZmVyIGZpeHVwIGVycm9ycy4gKi8KKwkJaWYgKGxpa2VseShudGZzX2lzX21mdF9yZWNvcmRwKChsZTMyKikocGFnZV9hZGRyZXNzKHBhZ2UpICsKKwkJCQlvZnMpKSkpIHsKKwkJCW5pLT5wYWdlID0gcGFnZTsKKwkJCW5pLT5wYWdlX29mcyA9IG9mczsKKwkJCXJldHVybiBwYWdlX2FkZHJlc3MocGFnZSkgKyBvZnM7CisJCX0KKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiTWZ0IHJlY29yZCAweCVseCBpcyBjb3JydXB0LiAgIgorCQkJCSJSdW4gY2hrZHNrLiIsIG5pLT5tZnRfbm8pOworCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJCXBhZ2UgPSBFUlJfUFRSKC1FSU8pOworCX0KK2Vycl9vdXQ6CisJbmktPnBhZ2UgPSBOVUxMOworCW5pLT5wYWdlX29mcyA9IDA7CisJcmV0dXJuICh2b2lkKilwYWdlOworfQorCisvKioKKyAqIG1hcF9tZnRfcmVjb3JkIC0gbWFwLCBwaW4gYW5kIGxvY2sgYW4gbWZ0IHJlY29yZAorICogQG5pOgkJbnRmcyBpbm9kZSB3aG9zZSBNRlQgcmVjb3JkIHRvIG1hcAorICoKKyAqIEZpcnN0LCB0YWtlIHRoZSBtcmVjX2xvY2sgc2VtYXBob3JlLiBXZSBtaWdodCBub3cgYmUgc2xlZXBpbmcsIHdoaWxlIHdhaXRpbmcKKyAqIGZvciB0aGUgc2VtYXBob3JlIGlmIGl0IHdhcyBhbHJlYWR5IGxvY2tlZCBieSBzb21lb25lIGVsc2UuCisgKgorICogVGhlIHBhZ2Ugb2YgdGhlIHJlY29yZCBpcyBtYXBwZWQgdXNpbmcgbWFwX21mdF9yZWNvcmRfcGFnZSgpIGJlZm9yZSBiZWluZworICogcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAqCisgKiBUaGlzIGluIHR1cm4gdXNlcyBudGZzX21hcF9wYWdlKCkgdG8gZ2V0IHRoZSBwYWdlIGNvbnRhaW5pbmcgdGhlIHdhbnRlZCBtZnQKKyAqIHJlY29yZCAoaXQgaW4gdHVybiBjYWxscyByZWFkX2NhY2hlX3BhZ2UoKSB3aGljaCByZWFkcyBpdCBpbiBmcm9tIGRpc2sgaWYKKyAqIG5lY2Vzc2FyeSwgaW5jcmVtZW50cyB0aGUgdXNlIGNvdW50IG9uIHRoZSBwYWdlIHNvIHRoYXQgaXQgY2Fubm90IGRpc2FwcGVhcgorICogdW5kZXIgdXMgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHBhZ2UgY2FjaGUgcGFnZSkuCisgKgorICogSWYgcmVhZF9jYWNoZV9wYWdlKCkgaW52b2tlcyBudGZzX3JlYWRwYWdlKCkgdG8gbG9hZCB0aGUgcGFnZSBmcm9tIGRpc2ssIGl0CisgKiBzZXRzIFBHX2xvY2tlZCBhbmQgY2xlYXJzIFBHX3VwdG9kYXRlIG9uIHRoZSBwYWdlLiBPbmNlIEkvTyBoYXMgY29tcGxldGVkCisgKiBhbmQgdGhlIHBvc3QtcmVhZCBtc3QgZml4dXBzIG9uIGVhY2ggbWZ0IHJlY29yZCBpbiB0aGUgcGFnZSBoYXZlIGJlZW4KKyAqIHBlcmZvcm1lZCwgdGhlIHBhZ2UgZ2V0cyBQR191cHRvZGF0ZSBzZXQgYW5kIFBHX2xvY2tlZCBjbGVhcmVkICh0aGlzIGlzIGRvbmUKKyAqIGluIG91ciBhc3luY2hyb25vdXMgSS9PIGNvbXBsZXRpb24gaGFuZGxlciBlbmRfYnVmZmVyX3JlYWRfbWZ0X2FzeW5jKCkpLgorICogbnRmc19tYXBfcGFnZSgpIHdhaXRzIGZvciBQR19sb2NrZWQgdG8gYmVjb21lIGNsZWFyIGFuZCBjaGVja3MgaWYKKyAqIFBHX3VwdG9kYXRlIGlzIHNldCBhbmQgcmV0dXJucyBhbiBlcnJvciBjb2RlIGlmIG5vdC4gVGhpcyBwcm92aWRlcworICogc3VmZmljaWVudCBwcm90ZWN0aW9uIGFnYWluc3QgcmFjZXMgd2hlbiByZWFkaW5nL3VzaW5nIHRoZSBwYWdlLgorICoKKyAqIEhvd2V2ZXIgdGhlcmUgaXMgdGhlIHdyaXRlIG1hcHBpbmcgdG8gdGhpbmsgYWJvdXQuIERvaW5nIHRoZSBhYm92ZSBkZXNjcmliZWQKKyAqIGNoZWNraW5nIGhlcmUgd2lsbCBiZSBmaW5lLCBiZWNhdXNlIHdoZW4gaW5pdGlhdGluZyB0aGUgd3JpdGUgd2Ugd2lsbCBzZXQKKyAqIFBHX2xvY2tlZCBhbmQgY2xlYXIgUEdfdXB0b2RhdGUgbWFraW5nIHN1cmUgbm9ib2R5IGlzIHRvdWNoaW5nIHRoZSBwYWdlCisgKiBjb250ZW50cy4gRG9pbmcgdGhlIGxvY2tpbmcgdGhpcyB3YXkgbWVhbnMgdGhhdCB0aGUgY29tbWl0IHRvIGRpc2sgY29kZSBpbgorICogdGhlIHBhZ2UgY2FjaGUgY29kZSBwYXRocyBpcyBhdXRvbWF0aWNhbGx5IHN1ZmZpY2llbnRseSBsb2NrZWQgd2l0aCB1cyBhcworICogd2Ugd2lsbCBub3QgdG91Y2ggYSBwYWdlIHRoYXQgaGFzIGJlZW4gbG9ja2VkIG9yIGlzIG5vdCB1cHRvZGF0ZS4gVGhlIG9ubHkKKyAqIGxvY2tpbmcgcHJvYmxlbSB0aGVuIGlzIHRoZW0gbG9ja2luZyB0aGUgcGFnZSB3aGlsZSB3ZSBhcmUgYWNjZXNzaW5nIGl0LgorICoKKyAqIFNvIHRoYXQgY29kZSB3aWxsIGVuZCB1cCBoYXZpbmcgdG8gb3duIHRoZSBtcmVjX2xvY2sgb2YgYWxsIG1mdAorICogcmVjb3Jkcy9pbm9kZXMgcHJlc2VudCBpbiB0aGUgcGFnZSBiZWZvcmUgSS9PIGNhbiBwcm9jZWVkLiBJbiB0aGF0IGNhc2Ugd2UKKyAqIHdvdWxkbid0IG5lZWQgdG8gYm90aGVyIHdpdGggUEdfbG9ja2VkIGFuZCBQR191cHRvZGF0ZSBhcyBub2JvZHkgd2lsbCBiZQorICogYWNjZXNzaW5nIGFueXRoaW5nIHdpdGhvdXQgb3duaW5nIHRoZSBtcmVjX2xvY2sgc2VtYXBob3JlLiBCdXQgd2UgZG8gbmVlZAorICogdG8gdXNlIHRoZW0gYmVjYXVzZSBvZiB0aGUgcmVhZF9jYWNoZV9wYWdlKCkgaW52b2NhdGlvbiBhbmQgdGhlIGNvZGUgYmVjb21lcworICogc28gbXVjaCBzaW1wbGVyIHRoaXMgd2F5IHRoYXQgaXQgaXMgd2VsbCB3b3J0aCBpdC4KKyAqCisgKiBUaGUgbWZ0IHJlY29yZCBpcyBub3cgb3VycyBhbmQgd2UgcmV0dXJuIGEgcG9pbnRlciB0byBpdC4gWW91IG5lZWQgdG8gY2hlY2sKKyAqIHRoZSByZXR1cm5lZCBwb2ludGVyIHdpdGggSVNfRVJSKCkgYW5kIGlmIHRoYXQgaXMgdHJ1ZSwgUFRSX0VSUigpIHdpbGwgcmV0dXJuCisgKiB0aGUgZXJyb3IgY29kZS4KKyAqCisgKiBOT1RFOiBDYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIHNldHRpbmcgdGhlIG1mdCByZWNvcmQgZGlydHkgYmVmb3JlIGNhbGxpbmcKKyAqIHVubWFwX21mdF9yZWNvcmQoKS4gVGhpcyBpcyBvYnZpb3VzbHkgb25seSBuZWNlc3NhcnkgaWYgdGhlIGNhbGxlciByZWFsbHkKKyAqIG1vZGlmaWVkIHRoZSBtZnQgcmVjb3JkLi4uCisgKiBROiBEbyB3ZSB3YW50IHRvIHJlY3ljbGUgb25lIG9mIHRoZSBWRlMgaW5vZGUgc3RhdGUgYml0cyBpbnN0ZWFkPworICogQTogTm8sIHRoZSBpbm9kZSBvbmVzIG1lYW4gd2Ugd2FudCB0byBjaGFuZ2UgdGhlIG1mdCByZWNvcmQsIG5vdCB3ZSB3YW50IHRvCisgKiB3cml0ZSBpdCBvdXQuCisgKi8KK01GVF9SRUNPUkQgKm1hcF9tZnRfcmVjb3JkKG50ZnNfaW5vZGUgKm5pKQoreworCU1GVF9SRUNPUkQgKm07CisKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3IgbWZ0X25vIDB4JWx4LiIsIG5pLT5tZnRfbm8pOworCisJLyogTWFrZSBzdXJlIHRoZSBudGZzIGlub2RlIGRvZXNuJ3QgZ28gYXdheS4gKi8KKwlhdG9taWNfaW5jKCZuaS0+Y291bnQpOworCisJLyogU2VyaWFsaXplIGFjY2VzcyB0byB0aGlzIG1mdCByZWNvcmQuICovCisJZG93bigmbmktPm1yZWNfbG9jayk7CisKKwltID0gbWFwX21mdF9yZWNvcmRfcGFnZShuaSk7CisJaWYgKGxpa2VseSghSVNfRVJSKG0pKSkKKwkJcmV0dXJuIG07CisKKwl1cCgmbmktPm1yZWNfbG9jayk7CisJYXRvbWljX2RlYygmbmktPmNvdW50KTsKKwludGZzX2Vycm9yKG5pLT52b2wtPnNiLCAiRmFpbGVkIHdpdGggZXJyb3IgY29kZSAlbHUuIiwgLVBUUl9FUlIobSkpOworCXJldHVybiBtOworfQorCisvKioKKyAqIHVubWFwX21mdF9yZWNvcmRfcGFnZSAtIHVubWFwIHRoZSBwYWdlIGluIHdoaWNoIGEgc3BlY2lmaWMgbWZ0IHJlY29yZCByZXNpZGVzCisgKiBAbmk6CQludGZzIGlub2RlIHdob3NlIG1mdCByZWNvcmQgcGFnZSB0byB1bm1hcAorICoKKyAqIFRoaXMgdW5tYXBzIHRoZSBwYWdlIGluIHdoaWNoIHRoZSBtZnQgcmVjb3JkIG9mIHRoZSBudGZzIGlub2RlIEBuaSBpcworICogc2l0dWF0ZWQgYW5kIHJldHVybnMuIFRoaXMgaXMgYSBOT09QIGlmIGhpZ2htZW0gaXMgbm90IGNvbmZpZ3VyZWQuCisgKgorICogVGhlIHVubWFwIGhhcHBlbnMgdmlhIG50ZnNfdW5tYXBfcGFnZSgpIHdoaWNoIGluIHR1cm4gZGVjcmVtZW50cyB0aGUgdXNlCisgKiBjb3VudCBvbiB0aGUgcGFnZSB0aHVzIHJlbGVhc2luZyBpdCBmcm9tIHRoZSBwaW5uZWQgc3RhdGUuCisgKgorICogV2UgZG8gbm90IGFjdHVhbGx5IHVubWFwIHRoZSBwYWdlIGZyb20gbWVtb3J5IG9mIGNvdXJzZSwgYXMgdGhhdCB3aWxsIGJlCisgKiBkb25lIGJ5IHRoZSBwYWdlIGNhY2hlIGNvZGUgaXRzZWxmIHdoZW4gbWVtb3J5IHByZXNzdXJlIGluY3JlYXNlcyBvcgorICogd2hhdGV2ZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB1bm1hcF9tZnRfcmVjb3JkX3BhZ2UobnRmc19pbm9kZSAqbmkpCit7CisJQlVHX09OKCFuaS0+cGFnZSk7CisKKwkvLyBUT0RPOiBJZiBkaXJ0eSwgYmxhaC4uLgorCW50ZnNfdW5tYXBfcGFnZShuaS0+cGFnZSk7CisJbmktPnBhZ2UgPSBOVUxMOworCW5pLT5wYWdlX29mcyA9IDA7CisJcmV0dXJuOworfQorCisvKioKKyAqIHVubWFwX21mdF9yZWNvcmQgLSByZWxlYXNlIGEgbWFwcGVkIG1mdCByZWNvcmQKKyAqIEBuaToJCW50ZnMgaW5vZGUgd2hvc2UgTUZUIHJlY29yZCB0byB1bm1hcAorICoKKyAqIFdlIHJlbGVhc2UgdGhlIHBhZ2UgbWFwcGluZyBhbmQgdGhlIG1yZWNfbG9jayBtdXRleCB3aGljaCB1bm1hcHMgdGhlIG1mdAorICogcmVjb3JkIGFuZCByZWxlYXNlcyBpdCBmb3Igb3RoZXJzIHRvIGdldCBob2xkIG9mLiBXZSBhbHNvIHJlbGVhc2UgdGhlIG50ZnMKKyAqIGlub2RlIGJ5IGRlY3JlbWVudGluZyB0aGUgbnRmcyBpbm9kZSByZWZlcmVuY2UgY291bnQuCisgKgorICogTk9URTogSWYgY2FsbGVyIGhhcyBtb2RpZmllZCB0aGUgbWZ0IHJlY29yZCwgaXQgaXMgaW1wZXJhdGl2ZSB0byBzZXQgdGhlIG1mdAorICogcmVjb3JkIGRpcnR5IEJFRk9SRSBjYWxsaW5nIHVubWFwX21mdF9yZWNvcmQoKS4KKyAqLwordm9pZCB1bm1hcF9tZnRfcmVjb3JkKG50ZnNfaW5vZGUgKm5pKQoreworCXN0cnVjdCBwYWdlICpwYWdlID0gbmktPnBhZ2U7CisKKwlCVUdfT04oIXBhZ2UpOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIG1mdF9ubyAweCVseC4iLCBuaS0+bWZ0X25vKTsKKworCXVubWFwX21mdF9yZWNvcmRfcGFnZShuaSk7CisJdXAoJm5pLT5tcmVjX2xvY2spOworCWF0b21pY19kZWMoJm5pLT5jb3VudCk7CisJLyoKKwkgKiBJZiBwdXJlIG50ZnNfaW5vZGUsIGkuZS4gbm8gdmZzIGlub2RlIGF0dGFjaGVkLCB3ZSBsZWF2ZSBpdCB0bworCSAqIG50ZnNfY2xlYXJfZXh0ZW50X2lub2RlKCkgaW4gdGhlIGV4dGVudCBpbm9kZSBjYXNlLCBhbmQgdG8gdGhlCisJICogY2FsbGVyIGluIHRoZSBub24tZXh0ZW50LCB5ZXQgcHVyZSBudGZzIGlub2RlIGNhc2UsIHRvIGRvIHRoZSBhY3R1YWwKKwkgKiB0ZWFyIGRvd24gb2YgYWxsIHN0cnVjdHVyZXMgYW5kIGZyZWVpbmcgb2YgYWxsIGFsbG9jYXRlZCBtZW1vcnkuCisJICovCisJcmV0dXJuOworfQorCisvKioKKyAqIG1hcF9leHRlbnRfbWZ0X3JlY29yZCAtIGxvYWQgYW4gZXh0ZW50IGlub2RlIGFuZCBhdHRhY2ggaXQgdG8gaXRzIGJhc2UKKyAqIEBiYXNlX25pOgliYXNlIG50ZnMgaW5vZGUKKyAqIEBtcmVmOgltZnQgcmVmZXJlbmNlIG9mIHRoZSBleHRlbnQgaW5vZGUgdG8gbG9hZAorICogQG50ZnNfaW5vOglvbiBzdWNjZXNzZnVsIHJldHVybiwgcG9pbnRlciB0byB0aGUgbnRmc19pbm9kZSBzdHJ1Y3R1cmUKKyAqCisgKiBMb2FkIHRoZSBleHRlbnQgbWZ0IHJlY29yZCBAbXJlZiBhbmQgYXR0YWNoIGl0IHRvIGl0cyBiYXNlIGlub2RlIEBiYXNlX25pLgorICogUmV0dXJuIHRoZSBtYXBwZWQgZXh0ZW50IG1mdCByZWNvcmQgaWYgSVNfRVJSKHJlc3VsdCkgaXMgZmFsc2UuICBPdGhlcndpc2UKKyAqIFBUUl9FUlIocmVzdWx0KSBnaXZlcyB0aGUgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqCisgKiBPbiBzdWNjZXNzZnVsIHJldHVybiwgQG50ZnNfaW5vIGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgbnRmc19pbm9kZQorICogc3RydWN0dXJlIG9mIHRoZSBtYXBwZWQgZXh0ZW50IGlub2RlLgorICovCitNRlRfUkVDT1JEICptYXBfZXh0ZW50X21mdF9yZWNvcmQobnRmc19pbm9kZSAqYmFzZV9uaSwgTUZUX1JFRiBtcmVmLAorCQludGZzX2lub2RlICoqbnRmc19pbm8pCit7CisJTUZUX1JFQ09SRCAqbTsKKwludGZzX2lub2RlICpuaSA9IE5VTEw7CisJbnRmc19pbm9kZSAqKmV4dGVudF9uaXMgPSBOVUxMOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgbWZ0X25vID0gTVJFRihtcmVmKTsKKwl1MTYgc2VxX25vID0gTVNFUU5PKG1yZWYpOworCUJPT0wgZGVzdHJveV9uaSA9IEZBTFNFOworCisJbnRmc19kZWJ1ZygiTWFwcGluZyBleHRlbnQgbWZ0IHJlY29yZCAweCVseCAoYmFzZSBtZnQgcmVjb3JkIDB4JWx4KS4iLAorCQkJbWZ0X25vLCBiYXNlX25pLT5tZnRfbm8pOworCS8qIE1ha2Ugc3VyZSB0aGUgYmFzZSBudGZzIGlub2RlIGRvZXNuJ3QgZ28gYXdheS4gKi8KKwlhdG9taWNfaW5jKCZiYXNlX25pLT5jb3VudCk7CisJLyoKKwkgKiBDaGVjayBpZiB0aGlzIGV4dGVudCBpbm9kZSBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHRoZSBiYXNlIGlub2RlLAorCSAqIGluIHdoaWNoIGNhc2UganVzdCByZXR1cm4gaXQuIElmIG5vdCBmb3VuZCwgYWRkIGl0IHRvIHRoZSBiYXNlCisJICogaW5vZGUgYmVmb3JlIHJldHVybmluZyBpdC4KKwkgKi8KKwlkb3duKCZiYXNlX25pLT5leHRlbnRfbG9jayk7CisJaWYgKGJhc2VfbmktPm5yX2V4dGVudHMgPiAwKSB7CisJCWV4dGVudF9uaXMgPSBiYXNlX25pLT5leHQuZXh0ZW50X250ZnNfaW5vczsKKwkJZm9yIChpID0gMDsgaSA8IGJhc2VfbmktPm5yX2V4dGVudHM7IGkrKykgeworCQkJaWYgKG1mdF9ubyAhPSBleHRlbnRfbmlzW2ldLT5tZnRfbm8pCisJCQkJY29udGludWU7CisJCQluaSA9IGV4dGVudF9uaXNbaV07CisJCQkvKiBNYWtlIHN1cmUgdGhlIG50ZnMgaW5vZGUgZG9lc24ndCBnbyBhd2F5LiAqLworCQkJYXRvbWljX2luYygmbmktPmNvdW50KTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChsaWtlbHkobmkgIT0gTlVMTCkpIHsKKwkJdXAoJmJhc2VfbmktPmV4dGVudF9sb2NrKTsKKwkJYXRvbWljX2RlYygmYmFzZV9uaS0+Y291bnQpOworCQkvKiBXZSBmb3VuZCB0aGUgcmVjb3JkOyBqdXN0IGhhdmUgdG8gbWFwIGFuZCByZXR1cm4gaXQuICovCisJCW0gPSBtYXBfbWZ0X3JlY29yZChuaSk7CisJCS8qIG1hcF9tZnRfcmVjb3JkKCkgaGFzIGluY3JlbWVudGVkIHRoaXMgb24gc3VjY2Vzcy4gKi8KKwkJYXRvbWljX2RlYygmbmktPmNvdW50KTsKKwkJaWYgKGxpa2VseSghSVNfRVJSKG0pKSkgeworCQkJLyogVmVyaWZ5IHRoZSBzZXF1ZW5jZSBudW1iZXIuICovCisJCQlpZiAobGlrZWx5KGxlMTZfdG9fY3B1KG0tPnNlcXVlbmNlX251bWJlcikgPT0gc2VxX25vKSkgeworCQkJCW50ZnNfZGVidWcoIkRvbmUgMS4iKTsKKwkJCQkqbnRmc19pbm8gPSBuaTsKKwkJCQlyZXR1cm4gbTsKKwkJCX0KKwkJCXVubWFwX21mdF9yZWNvcmQobmkpOworCQkJbnRmc19lcnJvcihiYXNlX25pLT52b2wtPnNiLCAiRm91bmQgc3RhbGUgZXh0ZW50IG1mdCAiCisJCQkJCSJyZWZlcmVuY2UhIENvcnJ1cHQgZmlsZSBzeXN0ZW0uICIKKwkJCQkJIlJ1biBjaGtkc2suIik7CisJCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKKwkJfQorbWFwX2Vycl9vdXQ6CisJCW50ZnNfZXJyb3IoYmFzZV9uaS0+dm9sLT5zYiwgIkZhaWxlZCB0byBtYXAgZXh0ZW50ICIKKwkJCQkibWZ0IHJlY29yZCwgZXJyb3IgY29kZSAlbGQuIiwgLVBUUl9FUlIobSkpOworCQlyZXR1cm4gbTsKKwl9CisJLyogUmVjb3JkIHdhc24ndCB0aGVyZS4gR2V0IGEgbmV3IG50ZnMgaW5vZGUgYW5kIGluaXRpYWxpemUgaXQuICovCisJbmkgPSBudGZzX25ld19leHRlbnRfaW5vZGUoYmFzZV9uaS0+dm9sLT5zYiwgbWZ0X25vKTsKKwlpZiAodW5saWtlbHkoIW5pKSkgeworCQl1cCgmYmFzZV9uaS0+ZXh0ZW50X2xvY2spOworCQlhdG9taWNfZGVjKCZiYXNlX25pLT5jb3VudCk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKwluaS0+dm9sID0gYmFzZV9uaS0+dm9sOworCW5pLT5zZXFfbm8gPSBzZXFfbm87CisJbmktPm5yX2V4dGVudHMgPSAtMTsKKwluaS0+ZXh0LmJhc2VfbnRmc19pbm8gPSBiYXNlX25pOworCS8qIE5vdyBtYXAgdGhlIHJlY29yZC4gKi8KKwltID0gbWFwX21mdF9yZWNvcmQobmkpOworCWlmIChJU19FUlIobSkpIHsKKwkJdXAoJmJhc2VfbmktPmV4dGVudF9sb2NrKTsKKwkJYXRvbWljX2RlYygmYmFzZV9uaS0+Y291bnQpOworCQludGZzX2NsZWFyX2V4dGVudF9pbm9kZShuaSk7CisJCWdvdG8gbWFwX2Vycl9vdXQ7CisJfQorCS8qIFZlcmlmeSB0aGUgc2VxdWVuY2UgbnVtYmVyIGlmIGl0IGlzIHByZXNlbnQuICovCisJaWYgKHNlcV9ubyAmJiAobGUxNl90b19jcHUobS0+c2VxdWVuY2VfbnVtYmVyKSAhPSBzZXFfbm8pKSB7CisJCW50ZnNfZXJyb3IoYmFzZV9uaS0+dm9sLT5zYiwgIkZvdW5kIHN0YWxlIGV4dGVudCBtZnQgIgorCQkJCSJyZWZlcmVuY2UhIENvcnJ1cHQgZmlsZSBzeXN0ZW0uIFJ1biBjaGtkc2suIik7CisJCWRlc3Ryb3lfbmkgPSBUUlVFOworCQltID0gRVJSX1BUUigtRUlPKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJLyogQXR0YWNoIGV4dGVudCBpbm9kZSB0byBiYXNlIGlub2RlLCByZWFsbG9jYXRpbmcgbWVtb3J5IGlmIG5lZWRlZC4gKi8KKwlpZiAoIShiYXNlX25pLT5ucl9leHRlbnRzICYgMykpIHsKKwkJbnRmc19pbm9kZSAqKnRtcDsKKwkJaW50IG5ld19zaXplID0gKGJhc2VfbmktPm5yX2V4dGVudHMgKyA0KSAqIHNpemVvZihudGZzX2lub2RlICopOworCisJCXRtcCA9IChudGZzX2lub2RlICoqKWttYWxsb2MobmV3X3NpemUsIEdGUF9OT0ZTKTsKKwkJaWYgKHVubGlrZWx5KCF0bXApKSB7CisJCQludGZzX2Vycm9yKGJhc2VfbmktPnZvbC0+c2IsICJGYWlsZWQgdG8gYWxsb2NhdGUgIgorCQkJCQkiaW50ZXJuYWwgYnVmZmVyLiIpOworCQkJZGVzdHJveV9uaSA9IFRSVUU7CisJCQltID0gRVJSX1BUUigtRU5PTUVNKTsKKwkJCWdvdG8gdW5tX2Vycl9vdXQ7CisJCX0KKwkJaWYgKGJhc2VfbmktPm5yX2V4dGVudHMpIHsKKwkJCUJVR19PTighYmFzZV9uaS0+ZXh0LmV4dGVudF9udGZzX2lub3MpOworCQkJbWVtY3B5KHRtcCwgYmFzZV9uaS0+ZXh0LmV4dGVudF9udGZzX2lub3MsIG5ld19zaXplIC0KKwkJCQkJNCAqIHNpemVvZihudGZzX2lub2RlICopKTsKKwkJCWtmcmVlKGJhc2VfbmktPmV4dC5leHRlbnRfbnRmc19pbm9zKTsKKwkJfQorCQliYXNlX25pLT5leHQuZXh0ZW50X250ZnNfaW5vcyA9IHRtcDsKKwl9CisJYmFzZV9uaS0+ZXh0LmV4dGVudF9udGZzX2lub3NbYmFzZV9uaS0+bnJfZXh0ZW50cysrXSA9IG5pOworCXVwKCZiYXNlX25pLT5leHRlbnRfbG9jayk7CisJYXRvbWljX2RlYygmYmFzZV9uaS0+Y291bnQpOworCW50ZnNfZGVidWcoIkRvbmUgMi4iKTsKKwkqbnRmc19pbm8gPSBuaTsKKwlyZXR1cm4gbTsKK3VubV9lcnJfb3V0OgorCXVubWFwX21mdF9yZWNvcmQobmkpOworCXVwKCZiYXNlX25pLT5leHRlbnRfbG9jayk7CisJYXRvbWljX2RlYygmYmFzZV9uaS0+Y291bnQpOworCS8qCisJICogSWYgdGhlIGV4dGVudCBpbm9kZSB3YXMgbm90IGF0dGFjaGVkIHRvIHRoZSBiYXNlIGlub2RlIHdlIG5lZWQgdG8KKwkgKiByZWxlYXNlIGl0IG9yIHdlIHdpbGwgbGVhayBtZW1vcnkuCisJICovCisJaWYgKGRlc3Ryb3lfbmkpCisJCW50ZnNfY2xlYXJfZXh0ZW50X2lub2RlKG5pKTsKKwlyZXR1cm4gbTsKK30KKworI2lmZGVmIE5URlNfUlcKKworLyoqCisgKiBfX21hcmtfbWZ0X3JlY29yZF9kaXJ0eSAtIHNldCB0aGUgbWZ0IHJlY29yZCBhbmQgdGhlIHBhZ2UgY29udGFpbmluZyBpdCBkaXJ0eQorICogQG5pOgkJbnRmcyBpbm9kZSBkZXNjcmliaW5nIHRoZSBtYXBwZWQgbWZ0IHJlY29yZAorICoKKyAqIEludGVybmFsIGZ1bmN0aW9uLiAgVXNlcnMgc2hvdWxkIGNhbGwgbWFya19tZnRfcmVjb3JkX2RpcnR5KCkgaW5zdGVhZC4KKyAqCisgKiBTZXQgdGhlIG1hcHBlZCAoZXh0ZW50KSBtZnQgcmVjb3JkIG9mIHRoZSAoYmFzZSBvciBleHRlbnQpIG50ZnMgaW5vZGUgQG5pLAorICogYXMgd2VsbCBhcyB0aGUgcGFnZSBjb250YWluaW5nIHRoZSBtZnQgcmVjb3JkLCBkaXJ0eS4gIEFsc28sIG1hcmsgdGhlIGJhc2UKKyAqIHZmcyBpbm9kZSBkaXJ0eS4gIFRoaXMgZW5zdXJlcyB0aGF0IGFueSBjaGFuZ2VzIHRvIHRoZSBtZnQgcmVjb3JkIGFyZQorICogd3JpdHRlbiBvdXQgdG8gZGlzay4KKyAqCisgKiBOT1RFOiAgV2Ugb25seSBzZXQgSV9ESVJUWV9TWU5DIGFuZCBJX0RJUlRZX0RBVEFTWU5DIChhbmQgbm90IElfRElSVFlfUEFHRVMpCisgKiBvbiB0aGUgYmFzZSB2ZnMgaW5vZGUsIGJlY2F1c2UgZXZlbiB0aG91Z2ggZmlsZSBkYXRhIG1heSBoYXZlIGJlZW4gbW9kaWZpZWQsCisgKiBpdCBpcyBkaXJ0eSBpbiB0aGUgaW5vZGUgbWV0YSBkYXRhIHJhdGhlciB0aGFuIHRoZSBkYXRhIHBhZ2UgY2FjaGUgb2YgdGhlCisgKiBpbm9kZSwgYW5kIHRodXMgdGhlcmUgYXJlIG5vIGRhdGEgcGFnZXMgdGhhdCBuZWVkIHdyaXRpbmcgb3V0LiAgVGhlcmVmb3JlLCBhCisgKiBmdWxsIG1hcmtfaW5vZGVfZGlydHkoKSBpcyBvdmVya2lsbC4gIEEgbWFya19pbm9kZV9kaXJ0eV9zeW5jKCksIG9uIHRoZQorICogb3RoZXIgaGFuZCwgaXMgbm90IHN1ZmZpY2llbnQsIGJlY2F1c2UgSV9ESVJUWV9EQVRBU1lOQyBuZWVkcyB0byBiZSBzZXQgdG8KKyAqIGVuc3VyZSAtPndyaXRlX2lub2RlIGlzIGNhbGxlZCBmcm9tIGdlbmVyaWNfb3N5bmNfaW5vZGUoKSBhbmQgdGhpcyBuZWVkcyB0bworICogaGFwcGVuIG9yIHRoZSBmaWxlIGRhdGEgd291bGQgbm90IG5lY2Vzc2FyaWx5IGhpdCB0aGUgZGV2aWNlIHN5bmNocm9ub3VzbHksCisgKiBldmVuIHRob3VnaCB0aGUgdmZzIGlub2RlIGhhcyB0aGUgT19TWU5DIGZsYWcgc2V0LiAgQWxzbywgSV9ESVJUWV9EQVRBU1lOQworICogc2ltcGx5ICJmZWVscyIgYmV0dGVyIHRoYW4ganVzdCBJX0RJUlRZX1NZTkMsIHNpbmNlIHRoZSBmaWxlIGRhdGEgaGFzIG5vdAorICogYWN0dWFsbHkgaGl0IHRoZSBibG9jayBkZXZpY2UgeWV0LCB3aGljaCBpcyBub3Qgd2hhdCBJX0RJUlRZX1NZTkMgb24gaXRzIG93bgorICogd291bGQgc3VnZ2VzdC4KKyAqLwordm9pZCBfX21hcmtfbWZ0X3JlY29yZF9kaXJ0eShudGZzX2lub2RlICpuaSkKK3sKKwludGZzX2lub2RlICpiYXNlX25pOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIGlub2RlIDB4JWx4LiIsIG5pLT5tZnRfbm8pOworCUJVR19PTihOSW5vQXR0cihuaSkpOworCW1hcmtfbnRmc19yZWNvcmRfZGlydHkobmktPnBhZ2UsIG5pLT5wYWdlX29mcyk7CisJLyogRGV0ZXJtaW5lIHRoZSBiYXNlIHZmcyBpbm9kZSBhbmQgbWFyayBpdCBkaXJ0eSwgdG9vLiAqLworCWRvd24oJm5pLT5leHRlbnRfbG9jayk7CisJaWYgKGxpa2VseShuaS0+bnJfZXh0ZW50cyA+PSAwKSkKKwkJYmFzZV9uaSA9IG5pOworCWVsc2UKKwkJYmFzZV9uaSA9IG5pLT5leHQuYmFzZV9udGZzX2lubzsKKwl1cCgmbmktPmV4dGVudF9sb2NrKTsKKwlfX21hcmtfaW5vZGVfZGlydHkoVkZTX0koYmFzZV9uaSksIElfRElSVFlfU1lOQyB8IElfRElSVFlfREFUQVNZTkMpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqbnRmc19wbGVhc2VfZW1haWwgPSAiUGxlYXNlIGVtYWlsICIKKwkJImxpbnV4LW50ZnMtZGV2QGxpc3RzLnNvdXJjZWZvcmdlLm5ldCBhbmQgc2F5IHRoYXQgeW91IHNhdyAiCisJCSJ0aGlzIG1lc3NhZ2UuICBUaGFuayB5b3UuIjsKKworLyoqCisgKiBudGZzX3N5bmNfbWZ0X21pcnJvcl91bW91bnQgLSBzeW5jaHJvbmlzZSBhbiBtZnQgcmVjb3JkIHRvIHRoZSBtZnQgbWlycm9yCisgKiBAdm9sOgludGZzIHZvbHVtZSBvbiB3aGljaCB0aGUgbWZ0IHJlY29yZCB0byBzeW5jaHJvbml6ZSByZXNpZGVzCisgKiBAbWZ0X25vOgltZnQgcmVjb3JkIG51bWJlciBvZiBtZnQgcmVjb3JkIHRvIHN5bmNocm9uaXplCisgKiBAbToJCW1hcHBlZCwgbXN0IHByb3RlY3RlZCAoZXh0ZW50KSBtZnQgcmVjb3JkIHRvIHN5bmNocm9uaXplCisgKgorICogV3JpdGUgdGhlIG1hcHBlZCwgbXN0IHByb3RlY3RlZCAoZXh0ZW50KSBtZnQgcmVjb3JkIEBtIHdpdGggbWZ0IHJlY29yZAorICogbnVtYmVyIEBtZnRfbm8gdG8gdGhlIG1mdCBtaXJyb3IgKCRNRlRNaXJyKSBvZiB0aGUgbnRmcyB2b2x1bWUgQHZvbCwKKyAqIGJ5cGFzc2luZyB0aGUgcGFnZSBjYWNoZSBhbmQgdGhlICRNRlRNaXJyIGlub2RlIGl0c2VsZi4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgZm9yIHVzZSBhdCB1bW91bnQgdGltZSB3aGVuIHRoZSBtZnQgbWlycm9yIGlub2RlIGhhcworICogYWxyZWFkeSBiZWVuIGRpc3Bvc2VkIG9mZi4gIFdlIEJVRygpIGlmIHdlIGFyZSBjYWxsZWQgd2hpbGUgdGhlIG1mdCBtaXJyb3IKKyAqIGlub2RlIGlzIHN0aWxsIGF0dGFjaGVkIHRvIHRoZSB2b2x1bWUuCisgKgorICogT24gc3VjY2VzcyByZXR1cm4gMC4gIE9uIGVycm9yIHJldHVybiAtZXJybm8uCisgKgorICogTk9URTogIFRoaXMgZnVuY3Rpb24gaXMgbm90IGltcGxlbWVudGVkIHlldCBhcyBJIGFtIG5vdCBjb252aW5jZWQgaXQgY2FuCisgKiBhY3R1YWxseSBiZSB0cmlnZ2VyZWQgY29uc2lkZXJpbmcgdGhlIHNlcXVlbmNlIG9mIGNvbW1pdHMgd2UgZG8gaW4gc3VwZXIuYzo6CisgKiBudGZzX3B1dF9zdXBlcigpLiAgQnV0IGp1c3QgaW4gY2FzZSB3ZSBwcm92aWRlIHRoaXMgcGxhY2UgaG9sZGVyIGFzIHRoZQorICogYWx0ZXJuYXRpdmUgd291bGQgYmUgZWl0aGVyIHRvIEJVRygpIG9yIHRvIGdldCBhIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZQorICogYW5kIE9vcHMuCisgKi8KK3N0YXRpYyBpbnQgbnRmc19zeW5jX21mdF9taXJyb3JfdW1vdW50KG50ZnNfdm9sdW1lICp2b2wsCisJCWNvbnN0IHVuc2lnbmVkIGxvbmcgbWZ0X25vLCBNRlRfUkVDT1JEICptKQoreworCUJVR19PTih2b2wtPm1mdG1pcnJfaW5vKTsKKwludGZzX2Vycm9yKHZvbC0+c2IsICJVbW91bnQgdGltZSBtZnQgbWlycm9yIHN5bmNpbmcgaXMgbm90ICIKKwkJCSJpbXBsZW1lbnRlZCB5ZXQuICAlcyIsIG50ZnNfcGxlYXNlX2VtYWlsKTsKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKKy8qKgorICogbnRmc19zeW5jX21mdF9taXJyb3IgLSBzeW5jaHJvbml6ZSBhbiBtZnQgcmVjb3JkIHRvIHRoZSBtZnQgbWlycm9yCisgKiBAdm9sOgludGZzIHZvbHVtZSBvbiB3aGljaCB0aGUgbWZ0IHJlY29yZCB0byBzeW5jaHJvbml6ZSByZXNpZGVzCisgKiBAbWZ0X25vOgltZnQgcmVjb3JkIG51bWJlciBvZiBtZnQgcmVjb3JkIHRvIHN5bmNocm9uaXplCisgKiBAbToJCW1hcHBlZCwgbXN0IHByb3RlY3RlZCAoZXh0ZW50KSBtZnQgcmVjb3JkIHRvIHN5bmNocm9uaXplCisgKiBAc3luYzoJaWYgdHJ1ZSwgd2FpdCBmb3IgaS9vIGNvbXBsZXRpb24KKyAqCisgKiBXcml0ZSB0aGUgbWFwcGVkLCBtc3QgcHJvdGVjdGVkIChleHRlbnQpIG1mdCByZWNvcmQgQG0gd2l0aCBtZnQgcmVjb3JkCisgKiBudW1iZXIgQG1mdF9ubyB0byB0aGUgbWZ0IG1pcnJvciAoJE1GVE1pcnIpIG9mIHRoZSBudGZzIHZvbHVtZSBAdm9sLgorICoKKyAqIE9uIHN1Y2Nlc3MgcmV0dXJuIDAuICBPbiBlcnJvciByZXR1cm4gLWVycm5vIGFuZCBzZXQgdGhlIHZvbHVtZSBlcnJvcnMgZmxhZworICogaW4gdGhlIG50ZnMgdm9sdW1lIEB2b2wuCisgKgorICogTk9URTogIFdlIGFsd2F5cyBwZXJmb3JtIHN5bmNocm9ub3VzIGkvbyBhbmQgaWdub3JlIHRoZSBAc3luYyBwYXJhbWV0ZXIuCisgKgorICogVE9ETzogIElmIEBzeW5jIGlzIGZhbHNlLCB3YW50IHRvIGRvIHRydWx5IGFzeW5jaHJvbm91cyBpL28sIGkuZS4ganVzdAorICogc2NoZWR1bGUgaS9vIHZpYSAtPndyaXRlcGFnZSBvciBkbyBpdCB2aWEga250ZnNkIG9yIHdoYXRldmVyLgorICovCitpbnQgbnRmc19zeW5jX21mdF9taXJyb3IobnRmc192b2x1bWUgKnZvbCwgY29uc3QgdW5zaWduZWQgbG9uZyBtZnRfbm8sCisJCU1GVF9SRUNPUkQgKm0sIGludCBzeW5jKQoreworCXN0cnVjdCBwYWdlICpwYWdlOworCXVuc2lnbmVkIGludCBibG9ja3NpemUgPSB2b2wtPnNiLT5zX2Jsb2Nrc2l6ZTsKKwlpbnQgbWF4X2JocyA9IHZvbC0+bWZ0X3JlY29yZF9zaXplIC8gYmxvY2tzaXplOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmhzW21heF9iaHNdOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICpoZWFkOworCXU4ICprbWlycjsKKwlydW5saXN0X2VsZW1lbnQgKnJsOworCXVuc2lnbmVkIGludCBibG9ja19zdGFydCwgYmxvY2tfZW5kLCBtX3N0YXJ0LCBtX2VuZCwgcGFnZV9vZnM7CisJaW50IGlfYmhzLCBucl9iaHMsIGVyciA9IDA7CisJdW5zaWduZWQgY2hhciBibG9ja3NpemVfYml0cyA9IHZvbC0+bWZ0bWlycl9pbm8tPmlfYmxrYml0czsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBpbm9kZSAweCVseC4iLCBtZnRfbm8pOworCUJVR19PTighbWF4X2Jocyk7CisJaWYgKHVubGlrZWx5KCF2b2wtPm1mdG1pcnJfaW5vKSkgeworCQkvKiBUaGlzIGNvdWxkIGhhcHBlbiBkdXJpbmcgdW1vdW50Li4uICovCisJCWVyciA9IG50ZnNfc3luY19tZnRfbWlycm9yX3Vtb3VudCh2b2wsIG1mdF9ubywgbSk7CisJCWlmIChsaWtlbHkoIWVycikpCisJCQlyZXR1cm4gZXJyOworCQlnb3RvIGVycl9vdXQ7CisJfQorCS8qIEdldCB0aGUgcGFnZSBjb250YWluaW5nIHRoZSBtaXJyb3IgY29weSBvZiB0aGUgbWZ0IHJlY29yZCBAbS4gKi8KKwlwYWdlID0gbnRmc19tYXBfcGFnZSh2b2wtPm1mdG1pcnJfaW5vLT5pX21hcHBpbmcsIG1mdF9ubyA+PgorCQkJKFBBR0VfQ0FDSEVfU0hJRlQgLSB2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzKSk7CisJaWYgKElTX0VSUihwYWdlKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gbWFwIG1mdCBtaXJyb3IgcGFnZS4iKTsKKwkJZXJyID0gUFRSX0VSUihwYWdlKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwlsb2NrX3BhZ2UocGFnZSk7CisJQlVHX09OKCFQYWdlVXB0b2RhdGUocGFnZSkpOworCUNsZWFyUGFnZVVwdG9kYXRlKHBhZ2UpOworCS8qIE9mZnNldCBvZiB0aGUgbWZ0IG1pcnJvciByZWNvcmQgaW5zaWRlIHRoZSBwYWdlLiAqLworCXBhZ2Vfb2ZzID0gKG1mdF9ubyA8PCB2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzKSAmIH5QQUdFX0NBQ0hFX01BU0s7CisJLyogVGhlIGFkZHJlc3MgaW4gdGhlIHBhZ2Ugb2YgdGhlIG1pcnJvciBjb3B5IG9mIHRoZSBtZnQgcmVjb3JkIEBtLiAqLworCWttaXJyID0gcGFnZV9hZGRyZXNzKHBhZ2UpICsgcGFnZV9vZnM7CisJLyogQ29weSB0aGUgbXN0IHByb3RlY3RlZCBtZnQgcmVjb3JkIHRvIHRoZSBtaXJyb3IuICovCisJbWVtY3B5KGttaXJyLCBtLCB2b2wtPm1mdF9yZWNvcmRfc2l6ZSk7CisJLyogQ3JlYXRlIHVwdG9kYXRlIGJ1ZmZlcnMgaWYgbm90IHByZXNlbnQuICovCisJaWYgKHVubGlrZWx5KCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSkgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRhaWw7CisKKwkJYmggPSBoZWFkID0gYWxsb2NfcGFnZV9idWZmZXJzKHBhZ2UsIGJsb2Nrc2l6ZSwgMSk7CisJCWRvIHsKKwkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQkJdGFpbCA9IGJoOworCQkJYmggPSBiaC0+Yl90aGlzX3BhZ2U7CisJCX0gd2hpbGUgKGJoKTsKKwkJdGFpbC0+Yl90aGlzX3BhZ2UgPSBoZWFkOworCQlhdHRhY2hfcGFnZV9idWZmZXJzKHBhZ2UsIGhlYWQpOworCQlCVUdfT04oIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpOworCX0KKwliaCA9IGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJQlVHX09OKCFiaCk7CisJcmwgPSBOVUxMOworCW5yX2JocyA9IDA7CisJYmxvY2tfc3RhcnQgPSAwOworCW1fc3RhcnQgPSBrbWlyciAtICh1OCopcGFnZV9hZGRyZXNzKHBhZ2UpOworCW1fZW5kID0gbV9zdGFydCArIHZvbC0+bWZ0X3JlY29yZF9zaXplOworCWRvIHsKKwkJYmxvY2tfZW5kID0gYmxvY2tfc3RhcnQgKyBibG9ja3NpemU7CisJCS8qIElmIHRoZSBidWZmZXIgaXMgb3V0c2lkZSB0aGUgbWZ0IHJlY29yZCwgc2tpcCBpdC4gKi8KKwkJaWYgKGJsb2NrX2VuZCA8PSBtX3N0YXJ0KQorCQkJY29udGludWU7CisJCWlmICh1bmxpa2VseShibG9ja19zdGFydCA+PSBtX2VuZCkpCisJCQlicmVhazsKKwkJLyogTmVlZCB0byBtYXAgdGhlIGJ1ZmZlciBpZiBpdCBpcyBub3QgbWFwcGVkIGFscmVhZHkuICovCisJCWlmICh1bmxpa2VseSghYnVmZmVyX21hcHBlZChiaCkpKSB7CisJCQlWQ04gdmNuOworCQkJTENOIGxjbjsKKwkJCXVuc2lnbmVkIGludCB2Y25fb2ZzOworCisJCQkvKiBPYnRhaW4gdGhlIHZjbiBhbmQgb2Zmc2V0IG9mIHRoZSBjdXJyZW50IGJsb2NrLiAqLworCQkJdmNuID0gKChWQ04pbWZ0X25vIDw8IHZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHMpICsKKwkJCQkJKGJsb2NrX3N0YXJ0IC0gbV9zdGFydCk7CisJCQl2Y25fb2ZzID0gdmNuICYgdm9sLT5jbHVzdGVyX3NpemVfbWFzazsKKwkJCXZjbiA+Pj0gdm9sLT5jbHVzdGVyX3NpemVfYml0czsKKwkJCWlmICghcmwpIHsKKwkJCQlkb3duX3JlYWQoJk5URlNfSSh2b2wtPm1mdG1pcnJfaW5vKS0+CisJCQkJCQlydW5saXN0LmxvY2spOworCQkJCXJsID0gTlRGU19JKHZvbC0+bWZ0bWlycl9pbm8pLT5ydW5saXN0LnJsOworCQkJCS8qCisJCQkJICogJE1GVE1pcnIgYWx3YXlzIGhhcyB0aGUgd2hvbGUgb2YgaXRzIHJ1bmxpc3QKKwkJCQkgKiBpbiBtZW1vcnkuCisJCQkJICovCisJCQkJQlVHX09OKCFybCk7CisJCQl9CisJCQkvKiBTZWVrIHRvIGVsZW1lbnQgY29udGFpbmluZyB0YXJnZXQgdmNuLiAqLworCQkJd2hpbGUgKHJsLT5sZW5ndGggJiYgcmxbMV0udmNuIDw9IHZjbikKKwkJCQlybCsrOworCQkJbGNuID0gbnRmc19ybF92Y25fdG9fbGNuKHJsLCB2Y24pOworCQkJLyogRm9yICRNRlRNaXJyLCBvbmx5IGxjbiA+PSAwIGlzIGEgc3VjY2Vzc2Z1bCByZW1hcC4gKi8KKwkJCWlmIChsaWtlbHkobGNuID49IDApKSB7CisJCQkJLyogU2V0dXAgYnVmZmVyIGhlYWQgdG8gY29ycmVjdCBibG9jay4gKi8KKwkJCQliaC0+Yl9ibG9ja25yID0gKChsY24gPDwKKwkJCQkJCXZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMpICsKKwkJCQkJCXZjbl9vZnMpID4+IGJsb2Nrc2l6ZV9iaXRzOworCQkJCXNldF9idWZmZXJfbWFwcGVkKGJoKTsKKwkJCX0gZWxzZSB7CisJCQkJYmgtPmJfYmxvY2tuciA9IC0xOworCQkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkNhbm5vdCB3cml0ZSBtZnQgbWlycm9yICIKKwkJCQkJCSJyZWNvcmQgMHglbHggYmVjYXVzZSBpdHMgIgorCQkJCQkJImxvY2F0aW9uIG9uIGRpc2sgY291bGQgbm90ICIKKwkJCQkJCSJiZSBkZXRlcm1pbmVkIChlcnJvciBjb2RlICIKKwkJCQkJCSIlbGxpKS4iLCBtZnRfbm8sCisJCQkJCQkobG9uZyBsb25nKWxjbik7CisJCQkJZXJyID0gLUVJTzsKKwkJCX0KKwkJfQorCQlCVUdfT04oIWJ1ZmZlcl91cHRvZGF0ZShiaCkpOworCQlCVUdfT04oIW5yX2JocyAmJiAobV9zdGFydCAhPSBibG9ja19zdGFydCkpOworCQlCVUdfT04obnJfYmhzID49IG1heF9iaHMpOworCQliaHNbbnJfYmhzKytdID0gYmg7CisJCUJVR19PTigobnJfYmhzID49IG1heF9iaHMpICYmIChtX2VuZCAhPSBibG9ja19lbmQpKTsKKwl9IHdoaWxlIChibG9ja19zdGFydCA9IGJsb2NrX2VuZCwgKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKKwlpZiAodW5saWtlbHkocmwpKQorCQl1cF9yZWFkKCZOVEZTX0kodm9sLT5tZnRtaXJyX2lubyktPnJ1bmxpc3QubG9jayk7CisJaWYgKGxpa2VseSghZXJyKSkgeworCQkvKiBMb2NrIGJ1ZmZlcnMgYW5kIHN0YXJ0IHN5bmNocm9ub3VzIHdyaXRlIGkvbyBvbiB0aGVtLiAqLworCQlmb3IgKGlfYmhzID0gMDsgaV9iaHMgPCBucl9iaHM7IGlfYmhzKyspIHsKKwkJCXN0cnVjdCBidWZmZXJfaGVhZCAqdGJoID0gYmhzW2lfYmhzXTsKKworCQkJaWYgKHVubGlrZWx5KHRlc3Rfc2V0X2J1ZmZlcl9sb2NrZWQodGJoKSkpCisJCQkJQlVHKCk7CisJCQlCVUdfT04oIWJ1ZmZlcl91cHRvZGF0ZSh0YmgpKTsKKwkJCWNsZWFyX2J1ZmZlcl9kaXJ0eSh0YmgpOworCQkJZ2V0X2JoKHRiaCk7CisJCQl0YmgtPmJfZW5kX2lvID0gZW5kX2J1ZmZlcl93cml0ZV9zeW5jOworCQkJc3VibWl0X2JoKFdSSVRFLCB0YmgpOworCQl9CisJCS8qIFdhaXQgb24gaS9vIGNvbXBsZXRpb24gb2YgYnVmZmVycy4gKi8KKwkJZm9yIChpX2JocyA9IDA7IGlfYmhzIDwgbnJfYmhzOyBpX2JocysrKSB7CisJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRiaCA9IGJoc1tpX2Joc107CisKKwkJCXdhaXRfb25fYnVmZmVyKHRiaCk7CisJCQlpZiAodW5saWtlbHkoIWJ1ZmZlcl91cHRvZGF0ZSh0YmgpKSkgeworCQkJCWVyciA9IC1FSU87CisJCQkJLyoKKwkJCQkgKiBTZXQgdGhlIGJ1ZmZlciB1cHRvZGF0ZSBzbyB0aGUgcGFnZSBhbmQKKwkJCQkgKiBidWZmZXIgc3RhdGVzIGRvIG5vdCBiZWNvbWUgb3V0IG9mIHN5bmMuCisJCQkJICovCisJCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZSh0YmgpOworCQkJfQorCQl9CisJfSBlbHNlIC8qIGlmICh1bmxpa2VseShlcnIpKSAqLyB7CisJCS8qIENsZWFuIHRoZSBidWZmZXJzLiAqLworCQlmb3IgKGlfYmhzID0gMDsgaV9iaHMgPCBucl9iaHM7IGlfYmhzKyspCisJCQljbGVhcl9idWZmZXJfZGlydHkoYmhzW2lfYmhzXSk7CisJfQorCS8qIEN1cnJlbnQgc3RhdGU6IGFsbCBidWZmZXJzIGFyZSBjbGVhbiwgdW5sb2NrZWQsIGFuZCB1cHRvZGF0ZS4gKi8KKwkvKiBSZW1vdmUgdGhlIG1zdCBwcm90ZWN0aW9uIGZpeHVwcyBhZ2Fpbi4gKi8KKwlwb3N0X3dyaXRlX21zdF9maXh1cCgoTlRGU19SRUNPUkQqKWttaXJyKTsKKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCWlmIChsaWtlbHkoIWVycikpIHsKKwkJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwl9IGVsc2UgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJJL08gZXJyb3Igd2hpbGUgd3JpdGluZyBtZnQgbWlycm9yICIKKwkJCQkicmVjb3JkIDB4JWx4ISIsIG1mdF9ubyk7CitlcnJfb3V0OgorCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gc3luY2hyb25pemUgJE1GVE1pcnIgKGVycm9yICIKKwkJCQkiY29kZSAlaSkuICBWb2x1bWUgd2lsbCBiZSBsZWZ0IG1hcmtlZCBkaXJ0eSAiCisJCQkJIm9uIHVtb3VudC4gIFJ1biBudGZzZml4IG9uIHRoZSBwYXJ0aXRpb24gIgorCQkJCSJhZnRlciB1bW91bnRpbmcgdG8gY29ycmVjdCB0aGlzLiIsIC1lcnIpOworCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogd3JpdGVfbWZ0X3JlY29yZF9ub2xvY2sgLSB3cml0ZSBvdXQgYSBtYXBwZWQgKGV4dGVudCkgbWZ0IHJlY29yZAorICogQG5pOgkJbnRmcyBpbm9kZSBkZXNjcmliaW5nIHRoZSBtYXBwZWQgKGV4dGVudCkgbWZ0IHJlY29yZAorICogQG06CQltYXBwZWQgKGV4dGVudCkgbWZ0IHJlY29yZCB0byB3cml0ZQorICogQHN5bmM6CWlmIHRydWUsIHdhaXQgZm9yIGkvbyBjb21wbGV0aW9uCisgKgorICogV3JpdGUgdGhlIG1hcHBlZCAoZXh0ZW50KSBtZnQgcmVjb3JkIEBtIGRlc2NyaWJlZCBieSB0aGUgKHJlZ3VsYXIgb3IgZXh0ZW50KQorICogbnRmcyBpbm9kZSBAbmkgdG8gYmFja2luZyBzdG9yZS4gIElmIHRoZSBtZnQgcmVjb3JkIEBtIGhhcyBhIGNvdW50ZXJwYXJ0IGluCisgKiB0aGUgbWZ0IG1pcnJvciwgdGhhdCBpcyBhbHNvIHVwZGF0ZWQuCisgKgorICogV2Ugb25seSB3cml0ZSB0aGUgbWZ0IHJlY29yZCBpZiB0aGUgbnRmcyBpbm9kZSBAbmkgaXMgZGlydHkgYW5kIHRoZSBmaXJzdAorICogYnVmZmVyIGJlbG9uZ2luZyB0byBpdHMgbWZ0IHJlY29yZCBpcyBkaXJ0eSwgdG9vLiAgV2UgaWdub3JlIHRoZSBkaXJ0eSBzdGF0ZQorICogb2Ygc3Vic2VxdWVudCBidWZmZXJzIGJlY2F1c2Ugd2UgY291bGQgaGF2ZSByYWNlZCB3aXRoCisgKiBmcy9udGZzL2FvcHMuYzo6bWFya19udGZzX3JlY29yZF9kaXJ0eSgpLgorICoKKyAqIE9uIHN1Y2Nlc3MsIGNsZWFuIHRoZSBtZnQgcmVjb3JkIGFuZCByZXR1cm4gMC4gIE9uIGVycm9yLCBsZWF2ZSB0aGUgbWZ0CisgKiByZWNvcmQgZGlydHkgYW5kIHJldHVybiAtZXJybm8uICBUaGUgY2FsbGVyIHNob3VsZCBjYWxsIG1ha2VfYmFkX2lub2RlKCkgb24KKyAqIHRoZSBiYXNlIGlub2RlIHRvIGVuc3VyZSBubyBtb3JlIGFjY2VzcyBoYXBwZW5zIHRvIHRoaXMgaW5vZGUuICBXZSBkbyBub3QgZG8KKyAqIGl0IGhlcmUgYXMgdGhlIGNhbGxlciBtYXkgd2FudCB0byBmaW5pc2ggd3JpdGluZyBvdGhlciBleHRlbnQgbWZ0IHJlY29yZHMKKyAqIGZpcnN0IHRvIG1pbmltaXplIG9uLWRpc2sgbWV0YWRhdGEgaW5jb25zaXN0ZW5jaWVzLgorICoKKyAqIE5PVEU6ICBXZSBhbHdheXMgcGVyZm9ybSBzeW5jaHJvbm91cyBpL28gYW5kIGlnbm9yZSB0aGUgQHN5bmMgcGFyYW1ldGVyLgorICogSG93ZXZlciwgaWYgdGhlIG1mdCByZWNvcmQgaGFzIGEgY291bnRlcnBhcnQgaW4gdGhlIG1mdCBtaXJyb3IgYW5kIEBzeW5jIGlzCisgKiB0cnVlLCB3ZSB3cml0ZSB0aGUgbWZ0IHJlY29yZCwgd2FpdCBmb3IgaS9vIGNvbXBsZXRpb24sIGFuZCBvbmx5IHRoZW4gd3JpdGUKKyAqIHRoZSBtZnQgbWlycm9yIGNvcHkuICBUaGlzIGVuc3VyZXMgdGhhdCBpZiB0aGUgc3lzdGVtIGNyYXNoZXMgZWl0aGVyIHRoZSBtZnQKKyAqIG9yIHRoZSBtZnQgbWlycm9yIHdpbGwgY29udGFpbiBhIHNlbGYtY29uc2lzdGVudCBtZnQgcmVjb3JkIEBtLiAgSWYgQHN5bmMgaXMKKyAqIGZhbHNlIG9uIHRoZSBvdGhlciBoYW5kLCB3ZSBzdGFydCBpL28gb24gYm90aCBhbmQgdGhlbiB3YWl0IGZvciBjb21wbGV0aW9uCisgKiBvbiB0aGVtLiAgVGhpcyBwcm92aWRlcyBhIHNwZWVkdXAgYnV0IG5vIGxvbmdlciBndWFyYW50ZWVzIHRoYXQgeW91IHdpbGwgZW5kCisgKiB1cCB3aXRoIGEgc2VsZi1jb25zaXN0ZW50IG1mdCByZWNvcmQgaW4gdGhlIGNhc2Ugb2YgYSBjcmFzaCBidXQgaWYgeW91IGFza2VkCisgKiBmb3IgYXN5bmNocm9ub3VzIHdyaXRpbmcgeW91IHByb2JhYmx5IGRvIG5vdCBjYXJlIGFib3V0IHRoYXQgYW55d2F5LgorICoKKyAqIFRPRE86ICBJZiBAc3luYyBpcyBmYWxzZSwgd2FudCB0byBkbyB0cnVseSBhc3luY2hyb25vdXMgaS9vLCBpLmUuIGp1c3QKKyAqIHNjaGVkdWxlIGkvbyB2aWEgLT53cml0ZXBhZ2Ugb3IgZG8gaXQgdmlhIGtudGZzZCBvciB3aGF0ZXZlci4KKyAqLworaW50IHdyaXRlX21mdF9yZWNvcmRfbm9sb2NrKG50ZnNfaW5vZGUgKm5pLCBNRlRfUkVDT1JEICptLCBpbnQgc3luYykKK3sKKwludGZzX3ZvbHVtZSAqdm9sID0gbmktPnZvbDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IG5pLT5wYWdlOworCXVuc2lnbmVkIGNoYXIgYmxvY2tzaXplX2JpdHMgPSB2b2wtPm1mdF9pbm8tPmlfYmxrYml0czsKKwl1bnNpZ25lZCBpbnQgYmxvY2tzaXplID0gMSA8PCBibG9ja3NpemVfYml0czsKKwlpbnQgbWF4X2JocyA9IHZvbC0+bWZ0X3JlY29yZF9zaXplIC8gYmxvY2tzaXplOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmhzW21heF9iaHNdOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICpoZWFkOworCXJ1bmxpc3RfZWxlbWVudCAqcmw7CisJdW5zaWduZWQgaW50IGJsb2NrX3N0YXJ0LCBibG9ja19lbmQsIG1fc3RhcnQsIG1fZW5kOworCWludCBpX2JocywgbnJfYmhzLCBlcnIgPSAwOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIGlub2RlIDB4JWx4LiIsIG5pLT5tZnRfbm8pOworCUJVR19PTihOSW5vQXR0cihuaSkpOworCUJVR19PTighbWF4X2Jocyk7CisJQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKKwkvKgorCSAqIElmIHRoZSBudGZzX2lub2RlIGlzIGNsZWFuIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcuICBJZiBpdCBpcyBkaXJ0eSwKKwkgKiBtYXJrIGl0IGFzIGNsZWFuIG5vdyBzbyB0aGF0IGl0IGNhbiBiZSByZWRpcnRpZWQgbGF0ZXIgb24gaWYgbmVlZGVkLgorCSAqIFRoZXJlIGlzIG5vIGRhbmdlciBvZiByYWNlcyBzaW5jZSB0aGUgY2FsbGVyIGlzIGhvbGRpbmcgdGhlIGxvY2tzCisJICogZm9yIHRoZSBtZnQgcmVjb3JkIEBtIGFuZCB0aGUgcGFnZSBpdCBpcyBpbi4KKwkgKi8KKwlpZiAoIU5Jbm9UZXN0Q2xlYXJEaXJ0eShuaSkpCisJCWdvdG8gZG9uZTsKKwlCVUdfT04oIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpOworCWJoID0gaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwlCVUdfT04oIWJoKTsKKwlybCA9IE5VTEw7CisJbnJfYmhzID0gMDsKKwlibG9ja19zdGFydCA9IDA7CisJbV9zdGFydCA9IG5pLT5wYWdlX29mczsKKwltX2VuZCA9IG1fc3RhcnQgKyB2b2wtPm1mdF9yZWNvcmRfc2l6ZTsKKwlkbyB7CisJCWJsb2NrX2VuZCA9IGJsb2NrX3N0YXJ0ICsgYmxvY2tzaXplOworCQkvKiBJZiB0aGUgYnVmZmVyIGlzIG91dHNpZGUgdGhlIG1mdCByZWNvcmQsIHNraXAgaXQuICovCisJCWlmIChibG9ja19lbmQgPD0gbV9zdGFydCkKKwkJCWNvbnRpbnVlOworCQlpZiAodW5saWtlbHkoYmxvY2tfc3RhcnQgPj0gbV9lbmQpKQorCQkJYnJlYWs7CisJCS8qCisJCSAqIElmIHRoaXMgYmxvY2sgaXMgbm90IHRoZSBmaXJzdCBvbmUgaW4gdGhlIHJlY29yZCwgd2UgaWdub3JlCisJCSAqIHRoZSBidWZmZXIncyBkaXJ0eSBzdGF0ZSBiZWNhdXNlIHdlIGNvdWxkIGhhdmUgcmFjZWQgd2l0aCBhCisJCSAqIHBhcmFsbGVsIG1hcmtfbnRmc19yZWNvcmRfZGlydHkoKS4KKwkJICovCisJCWlmIChibG9ja19zdGFydCA9PSBtX3N0YXJ0KSB7CisJCQkvKiBUaGlzIGJsb2NrIGlzIHRoZSBmaXJzdCBvbmUgaW4gdGhlIHJlY29yZC4gKi8KKwkJCWlmICghYnVmZmVyX2RpcnR5KGJoKSkgeworCQkJCUJVR19PTihucl9iaHMpOworCQkJCS8qIENsZWFuIHJlY29yZHMgYXJlIG5vdCB3cml0dGVuIG91dC4gKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkvKiBOZWVkIHRvIG1hcCB0aGUgYnVmZmVyIGlmIGl0IGlzIG5vdCBtYXBwZWQgYWxyZWFkeS4gKi8KKwkJaWYgKHVubGlrZWx5KCFidWZmZXJfbWFwcGVkKGJoKSkpIHsKKwkJCVZDTiB2Y247CisJCQlMQ04gbGNuOworCQkJdW5zaWduZWQgaW50IHZjbl9vZnM7CisKKwkJCS8qIE9idGFpbiB0aGUgdmNuIGFuZCBvZmZzZXQgb2YgdGhlIGN1cnJlbnQgYmxvY2suICovCisJCQl2Y24gPSAoKFZDTiluaS0+bWZ0X25vIDw8IHZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHMpICsKKwkJCQkJKGJsb2NrX3N0YXJ0IC0gbV9zdGFydCk7CisJCQl2Y25fb2ZzID0gdmNuICYgdm9sLT5jbHVzdGVyX3NpemVfbWFzazsKKwkJCXZjbiA+Pj0gdm9sLT5jbHVzdGVyX3NpemVfYml0czsKKwkJCWlmICghcmwpIHsKKwkJCQlkb3duX3JlYWQoJk5URlNfSSh2b2wtPm1mdF9pbm8pLT5ydW5saXN0LmxvY2spOworCQkJCXJsID0gTlRGU19JKHZvbC0+bWZ0X2lubyktPnJ1bmxpc3Qucmw7CisJCQkJQlVHX09OKCFybCk7CisJCQl9CisJCQkvKiBTZWVrIHRvIGVsZW1lbnQgY29udGFpbmluZyB0YXJnZXQgdmNuLiAqLworCQkJd2hpbGUgKHJsLT5sZW5ndGggJiYgcmxbMV0udmNuIDw9IHZjbikKKwkJCQlybCsrOworCQkJbGNuID0gbnRmc19ybF92Y25fdG9fbGNuKHJsLCB2Y24pOworCQkJLyogRm9yICRNRlQsIG9ubHkgbGNuID49IDAgaXMgYSBzdWNjZXNzZnVsIHJlbWFwLiAqLworCQkJaWYgKGxpa2VseShsY24gPj0gMCkpIHsKKwkJCQkvKiBTZXR1cCBidWZmZXIgaGVhZCB0byBjb3JyZWN0IGJsb2NrLiAqLworCQkJCWJoLT5iX2Jsb2NrbnIgPSAoKGxjbiA8PAorCQkJCQkJdm9sLT5jbHVzdGVyX3NpemVfYml0cykgKworCQkJCQkJdmNuX29mcykgPj4gYmxvY2tzaXplX2JpdHM7CisJCQkJc2V0X2J1ZmZlcl9tYXBwZWQoYmgpOworCQkJfSBlbHNlIHsKKwkJCQliaC0+Yl9ibG9ja25yID0gLTE7CisJCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiQ2Fubm90IHdyaXRlIG1mdCByZWNvcmQgIgorCQkJCQkJIjB4JWx4IGJlY2F1c2UgaXRzIGxvY2F0aW9uICIKKwkJCQkJCSJvbiBkaXNrIGNvdWxkIG5vdCBiZSAiCisJCQkJCQkiZGV0ZXJtaW5lZCAoZXJyb3IgY29kZSAlbGxpKS4iLAorCQkJCQkJbmktPm1mdF9ubywgKGxvbmcgbG9uZylsY24pOworCQkJCWVyciA9IC1FSU87CisJCQl9CisJCX0KKwkJQlVHX09OKCFidWZmZXJfdXB0b2RhdGUoYmgpKTsKKwkJQlVHX09OKCFucl9iaHMgJiYgKG1fc3RhcnQgIT0gYmxvY2tfc3RhcnQpKTsKKwkJQlVHX09OKG5yX2JocyA+PSBtYXhfYmhzKTsKKwkJYmhzW25yX2JocysrXSA9IGJoOworCQlCVUdfT04oKG5yX2JocyA+PSBtYXhfYmhzKSAmJiAobV9lbmQgIT0gYmxvY2tfZW5kKSk7CisJfSB3aGlsZSAoYmxvY2tfc3RhcnQgPSBibG9ja19lbmQsIChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CisJaWYgKHVubGlrZWx5KHJsKSkKKwkJdXBfcmVhZCgmTlRGU19JKHZvbC0+bWZ0X2lubyktPnJ1bmxpc3QubG9jayk7CisJaWYgKCFucl9iaHMpCisJCWdvdG8gZG9uZTsKKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJZ290byBjbGVhbnVwX291dDsKKwkvKiBBcHBseSB0aGUgbXN0IHByb3RlY3Rpb24gZml4dXBzLiAqLworCWVyciA9IHByZV93cml0ZV9tc3RfZml4dXAoKE5URlNfUkVDT1JEKiltLCB2b2wtPm1mdF9yZWNvcmRfc2l6ZSk7CisJaWYgKGVycikgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gYXBwbHkgbXN0IGZpeHVwcyEiKTsKKwkJZ290byBjbGVhbnVwX291dDsKKwl9CisJZmx1c2hfZGNhY2hlX21mdF9yZWNvcmRfcGFnZShuaSk7CisJLyogTG9jayBidWZmZXJzIGFuZCBzdGFydCBzeW5jaHJvbm91cyB3cml0ZSBpL28gb24gdGhlbS4gKi8KKwlmb3IgKGlfYmhzID0gMDsgaV9iaHMgPCBucl9iaHM7IGlfYmhzKyspIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICp0YmggPSBiaHNbaV9iaHNdOworCisJCWlmICh1bmxpa2VseSh0ZXN0X3NldF9idWZmZXJfbG9ja2VkKHRiaCkpKQorCQkJQlVHKCk7CisJCUJVR19PTighYnVmZmVyX3VwdG9kYXRlKHRiaCkpOworCQljbGVhcl9idWZmZXJfZGlydHkodGJoKTsKKwkJZ2V0X2JoKHRiaCk7CisJCXRiaC0+Yl9lbmRfaW8gPSBlbmRfYnVmZmVyX3dyaXRlX3N5bmM7CisJCXN1Ym1pdF9iaChXUklURSwgdGJoKTsKKwl9CisJLyogU3luY2hyb25pemUgdGhlIG1mdCBtaXJyb3Igbm93IGlmIG5vdCBAc3luYy4gKi8KKwlpZiAoIXN5bmMgJiYgbmktPm1mdF9ubyA8IHZvbC0+bWZ0bWlycl9zaXplKQorCQludGZzX3N5bmNfbWZ0X21pcnJvcih2b2wsIG5pLT5tZnRfbm8sIG0sIHN5bmMpOworCS8qIFdhaXQgb24gaS9vIGNvbXBsZXRpb24gb2YgYnVmZmVycy4gKi8KKwlmb3IgKGlfYmhzID0gMDsgaV9iaHMgPCBucl9iaHM7IGlfYmhzKyspIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICp0YmggPSBiaHNbaV9iaHNdOworCisJCXdhaXRfb25fYnVmZmVyKHRiaCk7CisJCWlmICh1bmxpa2VseSghYnVmZmVyX3VwdG9kYXRlKHRiaCkpKSB7CisJCQllcnIgPSAtRUlPOworCQkJLyoKKwkJCSAqIFNldCB0aGUgYnVmZmVyIHVwdG9kYXRlIHNvIHRoZSBwYWdlIGFuZCBidWZmZXIKKwkJCSAqIHN0YXRlcyBkbyBub3QgYmVjb21lIG91dCBvZiBzeW5jLgorCQkJICovCisJCQlpZiAoUGFnZVVwdG9kYXRlKHBhZ2UpKQorCQkJCXNldF9idWZmZXJfdXB0b2RhdGUodGJoKTsKKwkJfQorCX0KKwkvKiBJZiBAc3luYywgbm93IHN5bmNocm9uaXplIHRoZSBtZnQgbWlycm9yLiAqLworCWlmIChzeW5jICYmIG5pLT5tZnRfbm8gPCB2b2wtPm1mdG1pcnJfc2l6ZSkKKwkJbnRmc19zeW5jX21mdF9taXJyb3Iodm9sLCBuaS0+bWZ0X25vLCBtLCBzeW5jKTsKKwkvKiBSZW1vdmUgdGhlIG1zdCBwcm90ZWN0aW9uIGZpeHVwcyBhZ2Fpbi4gKi8KKwlwb3N0X3dyaXRlX21zdF9maXh1cCgoTlRGU19SRUNPUkQqKW0pOworCWZsdXNoX2RjYWNoZV9tZnRfcmVjb3JkX3BhZ2UobmkpOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCS8qIEkvTyBlcnJvciBkdXJpbmcgd3JpdGluZy4gIFRoaXMgaXMgcmVhbGx5IGJhZCEgKi8KKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiSS9PIGVycm9yIHdoaWxlIHdyaXRpbmcgbWZ0IHJlY29yZCAiCisJCQkJIjB4JWx4ISAgTWFya2luZyBiYXNlIGlub2RlIGFzIGJhZC4gIFlvdSAiCisJCQkJInNob3VsZCB1bm1vdW50IHRoZSB2b2x1bWUgYW5kIHJ1biBjaGtkc2suIiwKKwkJCQluaS0+bWZ0X25vKTsKKwkJZ290byBlcnJfb3V0OworCX0KK2RvbmU6CisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gMDsKK2NsZWFudXBfb3V0OgorCS8qIENsZWFuIHRoZSBidWZmZXJzLiAqLworCWZvciAoaV9iaHMgPSAwOyBpX2JocyA8IG5yX2JoczsgaV9iaHMrKykKKwkJY2xlYXJfYnVmZmVyX2RpcnR5KGJoc1tpX2Joc10pOworZXJyX291dDoKKwkvKgorCSAqIEN1cnJlbnQgc3RhdGU6IGFsbCBidWZmZXJzIGFyZSBjbGVhbiwgdW5sb2NrZWQsIGFuZCB1cHRvZGF0ZS4KKwkgKiBUaGUgY2FsbGVyIHNob3VsZCBtYXJrIHRoZSBiYXNlIGlub2RlIGFzIGJhZCBzbyB0aGF0IG5vIG1vcmUgaS9vCisJICogaGFwcGVucy4gIC0+Y2xlYXJfaW5vZGUoKSB3aWxsIHN0aWxsIGJlIGludm9rZWQgc28gYWxsIGV4dGVudCBpbm9kZXMKKwkgKiBhbmQgb3RoZXIgYWxsb2NhdGVkIG1lbW9yeSB3aWxsIGJlIGZyZWVkLgorCSAqLworCWlmIChlcnIgPT0gLUVOT01FTSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byB3cml0ZSBtZnQgcmVjb3JkLiAgIgorCQkJCSJSZWRpcnR5aW5nIHNvIHRoZSB3cml0ZSBpcyByZXRyaWVkIGxhdGVyLiIpOworCQltYXJrX21mdF9yZWNvcmRfZGlydHkobmkpOworCQllcnIgPSAwOworCX0gZWxzZQorCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBudGZzX21heV93cml0ZV9tZnRfcmVjb3JkIC0gY2hlY2sgaWYgYW4gbWZ0IHJlY29yZCBtYXkgYmUgd3JpdHRlbiBvdXQKKyAqIEB2b2w6CVtJTl0gIG50ZnMgdm9sdW1lIG9uIHdoaWNoIHRoZSBtZnQgcmVjb3JkIHRvIGNoZWNrIHJlc2lkZXMKKyAqIEBtZnRfbm86CVtJTl0gIG1mdCByZWNvcmQgbnVtYmVyIG9mIHRoZSBtZnQgcmVjb3JkIHRvIGNoZWNrCisgKiBAbToJCVtJTl0gIG1hcHBlZCBtZnQgcmVjb3JkIHRvIGNoZWNrCisgKiBAbG9ja2VkX25pOglbT1VUXSBjYWxsZXIgaGFzIHRvIHVubG9jayB0aGlzIG50ZnMgaW5vZGUgaWYgb25lIGlzIHJldHVybmVkCisgKgorICogQ2hlY2sgaWYgdGhlIG1hcHBlZCAoYmFzZSBvciBleHRlbnQpIG1mdCByZWNvcmQgQG0gd2l0aCBtZnQgcmVjb3JkIG51bWJlcgorICogQG1mdF9ubyBiZWxvbmdpbmcgdG8gdGhlIG50ZnMgdm9sdW1lIEB2b2wgbWF5IGJlIHdyaXR0ZW4gb3V0LiAgSWYgbmVjZXNzYXJ5CisgKiBhbmQgcG9zc2libGUgdGhlIG50ZnMgaW5vZGUgb2YgdGhlIG1mdCByZWNvcmQgaXMgbG9ja2VkIGFuZCB0aGUgYmFzZSB2ZnMKKyAqIGlub2RlIGlzIHBpbm5lZC4gIFRoZSBsb2NrZWQgbnRmcyBpbm9kZSBpcyB0aGVuIHJldHVybmVkIGluIEBsb2NrZWRfbmkuICBUaGUKKyAqIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgdW5sb2NraW5nIHRoZSBudGZzIGlub2RlIGFuZCB1bnBpbm5pbmcgdGhlIGJhc2UKKyAqIHZmcyBpbm9kZS4KKyAqCisgKiBSZXR1cm4gVFJVRSBpZiB0aGUgbWZ0IHJlY29yZCBtYXkgYmUgd3JpdHRlbiBvdXQgYW5kIEZBTFNFIGlmIG5vdC4KKyAqCisgKiBUaGUgY2FsbGVyIGhhcyBsb2NrZWQgdGhlIHBhZ2UgYW5kIGNsZWFyZWQgdGhlIHVwdG9kYXRlIGZsYWcgb24gaXQgd2hpY2gKKyAqIG1lYW5zIHRoYXQgd2UgY2FuIHNhZmVseSB3cml0ZSBvdXQgYW55IGRpcnR5IG1mdCByZWNvcmRzIHRoYXQgZG8gbm90IGhhdmUKKyAqIHRoZWlyIGlub2RlcyBpbiBpY2FjaGUgYXMgZGV0ZXJtaW5lZCBieSBpbG9va3VwNSgpIGFzIGFueW9uZQorICogb3BlbmluZy9jcmVhdGluZyBzdWNoIGFuIGlub2RlIHdvdWxkIGJsb2NrIHdoZW4gYXR0ZW1wdGluZyB0byBtYXAgdGhlIG1mdAorICogcmVjb3JkIGluIHJlYWRfY2FjaGVfcGFnZSgpIHVudGlsIHdlIGFyZSBmaW5pc2hlZCB3aXRoIHRoZSB3cml0ZSBvdXQuCisgKgorICogSGVyZSBpcyBhIGRlc2NyaXB0aW9uIG9mIHRoZSB0ZXN0cyB3ZSBwZXJmb3JtOgorICoKKyAqIElmIHRoZSBpbm9kZSBpcyBmb3VuZCBpbiBpY2FjaGUgd2Uga25vdyB0aGUgbWZ0IHJlY29yZCBtdXN0IGJlIGEgYmFzZSBtZnQKKyAqIHJlY29yZC4gIElmIGl0IGlzIGRpcnR5LCB3ZSBkbyBub3Qgd3JpdGUgaXQgYW5kIHJldHVybiBGQUxTRSBhcyB0aGUgdmZzCisgKiBpbm9kZSB3cml0ZSBwYXRocyB3aWxsIHJlc3VsdCBpbiB0aGUgYWNjZXNzIHRpbWVzIGJlaW5nIHVwZGF0ZWQgd2hpY2ggd291bGQKKyAqIGNhdXNlIHRoZSBiYXNlIG1mdCByZWNvcmQgdG8gYmUgcmVkaXJ0aWVkIGFuZCB3cml0dGVuIG91dCBhZ2Fpbi4gIChXZSBrbm93CisgKiB0aGUgYWNjZXNzIHRpbWUgdXBkYXRlIHdpbGwgbW9kaWZ5IHRoZSBiYXNlIG1mdCByZWNvcmQgYmVjYXVzZSBXaW5kb3dzCisgKiBjaGtkc2sgY29tcGxhaW5zIGlmIHRoZSBzdGFuZGFyZCBpbmZvcm1hdGlvbiBhdHRyaWJ1dGUgaXMgbm90IGluIHRoZSBiYXNlCisgKiBtZnQgcmVjb3JkLikKKyAqCisgKiBJZiB0aGUgaW5vZGUgaXMgaW4gaWNhY2hlIGFuZCBub3QgZGlydHksIHdlIGF0dGVtcHQgdG8gbG9jayB0aGUgbWZ0IHJlY29yZAorICogYW5kIGlmIHdlIGZpbmQgdGhlIGxvY2sgd2FzIGFscmVhZHkgdGFrZW4sIGl0IGlzIG5vdCBzYWZlIHRvIHdyaXRlIHRoZSBtZnQKKyAqIHJlY29yZCBhbmQgd2UgcmV0dXJuIEZBTFNFLgorICoKKyAqIElmIHdlIG1hbmFnZSB0byBvYnRhaW4gdGhlIGxvY2sgd2UgaGF2ZSBleGNsdXNpdmUgYWNjZXNzIHRvIHRoZSBtZnQgcmVjb3JkLAorICogd2hpY2ggYWxzbyBhbGxvd3MgdXMgc2FmZSB3cml0ZW91dCBvZiB0aGUgbWZ0IHJlY29yZC4gIFdlIHRoZW4gc2V0CisgKiBAbG9ja2VkX25pIHRvIHRoZSBsb2NrZWQgbnRmcyBpbm9kZSBhbmQgcmV0dXJuIFRSVUUuCisgKgorICogTm90ZSB3ZSBjYW5ub3QganVzdCBsb2NrIHRoZSBtZnQgcmVjb3JkIGFuZCBzbGVlcCB3aGlsZSB3YWl0aW5nIGZvciB0aGUgbG9jaworICogYmVjYXVzZSB0aGlzIHdvdWxkIGRlYWRsb2NrIGR1ZSB0byBsb2NrIHJldmVyc2FsIChub3JtYWxseSB0aGUgbWZ0IHJlY29yZCBpcworICogbG9ja2VkIGJlZm9yZSB0aGUgcGFnZSBpcyBsb2NrZWQgYnV0IHdlIGFscmVhZHkgaGF2ZSB0aGUgcGFnZSBsb2NrZWQgaGVyZQorICogd2hlbiB3ZSB0cnkgdG8gbG9jayB0aGUgbWZ0IHJlY29yZCkuCisgKgorICogSWYgdGhlIGlub2RlIGlzIG5vdCBpbiBpY2FjaGUgd2UgbmVlZCB0byBwZXJmb3JtIGZ1cnRoZXIgY2hlY2tzLgorICoKKyAqIElmIHRoZSBtZnQgcmVjb3JkIGlzIG5vdCBhIEZJTEUgcmVjb3JkIG9yIGl0IGlzIGEgYmFzZSBtZnQgcmVjb3JkLCB3ZSBjYW4KKyAqIHNhZmVseSB3cml0ZSBpdCBhbmQgcmV0dXJuIFRSVUUuCisgKgorICogV2Ugbm93IGtub3cgdGhlIG1mdCByZWNvcmQgaXMgYW4gZXh0ZW50IG1mdCByZWNvcmQuICBXZSBjaGVjayBpZiB0aGUgaW5vZGUKKyAqIGNvcnJlc3BvbmRpbmcgdG8gaXRzIGJhc2UgbWZ0IHJlY29yZCBpcyBpbiBpY2FjaGUgYW5kIG9idGFpbiBhIHJlZmVyZW5jZSB0bworICogaXQgaWYgaXQgaXMuICBJZiBpdCBpcyBub3QsIHdlIGNhbiBzYWZlbHkgd3JpdGUgaXQgYW5kIHJldHVybiBUUlVFLgorICoKKyAqIFdlIG5vdyBoYXZlIHRoZSBiYXNlIGlub2RlIGZvciB0aGUgZXh0ZW50IG1mdCByZWNvcmQuICBXZSBjaGVjayBpZiBpdCBoYXMgYW4KKyAqIG50ZnMgaW5vZGUgZm9yIHRoZSBleHRlbnQgbWZ0IHJlY29yZCBhdHRhY2hlZCBhbmQgaWYgbm90IGl0IGlzIHNhZmUgdG8gd3JpdGUKKyAqIHRoZSBleHRlbnQgbWZ0IHJlY29yZCBhbmQgd2UgcmV0dXJuIFRSVUUuCisgKgorICogVGhlIG50ZnMgaW5vZGUgZm9yIHRoZSBleHRlbnQgbWZ0IHJlY29yZCBpcyBhdHRhY2hlZCB0byB0aGUgYmFzZSBpbm9kZSBzbyB3ZQorICogYXR0ZW1wdCB0byBsb2NrIHRoZSBleHRlbnQgbWZ0IHJlY29yZCBhbmQgaWYgd2UgZmluZCB0aGUgbG9jayB3YXMgYWxyZWFkeQorICogdGFrZW4sIGl0IGlzIG5vdCBzYWZlIHRvIHdyaXRlIHRoZSBleHRlbnQgbWZ0IHJlY29yZCBhbmQgd2UgcmV0dXJuIEZBTFNFLgorICoKKyAqIElmIHdlIG1hbmFnZSB0byBvYnRhaW4gdGhlIGxvY2sgd2UgaGF2ZSBleGNsdXNpdmUgYWNjZXNzIHRvIHRoZSBleHRlbnQgbWZ0CisgKiByZWNvcmQsIHdoaWNoIGFsc28gYWxsb3dzIHVzIHNhZmUgd3JpdGVvdXQgb2YgdGhlIGV4dGVudCBtZnQgcmVjb3JkLiAgV2UKKyAqIHNldCB0aGUgbnRmcyBpbm9kZSBvZiB0aGUgZXh0ZW50IG1mdCByZWNvcmQgY2xlYW4gYW5kIHRoZW4gc2V0IEBsb2NrZWRfbmkgdG8KKyAqIHRoZSBub3cgbG9ja2VkIG50ZnMgaW5vZGUgYW5kIHJldHVybiBUUlVFLgorICoKKyAqIE5vdGUsIHRoZSByZWFzb24gZm9yIGFjdHVhbGx5IHdyaXRpbmcgZGlydHkgbWZ0IHJlY29yZHMgaGVyZSBhbmQgbm90IGp1c3QKKyAqIHJlbHlpbmcgb24gdGhlIHZmcyBpbm9kZSBkaXJ0eSBjb2RlIHBhdGhzIGlzIHRoYXQgd2UgY2FuIGhhdmUgbWZ0IHJlY29yZHMKKyAqIG1vZGlmaWVkIHdpdGhvdXQgdGhlbSBldmVyIGhhdmluZyBhY3R1YWwgaW5vZGVzIGluIG1lbW9yeS4gIEFsc28gd2UgY2FuIGhhdmUKKyAqIGRpcnR5IG1mdCByZWNvcmRzIHdpdGggY2xlYW4gbnRmcyBpbm9kZXMgaW4gbWVtb3J5LiAgTm9uZSBvZiB0aGUgZGVzY3JpYmVkCisgKiBjYXNlcyB3b3VsZCByZXN1bHQgaW4gdGhlIGRpcnR5IG1mdCByZWNvcmRzIGJlaW5nIHdyaXR0ZW4gb3V0IGlmIHdlIG9ubHkKKyAqIHJlbGllZCBvbiB0aGUgdmZzIGlub2RlIGRpcnR5IGNvZGUgcGF0aHMuICBBbmQgdGhlc2UgY2FzZXMgY2FuIHJlYWxseSBvY2N1cgorICogZHVyaW5nIGFsbG9jYXRpb24gb2YgbmV3IG1mdCByZWNvcmRzIGFuZCBpbiBwYXJ0aWN1bGFyIHdoZW4gdGhlCisgKiBpbml0aWFsaXplZF9zaXplIG9mIHRoZSAkTUZULyREQVRBIGF0dHJpYnV0ZSBpcyBleHRlbmRlZCBhbmQgdGhlIG5ldyBzcGFjZQorICogaXMgaW5pdGlhbGl6ZWQgdXNpbmcgbnRmc19tZnRfcmVjb3JkX2Zvcm1hdCgpLiAgVGhlIGNsZWFuIGlub2RlIGNhbiB0aGVuCisgKiBhcHBlYXIgaWYgdGhlIG1mdCByZWNvcmQgaXMgcmV1c2VkIGZvciBhIG5ldyBpbm9kZSBiZWZvcmUgaXQgZ290IHdyaXR0ZW4KKyAqIG91dC4KKyAqLworQk9PTCBudGZzX21heV93cml0ZV9tZnRfcmVjb3JkKG50ZnNfdm9sdW1lICp2b2wsIGNvbnN0IHVuc2lnbmVkIGxvbmcgbWZ0X25vLAorCQljb25zdCBNRlRfUkVDT1JEICptLCBudGZzX2lub2RlICoqbG9ja2VkX25pKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSB2b2wtPnNiOworCXN0cnVjdCBpbm9kZSAqbWZ0X3ZpID0gdm9sLT5tZnRfaW5vOworCXN0cnVjdCBpbm9kZSAqdmk7CisJbnRmc19pbm9kZSAqbmksICplbmksICoqZXh0ZW50X25pczsKKwlpbnQgaTsKKwludGZzX2F0dHIgbmE7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3IgaW5vZGUgMHglbHguIiwgbWZ0X25vKTsKKwkvKgorCSAqIE5vcm1hbGx5IHdlIGRvIG5vdCByZXR1cm4gYSBsb2NrZWQgaW5vZGUgc28gc2V0IEBsb2NrZWRfbmkgdG8gTlVMTC4KKwkgKi8KKwlCVUdfT04oIWxvY2tlZF9uaSk7CisJKmxvY2tlZF9uaSA9IE5VTEw7CisJLyoKKwkgKiBDaGVjayBpZiB0aGUgaW5vZGUgY29ycmVzcG9uZGluZyB0byB0aGlzIG1mdCByZWNvcmQgaXMgaW4gdGhlIFZGUworCSAqIGlub2RlIGNhY2hlIGFuZCBvYnRhaW4gYSByZWZlcmVuY2UgdG8gaXQgaWYgaXQgaXMuCisJICovCisJbnRmc19kZWJ1ZygiTG9va2luZyBmb3IgaW5vZGUgMHglbHggaW4gaWNhY2hlLiIsIG1mdF9ubyk7CisJbmEubWZ0X25vID0gbWZ0X25vOworCW5hLm5hbWUgPSBOVUxMOworCW5hLm5hbWVfbGVuID0gMDsKKwluYS50eXBlID0gQVRfVU5VU0VEOworCS8qCisJICogRm9yIGlub2RlIDAsIGkuZS4gJE1GVCBpdHNlbGYsIHdlIGNhbm5vdCB1c2UgaWxvb2t1cDUoKSBmcm9tIGhlcmUgb3IKKwkgKiB3ZSBkZWFkbG9jayBiZWNhdXNlIHRoZSBpbm9kZSBpcyBhbHJlYWR5IGxvY2tlZCBieSB0aGUga2VybmVsCisJICogKGZzL2ZzLXdyaXRlYmFjay5jOjpfX3N5bmNfc2luZ2xlX2lub2RlKCkpIGFuZCBpbG9va3VwNSgpIHdhaXRzCisJICogdW50aWwgdGhlIGlub2RlIGlzIHVubG9ja2VkIGJlZm9yZSByZXR1cm5pbmcgaXQgYW5kIGl0IG5ldmVyIGdldHMKKwkgKiB1bmxvY2tlZCBiZWNhdXNlIG50ZnNfc2hvdWxkX3dyaXRlX21mdF9yZWNvcmQoKSBuZXZlciByZXR1cm5zLiAgKS06CisJICogRm9ydHVuYXRlbHksIHdlIGhhdmUgaW5vZGUgMCBwaW5uZWQgaW4gaWNhY2hlIGZvciB0aGUgZHVyYXRpb24gb2YKKwkgKiB0aGUgbW91bnQgc28gd2UgY2FuIGFjY2VzcyBpdCBkaXJlY3RseS4KKwkgKi8KKwlpZiAoIW1mdF9ubykgeworCQkvKiBCYWxhbmNlIHRoZSBiZWxvdyBpcHV0KCkuICovCisJCXZpID0gaWdyYWIobWZ0X3ZpKTsKKwkJQlVHX09OKHZpICE9IG1mdF92aSk7CisJfSBlbHNlCisJCXZpID0gaWxvb2t1cDUoc2IsIG1mdF9ubywgKHRlc3RfdCludGZzX3Rlc3RfaW5vZGUsICZuYSk7CisJaWYgKHZpKSB7CisJCW50ZnNfZGVidWcoIkJhc2UgaW5vZGUgMHglbHggaXMgaW4gaWNhY2hlLiIsIG1mdF9ubyk7CisJCS8qIFRoZSBpbm9kZSBpcyBpbiBpY2FjaGUuICovCisJCW5pID0gTlRGU19JKHZpKTsKKwkJLyogVGFrZSBhIHJlZmVyZW5jZSB0byB0aGUgbnRmcyBpbm9kZS4gKi8KKwkJYXRvbWljX2luYygmbmktPmNvdW50KTsKKwkJLyogSWYgdGhlIGlub2RlIGlzIGRpcnR5LCBkbyBub3Qgd3JpdGUgdGhpcyByZWNvcmQuICovCisJCWlmIChOSW5vRGlydHkobmkpKSB7CisJCQludGZzX2RlYnVnKCJJbm9kZSAweCVseCBpcyBkaXJ0eSwgZG8gbm90IHdyaXRlIGl0LiIsCisJCQkJCW1mdF9ubyk7CisJCQlhdG9taWNfZGVjKCZuaS0+Y291bnQpOworCQkJaXB1dCh2aSk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwkJbnRmc19kZWJ1ZygiSW5vZGUgMHglbHggaXMgbm90IGRpcnR5LiIsIG1mdF9ubyk7CisJCS8qIFRoZSBpbm9kZSBpcyBub3QgZGlydHksIHRyeSB0byB0YWtlIHRoZSBtZnQgcmVjb3JkIGxvY2suICovCisJCWlmICh1bmxpa2VseShkb3duX3RyeWxvY2soJm5pLT5tcmVjX2xvY2spKSkgeworCQkJbnRmc19kZWJ1ZygiTWZ0IHJlY29yZCAweCVseCBpcyBhbHJlYWR5IGxvY2tlZCwgZG8gIgorCQkJCQkibm90IHdyaXRlIGl0LiIsIG1mdF9ubyk7CisJCQlhdG9taWNfZGVjKCZuaS0+Y291bnQpOworCQkJaXB1dCh2aSk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwkJbnRmc19kZWJ1ZygiTWFuYWdlZCB0byBsb2NrIG1mdCByZWNvcmQgMHglbHgsIHdyaXRlIGl0LiIsCisJCQkJbWZ0X25vKTsKKwkJLyoKKwkJICogVGhlIHdyaXRlIGhhcyB0byBvY2N1ciB3aGlsZSB3ZSBob2xkIHRoZSBtZnQgcmVjb3JkIGxvY2sgc28KKwkJICogcmV0dXJuIHRoZSBsb2NrZWQgbnRmcyBpbm9kZS4KKwkJICovCisJCSpsb2NrZWRfbmkgPSBuaTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCW50ZnNfZGVidWcoIklub2RlIDB4JWx4IGlzIG5vdCBpbiBpY2FjaGUuIiwgbWZ0X25vKTsKKwkvKiBUaGUgaW5vZGUgaXMgbm90IGluIGljYWNoZS4gKi8KKwkvKiBXcml0ZSB0aGUgcmVjb3JkIGlmIGl0IGlzIG5vdCBhIG1mdCByZWNvcmQgKHR5cGUgIkZJTEUiKS4gKi8KKwlpZiAoIW50ZnNfaXNfbWZ0X3JlY29yZChtLT5tYWdpYykpIHsKKwkJbnRmc19kZWJ1ZygiTWZ0IHJlY29yZCAweCVseCBpcyBub3QgYSBGSUxFIHJlY29yZCwgd3JpdGUgaXQuIiwKKwkJCQltZnRfbm8pOworCQlyZXR1cm4gVFJVRTsKKwl9CisJLyogV3JpdGUgdGhlIG1mdCByZWNvcmQgaWYgaXQgaXMgYSBiYXNlIGlub2RlLiAqLworCWlmICghbS0+YmFzZV9tZnRfcmVjb3JkKSB7CisJCW50ZnNfZGVidWcoIk1mdCByZWNvcmQgMHglbHggaXMgYSBiYXNlIHJlY29yZCwgd3JpdGUgaXQuIiwKKwkJCQltZnRfbm8pOworCQlyZXR1cm4gVFJVRTsKKwl9CisJLyoKKwkgKiBUaGlzIGlzIGFuIGV4dGVudCBtZnQgcmVjb3JkLiAgQ2hlY2sgaWYgdGhlIGlub2RlIGNvcnJlc3BvbmRpbmcgdG8KKwkgKiBpdHMgYmFzZSBtZnQgcmVjb3JkIGlzIGluIGljYWNoZSBhbmQgb2J0YWluIGEgcmVmZXJlbmNlIHRvIGl0IGlmIGl0CisJICogaXMuCisJICovCisJbmEubWZ0X25vID0gTVJFRl9MRShtLT5iYXNlX21mdF9yZWNvcmQpOworCW50ZnNfZGVidWcoIk1mdCByZWNvcmQgMHglbHggaXMgYW4gZXh0ZW50IHJlY29yZC4gIExvb2tpbmcgZm9yIGJhc2UgIgorCQkJImlub2RlIDB4JWx4IGluIGljYWNoZS4iLCBtZnRfbm8sIG5hLm1mdF9ubyk7CisJdmkgPSBpbG9va3VwNShzYiwgbmEubWZ0X25vLCAodGVzdF90KW50ZnNfdGVzdF9pbm9kZSwgJm5hKTsKKwlpZiAoIXZpKSB7CisJCS8qCisJCSAqIFRoZSBiYXNlIGlub2RlIGlzIG5vdCBpbiBpY2FjaGUsIHdyaXRlIHRoaXMgZXh0ZW50IG1mdAorCQkgKiByZWNvcmQuCisJCSAqLworCQludGZzX2RlYnVnKCJCYXNlIGlub2RlIDB4JWx4IGlzIG5vdCBpbiBpY2FjaGUsIHdyaXRlIHRoZSAiCisJCQkJImV4dGVudCByZWNvcmQuIiwgbmEubWZ0X25vKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCW50ZnNfZGVidWcoIkJhc2UgaW5vZGUgMHglbHggaXMgaW4gaWNhY2hlLiIsIG5hLm1mdF9ubyk7CisJLyoKKwkgKiBUaGUgYmFzZSBpbm9kZSBpcyBpbiBpY2FjaGUuICBDaGVjayBpZiBpdCBoYXMgdGhlIGV4dGVudCBpbm9kZQorCSAqIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBleHRlbnQgbWZ0IHJlY29yZCBhdHRhY2hlZC4KKwkgKi8KKwluaSA9IE5URlNfSSh2aSk7CisJZG93bigmbmktPmV4dGVudF9sb2NrKTsKKwlpZiAobmktPm5yX2V4dGVudHMgPD0gMCkgeworCQkvKgorCQkgKiBUaGUgYmFzZSBpbm9kZSBoYXMgbm8gYXR0YWNoZWQgZXh0ZW50IGlub2Rlcywgd3JpdGUgdGhpcworCQkgKiBleHRlbnQgbWZ0IHJlY29yZC4KKwkJICovCisJCXVwKCZuaS0+ZXh0ZW50X2xvY2spOworCQlpcHV0KHZpKTsKKwkJbnRmc19kZWJ1ZygiQmFzZSBpbm9kZSAweCVseCBoYXMgbm8gYXR0YWNoZWQgZXh0ZW50IGlub2RlcywgIgorCQkJCSJ3cml0ZSB0aGUgZXh0ZW50IHJlY29yZC4iLCBuYS5tZnRfbm8pOworCQlyZXR1cm4gVFJVRTsKKwl9CisJLyogSXRlcmF0ZSBvdmVyIHRoZSBhdHRhY2hlZCBleHRlbnQgaW5vZGVzLiAqLworCWV4dGVudF9uaXMgPSBuaS0+ZXh0LmV4dGVudF9udGZzX2lub3M7CisJZm9yIChlbmkgPSBOVUxMLCBpID0gMDsgaSA8IG5pLT5ucl9leHRlbnRzOyArK2kpIHsKKwkJaWYgKG1mdF9ubyA9PSBleHRlbnRfbmlzW2ldLT5tZnRfbm8pIHsKKwkJCS8qCisJCQkgKiBGb3VuZCB0aGUgZXh0ZW50IGlub2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBleHRlbnQKKwkJCSAqIG1mdCByZWNvcmQuCisJCQkgKi8KKwkJCWVuaSA9IGV4dGVudF9uaXNbaV07CisJCQlicmVhazsKKwkJfQorCX0KKwkvKgorCSAqIElmIHRoZSBleHRlbnQgaW5vZGUgd2FzIG5vdCBhdHRhY2hlZCB0byB0aGUgYmFzZSBpbm9kZSwgd3JpdGUgdGhpcworCSAqIGV4dGVudCBtZnQgcmVjb3JkLgorCSAqLworCWlmICghZW5pKSB7CisJCXVwKCZuaS0+ZXh0ZW50X2xvY2spOworCQlpcHV0KHZpKTsKKwkJbnRmc19kZWJ1ZygiRXh0ZW50IGlub2RlIDB4JWx4IGlzIG5vdCBhdHRhY2hlZCB0byBpdHMgYmFzZSAiCisJCQkJImlub2RlIDB4JWx4LCB3cml0ZSB0aGUgZXh0ZW50IHJlY29yZC4iLAorCQkJCW1mdF9ubywgbmEubWZ0X25vKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCW50ZnNfZGVidWcoIkV4dGVudCBpbm9kZSAweCVseCBpcyBhdHRhY2hlZCB0byBpdHMgYmFzZSBpbm9kZSAweCVseC4iLAorCQkJbWZ0X25vLCBuYS5tZnRfbm8pOworCS8qIFRha2UgYSByZWZlcmVuY2UgdG8gdGhlIGV4dGVudCBudGZzIGlub2RlLiAqLworCWF0b21pY19pbmMoJmVuaS0+Y291bnQpOworCXVwKCZuaS0+ZXh0ZW50X2xvY2spOworCS8qCisJICogRm91bmQgdGhlIGV4dGVudCBpbm9kZSBjb3Jlc3BvbmRpbmcgdG8gdGhpcyBleHRlbnQgbWZ0IHJlY29yZC4KKwkgKiBUcnkgdG8gdGFrZSB0aGUgbWZ0IHJlY29yZCBsb2NrLgorCSAqLworCWlmICh1bmxpa2VseShkb3duX3RyeWxvY2soJmVuaS0+bXJlY19sb2NrKSkpIHsKKwkJYXRvbWljX2RlYygmZW5pLT5jb3VudCk7CisJCWlwdXQodmkpOworCQludGZzX2RlYnVnKCJFeHRlbnQgbWZ0IHJlY29yZCAweCVseCBpcyBhbHJlYWR5IGxvY2tlZCwgZG8gIgorCQkJCSJub3Qgd3JpdGUgaXQuIiwgbWZ0X25vKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwludGZzX2RlYnVnKCJNYW5hZ2VkIHRvIGxvY2sgZXh0ZW50IG1mdCByZWNvcmQgMHglbHgsIHdyaXRlIGl0LiIsCisJCQltZnRfbm8pOworCWlmIChOSW5vVGVzdENsZWFyRGlydHkoZW5pKSkKKwkJbnRmc19kZWJ1ZygiRXh0ZW50IGlub2RlIDB4JWx4IGlzIGRpcnR5LCBtYXJraW5nIGl0IGNsZWFuLiIsCisJCQkJbWZ0X25vKTsKKwkvKgorCSAqIFRoZSB3cml0ZSBoYXMgdG8gb2NjdXIgd2hpbGUgd2UgaG9sZCB0aGUgbWZ0IHJlY29yZCBsb2NrIHNvIHJldHVybgorCSAqIHRoZSBsb2NrZWQgZXh0ZW50IG50ZnMgaW5vZGUuCisJICovCisJKmxvY2tlZF9uaSA9IGVuaTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmVzID0gIiAgTGVhdmluZyBpbmNvbnNpc3RlbnQgbWV0YWRhdGEuICBVbm1vdW50IGFuZCBydW4gIgorCQkiY2hrZHNrLiI7CisKKy8qKgorICogbnRmc19tZnRfYml0bWFwX2ZpbmRfYW5kX2FsbG9jX2ZyZWVfcmVjX25vbG9jayAtIHNlZSBuYW1lCisgKiBAdm9sOgl2b2x1bWUgb24gd2hpY2ggdG8gc2VhcmNoIGZvciBhIGZyZWUgbWZ0IHJlY29yZAorICogQGJhc2Vfbmk6CW9wZW4gYmFzZSBpbm9kZSBpZiBhbGxvY2F0aW5nIGFuIGV4dGVudCBtZnQgcmVjb3JkIG9yIE5VTEwKKyAqCisgKiBTZWFyY2ggZm9yIGEgZnJlZSBtZnQgcmVjb3JkIGluIHRoZSBtZnQgYml0bWFwIGF0dHJpYnV0ZSBvbiB0aGUgbnRmcyB2b2x1bWUKKyAqIEB2b2wuCisgKgorICogSWYgQGJhc2VfbmkgaXMgTlVMTCBzdGFydCB0aGUgc2VhcmNoIGF0IHRoZSBkZWZhdWx0IGFsbG9jYXRvciBwb3NpdGlvbi4KKyAqCisgKiBJZiBAYmFzZV9uaSBpcyBub3QgTlVMTCBzdGFydCB0aGUgc2VhcmNoIGF0IHRoZSBtZnQgcmVjb3JkIGFmdGVyIHRoZSBiYXNlCisgKiBtZnQgcmVjb3JkIEBiYXNlX25pLgorICoKKyAqIFJldHVybiB0aGUgZnJlZSBtZnQgcmVjb3JkIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4gIEFuIGVycm9yIGNvZGUgb2YKKyAqIC1FTk9TUEMgbWVhbnMgdGhhdCB0aGVyZSBhcmUgbm8gZnJlZSBtZnQgcmVjb3JkcyBpbiB0aGUgY3VycmVudGx5CisgKiBpbml0aWFsaXplZCBtZnQgYml0bWFwLgorICoKKyAqIExvY2tpbmc6IENhbGxlciBtdXN0IGhvbGQgdm9sLT5tZnRibXBfbG9jayBmb3Igd3JpdGluZy4KKyAqLworc3RhdGljIGludCBudGZzX21mdF9iaXRtYXBfZmluZF9hbmRfYWxsb2NfZnJlZV9yZWNfbm9sb2NrKG50ZnNfdm9sdW1lICp2b2wsCisJCW50ZnNfaW5vZGUgKmJhc2VfbmkpCit7CisJczY0IHBhc3NfZW5kLCBsbCwgZGF0YV9wb3MsIHBhc3Nfc3RhcnQsIG9mcywgYml0OworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptZnRibXBfbWFwcGluZzsKKwl1OCAqYnVmLCAqYnl0ZTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bnNpZ25lZCBpbnQgcGFnZV9vZnMsIHNpemU7CisJdTggcGFzcywgYjsKKworCW50ZnNfZGVidWcoIlNlYXJjaGluZyBmb3IgZnJlZSBtZnQgcmVjb3JkIGluIHRoZSBjdXJyZW50bHkgIgorCQkJImluaXRpYWxpemVkIG1mdCBiaXRtYXAuIik7CisJbWZ0Ym1wX21hcHBpbmcgPSB2b2wtPm1mdGJtcF9pbm8tPmlfbWFwcGluZzsKKwkvKgorCSAqIFNldCB0aGUgZW5kIG9mIHRoZSBwYXNzIG1ha2luZyBzdXJlIHdlIGRvIG5vdCBvdmVyZmxvdyB0aGUgbWZ0CisJICogYml0bWFwLgorCSAqLworCXBhc3NfZW5kID0gTlRGU19JKHZvbC0+bWZ0X2lubyktPmFsbG9jYXRlZF9zaXplID4+CisJCQl2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzOworCWxsID0gTlRGU19JKHZvbC0+bWZ0Ym1wX2lubyktPmluaXRpYWxpemVkX3NpemUgPDwgMzsKKwlpZiAocGFzc19lbmQgPiBsbCkKKwkJcGFzc19lbmQgPSBsbDsKKwlwYXNzID0gMTsKKwlpZiAoIWJhc2VfbmkpCisJCWRhdGFfcG9zID0gdm9sLT5tZnRfZGF0YV9wb3M7CisJZWxzZQorCQlkYXRhX3BvcyA9IGJhc2VfbmktPm1mdF9ubyArIDE7CisJaWYgKGRhdGFfcG9zIDwgMjQpCisJCWRhdGFfcG9zID0gMjQ7CisJaWYgKGRhdGFfcG9zID49IHBhc3NfZW5kKSB7CisJCWRhdGFfcG9zID0gMjQ7CisJCXBhc3MgPSAyOworCQkvKiBUaGlzIGhhcHBlbnMgb24gYSBmcmVzaGx5IGZvcm1hdHRlZCB2b2x1bWUuICovCisJCWlmIChkYXRhX3BvcyA+PSBwYXNzX2VuZCkKKwkJCXJldHVybiAtRU5PU1BDOworCX0KKwlwYXNzX3N0YXJ0ID0gZGF0YV9wb3M7CisJbnRmc19kZWJ1ZygiU3RhcnRpbmcgYml0bWFwIHNlYXJjaDogcGFzcyAldSwgcGFzc19zdGFydCAweCVsbHgsICIKKwkJCSJwYXNzX2VuZCAweCVsbHgsIGRhdGFfcG9zIDB4JWxseC4iLCBwYXNzLAorCQkJKGxvbmcgbG9uZylwYXNzX3N0YXJ0LCAobG9uZyBsb25nKXBhc3NfZW5kLAorCQkJKGxvbmcgbG9uZylkYXRhX3Bvcyk7CisJLyogTG9vcCB1bnRpbCBhIGZyZWUgbWZ0IHJlY29yZCBpcyBmb3VuZC4gKi8KKwlmb3IgKDsgcGFzcyA8PSAyOykgeworCQkvKiBDYXAgc2l6ZSB0byBwYXNzX2VuZC4gKi8KKwkJb2ZzID0gZGF0YV9wb3MgPj4gMzsKKwkJcGFnZV9vZnMgPSBvZnMgJiB+UEFHRV9DQUNIRV9NQVNLOworCQlzaXplID0gUEFHRV9DQUNIRV9TSVpFIC0gcGFnZV9vZnM7CisJCWxsID0gKChwYXNzX2VuZCArIDcpID4+IDMpIC0gb2ZzOworCQlpZiAoc2l6ZSA+IGxsKQorCQkJc2l6ZSA9IGxsOworCQlzaXplIDw8PSAzOworCQkvKgorCQkgKiBJZiB3ZSBhcmUgc3RpbGwgd2l0aGluIHRoZSBhY3RpdmUgcGFzcywgc2VhcmNoIHRoZSBuZXh0IHBhZ2UKKwkJICogZm9yIGEgemVybyBiaXQuCisJCSAqLworCQlpZiAoc2l6ZSkgeworCQkJcGFnZSA9IG50ZnNfbWFwX3BhZ2UobWZ0Ym1wX21hcHBpbmcsCisJCQkJCW9mcyA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwkJCWlmICh1bmxpa2VseShJU19FUlIocGFnZSkpKSB7CisJCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHJlYWQgbWZ0ICIKKwkJCQkJCSJiaXRtYXAsIGFib3J0aW5nLiIpOworCQkJCXJldHVybiBQVFJfRVJSKHBhZ2UpOworCQkJfQorCQkJYnVmID0gKHU4KilwYWdlX2FkZHJlc3MocGFnZSkgKyBwYWdlX29mczsKKwkJCWJpdCA9IGRhdGFfcG9zICYgNzsKKwkJCWRhdGFfcG9zICY9IH43dWxsOworCQkJbnRmc19kZWJ1ZygiQmVmb3JlIGlubmVyIGZvciBsb29wOiBzaXplIDB4JXgsICIKKwkJCQkJImRhdGFfcG9zIDB4JWxseCwgYml0IDB4JWxseCIsIHNpemUsCisJCQkJCShsb25nIGxvbmcpZGF0YV9wb3MsIChsb25nIGxvbmcpYml0KTsKKwkJCWZvciAoOyBiaXQgPCBzaXplICYmIGRhdGFfcG9zICsgYml0IDwgcGFzc19lbmQ7CisJCQkJCWJpdCAmPSB+N3VsbCwgYml0ICs9IDgpIHsKKwkJCQlieXRlID0gYnVmICsgKGJpdCA+PiAzKTsKKwkJCQlpZiAoKmJ5dGUgPT0gMHhmZikKKwkJCQkJY29udGludWU7CisJCQkJYiA9IGZmeigodW5zaWduZWQgbG9uZykqYnl0ZSk7CisJCQkJaWYgKGIgPCA4ICYmIGIgPj0gKGJpdCAmIDcpKSB7CisJCQkJCWxsID0gZGF0YV9wb3MgKyAoYml0ICYgfjd1bGwpICsgYjsKKwkJCQkJaWYgKHVubGlrZWx5KGxsID4gKDFsbCA8PCAzMikpKSB7CisJCQkJCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJCQkJCQlyZXR1cm4gLUVOT1NQQzsKKwkJCQkJfQorCQkJCQkqYnl0ZSB8PSAxIDw8IGI7CisJCQkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQkJCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKKwkJCQkJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCQkJCQludGZzX2RlYnVnKCJEb25lLiAgKEZvdW5kIGFuZCAiCisJCQkJCQkJImFsbG9jYXRlZCBtZnQgcmVjb3JkICIKKwkJCQkJCQkiMHglbGx4LikiLAorCQkJCQkJCShsb25nIGxvbmcpbGwpOworCQkJCQlyZXR1cm4gbGw7CisJCQkJfQorCQkJfQorCQkJbnRmc19kZWJ1ZygiQWZ0ZXIgaW5uZXIgZm9yIGxvb3A6IHNpemUgMHgleCwgIgorCQkJCQkiZGF0YV9wb3MgMHglbGx4LCBiaXQgMHglbGx4Iiwgc2l6ZSwKKwkJCQkJKGxvbmcgbG9uZylkYXRhX3BvcywgKGxvbmcgbG9uZyliaXQpOworCQkJZGF0YV9wb3MgKz0gc2l6ZTsKKwkJCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwkJCS8qCisJCQkgKiBJZiB0aGUgZW5kIG9mIHRoZSBwYXNzIGhhcyBub3QgYmVlbiByZWFjaGVkIHlldCwKKwkJCSAqIGNvbnRpbnVlIHNlYXJjaGluZyB0aGUgbWZ0IGJpdG1hcCBmb3IgYSB6ZXJvIGJpdC4KKwkJCSAqLworCQkJaWYgKGRhdGFfcG9zIDwgcGFzc19lbmQpCisJCQkJY29udGludWU7CisJCX0KKwkJLyogRG8gdGhlIG5leHQgcGFzcy4gKi8KKwkJaWYgKCsrcGFzcyA9PSAyKSB7CisJCQkvKgorCQkJICogU3RhcnRpbmcgdGhlIHNlY29uZCBwYXNzLCBpbiB3aGljaCB3ZSBzY2FuIHRoZSBmaXJzdAorCQkJICogcGFydCBvZiB0aGUgem9uZSB3aGljaCB3ZSBvbWl0dGVkIGVhcmxpZXIuCisJCQkgKi8KKwkJCXBhc3NfZW5kID0gcGFzc19zdGFydDsKKwkJCWRhdGFfcG9zID0gcGFzc19zdGFydCA9IDI0OworCQkJbnRmc19kZWJ1ZygicGFzcyAlaSwgcGFzc19zdGFydCAweCVsbHgsIHBhc3NfZW5kICIKKwkJCQkJIjB4JWxseC4iLCBwYXNzLCAobG9uZyBsb25nKXBhc3Nfc3RhcnQsCisJCQkJCShsb25nIGxvbmcpcGFzc19lbmQpOworCQkJaWYgKGRhdGFfcG9zID49IHBhc3NfZW5kKQorCQkJCWJyZWFrOworCQl9CisJfQorCS8qIE5vIGZyZWUgbWZ0IHJlY29yZHMgaW4gY3VycmVudGx5IGluaXRpYWxpemVkIG1mdCBiaXRtYXAuICovCisJbnRmc19kZWJ1ZygiRG9uZS4gIChObyBmcmVlIG1mdCByZWNvcmRzIGxlZnQgaW4gY3VycmVudGx5IGluaXRpYWxpemVkICIKKwkJCSJtZnQgYml0bWFwLikiKTsKKwlyZXR1cm4gLUVOT1NQQzsKK30KKworLyoqCisgKiBudGZzX21mdF9iaXRtYXBfZXh0ZW5kX2FsbG9jYXRpb25fbm9sb2NrIC0gZXh0ZW5kIG1mdCBiaXRtYXAgYnkgYSBjbHVzdGVyCisgKiBAdm9sOgl2b2x1bWUgb24gd2hpY2ggdG8gZXh0ZW5kIHRoZSBtZnQgYml0bWFwIGF0dHJpYnV0ZQorICoKKyAqIEV4dGVuZCB0aGUgbWZ0IGJpdG1hcCBhdHRyaWJ1dGUgb24gdGhlIG50ZnMgdm9sdW1lIEB2b2wgYnkgb25lIGNsdXN0ZXIuCisgKgorICogTm90ZTogT25seSBjaGFuZ2VzIGFsbG9jYXRlZF9zaXplLCBpLmUuIGRvZXMgbm90IHRvdWNoIGluaXRpYWxpemVkX3NpemUgb3IKKyAqIGRhdGFfc2l6ZS4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuCisgKgorICogTG9ja2luZzogLSBDYWxsZXIgbXVzdCBob2xkIHZvbC0+bWZ0Ym1wX2xvY2sgZm9yIHdyaXRpbmcuCisgKgkgICAgLSBUaGlzIGZ1bmN0aW9uIHRha2VzIE5URlNfSSh2b2wtPm1mdGJtcF9pbm8pLT5ydW5saXN0LmxvY2sgZm9yCisgKgkgICAgICB3cml0aW5nIGFuZCByZWxlYXNlcyBpdCBiZWZvcmUgcmV0dXJuaW5nLgorICoJICAgIC0gVGhpcyBmdW5jdGlvbiB0YWtlcyB2b2wtPmxjbmJtcF9sb2NrIGZvciB3cml0aW5nIGFuZCByZWxlYXNlcyBpdAorICoJICAgICAgYmVmb3JlIHJldHVybmluZy4KKyAqLworc3RhdGljIGludCBudGZzX21mdF9iaXRtYXBfZXh0ZW5kX2FsbG9jYXRpb25fbm9sb2NrKG50ZnNfdm9sdW1lICp2b2wpCit7CisJTENOIGxjbjsKKwlzNjQgbGw7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJbnRmc19pbm9kZSAqbWZ0X25pLCAqbWZ0Ym1wX25pOworCXJ1bmxpc3RfZWxlbWVudCAqcmwsICpybDIgPSBOVUxMOworCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHggPSBOVUxMOworCU1GVF9SRUNPUkQgKm1yZWM7CisJQVRUUl9SRUNPUkQgKmEgPSBOVUxMOworCWludCByZXQsIG1wX3NpemU7CisJdTMyIG9sZF9hbGVuID0gMDsKKwl1OCAqYiwgdGI7CisJc3RydWN0IHsKKwkJdTggYWRkZWRfY2x1c3RlcjoxOworCQl1OCBhZGRlZF9ydW46MTsKKwkJdTggbXBfcmVidWlsdDoxOworCX0gc3RhdHVzID0geyAwLCAwLCAwIH07CisKKwludGZzX2RlYnVnKCJFeHRlbmRpbmcgbWZ0IGJpdG1hcCBhbGxvY2F0aW9uLiIpOworCW1mdF9uaSA9IE5URlNfSSh2b2wtPm1mdF9pbm8pOworCW1mdGJtcF9uaSA9IE5URlNfSSh2b2wtPm1mdGJtcF9pbm8pOworCS8qCisJICogRGV0ZXJtaW5lIHRoZSBsYXN0IGxjbiBvZiB0aGUgbWZ0IGJpdG1hcC4gIFRoZSBhbGxvY2F0ZWQgc2l6ZSBvZiB0aGUKKwkgKiBtZnQgYml0bWFwIGNhbm5vdCBiZSB6ZXJvIHNvIHdlIGFyZSBvayB0byBkbyB0aGlzLgorCSAqIG50ZnNfZmluZF92Y24oKSByZXR1cm5zIHRoZSBydW5saXN0IGxvY2tlZCBvbiBzdWNjZXNzLgorCSAqLworCXJsID0gbnRmc19maW5kX3ZjbihtZnRibXBfbmksIChtZnRibXBfbmktPmFsbG9jYXRlZF9zaXplIC0gMSkgPj4KKwkJCXZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMsIFRSVUUpOworCWlmICh1bmxpa2VseShJU19FUlIocmwpIHx8ICFybC0+bGVuZ3RoIHx8IHJsLT5sY24gPCAwKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZGV0ZXJtaW5lIGxhc3QgYWxsb2NhdGVkICIKKwkJCQkiY2x1c3RlciBvZiBtZnQgYml0bWFwIGF0dHJpYnV0ZS4iKTsKKwkJaWYgKCFJU19FUlIocmwpKSB7CisJCQl1cF93cml0ZSgmbWZ0Ym1wX25pLT5ydW5saXN0LmxvY2spOworCQkJcmV0ID0gLUVJTzsKKwkJfSBlbHNlCisJCQlyZXQgPSBQVFJfRVJSKHJsKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJbGNuID0gcmwtPmxjbiArIHJsLT5sZW5ndGg7CisJbnRmc19kZWJ1ZygiTGFzdCBsY24gb2YgbWZ0IGJpdG1hcCBhdHRyaWJ1dGUgaXMgMHglbGx4LiIsCisJCQkobG9uZyBsb25nKWxjbik7CisJLyoKKwkgKiBBdHRlbXB0IHRvIGdldCB0aGUgY2x1c3RlciBmb2xsb3dpbmcgdGhlIGxhc3QgYWxsb2NhdGVkIGNsdXN0ZXIgYnkKKwkgKiBoYW5kIGFzIGl0IG1heSBiZSBpbiB0aGUgTUZUIHpvbmUgc28gdGhlIGFsbG9jYXRvciB3b3VsZCBub3QgZ2l2ZSBpdAorCSAqIHRvIHVzLgorCSAqLworCWxsID0gbGNuID4+IDM7CisJcGFnZSA9IG50ZnNfbWFwX3BhZ2Uodm9sLT5sY25ibXBfaW5vLT5pX21hcHBpbmcsCisJCQlsbCA+PiBQQUdFX0NBQ0hFX1NISUZUKTsKKwlpZiAoSVNfRVJSKHBhZ2UpKSB7CisJCXVwX3dyaXRlKCZtZnRibXBfbmktPnJ1bmxpc3QubG9jayk7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byByZWFkIGZyb20gbGNuIGJpdG1hcC4iKTsKKwkJcmV0dXJuIFBUUl9FUlIocGFnZSk7CisJfQorCWIgPSAodTgqKXBhZ2VfYWRkcmVzcyhwYWdlKSArIChsbCAmIH5QQUdFX0NBQ0hFX01BU0spOworCXRiID0gMSA8PCAobGNuICYgN3VsbCk7CisJZG93bl93cml0ZSgmdm9sLT5sY25ibXBfbG9jayk7CisJaWYgKCpiICE9IDB4ZmYgJiYgISgqYiAmIHRiKSkgeworCQkvKiBOZXh0IGNsdXN0ZXIgaXMgZnJlZSwgYWxsb2NhdGUgaXQuICovCisJCSpiIHw9IHRiOworCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwkJc2V0X3BhZ2VfZGlydHkocGFnZSk7CisJCXVwX3dyaXRlKCZ2b2wtPmxjbmJtcF9sb2NrKTsKKwkJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCQkvKiBVcGRhdGUgdGhlIG1mdCBiaXRtYXAgcnVubGlzdC4gKi8KKwkJcmwtPmxlbmd0aCsrOworCQlybFsxXS52Y24rKzsKKwkJc3RhdHVzLmFkZGVkX2NsdXN0ZXIgPSAxOworCQludGZzX2RlYnVnKCJBcHBlbmRpbmcgb25lIGNsdXN0ZXIgdG8gbWZ0IGJpdG1hcC4iKTsKKwl9IGVsc2UgeworCQl1cF93cml0ZSgmdm9sLT5sY25ibXBfbG9jayk7CisJCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwkJLyogQWxsb2NhdGUgYSBjbHVzdGVyIGZyb20gdGhlIERBVEFfWk9ORS4gKi8KKwkJcmwyID0gbnRmc19jbHVzdGVyX2FsbG9jKHZvbCwgcmxbMV0udmNuLCAxLCBsY24sIERBVEFfWk9ORSk7CisJCWlmIChJU19FUlIocmwyKSkgeworCQkJdXBfd3JpdGUoJm1mdGJtcF9uaS0+cnVubGlzdC5sb2NrKTsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBhIGNsdXN0ZXIgZm9yICIKKwkJCQkJInRoZSBtZnQgYml0bWFwLiIpOworCQkJcmV0dXJuIFBUUl9FUlIocmwyKTsKKwkJfQorCQlybCA9IG50ZnNfcnVubGlzdHNfbWVyZ2UobWZ0Ym1wX25pLT5ydW5saXN0LnJsLCBybDIpOworCQlpZiAoSVNfRVJSKHJsKSkgeworCQkJdXBfd3JpdGUoJm1mdGJtcF9uaS0+cnVubGlzdC5sb2NrKTsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBtZXJnZSBydW5saXN0cyBmb3IgbWZ0ICIKKwkJCQkJImJpdG1hcC4iKTsKKwkJCWlmIChudGZzX2NsdXN0ZXJfZnJlZV9mcm9tX3JsKHZvbCwgcmwyKSkgeworCQkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBkZWFsb2NhdGUgIgorCQkJCQkJImFsbG9jYXRlZCBjbHVzdGVyLiVzIiwgZXMpOworCQkJCU5Wb2xTZXRFcnJvcnModm9sKTsKKwkJCX0KKwkJCW50ZnNfZnJlZShybDIpOworCQkJcmV0dXJuIFBUUl9FUlIocmwpOworCQl9CisJCW1mdGJtcF9uaS0+cnVubGlzdC5ybCA9IHJsOworCQlzdGF0dXMuYWRkZWRfcnVuID0gMTsKKwkJbnRmc19kZWJ1ZygiQWRkaW5nIG9uZSBydW4gdG8gbWZ0IGJpdG1hcC4iKTsKKwkJLyogRmluZCB0aGUgbGFzdCBydW4gaW4gdGhlIG5ldyBydW5saXN0LiAqLworCQlmb3IgKDsgcmxbMV0ubGVuZ3RoOyBybCsrKQorCQkJOworCX0KKwkvKgorCSAqIFVwZGF0ZSB0aGUgYXR0cmlidXRlIHJlY29yZCBhcyB3ZWxsLiAgTm90ZTogQHJsIGlzIHRoZSBsYXN0CisJICogKG5vbi10ZXJtaW5hdG9yKSBydW5saXN0IGVsZW1lbnQgb2YgbWZ0IGJpdG1hcC4KKwkgKi8KKwltcmVjID0gbWFwX21mdF9yZWNvcmQobWZ0X25pKTsKKwlpZiAoSVNfRVJSKG1yZWMpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBtYXAgbWZ0IHJlY29yZC4iKTsKKwkJcmV0ID0gUFRSX0VSUihtcmVjKTsKKwkJZ290byB1bmRvX2FsbG9jOworCX0KKwljdHggPSBudGZzX2F0dHJfZ2V0X3NlYXJjaF9jdHgobWZ0X25pLCBtcmVjKTsKKwlpZiAodW5saWtlbHkoIWN0eCkpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGdldCBzZWFyY2ggY29udGV4dC4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byB1bmRvX2FsbG9jOworCX0KKwlyZXQgPSBudGZzX2F0dHJfbG9va3VwKG1mdGJtcF9uaS0+dHlwZSwgbWZ0Ym1wX25pLT5uYW1lLAorCQkJbWZ0Ym1wX25pLT5uYW1lX2xlbiwgQ0FTRV9TRU5TSVRJVkUsIHJsWzFdLnZjbiwgTlVMTCwKKwkJCTAsIGN0eCk7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGZpbmQgbGFzdCBhdHRyaWJ1dGUgZXh0ZW50IG9mICIKKwkJCQkibWZ0IGJpdG1hcCBhdHRyaWJ1dGUuIik7CisJCWlmIChyZXQgPT0gLUVOT0VOVCkKKwkJCXJldCA9IC1FSU87CisJCWdvdG8gdW5kb19hbGxvYzsKKwl9CisJYSA9IGN0eC0+YXR0cjsKKwlsbCA9IHNsZTY0X3RvX2NwdShhLT5kYXRhLm5vbl9yZXNpZGVudC5sb3dlc3RfdmNuKTsKKwkvKiBTZWFyY2ggYmFjayBmb3IgdGhlIHByZXZpb3VzIGxhc3QgYWxsb2NhdGVkIGNsdXN0ZXIgb2YgbWZ0IGJpdG1hcC4gKi8KKwlmb3IgKHJsMiA9IHJsOyBybDIgPiBtZnRibXBfbmktPnJ1bmxpc3Qucmw7IHJsMi0tKSB7CisJCWlmIChsbCA+PSBybDItPnZjbikKKwkJCWJyZWFrOworCX0KKwlCVUdfT04obGwgPCBybDItPnZjbik7CisJQlVHX09OKGxsID49IHJsMi0+dmNuICsgcmwyLT5sZW5ndGgpOworCS8qIEdldCB0aGUgc2l6ZSBmb3IgdGhlIG5ldyBtYXBwaW5nIHBhaXJzIGFycmF5IGZvciB0aGlzIGV4dGVudC4gKi8KKwltcF9zaXplID0gbnRmc19nZXRfc2l6ZV9mb3JfbWFwcGluZ19wYWlycyh2b2wsIHJsMiwgbGwpOworCWlmICh1bmxpa2VseShtcF9zaXplIDw9IDApKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkdldCBzaXplIGZvciBtYXBwaW5nIHBhaXJzIGZhaWxlZCBmb3IgIgorCQkJCSJtZnQgYml0bWFwIGF0dHJpYnV0ZSBleHRlbnQuIik7CisJCXJldCA9IG1wX3NpemU7CisJCWlmICghcmV0KQorCQkJcmV0ID0gLUVJTzsKKwkJZ290byB1bmRvX2FsbG9jOworCX0KKwkvKiBFeHBhbmQgdGhlIGF0dHJpYnV0ZSByZWNvcmQgaWYgbmVjZXNzYXJ5LiAqLworCW9sZF9hbGVuID0gbGUzMl90b19jcHUoYS0+bGVuZ3RoKTsKKwlyZXQgPSBudGZzX2F0dHJfcmVjb3JkX3Jlc2l6ZShjdHgtPm1yZWMsIGEsIG1wX3NpemUgKworCQkJbGUxNl90b19jcHUoYS0+ZGF0YS5ub25fcmVzaWRlbnQubWFwcGluZ19wYWlyc19vZmZzZXQpKTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlpZiAocmV0ICE9IC1FTk9TUEMpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byByZXNpemUgYXR0cmlidXRlICIKKwkJCQkJInJlY29yZCBmb3IgbWZ0IGJpdG1hcCBhdHRyaWJ1dGUuIik7CisJCQlnb3RvIHVuZG9fYWxsb2M7CisJCX0KKwkJLy8gVE9ETzogRGVhbCB3aXRoIHRoaXMgYnkgbW92aW5nIHRoaXMgZXh0ZW50IHRvIGEgbmV3IG1mdAorCQkvLyByZWNvcmQgb3IgYnkgc3RhcnRpbmcgYSBuZXcgZXh0ZW50IGluIGEgbmV3IG1mdCByZWNvcmQgb3IgYnkKKwkJLy8gbW92aW5nIG90aGVyIGF0dHJpYnV0ZXMgb3V0IG9mIHRoaXMgbWZ0IHJlY29yZC4KKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiTm90IGVub3VnaCBzcGFjZSBpbiB0aGlzIG1mdCByZWNvcmQgdG8gIgorCQkJCSJhY2NvbW9kYXRlIGV4dGVuZGVkIG1mdCBiaXRtYXAgYXR0cmlidXRlICIKKwkJCQkiZXh0ZW50LiAgQ2Fubm90IGhhbmRsZSB0aGlzIHlldC4iKTsKKwkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gdW5kb19hbGxvYzsKKwl9CisJc3RhdHVzLm1wX3JlYnVpbHQgPSAxOworCS8qIEdlbmVyYXRlIHRoZSBtYXBwaW5nIHBhaXJzIGFycmF5IGRpcmVjdGx5IGludG8gdGhlIGF0dHIgcmVjb3JkLiAqLworCXJldCA9IG50ZnNfbWFwcGluZ19wYWlyc19idWlsZCh2b2wsICh1OCopYSArCisJCQlsZTE2X3RvX2NwdShhLT5kYXRhLm5vbl9yZXNpZGVudC5tYXBwaW5nX3BhaXJzX29mZnNldCksCisJCQltcF9zaXplLCBybDIsIGxsLCBOVUxMKTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gYnVpbGQgbWFwcGluZyBwYWlycyBhcnJheSBmb3IgIgorCQkJCSJtZnQgYml0bWFwIGF0dHJpYnV0ZS4iKTsKKwkJZ290byB1bmRvX2FsbG9jOworCX0KKwkvKiBVcGRhdGUgdGhlIGhpZ2hlc3RfdmNuLiAqLworCWEtPmRhdGEubm9uX3Jlc2lkZW50LmhpZ2hlc3RfdmNuID0gY3B1X3RvX3NsZTY0KHJsWzFdLnZjbiAtIDEpOworCS8qCisJICogV2Ugbm93IGhhdmUgZXh0ZW5kZWQgdGhlIG1mdCBiaXRtYXAgYWxsb2NhdGVkX3NpemUgYnkgb25lIGNsdXN0ZXIuCisJICogUmVmbGVjdCB0aGlzIGluIHRoZSBudGZzX2lub2RlIHN0cnVjdHVyZSBhbmQgdGhlIGF0dHJpYnV0ZSByZWNvcmQuCisJICovCisJaWYgKGEtPmRhdGEubm9uX3Jlc2lkZW50Lmxvd2VzdF92Y24pIHsKKwkJLyoKKwkJICogV2UgYXJlIG5vdCBpbiB0aGUgZmlyc3QgYXR0cmlidXRlIGV4dGVudCwgc3dpdGNoIHRvIGl0LCBidXQKKwkJICogZmlyc3QgZW5zdXJlIHRoZSBjaGFuZ2VzIHdpbGwgbWFrZSBpdCB0byBkaXNrIGxhdGVyLgorCQkgKi8KKwkJZmx1c2hfZGNhY2hlX21mdF9yZWNvcmRfcGFnZShjdHgtPm50ZnNfaW5vKTsKKwkJbWFya19tZnRfcmVjb3JkX2RpcnR5KGN0eC0+bnRmc19pbm8pOworCQludGZzX2F0dHJfcmVpbml0X3NlYXJjaF9jdHgoY3R4KTsKKwkJcmV0ID0gbnRmc19hdHRyX2xvb2t1cChtZnRibXBfbmktPnR5cGUsIG1mdGJtcF9uaS0+bmFtZSwKKwkJCQltZnRibXBfbmktPm5hbWVfbGVuLCBDQVNFX1NFTlNJVElWRSwgMCwgTlVMTCwKKwkJCQkwLCBjdHgpOworCQlpZiAodW5saWtlbHkocmV0KSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGZpbmQgZmlyc3QgYXR0cmlidXRlICIKKwkJCQkJImV4dGVudCBvZiBtZnQgYml0bWFwIGF0dHJpYnV0ZS4iKTsKKwkJCWdvdG8gcmVzdG9yZV91bmRvX2FsbG9jOworCQl9CisJCWEgPSBjdHgtPmF0dHI7CisJfQorCW1mdGJtcF9uaS0+YWxsb2NhdGVkX3NpemUgKz0gdm9sLT5jbHVzdGVyX3NpemU7CisJYS0+ZGF0YS5ub25fcmVzaWRlbnQuYWxsb2NhdGVkX3NpemUgPQorCQkJY3B1X3RvX3NsZTY0KG1mdGJtcF9uaS0+YWxsb2NhdGVkX3NpemUpOworCS8qIEVuc3VyZSB0aGUgY2hhbmdlcyBtYWtlIGl0IHRvIGRpc2suICovCisJZmx1c2hfZGNhY2hlX21mdF9yZWNvcmRfcGFnZShjdHgtPm50ZnNfaW5vKTsKKwltYXJrX21mdF9yZWNvcmRfZGlydHkoY3R4LT5udGZzX2lubyk7CisJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJdW5tYXBfbWZ0X3JlY29yZChtZnRfbmkpOworCXVwX3dyaXRlKCZtZnRibXBfbmktPnJ1bmxpc3QubG9jayk7CisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gMDsKK3Jlc3RvcmVfdW5kb19hbGxvYzoKKwludGZzX2F0dHJfcmVpbml0X3NlYXJjaF9jdHgoY3R4KTsKKwlpZiAobnRmc19hdHRyX2xvb2t1cChtZnRibXBfbmktPnR5cGUsIG1mdGJtcF9uaS0+bmFtZSwKKwkJCW1mdGJtcF9uaS0+bmFtZV9sZW4sIENBU0VfU0VOU0lUSVZFLCBybFsxXS52Y24sIE5VTEwsCisJCQkwLCBjdHgpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBmaW5kIGxhc3QgYXR0cmlidXRlIGV4dGVudCBvZiAiCisJCQkJIm1mdCBiaXRtYXAgYXR0cmlidXRlLiVzIiwgZXMpOworCQltZnRibXBfbmktPmFsbG9jYXRlZF9zaXplICs9IHZvbC0+Y2x1c3Rlcl9zaXplOworCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwkJdW5tYXBfbWZ0X3JlY29yZChtZnRfbmkpOworCQl1cF93cml0ZSgmbWZ0Ym1wX25pLT5ydW5saXN0LmxvY2spOworCQkvKgorCQkgKiBUaGUgb25seSB0aGluZyB0aGF0IGlzIG5vdyB3cm9uZyBpcyAtPmFsbG9jYXRlZF9zaXplIG9mIHRoZQorCQkgKiBiYXNlIGF0dHJpYnV0ZSBleHRlbnQgd2hpY2ggY2hrZHNrIHNob3VsZCBiZSBhYmxlIHRvIGZpeC4KKwkJICovCisJCU5Wb2xTZXRFcnJvcnModm9sKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJYSA9IGN0eC0+YXR0cjsKKwlhLT5kYXRhLm5vbl9yZXNpZGVudC5oaWdoZXN0X3ZjbiA9IGNwdV90b19zbGU2NChybFsxXS52Y24gLSAyKTsKK3VuZG9fYWxsb2M6CisJaWYgKHN0YXR1cy5hZGRlZF9jbHVzdGVyKSB7CisJCS8qIFRydW5jYXRlIHRoZSBsYXN0IHJ1biBpbiB0aGUgcnVubGlzdCBieSBvbmUgY2x1c3Rlci4gKi8KKwkJcmwtPmxlbmd0aC0tOworCQlybFsxXS52Y24tLTsKKwl9IGVsc2UgaWYgKHN0YXR1cy5hZGRlZF9ydW4pIHsKKwkJbGNuID0gcmwtPmxjbjsKKwkJLyogUmVtb3ZlIHRoZSBsYXN0IHJ1biBmcm9tIHRoZSBydW5saXN0LiAqLworCQlybC0+bGNuID0gcmxbMV0ubGNuOworCQlybC0+bGVuZ3RoID0gMDsKKwl9CisJLyogRGVhbGxvY2F0ZSB0aGUgY2x1c3Rlci4gKi8KKwlkb3duX3dyaXRlKCZ2b2wtPmxjbmJtcF9sb2NrKTsKKwlpZiAobnRmc19iaXRtYXBfY2xlYXJfYml0KHZvbC0+bGNuYm1wX2lubywgbGNuKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZnJlZSBhbGxvY2F0ZWQgY2x1c3Rlci4lcyIsIGVzKTsKKwkJTlZvbFNldEVycm9ycyh2b2wpOworCX0KKwl1cF93cml0ZSgmdm9sLT5sY25ibXBfbG9jayk7CisJaWYgKHN0YXR1cy5tcF9yZWJ1aWx0KSB7CisJCWlmIChudGZzX21hcHBpbmdfcGFpcnNfYnVpbGQodm9sLCAodTgqKWEgKyBsZTE2X3RvX2NwdSgKKwkJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5tYXBwaW5nX3BhaXJzX29mZnNldCksCisJCQkJb2xkX2FsZW4gLSBsZTE2X3RvX2NwdSgKKwkJCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5tYXBwaW5nX3BhaXJzX29mZnNldCksCisJCQkJcmwyLCBsbCwgTlVMTCkpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byByZXN0b3JlIG1hcHBpbmcgcGFpcnMgIgorCQkJCQkiYXJyYXkuJXMiLCBlcyk7CisJCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJCX0KKwkJaWYgKG50ZnNfYXR0cl9yZWNvcmRfcmVzaXplKGN0eC0+bXJlYywgYSwgb2xkX2FsZW4pKSB7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gcmVzdG9yZSBhdHRyaWJ1dGUgIgorCQkJCQkicmVjb3JkLiVzIiwgZXMpOworCQkJTlZvbFNldEVycm9ycyh2b2wpOworCQl9CisJCWZsdXNoX2RjYWNoZV9tZnRfcmVjb3JkX3BhZ2UoY3R4LT5udGZzX2lubyk7CisJCW1hcmtfbWZ0X3JlY29yZF9kaXJ0eShjdHgtPm50ZnNfaW5vKTsKKwl9CisJaWYgKGN0eCkKKwkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJaWYgKCFJU19FUlIobXJlYykpCisJCXVubWFwX21mdF9yZWNvcmQobWZ0X25pKTsKKwl1cF93cml0ZSgmbWZ0Ym1wX25pLT5ydW5saXN0LmxvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogbnRmc19tZnRfYml0bWFwX2V4dGVuZF9pbml0aWFsaXplZF9ub2xvY2sgLSBleHRlbmQgbWZ0Ym1wIGluaXRpYWxpemVkIGRhdGEKKyAqIEB2b2w6CXZvbHVtZSBvbiB3aGljaCB0byBleHRlbmQgdGhlIG1mdCBiaXRtYXAgYXR0cmlidXRlCisgKgorICogRXh0ZW5kIHRoZSBpbml0aWFsaXplZCBwb3J0aW9uIG9mIHRoZSBtZnQgYml0bWFwIGF0dHJpYnV0ZSBvbiB0aGUgbnRmcworICogdm9sdW1lIEB2b2wgYnkgOCBieXRlcy4KKyAqCisgKiBOb3RlOiAgT25seSBjaGFuZ2VzIGluaXRpYWxpemVkX3NpemUgYW5kIGRhdGFfc2l6ZSwgaS5lLiByZXF1aXJlcyB0aGF0CisgKiBhbGxvY2F0ZWRfc2l6ZSBpcyBiaWcgZW5vdWdoIHRvIGZpdCB0aGUgbmV3IGluaXRpYWxpemVkX3NpemUuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm9yIG9uIGVycm9yLgorICoKKyAqIExvY2tpbmc6IENhbGxlciBtdXN0IGhvbGQgdm9sLT5tZnRibXBfbG9jayBmb3Igd3JpdGluZy4KKyAqLworc3RhdGljIGludCBudGZzX21mdF9iaXRtYXBfZXh0ZW5kX2luaXRpYWxpemVkX25vbG9jayhudGZzX3ZvbHVtZSAqdm9sKQoreworCXM2NCBvbGRfZGF0YV9zaXplLCBvbGRfaW5pdGlhbGl6ZWRfc2l6ZTsKKwlzdHJ1Y3QgaW5vZGUgKm1mdGJtcF92aTsKKwludGZzX2lub2RlICptZnRfbmksICptZnRibXBfbmk7CisJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eDsKKwlNRlRfUkVDT1JEICptcmVjOworCUFUVFJfUkVDT1JEICphOworCWludCByZXQ7CisKKwludGZzX2RlYnVnKCJFeHRlbmRpbmcgbWZ0IGJpdG1hcCBpbml0aWFpbGl6ZWQgKGFuZCBkYXRhKSBzaXplLiIpOworCW1mdF9uaSA9IE5URlNfSSh2b2wtPm1mdF9pbm8pOworCW1mdGJtcF92aSA9IHZvbC0+bWZ0Ym1wX2lubzsKKwltZnRibXBfbmkgPSBOVEZTX0kobWZ0Ym1wX3ZpKTsKKwkvKiBHZXQgdGhlIGF0dHJpYnV0ZSByZWNvcmQuICovCisJbXJlYyA9IG1hcF9tZnRfcmVjb3JkKG1mdF9uaSk7CisJaWYgKElTX0VSUihtcmVjKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gbWFwIG1mdCByZWNvcmQuIik7CisJCXJldHVybiBQVFJfRVJSKG1yZWMpOworCX0KKwljdHggPSBudGZzX2F0dHJfZ2V0X3NlYXJjaF9jdHgobWZ0X25pLCBtcmVjKTsKKwlpZiAodW5saWtlbHkoIWN0eCkpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGdldCBzZWFyY2ggY29udGV4dC4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJcmV0ID0gbnRmc19hdHRyX2xvb2t1cChtZnRibXBfbmktPnR5cGUsIG1mdGJtcF9uaS0+bmFtZSwKKwkJCW1mdGJtcF9uaS0+bmFtZV9sZW4sIENBU0VfU0VOU0lUSVZFLCAwLCBOVUxMLCAwLCBjdHgpOworCWlmICh1bmxpa2VseShyZXQpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBmaW5kIGZpcnN0IGF0dHJpYnV0ZSBleHRlbnQgb2YgIgorCQkJCSJtZnQgYml0bWFwIGF0dHJpYnV0ZS4iKTsKKwkJaWYgKHJldCA9PSAtRU5PRU5UKQorCQkJcmV0ID0gLUVJTzsKKwkJZ290byBwdXRfZXJyX291dDsKKwl9CisJYSA9IGN0eC0+YXR0cjsKKwlvbGRfZGF0YV9zaXplID0gbWZ0Ym1wX3ZpLT5pX3NpemU7CisJb2xkX2luaXRpYWxpemVkX3NpemUgPSBtZnRibXBfbmktPmluaXRpYWxpemVkX3NpemU7CisJLyoKKwkgKiBXZSBjYW4gc2ltcGx5IHVwZGF0ZSB0aGUgaW5pdGlhbGl6ZWRfc2l6ZSBiZWZvcmUgZmlsbGluZyB0aGUgc3BhY2UKKwkgKiB3aXRoIHplcm9lcyBiZWNhdXNlIHRoZSBjYWxsZXIgaXMgaG9sZGluZyB0aGUgbWZ0IGJpdG1hcCBsb2NrIGZvcgorCSAqIHdyaXRpbmcgd2hpY2ggZW5zdXJlcyB0aGF0IG5vIG9uZSBlbHNlIGlzIHRyeWluZyB0byBhY2Nlc3MgdGhlIGRhdGEuCisJICovCisJbWZ0Ym1wX25pLT5pbml0aWFsaXplZF9zaXplICs9IDg7CisJYS0+ZGF0YS5ub25fcmVzaWRlbnQuaW5pdGlhbGl6ZWRfc2l6ZSA9CisJCQljcHVfdG9fc2xlNjQobWZ0Ym1wX25pLT5pbml0aWFsaXplZF9zaXplKTsKKwlpZiAobWZ0Ym1wX25pLT5pbml0aWFsaXplZF9zaXplID4gbWZ0Ym1wX3ZpLT5pX3NpemUpIHsKKwkJbWZ0Ym1wX3ZpLT5pX3NpemUgPSBtZnRibXBfbmktPmluaXRpYWxpemVkX3NpemU7CisJCWEtPmRhdGEubm9uX3Jlc2lkZW50LmRhdGFfc2l6ZSA9CisJCQkJY3B1X3RvX3NsZTY0KG1mdGJtcF92aS0+aV9zaXplKTsKKwl9CisJLyogRW5zdXJlIHRoZSBjaGFuZ2VzIG1ha2UgaXQgdG8gZGlzay4gKi8KKwlmbHVzaF9kY2FjaGVfbWZ0X3JlY29yZF9wYWdlKGN0eC0+bnRmc19pbm8pOworCW1hcmtfbWZ0X3JlY29yZF9kaXJ0eShjdHgtPm50ZnNfaW5vKTsKKwludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwl1bm1hcF9tZnRfcmVjb3JkKG1mdF9uaSk7CisJLyogSW5pdGlhbGl6ZSB0aGUgbWZ0IGJpdG1hcCBhdHRyaWJ1dGUgdmFsdWUgd2l0aCB6ZXJvZXMuICovCisJcmV0ID0gbnRmc19hdHRyX3NldChtZnRibXBfbmksIG9sZF9pbml0aWFsaXplZF9zaXplLCA4LCAwKTsKKwlpZiAobGlrZWx5KCFyZXQpKSB7CisJCW50ZnNfZGVidWcoIkRvbmUuICAoV3JvdGUgZWlnaHQgaW5pdGlhbGl6ZWQgYnl0ZXMgdG8gbWZ0ICIKKwkJCQkiYml0bWFwLiIpOworCQlyZXR1cm4gMDsKKwl9CisJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHdyaXRlIHRvIG1mdCBiaXRtYXAuIik7CisJLyogVHJ5IHRvIHJlY292ZXIgZnJvbSB0aGUgZXJyb3IuICovCisJbXJlYyA9IG1hcF9tZnRfcmVjb3JkKG1mdF9uaSk7CisJaWYgKElTX0VSUihtcmVjKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gbWFwIG1mdCByZWNvcmQuJXMiLCBlcyk7CisJCU5Wb2xTZXRFcnJvcnModm9sKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJY3R4ID0gbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4KG1mdF9uaSwgbXJlYyk7CisJaWYgKHVubGlrZWx5KCFjdHgpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBnZXQgc2VhcmNoIGNvbnRleHQuJXMiLCBlcyk7CisJCU5Wb2xTZXRFcnJvcnModm9sKTsKKwkJZ290byB1bm1fZXJyX291dDsKKwl9CisJaWYgKG50ZnNfYXR0cl9sb29rdXAobWZ0Ym1wX25pLT50eXBlLCBtZnRibXBfbmktPm5hbWUsCisJCQltZnRibXBfbmktPm5hbWVfbGVuLCBDQVNFX1NFTlNJVElWRSwgMCwgTlVMTCwgMCwgY3R4KSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZmluZCBmaXJzdCBhdHRyaWJ1dGUgZXh0ZW50IG9mICIKKwkJCQkibWZ0IGJpdG1hcCBhdHRyaWJ1dGUuJXMiLCBlcyk7CisJCU5Wb2xTZXRFcnJvcnModm9sKTsKK3B1dF9lcnJfb3V0OgorCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKK3VubV9lcnJfb3V0OgorCQl1bm1hcF9tZnRfcmVjb3JkKG1mdF9uaSk7CisJCWdvdG8gZXJyX291dDsKKwl9CisJYSA9IGN0eC0+YXR0cjsKKwltZnRibXBfbmktPmluaXRpYWxpemVkX3NpemUgPSBvbGRfaW5pdGlhbGl6ZWRfc2l6ZTsKKwlhLT5kYXRhLm5vbl9yZXNpZGVudC5pbml0aWFsaXplZF9zaXplID0KKwkJCWNwdV90b19zbGU2NChvbGRfaW5pdGlhbGl6ZWRfc2l6ZSk7CisJaWYgKG1mdGJtcF92aS0+aV9zaXplICE9IG9sZF9kYXRhX3NpemUpIHsKKwkJbWZ0Ym1wX3ZpLT5pX3NpemUgPSBvbGRfZGF0YV9zaXplOworCQlhLT5kYXRhLm5vbl9yZXNpZGVudC5kYXRhX3NpemUgPSBjcHVfdG9fc2xlNjQob2xkX2RhdGFfc2l6ZSk7CisJfQorCWZsdXNoX2RjYWNoZV9tZnRfcmVjb3JkX3BhZ2UoY3R4LT5udGZzX2lubyk7CisJbWFya19tZnRfcmVjb3JkX2RpcnR5KGN0eC0+bnRmc19pbm8pOworCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCXVubWFwX21mdF9yZWNvcmQobWZ0X25pKTsKKwludGZzX2RlYnVnKCJSZXN0b3JlZCBzdGF0dXMgb2YgbWZ0Ym1wOiBhbGxvY2F0ZWRfc2l6ZSAweCVsbHgsICIKKwkJCSJkYXRhX3NpemUgMHglbGx4LCBpbml0aWFsaXplZF9zaXplIDB4JWxseC4iLAorCQkJKGxvbmcgbG9uZyltZnRibXBfbmktPmFsbG9jYXRlZF9zaXplLAorCQkJKGxvbmcgbG9uZyltZnRibXBfdmktPmlfc2l6ZSwKKwkJCShsb25nIGxvbmcpbWZ0Ym1wX25pLT5pbml0aWFsaXplZF9zaXplKTsKK2Vycl9vdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBudGZzX21mdF9kYXRhX2V4dGVuZF9hbGxvY2F0aW9uX25vbG9jayAtIGV4dGVuZCBtZnQgZGF0YSBhdHRyaWJ1dGUKKyAqIEB2b2w6CXZvbHVtZSBvbiB3aGljaCB0byBleHRlbmQgdGhlIG1mdCBkYXRhIGF0dHJpYnV0ZQorICoKKyAqIEV4dGVuZCB0aGUgbWZ0IGRhdGEgYXR0cmlidXRlIG9uIHRoZSBudGZzIHZvbHVtZSBAdm9sIGJ5IDE2IG1mdCByZWNvcmRzCisgKiB3b3J0aCBvZiBjbHVzdGVycyBvciBpZiBub3QgZW5vdWdoIHNwYWNlIGZvciB0aGlzIGJ5IG9uZSBtZnQgcmVjb3JkIHdvcnRoCisgKiBvZiBjbHVzdGVycy4KKyAqCisgKiBOb3RlOiAgT25seSBjaGFuZ2VzIGFsbG9jYXRlZF9zaXplLCBpLmUuIGRvZXMgbm90IHRvdWNoIGluaXRpYWxpemVkX3NpemUgb3IKKyAqIGRhdGFfc2l6ZS4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuCisgKgorICogTG9ja2luZzogLSBDYWxsZXIgbXVzdCBob2xkIHZvbC0+bWZ0Ym1wX2xvY2sgZm9yIHdyaXRpbmcuCisgKgkgICAgLSBUaGlzIGZ1bmN0aW9uIHRha2VzIE5URlNfSSh2b2wtPm1mdF9pbm8pLT5ydW5saXN0LmxvY2sgZm9yCisgKgkgICAgICB3cml0aW5nIGFuZCByZWxlYXNlcyBpdCBiZWZvcmUgcmV0dXJuaW5nLgorICoJICAgIC0gVGhpcyBmdW5jdGlvbiBjYWxscyBmdW5jdGlvbnMgd2hpY2ggdGFrZSB2b2wtPmxjbmJtcF9sb2NrIGZvcgorICoJICAgICAgd3JpdGluZyBhbmQgcmVsZWFzZSBpdCBiZWZvcmUgcmV0dXJuaW5nLgorICovCitzdGF0aWMgaW50IG50ZnNfbWZ0X2RhdGFfZXh0ZW5kX2FsbG9jYXRpb25fbm9sb2NrKG50ZnNfdm9sdW1lICp2b2wpCit7CisJTENOIGxjbjsKKwlWQ04gb2xkX2xhc3RfdmNuOworCXM2NCBtaW5fbnIsIG5yLCBsbCA9IDA7CisJbnRmc19pbm9kZSAqbWZ0X25pOworCXJ1bmxpc3RfZWxlbWVudCAqcmwsICpybDI7CisJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eCA9IE5VTEw7CisJTUZUX1JFQ09SRCAqbXJlYzsKKwlBVFRSX1JFQ09SRCAqYSA9IE5VTEw7CisJaW50IHJldCwgbXBfc2l6ZTsKKwl1MzIgb2xkX2FsZW4gPSAwOworCUJPT0wgbXBfcmVidWlsdCA9IEZBTFNFOworCisJbnRmc19kZWJ1ZygiRXh0ZW5kaW5nIG1mdCBkYXRhIGFsbG9jYXRpb24uIik7CisJbWZ0X25pID0gTlRGU19JKHZvbC0+bWZ0X2lubyk7CisJLyoKKwkgKiBEZXRlcm1pbmUgdGhlIHByZWZlcnJlZCBhbGxvY2F0aW9uIGxvY2F0aW9uLCBpLmUuIHRoZSBsYXN0IGxjbiBvZgorCSAqIHRoZSBtZnQgZGF0YSBhdHRyaWJ1dGUuICBUaGUgYWxsb2NhdGVkIHNpemUgb2YgdGhlIG1mdCBkYXRhCisJICogYXR0cmlidXRlIGNhbm5vdCBiZSB6ZXJvIHNvIHdlIGFyZSBvayB0byBkbyB0aGlzLgorCSAqIG50ZnNfZmluZF92Y24oKSByZXR1cm5zIHRoZSBydW5saXN0IGxvY2tlZCBvbiBzdWNjZXNzLgorCSAqLworCXJsID0gbnRmc19maW5kX3ZjbihtZnRfbmksIChtZnRfbmktPmFsbG9jYXRlZF9zaXplIC0gMSkgPj4KKwkJCXZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMsIFRSVUUpOworCWlmICh1bmxpa2VseShJU19FUlIocmwpIHx8ICFybC0+bGVuZ3RoIHx8IHJsLT5sY24gPCAwKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZGV0ZXJtaW5lIGxhc3QgYWxsb2NhdGVkICIKKwkJCQkiY2x1c3RlciBvZiBtZnQgZGF0YSBhdHRyaWJ1dGUuIik7CisJCWlmICghSVNfRVJSKHJsKSkgeworCQkJdXBfd3JpdGUoJm1mdF9uaS0+cnVubGlzdC5sb2NrKTsKKwkJCXJldCA9IC1FSU87CisJCX0gZWxzZQorCQkJcmV0ID0gUFRSX0VSUihybCk7CisJCXJldHVybiByZXQ7CisJfQorCWxjbiA9IHJsLT5sY24gKyBybC0+bGVuZ3RoOworCW50ZnNfZGVidWcoIkxhc3QgbGNuIG9mIG1mdCBkYXRhIGF0dHJpYnV0ZSBpcyAweCVsbHguIiwKKwkJCShsb25nIGxvbmcpbGNuKTsKKwkvKiBNaW5pbXVtIGFsbG9jYXRpb24gaXMgb25lIG1mdCByZWNvcmQgd29ydGggb2YgY2x1c3RlcnMuICovCisJbWluX25yID0gdm9sLT5tZnRfcmVjb3JkX3NpemUgPj4gdm9sLT5jbHVzdGVyX3NpemVfYml0czsKKwlpZiAoIW1pbl9ucikKKwkJbWluX25yID0gMTsKKwkvKiBXYW50IHRvIGFsbG9jYXRlIDE2IG1mdCByZWNvcmRzIHdvcnRoIG9mIGNsdXN0ZXJzLiAqLworCW5yID0gdm9sLT5tZnRfcmVjb3JkX3NpemUgPDwgNCA+PiB2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzOworCWlmICghbnIpCisJCW5yID0gbWluX25yOworCS8qIEVuc3VyZSB3ZSBkbyBub3QgZ28gYWJvdmUgMl4zMi0xIG1mdCByZWNvcmRzLiAqLworCWlmICh1bmxpa2VseSgobWZ0X25pLT5hbGxvY2F0ZWRfc2l6ZSArCisJCQkobnIgPDwgdm9sLT5jbHVzdGVyX3NpemVfYml0cykpID4+CisJCQl2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzID49ICgxbGwgPDwgMzIpKSkgeworCQluciA9IG1pbl9ucjsKKwkJaWYgKHVubGlrZWx5KChtZnRfbmktPmFsbG9jYXRlZF9zaXplICsKKwkJCQkobnIgPDwgdm9sLT5jbHVzdGVyX3NpemVfYml0cykpID4+CisJCQkJdm9sLT5tZnRfcmVjb3JkX3NpemVfYml0cyA+PSAoMWxsIDw8IDMyKSkpIHsKKwkJCW50ZnNfd2FybmluZyh2b2wtPnNiLCAiQ2Fubm90IGFsbG9jYXRlIG1mdCByZWNvcmQgIgorCQkJCQkiYmVjYXVzZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgaW5vZGVzICIKKwkJCQkJIigyXjMyKSBoYXMgYWxyZWFkeSBiZWVuIHJlYWNoZWQuIik7CisJCQl1cF93cml0ZSgmbWZ0X25pLT5ydW5saXN0LmxvY2spOworCQkJcmV0dXJuIC1FTk9TUEM7CisJCX0KKwl9CisJbnRmc19kZWJ1ZygiVHJ5aW5nIG1mdCBkYXRhIGFsbG9jYXRpb24gd2l0aCAlcyBjbHVzdGVyIGNvdW50ICVsbGkuIiwKKwkJCW5yID4gbWluX25yID8gImRlZmF1bHQiIDogIm1pbmltYWwiLCAobG9uZyBsb25nKW5yKTsKKwlvbGRfbGFzdF92Y24gPSBybFsxXS52Y247CisJZG8geworCQlybDIgPSBudGZzX2NsdXN0ZXJfYWxsb2Modm9sLCBvbGRfbGFzdF92Y24sIG5yLCBsY24sIE1GVF9aT05FKTsKKwkJaWYgKGxpa2VseSghSVNfRVJSKHJsMikpKQorCQkJYnJlYWs7CisJCWlmIChQVFJfRVJSKHJsMikgIT0gLUVOT1NQQyB8fCBuciA9PSBtaW5fbnIpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBhbGxvY2F0ZSB0aGUgbWluaW1hbCAiCisJCQkJCSJudW1iZXIgb2YgY2x1c3RlcnMgKCVsbGkpIGZvciB0aGUgIgorCQkJCQkibWZ0IGRhdGEgYXR0cmlidXRlLiIsIChsb25nIGxvbmcpbnIpOworCQkJdXBfd3JpdGUoJm1mdF9uaS0+cnVubGlzdC5sb2NrKTsKKwkJCXJldHVybiBQVFJfRVJSKHJsMik7CisJCX0KKwkJLyoKKwkJICogVGhlcmUgaXMgbm90IGVub3VnaCBzcGFjZSB0byBkbyB0aGUgYWxsb2NhdGlvbiwgYnV0IHRoZXJlCisJCSAqIG1pZ2h0IGJlIGVub3VnaCBzcGFjZSB0byBkbyBhIG1pbmltYWwgYWxsb2NhdGlvbiBzbyB0cnkgdGhhdAorCQkgKiBiZWZvcmUgZmFpbGluZy4KKwkJICovCisJCW5yID0gbWluX25yOworCQludGZzX2RlYnVnKCJSZXRyeWluZyBtZnQgZGF0YSBhbGxvY2F0aW9uIHdpdGggbWluaW1hbCBjbHVzdGVyICIKKwkJCQkiY291bnQgJWxsaS4iLCAobG9uZyBsb25nKW5yKTsKKwl9IHdoaWxlICgxKTsKKwlybCA9IG50ZnNfcnVubGlzdHNfbWVyZ2UobWZ0X25pLT5ydW5saXN0LnJsLCBybDIpOworCWlmIChJU19FUlIocmwpKSB7CisJCXVwX3dyaXRlKCZtZnRfbmktPnJ1bmxpc3QubG9jayk7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBtZXJnZSBydW5saXN0cyBmb3IgbWZ0IGRhdGEgIgorCQkJCSJhdHRyaWJ1dGUuIik7CisJCWlmIChudGZzX2NsdXN0ZXJfZnJlZV9mcm9tX3JsKHZvbCwgcmwyKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGRlYWxvY2F0ZSBjbHVzdGVycyAiCisJCQkJCSJmcm9tIHRoZSBtZnQgZGF0YSBhdHRyaWJ1dGUuJXMiLCBlcyk7CisJCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJCX0KKwkJbnRmc19mcmVlKHJsMik7CisJCXJldHVybiBQVFJfRVJSKHJsKTsKKwl9CisJbWZ0X25pLT5ydW5saXN0LnJsID0gcmw7CisJbnRmc19kZWJ1ZygiQWxsb2NhdGVkICVsbGkgY2x1c3RlcnMuIiwgbnIpOworCS8qIEZpbmQgdGhlIGxhc3QgcnVuIGluIHRoZSBuZXcgcnVubGlzdC4gKi8KKwlmb3IgKDsgcmxbMV0ubGVuZ3RoOyBybCsrKQorCQk7CisJLyogVXBkYXRlIHRoZSBhdHRyaWJ1dGUgcmVjb3JkIGFzIHdlbGwuICovCisJbXJlYyA9IG1hcF9tZnRfcmVjb3JkKG1mdF9uaSk7CisJaWYgKElTX0VSUihtcmVjKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gbWFwIG1mdCByZWNvcmQuIik7CisJCXJldCA9IFBUUl9FUlIobXJlYyk7CisJCWdvdG8gdW5kb19hbGxvYzsKKwl9CisJY3R4ID0gbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4KG1mdF9uaSwgbXJlYyk7CisJaWYgKHVubGlrZWx5KCFjdHgpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBnZXQgc2VhcmNoIGNvbnRleHQuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gdW5kb19hbGxvYzsKKwl9CisJcmV0ID0gbnRmc19hdHRyX2xvb2t1cChtZnRfbmktPnR5cGUsIG1mdF9uaS0+bmFtZSwgbWZ0X25pLT5uYW1lX2xlbiwKKwkJCUNBU0VfU0VOU0lUSVZFLCBybFsxXS52Y24sIE5VTEwsIDAsIGN0eCk7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGZpbmQgbGFzdCBhdHRyaWJ1dGUgZXh0ZW50IG9mICIKKwkJCQkibWZ0IGRhdGEgYXR0cmlidXRlLiIpOworCQlpZiAocmV0ID09IC1FTk9FTlQpCisJCQlyZXQgPSAtRUlPOworCQlnb3RvIHVuZG9fYWxsb2M7CisJfQorCWEgPSBjdHgtPmF0dHI7CisJbGwgPSBzbGU2NF90b19jcHUoYS0+ZGF0YS5ub25fcmVzaWRlbnQubG93ZXN0X3Zjbik7CisJLyogU2VhcmNoIGJhY2sgZm9yIHRoZSBwcmV2aW91cyBsYXN0IGFsbG9jYXRlZCBjbHVzdGVyIG9mIG1mdCBiaXRtYXAuICovCisJZm9yIChybDIgPSBybDsgcmwyID4gbWZ0X25pLT5ydW5saXN0LnJsOyBybDItLSkgeworCQlpZiAobGwgPj0gcmwyLT52Y24pCisJCQlicmVhazsKKwl9CisJQlVHX09OKGxsIDwgcmwyLT52Y24pOworCUJVR19PTihsbCA+PSBybDItPnZjbiArIHJsMi0+bGVuZ3RoKTsKKwkvKiBHZXQgdGhlIHNpemUgZm9yIHRoZSBuZXcgbWFwcGluZyBwYWlycyBhcnJheSBmb3IgdGhpcyBleHRlbnQuICovCisJbXBfc2l6ZSA9IG50ZnNfZ2V0X3NpemVfZm9yX21hcHBpbmdfcGFpcnModm9sLCBybDIsIGxsKTsKKwlpZiAodW5saWtlbHkobXBfc2l6ZSA8PSAwKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJHZXQgc2l6ZSBmb3IgbWFwcGluZyBwYWlycyBmYWlsZWQgZm9yICIKKwkJCQkibWZ0IGRhdGEgYXR0cmlidXRlIGV4dGVudC4iKTsKKwkJcmV0ID0gbXBfc2l6ZTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSAtRUlPOworCQlnb3RvIHVuZG9fYWxsb2M7CisJfQorCS8qIEV4cGFuZCB0aGUgYXR0cmlidXRlIHJlY29yZCBpZiBuZWNlc3NhcnkuICovCisJb2xkX2FsZW4gPSBsZTMyX3RvX2NwdShhLT5sZW5ndGgpOworCXJldCA9IG50ZnNfYXR0cl9yZWNvcmRfcmVzaXplKGN0eC0+bXJlYywgYSwgbXBfc2l6ZSArCisJCQlsZTE2X3RvX2NwdShhLT5kYXRhLm5vbl9yZXNpZGVudC5tYXBwaW5nX3BhaXJzX29mZnNldCkpOworCWlmICh1bmxpa2VseShyZXQpKSB7CisJCWlmIChyZXQgIT0gLUVOT1NQQykgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHJlc2l6ZSBhdHRyaWJ1dGUgIgorCQkJCQkicmVjb3JkIGZvciBtZnQgZGF0YSBhdHRyaWJ1dGUuIik7CisJCQlnb3RvIHVuZG9fYWxsb2M7CisJCX0KKwkJLy8gVE9ETzogRGVhbCB3aXRoIHRoaXMgYnkgbW92aW5nIHRoaXMgZXh0ZW50IHRvIGEgbmV3IG1mdAorCQkvLyByZWNvcmQgb3IgYnkgc3RhcnRpbmcgYSBuZXcgZXh0ZW50IGluIGEgbmV3IG1mdCByZWNvcmQgb3IgYnkKKwkJLy8gbW92aW5nIG90aGVyIGF0dHJpYnV0ZXMgb3V0IG9mIHRoaXMgbWZ0IHJlY29yZC4KKwkJLy8gTm90ZTogVXNlIHRoZSBzcGVjaWFsIHJlc2VydmVkIG1mdCByZWNvcmRzIGFuZCBlbnN1cmUgdGhhdAorCQkvLyB0aGlzIGV4dGVudCBpcyBub3QgcmVxdWlyZWQgdG8gZmluZCB0aGUgbWZ0IHJlY29yZCBpbgorCQkvLyBxdWVzdGlvbi4KKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiTm90IGVub3VnaCBzcGFjZSBpbiB0aGlzIG1mdCByZWNvcmQgdG8gIgorCQkJCSJhY2NvbW9kYXRlIGV4dGVuZGVkIG1mdCBkYXRhIGF0dHJpYnV0ZSAiCisJCQkJImV4dGVudC4gIENhbm5vdCBoYW5kbGUgdGhpcyB5ZXQuIik7CisJCXJldCA9IC1FT1BOT1RTVVBQOworCQlnb3RvIHVuZG9fYWxsb2M7CisJfQorCW1wX3JlYnVpbHQgPSBUUlVFOworCS8qIEdlbmVyYXRlIHRoZSBtYXBwaW5nIHBhaXJzIGFycmF5IGRpcmVjdGx5IGludG8gdGhlIGF0dHIgcmVjb3JkLiAqLworCXJldCA9IG50ZnNfbWFwcGluZ19wYWlyc19idWlsZCh2b2wsICh1OCopYSArCisJCQlsZTE2X3RvX2NwdShhLT5kYXRhLm5vbl9yZXNpZGVudC5tYXBwaW5nX3BhaXJzX29mZnNldCksCisJCQltcF9zaXplLCBybDIsIGxsLCBOVUxMKTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gYnVpbGQgbWFwcGluZyBwYWlycyBhcnJheSBvZiAiCisJCQkJIm1mdCBkYXRhIGF0dHJpYnV0ZS4iKTsKKwkJZ290byB1bmRvX2FsbG9jOworCX0KKwkvKiBVcGRhdGUgdGhlIGhpZ2hlc3RfdmNuLiAqLworCWEtPmRhdGEubm9uX3Jlc2lkZW50LmhpZ2hlc3RfdmNuID0gY3B1X3RvX3NsZTY0KHJsWzFdLnZjbiAtIDEpOworCS8qCisJICogV2Ugbm93IGhhdmUgZXh0ZW5kZWQgdGhlIG1mdCBkYXRhIGFsbG9jYXRlZF9zaXplIGJ5IG5yIGNsdXN0ZXJzLgorCSAqIFJlZmxlY3QgdGhpcyBpbiB0aGUgbnRmc19pbm9kZSBzdHJ1Y3R1cmUgYW5kIHRoZSBhdHRyaWJ1dGUgcmVjb3JkLgorCSAqIEBybCBpcyB0aGUgbGFzdCAobm9uLXRlcm1pbmF0b3IpIHJ1bmxpc3QgZWxlbWVudCBvZiBtZnQgZGF0YQorCSAqIGF0dHJpYnV0ZS4KKwkgKi8KKwlpZiAoYS0+ZGF0YS5ub25fcmVzaWRlbnQubG93ZXN0X3ZjbikgeworCQkvKgorCQkgKiBXZSBhcmUgbm90IGluIHRoZSBmaXJzdCBhdHRyaWJ1dGUgZXh0ZW50LCBzd2l0Y2ggdG8gaXQsIGJ1dAorCQkgKiBmaXJzdCBlbnN1cmUgdGhlIGNoYW5nZXMgd2lsbCBtYWtlIGl0IHRvIGRpc2sgbGF0ZXIuCisJCSAqLworCQlmbHVzaF9kY2FjaGVfbWZ0X3JlY29yZF9wYWdlKGN0eC0+bnRmc19pbm8pOworCQltYXJrX21mdF9yZWNvcmRfZGlydHkoY3R4LT5udGZzX2lubyk7CisJCW50ZnNfYXR0cl9yZWluaXRfc2VhcmNoX2N0eChjdHgpOworCQlyZXQgPSBudGZzX2F0dHJfbG9va3VwKG1mdF9uaS0+dHlwZSwgbWZ0X25pLT5uYW1lLAorCQkJCW1mdF9uaS0+bmFtZV9sZW4sIENBU0VfU0VOU0lUSVZFLCAwLCBOVUxMLCAwLAorCQkJCWN0eCk7CisJCWlmICh1bmxpa2VseShyZXQpKSB7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZmluZCBmaXJzdCBhdHRyaWJ1dGUgIgorCQkJCQkiZXh0ZW50IG9mIG1mdCBkYXRhIGF0dHJpYnV0ZS4iKTsKKwkJCWdvdG8gcmVzdG9yZV91bmRvX2FsbG9jOworCQl9CisJCWEgPSBjdHgtPmF0dHI7CisJfQorCW1mdF9uaS0+YWxsb2NhdGVkX3NpemUgKz0gbnIgPDwgdm9sLT5jbHVzdGVyX3NpemVfYml0czsKKwlhLT5kYXRhLm5vbl9yZXNpZGVudC5hbGxvY2F0ZWRfc2l6ZSA9CisJCQljcHVfdG9fc2xlNjQobWZ0X25pLT5hbGxvY2F0ZWRfc2l6ZSk7CisJLyogRW5zdXJlIHRoZSBjaGFuZ2VzIG1ha2UgaXQgdG8gZGlzay4gKi8KKwlmbHVzaF9kY2FjaGVfbWZ0X3JlY29yZF9wYWdlKGN0eC0+bnRmc19pbm8pOworCW1hcmtfbWZ0X3JlY29yZF9kaXJ0eShjdHgtPm50ZnNfaW5vKTsKKwludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwl1bm1hcF9tZnRfcmVjb3JkKG1mdF9uaSk7CisJdXBfd3JpdGUoJm1mdF9uaS0+cnVubGlzdC5sb2NrKTsKKwludGZzX2RlYnVnKCJEb25lLiIpOworCXJldHVybiAwOworcmVzdG9yZV91bmRvX2FsbG9jOgorCW50ZnNfYXR0cl9yZWluaXRfc2VhcmNoX2N0eChjdHgpOworCWlmIChudGZzX2F0dHJfbG9va3VwKG1mdF9uaS0+dHlwZSwgbWZ0X25pLT5uYW1lLCBtZnRfbmktPm5hbWVfbGVuLAorCQkJQ0FTRV9TRU5TSVRJVkUsIHJsWzFdLnZjbiwgTlVMTCwgMCwgY3R4KSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZmluZCBsYXN0IGF0dHJpYnV0ZSBleHRlbnQgb2YgIgorCQkJCSJtZnQgZGF0YSBhdHRyaWJ1dGUuJXMiLCBlcyk7CisJCW1mdF9uaS0+YWxsb2NhdGVkX3NpemUgKz0gbnIgPDwgdm9sLT5jbHVzdGVyX3NpemVfYml0czsKKwkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJCXVubWFwX21mdF9yZWNvcmQobWZ0X25pKTsKKwkJdXBfd3JpdGUoJm1mdF9uaS0+cnVubGlzdC5sb2NrKTsKKwkJLyoKKwkJICogVGhlIG9ubHkgdGhpbmcgdGhhdCBpcyBub3cgd3JvbmcgaXMgLT5hbGxvY2F0ZWRfc2l6ZSBvZiB0aGUKKwkJICogYmFzZSBhdHRyaWJ1dGUgZXh0ZW50IHdoaWNoIGNoa2RzayBzaG91bGQgYmUgYWJsZSB0byBmaXguCisJCSAqLworCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJCXJldHVybiByZXQ7CisJfQorCWEgPSBjdHgtPmF0dHI7CisJYS0+ZGF0YS5ub25fcmVzaWRlbnQuaGlnaGVzdF92Y24gPSBjcHVfdG9fc2xlNjQob2xkX2xhc3RfdmNuIC0gMSk7Cit1bmRvX2FsbG9jOgorCWlmIChudGZzX2NsdXN0ZXJfZnJlZSh2b2wtPm1mdF9pbm8sIG9sZF9sYXN0X3ZjbiwgLTEpIDwgMCkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZnJlZSBjbHVzdGVycyBmcm9tIG1mdCBkYXRhICIKKwkJCQkiYXR0cmlidXRlLiVzIiwgZXMpOworCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJfQorCWlmIChudGZzX3JsX3RydW5jYXRlX25vbG9jayh2b2wsICZtZnRfbmktPnJ1bmxpc3QsIG9sZF9sYXN0X3ZjbikpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHRydW5jYXRlIG1mdCBkYXRhIGF0dHJpYnV0ZSAiCisJCQkJInJ1bmxpc3QuJXMiLCBlcyk7CisJCU5Wb2xTZXRFcnJvcnModm9sKTsKKwl9CisJaWYgKG1wX3JlYnVpbHQpIHsKKwkJaWYgKG50ZnNfbWFwcGluZ19wYWlyc19idWlsZCh2b2wsICh1OCopYSArIGxlMTZfdG9fY3B1KAorCQkJCWEtPmRhdGEubm9uX3Jlc2lkZW50Lm1hcHBpbmdfcGFpcnNfb2Zmc2V0KSwKKwkJCQlvbGRfYWxlbiAtIGxlMTZfdG9fY3B1KAorCQkJCWEtPmRhdGEubm9uX3Jlc2lkZW50Lm1hcHBpbmdfcGFpcnNfb2Zmc2V0KSwKKwkJCQlybDIsIGxsLCBOVUxMKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHJlc3RvcmUgbWFwcGluZyBwYWlycyAiCisJCQkJCSJhcnJheS4lcyIsIGVzKTsKKwkJCU5Wb2xTZXRFcnJvcnModm9sKTsKKwkJfQorCQlpZiAobnRmc19hdHRyX3JlY29yZF9yZXNpemUoY3R4LT5tcmVjLCBhLCBvbGRfYWxlbikpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byByZXN0b3JlIGF0dHJpYnV0ZSAiCisJCQkJCSJyZWNvcmQuJXMiLCBlcyk7CisJCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJCX0KKwkJZmx1c2hfZGNhY2hlX21mdF9yZWNvcmRfcGFnZShjdHgtPm50ZnNfaW5vKTsKKwkJbWFya19tZnRfcmVjb3JkX2RpcnR5KGN0eC0+bnRmc19pbm8pOworCX0KKwlpZiAoY3R4KQorCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwlpZiAoIUlTX0VSUihtcmVjKSkKKwkJdW5tYXBfbWZ0X3JlY29yZChtZnRfbmkpOworCXVwX3dyaXRlKCZtZnRfbmktPnJ1bmxpc3QubG9jayk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBudGZzX21mdF9yZWNvcmRfbGF5b3V0IC0gbGF5b3V0IGFuIG1mdCByZWNvcmQgaW50byBhIG1lbW9yeSBidWZmZXIKKyAqIEB2b2w6CXZvbHVtZSB0byB3aGljaCB0aGUgbWZ0IHJlY29yZCB3aWxsIGJlbG9uZworICogQG1mdF9ubzoJbWZ0IHJlZmVyZW5jZSBzcGVjaWZ5aW5nIHRoZSBtZnQgcmVjb3JkIG51bWJlcgorICogQG06CQlkZXN0aW5hdGlvbiBidWZmZXIgb2Ygc2l6ZSA+PSBAdm9sLT5tZnRfcmVjb3JkX3NpemUgYnl0ZXMKKyAqCisgKiBMYXlvdXQgYW4gZW1wdHksIHVudXNlZCBtZnQgcmVjb3JkIHdpdGggdGhlIG1mdCByZWNvcmQgbnVtYmVyIEBtZnRfbm8gaW50bworICogdGhlIGJ1ZmZlciBAbS4gIFRoZSB2b2x1bWUgQHZvbCBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgbWZ0IHJlY29yZCBzdHJ1Y3R1cmUKKyAqIHdhcyBtb2RpZmllZCBpbiBOVEZTIDMuMSBzbyB3ZSBuZWVkIHRvIGtub3cgd2hpY2ggdm9sdW1lIHZlcnNpb24gdGhpcyBtZnQKKyAqIHJlY29yZCB3aWxsIGJlIHVzZWQgb24uCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLWVycm5vIG9uIGVycm9yLgorICovCitzdGF0aWMgaW50IG50ZnNfbWZ0X3JlY29yZF9sYXlvdXQoY29uc3QgbnRmc192b2x1bWUgKnZvbCwgY29uc3QgczY0IG1mdF9ubywKKwkJTUZUX1JFQ09SRCAqbSkKK3sKKwlBVFRSX1JFQ09SRCAqYTsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBtZnQgcmVjb3JkIDB4JWxseC4iLCAobG9uZyBsb25nKW1mdF9ubyk7CisJaWYgKG1mdF9ubyA+PSAoMWxsIDw8IDMyKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJNZnQgcmVjb3JkIG51bWJlciAweCVsbHggZXhjZWVkcyAiCisJCQkJIm1heGltdW0gb2YgMl4zMi4iLCAobG9uZyBsb25nKW1mdF9ubyk7CisJCXJldHVybiAtRVJBTkdFOworCX0KKwkvKiBTdGFydCBieSBjbGVhcmluZyB0aGUgd2hvbGUgbWZ0IHJlY29yZCB0byBnaXZlcyB1cyBhIGNsZWFuIHNsYXRlLiAqLworCW1lbXNldChtLCAwLCB2b2wtPm1mdF9yZWNvcmRfc2l6ZSk7CisJLyogQWxpZ25lZCB0byAyLWJ5dGUgYm91bmRhcnkuICovCisJaWYgKHZvbC0+bWFqb3JfdmVyIDwgMyB8fCAodm9sLT5tYWpvcl92ZXIgPT0gMyAmJiAhdm9sLT5taW5vcl92ZXIpKQorCQltLT51c2Ffb2ZzID0gY3B1X3RvX2xlMTYoKHNpemVvZihNRlRfUkVDT1JEX09MRCkgKyAxKSAmIH4xKTsKKwllbHNlIHsKKwkJbS0+dXNhX29mcyA9IGNwdV90b19sZTE2KChzaXplb2YoTUZUX1JFQ09SRCkgKyAxKSAmIH4xKTsKKwkJLyoKKwkJICogU2V0IHRoZSBOVEZTIDMuMSsgc3BlY2lmaWMgZmllbGRzIHdoaWxlIHdlIGtub3cgdGhhdCB0aGUKKwkJICogdm9sdW1lIHZlcnNpb24gaXMgMy4xKy4KKwkJICovCisJCW0tPnJlc2VydmVkID0gMDsKKwkJbS0+bWZ0X3JlY29yZF9udW1iZXIgPSBjcHVfdG9fbGUzMigodTMyKW1mdF9ubyk7CisJfQorCW0tPm1hZ2ljID0gbWFnaWNfRklMRTsKKwlpZiAodm9sLT5tZnRfcmVjb3JkX3NpemUgPj0gTlRGU19CTE9DS19TSVpFKQorCQltLT51c2FfY291bnQgPSBjcHVfdG9fbGUxNih2b2wtPm1mdF9yZWNvcmRfc2l6ZSAvCisJCQkJTlRGU19CTE9DS19TSVpFICsgMSk7CisJZWxzZSB7CisJCW0tPnVzYV9jb3VudCA9IGNwdV90b19sZTE2KDEpOworCQludGZzX3dhcm5pbmcodm9sLT5zYiwgIlNlY3RvciBzaXplIGlzIGJpZ2dlciB0aGFuIG1mdCByZWNvcmQgIgorCQkJCSJzaXplLiAgU2V0dGluZyB1c2FfY291bnQgdG8gMS4gIElmIGNoa2RzayAiCisJCQkJInJlcG9ydHMgdGhpcyBhcyBjb3JydXB0aW9uLCBwbGVhc2UgZW1haWwgIgorCQkJCSJsaW51eC1udGZzLWRldkBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQgc3RhdGluZyAiCisJCQkJInRoYXQgeW91IHNhdyB0aGlzIG1lc3NhZ2UgYW5kIHRoYXQgdGhlICIKKwkJCQkibW9kaWZpZWQgZmlsZSBzeXN0ZW0gY3JlYXRlZCB3YXMgY29ycnVwdC4gICIKKwkJCQkiVGhhbmsgeW91LiIpOworCX0KKwkvKiBTZXQgdGhlIHVwZGF0ZSBzZXF1ZW5jZSBudW1iZXIgdG8gMS4gKi8KKwkqKGxlMTYqKSgodTgqKW0gKyBsZTE2X3RvX2NwdShtLT51c2Ffb2ZzKSkgPSBjcHVfdG9fbGUxNigxKTsKKwltLT5sc24gPSAwOworCW0tPnNlcXVlbmNlX251bWJlciA9IGNwdV90b19sZTE2KDEpOworCW0tPmxpbmtfY291bnQgPSAwOworCS8qCisJICogUGxhY2UgdGhlIGF0dHJpYnV0ZXMgc3RyYWlnaHQgYWZ0ZXIgdGhlIHVwZGF0ZSBzZXF1ZW5jZSBhcnJheSwKKwkgKiBhbGlnbmVkIHRvIDgtYnl0ZSBib3VuZGFyeS4KKwkgKi8KKwltLT5hdHRyc19vZmZzZXQgPSBjcHVfdG9fbGUxNigobGUxNl90b19jcHUobS0+dXNhX29mcykgKworCQkJKGxlMTZfdG9fY3B1KG0tPnVzYV9jb3VudCkgPDwgMSkgKyA3KSAmIH43KTsKKwltLT5mbGFncyA9IDA7CisJLyoKKwkgKiBVc2luZyBhdHRyc19vZmZzZXQgcGx1cyBlaWdodCBieXRlcyAoZm9yIHRoZSB0ZXJtaW5hdGlvbiBhdHRyaWJ1dGUpLgorCSAqIGF0dHJzX29mZnNldCBpcyBhbHJlYWR5IGFsaWduZWQgdG8gOC1ieXRlIGJvdW5kYXJ5LCBzbyBubyBuZWVkIHRvCisJICogYWxpZ24gYWdhaW4uCisJICovCisJbS0+Ynl0ZXNfaW5fdXNlID0gY3B1X3RvX2xlMzIobGUxNl90b19jcHUobS0+YXR0cnNfb2Zmc2V0KSArIDgpOworCW0tPmJ5dGVzX2FsbG9jYXRlZCA9IGNwdV90b19sZTMyKHZvbC0+bWZ0X3JlY29yZF9zaXplKTsKKwltLT5iYXNlX21mdF9yZWNvcmQgPSAwOworCW0tPm5leHRfYXR0cl9pbnN0YW5jZSA9IDA7CisJLyogQWRkIHRoZSB0ZXJtaW5hdGlvbiBhdHRyaWJ1dGUuICovCisJYSA9IChBVFRSX1JFQ09SRCopKCh1OCopbSArIGxlMTZfdG9fY3B1KG0tPmF0dHJzX29mZnNldCkpOworCWEtPnR5cGUgPSBBVF9FTkQ7CisJYS0+bGVuZ3RoID0gMDsKKwludGZzX2RlYnVnKCJEb25lLiIpOworCXJldHVybiAwOworfQorCisvKioKKyAqIG50ZnNfbWZ0X3JlY29yZF9mb3JtYXQgLSBmb3JtYXQgYW4gbWZ0IHJlY29yZCBvbiBhbiBudGZzIHZvbHVtZQorICogQHZvbDoJdm9sdW1lIG9uIHdoaWNoIHRvIGZvcm1hdCB0aGUgbWZ0IHJlY29yZAorICogQG1mdF9ubzoJbWZ0IHJlY29yZCBudW1iZXIgdG8gZm9ybWF0CisgKgorICogRm9ybWF0IHRoZSBtZnQgcmVjb3JkIEBtZnRfbm8gaW4gJE1GVC8kREFUQSwgaS5lLiBsYXkgb3V0IGFuIGVtcHR5LCB1bnVzZWQKKyAqIG1mdCByZWNvcmQgaW50byB0aGUgYXBwcm9wcmlhdGUgcGxhY2Ugb2YgdGhlIG1mdCBkYXRhIGF0dHJpYnV0ZS4gIFRoaXMgaXMKKyAqIHVzZWQgd2hlbiBleHRlbmRpbmcgdGhlIG1mdCBkYXRhIGF0dHJpYnV0ZS4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgbnRmc19tZnRfcmVjb3JkX2Zvcm1hdChjb25zdCBudGZzX3ZvbHVtZSAqdm9sLCBjb25zdCBzNjQgbWZ0X25vKQoreworCXN0cnVjdCBpbm9kZSAqbWZ0X3ZpID0gdm9sLT5tZnRfaW5vOworCXN0cnVjdCBwYWdlICpwYWdlOworCU1GVF9SRUNPUkQgKm07CisJcGdvZmZfdCBpbmRleCwgZW5kX2luZGV4OworCXVuc2lnbmVkIGludCBvZnM7CisJaW50IGVycjsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBtZnQgcmVjb3JkIDB4JWxseC4iLCAobG9uZyBsb25nKW1mdF9ubyk7CisJLyoKKwkgKiBUaGUgaW5kZXggaW50byB0aGUgcGFnZSBjYWNoZSBhbmQgdGhlIG9mZnNldCB3aXRoaW4gdGhlIHBhZ2UgY2FjaGUKKwkgKiBwYWdlIG9mIHRoZSB3YW50ZWQgbWZ0IHJlY29yZC4KKwkgKi8KKwlpbmRleCA9IG1mdF9ubyA8PCB2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJb2ZzID0gKG1mdF9ubyA8PCB2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzKSAmIH5QQUdFX0NBQ0hFX01BU0s7CisJLyogVGhlIG1heGltdW0gdmFsaWQgaW5kZXggaW50byB0aGUgcGFnZSBjYWNoZSBmb3IgJE1GVCdzIGRhdGEuICovCisJZW5kX2luZGV4ID0gbWZ0X3ZpLT5pX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlpZiAodW5saWtlbHkoaW5kZXggPj0gZW5kX2luZGV4KSkgeworCQlpZiAodW5saWtlbHkoaW5kZXggPiBlbmRfaW5kZXggfHwgb2ZzICsgdm9sLT5tZnRfcmVjb3JkX3NpemUgPj0KKwkJCQkobWZ0X3ZpLT5pX3NpemUgJiB+UEFHRV9DQUNIRV9NQVNLKSkpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIlRyaWVkIHRvIGZvcm1hdCBub24tZXhpc3RpbmcgbWZ0ICIKKwkJCQkJInJlY29yZCAweCVsbHguIiwgKGxvbmcgbG9uZyltZnRfbm8pOworCQkJcmV0dXJuIC1FTk9FTlQ7CisJCX0KKwl9CisJLyogUmVhZCwgbWFwLCBhbmQgcGluIHRoZSBwYWdlIGNvbnRhaW5pbmcgdGhlIG1mdCByZWNvcmQuICovCisJcGFnZSA9IG50ZnNfbWFwX3BhZ2UobWZ0X3ZpLT5pX21hcHBpbmcsIGluZGV4KTsKKwlpZiAodW5saWtlbHkoSVNfRVJSKHBhZ2UpKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gbWFwIHBhZ2UgY29udGFpbmluZyBtZnQgcmVjb3JkICIKKwkJCQkidG8gZm9ybWF0IDB4JWxseC4iLCAobG9uZyBsb25nKW1mdF9ubyk7CisJCXJldHVybiBQVFJfRVJSKHBhZ2UpOworCX0KKwlsb2NrX3BhZ2UocGFnZSk7CisJQlVHX09OKCFQYWdlVXB0b2RhdGUocGFnZSkpOworCUNsZWFyUGFnZVVwdG9kYXRlKHBhZ2UpOworCW0gPSAoTUZUX1JFQ09SRCopKCh1OCopcGFnZV9hZGRyZXNzKHBhZ2UpICsgb2ZzKTsKKwllcnIgPSBudGZzX21mdF9yZWNvcmRfbGF5b3V0KHZvbCwgbWZ0X25vLCBtKTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gbGF5b3V0IG1mdCByZWNvcmQgMHglbGx4LiIsCisJCQkJKGxvbmcgbG9uZyltZnRfbm8pOworCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJCXJldHVybiBlcnI7CisJfQorCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGUgbWZ0IHJlY29yZCBpcyB3cml0dGVuIG91dCB0byBkaXNrLiAgV2UgY291bGQgdXNlCisJICogaWxvb2t1cDUoKSB0byBjaGVjayBpZiBhbiBpbm9kZSBpcyBpbiBpY2FjaGUgYW5kIHNvIG9uIGJ1dCB0aGlzIGlzCisJICogdW5uZWNlc3NhcnkgYXMgbnRmc193cml0ZXBhZ2UoKSB3aWxsIHdyaXRlIHRoZSBkaXJ0eSByZWNvcmQgYW55d2F5LgorCSAqLworCW1hcmtfbnRmc19yZWNvcmRfZGlydHkocGFnZSwgb2ZzKTsKKwludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBudGZzX21mdF9yZWNvcmRfYWxsb2MgLSBhbGxvY2F0ZSBhbiBtZnQgcmVjb3JkIG9uIGFuIG50ZnMgdm9sdW1lCisgKiBAdm9sOglbSU5dICB2b2x1bWUgb24gd2hpY2ggdG8gYWxsb2NhdGUgdGhlIG1mdCByZWNvcmQKKyAqIEBtb2RlOglbSU5dICBtb2RlIGlmIHdhbnQgYSBmaWxlIG9yIGRpcmVjdG9yeSwgaS5lLiBiYXNlIGlub2RlIG9yIDAKKyAqIEBiYXNlX25pOglbSU5dICBvcGVuIGJhc2UgaW5vZGUgaWYgYWxsb2NhdGluZyBhbiBleHRlbnQgbWZ0IHJlY29yZCBvciBOVUxMCisgKiBAbXJlYzoJW09VVF0gb24gc3VjY2Vzc2Z1bCByZXR1cm4gdGhpcyBpcyB0aGUgbWFwcGVkIG1mdCByZWNvcmQKKyAqCisgKiBBbGxvY2F0ZSBhbiBtZnQgcmVjb3JkIGluICRNRlQvJERBVEEgb2YgYW4gb3BlbiBudGZzIHZvbHVtZSBAdm9sLgorICoKKyAqIElmIEBiYXNlX25pIGlzIE5VTEwgbWFrZSB0aGUgbWZ0IHJlY29yZCBhIGJhc2UgbWZ0IHJlY29yZCwgaS5lLiBhIGZpbGUgb3IKKyAqIGRpcmV2Y3RvcnkgaW5vZGUsIGFuZCBhbGxvY2F0ZSBpdCBhdCB0aGUgZGVmYXVsdCBhbGxvY2F0b3IgcG9zaXRpb24uICBJbgorICogdGhpcyBjYXNlIEBtb2RlIGlzIHRoZSBmaWxlIG1vZGUgYXMgZ2l2ZW4gdG8gdXMgYnkgdGhlIGNhbGxlci4gIFdlIGluCisgKiBwYXJ0aWN1bGFyIHVzZSBAbW9kZSB0byBkaXN0aW5ndWlzaCB3aGV0aGVyIGEgZmlsZSBvciBhIGRpcmVjdG9yeSBpcyBiZWluZworICogY3JlYXRlZCAoU19JRkRJUihtb2RlKSBhbmQgU19JRlJFRyhtb2RlKSwgcmVzcGVjdGl2ZWx5KS4KKyAqCisgKiBJZiBAYmFzZV9uaSBpcyBub3QgTlVMTCBtYWtlIHRoZSBhbGxvY2F0ZWQgbWZ0IHJlY29yZCBhbiBleHRlbnQgcmVjb3JkLAorICogYWxsb2NhdGUgaXQgc3RhcnRpbmcgYXQgdGhlIG1mdCByZWNvcmQgYWZ0ZXIgdGhlIGJhc2UgbWZ0IHJlY29yZCBhbmQgYXR0YWNoCisgKiB0aGUgYWxsb2NhdGVkIGFuZCBvcGVuZWQgbnRmcyBpbm9kZSB0byB0aGUgYmFzZSBpbm9kZSBAYmFzZV9uaS4gIEluIHRoaXMKKyAqIGNhc2UgQG1vZGUgbXVzdCBiZSAwIGFzIGl0IGlzIG1lYW5pbmdsZXNzIGZvciBleHRlbnQgaW5vZGVzLgorICoKKyAqIFlvdSBuZWVkIHRvIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgd2l0aCBJU19FUlIoKS4gIElmIGZhbHNlLCB0aGUgZnVuY3Rpb24KKyAqIHdhcyBzdWNjZXNzZnVsIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBub3cgb3BlbmVkIG50ZnMgaW5vZGUgb2YgdGhlCisgKiBhbGxvY2F0ZWQgbWZ0IHJlY29yZC4gICpAbXJlYyBpcyB0aGVuIHNldCB0byB0aGUgYWxsb2NhdGVkLCBtYXBwZWQsIHBpbm5lZCwKKyAqIGFuZCBsb2NrZWQgbWZ0IHJlY29yZC4gIElmIElTX0VSUigpIGlzIHRydWUsIHRoZSBmdW5jdGlvbiBmYWlsZWQgYW5kIHRoZQorICogZXJyb3IgY29kZSBpcyBvYnRhaW5lZCBmcm9tIFBUUl9FUlIocmV0dXJuIHZhbHVlKS4gICpAbXJlYyBpcyB1bmRlZmluZWQgaW4KKyAqIHRoaXMgY2FzZS4KKyAqCisgKiBBbGxvY2F0aW9uIHN0cmF0ZWd5OgorICoKKyAqIFRvIGZpbmQgYSBmcmVlIG1mdCByZWNvcmQsIHdlIHNjYW4gdGhlIG1mdCBiaXRtYXAgZm9yIGEgemVybyBiaXQuICBUbworICogb3B0aW1pemUgdGhpcyB3ZSBzdGFydCBzY2FubmluZyBhdCB0aGUgcGxhY2Ugc3BlY2lmaWVkIGJ5IEBiYXNlX25pIG9yIGlmCisgKiBAYmFzZV9uaSBpcyBOVUxMIHdlIHN0YXJ0IHdoZXJlIHdlIGxhc3Qgc3RvcHBlZCBhbmQgd2UgcGVyZm9ybSB3cmFwIGFyb3VuZAorICogd2hlbiB3ZSByZWFjaCB0aGUgZW5kLiAgTm90ZSwgd2UgZG8gbm90IHRyeSB0byBhbGxvY2F0ZSBtZnQgcmVjb3JkcyBiZWxvdworICogbnVtYmVyIDI0IGJlY2F1c2UgbnVtYmVycyAwIHRvIDE1IGFyZSB0aGUgZGVmaW5lZCBzeXN0ZW0gZmlsZXMgYW55d2F5IGFuZCAxNgorICogdG8gMjQgYXJlIHNwZWNpYWwgaW4gdGhhdCB0aGV5IGFyZSB1c2VkIGZvciBzdG9yaW5nIGV4dGVuc2lvbiBtZnQgcmVjb3JkcworICogZm9yIHRoZSAkREFUQSBhdHRyaWJ1dGUgb2YgJE1GVC4gIFRoaXMgaXMgcmVxdWlyZWQgdG8gYXZvaWQgdGhlIHBvc3NpYmlsaXR5CisgKiBvZiBjcmVhdGluZyBhIHJ1bmxpc3Qgd2l0aCBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgd2hpY2ggb25jZSB3cml0dGVuIHRvIGRpc2sKKyAqIGNhbiBuZXZlciBiZSByZWFkIGluIGFnYWluLiAgV2luZG93cyB3aWxsIG9ubHkgdXNlIHJlY29yZHMgMTYgdG8gMjQgZm9yCisgKiBub3JtYWwgZmlsZXMgaWYgdGhlIHZvbHVtZSBpcyBjb21wbGV0ZWx5IG91dCBvZiBzcGFjZS4gIFdlIG5ldmVyIHVzZSB0aGVtCisgKiB3aGljaCBtZWFucyB0aGF0IHdoZW4gdGhlIHZvbHVtZSBpcyByZWFsbHkgb3V0IG9mIHNwYWNlIHdlIGNhbm5vdCBjcmVhdGUgYW55CisgKiBtb3JlIGZpbGVzIHdoaWxlIFdpbmRvd3MgY2FuIHN0aWxsIGNyZWF0ZSB1cCB0byA4IHNtYWxsIGZpbGVzLiAgV2UgY2FuIHN0YXJ0CisgKiBkb2luZyB0aGlzIGF0IHNvbWUgbGF0ZXIgdGltZSwgaXQgZG9lcyBub3QgbWF0dGVyIG11Y2ggZm9yIG5vdy4KKyAqCisgKiBXaGVuIHNjYW5uaW5nIHRoZSBtZnQgYml0bWFwLCB3ZSBvbmx5IHNlYXJjaCB1cCB0byB0aGUgbGFzdCBhbGxvY2F0ZWQgbWZ0CisgKiByZWNvcmQuICBJZiB0aGVyZSBhcmUgbm8gZnJlZSByZWNvcmRzIGxlZnQgaW4gdGhlIHJhbmdlIDI0IHRvIG51bWJlciBvZgorICogYWxsb2NhdGVkIG1mdCByZWNvcmRzLCB0aGVuIHdlIGV4dGVuZCB0aGUgJE1GVC8kREFUQSBhdHRyaWJ1dGUgaW4gb3JkZXIgdG8KKyAqIGNyZWF0ZSBmcmVlIG1mdCByZWNvcmRzLiAgV2UgZXh0ZW5kIHRoZSBhbGxvY2F0ZWQgc2l6ZSBvZiAkTUZULyREQVRBIGJ5IDE2CisgKiByZWNvcmRzIGF0IGEgdGltZSBvciBvbmUgY2x1c3RlciwgaWYgY2x1c3RlciBzaXplIGlzIGFib3ZlIDE2a2lCLiAgSWYgdGhlcmUKKyAqIGlzIG5vdCBzdWZmaWNpZW50IHNwYWNlIHRvIGRvIHRoaXMsIHdlIHRyeSB0byBleHRlbmQgYnkgYSBzaW5nbGUgbWZ0IHJlY29yZAorICogb3Igb25lIGNsdXN0ZXIsIGlmIGNsdXN0ZXIgc2l6ZSBpcyBhYm92ZSB0aGUgbWZ0IHJlY29yZCBzaXplLgorICoKKyAqIE5vIG1hdHRlciBob3cgbWFueSBtZnQgcmVjb3JkcyB3ZSBhbGxvY2F0ZSwgd2UgaW5pdGlhbGl6ZSBvbmx5IHRoZSBmaXJzdAorICogYWxsb2NhdGVkIG1mdCByZWNvcmQsIGluY3JlbWVudGluZyBtZnQgZGF0YSBzaXplIGFuZCBpbml0aWFsaXplZCBzaXplCisgKiBhY2NvcmRpbmdseSwgb3BlbiBhbiBudGZzX2lub2RlIGZvciBpdCBhbmQgcmV0dXJuIGl0IHRvIHRoZSBjYWxsZXIsIHVubGVzcworICogdGhlcmUgYXJlIGxlc3MgdGhhbiAyNCBtZnQgcmVjb3JkcywgaW4gd2hpY2ggY2FzZSB3ZSBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZQorICogbWZ0IHJlY29yZHMgdW50aWwgd2UgcmVhY2ggcmVjb3JkIDI0IHdoaWNoIHdlIGNvbnNpZGVyIGFzIHRoZSBmaXJzdCBmcmVlIG1mdAorICogcmVjb3JkIGZvciB1c2UgYnkgbm9ybWFsIGZpbGVzLgorICoKKyAqIElmIGR1cmluZyBhbnkgc3RhZ2Ugd2Ugb3ZlcmZsb3cgdGhlIGluaXRpYWxpemVkIGRhdGEgaW4gdGhlIG1mdCBiaXRtYXAsIHdlCisgKiBleHRlbmQgdGhlIGluaXRpYWxpemVkIHNpemUgKGFuZCBkYXRhIHNpemUpIGJ5IDggYnl0ZXMsIGFsbG9jYXRpbmcgYW5vdGhlcgorICogY2x1c3RlciBpZiByZXF1aXJlZC4gIFRoZSBiaXRtYXAgZGF0YSBzaXplIGhhcyB0byBiZSBhdCBsZWFzdCBlcXVhbCB0byB0aGUKKyAqIG51bWJlciBvZiBtZnQgcmVjb3JkcyBpbiB0aGUgbWZ0LCBidXQgaXQgY2FuIGJlIGJpZ2dlciwgaW4gd2hpY2ggY2FzZSB0aGUKKyAqIHN1cGVyZmxvdXMgYml0cyBhcmUgcGFkZGVkIHdpdGggemVyb2VzLgorICoKKyAqIFRodXMsIHdoZW4gd2UgcmV0dXJuIHN1Y2Nlc3NmdWxseSAoSVNfRVJSKCkgaXMgZmFsc2UpLCB3ZSB3aWxsIGhhdmU6CisgKgktIGluaXRpYWxpemVkIC8gZXh0ZW5kZWQgdGhlIG1mdCBiaXRtYXAgaWYgbmVjZXNzYXJ5LAorICoJLSBpbml0aWFsaXplZCAvIGV4dGVuZGVkIHRoZSBtZnQgZGF0YSBpZiBuZWNlc3NhcnksCisgKgktIHNldCB0aGUgYml0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1mdCByZWNvcmQgYmVpbmcgYWxsb2NhdGVkIGluIHRoZQorICoJICBtZnQgYml0bWFwLAorICoJLSBvcGVuZWQgYW4gbnRmc19pbm9kZSBmb3IgdGhlIGFsbG9jYXRlZCBtZnQgcmVjb3JkLCBhbmQgd2Ugd2lsbCBoYXZlCisgKgktIHJldHVybmVkIHRoZSBudGZzX2lub2RlIGFzIHdlbGwgYXMgdGhlIGFsbG9jYXRlZCBtYXBwZWQsIHBpbm5lZCwgYW5kCisgKgkgIGxvY2tlZCBtZnQgcmVjb3JkLgorICoKKyAqIE9uIGVycm9yLCB0aGUgdm9sdW1lIHdpbGwgYmUgbGVmdCBpbiBhIGNvbnNpc3RlbnQgc3RhdGUgYW5kIG5vIHJlY29yZCB3aWxsCisgKiBiZSBhbGxvY2F0ZWQuICBJZiByb2xsaW5nIGJhY2sgYSBwYXJ0aWFsIG9wZXJhdGlvbiBmYWlscywgd2UgbWF5IGxlYXZlIHNvbWUKKyAqIGluY29uc2lzdGVudCBtZXRhZGF0YSBpbiB3aGljaCBjYXNlIHdlIHNldCBOVm9sRXJyb3JzKCkgc28gdGhlIHZvbHVtZSBpcworICogbGVmdCBkaXJ0eSB3aGVuIHVubW91bnRlZC4KKyAqCisgKiBOb3RlLCB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBtYWtlIHVzZSBvZiBtb3N0IG9mIHRoZSBub3JtYWwgZnVuY3Rpb25zLCBsaWtlCisgKiBmb3IgZXhhbXBsZSBmb3IgYXR0cmlidXRlIHJlc2l6aW5nLCBldGMsIGJlY2F1c2Ugd2hlbiB0aGUgcnVuIGxpc3Qgb3ZlcmZsb3dzCisgKiB0aGUgYmFzZSBtZnQgcmVjb3JkIGFuZCBhbiBhdHRyaWJ1dGUgbGlzdCBpcyB1c2VkLCBpdCBpcyB2ZXJ5IGltcG9ydGFudCB0aGF0CisgKiB0aGUgZXh0ZW5zaW9uIG1mdCByZWNvcmRzIHVzZWQgdG8gc3RvcmUgdGhlICREQVRBIGF0dHJpYnV0ZSBvZiAkTUZUIGNhbiBiZQorICogcmVhY2hlZCB3aXRob3V0IGhhdmluZyB0byByZWFkIHRoZSBpbmZvcm1hdGlvbiBjb250YWluZWQgaW5zaWRlIHRoZW0sIGFzCisgKiB0aGlzIHdvdWxkIG1ha2UgaXQgaW1wb3NzaWJsZSB0byBmaW5kIHRoZW0gaW4gdGhlIGZpcnN0IHBsYWNlIGFmdGVyIHRoZQorICogdm9sdW1lIGlzIHVubW91bnRlZC4gICRNRlQvJEJJVE1BUCBwcm9iYWJseSBkb2VzIG5vdCBuZWVkIHRvIGZvbGxvdyB0aGlzCisgKiBydWxlIGJlY2F1c2UgdGhlIGJpdG1hcCBpcyBub3QgZXNzZW50aWFsIGZvciBmaW5kaW5nIHRoZSBtZnQgcmVjb3JkcywgYnV0IG9uCisgKiB0aGUgb3RoZXIgaGFuZCwgaGFuZGxpbmcgdGhlIGJpdG1hcCBpbiB0aGlzIHNwZWNpYWwgd2F5IHdvdWxkIG1ha2UgbGlmZQorICogZWFzaWVyIGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZXJlIG1pZ2h0IGJlIGNpcmN1bGFyIGludm9jYXRpb25zIG9mIGZ1bmN0aW9ucworICogd2hlbiByZWFkaW5nIHRoZSBiaXRtYXAuCisgKi8KK250ZnNfaW5vZGUgKm50ZnNfbWZ0X3JlY29yZF9hbGxvYyhudGZzX3ZvbHVtZSAqdm9sLCBjb25zdCBpbnQgbW9kZSwKKwkJbnRmc19pbm9kZSAqYmFzZV9uaSwgTUZUX1JFQ09SRCAqKm1yZWMpCit7CisJczY0IGxsLCBiaXQsIG9sZF9kYXRhX2luaXRpYWxpemVkLCBvbGRfZGF0YV9zaXplOworCXN0cnVjdCBpbm9kZSAqdmk7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJbnRmc19pbm9kZSAqbWZ0X25pLCAqbWZ0Ym1wX25pLCAqbmk7CisJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eDsKKwlNRlRfUkVDT1JEICptOworCUFUVFJfUkVDT1JEICphOworCXBnb2ZmX3QgaW5kZXg7CisJdW5zaWduZWQgaW50IG9mczsKKwlpbnQgZXJyOworCWxlMTYgc2VxX25vLCB1c247CisJQk9PTCByZWNvcmRfZm9ybWF0dGVkID0gRkFMU0U7CisKKwlpZiAoYmFzZV9uaSkgeworCQludGZzX2RlYnVnKCJFbnRlcmluZyAoYWxsb2NhdGluZyBhbiBleHRlbnQgbWZ0IHJlY29yZCBmb3IgIgorCQkJCSJiYXNlIG1mdCByZWNvcmQgMHglbGx4KS4iLAorCQkJCShsb25nIGxvbmcpYmFzZV9uaS0+bWZ0X25vKTsKKwkJLyogQG1vZGUgYW5kIEBiYXNlX25pIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuICovCisJCUJVR19PTihtb2RlKTsKKwl9IGVsc2UKKwkJbnRmc19kZWJ1ZygiRW50ZXJpbmcgKGFsbG9jYXRpbmcgYSBiYXNlIG1mdCByZWNvcmQpLiIpOworCWlmIChtb2RlKSB7CisJCS8qIEBtb2RlIGFuZCBAYmFzZV9uaSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiAqLworCQlCVUdfT04oYmFzZV9uaSk7CisJCS8qIFdlIG9ubHkgc3VwcG9ydCBjcmVhdGlvbiBvZiBub3JtYWwgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLiAqLworCQlpZiAoIVNfSVNSRUcobW9kZSkgJiYgIVNfSVNESVIobW9kZSkpCisJCQlyZXR1cm4gRVJSX1BUUigtRU9QTk9UU1VQUCk7CisJfQorCUJVR19PTighbXJlYyk7CisJbWZ0X25pID0gTlRGU19JKHZvbC0+bWZ0X2lubyk7CisJbWZ0Ym1wX25pID0gTlRGU19JKHZvbC0+bWZ0Ym1wX2lubyk7CisJZG93bl93cml0ZSgmdm9sLT5tZnRibXBfbG9jayk7CisJYml0ID0gbnRmc19tZnRfYml0bWFwX2ZpbmRfYW5kX2FsbG9jX2ZyZWVfcmVjX25vbG9jayh2b2wsIGJhc2VfbmkpOworCWlmIChiaXQgPj0gMCkgeworCQludGZzX2RlYnVnKCJGb3VuZCBhbmQgYWxsb2NhdGVkIGZyZWUgcmVjb3JkICgjMSksIGJpdCAweCVsbHguIiwKKwkJCQkobG9uZyBsb25nKWJpdCk7CisJCWdvdG8gaGF2ZV9hbGxvY19yZWM7CisJfQorCWlmIChiaXQgIT0gLUVOT1NQQykgeworCQl1cF93cml0ZSgmdm9sLT5tZnRibXBfbG9jayk7CisJCXJldHVybiBFUlJfUFRSKGJpdCk7CisJfQorCS8qCisJICogTm8gZnJlZSBtZnQgcmVjb3JkcyBsZWZ0LiAgSWYgdGhlIG1mdCBiaXRtYXAgYWxyZWFkeSBjb3ZlcnMgbW9yZQorCSAqIHRoYW4gdGhlIGN1cnJlbnRseSB1c2VkIG1mdCByZWNvcmRzLCB0aGUgbmV4dCByZWNvcmRzIGFyZSBhbGwgZnJlZSwKKwkgKiBzbyB3ZSBjYW4gc2ltcGx5IGFsbG9jYXRlIHRoZSBmaXJzdCB1bnVzZWQgbWZ0IHJlY29yZC4KKwkgKiBOb3RlOiBXZSBhbHNvIGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIG1mdCBiaXRtYXAgYXQgbGVhc3QgY292ZXJzCisJICogdGhlIGZpcnN0IDI0IG1mdCByZWNvcmRzIGFzIHRoZXkgYXJlIHNwZWNpYWwgYW5kIHdoaWxzdCB0aGV5IG1heSBub3QKKwkgKiBiZSBpbiB1c2UsIHdlIGRvIG5vdCBhbGxvY2F0ZSBmcm9tIHRoZW0uCisJICovCisJbGwgPSBtZnRfbmktPmluaXRpYWxpemVkX3NpemUgPj4gdm9sLT5tZnRfcmVjb3JkX3NpemVfYml0czsKKwlpZiAobWZ0Ym1wX25pLT5pbml0aWFsaXplZF9zaXplIDw8IDMgPiBsbCAmJgorCQkJbWZ0Ym1wX25pLT5pbml0aWFsaXplZF9zaXplID4gMykgeworCQliaXQgPSBsbDsKKwkJaWYgKGJpdCA8IDI0KQorCQkJYml0ID0gMjQ7CisJCWlmICh1bmxpa2VseShiaXQgPj0gKDFsbCA8PCAzMikpKQorCQkJZ290byBtYXhfZXJyX291dDsKKwkJbnRmc19kZWJ1ZygiRm91bmQgZnJlZSByZWNvcmQgKCMyKSwgYml0IDB4JWxseC4iLAorCQkJCShsb25nIGxvbmcpYml0KTsKKwkJZ290byBmb3VuZF9mcmVlX3JlYzsKKwl9CisJLyoKKwkgKiBUaGUgbWZ0IGJpdG1hcCBuZWVkcyB0byBiZSBleHBhbmRlZCB1bnRpbCBpdCBjb3ZlcnMgdGhlIGZpcnN0IHVudXNlZAorCSAqIG1mdCByZWNvcmQgdGhhdCB3ZSBjYW4gYWxsb2NhdGUuCisJICogTm90ZTogVGhlIHNtYWxsZXN0IG1mdCByZWNvcmQgd2UgYWxsb2NhdGUgaXMgbWZ0IHJlY29yZCAyNC4KKwkgKi8KKwliaXQgPSBtZnRibXBfbmktPmluaXRpYWxpemVkX3NpemUgPDwgMzsKKwlpZiAodW5saWtlbHkoYml0ID49ICgxbGwgPDwgMzIpKSkKKwkJZ290byBtYXhfZXJyX291dDsKKwludGZzX2RlYnVnKCJTdGF0dXMgb2YgbWZ0Ym1wIGJlZm9yZSBleHRlbnNpb246IGFsbG9jYXRlZF9zaXplIDB4JWxseCwgIgorCQkJImRhdGFfc2l6ZSAweCVsbHgsIGluaXRpYWxpemVkX3NpemUgMHglbGx4LiIsCisJCQkobG9uZyBsb25nKW1mdGJtcF9uaS0+YWxsb2NhdGVkX3NpemUsCisJCQkobG9uZyBsb25nKXZvbC0+bWZ0Ym1wX2luby0+aV9zaXplLAorCQkJKGxvbmcgbG9uZyltZnRibXBfbmktPmluaXRpYWxpemVkX3NpemUpOworCWlmIChtZnRibXBfbmktPmluaXRpYWxpemVkX3NpemUgKyA4ID4gbWZ0Ym1wX25pLT5hbGxvY2F0ZWRfc2l6ZSkgeworCQkvKiBOZWVkIHRvIGV4dGVuZCBiaXRtYXAgYnkgb25lIG1vcmUgY2x1c3Rlci4gKi8KKwkJbnRmc19kZWJ1ZygibWZ0Ym1wOiBpbml0aWFsaXplZF9zaXplICsgOCA+IGFsbG9jYXRlZF9zaXplLiIpOworCQllcnIgPSBudGZzX21mdF9iaXRtYXBfZXh0ZW5kX2FsbG9jYXRpb25fbm9sb2NrKHZvbCk7CisJCWlmICh1bmxpa2VseShlcnIpKSB7CisJCQl1cF93cml0ZSgmdm9sLT5tZnRibXBfbG9jayk7CisJCQlnb3RvIGVycl9vdXQ7CisJCX0KKwkJbnRmc19kZWJ1ZygiU3RhdHVzIG9mIG1mdGJtcCBhZnRlciBhbGxvY2F0aW9uIGV4dGVuc2lvbjogIgorCQkJCSJhbGxvY2F0ZWRfc2l6ZSAweCVsbHgsIGRhdGFfc2l6ZSAweCVsbHgsICIKKwkJCQkiaW5pdGlhbGl6ZWRfc2l6ZSAweCVsbHguIiwKKwkJCQkobG9uZyBsb25nKW1mdGJtcF9uaS0+YWxsb2NhdGVkX3NpemUsCisJCQkJKGxvbmcgbG9uZyl2b2wtPm1mdGJtcF9pbm8tPmlfc2l6ZSwKKwkJCQkobG9uZyBsb25nKW1mdGJtcF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSk7CisJfQorCS8qCisJICogV2Ugbm93IGhhdmUgc3VmZmljaWVudCBhbGxvY2F0ZWQgc3BhY2UsIGV4dGVuZCB0aGUgaW5pdGlhbGl6ZWRfc2l6ZQorCSAqIGFzIHdlbGwgYXMgdGhlIGRhdGFfc2l6ZSBpZiBuZWNlc3NhcnkgYW5kIGZpbGwgdGhlIG5ldyBzcGFjZSB3aXRoCisJICogemVyb2VzLgorCSAqLworCWVyciA9IG50ZnNfbWZ0X2JpdG1hcF9leHRlbmRfaW5pdGlhbGl6ZWRfbm9sb2NrKHZvbCk7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJdXBfd3JpdGUoJnZvbC0+bWZ0Ym1wX2xvY2spOworCQlnb3RvIGVycl9vdXQ7CisJfQorCW50ZnNfZGVidWcoIlN0YXR1cyBvZiBtZnRibXAgYWZ0ZXIgaW5pdGlhbGl6ZWQgZXh0ZW50aW9uOiAiCisJCQkiYWxsb2NhdGVkX3NpemUgMHglbGx4LCBkYXRhX3NpemUgMHglbGx4LCAiCisJCQkiaW5pdGlhbGl6ZWRfc2l6ZSAweCVsbHguIiwKKwkJCShsb25nIGxvbmcpbWZ0Ym1wX25pLT5hbGxvY2F0ZWRfc2l6ZSwKKwkJCShsb25nIGxvbmcpdm9sLT5tZnRibXBfaW5vLT5pX3NpemUsCisJCQkobG9uZyBsb25nKW1mdGJtcF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSk7CisJbnRmc19kZWJ1ZygiRm91bmQgZnJlZSByZWNvcmQgKCMzKSwgYml0IDB4JWxseC4iLCAobG9uZyBsb25nKWJpdCk7Citmb3VuZF9mcmVlX3JlYzoKKwkvKiBAYml0IGlzIHRoZSBmb3VuZCBmcmVlIG1mdCByZWNvcmQsIGFsbG9jYXRlIGl0IGluIHRoZSBtZnQgYml0bWFwLiAqLworCW50ZnNfZGVidWcoIkF0IGZvdW5kX2ZyZWVfcmVjLiIpOworCWVyciA9IG50ZnNfYml0bWFwX3NldF9iaXQodm9sLT5tZnRibXBfaW5vLCBiaXQpOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBiaXQgaW4gbWZ0IGJpdG1hcC4iKTsKKwkJdXBfd3JpdGUoJnZvbC0+bWZ0Ym1wX2xvY2spOworCQlnb3RvIGVycl9vdXQ7CisJfQorCW50ZnNfZGVidWcoIlNldCBiaXQgMHglbGx4IGluIG1mdCBiaXRtYXAuIiwgKGxvbmcgbG9uZyliaXQpOworaGF2ZV9hbGxvY19yZWM6CisJLyoKKwkgKiBUaGUgbWZ0IGJpdG1hcCBpcyBub3cgdXB0b2RhdGUuICBEZWFsIHdpdGggbWZ0IGRhdGEgYXR0cmlidXRlIG5vdy4KKwkgKiBOb3RlLCB3ZSBrZWVwIGhvbGQgb2YgdGhlIG1mdCBiaXRtYXAgbG9jayBmb3Igd3JpdGluZyB1bnRpbCBhbGwKKwkgKiBtb2RpZmljYXRpb25zIHRvIHRoZSBtZnQgZGF0YSBhdHRyaWJ1dGUgYXJlIGNvbXBsZXRlLCB0b28sIGFzIHRoZXkKKwkgKiB3aWxsIGltcGFjdCBkZWNpc2lvbnMgZm9yIG1mdCBiaXRtYXAgYW5kIG1mdCByZWNvcmQgYWxsb2NhdGlvbiBkb25lCisJICogYnkgYSBwYXJhbGxlbCBhbGxvY2F0aW9uIGFuZCBpZiB0aGUgbG9jayBpcyBub3QgbWFpbnRhaW5lZCBhCisJICogcGFyYWxsZWwgYWxsb2NhdGlvbiBjb3VsZCBhbGxvY2F0ZSB0aGUgc2FtZSBtZnQgcmVjb3JkIGFzIHRoaXMgb25lLgorCSAqLworCWxsID0gKGJpdCArIDEpIDw8IHZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHM7CisJaWYgKGxsIDw9IG1mdF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSkgeworCQludGZzX2RlYnVnKCJBbGxvY2F0ZWQgbWZ0IHJlY29yZCBhbHJlYWR5IGluaXRpYWxpemVkLiIpOworCQlnb3RvIG1mdF9yZWNfYWxyZWFkeV9pbml0aWFsaXplZDsKKwl9CisJbnRmc19kZWJ1ZygiSW5pdGlhbGl6aW5nIGFsbG9jYXRlZCBtZnQgcmVjb3JkLiIpOworCS8qCisJICogVGhlIG1mdCByZWNvcmQgaXMgb3V0c2lkZSB0aGUgaW5pdGlhbGl6ZWQgZGF0YS4gIEV4dGVuZCB0aGUgbWZ0IGRhdGEKKwkgKiBhdHRyaWJ1dGUgdW50aWwgaXQgY292ZXJzIHRoZSBhbGxvY2F0ZWQgcmVjb3JkLiAgVGhlIGxvb3AgaXMgb25seQorCSAqIGFjdHVhbGx5IHRyYXZlcnNlZCBtb3JlIHRoYW4gb25jZSB3aGVuIGEgZnJlc2hseSBmb3JtYXR0ZWQgdm9sdW1lIGlzCisJICogZmlyc3Qgd3JpdHRlbiB0byBzbyBpdCBvcHRpbWl6ZXMgYXdheSBuaWNlbHkgaW4gdGhlIGNvbW1vbiBjYXNlLgorCSAqLworCW50ZnNfZGVidWcoIlN0YXR1cyBvZiBtZnQgZGF0YSBiZWZvcmUgZXh0ZW5zaW9uOiAiCisJCQkiYWxsb2NhdGVkX3NpemUgMHglbGx4LCBkYXRhX3NpemUgMHglbGx4LCAiCisJCQkiaW5pdGlhbGl6ZWRfc2l6ZSAweCVsbHguIiwKKwkJCShsb25nIGxvbmcpbWZ0X25pLT5hbGxvY2F0ZWRfc2l6ZSwKKwkJCShsb25nIGxvbmcpdm9sLT5tZnRfaW5vLT5pX3NpemUsCisJCQkobG9uZyBsb25nKW1mdF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSk7CisJd2hpbGUgKGxsID4gbWZ0X25pLT5hbGxvY2F0ZWRfc2l6ZSkgeworCQllcnIgPSBudGZzX21mdF9kYXRhX2V4dGVuZF9hbGxvY2F0aW9uX25vbG9jayh2b2wpOworCQlpZiAodW5saWtlbHkoZXJyKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGV4dGVuZCBtZnQgZGF0YSAiCisJCQkJCSJhbGxvY2F0aW9uLiIpOworCQkJZ290byB1bmRvX21mdGJtcF9hbGxvY19ub2xvY2s7CisJCX0KKwkJbnRmc19kZWJ1ZygiU3RhdHVzIG9mIG1mdCBkYXRhIGFmdGVyIGFsbG9jYXRpb24gZXh0ZW5zaW9uOiAiCisJCQkJImFsbG9jYXRlZF9zaXplIDB4JWxseCwgZGF0YV9zaXplIDB4JWxseCwgIgorCQkJCSJpbml0aWFsaXplZF9zaXplIDB4JWxseC4iLAorCQkJCShsb25nIGxvbmcpbWZ0X25pLT5hbGxvY2F0ZWRfc2l6ZSwKKwkJCQkobG9uZyBsb25nKXZvbC0+bWZ0X2luby0+aV9zaXplLAorCQkJCShsb25nIGxvbmcpbWZ0X25pLT5pbml0aWFsaXplZF9zaXplKTsKKwl9CisJLyoKKwkgKiBFeHRlbmQgbWZ0IGRhdGEgaW5pdGlhbGl6ZWQgc2l6ZSAoYW5kIGRhdGEgc2l6ZSBvZiBjb3Vyc2UpIHRvIHJlYWNoCisJICogdGhlIGFsbG9jYXRlZCBtZnQgcmVjb3JkLCBmb3JtYXR0aW5nIHRoZSBtZnQgcmVjb3JkcyBhbGxvbmcgdGhlIHdheS4KKwkgKiBOb3RlOiBXZSBvbmx5IG1vZGlmeSB0aGUgbnRmc19pbm9kZSBzdHJ1Y3R1cmUgYXMgdGhhdCBpcyBhbGwgdGhhdCBpcworCSAqIG5lZWRlZCBieSBudGZzX21mdF9yZWNvcmRfZm9ybWF0KCkuICBXZSB3aWxsIHVwZGF0ZSB0aGUgYXR0cmlidXRlCisJICogcmVjb3JkIGl0c2VsZiBpbiBvbmUgZmVsbCBzd29vcCBsYXRlciBvbi4KKwkgKi8KKwlvbGRfZGF0YV9pbml0aWFsaXplZCA9IG1mdF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZTsKKwlvbGRfZGF0YV9zaXplID0gdm9sLT5tZnRfaW5vLT5pX3NpemU7CisJd2hpbGUgKGxsID4gbWZ0X25pLT5pbml0aWFsaXplZF9zaXplKSB7CisJCXM2NCBuZXdfaW5pdGlhbGl6ZWRfc2l6ZSwgbWZ0X25vOworCQkKKwkJbmV3X2luaXRpYWxpemVkX3NpemUgPSBtZnRfbmktPmluaXRpYWxpemVkX3NpemUgKworCQkJCXZvbC0+bWZ0X3JlY29yZF9zaXplOworCQltZnRfbm8gPSBtZnRfbmktPmluaXRpYWxpemVkX3NpemUgPj4gdm9sLT5tZnRfcmVjb3JkX3NpemVfYml0czsKKwkJaWYgKG5ld19pbml0aWFsaXplZF9zaXplID4gdm9sLT5tZnRfaW5vLT5pX3NpemUpCisJCQl2b2wtPm1mdF9pbm8tPmlfc2l6ZSA9IG5ld19pbml0aWFsaXplZF9zaXplOworCQludGZzX2RlYnVnKCJJbml0aWFsaXppbmcgbWZ0IHJlY29yZCAweCVsbHguIiwKKwkJCQkobG9uZyBsb25nKW1mdF9ubyk7CisJCWVyciA9IG50ZnNfbWZ0X3JlY29yZF9mb3JtYXQodm9sLCBtZnRfbm8pOworCQlpZiAodW5saWtlbHkoZXJyKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGZvcm1hdCBtZnQgcmVjb3JkLiIpOworCQkJZ290byB1bmRvX2RhdGFfaW5pdDsKKwkJfQorCQltZnRfbmktPmluaXRpYWxpemVkX3NpemUgPSBuZXdfaW5pdGlhbGl6ZWRfc2l6ZTsKKwl9CisJcmVjb3JkX2Zvcm1hdHRlZCA9IFRSVUU7CisJLyogVXBkYXRlIHRoZSBtZnQgZGF0YSBhdHRyaWJ1dGUgcmVjb3JkIHRvIHJlZmxlY3QgdGhlIG5ldyBzaXplcy4gKi8KKwltID0gbWFwX21mdF9yZWNvcmQobWZ0X25pKTsKKwlpZiAoSVNfRVJSKG0pKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBtYXAgbWZ0IHJlY29yZC4iKTsKKwkJZXJyID0gUFRSX0VSUihtKTsKKwkJZ290byB1bmRvX2RhdGFfaW5pdDsKKwl9CisJY3R4ID0gbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4KG1mdF9uaSwgbSk7CisJaWYgKHVubGlrZWx5KCFjdHgpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBnZXQgc2VhcmNoIGNvbnRleHQuIik7CisJCWVyciA9IC1FTk9NRU07CisJCXVubWFwX21mdF9yZWNvcmQobWZ0X25pKTsKKwkJZ290byB1bmRvX2RhdGFfaW5pdDsKKwl9CisJZXJyID0gbnRmc19hdHRyX2xvb2t1cChtZnRfbmktPnR5cGUsIG1mdF9uaS0+bmFtZSwgbWZ0X25pLT5uYW1lX2xlbiwKKwkJCUNBU0VfU0VOU0lUSVZFLCAwLCBOVUxMLCAwLCBjdHgpOworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBmaW5kIGZpcnN0IGF0dHJpYnV0ZSBleHRlbnQgb2YgIgorCQkJCSJtZnQgZGF0YSBhdHRyaWJ1dGUuIik7CisJCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCQl1bm1hcF9tZnRfcmVjb3JkKG1mdF9uaSk7CisJCWdvdG8gdW5kb19kYXRhX2luaXQ7CisJfQorCWEgPSBjdHgtPmF0dHI7CisJYS0+ZGF0YS5ub25fcmVzaWRlbnQuaW5pdGlhbGl6ZWRfc2l6ZSA9CisJCQljcHVfdG9fc2xlNjQobWZ0X25pLT5pbml0aWFsaXplZF9zaXplKTsKKwlhLT5kYXRhLm5vbl9yZXNpZGVudC5kYXRhX3NpemUgPSBjcHVfdG9fc2xlNjQodm9sLT5tZnRfaW5vLT5pX3NpemUpOworCS8qIEVuc3VyZSB0aGUgY2hhbmdlcyBtYWtlIGl0IHRvIGRpc2suICovCisJZmx1c2hfZGNhY2hlX21mdF9yZWNvcmRfcGFnZShjdHgtPm50ZnNfaW5vKTsKKwltYXJrX21mdF9yZWNvcmRfZGlydHkoY3R4LT5udGZzX2lubyk7CisJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJdW5tYXBfbWZ0X3JlY29yZChtZnRfbmkpOworCW50ZnNfZGVidWcoIlN0YXR1cyBvZiBtZnQgZGF0YSBhZnRlciBtZnQgcmVjb3JkIGluaXRpYWxpemF0aW9uOiAiCisJCQkiYWxsb2NhdGVkX3NpemUgMHglbGx4LCBkYXRhX3NpemUgMHglbGx4LCAiCisJCQkiaW5pdGlhbGl6ZWRfc2l6ZSAweCVsbHguIiwKKwkJCShsb25nIGxvbmcpbWZ0X25pLT5hbGxvY2F0ZWRfc2l6ZSwKKwkJCShsb25nIGxvbmcpdm9sLT5tZnRfaW5vLT5pX3NpemUsCisJCQkobG9uZyBsb25nKW1mdF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSk7CisJQlVHX09OKHZvbC0+bWZ0X2luby0+aV9zaXplID4gbWZ0X25pLT5hbGxvY2F0ZWRfc2l6ZSk7CisJQlVHX09OKG1mdF9uaS0+aW5pdGlhbGl6ZWRfc2l6ZSA+IHZvbC0+bWZ0X2luby0+aV9zaXplKTsKK21mdF9yZWNfYWxyZWFkeV9pbml0aWFsaXplZDoKKwkvKgorCSAqIFdlIGNhbiBmaW5hbGx5IGRyb3AgdGhlIG1mdCBiaXRtYXAgbG9jayBhcyB0aGUgbWZ0IGRhdGEgYXR0cmlidXRlCisJICogaGFzIGJlZW4gZnVsbHkgdXBkYXRlZC4gIFRoZSBvbmx5IGRpc3Bhcml0eSBsZWZ0IGlzIHRoYXQgdGhlCisJICogYWxsb2NhdGVkIG1mdCByZWNvcmQgc3RpbGwgbmVlZHMgdG8gYmUgbWFya2VkIGFzIGluIHVzZSB0byBtYXRjaCB0aGUKKwkgKiBzZXQgYml0IGluIHRoZSBtZnQgYml0bWFwIGJ1dCB0aGlzIGlzIGFjdHVhbGx5IG5vdCBhIHByb2JsZW0gc2luY2UKKwkgKiB0aGlzIG1mdCByZWNvcmQgaXMgbm90IHJlZmVyZW5jZWQgZnJvbSBhbnl3aGVyZSB5ZXQgYW5kIHRoZSBmYWN0CisJICogdGhhdCBpdCBpcyBhbGxvY2F0ZWQgaW4gdGhlIG1mdCBiaXRtYXAgbWVhbnMgdGhhdCBuby1vbmUgd2lsbCB0cnkgdG8KKwkgKiBhbGxvY2F0ZSBpdCBlaXRoZXIuCisJICovCisJdXBfd3JpdGUoJnZvbC0+bWZ0Ym1wX2xvY2spOworCS8qCisJICogV2Ugbm93IGhhdmUgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZCB0aGUgbWZ0IHJlY29yZC4gIENhbGN1bGF0ZSB0aGUKKwkgKiBpbmRleCBvZiBhbmQgdGhlIG9mZnNldCB3aXRoaW4gdGhlIHBhZ2UgY2FjaGUgcGFnZSB0aGUgcmVjb3JkIGlzIGluLgorCSAqLworCWluZGV4ID0gYml0IDw8IHZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHMgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlvZnMgPSAoYml0IDw8IHZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHMpICYgflBBR0VfQ0FDSEVfTUFTSzsKKwkvKiBSZWFkLCBtYXAsIGFuZCBwaW4gdGhlIHBhZ2UgY29udGFpbmluZyB0aGUgbWZ0IHJlY29yZC4gKi8KKwlwYWdlID0gbnRmc19tYXBfcGFnZSh2b2wtPm1mdF9pbm8tPmlfbWFwcGluZywgaW5kZXgpOworCWlmICh1bmxpa2VseShJU19FUlIocGFnZSkpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBtYXAgcGFnZSBjb250YWluaW5nIGFsbG9jYXRlZCAiCisJCQkJIm1mdCByZWNvcmQgMHglbGx4LiIsIChsb25nIGxvbmcpYml0KTsKKwkJZXJyID0gUFRSX0VSUihwYWdlKTsKKwkJZ290byB1bmRvX21mdGJtcF9hbGxvYzsKKwl9CisJbG9ja19wYWdlKHBhZ2UpOworCUJVR19PTighUGFnZVVwdG9kYXRlKHBhZ2UpKTsKKwlDbGVhclBhZ2VVcHRvZGF0ZShwYWdlKTsKKwltID0gKE1GVF9SRUNPUkQqKSgodTgqKXBhZ2VfYWRkcmVzcyhwYWdlKSArIG9mcyk7CisJLyogSWYgd2UganVzdCBmb3JtYXR0ZWQgdGhlIG1mdCByZWNvcmQgbm8gbmVlZCB0byBkbyBpdCBhZ2Fpbi4gKi8KKwlpZiAoIXJlY29yZF9mb3JtYXR0ZWQpIHsKKwkJLyogU2FuaXR5IGNoZWNrIHRoYXQgdGhlIG1mdCByZWNvcmQgaXMgcmVhbGx5IG5vdCBpbiB1c2UuICovCisJCWlmIChudGZzX2lzX2ZpbGVfcmVjb3JkKG0tPm1hZ2ljKSAmJgorCQkJCShtLT5mbGFncyAmIE1GVF9SRUNPUkRfSU5fVVNFKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiTWZ0IHJlY29yZCAweCVsbHggd2FzIG1hcmtlZCAiCisJCQkJCSJmcmVlIGluIG1mdCBiaXRtYXAgYnV0IGlzIG1hcmtlZCAiCisJCQkJCSJ1c2VkIGl0c2VsZi4gIENvcnJ1cHQgZmlsZXN5c3RlbS4gICIKKwkJCQkJIlVubW91bnQgYW5kIHJ1biBjaGtkc2suIiwKKwkJCQkJKGxvbmcgbG9uZyliaXQpOworCQkJZXJyID0gLUVJTzsKKwkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCQkJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCQkJTlZvbFNldEVycm9ycyh2b2wpOworCQkJZ290byB1bmRvX21mdGJtcF9hbGxvYzsKKwkJfQorCQkvKgorCQkgKiBXZSBuZWVkIHRvIChyZS0pZm9ybWF0IHRoZSBtZnQgcmVjb3JkLCBwcmVzZXJ2aW5nIHRoZQorCQkgKiBzZXF1ZW5jZSBudW1iZXIgaWYgaXQgaXMgbm90IHplcm8gYXMgd2VsbCBhcyB0aGUgdXBkYXRlCisJCSAqIHNlcXVlbmNlIG51bWJlciBpZiBpdCBpcyBub3QgemVybyBvciAtMSAoMHhmZmZmKS4gIFRoaXMKKwkJICogbWVhbnMgd2UgZG8gbm90IG5lZWQgdG8gY2FyZSB3aGV0aGVyIG9yIG5vdCBzb21ldGhpbmcgd2VudAorCQkgKiB3cm9uZyB3aXRoIHRoZSBwcmV2aW91cyBtZnQgcmVjb3JkLgorCQkgKi8KKwkJc2VxX25vID0gbS0+c2VxdWVuY2VfbnVtYmVyOworCQl1c24gPSAqKGxlMTYqKSgodTgqKW0gKyBsZTE2X3RvX2NwdShtLT51c2Ffb2ZzKSk7CisJCWVyciA9IG50ZnNfbWZ0X3JlY29yZF9sYXlvdXQodm9sLCBiaXQsIG0pOworCQlpZiAodW5saWtlbHkoZXJyKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGxheW91dCBhbGxvY2F0ZWQgbWZ0ICIKKwkJCQkJInJlY29yZCAweCVsbHguIiwgKGxvbmcgbG9uZyliaXQpOworCQkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJCQlnb3RvIHVuZG9fbWZ0Ym1wX2FsbG9jOworCQl9CisJCWlmIChzZXFfbm8pCisJCQltLT5zZXF1ZW5jZV9udW1iZXIgPSBzZXFfbm87CisJCWlmICh1c24gJiYgbGUxNl90b19jcHUodXNuKSAhPSAweGZmZmYpCisJCQkqKGxlMTYqKSgodTgqKW0gKyBsZTE2X3RvX2NwdShtLT51c2Ffb2ZzKSkgPSB1c247CisJfQorCS8qIFNldCB0aGUgbWZ0IHJlY29yZCBpdHNlbGYgaW4gdXNlLiAqLworCW0tPmZsYWdzIHw9IE1GVF9SRUNPUkRfSU5fVVNFOworCWlmIChTX0lTRElSKG1vZGUpKQorCQltLT5mbGFncyB8PSBNRlRfUkVDT1JEX0lTX0RJUkVDVE9SWTsKKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKwlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJaWYgKGJhc2VfbmkpIHsKKwkJLyoKKwkJICogU2V0dXAgdGhlIGJhc2UgbWZ0IHJlY29yZCBpbiB0aGUgZXh0ZW50IG1mdCByZWNvcmQuICBUaGlzCisJCSAqIGNvbXBsZXRlcyBpbml0aWFsaXphdGlvbiBvZiB0aGUgYWxsb2NhdGVkIGV4dGVudCBtZnQgcmVjb3JkCisJCSAqIGFuZCB3ZSBjYW4gc2ltcGx5IHVzZSBpdCB3aXRoIG1hcF9leHRlbnRfbWZ0X3JlY29yZCgpLgorCQkgKi8KKwkJbS0+YmFzZV9tZnRfcmVjb3JkID0gTUtfTEVfTVJFRihiYXNlX25pLT5tZnRfbm8sCisJCQkJYmFzZV9uaS0+c2VxX25vKTsKKwkJLyoKKwkJICogQWxsb2NhdGUgYW4gZXh0ZW50IGlub2RlIHN0cnVjdHVyZSBmb3IgdGhlIG5ldyBtZnQgcmVjb3JkLAorCQkgKiBhdHRhY2ggaXQgdG8gdGhlIGJhc2UgaW5vZGUgQGJhc2VfbmkgYW5kIG1hcCwgcGluLCBhbmQgbG9jaworCQkgKiBpdHMsIGkuZS4gdGhlIGFsbG9jYXRlZCwgbWZ0IHJlY29yZC4KKwkJICovCisJCW0gPSBtYXBfZXh0ZW50X21mdF9yZWNvcmQoYmFzZV9uaSwgYml0LCAmbmkpOworCQlpZiAoSVNfRVJSKG0pKSB7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gbWFwIGFsbG9jYXRlZCBleHRlbnQgIgorCQkJCQkibWZ0IHJlY29yZCAweCVsbHguIiwgKGxvbmcgbG9uZyliaXQpOworCQkJZXJyID0gUFRSX0VSUihtKTsKKwkJCS8qIFNldCB0aGUgbWZ0IHJlY29yZCBpdHNlbGYgbm90IGluIHVzZS4gKi8KKwkJCW0tPmZsYWdzICY9IGNwdV90b19sZTE2KAorCQkJCQl+bGUxNl90b19jcHUoTUZUX1JFQ09SRF9JTl9VU0UpKTsKKwkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQkJLyogTWFrZSBzdXJlIHRoZSBtZnQgcmVjb3JkIGlzIHdyaXR0ZW4gb3V0IHRvIGRpc2suICovCisJCQltYXJrX250ZnNfcmVjb3JkX2RpcnR5KHBhZ2UsIG9mcyk7CisJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwkJCWdvdG8gdW5kb19tZnRibXBfYWxsb2M7CisJCX0KKwkJLyoKKwkJICogTWFrZSBzdXJlIHRoZSBhbGxvY2F0ZWQgbWZ0IHJlY29yZCBpcyB3cml0dGVuIG91dCB0byBkaXNrLgorCQkgKiBObyBuZWVkIHRvIHNldCB0aGUgaW5vZGUgZGlydHkgYmVjYXVzZSB0aGUgY2FsbGVyIGlzIGdvaW5nCisJCSAqIHRvIGRvIHRoYXQgYW55d2F5IGFmdGVyIGZpbmlzaGluZyB3aXRoIHRoZSBuZXcgZXh0ZW50IG1mdAorCQkgKiByZWNvcmQgKGUuZy4gYXQgYSBtaW5pbXVtIGEgbmV3IGF0dHJpYnV0ZSB3aWxsIGJlIGFkZGVkIHRvCisJCSAqIHRoZSBtZnQgcmVjb3JkLgorCQkgKi8KKwkJbWFya19udGZzX3JlY29yZF9kaXJ0eShwYWdlLCBvZnMpOworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJLyoKKwkJICogTmVlZCB0byB1bm1hcCB0aGUgcGFnZSBzaW5jZSBtYXBfZXh0ZW50X21mdF9yZWNvcmQoKSBtYXBwZWQKKwkJICogaXQgYXMgd2VsbCBzbyB3ZSBoYXZlIGl0IG1hcHBlZCB0d2ljZSBhdCB0aGUgbW9tZW50LgorCQkgKi8KKwkJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIEFsbG9jYXRlIGEgbmV3IFZGUyBpbm9kZSBhbmQgc2V0IGl0IHVwLiAgTk9URTogQHZpLT5pX25saW5rCisJCSAqIGlzIHNldCB0byAxIGJ1dCB0aGUgbWZ0IHJlY29yZC0+bGlua19jb3VudCBpcyAwLiAgVGhlIGNhbGxlcgorCQkgKiBuZWVkcyB0byBiZWFyIHRoaXMgaW4gbWluZC4KKwkJICovCisJCXZpID0gbmV3X2lub2RlKHZvbC0+c2IpOworCQlpZiAodW5saWtlbHkoIXZpKSkgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCS8qIFNldCB0aGUgbWZ0IHJlY29yZCBpdHNlbGYgbm90IGluIHVzZS4gKi8KKwkJCW0tPmZsYWdzICY9IGNwdV90b19sZTE2KAorCQkJCQl+bGUxNl90b19jcHUoTUZUX1JFQ09SRF9JTl9VU0UpKTsKKwkJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQkJLyogTWFrZSBzdXJlIHRoZSBtZnQgcmVjb3JkIGlzIHdyaXR0ZW4gb3V0IHRvIGRpc2suICovCisJCQltYXJrX250ZnNfcmVjb3JkX2RpcnR5KHBhZ2UsIG9mcyk7CisJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJCW50ZnNfdW5tYXBfcGFnZShwYWdlKTsKKwkJCWdvdG8gdW5kb19tZnRibXBfYWxsb2M7CisJCX0KKwkJdmktPmlfaW5vID0gYml0OworCQkvKgorCQkgKiBUaGlzIGlzIHRoZSBvcHRpbWFsIElPIHNpemUgKGZvciBzdGF0KSwgbm90IHRoZSBmcyBibG9jaworCQkgKiBzaXplLgorCQkgKi8KKwkJdmktPmlfYmxrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKKwkJLyoKKwkJICogVGhpcyBpcyBmb3IgY2hlY2tpbmcgd2hldGhlciBhbiBpbm9kZSBoYXMgY2hhbmdlZCB3LnIudC4gYQorCQkgKiBmaWxlIHNvIHRoYXQgdGhlIGZpbGUgY2FuIGJlIHVwZGF0ZWQgaWYgbmVjZXNzYXJ5IChjb21wYXJlCisJCSAqIHdpdGggZl92ZXJzaW9uKS4KKwkJICovCisJCXZpLT5pX3ZlcnNpb24gPSAxOworCisJCS8qIFRoZSBvd25lciBhbmQgZ3JvdXAgY29tZSBmcm9tIHRoZSBudGZzIHZvbHVtZS4gKi8KKwkJdmktPmlfdWlkID0gdm9sLT51aWQ7CisJCXZpLT5pX2dpZCA9IHZvbC0+Z2lkOworCisJCS8qIEluaXRpYWxpemUgdGhlIG50ZnMgc3BlY2lmaWMgcGFydCBvZiBAdmkuICovCisJCW50ZnNfaW5pdF9iaWdfaW5vZGUodmkpOworCQluaSA9IE5URlNfSSh2aSk7CisJCS8qCisJCSAqIFNldCB0aGUgYXBwcm9wcmlhdGUgbW9kZSwgYXR0cmlidXRlIHR5cGUsIGFuZCBuYW1lLiAgRm9yCisJCSAqIGRpcmVjdG9yaWVzLCBhbHNvIHNldHVwIHRoZSBpbmRleCB2YWx1ZXMgdG8gdGhlIGRlZmF1bHRzLgorCQkgKi8KKwkJaWYgKFNfSVNESVIobW9kZSkpIHsKKwkJCXZpLT5pX21vZGUgPSBTX0lGRElSIHwgU19JUldYVUdPOworCQkJdmktPmlfbW9kZSAmPSB+dm9sLT5kbWFzazsKKworCQkJTklub1NldE1zdFByb3RlY3RlZChuaSk7CisJCQluaS0+dHlwZSA9IEFUX0lOREVYX0FMTE9DQVRJT047CisJCQluaS0+bmFtZSA9IEkzMDsKKwkJCW5pLT5uYW1lX2xlbiA9IDQ7CisKKwkJCW5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplID0gNDA5NjsKKwkJCW5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplX2JpdHMgPSBnZW5lcmljX2Zmcyg0MDk2KSAtIDE7CisJCQluaS0+aXR5cGUuaW5kZXguY29sbGF0aW9uX3J1bGUgPSBDT0xMQVRJT05fRklMRV9OQU1FOworCQkJaWYgKHZvbC0+Y2x1c3Rlcl9zaXplIDw9IG5pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplKSB7CisJCQkJbmktPml0eXBlLmluZGV4LnZjbl9zaXplID0gdm9sLT5jbHVzdGVyX3NpemU7CisJCQkJbmktPml0eXBlLmluZGV4LnZjbl9zaXplX2JpdHMgPQorCQkJCQkJdm9sLT5jbHVzdGVyX3NpemVfYml0czsKKwkJCX0gZWxzZSB7CisJCQkJbmktPml0eXBlLmluZGV4LnZjbl9zaXplID0gdm9sLT5zZWN0b3Jfc2l6ZTsKKwkJCQluaS0+aXR5cGUuaW5kZXgudmNuX3NpemVfYml0cyA9CisJCQkJCQl2b2wtPnNlY3Rvcl9zaXplX2JpdHM7CisJCQl9CisJCX0gZWxzZSB7CisJCQl2aS0+aV9tb2RlID0gU19JRlJFRyB8IFNfSVJXWFVHTzsKKwkJCXZpLT5pX21vZGUgJj0gfnZvbC0+Zm1hc2s7CisKKwkJCW5pLT50eXBlID0gQVRfREFUQTsKKwkJCW5pLT5uYW1lID0gTlVMTDsKKwkJCW5pLT5uYW1lX2xlbiA9IDA7CisJCX0KKwkJaWYgKElTX1JET05MWSh2aSkpCisJCQl2aS0+aV9tb2RlICY9IH5TX0lXVUdPOworCisJCS8qIFNldCB0aGUgaW5vZGUgdGltZXMgdG8gdGhlIGN1cnJlbnQgdGltZS4gKi8KKwkJdmktPmlfYXRpbWUgPSB2aS0+aV9tdGltZSA9IHZpLT5pX2N0aW1lID0KKwkJCWN1cnJlbnRfZnNfdGltZSh2aS0+aV9zYik7CisJCS8qCisJCSAqIFNldCB0aGUgZmlsZSBzaXplIHRvIDAsIHRoZSBudGZzIGlub2RlIHNpemVzIGFyZSBzZXQgdG8gMCBieQorCQkgKiB0aGUgY2FsbCB0byBudGZzX2luaXRfYmlnX2lub2RlKCkgYmVsb3cuCisJCSAqLworCQl2aS0+aV9zaXplID0gMDsKKwkJdmktPmlfYmxvY2tzID0gMDsKKworCQkvKiBTZXQgdGhlIHNlcXVlbmNlIG51bWJlci4gKi8KKwkJdmktPmlfZ2VuZXJhdGlvbiA9IG5pLT5zZXFfbm8gPSBsZTE2X3RvX2NwdShtLT5zZXF1ZW5jZV9udW1iZXIpOworCQkvKgorCQkgKiBNYW51YWxseSBtYXAsIHBpbiwgYW5kIGxvY2sgdGhlIG1mdCByZWNvcmQgYXMgd2UgYWxyZWFkeQorCQkgKiBoYXZlIGl0cyBwYWdlIG1hcHBlZCBhbmQgaXQgaXMgdmVyeSBlYXN5IHRvIGRvLgorCQkgKi8KKwkJYXRvbWljX2luYygmbmktPmNvdW50KTsKKwkJZG93bigmbmktPm1yZWNfbG9jayk7CisJCW5pLT5wYWdlID0gcGFnZTsKKwkJbmktPnBhZ2Vfb2ZzID0gb2ZzOworCQkvKgorCQkgKiBNYWtlIHN1cmUgdGhlIGFsbG9jYXRlZCBtZnQgcmVjb3JkIGlzIHdyaXR0ZW4gb3V0IHRvIGRpc2suCisJCSAqIE5PVEU6IFdlIGRvIG5vdCBzZXQgdGhlIG50ZnMgaW5vZGUgZGlydHkgYmVjYXVzZSB0aGlzIHdvdWxkCisJCSAqIGZhaWwgaW4gbnRmc193cml0ZV9pbm9kZSgpIGJlY2F1c2UgdGhlIGlub2RlIGRvZXMgbm90IGhhdmUgYQorCQkgKiBzdGFuZGFyZCBpbmZvcm1hdGlvbiBhdHRyaWJ1dGUgeWV0LiAgQWxzbywgdGhlcmUgaXMgbm8gbmVlZAorCQkgKiB0byBzZXQgdGhlIGlub2RlIGRpcnR5IGJlY2F1c2UgdGhlIGNhbGxlciBpcyBnb2luZyB0byBkbworCQkgKiB0aGF0IGFueXdheSBhZnRlciBmaW5pc2hpbmcgd2l0aCB0aGUgbmV3IG1mdCByZWNvcmQgKGUuZy4gYXQKKwkJICogYSBtaW5pbXVtIHNvbWUgbmV3IGF0dHJpYnV0ZXMgd2lsbCBiZSBhZGRlZCB0byB0aGUgbWZ0CisJCSAqIHJlY29yZC4KKwkJICovCisJCW1hcmtfbnRmc19yZWNvcmRfZGlydHkocGFnZSwgb2ZzKTsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisKKwkJLyogQWRkIHRoZSBpbm9kZSB0byB0aGUgaW5vZGUgaGFzaCBmb3IgdGhlIHN1cGVyYmxvY2suICovCisJCWluc2VydF9pbm9kZV9oYXNoKHZpKTsKKworCQkvKiBVcGRhdGUgdGhlIGRlZmF1bHQgbWZ0IGFsbG9jYXRpb24gcG9zaXRpb24uICovCisJCXZvbC0+bWZ0X2RhdGFfcG9zID0gYml0ICsgMTsKKwl9CisJLyoKKwkgKiBSZXR1cm4gdGhlIG9wZW5lZCwgYWxsb2NhdGVkIGlub2RlIG9mIHRoZSBhbGxvY2F0ZWQgbWZ0IHJlY29yZCBhcworCSAqIHdlbGwgYXMgdGhlIG1hcHBlZCwgcGlubmVkLCBhbmQgbG9ja2VkIG1mdCByZWNvcmQuCisJICovCisJbnRmc19kZWJ1ZygiUmV0dXJuaW5nIG9wZW5lZCwgYWxsb2NhdGVkICVzaW5vZGUgMHglbGx4LiIsCisJCQliYXNlX25pID8gImV4dGVudCAiIDogIiIsIChsb25nIGxvbmcpYml0KTsKKwkqbXJlYyA9IG07CisJcmV0dXJuIG5pOwordW5kb19kYXRhX2luaXQ6CisJbWZ0X25pLT5pbml0aWFsaXplZF9zaXplID0gb2xkX2RhdGFfaW5pdGlhbGl6ZWQ7CisJdm9sLT5tZnRfaW5vLT5pX3NpemUgPSBvbGRfZGF0YV9zaXplOworCWdvdG8gdW5kb19tZnRibXBfYWxsb2Nfbm9sb2NrOwordW5kb19tZnRibXBfYWxsb2M6CisJZG93bl93cml0ZSgmdm9sLT5tZnRibXBfbG9jayk7Cit1bmRvX21mdGJtcF9hbGxvY19ub2xvY2s6CisJaWYgKG50ZnNfYml0bWFwX2NsZWFyX2JpdCh2b2wtPm1mdGJtcF9pbm8sIGJpdCkpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGNsZWFyIGJpdCBpbiBtZnQgYml0bWFwLiVzIiwgZXMpOworCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJfQorCXVwX3dyaXRlKCZ2b2wtPm1mdGJtcF9sb2NrKTsKK2Vycl9vdXQ6CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK21heF9lcnJfb3V0OgorCW50ZnNfd2FybmluZyh2b2wtPnNiLCAiQ2Fubm90IGFsbG9jYXRlIG1mdCByZWNvcmQgYmVjYXVzZSB0aGUgbWF4aW11bSAiCisJCQkibnVtYmVyIG9mIGlub2RlcyAoMl4zMikgaGFzIGFscmVhZHkgYmVlbiByZWFjaGVkLiIpOworCXVwX3dyaXRlKCZ2b2wtPm1mdGJtcF9sb2NrKTsKKwlyZXR1cm4gRVJSX1BUUigtRU5PU1BDKTsKK30KKworLyoqCisgKiBudGZzX2V4dGVudF9tZnRfcmVjb3JkX2ZyZWUgLSBmcmVlIGFuIGV4dGVudCBtZnQgcmVjb3JkIG9uIGFuIG50ZnMgdm9sdW1lCisgKiBAbmk6CQludGZzIGlub2RlIG9mIHRoZSBtYXBwZWQgZXh0ZW50IG1mdCByZWNvcmQgdG8gZnJlZQorICogQG06CQltYXBwZWQgZXh0ZW50IG1mdCByZWNvcmQgb2YgdGhlIG50ZnMgaW5vZGUgQG5pCisgKgorICogRnJlZSB0aGUgbWFwcGVkIGV4dGVudCBtZnQgcmVjb3JkIEBtIG9mIHRoZSBleHRlbnQgbnRmcyBpbm9kZSBAbmkuCisgKgorICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gdW5tYXBzIHRoZSBtZnQgcmVjb3JkIGFuZCBjbG9zZXMgYW5kIGRlc3Ryb3lzIEBuaQorICogaW50ZXJuYWxseSBhbmQgaGVuY2UgeW91IGNhbm5vdCB1c2UgZWl0aGVyIEBuaSBub3IgQG0gYW55IG1vcmUgYWZ0ZXIgdGhpcworICogZnVuY3Rpb24gcmV0dXJucyBzdWNjZXNzLgorICoKKyAqIE9uIHN1Y2Nlc3MgcmV0dXJuIDAgYW5kIG9uIGVycm9yIHJldHVybiAtZXJybm8uICBAbmkgYW5kIEBtIGFyZSBzdGlsbCB2YWxpZAorICogaW4gdGhpcyBjYXNlIGFuZCBoYXZlIG5vdCBiZWVuIGZyZWVkLgorICoKKyAqIEZvciBzb21lIGVycm9ycyBhbiBlcnJvciBtZXNzYWdlIGlzIGRpc3BsYXllZCBhbmQgdGhlIHN1Y2Nlc3MgY29kZSAwIGlzCisgKiByZXR1cm5lZCBhbmQgdGhlIHZvbHVtZSBpcyB0aGVuIGxlZnQgZGlydHkgb24gdW1vdW50LiAgVGhpcyBtYWtlcyBzZW5zZSBpbgorICogY2FzZSB3ZSBjb3VsZCBub3Qgcm9sbGJhY2sgdGhlIGNoYW5nZXMgdGhhdCB3ZXJlIGFscmVhZHkgZG9uZSBzaW5jZSB0aGUKKyAqIGNhbGxlciBubyBsb25nZXIgd2FudHMgdG8gcmVmZXJlbmNlIHRoaXMgbWZ0IHJlY29yZCBzbyBpdCBkb2VzIG5vdCBtYXR0ZXIgdG8KKyAqIHRoZSBjYWxsZXIgaWYgc29tZXRoaW5nIGlzIHdyb25nIHdpdGggaXQgYXMgbG9uZyBhcyBpdCBpcyBwcm9wZXJseSBkZXRhY2hlZAorICogZnJvbSB0aGUgYmFzZSBpbm9kZS4KKyAqLworaW50IG50ZnNfZXh0ZW50X21mdF9yZWNvcmRfZnJlZShudGZzX2lub2RlICpuaSwgTUZUX1JFQ09SRCAqbSkKK3sKKwl1bnNpZ25lZCBsb25nIG1mdF9ubyA9IG5pLT5tZnRfbm87CisJbnRmc192b2x1bWUgKnZvbCA9IG5pLT52b2w7CisJbnRmc19pbm9kZSAqYmFzZV9uaTsKKwludGZzX2lub2RlICoqZXh0ZW50X25pczsKKwlpbnQgaSwgZXJyOworCWxlMTYgb2xkX3NlcV9ubzsKKwl1MTYgc2VxX25vOworCQorCUJVR19PTihOSW5vQXR0cihuaSkpOworCUJVR19PTihuaS0+bnJfZXh0ZW50cyAhPSAtMSk7CisKKwlkb3duKCZuaS0+ZXh0ZW50X2xvY2spOworCWJhc2VfbmkgPSBuaS0+ZXh0LmJhc2VfbnRmc19pbm87CisJdXAoJm5pLT5leHRlbnRfbG9jayk7CisKKwlCVUdfT04oYmFzZV9uaS0+bnJfZXh0ZW50cyA8PSAwKTsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nIGZvciBleHRlbnQgaW5vZGUgMHglbHgsIGJhc2UgaW5vZGUgMHglbHguXG4iLAorCQkJbWZ0X25vLCBiYXNlX25pLT5tZnRfbm8pOworCisJZG93bigmYmFzZV9uaS0+ZXh0ZW50X2xvY2spOworCisJLyogTWFrZSBzdXJlIHdlIGFyZSBob2xkaW5nIHRoZSBvbmx5IHJlZmVyZW5jZSB0byB0aGUgZXh0ZW50IGlub2RlLiAqLworCWlmIChhdG9taWNfcmVhZCgmbmktPmNvdW50KSA+IDIpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiVHJpZWQgdG8gZnJlZSBidXN5IGV4dGVudCBpbm9kZSAweCVseCwgIgorCQkJCSJub3QgZnJlZWluZy4iLCBiYXNlX25pLT5tZnRfbm8pOworCQl1cCgmYmFzZV9uaS0+ZXh0ZW50X2xvY2spOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCS8qIERpc3NvY2lhdGUgdGhlIG50ZnMgaW5vZGUgZnJvbSB0aGUgYmFzZSBpbm9kZS4gKi8KKwlleHRlbnRfbmlzID0gYmFzZV9uaS0+ZXh0LmV4dGVudF9udGZzX2lub3M7CisJZXJyID0gLUVOT0VOVDsKKwlmb3IgKGkgPSAwOyBpIDwgYmFzZV9uaS0+bnJfZXh0ZW50czsgaSsrKSB7CisJCWlmIChuaSAhPSBleHRlbnRfbmlzW2ldKQorCQkJY29udGludWU7CisJCWV4dGVudF9uaXMgKz0gaTsKKwkJYmFzZV9uaS0+bnJfZXh0ZW50cy0tOworCQltZW1tb3ZlKGV4dGVudF9uaXMsIGV4dGVudF9uaXMgKyAxLCAoYmFzZV9uaS0+bnJfZXh0ZW50cyAtIGkpICoKKwkJCQlzaXplb2YobnRmc19pbm9kZSopKTsKKwkJZXJyID0gMDsKKwkJYnJlYWs7CisJfQorCisJdXAoJmJhc2VfbmktPmV4dGVudF9sb2NrKTsKKworCWlmICh1bmxpa2VseShlcnIpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkV4dGVudCBpbm9kZSAweCVseCBpcyBub3QgYXR0YWNoZWQgdG8gIgorCQkJCSJpdHMgYmFzZSBpbm9kZSAweCVseC4iLCBtZnRfbm8sCisJCQkJYmFzZV9uaS0+bWZ0X25vKTsKKwkJQlVHKCk7CisJfQorCisJLyoKKwkgKiBUaGUgZXh0ZW50IGlub2RlIGlzIG5vIGxvbmdlciBhdHRhY2hlZCB0byB0aGUgYmFzZSBpbm9kZSBzbyBubyBvbmUKKwkgKiBjYW4gZ2V0IGEgcmVmZXJlbmNlIHRvIGl0IGFueSBtb3JlLgorCSAqLworCisJLyogTWFyayB0aGUgbWZ0IHJlY29yZCBhcyBub3QgaW4gdXNlLiAqLworCW0tPmZsYWdzICY9IGNvbnN0X2NwdV90b19sZTE2KH5jb25zdF9sZTE2X3RvX2NwdShNRlRfUkVDT1JEX0lOX1VTRSkpOworCisJLyogSW5jcmVtZW50IHRoZSBzZXF1ZW5jZSBudW1iZXIsIHNraXBwaW5nIHplcm8sIGlmIGl0IGlzIG5vdCB6ZXJvLiAqLworCW9sZF9zZXFfbm8gPSBtLT5zZXF1ZW5jZV9udW1iZXI7CisJc2VxX25vID0gbGUxNl90b19jcHUob2xkX3NlcV9ubyk7CisJaWYgKHNlcV9ubyA9PSAweGZmZmYpCisJCXNlcV9ubyA9IDE7CisJZWxzZSBpZiAoc2VxX25vKQorCQlzZXFfbm8rKzsKKwltLT5zZXF1ZW5jZV9udW1iZXIgPSBjcHVfdG9fbGUxNihzZXFfbm8pOworCisJLyoKKwkgKiBTZXQgdGhlIG50ZnMgaW5vZGUgZGlydHkgYW5kIHdyaXRlIGl0IG91dC4gIFdlIGRvIG5vdCBuZWVkIHRvIHdvcnJ5CisJICogYWJvdXQgdGhlIGJhc2UgaW5vZGUgaGVyZSBzaW5jZSB3aGF0ZXZlciBjYXVzZWQgdGhlIGV4dGVudCBtZnQKKwkgKiByZWNvcmQgdG8gYmUgZnJlZWQgaXMgZ3VhcmFudGVlZCB0byBkbyBpdCBhbHJlYWR5LgorCSAqLworCU5Jbm9TZXREaXJ0eShuaSk7CisJZXJyID0gd3JpdGVfbWZ0X3JlY29yZChuaSwgbSwgMCk7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIHdyaXRlIG1mdCByZWNvcmQgMHglbHgsIG5vdCAiCisJCQkJImZyZWVpbmcuIiwgbWZ0X25vKTsKKwkJZ290byByb2xsYmFjazsKKwl9Cityb2xsYmFja19lcnJvcjoKKwkvKiBVbm1hcCBhbmQgdGhyb3cgYXdheSB0aGUgbm93IGZyZWVkIGV4dGVudCBpbm9kZS4gKi8KKwl1bm1hcF9leHRlbnRfbWZ0X3JlY29yZChuaSk7CisJbnRmc19jbGVhcl9leHRlbnRfaW5vZGUobmkpOworCisJLyogQ2xlYXIgdGhlIGJpdCBpbiB0aGUgJE1GVC8kQklUTUFQIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyByZWNvcmQuICovCisJZG93bl93cml0ZSgmdm9sLT5tZnRibXBfbG9jayk7CisJZXJyID0gbnRmc19iaXRtYXBfY2xlYXJfYml0KHZvbC0+bWZ0Ym1wX2lubywgbWZ0X25vKTsKKwl1cF93cml0ZSgmdm9sLT5tZnRibXBfbG9jayk7CisJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJLyoKKwkJICogVGhlIGV4dGVudCBpbm9kZSBpcyBnb25lIGJ1dCB3ZSBmYWlsZWQgdG8gZGVhbGxvY2F0ZSBpdCBpbgorCQkgKiB0aGUgbWZ0IGJpdG1hcC4gIEp1c3QgZW1pdCBhIHdhcm5pbmcgYW5kIGxlYXZlIHRoZSB2b2x1bWUKKwkJICogZGlydHkgb24gdW1vdW50LgorCQkgKi8KKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGNsZWFyIGJpdCBpbiBtZnQgYml0bWFwLiVzIiwgZXMpOworCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJfQorCXJldHVybiAwOworcm9sbGJhY2s6CisJLyogUm9sbGJhY2sgd2hhdCB3ZSBkaWQuLi4gKi8KKwlkb3duKCZiYXNlX25pLT5leHRlbnRfbG9jayk7CisJZXh0ZW50X25pcyA9IGJhc2VfbmktPmV4dC5leHRlbnRfbnRmc19pbm9zOworCWlmICghKGJhc2VfbmktPm5yX2V4dGVudHMgJiAzKSkgeworCQlpbnQgbmV3X3NpemUgPSAoYmFzZV9uaS0+bnJfZXh0ZW50cyArIDQpICogc2l6ZW9mKG50ZnNfaW5vZGUqKTsKKworCQlleHRlbnRfbmlzID0gKG50ZnNfaW5vZGUqKilrbWFsbG9jKG5ld19zaXplLCBHRlBfTk9GUyk7CisJCWlmICh1bmxpa2VseSghZXh0ZW50X25pcykpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBpbnRlcm5hbCAiCisJCQkJCSJidWZmZXIgZHVyaW5nIHJvbGxiYWNrLiVzIiwgZXMpOworCQkJdXAoJmJhc2VfbmktPmV4dGVudF9sb2NrKTsKKwkJCU5Wb2xTZXRFcnJvcnModm9sKTsKKwkJCWdvdG8gcm9sbGJhY2tfZXJyb3I7CisJCX0KKwkJaWYgKGJhc2VfbmktPm5yX2V4dGVudHMpIHsKKwkJCUJVR19PTighYmFzZV9uaS0+ZXh0LmV4dGVudF9udGZzX2lub3MpOworCQkJbWVtY3B5KGV4dGVudF9uaXMsIGJhc2VfbmktPmV4dC5leHRlbnRfbnRmc19pbm9zLAorCQkJCQluZXdfc2l6ZSAtIDQgKiBzaXplb2YobnRmc19pbm9kZSopKTsKKwkJCWtmcmVlKGJhc2VfbmktPmV4dC5leHRlbnRfbnRmc19pbm9zKTsKKwkJfQorCQliYXNlX25pLT5leHQuZXh0ZW50X250ZnNfaW5vcyA9IGV4dGVudF9uaXM7CisJfQorCW0tPmZsYWdzIHw9IE1GVF9SRUNPUkRfSU5fVVNFOworCW0tPnNlcXVlbmNlX251bWJlciA9IG9sZF9zZXFfbm87CisJZXh0ZW50X25pc1tiYXNlX25pLT5ucl9leHRlbnRzKytdID0gbmk7CisJdXAoJmJhc2VfbmktPmV4dGVudF9sb2NrKTsKKwltYXJrX21mdF9yZWNvcmRfZGlydHkobmkpOworCXJldHVybiBlcnI7Cit9CisjZW5kaWYgLyogTlRGU19SVyAqLwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9tZnQuaCBiL2ZzL250ZnMvbWZ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA3ZGUyYwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvbWZ0LmgKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBtZnQuaCAtIERlZmluZXMgZm9yIG1mdCByZWNvcmQgaGFuZGxpbmcgaW4gTlRGUyBMaW51eCBrZXJuZWwgZHJpdmVyLgorICoJICAgUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX0xJTlVYX05URlNfTUZUX0gKKyNkZWZpbmUgX0xJTlVYX05URlNfTUZUX0gKKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKworI2luY2x1ZGUgImlub2RlLmgiCisKK2V4dGVybiBNRlRfUkVDT1JEICptYXBfbWZ0X3JlY29yZChudGZzX2lub2RlICpuaSk7CitleHRlcm4gdm9pZCB1bm1hcF9tZnRfcmVjb3JkKG50ZnNfaW5vZGUgKm5pKTsKKworZXh0ZXJuIE1GVF9SRUNPUkQgKm1hcF9leHRlbnRfbWZ0X3JlY29yZChudGZzX2lub2RlICpiYXNlX25pLCBNRlRfUkVGIG1yZWYsCisJCW50ZnNfaW5vZGUgKipudGZzX2lubyk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1bm1hcF9leHRlbnRfbWZ0X3JlY29yZChudGZzX2lub2RlICpuaSkKK3sKKwl1bm1hcF9tZnRfcmVjb3JkKG5pKTsKKwlyZXR1cm47Cit9CisKKyNpZmRlZiBOVEZTX1JXCisKKy8qKgorICogZmx1c2hfZGNhY2hlX21mdF9yZWNvcmRfcGFnZSAtIGZsdXNoX2RjYWNoZV9wYWdlKCkgZm9yIG1mdCByZWNvcmRzCisgKiBAbmk6CQludGZzIGlub2RlIHN0cnVjdHVyZSBvZiBtZnQgcmVjb3JkCisgKgorICogQ2FsbCBmbHVzaF9kY2FjaGVfcGFnZSgpIGZvciB0aGUgcGFnZSBpbiB3aGljaCBhbiBtZnQgcmVjb3JkIHJlc2lkZXMuCisgKgorICogVGhpcyBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIGFuIG1mdCByZWNvcmQgaXMgbW9kaWZpZWQsIGp1c3QgYWZ0ZXIgdGhlCisgKiBtb2RpZmljYXRpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF9kY2FjaGVfbWZ0X3JlY29yZF9wYWdlKG50ZnNfaW5vZGUgKm5pKQoreworCWZsdXNoX2RjYWNoZV9wYWdlKG5pLT5wYWdlKTsKK30KKworZXh0ZXJuIHZvaWQgX19tYXJrX21mdF9yZWNvcmRfZGlydHkobnRmc19pbm9kZSAqbmkpOworCisvKioKKyAqIG1hcmtfbWZ0X3JlY29yZF9kaXJ0eSAtIHNldCB0aGUgbWZ0IHJlY29yZCBhbmQgdGhlIHBhZ2UgY29udGFpbmluZyBpdCBkaXJ0eQorICogQG5pOgkJbnRmcyBpbm9kZSBkZXNjcmliaW5nIHRoZSBtYXBwZWQgbWZ0IHJlY29yZAorICoKKyAqIFNldCB0aGUgbWFwcGVkIChleHRlbnQpIG1mdCByZWNvcmQgb2YgdGhlIChiYXNlIG9yIGV4dGVudCkgbnRmcyBpbm9kZSBAbmksCisgKiBhcyB3ZWxsIGFzIHRoZSBwYWdlIGNvbnRhaW5pbmcgdGhlIG1mdCByZWNvcmQsIGRpcnR5LiAgQWxzbywgbWFyayB0aGUgYmFzZQorICogdmZzIGlub2RlIGRpcnR5LiAgVGhpcyBlbnN1cmVzIHRoYXQgYW55IGNoYW5nZXMgdG8gdGhlIG1mdCByZWNvcmQgYXJlCisgKiB3cml0dGVuIG91dCB0byBkaXNrLgorICoKKyAqIE5PVEU6ICBEbyBub3QgZG8gYW55dGhpbmcgaWYgdGhlIG1mdCByZWNvcmQgaXMgYWxyZWFkeSBtYXJrZWQgZGlydHkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBtYXJrX21mdF9yZWNvcmRfZGlydHkobnRmc19pbm9kZSAqbmkpCit7CisJaWYgKCFOSW5vVGVzdFNldERpcnR5KG5pKSkKKwkJX19tYXJrX21mdF9yZWNvcmRfZGlydHkobmkpOworfQorCitleHRlcm4gaW50IG50ZnNfc3luY19tZnRfbWlycm9yKG50ZnNfdm9sdW1lICp2b2wsIGNvbnN0IHVuc2lnbmVkIGxvbmcgbWZ0X25vLAorCQlNRlRfUkVDT1JEICptLCBpbnQgc3luYyk7CisKK2V4dGVybiBpbnQgd3JpdGVfbWZ0X3JlY29yZF9ub2xvY2sobnRmc19pbm9kZSAqbmksIE1GVF9SRUNPUkQgKm0sIGludCBzeW5jKTsKKworLyoqCisgKiB3cml0ZV9tZnRfcmVjb3JkIC0gd3JpdGUgb3V0IGEgbWFwcGVkIChleHRlbnQpIG1mdCByZWNvcmQKKyAqIEBuaToJCW50ZnMgaW5vZGUgZGVzY3JpYmluZyB0aGUgbWFwcGVkIChleHRlbnQpIG1mdCByZWNvcmQKKyAqIEBtOgkJbWFwcGVkIChleHRlbnQpIG1mdCByZWNvcmQgdG8gd3JpdGUKKyAqIEBzeW5jOglpZiB0cnVlLCB3YWl0IGZvciBpL28gY29tcGxldGlvbgorICoKKyAqIFRoaXMgaXMganVzdCBhIHdyYXBwZXIgZm9yIHdyaXRlX21mdF9yZWNvcmRfbm9sb2NrKCkgKHNlZSBtZnQuYyksIHdoaWNoCisgKiBsb2NrcyB0aGUgcGFnZSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB3cml0ZS4gIFRoaXMgZW5zdXJlcyB0aGF0IHRoZXJlIGFyZQorICogbm8gcmFjZSBjb25kaXRpb25zIGJldHdlZW4gd3JpdGluZyB0aGUgbWZ0IHJlY29yZCB2aWEgdGhlIGRpcnR5IGlub2RlIGNvZGUKKyAqIHBhdGhzIGFuZCB2aWEgdGhlIHBhZ2UgY2FjaGUgd3JpdGUgYmFjayBjb2RlIHBhdGhzIG9yIGJldHdlZW4gd3JpdGluZworICogbmVpZ2hib3VyaW5nIG1mdCByZWNvcmRzIHJlc2lkaW5nIGluIHRoZSBzYW1lIHBhZ2UuCisgKgorICogTG9ja2luZyB0aGUgcGFnZSBhbHNvIHNlcmlhbGl6ZXMgdXMgYWdhaW5zdCAtPnJlYWRwYWdlKCkgaWYgdGhlIHBhZ2UgaXMgbm90CisgKiB1cHRvZGF0ZS4KKyAqCisgKiBPbiBzdWNjZXNzLCBjbGVhbiB0aGUgbWZ0IHJlY29yZCBhbmQgcmV0dXJuIDAuICBPbiBlcnJvciwgbGVhdmUgdGhlIG1mdAorICogcmVjb3JkIGRpcnR5IGFuZCByZXR1cm4gLWVycm5vLiAgVGhlIGNhbGxlciBzaG91bGQgY2FsbCBtYWtlX2JhZF9pbm9kZSgpIG9uCisgKiB0aGUgYmFzZSBpbm9kZSB0byBlbnN1cmUgbm8gbW9yZSBhY2Nlc3MgaGFwcGVucyB0byB0aGlzIGlub2RlLiAgV2UgZG8gbm90IGRvCisgKiBpdCBoZXJlIGFzIHRoZSBjYWxsZXIgbWF5IHdhbnQgdG8gZmluaXNoIHdyaXRpbmcgb3RoZXIgZXh0ZW50IG1mdCByZWNvcmRzCisgKiBmaXJzdCB0byBtaW5pbWl6ZSBvbi1kaXNrIG1ldGFkYXRhIGluY29uc2lzdGVuY2llcy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgd3JpdGVfbWZ0X3JlY29yZChudGZzX2lub2RlICpuaSwgTUZUX1JFQ09SRCAqbSwgaW50IHN5bmMpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBuaS0+cGFnZTsKKwlpbnQgZXJyOworCisJQlVHX09OKCFwYWdlKTsKKwlsb2NrX3BhZ2UocGFnZSk7CisJZXJyID0gd3JpdGVfbWZ0X3JlY29yZF9ub2xvY2sobmksIG0sIHN5bmMpOworCXVubG9ja19wYWdlKHBhZ2UpOworCXJldHVybiBlcnI7Cit9CisKK2V4dGVybiBCT09MIG50ZnNfbWF5X3dyaXRlX21mdF9yZWNvcmQobnRmc192b2x1bWUgKnZvbCwKKwkJY29uc3QgdW5zaWduZWQgbG9uZyBtZnRfbm8sIGNvbnN0IE1GVF9SRUNPUkQgKm0sCisJCW50ZnNfaW5vZGUgKipsb2NrZWRfbmkpOworCitleHRlcm4gbnRmc19pbm9kZSAqbnRmc19tZnRfcmVjb3JkX2FsbG9jKG50ZnNfdm9sdW1lICp2b2wsIGNvbnN0IGludCBtb2RlLAorCQludGZzX2lub2RlICpiYXNlX25pLCBNRlRfUkVDT1JEICoqbXJlYyk7CitleHRlcm4gaW50IG50ZnNfZXh0ZW50X21mdF9yZWNvcmRfZnJlZShudGZzX2lub2RlICpuaSwgTUZUX1JFQ09SRCAqbSk7CisKKyNlbmRpZiAvKiBOVEZTX1JXICovCisKKyNlbmRpZiAvKiBfTElOVVhfTlRGU19NRlRfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9tc3QuYyBiL2ZzL250ZnMvbXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE4NThkOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvbXN0LmMKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKiBtc3QuYyAtIE5URlMgbXVsdGkgc2VjdG9yIHRyYW5zZmVyIHByb3RlY3Rpb24gaGFuZGxpbmcgY29kZS4gUGFydCBvZiB0aGUKKyAqCSAgIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSAibnRmcy5oIgorCisvKioKKyAqIHBvc3RfcmVhZF9tc3RfZml4dXAgLSBkZXByb3RlY3QgbXVsdGkgc2VjdG9yIHRyYW5zZmVyIHByb3RlY3RlZCBkYXRhCisgKiBAYjoJCXBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gZGVwcm90ZWN0CisgKiBAc2l6ZToJc2l6ZSBpbiBieXRlcyBvZiBAYgorICoKKyAqIFBlcmZvcm0gdGhlIG5lY2Vzc2FyeSBwb3N0IHJlYWQgbXVsdGkgc2VjdG9yIHRyYW5zZmVyIGZpeHVwIGFuZCBkZXRlY3QgdGhlCisgKiBwcmVzZW5jZSBvZiBpbmNvbXBsZXRlIG11bHRpIHNlY3RvciB0cmFuc2ZlcnMuIC0gSW4gdGhhdCBjYXNlLCBvdmVyd3JpdGUgdGhlCisgKiBtYWdpYyBvZiB0aGUgbnRmcyByZWNvcmQgaGVhZGVyIGJlaW5nIHByb2Nlc3NlZCB3aXRoICJCQUFEIiAoaW4gbWVtb3J5IG9ubHkhKQorICogYW5kIGFib3J0IHByb2Nlc3NpbmcuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLUVJTlZBTCBvbiBlcnJvciAoIkJBQUQiIG1hZ2ljIHdpbGwgYmUgcHJlc2VudCkuCisgKgorICogTk9URTogV2UgY29uc2lkZXIgdGhlIGFic2VuY2UgLyBpbnZhbGlkaXR5IG9mIGFuIHVwZGF0ZSBzZXF1ZW5jZSBhcnJheSB0bworICogbWVhbiB0aGF0IHRoZSBzdHJ1Y3R1cmUgaXMgbm90IHByb3RlY3RlZCBhdCBhbGwgYW5kIGhlbmNlIGRvZXNuJ3QgbmVlZCB0bworICogYmUgZml4ZWQgdXAuIFRodXMsIHdlIHJldHVybiBzdWNjZXNzIGFuZCBub3QgZmFpbHVyZSBpbiB0aGlzIGNhc2UuIFRoaXMgaXMKKyAqIGluIGNvbnRyYXN0IHRvIHByZV93cml0ZV9tc3RfZml4dXAoKSwgc2VlIGJlbG93LgorICovCitpbnQgcG9zdF9yZWFkX21zdF9maXh1cChOVEZTX1JFQ09SRCAqYiwgY29uc3QgdTMyIHNpemUpCit7CisJdTE2IHVzYV9vZnMsIHVzYV9jb3VudCwgdXNuOworCXUxNiAqdXNhX3BvcywgKmRhdGFfcG9zOworCisJLyogU2V0dXAgdGhlIHZhcmlhYmxlcy4gKi8KKwl1c2Ffb2ZzID0gbGUxNl90b19jcHUoYi0+dXNhX29mcyk7CisJLyogRGVjcmVtZW50IHVzYV9jb3VudCB0byBnZXQgbnVtYmVyIG9mIGZpeHVwcy4gKi8KKwl1c2FfY291bnQgPSBsZTE2X3RvX2NwdShiLT51c2FfY291bnQpIC0gMTsKKwkvKiBTaXplIGFuZCBhbGlnbm1lbnQgY2hlY2tzLiAqLworCWlmICggc2l6ZSAmIChOVEZTX0JMT0NLX1NJWkUgLSAxKQl8fAorCSAgICAgdXNhX29mcyAmIDEJCQl8fAorCSAgICAgdXNhX29mcyArICh1c2FfY291bnQgKiAyKSA+IHNpemUJfHwKKwkgICAgIChzaXplID4+IE5URlNfQkxPQ0tfU0laRV9CSVRTKSAhPSB1c2FfY291bnQpCisJCXJldHVybiAwOworCS8qIFBvc2l0aW9uIG9mIHVzbiBpbiB1cGRhdGUgc2VxdWVuY2UgYXJyYXkuICovCisJdXNhX3BvcyA9ICh1MTYqKWIgKyB1c2Ffb2ZzL3NpemVvZih1MTYpOworCS8qCisJICogVGhlIHVwZGF0ZSBzZXF1ZW5jZSBudW1iZXIgd2hpY2ggaGFzIHRvIGJlIGVxdWFsIHRvIGVhY2ggb2YgdGhlCisJICogdTE2IHZhbHVlcyBiZWZvcmUgdGhleSBhcmUgZml4ZWQgdXAuIE5vdGUgbm8gbmVlZCB0byBjYXJlIGZvcgorCSAqIGVuZGlhbm5lc3Mgc2luY2Ugd2UgYXJlIGNvbXBhcmluZyBhbmQgbW92aW5nIGRhdGEgZm9yIG9uIGRpc2sKKwkgKiBzdHJ1Y3R1cmVzIHdoaWNoIG1lYW5zIHRoZSBkYXRhIGlzIGNvbnNpc3RlbnQuIC0gSWYgaXQgaXMKKwkgKiBjb25zaXN0ZW50eSB0aGUgd3JvbmcgZW5kaWFubmVzcyBpdCBkb2Vzbid0IG1ha2UgYW55IGRpZmZlcmVuY2UuCisJICovCisJdXNuID0gKnVzYV9wb3M7CisJLyoKKwkgKiBQb3NpdGlvbiBpbiBwcm90ZWN0ZWQgZGF0YSBvZiBmaXJzdCB1MTYgdGhhdCBuZWVkcyBmaXhpbmcgdXAuCisJICovCisJZGF0YV9wb3MgPSAodTE2KiliICsgTlRGU19CTE9DS19TSVpFL3NpemVvZih1MTYpIC0gMTsKKwkvKgorCSAqIENoZWNrIGZvciBpbmNvbXBsZXRlIG11bHRpIHNlY3RvciB0cmFuc2ZlcihzKS4KKwkgKi8KKwl3aGlsZSAodXNhX2NvdW50LS0pIHsKKwkJaWYgKCpkYXRhX3BvcyAhPSB1c24pIHsKKwkJCS8qCisJCQkgKiBJbmNvbXBsZXRlIG11bHRpIHNlY3RvciB0cmFuc2ZlciBkZXRlY3RlZCEgKS06CisJCQkgKiBTZXQgdGhlIG1hZ2ljIHRvICJCQUFEIiBhbmQgcmV0dXJuIGZhaWx1cmUuCisJCQkgKiBOb3RlIHRoYXQgbWFnaWNfQkFBRCBpcyBhbHJlYWR5IGNvbnZlcnRlZCB0byBsZTMyLgorCQkJICovCisJCQliLT5tYWdpYyA9IG1hZ2ljX0JBQUQ7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlkYXRhX3BvcyArPSBOVEZTX0JMT0NLX1NJWkUvc2l6ZW9mKHUxNik7CisJfQorCS8qIFJlLXNldHVwIHRoZSB2YXJpYWJsZXMuICovCisJdXNhX2NvdW50ID0gbGUxNl90b19jcHUoYi0+dXNhX2NvdW50KSAtIDE7CisJZGF0YV9wb3MgPSAodTE2KiliICsgTlRGU19CTE9DS19TSVpFL3NpemVvZih1MTYpIC0gMTsKKwkvKiBGaXh1cCBhbGwgc2VjdG9ycy4gKi8KKwl3aGlsZSAodXNhX2NvdW50LS0pIHsKKwkJLyoKKwkJICogSW5jcmVtZW50IHBvc2l0aW9uIGluIHVzYSBhbmQgcmVzdG9yZSBvcmlnaW5hbCBkYXRhIGZyb20KKwkJICogdGhlIHVzYSBpbnRvIHRoZSBkYXRhIGJ1ZmZlci4KKwkJICovCisJCSpkYXRhX3BvcyA9ICooKyt1c2FfcG9zKTsKKwkJLyogSW5jcmVtZW50IHBvc2l0aW9uIGluIGRhdGEgYXMgd2VsbC4gKi8KKwkJZGF0YV9wb3MgKz0gTlRGU19CTE9DS19TSVpFL3NpemVvZih1MTYpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBwcmVfd3JpdGVfbXN0X2ZpeHVwIC0gYXBwbHkgbXVsdGkgc2VjdG9yIHRyYW5zZmVyIHByb3RlY3Rpb24KKyAqIEBiOgkJcG9pbnRlciB0byB0aGUgZGF0YSB0byBwcm90ZWN0CisgKiBAc2l6ZToJc2l6ZSBpbiBieXRlcyBvZiBAYgorICoKKyAqIFBlcmZvcm0gdGhlIG5lY2Vzc2FyeSBwcmUgd3JpdGUgbXVsdGkgc2VjdG9yIHRyYW5zZmVyIGZpeHVwIG9uIHRoZSBkYXRhCisgKiBwb2ludGVyIHRvIGJ5IEBiIG9mIEBzaXplLgorICoKKyAqIFJldHVybiAwIGlmIGZpeHVwIGFwcGxpZWQgKHN1Y2Nlc3MpIG9yIC1FSU5WQUwgaWYgbm8gZml4dXAgd2FzIHBlcmZvcm1lZAorICogKGFzc3VtZWQgbm90IG5lZWRlZCkuIFRoaXMgaXMgaW4gY29udHJhc3QgdG8gcG9zdF9yZWFkX21zdF9maXh1cCgpIGFib3ZlLgorICoKKyAqIE5PVEU6IFdlIGNvbnNpZGVyIHRoZSBhYnNlbmNlIC8gaW52YWxpZGl0eSBvZiBhbiB1cGRhdGUgc2VxdWVuY2UgYXJyYXkgdG8KKyAqIG1lYW4gdGhhdCB0aGUgc3RydWN0dXJlIGlzIG5vdCBzdWJqZWN0IHRvIHByb3RlY3Rpb24gYW5kIGhlbmNlIGRvZXNuJ3QgbmVlZAorICogdG8gYmUgZml4ZWQgdXAuIFRoaXMgbWVhbnMgdGhhdCB5b3UgaGF2ZSB0byBjcmVhdGUgYSB2YWxpZCB1cGRhdGUgc2VxdWVuY2UKKyAqIGFycmF5IGhlYWRlciBpbiB0aGUgbnRmcyByZWNvcmQgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiwgb3RoZXJ3aXNlIGl0CisgKiB3aWxsIGZhaWwgKHRoZSBoZWFkZXIgbmVlZHMgdG8gY29udGFpbiB0aGUgcG9zaXRpb24gb2YgdGhlIHVwZGF0ZSBzZXF1ZW5jZQorICogYXJyYXkgdG9nZXRoZXIgd2l0aCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheSkuIFlvdSBhbHNvIG5lZWQgdG8KKyAqIGluaXRpYWxpc2UgdGhlIHVwZGF0ZSBzZXF1ZW5jZSBudW1iZXIgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbgorICogb3RoZXJ3aXNlIGEgcmFuZG9tIHdvcmQgd2lsbCBiZSB1c2VkICh3aGF0ZXZlciB3YXMgaW4gdGhlIHJlY29yZCBhdCB0aGF0CisgKiBwb3NpdGlvbiBhdCB0aGF0IHRpbWUpLgorICovCitpbnQgcHJlX3dyaXRlX21zdF9maXh1cChOVEZTX1JFQ09SRCAqYiwgY29uc3QgdTMyIHNpemUpCit7CisJbGUxNiAqdXNhX3BvcywgKmRhdGFfcG9zOworCXUxNiB1c2Ffb2ZzLCB1c2FfY291bnQsIHVzbjsKKwlsZTE2IGxlX3VzbjsKKworCS8qIFNhbml0eSBjaGVjayArIG9ubHkgZml4dXAgaWYgaXQgbWFrZXMgc2Vuc2UuICovCisJaWYgKCFiIHx8IG50ZnNfaXNfYmFhZF9yZWNvcmQoYi0+bWFnaWMpIHx8CisJCQludGZzX2lzX2hvbGVfcmVjb3JkKGItPm1hZ2ljKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJLyogU2V0dXAgdGhlIHZhcmlhYmxlcy4gKi8KKwl1c2Ffb2ZzID0gbGUxNl90b19jcHUoYi0+dXNhX29mcyk7CisJLyogRGVjcmVtZW50IHVzYV9jb3VudCB0byBnZXQgbnVtYmVyIG9mIGZpeHVwcy4gKi8KKwl1c2FfY291bnQgPSBsZTE2X3RvX2NwdShiLT51c2FfY291bnQpIC0gMTsKKwkvKiBTaXplIGFuZCBhbGlnbm1lbnQgY2hlY2tzLiAqLworCWlmICggc2l6ZSAmIChOVEZTX0JMT0NLX1NJWkUgLSAxKQl8fAorCSAgICAgdXNhX29mcyAmIDEJCQl8fAorCSAgICAgdXNhX29mcyArICh1c2FfY291bnQgKiAyKSA+IHNpemUJfHwKKwkgICAgIChzaXplID4+IE5URlNfQkxPQ0tfU0laRV9CSVRTKSAhPSB1c2FfY291bnQpCisJCXJldHVybiAtRUlOVkFMOworCS8qIFBvc2l0aW9uIG9mIHVzbiBpbiB1cGRhdGUgc2VxdWVuY2UgYXJyYXkuICovCisJdXNhX3BvcyA9IChsZTE2KikoKHU4KiliICsgdXNhX29mcyk7CisJLyoKKwkgKiBDeWNsaWNhbGx5IGluY3JlbWVudCB0aGUgdXBkYXRlIHNlcXVlbmNlIG51bWJlcgorCSAqIChza2lwcGluZyAwIGFuZCAtMSwgaS5lLiAweGZmZmYpLgorCSAqLworCXVzbiA9IGxlMTZfdG9fY3B1cCh1c2FfcG9zKSArIDE7CisJaWYgKHVzbiA9PSAweGZmZmYgfHwgIXVzbikKKwkJdXNuID0gMTsKKwlsZV91c24gPSBjcHVfdG9fbGUxNih1c24pOworCSp1c2FfcG9zID0gbGVfdXNuOworCS8qIFBvc2l0aW9uIGluIGRhdGEgb2YgZmlyc3QgdTE2IHRoYXQgbmVlZHMgZml4aW5nIHVwLiAqLworCWRhdGFfcG9zID0gKGxlMTYqKWIgKyBOVEZTX0JMT0NLX1NJWkUvc2l6ZW9mKGxlMTYpIC0gMTsKKwkvKiBGaXh1cCBhbGwgc2VjdG9ycy4gKi8KKwl3aGlsZSAodXNhX2NvdW50LS0pIHsKKwkJLyoKKwkJICogSW5jcmVtZW50IHRoZSBwb3NpdGlvbiBpbiB0aGUgdXNhIGFuZCBzYXZlIHRoZQorCQkgKiBvcmlnaW5hbCBkYXRhIGZyb20gdGhlIGRhdGEgYnVmZmVyIGludG8gdGhlIHVzYS4KKwkJICovCisJCSooKyt1c2FfcG9zKSA9ICpkYXRhX3BvczsKKwkJLyogQXBwbHkgZml4dXAgdG8gZGF0YS4gKi8KKwkJKmRhdGFfcG9zID0gbGVfdXNuOworCQkvKiBJbmNyZW1lbnQgcG9zaXRpb24gaW4gZGF0YSBhcyB3ZWxsLiAqLworCQlkYXRhX3BvcyArPSBOVEZTX0JMT0NLX1NJWkUvc2l6ZW9mKGxlMTYpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBwb3N0X3dyaXRlX21zdF9maXh1cCAtIGZhc3QgZGVwcm90ZWN0IG11bHRpIHNlY3RvciB0cmFuc2ZlciBwcm90ZWN0ZWQgZGF0YQorICogQGI6CQlwb2ludGVyIHRvIHRoZSBkYXRhIHRvIGRlcHJvdGVjdAorICoKKyAqIFBlcmZvcm0gdGhlIG5lY2Vzc2FyeSBwb3N0IHdyaXRlIG11bHRpIHNlY3RvciB0cmFuc2ZlciBmaXh1cCwgbm90IGNoZWNraW5nCisgKiBmb3IgYW55IGVycm9ycywgYmVjYXVzZSB3ZSBhc3N1bWUgd2UgaGF2ZSBqdXN0IHVzZWQgcHJlX3dyaXRlX21zdF9maXh1cCgpLAorICogdGh1cyB0aGUgZGF0YSB3aWxsIGJlIGZpbmUgb3Igd2Ugd291bGQgbmV2ZXIgaGF2ZSBnb3R0ZW4gaGVyZS4KKyAqLwordm9pZCBwb3N0X3dyaXRlX21zdF9maXh1cChOVEZTX1JFQ09SRCAqYikKK3sKKwlsZTE2ICp1c2FfcG9zLCAqZGF0YV9wb3M7CisKKwl1MTYgdXNhX29mcyA9IGxlMTZfdG9fY3B1KGItPnVzYV9vZnMpOworCXUxNiB1c2FfY291bnQgPSBsZTE2X3RvX2NwdShiLT51c2FfY291bnQpIC0gMTsKKworCS8qIFBvc2l0aW9uIG9mIHVzbiBpbiB1cGRhdGUgc2VxdWVuY2UgYXJyYXkuICovCisJdXNhX3BvcyA9IChsZTE2KiliICsgdXNhX29mcy9zaXplb2YobGUxNik7CisKKwkvKiBQb3NpdGlvbiBpbiBwcm90ZWN0ZWQgZGF0YSBvZiBmaXJzdCB1MTYgdGhhdCBuZWVkcyBmaXhpbmcgdXAuICovCisJZGF0YV9wb3MgPSAobGUxNiopYiArIE5URlNfQkxPQ0tfU0laRS9zaXplb2YobGUxNikgLSAxOworCisJLyogRml4dXAgYWxsIHNlY3RvcnMuICovCisJd2hpbGUgKHVzYV9jb3VudC0tKSB7CisJCS8qCisJCSAqIEluY3JlbWVudCBwb3NpdGlvbiBpbiB1c2EgYW5kIHJlc3RvcmUgb3JpZ2luYWwgZGF0YSBmcm9tCisJCSAqIHRoZSB1c2EgaW50byB0aGUgZGF0YSBidWZmZXIuCisJCSAqLworCQkqZGF0YV9wb3MgPSAqKCsrdXNhX3Bvcyk7CisKKwkJLyogSW5jcmVtZW50IHBvc2l0aW9uIGluIGRhdGEgYXMgd2VsbC4gKi8KKwkJZGF0YV9wb3MgKz0gTlRGU19CTE9DS19TSVpFL3NpemVvZihsZTE2KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9mcy9udGZzL25hbWVpLmMgYi9mcy9udGZzL25hbWVpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M3ZTEzYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvbmFtZWkuYwpAQCAtMCwwICsxLDQ5OCBAQAorLyoKKyAqIG5hbWVpLmMgLSBOVEZTIGtlcm5lbCBkaXJlY3RvcnkgaW5vZGUgb3BlcmF0aW9ucy4gUGFydCBvZiB0aGUgTGludXgtTlRGUworICoJICAgICBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9kY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorCisjaW5jbHVkZSAiYXR0cmliLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJkaXIuaCIKKyNpbmNsdWRlICJtZnQuaCIKKyNpbmNsdWRlICJudGZzLmgiCisKKy8qKgorICogbnRmc19sb29rdXAgLSBmaW5kIHRoZSBpbm9kZSByZXByZXNlbnRlZCBieSBhIGRlbnRyeSBpbiBhIGRpcmVjdG9yeSBpbm9kZQorICogQGRpcl9pbm86CWRpcmVjdG9yeSBpbm9kZSBpbiB3aGljaCB0byBsb29rIGZvciB0aGUgaW5vZGUKKyAqIEBkZW50OglkZW50cnkgcmVwcmVzZW50aW5nIHRoZSBpbm9kZSB0byBsb29rIGZvcgorICogQG5kOgkJbG9va3VwIG5hbWVpZGF0YQorICoKKyAqIEluIHNob3J0LCBudGZzX2xvb2t1cCgpIGxvb2tzIGZvciB0aGUgaW5vZGUgcmVwcmVzZW50ZWQgYnkgdGhlIGRlbnRyeSBAZGVudAorICogaW4gdGhlIGRpcmVjdG9yeSBpbm9kZSBAZGlyX2lubyBhbmQgaWYgZm91bmQgYXR0YWNoZXMgdGhlIGlub2RlIHRvIHRoZQorICogZGVudHJ5IEBkZW50LgorICoKKyAqIEluIG1vcmUgZGV0YWlsLCB0aGUgZGVudHJ5IEBkZW50IHNwZWNpZmllcyB3aGljaCBpbm9kZSB0byBsb29rIGZvciBieQorICogc3VwcGx5aW5nIHRoZSBuYW1lIG9mIHRoZSBpbm9kZSBpbiBAZGVudC0+ZF9uYW1lLm5hbWUuIG50ZnNfbG9va3VwKCkKKyAqIGNvbnZlcnRzIHRoZSBuYW1lIHRvIFVuaWNvZGUgYW5kIHdhbGtzIHRoZSBjb250ZW50cyBvZiB0aGUgZGlyZWN0b3J5IGlub2RlCisgKiBAZGlyX2lubyBsb29raW5nIGZvciB0aGUgY29udmVydGVkIFVuaWNvZGUgbmFtZS4gSWYgdGhlIG5hbWUgaXMgZm91bmQgaW4gdGhlCisgKiBkaXJlY3RvcnksIHRoZSBjb3JyZXNwb25kaW5nIGlub2RlIGlzIGxvYWRlZCBieSBjYWxsaW5nIG50ZnNfaWdldCgpIG9uIGl0cworICogaW5vZGUgbnVtYmVyIGFuZCB0aGUgaW5vZGUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBkZW50cnkgQGRlbnQgdmlhIGEgY2FsbCB0bworICogZF9zcGxpY2VfYWxpYXMoKS4KKyAqCisgKiBJZiB0aGUgbmFtZSBpcyBub3QgZm91bmQgaW4gdGhlIGRpcmVjdG9yeSwgYSBOVUxMIGlub2RlIGlzIGluc2VydGVkIGludG8gdGhlCisgKiBkZW50cnkgQGRlbnQgdmlhIGEgY2FsbCB0byBkX2FkZCgpLiBUaGUgZGVudHJ5IGlzIHRoZW4gdGVybWVkIGEgbmVnYXRpdmUKKyAqIGRlbnRyeS4KKyAqCisgKiBPbmx5IGlmIGFuIGFjdHVhbCBlcnJvciBvY2N1cnMsIGRvIHdlIHJldHVybiBhbiBlcnJvciB2aWEgRVJSX1BUUigpLgorICoKKyAqIEluIG9yZGVyIHRvIGhhbmRsZSB0aGUgY2FzZSBpbnNlbnNpdGl2aXR5IGlzc3VlcyBvZiBOVEZTIHdpdGggcmVnYXJkcyB0byB0aGUKKyAqIGRjYWNoZSBhbmQgdGhlIGRjYWNoZSByZXF1aXJpbmcgb25seSBvbmUgZGVudHJ5IHBlciBkaXJlY3RvcnksIHdlIGRlYWwgd2l0aAorICogZGVudHJ5IGFsaWFzZXMgdGhhdCBvbmx5IGRpZmZlciBpbiBjYXNlIGluIC0+bnRmc19sb29rdXAoKSB3aGlsZSBtYWludGFpbmluZworICogYSBjYXNlIHNlbnNpdGl2ZSBkY2FjaGUuIFRoaXMgbWVhbnMgdGhhdCB3ZSBnZXQgdGhlIGZ1bGwgYmVuZWZpdCBvZiBkY2FjaGUKKyAqIHNwZWVkIHdoZW4gdGhlIGZpbGUvZGlyZWN0b3J5IGlzIGxvb2tlZCB1cCB3aXRoIHRoZSBzYW1lIGNhc2UgYXMgcmV0dXJuZWQgYnkKKyAqIC0+bnRmc19yZWFkZGlyKCkgYnV0IHRoYXQgYSBsb29rdXAgZm9yIGFueSBvdGhlciBjYXNlIChvciBmb3IgdGhlIHNob3J0IGZpbGUKKyAqIG5hbWUpIHdpbGwgbm90IGZpbmQgYW55dGhpbmcgaW4gZGNhY2hlIGFuZCB3aWxsIGVudGVyIC0+bnRmc19sb29rdXAoKQorICogaW5zdGVhZCwgd2hlcmUgd2Ugc2VhcmNoIHRoZSBkaXJlY3RvcnkgZm9yIGEgZnVsbHkgbWF0Y2hpbmcgZmlsZSBuYW1lCisgKiAoaW5jbHVkaW5nIGNhc2UpIGFuZCBpZiB0aGF0IGlzIG5vdCBmb3VuZCwgd2Ugc2VhcmNoIGZvciBhIGZpbGUgbmFtZSB0aGF0CisgKiBtYXRjaGVzIHdpdGggZGlmZmVyZW50IGNhc2UgYW5kIGlmIHRoYXQgaGFzIG5vbi1QT1NJWCBzZW1hbnRpY3Mgd2UgcmV0dXJuCisgKiB0aGF0LiBXZSBhY3R1YWxseSBkbyBvbmx5IG9uZSBzZWFyY2ggKGNhc2Ugc2Vuc2l0aXZlKSBhbmQga2VlcCB0YWJzIG9uCisgKiB3aGV0aGVyIHdlIGhhdmUgZm91bmQgYSBjYXNlIGluc2Vuc2l0aXZlIG1hdGNoIGluIHRoZSBwcm9jZXNzLgorICoKKyAqIFRvIHNpbXBsaWZ5IG1hdHRlcnMgZm9yIHVzLCB3ZSBkbyBub3QgdHJlYXQgdGhlIHNob3J0IHZzIGxvbmcgZmlsZW5hbWVzIGFzCisgKiB0d28gaGFyZCBsaW5rcyBidXQgaW5zdGVhZCBpZiB0aGUgbG9va3VwIG1hdGNoZXMgYSBzaG9ydCBmaWxlbmFtZSwgd2UKKyAqIHJldHVybiB0aGUgZGVudHJ5IGZvciB0aGUgY29ycmVzcG9uZGluZyBsb25nIGZpbGVuYW1lIGluc3RlYWQuCisgKgorICogVGhlcmUgYXJlIHRocmVlIGNhc2VzIHdlIG5lZWQgdG8gZGlzdGluZ3Vpc2ggaGVyZToKKyAqCisgKiAxKSBAZGVudCBwZXJmZWN0bHkgbWF0Y2hlcyAoaS5lLiBpbmNsdWRpbmcgY2FzZSkgYSBkaXJlY3RvcnkgZW50cnkgd2l0aCBhCisgKiAgICBmaWxlIG5hbWUgaW4gdGhlIFdJTjMyIG9yIFBPU0lYIG5hbWVzcGFjZXMuIEluIHRoaXMgY2FzZQorICogICAgbnRmc19sb29rdXBfaW5vZGVfYnlfbmFtZSgpIHdpbGwgcmV0dXJuIHdpdGggbmFtZSBzZXQgdG8gTlVMTCBhbmQgd2UKKyAqICAgIGp1c3QgZF9zcGxpY2VfYWxpYXMoKSBAZGVudC4KKyAqIDIpIEBkZW50IG1hdGNoZXMgKG5vdCBpbmNsdWRpbmcgY2FzZSkgYSBkaXJlY3RvcnkgZW50cnkgd2l0aCBhIGZpbGUgbmFtZSBpbgorICogICAgdGhlIFdJTjMyIG5hbWVzcGFjZS4gSW4gdGhpcyBjYXNlIG50ZnNfbG9va3VwX2lub2RlX2J5X25hbWUoKSB3aWxsIHJldHVybgorICogICAgd2l0aCBuYW1lIHNldCB0byBwb2ludCB0byBhIGttYWxsb2MoKWVkIG50ZnNfbmFtZSBzdHJ1Y3R1cmUgY29udGFpbmluZworICogICAgdGhlIHByb3Blcmx5IGNhc2VkIGxpdHRsZSBlbmRpYW4gVW5pY29kZSBuYW1lLiBXZSBjb252ZXJ0IHRoZSBuYW1lIHRvIHRoZQorICogICAgY3VycmVudCBOTFMgY29kZSBwYWdlLCBzZWFyY2ggaWYgYSBkZW50cnkgd2l0aCB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdHMKKyAqICAgIGFuZCBpZiBzbyByZXR1cm4gdGhhdCBpbnN0ZWFkIG9mIEBkZW50LiAgQXQgdGhpcyBwb2ludCB0aGluZ3MgYXJlCisgKiAgICBjb21wbGljYXRlZCBieSB0aGUgcG9zc2liaWxpdHkgb2YgJ2Rpc2Nvbm5lY3RlZCcgZGVudHJpZXMgZHVlIHRvIE5GUworICogICAgd2hpY2ggd2UgZGVhbCB3aXRoIGFwcHJvcHJpYXRlbHkgKHNlZSB0aGUgY29kZSBjb21tZW50cykuICBUaGUgVkZTIHdpbGwKKyAqICAgIHRoZW4gZGVzdHJveSB0aGUgb2xkIEBkZW50IGFuZCB1c2UgdGhlIG9uZSB3ZSByZXR1cm5lZC4gIElmIGEgZGVudHJ5IGlzCisgKiAgICBub3QgZm91bmQsIHdlIGFsbG9jYXRlIGEgbmV3IG9uZSwgZF9zcGxpY2VfYWxpYXMoKSBpdCwgYW5kIHJldHVybiBpdCBhcworICogICAgYWJvdmUuCisgKiAzKSBAZGVudCBtYXRjaGVzIGVpdGhlciBwZXJmZWN0bHkgb3Igbm90IChpLmUuIHdlIGRvbid0IGNhcmUgYWJvdXQgY2FzZSkgYQorICogICAgZGlyZWN0b3J5IGVudHJ5IHdpdGggYSBmaWxlIG5hbWUgaW4gdGhlIERPUyBuYW1lc3BhY2UuIEluIHRoaXMgY2FzZQorICogICAgbnRmc19sb29rdXBfaW5vZGVfYnlfbmFtZSgpIHdpbGwgcmV0dXJuIHdpdGggbmFtZSBzZXQgdG8gcG9pbnQgdG8gYQorICogICAga21hbGxvYygpZWQgbnRmc19uYW1lIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBtZnQgcmVmZXJlbmNlIChjcHUgZW5kaWFuKQorICogICAgb2YgdGhlIGlub2RlLiBXZSB1c2UgdGhlIG1mdCByZWZlcmVuY2UgdG8gcmVhZCB0aGUgaW5vZGUgYW5kIHRvIGZpbmQgdGhlCisgKiAgICBmaWxlIG5hbWUgaW4gdGhlIFdJTjMyIG5hbWVzcGFjZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBtYXRjaGVkIHNob3J0IGZpbGUKKyAqICAgIG5hbWUuIFdlIHRoZW4gY29udmVydCB0aGUgbmFtZSB0byB0aGUgY3VycmVudCBOTFMgY29kZSBwYWdlLCBhbmQgcHJvY2VlZAorICogICAgc2VhcmNoaW5nIGZvciBhIGRlbnRyeSB3aXRoIHRoaXMgbmFtZSwgZXRjLCBhcyBpbiBjYXNlIDIpLCBhYm92ZS4KKyAqCisgKiBMb2NraW5nOiBDYWxsZXIgbXVzdCBob2xkIGlfc2VtIG9uIHRoZSBkaXJlY3RvcnkuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpudGZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpcl9pbm8sIHN0cnVjdCBkZW50cnkgKmRlbnQsCisJCXN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCW50ZnNfdm9sdW1lICp2b2wgPSBOVEZTX1NCKGRpcl9pbm8tPmlfc2IpOworCXN0cnVjdCBpbm9kZSAqZGVudF9pbm9kZTsKKwludGZzY2hhciAqdW5hbWU7CisJbnRmc19uYW1lICpuYW1lID0gTlVMTDsKKwlNRlRfUkVGIG1yZWY7CisJdW5zaWduZWQgbG9uZyBkZW50X2lubzsKKwlpbnQgdW5hbWVfbGVuOworCisJbnRmc19kZWJ1ZygiTG9va2luZyB1cCAlcyBpbiBkaXJlY3RvcnkgaW5vZGUgMHglbHguIiwKKwkJCWRlbnQtPmRfbmFtZS5uYW1lLCBkaXJfaW5vLT5pX2lubyk7CisJLyogQ29udmVydCB0aGUgbmFtZSBvZiB0aGUgZGVudHJ5IHRvIFVuaWNvZGUuICovCisJdW5hbWVfbGVuID0gbnRmc19ubHN0b3Vjcyh2b2wsIGRlbnQtPmRfbmFtZS5uYW1lLCBkZW50LT5kX25hbWUubGVuLAorCQkJJnVuYW1lKTsKKwlpZiAodW5hbWVfbGVuIDwgMCkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gY29udmVydCBuYW1lIHRvIFVuaWNvZGUuIik7CisJCXJldHVybiBFUlJfUFRSKHVuYW1lX2xlbik7CisJfQorCW1yZWYgPSBudGZzX2xvb2t1cF9pbm9kZV9ieV9uYW1lKE5URlNfSShkaXJfaW5vKSwgdW5hbWUsIHVuYW1lX2xlbiwKKwkJCSZuYW1lKTsKKwlrbWVtX2NhY2hlX2ZyZWUobnRmc19uYW1lX2NhY2hlLCB1bmFtZSk7CisJaWYgKCFJU19FUlJfTVJFRihtcmVmKSkgeworCQlkZW50X2lubyA9IE1SRUYobXJlZik7CisJCW50ZnNfZGVidWcoIkZvdW5kIGlub2RlIDB4JWx4LiBDYWxsaW5nIG50ZnNfaWdldC4iLCBkZW50X2lubyk7CisJCWRlbnRfaW5vZGUgPSBudGZzX2lnZXQodm9sLT5zYiwgZGVudF9pbm8pOworCQlpZiAobGlrZWx5KCFJU19FUlIoZGVudF9pbm9kZSkpKSB7CisJCQkvKiBDb25zaXN0ZW5jeSBjaGVjay4gKi8KKwkJCWlmIChpc19iYWRfaW5vZGUoZGVudF9pbm9kZSkgfHwgTVNFUU5PKG1yZWYpID09CisJCQkJCU5URlNfSShkZW50X2lub2RlKS0+c2VxX25vIHx8CisJCQkJCWRlbnRfaW5vID09IEZJTEVfTUZUKSB7CisJCQkJLyogUGVyZmVjdCBXSU4zMi9QT1NJWCBtYXRjaC4gLS0gQ2FzZSAxLiAqLworCQkJCWlmICghbmFtZSkgeworCQkJCQludGZzX2RlYnVnKCJEb25lLiAgKENhc2UgMS4pIik7CisJCQkJCXJldHVybiBkX3NwbGljZV9hbGlhcyhkZW50X2lub2RlLCBkZW50KTsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBXZSBhcmUgdG9vIGluZGVudGVkLiAgSGFuZGxlIGltcGVyZmVjdAorCQkJCSAqIG1hdGNoZXMgYW5kIHNob3J0IGZpbGUgbmFtZXMgZnVydGhlciBiZWxvdy4KKwkJCQkgKi8KKwkJCQlnb3RvIGhhbmRsZV9uYW1lOworCQkJfQorCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiRm91bmQgc3RhbGUgcmVmZXJlbmNlIHRvIGlub2RlICIKKwkJCQkJIjB4JWx4IChyZWZlcmVuY2Ugc2VxdWVuY2UgbnVtYmVyID0gIgorCQkJCQkiMHgleCwgaW5vZGUgc2VxdWVuY2UgbnVtYmVyID0gMHgleCksICIKKwkJCQkJInJldHVybmluZyAtRUlPLiBSdW4gY2hrZHNrLiIsCisJCQkJCWRlbnRfaW5vLCBNU0VRTk8obXJlZiksCisJCQkJCU5URlNfSShkZW50X2lub2RlKS0+c2VxX25vKTsKKwkJCWlwdXQoZGVudF9pbm9kZSk7CisJCQlkZW50X2lub2RlID0gRVJSX1BUUigtRUlPKTsKKwkJfSBlbHNlCisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJudGZzX2lnZXQoMHglbHgpIGZhaWxlZCB3aXRoICIKKwkJCQkJImVycm9yIGNvZGUgJWxpLiIsIGRlbnRfaW5vLAorCQkJCQlQVFJfRVJSKGRlbnRfaW5vZGUpKTsKKwkJaWYgKG5hbWUpCisJCQlrZnJlZShuYW1lKTsKKwkJLyogUmV0dXJuIHRoZSBlcnJvciBjb2RlLiAqLworCQlyZXR1cm4gKHN0cnVjdCBkZW50cnkgKilkZW50X2lub2RlOworCX0KKwkvKiBJdCBpcyBndWFyYW50ZWVkIHRoYXQgbmFtZSBpcyBubyBsb25nZXIgYWxsb2NhdGVkIGF0IHRoaXMgcG9pbnQuICovCisJaWYgKE1SRUZfRVJSKG1yZWYpID09IC1FTk9FTlQpIHsKKwkJbnRmc19kZWJ1ZygiRW50cnkgd2FzIG5vdCBmb3VuZCwgYWRkaW5nIG5lZ2F0aXZlIGRlbnRyeS4iKTsKKwkJLyogVGhlIGRjYWNoZSB3aWxsIGhhbmRsZSBuZWdhdGl2ZSBlbnRyaWVzLiAqLworCQlkX2FkZChkZW50LCBOVUxMKTsKKwkJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW50ZnNfZXJyb3Iodm9sLT5zYiwgIm50ZnNfbG9va3VwX2lub19ieV9uYW1lKCkgZmFpbGVkIHdpdGggZXJyb3IgIgorCQkJImNvZGUgJWkuIiwgLU1SRUZfRVJSKG1yZWYpKTsKKwlyZXR1cm4gRVJSX1BUUihNUkVGX0VSUihtcmVmKSk7CisKKwkvLyBUT0RPOiBDb25zaWRlciBtb3ZpbmcgdGhpcyBsb3QgdG8gYSBzZXBhcmF0ZSBmdW5jdGlvbiEgKEFJQSkKK2hhbmRsZV9uYW1lOgorICAgeworCXN0cnVjdCBkZW50cnkgKnJlYWxfZGVudCwgKm5ld19kZW50OworCU1GVF9SRUNPUkQgKm07CisJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eDsKKwludGZzX2lub2RlICpuaSA9IE5URlNfSShkZW50X2lub2RlKTsKKwlpbnQgZXJyOworCXN0cnVjdCBxc3RyIG5sc19uYW1lOworCisJbmxzX25hbWUubmFtZSA9IE5VTEw7CisJaWYgKG5hbWUtPnR5cGUgIT0gRklMRV9OQU1FX0RPUykgewkJCS8qIENhc2UgMi4gKi8KKwkJbnRmc19kZWJ1ZygiQ2FzZSAyLiIpOworCQlubHNfbmFtZS5sZW4gPSAodW5zaWduZWQpbnRmc191Y3N0b25scyh2b2wsCisJCQkJKG50ZnNjaGFyKikmbmFtZS0+bmFtZSwgbmFtZS0+bGVuLAorCQkJCSh1bnNpZ25lZCBjaGFyKiopJm5sc19uYW1lLm5hbWUsIDApOworCQlrZnJlZShuYW1lKTsKKwl9IGVsc2UgLyogaWYgKG5hbWUtPnR5cGUgPT0gRklMRV9OQU1FX0RPUykgKi8gewkJLyogQ2FzZSAzLiAqLworCQlGSUxFX05BTUVfQVRUUiAqZm47CisKKwkJbnRmc19kZWJ1ZygiQ2FzZSAzLiIpOworCQlrZnJlZShuYW1lKTsKKworCQkvKiBGaW5kIHRoZSBXSU4zMiBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1hdGNoZWQgRE9TIG5hbWUuICovCisJCW5pID0gTlRGU19JKGRlbnRfaW5vZGUpOworCQltID0gbWFwX21mdF9yZWNvcmQobmkpOworCQlpZiAoSVNfRVJSKG0pKSB7CisJCQllcnIgPSBQVFJfRVJSKG0pOworCQkJbSA9IE5VTEw7CisJCQljdHggPSBOVUxMOworCQkJZ290byBlcnJfb3V0OworCQl9CisJCWN0eCA9IG50ZnNfYXR0cl9nZXRfc2VhcmNoX2N0eChuaSwgbSk7CisJCWlmICh1bmxpa2VseSghY3R4KSkgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCQlkbyB7CisJCQlBVFRSX1JFQ09SRCAqYTsKKwkJCXUzMiB2YWxfbGVuOworCisJCQllcnIgPSBudGZzX2F0dHJfbG9va3VwKEFUX0ZJTEVfTkFNRSwgTlVMTCwgMCwgMCwgMCwKKwkJCQkJTlVMTCwgMCwgY3R4KTsKKwkJCWlmICh1bmxpa2VseShlcnIpKSB7CisJCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiSW5vZGUgY29ycnVwdDogTm8gV0lOMzIgIgorCQkJCQkJIm5hbWVzcGFjZSBjb3VudGVycGFydCB0byBET1MgIgorCQkJCQkJImZpbGUgbmFtZS4gUnVuIGNoa2Rzay4iKTsKKwkJCQlpZiAoZXJyID09IC1FTk9FTlQpCisJCQkJCWVyciA9IC1FSU87CisJCQkJZ290byBlcnJfb3V0OworCQkJfQorCQkJLyogQ29uc2lzdGVuY3kgY2hlY2tzLiAqLworCQkJYSA9IGN0eC0+YXR0cjsKKwkJCWlmIChhLT5ub25fcmVzaWRlbnQgfHwgYS0+ZmxhZ3MpCisJCQkJZ290byBlaW9fZXJyX291dDsKKwkJCXZhbF9sZW4gPSBsZTMyX3RvX2NwdShhLT5kYXRhLnJlc2lkZW50LnZhbHVlX2xlbmd0aCk7CisJCQlpZiAobGUxNl90b19jcHUoYS0+ZGF0YS5yZXNpZGVudC52YWx1ZV9vZmZzZXQpICsKKwkJCQkJdmFsX2xlbiA+IGxlMzJfdG9fY3B1KGEtPmxlbmd0aCkpCisJCQkJZ290byBlaW9fZXJyX291dDsKKwkJCWZuID0gKEZJTEVfTkFNRV9BVFRSKikoKHU4KiljdHgtPmF0dHIgKyBsZTE2X3RvX2NwdSgKKwkJCQkJY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCkpOworCQkJaWYgKCh1MzIpKGZuLT5maWxlX25hbWVfbGVuZ3RoICogc2l6ZW9mKG50ZnNjaGFyKSArCisJCQkJCXNpemVvZihGSUxFX05BTUVfQVRUUikpID4gdmFsX2xlbikKKwkJCQlnb3RvIGVpb19lcnJfb3V0OworCQl9IHdoaWxlIChmbi0+ZmlsZV9uYW1lX3R5cGUgIT0gRklMRV9OQU1FX1dJTjMyKTsKKworCQkvKiBDb252ZXJ0IHRoZSBmb3VuZCBXSU4zMiBuYW1lIHRvIGN1cnJlbnQgTkxTIGNvZGUgcGFnZS4gKi8KKwkJbmxzX25hbWUubGVuID0gKHVuc2lnbmVkKW50ZnNfdWNzdG9ubHModm9sLAorCQkJCShudGZzY2hhciopJmZuLT5maWxlX25hbWUsIGZuLT5maWxlX25hbWVfbGVuZ3RoLAorCQkJCSh1bnNpZ25lZCBjaGFyKiopJm5sc19uYW1lLm5hbWUsIDApOworCisJCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCQl1bm1hcF9tZnRfcmVjb3JkKG5pKTsKKwl9CisJbSA9IE5VTEw7CisJY3R4ID0gTlVMTDsKKworCS8qIENoZWNrIGlmIGEgY29udmVyc2lvbiBlcnJvciBvY2N1cnJlZC4gKi8KKwlpZiAoKHNpZ25lZClubHNfbmFtZS5sZW4gPCAwKSB7CisJCWVyciA9IChzaWduZWQpbmxzX25hbWUubGVuOworCQlnb3RvIGVycl9vdXQ7CisJfQorCW5sc19uYW1lLmhhc2ggPSBmdWxsX25hbWVfaGFzaChubHNfbmFtZS5uYW1lLCBubHNfbmFtZS5sZW4pOworCisJLyoKKwkgKiBOb3RlOiBObyBuZWVkIGZvciBkZW50LT5kX2xvY2sgbG9jayBhcyBpX3NlbSBpcyBoZWxkIG9uIHRoZQorCSAqIHBhcmVudCBpbm9kZS4KKwkgKi8KKworCS8qIERvZXMgYSBkZW50cnkgbWF0Y2hpbmcgdGhlIG5sc19uYW1lIGV4aXN0IGFscmVhZHk/ICovCisJcmVhbF9kZW50ID0gZF9sb29rdXAoZGVudC0+ZF9wYXJlbnQsICZubHNfbmFtZSk7CisJLyogSWYgbm90LCBjcmVhdGUgaXQgbm93LiAqLworCWlmICghcmVhbF9kZW50KSB7CisJCXJlYWxfZGVudCA9IGRfYWxsb2MoZGVudC0+ZF9wYXJlbnQsICZubHNfbmFtZSk7CisJCWtmcmVlKG5sc19uYW1lLm5hbWUpOworCQlpZiAoIXJlYWxfZGVudCkgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCQluZXdfZGVudCA9IGRfc3BsaWNlX2FsaWFzKGRlbnRfaW5vZGUsIHJlYWxfZGVudCk7CisJCWlmIChuZXdfZGVudCkKKwkJCWRwdXQocmVhbF9kZW50KTsKKwkJZWxzZQorCQkJbmV3X2RlbnQgPSByZWFsX2RlbnQ7CisJCW50ZnNfZGVidWcoIkRvbmUuICAoQ3JlYXRlZCBuZXcgZGVudHJ5LikiKTsKKwkJcmV0dXJuIG5ld19kZW50OworCX0KKwlrZnJlZShubHNfbmFtZS5uYW1lKTsKKwkvKiBNYXRjaGluZyBkZW50cnkgZXhpc3RzLCBjaGVjayBpZiBpdCBpcyBuZWdhdGl2ZS4gKi8KKwlpZiAocmVhbF9kZW50LT5kX2lub2RlKSB7CisJCWlmICh1bmxpa2VseShyZWFsX2RlbnQtPmRfaW5vZGUgIT0gZGVudF9pbm9kZSkpIHsKKwkJCS8qIFRoaXMgY2FuIGhhcHBlbiBiZWNhdXNlIGJhZCBpbm9kZXMgYXJlIHVuaGFzaGVkLiAqLworCQkJQlVHX09OKCFpc19iYWRfaW5vZGUoZGVudF9pbm9kZSkpOworCQkJQlVHX09OKCFpc19iYWRfaW5vZGUocmVhbF9kZW50LT5kX2lub2RlKSk7CisJCX0KKwkJLyoKKwkJICogQWxyZWFkeSBoYXZlIHRoZSBpbm9kZSBhbmQgdGhlIGRlbnRyeSBhdHRhY2hlZCwgZGVjcmVtZW50CisJCSAqIHRoZSByZWZlcmVuY2UgY291bnQgdG8gYmFsYW5jZSB0aGUgbnRmc19pZ2V0KCkgd2UgZGlkCisJCSAqIGVhcmxpZXIgb24uICBXZSBmb3VuZCB0aGUgZGVudHJ5IHVzaW5nIGRfbG9va3VwKCkgc28gaXQKKwkJICogY2Fubm90IGJlIGRpc2Nvbm5lY3RlZCBhbmQgdGh1cyB3ZSBkbyBub3QgbmVlZCB0byB3b3JyeQorCQkgKiBhYm91dCBhbnkgTkZTL2Rpc2Nvbm5lY3RlZG5lc3MgaXNzdWVzIGhlcmUuCisJCSAqLworCQlpcHV0KGRlbnRfaW5vZGUpOworCQludGZzX2RlYnVnKCJEb25lLiAgKEFscmVhZHkgaGFkIGlub2RlIGFuZCBkZW50cnkuKSIpOworCQlyZXR1cm4gcmVhbF9kZW50OworCX0KKwkvKgorCSAqIE5lZ2F0aXZlIGRlbnRyeTogaW5zdGFudGlhdGUgaXQgdW5sZXNzIHRoZSBpbm9kZSBpcyBhIGRpcmVjdG9yeSBhbmQKKwkgKiBoYXMgYSAnZGlzY29ubmVjdGVkJyBkZW50cnkgKGkuZS4gSVNfUk9PVCBhbmQgRENBQ0hFX0RJU0NPTk5FQ1RFRCksCisJICogaW4gd2hpY2ggY2FzZSBkX21vdmUoKSB0aGF0IGluIHBsYWNlIG9mIHRoZSBmb3VuZCBkZW50cnkuCisJICovCisJaWYgKCFTX0lTRElSKGRlbnRfaW5vZGUtPmlfbW9kZSkpIHsKKwkJLyogTm90IGEgZGlyZWN0b3J5OyBldmVyeXRoaW5nIGlzIGVhc3kuICovCisJCWRfaW5zdGFudGlhdGUocmVhbF9kZW50LCBkZW50X2lub2RlKTsKKwkJbnRmc19kZWJ1ZygiRG9uZS4gIChBbHJlYWR5IGhhZCBuZWdhdGl2ZSBmaWxlIGRlbnRyeS4pIik7CisJCXJldHVybiByZWFsX2RlbnQ7CisJfQorCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCWlmIChsaXN0X2VtcHR5KCZkZW50X2lub2RlLT5pX2RlbnRyeSkpIHsKKwkJLyoKKwkJICogRGlyZWN0b3J5IHdpdGhvdXQgYSAnZGlzY29ubmVjdGVkJyBkZW50cnk7IHdlIG5lZWQgdG8gZG8KKwkJICogZF9pbnN0YW50aWF0ZSgpIGJ5IGhhbmQgYmVjYXVzZSBpdCB0YWtlcyBkY2FjaGVfbG9jayB3aGljaAorCQkgKiB3ZSBhbHJlYWR5IGhvbGQuCisJCSAqLworCQlsaXN0X2FkZCgmcmVhbF9kZW50LT5kX2FsaWFzLCAmZGVudF9pbm9kZS0+aV9kZW50cnkpOworCQlyZWFsX2RlbnQtPmRfaW5vZGUgPSBkZW50X2lub2RlOworCQlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCQlzZWN1cml0eV9kX2luc3RhbnRpYXRlKHJlYWxfZGVudCwgZGVudF9pbm9kZSk7CisJCW50ZnNfZGVidWcoIkRvbmUuICAoQWxyZWFkeSBoYWQgbmVnYXRpdmUgZGlyZWN0b3J5IGRlbnRyeS4pIik7CisJCXJldHVybiByZWFsX2RlbnQ7CisJfQorCS8qCisJICogRGlyZWN0b3J5IHdpdGggYSAnZGlzY29ubmVjdGVkJyBkZW50cnk7IGdldCBhIHJlZmVyZW5jZSB0byB0aGUKKwkgKiAnZGlzY29ubmVjdGVkJyBkZW50cnkuCisJICovCisJbmV3X2RlbnQgPSBsaXN0X2VudHJ5KGRlbnRfaW5vZGUtPmlfZGVudHJ5Lm5leHQsIHN0cnVjdCBkZW50cnksCisJCQlkX2FsaWFzKTsKKwlkZ2V0X2xvY2tlZChuZXdfZGVudCk7CisJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwkvKiBEbyBzZWN1cml0eSB2b2Rvby4gKi8KKwlzZWN1cml0eV9kX2luc3RhbnRpYXRlKHJlYWxfZGVudCwgZGVudF9pbm9kZSk7CisJLyogTW92ZSBuZXdfZGVudCBpbiBwbGFjZSBvZiByZWFsX2RlbnQuICovCisJZF9tb3ZlKG5ld19kZW50LCByZWFsX2RlbnQpOworCS8qIEJhbGFuY2UgdGhlIG50ZnNfaWdldCgpIHdlIGRpZCBhYm92ZS4gKi8KKwlpcHV0KGRlbnRfaW5vZGUpOworCS8qIFRocm93IGF3YXkgcmVhbF9kZW50LiAqLworCWRwdXQocmVhbF9kZW50KTsKKwkvKiBVc2UgbmV3X2RlbnQgYXMgdGhlIGFjdHVhbCBkZW50cnkuICovCisJbnRmc19kZWJ1ZygiRG9uZS4gIChBbHJlYWR5IGhhZCBuZWdhdGl2ZSwgZGlzY29ubmVjdGVkIGRpcmVjdG9yeSAiCisJCQkiZGVudHJ5LikiKTsKKwlyZXR1cm4gbmV3X2RlbnQ7CisKK2Vpb19lcnJfb3V0OgorCW50ZnNfZXJyb3Iodm9sLT5zYiwgIklsbGVnYWwgZmlsZSBuYW1lIGF0dHJpYnV0ZS4gUnVuIGNoa2Rzay4iKTsKKwllcnIgPSAtRUlPOworZXJyX291dDoKKwlpZiAoY3R4KQorCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwlpZiAobSkKKwkJdW5tYXBfbWZ0X3JlY29yZChuaSk7CisJaXB1dChkZW50X2lub2RlKTsKKwludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQsIHJldHVybmluZyBlcnJvciBjb2RlICVpLiIsIGVycik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKyAgIH0KK30KKworLyoqCisgKiBJbm9kZSBvcGVyYXRpb25zIGZvciBkaXJlY3Rvcmllcy4KKyAqLworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgbnRmc19kaXJfaW5vZGVfb3BzID0geworCS5sb29rdXAJPSBudGZzX2xvb2t1cCwJLyogVkZTOiBMb29rdXAgZGlyZWN0b3J5LiAqLworfTsKKworLyoqCisgKiBudGZzX2dldF9wYXJlbnQgLSBmaW5kIHRoZSBkZW50cnkgb2YgdGhlIHBhcmVudCBvZiBhIGdpdmVuIGRpcmVjdG9yeSBkZW50cnkKKyAqIEBjaGlsZF9kZW50OgkJZGVudHJ5IG9mIHRoZSBkaXJlY3Rvcnkgd2hvc2UgcGFyZW50IGRpcmVjdG9yeSB0byBmaW5kCisgKgorICogRmluZCB0aGUgZGVudHJ5IGZvciB0aGUgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgZGlyZWN0b3J5IHNwZWNpZmllZCBieSB0aGUKKyAqIGRlbnRyeSBAY2hpbGRfZGVudC4gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20KKyAqIGZzL2V4cG9ydGZzL2V4cGZzLmM6OmZpbmRfZXhwb3J0ZWRfZGVudHJ5KCkgd2hpY2ggaW4gdHVybiBpcyBjYWxsZWQgZnJvbSB0aGUKKyAqIGRlZmF1bHQgLT5kZWNvZGVfZmgoKSB3aGljaCBpcyBleHBvcnRfZGVjb2RlX2ZoKCkgaW4gdGhlIHNhbWUgZmlsZS4KKyAqCisgKiBUaGUgY29kZSBpcyBiYXNlZCBvbiB0aGUgZXh0MyAtPmdldF9wYXJlbnQoKSBpbXBsZW1lbnRhdGlvbiBmb3VuZCBpbgorICogZnMvZXh0My9uYW1laS5jOjpleHQzX2dldF9wYXJlbnQoKS4KKyAqCisgKiBOb3RlOiBudGZzX2dldF9wYXJlbnQoKSBpcyBjYWxsZWQgd2l0aCBAY2hpbGRfZGVudC0+ZF9pbm9kZS0+aV9zZW0gZG93bi4KKyAqCisgKiBSZXR1cm4gdGhlIGRlbnRyeSBvZiB0aGUgcGFyZW50IGRpcmVjdG9yeSBvbiBzdWNjZXNzIG9yIHRoZSBlcnJvciBjb2RlIG9uCisgKiBlcnJvciAoSVNfRVJSKCkgaXMgdHJ1ZSkuCisgKi8KK3N0cnVjdCBkZW50cnkgKm50ZnNfZ2V0X3BhcmVudChzdHJ1Y3QgZGVudHJ5ICpjaGlsZF9kZW50KQoreworCXN0cnVjdCBpbm9kZSAqdmkgPSBjaGlsZF9kZW50LT5kX2lub2RlOworCW50ZnNfaW5vZGUgKm5pID0gTlRGU19JKHZpKTsKKwlNRlRfUkVDT1JEICptcmVjOworCW50ZnNfYXR0cl9zZWFyY2hfY3R4ICpjdHg7CisJQVRUUl9SRUNPUkQgKmF0dHI7CisJRklMRV9OQU1FX0FUVFIgKmZuOworCXN0cnVjdCBpbm9kZSAqcGFyZW50X3ZpOworCXN0cnVjdCBkZW50cnkgKnBhcmVudF9kZW50OworCXVuc2lnbmVkIGxvbmcgcGFyZW50X2lubzsKKwlpbnQgZXJyOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIGlub2RlIDB4JWx4LiIsIHZpLT5pX2lubyk7CisJLyogR2V0IHRoZSBtZnQgcmVjb3JkIG9mIHRoZSBpbm9kZSBiZWxvbmdpbmcgdG8gdGhlIGNoaWxkIGRlbnRyeS4gKi8KKwltcmVjID0gbWFwX21mdF9yZWNvcmQobmkpOworCWlmIChJU19FUlIobXJlYykpCisJCXJldHVybiAoc3RydWN0IGRlbnRyeSAqKW1yZWM7CisJLyogRmluZCB0aGUgZmlyc3QgZmlsZSBuYW1lIGF0dHJpYnV0ZSBpbiB0aGUgbWZ0IHJlY29yZC4gKi8KKwljdHggPSBudGZzX2F0dHJfZ2V0X3NlYXJjaF9jdHgobmksIG1yZWMpOworCWlmICh1bmxpa2VseSghY3R4KSkgeworCQl1bm1hcF9tZnRfcmVjb3JkKG5pKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQordHJ5X25leHQ6CisJZXJyID0gbnRmc19hdHRyX2xvb2t1cChBVF9GSUxFX05BTUUsIE5VTEwsIDAsIENBU0VfU0VOU0lUSVZFLCAwLCBOVUxMLAorCQkJMCwgY3R4KTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQludGZzX2F0dHJfcHV0X3NlYXJjaF9jdHgoY3R4KTsKKwkJdW5tYXBfbWZ0X3JlY29yZChuaSk7CisJCWlmIChlcnIgPT0gLUVOT0VOVCkKKwkJCW50ZnNfZXJyb3IodmktPmlfc2IsICJJbm9kZSAweCVseCBkb2VzIG5vdCBoYXZlIGEgIgorCQkJCQkiZmlsZSBuYW1lIGF0dHJpYnV0ZS4gIFJ1biBjaGtkc2suIiwKKwkJCQkJdmktPmlfaW5vKTsKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwl9CisJYXR0ciA9IGN0eC0+YXR0cjsKKwlpZiAodW5saWtlbHkoYXR0ci0+bm9uX3Jlc2lkZW50KSkKKwkJZ290byB0cnlfbmV4dDsKKwlmbiA9IChGSUxFX05BTUVfQVRUUiAqKSgodTggKilhdHRyICsKKwkJCWxlMTZfdG9fY3B1KGF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSk7CisJaWYgKHVubGlrZWx5KCh1OCAqKWZuICsgbGUzMl90b19jcHUoYXR0ci0+ZGF0YS5yZXNpZGVudC52YWx1ZV9sZW5ndGgpID4KKwkJCSh1OCopYXR0ciArIGxlMzJfdG9fY3B1KGF0dHItPmxlbmd0aCkpKQorCQlnb3RvIHRyeV9uZXh0OworCS8qIEdldCB0aGUgaW5vZGUgbnVtYmVyIG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5LiAqLworCXBhcmVudF9pbm8gPSBNUkVGX0xFKGZuLT5wYXJlbnRfZGlyZWN0b3J5KTsKKwkvKiBSZWxlYXNlIHRoZSBzZWFyY2ggY29udGV4dCBhbmQgdGhlIG1mdCByZWNvcmQgb2YgdGhlIGNoaWxkLiAqLworCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCXVubWFwX21mdF9yZWNvcmQobmkpOworCS8qIEdldCB0aGUgaW5vZGUgb2YgdGhlIHBhcmVudCBkaXJlY3RvcnkuICovCisJcGFyZW50X3ZpID0gbnRmc19pZ2V0KHZpLT5pX3NiLCBwYXJlbnRfaW5vKTsKKwlpZiAoSVNfRVJSKHBhcmVudF92aSkgfHwgdW5saWtlbHkoaXNfYmFkX2lub2RlKHBhcmVudF92aSkpKSB7CisJCWlmICghSVNfRVJSKHBhcmVudF92aSkpCisJCQlpcHV0KHBhcmVudF92aSk7CisJCW50ZnNfZXJyb3IodmktPmlfc2IsICJGYWlsZWQgdG8gZ2V0IHBhcmVudCBkaXJlY3RvcnkgaW5vZGUgIgorCQkJCSIweCVseCBvZiBjaGlsZCBpbm9kZSAweCVseC4iLCBwYXJlbnRfaW5vLAorCQkJCXZpLT5pX2lubyk7CisJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworCX0KKwkvKiBGaW5hbGx5IGdldCBhIGRlbnRyeSBmb3IgdGhlIHBhcmVudCBkaXJlY3RvcnkgYW5kIHJldHVybiBpdC4gKi8KKwlwYXJlbnRfZGVudCA9IGRfYWxsb2NfYW5vbihwYXJlbnRfdmkpOworCWlmICh1bmxpa2VseSghcGFyZW50X2RlbnQpKSB7CisJCWlwdXQocGFyZW50X3ZpKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCW50ZnNfZGVidWcoIkRvbmUgZm9yIGlub2RlIDB4JWx4LiIsIHZpLT5pX2lubyk7CisJcmV0dXJuIHBhcmVudF9kZW50OworfQorCisvKioKKyAqIG50ZnNfZ2V0X2RlbnRyeSAtIGZpbmQgYSBkZW50cnkgZm9yIHRoZSBpbm9kZSBmcm9tIGEgZmlsZSBoYW5kbGUgc3ViLWZyYWdtZW50CisgKiBAc2I6CQlzdXBlciBibG9jayBpZGVudGlmeWluZyB0aGUgbW91bnRlZCBudGZzIHZvbHVtZQorICogQGZoOgkJdGhlIGZpbGUgaGFuZGxlIHN1Yi1mcmFnbWVudAorICoKKyAqIEZpbmQgYSBkZW50cnkgZm9yIHRoZSBpbm9kZSBnaXZlbiBhIGZpbGUgaGFuZGxlIHN1Yi1mcmFnbWVudC4gIFRoaXMgZnVuY3Rpb24KKyAqIGlzIGNhbGxlZCBmcm9tIGZzL2V4cG9ydGZzL2V4cGZzLmM6OmZpbmRfZXhwb3J0ZWRfZGVudHJ5KCkgd2hpY2ggaW4gdHVybiBpcworICogY2FsbGVkIGZyb20gdGhlIGRlZmF1bHQgLT5kZWNvZGVfZmgoKSB3aGljaCBpcyBleHBvcnRfZGVjb2RlX2ZoKCkgaW4gdGhlCisgKiBzYW1lIGZpbGUuICBUaGUgY29kZSBpcyBjbG9zZWx5IGJhc2VkIG9uIHRoZSBkZWZhdWx0IC0+Z2V0X2RlbnRyeSgpIGhlbHBlcgorICogZnMvZXhwb3J0ZnMvZXhwZnMuYzo6Z2V0X29iamVjdCgpLgorICoKKyAqIFRoZSBAZmggY29udGFpbnMgdHdvIDMyLWJpdCB1bnNpZ25lZCB2YWx1ZXMsIHRoZSBmaXJzdCBvbmUgaXMgdGhlIGlub2RlCisgKiBudW1iZXIgYW5kIHRoZSBzZWNvbmQgb25lIGlzIHRoZSBpbm9kZSBnZW5lcmF0aW9uLgorICoKKyAqIFJldHVybiB0aGUgZGVudHJ5IG9uIHN1Y2Nlc3Mgb3IgdGhlIGVycm9yIGNvZGUgb24gZXJyb3IgKElTX0VSUigpIGlzIHRydWUpLgorICovCitzdHJ1Y3QgZGVudHJ5ICpudGZzX2dldF9kZW50cnkoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZmgpCit7CisJc3RydWN0IGlub2RlICp2aTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50OworCXVuc2lnbmVkIGxvbmcgaW5vID0gKCh1MzIgKilmaClbMF07CisJdTMyIGdlbiA9ICgodTMyICopZmgpWzFdOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIGlub2RlIDB4JWx4LCBnZW5lcmF0aW9uIDB4JXguIiwgaW5vLCBnZW4pOworCXZpID0gbnRmc19pZ2V0KHNiLCBpbm8pOworCWlmIChJU19FUlIodmkpKSB7CisJCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gZ2V0IGlub2RlIDB4JWx4LiIsIGlubyk7CisJCXJldHVybiAoc3RydWN0IGRlbnRyeSAqKXZpOworCX0KKwlpZiAodW5saWtlbHkoaXNfYmFkX2lub2RlKHZpKSB8fCB2aS0+aV9nZW5lcmF0aW9uICE9IGdlbikpIHsKKwkJLyogV2UgZGlkbid0IGZpbmQgdGhlIHJpZ2h0IGlub2RlLiAqLworCQludGZzX2Vycm9yKHNiLCAiSW5vZGUgMHglbHgsIGJhZCBjb3VudDogJWQgJWQgb3IgdmVyc2lvbiAweCV4ICIKKwkJCQkiMHgleC4iLCB2aS0+aV9pbm8sIHZpLT5pX25saW5rLAorCQkJCWF0b21pY19yZWFkKCZ2aS0+aV9jb3VudCksIHZpLT5pX2dlbmVyYXRpb24sCisJCQkJZ2VuKTsKKwkJaXB1dCh2aSk7CisJCXJldHVybiBFUlJfUFRSKC1FU1RBTEUpOworCX0KKwkvKiBOb3cgZmluZCBhIGRlbnRyeS4gIElmIHBvc3NpYmxlLCBnZXQgYSB3ZWxsLWNvbm5lY3RlZCBvbmUuICovCisJZGVudCA9IGRfYWxsb2NfYW5vbih2aSk7CisJaWYgKHVubGlrZWx5KCFkZW50KSkgeworCQlpcHV0KHZpKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCW50ZnNfZGVidWcoIkRvbmUgZm9yIGlub2RlIDB4JWx4LCBnZW5lcmF0aW9uIDB4JXguIiwgaW5vLCBnZW4pOworCXJldHVybiBkZW50OworfQpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9udGZzLmggYi9mcy9udGZzL250ZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjBmZmI3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9udGZzLmgKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBudGZzLmggLSBEZWZpbmVzIGZvciBOVEZTIExpbnV4IGtlcm5lbCBkcml2ZXIuIFBhcnQgb2YgdGhlIExpbnV4LU5URlMKKyAqCSAgICBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJpY2hhcmQgUnVzc29uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfTElOVVhfTlRGU19ICisjZGVmaW5lIF9MSU5VWF9OVEZTX0gKKworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKworI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAidm9sdW1lLmgiCisjaW5jbHVkZSAibGF5b3V0LmgiCisKK3R5cGVkZWYgZW51bSB7CisJTlRGU19CTE9DS19TSVpFCQk9IDUxMiwKKwlOVEZTX0JMT0NLX1NJWkVfQklUUwk9IDksCisJTlRGU19TQl9NQUdJQwkJPSAweDUzNDY1NDRlLAkvKiAnTlRGUycgKi8KKwlOVEZTX01BWF9OQU1FX0xFTgk9IDI1NSwKK30gTlRGU19DT05TVEFOVFM7CisKKy8qIEdsb2JhbCB2YXJpYWJsZXMuICovCisKKy8qIFNsYWIgY2FjaGVzIChmcm9tIHN1cGVyLmMpLiAqLworZXh0ZXJuIGttZW1fY2FjaGVfdCAqbnRmc19uYW1lX2NhY2hlOworZXh0ZXJuIGttZW1fY2FjaGVfdCAqbnRmc19pbm9kZV9jYWNoZTsKK2V4dGVybiBrbWVtX2NhY2hlX3QgKm50ZnNfYmlnX2lub2RlX2NhY2hlOworZXh0ZXJuIGttZW1fY2FjaGVfdCAqbnRmc19hdHRyX2N0eF9jYWNoZTsKK2V4dGVybiBrbWVtX2NhY2hlX3QgKm50ZnNfaW5kZXhfY3R4X2NhY2hlOworCisvKiBUaGUgdmFyaW91cyBvcGVyYXRpb25zIHN0cnVjdHMgZGVmaW5lZCB0aHJvdWdob3V0IHRoZSBkcml2ZXIgZmlsZXMuICovCitleHRlcm4gc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBudGZzX2FvcHM7CitleHRlcm4gc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBudGZzX21zdF9hb3BzOworCitleHRlcm4gc3RydWN0ICBmaWxlX29wZXJhdGlvbnMgbnRmc19maWxlX29wczsKK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBudGZzX2ZpbGVfaW5vZGVfb3BzOworCitleHRlcm4gc3RydWN0ICBmaWxlX29wZXJhdGlvbnMgbnRmc19kaXJfb3BzOworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIG50ZnNfZGlyX2lub2RlX29wczsKKworZXh0ZXJuIHN0cnVjdCAgZmlsZV9vcGVyYXRpb25zIG50ZnNfZW1wdHlfZmlsZV9vcHM7CitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgbnRmc19lbXB0eV9pbm9kZV9vcHM7CisKKy8qKgorICogTlRGU19TQiAtIHJldHVybiB0aGUgbnRmcyB2b2x1bWUgZ2l2ZW4gYSB2ZnMgc3VwZXIgYmxvY2sKKyAqIEBzYjoJCVZGUyBzdXBlciBibG9jaworICoKKyAqIE5URlNfU0IoKSByZXR1cm5zIHRoZSBudGZzIHZvbHVtZSBhc3NvY2lhdGVkIHdpdGggdGhlIFZGUyBzdXBlciBibG9jayBAc2IuCisgKi8KK3N0YXRpYyBpbmxpbmUgbnRmc192b2x1bWUgKk5URlNfU0Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlyZXR1cm4gc2ItPnNfZnNfaW5mbzsKK30KKworLyogRGVjbGFyYXRpb25zIG9mIGZ1bmN0aW9ucyBhbmQgZ2xvYmFsIHZhcmlhYmxlcy4gKi8KKworLyogRnJvbSBmcy9udGZzL2NvbXByZXNzLmMgKi8KK2V4dGVybiBpbnQgbnRmc19yZWFkX2NvbXByZXNzZWRfYmxvY2soc3RydWN0IHBhZ2UgKnBhZ2UpOworZXh0ZXJuIGludCBhbGxvY2F0ZV9jb21wcmVzc2lvbl9idWZmZXJzKHZvaWQpOworZXh0ZXJuIHZvaWQgZnJlZV9jb21wcmVzc2lvbl9idWZmZXJzKHZvaWQpOworCisvKiBGcm9tIGZzL250ZnMvc3VwZXIuYyAqLworI2RlZmluZSBkZWZhdWx0X3VwY2FzZV9sZW4gMHgxMDAwMAorZXh0ZXJuIHN0cnVjdCBzZW1hcGhvcmUgbnRmc19sb2NrOworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHZhbDsKKwljaGFyICpzdHI7Cit9IG9wdGlvbl90OworZXh0ZXJuIGNvbnN0IG9wdGlvbl90IG9uX2Vycm9yc19hcnJbXTsKKworLyogRnJvbSBmcy9udGZzL21zdC5jICovCitleHRlcm4gaW50IHBvc3RfcmVhZF9tc3RfZml4dXAoTlRGU19SRUNPUkQgKmIsIGNvbnN0IHUzMiBzaXplKTsKK2V4dGVybiBpbnQgcHJlX3dyaXRlX21zdF9maXh1cChOVEZTX1JFQ09SRCAqYiwgY29uc3QgdTMyIHNpemUpOworZXh0ZXJuIHZvaWQgcG9zdF93cml0ZV9tc3RfZml4dXAoTlRGU19SRUNPUkQgKmIpOworCisvKiBGcm9tIGZzL250ZnMvdW5pc3RyLmMgKi8KK2V4dGVybiBCT09MIG50ZnNfYXJlX25hbWVzX2VxdWFsKGNvbnN0IG50ZnNjaGFyICpzMSwgc2l6ZV90IHMxX2xlbiwKKwkJY29uc3QgbnRmc2NoYXIgKnMyLCBzaXplX3QgczJfbGVuLAorCQljb25zdCBJR05PUkVfQ0FTRV9CT09MIGljLAorCQljb25zdCBudGZzY2hhciAqdXBjYXNlLCBjb25zdCB1MzIgdXBjYXNlX3NpemUpOworZXh0ZXJuIGludCBudGZzX2NvbGxhdGVfbmFtZXMoY29uc3QgbnRmc2NoYXIgKm5hbWUxLCBjb25zdCB1MzIgbmFtZTFfbGVuLAorCQljb25zdCBudGZzY2hhciAqbmFtZTIsIGNvbnN0IHUzMiBuYW1lMl9sZW4sCisJCWNvbnN0IGludCBlcnJfdmFsLCBjb25zdCBJR05PUkVfQ0FTRV9CT09MIGljLAorCQljb25zdCBudGZzY2hhciAqdXBjYXNlLCBjb25zdCB1MzIgdXBjYXNlX2xlbik7CitleHRlcm4gaW50IG50ZnNfdWNzbmNtcChjb25zdCBudGZzY2hhciAqczEsIGNvbnN0IG50ZnNjaGFyICpzMiwgc2l6ZV90IG4pOworZXh0ZXJuIGludCBudGZzX3Vjc25jYXNlY21wKGNvbnN0IG50ZnNjaGFyICpzMSwgY29uc3QgbnRmc2NoYXIgKnMyLCBzaXplX3QgbiwKKwkJY29uc3QgbnRmc2NoYXIgKnVwY2FzZSwgY29uc3QgdTMyIHVwY2FzZV9zaXplKTsKK2V4dGVybiB2b2lkIG50ZnNfdXBjYXNlX25hbWUobnRmc2NoYXIgKm5hbWUsIHUzMiBuYW1lX2xlbiwKKwkJY29uc3QgbnRmc2NoYXIgKnVwY2FzZSwgY29uc3QgdTMyIHVwY2FzZV9sZW4pOworZXh0ZXJuIHZvaWQgbnRmc19maWxlX3VwY2FzZV92YWx1ZShGSUxFX05BTUVfQVRUUiAqZmlsZV9uYW1lX2F0dHIsCisJCWNvbnN0IG50ZnNjaGFyICp1cGNhc2UsIGNvbnN0IHUzMiB1cGNhc2VfbGVuKTsKK2V4dGVybiBpbnQgbnRmc19maWxlX2NvbXBhcmVfdmFsdWVzKEZJTEVfTkFNRV9BVFRSICpmaWxlX25hbWVfYXR0cjEsCisJCUZJTEVfTkFNRV9BVFRSICpmaWxlX25hbWVfYXR0cjIsCisJCWNvbnN0IGludCBlcnJfdmFsLCBjb25zdCBJR05PUkVfQ0FTRV9CT09MIGljLAorCQljb25zdCBudGZzY2hhciAqdXBjYXNlLCBjb25zdCB1MzIgdXBjYXNlX2xlbik7CitleHRlcm4gaW50IG50ZnNfbmxzdG91Y3MoY29uc3QgbnRmc192b2x1bWUgKnZvbCwgY29uc3QgY2hhciAqaW5zLAorCQljb25zdCBpbnQgaW5zX2xlbiwgbnRmc2NoYXIgKipvdXRzKTsKK2V4dGVybiBpbnQgbnRmc191Y3N0b25scyhjb25zdCBudGZzX3ZvbHVtZSAqdm9sLCBjb25zdCBudGZzY2hhciAqaW5zLAorCQljb25zdCBpbnQgaW5zX2xlbiwgdW5zaWduZWQgY2hhciAqKm91dHMsIGludCBvdXRzX2xlbik7CisKKy8qIEZyb20gZnMvbnRmcy91cGNhc2UuYyAqLworZXh0ZXJuIG50ZnNjaGFyICpnZW5lcmF0ZV9kZWZhdWx0X3VwY2FzZSh2b2lkKTsKKworI2VuZGlmIC8qIF9MSU5VWF9OVEZTX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvcXVvdGEuYyBiL2ZzL250ZnMvcXVvdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzNkZjJhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9xdW90YS5jCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogcXVvdGEuYyAtIE5URlMga2VybmVsIHF1b3RhICgkUXVvdGEpIGhhbmRsaW5nLiAgUGFydCBvZiB0aGUgTGludXgtTlRGUworICoJICAgICBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZkZWYgTlRGU19SVworCisjaW5jbHVkZSAiaW5kZXguaCIKKyNpbmNsdWRlICJxdW90YS5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAibnRmcy5oIgorCisvKioKKyAqIG50ZnNfbWFya19xdW90YXNfb3V0X29mX2RhdGUgLSBtYXJrIHRoZSBxdW90YXMgb3V0IG9mIGRhdGUgb24gYW4gbnRmcyB2b2x1bWUKKyAqIEB2b2w6CW50ZnMgdm9sdW1lIG9uIHdoaWNoIHRvIG1hcmsgdGhlIHF1b3RhcyBvdXQgb2YgZGF0ZQorICoKKyAqIE1hcmsgdGhlIHF1b3RhcyBvdXQgb2YgZGF0ZSBvbiB0aGUgbnRmcyB2b2x1bWUgQHZvbCBhbmQgcmV0dXJuIFRSVUUgb24KKyAqIHN1Y2Nlc3MgYW5kIEZBTFNFIG9uIGVycm9yLgorICovCitCT09MIG50ZnNfbWFya19xdW90YXNfb3V0X29mX2RhdGUobnRmc192b2x1bWUgKnZvbCkKK3sKKwludGZzX2luZGV4X2NvbnRleHQgKmljdHg7CisJUVVPVEFfQ09OVFJPTF9FTlRSWSAqcWNlOworCWNvbnN0IGxlMzIgcWlkID0gUVVPVEFfREVGQVVMVFNfSUQ7CisJaW50IGVycjsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworCWlmIChOVm9sUXVvdGFPdXRPZkRhdGUodm9sKSkKKwkJZ290byBkb25lOworCWlmICghdm9sLT5xdW90YV9pbm8gfHwgIXZvbC0+cXVvdGFfcV9pbm8pIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiUXVvdGEgaW5vZGVzIGFyZSBub3Qgb3Blbi4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlkb3duKCZ2b2wtPnF1b3RhX3FfaW5vLT5pX3NlbSk7CisJaWN0eCA9IG50ZnNfaW5kZXhfY3R4X2dldChOVEZTX0kodm9sLT5xdW90YV9xX2lubykpOworCWlmICghaWN0eCkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZ2V0IGluZGV4IGNvbnRleHQuIik7CisJCWdvdG8gZXJyX291dDsKKwl9CisJZXJyID0gbnRmc19pbmRleF9sb29rdXAoJnFpZCwgc2l6ZW9mKHFpZCksIGljdHgpOworCWlmIChlcnIpIHsKKwkJaWYgKGVyciA9PSAtRU5PRU5UKQorCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiUXVvdGEgZGVmYXVsdHMgZW50cnkgaXMgbm90ICIKKwkJCQkJInByZXNlbnQuIik7CisJCWVsc2UKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkxvb2t1cCBvZiBxdW90YSBkZWZhdWx0cyBlbnRyeSAiCisJCQkJCSJmYWlsZWQuIik7CisJCWdvdG8gZXJyX291dDsKKwl9CisJaWYgKGljdHgtPmRhdGFfbGVuIDwgb2Zmc2V0b2YoUVVPVEFfQ09OVFJPTF9FTlRSWSwgc2lkKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJRdW90YSBkZWZhdWx0cyBlbnRyeSBzaXplIGlzIGludmFsaWQuICAiCisJCQkJIlJ1biBjaGtkc2suIik7CisJCWdvdG8gZXJyX291dDsKKwl9CisJcWNlID0gKFFVT1RBX0NPTlRST0xfRU5UUlkqKWljdHgtPmRhdGE7CisJaWYgKGxlMzJfdG9fY3B1KHFjZS0+dmVyc2lvbikgIT0gUVVPVEFfVkVSU0lPTikgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJRdW90YSBkZWZhdWx0cyBlbnRyeSB2ZXJzaW9uIDB4JXggaXMgbm90ICIKKwkJCQkic3VwcG9ydGVkLiIsIGxlMzJfdG9fY3B1KHFjZS0+dmVyc2lvbikpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCW50ZnNfZGVidWcoIlF1b3RhIGRlZmF1bHRzIGZsYWdzID0gMHgleC4iLCBsZTMyX3RvX2NwdShxY2UtPmZsYWdzKSk7CisJLyogSWYgcXVvdGFzIGFyZSBhbHJlYWR5IG1hcmtlZCBvdXQgb2YgZGF0ZSwgbm8gbmVlZCB0byBkbyBhbnl0aGluZy4gKi8KKwlpZiAocWNlLT5mbGFncyAmIFFVT1RBX0ZMQUdfT1VUX09GX0RBVEUpCisJCWdvdG8gc2V0X2RvbmU7CisJLyoKKwkgKiBJZiBxdW90YSB0cmFja2luZyBpcyBuZWl0aGVyIHJlcXVlc3RlZCwgbm9yIGVuYWJsZWQgYW5kIHRoZXJlIGFyZSBubworCSAqIHBlbmRpbmcgZGVsZXRlcywgbm8gbmVlZCB0byBtYXJrIHRoZSBxdW90YXMgb3V0IG9mIGRhdGUuCisJICovCisJaWYgKCEocWNlLT5mbGFncyAmIChRVU9UQV9GTEFHX1RSQUNLSU5HX0VOQUJMRUQgfAorCQkJUVVPVEFfRkxBR19UUkFDS0lOR19SRVFVRVNURUQgfAorCQkJUVVPVEFfRkxBR19QRU5ESU5HX0RFTEVURVMpKSkKKwkJZ290byBzZXRfZG9uZTsKKwkvKgorCSAqIFNldCB0aGUgUVVPVEFfRkxBR19PVVRfT0ZfREFURSBiaXQgdGh1cyBtYXJraW5nIHF1b3RhcyBvdXQgb2YgZGF0ZS4KKwkgKiBUaGlzIGlzIHZlcmlmaWVkIG9uIFdpblhQIHRvIGJlIHN1ZmZpY2llbnQgdG8gY2F1c2Ugd2luZG93cyB0bworCSAqIHJlc2NhbiB0aGUgdm9sdW1lIG9uIGJvb3QgYW5kIHVwZGF0ZSBhbGwgcXVvdGEgZW50cmllcy4KKwkgKi8KKwlxY2UtPmZsYWdzIHw9IFFVT1RBX0ZMQUdfT1VUX09GX0RBVEU7CisJLyogRW5zdXJlIHRoZSBtb2RpZmllZCBmbGFncyBhcmUgd3JpdHRlbiB0byBkaXNrLiAqLworCW50ZnNfaW5kZXhfZW50cnlfZmx1c2hfZGNhY2hlX3BhZ2UoaWN0eCk7CisJbnRmc19pbmRleF9lbnRyeV9tYXJrX2RpcnR5KGljdHgpOworc2V0X2RvbmU6CisJbnRmc19pbmRleF9jdHhfcHV0KGljdHgpOworCXVwKCZ2b2wtPnF1b3RhX3FfaW5vLT5pX3NlbSk7CisJLyoKKwkgKiBXZSBzZXQgdGhlIGZsYWcgc28gd2UgZG8gbm90IHRyeSB0byBtYXJrIHRoZSBxdW90YXMgb3V0IG9mIGRhdGUKKwkgKiBhZ2FpbiBvbiByZW1vdW50LgorCSAqLworCU5Wb2xTZXRRdW90YU91dE9mRGF0ZSh2b2wpOworZG9uZToKKwludGZzX2RlYnVnKCJEb25lLiIpOworCXJldHVybiBUUlVFOworZXJyX291dDoKKwlpZiAoaWN0eCkKKwkJbnRmc19pbmRleF9jdHhfcHV0KGljdHgpOworCXVwKCZ2b2wtPnF1b3RhX3FfaW5vLT5pX3NlbSk7CisJcmV0dXJuIEZBTFNFOworfQorCisjZW5kaWYgLyogTlRGU19SVyAqLwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy9xdW90YS5oIGIvZnMvbnRmcy9xdW90YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZTQ3NjMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL3F1b3RhLmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIHF1b3RhLmggLSBEZWZpbmVzIGZvciBOVEZTIGtlcm5lbCBxdW90YSAoJFF1b3RhKSBoYW5kbGluZy4gIFBhcnQgb2YgdGhlCisgKgkgICAgIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfTElOVVhfTlRGU19RVU9UQV9ICisjZGVmaW5lIF9MSU5VWF9OVEZTX1FVT1RBX0gKKworI2lmZGVmIE5URlNfUlcKKworI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAidm9sdW1lLmgiCisKK2V4dGVybiBCT09MIG50ZnNfbWFya19xdW90YXNfb3V0X29mX2RhdGUobnRmc192b2x1bWUgKnZvbCk7CisKKyNlbmRpZiAvKiBOVEZTX1JXICovCisKKyNlbmRpZiAvKiBfTElOVVhfTlRGU19RVU9UQV9IICovCmRpZmYgLS1naXQgYS9mcy9udGZzL3J1bmxpc3QuYyBiL2ZzL250ZnMvcnVubGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MzhmYjEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL3J1bmxpc3QuYwpAQCAtMCwwICsxLDE0MzggQEAKKy8qKgorICogcnVubGlzdC5jIC0gTlRGUyBydW5saXN0IGhhbmRsaW5nIGNvZGUuICBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgUmljaGFyZCBSdXNzb24KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJkaXIuaCIKKyNpbmNsdWRlICJlbmRpYW4uaCIKKyNpbmNsdWRlICJtYWxsb2MuaCIKKyNpbmNsdWRlICJudGZzLmgiCisKKy8qKgorICogbnRmc19ybF9tbSAtIHJ1bmxpc3QgbWVtbW92ZQorICoKKyAqIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gc2VyaWFsaXplIGFjY2VzcyB0byB0aGUgcnVubGlzdCBAYmFzZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIG50ZnNfcmxfbW0ocnVubGlzdF9lbGVtZW50ICpiYXNlLCBpbnQgZHN0LCBpbnQgc3JjLAorCQlpbnQgc2l6ZSkKK3sKKwlpZiAobGlrZWx5KChkc3QgIT0gc3JjKSAmJiAoc2l6ZSA+IDApKSkKKwkJbWVtbW92ZShiYXNlICsgZHN0LCBiYXNlICsgc3JjLCBzaXplICogc2l6ZW9mICgqYmFzZSkpOworfQorCisvKioKKyAqIG50ZnNfcmxfbWMgLSBydW5saXN0IG1lbW9yeSBjb3B5CisgKgorICogSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBzZXJpYWxpemUgYWNjZXNzIHRvIHRoZSBydW5saXN0cyBAZHN0YmFzZSBhbmQKKyAqIEBzcmNiYXNlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbnRmc19ybF9tYyhydW5saXN0X2VsZW1lbnQgKmRzdGJhc2UsIGludCBkc3QsCisJCXJ1bmxpc3RfZWxlbWVudCAqc3JjYmFzZSwgaW50IHNyYywgaW50IHNpemUpCit7CisJaWYgKGxpa2VseShzaXplID4gMCkpCisJCW1lbWNweShkc3RiYXNlICsgZHN0LCBzcmNiYXNlICsgc3JjLCBzaXplICogc2l6ZW9mKCpkc3RiYXNlKSk7Cit9CisKKy8qKgorICogbnRmc19ybF9yZWFsbG9jIC0gUmVhbGxvY2F0ZSBtZW1vcnkgZm9yIHJ1bmxpc3RzCisgKiBAcmw6CQlvcmlnaW5hbCBydW5saXN0CisgKiBAb2xkX3NpemU6CW51bWJlciBvZiBydW5saXN0IGVsZW1lbnRzIGluIHRoZSBvcmlnaW5hbCBydW5saXN0IEBybAorICogQG5ld19zaXplOgludW1iZXIgb2YgcnVubGlzdCBlbGVtZW50cyB3ZSBuZWVkIHNwYWNlIGZvcgorICoKKyAqIEFzIHRoZSBydW5saXN0cyBncm93LCBtb3JlIG1lbW9yeSB3aWxsIGJlIHJlcXVpcmVkLiAgVG8gcHJldmVudCB0aGUKKyAqIGtlcm5lbCBoYXZpbmcgdG8gYWxsb2NhdGUgYW5kIHJlYWxsb2NhdGUgbGFyZ2UgbnVtYmVycyBvZiBzbWFsbCBiaXRzIG9mCisgKiBtZW1vcnksIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbmQgZW50aXJlIHBhZ2Ugb2YgbWVtb3J5LgorICoKKyAqIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gc2VyaWFsaXplIGFjY2VzcyB0byB0aGUgcnVubGlzdCBAcmwuCisgKgorICogTi5CLiAgSWYgdGhlIG5ldyBhbGxvY2F0aW9uIGRvZXNuJ3QgcmVxdWlyZSBhIGRpZmZlcmVudCBudW1iZXIgb2YgcGFnZXMgaW4KKyAqICAgICAgIG1lbW9yeSwgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSBvcmlnaW5hbCBwb2ludGVyLgorICoKKyAqIE9uIHN1Y2Nlc3MsIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG5ld2x5IGFsbG9jYXRlZCwgb3IgcmVjeWNsZWQsIG1lbW9yeS4KKyAqIE9uIGVycm9yLCByZXR1cm4gLWVycm5vLiBUaGUgZm9sbG93aW5nIGVycm9yIGNvZGVzIGFyZSBkZWZpbmVkOgorICoJLUVOT01FTQktIE5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHJ1bmxpc3QgYXJyYXkuCisgKgktRUlOVkFMCS0gSW52YWxpZCBwYXJhbWV0ZXJzIHdlcmUgcGFzc2VkIGluLgorICovCitzdGF0aWMgaW5saW5lIHJ1bmxpc3RfZWxlbWVudCAqbnRmc19ybF9yZWFsbG9jKHJ1bmxpc3RfZWxlbWVudCAqcmwsCisJCWludCBvbGRfc2l6ZSwgaW50IG5ld19zaXplKQoreworCXJ1bmxpc3RfZWxlbWVudCAqbmV3X3JsOworCisJb2xkX3NpemUgPSBQQUdFX0FMSUdOKG9sZF9zaXplICogc2l6ZW9mKCpybCkpOworCW5ld19zaXplID0gUEFHRV9BTElHTihuZXdfc2l6ZSAqIHNpemVvZigqcmwpKTsKKwlpZiAob2xkX3NpemUgPT0gbmV3X3NpemUpCisJCXJldHVybiBybDsKKworCW5ld19ybCA9IG50ZnNfbWFsbG9jX25vZnMobmV3X3NpemUpOworCWlmICh1bmxpa2VseSghbmV3X3JsKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlpZiAobGlrZWx5KHJsICE9IE5VTEwpKSB7CisJCWlmICh1bmxpa2VseShvbGRfc2l6ZSA+IG5ld19zaXplKSkKKwkJCW9sZF9zaXplID0gbmV3X3NpemU7CisJCW1lbWNweShuZXdfcmwsIHJsLCBvbGRfc2l6ZSk7CisJCW50ZnNfZnJlZShybCk7CisJfQorCXJldHVybiBuZXdfcmw7Cit9CisKKy8qKgorICogbnRmc19hcmVfcmxfbWVyZ2VhYmxlIC0gdGVzdCBpZiB0d28gcnVubGlzdHMgY2FuIGJlIGpvaW5lZCB0b2dldGhlcgorICogQGRzdDoJb3JpZ2luYWwgcnVubGlzdAorICogQHNyYzoJbmV3IHJ1bmxpc3QgdG8gdGVzdCBmb3IgbWVyZ2VhYmlsaXR5IHdpdGggQGRzdAorICoKKyAqIFRlc3QgaWYgdHdvIHJ1bmxpc3RzIGNhbiBiZSBqb2luZWQgdG9nZXRoZXIuIEZvciB0aGlzLCB0aGVpciBWQ05zIGFuZCBMQ05zCisgKiBtdXN0IGJlIGFkamFjZW50LgorICoKKyAqIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gc2VyaWFsaXplIGFjY2VzcyB0byB0aGUgcnVubGlzdHMgQGRzdCBhbmQgQHNyYy4KKyAqCisgKiBSZXR1cm46IFRSVUUgICBTdWNjZXNzLCB0aGUgcnVubGlzdHMgY2FuIGJlIG1lcmdlZC4KKyAqCSAgIEZBTFNFICBGYWlsdXJlLCB0aGUgcnVubGlzdHMgY2Fubm90IGJlIG1lcmdlZC4KKyAqLworc3RhdGljIGlubGluZSBCT09MIG50ZnNfYXJlX3JsX21lcmdlYWJsZShydW5saXN0X2VsZW1lbnQgKmRzdCwKKwkJcnVubGlzdF9lbGVtZW50ICpzcmMpCit7CisJQlVHX09OKCFkc3QpOworCUJVR19PTighc3JjKTsKKworCWlmICgoZHN0LT5sY24gPCAwKSB8fCAoc3JjLT5sY24gPCAwKSkgICAgIC8qIEFyZSB3ZSBtZXJnaW5nIGhvbGVzPyAqLworCQlyZXR1cm4gRkFMU0U7CisJaWYgKChkc3QtPmxjbiArIGRzdC0+bGVuZ3RoKSAhPSBzcmMtPmxjbikgLyogQXJlIHRoZSBydW5zIGNvbnRpZ3VvdXM/ICovCisJCXJldHVybiBGQUxTRTsKKwlpZiAoKGRzdC0+dmNuICsgZHN0LT5sZW5ndGgpICE9IHNyYy0+dmNuKSAvKiBBcmUgdGhlIHJ1bnMgbWlzYWxpZ25lZD8gKi8KKwkJcmV0dXJuIEZBTFNFOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogX19udGZzX3JsX21lcmdlIC0gbWVyZ2UgdHdvIHJ1bmxpc3RzIHdpdGhvdXQgdGVzdGluZyBpZiB0aGV5IGNhbiBiZSBtZXJnZWQKKyAqIEBkc3Q6CW9yaWdpbmFsLCBkZXN0aW5hdGlvbiBydW5saXN0CisgKiBAc3JjOgluZXcgcnVubGlzdCB0byBtZXJnZSB3aXRoIEBkc3QKKyAqCisgKiBNZXJnZSB0aGUgdHdvIHJ1bmxpc3RzLCB3cml0aW5nIGludG8gdGhlIGRlc3RpbmF0aW9uIHJ1bmxpc3QgQGRzdC4gVGhlCisgKiBjYWxsZXIgbXVzdCBtYWtlIHN1cmUgdGhlIHJ1bmxpc3RzIGNhbiBiZSBtZXJnZWQgb3IgdGhpcyB3aWxsIGNvcnJ1cHQgdGhlCisgKiBkZXN0aW5hdGlvbiBydW5saXN0LgorICoKKyAqIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gc2VyaWFsaXplIGFjY2VzcyB0byB0aGUgcnVubGlzdHMgQGRzdCBhbmQgQHNyYy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fbnRmc19ybF9tZXJnZShydW5saXN0X2VsZW1lbnQgKmRzdCwgcnVubGlzdF9lbGVtZW50ICpzcmMpCit7CisJZHN0LT5sZW5ndGggKz0gc3JjLT5sZW5ndGg7Cit9CisKKy8qKgorICogbnRmc19ybF9hcHBlbmQgLSBhcHBlbmQgYSBydW5saXN0IGFmdGVyIGEgZ2l2ZW4gZWxlbWVudAorICogQGRzdDoJb3JpZ2luYWwgcnVubGlzdCB0byBiZSB3b3JrZWQgb24KKyAqIEBkc2l6ZToJbnVtYmVyIG9mIGVsZW1lbnRzIGluIEBkc3QgKGluY2x1ZGluZyBlbmQgbWFya2VyKQorICogQHNyYzoJcnVubGlzdCB0byBiZSBpbnNlcnRlZCBpbnRvIEBkc3QKKyAqIEBzc2l6ZToJbnVtYmVyIG9mIGVsZW1lbnRzIGluIEBzcmMgKGV4Y2x1ZGluZyBlbmQgbWFya2VyKQorICogQGxvYzoJYXBwZW5kIHRoZSBuZXcgcnVubGlzdCBAc3JjIGFmdGVyIHRoaXMgZWxlbWVudCBpbiBAZHN0CisgKgorICogQXBwZW5kIHRoZSBydW5saXN0IEBzcmMgYWZ0ZXIgZWxlbWVudCBAbG9jIGluIEBkc3QuICBNZXJnZSB0aGUgcmlnaHQgZW5kIG9mCisgKiB0aGUgbmV3IHJ1bmxpc3QsIGlmIG5lY2Vzc2FyeS4gQWRqdXN0IHRoZSBzaXplIG9mIHRoZSBob2xlIGJlZm9yZSB0aGUKKyAqIGFwcGVuZGVkIHJ1bmxpc3QuCisgKgorICogSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBzZXJpYWxpemUgYWNjZXNzIHRvIHRoZSBydW5saXN0cyBAZHN0IGFuZCBAc3JjLgorICoKKyAqIE9uIHN1Y2Nlc3MsIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG5ldywgY29tYmluZWQsIHJ1bmxpc3QuIE5vdGUsIGJvdGgKKyAqIHJ1bmxpc3RzIEBkc3QgYW5kIEBzcmMgYXJlIGRlYWxsb2NhdGVkIGJlZm9yZSByZXR1cm5pbmcgc28geW91IGNhbm5vdCB1c2UKKyAqIHRoZSBwb2ludGVycyBmb3IgYW55dGhpbmcgYW55IG1vcmUuIChTdHJpY3RseSBzcGVha2luZyB0aGUgcmV0dXJuZWQgcnVubGlzdAorICogbWF5IGJlIHRoZSBzYW1lIGFzIEBkc3QgYnV0IHRoaXMgaXMgaXJyZWxldmFudC4pCisgKgorICogT24gZXJyb3IsIHJldHVybiAtZXJybm8uIEJvdGggcnVubGlzdHMgYXJlIGxlZnQgdW5tb2RpZmllZC4gVGhlIGZvbGxvd2luZworICogZXJyb3IgY29kZXMgYXJlIGRlZmluZWQ6CisgKgktRU5PTUVNCS0gTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgcnVubGlzdCBhcnJheS4KKyAqCS1FSU5WQUwJLSBJbnZhbGlkIHBhcmFtZXRlcnMgd2VyZSBwYXNzZWQgaW4uCisgKi8KK3N0YXRpYyBpbmxpbmUgcnVubGlzdF9lbGVtZW50ICpudGZzX3JsX2FwcGVuZChydW5saXN0X2VsZW1lbnQgKmRzdCwKKwkJaW50IGRzaXplLCBydW5saXN0X2VsZW1lbnQgKnNyYywgaW50IHNzaXplLCBpbnQgbG9jKQoreworCUJPT0wgcmlnaHQ7CisJaW50IG1hZ2ljOworCisJQlVHX09OKCFkc3QpOworCUJVR19PTighc3JjKTsKKworCS8qIEZpcnN0LCBjaGVjayBpZiB0aGUgcmlnaHQgaGFuZCBlbmQgbmVlZHMgbWVyZ2luZy4gKi8KKwlyaWdodCA9IG50ZnNfYXJlX3JsX21lcmdlYWJsZShzcmMgKyBzc2l6ZSAtIDEsIGRzdCArIGxvYyArIDEpOworCisJLyogU3BhY2UgcmVxdWlyZWQ6IEBkc3Qgc2l6ZSArIEBzcmMgc2l6ZSwgbGVzcyBvbmUgaWYgd2UgbWVyZ2VkLiAqLworCWRzdCA9IG50ZnNfcmxfcmVhbGxvYyhkc3QsIGRzaXplLCBkc2l6ZSArIHNzaXplIC0gcmlnaHQpOworCWlmIChJU19FUlIoZHN0KSkKKwkJcmV0dXJuIGRzdDsKKwkvKgorCSAqIFdlIGFyZSBndWFyYW50ZWVkIHRvIHN1Y2NlZWQgZnJvbSBoZXJlIHNvIGNhbiBzdGFydCBtb2RpZnlpbmcgdGhlCisJICogb3JpZ2luYWwgcnVubGlzdHMuCisJICovCisKKwkvKiBGaXJzdCwgbWVyZ2UgdGhlIHJpZ2h0IGhhbmQgZW5kLCBpZiBuZWNlc3NhcnkuICovCisJaWYgKHJpZ2h0KQorCQlfX250ZnNfcmxfbWVyZ2Uoc3JjICsgc3NpemUgLSAxLCBkc3QgKyBsb2MgKyAxKTsKKworCW1hZ2ljID0gbG9jICsgc3NpemU7CisKKwkvKiBNb3ZlIHRoZSB0YWlsIG9mIEBkc3Qgb3V0IG9mIHRoZSB3YXksIHRoZW4gY29weSBpbiBAc3JjLiAqLworCW50ZnNfcmxfbW0oZHN0LCBtYWdpYyArIDEsIGxvYyArIDEgKyByaWdodCwgZHNpemUgLSBsb2MgLSAxIC0gcmlnaHQpOworCW50ZnNfcmxfbWMoZHN0LCBsb2MgKyAxLCBzcmMsIDAsIHNzaXplKTsKKworCS8qIEFkanVzdCB0aGUgc2l6ZSBvZiB0aGUgcHJlY2VkaW5nIGhvbGUuICovCisJZHN0W2xvY10ubGVuZ3RoID0gZHN0W2xvYyArIDFdLnZjbiAtIGRzdFtsb2NdLnZjbjsKKworCS8qIFdlIG1heSBoYXZlIGNoYW5nZWQgdGhlIGxlbmd0aCBvZiB0aGUgZmlsZSwgc28gZml4IHRoZSBlbmQgbWFya2VyICovCisJaWYgKGRzdFttYWdpYyArIDFdLmxjbiA9PSBMQ05fRU5PRU5UKQorCQlkc3RbbWFnaWMgKyAxXS52Y24gPSBkc3RbbWFnaWNdLnZjbiArIGRzdFttYWdpY10ubGVuZ3RoOworCisJcmV0dXJuIGRzdDsKK30KKworLyoqCisgKiBudGZzX3JsX2luc2VydCAtIGluc2VydCBhIHJ1bmxpc3QgaW50byBhbm90aGVyCisgKiBAZHN0OglvcmlnaW5hbCBydW5saXN0IHRvIGJlIHdvcmtlZCBvbgorICogQGRzaXplOgludW1iZXIgb2YgZWxlbWVudHMgaW4gQGRzdCAoaW5jbHVkaW5nIGVuZCBtYXJrZXIpCisgKiBAc3JjOgluZXcgcnVubGlzdCB0byBiZSBpbnNlcnRlZAorICogQHNzaXplOgludW1iZXIgb2YgZWxlbWVudHMgaW4gQHNyYyAoZXhjbHVkaW5nIGVuZCBtYXJrZXIpCisgKiBAbG9jOglpbnNlcnQgdGhlIG5ldyBydW5saXN0IEBzcmMgYmVmb3JlIHRoaXMgZWxlbWVudCBpbiBAZHN0CisgKgorICogSW5zZXJ0IHRoZSBydW5saXN0IEBzcmMgYmVmb3JlIGVsZW1lbnQgQGxvYyBpbiB0aGUgcnVubGlzdCBAZHN0LiBNZXJnZSB0aGUKKyAqIGxlZnQgZW5kIG9mIHRoZSBuZXcgcnVubGlzdCwgaWYgbmVjZXNzYXJ5LiBBZGp1c3QgdGhlIHNpemUgb2YgdGhlIGhvbGUKKyAqIGFmdGVyIHRoZSBpbnNlcnRlZCBydW5saXN0LgorICoKKyAqIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gc2VyaWFsaXplIGFjY2VzcyB0byB0aGUgcnVubGlzdHMgQGRzdCBhbmQgQHNyYy4KKyAqCisgKiBPbiBzdWNjZXNzLCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBuZXcsIGNvbWJpbmVkLCBydW5saXN0LiBOb3RlLCBib3RoCisgKiBydW5saXN0cyBAZHN0IGFuZCBAc3JjIGFyZSBkZWFsbG9jYXRlZCBiZWZvcmUgcmV0dXJuaW5nIHNvIHlvdSBjYW5ub3QgdXNlCisgKiB0aGUgcG9pbnRlcnMgZm9yIGFueXRoaW5nIGFueSBtb3JlLiAoU3RyaWN0bHkgc3BlYWtpbmcgdGhlIHJldHVybmVkIHJ1bmxpc3QKKyAqIG1heSBiZSB0aGUgc2FtZSBhcyBAZHN0IGJ1dCB0aGlzIGlzIGlycmVsZXZhbnQuKQorICoKKyAqIE9uIGVycm9yLCByZXR1cm4gLWVycm5vLiBCb3RoIHJ1bmxpc3RzIGFyZSBsZWZ0IHVubW9kaWZpZWQuIFRoZSBmb2xsb3dpbmcKKyAqIGVycm9yIGNvZGVzIGFyZSBkZWZpbmVkOgorICoJLUVOT01FTQktIE5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHJ1bmxpc3QgYXJyYXkuCisgKgktRUlOVkFMCS0gSW52YWxpZCBwYXJhbWV0ZXJzIHdlcmUgcGFzc2VkIGluLgorICovCitzdGF0aWMgaW5saW5lIHJ1bmxpc3RfZWxlbWVudCAqbnRmc19ybF9pbnNlcnQocnVubGlzdF9lbGVtZW50ICpkc3QsCisJCWludCBkc2l6ZSwgcnVubGlzdF9lbGVtZW50ICpzcmMsIGludCBzc2l6ZSwgaW50IGxvYykKK3sKKwlCT09MIGxlZnQgPSBGQUxTRTsKKwlCT09MIGRpc2MgPSBGQUxTRTsJLyogRGlzY29udGludWl0eSAqLworCUJPT0wgaG9sZSA9IEZBTFNFOwkvKiBGb2xsb3dpbmcgYSBob2xlICovCisJaW50IG1hZ2ljOworCisJQlVHX09OKCFkc3QpOworCUJVR19PTighc3JjKTsKKworCS8qIGRpc2MgPT4gRGlzY29udGludWl0eSBiZXR3ZWVuIHRoZSBlbmQgb2YgQGRzdCBhbmQgdGhlIHN0YXJ0IG9mIEBzcmMuCisJICoJICAgVGhpcyBtZWFucyB3ZSBtaWdodCBuZWVkIHRvIGluc2VydCBhIGhvbGUuCisJICogaG9sZSA9PiBAZHN0IGVuZHMgd2l0aCBhIGhvbGUgb3IgYW4gdW5tYXBwZWQgcmVnaW9uIHdoaWNoIHdlIGNhbgorCSAqCSAgIGV4dGVuZCB0byBtYXRjaCB0aGUgZGlzY29udGludWl0eS4gKi8KKwlpZiAobG9jID09IDApCisJCWRpc2MgPSAoc3JjWzBdLnZjbiA+IDApOworCWVsc2UgeworCQlzNjQgbWVyZ2VkX2xlbmd0aDsKKworCQlsZWZ0ID0gbnRmc19hcmVfcmxfbWVyZ2VhYmxlKGRzdCArIGxvYyAtIDEsIHNyYyk7CisKKwkJbWVyZ2VkX2xlbmd0aCA9IGRzdFtsb2MgLSAxXS5sZW5ndGg7CisJCWlmIChsZWZ0KQorCQkJbWVyZ2VkX2xlbmd0aCArPSBzcmMtPmxlbmd0aDsKKworCQlkaXNjID0gKHNyY1swXS52Y24gPiBkc3RbbG9jIC0gMV0udmNuICsgbWVyZ2VkX2xlbmd0aCk7CisJCWlmIChkaXNjKQorCQkJaG9sZSA9IChkc3RbbG9jIC0gMV0ubGNuID09IExDTl9IT0xFKTsKKwl9CisKKwkvKiBTcGFjZSByZXF1aXJlZDogQGRzdCBzaXplICsgQHNyYyBzaXplLCBsZXNzIG9uZSBpZiB3ZSBtZXJnZWQsIHBsdXMKKwkgKiBvbmUgaWYgdGhlcmUgd2FzIGEgZGlzY29udGludWl0eSwgbGVzcyBvbmUgZm9yIGEgdHJhaWxpbmcgaG9sZS4gKi8KKwlkc3QgPSBudGZzX3JsX3JlYWxsb2MoZHN0LCBkc2l6ZSwgZHNpemUgKyBzc2l6ZSAtIGxlZnQgKyBkaXNjIC0gaG9sZSk7CisJaWYgKElTX0VSUihkc3QpKQorCQlyZXR1cm4gZHN0OworCS8qCisJICogV2UgYXJlIGd1YXJhbnRlZWQgdG8gc3VjY2VlZCBmcm9tIGhlcmUgc28gY2FuIHN0YXJ0IG1vZGlmeWluZyB0aGUKKwkgKiBvcmlnaW5hbCBydW5saXN0LgorCSAqLworCisJaWYgKGxlZnQpCisJCV9fbnRmc19ybF9tZXJnZShkc3QgKyBsb2MgLSAxLCBzcmMpOworCisJbWFnaWMgPSBsb2MgKyBzc2l6ZSAtIGxlZnQgKyBkaXNjIC0gaG9sZTsKKworCS8qIE1vdmUgdGhlIHRhaWwgb2YgQGRzdCBvdXQgb2YgdGhlIHdheSwgdGhlbiBjb3B5IGluIEBzcmMuICovCisJbnRmc19ybF9tbShkc3QsIG1hZ2ljLCBsb2MsIGRzaXplIC0gbG9jKTsKKwludGZzX3JsX21jKGRzdCwgbG9jICsgZGlzYyAtIGhvbGUsIHNyYywgbGVmdCwgc3NpemUgLSBsZWZ0KTsKKworCS8qIEFkanVzdCB0aGUgVkNOIG9mIHRoZSBsYXN0IHJ1biAuLi4gKi8KKwlpZiAoZHN0W21hZ2ljXS5sY24gPD0gTENOX0hPTEUpCisJCWRzdFttYWdpY10udmNuID0gZHN0W21hZ2ljIC0gMV0udmNuICsgZHN0W21hZ2ljIC0gMV0ubGVuZ3RoOworCS8qIC4uLiBhbmQgdGhlIGxlbmd0aC4gKi8KKwlpZiAoZHN0W21hZ2ljXS5sY24gPT0gTENOX0hPTEUgfHwgZHN0W21hZ2ljXS5sY24gPT0gTENOX1JMX05PVF9NQVBQRUQpCisJCWRzdFttYWdpY10ubGVuZ3RoID0gZHN0W21hZ2ljICsgMV0udmNuIC0gZHN0W21hZ2ljXS52Y247CisKKwkvKiBXcml0aW5nIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCB0aGVyZSdzIGEgZGlzY29udGludWl0eS4gKi8KKwlpZiAoZGlzYykgeworCQlpZiAoaG9sZSkKKwkJCWRzdFtsb2MgLSAxXS5sZW5ndGggPSBkc3RbbG9jXS52Y24gLSBkc3RbbG9jIC0gMV0udmNuOworCQllbHNlIHsKKwkJCWlmIChsb2MgPiAwKSB7CisJCQkJZHN0W2xvY10udmNuID0gZHN0W2xvYyAtIDFdLnZjbiArCisJCQkJCQlkc3RbbG9jIC0gMV0ubGVuZ3RoOworCQkJCWRzdFtsb2NdLmxlbmd0aCA9IGRzdFtsb2MgKyAxXS52Y24gLQorCQkJCQkJZHN0W2xvY10udmNuOworCQkJfSBlbHNlIHsKKwkJCQlkc3RbbG9jXS52Y24gPSAwOworCQkJCWRzdFtsb2NdLmxlbmd0aCA9IGRzdFtsb2MgKyAxXS52Y247CisJCQl9CisJCQlkc3RbbG9jXS5sY24gPSBMQ05fUkxfTk9UX01BUFBFRDsKKwkJfQorCisJCW1hZ2ljICs9IGhvbGU7CisKKwkJaWYgKGRzdFttYWdpY10ubGNuID09IExDTl9FTk9FTlQpCisJCQlkc3RbbWFnaWNdLnZjbiA9IGRzdFttYWdpYyAtIDFdLnZjbiArCisJCQkJCWRzdFttYWdpYyAtIDFdLmxlbmd0aDsKKwl9CisJcmV0dXJuIGRzdDsKK30KKworLyoqCisgKiBudGZzX3JsX3JlcGxhY2UgLSBvdmVyd3JpdGUgYSBydW5saXN0IGVsZW1lbnQgd2l0aCBhbm90aGVyIHJ1bmxpc3QKKyAqIEBkc3Q6CW9yaWdpbmFsIHJ1bmxpc3QgdG8gYmUgd29ya2VkIG9uCisgKiBAZHNpemU6CW51bWJlciBvZiBlbGVtZW50cyBpbiBAZHN0IChpbmNsdWRpbmcgZW5kIG1hcmtlcikKKyAqIEBzcmM6CW5ldyBydW5saXN0IHRvIGJlIGluc2VydGVkCisgKiBAc3NpemU6CW51bWJlciBvZiBlbGVtZW50cyBpbiBAc3JjIChleGNsdWRpbmcgZW5kIG1hcmtlcikKKyAqIEBsb2M6CWluZGV4IGluIHJ1bmxpc3QgQGRzdCB0byBvdmVyd3JpdGUgd2l0aCBAc3JjCisgKgorICogUmVwbGFjZSB0aGUgcnVubGlzdCBlbGVtZW50IEBkc3QgYXQgQGxvYyB3aXRoIEBzcmMuIE1lcmdlIHRoZSBsZWZ0IGFuZAorICogcmlnaHQgZW5kcyBvZiB0aGUgaW5zZXJ0ZWQgcnVubGlzdCwgaWYgbmVjZXNzYXJ5LgorICoKKyAqIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gc2VyaWFsaXplIGFjY2VzcyB0byB0aGUgcnVubGlzdHMgQGRzdCBhbmQgQHNyYy4KKyAqCisgKiBPbiBzdWNjZXNzLCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBuZXcsIGNvbWJpbmVkLCBydW5saXN0LiBOb3RlLCBib3RoCisgKiBydW5saXN0cyBAZHN0IGFuZCBAc3JjIGFyZSBkZWFsbG9jYXRlZCBiZWZvcmUgcmV0dXJuaW5nIHNvIHlvdSBjYW5ub3QgdXNlCisgKiB0aGUgcG9pbnRlcnMgZm9yIGFueXRoaW5nIGFueSBtb3JlLiAoU3RyaWN0bHkgc3BlYWtpbmcgdGhlIHJldHVybmVkIHJ1bmxpc3QKKyAqIG1heSBiZSB0aGUgc2FtZSBhcyBAZHN0IGJ1dCB0aGlzIGlzIGlycmVsZXZhbnQuKQorICoKKyAqIE9uIGVycm9yLCByZXR1cm4gLWVycm5vLiBCb3RoIHJ1bmxpc3RzIGFyZSBsZWZ0IHVubW9kaWZpZWQuIFRoZSBmb2xsb3dpbmcKKyAqIGVycm9yIGNvZGVzIGFyZSBkZWZpbmVkOgorICoJLUVOT01FTQktIE5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHJ1bmxpc3QgYXJyYXkuCisgKgktRUlOVkFMCS0gSW52YWxpZCBwYXJhbWV0ZXJzIHdlcmUgcGFzc2VkIGluLgorICovCitzdGF0aWMgaW5saW5lIHJ1bmxpc3RfZWxlbWVudCAqbnRmc19ybF9yZXBsYWNlKHJ1bmxpc3RfZWxlbWVudCAqZHN0LAorCQlpbnQgZHNpemUsIHJ1bmxpc3RfZWxlbWVudCAqc3JjLCBpbnQgc3NpemUsIGludCBsb2MpCit7CisJQk9PTCBsZWZ0ID0gRkFMU0U7CisJQk9PTCByaWdodDsKKwlpbnQgbWFnaWM7CisKKwlCVUdfT04oIWRzdCk7CisJQlVHX09OKCFzcmMpOworCisJLyogRmlyc3QsIG1lcmdlIHRoZSBsZWZ0IGFuZCByaWdodCBlbmRzLCBpZiBuZWNlc3NhcnkuICovCisJcmlnaHQgPSBudGZzX2FyZV9ybF9tZXJnZWFibGUoc3JjICsgc3NpemUgLSAxLCBkc3QgKyBsb2MgKyAxKTsKKwlpZiAobG9jID4gMCkKKwkJbGVmdCA9IG50ZnNfYXJlX3JsX21lcmdlYWJsZShkc3QgKyBsb2MgLSAxLCBzcmMpOworCisJLyogQWxsb2NhdGUgc29tZSBzcGFjZS4gV2UnbGwgbmVlZCBsZXNzIGlmIHRoZSBsZWZ0LCByaWdodCwgb3IgYm90aAorCSAqIGVuZHMgd2VyZSBtZXJnZWQuICovCisJZHN0ID0gbnRmc19ybF9yZWFsbG9jKGRzdCwgZHNpemUsIGRzaXplICsgc3NpemUgLSBsZWZ0IC0gcmlnaHQpOworCWlmIChJU19FUlIoZHN0KSkKKwkJcmV0dXJuIGRzdDsKKwkvKgorCSAqIFdlIGFyZSBndWFyYW50ZWVkIHRvIHN1Y2NlZWQgZnJvbSBoZXJlIHNvIGNhbiBzdGFydCBtb2RpZnlpbmcgdGhlCisJICogb3JpZ2luYWwgcnVubGlzdHMuCisJICovCisJaWYgKHJpZ2h0KQorCQlfX250ZnNfcmxfbWVyZ2Uoc3JjICsgc3NpemUgLSAxLCBkc3QgKyBsb2MgKyAxKTsKKwlpZiAobGVmdCkKKwkJX19udGZzX3JsX21lcmdlKGRzdCArIGxvYyAtIDEsIHNyYyk7CisKKwkvKiBGSVhNRTogV2hhdCBkb2VzIHRoaXMgbWVhbj8gKEFJQSkgKi8KKwltYWdpYyA9IGxvYyArIHNzaXplIC0gbGVmdDsKKworCS8qIE1vdmUgdGhlIHRhaWwgb2YgQGRzdCBvdXQgb2YgdGhlIHdheSwgdGhlbiBjb3B5IGluIEBzcmMuICovCisJbnRmc19ybF9tbShkc3QsIG1hZ2ljLCBsb2MgKyByaWdodCArIDEsIGRzaXplIC0gbG9jIC0gcmlnaHQgLSAxKTsKKwludGZzX3JsX21jKGRzdCwgbG9jLCBzcmMsIGxlZnQsIHNzaXplIC0gbGVmdCk7CisKKwkvKiBXZSBtYXkgaGF2ZSBjaGFuZ2VkIHRoZSBsZW5ndGggb2YgdGhlIGZpbGUsIHNvIGZpeCB0aGUgZW5kIG1hcmtlciAqLworCWlmIChkc3RbbWFnaWNdLmxjbiA9PSBMQ05fRU5PRU5UKQorCQlkc3RbbWFnaWNdLnZjbiA9IGRzdFttYWdpYyAtIDFdLnZjbiArIGRzdFttYWdpYyAtIDFdLmxlbmd0aDsKKwlyZXR1cm4gZHN0OworfQorCisvKioKKyAqIG50ZnNfcmxfc3BsaXQgLSBpbnNlcnQgYSBydW5saXN0IGludG8gdGhlIGNlbnRyZSBvZiBhIGhvbGUKKyAqIEBkc3Q6CW9yaWdpbmFsIHJ1bmxpc3QgdG8gYmUgd29ya2VkIG9uCisgKiBAZHNpemU6CW51bWJlciBvZiBlbGVtZW50cyBpbiBAZHN0IChpbmNsdWRpbmcgZW5kIG1hcmtlcikKKyAqIEBzcmM6CW5ldyBydW5saXN0IHRvIGJlIGluc2VydGVkCisgKiBAc3NpemU6CW51bWJlciBvZiBlbGVtZW50cyBpbiBAc3JjIChleGNsdWRpbmcgZW5kIG1hcmtlcikKKyAqIEBsb2M6CWluZGV4IGluIHJ1bmxpc3QgQGRzdCBhdCB3aGljaCB0byBzcGxpdCBhbmQgaW5zZXJ0IEBzcmMKKyAqCisgKiBTcGxpdCB0aGUgcnVubGlzdCBAZHN0IGF0IEBsb2MgaW50byB0d28gYW5kIGluc2VydCBAbmV3IGluIGJldHdlZW4gdGhlIHR3bworICogZnJhZ21lbnRzLiBObyBtZXJnaW5nIG9mIHJ1bmxpc3RzIGlzIG5lY2Vzc2FyeS4gQWRqdXN0IHRoZSBzaXplIG9mIHRoZQorICogaG9sZXMgZWl0aGVyIHNpZGUuCisgKgorICogSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBzZXJpYWxpemUgYWNjZXNzIHRvIHRoZSBydW5saXN0cyBAZHN0IGFuZCBAc3JjLgorICoKKyAqIE9uIHN1Y2Nlc3MsIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG5ldywgY29tYmluZWQsIHJ1bmxpc3QuIE5vdGUsIGJvdGgKKyAqIHJ1bmxpc3RzIEBkc3QgYW5kIEBzcmMgYXJlIGRlYWxsb2NhdGVkIGJlZm9yZSByZXR1cm5pbmcgc28geW91IGNhbm5vdCB1c2UKKyAqIHRoZSBwb2ludGVycyBmb3IgYW55dGhpbmcgYW55IG1vcmUuIChTdHJpY3RseSBzcGVha2luZyB0aGUgcmV0dXJuZWQgcnVubGlzdAorICogbWF5IGJlIHRoZSBzYW1lIGFzIEBkc3QgYnV0IHRoaXMgaXMgaXJyZWxldmFudC4pCisgKgorICogT24gZXJyb3IsIHJldHVybiAtZXJybm8uIEJvdGggcnVubGlzdHMgYXJlIGxlZnQgdW5tb2RpZmllZC4gVGhlIGZvbGxvd2luZworICogZXJyb3IgY29kZXMgYXJlIGRlZmluZWQ6CisgKgktRU5PTUVNCS0gTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgcnVubGlzdCBhcnJheS4KKyAqCS1FSU5WQUwJLSBJbnZhbGlkIHBhcmFtZXRlcnMgd2VyZSBwYXNzZWQgaW4uCisgKi8KK3N0YXRpYyBpbmxpbmUgcnVubGlzdF9lbGVtZW50ICpudGZzX3JsX3NwbGl0KHJ1bmxpc3RfZWxlbWVudCAqZHN0LCBpbnQgZHNpemUsCisJCXJ1bmxpc3RfZWxlbWVudCAqc3JjLCBpbnQgc3NpemUsIGludCBsb2MpCit7CisJQlVHX09OKCFkc3QpOworCUJVR19PTighc3JjKTsKKworCS8qIFNwYWNlIHJlcXVpcmVkOiBAZHN0IHNpemUgKyBAc3JjIHNpemUgKyBvbmUgbmV3IGhvbGUuICovCisJZHN0ID0gbnRmc19ybF9yZWFsbG9jKGRzdCwgZHNpemUsIGRzaXplICsgc3NpemUgKyAxKTsKKwlpZiAoSVNfRVJSKGRzdCkpCisJCXJldHVybiBkc3Q7CisJLyoKKwkgKiBXZSBhcmUgZ3VhcmFudGVlZCB0byBzdWNjZWVkIGZyb20gaGVyZSBzbyBjYW4gc3RhcnQgbW9kaWZ5aW5nIHRoZQorCSAqIG9yaWdpbmFsIHJ1bmxpc3RzLgorCSAqLworCisJLyogTW92ZSB0aGUgdGFpbCBvZiBAZHN0IG91dCBvZiB0aGUgd2F5LCB0aGVuIGNvcHkgaW4gQHNyYy4gKi8KKwludGZzX3JsX21tKGRzdCwgbG9jICsgMSArIHNzaXplLCBsb2MsIGRzaXplIC0gbG9jKTsKKwludGZzX3JsX21jKGRzdCwgbG9jICsgMSwgc3JjLCAwLCBzc2l6ZSk7CisKKwkvKiBBZGp1c3QgdGhlIHNpemUgb2YgdGhlIGhvbGVzIGVpdGhlciBzaXplIG9mIEBzcmMuICovCisJZHN0W2xvY10ubGVuZ3RoCQk9IGRzdFtsb2MrMV0udmNuICAgICAgIC0gZHN0W2xvY10udmNuOworCWRzdFtsb2Mrc3NpemUrMV0udmNuICAgID0gZHN0W2xvYytzc2l6ZV0udmNuICAgKyBkc3RbbG9jK3NzaXplXS5sZW5ndGg7CisJZHN0W2xvYytzc2l6ZSsxXS5sZW5ndGggPSBkc3RbbG9jK3NzaXplKzJdLnZjbiAtIGRzdFtsb2Mrc3NpemUrMV0udmNuOworCisJcmV0dXJuIGRzdDsKK30KKworLyoqCisgKiBudGZzX3J1bmxpc3RzX21lcmdlIC0gbWVyZ2UgdHdvIHJ1bmxpc3RzIGludG8gb25lCisgKiBAZHJsOglvcmlnaW5hbCBydW5saXN0IHRvIGJlIHdvcmtlZCBvbgorICogQHNybDoJbmV3IHJ1bmxpc3QgdG8gYmUgbWVyZ2VkIGludG8gQGRybAorICoKKyAqIEZpcnN0IHdlIHNhbml0eSBjaGVjayB0aGUgdHdvIHJ1bmxpc3RzIEBzcmwgYW5kIEBkcmwgdG8gbWFrZSBzdXJlIHRoYXQgdGhleQorICogYXJlIHNlbnNpYmxlIGFuZCBjYW4gYmUgbWVyZ2VkLiBUaGUgcnVubGlzdCBAc3JsIG11c3QgYmUgZWl0aGVyIGFmdGVyIHRoZQorICogcnVubGlzdCBAZHJsIG9yIGNvbXBsZXRlbHkgd2l0aGluIGEgaG9sZSAob3IgdW5tYXBwZWQgcmVnaW9uKSBpbiBAZHJsLgorICoKKyAqIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gc2VyaWFsaXplIGFjY2VzcyB0byB0aGUgcnVubGlzdHMgQGRybCBhbmQgQHNybC4KKyAqCisgKiBNZXJnaW5nIG9mIHJ1bmxpc3RzIGlzIG5lY2Vzc2FyeSBpbiB0d28gY2FzZXM6CisgKiAgIDEuIFdoZW4gYXR0cmlidXRlIGxpc3RzIGFyZSB1c2VkIGFuZCBhIGZ1cnRoZXIgZXh0ZW50IGlzIGJlaW5nIG1hcHBlZC4KKyAqICAgMi4gV2hlbiBuZXcgY2x1c3RlcnMgYXJlIGFsbG9jYXRlZCB0byBmaWxsIGEgaG9sZSBvciBleHRlbmQgYSBmaWxlLgorICoKKyAqIFRoZXJlIGFyZSBmb3VyIHBvc3NpYmxlIHdheXMgQHNybCBjYW4gYmUgbWVyZ2VkLiBJdCBjYW46CisgKgktIGJlIGluc2VydGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBob2xlLAorICoJLSBzcGxpdCB0aGUgaG9sZSBpbiB0d28gYW5kIGJlIGluc2VydGVkIGJldHdlZW4gdGhlIHR3byBmcmFnbWVudHMsCisgKgktIGJlIGFwcGVuZGVkIGF0IHRoZSBlbmQgb2YgYSBob2xlLCBvciBpdCBjYW4KKyAqCS0gcmVwbGFjZSB0aGUgd2hvbGUgaG9sZS4KKyAqIEl0IGNhbiBhbHNvIGJlIGFwcGVuZGVkIHRvIHRoZSBlbmQgb2YgdGhlIHJ1bmxpc3QsIHdoaWNoIGlzIGp1c3QgYSB2YXJpYW50CisgKiBvZiB0aGUgaW5zZXJ0IGNhc2UuCisgKgorICogT24gc3VjY2VzcywgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgbmV3LCBjb21iaW5lZCwgcnVubGlzdC4gTm90ZSwgYm90aAorICogcnVubGlzdHMgQGRybCBhbmQgQHNybCBhcmUgZGVhbGxvY2F0ZWQgYmVmb3JlIHJldHVybmluZyBzbyB5b3UgY2Fubm90IHVzZQorICogdGhlIHBvaW50ZXJzIGZvciBhbnl0aGluZyBhbnkgbW9yZS4gKFN0cmljdGx5IHNwZWFraW5nIHRoZSByZXR1cm5lZCBydW5saXN0CisgKiBtYXkgYmUgdGhlIHNhbWUgYXMgQGRzdCBidXQgdGhpcyBpcyBpcnJlbGV2YW50LikKKyAqCisgKiBPbiBlcnJvciwgcmV0dXJuIC1lcnJuby4gQm90aCBydW5saXN0cyBhcmUgbGVmdCB1bm1vZGlmaWVkLiBUaGUgZm9sbG93aW5nCisgKiBlcnJvciBjb2RlcyBhcmUgZGVmaW5lZDoKKyAqCS1FTk9NRU0JLSBOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSBydW5saXN0IGFycmF5LgorICoJLUVJTlZBTAktIEludmFsaWQgcGFyYW1ldGVycyB3ZXJlIHBhc3NlZCBpbi4KKyAqCS1FUkFOR0UJLSBUaGUgcnVubGlzdHMgb3ZlcmxhcCBhbmQgY2Fubm90IGJlIG1lcmdlZC4KKyAqLworcnVubGlzdF9lbGVtZW50ICpudGZzX3J1bmxpc3RzX21lcmdlKHJ1bmxpc3RfZWxlbWVudCAqZHJsLAorCQlydW5saXN0X2VsZW1lbnQgKnNybCkKK3sKKwlpbnQgZGksIHNpOwkJLyogQ3VycmVudCBpbmRleCBpbnRvIEBbZHNdcmwuICovCisJaW50IHNzdGFydDsJCS8qIEZpcnN0IGluZGV4IHdpdGggbGNuID4gTENOX1JMX05PVF9NQVBQRUQuICovCisJaW50IGRpbnM7CQkvKiBJbmRleCBpbnRvIEBkcmwgYXQgd2hpY2ggdG8gaW5zZXJ0IEBzcmwuICovCisJaW50IGRlbmQsIHNlbmQ7CQkvKiBMYXN0IGluZGV4IGludG8gQFtkc11ybC4gKi8KKwlpbnQgZGZpbmFsLCBzZmluYWw7CS8qIFRoZSBsYXN0IGluZGV4IGludG8gQFtkc11ybCB3aXRoCisJCQkJICAgbGNuID49IExDTl9IT0xFLiAqLworCWludCBtYXJrZXIgPSAwOworCVZDTiBtYXJrZXJfdmNuID0gMDsKKworI2lmZGVmIERFQlVHCisJbnRmc19kZWJ1ZygiZHN0OiIpOworCW50ZnNfZGVidWdfZHVtcF9ydW5saXN0KGRybCk7CisJbnRmc19kZWJ1Zygic3JjOiIpOworCW50ZnNfZGVidWdfZHVtcF9ydW5saXN0KHNybCk7CisjZW5kaWYKKworCS8qIENoZWNrIGZvciBzaWxseSBjYWxsaW5nLi4uICovCisJaWYgKHVubGlrZWx5KCFzcmwpKQorCQlyZXR1cm4gZHJsOworCWlmIChJU19FUlIoc3JsKSB8fCBJU19FUlIoZHJsKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwkvKiBDaGVjayBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIGZpcnN0IG1hcHBpbmcgaXMgYmVpbmcgZG9uZSBub3cuICovCisJaWYgKHVubGlrZWx5KCFkcmwpKSB7CisJCWRybCA9IHNybDsKKwkJLyogQ29tcGxldGUgdGhlIHNvdXJjZSBydW5saXN0IGlmIG5lY2Vzc2FyeS4gKi8KKwkJaWYgKHVubGlrZWx5KGRybFswXS52Y24pKSB7CisJCQkvKiBTY2FuIHRvIHRoZSBlbmQgb2YgdGhlIHNvdXJjZSBydW5saXN0LiAqLworCQkJZm9yIChkZW5kID0gMDsgbGlrZWx5KGRybFtkZW5kXS5sZW5ndGgpOyBkZW5kKyspCisJCQkJOworCQkJZHJsID0gbnRmc19ybF9yZWFsbG9jKGRybCwgZGVuZCwgZGVuZCArIDEpOworCQkJaWYgKElTX0VSUihkcmwpKQorCQkJCXJldHVybiBkcmw7CisJCQkvKiBJbnNlcnQgc3RhcnQgZWxlbWVudCBhdCB0aGUgZnJvbnQgb2YgdGhlIHJ1bmxpc3QuICovCisJCQludGZzX3JsX21tKGRybCwgMSwgMCwgZGVuZCk7CisJCQlkcmxbMF0udmNuID0gMDsKKwkJCWRybFswXS5sY24gPSBMQ05fUkxfTk9UX01BUFBFRDsKKwkJCWRybFswXS5sZW5ndGggPSBkcmxbMV0udmNuOworCQl9CisJCWdvdG8gZmluaXNoZWQ7CisJfQorCisJc2kgPSBkaSA9IDA7CisKKwkvKiBTa2lwIGFueSB1bm1hcHBlZCBzdGFydCBlbGVtZW50KHMpIGluIHRoZSBzb3VyY2UgcnVubGlzdC4gKi8KKwl3aGlsZSAoc3JsW3NpXS5sZW5ndGggJiYgc3JsW3NpXS5sY24gPCBMQ05fSE9MRSkKKwkJc2krKzsKKworCS8qIENhbid0IGhhdmUgYW4gZW50aXJlbHkgdW5tYXBwZWQgc291cmNlIHJ1bmxpc3QuICovCisJQlVHX09OKCFzcmxbc2ldLmxlbmd0aCk7CisKKwkvKiBSZWNvcmQgdGhlIHN0YXJ0aW5nIHBvaW50cy4gKi8KKwlzc3RhcnQgPSBzaTsKKworCS8qCisJICogU2tpcCBmb3J3YXJkIGluIEBkcmwgdW50aWwgd2UgcmVhY2ggdGhlIHBvc2l0aW9uIHdoZXJlIEBzcmwgbmVlZHMgdG8KKwkgKiBiZSBpbnNlcnRlZC4gSWYgd2UgcmVhY2ggdGhlIGVuZCBvZiBAZHJsLCBAc3JsIGp1c3QgbmVlZHMgdG8gYmUKKwkgKiBhcHBlbmRlZCB0byBAZHJsLgorCSAqLworCWZvciAoOyBkcmxbZGldLmxlbmd0aDsgZGkrKykgeworCQlpZiAoZHJsW2RpXS52Y24gKyBkcmxbZGldLmxlbmd0aCA+IHNybFtzc3RhcnRdLnZjbikKKwkJCWJyZWFrOworCX0KKwlkaW5zID0gZGk7CisKKwkvKiBTYW5pdHkgY2hlY2sgZm9yIGlsbGVnYWwgb3ZlcmxhcHMuICovCisJaWYgKChkcmxbZGldLnZjbiA9PSBzcmxbc2ldLnZjbikgJiYgKGRybFtkaV0ubGNuID49IDApICYmCisJCQkoc3JsW3NpXS5sY24gPj0gMCkpIHsKKwkJbnRmc19lcnJvcihOVUxMLCAiUnVuIGxpc3RzIG92ZXJsYXAuIENhbm5vdCBtZXJnZSEiKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVSQU5HRSk7CisJfQorCisJLyogU2NhbiB0byB0aGUgZW5kIG9mIGJvdGggcnVubGlzdHMgaW4gb3JkZXIgdG8ga25vdyB0aGVpciBzaXplcy4gKi8KKwlmb3IgKHNlbmQgPSBzaTsgc3JsW3NlbmRdLmxlbmd0aDsgc2VuZCsrKQorCQk7CisJZm9yIChkZW5kID0gZGk7IGRybFtkZW5kXS5sZW5ndGg7IGRlbmQrKykKKwkJOworCisJaWYgKHNybFtzZW5kXS5sY24gPT0gTENOX0VOT0VOVCkKKwkJbWFya2VyX3ZjbiA9IHNybFttYXJrZXIgPSBzZW5kXS52Y247CisKKwkvKiBTY2FuIHRvIHRoZSBsYXN0IGVsZW1lbnQgd2l0aCBsY24gPj0gTENOX0hPTEUuICovCisJZm9yIChzZmluYWwgPSBzZW5kOyBzZmluYWwgPj0gMCAmJiBzcmxbc2ZpbmFsXS5sY24gPCBMQ05fSE9MRTsgc2ZpbmFsLS0pCisJCTsKKwlmb3IgKGRmaW5hbCA9IGRlbmQ7IGRmaW5hbCA+PSAwICYmIGRybFtkZmluYWxdLmxjbiA8IExDTl9IT0xFOyBkZmluYWwtLSkKKwkJOworCisJeworCUJPT0wgc3RhcnQ7CisJQk9PTCBmaW5pc2g7CisJaW50IGRzID0gZGVuZCArIDE7CQkvKiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gZHJsICYgc3JsICovCisJaW50IHNzID0gc2ZpbmFsIC0gc3N0YXJ0ICsgMTsKKworCXN0YXJ0ICA9ICgoZHJsW2RpbnNdLmxjbiA8ICBMQ05fUkxfTk9UX01BUFBFRCkgfHwgICAgLyogRW5kIG9mIGZpbGUgICAqLworCQkgIChkcmxbZGluc10udmNuID09IHNybFtzc3RhcnRdLnZjbikpOwkgICAgIC8qIFN0YXJ0IG9mIGhvbGUgKi8KKwlmaW5pc2ggPSAoKGRybFtkaW5zXS5sY24gPj0gTENOX1JMX05PVF9NQVBQRUQpICYmICAgIC8qIEVuZCBvZiBmaWxlICAgKi8KKwkJICgoZHJsW2RpbnNdLnZjbiArIGRybFtkaW5zXS5sZW5ndGgpIDw9ICAgICAgLyogRW5kIG9mIGhvbGUgICAqLworCQkgIChzcmxbc2VuZCAtIDFdLnZjbiArIHNybFtzZW5kIC0gMV0ubGVuZ3RoKSkpOworCisJLyogT3Igd2UnbGwgbG9zZSBhbiBlbmQgbWFya2VyICovCisJaWYgKHN0YXJ0ICYmIGZpbmlzaCAmJiAoZHJsW2RpbnNdLmxlbmd0aCA9PSAwKSkKKwkJc3MrKzsKKwlpZiAobWFya2VyICYmIChkcmxbZGluc10udmNuICsgZHJsW2RpbnNdLmxlbmd0aCA+IHNybFtzZW5kIC0gMV0udmNuKSkKKwkJZmluaXNoID0gRkFMU0U7CisjaWYgMAorCW50ZnNfZGVidWcoImRmaW5hbCA9ICVpLCBkZW5kID0gJWkiLCBkZmluYWwsIGRlbmQpOworCW50ZnNfZGVidWcoInNzdGFydCA9ICVpLCBzZmluYWwgPSAlaSwgc2VuZCA9ICVpIiwgc3N0YXJ0LCBzZmluYWwsIHNlbmQpOworCW50ZnNfZGVidWcoInN0YXJ0ID0gJWksIGZpbmlzaCA9ICVpIiwgc3RhcnQsIGZpbmlzaCk7CisJbnRmc19kZWJ1ZygiZHMgPSAlaSwgc3MgPSAlaSwgZGlucyA9ICVpIiwgZHMsIHNzLCBkaW5zKTsKKyNlbmRpZgorCWlmIChzdGFydCkgeworCQlpZiAoZmluaXNoKQorCQkJZHJsID0gbnRmc19ybF9yZXBsYWNlKGRybCwgZHMsIHNybCArIHNzdGFydCwgc3MsIGRpbnMpOworCQllbHNlCisJCQlkcmwgPSBudGZzX3JsX2luc2VydChkcmwsIGRzLCBzcmwgKyBzc3RhcnQsIHNzLCBkaW5zKTsKKwl9IGVsc2UgeworCQlpZiAoZmluaXNoKQorCQkJZHJsID0gbnRmc19ybF9hcHBlbmQoZHJsLCBkcywgc3JsICsgc3N0YXJ0LCBzcywgZGlucyk7CisJCWVsc2UKKwkJCWRybCA9IG50ZnNfcmxfc3BsaXQoZHJsLCBkcywgc3JsICsgc3N0YXJ0LCBzcywgZGlucyk7CisJfQorCWlmIChJU19FUlIoZHJsKSkgeworCQludGZzX2Vycm9yKE5VTEwsICJNZXJnZSBmYWlsZWQuIik7CisJCXJldHVybiBkcmw7CisJfQorCW50ZnNfZnJlZShzcmwpOworCWlmIChtYXJrZXIpIHsKKwkJbnRmc19kZWJ1ZygiVHJpZ2dlcmluZyBtYXJrZXIgY29kZS4iKTsKKwkJZm9yIChkcyA9IGRlbmQ7IGRybFtkc10ubGVuZ3RoOyBkcysrKQorCQkJOworCQkvKiBXZSBvbmx5IG5lZWQgdG8gY2FyZSBpZiBAc3JsIGVuZGVkIGFmdGVyIEBkcmwuICovCisJCWlmIChkcmxbZHNdLnZjbiA8PSBtYXJrZXJfdmNuKSB7CisJCQlpbnQgc2xvdHMgPSAwOworCisJCQlpZiAoZHJsW2RzXS52Y24gPT0gbWFya2VyX3ZjbikgeworCQkJCW50ZnNfZGVidWcoIk9sZCBtYXJrZXIgPSAweCVsbHgsIHJlcGxhY2luZyAiCisJCQkJCQkid2l0aCBMQ05fRU5PRU5ULiIsCisJCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCQkJZHJsW2RzXS5sY24pOworCQkJCWRybFtkc10ubGNuID0gTENOX0VOT0VOVDsKKwkJCQlnb3RvIGZpbmlzaGVkOworCQkJfQorCQkJLyoKKwkJCSAqIFdlIG5lZWQgdG8gY3JlYXRlIGFuIHVubWFwcGVkIHJ1bmxpc3QgZWxlbWVudCBpbgorCQkJICogQGRybCBvciBleHRlbmQgYW4gZXhpc3Rpbmcgb25lIGJlZm9yZSBhZGRpbmcgdGhlCisJCQkgKiBFTk9FTlQgdGVybWluYXRvci4KKwkJCSAqLworCQkJaWYgKGRybFtkc10ubGNuID09IExDTl9FTk9FTlQpIHsKKwkJCQlkcy0tOworCQkJCXNsb3RzID0gMTsKKwkJCX0KKwkJCWlmIChkcmxbZHNdLmxjbiAhPSBMQ05fUkxfTk9UX01BUFBFRCkgeworCQkJCS8qIEFkZCBhbiB1bm1hcHBlZCBydW5saXN0IGVsZW1lbnQuICovCisJCQkJaWYgKCFzbG90cykgeworCQkJCQkvKiBGSVhNRS9UT0RPOiBXZSBuZWVkIHRvIGhhdmUgdGhlCisJCQkJCSAqIGV4dHJhIG1lbW9yeSBhbHJlYWR5ISAoQUlBKSAqLworCQkJCQlkcmwgPSBudGZzX3JsX3JlYWxsb2MoZHJsLCBkcywgZHMgKyAyKTsKKwkJCQkJaWYgKCFkcmwpCisJCQkJCQlnb3RvIGNyaXRpY2FsX2Vycm9yOworCQkJCQlzbG90cyA9IDI7CisJCQkJfQorCQkJCWRzKys7CisJCQkJLyogTmVlZCB0byBzZXQgdmNuIGlmIGl0IGlzbid0IHNldCBhbHJlYWR5LiAqLworCQkJCWlmIChzbG90cyAhPSAxKQorCQkJCQlkcmxbZHNdLnZjbiA9IGRybFtkcyAtIDFdLnZjbiArCisJCQkJCQkJZHJsW2RzIC0gMV0ubGVuZ3RoOworCQkJCWRybFtkc10ubGNuID0gTENOX1JMX05PVF9NQVBQRUQ7CisJCQkJLyogV2Ugbm93IHVzZWQgdXAgYSBzbG90LiAqLworCQkJCXNsb3RzLS07CisJCQl9CisJCQlkcmxbZHNdLmxlbmd0aCA9IG1hcmtlcl92Y24gLSBkcmxbZHNdLnZjbjsKKwkJCS8qIEZpbmFsbHkgYWRkIHRoZSBFTk9FTlQgdGVybWluYXRvci4gKi8KKwkJCWRzKys7CisJCQlpZiAoIXNsb3RzKSB7CisJCQkJLyogRklYTUUvVE9ETzogV2UgbmVlZCB0byBoYXZlIHRoZSBleHRyYQorCQkJCSAqIG1lbW9yeSBhbHJlYWR5ISAoQUlBKSAqLworCQkJCWRybCA9IG50ZnNfcmxfcmVhbGxvYyhkcmwsIGRzLCBkcyArIDEpOworCQkJCWlmICghZHJsKQorCQkJCQlnb3RvIGNyaXRpY2FsX2Vycm9yOworCQkJfQorCQkJZHJsW2RzXS52Y24gPSBtYXJrZXJfdmNuOworCQkJZHJsW2RzXS5sY24gPSBMQ05fRU5PRU5UOworCQkJZHJsW2RzXS5sZW5ndGggPSAoczY0KTA7CisJCX0KKwl9CisJfQorCitmaW5pc2hlZDoKKwkvKiBUaGUgbWVyZ2Ugd2FzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuICovCisJbnRmc19kZWJ1ZygiTWVyZ2VkIHJ1bmxpc3Q6Iik7CisJbnRmc19kZWJ1Z19kdW1wX3J1bmxpc3QoZHJsKTsKKwlyZXR1cm4gZHJsOworCitjcml0aWNhbF9lcnJvcjoKKwkvKiBDcml0aWNhbCBlcnJvciEgV2UgY2Fubm90IGFmZm9yZCB0byBmYWlsIGhlcmUuICovCisJbnRmc19lcnJvcihOVUxMLCAiQ3JpdGljYWwgZXJyb3IhIE5vdCBlbm91Z2ggbWVtb3J5LiIpOworCXBhbmljKCJOVEZTOiBDYW5ub3QgY29udGludWUuIik7Cit9CisKKy8qKgorICogbnRmc19tYXBwaW5nX3BhaXJzX2RlY29tcHJlc3MgLSBjb252ZXJ0IG1hcHBpbmcgcGFpcnMgYXJyYXkgdG8gcnVubGlzdAorICogQHZvbDoJbnRmcyB2b2x1bWUgb24gd2hpY2ggdGhlIGF0dHJpYnV0ZSByZXNpZGVzCisgKiBAYXR0cjoJYXR0cmlidXRlIHJlY29yZCB3aG9zZSBtYXBwaW5nIHBhaXJzIGFycmF5IHRvIGRlY29tcHJlc3MKKyAqIEBvbGRfcmw6CW9wdGlvbmFsIHJ1bmxpc3QgaW4gd2hpY2ggdG8gaW5zZXJ0IEBhdHRyJ3MgcnVubGlzdAorICoKKyAqIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gc2VyaWFsaXplIGFjY2VzcyB0byB0aGUgcnVubGlzdCBAb2xkX3JsLgorICoKKyAqIERlY29tcHJlc3MgdGhlIGF0dHJpYnV0ZSBAYXR0cidzIG1hcHBpbmcgcGFpcnMgYXJyYXkgaW50byBhIHJ1bmxpc3QuIE9uCisgKiBzdWNjZXNzLCByZXR1cm4gdGhlIGRlY29tcHJlc3NlZCBydW5saXN0LgorICoKKyAqIElmIEBvbGRfcmwgaXMgbm90IE5VTEwsIGRlY29tcHJlc3NlZCBydW5saXN0IGlzIGluc2VydGVkIGludG8gdGhlCisgKiBhcHByb3ByaWF0ZSBwbGFjZSBpbiBAb2xkX3JsIGFuZCB0aGUgcmVzdWx0YW50LCBjb21iaW5lZCBydW5saXN0IGlzCisgKiByZXR1cm5lZC4gVGhlIG9yaWdpbmFsIEBvbGRfcmwgaXMgZGVhbGxvY2F0ZWQuCisgKgorICogT24gZXJyb3IsIHJldHVybiAtZXJybm8uIEBvbGRfcmwgaXMgbGVmdCB1bm1vZGlmaWVkIGluIHRoYXQgY2FzZS4KKyAqCisgKiBUaGUgZm9sbG93aW5nIGVycm9yIGNvZGVzIGFyZSBkZWZpbmVkOgorICoJLUVOT01FTQktIE5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHJ1bmxpc3QgYXJyYXkuCisgKgktRUlPCS0gQ29ycnVwdCBydW5saXN0LgorICoJLUVJTlZBTAktIEludmFsaWQgcGFyYW1ldGVycyB3ZXJlIHBhc3NlZCBpbi4KKyAqCS1FUkFOR0UJLSBUaGUgdHdvIHJ1bmxpc3RzIG92ZXJsYXAuCisgKgorICogRklYTUU6IEZvciBub3cgd2UgdGFrZSB0aGUgY29uY2VwdGlvbmFsbHkgc2ltcGxlc3QgYXBwcm9hY2ggb2YgY3JlYXRpbmcgdGhlCisgKiBuZXcgcnVubGlzdCBkaXNyZWdhcmRpbmcgdGhlIGFscmVhZHkgZXhpc3Rpbmcgb25lIGFuZCB0aGVuIHNwbGljaW5nIHRoZQorICogdHdvIGludG8gb25lLCBpZiB0aGF0IGlzIHBvc3NpYmxlICh3ZSBjaGVjayBmb3Igb3ZlcmxhcCBhbmQgZGlzY2FyZCB0aGUgbmV3CisgKiBydW5saXN0IGlmIG92ZXJsYXAgcHJlc2VudCBiZWZvcmUgcmV0dXJuaW5nIEVSUl9QVFIoLUVSQU5HRSkpLgorICovCitydW5saXN0X2VsZW1lbnQgKm50ZnNfbWFwcGluZ19wYWlyc19kZWNvbXByZXNzKGNvbnN0IG50ZnNfdm9sdW1lICp2b2wsCisJCWNvbnN0IEFUVFJfUkVDT1JEICphdHRyLCBydW5saXN0X2VsZW1lbnQgKm9sZF9ybCkKK3sKKwlWQ04gdmNuOwkJLyogQ3VycmVudCB2Y24uICovCisJTENOIGxjbjsJCS8qIEN1cnJlbnQgbGNuLiAqLworCXM2NCBkZWx0YXhjbjsJCS8qIENoYW5nZSBpbiBbdmxdY24uICovCisJcnVubGlzdF9lbGVtZW50ICpybDsJLyogVGhlIG91dHB1dCBydW5saXN0LiAqLworCXU4ICpidWY7CQkvKiBDdXJyZW50IHBvc2l0aW9uIGluIG1hcHBpbmcgcGFpcnMgYXJyYXkuICovCisJdTggKmF0dHJfZW5kOwkJLyogRW5kIG9mIGF0dHJpYnV0ZS4gKi8KKwlpbnQgcmxzaXplOwkJLyogU2l6ZSBvZiBydW5saXN0IGJ1ZmZlci4gKi8KKwl1MTYgcmxwb3M7CQkvKiBDdXJyZW50IHJ1bmxpc3QgcG9zaXRpb24gaW4gdW5pdHMgb2YKKwkJCQkgICBydW5saXN0X2VsZW1lbnRzLiAqLworCXU4IGI7CQkJLyogQ3VycmVudCBieXRlIG9mZnNldCBpbiBidWYuICovCisKKyNpZmRlZiBERUJVRworCS8qIE1ha2Ugc3VyZSBhdHRyIGV4aXN0cyBhbmQgaXMgbm9uLXJlc2lkZW50LiAqLworCWlmICghYXR0ciB8fCAhYXR0ci0+bm9uX3Jlc2lkZW50IHx8IHNsZTY0X3RvX2NwdSgKKwkJCWF0dHItPmRhdGEubm9uX3Jlc2lkZW50Lmxvd2VzdF92Y24pIDwgKFZDTikwKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkludmFsaWQgYXJndW1lbnRzLiIpOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisjZW5kaWYKKwkvKiBTdGFydCBhdCB2Y24gPSBsb3dlc3RfdmNuIGFuZCBsY24gMC4gKi8KKwl2Y24gPSBzbGU2NF90b19jcHUoYXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQubG93ZXN0X3Zjbik7CisJbGNuID0gMDsKKwkvKiBHZXQgc3RhcnQgb2YgdGhlIG1hcHBpbmcgcGFpcnMgYXJyYXkuICovCisJYnVmID0gKHU4KilhdHRyICsgbGUxNl90b19jcHUoCisJCQlhdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5tYXBwaW5nX3BhaXJzX29mZnNldCk7CisJYXR0cl9lbmQgPSAodTgqKWF0dHIgKyBsZTMyX3RvX2NwdShhdHRyLT5sZW5ndGgpOworCWlmICh1bmxpa2VseShidWYgPCAodTgqKWF0dHIgfHwgYnVmID4gYXR0cl9lbmQpKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkNvcnJ1cHQgYXR0cmlidXRlLiIpOworCQlyZXR1cm4gRVJSX1BUUigtRUlPKTsKKwl9CisJLyogQ3VycmVudCBwb3NpdGlvbiBpbiBydW5saXN0IGFycmF5LiAqLworCXJscG9zID0gMDsKKwkvKiBBbGxvY2F0ZSBmaXJzdCBwYWdlIGFuZCBzZXQgY3VycmVudCBydW5saXN0IHNpemUgdG8gb25lIHBhZ2UuICovCisJcmwgPSBudGZzX21hbGxvY19ub2ZzKHJsc2l6ZSA9IFBBR0VfU0laRSk7CisJaWYgKHVubGlrZWx5KCFybCkpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCS8qIEluc2VydCB1bm1hcHBlZCBzdGFydGluZyBlbGVtZW50IGlmIG5lY2Vzc2FyeS4gKi8KKwlpZiAodmNuKSB7CisJCXJsLT52Y24gPSAwOworCQlybC0+bGNuID0gTENOX1JMX05PVF9NQVBQRUQ7CisJCXJsLT5sZW5ndGggPSB2Y247CisJCXJscG9zKys7CisJfQorCXdoaWxlIChidWYgPCBhdHRyX2VuZCAmJiAqYnVmKSB7CisJCS8qCisJCSAqIEFsbG9jYXRlIG1vcmUgbWVtb3J5IGlmIG5lZWRlZCwgaW5jbHVkaW5nIHNwYWNlIGZvciB0aGUKKwkJICogbm90LW1hcHBlZCBhbmQgdGVybWluYXRvciBlbGVtZW50cy4gbnRmc19tYWxsb2Nfbm9mcygpCisJCSAqIG9wZXJhdGVzIG9uIHdob2xlIHBhZ2VzIG9ubHkuCisJCSAqLworCQlpZiAoKChybHBvcyArIDMpICogc2l6ZW9mKCpvbGRfcmwpKSA+IHJsc2l6ZSkgeworCQkJcnVubGlzdF9lbGVtZW50ICpybDI7CisKKwkJCXJsMiA9IG50ZnNfbWFsbG9jX25vZnMocmxzaXplICsgKGludClQQUdFX1NJWkUpOworCQkJaWYgKHVubGlrZWx5KCFybDIpKSB7CisJCQkJbnRmc19mcmVlKHJsKTsKKwkJCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwkJCX0KKwkJCW1lbWNweShybDIsIHJsLCBybHNpemUpOworCQkJbnRmc19mcmVlKHJsKTsKKwkJCXJsID0gcmwyOworCQkJcmxzaXplICs9IFBBR0VfU0laRTsKKwkJfQorCQkvKiBFbnRlciB0aGUgY3VycmVudCB2Y24gaW50byB0aGUgY3VycmVudCBydW5saXN0IGVsZW1lbnQuICovCisJCXJsW3JscG9zXS52Y24gPSB2Y247CisJCS8qCisJCSAqIEdldCB0aGUgY2hhbmdlIGluIHZjbiwgaS5lLiB0aGUgcnVuIGxlbmd0aCBpbiBjbHVzdGVycy4KKwkJICogRG9pbmcgaXQgdGhpcyB3YXkgZW5zdXJlcyB0aGF0IHdlIHNpZ25leHRlbmQgbmVnYXRpdmUgdmFsdWVzLgorCQkgKiBBIG5lZ2F0aXZlIHJ1biBsZW5ndGggZG9lc24ndCBtYWtlIGFueSBzZW5zZSwgYnV0IGhleSwgSQorCQkgKiBkaWRuJ3QgbWFrZSB1cCB0aGUgTlRGUyBzcGVjcyBhbmQgV2luZG93cyBOVDQgdHJlYXRzIHRoZSBydW4KKwkJICogbGVuZ3RoIGFzIGEgc2lnbmVkIHZhbHVlIHNvIHRoYXQncyBob3cgaXQgaXMuLi4KKwkJICovCisJCWIgPSAqYnVmICYgMHhmOworCQlpZiAoYikgeworCQkJaWYgKHVubGlrZWx5KGJ1ZiArIGIgPiBhdHRyX2VuZCkpCisJCQkJZ290byBpb19lcnJvcjsKKwkJCWZvciAoZGVsdGF4Y24gPSAoczgpYnVmW2ItLV07IGI7IGItLSkKKwkJCQlkZWx0YXhjbiA9IChkZWx0YXhjbiA8PCA4KSArIGJ1ZltiXTsKKwkJfSBlbHNlIHsgLyogVGhlIGxlbmd0aCBlbnRyeSBpcyBjb21wdWxzb3J5LiAqLworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiTWlzc2luZyBsZW5ndGggZW50cnkgaW4gbWFwcGluZyAiCisJCQkJCSJwYWlycyBhcnJheS4iKTsKKwkJCWRlbHRheGNuID0gKHM2NCktMTsKKwkJfQorCQkvKgorCQkgKiBBc3N1bWUgYSBuZWdhdGl2ZSBsZW5ndGggdG8gaW5kaWNhdGUgZGF0YSBjb3JydXB0aW9uIGFuZAorCQkgKiBoZW5jZSBjbGVhbi11cCBhbmQgcmV0dXJuIE5VTEwuCisJCSAqLworCQlpZiAodW5saWtlbHkoZGVsdGF4Y24gPCAwKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiSW52YWxpZCBsZW5ndGggaW4gbWFwcGluZyBwYWlycyAiCisJCQkJCSJhcnJheS4iKTsKKwkJCWdvdG8gZXJyX291dDsKKwkJfQorCQkvKgorCQkgKiBFbnRlciB0aGUgY3VycmVudCBydW4gbGVuZ3RoIGludG8gdGhlIGN1cnJlbnQgcnVubGlzdAorCQkgKiBlbGVtZW50LgorCQkgKi8KKwkJcmxbcmxwb3NdLmxlbmd0aCA9IGRlbHRheGNuOworCQkvKiBJbmNyZW1lbnQgdGhlIGN1cnJlbnQgdmNuIGJ5IHRoZSBjdXJyZW50IHJ1biBsZW5ndGguICovCisJCXZjbiArPSBkZWx0YXhjbjsKKwkJLyoKKwkJICogVGhlcmUgbWlnaHQgYmUgbm8gbGNuIGNoYW5nZSBhdCBhbGwsIGFzIGlzIHRoZSBjYXNlIGZvcgorCQkgKiBzcGFyc2UgY2x1c3RlcnMgb24gTlRGUyAzLjArLCBpbiB3aGljaCBjYXNlIHdlIHNldCB0aGUgbGNuCisJCSAqIHRvIExDTl9IT0xFLgorCQkgKi8KKwkJaWYgKCEoKmJ1ZiAmIDB4ZjApKQorCQkJcmxbcmxwb3NdLmxjbiA9IExDTl9IT0xFOworCQllbHNlIHsKKwkJCS8qIEdldCB0aGUgbGNuIGNoYW5nZSB3aGljaCByZWFsbHkgY2FuIGJlIG5lZ2F0aXZlLiAqLworCQkJdTggYjIgPSAqYnVmICYgMHhmOworCQkJYiA9IGIyICsgKCgqYnVmID4+IDQpICYgMHhmKTsKKwkJCWlmIChidWYgKyBiID4gYXR0cl9lbmQpCisJCQkJZ290byBpb19lcnJvcjsKKwkJCWZvciAoZGVsdGF4Y24gPSAoczgpYnVmW2ItLV07IGIgPiBiMjsgYi0tKQorCQkJCWRlbHRheGNuID0gKGRlbHRheGNuIDw8IDgpICsgYnVmW2JdOworCQkJLyogQ2hhbmdlIHRoZSBjdXJyZW50IGxjbiB0byBpdHMgbmV3IHZhbHVlLiAqLworCQkJbGNuICs9IGRlbHRheGNuOworI2lmZGVmIERFQlVHCisJCQkvKgorCQkJICogT24gTlRGUyAxLjItLCBhcHBhcmVudGx5IGNhbiBoYXZlIGxjbiA9PSAtMSB0bworCQkJICogaW5kaWNhdGUgYSBob2xlLiBCdXQgd2UgaGF2ZW4ndCB2ZXJpZmllZCBvdXJzZWx2ZXMKKwkJCSAqIHdoZXRoZXIgaXQgaXMgcmVhbGx5IHRoZSBsY24gb3IgdGhlIGRlbHRheGNuIHRoYXQgaXMKKwkJCSAqIC0xLiBTbyBpZiBlaXRoZXIgaXMgZm91bmQgZ2l2ZSB1cyBhIG1lc3NhZ2Ugc28gd2UKKwkJCSAqIGNhbiBpbnZlc3RpZ2F0ZSBpdCBmdXJ0aGVyIQorCQkJICovCisJCQlpZiAodm9sLT5tYWpvcl92ZXIgPCAzKSB7CisJCQkJaWYgKHVubGlrZWx5KGRlbHRheGNuID09IChMQ04pLTEpKQorCQkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJsY24gZGVsdGEgPT0gLTEiKTsKKwkJCQlpZiAodW5saWtlbHkobGNuID09IChMQ04pLTEpKQorCQkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJsY24gPT0gLTEiKTsKKwkJCX0KKyNlbmRpZgorCQkJLyogQ2hlY2sgbGNuIGlzIG5vdCBiZWxvdyAtMS4gKi8KKwkJCWlmICh1bmxpa2VseShsY24gPCAoTENOKS0xKSkgeworCQkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkludmFsaWQgTENOIDwgLTEgaW4gIgorCQkJCQkJIm1hcHBpbmcgcGFpcnMgYXJyYXkuIik7CisJCQkJZ290byBlcnJfb3V0OworCQkJfQorCQkJLyogRW50ZXIgdGhlIGN1cnJlbnQgbGNuIGludG8gdGhlIHJ1bmxpc3QgZWxlbWVudC4gKi8KKwkJCXJsW3JscG9zXS5sY24gPSBsY247CisJCX0KKwkJLyogR2V0IHRvIHRoZSBuZXh0IHJ1bmxpc3QgZWxlbWVudC4gKi8KKwkJcmxwb3MrKzsKKwkJLyogSW5jcmVtZW50IHRoZSBidWZmZXIgcG9zaXRpb24gdG8gdGhlIG5leHQgbWFwcGluZyBwYWlyLiAqLworCQlidWYgKz0gKCpidWYgJiAweGYpICsgKCgqYnVmID4+IDQpICYgMHhmKSArIDE7CisJfQorCWlmICh1bmxpa2VseShidWYgPj0gYXR0cl9lbmQpKQorCQlnb3RvIGlvX2Vycm9yOworCS8qCisJICogSWYgdGhlcmUgaXMgYSBoaWdoZXN0X3ZjbiBzcGVjaWZpZWQsIGl0IG11c3QgYmUgZXF1YWwgdG8gdGhlIGZpbmFsCisJICogdmNuIGluIHRoZSBydW5saXN0IC0gMSwgb3Igc29tZXRoaW5nIGhhcyBnb25lIGJhZGx5IHdyb25nLgorCSAqLworCWRlbHRheGNuID0gc2xlNjRfdG9fY3B1KGF0dHItPmRhdGEubm9uX3Jlc2lkZW50LmhpZ2hlc3RfdmNuKTsKKwlpZiAodW5saWtlbHkoZGVsdGF4Y24gJiYgdmNuIC0gMSAhPSBkZWx0YXhjbikpIHsKK21wYV9lcnI6CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkNvcnJ1cHQgbWFwcGluZyBwYWlycyBhcnJheSBpbiAiCisJCQkJIm5vbi1yZXNpZGVudCBhdHRyaWJ1dGUuIik7CisJCWdvdG8gZXJyX291dDsKKwl9CisJLyogU2V0dXAgbm90IG1hcHBlZCBydW5saXN0IGVsZW1lbnQgaWYgdGhpcyBpcyB0aGUgYmFzZSBleHRlbnQuICovCisJaWYgKCFhdHRyLT5kYXRhLm5vbl9yZXNpZGVudC5sb3dlc3RfdmNuKSB7CisJCVZDTiBtYXhfY2x1c3RlcjsKKworCQltYXhfY2x1c3RlciA9IChzbGU2NF90b19jcHUoCisJCQkJYXR0ci0+ZGF0YS5ub25fcmVzaWRlbnQuYWxsb2NhdGVkX3NpemUpICsKKwkJCQl2b2wtPmNsdXN0ZXJfc2l6ZSAtIDEpID4+CisJCQkJdm9sLT5jbHVzdGVyX3NpemVfYml0czsKKwkJLyoKKwkJICogSWYgdGhlcmUgaXMgYSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGhpZ2hlc3RfdmNuIGFuZCB0aGUKKwkJICogaGlnaGVzdCBjbHVzdGVyLCB0aGUgcnVubGlzdCBpcyBlaXRoZXIgY29ycnVwdCBvciwgbW9yZQorCQkgKiBsaWtlbHksIHRoZXJlIGFyZSBtb3JlIGV4dGVudHMgZm9sbG93aW5nIHRoaXMgb25lLgorCQkgKi8KKwkJaWYgKGRlbHRheGNuIDwgLS1tYXhfY2x1c3RlcikgeworCQkJbnRmc19kZWJ1ZygiTW9yZSBleHRlbnRzIHRvIGZvbGxvdzsgZGVsdGF4Y24gPSAweCVsbHgsICIKKwkJCQkJIm1heF9jbHVzdGVyID0gMHglbGx4IiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylkZWx0YXhjbiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyltYXhfY2x1c3Rlcik7CisJCQlybFtybHBvc10udmNuID0gdmNuOworCQkJdmNuICs9IHJsW3JscG9zXS5sZW5ndGggPSBtYXhfY2x1c3RlciAtIGRlbHRheGNuOworCQkJcmxbcmxwb3NdLmxjbiA9IExDTl9STF9OT1RfTUFQUEVEOworCQkJcmxwb3MrKzsKKwkJfSBlbHNlIGlmICh1bmxpa2VseShkZWx0YXhjbiA+IG1heF9jbHVzdGVyKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiQ29ycnVwdCBhdHRyaWJ1dGUuIGRlbHRheGNuID0gIgorCQkJCQkiMHglbGx4LCBtYXhfY2x1c3RlciA9IDB4JWxseCIsCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpZGVsdGF4Y24sCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbWF4X2NsdXN0ZXIpOworCQkJZ290byBtcGFfZXJyOworCQl9CisJCXJsW3JscG9zXS5sY24gPSBMQ05fRU5PRU5UOworCX0gZWxzZSAvKiBOb3QgdGhlIGJhc2UgZXh0ZW50LiBUaGVyZSBtYXkgYmUgbW9yZSBleHRlbnRzIHRvIGZvbGxvdy4gKi8KKwkJcmxbcmxwb3NdLmxjbiA9IExDTl9STF9OT1RfTUFQUEVEOworCisJLyogU2V0dXAgdGVybWluYXRpbmcgcnVubGlzdCBlbGVtZW50LiAqLworCXJsW3JscG9zXS52Y24gPSB2Y247CisJcmxbcmxwb3NdLmxlbmd0aCA9IChzNjQpMDsKKwkvKiBJZiBubyBleGlzdGluZyBydW5saXN0IHdhcyBzcGVjaWZpZWQsIHdlIGFyZSBkb25lLiAqLworCWlmICghb2xkX3JsKSB7CisJCW50ZnNfZGVidWcoIk1hcHBpbmcgcGFpcnMgYXJyYXkgc3VjY2Vzc2Z1bGx5IGRlY29tcHJlc3NlZDoiKTsKKwkJbnRmc19kZWJ1Z19kdW1wX3J1bmxpc3QocmwpOworCQlyZXR1cm4gcmw7CisJfQorCS8qIE5vdyBjb21iaW5lIHRoZSBuZXcgYW5kIG9sZCBydW5saXN0cyBjaGVja2luZyBmb3Igb3ZlcmxhcHMuICovCisJb2xkX3JsID0gbnRmc19ydW5saXN0c19tZXJnZShvbGRfcmwsIHJsKTsKKwlpZiAobGlrZWx5KCFJU19FUlIob2xkX3JsKSkpCisJCXJldHVybiBvbGRfcmw7CisJbnRmc19mcmVlKHJsKTsKKwludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gbWVyZ2UgcnVubGlzdHMuIik7CisJcmV0dXJuIG9sZF9ybDsKK2lvX2Vycm9yOgorCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkNvcnJ1cHQgYXR0cmlidXRlLiIpOworZXJyX291dDoKKwludGZzX2ZyZWUocmwpOworCXJldHVybiBFUlJfUFRSKC1FSU8pOworfQorCisvKioKKyAqIG50ZnNfcmxfdmNuX3RvX2xjbiAtIGNvbnZlcnQgYSB2Y24gaW50byBhIGxjbiBnaXZlbiBhIHJ1bmxpc3QKKyAqIEBybDoJCXJ1bmxpc3QgdG8gdXNlIGZvciBjb252ZXJzaW9uCisgKiBAdmNuOgl2Y24gdG8gY29udmVydAorICoKKyAqIENvbnZlcnQgdGhlIHZpcnR1YWwgY2x1c3RlciBudW1iZXIgQHZjbiBvZiBhbiBhdHRyaWJ1dGUgaW50byBhIGxvZ2ljYWwKKyAqIGNsdXN0ZXIgbnVtYmVyIChsY24pIG9mIGEgZGV2aWNlIHVzaW5nIHRoZSBydW5saXN0IEBybCB0byBtYXAgdmNucyB0byB0aGVpcgorICogY29ycmVzcG9uZGluZyBsY25zLgorICoKKyAqIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gc2VyaWFsaXplIGFjY2VzcyB0byB0aGUgcnVubGlzdCBAcmwuCisgKgorICogU2luY2UgbGNucyBtdXN0IGJlID49IDAsIHdlIHVzZSBuZWdhdGl2ZSByZXR1cm4gdmFsdWVzIHdpdGggc3BlY2lhbCBtZWFuaW5nOgorICoKKyAqIFJldHVybiB2YWx1ZQkJCU1lYW5pbmcgLyBEZXNjcmlwdGlvbgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqICAtMSA9IExDTl9IT0xFCQlIb2xlIC8gbm90IGFsbG9jYXRlZCBvbiBkaXNrLgorICogIC0yID0gTENOX1JMX05PVF9NQVBQRUQJVGhpcyBpcyBwYXJ0IG9mIHRoZSBydW5saXN0IHdoaWNoIGhhcyBub3QgYmVlbgorICoJCQkJaW5zZXJ0ZWQgaW50byB0aGUgcnVubGlzdCB5ZXQuCisgKiAgLTMgPSBMQ05fRU5PRU5UCQlUaGVyZSBpcyBubyBzdWNoIHZjbiBpbiB0aGUgYXR0cmlidXRlLgorICoKKyAqIExvY2tpbmc6IC0gVGhlIGNhbGxlciBtdXN0IGhhdmUgbG9ja2VkIHRoZSBydW5saXN0IChmb3IgcmVhZGluZyBvciB3cml0aW5nKS4KKyAqCSAgICAtIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgdG91Y2ggdGhlIGxvY2suCisgKi8KK0xDTiBudGZzX3JsX3Zjbl90b19sY24oY29uc3QgcnVubGlzdF9lbGVtZW50ICpybCwgY29uc3QgVkNOIHZjbikKK3sKKwlpbnQgaTsKKworCUJVR19PTih2Y24gPCAwKTsKKwkvKgorCSAqIElmIHJsIGlzIE5VTEwsIGFzc3VtZSB0aGF0IHdlIGhhdmUgZm91bmQgYW4gdW5tYXBwZWQgcnVubGlzdC4gVGhlCisJICogY2FsbGVyIGNhbiB0aGVuIGF0dGVtcHQgdG8gbWFwIGl0IGFuZCBmYWlsIGFwcHJvcHJpYXRlbHkgaWYKKwkgKiBuZWNlc3NhcnkuCisJICovCisJaWYgKHVubGlrZWx5KCFybCkpCisJCXJldHVybiBMQ05fUkxfTk9UX01BUFBFRDsKKworCS8qIENhdGNoIG91dCBvZiBsb3dlciBib3VuZHMgdmNuLiAqLworCWlmICh1bmxpa2VseSh2Y24gPCBybFswXS52Y24pKQorCQlyZXR1cm4gTENOX0VOT0VOVDsKKworCWZvciAoaSA9IDA7IGxpa2VseShybFtpXS5sZW5ndGgpOyBpKyspIHsKKwkJaWYgKHVubGlrZWx5KHZjbiA8IHJsW2krMV0udmNuKSkgeworCQkJaWYgKGxpa2VseShybFtpXS5sY24gPj0gKExDTikwKSkKKwkJCQlyZXR1cm4gcmxbaV0ubGNuICsgKHZjbiAtIHJsW2ldLnZjbik7CisJCQlyZXR1cm4gcmxbaV0ubGNuOworCQl9CisJfQorCS8qCisJICogVGhlIHRlcm1pbmF0b3IgZWxlbWVudCBpcyBzZXR1cCB0byB0aGUgY29ycmVjdCB2YWx1ZSwgaS5lLiBvbmUgb2YKKwkgKiBMQ05fSE9MRSwgTENOX1JMX05PVF9NQVBQRUQsIG9yIExDTl9FTk9FTlQuCisJICovCisJaWYgKGxpa2VseShybFtpXS5sY24gPCAoTENOKTApKQorCQlyZXR1cm4gcmxbaV0ubGNuOworCS8qIEp1c3QgaW4gY2FzZS4uLiBXZSBjb3VsZCByZXBsYWNlIHRoaXMgd2l0aCBCVUcoKSBzb21lIGRheS4gKi8KKwlyZXR1cm4gTENOX0VOT0VOVDsKK30KKworLyoqCisgKiBudGZzX2dldF9ucl9zaWduaWZpY2FudF9ieXRlcyAtIGdldCBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkIHRvIHN0b3JlIGEgbnVtYmVyCisgKiBAbjoJCW51bWJlciBmb3Igd2hpY2ggdG8gZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgZm9yCisgKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgQG4gdW5hbWJpZ3VvdXNseSBhcworICogYSBzaWduZWQgbnVtYmVyLgorICoKKyAqIFRoaXMgaXMgdXNlZCBpbiB0aGUgY29udGV4dCBvZiB0aGUgbWFwcGluZyBwYWlycyBhcnJheSB0byBkZXRlcm1pbmUgaG93CisgKiBtYW55IGJ5dGVzIHdpbGwgYmUgbmVlZGVkIGluIHRoZSBhcnJheSB0byBzdG9yZSBhIGdpdmVuIGxvZ2ljYWwgY2x1c3RlcgorICogbnVtYmVyIChsY24pIG9yIGEgc3BlY2lmaWMgcnVuIGxlbmd0aC4KKyAqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLiAgVGhpcyBmdW5jdGlvbiBjYW5ub3QgZmFpbC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbnRmc19nZXRfbnJfc2lnbmlmaWNhbnRfYnl0ZXMoY29uc3QgczY0IG4pCit7CisJczY0IGwgPSBuOworCWludCBpOworCXM4IGo7CisKKwlpID0gMDsKKwlkbyB7CisJCWwgPj49IDg7CisJCWkrKzsKKwl9IHdoaWxlIChsICE9IDAgJiYgbCAhPSAtMSk7CisJaiA9IChuID4+IDggKiAoaSAtIDEpKSAmIDB4ZmY7CisJLyogSWYgdGhlIHNpZ24gYml0IGlzIHdyb25nLCB3ZSBuZWVkIGFuIGV4dHJhIGJ5dGUuICovCisJaWYgKChuIDwgMCAmJiBqID49IDApIHx8IChuID4gMCAmJiBqIDwgMCkpCisJCWkrKzsKKwlyZXR1cm4gaTsKK30KKworLyoqCisgKiBudGZzX2dldF9zaXplX2Zvcl9tYXBwaW5nX3BhaXJzIC0gZ2V0IGJ5dGVzIG5lZWRlZCBmb3IgbWFwcGluZyBwYWlycyBhcnJheQorICogQHZvbDoJbnRmcyB2b2x1bWUgKG5lZWRlZCBmb3IgdGhlIG50ZnMgdmVyc2lvbikKKyAqIEBybDoJCWxvY2tlZCBydW5saXN0IHRvIGRldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgbWFwcGluZyBwYWlycyBvZgorICogQHN0YXJ0X3ZjbjoJdmNuIGF0IHdoaWNoIHRvIHN0YXJ0IHRoZSBtYXBwaW5nIHBhaXJzIGFycmF5CisgKgorICogV2FsayB0aGUgbG9ja2VkIHJ1bmxpc3QgQHJsIGFuZCBjYWxjdWxhdGUgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIG1hcHBpbmcKKyAqIHBhaXJzIGFycmF5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJ1bmxpc3QgQHJsLCBzdGFydGluZyBhdCB2Y24gQHN0YXJ0X3Zjbi4KKyAqIFRoaXMgZm9yIGV4YW1wbGUgYWxsb3dzIHVzIHRvIGFsbG9jYXRlIGEgYnVmZmVyIG9mIHRoZSByaWdodCBzaXplIHdoZW4KKyAqIGJ1aWxkaW5nIHRoZSBtYXBwaW5nIHBhaXJzIGFycmF5LgorICoKKyAqIElmIEBybCBpcyBOVUxMLCBqdXN0IHJldHVybiAxIChmb3IgdGhlIHNpbmdsZSB0ZXJtaW5hdG9yIGJ5dGUpLgorICoKKyAqIFJldHVybiB0aGUgY2FsY3VsYXRlZCBzaXplIGluIGJ5dGVzIG9uIHN1Y2Nlc3MuICBPbiBlcnJvciwgcmV0dXJuIC1lcnJuby4KKyAqIFRoZSBmb2xsb3dpbmcgZXJyb3IgY29kZXMgYXJlIGRlZmluZWQ6CisgKgktRUlOVkFMCS0gUnVuIGxpc3QgY29udGFpbnMgdW5tYXBwZWQgZWxlbWVudHMuICBNYWtlIHN1cmUgdG8gb25seSBwYXNzCisgKgkJICBmdWxseSBtYXBwZWQgcnVubGlzdHMgdG8gdGhpcyBmdW5jdGlvbi4KKyAqCS1FSU8JLSBUaGUgcnVubGlzdCBpcyBjb3JydXB0LgorICoKKyAqIExvY2tpbmc6IEBybCBtdXN0IGJlIGxvY2tlZCBvbiBlbnRyeSAoZWl0aGVyIGZvciByZWFkaW5nIG9yIHdyaXRpbmcpLCBpdAorICoJICAgIHJlbWFpbnMgbG9ja2VkIHRocm91Z2hvdXQsIGFuZCBpcyBsZWZ0IGxvY2tlZCB1cG9uIHJldHVybi4KKyAqLworaW50IG50ZnNfZ2V0X3NpemVfZm9yX21hcHBpbmdfcGFpcnMoY29uc3QgbnRmc192b2x1bWUgKnZvbCwKKwkJY29uc3QgcnVubGlzdF9lbGVtZW50ICpybCwgY29uc3QgVkNOIHN0YXJ0X3ZjbikKK3sKKwlMQ04gcHJldl9sY247CisJaW50IHJsczsKKworCUJVR19PTihzdGFydF92Y24gPCAwKTsKKwlpZiAoIXJsKSB7CisJCUJVR19PTihzdGFydF92Y24pOworCQlyZXR1cm4gMTsKKwl9CisJLyogU2tpcCB0byBydW5saXN0IGVsZW1lbnQgY29udGFpbmluZyBAc3RhcnRfdmNuLiAqLworCXdoaWxlIChybC0+bGVuZ3RoICYmIHN0YXJ0X3ZjbiA+PSBybFsxXS52Y24pCisJCXJsKys7CisJaWYgKCghcmwtPmxlbmd0aCAmJiBzdGFydF92Y24gPiBybC0+dmNuKSB8fCBzdGFydF92Y24gPCBybC0+dmNuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwcmV2X2xjbiA9IDA7CisJLyogQWx3YXlzIG5lZWQgdGhlIHRlcm1pbmluZyB6ZXJvIGJ5dGUuICovCisJcmxzID0gMTsKKwkvKiBEbyB0aGUgZmlyc3QgcGFydGlhbCBydW4gaWYgcHJlc2VudC4gKi8KKwlpZiAoc3RhcnRfdmNuID4gcmwtPnZjbikgeworCQlzNjQgZGVsdGE7CisKKwkJLyogV2Uga25vdyBybC0+bGVuZ3RoICE9IDAgYWxyZWFkeS4gKi8KKwkJaWYgKHJsLT5sZW5ndGggPCAwIHx8IHJsLT5sY24gPCBMQ05fSE9MRSkKKwkJCWdvdG8gZXJyX291dDsKKwkJZGVsdGEgPSBzdGFydF92Y24gLSBybC0+dmNuOworCQkvKiBIZWFkZXIgYnl0ZSArIGxlbmd0aC4gKi8KKwkJcmxzICs9IDEgKyBudGZzX2dldF9ucl9zaWduaWZpY2FudF9ieXRlcyhybC0+bGVuZ3RoIC0gZGVsdGEpOworCQkvKgorCQkgKiBJZiB0aGUgbG9naWNhbCBjbHVzdGVyIG51bWJlciAobGNuKSBkZW5vdGVzIGEgaG9sZSBhbmQgd2UKKwkJICogYXJlIG9uIE5URlMgMy4wKywgd2UgZG9uJ3Qgc3RvcmUgaXQgYXQgYWxsLCBpLmUuIHdlIG5lZWQKKwkJICogemVybyBzcGFjZS4gIE9uIGVhcmxpZXIgTlRGUyB2ZXJzaW9ucyB3ZSBqdXN0IHN0b3JlIHRoZSBsY24uCisJCSAqIE5vdGU6IHRoaXMgYXNzdW1lcyB0aGF0IG9uIE5URlMgMS4yLSwgaG9sZXMgYXJlIHN0b3JlZCB3aXRoCisJCSAqIGFuIGxjbiBvZiAtMSBhbmQgbm90IGEgZGVsdGFfbGNuIG9mIC0xICh1bmxlc3MgYm90aCBhcmUgLTEpLgorCQkgKi8KKwkJaWYgKHJsLT5sY24gPj0gMCB8fCB2b2wtPm1ham9yX3ZlciA8IDMpIHsKKwkJCXByZXZfbGNuID0gcmwtPmxjbjsKKwkJCWlmIChybC0+bGNuID49IDApCisJCQkJcHJldl9sY24gKz0gZGVsdGE7CisJCQkvKiBDaGFuZ2UgaW4gbGNuLiAqLworCQkJcmxzICs9IG50ZnNfZ2V0X25yX3NpZ25pZmljYW50X2J5dGVzKHByZXZfbGNuKTsKKwkJfQorCQkvKiBHbyB0byBuZXh0IHJ1bmxpc3QgZWxlbWVudC4gKi8KKwkJcmwrKzsKKwl9CisJLyogRG8gdGhlIGZ1bGwgcnVucy4gKi8KKwlmb3IgKDsgcmwtPmxlbmd0aDsgcmwrKykgeworCQlpZiAocmwtPmxlbmd0aCA8IDAgfHwgcmwtPmxjbiA8IExDTl9IT0xFKQorCQkJZ290byBlcnJfb3V0OworCQkvKiBIZWFkZXIgYnl0ZSArIGxlbmd0aC4gKi8KKwkJcmxzICs9IDEgKyBudGZzX2dldF9ucl9zaWduaWZpY2FudF9ieXRlcyhybC0+bGVuZ3RoKTsKKwkJLyoKKwkJICogSWYgdGhlIGxvZ2ljYWwgY2x1c3RlciBudW1iZXIgKGxjbikgZGVub3RlcyBhIGhvbGUgYW5kIHdlCisJCSAqIGFyZSBvbiBOVEZTIDMuMCssIHdlIGRvbid0IHN0b3JlIGl0IGF0IGFsbCwgaS5lLiB3ZSBuZWVkCisJCSAqIHplcm8gc3BhY2UuICBPbiBlYXJsaWVyIE5URlMgdmVyc2lvbnMgd2UganVzdCBzdG9yZSB0aGUgbGNuLgorCQkgKiBOb3RlOiB0aGlzIGFzc3VtZXMgdGhhdCBvbiBOVEZTIDEuMi0sIGhvbGVzIGFyZSBzdG9yZWQgd2l0aAorCQkgKiBhbiBsY24gb2YgLTEgYW5kIG5vdCBhIGRlbHRhX2xjbiBvZiAtMSAodW5sZXNzIGJvdGggYXJlIC0xKS4KKwkJICovCisJCWlmIChybC0+bGNuID49IDAgfHwgdm9sLT5tYWpvcl92ZXIgPCAzKSB7CisJCQkvKiBDaGFuZ2UgaW4gbGNuLiAqLworCQkJcmxzICs9IG50ZnNfZ2V0X25yX3NpZ25pZmljYW50X2J5dGVzKHJsLT5sY24gLQorCQkJCQlwcmV2X2xjbik7CisJCQlwcmV2X2xjbiA9IHJsLT5sY247CisJCX0KKwl9CisJcmV0dXJuIHJsczsKK2Vycl9vdXQ6CisJaWYgKHJsLT5sY24gPT0gTENOX1JMX05PVF9NQVBQRUQpCisJCXJscyA9IC1FSU5WQUw7CisJZWxzZQorCQlybHMgPSAtRUlPOworCXJldHVybiBybHM7Cit9CisKKy8qKgorICogbnRmc193cml0ZV9zaWduaWZpY2FudF9ieXRlcyAtIHdyaXRlIHRoZSBzaWduaWZpY2FudCBieXRlcyBvZiBhIG51bWJlcgorICogQGRzdDoJZGVzdGluYXRpb24gYnVmZmVyIHRvIHdyaXRlIHRvCisgKiBAZHN0X21heDoJcG9pbnRlciB0byBsYXN0IGJ5dGUgb2YgZGVzdGluYXRpb24gYnVmZmVyIGZvciBib3VuZHMgY2hlY2tpbmcKKyAqIEBuOgkJbnVtYmVyIHdob3NlIHNpZ25pZmljYW50IGJ5dGVzIHRvIHdyaXRlCisgKgorICogU3RvcmUgaW4gQGRzdCwgdGhlIG1pbmltdW0gYnl0ZXMgb2YgdGhlIG51bWJlciBAbiB3aGljaCBhcmUgcmVxdWlyZWQgdG8KKyAqIGlkZW50aWZ5IEBuIHVuYW1iaWd1b3VzbHkgYXMgYSBzaWduZWQgbnVtYmVyLCB0YWtpbmcgY2FyZSBub3QgdG8gZXhjZWVkCisgKiBAZGVzdF9tYXgsIHRoZSBtYXhpbXVtIHBvc2l0aW9uIHdpdGhpbiBAZHN0IHRvIHdoaWNoIHdlIGFyZSBhbGxvd2VkIHRvCisgKiB3cml0ZS4KKyAqCisgKiBUaGlzIGlzIHVzZWQgd2hlbiBidWlsZGluZyB0aGUgbWFwcGluZyBwYWlycyBhcnJheSBvZiBhIHJ1bmxpc3QgdG8gY29tcHJlc3MKKyAqIGEgZ2l2ZW4gbG9naWNhbCBjbHVzdGVyIG51bWJlciAobGNuKSBvciBhIHNwZWNpZmljIHJ1biBsZW5ndGggdG8gdGhlIG1pbnVtdW0KKyAqIHNpemUgcG9zc2libGUuCisgKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBvbiBzdWNjZXNzLiAgT24gZXJyb3IsIGkuZS4gdGhlCisgKiBkZXN0aW5hdGlvbiBidWZmZXIgQGRzdCBpcyB0b28gc21hbGwsIHJldHVybiAtRU5PU1BDLgorICovCitzdGF0aWMgaW5saW5lIGludCBudGZzX3dyaXRlX3NpZ25pZmljYW50X2J5dGVzKHM4ICpkc3QsIGNvbnN0IHM4ICpkc3RfbWF4LAorCQljb25zdCBzNjQgbikKK3sKKwlzNjQgbCA9IG47CisJaW50IGk7CisJczggajsKKworCWkgPSAwOworCWRvIHsKKwkJaWYgKGRzdCA+IGRzdF9tYXgpCisJCQlnb3RvIGVycl9vdXQ7CisJCSpkc3QrKyA9IGwgJiAweGZmbGw7CisJCWwgPj49IDg7CisJCWkrKzsKKwl9IHdoaWxlIChsICE9IDAgJiYgbCAhPSAtMSk7CisJaiA9IChuID4+IDggKiAoaSAtIDEpKSAmIDB4ZmY7CisJLyogSWYgdGhlIHNpZ24gYml0IGlzIHdyb25nLCB3ZSBuZWVkIGFuIGV4dHJhIGJ5dGUuICovCisJaWYgKG4gPCAwICYmIGogPj0gMCkgeworCQlpZiAoZHN0ID4gZHN0X21heCkKKwkJCWdvdG8gZXJyX291dDsKKwkJaSsrOworCQkqZHN0ID0gKHM4KS0xOworCX0gZWxzZSBpZiAobiA+IDAgJiYgaiA8IDApIHsKKwkJaWYgKGRzdCA+IGRzdF9tYXgpCisJCQlnb3RvIGVycl9vdXQ7CisJCWkrKzsKKwkJKmRzdCA9IChzOCkwOworCX0KKwlyZXR1cm4gaTsKK2Vycl9vdXQ6CisJcmV0dXJuIC1FTk9TUEM7Cit9CisKKy8qKgorICogbnRmc19tYXBwaW5nX3BhaXJzX2J1aWxkIC0gYnVpbGQgdGhlIG1hcHBpbmcgcGFpcnMgYXJyYXkgZnJvbSBhIHJ1bmxpc3QKKyAqIEB2b2w6CW50ZnMgdm9sdW1lIChuZWVkZWQgZm9yIHRoZSBudGZzIHZlcnNpb24pCisgKiBAZHN0OglkZXN0aW5hdGlvbiBidWZmZXIgdG8gd2hpY2ggdG8gd3JpdGUgdGhlIG1hcHBpbmcgcGFpcnMgYXJyYXkKKyAqIEBkc3RfbGVuOglzaXplIG9mIGRlc3RpbmF0aW9uIGJ1ZmZlciBAZHN0IGluIGJ5dGVzCisgKiBAcmw6CQlsb2NrZWQgcnVubGlzdCBmb3Igd2hpY2ggdG8gYnVpbGQgdGhlIG1hcHBpbmcgcGFpcnMgYXJyYXkKKyAqIEBzdGFydF92Y246CXZjbiBhdCB3aGljaCB0byBzdGFydCB0aGUgbWFwcGluZyBwYWlycyBhcnJheQorICogQHN0b3BfdmNuOglmaXJzdCB2Y24gb3V0c2lkZSBkZXN0aW5hdGlvbiBidWZmZXIgb24gc3VjY2VzcyBvciAtRU5PU1BDCisgKgorICogQ3JlYXRlIHRoZSBtYXBwaW5nIHBhaXJzIGFycmF5IGZyb20gdGhlIGxvY2tlZCBydW5saXN0IEBybCwgc3RhcnRpbmcgYXQgdmNuCisgKiBAc3RhcnRfdmNuIGFuZCBzYXZlIHRoZSBhcnJheSBpbiBAZHN0LiAgQGRzdF9sZW4gaXMgdGhlIHNpemUgb2YgQGRzdCBpbgorICogYnl0ZXMgYW5kIGl0IHNob3VsZCBiZSBhdCBsZWFzdCBlcXVhbCB0byB0aGUgdmFsdWUgb2J0YWluZWQgYnkgY2FsbGluZworICogbnRmc19nZXRfc2l6ZV9mb3JfbWFwcGluZ19wYWlycygpLgorICoKKyAqIElmIEBybCBpcyBOVUxMLCBqdXN0IHdyaXRlIGEgc2luZ2xlIHRlcm1pbmF0b3IgYnl0ZSB0byBAZHN0LgorICoKKyAqIE9uIHN1Y2Nlc3Mgb3IgLUVOT1NQQyBlcnJvciwgaWYgQHN0b3BfdmNuIGlzIG5vdCBOVUxMLCAqQHN0b3BfdmNuIGlzIHNldCB0bworICogdGhlIGZpcnN0IHZjbiBvdXRzaWRlIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuICBOb3RlIHRoYXQgb24gZXJyb3IsIEBkc3QgaGFzCisgKiBiZWVuIGZpbGxlZCB3aXRoIGFsbCB0aGUgbWFwcGluZyBwYWlycyB0aGF0IHdpbGwgZml0LCB0aHVzIGl0IGNhbiBiZSB0cmVhdGVkCisgKiBhcyBwYXJ0aWFsIHN1Y2Nlc3MsIGluIHRoYXQgYSBuZXcgYXR0cmlidXRlIGV4dGVudCBuZWVkcyB0byBiZSBjcmVhdGVkIG9yCisgKiB0aGUgbmV4dCBleHRlbnQgaGFzIHRvIGJlIHVzZWQgYW5kIHRoZSBtYXBwaW5nIHBhaXJzIGJ1aWxkIGhhcyB0byBiZQorICogY29udGludWVkIHdpdGggQHN0YXJ0X3ZjbiBzZXQgdG8gKkBzdG9wX3Zjbi4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuICBUaGUgZm9sbG93aW5nIGVycm9yIGNvZGVzIGFyZQorICogZGVmaW5lZDoKKyAqCS1FSU5WQUwJLSBSdW4gbGlzdCBjb250YWlucyB1bm1hcHBlZCBlbGVtZW50cy4gIE1ha2Ugc3VyZSB0byBvbmx5IHBhc3MKKyAqCQkgIGZ1bGx5IG1hcHBlZCBydW5saXN0cyB0byB0aGlzIGZ1bmN0aW9uLgorICoJLUVJTwktIFRoZSBydW5saXN0IGlzIGNvcnJ1cHQuCisgKgktRU5PU1BDCS0gVGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciBpcyB0b28gc21hbGwuCisgKgorICogTG9ja2luZzogQHJsIG11c3QgYmUgbG9ja2VkIG9uIGVudHJ5IChlaXRoZXIgZm9yIHJlYWRpbmcgb3Igd3JpdGluZyksIGl0CisgKgkgICAgcmVtYWlucyBsb2NrZWQgdGhyb3VnaG91dCwgYW5kIGlzIGxlZnQgbG9ja2VkIHVwb24gcmV0dXJuLgorICovCitpbnQgbnRmc19tYXBwaW5nX3BhaXJzX2J1aWxkKGNvbnN0IG50ZnNfdm9sdW1lICp2b2wsIHM4ICpkc3QsCisJCWNvbnN0IGludCBkc3RfbGVuLCBjb25zdCBydW5saXN0X2VsZW1lbnQgKnJsLAorCQljb25zdCBWQ04gc3RhcnRfdmNuLCBWQ04gKmNvbnN0IHN0b3BfdmNuKQoreworCUxDTiBwcmV2X2xjbjsKKwlzOCAqZHN0X21heCwgKmRzdF9uZXh0OworCWludCBlcnIgPSAtRU5PU1BDOworCXM4IGxlbl9sZW4sIGxjbl9sZW47CisKKwlCVUdfT04oc3RhcnRfdmNuIDwgMCk7CisJQlVHX09OKGRzdF9sZW4gPCAxKTsKKwlpZiAoIXJsKSB7CisJCUJVR19PTihzdGFydF92Y24pOworCQlpZiAoc3RvcF92Y24pCisJCQkqc3RvcF92Y24gPSAwOworCQkvKiBUZXJtaW5hdG9yIGJ5dGUuICovCisJCSpkc3QgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJLyogU2tpcCB0byBydW5saXN0IGVsZW1lbnQgY29udGFpbmluZyBAc3RhcnRfdmNuLiAqLworCXdoaWxlIChybC0+bGVuZ3RoICYmIHN0YXJ0X3ZjbiA+PSBybFsxXS52Y24pCisJCXJsKys7CisJaWYgKCghcmwtPmxlbmd0aCAmJiBzdGFydF92Y24gPiBybC0+dmNuKSB8fCBzdGFydF92Y24gPCBybC0+dmNuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkvKgorCSAqIEBkc3RfbWF4IGlzIHVzZWQgZm9yIGJvdW5kcyBjaGVja2luZyBpbgorCSAqIG50ZnNfd3JpdGVfc2lnbmlmaWNhbnRfYnl0ZXMoKS4KKwkgKi8KKwlkc3RfbWF4ID0gZHN0ICsgZHN0X2xlbiAtIDE7CisJcHJldl9sY24gPSAwOworCS8qIERvIHRoZSBmaXJzdCBwYXJ0aWFsIHJ1biBpZiBwcmVzZW50LiAqLworCWlmIChzdGFydF92Y24gPiBybC0+dmNuKSB7CisJCXM2NCBkZWx0YTsKKworCQkvKiBXZSBrbm93IHJsLT5sZW5ndGggIT0gMCBhbHJlYWR5LiAqLworCQlpZiAocmwtPmxlbmd0aCA8IDAgfHwgcmwtPmxjbiA8IExDTl9IT0xFKQorCQkJZ290byBlcnJfb3V0OworCQlkZWx0YSA9IHN0YXJ0X3ZjbiAtIHJsLT52Y247CisJCS8qIFdyaXRlIGxlbmd0aC4gKi8KKwkJbGVuX2xlbiA9IG50ZnNfd3JpdGVfc2lnbmlmaWNhbnRfYnl0ZXMoZHN0ICsgMSwgZHN0X21heCwKKwkJCQlybC0+bGVuZ3RoIC0gZGVsdGEpOworCQlpZiAobGVuX2xlbiA8IDApCisJCQlnb3RvIHNpemVfZXJyOworCQkvKgorCQkgKiBJZiB0aGUgbG9naWNhbCBjbHVzdGVyIG51bWJlciAobGNuKSBkZW5vdGVzIGEgaG9sZSBhbmQgd2UKKwkJICogYXJlIG9uIE5URlMgMy4wKywgd2UgZG9uJ3Qgc3RvcmUgaXQgYXQgYWxsLCBpLmUuIHdlIG5lZWQKKwkJICogemVybyBzcGFjZS4gIE9uIGVhcmxpZXIgTlRGUyB2ZXJzaW9ucyB3ZSBqdXN0IHdyaXRlIHRoZSBsY24KKwkJICogY2hhbmdlLiAgRklYTUU6IERvIHdlIG5lZWQgdG8gd3JpdGUgdGhlIGxjbiBjaGFuZ2Ugb3IganVzdAorCQkgKiB0aGUgbGNuIGluIHRoYXQgY2FzZT8gIE5vdCBzdXJlIGFzIEkgaGF2ZSBuZXZlciBzZWVuIHRoaXMKKwkJICogY2FzZSBvbiBOVDQuIC0gV2UgYXNzdW1lIHRoYXQgd2UganVzdCBuZWVkIHRvIHdyaXRlIHRoZSBsY24KKwkJICogY2hhbmdlIHVudGlsIHNvbWVvbmUgdGVsbHMgdXMgb3RoZXJ3aXNlLi4uIChBSUEpCisJCSAqLworCQlpZiAocmwtPmxjbiA+PSAwIHx8IHZvbC0+bWFqb3JfdmVyIDwgMykgeworCQkJcHJldl9sY24gPSBybC0+bGNuOworCQkJaWYgKHJsLT5sY24gPj0gMCkKKwkJCQlwcmV2X2xjbiArPSBkZWx0YTsKKwkJCS8qIFdyaXRlIGNoYW5nZSBpbiBsY24uICovCisJCQlsY25fbGVuID0gbnRmc193cml0ZV9zaWduaWZpY2FudF9ieXRlcyhkc3QgKyAxICsKKwkJCQkJbGVuX2xlbiwgZHN0X21heCwgcHJldl9sY24pOworCQkJaWYgKGxjbl9sZW4gPCAwKQorCQkJCWdvdG8gc2l6ZV9lcnI7CisJCX0gZWxzZQorCQkJbGNuX2xlbiA9IDA7CisJCWRzdF9uZXh0ID0gZHN0ICsgbGVuX2xlbiArIGxjbl9sZW4gKyAxOworCQlpZiAoZHN0X25leHQgPiBkc3RfbWF4KQorCQkJZ290byBzaXplX2VycjsKKwkJLyogVXBkYXRlIGhlYWRlciBieXRlLiAqLworCQkqZHN0ID0gbGNuX2xlbiA8PCA0IHwgbGVuX2xlbjsKKwkJLyogUG9zaXRpb24gYXQgbmV4dCBtYXBwaW5nIHBhaXJzIGFycmF5IGVsZW1lbnQuICovCisJCWRzdCA9IGRzdF9uZXh0OworCQkvKiBHbyB0byBuZXh0IHJ1bmxpc3QgZWxlbWVudC4gKi8KKwkJcmwrKzsKKwl9CisJLyogRG8gdGhlIGZ1bGwgcnVucy4gKi8KKwlmb3IgKDsgcmwtPmxlbmd0aDsgcmwrKykgeworCQlpZiAocmwtPmxlbmd0aCA8IDAgfHwgcmwtPmxjbiA8IExDTl9IT0xFKQorCQkJZ290byBlcnJfb3V0OworCQkvKiBXcml0ZSBsZW5ndGguICovCisJCWxlbl9sZW4gPSBudGZzX3dyaXRlX3NpZ25pZmljYW50X2J5dGVzKGRzdCArIDEsIGRzdF9tYXgsCisJCQkJcmwtPmxlbmd0aCk7CisJCWlmIChsZW5fbGVuIDwgMCkKKwkJCWdvdG8gc2l6ZV9lcnI7CisJCS8qCisJCSAqIElmIHRoZSBsb2dpY2FsIGNsdXN0ZXIgbnVtYmVyIChsY24pIGRlbm90ZXMgYSBob2xlIGFuZCB3ZQorCQkgKiBhcmUgb24gTlRGUyAzLjArLCB3ZSBkb24ndCBzdG9yZSBpdCBhdCBhbGwsIGkuZS4gd2UgbmVlZAorCQkgKiB6ZXJvIHNwYWNlLiAgT24gZWFybGllciBOVEZTIHZlcnNpb25zIHdlIGp1c3Qgd3JpdGUgdGhlIGxjbgorCQkgKiBjaGFuZ2UuICBGSVhNRTogRG8gd2UgbmVlZCB0byB3cml0ZSB0aGUgbGNuIGNoYW5nZSBvciBqdXN0CisJCSAqIHRoZSBsY24gaW4gdGhhdCBjYXNlPyAgTm90IHN1cmUgYXMgSSBoYXZlIG5ldmVyIHNlZW4gdGhpcworCQkgKiBjYXNlIG9uIE5UNC4gLSBXZSBhc3N1bWUgdGhhdCB3ZSBqdXN0IG5lZWQgdG8gd3JpdGUgdGhlIGxjbgorCQkgKiBjaGFuZ2UgdW50aWwgc29tZW9uZSB0ZWxscyB1cyBvdGhlcndpc2UuLi4gKEFJQSkKKwkJICovCisJCWlmIChybC0+bGNuID49IDAgfHwgdm9sLT5tYWpvcl92ZXIgPCAzKSB7CisJCQkvKiBXcml0ZSBjaGFuZ2UgaW4gbGNuLiAqLworCQkJbGNuX2xlbiA9IG50ZnNfd3JpdGVfc2lnbmlmaWNhbnRfYnl0ZXMoZHN0ICsgMSArCisJCQkJCWxlbl9sZW4sIGRzdF9tYXgsIHJsLT5sY24gLSBwcmV2X2xjbik7CisJCQlpZiAobGNuX2xlbiA8IDApCisJCQkJZ290byBzaXplX2VycjsKKwkJCXByZXZfbGNuID0gcmwtPmxjbjsKKwkJfSBlbHNlCisJCQlsY25fbGVuID0gMDsKKwkJZHN0X25leHQgPSBkc3QgKyBsZW5fbGVuICsgbGNuX2xlbiArIDE7CisJCWlmIChkc3RfbmV4dCA+IGRzdF9tYXgpCisJCQlnb3RvIHNpemVfZXJyOworCQkvKiBVcGRhdGUgaGVhZGVyIGJ5dGUuICovCisJCSpkc3QgPSBsY25fbGVuIDw8IDQgfCBsZW5fbGVuOworCQkvKiBQb3NpdGlvbiBhdCBuZXh0IG1hcHBpbmcgcGFpcnMgYXJyYXkgZWxlbWVudC4gKi8KKwkJZHN0ID0gZHN0X25leHQ7CisJfQorCS8qIFN1Y2Nlc3MuICovCisJZXJyID0gMDsKK3NpemVfZXJyOgorCS8qIFNldCBzdG9wIHZjbi4gKi8KKwlpZiAoc3RvcF92Y24pCisJCSpzdG9wX3ZjbiA9IHJsLT52Y247CisJLyogQWRkIHRlcm1pbmF0b3IgYnl0ZS4gKi8KKwkqZHN0ID0gMDsKKwlyZXR1cm4gZXJyOworZXJyX291dDoKKwlpZiAocmwtPmxjbiA9PSBMQ05fUkxfTk9UX01BUFBFRCkKKwkJZXJyID0gLUVJTlZBTDsKKwllbHNlCisJCWVyciA9IC1FSU87CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBudGZzX3JsX3RydW5jYXRlX25vbG9jayAtIHRydW5jYXRlIGEgcnVubGlzdCBzdGFydGluZyBhdCBhIHNwZWNpZmllZCB2Y24KKyAqIEBydW5saXN0OglydW5saXN0IHRvIHRydW5jYXRlCisgKiBAbmV3X2xlbmd0aDoJdGhlIG5ldyBsZW5ndGggb2YgdGhlIHJ1bmxpc3QgaW4gVkNOcworICoKKyAqIFRydW5jYXRlIHRoZSBydW5saXN0IGRlc2NyaWJlZCBieSBAcnVubGlzdCBhcyB3ZWxsIGFzIHRoZSBtZW1vcnkgYnVmZmVyCisgKiBob2xkaW5nIHRoZSBydW5saXN0IGVsZW1lbnRzIHRvIGEgbGVuZ3RoIG9mIEBuZXdfbGVuZ3RoIFZDTnMuCisgKgorICogSWYgQG5ld19sZW5ndGggbGllcyB3aXRoaW4gdGhlIHJ1bmxpc3QsIHRoZSBydW5saXN0IGVsZW1lbnRzIHdpdGggVkNOcyBvZgorICogQG5ld19sZW5ndGggYW5kIGFib3ZlIGFyZSBkaXNjYXJkZWQuCisgKgorICogSWYgQG5ld19sZW5ndGggbGllcyBiZXlvbmQgdGhlIHJ1bmxpc3QsIGEgc3BhcnNlIHJ1bmxpc3QgZWxlbWVudCBpcyBhZGRlZCB0bworICogdGhlIGVuZCBvZiB0aGUgcnVubGlzdCBAcnVubGlzdCBvciBpZiB0aGUgbGFzdCBydW5saXN0IGVsZW1lbnQgaXMgYSBzcGFyc2UKKyAqIG9uZSBhbHJlYWR5LCB0aGlzIGlzIGV4dGVuZGVkLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4KKyAqCisgKiBMb2NraW5nOiBUaGUgY2FsbGVyIG11c3QgaG9sZCBAcnVubGlzdC0+bG9jayBmb3Igd3JpdGluZy4KKyAqLworaW50IG50ZnNfcmxfdHJ1bmNhdGVfbm9sb2NrKGNvbnN0IG50ZnNfdm9sdW1lICp2b2wsIHJ1bmxpc3QgKmNvbnN0IHJ1bmxpc3QsCisJCWNvbnN0IHM2NCBuZXdfbGVuZ3RoKQoreworCXJ1bmxpc3RfZWxlbWVudCAqcmw7CisJaW50IG9sZF9zaXplOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIG5ld19sZW5ndGggMHglbGx4LiIsIChsb25nIGxvbmcpbmV3X2xlbmd0aCk7CisJQlVHX09OKCFydW5saXN0KTsKKwlCVUdfT04obmV3X2xlbmd0aCA8IDApOworCXJsID0gcnVubGlzdC0+cmw7CisJaWYgKHVubGlrZWx5KCFybCkpIHsKKwkJLyoKKwkJICogQ3JlYXRlIGEgcnVubGlzdCBjb25zaXN0aW5nIG9mIGEgc3BhcnNlIHJ1bmxpc3QgZWxlbWVudCBvZgorCQkgKiBsZW5ndGggQG5ld19sZW5ndGggZm9sbG93ZWQgYnkgYSB0ZXJtaW5hdG9yIHJ1bmxpc3QgZWxlbWVudC4KKwkJICovCisJCXJsID0gbnRmc19tYWxsb2Nfbm9mcyhQQUdFX1NJWkUpOworCQlpZiAodW5saWtlbHkoIXJsKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgIgorCQkJCQkicnVubGlzdCBlbGVtZW50IGJ1ZmZlci4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXJ1bmxpc3QtPnJsID0gcmw7CisJCXJsWzFdLmxlbmd0aCA9IHJsLT52Y24gPSAwOworCQlybC0+bGNuID0gTENOX0hPTEU7CisJCXJsWzFdLnZjbiA9IHJsLT5sZW5ndGggPSBuZXdfbGVuZ3RoOworCQlybFsxXS5sY24gPSBMQ05fRU5PRU5UOworCQlyZXR1cm4gMDsKKwl9CisJQlVHX09OKG5ld19sZW5ndGggPCBybC0+dmNuKTsKKwkvKiBGaW5kIEBuZXdfbGVuZ3RoIGluIHRoZSBydW5saXN0LiAqLworCXdoaWxlIChsaWtlbHkocmwtPmxlbmd0aCAmJiBuZXdfbGVuZ3RoID49IHJsWzFdLnZjbikpCisJCXJsKys7CisJLyoKKwkgKiBJZiBub3QgYXQgdGhlIGVuZCBvZiB0aGUgcnVubGlzdCB3ZSBuZWVkIHRvIHNocmluayBpdC4KKwkgKiBJZiBhdCB0aGUgZW5kIG9mIHRoZSBydW5saXN0IHdlIG5lZWQgdG8gZXhwYW5kIGl0LgorCSAqLworCWlmIChybC0+bGVuZ3RoKSB7CisJCXJ1bmxpc3RfZWxlbWVudCAqdHJsOworCQlCT09MIGlzX2VuZDsKKworCQludGZzX2RlYnVnKCJTaHJpbmtpbmcgcnVubGlzdC4iKTsKKwkJLyogRGV0ZXJtaW5lIHRoZSBydW5saXN0IHNpemUuICovCisJCXRybCA9IHJsICsgMTsKKwkJd2hpbGUgKGxpa2VseSh0cmwtPmxlbmd0aCkpCisJCQl0cmwrKzsKKwkJb2xkX3NpemUgPSB0cmwgLSBydW5saXN0LT5ybCArIDE7CisJCS8qIFRydW5jYXRlIHRoZSBydW4uICovCisJCXJsLT5sZW5ndGggPSBuZXdfbGVuZ3RoIC0gcmwtPnZjbjsKKwkJLyoKKwkJICogSWYgYSBydW4gd2FzIHBhcnRpYWxseSB0cnVuY2F0ZWQsIG1ha2UgdGhlIGZvbGxvd2luZyBydW5saXN0CisJCSAqIGVsZW1lbnQgYSB0ZXJtaW5hdG9yLgorCQkgKi8KKwkJaXNfZW5kID0gRkFMU0U7CisJCWlmIChybC0+bGVuZ3RoKSB7CisJCQlybCsrOworCQkJaWYgKCFybC0+bGVuZ3RoKQorCQkJCWlzX2VuZCA9IFRSVUU7CisJCQlybC0+dmNuID0gbmV3X2xlbmd0aDsKKwkJCXJsLT5sZW5ndGggPSAwOworCQl9CisJCXJsLT5sY24gPSBMQ05fRU5PRU5UOworCQkvKiBSZWFsbG9jYXRlIG1lbW9yeSBpZiBuZWNlc3NhcnkuICovCisJCWlmICghaXNfZW5kKSB7CisJCQlpbnQgbmV3X3NpemUgPSBybCAtIHJ1bmxpc3QtPnJsICsgMTsKKwkJCXJsID0gbnRmc19ybF9yZWFsbG9jKHJ1bmxpc3QtPnJsLCBvbGRfc2l6ZSwgbmV3X3NpemUpOworCQkJaWYgKElTX0VSUihybCkpCisJCQkJbnRmc193YXJuaW5nKHZvbC0+c2IsICJGYWlsZWQgdG8gc2hyaW5rICIKKwkJCQkJCSJydW5saXN0IGJ1ZmZlci4gIFRoaXMganVzdCAiCisJCQkJCQkid2FzdGVzIGEgYml0IG9mIG1lbW9yeSAiCisJCQkJCQkidGVtcG9yYXJpbHkgc28gd2UgaWdub3JlIGl0ICIKKwkJCQkJCSJhbmQgcmV0dXJuIHN1Y2Nlc3MuIik7CisJCQllbHNlCisJCQkJcnVubGlzdC0+cmwgPSBybDsKKwkJfQorCX0gZWxzZSBpZiAobGlrZWx5KC8qICFybC0+bGVuZ3RoICYmICovIG5ld19sZW5ndGggPiBybC0+dmNuKSkgeworCQludGZzX2RlYnVnKCJFeHBhbmRpbmcgcnVubGlzdC4iKTsKKwkJLyoKKwkJICogSWYgdGhlcmUgaXMgYSBwcmV2aW91cyBydW5saXN0IGVsZW1lbnQgYW5kIGl0IGlzIGEgc3BhcnNlCisJCSAqIG9uZSwgZXh0ZW5kIGl0LiAgT3RoZXJ3aXNlIG5lZWQgdG8gYWRkIGEgbmV3LCBzcGFyc2UgcnVubGlzdAorCQkgKiBlbGVtZW50LgorCQkgKi8KKwkJaWYgKChybCA+IHJ1bmxpc3QtPnJsKSAmJiAoKHJsIC0gMSktPmxjbiA9PSBMQ05fSE9MRSkpCisJCQkocmwgLSAxKS0+bGVuZ3RoID0gbmV3X2xlbmd0aCAtIChybCAtIDEpLT52Y247CisJCWVsc2UgeworCQkJLyogRGV0ZXJtaW5lIHRoZSBydW5saXN0IHNpemUuICovCisJCQlvbGRfc2l6ZSA9IHJsIC0gcnVubGlzdC0+cmwgKyAxOworCQkJLyogUmVhbGxvY2F0ZSBtZW1vcnkgaWYgbmVjZXNzYXJ5LiAqLworCQkJcmwgPSBudGZzX3JsX3JlYWxsb2MocnVubGlzdC0+cmwsIG9sZF9zaXplLAorCQkJCQlvbGRfc2l6ZSArIDEpOworCQkJaWYgKElTX0VSUihybCkpIHsKKwkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gZXhwYW5kIHJ1bmxpc3QgIgorCQkJCQkJImJ1ZmZlciwgYWJvcnRpbmcuIik7CisJCQkJcmV0dXJuIFBUUl9FUlIocmwpOworCQkJfQorCQkJcnVubGlzdC0+cmwgPSBybDsKKwkJCS8qCisJCQkgKiBTZXQgQHJsIHRvIHRoZSBzYW1lIHJ1bmxpc3QgZWxlbWVudCBpbiB0aGUgbmV3CisJCQkgKiBydW5saXN0IGFzIGJlZm9yZSBpbiB0aGUgb2xkIHJ1bmxpc3QuCisJCQkgKi8KKwkJCXJsICs9IG9sZF9zaXplIC0gMTsKKwkJCS8qIEFkZCBhIG5ldywgc3BhcnNlIHJ1bmxpc3QgZWxlbWVudC4gKi8KKwkJCXJsLT5sY24gPSBMQ05fSE9MRTsKKwkJCXJsLT5sZW5ndGggPSBuZXdfbGVuZ3RoIC0gcmwtPnZjbjsKKwkJCS8qIEFkZCBhIG5ldyB0ZXJtaW5hdG9yIHJ1bmxpc3QgZWxlbWVudC4gKi8KKwkJCXJsKys7CisJCQlybC0+bGVuZ3RoID0gMDsKKwkJfQorCQlybC0+dmNuID0gbmV3X2xlbmd0aDsKKwkJcmwtPmxjbiA9IExDTl9FTk9FTlQ7CisJfSBlbHNlIC8qIGlmICh1bmxpa2VseSghcmwtPmxlbmd0aCAmJiBuZXdfbGVuZ3RoID09IHJsLT52Y24pKSAqLyB7CisJCS8qIFJ1bmxpc3QgYWxyZWFkeSBoYXMgc2FtZSBzaXplIGFzIHJlcXVlc3RlZC4gKi8KKwkJcmwtPmxjbiA9IExDTl9FTk9FTlQ7CisJfQorCW50ZnNfZGVidWcoIkRvbmUuIik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy9udGZzL3J1bmxpc3QuaCBiL2ZzL250ZnMvcnVubGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMDdmZGUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL3J1bmxpc3QuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogcnVubGlzdC5oIC0gRGVmaW5lcyBmb3IgcnVubGlzdCBoYW5kbGluZyBpbiBOVEZTIExpbnV4IGtlcm5lbCBkcml2ZXIuCisgKgkgICAgICAgUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChjKSAyMDAyIFJpY2hhcmQgUnVzc29uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfTElOVVhfTlRGU19SVU5MSVNUX0gKKyNkZWZpbmUgX0xJTlVYX05URlNfUlVOTElTVF9ICisKKyNpbmNsdWRlICJ0eXBlcy5oIgorI2luY2x1ZGUgImxheW91dC5oIgorI2luY2x1ZGUgInZvbHVtZS5oIgorCisvKioKKyAqIHJ1bmxpc3RfZWxlbWVudCAtIGluIG1lbW9yeSB2Y24gdG8gbGNuIG1hcHBpbmcgYXJyYXkgZWxlbWVudAorICogQHZjbjoJc3RhcnRpbmcgdmNuIG9mIHRoZSBjdXJyZW50IGFycmF5IGVsZW1lbnQKKyAqIEBsY246CXN0YXJ0aW5nIGxjbiBvZiB0aGUgY3VycmVudCBhcnJheSBlbGVtZW50CisgKiBAbGVuZ3RoOglsZW5ndGggaW4gY2x1c3RlcnMgb2YgdGhlIGN1cnJlbnQgYXJyYXkgZWxlbWVudAorICoKKyAqIFRoZSBsYXN0IHZjbiAoaW4gZmFjdCB0aGUgbGFzdCB2Y24gKyAxKSBpcyByZWFjaGVkIHdoZW4gbGVuZ3RoID09IDAuCisgKgorICogV2hlbiBsY24gPT0gLTEgdGhpcyBtZWFucyB0aGF0IHRoZSBjb3VudCB2Y25zIHN0YXJ0aW5nIGF0IHZjbiBhcmUgbm90CisgKiBwaHlzaWNhbGx5IGFsbG9jYXRlZCAoaS5lLiB0aGlzIGlzIGEgaG9sZSAvIGRhdGEgaXMgc3BhcnNlKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgewkvKiBJbiBtZW1vcnkgdmNuIHRvIGxjbiBtYXBwaW5nIHN0cnVjdHVyZSBlbGVtZW50LiAqLworCVZDTiB2Y247CS8qIHZjbiA9IFN0YXJ0aW5nIHZpcnR1YWwgY2x1c3RlciBudW1iZXIuICovCisJTENOIGxjbjsJLyogbGNuID0gU3RhcnRpbmcgbG9naWNhbCBjbHVzdGVyIG51bWJlci4gKi8KKwlzNjQgbGVuZ3RoOwkvKiBSdW4gbGVuZ3RoIGluIGNsdXN0ZXJzLiAqLworfSBydW5saXN0X2VsZW1lbnQ7CisKKy8qKgorICogcnVubGlzdCAtIGluIG1lbW9yeSB2Y24gdG8gbGNuIG1hcHBpbmcgYXJyYXkgaW5jbHVkaW5nIGEgcmVhZC93cml0ZSBsb2NrCisgKiBAcmw6CQlwb2ludGVyIHRvIGFuIGFycmF5IG9mIHJ1bmxpc3QgZWxlbWVudHMKKyAqIEBsb2NrOglyZWFkL3dyaXRlIHNwaW5sb2NrIGZvciBzZXJpYWxpemluZyBhY2Nlc3MgdG8gQHJsCisgKgorICovCit0eXBlZGVmIHN0cnVjdCB7CisJcnVubGlzdF9lbGVtZW50ICpybDsKKwlzdHJ1Y3Qgcndfc2VtYXBob3JlIGxvY2s7Cit9IHJ1bmxpc3Q7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBudGZzX2luaXRfcnVubGlzdChydW5saXN0ICpybCkKK3sKKwlybC0+cmwgPSBOVUxMOworCWluaXRfcndzZW0oJnJsLT5sb2NrKTsKK30KKwordHlwZWRlZiBlbnVtIHsKKwlMQ05fSE9MRQkJPSAtMSwJLyogS2VlcCB0aGlzIGFzIGhpZ2hlc3QgdmFsdWUgb3IgZGllISAqLworCUxDTl9STF9OT1RfTUFQUEVECT0gLTIsCisJTENOX0VOT0VOVAkJPSAtMywKK30gTENOX1NQRUNJQUxfVkFMVUVTOworCitleHRlcm4gcnVubGlzdF9lbGVtZW50ICpudGZzX3J1bmxpc3RzX21lcmdlKHJ1bmxpc3RfZWxlbWVudCAqZHJsLAorCQlydW5saXN0X2VsZW1lbnQgKnNybCk7CisKK2V4dGVybiBydW5saXN0X2VsZW1lbnQgKm50ZnNfbWFwcGluZ19wYWlyc19kZWNvbXByZXNzKGNvbnN0IG50ZnNfdm9sdW1lICp2b2wsCisJCWNvbnN0IEFUVFJfUkVDT1JEICphdHRyLCBydW5saXN0X2VsZW1lbnQgKm9sZF9ybCk7CisKK2V4dGVybiBMQ04gbnRmc19ybF92Y25fdG9fbGNuKGNvbnN0IHJ1bmxpc3RfZWxlbWVudCAqcmwsIGNvbnN0IFZDTiB2Y24pOworCitleHRlcm4gaW50IG50ZnNfZ2V0X3NpemVfZm9yX21hcHBpbmdfcGFpcnMoY29uc3QgbnRmc192b2x1bWUgKnZvbCwKKwkJY29uc3QgcnVubGlzdF9lbGVtZW50ICpybCwgY29uc3QgVkNOIHN0YXJ0X3Zjbik7CisKK2V4dGVybiBpbnQgbnRmc19tYXBwaW5nX3BhaXJzX2J1aWxkKGNvbnN0IG50ZnNfdm9sdW1lICp2b2wsIHM4ICpkc3QsCisJCWNvbnN0IGludCBkc3RfbGVuLCBjb25zdCBydW5saXN0X2VsZW1lbnQgKnJsLAorCQljb25zdCBWQ04gc3RhcnRfdmNuLCBWQ04gKmNvbnN0IHN0b3BfdmNuKTsKKworZXh0ZXJuIGludCBudGZzX3JsX3RydW5jYXRlX25vbG9jayhjb25zdCBudGZzX3ZvbHVtZSAqdm9sLAorCQlydW5saXN0ICpjb25zdCBydW5saXN0LCBjb25zdCBzNjQgbmV3X2xlbmd0aCk7CisKKyNlbmRpZiAvKiBfTElOVVhfTlRGU19SVU5MSVNUX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvc3VwZXIuYyBiL2ZzL250ZnMvc3VwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTJhM2QwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9zdXBlci5jCkBAIC0wLDAgKzEsMjc3MSBAQAorLyoKKyAqIHN1cGVyLmMgLSBOVEZTIGtlcm5lbCBzdXBlciBibG9jayBoYW5kbGluZy4gUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICogQ29weXJpZ2h0IChjKSAyMDAxLDIwMDIgUmljaGFyZCBSdXNzb24KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CS8qIEZvciBiZGV2X2hhcmRzZWN0X3NpemUoKS4gKi8KKyNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCisjaW5jbHVkZSAic3lzY3RsLmgiCisjaW5jbHVkZSAibG9nZmlsZS5oIgorI2luY2x1ZGUgInF1b3RhLmgiCisjaW5jbHVkZSAiZGlyLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJpbmRleC5oIgorI2luY2x1ZGUgImFvcHMuaCIKKyNpbmNsdWRlICJtYWxsb2MuaCIKKyNpbmNsdWRlICJudGZzLmgiCisKKy8qIE51bWJlciBvZiBtb3VudGVkIGZpbGUgc3lzdGVtcyB3aGljaCBoYXZlIGNvbXByZXNzaW9uIGVuYWJsZWQuICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBudGZzX25yX2NvbXByZXNzaW9uX3VzZXJzOworCisvKiBBIGdsb2JhbCBkZWZhdWx0IHVwY2FzZSB0YWJsZSBhbmQgYSBjb3JyZXNwb25kaW5nIHJlZmVyZW5jZSBjb3VudC4gKi8KK3N0YXRpYyBudGZzY2hhciAqZGVmYXVsdF91cGNhc2UgPSBOVUxMOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbnRmc19ucl91cGNhc2VfdXNlcnMgPSAwOworCisvKiBFcnJvciBjb25zdGFudHMvc3RyaW5ncyB1c2VkIGluIGlub2RlLmM6Om50ZnNfc2hvd19vcHRpb25zKCkuICovCit0eXBlZGVmIGVudW0geworCS8qIE9uZSBvZiB0aGVzZSBtdXN0IGJlIHByZXNlbnQsIGRlZmF1bHQgaXMgT05fRVJST1JTX0NPTlRJTlVFLiAqLworCU9OX0VSUk9SU19QQU5JQwkJCT0gMHgwMSwKKwlPTl9FUlJPUlNfUkVNT1VOVF9STwkJPSAweDAyLAorCU9OX0VSUk9SU19DT05USU5VRQkJPSAweDA0LAorCS8qIE9wdGlvbmFsLCBjYW4gYmUgY29tYmluZWQgd2l0aCBhbnkgb2YgdGhlIGFib3ZlLiAqLworCU9OX0VSUk9SU19SRUNPVkVSCQk9IDB4MTAsCit9IE9OX0VSUk9SU19BQ1RJT05TOworCitjb25zdCBvcHRpb25fdCBvbl9lcnJvcnNfYXJyW10gPSB7CisJeyBPTl9FUlJPUlNfUEFOSUMsCSJwYW5pYyIgfSwKKwl7IE9OX0VSUk9SU19SRU1PVU5UX1JPLAkicmVtb3VudC1ybyIsIH0sCisJeyBPTl9FUlJPUlNfQ09OVElOVUUsCSJjb250aW51ZSIsIH0sCisJeyBPTl9FUlJPUlNfUkVDT1ZFUiwJInJlY292ZXIiIH0sCisJeyAwLAkJCU5VTEwgfQorfTsKKworLyoqCisgKiBzaW1wbGVfZ2V0Ym9vbCAtCisgKgorICogQ29waWVkIGZyb20gb2xkIG50ZnMgZHJpdmVyICh3aGljaCBjb3BpZWQgZnJvbSB2ZmF0IGRyaXZlcikuCisgKi8KK3N0YXRpYyBpbnQgc2ltcGxlX2dldGJvb2woY2hhciAqcywgQk9PTCAqc2V0dmFsKQoreworCWlmIChzKSB7CisJCWlmICghc3RyY21wKHMsICIxIikgfHwgIXN0cmNtcChzLCAieWVzIikgfHwgIXN0cmNtcChzLCAidHJ1ZSIpKQorCQkJKnNldHZhbCA9IFRSVUU7CisJCWVsc2UgaWYgKCFzdHJjbXAocywgIjAiKSB8fCAhc3RyY21wKHMsICJubyIpIHx8CisJCQkJCQkJIXN0cmNtcChzLCAiZmFsc2UiKSkKKwkJCSpzZXR2YWwgPSBGQUxTRTsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJfSBlbHNlCisJCSpzZXR2YWwgPSBUUlVFOworCXJldHVybiAxOworfQorCisvKioKKyAqIHBhcnNlX29wdGlvbnMgLSBwYXJzZSB0aGUgKHJlKW1vdW50IG9wdGlvbnMKKyAqIEB2b2w6CW50ZnMgdm9sdW1lCisgKiBAb3B0OglzdHJpbmcgY29udGFpbmluZyB0aGUgKHJlKW1vdW50IG9wdGlvbnMKKyAqCisgKiBQYXJzZSB0aGUgcmVjb2duaXplZCBvcHRpb25zIGluIEBvcHQgZm9yIHRoZSBudGZzIHZvbHVtZSBkZXNjcmliZWQgYnkgQHZvbC4KKyAqLworc3RhdGljIEJPT0wgcGFyc2Vfb3B0aW9ucyhudGZzX3ZvbHVtZSAqdm9sLCBjaGFyICpvcHQpCit7CisJY2hhciAqcCwgKnYsICpvdjsKKwlzdGF0aWMgY2hhciAqdXRmOCA9ICJ1dGY4IjsKKwlpbnQgZXJyb3JzID0gMCwgc2xvcHB5ID0gMDsKKwl1aWRfdCB1aWQgPSAodWlkX3QpLTE7CisJZ2lkX3QgZ2lkID0gKGdpZF90KS0xOworCW1vZGVfdCBmbWFzayA9IChtb2RlX3QpLTEsIGRtYXNrID0gKG1vZGVfdCktMTsKKwlpbnQgbWZ0X3pvbmVfbXVsdGlwbGllciA9IC0xLCBvbl9lcnJvcnMgPSAtMTsKKwlpbnQgc2hvd19zeXNfZmlsZXMgPSAtMSwgY2FzZV9zZW5zaXRpdmUgPSAtMTsKKwlzdHJ1Y3QgbmxzX3RhYmxlICpubHNfbWFwID0gTlVMTCwgKm9sZF9ubHM7CisKKwkvKiBJIGFtIGxhenkuLi4gKC04ICovCisjZGVmaW5lIE5URlNfR0VUT1BUX1dJVEhfREVGQVVMVChvcHRpb24sIHZhcmlhYmxlLCBkZWZhdWx0X3ZhbHVlKQlcCisJaWYgKCFzdHJjbXAocCwgb3B0aW9uKSkgewkJCQkJXAorCQlpZiAoIXYgfHwgISp2KQkJCQkJCVwKKwkJCXZhcmlhYmxlID0gZGVmYXVsdF92YWx1ZTsJCQlcCisJCWVsc2UgewkJCQkJCQlcCisJCQl2YXJpYWJsZSA9IHNpbXBsZV9zdHJ0b3VsKG92ID0gdiwgJnYsIDApOwlcCisJCQlpZiAoKnYpCQkJCQkJXAorCQkJCWdvdG8gbmVlZHNfdmFsOwkJCQlcCisJCX0JCQkJCQkJXAorCX0KKyNkZWZpbmUgTlRGU19HRVRPUFQob3B0aW9uLCB2YXJpYWJsZSkJCQkJCVwKKwlpZiAoIXN0cmNtcChwLCBvcHRpb24pKSB7CQkJCQlcCisJCWlmICghdiB8fCAhKnYpCQkJCQkJXAorCQkJZ290byBuZWVkc19hcmc7CQkJCQlcCisJCXZhcmlhYmxlID0gc2ltcGxlX3N0cnRvdWwob3YgPSB2LCAmdiwgMCk7CQlcCisJCWlmICgqdikJCQkJCQkJXAorCQkJZ290byBuZWVkc192YWw7CQkJCQlcCisJfQorI2RlZmluZSBOVEZTX0dFVE9QVF9CT09MKG9wdGlvbiwgdmFyaWFibGUpCQkJCVwKKwlpZiAoIXN0cmNtcChwLCBvcHRpb24pKSB7CQkJCQlcCisJCUJPT0wgdmFsOwkJCQkJCVwKKwkJaWYgKCFzaW1wbGVfZ2V0Ym9vbCh2LCAmdmFsKSkJCQkJXAorCQkJZ290byBuZWVkc19ib29sOwkJCQlcCisJCXZhcmlhYmxlID0gdmFsOwkJCQkJCVwKKwl9CisjZGVmaW5lIE5URlNfR0VUT1BUX09QVElPTlNfQVJSQVkob3B0aW9uLCB2YXJpYWJsZSwgb3B0X2FycmF5KQkJXAorCWlmICghc3RyY21wKHAsIG9wdGlvbikpIHsJCQkJCVwKKwkJaW50IF9pOwkJCQkJCQlcCisJCWlmICghdiB8fCAhKnYpCQkJCQkJXAorCQkJZ290byBuZWVkc19hcmc7CQkJCQlcCisJCW92ID0gdjsJCQkJCQkJXAorCQlpZiAodmFyaWFibGUgPT0gLTEpCQkJCQlcCisJCQl2YXJpYWJsZSA9IDA7CQkJCQlcCisJCWZvciAoX2kgPSAwOyBvcHRfYXJyYXlbX2ldLnN0ciAmJiAqb3B0X2FycmF5W19pXS5zdHI7IF9pKyspIFwKKwkJCWlmICghc3RyY21wKG9wdF9hcnJheVtfaV0uc3RyLCB2KSkgewkJXAorCQkJCXZhcmlhYmxlIHw9IG9wdF9hcnJheVtfaV0udmFsOwkJXAorCQkJCWJyZWFrOwkJCQkJXAorCQkJfQkJCQkJCVwKKwkJaWYgKCFvcHRfYXJyYXlbX2ldLnN0ciB8fCAhKm9wdF9hcnJheVtfaV0uc3RyKQkJXAorCQkJZ290byBuZWVkc192YWw7CQkJCQlcCisJfQorCWlmICghb3B0IHx8ICEqb3B0KQorCQlnb3RvIG5vX21vdW50X29wdGlvbnM7CisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgd2l0aCBtb3VudCBvcHRpb25zIHN0cmluZzogJXMiLCBvcHQpOworCXdoaWxlICgocCA9IHN0cnNlcCgmb3B0LCAiLCIpKSkgeworCQlpZiAoKHYgPSBzdHJjaHIocCwgJz0nKSkpCisJCQkqdisrID0gMDsKKwkJTlRGU19HRVRPUFQoInVpZCIsIHVpZCkKKwkJZWxzZSBOVEZTX0dFVE9QVCgiZ2lkIiwgZ2lkKQorCQllbHNlIE5URlNfR0VUT1BUKCJ1bWFzayIsIGZtYXNrID0gZG1hc2spCisJCWVsc2UgTlRGU19HRVRPUFQoImZtYXNrIiwgZm1hc2spCisJCWVsc2UgTlRGU19HRVRPUFQoImRtYXNrIiwgZG1hc2spCisJCWVsc2UgTlRGU19HRVRPUFQoIm1mdF96b25lX211bHRpcGxpZXIiLCBtZnRfem9uZV9tdWx0aXBsaWVyKQorCQllbHNlIE5URlNfR0VUT1BUX1dJVEhfREVGQVVMVCgic2xvcHB5Iiwgc2xvcHB5LCBUUlVFKQorCQllbHNlIE5URlNfR0VUT1BUX0JPT0woInNob3dfc3lzX2ZpbGVzIiwgc2hvd19zeXNfZmlsZXMpCisJCWVsc2UgTlRGU19HRVRPUFRfQk9PTCgiY2FzZV9zZW5zaXRpdmUiLCBjYXNlX3NlbnNpdGl2ZSkKKwkJZWxzZSBOVEZTX0dFVE9QVF9PUFRJT05TX0FSUkFZKCJlcnJvcnMiLCBvbl9lcnJvcnMsCisJCQkJb25fZXJyb3JzX2FycikKKwkJZWxzZSBpZiAoIXN0cmNtcChwLCAicG9zaXgiKSB8fCAhc3RyY21wKHAsICJzaG93X2lub2RlcyIpKQorCQkJbnRmc193YXJuaW5nKHZvbC0+c2IsICJJZ25vcmluZyBvYnNvbGV0ZSBvcHRpb24gJXMuIiwKKwkJCQkJcCk7CisJCWVsc2UgaWYgKCFzdHJjbXAocCwgIm5scyIpIHx8ICFzdHJjbXAocCwgImlvY2hhcnNldCIpKSB7CisJCQlpZiAoIXN0cmNtcChwLCAiaW9jaGFyc2V0IikpCisJCQkJbnRmc193YXJuaW5nKHZvbC0+c2IsICJPcHRpb24gaW9jaGFyc2V0IGlzICIKKwkJCQkJCSJkZXByZWNhdGVkLiBQbGVhc2UgdXNlICIKKwkJCQkJCSJvcHRpb24gbmxzPTxjaGFyc2V0bmFtZT4gaW4gIgorCQkJCQkJInRoZSBmdXR1cmUuIik7CisJCQlpZiAoIXYgfHwgISp2KQorCQkJCWdvdG8gbmVlZHNfYXJnOwordXNlX3V0Zjg6CisJCQlvbGRfbmxzID0gbmxzX21hcDsKKwkJCW5sc19tYXAgPSBsb2FkX25scyh2KTsKKwkJCWlmICghbmxzX21hcCkgeworCQkJCWlmICghb2xkX25scykgeworCQkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJOTFMgY2hhcmFjdGVyIHNldCAiCisJCQkJCQkJIiVzIG5vdCBmb3VuZC4iLCB2KTsKKwkJCQkJcmV0dXJuIEZBTFNFOworCQkJCX0KKwkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJOTFMgY2hhcmFjdGVyIHNldCAlcyBub3QgIgorCQkJCQkJImZvdW5kLiBVc2luZyBwcmV2aW91cyBvbmUgJXMuIiwKKwkJCQkJCXYsIG9sZF9ubHMtPmNoYXJzZXQpOworCQkJCW5sc19tYXAgPSBvbGRfbmxzOworCQkJfSBlbHNlIC8qIG5sc19tYXAgKi8geworCQkJCWlmIChvbGRfbmxzKQorCQkJCQl1bmxvYWRfbmxzKG9sZF9ubHMpOworCQkJfQorCQl9IGVsc2UgaWYgKCFzdHJjbXAocCwgInV0ZjgiKSkgeworCQkJQk9PTCB2YWwgPSBGQUxTRTsKKwkJCW50ZnNfd2FybmluZyh2b2wtPnNiLCAiT3B0aW9uIHV0ZjggaXMgbm8gbG9uZ2VyICIKKwkJCQkgICAic3VwcG9ydGVkLCB1c2luZyBvcHRpb24gbmxzPXV0ZjguIFBsZWFzZSAiCisJCQkJICAgInVzZSBvcHRpb24gbmxzPXV0ZjggaW4gdGhlIGZ1dHVyZSBhbmQgIgorCQkJCSAgICJtYWtlIHN1cmUgdXRmOCBpcyBjb21waWxlZCBlaXRoZXIgYXMgYSAiCisJCQkJICAgIm1vZHVsZSBvciBpbnRvIHRoZSBrZXJuZWwuIik7CisJCQlpZiAoIXYgfHwgISp2KQorCQkJCXZhbCA9IFRSVUU7CisJCQllbHNlIGlmICghc2ltcGxlX2dldGJvb2wodiwgJnZhbCkpCisJCQkJZ290byBuZWVkc19ib29sOworCQkJaWYgKHZhbCkgeworCQkJCXYgPSB1dGY4OworCQkJCWdvdG8gdXNlX3V0Zjg7CisJCQl9CisJCX0gZWxzZSB7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJVbnJlY29nbml6ZWQgbW91bnQgb3B0aW9uICVzLiIsIHApOworCQkJaWYgKGVycm9ycyA8IElOVF9NQVgpCisJCQkJZXJyb3JzKys7CisJCX0KKyN1bmRlZiBOVEZTX0dFVE9QVF9PUFRJT05TX0FSUkFZCisjdW5kZWYgTlRGU19HRVRPUFRfQk9PTAorI3VuZGVmIE5URlNfR0VUT1BUCisjdW5kZWYgTlRGU19HRVRPUFRfV0lUSF9ERUZBVUxUCisJfQorbm9fbW91bnRfb3B0aW9uczoKKwlpZiAoZXJyb3JzICYmICFzbG9wcHkpCisJCXJldHVybiBGQUxTRTsKKwlpZiAoc2xvcHB5KQorCQludGZzX3dhcm5pbmcodm9sLT5zYiwgIlNsb3BweSBvcHRpb24gZ2l2ZW4uIElnbm9yaW5nICIKKwkJCQkidW5yZWNvZ25pemVkIG1vdW50IG9wdGlvbihzKSBhbmQgY29udGludWluZy4iKTsKKwkvKiBLZWVwIHRoaXMgZmlyc3QhICovCisJaWYgKG9uX2Vycm9ycyAhPSAtMSkgeworCQlpZiAoIW9uX2Vycm9ycykgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiSW52YWxpZCBlcnJvcnMgb3B0aW9uIGFyZ3VtZW50ICIKKwkJCQkJIm9yIGJ1ZyBpbiBvcHRpb25zIHBhcnNlci4iKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCX0KKwlpZiAobmxzX21hcCkgeworCQlpZiAodm9sLT5ubHNfbWFwICYmIHZvbC0+bmxzX21hcCAhPSBubHNfbWFwKSB7CisJCQludGZzX2Vycm9yKHZvbC0+c2IsICJDYW5ub3QgY2hhbmdlIE5MUyBjaGFyYWN0ZXIgc2V0ICIKKwkJCQkJIm9uIHJlbW91bnQuIik7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0gLyogZWxzZSAoIXZvbC0+bmxzX21hcCkgKi8KKwkJbnRmc19kZWJ1ZygiVXNpbmcgTkxTIGNoYXJhY3RlciBzZXQgJXMuIiwgbmxzX21hcC0+Y2hhcnNldCk7CisJCXZvbC0+bmxzX21hcCA9IG5sc19tYXA7CisJfSBlbHNlIC8qICghbmxzX21hcCkgKi8geworCQlpZiAoIXZvbC0+bmxzX21hcCkgeworCQkJdm9sLT5ubHNfbWFwID0gbG9hZF9ubHNfZGVmYXVsdCgpOworCQkJaWYgKCF2b2wtPm5sc19tYXApIHsKKwkJCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gbG9hZCBkZWZhdWx0ICIKKwkJCQkJCSJOTFMgY2hhcmFjdGVyIHNldC4iKTsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCQludGZzX2RlYnVnKCJVc2luZyBkZWZhdWx0IE5MUyBjaGFyYWN0ZXIgc2V0ICglcykuIiwKKwkJCQkJdm9sLT5ubHNfbWFwLT5jaGFyc2V0KTsKKwkJfQorCX0KKwlpZiAobWZ0X3pvbmVfbXVsdGlwbGllciAhPSAtMSkgeworCQlpZiAodm9sLT5tZnRfem9uZV9tdWx0aXBsaWVyICYmIHZvbC0+bWZ0X3pvbmVfbXVsdGlwbGllciAhPQorCQkJCW1mdF96b25lX211bHRpcGxpZXIpIHsKKwkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkNhbm5vdCBjaGFuZ2UgbWZ0X3pvbmVfbXVsdGlwbGllciAiCisJCQkJCSJvbiByZW1vdW50LiIpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJCWlmIChtZnRfem9uZV9tdWx0aXBsaWVyIDwgMSB8fCBtZnRfem9uZV9tdWx0aXBsaWVyID4gNCkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiSW52YWxpZCBtZnRfem9uZV9tdWx0aXBsaWVyLiAiCisJCQkJCSJVc2luZyBkZWZhdWx0IHZhbHVlLCBpLmUuIDEuIik7CisJCQltZnRfem9uZV9tdWx0aXBsaWVyID0gMTsKKwkJfQorCQl2b2wtPm1mdF96b25lX211bHRpcGxpZXIgPSBtZnRfem9uZV9tdWx0aXBsaWVyOworCX0KKwlpZiAoIXZvbC0+bWZ0X3pvbmVfbXVsdGlwbGllcikKKwkJdm9sLT5tZnRfem9uZV9tdWx0aXBsaWVyID0gMTsKKwlpZiAob25fZXJyb3JzICE9IC0xKQorCQl2b2wtPm9uX2Vycm9ycyA9IG9uX2Vycm9yczsKKwlpZiAoIXZvbC0+b25fZXJyb3JzIHx8IHZvbC0+b25fZXJyb3JzID09IE9OX0VSUk9SU19SRUNPVkVSKQorCQl2b2wtPm9uX2Vycm9ycyB8PSBPTl9FUlJPUlNfQ09OVElOVUU7CisJaWYgKHVpZCAhPSAodWlkX3QpLTEpCisJCXZvbC0+dWlkID0gdWlkOworCWlmIChnaWQgIT0gKGdpZF90KS0xKQorCQl2b2wtPmdpZCA9IGdpZDsKKwlpZiAoZm1hc2sgIT0gKG1vZGVfdCktMSkKKwkJdm9sLT5mbWFzayA9IGZtYXNrOworCWlmIChkbWFzayAhPSAobW9kZV90KS0xKQorCQl2b2wtPmRtYXNrID0gZG1hc2s7CisJaWYgKHNob3dfc3lzX2ZpbGVzICE9IC0xKSB7CisJCWlmIChzaG93X3N5c19maWxlcykKKwkJCU5Wb2xTZXRTaG93U3lzdGVtRmlsZXModm9sKTsKKwkJZWxzZQorCQkJTlZvbENsZWFyU2hvd1N5c3RlbUZpbGVzKHZvbCk7CisJfQorCWlmIChjYXNlX3NlbnNpdGl2ZSAhPSAtMSkgeworCQlpZiAoY2FzZV9zZW5zaXRpdmUpCisJCQlOVm9sU2V0Q2FzZVNlbnNpdGl2ZSh2b2wpOworCQllbHNlCisJCQlOVm9sQ2xlYXJDYXNlU2Vuc2l0aXZlKHZvbCk7CisJfQorCXJldHVybiBUUlVFOworbmVlZHNfYXJnOgorCW50ZnNfZXJyb3Iodm9sLT5zYiwgIlRoZSAlcyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQuIiwgcCk7CisJcmV0dXJuIEZBTFNFOworbmVlZHNfYm9vbDoKKwludGZzX2Vycm9yKHZvbC0+c2IsICJUaGUgJXMgb3B0aW9uIHJlcXVpcmVzIGEgYm9vbGVhbiBhcmd1bWVudC4iLCBwKTsKKwlyZXR1cm4gRkFMU0U7CituZWVkc192YWw6CisJbnRmc19lcnJvcih2b2wtPnNiLCAiSW52YWxpZCAlcyBvcHRpb24gYXJndW1lbnQ6ICVzIiwgcCwgb3YpOworCXJldHVybiBGQUxTRTsKK30KKworI2lmZGVmIE5URlNfUlcKKworLyoqCisgKiBudGZzX3dyaXRlX3ZvbHVtZV9mbGFncyAtIHdyaXRlIG5ldyBmbGFncyB0byB0aGUgdm9sdW1lIGluZm9ybWF0aW9uIGZsYWdzCisgKiBAdm9sOgludGZzIHZvbHVtZSBvbiB3aGljaCB0byBtb2RpZnkgdGhlIGZsYWdzCisgKiBAZmxhZ3M6CW5ldyBmbGFncyB2YWx1ZSBmb3IgdGhlIHZvbHVtZSBpbmZvcm1hdGlvbiBmbGFncworICoKKyAqIEludGVybmFsIGZ1bmN0aW9uLiAgWW91IHByb2JhYmx5IHdhbnQgdG8gdXNlIG50ZnNfe3NldCxjbGVhcn1fdm9sdW1lX2ZsYWdzKCkKKyAqIGluc3RlYWQgKHNlZSBiZWxvdykuCisgKgorICogUmVwbGFjZSB0aGUgdm9sdW1lIGluZm9ybWF0aW9uIGZsYWdzIG9uIHRoZSB2b2x1bWUgQHZvbCB3aXRoIHRoZSB2YWx1ZQorICogc3VwcGxpZWQgaW4gQGZsYWdzLiAgTm90ZSwgdGhpcyBvdmVyd3JpdGVzIHRoZSB2b2x1bWUgaW5mb3JtYXRpb24gZmxhZ3MsIHNvCisgKiBtYWtlIHN1cmUgdG8gY29tYmluZSB0aGUgZmxhZ3MgeW91IHdhbnQgdG8gbW9kaWZ5IHdpdGggdGhlIG9sZCBmbGFncyBhbmQgdXNlCisgKiB0aGUgcmVzdWx0IHdoZW4gY2FsbGluZyBudGZzX3dyaXRlX3ZvbHVtZV9mbGFncygpLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MgYW5kIC1lcnJubyBvbiBlcnJvci4KKyAqLworc3RhdGljIGludCBudGZzX3dyaXRlX3ZvbHVtZV9mbGFncyhudGZzX3ZvbHVtZSAqdm9sLCBjb25zdCBWT0xVTUVfRkxBR1MgZmxhZ3MpCit7CisJbnRmc19pbm9kZSAqbmkgPSBOVEZTX0kodm9sLT52b2xfaW5vKTsKKwlNRlRfUkVDT1JEICptOworCVZPTFVNRV9JTkZPUk1BVElPTiAqdmk7CisJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eDsKKwlpbnQgZXJyOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcsIG9sZCBmbGFncyA9IDB4JXgsIG5ldyBmbGFncyA9IDB4JXguIiwKKwkJCWxlMTZfdG9fY3B1KHZvbC0+dm9sX2ZsYWdzKSwgbGUxNl90b19jcHUoZmxhZ3MpKTsKKwlpZiAodm9sLT52b2xfZmxhZ3MgPT0gZmxhZ3MpCisJCWdvdG8gZG9uZTsKKwlCVUdfT04oIW5pKTsKKwltID0gbWFwX21mdF9yZWNvcmQobmkpOworCWlmIChJU19FUlIobSkpIHsKKwkJZXJyID0gUFRSX0VSUihtKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwljdHggPSBudGZzX2F0dHJfZ2V0X3NlYXJjaF9jdHgobmksIG0pOworCWlmICghY3R4KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gcHV0X3VubV9lcnJfb3V0OworCX0KKwllcnIgPSBudGZzX2F0dHJfbG9va3VwKEFUX1ZPTFVNRV9JTkZPUk1BVElPTiwgTlVMTCwgMCwgMCwgMCwgTlVMTCwgMCwKKwkJCWN0eCk7CisJaWYgKGVycikKKwkJZ290byBwdXRfdW5tX2Vycl9vdXQ7CisJdmkgPSAoVk9MVU1FX0lORk9STUFUSU9OKikoKHU4KiljdHgtPmF0dHIgKworCQkJbGUxNl90b19jcHUoY3R4LT5hdHRyLT5kYXRhLnJlc2lkZW50LnZhbHVlX29mZnNldCkpOworCXZvbC0+dm9sX2ZsYWdzID0gdmktPmZsYWdzID0gZmxhZ3M7CisJZmx1c2hfZGNhY2hlX21mdF9yZWNvcmRfcGFnZShjdHgtPm50ZnNfaW5vKTsKKwltYXJrX21mdF9yZWNvcmRfZGlydHkoY3R4LT5udGZzX2lubyk7CisJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJdW5tYXBfbWZ0X3JlY29yZChuaSk7Citkb25lOgorCW50ZnNfZGVidWcoIkRvbmUuIik7CisJcmV0dXJuIDA7CitwdXRfdW5tX2Vycl9vdXQ6CisJaWYgKGN0eCkKKwkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CisJdW5tYXBfbWZ0X3JlY29yZChuaSk7CitlcnJfb3V0OgorCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJWkuIiwgLWVycik7CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBudGZzX3NldF92b2x1bWVfZmxhZ3MgLSBzZXQgYml0cyBpbiB0aGUgdm9sdW1lIGluZm9ybWF0aW9uIGZsYWdzCisgKiBAdm9sOgludGZzIHZvbHVtZSBvbiB3aGljaCB0byBtb2RpZnkgdGhlIGZsYWdzCisgKiBAZmxhZ3M6CWZsYWdzIHRvIHNldCBvbiB0aGUgdm9sdW1lCisgKgorICogU2V0IHRoZSBiaXRzIGluIEBmbGFncyBpbiB0aGUgdm9sdW1lIGluZm9ybWF0aW9uIGZsYWdzIG9uIHRoZSB2b2x1bWUgQHZvbC4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG50ZnNfc2V0X3ZvbHVtZV9mbGFncyhudGZzX3ZvbHVtZSAqdm9sLCBWT0xVTUVfRkxBR1MgZmxhZ3MpCit7CisJZmxhZ3MgJj0gVk9MVU1FX0ZMQUdTX01BU0s7CisJcmV0dXJuIG50ZnNfd3JpdGVfdm9sdW1lX2ZsYWdzKHZvbCwgdm9sLT52b2xfZmxhZ3MgfCBmbGFncyk7Cit9CisKKy8qKgorICogbnRmc19jbGVhcl92b2x1bWVfZmxhZ3MgLSBjbGVhciBiaXRzIGluIHRoZSB2b2x1bWUgaW5mb3JtYXRpb24gZmxhZ3MKKyAqIEB2b2w6CW50ZnMgdm9sdW1lIG9uIHdoaWNoIHRvIG1vZGlmeSB0aGUgZmxhZ3MKKyAqIEBmbGFnczoJZmxhZ3MgdG8gY2xlYXIgb24gdGhlIHZvbHVtZQorICoKKyAqIENsZWFyIHRoZSBiaXRzIGluIEBmbGFncyBpbiB0aGUgdm9sdW1lIGluZm9ybWF0aW9uIGZsYWdzIG9uIHRoZSB2b2x1bWUgQHZvbC4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCAtZXJybm8gb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG50ZnNfY2xlYXJfdm9sdW1lX2ZsYWdzKG50ZnNfdm9sdW1lICp2b2wsIFZPTFVNRV9GTEFHUyBmbGFncykKK3sKKwlmbGFncyAmPSBWT0xVTUVfRkxBR1NfTUFTSzsKKwlmbGFncyA9IHZvbC0+dm9sX2ZsYWdzICYgY3B1X3RvX2xlMTYofmxlMTZfdG9fY3B1KGZsYWdzKSk7CisJcmV0dXJuIG50ZnNfd3JpdGVfdm9sdW1lX2ZsYWdzKHZvbCwgZmxhZ3MpOworfQorCisjZW5kaWYgLyogTlRGU19SVyAqLworCisvKioKKyAqIG50ZnNfcmVtb3VudCAtIGNoYW5nZSB0aGUgbW91bnQgb3B0aW9ucyBvZiBhIG1vdW50ZWQgbnRmcyBmaWxlc3lzdGVtCisgKiBAc2I6CQlzdXBlcmJsb2NrIG9mIG1vdW50ZWQgbnRmcyBmaWxlc3lzdGVtCisgKiBAZmxhZ3M6CXJlbW91bnQgZmxhZ3MKKyAqIEBvcHQ6CXJlbW91bnQgb3B0aW9ucyBzdHJpbmcKKyAqCisgKiBDaGFuZ2UgdGhlIG1vdW50IG9wdGlvbnMgb2YgYW4gYWxyZWFkeSBtb3VudGVkIG50ZnMgZmlsZXN5c3RlbS4KKyAqCisgKiBOT1RFOiAgVGhlIFZGUyBzZXRzIHRoZSBAc2ItPnNfZmxhZ3MgcmVtb3VudCBmbGFncyB0byBAZmxhZ3MgYWZ0ZXIKKyAqIG50ZnNfcmVtb3VudCgpIHJldHVybnMgc3VjY2Vzc2Z1bGx5IChpLmUuIHJldHVybnMgMCkuICBPdGhlcndpc2UsCisgKiBAc2ItPnNfZmxhZ3MgYXJlIG5vdCBjaGFuZ2VkLgorICovCitzdGF0aWMgaW50IG50ZnNfcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpvcHQpCit7CisJbnRmc192b2x1bWUgKnZvbCA9IE5URlNfU0Ioc2IpOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgd2l0aCByZW1vdW50IG9wdGlvbnMgc3RyaW5nOiAlcyIsIG9wdCk7CisjaWZuZGVmIE5URlNfUlcKKwkvKiBGb3IgcmVhZC1vbmx5IGNvbXBpbGVkIGRyaXZlciwgZW5mb3JjZSBhbGwgcmVhZC1vbmx5IGZsYWdzLiAqLworCSpmbGFncyB8PSBNU19SRE9OTFkgfCBNU19OT0FUSU1FIHwgTVNfTk9ESVJBVElNRTsKKyNlbHNlIC8qIE5URlNfUlcgKi8KKwkvKgorCSAqIEZvciB0aGUgcmVhZC13cml0ZSBjb21waWxlZCBkcml2ZXIsIGlmIHdlIGFyZSByZW1vdW50aW5nIHJlYWQtd3JpdGUsCisJICogbWFrZSBzdXJlIHRoZXJlIGFyZSBubyB2b2x1bWUgZXJyb3JzIGFuZCB0aGF0IG5vIHVuc3VwcG9ydGVkIHZvbHVtZQorCSAqIGZsYWdzIGFyZSBzZXQuICBBbHNvLCBlbXB0eSB0aGUgbG9nZmlsZSBqb3VybmFsIGFzIGl0IHdvdWxkIGJlY29tZQorCSAqIHN0YWxlIGFzIHNvb24gYXMgc29tZXRoaW5nIGlzIHdyaXR0ZW4gdG8gdGhlIHZvbHVtZSBhbmQgbWFyayB0aGUKKwkgKiB2b2x1bWUgZGlydHkgc28gdGhhdCBjaGtkc2sgaXMgcnVuIGlmIHRoZSB2b2x1bWUgaXMgbm90IHVtb3VudGVkCisJICogY2xlYW5seS4gIEZpbmFsbHksIG1hcmsgdGhlIHF1b3RhcyBvdXQgb2YgZGF0ZSBzbyBXaW5kb3dzIHJlc2NhbnMKKwkgKiB0aGUgdm9sdW1lIG9uIGJvb3QgYW5kIHVwZGF0ZXMgdGhlbS4KKwkgKgorCSAqIFdoZW4gcmVtb3VudGluZyByZWFkLW9ubHksIG1hcmsgdGhlIHZvbHVtZSBjbGVhbiBpZiBubyB2b2x1bWUgZXJyb3JzCisJICogaGF2ZSBvY2N1cmVkLgorCSAqLworCWlmICgoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpICYmICEoKmZsYWdzICYgTVNfUkRPTkxZKSkgeworCQlzdGF0aWMgY29uc3QgY2hhciAqZXMgPSAiLiAgQ2Fubm90IHJlbW91bnQgcmVhZC13cml0ZS4iOworCisJCS8qIFJlbW91bnRpbmcgcmVhZC13cml0ZS4gKi8KKwkJaWYgKE5Wb2xFcnJvcnModm9sKSkgeworCQkJbnRmc19lcnJvcihzYiwgIlZvbHVtZSBoYXMgZXJyb3JzIGFuZCBpcyByZWFkLW9ubHklcyIsCisJCQkJCWVzKTsKKwkJCXJldHVybiAtRVJPRlM7CisJCX0KKwkJaWYgKHZvbC0+dm9sX2ZsYWdzICYgVk9MVU1FX0lTX0RJUlRZKSB7CisJCQludGZzX2Vycm9yKHNiLCAiVm9sdW1lIGlzIGRpcnR5IGFuZCByZWFkLW9ubHklcyIsIGVzKTsKKwkJCXJldHVybiAtRVJPRlM7CisJCX0KKwkJaWYgKHZvbC0+dm9sX2ZsYWdzICYgVk9MVU1FX01VU1RfTU9VTlRfUk9fTUFTSykgeworCQkJbnRmc19lcnJvcihzYiwgIlZvbHVtZSBoYXMgdW5zdXBwb3J0ZWQgZmxhZ3Mgc2V0IGFuZCAiCisJCQkJCSJpcyByZWFkLW9ubHklcyIsIGVzKTsKKwkJCXJldHVybiAtRVJPRlM7CisJCX0KKwkJaWYgKG50ZnNfc2V0X3ZvbHVtZV9mbGFncyh2b2wsIFZPTFVNRV9JU19ESVJUWSkpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gc2V0IGRpcnR5IGJpdCBpbiB2b2x1bWUgIgorCQkJCQkiaW5mb3JtYXRpb24gZmxhZ3MlcyIsIGVzKTsKKwkJCXJldHVybiAtRVJPRlM7CisJCX0KKyNpZiAwCisJCS8vIFRPRE86IEVuYWJsZSB0aGlzIGNvZGUgb25jZSB3ZSBzdGFydCBtb2RpZnlpbmcgYW55dGhpbmcgdGhhdAorCQkvLwkgaXMgZGlmZmVyZW50IGJldHdlZW4gTlRGUyAxLjIgYW5kIDMueC4uLgorCQkvKiBTZXQgTlQ0IGNvbXBhdGliaWxpdHkgZmxhZyBvbiBuZXdlciBOVEZTIHZlcnNpb24gdm9sdW1lcy4gKi8KKwkJaWYgKCh2b2wtPm1ham9yX3ZlciA+IDEpKSB7CisJCQlpZiAobnRmc19zZXRfdm9sdW1lX2ZsYWdzKHZvbCwgVk9MVU1FX01PVU5URURfT05fTlQ0KSkgeworCQkJCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gc2V0IE5UNCAiCisJCQkJCQkiY29tcGF0aWJpbGl0eSBmbGFnJXMiLCBlcyk7CisJCQkJTlZvbFNldEVycm9ycyh2b2wpOworCQkJCXJldHVybiAtRVJPRlM7CisJCQl9CisJCX0KKyNlbmRpZgorCQlpZiAoIW50ZnNfZW1wdHlfbG9nZmlsZSh2b2wtPmxvZ2ZpbGVfaW5vKSkgeworCQkJbnRmc19lcnJvcihzYiwgIkZhaWxlZCB0byBlbXB0eSBqb3VybmFsICRMb2dGaWxlJXMiLAorCQkJCQllcyk7CisJCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJCQlyZXR1cm4gLUVST0ZTOworCQl9CisJCWlmICghbnRmc19tYXJrX3F1b3Rhc19vdXRfb2ZfZGF0ZSh2b2wpKSB7CisJCQludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIG1hcmsgcXVvdGFzIG91dCBvZiBkYXRlJXMiLAorCQkJCQllcyk7CisJCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJCQlyZXR1cm4gLUVST0ZTOworCQl9CisJfSBlbHNlIGlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSAmJiAoKmZsYWdzICYgTVNfUkRPTkxZKSkgeworCQkvKiBSZW1vdW50aW5nIHJlYWQtb25seS4gKi8KKwkJaWYgKCFOVm9sRXJyb3JzKHZvbCkpIHsKKwkJCWlmIChudGZzX2NsZWFyX3ZvbHVtZV9mbGFncyh2b2wsIFZPTFVNRV9JU19ESVJUWSkpCisJCQkJbnRmc193YXJuaW5nKHNiLCAiRmFpbGVkIHRvIGNsZWFyIGRpcnR5IGJpdCAiCisJCQkJCQkiaW4gdm9sdW1lIGluZm9ybWF0aW9uICIKKwkJCQkJCSJmbGFncy4gIFJ1biBjaGtkc2suIik7CisJCX0KKwl9CisjZW5kaWYgLyogTlRGU19SVyAqLworCisJLy8gVE9ETzogRGVhbCB3aXRoICpmbGFncy4KKworCWlmICghcGFyc2Vfb3B0aW9ucyh2b2wsIG9wdCkpCisJCXJldHVybiAtRUlOVkFMOworCW50ZnNfZGVidWcoIkRvbmUuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXNfYm9vdF9zZWN0b3JfbnRmcyAtIGNoZWNrIHdoZXRoZXIgYSBib290IHNlY3RvciBpcyBhIHZhbGlkIE5URlMgYm9vdCBzZWN0b3IKKyAqIEBzYjoJCVN1cGVyIGJsb2NrIG9mIHRoZSBkZXZpY2UgdG8gd2hpY2ggQGIgYmVsb25ncy4KKyAqIEBiOgkJQm9vdCBzZWN0b3Igb2YgZGV2aWNlIEBzYiB0byBjaGVjay4KKyAqIEBzaWxlbnQ6CUlmIFRSVUUsIGFsbCBvdXRwdXQgd2lsbCBiZSBzaWxlbmNlZC4KKyAqCisgKiBpc19ib290X3NlY3Rvcl9udGZzKCkgY2hlY2tzIHdoZXRoZXIgdGhlIGJvb3Qgc2VjdG9yIEBiIGlzIGEgdmFsaWQgTlRGUyBib290CisgKiBzZWN0b3IuIFJldHVybnMgVFJVRSBpZiBpdCBpcyB2YWxpZCBhbmQgRkFMU0UgaWYgbm90LgorICoKKyAqIEBzYiBpcyBvbmx5IG5lZWRlZCBmb3Igd2FybmluZy9lcnJvciBvdXRwdXQsIGkuZS4gaXQgY2FuIGJlIE5VTEwgd2hlbiBzaWxlbnQKKyAqIGlzIFRSVUUuCisgKi8KK3N0YXRpYyBCT09MIGlzX2Jvb3Rfc2VjdG9yX250ZnMoY29uc3Qgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJY29uc3QgTlRGU19CT09UX1NFQ1RPUiAqYiwgY29uc3QgQk9PTCBzaWxlbnQpCit7CisJLyoKKwkgKiBDaGVjayB0aGF0IGNoZWNrc3VtID09IHN1bSBvZiB1MzIgdmFsdWVzIGZyb20gYiB0byB0aGUgY2hlY2tzdW0KKwkgKiBmaWVsZC4gSWYgY2hlY2tzdW0gaXMgemVybywgbm8gY2hlY2tpbmcgaXMgZG9uZS4KKwkgKi8KKwlpZiAoKHZvaWQqKWIgPCAodm9pZCopJmItPmNoZWNrc3VtICYmIGItPmNoZWNrc3VtKSB7CisJCWxlMzIgKnU7CisJCXUzMiBpOworCisJCWZvciAoaSA9IDAsIHUgPSAobGUzMiopYjsgdSA8IChsZTMyKikoJmItPmNoZWNrc3VtKTsgKyt1KQorCQkJaSArPSBsZTMyX3RvX2NwdXAodSk7CisJCWlmIChsZTMyX3RvX2NwdShiLT5jaGVja3N1bSkgIT0gaSkKKwkJCWdvdG8gbm90X250ZnM7CisJfQorCS8qIENoZWNrIE9FTWlkZW50aWZpZXIgaXMgIk5URlMgICAgIiAqLworCWlmIChiLT5vZW1faWQgIT0gbWFnaWNOVEZTKQorCQlnb3RvIG5vdF9udGZzOworCS8qIENoZWNrIGJ5dGVzIHBlciBzZWN0b3IgdmFsdWUgaXMgYmV0d2VlbiAyNTYgYW5kIDQwOTYuICovCisJaWYgKGxlMTZfdG9fY3B1KGItPmJwYi5ieXRlc19wZXJfc2VjdG9yKSA8IDB4MTAwIHx8CisJCQlsZTE2X3RvX2NwdShiLT5icGIuYnl0ZXNfcGVyX3NlY3RvcikgPiAweDEwMDApCisJCWdvdG8gbm90X250ZnM7CisJLyogQ2hlY2sgc2VjdG9ycyBwZXIgY2x1c3RlciB2YWx1ZSBpcyB2YWxpZC4gKi8KKwlzd2l0Y2ggKGItPmJwYi5zZWN0b3JzX3Blcl9jbHVzdGVyKSB7CisJY2FzZSAxOiBjYXNlIDI6IGNhc2UgNDogY2FzZSA4OiBjYXNlIDE2OiBjYXNlIDMyOiBjYXNlIDY0OiBjYXNlIDEyODoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byBub3RfbnRmczsKKwl9CisJLyogQ2hlY2sgdGhlIGNsdXN0ZXIgc2l6ZSBpcyBub3QgYWJvdmUgNjU1MzYgYnl0ZXMuICovCisJaWYgKCh1MzIpbGUxNl90b19jcHUoYi0+YnBiLmJ5dGVzX3Blcl9zZWN0b3IpICoKKwkJCWItPmJwYi5zZWN0b3JzX3Blcl9jbHVzdGVyID4gMHgxMDAwMCkKKwkJZ290byBub3RfbnRmczsKKwkvKiBDaGVjayByZXNlcnZlZC91bnVzZWQgZmllbGRzIGFyZSByZWFsbHkgemVyby4gKi8KKwlpZiAobGUxNl90b19jcHUoYi0+YnBiLnJlc2VydmVkX3NlY3RvcnMpIHx8CisJCQlsZTE2X3RvX2NwdShiLT5icGIucm9vdF9lbnRyaWVzKSB8fAorCQkJbGUxNl90b19jcHUoYi0+YnBiLnNlY3RvcnMpIHx8CisJCQlsZTE2X3RvX2NwdShiLT5icGIuc2VjdG9yc19wZXJfZmF0KSB8fAorCQkJbGUzMl90b19jcHUoYi0+YnBiLmxhcmdlX3NlY3RvcnMpIHx8IGItPmJwYi5mYXRzKQorCQlnb3RvIG5vdF9udGZzOworCS8qIENoZWNrIGNsdXN0ZXJzIHBlciBmaWxlIG1mdCByZWNvcmQgdmFsdWUgaXMgdmFsaWQuICovCisJaWYgKCh1OCliLT5jbHVzdGVyc19wZXJfbWZ0X3JlY29yZCA8IDB4ZTEgfHwKKwkJCSh1OCliLT5jbHVzdGVyc19wZXJfbWZ0X3JlY29yZCA+IDB4ZjcpCisJCXN3aXRjaCAoYi0+Y2x1c3RlcnNfcGVyX21mdF9yZWNvcmQpIHsKKwkJY2FzZSAxOiBjYXNlIDI6IGNhc2UgNDogY2FzZSA4OiBjYXNlIDE2OiBjYXNlIDMyOiBjYXNlIDY0OgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIG5vdF9udGZzOworCQl9CisJLyogQ2hlY2sgY2x1c3RlcnMgcGVyIGluZGV4IGJsb2NrIHZhbHVlIGlzIHZhbGlkLiAqLworCWlmICgodTgpYi0+Y2x1c3RlcnNfcGVyX2luZGV4X3JlY29yZCA8IDB4ZTEgfHwKKwkJCSh1OCliLT5jbHVzdGVyc19wZXJfaW5kZXhfcmVjb3JkID4gMHhmNykKKwkJc3dpdGNoIChiLT5jbHVzdGVyc19wZXJfaW5kZXhfcmVjb3JkKSB7CisJCWNhc2UgMTogY2FzZSAyOiBjYXNlIDQ6IGNhc2UgODogY2FzZSAxNjogY2FzZSAzMjogY2FzZSA2NDoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBub3RfbnRmczsKKwkJfQorCS8qCisJICogQ2hlY2sgZm9yIHZhbGlkIGVuZCBvZiBzZWN0b3IgbWFya2VyLiBXZSB3aWxsIHdvcmsgd2l0aG91dCBpdCwgYnV0CisJICogbWFueSBCSU9TZXMgd2lsbCByZWZ1c2UgdG8gYm9vdCBmcm9tIGEgYm9vdHNlY3RvciBpZiB0aGUgbWFnaWMgaXMKKwkgKiBpbmNvcnJlY3QsIHNvIHdlIGVtaXQgYSB3YXJuaW5nLgorCSAqLworCWlmICghc2lsZW50ICYmIGItPmVuZF9vZl9zZWN0b3JfbWFya2VyICE9IGNwdV90b19sZTE2KDB4YWE1NSkpCisJCW50ZnNfd2FybmluZyhzYiwgIkludmFsaWQgZW5kIG9mIHNlY3RvciBtYXJrZXIuIik7CisJcmV0dXJuIFRSVUU7Citub3RfbnRmczoKKwlyZXR1cm4gRkFMU0U7Cit9CisKKy8qKgorICogcmVhZF9udGZzX2Jvb3Rfc2VjdG9yIC0gcmVhZCB0aGUgTlRGUyBib290IHNlY3RvciBvZiBhIGRldmljZQorICogQHNiOgkJc3VwZXIgYmxvY2sgb2YgZGV2aWNlIHRvIHJlYWQgdGhlIGJvb3Qgc2VjdG9yIGZyb20KKyAqIEBzaWxlbnQ6CWlmIHRydWUsIHN1cHByZXNzIGFsbCBvdXRwdXQKKyAqCisgKiBSZWFkcyB0aGUgYm9vdCBzZWN0b3IgZnJvbSB0aGUgZGV2aWNlIGFuZCB2YWxpZGF0ZXMgaXQuIElmIHRoYXQgZmFpbHMsIHRyaWVzCisgKiB0byByZWFkIHRoZSBiYWNrdXAgYm9vdCBzZWN0b3IsIGZpcnN0IGZyb20gdGhlIGVuZCBvZiB0aGUgZGV2aWNlIGEtbGEgTlQ0IGFuZAorICogbGF0ZXIgYW5kIHRoZW4gZnJvbSB0aGUgbWlkZGxlIG9mIHRoZSBkZXZpY2UgYS1sYSBOVDMuNTEgYW5kIGJlZm9yZS4KKyAqCisgKiBJZiBhIHZhbGlkIGJvb3Qgc2VjdG9yIGlzIGZvdW5kIGJ1dCBpdCBpcyBub3QgdGhlIHByaW1hcnkgYm9vdCBzZWN0b3IsIHdlCisgKiByZXBhaXIgdGhlIHByaW1hcnkgYm9vdCBzZWN0b3Igc2lsZW50bHkgKHVubGVzcyB0aGUgZGV2aWNlIGlzIHJlYWQtb25seSBvcgorICogdGhlIHByaW1hcnkgYm9vdCBzZWN0b3IgaXMgbm90IGFjY2Vzc2libGUpLgorICoKKyAqIE5PVEU6IFRvIGNhbGwgdGhpcyBmdW5jdGlvbiwgQHNiIG11c3QgaGF2ZSB0aGUgZmllbGRzIHNfZGV2LCB0aGUgbnRmcyBzdXBlcgorICogYmxvY2sgKHUubnRmc19zYiksIG5yX2Jsb2NrcyBhbmQgdGhlIGRldmljZSBmbGFncyAoc19mbGFncykgaW5pdGlhbGl6ZWQKKyAqIHRvIHRoZWlyIHJlc3BlY3RpdmUgdmFsdWVzLgorICoKKyAqIFJldHVybiB0aGUgdW5sb2NrZWQgYnVmZmVyIGhlYWQgY29udGFpbmluZyB0aGUgYm9vdCBzZWN0b3Igb3IgTlVMTCBvbiBlcnJvci4KKyAqLworc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqcmVhZF9udGZzX2Jvb3Rfc2VjdG9yKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCWNvbnN0IGludCBzaWxlbnQpCit7CisJY29uc3QgY2hhciAqcmVhZF9lcnJfc3RyID0gIlVuYWJsZSB0byByZWFkICVzIGJvb3Qgc2VjdG9yLiI7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9wcmltYXJ5LCAqYmhfYmFja3VwOworCWxvbmcgbnJfYmxvY2tzID0gTlRGU19TQihzYiktPm5yX2Jsb2NrczsKKworCS8qIFRyeSB0byByZWFkIHByaW1hcnkgYm9vdCBzZWN0b3IuICovCisJaWYgKChiaF9wcmltYXJ5ID0gc2JfYnJlYWQoc2IsIDApKSkgeworCQlpZiAoaXNfYm9vdF9zZWN0b3JfbnRmcyhzYiwgKE5URlNfQk9PVF9TRUNUT1IqKQorCQkJCWJoX3ByaW1hcnktPmJfZGF0YSwgc2lsZW50KSkKKwkJCXJldHVybiBiaF9wcmltYXJ5OworCQlpZiAoIXNpbGVudCkKKwkJCW50ZnNfZXJyb3Ioc2IsICJQcmltYXJ5IGJvb3Qgc2VjdG9yIGlzIGludmFsaWQuIik7CisJfSBlbHNlIGlmICghc2lsZW50KQorCQludGZzX2Vycm9yKHNiLCByZWFkX2Vycl9zdHIsICJwcmltYXJ5Iik7CisJaWYgKCEoTlRGU19TQihzYiktPm9uX2Vycm9ycyAmIE9OX0VSUk9SU19SRUNPVkVSKSkgeworCQlpZiAoYmhfcHJpbWFyeSkKKwkJCWJyZWxzZShiaF9wcmltYXJ5KTsKKwkJaWYgKCFzaWxlbnQpCisJCQludGZzX2Vycm9yKHNiLCAiTW91bnQgb3B0aW9uIGVycm9ycz1yZWNvdmVyIG5vdCB1c2VkLiAiCisJCQkJCSJBYm9ydGluZyB3aXRob3V0IHRyeWluZyB0byByZWNvdmVyLiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLyogVHJ5IHRvIHJlYWQgTlQ0KyBiYWNrdXAgYm9vdCBzZWN0b3IuICovCisJaWYgKChiaF9iYWNrdXAgPSBzYl9icmVhZChzYiwgbnJfYmxvY2tzIC0gMSkpKSB7CisJCWlmIChpc19ib290X3NlY3Rvcl9udGZzKHNiLCAoTlRGU19CT09UX1NFQ1RPUiopCisJCQkJYmhfYmFja3VwLT5iX2RhdGEsIHNpbGVudCkpCisJCQlnb3RvIGhvdGZpeF9wcmltYXJ5X2Jvb3Rfc2VjdG9yOworCQlicmVsc2UoYmhfYmFja3VwKTsKKwl9IGVsc2UgaWYgKCFzaWxlbnQpCisJCW50ZnNfZXJyb3Ioc2IsIHJlYWRfZXJyX3N0ciwgImJhY2t1cCIpOworCS8qIFRyeSB0byByZWFkIE5UMy41MS0gYmFja3VwIGJvb3Qgc2VjdG9yLiAqLworCWlmICgoYmhfYmFja3VwID0gc2JfYnJlYWQoc2IsIG5yX2Jsb2NrcyA+PiAxKSkpIHsKKwkJaWYgKGlzX2Jvb3Rfc2VjdG9yX250ZnMoc2IsIChOVEZTX0JPT1RfU0VDVE9SKikKKwkJCQliaF9iYWNrdXAtPmJfZGF0YSwgc2lsZW50KSkKKwkJCWdvdG8gaG90Zml4X3ByaW1hcnlfYm9vdF9zZWN0b3I7CisJCWlmICghc2lsZW50KQorCQkJbnRmc19lcnJvcihzYiwgIkNvdWxkIG5vdCBmaW5kIGEgdmFsaWQgYmFja3VwIGJvb3QgIgorCQkJCQkic2VjdG9yLiIpOworCQlicmVsc2UoYmhfYmFja3VwKTsKKwl9IGVsc2UgaWYgKCFzaWxlbnQpCisJCW50ZnNfZXJyb3Ioc2IsIHJlYWRfZXJyX3N0ciwgImJhY2t1cCIpOworCS8qIFdlIGZhaWxlZC4gQ2xlYW51cCBhbmQgcmV0dXJuLiAqLworCWlmIChiaF9wcmltYXJ5KQorCQlicmVsc2UoYmhfcHJpbWFyeSk7CisJcmV0dXJuIE5VTEw7Citob3RmaXhfcHJpbWFyeV9ib290X3NlY3RvcjoKKwlpZiAoYmhfcHJpbWFyeSkgeworCQkvKgorCQkgKiBJZiB3ZSBtYW5hZ2VkIHRvIHJlYWQgc2VjdG9yIHplcm8gYW5kIHRoZSB2b2x1bWUgaXMgbm90CisJCSAqIHJlYWQtb25seSwgY29weSB0aGUgZm91bmQsIHZhbGlkIGJhY2t1cCBib290IHNlY3RvciB0byB0aGUKKwkJICogcHJpbWFyeSBib290IHNlY3Rvci4KKwkJICovCisJCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQkJbnRmc193YXJuaW5nKHNiLCAiSG90LWZpeDogUmVjb3ZlcmluZyBpbnZhbGlkIHByaW1hcnkgIgorCQkJCQkiYm9vdCBzZWN0b3IgZnJvbSBiYWNrdXAgY29weS4iKTsKKwkJCW1lbWNweShiaF9wcmltYXJ5LT5iX2RhdGEsIGJoX2JhY2t1cC0+Yl9kYXRhLAorCQkJCQlzYi0+c19ibG9ja3NpemUpOworCQkJbWFya19idWZmZXJfZGlydHkoYmhfcHJpbWFyeSk7CisJCQlzeW5jX2RpcnR5X2J1ZmZlcihiaF9wcmltYXJ5KTsKKwkJCWlmIChidWZmZXJfdXB0b2RhdGUoYmhfcHJpbWFyeSkpIHsKKwkJCQlicmVsc2UoYmhfYmFja3VwKTsKKwkJCQlyZXR1cm4gYmhfcHJpbWFyeTsKKwkJCX0KKwkJCW50ZnNfZXJyb3Ioc2IsICJIb3QtZml4OiBEZXZpY2Ugd3JpdGUgZXJyb3Igd2hpbGUgIgorCQkJCQkicmVjb3ZlcmluZyBwcmltYXJ5IGJvb3Qgc2VjdG9yLiIpOworCQl9IGVsc2UgeworCQkJbnRmc193YXJuaW5nKHNiLCAiSG90LWZpeDogUmVjb3Zlcnkgb2YgcHJpbWFyeSBib290ICIKKwkJCQkJInNlY3RvciBmYWlsZWQ6IFJlYWQtb25seSBtb3VudC4iKTsKKwkJfQorCQlicmVsc2UoYmhfcHJpbWFyeSk7CisJfQorCW50ZnNfd2FybmluZyhzYiwgIlVzaW5nIGJhY2t1cCBib290IHNlY3Rvci4iKTsKKwlyZXR1cm4gYmhfYmFja3VwOworfQorCisvKioKKyAqIHBhcnNlX250ZnNfYm9vdF9zZWN0b3IgLSBwYXJzZSB0aGUgYm9vdCBzZWN0b3IgYW5kIHN0b3JlIHRoZSBkYXRhIGluIEB2b2wKKyAqIEB2b2w6CXZvbHVtZSBzdHJ1Y3R1cmUgdG8gaW5pdGlhbGlzZSB3aXRoIGRhdGEgZnJvbSBib290IHNlY3RvcgorICogQGI6CQlib290IHNlY3RvciB0byBwYXJzZQorICoKKyAqIFBhcnNlIHRoZSBudGZzIGJvb3Qgc2VjdG9yIEBiIGFuZCBzdG9yZSBhbGwgaW1wb3JhbnQgaW5mb3JtYXRpb24gdGhlcmVpbiBpbgorICogdGhlIG50ZnMgc3VwZXIgYmxvY2sgQHZvbC4gIFJldHVybiBUUlVFIG9uIHN1Y2Nlc3MgYW5kIEZBTFNFIG9uIGVycm9yLgorICovCitzdGF0aWMgQk9PTCBwYXJzZV9udGZzX2Jvb3Rfc2VjdG9yKG50ZnNfdm9sdW1lICp2b2wsIGNvbnN0IE5URlNfQk9PVF9TRUNUT1IgKmIpCit7CisJdW5zaWduZWQgaW50IHNlY3RvcnNfcGVyX2NsdXN0ZXJfYml0cywgbnJfaGlkZGVuX3NlY3RzOworCWludCBjbHVzdGVyc19wZXJfbWZ0X3JlY29yZCwgY2x1c3RlcnNfcGVyX2luZGV4X3JlY29yZDsKKwlzNjQgbGw7CisKKwl2b2wtPnNlY3Rvcl9zaXplID0gbGUxNl90b19jcHUoYi0+YnBiLmJ5dGVzX3Blcl9zZWN0b3IpOworCXZvbC0+c2VjdG9yX3NpemVfYml0cyA9IGZmcyh2b2wtPnNlY3Rvcl9zaXplKSAtIDE7CisJbnRmc19kZWJ1Zygidm9sLT5zZWN0b3Jfc2l6ZSA9ICVpICgweCV4KSIsIHZvbC0+c2VjdG9yX3NpemUsCisJCQl2b2wtPnNlY3Rvcl9zaXplKTsKKwludGZzX2RlYnVnKCJ2b2wtPnNlY3Rvcl9zaXplX2JpdHMgPSAlaSAoMHgleCkiLCB2b2wtPnNlY3Rvcl9zaXplX2JpdHMsCisJCQl2b2wtPnNlY3Rvcl9zaXplX2JpdHMpOworCWlmICh2b2wtPnNlY3Rvcl9zaXplICE9IHZvbC0+c2ItPnNfYmxvY2tzaXplKQorCQludGZzX3dhcm5pbmcodm9sLT5zYiwgIlRoZSBib290IHNlY3RvciBpbmRpY2F0ZXMgYSBzZWN0b3Igc2l6ZSAiCisJCQkJImRpZmZlcmVudCBmcm9tIHRoZSBkZXZpY2Ugc2VjdG9yIHNpemUuIik7CisJbnRmc19kZWJ1Zygic2VjdG9yc19wZXJfY2x1c3RlciA9IDB4JXgiLCBiLT5icGIuc2VjdG9yc19wZXJfY2x1c3Rlcik7CisJc2VjdG9yc19wZXJfY2x1c3Rlcl9iaXRzID0gZmZzKGItPmJwYi5zZWN0b3JzX3Blcl9jbHVzdGVyKSAtIDE7CisJbnRmc19kZWJ1Zygic2VjdG9yc19wZXJfY2x1c3Rlcl9iaXRzID0gMHgleCIsCisJCQlzZWN0b3JzX3Blcl9jbHVzdGVyX2JpdHMpOworCW5yX2hpZGRlbl9zZWN0cyA9IGxlMzJfdG9fY3B1KGItPmJwYi5oaWRkZW5fc2VjdG9ycyk7CisJbnRmc19kZWJ1ZygibnVtYmVyIG9mIGhpZGRlbiBzZWN0b3JzID0gMHgleCIsIG5yX2hpZGRlbl9zZWN0cyk7CisJdm9sLT5jbHVzdGVyX3NpemUgPSB2b2wtPnNlY3Rvcl9zaXplIDw8IHNlY3RvcnNfcGVyX2NsdXN0ZXJfYml0czsKKwl2b2wtPmNsdXN0ZXJfc2l6ZV9tYXNrID0gdm9sLT5jbHVzdGVyX3NpemUgLSAxOworCXZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMgPSBmZnModm9sLT5jbHVzdGVyX3NpemUpIC0gMTsKKwludGZzX2RlYnVnKCJ2b2wtPmNsdXN0ZXJfc2l6ZSA9ICVpICgweCV4KSIsIHZvbC0+Y2x1c3Rlcl9zaXplLAorCQkJdm9sLT5jbHVzdGVyX3NpemUpOworCW50ZnNfZGVidWcoInZvbC0+Y2x1c3Rlcl9zaXplX21hc2sgPSAweCV4Iiwgdm9sLT5jbHVzdGVyX3NpemVfbWFzayk7CisJbnRmc19kZWJ1Zygidm9sLT5jbHVzdGVyX3NpemVfYml0cyA9ICVpICgweCV4KSIsCisJCQl2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzLCB2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzKTsKKwlpZiAodm9sLT5zZWN0b3Jfc2l6ZSA+IHZvbC0+Y2x1c3Rlcl9zaXplKSB7CisJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIlNlY3RvciBzaXplcyBhYm92ZSB0aGUgY2x1c3RlciBzaXplIGFyZSAiCisJCQkJIm5vdCBzdXBwb3J0ZWQuICBTb3JyeS4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlpZiAodm9sLT5zYi0+c19ibG9ja3NpemUgPiB2b2wtPmNsdXN0ZXJfc2l6ZSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJDbHVzdGVyIHNpemVzIHNtYWxsZXIgdGhhbiB0aGUgZGV2aWNlICIKKwkJCQkic2VjdG9yIHNpemUgYXJlIG5vdCBzdXBwb3J0ZWQuICBTb3JyeS4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwljbHVzdGVyc19wZXJfbWZ0X3JlY29yZCA9IGItPmNsdXN0ZXJzX3Blcl9tZnRfcmVjb3JkOworCW50ZnNfZGVidWcoImNsdXN0ZXJzX3Blcl9tZnRfcmVjb3JkID0gJWkgKDB4JXgpIiwKKwkJCWNsdXN0ZXJzX3Blcl9tZnRfcmVjb3JkLCBjbHVzdGVyc19wZXJfbWZ0X3JlY29yZCk7CisJaWYgKGNsdXN0ZXJzX3Blcl9tZnRfcmVjb3JkID4gMCkKKwkJdm9sLT5tZnRfcmVjb3JkX3NpemUgPSB2b2wtPmNsdXN0ZXJfc2l6ZSA8PAorCQkJCShmZnMoY2x1c3RlcnNfcGVyX21mdF9yZWNvcmQpIC0gMSk7CisJZWxzZQorCQkvKgorCQkgKiBXaGVuIG1mdF9yZWNvcmRfc2l6ZSA8IGNsdXN0ZXJfc2l6ZSwgY2x1c3RlcnNfcGVyX21mdF9yZWNvcmQKKwkJICogPSAtbG9nMihtZnRfcmVjb3JkX3NpemUpIGJ5dGVzLiBtZnRfcmVjb3JkX3NpemUgbm9ybWFseSBpcworCQkgKiAxMDI0IGJ5dGVzLCB3aGljaCBpcyBlbmNvZGVkIGFzIDB4RjYgKC0xMCBpbiBkZWNpbWFsKS4KKwkJICovCisJCXZvbC0+bWZ0X3JlY29yZF9zaXplID0gMSA8PCAtY2x1c3RlcnNfcGVyX21mdF9yZWNvcmQ7CisJdm9sLT5tZnRfcmVjb3JkX3NpemVfbWFzayA9IHZvbC0+bWZ0X3JlY29yZF9zaXplIC0gMTsKKwl2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzID0gZmZzKHZvbC0+bWZ0X3JlY29yZF9zaXplKSAtIDE7CisJbnRmc19kZWJ1Zygidm9sLT5tZnRfcmVjb3JkX3NpemUgPSAlaSAoMHgleCkiLCB2b2wtPm1mdF9yZWNvcmRfc2l6ZSwKKwkJCXZvbC0+bWZ0X3JlY29yZF9zaXplKTsKKwludGZzX2RlYnVnKCJ2b2wtPm1mdF9yZWNvcmRfc2l6ZV9tYXNrID0gMHgleCIsCisJCQl2b2wtPm1mdF9yZWNvcmRfc2l6ZV9tYXNrKTsKKwludGZzX2RlYnVnKCJ2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzID0gJWkgKDB4JXgpIiwKKwkJCXZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHMsIHZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHMpOworCS8qCisJICogV2UgY2Fubm90IHN1cHBvcnQgbWZ0IHJlY29yZCBzaXplcyBhYm92ZSB0aGUgUEFHRV9DQUNIRV9TSVpFIHNpbmNlCisJICogd2Ugc3RvcmUgJE1GVC8kREFUQSwgdGhlIHRhYmxlIG9mIG1mdCByZWNvcmRzIGluIHRoZSBwYWdlIGNhY2hlLgorCSAqLworCWlmICh2b2wtPm1mdF9yZWNvcmRfc2l6ZSA+IFBBR0VfQ0FDSEVfU0laRSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJNZnQgcmVjb3JkIHNpemUgJWkgKDB4JXgpIGV4Y2VlZHMgdGhlICIKKwkJCQkicGFnZSBjYWNoZSBzaXplIG9uIHlvdXIgc3lzdGVtICVsdSAoMHglbHgpLiAgIgorCQkJCSJUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuICBTb3JyeS4iLAorCQkJCXZvbC0+bWZ0X3JlY29yZF9zaXplLCB2b2wtPm1mdF9yZWNvcmRfc2l6ZSwKKwkJCQlQQUdFX0NBQ0hFX1NJWkUsIFBBR0VfQ0FDSEVfU0laRSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJY2x1c3RlcnNfcGVyX2luZGV4X3JlY29yZCA9IGItPmNsdXN0ZXJzX3Blcl9pbmRleF9yZWNvcmQ7CisJbnRmc19kZWJ1ZygiY2x1c3RlcnNfcGVyX2luZGV4X3JlY29yZCA9ICVpICgweCV4KSIsCisJCQljbHVzdGVyc19wZXJfaW5kZXhfcmVjb3JkLCBjbHVzdGVyc19wZXJfaW5kZXhfcmVjb3JkKTsKKwlpZiAoY2x1c3RlcnNfcGVyX2luZGV4X3JlY29yZCA+IDApCisJCXZvbC0+aW5kZXhfcmVjb3JkX3NpemUgPSB2b2wtPmNsdXN0ZXJfc2l6ZSA8PAorCQkJCShmZnMoY2x1c3RlcnNfcGVyX2luZGV4X3JlY29yZCkgLSAxKTsKKwllbHNlCisJCS8qCisJCSAqIFdoZW4gaW5kZXhfcmVjb3JkX3NpemUgPCBjbHVzdGVyX3NpemUsCisJCSAqIGNsdXN0ZXJzX3Blcl9pbmRleF9yZWNvcmQgPSAtbG9nMihpbmRleF9yZWNvcmRfc2l6ZSkgYnl0ZXMuCisJCSAqIGluZGV4X3JlY29yZF9zaXplIG5vcm1hbHkgZXF1YWxzIDQwOTYgYnl0ZXMsIHdoaWNoIGlzCisJCSAqIGVuY29kZWQgYXMgMHhGNCAoLTEyIGluIGRlY2ltYWwpLgorCQkgKi8KKwkJdm9sLT5pbmRleF9yZWNvcmRfc2l6ZSA9IDEgPDwgLWNsdXN0ZXJzX3Blcl9pbmRleF9yZWNvcmQ7CisJdm9sLT5pbmRleF9yZWNvcmRfc2l6ZV9tYXNrID0gdm9sLT5pbmRleF9yZWNvcmRfc2l6ZSAtIDE7CisJdm9sLT5pbmRleF9yZWNvcmRfc2l6ZV9iaXRzID0gZmZzKHZvbC0+aW5kZXhfcmVjb3JkX3NpemUpIC0gMTsKKwludGZzX2RlYnVnKCJ2b2wtPmluZGV4X3JlY29yZF9zaXplID0gJWkgKDB4JXgpIiwKKwkJCXZvbC0+aW5kZXhfcmVjb3JkX3NpemUsIHZvbC0+aW5kZXhfcmVjb3JkX3NpemUpOworCW50ZnNfZGVidWcoInZvbC0+aW5kZXhfcmVjb3JkX3NpemVfbWFzayA9IDB4JXgiLAorCQkJdm9sLT5pbmRleF9yZWNvcmRfc2l6ZV9tYXNrKTsKKwludGZzX2RlYnVnKCJ2b2wtPmluZGV4X3JlY29yZF9zaXplX2JpdHMgPSAlaSAoMHgleCkiLAorCQkJdm9sLT5pbmRleF9yZWNvcmRfc2l6ZV9iaXRzLAorCQkJdm9sLT5pbmRleF9yZWNvcmRfc2l6ZV9iaXRzKTsKKwkvKgorCSAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgdm9sdW1lIGluIGNsdXN0ZXJzIGFuZCBjaGVjayBmb3IgNjQtYml0LW5lc3MuCisJICogV2luZG93cyBjdXJyZW50bHkgb25seSB1c2VzIDMyIGJpdHMgdG8gc2F2ZSB0aGUgY2x1c3RlcnMgc28gd2UgZG8KKwkgKiB0aGUgc2FtZSBhcyBpdCBpcyBtdWNoIGZhc3RlciBvbiAzMi1iaXQgQ1BVcy4KKwkgKi8KKwlsbCA9IHNsZTY0X3RvX2NwdShiLT5udW1iZXJfb2Zfc2VjdG9ycykgPj4gc2VjdG9yc19wZXJfY2x1c3Rlcl9iaXRzOworCWlmICgodTY0KWxsID49IDFVTEwgPDwgMzIpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiQ2Fubm90IGhhbmRsZSA2NC1iaXQgY2x1c3RlcnMuICBTb3JyeS4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwl2b2wtPm5yX2NsdXN0ZXJzID0gbGw7CisJbnRmc19kZWJ1Zygidm9sLT5ucl9jbHVzdGVycyA9IDB4JWxseCIsIChsb25nIGxvbmcpdm9sLT5ucl9jbHVzdGVycyk7CisJLyoKKwkgKiBPbiBhbiBhcmNoaXRlY3R1cmUgd2hlcmUgdW5zaWduZWQgbG9uZyBpcyAzMi1iaXRzLCB3ZSByZXN0cmljdCB0aGUKKwkgKiB2b2x1bWUgc2l6ZSB0byAyVGlCICgyXjQxKS4gT24gYSA2NC1iaXQgYXJjaGl0ZWN0dXJlLCB0aGUgY29tcGlsZXIKKwkgKiB3aWxsIGhvcGVmdWxseSBvcHRpbWl6ZSB0aGUgd2hvbGUgY2hlY2sgYXdheS4KKwkgKi8KKwlpZiAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpIDwgOCkgeworCQlpZiAoKGxsIDw8IHZvbC0+Y2x1c3Rlcl9zaXplX2JpdHMpID49ICgxVUxMIDw8IDQxKSkgeworCQkJbnRmc19lcnJvcih2b2wtPnNiLCAiVm9sdW1lIHNpemUgKCVsbHVUaUIpIGlzIHRvbyAiCisJCQkJCSJsYXJnZSBmb3IgdGhpcyBhcmNoaXRlY3R1cmUuICAiCisJCQkJCSJNYXhpbXVtIHN1cHBvcnRlZCBpcyAyVGlCLiAgU29ycnkuIiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylsbCA+PiAoNDAgLQorCQkJCQl2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzKSk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9CisJbGwgPSBzbGU2NF90b19jcHUoYi0+bWZ0X2xjbik7CisJaWYgKGxsID49IHZvbC0+bnJfY2x1c3RlcnMpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiTUZUIExDTiBpcyBiZXlvbmQgZW5kIG9mIHZvbHVtZS4gIFdlaXJkLiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCXZvbC0+bWZ0X2xjbiA9IGxsOworCW50ZnNfZGVidWcoInZvbC0+bWZ0X2xjbiA9IDB4JWxseCIsIChsb25nIGxvbmcpdm9sLT5tZnRfbGNuKTsKKwlsbCA9IHNsZTY0X3RvX2NwdShiLT5tZnRtaXJyX2xjbik7CisJaWYgKGxsID49IHZvbC0+bnJfY2x1c3RlcnMpIHsKKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiTUZUTWlyciBMQ04gaXMgYmV5b25kIGVuZCBvZiB2b2x1bWUuICAiCisJCQkJIldlaXJkLiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCXZvbC0+bWZ0bWlycl9sY24gPSBsbDsKKwludGZzX2RlYnVnKCJ2b2wtPm1mdG1pcnJfbGNuID0gMHglbGx4IiwgKGxvbmcgbG9uZyl2b2wtPm1mdG1pcnJfbGNuKTsKKyNpZmRlZiBOVEZTX1JXCisJLyoKKwkgKiBXb3JrIG91dCB0aGUgc2l6ZSBvZiB0aGUgbWZ0IG1pcnJvciBpbiBudW1iZXIgb2YgbWZ0IHJlY29yZHMuIElmIHRoZQorCSAqIGNsdXN0ZXIgc2l6ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgdGFrZW4gYnkgZm91ciBtZnQKKwkgKiByZWNvcmRzLCB0aGUgbWZ0IG1pcnJvciBzdG9yZXMgdGhlIGZpcnN0IGZvdXIgbWZ0IHJlY29yZHMuIElmIHRoZQorCSAqIGNsdXN0ZXIgc2l6ZSBpcyBiaWdnZXIgdGhhbiB0aGUgc2l6ZSB0YWtlbiBieSBmb3VyIG1mdCByZWNvcmRzLCB0aGUKKwkgKiBtZnQgbWlycm9yIGNvbnRhaW5zIGFzIG1hbnkgbWZ0IHJlY29yZHMgYXMgd2lsbCBmaXQgaW50byBvbmUKKwkgKiBjbHVzdGVyLgorCSAqLworCWlmICh2b2wtPmNsdXN0ZXJfc2l6ZSA8PSAoNCA8PCB2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzKSkKKwkJdm9sLT5tZnRtaXJyX3NpemUgPSA0OworCWVsc2UKKwkJdm9sLT5tZnRtaXJyX3NpemUgPSB2b2wtPmNsdXN0ZXJfc2l6ZSA+PgorCQkJCXZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHM7CisJbnRmc19kZWJ1Zygidm9sLT5tZnRtaXJyX3NpemUgPSAlaSIsIHZvbC0+bWZ0bWlycl9zaXplKTsKKyNlbmRpZiAvKiBOVEZTX1JXICovCisJdm9sLT5zZXJpYWxfbm8gPSBsZTY0X3RvX2NwdShiLT52b2x1bWVfc2VyaWFsX251bWJlcik7CisJbnRmc19kZWJ1Zygidm9sLT5zZXJpYWxfbm8gPSAweCVsbHgiLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2b2wtPnNlcmlhbF9ubyk7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogbnRmc19zZXR1cF9hbGxvY2F0b3JzIC0gaW5pdGlhbGl6ZSB0aGUgY2x1c3RlciBhbmQgbWZ0IGFsbG9jYXRvcnMKKyAqIEB2b2w6CXZvbHVtZSBzdHJ1Y3R1cmUgZm9yIHdoaWNoIHRvIHNldHVwIHRoZSBhbGxvY2F0b3JzCisgKgorICogU2V0dXAgdGhlIGNsdXN0ZXIgKGxjbikgYW5kIG1mdCBhbGxvY2F0b3JzIHRvIHRoZSBzdGFydGluZyB2YWx1ZXMuCisgKi8KK3N0YXRpYyB2b2lkIG50ZnNfc2V0dXBfYWxsb2NhdG9ycyhudGZzX3ZvbHVtZSAqdm9sKQoreworI2lmZGVmIE5URlNfUlcKKwlMQ04gbWZ0X3pvbmVfc2l6ZSwgbWZ0X2xjbjsKKyNlbmRpZiAvKiBOVEZTX1JXICovCisKKwludGZzX2RlYnVnKCJ2b2wtPm1mdF96b25lX211bHRpcGxpZXIgPSAweCV4IiwKKwkJCXZvbC0+bWZ0X3pvbmVfbXVsdGlwbGllcik7CisjaWZkZWYgTlRGU19SVworCS8qIERldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgTUZUIHpvbmUuICovCisJbWZ0X3pvbmVfc2l6ZSA9IHZvbC0+bnJfY2x1c3RlcnM7CisJc3dpdGNoICh2b2wtPm1mdF96b25lX211bHRpcGxpZXIpIHsgIC8qICUgb2Ygdm9sdW1lIHNpemUgaW4gY2x1c3RlcnMgKi8KKwljYXNlIDQ6CisJCW1mdF96b25lX3NpemUgPj49IDE7CQkJLyogNTAlICAgKi8KKwkJYnJlYWs7CisJY2FzZSAzOgorCQltZnRfem9uZV9zaXplID0gKG1mdF96b25lX3NpemUgKworCQkJCShtZnRfem9uZV9zaXplID4+IDEpKSA+PiAyOwkvKiAzNy41JSAqLworCQlicmVhazsKKwljYXNlIDI6CisJCW1mdF96b25lX3NpemUgPj49IDI7CQkJLyogMjUlICAgKi8KKwkJYnJlYWs7CisJLyogY2FzZSAxOiAqLworCWRlZmF1bHQ6CisJCW1mdF96b25lX3NpemUgPj49IDM7CQkJLyogMTIuNSUgKi8KKwkJYnJlYWs7CisJfQorCS8qIFNldHVwIHRoZSBtZnQgem9uZS4gKi8KKwl2b2wtPm1mdF96b25lX3N0YXJ0ID0gdm9sLT5tZnRfem9uZV9wb3MgPSB2b2wtPm1mdF9sY247CisJbnRmc19kZWJ1Zygidm9sLT5tZnRfem9uZV9wb3MgPSAweCVsbHgiLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2b2wtPm1mdF96b25lX3Bvcyk7CisJLyoKKwkgKiBDYWxjdWxhdGUgdGhlIG1mdF9sY24gZm9yIGFuIHVubW9kaWZpZWQgTlRGUyB2b2x1bWUgKHNlZSBta250ZnMKKwkgKiBzb3VyY2UpIGFuZCBpZiB0aGUgYWN0dWFsIG1mdF9sY24gaXMgaW4gdGhlIGV4cGVjdGVkIHBsYWNlIG9yIGV2ZW4KKwkgKiBmdXJ0aGVyIHRvIHRoZSBmcm9udCBvZiB0aGUgdm9sdW1lLCBleHRlbmQgdGhlIG1mdF96b25lIHRvIGNvdmVyIHRoZQorCSAqIGJlZ2lubmluZyBvZiB0aGUgdm9sdW1lIGFzIHdlbGwuICBUaGlzIGlzIGluIG9yZGVyIHRvIHByb3RlY3QgdGhlCisJICogYXJlYSByZXNlcnZlZCBmb3IgdGhlIG1mdCBiaXRtYXAgYXMgd2VsbCB3aXRoaW4gdGhlIG1mdF96b25lIGl0c2VsZi4KKwkgKiBPbiBub24tc3RhbmRhcmQgdm9sdW1lcyB3ZSBkbyBub3QgcHJvdGVjdCBpdCBhcyB0aGUgb3ZlcmhlYWQgd291bGQKKwkgKiBiZSBoaWdoZXIgdGhhbiB0aGUgc3BlZWQgaW5jcmVhc2Ugd2Ugd291bGQgZ2V0IGJ5IGRvaW5nIGl0LgorCSAqLworCW1mdF9sY24gPSAoODE5MiArIDIgKiB2b2wtPmNsdXN0ZXJfc2l6ZSAtIDEpIC8gdm9sLT5jbHVzdGVyX3NpemU7CisJaWYgKG1mdF9sY24gKiB2b2wtPmNsdXN0ZXJfc2l6ZSA8IDE2ICogMTAyNCkKKwkJbWZ0X2xjbiA9ICgxNiAqIDEwMjQgKyB2b2wtPmNsdXN0ZXJfc2l6ZSAtIDEpIC8KKwkJCQl2b2wtPmNsdXN0ZXJfc2l6ZTsKKwlpZiAodm9sLT5tZnRfem9uZV9zdGFydCA8PSBtZnRfbGNuKQorCQl2b2wtPm1mdF96b25lX3N0YXJ0ID0gMDsKKwludGZzX2RlYnVnKCJ2b2wtPm1mdF96b25lX3N0YXJ0ID0gMHglbGx4IiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdm9sLT5tZnRfem9uZV9zdGFydCk7CisJLyoKKwkgKiBOZWVkIHRvIGNhcCB0aGUgbWZ0IHpvbmUgb24gbm9uLXN0YW5kYXJkIHZvbHVtZXMgc28gdGhhdCBpdCBkb2VzCisJICogbm90IHBvaW50IG91dHNpZGUgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIHZvbHVtZS4gIFdlIGRvIHRoaXMgYnkKKwkgKiBoYWx2aW5nIHRoZSB6b25lIHNpemUgdW50aWwgd2UgYXJlIGluc2lkZSB0aGUgdm9sdW1lLgorCSAqLworCXZvbC0+bWZ0X3pvbmVfZW5kID0gdm9sLT5tZnRfbGNuICsgbWZ0X3pvbmVfc2l6ZTsKKwl3aGlsZSAodm9sLT5tZnRfem9uZV9lbmQgPj0gdm9sLT5ucl9jbHVzdGVycykgeworCQltZnRfem9uZV9zaXplID4+PSAxOworCQl2b2wtPm1mdF96b25lX2VuZCA9IHZvbC0+bWZ0X2xjbiArIG1mdF96b25lX3NpemU7CisJfQorCW50ZnNfZGVidWcoInZvbC0+bWZ0X3pvbmVfZW5kID0gMHglbGx4IiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdm9sLT5tZnRfem9uZV9lbmQpOworCS8qCisJICogU2V0IHRoZSBjdXJyZW50IHBvc2l0aW9uIHdpdGhpbiBlYWNoIGRhdGEgem9uZSB0byB0aGUgc3RhcnQgb2YgdGhlCisJICogcmVzcGVjdGl2ZSB6b25lLgorCSAqLworCXZvbC0+ZGF0YTFfem9uZV9wb3MgPSB2b2wtPm1mdF96b25lX2VuZDsKKwludGZzX2RlYnVnKCJ2b2wtPmRhdGExX3pvbmVfcG9zID0gMHglbGx4IiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdm9sLT5kYXRhMV96b25lX3Bvcyk7CisJdm9sLT5kYXRhMl96b25lX3BvcyA9IDA7CisJbnRmc19kZWJ1Zygidm9sLT5kYXRhMl96b25lX3BvcyA9IDB4JWxseCIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXZvbC0+ZGF0YTJfem9uZV9wb3MpOworCisJLyogU2V0IHRoZSBtZnQgZGF0YSBhbGxvY2F0aW9uIHBvc2l0aW9uIHRvIG1mdCByZWNvcmQgMjQuICovCisJdm9sLT5tZnRfZGF0YV9wb3MgPSAyNDsKKwludGZzX2RlYnVnKCJ2b2wtPm1mdF9kYXRhX3BvcyA9IDB4JWxseCIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKXZvbC0+bWZ0X2RhdGFfcG9zKTsKKyNlbmRpZiAvKiBOVEZTX1JXICovCit9CisKKyNpZmRlZiBOVEZTX1JXCisKKy8qKgorICogbG9hZF9hbmRfaW5pdF9tZnRfbWlycm9yIC0gbG9hZCBhbmQgc2V0dXAgdGhlIG1mdCBtaXJyb3IgaW5vZGUgZm9yIGEgdm9sdW1lCisgKiBAdm9sOgludGZzIHN1cGVyIGJsb2NrIGRlc2NyaWJpbmcgZGV2aWNlIHdob3NlIG1mdCBtaXJyb3IgdG8gbG9hZAorICoKKyAqIFJldHVybiBUUlVFIG9uIHN1Y2Nlc3Mgb3IgRkFMU0Ugb24gZXJyb3IuCisgKi8KK3N0YXRpYyBCT09MIGxvYWRfYW5kX2luaXRfbWZ0X21pcnJvcihudGZzX3ZvbHVtZSAqdm9sKQoreworCXN0cnVjdCBpbm9kZSAqdG1wX2lubzsKKwludGZzX2lub2RlICp0bXBfbmk7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwkvKiBHZXQgbWZ0IG1pcnJvciBpbm9kZS4gKi8KKwl0bXBfaW5vID0gbnRmc19pZ2V0KHZvbC0+c2IsIEZJTEVfTUZUTWlycik7CisJaWYgKElTX0VSUih0bXBfaW5vKSB8fCBpc19iYWRfaW5vZGUodG1wX2lubykpIHsKKwkJaWYgKCFJU19FUlIodG1wX2lubykpCisJCQlpcHV0KHRtcF9pbm8pOworCQkvKiBDYWxsZXIgd2lsbCBkaXNwbGF5IGVycm9yIG1lc3NhZ2UuICovCisJCXJldHVybiBGQUxTRTsKKwl9CisJLyoKKwkgKiBSZS1pbml0aWFsaXplIHNvbWUgc3BlY2lmaWNzIGFib3V0ICRNRlRNaXJyJ3MgaW5vZGUgYXMKKwkgKiBudGZzX3JlYWRfaW5vZGUoKSB3aWxsIGhhdmUgc2V0IHVwIHRoZSBkZWZhdWx0IG9uZXMuCisJICovCisJLyogU2V0IHVpZCBhbmQgZ2lkIHRvIHJvb3QuICovCisJdG1wX2luby0+aV91aWQgPSB0bXBfaW5vLT5pX2dpZCA9IDA7CisJLyogUmVndWxhciBmaWxlLiAgTm8gYWNjZXNzIGZvciBhbnlvbmUuICovCisJdG1wX2luby0+aV9tb2RlID0gU19JRlJFRzsKKwkvKiBObyBWRlMgaW5pdGlhdGVkIG9wZXJhdGlvbnMgYWxsb3dlZCBmb3IgJE1GVE1pcnIuICovCisJdG1wX2luby0+aV9vcCA9ICZudGZzX2VtcHR5X2lub2RlX29wczsKKwl0bXBfaW5vLT5pX2ZvcCA9ICZudGZzX2VtcHR5X2ZpbGVfb3BzOworCS8qIFB1dCBpbiBvdXIgc3BlY2lhbCBhZGRyZXNzIHNwYWNlIG9wZXJhdGlvbnMuICovCisJdG1wX2luby0+aV9tYXBwaW5nLT5hX29wcyA9ICZudGZzX21zdF9hb3BzOworCXRtcF9uaSA9IE5URlNfSSh0bXBfaW5vKTsKKwkvKiBUaGUgJE1GVE1pcnIsIGxpa2UgdGhlICRNRlQgaXMgbXVsdGkgc2VjdG9yIHRyYW5zZmVyIHByb3RlY3RlZC4gKi8KKwlOSW5vU2V0TXN0UHJvdGVjdGVkKHRtcF9uaSk7CisJLyoKKwkgKiBTZXQgdXAgb3VyIGxpdHRsZSBjaGVhdCBhbGxvd2luZyB1cyB0byByZXVzZSB0aGUgYXN5bmMgcmVhZCBpbworCSAqIGNvbXBsZXRpb24gaGFuZGxlciBmb3IgZGlyZWN0b3JpZXMuCisJICovCisJdG1wX25pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplID0gdm9sLT5tZnRfcmVjb3JkX3NpemU7CisJdG1wX25pLT5pdHlwZS5pbmRleC5ibG9ja19zaXplX2JpdHMgPSB2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzOworCXZvbC0+bWZ0bWlycl9pbm8gPSB0bXBfaW5vOworCW50ZnNfZGVidWcoIkRvbmUuIik7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogY2hlY2tfbWZ0X21pcnJvciAtIGNvbXBhcmUgY29udGVudHMgb2YgdGhlIG1mdCBtaXJyb3Igd2l0aCB0aGUgbWZ0CisgKiBAdm9sOgludGZzIHN1cGVyIGJsb2NrIGRlc2NyaWJpbmcgZGV2aWNlIHdob3NlIG1mdCBtaXJyb3IgdG8gY2hlY2sKKyAqCisgKiBSZXR1cm4gVFJVRSBvbiBzdWNjZXNzIG9yIEZBTFNFIG9uIGVycm9yLgorICoKKyAqIE5vdGUsIHRoaXMgZnVuY3Rpb24gYWxzbyByZXN1bHRzIGluIHRoZSBtZnQgbWlycm9yIHJ1bmxpc3QgYmVpbmcgY29tcGxldGVseQorICogbWFwcGVkIGludG8gbWVtb3J5LiAgVGhlIG1mdCBtaXJyb3Igd3JpdGUgY29kZSByZXF1aXJlcyB0aGlzIGFuZCB3aWxsIEJVRygpCisgKiBzaG91bGQgaXQgZmluZCBhbiB1bm1hcHBlZCBydW5saXN0IGVsZW1lbnQuCisgKi8KK3N0YXRpYyBCT09MIGNoZWNrX21mdF9taXJyb3IobnRmc192b2x1bWUgKnZvbCkKK3sKKwl1bnNpZ25lZCBsb25nIGluZGV4OworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSB2b2wtPnNiOworCW50ZnNfaW5vZGUgKm1pcnJfbmk7CisJc3RydWN0IHBhZ2UgKm1mdF9wYWdlLCAqbWlycl9wYWdlOworCXU4ICprbWZ0LCAqa21pcnI7CisJcnVubGlzdF9lbGVtZW50ICpybCwgcmwyWzJdOworCWludCBtcmVjc19wZXJfcGFnZSwgaTsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworCS8qIENvbXBhcmUgY29udGVudHMgb2YgJE1GVCBhbmQgJE1GVE1pcnIuICovCisJbXJlY3NfcGVyX3BhZ2UgPSBQQUdFX0NBQ0hFX1NJWkUgLyB2b2wtPm1mdF9yZWNvcmRfc2l6ZTsKKwlCVUdfT04oIW1yZWNzX3Blcl9wYWdlKTsKKwlCVUdfT04oIXZvbC0+bWZ0bWlycl9zaXplKTsKKwltZnRfcGFnZSA9IG1pcnJfcGFnZSA9IE5VTEw7CisJa21mdCA9IGttaXJyID0gTlVMTDsKKwlpbmRleCA9IGkgPSAwOworCWRvIHsKKwkJdTMyIGJ5dGVzOworCisJCS8qIFN3aXRjaCBwYWdlcyBpZiBuZWNlc3NhcnkuICovCisJCWlmICghKGkgJSBtcmVjc19wZXJfcGFnZSkpIHsKKwkJCWlmIChpbmRleCkgeworCQkJCW50ZnNfdW5tYXBfcGFnZShtZnRfcGFnZSk7CisJCQkJbnRmc191bm1hcF9wYWdlKG1pcnJfcGFnZSk7CisJCQl9CisJCQkvKiBHZXQgdGhlICRNRlQgcGFnZS4gKi8KKwkJCW1mdF9wYWdlID0gbnRmc19tYXBfcGFnZSh2b2wtPm1mdF9pbm8tPmlfbWFwcGluZywKKwkJCQkJaW5kZXgpOworCQkJaWYgKElTX0VSUihtZnRfcGFnZSkpIHsKKwkJCQludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIHJlYWQgJE1GVC4iKTsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCQlrbWZ0ID0gcGFnZV9hZGRyZXNzKG1mdF9wYWdlKTsKKwkJCS8qIEdldCB0aGUgJE1GVE1pcnIgcGFnZS4gKi8KKwkJCW1pcnJfcGFnZSA9IG50ZnNfbWFwX3BhZ2Uodm9sLT5tZnRtaXJyX2luby0+aV9tYXBwaW5nLAorCQkJCQlpbmRleCk7CisJCQlpZiAoSVNfRVJSKG1pcnJfcGFnZSkpIHsKKwkJCQludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIHJlYWQgJE1GVE1pcnIuIik7CisJCQkJZ290byBtZnRfdW5tYXBfb3V0OworCQkJfQorCQkJa21pcnIgPSBwYWdlX2FkZHJlc3MobWlycl9wYWdlKTsKKwkJCSsraW5kZXg7CisJCX0KKwkJLyogTWFrZSBzdXJlIHRoZSByZWNvcmQgaXMgb2suICovCisJCWlmIChudGZzX2lzX2JhYWRfcmVjb3JkcCgobGUzMiopa21mdCkpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICJJbmNvbXBsZXRlIG11bHRpIHNlY3RvciB0cmFuc2ZlciAiCisJCQkJCSJkZXRlY3RlZCBpbiBtZnQgcmVjb3JkICVpLiIsIGkpOworbW1fdW5tYXBfb3V0OgorCQkJbnRmc191bm1hcF9wYWdlKG1pcnJfcGFnZSk7CittZnRfdW5tYXBfb3V0OgorCQkJbnRmc191bm1hcF9wYWdlKG1mdF9wYWdlKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCQlpZiAobnRmc19pc19iYWFkX3JlY29yZHAoKGxlMzIqKWttaXJyKSkgeworCQkJbnRmc19lcnJvcihzYiwgIkluY29tcGxldGUgbXVsdGkgc2VjdG9yIHRyYW5zZmVyICIKKwkJCQkJImRldGVjdGVkIGluIG1mdCBtaXJyb3IgcmVjb3JkICVpLiIsIGkpOworCQkJZ290byBtbV91bm1hcF9vdXQ7CisJCX0KKwkJLyogR2V0IHRoZSBhbW91bnQgb2YgZGF0YSBpbiB0aGUgY3VycmVudCByZWNvcmQuICovCisJCWJ5dGVzID0gbGUzMl90b19jcHUoKChNRlRfUkVDT1JEKilrbWZ0KS0+Ynl0ZXNfaW5fdXNlKTsKKwkJaWYgKCFieXRlcyB8fCBieXRlcyA+IHZvbC0+bWZ0X3JlY29yZF9zaXplKSB7CisJCQlieXRlcyA9IGxlMzJfdG9fY3B1KCgoTUZUX1JFQ09SRCopa21pcnIpLT5ieXRlc19pbl91c2UpOworCQkJaWYgKCFieXRlcyB8fCBieXRlcyA+IHZvbC0+bWZ0X3JlY29yZF9zaXplKQorCQkJCWJ5dGVzID0gdm9sLT5tZnRfcmVjb3JkX3NpemU7CisJCX0KKwkJLyogQ29tcGFyZSB0aGUgdHdvIHJlY29yZHMuICovCisJCWlmIChtZW1jbXAoa21mdCwga21pcnIsIGJ5dGVzKSkgeworCQkJbnRmc19lcnJvcihzYiwgIiRNRlQgYW5kICRNRlRNaXJyIChyZWNvcmQgJWkpIGRvIG5vdCAiCisJCQkJCSJtYXRjaC4gIFJ1biBudGZzZml4IG9yIGNoa2Rzay4iLCBpKTsKKwkJCWdvdG8gbW1fdW5tYXBfb3V0OworCQl9CisJCWttZnQgKz0gdm9sLT5tZnRfcmVjb3JkX3NpemU7CisJCWttaXJyICs9IHZvbC0+bWZ0X3JlY29yZF9zaXplOworCX0gd2hpbGUgKCsraSA8IHZvbC0+bWZ0bWlycl9zaXplKTsKKwkvKiBSZWxlYXNlIHRoZSBsYXN0IHBhZ2VzLiAqLworCW50ZnNfdW5tYXBfcGFnZShtZnRfcGFnZSk7CisJbnRmc191bm1hcF9wYWdlKG1pcnJfcGFnZSk7CisKKwkvKiBDb25zdHJ1Y3QgdGhlIG1mdCBtaXJyb3IgcnVubGlzdCBieSBoYW5kLiAqLworCXJsMlswXS52Y24gPSAwOworCXJsMlswXS5sY24gPSB2b2wtPm1mdG1pcnJfbGNuOworCXJsMlswXS5sZW5ndGggPSAodm9sLT5tZnRtaXJyX3NpemUgKiB2b2wtPm1mdF9yZWNvcmRfc2l6ZSArCisJCQl2b2wtPmNsdXN0ZXJfc2l6ZSAtIDEpIC8gdm9sLT5jbHVzdGVyX3NpemU7CisJcmwyWzFdLnZjbiA9IHJsMlswXS5sZW5ndGg7CisJcmwyWzFdLmxjbiA9IExDTl9FTk9FTlQ7CisJcmwyWzFdLmxlbmd0aCA9IDA7CisJLyoKKwkgKiBCZWNhdXNlIHdlIGhhdmUganVzdCByZWFkIGFsbCBvZiB0aGUgbWZ0IG1pcnJvciwgd2Uga25vdyB3ZSBoYXZlCisJICogbWFwcGVkIHRoZSBmdWxsIHJ1bmxpc3QgZm9yIGl0LgorCSAqLworCW1pcnJfbmkgPSBOVEZTX0kodm9sLT5tZnRtaXJyX2lubyk7CisJZG93bl9yZWFkKCZtaXJyX25pLT5ydW5saXN0LmxvY2spOworCXJsID0gbWlycl9uaS0+cnVubGlzdC5ybDsKKwkvKiBDb21wYXJlIHRoZSB0d28gcnVubGlzdHMuICBUaGV5IG11c3QgYmUgaWRlbnRpY2FsLiAqLworCWkgPSAwOworCWRvIHsKKwkJaWYgKHJsMltpXS52Y24gIT0gcmxbaV0udmNuIHx8IHJsMltpXS5sY24gIT0gcmxbaV0ubGNuIHx8CisJCQkJcmwyW2ldLmxlbmd0aCAhPSBybFtpXS5sZW5ndGgpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICIkTUZUTWlyciBsb2NhdGlvbiBtaXNtYXRjaC4gICIKKwkJCQkJIlJ1biBjaGtkc2suIik7CisJCQl1cF9yZWFkKCZtaXJyX25pLT5ydW5saXN0LmxvY2spOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJfSB3aGlsZSAocmwyW2krK10ubGVuZ3RoKTsKKwl1cF9yZWFkKCZtaXJyX25pLT5ydW5saXN0LmxvY2spOworCW50ZnNfZGVidWcoIkRvbmUuIik7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogbG9hZF9hbmRfY2hlY2tfbG9nZmlsZSAtIGxvYWQgYW5kIGNoZWNrIHRoZSBsb2dmaWxlIGlub2RlIGZvciBhIHZvbHVtZQorICogQHZvbDoJbnRmcyBzdXBlciBibG9jayBkZXNjcmliaW5nIGRldmljZSB3aG9zZSBsb2dmaWxlIHRvIGxvYWQKKyAqCisgKiBSZXR1cm4gVFJVRSBvbiBzdWNjZXNzIG9yIEZBTFNFIG9uIGVycm9yLgorICovCitzdGF0aWMgQk9PTCBsb2FkX2FuZF9jaGVja19sb2dmaWxlKG50ZnNfdm9sdW1lICp2b2wpCit7CisJc3RydWN0IGlub2RlICp0bXBfaW5vOworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CisJdG1wX2lubyA9IG50ZnNfaWdldCh2b2wtPnNiLCBGSUxFX0xvZ0ZpbGUpOworCWlmIChJU19FUlIodG1wX2lubykgfHwgaXNfYmFkX2lub2RlKHRtcF9pbm8pKSB7CisJCWlmICghSVNfRVJSKHRtcF9pbm8pKQorCQkJaXB1dCh0bXBfaW5vKTsKKwkJLyogQ2FsbGVyIHdpbGwgZGlzcGxheSBlcnJvciBtZXNzYWdlLiAqLworCQlyZXR1cm4gRkFMU0U7CisJfQorCWlmICghbnRmc19jaGVja19sb2dmaWxlKHRtcF9pbm8pKSB7CisJCWlwdXQodG1wX2lubyk7CisJCS8qIG50ZnNfY2hlY2tfbG9nZmlsZSgpIHdpbGwgaGF2ZSBkaXNwbGF5ZWQgZXJyb3Igb3V0cHV0LiAqLworCQlyZXR1cm4gRkFMU0U7CisJfQorCXZvbC0+bG9nZmlsZV9pbm8gPSB0bXBfaW5vOworCW50ZnNfZGVidWcoIkRvbmUuIik7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogbG9hZF9hbmRfaW5pdF9xdW90YSAtIGxvYWQgYW5kIHNldHVwIHRoZSBxdW90YSBmaWxlIGZvciBhIHZvbHVtZSBpZiBwcmVzZW50CisgKiBAdm9sOgludGZzIHN1cGVyIGJsb2NrIGRlc2NyaWJpbmcgZGV2aWNlIHdob3NlIHF1b3RhIGZpbGUgdG8gbG9hZAorICoKKyAqIFJldHVybiBUUlVFIG9uIHN1Y2Nlc3Mgb3IgRkFMU0Ugb24gZXJyb3IuICBJZiAkUXVvdGEgaXMgbm90IHByZXNlbnQsIHdlCisgKiBsZWF2ZSB2b2wtPnF1b3RhX2lubyBhcyBOVUxMIGFuZCByZXR1cm4gc3VjY2Vzcy4KKyAqLworc3RhdGljIEJPT0wgbG9hZF9hbmRfaW5pdF9xdW90YShudGZzX3ZvbHVtZSAqdm9sKQoreworCU1GVF9SRUYgbXJlZjsKKwlzdHJ1Y3QgaW5vZGUgKnRtcF9pbm87CisJbnRmc19uYW1lICpuYW1lID0gTlVMTDsKKwlzdGF0aWMgY29uc3QgbnRmc2NoYXIgUXVvdGFbN10gPSB7IGNvbnN0X2NwdV90b19sZTE2KCckJyksCisJCQljb25zdF9jcHVfdG9fbGUxNignUScpLCBjb25zdF9jcHVfdG9fbGUxNigndScpLAorCQkJY29uc3RfY3B1X3RvX2xlMTYoJ28nKSwgY29uc3RfY3B1X3RvX2xlMTYoJ3QnKSwKKwkJCWNvbnN0X2NwdV90b19sZTE2KCdhJyksIDAgfTsKKwlzdGF0aWMgbnRmc2NoYXIgUVszXSA9IHsgY29uc3RfY3B1X3RvX2xlMTYoJyQnKSwKKwkJCWNvbnN0X2NwdV90b19sZTE2KCdRJyksIDAgfTsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworCS8qCisJICogRmluZCB0aGUgaW5vZGUgbnVtYmVyIGZvciB0aGUgcXVvdGEgZmlsZSBieSBsb29raW5nIHVwIHRoZSBmaWxlbmFtZQorCSAqICRRdW90YSBpbiB0aGUgZXh0ZW5kZWQgc3lzdGVtIGZpbGVzIGRpcmVjdG9yeSAkRXh0ZW5kLgorCSAqLworCWRvd24oJnZvbC0+ZXh0ZW5kX2luby0+aV9zZW0pOworCW1yZWYgPSBudGZzX2xvb2t1cF9pbm9kZV9ieV9uYW1lKE5URlNfSSh2b2wtPmV4dGVuZF9pbm8pLCBRdW90YSwgNiwKKwkJCSZuYW1lKTsKKwl1cCgmdm9sLT5leHRlbmRfaW5vLT5pX3NlbSk7CisJaWYgKElTX0VSUl9NUkVGKG1yZWYpKSB7CisJCS8qCisJCSAqIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBxdW90YXMgYXJlIGRpc2FibGVkIGFuZCBoYXZlCisJCSAqIG5ldmVyIGJlZW4gZW5hYmxlZCBvbiB0aGlzIHZvbHVtZSwganVzdCByZXR1cm4gc3VjY2Vzcy4KKwkJICovCisJCWlmIChNUkVGX0VSUihtcmVmKSA9PSAtRU5PRU5UKSB7CisJCQludGZzX2RlYnVnKCIkUXVvdGEgbm90IHByZXNlbnQuICBWb2x1bWUgZG9lcyBub3QgaGF2ZSAiCisJCQkJCSJxdW90YXMgZW5hYmxlZC4iKTsKKwkJCS8qCisJCQkgKiBObyBuZWVkIHRvIHRyeSB0byBzZXQgcXVvdGFzIG91dCBvZiBkYXRlIGlmIHRoZXkgYXJlCisJCQkgKiBub3QgZW5hYmxlZC4KKwkJCSAqLworCQkJTlZvbFNldFF1b3RhT3V0T2ZEYXRlKHZvbCk7CisJCQlyZXR1cm4gVFJVRTsKKwkJfQorCQkvKiBBIHJlYWwgZXJyb3Igb2NjdXJlZC4gKi8KKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGZpbmQgaW5vZGUgbnVtYmVyIGZvciAkUXVvdGEuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJLyogV2UgZG8gbm90IGNhcmUgZm9yIHRoZSB0eXBlIG9mIG1hdGNoIHRoYXQgd2FzIGZvdW5kLiAqLworCWlmIChuYW1lKQorCQlrZnJlZShuYW1lKTsKKwkvKiBHZXQgdGhlIGlub2RlLiAqLworCXRtcF9pbm8gPSBudGZzX2lnZXQodm9sLT5zYiwgTVJFRihtcmVmKSk7CisJaWYgKElTX0VSUih0bXBfaW5vKSB8fCBpc19iYWRfaW5vZGUodG1wX2lubykpIHsKKwkJaWYgKCFJU19FUlIodG1wX2lubykpCisJCQlpcHV0KHRtcF9pbm8pOworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gbG9hZCAkUXVvdGEuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJdm9sLT5xdW90YV9pbm8gPSB0bXBfaW5vOworCS8qIEdldCB0aGUgJFEgaW5kZXggYWxsb2NhdGlvbiBhdHRyaWJ1dGUuICovCisJdG1wX2lubyA9IG50ZnNfaW5kZXhfaWdldCh2b2wtPnF1b3RhX2lubywgUSwgMik7CisJaWYgKElTX0VSUih0bXBfaW5vKSkgeworCQludGZzX2Vycm9yKHZvbC0+c2IsICJGYWlsZWQgdG8gbG9hZCAkUXVvdGEvJFEgaW5kZXguIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJdm9sLT5xdW90YV9xX2lubyA9IHRtcF9pbm87CisJbnRmc19kZWJ1ZygiRG9uZS4iKTsKKwlyZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBsb2FkX2FuZF9pbml0X2F0dHJkZWYgLSBsb2FkIHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMgdGFibGUgZm9yIGEgdm9sdW1lCisgKiBAdm9sOgludGZzIHN1cGVyIGJsb2NrIGRlc2NyaWJpbmcgZGV2aWNlIHdob3NlIGF0dHJkZWYgdG8gbG9hZAorICoKKyAqIFJldHVybiBUUlVFIG9uIHN1Y2Nlc3Mgb3IgRkFMU0Ugb24gZXJyb3IuCisgKi8KK3N0YXRpYyBCT09MIGxvYWRfYW5kX2luaXRfYXR0cmRlZihudGZzX3ZvbHVtZSAqdm9sKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSB2b2wtPnNiOworCXN0cnVjdCBpbm9kZSAqaW5vOworCXN0cnVjdCBwYWdlICpwYWdlOworCXVuc2lnbmVkIGxvbmcgaW5kZXgsIG1heF9pbmRleDsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworCS8qIFJlYWQgYXR0cmRlZiB0YWJsZSBhbmQgc2V0dXAgdm9sLT5hdHRyZGVmIGFuZCB2b2wtPmF0dHJkZWZfc2l6ZS4gKi8KKwlpbm8gPSBudGZzX2lnZXQoc2IsIEZJTEVfQXR0ckRlZik7CisJaWYgKElTX0VSUihpbm8pIHx8IGlzX2JhZF9pbm9kZShpbm8pKSB7CisJCWlmICghSVNfRVJSKGlubykpCisJCQlpcHV0KGlubyk7CisJCWdvdG8gZmFpbGVkOworCX0KKwkvKiBUaGUgc2l6ZSBvZiBGSUxFX0F0dHJEZWYgbXVzdCBiZSBhYm92ZSAwIGFuZCBmaXQgaW5zaWRlIDMxIGJpdHMuICovCisJaWYgKCFpbm8tPmlfc2l6ZSB8fCBpbm8tPmlfc2l6ZSA+IDB4N2ZmZmZmZmYpCisJCWdvdG8gaXB1dF9mYWlsZWQ7CisJdm9sLT5hdHRyZGVmID0gKEFUVFJfREVGKiludGZzX21hbGxvY19ub2ZzKGluby0+aV9zaXplKTsKKwlpZiAoIXZvbC0+YXR0cmRlZikKKwkJZ290byBpcHV0X2ZhaWxlZDsKKwlpbmRleCA9IDA7CisJbWF4X2luZGV4ID0gaW5vLT5pX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlzaXplID0gUEFHRV9DQUNIRV9TSVpFOworCXdoaWxlIChpbmRleCA8IG1heF9pbmRleCkgeworCQkvKiBSZWFkIHRoZSBhdHRyZGVmIHRhYmxlIGFuZCBjb3B5IGl0IGludG8gdGhlIGxpbmVhciBidWZmZXIuICovCityZWFkX3BhcnRpYWxfYXR0cmRlZl9wYWdlOgorCQlwYWdlID0gbnRmc19tYXBfcGFnZShpbm8tPmlfbWFwcGluZywgaW5kZXgpOworCQlpZiAoSVNfRVJSKHBhZ2UpKQorCQkJZ290byBmcmVlX2lwdXRfZmFpbGVkOworCQltZW1jcHkoKHU4Kil2b2wtPmF0dHJkZWYgKyAoaW5kZXgrKyA8PCBQQUdFX0NBQ0hFX1NISUZUKSwKKwkJCQlwYWdlX2FkZHJlc3MocGFnZSksIHNpemUpOworCQludGZzX3VubWFwX3BhZ2UocGFnZSk7CisJfTsKKwlpZiAoc2l6ZSA9PSBQQUdFX0NBQ0hFX1NJWkUpIHsKKwkJc2l6ZSA9IGluby0+aV9zaXplICYgflBBR0VfQ0FDSEVfTUFTSzsKKwkJaWYgKHNpemUpCisJCQlnb3RvIHJlYWRfcGFydGlhbF9hdHRyZGVmX3BhZ2U7CisJfQorCXZvbC0+YXR0cmRlZl9zaXplID0gaW5vLT5pX3NpemU7CisJbnRmc19kZWJ1ZygiUmVhZCAlbGx1IGJ5dGVzIGZyb20gJEF0dHJEZWYuIiwgaW5vLT5pX3NpemUpOworCWlwdXQoaW5vKTsKKwlyZXR1cm4gVFJVRTsKK2ZyZWVfaXB1dF9mYWlsZWQ6CisJbnRmc19mcmVlKHZvbC0+YXR0cmRlZik7CisJdm9sLT5hdHRyZGVmID0gTlVMTDsKK2lwdXRfZmFpbGVkOgorCWlwdXQoaW5vKTsKK2ZhaWxlZDoKKwludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgYXR0cmlidXRlIGRlZmluaXRpb24gdGFibGUuIik7CisJcmV0dXJuIEZBTFNFOworfQorCisjZW5kaWYgLyogTlRGU19SVyAqLworCisvKioKKyAqIGxvYWRfYW5kX2luaXRfdXBjYXNlIC0gbG9hZCB0aGUgdXBjYXNlIHRhYmxlIGZvciBhbiBudGZzIHZvbHVtZQorICogQHZvbDoJbnRmcyBzdXBlciBibG9jayBkZXNjcmliaW5nIGRldmljZSB3aG9zZSB1cGNhc2UgdG8gbG9hZAorICoKKyAqIFJldHVybiBUUlVFIG9uIHN1Y2Nlc3Mgb3IgRkFMU0Ugb24gZXJyb3IuCisgKi8KK3N0YXRpYyBCT09MIGxvYWRfYW5kX2luaXRfdXBjYXNlKG50ZnNfdm9sdW1lICp2b2wpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IHZvbC0+c2I7CisJc3RydWN0IGlub2RlICppbm87CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdW5zaWduZWQgbG9uZyBpbmRleCwgbWF4X2luZGV4OworCXVuc2lnbmVkIGludCBzaXplOworCWludCBpLCBtYXg7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwkvKiBSZWFkIHVwY2FzZSB0YWJsZSBhbmQgc2V0dXAgdm9sLT51cGNhc2UgYW5kIHZvbC0+dXBjYXNlX2xlbi4gKi8KKwlpbm8gPSBudGZzX2lnZXQoc2IsIEZJTEVfVXBDYXNlKTsKKwlpZiAoSVNfRVJSKGlubykgfHwgaXNfYmFkX2lub2RlKGlubykpIHsKKwkJaWYgKCFJU19FUlIoaW5vKSkKKwkJCWlwdXQoaW5vKTsKKwkJZ290byB1cGNhc2VfZmFpbGVkOworCX0KKwkvKgorCSAqIFRoZSB1cGNhc2Ugc2l6ZSBtdXN0IG5vdCBiZSBhYm92ZSA2NGsgVW5pY29kZSBjaGFyYWN0ZXJzLCBtdXN0IG5vdAorCSAqIGJlIHplcm8gYW5kIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBzaXplb2YobnRmc2NoYXIpLgorCSAqLworCWlmICghaW5vLT5pX3NpemUgfHwgaW5vLT5pX3NpemUgJiAoc2l6ZW9mKG50ZnNjaGFyKSAtIDEpIHx8CisJCQlpbm8tPmlfc2l6ZSA+IDY0VUxMICogMTAyNCAqIHNpemVvZihudGZzY2hhcikpCisJCWdvdG8gaXB1dF91cGNhc2VfZmFpbGVkOworCXZvbC0+dXBjYXNlID0gKG50ZnNjaGFyKiludGZzX21hbGxvY19ub2ZzKGluby0+aV9zaXplKTsKKwlpZiAoIXZvbC0+dXBjYXNlKQorCQlnb3RvIGlwdXRfdXBjYXNlX2ZhaWxlZDsKKwlpbmRleCA9IDA7CisJbWF4X2luZGV4ID0gaW5vLT5pX3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlzaXplID0gUEFHRV9DQUNIRV9TSVpFOworCXdoaWxlIChpbmRleCA8IG1heF9pbmRleCkgeworCQkvKiBSZWFkIHRoZSB1cGNhc2UgdGFibGUgYW5kIGNvcHkgaXQgaW50byB0aGUgbGluZWFyIGJ1ZmZlci4gKi8KK3JlYWRfcGFydGlhbF91cGNhc2VfcGFnZToKKwkJcGFnZSA9IG50ZnNfbWFwX3BhZ2UoaW5vLT5pX21hcHBpbmcsIGluZGV4KTsKKwkJaWYgKElTX0VSUihwYWdlKSkKKwkJCWdvdG8gaXB1dF91cGNhc2VfZmFpbGVkOworCQltZW1jcHkoKGNoYXIqKXZvbC0+dXBjYXNlICsgKGluZGV4KysgPDwgUEFHRV9DQUNIRV9TSElGVCksCisJCQkJcGFnZV9hZGRyZXNzKHBhZ2UpLCBzaXplKTsKKwkJbnRmc191bm1hcF9wYWdlKHBhZ2UpOworCX07CisJaWYgKHNpemUgPT0gUEFHRV9DQUNIRV9TSVpFKSB7CisJCXNpemUgPSBpbm8tPmlfc2l6ZSAmIH5QQUdFX0NBQ0hFX01BU0s7CisJCWlmIChzaXplKQorCQkJZ290byByZWFkX3BhcnRpYWxfdXBjYXNlX3BhZ2U7CisJfQorCXZvbC0+dXBjYXNlX2xlbiA9IGluby0+aV9zaXplID4+IFVDSEFSX1RfU0laRV9CSVRTOworCW50ZnNfZGVidWcoIlJlYWQgJWxsdSBieXRlcyBmcm9tICRVcENhc2UgKGV4cGVjdGVkICV6dSBieXRlcykuIiwKKwkJCWluby0+aV9zaXplLCA2NCAqIDEwMjQgKiBzaXplb2YobnRmc2NoYXIpKTsKKwlpcHV0KGlubyk7CisJZG93bigmbnRmc19sb2NrKTsKKwlpZiAoIWRlZmF1bHRfdXBjYXNlKSB7CisJCW50ZnNfZGVidWcoIlVzaW5nIHZvbHVtZSBzcGVjaWZpZWQgJFVwQ2FzZSBzaW5jZSBkZWZhdWx0IGlzICIKKwkJCQkibm90IHByZXNlbnQuIik7CisJCXVwKCZudGZzX2xvY2spOworCQlyZXR1cm4gVFJVRTsKKwl9CisJbWF4ID0gZGVmYXVsdF91cGNhc2VfbGVuOworCWlmIChtYXggPiB2b2wtPnVwY2FzZV9sZW4pCisJCW1heCA9IHZvbC0+dXBjYXNlX2xlbjsKKwlmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspCisJCWlmICh2b2wtPnVwY2FzZVtpXSAhPSBkZWZhdWx0X3VwY2FzZVtpXSkKKwkJCWJyZWFrOworCWlmIChpID09IG1heCkgeworCQludGZzX2ZyZWUodm9sLT51cGNhc2UpOworCQl2b2wtPnVwY2FzZSA9IGRlZmF1bHRfdXBjYXNlOworCQl2b2wtPnVwY2FzZV9sZW4gPSBtYXg7CisJCW50ZnNfbnJfdXBjYXNlX3VzZXJzKys7CisJCXVwKCZudGZzX2xvY2spOworCQludGZzX2RlYnVnKCJWb2x1bWUgc3BlY2lmaWVkICRVcENhc2UgbWF0Y2hlcyBkZWZhdWx0LiBVc2luZyAiCisJCQkJImRlZmF1bHQuIik7CisJCXJldHVybiBUUlVFOworCX0KKwl1cCgmbnRmc19sb2NrKTsKKwludGZzX2RlYnVnKCJVc2luZyB2b2x1bWUgc3BlY2lmaWVkICRVcENhc2Ugc2luY2UgaXQgZG9lcyBub3QgbWF0Y2ggIgorCQkJInRoZSBkZWZhdWx0LiIpOworCXJldHVybiBUUlVFOworaXB1dF91cGNhc2VfZmFpbGVkOgorCWlwdXQoaW5vKTsKKwludGZzX2ZyZWUodm9sLT51cGNhc2UpOworCXZvbC0+dXBjYXNlID0gTlVMTDsKK3VwY2FzZV9mYWlsZWQ6CisJZG93bigmbnRmc19sb2NrKTsKKwlpZiAoZGVmYXVsdF91cGNhc2UpIHsKKwkJdm9sLT51cGNhc2UgPSBkZWZhdWx0X3VwY2FzZTsKKwkJdm9sLT51cGNhc2VfbGVuID0gZGVmYXVsdF91cGNhc2VfbGVuOworCQludGZzX25yX3VwY2FzZV91c2VycysrOworCQl1cCgmbnRmc19sb2NrKTsKKwkJbnRmc19lcnJvcihzYiwgIkZhaWxlZCB0byBsb2FkICRVcENhc2UgZnJvbSB0aGUgdm9sdW1lLiBVc2luZyAiCisJCQkJImRlZmF1bHQuIik7CisJCXJldHVybiBUUlVFOworCX0KKwl1cCgmbnRmc19sb2NrKTsKKwludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgdXBjYXNlIHRhYmxlLiIpOworCXJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBsb2FkX3N5c3RlbV9maWxlcyAtIG9wZW4gdGhlIHN5c3RlbSBmaWxlcyB1c2luZyBub3JtYWwgZnVuY3Rpb25zCisgKiBAdm9sOgludGZzIHN1cGVyIGJsb2NrIGRlc2NyaWJpbmcgZGV2aWNlIHdob3NlIHN5c3RlbSBmaWxlcyB0byBsb2FkCisgKgorICogT3BlbiB0aGUgc3lzdGVtIGZpbGVzIHdpdGggbm9ybWFsIGFjY2VzcyBmdW5jdGlvbnMgYW5kIGNvbXBsZXRlIHNldHRpbmcgdXAKKyAqIHRoZSBudGZzIHN1cGVyIGJsb2NrIEB2b2wuCisgKgorICogUmV0dXJuIFRSVUUgb24gc3VjY2VzcyBvciBGQUxTRSBvbiBlcnJvci4KKyAqLworc3RhdGljIEJPT0wgbG9hZF9zeXN0ZW1fZmlsZXMobnRmc192b2x1bWUgKnZvbCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gdm9sLT5zYjsKKwlNRlRfUkVDT1JEICptOworCVZPTFVNRV9JTkZPUk1BVElPTiAqdmk7CisJbnRmc19hdHRyX3NlYXJjaF9jdHggKmN0eDsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworI2lmZGVmIE5URlNfUlcKKwkvKiBHZXQgbWZ0IG1pcnJvciBpbm9kZSBjb21wYXJlIHRoZSBjb250ZW50cyBvZiAkTUZUIGFuZCAkTUZUTWlyci4gKi8KKwlpZiAoIWxvYWRfYW5kX2luaXRfbWZ0X21pcnJvcih2b2wpIHx8ICFjaGVja19tZnRfbWlycm9yKHZvbCkpIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmVzMSA9ICJGYWlsZWQgdG8gbG9hZCAkTUZUTWlyciI7CisJCXN0YXRpYyBjb25zdCBjaGFyICplczIgPSAiJE1GVE1pcnIgZG9lcyBub3QgbWF0Y2ggJE1GVCI7CisJCXN0YXRpYyBjb25zdCBjaGFyICplczMgPSAiLiAgUnVuIG50ZnNmaXggYW5kL29yIGNoa2Rzay4iOworCisJCS8qIElmIGEgcmVhZC13cml0ZSBtb3VudCwgY29udmVydCBpdCB0byBhIHJlYWQtb25seSBtb3VudC4gKi8KKwkJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCQlpZiAoISh2b2wtPm9uX2Vycm9ycyAmIChPTl9FUlJPUlNfUkVNT1VOVF9STyB8CisJCQkJCU9OX0VSUk9SU19DT05USU5VRSkpKSB7CisJCQkJbnRmc19lcnJvcihzYiwgIiVzIGFuZCBuZWl0aGVyIG9uX2Vycm9ycz0iCisJCQkJCQkiY29udGludWUgbm9yIG9uX2Vycm9ycz0iCisJCQkJCQkicmVtb3VudC1ybyB3YXMgc3BlY2lmaWVkJXMiLAorCQkJCQkJIXZvbC0+bWZ0bWlycl9pbm8gPyBlczEgOiBlczIsCisJCQkJCQllczMpOworCQkJCWdvdG8gaXB1dF9taXJyX2Vycl9vdXQ7CisJCQl9CisJCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFkgfCBNU19OT0FUSU1FIHwgTVNfTk9ESVJBVElNRTsKKwkJCW50ZnNfZXJyb3Ioc2IsICIlcy4gIE1vdW50aW5nIHJlYWQtb25seSVzIiwKKwkJCQkJIXZvbC0+bWZ0bWlycl9pbm8gPyBlczEgOiBlczIsIGVzMyk7CisJCX0gZWxzZQorCQkJbnRmc193YXJuaW5nKHNiLCAiJXMuICBXaWxsIG5vdCBiZSBhYmxlIHRvIHJlbW91bnQgIgorCQkJCQkicmVhZC13cml0ZSVzIiwKKwkJCQkJIXZvbC0+bWZ0bWlycl9pbm8gPyBlczEgOiBlczIsIGVzMyk7CisJCS8qIFRoaXMgd2lsbCBwcmV2ZW50IGEgcmVhZC13cml0ZSByZW1vdW50LiAqLworCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJfQorI2VuZGlmIC8qIE5URlNfUlcgKi8KKwkvKiBHZXQgbWZ0IGJpdG1hcCBhdHRyaWJ1dGUgaW5vZGUuICovCisJdm9sLT5tZnRibXBfaW5vID0gbnRmc19hdHRyX2lnZXQodm9sLT5tZnRfaW5vLCBBVF9CSVRNQVAsIE5VTEwsIDApOworCWlmIChJU19FUlIodm9sLT5tZnRibXBfaW5vKSkgeworCQludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIGxvYWQgJE1GVC8kQklUTUFQIGF0dHJpYnV0ZS4iKTsKKwkJZ290byBpcHV0X21pcnJfZXJyX291dDsKKwl9CisJLyogUmVhZCB1cGNhc2UgdGFibGUgYW5kIHNldHVwIEB2b2wtPnVwY2FzZSBhbmQgQHZvbC0+dXBjYXNlX2xlbi4gKi8KKwlpZiAoIWxvYWRfYW5kX2luaXRfdXBjYXNlKHZvbCkpCisJCWdvdG8gaXB1dF9tZnRibXBfZXJyX291dDsKKyNpZmRlZiBOVEZTX1JXCisJLyoKKwkgKiBSZWFkIGF0dHJpYnV0ZSBkZWZpbml0aW9ucyB0YWJsZSBhbmQgc2V0dXAgQHZvbC0+YXR0cmRlZiBhbmQKKwkgKiBAdm9sLT5hdHRyZGVmX3NpemUuCisJICovCisJaWYgKCFsb2FkX2FuZF9pbml0X2F0dHJkZWYodm9sKSkKKwkJZ290byBpcHV0X3VwY2FzZV9lcnJfb3V0OworI2VuZGlmIC8qIE5URlNfUlcgKi8KKwkvKgorCSAqIEdldCB0aGUgY2x1c3RlciBhbGxvY2F0aW9uIGJpdG1hcCBpbm9kZSBhbmQgdmVyaWZ5IHRoZSBzaXplLCBubworCSAqIG5lZWQgZm9yIGFueSBsb2NraW5nIGF0IHRoaXMgc3RhZ2UgYXMgd2UgYXJlIGFscmVhZHkgcnVubmluZworCSAqIGV4Y2x1c2l2ZWx5IGFzIHdlIGFyZSBtb3VudCBpbiBwcm9ncmVzcyB0YXNrLgorCSAqLworCXZvbC0+bGNuYm1wX2lubyA9IG50ZnNfaWdldChzYiwgRklMRV9CaXRtYXApOworCWlmIChJU19FUlIodm9sLT5sY25ibXBfaW5vKSB8fCBpc19iYWRfaW5vZGUodm9sLT5sY25ibXBfaW5vKSkgeworCQlpZiAoIUlTX0VSUih2b2wtPmxjbmJtcF9pbm8pKQorCQkJaXB1dCh2b2wtPmxjbmJtcF9pbm8pOworCQlnb3RvIGJpdG1hcF9mYWlsZWQ7CisJfQorCWlmICgodm9sLT5ucl9jbHVzdGVycyArIDcpID4+IDMgPiB2b2wtPmxjbmJtcF9pbm8tPmlfc2l6ZSkgeworCQlpcHV0KHZvbC0+bGNuYm1wX2lubyk7CitiaXRtYXBfZmFpbGVkOgorCQludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIGxvYWQgJEJpdG1hcC4iKTsKKwkJZ290byBpcHV0X2F0dHJkZWZfZXJyX291dDsKKwl9CisJLyoKKwkgKiBHZXQgdGhlIHZvbHVtZSBpbm9kZSBhbmQgc2V0dXAgb3VyIGNhY2hlIG9mIHRoZSB2b2x1bWUgZmxhZ3MgYW5kCisJICogdmVyc2lvbi4KKwkgKi8KKwl2b2wtPnZvbF9pbm8gPSBudGZzX2lnZXQoc2IsIEZJTEVfVm9sdW1lKTsKKwlpZiAoSVNfRVJSKHZvbC0+dm9sX2lubykgfHwgaXNfYmFkX2lub2RlKHZvbC0+dm9sX2lubykpIHsKKwkJaWYgKCFJU19FUlIodm9sLT52b2xfaW5vKSkKKwkJCWlwdXQodm9sLT52b2xfaW5vKTsKK3ZvbHVtZV9mYWlsZWQ6CisJCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gbG9hZCAkVm9sdW1lLiIpOworCQlnb3RvIGlwdXRfbGNuYm1wX2Vycl9vdXQ7CisJfQorCW0gPSBtYXBfbWZ0X3JlY29yZChOVEZTX0kodm9sLT52b2xfaW5vKSk7CisJaWYgKElTX0VSUihtKSkgeworaXB1dF92b2x1bWVfZmFpbGVkOgorCQlpcHV0KHZvbC0+dm9sX2lubyk7CisJCWdvdG8gdm9sdW1lX2ZhaWxlZDsKKwl9CisJaWYgKCEoY3R4ID0gbnRmc19hdHRyX2dldF9zZWFyY2hfY3R4KE5URlNfSSh2b2wtPnZvbF9pbm8pLCBtKSkpIHsKKwkJbnRmc19lcnJvcihzYiwgIkZhaWxlZCB0byBnZXQgYXR0cmlidXRlIHNlYXJjaCBjb250ZXh0LiIpOworCQlnb3RvIGdldF9jdHhfdm9sX2ZhaWxlZDsKKwl9CisJaWYgKG50ZnNfYXR0cl9sb29rdXAoQVRfVk9MVU1FX0lORk9STUFUSU9OLCBOVUxMLCAwLCAwLCAwLCBOVUxMLCAwLAorCQkJY3R4KSB8fCBjdHgtPmF0dHItPm5vbl9yZXNpZGVudCB8fCBjdHgtPmF0dHItPmZsYWdzKSB7CitlcnJfcHV0X3ZvbDoKKwkJbnRmc19hdHRyX3B1dF9zZWFyY2hfY3R4KGN0eCk7CitnZXRfY3R4X3ZvbF9mYWlsZWQ6CisJCXVubWFwX21mdF9yZWNvcmQoTlRGU19JKHZvbC0+dm9sX2lubykpOworCQlnb3RvIGlwdXRfdm9sdW1lX2ZhaWxlZDsKKwl9CisJdmkgPSAoVk9MVU1FX0lORk9STUFUSU9OKikoKGNoYXIqKWN0eC0+YXR0ciArCisJCQlsZTE2X3RvX2NwdShjdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfb2Zmc2V0KSk7CisJLyogU29tZSBib3VuZHMgY2hlY2tzLiAqLworCWlmICgodTgqKXZpIDwgKHU4KiljdHgtPmF0dHIgfHwgKHU4Kil2aSArCisJCQlsZTMyX3RvX2NwdShjdHgtPmF0dHItPmRhdGEucmVzaWRlbnQudmFsdWVfbGVuZ3RoKSA+CisJCQkodTgqKWN0eC0+YXR0ciArIGxlMzJfdG9fY3B1KGN0eC0+YXR0ci0+bGVuZ3RoKSkKKwkJZ290byBlcnJfcHV0X3ZvbDsKKwkvKiBDb3B5IHRoZSB2b2x1bWUgZmxhZ3MgYW5kIHZlcnNpb24gdG8gdGhlIG50ZnNfdm9sdW1lIHN0cnVjdHVyZS4gKi8KKwl2b2wtPnZvbF9mbGFncyA9IHZpLT5mbGFnczsKKwl2b2wtPm1ham9yX3ZlciA9IHZpLT5tYWpvcl92ZXI7CisJdm9sLT5taW5vcl92ZXIgPSB2aS0+bWlub3JfdmVyOworCW50ZnNfYXR0cl9wdXRfc2VhcmNoX2N0eChjdHgpOworCXVubWFwX21mdF9yZWNvcmQoTlRGU19JKHZvbC0+dm9sX2lubykpOworCXByaW50ayhLRVJOX0lORk8gIk5URlMgdm9sdW1lIHZlcnNpb24gJWkuJWkuXG4iLCB2b2wtPm1ham9yX3ZlciwKKwkJCXZvbC0+bWlub3JfdmVyKTsKKyNpZmRlZiBOVEZTX1JXCisJLyogTWFrZSBzdXJlIHRoYXQgbm8gdW5zdXBwb3J0ZWQgdm9sdW1lIGZsYWdzIGFyZSBzZXQuICovCisJaWYgKHZvbC0+dm9sX2ZsYWdzICYgVk9MVU1FX01VU1RfTU9VTlRfUk9fTUFTSykgeworCQlzdGF0aWMgY29uc3QgY2hhciAqZXMxYSA9ICJWb2x1bWUgaXMgZGlydHkiOworCQlzdGF0aWMgY29uc3QgY2hhciAqZXMxYiA9ICJWb2x1bWUgaGFzIHVuc3VwcG9ydGVkIGZsYWdzIHNldCI7CisJCXN0YXRpYyBjb25zdCBjaGFyICplczIgPSAiLiAgUnVuIGNoa2RzayBhbmQgbW91bnQgaW4gV2luZG93cy4iOworCQljb25zdCBjaGFyICplczE7CisJCQorCQllczEgPSB2b2wtPnZvbF9mbGFncyAmIFZPTFVNRV9JU19ESVJUWSA/IGVzMWEgOiBlczFiOworCQkvKiBJZiBhIHJlYWQtd3JpdGUgbW91bnQsIGNvbnZlcnQgaXQgdG8gYSByZWFkLW9ubHkgbW91bnQuICovCisJCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQkJaWYgKCEodm9sLT5vbl9lcnJvcnMgJiAoT05fRVJST1JTX1JFTU9VTlRfUk8gfAorCQkJCQlPTl9FUlJPUlNfQ09OVElOVUUpKSkgeworCQkJCW50ZnNfZXJyb3Ioc2IsICIlcyBhbmQgbmVpdGhlciBvbl9lcnJvcnM9IgorCQkJCQkJImNvbnRpbnVlIG5vciBvbl9lcnJvcnM9IgorCQkJCQkJInJlbW91bnQtcm8gd2FzIHNwZWNpZmllZCVzIiwKKwkJCQkJCWVzMSwgZXMyKTsKKwkJCQlnb3RvIGlwdXRfdm9sX2Vycl9vdXQ7CisJCQl9CisJCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFkgfCBNU19OT0FUSU1FIHwgTVNfTk9ESVJBVElNRTsKKwkJCW50ZnNfZXJyb3Ioc2IsICIlcy4gIE1vdW50aW5nIHJlYWQtb25seSVzIiwgZXMxLCBlczIpOworCQl9IGVsc2UKKwkJCW50ZnNfd2FybmluZyhzYiwgIiVzLiAgV2lsbCBub3QgYmUgYWJsZSB0byByZW1vdW50ICIKKwkJCQkJInJlYWQtd3JpdGUlcyIsIGVzMSwgZXMyKTsKKwkJLyoKKwkJICogRG8gbm90IHNldCBOVm9sRXJyb3JzKCkgYmVjYXVzZSBudGZzX3JlbW91bnQoKSByZS1jaGVja3MgdGhlCisJCSAqIGZsYWdzIHdoaWNoIHdlIG5lZWQgdG8gZG8gaW4gY2FzZSBhbnkgZmxhZ3MgaGF2ZSBjaGFuZ2VkLgorCQkgKi8KKwl9CisJLyoKKwkgKiBHZXQgdGhlIGlub2RlIGZvciB0aGUgbG9nZmlsZSwgY2hlY2sgaXQgYW5kIGRldGVybWluZSBpZiB0aGUgdm9sdW1lCisJICogd2FzIHNodXRkb3duIGNsZWFubHkuCisJICovCisJaWYgKCFsb2FkX2FuZF9jaGVja19sb2dmaWxlKHZvbCkgfHwKKwkJCSFudGZzX2lzX2xvZ2ZpbGVfY2xlYW4odm9sLT5sb2dmaWxlX2lubykpIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmVzMWEgPSAiRmFpbGVkIHRvIGxvYWQgJExvZ0ZpbGUiOworCQlzdGF0aWMgY29uc3QgY2hhciAqZXMxYiA9ICIkTG9nRmlsZSBpcyBub3QgY2xlYW4iOworCQlzdGF0aWMgY29uc3QgY2hhciAqZXMyID0gIi4gIE1vdW50IGluIFdpbmRvd3MuIjsKKwkJY29uc3QgY2hhciAqZXMxOworCisJCWVzMSA9ICF2b2wtPmxvZ2ZpbGVfaW5vID8gZXMxYSA6IGVzMWI7CisJCS8qIElmIGEgcmVhZC13cml0ZSBtb3VudCwgY29udmVydCBpdCB0byBhIHJlYWQtb25seSBtb3VudC4gKi8KKwkJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCQlpZiAoISh2b2wtPm9uX2Vycm9ycyAmIChPTl9FUlJPUlNfUkVNT1VOVF9STyB8CisJCQkJCU9OX0VSUk9SU19DT05USU5VRSkpKSB7CisJCQkJbnRmc19lcnJvcihzYiwgIiVzIGFuZCBuZWl0aGVyIG9uX2Vycm9ycz0iCisJCQkJCQkiY29udGludWUgbm9yIG9uX2Vycm9ycz0iCisJCQkJCQkicmVtb3VudC1ybyB3YXMgc3BlY2lmaWVkJXMiLAorCQkJCQkJZXMxLCBlczIpOworCQkJCWdvdG8gaXB1dF9sb2dmaWxlX2Vycl9vdXQ7CisJCQl9CisJCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFkgfCBNU19OT0FUSU1FIHwgTVNfTk9ESVJBVElNRTsKKwkJCW50ZnNfZXJyb3Ioc2IsICIlcy4gIE1vdW50aW5nIHJlYWQtb25seSVzIiwgZXMxLCBlczIpOworCQl9IGVsc2UKKwkJCW50ZnNfd2FybmluZyhzYiwgIiVzLiAgV2lsbCBub3QgYmUgYWJsZSB0byByZW1vdW50ICIKKwkJCQkJInJlYWQtd3JpdGUlcyIsIGVzMSwgZXMyKTsKKwkJLyogVGhpcyB3aWxsIHByZXZlbnQgYSByZWFkLXdyaXRlIHJlbW91bnQuICovCisJCU5Wb2xTZXRFcnJvcnModm9sKTsKKwl9CisJLyogSWYgKHN0aWxsKSBhIHJlYWQtd3JpdGUgbW91bnQsIG1hcmsgdGhlIHZvbHVtZSBkaXJ0eS4gKi8KKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkgJiYKKwkJCW50ZnNfc2V0X3ZvbHVtZV9mbGFncyh2b2wsIFZPTFVNRV9JU19ESVJUWSkpIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmVzMSA9ICJGYWlsZWQgdG8gc2V0IGRpcnR5IGJpdCBpbiB2b2x1bWUgIgorCQkJCSJpbmZvcm1hdGlvbiBmbGFncyI7CisJCXN0YXRpYyBjb25zdCBjaGFyICplczIgPSAiLiAgUnVuIGNoa2Rzay4iOworCisJCS8qIENvbnZlcnQgdG8gYSByZWFkLW9ubHkgbW91bnQuICovCisJCWlmICghKHZvbC0+b25fZXJyb3JzICYgKE9OX0VSUk9SU19SRU1PVU5UX1JPIHwKKwkJCQlPTl9FUlJPUlNfQ09OVElOVUUpKSkgeworCQkJbnRmc19lcnJvcihzYiwgIiVzIGFuZCBuZWl0aGVyIG9uX2Vycm9ycz1jb250aW51ZSBub3IgIgorCQkJCQkib25fZXJyb3JzPXJlbW91bnQtcm8gd2FzIHNwZWNpZmllZCVzIiwKKwkJCQkJZXMxLCBlczIpOworCQkJZ290byBpcHV0X2xvZ2ZpbGVfZXJyX291dDsKKwkJfQorCQludGZzX2Vycm9yKHNiLCAiJXMuICBNb3VudGluZyByZWFkLW9ubHklcyIsIGVzMSwgZXMyKTsKKwkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZIHwgTVNfTk9BVElNRSB8IE1TX05PRElSQVRJTUU7CisJCS8qCisJCSAqIERvIG5vdCBzZXQgTlZvbEVycm9ycygpIGJlY2F1c2UgbnRmc19yZW1vdW50KCkgbWlnaHQgbWFuYWdlCisJCSAqIHRvIHNldCB0aGUgZGlydHkgZmxhZyBpbiB3aGljaCBjYXNlIGFsbCB3b3VsZCBiZSB3ZWxsLgorCQkgKi8KKwl9CisjaWYgMAorCS8vIFRPRE86IEVuYWJsZSB0aGlzIGNvZGUgb25jZSB3ZSBzdGFydCBtb2RpZnlpbmcgYW55dGhpbmcgdGhhdCBpcworCS8vCSBkaWZmZXJlbnQgYmV0d2VlbiBOVEZTIDEuMiBhbmQgMy54Li4uCisJLyoKKwkgKiBJZiAoc3RpbGwpIGEgcmVhZC13cml0ZSBtb3VudCwgc2V0IHRoZSBOVDQgY29tcGF0aWJpbGl0eSBmbGFnIG9uCisJICogbmV3ZXIgTlRGUyB2ZXJzaW9uIHZvbHVtZXMuCisJICovCisJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpICYmICh2b2wtPm1ham9yX3ZlciA+IDEpICYmCisJCQludGZzX3NldF92b2x1bWVfZmxhZ3Modm9sLCBWT0xVTUVfTU9VTlRFRF9PTl9OVDQpKSB7CisJCXN0YXRpYyBjb25zdCBjaGFyICplczEgPSAiRmFpbGVkIHRvIHNldCBOVDQgY29tcGF0aWJpbGl0eSBmbGFnIjsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmVzMiA9ICIuICBSdW4gY2hrZHNrLiI7CisKKwkJLyogQ29udmVydCB0byBhIHJlYWQtb25seSBtb3VudC4gKi8KKwkJaWYgKCEodm9sLT5vbl9lcnJvcnMgJiAoT05fRVJST1JTX1JFTU9VTlRfUk8gfAorCQkJCU9OX0VSUk9SU19DT05USU5VRSkpKSB7CisJCQludGZzX2Vycm9yKHNiLCAiJXMgYW5kIG5laXRoZXIgb25fZXJyb3JzPWNvbnRpbnVlIG5vciAiCisJCQkJCSJvbl9lcnJvcnM9cmVtb3VudC1ybyB3YXMgc3BlY2lmaWVkJXMiLAorCQkJCQllczEsIGVzMik7CisJCQlnb3RvIGlwdXRfbG9nZmlsZV9lcnJfb3V0OworCQl9CisJCW50ZnNfZXJyb3Ioc2IsICIlcy4gIE1vdW50aW5nIHJlYWQtb25seSVzIiwgZXMxLCBlczIpOworCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFkgfCBNU19OT0FUSU1FIHwgTVNfTk9ESVJBVElNRTsKKwkJTlZvbFNldEVycm9ycyh2b2wpOworCX0KKyNlbmRpZgorCS8qIElmIChzdGlsbCkgYSByZWFkLXdyaXRlIG1vdW50LCBlbXB0eSB0aGUgbG9nZmlsZS4gKi8KKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkgJiYKKwkJCSFudGZzX2VtcHR5X2xvZ2ZpbGUodm9sLT5sb2dmaWxlX2lubykpIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmVzMSA9ICJGYWlsZWQgdG8gZW1wdHkgJExvZ0ZpbGUiOworCQlzdGF0aWMgY29uc3QgY2hhciAqZXMyID0gIi4gIE1vdW50IGluIFdpbmRvd3MuIjsKKworCQkvKiBDb252ZXJ0IHRvIGEgcmVhZC1vbmx5IG1vdW50LiAqLworCQlpZiAoISh2b2wtPm9uX2Vycm9ycyAmIChPTl9FUlJPUlNfUkVNT1VOVF9STyB8CisJCQkJT05fRVJST1JTX0NPTlRJTlVFKSkpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICIlcyBhbmQgbmVpdGhlciBvbl9lcnJvcnM9Y29udGludWUgbm9yICIKKwkJCQkJIm9uX2Vycm9ycz1yZW1vdW50LXJvIHdhcyBzcGVjaWZpZWQlcyIsCisJCQkJCWVzMSwgZXMyKTsKKwkJCWdvdG8gaXB1dF9sb2dmaWxlX2Vycl9vdXQ7CisJCX0KKwkJbnRmc19lcnJvcihzYiwgIiVzLiAgTW91bnRpbmcgcmVhZC1vbmx5JXMiLCBlczEsIGVzMik7CisJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWSB8IE1TX05PQVRJTUUgfCBNU19OT0RJUkFUSU1FOworCQlOVm9sU2V0RXJyb3JzKHZvbCk7CisJfQorI2VuZGlmIC8qIE5URlNfUlcgKi8KKwkvKiBHZXQgdGhlIHJvb3QgZGlyZWN0b3J5IGlub2RlLiAqLworCXZvbC0+cm9vdF9pbm8gPSBudGZzX2lnZXQoc2IsIEZJTEVfcm9vdCk7CisJaWYgKElTX0VSUih2b2wtPnJvb3RfaW5vKSB8fCBpc19iYWRfaW5vZGUodm9sLT5yb290X2lubykpIHsKKwkJaWYgKCFJU19FUlIodm9sLT5yb290X2lubykpCisJCQlpcHV0KHZvbC0+cm9vdF9pbm8pOworCQludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIGxvYWQgcm9vdCBkaXJlY3RvcnkuIik7CisJCWdvdG8gaXB1dF9sb2dmaWxlX2Vycl9vdXQ7CisJfQorCS8qIElmIG9uIE5URlMgdmVyc2lvbnMgYmVmb3JlIDMuMCwgd2UgYXJlIGRvbmUuICovCisJaWYgKHZvbC0+bWFqb3JfdmVyIDwgMykKKwkJcmV0dXJuIFRSVUU7CisJLyogTlRGUyAzLjArIHNwZWNpZmljIGluaXRpYWxpemF0aW9uLiAqLworCS8qIEdldCB0aGUgc2VjdXJpdHkgZGVzY3JpcHRvcnMgaW5vZGUuICovCisJdm9sLT5zZWN1cmVfaW5vID0gbnRmc19pZ2V0KHNiLCBGSUxFX1NlY3VyZSk7CisJaWYgKElTX0VSUih2b2wtPnNlY3VyZV9pbm8pIHx8IGlzX2JhZF9pbm9kZSh2b2wtPnNlY3VyZV9pbm8pKSB7CisJCWlmICghSVNfRVJSKHZvbC0+c2VjdXJlX2lubykpCisJCQlpcHV0KHZvbC0+c2VjdXJlX2lubyk7CisJCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gbG9hZCAkU2VjdXJlLiIpOworCQlnb3RvIGlwdXRfcm9vdF9lcnJfb3V0OworCX0KKwkvLyBGSVhNRTogSW5pdGlhbGl6ZSBzZWN1cml0eS4KKwkvKiBHZXQgdGhlIGV4dGVuZGVkIHN5c3RlbSBmaWxlcycgZGlyZWN0b3J5IGlub2RlLiAqLworCXZvbC0+ZXh0ZW5kX2lubyA9IG50ZnNfaWdldChzYiwgRklMRV9FeHRlbmQpOworCWlmIChJU19FUlIodm9sLT5leHRlbmRfaW5vKSB8fCBpc19iYWRfaW5vZGUodm9sLT5leHRlbmRfaW5vKSkgeworCQlpZiAoIUlTX0VSUih2b2wtPmV4dGVuZF9pbm8pKQorCQkJaXB1dCh2b2wtPmV4dGVuZF9pbm8pOworCQludGZzX2Vycm9yKHNiLCAiRmFpbGVkIHRvIGxvYWQgJEV4dGVuZC4iKTsKKwkJZ290byBpcHV0X3NlY19lcnJfb3V0OworCX0KKyNpZmRlZiBOVEZTX1JXCisJLyogRmluZCB0aGUgcXVvdGEgZmlsZSwgbG9hZCBpdCBpZiBwcmVzZW50LCBhbmQgc2V0IGl0IHVwLiAqLworCWlmICghbG9hZF9hbmRfaW5pdF9xdW90YSh2b2wpKSB7CisJCXN0YXRpYyBjb25zdCBjaGFyICplczEgPSAiRmFpbGVkIHRvIGxvYWQgJFF1b3RhIjsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmVzMiA9ICIuICBSdW4gY2hrZHNrLiI7CisKKwkJLyogSWYgYSByZWFkLXdyaXRlIG1vdW50LCBjb252ZXJ0IGl0IHRvIGEgcmVhZC1vbmx5IG1vdW50LiAqLworCQlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJCWlmICghKHZvbC0+b25fZXJyb3JzICYgKE9OX0VSUk9SU19SRU1PVU5UX1JPIHwKKwkJCQkJT05fRVJST1JTX0NPTlRJTlVFKSkpIHsKKwkJCQludGZzX2Vycm9yKHNiLCAiJXMgYW5kIG5laXRoZXIgb25fZXJyb3JzPSIKKwkJCQkJCSJjb250aW51ZSBub3Igb25fZXJyb3JzPSIKKwkJCQkJCSJyZW1vdW50LXJvIHdhcyBzcGVjaWZpZWQlcyIsCisJCQkJCQllczEsIGVzMik7CisJCQkJZ290byBpcHV0X3F1b3RhX2Vycl9vdXQ7CisJCQl9CisJCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFkgfCBNU19OT0FUSU1FIHwgTVNfTk9ESVJBVElNRTsKKwkJCW50ZnNfZXJyb3Ioc2IsICIlcy4gIE1vdW50aW5nIHJlYWQtb25seSVzIiwgZXMxLCBlczIpOworCQl9IGVsc2UKKwkJCW50ZnNfd2FybmluZyhzYiwgIiVzLiAgV2lsbCBub3QgYmUgYWJsZSB0byByZW1vdW50ICIKKwkJCQkJInJlYWQtd3JpdGUlcyIsIGVzMSwgZXMyKTsKKwkJLyogVGhpcyB3aWxsIHByZXZlbnQgYSByZWFkLXdyaXRlIHJlbW91bnQuICovCisJCU5Wb2xTZXRFcnJvcnModm9sKTsKKwl9CisJLyogSWYgKHN0aWxsKSBhIHJlYWQtd3JpdGUgbW91bnQsIG1hcmsgdGhlIHF1b3RhcyBvdXQgb2YgZGF0ZS4gKi8KKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkgJiYKKwkJCSFudGZzX21hcmtfcXVvdGFzX291dF9vZl9kYXRlKHZvbCkpIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgKmVzMSA9ICJGYWlsZWQgdG8gbWFyayBxdW90YXMgb3V0IG9mIGRhdGUiOworCQlzdGF0aWMgY29uc3QgY2hhciAqZXMyID0gIi4gIFJ1biBjaGtkc2suIjsKKworCQkvKiBDb252ZXJ0IHRvIGEgcmVhZC1vbmx5IG1vdW50LiAqLworCQlpZiAoISh2b2wtPm9uX2Vycm9ycyAmIChPTl9FUlJPUlNfUkVNT1VOVF9STyB8CisJCQkJT05fRVJST1JTX0NPTlRJTlVFKSkpIHsKKwkJCW50ZnNfZXJyb3Ioc2IsICIlcyBhbmQgbmVpdGhlciBvbl9lcnJvcnM9Y29udGludWUgbm9yICIKKwkJCQkJIm9uX2Vycm9ycz1yZW1vdW50LXJvIHdhcyBzcGVjaWZpZWQlcyIsCisJCQkJCWVzMSwgZXMyKTsKKwkJCWdvdG8gaXB1dF9xdW90YV9lcnJfb3V0OworCQl9CisJCW50ZnNfZXJyb3Ioc2IsICIlcy4gIE1vdW50aW5nIHJlYWQtb25seSVzIiwgZXMxLCBlczIpOworCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFkgfCBNU19OT0FUSU1FIHwgTVNfTk9ESVJBVElNRTsKKwkJTlZvbFNldEVycm9ycyh2b2wpOworCX0KKwkvLyBUT0RPOiBEZWxldGUgb3IgY2hlY2twb2ludCB0aGUgJFVzbkpybmwgaWYgaXQgZXhpc3RzLgorI2VuZGlmIC8qIE5URlNfUlcgKi8KKwlyZXR1cm4gVFJVRTsKKyNpZmRlZiBOVEZTX1JXCitpcHV0X3F1b3RhX2Vycl9vdXQ6CisJaWYgKHZvbC0+cXVvdGFfcV9pbm8pCisJCWlwdXQodm9sLT5xdW90YV9xX2lubyk7CisJaWYgKHZvbC0+cXVvdGFfaW5vKQorCQlpcHV0KHZvbC0+cXVvdGFfaW5vKTsKKwlpcHV0KHZvbC0+ZXh0ZW5kX2lubyk7CisjZW5kaWYgLyogTlRGU19SVyAqLworaXB1dF9zZWNfZXJyX291dDoKKwlpcHV0KHZvbC0+c2VjdXJlX2lubyk7CitpcHV0X3Jvb3RfZXJyX291dDoKKwlpcHV0KHZvbC0+cm9vdF9pbm8pOworaXB1dF9sb2dmaWxlX2Vycl9vdXQ6CisjaWZkZWYgTlRGU19SVworCWlmICh2b2wtPmxvZ2ZpbGVfaW5vKQorCQlpcHV0KHZvbC0+bG9nZmlsZV9pbm8pOworaXB1dF92b2xfZXJyX291dDoKKyNlbmRpZiAvKiBOVEZTX1JXICovCisJaXB1dCh2b2wtPnZvbF9pbm8pOworaXB1dF9sY25ibXBfZXJyX291dDoKKwlpcHV0KHZvbC0+bGNuYm1wX2lubyk7CitpcHV0X2F0dHJkZWZfZXJyX291dDoKKwl2b2wtPmF0dHJkZWZfc2l6ZSA9IDA7CisJaWYgKHZvbC0+YXR0cmRlZikgeworCQludGZzX2ZyZWUodm9sLT5hdHRyZGVmKTsKKwkJdm9sLT5hdHRyZGVmID0gTlVMTDsKKwl9CisjaWZkZWYgTlRGU19SVworaXB1dF91cGNhc2VfZXJyX291dDoKKyNlbmRpZiAvKiBOVEZTX1JXICovCisJdm9sLT51cGNhc2VfbGVuID0gMDsKKwlkb3duKCZudGZzX2xvY2spOworCWlmICh2b2wtPnVwY2FzZSA9PSBkZWZhdWx0X3VwY2FzZSkgeworCQludGZzX25yX3VwY2FzZV91c2Vycy0tOworCQl2b2wtPnVwY2FzZSA9IE5VTEw7CisJfQorCXVwKCZudGZzX2xvY2spOworCWlmICh2b2wtPnVwY2FzZSkgeworCQludGZzX2ZyZWUodm9sLT51cGNhc2UpOworCQl2b2wtPnVwY2FzZSA9IE5VTEw7CisJfQoraXB1dF9tZnRibXBfZXJyX291dDoKKwlpcHV0KHZvbC0+bWZ0Ym1wX2lubyk7CitpcHV0X21pcnJfZXJyX291dDoKKyNpZmRlZiBOVEZTX1JXCisJaWYgKHZvbC0+bWZ0bWlycl9pbm8pCisJCWlwdXQodm9sLT5tZnRtaXJyX2lubyk7CisjZW5kaWYgLyogTlRGU19SVyAqLworCXJldHVybiBGQUxTRTsKK30KKworLyoqCisgKiBudGZzX3B1dF9zdXBlciAtIGNhbGxlZCBieSB0aGUgdmZzIHRvIHVubW91bnQgYSB2b2x1bWUKKyAqIEBzYjoJCXZmcyBzdXBlcmJsb2NrIG9mIHZvbHVtZSB0byB1bm1vdW50CisgKgorICogbnRmc19wdXRfc3VwZXIoKSBpcyBjYWxsZWQgYnkgdGhlIFZGUyAoZnJvbSBmcy9zdXBlci5jOjpkb191bW91bnQoKSkgd2hlbgorICogdGhlIHZvbHVtZSBpcyBiZWluZyB1bm1vdW50ZWQgKHVtb3VudCBzeXN0ZW0gY2FsbCBoYXMgYmVlbiBpbnZva2VkKSBhbmQgaXQKKyAqIHJlbGVhc2VzIGFsbCBpbm9kZXMgYW5kIG1lbW9yeSBiZWxvbmdpbmcgdG8gdGhlIE5URlMgc3BlY2lmaWMgcGFydCBvZiB0aGUKKyAqIHN1cGVyIGJsb2NrLgorICovCitzdGF0aWMgdm9pZCBudGZzX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCW50ZnNfdm9sdW1lICp2b2wgPSBOVEZTX1NCKHNiKTsKKworCW50ZnNfZGVidWcoIkVudGVyaW5nLiIpOworI2lmZGVmIE5URlNfUlcKKwkvKgorCSAqIENvbW1pdCBhbGwgaW5vZGVzIHdoaWxlIHRoZXkgYXJlIHN0aWxsIG9wZW4gaW4gY2FzZSBzb21lIG9mIHRoZW0KKwkgKiBjYXVzZSBvdGhlcnMgdG8gYmUgZGlydGllZC4KKwkgKi8KKwludGZzX2NvbW1pdF9pbm9kZSh2b2wtPnZvbF9pbm8pOworCisJLyogTlRGUyAzLjArIHNwZWNpZmljLiAqLworCWlmICh2b2wtPm1ham9yX3ZlciA+PSAzKSB7CisJCWlmICh2b2wtPnF1b3RhX3FfaW5vKQorCQkJbnRmc19jb21taXRfaW5vZGUodm9sLT5xdW90YV9xX2lubyk7CisJCWlmICh2b2wtPnF1b3RhX2lubykKKwkJCW50ZnNfY29tbWl0X2lub2RlKHZvbC0+cXVvdGFfaW5vKTsKKwkJaWYgKHZvbC0+ZXh0ZW5kX2lubykKKwkJCW50ZnNfY29tbWl0X2lub2RlKHZvbC0+ZXh0ZW5kX2lubyk7CisJCWlmICh2b2wtPnNlY3VyZV9pbm8pCisJCQludGZzX2NvbW1pdF9pbm9kZSh2b2wtPnNlY3VyZV9pbm8pOworCX0KKworCW50ZnNfY29tbWl0X2lub2RlKHZvbC0+cm9vdF9pbm8pOworCisJZG93bl93cml0ZSgmdm9sLT5sY25ibXBfbG9jayk7CisJbnRmc19jb21taXRfaW5vZGUodm9sLT5sY25ibXBfaW5vKTsKKwl1cF93cml0ZSgmdm9sLT5sY25ibXBfbG9jayk7CisKKwlkb3duX3dyaXRlKCZ2b2wtPm1mdGJtcF9sb2NrKTsKKwludGZzX2NvbW1pdF9pbm9kZSh2b2wtPm1mdGJtcF9pbm8pOworCXVwX3dyaXRlKCZ2b2wtPm1mdGJtcF9sb2NrKTsKKworCWlmICh2b2wtPmxvZ2ZpbGVfaW5vKQorCQludGZzX2NvbW1pdF9pbm9kZSh2b2wtPmxvZ2ZpbGVfaW5vKTsKKworCWlmICh2b2wtPm1mdG1pcnJfaW5vKQorCQludGZzX2NvbW1pdF9pbm9kZSh2b2wtPm1mdG1pcnJfaW5vKTsKKwludGZzX2NvbW1pdF9pbm9kZSh2b2wtPm1mdF9pbm8pOworCisJLyoKKwkgKiBJZiBhIHJlYWQtd3JpdGUgbW91bnQgYW5kIG5vIHZvbHVtZSBlcnJvcnMgaGF2ZSBvY2N1cmVkLCBtYXJrIHRoZQorCSAqIHZvbHVtZSBjbGVhbi4gIEFsc28sIHJlLWNvbW1pdCBhbGwgYWZmZWN0ZWQgaW5vZGVzLgorCSAqLworCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQlpZiAoIU5Wb2xFcnJvcnModm9sKSkgeworCQkJaWYgKG50ZnNfY2xlYXJfdm9sdW1lX2ZsYWdzKHZvbCwgVk9MVU1FX0lTX0RJUlRZKSkKKwkJCQludGZzX3dhcm5pbmcoc2IsICJGYWlsZWQgdG8gY2xlYXIgZGlydHkgYml0ICIKKwkJCQkJCSJpbiB2b2x1bWUgaW5mb3JtYXRpb24gIgorCQkJCQkJImZsYWdzLiAgUnVuIGNoa2Rzay4iKTsKKwkJCW50ZnNfY29tbWl0X2lub2RlKHZvbC0+dm9sX2lubyk7CisJCQludGZzX2NvbW1pdF9pbm9kZSh2b2wtPnJvb3RfaW5vKTsKKwkJCWlmICh2b2wtPm1mdG1pcnJfaW5vKQorCQkJCW50ZnNfY29tbWl0X2lub2RlKHZvbC0+bWZ0bWlycl9pbm8pOworCQkJbnRmc19jb21taXRfaW5vZGUodm9sLT5tZnRfaW5vKTsKKwkJfSBlbHNlIHsKKwkJCW50ZnNfd2FybmluZyhzYiwgIlZvbHVtZSBoYXMgZXJyb3JzLiAgTGVhdmluZyB2b2x1bWUgIgorCQkJCQkibWFya2VkIGRpcnR5LiAgUnVuIGNoa2Rzay4iKTsKKwkJfQorCX0KKyNlbmRpZiAvKiBOVEZTX1JXICovCisKKwlpcHV0KHZvbC0+dm9sX2lubyk7CisJdm9sLT52b2xfaW5vID0gTlVMTDsKKworCS8qIE5URlMgMy4wKyBzcGVjaWZpYyBjbGVhbiB1cC4gKi8KKwlpZiAodm9sLT5tYWpvcl92ZXIgPj0gMykgeworI2lmZGVmIE5URlNfUlcKKwkJaWYgKHZvbC0+cXVvdGFfcV9pbm8pIHsKKwkJCWlwdXQodm9sLT5xdW90YV9xX2lubyk7CisJCQl2b2wtPnF1b3RhX3FfaW5vID0gTlVMTDsKKwkJfQorCQlpZiAodm9sLT5xdW90YV9pbm8pIHsKKwkJCWlwdXQodm9sLT5xdW90YV9pbm8pOworCQkJdm9sLT5xdW90YV9pbm8gPSBOVUxMOworCQl9CisjZW5kaWYgLyogTlRGU19SVyAqLworCQlpZiAodm9sLT5leHRlbmRfaW5vKSB7CisJCQlpcHV0KHZvbC0+ZXh0ZW5kX2lubyk7CisJCQl2b2wtPmV4dGVuZF9pbm8gPSBOVUxMOworCQl9CisJCWlmICh2b2wtPnNlY3VyZV9pbm8pIHsKKwkJCWlwdXQodm9sLT5zZWN1cmVfaW5vKTsKKwkJCXZvbC0+c2VjdXJlX2lubyA9IE5VTEw7CisJCX0KKwl9CisKKwlpcHV0KHZvbC0+cm9vdF9pbm8pOworCXZvbC0+cm9vdF9pbm8gPSBOVUxMOworCisJZG93bl93cml0ZSgmdm9sLT5sY25ibXBfbG9jayk7CisJaXB1dCh2b2wtPmxjbmJtcF9pbm8pOworCXZvbC0+bGNuYm1wX2lubyA9IE5VTEw7CisJdXBfd3JpdGUoJnZvbC0+bGNuYm1wX2xvY2spOworCisJZG93bl93cml0ZSgmdm9sLT5tZnRibXBfbG9jayk7CisJaXB1dCh2b2wtPm1mdGJtcF9pbm8pOworCXZvbC0+bWZ0Ym1wX2lubyA9IE5VTEw7CisJdXBfd3JpdGUoJnZvbC0+bWZ0Ym1wX2xvY2spOworCisjaWZkZWYgTlRGU19SVworCWlmICh2b2wtPmxvZ2ZpbGVfaW5vKSB7CisJCWlwdXQodm9sLT5sb2dmaWxlX2lubyk7CisJCXZvbC0+bG9nZmlsZV9pbm8gPSBOVUxMOworCX0KKwlpZiAodm9sLT5tZnRtaXJyX2lubykgeworCQkvKiBSZS1jb21taXQgdGhlIG1mdCBtaXJyb3IgYW5kIG1mdCBqdXN0IGluIGNhc2UuICovCisJCW50ZnNfY29tbWl0X2lub2RlKHZvbC0+bWZ0bWlycl9pbm8pOworCQludGZzX2NvbW1pdF9pbm9kZSh2b2wtPm1mdF9pbm8pOworCQlpcHV0KHZvbC0+bWZ0bWlycl9pbm8pOworCQl2b2wtPm1mdG1pcnJfaW5vID0gTlVMTDsKKwl9CisJLyoKKwkgKiBJZiBhbnkgZGlydHkgaW5vZGVzIGFyZSBsZWZ0LCB0aHJvdyBhd2F5IGFsbCBtZnQgZGF0YSBwYWdlIGNhY2hlCisJICogcGFnZXMgdG8gYWxsb3cgYSBjbGVhbiB1bW91bnQuICBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gYW55IG1vcmUKKwkgKiBkdWUgdG8gbWZ0LmM6Om50ZnNfbWZ0X3dyaXRlcGFnZSgpIGNsZWFuaW5nIGFsbCB0aGUgZGlydHkgcGFnZXMgYXMKKwkgKiB0aGUgdW5kZXJseWluZyBtZnQgcmVjb3JkcyBhcmUgd3JpdHRlbiBvdXQgYW5kIGNsZWFuZWQuICBJZiBpdCBkb2VzLAorCSAqIGhhcHBlbiBhbnl3YXksIHdlIHdhbnQgdG8ga25vdy4uLgorCSAqLworCW50ZnNfY29tbWl0X2lub2RlKHZvbC0+bWZ0X2lubyk7CisJd3JpdGVfaW5vZGVfbm93KHZvbC0+bWZ0X2lubywgMSk7CisJaWYgKCFsaXN0X2VtcHR5KCZzYi0+c19kaXJ0eSkpIHsKKwkJY29uc3QgY2hhciAqczEsICpzMjsKKworCQlkb3duKCZ2b2wtPm1mdF9pbm8tPmlfc2VtKTsKKwkJdHJ1bmNhdGVfaW5vZGVfcGFnZXModm9sLT5tZnRfaW5vLT5pX21hcHBpbmcsIDApOworCQl1cCgmdm9sLT5tZnRfaW5vLT5pX3NlbSk7CisJCXdyaXRlX2lub2RlX25vdyh2b2wtPm1mdF9pbm8sIDEpOworCQlpZiAoIWxpc3RfZW1wdHkoJnNiLT5zX2RpcnR5KSkgeworCQkJc3RhdGljIGNvbnN0IGNoYXIgKl9zMSA9ICJpbm9kZXMiOworCQkJc3RhdGljIGNvbnN0IGNoYXIgKl9zMiA9ICIiOworCQkJczEgPSBfczE7CisJCQlzMiA9IF9zMjsKKwkJfSBlbHNlIHsKKwkJCXN0YXRpYyBjb25zdCBjaGFyICpfczEgPSAibWZ0IHBhZ2VzIjsKKwkJCXN0YXRpYyBjb25zdCBjaGFyICpfczIgPSAiVGhleSBoYXZlIGJlZW4gdGhyb3duICIKKwkJCQkJImF3YXkuICAiOworCQkJczEgPSBfczE7CisJCQlzMiA9IF9zMjsKKwkJfQorCQludGZzX2Vycm9yKHNiLCAiRGlydHkgJXMgZm91bmQgYXQgdW1vdW50IHRpbWUuICAlc1lvdSBzaG91bGQgIgorCQkJCSJydW4gY2hrZHNrLiAgUGxlYXNlIGVtYWlsICIKKwkJCQkibGludXgtbnRmcy1kZXZAbGlzdHMuc291cmNlZm9yZ2UubmV0IGFuZCBzYXkgIgorCQkJCSJ0aGF0IHlvdSBzYXcgdGhpcyBtZXNzYWdlLiAgVGhhbmsgeW91LiIsIHMxLAorCQkJCXMyKTsKKwl9CisjZW5kaWYgLyogTlRGU19SVyAqLworCisJaXB1dCh2b2wtPm1mdF9pbm8pOworCXZvbC0+bWZ0X2lubyA9IE5VTEw7CisKKwkvKiBUaHJvdyBhd2F5IHRoZSB0YWJsZSBvZiBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMuICovCisJdm9sLT5hdHRyZGVmX3NpemUgPSAwOworCWlmICh2b2wtPmF0dHJkZWYpIHsKKwkJbnRmc19mcmVlKHZvbC0+YXR0cmRlZik7CisJCXZvbC0+YXR0cmRlZiA9IE5VTEw7CisJfQorCXZvbC0+dXBjYXNlX2xlbiA9IDA7CisJLyoKKwkgKiBEZXN0cm95IHRoZSBnbG9iYWwgZGVmYXVsdCB1cGNhc2UgdGFibGUgaWYgbmVjZXNzYXJ5LiAgQWxzbyBkZWNyZWFzZQorCSAqIHRoZSBudW1iZXIgb2YgdXBjYXNlIHVzZXJzIGlmIHdlIGFyZSBhIHVzZXIuCisJICovCisJZG93bigmbnRmc19sb2NrKTsKKwlpZiAodm9sLT51cGNhc2UgPT0gZGVmYXVsdF91cGNhc2UpIHsKKwkJbnRmc19ucl91cGNhc2VfdXNlcnMtLTsKKwkJdm9sLT51cGNhc2UgPSBOVUxMOworCX0KKwlpZiAoIW50ZnNfbnJfdXBjYXNlX3VzZXJzICYmIGRlZmF1bHRfdXBjYXNlKSB7CisJCW50ZnNfZnJlZShkZWZhdWx0X3VwY2FzZSk7CisJCWRlZmF1bHRfdXBjYXNlID0gTlVMTDsKKwl9CisJaWYgKHZvbC0+Y2x1c3Rlcl9zaXplIDw9IDQwOTYgJiYgIS0tbnRmc19ucl9jb21wcmVzc2lvbl91c2VycykKKwkJZnJlZV9jb21wcmVzc2lvbl9idWZmZXJzKCk7CisJdXAoJm50ZnNfbG9jayk7CisJaWYgKHZvbC0+dXBjYXNlKSB7CisJCW50ZnNfZnJlZSh2b2wtPnVwY2FzZSk7CisJCXZvbC0+dXBjYXNlID0gTlVMTDsKKwl9CisJaWYgKHZvbC0+bmxzX21hcCkgeworCQl1bmxvYWRfbmxzKHZvbC0+bmxzX21hcCk7CisJCXZvbC0+bmxzX21hcCA9IE5VTEw7CisJfQorCXNiLT5zX2ZzX2luZm8gPSBOVUxMOworCWtmcmVlKHZvbCk7CisJcmV0dXJuOworfQorCisvKioKKyAqIGdldF9ucl9mcmVlX2NsdXN0ZXJzIC0gcmV0dXJuIHRoZSBudW1iZXIgb2YgZnJlZSBjbHVzdGVycyBvbiBhIHZvbHVtZQorICogQHZvbDoJbnRmcyB2b2x1bWUgZm9yIHdoaWNoIHRvIG9idGFpbiBmcmVlIGNsdXN0ZXIgY291bnQKKyAqCisgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBmcmVlIGNsdXN0ZXJzIG9uIHRoZSBtb3VudGVkIE5URlMgdm9sdW1lIEB2b2wuIFdlCisgKiBhY3R1YWxseSBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBjbHVzdGVycyBpbiB1c2UgaW5zdGVhZCBiZWNhdXNlIHRoaXMKKyAqIGFsbG93cyB1cyB0byBub3QgY2FyZSBhYm91dCBwYXJ0aWFsIHBhZ2VzIGFzIHRoZXNlIHdpbGwgYmUganVzdCB6ZXJvIGZpbGxlZAorICogYW5kIGhlbmNlIG5vdCBiZSBjb3VudGVkIGFzIGFsbG9jYXRlZCBjbHVzdGVycy4KKyAqCisgKiBUaGUgb25seSBwYXJ0aWN1bGFyaXR5IGlzIHRoYXQgY2x1c3RlcnMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGxvZ2ljYWwgbnRmcworICogdm9sdW1lIHdpbGwgYmUgbWFya2VkIGFzIGFsbG9jYXRlZCB0byBwcmV2ZW50IGVycm9ycyB3aGljaCBtZWFucyB3ZSBoYXZlIHRvCisgKiBkaXNjb3VudCB0aG9zZSBhdCB0aGUgZW5kLiBUaGlzIGlzIGltcG9ydGFudCBhcyB0aGUgY2x1c3RlciBiaXRtYXAgYWx3YXlzCisgKiBoYXMgYSBzaXplIGluIG11bHRpcGxlcyBvZiA4IGJ5dGVzLCBpLmUuIHVwIHRvIDYzIGNsdXN0ZXJzIGNvdWxkIGJlIG91dHNpZGUKKyAqIHRoZSBsb2dpY2FsIHZvbHVtZSBhbmQgbWFya2VkIGluIHVzZSB3aGVuIHRoZXkgYXJlIG5vdCBhcyB0aGV5IGRvIG5vdCBleGlzdC4KKyAqCisgKiBJZiBhbnkgcGFnZXMgY2Fubm90IGJlIHJlYWQgd2UgYXNzdW1lIGFsbCBjbHVzdGVycyBpbiB0aGUgZXJyb3JpbmcgcGFnZXMgYXJlCisgKiBpbiB1c2UuIFRoaXMgbWVhbnMgd2UgcmV0dXJuIGFuIHVuZGVyZXN0aW1hdGUgb24gZXJyb3JzIHdoaWNoIGlzIGJldHRlciB0aGFuCisgKiBhbiBvdmVyZXN0aW1hdGUuCisgKi8KK3N0YXRpYyBzNjQgZ2V0X25yX2ZyZWVfY2x1c3RlcnMobnRmc192b2x1bWUgKnZvbCkKK3sKKwlzNjQgbnJfZnJlZSA9IHZvbC0+bnJfY2x1c3RlcnM7CisJdTMyICprYWRkcjsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IHZvbC0+bGNuYm1wX2luby0+aV9tYXBwaW5nOworCWZpbGxlcl90ICpyZWFkcGFnZSA9IChmaWxsZXJfdCopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlOworCXN0cnVjdCBwYWdlICpwYWdlOworCXVuc2lnbmVkIGxvbmcgaW5kZXgsIG1heF9pbmRleDsKKwl1bnNpZ25lZCBpbnQgbWF4X3NpemU7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwkvKiBTZXJpYWxpemUgYWNjZXNzZXMgdG8gdGhlIGNsdXN0ZXIgYml0bWFwLiAqLworCWRvd25fcmVhZCgmdm9sLT5sY25ibXBfbG9jayk7CisJLyoKKwkgKiBDb252ZXJ0IHRoZSBudW1iZXIgb2YgYml0cyBpbnRvIGJ5dGVzIHJvdW5kZWQgdXAsIHRoZW4gY29udmVydCBpbnRvCisJICogbXVsdGlwbGVzIG9mIFBBR0VfQ0FDSEVfU0laRSwgcm91bmRpbmcgdXAgc28gdGhhdCBpZiB3ZSBoYXZlIG9uZQorCSAqIGZ1bGwgYW5kIG9uZSBwYXJ0aWFsIHBhZ2UgbWF4X2luZGV4ID0gMi4KKwkgKi8KKwltYXhfaW5kZXggPSAoKCh2b2wtPm5yX2NsdXN0ZXJzICsgNykgPj4gMykgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKSA+PgorCQkJUEFHRV9DQUNIRV9TSElGVDsKKwkvKiBVc2UgbXVsdGlwbGVzIG9mIDQgYnl0ZXMuICovCisJbWF4X3NpemUgPSBQQUdFX0NBQ0hFX1NJWkUgPj4gMjsKKwludGZzX2RlYnVnKCJSZWFkaW5nICRCaXRtYXAsIG1heF9pbmRleCA9IDB4JWx4LCBtYXhfc2l6ZSA9IDB4JXguIiwKKwkJCW1heF9pbmRleCwgbWF4X3NpemUpOworCWZvciAoaW5kZXggPSAwVUw7IGluZGV4IDwgbWF4X2luZGV4OyBpbmRleCsrKSB7CisJCXVuc2lnbmVkIGludCBpOworCQkvKgorCQkgKiBSZWFkIHRoZSBwYWdlIGZyb20gcGFnZSBjYWNoZSwgZ2V0dGluZyBpdCBmcm9tIGJhY2tpbmcgc3RvcmUKKwkJICogaWYgbmVjZXNzYXJ5LCBhbmQgaW5jcmVtZW50IHRoZSB1c2UgY291bnQuCisJCSAqLworCQlwYWdlID0gcmVhZF9jYWNoZV9wYWdlKG1hcHBpbmcsIGluZGV4LCAoZmlsbGVyX3QqKXJlYWRwYWdlLAorCQkJCU5VTEwpOworCQkvKiBJZ25vcmUgcGFnZXMgd2hpY2ggZXJyb3JlZCBzeW5jaHJvbm91c2x5LiAqLworCQlpZiAoSVNfRVJSKHBhZ2UpKSB7CisJCQludGZzX2RlYnVnKCJTeW5jIHJlYWRfY2FjaGVfcGFnZSgpIGVycm9yLiBTa2lwcGluZyAiCisJCQkJCSJwYWdlIChpbmRleCAweCVseCkuIiwgaW5kZXgpOworCQkJbnJfZnJlZSAtPSBQQUdFX0NBQ0hFX1NJWkUgKiA4OworCQkJY29udGludWU7CisJCX0KKwkJd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKKwkJLyogSWdub3JlIHBhZ2VzIHdoaWNoIGVycm9yZWQgYXN5bmNocm9ub3VzbHkuICovCisJCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpKSB7CisJCQludGZzX2RlYnVnKCJBc3luYyByZWFkX2NhY2hlX3BhZ2UoKSBlcnJvci4gU2tpcHBpbmcgIgorCQkJCQkicGFnZSAoaW5kZXggMHglbHgpLiIsIGluZGV4KTsKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJCW5yX2ZyZWUgLT0gUEFHRV9DQUNIRV9TSVpFICogODsKKwkJCWNvbnRpbnVlOworCQl9CisJCWthZGRyID0gKHUzMiopa21hcF9hdG9taWMocGFnZSwgS01fVVNFUjApOworCQkvKgorCQkgKiBGb3IgZWFjaCA0IGJ5dGVzLCBzdWJ0cmFjdCB0aGUgbnVtYmVyIG9mIHNldCBiaXRzLiBJZiB0aGlzCisJCSAqIGlzIHRoZSBsYXN0IHBhZ2UgYW5kIGl0IGlzIHBhcnRpYWwgd2UgZG9uJ3QgcmVhbGx5IGNhcmUgYXMKKwkJICogaXQganVzdCBtZWFucyB3ZSBkbyBhIGxpdHRsZSBleHRyYSB3b3JrIGJ1dCBpdCB3b24ndCBhZmZlY3QKKwkJICogdGhlIHJlc3VsdCBhcyBhbGwgb3V0IG9mIHJhbmdlIGJ5dGVzIGFyZSBzZXQgdG8gemVybyBieQorCQkgKiBudGZzX3JlYWRwYWdlKCkuCisJCSAqLworCSAgCWZvciAoaSA9IDA7IGkgPCBtYXhfc2l6ZTsgaSsrKQorCQkJbnJfZnJlZSAtPSAoczY0KWh3ZWlnaHQzMihrYWRkcltpXSk7CisJCWt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCX0KKwludGZzX2RlYnVnKCJGaW5pc2hlZCByZWFkaW5nICRCaXRtYXAsIGxhc3QgaW5kZXggPSAweCVseC4iLCBpbmRleCAtIDEpOworCS8qCisJICogRml4dXAgZm9yIGV2ZW50dWFsIGJpdHMgb3V0c2lkZSBsb2dpY2FsIG50ZnMgdm9sdW1lIChzZWUgZnVuY3Rpb24KKwkgKiBkZXNjcmlwdGlvbiBhYm92ZSkuCisJICovCisJaWYgKHZvbC0+bnJfY2x1c3RlcnMgJiA2MykKKwkJbnJfZnJlZSArPSA2NCAtICh2b2wtPm5yX2NsdXN0ZXJzICYgNjMpOworCXVwX3JlYWQoJnZvbC0+bGNuYm1wX2xvY2spOworCS8qIElmIGVycm9ycyBvY2N1cmVkIHdlIG1heSB3ZWxsIGhhdmUgZ29uZSBiZWxvdyB6ZXJvLCBmaXggdGhpcy4gKi8KKwlpZiAobnJfZnJlZSA8IDApCisJCW5yX2ZyZWUgPSAwOworCW50ZnNfZGVidWcoIkV4aXRpbmcuIik7CisJcmV0dXJuIG5yX2ZyZWU7Cit9CisKKy8qKgorICogX19nZXRfbnJfZnJlZV9tZnRfcmVjb3JkcyAtIHJldHVybiB0aGUgbnVtYmVyIG9mIGZyZWUgaW5vZGVzIG9uIGEgdm9sdW1lCisgKiBAdm9sOgludGZzIHZvbHVtZSBmb3Igd2hpY2ggdG8gb2J0YWluIGZyZWUgaW5vZGUgY291bnQKKyAqCisgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBmcmVlIG1mdCByZWNvcmRzIChpbm9kZXMpIG9uIHRoZSBtb3VudGVkIE5URlMKKyAqIHZvbHVtZSBAdm9sLiBXZSBhY3R1YWxseSBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBtZnQgcmVjb3JkcyBpbiB1c2UgaW5zdGVhZAorICogYmVjYXVzZSB0aGlzIGFsbG93cyB1cyB0byBub3QgY2FyZSBhYm91dCBwYXJ0aWFsIHBhZ2VzIGFzIHRoZXNlIHdpbGwgYmUganVzdAorICogemVybyBmaWxsZWQgYW5kIGhlbmNlIG5vdCBiZSBjb3VudGVkIGFzIGFsbG9jYXRlZCBtZnQgcmVjb3JkLgorICoKKyAqIElmIGFueSBwYWdlcyBjYW5ub3QgYmUgcmVhZCB3ZSBhc3N1bWUgYWxsIG1mdCByZWNvcmRzIGluIHRoZSBlcnJvcmluZyBwYWdlcworICogYXJlIGluIHVzZS4gVGhpcyBtZWFucyB3ZSByZXR1cm4gYW4gdW5kZXJlc3RpbWF0ZSBvbiBlcnJvcnMgd2hpY2ggaXMgYmV0dGVyCisgKiB0aGFuIGFuIG92ZXJlc3RpbWF0ZS4KKyAqCisgKiBOT1RFOiBDYWxsZXIgbXVzdCBob2xkIG1mdGJtcF9sb2NrIHJ3X3NlbWFwaG9yZSBmb3IgcmVhZGluZyBvciB3cml0aW5nLgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2dldF9ucl9mcmVlX21mdF9yZWNvcmRzKG50ZnNfdm9sdW1lICp2b2wpCit7CisJczY0IG5yX2ZyZWU7CisJdTMyICprYWRkcjsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IHZvbC0+bWZ0Ym1wX2luby0+aV9tYXBwaW5nOworCWZpbGxlcl90ICpyZWFkcGFnZSA9IChmaWxsZXJfdCopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlOworCXN0cnVjdCBwYWdlICpwYWdlOworCXVuc2lnbmVkIGxvbmcgaW5kZXgsIG1heF9pbmRleDsKKwl1bnNpZ25lZCBpbnQgbWF4X3NpemU7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwkvKiBOdW1iZXIgb2YgbWZ0IHJlY29yZHMgaW4gZmlsZSBzeXN0ZW0gKGF0IHRoaXMgcG9pbnQgaW4gdGltZSkuICovCisJbnJfZnJlZSA9IHZvbC0+bWZ0X2luby0+aV9zaXplID4+IHZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHM7CisJLyoKKwkgKiBDb252ZXJ0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZXQgYml0cyBpbnRvIGJ5dGVzIHJvdW5kZWQgdXAsIHRoZW4KKwkgKiBjb252ZXJ0IGludG8gbXVsdGlwbGVzIG9mIFBBR0VfQ0FDSEVfU0laRSwgcm91bmRpbmcgdXAgc28gdGhhdCBpZiB3ZQorCSAqIGhhdmUgb25lIGZ1bGwgYW5kIG9uZSBwYXJ0aWFsIHBhZ2UgbWF4X2luZGV4ID0gMi4KKwkgKi8KKwltYXhfaW5kZXggPSAoKCgoTlRGU19JKHZvbC0+bWZ0X2lubyktPmluaXRpYWxpemVkX3NpemUgPj4KKwkJCXZvbC0+bWZ0X3JlY29yZF9zaXplX2JpdHMpICsgNykgPj4gMykgKworCQkJUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwkvKiBVc2UgbXVsdGlwbGVzIG9mIDQgYnl0ZXMuICovCisJbWF4X3NpemUgPSBQQUdFX0NBQ0hFX1NJWkUgPj4gMjsKKwludGZzX2RlYnVnKCJSZWFkaW5nICRNRlQvJEJJVE1BUCwgbWF4X2luZGV4ID0gMHglbHgsIG1heF9zaXplID0gIgorCQkJIjB4JXguIiwgbWF4X2luZGV4LCBtYXhfc2l6ZSk7CisJZm9yIChpbmRleCA9IDBVTDsgaW5kZXggPCBtYXhfaW5kZXg7IGluZGV4KyspIHsKKwkJdW5zaWduZWQgaW50IGk7CisJCS8qCisJCSAqIFJlYWQgdGhlIHBhZ2UgZnJvbSBwYWdlIGNhY2hlLCBnZXR0aW5nIGl0IGZyb20gYmFja2luZyBzdG9yZQorCQkgKiBpZiBuZWNlc3NhcnksIGFuZCBpbmNyZW1lbnQgdGhlIHVzZSBjb3VudC4KKwkJICovCisJCXBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UobWFwcGluZywgaW5kZXgsIChmaWxsZXJfdCopcmVhZHBhZ2UsCisJCQkJTlVMTCk7CisJCS8qIElnbm9yZSBwYWdlcyB3aGljaCBlcnJvcmVkIHN5bmNocm9ub3VzbHkuICovCisJCWlmIChJU19FUlIocGFnZSkpIHsKKwkJCW50ZnNfZGVidWcoIlN5bmMgcmVhZF9jYWNoZV9wYWdlKCkgZXJyb3IuIFNraXBwaW5nICIKKwkJCQkJInBhZ2UgKGluZGV4IDB4JWx4KS4iLCBpbmRleCk7CisJCQlucl9mcmVlIC09IFBBR0VfQ0FDSEVfU0laRSAqIDg7CisJCQljb250aW51ZTsKKwkJfQorCQl3YWl0X29uX3BhZ2VfbG9ja2VkKHBhZ2UpOworCQkvKiBJZ25vcmUgcGFnZXMgd2hpY2ggZXJyb3JlZCBhc3luY2hyb25vdXNseS4gKi8KKwkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJCW50ZnNfZGVidWcoIkFzeW5jIHJlYWRfY2FjaGVfcGFnZSgpIGVycm9yLiBTa2lwcGluZyAiCisJCQkJCSJwYWdlIChpbmRleCAweCVseCkuIiwgaW5kZXgpOworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJbnJfZnJlZSAtPSBQQUdFX0NBQ0hFX1NJWkUgKiA4OworCQkJY29udGludWU7CisJCX0KKwkJa2FkZHIgPSAodTMyKilrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJCS8qCisJCSAqIEZvciBlYWNoIDQgYnl0ZXMsIHN1YnRyYWN0IHRoZSBudW1iZXIgb2Ygc2V0IGJpdHMuIElmIHRoaXMKKwkJICogaXMgdGhlIGxhc3QgcGFnZSBhbmQgaXQgaXMgcGFydGlhbCB3ZSBkb24ndCByZWFsbHkgY2FyZSBhcworCQkgKiBpdCBqdXN0IG1lYW5zIHdlIGRvIGEgbGl0dGxlIGV4dHJhIHdvcmsgYnV0IGl0IHdvbid0IGFmZmVjdAorCQkgKiB0aGUgcmVzdWx0IGFzIGFsbCBvdXQgb2YgcmFuZ2UgYnl0ZXMgYXJlIHNldCB0byB6ZXJvIGJ5CisJCSAqIG50ZnNfcmVhZHBhZ2UoKS4KKwkJICovCisJICAJZm9yIChpID0gMDsgaSA8IG1heF9zaXplOyBpKyspCisJCQlucl9mcmVlIC09IChzNjQpaHdlaWdodDMyKGthZGRyW2ldKTsKKwkJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJfQorCW50ZnNfZGVidWcoIkZpbmlzaGVkIHJlYWRpbmcgJE1GVC8kQklUTUFQLCBsYXN0IGluZGV4ID0gMHglbHguIiwKKwkJCWluZGV4IC0gMSk7CisJLyogSWYgZXJyb3JzIG9jY3VyZWQgd2UgbWF5IHdlbGwgaGF2ZSBnb25lIGJlbG93IHplcm8sIGZpeCB0aGlzLiAqLworCWlmIChucl9mcmVlIDwgMCkKKwkJbnJfZnJlZSA9IDA7CisJbnRmc19kZWJ1ZygiRXhpdGluZy4iKTsKKwlyZXR1cm4gbnJfZnJlZTsKK30KKworLyoqCisgKiBudGZzX3N0YXRmcyAtIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCBtb3VudGVkIE5URlMgdm9sdW1lCisgKiBAc2I6CQlzdXBlciBibG9jayBvZiBtb3VudGVkIHZvbHVtZQorICogQHNmczoJc3RhdGZzIHN0cnVjdHVyZSBpbiB3aGljaCB0byByZXR1cm4gdGhlIGluZm9ybWF0aW9uCisgKgorICogUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtb3VudGVkIE5URlMgdm9sdW1lIEBzYiBpbiB0aGUgc3RhdGZzIHN0cnVjdHVyZQorICogcG9pbnRlZCB0byBieSBAc2ZzICh0aGlzIGlzIGluaXRpYWxpemVkIHdpdGggemVyb3MgYmVmb3JlIG50ZnNfc3RhdGZzIGlzCisgKiBjYWxsZWQpLiBXZSBpbnRlcnByZXQgdGhlIHZhbHVlcyB0byBiZSBjb3JyZWN0IG9mIHRoZSBtb21lbnQgaW4gdGltZSBhdAorICogd2hpY2ggd2UgYXJlIGNhbGxlZC4gTW9zdCB2YWx1ZXMgYXJlIHZhcmlhYmxlIG90aGVyd2lzZSBhbmQgdGhpcyBpc24ndCBqdXN0CisgKiB0aGUgZnJlZSB2YWx1ZXMgYnV0IHRoZSB0b3RhbHMgYXMgd2VsbC4gRm9yIGV4YW1wbGUgd2UgY2FuIGluY3JlYXNlIHRoZQorICogdG90YWwgbnVtYmVyIG9mIGZpbGUgbm9kZXMgaWYgd2UgcnVuIG91dCBhbmQgd2UgY2FuIGtlZXAgZG9pbmcgdGhpcyB1bnRpbAorICogdGhlcmUgaXMgbm8gbW9yZSBzcGFjZSBvbiB0aGUgdm9sdW1lIGxlZnQgYXQgYWxsLgorICoKKyAqIENhbGxlZCBmcm9tIHZmc19zdGF0ZnMgd2hpY2ggaXMgdXNlZCB0byBoYW5kbGUgdGhlIHN0YXRmcywgZnN0YXRmcywgYW5kCisgKiB1c3RhdCBzeXN0ZW0gY2FsbHMuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2VzcyBvciAtZXJybm8gb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgbnRmc19zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKnNmcykKK3sKKwludGZzX3ZvbHVtZSAqdm9sID0gTlRGU19TQihzYik7CisJczY0IHNpemU7CisKKwludGZzX2RlYnVnKCJFbnRlcmluZy4iKTsKKwkvKiBUeXBlIG9mIGZpbGVzeXN0ZW0uICovCisJc2ZzLT5mX3R5cGUgICA9IE5URlNfU0JfTUFHSUM7CisJLyogT3B0aW1hbCB0cmFuc2ZlciBibG9jayBzaXplLiAqLworCXNmcy0+Zl9ic2l6ZSAgPSBQQUdFX0NBQ0hFX1NJWkU7CisJLyoKKwkgKiBUb3RhbCBkYXRhIGJsb2NrcyBpbiBmaWxlIHN5c3RlbSBpbiB1bml0cyBvZiBmX2JzaXplIGFuZCBzaW5jZQorCSAqIGlub2RlcyBhcmUgYWxzbyBzdG9yZWQgaW4gZGF0YSBibG9jcyAoJE1GVCBpcyBhIGZpbGUpIHRoaXMgaXMganVzdAorCSAqIHRoZSB0b3RhbCBjbHVzdGVycy4KKwkgKi8KKwlzZnMtPmZfYmxvY2tzID0gdm9sLT5ucl9jbHVzdGVycyA8PCB2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzID4+CisJCQkJUEFHRV9DQUNIRV9TSElGVDsKKwkvKiBGcmVlIGRhdGEgYmxvY2tzIGluIGZpbGUgc3lzdGVtIGluIHVuaXRzIG9mIGZfYnNpemUuICovCisJc2l6ZQkgICAgICA9IGdldF9ucl9mcmVlX2NsdXN0ZXJzKHZvbCkgPDwgdm9sLT5jbHVzdGVyX3NpemVfYml0cyA+PgorCQkJCVBBR0VfQ0FDSEVfU0hJRlQ7CisJaWYgKHNpemUgPCAwTEwpCisJCXNpemUgPSAwTEw7CisJLyogRnJlZSBibG9ja3MgYXZhaWwgdG8gbm9uLXN1cGVydXNlciwgc2FtZSBhcyBhYm92ZSBvbiBOVEZTLiAqLworCXNmcy0+Zl9iYXZhaWwgPSBzZnMtPmZfYmZyZWUgPSBzaXplOworCS8qIFNlcmlhbGl6ZSBhY2Nlc3NlcyB0byB0aGUgaW5vZGUgYml0bWFwLiAqLworCWRvd25fcmVhZCgmdm9sLT5tZnRibXBfbG9jayk7CisJLyogTnVtYmVyIG9mIGlub2RlcyBpbiBmaWxlIHN5c3RlbSAoYXQgdGhpcyBwb2ludCBpbiB0aW1lKS4gKi8KKwlzZnMtPmZfZmlsZXMgPSB2b2wtPm1mdF9pbm8tPmlfc2l6ZSA+PiB2b2wtPm1mdF9yZWNvcmRfc2l6ZV9iaXRzOworCS8qIEZyZWUgaW5vZGVzIGluIGZzIChiYXNlZCBvbiBjdXJyZW50IHRvdGFsIGNvdW50KS4gKi8KKwlzZnMtPmZfZmZyZWUgPSBfX2dldF9ucl9mcmVlX21mdF9yZWNvcmRzKHZvbCk7CisJdXBfcmVhZCgmdm9sLT5tZnRibXBfbG9jayk7CisJLyoKKwkgKiBGaWxlIHN5c3RlbSBpZC4gVGhpcyBpcyBleHRyZW1lbHkgKm5peCBmbGF2b3VyIGRlcGVuZGVudCBhbmQgZXZlbgorCSAqIHdpdGhpbiBMaW51eCBpdHNlbGYgYWxsIGZzIGRvIHRoZWlyIG93biB0aGluZy4gSSBpbnRlcnByZXQgdGhpcyB0bworCSAqIG1lYW4gYSB1bmlxdWUgaWQgYXNzb2NpYXRlZCB3aXRoIHRoZSBtb3VudGVkIGZzIGFuZCBub3QgdGhlIGlkCisJICogYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWxlIHN5c3RlbSBkcml2ZXIsIHRoZSBsYXR0ZXIgaXMgYWxyZWFkeSBnaXZlbgorCSAqIGJ5IHRoZSBmaWxlIHN5c3RlbSB0eXBlIGluIHNmcy0+Zl90eXBlLiBUaHVzIHdlIHVzZSB0aGUgNjQtYml0CisJICogdm9sdW1lIHNlcmlhbCBudW1iZXIgc3BsaXR0aW5nIGl0IGludG8gdHdvIDMyLWJpdCBwYXJ0cy4gV2UgZW50ZXIKKwkgKiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgMzItYml0cyBpbiBmX2ZzaWRbMF0gYW5kIHRoZSBtb3N0IHNpZ25pZmljYW50CisJICogMzItYml0cyBpbiBmX2ZzaWRbMV0uCisJICovCisJc2ZzLT5mX2ZzaWQudmFsWzBdID0gdm9sLT5zZXJpYWxfbm8gJiAweGZmZmZmZmZmOworCXNmcy0+Zl9mc2lkLnZhbFsxXSA9ICh2b2wtPnNlcmlhbF9ubyA+PiAzMikgJiAweGZmZmZmZmZmOworCS8qIE1heGltdW0gbGVuZ3RoIG9mIGZpbGVuYW1lcy4gKi8KKwlzZnMtPmZfbmFtZWxlbgkgICA9IE5URlNfTUFYX05BTUVfTEVOOworCXJldHVybiAwOworfQorCisvKioKKyAqIFRoZSBjb21wbGV0ZSBzdXBlciBvcGVyYXRpb25zLgorICovCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgbnRmc19zb3BzID0geworCS5hbGxvY19pbm9kZQk9IG50ZnNfYWxsb2NfYmlnX2lub2RlLAkgIC8qIFZGUzogQWxsb2NhdGUgbmV3IGlub2RlLiAqLworCS5kZXN0cm95X2lub2RlCT0gbnRmc19kZXN0cm95X2JpZ19pbm9kZSwgLyogVkZTOiBEZWFsbG9jYXRlIGlub2RlLiAqLworCS5wdXRfaW5vZGUJPSBudGZzX3B1dF9pbm9kZSwJICAvKiBWRlM6IENhbGxlZCBqdXN0IGJlZm9yZQorCQkJCQkJICAgICB0aGUgaW5vZGUgcmVmZXJlbmNlIGNvdW50CisJCQkJCQkgICAgIGlzIGRlY3JlYXNlZC4gKi8KKyNpZmRlZiBOVEZTX1JXCisJLy8uZGlydHlfaW5vZGUJPSBOVUxMLAkJCS8qIFZGUzogQ2FsbGVkIGZyb20KKwkvLwkJCQkJICAgX19tYXJrX2lub2RlX2RpcnR5KCkuICovCisJLndyaXRlX2lub2RlCT0gbnRmc193cml0ZV9pbm9kZSwJLyogVkZTOiBXcml0ZSBkaXJ0eSBpbm9kZSB0bworCQkJCQkJICAgZGlzay4gKi8KKwkvLy5kcm9wX2lub2RlCT0gTlVMTCwJCQkvKiBWRlM6IENhbGxlZCBqdXN0IGFmdGVyIHRoZQorCS8vCQkJCQkgICBpbm9kZSByZWZlcmVuY2UgY291bnQgaGFzCisJLy8JCQkJCSAgIGJlZW4gZGVjcmVhc2VkIHRvIHplcm8uCisJLy8JCQkJCSAgIE5PVEU6IFRoZSBpbm9kZSBsb2NrIGlzCisJLy8JCQkJCSAgIGhlbGQuIFNlZSBmcy9pbm9kZS5jOjoKKwkvLwkJCQkJICAgZ2VuZXJpY19kcm9wX2lub2RlKCkuICovCisJLy8uZGVsZXRlX2lub2RlCT0gTlVMTCwJCQkvKiBWRlM6IERlbGV0ZSBpbm9kZSBmcm9tIGRpc2suCisJLy8JCQkJCSAgIENhbGxlZCB3aGVuIGlfY291bnQgYmVjb21lcworCS8vCQkJCQkgICAwIGFuZCBpX25saW5rIGlzIGFsc28gMC4gKi8KKwkvLy53cml0ZV9zdXBlcgk9IE5VTEwsCQkJLyogRmx1c2ggZGlydHkgc3VwZXIgYmxvY2sgdG8KKwkvLwkJCQkJICAgZGlzay4gKi8KKwkvLy5zeW5jX2ZzCT0gTlVMTCwJCQkvKiA/ICovCisJLy8ud3JpdGVfc3VwZXJfbG9ja2ZzCT0gTlVMTCwJCS8qID8gKi8KKwkvLy51bmxvY2tmcwk9IE5VTEwsCQkJLyogPyAqLworI2VuZGlmIC8qIE5URlNfUlcgKi8KKwkucHV0X3N1cGVyCT0gbnRmc19wdXRfc3VwZXIsCS8qIFN5c2NhbGw6IHVtb3VudC4gKi8KKwkuc3RhdGZzCQk9IG50ZnNfc3RhdGZzLAkJLyogU3lzY2FsbDogc3RhdGZzICovCisJLnJlbW91bnRfZnMJPSBudGZzX3JlbW91bnQsCQkvKiBTeXNjYWxsOiBtb3VudCAtbyByZW1vdW50LiAqLworCS5jbGVhcl9pbm9kZQk9IG50ZnNfY2xlYXJfYmlnX2lub2RlLAkvKiBWRlM6IENhbGxlZCB3aGVuIGFuIGlub2RlIGlzCisJCQkJCQkgICByZW1vdmVkIGZyb20gbWVtb3J5LiAqLworCS8vLnVtb3VudF9iZWdpbgk9IE5VTEwsCQkJLyogRm9yY2VkIHVtb3VudC4gKi8KKwkuc2hvd19vcHRpb25zCT0gbnRmc19zaG93X29wdGlvbnMsCS8qIFNob3cgbW91bnQgb3B0aW9ucyBpbgorCQkJCQkJICAgcHJvYy4gKi8KK307CisKKworLyoqCisgKiBEZWNsYXJhdGlvbnMgZm9yIE5URlMgc3BlY2lmaWMgZXhwb3J0IG9wZXJhdGlvbnMgKGZzL250ZnMvbmFtZWkuYykuCisgKi8KK2V4dGVybiBzdHJ1Y3QgZGVudHJ5ICpudGZzX2dldF9wYXJlbnQoc3RydWN0IGRlbnRyeSAqY2hpbGRfZGVudCk7CitleHRlcm4gc3RydWN0IGRlbnRyeSAqbnRmc19nZXRfZGVudHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKmZoKTsKKworLyoqCisgKiBFeHBvcnQgb3BlcmF0aW9ucyBhbGxvd2luZyBORlMgZXhwb3J0aW5nIG9mIG1vdW50ZWQgTlRGUyBwYXJ0aXRpb25zLgorICoKKyAqIFdlIHVzZSB0aGUgZGVmYXVsdCAtPmRlY29kZV9maCgpIGFuZCAtPmVuY29kZV9maCgpIGZvciBub3cuICBOb3RlIHRoYXQgdGhleQorICogdXNlIDMyIGJpdHMgdG8gc3RvcmUgdGhlIGlub2RlIG51bWJlciB3aGljaCBpcyBhbiB1bnNpZ25lZCBsb25nIHNvIG9uIDY0LWJpdAorICogYXJjaGl0ZWN0dXJlcyBpcyB1c3VhbGx5IDY0IGJpdHMgc28gaXQgd291bGQgYWxsIGZhaWwgaG9ycmlibHkgb24gaHVnZQorICogdm9sdW1lcy4gIEkgZ3Vlc3Mgd2UgbmVlZCB0byBkZWZpbmUgb3VyIG93biBlbmNvZGUgYW5kIGRlY29kZSBmaCBmdW5jdGlvbnMKKyAqIHRoYXQgc3RvcmUgNjQtYml0IGlub2RlIG51bWJlcnMgYXQgc29tZSBwb2ludCBidXQgZm9yIG5vdyB3ZSB3aWxsIGlnbm9yZSB0aGUKKyAqIHByb2JsZW0uLi4KKyAqCisgKiBXZSBhbHNvIHVzZSB0aGUgZGVmYXVsdCAtPmdldF9uYW1lKCkgaGVscGVyICh1c2VkIGJ5IC0+ZGVjb2RlX2ZoKCkgdmlhCisgKiBmcy9leHBvcnRmcy9leHBmcy5jOjpmaW5kX2V4cG9ydGVkX2RlbnRyeSgpKSBhcyB0aGF0IGlzIGNvbXBsZXRlbHkgZnMKKyAqIGluZGVwZW5kZW50LgorICoKKyAqIFRoZSBkZWZhdWx0IC0+Z2V0X3BhcmVudCgpIGp1c3QgcmV0dXJucyAtRUFDQ0VTIHNvIHdlIGhhdmUgdG8gcHJvdmlkZSBvdXIKKyAqIG93biBhbmQgdGhlIGRlZmF1bHQgLT5nZXRfZGVudHJ5KCkgaXMgaW5jb21wYXRpYmxlIHdpdGggTlRGUyBkdWUgdG8gbm90CisgKiBhbGxvd2luZyB0aGUgaW5vZGUgbnVtYmVyIDAgd2hpY2ggaXMgdXNlZCBpbiBOVEZTIGZvciB0aGUgc3lzdGVtIGZpbGUgJE1GVAorICogYW5kIGR1ZSB0byB1c2luZyBpZ2V0KCkgd2hlcmVhcyBOVEZTIG5lZWRzIG50ZnNfaWdldCgpLgorICovCitzdGF0aWMgc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIG50ZnNfZXhwb3J0X29wcyA9IHsKKwkuZ2V0X3BhcmVudAk9IG50ZnNfZ2V0X3BhcmVudCwJLyogRmluZCB0aGUgcGFyZW50IG9mIGEgZ2l2ZW4KKwkJCQkJCSAgIGRpcmVjdG9yeS4gKi8KKwkuZ2V0X2RlbnRyeQk9IG50ZnNfZ2V0X2RlbnRyeSwJLyogRmluZCBhIGRlbnRyeSBmb3IgdGhlIGlub2RlCisJCQkJCQkgICBnaXZlbiBhIGZpbGUgaGFuZGxlCisJCQkJCQkgICBzdWItZnJhZ21lbnQuICovCit9OworCisvKioKKyAqIG50ZnNfZmlsbF9zdXBlciAtIG1vdW50IGFuIG50ZnMgZmlsZXMgc3lzdGVtCisgKiBAc2I6CQlzdXBlciBibG9jayBvZiBudGZzIGZpbGUgc3lzdGVtIHRvIG1vdW50CisgKiBAb3B0OglzdHJpbmcgY29udGFpbmluZyB0aGUgbW91bnQgb3B0aW9ucworICogQHNpbGVudDoJc2lsZW5jZSBlcnJvciBvdXRwdXQKKyAqCisgKiBudGZzX2ZpbGxfc3VwZXIoKSBpcyBjYWxsZWQgYnkgdGhlIFZGUyB0byBtb3VudCB0aGUgZGV2aWNlIGRlc2NyaWJlZCBieSBAc2IKKyAqIHdpdGggdGhlIG1vdW50IG90aW9ucyBpbiBAZGF0YSB3aXRoIHRoZSBOVEZTIGZpbGUgc3lzdGVtLgorICoKKyAqIElmIEBzaWxlbnQgaXMgdHJ1ZSwgcmVtYWluIHNpbGVudCBldmVuIGlmIGVycm9ycyBhcmUgZGV0ZWN0ZWQuIFRoaXMgaXMgdXNlZAorICogZHVyaW5nIGJvb3R1cCwgd2hlbiB0aGUga2VybmVsIHRyaWVzIHRvIG1vdW50IHRoZSByb290IGZpbGUgc3lzdGVtIHdpdGggYWxsCisgKiByZWdpc3RlcmVkIGZpbGUgc3lzdGVtcyBvbmUgYWZ0ZXIgdGhlIG90aGVyIHVudGlsIG9uZSBzdWNjZWVkcy4gVGhpcyBpbXBsaWVzCisgKiB0aGF0IGFsbCBmaWxlIHN5c3RlbXMgZXhjZXB0IHRoZSBjb3JyZWN0IG9uZSB3aWxsIHF1aXRlIGNvcnJlY3RseSBhbmQKKyAqIGV4cGVjdGVkbHkgcmV0dXJuIGFuIGVycm9yLCBidXQgbm9ib2R5IHdhbnRzIHRvIHNlZSBlcnJvciBtZXNzYWdlcyB3aGVuIGluCisgKiBmYWN0IHRoaXMgaXMgd2hhdCBpcyBzdXBwb3NlZCB0byBoYXBwZW4uCisgKgorICogTk9URTogQHNiLT5zX2ZsYWdzIGNvbnRhaW5zIHRoZSBtb3VudCBvcHRpb25zIGZsYWdzLgorICovCitzdGF0aWMgaW50IG50ZnNfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpvcHQsIGNvbnN0IGludCBzaWxlbnQpCit7CisJbnRmc192b2x1bWUgKnZvbDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBpbm9kZSAqdG1wX2lubzsKKwlpbnQgcmVzdWx0OworCisJbnRmc19kZWJ1ZygiRW50ZXJpbmcuIik7CisjaWZuZGVmIE5URlNfUlcKKwlzYi0+c19mbGFncyB8PSBNU19SRE9OTFkgfCBNU19OT0FUSU1FIHwgTVNfTk9ESVJBVElNRTsKKyNlbmRpZiAvKiAhIE5URlNfUlcgKi8KKwkvKiBBbGxvY2F0ZSBhIG5ldyBudGZzX3ZvbHVtZSBhbmQgcGxhY2UgaXQgaW4gc2ItPnNfZnNfaW5mby4gKi8KKwlzYi0+c19mc19pbmZvID0ga21hbGxvYyhzaXplb2YobnRmc192b2x1bWUpLCBHRlBfTk9GUyk7CisJdm9sID0gTlRGU19TQihzYik7CisJaWYgKCF2b2wpIHsKKwkJaWYgKCFzaWxlbnQpCisJCQludGZzX2Vycm9yKHNiLCAiQWxsb2NhdGlvbiBvZiBOVEZTIHZvbHVtZSBzdHJ1Y3R1cmUgIgorCQkJCQkiZmFpbGVkLiBBYm9ydGluZyBtb3VudC4uLiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLyogSW5pdGlhbGl6ZSBudGZzX3ZvbHVtZSBzdHJ1Y3R1cmUuICovCisJbWVtc2V0KHZvbCwgMCwgc2l6ZW9mKG50ZnNfdm9sdW1lKSk7CisJdm9sLT5zYiA9IHNiOworCXZvbC0+dXBjYXNlID0gTlVMTDsKKwl2b2wtPmF0dHJkZWYgPSBOVUxMOworCXZvbC0+bWZ0X2lubyA9IE5VTEw7CisJdm9sLT5tZnRibXBfaW5vID0gTlVMTDsKKwlpbml0X3J3c2VtKCZ2b2wtPm1mdGJtcF9sb2NrKTsKKyNpZmRlZiBOVEZTX1JXCisJdm9sLT5tZnRtaXJyX2lubyA9IE5VTEw7CisJdm9sLT5sb2dmaWxlX2lubyA9IE5VTEw7CisjZW5kaWYgLyogTlRGU19SVyAqLworCXZvbC0+bGNuYm1wX2lubyA9IE5VTEw7CisJaW5pdF9yd3NlbSgmdm9sLT5sY25ibXBfbG9jayk7CisJdm9sLT52b2xfaW5vID0gTlVMTDsKKwl2b2wtPnJvb3RfaW5vID0gTlVMTDsKKwl2b2wtPnNlY3VyZV9pbm8gPSBOVUxMOworCXZvbC0+ZXh0ZW5kX2lubyA9IE5VTEw7CisjaWZkZWYgTlRGU19SVworCXZvbC0+cXVvdGFfaW5vID0gTlVMTDsKKwl2b2wtPnF1b3RhX3FfaW5vID0gTlVMTDsKKyNlbmRpZiAvKiBOVEZTX1JXICovCisJdm9sLT5ubHNfbWFwID0gTlVMTDsKKworCS8qCisJICogRGVmYXVsdCBpcyBncm91cCBhbmQgb3RoZXIgZG9uJ3QgaGF2ZSBhbnkgYWNjZXNzIHRvIGZpbGVzIG9yCisJICogZGlyZWN0b3JpZXMgd2hpbGUgb3duZXIgaGFzIGZ1bGwgYWNjZXNzLiBGdXJ0aGVyLCBmaWxlcyBieSBkZWZhdWx0CisJICogYXJlIG5vdCBleGVjdXRhYmxlIGJ1dCBkaXJlY3RvcmllcyBhcmUgb2YgY291cnNlIGJyb3dzZWFibGUuCisJICovCisJdm9sLT5mbWFzayA9IDAxNzc7CisJdm9sLT5kbWFzayA9IDAwNzc7CisKKwl1bmxvY2tfa2VybmVsKCk7CisKKwkvKiBJbXBvcnRhbnQgdG8gZ2V0IHRoZSBtb3VudCBvcHRpb25zIGRlYWx0IHdpdGggbm93LiAqLworCWlmICghcGFyc2Vfb3B0aW9ucyh2b2wsIChjaGFyKilvcHQpKQorCQlnb3RvIGVycl9vdXRfbm93OworCisJLyoKKwkgKiBUT0RPOiBGYWlsIHNhZmV0eSBjaGVjay4gSW4gdGhlIGZ1dHVyZSB3ZSBzaG91bGQgcmVhbGx5IGJlIGFibGUgdG8KKwkgKiBjb3BlIHdpdGggdGhpcyBiZWluZyB0aGUgY2FzZSwgYnV0IGZvciBub3cganVzdCBiYWlsIG91dC4KKwkgKi8KKwlpZiAoYmRldl9oYXJkc2VjdF9zaXplKHNiLT5zX2JkZXYpID4gTlRGU19CTE9DS19TSVpFKSB7CisJCWlmICghc2lsZW50KQorCQkJbnRmc19lcnJvcihzYiwgIkRldmljZSBoYXMgdW5zdXBwb3J0ZWQgaGFyZHNlY3Rfc2l6ZS4iKTsKKwkJZ290byBlcnJfb3V0X25vdzsKKwl9CisKKwkvKiBTZXR1cCB0aGUgZGV2aWNlIGFjY2VzcyBibG9jayBzaXplIHRvIE5URlNfQkxPQ0tfU0laRS4gKi8KKwlpZiAoc2Jfc2V0X2Jsb2Nrc2l6ZShzYiwgTlRGU19CTE9DS19TSVpFKSAhPSBOVEZTX0JMT0NLX1NJWkUpIHsKKwkJaWYgKCFzaWxlbnQpCisJCQludGZzX2Vycm9yKHNiLCAiVW5hYmxlIHRvIHNldCBibG9jayBzaXplLiIpOworCQlnb3RvIGVycl9vdXRfbm93OworCX0KKworCS8qIEdldCB0aGUgc2l6ZSBvZiB0aGUgZGV2aWNlIGluIHVuaXRzIG9mIE5URlNfQkxPQ0tfU0laRSBieXRlcy4gKi8KKwl2b2wtPm5yX2Jsb2NrcyA9IHNiLT5zX2JkZXYtPmJkX2lub2RlLT5pX3NpemUgPj4gTlRGU19CTE9DS19TSVpFX0JJVFM7CisKKwkvKiBSZWFkIHRoZSBib290IHNlY3RvciBhbmQgcmV0dXJuIHVubG9ja2VkIGJ1ZmZlciBoZWFkIHRvIGl0LiAqLworCWlmICghKGJoID0gcmVhZF9udGZzX2Jvb3Rfc2VjdG9yKHNiLCBzaWxlbnQpKSkgeworCQlpZiAoIXNpbGVudCkKKwkJCW50ZnNfZXJyb3Ioc2IsICJOb3QgYW4gTlRGUyB2b2x1bWUuIik7CisJCWdvdG8gZXJyX291dF9ub3c7CisJfQorCisJLyoKKwkgKiBFeHRyYWN0IHRoZSBkYXRhIGZyb20gdGhlIGJvb3Qgc2VjdG9yIGFuZCBzZXR1cCB0aGUgbnRmcyBzdXBlciBibG9jaworCSAqIHVzaW5nIGl0LgorCSAqLworCXJlc3VsdCA9IHBhcnNlX250ZnNfYm9vdF9zZWN0b3Iodm9sLCAoTlRGU19CT09UX1NFQ1RPUiopYmgtPmJfZGF0YSk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBjbHVzdGVyIGFuZCBtZnQgYWxsb2NhdG9ycy4gKi8KKwludGZzX3NldHVwX2FsbG9jYXRvcnModm9sKTsKKworCWJyZWxzZShiaCk7CisKKwlpZiAoIXJlc3VsdCkgeworCQlpZiAoIXNpbGVudCkKKwkJCW50ZnNfZXJyb3Ioc2IsICJVbnN1cHBvcnRlZCBOVEZTIGZpbGVzeXN0ZW0uIik7CisJCWdvdG8gZXJyX291dF9ub3c7CisJfQorCisJLyoKKwkgKiBUT0RPOiBXaGVuIHdlIHN0YXJ0IGNvcGluZyB3aXRoIHNlY3RvciBzaXplcyBkaWZmZXJlbnQgZnJvbQorCSAqIE5URlNfQkxPQ0tfU0laRSwgd2Ugbm93IHByb2JhYmx5IG5lZWQgdG8gc2V0IHRoZSBibG9ja3NpemUgb2YgdGhlCisJICogZGV2aWNlIChwcm9iYWJseSB0byBOVEZTX0JMT0NLX1NJWkUpLgorCSAqLworCisJLyogU2V0dXAgcmVtYWluaW5nIGZpZWxkcyBpbiB0aGUgc3VwZXIgYmxvY2suICovCisJc2ItPnNfbWFnaWMgPSBOVEZTX1NCX01BR0lDOworCisJLyoKKwkgKiBOdGZzIGFsbG93cyA2MyBiaXRzIGZvciB0aGUgZmlsZSBzaXplLCBpLmUuIGNvcnJlY3Qgd291bGQgYmU6CisJICoJc2ItPnNfbWF4Ynl0ZXMgPSB+MFVMTCA+PiAxOworCSAqIEJ1dCB0aGUga2VybmVsIHVzZXMgYSBsb25nIGFzIHRoZSBwYWdlIGNhY2hlIHBhZ2UgaW5kZXggd2hpY2ggb24KKwkgKiAzMi1iaXQgYXJjaGl0ZWN0dXJlcyBpcyBvbmx5IDMyLWJpdHMuIE1BWF9MRlNfRklMRVNJWkUgaXMga2VybmVsCisJICogZGVmaW5lZCB0byB0aGUgbWF4aW11bSB0aGUgcGFnZSBjYWNoZSBwYWdlIGluZGV4IGNhbiBjb3BlIHdpdGgKKwkgKiB3aXRob3V0IG92ZXJmbG93aW5nIHRoZSBpbmRleCBvciB0byAyXjYzIC0gMSwgd2hpY2hldmVyIGlzIHNtYWxsZXIuCisJICovCisJc2ItPnNfbWF4Ynl0ZXMgPSBNQVhfTEZTX0ZJTEVTSVpFOworCisJc2ItPnNfdGltZV9ncmFuID0gMTAwOworCisJLyoKKwkgKiBOb3cgbG9hZCB0aGUgbWV0YWRhdGEgcmVxdWlyZWQgZm9yIHRoZSBwYWdlIGNhY2hlIGFuZCBvdXIgYWRkcmVzcworCSAqIHNwYWNlIG9wZXJhdGlvbnMgdG8gZnVuY3Rpb24uIFdlIGRvIHRoaXMgYnkgc2V0dGluZyB1cCBhIHNwZWNpYWxpc2VkCisJICogcmVhZF9pbm9kZSBtZXRob2QgYW5kIHRoZW4ganVzdCBjYWxsaW5nIHRoZSBub3JtYWwgaWdldCgpIHRvIG9idGFpbgorCSAqIHRoZSBpbm9kZSBmb3IgJE1GVCB3aGljaCBpcyBzdWZmaWNpZW50IHRvIGFsbG93IG91ciBub3JtYWwgaW5vZGUKKwkgKiBvcGVyYXRpb25zIGFuZCBhc3NvY2lhdGVkIGFkZHJlc3Mgc3BhY2Ugb3BlcmF0aW9ucyB0byBmdW5jdGlvbi4KKwkgKi8KKwlzYi0+c19vcCA9ICZudGZzX3NvcHM7CisJdG1wX2lubyA9IG5ld19pbm9kZShzYik7CisJaWYgKCF0bXBfaW5vKSB7CisJCWlmICghc2lsZW50KQorCQkJbnRmc19lcnJvcihzYiwgIkZhaWxlZCB0byBsb2FkIGVzc2VudGlhbCBtZXRhZGF0YS4iKTsKKwkJZ290byBlcnJfb3V0X25vdzsKKwl9CisJdG1wX2luby0+aV9pbm8gPSBGSUxFX01GVDsKKwlpbnNlcnRfaW5vZGVfaGFzaCh0bXBfaW5vKTsKKwlpZiAobnRmc19yZWFkX2lub2RlX21vdW50KHRtcF9pbm8pIDwgMCkgeworCQlpZiAoIXNpbGVudCkKKwkJCW50ZnNfZXJyb3Ioc2IsICJGYWlsZWQgdG8gbG9hZCBlc3NlbnRpYWwgbWV0YWRhdGEuIik7CisJCWdvdG8gaXB1dF90bXBfaW5vX2Vycl9vdXRfbm93OworCX0KKwlkb3duKCZudGZzX2xvY2spOworCS8qCisJICogVGhlIGN1cnJlbnQgbW91bnQgaXMgYSBjb21wcmVzc2lvbiB1c2VyIGlmIHRoZSBjbHVzdGVyIHNpemUgaXMKKwkgKiBsZXNzIHRoYW4gb3IgZXF1YWwgNGtpQi4KKwkgKi8KKwlpZiAodm9sLT5jbHVzdGVyX3NpemUgPD0gNDA5NiAmJiAhbnRmc19ucl9jb21wcmVzc2lvbl91c2VycysrKSB7CisJCXJlc3VsdCA9IGFsbG9jYXRlX2NvbXByZXNzaW9uX2J1ZmZlcnMoKTsKKwkJaWYgKHJlc3VsdCkgeworCQkJbnRmc19lcnJvcihOVUxMLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlcnMgIgorCQkJCQkiZm9yIGNvbXByZXNzaW9uIGVuZ2luZS4iKTsKKwkJCW50ZnNfbnJfY29tcHJlc3Npb25fdXNlcnMtLTsKKwkJCXVwKCZudGZzX2xvY2spOworCQkJZ290byBpcHV0X3RtcF9pbm9fZXJyX291dF9ub3c7CisJCX0KKwl9CisJLyoKKwkgKiBHZW5lcmF0ZSB0aGUgZ2xvYmFsIGRlZmF1bHQgdXBjYXNlIHRhYmxlIGlmIG5lY2Vzc2FyeS4gIEFsc28KKwkgKiB0ZW1wb3JhcmlseSBpbmNyZW1lbnQgdGhlIG51bWJlciBvZiB1cGNhc2UgdXNlcnMgdG8gYXZvaWQgcmFjZQorCSAqIGNvbmRpdGlvbnMgd2l0aCBjb25jdXJyZW50ICh1KW1vdW50cy4KKwkgKi8KKwlpZiAoIWRlZmF1bHRfdXBjYXNlKQorCQlkZWZhdWx0X3VwY2FzZSA9IGdlbmVyYXRlX2RlZmF1bHRfdXBjYXNlKCk7CisJbnRmc19ucl91cGNhc2VfdXNlcnMrKzsKKwl1cCgmbnRmc19sb2NrKTsKKwkvKgorCSAqIEZyb20gbm93IG9uLCBpZ25vcmUgQHNpbGVudCBwYXJhbWV0ZXIuIElmIHdlIGZhaWwgYmVsb3cgdGhpcyBsaW5lLAorCSAqIGl0IHdpbGwgYmUgZHVlIHRvIGEgY29ycnVwdCBmcyBvciBhIHN5c3RlbSBlcnJvciwgc28gd2UgcmVwb3J0IGl0LgorCSAqLworCS8qCisJICogT3BlbiB0aGUgc3lzdGVtIGZpbGVzIHdpdGggbm9ybWFsIGFjY2VzcyBmdW5jdGlvbnMgYW5kIGNvbXBsZXRlCisJICogc2V0dGluZyB1cCB0aGUgbnRmcyBzdXBlciBibG9jay4KKwkgKi8KKwlpZiAoIWxvYWRfc3lzdGVtX2ZpbGVzKHZvbCkpIHsKKwkJbnRmc19lcnJvcihzYiwgIkZhaWxlZCB0byBsb2FkIHN5c3RlbSBmaWxlcy4iKTsKKwkJZ290byB1bmxfdXBjYXNlX2lwdXRfdG1wX2lub19lcnJfb3V0X25vdzsKKwl9CisJaWYgKChzYi0+c19yb290ID0gZF9hbGxvY19yb290KHZvbC0+cm9vdF9pbm8pKSkgeworCQkvKiBXZSBpbmNyZW1lbnQgaV9jb3VudCBzaW11bGF0aW5nIGFuIG50ZnNfaWdldCgpLiAqLworCQlhdG9taWNfaW5jKCZ2b2wtPnJvb3RfaW5vLT5pX2NvdW50KTsKKwkJbnRmc19kZWJ1ZygiRXhpdGluZywgc3RhdHVzIHN1Y2Nlc3NmdWwuIik7CisJCS8qIFJlbGVhc2UgdGhlIGRlZmF1bHQgdXBjYXNlIGlmIGl0IGhhcyBubyB1c2Vycy4gKi8KKwkJZG93bigmbnRmc19sb2NrKTsKKwkJaWYgKCEtLW50ZnNfbnJfdXBjYXNlX3VzZXJzICYmIGRlZmF1bHRfdXBjYXNlKSB7CisJCQludGZzX2ZyZWUoZGVmYXVsdF91cGNhc2UpOworCQkJZGVmYXVsdF91cGNhc2UgPSBOVUxMOworCQl9CisJCXVwKCZudGZzX2xvY2spOworCQlzYi0+c19leHBvcnRfb3AgPSAmbnRmc19leHBvcnRfb3BzOworCQlsb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gMDsKKwl9CisJbnRmc19lcnJvcihzYiwgIkZhaWxlZCB0byBhbGxvY2F0ZSByb290IGRpcmVjdG9yeS4iKTsKKwkvKiBDbGVhbiB1cCBhZnRlciB0aGUgc3VjY2Vzc2Z1bCBsb2FkX3N5c3RlbV9maWxlcygpIGNhbGwgZnJvbSBhYm92ZS4gKi8KKwkvLyBUT0RPOiBVc2UgbnRmc19wdXRfc3VwZXIoKSBpbnN0ZWFkIG9mIHJlcGVhdGluZyBhbGwgdGhpcyBjb2RlLi4uCisJLy8gRklYTUU6IFNob3VsZCBtYXJrIHRoZSB2b2x1bWUgY2xlYW4gYXMgdGhlIGVycm9yIGlzIG1vc3QgbGlrZWx5CisJLy8gCSAgLUVOT01FTS4KKwlpcHV0KHZvbC0+dm9sX2lubyk7CisJdm9sLT52b2xfaW5vID0gTlVMTDsKKwkvKiBOVEZTIDMuMCsgc3BlY2lmaWMgY2xlYW4gdXAuICovCisJaWYgKHZvbC0+bWFqb3JfdmVyID49IDMpIHsKKyNpZmRlZiBOVEZTX1JXCisJCWlmICh2b2wtPnF1b3RhX3FfaW5vKSB7CisJCQlpcHV0KHZvbC0+cXVvdGFfcV9pbm8pOworCQkJdm9sLT5xdW90YV9xX2lubyA9IE5VTEw7CisJCX0KKwkJaWYgKHZvbC0+cXVvdGFfaW5vKSB7CisJCQlpcHV0KHZvbC0+cXVvdGFfaW5vKTsKKwkJCXZvbC0+cXVvdGFfaW5vID0gTlVMTDsKKwkJfQorI2VuZGlmIC8qIE5URlNfUlcgKi8KKwkJaWYgKHZvbC0+ZXh0ZW5kX2lubykgeworCQkJaXB1dCh2b2wtPmV4dGVuZF9pbm8pOworCQkJdm9sLT5leHRlbmRfaW5vID0gTlVMTDsKKwkJfQorCQlpZiAodm9sLT5zZWN1cmVfaW5vKSB7CisJCQlpcHV0KHZvbC0+c2VjdXJlX2lubyk7CisJCQl2b2wtPnNlY3VyZV9pbm8gPSBOVUxMOworCQl9CisJfQorCWlwdXQodm9sLT5yb290X2lubyk7CisJdm9sLT5yb290X2lubyA9IE5VTEw7CisJaXB1dCh2b2wtPmxjbmJtcF9pbm8pOworCXZvbC0+bGNuYm1wX2lubyA9IE5VTEw7CisJaXB1dCh2b2wtPm1mdGJtcF9pbm8pOworCXZvbC0+bWZ0Ym1wX2lubyA9IE5VTEw7CisjaWZkZWYgTlRGU19SVworCWlmICh2b2wtPmxvZ2ZpbGVfaW5vKSB7CisJCWlwdXQodm9sLT5sb2dmaWxlX2lubyk7CisJCXZvbC0+bG9nZmlsZV9pbm8gPSBOVUxMOworCX0KKwlpZiAodm9sLT5tZnRtaXJyX2lubykgeworCQlpcHV0KHZvbC0+bWZ0bWlycl9pbm8pOworCQl2b2wtPm1mdG1pcnJfaW5vID0gTlVMTDsKKwl9CisjZW5kaWYgLyogTlRGU19SVyAqLworCS8qIFRocm93IGF3YXkgdGhlIHRhYmxlIG9mIGF0dHJpYnV0ZSBkZWZpbml0aW9ucy4gKi8KKwl2b2wtPmF0dHJkZWZfc2l6ZSA9IDA7CisJaWYgKHZvbC0+YXR0cmRlZikgeworCQludGZzX2ZyZWUodm9sLT5hdHRyZGVmKTsKKwkJdm9sLT5hdHRyZGVmID0gTlVMTDsKKwl9CisJdm9sLT51cGNhc2VfbGVuID0gMDsKKwlkb3duKCZudGZzX2xvY2spOworCWlmICh2b2wtPnVwY2FzZSA9PSBkZWZhdWx0X3VwY2FzZSkgeworCQludGZzX25yX3VwY2FzZV91c2Vycy0tOworCQl2b2wtPnVwY2FzZSA9IE5VTEw7CisJfQorCXVwKCZudGZzX2xvY2spOworCWlmICh2b2wtPnVwY2FzZSkgeworCQludGZzX2ZyZWUodm9sLT51cGNhc2UpOworCQl2b2wtPnVwY2FzZSA9IE5VTEw7CisJfQorCWlmICh2b2wtPm5sc19tYXApIHsKKwkJdW5sb2FkX25scyh2b2wtPm5sc19tYXApOworCQl2b2wtPm5sc19tYXAgPSBOVUxMOworCX0KKwkvKiBFcnJvciBleGl0IGNvZGUgcGF0aC4gKi8KK3VubF91cGNhc2VfaXB1dF90bXBfaW5vX2Vycl9vdXRfbm93OgorCS8qCisJICogRGVjcmVhc2UgdGhlIG51bWJlciBvZiB1cGNhc2UgdXNlcnMgYW5kIGRlc3Ryb3kgdGhlIGdsb2JhbCBkZWZhdWx0CisJICogdXBjYXNlIHRhYmxlIGlmIG5lY2Vzc2FyeS4KKwkgKi8KKwlkb3duKCZudGZzX2xvY2spOworCWlmICghLS1udGZzX25yX3VwY2FzZV91c2VycyAmJiBkZWZhdWx0X3VwY2FzZSkgeworCQludGZzX2ZyZWUoZGVmYXVsdF91cGNhc2UpOworCQlkZWZhdWx0X3VwY2FzZSA9IE5VTEw7CisJfQorCWlmICh2b2wtPmNsdXN0ZXJfc2l6ZSA8PSA0MDk2ICYmICEtLW50ZnNfbnJfY29tcHJlc3Npb25fdXNlcnMpCisJCWZyZWVfY29tcHJlc3Npb25fYnVmZmVycygpOworCXVwKCZudGZzX2xvY2spOworaXB1dF90bXBfaW5vX2Vycl9vdXRfbm93OgorCWlwdXQodG1wX2lubyk7CisJaWYgKHZvbC0+bWZ0X2lubyAmJiB2b2wtPm1mdF9pbm8gIT0gdG1wX2lubykKKwkJaXB1dCh2b2wtPm1mdF9pbm8pOworCXZvbC0+bWZ0X2lubyA9IE5VTEw7CisJLyoKKwkgKiBUaGlzIGlzIG5lZWRlZCB0byBnZXQgbnRmc19jbGVhcl9leHRlbnRfaW5vZGUoKSBjYWxsZWQgZm9yIGVhY2gKKwkgKiBpbm9kZSB3ZSBoYXZlIGV2ZXIgY2FsbGVkIG50ZnNfaWdldCgpL2lwdXQoKSBvbiwgb3RoZXJ3aXNlIHdlIEEpCisJICogbGVhayByZXNvdXJjZXMgYW5kIEIpIGEgc3Vic2VxdWVudCBtb3VudCBmYWlscyBhdXRvbWF0aWNhbGx5IGR1ZSB0bworCSAqIG50ZnNfaWdldCgpIG5ldmVyIGNhbGxpbmcgZG93biBpbnRvIG91ciBudGZzX3JlYWRfbG9ja2VkX2lub2RlKCkKKwkgKiBtZXRob2QgYWdhaW4uLi4gRklYTUU6IERvIHdlIG5lZWQgdG8gZG8gdGhpcyB0d2ljZSBub3cgYmVjYXVzZSBvZgorCSAqIGF0dHJpYnV0ZSBpbm9kZXM/IEkgdGhpbmsgbm90LCBzbyBsZWF2ZSBhcyBpcyBmb3Igbm93Li4uIChBSUEpCisJICovCisJaWYgKGludmFsaWRhdGVfaW5vZGVzKHNiKSkgeworCQludGZzX2Vycm9yKHNiLCAiQnVzeSBpbm9kZXMgbGVmdC4gVGhpcyBpcyBtb3N0IGxpa2VseSBhIE5URlMgIgorCQkJCSJkcml2ZXIgYnVnLiIpOworCQkvKiBDb3BpZWQgZnJvbSBmcy9zdXBlci5jLiBJIGp1c3QgbG92ZSB0aGlzIG1lc3NhZ2UuICgtOyAqLworCQlwcmludGsoIk5URlM6IEJ1c3kgaW5vZGVzIGFmdGVyIHVtb3VudC4gU2VsZi1kZXN0cnVjdCBpbiA1ICIKKwkJCQkic2Vjb25kcy4gIEhhdmUgYSBuaWNlIGRheS4uLlxuIik7CisJfQorCS8qIEVycm9ycyBhdCB0aGlzIHN0YWdlIGFyZSBpcnJlbGV2YW50LiAqLworZXJyX291dF9ub3c6CisJbG9ja19rZXJuZWwoKTsKKwlzYi0+c19mc19pbmZvID0gTlVMTDsKKwlrZnJlZSh2b2wpOworCW50ZnNfZGVidWcoIkZhaWxlZCwgcmV0dXJuaW5nIC1FSU5WQUwuIik7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qCisgKiBUaGlzIGlzIGEgc2xhYiBjYWNoZSB0byBvcHRpbWl6ZSBhbGxvY2F0aW9ucyBhbmQgZGVhbGxvY2F0aW9ucyBvZiBVbmljb2RlCisgKiBzdHJpbmdzIG9mIHRoZSBtYXhpbXVtIGxlbmd0aCBhbGxvd2VkIGJ5IE5URlMsIHdoaWNoIGlzIE5URlNfTUFYX05BTUVfTEVOCisgKiAoMjU1KSBVbmljb2RlIGNoYXJhY3RlcnMgKyBhIHRlcm1pbmF0aW5nIE5VTEwgVW5pY29kZSBjaGFyYWN0ZXIuCisgKi8KK2ttZW1fY2FjaGVfdCAqbnRmc19uYW1lX2NhY2hlOworCisvKiBTbGFiIGNhY2hlcyBmb3IgZWZmaWNpZW50IGFsbG9jYXRpb24vZGVhbGxvY2F0aW9uIG9mIG9mIGlub2Rlcy4gKi8KK2ttZW1fY2FjaGVfdCAqbnRmc19pbm9kZV9jYWNoZTsKK2ttZW1fY2FjaGVfdCAqbnRmc19iaWdfaW5vZGVfY2FjaGU7CisKKy8qIEluaXQgb25jZSBjb25zdHJ1Y3RvciBmb3IgdGhlIGlub2RlIHNsYWIgY2FjaGUuICovCitzdGF0aWMgdm9pZCBudGZzX2JpZ19pbm9kZV9pbml0X29uY2Uodm9pZCAqZm9vLCBrbWVtX2NhY2hlX3QgKmNhY2hlcCwKKwkJdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwludGZzX2lub2RlICpuaSA9IChudGZzX2lub2RlICopZm9vOworCisJaWYgKChmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CisJCQlTTEFCX0NUT1JfQ09OU1RSVUNUT1IpCisJCWlub2RlX2luaXRfb25jZShWRlNfSShuaSkpOworfQorCisvKgorICogU2xhYiBjYWNoZXMgdG8gb3B0aW1pemUgYWxsb2NhdGlvbnMgYW5kIGRlYWxsb2NhdGlvbnMgb2YgYXR0cmlidXRlIHNlYXJjaAorICogY29udGV4dHMgYW5kIGluZGV4IGNvbnRleHRzLCByZXNwZWN0aXZlbHkuCisgKi8KK2ttZW1fY2FjaGVfdCAqbnRmc19hdHRyX2N0eF9jYWNoZTsKK2ttZW1fY2FjaGVfdCAqbnRmc19pbmRleF9jdHhfY2FjaGU7CisKKy8qIERyaXZlciB3aWRlIHNlbWFwaG9yZS4gKi8KK0RFQ0xBUkVfTVVURVgobnRmc19sb2NrKTsKKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqbnRmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCBudGZzX2ZpbGxfc3VwZXIpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgbnRmc19mc190eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAibnRmcyIsCisJLmdldF9zYgkJPSBudGZzX2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfYmxvY2tfc3VwZXIsCisJLmZzX2ZsYWdzCT0gRlNfUkVRVUlSRVNfREVWLAorfTsKKworLyogU3RhYmxlIG5hbWVzIGZvciB0aGUgc2xhYiBjYWNoZXMuICovCitzdGF0aWMgY29uc3QgY2hhciBudGZzX2luZGV4X2N0eF9jYWNoZV9uYW1lW10gPSAibnRmc19pbmRleF9jdHhfY2FjaGUiOworc3RhdGljIGNvbnN0IGNoYXIgbnRmc19hdHRyX2N0eF9jYWNoZV9uYW1lW10gPSAibnRmc19hdHRyX2N0eF9jYWNoZSI7CitzdGF0aWMgY29uc3QgY2hhciBudGZzX25hbWVfY2FjaGVfbmFtZVtdID0gIm50ZnNfbmFtZV9jYWNoZSI7CitzdGF0aWMgY29uc3QgY2hhciBudGZzX2lub2RlX2NhY2hlX25hbWVbXSA9ICJudGZzX2lub2RlX2NhY2hlIjsKK3N0YXRpYyBjb25zdCBjaGFyIG50ZnNfYmlnX2lub2RlX2NhY2hlX25hbWVbXSA9ICJudGZzX2JpZ19pbm9kZV9jYWNoZSI7CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbnRmc19mcyh2b2lkKQoreworCWludCBlcnIgPSAwOworCisJLyogVGhpcyBtYXkgYmUgdWdseSBidXQgaXQgcmVzdWx0cyBpbiBwcmV0dHkgb3V0cHV0IHNvIHdobyBjYXJlcy4gKC04ICovCisJcHJpbnRrKEtFUk5fSU5GTyAiTlRGUyBkcml2ZXIgIiBOVEZTX1ZFUlNJT04gIiBbRmxhZ3M6IFIvIgorI2lmZGVmIE5URlNfUlcKKwkJCSJXIgorI2Vsc2UKKwkJCSJPIgorI2VuZGlmCisjaWZkZWYgREVCVUcKKwkJCSIgREVCVUciCisjZW5kaWYKKyNpZmRlZiBNT0RVTEUKKwkJCSIgTU9EVUxFIgorI2VuZGlmCisJCQkiXS5cbiIpOworCisJbnRmc19kZWJ1ZygiRGVidWcgbWVzc2FnZXMgYXJlIGVuYWJsZWQuIik7CisKKwludGZzX2luZGV4X2N0eF9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKG50ZnNfaW5kZXhfY3R4X2NhY2hlX25hbWUsCisJCQlzaXplb2YobnRmc19pbmRleF9jb250ZXh0KSwgMCAvKiBvZmZzZXQgKi8sCisJCQlTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwgLyogY3RvciAqLywgTlVMTCAvKiBkdG9yICovKTsKKwlpZiAoIW50ZnNfaW5kZXhfY3R4X2NhY2hlKSB7CisJCXByaW50ayhLRVJOX0NSSVQgIk5URlM6IEZhaWxlZCB0byBjcmVhdGUgJXMhXG4iLAorCQkJCW50ZnNfaW5kZXhfY3R4X2NhY2hlX25hbWUpOworCQlnb3RvIGljdHhfZXJyX291dDsKKwl9CisJbnRmc19hdHRyX2N0eF9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKG50ZnNfYXR0cl9jdHhfY2FjaGVfbmFtZSwKKwkJCXNpemVvZihudGZzX2F0dHJfc2VhcmNoX2N0eCksIDAgLyogb2Zmc2V0ICovLAorCQkJU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMIC8qIGN0b3IgKi8sIE5VTEwgLyogZHRvciAqLyk7CisJaWYgKCFudGZzX2F0dHJfY3R4X2NhY2hlKSB7CisJCXByaW50ayhLRVJOX0NSSVQgIk5URlM6IEZhaWxlZCB0byBjcmVhdGUgJXMhXG4iLAorCQkJCW50ZnNfYXR0cl9jdHhfY2FjaGVfbmFtZSk7CisJCWdvdG8gYWN0eF9lcnJfb3V0OworCX0KKworCW50ZnNfbmFtZV9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKG50ZnNfbmFtZV9jYWNoZV9uYW1lLAorCQkJKE5URlNfTUFYX05BTUVfTEVOKzEpICogc2l6ZW9mKG50ZnNjaGFyKSwgMCwKKwkJCVNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCwgTlVMTCk7CisJaWYgKCFudGZzX25hbWVfY2FjaGUpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiTlRGUzogRmFpbGVkIHRvIGNyZWF0ZSAlcyFcbiIsCisJCQkJbnRmc19uYW1lX2NhY2hlX25hbWUpOworCQlnb3RvIG5hbWVfZXJyX291dDsKKwl9CisKKwludGZzX2lub2RlX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUobnRmc19pbm9kZV9jYWNoZV9uYW1lLAorCQkJc2l6ZW9mKG50ZnNfaW5vZGUpLCAwLAorCQkJU0xBQl9SRUNMQUlNX0FDQ09VTlQsIE5VTEwsIE5VTEwpOworCWlmICghbnRmc19pbm9kZV9jYWNoZSkgeworCQlwcmludGsoS0VSTl9DUklUICJOVEZTOiBGYWlsZWQgdG8gY3JlYXRlICVzIVxuIiwKKwkJCQludGZzX2lub2RlX2NhY2hlX25hbWUpOworCQlnb3RvIGlub2RlX2Vycl9vdXQ7CisJfQorCisJbnRmc19iaWdfaW5vZGVfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZShudGZzX2JpZ19pbm9kZV9jYWNoZV9uYW1lLAorCQkJc2l6ZW9mKGJpZ19udGZzX2lub2RlKSwgMCwKKwkJCVNMQUJfSFdDQUNIRV9BTElHTnxTTEFCX1JFQ0xBSU1fQUNDT1VOVCwKKwkJCW50ZnNfYmlnX2lub2RlX2luaXRfb25jZSwgTlVMTCk7CisJaWYgKCFudGZzX2JpZ19pbm9kZV9jYWNoZSkgeworCQlwcmludGsoS0VSTl9DUklUICJOVEZTOiBGYWlsZWQgdG8gY3JlYXRlICVzIVxuIiwKKwkJCQludGZzX2JpZ19pbm9kZV9jYWNoZV9uYW1lKTsKKwkJZ290byBiaWdfaW5vZGVfZXJyX291dDsKKwl9CisKKwkvKiBSZWdpc3RlciB0aGUgbnRmcyBzeXNjdGxzLiAqLworCWVyciA9IG50ZnNfc3lzY3RsKDEpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiTlRGUzogRmFpbGVkIHRvIHJlZ2lzdGVyIE5URlMgc3lzY3RscyFcbiIpOworCQlnb3RvIHN5c2N0bF9lcnJfb3V0OworCX0KKworCWVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJm50ZnNfZnNfdHlwZSk7CisJaWYgKCFlcnIpIHsKKwkJbnRmc19kZWJ1ZygiTlRGUyBkcml2ZXIgcmVnaXN0ZXJlZCBzdWNjZXNzZnVsbHkuIik7CisJCXJldHVybiAwOyAvKiBTdWNjZXNzISAqLworCX0KKwlwcmludGsoS0VSTl9DUklUICJOVEZTOiBGYWlsZWQgdG8gcmVnaXN0ZXIgTlRGUyBmaWxlIHN5c3RlbSBkcml2ZXIhXG4iKTsKKworc3lzY3RsX2Vycl9vdXQ6CisJa21lbV9jYWNoZV9kZXN0cm95KG50ZnNfYmlnX2lub2RlX2NhY2hlKTsKK2JpZ19pbm9kZV9lcnJfb3V0OgorCWttZW1fY2FjaGVfZGVzdHJveShudGZzX2lub2RlX2NhY2hlKTsKK2lub2RlX2Vycl9vdXQ6CisJa21lbV9jYWNoZV9kZXN0cm95KG50ZnNfbmFtZV9jYWNoZSk7CituYW1lX2Vycl9vdXQ6CisJa21lbV9jYWNoZV9kZXN0cm95KG50ZnNfYXR0cl9jdHhfY2FjaGUpOworYWN0eF9lcnJfb3V0OgorCWttZW1fY2FjaGVfZGVzdHJveShudGZzX2luZGV4X2N0eF9jYWNoZSk7CitpY3R4X2Vycl9vdXQ6CisJaWYgKCFlcnIpIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiTlRGUzogQWJvcnRpbmcgTlRGUyBmaWxlIHN5c3RlbSBkcml2ZXIgIgorCQkJCSJyZWdpc3RyYXRpb24uLi5cbiIpOworCQllcnIgPSAtRU5PTUVNOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9udGZzX2ZzKHZvaWQpCit7CisJaW50IGVyciA9IDA7CisKKwludGZzX2RlYnVnKCJVbnJlZ2lzdGVyaW5nIE5URlMgZHJpdmVyLiIpOworCisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZudGZzX2ZzX3R5cGUpOworCisJaWYgKGttZW1fY2FjaGVfZGVzdHJveShudGZzX2JpZ19pbm9kZV9jYWNoZSkgJiYgKGVyciA9IDEpKQorCQlwcmludGsoS0VSTl9DUklUICJOVEZTOiBGYWlsZWQgdG8gZGVzdG9yeSAlcy5cbiIsCisJCQkJbnRmc19iaWdfaW5vZGVfY2FjaGVfbmFtZSk7CisJaWYgKGttZW1fY2FjaGVfZGVzdHJveShudGZzX2lub2RlX2NhY2hlKSAmJiAoZXJyID0gMSkpCisJCXByaW50ayhLRVJOX0NSSVQgIk5URlM6IEZhaWxlZCB0byBkZXN0b3J5ICVzLlxuIiwKKwkJCQludGZzX2lub2RlX2NhY2hlX25hbWUpOworCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3kobnRmc19uYW1lX2NhY2hlKSAmJiAoZXJyID0gMSkpCisJCXByaW50ayhLRVJOX0NSSVQgIk5URlM6IEZhaWxlZCB0byBkZXN0b3J5ICVzLlxuIiwKKwkJCQludGZzX25hbWVfY2FjaGVfbmFtZSk7CisJaWYgKGttZW1fY2FjaGVfZGVzdHJveShudGZzX2F0dHJfY3R4X2NhY2hlKSAmJiAoZXJyID0gMSkpCisJCXByaW50ayhLRVJOX0NSSVQgIk5URlM6IEZhaWxlZCB0byBkZXN0b3J5ICVzLlxuIiwKKwkJCQludGZzX2F0dHJfY3R4X2NhY2hlX25hbWUpOworCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3kobnRmc19pbmRleF9jdHhfY2FjaGUpICYmIChlcnIgPSAxKSkKKwkJcHJpbnRrKEtFUk5fQ1JJVCAiTlRGUzogRmFpbGVkIHRvIGRlc3RvcnkgJXMuXG4iLAorCQkJCW50ZnNfaW5kZXhfY3R4X2NhY2hlX25hbWUpOworCWlmIChlcnIpCisJCXByaW50ayhLRVJOX0NSSVQgIk5URlM6IFRoaXMgY2F1c2VzIG1lbW9yeSB0byBsZWFrISBUaGVyZSBpcyAiCisJCQkJInByb2JhYmx5IGEgQlVHIGluIHRoZSBkcml2ZXIhIFBsZWFzZSByZXBvcnQgIgorCQkJCSJ5b3Ugc2F3IHRoaXMgbWVzc2FnZSB0byAiCisJCQkJImxpbnV4LW50ZnMtZGV2QGxpc3RzLnNvdXJjZWZvcmdlLm5ldFxuIik7CisJLyogVW5yZWdpc3RlciB0aGUgbnRmcyBzeXNjdGxzLiAqLworCW50ZnNfc3lzY3RsKDApOworfQorCitNT0RVTEVfQVVUSE9SKCJBbnRvbiBBbHRhcGFybWFrb3YgPGFpYTIxQGNhbnRhYi5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk5URlMgMS4yLzMueCBkcml2ZXIgLSBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YiKTsKK01PRFVMRV9WRVJTSU9OKE5URlNfVkVSU0lPTik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisjaWZkZWYgREVCVUcKK21vZHVsZV9wYXJhbShkZWJ1Z19tc2dzLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWdfbXNncywgIkVuYWJsZSBkZWJ1ZyBtZXNzYWdlcy4iKTsKKyNlbmRpZgorCittb2R1bGVfaW5pdChpbml0X250ZnNfZnMpCittb2R1bGVfZXhpdChleGl0X250ZnNfZnMpCmRpZmYgLS1naXQgYS9mcy9udGZzL3N5c2N0bC5jIGIvZnMvbnRmcy9zeXNjdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTA2N2U0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy9zeXNjdGwuYwpAQCAtMCwwICsxLDg1IEBACisvKgorICogc3lzY3RsLmMgLSBDb2RlIGZvciBzeXNjdGwgaGFuZGxpbmcgaW4gTlRGUyBMaW51eCBrZXJuZWwgZHJpdmVyLiBQYXJ0IG9mCisgKgkgICAgICB0aGUgTGludXgtTlRGUyBwcm9qZWN0LiBBZGFwdGVkIGZyb20gdGhlIG9sZCBOVEZTIGRyaXZlciwKKyAqCSAgICAgIENvcHlyaWdodCAoQykgMTk5NyBNYXJ0aW4gdm9uIEz2d2lzLCBS6WdpcyBEdWNoZXNuZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZmRlZiBERUJVRworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpZmRlZiBDT05GSUdfU1lTQ1RMCisKKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisKKyNpbmNsdWRlICJzeXNjdGwuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorCisjZGVmaW5lIEZTX05URlMJMQorCisvKiBEZWZpbml0aW9uIG9mIHRoZSBudGZzIHN5c2N0bC4gKi8KK3N0YXRpYyBjdGxfdGFibGUgbnRmc19zeXNjdGxzW10gPSB7CisJeyBGU19OVEZTLCAibnRmcy1kZWJ1ZyIsCQkvKiBCaW5hcnkgYW5kIHRleHQgSURzLiAqLworCSAgJmRlYnVnX21zZ3Msc2l6ZW9mKGRlYnVnX21zZ3MpLAkvKiBEYXRhIHBvaW50ZXIgYW5kIHNpemUuICovCisJICAwNjQ0LAlOVUxMLCAmcHJvY19kb2ludHZlYyB9LAkJLyogTW9kZSwgY2hpbGQsIHByb2MgaGFuZGxlci4gKi8KKwl7IDAgfQorfTsKKworLyogRGVmaW5lIHRoZSBwYXJlbnQgZGlyZWN0b3J5IC9wcm9jL3N5cy9mcy4gKi8KK3N0YXRpYyBjdGxfdGFibGUgc3lzY3Rsc19yb290W10gPSB7CisJeyBDVExfRlMsICJmcyIsIE5VTEwsIDAsIDA1NTUsIG50ZnNfc3lzY3RscyB9LAorCXsgMCB9Cit9OworCisvKiBTdG9yYWdlIGZvciB0aGUgc3lzY3RscyBoZWFkZXIuICovCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKnN5c2N0bHNfcm9vdF90YWJsZSA9IE5VTEw7CisKKy8qKgorICogbnRmc19zeXNjdGwgLSBhZGQgb3IgcmVtb3ZlIHRoZSBkZWJ1ZyBzeXNjdGwKKyAqIEBhZGQ6CWFkZCAoMSkgb3IgcmVtb3ZlICgwKSB0aGUgc3lzY3RsCisgKgorICogQWRkIG9yIHJlbW92ZSB0aGUgZGVidWcgc3lzY3RsLiBSZXR1cm4gMCBvbiBzdWNjZXNzIG9yIC1lcnJubyBvbiBlcnJvci4KKyAqLworaW50IG50ZnNfc3lzY3RsKGludCBhZGQpCit7CisJaWYgKGFkZCkgeworCQlCVUdfT04oc3lzY3Rsc19yb290X3RhYmxlKTsKKwkJc3lzY3Rsc19yb290X3RhYmxlID0gcmVnaXN0ZXJfc3lzY3RsX3RhYmxlKHN5c2N0bHNfcm9vdCwgMCk7CisJCWlmICghc3lzY3Rsc19yb290X3RhYmxlKQorCQkJcmV0dXJuIC1FTk9NRU07CisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwkJLyoKKwkJICogSWYgdGhlIHByb2MgZmlsZSBzeXN0ZW0gaXMgaW4gdXNlIGFuZCB3ZSBhcmUgYSBtb2R1bGUsIG5lZWQKKwkJICogdG8gc2V0IHRoZSBvd25lciBvZiBvdXIgcHJvYyBlbnRyeSB0byBvdXIgbW9kdWxlLiBJbiB0aGUKKwkJICogbm9uLW1vZHVsYXIgY2FzZSwgVEhJU19NT0RVTEUgaXMgTlVMTCwgc28gdGhpcyBpcyBvay4KKwkJICovCisJCW50ZnNfc3lzY3Rsc1swXS5kZS0+b3duZXIgPSBUSElTX01PRFVMRTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCUJVR19PTighc3lzY3Rsc19yb290X3RhYmxlKTsKKwkJdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUoc3lzY3Rsc19yb290X3RhYmxlKTsKKwkJc3lzY3Rsc19yb290X3RhYmxlID0gTlVMTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfU1lTQ1RMICovCisjZW5kaWYgLyogREVCVUcgKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvc3lzY3RsLmggYi9mcy9udGZzL3N5c2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNzQ5Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL3N5c2N0bC5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBzeXNjdGwuaCAtIERlZmluZXMgZm9yIHN5c2N0bCBoYW5kbGluZyBpbiBOVEZTIExpbnV4IGtlcm5lbCBkcml2ZXIuIFBhcnQgb2YKKyAqCSAgICAgIHRoZSBMaW51eC1OVEZTIHByb2plY3QuIEFkYXB0ZWQgZnJvbSB0aGUgb2xkIE5URlMgZHJpdmVyLAorICoJICAgICAgQ29weXJpZ2h0IChDKSAxOTk3IE1hcnRpbiB2b24gTPZ3aXMsIFLpZ2lzIER1Y2hlc25lCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtL2luY2x1ZGUgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUKKyAqIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIExpbnV4LU5URlMKKyAqIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbixJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfTElOVVhfTlRGU19TWVNDVExfSAorI2RlZmluZSBfTElOVVhfTlRGU19TWVNDVExfSAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpZiAoREVCVUcgJiYgQ09ORklHX1NZU0NUTCkKKworZXh0ZXJuIGludCBudGZzX3N5c2N0bChpbnQgYWRkKTsKKworI2Vsc2UKKworLyogSnVzdCByZXR1cm4gc3VjY2Vzcy4gKi8KK3N0YXRpYyBpbmxpbmUgaW50IG50ZnNfc3lzY3RsKGludCBhZGQpCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBERUJVRyAmJiBDT05GSUdfU1lTQ1RMICovCisjZW5kaWYgLyogX0xJTlVYX05URlNfU1lTQ1RMX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL250ZnMvdGltZS5oIGIvZnMvbnRmcy90aW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA5YTUxZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvdGltZS5oCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogdGltZS5oIC0gTlRGUyB0aW1lIGNvbnZlcnNpb24gZnVuY3Rpb25zLiAgUGFydCBvZiB0aGUgTGludXgtTlRGUyBwcm9qZWN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IEFudG9uIEFsdGFwYXJtYWtvdgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlCisgKiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTCisgKiBkaXN0cmlidXRpb24gaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX0xJTlVYX05URlNfVElNRV9ICisjZGVmaW5lIF9MSU5VWF9OVEZTX1RJTUVfSAorCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgkJLyogRm9yIGN1cnJlbnRfa2VybmVsX3RpbWUoKS4gKi8KKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4JCS8qIEZvciBkb19kaXYoKS4gKi8KKworI2luY2x1ZGUgImVuZGlhbi5oIgorCisjZGVmaW5lIE5URlNfVElNRV9PRkZTRVQgKChzNjQpKDM2OSAqIDM2NSArIDg5KSAqIDI0ICogMzYwMCAqIDEwMDAwMDAwKQorCisvKioKKyAqIHV0YzJudGZzIC0gY29udmVydCBMaW51eCBVVEMgdGltZSB0byBOVEZTIHRpbWUKKyAqIEB0czoJCUxpbnV4IFVUQyB0aW1lIHRvIGNvbnZlcnQgdG8gTlRGUyB0aW1lCisgKgorICogQ29udmVydCB0aGUgTGludXggVVRDIHRpbWUgQHRzIHRvIGl0cyBjb3JyZXNwb25kaW5nIE5URlMgdGltZSBhbmQgcmV0dXJuCisgKiB0aGF0IGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0LgorICoKKyAqIExpbnV4IHN0b3JlcyB0aW1lIGluIGEgc3RydWN0IHRpbWVzcGVjIGNvbnNpc3Rpbmcgb2YgYSB0aW1lX3QgKGxvbmcgYXQKKyAqIHByZXNlbnQpIHR2X3NlYyBhbmQgYSBsb25nIHR2X25zZWMgd2hlcmUgdHZfc2VjIGlzIHRoZSBudW1iZXIgb2YgMS1zZWNvbmQKKyAqIGludGVydmFscyBzaW5jZSAxc3QgSmFudWFyeSAxOTcwLCAwMDowMDowMCBVVEMgYW5kIHR2X25zZWMgaXMgdGhlIG51bWJlciBvZgorICogMS1uYW5vLXNlY29uZCBpbnRlcnZhbHMgc2luY2UgdGhlIHZhbHVlIG9mIHR2X3NlYy4KKyAqCisgKiBOVEZTIHVzZXMgTWljcm9zb2Z0J3Mgc3RhbmRhcmQgdGltZSBmb3JtYXQgd2hpY2ggaXMgc3RvcmVkIGluIGEgczY0IGFuZCBpcworICogbWVhc3VyZWQgYXMgdGhlIG51bWJlciBvZiAxMDAtbmFuby1zZWNvbmQgaW50ZXJ2YWxzIHNpbmNlIDFzdCBKYW51YXJ5IDE2MDEsCisgKiAwMDowMDowMCBVVEMuCisgKi8KK3N0YXRpYyBpbmxpbmUgc2xlNjQgdXRjMm50ZnMoY29uc3Qgc3RydWN0IHRpbWVzcGVjIHRzKQoreworCS8qCisJICogQ29udmVydCB0aGUgc2Vjb25kcyB0byAxMDBucyBpbnRlcnZhbHMsIGFkZCB0aGUgbmFuby1zZWNvbmRzCisJICogY29udmVydGVkIHRvIDEwMG5zIGludGVydmFscywgYW5kIHRoZW4gYWRkIHRoZSBOVEZTIHRpbWUgb2Zmc2V0LgorCSAqLworCXJldHVybiBjcHVfdG9fc2xlNjQoKHM2NCl0cy50dl9zZWMgKiAxMDAwMDAwMCArIHRzLnR2X25zZWMgLyAxMDAgKworCQkJTlRGU19USU1FX09GRlNFVCk7Cit9CisKKy8qKgorICogZ2V0X2N1cnJlbnRfbnRmc190aW1lIC0gZ2V0IHRoZSBjdXJyZW50IHRpbWUgaW4gbGl0dGxlIGVuZGlhbiBOVEZTIGZvcm1hdAorICoKKyAqIEdldCB0aGUgY3VycmVudCB0aW1lIGZyb20gdGhlIExpbnV4IGtlcm5lbCwgY29udmVydCBpdCB0byBpdHMgY29ycmVzcG9uZGluZworICogTlRGUyB0aW1lIGFuZCByZXR1cm4gdGhhdCBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdC4KKyAqLworc3RhdGljIGlubGluZSBzbGU2NCBnZXRfY3VycmVudF9udGZzX3RpbWUodm9pZCkKK3sKKwlyZXR1cm4gdXRjMm50ZnMoY3VycmVudF9rZXJuZWxfdGltZSgpKTsKK30KKworLyoqCisgKiBudGZzMnV0YyAtIGNvbnZlcnQgTlRGUyB0aW1lIHRvIExpbnV4IHRpbWUKKyAqIEB0aW1lOglOVEZTIHRpbWUgKGxpdHRsZSBlbmRpYW4pIHRvIGNvbnZlcnQgdG8gTGludXggVVRDCisgKgorICogQ29udmVydCB0aGUgbGl0dGxlIGVuZGlhbiBOVEZTIHRpbWUgQHRpbWUgdG8gaXRzIGNvcnJlc3BvbmRpbmcgTGludXggVVRDCisgKiB0aW1lIGFuZCByZXR1cm4gdGhhdCBpbiBjcHUgZm9ybWF0LgorICoKKyAqIExpbnV4IHN0b3JlcyB0aW1lIGluIGEgc3RydWN0IHRpbWVzcGVjIGNvbnNpc3Rpbmcgb2YgYSB0aW1lX3QgKGxvbmcgYXQKKyAqIHByZXNlbnQpIHR2X3NlYyBhbmQgYSBsb25nIHR2X25zZWMgd2hlcmUgdHZfc2VjIGlzIHRoZSBudW1iZXIgb2YgMS1zZWNvbmQKKyAqIGludGVydmFscyBzaW5jZSAxc3QgSmFudWFyeSAxOTcwLCAwMDowMDowMCBVVEMgYW5kIHR2X25zZWMgaXMgdGhlIG51bWJlciBvZgorICogMS1uYW5vLXNlY29uZCBpbnRlcnZhbHMgc2luY2UgdGhlIHZhbHVlIG9mIHR2X3NlYy4KKyAqCisgKiBOVEZTIHVzZXMgTWljcm9zb2Z0J3Mgc3RhbmRhcmQgdGltZSBmb3JtYXQgd2hpY2ggaXMgc3RvcmVkIGluIGEgczY0IGFuZCBpcworICogbWVhc3VyZWQgYXMgdGhlIG51bWJlciBvZiAxMDAgbmFuby1zZWNvbmQgaW50ZXJ2YWxzIHNpbmNlIDFzdCBKYW51YXJ5IDE2MDEsCisgKiAwMDowMDowMCBVVEMuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHRpbWVzcGVjIG50ZnMydXRjKGNvbnN0IHNsZTY0IHRpbWUpCit7CisJc3RydWN0IHRpbWVzcGVjIHRzOworCisJLyogU3VidHJhY3QgdGhlIE5URlMgdGltZSBvZmZzZXQuICovCisJczY0IHQgPSBzbGU2NF90b19jcHUodGltZSkgLSBOVEZTX1RJTUVfT0ZGU0VUOworCS8qCisJICogQ29udmVydCB0aGUgdGltZSB0byAxLXNlY29uZCBpbnRlcnZhbHMgYW5kIHRoZSByZW1haW5kZXIgdG8KKwkgKiAxLW5hbm8tc2Vjb25kIGludGVydmFscy4KKwkgKi8KKwl0cy50dl9uc2VjID0gZG9fZGl2KHQsIDEwMDAwMDAwKSAqIDEwMDsKKwl0cy50dl9zZWMgPSB0OworCXJldHVybiB0czsKK30KKworI2VuZGlmIC8qIF9MSU5VWF9OVEZTX1RJTUVfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy90eXBlcy5oIGIvZnMvbnRmcy90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YTU1YWEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL3R5cGVzLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIHR5cGVzLmggLSBEZWZpbmVzIGZvciBOVEZTIExpbnV4IGtlcm5lbCBkcml2ZXIgc3BlY2lmaWMgdHlwZXMuCisgKgkgICAgIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZuZGVmIF9MSU5VWF9OVEZTX1RZUEVTX0gKKyNkZWZpbmUgX0xJTlVYX05URlNfVFlQRVNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKwordHlwZWRlZiBfX2xlMTYgbGUxNjsKK3R5cGVkZWYgX19sZTMyIGxlMzI7Cit0eXBlZGVmIF9fbGU2NCBsZTY0OwordHlwZWRlZiBfX3UxNiBfX2JpdHdpc2Ugc2xlMTY7Cit0eXBlZGVmIF9fdTMyIF9fYml0d2lzZSBzbGUzMjsKK3R5cGVkZWYgX191NjQgX19iaXR3aXNlIHNsZTY0OworCisvKiAyLWJ5dGUgVW5pY29kZSBjaGFyYWN0ZXIgdHlwZS4gKi8KK3R5cGVkZWYgbGUxNiBudGZzY2hhcjsKKyNkZWZpbmUgVUNIQVJfVF9TSVpFX0JJVFMgMQorCisvKgorICogQ2x1c3RlcnMgYXJlIHNpZ25lZCA2NC1iaXQgdmFsdWVzIG9uIE5URlMgdm9sdW1lcy4gV2UgZGVmaW5lIHR3byB0eXBlcywgTENOCisgKiBhbmQgVkNOLCB0byBhbGxvdyBmb3IgdHlwZSBjaGVja2luZyBhbmQgYmV0dGVyIGNvZGUgcmVhZGFiaWxpdHkuCisgKi8KK3R5cGVkZWYgczY0IFZDTjsKK3R5cGVkZWYgc2xlNjQgbGVWQ047Cit0eXBlZGVmIHM2NCBMQ047Cit0eXBlZGVmIHNsZTY0IGxlTENOOworCisvKgorICogVGhlIE5URlMgam91cm5hbCAkTG9nRmlsZSB1c2VzIGxvZyBzZXF1ZW5jZSBudW1iZXJzIHdoaWNoIGFyZSBzaWduZWQgNjQtYml0CisgKiB2YWx1ZXMuICBXZSBkZWZpbmUgb3VyIG93biB0eXBlIExTTiwgdG8gYWxsb3cgZm9yIHR5cGUgY2hlY2tpbmcgYW5kIGJldHRlcgorICogY29kZSByZWFkYWJpbGl0eS4KKyAqLwordHlwZWRlZiBzNjQgTFNOOwordHlwZWRlZiBzbGU2NCBsZUxTTjsKKwordHlwZWRlZiBlbnVtIHsKKwlGQUxTRSA9IDAsCisJVFJVRSA9IDEKK30gQk9PTDsKKwordHlwZWRlZiBlbnVtIHsKKwlDQVNFX1NFTlNJVElWRSA9IDAsCisJSUdOT1JFX0NBU0UgPSAxLAorfSBJR05PUkVfQ0FTRV9CT09MOworCisjZW5kaWYgLyogX0xJTlVYX05URlNfVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvbnRmcy91bmlzdHIuYyBiL2ZzL250ZnMvdW5pc3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYwYjBlYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL250ZnMvdW5pc3RyLmMKQEAgLTAsMCArMSwzODQgQEAKKy8qCisgKiB1bmlzdHIuYyAtIE5URlMgVW5pY29kZSBzdHJpbmcgaGFuZGxpbmcuIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgIm50ZnMuaCIKKworLyoKKyAqIElNUE9SVEFOVAorICogPT09PT09PT09CisgKgorICogQWxsIHRoZXNlIHJvdXRpbmVzIGFzc3VtZSB0aGF0IHRoZSBVbmljb2RlIGNoYXJhY3RlcnMgYXJlIGluIGxpdHRsZSBlbmRpYW4KKyAqIGVuY29kaW5nIGluc2lkZSB0aGUgc3RyaW5ncyEhIQorICovCisKKy8qCisgKiBUaGlzIGlzIHVzZWQgYnkgdGhlIG5hbWUgY29sbGF0aW9uIGZ1bmN0aW9ucyB0byBxdWlja2x5IGRldGVybWluZSB3aGF0CisgKiBjaGFyYWN0ZXJzIGFyZSAoaW4pdmFsaWQuCisgKi8KK3N0YXRpYyBjb25zdCB1OCBsZWdhbF9hbnNpX2NoYXJfYXJyYXlbMHg0MF0gPSB7CisJMHgwMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCisJMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwgMHgxMCwKKwkweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLCAweDEwLAorCisJMHgxNywgMHgwNywgMHgxOCwgMHgxNywgMHgxNywgMHgxNywgMHgxNywgMHgxNywKKwkweDE3LCAweDE3LCAweDE4LCAweDE2LCAweDE2LCAweDE3LCAweDA3LCAweDAwLAorCisJMHgxNywgMHgxNywgMHgxNywgMHgxNywgMHgxNywgMHgxNywgMHgxNywgMHgxNywKKwkweDE3LCAweDE3LCAweDA0LCAweDE2LCAweDE4LCAweDE2LCAweDE4LCAweDE4LAorfTsKKworLyoqCisgKiBudGZzX2FyZV9uYW1lc19lcXVhbCAtIGNvbXBhcmUgdHdvIFVuaWNvZGUgbmFtZXMgZm9yIGVxdWFsaXR5CisgKiBAczE6CQkJbmFtZSB0byBjb21wYXJlIHRvIEBzMgorICogQHMxX2xlbjoJCWxlbmd0aCBpbiBVbmljb2RlIGNoYXJhY3RlcnMgb2YgQHMxCisgKiBAczI6CQkJbmFtZSB0byBjb21wYXJlIHRvIEBzMQorICogQHMyX2xlbjoJCWxlbmd0aCBpbiBVbmljb2RlIGNoYXJhY3RlcnMgb2YgQHMyCisgKiBAaWM6CQkJaWdub3JlIGNhc2UgYm9vbAorICogQHVwY2FzZToJCXVwY2FzZSB0YWJsZSAob25seSBpZiBAaWMgPT0gSUdOT1JFX0NBU0UpCisgKiBAdXBjYXNlX3NpemU6CWxlbmd0aCBpbiBVbmljb2RlIGNoYXJhY3RlcnMgb2YgQHVwY2FzZSAoaWYgcHJlc2VudCkKKyAqCisgKiBDb21wYXJlIHRoZSBuYW1lcyBAczEgYW5kIEBzMiBhbmQgcmV0dXJuIFRSVUUgKDEpIGlmIHRoZSBuYW1lcyBhcmUKKyAqIGlkZW50aWNhbCwgb3IgRkFMU0UgKDApIGlmIHRoZXkgYXJlIG5vdCBpZGVudGljYWwuIElmIEBpYyBpcyBJR05PUkVfQ0FTRSwKKyAqIHRoZSBAdXBjYXNlIHRhYmxlIGlzIHVzZWQgdG8gcGVyZm9ybWEgYSBjYXNlIGluc2Vuc2l0aXZlIGNvbXBhcmlzb24uCisgKi8KK0JPT0wgbnRmc19hcmVfbmFtZXNfZXF1YWwoY29uc3QgbnRmc2NoYXIgKnMxLCBzaXplX3QgczFfbGVuLAorCQljb25zdCBudGZzY2hhciAqczIsIHNpemVfdCBzMl9sZW4sIGNvbnN0IElHTk9SRV9DQVNFX0JPT0wgaWMsCisJCWNvbnN0IG50ZnNjaGFyICp1cGNhc2UsIGNvbnN0IHUzMiB1cGNhc2Vfc2l6ZSkKK3sKKwlpZiAoczFfbGVuICE9IHMyX2xlbikKKwkJcmV0dXJuIEZBTFNFOworCWlmIChpYyA9PSBDQVNFX1NFTlNJVElWRSkKKwkJcmV0dXJuICFudGZzX3Vjc25jbXAoczEsIHMyLCBzMV9sZW4pOworCXJldHVybiAhbnRmc191Y3NuY2FzZWNtcChzMSwgczIsIHMxX2xlbiwgdXBjYXNlLCB1cGNhc2Vfc2l6ZSk7Cit9CisKKy8qKgorICogbnRmc19jb2xsYXRlX25hbWVzIC0gY29sbGF0ZSB0d28gVW5pY29kZSBuYW1lcworICogQG5hbWUxOglmaXJzdCBVbmljb2RlIG5hbWUgdG8gY29tcGFyZQorICogQG5hbWUyOglzZWNvbmQgVW5pY29kZSBuYW1lIHRvIGNvbXBhcmUKKyAqIEBlcnJfdmFsOglpZiBAbmFtZTEgY29udGFpbnMgYW4gaW52YWxpZCBjaGFyYWN0ZXIgcmV0dXJuIHRoaXMgdmFsdWUKKyAqIEBpYzoJCWVpdGhlciBDQVNFX1NFTlNJVElWRSBvciBJR05PUkVfQ0FTRQorICogQHVwY2FzZToJdXBjYXNlIHRhYmxlIChpZ25vcmVkIGlmIEBpYyBpcyBDQVNFX1NFTlNJVElWRSkKKyAqIEB1cGNhc2VfbGVuOgl1cGNhc2UgdGFibGUgc2l6ZSAoaWdub3JlZCBpZiBAaWMgaXMgQ0FTRV9TRU5TSVRJVkUpCisgKgorICogbnRmc19jb2xsYXRlX25hbWVzIGNvbGxhdGVzIHR3byBVbmljb2RlIG5hbWVzIGFuZCByZXR1cm5zOgorICoKKyAqICAtMSBpZiB0aGUgZmlyc3QgbmFtZSBjb2xsYXRlcyBiZWZvcmUgdGhlIHNlY29uZCBvbmUsCisgKiAgIDAgaWYgdGhlIG5hbWVzIG1hdGNoLAorICogICAxIGlmIHRoZSBzZWNvbmQgbmFtZSBjb2xsYXRlcyBiZWZvcmUgdGhlIGZpcnN0IG9uZSwgb3IKKyAqIEBlcnJfdmFsIGlmIGFuIGludmFsaWQgY2hhcmFjdGVyIGlzIGZvdW5kIGluIEBuYW1lMSBkdXJpbmcgdGhlIGNvbXBhcmlzb24uCisgKgorICogVGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzIGFyZSBjb25zaWRlcmVkIGludmFsaWQ6ICciJywgJyonLCAnPCcsICc+JyBhbmQgJz8nLgorICovCitpbnQgbnRmc19jb2xsYXRlX25hbWVzKGNvbnN0IG50ZnNjaGFyICpuYW1lMSwgY29uc3QgdTMyIG5hbWUxX2xlbiwKKwkJY29uc3QgbnRmc2NoYXIgKm5hbWUyLCBjb25zdCB1MzIgbmFtZTJfbGVuLAorCQljb25zdCBpbnQgZXJyX3ZhbCwgY29uc3QgSUdOT1JFX0NBU0VfQk9PTCBpYywKKwkJY29uc3QgbnRmc2NoYXIgKnVwY2FzZSwgY29uc3QgdTMyIHVwY2FzZV9sZW4pCit7CisJdTMyIGNudCwgbWluX2xlbjsKKwl1MTYgYzEsIGMyOworCisJbWluX2xlbiA9IG5hbWUxX2xlbjsKKwlpZiAobmFtZTFfbGVuID4gbmFtZTJfbGVuKQorCQltaW5fbGVuID0gbmFtZTJfbGVuOworCWZvciAoY250ID0gMDsgY250IDwgbWluX2xlbjsgKytjbnQpIHsKKwkJYzEgPSBsZTE2X3RvX2NwdSgqbmFtZTErKyk7CisJCWMyID0gbGUxNl90b19jcHUoKm5hbWUyKyspOworCQlpZiAoaWMpIHsKKwkJCWlmIChjMSA8IHVwY2FzZV9sZW4pCisJCQkJYzEgPSBsZTE2X3RvX2NwdSh1cGNhc2VbYzFdKTsKKwkJCWlmIChjMiA8IHVwY2FzZV9sZW4pCisJCQkJYzIgPSBsZTE2X3RvX2NwdSh1cGNhc2VbYzJdKTsKKwkJfQorCQlpZiAoYzEgPCA2NCAmJiBsZWdhbF9hbnNpX2NoYXJfYXJyYXlbYzFdICYgOCkKKwkJCXJldHVybiBlcnJfdmFsOworCQlpZiAoYzEgPCBjMikKKwkJCXJldHVybiAtMTsKKwkJaWYgKGMxID4gYzIpCisJCQlyZXR1cm4gMTsKKwl9CisJaWYgKG5hbWUxX2xlbiA8IG5hbWUyX2xlbikKKwkJcmV0dXJuIC0xOworCWlmIChuYW1lMV9sZW4gPT0gbmFtZTJfbGVuKQorCQlyZXR1cm4gMDsKKwkvKiBuYW1lMV9sZW4gPiBuYW1lMl9sZW4gKi8KKwljMSA9IGxlMTZfdG9fY3B1KCpuYW1lMSk7CisJaWYgKGMxIDwgNjQgJiYgbGVnYWxfYW5zaV9jaGFyX2FycmF5W2MxXSAmIDgpCisJCXJldHVybiBlcnJfdmFsOworCXJldHVybiAxOworfQorCisvKioKKyAqIG50ZnNfdWNzbmNtcCAtIGNvbXBhcmUgdHdvIGxpdHRsZSBlbmRpYW4gVW5pY29kZSBzdHJpbmdzCisgKiBAczE6CQlmaXJzdCBzdHJpbmcKKyAqIEBzMjoJCXNlY29uZCBzdHJpbmcKKyAqIEBuOgkJbWF4aW11bSB1bmljb2RlIGNoYXJhY3RlcnMgdG8gY29tcGFyZQorICoKKyAqIENvbXBhcmUgdGhlIGZpcnN0IEBuIGNoYXJhY3RlcnMgb2YgdGhlIFVuaWNvZGUgc3RyaW5ncyBAczEgYW5kIEBzMiwKKyAqIFRoZSBzdHJpbmdzIGluIGxpdHRsZSBlbmRpYW4gZm9ybWF0IGFuZCBhcHByb3ByaWF0ZSBsZTE2X3RvX2NwdSgpCisgKiBjb252ZXJzaW9uIGlzIHBlcmZvcm1lZCBvbiBub24tbGl0dGxlIGVuZGlhbiBtYWNoaW5lcy4KKyAqCisgKiBUaGUgZnVuY3Rpb24gcmV0dXJucyBhbiBpbnRlZ2VyIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB6ZXJvCisgKiBpZiBAczEgKG9yIHRoZSBmaXJzdCBAbiBVbmljb2RlIGNoYXJhY3RlcnMgdGhlcmVvZikgaXMgZm91bmQsIHJlc3BlY3RpdmVseSwKKyAqIHRvIGJlIGxlc3MgdGhhbiwgdG8gbWF0Y2gsIG9yIGJlIGdyZWF0ZXIgdGhhbiBAczIuCisgKi8KK2ludCBudGZzX3Vjc25jbXAoY29uc3QgbnRmc2NoYXIgKnMxLCBjb25zdCBudGZzY2hhciAqczIsIHNpemVfdCBuKQoreworCXUxNiBjMSwgYzI7CisJc2l6ZV90IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CisJCWMxID0gbGUxNl90b19jcHUoczFbaV0pOworCQljMiA9IGxlMTZfdG9fY3B1KHMyW2ldKTsKKwkJaWYgKGMxIDwgYzIpCisJCQlyZXR1cm4gLTE7CisJCWlmIChjMSA+IGMyKQorCQkJcmV0dXJuIDE7CisJCWlmICghYzEpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbnRmc191Y3NuY2FzZWNtcCAtIGNvbXBhcmUgdHdvIGxpdHRsZSBlbmRpYW4gVW5pY29kZSBzdHJpbmdzLCBpZ25vcmluZyBjYXNlCisgKiBAczE6CQkJZmlyc3Qgc3RyaW5nCisgKiBAczI6CQkJc2Vjb25kIHN0cmluZworICogQG46CQkJbWF4aW11bSB1bmljb2RlIGNoYXJhY3RlcnMgdG8gY29tcGFyZQorICogQHVwY2FzZToJCXVwY2FzZSB0YWJsZQorICogQHVwY2FzZV9zaXplOgl1cGNhc2UgdGFibGUgc2l6ZSBpbiBVbmljb2RlIGNoYXJhY3RlcnMKKyAqCisgKiBDb21wYXJlIHRoZSBmaXJzdCBAbiBjaGFyYWN0ZXJzIG9mIHRoZSBVbmljb2RlIHN0cmluZ3MgQHMxIGFuZCBAczIsCisgKiBpZ25vcmluZyBjYXNlLiBUaGUgc3RyaW5ncyBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdCBhbmQgYXBwcm9wcmlhdGUKKyAqIGxlMTZfdG9fY3B1KCkgY29udmVyc2lvbiBpcyBwZXJmb3JtZWQgb24gbm9uLWxpdHRsZSBlbmRpYW4gbWFjaGluZXMuCisgKgorICogRWFjaCBjaGFyYWN0ZXIgaXMgdXBwZXJjYXNlZCB1c2luZyB0aGUgQHVwY2FzZSB0YWJsZSBiZWZvcmUgdGhlIGNvbXBhcmlzb24uCisgKgorICogVGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gaW50ZWdlciBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gemVybworICogaWYgQHMxIChvciB0aGUgZmlyc3QgQG4gVW5pY29kZSBjaGFyYWN0ZXJzIHRoZXJlb2YpIGlzIGZvdW5kLCByZXNwZWN0aXZlbHksCisgKiB0byBiZSBsZXNzIHRoYW4sIHRvIG1hdGNoLCBvciBiZSBncmVhdGVyIHRoYW4gQHMyLgorICovCitpbnQgbnRmc191Y3NuY2FzZWNtcChjb25zdCBudGZzY2hhciAqczEsIGNvbnN0IG50ZnNjaGFyICpzMiwgc2l6ZV90IG4sCisJCWNvbnN0IG50ZnNjaGFyICp1cGNhc2UsIGNvbnN0IHUzMiB1cGNhc2Vfc2l6ZSkKK3sKKwlzaXplX3QgaTsKKwl1MTYgYzEsIGMyOworCisJZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworCQlpZiAoKGMxID0gbGUxNl90b19jcHUoczFbaV0pKSA8IHVwY2FzZV9zaXplKQorCQkJYzEgPSBsZTE2X3RvX2NwdSh1cGNhc2VbYzFdKTsKKwkJaWYgKChjMiA9IGxlMTZfdG9fY3B1KHMyW2ldKSkgPCB1cGNhc2Vfc2l6ZSkKKwkJCWMyID0gbGUxNl90b19jcHUodXBjYXNlW2MyXSk7CisJCWlmIChjMSA8IGMyKQorCQkJcmV0dXJuIC0xOworCQlpZiAoYzEgPiBjMikKKwkJCXJldHVybiAxOworCQlpZiAoIWMxKQorCQkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCit2b2lkIG50ZnNfdXBjYXNlX25hbWUobnRmc2NoYXIgKm5hbWUsIHUzMiBuYW1lX2xlbiwgY29uc3QgbnRmc2NoYXIgKnVwY2FzZSwKKwkJY29uc3QgdTMyIHVwY2FzZV9sZW4pCit7CisJdTMyIGk7CisJdTE2IHU7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmFtZV9sZW47IGkrKykKKwkJaWYgKCh1ID0gbGUxNl90b19jcHUobmFtZVtpXSkpIDwgdXBjYXNlX2xlbikKKwkJCW5hbWVbaV0gPSB1cGNhc2VbdV07Cit9CisKK3ZvaWQgbnRmc19maWxlX3VwY2FzZV92YWx1ZShGSUxFX05BTUVfQVRUUiAqZmlsZV9uYW1lX2F0dHIsCisJCWNvbnN0IG50ZnNjaGFyICp1cGNhc2UsIGNvbnN0IHUzMiB1cGNhc2VfbGVuKQoreworCW50ZnNfdXBjYXNlX25hbWUoKG50ZnNjaGFyKikmZmlsZV9uYW1lX2F0dHItPmZpbGVfbmFtZSwKKwkJCWZpbGVfbmFtZV9hdHRyLT5maWxlX25hbWVfbGVuZ3RoLCB1cGNhc2UsIHVwY2FzZV9sZW4pOworfQorCitpbnQgbnRmc19maWxlX2NvbXBhcmVfdmFsdWVzKEZJTEVfTkFNRV9BVFRSICpmaWxlX25hbWVfYXR0cjEsCisJCUZJTEVfTkFNRV9BVFRSICpmaWxlX25hbWVfYXR0cjIsCisJCWNvbnN0IGludCBlcnJfdmFsLCBjb25zdCBJR05PUkVfQ0FTRV9CT09MIGljLAorCQljb25zdCBudGZzY2hhciAqdXBjYXNlLCBjb25zdCB1MzIgdXBjYXNlX2xlbikKK3sKKwlyZXR1cm4gbnRmc19jb2xsYXRlX25hbWVzKChudGZzY2hhciopJmZpbGVfbmFtZV9hdHRyMS0+ZmlsZV9uYW1lLAorCQkJZmlsZV9uYW1lX2F0dHIxLT5maWxlX25hbWVfbGVuZ3RoLAorCQkJKG50ZnNjaGFyKikmZmlsZV9uYW1lX2F0dHIyLT5maWxlX25hbWUsCisJCQlmaWxlX25hbWVfYXR0cjItPmZpbGVfbmFtZV9sZW5ndGgsCisJCQllcnJfdmFsLCBpYywgdXBjYXNlLCB1cGNhc2VfbGVuKTsKK30KKworLyoqCisgKiBudGZzX25sc3RvdWNzIC0gY29udmVydCBOTFMgc3RyaW5nIHRvIGxpdHRsZSBlbmRpYW4gVW5pY29kZSBzdHJpbmcKKyAqIEB2b2w6CW50ZnMgdm9sdW1lIHdoaWNoIHdlIGFyZSB3b3JraW5nIHdpdGgKKyAqIEBpbnM6CWlucHV0IE5MUyBzdHJpbmcgYnVmZmVyCisgKiBAaW5zX2xlbjoJbGVuZ3RoIG9mIGlucHV0IHN0cmluZyBpbiBieXRlcworICogQG91dHM6CW9uIHJldHVybiBjb250YWlucyB0aGUgYWxsb2NhdGVkIG91dHB1dCBVbmljb2RlIHN0cmluZyBidWZmZXIKKyAqCisgKiBDb252ZXJ0IHRoZSBpbnB1dCBzdHJpbmcgQGlucywgd2hpY2ggaXMgaW4gd2hhdGV2ZXIgZm9ybWF0IHRoZSBsb2FkZWQgTkxTCisgKiBtYXAgZGljdGF0ZXMsIGludG8gYSBsaXR0bGUgZW5kaWFuLCAyLWJ5dGUgVW5pY29kZSBzdHJpbmcuCisgKgorICogVGhpcyBmdW5jdGlvbiBhbGxvY2F0ZXMgdGhlIHN0cmluZyBhbmQgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IKKyAqIGNhbGxpbmcga21lbV9jYWNoZV9mcmVlKG50ZnNfbmFtZV9jYWNoZSwgQG91dHMpOyB3aGVuIGZpbmlzaGVkIHdpdGggaXQuCisgKgorICogT24gc3VjY2VzcyB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIFVuaWNvZGUgY2hhcmFjdGVycyB3cml0dGVuIHRvCisgKiB0aGUgb3V0cHV0IHN0cmluZyAqQG91dHMgKD49IDApLCBub3QgY291bnRpbmcgdGhlIHRlcm1pbmF0aW5nIFVuaWNvZGUgTlVMTAorICogY2hhcmFjdGVyLiAqQG91dHMgaXMgc2V0IHRvIHRoZSBhbGxvY2F0ZWQgb3V0cHV0IHN0cmluZyBidWZmZXIuCisgKgorICogT24gZXJyb3IsIGEgbmVnYXRpdmUgbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVycm9yIGNvZGUgaXMgcmV0dXJuZWQuIEluCisgKiB0aGF0IGNhc2UgdGhlIG91dHB1dCBzdHJpbmcgaXMgbm90IGFsbG9jYXRlZC4gQm90aCAqQG91dHMgYW5kICpAb3V0c19sZW4KKyAqIGFyZSB0aGVuIHVuZGVmaW5lZC4KKyAqCisgKiBUaGlzIG1pZ2h0IGxvb2sgYSBiaXQgb2RkIGR1ZSB0byBmYXN0IHBhdGggb3B0aW1pemF0aW9uLi4uCisgKi8KK2ludCBudGZzX25sc3RvdWNzKGNvbnN0IG50ZnNfdm9sdW1lICp2b2wsIGNvbnN0IGNoYXIgKmlucywKKwkJY29uc3QgaW50IGluc19sZW4sIG50ZnNjaGFyICoqb3V0cykKK3sKKwlzdHJ1Y3QgbmxzX3RhYmxlICpubHMgPSB2b2wtPm5sc19tYXA7CisJbnRmc2NoYXIgKnVjczsKKwl3Y2hhcl90IHdjOworCWludCBpLCBvLCB3Y19sZW47CisKKwkvKiBXZSBkb24ndCB0cnVzdCBvdXRzaWRlIHNvdXJjZXMuICovCisJaWYgKGlucykgeworCQl1Y3MgPSAobnRmc2NoYXIqKWttZW1fY2FjaGVfYWxsb2MobnRmc19uYW1lX2NhY2hlLCBTTEFCX05PRlMpOworCQlpZiAodWNzKSB7CisJCQlmb3IgKGkgPSBvID0gMDsgaSA8IGluc19sZW47IGkgKz0gd2NfbGVuKSB7CisJCQkJd2NfbGVuID0gbmxzLT5jaGFyMnVuaShpbnMgKyBpLCBpbnNfbGVuIC0gaSwKKwkJCQkJCSZ3Yyk7CisJCQkJaWYgKHdjX2xlbiA+PSAwKSB7CisJCQkJCWlmICh3YykgeworCQkJCQkJdWNzW28rK10gPSBjcHVfdG9fbGUxNih3Yyk7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfSAvKiBlbHNlICghd2MpICovCisJCQkJCWJyZWFrOworCQkJCX0gLyogZWxzZSAod2NfbGVuIDwgMCkgKi8KKwkJCQlnb3RvIGNvbnZlcnNpb25fZXJyOworCQkJfQorCQkJdWNzW29dID0gMDsKKwkJCSpvdXRzID0gdWNzOworCQkJcmV0dXJuIG87CisJCX0gLyogZWxzZSAoIXVjcykgKi8KKwkJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGFsbG9jYXRlIG5hbWUgZnJvbSAiCisJCQkJIm50ZnNfbmFtZV9jYWNoZSEiKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfSAvKiBlbHNlICghaW5zKSAqLworCW50ZnNfZXJyb3IoTlVMTCwgIlJlY2VpdmVkIE5VTEwgcG9pbnRlci4iKTsKKwlyZXR1cm4gLUVJTlZBTDsKK2NvbnZlcnNpb25fZXJyOgorCW50ZnNfZXJyb3Iodm9sLT5zYiwgIk5hbWUgdXNpbmcgY2hhcmFjdGVyIHNldCAlcyBjb250YWlucyBjaGFyYWN0ZXJzICIKKwkJCSJ0aGF0IGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gVW5pY29kZS4iLCBubHMtPmNoYXJzZXQpOworCWttZW1fY2FjaGVfZnJlZShudGZzX25hbWVfY2FjaGUsIHVjcyk7CisJcmV0dXJuIC1FSUxTRVE7Cit9CisKKy8qKgorICogbnRmc191Y3N0b25scyAtIGNvbnZlcnQgbGl0dGxlIGVuZGlhbiBVbmljb2RlIHN0cmluZyB0byBOTFMgc3RyaW5nCisgKiBAdm9sOgludGZzIHZvbHVtZSB3aGljaCB3ZSBhcmUgd29ya2luZyB3aXRoCisgKiBAaW5zOglpbnB1dCBVbmljb2RlIHN0cmluZyBidWZmZXIKKyAqIEBpbnNfbGVuOglsZW5ndGggb2YgaW5wdXQgc3RyaW5nIGluIFVuaWNvZGUgY2hhcmFjdGVycworICogQG91dHM6CW9uIHJldHVybiBjb250YWlucyB0aGUgKGFsbG9jYXRlZCkgb3V0cHV0IE5MUyBzdHJpbmcgYnVmZmVyCisgKiBAb3V0c19sZW46CWxlbmd0aCBvZiBvdXRwdXQgc3RyaW5nIGJ1ZmZlciBpbiBieXRlcworICoKKyAqIENvbnZlcnQgdGhlIGlucHV0IGxpdHRsZSBlbmRpYW4sIDItYnl0ZSBVbmljb2RlIHN0cmluZyBAaW5zLCBvZiBsZW5ndGgKKyAqIEBpbnNfbGVuIGludG8gdGhlIHN0cmluZyBmb3JtYXQgZGljdGF0ZWQgYnkgdGhlIGxvYWRlZCBOTFMuCisgKgorICogSWYgKkBvdXRzIGlzIE5VTEwsIHRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIHRoZSBzdHJpbmcgYW5kIHRoZSBjYWxsZXIgaXMKKyAqIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIGtmcmVlKCpAb3V0cyk7IHdoZW4gZmluaXNoZWQgd2l0aCBpdC4gSW4gdGhpcyBjYXNlCisgKiBAb3V0c19sZW4gaXMgaWdub3JlZCBhbmQgY2FuIGJlIDAuCisgKgorICogT24gc3VjY2VzcyB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gdGhlIG91dHB1dAorICogc3RyaW5nICpAb3V0cyAoPj0gMCksIG5vdCBjb3VudGluZyB0aGUgdGVybWluYXRpbmcgTlVMTCBieXRlLiBJZiB0aGUgb3V0cHV0CisgKiBzdHJpbmcgYnVmZmVyIHdhcyBhbGxvY2F0ZWQsICpAb3V0cyBpcyBzZXQgdG8gaXQuCisgKgorICogT24gZXJyb3IsIGEgbmVnYXRpdmUgbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVycm9yIGNvZGUgaXMgcmV0dXJuZWQuIEluCisgKiB0aGF0IGNhc2UgdGhlIG91dHB1dCBzdHJpbmcgaXMgbm90IGFsbG9jYXRlZC4gVGhlIGNvbnRlbnRzIG9mICpAb3V0cyBhcmUKKyAqIHRoZW4gdW5kZWZpbmVkLgorICoKKyAqIFRoaXMgbWlnaHQgbG9vayBhIGJpdCBvZGQgZHVlIHRvIGZhc3QgcGF0aCBvcHRpbWl6YXRpb24uLi4KKyAqLworaW50IG50ZnNfdWNzdG9ubHMoY29uc3QgbnRmc192b2x1bWUgKnZvbCwgY29uc3QgbnRmc2NoYXIgKmlucywKKwkJY29uc3QgaW50IGluc19sZW4sIHVuc2lnbmVkIGNoYXIgKipvdXRzLCBpbnQgb3V0c19sZW4pCit7CisJc3RydWN0IG5sc190YWJsZSAqbmxzID0gdm9sLT5ubHNfbWFwOworCXVuc2lnbmVkIGNoYXIgKm5zOworCWludCBpLCBvLCBuc19sZW4sIHdjOworCisJLyogV2UgZG9uJ3QgdHJ1c3Qgb3V0c2lkZSBzb3VyY2VzLiAqLworCWlmIChpbnMpIHsKKwkJbnMgPSAqb3V0czsKKwkJbnNfbGVuID0gb3V0c19sZW47CisJCWlmIChucyAmJiAhbnNfbGVuKSB7CisJCQl3YyA9IC1FTkFNRVRPT0xPTkc7CisJCQlnb3RvIGNvbnZlcnNpb25fZXJyOworCQl9CisJCWlmICghbnMpIHsKKwkJCW5zX2xlbiA9IGluc19sZW4gKiBOTFNfTUFYX0NIQVJTRVRfU0laRTsKKwkJCW5zID0gKHVuc2lnbmVkIGNoYXIqKWttYWxsb2MobnNfbGVuICsgMSwgR0ZQX05PRlMpOworCQkJaWYgKCFucykKKwkJCQlnb3RvIG1lbV9lcnJfb3V0OworCQl9CisJCWZvciAoaSA9IG8gPSAwOyBpIDwgaW5zX2xlbjsgaSsrKSB7CityZXRyeToJCQl3YyA9IG5scy0+dW5pMmNoYXIobGUxNl90b19jcHUoaW5zW2ldKSwgbnMgKyBvLAorCQkJCQluc19sZW4gLSBvKTsKKwkJCWlmICh3YyA+IDApIHsKKwkJCQlvICs9IHdjOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIGlmICghd2MpCisJCQkJYnJlYWs7CisJCQllbHNlIGlmICh3YyA9PSAtRU5BTUVUT09MT05HICYmIG5zICE9ICpvdXRzKSB7CisJCQkJdW5zaWduZWQgY2hhciAqdGM7CisJCQkJLyogR3JvdyBpbiBtdWx0aXBsZXMgb2YgNjQgYnl0ZXMuICovCisJCQkJdGMgPSAodW5zaWduZWQgY2hhciopa21hbGxvYygobnNfbGVuICsgNjQpICYKKwkJCQkJCX42MywgR0ZQX05PRlMpOworCQkJCWlmICh0YykgeworCQkJCQltZW1jcHkodGMsIG5zLCBuc19sZW4pOworCQkJCQluc19sZW4gPSAoKG5zX2xlbiArIDY0KSAmIH42MykgLSAxOworCQkJCQlrZnJlZShucyk7CisJCQkJCW5zID0gdGM7CisJCQkJCWdvdG8gcmV0cnk7CisJCQkJfSAvKiBObyBtZW1vcnkgc28gZ290byBjb252ZXJzaW9uX2Vycm9yOyAqLworCQkJfSAvKiB3YyA8IDAsIHJlYWwgZXJyb3IuICovCisJCQlnb3RvIGNvbnZlcnNpb25fZXJyOworCQl9CisJCW5zW29dID0gMDsKKwkJKm91dHMgPSBuczsKKwkJcmV0dXJuIG87CisJfSAvKiBlbHNlICghaW5zKSAqLworCW50ZnNfZXJyb3Iodm9sLT5zYiwgIlJlY2VpdmVkIE5VTEwgcG9pbnRlci4iKTsKKwlyZXR1cm4gLUVJTlZBTDsKK2NvbnZlcnNpb25fZXJyOgorCW50ZnNfZXJyb3Iodm9sLT5zYiwgIlVuaWNvZGUgbmFtZSBjb250YWlucyBjaGFyYWN0ZXJzIHRoYXQgY2Fubm90IGJlICIKKwkJCSJjb252ZXJ0ZWQgdG8gY2hhcmFjdGVyIHNldCAlcy4iLCBubHMtPmNoYXJzZXQpOworCWlmIChucyAhPSAqb3V0cykKKwkJa2ZyZWUobnMpOworCWlmICh3YyAhPSAtRU5BTUVUT09MT05HKQorCQl3YyA9IC1FSUxTRVE7CisJcmV0dXJuIHdjOworbWVtX2Vycl9vdXQ6CisJbnRmc19lcnJvcih2b2wtPnNiLCAiRmFpbGVkIHRvIGFsbG9jYXRlIG5hbWUhIik7CisJcmV0dXJuIC1FTk9NRU07Cit9CmRpZmYgLS1naXQgYS9mcy9udGZzL3VwY2FzZS5jIGIvZnMvbnRmcy91cGNhc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzljZGYxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbnRmcy91cGNhc2UuYwpAQCAtMCwwICsxLDkwIEBACisvKgorICogdXBjYXNlLmMgLSBHZW5lcmF0ZSB0aGUgZnVsbCBOVEZTIFVuaWNvZGUgdXBjYXNlIHRhYmxlIGluIGxpdHRsZSBlbmRpYW4uCisgKgkgICAgICBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxIFJpY2hhcmQgUnVzc29uIDxudGZzQGZsYXRjYXAub3JnPgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKgorICogTW9kaWZpZWQgZm9yIG1rbnRmcyBpbmNsdXNpb24gOSBKdW5lIDIwMDEgYnkgQW50b24gQWx0YXBhcm1ha292LgorICogTW9kaWZpZWQgZm9yIGtlcm5lbCBpbmNsdXNpb24gMTAgU2VwdGVtYmVyIDIwMDEgYnkgQW50b24gQWx0cGFybWFrb3YuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbSAoaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoZSBMaW51eC1OVEZTIHNvdXJjZQorICogaW4gdGhlIGZpbGUgQ09QWUlORyk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSAibWFsbG9jLmgiCisjaW5jbHVkZSAibnRmcy5oIgorCitudGZzY2hhciAqZ2VuZXJhdGVfZGVmYXVsdF91cGNhc2Uodm9pZCkKK3sKKwlzdGF0aWMgY29uc3QgaW50IHVjX3J1bl90YWJsZVtdWzNdID0geyAvKiBTdGFydCwgRW5kLCBBZGQgKi8KKwl7MHgwMDYxLCAweDAwN0IsICAtMzJ9LCB7MHgwNDUxLCAweDA0NUQsIC04MH0sIHsweDFGNzAsIDB4MUY3MiwgIDc0fSwKKwl7MHgwMEUwLCAweDAwRjcsICAtMzJ9LCB7MHgwNDVFLCAweDA0NjAsIC04MH0sIHsweDFGNzIsIDB4MUY3NiwgIDg2fSwKKwl7MHgwMEY4LCAweDAwRkYsICAtMzJ9LCB7MHgwNTYxLCAweDA1ODcsIC00OH0sIHsweDFGNzYsIDB4MUY3OCwgMTAwfSwKKwl7MHgwMjU2LCAweDAyNTgsIC0yMDV9LCB7MHgxRjAwLCAweDFGMDgsICAgOH0sIHsweDFGNzgsIDB4MUY3QSwgMTI4fSwKKwl7MHgwMjhBLCAweDAyOEMsIC0yMTd9LCB7MHgxRjEwLCAweDFGMTYsICAgOH0sIHsweDFGN0EsIDB4MUY3QywgMTEyfSwKKwl7MHgwM0FDLCAweDAzQUQsICAtMzh9LCB7MHgxRjIwLCAweDFGMjgsICAgOH0sIHsweDFGN0MsIDB4MUY3RSwgMTI2fSwKKwl7MHgwM0FELCAweDAzQjAsICAtMzd9LCB7MHgxRjMwLCAweDFGMzgsICAgOH0sIHsweDFGQjAsIDB4MUZCMiwgICA4fSwKKwl7MHgwM0IxLCAweDAzQzIsICAtMzJ9LCB7MHgxRjQwLCAweDFGNDYsICAgOH0sIHsweDFGRDAsIDB4MUZEMiwgICA4fSwKKwl7MHgwM0MyLCAweDAzQzMsICAtMzF9LCB7MHgxRjUxLCAweDFGNTIsICAgOH0sIHsweDFGRTAsIDB4MUZFMiwgICA4fSwKKwl7MHgwM0MzLCAweDAzQ0MsICAtMzJ9LCB7MHgxRjUzLCAweDFGNTQsICAgOH0sIHsweDFGRTUsIDB4MUZFNiwgICA3fSwKKwl7MHgwM0NDLCAweDAzQ0QsICAtNjR9LCB7MHgxRjU1LCAweDFGNTYsICAgOH0sIHsweDIxNzAsIDB4MjE4MCwgLTE2fSwKKwl7MHgwM0NELCAweDAzQ0YsICAtNjN9LCB7MHgxRjU3LCAweDFGNTgsICAgOH0sIHsweDI0RDAsIDB4MjRFQSwgLTI2fSwKKwl7MHgwNDMwLCAweDA0NTAsICAtMzJ9LCB7MHgxRjYwLCAweDFGNjgsICAgOH0sIHsweEZGNDEsIDB4RkY1QiwgLTMyfSwKKwl7MH0KKwl9OworCisJc3RhdGljIGNvbnN0IGludCB1Y19kdXBfdGFibGVbXVsyXSA9IHsgLyogU3RhcnQsIEVuZCAqLworCXsweDAxMDAsIDB4MDEyRn0sIHsweDAxQTAsIDB4MDFBNn0sIHsweDAzRTIsIDB4MDNFRn0sIHsweDA0Q0IsIDB4MDRDQ30sCisJezB4MDEzMiwgMHgwMTM3fSwgezB4MDFCMywgMHgwMUI3fSwgezB4MDQ2MCwgMHgwNDgxfSwgezB4MDREMCwgMHgwNEVCfSwKKwl7MHgwMTM5LCAweDAxNDl9LCB7MHgwMUNELCAweDAxRER9LCB7MHgwNDkwLCAweDA0QkZ9LCB7MHgwNEVFLCAweDA0RjV9LAorCXsweDAxNEEsIDB4MDE3OH0sIHsweDAxREUsIDB4MDFFRn0sIHsweDA0QkYsIDB4MDRCRn0sIHsweDA0RjgsIDB4MDRGOX0sCisJezB4MDE3OSwgMHgwMTdFfSwgezB4MDFGNCwgMHgwMUY1fSwgezB4MDRDMSwgMHgwNEM0fSwgezB4MUUwMCwgMHgxRTk1fSwKKwl7MHgwMThCLCAweDAxOEJ9LCB7MHgwMUZBLCAweDAyMTh9LCB7MHgwNEM3LCAweDA0Qzh9LCB7MHgxRUEwLCAweDFFRjl9LAorCXswfQorCX07CisKKwlzdGF0aWMgY29uc3QgaW50IHVjX3dvcmRfdGFibGVbXVsyXSA9IHsgLyogT2Zmc2V0LCBWYWx1ZSAqLworCXsweDAwRkYsIDB4MDE3OH0sIHsweDAxQUQsIDB4MDFBQ30sIHsweDAxRjMsIDB4MDFGMX0sIHsweDAyNjksIDB4MDE5Nn0sCisJezB4MDE4MywgMHgwMTgyfSwgezB4MDFCMCwgMHgwMUFGfSwgezB4MDI1MywgMHgwMTgxfSwgezB4MDI2RiwgMHgwMTlDfSwKKwl7MHgwMTg1LCAweDAxODR9LCB7MHgwMUI5LCAweDAxQjh9LCB7MHgwMjU0LCAweDAxODZ9LCB7MHgwMjcyLCAweDAxOUR9LAorCXsweDAxODgsIDB4MDE4N30sIHsweDAxQkQsIDB4MDFCQ30sIHsweDAyNTksIDB4MDE4Rn0sIHsweDAyNzUsIDB4MDE5Rn0sCisJezB4MDE4QywgMHgwMThCfSwgezB4MDFDNiwgMHgwMUM0fSwgezB4MDI1QiwgMHgwMTkwfSwgezB4MDI4MywgMHgwMUE5fSwKKwl7MHgwMTkyLCAweDAxOTF9LCB7MHgwMUM5LCAweDAxQzd9LCB7MHgwMjYwLCAweDAxOTN9LCB7MHgwMjg4LCAweDAxQUV9LAorCXsweDAxOTksIDB4MDE5OH0sIHsweDAxQ0MsIDB4MDFDQX0sIHsweDAyNjMsIDB4MDE5NH0sIHsweDAyOTIsIDB4MDFCN30sCisJezB4MDFBOCwgMHgwMUE3fSwgezB4MDFERCwgMHgwMThFfSwgezB4MDI2OCwgMHgwMTk3fSwKKwl7MH0KKwl9OworCisJaW50IGksIHI7CisJbnRmc2NoYXIgKnVjOworCisJdWMgPSBudGZzX21hbGxvY19ub2ZzKGRlZmF1bHRfdXBjYXNlX2xlbiAqIHNpemVvZihudGZzY2hhcikpOworCWlmICghdWMpCisJCXJldHVybiB1YzsKKwltZW1zZXQodWMsIDAsIGRlZmF1bHRfdXBjYXNlX2xlbiAqIHNpemVvZihudGZzY2hhcikpOworCWZvciAoaSA9IDA7IGkgPCBkZWZhdWx0X3VwY2FzZV9sZW47IGkrKykKKwkJdWNbaV0gPSBjcHVfdG9fbGUxNihpKTsKKwlmb3IgKHIgPSAwOyB1Y19ydW5fdGFibGVbcl1bMF07IHIrKykKKwkJZm9yIChpID0gdWNfcnVuX3RhYmxlW3JdWzBdOyBpIDwgdWNfcnVuX3RhYmxlW3JdWzFdOyBpKyspCisJCQl1Y1tpXSA9IGNwdV90b19sZTE2KChsZTE2X3RvX2NwdSh1Y1tpXSkgKworCQkJCQl1Y19ydW5fdGFibGVbcl1bMl0pKTsKKwlmb3IgKHIgPSAwOyB1Y19kdXBfdGFibGVbcl1bMF07IHIrKykKKwkJZm9yIChpID0gdWNfZHVwX3RhYmxlW3JdWzBdOyBpIDwgdWNfZHVwX3RhYmxlW3JdWzFdOyBpICs9IDIpCisJCQl1Y1tpICsgMV0gPSBjcHVfdG9fbGUxNihsZTE2X3RvX2NwdSh1Y1tpICsgMV0pIC0gMSk7CisJZm9yIChyID0gMDsgdWNfd29yZF90YWJsZVtyXVswXTsgcisrKQorCQl1Y1t1Y193b3JkX3RhYmxlW3JdWzBdXSA9IGNwdV90b19sZTE2KHVjX3dvcmRfdGFibGVbcl1bMV0pOworCXJldHVybiB1YzsKK30KZGlmZiAtLWdpdCBhL2ZzL250ZnMvdm9sdW1lLmggYi9mcy9udGZzL3ZvbHVtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOTdmYTgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9udGZzL3ZvbHVtZS5oCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogdm9sdW1lLmggLSBEZWZpbmVzIGZvciB2b2x1bWUgc3RydWN0dXJlcyBpbiBOVEZTIExpbnV4IGtlcm5lbCBkcml2ZXIuIFBhcnQKKyAqCSAgICAgIG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDQgQW50b24gQWx0YXBhcm1ha292CisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgUmljaGFyZCBSdXNzb24KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0vaW5jbHVkZSBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICogdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUworICogZGlzdHJpYnV0aW9uIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaWZuZGVmIF9MSU5VWF9OVEZTX1ZPTFVNRV9ICisjZGVmaW5lIF9MSU5VWF9OVEZTX1ZPTFVNRV9ICisKKyNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgorCisjaW5jbHVkZSAidHlwZXMuaCIKKyNpbmNsdWRlICJsYXlvdXQuaCIKKworLyoKKyAqIFRoZSBOVEZTIGluIG1lbW9yeSBzdXBlciBibG9jayBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsKKwkvKgorCSAqIEZJWE1FOiBSZW9yZGVyIHRvIGhhdmUgY29tbW9ubHkgdXNlZCB0b2dldGhlciBlbGVtZW50IHdpdGhpbiB0aGUKKwkgKiBzYW1lIGNhY2hlIGxpbmUsIGFpbWluZyBhdCBhIGNhY2hlIGxpbmUgc2l6ZSBvZiAzMiBieXRlcy4gQWltIGZvcgorCSAqIDY0IGJ5dGVzIGZvciBsZXNzIGNvbW1vbmx5IHVzZWQgdG9nZXRoZXIgZWxlbWVudHMuIFB1dCBtb3N0IGNvbW1vbmx5CisJICogdXNlZCBlbGVtZW50cyB0byBmcm9udCBvZiBzdHJ1Y3R1cmUuIE9idmlvdXNseSBkbyB0aGlzIG9ubHkgd2hlbiB0aGUKKwkgKiBzdHJ1Y3R1cmUgaGFzIHN0YWJpbGl6ZWQuLi4gKEFJQSkKKwkgKi8KKwkvKiBEZXZpY2Ugc3BlY2lmaWNzLiAqLworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CQkvKiBQb2ludGVyIGJhY2sgdG8gdGhlIHN1cGVyX2Jsb2NrLAorCQkJCQkgICBzbyB3ZSBkb24ndCBoYXZlIHRvIGdldCB0aGUgb2Zmc2V0CisJCQkJCSAgIGV2ZXJ5IHRpbWUuICovCisJTENOIG5yX2Jsb2NrczsJCQkvKiBOdW1iZXIgb2YgTlRGU19CTE9DS19TSVpFIGJ5dGVzCisJCQkJCSAgIHNpemVkIGJsb2NrcyBvbiB0aGUgZGV2aWNlLiAqLworCS8qIENvbmZpZ3VyYXRpb24gcHJvdmlkZWQgYnkgdXNlciBhdCBtb3VudCB0aW1lLiAqLworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CQkvKiBNaXNjZWxsYW5lb3VzIGZsYWdzLCBzZWUgYmVsb3cuICovCisJdWlkX3QgdWlkOwkJCS8qIHVpZCB0aGF0IGZpbGVzIHdpbGwgYmUgbW91bnRlZCBhcy4gKi8KKwlnaWRfdCBnaWQ7CQkJLyogZ2lkIHRoYXQgZmlsZXMgd2lsbCBiZSBtb3VudGVkIGFzLiAqLworCW1vZGVfdCBmbWFzazsJCQkvKiBUaGUgbWFzayBmb3IgZmlsZSBwZXJtaXNzaW9ucy4gKi8KKwltb2RlX3QgZG1hc2s7CQkJLyogVGhlIG1hc2sgZm9yIGRpcmVjdG9yeQorCQkJCQkgICBwZXJtaXNzaW9ucy4gKi8KKwl1OCBtZnRfem9uZV9tdWx0aXBsaWVyOwkJLyogSW5pdGlhbCBtZnQgem9uZSBtdWx0aXBsaWVyLiAqLworCXU4IG9uX2Vycm9yczsJCQkvKiBXaGF0IHRvIGRvIG9uIGZpbGUgc3lzdGVtIGVycm9ycy4gKi8KKwkvKiBOVEZTIGJvb3RzZWN0b3IgcHJvdmlkZWQgaW5mb3JtYXRpb24uICovCisJdTE2IHNlY3Rvcl9zaXplOwkJLyogaW4gYnl0ZXMgKi8KKwl1OCBzZWN0b3Jfc2l6ZV9iaXRzOwkJLyogbG9nMihzZWN0b3Jfc2l6ZSkgKi8KKwl1MzIgY2x1c3Rlcl9zaXplOwkJLyogaW4gYnl0ZXMgKi8KKwl1MzIgY2x1c3Rlcl9zaXplX21hc2s7CQkvKiBjbHVzdGVyX3NpemUgLSAxICovCisJdTggY2x1c3Rlcl9zaXplX2JpdHM7CQkvKiBsb2cyKGNsdXN0ZXJfc2l6ZSkgKi8KKwl1MzIgbWZ0X3JlY29yZF9zaXplOwkJLyogaW4gYnl0ZXMgKi8KKwl1MzIgbWZ0X3JlY29yZF9zaXplX21hc2s7CS8qIG1mdF9yZWNvcmRfc2l6ZSAtIDEgKi8KKwl1OCBtZnRfcmVjb3JkX3NpemVfYml0czsJLyogbG9nMihtZnRfcmVjb3JkX3NpemUpICovCisJdTMyIGluZGV4X3JlY29yZF9zaXplOwkJLyogaW4gYnl0ZXMgKi8KKwl1MzIgaW5kZXhfcmVjb3JkX3NpemVfbWFzazsJLyogaW5kZXhfcmVjb3JkX3NpemUgLSAxICovCisJdTggaW5kZXhfcmVjb3JkX3NpemVfYml0czsJLyogbG9nMihpbmRleF9yZWNvcmRfc2l6ZSkgKi8KKwlMQ04gbnJfY2x1c3RlcnM7CQkvKiBWb2x1bWUgc2l6ZSBpbiBjbHVzdGVycyA9PSBudW1iZXIgb2YKKwkJCQkJICAgYml0cyBpbiBsY24gYml0bWFwLiAqLworCUxDTiBtZnRfbGNuOwkJCS8qIENsdXN0ZXIgbG9jYXRpb24gb2YgbWZ0IGRhdGEuICovCisJTENOIG1mdG1pcnJfbGNuOwkJLyogQ2x1c3RlciBsb2NhdGlvbiBvZiBjb3B5IG9mIG1mdC4gKi8KKwl1NjQgc2VyaWFsX25vOwkJCS8qIFRoZSB2b2x1bWUgc2VyaWFsIG51bWJlci4gKi8KKwkvKiBNb3VudCBzcGVjaWZpYyBOVEZTIGluZm9ybWF0aW9uLiAqLworCXUzMiB1cGNhc2VfbGVuOwkJCS8qIE51bWJlciBvZiBlbnRyaWVzIGluIHVwY2FzZVtdLiAqLworCW50ZnNjaGFyICp1cGNhc2U7CQkvKiBUaGUgdXBjYXNlIHRhYmxlLiAqLworCisJczMyIGF0dHJkZWZfc2l6ZTsJCS8qIFNpemUgb2YgdGhlIGF0dHJpYnV0ZSBkZWZpbml0aW9uCisJCQkJCSAgIHRhYmxlIGluIGJ5dGVzLiAqLworCUFUVFJfREVGICphdHRyZGVmOwkJLyogVGFibGUgb2YgYXR0cmlidXRlIGRlZmluaXRpb25zLgorCQkJCQkgICBPYnRhaW5lZCBmcm9tIEZJTEVfQXR0ckRlZi4gKi8KKworI2lmZGVmIE5URlNfUlcKKwkvKiBWYXJpYWJsZXMgdXNlZCBieSB0aGUgY2x1c3RlciBhbmQgbWZ0IGFsbG9jYXRvcnMuICovCisJczY0IG1mdF9kYXRhX3BvczsJCS8qIE1mdCByZWNvcmQgbnVtYmVyIGF0IHdoaWNoIHRvCisJCQkJCSAgIGFsbG9jYXRlIHRoZSBuZXh0IG1mdCByZWNvcmQuICovCisJTENOIG1mdF96b25lX3N0YXJ0OwkJLyogRmlyc3QgY2x1c3RlciBvZiB0aGUgbWZ0IHpvbmUuICovCisJTENOIG1mdF96b25lX2VuZDsJCS8qIEZpcnN0IGNsdXN0ZXIgYmV5b25kIHRoZSBtZnQgem9uZS4gKi8KKwlMQ04gbWZ0X3pvbmVfcG9zOwkJLyogQ3VycmVudCBwb3NpdGlvbiBpbiB0aGUgbWZ0IHpvbmUuICovCisJTENOIGRhdGExX3pvbmVfcG9zOwkJLyogQ3VycmVudCBwb3NpdGlvbiBpbiB0aGUgZmlyc3QgZGF0YQorCQkJCQkgICB6b25lLiAqLworCUxDTiBkYXRhMl96b25lX3BvczsJCS8qIEN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIHNlY29uZCBkYXRhCisJCQkJCSAgIHpvbmUuICovCisjZW5kaWYgLyogTlRGU19SVyAqLworCisJc3RydWN0IGlub2RlICptZnRfaW5vOwkJLyogVGhlIFZGUyBpbm9kZSBvZiAkTUZULiAqLworCisJc3RydWN0IGlub2RlICptZnRibXBfaW5vOwkvKiBBdHRyaWJ1dGUgaW5vZGUgZm9yICRNRlQvJEJJVE1BUC4gKi8KKwlzdHJ1Y3Qgcndfc2VtYXBob3JlIG1mdGJtcF9sb2NrOyAvKiBMb2NrIGZvciBzZXJpYWxpemluZyBhY2Nlc3NlcyB0byB0aGUKKwkJCQkJICAgIG1mdCByZWNvcmQgYml0bWFwICgkTUZULyRCSVRNQVApLiAqLworI2lmZGVmIE5URlNfUlcKKwlzdHJ1Y3QgaW5vZGUgKm1mdG1pcnJfaW5vOwkvKiBUaGUgVkZTIGlub2RlIG9mICRNRlRNaXJyLiAqLworCWludCBtZnRtaXJyX3NpemU7CQkvKiBTaXplIG9mIG1mdCBtaXJyb3IgaW4gbWZ0IHJlY29yZHMuICovCisKKwlzdHJ1Y3QgaW5vZGUgKmxvZ2ZpbGVfaW5vOwkvKiBUaGUgVkZTIGlub2RlIG9mICRMb2dGaWxlLiAqLworI2VuZGlmIC8qIE5URlNfUlcgKi8KKworCXN0cnVjdCBpbm9kZSAqbGNuYm1wX2lubzsJLyogVGhlIFZGUyBpbm9kZSBvZiAkQml0bWFwLiAqLworCXN0cnVjdCByd19zZW1hcGhvcmUgbGNuYm1wX2xvY2s7IC8qIExvY2sgZm9yIHNlcmlhbGl6aW5nIGFjY2Vzc2VzIHRvIHRoZQorCQkJCQkgICAgY2x1c3RlciBiaXRtYXAgKCRCaXRtYXAvJERBVEEpLiAqLworCisJc3RydWN0IGlub2RlICp2b2xfaW5vOwkJLyogVGhlIFZGUyBpbm9kZSBvZiAkVm9sdW1lLiAqLworCVZPTFVNRV9GTEFHUyB2b2xfZmxhZ3M7CQkvKiBWb2x1bWUgZmxhZ3MuICovCisJdTggbWFqb3JfdmVyOwkJCS8qIE50ZnMgbWFqb3IgdmVyc2lvbiBvZiB2b2x1bWUuICovCisJdTggbWlub3JfdmVyOwkJCS8qIE50ZnMgbWlub3IgdmVyc2lvbiBvZiB2b2x1bWUuICovCisKKwlzdHJ1Y3QgaW5vZGUgKnJvb3RfaW5vOwkJLyogVGhlIFZGUyBpbm9kZSBvZiB0aGUgcm9vdAorCQkJCQkgICBkaXJlY3RvcnkuICovCisJc3RydWN0IGlub2RlICpzZWN1cmVfaW5vOwkvKiBUaGUgVkZTIGlub2RlIG9mICRTZWN1cmUgKE5URlMzLjArCisJCQkJCSAgIG9ubHksIG90aGVyd2lzZSBOVUxMKS4gKi8KKwlzdHJ1Y3QgaW5vZGUgKmV4dGVuZF9pbm87CS8qIFRoZSBWRlMgaW5vZGUgb2YgJEV4dGVuZCAoTlRGUzMuMCsKKwkJCQkJICAgb25seSwgb3RoZXJ3aXNlIE5VTEwpLiAqLworI2lmZGVmIE5URlNfUlcKKwkvKiAkUXVvdGEgc3R1ZmYgaXMgTlRGUzMuMCsgc3BlY2lmaWMuICBVbnVzZWQvTlVMTCBvdGhlcndpc2UuICovCisJc3RydWN0IGlub2RlICpxdW90YV9pbm87CS8qIFRoZSBWRlMgaW5vZGUgb2YgJFF1b3RhLiAqLworCXN0cnVjdCBpbm9kZSAqcXVvdGFfcV9pbm87CS8qIEF0dHJpYnV0ZSBpbm9kZSBmb3IgJFF1b3RhLyRRLiAqLworI2VuZGlmIC8qIE5URlNfUlcgKi8KKwlzdHJ1Y3QgbmxzX3RhYmxlICpubHNfbWFwOworfSBudGZzX3ZvbHVtZTsKKworLyoKKyAqIERlZmluZWQgYml0cyBmb3IgdGhlIGZsYWdzIGZpZWxkIGluIHRoZSBudGZzX3ZvbHVtZSBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgZW51bSB7CisJTlZfRXJyb3JzLAkJLyogMTogVm9sdW1lIGhhcyBlcnJvcnMsIHByZXZlbnQgcmVtb3VudCBydy4gKi8KKwlOVl9TaG93U3lzdGVtRmlsZXMsCS8qIDE6IFJldHVybiBzeXN0ZW0gZmlsZXMgaW4gbnRmc19yZWFkZGlyKCkuICovCisJTlZfQ2FzZVNlbnNpdGl2ZSwJLyogMTogVHJlYXQgZmlsZSBuYW1lcyBhcyBjYXNlIHNlbnNpdGl2ZSBhbmQKKwkJCQkgICAgICBjcmVhdGUgZmlsZW5hbWVzIGluIHRoZSBQT1NJWCBuYW1lc3BhY2UuCisJCQkJICAgICAgT3RoZXJ3aXNlIGJlIGNhc2UgaW5zZW5zaXRpdmUgYW5kIGNyZWF0ZQorCQkJCSAgICAgIGZpbGUgbmFtZXMgaW4gV0lOMzIgbmFtZXNwYWNlLiAqLworCU5WX0xvZ0ZpbGVFbXB0eSwJLyogMTogJExvZ0ZpbGUgam91cm5hbCBpcyBlbXB0eS4gKi8KKwlOVl9RdW90YU91dE9mRGF0ZSwJLyogMTogJFF1b3RhIGlzIG91dCBvZiBkYXRlLiAqLworfSBudGZzX3ZvbHVtZV9mbGFnczsKKworLyoKKyAqIE1hY3JvIHRyaWNrcyB0byBleHBhbmQgdGhlIE5Wb2xGb28oKSwgTlZvbFNldEZvbygpLCBhbmQgTlZvbENsZWFyRm9vKCkKKyAqIGZ1bmN0aW9ucy4KKyAqLworI2RlZmluZSBOVk9MX0ZOUyhmbGFnKQkJCQkJXAorc3RhdGljIGlubGluZSBpbnQgTlZvbCMjZmxhZyhudGZzX3ZvbHVtZSAqdm9sKQkJXAorewkJCQkJCQlcCisJcmV0dXJuIHRlc3RfYml0KE5WXyMjZmxhZywgJih2b2wpLT5mbGFncyk7CVwKK30JCQkJCQkJXAorc3RhdGljIGlubGluZSB2b2lkIE5Wb2xTZXQjI2ZsYWcobnRmc192b2x1bWUgKnZvbCkJXAorewkJCQkJCQlcCisJc2V0X2JpdChOVl8jI2ZsYWcsICYodm9sKS0+ZmxhZ3MpOwkJXAorfQkJCQkJCQlcCitzdGF0aWMgaW5saW5lIHZvaWQgTlZvbENsZWFyIyNmbGFnKG50ZnNfdm9sdW1lICp2b2wpCVwKK3sJCQkJCQkJXAorCWNsZWFyX2JpdChOVl8jI2ZsYWcsICYodm9sKS0+ZmxhZ3MpOwkJXAorfQorCisvKiBFbWl0IHRoZSBudGZzIHZvbHVtZSBiaXRvcHMgZnVuY3Rpb25zLiAqLworTlZPTF9GTlMoRXJyb3JzKQorTlZPTF9GTlMoU2hvd1N5c3RlbUZpbGVzKQorTlZPTF9GTlMoQ2FzZVNlbnNpdGl2ZSkKK05WT0xfRk5TKExvZ0ZpbGVFbXB0eSkKK05WT0xfRk5TKFF1b3RhT3V0T2ZEYXRlKQorCisjZW5kaWYgLyogX0xJTlVYX05URlNfVk9MVU1FX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL29wZW4uYyBiL2ZzL29wZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjNiZDgxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvb3Blbi5jCkBAIC0wLDAgKzEsMTA3NiBAQAorLyoKKyAqICBsaW51eC9mcy9vcGVuLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3V0aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9kbm90aWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorCisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCitpbnQgdmZzX3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQoreworCWludCByZXR2YWwgPSAtRU5PREVWOworCisJaWYgKHNiKSB7CisJCXJldHZhbCA9IC1FTk9TWVM7CisJCWlmIChzYi0+c19vcC0+c3RhdGZzKSB7CisJCQltZW1zZXQoYnVmLCAwLCBzaXplb2YoKmJ1ZikpOworCQkJcmV0dmFsID0gc2VjdXJpdHlfc2Jfc3RhdGZzKHNiKTsKKwkJCWlmIChyZXR2YWwpCisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCXJldHZhbCA9IHNiLT5zX29wLT5zdGF0ZnMoc2IsIGJ1Zik7CisJCQlpZiAocmV0dmFsID09IDAgJiYgYnVmLT5mX2Zyc2l6ZSA9PSAwKQorCQkJCWJ1Zi0+Zl9mcnNpemUgPSBidWYtPmZfYnNpemU7CisJCX0KKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworRVhQT1JUX1NZTUJPTCh2ZnNfc3RhdGZzKTsKKworc3RhdGljIGludCB2ZnNfc3RhdGZzX25hdGl2ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qgc3RhdGZzICpidWYpCit7CisJc3RydWN0IGtzdGF0ZnMgc3Q7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IHZmc19zdGF0ZnMoc2IsICZzdCk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWlmIChzaXplb2YoKmJ1ZikgPT0gc2l6ZW9mKHN0KSkKKwkJbWVtY3B5KGJ1ZiwgJnN0LCBzaXplb2Yoc3QpKTsKKwllbHNlIHsKKwkJaWYgKHNpemVvZiBidWYtPmZfYmxvY2tzID09IDQpIHsKKwkJCWlmICgoc3QuZl9ibG9ja3MgfCBzdC5mX2JmcmVlIHwgc3QuZl9iYXZhaWwpICYKKwkJCSAgICAweGZmZmZmZmZmMDAwMDAwMDBVTEwpCisJCQkJcmV0dXJuIC1FT1ZFUkZMT1c7CisJCQkvKgorCQkJICogZl9maWxlcyBhbmQgZl9mZnJlZSBtYXkgYmUgLTE7IGl0J3Mgb2theSB0byBzdHVmZgorCQkJICogdGhhdCBpbnRvIDMyIGJpdHMKKwkJCSAqLworCQkJaWYgKHN0LmZfZmlsZXMgIT0gLTEgJiYKKwkJCSAgICAoc3QuZl9maWxlcyAmIDB4ZmZmZmZmZmYwMDAwMDAwMFVMTCkpCisJCQkJcmV0dXJuIC1FT1ZFUkZMT1c7CisJCQlpZiAoc3QuZl9mZnJlZSAhPSAtMSAmJgorCQkJICAgIChzdC5mX2ZmcmVlICYgMHhmZmZmZmZmZjAwMDAwMDAwVUxMKSkKKwkJCQlyZXR1cm4gLUVPVkVSRkxPVzsKKwkJfQorCisJCWJ1Zi0+Zl90eXBlID0gc3QuZl90eXBlOworCQlidWYtPmZfYnNpemUgPSBzdC5mX2JzaXplOworCQlidWYtPmZfYmxvY2tzID0gc3QuZl9ibG9ja3M7CisJCWJ1Zi0+Zl9iZnJlZSA9IHN0LmZfYmZyZWU7CisJCWJ1Zi0+Zl9iYXZhaWwgPSBzdC5mX2JhdmFpbDsKKwkJYnVmLT5mX2ZpbGVzID0gc3QuZl9maWxlczsKKwkJYnVmLT5mX2ZmcmVlID0gc3QuZl9mZnJlZTsKKwkJYnVmLT5mX2ZzaWQgPSBzdC5mX2ZzaWQ7CisJCWJ1Zi0+Zl9uYW1lbGVuID0gc3QuZl9uYW1lbGVuOworCQlidWYtPmZfZnJzaXplID0gc3QuZl9mcnNpemU7CisJCW1lbXNldChidWYtPmZfc3BhcmUsIDAsIHNpemVvZihidWYtPmZfc3BhcmUpKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmZzX3N0YXRmczY0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBzdGF0ZnM2NCAqYnVmKQoreworCXN0cnVjdCBrc3RhdGZzIHN0OworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSB2ZnNfc3RhdGZzKHNiLCAmc3QpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlpZiAoc2l6ZW9mKCpidWYpID09IHNpemVvZihzdCkpCisJCW1lbWNweShidWYsICZzdCwgc2l6ZW9mKHN0KSk7CisJZWxzZSB7CisJCWJ1Zi0+Zl90eXBlID0gc3QuZl90eXBlOworCQlidWYtPmZfYnNpemUgPSBzdC5mX2JzaXplOworCQlidWYtPmZfYmxvY2tzID0gc3QuZl9ibG9ja3M7CisJCWJ1Zi0+Zl9iZnJlZSA9IHN0LmZfYmZyZWU7CisJCWJ1Zi0+Zl9iYXZhaWwgPSBzdC5mX2JhdmFpbDsKKwkJYnVmLT5mX2ZpbGVzID0gc3QuZl9maWxlczsKKwkJYnVmLT5mX2ZmcmVlID0gc3QuZl9mZnJlZTsKKwkJYnVmLT5mX2ZzaWQgPSBzdC5mX2ZzaWQ7CisJCWJ1Zi0+Zl9uYW1lbGVuID0gc3QuZl9uYW1lbGVuOworCQlidWYtPmZfZnJzaXplID0gc3QuZl9mcnNpemU7CisJCW1lbXNldChidWYtPmZfc3BhcmUsIDAsIHNpemVvZihidWYtPmZfc3BhcmUpKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfc3RhdGZzKGNvbnN0IGNoYXIgX191c2VyICogcGF0aCwgc3RydWN0IHN0YXRmcyBfX3VzZXIgKiBidWYpCit7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IHVzZXJfcGF0aF93YWxrKHBhdGgsICZuZCk7CisJaWYgKCFlcnJvcikgeworCQlzdHJ1Y3Qgc3RhdGZzIHRtcDsKKwkJZXJyb3IgPSB2ZnNfc3RhdGZzX25hdGl2ZShuZC5kZW50cnktPmRfaW5vZGUtPmlfc2IsICZ0bXApOworCQlpZiAoIWVycm9yICYmIGNvcHlfdG9fdXNlcihidWYsICZ0bXAsIHNpemVvZih0bXApKSkKKwkJCWVycm9yID0gLUVGQVVMVDsKKwkJcGF0aF9yZWxlYXNlKCZuZCk7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworCithc21saW5rYWdlIGxvbmcgc3lzX3N0YXRmczY0KGNvbnN0IGNoYXIgX191c2VyICpwYXRoLCBzaXplX3Qgc3osIHN0cnVjdCBzdGF0ZnM2NCBfX3VzZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCWxvbmcgZXJyb3I7CisKKwlpZiAoc3ogIT0gc2l6ZW9mKCpidWYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwllcnJvciA9IHVzZXJfcGF0aF93YWxrKHBhdGgsICZuZCk7CisJaWYgKCFlcnJvcikgeworCQlzdHJ1Y3Qgc3RhdGZzNjQgdG1wOworCQllcnJvciA9IHZmc19zdGF0ZnM2NChuZC5kZW50cnktPmRfaW5vZGUtPmlfc2IsICZ0bXApOworCQlpZiAoIWVycm9yICYmIGNvcHlfdG9fdXNlcihidWYsICZ0bXAsIHNpemVvZih0bXApKSkKKwkJCWVycm9yID0gLUVGQVVMVDsKKwkJcGF0aF9yZWxlYXNlKCZuZCk7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworCithc21saW5rYWdlIGxvbmcgc3lzX2ZzdGF0ZnModW5zaWduZWQgaW50IGZkLCBzdHJ1Y3Qgc3RhdGZzIF9fdXNlciAqIGJ1ZikKK3sKKwlzdHJ1Y3QgZmlsZSAqIGZpbGU7CisJc3RydWN0IHN0YXRmcyB0bXA7CisJaW50IGVycm9yOworCisJZXJyb3IgPSAtRUJBREY7CisJZmlsZSA9IGZnZXQoZmQpOworCWlmICghZmlsZSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSB2ZnNfc3RhdGZzX25hdGl2ZShmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9zYiwgJnRtcCk7CisJaWYgKCFlcnJvciAmJiBjb3B5X3RvX3VzZXIoYnVmLCAmdG1wLCBzaXplb2YodG1wKSkpCisJCWVycm9yID0gLUVGQVVMVDsKKwlmcHV0KGZpbGUpOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworYXNtbGlua2FnZSBsb25nIHN5c19mc3RhdGZzNjQodW5zaWduZWQgaW50IGZkLCBzaXplX3Qgc3osIHN0cnVjdCBzdGF0ZnM2NCBfX3VzZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZmlsZSAqIGZpbGU7CisJc3RydWN0IHN0YXRmczY0IHRtcDsKKwlpbnQgZXJyb3I7CisKKwlpZiAoc3ogIT0gc2l6ZW9mKCpidWYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVycm9yID0gLUVCQURGOworCWZpbGUgPSBmZ2V0KGZkKTsKKwlpZiAoIWZpbGUpCisJCWdvdG8gb3V0OworCWVycm9yID0gdmZzX3N0YXRmczY0KGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NiLCAmdG1wKTsKKwlpZiAoIWVycm9yICYmIGNvcHlfdG9fdXNlcihidWYsICZ0bXAsIHNpemVvZih0bXApKSkKKwkJZXJyb3IgPSAtRUZBVUxUOworCWZwdXQoZmlsZSk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitpbnQgZG9fdHJ1bmNhdGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBsb2ZmX3QgbGVuZ3RoKQoreworCWludCBlcnI7CisJc3RydWN0IGlhdHRyIG5ld2F0dHJzOworCisJLyogTm90IHByZXR0eTogImlub2RlLT5pX3NpemUiIHNob3VsZG4ndCByZWFsbHkgYmUgc2lnbmVkLiBCdXQgaXQgaXMuICovCisJaWYgKGxlbmd0aCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJbmV3YXR0cnMuaWFfc2l6ZSA9IGxlbmd0aDsKKwluZXdhdHRycy5pYV92YWxpZCA9IEFUVFJfU0laRSB8IEFUVFJfQ1RJTUU7CisKKwlkb3duKCZkZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwllcnIgPSBub3RpZnlfY2hhbmdlKGRlbnRyeSwgJm5ld2F0dHJzKTsKKwl1cCgmZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSBsb25nIGRvX3N5c190cnVuY2F0ZShjb25zdCBjaGFyIF9fdXNlciAqIHBhdGgsIGxvZmZfdCBsZW5ndGgpCit7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKGxlbmd0aCA8IDApCS8qIHNvcnJ5LCBidXQgbG9mZl90IHNheXMuLi4gKi8KKwkJZ290byBvdXQ7CisKKwllcnJvciA9IHVzZXJfcGF0aF93YWxrKHBhdGgsICZuZCk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKwlpbm9kZSA9IG5kLmRlbnRyeS0+ZF9pbm9kZTsKKworCS8qIEZvciBkaXJlY3RvcmllcyBpdCdzIC1FSVNESVIsIGZvciBvdGhlciBub24tcmVndWxhcnMgLSAtRUlOVkFMICovCisJZXJyb3IgPSAtRUlTRElSOworCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQlnb3RvIGRwdXRfYW5kX291dDsKKworCWVycm9yID0gLUVJTlZBTDsKKwlpZiAoIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCisJCWdvdG8gZHB1dF9hbmRfb3V0OworCisJZXJyb3IgPSBwZXJtaXNzaW9uKGlub2RlLE1BWV9XUklURSwmbmQpOworCWlmIChlcnJvcikKKwkJZ290byBkcHV0X2FuZF9vdXQ7CisKKwllcnJvciA9IC1FUk9GUzsKKwlpZiAoSVNfUkRPTkxZKGlub2RlKSkKKwkJZ290byBkcHV0X2FuZF9vdXQ7CisKKwllcnJvciA9IC1FUEVSTTsKKwlpZiAoSVNfSU1NVVRBQkxFKGlub2RlKSB8fCBJU19BUFBFTkQoaW5vZGUpKQorCQlnb3RvIGRwdXRfYW5kX291dDsKKworCS8qCisJICogTWFrZSBzdXJlIHRoYXQgdGhlcmUgYXJlIG5vIGxlYXNlcy4KKwkgKi8KKwllcnJvciA9IGJyZWFrX2xlYXNlKGlub2RlLCBGTU9ERV9XUklURSk7CisJaWYgKGVycm9yKQorCQlnb3RvIGRwdXRfYW5kX291dDsKKworCWVycm9yID0gZ2V0X3dyaXRlX2FjY2Vzcyhpbm9kZSk7CisJaWYgKGVycm9yKQorCQlnb3RvIGRwdXRfYW5kX291dDsKKworCWVycm9yID0gbG9ja3NfdmVyaWZ5X3RydW5jYXRlKGlub2RlLCBOVUxMLCBsZW5ndGgpOworCWlmICghZXJyb3IpIHsKKwkJRFFVT1RfSU5JVChpbm9kZSk7CisJCWVycm9yID0gZG9fdHJ1bmNhdGUobmQuZGVudHJ5LCBsZW5ndGgpOworCX0KKwlwdXRfd3JpdGVfYWNjZXNzKGlub2RlKTsKKworZHB1dF9hbmRfb3V0OgorCXBhdGhfcmVsZWFzZSgmbmQpOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworYXNtbGlua2FnZSBsb25nIHN5c190cnVuY2F0ZShjb25zdCBjaGFyIF9fdXNlciAqIHBhdGgsIHVuc2lnbmVkIGxvbmcgbGVuZ3RoKQoreworCS8qIG9uIDMyLWJpdCBib3hlbiBpdCB3aWxsIGN1dCB0aGUgcmFuZ2UgMl4zMS0tMl4zMi0xIG9mZiAqLworCXJldHVybiBkb19zeXNfdHJ1bmNhdGUocGF0aCwgKGxvbmcpbGVuZ3RoKTsKK30KKworc3RhdGljIGlubGluZSBsb25nIGRvX3N5c19mdHJ1bmNhdGUodW5zaWduZWQgaW50IGZkLCBsb2ZmX3QgbGVuZ3RoLCBpbnQgc21hbGwpCit7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCXN0cnVjdCBmaWxlICogZmlsZTsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKGxlbmd0aCA8IDApCisJCWdvdG8gb3V0OworCWVycm9yID0gLUVCQURGOworCWZpbGUgPSBmZ2V0KGZkKTsKKwlpZiAoIWZpbGUpCisJCWdvdG8gb3V0OworCisJLyogZXhwbGljaXRseSBvcGVuZWQgYXMgbGFyZ2Ugb3Igd2UgYXJlIG9uIDY0LWJpdCBib3ggKi8KKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTEFSR0VGSUxFKQorCQlzbWFsbCA9IDA7CisKKwlkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKCFTX0lTUkVHKGlub2RlLT5pX21vZGUpIHx8ICEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQlnb3RvIG91dF9wdXRmOworCisJZXJyb3IgPSAtRUlOVkFMOworCS8qIENhbm5vdCBmdHJ1bmNhdGUgb3ZlciAyXjMxIGJ5dGVzIHdpdGhvdXQgbGFyZ2UgZmlsZSBzdXBwb3J0ICovCisJaWYgKHNtYWxsICYmIGxlbmd0aCA+IE1BWF9OT05fTEZTKQorCQlnb3RvIG91dF9wdXRmOworCisJZXJyb3IgPSAtRVBFUk07CisJaWYgKElTX0FQUEVORChpbm9kZSkpCisJCWdvdG8gb3V0X3B1dGY7CisKKwllcnJvciA9IGxvY2tzX3ZlcmlmeV90cnVuY2F0ZShpbm9kZSwgZmlsZSwgbGVuZ3RoKTsKKwlpZiAoIWVycm9yKQorCQllcnJvciA9IGRvX3RydW5jYXRlKGRlbnRyeSwgbGVuZ3RoKTsKK291dF9wdXRmOgorCWZwdXQoZmlsZSk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCithc21saW5rYWdlIGxvbmcgc3lzX2Z0cnVuY2F0ZSh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGxvbmcgbGVuZ3RoKQoreworCXJldHVybiBkb19zeXNfZnRydW5jYXRlKGZkLCBsZW5ndGgsIDEpOworfQorCisvKiBMRlMgdmVyc2lvbnMgb2YgdHJ1bmNhdGUgYXJlIG9ubHkgbmVlZGVkIG9uIDMyIGJpdCBtYWNoaW5lcyAqLworI2lmIEJJVFNfUEVSX0xPTkcgPT0gMzIKK2FzbWxpbmthZ2UgbG9uZyBzeXNfdHJ1bmNhdGU2NChjb25zdCBjaGFyIF9fdXNlciAqIHBhdGgsIGxvZmZfdCBsZW5ndGgpCit7CisJcmV0dXJuIGRvX3N5c190cnVuY2F0ZShwYXRoLCBsZW5ndGgpOworfQorCithc21saW5rYWdlIGxvbmcgc3lzX2Z0cnVuY2F0ZTY0KHVuc2lnbmVkIGludCBmZCwgbG9mZl90IGxlbmd0aCkKK3sKKwlyZXR1cm4gZG9fc3lzX2Z0cnVuY2F0ZShmZCwgbGVuZ3RoLCAwKTsKK30KKyNlbmRpZgorCisjaWZkZWYgX19BUkNIX1dBTlRfU1lTX1VUSU1FCisKKy8qCisgKiBzeXNfdXRpbWUoKSBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdXNlci1sZXZlbCB1c2luZyBzeXNfdXRpbWVzKCkuCisgKiBJcyB0aGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eT8gIElmIHNvLCB3aHkgbm90IG1vdmUgaXQKKyAqIGludG8gdGhlIGFwcHJvcHJpYXRlIGFyY2ggZGlyZWN0b3J5IChmb3IgdGhvc2UgYXJjaGl0ZWN0dXJlcyB0aGF0CisgKiBuZWVkIGl0KS4KKyAqLworCisvKiBJZiB0aW1lcz09TlVMTCwgc2V0IGFjY2VzcyBhbmQgbW9kaWZpY2F0aW9uIHRvIGN1cnJlbnQgdGltZSwKKyAqIG11c3QgYmUgb3duZXIgb3IgaGF2ZSB3cml0ZSBwZXJtaXNzaW9uLgorICogRWxzZSwgdXBkYXRlIGZyb20gKnRpbWVzLCBtdXN0IGJlIG93bmVyIG9yIHN1cGVyIHVzZXIuCisgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfdXRpbWUoY2hhciBfX3VzZXIgKiBmaWxlbmFtZSwgc3RydWN0IHV0aW1idWYgX191c2VyICogdGltZXMpCit7CisJaW50IGVycm9yOworCXN0cnVjdCBuYW1laWRhdGEgbmQ7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJc3RydWN0IGlhdHRyIG5ld2F0dHJzOworCisJZXJyb3IgPSB1c2VyX3BhdGhfd2FsayhmaWxlbmFtZSwgJm5kKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCWlub2RlID0gbmQuZGVudHJ5LT5kX2lub2RlOworCisJZXJyb3IgPSAtRVJPRlM7CisJaWYgKElTX1JET05MWShpbm9kZSkpCisJCWdvdG8gZHB1dF9hbmRfb3V0OworCisJLyogRG9uJ3Qgd29ycnksIHRoZSBjaGVja3MgYXJlIGRvbmUgaW4gaW5vZGVfY2hhbmdlX29rKCkgKi8KKwluZXdhdHRycy5pYV92YWxpZCA9IEFUVFJfQ1RJTUUgfCBBVFRSX01USU1FIHwgQVRUUl9BVElNRTsKKwlpZiAodGltZXMpIHsKKwkJZXJyb3IgPSAtRVBFUk07CisJCWlmIChJU19BUFBFTkQoaW5vZGUpIHx8IElTX0lNTVVUQUJMRShpbm9kZSkpCisJCQlnb3RvIGRwdXRfYW5kX291dDsKKworCQllcnJvciA9IGdldF91c2VyKG5ld2F0dHJzLmlhX2F0aW1lLnR2X3NlYywgJnRpbWVzLT5hY3RpbWUpOworCQluZXdhdHRycy5pYV9hdGltZS50dl9uc2VjID0gMDsKKwkJaWYgKCFlcnJvcikgCisJCQllcnJvciA9IGdldF91c2VyKG5ld2F0dHJzLmlhX210aW1lLnR2X3NlYywgJnRpbWVzLT5tb2R0aW1lKTsKKwkJbmV3YXR0cnMuaWFfbXRpbWUudHZfbnNlYyA9IDA7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZHB1dF9hbmRfb3V0OworCisJCW5ld2F0dHJzLmlhX3ZhbGlkIHw9IEFUVFJfQVRJTUVfU0VUIHwgQVRUUl9NVElNRV9TRVQ7CisJfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnJvciA9IC1FQUNDRVM7CisgICAgICAgICAgICAgICAgaWYgKElTX0lNTVVUQUJMRShpbm9kZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGRwdXRfYW5kX291dDsKKworCQlpZiAoY3VycmVudC0+ZnN1aWQgIT0gaW5vZGUtPmlfdWlkICYmCisJCSAgICAoZXJyb3IgPSBwZXJtaXNzaW9uKGlub2RlLE1BWV9XUklURSwmbmQpKSAhPSAwKQorCQkJZ290byBkcHV0X2FuZF9vdXQ7CisJfQorCWRvd24oJmlub2RlLT5pX3NlbSk7CisJZXJyb3IgPSBub3RpZnlfY2hhbmdlKG5kLmRlbnRyeSwgJm5ld2F0dHJzKTsKKwl1cCgmaW5vZGUtPmlfc2VtKTsKK2RwdXRfYW5kX291dDoKKwlwYXRoX3JlbGVhc2UoJm5kKTsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKKyNlbmRpZgorCisvKiBJZiB0aW1lcz09TlVMTCwgc2V0IGFjY2VzcyBhbmQgbW9kaWZpY2F0aW9uIHRvIGN1cnJlbnQgdGltZSwKKyAqIG11c3QgYmUgb3duZXIgb3IgaGF2ZSB3cml0ZSBwZXJtaXNzaW9uLgorICogRWxzZSwgdXBkYXRlIGZyb20gKnRpbWVzLCBtdXN0IGJlIG93bmVyIG9yIHN1cGVyIHVzZXIuCisgKi8KK2xvbmcgZG9fdXRpbWVzKGNoYXIgX191c2VyICogZmlsZW5hbWUsIHN0cnVjdCB0aW1ldmFsICogdGltZXMpCit7CisJaW50IGVycm9yOworCXN0cnVjdCBuYW1laWRhdGEgbmQ7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJc3RydWN0IGlhdHRyIG5ld2F0dHJzOworCisJZXJyb3IgPSB1c2VyX3BhdGhfd2FsayhmaWxlbmFtZSwgJm5kKTsKKworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisJaW5vZGUgPSBuZC5kZW50cnktPmRfaW5vZGU7CisKKwllcnJvciA9IC1FUk9GUzsKKwlpZiAoSVNfUkRPTkxZKGlub2RlKSkKKwkJZ290byBkcHV0X2FuZF9vdXQ7CisKKwkvKiBEb24ndCB3b3JyeSwgdGhlIGNoZWNrcyBhcmUgZG9uZSBpbiBpbm9kZV9jaGFuZ2Vfb2soKSAqLworCW5ld2F0dHJzLmlhX3ZhbGlkID0gQVRUUl9DVElNRSB8IEFUVFJfTVRJTUUgfCBBVFRSX0FUSU1FOworCWlmICh0aW1lcykgeworCQllcnJvciA9IC1FUEVSTTsKKyAgICAgICAgICAgICAgICBpZiAoSVNfQVBQRU5EKGlub2RlKSB8fCBJU19JTU1VVEFCTEUoaW5vZGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBkcHV0X2FuZF9vdXQ7CisKKwkJbmV3YXR0cnMuaWFfYXRpbWUudHZfc2VjID0gdGltZXNbMF0udHZfc2VjOworCQluZXdhdHRycy5pYV9hdGltZS50dl9uc2VjID0gdGltZXNbMF0udHZfdXNlYyAqIDEwMDA7CisJCW5ld2F0dHJzLmlhX210aW1lLnR2X3NlYyA9IHRpbWVzWzFdLnR2X3NlYzsKKwkJbmV3YXR0cnMuaWFfbXRpbWUudHZfbnNlYyA9IHRpbWVzWzFdLnR2X3VzZWMgKiAxMDAwOworCQluZXdhdHRycy5pYV92YWxpZCB8PSBBVFRSX0FUSU1FX1NFVCB8IEFUVFJfTVRJTUVfU0VUOworCX0gZWxzZSB7CisJCWVycm9yID0gLUVBQ0NFUzsKKyAgICAgICAgICAgICAgICBpZiAoSVNfSU1NVVRBQkxFKGlub2RlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZHB1dF9hbmRfb3V0OworCisJCWlmIChjdXJyZW50LT5mc3VpZCAhPSBpbm9kZS0+aV91aWQgJiYKKwkJICAgIChlcnJvciA9IHBlcm1pc3Npb24oaW5vZGUsTUFZX1dSSVRFLCZuZCkpICE9IDApCisJCQlnb3RvIGRwdXRfYW5kX291dDsKKwl9CisJZG93bigmaW5vZGUtPmlfc2VtKTsKKwllcnJvciA9IG5vdGlmeV9jaGFuZ2UobmQuZGVudHJ5LCAmbmV3YXR0cnMpOworCXVwKCZpbm9kZS0+aV9zZW0pOworZHB1dF9hbmRfb3V0OgorCXBhdGhfcmVsZWFzZSgmbmQpOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworYXNtbGlua2FnZSBsb25nIHN5c191dGltZXMoY2hhciBfX3VzZXIgKiBmaWxlbmFtZSwgc3RydWN0IHRpbWV2YWwgX191c2VyICogdXRpbWVzKQoreworCXN0cnVjdCB0aW1ldmFsIHRpbWVzWzJdOworCisJaWYgKHV0aW1lcyAmJiBjb3B5X2Zyb21fdXNlcigmdGltZXMsIHV0aW1lcywgc2l6ZW9mKHRpbWVzKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiBkb191dGltZXMoZmlsZW5hbWUsIHV0aW1lcyA/IHRpbWVzIDogTlVMTCk7Cit9CisKKworLyoKKyAqIGFjY2VzcygpIG5lZWRzIHRvIHVzZSB0aGUgcmVhbCB1aWQvZ2lkLCBub3QgdGhlIGVmZmVjdGl2ZSB1aWQvZ2lkLgorICogV2UgZG8gdGhpcyBieSB0ZW1wb3JhcmlseSBjbGVhcmluZyBhbGwgRlMtcmVsYXRlZCBjYXBhYmlsaXRpZXMgYW5kCisgKiBzd2l0Y2hpbmcgdGhlIGZzdWlkL2ZzZ2lkIGFyb3VuZCB0byB0aGUgcmVhbCBvbmVzLgorICovCithc21saW5rYWdlIGxvbmcgc3lzX2FjY2Vzcyhjb25zdCBjaGFyIF9fdXNlciAqIGZpbGVuYW1lLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCWludCBvbGRfZnN1aWQsIG9sZF9mc2dpZDsKKwlrZXJuZWxfY2FwX3Qgb2xkX2NhcDsKKwlpbnQgcmVzOworCisJaWYgKG1vZGUgJiB+U19JUldYTykJLyogd2hlcmUncyBGX09LLCBYX09LLCBXX09LLCBSX09LPyAqLworCQlyZXR1cm4gLUVJTlZBTDsKKworCW9sZF9mc3VpZCA9IGN1cnJlbnQtPmZzdWlkOworCW9sZF9mc2dpZCA9IGN1cnJlbnQtPmZzZ2lkOworCW9sZF9jYXAgPSBjdXJyZW50LT5jYXBfZWZmZWN0aXZlOworCisJY3VycmVudC0+ZnN1aWQgPSBjdXJyZW50LT51aWQ7CisJY3VycmVudC0+ZnNnaWQgPSBjdXJyZW50LT5naWQ7CisKKwkvKgorCSAqIENsZWFyIHRoZSBjYXBhYmlsaXRpZXMgaWYgd2Ugc3dpdGNoIHRvIGEgbm9uLXJvb3QgdXNlcgorCSAqCisJICogRklYTUU6IFRoZXJlIGlzIGEgcmFjZSBoZXJlIGFnYWluc3Qgc3lzX2NhcHNldC4gIFRoZQorCSAqIGNhcGFiaWxpdGllcyBjYW4gY2hhbmdlIHlldCB3ZSB3aWxsIHJlc3RvcmUgdGhlIG9sZAorCSAqIHZhbHVlIGJlbG93LiAgV2Ugc2hvdWxkIGhvbGQgdGFza19jYXBhYmlsaXRpZXNfbG9jaywKKwkgKiBidXQgd2UgY2Fubm90IGJlY2F1c2UgdXNlcl9wYXRoX3dhbGsgY2FuIHNsZWVwLgorCSAqLworCWlmIChjdXJyZW50LT51aWQpCisJCWNhcF9jbGVhcihjdXJyZW50LT5jYXBfZWZmZWN0aXZlKTsKKwllbHNlCisJCWN1cnJlbnQtPmNhcF9lZmZlY3RpdmUgPSBjdXJyZW50LT5jYXBfcGVybWl0dGVkOworCisJcmVzID0gX191c2VyX3dhbGsoZmlsZW5hbWUsIExPT0tVUF9GT0xMT1d8TE9PS1VQX0FDQ0VTUywgJm5kKTsKKwlpZiAoIXJlcykgeworCQlyZXMgPSBwZXJtaXNzaW9uKG5kLmRlbnRyeS0+ZF9pbm9kZSwgbW9kZSwgJm5kKTsKKwkJLyogU3VTIHYyIHJlcXVpcmVzIHdlIHJlcG9ydCBhIHJlYWQgb25seSBmcyB0b28gKi8KKwkJaWYoIXJlcyAmJiAobW9kZSAmIFNfSVdPVEgpICYmIElTX1JET05MWShuZC5kZW50cnktPmRfaW5vZGUpCisJCSAgICYmICFzcGVjaWFsX2ZpbGUobmQuZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKQorCQkJcmVzID0gLUVST0ZTOworCQlwYXRoX3JlbGVhc2UoJm5kKTsKKwl9CisKKwljdXJyZW50LT5mc3VpZCA9IG9sZF9mc3VpZDsKKwljdXJyZW50LT5mc2dpZCA9IG9sZF9mc2dpZDsKKwljdXJyZW50LT5jYXBfZWZmZWN0aXZlID0gb2xkX2NhcDsKKworCXJldHVybiByZXM7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfY2hkaXIoY29uc3QgY2hhciBfX3VzZXIgKiBmaWxlbmFtZSkKK3sKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCWludCBlcnJvcjsKKworCWVycm9yID0gX191c2VyX3dhbGsoZmlsZW5hbWUsIExPT0tVUF9GT0xMT1d8TE9PS1VQX0RJUkVDVE9SWSwgJm5kKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCisJZXJyb3IgPSBwZXJtaXNzaW9uKG5kLmRlbnRyeS0+ZF9pbm9kZSxNQVlfRVhFQywmbmQpOworCWlmIChlcnJvcikKKwkJZ290byBkcHV0X2FuZF9vdXQ7CisKKwlzZXRfZnNfcHdkKGN1cnJlbnQtPmZzLCBuZC5tbnQsIG5kLmRlbnRyeSk7CisKK2RwdXRfYW5kX291dDoKKwlwYXRoX3JlbGVhc2UoJm5kKTsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfZmNoZGlyKHVuc2lnbmVkIGludCBmZCkKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udDsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IC1FQkFERjsKKwlmaWxlID0gZmdldChmZCk7CisJaWYgKCFmaWxlKQorCQlnb3RvIG91dDsKKworCWRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCW1udCA9IGZpbGUtPmZfdmZzbW50OworCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCisJZXJyb3IgPSAtRU5PVERJUjsKKwlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCWdvdG8gb3V0X3B1dGY7CisKKwllcnJvciA9IHBlcm1pc3Npb24oaW5vZGUsIE1BWV9FWEVDLCBOVUxMKTsKKwlpZiAoIWVycm9yKQorCQlzZXRfZnNfcHdkKGN1cnJlbnQtPmZzLCBtbnQsIGRlbnRyeSk7CitvdXRfcHV0ZjoKKwlmcHV0KGZpbGUpOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KKworYXNtbGlua2FnZSBsb25nIHN5c19jaHJvb3QoY29uc3QgY2hhciBfX3VzZXIgKiBmaWxlbmFtZSkKK3sKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCWludCBlcnJvcjsKKworCWVycm9yID0gX191c2VyX3dhbGsoZmlsZW5hbWUsIExPT0tVUF9GT0xMT1cgfCBMT09LVVBfRElSRUNUT1JZIHwgTE9PS1VQX05PQUxULCAmbmQpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IHBlcm1pc3Npb24obmQuZGVudHJ5LT5kX2lub2RlLE1BWV9FWEVDLCZuZCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGRwdXRfYW5kX291dDsKKworCWVycm9yID0gLUVQRVJNOworCWlmICghY2FwYWJsZShDQVBfU1lTX0NIUk9PVCkpCisJCWdvdG8gZHB1dF9hbmRfb3V0OworCisJc2V0X2ZzX3Jvb3QoY3VycmVudC0+ZnMsIG5kLm1udCwgbmQuZGVudHJ5KTsKKwlzZXRfZnNfYWx0cm9vdCgpOworCWVycm9yID0gMDsKK2RwdXRfYW5kX291dDoKKwlwYXRoX3JlbGVhc2UoJm5kKTsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfZmNobW9kKHVuc2lnbmVkIGludCBmZCwgbW9kZV90IG1vZGUpCit7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJc3RydWN0IGRlbnRyeSAqIGRlbnRyeTsKKwlzdHJ1Y3QgZmlsZSAqIGZpbGU7CisJaW50IGVyciA9IC1FQkFERjsKKwlzdHJ1Y3QgaWF0dHIgbmV3YXR0cnM7CisKKwlmaWxlID0gZmdldChmZCk7CisJaWYgKCFmaWxlKQorCQlnb3RvIG91dDsKKworCWRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCisJZXJyID0gLUVST0ZTOworCWlmIChJU19SRE9OTFkoaW5vZGUpKQorCQlnb3RvIG91dF9wdXRmOworCWVyciA9IC1FUEVSTTsKKwlpZiAoSVNfSU1NVVRBQkxFKGlub2RlKSB8fCBJU19BUFBFTkQoaW5vZGUpKQorCQlnb3RvIG91dF9wdXRmOworCWRvd24oJmlub2RlLT5pX3NlbSk7CisJaWYgKG1vZGUgPT0gKG1vZGVfdCkgLTEpCisJCW1vZGUgPSBpbm9kZS0+aV9tb2RlOworCW5ld2F0dHJzLmlhX21vZGUgPSAobW9kZSAmIFNfSUFMTFVHTykgfCAoaW5vZGUtPmlfbW9kZSAmIH5TX0lBTExVR08pOworCW5ld2F0dHJzLmlhX3ZhbGlkID0gQVRUUl9NT0RFIHwgQVRUUl9DVElNRTsKKwllcnIgPSBub3RpZnlfY2hhbmdlKGRlbnRyeSwgJm5ld2F0dHJzKTsKKwl1cCgmaW5vZGUtPmlfc2VtKTsKKworb3V0X3B1dGY6CisJZnB1dChmaWxlKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCithc21saW5rYWdlIGxvbmcgc3lzX2NobW9kKGNvbnN0IGNoYXIgX191c2VyICogZmlsZW5hbWUsIG1vZGVfdCBtb2RlKQoreworCXN0cnVjdCBuYW1laWRhdGEgbmQ7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJaW50IGVycm9yOworCXN0cnVjdCBpYXR0ciBuZXdhdHRyczsKKworCWVycm9yID0gdXNlcl9wYXRoX3dhbGsoZmlsZW5hbWUsICZuZCk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKwlpbm9kZSA9IG5kLmRlbnRyeS0+ZF9pbm9kZTsKKworCWVycm9yID0gLUVST0ZTOworCWlmIChJU19SRE9OTFkoaW5vZGUpKQorCQlnb3RvIGRwdXRfYW5kX291dDsKKworCWVycm9yID0gLUVQRVJNOworCWlmIChJU19JTU1VVEFCTEUoaW5vZGUpIHx8IElTX0FQUEVORChpbm9kZSkpCisJCWdvdG8gZHB1dF9hbmRfb3V0OworCisJZG93bigmaW5vZGUtPmlfc2VtKTsKKwlpZiAobW9kZSA9PSAobW9kZV90KSAtMSkKKwkJbW9kZSA9IGlub2RlLT5pX21vZGU7CisJbmV3YXR0cnMuaWFfbW9kZSA9IChtb2RlICYgU19JQUxMVUdPKSB8IChpbm9kZS0+aV9tb2RlICYgflNfSUFMTFVHTyk7CisJbmV3YXR0cnMuaWFfdmFsaWQgPSBBVFRSX01PREUgfCBBVFRSX0NUSU1FOworCWVycm9yID0gbm90aWZ5X2NoYW5nZShuZC5kZW50cnksICZuZXdhdHRycyk7CisJdXAoJmlub2RlLT5pX3NlbSk7CisKK2RwdXRfYW5kX291dDoKKwlwYXRoX3JlbGVhc2UoJm5kKTsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgY2hvd25fY29tbW9uKHN0cnVjdCBkZW50cnkgKiBkZW50cnksIHVpZF90IHVzZXIsIGdpZF90IGdyb3VwKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCWludCBlcnJvcjsKKwlzdHJ1Y3QgaWF0dHIgbmV3YXR0cnM7CisKKwllcnJvciA9IC1FTk9FTlQ7CisJaWYgKCEoaW5vZGUgPSBkZW50cnktPmRfaW5vZGUpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY2hvd25fY29tbW9uOiBOVUxMIGlub2RlXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCWVycm9yID0gLUVST0ZTOworCWlmIChJU19SRE9OTFkoaW5vZGUpKQorCQlnb3RvIG91dDsKKwllcnJvciA9IC1FUEVSTTsKKwlpZiAoSVNfSU1NVVRBQkxFKGlub2RlKSB8fCBJU19BUFBFTkQoaW5vZGUpKQorCQlnb3RvIG91dDsKKwluZXdhdHRycy5pYV92YWxpZCA9ICBBVFRSX0NUSU1FOworCWlmICh1c2VyICE9ICh1aWRfdCkgLTEpIHsKKwkJbmV3YXR0cnMuaWFfdmFsaWQgfD0gQVRUUl9VSUQ7CisJCW5ld2F0dHJzLmlhX3VpZCA9IHVzZXI7CisJfQorCWlmIChncm91cCAhPSAoZ2lkX3QpIC0xKSB7CisJCW5ld2F0dHJzLmlhX3ZhbGlkIHw9IEFUVFJfR0lEOworCQluZXdhdHRycy5pYV9naWQgPSBncm91cDsKKwl9CisJaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQluZXdhdHRycy5pYV92YWxpZCB8PSBBVFRSX0tJTExfU1VJRHxBVFRSX0tJTExfU0dJRDsKKwlkb3duKCZpbm9kZS0+aV9zZW0pOworCWVycm9yID0gbm90aWZ5X2NoYW5nZShkZW50cnksICZuZXdhdHRycyk7CisJdXAoJmlub2RlLT5pX3NlbSk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCithc21saW5rYWdlIGxvbmcgc3lzX2Nob3duKGNvbnN0IGNoYXIgX191c2VyICogZmlsZW5hbWUsIHVpZF90IHVzZXIsIGdpZF90IGdyb3VwKQoreworCXN0cnVjdCBuYW1laWRhdGEgbmQ7CisJaW50IGVycm9yOworCisJZXJyb3IgPSB1c2VyX3BhdGhfd2FsayhmaWxlbmFtZSwgJm5kKTsKKwlpZiAoIWVycm9yKSB7CisJCWVycm9yID0gY2hvd25fY29tbW9uKG5kLmRlbnRyeSwgdXNlciwgZ3JvdXApOworCQlwYXRoX3JlbGVhc2UoJm5kKTsKKwl9CisJcmV0dXJuIGVycm9yOworfQorCithc21saW5rYWdlIGxvbmcgc3lzX2xjaG93bihjb25zdCBjaGFyIF9fdXNlciAqIGZpbGVuYW1lLCB1aWRfdCB1c2VyLCBnaWRfdCBncm91cCkKK3sKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCWludCBlcnJvcjsKKworCWVycm9yID0gdXNlcl9wYXRoX3dhbGtfbGluayhmaWxlbmFtZSwgJm5kKTsKKwlpZiAoIWVycm9yKSB7CisJCWVycm9yID0gY2hvd25fY29tbW9uKG5kLmRlbnRyeSwgdXNlciwgZ3JvdXApOworCQlwYXRoX3JlbGVhc2UoJm5kKTsKKwl9CisJcmV0dXJuIGVycm9yOworfQorCisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfZmNob3duKHVuc2lnbmVkIGludCBmZCwgdWlkX3QgdXNlciwgZ2lkX3QgZ3JvdXApCit7CisJc3RydWN0IGZpbGUgKiBmaWxlOworCWludCBlcnJvciA9IC1FQkFERjsKKworCWZpbGUgPSBmZ2V0KGZkKTsKKwlpZiAoZmlsZSkgeworCQllcnJvciA9IGNob3duX2NvbW1vbihmaWxlLT5mX2RlbnRyeSwgdXNlciwgZ3JvdXApOworCQlmcHV0KGZpbGUpOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBOb3RlIHRoYXQgd2hpbGUgdGhlIGZsYWcgdmFsdWUgKGxvdyB0d28gYml0cykgZm9yIHN5c19vcGVuIG1lYW5zOgorICoJMDAgLSByZWFkLW9ubHkKKyAqCTAxIC0gd3JpdGUtb25seQorICoJMTAgLSByZWFkLXdyaXRlCisgKgkxMSAtIHNwZWNpYWwKKyAqIGl0IGlzIGNoYW5nZWQgaW50bworICoJMDAgLSBubyBwZXJtaXNzaW9ucyBuZWVkZWQKKyAqCTAxIC0gcmVhZC1wZXJtaXNzaW9uCisgKgkxMCAtIHdyaXRlLXBlcm1pc3Npb24KKyAqCTExIC0gcmVhZC13cml0ZQorICogZm9yIHRoZSBpbnRlcm5hbCByb3V0aW5lcyAoaWUgb3Blbl9uYW1laSgpL2ZvbGxvd19saW5rKCkgZXRjKS4gMDAgaXMKKyAqIHVzZWQgYnkgc3ltbGlua3MuCisgKi8KK3N0cnVjdCBmaWxlICpmaWxwX29wZW4oY29uc3QgY2hhciAqIGZpbGVuYW1lLCBpbnQgZmxhZ3MsIGludCBtb2RlKQoreworCWludCBuYW1laV9mbGFncywgZXJyb3I7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKworCW5hbWVpX2ZsYWdzID0gZmxhZ3M7CisJaWYgKChuYW1laV9mbGFncysxKSAmIE9fQUNDTU9ERSkKKwkJbmFtZWlfZmxhZ3MrKzsKKwlpZiAobmFtZWlfZmxhZ3MgJiBPX1RSVU5DKQorCQluYW1laV9mbGFncyB8PSAyOworCisJZXJyb3IgPSBvcGVuX25hbWVpKGZpbGVuYW1lLCBuYW1laV9mbGFncywgbW9kZSwgJm5kKTsKKwlpZiAoIWVycm9yKQorCQlyZXR1cm4gZGVudHJ5X29wZW4obmQuZGVudHJ5LCBuZC5tbnQsIGZsYWdzKTsKKworCXJldHVybiBFUlJfUFRSKGVycm9yKTsKK30KKworRVhQT1JUX1NZTUJPTChmaWxwX29wZW4pOworCitzdHJ1Y3QgZmlsZSAqZGVudHJ5X29wZW4oc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgdmZzbW91bnQgKm1udCwgaW50IGZsYWdzKQoreworCXN0cnVjdCBmaWxlICogZjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWludCBlcnJvcjsKKworCWVycm9yID0gLUVORklMRTsKKwlmID0gZ2V0X2VtcHR5X2ZpbHAoKTsKKwlpZiAoIWYpCisJCWdvdG8gY2xlYW51cF9kZW50cnk7CisJZi0+Zl9mbGFncyA9IGZsYWdzOworCWYtPmZfbW9kZSA9ICgoZmxhZ3MrMSkgJiBPX0FDQ01PREUpIHwgRk1PREVfTFNFRUsgfCBGTU9ERV9QUkVBRCB8IEZNT0RFX1BXUklURTsKKwlpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpZiAoZi0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJZXJyb3IgPSBnZXRfd3JpdGVfYWNjZXNzKGlub2RlKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBjbGVhbnVwX2ZpbGU7CisJfQorCisJZi0+Zl9tYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKKwlmLT5mX2RlbnRyeSA9IGRlbnRyeTsKKwlmLT5mX3Zmc21udCA9IG1udDsKKwlmLT5mX3BvcyA9IDA7CisJZi0+Zl9vcCA9IGZvcHNfZ2V0KGlub2RlLT5pX2ZvcCk7CisJZmlsZV9tb3ZlKGYsICZpbm9kZS0+aV9zYi0+c19maWxlcyk7CisKKwlpZiAoZi0+Zl9vcCAmJiBmLT5mX29wLT5vcGVuKSB7CisJCWVycm9yID0gZi0+Zl9vcC0+b3Blbihpbm9kZSxmKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBjbGVhbnVwX2FsbDsKKwl9CisJZi0+Zl9mbGFncyAmPSB+KE9fQ1JFQVQgfCBPX0VYQ0wgfCBPX05PQ1RUWSB8IE9fVFJVTkMpOworCisJZmlsZV9yYV9zdGF0ZV9pbml0KCZmLT5mX3JhLCBmLT5mX21hcHBpbmctPmhvc3QtPmlfbWFwcGluZyk7CisKKwkvKiBOQjogd2UncmUgc3VyZSB0byBoYXZlIGNvcnJlY3QgYV9vcHMgb25seSBhZnRlciBmX29wLT5vcGVuICovCisJaWYgKGYtPmZfZmxhZ3MgJiBPX0RJUkVDVCkgeworCQlpZiAoIWYtPmZfbWFwcGluZy0+YV9vcHMgfHwgIWYtPmZfbWFwcGluZy0+YV9vcHMtPmRpcmVjdF9JTykgeworCQkJZnB1dChmKTsKKwkJCWYgPSBFUlJfUFRSKC1FSU5WQUwpOworCQl9CisJfQorCisJcmV0dXJuIGY7CisKK2NsZWFudXBfYWxsOgorCWZvcHNfcHV0KGYtPmZfb3ApOworCWlmIChmLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJcHV0X3dyaXRlX2FjY2Vzcyhpbm9kZSk7CisJZmlsZV9raWxsKGYpOworCWYtPmZfZGVudHJ5ID0gTlVMTDsKKwlmLT5mX3Zmc21udCA9IE5VTEw7CitjbGVhbnVwX2ZpbGU6CisJcHV0X2ZpbHAoZik7CitjbGVhbnVwX2RlbnRyeToKKwlkcHV0KGRlbnRyeSk7CisJbW50cHV0KG1udCk7CisJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOworfQorCitFWFBPUlRfU1lNQk9MKGRlbnRyeV9vcGVuKTsKKworLyoKKyAqIEZpbmQgYW4gZW1wdHkgZmlsZSBkZXNjcmlwdG9yIGVudHJ5LCBhbmQgbWFyayBpdCBidXN5LgorICovCitpbnQgZ2V0X3VudXNlZF9mZCh2b2lkKQoreworCXN0cnVjdCBmaWxlc19zdHJ1Y3QgKiBmaWxlcyA9IGN1cnJlbnQtPmZpbGVzOworCWludCBmZCwgZXJyb3I7CisKKyAgCWVycm9yID0gLUVNRklMRTsKKwlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOworCityZXBlYXQ6CisgCWZkID0gZmluZF9uZXh0X3plcm9fYml0KGZpbGVzLT5vcGVuX2Zkcy0+ZmRzX2JpdHMsIAorCQkJCWZpbGVzLT5tYXhfZmRzZXQsIAorCQkJCWZpbGVzLT5uZXh0X2ZkKTsKKworCS8qCisJICogTi5CLiBGb3IgY2xvbmUgdGFza3Mgc2hhcmluZyBhIGZpbGVzIHN0cnVjdHVyZSwgdGhpcyB0ZXN0CisJICogd2lsbCBsaW1pdCB0aGUgdG90YWwgbnVtYmVyIG9mIGZpbGVzIHRoYXQgY2FuIGJlIG9wZW5lZC4KKwkgKi8KKwlpZiAoZmQgPj0gY3VycmVudC0+c2lnbmFsLT5ybGltW1JMSU1JVF9OT0ZJTEVdLnJsaW1fY3VyKQorCQlnb3RvIG91dDsKKworCS8qIERvIHdlIG5lZWQgdG8gZXhwYW5kIHRoZSBmZCBhcnJheSBvciBmZCBzZXQ/ICAqLworCWVycm9yID0gZXhwYW5kX2ZpbGVzKGZpbGVzLCBmZCk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CisKKwlpZiAoZXJyb3IpIHsKKwkJLyoKKwkgCSAqIElmIHdlIG5lZWRlZCB0byBleHBhbmQgdGhlIGZzIGFycmF5IHdlCisJCSAqIG1pZ2h0IGhhdmUgYmxvY2tlZCAtIHRyeSBhZ2Fpbi4KKwkJICovCisJCWVycm9yID0gLUVNRklMRTsKKwkJZ290byByZXBlYXQ7CisJfQorCisJRkRfU0VUKGZkLCBmaWxlcy0+b3Blbl9mZHMpOworCUZEX0NMUihmZCwgZmlsZXMtPmNsb3NlX29uX2V4ZWMpOworCWZpbGVzLT5uZXh0X2ZkID0gZmQgKyAxOworI2lmIDEKKwkvKiBTYW5pdHkgY2hlY2sgKi8KKwlpZiAoZmlsZXMtPmZkW2ZkXSAhPSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImdldF91bnVzZWRfZmQ6IHNsb3QgJWQgbm90IE5VTEwhXG4iLCBmZCk7CisJCWZpbGVzLT5mZFtmZF0gPSBOVUxMOworCX0KKyNlbmRpZgorCWVycm9yID0gZmQ7CisKK291dDoKKwlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJcmV0dXJuIGVycm9yOworfQorCitFWFBPUlRfU1lNQk9MKGdldF91bnVzZWRfZmQpOworCitzdGF0aWMgaW5saW5lIHZvaWQgX19wdXRfdW51c2VkX2ZkKHN0cnVjdCBmaWxlc19zdHJ1Y3QgKmZpbGVzLCB1bnNpZ25lZCBpbnQgZmQpCit7CisJX19GRF9DTFIoZmQsIGZpbGVzLT5vcGVuX2Zkcyk7CisJaWYgKGZkIDwgZmlsZXMtPm5leHRfZmQpCisJCWZpbGVzLT5uZXh0X2ZkID0gZmQ7Cit9CisKK3ZvaWQgZmFzdGNhbGwgcHV0X3VudXNlZF9mZCh1bnNpZ25lZCBpbnQgZmQpCit7CisJc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMgPSBjdXJyZW50LT5maWxlczsKKwlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOworCV9fcHV0X3VudXNlZF9mZChmaWxlcywgZmQpOworCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKK30KKworRVhQT1JUX1NZTUJPTChwdXRfdW51c2VkX2ZkKTsKKworLyoKKyAqIEluc3RhbGwgYSBmaWxlIHBvaW50ZXIgaW4gdGhlIGZkIGFycmF5LiAgCisgKgorICogVGhlIFZGUyBpcyBmdWxsIG9mIHBsYWNlcyB3aGVyZSB3ZSBkcm9wIHRoZSBmaWxlcyBsb2NrIGJldHdlZW4KKyAqIHNldHRpbmcgdGhlIG9wZW5fZmRzIGJpdG1hcCBhbmQgaW5zdGFsbGluZyB0aGUgZmlsZSBpbiB0aGUgZmlsZQorICogYXJyYXkuICBBdCBhbnkgc3VjaCBwb2ludCwgd2UgYXJlIHZ1bG5lcmFibGUgdG8gYSBkdXAyKCkgcmFjZQorICogaW5zdGFsbGluZyBhIGZpbGUgaW4gdGhlIGFycmF5IGJlZm9yZSB1cy4gIFdlIG5lZWQgdG8gZGV0ZWN0IHRoaXMgYW5kCisgKiBmcHV0KCkgdGhlIHN0cnVjdCBmaWxlIHdlIGFyZSBhYm91dCB0byBvdmVyd3JpdGUgaW4gdGhpcyBjYXNlLgorICoKKyAqIEl0IHNob3VsZCBuZXZlciBoYXBwZW4gLSBpZiB3ZSBhbGxvdyBkdXAyKCkgZG8gaXQsIF9yZWFsbHlfIGJhZCB0aGluZ3MKKyAqIHdpbGwgZm9sbG93LgorICovCisKK3ZvaWQgZmFzdGNhbGwgZmRfaW5zdGFsbCh1bnNpZ25lZCBpbnQgZmQsIHN0cnVjdCBmaWxlICogZmlsZSkKK3sKKwlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlcyA9IGN1cnJlbnQtPmZpbGVzOworCXNwaW5fbG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJaWYgKHVubGlrZWx5KGZpbGVzLT5mZFtmZF0gIT0gTlVMTCkpCisJCUJVRygpOworCWZpbGVzLT5mZFtmZF0gPSBmaWxlOworCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKK30KKworRVhQT1JUX1NZTUJPTChmZF9pbnN0YWxsKTsKKworYXNtbGlua2FnZSBsb25nIHN5c19vcGVuKGNvbnN0IGNoYXIgX191c2VyICogZmlsZW5hbWUsIGludCBmbGFncywgaW50IG1vZGUpCit7CisJY2hhciAqIHRtcDsKKwlpbnQgZmQsIGVycm9yOworCisjaWYgQklUU19QRVJfTE9ORyAhPSAzMgorCWZsYWdzIHw9IE9fTEFSR0VGSUxFOworI2VuZGlmCisJdG1wID0gZ2V0bmFtZShmaWxlbmFtZSk7CisJZmQgPSBQVFJfRVJSKHRtcCk7CisJaWYgKCFJU19FUlIodG1wKSkgeworCQlmZCA9IGdldF91bnVzZWRfZmQoKTsKKwkJaWYgKGZkID49IDApIHsKKwkJCXN0cnVjdCBmaWxlICpmID0gZmlscF9vcGVuKHRtcCwgZmxhZ3MsIG1vZGUpOworCQkJZXJyb3IgPSBQVFJfRVJSKGYpOworCQkJaWYgKElTX0VSUihmKSkKKwkJCQlnb3RvIG91dF9lcnJvcjsKKwkJCWZkX2luc3RhbGwoZmQsIGYpOworCQl9CitvdXQ6CisJCXB1dG5hbWUodG1wKTsKKwl9CisJcmV0dXJuIGZkOworCitvdXRfZXJyb3I6CisJcHV0X3VudXNlZF9mZChmZCk7CisJZmQgPSBlcnJvcjsKKwlnb3RvIG91dDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHN5c19vcGVuKTsKKworI2lmbmRlZiBfX2FscGhhX18KKworLyoKKyAqIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5PyAgTWF5YmUgdGhpcyBzaG91bGQgYmUgbW92ZWQKKyAqIGludG8gYXJjaC9pMzg2IGluc3RlYWQ/CisgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfY3JlYXQoY29uc3QgY2hhciBfX3VzZXIgKiBwYXRobmFtZSwgaW50IG1vZGUpCit7CisJcmV0dXJuIHN5c19vcGVuKHBhdGhuYW1lLCBPX0NSRUFUIHwgT19XUk9OTFkgfCBPX1RSVU5DLCBtb2RlKTsKK30KKworI2VuZGlmCisKKy8qCisgKiAiaWQiIGlzIHRoZSBQT1NJWCB0aHJlYWQgSUQuIFdlIHVzZSB0aGUKKyAqIGZpbGVzIHBvaW50ZXIgZm9yIHRoaXMuLgorICovCitpbnQgZmlscF9jbG9zZShzdHJ1Y3QgZmlsZSAqZmlscCwgZmxfb3duZXJfdCBpZCkKK3sKKwlpbnQgcmV0dmFsOworCisJLyogUmVwb3J0IGFuZCBjbGVhciBvdXRzdGFuZGluZyBlcnJvcnMgKi8KKwlyZXR2YWwgPSBmaWxwLT5mX2Vycm9yOworCWlmIChyZXR2YWwpCisJCWZpbHAtPmZfZXJyb3IgPSAwOworCisJaWYgKCFmaWxlX2NvdW50KGZpbHApKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBDbG9zZTogZmlsZSBjb3VudCBpcyAwXG4iKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwlpZiAoZmlscC0+Zl9vcCAmJiBmaWxwLT5mX29wLT5mbHVzaCkgeworCQlpbnQgZXJyID0gZmlscC0+Zl9vcC0+Zmx1c2goZmlscCk7CisJCWlmICghcmV0dmFsKQorCQkJcmV0dmFsID0gZXJyOworCX0KKworCWRub3RpZnlfZmx1c2goZmlscCwgaWQpOworCWxvY2tzX3JlbW92ZV9wb3NpeChmaWxwLCBpZCk7CisJZnB1dChmaWxwKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitFWFBPUlRfU1lNQk9MKGZpbHBfY2xvc2UpOworCisvKgorICogQ2FyZWZ1bCBoZXJlISBXZSB0ZXN0IHdoZXRoZXIgdGhlIGZpbGUgcG9pbnRlciBpcyBOVUxMIGJlZm9yZQorICogcmVsZWFzaW5nIHRoZSBmZC4gVGhpcyBlbnN1cmVzIHRoYXQgb25lIGNsb25lIHRhc2sgY2FuJ3QgcmVsZWFzZQorICogYW4gZmQgd2hpbGUgYW5vdGhlciBjbG9uZSBpcyBvcGVuaW5nIGl0LgorICovCithc21saW5rYWdlIGxvbmcgc3lzX2Nsb3NlKHVuc2lnbmVkIGludCBmZCkKK3sKKwlzdHJ1Y3QgZmlsZSAqIGZpbHA7CisJc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXMgPSBjdXJyZW50LT5maWxlczsKKworCXNwaW5fbG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJaWYgKGZkID49IGZpbGVzLT5tYXhfZmRzKQorCQlnb3RvIG91dF91bmxvY2s7CisJZmlscCA9IGZpbGVzLT5mZFtmZF07CisJaWYgKCFmaWxwKQorCQlnb3RvIG91dF91bmxvY2s7CisJZmlsZXMtPmZkW2ZkXSA9IE5VTEw7CisJRkRfQ0xSKGZkLCBmaWxlcy0+Y2xvc2Vfb25fZXhlYyk7CisJX19wdXRfdW51c2VkX2ZkKGZpbGVzLCBmZCk7CisJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCXJldHVybiBmaWxwX2Nsb3NlKGZpbHAsIGZpbGVzKTsKKworb3V0X3VubG9jazoKKwlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJcmV0dXJuIC1FQkFERjsKK30KKworRVhQT1JUX1NZTUJPTChzeXNfY2xvc2UpOworCisvKgorICogVGhpcyByb3V0aW5lIHNpbXVsYXRlcyBhIGhhbmd1cCBvbiB0aGUgdHR5LCB0byBhcnJhbmdlIHRoYXQgdXNlcnMKKyAqIGFyZSBnaXZlbiBjbGVhbiB0ZXJtaW5hbHMgYXQgbG9naW4gdGltZS4KKyAqLworYXNtbGlua2FnZSBsb25nIHN5c192aGFuZ3VwKHZvaWQpCit7CisJaWYgKGNhcGFibGUoQ0FQX1NZU19UVFlfQ09ORklHKSkgeworCQl0dHlfdmhhbmd1cChjdXJyZW50LT5zaWduYWwtPnR0eSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVQRVJNOworfQorCisvKgorICogQ2FsbGVkIHdoZW4gYW4gaW5vZGUgaXMgYWJvdXQgdG8gYmUgb3Blbi4KKyAqIFdlIHVzZSB0aGlzIHRvIGRpc2FsbG93IG9wZW5pbmcgbGFyZ2UgZmlsZXMgb24gMzJiaXQgc3lzdGVtcyBpZgorICogdGhlIGNhbGxlciBkaWRuJ3Qgc3BlY2lmeSBPX0xBUkdFRklMRS4gIE9uIDY0Yml0IHN5c3RlbXMgd2UgZm9yY2UKKyAqIG9uIHRoaXMgZmxhZyBpbiBzeXNfb3Blbi4KKyAqLworaW50IGdlbmVyaWNfZmlsZV9vcGVuKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisJaWYgKCEoZmlscC0+Zl9mbGFncyAmIE9fTEFSR0VGSUxFKSAmJiBpX3NpemVfcmVhZChpbm9kZSkgPiBNQVhfTk9OX0xGUykKKwkJcmV0dXJuIC1FRkJJRzsKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTChnZW5lcmljX2ZpbGVfb3Blbik7CisKKy8qCisgKiBUaGlzIGlzIHVzZWQgYnkgc3Vic3lzdGVtcyB0aGF0IGRvbid0IHdhbnQgc2Vla2FibGUKKyAqIGZpbGUgZGVzY3JpcHRvcnMKKyAqLworaW50IG5vbnNlZWthYmxlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJZmlscC0+Zl9tb2RlICY9IH4oRk1PREVfTFNFRUsgfCBGTU9ERV9QUkVBRCB8IEZNT0RFX1BXUklURSk7CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0wobm9uc2Vla2FibGVfb3Blbik7CmRpZmYgLS1naXQgYS9mcy9vcGVucHJvbWZzL01ha2VmaWxlIGIvZnMvb3BlbnByb21mcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTYzMTk5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvb3BlbnByb21mcy9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBTdW4gT3BlbnByb20gZmlsZXN5c3RlbSByb3V0aW5lcy4KKyMKKworb2JqLSQoQ09ORklHX1NVTl9PUEVOUFJPTUZTKSArPSBvcGVucHJvbWZzLm8KKworb3BlbnByb21mcy1vYmpzIDo9IGlub2RlLm8KZGlmZiAtLWdpdCBhL2ZzL29wZW5wcm9tZnMvaW5vZGUuYyBiL2ZzL29wZW5wcm9tZnMvaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmUxMWNlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvb3BlbnByb21mcy9pbm9kZS5jCkBAIC0wLDAgKzEsMTA5OCBAQAorLyogJElkOiBpbm9kZS5jLHYgMS4xNSAyMDAxLzExLzEyIDA5OjQzOjM5IGRhdmVtIEV4cCAkCisgKiBvcGVucHJvbWZzLmM6IC9wcm9jL29wZW5wcm9tIGhhbmRsaW5nIHJvdXRpbmVzCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgSmFrdWIgSmVsaW5layAgKGpha3ViQHJlZGhhdC5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDE5OTggICAgICBFZGRpZSBDLiBEb3N0ICAoZWNkQHNreW5ldC5iZSkKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L29wZW5wcm9tX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCisjaW5jbHVkZSA8YXNtL29wZW5wcm9tLmg+CisjaW5jbHVkZSA8YXNtL29wbGliLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBBTElBU0VTX05OT0RFUyA2NAorCit0eXBlZGVmIHN0cnVjdCB7CisJdTE2CXBhcmVudDsKKwl1MTYJbmV4dDsKKwl1MTYJY2hpbGQ7CisJdTE2CWZpcnN0X3Byb3A7CisJdTMyCW5vZGU7Cit9IG9wZW5wcm9tZnNfbm9kZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworI2RlZmluZSBPUFBfU1RSSU5HCTB4MTAKKyNkZWZpbmUgT1BQX1NUUklOR0xJU1QJMHgyMAorI2RlZmluZSBPUFBfQklOQVJZCTB4NDAKKyNkZWZpbmUgT1BQX0hFWFNUUklORwkweDgwCisjZGVmaW5lIE9QUF9ESVJUWQkweDAxCisjZGVmaW5lIE9QUF9RVU9URUQJMHgwMgorI2RlZmluZSBPUFBfTk9UUVVPVEVECTB4MDQKKyNkZWZpbmUgT1BQX0FTQ0lJWgkweDA4CisJdTMyCWZsYWc7CisJdTMyCWFsbG9jbGVuOworCXUzMglsZW47CisJY2hhcgkqdmFsdWU7CisJY2hhcgluYW1lWzhdOworfSBvcGVucHJvbV9wcm9wZXJ0eTsKKworc3RhdGljIG9wZW5wcm9tZnNfbm9kZSAqbm9kZXM7CitzdGF0aWMgaW50IGFsbG9jZWQ7CitzdGF0aWMgdTE2IGxhc3Rfbm9kZTsKK3N0YXRpYyB1MTYgZmlyc3RfcHJvcDsKK3N0YXRpYyB1MTYgb3B0aW9ucyA9IDB4ZmZmZjsKK3N0YXRpYyB1MTYgYWxpYXNlcyA9IDB4ZmZmZjsKK3N0YXRpYyBpbnQgYWxpYXNlc19ub2RlczsKK3N0YXRpYyBjaGFyICphbGlhc19uYW1lcyBbQUxJQVNFU19OTk9ERVNdOworCisjZGVmaW5lIE9QRU5QUk9NX1JPT1RfSU5PCTE2CisjZGVmaW5lIE9QRU5QUk9NX0ZJUlNUX0lOTwlPUEVOUFJPTV9ST09UX0lOTworI2RlZmluZSBOT0RFKGlubykgbm9kZXNbaW5vIC0gT1BFTlBST01fRklSU1RfSU5PXQorI2RlZmluZSBOT0RFMklOTyhub2RlKSAobm9kZSArIE9QRU5QUk9NX0ZJUlNUX0lOTykKKyNkZWZpbmUgTk9ERVAySU5PKG5vKSAobm8gKyBPUEVOUFJPTV9GSVJTVF9JTk8gKyBsYXN0X25vZGUpCisKK3N0YXRpYyBpbnQgb3BlbnByb21mc19jcmVhdGUgKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCwgc3RydWN0IG5hbWVpZGF0YSAqKTsKK3N0YXRpYyBpbnQgb3BlbnByb21mc19yZWFkZGlyKHN0cnVjdCBmaWxlICosIHZvaWQgKiwgZmlsbGRpcl90KTsKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpvcGVucHJvbWZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCk7CitzdGF0aWMgaW50IG9wZW5wcm9tZnNfdW5saW5rIChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKKworc3RhdGljIHNzaXplX3Qgbm9kZW51bV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwljaGFyIGJ1ZmZlclsxMF07CisJCisJaWYgKGNvdW50IDwgMCB8fCAhaW5vZGUtPnUuZ2VuZXJpY19pcCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc3ByaW50ZiAoYnVmZmVyLCAiJTguOHhcbiIsICh1MzIpKGxvbmcpKGlub2RlLT51LmdlbmVyaWNfaXApKTsKKwlpZiAoZmlsZS0+Zl9wb3MgPj0gOSkKKwkJcmV0dXJuIDA7CisJaWYgKGNvdW50ID4gOSAtIGZpbGUtPmZfcG9zKQorCQljb3VudCA9IDkgLSBmaWxlLT5mX3BvczsKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgYnVmZmVyICsgZmlsZS0+Zl9wb3MsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJKnBwb3MgKz0gY291bnQ7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBwcm9wZXJ0eV9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJaW50IGksIGosIGs7CisJdTMyIG5vZGU7CisJY2hhciAqcCwgKnM7CisJdTMyICpxOworCW9wZW5wcm9tX3Byb3BlcnR5ICpvcDsKKwljaGFyIGJ1ZmZlcls2NF07CisJCisJaWYgKCFmaWxwLT5wcml2YXRlX2RhdGEpIHsKKwkJbm9kZSA9IG5vZGVzWyh1MTYpKChsb25nKWlub2RlLT51LmdlbmVyaWNfaXApXS5ub2RlOworCQlpID0gKCh1MzIpKGxvbmcpaW5vZGUtPnUuZ2VuZXJpY19pcCkgPj4gMTY7CisJCWlmICgodTE2KSgobG9uZylpbm9kZS0+dS5nZW5lcmljX2lwKSA9PSBhbGlhc2VzKSB7CisJCQlpZiAoaSA+PSBhbGlhc2VzX25vZGVzKQorCQkJCXAgPSBOVUxMOworCQkJZWxzZQorCQkJCXAgPSBhbGlhc19uYW1lcyBbaV07CisJCX0gZWxzZQorCQkJZm9yIChwID0gcHJvbV9maXJzdHByb3AgKG5vZGUsIGJ1ZmZlcik7CisJCQkgICAgIGkgJiYgcCAmJiAqcDsKKwkJCSAgICAgcCA9IHByb21fbmV4dHByb3AgKG5vZGUsIHAsIGJ1ZmZlciksIGktLSkKKwkJCQkvKiBub3RoaW5nICovIDsKKwkJaWYgKCFwIHx8ICEqcCkKKwkJCXJldHVybiAtRUlPOworCQlpID0gcHJvbV9nZXRwcm9wbGVuIChub2RlLCBwKTsKKwkJaWYgKGkgPCAwKSB7CisJCQlpZiAoKHUxNikoKGxvbmcpaW5vZGUtPnUuZ2VuZXJpY19pcCkgPT0gYWxpYXNlcykKKwkJCQlpID0gMDsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlrID0gaTsKKwkJaWYgKGkgPCA2NCkgaSA9IDY0OworCQlmaWxwLT5wcml2YXRlX2RhdGEgPSBrbWFsbG9jIChzaXplb2YgKG9wZW5wcm9tX3Byb3BlcnR5KQorCQkJCQkgICAgICArIChqID0gc3RybGVuIChwKSkgKyAyICogaSwKKwkJCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJCWlmICghZmlscC0+cHJpdmF0ZV9kYXRhKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCW9wID0gKG9wZW5wcm9tX3Byb3BlcnR5ICopZmlscC0+cHJpdmF0ZV9kYXRhOworCQlvcC0+ZmxhZyA9IDA7CisJCW9wLT5hbGxvY2xlbiA9IDIgKiBpOworCQlzdHJjcHkgKG9wLT5uYW1lLCBwKTsKKwkJb3AtPnZhbHVlID0gKGNoYXIgKikoKCh1bnNpZ25lZCBsb25nKShvcC0+bmFtZSArIGogKyA0KSkgJiB+Myk7CisJCW9wLT5sZW4gPSBrOworCQlpZiAoayAmJiBwcm9tX2dldHByb3BlcnR5IChub2RlLCBwLCBvcC0+dmFsdWUsIGkpIDwgMCkKKwkJCXJldHVybiAtRUlPOworCQlvcC0+dmFsdWUgW2tdID0gMDsKKwkJaWYgKGspIHsKKwkJCWZvciAocyA9IE5VTEwsIHAgPSBvcC0+dmFsdWU7IHAgPCBvcC0+dmFsdWUgKyBrOyBwKyspIHsKKwkJCQlpZiAoKCpwID49ICcgJyAmJiAqcCA8PSAnficpIHx8ICpwID09ICdcbicpIHsKKwkJCQkJb3AtPmZsYWcgfD0gT1BQX1NUUklORzsKKwkJCQkJcyA9IHA7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlpZiAocCA+IG9wLT52YWx1ZSAmJiAhKnAgJiYgcyA9PSBwIC0gMSkgeworCQkJCQlpZiAocCA8IG9wLT52YWx1ZSArIGsgLSAxKQorCQkJCQkJb3AtPmZsYWcgfD0gT1BQX1NUUklOR0xJU1Q7CisJCQkJCWVsc2UKKwkJCQkJCW9wLT5mbGFnIHw9IE9QUF9BU0NJSVo7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlpZiAoayA9PSAxICYmICEqcCkgeworCQkJCQlvcC0+ZmxhZyB8PSAoT1BQX1NUUklOR3xPUFBfQVNDSUlaKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCW9wLT5mbGFnICY9IH4oT1BQX1NUUklOR3xPUFBfU1RSSU5HTElTVCk7CisJCQkJaWYgKGsgJiAzKQorCQkJCQlvcC0+ZmxhZyB8PSBPUFBfSEVYU1RSSU5HOworCQkJCWVsc2UKKwkJCQkJb3AtPmZsYWcgfD0gT1BQX0JJTkFSWTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChvcC0+ZmxhZyAmIE9QUF9TVFJJTkdMSVNUKQorCQkJCW9wLT5mbGFnICY9IH4oT1BQX1NUUklORyk7CisJCQlpZiAob3AtPmZsYWcgJiBPUFBfQVNDSUlaKQorCQkJCW9wLT5sZW4tLTsKKwkJfQorCX0gZWxzZQorCQlvcCA9IChvcGVucHJvbV9wcm9wZXJ0eSAqKWZpbHAtPnByaXZhdGVfZGF0YTsKKwlpZiAoIWNvdW50IHx8ICEob3AtPmxlbiB8fCAob3AtPmZsYWcgJiBPUFBfQVNDSUlaKSkpCisJCXJldHVybiAwOworCWlmICgqcHBvcyA+PSAweGZmZmZmZiB8fCBjb3VudCA+PSAweGZmZmZmZikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKG9wLT5mbGFnICYgT1BQX1NUUklOR0xJU1QpIHsKKwkJZm9yIChrID0gMCwgcCA9IG9wLT52YWx1ZTsgcCA8IG9wLT52YWx1ZSArIG9wLT5sZW47IHArKykKKwkJCWlmICghKnApCisJCQkJaysrOworCQlpID0gb3AtPmxlbiArIDQgKiBrICsgMzsKKwl9IGVsc2UgaWYgKG9wLT5mbGFnICYgT1BQX1NUUklORykgeworCQlpID0gb3AtPmxlbiArIDM7CisJfSBlbHNlIGlmIChvcC0+ZmxhZyAmIE9QUF9CSU5BUlkpIHsKKwkJaSA9IChvcC0+bGVuICogOSkgPj4gMjsKKwl9IGVsc2UgeworCQlpID0gKG9wLT5sZW4gPDwgMSkgKyAxOworCX0KKwlrID0gKnBwb3M7CisJaWYgKGsgPj0gaSkgcmV0dXJuIDA7CisJaWYgKGNvdW50ID4gaSAtIGspIGNvdW50ID0gaSAtIGs7CisJaWYgKG9wLT5mbGFnICYgT1BQX1NUUklORykgeworCQlpZiAoIWspIHsKKwkJCWlmIChwdXRfdXNlcignXCcnLCBidWYpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaysrOworCQkJY291bnQtLTsKKwkJfQorCisJCWlmIChrICsgY291bnQgPj0gaSAtIDIpCisJCQlqID0gaSAtIDIgLSBrOworCQllbHNlCisJCQlqID0gY291bnQ7CisKKwkJaWYgKGogPj0gMCkgeworCQkJaWYgKGNvcHlfdG9fdXNlcihidWYgKyBrIC0gKnBwb3MsCisJCQkJCSBvcC0+dmFsdWUgKyBrIC0gMSwgaikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQljb3VudCAtPSBqOworCQkJayArPSBqOworCQl9CisKKwkJaWYgKGNvdW50KSB7CisJCQlpZiAocHV0X3VzZXIoJ1wnJywgJmJ1ZiBbaysrIC0gKnBwb3NdKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlpZiAoY291bnQgPiAxKSB7CisJCQlpZiAocHV0X3VzZXIoJ1xuJywgJmJ1ZiBbaysrIC0gKnBwb3NdKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0gZWxzZSBpZiAob3AtPmZsYWcgJiBPUFBfU1RSSU5HTElTVCkgeworCQljaGFyICp0bXA7CisKKwkJdG1wID0ga21hbGxvYyAoaSwgR0ZQX0tFUk5FTCk7CisJCWlmICghdG1wKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJcyA9IHRtcDsKKwkJKnMrKyA9ICdcJyc7CisJCWZvciAocCA9IG9wLT52YWx1ZTsgcCA8IG9wLT52YWx1ZSArIG9wLT5sZW47IHArKykgeworCQkJaWYgKCEqcCkgeworCQkJCXN0cmNweShzLCAiJyArICciKTsKKwkJCQlzICs9IDU7CisJCQkJY29udGludWU7CisJCQl9CisJCQkqcysrID0gKnA7CisJCX0KKwkJc3RyY3B5KHMsICInXG4iKTsKKworCQlpZiAoY29weV90b191c2VyKGJ1ZiwgdG1wICsgaywgY291bnQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJa2ZyZWUodG1wKTsKKwkJayArPSBjb3VudDsKKworCX0gZWxzZSBpZiAob3AtPmZsYWcgJiBPUFBfQklOQVJZKSB7CisJCWNoYXIgYnVmZmVyWzEwXTsKKwkJdTMyICpmaXJzdCwgKmxhc3Q7CisJCWludCBmaXJzdF9vZmYsIGxhc3RfY250OworCisJCWZpcnN0ID0gKCh1MzIgKilvcC0+dmFsdWUpICsgayAvIDk7CisJCWZpcnN0X29mZiA9IGsgJSA5OworCQlsYXN0ID0gKCh1MzIgKilvcC0+dmFsdWUpICsgKGsgKyBjb3VudCAtIDEpIC8gOTsKKwkJbGFzdF9jbnQgPSAoayArIGNvdW50KSAlIDk7CisJCWlmICghbGFzdF9jbnQpIGxhc3RfY250ID0gOTsKKworCQlpZiAoZmlyc3QgPT0gbGFzdCkgeworCQkJc3ByaW50ZiAoYnVmZmVyLCAiJTA4eC4iLCAqZmlyc3QpOworCQkJaWYgKGNvcHlfdG9fdXNlcihidWYsIGJ1ZmZlciArIGZpcnN0X29mZiwKKwkJCQkJIGxhc3RfY250IC0gZmlyc3Rfb2ZmKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJ1ZiArPSBsYXN0X2NudCAtIGZpcnN0X29mZjsKKwkJfSBlbHNlIHsJCQorCQkJZm9yIChxID0gZmlyc3Q7IHEgPD0gbGFzdDsgcSsrKSB7CisJCQkJc3ByaW50ZiAoYnVmZmVyLCAiJTA4eC4iLCAqcSk7CisJCQkJaWYgKHEgPT0gZmlyc3QpIHsKKwkJCQkJaWYgKGNvcHlfdG9fdXNlcihidWYsIGJ1ZmZlciArIGZpcnN0X29mZiwKKwkJCQkJCQkgOSAtIGZpcnN0X29mZikpCisJCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQkJYnVmICs9IDkgLSBmaXJzdF9vZmY7CisJCQkJfSBlbHNlIGlmIChxID09IGxhc3QpIHsKKwkJCQkJaWYgKGNvcHlfdG9fdXNlcihidWYsIGJ1ZmZlciwgbGFzdF9jbnQpKQorCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCWJ1ZiArPSBsYXN0X2NudDsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoY29weV90b191c2VyKGJ1ZiwgYnVmZmVyLCA5KSkKKwkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQlidWYgKz0gOTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAobGFzdCA9PSAodTMyICopKG9wLT52YWx1ZSArIG9wLT5sZW4gLSA0KSAmJiBsYXN0X2NudCA9PSA5KSB7CisJCQlpZiAocHV0X3VzZXIoJ1xuJywgKGJ1ZiAtIDEpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCWsgKz0gY291bnQ7CisKKwl9IGVsc2UgaWYgKG9wLT5mbGFnICYgT1BQX0hFWFNUUklORykgeworCQljaGFyIGJ1ZmZlclszXTsKKworCQlpZiAoKGsgPCBpIC0gMSkgJiYgKGsgJiAxKSkgeworCQkJc3ByaW50ZiAoYnVmZmVyLCAiJTAyeCIsCisJCQkJICh1bnNpZ25lZCBjaGFyKSAqKG9wLT52YWx1ZSArIChrID4+IDEpKSAmIDB4ZmYpOworCQkJaWYgKHB1dF91c2VyKGJ1ZmZlclsxXSwgJmJ1ZltrKysgLSAqcHBvc10pKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJY291bnQtLTsKKwkJfQorCisJCWZvciAoOyAoY291bnQgPiAxKSAmJiAoayA8IGkgLSAxKTsgayArPSAyKSB7CisJCQlzcHJpbnRmIChidWZmZXIsICIlMDJ4IiwKKwkJCQkgKHVuc2lnbmVkIGNoYXIpICoob3AtPnZhbHVlICsgKGsgPj4gMSkpICYgMHhmZik7CisJCQlpZiAoY29weV90b191c2VyKGJ1ZiArIGsgLSAqcHBvcywgYnVmZmVyLCAyKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWNvdW50IC09IDI7CisJCX0KKworCQlpZiAoY291bnQgJiYgKGsgPCBpIC0gMSkpIHsKKwkJCXNwcmludGYgKGJ1ZmZlciwgIiUwMngiLAorCQkJCSAodW5zaWduZWQgY2hhcikgKihvcC0+dmFsdWUgKyAoayA+PiAxKSkgJiAweGZmKTsKKwkJCWlmIChwdXRfdXNlcihidWZmZXJbMF0sICZidWZbaysrIC0gKnBwb3NdKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWNvdW50LS07CisJCX0KKworCQlpZiAoY291bnQpIHsKKwkJCWlmIChwdXRfdXNlcignXG4nLCAmYnVmIFtrKysgLSAqcHBvc10pKQorCQkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfQorCWNvdW50ID0gayAtICpwcG9zOworCSpwcG9zID0gazsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHByb3BlcnR5X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IGksIGosIGs7CisJY2hhciAqcDsKKwl1MzIgKnE7CisJdm9pZCAqYjsKKwlvcGVucHJvbV9wcm9wZXJ0eSAqb3A7CisJCisJaWYgKCpwcG9zID49IDB4ZmZmZmZmIHx8IGNvdW50ID49IDB4ZmZmZmZmKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIWZpbHAtPnByaXZhdGVfZGF0YSkgeworCQlpID0gcHJvcGVydHlfcmVhZCAoZmlscCwgTlVMTCwgMCwgTlVMTCk7CisJCWlmIChpKQorCQkJcmV0dXJuIGk7CisJfQorCWsgPSAqcHBvczsKKwlvcCA9IChvcGVucHJvbV9wcm9wZXJ0eSAqKWZpbHAtPnByaXZhdGVfZGF0YTsKKwlpZiAoIShvcC0+ZmxhZyAmIE9QUF9TVFJJTkcpKSB7CisJCXUzMiAqZmlyc3QsICpsYXN0OworCQlpbnQgZmlyc3Rfb2ZmLCBsYXN0X2NudDsKKwkJdTMyIG1hc2ssIG1hc2syOworCQljaGFyIHRtcCBbOV07CisJCWludCBmb3JjZWxlbiA9IDA7CisJCQorCQlqID0gayAlIDk7CisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBqKyspIHsKKwkJCWlmIChqID09IDkpIGogPSAwOworCQkJaWYgKCFqKSB7CisJCQkJY2hhciBjdG1wOworCQkJCWlmIChnZXRfdXNlcihjdG1wLCAmYnVmW2ldKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKGN0bXAgIT0gJy4nKSB7CisJCQkJCWlmIChjdG1wICE9ICdcbicpIHsKKwkJCQkJCWlmIChvcC0+ZmxhZyAmIE9QUF9CSU5BUlkpCisJCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJCQllbHNlCisJCQkJCQkJZ290byB3cml0ZV90cnlfc3RyaW5nOworCQkJCQl9IGVsc2UgeworCQkJCQkJY291bnQgPSBpICsgMTsKKwkJCQkJCWZvcmNlbGVuID0gMTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQljaGFyIGN0bXA7CisJCQkJaWYgKGdldF91c2VyKGN0bXAsICZidWZbaV0pKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAoY3RtcCA8ICcwJyB8fCAKKwkJCQkgICAgKGN0bXAgPiAnOScgJiYgY3RtcCA8ICdBJykgfHwKKwkJCQkgICAgKGN0bXAgPiAnRicgJiYgY3RtcCA8ICdhJykgfHwKKwkJCQkgICAgY3RtcCA+ICdmJykgeworCQkJCQlpZiAob3AtPmZsYWcgJiBPUFBfQklOQVJZKQorCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJCWVsc2UKKwkJCQkJCWdvdG8gd3JpdGVfdHJ5X3N0cmluZzsKKwkJCQl9CisJCQl9CisJCX0KKwkJb3AtPmZsYWcgfD0gT1BQX0JJTkFSWTsKKwkJdG1wIFs4XSA9IDA7CisJCWkgPSAoKGNvdW50ICsgayArIDgpIC8gOSkgPDwgMjsKKwkJaWYgKG9wLT5hbGxvY2xlbiA8PSBpKSB7CisJCQliID0ga21hbGxvYyAoc2l6ZW9mIChvcGVucHJvbV9wcm9wZXJ0eSkgKyAyICogaSwKKwkJCQkgICAgIEdGUF9LRVJORUwpOworCQkJaWYgKCFiKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJbWVtY3B5IChiLCBmaWxwLT5wcml2YXRlX2RhdGEsCisJCQkJc2l6ZW9mIChvcGVucHJvbV9wcm9wZXJ0eSkKKwkJCQkrIHN0cmxlbiAob3AtPm5hbWUpICsgb3AtPmFsbG9jbGVuKTsKKwkJCW1lbXNldCAoKChjaGFyICopYikgKyBzaXplb2YgKG9wZW5wcm9tX3Byb3BlcnR5KQorCQkJCSsgc3RybGVuIChvcC0+bmFtZSkgKyBvcC0+YWxsb2NsZW4sIAorCQkJCTAsIDIgKiBpIC0gb3AtPmFsbG9jbGVuKTsKKwkJCW9wID0gKG9wZW5wcm9tX3Byb3BlcnR5ICopYjsKKwkJCW9wLT5hbGxvY2xlbiA9IDIqaTsKKwkJCWIgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJCQlmaWxwLT5wcml2YXRlX2RhdGEgPSAodm9pZCAqKW9wOworCQkJa2ZyZWUgKGIpOworCQl9CisJCWZpcnN0ID0gKCh1MzIgKilvcC0+dmFsdWUpICsgKGsgLyA5KTsKKwkJZmlyc3Rfb2ZmID0gayAlIDk7CisJCWxhc3QgPSAodTMyICopKG9wLT52YWx1ZSArIGkpOworCQlsYXN0X2NudCA9IChrICsgY291bnQpICUgOTsKKwkJaWYgKGZpcnN0ICsgMSA9PSBsYXN0KSB7CisJCQltZW1zZXQgKHRtcCwgJzAnLCA4KTsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcih0bXAgKyBmaXJzdF9vZmYsIGJ1ZiwKKwkJCQkJICAgKGNvdW50ICsgZmlyc3Rfb2ZmID4gOCkgPworCQkJCQkgICA4IC0gZmlyc3Rfb2ZmIDogY291bnQpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJbWFzayA9IDB4ZmZmZmZmZmY7CisJCQltYXNrMiA9IDB4ZmZmZmZmZmY7CisJCQlmb3IgKGogPSAwOyBqIDwgZmlyc3Rfb2ZmOyBqKyspCisJCQkJbWFzayA+Pj0gMTsKKwkJCWZvciAoaiA9IDggLSBjb3VudCAtIGZpcnN0X29mZjsgaiA+IDA7IGotLSkKKwkJCQltYXNrMiA8PD0gMTsKKwkJCW1hc2sgJj0gbWFzazI7CisJCQlpZiAobWFzaykgeworCQkJCSpmaXJzdCAmPSB+bWFzazsKKwkJCQkqZmlyc3QgfD0gc2ltcGxlX3N0cnRvdWwgKHRtcCwgTlVMTCwgMTYpOworCQkJCW9wLT5mbGFnIHw9IE9QUF9ESVJUWTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCW9wLT5mbGFnIHw9IE9QUF9ESVJUWTsKKwkJCWZvciAocSA9IGZpcnN0OyBxIDwgbGFzdDsgcSsrKSB7CisJCQkJaWYgKHEgPT0gZmlyc3QpIHsKKwkJCQkJaWYgKGZpcnN0X29mZiA8IDgpIHsKKwkJCQkJCW1lbXNldCAodG1wLCAnMCcsIDgpOworCQkJCQkJaWYgKGNvcHlfZnJvbV91c2VyKHRtcCArIGZpcnN0X29mZiwKKwkJCQkJCQkJICAgYnVmLAorCQkJCQkJCQkgICA4IC0gZmlyc3Rfb2ZmKSkKKwkJCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQkJCW1hc2sgPSAweGZmZmZmZmZmOworCQkJCQkJZm9yIChqID0gMDsgaiA8IGZpcnN0X29mZjsgaisrKQorCQkJCQkJCW1hc2sgPj49IDE7CisJCQkJCQkqcSAmPSB+bWFzazsKKwkJCQkJCSpxIHw9IHNpbXBsZV9zdHJ0b3VsICh0bXAsTlVMTCwxNik7CisJCQkJCX0KKwkJCQkJYnVmICs9IDk7CisJCQkJfSBlbHNlIGlmICgocSA9PSBsYXN0IC0gMSkgJiYgbGFzdF9jbnQKKwkJCQkJICAgJiYgKGxhc3RfY250IDwgOCkpIHsKKwkJCQkJbWVtc2V0ICh0bXAsICcwJywgOCk7CisJCQkJCWlmIChjb3B5X2Zyb21fdXNlcih0bXAsIGJ1ZiwgbGFzdF9jbnQpKQorCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCW1hc2sgPSAweGZmZmZmZmZmOworCQkJCQlmb3IgKGogPSAwOyBqIDwgOCAtIGxhc3RfY250OyBqKyspCisJCQkJCQltYXNrIDw8PSAxOworCQkJCQkqcSAmPSB+bWFzazsKKwkJCQkJKnEgfD0gc2ltcGxlX3N0cnRvdWwgKHRtcCwgTlVMTCwgMTYpOworCQkJCQlidWYgKz0gbGFzdF9jbnQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJY2hhciB0Y2hhcnNbMTddOyAvKiBYWFggeXVjay4uLiAqLworCisJCQkJCWlmIChjb3B5X2Zyb21fdXNlcih0Y2hhcnMsIGJ1ZiwgMTYpKQorCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCSpxID0gc2ltcGxlX3N0cnRvdWwgKHRjaGFycywgTlVMTCwgMTYpOworCQkJCQlidWYgKz0gOTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKCFmb3JjZWxlbikgeworCQkJaWYgKG9wLT5sZW4gPCBpKQorCQkJCW9wLT5sZW4gPSBpOworCQl9IGVsc2UKKwkJCW9wLT5sZW4gPSBpOworCQkqcHBvcyArPSBjb3VudDsKKwl9Cit3cml0ZV90cnlfc3RyaW5nOgorCWlmICghKG9wLT5mbGFnICYgT1BQX0JJTkFSWSkpIHsKKwkJaWYgKCEob3AtPmZsYWcgJiAoT1BQX1FVT1RFRCB8IE9QUF9OT1RRVU9URUQpKSkgeworCQkJY2hhciBjdG1wOworCisJCQkvKiBObyB3YXksIGlmIHNvbWVib2R5IHN0YXJ0cyB3cml0aW5nIGZyb20gdGhlIG1pZGRsZSwgCisJCQkgKiB3ZSBkb24ndCBrbm93IHdoZXRoZXIgaGUgdXNlcyBxdW90ZXMgYXJvdW5kIG9yIG5vdCAKKwkJCSAqLworCQkJaWYgKGsgPiAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKGdldF91c2VyKGN0bXAsIGJ1ZikpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoY3RtcCA9PSAnXCcnKSB7CisJCQkJb3AtPmZsYWcgfD0gT1BQX1FVT1RFRDsKKwkJCQlidWYrKzsKKwkJCQljb3VudC0tOworCQkJCSgqcHBvcykrKzsKKwkJCQlpZiAoIWNvdW50KSB7CisJCQkJCW9wLT5mbGFnIHw9IE9QUF9TVFJJTkc7CisJCQkJCXJldHVybiAxOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCW9wLT5mbGFnIHw9IE9QUF9OT1RRVU9URUQ7CisJCX0KKwkJb3AtPmZsYWcgfD0gT1BQX1NUUklORzsKKwkJaWYgKG9wLT5hbGxvY2xlbiA8PSBjb3VudCArICpwcG9zKSB7CisJCQliID0ga21hbGxvYyAoc2l6ZW9mIChvcGVucHJvbV9wcm9wZXJ0eSkKKwkJCQkgICAgICsgMiAqIChjb3VudCArICpwcG9zKSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWIpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQltZW1jcHkgKGIsIGZpbHAtPnByaXZhdGVfZGF0YSwKKwkJCQlzaXplb2YgKG9wZW5wcm9tX3Byb3BlcnR5KQorCQkJCSsgc3RybGVuIChvcC0+bmFtZSkgKyBvcC0+YWxsb2NsZW4pOworCQkJbWVtc2V0ICgoKGNoYXIgKiliKSArIHNpemVvZiAob3BlbnByb21fcHJvcGVydHkpCisJCQkJKyBzdHJsZW4gKG9wLT5uYW1lKSArIG9wLT5hbGxvY2xlbiwgCisJCQkJMCwgMiooY291bnQgLSAqcHBvcykgLSBvcC0+YWxsb2NsZW4pOworCQkJb3AgPSAob3BlbnByb21fcHJvcGVydHkgKiliOworCQkJb3AtPmFsbG9jbGVuID0gMiooY291bnQgKyAqcHBvcyk7CisJCQliID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCQkJZmlscC0+cHJpdmF0ZV9kYXRhID0gKHZvaWQgKilvcDsKKwkJCWtmcmVlIChiKTsKKwkJfQorCQlwID0gb3AtPnZhbHVlICsgKnBwb3MgLSAoKG9wLT5mbGFnICYgT1BQX1FVT1RFRCkgPyAxIDogMCk7CisJCWlmIChjb3B5X2Zyb21fdXNlcihwLCBidWYsIGNvdW50KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlvcC0+ZmxhZyB8PSBPUFBfRElSVFk7CisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBwKyspCisJCQlpZiAoKnAgPT0gJ1xuJykgeworCQkJCSpwID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJaWYgKGkgPCBjb3VudCkgeworCQkJb3AtPmxlbiA9IHAgLSBvcC0+dmFsdWU7CisJCQkqcHBvcyArPSBpICsgMTsKKwkJCWlmICgocCA+IG9wLT52YWx1ZSkgJiYgKG9wLT5mbGFnICYgT1BQX1FVT1RFRCkKKwkJCSAgICAmJiAoKihwIC0gMSkgPT0gJ1wnJykpCisJCQkJb3AtPmxlbi0tOworCQl9IGVsc2UgeworCQkJaWYgKHAgLSBvcC0+dmFsdWUgPiBvcC0+bGVuKQorCQkJCW9wLT5sZW4gPSBwIC0gb3AtPnZhbHVlOworCQkJKnBwb3MgKz0gY291bnQ7CisJCX0KKwl9CisJcmV0dXJuICpwcG9zIC0gazsKK30KKworaW50IHByb3BlcnR5X3JlbGVhc2UgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCW9wZW5wcm9tX3Byb3BlcnR5ICpvcCA9IChvcGVucHJvbV9wcm9wZXJ0eSAqKWZpbHAtPnByaXZhdGVfZGF0YTsKKwlpbnQgZXJyb3I7CisJdTMyIG5vZGU7CisJCisJaWYgKCFvcCkKKwkJcmV0dXJuIDA7CisJbG9ja19rZXJuZWwoKTsKKwlub2RlID0gbm9kZXNbKHUxNikoKGxvbmcpaW5vZGUtPnUuZ2VuZXJpY19pcCldLm5vZGU7CisJaWYgKCh1MTYpKChsb25nKWlub2RlLT51LmdlbmVyaWNfaXApID09IGFsaWFzZXMpIHsKKwkJaWYgKChvcC0+ZmxhZyAmIE9QUF9ESVJUWSkgJiYgKG9wLT5mbGFnICYgT1BQX1NUUklORykpIHsKKwkJCWNoYXIgKnAgPSBvcC0+bmFtZTsKKwkJCWludCBpID0gKG9wLT52YWx1ZSAtIG9wLT5uYW1lKSAtIHN0cmxlbiAob3AtPm5hbWUpIC0gMTsKKwkJCW9wLT52YWx1ZSBbb3AtPmxlbl0gPSAwOworCQkJKihvcC0+dmFsdWUgLSAxKSA9ICcgJzsKKwkJCWlmIChpKSB7CisJCQkJZm9yIChwID0gb3AtPnZhbHVlIC0gaSAtIDI7IHAgPj0gb3AtPm5hbWU7IHAtLSkKKwkJCQkJcFtpXSA9ICpwOworCQkJCXAgPSBvcC0+bmFtZSArIGk7CisJCQl9CisJCQltZW1jcHkgKHAgLSA4LCAibnZhbGlhcyAiLCA4KTsKKwkJCXByb21fZmV2YWwgKHAgLSA4KTsKKwkJfQorCX0gZWxzZSBpZiAob3AtPmZsYWcgJiBPUFBfRElSVFkpIHsKKwkJaWYgKG9wLT5mbGFnICYgT1BQX1NUUklORykgeworCQkJb3AtPnZhbHVlIFtvcC0+bGVuXSA9IDA7CisJCQllcnJvciA9IHByb21fc2V0cHJvcCAobm9kZSwgb3AtPm5hbWUsCisJCQkJCSAgICAgIG9wLT52YWx1ZSwgb3AtPmxlbiArIDEpOworCQkJaWYgKGVycm9yIDw9IDApCisJCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIm9wZW5wcm9tZnM6ICIKKwkJCQkJIkNvdWxkbid0IHdyaXRlIHByb3BlcnR5ICVzXG4iLAorCQkJCQlvcC0+bmFtZSk7CisJCX0gZWxzZSBpZiAoKG9wLT5mbGFnICYgT1BQX0JJTkFSWSkgfHwgIW9wLT5sZW4pIHsKKwkJCWVycm9yID0gcHJvbV9zZXRwcm9wIChub2RlLCBvcC0+bmFtZSwKKwkJCQkJICAgICAgb3AtPnZhbHVlLCBvcC0+bGVuKTsKKwkJCWlmIChlcnJvciA8PSAwKQorCQkJCXByaW50ayAoS0VSTl9XQVJOSU5HICJvcGVucHJvbWZzOiAiCisJCQkJCSJDb3VsZG4ndCB3cml0ZSBwcm9wZXJ0eSAlc1xuIiwKKwkJCQkJb3AtPm5hbWUpOworCQl9IGVsc2UgeworCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIm9wZW5wcm9tZnM6ICIKKwkJCQkiVW5rbm93biBwcm9wZXJ0eSB0eXBlIG9mICVzXG4iLAorCQkJCW9wLT5uYW1lKTsKKwkJfQorCX0KKwl1bmxvY2tfa2VybmVsKCk7CisJa2ZyZWUgKGZpbHAtPnByaXZhdGVfZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG9wZW5wcm9tZnNfcHJvcF9vcHMgPSB7CisJLnJlYWQJCT0gcHJvcGVydHlfcmVhZCwKKwkud3JpdGUJCT0gcHJvcGVydHlfd3JpdGUsCisJLnJlbGVhc2UJPSBwcm9wZXJ0eV9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgb3BlbnByb21mc19ub2RlbnVtX29wcyA9IHsKKwkucmVhZAkJPSBub2RlbnVtX3JlYWQsCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBvcGVucHJvbV9vcGVyYXRpb25zID0geworCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIJPSBvcGVucHJvbWZzX3JlYWRkaXIsCit9OworCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgb3BlbnByb21fYWxpYXNfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkuY3JlYXRlCQk9IG9wZW5wcm9tZnNfY3JlYXRlLAorCS5sb29rdXAJCT0gb3BlbnByb21mc19sb29rdXAsCisJLnVubGluawkJPSBvcGVucHJvbWZzX3VubGluaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBvcGVucHJvbV9pbm9kZV9vcGVyYXRpb25zID0geworCS5sb29rdXAJCT0gb3BlbnByb21mc19sb29rdXAsCit9OworCitzdGF0aWMgaW50IGxvb2t1cF9jaGlsZHJlbih1MTYgbiwgY29uc3QgY2hhciAqIG5hbWUsIGludCBsZW4pCit7CisJaW50IHJldDsKKwl1MTYgbm9kZTsKKwlmb3IgKDsgbiAhPSAweGZmZmY7IG4gPSBub2Rlc1tuXS5uZXh0KSB7CisJCW5vZGUgPSBub2Rlc1tuXS5jaGlsZDsKKwkJaWYgKG5vZGUgIT0gMHhmZmZmKSB7CisJCQljaGFyIGJ1ZmZlclsxMjhdOworCQkJaW50IGk7CisJCQljaGFyICpwOworCQkJCisJCQl3aGlsZSAobm9kZSAhPSAweGZmZmYpIHsKKwkJCQlpZiAocHJvbV9nZXRuYW1lIChub2Rlc1tub2RlXS5ub2RlLAorCQkJCQkJICBidWZmZXIsIDEyOCkgPj0gMCkgeworCQkJCQlpID0gc3RybGVuIChidWZmZXIpOworCQkJCQlpZiAoKGxlbiA9PSBpKQorCQkJCQkgICAgJiYgIXN0cm5jbXAgKGJ1ZmZlciwgbmFtZSwgbGVuKSkKKwkJCQkJCXJldHVybiBOT0RFMklOTyhub2RlKTsKKwkJCQkJcCA9IHN0cmNociAoYnVmZmVyLCAnQCcpOworCQkJCQlpZiAocCAmJiAobGVuID09IHAgLSBidWZmZXIpCisJCQkJCSAgICAmJiAhc3RybmNtcCAoYnVmZmVyLCBuYW1lLCBsZW4pKQorCQkJCQkJcmV0dXJuIE5PREUySU5PKG5vZGUpOworCQkJCX0KKwkJCQlub2RlID0gbm9kZXNbbm9kZV0ubmV4dDsKKwkJCX0KKwkJfSBlbHNlCisJCQljb250aW51ZTsKKwkJcmV0ID0gbG9va3VwX2NoaWxkcmVuIChub2Rlc1tuXS5jaGlsZCwgbmFtZSwgbGVuKTsKKwkJaWYgKHJldCkgcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpvcGVucHJvbWZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaW50IGlubyA9IDA7CisjZGVmaW5lIE9QRlNMX0RJUgkwCisjZGVmaW5lIE9QRlNMX1BST1BFUlRZCTEKKyNkZWZpbmUgT1BGU0xfTk9ERU5VTQkyCisJaW50IHR5cGUgPSAwOworCWNoYXIgYnVmZmVyWzEyOF07CisJY2hhciAqcDsKKwljb25zdCBjaGFyICpuYW1lOworCXUzMiBuOworCXUxNiBkaXJub2RlOworCXVuc2lnbmVkIGludCBsZW47CisJaW50IGk7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwljaGFyIGJ1ZmZlcjJbNjRdOworCQorCWlub2RlID0gTlVMTDsKKwluYW1lID0gZGVudHJ5LT5kX25hbWUubmFtZTsKKwlsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisJbG9ja19rZXJuZWwoKTsKKwlpZiAobmFtZSBbMF0gPT0gJy4nICYmIGxlbiA9PSA1ICYmICFzdHJuY21wIChuYW1lICsgMSwgIm5vZGUiLCA0KSkgeworCQlpbm8gPSBOT0RFUDJJTk8oTk9ERShkaXItPmlfaW5vKS5maXJzdF9wcm9wKTsKKwkJdHlwZSA9IE9QRlNMX05PREVOVU07CisJfQorCWlmICghaW5vKSB7CisJCXUxNiBub2RlID0gTk9ERShkaXItPmlfaW5vKS5jaGlsZDsKKwkJd2hpbGUgKG5vZGUgIT0gMHhmZmZmKSB7CisJCQlpZiAocHJvbV9nZXRuYW1lIChub2Rlc1tub2RlXS5ub2RlLCBidWZmZXIsIDEyOCkgPj0gMCkgeworCQkJCWkgPSBzdHJsZW4gKGJ1ZmZlcik7CisJCQkJaWYgKGxlbiA9PSBpICYmICFzdHJuY21wIChidWZmZXIsIG5hbWUsIGxlbikpIHsKKwkJCQkJaW5vID0gTk9ERTJJTk8obm9kZSk7CisJCQkJCXR5cGUgPSBPUEZTTF9ESVI7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlwID0gc3RyY2hyIChidWZmZXIsICdAJyk7CisJCQkJaWYgKHAgJiYgKGxlbiA9PSBwIC0gYnVmZmVyKQorCQkJCSAgICAmJiAhc3RybmNtcCAoYnVmZmVyLCBuYW1lLCBsZW4pKSB7CisJCQkJCWlubyA9IE5PREUySU5PKG5vZGUpOworCQkJCQl0eXBlID0gT1BGU0xfRElSOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlub2RlID0gbm9kZXNbbm9kZV0ubmV4dDsKKwkJfQorCX0KKwluID0gTk9ERShkaXItPmlfaW5vKS5ub2RlOworCWRpcm5vZGUgPSBkaXItPmlfaW5vIC0gT1BFTlBST01fRklSU1RfSU5POworCWlmICghaW5vKSB7CisJCWludCBqID0gTk9ERVAySU5PKE5PREUoZGlyLT5pX2lubykuZmlyc3RfcHJvcCk7CisJCWlmIChkaXJub2RlICE9IGFsaWFzZXMpIHsKKwkJCWZvciAocCA9IHByb21fZmlyc3Rwcm9wIChuLCBidWZmZXIyKTsKKwkJCSAgICAgcCAmJiAqcDsKKwkJCSAgICAgcCA9IHByb21fbmV4dHByb3AgKG4sIHAsIGJ1ZmZlcjIpKSB7CisJCQkJaisrOworCQkJCWlmICgobGVuID09IHN0cmxlbiAocCkpCisJCQkJICAgICYmICFzdHJuY21wIChwLCBuYW1lLCBsZW4pKSB7CisJCQkJCWlubyA9IGo7CisJCQkJCXR5cGUgPSBPUEZTTF9QUk9QRVJUWTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJaW50IGs7CisJCQlmb3IgKGsgPSAwOyBrIDwgYWxpYXNlc19ub2RlczsgaysrKSB7CisJCQkJaisrOworCQkJCWlmIChhbGlhc19uYW1lcyBba10KKwkJCQkgICAgJiYgKGxlbiA9PSBzdHJsZW4gKGFsaWFzX25hbWVzIFtrXSkpCisJCQkJICAgICYmICFzdHJuY21wIChhbGlhc19uYW1lcyBba10sIG5hbWUsIGxlbikpIHsKKwkJCQkJaW5vID0gajsKKwkJCQkJdHlwZSA9IE9QRlNMX1BST1BFUlRZOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYgKCFpbm8pIHsKKwkJaW5vID0gbG9va3VwX2NoaWxkcmVuIChOT0RFKGRpci0+aV9pbm8pLmNoaWxkLCBuYW1lLCBsZW4pOworCQlpZiAoaW5vKQorCQkJdHlwZSA9IE9QRlNMX0RJUjsKKwkJZWxzZSB7CisJCQl1bmxvY2tfa2VybmVsKCk7CisJCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKKwkJfQorCX0KKwlpbm9kZSA9IGlnZXQgKGRpci0+aV9zYiwgaW5vKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJaWYgKCFpbm9kZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBPUEZTTF9ESVI6CisJCWlub2RlLT5pX21vZGUgPSBTX0lGRElSIHwgU19JUlVHTyB8IFNfSVhVR087CisJCWlmIChpbm8gPT0gT1BFTlBST01fRklSU1RfSU5PICsgYWxpYXNlcykgeworCQkJaW5vZGUtPmlfbW9kZSB8PSBTX0lXVVNSOworCQkJaW5vZGUtPmlfb3AgPSAmb3BlbnByb21fYWxpYXNfaW5vZGVfb3BlcmF0aW9uczsKKwkJfSBlbHNlCisJCQlpbm9kZS0+aV9vcCA9ICZvcGVucHJvbV9pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9mb3AgPSAmb3BlbnByb21fb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfbmxpbmsgPSAyOworCQlicmVhazsKKwljYXNlIE9QRlNMX05PREVOVU06CisJCWlub2RlLT5pX21vZGUgPSBTX0lGUkVHIHwgU19JUlVHTzsKKwkJaW5vZGUtPmlfZm9wID0gJm9wZW5wcm9tZnNfbm9kZW51bV9vcHM7CisJCWlub2RlLT5pX25saW5rID0gMTsKKwkJaW5vZGUtPnUuZ2VuZXJpY19pcCA9ICh2b2lkICopKGxvbmcpKG4pOworCQlicmVhazsKKwljYXNlIE9QRlNMX1BST1BFUlRZOgorCQlpZiAoKGRpcm5vZGUgPT0gb3B0aW9ucykgJiYgKGxlbiA9PSAxNykKKwkJICAgICYmICFzdHJuY21wIChuYW1lLCAic2VjdXJpdHktcGFzc3dvcmQiLCAxNykpCisJCQlpbm9kZS0+aV9tb2RlID0gU19JRlJFRyB8IFNfSVJVU1IgfCBTX0lXVVNSOworCQllbHNlIHsKKwkJCWlub2RlLT5pX21vZGUgPSBTX0lGUkVHIHwgU19JUlVHTzsKKwkJCWlmIChkaXJub2RlID09IG9wdGlvbnMgfHwgZGlybm9kZSA9PSBhbGlhc2VzKSB7CisJCQkJaWYgKGxlbiAhPSA0IHx8IHN0cm5jbXAgKG5hbWUsICJuYW1lIiwgNCkpCisJCQkJCWlub2RlLT5pX21vZGUgfD0gU19JV1VTUjsKKwkJCX0KKwkJfQorCQlpbm9kZS0+aV9mb3AgPSAmb3BlbnByb21mc19wcm9wX29wczsKKwkJaW5vZGUtPmlfbmxpbmsgPSAxOworCQlpZiAoaW5vZGUtPmlfc2l6ZSA8IDApCisJCQlpbm9kZS0+aV9zaXplID0gMDsKKwkJaW5vZGUtPnUuZ2VuZXJpY19pcCA9ICh2b2lkICopKGxvbmcpKCgodTE2KWRpcm5vZGUpIHwgCisJCQkoKCh1MTYpKGlubyAtIE5PREVQMklOTyhOT0RFKGRpci0+aV9pbm8pLmZpcnN0X3Byb3ApIC0gMSkpIDw8IDE2KSk7CisJCWJyZWFrOworCX0KKworCWlub2RlLT5pX2dpZCA9IDA7CisJaW5vZGUtPmlfdWlkID0gMDsKKworCWRfYWRkKGRlbnRyeSwgaW5vZGUpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IG9wZW5wcm9tZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqIGZpbHAsIHZvaWQgKiBkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwl1bnNpZ25lZCBpbnQgaW5vOworCXUzMiBuOworCWludCBpLCBqOworCWNoYXIgYnVmZmVyWzEyOF07CisJdTE2IG5vZGU7CisJY2hhciAqcDsKKwljaGFyIGJ1ZmZlcjJbNjRdOworCisJbG9ja19rZXJuZWwoKTsKKwkKKwlpbm8gPSBpbm9kZS0+aV9pbm87CisJaSA9IGZpbHAtPmZfcG9zOworCXN3aXRjaCAoaSkgeworCWNhc2UgMDoKKwkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLiIsIDEsIGksIGlubywgRFRfRElSKSA8IDApIGdvdG8gb3V0OworCQlpKys7CisJCWZpbHAtPmZfcG9zKys7CisJCS8qIGZhbGwgdGhydSAqLworCWNhc2UgMToKKwkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLi4iLCAyLCBpLCAKKwkJCShOT0RFKGlubykucGFyZW50ID09IDB4ZmZmZikgPyAKKwkJCU9QRU5QUk9NX1JPT1RfSU5PIDogTk9ERTJJTk8oTk9ERShpbm8pLnBhcmVudCksIERUX0RJUikgPCAwKSAKKwkJCWdvdG8gb3V0OworCQlpKys7CisJCWZpbHAtPmZfcG9zKys7CisJCS8qIGZhbGwgdGhydSAqLworCWRlZmF1bHQ6CisJCWkgLT0gMjsKKwkJbm9kZSA9IE5PREUoaW5vKS5jaGlsZDsKKwkJd2hpbGUgKGkgJiYgbm9kZSAhPSAweGZmZmYpIHsKKwkJCW5vZGUgPSBub2Rlc1tub2RlXS5uZXh0OworCQkJaS0tOworCQl9CisJCXdoaWxlIChub2RlICE9IDB4ZmZmZikgeworCQkJaWYgKHByb21fZ2V0bmFtZSAobm9kZXNbbm9kZV0ubm9kZSwgYnVmZmVyLCAxMjgpIDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJCWlmIChmaWxsZGlyKGRpcmVudCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSwKKwkJCQkgICAgZmlscC0+Zl9wb3MsIE5PREUySU5PKG5vZGUpLCBEVF9ESVIpIDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJCWZpbHAtPmZfcG9zKys7CisJCQlub2RlID0gbm9kZXNbbm9kZV0ubmV4dDsKKwkJfQorCQlqID0gTk9ERVAySU5PKE5PREUoaW5vKS5maXJzdF9wcm9wKTsKKwkJaWYgKCFpKSB7CisJCQlpZiAoZmlsbGRpcihkaXJlbnQsICIubm9kZSIsIDUsIGZpbHAtPmZfcG9zLCBqLCBEVF9SRUcpIDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJCWZpbHAtPmZfcG9zKys7CisJCX0gZWxzZQorCQkJaS0tOworCQluID0gTk9ERShpbm8pLm5vZGU7CisJCWlmIChpbm8gPT0gT1BFTlBST01fRklSU1RfSU5PICsgYWxpYXNlcykgeworCQkJZm9yIChqKys7IGkgPCBhbGlhc2VzX25vZGVzOyBpKyssIGorKykgeworCQkJCWlmIChhbGlhc19uYW1lcyBbaV0pIHsKKwkJCQkJaWYgKGZpbGxkaXIgKGRpcmVudCwgYWxpYXNfbmFtZXMgW2ldLCAKKwkJCQkJCXN0cmxlbiAoYWxpYXNfbmFtZXMgW2ldKSwgCisJCQkJCQlmaWxwLT5mX3BvcywgaiwgRFRfUkVHKSA8IDApIGdvdG8gb3V0OyAKKwkJCQkJZmlscC0+Zl9wb3MrKzsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlmb3IgKHAgPSBwcm9tX2ZpcnN0cHJvcCAobiwgYnVmZmVyMik7CisJCQkgICAgIHAgJiYgKnA7CisJCQkgICAgIHAgPSBwcm9tX25leHRwcm9wIChuLCBwLCBidWZmZXIyKSkgeworCQkJCWorKzsKKwkJCQlpZiAoaSkgaS0tOworCQkJCWVsc2UgeworCQkJCQlpZiAoZmlsbGRpcihkaXJlbnQsIHAsIHN0cmxlbihwKSwKKwkJCQkJCSAgICBmaWxwLT5mX3BvcywgaiwgRFRfUkVHKSA8IDApCisJCQkJCQlnb3RvIG91dDsKKwkJCQkJZmlscC0+Zl9wb3MrKzsKKwkJCQl9CisJCQl9CisJCX0KKwl9CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9wZW5wcm9tZnNfY3JlYXRlIChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwKKwkJc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJY2hhciAqcDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCQorCWlmICghZGlyKQorCQlyZXR1cm4gLUVOT0VOVDsKKwlpZiAoZGVudHJ5LT5kX25hbWUubGVuID4gMjU2KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwID0ga21hbGxvYyAoZGVudHJ5LT5kX25hbWUubGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzdHJuY3B5IChwLCBkZW50cnktPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5sZW4pOworCXAgW2RlbnRyeS0+ZF9uYW1lLmxlbl0gPSAwOworCWxvY2tfa2VybmVsKCk7CisJaWYgKGFsaWFzZXNfbm9kZXMgPT0gQUxJQVNFU19OTk9ERVMpIHsKKwkJa2ZyZWUocCk7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWFsaWFzX25hbWVzIFthbGlhc2VzX25vZGVzKytdID0gcDsKKwlpbm9kZSA9IGlnZXQgKGRpci0+aV9zYiwKKwkJCU5PREVQMklOTyhOT0RFKGRpci0+aV9pbm8pLmZpcnN0X3Byb3ApICsgYWxpYXNlc19ub2Rlcyk7CisJaWYgKCFpbm9kZSkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpbm9kZS0+aV9tb2RlID0gU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVVNSOworCWlub2RlLT5pX2ZvcCA9ICZvcGVucHJvbWZzX3Byb3Bfb3BzOworCWlub2RlLT5pX25saW5rID0gMTsKKwlpZiAoaW5vZGUtPmlfc2l6ZSA8IDApIGlub2RlLT5pX3NpemUgPSAwOworCWlub2RlLT51LmdlbmVyaWNfaXAgPSAodm9pZCAqKShsb25nKSgoKHUxNilhbGlhc2VzKSB8IAorCQkJKCgodTE2KShhbGlhc2VzX25vZGVzIC0gMSkpIDw8IDE2KSk7CisJdW5sb2NrX2tlcm5lbCgpOworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3BlbnByb21mc191bmxpbmsgKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJdW5zaWduZWQgaW50IGxlbjsKKwljaGFyICpwOworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IGk7CisJCisJbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7CisJbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCWxvY2tfa2VybmVsKCk7CisJZm9yIChpID0gMDsgaSA8IGFsaWFzZXNfbm9kZXM7IGkrKykKKwkJaWYgKChzdHJsZW4gKGFsaWFzX25hbWVzIFtpXSkgPT0gbGVuKQorCQkgICAgJiYgIXN0cm5jbXAgKG5hbWUsIGFsaWFzX25hbWVzW2ldLCBsZW4pKSB7CisJCQljaGFyIGJ1ZmZlcls1MTJdOworCQkJCisJCQlwID0gYWxpYXNfbmFtZXMgW2ldOworCQkJYWxpYXNfbmFtZXMgW2ldID0gTlVMTDsKKwkJCWtmcmVlIChwKTsKKwkJCXN0cmNweSAoYnVmZmVyLCAibnZ1bmFsaWFzICIpOworCQkJbWVtY3B5IChidWZmZXIgKyAxMCwgbmFtZSwgbGVuKTsKKwkJCWJ1ZmZlciBbMTAgKyBsZW5dID0gMDsKKwkJCXByb21fZmV2YWwgKGJ1ZmZlcik7CisJCX0KKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIHt7eyBpbml0IHNlY3Rpb24gKi8KK3N0YXRpYyBpbnQgX19pbml0IGNoZWNrX3NwYWNlICh1MTYgbikKK3sKKwl1bnNpZ25lZCBsb25nIHBhZ2VzOworCisJaWYgKCgxIDw8IGFsbG9jZWQpICogUEFHRV9TSVpFIDwgKG4gKyAyKSAqIHNpemVvZihvcGVucHJvbWZzX25vZGUpKSB7CisJCXBhZ2VzID0gX19nZXRfZnJlZV9wYWdlcyAoR0ZQX0tFUk5FTCwgYWxsb2NlZCArIDEpOworCQlpZiAoIXBhZ2VzKQorCQkJcmV0dXJuIC0xOworCisJCWlmIChub2RlcykgeworCQkJbWVtY3B5ICgoY2hhciAqKXBhZ2VzLCAoY2hhciAqKW5vZGVzLAorCQkJCSgxIDw8IGFsbG9jZWQpICogUEFHRV9TSVpFKTsKKwkJCWZyZWVfcGFnZXMgKCh1bnNpZ25lZCBsb25nKW5vZGVzLCBhbGxvY2VkKTsKKwkJfQorCQlhbGxvY2VkKys7CisJCW5vZGVzID0gKG9wZW5wcm9tZnNfbm9kZSAqKXBhZ2VzOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUxNiBfX2luaXQgZ2V0X25vZGVzICh1MTYgcGFyZW50LCB1MzIgbm9kZSkKK3sKKwljaGFyICpwOworCXUxNiBuID0gbGFzdF9ub2RlKyssIGk7CisJY2hhciBidWZmZXJbNjRdOworCisJaWYgKGNoZWNrX3NwYWNlIChuKSA8IDApCisJCXJldHVybiAweGZmZmY7CisJbm9kZXNbbl0ucGFyZW50ID0gcGFyZW50OworCW5vZGVzW25dLm5vZGUgPSBub2RlOworCW5vZGVzW25dLm5leHQgPSAweGZmZmY7CisJbm9kZXNbbl0uY2hpbGQgPSAweGZmZmY7CisJbm9kZXNbbl0uZmlyc3RfcHJvcCA9IGZpcnN0X3Byb3ArKzsKKwlpZiAoIXBhcmVudCkgeworCQljaGFyIGJ1ZmZlcls4XTsKKwkJaW50IGo7CisJCQorCQlpZiAoKGogPSBwcm9tX2dldHByb3BlcnR5IChub2RlLCAibmFtZSIsIGJ1ZmZlciwgOCkpID49IDApIHsKKwkJICAgIGJ1ZmZlcltqXSA9IDA7CisJCSAgICBpZiAoIXN0cmNtcCAoYnVmZmVyLCAib3B0aW9ucyIpKQorCQkJb3B0aW9ucyA9IG47CisJCSAgICBlbHNlIGlmICghc3RyY21wIChidWZmZXIsICJhbGlhc2VzIikpCisJCSAgICAgICAgYWxpYXNlcyA9IG47CisJCX0KKwl9CisJaWYgKG4gIT0gYWxpYXNlcykKKwkJZm9yIChwID0gcHJvbV9maXJzdHByb3AgKG5vZGUsIGJ1ZmZlcik7CisJCSAgICAgcCAmJiBwICE9IChjaGFyICopLTEgJiYgKnA7CisJCSAgICAgcCA9IHByb21fbmV4dHByb3AgKG5vZGUsIHAsIGJ1ZmZlcikpCisJCQlmaXJzdF9wcm9wKys7CisJZWxzZSB7CisJCWNoYXIgKnE7CisJCWZvciAocCA9IHByb21fZmlyc3Rwcm9wIChub2RlLCBidWZmZXIpOworCQkgICAgIHAgJiYgcCAhPSAoY2hhciAqKS0xICYmICpwOworCQkgICAgIHAgPSBwcm9tX25leHRwcm9wIChub2RlLCBwLCBidWZmZXIpKSB7CisJCQlpZiAoYWxpYXNlc19ub2RlcyA9PSBBTElBU0VTX05OT0RFUykKKwkJCQlicmVhazsKKwkJCWZvciAoaSA9IDA7IGkgPCBhbGlhc2VzX25vZGVzOyBpKyspCisJCQkJaWYgKCFzdHJjbXAgKHAsIGFsaWFzX25hbWVzIFtpXSkpCisJCQkJCWJyZWFrOworCQkJaWYgKGkgPCBhbGlhc2VzX25vZGVzKQorCQkJCWNvbnRpbnVlOworCQkJcSA9IGttYWxsb2MgKHN0cmxlbiAocCkgKyAxLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghcSkKKwkJCQlyZXR1cm4gMHhmZmZmOworCQkJc3RyY3B5IChxLCBwKTsKKwkJCWFsaWFzX25hbWVzIFthbGlhc2VzX25vZGVzKytdID0gcTsKKwkJfQorCQlmaXJzdF9wcm9wICs9IEFMSUFTRVNfTk5PREVTOworCX0KKwlub2RlID0gcHJvbV9nZXRjaGlsZCAobm9kZSk7CisJaWYgKG5vZGUpIHsKKwkJcGFyZW50ID0gZ2V0X25vZGVzIChuLCBub2RlKTsKKwkJaWYgKHBhcmVudCA9PSAweGZmZmYpCisJCQlyZXR1cm4gMHhmZmZmOworCQlub2Rlc1tuXS5jaGlsZCA9IHBhcmVudDsKKwkJd2hpbGUgKChub2RlID0gcHJvbV9nZXRzaWJsaW5nIChub2RlKSkgIT0gMCkgeworCQkJaSA9IGdldF9ub2RlcyAobiwgbm9kZSk7CisJCQlpZiAoaSA9PSAweGZmZmYpCisJCQkJcmV0dXJuIDB4ZmZmZjsKKwkJCW5vZGVzW3BhcmVudF0ubmV4dCA9IGk7CisJCQlwYXJlbnQgPSBpOworCQl9CisJfQorCXJldHVybiBuOworfQorCitzdGF0aWMgdm9pZCBvcGVucHJvbV9yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKKwlpZiAoaW5vZGUtPmlfaW5vID09IE9QRU5QUk9NX1JPT1RfSU5PKSB7CisJCWlub2RlLT5pX29wID0gJm9wZW5wcm9tX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZvcGVucHJvbV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9tb2RlID0gU19JRkRJUiB8IFNfSVJVR08gfCBTX0lYVUdPOworCX0KK30KKworc3RhdGljIGludCBvcGVucHJvbV9yZW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpCit7CisJKmZsYWdzIHw9IE1TX05PQVRJTUU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBvcGVucHJvbV9zb3BzID0geyAKKwkucmVhZF9pbm9kZQk9IG9wZW5wcm9tX3JlYWRfaW5vZGUsCisJLnN0YXRmcwkJPSBzaW1wbGVfc3RhdGZzLAorCS5yZW1vdW50X2ZzCT0gb3BlbnByb21fcmVtb3VudCwKK307CisKK3N0YXRpYyBpbnQgb3BlbnByb21fZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCit7CisJc3RydWN0IGlub2RlICogcm9vdF9pbm9kZTsKKworCXMtPnNfZmxhZ3MgfD0gTVNfTk9BVElNRTsKKwlzLT5zX2Jsb2Nrc2l6ZSA9IDEwMjQ7CisJcy0+c19ibG9ja3NpemVfYml0cyA9IDEwOworCXMtPnNfbWFnaWMgPSBPUEVOUFJPTV9TVVBFUl9NQUdJQzsKKwlzLT5zX29wID0gJm9wZW5wcm9tX3NvcHM7CisJcy0+c190aW1lX2dyYW4gPSAxOworCXJvb3RfaW5vZGUgPSBpZ2V0KHMsIE9QRU5QUk9NX1JPT1RfSU5PKTsKKwlpZiAoIXJvb3RfaW5vZGUpCisJCWdvdG8gb3V0X25vX3Jvb3Q7CisJcy0+c19yb290ID0gZF9hbGxvY19yb290KHJvb3RfaW5vZGUpOworCWlmICghcy0+c19yb290KQorCQlnb3RvIG91dF9ub19yb290OworCXJldHVybiAwOworCitvdXRfbm9fcm9vdDoKKwlwcmludGsoIm9wZW5wcm9tX2ZpbGxfc3VwZXI6IGdldCByb290IGlub2RlIGZhaWxlZFxuIik7CisJaXB1dChyb290X2lub2RlKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqb3BlbnByb21fZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9zaW5nbGUoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIG9wZW5wcm9tX2ZpbGxfc3VwZXIpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgb3BlbnByb21fZnNfdHlwZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gIm9wZW5wcm9tZnMiLAorCS5nZXRfc2IJCT0gb3BlbnByb21fZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9hbm9uX3N1cGVyLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9vcGVucHJvbV9mcyh2b2lkKQoreworCW5vZGVzID0gKG9wZW5wcm9tZnNfbm9kZSAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwgMCk7CisJaWYgKCFub2RlcykgeworCQlwcmludGsgKEtFUk5fV0FSTklORyAib3BlbnByb21mczogY2FuJ3QgZ2V0IGZyZWUgcGFnZVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlpZiAoZ2V0X25vZGVzICgweGZmZmYsIHByb21fcm9vdF9ub2RlKSA9PSAweGZmZmYpIHsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIm9wZW5wcm9tZnM6IGNvdWxkbid0IHNldHVwIHRyZWVcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJbm9kZXNbbGFzdF9ub2RlXS5maXJzdF9wcm9wID0gZmlyc3RfcHJvcDsKKwlyZXR1cm4gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmb3BlbnByb21fZnNfdHlwZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X29wZW5wcm9tX2ZzKHZvaWQpCit7CisJaW50IGk7CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZvcGVucHJvbV9mc190eXBlKTsKKwlmcmVlX3BhZ2VzICgodW5zaWduZWQgbG9uZylub2RlcywgYWxsb2NlZCk7CisJZm9yIChpID0gMDsgaSA8IGFsaWFzZXNfbm9kZXM7IGkrKykKKwkJaWYgKGFsaWFzX25hbWVzIFtpXSkKKwkJCWtmcmVlIChhbGlhc19uYW1lcyBbaV0pOworCW5vZGVzID0gTlVMTDsKK30KKworbW9kdWxlX2luaXQoaW5pdF9vcGVucHJvbV9mcykKK21vZHVsZV9leGl0KGV4aXRfb3BlbnByb21fZnMpCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL0tjb25maWcgYi9mcy9wYXJ0aXRpb25zL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGViMjViNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3BhcnRpdGlvbnMvS2NvbmZpZwpAQCAtMCwwICsxLDIyOCBAQAorIworIyBQYXJ0aXRpb24gY29uZmlndXJhdGlvbgorIworY29uZmlnIFBBUlRJVElPTl9BRFZBTkNFRAorCWJvb2wgIkFkdmFuY2VkIHBhcnRpdGlvbiBzZWxlY3Rpb24iCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd291bGQgbGlrZSB0byB1c2UgaGFyZCBkaXNrcyB1bmRlciBMaW51eCB3aGljaAorCSAgd2VyZSBwYXJ0aXRpb25lZCB1bmRlciBhbiBvcGVyYXRpbmcgc3lzdGVtIHJ1bm5pbmcgb24gYSBkaWZmZXJlbnQKKwkgIGFyY2hpdGVjdHVyZSB0aGFuIHlvdXIgTGludXggc3lzdGVtLgorCisJICBOb3RlIHRoYXQgdGhlIGFuc3dlciB0byB0aGlzIHF1ZXN0aW9uIHdvbid0IGRpcmVjdGx5IGFmZmVjdCB0aGUKKwkgIGtlcm5lbDogc2F5aW5nIE4gd2lsbCBqdXN0IGNhdXNlIHRoZSBjb25maWd1cmF0b3IgdG8gc2tpcCBhbGwKKwkgIHRoZSBxdWVzdGlvbnMgYWJvdXQgZm9yZWlnbiBwYXJ0aXRpb25pbmcgc2NoZW1lcy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIEFDT1JOX1BBUlRJVElPTgorCWJvb2wgIkFjb3JuIHBhcnRpdGlvbiBzdXBwb3J0IiBpZiBQQVJUSVRJT05fQURWQU5DRUQKKwlkZWZhdWx0IHkgaWYgQVJDSF9BQ09STgorCWhlbHAKKwkgIFN1cHBvcnQgaGFyZCBkaXNrcyBwYXJ0aXRpb25lZCB1bmRlciBBY29ybiBvcGVyYXRpbmcgc3lzdGVtcy4KKworY29uZmlnIEFDT1JOX1BBUlRJVElPTl9DVU1BTkEKKwlib29sICJDdW1hbmEgcGFydGl0aW9uIHN1cHBvcnQiIGlmIFBBUlRJVElPTl9BRFZBTkNFRCAmJiBBQ09STl9QQVJUSVRJT04KKwlkZWZhdWx0IHkgaWYgQVJDSF9BQ09STgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdvdWxkIGxpa2UgdG8gdXNlIGhhcmQgZGlza3MgdW5kZXIgTGludXggd2hpY2gKKwkgIHdlcmUgcGFydGl0aW9uZWQgdXNpbmcgdGhlIEN1bWFuYSBpbnRlcmZhY2Ugb24gQWNvcm4gbWFjaGluZXMuCisKK2NvbmZpZyBBQ09STl9QQVJUSVRJT05fRUVTT1gKKwlib29sICJFRVNPWCBwYXJ0aXRpb24gc3VwcG9ydCIgaWYgUEFSVElUSU9OX0FEVkFOQ0VEICYmIEFDT1JOX1BBUlRJVElPTgorCWRlZmF1bHQgeSBpZiBBUkNIX0FDT1JOCisKK2NvbmZpZyBBQ09STl9QQVJUSVRJT05fSUNTCisJYm9vbCAiSUNTIHBhcnRpdGlvbiBzdXBwb3J0IiBpZiBQQVJUSVRJT05fQURWQU5DRUQgJiYgQUNPUk5fUEFSVElUSU9OCisJZGVmYXVsdCB5IGlmIEFSQ0hfQUNPUk4KKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3b3VsZCBsaWtlIHRvIHVzZSBoYXJkIGRpc2tzIHVuZGVyIExpbnV4IHdoaWNoCisJICB3ZXJlIHBhcnRpdGlvbmVkIHVzaW5nIHRoZSBJQ1MgaW50ZXJmYWNlIG9uIEFjb3JuIG1hY2hpbmVzLgorCitjb25maWcgQUNPUk5fUEFSVElUSU9OX0FERlMKKwlib29sICJOYXRpdmUgZmlsZWNvcmUgcGFydGl0aW9uIHN1cHBvcnQiIGlmIFBBUlRJVElPTl9BRFZBTkNFRCAmJiBBQ09STl9QQVJUSVRJT04KKwlkZWZhdWx0IHkgaWYgQVJDSF9BQ09STgorCWhlbHAKKwkgIFRoZSBBY29ybiBEaXNjIEZpbGluZyBTeXN0ZW0gaXMgdGhlIHN0YW5kYXJkIGZpbGUgc3lzdGVtIG9mIHRoZQorCSAgUmlzY09TIG9wZXJhdGluZyBzeXN0ZW0gd2hpY2ggcnVucyBvbiBBY29ybidzIEFSTS1iYXNlZCBSaXNjIFBDCisJICBzeXN0ZW1zIGFuZCB0aGUgQWNvcm4gQXJjaGltZWRlcyByYW5nZSBvZiBtYWNoaW5lcy4gIElmIHlvdSBzYXkKKwkgIGBZJyBoZXJlLCBMaW51eCB3aWxsIHN1cHBvcnQgZGlzayBwYXJ0aXRpb25zIGNyZWF0ZWQgdW5kZXIgQURGUy4KKworY29uZmlnIEFDT1JOX1BBUlRJVElPTl9QT1dFUlRFQworCWJvb2wgIlBvd2VyVGVjIHBhcnRpdGlvbiBzdXBwb3J0IiBpZiBQQVJUSVRJT05fQURWQU5DRUQgJiYgQUNPUk5fUEFSVElUSU9OCisJZGVmYXVsdCB5IGlmIEFSQ0hfQUNPUk4KKwloZWxwCisJICBTdXBwb3J0IHJlYWRpbmcgcGFydGl0aW9uIHRhYmxlcyBjcmVhdGVkIG9uIEFjb3JuIG1hY2hpbmVzIHVzaW5nCisJICB0aGUgUG93ZXJUZWMgU0NTSSBkcml2ZS4KKworY29uZmlnIEFDT1JOX1BBUlRJVElPTl9SSVNDSVgKKwlib29sICJSSVNDaVggcGFydGl0aW9uIHN1cHBvcnQiIGlmIFBBUlRJVElPTl9BRFZBTkNFRCAmJiBBQ09STl9QQVJUSVRJT04KKwlkZWZhdWx0IHkgaWYgQVJDSF9BQ09STgorCWhlbHAKKwkgIE9uY2UgdXBvbiBhIHRpbWUsIHRoZXJlIHdhcyBhIG5hdGl2ZSBVbml4IHBvcnQgZm9yIHRoZSBBY29ybiBzZXJpZXMKKwkgIG9mIG1hY2hpbmVzIGNhbGxlZCBSSVNDaVguICBJZiB5b3Ugc2F5ICdZJyBoZXJlLCBMaW51eCB3aWxsIGJlIGFibGUKKwkgIHRvIHJlYWQgZGlza3MgcGFydGl0aW9uZWQgdW5kZXIgUklTQ2lYLgorCitjb25maWcgT1NGX1BBUlRJVElPTgorCWJvb2wgIkFscGhhIE9TRiBwYXJ0aXRpb24gc3VwcG9ydCIgaWYgUEFSVElUSU9OX0FEVkFOQ0VECisJZGVmYXVsdCB5IGlmIEFMUEhBCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd291bGQgbGlrZSB0byB1c2UgaGFyZCBkaXNrcyB1bmRlciBMaW51eCB3aGljaAorCSAgd2VyZSBwYXJ0aXRpb25lZCBvbiBhbiBBbHBoYSBtYWNoaW5lLgorCitjb25maWcgQU1JR0FfUEFSVElUSU9OCisJYm9vbCAiQW1pZ2EgcGFydGl0aW9uIHRhYmxlIHN1cHBvcnQiIGlmIFBBUlRJVElPTl9BRFZBTkNFRAorCWRlZmF1bHQgeSBpZiAoQU1JR0EgfHwgQUZGU19GUz15KQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdvdWxkIGxpa2UgdG8gdXNlIGhhcmQgZGlza3MgdW5kZXIgTGludXggd2hpY2gKKwkgIHdlcmUgcGFydGl0aW9uZWQgdW5kZXIgQW1pZ2FPUy4KKworY29uZmlnIEFUQVJJX1BBUlRJVElPTgorCWJvb2wgIkF0YXJpIHBhcnRpdGlvbiB0YWJsZSBzdXBwb3J0IiBpZiBQQVJUSVRJT05fQURWQU5DRUQKKwlkZWZhdWx0IHkgaWYgQVRBUkkKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3b3VsZCBsaWtlIHRvIHVzZSBoYXJkIGRpc2tzIHVuZGVyIExpbnV4IHdoaWNoCisJICB3ZXJlIHBhcnRpdGlvbmVkIHVuZGVyIHRoZSBBdGFyaSBPUy4KKworY29uZmlnIElCTV9QQVJUSVRJT04KKwlib29sICJJQk0gZGlzayBsYWJlbCBhbmQgcGFydGl0aW9uIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQVJUSVRJT05fQURWQU5DRUQgJiYgQVJDSF9TMzkwCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd291bGQgbGlrZSB0byBiZSBhYmxlIHRvIHJlYWQgdGhlIGhhcmQgZGlzaworCSAgcGFydGl0aW9uIHRhYmxlIGZvcm1hdCB1c2VkIGJ5IElCTSBEQVNEIGRpc2tzIG9wZXJhdGluZyB1bmRlciBDTVMuCisJICBPdGhlcndpc2UsIHNheSBOLgorCitjb25maWcgTUFDX1BBUlRJVElPTgorCWJvb2wgIk1hY2ludG9zaCBwYXJ0aXRpb24gbWFwIHN1cHBvcnQiIGlmIFBBUlRJVElPTl9BRFZBTkNFRAorCWRlZmF1bHQgeSBpZiBNQUMKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3b3VsZCBsaWtlIHRvIHVzZSBoYXJkIGRpc2tzIHVuZGVyIExpbnV4IHdoaWNoCisJICB3ZXJlIHBhcnRpdGlvbmVkIG9uIGEgTWFjaW50b3NoLgorCitjb25maWcgTVNET1NfUEFSVElUSU9OCisJYm9vbCAiUEMgQklPUyAoTVNET1MgcGFydGl0aW9uIHRhYmxlcykgc3VwcG9ydCIgaWYgUEFSVElUSU9OX0FEVkFOQ0VECisJZGVmYXVsdCB5CisJaGVscAorCSAgU2F5IFkgaGVyZS4KKworY29uZmlnIEJTRF9ESVNLTEFCRUwKKwlib29sICJCU0QgZGlza2xhYmVsIChGcmVlQlNEIHBhcnRpdGlvbiB0YWJsZXMpIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQVJUSVRJT05fQURWQU5DRUQgJiYgTVNET1NfUEFSVElUSU9OCisJaGVscAorCSAgRnJlZUJTRCB1c2VzIGl0cyBvd24gaGFyZCBkaXNrIHBhcnRpdGlvbiBzY2hlbWUgb24geW91ciBQQy4gSXQKKwkgIHJlcXVpcmVzIG9ubHkgb25lIGVudHJ5IGluIHRoZSBwcmltYXJ5IHBhcnRpdGlvbiB0YWJsZSBvZiB5b3VyIGRpc2sKKwkgIGFuZCBtYW5hZ2VzIGl0IHNpbWlsYXJseSB0byBET1MgZXh0ZW5kZWQgcGFydGl0aW9ucywgcHV0dGluZyBpbiBpdHMKKwkgIGZpcnN0IHNlY3RvciBhIG5ldyBwYXJ0aXRpb24gdGFibGUgaW4gQlNEIGRpc2tsYWJlbCBmb3JtYXQuIFNheWluZyBZCisJICBoZXJlIGFsbG93cyB5b3UgdG8gcmVhZCB0aGVzZSBkaXNrbGFiZWxzIGFuZCBmdXJ0aGVyIG1vdW50IEZyZWVCU0QKKwkgIHBhcnRpdGlvbnMgZnJvbSB3aXRoaW4gTGludXggaWYgeW91IGhhdmUgYWxzbyBzYWlkIFkgdG8gIlVGUworCSAgZmlsZSBzeXN0ZW0gc3VwcG9ydCIsIGFib3ZlLiBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IGFsbCB0aGlzIGlzCisJICBhYm91dCwgc2F5IE4uCisKK2NvbmZpZyBNSU5JWF9TVUJQQVJUSVRJT04KKwlib29sICJNaW5peCBzdWJwYXJ0aXRpb24gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBBUlRJVElPTl9BRFZBTkNFRCAmJiBNU0RPU19QQVJUSVRJT04KKwloZWxwCisJICBNaW5peCAyLjAuMC8yLjAuMiBzdWJwYXJ0aXRpb24gdGFibGUgc3VwcG9ydCBmb3IgTGludXguCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIG1vdW50IGFuZCB1c2UgTWluaXggMi4wLjAvMi4wLjIKKwkgIHN1YnBhcnRpdGlvbnMuCisKK2NvbmZpZyBTT0xBUklTX1g4Nl9QQVJUSVRJT04KKwlib29sICJTb2xhcmlzICh4ODYpIHBhcnRpdGlvbiB0YWJsZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gUEFSVElUSU9OX0FEVkFOQ0VEICYmIE1TRE9TX1BBUlRJVElPTgorCWhlbHAKKwkgIExpa2UgbW9zdCBzeXN0ZW1zLCBTb2xhcmlzIHg4NiB1c2VzIGl0cyBvd24gaGFyZCBkaXNrIHBhcnRpdGlvbgorCSAgdGFibGUgZm9ybWF0LCBpbmNvbXBhdGlibGUgd2l0aCBhbGwgb3RoZXJzLiBTYXlpbmcgWSBoZXJlIGFsbG93cyB5b3UKKwkgIHRvIHJlYWQgdGhlc2UgcGFydGl0aW9uIHRhYmxlcyBhbmQgZnVydGhlciBtb3VudCBTb2xhcmlzIHg4NgorCSAgcGFydGl0aW9ucyBmcm9tIHdpdGhpbiBMaW51eCBpZiB5b3UgaGF2ZSBhbHNvIHNhaWQgWSB0byAiVUZTCisJICBmaWxlIHN5c3RlbSBzdXBwb3J0IiwgYWJvdmUuCisKK2NvbmZpZyBVTklYV0FSRV9ESVNLTEFCRUwKKwlib29sICJVbml4d2FyZSBzbGljZXMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBBUlRJVElPTl9BRFZBTkNFRCAmJiBNU0RPU19QQVJUSVRJT04KKwktLS1oZWxwLS0tCisJICBMaWtlIHNvbWUgc3lzdGVtcywgVW5peFdhcmUgdXNlcyBpdHMgb3duIHNsaWNlIHRhYmxlIGluc2lkZSBhCisJICBwYXJ0aXRpb24gKFZUT0MgLSBWaXJ0dWFsIFRhYmxlIG9mIENvbnRlbnRzKS4gSXRzIGZvcm1hdCBpcworCSAgaW5jb21wYXRpYmxlIHdpdGggYWxsIG90aGVyIE9TZXMuIFNheWluZyBZIGhlcmUgYWxsb3dzIHlvdSB0byByZWFkCisJICBWVE9DIGFuZCBmdXJ0aGVyIG1vdW50IFVuaXhXYXJlIHBhcnRpdGlvbnMgcmVhZC1vbmx5IGZyb20gd2l0aGluCisJICBMaW51eCBpZiB5b3UgaGF2ZSBhbHNvIHNhaWQgWSB0byAiVUZTIGZpbGUgc3lzdGVtIHN1cHBvcnQiIG9yCisJICAiU3lzdGVtIFYgYW5kIENvaGVyZW50IGZpbGUgc3lzdGVtIHN1cHBvcnQiLCBhYm92ZS4KKworCSAgVGhpcyBpcyBtYWlubHkgdXNlZCB0byBjYXJyeSBkYXRhIGZyb20gYSBVbml4V2FyZSBib3ggdG8geW91cgorCSAgTGludXggYm94IHZpYSBhIHJlbW92YWJsZSBtZWRpdW0gbGlrZSBtYWduZXRvLW9wdGljYWwsIFpJUCBvcgorCSAgcmVtb3ZhYmxlIElERSBkcml2ZXMuIE5vdGUsIGhvd2V2ZXIsIHRoYXQgYSBnb29kIHBvcnRhYmxlIHdheSB0bworCSAgdHJhbnNwb3J0IGZpbGVzIGFuZCBkaXJlY3RvcmllcyBiZXR3ZWVuIHVuaXhlcyAoYW5kIGV2ZW4gb3RoZXIKKwkgIG9wZXJhdGluZyBzeXN0ZW1zKSBpcyBnaXZlbiBieSB0aGUgdGFyIHByb2dyYW0gKCJtYW4gdGFyIiBvcgorCSAgcHJlZmVyYWJseSAiaW5mbyB0YXIiKS4KKworCSAgSWYgeW91IGRvbid0IGtub3cgd2hhdCBhbGwgdGhpcyBpcyBhYm91dCwgc2F5IE4uCisKK2NvbmZpZyBMRE1fUEFSVElUSU9OCisJYm9vbCAiV2luZG93cyBMb2dpY2FsIERpc2sgTWFuYWdlciAoRHluYW1pYyBEaXNrKSBzdXBwb3J0IgorCWRlcGVuZHMgb24gUEFSVElUSU9OX0FEVkFOQ0VECisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd291bGQgbGlrZSB0byB1c2UgaGFyZCBkaXNrcyB1bmRlciBMaW51eCB3aGljaAorCSAgd2VyZSBwYXJ0aXRpb25lZCB1c2luZyBXaW5kb3dzIDIwMDAncyBvciBYUCdzIExvZ2ljYWwgRGlzayBNYW5hZ2VyLgorCSAgVGhleSBhcmUgYWxzbyBrbm93biBhcyAiRHluYW1pYyBEaXNrcyIuCisKKwkgIFdpbmRvd3MgMjAwMCBpbnRyb2R1Y2VkIHRoZSBjb25jZXB0IG9mIER5bmFtaWMgRGlza3MgdG8gZ2V0IGFyb3VuZAorCSAgdGhlIGxpbWl0YXRpb25zIG9mIHRoZSBQQydzIHBhcnRpdGlvbmluZyBzY2hlbWUuICBUaGUgTG9naWNhbCBEaXNrCisJICBNYW5hZ2VyIGFsbG93cyB0aGUgdXNlciB0byByZXBhcnRpdGlvbiBhIGRpc2sgYW5kIGNyZWF0ZSBzcGFubmVkLAorCSAgbWlycm9yZWQsIHN0cmlwZWQgb3IgUkFJRCB2b2x1bWVzLCBhbGwgd2l0aG91dCB0aGUgbmVlZCBmb3IKKwkgIHJlYm9vdGluZy4KKworCSAgTm9ybWFsIHBhcnRpdGlvbnMgYXJlIG5vdyBjYWxsZWQgQmFzaWMgRGlza3MgdW5kZXIgV2luZG93cyAyMDAwIGFuZAorCSAgWFAuCisKKwkgIEZvciBhIGZ1bGxlciBkZXNjcmlwdGlvbiByZWFkIDxmaWxlOkRvY3VtZW50YXRpb24vbGRtLnR4dD4uCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBMRE1fREVCVUcKKwlib29sICJXaW5kb3dzIExETSBleHRyYSBsb2dnaW5nIgorCWRlcGVuZHMgb24gTERNX1BBUlRJVElPTgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdvdWxkIGxpa2UgTERNIHRvIGxvZyB2ZXJib3NlbHkuICBUaGlzIGNvdWxkIGJlCisJICBoZWxwZnVsIGlmIHRoZSBkcml2ZXIgZG9lc24ndCB3b3JrIGFzIGV4cGVjdGVkIGFuZCB5b3UnZCBsaWtlIHRvCisJICByZXBvcnQgYSBidWcuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBTR0lfUEFSVElUSU9OCisJYm9vbCAiU0dJIHBhcnRpdGlvbiBzdXBwb3J0IiBpZiBQQVJUSVRJT05fQURWQU5DRUQKKwlkZWZhdWx0IHkgaWYgKFNHSV9JUDIyIHx8IFNHSV9JUDI3IHx8ICgoTUFDSF9KQVpaIHx8IFNOSV9STTIwMF9QQ0kpICYmICFDUFVfTElUVExFX0VORElBTikpCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd291bGQgbGlrZSB0byBiZSBhYmxlIHRvIHJlYWQgdGhlIGhhcmQgZGlzaworCSAgcGFydGl0aW9uIHRhYmxlIGZvcm1hdCB1c2VkIGJ5IFNHSSBtYWNoaW5lcy4KKworY29uZmlnIFVMVFJJWF9QQVJUSVRJT04KKwlib29sICJVbHRyaXggcGFydGl0aW9uIHRhYmxlIHN1cHBvcnQiIGlmIFBBUlRJVElPTl9BRFZBTkNFRAorCWRlZmF1bHQgeSBpZiBNQUNIX0RFQ1NUQVRJT04KKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3b3VsZCBsaWtlIHRvIGJlIGFibGUgdG8gcmVhZCB0aGUgaGFyZCBkaXNrCisJICBwYXJ0aXRpb24gdGFibGUgZm9ybWF0IHVzZWQgYnkgREVDIChub3cgQ29tcGFxKSBVbHRyaXggbWFjaGluZXMuCisJICBPdGhlcndpc2UsIHNheSBOLgorCitjb25maWcgU1VOX1BBUlRJVElPTgorCWJvb2wgIlN1biBwYXJ0aXRpb24gdGFibGVzIHN1cHBvcnQiIGlmIFBBUlRJVElPTl9BRFZBTkNFRAorCWRlZmF1bHQgeSBpZiAoU1BBUkMzMiB8fCBTUEFSQzY0IHx8IFNVTjMgfHwgU1VOM1gpCisJLS0taGVscC0tLQorCSAgTGlrZSBtb3N0IHN5c3RlbXMsIFN1bk9TIHVzZXMgaXRzIG93biBoYXJkIGRpc2sgcGFydGl0aW9uIHRhYmxlCisJICBmb3JtYXQsIGluY29tcGF0aWJsZSB3aXRoIGFsbCBvdGhlcnMuIFNheWluZyBZIGhlcmUgYWxsb3dzIHlvdSB0bworCSAgcmVhZCB0aGVzZSBwYXJ0aXRpb24gdGFibGVzIGFuZCBmdXJ0aGVyIG1vdW50IFN1bk9TIHBhcnRpdGlvbnMgZnJvbQorCSAgd2l0aGluIExpbnV4IGlmIHlvdSBoYXZlIGFsc28gc2FpZCBZIHRvICJVRlMgZmlsZSBzeXN0ZW0gc3VwcG9ydCIsCisJICBhYm92ZS4gVGhpcyBpcyBtYWlubHkgdXNlZCB0byBjYXJyeSBkYXRhIGZyb20gYSBTUEFSQyB1bmRlciBTdW5PUyB0bworCSAgeW91ciBMaW51eCBib3ggdmlhIGEgcmVtb3ZhYmxlIG1lZGl1bSBsaWtlIG1hZ25ldG8tb3B0aWNhbCBvciBaSVAKKwkgIGRyaXZlczsgbm90ZSBob3dldmVyIHRoYXQgYSBnb29kIHBvcnRhYmxlIHdheSB0byB0cmFuc3BvcnQgZmlsZXMgYW5kCisJICBkaXJlY3RvcmllcyBiZXR3ZWVuIHVuaXhlcyAoYW5kIGV2ZW4gb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMpIGlzCisJICBnaXZlbiBieSB0aGUgdGFyIHByb2dyYW0gKCJtYW4gdGFyIiBvciBwcmVmZXJhYmx5ICJpbmZvIHRhciIpLiBJZgorCSAgeW91IGRvbid0IGtub3cgd2hhdCBhbGwgdGhpcyBpcyBhYm91dCwgc2F5IE4uCisKK2NvbmZpZyBFRklfUEFSVElUSU9OCisJYm9vbCAiRUZJIEdVSUQgUGFydGl0aW9uIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQQVJUSVRJT05fQURWQU5DRUQKKwlzZWxlY3QgQ1JDMzIKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3b3VsZCBsaWtlIHRvIHVzZSBoYXJkIGRpc2tzIHVuZGVyIExpbnV4IHdoaWNoCisJICB3ZXJlIHBhcnRpdGlvbmVkIHVzaW5nIEVGSSBHUFQuICBQcmVzZW50bHkgb25seSB1c2VmdWwgb24gdGhlCisJICBJQS02NCBwbGF0Zm9ybS4KKworIyAgICAgIGRlZmluZV9ib29sIENPTkZJR19BQ09STl9QQVJUSVRJT05fQ1VNQU5BIHkKZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvTWFrZWZpbGUgYi9mcy9wYXJ0aXRpb25zL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjODNjMTcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wYXJ0aXRpb25zL01ha2VmaWxlCkBAIC0wLDAgKzEsMjAgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCBrZXJuZWwuCisjCisKK29iai15IDo9IGNoZWNrLm8KKworb2JqLSQoQ09ORklHX0RFVkZTX0ZTKSArPSBkZXZmcy5vCitvYmotJChDT05GSUdfQUNPUk5fUEFSVElUSU9OKSArPSBhY29ybi5vCitvYmotJChDT05GSUdfQU1JR0FfUEFSVElUSU9OKSArPSBhbWlnYS5vCitvYmotJChDT05GSUdfQVRBUklfUEFSVElUSU9OKSArPSBhdGFyaS5vCitvYmotJChDT05GSUdfTUFDX1BBUlRJVElPTikgKz0gbWFjLm8KK29iai0kKENPTkZJR19MRE1fUEFSVElUSU9OKSArPSBsZG0ubworb2JqLSQoQ09ORklHX01TRE9TX1BBUlRJVElPTikgKz0gbXNkb3Mubworb2JqLSQoQ09ORklHX09TRl9QQVJUSVRJT04pICs9IG9zZi5vCitvYmotJChDT05GSUdfU0dJX1BBUlRJVElPTikgKz0gc2dpLm8KK29iai0kKENPTkZJR19TVU5fUEFSVElUSU9OKSArPSBzdW4ubworb2JqLSQoQ09ORklHX1VMVFJJWF9QQVJUSVRJT04pICs9IHVsdHJpeC5vCitvYmotJChDT05GSUdfSUJNX1BBUlRJVElPTikgKz0gaWJtLm8KK29iai0kKENPTkZJR19FRklfUEFSVElUSU9OKSArPSBlZmkubworb2JqLSQoQ09ORklHX05FQzk4X1BBUlRJVElPTikgKz0gbmVjOTgubyBtc2Rvcy5vCmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL2Fjb3JuLmMgYi9mcy9wYXJ0aXRpb25zL2Fjb3JuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA1MDg1NwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3BhcnRpdGlvbnMvYWNvcm4uYwpAQCAtMCwwICsxLDU1NyBAQAorLyoKKyAqICBsaW51eC9mcy9wYXJ0aXRpb25zL2Fjb3JuLmMKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAxOTk2LTIwMDAgUnVzc2VsbCBLaW5nLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIFNjYW4gQURGUyBwYXJ0aXRpb25zIG9uIGhhcmQgZGlzayBkcml2ZXMuICBVbmZvcnR1bmF0ZWx5LCB0aGVyZQorICogIGlzbid0IGEgc3RhbmRhcmQgZm9yIHBhcnRpdGlvbmluZyBkcml2ZXMgb24gQWNvcm4gbWFjaGluZXMsIHNvCisgKiAgZXZlcnkgc2luZ2xlIG1hbnVmYWN0dXJlciBvZiBTQ1NJIGFuZCBJREUgY2FyZHMgY3JlYXRlZCB0aGVpciBvd24KKyAqICBtZXRob2QuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2FkZnNfZnMuaD4KKworI2luY2x1ZGUgImNoZWNrLmgiCisjaW5jbHVkZSAiYWNvcm4uaCIKKworLyoKKyAqIFBhcnRpdGlvbiB0eXBlcy4gKE9oIGZvciByZXVzYWJpbGl0eSkKKyAqLworI2RlZmluZSBQQVJUSVRJT05fUklTQ0lYX01GTQkxCisjZGVmaW5lIFBBUlRJVElPTl9SSVNDSVhfU0NTSQkyCisjZGVmaW5lIFBBUlRJVElPTl9MSU5VWAkJOQorCitzdGF0aWMgc3RydWN0IGFkZnNfZGlzY3JlY29yZCAqCithZGZzX3BhcnRpdGlvbihzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlLCBjaGFyICpuYW1lLCBjaGFyICpkYXRhLAorCSAgICAgICB1bnNpZ25lZCBsb25nIGZpcnN0X3NlY3RvciwgaW50IHNsb3QpCit7CisJc3RydWN0IGFkZnNfZGlzY3JlY29yZCAqZHI7CisJdW5zaWduZWQgaW50IG5yX3NlY3RzOworCisJaWYgKGFkZnNfY2hlY2tiYmxrKGRhdGEpKQorCQlyZXR1cm4gTlVMTDsKKworCWRyID0gKHN0cnVjdCBhZGZzX2Rpc2NyZWNvcmQgKikoZGF0YSArIDB4MWMwKTsKKworCWlmIChkci0+ZGlzY19zaXplID09IDAgJiYgZHItPmRpc2Nfc2l6ZV9oaWdoID09IDApCisJCXJldHVybiBOVUxMOworCisJbnJfc2VjdHMgPSAobGUzMl90b19jcHUoZHItPmRpc2Nfc2l6ZV9oaWdoKSA8PCAyMykgfAorCQkgICAobGUzMl90b19jcHUoZHItPmRpc2Nfc2l6ZSkgPj4gOSk7CisKKwlpZiAobmFtZSkKKwkJcHJpbnRrKCIgWyVzXSIsIG5hbWUpOworCXB1dF9wYXJ0aXRpb24oc3RhdGUsIHNsb3QsIGZpcnN0X3NlY3RvciwgbnJfc2VjdHMpOworCXJldHVybiBkcjsKK30KKworI2lmZGVmIENPTkZJR19BQ09STl9QQVJUSVRJT05fUklTQ0lYCisKK3N0cnVjdCByaXNjaXhfcGFydCB7CisJX19sZTMyCXN0YXJ0OworCV9fbGUzMglsZW5ndGg7CisJX19sZTMyCW9uZTsKKwljaGFyCW5hbWVbMTZdOworfTsKKworc3RydWN0IHJpc2NpeF9yZWNvcmQgeworCV9fbGUzMgltYWdpYzsKKyNkZWZpbmUgUklTQ0lYX01BR0lDCWNwdV90b19sZTMyKDB4NGE2NTczMjApCisJX19sZTMyCWRhdGU7CisJc3RydWN0IHJpc2NpeF9wYXJ0IHBhcnRbOF07Cit9OworCitzdGF0aWMgaW50CityaXNjaXhfcGFydGl0aW9uKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJCXVuc2lnbmVkIGxvbmcgZmlyc3Rfc2VjdCwgaW50IHNsb3QsIHVuc2lnbmVkIGxvbmcgbnJfc2VjdHMpCit7CisJU2VjdG9yIHNlY3Q7CisJc3RydWN0IHJpc2NpeF9yZWNvcmQgKnJyOworCQorCXJyID0gKHN0cnVjdCByaXNjaXhfcmVjb3JkICopcmVhZF9kZXZfc2VjdG9yKGJkZXYsIGZpcnN0X3NlY3QsICZzZWN0KTsKKwlpZiAoIXJyKQorCQlyZXR1cm4gLTE7CisKKwlwcmludGsoIiBbUklTQ2lYXSIpOworCisKKwlpZiAocnItPm1hZ2ljID09IFJJU0NJWF9NQUdJQykgeworCQl1bnNpZ25lZCBsb25nIHNpemUgPSBucl9zZWN0cyA+IDIgPyAyIDogbnJfc2VjdHM7CisJCWludCBwYXJ0OworCisJCXByaW50aygiIDwiKTsKKworCQlwdXRfcGFydGl0aW9uKHN0YXRlLCBzbG90KyssIGZpcnN0X3NlY3QsIHNpemUpOworCQlmb3IgKHBhcnQgPSAwOyBwYXJ0IDwgODsgcGFydCsrKSB7CisJCQlpZiAocnItPnBhcnRbcGFydF0ub25lICYmCisJCQkgICAgbWVtY21wKHJyLT5wYXJ0W3BhcnRdLm5hbWUsICJBbGxcMCIsIDQpKSB7CisJCQkJcHV0X3BhcnRpdGlvbihzdGF0ZSwgc2xvdCsrLAorCQkJCQlsZTMyX3RvX2NwdShyci0+cGFydFtwYXJ0XS5zdGFydCksCisJCQkJCWxlMzJfdG9fY3B1KHJyLT5wYXJ0W3BhcnRdLmxlbmd0aCkpOworCQkJCXByaW50aygiKCVzKSIsIHJyLT5wYXJ0W3BhcnRdLm5hbWUpOworCQkJfQorCQl9CisKKwkJcHJpbnRrKCIgPlxuIik7CisJfSBlbHNlIHsKKwkJcHV0X3BhcnRpdGlvbihzdGF0ZSwgc2xvdCsrLCBmaXJzdF9zZWN0LCBucl9zZWN0cyk7CisJfQorCisJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CisJcmV0dXJuIHNsb3Q7Cit9CisjZW5kaWYKKworI2RlZmluZSBMSU5VWF9OQVRJVkVfTUFHSUMgMHhkZWFmYTFkZQorI2RlZmluZSBMSU5VWF9TV0FQX01BR0lDICAgMHhkZWFmYWIxZQorCitzdHJ1Y3QgbGludXhfcGFydCB7CisJX19sZTMyIG1hZ2ljOworCV9fbGUzMiBzdGFydF9zZWN0OworCV9fbGUzMiBucl9zZWN0czsKK307CisKK3N0YXRpYyBpbnQKK2xpbnV4X3BhcnRpdGlvbihzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQl1bnNpZ25lZCBsb25nIGZpcnN0X3NlY3QsIGludCBzbG90LCB1bnNpZ25lZCBsb25nIG5yX3NlY3RzKQoreworCVNlY3RvciBzZWN0OworCXN0cnVjdCBsaW51eF9wYXJ0ICpsaW51eHA7CisJdW5zaWduZWQgbG9uZyBzaXplID0gbnJfc2VjdHMgPiAyID8gMiA6IG5yX3NlY3RzOworCisJcHJpbnRrKCIgW0xpbnV4XSIpOworCisJcHV0X3BhcnRpdGlvbihzdGF0ZSwgc2xvdCsrLCBmaXJzdF9zZWN0LCBzaXplKTsKKworCWxpbnV4cCA9IChzdHJ1Y3QgbGludXhfcGFydCAqKXJlYWRfZGV2X3NlY3RvcihiZGV2LCBmaXJzdF9zZWN0LCAmc2VjdCk7CisJaWYgKCFsaW51eHApCisJCXJldHVybiAtMTsKKworCXByaW50aygiIDwiKTsKKwl3aGlsZSAobGludXhwLT5tYWdpYyA9PSBjcHVfdG9fbGUzMihMSU5VWF9OQVRJVkVfTUFHSUMpIHx8CisJICAgICAgIGxpbnV4cC0+bWFnaWMgPT0gY3B1X3RvX2xlMzIoTElOVVhfU1dBUF9NQUdJQykpIHsKKwkJaWYgKHNsb3QgPT0gc3RhdGUtPmxpbWl0KQorCQkJYnJlYWs7CisJCXB1dF9wYXJ0aXRpb24oc3RhdGUsIHNsb3QrKywgZmlyc3Rfc2VjdCArCisJCQkJIGxlMzJfdG9fY3B1KGxpbnV4cC0+c3RhcnRfc2VjdCksCisJCQkJIGxlMzJfdG9fY3B1KGxpbnV4cC0+bnJfc2VjdHMpKTsKKwkJbGludXhwICsrOworCX0KKwlwcmludGsoIiA+Iik7CisKKwlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKwlyZXR1cm4gc2xvdDsKK30KKworI2lmZGVmIENPTkZJR19BQ09STl9QQVJUSVRJT05fQ1VNQU5BCitpbnQKK2FkZnNwYXJ0X2NoZWNrX0NVTUFOQShzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmlyc3Rfc2VjdG9yID0gMDsKKwl1bnNpZ25lZCBpbnQgc3RhcnRfYmxrID0gMDsKKwlTZWN0b3Igc2VjdDsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworCWNoYXIgKm5hbWUgPSAiQ1VNQU5BL0FERlMiOworCWludCBmaXJzdCA9IDE7CisJaW50IHNsb3QgPSAxOworCisJLyoKKwkgKiBUcnkgQ3VtYW5hIHN0eWxlIHBhcnRpdGlvbnMgLSBzZWN0b3IgNiBjb250YWlucyBBREZTIGJvb3QgYmxvY2sKKwkgKiB3aXRoIHBvaW50ZXIgdG8gbmV4dCAnZHJpdmUnLgorCSAqCisJICogVGhlcmUgYXJlIHVua25vd25zIGluIHRoaXMgY29kZSAtIGlzIHRoZSAnY3lsaW5kZXIgbnVtYmVyJyBvZiB0aGUKKwkgKiBuZXh0IHBhcnRpdGlvbiByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhpcyBvbmUgLSBJJ20gYXNzdW1pbmcKKwkgKiBpdCBpcy4KKwkgKgorCSAqIEFsc28sIHdoaWNoIElEIGRpZCBDdW1hbmEgdXNlPworCSAqCisJICogVGhpcyBpcyB0b3RhbGx5IHVuZmluaXNoZWQsIGFuZCB3aWxsIHJlcXVpcmUgbW9yZSB3b3JrIHRvIGdldCBpdAorCSAqIGdvaW5nLiBIZW5jZSBpdCBpcyB0b3RhbGx5IHVudGVzdGVkLgorCSAqLworCWRvIHsKKwkJc3RydWN0IGFkZnNfZGlzY3JlY29yZCAqZHI7CisJCXVuc2lnbmVkIGludCBucl9zZWN0czsKKworCQlkYXRhID0gcmVhZF9kZXZfc2VjdG9yKGJkZXYsIHN0YXJ0X2JsayAqIDIgKyA2LCAmc2VjdCk7CisJCWlmICghZGF0YSkKKwkJCXJldHVybiAtMTsKKworCQlpZiAoc2xvdCA9PSBzdGF0ZS0+bGltaXQpCisJCQlicmVhazsKKworCQlkciA9IGFkZnNfcGFydGl0aW9uKHN0YXRlLCBuYW1lLCBkYXRhLCBmaXJzdF9zZWN0b3IsIHNsb3QrKyk7CisJCWlmICghZHIpCisJCQlicmVhazsKKworCQluYW1lID0gTlVMTDsKKworCQlucl9zZWN0cyA9IChkYXRhWzB4MWZkXSArIChkYXRhWzB4MWZlXSA8PCA4KSkgKgorCQkJICAgKGRyLT5oZWFkcyArIChkci0+bG93c2VjdG9yICYgMHg0MCA/IDEgOiAwKSkgKgorCQkJICAgZHItPnNlY3NwZXJ0cmFjazsKKworCQlpZiAoIW5yX3NlY3RzKQorCQkJYnJlYWs7CisKKwkJZmlyc3QgPSAwOworCQlmaXJzdF9zZWN0b3IgKz0gbnJfc2VjdHM7CisJCXN0YXJ0X2JsayArPSBucl9zZWN0cyA+PiAoQkxPQ0tfU0laRV9CSVRTIC0gOSk7CisJCW5yX3NlY3RzID0gMDsgLyogaG1tIC0gc2hvdWxkIGJlIHBhcnRpdGlvbiBzaXplICovCisKKwkJc3dpdGNoIChkYXRhWzB4MWZjXSAmIDE1KSB7CisJCWNhc2UgMDogLyogTm8gcGFydGl0aW9uIC8gQURGUz8gKi8KKwkJCWJyZWFrOworCisjaWZkZWYgQ09ORklHX0FDT1JOX1BBUlRJVElPTl9SSVNDSVgKKwkJY2FzZSBQQVJUSVRJT05fUklTQ0lYX1NDU0k6CisJCQkvKiBSSVNDaVggLSB3ZSBkb24ndCBrbm93IGhvdyB0byBmaW5kIHRoZSBuZXh0IG9uZS4gKi8KKwkJCXNsb3QgPSByaXNjaXhfcGFydGl0aW9uKHN0YXRlLCBiZGV2LCBmaXJzdF9zZWN0b3IsCisJCQkJCQkgc2xvdCwgbnJfc2VjdHMpOworCQkJYnJlYWs7CisjZW5kaWYKKworCQljYXNlIFBBUlRJVElPTl9MSU5VWDoKKwkJCXNsb3QgPSBsaW51eF9wYXJ0aXRpb24oc3RhdGUsIGJkZXYsIGZpcnN0X3NlY3RvciwKKwkJCQkJCXNsb3QsIG5yX3NlY3RzKTsKKwkJCWJyZWFrOworCQl9CisJCXB1dF9kZXZfc2VjdG9yKHNlY3QpOworCQlpZiAoc2xvdCA9PSAtMSkKKwkJCXJldHVybiAtMTsKKwl9IHdoaWxlICgxKTsKKwlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKwlyZXR1cm4gZmlyc3QgPyAwIDogMTsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FDT1JOX1BBUlRJVElPTl9BREZTCisvKgorICogUHVycG9zZTogYWxsb2NhdGUgQURGUyBwYXJ0aXRpb25zLgorICoKKyAqIFBhcmFtcyA6IGhkCQktIHBvaW50ZXIgdG8gZ2VuZGlzayBzdHJ1Y3R1cmUgdG8gc3RvcmUgcGFydGl0aW9uIGluZm8uCisgKgkgICAgZGV2CQktIGRldmljZSBudW1iZXIgdG8gYWNjZXNzLgorICoKKyAqIFJldHVybnM6IC0xIG9uIGVycm9yLCAwIGZvciBubyBBREZTIGJvb3Qgc2VjdG9yLCAxIGZvciBvay4KKyAqCisgKiBBbGxvYyAgOiBoZGEgID0gd2hvbGUgZHJpdmUKKyAqCSAgICBoZGExID0gQURGUyBwYXJ0aXRpb24gb24gZmlyc3QgZHJpdmUuCisgKgkgICAgaGRhMiA9IG5vbi1BREZTIHBhcnRpdGlvbi4KKyAqLworaW50CithZGZzcGFydF9jaGVja19BREZTKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJdW5zaWduZWQgbG9uZyBzdGFydF9zZWN0LCBucl9zZWN0cywgc2VjdHNjeWwsIGhlYWRzOworCVNlY3RvciBzZWN0OworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJc3RydWN0IGFkZnNfZGlzY3JlY29yZCAqZHI7CisJdW5zaWduZWQgY2hhciBpZDsKKwlpbnQgc2xvdCA9IDE7CisKKwlkYXRhID0gcmVhZF9kZXZfc2VjdG9yKGJkZXYsIDYsICZzZWN0KTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtMTsKKworCWRyID0gYWRmc19wYXJ0aXRpb24oc3RhdGUsICJBREZTIiwgZGF0YSwgMCwgc2xvdCsrKTsKKwlpZiAoIWRyKSB7CisJCXB1dF9kZXZfc2VjdG9yKHNlY3QpOworICAgIAkJcmV0dXJuIDA7CisJfQorCisJaGVhZHMgPSBkci0+aGVhZHMgKyAoKGRyLT5sb3dzZWN0b3IgPj4gNikgJiAxKTsKKwlzZWN0c2N5bCA9IGRyLT5zZWNzcGVydHJhY2sgKiBoZWFkczsKKwlzdGFydF9zZWN0ID0gKChkYXRhWzB4MWZlXSA8PCA4KSArIGRhdGFbMHgxZmRdKSAqIHNlY3RzY3lsOworCWlkID0gZGF0YVsweDFmY10gJiAxNTsKKwlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKworI2lmZGVmIENPTkZJR19CTEtfREVWX01GTQorCWlmIChNQUpPUihiZGV2LT5iZF9kZXYpID09IE1GTV9BQ09STl9NQUpPUikgeworCQlleHRlcm4gdm9pZCB4ZF9zZXRfZ2VvbWV0cnkoc3RydWN0IGJsb2NrX2RldmljZSAqLAorCQkJdW5zaWduZWQgY2hhciwgdW5zaWduZWQgY2hhciwgdW5zaWduZWQgaW50KTsKKwkJeGRfc2V0X2dlb21ldHJ5KGJkZXYsIGRyLT5zZWNzcGVydHJhY2ssIGhlYWRzLCAxKTsKKwkJaW52YWxpZGF0ZV9iZGV2KGJkZXYsIDEpOworCQl0cnVuY2F0ZV9pbm9kZV9wYWdlcyhiZGV2LT5iZF9pbm9kZS0+aV9tYXBwaW5nLCAwKTsKKwl9CisjZW5kaWYKKworCS8qCisJICogV29yayBvdXQgc3RhcnQgb2Ygbm9uLWFkZnMgcGFydGl0aW9uLgorCSAqLworCW5yX3NlY3RzID0gKGJkZXYtPmJkX2lub2RlLT5pX3NpemUgPj4gOSkgLSBzdGFydF9zZWN0OworCisJaWYgKHN0YXJ0X3NlY3QpIHsKKwkJc3dpdGNoIChpZCkgeworI2lmZGVmIENPTkZJR19BQ09STl9QQVJUSVRJT05fUklTQ0lYCisJCWNhc2UgUEFSVElUSU9OX1JJU0NJWF9TQ1NJOgorCQljYXNlIFBBUlRJVElPTl9SSVNDSVhfTUZNOgorCQkJc2xvdCA9IHJpc2NpeF9wYXJ0aXRpb24oc3RhdGUsIGJkZXYsIHN0YXJ0X3NlY3QsCisJCQkJCQkgc2xvdCwgbnJfc2VjdHMpOworCQkJYnJlYWs7CisjZW5kaWYKKworCQljYXNlIFBBUlRJVElPTl9MSU5VWDoKKwkJCXNsb3QgPSBsaW51eF9wYXJ0aXRpb24oc3RhdGUsIGJkZXYsIHN0YXJ0X3NlY3QsCisJCQkJCQlzbG90LCBucl9zZWN0cyk7CisJCQlicmVhazsKKwkJfQorCX0KKwlwcmludGsoIlxuIik7CisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19BQ09STl9QQVJUSVRJT05fSUNTCisKK3N0cnVjdCBpY3NfcGFydCB7CisJX19sZTMyIHN0YXJ0OworCV9fbGUzMiBzaXplOworfTsKKworc3RhdGljIGludCBhZGZzcGFydF9jaGVja19JQ1NMaW51eChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCB1bnNpZ25lZCBsb25nIGJsb2NrKQoreworCVNlY3RvciBzZWN0OworCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSByZWFkX2Rldl9zZWN0b3IoYmRldiwgYmxvY2ssICZzZWN0KTsKKwlpbnQgcmVzdWx0ID0gMDsKKworCWlmIChkYXRhKSB7CisJCWlmIChtZW1jbXAoZGF0YSwgIkxpbnV4UGFydCIsIDkpID09IDApCisJCQlyZXN1bHQgPSAxOworCQlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogQ2hlY2sgZm9yIGEgdmFsaWQgSUNTIHBhcnRpdGlvbiB1c2luZyB0aGUgY2hlY2tzdW0uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHZhbGlkX2ljc19zZWN0b3IoY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIHN1bTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDAsIHN1bSA9IDB4NTA2MTcyNzQ7IGkgPCA1MDg7IGkrKykKKwkJc3VtICs9IGRhdGFbaV07CisKKwlzdW0gLT0gbGUzMl90b19jcHUoKihfX2xlMzIgKikoJmRhdGFbNTA4XSkpOworCisJcmV0dXJuIHN1bSA9PSAwOworfQorCisvKgorICogUHVycG9zZTogYWxsb2NhdGUgSUNTIHBhcnRpdGlvbnMuCisgKiBQYXJhbXMgOiBoZAkJLSBwb2ludGVyIHRvIGdlbmRpc2sgc3RydWN0dXJlIHRvIHN0b3JlIHBhcnRpdGlvbiBpbmZvLgorICoJICAgIGRldgkJLSBkZXZpY2UgbnVtYmVyIHRvIGFjY2Vzcy4KKyAqIFJldHVybnM6IC0xIG9uIGVycm9yLCAwIGZvciBubyBJQ1MgdGFibGUsIDEgZm9yIHBhcnRpdGlvbnMgb2suCisgKiBBbGxvYyAgOiBoZGEgID0gd2hvbGUgZHJpdmUKKyAqCSAgICBoZGExID0gQURGUyBwYXJ0aXRpb24gMCBvbiBmaXJzdCBkcml2ZS4KKyAqCSAgICBoZGEyID0gQURGUyBwYXJ0aXRpb24gMSBvbiBmaXJzdCBkcml2ZS4KKyAqCQkuLmV0Yy4uCisgKi8KK2ludAorYWRmc3BhcnRfY2hlY2tfSUNTKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YTsKKwljb25zdCBzdHJ1Y3QgaWNzX3BhcnQgKnA7CisJaW50IHNsb3Q7CisJU2VjdG9yIHNlY3Q7CisKKwkvKgorCSAqIFRyeSBJQ1Mgc3R5bGUgcGFydGl0aW9ucyAtIHNlY3RvciAwIGNvbnRhaW5zIHBhcnRpdGlvbiBpbmZvLgorCSAqLworCWRhdGEgPSByZWFkX2Rldl9zZWN0b3IoYmRldiwgMCwgJnNlY3QpOworCWlmICghZGF0YSkKKwkgICAgCXJldHVybiAtMTsKKworCWlmICghdmFsaWRfaWNzX3NlY3RvcihkYXRhKSkgeworCSAgICAJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CisJCXJldHVybiAwOworCX0KKworCXByaW50aygiIFtJQ1NdIik7CisKKwlmb3IgKHNsb3QgPSAxLCBwID0gKGNvbnN0IHN0cnVjdCBpY3NfcGFydCAqKWRhdGE7IHAtPnNpemU7IHArKykgeworCQl1MzIgc3RhcnQgPSBsZTMyX3RvX2NwdShwLT5zdGFydCk7CisJCXMzMiBzaXplID0gbGUzMl90b19jcHUocC0+c2l6ZSk7IC8qIHllcywgaXQncyBzaWduZWQuICovCisKKwkJaWYgKHNsb3QgPT0gc3RhdGUtPmxpbWl0KQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogTmVnYXRpdmUgc2l6ZXMgdGVsbCB0aGUgUklTQyBPUyBJQ1MgZHJpdmVyIHRvIGlnbm9yZQorCQkgKiB0aGlzIHBhcnRpdGlvbiAtIGluIGVmZmVjdCBpdCBzYXlzIHRoYXQgdGhpcyBkb2VzIG5vdAorCQkgKiBjb250YWluIGFuIEFERlMgZmlsZXN5c3RlbS4KKwkJICovCisJCWlmIChzaXplIDwgMCkgeworCQkJc2l6ZSA9IC1zaXplOworCisJCQkvKgorCQkJICogT3VyIG93biBleHRlbnNpb24gLSBXZSB1c2UgdGhlIGZpcnN0IHNlY3RvcgorCQkJICogb2YgdGhlIHBhcnRpdGlvbiB0byBpZGVudGlmeSB3aGF0IHR5cGUgdGhpcworCQkJICogcGFydGl0aW9uIGlzLiAgV2UgbXVzdCBub3QgbWFrZSB0aGlzIHZpc2libGUKKwkJCSAqIHRvIHRoZSBmaWxlc3lzdGVtLgorCQkJICovCisJCQlpZiAoc2l6ZSA+IDEgJiYgYWRmc3BhcnRfY2hlY2tfSUNTTGludXgoYmRldiwgc3RhcnQpKSB7CisJCQkJc3RhcnQgKz0gMTsKKwkJCQlzaXplIC09IDE7CisJCQl9CisJCX0KKworCQlpZiAoc2l6ZSkKKwkJCXB1dF9wYXJ0aXRpb24oc3RhdGUsIHNsb3QrKywgc3RhcnQsIHNpemUpOworCX0KKworCXB1dF9kZXZfc2VjdG9yKHNlY3QpOworCXByaW50aygiXG4iKTsKKwlyZXR1cm4gMTsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FDT1JOX1BBUlRJVElPTl9QT1dFUlRFQworc3RydWN0IHB0ZWNfcGFydCB7CisJX19sZTMyIHVudXNlZDE7CisJX19sZTMyIHVudXNlZDI7CisJX19sZTMyIHN0YXJ0OworCV9fbGUzMiBzaXplOworCV9fbGUzMiB1bnVzZWQ1OworCWNoYXIgdHlwZVs4XTsKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IHZhbGlkX3B0ZWNfc2VjdG9yKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEpCit7CisJdW5zaWduZWQgY2hhciBjaGVja3N1bSA9IDB4MmE7CisJaW50IGk7CisKKwkvKgorCSAqIElmIGl0IGxvb2tzIGxpa2UgYSBQQy9CSU9TIHBhcnRpdGlvbiwgdGhlbiBpdAorCSAqIHByb2JhYmx5IGlzbid0IFBvd2VyVGVjLgorCSAqLworCWlmIChkYXRhWzUxMF0gPT0gMHg1NSAmJiBkYXRhWzUxMV0gPT0gMHhhYSkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgNTExOyBpKyspCisJCWNoZWNrc3VtICs9IGRhdGFbaV07CisKKwlyZXR1cm4gY2hlY2tzdW0gPT0gZGF0YVs1MTFdOworfQorCisvKgorICogUHVycG9zZTogYWxsb2NhdGUgSUNTIHBhcnRpdGlvbnMuCisgKiBQYXJhbXMgOiBoZAkJLSBwb2ludGVyIHRvIGdlbmRpc2sgc3RydWN0dXJlIHRvIHN0b3JlIHBhcnRpdGlvbiBpbmZvLgorICoJICAgIGRldgkJLSBkZXZpY2UgbnVtYmVyIHRvIGFjY2Vzcy4KKyAqIFJldHVybnM6IC0xIG9uIGVycm9yLCAwIGZvciBubyBJQ1MgdGFibGUsIDEgZm9yIHBhcnRpdGlvbnMgb2suCisgKiBBbGxvYyAgOiBoZGEgID0gd2hvbGUgZHJpdmUKKyAqCSAgICBoZGExID0gQURGUyBwYXJ0aXRpb24gMCBvbiBmaXJzdCBkcml2ZS4KKyAqCSAgICBoZGEyID0gQURGUyBwYXJ0aXRpb24gMSBvbiBmaXJzdCBkcml2ZS4KKyAqCQkuLmV0Yy4uCisgKi8KK2ludAorYWRmc3BhcnRfY2hlY2tfUE9XRVJURUMoc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKK3sKKwlTZWN0b3Igc2VjdDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOworCWNvbnN0IHN0cnVjdCBwdGVjX3BhcnQgKnA7CisJaW50IHNsb3QgPSAxOworCWludCBpOworCisJZGF0YSA9IHJlYWRfZGV2X3NlY3RvcihiZGV2LCAwLCAmc2VjdCk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoIXZhbGlkX3B0ZWNfc2VjdG9yKGRhdGEpKSB7CisJCXB1dF9kZXZfc2VjdG9yKHNlY3QpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwcmludGsoIiBbUE9XRVJURUNdIik7CisKKwlmb3IgKGkgPSAwLCBwID0gKGNvbnN0IHN0cnVjdCBwdGVjX3BhcnQgKilkYXRhOyBpIDwgMTI7IGkrKywgcCsrKSB7CisJCXUzMiBzdGFydCA9IGxlMzJfdG9fY3B1KHAtPnN0YXJ0KTsKKwkJdTMyIHNpemUgPSBsZTMyX3RvX2NwdShwLT5zaXplKTsKKworCQlpZiAoc2l6ZSkKKwkJCXB1dF9wYXJ0aXRpb24oc3RhdGUsIHNsb3QrKywgc3RhcnQsIHNpemUpOworCX0KKworCXB1dF9kZXZfc2VjdG9yKHNlY3QpOworCXByaW50aygiXG4iKTsKKwlyZXR1cm4gMTsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0FDT1JOX1BBUlRJVElPTl9FRVNPWAorc3RydWN0IGVlc294X3BhcnQgeworCWNoYXIJbWFnaWNbNl07CisJY2hhcgluYW1lWzEwXTsKKwlfX2xlMzIJc3RhcnQ7CisJX19sZTMyCXVudXNlZDY7CisJX19sZTMyCXVudXNlZDc7CisJX19sZTMyCXVudXNlZDg7Cit9OworCisvKgorICogR3Vlc3Mgd2hvIGNyZWF0ZWQgdGhpcyBmb3JtYXQ/CisgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGVlc294X25hbWVbXSA9IHsKKwknTicsICdlJywgJ2knLCAnbCcsICcgJywKKwknQycsICdyJywgJ2knLCAndCcsICdjJywgJ2gnLCAnZScsICdsJywgJ2wnLCAnICcsICcgJworfTsKKworLyoKKyAqIEVFU09YIFNDU0kgcGFydGl0aW9uIGZvcm1hdC4KKyAqCisgKiBUaGlzIGlzIGEgZ29kZGFtbmVkIGF3ZnVsIHBhcnRpdGlvbiBmb3JtYXQuICBXZSBkb24ndCBzZWVtIHRvIHN0b3JlCisgKiB0aGUgc2l6ZSBvZiB0aGUgcGFydGl0aW9uIGluIHRoaXMgdGFibGUsIG9ubHkgdGhlIHN0YXJ0IGFkZHJlc3Nlcy4KKyAqCisgKiBUaGVyZSBhcmUgdHdvIHBvc3NpYmlsaXRpZXMgd2hlcmUgdGhlIHNpemUgY29tZXMgZnJvbToKKyAqICAxLiBUaGUgaW5kaXZpZHVhbCBBREZTIGJvb3QgYmxvY2sgZW50cmllcyB0aGF0IGFyZSBwbGFjZWQgb24gdGhlIGRpc2suCisgKiAgMi4gVGhlIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIG5leHQgZW50cnkuCisgKi8KK2ludAorYWRmc3BhcnRfY2hlY2tfRUVTT1goc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKK3sKKwlTZWN0b3Igc2VjdDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhOworCXVuc2lnbmVkIGNoYXIgYnVmZmVyWzI1Nl07CisJc3RydWN0IGVlc294X3BhcnQgKnA7CisJc2VjdG9yX3Qgc3RhcnQgPSAwOworCWludCBpLCBzbG90ID0gMTsKKworCWRhdGEgPSByZWFkX2Rldl9zZWN0b3IoYmRldiwgNywgJnNlY3QpOworCWlmICghZGF0YSkKKwkJcmV0dXJuIC0xOworCisJLyoKKwkgKiAiRGVjcnlwdCIgdGhlIHBhcnRpdGlvbiB0YWJsZS4gIEdvZCBrbm93cyB3aHkuLi4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCWJ1ZmZlcltpXSA9IGRhdGFbaV0gXiBlZXNveF9uYW1lW2kgJiAxNV07CisKKwlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKworCWZvciAoaSA9IDAsIHAgPSAoc3RydWN0IGVlc294X3BhcnQgKilidWZmZXI7IGkgPCA4OyBpKyssIHArKykgeworCQlzZWN0b3JfdCBuZXh0OworCisJCWlmIChtZW1jbXAocC0+bWFnaWMsICJFZXNveCIsIDYpKQorCQkJYnJlYWs7CisKKwkJbmV4dCA9IGxlMzJfdG9fY3B1KHAtPnN0YXJ0KTsKKwkJaWYgKGkpCisJCQlwdXRfcGFydGl0aW9uKHN0YXRlLCBzbG90KyssIHN0YXJ0LCBuZXh0IC0gc3RhcnQpOworCQlzdGFydCA9IG5leHQ7CisJfQorCisJaWYgKGkgIT0gMCkgeworCQlzZWN0b3JfdCBzaXplOworCisJCXNpemUgPSBnZXRfY2FwYWNpdHkoYmRldi0+YmRfZGlzayk7CisJCXB1dF9wYXJ0aXRpb24oc3RhdGUsIHNsb3QrKywgc3RhcnQsIHNpemUgLSBzdGFydCk7CisJCXByaW50aygiXG4iKTsKKwl9CisKKwlyZXR1cm4gaSA/IDEgOiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL2Fjb3JuLmggYi9mcy9wYXJ0aXRpb25zL2Fjb3JuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFmZDUwZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3BhcnRpdGlvbnMvYWNvcm4uaApAQCAtMCwwICsxLDE0IEBACisvKgorICogbGludXgvZnMvcGFydGl0aW9ucy9hY29ybi5oCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMDEgUnVzc2VsbCBLaW5nLgorICoKKyAqICBJIF9oYXRlXyB0aGlzIHBhcnRpdGlvbmluZyBtZXNzIC0gd2h5IGNhbid0IHdlIGhhdmUgb25lIGRlZmluZWQKKyAqICBmb3JtYXQsIGFuZCBldmVyeW9uZSBzdGljayB0byBpdD8KKyAqLworCitpbnQgYWRmc3BhcnRfY2hlY2tfQ1VNQU5BKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpOworaW50IGFkZnNwYXJ0X2NoZWNrX0FERlMoc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldik7CitpbnQgYWRmc3BhcnRfY2hlY2tfSUNTKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpOworaW50IGFkZnNwYXJ0X2NoZWNrX1BPV0VSVEVDKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpOworaW50IGFkZnNwYXJ0X2NoZWNrX0VFU09YKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpOwpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9hbWlnYS5jIGIvZnMvcGFydGl0aW9ucy9hbWlnYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNjg1MjgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wYXJ0aXRpb25zL2FtaWdhLmMKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiAgZnMvcGFydGl0aW9ucy9hbWlnYS5jCisgKgorICogIENvZGUgZXh0cmFjdGVkIGZyb20gZHJpdmVycy9ibG9jay9nZW5oZC5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MS0xOTk4ICBMaW51cyBUb3J2YWxkcworICogIFJlLW9yZ2FuaXNlZCBGZWIgMTk5OCBSdXNzZWxsIEtpbmcKKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9hZmZzX2hhcmRibG9ja3MuaD4KKworI2luY2x1ZGUgImNoZWNrLmgiCisjaW5jbHVkZSAiYW1pZ2EuaCIKKworc3RhdGljIF9faW5saW5lX18gdTMyCitjaGVja3N1bV9ibG9jayhfX2JlMzIgKm0sIGludCBzaXplKQoreworCXUzMiBzdW0gPSAwOworCisJd2hpbGUgKHNpemUtLSkKKwkJc3VtICs9IGJlMzJfdG9fY3B1KCptKyspOworCXJldHVybiBzdW07Cit9CisKK2ludAorYW1pZ2FfcGFydGl0aW9uKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJU2VjdG9yIHNlY3Q7CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKwlzdHJ1Y3QgUmlnaWREaXNrQmxvY2sgKnJkYjsKKwlzdHJ1Y3QgUGFydGl0aW9uQmxvY2sgKnBiOworCWludCBzdGFydF9zZWN0LCBucl9zZWN0cywgYmxrLCBwYXJ0LCByZXMgPSAwOworCWludCBibGtzaXplID0gMTsJLyogTXVsdGlwbGllciBmb3IgZGlzayBibG9jayBzaXplICovCisJaW50IHNsb3QgPSAxOworCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKKworCWZvciAoYmxrID0gMDsgOyBibGsrKywgcHV0X2Rldl9zZWN0b3Ioc2VjdCkpIHsKKwkJaWYgKGJsayA9PSBSREJfQUxMT0NBVElPTl9MSU1JVCkKKwkJCWdvdG8gcmRiX2RvbmU7CisJCWRhdGEgPSByZWFkX2Rldl9zZWN0b3IoYmRldiwgYmxrLCAmc2VjdCk7CisJCWlmICghZGF0YSkgeworCQkJaWYgKHdhcm5fbm9fcGFydCkKKwkJCQlwcmludGsoIkRldiAlczogdW5hYmxlIHRvIHJlYWQgUkRCIGJsb2NrICVkXG4iLAorCQkJCSAgICAgICBiZGV2bmFtZShiZGV2LCBiKSwgYmxrKTsKKwkJCWdvdG8gcmRiX2RvbmU7CisJCX0KKwkJaWYgKCooX19iZTMyICopZGF0YSAhPSBjcHVfdG9fYmUzMihJRE5BTUVfUklHSURESVNLKSkKKwkJCWNvbnRpbnVlOworCisJCXJkYiA9IChzdHJ1Y3QgUmlnaWREaXNrQmxvY2sgKilkYXRhOworCQlpZiAoY2hlY2tzdW1fYmxvY2soKF9fYmUzMiAqKWRhdGEsIGJlMzJfdG9fY3B1KHJkYi0+cmRiX1N1bW1lZExvbmdzKSAmIDB4N0YpID09IDApCisJCQlicmVhazsKKwkJLyogVHJ5IGFnYWluIHdpdGggMHhkYy4uMHhkZiB6ZXJvZWQsIFdpbmRvd3MgbWlnaHQgaGF2ZQorCQkgKiB0cmFzaGVkIGl0LgorCQkgKi8KKwkJKihfX2JlMzIgKikoZGF0YSsweGRjKSA9IDA7CisJCWlmIChjaGVja3N1bV9ibG9jaygoX19iZTMyICopZGF0YSwKKwkJCQliZTMyX3RvX2NwdShyZGItPnJkYl9TdW1tZWRMb25ncykgJiAweDdGKT09MCkgeworCQkJcHJpbnRrKCJXYXJuaW5nOiBUcmFzaGVkIHdvcmQgYXQgMHhkMCBpbiBibG9jayAlZCAiCisJCQkJImlnbm9yZWQgaW4gY2hlY2tzdW0gY2FsY3VsYXRpb25cbiIsYmxrKTsKKwkJCWJyZWFrOworCQl9CisKKwkJcHJpbnRrKCJEZXYgJXM6IFJEQiBpbiBibG9jayAlZCBoYXMgYmFkIGNoZWNrc3VtXG4iLAorCQkJICAgICAgIGJkZXZuYW1lKGJkZXYsIGIpLCBibGspOworCX0KKworCS8qIGJsa3NpemUgaXMgYmxvY2tzIHBlciA1MTIgYnl0ZSBzdGFuZGFyZCBibG9jayAqLworCWJsa3NpemUgPSBiZTMyX3RvX2NwdSggcmRiLT5yZGJfQmxvY2tCeXRlcyApIC8gNTEyOworCisJcHJpbnRrKCIgUkRTSyAoJWQpIiwgYmxrc2l6ZSAqIDUxMik7CS8qIEJlIG1vcmUgaW5mb3JtYXRpdmUgKi8KKwlibGsgPSBiZTMyX3RvX2NwdShyZGItPnJkYl9QYXJ0aXRpb25MaXN0KTsKKwlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKwlmb3IgKHBhcnQgPSAxOyBibGs+MCAmJiBwYXJ0PD0xNjsgcGFydCsrLCBwdXRfZGV2X3NlY3RvcihzZWN0KSkgeworCQlibGsgKj0gYmxrc2l6ZTsJLyogUmVhZCBpbiB0ZXJtcyBwYXJ0aXRpb24gdGFibGUgdW5kZXJzdGFuZHMgKi8KKwkJZGF0YSA9IHJlYWRfZGV2X3NlY3RvcihiZGV2LCBibGssICZzZWN0KTsKKwkJaWYgKCFkYXRhKSB7CisJCQlpZiAod2Fybl9ub19wYXJ0KQorCQkJCXByaW50aygiRGV2ICVzOiB1bmFibGUgdG8gcmVhZCBwYXJ0aXRpb24gYmxvY2sgJWRcbiIsCisJCQkJICAgICAgIGJkZXZuYW1lKGJkZXYsIGIpLCBibGspOworCQkJZ290byByZGJfZG9uZTsKKwkJfQorCQlwYiAgPSAoc3RydWN0IFBhcnRpdGlvbkJsb2NrICopZGF0YTsKKwkJYmxrID0gYmUzMl90b19jcHUocGItPnBiX05leHQpOworCQlpZiAocGItPnBiX0lEICE9IGNwdV90b19iZTMyKElETkFNRV9QQVJUSVRJT04pKQorCQkJY29udGludWU7CisJCWlmIChjaGVja3N1bV9ibG9jaygoX19iZTMyICopcGIsIGJlMzJfdG9fY3B1KHBiLT5wYl9TdW1tZWRMb25ncykgJiAweDdGKSAhPSAwICkKKwkJCWNvbnRpbnVlOworCisJCS8qIFRlbGwgS2VybmVsIGFib3V0IGl0ICovCisKKwkJbnJfc2VjdHMgPSAoYmUzMl90b19jcHUocGItPnBiX0Vudmlyb25tZW50WzEwXSkgKyAxIC0KKwkJCSAgICBiZTMyX3RvX2NwdShwYi0+cGJfRW52aXJvbm1lbnRbOV0pKSAqCisJCQkgICBiZTMyX3RvX2NwdShwYi0+cGJfRW52aXJvbm1lbnRbM10pICoKKwkJCSAgIGJlMzJfdG9fY3B1KHBiLT5wYl9FbnZpcm9ubWVudFs1XSkgKgorCQkJICAgYmxrc2l6ZTsKKwkJaWYgKCFucl9zZWN0cykKKwkJCWNvbnRpbnVlOworCQlzdGFydF9zZWN0ID0gYmUzMl90b19jcHUocGItPnBiX0Vudmlyb25tZW50WzldKSAqCisJCQkgICAgIGJlMzJfdG9fY3B1KHBiLT5wYl9FbnZpcm9ubWVudFszXSkgKgorCQkJICAgICBiZTMyX3RvX2NwdShwYi0+cGJfRW52aXJvbm1lbnRbNV0pICoKKwkJCSAgICAgYmxrc2l6ZTsKKwkJcHV0X3BhcnRpdGlvbihzdGF0ZSxzbG90Kyssc3RhcnRfc2VjdCxucl9zZWN0cyk7CisJCXsKKwkJCS8qIEJlIGV2ZW4gbW9yZSBpbmZvcm1hdGl2ZSB0byBhaWQgbW91bnRpbmcgKi8KKwkJCWNoYXIgZG9zdHlwZVs0XTsKKwkJCV9fYmUzMiAqZHQgPSAoX19iZTMyICopZG9zdHlwZTsKKwkJCSpkdCA9IHBiLT5wYl9FbnZpcm9ubWVudFsxNl07CisJCQlpZiAoZG9zdHlwZVszXSA8ICcgJykKKwkJCQlwcmludGsoIiAoJWMlYyVjXiVjKSIsCisJCQkJCWRvc3R5cGVbMF0sIGRvc3R5cGVbMV0sCisJCQkJCWRvc3R5cGVbMl0sIGRvc3R5cGVbM10gKyAnQCcgKTsKKwkJCWVsc2UKKwkJCQlwcmludGsoIiAoJWMlYyVjJWMpIiwKKwkJCQkJZG9zdHlwZVswXSwgZG9zdHlwZVsxXSwKKwkJCQkJZG9zdHlwZVsyXSwgZG9zdHlwZVszXSk7CisJCQlwcmludGsoIihyZXMgJWQgc3BiICVkKSIsCisJCQkJYmUzMl90b19jcHUocGItPnBiX0Vudmlyb25tZW50WzZdKSwKKwkJCQliZTMyX3RvX2NwdShwYi0+cGJfRW52aXJvbm1lbnRbNF0pKTsKKwkJfQorCQlyZXMgPSAxOworCX0KKwlwcmludGsoIlxuIik7CisKK3JkYl9kb25lOgorCXJldHVybiByZXM7Cit9CmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL2FtaWdhLmggYi9mcy9wYXJ0aXRpb25zL2FtaWdhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYzZTljZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3BhcnRpdGlvbnMvYW1pZ2EuaApAQCAtMCwwICsxLDYgQEAKKy8qCisgKiAgZnMvcGFydGl0aW9ucy9hbWlnYS5oCisgKi8KKworaW50IGFtaWdhX3BhcnRpdGlvbihzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KTsKKwpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9hdGFyaS5jIGIvZnMvcGFydGl0aW9ucy9hdGFyaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MmE2YWQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wYXJ0aXRpb25zL2F0YXJpLmMKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiAgZnMvcGFydGl0aW9ucy9hdGFyaS5jCisgKgorICogIENvZGUgZXh0cmFjdGVkIGZyb20gZHJpdmVycy9ibG9jay9nZW5oZC5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MS0xOTk4ICBMaW51cyBUb3J2YWxkcworICogIFJlLW9yZ2FuaXNlZCBGZWIgMTk5OCBSdXNzZWxsIEtpbmcKKyAqLworCisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlICJjaGVjay5oIgorI2luY2x1ZGUgImF0YXJpLmgiCisKKy8qICsrZ3VlbnRoZXI6IHRoaXMgc2hvdWxkIGJlIHNldHRhYmxlIGJ5IHRoZSB1c2VyICgibWFrZSBjb25maWciKT8uCisgKi8KKyNkZWZpbmUgSUNEX1BBUlRTCisKKy8qIGNoZWNrIGlmIGEgcGFydGl0aW9uIGVudHJ5IGxvb2tzIHZhbGlkIC0tIEF0YXJpIGZvcm1hdCBpcyBhc3N1bWVkIGlmIGF0CisgICBsZWFzdCBvbmUgb2YgdGhlIHByaW1hcnkgZW50cmllcyBpcyBvayB0aGlzIHdheSAqLworI2RlZmluZQlWQUxJRF9QQVJUSVRJT04ocGksaGRzaXopCQkJCQkgICAgIFwKKyAgICAoKChwaSktPmZsZyAmIDEpICYmCQkJCQkJCSAgICAgXAorICAgICBpc2FsbnVtKChwaSktPmlkWzBdKSAmJiBpc2FsbnVtKChwaSktPmlkWzFdKSAmJiBpc2FsbnVtKChwaSktPmlkWzJdKSAmJiBcCisgICAgIGJlMzJfdG9fY3B1KChwaSktPnN0KSA8PSAoaGRzaXopICYmCQkJCSAgICAgXAorICAgICBiZTMyX3RvX2NwdSgocGkpLT5zdCkgKyBiZTMyX3RvX2NwdSgocGkpLT5zaXopIDw9IChoZHNpeikpCisKK3N0YXRpYyBpbmxpbmUgaW50IE9LX2lkKGNoYXIgKnMpCit7CisJcmV0dXJuICBtZW1jbXAgKHMsICJHRU0iLCAzKSA9PSAwIHx8IG1lbWNtcCAocywgIkJHTSIsIDMpID09IDAgfHwKKwkJbWVtY21wIChzLCAiTE5YIiwgMykgPT0gMCB8fCBtZW1jbXAgKHMsICJTV1AiLCAzKSA9PSAwIHx8CisJCW1lbWNtcCAocywgIlJBVyIsIDMpID09IDAgOworfQorCitpbnQgYXRhcmlfcGFydGl0aW9uKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJU2VjdG9yIHNlY3Q7CisJc3RydWN0IHJvb3RzZWN0b3IgKnJzOworCXN0cnVjdCBwYXJ0aXRpb25faW5mbyAqcGk7CisJdTMyIGV4dGVuc2VjdDsKKwl1MzIgaGRfc2l6ZTsKKwlpbnQgc2xvdDsKKyNpZmRlZiBJQ0RfUEFSVFMKKwlpbnQgcGFydF9mbXQgPSAwOyAvKiAwOnVua25vd24sIDE6QUhESSwgMjpJQ0QvU3VwcmEgKi8KKyNlbmRpZgorCisJcnMgPSAoc3RydWN0IHJvb3RzZWN0b3IgKikgcmVhZF9kZXZfc2VjdG9yKGJkZXYsIDAsICZzZWN0KTsKKwlpZiAoIXJzKQorCQlyZXR1cm4gLTE7CisKKwkvKiBWZXJpZnkgdGhpcyBpcyBhbiBBdGFyaSByb290c2VjdG9yOiAqLworCWhkX3NpemUgPSBiZGV2LT5iZF9pbm9kZS0+aV9zaXplID4+IDk7CisJaWYgKCFWQUxJRF9QQVJUSVRJT04oJnJzLT5wYXJ0WzBdLCBoZF9zaXplKSAmJgorCSAgICAhVkFMSURfUEFSVElUSU9OKCZycy0+cGFydFsxXSwgaGRfc2l6ZSkgJiYKKwkgICAgIVZBTElEX1BBUlRJVElPTigmcnMtPnBhcnRbMl0sIGhkX3NpemUpICYmCisJICAgICFWQUxJRF9QQVJUSVRJT04oJnJzLT5wYXJ0WzNdLCBoZF9zaXplKSkgeworCQkvKgorCQkgKiBpZiB0aGVyZSdzIG5vIHZhbGlkIHByaW1hcnkgcGFydGl0aW9uLCBhc3N1bWUgdGhhdCBubyBBdGFyaQorCQkgKiBmb3JtYXQgcGFydGl0aW9uIHRhYmxlICh0aGVyZSdzIG5vIHJlbGlhYmxlIG1hZ2ljIG9yIHRoZSBsaWtlCisJICAgICAgICAgKiA6LSgpCisJCSAqLworCQlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJcGkgPSAmcnMtPnBhcnRbMF07CisJcHJpbnRrICgiIEFIREkiKTsKKwlmb3IgKHNsb3QgPSAxOyBwaSA8ICZycy0+cGFydFs0XSAmJiBzbG90IDwgc3RhdGUtPmxpbWl0OyBzbG90KyssIHBpKyspIHsKKwkJc3RydWN0IHJvb3RzZWN0b3IgKnhyczsKKwkJU2VjdG9yIHNlY3QyOworCQl1bG9uZyBwYXJ0c2VjdDsKKworCQlpZiAoICEocGktPmZsZyAmIDEpICkKKwkJCWNvbnRpbnVlOworCQkvKiBhY3RpdmUgcGFydGl0aW9uICovCisJCWlmIChtZW1jbXAgKHBpLT5pZCwgIlhHTSIsIDMpICE9IDApIHsKKwkJCS8qIHdlIGRvbid0IGNhcmUgYWJvdXQgb3RoZXIgaWQncyAqLworCQkJcHV0X3BhcnRpdGlvbiAoc3RhdGUsIHNsb3QsIGJlMzJfdG9fY3B1KHBpLT5zdCksCisJCQkJCWJlMzJfdG9fY3B1KHBpLT5zaXopKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIGV4dGVuc2lvbiBwYXJ0aXRpb24gKi8KKyNpZmRlZiBJQ0RfUEFSVFMKKwkJcGFydF9mbXQgPSAxOworI2VuZGlmCisJCXByaW50aygiIFhHTTwiKTsKKwkJcGFydHNlY3QgPSBleHRlbnNlY3QgPSBiZTMyX3RvX2NwdShwaS0+c3QpOworCQl3aGlsZSAoMSkgeworCQkJeHJzID0gKHN0cnVjdCByb290c2VjdG9yICopcmVhZF9kZXZfc2VjdG9yKGJkZXYsIHBhcnRzZWN0LCAmc2VjdDIpOworCQkJaWYgKCF4cnMpIHsKKwkJCQlwcmludGsgKCIgYmxvY2sgJWxkIHJlYWQgZmFpbGVkXG4iLCBwYXJ0c2VjdCk7CisJCQkJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCS8qICsrcm9tYW46IHNhbml0eSBjaGVjazogYml0IDAgb2YgZmxnIGZpZWxkIG11c3QgYmUgc2V0ICovCisJCQlpZiAoISh4cnMtPnBhcnRbMF0uZmxnICYgMSkpIHsKKwkJCQlwcmludGsoICJcbkZpcnN0IHN1Yi1wYXJ0aXRpb24gaW4gZXh0ZW5kZWQgcGFydGl0aW9uIGlzIG5vdCB2YWxpZCFcbiIgKTsKKwkJCQlwdXRfZGV2X3NlY3RvcihzZWN0Mik7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXB1dF9wYXJ0aXRpb24oc3RhdGUsIHNsb3QsCisJCQkJICAgcGFydHNlY3QgKyBiZTMyX3RvX2NwdSh4cnMtPnBhcnRbMF0uc3QpLAorCQkJCSAgIGJlMzJfdG9fY3B1KHhycy0+cGFydFswXS5zaXopKTsKKworCQkJaWYgKCEoeHJzLT5wYXJ0WzFdLmZsZyAmIDEpKSB7CisJCQkJLyogZW5kIG9mIGxpbmtlZCBwYXJ0aXRpb24gbGlzdCAqLworCQkJCXB1dF9kZXZfc2VjdG9yKHNlY3QyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChtZW1jbXAoIHhycy0+cGFydFsxXS5pZCwgIlhHTSIsIDMgKSAhPSAwKSB7CisJCQkJcHJpbnRrKCJcbklEIG9mIGV4dGVuZGVkIHBhcnRpdGlvbiBpcyBub3QgWEdNIVxuIik7CisJCQkJcHV0X2Rldl9zZWN0b3Ioc2VjdDIpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlwYXJ0c2VjdCA9IGJlMzJfdG9fY3B1KHhycy0+cGFydFsxXS5zdCkgKyBleHRlbnNlY3Q7CisJCQlwdXRfZGV2X3NlY3RvcihzZWN0Mik7CisJCQlpZiAoKytzbG90ID09IHN0YXRlLT5saW1pdCkgeworCQkJCXByaW50ayggIlxuTWF4aW11bSBudW1iZXIgb2YgcGFydGl0aW9ucyByZWFjaGVkIVxuIiApOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXByaW50aygiID4iKTsKKwl9CisjaWZkZWYgSUNEX1BBUlRTCisJaWYgKCBwYXJ0X2ZtdCE9MSApIHsgLyogbm8gZXh0ZW5kZWQgcGFydGl0aW9ucyAtPiB0ZXN0IElDRC1mb3JtYXQgKi8KKwkJcGkgPSAmcnMtPmljZHBhcnRbMF07CisJCS8qIHNhbml0eSBjaGVjazogbm8gSUNEIGZvcm1hdCBpZiBmaXJzdCBwYXJ0aXRpb24gaW52YWxpZCAqLworCQlpZiAoT0tfaWQocGktPmlkKSkgeworCQkJcHJpbnRrKCIgSUNEPCIpOworCQkJZm9yICg7IHBpIDwgJnJzLT5pY2RwYXJ0WzhdICYmIHNsb3QgPCBzdGF0ZS0+bGltaXQ7IHNsb3QrKywgcGkrKykgeworCQkJCS8qIGFjY2VwdCBvbmx5IEdFTSxCR00sUkFXLExOWCxTV1AgcGFydGl0aW9ucyAqLworCQkJCWlmICghKChwaS0+ZmxnICYgMSkgJiYgT0tfaWQocGktPmlkKSkpCisJCQkJCWNvbnRpbnVlOworCQkJCXBhcnRfZm10ID0gMjsKKwkJCQlwdXRfcGFydGl0aW9uIChzdGF0ZSwgc2xvdCwKKwkJCQkJCWJlMzJfdG9fY3B1KHBpLT5zdCksCisJCQkJCQliZTMyX3RvX2NwdShwaS0+c2l6KSk7CisJCQl9CisJCQlwcmludGsoIiA+Iik7CisJCX0KKwl9CisjZW5kaWYKKwlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKworCXByaW50ayAoIlxuIik7CisKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvYXRhcmkuaCBiL2ZzL3BhcnRpdGlvbnMvYXRhcmkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzE4NmIwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvcGFydGl0aW9ucy9hdGFyaS5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiAgZnMvcGFydGl0aW9ucy9hdGFyaS5oCisgKiAgTW92ZWQgYnkgUnVzc2VsbCBLaW5nIGZyb206CisgKgorICogbGludXgvaW5jbHVkZS9saW51eC9hdGFyaV9yb290c2VjLmgKKyAqIGRlZmluaXRpb25zIGZvciBBdGFyaSBSb290c2VjdG9yIGxheW91dAorICogYnkgQW5kcmVhcyBTY2h3YWIgKHNjaHdhYkBsczUuaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGUpCisgKgorICogbW9kaWZpZWQgZm9yIElDRC9TdXByYSBwYXJ0aXRpb25pbmcgc2NoZW1lIHJlc3RyaWN0ZWQgdG8gYXQgbW9zdCAxMgorICogcGFydGl0aW9ucworICogYnkgR3VlbnRoZXIgS2VsbGV0ZXIgKGd1ZW50aGVyQHBvb2wuaW5mb3JtYXRpay5yd3RoLWFhY2hlbi5kZSkKKyAqLworCitzdHJ1Y3QgcGFydGl0aW9uX2luZm8KK3sKKyAgdTggZmxnOwkJCS8qIGJpdCAwOiBhY3RpdmU7IGJpdCA3OiBib290YWJsZSAqLworICBjaGFyIGlkWzNdOwkJCS8qICJHRU0iLCAiQkdNIiwgIlhHTSIsIG9yIG90aGVyICovCisgIF9fYmUzMiBzdDsJCQkvKiBzdGFydCBvZiBwYXJ0aXRpb24gKi8KKyAgX19iZTMyIHNpejsJCQkvKiBsZW5ndGggb2YgcGFydGl0aW9uICovCit9OworCitzdHJ1Y3Qgcm9vdHNlY3RvcgoreworICBjaGFyIHVudXNlZFsweDE1Nl07CQkvKiByb29tIGZvciBib290IGNvZGUgKi8KKyAgc3RydWN0IHBhcnRpdGlvbl9pbmZvIGljZHBhcnRbOF07CS8qIGluZm8gZm9yIElDRC1wYXJ0aXRpb25zIDUuLjEyICovCisgIGNoYXIgdW51c2VkMlsweGNdOworICB1MzIgaGRfc2l6OwkJCS8qIHNpemUgb2YgZGlzayBpbiBibG9ja3MgKi8KKyAgc3RydWN0IHBhcnRpdGlvbl9pbmZvIHBhcnRbNF07CisgIHUzMiBic2xfc3Q7CQkJLyogc3RhcnQgb2YgYmFkIHNlY3RvciBsaXN0ICovCisgIHUzMiBic2xfY250OwkJCS8qIGxlbmd0aCBvZiBiYWQgc2VjdG9yIGxpc3QgKi8KKyAgdTE2IGNoZWNrc3VtOwkJCS8qIGNoZWNrc3VtIGZvciBib290YWJsZSBkaXNrcyAqLworfSBfX2F0dHJpYnV0ZV9fKChfX3BhY2tlZF9fKSk7CisKK2ludCBhdGFyaV9wYXJ0aXRpb24oc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldik7CmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL2NoZWNrLmMgYi9mcy9wYXJ0aXRpb25zL2NoZWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFjZmY3OAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3BhcnRpdGlvbnMvY2hlY2suYwpAQCAtMCwwICsxLDQ0NSBAQAorLyoKKyAqICBmcy9wYXJ0aXRpb25zL2NoZWNrLmMKKyAqCisgKiAgQ29kZSBleHRyYWN0ZWQgZnJvbSBkcml2ZXJzL2Jsb2NrL2dlbmhkLmMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCAgTGludXMgVG9ydmFsZHMKKyAqICBSZS1vcmdhbmlzZWQgRmViIDE5OTggUnVzc2VsbCBLaW5nCisgKgorICogIFdlIG5vdyBoYXZlIGluZGVwZW5kZW50IHBhcnRpdGlvbiBzdXBwb3J0IGZyb20gdGhlCisgKiAgYmxvY2sgZHJpdmVycywgd2hpY2ggYWxsb3dzIGFsbCB0aGUgcGFydGl0aW9uIGNvZGUgdG8KKyAqICBiZSBncm91cGVkIGluIG9uZSBsb2NhdGlvbiwgYW5kIGl0IHRvIGJlIG1vc3RseSBzZWxmCisgKiAgY29udGFpbmVkLgorICoKKyAqICBBZGRlZCBuZWVkZWQgTUFKT1JTIGZvciBuZXcgcGFpcnMsIHtoZGksaGRqfSwge2hkayxoZGx9CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmZzX2ZzX2tlcm5lbC5oPgorCisjaW5jbHVkZSAiY2hlY2suaCIKKyNpbmNsdWRlICJkZXZmcy5oIgorCisjaW5jbHVkZSAiYWNvcm4uaCIKKyNpbmNsdWRlICJhbWlnYS5oIgorI2luY2x1ZGUgImF0YXJpLmgiCisjaW5jbHVkZSAibGRtLmgiCisjaW5jbHVkZSAibWFjLmgiCisjaW5jbHVkZSAibXNkb3MuaCIKKyNpbmNsdWRlICJvc2YuaCIKKyNpbmNsdWRlICJzZ2kuaCIKKyNpbmNsdWRlICJzdW4uaCIKKyNpbmNsdWRlICJpYm0uaCIKKyNpbmNsdWRlICJ1bHRyaXguaCIKKyNpbmNsdWRlICJlZmkuaCIKKworI2lmZGVmIENPTkZJR19CTEtfREVWX01ECitleHRlcm4gdm9pZCBtZF9hdXRvZGV0ZWN0X2RldihkZXZfdCBkZXYpOworI2VuZGlmCisKK2ludCB3YXJuX25vX3BhcnQgPSAxOyAvKlRoaXMgaXMgdWdseTogc2hvdWxkIG1ha2UgZ2VuaGQgcmVtb3ZhYmxlIG1lZGlhIGF3YXJlKi8KKworc3RhdGljIGludCAoKmNoZWNrX3BhcnRbXSkoc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICosIHN0cnVjdCBibG9ja19kZXZpY2UgKikgPSB7CisJLyoKKwkgKiBQcm9iZSBwYXJ0aXRpb24gZm9ybWF0cyB3aXRoIHRhYmxlcyBhdCBkaXNrIGFkZHJlc3MgMAorCSAqIHRoYXQgYWxzbyBoYXZlIGFuIEFERlMgYm9vdCBibG9jayBhdCAweGRjMC4KKwkgKi8KKyNpZmRlZiBDT05GSUdfQUNPUk5fUEFSVElUSU9OX0lDUworCWFkZnNwYXJ0X2NoZWNrX0lDUywKKyNlbmRpZgorI2lmZGVmIENPTkZJR19BQ09STl9QQVJUSVRJT05fUE9XRVJURUMKKwlhZGZzcGFydF9jaGVja19QT1dFUlRFQywKKyNlbmRpZgorI2lmZGVmIENPTkZJR19BQ09STl9QQVJUSVRJT05fRUVTT1gKKwlhZGZzcGFydF9jaGVja19FRVNPWCwKKyNlbmRpZgorCisJLyoKKwkgKiBOb3cgbW92ZSBvbiB0byBmb3JtYXRzIHRoYXQgb25seSBoYXZlIHBhcnRpdGlvbiBpbmZvIGF0CisJICogZGlzayBhZGRyZXNzIDB4ZGMwLiAgU2luY2UgdGhlc2UgbWF5IGFsc28gaGF2ZSBzdGFsZQorCSAqIFBDL0JJT1MgcGFydGl0aW9uIHRhYmxlcywgdGhleSBuZWVkIHRvIGNvbWUgYmVmb3JlCisJICogdGhlIG1zZG9zIGVudHJ5LgorCSAqLworI2lmZGVmIENPTkZJR19BQ09STl9QQVJUSVRJT05fQ1VNQU5BCisJYWRmc3BhcnRfY2hlY2tfQ1VNQU5BLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FDT1JOX1BBUlRJVElPTl9BREZTCisJYWRmc3BhcnRfY2hlY2tfQURGUywKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0VGSV9QQVJUSVRJT04KKwllZmlfcGFydGl0aW9uLAkJLyogdGhpcyBtdXN0IGNvbWUgYmVmb3JlIG1zZG9zICovCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0dJX1BBUlRJVElPTgorCXNnaV9wYXJ0aXRpb24sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTERNX1BBUlRJVElPTgorCWxkbV9wYXJ0aXRpb24sCQkvKiB0aGlzIG11c3QgY29tZSBiZWZvcmUgbXNkb3MgKi8KKyNlbmRpZgorI2lmZGVmIENPTkZJR19ORUM5OF9QQVJUSVRJT04KKwluZWM5OF9wYXJ0aXRpb24sCS8qIG11c3QgYmUgY29tZSBiZWZvcmUgYG1zZG9zX3BhcnRpdGlvbicgKi8KKyNlbmRpZgorI2lmZGVmIENPTkZJR19NU0RPU19QQVJUSVRJT04KKwltc2Rvc19wYXJ0aXRpb24sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfT1NGX1BBUlRJVElPTgorCW9zZl9wYXJ0aXRpb24sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU1VOX1BBUlRJVElPTgorCXN1bl9wYXJ0aXRpb24sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQU1JR0FfUEFSVElUSU9OCisJYW1pZ2FfcGFydGl0aW9uLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FUQVJJX1BBUlRJVElPTgorCWF0YXJpX3BhcnRpdGlvbiwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19NQUNfUEFSVElUSU9OCisJbWFjX3BhcnRpdGlvbiwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19VTFRSSVhfUEFSVElUSU9OCisJdWx0cml4X3BhcnRpdGlvbiwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19JQk1fUEFSVElUSU9OCisJaWJtX3BhcnRpdGlvbiwKKyNlbmRpZgorCU5VTEwKK307CisgCisvKgorICogZGlza19uYW1lKCkgaXMgdXNlZCBieSBwYXJ0aXRpb24gY2hlY2sgY29kZSBhbmQgdGhlIGdlbmhkIGRyaXZlci4KKyAqIEl0IGZvcm1hdHMgdGhlIGRldmljZW5hbWUgb2YgdGhlIGluZGljYXRlZCBkaXNrIGludG8KKyAqIHRoZSBzdXBwbGllZCBidWZmZXIgKG9mIHNpemUgYXQgbGVhc3QgMzIpLCBhbmQgcmV0dXJucworICogYSBwb2ludGVyIHRvIHRoYXQgc2FtZSBidWZmZXIgKGZvciBjb252ZW5pZW5jZSkuCisgKi8KKworY2hhciAqZGlza19uYW1lKHN0cnVjdCBnZW5kaXNrICpoZCwgaW50IHBhcnQsIGNoYXIgKmJ1ZikKK3sKKwlpZiAoIXBhcnQpCisJCXNucHJpbnRmKGJ1ZiwgQkRFVk5BTUVfU0laRSwgIiVzIiwgaGQtPmRpc2tfbmFtZSk7CisJZWxzZSBpZiAoaXNkaWdpdChoZC0+ZGlza19uYW1lW3N0cmxlbihoZC0+ZGlza19uYW1lKS0xXSkpCisJCXNucHJpbnRmKGJ1ZiwgQkRFVk5BTUVfU0laRSwgIiVzcCVkIiwgaGQtPmRpc2tfbmFtZSwgcGFydCk7CisJZWxzZQorCQlzbnByaW50ZihidWYsIEJERVZOQU1FX1NJWkUsICIlcyVkIiwgaGQtPmRpc2tfbmFtZSwgcGFydCk7CisKKwlyZXR1cm4gYnVmOworfQorCitjb25zdCBjaGFyICpiZGV2bmFtZShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBjaGFyICpidWYpCit7CisJaW50IHBhcnQgPSBNSU5PUihiZGV2LT5iZF9kZXYpIC0gYmRldi0+YmRfZGlzay0+Zmlyc3RfbWlub3I7CisJcmV0dXJuIGRpc2tfbmFtZShiZGV2LT5iZF9kaXNrLCBwYXJ0LCBidWYpOworfQorCitFWFBPUlRfU1lNQk9MKGJkZXZuYW1lKTsKKworLyoKKyAqIFRoZXJlJ3MgdmVyeSBsaXR0bGUgcmVhc29uIHRvIHVzZSB0aGlzLCB5b3Ugc2hvdWxkIHJlYWxseQorICogaGF2ZSBhIHN0cnVjdCBibG9ja19kZXZpY2UganVzdCBhYm91dCBldmVyeXdoZXJlIGFuZCB1c2UKKyAqIGJkZXZuYW1lKCkgaW5zdGVhZC4KKyAqLworY29uc3QgY2hhciAqX19iZGV2bmFtZShkZXZfdCBkZXYsIGNoYXIgKmJ1ZmZlcikKK3sKKwlzY25wcmludGYoYnVmZmVyLCBCREVWTkFNRV9TSVpFLCAidW5rbm93bi1ibG9jaygldSwldSkiLAorCQkJCU1BSk9SKGRldiksIE1JTk9SKGRldikpOworCXJldHVybiBidWZmZXI7Cit9CisKK0VYUE9SVF9TWU1CT0woX19iZGV2bmFtZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKgorY2hlY2tfcGFydGl0aW9uKHN0cnVjdCBnZW5kaXNrICpoZCwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKK3sKKwlzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlOworCWludCBpLCByZXM7CisKKwlzdGF0ZSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyksIEdGUF9LRVJORUwpOworCWlmICghc3RhdGUpCisJCXJldHVybiBOVUxMOworCisjaWZkZWYgQ09ORklHX0RFVkZTX0ZTCisJaWYgKGhkLT5kZXZmc19uYW1lWzBdICE9ICdcMCcpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiIC9kZXYvJXM6IiwgaGQtPmRldmZzX25hbWUpOworCQlzcHJpbnRmKHN0YXRlLT5uYW1lLCAicCIpOworCX0KKyNlbmRpZgorCWVsc2UgeworCQlkaXNrX25hbWUoaGQsIDAsIHN0YXRlLT5uYW1lKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiICVzOiIsIHN0YXRlLT5uYW1lKTsKKwkJaWYgKGlzZGlnaXQoc3RhdGUtPm5hbWVbc3RybGVuKHN0YXRlLT5uYW1lKS0xXSkpCisJCQlzcHJpbnRmKHN0YXRlLT5uYW1lLCAicCIpOworCX0KKwlzdGF0ZS0+bGltaXQgPSBoZC0+bWlub3JzOworCWkgPSByZXMgPSAwOworCXdoaWxlICghcmVzICYmIGNoZWNrX3BhcnRbaV0pIHsKKwkJbWVtc2V0KCZzdGF0ZS0+cGFydHMsIDAsIHNpemVvZihzdGF0ZS0+cGFydHMpKTsKKwkJcmVzID0gY2hlY2tfcGFydFtpKytdKHN0YXRlLCBiZGV2KTsKKwl9CisJaWYgKHJlcyA+IDApCisJCXJldHVybiBzdGF0ZTsKKwlpZiAoIXJlcykKKwkJcHJpbnRrKCIgdW5rbm93biBwYXJ0aXRpb24gdGFibGVcbiIpOworCWVsc2UgaWYgKHdhcm5fbm9fcGFydCkKKwkJcHJpbnRrKCIgdW5hYmxlIHRvIHJlYWQgcGFydGl0aW9uIHRhYmxlXG4iKTsKKwlrZnJlZShzdGF0ZSk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBzeXNmcyBiaW5kaW5ncyBmb3IgcGFydGl0aW9ucworICovCisKK3N0cnVjdCBwYXJ0X2F0dHJpYnV0ZSB7CisJc3RydWN0IGF0dHJpYnV0ZSBhdHRyOworCXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgaGRfc3RydWN0ICosY2hhciAqKTsKK307CisKK3N0YXRpYyBzc2l6ZV90IAorcGFydF9hdHRyX3Nob3coc3RydWN0IGtvYmplY3QgKiBrb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICogYXR0ciwgY2hhciAqIHBhZ2UpCit7CisJc3RydWN0IGhkX3N0cnVjdCAqIHAgPSBjb250YWluZXJfb2Yoa29iaixzdHJ1Y3QgaGRfc3RydWN0LGtvYmopOworCXN0cnVjdCBwYXJ0X2F0dHJpYnV0ZSAqIHBhcnRfYXR0ciA9IGNvbnRhaW5lcl9vZihhdHRyLHN0cnVjdCBwYXJ0X2F0dHJpYnV0ZSxhdHRyKTsKKwlzc2l6ZV90IHJldCA9IDA7CisJaWYgKHBhcnRfYXR0ci0+c2hvdykKKwkJcmV0ID0gcGFydF9hdHRyLT5zaG93KHAscGFnZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBzeXNmc19vcHMgcGFydF9zeXNmc19vcHMgPSB7CisJLnNob3cJPQlwYXJ0X2F0dHJfc2hvdywKK307CisKK3N0YXRpYyBzc2l6ZV90IHBhcnRfZGV2X3JlYWQoc3RydWN0IGhkX3N0cnVjdCAqIHAsIGNoYXIgKnBhZ2UpCit7CisJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBjb250YWluZXJfb2YocC0+a29iai5wYXJlbnQsc3RydWN0IGdlbmRpc2ssa29iaik7CisJZGV2X3QgZGV2ID0gTUtERVYoZGlzay0+bWFqb3IsIGRpc2stPmZpcnN0X21pbm9yICsgcC0+cGFydG5vKTsgCisJcmV0dXJuIHByaW50X2Rldl90KHBhZ2UsIGRldik7Cit9CitzdGF0aWMgc3NpemVfdCBwYXJ0X3N0YXJ0X3JlYWQoc3RydWN0IGhkX3N0cnVjdCAqIHAsIGNoYXIgKnBhZ2UpCit7CisJcmV0dXJuIHNwcmludGYocGFnZSwgIiVsbHVcbiIsKHVuc2lnbmVkIGxvbmcgbG9uZylwLT5zdGFydF9zZWN0KTsKK30KK3N0YXRpYyBzc2l6ZV90IHBhcnRfc2l6ZV9yZWFkKHN0cnVjdCBoZF9zdHJ1Y3QgKiBwLCBjaGFyICpwYWdlKQoreworCXJldHVybiBzcHJpbnRmKHBhZ2UsICIlbGx1XG4iLCh1bnNpZ25lZCBsb25nIGxvbmcpcC0+bnJfc2VjdHMpOworfQorc3RhdGljIHNzaXplX3QgcGFydF9zdGF0X3JlYWQoc3RydWN0IGhkX3N0cnVjdCAqIHAsIGNoYXIgKnBhZ2UpCit7CisJcmV0dXJuIHNwcmludGYocGFnZSwgIiU4dSAlOGxsdSAlOHUgJThsbHVcbiIsCisJCSAgICAgICBwLT5yZWFkcywgKHVuc2lnbmVkIGxvbmcgbG9uZylwLT5yZWFkX3NlY3RvcnMsCisJCSAgICAgICBwLT53cml0ZXMsICh1bnNpZ25lZCBsb25nIGxvbmcpcC0+d3JpdGVfc2VjdG9ycyk7Cit9CitzdGF0aWMgc3RydWN0IHBhcnRfYXR0cmlidXRlIHBhcnRfYXR0cl9kZXYgPSB7CisJLmF0dHIgPSB7Lm5hbWUgPSAiZGV2IiwgLm1vZGUgPSBTX0lSVUdPIH0sCisJLnNob3cJPSBwYXJ0X2Rldl9yZWFkCit9Oworc3RhdGljIHN0cnVjdCBwYXJ0X2F0dHJpYnV0ZSBwYXJ0X2F0dHJfc3RhcnQgPSB7CisJLmF0dHIgPSB7Lm5hbWUgPSAic3RhcnQiLCAubW9kZSA9IFNfSVJVR08gfSwKKwkuc2hvdwk9IHBhcnRfc3RhcnRfcmVhZAorfTsKK3N0YXRpYyBzdHJ1Y3QgcGFydF9hdHRyaWJ1dGUgcGFydF9hdHRyX3NpemUgPSB7CisJLmF0dHIgPSB7Lm5hbWUgPSAic2l6ZSIsIC5tb2RlID0gU19JUlVHTyB9LAorCS5zaG93CT0gcGFydF9zaXplX3JlYWQKK307CitzdGF0aWMgc3RydWN0IHBhcnRfYXR0cmlidXRlIHBhcnRfYXR0cl9zdGF0ID0geworCS5hdHRyID0gey5uYW1lID0gInN0YXQiLCAubW9kZSA9IFNfSVJVR08gfSwKKwkuc2hvdwk9IHBhcnRfc3RhdF9yZWFkCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqIGRlZmF1bHRfYXR0cnNbXSA9IHsKKwkmcGFydF9hdHRyX2Rldi5hdHRyLAorCSZwYXJ0X2F0dHJfc3RhcnQuYXR0ciwKKwkmcGFydF9hdHRyX3NpemUuYXR0ciwKKwkmcGFydF9hdHRyX3N0YXQuYXR0ciwKKwlOVUxMLAorfTsKKworZXh0ZXJuIHN0cnVjdCBzdWJzeXN0ZW0gYmxvY2tfc3Vic3lzOworCitzdGF0aWMgdm9pZCBwYXJ0X3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmtvYmopCit7CisJc3RydWN0IGhkX3N0cnVjdCAqIHAgPSBjb250YWluZXJfb2Yoa29iaixzdHJ1Y3QgaGRfc3RydWN0LGtvYmopOworCWtmcmVlKHApOworfQorCitzdHJ1Y3Qga29ial90eXBlIGt0eXBlX3BhcnQgPSB7CisJLnJlbGVhc2UJPSBwYXJ0X3JlbGVhc2UsCisJLmRlZmF1bHRfYXR0cnMJPSBkZWZhdWx0X2F0dHJzLAorCS5zeXNmc19vcHMJPSAmcGFydF9zeXNmc19vcHMsCit9OworCit2b2lkIGRlbGV0ZV9wYXJ0aXRpb24oc3RydWN0IGdlbmRpc2sgKmRpc2ssIGludCBwYXJ0KQoreworCXN0cnVjdCBoZF9zdHJ1Y3QgKnAgPSBkaXNrLT5wYXJ0W3BhcnQtMV07CisJaWYgKCFwKQorCQlyZXR1cm47CisJaWYgKCFwLT5ucl9zZWN0cykKKwkJcmV0dXJuOworCWRpc2stPnBhcnRbcGFydC0xXSA9IE5VTEw7CisJcC0+c3RhcnRfc2VjdCA9IDA7CisJcC0+bnJfc2VjdHMgPSAwOworCXAtPnJlYWRzID0gcC0+d3JpdGVzID0gcC0+cmVhZF9zZWN0b3JzID0gcC0+d3JpdGVfc2VjdG9ycyA9IDA7CisJZGV2ZnNfcmVtb3ZlKCIlcy9wYXJ0JWQiLCBkaXNrLT5kZXZmc19uYW1lLCBwYXJ0KTsKKwlrb2JqZWN0X3VucmVnaXN0ZXIoJnAtPmtvYmopOworfQorCit2b2lkIGFkZF9wYXJ0aXRpb24oc3RydWN0IGdlbmRpc2sgKmRpc2ssIGludCBwYXJ0LCBzZWN0b3JfdCBzdGFydCwgc2VjdG9yX3QgbGVuKQoreworCXN0cnVjdCBoZF9zdHJ1Y3QgKnA7CisKKwlwID0ga21hbGxvYyhzaXplb2YoKnApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXApCisJCXJldHVybjsKKwkKKwltZW1zZXQocCwgMCwgc2l6ZW9mKCpwKSk7CisJcC0+c3RhcnRfc2VjdCA9IHN0YXJ0OworCXAtPm5yX3NlY3RzID0gbGVuOworCXAtPnBhcnRubyA9IHBhcnQ7CisKKwlkZXZmc19ta19iZGV2KE1LREVWKGRpc2stPm1ham9yLCBkaXNrLT5maXJzdF9taW5vciArIHBhcnQpLAorCQkJU19JRkJMS3xTX0lSVVNSfFNfSVdVU1IsCisJCQkiJXMvcGFydCVkIiwgZGlzay0+ZGV2ZnNfbmFtZSwgcGFydCk7CisKKwlpZiAoaXNkaWdpdChkaXNrLT5rb2JqLm5hbWVbc3RybGVuKGRpc2stPmtvYmoubmFtZSktMV0pKQorCQlzbnByaW50ZihwLT5rb2JqLm5hbWUsS09CSl9OQU1FX0xFTiwiJXNwJWQiLGRpc2stPmtvYmoubmFtZSxwYXJ0KTsKKwllbHNlCisJCXNucHJpbnRmKHAtPmtvYmoubmFtZSxLT0JKX05BTUVfTEVOLCIlcyVkIixkaXNrLT5rb2JqLm5hbWUscGFydCk7CisJcC0+a29iai5wYXJlbnQgPSAmZGlzay0+a29iajsKKwlwLT5rb2JqLmt0eXBlID0gJmt0eXBlX3BhcnQ7CisJa29iamVjdF9yZWdpc3RlcigmcC0+a29iaik7CisJZGlzay0+cGFydFtwYXJ0LTFdID0gcDsKK30KKworc3RhdGljIHZvaWQgZGlza19zeXNmc19zeW1saW5rcyhzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKK3sKKwlzdHJ1Y3QgZGV2aWNlICp0YXJnZXQgPSBnZXRfZGV2aWNlKGRpc2stPmRyaXZlcmZzX2Rldik7CisJaWYgKHRhcmdldCkgeworCQlzeXNmc19jcmVhdGVfbGluaygmZGlzay0+a29iaiwmdGFyZ2V0LT5rb2JqLCJkZXZpY2UiKTsKKwkJc3lzZnNfY3JlYXRlX2xpbmsoJnRhcmdldC0+a29iaiwmZGlzay0+a29iaiwiYmxvY2siKTsKKwl9Cit9CisKKy8qIE5vdCBleHBvcnRlZCwgaGVscGVyIHRvIGFkZF9kaXNrKCkuICovCit2b2lkIHJlZ2lzdGVyX2Rpc2soc3RydWN0IGdlbmRpc2sgKmRpc2spCit7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKKwljaGFyICpzOworCWludCBlcnI7CisKKwlzdHJsY3B5KGRpc2stPmtvYmoubmFtZSxkaXNrLT5kaXNrX25hbWUsS09CSl9OQU1FX0xFTik7CisJLyogZXd3dy4uLiBzb21lIG9mIHRoZXNlIGJ1Z2dlcnMgaGF2ZSAvIGluIG5hbWUuLi4gKi8KKwlzID0gc3RyY2hyKGRpc2stPmtvYmoubmFtZSwgJy8nKTsKKwlpZiAocykKKwkJKnMgPSAnISc7CisJaWYgKChlcnIgPSBrb2JqZWN0X2FkZCgmZGlzay0+a29iaikpKQorCQlyZXR1cm47CisJZGlza19zeXNmc19zeW1saW5rcyhkaXNrKTsKKworCS8qIE5vIG1pbm9ycyB0byB1c2UgZm9yIHBhcnRpdGlvbnMgKi8KKwlpZiAoZGlzay0+bWlub3JzID09IDEpIHsKKwkJaWYgKGRpc2stPmRldmZzX25hbWVbMF0gIT0gJ1wwJykKKwkJCWRldmZzX2FkZF9kaXNrKGRpc2spOworCQlyZXR1cm47CisJfQorCisJLyogYWx3YXlzIGFkZCBoYW5kbGUgZm9yIHRoZSB3aG9sZSBkaXNrICovCisJZGV2ZnNfYWRkX3BhcnRpdGlvbmVkKGRpc2spOworCisJLyogTm8gc3VjaCBkZXZpY2UgKGUuZy4sIG1lZGlhIHdlcmUganVzdCByZW1vdmVkKSAqLworCWlmICghZ2V0X2NhcGFjaXR5KGRpc2spKQorCQlyZXR1cm47CisKKwliZGV2ID0gYmRnZXRfZGlzayhkaXNrLCAwKTsKKwlpZiAoIWJkZXYpCisJCXJldHVybjsKKworCWJkZXYtPmJkX2ludmFsaWRhdGVkID0gMTsKKwlpZiAoYmxrZGV2X2dldChiZGV2LCBGTU9ERV9SRUFELCAwKSA8IDApCisJCXJldHVybjsKKwlibGtkZXZfcHV0KGJkZXYpOworfQorCitpbnQgcmVzY2FuX3BhcnRpdGlvbnMoc3RydWN0IGdlbmRpc2sgKmRpc2ssIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZTsKKwlpbnQgcCwgcmVzOworCisJaWYgKGJkZXYtPmJkX3BhcnRfY291bnQpCisJCXJldHVybiAtRUJVU1k7CisJcmVzID0gaW52YWxpZGF0ZV9wYXJ0aXRpb24oZGlzaywgMCk7CisJaWYgKHJlcykKKwkJcmV0dXJuIHJlczsKKwliZGV2LT5iZF9pbnZhbGlkYXRlZCA9IDA7CisJZm9yIChwID0gMTsgcCA8IGRpc2stPm1pbm9yczsgcCsrKQorCQlkZWxldGVfcGFydGl0aW9uKGRpc2ssIHApOworCWlmIChkaXNrLT5mb3BzLT5yZXZhbGlkYXRlX2Rpc2spCisJCWRpc2stPmZvcHMtPnJldmFsaWRhdGVfZGlzayhkaXNrKTsKKwlpZiAoIWdldF9jYXBhY2l0eShkaXNrKSB8fCAhKHN0YXRlID0gY2hlY2tfcGFydGl0aW9uKGRpc2ssIGJkZXYpKSkKKwkJcmV0dXJuIDA7CisJZm9yIChwID0gMTsgcCA8IHN0YXRlLT5saW1pdDsgcCsrKSB7CisJCXNlY3Rvcl90IHNpemUgPSBzdGF0ZS0+cGFydHNbcF0uc2l6ZTsKKwkJc2VjdG9yX3QgZnJvbSA9IHN0YXRlLT5wYXJ0c1twXS5mcm9tOworCQlpZiAoIXNpemUpCisJCQljb250aW51ZTsKKwkJYWRkX3BhcnRpdGlvbihkaXNrLCBwLCBmcm9tLCBzaXplKTsKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9NRAorCQlpZiAoc3RhdGUtPnBhcnRzW3BdLmZsYWdzKQorCQkJbWRfYXV0b2RldGVjdF9kZXYoYmRldi0+YmRfZGV2K3ApOworI2VuZGlmCisJfQorCWtmcmVlKHN0YXRlKTsKKwlyZXR1cm4gMDsKK30KKwordW5zaWduZWQgY2hhciAqcmVhZF9kZXZfc2VjdG9yKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IG4sIFNlY3RvciAqcCkKK3sKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGJkZXYtPmJkX2lub2RlLT5pX21hcHBpbmc7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlwYWdlID0gcmVhZF9jYWNoZV9wYWdlKG1hcHBpbmcsIChwZ29mZl90KShuID4+IChQQUdFX0NBQ0hFX1NISUZULTkpKSwKKwkJCShmaWxsZXJfdCAqKW1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZSwgTlVMTCk7CisJaWYgKCFJU19FUlIocGFnZSkpIHsKKwkJd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKKwkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpCisJCQlnb3RvIGZhaWw7CisJCWlmIChQYWdlRXJyb3IocGFnZSkpCisJCQlnb3RvIGZhaWw7CisJCXAtPnYgPSBwYWdlOworCQlyZXR1cm4gKHVuc2lnbmVkIGNoYXIgKilwYWdlX2FkZHJlc3MocGFnZSkgKyAgKChuICYgKCgxIDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gOSkpIC0gMSkpIDw8IDkpOworZmFpbDoKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCX0KKwlwLT52ID0gTlVMTDsKKwlyZXR1cm4gTlVMTDsKK30KKworRVhQT1JUX1NZTUJPTChyZWFkX2Rldl9zZWN0b3IpOworCit2b2lkIGRlbF9nZW5kaXNrKHN0cnVjdCBnZW5kaXNrICpkaXNrKQoreworCWludCBwOworCisJLyogaW52YWxpZGF0ZSBzdHVmZiAqLworCWZvciAocCA9IGRpc2stPm1pbm9ycyAtIDE7IHAgPiAwOyBwLS0pIHsKKwkJaW52YWxpZGF0ZV9wYXJ0aXRpb24oZGlzaywgcCk7CisJCWRlbGV0ZV9wYXJ0aXRpb24oZGlzaywgcCk7CisJfQorCWludmFsaWRhdGVfcGFydGl0aW9uKGRpc2ssIDApOworCWRpc2stPmNhcGFjaXR5ID0gMDsKKwlkaXNrLT5mbGFncyAmPSB+R0VOSERfRkxfVVA7CisJdW5saW5rX2dlbmRpc2soZGlzayk7CisJZGlza19zdGF0X3NldF9hbGwoZGlzaywgMCk7CisJZGlzay0+c3RhbXAgPSBkaXNrLT5zdGFtcF9pZGxlID0gMDsKKworCWRldmZzX3JlbW92ZV9kaXNrKGRpc2spOworCisJaWYgKGRpc2stPmRyaXZlcmZzX2RldikgeworCQlzeXNmc19yZW1vdmVfbGluaygmZGlzay0+a29iaiwgImRldmljZSIpOworCQlzeXNmc19yZW1vdmVfbGluaygmZGlzay0+ZHJpdmVyZnNfZGV2LT5rb2JqLCAiYmxvY2siKTsKKwkJcHV0X2RldmljZShkaXNrLT5kcml2ZXJmc19kZXYpOworCX0KKwlrb2JqZWN0X2RlbCgmZGlzay0+a29iaik7Cit9CmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL2NoZWNrLmggYi9mcy9wYXJ0aXRpb25zL2NoZWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNhZGNjNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3BhcnRpdGlvbnMvY2hlY2suaApAQCAtMCwwICsxLDM2IEBACisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorCisvKgorICogYWRkX2dkX3BhcnRpdGlvbiBhZGRzIGEgcGFydGl0aW9ucyBkZXRhaWxzIHRvIHRoZSBkZXZpY2VzIHBhcnRpdGlvbgorICogZGVzY3JpcHRpb24uCisgKi8KK2VudW0geyBNQVhfUEFSVCA9IDI1NiB9OworCitzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgeworCWNoYXIgbmFtZVtCREVWTkFNRV9TSVpFXTsKKwlzdHJ1Y3QgeworCQlzZWN0b3JfdCBmcm9tOworCQlzZWN0b3JfdCBzaXplOworCQlpbnQgZmxhZ3M7CisJfSBwYXJ0c1tNQVhfUEFSVF07CisJaW50IG5leHQ7CisJaW50IGxpbWl0OworfTsKKworc3RhdGljIGlubGluZSB2b2lkCitwdXRfcGFydGl0aW9uKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqcCwgaW50IG4sIHNlY3Rvcl90IGZyb20sIHNlY3Rvcl90IHNpemUpCit7CisJaWYgKG4gPCBwLT5saW1pdCkgeworCQlwLT5wYXJ0c1tuXS5mcm9tID0gZnJvbTsKKwkJcC0+cGFydHNbbl0uc2l6ZSA9IHNpemU7CisJCXByaW50aygiICVzJWQiLCBwLT5uYW1lLCBuKTsKKwl9Cit9CisKK2V4dGVybiBpbnQgd2Fybl9ub19wYXJ0OworCitleHRlcm4gdm9pZCBwYXJzZV9ic2Qoc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwKKwkJCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHUzMiBvZmZzZXQsIHUzMiBzaXplLAorCQkJaW50IG9yaWdpbiwgY2hhciAqZmxhdm91ciwgaW50IG1heF9wYXJ0aXRpb25zKTsKKwpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9kZXZmcy5jIGIvZnMvcGFydGl0aW9ucy9kZXZmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZjUwNDQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wYXJ0aXRpb25zL2RldmZzLmMKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBUaGlzIHRyaWVzIHRvIGtlZXAgYmxvY2sgZGV2aWNlcyBhd2F5IGZyb20gZGV2ZnMgYXMgbXVjaCBhcyBwb3NzaWJsZS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorCisKK3N0cnVjdCB1bmlxdWVfbnVtc3BhY2UgeworCXUzMgkJICBudW1fZnJlZTsgICAgICAgICAgLyogIE51bSBmcmVlIGluIGJpdHMgICAgICAgKi8KKwl1MzIJCSAgbGVuZ3RoOyAgICAgICAgICAgIC8qICBBcnJheSBsZW5ndGggaW4gYnl0ZXMgICovCisJdW5zaWduZWQgbG9uZwkgICpiaXRzOworCXN0cnVjdCBzZW1hcGhvcmUgIG11dGV4OworfTsKKworc3RhdGljIERFQ0xBUkVfTVVURVgobnVtc3BhY2VfbXV0ZXgpOworCitzdGF0aWMgaW50IGV4cGFuZF9udW1zcGFjZShzdHJ1Y3QgdW5pcXVlX251bXNwYWNlICpzKQoreworCXUzMiBsZW5ndGg7CisJdm9pZCAqYml0czsKKworCWlmIChzLT5sZW5ndGggPCAxNikKKwkJbGVuZ3RoID0gMTY7CisJZWxzZQorCQlsZW5ndGggPSBzLT5sZW5ndGggPDwgMTsKKworCWJpdHMgPSB2bWFsbG9jKGxlbmd0aCk7CisJaWYgKCFiaXRzKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAocy0+Yml0cykgeworCQltZW1jcHkoYml0cywgcy0+Yml0cywgcy0+bGVuZ3RoKTsKKwkJdmZyZWUocy0+Yml0cyk7CisJfQorCQkKKwlzLT5udW1fZnJlZSA9IChsZW5ndGggLSBzLT5sZW5ndGgpIDw8IDM7CisJcy0+Yml0cyA9IGJpdHM7CisJbWVtc2V0KGJpdHMgKyBzLT5sZW5ndGgsIDAsIGxlbmd0aCAtIHMtPmxlbmd0aCk7CisJcy0+bGVuZ3RoID0gbGVuZ3RoOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWxsb2NfdW5pcXVlX251bWJlcihzdHJ1Y3QgdW5pcXVlX251bXNwYWNlICpzKQoreworCWludCBydmFsID0gMDsKKworCWRvd24oJm51bXNwYWNlX211dGV4KTsKKwlpZiAocy0+bnVtX2ZyZWUgPCAxKQorCQlydmFsID0gZXhwYW5kX251bXNwYWNlKHMpOworCWlmICghcnZhbCkgeworCQlydmFsID0gZmluZF9maXJzdF96ZXJvX2JpdChzLT5iaXRzLCBzLT5sZW5ndGggPDwgMyk7CisJCS0tcy0+bnVtX2ZyZWU7CisJCV9fc2V0X2JpdChydmFsLCBzLT5iaXRzKTsKKwl9CisJdXAoJm51bXNwYWNlX211dGV4KTsKKworCXJldHVybiBydmFsOworfQorCitzdGF0aWMgdm9pZCBkZWFsbG9jX3VuaXF1ZV9udW1iZXIoc3RydWN0IHVuaXF1ZV9udW1zcGFjZSAqcywgaW50IG51bWJlcikKK3sKKwlpbnQgb2xkX3ZhbDsKKworCWlmIChudW1iZXIgPj0gMCkgeworCQlkb3duKCZudW1zcGFjZV9tdXRleCk7CisJCW9sZF92YWwgPSBfX3Rlc3RfYW5kX2NsZWFyX2JpdChudW1iZXIsIHMtPmJpdHMpOworCQlpZiAob2xkX3ZhbCkKKwkJCSsrcy0+bnVtX2ZyZWU7CisJCXVwKCZudW1zcGFjZV9tdXRleCk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHVuaXF1ZV9udW1zcGFjZSBkaXNjX251bXNwYWNlOworc3RhdGljIHN0cnVjdCB1bmlxdWVfbnVtc3BhY2UgY2Ryb21fbnVtc3BhY2U7CisKK3ZvaWQgZGV2ZnNfYWRkX3BhcnRpdGlvbmVkKHN0cnVjdCBnZW5kaXNrICpkaXNrKQoreworCWNoYXIgZGlybmFtZVs2NF0sIHN5bWxpbmtbMTZdOworCisJZGV2ZnNfbWtfZGlyKGRpc2stPmRldmZzX25hbWUpOworCWRldmZzX21rX2JkZXYoTUtERVYoZGlzay0+bWFqb3IsIGRpc2stPmZpcnN0X21pbm9yKSwKKwkJCVNfSUZCTEt8U19JUlVTUnxTX0lXVVNSLAorCQkJIiVzL2Rpc2MiLCBkaXNrLT5kZXZmc19uYW1lKTsKKworCWRpc2stPm51bWJlciA9IGFsbG9jX3VuaXF1ZV9udW1iZXIoJmRpc2NfbnVtc3BhY2UpOworCisJc3ByaW50ZihzeW1saW5rLCAiZGlzY3MvZGlzYyVkIiwgZGlzay0+bnVtYmVyKTsKKwlzcHJpbnRmKGRpcm5hbWUsICIuLi8lcyIsIGRpc2stPmRldmZzX25hbWUpOworCWRldmZzX21rX3N5bWxpbmsoc3ltbGluaywgZGlybmFtZSk7CisKK30KKwordm9pZCBkZXZmc19hZGRfZGlzayhzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKK3sKKwlkZXZmc19ta19iZGV2KE1LREVWKGRpc2stPm1ham9yLCBkaXNrLT5maXJzdF9taW5vciksCisJCQkoZGlzay0+ZmxhZ3MgJiBHRU5IRF9GTF9DRCkgPworCQkJCVNfSUZCTEt8U19JUlVHT3xTX0lXVUdPIDoKKwkJCQlTX0lGQkxLfFNfSVJVU1J8U19JV1VTUiwKKwkJCSIlcyIsIGRpc2stPmRldmZzX25hbWUpOworCisJaWYgKGRpc2stPmZsYWdzICYgR0VOSERfRkxfQ0QpIHsKKwkJY2hhciBkaXJuYW1lWzY0XSwgc3ltbGlua1sxNl07CisKKwkJZGlzay0+bnVtYmVyID0gYWxsb2NfdW5pcXVlX251bWJlcigmY2Ryb21fbnVtc3BhY2UpOworCisJCXNwcmludGYoc3ltbGluaywgImNkcm9tcy9jZHJvbSVkIiwgZGlzay0+bnVtYmVyKTsKKwkJc3ByaW50ZihkaXJuYW1lLCAiLi4vJXMiLCBkaXNrLT5kZXZmc19uYW1lKTsKKwkJZGV2ZnNfbWtfc3ltbGluayhzeW1saW5rLCBkaXJuYW1lKTsKKwl9Cit9CisKK3ZvaWQgZGV2ZnNfcmVtb3ZlX2Rpc2soc3RydWN0IGdlbmRpc2sgKmRpc2spCit7CisJaWYgKGRpc2stPm1pbm9ycyAhPSAxKSB7CisJCWRldmZzX3JlbW92ZSgiZGlzY3MvZGlzYyVkIiwgZGlzay0+bnVtYmVyKTsKKwkJZGVhbGxvY191bmlxdWVfbnVtYmVyKCZkaXNjX251bXNwYWNlLCBkaXNrLT5udW1iZXIpOworCQlkZXZmc19yZW1vdmUoIiVzL2Rpc2MiLCBkaXNrLT5kZXZmc19uYW1lKTsKKwl9CisJaWYgKGRpc2stPmZsYWdzICYgR0VOSERfRkxfQ0QpIHsKKwkJZGV2ZnNfcmVtb3ZlKCJjZHJvbXMvY2Ryb20lZCIsIGRpc2stPm51bWJlcik7CisJCWRlYWxsb2NfdW5pcXVlX251bWJlcigmY2Ryb21fbnVtc3BhY2UsIGRpc2stPm51bWJlcik7CisJfQorCWRldmZzX3JlbW92ZShkaXNrLT5kZXZmc19uYW1lKTsKK30KKworCmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL2RldmZzLmggYi9mcy9wYXJ0aXRpb25zL2RldmZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc2MTE4YgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3BhcnRpdGlvbnMvZGV2ZnMuaApAQCAtMCwwICsxLDEwIEBACisKKyNpZmRlZiBDT05GSUdfREVWRlNfRlMKK3ZvaWQgZGV2ZnNfYWRkX2Rpc2soc3RydWN0IGdlbmRpc2sgKmRldik7Cit2b2lkIGRldmZzX2FkZF9wYXJ0aXRpb25lZChzdHJ1Y3QgZ2VuZGlzayAqZGV2KTsKK3ZvaWQgZGV2ZnNfcmVtb3ZlX2Rpc2soc3RydWN0IGdlbmRpc2sgKmRldik7CisjZWxzZQorIyBkZWZpbmUgZGV2ZnNfYWRkX2Rpc2soZGlzaykJCQlkbyB7IH0gd2hpbGUgKDApCisjIGRlZmluZSBkZXZmc19hZGRfcGFydGl0aW9uZWQoZGlzaykJCWRvIHsgfSB3aGlsZSAoMCkKKyMgZGVmaW5lIGRldmZzX3JlbW92ZV9kaXNrKGRpc2spCQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvZWZpLmMgYi9mcy9wYXJ0aXRpb25zL2VmaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNWIwMTcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wYXJ0aXRpb25zL2VmaS5jCkBAIC0wLDAgKzEsNjQ1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBFRkkgR1VJRCBQYXJ0aXRpb24gVGFibGUgaGFuZGxpbmcKKyAqIFBlciBJbnRlbCBFRkkgU3BlY2lmaWNhdGlvbiB2MS4wMgorICogaHR0cDovL2RldmVsb3Blci5pbnRlbC5jb20vdGVjaG5vbG9neS9lZmkvZWZpLmh0bQorICogZWZpLltjaF0gYnkgTWF0dCBEb21zY2ggPE1hdHRfRG9tc2NoQGRlbGwuY29tPgorICogICBDb3B5cmlnaHQgMjAwMCwyMDAxLDIwMDIsMjAwNCBEZWxsIEluYy4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKgorICogVE9ETzoKKyAqCisgKiBDaGFuZ2Vsb2c6CisgKiBNb24gTm92IDA5IDIwMDQgTWF0dCBEb21zY2ggPE1hdHRfRG9tc2NoQGRlbGwuY29tPgorICogLSB0ZXN0IGZvciB2YWxpZCBQTUJSIGFuZCB2YWxpZCBQR1BUIGJlZm9yZSBldmVyIHJlYWRpbmcKKyAqICAgQUdQVCwgYWxsb3cgb3ZlcnJpZGUgd2l0aCAnZ3B0JyBrZXJuZWwgY29tbWFuZCBsaW5lIG9wdGlvbi4KKyAqIC0gY2hlY2sgZm9yIGZpcnN0L2xhc3RfdXNhYmxlX2xiYSBvdXRzaWRlIG9mIHNpemUgb2YgZGlzaworICoKKyAqIFR1ZSAgTWFyIDI2IDIwMDIgTWF0dCBEb21zY2ggPE1hdHRfRG9tc2NoQGRlbGwuY29tPgorICogLSBQb3J0ZWQgdG8gMi41LjctcHJlMSBhbmQgMi41LjctZGoyCisgKiAtIEFwcGxpZWQgcGF0Y2ggdG8gYXZvaWQgZmF1bHQgaW4gYWx0ZXJuYXRlIGhlYWRlciBoYW5kbGluZworICogLSBjbGVhbmVkIHVwIGZpbmRfdmFsaWRfZ3B0CisgKiAtIE9uLWRpc2sgc3RydWN0dXJlIGFuZCBjb3B5IGluIG1lbW9yeSBpcyAqYWx3YXlzKiBMRSBub3cgLSAKKyAqICAgc3dhYiBmaWVsZHMgYXMgbmVlZGVkCisgKiAtIHJlbW92ZSBwcmludF9ncHRfaGVhZGVyKCkKKyAqIC0gb25seSB1c2UgZmlyc3QgbWF4X3AgcGFydGl0aW9uIGVudHJpZXMsIHRvIGtlZXAgdGhlIGtlcm5lbCBtaW5vciBudW1iZXIKKyAqICAgYW5kIHBhcnRpdGlvbiBudW1iZXJzIHRpZWQuCisgKgorICogTW9uICBGZWIgMDQgMjAwMiBNYXR0IERvbXNjaCA8TWF0dF9Eb21zY2hAZGVsbC5jb20+CisgKiAtIFJlbW92ZWQgX19QUklQVFJfUFJFRklYIC0gbm90IGJlaW5nIHVzZWQKKyAqCisgKiBNb24gIEphbiAxNCAyMDAyIE1hdHQgRG9tc2NoIDxNYXR0X0RvbXNjaEBkZWxsLmNvbT4KKyAqIC0gUG9ydGVkIHRvIDIuNS4yLXByZTExICsgbGlicmFyeSBjcmMzMiBwYXRjaCBMaW51cyBhcHBsaWVkCisgKgorICogVGh1IERlYyA2IDIwMDEgTWF0dCBEb21zY2ggPE1hdHRfRG9tc2NoQGRlbGwuY29tPgorICogLSBBZGRlZCBjb21wYXJlX2dwdHMoKS4KKyAqIC0gbW92ZWQgbGVfZWZpX2d1aWRfdG9fY3B1cygpIGJhY2sgaW50byB0aGlzIGZpbGUuICBHUFQgaXMgdGhlIG9ubHkKKyAqICAgdGhpbmcgdGhhdCBrZWVwcyBFRkkgR1VJRHMgb24gZGlzay4KKyAqIC0gQ2hhbmdlZCBncHQgc3RydWN0dXJlIG5hbWVzIGFuZCBtZW1iZXJzIHRvIGJlIHNpbXBsZXIgYW5kIG1vcmUgTGludXgtbGlrZS4KKyAqIAorICogV2VkIE9jdCAxNyAyMDAxIE1hdHQgRG9tc2NoIDxNYXR0X0RvbXNjaEBkZWxsLmNvbT4KKyAqIC0gUmVtb3ZlZCBDT05GSUdfREVWRlNfVk9MVU1FU19VVUlEIGNvZGUgZW50aXJlbHkgcGVyIE1hcnRpbiBXaWxjaworICoKKyAqIFdlZCBPY3QgMTAgMjAwMSBNYXR0IERvbXNjaCA8TWF0dF9Eb21zY2hAZGVsbC5jb20+CisgKiAtIENoYW5nZWQgZnVuY3Rpb24gY29tbWVudHMgdG8gRG9jQm9vayBzdHlsZSBwZXIgQW5kcmVhcyBEaWxnZXIgc3VnZ2VzdGlvbi4KKyAqCisgKiBNb24gT2N0IDA4IDIwMDEgTWF0dCBEb21zY2ggPE1hdHRfRG9tc2NoQGRlbGwuY29tPgorICogLSBDaGFuZ2UgcmVhZF9sYmEoKSB0byB1c2UgdGhlIHBhZ2UgY2FjaGUgcGVyIEFsIFZpcm8ncyB3b3JrLgorICogLSBwcmludCB1NjRzIHByb3Blcmx5IG9uIGFsbCBhcmNoaXRlY3R1cmVzCisgKiAtIGZpeGVkIGRlYnVnX3ByaW50aygpLCBub3cgRHByaW50aygpCisgKgorICogTW9uIE9jdCAwMSAyMDAxIE1hdHQgRG9tc2NoIDxNYXR0X0RvbXNjaEBkZWxsLmNvbT4KKyAqIC0gU3R5bGUgY2xlYW51cHMKKyAqIC0gbWFkZSBtb3N0IGZ1bmN0aW9ucyBzdGF0aWMKKyAqIC0gRW5kaWFubmVzcyBhZGRpdGlvbgorICogLSByZW1vdmUgdGVzdCBmb3Igc2Vjb25kIGFsdGVybmF0ZSBoZWFkZXIsIGFzIGl0J3Mgbm90IHBlciBzcGVjLAorICogICBhbmQgaXMgdW5uZWNlc3NhcnkuICBUaGVyZSdzIG5vdyBhIG1ldGhvZCB0byByZWFkL3dyaXRlIHRoZSBsYXN0CisgKiAgIHNlY3RvciBvZiBhbiBvZGQtc2l6ZWQgZGlzayBmcm9tIHVzZXIgc3BhY2UuICBObyB0b29scyBoYXZlIGV2ZXIKKyAqICAgYmVlbiByZWxlYXNlZCB3aGljaCB1c2VkIHRoaXMgY29kZSwgc28gaXQncyBlZmZlY3RpdmVseSBkZWFkLgorICogLSBQZXIgQXNpdCBNYWxsaWNrIG9mIEludGVsLCBhZGRlZCBhIHRlc3QgZm9yIGEgdmFsaWQgUE1CUi4KKyAqIC0gQWRkZWQga2VybmVsIGNvbW1hbmQgbGluZSBvcHRpb24gJ2dwdCcgdG8gb3ZlcnJpZGUgdmFsaWQgUE1CUiB0ZXN0LgorICoKKyAqIFdlZCBKdW4gIDYgMjAwMSBNYXJ0aW4gV2lsY2sgPE1hcnRpbi5XaWxja0BGdWppdHN1LVNpZW1lbnMuY29tPgorICogLSBhZGRlZCBkZXZmcyB2b2x1bWUgVVVJRCBzdXBwb3J0ICgvZGV2L3ZvbHVtZXMvdXVpZHMpIGZvcgorICogICBtb3VudGluZyBmaWxlIHN5c3RlbXMgYnkgdGhlIHBhcnRpdGlvbiBHVUlELiAKKyAqCisgKiBUdWUgRGVjICA1IDIwMDAgTWF0dCBEb21zY2ggPE1hdHRfRG9tc2NoQGRlbGwuY29tPgorICogLSBNb3ZlZCBjcmMzMigpIHRvIGxpbnV4L2xpYiwgYWRkZWQgZWZpX2NyYzMyKCkuCisgKgorICogVGh1IE5vdiAzMCAyMDAwIE1hdHQgRG9tc2NoIDxNYXR0X0RvbXNjaEBkZWxsLmNvbT4KKyAqIC0gUmVwbGFjZWQgSW50ZWwncyBDUkMzMiBmdW5jdGlvbiB3aXRoIGFuIGVxdWl2YWxlbnQKKyAqICAgbm9uLWxpY2Vuc2UtcmVzdHJpY3RlZCB2ZXJzaW9uLgorICoKKyAqIFdlZCBPY3QgMjUgMjAwMCBNYXR0IERvbXNjaCA8TWF0dF9Eb21zY2hAZGVsbC5jb20+CisgKiAtIEZpeGVkIHRoZSBsYXN0X2xiYSgpIGNhbGwgdG8gcmV0dXJuIHRoZSBwcm9wZXIgbGFzdCBibG9jaworICoKKyAqIFRodSBPY3QgMTIgMjAwMCBNYXR0IERvbXNjaCA8TWF0dF9Eb21zY2hAZGVsbC5jb20+CisgKiAtIFRoYW5rcyB0byBBbmRyaWVzIEJyb3V3ZXIgZm9yIGhpcyBkZWJ1Z2dpbmcgYXNzaXN0YW5jZS4KKyAqIC0gQ29kZSB3b3JrcywgZGV0ZWN0cyBhbGwgdGhlIHBhcnRpdGlvbnMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgImNoZWNrLmgiCisjaW5jbHVkZSAiZWZpLmgiCisKKyN1bmRlZiBFRklfREVCVUcKKyNpZmRlZiBFRklfREVCVUcKKyNkZWZpbmUgRHByaW50ayh4Li4uKSBwcmludGsoS0VSTl9ERUJVRyB4KQorI2Vsc2UKKyNkZWZpbmUgRHByaW50ayh4Li4uKQorI2VuZGlmCisKKy8qIFRoaXMgYWxsb3dzIGEga2VybmVsIGNvbW1hbmQgbGluZSBvcHRpb24gJ2dwdCcgdG8gb3ZlcnJpZGUKKyAqIHRoZSB0ZXN0IGZvciBpbnZhbGlkIFBNQlIuICBOb3QgX19pbml0ZGF0YSBiZWNhdXNlIHJlbG9hZGluZworICogdGhlIHBhcnRpdGlvbiB0YWJsZXMgaGFwcGVucyBhZnRlciBpbml0IHRvby4KKyAqLworc3RhdGljIGludCBmb3JjZV9ncHQ7CitzdGF0aWMgaW50IF9faW5pdAorZm9yY2VfZ3B0X2ZuKGNoYXIgKnN0cikKK3sKKwlmb3JjZV9ncHQgPSAxOworCXJldHVybiAxOworfQorX19zZXR1cCgiZ3B0IiwgZm9yY2VfZ3B0X2ZuKTsKKworCisvKioKKyAqIGVmaV9jcmMzMigpIC0gRUZJIHZlcnNpb24gb2YgY3JjMzIgZnVuY3Rpb24KKyAqIEBidWY6IGJ1ZmZlciB0byBjYWxjdWxhdGUgY3JjMzIgb2YKKyAqIEBsZW4gLSBsZW5ndGggb2YgYnVmCisgKgorICogRGVzY3JpcHRpb246IFJldHVybnMgRUZJLXN0eWxlIENSQzMyIHZhbHVlIGZvciBAYnVmCisgKiAKKyAqIFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgbGl0dGxlIGVuZGlhbiBFdGhlcm5ldCBwb2x5bm9taWFsCisgKiBidXQgc2VlZHMgdGhlIGZ1bmN0aW9uIHdpdGggfjAsIGFuZCB4b3IncyB3aXRoIH4wIGF0IHRoZSBlbmQuCisgKiBOb3RlLCB0aGUgRUZJIFNwZWNpZmljYXRpb24sIHYxLjAyLCBoYXMgYSByZWZlcmVuY2UgdG8KKyAqIERyLiBEb2JicyBKb3VybmFsLCBNYXkgMTk5NCAoYWN0dWFsbHkgaXQncyBpbiBNYXkgMTk5MikuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyCitlZmlfY3JjMzIoY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlyZXR1cm4gKGNyYzMyKH4wTCwgYnVmLCBsZW4pIF4gfjBMKTsKK30KKworLyoqCisgKiBsYXN0X2xiYSgpOiByZXR1cm4gbnVtYmVyIG9mIGxhc3QgbG9naWNhbCBibG9jayBvZiBkZXZpY2UKKyAqIEBiZGV2OiBibG9jayBkZXZpY2UKKyAqIAorICogRGVzY3JpcHRpb246IFJldHVybnMgbGFzdCBMQkEgdmFsdWUgb24gc3VjY2VzcywgMCBvbiBlcnJvci4KKyAqIFRoaXMgaXMgc3RvcmVkIChieSBzZCBhbmQgaWRlLWdlb21ldHJ5KSBpbgorICogIHRoZSBwYXJ0WzBdIGVudHJ5IGZvciB0aGlzIGRpc2ssIGFuZCBpcyB0aGUgbnVtYmVyIG9mCisgKiAgcGh5c2ljYWwgc2VjdG9ycyBhdmFpbGFibGUgb24gdGhlIGRpc2suCisgKi8KK3N0YXRpYyB1NjQKK2xhc3RfbGJhKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJaWYgKCFiZGV2IHx8ICFiZGV2LT5iZF9pbm9kZSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIChiZGV2LT5iZF9pbm9kZS0+aV9zaXplID4+IDkpIC0gMVVMTDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3BtYnJfcGFydF92YWxpZChzdHJ1Y3QgcGFydGl0aW9uICpwYXJ0LCB1NjQgbGFzdGxiYSkKK3sKKyAgICAgICAgaWYgKHBhcnQtPnN5c19pbmQgPT0gRUZJX1BNQlJfT1NUWVBFX0VGSV9HUFQgJiYKKyAgICAgICAgICAgIGxlMzJfdG9fY3B1KHBhcnQtPnN0YXJ0X3NlY3QpID09IDFVTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXNfcG1icl92YWxpZCgpOiB0ZXN0IFByb3RlY3RpdmUgTUJSIGZvciB2YWxpZGl0eQorICogQG1icjogcG9pbnRlciB0byBhIGxlZ2FjeSBtYnIgc3RydWN0dXJlCisgKiBAbGFzdGxiYTogbGFzdF9sYmEgZm9yIHRoZSB3aG9sZSBkZXZpY2UKKyAqCisgKiBEZXNjcmlwdGlvbjogUmV0dXJucyAxIGlmIFBNQlIgaXMgdmFsaWQsIDAgb3RoZXJ3aXNlLgorICogVmFsaWRpdHkgZGVwZW5kcyBvbiB0d28gdGhpbmdzOgorICogIDEpIE1TRE9TIHNpZ25hdHVyZSBpcyBpbiB0aGUgbGFzdCB0d28gYnl0ZXMgb2YgdGhlIE1CUgorICogIDIpIE9uZSBwYXJ0aXRpb24gb2YgdHlwZSAweEVFIGlzIGZvdW5kCisgKi8KK3N0YXRpYyBpbnQKK2lzX3BtYnJfdmFsaWQobGVnYWN5X21iciAqbWJyLCB1NjQgbGFzdGxiYSkKK3sKKwlpbnQgaTsKKwlpZiAoIW1iciB8fCBsZTE2X3RvX2NwdShtYnItPnNpZ25hdHVyZSkgIT0gTVNET1NfTUJSX1NJR05BVFVSRSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQlpZiAocG1icl9wYXJ0X3ZhbGlkKCZtYnItPnBhcnRpdGlvbl9yZWNvcmRbaV0sIGxhc3RsYmEpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcmVhZF9sYmEoKTogUmVhZCBieXRlcyBmcm9tIGRpc2ssIHN0YXJ0aW5nIGF0IGdpdmVuIExCQQorICogQGJkZXYKKyAqIEBsYmEKKyAqIEBidWZmZXIKKyAqIEBzaXplX3QKKyAqCisgKiBEZXNjcmlwdGlvbjogIFJlYWRzIEBjb3VudCBieXRlcyBmcm9tIEBiZGV2IGludG8gQGJ1ZmZlci4KKyAqIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgb24gc3VjY2VzcywgMCBvbiBlcnJvci4KKyAqLworc3RhdGljIHNpemVfdAorcmVhZF9sYmEoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgdTY0IGxiYSwgdTggKiBidWZmZXIsIHNpemVfdCBjb3VudCkKK3sKKwlzaXplX3QgdG90YWxyZWFkY291bnQgPSAwOworCisJaWYgKCFiZGV2IHx8ICFidWZmZXIgfHwgbGJhID4gbGFzdF9sYmEoYmRldikpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKwl3aGlsZSAoY291bnQpIHsKKwkJaW50IGNvcGllZCA9IDUxMjsKKwkJU2VjdG9yIHNlY3Q7CisJCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSByZWFkX2Rldl9zZWN0b3IoYmRldiwgbGJhKyssICZzZWN0KTsKKwkJaWYgKCFkYXRhKQorCQkJYnJlYWs7CisJCWlmIChjb3BpZWQgPiBjb3VudCkKKwkJCWNvcGllZCA9IGNvdW50OworCQltZW1jcHkoYnVmZmVyLCBkYXRhLCBjb3BpZWQpOworCQlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKwkJYnVmZmVyICs9IGNvcGllZDsKKwkJdG90YWxyZWFkY291bnQgKz1jb3BpZWQ7CisJCWNvdW50IC09IGNvcGllZDsKKwl9CisJcmV0dXJuIHRvdGFscmVhZGNvdW50OworfQorCisvKioKKyAqIGFsbG9jX3JlYWRfZ3B0X2VudHJpZXMoKTogcmVhZHMgcGFydGl0aW9uIGVudHJpZXMgZnJvbSBkaXNrCisgKiBAYmRldgorICogQGdwdCAtIEdQVCBoZWFkZXIKKyAqIAorICogRGVzY3JpcHRpb246IFJldHVybnMgcHRlcyBvbiBzdWNjZXNzLCAgTlVMTCBvbiBlcnJvci4KKyAqIEFsbG9jYXRlcyBzcGFjZSBmb3IgUFRFcyBiYXNlZCBvbiBpbmZvcm1hdGlvbiBmb3VuZCBpbiBAZ3B0LgorICogTm90ZXM6IHJlbWVtYmVyIHRvIGZyZWUgcHRlIHdoZW4geW91J3JlIGRvbmUhCisgKi8KK3N0YXRpYyBncHRfZW50cnkgKgorYWxsb2NfcmVhZF9ncHRfZW50cmllcyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBncHRfaGVhZGVyICpncHQpCit7CisJc2l6ZV90IGNvdW50OworCWdwdF9lbnRyeSAqcHRlOworCWlmICghYmRldiB8fCAhZ3B0KQorCQlyZXR1cm4gTlVMTDsKKworCWNvdW50ID0gbGUzMl90b19jcHUoZ3B0LT5udW1fcGFydGl0aW9uX2VudHJpZXMpICoKKyAgICAgICAgICAgICAgICBsZTMyX3RvX2NwdShncHQtPnNpemVvZl9wYXJ0aXRpb25fZW50cnkpOworCWlmICghY291bnQpCisJCXJldHVybiBOVUxMOworCXB0ZSA9IGttYWxsb2MoY291bnQsIEdGUF9LRVJORUwpOworCWlmICghcHRlKQorCQlyZXR1cm4gTlVMTDsKKwltZW1zZXQocHRlLCAwLCBjb3VudCk7CisKKwlpZiAocmVhZF9sYmEoYmRldiwgbGU2NF90b19jcHUoZ3B0LT5wYXJ0aXRpb25fZW50cnlfbGJhKSwKKyAgICAgICAgICAgICAgICAgICAgICh1OCAqKSBwdGUsCisJCSAgICAgY291bnQpIDwgY291bnQpIHsKKwkJa2ZyZWUocHRlKTsKKyAgICAgICAgICAgICAgICBwdGU9TlVMTDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBwdGU7Cit9CisKKy8qKgorICogYWxsb2NfcmVhZF9ncHRfaGVhZGVyKCk6IEFsbG9jYXRlcyBHUFQgaGVhZGVyLCByZWFkcyBpbnRvIGl0IGZyb20gZGlzaworICogQGJkZXYKKyAqIEBsYmEgaXMgdGhlIExvZ2ljYWwgQmxvY2sgQWRkcmVzcyBvZiB0aGUgcGFydGl0aW9uIHRhYmxlCisgKiAKKyAqIERlc2NyaXB0aW9uOiByZXR1cm5zIEdQVCBoZWFkZXIgb24gc3VjY2VzcywgTlVMTCBvbiBlcnJvci4gICBBbGxvY2F0ZXMKKyAqIGFuZCBmaWxscyBhIEdQVCBoZWFkZXIgc3RhcnRpbmcgYXQgQCBmcm9tIEBiZGV2LgorICogTm90ZTogcmVtZW1iZXIgdG8gZnJlZSBncHQgd2hlbiBmaW5pc2hlZCB3aXRoIGl0LgorICovCitzdGF0aWMgZ3B0X2hlYWRlciAqCithbGxvY19yZWFkX2dwdF9oZWFkZXIoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgdTY0IGxiYSkKK3sKKwlncHRfaGVhZGVyICpncHQ7CisJaWYgKCFiZGV2KQorCQlyZXR1cm4gTlVMTDsKKworCWdwdCA9IGttYWxsb2Moc2l6ZW9mIChncHRfaGVhZGVyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFncHQpCisJCXJldHVybiBOVUxMOworCW1lbXNldChncHQsIDAsIHNpemVvZiAoZ3B0X2hlYWRlcikpOworCisJaWYgKHJlYWRfbGJhKGJkZXYsIGxiYSwgKHU4ICopIGdwdCwKKwkJICAgICBzaXplb2YgKGdwdF9oZWFkZXIpKSA8IHNpemVvZiAoZ3B0X2hlYWRlcikpIHsKKwkJa2ZyZWUoZ3B0KTsKKyAgICAgICAgICAgICAgICBncHQ9TlVMTDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGdwdDsKK30KKworLyoqCisgKiBpc19ncHRfdmFsaWQoKSAtIHRlc3RzIG9uZSBHUFQgaGVhZGVyIGFuZCBQVEVzIGZvciB2YWxpZGl0eQorICogQGJkZXYKKyAqIEBsYmEgaXMgdGhlIGxvZ2ljYWwgYmxvY2sgYWRkcmVzcyBvZiB0aGUgR1BUIGhlYWRlciB0byB0ZXN0CisgKiBAZ3B0IGlzIGEgR1BUIGhlYWRlciBwdHIsIGZpbGxlZCBvbiByZXR1cm4uCisgKiBAcHRlcyBpcyBhIFBURXMgcHRyLCBmaWxsZWQgb24gcmV0dXJuLgorICoKKyAqIERlc2NyaXB0aW9uOiByZXR1cm5zIDEgaWYgdmFsaWQsICAwIG9uIGVycm9yLgorICogSWYgdmFsaWQsIHJldHVybnMgcG9pbnRlcnMgdG8gbmV3bHkgYWxsb2NhdGVkIEdQVCBoZWFkZXIgYW5kIFBURXMuCisgKi8KK3N0YXRpYyBpbnQKK2lzX2dwdF92YWxpZChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCB1NjQgbGJhLAorCSAgICAgZ3B0X2hlYWRlciAqKmdwdCwgZ3B0X2VudHJ5ICoqcHRlcykKK3sKKwl1MzIgY3JjLCBvcmlnY3JjOworCXU2NCBsYXN0bGJhOworCisJaWYgKCFiZGV2IHx8ICFncHQgfHwgIXB0ZXMpCisJCXJldHVybiAwOworCWlmICghKCpncHQgPSBhbGxvY19yZWFkX2dwdF9oZWFkZXIoYmRldiwgbGJhKSkpCisJCXJldHVybiAwOworCisJLyogQ2hlY2sgdGhlIEdVSUQgUGFydGl0aW9uIFRhYmxlIHNpZ25hdHVyZSAqLworCWlmIChsZTY0X3RvX2NwdSgoKmdwdCktPnNpZ25hdHVyZSkgIT0gR1BUX0hFQURFUl9TSUdOQVRVUkUpIHsKKwkJRHByaW50aygiR1VJRCBQYXJ0aXRpb24gVGFibGUgSGVhZGVyIHNpZ25hdHVyZSBpcyB3cm9uZzoiCisJCQkiJWxsZCAhPSAlbGxkXG4iLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdSgoKmdwdCktPnNpZ25hdHVyZSksCisJCQkodW5zaWduZWQgbG9uZyBsb25nKUdQVF9IRUFERVJfU0lHTkFUVVJFKTsKKwkJZ290byBmYWlsOworCX0KKworCS8qIENoZWNrIHRoZSBHVUlEIFBhcnRpdGlvbiBUYWJsZSBDUkMgKi8KKwlvcmlnY3JjID0gbGUzMl90b19jcHUoKCpncHQpLT5oZWFkZXJfY3JjMzIpOworCSgqZ3B0KS0+aGVhZGVyX2NyYzMyID0gMDsKKwljcmMgPSBlZmlfY3JjMzIoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgKCpncHQpLCBsZTMyX3RvX2NwdSgoKmdwdCktPmhlYWRlcl9zaXplKSk7CisKKwlpZiAoY3JjICE9IG9yaWdjcmMpIHsKKwkJRHByaW50aworCQkgICAgKCJHVUlEIFBhcnRpdGlvbiBUYWJsZSBIZWFkZXIgQ1JDIGlzIHdyb25nOiAleCAhPSAleFxuIiwKKwkJICAgICBjcmMsIG9yaWdjcmMpOworCQlnb3RvIGZhaWw7CisJfQorCSgqZ3B0KS0+aGVhZGVyX2NyYzMyID0gY3B1X3RvX2xlMzIob3JpZ2NyYyk7CisKKwkvKiBDaGVjayB0aGF0IHRoZSBteV9sYmEgZW50cnkgcG9pbnRzIHRvIHRoZSBMQkEgdGhhdCBjb250YWlucworCSAqIHRoZSBHVUlEIFBhcnRpdGlvbiBUYWJsZSAqLworCWlmIChsZTY0X3RvX2NwdSgoKmdwdCktPm15X2xiYSkgIT0gbGJhKSB7CisJCURwcmludGsoIkdQVCBteV9sYmEgaW5jb3JyZWN0OiAlbGxkICE9ICVsbGRcbiIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KCgqZ3B0KS0+bXlfbGJhKSwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbGJhKTsKKwkJZ290byBmYWlsOworCX0KKworCS8qIENoZWNrIHRoZSBmaXJzdF91c2FibGVfbGJhIGFuZCBsYXN0X3VzYWJsZV9sYmEgYXJlCisJICogd2l0aGluIHRoZSBkaXNrLgorCSAqLworCWxhc3RsYmEgPSBsYXN0X2xiYShiZGV2KTsKKwlpZiAobGU2NF90b19jcHUoKCpncHQpLT5maXJzdF91c2FibGVfbGJhKSA+IGxhc3RsYmEpIHsKKwkJRHByaW50aygiR1BUOiBmaXJzdF91c2FibGVfbGJhIGluY29ycmVjdDogJWxsZCA+ICVsbGRcbiIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KCgqZ3B0KS0+Zmlyc3RfdXNhYmxlX2xiYSksCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWxhc3RsYmEpOworCQlnb3RvIGZhaWw7CisJfQorCWlmIChsZTY0X3RvX2NwdSgoKmdwdCktPmxhc3RfdXNhYmxlX2xiYSkgPiBsYXN0bGJhKSB7CisJCURwcmludGsoIkdQVDogbGFzdF91c2FibGVfbGJhIGluY29ycmVjdDogJWxsZCA+ICVsbGRcbiIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KCgqZ3B0KS0+bGFzdF91c2FibGVfbGJhKSwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbGFzdGxiYSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoISgqcHRlcyA9IGFsbG9jX3JlYWRfZ3B0X2VudHJpZXMoYmRldiwgKmdwdCkpKQorCQlnb3RvIGZhaWw7CisKKwkvKiBDaGVjayB0aGUgR1VJRCBQYXJ0aXRpb24gRW50cnkgQXJyYXkgQ1JDICovCisJY3JjID0gZWZpX2NyYzMyKChjb25zdCB1bnNpZ25lZCBjaGFyICopICgqcHRlcyksCisJCQlsZTMyX3RvX2NwdSgoKmdwdCktPm51bV9wYXJ0aXRpb25fZW50cmllcykgKgorCQkJbGUzMl90b19jcHUoKCpncHQpLT5zaXplb2ZfcGFydGl0aW9uX2VudHJ5KSk7CisKKwlpZiAoY3JjICE9IGxlMzJfdG9fY3B1KCgqZ3B0KS0+cGFydGl0aW9uX2VudHJ5X2FycmF5X2NyYzMyKSkgeworCQlEcHJpbnRrKCJHVUlEIFBhcnRpdGl0aW9uIEVudHJ5IEFycmF5IENSQyBjaGVjayBmYWlsZWQuXG4iKTsKKwkJZ290byBmYWlsX3B0ZXM7CisJfQorCisJLyogV2UncmUgZG9uZSwgYWxsJ3Mgd2VsbCAqLworCXJldHVybiAxOworCisgZmFpbF9wdGVzOgorCWtmcmVlKCpwdGVzKTsKKwkqcHRlcyA9IE5VTEw7CisgZmFpbDoKKwlrZnJlZSgqZ3B0KTsKKwkqZ3B0ID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpc19wdGVfdmFsaWQoKSAtIHRlc3RzIG9uZSBQVEUgZm9yIHZhbGlkaXR5CisgKiBAcHRlIGlzIHRoZSBwdGUgdG8gY2hlY2sKKyAqIEBsYXN0bGJhIGlzIGxhc3QgbGJhIG9mIHRoZSBkaXNrCisgKgorICogRGVzY3JpcHRpb246IHJldHVybnMgMSBpZiB2YWxpZCwgIDAgb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50Citpc19wdGVfdmFsaWQoY29uc3QgZ3B0X2VudHJ5ICpwdGUsIGNvbnN0IHU2NCBsYXN0bGJhKQoreworCWlmICgoIWVmaV9ndWlkY21wKHB0ZS0+cGFydGl0aW9uX3R5cGVfZ3VpZCwgTlVMTF9HVUlEKSkgfHwKKwkgICAgbGU2NF90b19jcHUocHRlLT5zdGFydGluZ19sYmEpID4gbGFzdGxiYSAgICAgICAgIHx8CisJICAgIGxlNjRfdG9fY3B1KHB0ZS0+ZW5kaW5nX2xiYSkgICA+IGxhc3RsYmEpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKioKKyAqIGNvbXBhcmVfZ3B0cygpIC0gU2VhcmNoIGRpc2sgZm9yIHZhbGlkIEdQVCBoZWFkZXJzIGFuZCBQVEVzCisgKiBAcGdwdCBpcyB0aGUgcHJpbWFyeSBHUFQgaGVhZGVyCisgKiBAYWdwdCBpcyB0aGUgYWx0ZXJuYXRlIEdQVCBoZWFkZXIKKyAqIEBsYXN0bGJhIGlzIHRoZSBsYXN0IExCQSBudW1iZXIKKyAqIERlc2NyaXB0aW9uOiBSZXR1cm5zIG5vdGhpbmcuICBTYW5pdHkgY2hlY2tzIHBncHQgYW5kIGFncHQgZmllbGRzCisgKiBhbmQgcHJpbnRzIHdhcm5pbmdzIG9uIGRpc2NyZXBhbmNpZXMuCisgKiAKKyAqLworc3RhdGljIHZvaWQKK2NvbXBhcmVfZ3B0cyhncHRfaGVhZGVyICpwZ3B0LCBncHRfaGVhZGVyICphZ3B0LCB1NjQgbGFzdGxiYSkKK3sKKwlpbnQgZXJyb3JfZm91bmQgPSAwOworCWlmICghcGdwdCB8fCAhYWdwdCkKKwkJcmV0dXJuOworCWlmIChsZTY0X3RvX2NwdShwZ3B0LT5teV9sYmEpICE9IGxlNjRfdG9fY3B1KGFncHQtPmFsdGVybmF0ZV9sYmEpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJHUFQ6UHJpbWFyeSBoZWFkZXIgTEJBICE9IEFsdC4gaGVhZGVyIGFsdGVybmF0ZV9sYmFcbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJHUFQ6JWxsZCAhPSAlbGxkXG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShwZ3B0LT5teV9sYmEpLAorICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGFncHQtPmFsdGVybmF0ZV9sYmEpKTsKKwkJZXJyb3JfZm91bmQrKzsKKwl9CisJaWYgKGxlNjRfdG9fY3B1KHBncHQtPmFsdGVybmF0ZV9sYmEpICE9IGxlNjRfdG9fY3B1KGFncHQtPm15X2xiYSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIkdQVDpQcmltYXJ5IGhlYWRlciBhbHRlcm5hdGVfbGJhICE9IEFsdC4gaGVhZGVyIG15X2xiYVxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkdQVDolbGxkICE9ICVsbGRcbiIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KHBncHQtPmFsdGVybmF0ZV9sYmEpLAorICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGFncHQtPm15X2xiYSkpOworCQllcnJvcl9mb3VuZCsrOworCX0KKwlpZiAobGU2NF90b19jcHUocGdwdC0+Zmlyc3RfdXNhYmxlX2xiYSkgIT0KKyAgICAgICAgICAgIGxlNjRfdG9fY3B1KGFncHQtPmZpcnN0X3VzYWJsZV9sYmEpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkdQVDpmaXJzdF91c2FibGVfbGJhcyBkb24ndCBtYXRjaC5cbiIpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJHUFQ6JWxsZCAhPSAlbGxkXG4iLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShwZ3B0LT5maXJzdF91c2FibGVfbGJhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShhZ3B0LT5maXJzdF91c2FibGVfbGJhKSk7CisJCWVycm9yX2ZvdW5kKys7CisJfQorCWlmIChsZTY0X3RvX2NwdShwZ3B0LT5sYXN0X3VzYWJsZV9sYmEpICE9CisgICAgICAgICAgICBsZTY0X3RvX2NwdShhZ3B0LT5sYXN0X3VzYWJsZV9sYmEpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkdQVDpsYXN0X3VzYWJsZV9sYmFzIGRvbid0IG1hdGNoLlxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkdQVDolbGxkICE9ICVsbGRcbiIsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KHBncHQtPmxhc3RfdXNhYmxlX2xiYSksCisgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoYWdwdC0+bGFzdF91c2FibGVfbGJhKSk7CisJCWVycm9yX2ZvdW5kKys7CisJfQorCWlmIChlZmlfZ3VpZGNtcChwZ3B0LT5kaXNrX2d1aWQsIGFncHQtPmRpc2tfZ3VpZCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiR1BUOmRpc2tfZ3VpZHMgZG9uJ3QgbWF0Y2guXG4iKTsKKwkJZXJyb3JfZm91bmQrKzsKKwl9CisJaWYgKGxlMzJfdG9fY3B1KHBncHQtPm51bV9wYXJ0aXRpb25fZW50cmllcykgIT0KKyAgICAgICAgICAgIGxlMzJfdG9fY3B1KGFncHQtPm51bV9wYXJ0aXRpb25fZW50cmllcykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiR1BUOm51bV9wYXJ0aXRpb25fZW50cmllcyBkb24ndCBtYXRjaDogIgorCQkgICAgICAgIjB4JXggIT0gMHgleFxuIiwKKwkJICAgICAgIGxlMzJfdG9fY3B1KHBncHQtPm51bV9wYXJ0aXRpb25fZW50cmllcyksCisJCSAgICAgICBsZTMyX3RvX2NwdShhZ3B0LT5udW1fcGFydGl0aW9uX2VudHJpZXMpKTsKKwkJZXJyb3JfZm91bmQrKzsKKwl9CisJaWYgKGxlMzJfdG9fY3B1KHBncHQtPnNpemVvZl9wYXJ0aXRpb25fZW50cnkpICE9CisgICAgICAgICAgICBsZTMyX3RvX2NwdShhZ3B0LT5zaXplb2ZfcGFydGl0aW9uX2VudHJ5KSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiR1BUOnNpemVvZl9wYXJ0aXRpb25fZW50cnkgdmFsdWVzIGRvbid0IG1hdGNoOiAiCisJCSAgICAgICAiMHgleCAhPSAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICBsZTMyX3RvX2NwdShwZ3B0LT5zaXplb2ZfcGFydGl0aW9uX2VudHJ5KSwKKwkJICAgICAgIGxlMzJfdG9fY3B1KGFncHQtPnNpemVvZl9wYXJ0aXRpb25fZW50cnkpKTsKKwkJZXJyb3JfZm91bmQrKzsKKwl9CisJaWYgKGxlMzJfdG9fY3B1KHBncHQtPnBhcnRpdGlvbl9lbnRyeV9hcnJheV9jcmMzMikgIT0KKyAgICAgICAgICAgIGxlMzJfdG9fY3B1KGFncHQtPnBhcnRpdGlvbl9lbnRyeV9hcnJheV9jcmMzMikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIkdQVDpwYXJ0aXRpb25fZW50cnlfYXJyYXlfY3JjMzIgdmFsdWVzIGRvbid0IG1hdGNoOiAiCisJCSAgICAgICAiMHgleCAhPSAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICBsZTMyX3RvX2NwdShwZ3B0LT5wYXJ0aXRpb25fZW50cnlfYXJyYXlfY3JjMzIpLAorCQkgICAgICAgbGUzMl90b19jcHUoYWdwdC0+cGFydGl0aW9uX2VudHJ5X2FycmF5X2NyYzMyKSk7CisJCWVycm9yX2ZvdW5kKys7CisJfQorCWlmIChsZTY0X3RvX2NwdShwZ3B0LT5hbHRlcm5hdGVfbGJhKSAhPSBsYXN0bGJhKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJHUFQ6UHJpbWFyeSBoZWFkZXIgdGhpbmtzIEFsdC4gaGVhZGVyIGlzIG5vdCBhdCB0aGUgZW5kIG9mIHRoZSBkaXNrLlxuIik7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkdQVDolbGxkICE9ICVsbGRcbiIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KHBncHQtPmFsdGVybmF0ZV9sYmEpLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylsYXN0bGJhKTsKKwkJZXJyb3JfZm91bmQrKzsKKwl9CisKKwlpZiAobGU2NF90b19jcHUoYWdwdC0+bXlfbGJhKSAhPSBsYXN0bGJhKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJHUFQ6QWx0ZXJuYXRlIEdQVCBoZWFkZXIgbm90IGF0IHRoZSBlbmQgb2YgdGhlIGRpc2suXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiR1BUOiVsbGQgIT0gJWxsZFxuIiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoYWdwdC0+bXlfbGJhKSwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbGFzdGxiYSk7CisJCWVycm9yX2ZvdW5kKys7CisJfQorCisJaWYgKGVycm9yX2ZvdW5kKQorCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiR1BUOiBVc2UgR05VIFBhcnRlZCB0byBjb3JyZWN0IEdQVCBlcnJvcnMuXG4iKTsKKwlyZXR1cm47Cit9CisKKy8qKgorICogZmluZF92YWxpZF9ncHQoKSAtIFNlYXJjaCBkaXNrIGZvciB2YWxpZCBHUFQgaGVhZGVycyBhbmQgUFRFcworICogQGJkZXYKKyAqIEBncHQgaXMgYSBHUFQgaGVhZGVyIHB0ciwgZmlsbGVkIG9uIHJldHVybi4KKyAqIEBwdGVzIGlzIGEgUFRFcyBwdHIsIGZpbGxlZCBvbiByZXR1cm4uCisgKiBEZXNjcmlwdGlvbjogUmV0dXJucyAxIGlmIHZhbGlkLCAwIG9uIGVycm9yLgorICogSWYgdmFsaWQsIHJldHVybnMgcG9pbnRlcnMgdG8gbmV3bHkgYWxsb2NhdGVkIEdQVCBoZWFkZXIgYW5kIFBURXMuCisgKiBWYWxpZGl0eSBkZXBlbmRzIG9uIFBNQlIgYmVpbmcgdmFsaWQgKG9yIGJlaW5nIG92ZXJyaWRkZW4gYnkgdGhlCisgKiAnZ3B0JyBrZXJuZWwgY29tbWFuZCBsaW5lIG9wdGlvbikgYW5kIGZpbmRpbmcgZWl0aGVyIHRoZSBQcmltYXJ5CisgKiBHUFQgaGVhZGVyIGFuZCBQVEVzIHZhbGlkLCBvciB0aGUgQWx0ZXJuYXRlIEdQVCBoZWFkZXIgYW5kIFBURXMKKyAqIHZhbGlkLiAgSWYgdGhlIFByaW1hcnkgR1BUIGhlYWRlciBpcyBub3QgdmFsaWQsIHRoZSBBbHRlcm5hdGUgR1BUIGhlYWRlcgorICogaXMgbm90IGNoZWNrZWQgdW5sZXNzIHRoZSAnZ3B0JyBrZXJuZWwgY29tbWFuZCBsaW5lIG9wdGlvbiBpcyBwYXNzZWQuCisgKiBUaGlzIHByb3RlY3RzIGFnYWluc3QgZGV2aWNlcyB3aGljaCBtaXNyZXBvcnQgdGhlaXIgc2l6ZSwgYW5kIGZvcmNlcworICogdGhlIHVzZXIgdG8gZGVjaWRlIHRvIHVzZSB0aGUgQWx0ZXJuYXRlIEdQVC4KKyAqLworc3RhdGljIGludAorZmluZF92YWxpZF9ncHQoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgZ3B0X2hlYWRlciAqKmdwdCwgZ3B0X2VudHJ5ICoqcHRlcykKK3sKKwlpbnQgZ29vZF9wZ3B0ID0gMCwgZ29vZF9hZ3B0ID0gMCwgZ29vZF9wbWJyID0gMDsKKwlncHRfaGVhZGVyICpwZ3B0ID0gTlVMTCwgKmFncHQgPSBOVUxMOworCWdwdF9lbnRyeSAqcHB0ZXMgPSBOVUxMLCAqYXB0ZXMgPSBOVUxMOworCWxlZ2FjeV9tYnIgKmxlZ2FjeW1iciA9IE5VTEw7CisJdTY0IGxhc3RsYmE7CisJaWYgKCFiZGV2IHx8ICFncHQgfHwgIXB0ZXMpCisJCXJldHVybiAwOworCisJbGFzdGxiYSA9IGxhc3RfbGJhKGJkZXYpOworICAgICAgICBpZiAoIWZvcmNlX2dwdCkgeworICAgICAgICAgICAgICAgIC8qIFRoaXMgd2lsbCBiZSBhZGRlZCB0byB0aGUgRUZJIFNwZWMuIHBlciBJbnRlbCBhZnRlciB2MS4wMi4gKi8KKyAgICAgICAgICAgICAgICBsZWdhY3ltYnIgPSBrbWFsbG9jKHNpemVvZiAoKmxlZ2FjeW1iciksIEdGUF9LRVJORUwpOworICAgICAgICAgICAgICAgIGlmIChsZWdhY3ltYnIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChsZWdhY3ltYnIsIDAsIHNpemVvZiAoKmxlZ2FjeW1icikpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9sYmEoYmRldiwgMCwgKHU4ICopIGxlZ2FjeW1iciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoKmxlZ2FjeW1icikpOworICAgICAgICAgICAgICAgICAgICAgICAgZ29vZF9wbWJyID0gaXNfcG1icl92YWxpZChsZWdhY3ltYnIsIGxhc3RsYmEpOworICAgICAgICAgICAgICAgICAgICAgICAga2ZyZWUobGVnYWN5bWJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FjeW1icj1OVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWdvb2RfcG1icikKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisJZ29vZF9wZ3B0ID0gaXNfZ3B0X3ZhbGlkKGJkZXYsIEdQVF9QUklNQVJZX1BBUlRJVElPTl9UQUJMRV9MQkEsCisJCQkJICZwZ3B0LCAmcHB0ZXMpOworICAgICAgICBpZiAoZ29vZF9wZ3B0KQorCQlnb29kX2FncHQgPSBpc19ncHRfdmFsaWQoYmRldiwKKwkJCQkJIGxlNjRfdG9fY3B1KHBncHQtPmFsdGVybmF0ZV9sYmEpLAorCQkJCQkgJmFncHQsICZhcHRlcyk7CisgICAgICAgIGlmICghZ29vZF9hZ3B0ICYmIGZvcmNlX2dwdCkKKyAgICAgICAgICAgICAgICBnb29kX2FncHQgPSBpc19ncHRfdmFsaWQoYmRldiwgbGFzdGxiYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFncHQsICZhcHRlcyk7CisKKyAgICAgICAgLyogVGhlIG9idmlvdXNseSB1bnN1Y2Nlc3NmdWwgY2FzZSAqLworICAgICAgICBpZiAoIWdvb2RfcGdwdCAmJiAhZ29vZF9hZ3B0KQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgICBjb21wYXJlX2dwdHMocGdwdCwgYWdwdCwgbGFzdGxiYSk7CisKKyAgICAgICAgLyogVGhlIGdvb2QgY2FzZXMgKi8KKyAgICAgICAgaWYgKGdvb2RfcGdwdCkgeworICAgICAgICAgICAgICAgICpncHQgID0gcGdwdDsKKyAgICAgICAgICAgICAgICAqcHRlcyA9IHBwdGVzOworICAgICAgICAgICAgICAgIGtmcmVlKGFncHQpOworICAgICAgICAgICAgICAgIGtmcmVlKGFwdGVzKTsKKyAgICAgICAgICAgICAgICBpZiAoIWdvb2RfYWdwdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAKKwkJCSAgICAgICAiQWx0ZXJuYXRlIEdQVCBpcyBpbnZhbGlkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIHByaW1hcnkgR1BULlxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKGdvb2RfYWdwdCkgeworICAgICAgICAgICAgICAgICpncHQgID0gYWdwdDsKKyAgICAgICAgICAgICAgICAqcHRlcyA9IGFwdGVzOworICAgICAgICAgICAgICAgIGtmcmVlKHBncHQpOworICAgICAgICAgICAgICAgIGtmcmVlKHBwdGVzKTsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HIAorICAgICAgICAgICAgICAgICAgICAgICAiUHJpbWFyeSBHUFQgaXMgaW52YWxpZCwgdXNpbmcgYWx0ZXJuYXRlIEdQVC5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyBmYWlsOgorICAgICAgICBrZnJlZShwZ3B0KTsKKyAgICAgICAga2ZyZWUoYWdwdCk7CisgICAgICAgIGtmcmVlKHBwdGVzKTsKKyAgICAgICAga2ZyZWUoYXB0ZXMpOworICAgICAgICAqZ3B0ID0gTlVMTDsKKyAgICAgICAgKnB0ZXMgPSBOVUxMOworICAgICAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBlZmlfcGFydGl0aW9uKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCisgKiBAc3RhdGUKKyAqIEBiZGV2CisgKgorICogRGVzY3JpcHRpb246IGNhbGxlZCBmcm9tIGNoZWNrLmMsIGlmIHRoZSBkaXNrIGNvbnRhaW5zIEdQVAorICogcGFydGl0aW9ucywgc2V0cyB1cCBwYXJ0aXRpb24gZW50cmllcyBpbiB0aGUga2VybmVsLgorICoKKyAqIElmIHRoZSBmaXJzdCBibG9jayBvbiB0aGUgZGlzayBpcyBhIGxlZ2FjeSBNQlIsCisgKiBpdCB3aWxsIGdldCBoYW5kbGVkIGJ5IG1zZG9zX3BhcnRpdGlvbigpLgorICogSWYgaXQncyBhIFByb3RlY3RpdmUgTUJSLCB3ZSdsbCBoYW5kbGUgaXQgaGVyZS4KKyAqCisgKiBXZSBkbyBub3QgY3JlYXRlIGEgTGludXggcGFydGl0aW9uIGZvciBHUFQsIGJ1dAorICogb25seSBmb3IgdGhlIGFjdHVhbCBkYXRhIHBhcnRpdGlvbnMuCisgKiBSZXR1cm5zOgorICogLTEgaWYgdW5hYmxlIHRvIHJlYWQgdGhlIHBhcnRpdGlvbiB0YWJsZQorICogIDAgaWYgdGhpcyBpc24ndCBvdXIgcGFydGl0aW9uIHRhYmxlCisgKiAgMSBpZiBzdWNjZXNzZnVsCisgKgorICovCitpbnQKK2VmaV9wYXJ0aXRpb24oc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKK3sKKwlncHRfaGVhZGVyICpncHQgPSBOVUxMOworCWdwdF9lbnRyeSAqcHRlcyA9IE5VTEw7CisJdTMyIGk7CisKKwlpZiAoIWZpbmRfdmFsaWRfZ3B0KGJkZXYsICZncHQsICZwdGVzKSB8fCAhZ3B0IHx8ICFwdGVzKSB7CisJCWtmcmVlKGdwdCk7CisJCWtmcmVlKHB0ZXMpOworCQlyZXR1cm4gMDsKKwl9CisKKwlEcHJpbnRrKCJHVUlEIFBhcnRpdGlvbiBUYWJsZSBpcyB2YWxpZCEgIFllYSFcbiIpOworCisJZm9yIChpID0gMDsgaSA8IGxlMzJfdG9fY3B1KGdwdC0+bnVtX3BhcnRpdGlvbl9lbnRyaWVzKSAmJiBpIDwgc3RhdGUtPmxpbWl0LTE7IGkrKykgeworCQlpZiAoIWlzX3B0ZV92YWxpZCgmcHRlc1tpXSwgbGFzdF9sYmEoYmRldikpKQorCQkJY29udGludWU7CisKKwkJcHV0X3BhcnRpdGlvbihzdGF0ZSwgaSsxLCBsZTY0X3RvX2NwdShwdGVzW2ldLnN0YXJ0aW5nX2xiYSksCisJCQkJIChsZTY0X3RvX2NwdShwdGVzW2ldLmVuZGluZ19sYmEpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZTY0X3RvX2NwdShwdGVzW2ldLnN0YXJ0aW5nX2xiYSkgKworCQkJCSAgMVVMTCkpOworCisJCS8qIElmIHRoaXMgaXMgYSBSQUlEIHZvbHVtZSwgdGVsbCBtZCAqLworCQlpZiAoIWVmaV9ndWlkY21wKHB0ZXNbaV0ucGFydGl0aW9uX3R5cGVfZ3VpZCwKKwkJCQkgUEFSVElUSU9OX0xJTlVYX1JBSURfR1VJRCkpCisJCQlzdGF0ZS0+cGFydHNbaSsxXS5mbGFncyA9IDE7CisJfQorCWtmcmVlKHB0ZXMpOworCWtmcmVlKGdwdCk7CisJcHJpbnRrKCJcbiIpOworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9lZmkuaCBiL2ZzL3BhcnRpdGlvbnMvZWZpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ0ZmIwNQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3BhcnRpdGlvbnMvZWZpLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEVGSSBHVUlEIFBhcnRpdGlvbiBUYWJsZQorICogUGVyIEludGVsIEVGSSBTcGVjaWZpY2F0aW9uIHYxLjAyCisgKiBodHRwOi8vZGV2ZWxvcGVyLmludGVsLmNvbS90ZWNobm9sb2d5L2VmaS9lZmkuaHRtCisgKgorICogQnkgTWF0dCBEb21zY2ggPE1hdHRfRG9tc2NoQGRlbGwuY29tPiAgRnJpIFNlcCAyMiAyMjoxNTo1NiBDRFQgMjAwMCAgCisgKiAgIENvcHlyaWdodCAyMDAwLDIwMDEgRGVsbCBJbmMuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKiAKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEZTX1BBUlRfRUZJX0hfSU5DTFVERUQKKyNkZWZpbmUgRlNfUEFSVF9FRklfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lZmkuaD4KKworI2RlZmluZSBNU0RPU19NQlJfU0lHTkFUVVJFIDB4YWE1NQorI2RlZmluZSBFRklfUE1CUl9PU1RZUEVfRUZJIDB4RUYKKyNkZWZpbmUgRUZJX1BNQlJfT1NUWVBFX0VGSV9HUFQgMHhFRQorCisjZGVmaW5lIEdQVF9CTE9DS19TSVpFIDUxMgorI2RlZmluZSBHUFRfSEVBREVSX1NJR05BVFVSRSAweDU0NTI0MTUwMjA0OTQ2NDVVTEwKKyNkZWZpbmUgR1BUX0hFQURFUl9SRVZJU0lPTl9WMSAweDAwMDEwMDAwCisjZGVmaW5lIEdQVF9QUklNQVJZX1BBUlRJVElPTl9UQUJMRV9MQkEgMQorCisjZGVmaW5lIFBBUlRJVElPTl9TWVNURU1fR1VJRCBcCisgICAgRUZJX0dVSUQoIDB4QzEyQTczMjgsIDB4RjgxRiwgMHgxMWQyLCBcCisgICAgICAgICAgICAgIDB4QkEsIDB4NEIsIDB4MDAsIDB4QTAsIDB4QzksIDB4M0UsIDB4QzksIDB4M0IpIAorI2RlZmluZSBMRUdBQ1lfTUJSX1BBUlRJVElPTl9HVUlEIFwKKyAgICBFRklfR1VJRCggMHgwMjRERUU0MSwgMHgzM0U3LCAweDExZDMsIFwKKyAgICAgICAgICAgICAgMHg5RCwgMHg2OSwgMHgwMCwgMHgwOCwgMHhDNywgMHg4MSwgMHhGMywgMHg5RikKKyNkZWZpbmUgUEFSVElUSU9OX01TRlRfUkVTRVJWRURfR1VJRCBcCisgICAgRUZJX0dVSUQoIDB4RTNDOUUzMTYsIDB4MEI1QywgMHg0REI4LCBcCisgICAgICAgICAgICAgIDB4ODEsIDB4N0QsIDB4RjksIDB4MkQsIDB4RjAsIDB4MDIsIDB4MTUsIDB4QUUpCisjZGVmaW5lIFBBUlRJVElPTl9CQVNJQ19EQVRBX0dVSUQgXAorICAgIEVGSV9HVUlEKCAweEVCRDBBMEEyLCAweEI5RTUsIDB4NDQzMywgXAorICAgICAgICAgICAgICAweDg3LCAweEMwLCAweDY4LCAweEI2LCAweEI3LCAweDI2LCAweDk5LCAweEM3KQorI2RlZmluZSBQQVJUSVRJT05fTElOVVhfUkFJRF9HVUlEIFwKKyAgICBFRklfR1VJRCggMHhhMTlkODgwZiwgMHgwNWZjLCAweDRkM2IsIFwKKyAgICAgICAgICAgICAgMHhhMCwgMHgwNiwgMHg3NCwgMHgzZiwgMHgwZiwgMHg4NCwgMHg5MSwgMHgxZSkKKyNkZWZpbmUgUEFSVElUSU9OX0xJTlVYX1NXQVBfR1VJRCBcCisgICAgRUZJX0dVSUQoIDB4MDY1N2ZkNmQsIDB4YTRhYiwgMHg0M2M0LCBcCisgICAgICAgICAgICAgIDB4ODQsIDB4ZTUsIDB4MDksIDB4MzMsIDB4YzgsIDB4NGIsIDB4NGYsIDB4NGYpCisjZGVmaW5lIFBBUlRJVElPTl9MSU5VWF9MVk1fR1VJRCBcCisgICAgRUZJX0dVSUQoIDB4ZTZkNmQzNzksIDB4ZjUwNywgMHg0NGMyLCBcCisgICAgICAgICAgICAgIDB4YTIsIDB4M2MsIDB4MjMsIDB4OGYsIDB4MmEsIDB4M2QsIDB4ZjksIDB4MjgpCisKK3R5cGVkZWYgc3RydWN0IF9ncHRfaGVhZGVyIHsKKwlfX2xlNjQgc2lnbmF0dXJlOworCV9fbGUzMiByZXZpc2lvbjsKKwlfX2xlMzIgaGVhZGVyX3NpemU7CisJX19sZTMyIGhlYWRlcl9jcmMzMjsKKwlfX2xlMzIgcmVzZXJ2ZWQxOworCV9fbGU2NCBteV9sYmE7CisJX19sZTY0IGFsdGVybmF0ZV9sYmE7CisJX19sZTY0IGZpcnN0X3VzYWJsZV9sYmE7CisJX19sZTY0IGxhc3RfdXNhYmxlX2xiYTsKKwllZmlfZ3VpZF90IGRpc2tfZ3VpZDsKKwlfX2xlNjQgcGFydGl0aW9uX2VudHJ5X2xiYTsKKwlfX2xlMzIgbnVtX3BhcnRpdGlvbl9lbnRyaWVzOworCV9fbGUzMiBzaXplb2ZfcGFydGl0aW9uX2VudHJ5OworCV9fbGUzMiBwYXJ0aXRpb25fZW50cnlfYXJyYXlfY3JjMzI7CisJdTggcmVzZXJ2ZWQyW0dQVF9CTE9DS19TSVpFIC0gOTJdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgZ3B0X2hlYWRlcjsKKwordHlwZWRlZiBzdHJ1Y3QgX2dwdF9lbnRyeV9hdHRyaWJ1dGVzIHsKKwl1NjQgcmVxdWlyZWRfdG9fZnVuY3Rpb246MTsKKwl1NjQgcmVzZXJ2ZWQ6NDc7CisgICAgICAgIHU2NCB0eXBlX2d1aWRfc3BlY2lmaWM6MTY7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBncHRfZW50cnlfYXR0cmlidXRlczsKKwordHlwZWRlZiBzdHJ1Y3QgX2dwdF9lbnRyeSB7CisJZWZpX2d1aWRfdCBwYXJ0aXRpb25fdHlwZV9ndWlkOworCWVmaV9ndWlkX3QgdW5pcXVlX3BhcnRpdGlvbl9ndWlkOworCV9fbGU2NCBzdGFydGluZ19sYmE7CisJX19sZTY0IGVuZGluZ19sYmE7CisJZ3B0X2VudHJ5X2F0dHJpYnV0ZXMgYXR0cmlidXRlczsKKwllZmlfY2hhcjE2X3QgcGFydGl0aW9uX25hbWVbNzIgLyBzaXplb2YgKGVmaV9jaGFyMTZfdCldOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgZ3B0X2VudHJ5OworCit0eXBlZGVmIHN0cnVjdCBfbGVnYWN5X21iciB7CisJdTggYm9vdF9jb2RlWzQ0MF07CisJX19sZTMyIHVuaXF1ZV9tYnJfc2lnbmF0dXJlOworCV9fbGUxNiB1bmtub3duOworCXN0cnVjdCBwYXJ0aXRpb24gcGFydGl0aW9uX3JlY29yZFs0XTsKKwlfX2xlMTYgc2lnbmF0dXJlOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgbGVnYWN5X21icjsKKworLyogRnVuY3Rpb25zICovCitleHRlcm4gaW50IGVmaV9wYXJ0aXRpb24oc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldik7CisKKyNlbmRpZgorCisvKgorICogT3ZlcnJpZGVzIGZvciBFbWFjcyBzbyB0aGF0IHdlIGZvbGxvdyBMaW51cydzIHRhYmJpbmcgc3R5bGUuCisgKiBFbWFjcyB3aWxsIG5vdGljZSB0aGlzIHN0dWZmIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGF1dG9tYXRpY2FsbHkKKyAqIGFkanVzdCB0aGUgc2V0dGluZ3MgZm9yIHRoaXMgYnVmZmVyIG9ubHkuICBUaGlzIG11c3QgcmVtYWluIGF0IHRoZSBlbmQKKyAqIG9mIHRoZSBmaWxlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIExvY2FsIHZhcmlhYmxlczoKKyAqIGMtaW5kZW50LWxldmVsOiA0IAorICogYy1icmFjZS1pbWFnaW5hcnktb2Zmc2V0OiAwCisgKiBjLWJyYWNlLW9mZnNldDogLTQKKyAqIGMtYXJnZGVjbC1pbmRlbnQ6IDQKKyAqIGMtbGFiZWwtb2Zmc2V0OiAtNAorICogYy1jb250aW51ZWQtc3RhdGVtZW50LW9mZnNldDogNAorICogYy1jb250aW51ZWQtYnJhY2Utb2Zmc2V0OiAwCisgKiBpbmRlbnQtdGFicy1tb2RlOiBuaWwKKyAqIHRhYi13aWR0aDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL2libS5jIGIvZnMvcGFydGl0aW9ucy9pYm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTlkY2JmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvcGFydGl0aW9ucy9pYm0uYwpAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIEZpbGUuLi4uLi4uLi4uLjogbGludXgvZnMvcGFydGl0aW9ucy9pYm0uYyAgICAgIAorICogQXV0aG9yKHMpLi4uLi4uOiBIb2xnZXIgU21vbGluc2tpIDxIb2xnZXIuU21vbGluc2tpQGRlLmlibS5jb20+CisgKiAgICAgICAgICAgICAgICAgIFZvbGtlciBTYW1lc2tlIDxzYW1lc2tlQGRlLmlibS5jb20+CisgKiBCdWdyZXBvcnRzLnRvLi46IDxMaW51eDM5MEBkZS5pYm0uY29tPgorICogKEMpIElCTSBDb3Jwb3JhdGlvbiwgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsIDE5OTksMjAwMAorCisgKiBIaXN0b3J5IG9mIGNoYW5nZXMgKHN0YXJ0cyBKdWx5IDIwMDApCisgKiAwNy8xMC8wMCBGaXhlZCBkZXRlY3Rpb24gb2YgQ01TIGZvcm1hdHRlZCBkaXNrcyAgICAgCisgKiAwMi8xMy8wMCBWVE9DIHBhcnRpdGlvbiBzdXBwb3J0IGFkZGVkCisgKiAxMi8yNy8wMSBmaXhlZCBQTDAzMDU5MyAoQ01TIHJlc2VydmVkIG1pbmlkaXNrIG5vdCBkZXRlY3RlZCBvbiA2NCBiaXQpCisgKiAwNy8yNC8wMyBubyBsb25nZXIgdXNpbmcgY29udGVudHMgb2YgZnJlZWQgcGFnZSBmb3IgQ01TIGxhYmVsIHJlY29nbml0aW9uIChCWjM2MTEpCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8YXNtL2Rhc2QuaD4KKyNpbmNsdWRlIDxhc20vZWJjZGljLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vdnRvYy5oPgorCisjaW5jbHVkZSAiY2hlY2suaCIKKyNpbmNsdWRlICJpYm0uaCIKKworLyoKKyAqIGNvbXB1dGUgdGhlIGJsb2NrIG51bWJlciBmcm9tIGEgCisgKiBjeWwtY3lsLWhlYWQtaGVhZCBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIGlubGluZSBpbnQKK2NjaGgyYmxrIChjY2hoX3QgKnB0ciwgc3RydWN0IGhkX2dlb21ldHJ5ICpnZW8pIHsKKyAgICAgICAgcmV0dXJuIHB0ci0+Y2MgKiBnZW8tPmhlYWRzICogZ2VvLT5zZWN0b3JzICsKKwkgICAgICAgcHRyLT5oaCAqIGdlby0+c2VjdG9yczsKK30KKworCisvKgorICogY29tcHV0ZSB0aGUgYmxvY2sgbnVtYmVyIGZyb20gYSAKKyAqIGN5bC1jeWwtaGVhZC1oZWFkLWJsb2NrIHN0cnVjdHVyZQorICovCitzdGF0aWMgaW5saW5lIGludAorY2NoaGIyYmxrIChjY2hoYl90ICpwdHIsIHN0cnVjdCBoZF9nZW9tZXRyeSAqZ2VvKSB7CisgICAgICAgIHJldHVybiBwdHItPmNjICogZ2VvLT5oZWFkcyAqIGdlby0+c2VjdG9ycyArCisJCXB0ci0+aGggKiBnZW8tPnNlY3RvcnMgKworCQlwdHItPmI7Cit9CisKKy8qCisgKi8KK2ludCAKK2libV9wYXJ0aXRpb24oc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKK3sKKwlpbnQgYmxvY2tzaXplLCBvZmZzZXQsIHNpemU7CisJZGFzZF9pbmZvcm1hdGlvbl90ICppbmZvOworCXN0cnVjdCBoZF9nZW9tZXRyeSAqZ2VvOworCWNoYXIgdHlwZVs1XSA9IHswLH07CisJY2hhciBuYW1lWzddID0gezAsfTsKKwl2b2x1bWVfbGFiZWxfdCAqdmxhYmVsOworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJU2VjdG9yIHNlY3Q7CisKKwlpZiAoKGluZm8gPSBrbWFsbG9jKHNpemVvZihkYXNkX2luZm9ybWF0aW9uX3QpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJZ290byBvdXRfbm9pbmZvOworCWlmICgoZ2VvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGhkX2dlb21ldHJ5KSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCWdvdG8gb3V0X25vZ2VvOworCWlmICgodmxhYmVsID0ga21hbGxvYyhzaXplb2Yodm9sdW1lX2xhYmVsX3QpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJZ290byBvdXRfbm92bGFiOworCQorCWlmIChpb2N0bF9ieV9iZGV2KGJkZXYsIEJJT0RBU0RJTkZPLCAodW5zaWduZWQgbG9uZylpbmZvKSAhPSAwIHx8CisJICAgIGlvY3RsX2J5X2JkZXYoYmRldiwgSERJT19HRVRHRU8sICh1bnNpZ25lZCBsb25nKWdlbykgIT0gMCkKKwkJZ290byBvdXRfbm9pb2N0bDsKKwkKKwlpZiAoKGJsb2Nrc2l6ZSA9IGJkZXZfaGFyZHNlY3Rfc2l6ZShiZGV2KSkgPD0gMCkKKwkJZ290byBvdXRfYmFkc2VjdDsKKworCS8qCisJICogR2V0IHZvbHVtZSBsYWJlbCwgZXh0cmFjdCBuYW1lIGFuZCB0eXBlLgorCSAqLworCWRhdGEgPSByZWFkX2Rldl9zZWN0b3IoYmRldiwgaW5mby0+bGFiZWxfYmxvY2sqKGJsb2Nrc2l6ZS81MTIpLCAmc2VjdCk7CisJaWYgKGRhdGEgPT0gTlVMTCkKKwkJZ290byBvdXRfcmVhZGVycjsKKworCXN0cm5jcHkgKHR5cGUsIGRhdGEsIDQpOworCWlmICgoIWluZm8tPkZCQV9sYXlvdXQpICYmICghc3RyY21wKGluZm8tPnR5cGUsICJFQ0tEIikpKQorCQlzdHJuY3B5KG5hbWUsIGRhdGEgKyA4LCA2KTsKKwllbHNlCisJCXN0cm5jcHkobmFtZSwgZGF0YSArIDQsIDYpOworCW1lbWNweSAodmxhYmVsLCBkYXRhLCBzaXplb2Yodm9sdW1lX2xhYmVsX3QpKTsKKwlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKworCUVCQ0FTQyh0eXBlLCA0KTsKKwlFQkNBU0MobmFtZSwgNik7CisKKwkvKgorCSAqIFRocmVlIGRpZmZlcmVudCB0eXBlczogQ01TMSwgVk9MMSBhbmQgTE5YMS91bmxhYmVsZWQKKwkgKi8KKwlpZiAoc3RybmNtcCh0eXBlLCAiQ01TMSIsIDQpID09IDApIHsKKwkJLyoKKwkJICogVk0gc3R5bGUgQ01TMSBsYWJlbGVkIGRpc2sKKwkJICovCisJCWludCAqbGFiZWwgPSAoaW50ICopIHZsYWJlbDsKKworCQlpZiAobGFiZWxbMTNdICE9IDApIHsKKwkJCXByaW50aygiQ01TMS8lOHMoTURTSyk6IiwgbmFtZSk7CisJCQkvKiBkaXNrIGlzIHJlc2VydmVkIG1pbmlkaXNrICovCisJCQlibG9ja3NpemUgPSBsYWJlbFszXTsKKwkJCW9mZnNldCA9IGxhYmVsWzEzXTsKKwkJCXNpemUgPSAobGFiZWxbN10gLSAxKSooYmxvY2tzaXplID4+IDkpOworCQl9IGVsc2UgeworCQkJcHJpbnRrKCJDTVMxLyU4czoiLCBuYW1lKTsKKwkJCW9mZnNldCA9IChpbmZvLT5sYWJlbF9ibG9jayArIDEpOworCQkJc2l6ZSA9IGJkZXYtPmJkX2lub2RlLT5pX3NpemUgPj4gOTsKKwkJfQorCQlwdXRfcGFydGl0aW9uKHN0YXRlLCAxLCBvZmZzZXQqKGJsb2Nrc2l6ZSA+PiA5KSwKKwkJCQkgc2l6ZS1vZmZzZXQqKGJsb2Nrc2l6ZSA+PiA5KSk7CisJfSBlbHNlIGlmICgoc3RybmNtcCh0eXBlLCAiVk9MMSIsIDQpID09IDApICYmCisJCSghaW5mby0+RkJBX2xheW91dCkgJiYgKCFzdHJjbXAoaW5mby0+dHlwZSwgIkVDS0QiKSkpIHsKKwkJLyoKKwkJICogTmV3IHN0eWxlIFZPTDEgbGFiZWxlZCBkaXNrCisJCSAqLworCQl1bnNpZ25lZCBpbnQgYmxrOworCQlpbnQgY291bnRlcjsKKworCQlwcmludGsoIlZPTDEvJThzOiIsIG5hbWUpOworCisJCS8qIGdldCBibG9jayBudW1iZXIgYW5kIHJlYWQgdGhlbiBnbyB0aHJvdWdoIGZvcm1hdDEgbGFiZWxzICovCisJCWJsayA9IGNjaGhiMmJsaygmdmxhYmVsLT52dG9jLCBnZW8pICsgMTsKKwkJY291bnRlciA9IDA7CisJCXdoaWxlICgoZGF0YSA9IHJlYWRfZGV2X3NlY3RvcihiZGV2LCBibGsqKGJsb2Nrc2l6ZS81MTIpLAorCQkJCQkgICAgICAgJnNlY3QpKSAhPSBOVUxMKSB7CisJCQlmb3JtYXQxX2xhYmVsX3QgZjE7CisKKwkJCW1lbWNweSgmZjEsIGRhdGEsIHNpemVvZihmb3JtYXQxX2xhYmVsX3QpKTsKKwkJCXB1dF9kZXZfc2VjdG9yKHNlY3QpOworCisJCQkvKiBza2lwIEZNVDQgLyBGTVQ1IC8gRk1UNyBsYWJlbHMgKi8KKwkJCWlmIChmMS5EUzFGTVRJRCA9PSBfYXNjZWJjWyc0J10KKwkJCSAgICB8fCBmMS5EUzFGTVRJRCA9PSBfYXNjZWJjWyc1J10KKwkJCSAgICB8fCBmMS5EUzFGTVRJRCA9PSBfYXNjZWJjWyc3J10pIHsKKwkJCSAgICAgICAgYmxrKys7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qIG9ubHkgRk1UMSB2YWxpZCBhdCB0aGlzIHBvaW50ICovCisJCQlpZiAoZjEuRFMxRk1USUQgIT0gX2FzY2ViY1snMSddKQorCQkJCWJyZWFrOworCisJCQkvKiBPSywgd2UgZ290IHZhbGlkIHBhcnRpdGlvbiBkYXRhICovCisJCSAgICAgICAgb2Zmc2V0ID0gY2NoaDJibGsoJmYxLkRTMUVYVDEubGxpbWl0LCBnZW8pOworCQkJc2l6ZSAgPSBjY2hoMmJsaygmZjEuRFMxRVhUMS51bGltaXQsIGdlbykgLSAKKwkJCQlvZmZzZXQgKyBnZW8tPnNlY3RvcnM7CisJCQlpZiAoY291bnRlciA+PSBzdGF0ZS0+bGltaXQpCisJCQkJYnJlYWs7CisJCQlwdXRfcGFydGl0aW9uKHN0YXRlLCBjb3VudGVyICsgMSwgCisJCQkJCSBvZmZzZXQgKiAoYmxvY2tzaXplID4+IDkpLAorCQkJCQkgc2l6ZSAqIChibG9ja3NpemUgPj4gOSkpOworCQkJY291bnRlcisrOworCQkJYmxrKys7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBPbGQgc3R5bGUgTE5YMSBvciB1bmxhYmVsZWQgZGlzaworCQkgKi8KKwkJaWYgKHN0cm5jbXAodHlwZSwgIkxOWDEiLCA0KSA9PSAwKQorCQkJcHJpbnRrICgiTE5YMS8lOHM6IiwgbmFtZSk7CisJCWVsc2UKKwkJCXByaW50aygiKG5vbmwpLyU4czoiLCBuYW1lKTsKKwkJb2Zmc2V0ID0gKGluZm8tPmxhYmVsX2Jsb2NrICsgMSk7CisJCXNpemUgPSAoYmRldi0+YmRfaW5vZGUtPmlfc2l6ZSA+PiA5KTsKKwkJcHV0X3BhcnRpdGlvbihzdGF0ZSwgMSwgb2Zmc2V0KihibG9ja3NpemUgPj4gOSksCisJCQkJIHNpemUtb2Zmc2V0KihibG9ja3NpemUgPj4gOSkpOworCX0KKworCXByaW50aygiXG4iKTsKKwlrZnJlZSh2bGFiZWwpOworCWtmcmVlKGdlbyk7CisJa2ZyZWUoaW5mbyk7CisJcmV0dXJuIDE7CisJCitvdXRfcmVhZGVycjoKK291dF9iYWRzZWN0Ogorb3V0X25vaW9jdGw6CisJa2ZyZWUodmxhYmVsKTsKK291dF9ub3ZsYWI6CisJa2ZyZWUoZ2VvKTsKK291dF9ub2dlbzoKKwlrZnJlZShpbmZvKTsKK291dF9ub2luZm86CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL2libS5oIGIvZnMvcGFydGl0aW9ucy9pYm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWY4NWE2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvcGFydGl0aW9ucy9pYm0uaApAQCAtMCwwICsxIEBACitpbnQgaWJtX3BhcnRpdGlvbihzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKiwgc3RydWN0IGJsb2NrX2RldmljZSAqKTsKZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvbGRtLmMgYi9mcy9wYXJ0aXRpb25zL2xkbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYjFjMTEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wYXJ0aXRpb25zL2xkbS5jCkBAIC0wLDAgKzEsMTQ4MyBAQAorLyoqCisgKiBsZG0gLSBTdXBwb3J0IGZvciBXaW5kb3dzIExvZ2ljYWwgRGlzayBNYW5hZ2VyIChEeW5hbWljIERpc2tzKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSwyMDAyIFJpY2hhcmQgUnVzc29uIDxsZG1AZmxhdGNhcC5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCBBbnRvbiBBbHRhcGFybWFrb3YKKyAqIENvcHlyaWdodCAoQykgMjAwMSwyMDAyIEpha29iIEtlbWkgPGpha29iLmtlbWlAdGVsaWEuY29tPgorICoKKyAqIERvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly9saW51eC1udGZzLnNmLm5ldC9sZG0KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisgKiB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKKyAqIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKKyAqIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtIChpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhlIHNvdXJjZSBpbiB0aGUgZmlsZSBDT1BZSU5HKTsgaWYKKyAqIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsCisgKiBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KKyNpbmNsdWRlICJsZG0uaCIKKyNpbmNsdWRlICJjaGVjay5oIgorI2luY2x1ZGUgIm1zZG9zLmgiCisKK3R5cGVkZWYgZW51bSB7CisJRkFMU0UgPSAwLAorCVRSVUUgID0gMQorfSBCT09MOworCisvKioKKyAqIGxkbV9kZWJ1Zy9pbmZvL2Vycm9yL2NyaXQgLSBPdXRwdXQgYW4gZXJyb3IgbWVzc2FnZQorICogQGY6ICAgIEEgcHJpbnRmIGZvcm1hdCBzdHJpbmcgY29udGFpbmluZyB0aGUgbWVzc2FnZQorICogQC4uLjogIFZhcmlhYmxlcyB0byBzdWJzdGl0dXRlIGludG8gQGYKKyAqCisgKiBsZG1fZGVidWcoKSB3cml0ZXMgYSBERUJVRyBsZXZlbCBtZXNzYWdlIHRvIHRoZSBzeXNsb2cgYnV0IG9ubHkgaWYgdGhlCisgKiBkcml2ZXIgd2FzIGNvbXBpbGVkIHdpdGggZGVidWcgZW5hYmxlZC4gT3RoZXJ3aXNlLCB0aGUgY2FsbCB0dXJucyBpbnRvIGEgTk9QLgorICovCisjaWZuZGVmIENPTkZJR19MRE1fREVCVUcKKyNkZWZpbmUgbGRtX2RlYnVnKC4uLikJZG8ge30gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBsZG1fZGVidWcoZiwgYS4uLikgX2xkbV9wcmludGsgKEtFUk5fREVCVUcsIF9fRlVOQ1RJT05fXywgZiwgIyNhKQorI2VuZGlmCisKKyNkZWZpbmUgbGRtX2NyaXQoZiwgYS4uLikgIF9sZG1fcHJpbnRrIChLRVJOX0NSSVQsICBfX0ZVTkNUSU9OX18sIGYsICMjYSkKKyNkZWZpbmUgbGRtX2Vycm9yKGYsIGEuLi4pIF9sZG1fcHJpbnRrIChLRVJOX0VSUiwgICBfX0ZVTkNUSU9OX18sIGYsICMjYSkKKyNkZWZpbmUgbGRtX2luZm8oZiwgYS4uLikgIF9sZG1fcHJpbnRrIChLRVJOX0lORk8sICBfX0ZVTkNUSU9OX18sIGYsICMjYSkKKworX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpCitzdGF0aWMgdm9pZCBfbGRtX3ByaW50ayAoY29uc3QgY2hhciAqbGV2ZWwsIGNvbnN0IGNoYXIgKmZ1bmN0aW9uLAorCQkJIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXN0YXRpYyBjaGFyIGJ1ZlsxMjhdOworCXZhX2xpc3QgYXJnczsKKworCXZhX3N0YXJ0IChhcmdzLCBmbXQpOworCXZzbnByaW50ZiAoYnVmLCBzaXplb2YgKGJ1ZiksIGZtdCwgYXJncyk7CisJdmFfZW5kIChhcmdzKTsKKworCXByaW50ayAoIiVzJXMoKTogJXNcbiIsIGxldmVsLCBmdW5jdGlvbiwgYnVmKTsKK30KKworCisvKioKKyAqIGxkbV9wYXJzZV9oZXhieXRlIC0gQ29udmVydCBhIEFTQ0lJIGhleCBudW1iZXIgdG8gYSBieXRlCisgKiBAc3JjOiAgUG9pbnRlciB0byBhdCBsZWFzdCAyIGNoYXJhY3RlcnMgdG8gY29udmVydC4KKyAqCisgKiBDb252ZXJ0IGEgdHdvIGNoYXJhY3RlciBBU0NJSSBoZXggc3RyaW5nIHRvIGEgbnVtYmVyLgorICoKKyAqIFJldHVybjogIDAtMjU1ICBTdWNjZXNzLCB0aGUgYnl0ZSB3YXMgcGFyc2VkIGNvcnJlY3RseQorICogICAgICAgICAgLTEgICAgIEVycm9yLCBhbiBpbnZhbGlkIGNoYXJhY3RlciB3YXMgc3VwcGxpZWQKKyAqLworc3RhdGljIGludCBsZG1fcGFyc2VfaGV4Ynl0ZSAoY29uc3QgdTggKnNyYykKK3sKKwl1bnNpZ25lZCBpbnQgeDsJCS8qIEZvciBjb3JyZWN0IHdyYXBwaW5nICovCisJaW50IGg7CisKKwkvKiBoaWdoIHBhcnQgKi8KKwlpZiAgICAgICgoeCA9IHNyY1swXSAtICcwJykgPD0gJzknLScwJykgaCA9IHg7CisJZWxzZSBpZiAoKHggPSBzcmNbMF0gLSAnYScpIDw9ICdmJy0nYScpIGggPSB4KzEwOworCWVsc2UgaWYgKCh4ID0gc3JjWzBdIC0gJ0EnKSA8PSAnRictJ0EnKSBoID0geCsxMDsKKwllbHNlIHJldHVybiAtMTsKKwloIDw8PSA0OworCisJLyogbG93IHBhcnQgKi8KKwlpZiAoKHggPSBzcmNbMV0gLSAnMCcpIDw9ICc5Jy0nMCcpIHJldHVybiBoIHwgeDsKKwlpZiAoKHggPSBzcmNbMV0gLSAnYScpIDw9ICdmJy0nYScpIHJldHVybiBoIHwgKHgrMTApOworCWlmICgoeCA9IHNyY1sxXSAtICdBJykgPD0gJ0YnLSdBJykgcmV0dXJuIGggfCAoeCsxMCk7CisJcmV0dXJuIC0xOworfQorCisvKioKKyAqIGxkbV9wYXJzZV9ndWlkIC0gQ29udmVydCBHVUlEIGZyb20gQVNDSUkgdG8gYmluYXJ5CisgKiBAc3JjOiAgIDM2IGNoYXIgc3RyaW5nIG9mIHRoZSBmb3JtIGZhNTBmZjJiLWYyZTgtNDVkZS04M2ZhLTY1NDE3ZjJmNDliYQorICogQGRlc3Q6ICBNZW1vcnkgYmxvY2sgdG8gaG9sZCBiaW5hcnkgR1VJRCAoMTYgYnl0ZXMpCisgKgorICogTi5CLiBUaGUgR1VJRCBuZWVkIG5vdCBiZSBOVUxMIHRlcm1pbmF0ZWQuCisgKgorICogUmV0dXJuOiAgVFJVRSAgIEBkZXN0IGNvbnRhaW5zIGJpbmFyeSBHVUlECisgKiAgICAgICAgICBGQUxTRSAgQGRlc3QgY29udGVudHMgYXJlIHVuZGVmaW5lZAorICovCitzdGF0aWMgQk9PTCBsZG1fcGFyc2VfZ3VpZCAoY29uc3QgdTggKnNyYywgdTggKmRlc3QpCit7CisJc3RhdGljIGNvbnN0IGludCBzaXplW10gPSB7IDQsIDIsIDIsIDIsIDYgfTsKKwlpbnQgaSwgaiwgdjsKKworCWlmIChzcmNbOF0gICE9ICctJyB8fCBzcmNbMTNdICE9ICctJyB8fAorCSAgICBzcmNbMThdICE9ICctJyB8fCBzcmNbMjNdICE9ICctJykKKwkJcmV0dXJuIEZBTFNFOworCisJZm9yIChqID0gMDsgaiA8IDU7IGorKywgc3JjKyspCisJCWZvciAoaSA9IDA7IGkgPCBzaXplW2pdOyBpKyssIHNyYys9MiwgKmRlc3QrKyA9IHYpCisJCQlpZiAoKHYgPSBsZG1fcGFyc2VfaGV4Ynl0ZSAoc3JjKSkgPCAwKQorCQkJCXJldHVybiBGQUxTRTsKKworCXJldHVybiBUUlVFOworfQorCisKKy8qKgorICogbGRtX3BhcnNlX3ByaXZoZWFkIC0gUmVhZCB0aGUgTERNIERhdGFiYXNlIFBSSVZIRUFEIHN0cnVjdHVyZQorICogQGRhdGE6ICBSYXcgZGF0YWJhc2UgUFJJVkhFQUQgc3RydWN0dXJlIGxvYWRlZCBmcm9tIHRoZSBkZXZpY2UKKyAqIEBwaDogICAgSW4tbWVtb3J5IHByaXZoZWFkIHN0cnVjdHVyZSBpbiB3aGljaCB0byByZXR1cm4gcGFyc2VkIGluZm9ybWF0aW9uCisgKgorICogVGhpcyBwYXJzZXMgdGhlIExETSBkYXRhYmFzZSBQUklWSEVBRCBzdHJ1Y3R1cmUgc3VwcGxpZWQgaW4gQGRhdGEgYW5kCisgKiBzZXRzIHVwIHRoZSBpbi1tZW1vcnkgcHJpdmhlYWQgc3RydWN0dXJlIEBwaCB3aXRoIHRoZSBvYnRhaW5lZCBpbmZvcm1hdGlvbi4KKyAqCisgKiBSZXR1cm46ICBUUlVFICAgQHBoIGNvbnRhaW5zIHRoZSBQUklWSEVBRCBkYXRhCisgKiAgICAgICAgICBGQUxTRSAgQHBoIGNvbnRlbnRzIGFyZSB1bmRlZmluZWQKKyAqLworc3RhdGljIEJPT0wgbGRtX3BhcnNlX3ByaXZoZWFkIChjb25zdCB1OCAqZGF0YSwgc3RydWN0IHByaXZoZWFkICpwaCkKK3sKKwlCVUdfT04gKCFkYXRhIHx8ICFwaCk7CisKKwlpZiAoTUFHSUNfUFJJVkhFQUQgIT0gQkU2NCAoZGF0YSkpIHsKKwkJbGRtX2Vycm9yICgiQ2Fubm90IGZpbmQgUFJJVkhFQUQgc3RydWN0dXJlLiBMRE0gZGF0YWJhc2UgaXMiCisJCQkiIGNvcnJ1cHQuIEFib3J0aW5nLiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJcGgtPnZlcl9tYWpvciAgICAgICAgICA9IEJFMTYgKGRhdGEgKyAweDAwMEMpOworCXBoLT52ZXJfbWlub3IgICAgICAgICAgPSBCRTE2IChkYXRhICsgMHgwMDBFKTsKKwlwaC0+bG9naWNhbF9kaXNrX3N0YXJ0ID0gQkU2NCAoZGF0YSArIDB4MDExQik7CisJcGgtPmxvZ2ljYWxfZGlza19zaXplICA9IEJFNjQgKGRhdGEgKyAweDAxMjMpOworCXBoLT5jb25maWdfc3RhcnQgICAgICAgPSBCRTY0IChkYXRhICsgMHgwMTJCKTsKKwlwaC0+Y29uZmlnX3NpemUgICAgICAgID0gQkU2NCAoZGF0YSArIDB4MDEzMyk7CisKKwlpZiAoKHBoLT52ZXJfbWFqb3IgIT0gMikgfHwgKHBoLT52ZXJfbWlub3IgIT0gMTEpKSB7CisJCWxkbV9lcnJvciAoIkV4cGVjdGVkIFBSSVZIRUFEIHZlcnNpb24gJWQuJWQsIGdvdCAlZC4lZC4iCisJCQkiIEFib3J0aW5nLiIsIDIsIDExLCBwaC0+dmVyX21ham9yLCBwaC0+dmVyX21pbm9yKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlpZiAocGgtPmNvbmZpZ19zaXplICE9IExETV9EQl9TSVpFKSB7CS8qIDEgTWlCIGluIHNlY3RvcnMuICovCisJCS8qIFdhcm4gdGhlIHVzZXIgYW5kIGNvbnRpbnVlLCBjYXJlZnVsbHkgKi8KKwkJbGRtX2luZm8gKCJEYXRhYmFzZSBpcyBub3JtYWxseSAldSBieXRlcywgaXQgY2xhaW1zIHRvICIKKwkJCSJiZSAlbGx1IGJ5dGVzLiIsIExETV9EQl9TSVpFLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylwaC0+Y29uZmlnX3NpemUgKTsKKwl9CisJaWYgKChwaC0+bG9naWNhbF9kaXNrX3NpemUgPT0gMCkgfHwKKwkgICAgKHBoLT5sb2dpY2FsX2Rpc2tfc3RhcnQgKyBwaC0+bG9naWNhbF9kaXNrX3NpemUgPiBwaC0+Y29uZmlnX3N0YXJ0KSkgeworCQlsZG1fZXJyb3IgKCJQUklWSEVBRCBkaXNrIHNpemUgZG9lc24ndCBtYXRjaCByZWFsIGRpc2sgc2l6ZSIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYgKCFsZG1fcGFyc2VfZ3VpZCAoZGF0YSArIDB4MDAzMCwgcGgtPmRpc2tfaWQpKSB7CisJCWxkbV9lcnJvciAoIlBSSVZIRUFEIGNvbnRhaW5zIGFuIGludmFsaWQgR1VJRC4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWxkbV9kZWJ1ZyAoIlBhcnNlZCBQUklWSEVBRCBzdWNjZXNzZnVsbHkuIik7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogbGRtX3BhcnNlX3RvY2Jsb2NrIC0gUmVhZCB0aGUgTERNIERhdGFiYXNlIFRPQ0JMT0NLIHN0cnVjdHVyZQorICogQGRhdGE6ICBSYXcgZGF0YWJhc2UgVE9DQkxPQ0sgc3RydWN0dXJlIGxvYWRlZCBmcm9tIHRoZSBkZXZpY2UKKyAqIEB0b2M6ICAgSW4tbWVtb3J5IHRvYyBzdHJ1Y3R1cmUgaW4gd2hpY2ggdG8gcmV0dXJuIHBhcnNlZCBpbmZvcm1hdGlvbgorICoKKyAqIFRoaXMgcGFyc2VzIHRoZSBMRE0gRGF0YWJhc2UgVE9DQkxPQ0sgKHRhYmxlIG9mIGNvbnRlbnRzKSBzdHJ1Y3R1cmUgc3VwcGxpZWQKKyAqIGluIEBkYXRhIGFuZCBzZXRzIHVwIHRoZSBpbi1tZW1vcnkgdG9jYmxvY2sgc3RydWN0dXJlIEB0b2Mgd2l0aCB0aGUgb2J0YWluZWQKKyAqIGluZm9ybWF0aW9uLgorICoKKyAqIE4uQi4gIFRoZSAqX3N0YXJ0IGFuZCAqX3NpemUgdmFsdWVzIHJldHVybmVkIGluIEB0b2MgYXJlIG5vdCByYW5nZS1jaGVja2VkLgorICoKKyAqIFJldHVybjogIFRSVUUgICBAdG9jIGNvbnRhaW5zIHRoZSBUT0NCTE9DSyBkYXRhCisgKiAgICAgICAgICBGQUxTRSAgQHRvYyBjb250ZW50cyBhcmUgdW5kZWZpbmVkCisgKi8KK3N0YXRpYyBCT09MIGxkbV9wYXJzZV90b2NibG9jayAoY29uc3QgdTggKmRhdGEsIHN0cnVjdCB0b2NibG9jayAqdG9jKQoreworCUJVR19PTiAoIWRhdGEgfHwgIXRvYyk7CisKKwlpZiAoTUFHSUNfVE9DQkxPQ0sgIT0gQkU2NCAoZGF0YSkpIHsKKwkJbGRtX2NyaXQgKCJDYW5ub3QgZmluZCBUT0NCTE9DSywgZGF0YWJhc2UgbWF5IGJlIGNvcnJ1cHQuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJc3RybmNweSAodG9jLT5iaXRtYXAxX25hbWUsIGRhdGEgKyAweDI0LCBzaXplb2YgKHRvYy0+Yml0bWFwMV9uYW1lKSk7CisJdG9jLT5iaXRtYXAxX25hbWVbc2l6ZW9mICh0b2MtPmJpdG1hcDFfbmFtZSkgLSAxXSA9IDA7CisJdG9jLT5iaXRtYXAxX3N0YXJ0ID0gQkU2NCAoZGF0YSArIDB4MkUpOworCXRvYy0+Yml0bWFwMV9zaXplICA9IEJFNjQgKGRhdGEgKyAweDM2KTsKKworCWlmIChzdHJuY21wICh0b2MtPmJpdG1hcDFfbmFtZSwgVE9DX0JJVE1BUDEsCisJCQlzaXplb2YgKHRvYy0+Yml0bWFwMV9uYW1lKSkgIT0gMCkgeworCQlsZG1fY3JpdCAoIlRPQ0JMT0NLJ3MgZmlyc3QgYml0bWFwIGlzICclcycsIHNob3VsZCBiZSAnJXMnLiIsCisJCQkJVE9DX0JJVE1BUDEsIHRvYy0+Yml0bWFwMV9uYW1lKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlzdHJuY3B5ICh0b2MtPmJpdG1hcDJfbmFtZSwgZGF0YSArIDB4NDYsIHNpemVvZiAodG9jLT5iaXRtYXAyX25hbWUpKTsKKwl0b2MtPmJpdG1hcDJfbmFtZVtzaXplb2YgKHRvYy0+Yml0bWFwMl9uYW1lKSAtIDFdID0gMDsKKwl0b2MtPmJpdG1hcDJfc3RhcnQgPSBCRTY0IChkYXRhICsgMHg1MCk7CisJdG9jLT5iaXRtYXAyX3NpemUgID0gQkU2NCAoZGF0YSArIDB4NTgpOworCWlmIChzdHJuY21wICh0b2MtPmJpdG1hcDJfbmFtZSwgVE9DX0JJVE1BUDIsCisJCQlzaXplb2YgKHRvYy0+Yml0bWFwMl9uYW1lKSkgIT0gMCkgeworCQlsZG1fY3JpdCAoIlRPQ0JMT0NLJ3Mgc2Vjb25kIGJpdG1hcCBpcyAnJXMnLCBzaG91bGQgYmUgJyVzJy4iLAorCQkJCVRPQ19CSVRNQVAyLCB0b2MtPmJpdG1hcDJfbmFtZSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJbGRtX2RlYnVnICgiUGFyc2VkIFRPQ0JMT0NLIHN1Y2Nlc3NmdWxseS4iKTsKKwlyZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBsZG1fcGFyc2Vfdm1kYiAtIFJlYWQgdGhlIExETSBEYXRhYmFzZSBWTURCIHN0cnVjdHVyZQorICogQGRhdGE6ICBSYXcgZGF0YWJhc2UgVk1EQiBzdHJ1Y3R1cmUgbG9hZGVkIGZyb20gdGhlIGRldmljZQorICogQHZtOiAgICBJbi1tZW1vcnkgdm1kYiBzdHJ1Y3R1cmUgaW4gd2hpY2ggdG8gcmV0dXJuIHBhcnNlZCBpbmZvcm1hdGlvbgorICoKKyAqIFRoaXMgcGFyc2VzIHRoZSBMRE0gRGF0YWJhc2UgVk1EQiBzdHJ1Y3R1cmUgc3VwcGxpZWQgaW4gQGRhdGEgYW5kIHNldHMgdXAKKyAqIHRoZSBpbi1tZW1vcnkgdm1kYiBzdHJ1Y3R1cmUgQHZtIHdpdGggdGhlIG9idGFpbmVkIGluZm9ybWF0aW9uLgorICoKKyAqIE4uQi4gIFRoZSAqX3N0YXJ0LCAqX3NpemUgYW5kICpfc2VxIHZhbHVlcyB3aWxsIGJlIHJhbmdlLWNoZWNrZWQgbGF0ZXIuCisgKgorICogUmV0dXJuOiAgVFJVRSAgIEB2bSBjb250YWlucyBWTURCIGluZm8KKyAqICAgICAgICAgIEZBTFNFICBAdm0gY29udGVudHMgYXJlIHVuZGVmaW5lZAorICovCitzdGF0aWMgQk9PTCBsZG1fcGFyc2Vfdm1kYiAoY29uc3QgdTggKmRhdGEsIHN0cnVjdCB2bWRiICp2bSkKK3sKKwlCVUdfT04gKCFkYXRhIHx8ICF2bSk7CisKKwlpZiAoTUFHSUNfVk1EQiAhPSBCRTMyIChkYXRhKSkgeworCQlsZG1fY3JpdCAoIkNhbm5vdCBmaW5kIHRoZSBWTURCLCBkYXRhYmFzZSBtYXkgYmUgY29ycnVwdC4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXZtLT52ZXJfbWFqb3IgPSBCRTE2IChkYXRhICsgMHgxMik7CisJdm0tPnZlcl9taW5vciA9IEJFMTYgKGRhdGEgKyAweDE0KTsKKwlpZiAoKHZtLT52ZXJfbWFqb3IgIT0gNCkgfHwgKHZtLT52ZXJfbWlub3IgIT0gMTApKSB7CisJCWxkbV9lcnJvciAoIkV4cGVjdGVkIFZNREIgdmVyc2lvbiAlZC4lZCwgZ290ICVkLiVkLiAiCisJCQkiQWJvcnRpbmcuIiwgNCwgMTAsIHZtLT52ZXJfbWFqb3IsIHZtLT52ZXJfbWlub3IpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJdm0tPnZibGtfc2l6ZSAgICAgPSBCRTMyIChkYXRhICsgMHgwOCk7CisJdm0tPnZibGtfb2Zmc2V0ICAgPSBCRTMyIChkYXRhICsgMHgwQyk7CisJdm0tPmxhc3RfdmJsa19zZXEgPSBCRTMyIChkYXRhICsgMHgwNCk7CisKKwlsZG1fZGVidWcgKCJQYXJzZWQgVk1EQiBzdWNjZXNzZnVsbHkuIik7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogbGRtX2NvbXBhcmVfcHJpdmhlYWRzIC0gQ29tcGFyZSB0d28gcHJpdmhlYWQgb2JqZWN0cworICogQHBoMTogIEZpcnN0IHByaXZoZWFkCisgKiBAcGgyOiAgU2Vjb25kIHByaXZoZWFkCisgKgorICogVGhpcyBjb21wYXJlcyB0aGUgdHdvIHByaXZoZWFkIHN0cnVjdHVyZXMgQHBoMSBhbmQgQHBoMi4KKyAqCisgKiBSZXR1cm46ICBUUlVFICAgSWRlbnRpY2FsCisgKiAgICAgICAgICBGQUxTRSAgRGlmZmVyZW50CisgKi8KK3N0YXRpYyBCT09MIGxkbV9jb21wYXJlX3ByaXZoZWFkcyAoY29uc3Qgc3RydWN0IHByaXZoZWFkICpwaDEsCisJCQkJICAgY29uc3Qgc3RydWN0IHByaXZoZWFkICpwaDIpCit7CisJQlVHX09OICghcGgxIHx8ICFwaDIpOworCisJcmV0dXJuICgocGgxLT52ZXJfbWFqb3IgICAgICAgICAgPT0gcGgyLT52ZXJfbWFqb3IpCQkmJgorCQkocGgxLT52ZXJfbWlub3IgICAgICAgICAgPT0gcGgyLT52ZXJfbWlub3IpCQkmJgorCQkocGgxLT5sb2dpY2FsX2Rpc2tfc3RhcnQgPT0gcGgyLT5sb2dpY2FsX2Rpc2tfc3RhcnQpCSYmCisJCShwaDEtPmxvZ2ljYWxfZGlza19zaXplICA9PSBwaDItPmxvZ2ljYWxfZGlza19zaXplKQkmJgorCQkocGgxLT5jb25maWdfc3RhcnQgICAgICAgPT0gcGgyLT5jb25maWdfc3RhcnQpCQkmJgorCQkocGgxLT5jb25maWdfc2l6ZSAgICAgICAgPT0gcGgyLT5jb25maWdfc2l6ZSkJCSYmCisJCSFtZW1jbXAgKHBoMS0+ZGlza19pZCwgcGgyLT5kaXNrX2lkLCBHVUlEX1NJWkUpKTsKK30KKworLyoqCisgKiBsZG1fY29tcGFyZV90b2NibG9ja3MgLSBDb21wYXJlIHR3byB0b2NibG9jayBvYmplY3RzCisgKiBAdG9jMTogIEZpcnN0IHRvYworICogQHRvYzI6ICBTZWNvbmQgdG9jCisgKgorICogVGhpcyBjb21wYXJlcyB0aGUgdHdvIHRvY2Jsb2NrIHN0cnVjdHVyZXMgQHRvYzEgYW5kIEB0b2MyLgorICoKKyAqIFJldHVybjogIFRSVUUgICBJZGVudGljYWwKKyAqICAgICAgICAgIEZBTFNFICBEaWZmZXJlbnQKKyAqLworc3RhdGljIEJPT0wgbGRtX2NvbXBhcmVfdG9jYmxvY2tzIChjb25zdCBzdHJ1Y3QgdG9jYmxvY2sgKnRvYzEsCisJCQkJICAgY29uc3Qgc3RydWN0IHRvY2Jsb2NrICp0b2MyKQoreworCUJVR19PTiAoIXRvYzEgfHwgIXRvYzIpOworCisJcmV0dXJuICgodG9jMS0+Yml0bWFwMV9zdGFydCA9PSB0b2MyLT5iaXRtYXAxX3N0YXJ0KQkmJgorCQkodG9jMS0+Yml0bWFwMV9zaXplICA9PSB0b2MyLT5iaXRtYXAxX3NpemUpCSYmCisJCSh0b2MxLT5iaXRtYXAyX3N0YXJ0ID09IHRvYzItPmJpdG1hcDJfc3RhcnQpCSYmCisJCSh0b2MxLT5iaXRtYXAyX3NpemUgID09IHRvYzItPmJpdG1hcDJfc2l6ZSkJJiYKKwkJIXN0cm5jbXAgKHRvYzEtPmJpdG1hcDFfbmFtZSwgdG9jMi0+Yml0bWFwMV9uYW1lLAorCQkJc2l6ZW9mICh0b2MxLT5iaXRtYXAxX25hbWUpKQkJJiYKKwkJIXN0cm5jbXAgKHRvYzEtPmJpdG1hcDJfbmFtZSwgdG9jMi0+Yml0bWFwMl9uYW1lLAorCQkJc2l6ZW9mICh0b2MxLT5iaXRtYXAyX25hbWUpKSk7Cit9CisKKy8qKgorICogbGRtX3ZhbGlkYXRlX3ByaXZoZWFkcyAtIENvbXBhcmUgdGhlIHByaW1hcnkgcHJpdmhlYWQgd2l0aCBpdHMgYmFja3VwcworICogQGJkZXY6ICBEZXZpY2UgaG9sZGluZyB0aGUgTERNIERhdGFiYXNlCisgKiBAcGgxOiAgIE1lbW9yeSBzdHJ1Y3QgdG8gZmlsbCB3aXRoIHBoIGNvbnRlbnRzCisgKgorICogUmVhZCBhbmQgY29tcGFyZSBhbGwgdGhyZWUgcHJpdmhlYWRzIGZyb20gZGlzay4KKyAqCisgKiBUaGUgcHJpdmhlYWRzIG9uIGRpc2sgc2hvdyB0aGUgc2l6ZSBhbmQgbG9jYXRpb24gb2YgdGhlIG1haW4gZGlzayBhcmVhIGFuZAorICogdGhlIGNvbmZpZ3VyYXRpb24gYXJlYSAodGhlIGRhdGFiYXNlKS4gIFRoZSB2YWx1ZXMgYXJlIHJhbmdlLWNoZWNrZWQgYWdhaW5zdAorICogQGhkLCB3aGljaCBjb250YWlucyB0aGUgcmVhbCBzaXplIG9mIHRoZSBkaXNrLgorICoKKyAqIFJldHVybjogIFRSVUUgICBTdWNjZXNzCisgKiAgICAgICAgICBGQUxTRSAgRXJyb3IKKyAqLworc3RhdGljIEJPT0wgbGRtX3ZhbGlkYXRlX3ByaXZoZWFkcyAoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJCQkgICAgc3RydWN0IHByaXZoZWFkICpwaDEpCit7CisJc3RhdGljIGNvbnN0IGludCBvZmZbM10gPSB7IE9GRl9QUklWMSwgT0ZGX1BSSVYyLCBPRkZfUFJJVjMgfTsKKwlzdHJ1Y3QgcHJpdmhlYWQgKnBoWzNdID0geyBwaDEgfTsKKwlTZWN0b3Igc2VjdDsKKwl1OCAqZGF0YTsKKwlCT09MIHJlc3VsdCA9IEZBTFNFOworCWxvbmcgbnVtX3NlY3RzOworCWludCBpOworCisJQlVHX09OICghYmRldiB8fCAhcGgxKTsKKworCXBoWzFdID0ga21hbGxvYyAoc2l6ZW9mICgqcGhbMV0pLCBHRlBfS0VSTkVMKTsKKwlwaFsyXSA9IGttYWxsb2MgKHNpemVvZiAoKnBoWzJdKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwaFsxXSB8fCAhcGhbMl0pIHsKKwkJbGRtX2NyaXQgKCJPdXQgb2YgbWVtb3J5LiIpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBvZmZbMSAmIDJdIGFyZSByZWxhdGl2ZSB0byBwaFswXS0+Y29uZmlnX3N0YXJ0ICovCisJcGhbMF0tPmNvbmZpZ19zdGFydCA9IDA7CisKKwkvKiBSZWFkIGFuZCBwYXJzZSBwcml2aGVhZHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCWRhdGEgPSByZWFkX2Rldl9zZWN0b3IgKGJkZXYsCisJCQlwaFswXS0+Y29uZmlnX3N0YXJ0ICsgb2ZmW2ldLCAmc2VjdCk7CisJCWlmICghZGF0YSkgeworCQkJbGRtX2NyaXQgKCJEaXNrIHJlYWQgZmFpbGVkLiIpOworCQkJZ290byBvdXQ7CisJCX0KKwkJcmVzdWx0ID0gbGRtX3BhcnNlX3ByaXZoZWFkIChkYXRhLCBwaFtpXSk7CisJCXB1dF9kZXZfc2VjdG9yIChzZWN0KTsKKwkJaWYgKCFyZXN1bHQpIHsKKwkJCWxkbV9lcnJvciAoIkNhbm5vdCBmaW5kIFBSSVZIRUFEICVkLiIsIGkrMSk7IC8qIExvZyBhZ2FpbiAqLworCQkJaWYgKGkgPCAyKQorCQkJCWdvdG8gb3V0OwkvKiBBbHJlYWR5IGxvZ2dlZCAqLworCQkJZWxzZQorCQkJCWJyZWFrOwkvKiBGSVhNRSBpZ25vcmUgZm9yIG5vdywgM3JkIFBIIGNhbiBmYWlsIG9uIG9kZC1zaXplZCBkaXNrcyAqLworCQl9CisJfQorCisJbnVtX3NlY3RzID0gYmRldi0+YmRfaW5vZGUtPmlfc2l6ZSA+PiA5OworCisJaWYgKChwaFswXS0+Y29uZmlnX3N0YXJ0ID4gbnVtX3NlY3RzKSB8fAorCSAgICgocGhbMF0tPmNvbmZpZ19zdGFydCArIHBoWzBdLT5jb25maWdfc2l6ZSkgPiBudW1fc2VjdHMpKSB7CisJCWxkbV9jcml0ICgiRGF0YWJhc2UgZXh0ZW5kcyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgZGlzay4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKChwaFswXS0+bG9naWNhbF9kaXNrX3N0YXJ0ID4gcGhbMF0tPmNvbmZpZ19zdGFydCkgfHwKKwkgICAoKHBoWzBdLT5sb2dpY2FsX2Rpc2tfc3RhcnQgKyBwaFswXS0+bG9naWNhbF9kaXNrX3NpemUpCisJCSAgICA+IHBoWzBdLT5jb25maWdfc3RhcnQpKSB7CisJCWxkbV9jcml0ICgiRGlzayBhbmQgZGF0YWJhc2Ugb3ZlcmxhcC4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCFsZG1fY29tcGFyZV9wcml2aGVhZHMgKHBoWzBdLCBwaFsxXSkpIHsKKwkJbGRtX2NyaXQgKCJQcmltYXJ5IGFuZCBiYWNrdXAgUFJJVkhFQURzIGRvbid0IG1hdGNoLiIpOworCQlnb3RvIG91dDsKKwl9CisJLyogRklYTUUgaWdub3JlIHRoaXMgZm9yIG5vdworCWlmICghbGRtX2NvbXBhcmVfcHJpdmhlYWRzIChwaFswXSwgcGhbMl0pKSB7CisJCWxkbV9jcml0ICgiUHJpbWFyeSBhbmQgYmFja3VwIFBSSVZIRUFEcyBkb24ndCBtYXRjaC4iKTsKKwkJZ290byBvdXQ7CisJfSovCisJbGRtX2RlYnVnICgiVmFsaWRhdGVkIFBSSVZIRUFEcyBzdWNjZXNzZnVsbHkuIik7CisJcmVzdWx0ID0gVFJVRTsKK291dDoKKwlrZnJlZSAocGhbMV0pOworCWtmcmVlIChwaFsyXSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBsZG1fdmFsaWRhdGVfdG9jYmxvY2tzIC0gVmFsaWRhdGUgdGhlIHRhYmxlIG9mIGNvbnRlbnRzIGFuZCBpdHMgYmFja3VwcworICogQGJkZXY6ICBEZXZpY2UgaG9sZGluZyB0aGUgTERNIERhdGFiYXNlCisgKiBAYmFzZTogIE9mZnNldCwgaW50byBAYmRldiwgb2YgdGhlIGRhdGFiYXNlCisgKiBAbGRiOiAgIENhY2hlIG9mIHRoZSBkYXRhYmFzZSBzdHJ1Y3R1cmVzCisgKgorICogRmluZCBhbmQgY29tcGFyZSB0aGUgZm91ciB0YWJsZXMgb2YgY29udGVudHMgb2YgdGhlIExETSBEYXRhYmFzZSBzdG9yZWQgb24KKyAqIEBiZGV2IGFuZCByZXR1cm4gdGhlIHBhcnNlZCBpbmZvcm1hdGlvbiBpbnRvIEB0b2MxLgorICoKKyAqIFRoZSBvZmZzZXRzIGFuZCBzaXplcyBvZiB0aGUgY29uZmlncyBhcmUgcmFuZ2UtY2hlY2tlZCBhZ2FpbnN0IGEgcHJpdmhlYWQuCisgKgorICogUmV0dXJuOiAgVFJVRSAgIEB0b2MxIGNvbnRhaW5zIHZhbGlkYXRlZCBUT0NCTE9DSyBpbmZvCisgKiAgICAgICAgICBGQUxTRSAgQHRvYzEgY29udGVudHMgYXJlIHVuZGVmaW5lZAorICovCitzdGF0aWMgQk9PTCBsZG1fdmFsaWRhdGVfdG9jYmxvY2tzIChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCXVuc2lnbmVkIGxvbmcgYmFzZSwgc3RydWN0IGxkbWRiICpsZGIpCit7CisJc3RhdGljIGNvbnN0IGludCBvZmZbNF0gPSB7IE9GRl9UT0NCMSwgT0ZGX1RPQ0IyLCBPRkZfVE9DQjMsIE9GRl9UT0NCNH07CisJc3RydWN0IHRvY2Jsb2NrICp0Yls0XTsKKwlzdHJ1Y3QgcHJpdmhlYWQgKnBoOworCVNlY3RvciBzZWN0OworCXU4ICpkYXRhOworCUJPT0wgcmVzdWx0ID0gRkFMU0U7CisJaW50IGk7CisKKwlCVUdfT04gKCFiZGV2IHx8ICFsZGIpOworCisJcGggICAgPSAmbGRiLT5waDsKKwl0YlswXSA9ICZsZGItPnRvYzsKKwl0YlsxXSA9IGttYWxsb2MgKHNpemVvZiAoKnRiWzFdKSwgR0ZQX0tFUk5FTCk7CisJdGJbMl0gPSBrbWFsbG9jIChzaXplb2YgKCp0YlsyXSksIEdGUF9LRVJORUwpOworCXRiWzNdID0ga21hbGxvYyAoc2l6ZW9mICgqdGJbM10pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRiWzFdIHx8ICF0YlsyXSB8fCAhdGJbM10pIHsKKwkJbGRtX2NyaXQgKCJPdXQgb2YgbWVtb3J5LiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQkJLyogUmVhZCBhbmQgcGFyc2UgYWxsIGZvdXIgdG9jJ3MuICovCisJeworCQlkYXRhID0gcmVhZF9kZXZfc2VjdG9yIChiZGV2LCBiYXNlICsgb2ZmW2ldLCAmc2VjdCk7CisJCWlmICghZGF0YSkgeworCQkJbGRtX2NyaXQgKCJEaXNrIHJlYWQgZmFpbGVkLiIpOworCQkJZ290byBvdXQ7CisJCX0KKwkJcmVzdWx0ID0gbGRtX3BhcnNlX3RvY2Jsb2NrIChkYXRhLCB0YltpXSk7CisJCXB1dF9kZXZfc2VjdG9yIChzZWN0KTsKKwkJaWYgKCFyZXN1bHQpCisJCQlnb3RvIG91dDsJLyogQWxyZWFkeSBsb2dnZWQgKi8KKwl9CisKKwkvKiBSYW5nZSBjaGVjayB0aGUgdG9jIGFnYWluc3QgYSBwcml2aGVhZC4gKi8KKwlpZiAoKCh0YlswXS0+Yml0bWFwMV9zdGFydCArIHRiWzBdLT5iaXRtYXAxX3NpemUpID4gcGgtPmNvbmZpZ19zaXplKSB8fAorCSAgICAoKHRiWzBdLT5iaXRtYXAyX3N0YXJ0ICsgdGJbMF0tPmJpdG1hcDJfc2l6ZSkgPiBwaC0+Y29uZmlnX3NpemUpKSB7CisJCWxkbV9jcml0ICgiVGhlIGJpdG1hcHMgYXJlIG91dCBvZiByYW5nZS4gIEdpdmluZyB1cC4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCFsZG1fY29tcGFyZV90b2NibG9ja3MgKHRiWzBdLCB0YlsxXSkgfHwJLyogQ29tcGFyZSBhbGwgdG9jcy4gKi8KKwkgICAgIWxkbV9jb21wYXJlX3RvY2Jsb2NrcyAodGJbMF0sIHRiWzJdKSB8fAorCSAgICAhbGRtX2NvbXBhcmVfdG9jYmxvY2tzICh0YlswXSwgdGJbM10pKSB7CisJCWxkbV9jcml0ICgiVGhlIFRPQ0JMT0NLcyBkb24ndCBtYXRjaC4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJbGRtX2RlYnVnICgiVmFsaWRhdGVkIFRPQ0JMT0NLcyBzdWNjZXNzZnVsbHkuIik7CisJcmVzdWx0ID0gVFJVRTsKK291dDoKKwlrZnJlZSAodGJbMV0pOworCWtmcmVlICh0YlsyXSk7CisJa2ZyZWUgKHRiWzNdKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIGxkbV92YWxpZGF0ZV92bWRiIC0gUmVhZCB0aGUgVk1EQiBhbmQgdmFsaWRhdGUgaXQKKyAqIEBiZGV2OiAgRGV2aWNlIGhvbGRpbmcgdGhlIExETSBEYXRhYmFzZQorICogQGJhc2U6ICBPZmZzZXQsIGludG8gQGJkZXYsIG9mIHRoZSBkYXRhYmFzZQorICogQGxkYjogICBDYWNoZSBvZiB0aGUgZGF0YWJhc2Ugc3RydWN0dXJlcworICoKKyAqIEZpbmQgdGhlIHZtZGIgb2YgdGhlIExETSBEYXRhYmFzZSBzdG9yZWQgb24gQGJkZXYgYW5kIHJldHVybiB0aGUgcGFyc2VkCisgKiBpbmZvcm1hdGlvbiBpbiBAbGRiLgorICoKKyAqIFJldHVybjogIFRSVUUgICBAbGRiIGNvbnRhaW5zIHZhbGlkYXRlZCBWQkRCIGluZm8KKyAqICAgICAgICAgIEZBTFNFICBAbGRiIGNvbnRlbnRzIGFyZSB1bmRlZmluZWQKKyAqLworc3RhdGljIEJPT0wgbGRtX3ZhbGlkYXRlX3ZtZGIgKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHVuc2lnbmVkIGxvbmcgYmFzZSwKKwkJCSAgICAgICBzdHJ1Y3QgbGRtZGIgKmxkYikKK3sKKwlTZWN0b3Igc2VjdDsKKwl1OCAqZGF0YTsKKwlCT09MIHJlc3VsdCA9IEZBTFNFOworCXN0cnVjdCB2bWRiICp2bTsKKwlzdHJ1Y3QgdG9jYmxvY2sgKnRvYzsKKworCUJVR19PTiAoIWJkZXYgfHwgIWxkYik7CisKKwl2bSAgPSAmbGRiLT52bTsKKwl0b2MgPSAmbGRiLT50b2M7CisKKwlkYXRhID0gcmVhZF9kZXZfc2VjdG9yIChiZGV2LCBiYXNlICsgT0ZGX1ZNREIsICZzZWN0KTsKKwlpZiAoIWRhdGEpIHsKKwkJbGRtX2NyaXQgKCJEaXNrIHJlYWQgZmFpbGVkLiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYgKCFsZG1fcGFyc2Vfdm1kYiAoZGF0YSwgdm0pKQorCQlnb3RvIG91dDsJCQkJLyogQWxyZWFkeSBsb2dnZWQgKi8KKworCS8qIEFyZSB0aGVyZSB1bmNvbW1pdHRlZCB0cmFuc2FjdGlvbnM/ICovCisJaWYgKEJFMTYoZGF0YSArIDB4MTApICE9IDB4MDEpIHsKKwkJbGRtX2NyaXQgKCJEYXRhYmFzZSBpcyBub3QgaW4gYSBjb25zaXN0ZW50IHN0YXRlLiAgQWJvcnRpbmcuIik7CisJCWdvdG8gb3V0OworCX0KKworCWlmICh2bS0+dmJsa19vZmZzZXQgIT0gNTEyKQorCQlsZG1faW5mbyAoIlZCTEtzIHN0YXJ0IGF0IG9mZnNldCAweCUwNHguIiwgdm0tPnZibGtfb2Zmc2V0KTsKKworCS8qCisJICogVGhlIGxhc3RfdmJsa2Rfc2VxIGNhbiBiZSBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgdm1kYiwganVzdCBtYWtlIHN1cmUKKwkgKiBpdCBpcyBub3Qgb3V0IG9mIGJvdW5kcy4KKwkgKi8KKwlpZiAoKHZtLT52YmxrX3NpemUgKiB2bS0+bGFzdF92YmxrX3NlcSkgPiAodG9jLT5iaXRtYXAxX3NpemUgPDwgOSkpIHsKKwkJbGRtX2NyaXQgKCJWTURCIGV4Y2VlZHMgYWxsb3dlZCBzaXplIHNwZWNpZmllZCBieSBUT0NCTE9DSy4gICIKKwkJCQkiRGF0YWJhc2UgaXMgY29ycnVwdC4gIEFib3J0aW5nLiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXN1bHQgPSBUUlVFOworb3V0OgorCXB1dF9kZXZfc2VjdG9yIChzZWN0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qKgorICogbGRtX3ZhbGlkYXRlX3BhcnRpdGlvbl90YWJsZSAtIERldGVybWluZSB3aGV0aGVyIGJkZXYgbWlnaHQgYmUgYSBkeW5hbWljIGRpc2sKKyAqIEBiZGV2OiAgRGV2aWNlIGhvbGRpbmcgdGhlIExETSBEYXRhYmFzZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSB3ZWFrIHRlc3QgdG8gZGVjaWRlIHdoZXRoZXIgdGhlIGRldmljZSBpcyBhIGR5bmFtaWMKKyAqIGRpc2sgb3Igbm90LiAgSXQgbG9va3MgZm9yIGFuIE1TLURPUy1zdHlsZSBwYXJ0aXRpb24gdGFibGUgY29udGFpbmluZyBhdAorICogbGVhc3Qgb25lIHBhcnRpdGlvbiBvZiB0eXBlIDB4NDIgKGZvcm1lcmx5IFNGUywgbm93IHVzZWQgYnkgV2luZG93cyBmb3IKKyAqIGR5bmFtaWMgZGlza3MpLgorICoKKyAqIE4uQi4gIFRoZSBvbmx5IHBvc3NpYmxlIGVycm9yIGNhbiBjb21lIGZyb20gdGhlIHJlYWRfZGV2X3NlY3RvciBhbmQgdGhhdCBpcworICogICAgICAgb25seSBsaWtlbHkgdG8gaGFwcGVuIGlmIHRoZSB1bmRlcmx5aW5nIGRldmljZSBpcyBzdHJhbmdlLiAgSWYgdGhhdCBJUworICogICAgICAgdGhlIGNhc2Ugd2Ugc2hvdWxkIHJldHVybiB6ZXJvIHRvIGxldCBzb21lb25lIGVsc2UgdHJ5LgorICoKKyAqIFJldHVybjogIFRSVUUgICBAYmRldiBpcyBhIGR5bmFtaWMgZGlzaworICogICAgICAgICAgRkFMU0UgIEBiZGV2IGlzIG5vdCBhIGR5bmFtaWMgZGlzaywgb3IgYW4gZXJyb3Igb2NjdXJyZWQKKyAqLworc3RhdGljIEJPT0wgbGRtX3ZhbGlkYXRlX3BhcnRpdGlvbl90YWJsZSAoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKK3sKKwlTZWN0b3Igc2VjdDsKKwl1OCAqZGF0YTsKKwlzdHJ1Y3QgcGFydGl0aW9uICpwOworCWludCBpOworCUJPT0wgcmVzdWx0ID0gRkFMU0U7CisKKwlCVUdfT04gKCFiZGV2KTsKKworCWRhdGEgPSByZWFkX2Rldl9zZWN0b3IgKGJkZXYsIDAsICZzZWN0KTsKKwlpZiAoIWRhdGEpIHsKKwkJbGRtX2NyaXQgKCJEaXNrIHJlYWQgZmFpbGVkLiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYgKCooX19sZTE2KikgKGRhdGEgKyAweDAxRkUpICE9IGNwdV90b19sZTE2IChNU0RPU19MQUJFTF9NQUdJQykpCisJCWdvdG8gb3V0OworCisJcCA9IChzdHJ1Y3QgcGFydGl0aW9uKikoZGF0YSArIDB4MDFCRSk7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKywgcCsrKQorCQlpZiAoU1lTX0lORCAocCkgPT0gV0lOMktfRFlOQU1JQ19QQVJUSVRJT04pIHsKKwkJCXJlc3VsdCA9IFRSVUU7CisJCQlicmVhazsKKwkJfQorCisJaWYgKHJlc3VsdCkKKwkJbGRtX2RlYnVnICgiRm91bmQgVzJLIGR5bmFtaWMgZGlzayBwYXJ0aXRpb24gdHlwZS4iKTsKKworb3V0OgorCXB1dF9kZXZfc2VjdG9yIChzZWN0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIGxkbV9nZXRfZGlza19vYmppZCAtIFNlYXJjaCBhIGxpbmtlZCBsaXN0IG9mIHZibGsncyBmb3IgYSBnaXZlbiBEaXNrIElkCisgKiBAbGRiOiAgQ2FjaGUgb2YgdGhlIGRhdGFiYXNlIHN0cnVjdHVyZXMKKyAqCisgKiBUaGUgTERNIERhdGFiYXNlIGNvbnRhaW5zIGEgbGlzdCBvZiBhbGwgcGFydGl0aW9ucyBvbiBhbGwgZHluYW1pYyBkaXNrcy4KKyAqIFRoZSBwcmltYXJ5IFBSSVZIRUFELCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwaHlzaWNhbCBkaXNrLCB0ZWxscyB1cworICogdGhlIEdVSUQgb2YgdGhpcyBkaXNrLiAgVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgdGhlIEdVSUQgaW4gYSBsaW5rZWQKKyAqIGxpc3Qgb2YgdmJsaydzLgorICoKKyAqIFJldHVybjogIFBvaW50ZXIsIEEgbWF0Y2hpbmcgdmJsayB3YXMgZm91bmQKKyAqICAgICAgICAgIE5VTEwsICAgIE5vIG1hdGNoLCBvciBhbiBlcnJvcgorICovCitzdGF0aWMgc3RydWN0IHZibGsgKiBsZG1fZ2V0X2Rpc2tfb2JqaWQgKGNvbnN0IHN0cnVjdCBsZG1kYiAqbGRiKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKml0ZW07CisKKwlCVUdfT04gKCFsZGIpOworCisJbGlzdF9mb3JfZWFjaCAoaXRlbSwgJmxkYi0+dl9kaXNrKSB7CisJCXN0cnVjdCB2YmxrICp2ID0gbGlzdF9lbnRyeSAoaXRlbSwgc3RydWN0IHZibGssIGxpc3QpOworCQlpZiAoIW1lbWNtcCAodi0+dmJsay5kaXNrLmRpc2tfaWQsIGxkYi0+cGguZGlza19pZCwgR1VJRF9TSVpFKSkKKwkJCXJldHVybiB2OworCX0KKworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIGxkbV9jcmVhdGVfZGF0YV9wYXJ0aXRpb25zIC0gQ3JlYXRlIGRhdGEgcGFydGl0aW9ucyBmb3IgdGhpcyBkZXZpY2UKKyAqIEBwcDogICBMaXN0IG9mIHRoZSBwYXJ0aXRpb25zIHBhcnNlZCBzbyBmYXIKKyAqIEBsZGI6ICBDYWNoZSBvZiB0aGUgZGF0YWJhc2Ugc3RydWN0dXJlcworICoKKyAqIFRoZSBkYXRhYmFzZSBjb250YWlucyBBTEwgdGhlIHBhcnRpdGlvbnMgZm9yIEFMTCBkaXNrIGdyb3Vwcywgc28gd2UgbmVlZCB0bworICogZmlsdGVyIG91dCB0aGlzIHNwZWNpZmljIGRpc2suIFVzaW5nIHRoZSBkaXNrJ3Mgb2JqZWN0IGlkLCB3ZSBjYW4gZmluZCBhbGwKKyAqIHRoZSBwYXJ0aXRpb25zIGluIHRoZSBkYXRhYmFzZSB0aGF0IGJlbG9uZyB0byB0aGlzIGRpc2suCisgKgorICogQWRkIGVhY2ggcGFydGl0aW9uIGluIG91ciBkYXRhYmFzZSwgdG8gdGhlIHBhcnNlZF9wYXJ0aXRpb25zIHN0cnVjdHVyZS4KKyAqCisgKiBOLkIuICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgdGhlIHBhcnRpdGlvbnMgaW4gdGhlIG9yZGVyIGl0IGZpbmRzIHBhcnRpdGlvbgorICogICAgICAgb2JqZWN0cyBpbiB0aGUgbGlua2VkIGxpc3QuCisgKgorICogUmV0dXJuOiAgVFJVRSAgIFBhcnRpdGlvbiBjcmVhdGVkCisgKiAgICAgICAgICBGQUxTRSAgRXJyb3IsIHByb2JhYmx5IGEgcmFuZ2UgY2hlY2tpbmcgcHJvYmxlbQorICovCitzdGF0aWMgQk9PTCBsZG1fY3JlYXRlX2RhdGFfcGFydGl0aW9ucyAoc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpwcCwKKwkJCQkJY29uc3Qgc3RydWN0IGxkbWRiICpsZGIpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqaXRlbTsKKwlzdHJ1Y3QgdmJsayAqdmI7CisJc3RydWN0IHZibGsgKmRpc2s7CisJc3RydWN0IHZibGtfcGFydCAqcGFydDsKKwlpbnQgcGFydF9udW0gPSAxOworCisJQlVHX09OICghcHAgfHwgIWxkYik7CisKKwlkaXNrID0gbGRtX2dldF9kaXNrX29iamlkIChsZGIpOworCWlmICghZGlzaykgeworCQlsZG1fY3JpdCAoIkNhbid0IGZpbmQgdGhlIElEIG9mIHRoaXMgZGlzayBpbiB0aGUgZGF0YWJhc2UuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlwcmludGsgKCIgW0xETV0iKTsKKworCS8qIENyZWF0ZSB0aGUgZGF0YSBwYXJ0aXRpb25zICovCisJbGlzdF9mb3JfZWFjaCAoaXRlbSwgJmxkYi0+dl9wYXJ0KSB7CisJCXZiID0gbGlzdF9lbnRyeSAoaXRlbSwgc3RydWN0IHZibGssIGxpc3QpOworCQlwYXJ0ID0gJnZiLT52YmxrLnBhcnQ7CisKKwkJaWYgKHBhcnQtPmRpc2tfaWQgIT0gZGlzay0+b2JqX2lkKQorCQkJY29udGludWU7CisKKwkJcHV0X3BhcnRpdGlvbiAocHAsIHBhcnRfbnVtLCBsZGItPnBoLmxvZ2ljYWxfZGlza19zdGFydCArCisJCQkJcGFydC0+c3RhcnQsIHBhcnQtPnNpemUpOworCQlwYXJ0X251bSsrOworCX0KKworCXByaW50ayAoIlxuIik7CisJcmV0dXJuIFRSVUU7Cit9CisKKworLyoqCisgKiBsZG1fcmVsYXRpdmUgLSBDYWxjdWxhdGUgdGhlIG5leHQgcmVsYXRpdmUgb2Zmc2V0CisgKiBAYnVmZmVyOiAgQmxvY2sgb2YgZGF0YSBiZWluZyB3b3JrZWQgb24KKyAqIEBidWZsZW46ICBTaXplIG9mIHRoZSBibG9jayBvZiBkYXRhCisgKiBAYmFzZTogICAgU2l6ZSBvZiB0aGUgcHJldmlvdXMgZml4ZWQgd2lkdGggZmllbGRzCisgKiBAb2Zmc2V0OiAgQ3VtdWxhdGl2ZSBzaXplIG9mIHRoZSBwcmV2aW91cyB2YXJpYWJsZS13aWR0aCBmaWVsZHMKKyAqCisgKiBCZWNhdXNlIG1hbnkgb2YgdGhlIFZCTEsgZmllbGRzIGFyZSB2YXJpYWJsZS13aWR0aCwgaXQncyBuZWNlc3NhcnkKKyAqIHRvIGNhbGN1bGF0ZSBlYWNoIG9mZnNldCBiYXNlZCBvbiB0aGUgcHJldmlvdXMgb25lIGFuZCB0aGUgbGVuZ3RoCisgKiBvZiB0aGUgZmllbGQgaXQgcG9pbnRlZCB0by4KKyAqCisgKiBSZXR1cm46ICAtMSBFcnJvciwgdGhlIGNhbGN1bGF0ZWQgb2Zmc2V0IGV4Y2VlZGVkIHRoZSBzaXplIG9mIHRoZSBidWZmZXIKKyAqICAgICAgICAgICBuIE9LLCBhIHJhbmdlLWNoZWNrZWQgb2Zmc2V0IGludG8gYnVmZmVyCisgKi8KK3N0YXRpYyBpbnQgbGRtX3JlbGF0aXZlIChjb25zdCB1OCAqYnVmZmVyLCBpbnQgYnVmbGVuLCBpbnQgYmFzZSwgaW50IG9mZnNldCkKK3sKKworCWJhc2UgKz0gb2Zmc2V0OworCWlmICgoIWJ1ZmZlcikgfHwgKG9mZnNldCA8IDApIHx8IChiYXNlID4gYnVmbGVuKSkKKwkJcmV0dXJuIC0xOworCWlmICgoYmFzZSArIGJ1ZmZlcltiYXNlXSkgPj0gYnVmbGVuKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gYnVmZmVyW2Jhc2VdICsgb2Zmc2V0ICsgMTsKK30KKworLyoqCisgKiBsZG1fZ2V0X3ZudW0gLSBDb252ZXJ0IGEgdmFyaWFibGUtd2lkdGgsIGJpZyBlbmRpYW4gbnVtYmVyLCBpbnRvIGNwdSBvcmRlcgorICogQGJsb2NrOiAgUG9pbnRlciB0byB0aGUgdmFyaWFibGUtd2lkdGggbnVtYmVyIHRvIGNvbnZlcnQKKyAqCisgKiBMYXJnZSBudW1iZXJzIGluIHRoZSBMRE0gRGF0YWJhc2UgYXJlIG9mdGVuIHN0b3JlZCBpbiBhIHBhY2tlZCBmb3JtYXQuICBFYWNoCisgKiBudW1iZXIgaXMgcHJlZml4ZWQgYnkgYSBvbmUgYnl0ZSB3aWR0aCBtYXJrZXIuICBBbGwgbnVtYmVycyBpbiB0aGUgZGF0YWJhc2UKKyAqIGFyZSBzdG9yZWQgaW4gYmlnLWVuZGlhbiBieXRlIG9yZGVyLiAgVGhpcyBmdW5jdGlvbiByZWFkcyBvbmUgb2YgdGhlc2UKKyAqIG51bWJlcnMgYW5kIHJldHVybnMgdGhlIHJlc3VsdAorICoKKyAqIE4uQi4gIFRoaXMgZnVuY3Rpb24gRE9FUyBOT1QgcGVyZm9ybSBhbnkgcmFuZ2UgY2hlY2tpbmcsIHRob3VnaCB0aGUgbW9zdAorICogICAgICAgaXQgd2lsbCByZWFkIGlzIGVpZ2h0IGJ5dGVzLgorICoKKyAqIFJldHVybjogIG4gQSBudW1iZXIKKyAqICAgICAgICAgIDAgWmVybywgb3IgYW4gZXJyb3Igb2NjdXJyZWQKKyAqLworc3RhdGljIHU2NCBsZG1fZ2V0X3ZudW0gKGNvbnN0IHU4ICpibG9jaykKK3sKKwl1NjQgdG1wID0gMDsKKwl1OCBsZW5ndGg7CisKKwlCVUdfT04gKCFibG9jayk7CisKKwlsZW5ndGggPSAqYmxvY2srKzsKKworCWlmIChsZW5ndGggJiYgbGVuZ3RoIDw9IDgpCisJCXdoaWxlIChsZW5ndGgtLSkKKwkJCXRtcCA9ICh0bXAgPDwgOCkgfCAqYmxvY2srKzsKKwllbHNlCisJCWxkbV9lcnJvciAoIklsbGVnYWwgbGVuZ3RoICVkLiIsIGxlbmd0aCk7CisKKwlyZXR1cm4gdG1wOworfQorCisvKioKKyAqIGxkbV9nZXRfdnN0ciAtIFJlYWQgYSBsZW5ndGgtcHJlZml4ZWQgc3RyaW5nIGludG8gYSBidWZmZXIKKyAqIEBibG9jazogICBQb2ludGVyIHRvIHRoZSBsZW5ndGggbWFya2VyCisgKiBAYnVmZmVyOiAgTG9jYXRpb24gdG8gY29weSBzdHJpbmcgdG8KKyAqIEBidWZsZW46ICBTaXplIG9mIHRoZSBvdXRwdXQgYnVmZmVyCisgKgorICogTWFueSBvZiB0aGUgc3RyaW5ncyBpbiB0aGUgTERNIERhdGFiYXNlIGFyZSBub3QgTlVMTCB0ZXJtaW5hdGVkLiAgSW5zdGVhZAorICogdGhleSBhcmUgcHJlZml4ZWQgYnkgYSBvbmUgYnl0ZSBsZW5ndGggbWFya2VyLiAgVGhpcyBmdW5jdGlvbiBjb3BpZXMgb25lIG9mCisgKiB0aGVzZSBzdHJpbmdzIGludG8gYSBidWZmZXIuCisgKgorICogTi5CLiAgVGhpcyBmdW5jdGlvbiBET0VTIE5PVCBwZXJmb3JtIGFueSByYW5nZSBjaGVja2luZyBvbiB0aGUgaW5wdXQuCisgKiAgICAgICBJZiB0aGUgYnVmZmVyIGlzIHRvbyBzbWFsbCwgdGhlIG91dHB1dCB3aWxsIGJlIHRydW5jYXRlZC4KKyAqCisgKiBSZXR1cm46ICAwLCBFcnJvciBhbmQgQGJ1ZmZlciBjb250ZW50cyBhcmUgdW5kZWZpbmVkCisgKiAgICAgICAgICBuLCBTdHJpbmcgbGVuZ3RoIGluIGNoYXJhY3RlcnMgKGV4Y2x1ZGluZyBOVUxMKQorICogICAgICAgICAgYnVmbGVuLTEsIFN0cmluZyB3YXMgdHJ1bmNhdGVkLgorICovCitzdGF0aWMgaW50IGxkbV9nZXRfdnN0ciAoY29uc3QgdTggKmJsb2NrLCB1OCAqYnVmZmVyLCBpbnQgYnVmbGVuKQoreworCWludCBsZW5ndGg7CisKKwlCVUdfT04gKCFibG9jayB8fCAhYnVmZmVyKTsKKworCWxlbmd0aCA9IGJsb2NrWzBdOworCWlmIChsZW5ndGggPj0gYnVmbGVuKSB7CisJCWxkbV9lcnJvciAoIlRydW5jYXRpbmcgc3RyaW5nICVkIC0+ICVkLiIsIGxlbmd0aCwgYnVmbGVuKTsKKwkJbGVuZ3RoID0gYnVmbGVuIC0gMTsKKwl9CisJbWVtY3B5IChidWZmZXIsIGJsb2NrICsgMSwgbGVuZ3RoKTsKKwlidWZmZXJbbGVuZ3RoXSA9IDA7CisJcmV0dXJuIGxlbmd0aDsKK30KKworCisvKioKKyAqIGxkbV9wYXJzZV9jbXAzIC0gUmVhZCBhIHJhdyBWQkxLIENvbXBvbmVudCBvYmplY3QgaW50byBhIHZibGsgc3RydWN0dXJlCisgKiBAYnVmZmVyOiAgQmxvY2sgb2YgZGF0YSBiZWluZyB3b3JrZWQgb24KKyAqIEBidWZsZW46ICBTaXplIG9mIHRoZSBibG9jayBvZiBkYXRhCisgKiBAdmI6ICAgICAgSW4tbWVtb3J5IHZibGsgaW4gd2hpY2ggdG8gcmV0dXJuIGluZm9ybWF0aW9uCisgKgorICogUmVhZCBhIHJhdyBWQkxLIENvbXBvbmVudCBvYmplY3QgKHZlcnNpb24gMykgaW50byBhIHZibGsgc3RydWN0dXJlLgorICoKKyAqIFJldHVybjogIFRSVUUgICBAdmIgY29udGFpbnMgYSBDb21wb25lbnQgVkJMSworICogICAgICAgICAgRkFMU0UgIEB2YiBjb250ZW50cyBhcmUgbm90IGRlZmluZWQKKyAqLworc3RhdGljIEJPT0wgbGRtX3BhcnNlX2NtcDMgKGNvbnN0IHU4ICpidWZmZXIsIGludCBidWZsZW4sIHN0cnVjdCB2YmxrICp2YikKK3sKKwlpbnQgcl9vYmppZCwgcl9uYW1lLCByX3ZzdGF0ZSwgcl9jaGlsZCwgcl9wYXJlbnQsIHJfc3RyaXBlLCByX2NvbHMsIGxlbjsKKwlzdHJ1Y3QgdmJsa19jb21wICpjb21wOworCisJQlVHX09OICghYnVmZmVyIHx8ICF2Yik7CisKKwlyX29iamlkICA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4MTgsIDApOworCXJfbmFtZSAgID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHgxOCwgcl9vYmppZCk7CisJcl92c3RhdGUgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDE4LCByX25hbWUpOworCXJfY2hpbGQgID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHgxRCwgcl92c3RhdGUpOworCXJfcGFyZW50ID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHgyRCwgcl9jaGlsZCk7CisKKwlpZiAoYnVmZmVyWzB4MTJdICYgVkJMS19GTEFHX0NPTVBfU1RSSVBFKSB7CisJCXJfc3RyaXBlID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHgyRSwgcl9wYXJlbnQpOworCQlyX2NvbHMgICA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4MkUsIHJfc3RyaXBlKTsKKwkJbGVuID0gcl9jb2xzOworCX0gZWxzZSB7CisJCXJfc3RyaXBlID0gMDsKKwkJcl9jb2xzICAgPSAwOworCQlsZW4gPSByX3BhcmVudDsKKwl9CisJaWYgKGxlbiA8IDApCisJCXJldHVybiBGQUxTRTsKKworCWxlbiArPSBWQkxLX1NJWkVfQ01QMzsKKwlpZiAobGVuICE9IEJFMzIgKGJ1ZmZlciArIDB4MTQpKQorCQlyZXR1cm4gRkFMU0U7CisKKwljb21wID0gJnZiLT52YmxrLmNvbXA7CisJbGRtX2dldF92c3RyIChidWZmZXIgKyAweDE4ICsgcl9uYW1lLCBjb21wLT5zdGF0ZSwKKwkJc2l6ZW9mIChjb21wLT5zdGF0ZSkpOworCWNvbXAtPnR5cGUgICAgICA9IGJ1ZmZlclsweDE4ICsgcl92c3RhdGVdOworCWNvbXAtPmNoaWxkcmVuICA9IGxkbV9nZXRfdm51bSAoYnVmZmVyICsgMHgxRCArIHJfdnN0YXRlKTsKKwljb21wLT5wYXJlbnRfaWQgPSBsZG1fZ2V0X3ZudW0gKGJ1ZmZlciArIDB4MkQgKyByX2NoaWxkKTsKKwljb21wLT5jaHVua3NpemUgPSByX3N0cmlwZSA/IGxkbV9nZXRfdm51bSAoYnVmZmVyK3JfcGFyZW50KzB4MkUpIDogMDsKKworCXJldHVybiBUUlVFOworfQorCisvKioKKyAqIGxkbV9wYXJzZV9kZ3IzIC0gUmVhZCBhIHJhdyBWQkxLIERpc2sgR3JvdXAgb2JqZWN0IGludG8gYSB2YmxrIHN0cnVjdHVyZQorICogQGJ1ZmZlcjogIEJsb2NrIG9mIGRhdGEgYmVpbmcgd29ya2VkIG9uCisgKiBAYnVmbGVuOiAgU2l6ZSBvZiB0aGUgYmxvY2sgb2YgZGF0YQorICogQHZiOiAgICAgIEluLW1lbW9yeSB2YmxrIGluIHdoaWNoIHRvIHJldHVybiBpbmZvcm1hdGlvbgorICoKKyAqIFJlYWQgYSByYXcgVkJMSyBEaXNrIEdyb3VwIG9iamVjdCAodmVyc2lvbiAzKSBpbnRvIGEgdmJsayBzdHJ1Y3R1cmUuCisgKgorICogUmV0dXJuOiAgVFJVRSAgIEB2YiBjb250YWlucyBhIERpc2sgR3JvdXAgVkJMSworICogICAgICAgICAgRkFMU0UgIEB2YiBjb250ZW50cyBhcmUgbm90IGRlZmluZWQKKyAqLworc3RhdGljIGludCBsZG1fcGFyc2VfZGdyMyAoY29uc3QgdTggKmJ1ZmZlciwgaW50IGJ1Zmxlbiwgc3RydWN0IHZibGsgKnZiKQoreworCWludCByX29iamlkLCByX25hbWUsIHJfZGlza2lkLCByX2lkMSwgcl9pZDIsIGxlbjsKKwlzdHJ1Y3QgdmJsa19kZ3JwICpkZ3JwOworCisJQlVHX09OICghYnVmZmVyIHx8ICF2Yik7CisKKwlyX29iamlkICA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4MTgsIDApOworCXJfbmFtZSAgID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHgxOCwgcl9vYmppZCk7CisJcl9kaXNraWQgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDE4LCByX25hbWUpOworCisJaWYgKGJ1ZmZlclsweDEyXSAmIFZCTEtfRkxBR19ER1IzX0lEUykgeworCQlyX2lkMSA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4MjQsIHJfZGlza2lkKTsKKwkJcl9pZDIgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDI0LCByX2lkMSk7CisJCWxlbiA9IHJfaWQyOworCX0gZWxzZSB7CisJCXJfaWQxID0gMDsKKwkJcl9pZDIgPSAwOworCQlsZW4gPSByX2Rpc2tpZDsKKwl9CisJaWYgKGxlbiA8IDApCisJCXJldHVybiBGQUxTRTsKKworCWxlbiArPSBWQkxLX1NJWkVfREdSMzsKKwlpZiAobGVuICE9IEJFMzIgKGJ1ZmZlciArIDB4MTQpKQorCQlyZXR1cm4gRkFMU0U7CisKKwlkZ3JwID0gJnZiLT52YmxrLmRncnA7CisJbGRtX2dldF92c3RyIChidWZmZXIgKyAweDE4ICsgcl9uYW1lLCBkZ3JwLT5kaXNrX2lkLAorCQlzaXplb2YgKGRncnAtPmRpc2tfaWQpKTsKKwlyZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBsZG1fcGFyc2VfZGdyNCAtIFJlYWQgYSByYXcgVkJMSyBEaXNrIEdyb3VwIG9iamVjdCBpbnRvIGEgdmJsayBzdHJ1Y3R1cmUKKyAqIEBidWZmZXI6ICBCbG9jayBvZiBkYXRhIGJlaW5nIHdvcmtlZCBvbgorICogQGJ1ZmxlbjogIFNpemUgb2YgdGhlIGJsb2NrIG9mIGRhdGEKKyAqIEB2YjogICAgICBJbi1tZW1vcnkgdmJsayBpbiB3aGljaCB0byByZXR1cm4gaW5mb3JtYXRpb24KKyAqCisgKiBSZWFkIGEgcmF3IFZCTEsgRGlzayBHcm91cCBvYmplY3QgKHZlcnNpb24gNCkgaW50byBhIHZibGsgc3RydWN0dXJlLgorICoKKyAqIFJldHVybjogIFRSVUUgICBAdmIgY29udGFpbnMgYSBEaXNrIEdyb3VwIFZCTEsKKyAqICAgICAgICAgIEZBTFNFICBAdmIgY29udGVudHMgYXJlIG5vdCBkZWZpbmVkCisgKi8KK3N0YXRpYyBCT09MIGxkbV9wYXJzZV9kZ3I0IChjb25zdCB1OCAqYnVmZmVyLCBpbnQgYnVmbGVuLCBzdHJ1Y3QgdmJsayAqdmIpCit7CisJY2hhciBidWZbNjRdOworCWludCByX29iamlkLCByX25hbWUsIHJfaWQxLCByX2lkMiwgbGVuOworCXN0cnVjdCB2YmxrX2RncnAgKmRncnA7CisKKwlCVUdfT04gKCFidWZmZXIgfHwgIXZiKTsKKworCXJfb2JqaWQgID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHgxOCwgMCk7CisJcl9uYW1lICAgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDE4LCByX29iamlkKTsKKworCWlmIChidWZmZXJbMHgxMl0gJiBWQkxLX0ZMQUdfREdSNF9JRFMpIHsKKwkJcl9pZDEgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDQ0LCByX25hbWUpOworCQlyX2lkMiA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4NDQsIHJfaWQxKTsKKwkJbGVuID0gcl9pZDI7CisJfSBlbHNlIHsKKwkJcl9pZDEgPSAwOworCQlyX2lkMiA9IDA7CisJCWxlbiA9IHJfbmFtZTsKKwl9CisJaWYgKGxlbiA8IDApCisJCXJldHVybiBGQUxTRTsKKworCWxlbiArPSBWQkxLX1NJWkVfREdSNDsKKwlpZiAobGVuICE9IEJFMzIgKGJ1ZmZlciArIDB4MTQpKQorCQlyZXR1cm4gRkFMU0U7CisKKwlkZ3JwID0gJnZiLT52YmxrLmRncnA7CisKKwlsZG1fZ2V0X3ZzdHIgKGJ1ZmZlciArIDB4MTggKyByX29iamlkLCBidWYsIHNpemVvZiAoYnVmKSk7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogbGRtX3BhcnNlX2RzazMgLSBSZWFkIGEgcmF3IFZCTEsgRGlzayBvYmplY3QgaW50byBhIHZibGsgc3RydWN0dXJlCisgKiBAYnVmZmVyOiAgQmxvY2sgb2YgZGF0YSBiZWluZyB3b3JrZWQgb24KKyAqIEBidWZsZW46ICBTaXplIG9mIHRoZSBibG9jayBvZiBkYXRhCisgKiBAdmI6ICAgICAgSW4tbWVtb3J5IHZibGsgaW4gd2hpY2ggdG8gcmV0dXJuIGluZm9ybWF0aW9uCisgKgorICogUmVhZCBhIHJhdyBWQkxLIERpc2sgb2JqZWN0ICh2ZXJzaW9uIDMpIGludG8gYSB2YmxrIHN0cnVjdHVyZS4KKyAqCisgKiBSZXR1cm46ICBUUlVFICAgQHZiIGNvbnRhaW5zIGEgRGlzayBWQkxLCisgKiAgICAgICAgICBGQUxTRSAgQHZiIGNvbnRlbnRzIGFyZSBub3QgZGVmaW5lZAorICovCitzdGF0aWMgQk9PTCBsZG1fcGFyc2VfZHNrMyAoY29uc3QgdTggKmJ1ZmZlciwgaW50IGJ1Zmxlbiwgc3RydWN0IHZibGsgKnZiKQoreworCWludCByX29iamlkLCByX25hbWUsIHJfZGlza2lkLCByX2FsdG5hbWUsIGxlbjsKKwlzdHJ1Y3QgdmJsa19kaXNrICpkaXNrOworCisJQlVHX09OICghYnVmZmVyIHx8ICF2Yik7CisKKwlyX29iamlkICAgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDE4LCAwKTsKKwlyX25hbWUgICAgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDE4LCByX29iamlkKTsKKwlyX2Rpc2tpZCAgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDE4LCByX25hbWUpOworCXJfYWx0bmFtZSA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4MTgsIHJfZGlza2lkKTsKKwlsZW4gPSByX2FsdG5hbWU7CisJaWYgKGxlbiA8IDApCisJCXJldHVybiBGQUxTRTsKKworCWxlbiArPSBWQkxLX1NJWkVfRFNLMzsKKwlpZiAobGVuICE9IEJFMzIgKGJ1ZmZlciArIDB4MTQpKQorCQlyZXR1cm4gRkFMU0U7CisKKwlkaXNrID0gJnZiLT52YmxrLmRpc2s7CisJbGRtX2dldF92c3RyIChidWZmZXIgKyAweDE4ICsgcl9kaXNraWQsIGRpc2stPmFsdF9uYW1lLAorCQlzaXplb2YgKGRpc2stPmFsdF9uYW1lKSk7CisJaWYgKCFsZG1fcGFyc2VfZ3VpZCAoYnVmZmVyICsgMHgxOSArIHJfbmFtZSwgZGlzay0+ZGlza19pZCkpCisJCXJldHVybiBGQUxTRTsKKworCXJldHVybiBUUlVFOworfQorCisvKioKKyAqIGxkbV9wYXJzZV9kc2s0IC0gUmVhZCBhIHJhdyBWQkxLIERpc2sgb2JqZWN0IGludG8gYSB2YmxrIHN0cnVjdHVyZQorICogQGJ1ZmZlcjogIEJsb2NrIG9mIGRhdGEgYmVpbmcgd29ya2VkIG9uCisgKiBAYnVmbGVuOiAgU2l6ZSBvZiB0aGUgYmxvY2sgb2YgZGF0YQorICogQHZiOiAgICAgIEluLW1lbW9yeSB2YmxrIGluIHdoaWNoIHRvIHJldHVybiBpbmZvcm1hdGlvbgorICoKKyAqIFJlYWQgYSByYXcgVkJMSyBEaXNrIG9iamVjdCAodmVyc2lvbiA0KSBpbnRvIGEgdmJsayBzdHJ1Y3R1cmUuCisgKgorICogUmV0dXJuOiAgVFJVRSAgIEB2YiBjb250YWlucyBhIERpc2sgVkJMSworICogICAgICAgICAgRkFMU0UgIEB2YiBjb250ZW50cyBhcmUgbm90IGRlZmluZWQKKyAqLworc3RhdGljIEJPT0wgbGRtX3BhcnNlX2RzazQgKGNvbnN0IHU4ICpidWZmZXIsIGludCBidWZsZW4sIHN0cnVjdCB2YmxrICp2YikKK3sKKwlpbnQgcl9vYmppZCwgcl9uYW1lLCBsZW47CisJc3RydWN0IHZibGtfZGlzayAqZGlzazsKKworCUJVR19PTiAoIWJ1ZmZlciB8fCAhdmIpOworCisJcl9vYmppZCA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4MTgsIDApOworCXJfbmFtZSAgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDE4LCByX29iamlkKTsKKwlsZW4gICAgID0gcl9uYW1lOworCWlmIChsZW4gPCAwKQorCQlyZXR1cm4gRkFMU0U7CisKKwlsZW4gKz0gVkJMS19TSVpFX0RTSzQ7CisJaWYgKGxlbiAhPSBCRTMyIChidWZmZXIgKyAweDE0KSkKKwkJcmV0dXJuIEZBTFNFOworCisJZGlzayA9ICZ2Yi0+dmJsay5kaXNrOworCW1lbWNweSAoZGlzay0+ZGlza19pZCwgYnVmZmVyICsgMHgxOCArIHJfbmFtZSwgR1VJRF9TSVpFKTsKKwlyZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBsZG1fcGFyc2VfcHJ0MyAtIFJlYWQgYSByYXcgVkJMSyBQYXJ0aXRpb24gb2JqZWN0IGludG8gYSB2YmxrIHN0cnVjdHVyZQorICogQGJ1ZmZlcjogIEJsb2NrIG9mIGRhdGEgYmVpbmcgd29ya2VkIG9uCisgKiBAYnVmbGVuOiAgU2l6ZSBvZiB0aGUgYmxvY2sgb2YgZGF0YQorICogQHZiOiAgICAgIEluLW1lbW9yeSB2YmxrIGluIHdoaWNoIHRvIHJldHVybiBpbmZvcm1hdGlvbgorICoKKyAqIFJlYWQgYSByYXcgVkJMSyBQYXJ0aXRpb24gb2JqZWN0ICh2ZXJzaW9uIDMpIGludG8gYSB2YmxrIHN0cnVjdHVyZS4KKyAqCisgKiBSZXR1cm46ICBUUlVFICAgQHZiIGNvbnRhaW5zIGEgUGFydGl0aW9uIFZCTEsKKyAqICAgICAgICAgIEZBTFNFICBAdmIgY29udGVudHMgYXJlIG5vdCBkZWZpbmVkCisgKi8KK3N0YXRpYyBCT09MIGxkbV9wYXJzZV9wcnQzIChjb25zdCB1OCAqYnVmZmVyLCBpbnQgYnVmbGVuLCBzdHJ1Y3QgdmJsayAqdmIpCit7CisJaW50IHJfb2JqaWQsIHJfbmFtZSwgcl9zaXplLCByX3BhcmVudCwgcl9kaXNraWQsIHJfaW5kZXgsIGxlbjsKKwlzdHJ1Y3QgdmJsa19wYXJ0ICpwYXJ0OworCisJQlVHX09OICghYnVmZmVyIHx8ICF2Yik7CisKKwlyX29iamlkICA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4MTgsIDApOworCXJfbmFtZSAgID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHgxOCwgcl9vYmppZCk7CisJcl9zaXplICAgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDM0LCByX25hbWUpOworCXJfcGFyZW50ID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHgzNCwgcl9zaXplKTsKKwlyX2Rpc2tpZCA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4MzQsIHJfcGFyZW50KTsKKworCWlmIChidWZmZXJbMHgxMl0gJiBWQkxLX0ZMQUdfUEFSVF9JTkRFWCkgeworCQlyX2luZGV4ID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHgzNCwgcl9kaXNraWQpOworCQlsZW4gPSByX2luZGV4OworCX0gZWxzZSB7CisJCXJfaW5kZXggPSAwOworCQlsZW4gPSByX2Rpc2tpZDsKKwl9CisJaWYgKGxlbiA8IDApCisJCXJldHVybiBGQUxTRTsKKworCWxlbiArPSBWQkxLX1NJWkVfUFJUMzsKKwlpZiAobGVuICE9IEJFMzIgKGJ1ZmZlciArIDB4MTQpKQorCQlyZXR1cm4gRkFMU0U7CisKKwlwYXJ0ID0gJnZiLT52YmxrLnBhcnQ7CisJcGFydC0+c3RhcnQgICAgICAgICA9IEJFNjQgICAgICAgICAoYnVmZmVyICsgMHgyNCArIHJfbmFtZSk7CisJcGFydC0+dm9sdW1lX29mZnNldCA9IEJFNjQgICAgICAgICAoYnVmZmVyICsgMHgyQyArIHJfbmFtZSk7CisJcGFydC0+c2l6ZSAgICAgICAgICA9IGxkbV9nZXRfdm51bSAoYnVmZmVyICsgMHgzNCArIHJfbmFtZSk7CisJcGFydC0+cGFyZW50X2lkICAgICA9IGxkbV9nZXRfdm51bSAoYnVmZmVyICsgMHgzNCArIHJfc2l6ZSk7CisJcGFydC0+ZGlza19pZCAgICAgICA9IGxkbV9nZXRfdm51bSAoYnVmZmVyICsgMHgzNCArIHJfcGFyZW50KTsKKwlpZiAodmItPmZsYWdzICYgVkJMS19GTEFHX1BBUlRfSU5ERVgpCisJCXBhcnQtPnBhcnRudW0gPSBidWZmZXJbMHgzNSArIHJfZGlza2lkXTsKKwllbHNlCisJCXBhcnQtPnBhcnRudW0gPSAwOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogbGRtX3BhcnNlX3ZvbDUgLSBSZWFkIGEgcmF3IFZCTEsgVm9sdW1lIG9iamVjdCBpbnRvIGEgdmJsayBzdHJ1Y3R1cmUKKyAqIEBidWZmZXI6ICBCbG9jayBvZiBkYXRhIGJlaW5nIHdvcmtlZCBvbgorICogQGJ1ZmxlbjogIFNpemUgb2YgdGhlIGJsb2NrIG9mIGRhdGEKKyAqIEB2YjogICAgICBJbi1tZW1vcnkgdmJsayBpbiB3aGljaCB0byByZXR1cm4gaW5mb3JtYXRpb24KKyAqCisgKiBSZWFkIGEgcmF3IFZCTEsgVm9sdW1lIG9iamVjdCAodmVyc2lvbiA1KSBpbnRvIGEgdmJsayBzdHJ1Y3R1cmUuCisgKgorICogUmV0dXJuOiAgVFJVRSAgIEB2YiBjb250YWlucyBhIFZvbHVtZSBWQkxLCisgKiAgICAgICAgICBGQUxTRSAgQHZiIGNvbnRlbnRzIGFyZSBub3QgZGVmaW5lZAorICovCitzdGF0aWMgQk9PTCBsZG1fcGFyc2Vfdm9sNSAoY29uc3QgdTggKmJ1ZmZlciwgaW50IGJ1Zmxlbiwgc3RydWN0IHZibGsgKnZiKQoreworCWludCByX29iamlkLCByX25hbWUsIHJfdnR5cGUsIHJfY2hpbGQsIHJfc2l6ZSwgcl9pZDEsIHJfaWQyLCByX3NpemUyOworCWludCByX2RyaXZlLCBsZW47CisJc3RydWN0IHZibGtfdm9sdSAqdm9sdTsKKworCUJVR19PTiAoIWJ1ZmZlciB8fCAhdmIpOworCisJcl9vYmppZCAgPSBsZG1fcmVsYXRpdmUgKGJ1ZmZlciwgYnVmbGVuLCAweDE4LCAwKTsKKwlyX25hbWUgICA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4MTgsIHJfb2JqaWQpOworCXJfdnR5cGUgID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHgxOCwgcl9uYW1lKTsKKwlyX2NoaWxkICA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4MkUsIHJfdnR5cGUpOworCXJfc2l6ZSAgID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHgzRSwgcl9jaGlsZCk7CisKKwlpZiAoYnVmZmVyWzB4MTJdICYgVkJMS19GTEFHX1ZPTFVfSUQxKQorCQlyX2lkMSA9IGxkbV9yZWxhdGl2ZSAoYnVmZmVyLCBidWZsZW4sIDB4NTMsIHJfc2l6ZSk7CisJZWxzZQorCQlyX2lkMSA9IHJfc2l6ZTsKKworCWlmIChidWZmZXJbMHgxMl0gJiBWQkxLX0ZMQUdfVk9MVV9JRDIpCisJCXJfaWQyID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHg1Mywgcl9pZDEpOworCWVsc2UKKwkJcl9pZDIgPSByX2lkMTsKKworCWlmIChidWZmZXJbMHgxMl0gJiBWQkxLX0ZMQUdfVk9MVV9TSVpFKQorCQlyX3NpemUyID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHg1Mywgcl9pZDIpOworCWVsc2UKKwkJcl9zaXplMiA9IHJfaWQyOworCisJaWYgKGJ1ZmZlclsweDEyXSAmIFZCTEtfRkxBR19WT0xVX0RSSVZFKQorCQlyX2RyaXZlID0gbGRtX3JlbGF0aXZlIChidWZmZXIsIGJ1ZmxlbiwgMHg1Mywgcl9zaXplMik7CisJZWxzZQorCQlyX2RyaXZlID0gcl9zaXplMjsKKworCWxlbiA9IHJfZHJpdmU7CisJaWYgKGxlbiA8IDApCisJCXJldHVybiBGQUxTRTsKKworCWxlbiArPSBWQkxLX1NJWkVfVk9MNTsKKwlpZiAobGVuICE9IEJFMzIgKGJ1ZmZlciArIDB4MTQpKQorCQlyZXR1cm4gRkFMU0U7CisKKwl2b2x1ID0gJnZiLT52YmxrLnZvbHU7CisKKwlsZG1fZ2V0X3ZzdHIgKGJ1ZmZlciArIDB4MTggKyByX25hbWUsICB2b2x1LT52b2x1bWVfdHlwZSwKKwkJc2l6ZW9mICh2b2x1LT52b2x1bWVfdHlwZSkpOworCW1lbWNweSAodm9sdS0+dm9sdW1lX3N0YXRlLCBidWZmZXIgKyAweDE5ICsgcl92dHlwZSwKKwkJCXNpemVvZiAodm9sdS0+dm9sdW1lX3N0YXRlKSk7CisJdm9sdS0+c2l6ZSA9IGxkbV9nZXRfdm51bSAoYnVmZmVyICsgMHgzRSArIHJfY2hpbGQpOworCXZvbHUtPnBhcnRpdGlvbl90eXBlID0gYnVmZmVyWzB4NDIgKyByX3NpemVdOworCW1lbWNweSAodm9sdS0+Z3VpZCwgYnVmZmVyICsgMHg0MyArIHJfc2l6ZSwgIHNpemVvZiAodm9sdS0+Z3VpZCkpOworCWlmIChidWZmZXJbMHgxMl0gJiBWQkxLX0ZMQUdfVk9MVV9EUklWRSkgeworCQlsZG1fZ2V0X3ZzdHIgKGJ1ZmZlciArIDB4NTMgKyByX3NpemUsICB2b2x1LT5kcml2ZV9oaW50LAorCQkJc2l6ZW9mICh2b2x1LT5kcml2ZV9oaW50KSk7CisJfQorCXJldHVybiBUUlVFOworfQorCisvKioKKyAqIGxkbV9wYXJzZV92YmxrIC0gUmVhZCBhIHJhdyBWQkxLIG9iamVjdCBpbnRvIGEgdmJsayBzdHJ1Y3R1cmUKKyAqIEBidWY6ICBCbG9jayBvZiBkYXRhIGJlaW5nIHdvcmtlZCBvbgorICogQGxlbjogIFNpemUgb2YgdGhlIGJsb2NrIG9mIGRhdGEKKyAqIEB2YjogICBJbi1tZW1vcnkgdmJsayBpbiB3aGljaCB0byByZXR1cm4gaW5mb3JtYXRpb24KKyAqCisgKiBSZWFkIGEgcmF3IFZCTEsgb2JqZWN0IGludG8gYSB2YmxrIHN0cnVjdHVyZS4gIFRoaXMgZnVuY3Rpb24ganVzdCByZWFkcyB0aGUKKyAqIGluZm9ybWF0aW9uIGNvbW1vbiB0byBhbGwgVkJMSyB0eXBlcywgdGhlbiBkZWxlZ2F0ZXMgdGhlIHJlc3Qgb2YgdGhlIHdvcmsgdG8KKyAqIGhlbHBlciBmdW5jdGlvbnM6IGxkbV9wYXJzZV8qLgorICoKKyAqIFJldHVybjogIFRSVUUgICBAdmIgY29udGFpbnMgYSBWQkxLCisgKiAgICAgICAgICBGQUxTRSAgQHZiIGNvbnRlbnRzIGFyZSBub3QgZGVmaW5lZAorICovCitzdGF0aWMgQk9PTCBsZG1fcGFyc2VfdmJsayAoY29uc3QgdTggKmJ1ZiwgaW50IGxlbiwgc3RydWN0IHZibGsgKnZiKQoreworCUJPT0wgcmVzdWx0ID0gRkFMU0U7CisJaW50IHJfb2JqaWQ7CisKKwlCVUdfT04gKCFidWYgfHwgIXZiKTsKKworCXJfb2JqaWQgPSBsZG1fcmVsYXRpdmUgKGJ1ZiwgbGVuLCAweDE4LCAwKTsKKwlpZiAocl9vYmppZCA8IDApIHsKKwkJbGRtX2Vycm9yICgiVkJMSyBoZWFkZXIgaXMgY29ycnVwdC4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCXZiLT5mbGFncyAgPSBidWZbMHgxMl07CisJdmItPnR5cGUgICA9IGJ1ZlsweDEzXTsKKwl2Yi0+b2JqX2lkID0gbGRtX2dldF92bnVtIChidWYgKyAweDE4KTsKKwlsZG1fZ2V0X3ZzdHIgKGJ1ZisweDE4K3Jfb2JqaWQsIHZiLT5uYW1lLCBzaXplb2YgKHZiLT5uYW1lKSk7CisKKwlzd2l0Y2ggKHZiLT50eXBlKSB7CisJCWNhc2UgVkJMS19DTVAzOiAgcmVzdWx0ID0gbGRtX3BhcnNlX2NtcDMgKGJ1ZiwgbGVuLCB2Yik7IGJyZWFrOworCQljYXNlIFZCTEtfRFNLMzogIHJlc3VsdCA9IGxkbV9wYXJzZV9kc2szIChidWYsIGxlbiwgdmIpOyBicmVhazsKKwkJY2FzZSBWQkxLX0RTSzQ6ICByZXN1bHQgPSBsZG1fcGFyc2VfZHNrNCAoYnVmLCBsZW4sIHZiKTsgYnJlYWs7CisJCWNhc2UgVkJMS19ER1IzOiAgcmVzdWx0ID0gbGRtX3BhcnNlX2RncjMgKGJ1ZiwgbGVuLCB2Yik7IGJyZWFrOworCQljYXNlIFZCTEtfREdSNDogIHJlc3VsdCA9IGxkbV9wYXJzZV9kZ3I0IChidWYsIGxlbiwgdmIpOyBicmVhazsKKwkJY2FzZSBWQkxLX1BSVDM6ICByZXN1bHQgPSBsZG1fcGFyc2VfcHJ0MyAoYnVmLCBsZW4sIHZiKTsgYnJlYWs7CisJCWNhc2UgVkJMS19WT0w1OiAgcmVzdWx0ID0gbGRtX3BhcnNlX3ZvbDUgKGJ1ZiwgbGVuLCB2Yik7IGJyZWFrOworCX0KKworCWlmIChyZXN1bHQpCisJCWxkbV9kZWJ1ZyAoIlBhcnNlZCBWQkxLIDB4JWxseCAodHlwZTogMHglMDJ4KSBvay4iLAorCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpIHZiLT5vYmpfaWQsIHZiLT50eXBlKTsKKwllbHNlCisJCWxkbV9lcnJvciAoIkZhaWxlZCB0byBwYXJzZSBWQkxLIDB4JWxseCAodHlwZTogMHglMDJ4KS4iLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgdmItPm9ial9pZCwgdmItPnR5cGUpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKioKKyAqIGxkbV9sZG1kYl9hZGQgLSBBZGRzIGEgcmF3IFZCTEsgZW50cnkgdG8gdGhlIGxkbWRiIGRhdGFiYXNlCisgKiBAZGF0YTogIFJhdyBWQkxLIHRvIGFkZCB0byB0aGUgZGF0YWJhc2UKKyAqIEBsZW46ICAgU2l6ZSBvZiB0aGUgcmF3IFZCTEsKKyAqIEBsZGI6ICAgQ2FjaGUgb2YgdGhlIGRhdGFiYXNlIHN0cnVjdHVyZXMKKyAqCisgKiBUaGUgVkJMS3MgYXJlIHNvcnRlZCBpbnRvIGNhdGVnb3JpZXMuICBQYXJ0aXRpb25zIGFyZSBhbHNvIHNvcnRlZCBieSBvZmZzZXQuCisgKgorICogTi5CLiAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBjaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIFZCTEtzLgorICoKKyAqIFJldHVybjogIFRSVUUgICBUaGUgVkJMSyB3YXMgYWRkZWQKKyAqICAgICAgICAgIEZBTFNFICBBbiBlcnJvciBvY2N1cnJlZAorICovCitzdGF0aWMgQk9PTCBsZG1fbGRtZGJfYWRkICh1OCAqZGF0YSwgaW50IGxlbiwgc3RydWN0IGxkbWRiICpsZGIpCit7CisJc3RydWN0IHZibGsgKnZiOworCXN0cnVjdCBsaXN0X2hlYWQgKml0ZW07CisKKwlCVUdfT04gKCFkYXRhIHx8ICFsZGIpOworCisJdmIgPSBrbWFsbG9jIChzaXplb2YgKCp2YiksIEdGUF9LRVJORUwpOworCWlmICghdmIpIHsKKwkJbGRtX2NyaXQgKCJPdXQgb2YgbWVtb3J5LiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYgKCFsZG1fcGFyc2VfdmJsayAoZGF0YSwgbGVuLCB2YikpIHsKKwkJa2ZyZWUodmIpOworCQlyZXR1cm4gRkFMU0U7CQkJLyogQWxyZWFkeSBsb2dnZWQgKi8KKwl9CisKKwkvKiBQdXQgdmJsayBpbnRvIHRoZSBjb3JyZWN0IGxpc3QuICovCisJc3dpdGNoICh2Yi0+dHlwZSkgeworCWNhc2UgVkJMS19ER1IzOgorCWNhc2UgVkJMS19ER1I0OgorCQlsaXN0X2FkZCAoJnZiLT5saXN0LCAmbGRiLT52X2RncnApOworCQlicmVhazsKKwljYXNlIFZCTEtfRFNLMzoKKwljYXNlIFZCTEtfRFNLNDoKKwkJbGlzdF9hZGQgKCZ2Yi0+bGlzdCwgJmxkYi0+dl9kaXNrKTsKKwkJYnJlYWs7CisJY2FzZSBWQkxLX1ZPTDU6CisJCWxpc3RfYWRkICgmdmItPmxpc3QsICZsZGItPnZfdm9sdSk7CisJCWJyZWFrOworCWNhc2UgVkJMS19DTVAzOgorCQlsaXN0X2FkZCAoJnZiLT5saXN0LCAmbGRiLT52X2NvbXApOworCQlicmVhazsKKwljYXNlIFZCTEtfUFJUMzoKKwkJLyogU29ydCBieSB0aGUgcGFydGl0aW9uJ3Mgc3RhcnQgc2VjdG9yLiAqLworCQlsaXN0X2Zvcl9lYWNoIChpdGVtLCAmbGRiLT52X3BhcnQpIHsKKwkJCXN0cnVjdCB2YmxrICp2ID0gbGlzdF9lbnRyeSAoaXRlbSwgc3RydWN0IHZibGssIGxpc3QpOworCQkJaWYgKCh2LT52YmxrLnBhcnQuZGlza19pZCA9PSB2Yi0+dmJsay5wYXJ0LmRpc2tfaWQpICYmCisJCQkgICAgKHYtPnZibGsucGFydC5zdGFydCA+IHZiLT52YmxrLnBhcnQuc3RhcnQpKSB7CisJCQkJbGlzdF9hZGRfdGFpbCAoJnZiLT5saXN0LCAmdi0+bGlzdCk7CisJCQkJcmV0dXJuIFRSVUU7CisJCQl9CisJCX0KKwkJbGlzdF9hZGRfdGFpbCAoJnZiLT5saXN0LCAmbGRiLT52X3BhcnQpOworCQlicmVhazsKKwl9CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogbGRtX2ZyYWdfYWRkIC0gQWRkIGEgVkJMSyBmcmFnbWVudCB0byBhIGxpc3QKKyAqIEBkYXRhOiAgIFJhdyBmcmFnbWVudCB0byBiZSBhZGRlZCB0byB0aGUgbGlzdAorICogQHNpemU6ICAgU2l6ZSBvZiB0aGUgcmF3IGZyYWdtZW50CisgKiBAZnJhZ3M6ICBMaW5rZWQgbGlzdCBvZiBWQkxLIGZyYWdtZW50cworICoKKyAqIEZyYWdtZW50ZWQgVkJMS3MgbWF5IG5vdCBiZSBjb25zZWN1dGl2ZSBpbiB0aGUgZGF0YWJhc2UsIHNvIHRoZXkgYXJlIHBsYWNlZAorICogaW4gYSBsaXN0IHNvIHRoZXkgY2FuIGJlIHBpZWNlZCB0b2dldGhlciBsYXRlci4KKyAqCisgKiBSZXR1cm46ICBUUlVFICAgU3VjY2VzcywgdGhlIFZCTEsgd2FzIGFkZGVkIHRvIHRoZSBsaXN0CisgKiAgICAgICAgICBGQUxTRSAgRXJyb3IsIGEgcHJvYmxlbSBvY2N1cnJlZAorICovCitzdGF0aWMgQk9PTCBsZG1fZnJhZ19hZGQgKGNvbnN0IHU4ICpkYXRhLCBpbnQgc2l6ZSwgc3RydWN0IGxpc3RfaGVhZCAqZnJhZ3MpCit7CisJc3RydWN0IGZyYWcgKmY7CisJc3RydWN0IGxpc3RfaGVhZCAqaXRlbTsKKwlpbnQgcmVjLCBudW0sIGdyb3VwOworCisJQlVHX09OICghZGF0YSB8fCAhZnJhZ3MpOworCisJZ3JvdXAgPSBCRTMyIChkYXRhICsgMHgwOCk7CisJcmVjICAgPSBCRTE2IChkYXRhICsgMHgwQyk7CisJbnVtICAgPSBCRTE2IChkYXRhICsgMHgwRSk7CisJaWYgKChudW0gPCAxKSB8fCAobnVtID4gNCkpIHsKKwkJbGRtX2Vycm9yICgiQSBWQkxLIGNsYWltcyB0byBoYXZlICVkIHBhcnRzLiIsIG51bSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoIChpdGVtLCBmcmFncykgeworCQlmID0gbGlzdF9lbnRyeSAoaXRlbSwgc3RydWN0IGZyYWcsIGxpc3QpOworCQlpZiAoZi0+Z3JvdXAgPT0gZ3JvdXApCisJCQlnb3RvIGZvdW5kOworCX0KKworCWYgPSBrbWFsbG9jIChzaXplb2YgKCpmKSArIHNpemUqbnVtLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWYpIHsKKwkJbGRtX2NyaXQgKCJPdXQgb2YgbWVtb3J5LiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJZi0+Z3JvdXAgPSBncm91cDsKKwlmLT5udW0gICA9IG51bTsKKwlmLT5yZWMgICA9IHJlYzsKKwlmLT5tYXAgICA9IDB4RkYgPDwgbnVtOworCisJbGlzdF9hZGRfdGFpbCAoJmYtPmxpc3QsIGZyYWdzKTsKK2ZvdW5kOgorCWlmIChmLT5tYXAgJiAoMSA8PCByZWMpKSB7CisJCWxkbV9lcnJvciAoIkR1cGxpY2F0ZSBWQkxLLCBwYXJ0ICVkLiIsIHJlYyk7CisJCWYtPm1hcCAmPSAweDdGOwkJCS8qIE1hcmsgdGhlIGdyb3VwIGFzIGJyb2tlbiAqLworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJZi0+bWFwIHw9ICgxIDw8IHJlYyk7CisKKwlpZiAobnVtID4gMCkgeworCQlkYXRhICs9IFZCTEtfU0laRV9IRUFEOworCQlzaXplIC09IFZCTEtfU0laRV9IRUFEOworCX0KKwltZW1jcHkgKGYtPmRhdGErcmVjKihzaXplLVZCTEtfU0laRV9IRUFEKStWQkxLX1NJWkVfSEVBRCwgZGF0YSwgc2l6ZSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworLyoqCisgKiBsZG1fZnJhZ19mcmVlIC0gRnJlZSBhIGxpbmtlZCBsaXN0IG9mIFZCTEsgZnJhZ21lbnRzCisgKiBAbGlzdDogIExpbmtlZCBsaXN0IG9mIGZyYWdtZW50cworICoKKyAqIEZyZWUgYSBsaW5rZWQgbGlzdCBvZiBWQkxLIGZyYWdtZW50cworICoKKyAqIFJldHVybjogIG5vbmUKKyAqLworc3RhdGljIHZvaWQgbGRtX2ZyYWdfZnJlZSAoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICppdGVtLCAqdG1wOworCisJQlVHX09OICghbGlzdCk7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUgKGl0ZW0sIHRtcCwgbGlzdCkKKwkJa2ZyZWUgKGxpc3RfZW50cnkgKGl0ZW0sIHN0cnVjdCBmcmFnLCBsaXN0KSk7Cit9CisKKy8qKgorICogbGRtX2ZyYWdfY29tbWl0IC0gVmFsaWRhdGUgZnJhZ21lbnRlZCBWQkxLcyBhbmQgYWRkIHRoZW0gdG8gdGhlIGRhdGFiYXNlCisgKiBAZnJhZ3M6ICBMaW5rZWQgbGlzdCBvZiBWQkxLIGZyYWdtZW50cworICogQGxkYjogICAgQ2FjaGUgb2YgdGhlIGRhdGFiYXNlIHN0cnVjdHVyZXMKKyAqCisgKiBOb3cgdGhhdCBhbGwgdGhlIGZyYWdtZW50ZWQgVkJMS3MgaGF2ZSBiZWVuIGNvbGxlY3RlZCwgdGhleSBtdXN0IGJlIGFkZGVkIHRvCisgKiB0aGUgZGF0YWJhc2UgZm9yIGxhdGVyIHVzZS4KKyAqCisgKiBSZXR1cm46ICBUUlVFICAgQWxsIHRoZSBmcmFnbWVudHMgd2UgYWRkZWQgc3VjY2Vzc2Z1bGx5CisgKiAgICAgICAgICBGQUxTRSAgT25lIG9yIG1vcmUgb2YgdGhlIGZyYWdtZW50cyB3ZSBpbnZhbGlkCisgKi8KK3N0YXRpYyBCT09MIGxkbV9mcmFnX2NvbW1pdCAoc3RydWN0IGxpc3RfaGVhZCAqZnJhZ3MsIHN0cnVjdCBsZG1kYiAqbGRiKQoreworCXN0cnVjdCBmcmFnICpmOworCXN0cnVjdCBsaXN0X2hlYWQgKml0ZW07CisKKwlCVUdfT04gKCFmcmFncyB8fCAhbGRiKTsKKworCWxpc3RfZm9yX2VhY2ggKGl0ZW0sIGZyYWdzKSB7CisJCWYgPSBsaXN0X2VudHJ5IChpdGVtLCBzdHJ1Y3QgZnJhZywgbGlzdCk7CisKKwkJaWYgKGYtPm1hcCAhPSAweEZGKSB7CisJCQlsZG1fZXJyb3IgKCJWQkxLIGdyb3VwICVkIGlzIGluY29tcGxldGUgKDB4JTAyeCkuIiwKKwkJCQlmLT5ncm91cCwgZi0+bWFwKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCisJCWlmICghbGRtX2xkbWRiX2FkZCAoZi0+ZGF0YSwgZi0+bnVtKmxkYi0+dm0udmJsa19zaXplLCBsZGIpKQorCQkJcmV0dXJuIEZBTFNFOwkJLyogQWxyZWFkeSBsb2dnZWQgKi8KKwl9CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qKgorICogbGRtX2dldF92YmxrcyAtIFJlYWQgdGhlIG9uLWRpc2sgZGF0YWJhc2Ugb2YgVkJMS3MgaW50byBtZW1vcnkKKyAqIEBiZGV2OiAgRGV2aWNlIGhvbGRpbmcgdGhlIExETSBEYXRhYmFzZQorICogQGJhc2U6ICBPZmZzZXQsIGludG8gQGJkZXYsIG9mIHRoZSBkYXRhYmFzZQorICogQGxkYjogICBDYWNoZSBvZiB0aGUgZGF0YWJhc2Ugc3RydWN0dXJlcworICoKKyAqIFRvIHVzZSB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgVkJMS3MsIHRoZXkgbmVlZCB0byBiZSByZWFkIGZyb20gdGhlIGRpc2ssCisgKiB1bnBhY2tlZCBhbmQgdmFsaWRhdGVkLiAgV2UgY2FjaGUgdGhlbSBpbiBAbGRiIGFjY29yZGluZyB0byB0aGVpciB0eXBlLgorICoKKyAqIFJldHVybjogIFRSVUUgICBBbGwgdGhlIFZCTEtzIHdlcmUgcmVhZCBzdWNjZXNzZnVsbHkKKyAqICAgICAgICAgIEZBTFNFICBBbiBlcnJvciBvY2N1cnJlZAorICovCitzdGF0aWMgQk9PTCBsZG1fZ2V0X3ZibGtzIChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCB1bnNpZ25lZCBsb25nIGJhc2UsCisJCQkgICBzdHJ1Y3QgbGRtZGIgKmxkYikKK3sKKwlpbnQgc2l6ZSwgcGVyYnVmLCBza2lwLCBmaW5pc2gsIHMsIHYsIHJlY3M7CisJdTggKmRhdGEgPSBOVUxMOworCVNlY3RvciBzZWN0OworCUJPT0wgcmVzdWx0ID0gRkFMU0U7CisJTElTVF9IRUFEIChmcmFncyk7CisKKwlCVUdfT04gKCFiZGV2IHx8ICFsZGIpOworCisJc2l6ZSAgID0gbGRiLT52bS52YmxrX3NpemU7CisJcGVyYnVmID0gNTEyIC8gc2l6ZTsKKwlza2lwICAgPSBsZGItPnZtLnZibGtfb2Zmc2V0ID4+IDk7CQkvKiBCeXRlcyB0byBzZWN0b3JzICovCisJZmluaXNoID0gKHNpemUgKiBsZGItPnZtLmxhc3RfdmJsa19zZXEpID4+IDk7CisKKwlmb3IgKHMgPSBza2lwOyBzIDwgZmluaXNoOyBzKyspIHsJCS8qIEZvciBlYWNoIHNlY3RvciAqLworCQlkYXRhID0gcmVhZF9kZXZfc2VjdG9yIChiZGV2LCBiYXNlICsgT0ZGX1ZNREIgKyBzLCAmc2VjdCk7CisJCWlmICghZGF0YSkgeworCQkJbGRtX2NyaXQgKCJEaXNrIHJlYWQgZmFpbGVkLiIpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlmb3IgKHYgPSAwOyB2IDwgcGVyYnVmOyB2KyssIGRhdGErPXNpemUpIHsgIC8qIEZvciBlYWNoIHZibGsgKi8KKwkJCWlmIChNQUdJQ19WQkxLICE9IEJFMzIgKGRhdGEpKSB7CisJCQkJbGRtX2Vycm9yICgiRXhwZWN0ZWQgdG8gZmluZCBhIFZCTEsuIik7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCXJlY3MgPSBCRTE2IChkYXRhICsgMHgwRSk7CS8qIE51bWJlciBvZiByZWNvcmRzICovCisJCQlpZiAocmVjcyA9PSAxKSB7CisJCQkJaWYgKCFsZG1fbGRtZGJfYWRkIChkYXRhLCBzaXplLCBsZGIpKQorCQkJCQlnb3RvIG91dDsJLyogQWxyZWFkeSBsb2dnZWQgKi8KKwkJCX0gZWxzZSBpZiAocmVjcyA+IDEpIHsKKwkJCQlpZiAoIWxkbV9mcmFnX2FkZCAoZGF0YSwgc2l6ZSwgJmZyYWdzKSkKKwkJCQkJZ290byBvdXQ7CS8qIEFscmVhZHkgbG9nZ2VkICovCisJCQl9CisJCQkvKiBlbHNlIFJlY29yZCBpcyBub3QgaW4gdXNlLCBpZ25vcmUgaXQuICovCisJCX0KKwkJcHV0X2Rldl9zZWN0b3IgKHNlY3QpOworCQlkYXRhID0gTlVMTDsKKwl9CisKKwlyZXN1bHQgPSBsZG1fZnJhZ19jb21taXQgKCZmcmFncywgbGRiKTsJLyogRmFpbHVyZXMsIGFscmVhZHkgbG9nZ2VkICovCitvdXQ6CisJaWYgKGRhdGEpCisJCXB1dF9kZXZfc2VjdG9yIChzZWN0KTsKKwlsZG1fZnJhZ19mcmVlICgmZnJhZ3MpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBsZG1fZnJlZV92YmxrcyAtIEZyZWUgYSBsaW5rZWQgbGlzdCBvZiB2YmxrJ3MKKyAqIEBsaDogIEhlYWQgb2YgYSBsaW5rZWQgbGlzdCBvZiBzdHJ1Y3QgdmJsaworICoKKyAqIEZyZWUgYSBsaXN0IG9mIHZibGsncyBhbmQgZnJlZSB0aGUgbWVtb3J5IHVzZWQgdG8gbWFpbnRhaW4gdGhlIGxpc3QuCisgKgorICogUmV0dXJuOiAgbm9uZQorICovCitzdGF0aWMgdm9pZCBsZG1fZnJlZV92YmxrcyAoc3RydWN0IGxpc3RfaGVhZCAqbGgpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqaXRlbSwgKnRtcDsKKworCUJVR19PTiAoIWxoKTsKKworCWxpc3RfZm9yX2VhY2hfc2FmZSAoaXRlbSwgdG1wLCBsaCkKKwkJa2ZyZWUgKGxpc3RfZW50cnkgKGl0ZW0sIHN0cnVjdCB2YmxrLCBsaXN0KSk7Cit9CisKKworLyoqCisgKiBsZG1fcGFydGl0aW9uIC0gRmluZCBvdXQgd2hldGhlciBhIGRldmljZSBpcyBhIGR5bmFtaWMgZGlzayBhbmQgaGFuZGxlIGl0CisgKiBAcHA6ICAgIExpc3Qgb2YgdGhlIHBhcnRpdGlvbnMgcGFyc2VkIHNvIGZhcgorICogQGJkZXY6ICBEZXZpY2UgaG9sZGluZyB0aGUgTERNIERhdGFiYXNlCisgKgorICogVGhpcyBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRldmljZSBAYmRldiBpcyBhIGR5bmFtaWMgZGlzayBhbmQgaWYgc28gY3JlYXRlcworICogdGhlIHBhcnRpdGlvbnMgbmVjZXNzYXJ5IGluIHRoZSBnZW5kaXNrIHN0cnVjdHVyZSBwb2ludGVkIHRvIGJ5IEBoZC4KKyAqCisgKiBXZSBjcmVhdGUgYSBkdW1teSBkZXZpY2UgMSwgd2hpY2ggY29udGFpbnMgdGhlIExETSBkYXRhYmFzZSwgYW5kIHRoZW4gY3JlYXRlCisgKiBlYWNoIHBhcnRpdGlvbiBkZXNjcmliZWQgYnkgdGhlIExETSBkYXRhYmFzZSBpbiBzZXF1ZW5jZSBhcyBkZXZpY2VzIDIrLiBGb3IKKyAqIGV4YW1wbGUsIGlmIHRoZSBkZXZpY2UgaXMgaGRhLCB3ZSB3b3VsZCBoYXZlOiBoZGExOiBMRE0gZGF0YWJhc2UsIGhkYTIsIGhkYTMsCisgKiBhbmQgc28gb246IHRoZSBhY3R1YWwgZGF0YSBjb250YWluaW5nIHBhcnRpdGlvbnMuCisgKgorICogUmV0dXJuOiAgMSBTdWNjZXNzLCBAYmRldiBpcyBhIGR5bmFtaWMgZGlzayBhbmQgd2UgaGFuZGxlZCBpdAorICogICAgICAgICAgMCBTdWNjZXNzLCBAYmRldiBpcyBub3QgYSBkeW5hbWljIGRpc2sKKyAqICAgICAgICAgLTEgQW4gZXJyb3Igb2NjdXJyZWQgYmVmb3JlIGVub3VnaCBpbmZvcm1hdGlvbiBoYWQgYmVlbiByZWFkCisgKiAgICAgICAgICAgIE9yIEBiZGV2IGlzIGEgZHluYW1pYyBkaXNrLCBidXQgaXQgbWF5IGJlIGNvcnJ1cHRlZAorICovCitpbnQgbGRtX3BhcnRpdGlvbiAoc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpwcCwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKK3sKKwlzdHJ1Y3QgbGRtZGIgICpsZGI7CisJdW5zaWduZWQgbG9uZyBiYXNlOworCWludCByZXN1bHQgPSAtMTsKKworCUJVR19PTiAoIXBwIHx8ICFiZGV2KTsKKworCS8qIExvb2sgZm9yIHNpZ25zIG9mIGEgRHluYW1pYyBEaXNrICovCisJaWYgKCFsZG1fdmFsaWRhdGVfcGFydGl0aW9uX3RhYmxlIChiZGV2KSkKKwkJcmV0dXJuIDA7CisKKwlsZGIgPSBrbWFsbG9jIChzaXplb2YgKCpsZGIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxkYikgeworCQlsZG1fY3JpdCAoIk91dCBvZiBtZW1vcnkuIik7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFBhcnNlIGFuZCBjaGVjayBwcml2aGVhZHMuICovCisJaWYgKCFsZG1fdmFsaWRhdGVfcHJpdmhlYWRzIChiZGV2LCAmbGRiLT5waCkpCisJCWdvdG8gb3V0OwkJLyogQWxyZWFkeSBsb2dnZWQgKi8KKworCS8qIEFsbCBmdXJ0aGVyIHJlZmVyZW5jZXMgYXJlIHJlbGF0aXZlIHRvIGJhc2UgKGRhdGFiYXNlIHN0YXJ0KS4gKi8KKwliYXNlID0gbGRiLT5waC5jb25maWdfc3RhcnQ7CisKKwkvKiBQYXJzZSBhbmQgY2hlY2sgdG9jcyBhbmQgdm1kYi4gKi8KKwlpZiAoIWxkbV92YWxpZGF0ZV90b2NibG9ja3MgKGJkZXYsIGJhc2UsIGxkYikgfHwKKwkgICAgIWxkbV92YWxpZGF0ZV92bWRiICAgICAgKGJkZXYsIGJhc2UsIGxkYikpCisJICAgIAlnb3RvIG91dDsJCS8qIEFscmVhZHkgbG9nZ2VkICovCisKKwkvKiBJbml0aWFsaXplIHZibGsgbGlzdHMgaW4gbGRtZGIgc3RydWN0ICovCisJSU5JVF9MSVNUX0hFQUQgKCZsZGItPnZfZGdycCk7CisJSU5JVF9MSVNUX0hFQUQgKCZsZGItPnZfZGlzayk7CisJSU5JVF9MSVNUX0hFQUQgKCZsZGItPnZfdm9sdSk7CisJSU5JVF9MSVNUX0hFQUQgKCZsZGItPnZfY29tcCk7CisJSU5JVF9MSVNUX0hFQUQgKCZsZGItPnZfcGFydCk7CisKKwlpZiAoIWxkbV9nZXRfdmJsa3MgKGJkZXYsIGJhc2UsIGxkYikpIHsKKwkJbGRtX2NyaXQgKCJGYWlsZWQgdG8gcmVhZCB0aGUgVkJMS3MgZnJvbSB0aGUgZGF0YWJhc2UuIik7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwkvKiBGaW5hbGx5LCBjcmVhdGUgdGhlIGRhdGEgcGFydGl0aW9uIGRldmljZXMuICovCisJaWYgKGxkbV9jcmVhdGVfZGF0YV9wYXJ0aXRpb25zIChwcCwgbGRiKSkgeworCQlsZG1fZGVidWcgKCJQYXJzZWQgTERNIGRhdGFiYXNlIHN1Y2Nlc3NmdWxseS4iKTsKKwkJcmVzdWx0ID0gMTsKKwl9CisJLyogZWxzZSBBbHJlYWR5IGxvZ2dlZCAqLworCitjbGVhbnVwOgorCWxkbV9mcmVlX3ZibGtzICgmbGRiLT52X2RncnApOworCWxkbV9mcmVlX3ZibGtzICgmbGRiLT52X2Rpc2spOworCWxkbV9mcmVlX3ZibGtzICgmbGRiLT52X3ZvbHUpOworCWxkbV9mcmVlX3ZibGtzICgmbGRiLT52X2NvbXApOworCWxkbV9mcmVlX3ZibGtzICgmbGRiLT52X3BhcnQpOworb3V0OgorCWtmcmVlIChsZGIpOworCXJldHVybiByZXN1bHQ7Cit9CisKZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvbGRtLmggYi9mcy9wYXJ0aXRpb25zL2xkbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlOGQ3OTUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wYXJ0aXRpb25zL2xkbS5oCkBAIC0wLDAgKzEsMjIwIEBACisvKioKKyAqIGxkbSAtIFBhcnQgb2YgdGhlIExpbnV4LU5URlMgcHJvamVjdC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwMiBSaWNoYXJkIFJ1c3NvbiA8bGRtQGZsYXRjYXAub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDAxICAgICAgQW50b24gQWx0YXBhcm1ha292IDxhaWEyMUBjYW50YWIubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDAxLDIwMDIgSmFrb2IgS2VtaSA8amFrb2Iua2VtaUB0ZWxpYS5jb20+CisgKgorICogRG9jdW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgYXQgaHR0cDovL2xpbnV4LW50ZnMuc2YubmV0L2xkbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0gKGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgtTlRGUyBzb3VyY2UKKyAqIGluIHRoZSBmaWxlIENPUFlJTkcpOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgKiBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfRlNfUFRfTERNX0hfCisjZGVmaW5lIF9GU19QVF9MRE1fSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCitzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnM7CisKKy8qIE1hZ2ljIG51bWJlcnMgaW4gQ1BVIGZvcm1hdC4gKi8KKyNkZWZpbmUgTUFHSUNfVk1EQgkweDU2NEQ0NDQyCQkvKiBWTURCICovCisjZGVmaW5lIE1BR0lDX1ZCTEsJMHg1NjQyNEM0QgkJLyogVkJMSyAqLworI2RlZmluZSBNQUdJQ19QUklWSEVBRAkweDUwNTI0OTU2NDg0NTQxNDRVTEwJLyogUFJJVkhFQUQgKi8KKyNkZWZpbmUgTUFHSUNfVE9DQkxPQ0sJMHg1NDRGNDM0MjRDNEY0MzRCVUxMCS8qIFRPQ0JMT0NLICovCisKKy8qIFRoZSBkZWZpbmVkIHZibGsgdHlwZXMuICovCisjZGVmaW5lIFZCTEtfVk9MNQkJMHg1MQkJLyogVm9sdW1lLCAgICAgdmVyc2lvbiA1ICovCisjZGVmaW5lIFZCTEtfQ01QMwkJMHgzMgkJLyogQ29tcG9uZW50LCAgdmVyc2lvbiAzICovCisjZGVmaW5lIFZCTEtfUFJUMwkJMHgzMwkJLyogUGFydGl0aW9uLCAgdmVyc2lvbiAzICovCisjZGVmaW5lIFZCTEtfRFNLMwkJMHgzNAkJLyogRGlzaywgICAgICAgdmVyc2lvbiAzICovCisjZGVmaW5lIFZCTEtfRFNLNAkJMHg0NAkJLyogRGlzaywgICAgICAgdmVyc2lvbiA0ICovCisjZGVmaW5lIFZCTEtfREdSMwkJMHgzNQkJLyogRGlzayBHcm91cCwgdmVyc2lvbiAzICovCisjZGVmaW5lIFZCTEtfREdSNAkJMHg0NQkJLyogRGlzayBHcm91cCwgdmVyc2lvbiA0ICovCisKKy8qIHZibGsgZmxhZ3MgaW5kaWNhdGluZyBleHRyYSBpbmZvcm1hdGlvbiB3aWxsIGJlIHByZXNlbnQgKi8KKyNkZWZpbmUJVkJMS19GTEFHX0NPTVBfU1RSSVBFCTB4MTAKKyNkZWZpbmUJVkJMS19GTEFHX1BBUlRfSU5ERVgJMHgwOAorI2RlZmluZQlWQkxLX0ZMQUdfREdSM19JRFMJMHgwOAorI2RlZmluZQlWQkxLX0ZMQUdfREdSNF9JRFMJMHgwOAorI2RlZmluZQlWQkxLX0ZMQUdfVk9MVV9JRDEJMHgwOAorI2RlZmluZQlWQkxLX0ZMQUdfVk9MVV9JRDIJMHgyMAorI2RlZmluZQlWQkxLX0ZMQUdfVk9MVV9TSVpFCTB4ODAKKyNkZWZpbmUJVkJMS19GTEFHX1ZPTFVfRFJJVkUJMHgwMgorCisvKiBzaXplIG9mIGEgdmJsaydzIHN0YXRpYyBwYXJ0cyAqLworI2RlZmluZSBWQkxLX1NJWkVfSEVBRAkJMTYKKyNkZWZpbmUgVkJMS19TSVpFX0NNUDMJCTIyCQkvKiBOYW1lIGFuZCB2ZXJzaW9uICovCisjZGVmaW5lIFZCTEtfU0laRV9ER1IzCQkxMgorI2RlZmluZSBWQkxLX1NJWkVfREdSNAkJNDQKKyNkZWZpbmUgVkJMS19TSVpFX0RTSzMJCTEyCisjZGVmaW5lIFZCTEtfU0laRV9EU0s0CQk0NQorI2RlZmluZSBWQkxLX1NJWkVfUFJUMwkJMjgKKyNkZWZpbmUgVkJMS19TSVpFX1ZPTDUJCTU5CisKKy8qIGNvbXBvbmVudCB0eXBlcyAqLworI2RlZmluZSBDT01QX1NUUklQRQkJMHgwMQkJLyogU3RyaXBlLXNldCAqLworI2RlZmluZSBDT01QX0JBU0lDCQkweDAyCQkvKiBCYXNpYyBkaXNrICovCisjZGVmaW5lIENPTVBfUkFJRAkJMHgwMwkJLyogUmFpZC1zZXQgKi8KKworLyogT3RoZXIgY29uc3RhbnRzLiAqLworI2RlZmluZSBMRE1fREJfU0laRQkJMjA0OAkJLyogU2l6ZSBpbiBzZWN0b3JzICg9IDFNaUIpLiAqLworCisjZGVmaW5lIE9GRl9QUklWMQkJNgkJLyogT2Zmc2V0IG9mIHRoZSBmaXJzdCBwcml2aGVhZAorCQkJCQkJICAgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZQorCQkJCQkJICAgZGV2aWNlIGluIHNlY3RvcnMgKi8KKworLyogT2Zmc2V0cyB0byBzdHJ1Y3R1cmVzIHdpdGhpbiB0aGUgTERNIERhdGFiYXNlIGluIHNlY3RvcnMuICovCisjZGVmaW5lIE9GRl9QUklWMgkJMTg1NgkJLyogQmFja3VwIHByaXZhdGUgaGVhZGVycy4gKi8KKyNkZWZpbmUgT0ZGX1BSSVYzCQkyMDQ3CisKKyNkZWZpbmUgT0ZGX1RPQ0IxCQkxCQkvKiBUYWJsZXMgb2YgY29udGVudHMuICovCisjZGVmaW5lIE9GRl9UT0NCMgkJMgorI2RlZmluZSBPRkZfVE9DQjMJCTIwNDUKKyNkZWZpbmUgT0ZGX1RPQ0I0CQkyMDQ2CisKKyNkZWZpbmUgT0ZGX1ZNREIJCTE3CQkvKiBMaXN0IG9mIHBhcnRpdGlvbnMuICovCisKKyNkZWZpbmUgV0lOMktfRFlOQU1JQ19QQVJUSVRJT04JMHg0MgkJLyogRm9ybWVybHkgU0ZTIChMYW5kaXMpLiAqLworCisjZGVmaW5lIFRPQ19CSVRNQVAxCQkiY29uZmlnIgkvKiBOYW1lcyBvZiB0aGUgdHdvIGRlZmluZWQgKi8KKyNkZWZpbmUgVE9DX0JJVE1BUDIJCSJsb2ciCQkvKiBiaXRtYXBzIGluIHRoZSBUT0NCTE9DSy4gKi8KKworLyogTW9zdCBudW1iZXJzIHdlIGRlYWwgd2l0aCBhcmUgYmlnLWVuZGlhbiBhbmQgd29uJ3QgYmUgYWxpZ25lZC4gKi8KKyNkZWZpbmUgQkUxNih4KQkJCSgodTE2KWJlMTZfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fYmUxNiopKHgpKSkpCisjZGVmaW5lIEJFMzIoeCkJCQkoKHUzMiliZTMyX3RvX2NwdShnZXRfdW5hbGlnbmVkKChfX2JlMzIqKSh4KSkpKQorI2RlZmluZSBCRTY0KHgpCQkJKCh1NjQpYmU2NF90b19jcHUoZ2V0X3VuYWxpZ25lZCgoX19iZTY0KikoeCkpKSkKKworLyogQm9ycm93ZWQgZnJvbSBtc2Rvcy5jICovCisjZGVmaW5lIFNZU19JTkQocCkJCShnZXRfdW5hbGlnbmVkKCYocCktPnN5c19pbmQpKQorCitzdHJ1Y3QgZnJhZyB7CQkJCS8qIFZCTEsgRnJhZ21lbnQgaGFuZGxpbmcgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdTMyCQlncm91cDsKKwl1OAkJbnVtOwkJLyogVG90YWwgbnVtYmVyIG9mIHJlY29yZHMgKi8KKwl1OAkJcmVjOwkJLyogVGhpcyBpcyByZWNvcmQgbnVtYmVyIG4gKi8KKwl1OAkJbWFwOwkJLyogV2hpY2ggcG9ydGlvbnMgYXJlIGluIHVzZSAqLworCXU4CQlkYXRhWzBdOworfTsKKworLyogSW4gbWVtb3J5IExETSBkYXRhYmFzZSBzdHJ1Y3R1cmVzLiAqLworCisjZGVmaW5lIEdVSURfU0laRQkJMTYKKworc3RydWN0IHByaXZoZWFkIHsJCQkvKiBPZmZzZXRzIGFuZCBzaXplcyBhcmUgaW4gc2VjdG9ycy4gKi8KKwl1MTYJdmVyX21ham9yOworCXUxNgl2ZXJfbWlub3I7CisJdTY0CWxvZ2ljYWxfZGlza19zdGFydDsKKwl1NjQJbG9naWNhbF9kaXNrX3NpemU7CisJdTY0CWNvbmZpZ19zdGFydDsKKwl1NjQJY29uZmlnX3NpemU7CisJdTgJZGlza19pZFtHVUlEX1NJWkVdOworfTsKKworc3RydWN0IHRvY2Jsb2NrIHsJCQkvKiBXZSBoYXZlIGV4YWN0bHkgdHdvIGJpdG1hcHMuICovCisJdTgJYml0bWFwMV9uYW1lWzE2XTsKKwl1NjQJYml0bWFwMV9zdGFydDsKKwl1NjQJYml0bWFwMV9zaXplOworCXU4CWJpdG1hcDJfbmFtZVsxNl07CisJdTY0CWJpdG1hcDJfc3RhcnQ7CisJdTY0CWJpdG1hcDJfc2l6ZTsKK307CisKK3N0cnVjdCB2bWRiIHsJCQkJLyogVk1EQjogVGhlIGRhdGFiYXNlIGhlYWRlciAqLworCXUxNgl2ZXJfbWFqb3I7CisJdTE2CXZlcl9taW5vcjsKKwl1MzIJdmJsa19zaXplOworCXUzMgl2YmxrX29mZnNldDsKKwl1MzIJbGFzdF92YmxrX3NlcTsKK307CisKK3N0cnVjdCB2YmxrX2NvbXAgewkJCS8qIFZCTEsgQ29tcG9uZW50ICovCisJdTgJc3RhdGVbMTZdOworCXU2NAlwYXJlbnRfaWQ7CisJdTgJdHlwZTsKKwl1OAljaGlsZHJlbjsKKwl1MTYJY2h1bmtzaXplOworfTsKKworc3RydWN0IHZibGtfZGdycCB7CQkJLyogVkJMSyBEaXNrIEdyb3VwICovCisJdTgJZGlza19pZFs2NF07Cit9OworCitzdHJ1Y3QgdmJsa19kaXNrIHsJCQkvKiBWQkxLIERpc2sgKi8KKwl1OAlkaXNrX2lkW0dVSURfU0laRV07CisJdTgJYWx0X25hbWVbMTI4XTsKK307CisKK3N0cnVjdCB2YmxrX3BhcnQgewkJCS8qIFZCTEsgUGFydGl0aW9uICovCisJdTY0CXN0YXJ0OworCXU2NAlzaXplOwkJCS8qIHN0YXJ0LCBzaXplIGFuZCB2b2xfb2ZmIGluIHNlY3RvcnMgKi8KKwl1NjQJdm9sdW1lX29mZnNldDsKKwl1NjQJcGFyZW50X2lkOworCXU2NAlkaXNrX2lkOworCXU4CXBhcnRudW07Cit9OworCitzdHJ1Y3QgdmJsa192b2x1IHsJCQkvKiBWQkxLIFZvbHVtZSAqLworCXU4CXZvbHVtZV90eXBlWzE2XTsKKwl1OAl2b2x1bWVfc3RhdGVbMTZdOworCXU4CWd1aWRbMTZdOworCXU4CWRyaXZlX2hpbnRbNF07CisJdTY0CXNpemU7CisJdTgJcGFydGl0aW9uX3R5cGU7Cit9OworCitzdHJ1Y3QgdmJsa19oZWFkIHsJCQkvKiBWQkxLIHN0YW5kYXJkIGhlYWRlciAqLworCXUzMiBncm91cDsKKwl1MTYgcmVjOworCXUxNiBucmVjOworfTsKKworc3RydWN0IHZibGsgewkJCQkvKiBHZW5lcmFsaXNlZCBWQkxLICovCisJdTgJbmFtZVs2NF07CisJdTY0CW9ial9pZDsKKwl1MzIJc2VxdWVuY2U7CisJdTgJZmxhZ3M7CisJdTgJdHlwZTsKKwl1bmlvbiB7CisJCXN0cnVjdCB2YmxrX2NvbXAgY29tcDsKKwkJc3RydWN0IHZibGtfZGdycCBkZ3JwOworCQlzdHJ1Y3QgdmJsa19kaXNrIGRpc2s7CisJCXN0cnVjdCB2YmxrX3BhcnQgcGFydDsKKwkJc3RydWN0IHZibGtfdm9sdSB2b2x1OworCX0gdmJsazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCitzdHJ1Y3QgbGRtZGIgewkJCQkvKiBDYWNoZSBvZiB0aGUgZGF0YWJhc2UgKi8KKwlzdHJ1Y3QgcHJpdmhlYWQgcGg7CisJc3RydWN0IHRvY2Jsb2NrIHRvYzsKKwlzdHJ1Y3Qgdm1kYiAgICAgdm07CisJc3RydWN0IGxpc3RfaGVhZCB2X2RncnA7CisJc3RydWN0IGxpc3RfaGVhZCB2X2Rpc2s7CisJc3RydWN0IGxpc3RfaGVhZCB2X3ZvbHU7CisJc3RydWN0IGxpc3RfaGVhZCB2X2NvbXA7CisJc3RydWN0IGxpc3RfaGVhZCB2X3BhcnQ7Cit9OworCitpbnQgbGRtX3BhcnRpdGlvbiAoc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldik7CisKKyNlbmRpZiAvKiBfRlNfUFRfTERNX0hfICovCisKZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvbWFjLmMgYi9mcy9wYXJ0aXRpb25zL21hYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMjJjZGQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wYXJ0aXRpb25zL21hYy5jCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogIGZzL3BhcnRpdGlvbnMvbWFjLmMKKyAqCisgKiAgQ29kZSBleHRyYWN0ZWQgZnJvbSBkcml2ZXJzL2Jsb2NrL2dlbmhkLmMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCAgTGludXMgVG9ydmFsZHMKKyAqICBSZS1vcmdhbmlzZWQgRmViIDE5OTggUnVzc2VsbCBLaW5nCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSAiY2hlY2suaCIKKyNpbmNsdWRlICJtYWMuaCIKKworI2lmZGVmIENPTkZJR19QUENfUE1BQworZXh0ZXJuIHZvaWQgbm90ZV9ib290YWJsZV9wYXJ0KGRldl90IGRldiwgaW50IHBhcnQsIGludCBnb29kbmVzcyk7CisjZW5kaWYKKworLyoKKyAqIENvZGUgdG8gdW5kZXJzdGFuZCBNYWNPUyBwYXJ0aXRpb24gdGFibGVzLgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtYWNfZml4X3N0cmluZyhjaGFyICpzdGcsIGludCBsZW4pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSBsZW4gLSAxOyBpID49IDAgJiYgc3RnW2ldID09ICcgJzsgaS0tKQorCQlzdGdbaV0gPSAwOworfQorCitpbnQgbWFjX3BhcnRpdGlvbihzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQoreworCWludCBzbG90ID0gMTsKKwlTZWN0b3Igc2VjdDsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworCWludCBibGssIGJsb2Nrc19pbl9tYXA7CisJdW5zaWduZWQgc2Vjc2l6ZTsKKyNpZmRlZiBDT05GSUdfUFBDX1BNQUMKKwlpbnQgZm91bmRfcm9vdCA9IDA7CisJaW50IGZvdW5kX3Jvb3RfZ29vZG5lc3MgPSAwOworI2VuZGlmCisJc3RydWN0IG1hY19wYXJ0aXRpb24gKnBhcnQ7CisJc3RydWN0IG1hY19kcml2ZXJfZGVzYyAqbWQ7CisKKwkvKiBHZXQgMHRoIGJsb2NrIGFuZCBsb29rIGF0IHRoZSBmaXJzdCBwYXJ0aXRpb24gbWFwIGVudHJ5LiAqLworCW1kID0gKHN0cnVjdCBtYWNfZHJpdmVyX2Rlc2MgKikgcmVhZF9kZXZfc2VjdG9yKGJkZXYsIDAsICZzZWN0KTsKKwlpZiAoIW1kKQorCQlyZXR1cm4gLTE7CisJaWYgKGJlMTZfdG9fY3B1KG1kLT5zaWduYXR1cmUpICE9IE1BQ19EUklWRVJfTUFHSUMpIHsKKwkJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CisJCXJldHVybiAwOworCX0KKwlzZWNzaXplID0gYmUxNl90b19jcHUobWQtPmJsb2NrX3NpemUpOworCXB1dF9kZXZfc2VjdG9yKHNlY3QpOworCWRhdGEgPSByZWFkX2Rldl9zZWN0b3IoYmRldiwgc2Vjc2l6ZS81MTIsICZzZWN0KTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtMTsKKwlwYXJ0ID0gKHN0cnVjdCBtYWNfcGFydGl0aW9uICopIChkYXRhICsgc2Vjc2l6ZSU1MTIpOworCWlmIChiZTE2X3RvX2NwdShwYXJ0LT5zaWduYXR1cmUpICE9IE1BQ19QQVJUSVRJT05fTUFHSUMpIHsKKwkJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CisJCXJldHVybiAwOwkJLyogbm90IGEgTWFjT1MgZGlzayAqLworCX0KKwlwcmludGsoIiBbbWFjXSIpOworCWJsb2Nrc19pbl9tYXAgPSBiZTMyX3RvX2NwdShwYXJ0LT5tYXBfY291bnQpOworCWZvciAoYmxrID0gMTsgYmxrIDw9IGJsb2Nrc19pbl9tYXA7ICsrYmxrKSB7CisJCWludCBwb3MgPSBibGsgKiBzZWNzaXplOworCQlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKwkJZGF0YSA9IHJlYWRfZGV2X3NlY3RvcihiZGV2LCBwb3MvNTEyLCAmc2VjdCk7CisJCWlmICghZGF0YSkKKwkJCXJldHVybiAtMTsKKwkJcGFydCA9IChzdHJ1Y3QgbWFjX3BhcnRpdGlvbiAqKSAoZGF0YSArIHBvcyU1MTIpOworCQlpZiAoYmUxNl90b19jcHUocGFydC0+c2lnbmF0dXJlKSAhPSBNQUNfUEFSVElUSU9OX01BR0lDKQorCQkJYnJlYWs7CisJCXB1dF9wYXJ0aXRpb24oc3RhdGUsIHNsb3QsCisJCQliZTMyX3RvX2NwdShwYXJ0LT5zdGFydF9ibG9jaykgKiAoc2Vjc2l6ZS81MTIpLAorCQkJYmUzMl90b19jcHUocGFydC0+YmxvY2tfY291bnQpICogKHNlY3NpemUvNTEyKSk7CisKKyNpZmRlZiBDT05GSUdfUFBDX1BNQUMKKwkJLyoKKwkJICogSWYgdGhpcyBpcyB0aGUgZmlyc3QgYm9vdGFibGUgcGFydGl0aW9uLCB0ZWxsIHRoZQorCQkgKiBzZXR1cCBjb2RlLCBpbiBjYXNlIGl0IHdhbnRzIHRvIG1ha2UgdGhpcyB0aGUgcm9vdC4KKwkJICovCisJCWlmIChfbWFjaGluZSA9PSBfTUFDSF9QbWFjKSB7CisJCQlpbnQgZ29vZG5lc3MgPSAwOworCisJCQltYWNfZml4X3N0cmluZyhwYXJ0LT5wcm9jZXNzb3IsIDE2KTsKKwkJCW1hY19maXhfc3RyaW5nKHBhcnQtPm5hbWUsIDMyKTsKKwkJCW1hY19maXhfc3RyaW5nKHBhcnQtPnR5cGUsIDMyKTsJCQkJCQorCQkgICAgCisJCQlpZiAoKGJlMzJfdG9fY3B1KHBhcnQtPnN0YXR1cykgJiBNQUNfU1RBVFVTX0JPT1RBQkxFKQorCQkJICAgICYmIHN0cmNhc2VjbXAocGFydC0+cHJvY2Vzc29yLCAicG93ZXJwYyIpID09IDApCisJCQkJZ29vZG5lc3MrKzsKKworCQkJaWYgKHN0cmNhc2VjbXAocGFydC0+dHlwZSwgIkFwcGxlX1VOSVhfU1ZSMiIpID09IDAKKwkJCSAgICB8fCAoc3RybmljbXAocGFydC0+dHlwZSwgIkxpbnV4IiwgNSkgPT0gMAorCQkJICAgICAgICAmJiBzdHJjYXNlY21wKHBhcnQtPnR5cGUsICJMaW51eF9zd2FwIikgIT0gMCkpIHsKKwkJCQlpbnQgaSwgbDsKKworCQkJCWdvb2RuZXNzKys7CisJCQkJbCA9IHN0cmxlbihwYXJ0LT5uYW1lKTsKKwkJCQlpZiAoc3RyY21wKHBhcnQtPm5hbWUsICIvIikgPT0gMCkKKwkJCQkJZ29vZG5lc3MrKzsKKwkJCQlmb3IgKGkgPSAwOyBpIDw9IGwgLSA0OyArK2kpIHsKKwkJCQkJaWYgKHN0cm5pY21wKHBhcnQtPm5hbWUgKyBpLCAicm9vdCIsCisJCQkJCQkgICAgIDQpID09IDApIHsKKwkJCQkJCWdvb2RuZXNzICs9IDI7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoc3RybmljbXAocGFydC0+bmFtZSwgInN3YXAiLCA0KSA9PSAwKQorCQkJCQlnb29kbmVzcy0tOworCQkJfQorCisJCQlpZiAoZ29vZG5lc3MgPiBmb3VuZF9yb290X2dvb2RuZXNzKSB7CisJCQkJZm91bmRfcm9vdCA9IGJsazsKKwkJCQlmb3VuZF9yb290X2dvb2RuZXNzID0gZ29vZG5lc3M7CisJCQl9CisJCX0KKyNlbmRpZiAvKiBDT05GSUdfUFBDX1BNQUMgKi8KKworCQkrK3Nsb3Q7CisJfQorI2lmZGVmIENPTkZJR19QUENfUE1BQworCWlmIChmb3VuZF9yb290X2dvb2RuZXNzKQorCQlub3RlX2Jvb3RhYmxlX3BhcnQoYmRldi0+YmRfZGV2LCBmb3VuZF9yb290LCBmb3VuZF9yb290X2dvb2RuZXNzKTsKKyNlbmRpZgorCisJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CisJcHJpbnRrKCJcbiIpOworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9tYWMuaCBiL2ZzL3BhcnRpdGlvbnMvbWFjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJmMjZlMQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3BhcnRpdGlvbnMvbWFjLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqICBmcy9wYXJ0aXRpb25zL21hYy5oCisgKi8KKworI2RlZmluZSBNQUNfUEFSVElUSU9OX01BR0lDCTB4NTA0ZAorCisvKiB0eXBlIGZpZWxkIHZhbHVlIGZvciBBL1VYIG9yIG90aGVyIFVuaXggcGFydGl0aW9ucyAqLworI2RlZmluZSBBUFBMRV9BVVhfVFlQRQkiQXBwbGVfVU5JWF9TVlIyIgorCitzdHJ1Y3QgbWFjX3BhcnRpdGlvbiB7CisJX19iZTE2CXNpZ25hdHVyZTsJLyogZXhwZWN0ZWQgdG8gYmUgTUFDX1BBUlRJVElPTl9NQUdJQyAqLworCV9fYmUxNglyZXMxOworCV9fYmUzMgltYXBfY291bnQ7CS8qICMgYmxvY2tzIGluIHBhcnRpdGlvbiBtYXAgKi8KKwlfX2JlMzIJc3RhcnRfYmxvY2s7CS8qIGFic29sdXRlIHN0YXJ0aW5nIGJsb2NrICMgb2YgcGFydGl0aW9uICovCisJX19iZTMyCWJsb2NrX2NvdW50OwkvKiBudW1iZXIgb2YgYmxvY2tzIGluIHBhcnRpdGlvbiAqLworCWNoYXIJbmFtZVszMl07CS8qIHBhcnRpdGlvbiBuYW1lICovCisJY2hhcgl0eXBlWzMyXTsJLyogc3RyaW5nIHR5cGUgZGVzY3JpcHRpb24gKi8KKwlfX2JlMzIJZGF0YV9zdGFydDsJLyogcmVsIGJsb2NrICMgb2YgZmlyc3QgZGF0YSBibG9jayAqLworCV9fYmUzMglkYXRhX2NvdW50OwkvKiBudW1iZXIgb2YgZGF0YSBibG9ja3MgKi8KKwlfX2JlMzIJc3RhdHVzOwkJLyogcGFydGl0aW9uIHN0YXR1cyBiaXRzICovCisJX19iZTMyCWJvb3Rfc3RhcnQ7CisJX19iZTMyCWJvb3Rfc2l6ZTsKKwlfX2JlMzIJYm9vdF9sb2FkOworCV9fYmUzMglib290X2xvYWQyOworCV9fYmUzMglib290X2VudHJ5OworCV9fYmUzMglib290X2VudHJ5MjsKKwlfX2JlMzIJYm9vdF9ja3N1bTsKKwljaGFyCXByb2Nlc3NvclsxNl07CS8qIGlkZW50aWZpZXMgSVNBIG9mIGJvb3QgKi8KKwkvKiB0aGVyZSBpcyBtb3JlIHN0dWZmIGFmdGVyIHRoaXMgdGhhdCB3ZSBkb24ndCBuZWVkICovCit9OworCisjZGVmaW5lIE1BQ19TVEFUVVNfQk9PVEFCTEUJOAkvKiBwYXJ0aXRpb24gaXMgYm9vdGFibGUgKi8KKworI2RlZmluZSBNQUNfRFJJVkVSX01BR0lDCTB4NDU1MgorCisvKiBEcml2ZXIgZGVzY3JpcHRvciBzdHJ1Y3R1cmUsIGluIGJsb2NrIDAgKi8KK3N0cnVjdCBtYWNfZHJpdmVyX2Rlc2MgeworCV9fYmUxNglzaWduYXR1cmU7CS8qIGV4cGVjdGVkIHRvIGJlIE1BQ19EUklWRVJfTUFHSUMgKi8KKwlfX2JlMTYJYmxvY2tfc2l6ZTsKKwlfX2JlMzIJYmxvY2tfY291bnQ7CisgICAgLyogLi4uIG1vcmUgc3R1ZmYgKi8KK307CisKK2ludCBtYWNfcGFydGl0aW9uKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpOwpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9tc2Rvcy5jIGIvZnMvcGFydGl0aW9ucy9tc2Rvcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZWUxYjQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wYXJ0aXRpb25zL21zZG9zLmMKQEAgLTAsMCArMSw0NzkgQEAKKy8qCisgKiAgZnMvcGFydGl0aW9ucy9tc2Rvcy5jCisgKgorICogIENvZGUgZXh0cmFjdGVkIGZyb20gZHJpdmVycy9ibG9jay9nZW5oZC5jCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggIExpbnVzIFRvcnZhbGRzCisgKgorICogIFRoYW5rcyB0byBCcmFua28gTGFua2VzdGVyLCBsYW5rZXN0ZUBmd2kudXZhLm5sLCB3aG8gZm91bmQgYSBidWcKKyAqICBpbiB0aGUgZWFybHkgZXh0ZW5kZWQtcGFydGl0aW9uIGNoZWNrcyBhbmQgYWRkZWQgRE0gcGFydGl0aW9ucworICoKKyAqICBTdXBwb3J0IGZvciBEaXNrTWFuYWdlciB2Ni4weCBhZGRlZCBieSBNYXJrIExvcmQsCisgKiAgd2l0aCBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSBPblRyYWNrLiAgVGhpcyBub3cgd29ya3MgZm9yIGxpbnV4IGZkaXNrCisgKiAgYW5kIExJTE8sIGFzIHdlbGwgYXMgbG9hZGxpbiBhbmQgYm9vdGxuLiAgTm90ZSB0aGF0IGRpc2tzIG90aGVyIHRoYW4KKyAqICAvZGV2L2hkYSAqbXVzdCogaGF2ZSBhICJET1MiIHR5cGUgMHg1MSBwYXJ0aXRpb24gaW4gdGhlIGZpcnN0IHNsb3QgKGhkYTEpLgorICoKKyAqICBNb3JlIGZsZXhpYmxlIGhhbmRsaW5nIG9mIGV4dGVuZGVkIHBhcnRpdGlvbnMgLSBhZWIsIDk1MDgzMQorICoKKyAqICBDaGVjayBwYXJ0aXRpb24gdGFibGUgb24gSURFIGRpc2tzIGZvciBjb21tb24gQ0hTIHRyYW5zbGF0aW9ucworICoKKyAqICBSZS1vcmdhbmlzZWQgRmViIDE5OTggUnVzc2VsbCBLaW5nCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaW5jbHVkZSAiY2hlY2suaCIKKyNpbmNsdWRlICJtc2Rvcy5oIgorI2luY2x1ZGUgImVmaS5oIgorCisvKgorICogTWFueSBhcmNoaXRlY3R1cmVzIGRvbid0IGxpa2UgdW5hbGlnbmVkIGFjY2Vzc2VzLCB3aGlsZQorICogdGhlIG5yX3NlY3RzIGFuZCBzdGFydF9zZWN0IHBhcnRpdGlvbiB0YWJsZSBlbnRyaWVzIGFyZQorICogYXQgYSAyIChtb2QgNCkgYWRkcmVzcy4KKyAqLworI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKworI2RlZmluZSBTWVNfSU5EKHApCShnZXRfdW5hbGlnbmVkKCZwLT5zeXNfaW5kKSkKKyNkZWZpbmUgTlJfU0VDVFMocCkJKHsgX190eXBlb2ZfXyhwLT5ucl9zZWN0cykgX19hID0JXAorCQkJCWdldF91bmFsaWduZWQoJnAtPm5yX3NlY3RzKTsJXAorCQkJCWxlMzJfdG9fY3B1KF9fYSk7IFwKKwkJCX0pCisKKyNkZWZpbmUgU1RBUlRfU0VDVChwKQkoeyBfX3R5cGVvZl9fKHAtPnN0YXJ0X3NlY3QpIF9fYSA9CVwKKwkJCQlnZXRfdW5hbGlnbmVkKCZwLT5zdGFydF9zZWN0KTsJXAorCQkJCWxlMzJfdG9fY3B1KF9fYSk7IFwKKwkJCX0pCisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2V4dGVuZGVkX3BhcnRpdGlvbihzdHJ1Y3QgcGFydGl0aW9uICpwKQoreworCXJldHVybiAoU1lTX0lORChwKSA9PSBET1NfRVhURU5ERURfUEFSVElUSU9OIHx8CisJCVNZU19JTkQocCkgPT0gV0lOOThfRVhURU5ERURfUEFSVElUSU9OIHx8CisJCVNZU19JTkQocCkgPT0gTElOVVhfRVhURU5ERURfUEFSVElUSU9OKTsKK30KKworI2RlZmluZSBNU0RPU19MQUJFTF9NQUdJQzEJMHg1NQorI2RlZmluZSBNU0RPU19MQUJFTF9NQUdJQzIJMHhBQQorCitzdGF0aWMgaW5saW5lIGludAorbXNkb3NfbWFnaWNfcHJlc2VudCh1bnNpZ25lZCBjaGFyICpwKQoreworCXJldHVybiAocFswXSA9PSBNU0RPU19MQUJFTF9NQUdJQzEgJiYgcFsxXSA9PSBNU0RPU19MQUJFTF9NQUdJQzIpOworfQorCisvKgorICogQ3JlYXRlIGRldmljZXMgZm9yIGVhY2ggbG9naWNhbCBwYXJ0aXRpb24gaW4gYW4gZXh0ZW5kZWQgcGFydGl0aW9uLgorICogVGhlIGxvZ2ljYWwgcGFydGl0aW9ucyBmb3JtIGEgbGlua2VkIGxpc3QsIHdpdGggZWFjaCBlbnRyeSBiZWluZworICogYSBwYXJ0aXRpb24gdGFibGUgd2l0aCB0d28gZW50cmllcy4gIFRoZSBmaXJzdCBlbnRyeQorICogaXMgdGhlIHJlYWwgZGF0YSBwYXJ0aXRpb24gKHdpdGggYSBzdGFydCByZWxhdGl2ZSB0byB0aGUgcGFydGl0aW9uCisgKiB0YWJsZSBzdGFydCkuICBUaGUgc2Vjb25kIGlzIGEgcG9pbnRlciB0byB0aGUgbmV4dCBsb2dpY2FsIHBhcnRpdGlvbgorICogKHdpdGggYSBzdGFydCByZWxhdGl2ZSB0byB0aGUgZW50aXJlIGV4dGVuZGVkIHBhcnRpdGlvbikuCisgKiBXZSBkbyBub3QgY3JlYXRlIGEgTGludXggcGFydGl0aW9uIGZvciB0aGUgcGFydGl0aW9uIHRhYmxlcywgYnV0CisgKiBvbmx5IGZvciB0aGUgYWN0dWFsIGRhdGEgcGFydGl0aW9ucy4KKyAqLworCitzdGF0aWMgdm9pZAorcGFyc2VfZXh0ZW5kZWQoc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJCXUzMiBmaXJzdF9zZWN0b3IsIHUzMiBmaXJzdF9zaXplKQoreworCXN0cnVjdCBwYXJ0aXRpb24gKnA7CisJU2VjdG9yIHNlY3Q7CisJdW5zaWduZWQgY2hhciAqZGF0YTsKKwl1MzIgdGhpc19zZWN0b3IsIHRoaXNfc2l6ZTsKKwlpbnQgc2VjdG9yX3NpemUgPSBiZGV2X2hhcmRzZWN0X3NpemUoYmRldikgLyA1MTI7CisJaW50IGxvb3BjdCA9IDA7CQkvKiBudW1iZXIgb2YgbGlua3MgZm9sbG93ZWQKKwkJCQkgICB3aXRob3V0IGZpbmRpbmcgYSBkYXRhIHBhcnRpdGlvbiAqLworCWludCBpOworCisJdGhpc19zZWN0b3IgPSBmaXJzdF9zZWN0b3I7CisJdGhpc19zaXplID0gZmlyc3Rfc2l6ZTsKKworCXdoaWxlICgxKSB7CisJCWlmICgrK2xvb3BjdCA+IDEwMCkKKwkJCXJldHVybjsKKwkJaWYgKHN0YXRlLT5uZXh0ID09IHN0YXRlLT5saW1pdCkKKwkJCXJldHVybjsKKwkJZGF0YSA9IHJlYWRfZGV2X3NlY3RvcihiZGV2LCB0aGlzX3NlY3RvciwgJnNlY3QpOworCQlpZiAoIWRhdGEpCisJCQlyZXR1cm47CisKKwkJaWYgKCFtc2Rvc19tYWdpY19wcmVzZW50KGRhdGEgKyA1MTApKQorCQkJZ290byBkb25lOyAKKworCQlwID0gKHN0cnVjdCBwYXJ0aXRpb24gKikgKGRhdGEgKyAweDFiZSk7CisKKwkJLyoKKwkJICogVXN1YWxseSwgdGhlIGZpcnN0IGVudHJ5IGlzIHRoZSByZWFsIGRhdGEgcGFydGl0aW9uLAorCQkgKiB0aGUgMm5kIGVudHJ5IGlzIHRoZSBuZXh0IGV4dGVuZGVkIHBhcnRpdGlvbiwgb3IgZW1wdHksCisJCSAqIGFuZCB0aGUgM3JkIGFuZCA0dGggZW50cmllcyBhcmUgdW51c2VkLgorCQkgKiBIb3dldmVyLCBEUkRPUyBzb21ldGltZXMgaGFzIHRoZSBleHRlbmRlZCBwYXJ0aXRpb24gYXMKKwkJICogdGhlIGZpcnN0IGVudHJ5ICh3aGVuIHRoZSBkYXRhIHBhcnRpdGlvbiBpcyBlbXB0eSksCisJCSAqIGFuZCBPUy8yIHNlZW1zIHRvIHVzZSBhbGwgZm91ciBlbnRyaWVzLgorCQkgKi8KKworCQkvKiAKKwkJICogRmlyc3QgcHJvY2VzcyB0aGUgZGF0YSBwYXJ0aXRpb24ocykKKwkJICovCisJCWZvciAoaT0wOyBpPDQ7IGkrKywgcCsrKSB7CisJCQl1MzIgb2Zmcywgc2l6ZSwgbmV4dDsKKworCQkJaWYgKFNZU19JTkQocCkgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJCWlmICghTlJfU0VDVFMocCkgfHwgaXNfZXh0ZW5kZWRfcGFydGl0aW9uKHApKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBDaGVjayB0aGUgM3JkIGFuZCA0dGggZW50cmllcyAtCisJCQkgICB0aGVzZSBzb21ldGltZXMgY29udGFpbiByYW5kb20gZ2FyYmFnZSAqLworCQkJb2ZmcyA9IFNUQVJUX1NFQ1QocCkqc2VjdG9yX3NpemU7CisJCQlzaXplID0gTlJfU0VDVFMocCkqc2VjdG9yX3NpemU7CisJCQluZXh0ID0gdGhpc19zZWN0b3IgKyBvZmZzOworCQkJaWYgKGkgPj0gMikgeworCQkJCWlmIChvZmZzICsgc2l6ZSA+IHRoaXNfc2l6ZSkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKG5leHQgPCBmaXJzdF9zZWN0b3IpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChuZXh0ICsgc2l6ZSA+IGZpcnN0X3NlY3RvciArIGZpcnN0X3NpemUpCisJCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlwdXRfcGFydGl0aW9uKHN0YXRlLCBzdGF0ZS0+bmV4dCwgbmV4dCwgc2l6ZSk7CisJCQlpZiAoU1lTX0lORChwKSA9PSBMSU5VWF9SQUlEX1BBUlRJVElPTikKKwkJCQlzdGF0ZS0+cGFydHNbc3RhdGUtPm5leHRdLmZsYWdzID0gMTsKKwkJCWxvb3BjdCA9IDA7CisJCQlpZiAoKytzdGF0ZS0+bmV4dCA9PSBzdGF0ZS0+bGltaXQpCisJCQkJZ290byBkb25lOworCQl9CisJCS8qCisJCSAqIE5leHQsIHByb2Nlc3MgdGhlIChmaXJzdCkgZXh0ZW5kZWQgcGFydGl0aW9uLCBpZiBwcmVzZW50LgorCQkgKiAoU28gZmFyLCB0aGVyZSBzZWVtcyB0byBiZSBubyByZWFzb24gdG8gbWFrZQorCQkgKiAgcGFyc2VfZXh0ZW5kZWQoKSAgcmVjdXJzaXZlIGFuZCBhbGxvdyBhIHRyZWUKKwkJICogIG9mIGV4dGVuZGVkIHBhcnRpdGlvbnMuKQorCQkgKiBJdCBzaG91bGQgYmUgYSBsaW5rIHRvIHRoZSBuZXh0IGxvZ2ljYWwgcGFydGl0aW9uLgorCQkgKi8KKwkJcCAtPSA0OworCQlmb3IgKGk9MDsgaTw0OyBpKyssIHArKykKKwkJCWlmIChOUl9TRUNUUyhwKSAmJiBpc19leHRlbmRlZF9wYXJ0aXRpb24ocCkpCisJCQkJYnJlYWs7CisJCWlmIChpID09IDQpCisJCQlnb3RvIGRvbmU7CSAvKiBub3RoaW5nIGxlZnQgdG8gZG8gKi8KKworCQl0aGlzX3NlY3RvciA9IGZpcnN0X3NlY3RvciArIFNUQVJUX1NFQ1QocCkgKiBzZWN0b3Jfc2l6ZTsKKwkJdGhpc19zaXplID0gTlJfU0VDVFMocCkgKiBzZWN0b3Jfc2l6ZTsKKwkJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CisJfQorZG9uZToKKwlwdXRfZGV2X3NlY3RvcihzZWN0KTsKK30KKworLyogamFtZXNAYnBnYy5jb206IFNvbGFyaXMgaGFzIGEgbmFzdHkgaW5kaWNhdG9yOiAweDgyIHdoaWNoIGFsc28KKyAgIGluZGljYXRlcyBsaW51eCBzd2FwLiAgQmUgY2FyZWZ1bCBiZWZvcmUgYmVsaWV2aW5nIHRoaXMgaXMgU29sYXJpcy4gKi8KKworc3RhdGljIHZvaWQKK3BhcnNlX3NvbGFyaXNfeDg2KHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJCQl1MzIgb2Zmc2V0LCB1MzIgc2l6ZSwgaW50IG9yaWdpbikKK3sKKyNpZmRlZiBDT05GSUdfU09MQVJJU19YODZfUEFSVElUSU9OCisJU2VjdG9yIHNlY3Q7CisJc3RydWN0IHNvbGFyaXNfeDg2X3Z0b2MgKnY7CisJaW50IGk7CisKKwl2ID0gKHN0cnVjdCBzb2xhcmlzX3g4Nl92dG9jICopcmVhZF9kZXZfc2VjdG9yKGJkZXYsIG9mZnNldCsxLCAmc2VjdCk7CisJaWYgKCF2KQorCQlyZXR1cm47CisJaWYgKGxlMzJfdG9fY3B1KHYtPnZfc2FuaXR5KSAhPSBTT0xBUklTX1g4Nl9WVE9DX1NBTkUpIHsKKwkJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CisJCXJldHVybjsKKwl9CisJcHJpbnRrKCIgJXMlZDogPHNvbGFyaXM6Iiwgc3RhdGUtPm5hbWUsIG9yaWdpbik7CisJaWYgKGxlMzJfdG9fY3B1KHYtPnZfdmVyc2lvbikgIT0gMSkgeworCQlwcmludGsoIiAgY2Fubm90IGhhbmRsZSB2ZXJzaW9uICVkIHZ0b2M+XG4iLAorCQkJbGUzMl90b19jcHUodi0+dl92ZXJzaW9uKSk7CisJCXB1dF9kZXZfc2VjdG9yKHNlY3QpOworCQlyZXR1cm47CisJfQorCWZvciAoaT0wOyBpPFNPTEFSSVNfWDg2X05VTVNMSUNFICYmIHN0YXRlLT5uZXh0PHN0YXRlLT5saW1pdDsgaSsrKSB7CisJCXN0cnVjdCBzb2xhcmlzX3g4Nl9zbGljZSAqcyA9ICZ2LT52X3NsaWNlW2ldOworCQlpZiAocy0+c19zaXplID09IDApCisJCQljb250aW51ZTsKKwkJcHJpbnRrKCIgW3MlZF0iLCBpKTsKKwkJLyogc29sYXJpcyBwYXJ0aXRpb25zIGFyZSByZWxhdGl2ZSB0byBjdXJyZW50IE1TLURPUworCQkgKiBvbmU7IG11c3QgYWRkIHRoZSBvZmZzZXQgb2YgdGhlIGN1cnJlbnQgcGFydGl0aW9uICovCisJCXB1dF9wYXJ0aXRpb24oc3RhdGUsIHN0YXRlLT5uZXh0KyssCisJCQkJIGxlMzJfdG9fY3B1KHMtPnNfc3RhcnQpK29mZnNldCwKKwkJCQkgbGUzMl90b19jcHUocy0+c19zaXplKSk7CisJfQorCXB1dF9kZXZfc2VjdG9yKHNlY3QpOworCXByaW50aygiID5cbiIpOworI2VuZGlmCit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19CU0RfRElTS0xBQkVMKSB8fCBkZWZpbmVkKENPTkZJR19ORUM5OF9QQVJUSVRJT04pCisvKiAKKyAqIENyZWF0ZSBkZXZpY2VzIGZvciBCU0QgcGFydGl0aW9ucyBsaXN0ZWQgaW4gYSBkaXNrbGFiZWwsIHVuZGVyIGEKKyAqIGRvcy1saWtlIHBhcnRpdGlvbi4gU2VlIHBhcnNlX2V4dGVuZGVkKCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKi8KK3ZvaWQKK3BhcnNlX2JzZChzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQl1MzIgb2Zmc2V0LCB1MzIgc2l6ZSwgaW50IG9yaWdpbiwgY2hhciAqZmxhdm91ciwKKwkJaW50IG1heF9wYXJ0aXRpb25zKQoreworCVNlY3RvciBzZWN0OworCXN0cnVjdCBic2RfZGlza2xhYmVsICpsOworCXN0cnVjdCBic2RfcGFydGl0aW9uICpwOworCisJbCA9IChzdHJ1Y3QgYnNkX2Rpc2tsYWJlbCAqKXJlYWRfZGV2X3NlY3RvcihiZGV2LCBvZmZzZXQrMSwgJnNlY3QpOworCWlmICghbCkKKwkJcmV0dXJuOworCWlmIChsZTMyX3RvX2NwdShsLT5kX21hZ2ljKSAhPSBCU0RfRElTS01BR0lDKSB7CisJCXB1dF9kZXZfc2VjdG9yKHNlY3QpOworCQlyZXR1cm47CisJfQorCXByaW50aygiICVzJWQ6IDwlczoiLCBzdGF0ZS0+bmFtZSwgb3JpZ2luLCBmbGF2b3VyKTsKKworCWlmIChsZTE2X3RvX2NwdShsLT5kX25wYXJ0aXRpb25zKSA8IG1heF9wYXJ0aXRpb25zKQorCQltYXhfcGFydGl0aW9ucyA9IGxlMTZfdG9fY3B1KGwtPmRfbnBhcnRpdGlvbnMpOworCWZvciAocCA9IGwtPmRfcGFydGl0aW9uczsgcCAtIGwtPmRfcGFydGl0aW9ucyA8IG1heF9wYXJ0aXRpb25zOyBwKyspIHsKKwkJdTMyIGJzZF9zdGFydCwgYnNkX3NpemU7CisKKwkJaWYgKHN0YXRlLT5uZXh0ID09IHN0YXRlLT5saW1pdCkKKwkJCWJyZWFrOworCQlpZiAocC0+cF9mc3R5cGUgPT0gQlNEX0ZTX1VOVVNFRCkgCisJCQljb250aW51ZTsKKwkJYnNkX3N0YXJ0ID0gbGUzMl90b19jcHUocC0+cF9vZmZzZXQpOworCQlic2Rfc2l6ZSA9IGxlMzJfdG9fY3B1KHAtPnBfc2l6ZSk7CisJCWlmIChvZmZzZXQgPT0gYnNkX3N0YXJ0ICYmIHNpemUgPT0gYnNkX3NpemUpCisJCQkvKiBmdWxsIHBhcmVudCBwYXJ0aXRpb24sIHdlIGhhdmUgaXQgYWxyZWFkeSAqLworCQkJY29udGludWU7CisJCWlmIChvZmZzZXQgPiBic2Rfc3RhcnQgfHwgb2Zmc2V0K3NpemUgPCBic2Rfc3RhcnQrYnNkX3NpemUpIHsKKwkJCXByaW50aygiYmFkIHN1YnBhcnRpdGlvbiAtIGlnbm9yZWRcbiIpOworCQkJY29udGludWU7CisJCX0KKwkJcHV0X3BhcnRpdGlvbihzdGF0ZSwgc3RhdGUtPm5leHQrKywgYnNkX3N0YXJ0LCBic2Rfc2l6ZSk7CisJfQorCXB1dF9kZXZfc2VjdG9yKHNlY3QpOworCWlmIChsZTE2X3RvX2NwdShsLT5kX25wYXJ0aXRpb25zKSA+IG1heF9wYXJ0aXRpb25zKQorCQlwcmludGsoIiAoaWdub3JlZCAlZCBtb3JlKSIsCisJCSAgICAgICBsZTE2X3RvX2NwdShsLT5kX25wYXJ0aXRpb25zKSAtIG1heF9wYXJ0aXRpb25zKTsKKwlwcmludGsoIiA+XG4iKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorcGFyc2VfZnJlZWJzZChzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQl1MzIgb2Zmc2V0LCB1MzIgc2l6ZSwgaW50IG9yaWdpbikKK3sKKyNpZmRlZiBDT05GSUdfQlNEX0RJU0tMQUJFTAorCXBhcnNlX2JzZChzdGF0ZSwgYmRldiwgb2Zmc2V0LCBzaXplLCBvcmlnaW4sCisJCQkiYnNkIiwgQlNEX01BWFBBUlRJVElPTlMpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCitwYXJzZV9uZXRic2Qoc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJdTMyIG9mZnNldCwgdTMyIHNpemUsIGludCBvcmlnaW4pCit7CisjaWZkZWYgQ09ORklHX0JTRF9ESVNLTEFCRUwKKwlwYXJzZV9ic2Qoc3RhdGUsIGJkZXYsIG9mZnNldCwgc2l6ZSwgb3JpZ2luLAorCQkJIm5ldGJzZCIsIEJTRF9NQVhQQVJUSVRJT05TKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorcGFyc2Vfb3BlbmJzZChzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQl1MzIgb2Zmc2V0LCB1MzIgc2l6ZSwgaW50IG9yaWdpbikKK3sKKyNpZmRlZiBDT05GSUdfQlNEX0RJU0tMQUJFTAorCXBhcnNlX2JzZChzdGF0ZSwgYmRldiwgb2Zmc2V0LCBzaXplLCBvcmlnaW4sCisJCQkib3BlbmJzZCIsIE9QRU5CU0RfTUFYUEFSVElUSU9OUyk7CisjZW5kaWYKK30KKworLyoKKyAqIENyZWF0ZSBkZXZpY2VzIGZvciBVbml4d2FyZSBwYXJ0aXRpb25zIGxpc3RlZCBpbiBhIGRpc2tsYWJlbCwgdW5kZXIgYQorICogZG9zLWxpa2UgcGFydGl0aW9uLiBTZWUgcGFyc2VfZXh0ZW5kZWQoKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqLworc3RhdGljIHZvaWQKK3BhcnNlX3VuaXh3YXJlKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCisJCXUzMiBvZmZzZXQsIHUzMiBzaXplLCBpbnQgb3JpZ2luKQoreworI2lmZGVmIENPTkZJR19VTklYV0FSRV9ESVNLTEFCRUwKKwlTZWN0b3Igc2VjdDsKKwlzdHJ1Y3QgdW5peHdhcmVfZGlza2xhYmVsICpsOworCXN0cnVjdCB1bml4d2FyZV9zbGljZSAqcDsKKworCWwgPSAoc3RydWN0IHVuaXh3YXJlX2Rpc2tsYWJlbCAqKXJlYWRfZGV2X3NlY3RvcihiZGV2LCBvZmZzZXQrMjksICZzZWN0KTsKKwlpZiAoIWwpCisJCXJldHVybjsKKwlpZiAobGUzMl90b19jcHUobC0+ZF9tYWdpYykgIT0gVU5JWFdBUkVfRElTS01BR0lDIHx8CisJICAgIGxlMzJfdG9fY3B1KGwtPnZ0b2Mudl9tYWdpYykgIT0gVU5JWFdBUkVfRElTS01BR0lDMikgeworCQlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKwkJcmV0dXJuOworCX0KKwlwcmludGsoIiAlcyVkOiA8dW5peHdhcmU6Iiwgc3RhdGUtPm5hbWUsIG9yaWdpbik7CisJcCA9ICZsLT52dG9jLnZfc2xpY2VbMV07CisJLyogSSBvbWl0IHRoZSAwdGggc2xpY2UgYXMgaXQgaXMgdGhlIHNhbWUgYXMgd2hvbGUgZGlzay4gKi8KKwl3aGlsZSAocCAtICZsLT52dG9jLnZfc2xpY2VbMF0gPCBVTklYV0FSRV9OVU1TTElDRSkgeworCQlpZiAoc3RhdGUtPm5leHQgPT0gc3RhdGUtPmxpbWl0KQorCQkJYnJlYWs7CisKKwkJaWYgKHAtPnNfbGFiZWwgIT0gVU5JWFdBUkVfRlNfVU5VU0VEKQorCQkJcHV0X3BhcnRpdGlvbihzdGF0ZSwgc3RhdGUtPm5leHQrKywKKwkJCQkJCVNUQVJUX1NFQ1QocCksIE5SX1NFQ1RTKHApKTsKKwkJcCsrOworCX0KKwlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKwlwcmludGsoIiA+XG4iKTsKKyNlbmRpZgorfQorCisvKgorICogTWluaXggMi4wLjAvMi4wLjIgc3VicGFydGl0aW9uIHN1cHBvcnQuCisgKiBBbmFuZCBLcmlzaG5hbXVydGh5IDxhbmFuZGtAd2lwcm9nZS5tZWQuZ2UuY29tPgorICogUmFqZWV2IFYuIFBpbGxhaSAgICA8cmFqZWV2dnBAeWFob28uY29tPgorICovCitzdGF0aWMgdm9pZAorcGFyc2VfbWluaXgoc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJdTMyIG9mZnNldCwgdTMyIHNpemUsIGludCBvcmlnaW4pCit7CisjaWZkZWYgQ09ORklHX01JTklYX1NVQlBBUlRJVElPTgorCVNlY3RvciBzZWN0OworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJc3RydWN0IHBhcnRpdGlvbiAqcDsKKwlpbnQgaTsKKworCWRhdGEgPSByZWFkX2Rldl9zZWN0b3IoYmRldiwgb2Zmc2V0LCAmc2VjdCk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm47CisKKwlwID0gKHN0cnVjdCBwYXJ0aXRpb24gKikoZGF0YSArIDB4MWJlKTsKKworCS8qIFRoZSBmaXJzdCBzZWN0b3Igb2YgYSBNaW5peCBwYXJ0aXRpb24gY2FuIGhhdmUgZWl0aGVyCisJICogYSBzZWNvbmRhcnkgTUJSIGRlc2NyaWJpbmcgaXRzIHN1YnBhcnRpdGlvbnMsIG9yCisJICogdGhlIG5vcm1hbCBib290IHNlY3Rvci4gKi8KKwlpZiAobXNkb3NfbWFnaWNfcHJlc2VudCAoZGF0YSArIDUxMCkgJiYKKwkgICAgU1lTX0lORChwKSA9PSBNSU5JWF9QQVJUSVRJT04pIHsgLyogc3VicGFydGl0aW9uIHRhYmxlIHByZXNlbnQgKi8KKworCQlwcmludGsoIiAlcyVkOiA8bWluaXg6Iiwgc3RhdGUtPm5hbWUsIG9yaWdpbik7CisJCWZvciAoaSA9IDA7IGkgPCBNSU5JWF9OUl9TVUJQQVJUSVRJT05TOyBpKyssIHArKykgeworCQkJaWYgKHN0YXRlLT5uZXh0ID09IHN0YXRlLT5saW1pdCkKKwkJCQlicmVhazsKKwkJCS8qIGFkZCBlYWNoIHBhcnRpdGlvbiBpbiB1c2UgKi8KKwkJCWlmIChTWVNfSU5EKHApID09IE1JTklYX1BBUlRJVElPTikKKwkJCQlwdXRfcGFydGl0aW9uKHN0YXRlLCBzdGF0ZS0+bmV4dCsrLAorCQkJCQkgICAgICBTVEFSVF9TRUNUKHApLCBOUl9TRUNUUyhwKSk7CisJCX0KKwkJcHJpbnRrKCIgPlxuIik7CisJfQorCXB1dF9kZXZfc2VjdG9yKHNlY3QpOworI2VuZGlmIC8qIENPTkZJR19NSU5JWF9TVUJQQVJUSVRJT04gKi8KK30KKworc3RhdGljIHN0cnVjdCB7CisJdW5zaWduZWQgY2hhciBpZDsKKwl2b2lkICgqcGFyc2UpKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICosCisJCQl1MzIsIHUzMiwgaW50KTsKK30gc3VidHlwZXNbXSA9IHsKKwl7RlJFRUJTRF9QQVJUSVRJT04sIHBhcnNlX2ZyZWVic2R9LAorCXtORVRCU0RfUEFSVElUSU9OLCBwYXJzZV9uZXRic2R9LAorCXtPUEVOQlNEX1BBUlRJVElPTiwgcGFyc2Vfb3BlbmJzZH0sCisJe01JTklYX1BBUlRJVElPTiwgcGFyc2VfbWluaXh9LAorCXtVTklYV0FSRV9QQVJUSVRJT04sIHBhcnNlX3VuaXh3YXJlfSwKKwl7U09MQVJJU19YODZfUEFSVElUSU9OLCBwYXJzZV9zb2xhcmlzX3g4Nn0sCisJe05FV19TT0xBUklTX1g4Nl9QQVJUSVRJT04sIHBhcnNlX3NvbGFyaXNfeDg2fSwKKwl7MCwgTlVMTH0sCit9OworIAoraW50IG1zZG9zX3BhcnRpdGlvbihzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQoreworCWludCBzZWN0b3Jfc2l6ZSA9IGJkZXZfaGFyZHNlY3Rfc2l6ZShiZGV2KSAvIDUxMjsKKwlTZWN0b3Igc2VjdDsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworCXN0cnVjdCBwYXJ0aXRpb24gKnA7CisJaW50IHNsb3Q7CisKKwlkYXRhID0gcmVhZF9kZXZfc2VjdG9yKGJkZXYsIDAsICZzZWN0KTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtMTsKKwlpZiAoIW1zZG9zX21hZ2ljX3ByZXNlbnQoZGF0YSArIDUxMCkpIHsKKwkJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogTm93IHRoYXQgdGhlIDU1YWEgc2lnbmF0dXJlIGlzIHByZXNlbnQsIHRoaXMgaXMgcHJvYmFibHkKKwkgKiBlaXRoZXIgdGhlIGJvb3Qgc2VjdG9yIG9mIGEgRkFUIGZpbGVzeXN0ZW0gb3IgYSBET1MtdHlwZQorCSAqIHBhcnRpdGlvbiB0YWJsZS4gUmVqZWN0IHRoaXMgaW4gY2FzZSB0aGUgYm9vdCBpbmRpY2F0b3IKKwkgKiBpcyBub3QgMCBvciAweDgwLgorCSAqLworCXAgPSAoc3RydWN0IHBhcnRpdGlvbiAqKSAoZGF0YSArIDB4MWJlKTsKKwlmb3IgKHNsb3QgPSAxOyBzbG90IDw9IDQ7IHNsb3QrKywgcCsrKSB7CisJCWlmIChwLT5ib290X2luZCAhPSAwICYmIHAtPmJvb3RfaW5kICE9IDB4ODApIHsKKwkJCXB1dF9kZXZfc2VjdG9yKHNlY3QpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKyNpZmRlZiBDT05GSUdfRUZJX1BBUlRJVElPTgorCXAgPSAoc3RydWN0IHBhcnRpdGlvbiAqKSAoZGF0YSArIDB4MWJlKTsKKwlmb3IgKHNsb3QgPSAxIDsgc2xvdCA8PSA0IDsgc2xvdCsrLCBwKyspIHsKKwkJLyogSWYgdGhpcyBpcyBhbiBFRkkgR1BUIGRpc2ssIG1zZG9zIHNob3VsZCBpZ25vcmUgaXQuICovCisJCWlmIChTWVNfSU5EKHApID09IEVGSV9QTUJSX09TVFlQRV9FRklfR1BUKSB7CisJCQlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKwkJCXJldHVybiAwOworCQl9CisJfQorI2VuZGlmCisJcCA9IChzdHJ1Y3QgcGFydGl0aW9uICopIChkYXRhICsgMHgxYmUpOworCisJLyoKKwkgKiBMb29rIGZvciBwYXJ0aXRpb25zIGluIHR3byBwYXNzZXM6CisJICogRmlyc3QgZmluZCB0aGUgcHJpbWFyeSBhbmQgRE9TLXR5cGUgZXh0ZW5kZWQgcGFydGl0aW9ucy4KKwkgKiBPbiB0aGUgc2Vjb25kIHBhc3MgbG9vayBpbnNpZGUgKkJTRCwgVW5peHdhcmUgYW5kIFNvbGFyaXMgcGFydGl0aW9ucy4KKwkgKi8KKworCXN0YXRlLT5uZXh0ID0gNTsKKwlmb3IgKHNsb3QgPSAxIDsgc2xvdCA8PSA0IDsgc2xvdCsrLCBwKyspIHsKKwkJdTMyIHN0YXJ0ID0gU1RBUlRfU0VDVChwKSpzZWN0b3Jfc2l6ZTsKKwkJdTMyIHNpemUgPSBOUl9TRUNUUyhwKSpzZWN0b3Jfc2l6ZTsKKwkJaWYgKFNZU19JTkQocCkgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXNpemUpCisJCQljb250aW51ZTsKKwkJaWYgKGlzX2V4dGVuZGVkX3BhcnRpdGlvbihwKSkgeworCQkJLyogcHJldmVudCBzb21lb25lIGRvaW5nIG1rZnMgb3IgbWtzd2FwIG9uIGFuCisJCQkgICBleHRlbmRlZCBwYXJ0aXRpb24sIGJ1dCBsZWF2ZSByb29tIGZvciBMSUxPICovCisJCQlwdXRfcGFydGl0aW9uKHN0YXRlLCBzbG90LCBzdGFydCwgc2l6ZSA9PSAxID8gMSA6IDIpOworCQkJcHJpbnRrKCIgPCIpOworCQkJcGFyc2VfZXh0ZW5kZWQoc3RhdGUsIGJkZXYsIHN0YXJ0LCBzaXplKTsKKwkJCXByaW50aygiID4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXB1dF9wYXJ0aXRpb24oc3RhdGUsIHNsb3QsIHN0YXJ0LCBzaXplKTsKKwkJaWYgKFNZU19JTkQocCkgPT0gTElOVVhfUkFJRF9QQVJUSVRJT04pCisJCQlzdGF0ZS0+cGFydHNbc2xvdF0uZmxhZ3MgPSAxOworCQlpZiAoU1lTX0lORChwKSA9PSBETTZfUEFSVElUSU9OKQorCQkJcHJpbnRrKCJbRE1dIik7CisJCWlmIChTWVNfSU5EKHApID09IEVaRF9QQVJUSVRJT04pCisJCQlwcmludGsoIltFWkRdIik7CisJfQorCisJcHJpbnRrKCJcbiIpOworCisJLyogc2Vjb25kIHBhc3MgLSBvdXRwdXQgZm9yIGVhY2ggb24gYSBzZXBhcmF0ZSBsaW5lICovCisJcCA9IChzdHJ1Y3QgcGFydGl0aW9uICopICgweDFiZSArIGRhdGEpOworCWZvciAoc2xvdCA9IDEgOyBzbG90IDw9IDQgOyBzbG90KyssIHArKykgeworCQl1bnNpZ25lZCBjaGFyIGlkID0gU1lTX0lORChwKTsKKwkJaW50IG47CisKKwkJaWYgKCFOUl9TRUNUUyhwKSkKKwkJCWNvbnRpbnVlOworCisJCWZvciAobiA9IDA7IHN1YnR5cGVzW25dLnBhcnNlICYmIGlkICE9IHN1YnR5cGVzW25dLmlkOyBuKyspCisJCQk7CisKKwkJaWYgKCFzdWJ0eXBlc1tuXS5wYXJzZSkKKwkJCWNvbnRpbnVlOworCQlzdWJ0eXBlc1tuXS5wYXJzZShzdGF0ZSwgYmRldiwgU1RBUlRfU0VDVChwKSpzZWN0b3Jfc2l6ZSwKKwkJCQkJCU5SX1NFQ1RTKHApKnNlY3Rvcl9zaXplLCBzbG90KTsKKwl9CisJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL21zZG9zLmggYi9mcy9wYXJ0aXRpb25zL21zZG9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlNWUwYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3BhcnRpdGlvbnMvbXNkb3MuaApAQCAtMCwwICsxLDggQEAKKy8qCisgKiAgZnMvcGFydGl0aW9ucy9tc2Rvcy5oCisgKi8KKworI2RlZmluZSBNU0RPU19MQUJFTF9NQUdJQwkJMHhBQTU1CisKK2ludCBtc2Rvc19wYXJ0aXRpb24oc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldik7CisKZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvb3NmLmMgYi9mcy9wYXJ0aXRpb25zL29zZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNWMxN2JjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvcGFydGl0aW9ucy9vc2YuYwpAQCAtMCwwICsxLDc4IEBACisvKgorICogIGZzL3BhcnRpdGlvbnMvb3NmLmMKKyAqCisgKiAgQ29kZSBleHRyYWN0ZWQgZnJvbSBkcml2ZXJzL2Jsb2NrL2dlbmhkLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLTE5OTggIExpbnVzIFRvcnZhbGRzCisgKiAgUmUtb3JnYW5pc2VkIEZlYiAxOTk4IFJ1c3NlbGwgS2luZworICovCisKKyNpbmNsdWRlICJjaGVjay5oIgorI2luY2x1ZGUgIm9zZi5oIgorCitpbnQgb3NmX3BhcnRpdGlvbihzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQoreworCWludCBpOworCWludCBzbG90ID0gMTsKKwlTZWN0b3Igc2VjdDsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworCXN0cnVjdCBkaXNrbGFiZWwgeworCQlfX2xlMzIgZF9tYWdpYzsKKwkJX19sZTE2IGRfdHlwZSxkX3N1YnR5cGU7CisJCXU4IGRfdHlwZW5hbWVbMTZdOworCQl1OCBkX3BhY2tuYW1lWzE2XTsKKwkJX19sZTMyIGRfc2Vjc2l6ZTsKKwkJX19sZTMyIGRfbnNlY3RvcnM7CisJCV9fbGUzMiBkX250cmFja3M7CisJCV9fbGUzMiBkX25jeWxpbmRlcnM7CisJCV9fbGUzMiBkX3NlY3BlcmN5bDsKKwkJX19sZTMyIGRfc2VjcHJ0dW5pdDsKKwkJX19sZTE2IGRfc3BhcmVzcGVydHJhY2s7CisJCV9fbGUxNiBkX3NwYXJlc3BlcmN5bDsKKwkJX19sZTMyIGRfYWN5bGluZGVyczsKKwkJX19sZTE2IGRfcnBtLCBkX2ludGVybGVhdmUsIGRfdHJhY2tza2V3LCBkX2N5bHNrZXc7CisJCV9fbGUzMiBkX2hlYWRzd2l0Y2gsIGRfdHJrc2VlaywgZF9mbGFnczsKKwkJX19sZTMyIGRfZHJpdmVkYXRhWzVdOworCQlfX2xlMzIgZF9zcGFyZVs1XTsKKwkJX19sZTMyIGRfbWFnaWMyOworCQlfX2xlMTYgZF9jaGVja3N1bTsKKwkJX19sZTE2IGRfbnBhcnRpdGlvbnM7CisJCV9fbGUzMiBkX2Jic2l6ZSwgZF9zYnNpemU7CisJCXN0cnVjdCBkX3BhcnRpdGlvbiB7CisJCQlfX2xlMzIgcF9zaXplOworCQkJX19sZTMyIHBfb2Zmc2V0OworCQkJX19sZTMyIHBfZnNpemU7CisJCQl1OCAgcF9mc3R5cGU7CisJCQl1OCAgcF9mcmFnOworCQkJX19sZTE2IHBfY3BnOworCQl9IGRfcGFydGl0aW9uc1s4XTsKKwl9ICogbGFiZWw7CisJc3RydWN0IGRfcGFydGl0aW9uICogcGFydGl0aW9uOworCisJZGF0YSA9IHJlYWRfZGV2X3NlY3RvcihiZGV2LCAwLCAmc2VjdCk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gLTE7CisKKwlsYWJlbCA9IChzdHJ1Y3QgZGlza2xhYmVsICopIChkYXRhKzY0KTsKKwlwYXJ0aXRpb24gPSBsYWJlbC0+ZF9wYXJ0aXRpb25zOworCWlmIChsZTMyX3RvX2NwdShsYWJlbC0+ZF9tYWdpYykgIT0gRElTS0xBQkVMTUFHSUMpIHsKKwkJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CisJCXJldHVybiAwOworCX0KKwlpZiAobGUzMl90b19jcHUobGFiZWwtPmRfbWFnaWMyKSAhPSBESVNLTEFCRUxNQUdJQykgeworCQlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKwkJcmV0dXJuIDA7CisJfQorCWZvciAoaSA9IDAgOyBpIDwgbGUxNl90b19jcHUobGFiZWwtPmRfbnBhcnRpdGlvbnMpOyBpKyssIHBhcnRpdGlvbisrKSB7CisJCWlmIChzbG90ID09IHN0YXRlLT5saW1pdCkKKwkJICAgICAgICBicmVhazsKKwkJaWYgKGxlMzJfdG9fY3B1KHBhcnRpdGlvbi0+cF9zaXplKSkKKwkJCXB1dF9wYXJ0aXRpb24oc3RhdGUsIHNsb3QsCisJCQkJbGUzMl90b19jcHUocGFydGl0aW9uLT5wX29mZnNldCksCisJCQkJbGUzMl90b19jcHUocGFydGl0aW9uLT5wX3NpemUpKTsKKwkJc2xvdCsrOworCX0KKwlwcmludGsoIlxuIik7CisJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL29zZi5oIGIvZnMvcGFydGl0aW9ucy9vc2YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjdiOGVhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvcGFydGl0aW9ucy9vc2YuaApAQCAtMCwwICsxLDcgQEAKKy8qCisgKiAgZnMvcGFydGl0aW9ucy9vc2YuaAorICovCisKKyNkZWZpbmUgRElTS0xBQkVMTUFHSUMgKDB4ODI1NjQ1NTdVTCkKKworaW50IG9zZl9wYXJ0aXRpb24oc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldik7CmRpZmYgLS1naXQgYS9mcy9wYXJ0aXRpb25zL3NnaS5jIGIvZnMvcGFydGl0aW9ucy9zZ2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmE0ZmY4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvcGFydGl0aW9ucy9zZ2kuYwpAQCAtMCwwICsxLDgyIEBACisvKgorICogIGZzL3BhcnRpdGlvbnMvc2dpLmMKKyAqCisgKiAgQ29kZSBleHRyYWN0ZWQgZnJvbSBkcml2ZXJzL2Jsb2NrL2dlbmhkLmMKKyAqLworCisjaW5jbHVkZSAiY2hlY2suaCIKKyNpbmNsdWRlICJzZ2kuaCIKKworc3RydWN0IHNnaV9kaXNrbGFiZWwgeworCV9fYmUzMiBtYWdpY19tdXNocm9vbTsJCS8qIEJpZyBmYXQgc3BsaWZmLi4uICovCisJX19iZTE2IHJvb3RfcGFydF9udW07CQkvKiBSb290IHBhcnRpdGlvbiBudW1iZXIgKi8KKwlfX2JlMTYgc3dhcF9wYXJ0X251bTsJCS8qIFN3YXAgcGFydGl0aW9uIG51bWJlciAqLworCXM4IGJvb3RfZmlsZVsxNl07CQkvKiBOYW1lIG9mIGJvb3QgZmlsZSBmb3IgQVJDUyAqLworCXU4IF91bnVzZWQwWzQ4XTsJCS8qIERldmljZSBwYXJhbWV0ZXIgdXNlbGVzcyBjcmFwb2xhLi4gKi8KKwlzdHJ1Y3Qgc2dpX3ZvbHVtZSB7CisJCXM4IG5hbWVbOF07CQkvKiBOYW1lIG9mIHZvbHVtZSAqLworCQlfX2JlMzIgYmxvY2tfbnVtOwkJLyogTG9naWNhbCBibG9jayBudW1iZXIgKi8KKwkJX19iZTMyIG51bV9ieXRlczsJCS8qIEhvdyBiaWcsIGluIGJ5dGVzICovCisJfSB2b2x1bWVbMTVdOworCXN0cnVjdCBzZ2lfcGFydGl0aW9uIHsKKwkJX19iZTMyIG51bV9ibG9ja3M7CQkvKiBTaXplIGluIGxvZ2ljYWwgYmxvY2tzICovCisJCV9fYmUzMiBmaXJzdF9ibG9jazsJLyogRmlyc3QgbG9naWNhbCBibG9jayAqLworCQlfX2JlMzIgdHlwZTsJCS8qIFR5cGUgb2YgdGhpcyBwYXJ0aXRpb24gKi8KKwl9IHBhcnRpdGlvbnNbMTZdOworCV9fYmUzMiBjc3VtOwkJCS8qIERpc2sgbGFiZWwgY2hlY2tzdW0gKi8KKwlfX2JlMzIgX3VudXNlZDE7CQkJLyogUGFkZGluZyAqLworfTsKKworaW50IHNnaV9wYXJ0aXRpb24oc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKK3sKKwlpbnQgaSwgY3N1bTsKKwlfX2JlMzIgbWFnaWM7CisJaW50IHNsb3QgPSAxOworCXVuc2lnbmVkIGludCBzdGFydCwgYmxvY2tzOworCV9fYmUzMiAqdWksIGNzOworCVNlY3RvciBzZWN0OworCXN0cnVjdCBzZ2lfZGlza2xhYmVsICpsYWJlbDsKKwlzdHJ1Y3Qgc2dpX3BhcnRpdGlvbiAqcDsKKwljaGFyIGJbQkRFVk5BTUVfU0laRV07CisKKwlsYWJlbCA9IChzdHJ1Y3Qgc2dpX2Rpc2tsYWJlbCAqKSByZWFkX2Rldl9zZWN0b3IoYmRldiwgMCwgJnNlY3QpOworCWlmICghbGFiZWwpCisJCXJldHVybiAtMTsKKwlwID0gJmxhYmVsLT5wYXJ0aXRpb25zWzBdOworCW1hZ2ljID0gbGFiZWwtPm1hZ2ljX211c2hyb29tOworCWlmKGJlMzJfdG9fY3B1KG1hZ2ljKSAhPSBTR0lfTEFCRUxfTUFHSUMpIHsKKwkJLypwcmludGsoIkRldiAlcyBTR0kgZGlza2xhYmVsOiBiYWQgbWFnaWMgJTA4eFxuIiwKKwkJICAgICAgIGJkZXZuYW1lKGJkZXYsIGIpLCBiZTMyX3RvX2NwdShtYWdpYykpOyovCisJCXB1dF9kZXZfc2VjdG9yKHNlY3QpOworCQlyZXR1cm4gMDsKKwl9CisJdWkgPSAoKF9fYmUzMiAqKSAobGFiZWwgKyAxKSkgLSAxOworCWZvcihjc3VtID0gMDsgdWkgPj0gKChfX2JlMzIgKikgbGFiZWwpOykgeworCQljcyA9ICp1aS0tOworCQljc3VtICs9IGJlMzJfdG9fY3B1KGNzKTsKKwl9CisJaWYoY3N1bSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJEZXYgJXMgU0dJIGRpc2tsYWJlbDogY3N1bSBiYWQsIGxhYmVsIGNvcnJ1cHRlZFxuIiwKKwkJICAgICAgIGJkZXZuYW1lKGJkZXYsIGIpKTsKKwkJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CisJCXJldHVybiAwOworCX0KKwkvKiBBbGwgU0dJIGRpc2sgbGFiZWxzIGhhdmUgMTYgcGFydGl0aW9ucywgZGlza3MgdW5kZXIgTGludXggb25seQorCSAqIGhhdmUgMTUgbWlub3Incy4gIEx1Y2tpbHkgdGhlcmUgYXJlIGFsd2F5cyBhIGZldyB6ZXJvIGxlbmd0aAorCSAqIHBhcnRpdGlvbnMgd2hpY2ggd2UgZG9uJ3QgY2FyZSBhYm91dCBzbyB3ZSBuZXZlciBvdmVyZmxvdyB0aGUKKwkgKiBjdXJyZW50X21pbm9yLgorCSAqLworCWZvcihpID0gMDsgaSA8IDE2OyBpKyssIHArKykgeworCQlibG9ja3MgPSBiZTMyX3RvX2NwdShwLT5udW1fYmxvY2tzKTsKKwkJc3RhcnQgID0gYmUzMl90b19jcHUocC0+Zmlyc3RfYmxvY2spOworCQlpZiAoYmxvY2tzKSB7CisJCQlwdXRfcGFydGl0aW9uKHN0YXRlLCBzbG90LCBzdGFydCwgYmxvY2tzKTsKKwkJCWlmIChiZTMyX3RvX2NwdShwLT50eXBlKSA9PSBMSU5VWF9SQUlEX1BBUlRJVElPTikKKwkJCQlzdGF0ZS0+cGFydHNbc2xvdF0uZmxhZ3MgPSAxOworCQl9CisJCXNsb3QrKzsKKwl9CisJcHJpbnRrKCJcbiIpOworCXB1dF9kZXZfc2VjdG9yKHNlY3QpOworCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9zZ2kuaCBiL2ZzL3BhcnRpdGlvbnMvc2dpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ1NTk1YwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3BhcnRpdGlvbnMvc2dpLmgKQEAgLTAsMCArMSw4IEBACisvKgorICogIGZzL3BhcnRpdGlvbnMvc2dpLmgKKyAqLworCitleHRlcm4gaW50IHNnaV9wYXJ0aXRpb24oc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldik7CisKKyNkZWZpbmUgU0dJX0xBQkVMX01BR0lDIDB4MGJlNWE5NDEKKwpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy9zdW4uYyBiL2ZzL3BhcnRpdGlvbnMvc3VuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJlOTFjYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3BhcnRpdGlvbnMvc3VuLmMKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqICBmcy9wYXJ0aXRpb25zL3N1bi5jCisgKgorICogIENvZGUgZXh0cmFjdGVkIGZyb20gZHJpdmVycy9ibG9jay9nZW5oZC5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MS0xOTk4ICBMaW51cyBUb3J2YWxkcworICogIFJlLW9yZ2FuaXNlZCBGZWIgMTk5OCBSdXNzZWxsIEtpbmcKKyAqLworCisjaW5jbHVkZSAiY2hlY2suaCIKKyNpbmNsdWRlICJzdW4uaCIKKworaW50IHN1bl9wYXJ0aXRpb24oc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKK3sKKwlpbnQgaTsKKwlfX2JlMTYgY3N1bTsKKwlpbnQgc2xvdCA9IDE7CisJX19iZTE2ICp1c2g7CisJU2VjdG9yIHNlY3Q7CisJc3RydWN0IHN1bl9kaXNrbGFiZWwgeworCQl1bnNpZ25lZCBjaGFyIGluZm9bMTI4XTsgICAvKiBJbmZvcm1hdGl2ZSB0ZXh0IHN0cmluZyAqLworCQl1bnNpZ25lZCBjaGFyIHNwYXJlMFsxNF07CisJCXN0cnVjdCBzdW5faW5mbyB7CisJCQl1bnNpZ25lZCBjaGFyIHNwYXJlMTsKKwkJCXVuc2lnbmVkIGNoYXIgaWQ7CisJCQl1bnNpZ25lZCBjaGFyIHNwYXJlMjsKKwkJCXVuc2lnbmVkIGNoYXIgZmxhZ3M7CisJCX0gaW5mb3NbOF07CisJCXVuc2lnbmVkIGNoYXIgc3BhcmVbMjQ2XTsgIC8qIEJvb3QgaW5mb3JtYXRpb24gZXRjLiAqLworCQlfX2JlMTYgcnNwZWVkOyAgICAgLyogRGlzayByb3RhdGlvbmFsIHNwZWVkICovCisJCV9fYmUxNiBwY3lsY291bnQ7ICAvKiBQaHlzaWNhbCBjeWxpbmRlciBjb3VudCAqLworCQlfX2JlMTYgc3BhcmVjeWw7ICAgLyogZXh0cmEgc2VjdHMgcGVyIGN5bGluZGVyICovCisJCXVuc2lnbmVkIGNoYXIgc3BhcmUyWzRdOyAgIC8qIE1vcmUgbWFnaWMuLi4gKi8KKwkJX19iZTE2IGlsZmFjdDsgICAgIC8qIEludGVybGVhdmUgZmFjdG9yICovCisJCV9fYmUxNiBuY3lsOyAgICAgICAvKiBEYXRhIGN5bGluZGVyIGNvdW50ICovCisJCV9fYmUxNiBuYWN5bDsgICAgICAvKiBBbHQuIGN5bGluZGVyIGNvdW50ICovCisJCV9fYmUxNiBudHJrczsgICAgICAvKiBUcmFja3MgcGVyIGN5bGluZGVyICovCisJCV9fYmUxNiBuc2VjdDsgICAgICAvKiBTZWN0b3JzIHBlciB0cmFjayAqLworCQl1bnNpZ25lZCBjaGFyIHNwYXJlM1s0XTsgICAvKiBFdmVuIG1vcmUgbWFnaWMuLi4gKi8KKwkJc3RydWN0IHN1bl9wYXJ0aXRpb24geworCQkJX19iZTMyIHN0YXJ0X2N5bGluZGVyOworCQkJX19iZTMyIG51bV9zZWN0b3JzOworCQl9IHBhcnRpdGlvbnNbOF07CisJCV9fYmUxNiBtYWdpYzsgICAgICAvKiBNYWdpYyBudW1iZXIgKi8KKwkJX19iZTE2IGNzdW07ICAgICAgIC8qIExhYmVsIHhvcidkIGNoZWNrc3VtICovCisJfSAqIGxhYmVsOwkJCisJc3RydWN0IHN1bl9wYXJ0aXRpb24gKnA7CisJdW5zaWduZWQgbG9uZyBzcGM7CisJY2hhciBiW0JERVZOQU1FX1NJWkVdOworCisJbGFiZWwgPSAoc3RydWN0IHN1bl9kaXNrbGFiZWwgKilyZWFkX2Rldl9zZWN0b3IoYmRldiwgMCwgJnNlY3QpOworCWlmICghbGFiZWwpCisJCXJldHVybiAtMTsKKworCXAgPSBsYWJlbC0+cGFydGl0aW9uczsKKwlpZiAoYmUxNl90b19jcHUobGFiZWwtPm1hZ2ljKSAhPSBTVU5fTEFCRUxfTUFHSUMpIHsKKy8qCQlwcmludGsoS0VSTl9JTkZPICJEZXYgJXMgU3VuIGRpc2tsYWJlbDogYmFkIG1hZ2ljICUwNHhcbiIsCisJCSAgICAgICBiZGV2bmFtZShiZGV2LCBiKSwgYmUxNl90b19jcHUobGFiZWwtPm1hZ2ljKSk7ICovCisJCXB1dF9kZXZfc2VjdG9yKHNlY3QpOworCQlyZXR1cm4gMDsKKwl9CisJLyogTG9vayBhdCB0aGUgY2hlY2tzdW0gKi8KKwl1c2ggPSAoKF9fYmUxNiAqKSAobGFiZWwrMSkpIC0gMTsKKwlmb3IgKGNzdW0gPSAwOyB1c2ggPj0gKChfX2JlMTYgKikgbGFiZWwpOykKKwkJY3N1bSBePSAqdXNoLS07CisJaWYgKGNzdW0pIHsKKwkJcHJpbnRrKCJEZXYgJXMgU3VuIGRpc2tsYWJlbDogQ3N1bSBiYWQsIGxhYmVsIGNvcnJ1cHRlZFxuIiwKKwkJICAgICAgIGJkZXZuYW1lKGJkZXYsIGIpKTsKKwkJcHV0X2Rldl9zZWN0b3Ioc2VjdCk7CisJCXJldHVybiAwOworCX0KKworCS8qIEFsbCBTdW4gZGlza3MgaGF2ZSA4IHBhcnRpdGlvbiBlbnRyaWVzICovCisJc3BjID0gYmUxNl90b19jcHUobGFiZWwtPm50cmtzKSAqIGJlMTZfdG9fY3B1KGxhYmVsLT5uc2VjdCk7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKywgcCsrKSB7CisJCXVuc2lnbmVkIGxvbmcgc3Rfc2VjdG9yOworCQlpbnQgbnVtX3NlY3RvcnM7CisKKwkJc3Rfc2VjdG9yID0gYmUzMl90b19jcHUocC0+c3RhcnRfY3lsaW5kZXIpICogc3BjOworCQludW1fc2VjdG9ycyA9IGJlMzJfdG9fY3B1KHAtPm51bV9zZWN0b3JzKTsKKwkJaWYgKG51bV9zZWN0b3JzKSB7CisJCQlwdXRfcGFydGl0aW9uKHN0YXRlLCBzbG90LCBzdF9zZWN0b3IsIG51bV9zZWN0b3JzKTsKKwkJCWlmIChsYWJlbC0+aW5mb3NbaV0uaWQgPT0gTElOVVhfUkFJRF9QQVJUSVRJT04pCisJCQkJc3RhdGUtPnBhcnRzW3Nsb3RdLmZsYWdzID0gMTsKKwkJfQorCQlzbG90Kys7CisJfQorCXByaW50aygiXG4iKTsKKwlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL2ZzL3BhcnRpdGlvbnMvc3VuLmggYi9mcy9wYXJ0aXRpb25zL3N1bi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYjE5ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wYXJ0aXRpb25zL3N1bi5oCkBAIC0wLDAgKzEsNyBAQAorLyoKKyAqICBmcy9wYXJ0aXRpb25zL3N1bi5oCisgKi8KKworI2RlZmluZSBTVU5fTEFCRUxfTUFHSUMgICAgICAgICAgMHhEQUJFCisKK2ludCBzdW5fcGFydGl0aW9uKHN0cnVjdCBwYXJzZWRfcGFydGl0aW9ucyAqc3RhdGUsIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpOwpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy91bHRyaXguYyBiL2ZzL3BhcnRpdGlvbnMvdWx0cml4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE4ZDRkOQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3BhcnRpdGlvbnMvdWx0cml4LmMKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqICBmcy9wYXJ0aXRpb25zL3VsdHJpeC5jCisgKgorICogIENvZGUgZXh0cmFjdGVkIGZyb20gZHJpdmVycy9ibG9jay9nZW5oZC5jCisgKgorICogIFJlLW9yZ2FuaXNlZCBKdWwgMTk5OSBSdXNzZWxsIEtpbmcKKyAqLworCisjaW5jbHVkZSAiY2hlY2suaCIKKworaW50IHVsdHJpeF9wYXJ0aXRpb24oc3RydWN0IHBhcnNlZF9wYXJ0aXRpb25zICpzdGF0ZSwgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKK3sKKwlpbnQgaTsKKwlTZWN0b3Igc2VjdDsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworCXN0cnVjdCB1bHRyaXhfZGlza2xhYmVsIHsKKwkJczMyCXB0X21hZ2ljOwkvKiBtYWdpYyBuby4gaW5kaWNhdGluZyBwYXJ0LiBpbmZvIGV4aXRzICovCisJCXMzMglwdF92YWxpZDsJLyogc2V0IGJ5IGRyaXZlciBpZiBwdCBpcyBjdXJyZW50ICovCisJCXN0cnVjdCAgcHRfaW5mbyB7CisJCQlzMzIJCXBpX25ibG9ja3M7IC8qIG5vLiBvZiBzZWN0b3JzICovCisJCQl1MzIJCXBpX2Jsa29mZjsgIC8qIGJsb2NrIG9mZnNldCBmb3Igc3RhcnQgKi8KKwkJfSBwdF9wYXJ0WzhdOworCX0gKmxhYmVsOworCisjZGVmaW5lIFBUX01BR0lDCTB4MDMyOTU3CS8qIFBhcnRpdGlvbiBtYWdpYyBudW1iZXIgKi8KKyNkZWZpbmUgUFRfVkFMSUQJMQkJLyogSW5kaWNhdGVzIGlmIHN0cnVjdCBpcyB2YWxpZCAqLworCisJZGF0YSA9IHJlYWRfZGV2X3NlY3RvcihiZGV2LCAoMTYzODQgLSBzaXplb2YoKmxhYmVsKSkvNTEyLCAmc2VjdCk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gLTE7CisJCisJbGFiZWwgPSAoc3RydWN0IHVsdHJpeF9kaXNrbGFiZWwgKikoZGF0YSArIDUxMiAtIHNpemVvZigqbGFiZWwpKTsKKworCWlmIChsYWJlbC0+cHRfbWFnaWMgPT0gUFRfTUFHSUMgJiYgbGFiZWwtPnB0X3ZhbGlkID09IFBUX1ZBTElEKSB7CisJCWZvciAoaT0wOyBpPDg7IGkrKykKKwkJCWlmIChsYWJlbC0+cHRfcGFydFtpXS5waV9uYmxvY2tzKQorCQkJCXB1dF9wYXJ0aXRpb24oc3RhdGUsIGkrMSwgCisJCQkJCSAgICAgIGxhYmVsLT5wdF9wYXJ0W2ldLnBpX2Jsa29mZiwKKwkJCQkJICAgICAgbGFiZWwtPnB0X3BhcnRbaV0ucGlfbmJsb2Nrcyk7CisJCXB1dF9kZXZfc2VjdG9yKHNlY3QpOworCQlwcmludGsgKCJcbiIpOworCQlyZXR1cm4gMTsKKwl9IGVsc2UgeworCQlwdXRfZGV2X3NlY3RvcihzZWN0KTsKKwkJcmV0dXJuIDA7CisJfQorfQpkaWZmIC0tZ2l0IGEvZnMvcGFydGl0aW9ucy91bHRyaXguaCBiL2ZzL3BhcnRpdGlvbnMvdWx0cml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc0YmY4ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3BhcnRpdGlvbnMvdWx0cml4LmgKQEAgLTAsMCArMSw1IEBACisvKgorICogIGZzL3BhcnRpdGlvbnMvdWx0cml4LmgKKyAqLworCitpbnQgdWx0cml4X3BhcnRpdGlvbihzdHJ1Y3QgcGFyc2VkX3BhcnRpdGlvbnMgKnN0YXRlLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KTsKZGlmZiAtLWdpdCBhL2ZzL3BpcGUuYyBiL2ZzL3BpcGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWFhMDlmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvcGlwZS5jCkBAIC0wLDAgKzEsODM1IEBACisvKgorICogIGxpbnV4L2ZzL3BpcGUuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIsIDE5OTkgIExpbnVzIFRvcnZhbGRzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9waXBlX2ZzX2kuaD4KKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KKworLyoKKyAqIFdlIHVzZSBhIHN0YXJ0K2xlbiBjb25zdHJ1Y3Rpb24sIHdoaWNoIHByb3ZpZGVzIGZ1bGwgdXNlIG9mIHRoZSAKKyAqIGFsbG9jYXRlZCBtZW1vcnkuCisgKiAtLSBGbG9yaWFuIENvb3NtYW5uIChGR0MpCisgKiAKKyAqIFJlYWRzIHdpdGggY291bnQgPSAwIHNob3VsZCBhbHdheXMgcmV0dXJuIDAuCisgKiAtLSBKdWxpYW4gQnJhZGZpZWxkIDE5OTktMDYtMDcuCisgKgorICogRklGT3MgYW5kIFBpcGVzIG5vdyBnZW5lcmF0ZSBTSUdJTyBmb3IgYm90aCByZWFkZXJzIGFuZCB3cml0ZXJzLgorICogLS0gSmVyZW15IEVsc29uIDxqZWxzb25AY2lyY2xlbXVkLm9yZz4gMjAwMS0wOC0xNgorICoKKyAqIHBpcGVfcmVhZCAmIHdyaXRlIGNsZWFudXAKKyAqIC0tIE1hbmZyZWQgU3ByYXVsIDxtYW5mcmVkQGNvbG9yZnVsbGlmZS5jb20+IDIwMDItMDUtMDkKKyAqLworCisvKiBEcm9wIHRoZSBpbm9kZSBzZW1hcGhvcmUgYW5kIHdhaXQgZm9yIGEgcGlwZSBldmVudCwgYXRvbWljYWxseSAqLwordm9pZCBwaXBlX3dhaXQoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJREVGSU5FX1dBSVQod2FpdCk7CisKKwlwcmVwYXJlX3RvX3dhaXQoUElQRV9XQUlUKCppbm9kZSksICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOworCXVwKFBJUEVfU0VNKCppbm9kZSkpOworCXNjaGVkdWxlKCk7CisJZmluaXNoX3dhaXQoUElQRV9XQUlUKCppbm9kZSksICZ3YWl0KTsKKwlkb3duKFBJUEVfU0VNKCppbm9kZSkpOworfQorCitzdGF0aWMgaW5saW5lIGludAorcGlwZV9pb3ZfY29weV9mcm9tX3VzZXIodm9pZCAqdG8sIHN0cnVjdCBpb3ZlYyAqaW92LCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwl1bnNpZ25lZCBsb25nIGNvcHk7CisKKwl3aGlsZSAobGVuID4gMCkgeworCQl3aGlsZSAoIWlvdi0+aW92X2xlbikKKwkJCWlvdisrOworCQljb3B5ID0gbWluX3QodW5zaWduZWQgbG9uZywgbGVuLCBpb3YtPmlvdl9sZW4pOworCisJCWlmIChjb3B5X2Zyb21fdXNlcih0bywgaW92LT5pb3ZfYmFzZSwgY29weSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJdG8gKz0gY29weTsKKwkJbGVuIC09IGNvcHk7CisJCWlvdi0+aW92X2Jhc2UgKz0gY29weTsKKwkJaW92LT5pb3ZfbGVuIC09IGNvcHk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAorcGlwZV9pb3ZfY29weV90b191c2VyKHN0cnVjdCBpb3ZlYyAqaW92LCBjb25zdCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwl1bnNpZ25lZCBsb25nIGNvcHk7CisKKwl3aGlsZSAobGVuID4gMCkgeworCQl3aGlsZSAoIWlvdi0+aW92X2xlbikKKwkJCWlvdisrOworCQljb3B5ID0gbWluX3QodW5zaWduZWQgbG9uZywgbGVuLCBpb3YtPmlvdl9sZW4pOworCisJCWlmIChjb3B5X3RvX3VzZXIoaW92LT5pb3ZfYmFzZSwgZnJvbSwgY29weSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJZnJvbSArPSBjb3B5OworCQlsZW4gLT0gY29weTsKKwkJaW92LT5pb3ZfYmFzZSArPSBjb3B5OworCQlpb3YtPmlvdl9sZW4gLT0gY29weTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFub25fcGlwZV9idWZfcmVsZWFzZShzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICppbmZvLCBzdHJ1Y3QgcGlwZV9idWZmZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGJ1Zi0+cGFnZTsKKworCWlmIChpbmZvLT50bXBfcGFnZSkgeworCQlfX2ZyZWVfcGFnZShwYWdlKTsKKwkJcmV0dXJuOworCX0KKwlpbmZvLT50bXBfcGFnZSA9IHBhZ2U7Cit9CisKK3N0YXRpYyB2b2lkICphbm9uX3BpcGVfYnVmX21hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqaW5mbywgc3RydWN0IHBpcGVfYnVmZmVyICpidWYpCit7CisJcmV0dXJuIGttYXAoYnVmLT5wYWdlKTsKK30KKworc3RhdGljIHZvaWQgYW5vbl9waXBlX2J1Zl91bm1hcChzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICppbmZvLCBzdHJ1Y3QgcGlwZV9idWZmZXIgKmJ1ZikKK3sKKwlrdW5tYXAoYnVmLT5wYWdlKTsKK30KKworc3RhdGljIHN0cnVjdCBwaXBlX2J1Zl9vcGVyYXRpb25zIGFub25fcGlwZV9idWZfb3BzID0geworCS5jYW5fbWVyZ2UgPSAxLAorCS5tYXAgPSBhbm9uX3BpcGVfYnVmX21hcCwKKwkudW5tYXAgPSBhbm9uX3BpcGVfYnVmX3VubWFwLAorCS5yZWxlYXNlID0gYW5vbl9waXBlX2J1Zl9yZWxlYXNlLAorfTsKKworc3RhdGljIHNzaXplX3QKK3BpcGVfcmVhZHYoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqX2lvdiwKKwkgICB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqaW5mbzsKKwlpbnQgZG9fd2FrZXVwOworCXNzaXplX3QgcmV0OworCXN0cnVjdCBpb3ZlYyAqaW92ID0gKHN0cnVjdCBpb3ZlYyAqKV9pb3Y7CisJc2l6ZV90IHRvdGFsX2xlbjsKKworCXRvdGFsX2xlbiA9IGlvdl9sZW5ndGgoaW92LCBucl9zZWdzKTsKKwkvKiBOdWxsIHJlYWQgc3VjY2VlZHMuICovCisJaWYgKHVubGlrZWx5KHRvdGFsX2xlbiA9PSAwKSkKKwkJcmV0dXJuIDA7CisKKwlkb193YWtldXAgPSAwOworCXJldCA9IDA7CisJZG93bihQSVBFX1NFTSgqaW5vZGUpKTsKKwlpbmZvID0gaW5vZGUtPmlfcGlwZTsKKwlmb3IgKDs7KSB7CisJCWludCBidWZzID0gaW5mby0+bnJidWZzOworCQlpZiAoYnVmcykgeworCQkJaW50IGN1cmJ1ZiA9IGluZm8tPmN1cmJ1ZjsKKwkJCXN0cnVjdCBwaXBlX2J1ZmZlciAqYnVmID0gaW5mby0+YnVmcyArIGN1cmJ1ZjsKKwkJCXN0cnVjdCBwaXBlX2J1Zl9vcGVyYXRpb25zICpvcHMgPSBidWYtPm9wczsKKwkJCXZvaWQgKmFkZHI7CisJCQlzaXplX3QgY2hhcnMgPSBidWYtPmxlbjsKKwkJCWludCBlcnJvcjsKKworCQkJaWYgKGNoYXJzID4gdG90YWxfbGVuKQorCQkJCWNoYXJzID0gdG90YWxfbGVuOworCisJCQlhZGRyID0gb3BzLT5tYXAoZmlscCwgaW5mbywgYnVmKTsKKwkJCWVycm9yID0gcGlwZV9pb3ZfY29weV90b191c2VyKGlvdiwgYWRkciArIGJ1Zi0+b2Zmc2V0LCBjaGFycyk7CisJCQlvcHMtPnVubWFwKGluZm8sIGJ1Zik7CisJCQlpZiAodW5saWtlbHkoZXJyb3IpKSB7CisJCQkJaWYgKCFyZXQpIHJldCA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisJCQlyZXQgKz0gY2hhcnM7CisJCQlidWYtPm9mZnNldCArPSBjaGFyczsKKwkJCWJ1Zi0+bGVuIC09IGNoYXJzOworCQkJaWYgKCFidWYtPmxlbikgeworCQkJCWJ1Zi0+b3BzID0gTlVMTDsKKwkJCQlvcHMtPnJlbGVhc2UoaW5mbywgYnVmKTsKKwkJCQljdXJidWYgPSAoY3VyYnVmICsgMSkgJiAoUElQRV9CVUZGRVJTLTEpOworCQkJCWluZm8tPmN1cmJ1ZiA9IGN1cmJ1ZjsKKwkJCQlpbmZvLT5ucmJ1ZnMgPSAtLWJ1ZnM7CisJCQkJZG9fd2FrZXVwID0gMTsKKwkJCX0KKwkJCXRvdGFsX2xlbiAtPSBjaGFyczsKKwkJCWlmICghdG90YWxfbGVuKQorCQkJCWJyZWFrOwkvKiBjb21tb24gcGF0aDogcmVhZCBzdWNjZWVkZWQgKi8KKwkJfQorCQlpZiAoYnVmcykJLyogTW9yZSB0byBkbz8gKi8KKwkJCWNvbnRpbnVlOworCQlpZiAoIVBJUEVfV1JJVEVSUygqaW5vZGUpKQorCQkJYnJlYWs7CisJCWlmICghUElQRV9XQUlUSU5HX1dSSVRFUlMoKmlub2RlKSkgeworCQkJLyogc3lzY2FsbCBtZXJnaW5nOiBVc3VhbGx5IHdlIG11c3Qgbm90IHNsZWVwCisJCQkgKiBpZiBPX05PTkJMT0NLIGlzIHNldCwgb3IgaWYgd2UgZ290IHNvbWUgZGF0YS4KKwkJCSAqIEJ1dCBpZiBhIHdyaXRlciBzbGVlcHMgaW4ga2VybmVsIHNwYWNlLCB0aGVuCisJCQkgKiB3ZSBjYW4gd2FpdCBmb3IgdGhhdCBkYXRhIHdpdGhvdXQgdmlvbGF0aW5nIFBPU0lYLgorCQkJICovCisJCQlpZiAocmV0KQorCQkJCWJyZWFrOworCQkJaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCWlmICghcmV0KSByZXQgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZG9fd2FrZXVwKSB7CisJCQl3YWtlX3VwX2ludGVycnVwdGlibGVfc3luYyhQSVBFX1dBSVQoKmlub2RlKSk7CisgCQkJa2lsbF9mYXN5bmMoUElQRV9GQVNZTkNfV1JJVEVSUygqaW5vZGUpLCBTSUdJTywgUE9MTF9PVVQpOworCQl9CisJCXBpcGVfd2FpdChpbm9kZSk7CisJfQorCXVwKFBJUEVfU0VNKCppbm9kZSkpOworCS8qIFNpZ25hbCB3cml0ZXJzIGFzeW5jaHJvbm91c2x5IHRoYXQgdGhlcmUgaXMgbW9yZSByb29tLiAgKi8KKwlpZiAoZG9fd2FrZXVwKSB7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZShQSVBFX1dBSVQoKmlub2RlKSk7CisJCWtpbGxfZmFzeW5jKFBJUEVfRkFTWU5DX1dSSVRFUlMoKmlub2RlKSwgU0lHSU8sIFBPTExfT1VUKTsKKwl9CisJaWYgKHJldCA+IDApCisJCWZpbGVfYWNjZXNzZWQoZmlscCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QKK3BpcGVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlvdmVjIGlvdiA9IHsgLmlvdl9iYXNlID0gYnVmLCAuaW92X2xlbiA9IGNvdW50IH07CisJcmV0dXJuIHBpcGVfcmVhZHYoZmlscCwgJmlvdiwgMSwgcHBvcyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitwaXBlX3dyaXRldihzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3Qgc3RydWN0IGlvdmVjICpfaW92LAorCSAgICB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqaW5mbzsKKwlzc2l6ZV90IHJldDsKKwlpbnQgZG9fd2FrZXVwOworCXN0cnVjdCBpb3ZlYyAqaW92ID0gKHN0cnVjdCBpb3ZlYyAqKV9pb3Y7CisJc2l6ZV90IHRvdGFsX2xlbjsKKwlzc2l6ZV90IGNoYXJzOworCisJdG90YWxfbGVuID0gaW92X2xlbmd0aChpb3YsIG5yX3NlZ3MpOworCS8qIE51bGwgd3JpdGUgc3VjY2VlZHMuICovCisJaWYgKHVubGlrZWx5KHRvdGFsX2xlbiA9PSAwKSkKKwkJcmV0dXJuIDA7CisKKwlkb193YWtldXAgPSAwOworCXJldCA9IDA7CisJZG93bihQSVBFX1NFTSgqaW5vZGUpKTsKKwlpbmZvID0gaW5vZGUtPmlfcGlwZTsKKworCWlmICghUElQRV9SRUFERVJTKCppbm9kZSkpIHsKKwkJc2VuZF9zaWcoU0lHUElQRSwgY3VycmVudCwgMCk7CisJCXJldCA9IC1FUElQRTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogV2UgdHJ5IHRvIG1lcmdlIHNtYWxsIHdyaXRlcyAqLworCWNoYXJzID0gdG90YWxfbGVuICYgKFBBR0VfU0laRS0xKTsgLyogc2l6ZSBvZiB0aGUgbGFzdCBidWZmZXIgKi8KKwlpZiAoaW5mby0+bnJidWZzICYmIGNoYXJzICE9IDApIHsKKwkJaW50IGxhc3RidWYgPSAoaW5mby0+Y3VyYnVmICsgaW5mby0+bnJidWZzIC0gMSkgJiAoUElQRV9CVUZGRVJTLTEpOworCQlzdHJ1Y3QgcGlwZV9idWZmZXIgKmJ1ZiA9IGluZm8tPmJ1ZnMgKyBsYXN0YnVmOworCQlzdHJ1Y3QgcGlwZV9idWZfb3BlcmF0aW9ucyAqb3BzID0gYnVmLT5vcHM7CisJCWludCBvZmZzZXQgPSBidWYtPm9mZnNldCArIGJ1Zi0+bGVuOworCQlpZiAob3BzLT5jYW5fbWVyZ2UgJiYgb2Zmc2V0ICsgY2hhcnMgPD0gUEFHRV9TSVpFKSB7CisJCQl2b2lkICphZGRyID0gb3BzLT5tYXAoZmlscCwgaW5mbywgYnVmKTsKKwkJCWludCBlcnJvciA9IHBpcGVfaW92X2NvcHlfZnJvbV91c2VyKG9mZnNldCArIGFkZHIsIGlvdiwgY2hhcnMpOworCQkJb3BzLT51bm1hcChpbmZvLCBidWYpOworCQkJcmV0ID0gZXJyb3I7CisJCQlkb193YWtldXAgPSAxOworCQkJaWYgKGVycm9yKQorCQkJCWdvdG8gb3V0OworCQkJYnVmLT5sZW4gKz0gY2hhcnM7CisJCQl0b3RhbF9sZW4gLT0gY2hhcnM7CisJCQlyZXQgPSBjaGFyczsKKwkJCWlmICghdG90YWxfbGVuKQorCQkJCWdvdG8gb3V0OworCQl9CisJfQorCisJZm9yICg7OykgeworCQlpbnQgYnVmczsKKwkJaWYgKCFQSVBFX1JFQURFUlMoKmlub2RlKSkgeworCQkJc2VuZF9zaWcoU0lHUElQRSwgY3VycmVudCwgMCk7CisJCQlpZiAoIXJldCkgcmV0ID0gLUVQSVBFOworCQkJYnJlYWs7CisJCX0KKwkJYnVmcyA9IGluZm8tPm5yYnVmczsKKwkJaWYgKGJ1ZnMgPCBQSVBFX0JVRkZFUlMpIHsKKwkJCWludCBuZXdidWYgPSAoaW5mby0+Y3VyYnVmICsgYnVmcykgJiAoUElQRV9CVUZGRVJTLTEpOworCQkJc3RydWN0IHBpcGVfYnVmZmVyICpidWYgPSBpbmZvLT5idWZzICsgbmV3YnVmOworCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBpbmZvLT50bXBfcGFnZTsKKwkJCWludCBlcnJvcjsKKworCQkJaWYgKCFwYWdlKSB7CisJCQkJcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0hJR0hVU0VSKTsKKwkJCQlpZiAodW5saWtlbHkoIXBhZ2UpKSB7CisJCQkJCXJldCA9IHJldCA/IDogLUVOT01FTTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWluZm8tPnRtcF9wYWdlID0gcGFnZTsKKwkJCX0KKwkJCS8qIEFsd2F5cyB3YWtldXAsIGV2ZW4gaWYgdGhlIGNvcHkgZmFpbHMuIE90aGVyd2lzZQorCQkJICogd2UgbG9jayB1cCAoT19OT05CTE9DSy0pcmVhZGVycyB0aGF0IHNsZWVwIGR1ZSB0bworCQkJICogc3lzY2FsbCBtZXJnaW5nLgorCQkJICogRklYTUUhIElzIHRoaXMgcmVhbGx5IHRydWU/CisJCQkgKi8KKwkJCWRvX3dha2V1cCA9IDE7CisJCQljaGFycyA9IFBBR0VfU0laRTsKKwkJCWlmIChjaGFycyA+IHRvdGFsX2xlbikKKwkJCQljaGFycyA9IHRvdGFsX2xlbjsKKworCQkJZXJyb3IgPSBwaXBlX2lvdl9jb3B5X2Zyb21fdXNlcihrbWFwKHBhZ2UpLCBpb3YsIGNoYXJzKTsKKwkJCWt1bm1hcChwYWdlKTsKKwkJCWlmICh1bmxpa2VseShlcnJvcikpIHsKKwkJCQlpZiAoIXJldCkgcmV0ID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXJldCArPSBjaGFyczsKKworCQkJLyogSW5zZXJ0IGl0IGludG8gdGhlIGJ1ZmZlciBhcnJheSAqLworCQkJYnVmLT5wYWdlID0gcGFnZTsKKwkJCWJ1Zi0+b3BzID0gJmFub25fcGlwZV9idWZfb3BzOworCQkJYnVmLT5vZmZzZXQgPSAwOworCQkJYnVmLT5sZW4gPSBjaGFyczsKKwkJCWluZm8tPm5yYnVmcyA9ICsrYnVmczsKKwkJCWluZm8tPnRtcF9wYWdlID0gTlVMTDsKKworCQkJdG90YWxfbGVuIC09IGNoYXJzOworCQkJaWYgKCF0b3RhbF9sZW4pCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKGJ1ZnMgPCBQSVBFX0JVRkZFUlMpCisJCQljb250aW51ZTsKKwkJaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQlpZiAoIXJldCkgcmV0ID0gLUVBR0FJTjsKKwkJCWJyZWFrOworCQl9CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJaWYgKCFyZXQpIHJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisJCWlmIChkb193YWtldXApIHsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZV9zeW5jKFBJUEVfV0FJVCgqaW5vZGUpKTsKKwkJCWtpbGxfZmFzeW5jKFBJUEVfRkFTWU5DX1JFQURFUlMoKmlub2RlKSwgU0lHSU8sIFBPTExfSU4pOworCQkJZG9fd2FrZXVwID0gMDsKKwkJfQorCQlQSVBFX1dBSVRJTkdfV1JJVEVSUygqaW5vZGUpKys7CisJCXBpcGVfd2FpdChpbm9kZSk7CisJCVBJUEVfV0FJVElOR19XUklURVJTKCppbm9kZSktLTsKKwl9CitvdXQ6CisJdXAoUElQRV9TRU0oKmlub2RlKSk7CisJaWYgKGRvX3dha2V1cCkgeworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoUElQRV9XQUlUKCppbm9kZSkpOworCQlraWxsX2Zhc3luYyhQSVBFX0ZBU1lOQ19SRUFERVJTKCppbm9kZSksIFNJR0lPLCBQT0xMX0lOKTsKKwl9CisJaWYgKHJldCA+IDApCisJCWlub2RlX3VwZGF0ZV90aW1lKGlub2RlLCAxKTsJLyogbXRpbWUgYW5kIGN0aW1lICovCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QKK3BpcGVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlvdmVjIGlvdiA9IHsgLmlvdl9iYXNlID0gKHZvaWQgX191c2VyICopYnVmLCAuaW92X2xlbiA9IGNvdW50IH07CisJcmV0dXJuIHBpcGVfd3JpdGV2KGZpbHAsICZpb3YsIDEsIHBwb3MpOworfQorCitzdGF0aWMgc3NpemVfdAorYmFkX3BpcGVfcihzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJcmV0dXJuIC1FQkFERjsKK30KKworc3RhdGljIHNzaXplX3QKK2JhZF9waXBlX3coc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXJldHVybiAtRUJBREY7Cit9CisKK3N0YXRpYyBpbnQKK3BpcGVfaW9jdGwoc3RydWN0IGlub2RlICpwaW5vLCBzdHJ1Y3QgZmlsZSAqZmlscCwKKwkgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqaW5mbzsKKwlpbnQgY291bnQsIGJ1ZiwgbnJidWZzOworCisJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBGSU9OUkVBRDoKKwkJCWRvd24oUElQRV9TRU0oKmlub2RlKSk7CisJCQlpbmZvID0gIGlub2RlLT5pX3BpcGU7CisJCQljb3VudCA9IDA7CisJCQlidWYgPSBpbmZvLT5jdXJidWY7CisJCQlucmJ1ZnMgPSBpbmZvLT5ucmJ1ZnM7CisJCQl3aGlsZSAoLS1ucmJ1ZnMgPj0gMCkgeworCQkJCWNvdW50ICs9IGluZm8tPmJ1ZnNbYnVmXS5sZW47CisJCQkJYnVmID0gKGJ1ZisxKSAmIChQSVBFX0JVRkZFUlMtMSk7CisJCQl9CisJCQl1cChQSVBFX1NFTSgqaW5vZGUpKTsKKwkJCXJldHVybiBwdXRfdXNlcihjb3VudCwgKGludCBfX3VzZXIgKilhcmcpOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCisvKiBObyBrZXJuZWwgbG9jayBoZWxkIC0gZmluZSAqLworc3RhdGljIHVuc2lnbmVkIGludAorcGlwZV9wb2xsKHN0cnVjdCBmaWxlICpmaWxwLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXVuc2lnbmVkIGludCBtYXNrOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICppbmZvID0gaW5vZGUtPmlfcGlwZTsKKwlpbnQgbnJidWZzOworCisJcG9sbF93YWl0KGZpbHAsIFBJUEVfV0FJVCgqaW5vZGUpLCB3YWl0KTsKKworCS8qIFJlYWRpbmcgb25seSAtLSBubyBuZWVkIGZvciBhY3F1aXJpbmcgdGhlIHNlbWFwaG9yZS4gICovCisJbnJidWZzID0gaW5mby0+bnJidWZzOworCW1hc2sgPSAwOworCWlmIChmaWxwLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCW1hc2sgPSAobnJidWZzID4gMCkgPyBQT0xMSU4gfCBQT0xMUkROT1JNIDogMDsKKwkJaWYgKCFQSVBFX1dSSVRFUlMoKmlub2RlKSAmJiBmaWxwLT5mX3ZlcnNpb24gIT0gUElQRV9XQ09VTlRFUigqaW5vZGUpKQorCQkJbWFzayB8PSBQT0xMSFVQOworCX0KKworCWlmIChmaWxwLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQltYXNrIHw9IChucmJ1ZnMgPCBQSVBFX0JVRkZFUlMpID8gUE9MTE9VVCB8IFBPTExXUk5PUk0gOiAwOworCQlpZiAoIVBJUEVfUkVBREVSUygqaW5vZGUpKQorCQkJbWFzayB8PSBQT0xMRVJSOworCX0KKworCXJldHVybiBtYXNrOworfQorCisvKiBGSVhNRTogbW9zdCBVbmljZXMgZG8gbm90IHNldCBQT0xMRVJSIGZvciBmaWZvcyAqLworI2RlZmluZSBmaWZvX3BvbGwgcGlwZV9wb2xsCisKK3N0YXRpYyBpbnQKK3BpcGVfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZGVjciwgaW50IGRlY3cpCit7CisJZG93bihQSVBFX1NFTSgqaW5vZGUpKTsKKwlQSVBFX1JFQURFUlMoKmlub2RlKSAtPSBkZWNyOworCVBJUEVfV1JJVEVSUygqaW5vZGUpIC09IGRlY3c7CisJaWYgKCFQSVBFX1JFQURFUlMoKmlub2RlKSAmJiAhUElQRV9XUklURVJTKCppbm9kZSkpIHsKKwkJZnJlZV9waXBlX2luZm8oaW5vZGUpOworCX0gZWxzZSB7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZShQSVBFX1dBSVQoKmlub2RlKSk7CisJCWtpbGxfZmFzeW5jKFBJUEVfRkFTWU5DX1JFQURFUlMoKmlub2RlKSwgU0lHSU8sIFBPTExfSU4pOworCQlraWxsX2Zhc3luYyhQSVBFX0ZBU1lOQ19XUklURVJTKCppbm9kZSksIFNJR0lPLCBQT0xMX09VVCk7CisJfQorCXVwKFBJUEVfU0VNKCppbm9kZSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3BpcGVfcmVhZF9mYXN5bmMoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IG9uKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgcmV0dmFsOworCisJZG93bihQSVBFX1NFTSgqaW5vZGUpKTsKKwlyZXR2YWwgPSBmYXN5bmNfaGVscGVyKGZkLCBmaWxwLCBvbiwgUElQRV9GQVNZTkNfUkVBREVSUygqaW5vZGUpKTsKKwl1cChQSVBFX1NFTSgqaW5vZGUpKTsKKworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAorcGlwZV93cml0ZV9mYXN5bmMoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlscCwgaW50IG9uKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgcmV0dmFsOworCisJZG93bihQSVBFX1NFTSgqaW5vZGUpKTsKKwlyZXR2YWwgPSBmYXN5bmNfaGVscGVyKGZkLCBmaWxwLCBvbiwgUElQRV9GQVNZTkNfV1JJVEVSUygqaW5vZGUpKTsKKwl1cChQSVBFX1NFTSgqaW5vZGUpKTsKKworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAorcGlwZV9yZHdyX2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgb24pCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCWludCByZXR2YWw7CisKKwlkb3duKFBJUEVfU0VNKCppbm9kZSkpOworCisJcmV0dmFsID0gZmFzeW5jX2hlbHBlcihmZCwgZmlscCwgb24sIFBJUEVfRkFTWU5DX1JFQURFUlMoKmlub2RlKSk7CisKKwlpZiAocmV0dmFsID49IDApCisJCXJldHZhbCA9IGZhc3luY19oZWxwZXIoZmQsIGZpbHAsIG9uLCBQSVBFX0ZBU1lOQ19XUklURVJTKCppbm9kZSkpOworCisJdXAoUElQRV9TRU0oKmlub2RlKSk7CisKKwlpZiAocmV0dmFsIDwgMCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQKK3BpcGVfcmVhZF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCXBpcGVfcmVhZF9mYXN5bmMoLTEsIGZpbHAsIDApOworCXJldHVybiBwaXBlX3JlbGVhc2UoaW5vZGUsIDEsIDApOworfQorCitzdGF0aWMgaW50CitwaXBlX3dyaXRlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJcGlwZV93cml0ZV9mYXN5bmMoLTEsIGZpbHAsIDApOworCXJldHVybiBwaXBlX3JlbGVhc2UoaW5vZGUsIDAsIDEpOworfQorCitzdGF0aWMgaW50CitwaXBlX3Jkd3JfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlpbnQgZGVjciwgZGVjdzsKKworCXBpcGVfcmR3cl9mYXN5bmMoLTEsIGZpbHAsIDApOworCWRlY3IgPSAoZmlscC0+Zl9tb2RlICYgRk1PREVfUkVBRCkgIT0gMDsKKwlkZWN3ID0gKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAhPSAwOworCXJldHVybiBwaXBlX3JlbGVhc2UoaW5vZGUsIGRlY3IsIGRlY3cpOworfQorCitzdGF0aWMgaW50CitwaXBlX3JlYWRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwkvKiBXZSBjb3VsZCBoYXZlIHBlcmhhcHMgdXNlZCBhdG9taWNfdCwgYnV0IHRoaXMgYW5kIGZyaWVuZHMKKwkgICBiZWxvdyBhcmUgdGhlIG9ubHkgcGxhY2VzLiAgU28gaXQgZG9lc24ndCBzZWVtIHdvcnRod2hpbGUuICAqLworCWRvd24oUElQRV9TRU0oKmlub2RlKSk7CisJUElQRV9SRUFERVJTKCppbm9kZSkrKzsKKwl1cChQSVBFX1NFTSgqaW5vZGUpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitwaXBlX3dyaXRlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJZG93bihQSVBFX1NFTSgqaW5vZGUpKTsKKwlQSVBFX1dSSVRFUlMoKmlub2RlKSsrOworCXVwKFBJUEVfU0VNKCppbm9kZSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3BpcGVfcmR3cl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWRvd24oUElQRV9TRU0oKmlub2RlKSk7CisJaWYgKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCVBJUEVfUkVBREVSUygqaW5vZGUpKys7CisJaWYgKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQlQSVBFX1dSSVRFUlMoKmlub2RlKSsrOworCXVwKFBJUEVfU0VNKCppbm9kZSkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGUgZmlsZV9vcGVyYXRpb25zIHN0cnVjdHMgYXJlIG5vdCBzdGF0aWMgYmVjYXVzZSB0aGV5CisgKiBhcmUgYWxzbyB1c2VkIGluIGxpbnV4L2ZzL2ZpZm8uYyB0byBkbyBvcGVyYXRpb25zIG9uIEZJRk9zLgorICovCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJlYWRfZmlmb19mb3BzID0geworCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5yZWFkCQk9IHBpcGVfcmVhZCwKKwkucmVhZHYJCT0gcGlwZV9yZWFkdiwKKwkud3JpdGUJCT0gYmFkX3BpcGVfdywKKwkucG9sbAkJPSBmaWZvX3BvbGwsCisJLmlvY3RsCQk9IHBpcGVfaW9jdGwsCisJLm9wZW4JCT0gcGlwZV9yZWFkX29wZW4sCisJLnJlbGVhc2UJPSBwaXBlX3JlYWRfcmVsZWFzZSwKKwkuZmFzeW5jCQk9IHBpcGVfcmVhZF9mYXN5bmMsCit9OworCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHdyaXRlX2ZpZm9fZm9wcyA9IHsKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkucmVhZAkJPSBiYWRfcGlwZV9yLAorCS53cml0ZQkJPSBwaXBlX3dyaXRlLAorCS53cml0ZXYJCT0gcGlwZV93cml0ZXYsCisJLnBvbGwJCT0gZmlmb19wb2xsLAorCS5pb2N0bAkJPSBwaXBlX2lvY3RsLAorCS5vcGVuCQk9IHBpcGVfd3JpdGVfb3BlbiwKKwkucmVsZWFzZQk9IHBpcGVfd3JpdGVfcmVsZWFzZSwKKwkuZmFzeW5jCQk9IHBpcGVfd3JpdGVfZmFzeW5jLAorfTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByZHdyX2ZpZm9fZm9wcyA9IHsKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkucmVhZAkJPSBwaXBlX3JlYWQsCisJLnJlYWR2CQk9IHBpcGVfcmVhZHYsCisJLndyaXRlCQk9IHBpcGVfd3JpdGUsCisJLndyaXRldgkJPSBwaXBlX3dyaXRldiwKKwkucG9sbAkJPSBmaWZvX3BvbGwsCisJLmlvY3RsCQk9IHBpcGVfaW9jdGwsCisJLm9wZW4JCT0gcGlwZV9yZHdyX29wZW4sCisJLnJlbGVhc2UJPSBwaXBlX3Jkd3JfcmVsZWFzZSwKKwkuZmFzeW5jCQk9IHBpcGVfcmR3cl9mYXN5bmMsCit9OworCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJlYWRfcGlwZV9mb3BzID0geworCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5yZWFkCQk9IHBpcGVfcmVhZCwKKwkucmVhZHYJCT0gcGlwZV9yZWFkdiwKKwkud3JpdGUJCT0gYmFkX3BpcGVfdywKKwkucG9sbAkJPSBwaXBlX3BvbGwsCisJLmlvY3RsCQk9IHBpcGVfaW9jdGwsCisJLm9wZW4JCT0gcGlwZV9yZWFkX29wZW4sCisJLnJlbGVhc2UJPSBwaXBlX3JlYWRfcmVsZWFzZSwKKwkuZmFzeW5jCQk9IHBpcGVfcmVhZF9mYXN5bmMsCit9OworCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHdyaXRlX3BpcGVfZm9wcyA9IHsKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkucmVhZAkJPSBiYWRfcGlwZV9yLAorCS53cml0ZQkJPSBwaXBlX3dyaXRlLAorCS53cml0ZXYJCT0gcGlwZV93cml0ZXYsCisJLnBvbGwJCT0gcGlwZV9wb2xsLAorCS5pb2N0bAkJPSBwaXBlX2lvY3RsLAorCS5vcGVuCQk9IHBpcGVfd3JpdGVfb3BlbiwKKwkucmVsZWFzZQk9IHBpcGVfd3JpdGVfcmVsZWFzZSwKKwkuZmFzeW5jCQk9IHBpcGVfd3JpdGVfZmFzeW5jLAorfTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByZHdyX3BpcGVfZm9wcyA9IHsKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkucmVhZAkJPSBwaXBlX3JlYWQsCisJLnJlYWR2CQk9IHBpcGVfcmVhZHYsCisJLndyaXRlCQk9IHBpcGVfd3JpdGUsCisJLndyaXRldgkJPSBwaXBlX3dyaXRldiwKKwkucG9sbAkJPSBwaXBlX3BvbGwsCisJLmlvY3RsCQk9IHBpcGVfaW9jdGwsCisJLm9wZW4JCT0gcGlwZV9yZHdyX29wZW4sCisJLnJlbGVhc2UJPSBwaXBlX3Jkd3JfcmVsZWFzZSwKKwkuZmFzeW5jCQk9IHBpcGVfcmR3cl9mYXN5bmMsCit9OworCit2b2lkIGZyZWVfcGlwZV9pbmZvKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW50IGk7CisJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqaW5mbyA9IGlub2RlLT5pX3BpcGU7CisKKwlpbm9kZS0+aV9waXBlID0gTlVMTDsKKwlmb3IgKGkgPSAwOyBpIDwgUElQRV9CVUZGRVJTOyBpKyspIHsKKwkJc3RydWN0IHBpcGVfYnVmZmVyICpidWYgPSBpbmZvLT5idWZzICsgaTsKKwkJaWYgKGJ1Zi0+b3BzKQorCQkJYnVmLT5vcHMtPnJlbGVhc2UoaW5mbywgYnVmKTsKKwl9CisJaWYgKGluZm8tPnRtcF9wYWdlKQorCQlfX2ZyZWVfcGFnZShpbmZvLT50bXBfcGFnZSk7CisJa2ZyZWUoaW5mbyk7Cit9CisKK3N0cnVjdCBpbm9kZSogcGlwZV9uZXcoc3RydWN0IGlub2RlKiBpbm9kZSkKK3sKKwlzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICppbmZvOworCisJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwaXBlX2lub2RlX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluZm8pCisJCWdvdG8gZmFpbF9wYWdlOworCW1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKKwlpbm9kZS0+aV9waXBlID0gaW5mbzsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoUElQRV9XQUlUKCppbm9kZSkpOworCVBJUEVfUkNPVU5URVIoKmlub2RlKSA9IFBJUEVfV0NPVU5URVIoKmlub2RlKSA9IDE7CisKKwlyZXR1cm4gaW5vZGU7CitmYWlsX3BhZ2U6CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmZzbW91bnQgKnBpcGVfbW50Oworc3RhdGljIGludCBwaXBlZnNfZGVsZXRlX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJcmV0dXJuIDE7Cit9CitzdGF0aWMgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIHBpcGVmc19kZW50cnlfb3BlcmF0aW9ucyA9IHsKKwkuZF9kZWxldGUJPSBwaXBlZnNfZGVsZXRlX2RlbnRyeSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKiBnZXRfcGlwZV9pbm9kZSh2b2lkKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBuZXdfaW5vZGUocGlwZV9tbnQtPm1udF9zYik7CisKKwlpZiAoIWlub2RlKQorCQlnb3RvIGZhaWxfaW5vZGU7CisKKwlpZighcGlwZV9uZXcoaW5vZGUpKQorCQlnb3RvIGZhaWxfaXB1dDsKKwlQSVBFX1JFQURFUlMoKmlub2RlKSA9IFBJUEVfV1JJVEVSUygqaW5vZGUpID0gMTsKKwlpbm9kZS0+aV9mb3AgPSAmcmR3cl9waXBlX2ZvcHM7CisKKwkvKgorCSAqIE1hcmsgdGhlIGlub2RlIGRpcnR5IGZyb20gdGhlIHZlcnkgYmVnaW5uaW5nLAorCSAqIHRoYXQgd2F5IGl0IHdpbGwgbmV2ZXIgYmUgbW92ZWQgdG8gdGhlIGRpcnR5CisJICogbGlzdCBiZWNhdXNlICJtYXJrX2lub2RlX2RpcnR5KCkiIHdpbGwgdGhpbmsKKwkgKiB0aGF0IGl0IGFscmVhZHkgX2lzXyBvbiB0aGUgZGlydHkgbGlzdC4KKwkgKi8KKwlpbm9kZS0+aV9zdGF0ZSA9IElfRElSVFk7CisJaW5vZGUtPmlfbW9kZSA9IFNfSUZJRk8gfCBTX0lSVVNSIHwgU19JV1VTUjsKKwlpbm9kZS0+aV91aWQgPSBjdXJyZW50LT5mc3VpZDsKKwlpbm9kZS0+aV9naWQgPSBjdXJyZW50LT5mc2dpZDsKKwlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisJaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfU0laRTsKKwlyZXR1cm4gaW5vZGU7CisKK2ZhaWxfaXB1dDoKKwlpcHV0KGlub2RlKTsKK2ZhaWxfaW5vZGU6CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBkb19waXBlKGludCAqZmQpCit7CisJc3RydWN0IHFzdHIgdGhpczsKKwljaGFyIG5hbWVbMzJdOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKwlzdHJ1Y3QgZmlsZSAqZjEsICpmMjsKKwlpbnQgZXJyb3I7CisJaW50IGksajsKKworCWVycm9yID0gLUVORklMRTsKKwlmMSA9IGdldF9lbXB0eV9maWxwKCk7CisJaWYgKCFmMSkKKwkJZ290byBub19maWxlczsKKworCWYyID0gZ2V0X2VtcHR5X2ZpbHAoKTsKKwlpZiAoIWYyKQorCQlnb3RvIGNsb3NlX2YxOworCisJaW5vZGUgPSBnZXRfcGlwZV9pbm9kZSgpOworCWlmICghaW5vZGUpCisJCWdvdG8gY2xvc2VfZjEyOworCisJZXJyb3IgPSBnZXRfdW51c2VkX2ZkKCk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBjbG9zZV9mMTJfaW5vZGU7CisJaSA9IGVycm9yOworCisJZXJyb3IgPSBnZXRfdW51c2VkX2ZkKCk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBjbG9zZV9mMTJfaW5vZGVfaTsKKwlqID0gZXJyb3I7CisKKwllcnJvciA9IC1FTk9NRU07CisJc3ByaW50ZihuYW1lLCAiWyVsdV0iLCBpbm9kZS0+aV9pbm8pOworCXRoaXMubmFtZSA9IG5hbWU7CisJdGhpcy5sZW4gPSBzdHJsZW4obmFtZSk7CisJdGhpcy5oYXNoID0gaW5vZGUtPmlfaW5vOyAvKiB3aWxsIGdvICovCisJZGVudHJ5ID0gZF9hbGxvYyhwaXBlX21udC0+bW50X3NiLT5zX3Jvb3QsICZ0aGlzKTsKKwlpZiAoIWRlbnRyeSkKKwkJZ290byBjbG9zZV9mMTJfaW5vZGVfaV9qOworCWRlbnRyeS0+ZF9vcCA9ICZwaXBlZnNfZGVudHJ5X29wZXJhdGlvbnM7CisJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CisJZjEtPmZfdmZzbW50ID0gZjItPmZfdmZzbW50ID0gbW50Z2V0KG1udGdldChwaXBlX21udCkpOworCWYxLT5mX2RlbnRyeSA9IGYyLT5mX2RlbnRyeSA9IGRnZXQoZGVudHJ5KTsKKwlmMS0+Zl9tYXBwaW5nID0gZjItPmZfbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisKKwkvKiByZWFkIGZpbGUgKi8KKwlmMS0+Zl9wb3MgPSBmMi0+Zl9wb3MgPSAwOworCWYxLT5mX2ZsYWdzID0gT19SRE9OTFk7CisJZjEtPmZfb3AgPSAmcmVhZF9waXBlX2ZvcHM7CisJZjEtPmZfbW9kZSA9IEZNT0RFX1JFQUQ7CisJZjEtPmZfdmVyc2lvbiA9IDA7CisKKwkvKiB3cml0ZSBmaWxlICovCisJZjItPmZfZmxhZ3MgPSBPX1dST05MWTsKKwlmMi0+Zl9vcCA9ICZ3cml0ZV9waXBlX2ZvcHM7CisJZjItPmZfbW9kZSA9IEZNT0RFX1dSSVRFOworCWYyLT5mX3ZlcnNpb24gPSAwOworCisJZmRfaW5zdGFsbChpLCBmMSk7CisJZmRfaW5zdGFsbChqLCBmMik7CisJZmRbMF0gPSBpOworCWZkWzFdID0gajsKKwlyZXR1cm4gMDsKKworY2xvc2VfZjEyX2lub2RlX2lfajoKKwlwdXRfdW51c2VkX2ZkKGopOworY2xvc2VfZjEyX2lub2RlX2k6CisJcHV0X3VudXNlZF9mZChpKTsKK2Nsb3NlX2YxMl9pbm9kZToKKwlmcmVlX3BpcGVfaW5mbyhpbm9kZSk7CisJaXB1dChpbm9kZSk7CitjbG9zZV9mMTI6CisJcHV0X2ZpbHAoZjIpOworY2xvc2VfZjE6CisJcHV0X2ZpbHAoZjEpOworbm9fZmlsZXM6CisJcmV0dXJuIGVycm9yOwkKK30KKworLyoKKyAqIHBpcGVmcyBzaG91bGQgX25ldmVyXyBiZSBtb3VudGVkIGJ5IHVzZXJsYW5kIC0gdG9vIG11Y2ggb2Ygc2VjdXJpdHkgaGFzc2xlLAorICogbm8gcmVhbCBnYWluIGZyb20gaGF2aW5nIHRoZSB3aG9sZSB3aG9yZWhvdXNlIG1vdW50ZWQuIFNvIHdlIGRvbid0IG5lZWQKKyAqIGFueSBvcGVyYXRpb25zIG9uIHRoZSByb290IGRpcmVjdG9yeS4gSG93ZXZlciwgd2UgbmVlZCBhIG5vbi10cml2aWFsCisgKiBkX25hbWUgLSBwaXBlOiB3aWxsIGdvIG5pY2VseSBhbmQga2lsbCB0aGUgc3BlY2lhbC1jYXNpbmcgaW4gcHJvY2ZzLgorICovCisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBpcGVmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZ2V0X3NiX3BzZXVkbyhmc190eXBlLCAicGlwZToiLCBOVUxMLCBQSVBFRlNfTUFHSUMpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgcGlwZV9mc190eXBlID0geworCS5uYW1lCQk9ICJwaXBlZnMiLAorCS5nZXRfc2IJCT0gcGlwZWZzX2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfYW5vbl9zdXBlciwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfcGlwZV9mcyh2b2lkKQoreworCWludCBlcnIgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZwaXBlX2ZzX3R5cGUpOworCWlmICghZXJyKSB7CisJCXBpcGVfbW50ID0ga2Vybl9tb3VudCgmcGlwZV9mc190eXBlKTsKKwkJaWYgKElTX0VSUihwaXBlX21udCkpIHsKKwkJCWVyciA9IFBUUl9FUlIocGlwZV9tbnQpOworCQkJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZwaXBlX2ZzX3R5cGUpOworCQl9CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X3BpcGVfZnModm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnBpcGVfZnNfdHlwZSk7CisJbW50cHV0KHBpcGVfbW50KTsKK30KKworZnNfaW5pdGNhbGwoaW5pdF9waXBlX2ZzKTsKK21vZHVsZV9leGl0KGV4aXRfcGlwZV9mcyk7CmRpZmYgLS1naXQgYS9mcy9wb3NpeF9hY2wuYyBiL2ZzL3Bvc2l4X2FjbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NjQ4MGUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wb3NpeF9hY2wuYwpAQCAtMCwwICsxLDM4MSBAQAorLyoKKyAqIGxpbnV4L2ZzL3Bvc2l4X2FjbC5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMiBieSBBbmRyZWFzIEdydWVuYmFjaGVyIDxhLmdydWVuYmFjaGVyQGNvbXB1dGVyLm9yZz4KKyAqCisgKiAgRml4ZXMgZnJvbSBXaWxsaWFtIFNjaHVtYWNoZXIgaW5jb3Jwb3JhdGVkIG9uIDE1IE1hcmNoIDIwMDEuCisgKiAgICAgKFJlcG9ydGVkIGJ5IENoYXJsZXMgQmVydHNjaCwgPENCZXJ0c2NoQG1pY3JvdGVzdC5jb20+KS4KKyAqLworCisvKgorICogIFRoaXMgZmlsZSBjb250YWlucyBnZW5lcmljIGZ1bmN0aW9ucyBmb3IgbWFuaXB1bGF0aW5nCisgKiAgUE9TSVggMTAwMy4xZSBkcmFmdCBzdGFuZGFyZCAxNyBBQ0xzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2wuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKK0VYUE9SVF9TWU1CT0wocG9zaXhfYWNsX2FsbG9jKTsKK0VYUE9SVF9TWU1CT0wocG9zaXhfYWNsX2Nsb25lKTsKK0VYUE9SVF9TWU1CT0wocG9zaXhfYWNsX3ZhbGlkKTsKK0VYUE9SVF9TWU1CT0wocG9zaXhfYWNsX2VxdWl2X21vZGUpOworRVhQT1JUX1NZTUJPTChwb3NpeF9hY2xfZnJvbV9tb2RlKTsKK0VYUE9SVF9TWU1CT0wocG9zaXhfYWNsX2NyZWF0ZV9tYXNxKTsKK0VYUE9SVF9TWU1CT0wocG9zaXhfYWNsX2NobW9kX21hc3EpOworRVhQT1JUX1NZTUJPTChwb3NpeF9hY2xfcGVybWlzc2lvbik7CisKKy8qCisgKiBBbGxvY2F0ZSBhIG5ldyBBQ0wgd2l0aCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBlbnRyaWVzLgorICovCitzdHJ1Y3QgcG9zaXhfYWNsICoKK3Bvc2l4X2FjbF9hbGxvYyhpbnQgY291bnQsIHVuc2lnbmVkIGludCBfX25vY2FzdCBmbGFncykKK3sKKwljb25zdCBzaXplX3Qgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcG9zaXhfYWNsKSArCisJICAgICAgICAgICAgICAgICAgICBjb3VudCAqIHNpemVvZihzdHJ1Y3QgcG9zaXhfYWNsX2VudHJ5KTsKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2wgPSBrbWFsbG9jKHNpemUsIGZsYWdzKTsKKwlpZiAoYWNsKSB7CisJCWF0b21pY19zZXQoJmFjbC0+YV9yZWZjb3VudCwgMSk7CisJCWFjbC0+YV9jb3VudCA9IGNvdW50OworCX0KKwlyZXR1cm4gYWNsOworfQorCisvKgorICogQ2xvbmUgYW4gQUNMLgorICovCitzdHJ1Y3QgcG9zaXhfYWNsICoKK3Bvc2l4X2FjbF9jbG9uZShjb25zdCBzdHJ1Y3QgcG9zaXhfYWNsICphY2wsIHVuc2lnbmVkIGludCBfX25vY2FzdCBmbGFncykKK3sKKwlzdHJ1Y3QgcG9zaXhfYWNsICpjbG9uZSA9IE5VTEw7CisKKwlpZiAoYWNsKSB7CisJCWludCBzaXplID0gc2l6ZW9mKHN0cnVjdCBwb3NpeF9hY2wpICsgYWNsLT5hX2NvdW50ICoKKwkJICAgICAgICAgICBzaXplb2Yoc3RydWN0IHBvc2l4X2FjbF9lbnRyeSk7CisJCWNsb25lID0ga21hbGxvYyhzaXplLCBmbGFncyk7CisJCWlmIChjbG9uZSkgeworCQkJbWVtY3B5KGNsb25lLCBhY2wsIHNpemUpOworCQkJYXRvbWljX3NldCgmY2xvbmUtPmFfcmVmY291bnQsIDEpOworCQl9CisJfQorCXJldHVybiBjbG9uZTsKK30KKworLyoKKyAqIENoZWNrIGlmIGFuIGFjbCBpcyB2YWxpZC4gUmV0dXJucyAwIGlmIGl0IGlzLCBvciAtRS4uLiBvdGhlcndpc2UuCisgKi8KK2ludAorcG9zaXhfYWNsX3ZhbGlkKGNvbnN0IHN0cnVjdCBwb3NpeF9hY2wgKmFjbCkKK3sKKwljb25zdCBzdHJ1Y3QgcG9zaXhfYWNsX2VudHJ5ICpwYSwgKnBlOworCWludCBzdGF0ZSA9IEFDTF9VU0VSX09CSjsKKwl1bnNpZ25lZCBpbnQgaWQgPSAwOyAgLyoga2VlcCBnY2MgaGFwcHkgKi8KKwlpbnQgbmVlZHNfbWFzayA9IDA7CisKKwlGT1JFQUNIX0FDTF9FTlRSWShwYSwgYWNsLCBwZSkgeworCQlpZiAocGEtPmVfcGVybSAmIH4oQUNMX1JFQUR8QUNMX1dSSVRFfEFDTF9FWEVDVVRFKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlzd2l0Y2ggKHBhLT5lX3RhZykgeworCQkJY2FzZSBBQ0xfVVNFUl9PQko6CisJCQkJaWYgKHN0YXRlID09IEFDTF9VU0VSX09CSikgeworCQkJCQlpZCA9IDA7CisJCQkJCXN0YXRlID0gQUNMX1VTRVI7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJY2FzZSBBQ0xfVVNFUjoKKwkJCQlpZiAoc3RhdGUgIT0gQUNMX1VTRVIpCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWlmIChwYS0+ZV9pZCA9PSBBQ0xfVU5ERUZJTkVEX0lEIHx8CisJCQkJICAgIHBhLT5lX2lkIDwgaWQpCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWlkID0gcGEtPmVfaWQgKyAxOworCQkJCW5lZWRzX21hc2sgPSAxOworCQkJCWJyZWFrOworCisJCQljYXNlIEFDTF9HUk9VUF9PQko6CisJCQkJaWYgKHN0YXRlID09IEFDTF9VU0VSKSB7CisJCQkJCWlkID0gMDsKKwkJCQkJc3RhdGUgPSBBQ0xfR1JPVVA7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJY2FzZSBBQ0xfR1JPVVA6CisJCQkJaWYgKHN0YXRlICE9IEFDTF9HUk9VUCkKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJaWYgKHBhLT5lX2lkID09IEFDTF9VTkRFRklORURfSUQgfHwKKwkJCQkgICAgcGEtPmVfaWQgPCBpZCkKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJaWQgPSBwYS0+ZV9pZCArIDE7CisJCQkJbmVlZHNfbWFzayA9IDE7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQUNMX01BU0s6CisJCQkJaWYgKHN0YXRlICE9IEFDTF9HUk9VUCkKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJc3RhdGUgPSBBQ0xfT1RIRVI7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQUNMX09USEVSOgorCQkJCWlmIChzdGF0ZSA9PSBBQ0xfT1RIRVIgfHwKKwkJCQkgICAgKHN0YXRlID09IEFDTF9HUk9VUCAmJiAhbmVlZHNfbWFzaykpIHsKKwkJCQkJc3RhdGUgPSAwOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJaWYgKHN0YXRlID09IDApCisJCXJldHVybiAwOworCXJldHVybiAtRUlOVkFMOworfQorCisvKgorICogUmV0dXJucyAwIGlmIHRoZSBhY2wgY2FuIGJlIGV4YWN0bHkgcmVwcmVzZW50ZWQgaW4gdGhlIHRyYWRpdGlvbmFsCisgKiBmaWxlIG1vZGUgcGVybWlzc2lvbiBiaXRzLCBvciBlbHNlIDEuIFJldHVybnMgLUUuLi4gb24gZXJyb3IuCisgKi8KK2ludAorcG9zaXhfYWNsX2VxdWl2X21vZGUoY29uc3Qgc3RydWN0IHBvc2l4X2FjbCAqYWNsLCBtb2RlX3QgKm1vZGVfcCkKK3sKKwljb25zdCBzdHJ1Y3QgcG9zaXhfYWNsX2VudHJ5ICpwYSwgKnBlOworCW1vZGVfdCBtb2RlID0gMDsKKwlpbnQgbm90X2VxdWl2ID0gMDsKKworCUZPUkVBQ0hfQUNMX0VOVFJZKHBhLCBhY2wsIHBlKSB7CisJCXN3aXRjaCAocGEtPmVfdGFnKSB7CisJCQljYXNlIEFDTF9VU0VSX09CSjoKKwkJCQltb2RlIHw9IChwYS0+ZV9wZXJtICYgU19JUldYTykgPDwgNjsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUNMX0dST1VQX09CSjoKKwkJCQltb2RlIHw9IChwYS0+ZV9wZXJtICYgU19JUldYTykgPDwgMzsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUNMX09USEVSOgorCQkJCW1vZGUgfD0gcGEtPmVfcGVybSAmIFNfSVJXWE87CisJCQkJYnJlYWs7CisJCQljYXNlIEFDTF9NQVNLOgorCQkJCW1vZGUgPSAobW9kZSAmIH5TX0lSV1hHKSB8CisJCQkJICAgICAgICgocGEtPmVfcGVybSAmIFNfSVJXWE8pIDw8IDMpOworCQkJCW5vdF9lcXVpdiA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlIEFDTF9VU0VSOgorCQkJY2FzZSBBQ0xfR1JPVVA6CisJCQkJbm90X2VxdWl2ID0gMTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisgICAgICAgIGlmIChtb2RlX3ApCisgICAgICAgICAgICAgICAgKm1vZGVfcCA9ICgqbW9kZV9wICYgflNfSVJXWFVHTykgfCBtb2RlOworICAgICAgICByZXR1cm4gbm90X2VxdWl2OworfQorCisvKgorICogQ3JlYXRlIGFuIEFDTCByZXByZXNlbnRpbmcgdGhlIGZpbGUgbW9kZSBwZXJtaXNzaW9uIGJpdHMgb2YgYW4gaW5vZGUuCisgKi8KK3N0cnVjdCBwb3NpeF9hY2wgKgorcG9zaXhfYWNsX2Zyb21fbW9kZShtb2RlX3QgbW9kZSwgdW5zaWduZWQgaW50IF9fbm9jYXN0IGZsYWdzKQoreworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbCA9IHBvc2l4X2FjbF9hbGxvYygzLCBmbGFncyk7CisJaWYgKCFhY2wpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJYWNsLT5hX2VudHJpZXNbMF0uZV90YWcgID0gQUNMX1VTRVJfT0JKOworCWFjbC0+YV9lbnRyaWVzWzBdLmVfaWQgICA9IEFDTF9VTkRFRklORURfSUQ7CisJYWNsLT5hX2VudHJpZXNbMF0uZV9wZXJtID0gKG1vZGUgJiBTX0lSV1hVKSA+PiA2OworCisJYWNsLT5hX2VudHJpZXNbMV0uZV90YWcgID0gQUNMX0dST1VQX09CSjsKKwlhY2wtPmFfZW50cmllc1sxXS5lX2lkICAgPSBBQ0xfVU5ERUZJTkVEX0lEOworCWFjbC0+YV9lbnRyaWVzWzFdLmVfcGVybSA9IChtb2RlICYgU19JUldYRykgPj4gMzsKKworCWFjbC0+YV9lbnRyaWVzWzJdLmVfdGFnICA9IEFDTF9PVEhFUjsKKwlhY2wtPmFfZW50cmllc1syXS5lX2lkICAgPSBBQ0xfVU5ERUZJTkVEX0lEOworCWFjbC0+YV9lbnRyaWVzWzJdLmVfcGVybSA9IChtb2RlICYgU19JUldYTyk7CisJcmV0dXJuIGFjbDsKK30KKworLyoKKyAqIFJldHVybiAwIGlmIGN1cnJlbnQgaXMgZ3JhbnRlZCB3YW50IGFjY2VzcyB0byB0aGUgaW5vZGUKKyAqIGJ5IHRoZSBhY2wuIFJldHVybnMgLUUuLi4gb3RoZXJ3aXNlLgorICovCitpbnQKK3Bvc2l4X2FjbF9wZXJtaXNzaW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IHN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgaW50IHdhbnQpCit7CisJY29uc3Qgc3RydWN0IHBvc2l4X2FjbF9lbnRyeSAqcGEsICpwZSwgKm1hc2tfb2JqOworCWludCBmb3VuZCA9IDA7CisKKwlGT1JFQUNIX0FDTF9FTlRSWShwYSwgYWNsLCBwZSkgeworICAgICAgICAgICAgICAgIHN3aXRjaChwYS0+ZV90YWcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQUNMX1VTRVJfT0JKOgorCQkJCS8qIChNYXkgaGF2ZSBiZWVuIGNoZWNrZWQgYWxyZWFkeSkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlub2RlLT5pX3VpZCA9PSBjdXJyZW50LT5mc3VpZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGNoZWNrX3Blcm07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBQ0xfVVNFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhLT5lX2lkID09IGN1cnJlbnQtPmZzdWlkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gbWFzazsKKwkJCQlicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQUNMX0dST1VQX09CSjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluX2dyb3VwX3AoaW5vZGUtPmlfZ2lkKSkgeworCQkJCQlmb3VuZCA9IDE7CisJCQkJCWlmICgocGEtPmVfcGVybSAmIHdhbnQpID09IHdhbnQpCisJCQkJCQlnb3RvIG1hc2s7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJCQlicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQUNMX0dST1VQOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5fZ3JvdXBfcChwYS0+ZV9pZCkpIHsKKwkJCQkJZm91bmQgPSAxOworCQkJCQlpZiAoKHBhLT5lX3Blcm0gJiB3YW50KSA9PSB3YW50KQorCQkJCQkJZ290byBtYXNrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBQ0xfTUFTSzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFDTF9PVEhFUjoKKwkJCQlpZiAoZm91bmQpCisJCQkJCXJldHVybiAtRUFDQ0VTOworCQkJCWVsc2UKKwkJCQkJZ290byBjaGVja19wZXJtOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gLUVJTzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKwlyZXR1cm4gLUVJTzsKKworbWFzazoKKwlmb3IgKG1hc2tfb2JqID0gcGErMTsgbWFza19vYmogIT0gcGU7IG1hc2tfb2JqKyspIHsKKwkJaWYgKG1hc2tfb2JqLT5lX3RhZyA9PSBBQ0xfTUFTSykgeworCQkJaWYgKChwYS0+ZV9wZXJtICYgbWFza19vYmotPmVfcGVybSAmIHdhbnQpID09IHdhbnQpCisJCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJfQorCX0KKworY2hlY2tfcGVybToKKwlpZiAoKHBhLT5lX3Blcm0gJiB3YW50KSA9PSB3YW50KQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVBQ0NFUzsKK30KKworLyoKKyAqIE1vZGlmeSBhY2wgd2hlbiBjcmVhdGluZyBhIG5ldyBpbm9kZS4gVGhlIGNhbGxlciBtdXN0IGVuc3VyZSB0aGUgYWNsIGlzCisgKiBvbmx5IHJlZmVyZW5jZWQgb25jZS4KKyAqCisgKiBtb2RlX3AgaW5pdGlhbGx5IG11c3QgY29udGFpbiB0aGUgbW9kZSBwYXJhbWV0ZXIgdG8gdGhlIG9wZW4oKSAvIGNyZWF0KCkKKyAqIHN5c3RlbSBjYWxscy4gQWxsIHBlcm1pc3Npb25zIHRoYXQgYXJlIG5vdCBncmFudGVkIGJ5IHRoZSBhY2wgYXJlIHJlbW92ZWQuCisgKiBUaGUgcGVybWlzc2lvbnMgaW4gdGhlIGFjbCBhcmUgY2hhbmdlZCB0byByZWZsZWN0IHRoZSBtb2RlX3AgcGFyYW1ldGVyLgorICovCitpbnQKK3Bvc2l4X2FjbF9jcmVhdGVfbWFzcShzdHJ1Y3QgcG9zaXhfYWNsICphY2wsIG1vZGVfdCAqbW9kZV9wKQoreworCXN0cnVjdCBwb3NpeF9hY2xfZW50cnkgKnBhLCAqcGU7CisJc3RydWN0IHBvc2l4X2FjbF9lbnRyeSAqZ3JvdXBfb2JqID0gTlVMTCwgKm1hc2tfb2JqID0gTlVMTDsKKwltb2RlX3QgbW9kZSA9ICptb2RlX3A7CisJaW50IG5vdF9lcXVpdiA9IDA7CisKKwkvKiBhc3NlcnQoYXRvbWljX3JlYWQoYWNsLT5hX3JlZmNvdW50KSA9PSAxKTsgKi8KKworCUZPUkVBQ0hfQUNMX0VOVFJZKHBhLCBhY2wsIHBlKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoKHBhLT5lX3RhZykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBQ0xfVVNFUl9PQko6CisJCQkJcGEtPmVfcGVybSAmPSAobW9kZSA+PiA2KSB8IH5TX0lSV1hPOworCQkJCW1vZGUgJj0gKHBhLT5lX3Blcm0gPDwgNikgfCB+U19JUldYVTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBBQ0xfVVNFUjoKKwkJCWNhc2UgQUNMX0dST1VQOgorCQkJCW5vdF9lcXVpdiA9IDE7CisJCQkJYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQUNMX0dST1VQX09CSjoKKwkJCQlncm91cF9vYmogPSBwYTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQUNMX09USEVSOgorCQkJCXBhLT5lX3Blcm0gJj0gbW9kZSB8IH5TX0lSV1hPOworCQkJCW1vZGUgJj0gcGEtPmVfcGVybSB8IH5TX0lSV1hPOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBQ0xfTUFTSzoKKwkJCQltYXNrX29iaiA9IHBhOworCQkJCW5vdF9lcXVpdiA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCXJldHVybiAtRUlPOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisJaWYgKG1hc2tfb2JqKSB7CisJCW1hc2tfb2JqLT5lX3Blcm0gJj0gKG1vZGUgPj4gMykgfCB+U19JUldYTzsKKwkJbW9kZSAmPSAobWFza19vYmotPmVfcGVybSA8PCAzKSB8IH5TX0lSV1hHOworCX0gZWxzZSB7CisJCWlmICghZ3JvdXBfb2JqKQorCQkJcmV0dXJuIC1FSU87CisJCWdyb3VwX29iai0+ZV9wZXJtICY9IChtb2RlID4+IDMpIHwgflNfSVJXWE87CisJCW1vZGUgJj0gKGdyb3VwX29iai0+ZV9wZXJtIDw8IDMpIHwgflNfSVJXWEc7CisJfQorCisJKm1vZGVfcCA9ICgqbW9kZV9wICYgflNfSVJXWFVHTykgfCBtb2RlOworICAgICAgICByZXR1cm4gbm90X2VxdWl2OworfQorCisvKgorICogTW9kaWZ5IHRoZSBBQ0wgZm9yIHRoZSBjaG1vZCBzeXNjYWxsLgorICovCitpbnQKK3Bvc2l4X2FjbF9jaG1vZF9tYXNxKHN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgbW9kZV90IG1vZGUpCit7CisJc3RydWN0IHBvc2l4X2FjbF9lbnRyeSAqZ3JvdXBfb2JqID0gTlVMTCwgKm1hc2tfb2JqID0gTlVMTDsKKwlzdHJ1Y3QgcG9zaXhfYWNsX2VudHJ5ICpwYSwgKnBlOworCisJLyogYXNzZXJ0KGF0b21pY19yZWFkKGFjbC0+YV9yZWZjb3VudCkgPT0gMSk7ICovCisKKwlGT1JFQUNIX0FDTF9FTlRSWShwYSwgYWNsLCBwZSkgeworCQlzd2l0Y2gocGEtPmVfdGFnKSB7CisJCQljYXNlIEFDTF9VU0VSX09CSjoKKwkJCQlwYS0+ZV9wZXJtID0gKG1vZGUgJiBTX0lSV1hVKSA+PiA2OworCQkJCWJyZWFrOworCisJCQljYXNlIEFDTF9VU0VSOgorCQkJY2FzZSBBQ0xfR1JPVVA6CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQUNMX0dST1VQX09CSjoKKwkJCQlncm91cF9vYmogPSBwYTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBBQ0xfTUFTSzoKKwkJCQltYXNrX29iaiA9IHBhOworCQkJCWJyZWFrOworCisJCQljYXNlIEFDTF9PVEhFUjoKKwkJCQlwYS0+ZV9wZXJtID0gKG1vZGUgJiBTX0lSV1hPKTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKworCWlmIChtYXNrX29iaikgeworCQltYXNrX29iai0+ZV9wZXJtID0gKG1vZGUgJiBTX0lSV1hHKSA+PiAzOworCX0gZWxzZSB7CisJCWlmICghZ3JvdXBfb2JqKQorCQkJcmV0dXJuIC1FSU87CisJCWdyb3VwX29iai0+ZV9wZXJtID0gKG1vZGUgJiBTX0lSV1hHKSA+PiAzOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9NYWtlZmlsZSBiL2ZzL3Byb2MvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM4YjliNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3Byb2MvTWFrZWZpbGUKQEAgLTAsMCArMSwxNCBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIExpbnV4IHByb2MgZmlsZXN5c3RlbSByb3V0aW5lcy4KKyMKKworb2JqLSQoQ09ORklHX1BST0NfRlMpICs9IHByb2MubworCitwcm9jLXkJCQk6PSBub21tdS5vIHRhc2tfbm9tbXUubworcHJvYy0kKENPTkZJR19NTVUpCTo9IG1tdS5vIHRhc2tfbW11Lm8KKworcHJvYy15ICAgICAgICs9IGlub2RlLm8gcm9vdC5vIGJhc2UubyBnZW5lcmljLm8gYXJyYXkubyBcCisJCWttc2cubyBwcm9jX3R0eS5vIHByb2NfbWlzYy5vCisKK3Byb2MtJChDT05GSUdfUFJPQ19LQ09SRSkJKz0ga2NvcmUubworcHJvYy0kKENPTkZJR19QUk9DX0RFVklDRVRSRUUpCSs9IHByb2NfZGV2dHJlZS5vCmRpZmYgLS1naXQgYS9mcy9wcm9jL2FycmF5LmMgYi9mcy9wcm9jL2FycmF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc2NjhmZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3Byb2MvYXJyYXkuYwpAQCAtMCwwICsxLDQ4NCBAQAorLyoKKyAqICBsaW51eC9mcy9wcm9jL2FycmF5LmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkyICBieSBMaW51cyBUb3J2YWxkcworICogIGJhc2VkIG9uIGlkZWFzIGJ5IERhcnJlbiBTZW5uCisgKgorICogRml4ZXM6CisgKiBNaWNoYWVsLiBLLiBKb2huc29uOiBzdGF0LHN0YXRtIGV4dGVuc2lvbnMuCisgKiAgICAgICAgICAgICAgICAgICAgICA8am9obnNvbm1Ac3RvbGFmLmVkdT4KKyAqCisgKiBQYXVsaW5lIE1pZGRlbGluayA6ICBNYWRlIGNtZGxpbmUsZW52bGluZSBvbmx5IGJyZWFrIGF0ICdcMCdzLCB0bworICogICAgICAgICAgICAgICAgICAgICAgbWFrZSBzdXJlIFNFVF9QUk9DVElUTEUgd29ya3MuIEFsc28gcmVtb3ZlZAorICogICAgICAgICAgICAgICAgICAgICAgYmFkICchJyB3aGljaCBmb3JjZWQgYWRkcmVzcyByZWNhbGN1bGF0aW9uIGZvcgorICogICAgICAgICAgICAgICAgICAgICAgRVZFUlkgY2hhcmFjdGVyIG9uIHRoZSBjdXJyZW50IHBhZ2UuCisgKiAgICAgICAgICAgICAgICAgICAgICA8bWlkZGVsaW5AcG9seXdhcmUuaWFmLm5sPgorICoKKyAqIERhbm55IHRlciBIYWFyICAgIDoJYWRkZWQgY3B1aW5mbworICoJCQk8ZHRoQGNpc3Ryb24ubmw+CisgKgorICogQWxlc3NhbmRybyBSdWJpbmkgOiAgcHJvZmlsZSBleHRlbnNpb24uCisgKiAgICAgICAgICAgICAgICAgICAgICA8cnViaW5pQGlwdnZpcy51bmlwdi5pdD4KKyAqCisgKiBKZWZmIFRyYW50ZXIgICAgICA6ICBhZGRlZCBCb2dvTWlwcyBmaWVsZCB0byBjcHVpbmZvCisgKiAgICAgICAgICAgICAgICAgICAgICA8SmVmZl9UcmFudGVyQE1pdGVsLkNPTT4KKyAqCisgKiBCcnVubyBIYWlibGUgICAgICA6ICByZW1vdmUgNEsgbGltaXQgZm9yIHRoZSBtYXBzIGZpbGUKKyAqCQkJPGhhaWJsZUBtYTJzMi5tYXRoZW1hdGlrLnVuaS1rYXJsc3J1aGUuZGU+CisgKgorICogWXZlcyBBcnJvdXllICAgICAgOiAgcmVtb3ZlIHJlbW92YWwgb2YgdHJhaWxpbmcgc3BhY2VzIGluIGdldF9hcnJheS4KKyAqCQkJPFl2ZXMuQXJyb3V5ZUBtYXJpbi5mZG4uZnI+CisgKgorICogSmVyb21lIEZvcmlzc2llciAgOiAgYWRkZWQgcGVyLUNQVSB0aW1lIGluZm9ybWF0aW9uIHRvIC9wcm9jL3N0YXQKKyAqICAgICAgICAgICAgICAgICAgICAgIGFuZCAvcHJvYy88cGlkPi9jcHUgZXh0ZW5zaW9uCisgKiAgICAgICAgICAgICAgICAgICAgICA8Zm9yaXNzaWVyQGlzaWEuY21hLmZyPgorICoJCQktIEluY29ycG9yYXRpb24gYW5kIG5vbi1TTVAgc2FmZSBvcGVyYXRpb24KKyAqCQkJb2YgZm9yaXNzaWVyIHBhdGNoIGluIDIuMS43OCBieQorICoJCQlIYW5zIE1hcmN1cyA8Y3Jvd2JhckBjb25jZXB0cy5ubD4KKyAqCisgKiBhZWJAY3dpLm5sICAgICAgICA6ICAvcHJvYy9wYXJ0aXRpb25zCisgKgorICoKKyAqIEFsYW4gQ294CSAgICAgOiAgc2VjdXJpdHkgZml4ZXMuCisgKgkJCTxBbGFuLkNveEBsaW51eC5vcmc+CisgKgorICogQWwgVmlybyAgICAgICAgICAgOiAgc2FmZSBoYW5kbGluZyBvZiBtbV9zdHJ1Y3QKKyAqCisgKiBHZXJoYXJkIFdpY2hlcnQgICA6ICBhZGRlZCBCSUdNRU0gc3VwcG9ydAorICogU2llbWVucyBBRyAgICAgICAgICAgPEdlcmhhcmQuV2ljaGVydEBwZGIuc2llbWVucy5kZT4KKyAqCisgKiBBbCBWaXJvICYgSmVmZiBHYXJ6aWsgOiAgbW92ZWQgbW9zdCBvZiB0aGUgdGhpbmcgaW50byBiYXNlLmMgYW5kCisgKgkJCSA6ICBwcm9jX21pc2MuYy4gVGhlIHJlc3QgbWF5IGV2ZW50dWFsbHkgZ28gaW50bworICoJCQkgOiAgYmFzZS5jIHRvby4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9odWdldGxiLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdXNldC5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisvKiBHY2Mgb3B0aW1pemVzIGF3YXkgInN0cmxlbih4KSIgZm9yIGNvbnN0YW50IHggKi8KKyNkZWZpbmUgQUREQlVGKGJ1ZmZlciwgc3RyaW5nKSBcCitkbyB7IG1lbWNweShidWZmZXIsIHN0cmluZywgc3RybGVuKHN0cmluZykpOyBcCisgICAgIGJ1ZmZlciArPSBzdHJsZW4oc3RyaW5nKTsgfSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSBjaGFyICogdGFza19uYW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgY2hhciAqIGJ1ZikKK3sKKwlpbnQgaTsKKwljaGFyICogbmFtZTsKKwljaGFyIHRjb21tW3NpemVvZihwLT5jb21tKV07CisKKwlnZXRfdGFza19jb21tKHRjb21tLCBwKTsKKworCUFEREJVRihidWYsICJOYW1lOlx0Iik7CisJbmFtZSA9IHRjb21tOworCWkgPSBzaXplb2YodGNvbW0pOworCWRvIHsKKwkJdW5zaWduZWQgY2hhciBjID0gKm5hbWU7CisJCW5hbWUrKzsKKwkJaS0tOworCQkqYnVmID0gYzsKKwkJaWYgKCFjKQorCQkJYnJlYWs7CisJCWlmIChjID09ICdcXCcpIHsKKwkJCWJ1ZlsxXSA9IGM7CisJCQlidWYgKz0gMjsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjID09ICdcbicpIHsKKwkJCWJ1ZlswXSA9ICdcXCc7CisJCQlidWZbMV0gPSAnbic7CisJCQlidWYgKz0gMjsKKwkJCWNvbnRpbnVlOworCQl9CisJCWJ1ZisrOworCX0gd2hpbGUgKGkpOworCSpidWYgPSAnXG4nOworCXJldHVybiBidWYrMTsKK30KKworLyoKKyAqIFRoZSB0YXNrIHN0YXRlIGFycmF5IGlzIGEgc3RyYW5nZSAiYml0bWFwIiBvZgorICogcmVhc29ucyB0byBzbGVlcC4gVGh1cyAicnVubmluZyIgaXMgemVybywgYW5kCisgKiB5b3UgY2FuIHRlc3QgZm9yIGNvbWJpbmF0aW9ucyBvZiBvdGhlcnMgd2l0aAorICogc2ltcGxlIGJpdCB0ZXN0cy4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKnRhc2tfc3RhdGVfYXJyYXlbXSA9IHsKKwkiUiAocnVubmluZykiLAkJLyogIDAgKi8KKwkiUyAoc2xlZXBpbmcpIiwJCS8qICAxICovCisJIkQgKGRpc2sgc2xlZXApIiwJLyogIDIgKi8KKwkiVCAoc3RvcHBlZCkiLAkJLyogIDQgKi8KKwkiVCAodHJhY2luZyBzdG9wKSIsCS8qICA4ICovCisJIlogKHpvbWJpZSkiLAkJLyogMTYgKi8KKwkiWCAoZGVhZCkiCQkvKiAzMiAqLworfTsKKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICogZ2V0X3Rhc2tfc3RhdGUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJdW5zaWduZWQgaW50IHN0YXRlID0gKHRzay0+c3RhdGUgJiAoVEFTS19SVU5OSU5HIHwKKwkJCQkJICAgIFRBU0tfSU5URVJSVVBUSUJMRSB8CisJCQkJCSAgICBUQVNLX1VOSU5URVJSVVBUSUJMRSB8CisJCQkJCSAgICBUQVNLX1NUT1BQRUQgfAorCQkJCQkgICAgVEFTS19UUkFDRUQpKSB8CisJCQkodHNrLT5leGl0X3N0YXRlICYgKEVYSVRfWk9NQklFIHwKKwkJCQkJICAgIEVYSVRfREVBRCkpOworCWNvbnN0IGNoYXIgKipwID0gJnRhc2tfc3RhdGVfYXJyYXlbMF07CisKKwl3aGlsZSAoc3RhdGUpIHsKKwkJcCsrOworCQlzdGF0ZSA+Pj0gMTsKKwl9CisJcmV0dXJuICpwOworfQorCitzdGF0aWMgaW5saW5lIGNoYXIgKiB0YXNrX3N0YXRlKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgY2hhciAqYnVmZmVyKQoreworCXN0cnVjdCBncm91cF9pbmZvICpncm91cF9pbmZvOworCWludCBnOworCisJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlidWZmZXIgKz0gc3ByaW50ZihidWZmZXIsCisJCSJTdGF0ZTpcdCVzXG4iCisJCSJTbGVlcEFWRzpcdCVsdSUlXG4iCisJCSJUZ2lkOlx0JWRcbiIKKwkJIlBpZDpcdCVkXG4iCisJCSJQUGlkOlx0JWRcbiIKKwkJIlRyYWNlclBpZDpcdCVkXG4iCisJCSJVaWQ6XHQlZFx0JWRcdCVkXHQlZFxuIgorCQkiR2lkOlx0JWRcdCVkXHQlZFx0JWRcbiIsCisJCWdldF90YXNrX3N0YXRlKHApLAorCQkocC0+c2xlZXBfYXZnLzEwMjQpKjEwMC8oMTAyMDAwMDAwMC8xMDI0KSwKKwkgICAgICAgCXAtPnRnaWQsCisJCXAtPnBpZCwgcGlkX2FsaXZlKHApID8gcC0+Z3JvdXBfbGVhZGVyLT5yZWFsX3BhcmVudC0+dGdpZCA6IDAsCisJCXBpZF9hbGl2ZShwKSAmJiBwLT5wdHJhY2UgPyBwLT5wYXJlbnQtPnBpZCA6IDAsCisJCXAtPnVpZCwgcC0+ZXVpZCwgcC0+c3VpZCwgcC0+ZnN1aWQsCisJCXAtPmdpZCwgcC0+ZWdpZCwgcC0+c2dpZCwgcC0+ZnNnaWQpOworCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwl0YXNrX2xvY2socCk7CisJYnVmZmVyICs9IHNwcmludGYoYnVmZmVyLAorCQkiRkRTaXplOlx0JWRcbiIKKwkJIkdyb3VwczpcdCIsCisJCXAtPmZpbGVzID8gcC0+ZmlsZXMtPm1heF9mZHMgOiAwKTsKKworCWdyb3VwX2luZm8gPSBwLT5ncm91cF9pbmZvOworCWdldF9ncm91cF9pbmZvKGdyb3VwX2luZm8pOworCXRhc2tfdW5sb2NrKHApOworCisJZm9yIChnID0gMDsgZyA8IG1pbihncm91cF9pbmZvLT5uZ3JvdXBzLE5HUk9VUFNfU01BTEwpOyBnKyspCisJCWJ1ZmZlciArPSBzcHJpbnRmKGJ1ZmZlciwgIiVkICIsIEdST1VQX0FUKGdyb3VwX2luZm8sZykpOworCXB1dF9ncm91cF9pbmZvKGdyb3VwX2luZm8pOworCisJYnVmZmVyICs9IHNwcmludGYoYnVmZmVyLCAiXG4iKTsKKwlyZXR1cm4gYnVmZmVyOworfQorCitzdGF0aWMgY2hhciAqIHJlbmRlcl9zaWdzZXRfdChjb25zdCBjaGFyICpoZWFkZXIsIHNpZ3NldF90ICpzZXQsIGNoYXIgKmJ1ZmZlcikKK3sKKwlpbnQgaSwgbGVuOworCisJbGVuID0gc3RybGVuKGhlYWRlcik7CisJbWVtY3B5KGJ1ZmZlciwgaGVhZGVyLCBsZW4pOworCWJ1ZmZlciArPSBsZW47CisKKwlpID0gX05TSUc7CisJZG8geworCQlpbnQgeCA9IDA7CisKKwkJaSAtPSA0OworCQlpZiAoc2lnaXNtZW1iZXIoc2V0LCBpKzEpKSB4IHw9IDE7CisJCWlmIChzaWdpc21lbWJlcihzZXQsIGkrMikpIHggfD0gMjsKKwkJaWYgKHNpZ2lzbWVtYmVyKHNldCwgaSszKSkgeCB8PSA0OworCQlpZiAoc2lnaXNtZW1iZXIoc2V0LCBpKzQpKSB4IHw9IDg7CisJCSpidWZmZXIrKyA9ICh4IDwgMTAgPyAnMCcgOiAnYScgLSAxMCkgKyB4OworCX0gd2hpbGUgKGkgPj0gNCk7CisKKwkqYnVmZmVyKysgPSAnXG4nOworCSpidWZmZXIgPSAwOworCXJldHVybiBidWZmZXI7Cit9CisKK3N0YXRpYyB2b2lkIGNvbGxlY3Rfc2lnaWduX3NpZ2NhdGNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgc2lnc2V0X3QgKmlnbiwKKwkJCQkgICAgc2lnc2V0X3QgKmNhdGNoKQoreworCXN0cnVjdCBrX3NpZ2FjdGlvbiAqazsKKwlpbnQgaTsKKworCWsgPSBwLT5zaWdoYW5kLT5hY3Rpb247CisJZm9yIChpID0gMTsgaSA8PSBfTlNJRzsgKytpLCArK2spIHsKKwkJaWYgKGstPnNhLnNhX2hhbmRsZXIgPT0gU0lHX0lHTikKKwkJCXNpZ2FkZHNldChpZ24sIGkpOworCQllbHNlIGlmIChrLT5zYS5zYV9oYW5kbGVyICE9IFNJR19ERkwpCisJCQlzaWdhZGRzZXQoY2F0Y2gsIGkpOworCX0KK30KKworc3RhdGljIGlubGluZSBjaGFyICogdGFza19zaWcoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBjaGFyICpidWZmZXIpCit7CisJc2lnc2V0X3QgcGVuZGluZywgc2hwZW5kaW5nLCBibG9ja2VkLCBpZ25vcmVkLCBjYXVnaHQ7CisJaW50IG51bV90aHJlYWRzID0gMDsKKwl1bnNpZ25lZCBsb25nIHFzaXplID0gMDsKKwl1bnNpZ25lZCBsb25nIHFsaW0gPSAwOworCisJc2lnZW1wdHlzZXQoJnBlbmRpbmcpOworCXNpZ2VtcHR5c2V0KCZzaHBlbmRpbmcpOworCXNpZ2VtcHR5c2V0KCZibG9ja2VkKTsKKwlzaWdlbXB0eXNldCgmaWdub3JlZCk7CisJc2lnZW1wdHlzZXQoJmNhdWdodCk7CisKKwkvKiBHYXRoZXIgYWxsIHRoZSBkYXRhIHdpdGggdGhlIGFwcHJvcHJpYXRlIGxvY2tzIGhlbGQgKi8KKwlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCWlmIChwLT5zaWdoYW5kKSB7CisJCXNwaW5fbG9ja19pcnEoJnAtPnNpZ2hhbmQtPnNpZ2xvY2spOworCQlwZW5kaW5nID0gcC0+cGVuZGluZy5zaWduYWw7CisJCXNocGVuZGluZyA9IHAtPnNpZ25hbC0+c2hhcmVkX3BlbmRpbmcuc2lnbmFsOworCQlibG9ja2VkID0gcC0+YmxvY2tlZDsKKwkJY29sbGVjdF9zaWdpZ25fc2lnY2F0Y2gocCwgJmlnbm9yZWQsICZjYXVnaHQpOworCQludW1fdGhyZWFkcyA9IGF0b21pY19yZWFkKCZwLT5zaWduYWwtPmNvdW50KTsKKwkJcXNpemUgPSBhdG9taWNfcmVhZCgmcC0+dXNlci0+c2lncGVuZGluZyk7CisJCXFsaW0gPSBwLT5zaWduYWwtPnJsaW1bUkxJTUlUX1NJR1BFTkRJTkddLnJsaW1fY3VyOworCQlzcGluX3VubG9ja19pcnEoJnAtPnNpZ2hhbmQtPnNpZ2xvY2spOworCX0KKwlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisKKwlidWZmZXIgKz0gc3ByaW50ZihidWZmZXIsICJUaHJlYWRzOlx0JWRcbiIsIG51bV90aHJlYWRzKTsKKwlidWZmZXIgKz0gc3ByaW50ZihidWZmZXIsICJTaWdROlx0JWx1LyVsdVxuIiwgcXNpemUsIHFsaW0pOworCisJLyogcmVuZGVyIHRoZW0gYWxsICovCisJYnVmZmVyID0gcmVuZGVyX3NpZ3NldF90KCJTaWdQbmQ6XHQiLCAmcGVuZGluZywgYnVmZmVyKTsKKwlidWZmZXIgPSByZW5kZXJfc2lnc2V0X3QoIlNoZFBuZDpcdCIsICZzaHBlbmRpbmcsIGJ1ZmZlcik7CisJYnVmZmVyID0gcmVuZGVyX3NpZ3NldF90KCJTaWdCbGs6XHQiLCAmYmxvY2tlZCwgYnVmZmVyKTsKKwlidWZmZXIgPSByZW5kZXJfc2lnc2V0X3QoIlNpZ0lnbjpcdCIsICZpZ25vcmVkLCBidWZmZXIpOworCWJ1ZmZlciA9IHJlbmRlcl9zaWdzZXRfdCgiU2lnQ2d0Olx0IiwgJmNhdWdodCwgYnVmZmVyKTsKKworCXJldHVybiBidWZmZXI7Cit9CisKK3N0YXRpYyBpbmxpbmUgY2hhciAqdGFza19jYXAoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBjaGFyICpidWZmZXIpCit7CisgICAgcmV0dXJuIGJ1ZmZlciArIHNwcmludGYoYnVmZmVyLCAiQ2FwSW5oOlx0JTAxNnhcbiIKKwkJCSAgICAiQ2FwUHJtOlx0JTAxNnhcbiIKKwkJCSAgICAiQ2FwRWZmOlx0JTAxNnhcbiIsCisJCQkgICAgY2FwX3QocC0+Y2FwX2luaGVyaXRhYmxlKSwKKwkJCSAgICBjYXBfdChwLT5jYXBfcGVybWl0dGVkKSwKKwkJCSAgICBjYXBfdChwLT5jYXBfZWZmZWN0aXZlKSk7Cit9CisKK2ludCBwcm9jX3BpZF9zdGF0dXMoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICogYnVmZmVyKQoreworCWNoYXIgKiBvcmlnID0gYnVmZmVyOworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gZ2V0X3Rhc2tfbW0odGFzayk7CisKKwlidWZmZXIgPSB0YXNrX25hbWUodGFzaywgYnVmZmVyKTsKKwlidWZmZXIgPSB0YXNrX3N0YXRlKHRhc2ssIGJ1ZmZlcik7CisgCisJaWYgKG1tKSB7CisJCWJ1ZmZlciA9IHRhc2tfbWVtKG1tLCBidWZmZXIpOworCQltbXB1dChtbSk7CisJfQorCWJ1ZmZlciA9IHRhc2tfc2lnKHRhc2ssIGJ1ZmZlcik7CisJYnVmZmVyID0gdGFza19jYXAodGFzaywgYnVmZmVyKTsKKwlidWZmZXIgPSBjcHVzZXRfdGFza19zdGF0dXNfYWxsb3dlZCh0YXNrLCBidWZmZXIpOworI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfUzM5MCkKKwlidWZmZXIgPSB0YXNrX3Nob3dfcmVncyh0YXNrLCBidWZmZXIpOworI2VuZGlmCisJcmV0dXJuIGJ1ZmZlciAtIG9yaWc7Cit9CisKK3N0YXRpYyBpbnQgZG9fdGFza19zdGF0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY2hhciAqIGJ1ZmZlciwgaW50IHdob2xlKQoreworCXVuc2lnbmVkIGxvbmcgdnNpemUsIGVpcCwgZXNwLCB3Y2hhbiA9IH4wVUw7CisJbG9uZyBwcmlvcml0eSwgbmljZTsKKwlpbnQgdHR5X3BncnAgPSAtMSwgdHR5X25yID0gMDsKKwlzaWdzZXRfdCBzaWdpZ24sIHNpZ2NhdGNoOworCWNoYXIgc3RhdGU7CisJaW50IHJlczsKKyAJcGlkX3QgcHBpZCwgcGdpZCA9IC0xLCBzaWQgPSAtMTsKKwlpbnQgbnVtX3RocmVhZHMgPSAwOworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOworCXVuc2lnbmVkIGxvbmcgbG9uZyBzdGFydF90aW1lOworCXVuc2lnbmVkIGxvbmcgY21pbl9mbHQgPSAwLCBjbWFqX2ZsdCA9IDA7CisJdW5zaWduZWQgbG9uZyAgbWluX2ZsdCA9IDAsICBtYWpfZmx0ID0gMDsKKwljcHV0aW1lX3QgY3V0aW1lLCBjc3RpbWUsIHV0aW1lLCBzdGltZTsKKwl1bnNpZ25lZCBsb25nIHJzc2xpbSA9IDA7CisJdW5zaWduZWQgbG9uZyBpdF9yZWFsX3ZhbHVlID0gMDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQ7CisJY2hhciB0Y29tbVtzaXplb2YodGFzay0+Y29tbSldOworCisJc3RhdGUgPSAqZ2V0X3Rhc2tfc3RhdGUodGFzayk7CisJdnNpemUgPSBlaXAgPSBlc3AgPSAwOworCW1tID0gZ2V0X3Rhc2tfbW0odGFzayk7CisJaWYgKG1tKSB7CisJCXZzaXplID0gdGFza192c2l6ZShtbSk7CisJCWVpcCA9IEtTVEtfRUlQKHRhc2spOworCQllc3AgPSBLU1RLX0VTUCh0YXNrKTsKKwl9CisKKwlnZXRfdGFza19jb21tKHRjb21tLCB0YXNrKTsKKworCXNpZ2VtcHR5c2V0KCZzaWdpZ24pOworCXNpZ2VtcHR5c2V0KCZzaWdjYXRjaCk7CisJY3V0aW1lID0gY3N0aW1lID0gdXRpbWUgPSBzdGltZSA9IGNwdXRpbWVfemVybzsKKwlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCWlmICh0YXNrLT5zaWdoYW5kKSB7CisJCXNwaW5fbG9ja19pcnEoJnRhc2stPnNpZ2hhbmQtPnNpZ2xvY2spOworCQludW1fdGhyZWFkcyA9IGF0b21pY19yZWFkKCZ0YXNrLT5zaWduYWwtPmNvdW50KTsKKwkJY29sbGVjdF9zaWdpZ25fc2lnY2F0Y2godGFzaywgJnNpZ2lnbiwgJnNpZ2NhdGNoKTsKKworCQkvKiBhZGQgdXAgbGl2ZSB0aHJlYWQgc3RhdHMgYXQgdGhlIGdyb3VwIGxldmVsICovCisJCWlmICh3aG9sZSkgeworCQkJdCA9IHRhc2s7CisJCQlkbyB7CisJCQkJbWluX2ZsdCArPSB0LT5taW5fZmx0OworCQkJCW1hal9mbHQgKz0gdC0+bWFqX2ZsdDsKKwkJCQl1dGltZSA9IGNwdXRpbWVfYWRkKHV0aW1lLCB0LT51dGltZSk7CisJCQkJc3RpbWUgPSBjcHV0aW1lX2FkZChzdGltZSwgdC0+c3RpbWUpOworCQkJCXQgPSBuZXh0X3RocmVhZCh0KTsKKwkJCX0gd2hpbGUgKHQgIT0gdGFzayk7CisJCX0KKworCQlzcGluX3VubG9ja19pcnEoJnRhc2stPnNpZ2hhbmQtPnNpZ2xvY2spOworCX0KKwlpZiAodGFzay0+c2lnbmFsKSB7CisJCWlmICh0YXNrLT5zaWduYWwtPnR0eSkgeworCQkJdHR5X3BncnAgPSB0YXNrLT5zaWduYWwtPnR0eS0+cGdycDsKKwkJCXR0eV9uciA9IG5ld19lbmNvZGVfZGV2KHR0eV9kZXZudW0odGFzay0+c2lnbmFsLT50dHkpKTsKKwkJfQorCQlwZ2lkID0gcHJvY2Vzc19ncm91cCh0YXNrKTsKKwkJc2lkID0gdGFzay0+c2lnbmFsLT5zZXNzaW9uOworCQljbWluX2ZsdCA9IHRhc2stPnNpZ25hbC0+Y21pbl9mbHQ7CisJCWNtYWpfZmx0ID0gdGFzay0+c2lnbmFsLT5jbWFqX2ZsdDsKKwkJY3V0aW1lID0gdGFzay0+c2lnbmFsLT5jdXRpbWU7CisJCWNzdGltZSA9IHRhc2stPnNpZ25hbC0+Y3N0aW1lOworCQlyc3NsaW0gPSB0YXNrLT5zaWduYWwtPnJsaW1bUkxJTUlUX1JTU10ucmxpbV9jdXI7CisJCWlmICh3aG9sZSkgeworCQkJbWluX2ZsdCArPSB0YXNrLT5zaWduYWwtPm1pbl9mbHQ7CisJCQltYWpfZmx0ICs9IHRhc2stPnNpZ25hbC0+bWFqX2ZsdDsKKwkJCXV0aW1lID0gY3B1dGltZV9hZGQodXRpbWUsIHRhc2stPnNpZ25hbC0+dXRpbWUpOworCQkJc3RpbWUgPSBjcHV0aW1lX2FkZChzdGltZSwgdGFzay0+c2lnbmFsLT5zdGltZSk7CisJCX0KKwkJaXRfcmVhbF92YWx1ZSA9IHRhc2stPnNpZ25hbC0+aXRfcmVhbF92YWx1ZTsKKwl9CisJcHBpZCA9IHBpZF9hbGl2ZSh0YXNrKSA/IHRhc2stPmdyb3VwX2xlYWRlci0+cmVhbF9wYXJlbnQtPnRnaWQgOiAwOworCXJlYWRfdW5sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKworCWlmICghd2hvbGUgfHwgbnVtX3RocmVhZHM8MikKKwkJd2NoYW4gPSBnZXRfd2NoYW4odGFzayk7CisJaWYgKCF3aG9sZSkgeworCQltaW5fZmx0ID0gdGFzay0+bWluX2ZsdDsKKwkJbWFqX2ZsdCA9IHRhc2stPm1hal9mbHQ7CisJCXV0aW1lID0gdGFzay0+dXRpbWU7CisJCXN0aW1lID0gdGFzay0+c3RpbWU7CisJfQorCisJLyogc2NhbGUgcHJpb3JpdHkgYW5kIG5pY2UgdmFsdWVzIGZyb20gdGltZXNsaWNlcyB0byAtMjAuLjIwICovCisJLyogdG8gbWFrZSBpdCBsb29rIGxpa2UgYSAibm9ybWFsIiBVbml4IHByaW9yaXR5L25pY2UgdmFsdWUgICovCisJcHJpb3JpdHkgPSB0YXNrX3ByaW8odGFzayk7CisJbmljZSA9IHRhc2tfbmljZSh0YXNrKTsKKworCS8qIFRlbXBvcmFyeSB2YXJpYWJsZSBuZWVkZWQgZm9yIGdjYy0yLjk2ICovCisJLyogY29udmVydCB0aW1lc3BlYyAtPiBuc2VjKi8KKwlzdGFydF90aW1lID0gKHVuc2lnbmVkIGxvbmcgbG9uZyl0YXNrLT5zdGFydF90aW1lLnR2X3NlYyAqIE5TRUNfUEVSX1NFQworCQkJCSsgdGFzay0+c3RhcnRfdGltZS50dl9uc2VjOworCS8qIGNvbnZlcnQgbnNlYyAtPiB0aWNrcyAqLworCXN0YXJ0X3RpbWUgPSBuc2VjX3RvX2Nsb2NrX3Qoc3RhcnRfdGltZSk7CisKKwlyZXMgPSBzcHJpbnRmKGJ1ZmZlciwiJWQgKCVzKSAlYyAlZCAlZCAlZCAlZCAlZCAlbHUgJWx1IFwKKyVsdSAlbHUgJWx1ICVsdSAlbHUgJWxkICVsZCAlbGQgJWxkICVkICVsZCAlbGx1ICVsdSAlbGQgJWx1ICVsdSAlbHUgJWx1ICVsdSBcCislbHUgJWx1ICVsdSAlbHUgJWx1ICVsdSAlbHUgJWx1ICVkICVkICVsdSAlbHVcbiIsCisJCXRhc2stPnBpZCwKKwkJdGNvbW0sCisJCXN0YXRlLAorCQlwcGlkLAorCQlwZ2lkLAorCQlzaWQsCisJCXR0eV9uciwKKwkJdHR5X3BncnAsCisJCXRhc2stPmZsYWdzLAorCQltaW5fZmx0LAorCQljbWluX2ZsdCwKKwkJbWFqX2ZsdCwKKwkJY21hal9mbHQsCisJCWNwdXRpbWVfdG9fY2xvY2tfdCh1dGltZSksCisJCWNwdXRpbWVfdG9fY2xvY2tfdChzdGltZSksCisJCWNwdXRpbWVfdG9fY2xvY2tfdChjdXRpbWUpLAorCQljcHV0aW1lX3RvX2Nsb2NrX3QoY3N0aW1lKSwKKwkJcHJpb3JpdHksCisJCW5pY2UsCisJCW51bV90aHJlYWRzLAorCQlqaWZmaWVzX3RvX2Nsb2NrX3QoaXRfcmVhbF92YWx1ZSksCisJCXN0YXJ0X3RpbWUsCisJCXZzaXplLAorCQltbSA/IGdldF9tbV9jb3VudGVyKG1tLCByc3MpIDogMCwgLyogeW91IG1pZ2h0IHdhbnQgdG8gc2hpZnQgdGhpcyBsZWZ0IDMgKi8KKwkgICAgICAgIHJzc2xpbSwKKwkJbW0gPyBtbS0+c3RhcnRfY29kZSA6IDAsCisJCW1tID8gbW0tPmVuZF9jb2RlIDogMCwKKwkJbW0gPyBtbS0+c3RhcnRfc3RhY2sgOiAwLAorCQllc3AsCisJCWVpcCwKKwkJLyogVGhlIHNpZ25hbCBpbmZvcm1hdGlvbiBoZXJlIGlzIG9ic29sZXRlLgorCQkgKiBJdCBtdXN0IGJlIGRlY2ltYWwgZm9yIExpbnV4IDIuMCBjb21wYXRpYmlsaXR5LgorCQkgKiBVc2UgL3Byb2MvIy9zdGF0dXMgZm9yIHJlYWwtdGltZSBzaWduYWxzLgorCQkgKi8KKwkJdGFzay0+cGVuZGluZy5zaWduYWwuc2lnWzBdICYgMHg3ZmZmZmZmZlVMLAorCQl0YXNrLT5ibG9ja2VkLnNpZ1swXSAmIDB4N2ZmZmZmZmZVTCwKKwkJc2lnaWduICAgICAgLnNpZ1swXSAmIDB4N2ZmZmZmZmZVTCwKKwkJc2lnY2F0Y2ggICAgLnNpZ1swXSAmIDB4N2ZmZmZmZmZVTCwKKwkJd2NoYW4sCisJCTBVTCwKKwkJMFVMLAorCQl0YXNrLT5leGl0X3NpZ25hbCwKKwkJdGFza19jcHUodGFzayksCisJCXRhc2stPnJ0X3ByaW9yaXR5LAorCQl0YXNrLT5wb2xpY3kpOworCWlmKG1tKQorCQltbXB1dChtbSk7CisJcmV0dXJuIHJlczsKK30KKworaW50IHByb2NfdGlkX3N0YXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICogYnVmZmVyKQoreworCXJldHVybiBkb190YXNrX3N0YXQodGFzaywgYnVmZmVyLCAwKTsKK30KKworaW50IHByb2NfdGdpZF9zdGF0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgY2hhciAqIGJ1ZmZlcikKK3sKKwlyZXR1cm4gZG9fdGFza19zdGF0KHRhc2ssIGJ1ZmZlciwgMSk7Cit9CisKK2ludCBwcm9jX3BpZF9zdGF0bShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGNoYXIgKmJ1ZmZlcikKK3sKKwlpbnQgc2l6ZSA9IDAsIHJlc2lkZW50ID0gMCwgc2hhcmVkID0gMCwgdGV4dCA9IDAsIGxpYiA9IDAsIGRhdGEgPSAwOworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gZ2V0X3Rhc2tfbW0odGFzayk7CisJCisJaWYgKG1tKSB7CisJCXNpemUgPSB0YXNrX3N0YXRtKG1tLCAmc2hhcmVkLCAmdGV4dCwgJmRhdGEsICZyZXNpZGVudCk7CisJCW1tcHV0KG1tKTsKKwl9CisKKwlyZXR1cm4gc3ByaW50ZihidWZmZXIsIiVkICVkICVkICVkICVkICVkICVkXG4iLAorCQkgICAgICAgc2l6ZSwgcmVzaWRlbnQsIHNoYXJlZCwgdGV4dCwgbGliLCBkYXRhLCAwKTsKK30KZGlmZiAtLWdpdCBhL2ZzL3Byb2MvYmFzZS5jIGIvZnMvcHJvYy9iYXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFkOGVhNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3Byb2MvYmFzZS5jCkBAIC0wLDAgKzEsMjA1NiBAQAorLyoKKyAqICBsaW51eC9mcy9wcm9jL2Jhc2UuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgcHJvYyBiYXNlIGRpcmVjdG9yeSBoYW5kbGluZyBmdW5jdGlvbnMKKyAqCisgKiAgMTk5OSwgQWwgVmlyby4gUmV3cml0dGVuLiBOb3cgaXQgY292ZXJzIHRoZSB3aG9sZSBwZXItcHJvY2VzcyBwYXJ0LgorICogIEluc3RlYWQgb2YgdXNpbmcgbWFnaWNhbCBpbnVtYmVycyB0byBkZXRlcm1pbmUgdGhlIGtpbmQgb2Ygb2JqZWN0CisgKiAgd2UgYWxsb2NhdGUgYW5kIGZpbGwgaW4tY29yZSBpbm9kZXMgdXBvbiBsb29rdXAuIFRoZXkgZG9uJ3QgZXZlbgorICogIGdvIGludG8gaWNhY2hlLiBXZSBjYWNoZSB0aGUgcmVmZXJlbmNlIHRvIHRhc2tfc3RydWN0IHVwb24gbG9va3VwIHRvby4KKyAqICBFdmVudHVhbGx5IGl0IHNob3VsZCBiZWNvbWUgYSBmaWxlc3lzdGVtIGluIGl0cyBvd24uIFdlIGRvbid0IHVzZSB0aGUKKyAqICByZXN0IG9mIHByb2NmcyBhbnltb3JlLgorICovCisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1lc3BhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2VjY29tcC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdXNldC5oPgorI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworLyoKKyAqIEZvciBoeXN0ZXJpY2FsIHJhaXNpbnMgd2Uga2VlcCB0aGUgc2FtZSBpbnVtYmVycyBhcyBpbiB0aGUgb2xkIHByb2Nmcy4KKyAqIEZlZWwgZnJlZSB0byBjaGFuZ2UgdGhlIG1hY3JvIGJlbG93IC0ganVzdCBrZWVwIHRoZSByYW5nZSBkaXN0aW5jdCBmcm9tCisgKiBpbnVtYmVycyBvZiB0aGUgcmVzdCBvZiBwcm9jZnMgKGN1cnJlbnRseSB0aG9zZSBhcmUgaW4gMHgwMDAwLS0weGZmZmYpLgorICogQXMgc29vbiBhcyB3ZSdsbCBnZXQgYSBzZXBhcmF0ZSBzdXBlcmJsb2NrIHdlIHdpbGwgYmUgYWJsZSB0byBmb3JnZXQKKyAqIGFib3V0IG1hZ2ljYWwgcmFuZ2VzIHRvby4KKyAqLworCisjZGVmaW5lIGZha2VfaW5vKHBpZCxpbm8pICgoKHBpZCk8PDE2KXwoaW5vKSkKKworZW51bSBwaWRfZGlyZWN0b3J5X2lub3MgeworCVBST0NfVEdJRF9JTk8gPSAyLAorCVBST0NfVEdJRF9UQVNLLAorCVBST0NfVEdJRF9TVEFUVVMsCisJUFJPQ19UR0lEX01FTSwKKyNpZmRlZiBDT05GSUdfU0VDQ09NUAorCVBST0NfVEdJRF9TRUNDT01QLAorI2VuZGlmCisJUFJPQ19UR0lEX0NXRCwKKwlQUk9DX1RHSURfUk9PVCwKKwlQUk9DX1RHSURfRVhFLAorCVBST0NfVEdJRF9GRCwKKwlQUk9DX1RHSURfRU5WSVJPTiwKKwlQUk9DX1RHSURfQVVYViwKKwlQUk9DX1RHSURfQ01ETElORSwKKwlQUk9DX1RHSURfU1RBVCwKKwlQUk9DX1RHSURfU1RBVE0sCisJUFJPQ19UR0lEX01BUFMsCisJUFJPQ19UR0lEX01PVU5UUywKKwlQUk9DX1RHSURfV0NIQU4sCisjaWZkZWYgQ09ORklHX1NDSEVEU1RBVFMKKwlQUk9DX1RHSURfU0NIRURTVEFULAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0NQVVNFVFMKKwlQUk9DX1RHSURfQ1BVU0VULAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NFQ1VSSVRZCisJUFJPQ19UR0lEX0FUVFIsCisJUFJPQ19UR0lEX0FUVFJfQ1VSUkVOVCwKKwlQUk9DX1RHSURfQVRUUl9QUkVWLAorCVBST0NfVEdJRF9BVFRSX0VYRUMsCisJUFJPQ19UR0lEX0FUVFJfRlNDUkVBVEUsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVVESVRTWVNDQUxMCisJUFJPQ19UR0lEX0xPR0lOVUlELAorI2VuZGlmCisJUFJPQ19UR0lEX0ZEX0RJUiwKKwlQUk9DX1RHSURfT09NX1NDT1JFLAorCVBST0NfVEdJRF9PT01fQURKVVNULAorCVBST0NfVElEX0lOTywKKwlQUk9DX1RJRF9TVEFUVVMsCisJUFJPQ19USURfTUVNLAorI2lmZGVmIENPTkZJR19TRUNDT01QCisJUFJPQ19USURfU0VDQ09NUCwKKyNlbmRpZgorCVBST0NfVElEX0NXRCwKKwlQUk9DX1RJRF9ST09ULAorCVBST0NfVElEX0VYRSwKKwlQUk9DX1RJRF9GRCwKKwlQUk9DX1RJRF9FTlZJUk9OLAorCVBST0NfVElEX0FVWFYsCisJUFJPQ19USURfQ01ETElORSwKKwlQUk9DX1RJRF9TVEFULAorCVBST0NfVElEX1NUQVRNLAorCVBST0NfVElEX01BUFMsCisJUFJPQ19USURfTU9VTlRTLAorCVBST0NfVElEX1dDSEFOLAorI2lmZGVmIENPTkZJR19TQ0hFRFNUQVRTCisJUFJPQ19USURfU0NIRURTVEFULAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0NQVVNFVFMKKwlQUk9DX1RJRF9DUFVTRVQsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0VDVVJJVFkKKwlQUk9DX1RJRF9BVFRSLAorCVBST0NfVElEX0FUVFJfQ1VSUkVOVCwKKwlQUk9DX1RJRF9BVFRSX1BSRVYsCisJUFJPQ19USURfQVRUUl9FWEVDLAorCVBST0NfVElEX0FUVFJfRlNDUkVBVEUsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVVESVRTWVNDQUxMCisJUFJPQ19USURfTE9HSU5VSUQsCisjZW5kaWYKKwlQUk9DX1RJRF9GRF9ESVIgPSAweDgwMDAsCS8qIDB4ODAwMC0weGZmZmYgKi8KKwlQUk9DX1RJRF9PT01fU0NPUkUsCisJUFJPQ19USURfT09NX0FESlVTVCwKK307CisKK3N0cnVjdCBwaWRfZW50cnkgeworCWludCB0eXBlOworCWludCBsZW47CisJY2hhciAqbmFtZTsKKwltb2RlX3QgbW9kZTsKK307CisKKyNkZWZpbmUgRSh0eXBlLG5hbWUsbW9kZSkgeyh0eXBlKSxzaXplb2YobmFtZSktMSwobmFtZSksKG1vZGUpfQorCitzdGF0aWMgc3RydWN0IHBpZF9lbnRyeSB0Z2lkX2Jhc2Vfc3R1ZmZbXSA9IHsKKwlFKFBST0NfVEdJRF9UQVNLLCAgICAgICJ0YXNrIiwgICAgU19JRkRJUnxTX0lSVUdPfFNfSVhVR08pLAorCUUoUFJPQ19UR0lEX0ZELCAgICAgICAgImZkIiwgICAgICBTX0lGRElSfFNfSVJVU1J8U19JWFVTUiksCisJRShQUk9DX1RHSURfRU5WSVJPTiwgICAiZW52aXJvbiIsIFNfSUZSRUd8U19JUlVTUiksCisJRShQUk9DX1RHSURfQVVYViwgICAgICAiYXV4diIsCSAgU19JRlJFR3xTX0lSVVNSKSwKKwlFKFBST0NfVEdJRF9TVEFUVVMsICAgICJzdGF0dXMiLCAgU19JRlJFR3xTX0lSVUdPKSwKKwlFKFBST0NfVEdJRF9DTURMSU5FLCAgICJjbWRsaW5lIiwgU19JRlJFR3xTX0lSVUdPKSwKKwlFKFBST0NfVEdJRF9TVEFULCAgICAgICJzdGF0IiwgICAgU19JRlJFR3xTX0lSVUdPKSwKKwlFKFBST0NfVEdJRF9TVEFUTSwgICAgICJzdGF0bSIsICAgU19JRlJFR3xTX0lSVUdPKSwKKwlFKFBST0NfVEdJRF9NQVBTLCAgICAgICJtYXBzIiwgICAgU19JRlJFR3xTX0lSVUdPKSwKKwlFKFBST0NfVEdJRF9NRU0sICAgICAgICJtZW0iLCAgICAgU19JRlJFR3xTX0lSVVNSfFNfSVdVU1IpLAorI2lmZGVmIENPTkZJR19TRUNDT01QCisJRShQUk9DX1RHSURfU0VDQ09NUCwgICAic2VjY29tcCIsIFNfSUZSRUd8U19JUlVTUnxTX0lXVVNSKSwKKyNlbmRpZgorCUUoUFJPQ19UR0lEX0NXRCwgICAgICAgImN3ZCIsICAgICBTX0lGTE5LfFNfSVJXWFVHTyksCisJRShQUk9DX1RHSURfUk9PVCwgICAgICAicm9vdCIsICAgIFNfSUZMTkt8U19JUldYVUdPKSwKKwlFKFBST0NfVEdJRF9FWEUsICAgICAgICJleGUiLCAgICAgU19JRkxOS3xTX0lSV1hVR08pLAorCUUoUFJPQ19UR0lEX01PVU5UUywgICAgIm1vdW50cyIsICBTX0lGUkVHfFNfSVJVR08pLAorI2lmZGVmIENPTkZJR19TRUNVUklUWQorCUUoUFJPQ19UR0lEX0FUVFIsICAgICAgImF0dHIiLCAgICBTX0lGRElSfFNfSVJVR098U19JWFVHTyksCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfS0FMTFNZTVMKKwlFKFBST0NfVEdJRF9XQ0hBTiwgICAgICJ3Y2hhbiIsICAgU19JRlJFR3xTX0lSVUdPKSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TQ0hFRFNUQVRTCisJRShQUk9DX1RHSURfU0NIRURTVEFULCAic2NoZWRzdGF0IiwgU19JRlJFR3xTX0lSVUdPKSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DUFVTRVRTCisJRShQUk9DX1RHSURfQ1BVU0VULCAgICAiY3B1c2V0IiwgIFNfSUZSRUd8U19JUlVHTyksCisjZW5kaWYKKwlFKFBST0NfVEdJRF9PT01fU0NPUkUsICJvb21fc2NvcmUiLFNfSUZSRUd8U19JUlVHTyksCisJRShQUk9DX1RHSURfT09NX0FESlVTVCwib29tX2FkaiIsIFNfSUZSRUd8U19JUlVHT3xTX0lXVVNSKSwKKyNpZmRlZiBDT05GSUdfQVVESVRTWVNDQUxMCisJRShQUk9DX1RHSURfTE9HSU5VSUQsICJsb2dpbnVpZCIsIFNfSUZSRUd8U19JV1VTUnxTX0lSVUdPKSwKKyNlbmRpZgorCXswLDAsTlVMTCwwfQorfTsKK3N0YXRpYyBzdHJ1Y3QgcGlkX2VudHJ5IHRpZF9iYXNlX3N0dWZmW10gPSB7CisJRShQUk9DX1RJRF9GRCwgICAgICAgICAiZmQiLCAgICAgIFNfSUZESVJ8U19JUlVTUnxTX0lYVVNSKSwKKwlFKFBST0NfVElEX0VOVklST04sICAgICJlbnZpcm9uIiwgU19JRlJFR3xTX0lSVVNSKSwKKwlFKFBST0NfVElEX0FVWFYsICAgICAgICJhdXh2IiwJICBTX0lGUkVHfFNfSVJVU1IpLAorCUUoUFJPQ19USURfU1RBVFVTLCAgICAgInN0YXR1cyIsICBTX0lGUkVHfFNfSVJVR08pLAorCUUoUFJPQ19USURfQ01ETElORSwgICAgImNtZGxpbmUiLCBTX0lGUkVHfFNfSVJVR08pLAorCUUoUFJPQ19USURfU1RBVCwgICAgICAgInN0YXQiLCAgICBTX0lGUkVHfFNfSVJVR08pLAorCUUoUFJPQ19USURfU1RBVE0sICAgICAgInN0YXRtIiwgICBTX0lGUkVHfFNfSVJVR08pLAorCUUoUFJPQ19USURfTUFQUywgICAgICAgIm1hcHMiLCAgICBTX0lGUkVHfFNfSVJVR08pLAorCUUoUFJPQ19USURfTUVNLCAgICAgICAgIm1lbSIsICAgICBTX0lGUkVHfFNfSVJVU1J8U19JV1VTUiksCisjaWZkZWYgQ09ORklHX1NFQ0NPTVAKKwlFKFBST0NfVElEX1NFQ0NPTVAsICAgICJzZWNjb21wIiwgU19JRlJFR3xTX0lSVVNSfFNfSVdVU1IpLAorI2VuZGlmCisJRShQUk9DX1RJRF9DV0QsICAgICAgICAiY3dkIiwgICAgIFNfSUZMTkt8U19JUldYVUdPKSwKKwlFKFBST0NfVElEX1JPT1QsICAgICAgICJyb290IiwgICAgU19JRkxOS3xTX0lSV1hVR08pLAorCUUoUFJPQ19USURfRVhFLCAgICAgICAgImV4ZSIsICAgICBTX0lGTE5LfFNfSVJXWFVHTyksCisJRShQUk9DX1RJRF9NT1VOVFMsICAgICAibW91bnRzIiwgIFNfSUZSRUd8U19JUlVHTyksCisjaWZkZWYgQ09ORklHX1NFQ1VSSVRZCisJRShQUk9DX1RJRF9BVFRSLCAgICAgICAiYXR0ciIsICAgIFNfSUZESVJ8U19JUlVHT3xTX0lYVUdPKSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19LQUxMU1lNUworCUUoUFJPQ19USURfV0NIQU4sICAgICAgIndjaGFuIiwgICBTX0lGUkVHfFNfSVJVR08pLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NDSEVEU1RBVFMKKwlFKFBST0NfVElEX1NDSEVEU1RBVCwgInNjaGVkc3RhdCIsU19JRlJFR3xTX0lSVUdPKSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DUFVTRVRTCisJRShQUk9DX1RJRF9DUFVTRVQsICAgICAiY3B1c2V0IiwgIFNfSUZSRUd8U19JUlVHTyksCisjZW5kaWYKKwlFKFBST0NfVElEX09PTV9TQ09SRSwgICJvb21fc2NvcmUiLFNfSUZSRUd8U19JUlVHTyksCisJRShQUk9DX1RJRF9PT01fQURKVVNULCAib29tX2FkaiIsIFNfSUZSRUd8U19JUlVHT3xTX0lXVVNSKSwKKyNpZmRlZiBDT05GSUdfQVVESVRTWVNDQUxMCisJRShQUk9DX1RJRF9MT0dJTlVJRCwgImxvZ2ludWlkIiwgU19JRlJFR3xTX0lXVVNSfFNfSVJVR08pLAorI2VuZGlmCisJezAsMCxOVUxMLDB9Cit9OworCisjaWZkZWYgQ09ORklHX1NFQ1VSSVRZCitzdGF0aWMgc3RydWN0IHBpZF9lbnRyeSB0Z2lkX2F0dHJfc3R1ZmZbXSA9IHsKKwlFKFBST0NfVEdJRF9BVFRSX0NVUlJFTlQsICAiY3VycmVudCIsICBTX0lGUkVHfFNfSVJVR098U19JV1VHTyksCisJRShQUk9DX1RHSURfQVRUUl9QUkVWLCAgICAgInByZXYiLCAgICAgU19JRlJFR3xTX0lSVUdPKSwKKwlFKFBST0NfVEdJRF9BVFRSX0VYRUMsICAgICAiZXhlYyIsICAgICBTX0lGUkVHfFNfSVJVR098U19JV1VHTyksCisJRShQUk9DX1RHSURfQVRUUl9GU0NSRUFURSwgImZzY3JlYXRlIiwgU19JRlJFR3xTX0lSVUdPfFNfSVdVR08pLAorCXswLDAsTlVMTCwwfQorfTsKK3N0YXRpYyBzdHJ1Y3QgcGlkX2VudHJ5IHRpZF9hdHRyX3N0dWZmW10gPSB7CisJRShQUk9DX1RJRF9BVFRSX0NVUlJFTlQsICAgImN1cnJlbnQiLCAgU19JRlJFR3xTX0lSVUdPfFNfSVdVR08pLAorCUUoUFJPQ19USURfQVRUUl9QUkVWLCAgICAgICJwcmV2IiwgICAgIFNfSUZSRUd8U19JUlVHTyksCisJRShQUk9DX1RJRF9BVFRSX0VYRUMsICAgICAgImV4ZWMiLCAgICAgU19JRlJFR3xTX0lSVUdPfFNfSVdVR08pLAorCUUoUFJPQ19USURfQVRUUl9GU0NSRUFURSwgICJmc2NyZWF0ZSIsIFNfSUZSRUd8U19JUlVHT3xTX0lXVUdPKSwKKwl7MCwwLE5VTEwsMH0KK307CisjZW5kaWYKKworI3VuZGVmIEUKKworc3RhdGljIGludCBwcm9jX2ZkX2xpbmsoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRlbnRyeSAqKmRlbnRyeSwgc3RydWN0IHZmc21vdW50ICoqbW50KQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IHByb2NfdGFzayhpbm9kZSk7CisJc3RydWN0IGZpbGVzX3N0cnVjdCAqZmlsZXM7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJaW50IGZkID0gcHJvY190eXBlKGlub2RlKSAtIFBST0NfVElEX0ZEX0RJUjsKKworCWZpbGVzID0gZ2V0X2ZpbGVzX3N0cnVjdCh0YXNrKTsKKwlpZiAoZmlsZXMpIHsKKwkJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwkJZmlsZSA9IGZjaGVja19maWxlcyhmaWxlcywgZmQpOworCQlpZiAoZmlsZSkgeworCQkJKm1udCA9IG1udGdldChmaWxlLT5mX3Zmc21udCk7CisJCQkqZGVudHJ5ID0gZGdldChmaWxlLT5mX2RlbnRyeSk7CisJCQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJCQlwdXRfZmlsZXNfc3RydWN0KGZpbGVzKTsKKwkJCXJldHVybiAwOworCQl9CisJCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwkJcHV0X2ZpbGVzX3N0cnVjdChmaWxlcyk7CisJfQorCXJldHVybiAtRU5PRU5UOworfQorCitzdGF0aWMgaW50IHByb2NfY3dkX2xpbmsoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRlbnRyeSAqKmRlbnRyeSwgc3RydWN0IHZmc21vdW50ICoqbW50KQoreworCXN0cnVjdCBmc19zdHJ1Y3QgKmZzOworCWludCByZXN1bHQgPSAtRU5PRU5UOworCXRhc2tfbG9jayhwcm9jX3Rhc2soaW5vZGUpKTsKKwlmcyA9IHByb2NfdGFzayhpbm9kZSktPmZzOworCWlmKGZzKQorCQlhdG9taWNfaW5jKCZmcy0+Y291bnQpOworCXRhc2tfdW5sb2NrKHByb2NfdGFzayhpbm9kZSkpOworCWlmIChmcykgeworCQlyZWFkX2xvY2soJmZzLT5sb2NrKTsKKwkJKm1udCA9IG1udGdldChmcy0+cHdkbW50KTsKKwkJKmRlbnRyeSA9IGRnZXQoZnMtPnB3ZCk7CisJCXJlYWRfdW5sb2NrKCZmcy0+bG9jayk7CisJCXJlc3VsdCA9IDA7CisJCXB1dF9mc19zdHJ1Y3QoZnMpOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IHByb2Nfcm9vdF9saW5rKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkZW50cnkgKipkZW50cnksIHN0cnVjdCB2ZnNtb3VudCAqKm1udCkKK3sKKwlzdHJ1Y3QgZnNfc3RydWN0ICpmczsKKwlpbnQgcmVzdWx0ID0gLUVOT0VOVDsKKwl0YXNrX2xvY2socHJvY190YXNrKGlub2RlKSk7CisJZnMgPSBwcm9jX3Rhc2soaW5vZGUpLT5mczsKKwlpZihmcykKKwkJYXRvbWljX2luYygmZnMtPmNvdW50KTsKKwl0YXNrX3VubG9jayhwcm9jX3Rhc2soaW5vZGUpKTsKKwlpZiAoZnMpIHsKKwkJcmVhZF9sb2NrKCZmcy0+bG9jayk7CisJCSptbnQgPSBtbnRnZXQoZnMtPnJvb3RtbnQpOworCQkqZGVudHJ5ID0gZGdldChmcy0+cm9vdCk7CisJCXJlYWRfdW5sb2NrKCZmcy0+bG9jayk7CisJCXJlc3VsdCA9IDA7CisJCXB1dF9mc19zdHJ1Y3QoZnMpOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCisjZGVmaW5lIE1BWV9QVFJBQ0UodGFzaykgXAorCSh0YXNrID09IGN1cnJlbnQgfHwgXAorCSh0YXNrLT5wYXJlbnQgPT0gY3VycmVudCAmJiBcCisJKHRhc2stPnB0cmFjZSAmIFBUX1BUUkFDRUQpICYmIFwKKwkgKHRhc2stPnN0YXRlID09IFRBU0tfU1RPUFBFRCB8fCB0YXNrLT5zdGF0ZSA9PSBUQVNLX1RSQUNFRCkgJiYgXAorCSBzZWN1cml0eV9wdHJhY2UoY3VycmVudCx0YXNrKSA9PSAwKSkKKworc3RhdGljIGludCBtYXlfcHRyYWNlX2F0dGFjaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJaW50IHJldHZhbCA9IDA7CisKKwl0YXNrX2xvY2sodGFzayk7CisKKwlpZiAoIXRhc2stPm1tKQorCQlnb3RvIG91dDsKKwlpZiAoKChjdXJyZW50LT51aWQgIT0gdGFzay0+ZXVpZCkgfHwKKwkgICAgIChjdXJyZW50LT51aWQgIT0gdGFzay0+c3VpZCkgfHwKKwkgICAgIChjdXJyZW50LT51aWQgIT0gdGFzay0+dWlkKSB8fAorCSAgICAgKGN1cnJlbnQtPmdpZCAhPSB0YXNrLT5lZ2lkKSB8fAorCSAgICAgKGN1cnJlbnQtPmdpZCAhPSB0YXNrLT5zZ2lkKSB8fAorCSAgICAgKGN1cnJlbnQtPmdpZCAhPSB0YXNrLT5naWQpKSAmJiAhY2FwYWJsZShDQVBfU1lTX1BUUkFDRSkpCisJCWdvdG8gb3V0OworCXJtYigpOworCWlmICghdGFzay0+bW0tPmR1bXBhYmxlICYmICFjYXBhYmxlKENBUF9TWVNfUFRSQUNFKSkKKwkJZ290byBvdXQ7CisJaWYgKHNlY3VyaXR5X3B0cmFjZShjdXJyZW50LCB0YXNrKSkKKwkJZ290byBvdXQ7CisKKwlyZXR2YWwgPSAxOworb3V0OgorCXRhc2tfdW5sb2NrKHRhc2spOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19waWRfZW52aXJvbihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGNoYXIgKiBidWZmZXIpCit7CisJaW50IHJlcyA9IDA7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBnZXRfdGFza19tbSh0YXNrKTsKKwlpZiAobW0pIHsKKwkJdW5zaWduZWQgaW50IGxlbiA9IG1tLT5lbnZfZW5kIC0gbW0tPmVudl9zdGFydDsKKwkJaWYgKGxlbiA+IFBBR0VfU0laRSkKKwkJCWxlbiA9IFBBR0VfU0laRTsKKwkJcmVzID0gYWNjZXNzX3Byb2Nlc3Nfdm0odGFzaywgbW0tPmVudl9zdGFydCwgYnVmZmVyLCBsZW4sIDApOworCQlpZiAoIW1heV9wdHJhY2VfYXR0YWNoKHRhc2spKQorCQkJcmVzID0gLUVTUkNIOworCQltbXB1dChtbSk7CisJfQorCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19waWRfY21kbGluZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGNoYXIgKiBidWZmZXIpCit7CisJaW50IHJlcyA9IDA7CisJdW5zaWduZWQgaW50IGxlbjsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGdldF90YXNrX21tKHRhc2spOworCWlmICghbW0pCisJCWdvdG8gb3V0OworCWlmICghbW0tPmFyZ19lbmQpCisJCWdvdG8gb3V0X21tOwkvKiBTaGghIE5vIGxvb2tpbmcgYmVmb3JlIHdlJ3JlIGRvbmUgKi8KKworIAlsZW4gPSBtbS0+YXJnX2VuZCAtIG1tLT5hcmdfc3RhcnQ7CisgCisJaWYgKGxlbiA+IFBBR0VfU0laRSkKKwkJbGVuID0gUEFHRV9TSVpFOworIAorCXJlcyA9IGFjY2Vzc19wcm9jZXNzX3ZtKHRhc2ssIG1tLT5hcmdfc3RhcnQsIGJ1ZmZlciwgbGVuLCAwKTsKKworCS8vIElmIHRoZSBudWwgYXQgdGhlIGVuZCBvZiBhcmdzIGhhcyBiZWVuIG92ZXJ3cml0dGVuLCB0aGVuCisJLy8gYXNzdW1lIGFwcGxpY2F0aW9uIGlzIHVzaW5nIHNldHByb2N0aXRsZSgzKS4KKwlpZiAocmVzID4gMCAmJiBidWZmZXJbcmVzLTFdICE9ICdcMCcgJiYgbGVuIDwgUEFHRV9TSVpFKSB7CisJCWxlbiA9IHN0cm5sZW4oYnVmZmVyLCByZXMpOworCQlpZiAobGVuIDwgcmVzKSB7CisJCSAgICByZXMgPSBsZW47CisJCX0gZWxzZSB7CisJCQlsZW4gPSBtbS0+ZW52X2VuZCAtIG1tLT5lbnZfc3RhcnQ7CisJCQlpZiAobGVuID4gUEFHRV9TSVpFIC0gcmVzKQorCQkJCWxlbiA9IFBBR0VfU0laRSAtIHJlczsKKwkJCXJlcyArPSBhY2Nlc3NfcHJvY2Vzc192bSh0YXNrLCBtbS0+ZW52X3N0YXJ0LCBidWZmZXIrcmVzLCBsZW4sIDApOworCQkJcmVzID0gc3RybmxlbihidWZmZXIsIHJlcyk7CisJCX0KKwl9CitvdXRfbW06CisJbW1wdXQobW0pOworb3V0OgorCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19waWRfYXV4dihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGNoYXIgKmJ1ZmZlcikKK3sKKwlpbnQgcmVzID0gMDsKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGdldF90YXNrX21tKHRhc2spOworCWlmIChtbSkgeworCQl1bnNpZ25lZCBpbnQgbndvcmRzID0gMDsKKwkJZG8KKwkJCW53b3JkcyArPSAyOworCQl3aGlsZSAobW0tPnNhdmVkX2F1eHZbbndvcmRzIC0gMl0gIT0gMCk7IC8qIEFUX05VTEwgKi8KKwkJcmVzID0gbndvcmRzICogc2l6ZW9mKG1tLT5zYXZlZF9hdXh2WzBdKTsKKwkJaWYgKHJlcyA+IFBBR0VfU0laRSkKKwkJCXJlcyA9IFBBR0VfU0laRTsKKwkJbWVtY3B5KGJ1ZmZlciwgbW0tPnNhdmVkX2F1eHYsIHJlcyk7CisJCW1tcHV0KG1tKTsKKwl9CisJcmV0dXJuIHJlczsKK30KKworCisjaWZkZWYgQ09ORklHX0tBTExTWU1TCisvKgorICogUHJvdmlkZXMgYSB3Y2hhbiBmaWxlIHZpYSBrYWxsc3ltcyBpbiBhIHByb3BlciBvbmUtdmFsdWUtcGVyLWZpbGUgZm9ybWF0LgorICogUmV0dXJucyB0aGUgcmVzb2x2ZWQgc3ltYm9sLiAgSWYgdGhhdCBmYWlscywgc2ltcGx5IHJldHVybiB0aGUgYWRkcmVzcy4KKyAqLworc3RhdGljIGludCBwcm9jX3BpZF93Y2hhbihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGNoYXIgKmJ1ZmZlcikKK3sKKwljaGFyICptb2RuYW1lOworCWNvbnN0IGNoYXIgKnN5bV9uYW1lOworCXVuc2lnbmVkIGxvbmcgd2NoYW4sIHNpemUsIG9mZnNldDsKKwljaGFyIG5hbWVidWZbS1NZTV9OQU1FX0xFTisxXTsKKworCXdjaGFuID0gZ2V0X3djaGFuKHRhc2spOworCisJc3ltX25hbWUgPSBrYWxsc3ltc19sb29rdXAod2NoYW4sICZzaXplLCAmb2Zmc2V0LCAmbW9kbmFtZSwgbmFtZWJ1Zik7CisJaWYgKHN5bV9uYW1lKQorCQlyZXR1cm4gc3ByaW50ZihidWZmZXIsICIlcyIsIHN5bV9uYW1lKTsKKwlyZXR1cm4gc3ByaW50ZihidWZmZXIsICIlbHUiLCB3Y2hhbik7Cit9CisjZW5kaWYgLyogQ09ORklHX0tBTExTWU1TICovCisKKyNpZmRlZiBDT05GSUdfU0NIRURTVEFUUworLyoKKyAqIFByb3ZpZGVzIC9wcm9jL1BJRC9zY2hlZHN0YXQKKyAqLworc3RhdGljIGludCBwcm9jX3BpZF9zY2hlZHN0YXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICpidWZmZXIpCit7CisJcmV0dXJuIHNwcmludGYoYnVmZmVyLCAiJWx1ICVsdSAlbHVcbiIsCisJCQl0YXNrLT5zY2hlZF9pbmZvLmNwdV90aW1lLAorCQkJdGFzay0+c2NoZWRfaW5mby5ydW5fZGVsYXksCisJCQl0YXNrLT5zY2hlZF9pbmZvLnBjbnQpOworfQorI2VuZGlmCisKKy8qIFRoZSBiYWRuZXNzIGZyb20gdGhlIE9PTSBraWxsZXIgKi8KK3Vuc2lnbmVkIGxvbmcgYmFkbmVzcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHVuc2lnbmVkIGxvbmcgdXB0aW1lKTsKK3N0YXRpYyBpbnQgcHJvY19vb21fc2NvcmUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICpidWZmZXIpCit7CisJdW5zaWduZWQgbG9uZyBwb2ludHM7CisJc3RydWN0IHRpbWVzcGVjIHVwdGltZTsKKworCWRvX3Bvc2l4X2Nsb2NrX21vbm90b25pY19nZXR0aW1lKCZ1cHRpbWUpOworCXBvaW50cyA9IGJhZG5lc3ModGFzaywgdXB0aW1lLnR2X3NlYyk7CisJcmV0dXJuIHNwcmludGYoYnVmZmVyLCAiJWx1XG4iLCBwb2ludHMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgIEhlcmUgdGhlIGZzIHBhcnQgYmVnaW5zICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIHBlcm1pc3Npb24gY2hlY2tzICovCisKK3N0YXRpYyBpbnQgcHJvY19jaGVja19yb290KHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGRlbnRyeSAqZGUsICpiYXNlLCAqcm9vdDsKKwlzdHJ1Y3QgdmZzbW91bnQgKm91cl92ZnNtbnQsICp2ZnNtbnQsICptbnQ7CisJaW50IHJlcyA9IDA7CisKKwlpZiAocHJvY19yb290X2xpbmsoaW5vZGUsICZyb290LCAmdmZzbW50KSkgLyogRXd3dy4uLiAqLworCQlyZXR1cm4gLUVOT0VOVDsKKwlyZWFkX2xvY2soJmN1cnJlbnQtPmZzLT5sb2NrKTsKKwlvdXJfdmZzbW50ID0gbW50Z2V0KGN1cnJlbnQtPmZzLT5yb290bW50KTsKKwliYXNlID0gZGdldChjdXJyZW50LT5mcy0+cm9vdCk7CisJcmVhZF91bmxvY2soJmN1cnJlbnQtPmZzLT5sb2NrKTsKKworCXNwaW5fbG9jaygmdmZzbW91bnRfbG9jayk7CisJZGUgPSByb290OworCW1udCA9IHZmc21udDsKKworCXdoaWxlICh2ZnNtbnQgIT0gb3VyX3Zmc21udCkgeworCQlpZiAodmZzbW50ID09IHZmc21udC0+bW50X3BhcmVudCkKKwkJCWdvdG8gb3V0OworCQlkZSA9IHZmc21udC0+bW50X21vdW50cG9pbnQ7CisJCXZmc21udCA9IHZmc21udC0+bW50X3BhcmVudDsKKwl9CisKKwlpZiAoIWlzX3N1YmRpcihkZSwgYmFzZSkpCisJCWdvdG8gb3V0OworCXNwaW5fdW5sb2NrKCZ2ZnNtb3VudF9sb2NrKTsKKworZXhpdDoKKwlkcHV0KGJhc2UpOworCW1udHB1dChvdXJfdmZzbW50KTsKKwlkcHV0KHJvb3QpOworCW1udHB1dChtbnQpOworCXJldHVybiByZXM7CitvdXQ6CisJc3Bpbl91bmxvY2soJnZmc21vdW50X2xvY2spOworCXJlcyA9IC1FQUNDRVM7CisJZ290byBleGl0OworfQorCitzdGF0aWMgaW50IHByb2NfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzaywgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaWYgKGdlbmVyaWNfcGVybWlzc2lvbihpbm9kZSwgbWFzaywgTlVMTCkgIT0gMCkKKwkJcmV0dXJuIC1FQUNDRVM7CisJcmV0dXJuIHByb2NfY2hlY2tfcm9vdChpbm9kZSk7Cit9CisKK2V4dGVybiBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcHJvY19waWRfbWFwc19vcDsKK3N0YXRpYyBpbnQgbWFwc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IHByb2NfdGFzayhpbm9kZSk7CisJaW50IHJldCA9IHNlcV9vcGVuKGZpbGUsICZwcm9jX3BpZF9tYXBzX29wKTsKKwlpZiAoIXJldCkgeworCQlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJCW0tPnByaXZhdGUgPSB0YXNrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX21hcHNfb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSBtYXBzX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzZXFfcmVsZWFzZSwKK307CisKK2V4dGVybiBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgbW91bnRzX29wOworc3RhdGljIGludCBtb3VudHNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBwcm9jX3Rhc2soaW5vZGUpOworCWludCByZXQgPSBzZXFfb3BlbihmaWxlLCAmbW91bnRzX29wKTsKKworCWlmICghcmV0KSB7CisJCXN0cnVjdCBzZXFfZmlsZSAqbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwkJc3RydWN0IG5hbWVzcGFjZSAqbmFtZXNwYWNlOworCQl0YXNrX2xvY2sodGFzayk7CisJCW5hbWVzcGFjZSA9IHRhc2stPm5hbWVzcGFjZTsKKwkJaWYgKG5hbWVzcGFjZSkKKwkJCWdldF9uYW1lc3BhY2UobmFtZXNwYWNlKTsKKwkJdGFza191bmxvY2sodGFzayk7CisKKwkJaWYgKG5hbWVzcGFjZSkKKwkJCW0tPnByaXZhdGUgPSBuYW1lc3BhY2U7CisJCWVsc2UgeworCQkJc2VxX3JlbGVhc2UoaW5vZGUsIGZpbGUpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1vdW50c19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzZXFfZmlsZSAqbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbmFtZXNwYWNlICpuYW1lc3BhY2UgPSBtLT5wcml2YXRlOworCXB1dF9uYW1lc3BhY2UobmFtZXNwYWNlKTsKKwlyZXR1cm4gc2VxX3JlbGVhc2UoaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX21vdW50c19vcGVyYXRpb25zID0geworCS5vcGVuCQk9IG1vdW50c19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gbW91bnRzX3JlbGVhc2UsCit9OworCisjZGVmaW5lIFBST0NfQkxPQ0tfU0laRQkoMyoxMDI0KQkJLyogNEsgcGFnZSBzaXplIGJ1dCBvdXIgb3V0cHV0IHJvdXRpbmVzIHVzZSBzb21lIHNsYWNrIGZvciBvdmVycnVucyAqLworCitzdGF0aWMgc3NpemVfdCBwcm9jX2luZm9fcmVhZChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNoYXIgX191c2VyICogYnVmLAorCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXVuc2lnbmVkIGxvbmcgcGFnZTsKKwlzc2l6ZV90IGxlbmd0aDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBwcm9jX3Rhc2soaW5vZGUpOworCisJaWYgKGNvdW50ID4gUFJPQ19CTE9DS19TSVpFKQorCQljb3VudCA9IFBST0NfQkxPQ0tfU0laRTsKKwlpZiAoIShwYWdlID0gX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlsZW5ndGggPSBQUk9DX0koaW5vZGUpLT5vcC5wcm9jX3JlYWQodGFzaywgKGNoYXIqKXBhZ2UpOworCisJaWYgKGxlbmd0aCA+PSAwKQorCQlsZW5ndGggPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCBwcG9zLCAoY2hhciAqKXBhZ2UsIGxlbmd0aCk7CisJZnJlZV9wYWdlKHBhZ2UpOworCXJldHVybiBsZW5ndGg7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfaW5mb19maWxlX29wZXJhdGlvbnMgPSB7CisJLnJlYWQJCT0gcHJvY19pbmZvX3JlYWQsCit9OworCitzdGF0aWMgaW50IG1lbV9vcGVuKHN0cnVjdCBpbm9kZSogaW5vZGUsIHN0cnVjdCBmaWxlKiBmaWxlKQoreworCWZpbGUtPnByaXZhdGVfZGF0YSA9ICh2b2lkKikoKGxvbmcpY3VycmVudC0+c2VsZl9leGVjX2lkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgbWVtX3JlYWQoc3RydWN0IGZpbGUgKiBmaWxlLCBjaGFyIF9fdXNlciAqIGJ1ZiwKKwkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IHByb2NfdGFzayhmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJY2hhciAqcGFnZTsKKwl1bnNpZ25lZCBsb25nIHNyYyA9ICpwcG9zOworCWludCByZXQgPSAtRVNSQ0g7CisJc3RydWN0IG1tX3N0cnVjdCAqbW07CisKKwlpZiAoIU1BWV9QVFJBQ0UodGFzaykgfHwgIW1heV9wdHJhY2VfYXR0YWNoKHRhc2spKQorCQlnb3RvIG91dDsKKworCXJldCA9IC1FTk9NRU07CisJcGFnZSA9IChjaGFyICopX19nZXRfZnJlZV9wYWdlKEdGUF9VU0VSKTsKKwlpZiAoIXBhZ2UpCisJCWdvdG8gb3V0OworCisJcmV0ID0gMDsKKyAKKwltbSA9IGdldF90YXNrX21tKHRhc2spOworCWlmICghbW0pCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlyZXQgPSAtRUlPOworIAorCWlmIChmaWxlLT5wcml2YXRlX2RhdGEgIT0gKHZvaWQqKSgobG9uZyljdXJyZW50LT5zZWxmX2V4ZWNfaWQpKQorCQlnb3RvIG91dF9wdXQ7CisKKwlyZXQgPSAwOworIAorCXdoaWxlIChjb3VudCA+IDApIHsKKwkJaW50IHRoaXNfbGVuLCByZXR2YWw7CisKKwkJdGhpc19sZW4gPSAoY291bnQgPiBQQUdFX1NJWkUpID8gUEFHRV9TSVpFIDogY291bnQ7CisJCXJldHZhbCA9IGFjY2Vzc19wcm9jZXNzX3ZtKHRhc2ssIHNyYywgcGFnZSwgdGhpc19sZW4sIDApOworCQlpZiAoIXJldHZhbCB8fCAhTUFZX1BUUkFDRSh0YXNrKSB8fCAhbWF5X3B0cmFjZV9hdHRhY2godGFzaykpIHsKKwkJCWlmICghcmV0KQorCQkJCXJldCA9IC1FSU87CisJCQlicmVhazsKKwkJfQorCisJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBwYWdlLCByZXR2YWwpKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKyAKKwkJcmV0ICs9IHJldHZhbDsKKwkJc3JjICs9IHJldHZhbDsKKwkJYnVmICs9IHJldHZhbDsKKwkJY291bnQgLT0gcmV0dmFsOworCX0KKwkqcHBvcyA9IHNyYzsKKworb3V0X3B1dDoKKwltbXB1dChtbSk7CitvdXRfZnJlZToKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIHBhZ2UpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgbWVtX3dyaXRlIE5VTEwKKworI2lmbmRlZiBtZW1fd3JpdGUKKy8qIFRoaXMgaXMgYSBzZWN1cml0eSBoYXphcmQgKi8KK3N0YXRpYyBzc2l6ZV90IG1lbV93cml0ZShzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNvbnN0IGNoYXIgKiBidWYsCisJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IGNvcGllZCA9IDA7CisJY2hhciAqcGFnZTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBwcm9jX3Rhc2soZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCXVuc2lnbmVkIGxvbmcgZHN0ID0gKnBwb3M7CisKKwlpZiAoIU1BWV9QVFJBQ0UodGFzaykgfHwgIW1heV9wdHJhY2VfYXR0YWNoKHRhc2spKQorCQlyZXR1cm4gLUVTUkNIOworCisJcGFnZSA9IChjaGFyICopX19nZXRfZnJlZV9wYWdlKEdGUF9VU0VSKTsKKwlpZiAoIXBhZ2UpCisJCXJldHVybiAtRU5PTUVNOworCisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlpbnQgdGhpc19sZW4sIHJldHZhbDsKKworCQl0aGlzX2xlbiA9IChjb3VudCA+IFBBR0VfU0laRSkgPyBQQUdFX1NJWkUgOiBjb3VudDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHBhZ2UsIGJ1ZiwgdGhpc19sZW4pKSB7CisJCQljb3BpZWQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJcmV0dmFsID0gYWNjZXNzX3Byb2Nlc3Nfdm0odGFzaywgZHN0LCBwYWdlLCB0aGlzX2xlbiwgMSk7CisJCWlmICghcmV0dmFsKSB7CisJCQlpZiAoIWNvcGllZCkKKwkJCQljb3BpZWQgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKwkJY29waWVkICs9IHJldHZhbDsKKwkJYnVmICs9IHJldHZhbDsKKwkJZHN0ICs9IHJldHZhbDsKKwkJY291bnQgLT0gcmV0dmFsOwkJCQorCX0KKwkqcHBvcyA9IGRzdDsKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIHBhZ2UpOworCXJldHVybiBjb3BpZWQ7Cit9CisjZW5kaWYKKworc3RhdGljIGxvZmZfdCBtZW1fbHNlZWsoc3RydWN0IGZpbGUgKiBmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgb3JpZykKK3sKKwlzd2l0Y2ggKG9yaWcpIHsKKwljYXNlIDA6CisJCWZpbGUtPmZfcG9zID0gb2Zmc2V0OworCQlicmVhazsKKwljYXNlIDE6CisJCWZpbGUtPmZfcG9zICs9IG9mZnNldDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWZvcmNlX3N1Y2Nlc3NmdWxfc3lzY2FsbF9yZXR1cm4oKTsKKwlyZXR1cm4gZmlsZS0+Zl9wb3M7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfbWVtX29wZXJhdGlvbnMgPSB7CisJLmxsc2VlawkJPSBtZW1fbHNlZWssCisJLnJlYWQJCT0gbWVtX3JlYWQsCisJLndyaXRlCQk9IG1lbV93cml0ZSwKKwkub3BlbgkJPSBtZW1fb3BlbiwKK307CisKK3N0YXRpYyBzc2l6ZV90IG9vbV9hZGp1c3RfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBwcm9jX3Rhc2soZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCWNoYXIgYnVmZmVyWzhdOworCXNpemVfdCBsZW47CisJaW50IG9vbV9hZGp1c3QgPSB0YXNrLT5vb21raWxsYWRqOworCWxvZmZfdCBfX3Bwb3MgPSAqcHBvczsKKworCWxlbiA9IHNwcmludGYoYnVmZmVyLCAiJWlcbiIsIG9vbV9hZGp1c3QpOworCWlmIChfX3Bwb3MgPj0gbGVuKQorCQlyZXR1cm4gMDsKKwlpZiAoY291bnQgPiBsZW4tX19wcG9zKQorCQljb3VudCA9IGxlbi1fX3Bwb3M7CisJaWYgKGNvcHlfdG9fdXNlcihidWYsIGJ1ZmZlciArIF9fcHBvcywgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkqcHBvcyA9IF9fcHBvcyArIGNvdW50OworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgb29tX2FkanVzdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBwcm9jX3Rhc2soZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCWNoYXIgYnVmZmVyWzhdLCAqZW5kOworCWludCBvb21fYWRqdXN0OworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfUkVTT1VSQ0UpKQorCQlyZXR1cm4gLUVQRVJNOworCW1lbXNldChidWZmZXIsIDAsIDgpOworCWlmIChjb3VudCA+IDYpCisJCWNvdW50ID0gNjsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmZmVyLCBidWYsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJb29tX2FkanVzdCA9IHNpbXBsZV9zdHJ0b2woYnVmZmVyLCAmZW5kLCAwKTsKKwlpZiAob29tX2FkanVzdCA8IC0xNiB8fCBvb21fYWRqdXN0ID4gMTUpCisJCXJldHVybiAtRUlOVkFMOworCWlmICgqZW5kID09ICdcbicpCisJCWVuZCsrOworCXRhc2stPm9vbWtpbGxhZGogPSBvb21fYWRqdXN0OworCWlmIChlbmQgLSBidWZmZXIgPT0gMCkKKwkJcmV0dXJuIC1FSU87CisJcmV0dXJuIGVuZCAtIGJ1ZmZlcjsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19vb21fYWRqdXN0X29wZXJhdGlvbnMgPSB7CisJLnJlYWQJCT0gb29tX2FkanVzdF9yZWFkLAorCS53cml0ZQkJPSBvb21fYWRqdXN0X3dyaXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHByb2NfbWVtX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnBlcm1pc3Npb24JPSBwcm9jX3Blcm1pc3Npb24sCit9OworCisjaWZkZWYgQ09ORklHX0FVRElUU1lTQ0FMTAorI2RlZmluZSBUTVBCVUZMRU4gMjEKK3N0YXRpYyBzc2l6ZV90IHByb2NfbG9naW51aWRfcmVhZChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNoYXIgX191c2VyICogYnVmLAorCQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBwcm9jX3Rhc2soaW5vZGUpOworCXNzaXplX3QgbGVuZ3RoOworCWNoYXIgdG1wYnVmW1RNUEJVRkxFTl07CisKKwlsZW5ndGggPSBzY25wcmludGYodG1wYnVmLCBUTVBCVUZMRU4sICIldSIsCisJCQkJYXVkaXRfZ2V0X2xvZ2ludWlkKHRhc2stPmF1ZGl0X2NvbnRleHQpKTsKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBjb3VudCwgcHBvcywgdG1wYnVmLCBsZW5ndGgpOworfQorCitzdGF0aWMgc3NpemVfdCBwcm9jX2xvZ2ludWlkX3dyaXRlKHN0cnVjdCBmaWxlICogZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWYsCisJCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwljaGFyICpwYWdlLCAqdG1wOworCXNzaXplX3QgbGVuZ3RoOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IHByb2NfdGFzayhpbm9kZSk7CisJdWlkX3QgbG9naW51aWQ7CisKKwlpZiAoIWNhcGFibGUoQ0FQX0FVRElUX0NPTlRST0wpKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKGN1cnJlbnQgIT0gdGFzaykKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmIChjb3VudCA+IFBBR0VfU0laRSkKKwkJY291bnQgPSBQQUdFX1NJWkU7CisKKwlpZiAoKnBwb3MgIT0gMCkgeworCQkvKiBObyBwYXJ0aWFsIHdyaXRlcy4gKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXBhZ2UgPSAoY2hhciopX19nZXRfZnJlZV9wYWdlKEdGUF9VU0VSKTsKKwlpZiAoIXBhZ2UpCisJCXJldHVybiAtRU5PTUVNOworCWxlbmd0aCA9IC1FRkFVTFQ7CisJaWYgKGNvcHlfZnJvbV91c2VyKHBhZ2UsIGJ1ZiwgY291bnQpKQorCQlnb3RvIG91dF9mcmVlX3BhZ2U7CisKKwlsb2dpbnVpZCA9IHNpbXBsZV9zdHJ0b3VsKHBhZ2UsICZ0bXAsIDEwKTsKKwlpZiAodG1wID09IHBhZ2UpIHsKKwkJbGVuZ3RoID0gLUVJTlZBTDsKKwkJZ290byBvdXRfZnJlZV9wYWdlOworCisJfQorCWxlbmd0aCA9IGF1ZGl0X3NldF9sb2dpbnVpZCh0YXNrLT5hdWRpdF9jb250ZXh0LCBsb2dpbnVpZCk7CisJaWYgKGxpa2VseShsZW5ndGggPT0gMCkpCisJCWxlbmd0aCA9IGNvdW50OworCitvdXRfZnJlZV9wYWdlOgorCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgcGFnZSk7CisJcmV0dXJuIGxlbmd0aDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19sb2dpbnVpZF9vcGVyYXRpb25zID0geworCS5yZWFkCQk9IHByb2NfbG9naW51aWRfcmVhZCwKKwkud3JpdGUJCT0gcHJvY19sb2dpbnVpZF93cml0ZSwKK307CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TRUNDT01QCitzdGF0aWMgc3NpemVfdCBzZWNjb21wX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBwcm9jX3Rhc2soZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCWNoYXIgX19idWZbMjBdOworCWxvZmZfdCBfX3Bwb3MgPSAqcHBvczsKKwlzaXplX3QgbGVuOworCisJLyogbm8gbmVlZCB0byBwcmludCB0aGUgdHJhaWxpbmcgemVybywgc28gdXNlIG9ubHkgbGVuICovCisJbGVuID0gc3ByaW50ZihfX2J1ZiwgIiV1XG4iLCB0c2stPnNlY2NvbXAubW9kZSk7CisJaWYgKF9fcHBvcyA+PSBsZW4pCisJCXJldHVybiAwOworCWlmIChjb3VudCA+IGxlbiAtIF9fcHBvcykKKwkJY291bnQgPSBsZW4gLSBfX3Bwb3M7CisJaWYgKGNvcHlfdG9fdXNlcihidWYsIF9fYnVmICsgX19wcG9zLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCSpwcG9zID0gX19wcG9zICsgY291bnQ7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzZWNjb21wX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IHByb2NfdGFzayhmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJY2hhciBfX2J1ZlsyMF0sICplbmQ7CisJdW5zaWduZWQgaW50IHNlY2NvbXBfbW9kZTsKKworCS8qIGNhbiBzZXQgaXQgb25seSBvbmNlIHRvIGJlIGV2ZW4gbW9yZSBzZWN1cmUgKi8KKwlpZiAodW5saWtlbHkodHNrLT5zZWNjb21wLm1vZGUpKQorCQlyZXR1cm4gLUVQRVJNOworCisJbWVtc2V0KF9fYnVmLCAwLCBzaXplb2YoX19idWYpKTsKKwljb3VudCA9IG1pbihjb3VudCwgc2l6ZW9mKF9fYnVmKSAtIDEpOworCWlmIChjb3B5X2Zyb21fdXNlcihfX2J1ZiwgYnVmLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCXNlY2NvbXBfbW9kZSA9IHNpbXBsZV9zdHJ0b3VsKF9fYnVmLCAmZW5kLCAwKTsKKwlpZiAoKmVuZCA9PSAnXG4nKQorCQllbmQrKzsKKwlpZiAoc2VjY29tcF9tb2RlICYmIHNlY2NvbXBfbW9kZSA8PSBOUl9TRUNDT01QX01PREVTKSB7CisJCXRzay0+c2VjY29tcC5tb2RlID0gc2VjY29tcF9tb2RlOworCQlzZXRfdHNrX3RocmVhZF9mbGFnKHRzaywgVElGX1NFQ0NPTVApOworCX0gZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodW5saWtlbHkoIShlbmQgLSBfX2J1ZikpKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gZW5kIC0gX19idWY7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2Nfc2VjY29tcF9vcGVyYXRpb25zID0geworCS5yZWFkCQk9IHNlY2NvbXBfcmVhZCwKKwkud3JpdGUJCT0gc2VjY29tcF93cml0ZSwKK307CisjZW5kaWYgLyogQ09ORklHX1NFQ0NPTVAgKi8KKworc3RhdGljIGludCBwcm9jX3BpZF9mb2xsb3dfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IGVycm9yID0gLUVBQ0NFUzsKKworCS8qIFdlIGRvbid0IG5lZWQgYSBiYXNlIHBvaW50ZXIgaW4gdGhlIC9wcm9jIGZpbGVzeXN0ZW0gKi8KKwlwYXRoX3JlbGVhc2UobmQpOworCisJaWYgKGN1cnJlbnQtPmZzdWlkICE9IGlub2RlLT5pX3VpZCAmJiAhY2FwYWJsZShDQVBfREFDX09WRVJSSURFKSkKKwkJZ290byBvdXQ7CisJZXJyb3IgPSBwcm9jX2NoZWNrX3Jvb3QoaW5vZGUpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IFBST0NfSShpbm9kZSktPm9wLnByb2NfZ2V0X2xpbmsoaW5vZGUsICZuZC0+ZGVudHJ5LCAmbmQtPm1udCk7CisJbmQtPmxhc3RfdHlwZSA9IExBU1RfQklORDsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgZG9fcHJvY19yZWFkbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCB2ZnNtb3VudCAqbW50LAorCQkJICAgIGNoYXIgX191c2VyICpidWZmZXIsIGludCBidWZsZW4pCit7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJY2hhciAqdG1wID0gKGNoYXIqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKSwgKnBhdGg7CisJaW50IGxlbjsKKworCWlmICghdG1wKQorCQlyZXR1cm4gLUVOT01FTTsKKwkJCisJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJcGF0aCA9IGRfcGF0aChkZW50cnksIG1udCwgdG1wLCBQQUdFX1NJWkUpOworCWxlbiA9IFBUUl9FUlIocGF0aCk7CisJaWYgKElTX0VSUihwYXRoKSkKKwkJZ290byBvdXQ7CisJbGVuID0gdG1wICsgUEFHRV9TSVpFIC0gMSAtIHBhdGg7CisKKwlpZiAobGVuID4gYnVmbGVuKQorCQlsZW4gPSBidWZsZW47CisJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIHBhdGgsIGxlbikpCisJCWxlbiA9IC1FRkFVTFQ7Cisgb3V0OgorCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl0bXApOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgcHJvY19waWRfcmVhZGxpbmsoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgY2hhciBfX3VzZXIgKiBidWZmZXIsIGludCBidWZsZW4pCit7CisJaW50IGVycm9yID0gLUVBQ0NFUzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBkZW50cnkgKmRlOworCXN0cnVjdCB2ZnNtb3VudCAqbW50ID0gTlVMTDsKKworCWxvY2tfa2VybmVsKCk7CisKKwlpZiAoY3VycmVudC0+ZnN1aWQgIT0gaW5vZGUtPmlfdWlkICYmICFjYXBhYmxlKENBUF9EQUNfT1ZFUlJJREUpKQorCQlnb3RvIG91dDsKKwllcnJvciA9IHByb2NfY2hlY2tfcm9vdChpbm9kZSk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKworCWVycm9yID0gUFJPQ19JKGlub2RlKS0+b3AucHJvY19nZXRfbGluayhpbm9kZSwgJmRlLCAmbW50KTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCisJZXJyb3IgPSBkb19wcm9jX3JlYWRsaW5rKGRlLCBtbnQsIGJ1ZmZlciwgYnVmbGVuKTsKKwlkcHV0KGRlKTsKKwltbnRwdXQobW50KTsKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcHJvY19waWRfbGlua19pbm9kZV9vcGVyYXRpb25zID0geworCS5yZWFkbGluawk9IHByb2NfcGlkX3JlYWRsaW5rLAorCS5mb2xsb3dfbGluawk9IHByb2NfcGlkX2ZvbGxvd19saW5rCit9OworCisjZGVmaW5lIE5VTUJVRiAxMAorCitzdGF0aWMgaW50IHByb2NfcmVhZGZkKHN0cnVjdCBmaWxlICogZmlscCwgdm9pZCAqIGRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcCA9IHByb2NfdGFzayhpbm9kZSk7CisJdW5zaWduZWQgaW50IGZkLCB0aWQsIGlubzsKKwlpbnQgcmV0dmFsOworCWNoYXIgYnVmW05VTUJVRl07CisJc3RydWN0IGZpbGVzX3N0cnVjdCAqIGZpbGVzOworCisJcmV0dmFsID0gLUVOT0VOVDsKKwlpZiAoIXBpZF9hbGl2ZShwKSkKKwkJZ290byBvdXQ7CisJcmV0dmFsID0gMDsKKwl0aWQgPSBwLT5waWQ7CisKKwlmZCA9IGZpbHAtPmZfcG9zOworCXN3aXRjaCAoZmQpIHsKKwkJY2FzZSAwOgorCQkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLiIsIDEsIDAsIGlub2RlLT5pX2lubywgRFRfRElSKSA8IDApCisJCQkJZ290byBvdXQ7CisJCQlmaWxwLT5mX3BvcysrOworCQljYXNlIDE6CisJCQlpbm8gPSBmYWtlX2lubyh0aWQsIFBST0NfVElEX0lOTyk7CisJCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuLiIsIDIsIDEsIGlubywgRFRfRElSKSA8IDApCisJCQkJZ290byBvdXQ7CisJCQlmaWxwLT5mX3BvcysrOworCQlkZWZhdWx0OgorCQkJZmlsZXMgPSBnZXRfZmlsZXNfc3RydWN0KHApOworCQkJaWYgKCFmaWxlcykKKwkJCQlnb3RvIG91dDsKKwkJCXNwaW5fbG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJCQlmb3IgKGZkID0gZmlscC0+Zl9wb3MtMjsKKwkJCSAgICAgZmQgPCBmaWxlcy0+bWF4X2ZkczsKKwkJCSAgICAgZmQrKywgZmlscC0+Zl9wb3MrKykgeworCQkJCXVuc2lnbmVkIGludCBpLGo7CisKKwkJCQlpZiAoIWZjaGVja19maWxlcyhmaWxlcywgZmQpKQorCQkJCQljb250aW51ZTsKKwkJCQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisKKwkJCQlqID0gTlVNQlVGOworCQkJCWkgPSBmZDsKKwkJCQlkbyB7CisJCQkJCWotLTsKKwkJCQkJYnVmW2pdID0gJzAnICsgKGkgJSAxMCk7CisJCQkJCWkgLz0gMTA7CisJCQkJfSB3aGlsZSAoaSk7CisKKwkJCQlpbm8gPSBmYWtlX2lubyh0aWQsIFBST0NfVElEX0ZEX0RJUiArIGZkKTsKKwkJCQlpZiAoZmlsbGRpcihkaXJlbnQsIGJ1ZitqLCBOVU1CVUYtaiwgZmQrMiwgaW5vLCBEVF9MTkspIDwgMCkgeworCQkJCQlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwkJCXB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpOworCX0KK291dDoKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHByb2NfcGlkZW50X3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsCisJCXZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIsCisJCXN0cnVjdCBwaWRfZW50cnkgKmVudHMsIHVuc2lnbmVkIGludCBuZW50cykKK3sKKwlpbnQgaTsKKwlpbnQgcGlkOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbHAtPmZfZGVudHJ5OworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHBpZF9lbnRyeSAqcDsKKwlpbm9fdCBpbm87CisJaW50IHJldDsKKworCXJldCA9IC1FTk9FTlQ7CisJaWYgKCFwaWRfYWxpdmUocHJvY190YXNrKGlub2RlKSkpCisJCWdvdG8gb3V0OworCisJcmV0ID0gMDsKKwlwaWQgPSBwcm9jX3Rhc2soaW5vZGUpLT5waWQ7CisJaSA9IGZpbHAtPmZfcG9zOworCXN3aXRjaCAoaSkgeworCWNhc2UgMDoKKwkJaW5vID0gaW5vZGUtPmlfaW5vOworCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuIiwgMSwgaSwgaW5vLCBEVF9ESVIpIDwgMCkKKwkJCWdvdG8gb3V0OworCQlpKys7CisJCWZpbHAtPmZfcG9zKys7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgMToKKwkJaW5vID0gcGFyZW50X2lubyhkZW50cnkpOworCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuLiIsIDIsIGksIGlubywgRFRfRElSKSA8IDApCisJCQlnb3RvIG91dDsKKwkJaSsrOworCQlmaWxwLT5mX3BvcysrOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwlkZWZhdWx0OgorCQlpIC09IDI7CisJCWlmIChpID49IG5lbnRzKSB7CisJCQlyZXQgPSAxOworCQkJZ290byBvdXQ7CisJCX0KKwkJcCA9IGVudHMgKyBpOworCQl3aGlsZSAocC0+bmFtZSkgeworCQkJaWYgKGZpbGxkaXIoZGlyZW50LCBwLT5uYW1lLCBwLT5sZW4sIGZpbHAtPmZfcG9zLAorCQkJCSAgICBmYWtlX2lubyhwaWQsIHAtPnR5cGUpLCBwLT5tb2RlID4+IDEyKSA8IDApCisJCQkJZ290byBvdXQ7CisJCQlmaWxwLT5mX3BvcysrOworCQkJcCsrOworCQl9CisJfQorCisJcmV0ID0gMTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHByb2NfdGdpZF9iYXNlX3JlYWRkaXIoc3RydWN0IGZpbGUgKiBmaWxwLAorCQkJICAgICB2b2lkICogZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwlyZXR1cm4gcHJvY19waWRlbnRfcmVhZGRpcihmaWxwLGRpcmVudCxmaWxsZGlyLAorCQkJCSAgIHRnaWRfYmFzZV9zdHVmZixBUlJBWV9TSVpFKHRnaWRfYmFzZV9zdHVmZikpOworfQorCitzdGF0aWMgaW50IHByb2NfdGlkX2Jhc2VfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqIGZpbHAsCisJCQkgICAgIHZvaWQgKiBkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCXJldHVybiBwcm9jX3BpZGVudF9yZWFkZGlyKGZpbHAsZGlyZW50LGZpbGxkaXIsCisJCQkJICAgdGlkX2Jhc2Vfc3R1ZmYsQVJSQVlfU0laRSh0aWRfYmFzZV9zdHVmZikpOworfQorCisvKiBidWlsZGluZyBhbiBpbm9kZSAqLworCitzdGF0aWMgaW50IHRhc2tfZHVtcGFibGUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworCWludCBkdW1wYWJsZSA9IDA7CisJc3RydWN0IG1tX3N0cnVjdCAqbW07CisKKwl0YXNrX2xvY2sodGFzayk7CisJbW0gPSB0YXNrLT5tbTsKKwlpZiAobW0pCisJCWR1bXBhYmxlID0gbW0tPmR1bXBhYmxlOworCXRhc2tfdW5sb2NrKHRhc2spOworCXJldHVybiBkdW1wYWJsZTsKK30KKworCitzdGF0aWMgc3RydWN0IGlub2RlICpwcm9jX3BpZF9tYWtlX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCBpbm8pCit7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJc3RydWN0IHByb2NfaW5vZGUgKmVpOworCisJLyogV2UgbmVlZCBhIG5ldyBpbm9kZSAqLworCQorCWlub2RlID0gbmV3X2lub2RlKHNiKTsKKwlpZiAoIWlub2RlKQorCQlnb3RvIG91dDsKKworCS8qIENvbW1vbiBzdHVmZiAqLworCWVpID0gUFJPQ19JKGlub2RlKTsKKwllaS0+dGFzayA9IE5VTEw7CisJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCWlub2RlLT5pX2lubyA9IGZha2VfaW5vKHRhc2stPnBpZCwgaW5vKTsKKworCWlmICghcGlkX2FsaXZlKHRhc2spKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwkvKgorCSAqIGdyYWIgdGhlIHJlZmVyZW5jZSB0byB0YXNrLgorCSAqLworCWdldF90YXNrX3N0cnVjdCh0YXNrKTsKKwllaS0+dGFzayA9IHRhc2s7CisJZWktPnR5cGUgPSBpbm87CisJaW5vZGUtPmlfdWlkID0gMDsKKwlpbm9kZS0+aV9naWQgPSAwOworCWlmIChpbm8gPT0gUFJPQ19UR0lEX0lOTyB8fCBpbm8gPT0gUFJPQ19USURfSU5PIHx8IHRhc2tfZHVtcGFibGUodGFzaykpIHsKKwkJaW5vZGUtPmlfdWlkID0gdGFzay0+ZXVpZDsKKwkJaW5vZGUtPmlfZ2lkID0gdGFzay0+ZWdpZDsKKwl9CisJc2VjdXJpdHlfdGFza190b19pbm9kZSh0YXNrLCBpbm9kZSk7CisKK291dDoKKwlyZXR1cm4gaW5vZGU7CisKK291dF91bmxvY2s6CisJZWktPnBkZSA9IE5VTEw7CisJaXB1dChpbm9kZSk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIGRlbnRyeSBzdHVmZiAqLworCisvKgorICoJRXhjZXB0aW9uYWwgY2FzZTogbm9ybWFsbHkgd2UgYXJlIG5vdCBhbGxvd2VkIHRvIHVuaGFzaCBhIGJ1c3kKKyAqIGRpcmVjdG9yeS4gSW4gdGhpcyBjYXNlLCBob3dldmVyLCB3ZSBjYW4gZG8gaXQgLSBubyBhbGlhc2luZyBwcm9ibGVtcworICogZHVlIHRvIHRoZSB3YXkgd2UgdHJlYXQgaW5vZGVzLgorICoKKyAqIFJld3JpdGUgdGhlIGlub2RlJ3Mgb3duZXJzaGlwcyBoZXJlIGJlY2F1c2UgdGhlIG93bmluZyB0YXNrIG1heSBoYXZlCisgKiBwZXJmb3JtZWQgYSBzZXR1aWQoKSwgZXRjLgorICovCitzdGF0aWMgaW50IHBpZF9yZXZhbGlkYXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBwcm9jX3Rhc2soaW5vZGUpOworCWlmIChwaWRfYWxpdmUodGFzaykpIHsKKwkJaWYgKHByb2NfdHlwZShpbm9kZSkgPT0gUFJPQ19UR0lEX0lOTyB8fCBwcm9jX3R5cGUoaW5vZGUpID09IFBST0NfVElEX0lOTyB8fCB0YXNrX2R1bXBhYmxlKHRhc2spKSB7CisJCQlpbm9kZS0+aV91aWQgPSB0YXNrLT5ldWlkOworCQkJaW5vZGUtPmlfZ2lkID0gdGFzay0+ZWdpZDsKKwkJfSBlbHNlIHsKKwkJCWlub2RlLT5pX3VpZCA9IDA7CisJCQlpbm9kZS0+aV9naWQgPSAwOworCQl9CisJCXNlY3VyaXR5X3Rhc2tfdG9faW5vZGUodGFzaywgaW5vZGUpOworCQlyZXR1cm4gMTsKKwl9CisJZF9kcm9wKGRlbnRyeSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGlkX2ZkX3JldmFsaWRhdGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IHByb2NfdGFzayhpbm9kZSk7CisJaW50IGZkID0gcHJvY190eXBlKGlub2RlKSAtIFBST0NfVElEX0ZEX0RJUjsKKwlzdHJ1Y3QgZmlsZXNfc3RydWN0ICpmaWxlczsKKworCWZpbGVzID0gZ2V0X2ZpbGVzX3N0cnVjdCh0YXNrKTsKKwlpZiAoZmlsZXMpIHsKKwkJc3Bpbl9sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwkJaWYgKGZjaGVja19maWxlcyhmaWxlcywgZmQpKSB7CisJCQlzcGluX3VubG9jaygmZmlsZXMtPmZpbGVfbG9jayk7CisJCQlwdXRfZmlsZXNfc3RydWN0KGZpbGVzKTsKKwkJCWlmICh0YXNrX2R1bXBhYmxlKHRhc2spKSB7CisJCQkJaW5vZGUtPmlfdWlkID0gdGFzay0+ZXVpZDsKKwkJCQlpbm9kZS0+aV9naWQgPSB0YXNrLT5lZ2lkOworCQkJfSBlbHNlIHsKKwkJCQlpbm9kZS0+aV91aWQgPSAwOworCQkJCWlub2RlLT5pX2dpZCA9IDA7CisJCQl9CisJCQlzZWN1cml0eV90YXNrX3RvX2lub2RlKHRhc2ssIGlub2RlKTsKKwkJCXJldHVybiAxOworCQl9CisJCXNwaW5fdW5sb2NrKCZmaWxlcy0+ZmlsZV9sb2NrKTsKKwkJcHV0X2ZpbGVzX3N0cnVjdChmaWxlcyk7CisJfQorCWRfZHJvcChkZW50cnkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwaWRfYmFzZV9pcHV0KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBwcm9jX3Rhc2soaW5vZGUpOworCXNwaW5fbG9jaygmdGFzay0+cHJvY19sb2NrKTsKKwlpZiAodGFzay0+cHJvY19kZW50cnkgPT0gZGVudHJ5KQorCQl0YXNrLT5wcm9jX2RlbnRyeSA9IE5VTEw7CisJc3Bpbl91bmxvY2soJnRhc2stPnByb2NfbG9jayk7CisJaXB1dChpbm9kZSk7Cit9CisKK3N0YXRpYyBpbnQgcGlkX2RlbGV0ZV9kZW50cnkoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSkKK3sKKwkvKiBJcyB0aGUgdGFzayB3ZSByZXByZXNlbnQgZGVhZD8KKwkgKiBJZiBzbywgdGhlbiBkb24ndCBwdXQgdGhlIGRlbnRyeSBvbiB0aGUgbHJ1IGxpc3QsCisJICoga2lsbCBpdCBpbW1lZGlhdGVseS4KKwkgKi8KKwlyZXR1cm4gIXBpZF9hbGl2ZShwcm9jX3Rhc2soZGVudHJ5LT5kX2lub2RlKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgdGlkX2ZkX2RlbnRyeV9vcGVyYXRpb25zID0KK3sKKwkuZF9yZXZhbGlkYXRlCT0gdGlkX2ZkX3JldmFsaWRhdGUsCisJLmRfZGVsZXRlCT0gcGlkX2RlbGV0ZV9kZW50cnksCit9OworCitzdGF0aWMgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIHBpZF9kZW50cnlfb3BlcmF0aW9ucyA9Cit7CisJLmRfcmV2YWxpZGF0ZQk9IHBpZF9yZXZhbGlkYXRlLAorCS5kX2RlbGV0ZQk9IHBpZF9kZWxldGVfZGVudHJ5LAorfTsKKworc3RhdGljIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBwaWRfYmFzZV9kZW50cnlfb3BlcmF0aW9ucyA9Cit7CisJLmRfcmV2YWxpZGF0ZQk9IHBpZF9yZXZhbGlkYXRlLAorCS5kX2lwdXQJCT0gcGlkX2Jhc2VfaXB1dCwKKwkuZF9kZWxldGUJPSBwaWRfZGVsZXRlX2RlbnRyeSwKK307CisKKy8qIExvb2t1cHMgKi8KKworc3RhdGljIHVuc2lnbmVkIG5hbWVfdG9faW50KHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwljb25zdCBjaGFyICpuYW1lID0gZGVudHJ5LT5kX25hbWUubmFtZTsKKwlpbnQgbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCXVuc2lnbmVkIG4gPSAwOworCisJaWYgKGxlbiA+IDEgJiYgKm5hbWUgPT0gJzAnKQorCQlnb3RvIG91dDsKKwl3aGlsZSAobGVuLS0gPiAwKSB7CisJCXVuc2lnbmVkIGMgPSAqbmFtZSsrIC0gJzAnOworCQlpZiAoYyA+IDkpCisJCQlnb3RvIG91dDsKKwkJaWYgKG4gPj0gKH4wVS05KS8xMCkKKwkJCWdvdG8gb3V0OworCQluICo9IDEwOworCQluICs9IGM7CisJfQorCXJldHVybiBuOworb3V0OgorCXJldHVybiB+MFU7Cit9CisKKy8qIFNNUC1zYWZlICovCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqcHJvY19sb29rdXBmZChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IHByb2NfdGFzayhkaXIpOworCXVuc2lnbmVkIGZkID0gbmFtZV90b19pbnQoZGVudHJ5KTsKKwlzdHJ1Y3QgZmlsZSAqIGZpbGU7CisJc3RydWN0IGZpbGVzX3N0cnVjdCAqIGZpbGVzOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJc3RydWN0IHByb2NfaW5vZGUgKmVpOworCisJaWYgKGZkID09IH4wVSkKKwkJZ290byBvdXQ7CisJaWYgKCFwaWRfYWxpdmUodGFzaykpCisJCWdvdG8gb3V0OworCisJaW5vZGUgPSBwcm9jX3BpZF9tYWtlX2lub2RlKGRpci0+aV9zYiwgdGFzaywgUFJPQ19USURfRkRfRElSK2ZkKTsKKwlpZiAoIWlub2RlKQorCQlnb3RvIG91dDsKKwllaSA9IFBST0NfSShpbm9kZSk7CisJZmlsZXMgPSBnZXRfZmlsZXNfc3RydWN0KHRhc2spOworCWlmICghZmlsZXMpCisJCWdvdG8gb3V0X3VubG9jazsKKwlpbm9kZS0+aV9tb2RlID0gU19JRkxOSzsKKwlzcGluX2xvY2soJmZpbGVzLT5maWxlX2xvY2spOworCWZpbGUgPSBmY2hlY2tfZmlsZXMoZmlsZXMsIGZkKTsKKwlpZiAoIWZpbGUpCisJCWdvdG8gb3V0X3VubG9jazI7CisJaWYgKGZpbGUtPmZfbW9kZSAmIDEpCisJCWlub2RlLT5pX21vZGUgfD0gU19JUlVTUiB8IFNfSVhVU1I7CisJaWYgKGZpbGUtPmZfbW9kZSAmIDIpCisJCWlub2RlLT5pX21vZGUgfD0gU19JV1VTUiB8IFNfSVhVU1I7CisJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCXB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpOworCWlub2RlLT5pX29wID0gJnByb2NfcGlkX2xpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9zaXplID0gNjQ7CisJZWktPm9wLnByb2NfZ2V0X2xpbmsgPSBwcm9jX2ZkX2xpbms7CisJZGVudHJ5LT5kX29wID0gJnRpZF9mZF9kZW50cnlfb3BlcmF0aW9uczsKKwlkX2FkZChkZW50cnksIGlub2RlKTsKKwlyZXR1cm4gTlVMTDsKKworb3V0X3VubG9jazI6CisJc3Bpbl91bmxvY2soJmZpbGVzLT5maWxlX2xvY2spOworCXB1dF9maWxlc19zdHJ1Y3QoZmlsZXMpOworb3V0X3VubG9jazoKKwlpcHV0KGlub2RlKTsKK291dDoKKwlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKK30KKworc3RhdGljIGludCBwcm9jX3Rhc2tfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqIGZpbHAsIHZvaWQgKiBkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKTsKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpwcm9jX3Rhc2tfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCk7CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfZmRfb3BlcmF0aW9ucyA9IHsKKwkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAorCS5yZWFkZGlyCT0gcHJvY19yZWFkZmQsCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3Rhc2tfb3BlcmF0aW9ucyA9IHsKKwkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAorCS5yZWFkZGlyCT0gcHJvY190YXNrX3JlYWRkaXIsCit9OworCisvKgorICogcHJvYyBkaXJlY3RvcmllcyBjYW4gZG8gYWxtb3N0IG5vdGhpbmcuLgorICovCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcHJvY19mZF9pbm9kZV9vcGVyYXRpb25zID0geworCS5sb29rdXAJCT0gcHJvY19sb29rdXBmZCwKKwkucGVybWlzc2lvbgk9IHByb2NfcGVybWlzc2lvbiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBwcm9jX3Rhc2tfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkubG9va3VwCQk9IHByb2NfdGFza19sb29rdXAsCisJLnBlcm1pc3Npb24JPSBwcm9jX3Blcm1pc3Npb24sCit9OworCisjaWZkZWYgQ09ORklHX1NFQ1VSSVRZCitzdGF0aWMgc3NpemVfdCBwcm9jX3BpZF9hdHRyX3JlYWQoc3RydWN0IGZpbGUgKiBmaWxlLCBjaGFyIF9fdXNlciAqIGJ1ZiwKKwkJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJdW5zaWduZWQgbG9uZyBwYWdlOworCXNzaXplX3QgbGVuZ3RoOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IHByb2NfdGFzayhpbm9kZSk7CisKKwlpZiAoY291bnQgPiBQQUdFX1NJWkUpCisJCWNvdW50ID0gUEFHRV9TSVpFOworCWlmICghKHBhZ2UgPSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCkpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxlbmd0aCA9IHNlY3VyaXR5X2dldHByb2NhdHRyKHRhc2ssIAorCQkJCSAgICAgIChjaGFyKilmaWxlLT5mX2RlbnRyeS0+ZF9uYW1lLm5hbWUsIAorCQkJCSAgICAgICh2b2lkKilwYWdlLCBjb3VudCk7CisJaWYgKGxlbmd0aCA+PSAwKQorCQlsZW5ndGggPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCBwcG9zLCAoY2hhciAqKXBhZ2UsIGxlbmd0aCk7CisJZnJlZV9wYWdlKHBhZ2UpOworCXJldHVybiBsZW5ndGg7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHByb2NfcGlkX2F0dHJfd3JpdGUoc3RydWN0IGZpbGUgKiBmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZiwKKwkJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sgCisJc3RydWN0IGlub2RlICogaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwljaGFyICpwYWdlOyAKKwlzc2l6ZV90IGxlbmd0aDsgCisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gcHJvY190YXNrKGlub2RlKTsgCisKKwlpZiAoY291bnQgPiBQQUdFX1NJWkUpIAorCQljb3VudCA9IFBBR0VfU0laRTsgCisJaWYgKCpwcG9zICE9IDApIHsKKwkJLyogTm8gcGFydGlhbCB3cml0ZXMuICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwYWdlID0gKGNoYXIqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfVVNFUik7IAorCWlmICghcGFnZSkgCisJCXJldHVybiAtRU5PTUVNOworCWxlbmd0aCA9IC1FRkFVTFQ7IAorCWlmIChjb3B5X2Zyb21fdXNlcihwYWdlLCBidWYsIGNvdW50KSkgCisJCWdvdG8gb3V0OworCisJbGVuZ3RoID0gc2VjdXJpdHlfc2V0cHJvY2F0dHIodGFzaywgCisJCQkJICAgICAgKGNoYXIqKWZpbGUtPmZfZGVudHJ5LT5kX25hbWUubmFtZSwgCisJCQkJICAgICAgKHZvaWQqKXBhZ2UsIGNvdW50KTsKK291dDoKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIHBhZ2UpOworCXJldHVybiBsZW5ndGg7Cit9IAorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3BpZF9hdHRyX29wZXJhdGlvbnMgPSB7CisJLnJlYWQJCT0gcHJvY19waWRfYXR0cl9yZWFkLAorCS53cml0ZQkJPSBwcm9jX3BpZF9hdHRyX3dyaXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY190aWRfYXR0cl9vcGVyYXRpb25zOworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHByb2NfdGlkX2F0dHJfaW5vZGVfb3BlcmF0aW9uczsKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfdGdpZF9hdHRyX29wZXJhdGlvbnM7CitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcHJvY190Z2lkX2F0dHJfaW5vZGVfb3BlcmF0aW9uczsKKyNlbmRpZgorCisvKiBTTVAtc2FmZSAqLworc3RhdGljIHN0cnVjdCBkZW50cnkgKnByb2NfcGlkZW50X2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgCisJCQkJCSBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkJCSBzdHJ1Y3QgcGlkX2VudHJ5ICplbnRzKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IGVycm9yOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IHByb2NfdGFzayhkaXIpOworCXN0cnVjdCBwaWRfZW50cnkgKnA7CisJc3RydWN0IHByb2NfaW5vZGUgKmVpOworCisJZXJyb3IgPSAtRU5PRU5UOworCWlub2RlID0gTlVMTDsKKworCWlmICghcGlkX2FsaXZlKHRhc2spKQorCQlnb3RvIG91dDsKKworCWZvciAocCA9IGVudHM7IHAtPm5hbWU7IHArKykgeworCQlpZiAocC0+bGVuICE9IGRlbnRyeS0+ZF9uYW1lLmxlbikKKwkJCWNvbnRpbnVlOworCQlpZiAoIW1lbWNtcChkZW50cnktPmRfbmFtZS5uYW1lLCBwLT5uYW1lLCBwLT5sZW4pKQorCQkJYnJlYWs7CisJfQorCWlmICghcC0+bmFtZSkKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IC1FSU5WQUw7CisJaW5vZGUgPSBwcm9jX3BpZF9tYWtlX2lub2RlKGRpci0+aV9zYiwgdGFzaywgcC0+dHlwZSk7CisJaWYgKCFpbm9kZSkKKwkJZ290byBvdXQ7CisKKwllaSA9IFBST0NfSShpbm9kZSk7CisJaW5vZGUtPmlfbW9kZSA9IHAtPm1vZGU7CisJLyoKKwkgKiBZZXMsIGl0IGRvZXMgbm90IHNjYWxlLiBBbmQgaXQgc2hvdWxkIG5vdC4gRG9uJ3QgYWRkCisJICogbmV3IGVudHJpZXMgaW50byAvcHJvYy88dGdpZD4vIHdpdGhvdXQgdmVyeSBnb29kIHJlYXNvbnMuCisJICovCisJc3dpdGNoKHAtPnR5cGUpIHsKKwkJY2FzZSBQUk9DX1RHSURfVEFTSzoKKwkJCWlub2RlLT5pX25saW5rID0gMzsKKwkJCWlub2RlLT5pX29wID0gJnByb2NfdGFza19pbm9kZV9vcGVyYXRpb25zOworCQkJaW5vZGUtPmlfZm9wID0gJnByb2NfdGFza19vcGVyYXRpb25zOworCQkJYnJlYWs7CisJCWNhc2UgUFJPQ19USURfRkQ6CisJCWNhc2UgUFJPQ19UR0lEX0ZEOgorCQkJaW5vZGUtPmlfbmxpbmsgPSAyOworCQkJaW5vZGUtPmlfb3AgPSAmcHJvY19mZF9pbm9kZV9vcGVyYXRpb25zOworCQkJaW5vZGUtPmlfZm9wID0gJnByb2NfZmRfb3BlcmF0aW9uczsKKwkJCWJyZWFrOworCQljYXNlIFBST0NfVElEX0VYRToKKwkJY2FzZSBQUk9DX1RHSURfRVhFOgorCQkJaW5vZGUtPmlfb3AgPSAmcHJvY19waWRfbGlua19pbm9kZV9vcGVyYXRpb25zOworCQkJZWktPm9wLnByb2NfZ2V0X2xpbmsgPSBwcm9jX2V4ZV9saW5rOworCQkJYnJlYWs7CisJCWNhc2UgUFJPQ19USURfQ1dEOgorCQljYXNlIFBST0NfVEdJRF9DV0Q6CisJCQlpbm9kZS0+aV9vcCA9ICZwcm9jX3BpZF9saW5rX2lub2RlX29wZXJhdGlvbnM7CisJCQllaS0+b3AucHJvY19nZXRfbGluayA9IHByb2NfY3dkX2xpbms7CisJCQlicmVhazsKKwkJY2FzZSBQUk9DX1RJRF9ST09UOgorCQljYXNlIFBST0NfVEdJRF9ST09UOgorCQkJaW5vZGUtPmlfb3AgPSAmcHJvY19waWRfbGlua19pbm9kZV9vcGVyYXRpb25zOworCQkJZWktPm9wLnByb2NfZ2V0X2xpbmsgPSBwcm9jX3Jvb3RfbGluazsKKwkJCWJyZWFrOworCQljYXNlIFBST0NfVElEX0VOVklST046CisJCWNhc2UgUFJPQ19UR0lEX0VOVklST046CisJCQlpbm9kZS0+aV9mb3AgPSAmcHJvY19pbmZvX2ZpbGVfb3BlcmF0aW9uczsKKwkJCWVpLT5vcC5wcm9jX3JlYWQgPSBwcm9jX3BpZF9lbnZpcm9uOworCQkJYnJlYWs7CisJCWNhc2UgUFJPQ19USURfQVVYVjoKKwkJY2FzZSBQUk9DX1RHSURfQVVYVjoKKwkJCWlub2RlLT5pX2ZvcCA9ICZwcm9jX2luZm9fZmlsZV9vcGVyYXRpb25zOworCQkJZWktPm9wLnByb2NfcmVhZCA9IHByb2NfcGlkX2F1eHY7CisJCQlicmVhazsKKwkJY2FzZSBQUk9DX1RJRF9TVEFUVVM6CisJCWNhc2UgUFJPQ19UR0lEX1NUQVRVUzoKKwkJCWlub2RlLT5pX2ZvcCA9ICZwcm9jX2luZm9fZmlsZV9vcGVyYXRpb25zOworCQkJZWktPm9wLnByb2NfcmVhZCA9IHByb2NfcGlkX3N0YXR1czsKKwkJCWJyZWFrOworCQljYXNlIFBST0NfVElEX1NUQVQ6CisJCQlpbm9kZS0+aV9mb3AgPSAmcHJvY19pbmZvX2ZpbGVfb3BlcmF0aW9uczsKKwkJCWVpLT5vcC5wcm9jX3JlYWQgPSBwcm9jX3RpZF9zdGF0OworCQkJYnJlYWs7CisJCWNhc2UgUFJPQ19UR0lEX1NUQVQ6CisJCQlpbm9kZS0+aV9mb3AgPSAmcHJvY19pbmZvX2ZpbGVfb3BlcmF0aW9uczsKKwkJCWVpLT5vcC5wcm9jX3JlYWQgPSBwcm9jX3RnaWRfc3RhdDsKKwkJCWJyZWFrOworCQljYXNlIFBST0NfVElEX0NNRExJTkU6CisJCWNhc2UgUFJPQ19UR0lEX0NNRExJTkU6CisJCQlpbm9kZS0+aV9mb3AgPSAmcHJvY19pbmZvX2ZpbGVfb3BlcmF0aW9uczsKKwkJCWVpLT5vcC5wcm9jX3JlYWQgPSBwcm9jX3BpZF9jbWRsaW5lOworCQkJYnJlYWs7CisJCWNhc2UgUFJPQ19USURfU1RBVE06CisJCWNhc2UgUFJPQ19UR0lEX1NUQVRNOgorCQkJaW5vZGUtPmlfZm9wID0gJnByb2NfaW5mb19maWxlX29wZXJhdGlvbnM7CisJCQllaS0+b3AucHJvY19yZWFkID0gcHJvY19waWRfc3RhdG07CisJCQlicmVhazsKKwkJY2FzZSBQUk9DX1RJRF9NQVBTOgorCQljYXNlIFBST0NfVEdJRF9NQVBTOgorCQkJaW5vZGUtPmlfZm9wID0gJnByb2NfbWFwc19vcGVyYXRpb25zOworCQkJYnJlYWs7CisJCWNhc2UgUFJPQ19USURfTUVNOgorCQljYXNlIFBST0NfVEdJRF9NRU06CisJCQlpbm9kZS0+aV9vcCA9ICZwcm9jX21lbV9pbm9kZV9vcGVyYXRpb25zOworCQkJaW5vZGUtPmlfZm9wID0gJnByb2NfbWVtX29wZXJhdGlvbnM7CisJCQlicmVhazsKKyNpZmRlZiBDT05GSUdfU0VDQ09NUAorCQljYXNlIFBST0NfVElEX1NFQ0NPTVA6CisJCWNhc2UgUFJPQ19UR0lEX1NFQ0NPTVA6CisJCQlpbm9kZS0+aV9mb3AgPSAmcHJvY19zZWNjb21wX29wZXJhdGlvbnM7CisJCQlicmVhazsKKyNlbmRpZiAvKiBDT05GSUdfU0VDQ09NUCAqLworCQljYXNlIFBST0NfVElEX01PVU5UUzoKKwkJY2FzZSBQUk9DX1RHSURfTU9VTlRTOgorCQkJaW5vZGUtPmlfZm9wID0gJnByb2NfbW91bnRzX29wZXJhdGlvbnM7CisJCQlicmVhazsKKyNpZmRlZiBDT05GSUdfU0VDVVJJVFkKKwkJY2FzZSBQUk9DX1RJRF9BVFRSOgorCQkJaW5vZGUtPmlfbmxpbmsgPSAyOworCQkJaW5vZGUtPmlfb3AgPSAmcHJvY190aWRfYXR0cl9pbm9kZV9vcGVyYXRpb25zOworCQkJaW5vZGUtPmlfZm9wID0gJnByb2NfdGlkX2F0dHJfb3BlcmF0aW9uczsKKwkJCWJyZWFrOworCQljYXNlIFBST0NfVEdJRF9BVFRSOgorCQkJaW5vZGUtPmlfbmxpbmsgPSAyOworCQkJaW5vZGUtPmlfb3AgPSAmcHJvY190Z2lkX2F0dHJfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWlub2RlLT5pX2ZvcCA9ICZwcm9jX3RnaWRfYXR0cl9vcGVyYXRpb25zOworCQkJYnJlYWs7CisJCWNhc2UgUFJPQ19USURfQVRUUl9DVVJSRU5UOgorCQljYXNlIFBST0NfVEdJRF9BVFRSX0NVUlJFTlQ6CisJCWNhc2UgUFJPQ19USURfQVRUUl9QUkVWOgorCQljYXNlIFBST0NfVEdJRF9BVFRSX1BSRVY6CisJCWNhc2UgUFJPQ19USURfQVRUUl9FWEVDOgorCQljYXNlIFBST0NfVEdJRF9BVFRSX0VYRUM6CisJCWNhc2UgUFJPQ19USURfQVRUUl9GU0NSRUFURToKKwkJY2FzZSBQUk9DX1RHSURfQVRUUl9GU0NSRUFURToKKwkJCWlub2RlLT5pX2ZvcCA9ICZwcm9jX3BpZF9hdHRyX29wZXJhdGlvbnM7CisJCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19LQUxMU1lNUworCQljYXNlIFBST0NfVElEX1dDSEFOOgorCQljYXNlIFBST0NfVEdJRF9XQ0hBTjoKKwkJCWlub2RlLT5pX2ZvcCA9ICZwcm9jX2luZm9fZmlsZV9vcGVyYXRpb25zOworCQkJZWktPm9wLnByb2NfcmVhZCA9IHByb2NfcGlkX3djaGFuOworCQkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0NIRURTVEFUUworCQljYXNlIFBST0NfVElEX1NDSEVEU1RBVDoKKwkJY2FzZSBQUk9DX1RHSURfU0NIRURTVEFUOgorCQkJaW5vZGUtPmlfZm9wID0gJnByb2NfaW5mb19maWxlX29wZXJhdGlvbnM7CisJCQllaS0+b3AucHJvY19yZWFkID0gcHJvY19waWRfc2NoZWRzdGF0OworCQkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ1BVU0VUUworCQljYXNlIFBST0NfVElEX0NQVVNFVDoKKwkJY2FzZSBQUk9DX1RHSURfQ1BVU0VUOgorCQkJaW5vZGUtPmlfZm9wID0gJnByb2NfY3B1c2V0X29wZXJhdGlvbnM7CisJCQlicmVhazsKKyNlbmRpZgorCQljYXNlIFBST0NfVElEX09PTV9TQ09SRToKKwkJY2FzZSBQUk9DX1RHSURfT09NX1NDT1JFOgorCQkJaW5vZGUtPmlfZm9wID0gJnByb2NfaW5mb19maWxlX29wZXJhdGlvbnM7CisJCQllaS0+b3AucHJvY19yZWFkID0gcHJvY19vb21fc2NvcmU7CisJCQlicmVhazsKKwkJY2FzZSBQUk9DX1RJRF9PT01fQURKVVNUOgorCQljYXNlIFBST0NfVEdJRF9PT01fQURKVVNUOgorCQkJaW5vZGUtPmlfZm9wID0gJnByb2Nfb29tX2FkanVzdF9vcGVyYXRpb25zOworCQkJYnJlYWs7CisjaWZkZWYgQ09ORklHX0FVRElUU1lTQ0FMTAorCQljYXNlIFBST0NfVElEX0xPR0lOVUlEOgorCQljYXNlIFBST0NfVEdJRF9MT0dJTlVJRDoKKwkJCWlub2RlLT5pX2ZvcCA9ICZwcm9jX2xvZ2ludWlkX29wZXJhdGlvbnM7CisJCQlicmVhazsKKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJcHJpbnRrKCJwcm9jZnM6IGltcG9zc2libGUgdHlwZSAoJWQpIixwLT50eXBlKTsKKwkJCWlwdXQoaW5vZGUpOworCQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCWRlbnRyeS0+ZF9vcCA9ICZwaWRfZGVudHJ5X29wZXJhdGlvbnM7CisJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CisJcmV0dXJuIE5VTEw7CisKK291dDoKKwlyZXR1cm4gRVJSX1BUUihlcnJvcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpwcm9jX3RnaWRfYmFzZV9sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpeworCXJldHVybiBwcm9jX3BpZGVudF9sb29rdXAoZGlyLCBkZW50cnksIHRnaWRfYmFzZV9zdHVmZik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpwcm9jX3RpZF9iYXNlX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCl7CisJcmV0dXJuIHByb2NfcGlkZW50X2xvb2t1cChkaXIsIGRlbnRyeSwgdGlkX2Jhc2Vfc3R1ZmYpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3RnaWRfYmFzZV9vcGVyYXRpb25zID0geworCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIJPSBwcm9jX3RnaWRfYmFzZV9yZWFkZGlyLAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY190aWRfYmFzZV9vcGVyYXRpb25zID0geworCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIJPSBwcm9jX3RpZF9iYXNlX3JlYWRkaXIsCit9OworCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcHJvY190Z2lkX2Jhc2VfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkubG9va3VwCQk9IHByb2NfdGdpZF9iYXNlX2xvb2t1cCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBwcm9jX3RpZF9iYXNlX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLmxvb2t1cAkJPSBwcm9jX3RpZF9iYXNlX2xvb2t1cCwKK307CisKKyNpZmRlZiBDT05GSUdfU0VDVVJJVFkKK3N0YXRpYyBpbnQgcHJvY190Z2lkX2F0dHJfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqIGZpbHAsCisJCQkgICAgIHZvaWQgKiBkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCXJldHVybiBwcm9jX3BpZGVudF9yZWFkZGlyKGZpbHAsZGlyZW50LGZpbGxkaXIsCisJCQkJICAgdGdpZF9hdHRyX3N0dWZmLEFSUkFZX1NJWkUodGdpZF9hdHRyX3N0dWZmKSk7Cit9CisKK3N0YXRpYyBpbnQgcHJvY190aWRfYXR0cl9yZWFkZGlyKHN0cnVjdCBmaWxlICogZmlscCwKKwkJCSAgICAgdm9pZCAqIGRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJcmV0dXJuIHByb2NfcGlkZW50X3JlYWRkaXIoZmlscCxkaXJlbnQsZmlsbGRpciwKKwkJCQkgICB0aWRfYXR0cl9zdHVmZixBUlJBWV9TSVpFKHRpZF9hdHRyX3N0dWZmKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfdGdpZF9hdHRyX29wZXJhdGlvbnMgPSB7CisJLnJlYWQJCT0gZ2VuZXJpY19yZWFkX2RpciwKKwkucmVhZGRpcgk9IHByb2NfdGdpZF9hdHRyX3JlYWRkaXIsCit9OworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3RpZF9hdHRyX29wZXJhdGlvbnMgPSB7CisJLnJlYWQJCT0gZ2VuZXJpY19yZWFkX2RpciwKKwkucmVhZGRpcgk9IHByb2NfdGlkX2F0dHJfcmVhZGRpciwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpwcm9jX3RnaWRfYXR0cl9sb29rdXAoc3RydWN0IGlub2RlICpkaXIsCisJCQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlyZXR1cm4gcHJvY19waWRlbnRfbG9va3VwKGRpciwgZGVudHJ5LCB0Z2lkX2F0dHJfc3R1ZmYpOworfQorCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqcHJvY190aWRfYXR0cl9sb29rdXAoc3RydWN0IGlub2RlICpkaXIsCisJCQkJc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlyZXR1cm4gcHJvY19waWRlbnRfbG9va3VwKGRpciwgZGVudHJ5LCB0aWRfYXR0cl9zdHVmZik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBwcm9jX3RnaWRfYXR0cl9pbm9kZV9vcGVyYXRpb25zID0geworCS5sb29rdXAJCT0gcHJvY190Z2lkX2F0dHJfbG9va3VwLAorfTsKKworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHByb2NfdGlkX2F0dHJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkubG9va3VwCQk9IHByb2NfdGlkX2F0dHJfbG9va3VwLAorfTsKKyNlbmRpZgorCisvKgorICogL3Byb2Mvc2VsZjoKKyAqLworc3RhdGljIGludCBwcm9jX3NlbGZfcmVhZGxpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICAgICAgaW50IGJ1ZmxlbikKK3sKKwljaGFyIHRtcFszMF07CisJc3ByaW50Zih0bXAsICIlZCIsIGN1cnJlbnQtPnRnaWQpOworCXJldHVybiB2ZnNfcmVhZGxpbmsoZGVudHJ5LGJ1ZmZlcixidWZsZW4sdG1wKTsKK30KKworc3RhdGljIGludCBwcm9jX3NlbGZfZm9sbG93X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwljaGFyIHRtcFszMF07CisJc3ByaW50Zih0bXAsICIlZCIsIGN1cnJlbnQtPnRnaWQpOworCXJldHVybiB2ZnNfZm9sbG93X2xpbmsobmQsdG1wKTsKK30JCisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBwcm9jX3NlbGZfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkucmVhZGxpbmsJPSBwcm9jX3NlbGZfcmVhZGxpbmssCisJLmZvbGxvd19saW5rCT0gcHJvY19zZWxmX2ZvbGxvd19saW5rLAorfTsKKworLyoqCisgKiBwcm9jX3BpZF91bmhhc2ggLSAgVW5oYXNoIC9wcm9jLzxwaWQ+IGVudHJ5IGZyb20gdGhlIGRjYWNoZS4KKyAqIEBwOiB0YXNrIHRoYXQgc2hvdWxkIGJlIGZsdXNoZWQuCisgKgorICogRHJvcHMgdGhlIC9wcm9jLzxwaWQ+IGRjYWNoZSBlbnRyeSBmcm9tIHRoZSBoYXNoIGNoYWlucy4KKyAqCisgKiBEcm9wcGluZyAvcHJvYy88cGlkPiBlbnRyaWVzIGFuZCBkZXRhY2hfcGlkIG11c3QgYmUgc3luY2hyb25lb3VzLAorICogb3RoZXJ3aXNlIGUuZy4gL3Byb2MvPHBpZD4vZXhlIG1pZ2h0IHBvaW50IHRvIHRoZSB3cm9uZyBleGVjdXRhYmxlLAorICogaWYgdGhlIHBpZCB2YWx1ZSBpcyBpbW1lZGlhdGVseSByZXVzZWQuIFRoaXMgaXMgZW5mb3JjZWQgYnkKKyAqIC0gY2FsbGVyIG11c3QgYWNxdWlyZSBzcGluX2xvY2socC0+cHJvY19sb2NrKQorICogLSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgZGV0YWNoX3BpZCgpCisgKiAtIHByb2NfcGlkX2xvb2t1cCBhY3F1aXJlcyBwcm9jX2xvY2ssIGFuZCBjaGVja3MgdGhhdAorICogICB0aGUgdGFyZ2V0IGlzIG5vdCBkZWFkIGJ5IGxvb2tpbmcgYXQgdGhlIGF0dGFjaCBjb3VudAorICogICBvZiBQSURUWVBFX1BJRC4KKyAqLworCitzdHJ1Y3QgZGVudHJ5ICpwcm9jX3BpZF91bmhhc2goc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCXN0cnVjdCBkZW50cnkgKnByb2NfZGVudHJ5OworCisJcHJvY19kZW50cnkgPSBwLT5wcm9jX2RlbnRyeTsKKwlpZiAocHJvY19kZW50cnkgIT0gTlVMTCkgeworCisJCXNwaW5fbG9jaygmZGNhY2hlX2xvY2spOworCQlzcGluX2xvY2soJnByb2NfZGVudHJ5LT5kX2xvY2spOworCQlpZiAoIWRfdW5oYXNoZWQocHJvY19kZW50cnkpKSB7CisJCQlkZ2V0X2xvY2tlZChwcm9jX2RlbnRyeSk7CisJCQlfX2RfZHJvcChwcm9jX2RlbnRyeSk7CisJCQlzcGluX3VubG9jaygmcHJvY19kZW50cnktPmRfbG9jayk7CisJCX0gZWxzZSB7CisJCQlzcGluX3VubG9jaygmcHJvY19kZW50cnktPmRfbG9jayk7CisJCQlwcm9jX2RlbnRyeSA9IE5VTEw7CisJCX0KKwkJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwl9CisJcmV0dXJuIHByb2NfZGVudHJ5OworfQorCisvKioKKyAqIHByb2NfcGlkX2ZsdXNoIC0gcmVjb3ZlciBtZW1vcnkgdXNlZCBieSBzdGFsZSAvcHJvYy88cGlkPi94IGVudHJpZXMKKyAqIEBwcm9jX2VudHJ5OiBkaXJlY3RveSB0byBwcnVuZS4KKyAqCisgKiBTaHJpbmsgdGhlIC9wcm9jIGRpcmVjdG9yeSB0aGF0IHdhcyB1c2VkIGJ5IHRoZSBqdXN0IGtpbGxlZCB0aHJlYWQuCisgKi8KKwkKK3ZvaWQgcHJvY19waWRfZmx1c2goc3RydWN0IGRlbnRyeSAqcHJvY19kZW50cnkpCit7CisJbWlnaHRfc2xlZXAoKTsKKwlpZihwcm9jX2RlbnRyeSAhPSBOVUxMKSB7CisJCXNocmlua19kY2FjaGVfcGFyZW50KHByb2NfZGVudHJ5KTsKKwkJZHB1dChwcm9jX2RlbnRyeSk7CisJfQorfQorCisvKiBTTVAtc2FmZSAqLworc3RydWN0IGRlbnRyeSAqcHJvY19waWRfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgcHJvY19pbm9kZSAqZWk7CisJdW5zaWduZWQgdGdpZDsKKwlpbnQgZGllZDsKKworCWlmIChkZW50cnktPmRfbmFtZS5sZW4gPT0gNCAmJiAhbWVtY21wKGRlbnRyeS0+ZF9uYW1lLm5hbWUsInNlbGYiLDQpKSB7CisJCWlub2RlID0gbmV3X2lub2RlKGRpci0+aV9zYik7CisJCWlmICghaW5vZGUpCisJCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwkJZWkgPSBQUk9DX0koaW5vZGUpOworCQlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisJCWlub2RlLT5pX2lubyA9IGZha2VfaW5vKDAsIFBST0NfVEdJRF9JTk8pOworCQllaS0+cGRlID0gTlVMTDsKKwkJaW5vZGUtPmlfbW9kZSA9IFNfSUZMTkt8U19JUldYVUdPOworCQlpbm9kZS0+aV91aWQgPSBpbm9kZS0+aV9naWQgPSAwOworCQlpbm9kZS0+aV9zaXplID0gNjQ7CisJCWlub2RlLT5pX29wID0gJnByb2Nfc2VsZl9pbm9kZV9vcGVyYXRpb25zOworCQlkX2FkZChkZW50cnksIGlub2RlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXRnaWQgPSBuYW1lX3RvX2ludChkZW50cnkpOworCWlmICh0Z2lkID09IH4wVSkKKwkJZ290byBvdXQ7CisKKwlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCXRhc2sgPSBmaW5kX3Rhc2tfYnlfcGlkKHRnaWQpOworCWlmICh0YXNrKQorCQlnZXRfdGFza19zdHJ1Y3QodGFzayk7CisJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCWlmICghdGFzaykKKwkJZ290byBvdXQ7CisKKwlpbm9kZSA9IHByb2NfcGlkX21ha2VfaW5vZGUoZGlyLT5pX3NiLCB0YXNrLCBQUk9DX1RHSURfSU5PKTsKKworCisJaWYgKCFpbm9kZSkgeworCQlwdXRfdGFza19zdHJ1Y3QodGFzayk7CisJCWdvdG8gb3V0OworCX0KKwlpbm9kZS0+aV9tb2RlID0gU19JRkRJUnxTX0lSVUdPfFNfSVhVR087CisJaW5vZGUtPmlfb3AgPSAmcHJvY190Z2lkX2Jhc2VfaW5vZGVfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9mb3AgPSAmcHJvY190Z2lkX2Jhc2Vfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9ubGluayA9IDM7CisJaW5vZGUtPmlfZmxhZ3N8PVNfSU1NVVRBQkxFOworCisJZGVudHJ5LT5kX29wID0gJnBpZF9iYXNlX2RlbnRyeV9vcGVyYXRpb25zOworCisJZGllZCA9IDA7CisJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CisJc3Bpbl9sb2NrKCZ0YXNrLT5wcm9jX2xvY2spOworCXRhc2stPnByb2NfZGVudHJ5ID0gZGVudHJ5OworCWlmICghcGlkX2FsaXZlKHRhc2spKSB7CisJCWRlbnRyeSA9IHByb2NfcGlkX3VuaGFzaCh0YXNrKTsKKwkJZGllZCA9IDE7CisJfQorCXNwaW5fdW5sb2NrKCZ0YXNrLT5wcm9jX2xvY2spOworCisJcHV0X3Rhc2tfc3RydWN0KHRhc2spOworCWlmIChkaWVkKSB7CisJCXByb2NfcGlkX2ZsdXNoKGRlbnRyeSk7CisJCWdvdG8gb3V0OworCX0KKwlyZXR1cm4gTlVMTDsKK291dDoKKwlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKK30KKworLyogU01QLXNhZmUgKi8KK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpwcm9jX3Rhc2tfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CisJc3RydWN0IHRhc2tfc3RydWN0ICpsZWFkZXIgPSBwcm9jX3Rhc2soZGlyKTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXVuc2lnbmVkIHRpZDsKKworCXRpZCA9IG5hbWVfdG9faW50KGRlbnRyeSk7CisJaWYgKHRpZCA9PSB+MFUpCisJCWdvdG8gb3V0OworCisJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwl0YXNrID0gZmluZF90YXNrX2J5X3BpZCh0aWQpOworCWlmICh0YXNrKQorCQlnZXRfdGFza19zdHJ1Y3QodGFzayk7CisJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCWlmICghdGFzaykKKwkJZ290byBvdXQ7CisJaWYgKGxlYWRlci0+dGdpZCAhPSB0YXNrLT50Z2lkKQorCQlnb3RvIG91dF9kcm9wX3Rhc2s7CisKKwlpbm9kZSA9IHByb2NfcGlkX21ha2VfaW5vZGUoZGlyLT5pX3NiLCB0YXNrLCBQUk9DX1RJRF9JTk8pOworCisKKwlpZiAoIWlub2RlKQorCQlnb3RvIG91dF9kcm9wX3Rhc2s7CisJaW5vZGUtPmlfbW9kZSA9IFNfSUZESVJ8U19JUlVHT3xTX0lYVUdPOworCWlub2RlLT5pX29wID0gJnByb2NfdGlkX2Jhc2VfaW5vZGVfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9mb3AgPSAmcHJvY190aWRfYmFzZV9vcGVyYXRpb25zOworCWlub2RlLT5pX25saW5rID0gMzsKKwlpbm9kZS0+aV9mbGFnc3w9U19JTU1VVEFCTEU7CisKKwlkZW50cnktPmRfb3AgPSAmcGlkX2Jhc2VfZGVudHJ5X29wZXJhdGlvbnM7CisKKwlkX2FkZChkZW50cnksIGlub2RlKTsKKworCXB1dF90YXNrX3N0cnVjdCh0YXNrKTsKKwlyZXR1cm4gTlVMTDsKK291dF9kcm9wX3Rhc2s6CisJcHV0X3Rhc2tfc3RydWN0KHRhc2spOworb3V0OgorCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworfQorCisjZGVmaW5lIFBST0NfTlVNQlVGIDEwCisjZGVmaW5lIFBST0NfTUFYUElEUyAyMAorCisvKgorICogR2V0IGEgZmV3IHRnaWQncyB0byByZXR1cm4gZm9yIGZpbGxkaXIgLSB3ZSBuZWVkIHRvIGhvbGQgdGhlCisgKiB0YXNrbGlzdCBsb2NrIHdoaWxlIGRvaW5nIHRoaXMsIGFuZCB3ZSBtdXN0IHJlbGVhc2UgaXQgYmVmb3JlCisgKiB3ZSBhY3R1YWxseSBkbyB0aGUgZmlsbGRpciBpdHNlbGYsIHNvIHdlIHVzZSBhIHRlbXAgYnVmZmVyLi4KKyAqLworc3RhdGljIGludCBnZXRfdGdpZF9saXN0KGludCBpbmRleCwgdW5zaWduZWQgbG9uZyB2ZXJzaW9uLCB1bnNpZ25lZCBpbnQgKnRnaWRzKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKKwlpbnQgbnJfdGdpZHMgPSAwOworCisJaW5kZXgtLTsKKwlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCXAgPSBOVUxMOworCWlmICh2ZXJzaW9uKSB7CisJCXAgPSBmaW5kX3Rhc2tfYnlfcGlkKHZlcnNpb24pOworCQlpZiAocCAmJiAhdGhyZWFkX2dyb3VwX2xlYWRlcihwKSkKKwkJCXAgPSBOVUxMOworCX0KKworCWlmIChwKQorCQlpbmRleCA9IDA7CisJZWxzZQorCQlwID0gbmV4dF90YXNrKCZpbml0X3Rhc2spOworCisJZm9yICggOyBwICE9ICZpbml0X3Rhc2s7IHAgPSBuZXh0X3Rhc2socCkpIHsKKwkJaW50IHRnaWQgPSBwLT5waWQ7CisJCWlmICghcGlkX2FsaXZlKHApKQorCQkJY29udGludWU7CisJCWlmICgtLWluZGV4ID49IDApCisJCQljb250aW51ZTsKKwkJdGdpZHNbbnJfdGdpZHNdID0gdGdpZDsKKwkJbnJfdGdpZHMrKzsKKwkJaWYgKG5yX3RnaWRzID49IFBST0NfTUFYUElEUykKKwkJCWJyZWFrOworCX0KKwlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisJcmV0dXJuIG5yX3RnaWRzOworfQorCisvKgorICogR2V0IGEgZmV3IHRpZCdzIHRvIHJldHVybiBmb3IgZmlsbGRpciAtIHdlIG5lZWQgdG8gaG9sZCB0aGUKKyAqIHRhc2tsaXN0IGxvY2sgd2hpbGUgZG9pbmcgdGhpcywgYW5kIHdlIG11c3QgcmVsZWFzZSBpdCBiZWZvcmUKKyAqIHdlIGFjdHVhbGx5IGRvIHRoZSBmaWxsZGlyIGl0c2VsZiwgc28gd2UgdXNlIGEgdGVtcCBidWZmZXIuLgorICovCitzdGF0aWMgaW50IGdldF90aWRfbGlzdChpbnQgaW5kZXgsIHVuc2lnbmVkIGludCAqdGlkcywgc3RydWN0IGlub2RlICpkaXIpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICpsZWFkZXJfdGFzayA9IHByb2NfdGFzayhkaXIpOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IGxlYWRlcl90YXNrOworCWludCBucl90aWRzID0gMDsKKworCWluZGV4IC09IDI7CisJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwkvKgorCSAqIFRoZSBzdGFydGluZyBwb2ludCB0YXNrIChsZWFkZXJfdGFzaykgbWlnaHQgYmUgYW4gYWxyZWFkeQorCSAqIHVubGlua2VkIHRhc2ssIHdoaWNoIGNhbm5vdCBiZSB1c2VkIHRvIGFjY2VzcyB0aGUgdGFzay1saXN0CisJICogdmlhIG5leHRfdGhyZWFkKCkuCisJICovCisJaWYgKHBpZF9hbGl2ZSh0YXNrKSkgZG8geworCQlpbnQgdGlkID0gdGFzay0+cGlkOworCisJCWlmICgtLWluZGV4ID49IDApCisJCQljb250aW51ZTsKKwkJdGlkc1tucl90aWRzXSA9IHRpZDsKKwkJbnJfdGlkcysrOworCQlpZiAobnJfdGlkcyA+PSBQUk9DX01BWFBJRFMpCisJCQlicmVhazsKKwl9IHdoaWxlICgodGFzayA9IG5leHRfdGhyZWFkKHRhc2spKSAhPSBsZWFkZXJfdGFzayk7CisJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCXJldHVybiBucl90aWRzOworfQorCisvKiBmb3IgdGhlIC9wcm9jLyBkaXJlY3RvcnkgaXRzZWxmLCBhZnRlciBub24tcHJvY2VzcyBzdHVmZiBoYXMgYmVlbiBkb25lICovCitpbnQgcHJvY19waWRfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqIGZpbHAsIHZvaWQgKiBkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCXVuc2lnbmVkIGludCB0Z2lkX2FycmF5W1BST0NfTUFYUElEU107CisJY2hhciBidWZbUFJPQ19OVU1CVUZdOworCXVuc2lnbmVkIGludCBuciA9IGZpbHAtPmZfcG9zIC0gRklSU1RfUFJPQ0VTU19FTlRSWTsKKwl1bnNpZ25lZCBpbnQgbnJfdGdpZHMsIGk7CisJaW50IG5leHRfdGdpZDsKKworCWlmICghbnIpIHsKKwkJaW5vX3QgaW5vID0gZmFrZV9pbm8oMCxQUk9DX1RHSURfSU5PKTsKKwkJaWYgKGZpbGxkaXIoZGlyZW50LCAic2VsZiIsIDQsIGZpbHAtPmZfcG9zLCBpbm8sIERUX0xOSykgPCAwKQorCQkJcmV0dXJuIDA7CisJCWZpbHAtPmZfcG9zKys7CisJCW5yKys7CisJfQorCisJLyogZl92ZXJzaW9uIGNhY2hlcyB0aGUgdGdpZCB2YWx1ZSB0aGF0IHRoZSBsYXN0IHJlYWRkaXIgY2FsbCBjb3VsZG4ndAorCSAqIHJldHVybi4gbHNlZWsgYWthIHRlbGxkaXIgYXV0b21hZ2ljYWxseSByZXNldHMgZl92ZXJzaW9uIHRvIDAuCisJICovCisJbmV4dF90Z2lkID0gZmlscC0+Zl92ZXJzaW9uOworCWZpbHAtPmZfdmVyc2lvbiA9IDA7CisJZm9yICg7OykgeworCQlucl90Z2lkcyA9IGdldF90Z2lkX2xpc3QobnIsIG5leHRfdGdpZCwgdGdpZF9hcnJheSk7CisJCWlmICghbnJfdGdpZHMpIHsKKwkJCS8qIG5vIG1vcmUgZW50cmllcyAhICovCisJCQlicmVhazsKKwkJfQorCQluZXh0X3RnaWQgPSAwOworCisJCS8qIGRvIG5vdCB1c2UgdGhlIGxhc3QgZm91bmQgcGlkLCByZXNlcnZlIGl0IGZvciBuZXh0X3RnaWQgKi8KKwkJaWYgKG5yX3RnaWRzID09IFBST0NfTUFYUElEUykgeworCQkJbnJfdGdpZHMtLTsKKwkJCW5leHRfdGdpZCA9IHRnaWRfYXJyYXlbbnJfdGdpZHNdOworCQl9CisKKwkJZm9yIChpPTA7aTxucl90Z2lkcztpKyspIHsKKwkJCWludCB0Z2lkID0gdGdpZF9hcnJheVtpXTsKKwkJCWlub190IGlubyA9IGZha2VfaW5vKHRnaWQsUFJPQ19UR0lEX0lOTyk7CisJCQl1bnNpZ25lZCBsb25nIGogPSBQUk9DX05VTUJVRjsKKworCQkJZG8KKwkJCQlidWZbLS1qXSA9ICcwJyArICh0Z2lkICUgMTApOworCQkJd2hpbGUgKCh0Z2lkIC89IDEwKSAhPSAwKTsKKworCQkJaWYgKGZpbGxkaXIoZGlyZW50LCBidWYraiwgUFJPQ19OVU1CVUYtaiwgZmlscC0+Zl9wb3MsIGlubywgRFRfRElSKSA8IDApIHsKKwkJCQkvKiByZXR1cm5pbmcgdGhpcyB0Z2lkIGZhaWxlZCwgc2F2ZSBpdCBhcyB0aGUgZmlyc3QKKwkJCQkgKiBwaWQgZm9yIHRoZSBuZXh0IHJlYWRpciBjYWxsICovCisJCQkJZmlscC0+Zl92ZXJzaW9uID0gdGdpZF9hcnJheVtpXTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWZpbHAtPmZfcG9zKys7CisJCQlucisrOworCQl9CisJfQorb3V0OgorCXJldHVybiAwOworfQorCisvKiBmb3IgdGhlIC9wcm9jL1RHSUQvdGFzay8gZGlyZWN0b3JpZXMgKi8KK3N0YXRpYyBpbnQgcHJvY190YXNrX3JlYWRkaXIoc3RydWN0IGZpbGUgKiBmaWxwLCB2b2lkICogZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwl1bnNpZ25lZCBpbnQgdGlkX2FycmF5W1BST0NfTUFYUElEU107CisJY2hhciBidWZbUFJPQ19OVU1CVUZdOworCXVuc2lnbmVkIGludCBucl90aWRzLCBpOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbHAtPmZfZGVudHJ5OworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IHJldHZhbCA9IC1FTk9FTlQ7CisJaW5vX3QgaW5vOworCXVuc2lnbmVkIGxvbmcgcG9zID0gZmlscC0+Zl9wb3M7ICAvKiBhdm9pZGluZyAibG9uZyBsb25nIiBmaWxwLT5mX3BvcyAqLworCisJaWYgKCFwaWRfYWxpdmUocHJvY190YXNrKGlub2RlKSkpCisJCWdvdG8gb3V0OworCXJldHZhbCA9IDA7CisKKwlzd2l0Y2ggKHBvcykgeworCWNhc2UgMDoKKwkJaW5vID0gaW5vZGUtPmlfaW5vOworCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuIiwgMSwgcG9zLCBpbm8sIERUX0RJUikgPCAwKQorCQkJZ290byBvdXQ7CisJCXBvcysrOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIDE6CisJCWlubyA9IHBhcmVudF9pbm8oZGVudHJ5KTsKKwkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLi4iLCAyLCBwb3MsIGlubywgRFRfRElSKSA8IDApCisJCQlnb3RvIG91dDsKKwkJcG9zKys7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCX0KKworCW5yX3RpZHMgPSBnZXRfdGlkX2xpc3QocG9zLCB0aWRfYXJyYXksIGlub2RlKTsKKworCWZvciAoaSA9IDA7IGkgPCBucl90aWRzOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBqID0gUFJPQ19OVU1CVUY7CisJCWludCB0aWQgPSB0aWRfYXJyYXlbaV07CisKKwkJaW5vID0gZmFrZV9pbm8odGlkLFBST0NfVElEX0lOTyk7CisKKwkJZG8KKwkJCWJ1ZlstLWpdID0gJzAnICsgKHRpZCAlIDEwKTsKKwkJd2hpbGUgKCh0aWQgLz0gMTApICE9IDApOworCisJCWlmIChmaWxsZGlyKGRpcmVudCwgYnVmK2osIFBST0NfTlVNQlVGLWosIHBvcywgaW5vLCBEVF9ESVIpIDwgMCkKKwkJCWJyZWFrOworCQlwb3MrKzsKKwl9CitvdXQ6CisJZmlscC0+Zl9wb3MgPSBwb3M7CisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL2ZzL3Byb2MvZ2VuZXJpYy5jIGIvZnMvcHJvYy9nZW5lcmljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM2MzE1ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3Byb2MvZ2VuZXJpYy5jCkBAIC0wLDAgKzEsNzA1IEBACisvKgorICogcHJvYy9mcy9nZW5lcmljLmMgLS0tIGdlbmVyaWMgcm91dGluZXMgZm9yIHRoZSBwcm9jLWZzCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGdlbmVyaWMgcHJvYy1mcyByb3V0aW5lcyBmb3IgaGFuZGxpbmcKKyAqIGRpcmVjdG9yaWVzIGFuZCBmaWxlcy4KKyAqIAorICogQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyIExpbnVzIFRvcnZhbGRzLgorICogQ29weXJpZ2h0IChDKSAxOTk3IFRoZW9kb3JlIFRzJ28KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworc3RhdGljIHNzaXplX3QgcHJvY19maWxlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkgICAgICBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpOworc3RhdGljIHNzaXplX3QgcHJvY19maWxlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKK3N0YXRpYyBsb2ZmX3QgcHJvY19maWxlX2xzZWVrKHN0cnVjdCBmaWxlICosIGxvZmZfdCwgaW50KTsKKworaW50IHByb2NfbWF0Y2goaW50IGxlbiwgY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZSkKK3sKKwlpZiAoZGUtPm5hbWVsZW4gIT0gbGVuKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gIW1lbWNtcChuYW1lLCBkZS0+bmFtZSwgbGVuKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19maWxlX29wZXJhdGlvbnMgPSB7CisJLmxsc2VlawkJPSBwcm9jX2ZpbGVfbHNlZWssCisJLnJlYWQJCT0gcHJvY19maWxlX3JlYWQsCisJLndyaXRlCQk9IHByb2NfZmlsZV93cml0ZSwKK307CisKKy8qIGJ1ZmZlciBzaXplIGlzIG9uZSBwYWdlIGJ1dCBvdXIgb3V0cHV0IHJvdXRpbmVzIHVzZSBzb21lIHNsYWNrIGZvciBvdmVycnVucyAqLworI2RlZmluZSBQUk9DX0JMT0NLX1NJWkUJKFBBR0VfU0laRSAtIDEwMjQpCisKK3N0YXRpYyBzc2l6ZV90Citwcm9jX2ZpbGVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IG5ieXRlcywKKwkgICAgICAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZmlsZS0+Zl9kZW50cnktPmRfaW5vZGU7CisJY2hhciAJKnBhZ2U7CisJc3NpemVfdAlyZXR2YWw9MDsKKwlpbnQJZW9mPTA7CisJc3NpemVfdAluLCBjb3VudDsKKwljaGFyCSpzdGFydDsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKiBkcDsKKworCWRwID0gUERFKGlub2RlKTsKKwlpZiAoIShwYWdlID0gKGNoYXIqKSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCkpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXdoaWxlICgobmJ5dGVzID4gMCkgJiYgIWVvZikgeworCQljb3VudCA9IG1pbl90KHNpemVfdCwgUFJPQ19CTE9DS19TSVpFLCBuYnl0ZXMpOworCisJCXN0YXJ0ID0gTlVMTDsKKwkJaWYgKGRwLT5nZXRfaW5mbykgeworCQkJLyogSGFuZGxlIG9sZCBuZXQgcm91dGluZXMgKi8KKwkJCW4gPSBkcC0+Z2V0X2luZm8ocGFnZSwgJnN0YXJ0LCAqcHBvcywgY291bnQpOworCQkJaWYgKG4gPCBjb3VudCkKKwkJCQllb2YgPSAxOworCQl9IGVsc2UgaWYgKGRwLT5yZWFkX3Byb2MpIHsKKwkJCS8qCisJCQkgKiBIb3cgdG8gYmUgYSBwcm9jIHJlYWQgZnVuY3Rpb24KKwkJCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJICogUHJvdG90eXBlOgorCQkJICogICAgaW50IGYoY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZnNldCwKKwkJCSAqICAgICAgICAgIGludCBjb3VudCwgaW50ICpwZW9mLCB2b2lkICpkYXQpCisJCQkgKgorCQkJICogQXNzdW1lIHRoYXQgdGhlIGJ1ZmZlciBpcyAiY291bnQiIGJ5dGVzIGluIHNpemUuCisJCQkgKgorCQkJICogSWYgeW91IGtub3cgeW91IGhhdmUgc3VwcGxpZWQgYWxsIHRoZSBkYXRhIHlvdQorCQkJICogaGF2ZSwgc2V0ICpwZW9mLgorCQkJICoKKwkJCSAqIFlvdSBoYXZlIHRocmVlIHdheXMgdG8gcmV0dXJuIGRhdGE6CisJCQkgKiAwKSBMZWF2ZSAqc3RhcnQgPSBOVUxMLiAgKFRoaXMgaXMgdGhlIGRlZmF1bHQuKQorCQkJICogICAgUHV0IHRoZSBkYXRhIG9mIHRoZSByZXF1ZXN0ZWQgb2Zmc2V0IGF0IHRoYXQKKwkJCSAqICAgIG9mZnNldCB3aXRoaW4gdGhlIGJ1ZmZlci4gIFJldHVybiB0aGUgbnVtYmVyIChuKQorCQkJICogICAgb2YgYnl0ZXMgdGhlcmUgYXJlIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUKKwkJCSAqICAgIGJ1ZmZlciB1cCB0byB0aGUgbGFzdCBieXRlIG9mIGRhdGEuICBJZiB0aGUKKwkJCSAqICAgIG51bWJlciBvZiBzdXBwbGllZCBieXRlcyAoPSBuIC0gb2Zmc2V0KSBpcyAKKwkJCSAqICAgIGdyZWF0ZXIgdGhhbiB6ZXJvIGFuZCB5b3UgZGlkbid0IHNpZ25hbCBlb2YKKwkJCSAqICAgIGFuZCB0aGUgcmVhZGVyIGlzIHByZXBhcmVkIHRvIHRha2UgbW9yZSBkYXRhCisJCQkgKiAgICB5b3Ugd2lsbCBiZSBjYWxsZWQgYWdhaW4gd2l0aCB0aGUgcmVxdWVzdGVkCisJCQkgKiAgICBvZmZzZXQgYWR2YW5jZWQgYnkgdGhlIG51bWJlciBvZiBieXRlcyAKKwkJCSAqICAgIGFic29yYmVkLiAgVGhpcyBpbnRlcmZhY2UgaXMgdXNlZnVsIGZvciBmaWxlcworCQkJICogICAgbm8gbGFyZ2VyIHRoYW4gdGhlIGJ1ZmZlci4KKwkJCSAqIDEpIFNldCAqc3RhcnQgPSBhbiB1bnNpZ25lZCBsb25nIHZhbHVlIGxlc3MgdGhhbgorCQkJICogICAgdGhlIGJ1ZmZlciBhZGRyZXNzIGJ1dCBncmVhdGVyIHRoYW4gemVyby4KKwkJCSAqICAgIFB1dCB0aGUgZGF0YSBvZiB0aGUgcmVxdWVzdGVkIG9mZnNldCBhdCB0aGUKKwkJCSAqICAgIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyLiAgUmV0dXJuIHRoZSBudW1iZXIgb2YKKwkJCSAqICAgIGJ5dGVzIG9mIGRhdGEgcGxhY2VkIHRoZXJlLiAgSWYgdGhpcyBudW1iZXIgaXMKKwkJCSAqICAgIGdyZWF0ZXIgdGhhbiB6ZXJvIGFuZCB5b3UgZGlkbid0IHNpZ25hbCBlb2YKKwkJCSAqICAgIGFuZCB0aGUgcmVhZGVyIGlzIHByZXBhcmVkIHRvIHRha2UgbW9yZSBkYXRhCisJCQkgKiAgICB5b3Ugd2lsbCBiZSBjYWxsZWQgYWdhaW4gd2l0aCB0aGUgcmVxdWVzdGVkCisJCQkgKiAgICBvZmZzZXQgYWR2YW5jZWQgYnkgKnN0YXJ0LiAgVGhpcyBpbnRlcmZhY2UgaXMKKwkJCSAqICAgIHVzZWZ1bCB3aGVuIHlvdSBoYXZlIGEgbGFyZ2UgZmlsZSBjb25zaXN0aW5nCisJCQkgKiAgICBvZiBhIHNlcmllcyBvZiBibG9ja3Mgd2hpY2ggeW91IHdhbnQgdG8gY291bnQKKwkJCSAqICAgIGFuZCByZXR1cm4gYXMgd2hvbGVzLgorCQkJICogICAgKEhhY2sgYnkgUGF1bC5SdXNzZWxsQHJ1c3Rjb3JwLmNvbS5hdSkKKwkJCSAqIDIpIFNldCAqc3RhcnQgPSBhbiBhZGRyZXNzIHdpdGhpbiB0aGUgYnVmZmVyLgorCQkJICogICAgUHV0IHRoZSBkYXRhIG9mIHRoZSByZXF1ZXN0ZWQgb2Zmc2V0IGF0ICpzdGFydC4KKwkJCSAqICAgIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGRhdGEgcGxhY2VkIHRoZXJlLgorCQkJICogICAgSWYgdGhpcyBudW1iZXIgaXMgZ3JlYXRlciB0aGFuIHplcm8gYW5kIHlvdQorCQkJICogICAgZGlkbid0IHNpZ25hbCBlb2YgYW5kIHRoZSByZWFkZXIgaXMgcHJlcGFyZWQgdG8KKwkJCSAqICAgIHRha2UgbW9yZSBkYXRhIHlvdSB3aWxsIGJlIGNhbGxlZCBhZ2FpbiB3aXRoIHRoZQorCQkJICogICAgcmVxdWVzdGVkIG9mZnNldCBhZHZhbmNlZCBieSB0aGUgbnVtYmVyIG9mIGJ5dGVzCisJCQkgKiAgICBhYnNvcmJlZC4KKwkJCSAqLworCQkJbiA9IGRwLT5yZWFkX3Byb2MocGFnZSwgJnN0YXJ0LCAqcHBvcywKKwkJCQkJICBjb3VudCwgJmVvZiwgZHAtPmRhdGEpOworCQl9IGVsc2UKKwkJCWJyZWFrOworCisJCWlmIChuID09IDApICAgLyogZW5kIG9mIGZpbGUgKi8KKwkJCWJyZWFrOworCQlpZiAobiA8IDApIHsgIC8qIGVycm9yICovCisJCQlpZiAocmV0dmFsID09IDApCisJCQkJcmV0dmFsID0gbjsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHN0YXJ0ID09IE5VTEwpIHsKKwkJCWlmIChuID4gUEFHRV9TSVpFKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJICAgICAgICJwcm9jX2ZpbGVfcmVhZDogQXBwYXJlbnQgYnVmZmVyIG92ZXJmbG93IVxuIik7CisJCQkJbiA9IFBBR0VfU0laRTsKKwkJCX0KKwkJCW4gLT0gKnBwb3M7CisJCQlpZiAobiA8PSAwKQorCQkJCWJyZWFrOworCQkJaWYgKG4gPiBjb3VudCkKKwkJCQluID0gY291bnQ7CisJCQlzdGFydCA9IHBhZ2UgKyAqcHBvczsKKwkJfSBlbHNlIGlmIChzdGFydCA8IHBhZ2UpIHsKKwkJCWlmIChuID4gUEFHRV9TSVpFKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJICAgICAgICJwcm9jX2ZpbGVfcmVhZDogQXBwYXJlbnQgYnVmZmVyIG92ZXJmbG93IVxuIik7CisJCQkJbiA9IFBBR0VfU0laRTsKKwkJCX0KKwkJCWlmIChuID4gY291bnQpIHsKKwkJCQkvKgorCQkJCSAqIERvbid0IHJlZHVjZSBuIGJlY2F1c2UgZG9pbmcgc28gbWlnaHQKKwkJCQkgKiBjdXQgb2ZmIHBhcnQgb2YgYSBkYXRhIGJsb2NrLgorCQkJCSAqLworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkgICAgICAgInByb2NfZmlsZV9yZWFkOiBSZWFkIGNvdW50IGV4Y2VlZGVkXG4iKTsKKwkJCX0KKwkJfSBlbHNlIC8qIHN0YXJ0ID49IHBhZ2UgKi8geworCQkJdW5zaWduZWQgbG9uZyBzdGFydG9mZiA9ICh1bnNpZ25lZCBsb25nKShzdGFydCAtIHBhZ2UpOworCQkJaWYgKG4gPiAoUEFHRV9TSVpFIC0gc3RhcnRvZmYpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJICAgICAgICJwcm9jX2ZpbGVfcmVhZDogQXBwYXJlbnQgYnVmZmVyIG92ZXJmbG93IVxuIik7CisJCQkJbiA9IFBBR0VfU0laRSAtIHN0YXJ0b2ZmOworCQkJfQorCQkJaWYgKG4gPiBjb3VudCkKKwkJCQluID0gY291bnQ7CisJCX0KKwkJCisgCQluIC09IGNvcHlfdG9fdXNlcihidWYsIHN0YXJ0IDwgcGFnZSA/IHBhZ2UgOiBzdGFydCwgbik7CisJCWlmIChuID09IDApIHsKKwkJCWlmIChyZXR2YWwgPT0gMCkKKwkJCQlyZXR2YWwgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQkqcHBvcyArPSBzdGFydCA8IHBhZ2UgPyAodW5zaWduZWQgbG9uZylzdGFydCA6IG47CisJCW5ieXRlcyAtPSBuOworCQlidWYgKz0gbjsKKwkJcmV0dmFsICs9IG47CisJfQorCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgcGFnZSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHNzaXplX3QKK3Byb2NfZmlsZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqIGRwOworCQorCWRwID0gUERFKGlub2RlKTsKKworCWlmICghZHAtPndyaXRlX3Byb2MpCisJCXJldHVybiAtRUlPOworCisJLyogRklYTUU6IGRvZXMgdGhpcyByb3V0aW5lIG5lZWQgcHBvcz8gIHByb2JhYmx5Li4uICovCisJcmV0dXJuIGRwLT53cml0ZV9wcm9jKGZpbGUsIGJ1ZmZlciwgY291bnQsIGRwLT5kYXRhKTsKK30KKworCitzdGF0aWMgbG9mZl90Citwcm9jX2ZpbGVfbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsIGludCBvcmlnKQoreworICAgIGxvY2tfa2VybmVsKCk7CisKKyAgICBzd2l0Y2ggKG9yaWcpIHsKKyAgICBjYXNlIDA6CisJaWYgKG9mZnNldCA8IDApCisJICAgIGdvdG8gb3V0OworCWZpbGUtPmZfcG9zID0gb2Zmc2V0OworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4oZmlsZS0+Zl9wb3MpOworICAgIGNhc2UgMToKKwlpZiAob2Zmc2V0ICsgZmlsZS0+Zl9wb3MgPCAwKQorCSAgICBnb3RvIG91dDsKKwlmaWxlLT5mX3BvcyArPSBvZmZzZXQ7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybihmaWxlLT5mX3Bvcyk7CisgICAgY2FzZSAyOgorCWdvdG8gb3V0OworICAgIGRlZmF1bHQ6CisJZ290byBvdXQ7CisgICAgfQorCitvdXQ6CisgICAgdW5sb2NrX2tlcm5lbCgpOworICAgIHJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHByb2Nfbm90aWZ5X2NoYW5nZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqaWF0dHIpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlID0gUERFKGlub2RlKTsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IGlub2RlX2NoYW5nZV9vayhpbm9kZSwgaWF0dHIpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IGlub2RlX3NldGF0dHIoaW5vZGUsIGlhdHRyKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCQorCWRlLT51aWQgPSBpbm9kZS0+aV91aWQ7CisJZGUtPmdpZCA9IGlub2RlLT5pX2dpZDsKKwlkZS0+bW9kZSA9IGlub2RlLT5pX21vZGU7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcHJvY19maWxlX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnNldGF0dHIJPSBwcm9jX25vdGlmeV9jaGFuZ2UsCit9OworCisvKgorICogVGhpcyBmdW5jdGlvbiBwYXJzZXMgYSBuYW1lIHN1Y2ggYXMgInR0eS9kcml2ZXIvc2VyaWFsIiwgYW5kCisgKiByZXR1cm5zIHRoZSBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgZm9yICIvcHJvYy90dHkvZHJpdmVyIiwgYW5kCisgKiByZXR1cm5zICJzZXJpYWwiIGluIHJlc2lkdWFsLgorICovCitzdGF0aWMgaW50IHhsYXRlX3Byb2NfbmFtZShjb25zdCBjaGFyICpuYW1lLAorCQkJICAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICoqcmV0LCBjb25zdCBjaGFyICoqcmVzaWR1YWwpCit7CisJY29uc3QgY2hhciAgICAgCQkqY3AgPSBuYW1lLCAqbmV4dDsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkJKmRlOworCWludAkJCWxlbjsKKworCWRlID0gJnByb2Nfcm9vdDsKKwl3aGlsZSAoMSkgeworCQluZXh0ID0gc3RyY2hyKGNwLCAnLycpOworCQlpZiAoIW5leHQpCisJCQlicmVhazsKKworCQlsZW4gPSBuZXh0IC0gY3A7CisJCWZvciAoZGUgPSBkZS0+c3ViZGlyOyBkZSA7IGRlID0gZGUtPm5leHQpIHsKKwkJCWlmIChwcm9jX21hdGNoKGxlbiwgY3AsIGRlKSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoIWRlKQorCQkJcmV0dXJuIC1FTk9FTlQ7CisJCWNwICs9IGxlbiArIDE7CisJfQorCSpyZXNpZHVhbCA9IGNwOworCSpyZXQgPSBkZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIERFRklORV9JRFIocHJvY19pbnVtX2lkcik7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHByb2NfaW51bV9sb2NrKTsgLyogcHJvdGVjdHMgdGhlIGFib3ZlICovCisKKyNkZWZpbmUgUFJPQ19EWU5BTUlDX0ZJUlNUIDB4RjAwMDAwMDBVTAorCisvKgorICogUmV0dXJuIGFuIGlub2RlIG51bWJlciBiZXR3ZWVuIFBST0NfRFlOQU1JQ19GSVJTVCBhbmQKKyAqIDB4ZmZmZmZmZmYsIG9yIHplcm8gb24gZmFpbHVyZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBnZXRfaW5vZGVfbnVtYmVyKHZvaWQpCit7CisJaW50IGksIGludW0gPSAwOworCWludCBlcnJvcjsKKworcmV0cnk6CisJaWYgKGlkcl9wcmVfZ2V0KCZwcm9jX2ludW1faWRyLCBHRlBfS0VSTkVMKSA9PSAwKQorCQlyZXR1cm4gMDsKKworCXNwaW5fbG9jaygmcHJvY19pbnVtX2xvY2spOworCWVycm9yID0gaWRyX2dldF9uZXcoJnByb2NfaW51bV9pZHIsIE5VTEwsICZpKTsKKwlzcGluX3VubG9jaygmcHJvY19pbnVtX2xvY2spOworCWlmIChlcnJvciA9PSAtRUFHQUlOKQorCQlnb3RvIHJldHJ5OworCWVsc2UgaWYgKGVycm9yKQorCQlyZXR1cm4gMDsKKworCWludW0gPSAoaSAmIE1BWF9JRF9NQVNLKSArIFBST0NfRFlOQU1JQ19GSVJTVDsKKworCS8qIGludW0gd2lsbCBuZXZlciBiZSBtb3JlIHRoYW4gMHhmMGZmZmZmZiwgc28gbm8gY2hlY2sKKwkgKiBmb3Igb3ZlcmZsb3cuCisJICovCisKKwlyZXR1cm4gaW51bTsKK30KKworc3RhdGljIHZvaWQgcmVsZWFzZV9pbm9kZV9udW1iZXIodW5zaWduZWQgaW50IGludW0pCit7CisJaW50IGlkID0gKGludW0gLSBQUk9DX0RZTkFNSUNfRklSU1QpIHwgfk1BWF9JRF9NQVNLOworCisJc3Bpbl9sb2NrKCZwcm9jX2ludW1fbG9jayk7CisJaWRyX3JlbW92ZSgmcHJvY19pbnVtX2lkciwgaWQpOworCXNwaW5fdW5sb2NrKCZwcm9jX2ludW1fbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19mb2xsb3dfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCW5kX3NldF9saW5rKG5kLCBQREUoZGVudHJ5LT5kX2lub2RlKS0+ZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBwcm9jX2xpbmtfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkucmVhZGxpbmsJPSBnZW5lcmljX3JlYWRsaW5rLAorCS5mb2xsb3dfbGluawk9IHByb2NfZm9sbG93X2xpbmssCit9OworCisvKgorICogQXMgc29tZSBlbnRyaWVzIGluIC9wcm9jIGFyZSB2b2xhdGlsZSwgd2Ugd2FudCB0byAKKyAqIGdldCByaWQgb2YgdW51c2VkIGRlbnRyaWVzLiAgVGhpcyBjb3VsZCBiZSBtYWRlIAorICogc21hcnRlcjogd2UgY291bGQga2VlcCBhICJ2b2xhdGlsZSIgZmxhZyBpbiB0aGUgCisgKiBpbm9kZSB0byBpbmRpY2F0ZSB3aGljaCBvbmVzIHRvIGtlZXAuCisgKi8KK3N0YXRpYyBpbnQgcHJvY19kZWxldGVfZGVudHJ5KHN0cnVjdCBkZW50cnkgKiBkZW50cnkpCit7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgcHJvY19kZW50cnlfb3BlcmF0aW9ucyA9Cit7CisJLmRfZGVsZXRlCT0gcHJvY19kZWxldGVfZGVudHJ5LAorfTsKKworLyoKKyAqIERvbid0IGNyZWF0ZSBuZWdhdGl2ZSBkZW50cmllcyBoZXJlLCByZXR1cm4gLUVOT0VOVCBieSBoYW5kCisgKiBpbnN0ZWFkLgorICovCitzdHJ1Y3QgZGVudHJ5ICpwcm9jX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICogZGU7CisJaW50IGVycm9yID0gLUVOT0VOVDsKKworCWxvY2tfa2VybmVsKCk7CisJZGUgPSBQREUoZGlyKTsKKwlpZiAoZGUpIHsKKwkJZm9yIChkZSA9IGRlLT5zdWJkaXI7IGRlIDsgZGUgPSBkZS0+bmV4dCkgeworCQkJaWYgKGRlLT5uYW1lbGVuICE9IGRlbnRyeS0+ZF9uYW1lLmxlbikKKwkJCQljb250aW51ZTsKKwkJCWlmICghbWVtY21wKGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGRlLT5uYW1lLCBkZS0+bmFtZWxlbikpIHsKKwkJCQl1bnNpZ25lZCBpbnQgaW5vID0gZGUtPmxvd19pbm87CisKKwkJCQllcnJvciA9IC1FSU5WQUw7CisJCQkJaW5vZGUgPSBwcm9jX2dldF9pbm9kZShkaXItPmlfc2IsIGlubywgZGUpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXVubG9ja19rZXJuZWwoKTsKKworCWlmIChpbm9kZSkgeworCQlkZW50cnktPmRfb3AgPSAmcHJvY19kZW50cnlfb3BlcmF0aW9uczsKKwkJZF9hZGQoZGVudHJ5LCBpbm9kZSk7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gRVJSX1BUUihlcnJvcik7Cit9CisKKy8qCisgKiBUaGlzIHJldHVybnMgbm9uLXplcm8gaWYgYXQgRU9GLCBzbyB0aGF0IHRoZSAvcHJvYworICogcm9vdCBkaXJlY3RvcnkgY2FuIHVzZSB0aGlzIGFuZCBjaGVjayBpZiBpdCBzaG91bGQKKyAqIGNvbnRpbnVlIHdpdGggdGhlIDxwaWQ+IGVudHJpZXMuLgorICoKKyAqIE5vdGUgdGhhdCB0aGUgVkZTLWxheWVyIGRvZXNuJ3QgY2FyZSBhYm91dCB0aGUgcmV0dXJuCisgKiB2YWx1ZSBvZiB0aGUgcmVhZGRpcigpIGNhbGwsIGFzIGxvbmcgYXMgaXQncyBub24tbmVnYXRpdmUKKyAqIGZvciBzdWNjZXNzLi4KKyAqLworaW50IHByb2NfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqIGZpbHAsCisJdm9pZCAqIGRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICogZGU7CisJdW5zaWduZWQgaW50IGlubzsKKwlpbnQgaTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJaW50IHJldCA9IDA7CisKKwlsb2NrX2tlcm5lbCgpOworCisJaW5vID0gaW5vZGUtPmlfaW5vOworCWRlID0gUERFKGlub2RlKTsKKwlpZiAoIWRlKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwlpID0gZmlscC0+Zl9wb3M7CisJc3dpdGNoIChpKSB7CisJCWNhc2UgMDoKKwkJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4iLCAxLCBpLCBpbm8sIERUX0RJUikgPCAwKQorCQkJCWdvdG8gb3V0OworCQkJaSsrOworCQkJZmlscC0+Zl9wb3MrKzsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIDE6CisJCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuLiIsIDIsIGksCisJCQkJICAgIHBhcmVudF9pbm8oZmlscC0+Zl9kZW50cnkpLAorCQkJCSAgICBEVF9ESVIpIDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJCWkrKzsKKwkJCWZpbHAtPmZfcG9zKys7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJZGVmYXVsdDoKKwkJCWRlID0gZGUtPnN1YmRpcjsKKwkJCWkgLT0gMjsKKwkJCWZvciAoOzspIHsKKwkJCQlpZiAoIWRlKSB7CisJCQkJCXJldCA9IDE7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlpZiAoIWkpCisJCQkJCWJyZWFrOworCQkJCWRlID0gZGUtPm5leHQ7CisJCQkJaS0tOworCQkJfQorCisJCQlkbyB7CisJCQkJaWYgKGZpbGxkaXIoZGlyZW50LCBkZS0+bmFtZSwgZGUtPm5hbWVsZW4sIGZpbHAtPmZfcG9zLAorCQkJCQkgICAgZGUtPmxvd19pbm8sIGRlLT5tb2RlID4+IDEyKSA8IDApCisJCQkJCWdvdG8gb3V0OworCQkJCWZpbHAtPmZfcG9zKys7CisJCQkJZGUgPSBkZS0+bmV4dDsKKwkJCX0gd2hpbGUgKGRlKTsKKwl9CisJcmV0ID0gMTsKK291dDoJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXQ7CQorfQorCisvKgorICogVGhlc2UgYXJlIHRoZSBnZW5lcmljIC9wcm9jIGRpcmVjdG9yeSBvcGVyYXRpb25zLiBUaGV5CisgKiB1c2UgdGhlIGluLW1lbW9yeSAic3RydWN0IHByb2NfZGlyX2VudHJ5IiB0cmVlIHRvIHBhcnNlCisgKiB0aGUgL3Byb2MgZGlyZWN0b3J5LgorICovCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2Rpcl9vcGVyYXRpb25zID0geworCS5yZWFkCQkJPSBnZW5lcmljX3JlYWRfZGlyLAorCS5yZWFkZGlyCQk9IHByb2NfcmVhZGRpciwKK307CisKKy8qCisgKiBwcm9jIGRpcmVjdG9yaWVzIGNhbiBkbyBhbG1vc3Qgbm90aGluZy4uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBwcm9jX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0geworCS5sb29rdXAJCT0gcHJvY19sb29rdXAsCisJLnNldGF0dHIJPSBwcm9jX25vdGlmeV9jaGFuZ2UsCit9OworCitzdGF0aWMgaW50IHByb2NfcmVnaXN0ZXIoc3RydWN0IHByb2NfZGlyX2VudHJ5ICogZGlyLCBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKiBkcCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwkKKwlpID0gZ2V0X2lub2RlX251bWJlcigpOworCWlmIChpID09IDApCisJCXJldHVybiAtRUFHQUlOOworCWRwLT5sb3dfaW5vID0gaTsKKwlkcC0+bmV4dCA9IGRpci0+c3ViZGlyOworCWRwLT5wYXJlbnQgPSBkaXI7CisJZGlyLT5zdWJkaXIgPSBkcDsKKwlpZiAoU19JU0RJUihkcC0+bW9kZSkpIHsKKwkJaWYgKGRwLT5wcm9jX2lvcHMgPT0gTlVMTCkgeworCQkJZHAtPnByb2NfZm9wcyA9ICZwcm9jX2Rpcl9vcGVyYXRpb25zOworCQkJZHAtPnByb2NfaW9wcyA9ICZwcm9jX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCQl9CisJCWRpci0+bmxpbmsrKzsKKwl9IGVsc2UgaWYgKFNfSVNMTksoZHAtPm1vZGUpKSB7CisJCWlmIChkcC0+cHJvY19pb3BzID09IE5VTEwpCisJCQlkcC0+cHJvY19pb3BzID0gJnByb2NfbGlua19pbm9kZV9vcGVyYXRpb25zOworCX0gZWxzZSBpZiAoU19JU1JFRyhkcC0+bW9kZSkpIHsKKwkJaWYgKGRwLT5wcm9jX2ZvcHMgPT0gTlVMTCkKKwkJCWRwLT5wcm9jX2ZvcHMgPSAmcHJvY19maWxlX29wZXJhdGlvbnM7CisJCWlmIChkcC0+cHJvY19pb3BzID09IE5VTEwpCisJCQlkcC0+cHJvY19pb3BzID0gJnByb2NfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEtpbGwgYW4gaW5vZGUgdGhhdCBnb3QgdW5yZWdpc3RlcmVkLi4KKyAqLworc3RhdGljIHZvaWQgcHJvY19raWxsX2lub2RlcyhzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IHByb2NfbW50LT5tbnRfc2I7CisKKwkvKgorCSAqIEFjdHVhbGx5IGl0J3MgYSBwYXJ0aWFsIHJldm9rZSgpLgorCSAqLworCWZpbGVfbGlzdF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaChwLCAmc2ItPnNfZmlsZXMpIHsKKwkJc3RydWN0IGZpbGUgKiBmaWxwID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgZmlsZSwgZl9saXN0KTsKKwkJc3RydWN0IGRlbnRyeSAqIGRlbnRyeSA9IGZpbHAtPmZfZGVudHJ5OworCQlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKwkJc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9wczsKKworCQlpZiAoZGVudHJ5LT5kX29wICE9ICZwcm9jX2RlbnRyeV9vcGVyYXRpb25zKQorCQkJY29udGludWU7CisJCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCQlpZiAoUERFKGlub2RlKSAhPSBkZSkKKwkJCWNvbnRpbnVlOworCQlmb3BzID0gZmlscC0+Zl9vcDsKKwkJZmlscC0+Zl9vcCA9IE5VTEw7CisJCWZvcHNfcHV0KGZvcHMpOworCX0KKwlmaWxlX2xpc3RfdW5sb2NrKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfY3JlYXRlKHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqKnBhcmVudCwKKwkJCQkJICBjb25zdCBjaGFyICpuYW1lLAorCQkJCQkgIG1vZGVfdCBtb2RlLAorCQkJCQkgIG5saW5rX3QgbmxpbmspCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnQgPSBOVUxMOworCWNvbnN0IGNoYXIgKmZuID0gbmFtZTsKKwlpbnQgbGVuOworCisJLyogbWFrZSBzdXJlIG5hbWUgaXMgdmFsaWQgKi8KKwlpZiAoIW5hbWUgfHwgIXN0cmxlbihuYW1lKSkgZ290byBvdXQ7CisKKwlpZiAoISgqcGFyZW50KSAmJiB4bGF0ZV9wcm9jX25hbWUobmFtZSwgcGFyZW50LCAmZm4pICE9IDApCisJCWdvdG8gb3V0OworCisJLyogQXQgdGhpcyBwb2ludCB0aGVyZSBtdXN0IG5vdCBiZSBhbnkgJy8nIGNoYXJhY3RlcnMgYmV5b25kICpmbiAqLworCWlmIChzdHJjaHIoZm4sICcvJykpCisJCWdvdG8gb3V0OworCisJbGVuID0gc3RybGVuKGZuKTsKKworCWVudCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSkgKyBsZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVudCkgZ290byBvdXQ7CisKKwltZW1zZXQoZW50LCAwLCBzaXplb2Yoc3RydWN0IHByb2NfZGlyX2VudHJ5KSk7CisJbWVtY3B5KCgoY2hhciAqKSBlbnQpICsgc2l6ZW9mKHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSksIGZuLCBsZW4gKyAxKTsKKwllbnQtPm5hbWUgPSAoKGNoYXIgKikgZW50KSArIHNpemVvZigqZW50KTsKKwllbnQtPm5hbWVsZW4gPSBsZW47CisJZW50LT5tb2RlID0gbW9kZTsKKwllbnQtPm5saW5rID0gbmxpbms7Cisgb3V0OgorCXJldHVybiBlbnQ7Cit9CisKK3N0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19zeW1saW5rKGNvbnN0IGNoYXIgKm5hbWUsCisJCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGFyZW50LCBjb25zdCBjaGFyICpkZXN0KQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50OworCisJZW50ID0gcHJvY19jcmVhdGUoJnBhcmVudCxuYW1lLAorCQkJICAoU19JRkxOSyB8IFNfSVJVR08gfCBTX0lXVUdPIHwgU19JWFVHTyksMSk7CisKKwlpZiAoZW50KSB7CisJCWVudC0+ZGF0YSA9IGttYWxsb2MoKGVudC0+c2l6ZT1zdHJsZW4oZGVzdCkpKzEsIEdGUF9LRVJORUwpOworCQlpZiAoZW50LT5kYXRhKSB7CisJCQlzdHJjcHkoKGNoYXIqKWVudC0+ZGF0YSxkZXN0KTsKKwkJCWlmIChwcm9jX3JlZ2lzdGVyKHBhcmVudCwgZW50KSA8IDApIHsKKwkJCQlrZnJlZShlbnQtPmRhdGEpOworCQkJCWtmcmVlKGVudCk7CisJCQkJZW50ID0gTlVMTDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWtmcmVlKGVudCk7CisJCQllbnQgPSBOVUxMOworCQl9CisJfQorCXJldHVybiBlbnQ7Cit9CisKK3N0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19ta2Rpcl9tb2RlKGNvbnN0IGNoYXIgKm5hbWUsIG1vZGVfdCBtb2RlLAorCQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBhcmVudCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudDsKKworCWVudCA9IHByb2NfY3JlYXRlKCZwYXJlbnQsIG5hbWUsIFNfSUZESVIgfCBtb2RlLCAyKTsKKwlpZiAoZW50KSB7CisJCWVudC0+cHJvY19mb3BzID0gJnByb2NfZGlyX29wZXJhdGlvbnM7CisJCWVudC0+cHJvY19pb3BzID0gJnByb2NfZGlyX2lub2RlX29wZXJhdGlvbnM7CisKKwkJaWYgKHByb2NfcmVnaXN0ZXIocGFyZW50LCBlbnQpIDwgMCkgeworCQkJa2ZyZWUoZW50KTsKKwkJCWVudCA9IE5VTEw7CisJCX0KKwl9CisJcmV0dXJuIGVudDsKK30KKworc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX21rZGlyKGNvbnN0IGNoYXIgKm5hbWUsCisJCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGFyZW50KQoreworCXJldHVybiBwcm9jX21rZGlyX21vZGUobmFtZSwgU19JUlVHTyB8IFNfSVhVR08sIHBhcmVudCk7Cit9CisKK3N0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqY3JlYXRlX3Byb2NfZW50cnkoY29uc3QgY2hhciAqbmFtZSwgbW9kZV90IG1vZGUsCisJCQkJCSBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBhcmVudCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudDsKKwlubGlua190IG5saW5rOworCisJaWYgKFNfSVNESVIobW9kZSkpIHsKKwkJaWYgKChtb2RlICYgU19JQUxMVUdPKSA9PSAwKQorCQkJbW9kZSB8PSBTX0lSVUdPIHwgU19JWFVHTzsKKwkJbmxpbmsgPSAyOworCX0gZWxzZSB7CisJCWlmICgobW9kZSAmIFNfSUZNVCkgPT0gMCkKKwkJCW1vZGUgfD0gU19JRlJFRzsKKwkJaWYgKChtb2RlICYgU19JQUxMVUdPKSA9PSAwKQorCQkJbW9kZSB8PSBTX0lSVUdPOworCQlubGluayA9IDE7CisJfQorCisJZW50ID0gcHJvY19jcmVhdGUoJnBhcmVudCxuYW1lLG1vZGUsbmxpbmspOworCWlmIChlbnQpIHsKKwkJaWYgKFNfSVNESVIobW9kZSkpIHsKKwkJCWVudC0+cHJvY19mb3BzID0gJnByb2NfZGlyX29wZXJhdGlvbnM7CisJCQllbnQtPnByb2NfaW9wcyA9ICZwcm9jX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCQl9CisJCWlmIChwcm9jX3JlZ2lzdGVyKHBhcmVudCwgZW50KSA8IDApIHsKKwkJCWtmcmVlKGVudCk7CisJCQllbnQgPSBOVUxMOworCQl9CisJfQorCXJldHVybiBlbnQ7Cit9CisKK3ZvaWQgZnJlZV9wcm9jX2VudHJ5KHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGUpCit7CisJdW5zaWduZWQgaW50IGlubyA9IGRlLT5sb3dfaW5vOworCisJaWYgKGlubyA8IFBST0NfRFlOQU1JQ19GSVJTVCkKKwkJcmV0dXJuOworCisJcmVsZWFzZV9pbm9kZV9udW1iZXIoaW5vKTsKKworCWlmIChTX0lTTE5LKGRlLT5tb2RlKSAmJiBkZS0+ZGF0YSkKKwkJa2ZyZWUoZGUtPmRhdGEpOworCWtmcmVlKGRlKTsKK30KKworLyoKKyAqIFJlbW92ZSBhIC9wcm9jIGVudHJ5IGFuZCBmcmVlIGl0IGlmIGl0J3Mgbm90IGN1cnJlbnRseSBpbiB1c2UuCisgKiBJZiBpdCBpcyBpbiB1c2UsIHdlIHNldCB0aGUgJ2RlbGV0ZWQnIGZsYWcuCisgKi8KK3ZvaWQgcmVtb3ZlX3Byb2NfZW50cnkoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwYXJlbnQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICoqcDsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlOworCWNvbnN0IGNoYXIgKmZuID0gbmFtZTsKKwlpbnQgbGVuOworCisJaWYgKCFwYXJlbnQgJiYgeGxhdGVfcHJvY19uYW1lKG5hbWUsICZwYXJlbnQsICZmbikgIT0gMCkKKwkJZ290byBvdXQ7CisJbGVuID0gc3RybGVuKGZuKTsKKwlmb3IgKHAgPSAmcGFyZW50LT5zdWJkaXI7ICpwOyBwPSYoKnApLT5uZXh0ICkgeworCQlpZiAoIXByb2NfbWF0Y2gobGVuLCBmbiwgKnApKQorCQkJY29udGludWU7CisJCWRlID0gKnA7CisJCSpwID0gZGUtPm5leHQ7CisJCWRlLT5uZXh0ID0gTlVMTDsKKwkJaWYgKFNfSVNESVIoZGUtPm1vZGUpKQorCQkJcGFyZW50LT5ubGluay0tOworCQlwcm9jX2tpbGxfaW5vZGVzKGRlKTsKKwkJZGUtPm5saW5rID0gMDsKKwkJV0FSTl9PTihkZS0+c3ViZGlyKTsKKwkJaWYgKCFhdG9taWNfcmVhZCgmZGUtPmNvdW50KSkKKwkJCWZyZWVfcHJvY19lbnRyeShkZSk7CisJCWVsc2UgeworCQkJZGUtPmRlbGV0ZWQgPSAxOworCQkJcHJpbnRrKCJyZW1vdmVfcHJvY19lbnRyeTogJXMvJXMgYnVzeSwgY291bnQ9JWRcbiIsCisJCQkJcGFyZW50LT5uYW1lLCBkZS0+bmFtZSwgYXRvbWljX3JlYWQoJmRlLT5jb3VudCkpOworCQl9CisJCWJyZWFrOworCX0KK291dDoKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9mcy9wcm9jL2lub2RlLWFsbG9jLnR4dCBiL2ZzL3Byb2MvaW5vZGUtYWxsb2MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MjEyZjkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wcm9jL2lub2RlLWFsbG9jLnR4dApAQCAtMCwwICsxLDE0IEBACitDdXJyZW50IGlub2RlIGFsbG9jYXRpb25zIGluIHRoZSBwcm9jLWZzIChoZXgtbnVtYmVycyk6CisKKyAgMDAwMDAwMDAJCXJlc2VydmVkCisgIDAwMDAwMDAxLTAwMDAwZmZmCXN0YXRpYyBlbnRyaWVzCShnb25lcnMpCisgICAgICAgMDAxCQlyb290LWlubworCisgIDAwMDAxMDAwLTAwMDAxZmZmCXVudXNlZAorICAwMDAxeHh4eC03ZmZmeHh4eAlwaWQtZGlyIGVudHJpZXMgZm9yIHBpZCAxLTdmZmYKKyAgODAwMDAwMDAtZWZmZmZmZmYJdW51c2VkCisgIGYwMDAwMDAwLWZmZmZmZmZmCWR5bmFtaWMgZW50cmllcworCitHb2FsOgorCWEpIG9uY2Ugd2UnbGwgc3BsaXQgdGhlIHRoaW5nIGludG8gc2V2ZXJhbCB2aXJ0dWFsIGZpbGVzeXN0ZW1zIHdlCisJd2lsbCBnZXQgcmlkIG9mIG1hZ2ljYWwgcmFuZ2VzIChhbmQgdGhpcyBmaWxlLCBCVFcpLgpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9pbm9kZS5jIGIvZnMvcHJvYy9pbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzM2MyODYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wcm9jL2lub2RlLmMKQEAgLTAsMCArMSwyMTggQEAKKy8qCisgKiAgbGludXgvZnMvcHJvYy9pbm9kZS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqLworCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbGltaXRzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworZXh0ZXJuIHZvaWQgZnJlZV9wcm9jX2VudHJ5KHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqKTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKiBkZV9nZXQoc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZSkKK3sKKwlpZiAoZGUpCisJCWF0b21pY19pbmMoJmRlLT5jb3VudCk7CisJcmV0dXJuIGRlOworfQorCisvKgorICogRGVjcmVtZW50cyB0aGUgdXNlIGNvdW50IGFuZCBjaGVja3MgZm9yIGRlZmVycmVkIGRlbGV0aW9uLgorICovCitzdGF0aWMgdm9pZCBkZV9wdXQoc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZSkKK3sKKwlpZiAoZGUpIHsJCisJCWxvY2tfa2VybmVsKCk7CQkKKwkJaWYgKCFhdG9taWNfcmVhZCgmZGUtPmNvdW50KSkgeworCQkJcHJpbnRrKCJkZV9wdXQ6IGVudHJ5ICVzIGFscmVhZHkgZnJlZSFcbiIsIGRlLT5uYW1lKTsKKwkJCXVubG9ja19rZXJuZWwoKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZkZS0+Y291bnQpKSB7CisJCQlpZiAoZGUtPmRlbGV0ZWQpIHsKKwkJCQlwcmludGsoImRlX3B1dDogZGVmZXJyZWQgZGVsZXRlIG9mICVzXG4iLAorCQkJCQlkZS0+bmFtZSk7CisJCQkJZnJlZV9wcm9jX2VudHJ5KGRlKTsKKwkJCX0KKwkJfQkJCisJCXVubG9ja19rZXJuZWwoKTsKKwl9Cit9CisKKy8qCisgKiBEZWNyZW1lbnQgdGhlIHVzZSBjb3VudCBvZiB0aGUgcHJvY19kaXJfZW50cnkuCisgKi8KK3N0YXRpYyB2b2lkIHByb2NfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKKworCS8qIExldCBnbyBvZiBhbnkgYXNzb2NpYXRlZCBwcm9jZXNzICovCisJdHNrID0gUFJPQ19JKGlub2RlKS0+dGFzazsKKwlpZiAodHNrKQorCQlwdXRfdGFza19zdHJ1Y3QodHNrKTsKKworCS8qIExldCBnbyBvZiBhbnkgYXNzb2NpYXRlZCBwcm9jIGRpcmVjdG9yeSBlbnRyeSAqLworCWRlID0gUFJPQ19JKGlub2RlKS0+cGRlOworCWlmIChkZSkgeworCQlpZiAoZGUtPm93bmVyKQorCQkJbW9kdWxlX3B1dChkZS0+b3duZXIpOworCQlkZV9wdXQoZGUpOworCX0KKwljbGVhcl9pbm9kZShpbm9kZSk7Cit9CisKK3N0cnVjdCB2ZnNtb3VudCAqcHJvY19tbnQ7CisKK3N0YXRpYyB2b2lkIHByb2NfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7Cit9CisKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKiBwcm9jX2lub2RlX2NhY2hlcDsKKworc3RhdGljIHN0cnVjdCBpbm9kZSAqcHJvY19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBwcm9jX2lub2RlICplaTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJZWkgPSAoc3RydWN0IHByb2NfaW5vZGUgKilrbWVtX2NhY2hlX2FsbG9jKHByb2NfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJaWYgKCFlaSkKKwkJcmV0dXJuIE5VTEw7CisJZWktPnRhc2sgPSBOVUxMOworCWVpLT50eXBlID0gMDsKKwllaS0+b3AucHJvY19nZXRfbGluayA9IE5VTEw7CisJZWktPnBkZSA9IE5VTEw7CisJaW5vZGUgPSAmZWktPnZmc19pbm9kZTsKKwlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CisJcmV0dXJuIGlub2RlOworfQorCitzdGF0aWMgdm9pZCBwcm9jX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlrbWVtX2NhY2hlX2ZyZWUocHJvY19pbm9kZV9jYWNoZXAsIFBST0NfSShpbm9kZSkpOworfQorCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBwcm9jX2lub2RlICplaSA9IChzdHJ1Y3QgcHJvY19pbm9kZSAqKSBmb287CisKKwlpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRll8U0xBQl9DVE9SX0NPTlNUUlVDVE9SKSkgPT0KKwkgICAgU0xBQl9DVE9SX0NPTlNUUlVDVE9SKQorCQlpbm9kZV9pbml0X29uY2UoJmVpLT52ZnNfaW5vZGUpOworfQorIAoraW50IF9faW5pdCBwcm9jX2luaXRfaW5vZGVjYWNoZSh2b2lkKQoreworCXByb2NfaW5vZGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoInByb2NfaW5vZGVfY2FjaGUiLAorCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgcHJvY19pbm9kZSksCisJCQkJCSAgICAgMCwgU0xBQl9SRUNMQUlNX0FDQ09VTlQsCisJCQkJCSAgICAgaW5pdF9vbmNlLCBOVUxMKTsKKwlpZiAocHJvY19pbm9kZV9jYWNoZXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19yZW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpCit7CisJKmZsYWdzIHw9IE1TX05PRElSQVRJTUU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBwcm9jX3NvcHMgPSB7IAorCS5hbGxvY19pbm9kZQk9IHByb2NfYWxsb2NfaW5vZGUsCisJLmRlc3Ryb3lfaW5vZGUJPSBwcm9jX2Rlc3Ryb3lfaW5vZGUsCisJLnJlYWRfaW5vZGUJPSBwcm9jX3JlYWRfaW5vZGUsCisJLmRyb3BfaW5vZGUJPSBnZW5lcmljX2RlbGV0ZV9pbm9kZSwKKwkuZGVsZXRlX2lub2RlCT0gcHJvY19kZWxldGVfaW5vZGUsCisJLnN0YXRmcwkJPSBzaW1wbGVfc3RhdGZzLAorCS5yZW1vdW50X2ZzCT0gcHJvY19yZW1vdW50LAorfTsKKworc3RydWN0IGlub2RlICpwcm9jX2dldF9pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBpbnQgaW5vLAorCQkJCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGUpCit7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisKKwkvKgorCSAqIEluY3JlbWVudCB0aGUgdXNlIGNvdW50IHNvIHRoZSBkaXIgZW50cnkgY2FuJ3QgZGlzYXBwZWFyLgorCSAqLworCWRlX2dldChkZSk7CisKKwlXQVJOX09OKGRlICYmIGRlLT5kZWxldGVkKTsKKworCWlub2RlID0gaWdldChzYiwgaW5vKTsKKwlpZiAoIWlub2RlKQorCQlnb3RvIG91dF9mYWlsOworCQorCVBST0NfSShpbm9kZSktPnBkZSA9IGRlOworCWlmIChkZSkgeworCQlpZiAoZGUtPm1vZGUpIHsKKwkJCWlub2RlLT5pX21vZGUgPSBkZS0+bW9kZTsKKwkJCWlub2RlLT5pX3VpZCA9IGRlLT51aWQ7CisJCQlpbm9kZS0+aV9naWQgPSBkZS0+Z2lkOworCQl9CisJCWlmIChkZS0+c2l6ZSkKKwkJCWlub2RlLT5pX3NpemUgPSBkZS0+c2l6ZTsKKwkJaWYgKGRlLT5ubGluaykKKwkJCWlub2RlLT5pX25saW5rID0gZGUtPm5saW5rOworCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KGRlLT5vd25lcikpCisJCQlnb3RvIG91dF9mYWlsOworCQlpZiAoZGUtPnByb2NfaW9wcykKKwkJCWlub2RlLT5pX29wID0gZGUtPnByb2NfaW9wczsKKwkJaWYgKGRlLT5wcm9jX2ZvcHMpCisJCQlpbm9kZS0+aV9mb3AgPSBkZS0+cHJvY19mb3BzOworCX0KKworb3V0OgorCXJldHVybiBpbm9kZTsKKworb3V0X2ZhaWw6CisJZGVfcHV0KGRlKTsKKwlnb3RvIG91dDsKK30JCQkKKworaW50IHByb2NfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHZvaWQgKmRhdGEsIGludCBzaWxlbnQpCit7CisJc3RydWN0IGlub2RlICogcm9vdF9pbm9kZTsKKworCXMtPnNfZmxhZ3MgfD0gTVNfTk9ESVJBVElNRTsKKwlzLT5zX2Jsb2Nrc2l6ZSA9IDEwMjQ7CisJcy0+c19ibG9ja3NpemVfYml0cyA9IDEwOworCXMtPnNfbWFnaWMgPSBQUk9DX1NVUEVSX01BR0lDOworCXMtPnNfb3AgPSAmcHJvY19zb3BzOworCXMtPnNfdGltZV9ncmFuID0gMTsKKwkKKwlyb290X2lub2RlID0gcHJvY19nZXRfaW5vZGUocywgUFJPQ19ST09UX0lOTywgJnByb2Nfcm9vdCk7CisJaWYgKCFyb290X2lub2RlKQorCQlnb3RvIG91dF9ub19yb290OworCS8qCisJICogRml4dXAgdGhlIHJvb3QgaW5vZGUncyBubGluayB2YWx1ZQorCSAqLworCXJvb3RfaW5vZGUtPmlfbmxpbmsgKz0gbnJfcHJvY2Vzc2VzKCk7CisJcm9vdF9pbm9kZS0+aV91aWQgPSAwOworCXJvb3RfaW5vZGUtPmlfZ2lkID0gMDsKKwlzLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdF9pbm9kZSk7CisJaWYgKCFzLT5zX3Jvb3QpCisJCWdvdG8gb3V0X25vX3Jvb3Q7CisJcmV0dXJuIDA7CisKK291dF9ub19yb290OgorCXByaW50aygicHJvY19yZWFkX3N1cGVyOiBnZXQgcm9vdCBpbm9kZSBmYWlsZWRcbiIpOworCWlwdXQocm9vdF9pbm9kZSk7CisJcmV0dXJuIC1FTk9NRU07Cit9CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9mcy9wcm9jL2ludGVybmFsLmggYi9mcy9wcm9jL2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U1NTE5OAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3Byb2MvaW50ZXJuYWwuaApAQCAtMCwwICsxLDQ4IEBACisvKiBpbnRlcm5hbC5oOiBpbnRlcm5hbCBwcm9jZnMgZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKworc3RydWN0IHZtYWxsb2NfaW5mbyB7CisJdW5zaWduZWQgbG9uZwl1c2VkOworCXVuc2lnbmVkIGxvbmcJbGFyZ2VzdF9jaHVuazsKK307CisKKyNpZmRlZiBDT05GSUdfTU1VCisjZGVmaW5lIFZNQUxMT0NfVE9UQUwgKFZNQUxMT0NfRU5EIC0gVk1BTExPQ19TVEFSVCkKK2V4dGVybiB2b2lkIGdldF92bWFsbG9jX2luZm8oc3RydWN0IHZtYWxsb2NfaW5mbyAqdm1pKTsKKyNlbHNlCisKKyNkZWZpbmUgVk1BTExPQ19UT1RBTCAwVUwKKyNkZWZpbmUgZ2V0X3ZtYWxsb2NfaW5mbyh2bWkpCQkJXAorZG8gewkJCQkJCVwKKwkodm1pKS0+dXNlZCA9IDA7CQkJXAorCSh2bWkpLT5sYXJnZXN0X2NodW5rID0gMDsJCVwKK30gd2hpbGUoMCkKKworI2VuZGlmCisKK2V4dGVybiB2b2lkIGNyZWF0ZV9zZXFfZW50cnkoY2hhciAqbmFtZSwgbW9kZV90IG1vZGUsIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmYpOworZXh0ZXJuIGludCBwcm9jX2V4ZV9saW5rKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICoqLCBzdHJ1Y3QgdmZzbW91bnQgKiopOworZXh0ZXJuIGludCBwcm9jX3RpZF9zdGF0KHN0cnVjdCB0YXNrX3N0cnVjdCAqLCAgY2hhciAqKTsKK2V4dGVybiBpbnQgcHJvY190Z2lkX3N0YXQoc3RydWN0IHRhc2tfc3RydWN0ICosIGNoYXIgKik7CitleHRlcm4gaW50IHByb2NfcGlkX3N0YXR1cyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwgY2hhciAqKTsKK2V4dGVybiBpbnQgcHJvY19waWRfc3RhdG0oc3RydWN0IHRhc2tfc3RydWN0ICosIGNoYXIgKik7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHRhc2tfc3RydWN0ICpwcm9jX3Rhc2soc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gUFJPQ19JKGlub2RlKS0+dGFzazsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJvY190eXBlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIFBST0NfSShpbm9kZSktPnR5cGU7Cit9CmRpZmYgLS1naXQgYS9mcy9wcm9jL2tjb3JlLmMgYi9mcy9wcm9jL2tjb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM3ZGE5OAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3Byb2Mva2NvcmUuYwpAQCAtMCwwICsxLDQwNCBAQAorLyoKKyAqCWZzL3Byb2Mva2NvcmUuYyBrZXJuZWwgRUxGIGNvcmUgZHVtcGVyCisgKgorICoJTW9kZWxsZWQgb24gZnMvZXhlYy5jOmFvdXRfY29yZV9kdW1wKCkKKyAqCUplcmVteSBGaXR6aGFyZGluZ2UgPGplcmVteUBzdy5vei5hdT4KKyAqCUVMRiB2ZXJzaW9uIHdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyA8RGF2aWQuSG93ZWxsc0BuZXhvci5jby51az4KKyAqCU1vZGlmaWVkIGFuZCBpbmNvcnBvcmF0ZWQgaW50byAyLjMueCBieSBUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkB2ZXJpdGFzLmNvbT4KKyAqCVN1cHBvcnQgdG8gZHVtcCB2bWFsbG9jJ2QgYXJlYXMgKEVMRiBvbmx5KSwgVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5AdmVyaXRhcy5jb20+CisgKglTYWZlIGFjY2Vzc2VzIHRvIHZtYWxsb2MvZGlyZWN0LW1hcHBlZCBkaXNjb250aWd1b3VzIGFyZWFzLCBLYW5vaiBTYXJjYXIgPGthbm9qQHNnaS5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9hLm91dC5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZmNvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCisKK3N0YXRpYyBpbnQgb3Blbl9rY29yZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCXJldHVybiBjYXBhYmxlKENBUF9TWVNfUkFXSU8pID8gMCA6IC1FUEVSTTsKK30KKworc3RhdGljIHNzaXplX3QgcmVhZF9rY29yZShzdHJ1Y3QgZmlsZSAqLCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2tjb3JlX29wZXJhdGlvbnMgPSB7CisJLnJlYWQJCT0gcmVhZF9rY29yZSwKKwkub3BlbgkJPSBvcGVuX2tjb3JlLAorfTsKKworI2lmbmRlZiBrY192YWRkcl90b19vZmZzZXQKKyNkZWZpbmUJa2NfdmFkZHJfdG9fb2Zmc2V0KHYpICgodikgLSBQQUdFX09GRlNFVCkKKyNlbmRpZgorI2lmbmRlZglrY19vZmZzZXRfdG9fdmFkZHIKKyNkZWZpbmUJa2Nfb2Zmc2V0X3RvX3ZhZGRyKG8pICgobykgKyBQQUdFX09GRlNFVCkKKyNlbmRpZgorCisjZGVmaW5lIHJvdW5kdXAoeCwgeSkgICgoKCh4KSsoKHkpLTEpKS8oeSkpKih5KSkKKworLyogQW4gRUxGIG5vdGUgaW4gbWVtb3J5ICovCitzdHJ1Y3QgbWVtZWxmbm90ZQoreworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IHR5cGU7CisJdW5zaWduZWQgaW50IGRhdGFzejsKKwl2b2lkICpkYXRhOworfTsKKworc3RhdGljIHN0cnVjdCBrY29yZV9saXN0ICprY2xpc3Q7CitzdGF0aWMgREVGSU5FX1JXTE9DSyhrY2xpc3RfbG9jayk7CisKK3ZvaWQKK2tjbGlzdF9hZGQoc3RydWN0IGtjb3JlX2xpc3QgKm5ldywgdm9pZCAqYWRkciwgc2l6ZV90IHNpemUpCit7CisJbmV3LT5hZGRyID0gKHVuc2lnbmVkIGxvbmcpYWRkcjsKKwluZXctPnNpemUgPSBzaXplOworCisJd3JpdGVfbG9jaygma2NsaXN0X2xvY2spOworCW5ldy0+bmV4dCA9IGtjbGlzdDsKKwlrY2xpc3QgPSBuZXc7CisJd3JpdGVfdW5sb2NrKCZrY2xpc3RfbG9jayk7Cit9CisKK3N0YXRpYyBzaXplX3QgZ2V0X2tjb3JlX3NpemUoaW50ICpucGhkciwgc2l6ZV90ICplbGZfYnVmbGVuKQoreworCXNpemVfdCB0cnksIHNpemU7CisJc3RydWN0IGtjb3JlX2xpc3QgKm07CisKKwkqbnBoZHIgPSAxOyAvKiBQVF9OT1RFICovCisJc2l6ZSA9IDA7CisKKwlmb3IgKG09a2NsaXN0OyBtOyBtPW0tPm5leHQpIHsKKwkJdHJ5ID0ga2NfdmFkZHJfdG9fb2Zmc2V0KChzaXplX3QpbS0+YWRkciArIG0tPnNpemUpOworCQlpZiAodHJ5ID4gc2l6ZSkKKwkJCXNpemUgPSB0cnk7CisJCSpucGhkciA9ICpucGhkciArIDE7CisJfQorCSplbGZfYnVmbGVuID0Jc2l6ZW9mKHN0cnVjdCBlbGZoZHIpICsgCisJCQkoKm5waGRyICsgMikqc2l6ZW9mKHN0cnVjdCBlbGZfcGhkcikgKyAKKwkJCTMgKiAoc2l6ZW9mKHN0cnVjdCBlbGZfbm90ZSkgKyA0KSArCisJCQlzaXplb2Yoc3RydWN0IGVsZl9wcnN0YXR1cykgKworCQkJc2l6ZW9mKHN0cnVjdCBlbGZfcHJwc2luZm8pICsKKwkJCXNpemVvZihzdHJ1Y3QgdGFza19zdHJ1Y3QpOworCSplbGZfYnVmbGVuID0gUEFHRV9BTElHTigqZWxmX2J1Zmxlbik7CisJcmV0dXJuIHNpemUgKyAqZWxmX2J1ZmxlbjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogZGV0ZXJtaW5lIHNpemUgb2YgRUxGIG5vdGUKKyAqLworc3RhdGljIGludCBub3Rlc2l6ZShzdHJ1Y3QgbWVtZWxmbm90ZSAqZW4pCit7CisJaW50IHN6OworCisJc3ogPSBzaXplb2Yoc3RydWN0IGVsZl9ub3RlKTsKKwlzeiArPSByb3VuZHVwKHN0cmxlbihlbi0+bmFtZSksIDQpOworCXN6ICs9IHJvdW5kdXAoZW4tPmRhdGFzeiwgNCk7CisKKwlyZXR1cm4gc3o7Cit9IC8qIGVuZCBub3Rlc2l6ZSgpICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBzdG9yZSBhIG5vdGUgaW4gdGhlIGhlYWRlciBidWZmZXIKKyAqLworc3RhdGljIGNoYXIgKnN0b3Jlbm90ZShzdHJ1Y3QgbWVtZWxmbm90ZSAqbWVuLCBjaGFyICpidWZwKQoreworCXN0cnVjdCBlbGZfbm90ZSBlbjsKKworI2RlZmluZSBEVU1QX1dSSVRFKGFkZHIsbnIpIGRvIHsgbWVtY3B5KGJ1ZnAsYWRkcixucik7IGJ1ZnAgKz0gbnI7IH0gd2hpbGUoMCkKKworCWVuLm5fbmFtZXN6ID0gc3RybGVuKG1lbi0+bmFtZSk7CisJZW4ubl9kZXNjc3ogPSBtZW4tPmRhdGFzejsKKwllbi5uX3R5cGUgPSBtZW4tPnR5cGU7CisKKwlEVU1QX1dSSVRFKCZlbiwgc2l6ZW9mKGVuKSk7CisJRFVNUF9XUklURShtZW4tPm5hbWUsIGVuLm5fbmFtZXN6KTsKKworCS8qIFhYWCAtIGNhc3QgZnJvbSBsb25nIGxvbmcgdG8gbG9uZyB0byBhdm9pZCBuZWVkIGZvciBsaWJnY2MuYSAqLworCWJ1ZnAgPSAoY2hhciopIHJvdW5kdXAoKHVuc2lnbmVkIGxvbmcpYnVmcCw0KTsKKwlEVU1QX1dSSVRFKG1lbi0+ZGF0YSwgbWVuLT5kYXRhc3opOworCWJ1ZnAgPSAoY2hhciopIHJvdW5kdXAoKHVuc2lnbmVkIGxvbmcpYnVmcCw0KTsKKworI3VuZGVmIERVTVBfV1JJVEUKKworCXJldHVybiBidWZwOworfSAvKiBlbmQgc3RvcmVub3RlKCkgKi8KKworLyoKKyAqIHN0b3JlIGFuIEVMRiBjb3JlZHVtcCBoZWFkZXIgaW4gdGhlIHN1cHBsaWVkIGJ1ZmZlcgorICogbnBoZHIgaXMgdGhlIG51bWJlciBvZiBlbGZfcGhkciB0byBpbnNlcnQKKyAqLworc3RhdGljIHZvaWQgZWxmX2tjb3JlX3N0b3JlX2hkcihjaGFyICpidWZwLCBpbnQgbnBoZHIsIGludCBkYXRhb2ZmKQoreworCXN0cnVjdCBlbGZfcHJzdGF0dXMgcHJzdGF0dXM7CS8qIE5UX1BSU1RBVFVTICovCisJc3RydWN0IGVsZl9wcnBzaW5mbyBwcnBzaW5mbzsJLyogTlRfUFJQU0lORk8gKi8KKwlzdHJ1Y3QgZWxmX3BoZHIgKm5oZHIsICpwaGRyOworCXN0cnVjdCBlbGZoZHIgKmVsZjsKKwlzdHJ1Y3QgbWVtZWxmbm90ZSBub3Rlc1szXTsKKwlvZmZfdCBvZmZzZXQgPSAwOworCXN0cnVjdCBrY29yZV9saXN0ICptOworCisJLyogc2V0dXAgRUxGIGhlYWRlciAqLworCWVsZiA9IChzdHJ1Y3QgZWxmaGRyICopIGJ1ZnA7CisJYnVmcCArPSBzaXplb2Yoc3RydWN0IGVsZmhkcik7CisJb2Zmc2V0ICs9IHNpemVvZihzdHJ1Y3QgZWxmaGRyKTsKKwltZW1jcHkoZWxmLT5lX2lkZW50LCBFTEZNQUcsIFNFTEZNQUcpOworCWVsZi0+ZV9pZGVudFtFSV9DTEFTU10JPSBFTEZfQ0xBU1M7CisJZWxmLT5lX2lkZW50W0VJX0RBVEFdCT0gRUxGX0RBVEE7CisJZWxmLT5lX2lkZW50W0VJX1ZFUlNJT05dPSBFVl9DVVJSRU5UOworCWVsZi0+ZV9pZGVudFtFSV9PU0FCSV0gPSBFTEZfT1NBQkk7CisJbWVtc2V0KGVsZi0+ZV9pZGVudCtFSV9QQUQsIDAsIEVJX05JREVOVC1FSV9QQUQpOworCWVsZi0+ZV90eXBlCT0gRVRfQ09SRTsKKwllbGYtPmVfbWFjaGluZQk9IEVMRl9BUkNIOworCWVsZi0+ZV92ZXJzaW9uCT0gRVZfQ1VSUkVOVDsKKwllbGYtPmVfZW50cnkJPSAwOworCWVsZi0+ZV9waG9mZgk9IHNpemVvZihzdHJ1Y3QgZWxmaGRyKTsKKwllbGYtPmVfc2hvZmYJPSAwOworI2lmIGRlZmluZWQoQ09ORklHX0g4MzAwKQorCWVsZi0+ZV9mbGFncwk9IEVMRl9GTEFHUzsKKyNlbHNlCisJZWxmLT5lX2ZsYWdzCT0gMDsKKyNlbmRpZgorCWVsZi0+ZV9laHNpemUJPSBzaXplb2Yoc3RydWN0IGVsZmhkcik7CisJZWxmLT5lX3BoZW50c2l6ZT0gc2l6ZW9mKHN0cnVjdCBlbGZfcGhkcik7CisJZWxmLT5lX3BobnVtCT0gbnBoZHI7CisJZWxmLT5lX3NoZW50c2l6ZT0gMDsKKwllbGYtPmVfc2hudW0JPSAwOworCWVsZi0+ZV9zaHN0cm5keAk9IDA7CisKKwkvKiBzZXR1cCBFTEYgUFRfTk9URSBwcm9ncmFtIGhlYWRlciAqLworCW5oZHIgPSAoc3RydWN0IGVsZl9waGRyICopIGJ1ZnA7CisJYnVmcCArPSBzaXplb2Yoc3RydWN0IGVsZl9waGRyKTsKKwlvZmZzZXQgKz0gc2l6ZW9mKHN0cnVjdCBlbGZfcGhkcik7CisJbmhkci0+cF90eXBlCT0gUFRfTk9URTsKKwluaGRyLT5wX29mZnNldAk9IDA7CisJbmhkci0+cF92YWRkcgk9IDA7CisJbmhkci0+cF9wYWRkcgk9IDA7CisJbmhkci0+cF9maWxlc3oJPSAwOworCW5oZHItPnBfbWVtc3oJPSAwOworCW5oZHItPnBfZmxhZ3MJPSAwOworCW5oZHItPnBfYWxpZ24JPSAwOworCisJLyogc2V0dXAgRUxGIFBUX0xPQUQgcHJvZ3JhbSBoZWFkZXIgZm9yIGV2ZXJ5IGFyZWEgKi8KKwlmb3IgKG09a2NsaXN0OyBtOyBtPW0tPm5leHQpIHsKKwkJcGhkciA9IChzdHJ1Y3QgZWxmX3BoZHIgKikgYnVmcDsKKwkJYnVmcCArPSBzaXplb2Yoc3RydWN0IGVsZl9waGRyKTsKKwkJb2Zmc2V0ICs9IHNpemVvZihzdHJ1Y3QgZWxmX3BoZHIpOworCisJCXBoZHItPnBfdHlwZQk9IFBUX0xPQUQ7CisJCXBoZHItPnBfZmxhZ3MJPSBQRl9SfFBGX1d8UEZfWDsKKwkJcGhkci0+cF9vZmZzZXQJPSBrY192YWRkcl90b19vZmZzZXQobS0+YWRkcikgKyBkYXRhb2ZmOworCQlwaGRyLT5wX3ZhZGRyCT0gKHNpemVfdCltLT5hZGRyOworCQlwaGRyLT5wX3BhZGRyCT0gMDsKKwkJcGhkci0+cF9maWxlc3oJPSBwaGRyLT5wX21lbXN6CT0gbS0+c2l6ZTsKKwkJcGhkci0+cF9hbGlnbgk9IFBBR0VfU0laRTsKKwl9CisKKwkvKgorCSAqIFNldCB1cCB0aGUgbm90ZXMgaW4gc2ltaWxhciBmb3JtIHRvIFNWUjQgY29yZSBkdW1wcyBtYWRlCisJICogd2l0aCBpbmZvIGZyb20gdGhlaXIgL3Byb2MuCisJICovCisJbmhkci0+cF9vZmZzZXQJPSBvZmZzZXQ7CisKKwkvKiBzZXQgdXAgdGhlIHByb2Nlc3Mgc3RhdHVzICovCisJbm90ZXNbMF0ubmFtZSA9ICJDT1JFIjsKKwlub3Rlc1swXS50eXBlID0gTlRfUFJTVEFUVVM7CisJbm90ZXNbMF0uZGF0YXN6ID0gc2l6ZW9mKHN0cnVjdCBlbGZfcHJzdGF0dXMpOworCW5vdGVzWzBdLmRhdGEgPSAmcHJzdGF0dXM7CisKKwltZW1zZXQoJnByc3RhdHVzLCAwLCBzaXplb2Yoc3RydWN0IGVsZl9wcnN0YXR1cykpOworCisJbmhkci0+cF9maWxlc3oJPSBub3Rlc2l6ZSgmbm90ZXNbMF0pOworCWJ1ZnAgPSBzdG9yZW5vdGUoJm5vdGVzWzBdLCBidWZwKTsKKworCS8qIHNldCB1cCB0aGUgcHJvY2VzcyBpbmZvICovCisJbm90ZXNbMV0ubmFtZQk9ICJDT1JFIjsKKwlub3Rlc1sxXS50eXBlCT0gTlRfUFJQU0lORk87CisJbm90ZXNbMV0uZGF0YXN6CT0gc2l6ZW9mKHN0cnVjdCBlbGZfcHJwc2luZm8pOworCW5vdGVzWzFdLmRhdGEJPSAmcHJwc2luZm87CisKKwltZW1zZXQoJnBycHNpbmZvLCAwLCBzaXplb2Yoc3RydWN0IGVsZl9wcnBzaW5mbykpOworCXBycHNpbmZvLnByX3N0YXRlCT0gMDsKKwlwcnBzaW5mby5wcl9zbmFtZQk9ICdSJzsKKwlwcnBzaW5mby5wcl96b21iCT0gMDsKKworCXN0cmNweShwcnBzaW5mby5wcl9mbmFtZSwgInZtbGludXgiKTsKKwlzdHJuY3B5KHBycHNpbmZvLnByX3BzYXJncywgc2F2ZWRfY29tbWFuZF9saW5lLCBFTEZfUFJBUkdTWik7CisKKwluaGRyLT5wX2ZpbGVzegkrPSBub3Rlc2l6ZSgmbm90ZXNbMV0pOworCWJ1ZnAgPSBzdG9yZW5vdGUoJm5vdGVzWzFdLCBidWZwKTsKKworCS8qIHNldCB1cCB0aGUgdGFzayBzdHJ1Y3R1cmUgKi8KKwlub3Rlc1syXS5uYW1lCT0gIkNPUkUiOworCW5vdGVzWzJdLnR5cGUJPSBOVF9UQVNLU1RSVUNUOworCW5vdGVzWzJdLmRhdGFzegk9IHNpemVvZihzdHJ1Y3QgdGFza19zdHJ1Y3QpOworCW5vdGVzWzJdLmRhdGEJPSBjdXJyZW50OworCisJbmhkci0+cF9maWxlc3oJKz0gbm90ZXNpemUoJm5vdGVzWzJdKTsKKwlidWZwID0gc3RvcmVub3RlKCZub3Rlc1syXSwgYnVmcCk7CisKK30gLyogZW5kIGVsZl9rY29yZV9zdG9yZV9oZHIoKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogcmVhZCBmcm9tIHRoZSBFTEYgaGVhZGVyIGFuZCB0aGVuIGtlcm5lbCBtZW1vcnkKKyAqLworc3RhdGljIHNzaXplX3QKK3JlYWRfa2NvcmUoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBidWZsZW4sIGxvZmZfdCAqZnBvcykKK3sKKwlzc2l6ZV90IGFjYyA9IDA7CisJc2l6ZV90IHNpemUsIHRzejsKKwlzaXplX3QgZWxmX2J1ZmxlbjsKKwlpbnQgbnBoZHI7CisJdW5zaWduZWQgbG9uZyBzdGFydDsKKworCXJlYWRfbG9jaygma2NsaXN0X2xvY2spOworCXByb2Nfcm9vdF9rY29yZS0+c2l6ZSA9IHNpemUgPSBnZXRfa2NvcmVfc2l6ZSgmbnBoZHIsICZlbGZfYnVmbGVuKTsKKwlpZiAoYnVmbGVuID09IDAgfHwgKmZwb3MgPj0gc2l6ZSkgeworCQlyZWFkX3VubG9jaygma2NsaXN0X2xvY2spOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiB0cmltIGJ1ZmxlbiB0byBub3QgZ28gYmV5b25kIEVPRiAqLworCWlmIChidWZsZW4gPiBzaXplIC0gKmZwb3MpCisJCWJ1ZmxlbiA9IHNpemUgLSAqZnBvczsKKworCS8qIGNvbnN0cnVjdCBhbiBFTEYgY29yZSBoZWFkZXIgaWYgd2UnbGwgbmVlZCBzb21lIG9mIGl0ICovCisJaWYgKCpmcG9zIDwgZWxmX2J1ZmxlbikgeworCQljaGFyICogZWxmX2J1ZjsKKworCQl0c3ogPSBlbGZfYnVmbGVuIC0gKmZwb3M7CisJCWlmIChidWZsZW4gPCB0c3opCisJCQl0c3ogPSBidWZsZW47CisJCWVsZl9idWYgPSBrbWFsbG9jKGVsZl9idWZsZW4sIEdGUF9BVE9NSUMpOworCQlpZiAoIWVsZl9idWYpIHsKKwkJCXJlYWRfdW5sb2NrKCZrY2xpc3RfbG9jayk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQltZW1zZXQoZWxmX2J1ZiwgMCwgZWxmX2J1Zmxlbik7CisJCWVsZl9rY29yZV9zdG9yZV9oZHIoZWxmX2J1ZiwgbnBoZHIsIGVsZl9idWZsZW4pOworCQlyZWFkX3VubG9jaygma2NsaXN0X2xvY2spOworCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgZWxmX2J1ZiArICpmcG9zLCB0c3opKSB7CisJCQlrZnJlZShlbGZfYnVmKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCWtmcmVlKGVsZl9idWYpOworCQlidWZsZW4gLT0gdHN6OworCQkqZnBvcyArPSB0c3o7CisJCWJ1ZmZlciArPSB0c3o7CisJCWFjYyArPSB0c3o7CisKKwkJLyogbGVhdmUgbm93IGlmIGZpbGxlZCBidWZmZXIgYWxyZWFkeSAqLworCQlpZiAoYnVmbGVuID09IDApCisJCQlyZXR1cm4gYWNjOworCX0gZWxzZQorCQlyZWFkX3VubG9jaygma2NsaXN0X2xvY2spOworCisJLyoKKwkgKiBDaGVjayB0byBzZWUgaWYgb3VyIGZpbGUgb2Zmc2V0IG1hdGNoZXMgd2l0aCBhbnkgb2YKKwkgKiB0aGUgYWRkcmVzc2VzIGluIHRoZSBlbGZfcGhkciBvbiBvdXIgbGlzdC4KKwkgKi8KKwlzdGFydCA9IGtjX29mZnNldF90b192YWRkcigqZnBvcyAtIGVsZl9idWZsZW4pOworCWlmICgodHN6ID0gKFBBR0VfU0laRSAtIChzdGFydCAmIH5QQUdFX01BU0spKSkgPiBidWZsZW4pCisJCXRzeiA9IGJ1ZmxlbjsKKwkJCisJd2hpbGUgKGJ1ZmxlbikgeworCQlzdHJ1Y3Qga2NvcmVfbGlzdCAqbTsKKworCQlyZWFkX2xvY2soJmtjbGlzdF9sb2NrKTsKKwkJZm9yIChtPWtjbGlzdDsgbTsgbT1tLT5uZXh0KSB7CisJCQlpZiAoc3RhcnQgPj0gbS0+YWRkciAmJiBzdGFydCA8IChtLT5hZGRyK20tPnNpemUpKQorCQkJCWJyZWFrOworCQl9CisJCXJlYWRfdW5sb2NrKCZrY2xpc3RfbG9jayk7CisKKwkJaWYgKG0gPT0gTlVMTCkgeworCQkJaWYgKGNsZWFyX3VzZXIoYnVmZmVyLCB0c3opKQorCQkJCXJldHVybiAtRUZBVUxUOworCQl9IGVsc2UgaWYgKChzdGFydCA+PSBWTUFMTE9DX1NUQVJUKSAmJiAoc3RhcnQgPCBWTUFMTE9DX0VORCkpIHsKKwkJCWNoYXIgKiBlbGZfYnVmOworCQkJc3RydWN0IHZtX3N0cnVjdCAqbTsKKwkJCXVuc2lnbmVkIGxvbmcgY3Vyc3RhcnQgPSBzdGFydDsKKwkJCXVuc2lnbmVkIGxvbmcgY3Vyc2l6ZSA9IHRzejsKKworCQkJZWxmX2J1ZiA9IGttYWxsb2ModHN6LCBHRlBfS0VSTkVMKTsKKwkJCWlmICghZWxmX2J1ZikKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCW1lbXNldChlbGZfYnVmLCAwLCB0c3opOworCisJCQlyZWFkX2xvY2soJnZtbGlzdF9sb2NrKTsKKwkJCWZvciAobT12bWxpc3Q7IG0gJiYgY3Vyc2l6ZTsgbT1tLT5uZXh0KSB7CisJCQkJdW5zaWduZWQgbG9uZyB2bXN0YXJ0OworCQkJCXVuc2lnbmVkIGxvbmcgdm1zaXplOworCQkJCXVuc2lnbmVkIGxvbmcgbXNpemUgPSBtLT5zaXplIC0gUEFHRV9TSVpFOworCisJCQkJaWYgKCgodW5zaWduZWQgbG9uZyltLT5hZGRyICsgbXNpemUpIDwgCisJCQkJCQkJCWN1cnN0YXJ0KQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoKHVuc2lnbmVkIGxvbmcpbS0+YWRkciA+IChjdXJzdGFydCArIAorCQkJCQkJCQljdXJzaXplKSkKKwkJCQkJYnJlYWs7CisJCQkJdm1zdGFydCA9IChjdXJzdGFydCA8ICh1bnNpZ25lZCBsb25nKW0tPmFkZHIgPyAKKwkJCQkJKHVuc2lnbmVkIGxvbmcpbS0+YWRkciA6IGN1cnN0YXJ0KTsKKwkJCQlpZiAoKCh1bnNpZ25lZCBsb25nKW0tPmFkZHIgKyBtc2l6ZSkgPiAKKwkJCQkJCQkoY3Vyc3RhcnQgKyBjdXJzaXplKSkKKwkJCQkJdm1zaXplID0gY3Vyc3RhcnQgKyBjdXJzaXplIC0gdm1zdGFydDsKKwkJCQllbHNlCisJCQkJCXZtc2l6ZSA9ICh1bnNpZ25lZCBsb25nKW0tPmFkZHIgKyAKKwkJCQkJCQltc2l6ZSAtIHZtc3RhcnQ7CisJCQkJY3Vyc3RhcnQgPSB2bXN0YXJ0ICsgdm1zaXplOworCQkJCWN1cnNpemUgLT0gdm1zaXplOworCQkJCS8qIGRvbid0IGR1bXAgaW9yZW1hcCdkIHN0dWZmISAoVEEpICovCisJCQkJaWYgKG0tPmZsYWdzICYgVk1fSU9SRU1BUCkKKwkJCQkJY29udGludWU7CisJCQkJbWVtY3B5KGVsZl9idWYgKyAodm1zdGFydCAtIHN0YXJ0KSwKKwkJCQkJKGNoYXIgKil2bXN0YXJ0LCB2bXNpemUpOworCQkJfQorCQkJcmVhZF91bmxvY2soJnZtbGlzdF9sb2NrKTsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBlbGZfYnVmLCB0c3opKSB7CisJCQkJa2ZyZWUoZWxmX2J1Zik7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCQlrZnJlZShlbGZfYnVmKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChrZXJuX2FkZHJfdmFsaWQoc3RhcnQpKSB7CisJCQkJdW5zaWduZWQgbG9uZyBuOworCisJCQkJbiA9IGNvcHlfdG9fdXNlcihidWZmZXIsIChjaGFyICopc3RhcnQsIHRzeik7CisJCQkJLyoKKwkJCQkgKiBXZSBjYW5ub3QgZGlzdGluZ3VzaCBiZXR3ZWVuIGZhdWx0IG9uIHNvdXJjZQorCQkJCSAqIGFuZCBmYXVsdCBvbiBkZXN0aW5hdGlvbi4gV2hlbiB0aGlzIGhhcHBlbnMKKwkJCQkgKiB3ZSBjbGVhciB0b28gYW5kIGhvcGUgaXQgd2lsbCB0cmlnZ2VyIHRoZQorCQkJCSAqIEVGQVVMVCBhZ2Fpbi4KKwkJCQkgKi8KKwkJCQlpZiAobikgeyAKKwkJCQkJaWYgKGNsZWFyX3VzZXIoYnVmZmVyICsgdHN6IC0gbiwKKwkJCQkJCQkJdHN6IC0gbikpCisJCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChjbGVhcl91c2VyKGJ1ZmZlciwgdHN6KSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCX0KKwkJYnVmbGVuIC09IHRzejsKKwkJKmZwb3MgKz0gdHN6OworCQlidWZmZXIgKz0gdHN6OworCQlhY2MgKz0gdHN6OworCQlzdGFydCArPSB0c3o7CisJCXRzeiA9IChidWZsZW4gPiBQQUdFX1NJWkUgPyBQQUdFX1NJWkUgOiBidWZsZW4pOworCX0KKworCXJldHVybiBhY2M7Cit9CmRpZmYgLS1naXQgYS9mcy9wcm9jL2ttc2cuYyBiL2ZzL3Byb2Mva21zZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZDM3YmYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wcm9jL2ttc2cuYwpAQCAtMCwwICsxLDU1IEBACisvKgorICogIGxpbnV4L2ZzL3Byb2Mva21zZy5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MiAgYnkgTGludXMgVG9ydmFsZHMKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorCitleHRlcm4gd2FpdF9xdWV1ZV9oZWFkX3QgbG9nX3dhaXQ7CisKK2V4dGVybiBpbnQgZG9fc3lzbG9nKGludCB0eXBlLCBjaGFyIF9fdXNlciAqYnVnLCBpbnQgY291bnQpOworCitzdGF0aWMgaW50IGttc2dfb3BlbihzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlKQoreworCXJldHVybiBkb19zeXNsb2coMSxOVUxMLDApOworfQorCitzdGF0aWMgaW50IGttc2dfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlKQoreworCSh2b2lkKSBkb19zeXNsb2coMCxOVUxMLDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBrbXNnX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgJiYgIWRvX3N5c2xvZyg5LCBOVUxMLCAwKSkKKwkJcmV0dXJuIC1FQUdBSU47CisJcmV0dXJuIGRvX3N5c2xvZygyLCBidWYsIGNvdW50KTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBrbXNnX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpCit7CisJcG9sbF93YWl0KGZpbGUsICZsb2dfd2FpdCwgd2FpdCk7CisJaWYgKGRvX3N5c2xvZyg5LCBOVUxMLCAwKSkKKwkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07CisJcmV0dXJuIDA7Cit9CisKKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2ttc2dfb3BlcmF0aW9ucyA9IHsKKwkucmVhZAkJPSBrbXNnX3JlYWQsCisJLnBvbGwJCT0ga21zZ19wb2xsLAorCS5vcGVuCQk9IGttc2dfb3BlbiwKKwkucmVsZWFzZQk9IGttc2dfcmVsZWFzZSwKK307CmRpZmYgLS1naXQgYS9mcy9wcm9jL21tdS5jIGIvZnMvcHJvYy9tbXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzA0MTAzCi0tLSAvZGV2L251bGwKKysrIGIvZnMvcHJvYy9tbXUuYwpAQCAtMCwwICsxLDY3IEBACisvKiBtbXUuYzogbW11IG1lbW9yeSBpbmZvIGZpbGVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tbXpvbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc3dhcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2h1Z2V0bGIuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS90bGIuaD4KKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit2b2lkIGdldF92bWFsbG9jX2luZm8oc3RydWN0IHZtYWxsb2NfaW5mbyAqdm1pKQoreworCXN0cnVjdCB2bV9zdHJ1Y3QgKnZtYTsKKwl1bnNpZ25lZCBsb25nIGZyZWVfYXJlYV9zaXplOworCXVuc2lnbmVkIGxvbmcgcHJldl9lbmQ7CisKKwl2bWktPnVzZWQgPSAwOworCisJaWYgKCF2bWxpc3QpIHsKKwkJdm1pLT5sYXJnZXN0X2NodW5rID0gVk1BTExPQ19UT1RBTDsKKwl9CisJZWxzZSB7CisJCXZtaS0+bGFyZ2VzdF9jaHVuayA9IDA7CisKKwkJcHJldl9lbmQgPSBWTUFMTE9DX1NUQVJUOworCisJCXJlYWRfbG9jaygmdm1saXN0X2xvY2spOworCisJCWZvciAodm1hID0gdm1saXN0OyB2bWE7IHZtYSA9IHZtYS0+bmV4dCkgeworCQkJdm1pLT51c2VkICs9IHZtYS0+c2l6ZTsKKworCQkJZnJlZV9hcmVhX3NpemUgPSAodW5zaWduZWQgbG9uZykgdm1hLT5hZGRyIC0gcHJldl9lbmQ7CisJCQlpZiAodm1pLT5sYXJnZXN0X2NodW5rIDwgZnJlZV9hcmVhX3NpemUpCisJCQkJdm1pLT5sYXJnZXN0X2NodW5rID0gZnJlZV9hcmVhX3NpemU7CisKKwkJCXByZXZfZW5kID0gdm1hLT5zaXplICsgKHVuc2lnbmVkIGxvbmcpIHZtYS0+YWRkcjsKKwkJfQorCisJCWlmIChWTUFMTE9DX0VORCAtIHByZXZfZW5kID4gdm1pLT5sYXJnZXN0X2NodW5rKQorCQkJdm1pLT5sYXJnZXN0X2NodW5rID0gVk1BTExPQ19FTkQgLSBwcmV2X2VuZDsKKworCQlyZWFkX3VubG9jaygmdm1saXN0X2xvY2spOworCX0KK30KZGlmZiAtLWdpdCBhL2ZzL3Byb2Mvbm9tbXUuYyBiL2ZzL3Byb2Mvbm9tbXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2JmMDE2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvcHJvYy9ub21tdS5jCkBAIC0wLDAgKzEsMTM1IEBACisvKiBub21tdS5jOiBtbXUtbGVzcyBtZW1vcnkgaW5mbyBmaWxlcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tbXpvbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc3dhcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2h1Z2V0bGIuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS90bGIuaD4KKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisvKgorICogZGlzcGxheSBhIGxpc3Qgb2YgYWxsIHRoZSBWTUFzIHRoZSBrZXJuZWwga25vd3MgYWJvdXQKKyAqIC0gbm9tbXUga2VybmFscyBoYXZlIGEgc2luZ2xlIGZsYXQgbGlzdAorICovCitzdGF0aWMgaW50IG5vbW11X3ZtYV9saXN0X3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hOworCXVuc2lnbmVkIGxvbmcgaW5vID0gMDsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlkZXZfdCBkZXYgPSAwOworCWludCBmbGFncywgbGVuOworCisJdm1hID0gcmJfZW50cnkoKHN0cnVjdCByYl9ub2RlICopIHYsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCwgdm1fcmIpOworCisJZmxhZ3MgPSB2bWEtPnZtX2ZsYWdzOworCWZpbGUgPSB2bWEtPnZtX2ZpbGU7CisKKwlpZiAoZmlsZSkgeworCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gdm1hLT52bV9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwkJZGV2ID0gaW5vZGUtPmlfc2ItPnNfZGV2OworCQlpbm8gPSBpbm9kZS0+aV9pbm87CisJfQorCisJc2VxX3ByaW50ZihtLAorCQkgICAiJTA4bHgtJTA4bHggJWMlYyVjJWMgJTA4bHggJTAyeDolMDJ4ICVsdSAlbiIsCisJCSAgIHZtYS0+dm1fc3RhcnQsCisJCSAgIHZtYS0+dm1fZW5kLAorCQkgICBmbGFncyAmIFZNX1JFQUQgPyAncicgOiAnLScsCisJCSAgIGZsYWdzICYgVk1fV1JJVEUgPyAndycgOiAnLScsCisJCSAgIGZsYWdzICYgVk1fRVhFQyA/ICd4JyA6ICctJywKKwkJICAgZmxhZ3MgJiBWTV9NQVlTSEFSRSA/IGZsYWdzICYgVk1fU0hBUkVEID8gJ1MnIDogJ3MnIDogJ3AnLAorCQkgICB2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQsCisJCSAgIE1BSk9SKGRldiksIE1JTk9SKGRldiksIGlubywgJmxlbik7CisKKwlpZiAoZmlsZSkgeworCQlsZW4gPSAyNSArIHNpemVvZih2b2lkICopICogNiAtIGxlbjsKKwkJaWYgKGxlbiA8IDEpCisJCQlsZW4gPSAxOworCQlzZXFfcHJpbnRmKG0sICIlKmMiLCBsZW4sICcgJyk7CisJCXNlcV9wYXRoKG0sIGZpbGUtPmZfdmZzbW50LCBmaWxlLT5mX2RlbnRyeSwgIiIpOworCX0KKworCXNlcV9wdXRjKG0sICdcbicpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCAqbm9tbXVfdm1hX2xpc3Rfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKl9wb3MpCit7CisJc3RydWN0IHJiX25vZGUgKl9yYjsKKwlsb2ZmX3QgcG9zID0gKl9wb3M7CisJdm9pZCAqbmV4dCA9IE5VTEw7CisKKwlkb3duX3JlYWQoJm5vbW11X3ZtYV9zZW0pOworCisJZm9yIChfcmIgPSByYl9maXJzdCgmbm9tbXVfdm1hX3RyZWUpOyBfcmI7IF9yYiA9IHJiX25leHQoX3JiKSkgeworCQlpZiAocG9zID09IDApIHsKKwkJCW5leHQgPSBfcmI7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBuZXh0OworfQorCitzdGF0aWMgdm9pZCBub21tdV92bWFfbGlzdF9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwl1cF9yZWFkKCZub21tdV92bWFfc2VtKTsKK30KKworc3RhdGljIHZvaWQgKm5vbW11X3ZtYV9saXN0X25leHQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwkoKnBvcykrKzsKKwlyZXR1cm4gcmJfbmV4dCgoc3RydWN0IHJiX25vZGUgKikgdik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcHJvY19ub21tdV92bWFfbGlzdF9zZXFvcCA9IHsKKwkuc3RhcnQJPSBub21tdV92bWFfbGlzdF9zdGFydCwKKwkubmV4dAk9IG5vbW11X3ZtYV9saXN0X25leHQsCisJLnN0b3AJPSBub21tdV92bWFfbGlzdF9zdG9wLAorCS5zaG93CT0gbm9tbXVfdm1hX2xpc3Rfc2hvdworfTsKKworc3RhdGljIGludCBwcm9jX25vbW11X3ZtYV9saXN0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZwcm9jX25vbW11X3ZtYV9saXN0X3NlcW9wKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19ub21tdV92bWFfbGlzdF9vcGVyYXRpb25zID0geworCS5vcGVuICAgID0gcHJvY19ub21tdV92bWFfbGlzdF9vcGVuLAorCS5yZWFkICAgID0gc2VxX3JlYWQsCisJLmxsc2VlayAgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHByb2Nfbm9tbXVfaW5pdCh2b2lkKQoreworCWNyZWF0ZV9zZXFfZW50cnkoIm1hcHMiLCBTX0lSVUdPLCAmcHJvY19ub21tdV92bWFfbGlzdF9vcGVyYXRpb25zKTsKKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX2luaXQocHJvY19ub21tdV9pbml0KTsKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvcHJvY19kZXZ0cmVlLmMgYi9mcy9wcm9jL3Byb2NfZGV2dHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NDIzYzYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wcm9jL3Byb2NfZGV2dHJlZS5jCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogcHJvY19kZXZ0cmVlLmMgLSBoYW5kbGVzIC9wcm9jL2RldmljZS10cmVlCisgKgorICogQ29weXJpZ2h0IDE5OTcgUGF1bCBNYWNrZXJyYXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaWZuZGVmIEhBVkVfQVJDSF9ERVZUUkVFX0ZJWFVQUworc3RhdGljIGlubGluZSB2b2lkIHNldF9ub2RlX3Byb2NfZW50cnkoc3RydWN0IGRldmljZV9ub2RlICpucCwgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpkZSkKK3sKK30KKworc3RhdGljIHZvaWQgaW5saW5lIHNldF9ub2RlX25hbWVfbGluayhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlKQoreworfQorCitzdGF0aWMgdm9pZCBpbmxpbmUgc2V0X25vZGVfYWRkcl9saW5rKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGUpCit7Cit9CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19kZXZpY2VfdHJlZTsKKworLyoKKyAqIFN1cHBseSBkYXRhIG9uIGEgcmVhZCBmcm9tIC9wcm9jL2RldmljZS10cmVlL25vZGUvcHJvcGVydHkuCisgKi8KK3N0YXRpYyBpbnQgcHJvcGVydHlfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJICAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnBwID0gZGF0YTsKKwlpbnQgbjsKKworCWlmIChvZmYgPj0gcHAtPmxlbmd0aCkgeworCQkqZW9mID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCW4gPSBwcC0+bGVuZ3RoIC0gb2ZmOworCWlmIChuID4gY291bnQpCisJCW4gPSBjb3VudDsKKwllbHNlCisJCSplb2YgPSAxOworCW1lbWNweShwYWdlLCBwcC0+dmFsdWUgKyBvZmYsIG4pOworCSpzdGFydCA9IHBhZ2U7CisJcmV0dXJuIG47Cit9CisKKy8qCisgKiBGb3IgYSBub2RlIHdpdGggYSBuYW1lIGxpa2UgImdjQDEwIiwgd2UgbWFrZSBzeW1saW5rcyBjYWxsZWQgImdjIgorICogYW5kICJAMTAiIHRvIGl0LgorICovCisKKy8qCisgKiBQcm9jZXNzIGEgbm9kZSwgYWRkaW5nIGVudHJpZXMgZm9yIGl0cyBjaGlsZHJlbiBhbmQgaXRzIHByb3BlcnRpZXMuCisgKi8KK3ZvaWQgcHJvY19kZXZpY2VfdHJlZV9hZGRfbm9kZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHA7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnQ7CisJc3RydWN0IGRldmljZV9ub2RlICpjaGlsZCwgKnNpYjsKKwljb25zdCBjaGFyICpwLCAqYXQ7CisJaW50IGw7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpsaXN0LCAqKmxhc3RwLCAqYWw7CisKKwlzZXRfbm9kZV9wcm9jX2VudHJ5KG5wLCBkZSk7CisJbGFzdHAgPSAmbGlzdDsKKwlmb3IgKHBwID0gbnAtPnByb3BlcnRpZXM7IHBwICE9IDA7IHBwID0gcHAtPm5leHQpIHsKKwkJLyoKKwkJICogVW5mb3J0dW5hdGVseSBwcm9jX3JlZ2lzdGVyIHB1dHMgZWFjaCBuZXcgZW50cnkKKwkJICogYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdC4gIFNvIHdlIHJlYXJyYW5nZSB0aGVtLgorCQkgKi8KKwkJZW50ID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeShwcC0+bmFtZSwgc3RybmNtcChwcC0+bmFtZSwgInNlY3VyaXR5LSIsIDkpID8KKwkJCQkJICAgICBTX0lSVUdPIDogU19JUlVTUiwgZGUsIHByb3BlcnR5X3JlYWRfcHJvYywgcHApOworCQlpZiAoZW50ID09IDApCisJCQlicmVhazsKKwkJaWYgKCFzdHJuY21wKHBwLT5uYW1lLCAic2VjdXJpdHktIiwgOSkpCisJCSAgICAgZW50LT5zaXplID0gMDsgLyogZG9uJ3QgbGVhayBudW1iZXIgb2YgcGFzc3dvcmQgY2hhcnMgKi8KKwkJZWxzZQorCQkgICAgIGVudC0+c2l6ZSA9IHBwLT5sZW5ndGg7CisJCSpsYXN0cCA9IGVudDsKKwkJbGFzdHAgPSAmZW50LT5uZXh0OworCX0KKwljaGlsZCA9IE5VTEw7CisJd2hpbGUgKChjaGlsZCA9IG9mX2dldF9uZXh0X2NoaWxkKG5wLCBjaGlsZCkpKSB7CisJCXAgPSBzdHJyY2hyKGNoaWxkLT5mdWxsX25hbWUsICcvJyk7CisJCWlmICghcCkKKwkJCXAgPSBjaGlsZC0+ZnVsbF9uYW1lOworCQllbHNlCisJCQkrK3A7CisJCS8qIGNob3Agb2ZmICdAMCcgaWYgdGhlIG5hbWUgZW5kcyB3aXRoIHRoYXQgKi8KKwkJbCA9IHN0cmxlbihwKTsKKwkJaWYgKGwgPiAyICYmIHBbbC0yXSA9PSAnQCcgJiYgcFtsLTFdID09ICcwJykKKwkJCWwgLT0gMjsKKwkJZW50ID0gcHJvY19ta2RpcihwLCBkZSk7CisJCWlmIChlbnQgPT0gMCkKKwkJCWJyZWFrOworCQkqbGFzdHAgPSBlbnQ7CisJCWxhc3RwID0gJmVudC0+bmV4dDsKKwkJcHJvY19kZXZpY2VfdHJlZV9hZGRfbm9kZShjaGlsZCwgZW50KTsKKworCQkvKgorCQkgKiBJZiB3ZSBsZWZ0IHRoZSBhZGRyZXNzIHBhcnQgb24gdGhlIG5hbWUsIGNvbnNpZGVyCisJCSAqIGFkZGluZyBzeW1saW5rcyBmcm9tIHRoZSBuYW1lIGFuZCBhZGRyZXNzIHBhcnRzLgorCQkgKi8KKwkJaWYgKHBbbF0gIT0gMCB8fCAoYXQgPSBzdHJjaHIocCwgJ0AnKSkgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIElmIHRoaXMgaXMgdGhlIGZpcnN0IG5vZGUgd2l0aCBhIGdpdmVuIG5hbWUgcHJvcGVydHksCisJCSAqIGFkZCBhIHN5bWxpbmsgd2l0aCB0aGUgbmFtZSBwcm9wZXJ0eSBhcyBpdHMgbmFtZS4KKwkJICovCisJCXNpYiA9IE5VTEw7CisJCXdoaWxlICgoc2liID0gb2ZfZ2V0X25leHRfY2hpbGQobnAsIHNpYikpICYmIHNpYiAhPSBjaGlsZCkKKwkJCWlmIChzaWItPm5hbWUgJiYgc3RyY21wKHNpYi0+bmFtZSwgY2hpbGQtPm5hbWUpID09IDApCisJCQkJYnJlYWs7CisJCWlmIChzaWIgPT0gY2hpbGQgJiYgc3RybmNtcChwLCBjaGlsZC0+bmFtZSwgbCkgIT0gMCkgeworCQkJYWwgPSBwcm9jX3N5bWxpbmsoY2hpbGQtPm5hbWUsIGRlLCBlbnQtPm5hbWUpOworCQkJaWYgKGFsID09IDApIHsKKwkJCQlvZl9ub2RlX3B1dChzaWIpOworCQkJCWJyZWFrOworCQkJfQorCQkJc2V0X25vZGVfbmFtZV9saW5rKGNoaWxkLCBhbCk7CisJCQkqbGFzdHAgPSBhbDsKKwkJCWxhc3RwID0gJmFsLT5uZXh0OworCQl9CisJCW9mX25vZGVfcHV0KHNpYik7CisJCS8qCisJCSAqIEFkZCBhbm90aGVyIGRpcmVjdG9yeSB3aXRoIHRoZSBAYWRkcmVzcyBwYXJ0IGFzIGl0cyBuYW1lLgorCQkgKi8KKwkJYWwgPSBwcm9jX3N5bWxpbmsoYXQsIGRlLCBlbnQtPm5hbWUpOworCQlpZiAoYWwgPT0gMCkKKwkJCWJyZWFrOworCQlzZXRfbm9kZV9hZGRyX2xpbmsoY2hpbGQsIGFsKTsKKwkJKmxhc3RwID0gYWw7CisJCWxhc3RwID0gJmFsLT5uZXh0OworCX0KKwlvZl9ub2RlX3B1dChjaGlsZCk7CisJKmxhc3RwID0gTlVMTDsKKwlkZS0+c3ViZGlyID0gbGlzdDsKK30KKworLyoKKyAqIENhbGxlZCBvbiBpbml0aWFsaXphdGlvbiB0byBzZXQgdXAgdGhlIC9wcm9jL2RldmljZS10cmVlIHN1YnRyZWUKKyAqLwordm9pZCBwcm9jX2RldmljZV90cmVlX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnJvb3Q7CisJaWYgKCAhaGF2ZV9vZiApCisJCXJldHVybjsKKwlwcm9jX2RldmljZV90cmVlID0gcHJvY19ta2RpcigiZGV2aWNlLXRyZWUiLCBOVUxMKTsKKwlpZiAocHJvY19kZXZpY2VfdHJlZSA9PSAwKQorCQlyZXR1cm47CisJcm9vdCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvIik7CisJaWYgKHJvb3QgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIi9wcm9jL2RldmljZS10cmVlOiBjYW4ndCBmaW5kIHJvb3RcbiIpOworCQlyZXR1cm47CisJfQorCXByb2NfZGV2aWNlX3RyZWVfYWRkX25vZGUocm9vdCwgcHJvY19kZXZpY2VfdHJlZSk7CisJb2Zfbm9kZV9wdXQocm9vdCk7Cit9CmRpZmYgLS1naXQgYS9mcy9wcm9jL3Byb2NfbWlzYy5jIGIvZnMvcHJvYy9wcm9jX21pc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDc1ZDZhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvcHJvYy9wcm9jX21pc2MuYwpAQCAtMCwwICsxLDYxNSBAQAorLyoKKyAqICBsaW51eC9mcy9wcm9jL3Byb2NfbWlzYy5jCisgKgorICogIGxpbnV4L2ZzL3Byb2MvYXJyYXkuYworICogIENvcHlyaWdodCAoQykgMTk5MiAgYnkgTGludXMgVG9ydmFsZHMKKyAqICBiYXNlZCBvbiBpZGVhcyBieSBEYXJyZW4gU2VubgorICoKKyAqICBUaGlzIHVzZWQgdG8gYmUgdGhlIHBhcnQgb2YgYXJyYXkuYy4gU2VlIHRoZSByZXN0IG9mIGhpc3RvcnkgYW5kIGNyZWRpdHMKKyAqICB0aGVyZS4gSSB0b29rIHRoaXMgaW50byBhIHNlcGFyYXRlIGZpbGUgYW5kIHN3aXRjaGVkIHRoZSB0aGluZyB0byBnZW5lcmljCisgKiAgcHJvY19maWxlX2lub2RlX29wZXJhdGlvbnMsIGxlYXZpbmcgaW4gYXJyYXkuYyBvbmx5IHBlci1wcm9jZXNzIHN0dWZmLgorICogIEludW1iZXJzIGFsbG9jYXRpb24gbWFkZSBkeW5hbWljICh2aWEgY3JlYXRlX3Byb2NfZW50cnkoKSkuICBBViwgTWF5IDE5OTkuCisgKgorICogQ2hhbmdlczoKKyAqIEZ1bHRvbiBHcmVlbiAgICAgIDogIEVuY2Fwc3VsYXRlZCBwb3NpdGlvbiBtZXRyaWMgY2FsY3VsYXRpb25zLgorICoJCQk8a2VybmVsQEZ1bHRvbkdyZWVuLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tbXpvbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc3dhcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWVzLmg+CisjaW5jbHVkZSA8bGludXgvcHJvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2h1Z2V0bGIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvc3lzcnEuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS90bGIuaD4KKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIExPQURfSU5UKHgpICgoeCkgPj4gRlNISUZUKQorI2RlZmluZSBMT0FEX0ZSQUMoeCkgTE9BRF9JTlQoKCh4KSAmIChGSVhFRF8xLTEpKSAqIDEwMCkKKy8qCisgKiBXYXJuaW5nOiBzdHVmZiBiZWxvdyAoaW1wb3J0ZWQgZnVuY3Rpb25zKSBhc3N1bWVzIHRoYXQgaXRzIG91dHB1dCB3aWxsIGZpdAorICogaW50byBvbmUgcGFnZS4gRm9yIHNvbWUgb2YgdGhvc2UgZnVuY3Rpb25zIGl0IG1heSBiZSB3cm9uZy4gTW9yZW92ZXIsIHdlCisgKiBoYXZlIGEgd2F5IHRvIGRlYWwgd2l0aCB0aGF0IGdyYWNlZnVsbHkuIFJpZ2h0IG5vdyBJIHVzZWQgc3RyYWlnaHRmb3J3YXJkCisgKiB3cmFwcGVycywgYnV0IHRoaXMgbmVlZHMgZnVydGhlciBhbmFseXNpcyB3cnQgcG90ZW50aWFsIG92ZXJmbG93cy4KKyAqLworZXh0ZXJuIGludCBnZXRfaGFyZHdhcmVfbGlzdChjaGFyICopOworZXh0ZXJuIGludCBnZXRfc3RyYW1fbGlzdChjaGFyICopOworZXh0ZXJuIGludCBnZXRfY2hyZGV2X2xpc3QoY2hhciAqKTsKK2V4dGVybiBpbnQgZ2V0X2ZpbGVzeXN0ZW1fbGlzdChjaGFyICopOworZXh0ZXJuIGludCBnZXRfZXhlY19kb21haW5fbGlzdChjaGFyICopOworZXh0ZXJuIGludCBnZXRfZG1hX2xpc3QoY2hhciAqKTsKK2V4dGVybiBpbnQgZ2V0X2xvY2tzX3N0YXR1cyAoY2hhciAqLCBjaGFyICoqLCBvZmZfdCwgaW50KTsKKworc3RhdGljIGludCBwcm9jX2NhbGNfbWV0cmljcyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKwkJCQkgaW50IGNvdW50LCBpbnQgKmVvZiwgaW50IGxlbikKK3sKKwlpZiAobGVuIDw9IG9mZitjb3VudCkgKmVvZiA9IDE7CisJKnN0YXJ0ID0gcGFnZSArIG9mZjsKKwlsZW4gLT0gb2ZmOworCWlmIChsZW4+Y291bnQpIGxlbiA9IGNvdW50OworCWlmIChsZW48MCkgbGVuID0gMDsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IGxvYWRhdmdfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJCSBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWludCBhLCBiLCBjOworCWludCBsZW47CisKKwlhID0gYXZlbnJ1blswXSArIChGSVhFRF8xLzIwMCk7CisJYiA9IGF2ZW5ydW5bMV0gKyAoRklYRURfMS8yMDApOworCWMgPSBhdmVucnVuWzJdICsgKEZJWEVEXzEvMjAwKTsKKwlsZW4gPSBzcHJpbnRmKHBhZ2UsIiVkLiUwMmQgJWQuJTAyZCAlZC4lMDJkICVsZC8lZCAlZFxuIiwKKwkJTE9BRF9JTlQoYSksIExPQURfRlJBQyhhKSwKKwkJTE9BRF9JTlQoYiksIExPQURfRlJBQyhiKSwKKwkJTE9BRF9JTlQoYyksIExPQURfRlJBQyhjKSwKKwkJbnJfcnVubmluZygpLCBucl90aHJlYWRzLCBsYXN0X3BpZCk7CisJcmV0dXJuIHByb2NfY2FsY19tZXRyaWNzKHBhZ2UsIHN0YXJ0LCBvZmYsIGNvdW50LCBlb2YsIGxlbik7Cit9CisKK3N0YXRpYyBpbnQgdXB0aW1lX3JlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKwkJCQkgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgdXB0aW1lOworCXN0cnVjdCB0aW1lc3BlYyBpZGxlOworCWludCBsZW47CisJY3B1dGltZV90IGlkbGV0aW1lID0gY3B1dGltZV9hZGQoaW5pdF90YXNrLnV0aW1lLCBpbml0X3Rhc2suc3RpbWUpOworCisJZG9fcG9zaXhfY2xvY2tfbW9ub3RvbmljX2dldHRpbWUoJnVwdGltZSk7CisJY3B1dGltZV90b190aW1lc3BlYyhpZGxldGltZSwgJmlkbGUpOworCWxlbiA9IHNwcmludGYocGFnZSwiJWx1LiUwMmx1ICVsdS4lMDJsdVxuIiwKKwkJCSh1bnNpZ25lZCBsb25nKSB1cHRpbWUudHZfc2VjLAorCQkJKHVwdGltZS50dl9uc2VjIC8gKE5TRUNfUEVSX1NFQyAvIDEwMCkpLAorCQkJKHVuc2lnbmVkIGxvbmcpIGlkbGUudHZfc2VjLAorCQkJKGlkbGUudHZfbnNlYyAvIChOU0VDX1BFUl9TRUMgLyAxMDApKSk7CisKKwlyZXR1cm4gcHJvY19jYWxjX21ldHJpY3MocGFnZSwgc3RhcnQsIG9mZiwgY291bnQsIGVvZiwgbGVuKTsKK30KKworc3RhdGljIGludCBtZW1pbmZvX3JlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKwkJCQkgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3lzaW5mbyBpOworCWludCBsZW47CisJc3RydWN0IHBhZ2Vfc3RhdGUgcHM7CisJdW5zaWduZWQgbG9uZyBpbmFjdGl2ZTsKKwl1bnNpZ25lZCBsb25nIGFjdGl2ZTsKKwl1bnNpZ25lZCBsb25nIGZyZWU7CisJdW5zaWduZWQgbG9uZyBjb21taXR0ZWQ7CisJdW5zaWduZWQgbG9uZyBhbGxvd2VkOworCXN0cnVjdCB2bWFsbG9jX2luZm8gdm1pOworCisJZ2V0X3BhZ2Vfc3RhdGUoJnBzKTsKKwlnZXRfem9uZV9jb3VudHMoJmFjdGl2ZSwgJmluYWN0aXZlLCAmZnJlZSk7CisKKy8qCisgKiBkaXNwbGF5IGluIGtpbG9ieXRlcy4KKyAqLworI2RlZmluZSBLKHgpICgoeCkgPDwgKFBBR0VfU0hJRlQgLSAxMCkpCisJc2lfbWVtaW5mbygmaSk7CisJc2lfc3dhcGluZm8oJmkpOworCWNvbW1pdHRlZCA9IGF0b21pY19yZWFkKCZ2bV9jb21taXR0ZWRfc3BhY2UpOworCWFsbG93ZWQgPSAoKHRvdGFscmFtX3BhZ2VzIC0gaHVnZXRsYl90b3RhbF9wYWdlcygpKQorCQkqIHN5c2N0bF9vdmVyY29tbWl0X3JhdGlvIC8gMTAwKSArIHRvdGFsX3N3YXBfcGFnZXM7CisKKwlnZXRfdm1hbGxvY19pbmZvKCZ2bWkpOworCisJLyoKKwkgKiBUYWdnZWQgZm9ybWF0LCBmb3IgZWFzeSBncmVwcGluZyBhbmQgZXhwYW5zaW9uLgorCSAqLworCWxlbiA9IHNwcmludGYocGFnZSwKKwkJIk1lbVRvdGFsOiAgICAgJThsdSBrQlxuIgorCQkiTWVtRnJlZTogICAgICAlOGx1IGtCXG4iCisJCSJCdWZmZXJzOiAgICAgICU4bHUga0JcbiIKKwkJIkNhY2hlZDogICAgICAgJThsdSBrQlxuIgorCQkiU3dhcENhY2hlZDogICAlOGx1IGtCXG4iCisJCSJBY3RpdmU6ICAgICAgICU4bHUga0JcbiIKKwkJIkluYWN0aXZlOiAgICAgJThsdSBrQlxuIgorCQkiSGlnaFRvdGFsOiAgICAlOGx1IGtCXG4iCisJCSJIaWdoRnJlZTogICAgICU4bHUga0JcbiIKKwkJIkxvd1RvdGFsOiAgICAgJThsdSBrQlxuIgorCQkiTG93RnJlZTogICAgICAlOGx1IGtCXG4iCisJCSJTd2FwVG90YWw6ICAgICU4bHUga0JcbiIKKwkJIlN3YXBGcmVlOiAgICAgJThsdSBrQlxuIgorCQkiRGlydHk6ICAgICAgICAlOGx1IGtCXG4iCisJCSJXcml0ZWJhY2s6ICAgICU4bHUga0JcbiIKKwkJIk1hcHBlZDogICAgICAgJThsdSBrQlxuIgorCQkiU2xhYjogICAgICAgICAlOGx1IGtCXG4iCisJCSJDb21taXRMaW1pdDogICU4bHUga0JcbiIKKwkJIkNvbW1pdHRlZF9BUzogJThsdSBrQlxuIgorCQkiUGFnZVRhYmxlczogICAlOGx1IGtCXG4iCisJCSJWbWFsbG9jVG90YWw6ICU4bHUga0JcbiIKKwkJIlZtYWxsb2NVc2VkOiAgJThsdSBrQlxuIgorCQkiVm1hbGxvY0NodW5rOiAlOGx1IGtCXG4iLAorCQlLKGkudG90YWxyYW0pLAorCQlLKGkuZnJlZXJhbSksCisJCUsoaS5idWZmZXJyYW0pLAorCQlLKGdldF9wYWdlX2NhY2hlX3NpemUoKS10b3RhbF9zd2FwY2FjaGVfcGFnZXMtaS5idWZmZXJyYW0pLAorCQlLKHRvdGFsX3N3YXBjYWNoZV9wYWdlcyksCisJCUsoYWN0aXZlKSwKKwkJSyhpbmFjdGl2ZSksCisJCUsoaS50b3RhbGhpZ2gpLAorCQlLKGkuZnJlZWhpZ2gpLAorCQlLKGkudG90YWxyYW0taS50b3RhbGhpZ2gpLAorCQlLKGkuZnJlZXJhbS1pLmZyZWVoaWdoKSwKKwkJSyhpLnRvdGFsc3dhcCksCisJCUsoaS5mcmVlc3dhcCksCisJCUsocHMubnJfZGlydHkpLAorCQlLKHBzLm5yX3dyaXRlYmFjayksCisJCUsocHMubnJfbWFwcGVkKSwKKwkJSyhwcy5ucl9zbGFiKSwKKwkJSyhhbGxvd2VkKSwKKwkJSyhjb21taXR0ZWQpLAorCQlLKHBzLm5yX3BhZ2VfdGFibGVfcGFnZXMpLAorCQkodW5zaWduZWQgbG9uZylWTUFMTE9DX1RPVEFMID4+IDEwLAorCQl2bWkudXNlZCA+PiAxMCwKKwkJdm1pLmxhcmdlc3RfY2h1bmsgPj4gMTAKKwkJKTsKKworCQlsZW4gKz0gaHVnZXRsYl9yZXBvcnRfbWVtaW5mbyhwYWdlICsgbGVuKTsKKworCXJldHVybiBwcm9jX2NhbGNfbWV0cmljcyhwYWdlLCBzdGFydCwgb2ZmLCBjb3VudCwgZW9mLCBsZW4pOworI3VuZGVmIEsKK30KKworZXh0ZXJuIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBmcmFnbWVudGF0aW9uX29wOworc3RhdGljIGludCBmcmFnbWVudGF0aW9uX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJKHZvaWQpaW5vZGU7CisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZmcmFnbWVudGF0aW9uX29wKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZnJhZ21lbnRhdGlvbl9maWxlX29wZXJhdGlvbnMgPSB7CisJLm9wZW4JCT0gZnJhZ21lbnRhdGlvbl9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IHZlcnNpb25fcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJCSBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWludCBsZW47CisKKwlzdHJjcHkocGFnZSwgbGludXhfYmFubmVyKTsKKwlsZW4gPSBzdHJsZW4ocGFnZSk7CisJcmV0dXJuIHByb2NfY2FsY19tZXRyaWNzKHBhZ2UsIHN0YXJ0LCBvZmYsIGNvdW50LCBlb2YsIGxlbik7Cit9CisKK2V4dGVybiBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgY3B1aW5mb19vcDsKK3N0YXRpYyBpbnQgY3B1aW5mb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmY3B1aW5mb19vcCk7Cit9CitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2NwdWluZm9fb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSBjcHVpbmZvX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzZXFfcmVsZWFzZSwKK307CisKK2V4dGVybiBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgdm1zdGF0X29wOworc3RhdGljIGludCB2bXN0YXRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJnZtc3RhdF9vcCk7Cit9CitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3Ztc3RhdF9maWxlX29wZXJhdGlvbnMgPSB7CisJLm9wZW4JCT0gdm1zdGF0X29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzZXFfcmVsZWFzZSwKK307CisKKyNpZmRlZiBDT05GSUdfUFJPQ19IQVJEV0FSRQorc3RhdGljIGludCBoYXJkd2FyZV9yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCQkJIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaW50IGxlbiA9IGdldF9oYXJkd2FyZV9saXN0KHBhZ2UpOworCXJldHVybiBwcm9jX2NhbGNfbWV0cmljcyhwYWdlLCBzdGFydCwgb2ZmLCBjb3VudCwgZW9mLCBsZW4pOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU1RSQU1fUFJPQworc3RhdGljIGludCBzdHJhbV9yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCQkJIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaW50IGxlbiA9IGdldF9zdHJhbV9saXN0KHBhZ2UpOworCXJldHVybiBwcm9jX2NhbGNfbWV0cmljcyhwYWdlLCBzdGFydCwgb2ZmLCBjb3VudCwgZW9mLCBsZW4pOworfQorI2VuZGlmCisKK2V4dGVybiBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgcGFydGl0aW9uc19vcDsKK3N0YXRpYyBpbnQgcGFydGl0aW9uc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmcGFydGl0aW9uc19vcCk7Cit9CitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3BhcnRpdGlvbnNfb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSBwYXJ0aXRpb25zX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzZXFfcmVsZWFzZSwKK307CisKK2V4dGVybiBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgZGlza3N0YXRzX29wOworc3RhdGljIGludCBkaXNrc3RhdHNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2VxX29wZW4oZmlsZSwgJmRpc2tzdGF0c19vcCk7Cit9CitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2Rpc2tzdGF0c19vcGVyYXRpb25zID0geworCS5vcGVuCQk9IGRpc2tzdGF0c19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCit9OworCisjaWZkZWYgQ09ORklHX01PRFVMRVMKK2V4dGVybiBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgbW9kdWxlc19vcDsKK3N0YXRpYyBpbnQgbW9kdWxlc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmbW9kdWxlc19vcCk7Cit9CitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX21vZHVsZXNfb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSBtb2R1bGVzX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzZXFfcmVsZWFzZSwKK307CisjZW5kaWYKKworZXh0ZXJuIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBzbGFiaW5mb19vcDsKK2V4dGVybiBzc2l6ZV90IHNsYWJpbmZvX3dyaXRlKHN0cnVjdCBmaWxlICosIGNvbnN0IGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICopOworc3RhdGljIGludCBzbGFiaW5mb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzZXFfb3BlbihmaWxlLCAmc2xhYmluZm9fb3ApOworfQorc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19zbGFiaW5mb19vcGVyYXRpb25zID0geworCS5vcGVuCQk9IHNsYWJpbmZvX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLndyaXRlCQk9IHNsYWJpbmZvX3dyaXRlLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IHNob3dfc3RhdChzdHJ1Y3Qgc2VxX2ZpbGUgKnAsIHZvaWQgKnYpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBqaWY7CisJY3B1dGltZTY0X3QgdXNlciwgbmljZSwgc3lzdGVtLCBpZGxlLCBpb3dhaXQsIGlycSwgc29mdGlycSwgc3RlYWw7CisJdTY0IHN1bSA9IDA7CisKKwl1c2VyID0gbmljZSA9IHN5c3RlbSA9IGlkbGUgPSBpb3dhaXQgPQorCQlpcnEgPSBzb2Z0aXJxID0gc3RlYWwgPSBjcHV0aW1lNjRfemVybzsKKwlqaWYgPSAtIHdhbGxfdG9fbW9ub3RvbmljLnR2X3NlYzsKKwlpZiAod2FsbF90b19tb25vdG9uaWMudHZfbnNlYykKKwkJLS1qaWY7CisKKwlmb3JfZWFjaF9jcHUoaSkgeworCQlpbnQgajsKKworCQl1c2VyID0gY3B1dGltZTY0X2FkZCh1c2VyLCBrc3RhdF9jcHUoaSkuY3B1c3RhdC51c2VyKTsKKwkJbmljZSA9IGNwdXRpbWU2NF9hZGQobmljZSwga3N0YXRfY3B1KGkpLmNwdXN0YXQubmljZSk7CisJCXN5c3RlbSA9IGNwdXRpbWU2NF9hZGQoc3lzdGVtLCBrc3RhdF9jcHUoaSkuY3B1c3RhdC5zeXN0ZW0pOworCQlpZGxlID0gY3B1dGltZTY0X2FkZChpZGxlLCBrc3RhdF9jcHUoaSkuY3B1c3RhdC5pZGxlKTsKKwkJaW93YWl0ID0gY3B1dGltZTY0X2FkZChpb3dhaXQsIGtzdGF0X2NwdShpKS5jcHVzdGF0Lmlvd2FpdCk7CisJCWlycSA9IGNwdXRpbWU2NF9hZGQoaXJxLCBrc3RhdF9jcHUoaSkuY3B1c3RhdC5pcnEpOworCQlzb2Z0aXJxID0gY3B1dGltZTY0X2FkZChzb2Z0aXJxLCBrc3RhdF9jcHUoaSkuY3B1c3RhdC5zb2Z0aXJxKTsKKwkJc3RlYWwgPSBjcHV0aW1lNjRfYWRkKHN0ZWFsLCBrc3RhdF9jcHUoaSkuY3B1c3RhdC5zdGVhbCk7CisJCWZvciAoaiA9IDAgOyBqIDwgTlJfSVJRUyA7IGorKykKKwkJCXN1bSArPSBrc3RhdF9jcHUoaSkuaXJxc1tqXTsKKwl9CisKKwlzZXFfcHJpbnRmKHAsICJjcHUgICVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdVxuIiwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyljcHV0aW1lNjRfdG9fY2xvY2tfdCh1c2VyKSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyljcHV0aW1lNjRfdG9fY2xvY2tfdChuaWNlKSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyljcHV0aW1lNjRfdG9fY2xvY2tfdChzeXN0ZW0pLAorCQkodW5zaWduZWQgbG9uZyBsb25nKWNwdXRpbWU2NF90b19jbG9ja190KGlkbGUpLAorCQkodW5zaWduZWQgbG9uZyBsb25nKWNwdXRpbWU2NF90b19jbG9ja190KGlvd2FpdCksCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpY3B1dGltZTY0X3RvX2Nsb2NrX3QoaXJxKSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyljcHV0aW1lNjRfdG9fY2xvY2tfdChzb2Z0aXJxKSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyljcHV0aW1lNjRfdG9fY2xvY2tfdChzdGVhbCkpOworCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgeworCisJCS8qIENvcHkgdmFsdWVzIGhlcmUgdG8gd29yayBhcm91bmQgZ2NjLTIuOTUuMywgZ2NjLTIuOTYgKi8KKwkJdXNlciA9IGtzdGF0X2NwdShpKS5jcHVzdGF0LnVzZXI7CisJCW5pY2UgPSBrc3RhdF9jcHUoaSkuY3B1c3RhdC5uaWNlOworCQlzeXN0ZW0gPSBrc3RhdF9jcHUoaSkuY3B1c3RhdC5zeXN0ZW07CisJCWlkbGUgPSBrc3RhdF9jcHUoaSkuY3B1c3RhdC5pZGxlOworCQlpb3dhaXQgPSBrc3RhdF9jcHUoaSkuY3B1c3RhdC5pb3dhaXQ7CisJCWlycSA9IGtzdGF0X2NwdShpKS5jcHVzdGF0LmlycTsKKwkJc29mdGlycSA9IGtzdGF0X2NwdShpKS5jcHVzdGF0LnNvZnRpcnE7CisJCXN0ZWFsID0ga3N0YXRfY3B1KGkpLmNwdXN0YXQuc3RlYWw7CisJCXNlcV9wcmludGYocCwgImNwdSVkICVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdVxuIiwKKwkJCWksCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWNwdXRpbWU2NF90b19jbG9ja190KHVzZXIpLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyljcHV0aW1lNjRfdG9fY2xvY2tfdChuaWNlKSwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpY3B1dGltZTY0X3RvX2Nsb2NrX3Qoc3lzdGVtKSwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpY3B1dGltZTY0X3RvX2Nsb2NrX3QoaWRsZSksCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWNwdXRpbWU2NF90b19jbG9ja190KGlvd2FpdCksCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWNwdXRpbWU2NF90b19jbG9ja190KGlycSksCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWNwdXRpbWU2NF90b19jbG9ja190KHNvZnRpcnEpLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyljcHV0aW1lNjRfdG9fY2xvY2tfdChzdGVhbCkpOworCX0KKwlzZXFfcHJpbnRmKHAsICJpbnRyICVsbHUiLCAodW5zaWduZWQgbG9uZyBsb25nKXN1bSk7CisKKyNpZiAhZGVmaW5lZChDT05GSUdfUFBDNjQpICYmICFkZWZpbmVkKENPTkZJR19BTFBIQSkKKwlmb3IgKGkgPSAwOyBpIDwgTlJfSVJRUzsgaSsrKQorCQlzZXFfcHJpbnRmKHAsICIgJXUiLCBrc3RhdF9pcnFzKGkpKTsKKyNlbmRpZgorCisJc2VxX3ByaW50ZihwLAorCQkiXG5jdHh0ICVsbHVcbiIKKwkJImJ0aW1lICVsdVxuIgorCQkicHJvY2Vzc2VzICVsdVxuIgorCQkicHJvY3NfcnVubmluZyAlbHVcbiIKKwkJInByb2NzX2Jsb2NrZWQgJWx1XG4iLAorCQlucl9jb250ZXh0X3N3aXRjaGVzKCksCisJCSh1bnNpZ25lZCBsb25nKWppZiwKKwkJdG90YWxfZm9ya3MsCisJCW5yX3J1bm5pbmcoKSwKKwkJbnJfaW93YWl0KCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RhdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXVuc2lnbmVkIHNpemUgPSA0MDk2ICogKDEgKyBudW1fcG9zc2libGVfY3B1cygpIC8gMzIpOworCWNoYXIgKmJ1ZjsKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKm07CisJaW50IHJlczsKKworCS8qIGRvbid0IGFzayBmb3IgbW9yZSB0aGFuIHRoZSBrbWFsbG9jKCkgbWF4IHNpemUsIGN1cnJlbnRseSAxMjggS0IgKi8KKwlpZiAoc2l6ZSA+IDEyOCAqIDEwMjQpCisJCXNpemUgPSAxMjggKiAxMDI0OworCWJ1ZiA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCisJcmVzID0gc2luZ2xlX29wZW4oZmlsZSwgc2hvd19zdGF0LCBOVUxMKTsKKwlpZiAoIXJlcykgeworCQltID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCQltLT5idWYgPSBidWY7CisJCW0tPnNpemUgPSBzaXplOworCX0gZWxzZQorCQlrZnJlZShidWYpOworCXJldHVybiByZXM7Cit9CitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3N0YXRfb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSBzdGF0X29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgZGV2aWNlc19yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCQkJIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaW50IGxlbiA9IGdldF9jaHJkZXZfbGlzdChwYWdlKTsKKwlsZW4gKz0gZ2V0X2Jsa2Rldl9saXN0KHBhZ2UrbGVuKTsKKwlyZXR1cm4gcHJvY19jYWxjX21ldHJpY3MocGFnZSwgc3RhcnQsIG9mZiwgY291bnQsIGVvZiwgbGVuKTsKK30KKworLyoKKyAqIC9wcm9jL2ludGVycnVwdHMKKyAqLworc3RhdGljIHZvaWQgKmludF9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpmLCBsb2ZmX3QgKnBvcykKK3sKKwlyZXR1cm4gKCpwb3MgPD0gTlJfSVJRUykgPyBwb3MgOiBOVUxMOworfQorCitzdGF0aWMgdm9pZCAqaW50X3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqZiwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJKCpwb3MpKys7CisJaWYgKCpwb3MgPiBOUl9JUlFTKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gcG9zOworfQorCitzdGF0aWMgdm9pZCBpbnRfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICp2KQoreworCS8qIE5vdGhpbmcgdG8gZG8gKi8KK30KKworCitleHRlcm4gaW50IHNob3dfaW50ZXJydXB0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKnYpOyAvKiBJbiBhcmNoIGNvZGUgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgaW50X3NlcV9vcHMgPSB7CisJLnN0YXJ0ID0gaW50X3NlcV9zdGFydCwKKwkubmV4dCAgPSBpbnRfc2VxX25leHQsCisJLnN0b3AgID0gaW50X3NlcV9zdG9wLAorCS5zaG93ICA9IHNob3dfaW50ZXJydXB0cworfTsKKworc3RhdGljIGludCBpbnRlcnJ1cHRzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJcmV0dXJuIHNlcV9vcGVuKGZpbHAsICZpbnRfc2VxX29wcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfaW50ZXJydXB0c19vcGVyYXRpb25zID0geworCS5vcGVuCQk9IGludGVycnVwdHNfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBmaWxlc3lzdGVtc19yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCQkJIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaW50IGxlbiA9IGdldF9maWxlc3lzdGVtX2xpc3QocGFnZSk7CisJcmV0dXJuIHByb2NfY2FsY19tZXRyaWNzKHBhZ2UsIHN0YXJ0LCBvZmYsIGNvdW50LCBlb2YsIGxlbik7Cit9CisKK3N0YXRpYyBpbnQgY21kbGluZV9yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCQkJIGludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaW50IGxlbjsKKworCWxlbiA9IHNwcmludGYocGFnZSwgIiVzXG4iLCBzYXZlZF9jb21tYW5kX2xpbmUpOworCXJldHVybiBwcm9jX2NhbGNfbWV0cmljcyhwYWdlLCBzdGFydCwgb2ZmLCBjb3VudCwgZW9mLCBsZW4pOworfQorCitzdGF0aWMgaW50IGxvY2tzX3JlYWRfcHJvYyhjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKwkJCQkgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgbGVuID0gZ2V0X2xvY2tzX3N0YXR1cyhwYWdlLCBzdGFydCwgb2ZmLCBjb3VudCk7CisKKwlpZiAobGVuIDwgY291bnQpCisJCSplb2YgPSAxOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgZXhlY2RvbWFpbnNfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJCSBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWludCBsZW4gPSBnZXRfZXhlY19kb21haW5fbGlzdChwYWdlKTsKKwlyZXR1cm4gcHJvY19jYWxjX21ldHJpY3MocGFnZSwgc3RhcnQsIG9mZiwgY291bnQsIGVvZiwgbGVuKTsKK30KKworI2lmZGVmIENPTkZJR19NQUdJQ19TWVNSUQorLyoKKyAqIHdyaXRpbmcgJ0MnIHRvIC9wcm9jL3N5c3JxLXRyaWdnZXIgaXMgbGlrZSBzeXNycS1DCisgKi8KK3N0YXRpYyBzc2l6ZV90IHdyaXRlX3N5c3JxX3RyaWdnZXIoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaWYgKGNvdW50KSB7CisJCWNoYXIgYzsKKworCQlpZiAoZ2V0X3VzZXIoYywgYnVmKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlfX2hhbmRsZV9zeXNycShjLCBOVUxMLCBOVUxMLCAwKTsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3N5c3JxX3RyaWdnZXJfb3BlcmF0aW9ucyA9IHsKKwkud3JpdGUJCT0gd3JpdGVfc3lzcnFfdHJpZ2dlciwKK307CisjZW5kaWYKKworc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX3Jvb3Rfa2NvcmU7CisKK3ZvaWQgY3JlYXRlX3NlcV9lbnRyeShjaGFyICpuYW1lLCBtb2RlX3QgbW9kZSwgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZikKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5OworCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkobmFtZSwgbW9kZSwgTlVMTCk7CisJaWYgKGVudHJ5KQorCQllbnRyeS0+cHJvY19mb3BzID0gZjsKK30KKwordm9pZCBfX2luaXQgcHJvY19taXNjX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudHJ5OworCXN0YXRpYyBzdHJ1Y3QgeworCQljaGFyICpuYW1lOworCQlpbnQgKCpyZWFkX3Byb2MpKGNoYXIqLGNoYXIqKixvZmZfdCxpbnQsaW50Kix2b2lkKik7CisJfSAqcCwgc2ltcGxlX29uZXNbXSA9IHsKKwkJeyJsb2FkYXZnIiwgICAgIGxvYWRhdmdfcmVhZF9wcm9jfSwKKwkJeyJ1cHRpbWUiLAl1cHRpbWVfcmVhZF9wcm9jfSwKKwkJeyJtZW1pbmZvIiwJbWVtaW5mb19yZWFkX3Byb2N9LAorCQl7InZlcnNpb24iLAl2ZXJzaW9uX3JlYWRfcHJvY30sCisjaWZkZWYgQ09ORklHX1BST0NfSEFSRFdBUkUKKwkJeyJoYXJkd2FyZSIsCWhhcmR3YXJlX3JlYWRfcHJvY30sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU1RSQU1fUFJPQworCQl7InN0cmFtIiwJc3RyYW1fcmVhZF9wcm9jfSwKKyNlbmRpZgorCQl7ImRldmljZXMiLAlkZXZpY2VzX3JlYWRfcHJvY30sCisJCXsiZmlsZXN5c3RlbXMiLAlmaWxlc3lzdGVtc19yZWFkX3Byb2N9LAorCQl7ImNtZGxpbmUiLAljbWRsaW5lX3JlYWRfcHJvY30sCisJCXsibG9ja3MiLAlsb2Nrc19yZWFkX3Byb2N9LAorCQl7ImV4ZWNkb21haW5zIiwJZXhlY2RvbWFpbnNfcmVhZF9wcm9jfSwKKwkJe05VTEwsfQorCX07CisJZm9yIChwID0gc2ltcGxlX29uZXM7IHAtPm5hbWU7IHArKykKKwkJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeShwLT5uYW1lLCAwLCBOVUxMLCBwLT5yZWFkX3Byb2MsIE5VTEwpOworCisJcHJvY19zeW1saW5rKCJtb3VudHMiLCBOVUxMLCAic2VsZi9tb3VudHMiKTsKKworCS8qIEFuZCBub3cgZm9yIHRyaWNraWVyIG9uZXMgKi8KKwllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJrbXNnIiwgU19JUlVTUiwgJnByb2Nfcm9vdCk7CisJaWYgKGVudHJ5KQorCQllbnRyeS0+cHJvY19mb3BzID0gJnByb2Nfa21zZ19vcGVyYXRpb25zOworCWNyZWF0ZV9zZXFfZW50cnkoImNwdWluZm8iLCAwLCAmcHJvY19jcHVpbmZvX29wZXJhdGlvbnMpOworCWNyZWF0ZV9zZXFfZW50cnkoInBhcnRpdGlvbnMiLCAwLCAmcHJvY19wYXJ0aXRpb25zX29wZXJhdGlvbnMpOworCWNyZWF0ZV9zZXFfZW50cnkoInN0YXQiLCAwLCAmcHJvY19zdGF0X29wZXJhdGlvbnMpOworCWNyZWF0ZV9zZXFfZW50cnkoImludGVycnVwdHMiLCAwLCAmcHJvY19pbnRlcnJ1cHRzX29wZXJhdGlvbnMpOworCWNyZWF0ZV9zZXFfZW50cnkoInNsYWJpbmZvIixTX0lXVVNSfFNfSVJVR08sJnByb2Nfc2xhYmluZm9fb3BlcmF0aW9ucyk7CisJY3JlYXRlX3NlcV9lbnRyeSgiYnVkZHlpbmZvIixTX0lSVUdPLCAmZnJhZ21lbnRhdGlvbl9maWxlX29wZXJhdGlvbnMpOworCWNyZWF0ZV9zZXFfZW50cnkoInZtc3RhdCIsU19JUlVHTywgJnByb2Nfdm1zdGF0X2ZpbGVfb3BlcmF0aW9ucyk7CisJY3JlYXRlX3NlcV9lbnRyeSgiZGlza3N0YXRzIiwgMCwgJnByb2NfZGlza3N0YXRzX29wZXJhdGlvbnMpOworI2lmZGVmIENPTkZJR19NT0RVTEVTCisJY3JlYXRlX3NlcV9lbnRyeSgibW9kdWxlcyIsIDAsICZwcm9jX21vZHVsZXNfb3BlcmF0aW9ucyk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0NIRURTVEFUUworCWNyZWF0ZV9zZXFfZW50cnkoInNjaGVkc3RhdCIsIDAsICZwcm9jX3NjaGVkc3RhdF9vcGVyYXRpb25zKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19QUk9DX0tDT1JFCisJcHJvY19yb290X2tjb3JlID0gY3JlYXRlX3Byb2NfZW50cnkoImtjb3JlIiwgU19JUlVTUiwgTlVMTCk7CisJaWYgKHByb2Nfcm9vdF9rY29yZSkgeworCQlwcm9jX3Jvb3Rfa2NvcmUtPnByb2NfZm9wcyA9ICZwcm9jX2tjb3JlX29wZXJhdGlvbnM7CisJCXByb2Nfcm9vdF9rY29yZS0+c2l6ZSA9CisJCQkJKHNpemVfdCloaWdoX21lbW9yeSAtIFBBR0VfT0ZGU0VUICsgUEFHRV9TSVpFOworCX0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19NQUdJQ19TWVNSUQorCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoInN5c3JxLXRyaWdnZXIiLCBTX0lXVVNSLCBOVUxMKTsKKwlpZiAoZW50cnkpCisJCWVudHJ5LT5wcm9jX2ZvcHMgPSAmcHJvY19zeXNycV90cmlnZ2VyX29wZXJhdGlvbnM7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUFBDMzIKKwl7CisJCWV4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBwY19odGFiX29wZXJhdGlvbnM7CisJCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoInBwY19odGFiIiwgU19JUlVHT3xTX0lXVVNSLCBOVUxMKTsKKwkJaWYgKGVudHJ5KQorCQkJZW50cnktPnByb2NfZm9wcyA9ICZwcGNfaHRhYl9vcGVyYXRpb25zOworCX0KKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9wcm9jX3R0eS5jIGIvZnMvcHJvYy9wcm9jX3R0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YzQ0NTUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9wcm9jL3Byb2NfdHR5LmMKQEAgLTAsMCArMSwyNDIgQEAKKy8qCisgKiBwcm9jX3R0eS5jIC0tIGhhbmRsZXMgL3Byb2MvdHR5CisgKgorICogQ29weXJpZ2h0IDE5OTcsIFRoZW9kb3JlIFRzJ28KKyAqLworCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKK3N0YXRpYyBpbnQgdHR5X2xkaXNjc19yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCisJCQkJaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSk7CisKKy8qCisgKiBUaGUgL3Byb2MvdHR5IGRpcmVjdG9yeSBpbm9kZXMuLi4KKyAqLworc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY190dHlfbGRpc2MsICpwcm9jX3R0eV9kcml2ZXI7CisKKy8qCisgKiBUaGlzIGlzIHRoZSBoYW5kbGVyIGZvciAvcHJvYy90dHkvZHJpdmVycworICovCitzdGF0aWMgdm9pZCBzaG93X3R0eV9yYW5nZShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCB0dHlfZHJpdmVyICpwLAorCWRldl90IGZyb20sIGludCBudW0pCit7CisJc2VxX3ByaW50ZihtLCAiJS0yMHMgIiwgcC0+ZHJpdmVyX25hbWUgPyBwLT5kcml2ZXJfbmFtZSA6ICJ1bmtub3duIik7CisJc2VxX3ByaW50ZihtLCAiL2Rldi8lLThzICIsIHAtPm5hbWUpOworCWlmIChwLT5udW0gPiAxKSB7CisJCXNlcV9wcmludGYobSwgIiUzZCAlZC0lZCAiLCBNQUpPUihmcm9tKSwgTUlOT1IoZnJvbSksCisJCQlNSU5PUihmcm9tKSArIG51bSAtIDEpOworCX0gZWxzZSB7CisJCXNlcV9wcmludGYobSwgIiUzZCAlN2QgIiwgTUFKT1IoZnJvbSksIE1JTk9SKGZyb20pKTsKKwl9CisJc3dpdGNoIChwLT50eXBlKSB7CisJY2FzZSBUVFlfRFJJVkVSX1RZUEVfU1lTVEVNOgorCQlzZXFfcHJpbnRmKG0sICJzeXN0ZW0iKTsKKwkJaWYgKHAtPnN1YnR5cGUgPT0gU1lTVEVNX1RZUEVfVFRZKQorCQkJc2VxX3ByaW50ZihtLCAiOi9kZXYvdHR5Iik7CisJCWVsc2UgaWYgKHAtPnN1YnR5cGUgPT0gU1lTVEVNX1RZUEVfU1lTQ09OUykKKwkJCXNlcV9wcmludGYobSwgIjpjb25zb2xlIik7CisJCWVsc2UgaWYgKHAtPnN1YnR5cGUgPT0gU1lTVEVNX1RZUEVfQ09OU09MRSkKKwkJCXNlcV9wcmludGYobSwgIjp2dG1hc3RlciIpOworCQlicmVhazsKKwljYXNlIFRUWV9EUklWRVJfVFlQRV9DT05TT0xFOgorCQlzZXFfcHJpbnRmKG0sICJjb25zb2xlIik7CisJCWJyZWFrOworCWNhc2UgVFRZX0RSSVZFUl9UWVBFX1NFUklBTDoKKwkJc2VxX3ByaW50ZihtLCAic2VyaWFsIik7CisJCWJyZWFrOworCWNhc2UgVFRZX0RSSVZFUl9UWVBFX1BUWToKKwkJaWYgKHAtPnN1YnR5cGUgPT0gUFRZX1RZUEVfTUFTVEVSKQorCQkJc2VxX3ByaW50ZihtLCAicHR5Om1hc3RlciIpOworCQllbHNlIGlmIChwLT5zdWJ0eXBlID09IFBUWV9UWVBFX1NMQVZFKQorCQkJc2VxX3ByaW50ZihtLCAicHR5OnNsYXZlIik7CisJCWVsc2UKKwkJCXNlcV9wcmludGYobSwgInB0eSIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzZXFfcHJpbnRmKG0sICJ0eXBlOiVkLiVkIiwgcC0+dHlwZSwgcC0+c3VidHlwZSk7CisJfQorCXNlcV9wdXRjKG0sICdcbicpOworfQorCitzdGF0aWMgaW50IHNob3dfdHR5X2RyaXZlcihzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJc3RydWN0IHR0eV9kcml2ZXIgKnAgPSB2OworCWRldl90IGZyb20gPSBNS0RFVihwLT5tYWpvciwgcC0+bWlub3Jfc3RhcnQpOworCWRldl90IHRvID0gZnJvbSArIHAtPm51bTsKKworCWlmICgmcC0+dHR5X2RyaXZlcnMgPT0gdHR5X2RyaXZlcnMubmV4dCkgeworCQkvKiBwc2V1ZG8tZHJpdmVycyBmaXJzdCAqLworCQlzZXFfcHJpbnRmKG0sICIlLTIwcyAvZGV2LyUtOHMgIiwgIi9kZXYvdHR5IiwgInR0eSIpOworCQlzZXFfcHJpbnRmKG0sICIlM2QgJTdkICIsIFRUWUFVWF9NQUpPUiwgMCk7CisJCXNlcV9wcmludGYobSwgInN5c3RlbTovZGV2L3R0eVxuIik7CisJCXNlcV9wcmludGYobSwgIiUtMjBzIC9kZXYvJS04cyAiLCAiL2Rldi9jb25zb2xlIiwgImNvbnNvbGUiKTsKKwkJc2VxX3ByaW50ZihtLCAiJTNkICU3ZCAiLCBUVFlBVVhfTUFKT1IsIDEpOworCQlzZXFfcHJpbnRmKG0sICJzeXN0ZW06Y29uc29sZVxuIik7CisjaWZkZWYgQ09ORklHX1VOSVg5OF9QVFlTCisJCXNlcV9wcmludGYobSwgIiUtMjBzIC9kZXYvJS04cyAiLCAiL2Rldi9wdG14IiwgInB0bXgiKTsKKwkJc2VxX3ByaW50ZihtLCAiJTNkICU3ZCAiLCBUVFlBVVhfTUFKT1IsIDIpOworCQlzZXFfcHJpbnRmKG0sICJzeXN0ZW1cbiIpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1ZUCisJCXNlcV9wcmludGYobSwgIiUtMjBzIC9kZXYvJS04cyAiLCAiL2Rldi92Yy8wIiwgInZjLzAiKTsKKwkJc2VxX3ByaW50ZihtLCAiJTNkICU3ZCAiLCBUVFlfTUFKT1IsIDApOworCQlzZXFfcHJpbnRmKG0sICJzeXN0ZW06dnRtYXN0ZXJcbiIpOworI2VuZGlmCisJfQorCisJd2hpbGUgKE1BSk9SKGZyb20pIDwgTUFKT1IodG8pKSB7CisJCWRldl90IG5leHQgPSBNS0RFVihNQUpPUihmcm9tKSsxLCAwKTsKKwkJc2hvd190dHlfcmFuZ2UobSwgcCwgZnJvbSwgbmV4dCAtIGZyb20pOworCQlmcm9tID0gbmV4dDsKKwl9CisJaWYgKGZyb20gIT0gdG8pCisJCXNob3dfdHR5X3JhbmdlKG0sIHAsIGZyb20sIHRvIC0gZnJvbSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIGl0ZXJhdG9yICovCitzdGF0aWMgdm9pZCAqdF9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJbG9mZl90IGwgPSAqcG9zOworCWxpc3RfZm9yX2VhY2gocCwgJnR0eV9kcml2ZXJzKQorCQlpZiAoIWwtLSkKKwkJCXJldHVybiBsaXN0X2VudHJ5KHAsIHN0cnVjdCB0dHlfZHJpdmVyLCB0dHlfZHJpdmVycyk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkICp0X25leHQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwID0gKChzdHJ1Y3QgdHR5X2RyaXZlciAqKXYpLT50dHlfZHJpdmVycy5uZXh0OworCSgqcG9zKSsrOworCXJldHVybiBwPT0mdHR5X2RyaXZlcnMgPyBOVUxMIDoKKwkJCWxpc3RfZW50cnkocCwgc3RydWN0IHR0eV9kcml2ZXIsIHR0eV9kcml2ZXJzKTsKK30KKworc3RhdGljIHZvaWQgdF9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyB0dHlfZHJpdmVyc19vcCA9IHsKKwkuc3RhcnQJPSB0X3N0YXJ0LAorCS5uZXh0CT0gdF9uZXh0LAorCS5zdG9wCT0gdF9zdG9wLAorCS5zaG93CT0gc2hvd190dHlfZHJpdmVyCit9OworCitzdGF0aWMgaW50IHR0eV9kcml2ZXJzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsICZ0dHlfZHJpdmVyc19vcCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfdHR5X2RyaXZlcnNfb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSB0dHlfZHJpdmVyc19vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCit9OworCisvKgorICogVGhpcyBpcyB0aGUgaGFuZGxlciBmb3IgL3Byb2MvdHR5L2xkaXNjcworICovCitzdGF0aWMgaW50IHR0eV9sZGlzY3NfcmVhZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJCWludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJaW50CWk7CisJaW50CWxlbiA9IDA7CisJb2ZmX3QJYmVnaW4gPSAwOworCXN0cnVjdCB0dHlfbGRpc2MgKmxkOworCQorCWZvciAoaT0wOyBpIDwgTlJfTERJU0NTOyBpKyspIHsKKwkJbGQgPSB0dHlfbGRpc2NfZ2V0KGkpOworCQlpZiAobGQgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlsZW4gKz0gc3ByaW50ZihwYWdlK2xlbiwgIiUtMTBzICUyZFxuIiwKKwkJCSAgICAgICBsZC0+bmFtZSA/IGxkLT5uYW1lIDogIj8/PyIsIGkpOworCQl0dHlfbGRpc2NfcHV0KGkpOworCQlpZiAobGVuK2JlZ2luID4gb2ZmK2NvdW50KQorCQkJYnJlYWs7CisJCWlmIChsZW4rYmVnaW4gPCBvZmYpIHsKKwkJCWJlZ2luICs9IGxlbjsKKwkJCWxlbiA9IDA7CisJCX0KKwl9CisJaWYgKGkgPj0gTlJfTERJU0NTKQorCQkqZW9mID0gMTsKKwlpZiAob2ZmID49IGxlbitiZWdpbikKKwkJcmV0dXJuIDA7CisJKnN0YXJ0ID0gcGFnZSArIChvZmYtYmVnaW4pOworCXJldHVybiAoKGNvdW50IDwgYmVnaW4rbGVuLW9mZikgPyBjb3VudCA6IGJlZ2luK2xlbi1vZmYpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdHR5X3JlZ2lzdGVyX2RyaXZlcigpIHRvIGhhbmRsZQorICogcmVnaXN0ZXJpbmcgdGhlIGRyaXZlcidzIC9wcm9jIGhhbmRsZXIgaW50byAvcHJvYy90dHkvZHJpdmVyLzxmb28+CisgKi8KK3ZvaWQgcHJvY190dHlfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnQ7CisJCQorCWlmICgoIWRyaXZlci0+cmVhZF9wcm9jICYmICFkcml2ZXItPndyaXRlX3Byb2MpIHx8CisJICAgICFkcml2ZXItPmRyaXZlcl9uYW1lIHx8CisJICAgIGRyaXZlci0+cHJvY19lbnRyeSkKKwkJcmV0dXJuOworCisJZW50ID0gY3JlYXRlX3Byb2NfZW50cnkoZHJpdmVyLT5kcml2ZXJfbmFtZSwgMCwgcHJvY190dHlfZHJpdmVyKTsKKwlpZiAoIWVudCkKKwkJcmV0dXJuOworCWVudC0+cmVhZF9wcm9jID0gZHJpdmVyLT5yZWFkX3Byb2M7CisJZW50LT53cml0ZV9wcm9jID0gZHJpdmVyLT53cml0ZV9wcm9jOworCWVudC0+b3duZXIgPSBkcml2ZXItPm93bmVyOworCWVudC0+ZGF0YSA9IGRyaXZlcjsKKworCWRyaXZlci0+cHJvY19lbnRyeSA9IGVudDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHR0eV91bnJlZ2lzdGVyX2RyaXZlcigpCisgKi8KK3ZvaWQgcHJvY190dHlfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHR0eV9kcml2ZXIgKmRyaXZlcikKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmVudDsKKworCWVudCA9IGRyaXZlci0+cHJvY19lbnRyeTsKKwlpZiAoIWVudCkKKwkJcmV0dXJuOworCQkKKwlyZW1vdmVfcHJvY19lbnRyeShkcml2ZXItPmRyaXZlcl9uYW1lLCBwcm9jX3R0eV9kcml2ZXIpOworCQorCWRyaXZlci0+cHJvY19lbnRyeSA9IE5VTEw7Cit9CisKKy8qCisgKiBDYWxsZWQgYnkgcHJvY19yb290X2luaXQoKSB0byBpbml0aWFsaXplIHRoZSAvcHJvYy90dHkgc3VidHJlZQorICovCit2b2lkIF9faW5pdCBwcm9jX3R0eV9pbml0KHZvaWQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeTsKKwlpZiAoIXByb2NfbWtkaXIoInR0eSIsIE5VTEwpKQorCQlyZXR1cm47CisJcHJvY190dHlfbGRpc2MgPSBwcm9jX21rZGlyKCJ0dHkvbGRpc2MiLCBOVUxMKTsKKwkvKgorCSAqIC9wcm9jL3R0eS9kcml2ZXIvc2VyaWFsIHJldmVhbHMgdGhlIGV4YWN0IGNoYXJhY3RlciBjb3VudHMgZm9yCisJICogc2VyaWFsIGxpbmtzIHdoaWNoIGlzIGp1c3QgdG9vIGVhc3kgdG8gYWJ1c2UgZm9yIGluZmVycmluZworCSAqIHBhc3N3b3JkIGxlbmd0aHMgYW5kIGludGVyLWtleXN0cm9rZSB0aW1pbmdzIGR1cmluZyBwYXNzd29yZAorCSAqIGVudHJ5LgorCSAqLworCXByb2NfdHR5X2RyaXZlciA9IHByb2NfbWtkaXJfbW9kZSgidHR5L2RyaXZlciIsIFNfSVJVU1IgfCBTX0lYVVNSLCBOVUxMKTsKKworCWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoInR0eS9sZGlzY3MiLCAwLCBOVUxMLCB0dHlfbGRpc2NzX3JlYWRfcHJvYywgTlVMTCk7CisJZW50cnkgPSBjcmVhdGVfcHJvY19lbnRyeSgidHR5L2RyaXZlcnMiLCAwLCBOVUxMKTsKKwlpZiAoZW50cnkpCisJCWVudHJ5LT5wcm9jX2ZvcHMgPSAmcHJvY190dHlfZHJpdmVyc19vcGVyYXRpb25zOworfQpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9yb290LmMgYi9mcy9wcm9jL3Jvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWYxNDhmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvcHJvYy9yb290LmMKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiAgbGludXgvZnMvcHJvYy9yb290LmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyIExpbnVzIFRvcnZhbGRzCisgKgorICogIHByb2Mgcm9vdCBkaXJlY3RvcnkgaGFuZGxpbmcgZnVuY3Rpb25zCisgKi8KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCitzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfbmV0LCAqcHJvY19uZXRfc3RhdCwgKnByb2NfYnVzLCAqcHJvY19yb290X2ZzLCAqcHJvY19yb290X2RyaXZlcjsKKworI2lmZGVmIENPTkZJR19TWVNDVEwKK3N0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19zeXNfcm9vdDsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpwcm9jX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoreworCXJldHVybiBnZXRfc2Jfc2luZ2xlKGZzX3R5cGUsIGZsYWdzLCBkYXRhLCBwcm9jX2ZpbGxfc3VwZXIpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgcHJvY19mc190eXBlID0geworCS5uYW1lCQk9ICJwcm9jIiwKKwkuZ2V0X3NiCQk9IHByb2NfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9hbm9uX3N1cGVyLAorfTsKKworZXh0ZXJuIGludCBfX2luaXQgcHJvY19pbml0X2lub2RlY2FjaGUodm9pZCk7Cit2b2lkIF9faW5pdCBwcm9jX3Jvb3RfaW5pdCh2b2lkKQoreworCWludCBlcnIgPSBwcm9jX2luaXRfaW5vZGVjYWNoZSgpOworCWlmIChlcnIpCisJCXJldHVybjsKKwllcnIgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZwcm9jX2ZzX3R5cGUpOworCWlmIChlcnIpCisJCXJldHVybjsKKwlwcm9jX21udCA9IGtlcm5fbW91bnQoJnByb2NfZnNfdHlwZSk7CisJZXJyID0gUFRSX0VSUihwcm9jX21udCk7CisJaWYgKElTX0VSUihwcm9jX21udCkpIHsKKwkJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZwcm9jX2ZzX3R5cGUpOworCQlyZXR1cm47CisJfQorCXByb2NfbWlzY19pbml0KCk7CisJcHJvY19uZXQgPSBwcm9jX21rZGlyKCJuZXQiLCBOVUxMKTsKKwlwcm9jX25ldF9zdGF0ID0gcHJvY19ta2RpcigibmV0L3N0YXQiLCBOVUxMKTsKKworI2lmZGVmIENPTkZJR19TWVNWSVBDCisJcHJvY19ta2Rpcigic3lzdmlwYyIsIE5VTEwpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1NZU0NUTAorCXByb2Nfc3lzX3Jvb3QgPSBwcm9jX21rZGlyKCJzeXMiLCBOVUxMKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0JJTkZNVF9NSVNDKSB8fCBkZWZpbmVkKENPTkZJR19CSU5GTVRfTUlTQ19NT0RVTEUpCisJcHJvY19ta2Rpcigic3lzL2ZzIiwgTlVMTCk7CisJcHJvY19ta2Rpcigic3lzL2ZzL2JpbmZtdF9taXNjIiwgTlVMTCk7CisjZW5kaWYKKwlwcm9jX3Jvb3RfZnMgPSBwcm9jX21rZGlyKCJmcyIsIE5VTEwpOworCXByb2Nfcm9vdF9kcml2ZXIgPSBwcm9jX21rZGlyKCJkcml2ZXIiLCBOVUxMKTsKKwlwcm9jX21rZGlyKCJmcy9uZnNkIiwgTlVMTCk7IC8qIHNvbWV3aGVyZSBmb3IgdGhlIG5mc2QgZmlsZXN5c3RlbSB0byBiZSBtb3VudGVkICovCisjaWYgZGVmaW5lZChDT05GSUdfU1VOX09QRU5QUk9NRlMpIHx8IGRlZmluZWQoQ09ORklHX1NVTl9PUEVOUFJPTUZTX01PRFVMRSkKKwkvKiBqdXN0IGdpdmUgaXQgYSBtb3VudHBvaW50ICovCisJcHJvY19ta2Rpcigib3BlbnByb20iLCBOVUxMKTsKKyNlbmRpZgorCXByb2NfdHR5X2luaXQoKTsKKyNpZmRlZiBDT05GSUdfUFJPQ19ERVZJQ0VUUkVFCisJcHJvY19kZXZpY2VfdHJlZV9pbml0KCk7CisjZW5kaWYKKwlwcm9jX2J1cyA9IHByb2NfbWtkaXIoImJ1cyIsIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqcHJvY19yb290X2xvb2t1cChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCS8qCisJICogbnJfdGhyZWFkcyBpcyBhY3R1YWxseSBwcm90ZWN0ZWQgYnkgdGhlIHRhc2tsaXN0X2xvY2s7CisJICogaG93ZXZlciwgaXQncyBjb252ZW50aW9uYWwgdG8gZG8gcmVhZHMsIGVzcGVjaWFsbHkgZm9yCisJICogcmVwb3J0aW5nLCB3aXRob3V0IGFueSBsb2NraW5nIHdoYXRzb2V2ZXIuCisJICovCisJaWYgKGRpci0+aV9pbm8gPT0gUFJPQ19ST09UX0lOTykgLyogY2hlY2sgZm9yIHNhZmV0eS4uLiAqLworCQlkaXItPmlfbmxpbmsgPSBwcm9jX3Jvb3QubmxpbmsgKyBucl90aHJlYWRzOworCisJaWYgKCFwcm9jX2xvb2t1cChkaXIsIGRlbnRyeSwgbmQpKSB7CisJCXJldHVybiBOVUxMOworCX0KKwkKKwlyZXR1cm4gcHJvY19waWRfbG9va3VwKGRpciwgZGVudHJ5LCBuZCk7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19yb290X3JlYWRkaXIoc3RydWN0IGZpbGUgKiBmaWxwLAorCXZvaWQgKiBkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCXVuc2lnbmVkIGludCBuciA9IGZpbHAtPmZfcG9zOworCWludCByZXQ7CisKKwlsb2NrX2tlcm5lbCgpOworCisJaWYgKG5yIDwgRklSU1RfUFJPQ0VTU19FTlRSWSkgeworCQlpbnQgZXJyb3IgPSBwcm9jX3JlYWRkaXIoZmlscCwgZGlyZW50LCBmaWxsZGlyKTsKKwkJaWYgKGVycm9yIDw9IDApIHsKKwkJCXVubG9ja19rZXJuZWwoKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQlmaWxwLT5mX3BvcyA9IEZJUlNUX1BST0NFU1NfRU5UUlk7CisJfQorCXVubG9ja19rZXJuZWwoKTsKKworCXJldCA9IHByb2NfcGlkX3JlYWRkaXIoZmlscCwgZGlyZW50LCBmaWxsZGlyKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogVGhlIHJvb3QgL3Byb2MgZGlyZWN0b3J5IGlzIHNwZWNpYWwsIGFzIGl0IGhhcyB0aGUKKyAqIDxwaWQ+IGRpcmVjdG9yaWVzLiBUaHVzIHdlIGRvbid0IHVzZSB0aGUgZ2VuZXJpYworICogZGlyZWN0b3J5IGhhbmRsaW5nIGZ1bmN0aW9ucyBmb3IgdGhhdC4uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2Nfcm9vdF9vcGVyYXRpb25zID0geworCS5yZWFkCQkgPSBnZW5lcmljX3JlYWRfZGlyLAorCS5yZWFkZGlyCSA9IHByb2Nfcm9vdF9yZWFkZGlyLAorfTsKKworLyoKKyAqIHByb2Mgcm9vdCBjYW4gZG8gYWxtb3N0IG5vdGhpbmcuLgorICovCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcHJvY19yb290X2lub2RlX29wZXJhdGlvbnMgPSB7CisJLmxvb2t1cAkJPSBwcm9jX3Jvb3RfbG9va3VwLAorfTsKKworLyoKKyAqIFRoaXMgaXMgdGhlIHJvb3QgImlub2RlIiBpbiB0aGUgL3Byb2MgdHJlZS4uCisgKi8KK3N0cnVjdCBwcm9jX2Rpcl9lbnRyeSBwcm9jX3Jvb3QgPSB7CisJLmxvd19pbm8JPSBQUk9DX1JPT1RfSU5PLCAKKwkubmFtZWxlbgk9IDUsIAorCS5uYW1lCQk9ICIvcHJvYyIsCisJLm1vZGUJCT0gU19JRkRJUiB8IFNfSVJVR08gfCBTX0lYVUdPLCAKKwkubmxpbmsJCT0gMiwgCisJLnByb2NfaW9wcwk9ICZwcm9jX3Jvb3RfaW5vZGVfb3BlcmF0aW9ucywgCisJLnByb2NfZm9wcwk9ICZwcm9jX3Jvb3Rfb3BlcmF0aW9ucywKKwkucGFyZW50CQk9ICZwcm9jX3Jvb3QsCit9OworCitFWFBPUlRfU1lNQk9MKHByb2Nfc3ltbGluayk7CitFWFBPUlRfU1lNQk9MKHByb2NfbWtkaXIpOworRVhQT1JUX1NZTUJPTChjcmVhdGVfcHJvY19lbnRyeSk7CitFWFBPUlRfU1lNQk9MKHJlbW92ZV9wcm9jX2VudHJ5KTsKK0VYUE9SVF9TWU1CT0wocHJvY19yb290KTsKK0VYUE9SVF9TWU1CT0wocHJvY19yb290X2ZzKTsKK0VYUE9SVF9TWU1CT0wocHJvY19uZXQpOworRVhQT1JUX1NZTUJPTChwcm9jX25ldF9zdGF0KTsKK0VYUE9SVF9TWU1CT0wocHJvY19idXMpOworRVhQT1JUX1NZTUJPTChwcm9jX3Jvb3RfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvdGFza19tbXUuYyBiL2ZzL3Byb2MvdGFza19tbXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGI0YTAyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvcHJvYy90YXNrX21tdS5jCkBAIC0wLDAgKzEsMjM1IEBACisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9odWdldGxiLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGFzbS9lbGYuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK2NoYXIgKnRhc2tfbWVtKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBjaGFyICpidWZmZXIpCit7CisJdW5zaWduZWQgbG9uZyBkYXRhLCB0ZXh0LCBsaWI7CisKKwlkYXRhID0gbW0tPnRvdGFsX3ZtIC0gbW0tPnNoYXJlZF92bSAtIG1tLT5zdGFja192bTsKKwl0ZXh0ID0gKFBBR0VfQUxJR04obW0tPmVuZF9jb2RlKSAtIChtbS0+c3RhcnRfY29kZSAmIFBBR0VfTUFTSykpID4+IDEwOworCWxpYiA9IChtbS0+ZXhlY192bSA8PCAoUEFHRV9TSElGVC0xMCkpIC0gdGV4dDsKKwlidWZmZXIgKz0gc3ByaW50ZihidWZmZXIsCisJCSJWbVNpemU6XHQlOGx1IGtCXG4iCisJCSJWbUxjazpcdCU4bHUga0JcbiIKKwkJIlZtUlNTOlx0JThsdSBrQlxuIgorCQkiVm1EYXRhOlx0JThsdSBrQlxuIgorCQkiVm1TdGs6XHQlOGx1IGtCXG4iCisJCSJWbUV4ZTpcdCU4bHUga0JcbiIKKwkJIlZtTGliOlx0JThsdSBrQlxuIgorCQkiVm1QVEU6XHQlOGx1IGtCXG4iLAorCQkobW0tPnRvdGFsX3ZtIC0gbW0tPnJlc2VydmVkX3ZtKSA8PCAoUEFHRV9TSElGVC0xMCksCisJCW1tLT5sb2NrZWRfdm0gPDwgKFBBR0VfU0hJRlQtMTApLAorCQlnZXRfbW1fY291bnRlcihtbSwgcnNzKSA8PCAoUEFHRV9TSElGVC0xMCksCisJCWRhdGEgPDwgKFBBR0VfU0hJRlQtMTApLAorCQltbS0+c3RhY2tfdm0gPDwgKFBBR0VfU0hJRlQtMTApLCB0ZXh0LCBsaWIsCisJCShQVFJTX1BFUl9QVEUqc2l6ZW9mKHB0ZV90KSptbS0+bnJfcHRlcykgPj4gMTApOworCXJldHVybiBidWZmZXI7Cit9CisKK3Vuc2lnbmVkIGxvbmcgdGFza192c2l6ZShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwlyZXR1cm4gUEFHRV9TSVpFICogbW0tPnRvdGFsX3ZtOworfQorCitpbnQgdGFza19zdGF0bShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgaW50ICpzaGFyZWQsIGludCAqdGV4dCwKKwkgICAgICAgaW50ICpkYXRhLCBpbnQgKnJlc2lkZW50KQoreworCWludCByc3MgPSBnZXRfbW1fY291bnRlcihtbSwgcnNzKTsKKworCSpzaGFyZWQgPSByc3MgLSBnZXRfbW1fY291bnRlcihtbSwgYW5vbl9yc3MpOworCSp0ZXh0ID0gKFBBR0VfQUxJR04obW0tPmVuZF9jb2RlKSAtIChtbS0+c3RhcnRfY29kZSAmIFBBR0VfTUFTSykpCisJCQkJCQkJCT4+IFBBR0VfU0hJRlQ7CisJKmRhdGEgPSBtbS0+dG90YWxfdm0gLSBtbS0+c2hhcmVkX3ZtOworCSpyZXNpZGVudCA9IHJzczsKKwlyZXR1cm4gbW0tPnRvdGFsX3ZtOworfQorCitpbnQgcHJvY19leGVfbGluayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICoqZGVudHJ5LCBzdHJ1Y3QgdmZzbW91bnQgKiptbnQpCit7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hOworCWludCByZXN1bHQgPSAtRU5PRU5UOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IHByb2NfdGFzayhpbm9kZSk7CisJc3RydWN0IG1tX3N0cnVjdCAqIG1tID0gZ2V0X3Rhc2tfbW0odGFzayk7CisKKwlpZiAoIW1tKQorCQlnb3RvIG91dDsKKwlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisKKwl2bWEgPSBtbS0+bW1hcDsKKwl3aGlsZSAodm1hKSB7CisJCWlmICgodm1hLT52bV9mbGFncyAmIFZNX0VYRUNVVEFCTEUpICYmIHZtYS0+dm1fZmlsZSkKKwkJCWJyZWFrOworCQl2bWEgPSB2bWEtPnZtX25leHQ7CisJfQorCisJaWYgKHZtYSkgeworCQkqbW50ID0gbW50Z2V0KHZtYS0+dm1fZmlsZS0+Zl92ZnNtbnQpOworCQkqZGVudHJ5ID0gZGdldCh2bWEtPnZtX2ZpbGUtPmZfZGVudHJ5KTsKKwkJcmVzdWx0ID0gMDsKKwl9CisKKwl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOworCW1tcHV0KG1tKTsKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBwYWRfbGVuX3NwYWNlcyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGludCBsZW4pCit7CisJbGVuID0gMjUgKyBzaXplb2Yodm9pZCopICogNiAtIGxlbjsKKwlpZiAobGVuIDwgMSkKKwkJbGVuID0gMTsKKwlzZXFfcHJpbnRmKG0sICIlKmMiLCBsZW4sICcgJyk7Cit9CisKK3N0YXRpYyBpbnQgc2hvd19tYXAoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IG0tPnByaXZhdGU7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICptYXAgPSB2OworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gbWFwLT52bV9tbTsKKwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IG1hcC0+dm1fZmlsZTsKKwlpbnQgZmxhZ3MgPSBtYXAtPnZtX2ZsYWdzOworCXVuc2lnbmVkIGxvbmcgaW5vID0gMDsKKwlkZXZfdCBkZXYgPSAwOworCWludCBsZW47CisKKwlpZiAoZmlsZSkgeworCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwLT52bV9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwkJZGV2ID0gaW5vZGUtPmlfc2ItPnNfZGV2OworCQlpbm8gPSBpbm9kZS0+aV9pbm87CisJfQorCisJc2VxX3ByaW50ZihtLCAiJTA4bHgtJTA4bHggJWMlYyVjJWMgJTA4bHggJTAyeDolMDJ4ICVsdSAlbiIsCisJCQltYXAtPnZtX3N0YXJ0LAorCQkJbWFwLT52bV9lbmQsCisJCQlmbGFncyAmIFZNX1JFQUQgPyAncicgOiAnLScsCisJCQlmbGFncyAmIFZNX1dSSVRFID8gJ3cnIDogJy0nLAorCQkJZmxhZ3MgJiBWTV9FWEVDID8gJ3gnIDogJy0nLAorCQkJZmxhZ3MgJiBWTV9NQVlTSEFSRSA/ICdzJyA6ICdwJywKKwkJCW1hcC0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVCwKKwkJCU1BSk9SKGRldiksIE1JTk9SKGRldiksIGlubywgJmxlbik7CisKKwkvKgorCSAqIFByaW50IHRoZSBkZW50cnkgbmFtZSBmb3IgbmFtZWQgbWFwcGluZ3MsIGFuZCBhCisJICogc3BlY2lhbCBbaGVhcF0gbWFya2VyIGZvciB0aGUgaGVhcDoKKwkgKi8KKwlpZiAobWFwLT52bV9maWxlKSB7CisJCXBhZF9sZW5fc3BhY2VzKG0sIGxlbik7CisJCXNlcV9wYXRoKG0sIGZpbGUtPmZfdmZzbW50LCBmaWxlLT5mX2RlbnRyeSwgIiIpOworCX0gZWxzZSB7CisJCWlmIChtbSkgeworCQkJaWYgKG1hcC0+dm1fc3RhcnQgPD0gbW0tPnN0YXJ0X2JyayAmJgorCQkJCQkJbWFwLT52bV9lbmQgPj0gbW0tPmJyaykgeworCQkJCXBhZF9sZW5fc3BhY2VzKG0sIGxlbik7CisJCQkJc2VxX3B1dHMobSwgIltoZWFwXSIpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAobWFwLT52bV9zdGFydCA8PSBtbS0+c3RhcnRfc3RhY2sgJiYKKwkJCQkJbWFwLT52bV9lbmQgPj0gbW0tPnN0YXJ0X3N0YWNrKSB7CisKKwkJCQkJcGFkX2xlbl9zcGFjZXMobSwgbGVuKTsKKwkJCQkJc2VxX3B1dHMobSwgIltzdGFja10iKTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlwYWRfbGVuX3NwYWNlcyhtLCBsZW4pOworCQkJc2VxX3B1dHMobSwgIlt2ZHNvXSIpOworCQl9CisJfQorCXNlcV9wdXRjKG0sICdcbicpOworCWlmIChtLT5jb3VudCA8IG0tPnNpemUpICAvKiBtYXAgaXMgY29waWVkIHN1Y2Nlc3NmdWxseSAqLworCQltLT52ZXJzaW9uID0gKG1hcCAhPSBnZXRfZ2F0ZV92bWEodGFzaykpPyBtYXAtPnZtX3N0YXJ0OiAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCAqbV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IG0tPnByaXZhdGU7CisJdW5zaWduZWQgbG9uZyBsYXN0X2FkZHIgPSBtLT52ZXJzaW9uOworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqbWFwLCAqdGFpbF9tYXA7CisJbG9mZl90IGwgPSAqcG9zOworCisJLyoKKwkgKiBXZSByZW1lbWJlciBsYXN0X2FkZHIgcmF0aGVyIHRoYW4gbmV4dF9hZGRyIHRvIGhpdCB3aXRoCisJICogbW1hcF9jYWNoZSBtb3N0IG9mIHRoZSB0aW1lLiBXZSBoYXZlIHplcm8gbGFzdF9hZGRyIGF0CisJICogdGhlIGJlZ2luaW5nIGFuZCBhbHNvIGFmdGVyIGxzZWVrLiBXZSB3aWxsIGhhdmUgLTEgbGFzdF9hZGRyCisJICogYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgbWFwcy4KKwkgKi8KKworCWlmIChsYXN0X2FkZHIgPT0gLTFVTCkKKwkJcmV0dXJuIE5VTEw7CisKKwltbSA9IGdldF90YXNrX21tKHRhc2spOworCWlmICghbW0pCisJCXJldHVybiBOVUxMOworCisJdGFpbF9tYXAgPSBnZXRfZ2F0ZV92bWEodGFzayk7CisJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOworCisJLyogU3RhcnQgd2l0aCBsYXN0IGFkZHIgaGludCAqLworCWlmIChsYXN0X2FkZHIgJiYgKG1hcCA9IGZpbmRfdm1hKG1tLCBsYXN0X2FkZHIpKSkgeworCQltYXAgPSBtYXAtPnZtX25leHQ7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogQ2hlY2sgdGhlIG1hcCBpbmRleCBpcyB3aXRoaW4gdGhlIHJhbmdlIGFuZCBkbworCSAqIHNlcXVlbnRpYWwgc2NhbiB1bnRpbCBtX2luZGV4LgorCSAqLworCW1hcCA9IE5VTEw7CisJaWYgKCh1bnNpZ25lZCBsb25nKWwgPCBtbS0+bWFwX2NvdW50KSB7CisJCW1hcCA9IG1tLT5tbWFwOworCQl3aGlsZSAobC0tICYmIG1hcCkKKwkJCW1hcCA9IG1hcC0+dm1fbmV4dDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGwgIT0gbW0tPm1hcF9jb3VudCkKKwkJdGFpbF9tYXAgPSBOVUxMOyAvKiBBZnRlciBnYXRlIG1hcCAqLworCitvdXQ6CisJaWYgKG1hcCkKKwkJcmV0dXJuIG1hcDsKKworCS8qIEVuZCBvZiBtYXBzIGhhcyByZWFjaGVkICovCisJbS0+dmVyc2lvbiA9ICh0YWlsX21hcCAhPSBOVUxMKT8gMDogLTFVTDsKKwl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOworCW1tcHV0KG1tKTsKKwlyZXR1cm4gdGFpbF9tYXA7Cit9CisKK3N0YXRpYyB2b2lkIG1fc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gbS0+cHJpdmF0ZTsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKm1hcCA9IHY7CisJaWYgKG1hcCAmJiBtYXAgIT0gZ2V0X2dhdGVfdm1hKHRhc2spKSB7CisJCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gbWFwLT52bV9tbTsKKwkJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwkJbW1wdXQobW0pOworCX0KK30KKworc3RhdGljIHZvaWQgKm1fbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayA9IG0tPnByaXZhdGU7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICptYXAgPSB2OworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdGFpbF9tYXAgPSBnZXRfZ2F0ZV92bWEodGFzayk7CisKKwkoKnBvcykrKzsKKwlpZiAobWFwICYmIChtYXAgIT0gdGFpbF9tYXApICYmIG1hcC0+dm1fbmV4dCkKKwkJcmV0dXJuIG1hcC0+dm1fbmV4dDsKKwltX3N0b3AobSwgdik7CisJcmV0dXJuIChtYXAgIT0gdGFpbF9tYXApPyB0YWlsX21hcDogTlVMTDsKK30KKworc3RydWN0IHNlcV9vcGVyYXRpb25zIHByb2NfcGlkX21hcHNfb3AgPSB7CisJLnN0YXJ0CT0gbV9zdGFydCwKKwkubmV4dAk9IG1fbmV4dCwKKwkuc3RvcAk9IG1fc3RvcCwKKwkuc2hvdwk9IHNob3dfbWFwCit9OwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy90YXNrX25vbW11LmMgYi9mcy9wcm9jL3Rhc2tfbm9tbXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjY4ODI3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvcHJvYy90YXNrX25vbW11LmMKQEAgLTAsMCArMSwxNjQgQEAKKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisvKgorICogTG9naWM6IHdlJ3ZlIGdvdCB0d28gbWVtb3J5IHN1bXMgZm9yIGVhY2ggcHJvY2VzcywgInNoYXJlZCIsIGFuZAorICogIm5vbi1zaGFyZWQiLiBTaGFyZWQgbWVtb3J5IG1heSBnZXQgY291bnRlZCBtb3JlIHRoZW4gb25jZSwgZm9yCisgKiBlYWNoIHByb2Nlc3MgdGhhdCBvd25zIGl0LiBOb24tc2hhcmVkIG1lbW9yeSBpcyBjb3VudGVkCisgKiBhY2N1cmF0ZWx5LgorICovCitjaGFyICp0YXNrX21lbShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgY2hhciAqYnVmZmVyKQoreworCXN0cnVjdCB2bV9saXN0X3N0cnVjdCAqdm1sOworCXVuc2lnbmVkIGxvbmcgYnl0ZXMgPSAwLCBzYnl0ZXMgPSAwLCBzbGFjayA9IDA7CisgICAgICAgIAorCWRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwlmb3IgKHZtbCA9IG1tLT5jb250ZXh0LnZtbGlzdDsgdm1sOyB2bWwgPSB2bWwtPm5leHQpIHsKKwkJaWYgKCF2bWwtPnZtYSkKKwkJCWNvbnRpbnVlOworCisJCWJ5dGVzICs9IGtvYmpzaXplKHZtbCk7CisJCWlmIChhdG9taWNfcmVhZCgmbW0tPm1tX2NvdW50KSA+IDEgfHwKKwkJICAgIGF0b21pY19yZWFkKCZ2bWwtPnZtYS0+dm1fdXNhZ2UpID4gMQorCQkgICAgKSB7CisJCQlzYnl0ZXMgKz0ga29ianNpemUoKHZvaWQgKikgdm1sLT52bWEtPnZtX3N0YXJ0KTsKKwkJCXNieXRlcyArPSBrb2Jqc2l6ZSh2bWwtPnZtYSk7CisJCX0gZWxzZSB7CisJCQlieXRlcyArPSBrb2Jqc2l6ZSgodm9pZCAqKSB2bWwtPnZtYS0+dm1fc3RhcnQpOworCQkJYnl0ZXMgKz0ga29ianNpemUodm1sLT52bWEpOworCQkJc2xhY2sgKz0ga29ianNpemUoKHZvaWQgKikgdm1sLT52bWEtPnZtX3N0YXJ0KSAtCisJCQkJKHZtbC0+dm1hLT52bV9lbmQgLSB2bWwtPnZtYS0+dm1fc3RhcnQpOworCQl9CisJfQorCisJaWYgKGF0b21pY19yZWFkKCZtbS0+bW1fY291bnQpID4gMSkKKwkJc2J5dGVzICs9IGtvYmpzaXplKG1tKTsKKwllbHNlCisJCWJ5dGVzICs9IGtvYmpzaXplKG1tKTsKKwkKKwlpZiAoY3VycmVudC0+ZnMgJiYgYXRvbWljX3JlYWQoJmN1cnJlbnQtPmZzLT5jb3VudCkgPiAxKQorCQlzYnl0ZXMgKz0ga29ianNpemUoY3VycmVudC0+ZnMpOworCWVsc2UKKwkJYnl0ZXMgKz0ga29ianNpemUoY3VycmVudC0+ZnMpOworCisJaWYgKGN1cnJlbnQtPmZpbGVzICYmIGF0b21pY19yZWFkKCZjdXJyZW50LT5maWxlcy0+Y291bnQpID4gMSkKKwkJc2J5dGVzICs9IGtvYmpzaXplKGN1cnJlbnQtPmZpbGVzKTsKKwllbHNlCisJCWJ5dGVzICs9IGtvYmpzaXplKGN1cnJlbnQtPmZpbGVzKTsKKworCWlmIChjdXJyZW50LT5zaWdoYW5kICYmIGF0b21pY19yZWFkKCZjdXJyZW50LT5zaWdoYW5kLT5jb3VudCkgPiAxKQorCQlzYnl0ZXMgKz0ga29ianNpemUoY3VycmVudC0+c2lnaGFuZCk7CisJZWxzZQorCQlieXRlcyArPSBrb2Jqc2l6ZShjdXJyZW50LT5zaWdoYW5kKTsKKworCWJ5dGVzICs9IGtvYmpzaXplKGN1cnJlbnQpOyAvKiBpbmNsdWRlcyBrZXJuZWwgc3RhY2sgKi8KKworCWJ1ZmZlciArPSBzcHJpbnRmKGJ1ZmZlciwKKwkJIk1lbTpcdCU4bHUgYnl0ZXNcbiIKKwkJIlNsYWNrOlx0JThsdSBieXRlc1xuIgorCQkiU2hhcmVkOlx0JThsdSBieXRlc1xuIiwKKwkJYnl0ZXMsIHNsYWNrLCBzYnl0ZXMpOworCisJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwlyZXR1cm4gYnVmZmVyOworfQorCit1bnNpZ25lZCBsb25nIHRhc2tfdnNpemUoc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJc3RydWN0IHZtX2xpc3Rfc3RydWN0ICp0YnA7CisJdW5zaWduZWQgbG9uZyB2c2l6ZSA9IDA7CisKKwlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJZm9yICh0YnAgPSBtbS0+Y29udGV4dC52bWxpc3Q7IHRicDsgdGJwID0gdGJwLT5uZXh0KSB7CisJCWlmICh0YnAtPnZtYSkKKwkJCXZzaXplICs9IGtvYmpzaXplKCh2b2lkICopIHRicC0+dm1hLT52bV9zdGFydCk7CisJfQorCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJcmV0dXJuIHZzaXplOworfQorCitpbnQgdGFza19zdGF0bShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgaW50ICpzaGFyZWQsIGludCAqdGV4dCwKKwkgICAgICAgaW50ICpkYXRhLCBpbnQgKnJlc2lkZW50KQoreworCXN0cnVjdCB2bV9saXN0X3N0cnVjdCAqdGJwOworCWludCBzaXplID0ga29ianNpemUobW0pOworCisJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOworCWZvciAodGJwID0gbW0tPmNvbnRleHQudm1saXN0OyB0YnA7IHRicCA9IHRicC0+bmV4dCkgeworCQlzaXplICs9IGtvYmpzaXplKHRicCk7CisJCWlmICh0YnAtPnZtYSkgeworCQkJc2l6ZSArPSBrb2Jqc2l6ZSh0YnAtPnZtYSk7CisJCQlzaXplICs9IGtvYmpzaXplKCh2b2lkICopIHRicC0+dm1hLT52bV9zdGFydCk7CisJCX0KKwl9CisKKwlzaXplICs9ICgqdGV4dCA9IG1tLT5lbmRfY29kZSAtIG1tLT5zdGFydF9jb2RlKTsKKwlzaXplICs9ICgqZGF0YSA9IG1tLT5zdGFydF9zdGFjayAtIG1tLT5zdGFydF9kYXRhKTsKKwl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOworCSpyZXNpZGVudCA9IHNpemU7CisJcmV0dXJuIHNpemU7Cit9CisKK2ludCBwcm9jX2V4ZV9saW5rKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkZW50cnkgKipkZW50cnksIHN0cnVjdCB2ZnNtb3VudCAqKm1udCkKK3sKKwlzdHJ1Y3Qgdm1fbGlzdF9zdHJ1Y3QgKnZtbDsKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBwcm9jX3Rhc2soaW5vZGUpOworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gZ2V0X3Rhc2tfbW0odGFzayk7CisJaW50IHJlc3VsdCA9IC1FTk9FTlQ7CisKKwlpZiAoIW1tKQorCQlnb3RvIG91dDsKKwlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisKKwl2bWwgPSBtbS0+Y29udGV4dC52bWxpc3Q7CisJdm1hID0gTlVMTDsKKwl3aGlsZSAodm1sKSB7CisJCWlmICgodm1sLT52bWEtPnZtX2ZsYWdzICYgVk1fRVhFQ1VUQUJMRSkgJiYgdm1sLT52bWEtPnZtX2ZpbGUpIHsKKwkJCXZtYSA9IHZtbC0+dm1hOworCQkJYnJlYWs7CisJCX0KKwkJdm1sID0gdm1sLT5uZXh0OworCX0KKworCWlmICh2bWEpIHsKKwkJKm1udCA9IG1udGdldCh2bWEtPnZtX2ZpbGUtPmZfdmZzbW50KTsKKwkJKmRlbnRyeSA9IGRnZXQodm1hLT52bV9maWxlLT5mX2RlbnRyeSk7CisJCXJlc3VsdCA9IDA7CisJfQorCisJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKKwltbXB1dChtbSk7CitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIEFsYmVydCBELiBDYWhhbGFuIHN1Z2dlc3RlZCB0byBmYWtlIGVudHJpZXMgZm9yIHRoZSB0cmFkaXRpb25hbAorICogc2VjdGlvbnMgaGVyZS4gIFRoaXMgbWlnaHQgYmUgd29ydGggaW52ZXN0aWdhdGluZy4KKyAqLworc3RhdGljIGludCBzaG93X21hcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgdm9pZCAqbV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqcG9zKQoreworCXJldHVybiBOVUxMOworfQorc3RhdGljIHZvaWQgbV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKK30KK3N0YXRpYyB2b2lkICptX25leHQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwlyZXR1cm4gTlVMTDsKK30KK3N0cnVjdCBzZXFfb3BlcmF0aW9ucyBwcm9jX3BpZF9tYXBzX29wID0geworCS5zdGFydAk9IG1fc3RhcnQsCisJLm5leHQJPSBtX25leHQsCisJLnN0b3AJPSBtX3N0b3AsCisJLnNob3cJPSBzaG93X21hcAorfTsKZGlmZiAtLWdpdCBhL2ZzL3FueDQvTWFrZWZpbGUgYi9mcy9xbng0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMmQ3ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9xbng0L01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IHFueDQtZmlsZXN5c3RlbSByb3V0aW5lcy4KKyMKKworb2JqLSQoQ09ORklHX1FOWDRGU19GUykgKz0gcW54NC5vCisKK3FueDQtb2JqcyA6PSBpbm9kZS5vIGRpci5vIG5hbWVpLm8gZmlsZS5vIGJpdG1hcC5vIHRydW5jYXRlLm8gZnN5bmMubwpkaWZmIC0tZ2l0IGEvZnMvcW54NC9SRUFETUUgYi9mcy9xbng0L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjFlMzIwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvcW54NC9SRUFETUUKQEAgLTAsMCArMSw5IEBACisKKyAgVGhpcyBpcyBhIHNuYXBzaG90IG9mIHRoZSBRTlg0IGZpbGVzeXN0ZW0gZm9yIExpbnV4LgorICBQbGVhc2Ugc2VuZCBkaWZmcyBhbmQgcmVtYXJrcyB0byA8YWxAYWxhcnNlbi5uZXQ+IC4KKyAgCitDcmVkaXRzIDoKKworUmljaGFyZCAiU2N1YmEiIEEuIEZyb3dpam4gICAgIDxzY3ViYUB3eHMubmw+CitGcmFuayAiSmVkaS9TZWN0b3IgT25lIiBEZW5pcyAgPGpAcHVyZWZ0cGQub3JnPgorQW5kZXJzIExhcnNlbiAgICAgICAgICAgICAgICAgIDxhbEBhbGFyc2VuLm5ldD4gKE1haW50YWluZXIpCmRpZmYgLS1naXQgYS9mcy9xbng0L2JpdG1hcC5jIGIvZnMvcW54NC9iaXRtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTEyNTM5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvcW54NC9iaXRtYXAuYwpAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIFFOWDQgZmlsZSBzeXN0ZW0sIExpbnV4IGltcGxlbWVudGF0aW9uLgorICoKKyAqIFZlcnNpb24gOiAwLjIuMQorICoKKyAqIFVzaW5nIHBhcnRzIG9mIHRoZSB4aWFmcyBmaWxlc3lzdGVtLgorICoKKyAqIEhpc3RvcnkgOgorICoKKyAqIDI4LTA1LTE5OTggYnkgUmljaGFyZCBGcm93aWpuIDogZmlyc3QgcmVsZWFzZS4KKyAqIDIwLTA2LTE5OTggYnkgRnJhbmsgRGVuaXMgOiBiYXNpYyBvcHRpbWlzYXRpb25zLgorICogMjUtMDYtMTk5OCBieSBGcmFuayBEZW5pcyA6IHFueDRfaXNfZnJlZSwgcW54NF9zZXRfYml0bWFwLCBxbng0X2JtYXAgLgorICogMjgtMDYtMTk5OCBieSBGcmFuayBEZW5pcyA6IHFueDRfZnJlZV9pbm9kZSAodG8gYmUgZml4ZWQpIC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcW54NF9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCitpbnQgcW54NF9uZXdfYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY291bnRfYml0cyhyZWdpc3RlciBjb25zdCBjaGFyICpibVBhcnQsIHJlZ2lzdGVyIGludCBzaXplLAorCQkgICAgICAgaW50ICpjb25zdCB0ZikKK3sKKwljaGFyIGI7CisJaW50IHRvdCA9ICp0ZjsKKworCWlmIChzaXplID4gUU5YNF9CTE9DS19TSVpFKSB7CisJCXNpemUgPSBRTlg0X0JMT0NLX1NJWkU7CisJfQorCWRvIHsKKwkJYiA9ICpibVBhcnQrKzsKKwkJaWYgKChiICYgMSkgPT0gMCkKKwkJCXRvdCsrOworCQlpZiAoKGIgJiAyKSA9PSAwKQorCQkJdG90Kys7CisJCWlmICgoYiAmIDQpID09IDApCisJCQl0b3QrKzsKKwkJaWYgKChiICYgOCkgPT0gMCkKKwkJCXRvdCsrOworCQlpZiAoKGIgJiAxNikgPT0gMCkKKwkJCXRvdCsrOworCQlpZiAoKGIgJiAzMikgPT0gMCkKKwkJCXRvdCsrOworCQlpZiAoKGIgJiA2NCkgPT0gMCkKKwkJCXRvdCsrOworCQlpZiAoKGIgJiAxMjgpID09IDApCisJCQl0b3QrKzsKKwkJc2l6ZS0tOworCX0gd2hpbGUgKHNpemUgIT0gMCk7CisJKnRmID0gdG90OworfQorCit1bnNpZ25lZCBsb25nIHFueDRfY291bnRfZnJlZV9ibG9ja3Moc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlpbnQgc3RhcnQgPSBsZTMyX3RvX2NwdShxbng0X3NiKHNiKS0+Qml0TWFwLT5kaV9maXJzdF94dG50Lnh0bnRfYmxrKSAtIDE7CisJaW50IHRvdGFsID0gMDsKKwlpbnQgdG90YWxfZnJlZSA9IDA7CisJaW50IG9mZnNldCA9IDA7CisJaW50IHNpemUgPSBsZTMyX3RvX2NwdShxbng0X3NiKHNiKS0+Qml0TWFwLT5kaV9zaXplKTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCisJd2hpbGUgKHRvdGFsIDwgc2l6ZSkgeworCQlpZiAoKGJoID0gc2JfYnJlYWQoc2IsIHN0YXJ0ICsgb2Zmc2V0KSkgPT0gTlVMTCkgeworCQkJcHJpbnRrKCJxbng0OiBJL08gZXJyb3IgaW4gY291bnRpbmcgZnJlZSBibG9ja3NcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJY291bnRfYml0cyhiaC0+Yl9kYXRhLCBzaXplIC0gdG90YWwsICZ0b3RhbF9mcmVlKTsKKwkJYnJlbHNlKGJoKTsKKwkJdG90YWwgKz0gUU5YNF9CTE9DS19TSVpFOworCQlvZmZzZXQrKzsKKwl9CisKKwlyZXR1cm4gdG90YWxfZnJlZTsKK30KKworI2lmZGVmIENPTkZJR19RTlg0RlNfUlcKKworaW50IHFueDRfaXNfZnJlZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBsb25nIGJsb2NrKQoreworCWludCBzdGFydCA9IGxlMzJfdG9fY3B1KHFueDRfc2Ioc2IpLT5CaXRNYXAtPmRpX2ZpcnN0X3h0bnQueHRudF9ibGspIC0gMTsKKwlpbnQgc2l6ZSA9IGxlMzJfdG9fY3B1KHFueDRfc2Ioc2IpLT5CaXRNYXAtPmRpX3NpemUpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJY29uc3QgY2hhciAqZzsKKwlpbnQgcmV0ID0gLUVJTzsKKworCXN0YXJ0ICs9IGJsb2NrIC8gKFFOWDRfQkxPQ0tfU0laRSAqIDgpOworCVFOWDRERUJVRygoInFueDQ6IGlzX2ZyZWUgcmVxdWVzdGluZyBibG9jayBbJWx1XSwgYml0bWFwIGluIGJsb2NrIFslbHVdXG4iLAorCQkgICAodW5zaWduZWQgbG9uZykgYmxvY2ssICh1bnNpZ25lZCBsb25nKSBzdGFydCkpOworCSh2b2lkKSBzaXplOwkJLyogQ0hFQ0tNRSAqLworCWJoID0gc2JfYnJlYWQoc2IsIHN0YXJ0KTsKKwlpZiAoYmggPT0gTlVMTCkgeworCQlyZXR1cm4gLUVJTzsKKwl9CisJZyA9IGJoLT5iX2RhdGEgKyAoYmxvY2sgJSBRTlg0X0JMT0NLX1NJWkUpOworCWlmICgoKCpnKSAmICgxIDw8IChibG9jayAlIDgpKSkgPT0gMCkgeworCQlRTlg0REVCVUcoKCJxbng0OiBpc19mcmVlIC0+IGJsb2NrIGlzIGZyZWVcbiIpKTsKKwkJcmV0ID0gMTsKKwl9IGVsc2UgeworCQlRTlg0REVCVUcoKCJxbng0OiBpc19mcmVlIC0+IGJsb2NrIGlzIGJ1c3lcbiIpKTsKKwkJcmV0ID0gMDsKKwl9CisJYnJlbHNlKGJoKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBxbng0X3NldF9iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgbG9uZyBibG9jaywgaW50IGJ1c3kpCit7CisJaW50IHN0YXJ0ID0gbGUzMl90b19jcHUocW54NF9zYihzYiktPkJpdE1hcC0+ZGlfZmlyc3RfeHRudC54dG50X2JsaykgLSAxOworCWludCBzaXplID0gbGUzMl90b19jcHUocW54NF9zYihzYiktPkJpdE1hcC0+ZGlfc2l6ZSk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwljaGFyICpnOworCisJc3RhcnQgKz0gYmxvY2sgLyAoUU5YNF9CTE9DS19TSVpFICogOCk7CisJUU5YNERFQlVHKCgicW54NDogc2V0X2JpdG1hcCByZXF1ZXN0aW5nIGJsb2NrIFslbHVdLCBiaXRtYXAgaW4gYmxvY2sgWyVsdV1cbiIsCisJCSAgICh1bnNpZ25lZCBsb25nKSBibG9jaywgKHVuc2lnbmVkIGxvbmcpIHN0YXJ0KSk7CisJKHZvaWQpIHNpemU7CQkvKiBDSEVDS01FICovCisJYmggPSBzYl9icmVhZChzYiwgc3RhcnQpOworCWlmIChiaCA9PSBOVUxMKSB7CisJCXJldHVybiAtRUlPOworCX0KKwlnID0gYmgtPmJfZGF0YSArIChibG9jayAlIFFOWDRfQkxPQ0tfU0laRSk7CisJaWYgKGJ1c3kgPT0gMCkgeworCQkoKmcpICY9IH4oMSA8PCAoYmxvY2sgJSA4KSk7CisJfSBlbHNlIHsKKwkJKCpnKSB8PSAoMSA8PCAoYmxvY2sgJSA4KSk7CisJfQorCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwlicmVsc2UoYmgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHFueDRfY2xlYXJfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgcW54NF9pbm9kZV9lbnRyeSAqcW54NF9pbm8gPSBxbng0X3Jhd19pbm9kZShpbm9kZSk7CisJLyogV2hhdCBmb3I/ICovCisJbWVtc2V0KHFueDRfaW5vLT5kaV9mbmFtZSwgMCwgc2l6ZW9mIHFueDRfaW5vLT5kaV9mbmFtZSk7CisJcW54NF9pbm8tPmRpX3NpemUgPSAwOworCXFueDRfaW5vLT5kaV9udW1feHRudHMgPSAwOworCXFueDRfaW5vLT5kaV9tb2RlID0gMDsKKwlxbng0X2luby0+ZGlfc3RhdHVzID0gMDsKK30KKwordm9pZCBxbng0X2ZyZWVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpZiAoaW5vZGUtPmlfaW5vIDwgMSkgeworCQlwcmludGsoImZyZWVfaW5vZGU6IGlub2RlIDAgb3Igbm9uZXhpc3RlbnQgaW5vZGVcbiIpOworCQlyZXR1cm47CisJfQorCXFueDRfY2xlYXJfaW5vZGUoaW5vZGUpOworCWNsZWFyX2lub2RlKGlub2RlKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9xbng0L2Rpci5jIGIvZnMvcW54NC9kaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDY2MTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvcW54NC9kaXIuYwpAQCAtMCwwICsxLDk5IEBACisvKgorICogUU5YNCBmaWxlIHN5c3RlbSwgTGludXggaW1wbGVtZW50YXRpb24uCisgKgorICogVmVyc2lvbiA6IDAuMi4xCisgKgorICogVXNpbmcgcGFydHMgb2YgdGhlIHhpYWZzIGZpbGVzeXN0ZW0uCisgKgorICogSGlzdG9yeSA6CisgKgorICogMjgtMDUtMTk5OCBieSBSaWNoYXJkIEZyb3dpam4gOiBmaXJzdCByZWxlYXNlLgorICogMjAtMDYtMTk5OCBieSBGcmFuayBEZW5pcyA6IExpbnV4IDIuMS45OSsgJiBkY2FjaGUgc3VwcG9ydC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3FueDRfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorCisKK3N0YXRpYyBpbnQgcW54NF9yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IHFueDRfaW5vZGVfZW50cnkgKmRlOworCXN0cnVjdCBxbng0X2xpbmtfaW5mbyAqbGU7CisJdW5zaWduZWQgbG9uZyBibGtudW07CisJaW50IGl4LCBpbm87CisJaW50IHNpemU7CisKKwlRTlg0REVCVUcoKCJxbng0X3JlYWRkaXI6aV9zaXplID0gJWxkXG4iLCAobG9uZykgaW5vZGUtPmlfc2l6ZSkpOworCVFOWDRERUJVRygoImZpbHAtPmZfcG9zICAgICAgICAgPSAlbGRcbiIsIChsb25nKSBmaWxwLT5mX3BvcykpOworCisJbG9ja19rZXJuZWwoKTsKKworCXdoaWxlIChmaWxwLT5mX3BvcyA8IGlub2RlLT5pX3NpemUpIHsKKwkJYmxrbnVtID0gcW54NF9ibG9ja19tYXAoIGlub2RlLCBmaWxwLT5mX3BvcyA+PiBRTlg0X0JMT0NLX1NJWkVfQklUUyApOworCQliaCA9IHNiX2JyZWFkKGlub2RlLT5pX3NiLCBibGtudW0pOworCQlpZihiaD09TlVMTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJxbng0X3JlYWRkaXI6IGJyZWFkIGZhaWxlZCAoJWxkKVxuIiwgYmxrbnVtKTsKKwkJCWJyZWFrOworCQl9CisJCWl4ID0gKGludCkoZmlscC0+Zl9wb3MgPj4gUU5YNF9ESVJfRU5UUllfU0laRV9CSVRTKSAlIFFOWDRfSU5PREVTX1BFUl9CTE9DSzsKKwkJd2hpbGUgKGl4IDwgUU5YNF9JTk9ERVNfUEVSX0JMT0NLKSB7CisJCQlvZmZzZXQgPSBpeCAqIFFOWDRfRElSX0VOVFJZX1NJWkU7CisJCQlkZSA9IChzdHJ1Y3QgcW54NF9pbm9kZV9lbnRyeSAqKSAoYmgtPmJfZGF0YSArIG9mZnNldCk7CisJCQlzaXplID0gc3RybGVuKGRlLT5kaV9mbmFtZSk7CisJCQlpZiAoc2l6ZSkgeworCQkJCWlmICggISggZGUtPmRpX3N0YXR1cyAmIFFOWDRfRklMRV9MSU5LICkgJiYgc2l6ZSA+IFFOWDRfU0hPUlRfTkFNRV9NQVggKQorCQkJCQlzaXplID0gUU5YNF9TSE9SVF9OQU1FX01BWDsKKwkJCQllbHNlIGlmICggc2l6ZSA+IFFOWDRfTkFNRV9NQVggKQorCQkJCQlzaXplID0gUU5YNF9OQU1FX01BWDsKKworCQkJCWlmICggKCBkZS0+ZGlfc3RhdHVzICYgKFFOWDRfRklMRV9VU0VEfFFOWDRfRklMRV9MSU5LKSApICE9IDAgKSB7CisJCQkJCVFOWDRERUJVRygoInFueDRfcmVhZGRpcjolLipzXG4iLCBzaXplLCBkZS0+ZGlfZm5hbWUpKTsKKwkJCQkJaWYgKCAoIGRlLT5kaV9zdGF0dXMgJiBRTlg0X0ZJTEVfTElOSyApID09IDAgKQorCQkJCQkJaW5vID0gYmxrbnVtICogUU5YNF9JTk9ERVNfUEVSX0JMT0NLICsgaXggLSAxOworCQkJCQllbHNlIHsKKwkJCQkJCWxlICA9IChzdHJ1Y3QgcW54NF9saW5rX2luZm8qKWRlOworCQkJCQkJaW5vID0gKCBsZS0+ZGxfaW5vZGVfYmxrIC0gMSApICoKKwkJCQkJCQlRTlg0X0lOT0RFU19QRVJfQkxPQ0sgKworCQkJCQkJCWxlLT5kbF9pbm9kZV9uZHg7CisJCQkJCX0KKwkJCQkJaWYgKGZpbGxkaXIoZGlyZW50LCBkZS0+ZGlfZm5hbWUsIHNpemUsIGZpbHAtPmZfcG9zLCBpbm8sIERUX1VOS05PV04pIDwgMCkgeworCQkJCQkJYnJlbHNlKGJoKTsKKwkJCQkJCWdvdG8gb3V0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaXgrKzsKKwkJCWZpbHAtPmZfcG9zICs9IFFOWDRfRElSX0VOVFJZX1NJWkU7CisJCX0KKwkJYnJlbHNlKGJoKTsKKwl9CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHFueDRfZGlyX29wZXJhdGlvbnMgPQoreworCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIJPSBxbng0X3JlYWRkaXIsCisJLmZzeW5jCQk9IGZpbGVfZnN5bmMsCit9OworCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBxbng0X2Rpcl9pbm9kZV9vcGVyYXRpb25zID0KK3sKKwkubG9va3VwCQk9IHFueDRfbG9va3VwLAorI2lmZGVmIENPTkZJR19RTlg0RlNfUlcKKwkuY3JlYXRlCQk9IHFueDRfY3JlYXRlLAorCS51bmxpbmsJCT0gcW54NF91bmxpbmssCisJLnJtZGlyCQk9IHFueDRfcm1kaXIsCisjZW5kaWYKK307CmRpZmYgLS1naXQgYS9mcy9xbng0L2ZpbGUuYyBiL2ZzL3FueDQvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NzEzMTUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9xbng0L2ZpbGUuYwpAQCAtMCwwICsxLDQyIEBACisvKgorICogUU5YNCBmaWxlIHN5c3RlbSwgTGludXggaW1wbGVtZW50YXRpb24uCisgKgorICogVmVyc2lvbiA6IDAuMi4xCisgKgorICogVXNpbmcgcGFydHMgb2YgdGhlIHhpYWZzIGZpbGVzeXN0ZW0uCisgKgorICogSGlzdG9yeSA6CisgKgorICogMjUtMDUtMTk5OCBieSBSaWNoYXJkIEZyb3dpam4gOiBmaXJzdCByZWxlYXNlLgorICogMjEtMDYtMTk5OCBieSBGcmFuayBEZW5pcyA6IHdyb3RlIHFueDRfcmVhZHBhZ2UgdG8gdXNlIGdlbmVyaWNfZmlsZV9yZWFkLgorICogMjctMDYtMTk5OCBieSBGcmFuayBEZW5pcyA6IGZpbGUgb3ZlcndyaXRpbmcuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvcW54NF9mcy5oPgorCisvKgorICogV2UgaGF2ZSBtb3N0bHkgTlVMTCdzIGhlcmU6IHRoZSBjdXJyZW50IGRlZmF1bHRzIGFyZSBvayBmb3IKKyAqIHRoZSBxbng0IGZpbGVzeXN0ZW0uCisgKi8KK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgcW54NF9maWxlX29wZXJhdGlvbnMgPQoreworCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKKwkucmVhZAkJPSBnZW5lcmljX2ZpbGVfcmVhZCwKKwkubW1hcAkJPSBnZW5lcmljX2ZpbGVfbW1hcCwKKwkuc2VuZGZpbGUJPSBnZW5lcmljX2ZpbGVfc2VuZGZpbGUsCisjaWZkZWYgQ09ORklHX1FOWDRGU19SVworCS53cml0ZQkJPSBnZW5lcmljX2ZpbGVfd3JpdGUsCisJLmZzeW5jCQk9IHFueDRfc3luY19maWxlLAorI2VuZGlmCit9OworCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBxbng0X2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyA9Cit7CisjaWZkZWYgQ09ORklHX1FOWDRGU19SVworCS50cnVuY2F0ZQk9IHFueDRfdHJ1bmNhdGUsCisjZW5kaWYKK307CmRpZmYgLS1naXQgYS9mcy9xbng0L2ZzeW5jLmMgYi9mcy9xbng0L2ZzeW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY1YmM3NQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3FueDQvZnN5bmMuYwpAQCAtMCwwICsxLDE3MCBAQAorLyogCisgKiBRTlg0IGZpbGUgc3lzdGVtLCBMaW51eCBpbXBsZW1lbnRhdGlvbi4KKyAqIAorICogVmVyc2lvbiA6IDAuMQorICogCisgKiBVc2luZyBwYXJ0cyBvZiB0aGUgeGlhZnMgZmlsZXN5c3RlbS4KKyAqIAorICogSGlzdG9yeSA6CisgKiAKKyAqIDI0LTAzLTE5OTggYnkgUmljaGFyZCBGcm93aWpuIDogZmlyc3QgcmVsZWFzZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9xbng0X2ZzLmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKy8qCisgKiBUaGUgZnVuY3Rpb25zIGZvciBxbng0IGZzIGZpbGUgc3luY2hyb25pemF0aW9uLgorICovCisKKyNpZmRlZiBDT05GSUdfUU5YNEZTX1JXCisKK3N0YXRpYyBpbnQgc3luY19ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBzaG9ydCAqYmxvY2ssIGludCB3YWl0KQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJdW5zaWduZWQgc2hvcnQgdG1wOworCisJaWYgKCEqYmxvY2spCisJCXJldHVybiAwOworCXRtcCA9ICpibG9jazsKKwliaCA9IHNiX2ZpbmRfZ2V0X2Jsb2NrKGlub2RlLT5pX3NiLCAqYmxvY2spOworCWlmICghYmgpCisJCXJldHVybiAwOworCWlmICgqYmxvY2sgIT0gdG1wKSB7CisJCWJyZWxzZShiaCk7CisJCXJldHVybiAxOworCX0KKwlpZiAod2FpdCAmJiBidWZmZXJfcmVxKGJoKSAmJiAhYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQlicmVsc2UoYmgpOworCQlyZXR1cm4gLTE7CisJfQorCWlmICh3YWl0IHx8ICFidWZmZXJfdXB0b2RhdGUoYmgpIHx8ICFidWZmZXJfZGlydHkoYmgpKSB7CisJCWJyZWxzZShiaCk7CisJCXJldHVybiAwOworCX0KKwlsbF9yd19ibG9jayhXUklURSwgMSwgJmJoKTsKKwlhdG9taWNfZGVjKCZiaC0+Yl9jb3VudCk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBXVEYKK3N0YXRpYyBpbnQgc3luY19pYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgc2hvcnQgKmlibG9jaywKKwkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJoLCBpbnQgd2FpdCkKK3sKKwlpbnQgcmM7CisJdW5zaWduZWQgc2hvcnQgdG1wOworCisJKmJoID0gTlVMTDsKKwl0bXAgPSAqaWJsb2NrOworCWlmICghdG1wKQorCQlyZXR1cm4gMDsKKwlyYyA9IHN5bmNfYmxvY2soaW5vZGUsIGlibG9jaywgd2FpdCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisJKmJoID0gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIHRtcCk7CisJaWYgKHRtcCAhPSAqaWJsb2NrKSB7CisJCWJyZWxzZSgqYmgpOworCQkqYmggPSBOVUxMOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKCEqYmgpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHN5bmNfZGlyZWN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB3YWl0KQoreworCWludCBpOworCWludCByYywgZXJyID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKwkJcmMgPSBzeW5jX2Jsb2NrKGlub2RlLAorCQkJCSh1bnNpZ25lZCBzaG9ydCAqKSBxbng0X3Jhd19pbm9kZShpbm9kZSktPmRpX2ZpcnN0X3h0bnQueHRudF9ibGsgKyBpLCB3YWl0KTsKKwkJaWYgKHJjID4gMCkKKwkJCWJyZWFrOworCQlpZiAocmMpCisJCQllcnIgPSByYzsKKwl9CisJcmV0dXJuIGVycjsKK30KKworI2lmZGVmIFdURgorc3RhdGljIGludCBzeW5jX2luZGlyZWN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIHNob3J0ICppYmxvY2ssIGludCB3YWl0KQoreworCWludCBpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqaW5kX2JoOworCWludCByYywgZXJyID0gMDsKKworCXJjID0gc3luY19pYmxvY2soaW5vZGUsIGlibG9jaywgJmluZF9iaCwgd2FpdCk7CisJaWYgKHJjIHx8ICFpbmRfYmgpCisJCXJldHVybiByYzsKKworCWZvciAoaSA9IDA7IGkgPCA1MTI7IGkrKykgeworCQlyYyA9IHN5bmNfYmxvY2soaW5vZGUsCisJCQkJKCh1bnNpZ25lZCBzaG9ydCAqKSBpbmRfYmgtPmJfZGF0YSkgKyBpLAorCQkJCXdhaXQpOworCQlpZiAocmMgPiAwKQorCQkJYnJlYWs7CisJCWlmIChyYykKKwkJCWVyciA9IHJjOworCX0KKwlicmVsc2UoaW5kX2JoKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHN5bmNfZGluZGlyZWN0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIHNob3J0ICpkaWJsb2NrLAorCQkJICBpbnQgd2FpdCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpbmRfYmg7CisJaW50IHJjLCBlcnIgPSAwOworCisJcmMgPSBzeW5jX2libG9jayhpbm9kZSwgZGlibG9jaywgJmRpbmRfYmgsIHdhaXQpOworCWlmIChyYyB8fCAhZGluZF9iaCkKKwkJcmV0dXJuIHJjOworCisJZm9yIChpID0gMDsgaSA8IDUxMjsgaSsrKSB7CisJCXJjID0gc3luY19pbmRpcmVjdChpbm9kZSwKKwkJCQkoKHVuc2lnbmVkIHNob3J0ICopIGRpbmRfYmgtPmJfZGF0YSkgKyBpLAorCQkJCSAgIHdhaXQpOworCQlpZiAocmMgPiAwKQorCQkJYnJlYWs7CisJCWlmIChyYykKKwkJCWVyciA9IHJjOworCX0KKwlicmVsc2UoZGluZF9iaCk7CisJcmV0dXJuIGVycjsKK30KKyNlbmRpZgorCitpbnQgcW54NF9zeW5jX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IHVudXNlZCkKK3sKKyAgICAgICAgc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgd2FpdCwgZXJyID0gMDsKKyAgICAgICAgCisgICAgICAgICh2b2lkKSBmaWxlOworCWlmICghKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0RJUihpbm9kZS0+aV9tb2RlKSB8fAorCSAgICAgIFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxvY2tfa2VybmVsKCk7CisJZm9yICh3YWl0ID0gMDsgd2FpdCA8PSAxOyB3YWl0KyspIHsKKwkJZXJyIHw9IHN5bmNfZGlyZWN0KGlub2RlLCB3YWl0KTsKKwl9CisJZXJyIHw9IHFueDRfc3luY19pbm9kZShpbm9kZSk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAoZXJyIDwgMCkgPyAtRUlPIDogMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9mcy9xbng0L2lub2RlLmMgYi9mcy9xbng0L2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE5MmQ2YgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3FueDQvaW5vZGUuYwpAQCAtMCwwICsxLDYwMyBAQAorLyoKKyAqIFFOWDQgZmlsZSBzeXN0ZW0sIExpbnV4IGltcGxlbWVudGF0aW9uLgorICoKKyAqIFZlcnNpb24gOiAwLjIuMQorICoKKyAqIFVzaW5nIHBhcnRzIG9mIHRoZSB4aWFmcyBmaWxlc3lzdGVtLgorICoKKyAqIEhpc3RvcnkgOgorICoKKyAqIDAxLTA2LTE5OTggYnkgUmljaGFyZCBGcm93aWpuIDogZmlyc3QgcmVsZWFzZS4KKyAqIDIwLTA2LTE5OTggYnkgRnJhbmsgRGVuaXMgOiBMaW51eCAyLjEuOTkrIHN1cHBvcnQsIGJvb3Qgc2lnbmF0dXJlLCBtaXNjLgorICogMzAtMDYtMTk5OCBieSBGcmFuayBEZW5pcyA6IGZpcnN0IHN0ZXAgdG8gd3JpdGUgaW5vZGVzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcW54NF9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdodWlkLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjZGVmaW5lIFFOWDRfVkVSU0lPTiAgNAorI2RlZmluZSBRTlg0X0JNTkFNRSAgICIuYml0bWFwIgorCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgcW54NF9zb3BzOworCisjaWZkZWYgQ09ORklHX1FOWDRGU19SVworCitpbnQgcW54NF9zeW5jX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW50IGVyciA9IDA7CisjIGlmIDAKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCisgICAJYmggPSBxbng0X3VwZGF0ZV9pbm9kZShpbm9kZSk7CisJaWYgKGJoICYmIGJ1ZmZlcl9kaXJ0eShiaCkpCisJeworCQlzeW5jX2RpcnR5X2J1ZmZlcihiaCk7CisJCWlmIChidWZmZXJfcmVxKGJoKSAmJiAhYnVmZmVyX3VwdG9kYXRlKGJoKSkKKwkJeworCQkJcHJpbnRrICgiSU8gZXJyb3Igc3luY2luZyBxbng0IGlub2RlIFslczolMDhseF1cbiIsCisJCQkJaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubyk7CisJCQllcnIgPSAtMTsKKwkJfQorCSAgICAgICAgYnJlbHNlIChiaCk7CisJfSBlbHNlIGlmICghYmgpIHsKKwkJZXJyID0gLTE7CisJfQorIyBlbmRpZgorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgcW54NF9kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlRTlg0REVCVUcoKCJxbng0OiBkZWxldGluZyBpbm9kZSBbJWx1XVxuIiwgKHVuc2lnbmVkIGxvbmcpIGlub2RlLT5pX2lubykpOworCWlub2RlLT5pX3NpemUgPSAwOworCXFueDRfdHJ1bmNhdGUoaW5vZGUpOworCWxvY2tfa2VybmVsKCk7CisJcW54NF9mcmVlX2lub2RlKGlub2RlKTsKKwl1bmxvY2tfa2VybmVsKCk7Cit9CisKK3N0YXRpYyB2b2lkIHFueDRfd3JpdGVfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlsb2NrX2tlcm5lbCgpOworCVFOWDRERUJVRygoInFueDQ6IHdyaXRlX3N1cGVyXG4iKSk7CisJc2ItPnNfZGlydCA9IDA7CisJdW5sb2NrX2tlcm5lbCgpOworfQorCitzdGF0aWMgaW50IHFueDRfd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHVudXNlZCkKK3sKKwlzdHJ1Y3QgcW54NF9pbm9kZV9lbnRyeSAqcmF3X2lub2RlOworCWludCBibG9jaywgaW5vOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJaW5vID0gaW5vZGUtPmlfaW5vOworCisJUU5YNERFQlVHKCgicW54NDogd3JpdGUgaW5vZGUgMS5cbiIpKTsKKwlpZiAoaW5vZGUtPmlfbmxpbmsgPT0gMCkgeworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFpbm8pIHsKKwkJcHJpbnRrKCJxbng0OiBiYWQgaW5vZGUgbnVtYmVyIG9uIGRldiAlczogJWQgaXMgb3V0IG9mIHJhbmdlXG4iLAorCQkgICAgICAgaW5vZGUtPmlfc2ItPnNfaWQsIGlubyk7CisJCXJldHVybiAtRUlPOworCX0KKwlRTlg0REVCVUcoKCJxbng0OiB3cml0ZSBpbm9kZSAyLlxuIikpOworCWJsb2NrID0gaW5vIC8gUU5YNF9JTk9ERVNfUEVSX0JMT0NLOworCWxvY2tfa2VybmVsKCk7CisJaWYgKCEoYmggPSBzYl9icmVhZChpbm9kZS0+aV9zYiwgYmxvY2spKSkgeworCQlwcmludGsoInFueDQ6IG1ham9yIHByb2JsZW06IHVuYWJsZSB0byByZWFkIGlub2RlIGZyb20gZGV2ICIKKwkJICAgICAgICIlc1xuIiwgaW5vZGUtPmlfc2ItPnNfaWQpOworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRUlPOworCX0KKwlyYXdfaW5vZGUgPSAoKHN0cnVjdCBxbng0X2lub2RlX2VudHJ5ICopIGJoLT5iX2RhdGEpICsKKwkgICAgKGlubyAlIFFOWDRfSU5PREVTX1BFUl9CTE9DSyk7CisJcmF3X2lub2RlLT5kaV9tb2RlICA9IGNwdV90b19sZTE2KGlub2RlLT5pX21vZGUpOworCXJhd19pbm9kZS0+ZGlfdWlkICAgPSBjcHVfdG9fbGUxNihmc19oaWdoMmxvd3VpZChpbm9kZS0+aV91aWQpKTsKKwlyYXdfaW5vZGUtPmRpX2dpZCAgID0gY3B1X3RvX2xlMTYoZnNfaGlnaDJsb3dnaWQoaW5vZGUtPmlfZ2lkKSk7CisJcmF3X2lub2RlLT5kaV9ubGluayA9IGNwdV90b19sZTE2KGlub2RlLT5pX25saW5rKTsKKwlyYXdfaW5vZGUtPmRpX3NpemUgID0gY3B1X3RvX2xlMzIoaW5vZGUtPmlfc2l6ZSk7CisJcmF3X2lub2RlLT5kaV9tdGltZSA9IGNwdV90b19sZTMyKGlub2RlLT5pX210aW1lLnR2X3NlYyk7CisJcmF3X2lub2RlLT5kaV9hdGltZSA9IGNwdV90b19sZTMyKGlub2RlLT5pX2F0aW1lLnR2X3NlYyk7CisJcmF3X2lub2RlLT5kaV9jdGltZSA9IGNwdV90b19sZTMyKGlub2RlLT5pX2N0aW1lLnR2X3NlYyk7CisJcmF3X2lub2RlLT5kaV9maXJzdF94dG50Lnh0bnRfc2l6ZSA9IGNwdV90b19sZTMyKGlub2RlLT5pX2Jsb2Nrcyk7CisJbWFya19idWZmZXJfZGlydHkoYmgpOworCWJyZWxzZShiaCk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCisjZW5kaWYKKworc3RhdGljIHZvaWQgcW54NF9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CitzdGF0aWMgc3RydWN0IGlub2RlICpxbng0X2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpOworc3RhdGljIHZvaWQgcW54NF9kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworc3RhdGljIHZvaWQgcW54NF9yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKK3N0YXRpYyBpbnQgcW54NF9yZW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpOworc3RhdGljIGludCBxbng0X3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGtzdGF0ZnMgKik7CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyBxbng0X3NvcHMgPQoreworCS5hbGxvY19pbm9kZQk9IHFueDRfYWxsb2NfaW5vZGUsCisJLmRlc3Ryb3lfaW5vZGUJPSBxbng0X2Rlc3Ryb3lfaW5vZGUsCisJLnJlYWRfaW5vZGUJPSBxbng0X3JlYWRfaW5vZGUsCisJLnB1dF9zdXBlcgk9IHFueDRfcHV0X3N1cGVyLAorCS5zdGF0ZnMJCT0gcW54NF9zdGF0ZnMsCisJLnJlbW91bnRfZnMJPSBxbng0X3JlbW91bnQsCisjaWZkZWYgQ09ORklHX1FOWDRGU19SVworCS53cml0ZV9pbm9kZQk9IHFueDRfd3JpdGVfaW5vZGUsCisJLmRlbGV0ZV9pbm9kZQk9IHFueDRfZGVsZXRlX2lub2RlLAorCS53cml0ZV9zdXBlcgk9IHFueDRfd3JpdGVfc3VwZXIsCisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQgcW54NF9yZW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpCit7CisJc3RydWN0IHFueDRfc2JfaW5mbyAqcXM7CisKKwlxcyA9IHFueDRfc2Ioc2IpOworCXFzLT5WZXJzaW9uID0gUU5YNF9WRVJTSU9OOworI2lmbmRlZiBDT05GSUdfUU5YNEZTX1JXCisJKmZsYWdzIHw9IE1TX1JET05MWTsKKyNlbmRpZgorCWlmICgqZmxhZ3MgJiBNU19SRE9OTFkpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJbWFya19idWZmZXJfZGlydHkocXMtPnNiX2J1Zik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqcW54NF9nZXRibGsoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5yLAorCQkJCSAgICAgICBpbnQgY3JlYXRlKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqcmVzdWx0ID0gTlVMTDsKKworCWlmICggbnIgPj0gMCApCisJCW5yID0gcW54NF9ibG9ja19tYXAoIGlub2RlLCBuciApOworCWlmIChucikgeworCQlyZXN1bHQgPSBzYl9nZXRibGsoaW5vZGUtPmlfc2IsIG5yKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisJaWYgKCFjcmVhdGUpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorI2lmIDAKKwl0bXAgPSBxbng0X25ld19ibG9jayhpbm9kZS0+aV9zYik7CisJaWYgKCF0bXApIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJlc3VsdCA9IHNiX2dldGJsayhpbm9kZS0+aV9zYiwgdG1wKTsKKwlpZiAodHN0KSB7CisJCXFueDRfZnJlZV9ibG9jayhpbm9kZS0+aV9zYiwgdG1wKTsKKwkJYnJlbHNlKHJlc3VsdCk7CisJCWdvdG8gcmVwZWF0OworCX0KKwl0c3QgPSB0bXA7CisjZW5kaWYKKwlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RydWN0IGJ1ZmZlcl9oZWFkICpxbng0X2JyZWFkKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBibG9jaywgaW50IGNyZWF0ZSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCisJYmggPSBxbng0X2dldGJsayhpbm9kZSwgYmxvY2ssIGNyZWF0ZSk7CisJaWYgKCFiaCB8fCBidWZmZXJfdXB0b2RhdGUoYmgpKSB7CisJCXJldHVybiBiaDsKKwl9CisJbGxfcndfYmxvY2soUkVBRCwgMSwgJmJoKTsKKwl3YWl0X29uX2J1ZmZlcihiaCk7CisJaWYgKGJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKKwkJcmV0dXJuIGJoOworCX0KKwlicmVsc2UoYmgpOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgcW54NF9nZXRfYmxvY2soIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGlibG9jaywgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IGNyZWF0ZSApCit7CisJdW5zaWduZWQgbG9uZyBwaHlzOworCisJUU5YNERFQlVHKCgicW54NDogcW54NF9nZXRfYmxvY2sgaW5vZGU9WyVsZF0gaWJsb2NrPVslbGRdXG4iLGlub2RlLT5pX2lubyxpYmxvY2spKTsKKworCXBoeXMgPSBxbng0X2Jsb2NrX21hcCggaW5vZGUsIGlibG9jayApOworCWlmICggcGh5cyApIHsKKwkJLy8gbG9naWNhbCBibG9jayBpcyBiZWZvcmUgRU9GCisJCW1hcF9iaChiaCwgaW5vZGUtPmlfc2IsIHBoeXMpOworCX0gZWxzZSBpZiAoIGNyZWF0ZSApIHsKKwkJLy8gdG8gYmUgZG9uZS4KKwl9CisJcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGxvbmcgcW54NF9ibG9ja19tYXAoIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvbmcgaWJsb2NrICkKK3sKKwlpbnQgaXg7CisJbG9uZyBvZmZzZXQsIGlfeGJsazsKKwl1bnNpZ25lZCBsb25nIGJsb2NrID0gMDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwlzdHJ1Y3QgcW54NF94YmxrICp4YmxrID0gTlVMTDsKKwlzdHJ1Y3QgcW54NF9pbm9kZV9lbnRyeSAqcW54NF9pbm9kZSA9IHFueDRfcmF3X2lub2RlKGlub2RlKTsKKwlxbng0X254dG50X3Qgbnh0bnQgPSBsZTE2X3RvX2NwdShxbng0X2lub2RlLT5kaV9udW1feHRudHMpOworCisJaWYgKCBpYmxvY2sgPCBsZTMyX3RvX2NwdShxbng0X2lub2RlLT5kaV9maXJzdF94dG50Lnh0bnRfc2l6ZSkgKSB7CisJCS8vIGlibG9jayBpcyBpbiB0aGUgZmlyc3QgZXh0ZW50LiBUaGlzIGlzIGVhc3kuCisJCWJsb2NrID0gbGUzMl90b19jcHUocW54NF9pbm9kZS0+ZGlfZmlyc3RfeHRudC54dG50X2JsaykgKyBpYmxvY2sgLSAxOworCX0gZWxzZSB7CisJCS8vIGlibG9jayBpcyBiZXlvbmQgZmlyc3QgZXh0ZW50LiBXZSBoYXZlIHRvIGZvbGxvdyB0aGUgZXh0ZW50IGNoYWluLgorCQlpX3hibGsgPSBsZTMyX3RvX2NwdShxbng0X2lub2RlLT5kaV94YmxrKTsKKwkJb2Zmc2V0ID0gaWJsb2NrIC0gbGUzMl90b19jcHUocW54NF9pbm9kZS0+ZGlfZmlyc3RfeHRudC54dG50X3NpemUpOworCQlpeCA9IDA7CisJCXdoaWxlICggLS1ueHRudCA+IDAgKSB7CisJCQlpZiAoIGl4ID09IDAgKSB7CisJCQkJLy8gcmVhZCBuZXh0IHh0bnQgYmxvY2suCisJCQkJYmggPSBzYl9icmVhZChpbm9kZS0+aV9zYiwgaV94YmxrIC0gMSk7CisJCQkJaWYgKCAhYmggKSB7CisJCQkJCVFOWDRERUJVRygoInFueDQ6IEkvTyBlcnJvciByZWFkaW5nIHh0bnQgYmxvY2sgWyVsZF0pXG4iLCBpX3hibGsgLSAxKSk7CisJCQkJCXJldHVybiAtRUlPOworCQkJCX0KKwkJCQl4YmxrID0gKHN0cnVjdCBxbng0X3hibGsqKWJoLT5iX2RhdGE7CisJCQkJaWYgKCBtZW1jbXAoIHhibGstPnhibGtfc2lnbmF0dXJlLCAiSWFtWGJsayIsIDcgKSApIHsKKwkJCQkJUU5YNERFQlVHKCgicW54NDogYmxvY2sgYXQgJWxkIGlzIG5vdCBhIHZhbGlkIHh0bnRcbiIsIHFueDRfaW5vZGUtPmlfeGJsaykpOworCQkJCQlyZXR1cm4gLUVJTzsKKwkJCQl9CisJCQl9CisJCQlpZiAoIG9mZnNldCA8IGxlMzJfdG9fY3B1KHhibGstPnhibGtfeHRudHNbaXhdLnh0bnRfc2l6ZSkgKSB7CisJCQkJLy8gZ290IGl0IQorCQkJCWJsb2NrID0gbGUzMl90b19jcHUoeGJsay0+eGJsa194dG50c1tpeF0ueHRudF9ibGspICsgb2Zmc2V0IC0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW9mZnNldCAtPSBsZTMyX3RvX2NwdSh4YmxrLT54YmxrX3h0bnRzW2l4XS54dG50X3NpemUpOworCQkJaWYgKCArK2l4ID49IHhibGstPnhibGtfbnVtX3h0bnRzICkgeworCQkJCWlfeGJsayA9IGxlMzJfdG9fY3B1KHhibGstPnhibGtfbmV4dF94YmxrKTsKKwkJCQlpeCA9IDA7CisJCQkJYnJlbHNlKCBiaCApOworCQkJCWJoID0gTlVMTDsKKwkJCX0KKwkJfQorCQlpZiAoIGJoICkKKwkJCWJyZWxzZSggYmggKTsKKwl9CisKKwlRTlg0REVCVUcoKCJxbng0OiBtYXBwaW5nIGJsb2NrICVsZCBvZiBpbm9kZSAlbGQgPSAlbGRcbiIsaWJsb2NrLGlub2RlLT5pX2lubyxibG9jaykpOworCXJldHVybiBibG9jazsKK30KKworc3RhdGljIGludCBxbng0X3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQoreworCWxvY2tfa2VybmVsKCk7CisKKwlidWYtPmZfdHlwZSAgICA9IHNiLT5zX21hZ2ljOworCWJ1Zi0+Zl9ic2l6ZSAgID0gc2ItPnNfYmxvY2tzaXplOworCWJ1Zi0+Zl9ibG9ja3MgID0gbGUzMl90b19jcHUocW54NF9zYihzYiktPkJpdE1hcC0+ZGlfc2l6ZSkgKiA4OworCWJ1Zi0+Zl9iZnJlZSAgID0gcW54NF9jb3VudF9mcmVlX2Jsb2NrcyhzYik7CisJYnVmLT5mX2JhdmFpbCAgPSBidWYtPmZfYmZyZWU7CisJYnVmLT5mX25hbWVsZW4gPSBRTlg0X05BTUVfTUFYOworCisJdW5sb2NrX2tlcm5lbCgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDaGVjayB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIGZpbGVzeXN0ZW0gdG8gbWFrZSBzdXJlCisgKiBpdCByZWFsbHkgX2lzXyBhIHFueDQgZmlsZXN5c3RlbSwgYW5kIHRvIGNoZWNrIHRoZSBzaXplCisgKiBvZiB0aGUgZGlyZWN0b3J5IGVudHJ5LgorICovCitzdGF0aWMgY29uc3QgY2hhciAqcW54NF9jaGVja3Jvb3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBxbng0X2lub2RlX2VudHJ5ICpyb290ZGlyOworCWludCByZCwgcmw7CisJaW50IGksIGo7CisJaW50IGZvdW5kID0gMDsKKworCWlmICgqKHFueDRfc2Ioc2IpLT5zYi0+Um9vdERpci5kaV9mbmFtZSkgIT0gJy8nKSB7CisJCXJldHVybiAibm8gcW54NCBmaWxlc3lzdGVtIChubyByb290IGRpcikuIjsKKwl9IGVsc2UgeworCQlRTlg0REVCVUcoKCJRTlg0IGZpbGVzeXN0ZW0gZm91bmQgb24gZGV2ICVzLlxuIiwgc2ItPnNfaWQpKTsKKwkJcmQgPSBsZTMyX3RvX2NwdShxbng0X3NiKHNiKS0+c2ItPlJvb3REaXIuZGlfZmlyc3RfeHRudC54dG50X2JsaykgLSAxOworCQlybCA9IGxlMzJfdG9fY3B1KHFueDRfc2Ioc2IpLT5zYi0+Um9vdERpci5kaV9maXJzdF94dG50Lnh0bnRfc2l6ZSk7CisJCWZvciAoaiA9IDA7IGogPCBybDsgaisrKSB7CisJCQliaCA9IHNiX2JyZWFkKHNiLCByZCArIGopOwkvKiByb290IGRpciwgZmlyc3QgYmxvY2sgKi8KKwkJCWlmIChiaCA9PSBOVUxMKSB7CisJCQkJcmV0dXJuICJ1bmFibGUgdG8gcmVhZCByb290IGVudHJ5LiI7CisJCQl9CisJCQlmb3IgKGkgPSAwOyBpIDwgUU5YNF9JTk9ERVNfUEVSX0JMT0NLOyBpKyspIHsKKwkJCQlyb290ZGlyID0gKHN0cnVjdCBxbng0X2lub2RlX2VudHJ5ICopIChiaC0+Yl9kYXRhICsgaSAqIFFOWDRfRElSX0VOVFJZX1NJWkUpOworCQkJCWlmIChyb290ZGlyLT5kaV9mbmFtZSAhPSBOVUxMKSB7CisJCQkJCVFOWDRERUJVRygoIlJvb3RkaXIgZW50cnkgZm91bmQgOiBbJXNdXG4iLCByb290ZGlyLT5kaV9mbmFtZSkpOworCQkJCQlpZiAoIXN0cm5jbXAocm9vdGRpci0+ZGlfZm5hbWUsIFFOWDRfQk1OQU1FLCBzaXplb2YgUU5YNF9CTU5BTUUpKSB7CisJCQkJCQlmb3VuZCA9IDE7CisJCQkJCQlxbng0X3NiKHNiKS0+Qml0TWFwID0ga21hbGxvYyggc2l6ZW9mKCBzdHJ1Y3QgcW54NF9pbm9kZV9lbnRyeSApLCBHRlBfS0VSTkVMICk7CisJCQkJCQlpZiAoIXFueDRfc2Ioc2IpLT5CaXRNYXApIHsKKwkJCQkJCQlicmVsc2UgKGJoKTsKKwkJCQkJCQlyZXR1cm4gIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBiaXRtYXAgaW5vZGUiOworCQkJCQkJfQorCQkJCQkJbWVtY3B5KCBxbng0X3NiKHNiKS0+Qml0TWFwLCByb290ZGlyLCBzaXplb2YoIHN0cnVjdCBxbng0X2lub2RlX2VudHJ5ICkgKTsJLyoga2VlcCBiaXRtYXAgaW5vZGUga25vd24gKi8KKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYnJlbHNlKGJoKTsKKwkJCWlmIChmb3VuZCAhPSAwKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGZvdW5kID09IDApIHsKKwkJCXJldHVybiAiYml0bWFwIGZpbGUgbm90IGZvdW5kLiI7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgcW54NF9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBpbm9kZSAqcm9vdDsKKwljb25zdCBjaGFyICplcnJtc2c7CisJc3RydWN0IHFueDRfc2JfaW5mbyAqcXM7CisKKwlxcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBxbng0X3NiX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXFzKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzLT5zX2ZzX2luZm8gPSBxczsKKwltZW1zZXQocXMsIDAsIHNpemVvZihzdHJ1Y3QgcW54NF9zYl9pbmZvKSk7CisKKwlzYl9zZXRfYmxvY2tzaXplKHMsIFFOWDRfQkxPQ0tfU0laRSk7CisKKwkvKiBDaGVjayB0aGUgc3VwZXJibG9jayBzaWduYXR1cmUuIFNpbmNlIHRoZSBxbng0IGNvZGUgaXMKKwkgICBkYW5nZXJvdXMsIHdlIHNob3VsZCBsZWF2ZSBhcyBxdWlja2x5IGFzIHBvc3NpYmxlCisJICAgaWYgd2UgZG9uJ3QgYmVsb25nIGhlcmUuLi4gKi8KKwliaCA9IHNiX2JyZWFkKHMsIDEpOworCWlmICghYmgpIHsKKwkJcHJpbnRrKCJxbng0OiB1bmFibGUgdG8gcmVhZCB0aGUgc3VwZXJibG9ja1xuIik7CisJCWdvdG8gb3V0bm9iaDsKKwl9CisJaWYgKCBsZTMyX3RvX2NwdSggKihfX3UzMiopYmgtPmJfZGF0YSApICE9IFFOWDRfU1VQRVJfTUFHSUMgKSB7CisJCWlmICghc2lsZW50KQorCQkJcHJpbnRrKCJxbng0OiB3cm9uZyBmc2lkIGluIHN1cGVyYmxvY2suXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCXMtPnNfb3AgPSAmcW54NF9zb3BzOworCXMtPnNfbWFnaWMgPSBRTlg0X1NVUEVSX01BR0lDOworI2lmbmRlZiBDT05GSUdfUU5YNEZTX1JXCisJcy0+c19mbGFncyB8PSBNU19SRE9OTFk7CS8qIFl1cCwgcmVhZC1vbmx5IHlldCAqLworI2VuZGlmCisJcW54NF9zYihzKS0+c2JfYnVmID0gYmg7CisJcW54NF9zYihzKS0+c2IgPSAoc3RydWN0IHFueDRfc3VwZXJfYmxvY2sgKikgYmgtPmJfZGF0YTsKKworCisgCS8qIGNoZWNrIGJlZm9yZSBhbGxvY2F0aW5nIGRlbnRyaWVzLCBpbm9kZXMsIC4uICovCisJZXJybXNnID0gcW54NF9jaGVja3Jvb3Qocyk7CisJaWYgKGVycm1zZyAhPSBOVUxMKSB7CisgCQlpZiAoIXNpbGVudCkKKyAJCQlwcmludGsoInFueDQ6ICVzXG4iLCBlcnJtc2cpOworCQlnb3RvIG91dDsKKwl9CisKKyAJLyogZG9lcyByb290IG5vdCBoYXZlIGlub2RlIG51bWJlciBRTlg0X1JPT1RfSU5PID8/ICovCisgCXJvb3QgPSBpZ2V0KHMsIFFOWDRfUk9PVF9JTk8gKiBRTlg0X0lOT0RFU19QRVJfQkxPQ0spOworIAlpZiAoIXJvb3QpIHsKKyAJCXByaW50aygicW54NDogZ2V0IGlub2RlIGZhaWxlZFxuIik7CisgCQlnb3RvIG91dDsKKyAJfQorCisgCXMtPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290KTsKKyAJaWYgKHMtPnNfcm9vdCA9PSBOVUxMKQorIAkJZ290byBvdXRpOworCisJYnJlbHNlKGJoKTsKKworCXJldHVybiAwOworCisgICAgICBvdXRpOgorCWlwdXQocm9vdCk7CisgICAgICBvdXQ6CisJYnJlbHNlKGJoKTsKKyAgICAgIG91dG5vYmg6CisJa2ZyZWUocXMpOworCXMtPnNfZnNfaW5mbyA9IE5VTEw7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyB2b2lkIHFueDRfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IHFueDRfc2JfaW5mbyAqcXMgPSBxbng0X3NiKHNiKTsKKwlrZnJlZSggcXMtPkJpdE1hcCApOworCWtmcmVlKCBxcyApOworCXNiLT5zX2ZzX2luZm8gPSBOVUxMOworCXJldHVybjsKK30KKworc3RhdGljIGludCBxbng0X3dyaXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7CisJcmV0dXJuIGJsb2NrX3dyaXRlX2Z1bGxfcGFnZShwYWdlLHFueDRfZ2V0X2Jsb2NrLCB3YmMpOworfQorc3RhdGljIGludCBxbng0X3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlyZXR1cm4gYmxvY2tfcmVhZF9mdWxsX3BhZ2UocGFnZSxxbng0X2dldF9ibG9jayk7Cit9CitzdGF0aWMgaW50IHFueDRfcHJlcGFyZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkgICAgICB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykKK3sKKwlzdHJ1Y3QgcW54NF9pbm9kZV9pbmZvICpxbng0X2lub2RlID0gcW54NF9pKHBhZ2UtPm1hcHBpbmctPmhvc3QpOworCXJldHVybiBjb250X3ByZXBhcmVfd3JpdGUocGFnZSwgZnJvbSwgdG8sIHFueDRfZ2V0X2Jsb2NrLAorCQkJCSAgJnFueDRfaW5vZGUtPm1tdV9wcml2YXRlKTsKK30KK3N0YXRpYyBzZWN0b3JfdCBxbng0X2JtYXAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHNlY3Rvcl90IGJsb2NrKQoreworCXJldHVybiBnZW5lcmljX2Jsb2NrX2JtYXAobWFwcGluZyxibG9jayxxbng0X2dldF9ibG9jayk7Cit9CitzdGF0aWMgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBxbng0X2FvcHMgPSB7CisJLnJlYWRwYWdlCT0gcW54NF9yZWFkcGFnZSwKKwkud3JpdGVwYWdlCT0gcW54NF93cml0ZXBhZ2UsCisJLnN5bmNfcGFnZQk9IGJsb2NrX3N5bmNfcGFnZSwKKwkucHJlcGFyZV93cml0ZQk9IHFueDRfcHJlcGFyZV93cml0ZSwKKwkuY29tbWl0X3dyaXRlCT0gZ2VuZXJpY19jb21taXRfd3JpdGUsCisJLmJtYXAJCT0gcW54NF9ibWFwCit9OworCitzdGF0aWMgdm9pZCBxbng0X3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBxbng0X2lub2RlX2VudHJ5ICpyYXdfaW5vZGU7CisJaW50IGJsb2NrLCBpbm87CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCXN0cnVjdCBxbng0X2lub2RlX2VudHJ5ICpxbng0X2lub2RlID0gcW54NF9yYXdfaW5vZGUoaW5vZGUpOworCisJaW5vID0gaW5vZGUtPmlfaW5vOworCWlub2RlLT5pX21vZGUgPSAwOworCisJUU5YNERFQlVHKCgiUmVhZGluZyBpbm9kZSA6IFslZF1cbiIsIGlubykpOworCWlmICghaW5vKSB7CisJCXByaW50aygicW54NDogYmFkIGlub2RlIG51bWJlciBvbiBkZXYgJXM6ICVkIGlzIG91dCBvZiByYW5nZVxuIiwKKwkJICAgICAgIHNiLT5zX2lkLCBpbm8pOworCQlyZXR1cm47CisJfQorCWJsb2NrID0gaW5vIC8gUU5YNF9JTk9ERVNfUEVSX0JMT0NLOworCisJaWYgKCEoYmggPSBzYl9icmVhZChzYiwgYmxvY2spKSkgeworCQlwcmludGsoInFueDQ6IG1ham9yIHByb2JsZW06IHVuYWJsZSB0byByZWFkIGlub2RlIGZyb20gZGV2ICIKKwkJICAgICAgICIlc1xuIiwgc2ItPnNfaWQpOworCQlyZXR1cm47CisJfQorCXJhd19pbm9kZSA9ICgoc3RydWN0IHFueDRfaW5vZGVfZW50cnkgKikgYmgtPmJfZGF0YSkgKworCSAgICAoaW5vICUgUU5YNF9JTk9ERVNfUEVSX0JMT0NLKTsKKworCWlub2RlLT5pX21vZGUgICAgPSBsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmRpX21vZGUpOworCWlub2RlLT5pX3VpZCAgICAgPSAodWlkX3QpbGUxNl90b19jcHUocmF3X2lub2RlLT5kaV91aWQpOworCWlub2RlLT5pX2dpZCAgICAgPSAoZ2lkX3QpbGUxNl90b19jcHUocmF3X2lub2RlLT5kaV9naWQpOworCWlub2RlLT5pX25saW5rICAgPSBsZTE2X3RvX2NwdShyYXdfaW5vZGUtPmRpX25saW5rKTsKKwlpbm9kZS0+aV9zaXplICAgID0gbGUzMl90b19jcHUocmF3X2lub2RlLT5kaV9zaXplKTsKKwlpbm9kZS0+aV9tdGltZS50dl9zZWMgICA9IGxlMzJfdG9fY3B1KHJhd19pbm9kZS0+ZGlfbXRpbWUpOworCWlub2RlLT5pX210aW1lLnR2X25zZWMgPSAwOworCWlub2RlLT5pX2F0aW1lLnR2X3NlYyAgID0gbGUzMl90b19jcHUocmF3X2lub2RlLT5kaV9hdGltZSk7CisJaW5vZGUtPmlfYXRpbWUudHZfbnNlYyA9IDA7CisJaW5vZGUtPmlfY3RpbWUudHZfc2VjICAgPSBsZTMyX3RvX2NwdShyYXdfaW5vZGUtPmRpX2N0aW1lKTsKKwlpbm9kZS0+aV9jdGltZS50dl9uc2VjID0gMDsKKwlpbm9kZS0+aV9ibG9ja3MgID0gbGUzMl90b19jcHUocmF3X2lub2RlLT5kaV9maXJzdF94dG50Lnh0bnRfc2l6ZSk7CisJaW5vZGUtPmlfYmxrc2l6ZSA9IFFOWDRfRElSX0VOVFJZX1NJWkU7CisKKwltZW1jcHkocW54NF9pbm9kZSwgcmF3X2lub2RlLCBRTlg0X0RJUl9FTlRSWV9TSVpFKTsKKwlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgeworCQlpbm9kZS0+aV9vcCA9ICZxbng0X2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJnFueDRfZmlsZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZxbng0X2FvcHM7CisJCXFueDRfaShpbm9kZSktPm1tdV9wcml2YXRlID0gaW5vZGUtPmlfc2l6ZTsKKwl9IGVsc2UgaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaW5vZGUtPmlfb3AgPSAmcW54NF9kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJnFueDRfZGlyX29wZXJhdGlvbnM7CisJfSBlbHNlIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKSB7CisJCWlub2RlLT5pX29wID0gJnBhZ2Vfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZxbng0X2FvcHM7CisJCXFueDRfaShpbm9kZSktPm1tdV9wcml2YXRlID0gaW5vZGUtPmlfc2l6ZTsKKwl9IGVsc2UKKwkJcHJpbnRrKCJxbng0OiBiYWQgaW5vZGUgJWQgb24gZGV2ICVzXG4iLGlubyxzYi0+c19pZCk7CisJYnJlbHNlKGJoKTsKK30KKworc3RhdGljIGttZW1fY2FjaGVfdCAqcW54NF9pbm9kZV9jYWNoZXA7CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKnFueDRfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgcW54NF9pbm9kZV9pbmZvICplaTsKKwllaSA9IGttZW1fY2FjaGVfYWxsb2MocW54NF9pbm9kZV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwlpZiAoIWVpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gJmVpLT52ZnNfaW5vZGU7Cit9CisKK3N0YXRpYyB2b2lkIHFueDRfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWttZW1fY2FjaGVfZnJlZShxbng0X2lub2RlX2NhY2hlcCwgcW54NF9pKGlub2RlKSk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICpmb28sIGttZW1fY2FjaGVfdCAqIGNhY2hlcCwKKwkJICAgICAgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgcW54NF9pbm9kZV9pbmZvICplaSA9IChzdHJ1Y3QgcW54NF9pbm9kZV9pbmZvICopIGZvbzsKKworCWlmICgoZmxhZ3MgJiAoU0xBQl9DVE9SX1ZFUklGWSB8IFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CisJICAgIFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikKKwkJaW5vZGVfaW5pdF9vbmNlKCZlaS0+dmZzX2lub2RlKTsKK30KKworc3RhdGljIGludCBpbml0X2lub2RlY2FjaGUodm9pZCkKK3sKKwlxbng0X2lub2RlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJxbng0X2lub2RlX2NhY2hlIiwKKwkJCQkJICAgICBzaXplb2Yoc3RydWN0IHFueDRfaW5vZGVfaW5mbyksCisJCQkJCSAgICAgMCwgU0xBQl9SRUNMQUlNX0FDQ09VTlQsCisJCQkJCSAgICAgaW5pdF9vbmNlLCBOVUxMKTsKKwlpZiAocW54NF9pbm9kZV9jYWNoZXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfaW5vZGVjYWNoZSh2b2lkKQoreworCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3kocW54NF9pbm9kZV9jYWNoZXApKQorCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAicW54NF9pbm9kZV9jYWNoZTogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOworfQorCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpxbng0X2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoreworCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIHFueDRfZmlsbF9zdXBlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSBxbng0X2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJxbng0IiwKKwkuZ2V0X3NiCQk9IHFueDRfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9ibG9ja19zdXBlciwKKwkuZnNfZmxhZ3MJPSBGU19SRVFVSVJFU19ERVYsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3FueDRfZnModm9pZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gaW5pdF9pbm9kZWNhY2hlKCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnFueDRfZnNfdHlwZSk7CisJaWYgKGVycikgeworCQlkZXN0cm95X2lub2RlY2FjaGUoKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlwcmludGsoIlFOWDQgZmlsZXN5c3RlbSAwLjIuMyByZWdpc3RlcmVkLlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X3FueDRfZnModm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnFueDRfZnNfdHlwZSk7CisJZGVzdHJveV9pbm9kZWNhY2hlKCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfcW54NF9mcykKK21vZHVsZV9leGl0KGV4aXRfcW54NF9mcykKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwpkaWZmIC0tZ2l0IGEvZnMvcW54NC9uYW1laS5jIGIvZnMvcW54NC9uYW1laS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZjQ5NTEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9xbng0L25hbWVpLmMKQEAgLTAsMCArMSwyNDkgQEAKKy8qIAorICogUU5YNCBmaWxlIHN5c3RlbSwgTGludXggaW1wbGVtZW50YXRpb24uCisgKiAKKyAqIFZlcnNpb24gOiAwLjIuMQorICogCisgKiBVc2luZyBwYXJ0cyBvZiB0aGUgeGlhZnMgZmlsZXN5c3RlbS4KKyAqIAorICogSGlzdG9yeSA6CisgKiAKKyAqIDAxLTA2LTE5OTggYnkgUmljaGFyZCBGcm93aWpuIDogZmlyc3QgcmVsZWFzZS4KKyAqIDIxLTA2LTE5OTggYnkgRnJhbmsgRGVuaXMgOiBkY2FjaGUgc3VwcG9ydCwgZml4ZWQgZXJyb3IgY29kZXMuCisgKiAwNC0wNy0xOTk4IGJ5IEZyYW5rIERlbmlzIDogZmlyc3Qgc3RlcCBmb3Igcm1kaXIvdW5saW5rLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9xbng0X2ZzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisKKworLyoKKyAqIGNoZWNrIGlmIHRoZSBmaWxlbmFtZSBpcyBjb3JyZWN0LiBGb3Igc29tZSBvYnNjdXJlIHJlYXNvbiwgcW54IHdyaXRlcyBhCisgKiBuZXcgZmlsZSB0d2ljZSBpbiB0aGUgZGlyZWN0b3J5IGVudHJ5LCBmaXJzdCB3aXRoIGFsbCBwb3NzaWJsZSBvcHRpb25zIGF0IDAKKyAqIGFuZCBmb3IgYSBzZWNvbmQgdGltZSB0aGUgd2F5IGl0IGlzLCB0aGV5IHdhbnQgdXMgbm90IHRvIGFjY2VzcyB0aGUgcW54CisgKiBmaWxlc3lzdGVtIHdoZW4gd2hlIGFyZSB1c2luZyBsaW51eC4KKyAqLworc3RhdGljIGludCBxbng0X21hdGNoKGludCBsZW4sIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIHVuc2lnbmVkIGxvbmcgKm9mZnNldCkKK3sKKwlzdHJ1Y3QgcW54NF9pbm9kZV9lbnRyeSAqZGU7CisJaW50IG5hbWVsZW4sIHRoaXNsZW47CisKKwlpZiAoYmggPT0gTlVMTCkgeworCQlwcmludGsoInFueDQ6IG1hdGNoaW5nIHVuYXNzaWduZWQgYnVmZmVyICFcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJZGUgPSAoc3RydWN0IHFueDRfaW5vZGVfZW50cnkgKikgKGJoLT5iX2RhdGEgKyAqb2Zmc2V0KTsKKwkqb2Zmc2V0ICs9IFFOWDRfRElSX0VOVFJZX1NJWkU7CisJaWYgKChkZS0+ZGlfc3RhdHVzICYgUU5YNF9GSUxFX0xJTkspICE9IDApIHsKKwkJbmFtZWxlbiA9IFFOWDRfTkFNRV9NQVg7CisJfSBlbHNlIHsKKwkJbmFtZWxlbiA9IFFOWDRfU0hPUlRfTkFNRV9NQVg7CisJfQorCS8qICIiIG1lYW5zICIuIiAtLS0+IHNvIHBhdGhzIGxpa2UgIi91c3IvbGliLy9saWJjLmEiIHdvcmsgKi8KKwlpZiAoIWxlbiAmJiAoZGUtPmRpX2ZuYW1lWzBdID09ICcuJykgJiYgKGRlLT5kaV9mbmFtZVsxXSA9PSAnXDAnKSkgeworCQlyZXR1cm4gMTsKKwl9CisJdGhpc2xlbiA9IHN0cmxlbiggZGUtPmRpX2ZuYW1lICk7CisJaWYgKCB0aGlzbGVuID4gbmFtZWxlbiApCisJCXRoaXNsZW4gPSBuYW1lbGVuOworCWlmIChsZW4gIT0gdGhpc2xlbikgeworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHN0cm5jbXAobmFtZSwgZGUtPmRpX2ZuYW1lLCBsZW4pID09IDApIHsKKwkJaWYgKChkZS0+ZGlfc3RhdHVzICYgKFFOWDRfRklMRV9VU0VEfFFOWDRfRklMRV9MSU5LKSkgIT0gMCkgeworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnFueDRfZmluZF9lbnRyeShpbnQgbGVuLCBzdHJ1Y3QgaW5vZGUgKmRpciwKKwkgICBjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgcW54NF9pbm9kZV9lbnRyeSAqKnJlc19kaXIsIGludCAqaW5vKQoreworCXVuc2lnbmVkIGxvbmcgYmxvY2ssIG9mZnNldCwgYmxrb2ZzOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwkqcmVzX2RpciA9IE5VTEw7CisJaWYgKCFkaXItPmlfc2IpIHsKKwkJcHJpbnRrKCJxbng0OiBubyBzdXBlcmJsb2NrIG9uIGRpci5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYmggPSBOVUxMOworCWJsb2NrID0gb2Zmc2V0ID0gYmxrb2ZzID0gMDsKKwl3aGlsZSAoYmxrb2ZzICogUU5YNF9CTE9DS19TSVpFICsgb2Zmc2V0IDwgZGlyLT5pX3NpemUpIHsKKwkJaWYgKCFiaCkgeworCQkJYmggPSBxbng0X2JyZWFkKGRpciwgYmxrb2ZzLCAwKTsKKwkJCWlmICghYmgpIHsKKwkJCQlibGtvZnMrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQkqcmVzX2RpciA9IChzdHJ1Y3QgcW54NF9pbm9kZV9lbnRyeSAqKSAoYmgtPmJfZGF0YSArIG9mZnNldCk7CisJCWlmIChxbng0X21hdGNoKGxlbiwgbmFtZSwgYmgsICZvZmZzZXQpKSB7CisJCQlibG9jayA9IHFueDRfYmxvY2tfbWFwKCBkaXIsIGJsa29mcyApOworCQkJKmlubyA9IGJsb2NrICogUU5YNF9JTk9ERVNfUEVSX0JMT0NLICsKKwkJCSAgICAob2Zmc2V0IC8gUU5YNF9ESVJfRU5UUllfU0laRSkgLSAxOworCQkJcmV0dXJuIGJoOworCQl9CisJCWlmIChvZmZzZXQgPCBiaC0+Yl9zaXplKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlicmVsc2UoYmgpOworCQliaCA9IE5VTEw7CisJCW9mZnNldCA9IDA7CisJCWJsa29mcysrOworCX0KKwlicmVsc2UoYmgpOworCSpyZXNfZGlyID0gTlVMTDsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGRlbnRyeSAqIHFueDRfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWludCBpbm87CisJc3RydWN0IHFueDRfaW5vZGVfZW50cnkgKmRlOworCXN0cnVjdCBxbng0X2xpbmtfaW5mbyAqbG5rOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJY29uc3QgY2hhciAqbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7CisJaW50IGxlbiA9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKKwlzdHJ1Y3QgaW5vZGUgKmZvdW5kaW5vZGUgPSBOVUxMOworCisJbG9ja19rZXJuZWwoKTsKKwlpZiAoIShiaCA9IHFueDRfZmluZF9lbnRyeShsZW4sIGRpciwgbmFtZSwgJmRlLCAmaW5vKSkpCisJCWdvdG8gb3V0OworCS8qIFRoZSBlbnRyeSBpcyBsaW5rZWQsIGxldCdzIGdldCB0aGUgcmVhbCBpbmZvICovCisJaWYgKChkZS0+ZGlfc3RhdHVzICYgUU5YNF9GSUxFX0xJTkspID09IFFOWDRfRklMRV9MSU5LKSB7CisJCWxuayA9IChzdHJ1Y3QgcW54NF9saW5rX2luZm8gKikgZGU7CisJCWlubyA9IChsZTMyX3RvX2NwdShsbmstPmRsX2lub2RlX2JsaykgLSAxKSAqCisgICAgICAgICAgICAgICAgICAgIFFOWDRfSU5PREVTX1BFUl9CTE9DSyArCisJCSAgICBsbmstPmRsX2lub2RlX25keDsKKwl9CisJYnJlbHNlKGJoKTsKKworCWlmICgoZm91bmRpbm9kZSA9IGlnZXQoZGlyLT5pX3NiLCBpbm8pKSA9PSBOVUxMKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJUU5YNERFQlVHKCgicW54NDogbG9va3VwLT5pZ2V0IC0+IE5VTExcbiIpKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CisJfQorb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlkX2FkZChkZW50cnksIGZvdW5kaW5vZGUpOworCisJcmV0dXJuIE5VTEw7Cit9CisKKyNpZmRlZiBDT05GSUdfUU5YNEZTX1JXCitpbnQgcW54NF9jcmVhdGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsCisJCXN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCVFOWDRERUJVRygoInFueDQ6IHFueDRfY3JlYXRlXG4iKSk7CisJaWYgKGRpciA9PSBOVUxMKSB7CisJCXJldHVybiAtRU5PRU5UOworCX0KKwlyZXR1cm4gLUVOT1NQQzsKK30KKworaW50IHFueDRfcm1kaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCBxbng0X2lub2RlX2VudHJ5ICpkZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWludCByZXR2YWw7CisJaW50IGlubzsKKworCVFOWDRERUJVRygoInFueDQ6IHFueDRfcm1kaXIgWyVzXVxuIiwgZGVudHJ5LT5kX25hbWUubmFtZSkpOworCWxvY2tfa2VybmVsKCk7CisJYmggPSBxbng0X2ZpbmRfZW50cnkoZGVudHJ5LT5kX25hbWUubGVuLCBkaXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkgICAgICZkZSwgJmlubyk7CisJaWYgKGJoID09IE5VTEwpIHsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaWYgKGlub2RlLT5pX2lubyAhPSBpbm8pIHsKKwkJcmV0dmFsID0gLUVJTzsKKwkJZ290byBlbmRfcm1kaXI7CisJfQorI2lmIDAKKwlpZiAoIWVtcHR5X2Rpcihpbm9kZSkpIHsKKwkJcmV0dmFsID0gLUVOT1RFTVBUWTsKKwkJZ290byBlbmRfcm1kaXI7CisJfQorI2VuZGlmCisJaWYgKGlub2RlLT5pX25saW5rICE9IDIpIHsKKwkJUU5YNERFQlVHKCgiZW1wdHkgZGlyZWN0b3J5IGhhcyBubGluayE9MiAoJWQpXG4iLCBpbm9kZS0+aV9ubGluaykpOworCX0KKwlRTlg0REVCVUcoKCJxbng0OiBkZWxldGluZyBkaXJlY3RvcnlcbiIpKTsKKwlkZS0+ZGlfc3RhdHVzID0gMDsKKwltZW1zZXQoZGUtPmRpX2ZuYW1lLCAwLCBzaXplb2YgZGUtPmRpX2ZuYW1lKTsKKwlkZS0+ZGlfbW9kZSA9IDA7CisJbWFya19idWZmZXJfZGlydHkoYmgpOworCWlub2RlLT5pX25saW5rID0gMDsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwlpbm9kZS0+aV9jdGltZSA9IGRpci0+aV9jdGltZSA9IGRpci0+aV9tdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJZGlyLT5pX25saW5rLS07CisJbWFya19pbm9kZV9kaXJ0eShkaXIpOworCXJldHZhbCA9IDA7CisKKyAgICAgIGVuZF9ybWRpcjoKKwlicmVsc2UoYmgpOworCisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBxbng0X3VubGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJc3RydWN0IHFueDRfaW5vZGVfZW50cnkgKmRlOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IHJldHZhbDsKKwlpbnQgaW5vOworCisJUU5YNERFQlVHKCgicW54NDogcW54NF91bmxpbmsgWyVzXVxuIiwgZGVudHJ5LT5kX25hbWUubmFtZSkpOworCWxvY2tfa2VybmVsKCk7CisJYmggPSBxbng0X2ZpbmRfZW50cnkoZGVudHJ5LT5kX25hbWUubGVuLCBkaXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkgICAgICZkZSwgJmlubyk7CisJaWYgKGJoID09IE5VTEwpIHsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaWYgKGlub2RlLT5pX2lubyAhPSBpbm8pIHsKKwkJcmV0dmFsID0gLUVJTzsKKwkJZ290byBlbmRfdW5saW5rOworCX0KKwlyZXR2YWwgPSAtRVBFUk07CisJaWYgKCFpbm9kZS0+aV9ubGluaykgeworCQlRTlg0REVCVUcoKCJEZWxldGluZyBub25leGlzdGVudCBmaWxlICglczolbHUpLCAlZFxuIiwKKwkJCSAgIGlub2RlLT5pX3NiLT5zX2lkLAorCQkJICAgaW5vZGUtPmlfaW5vLCBpbm9kZS0+aV9ubGluaykpOworCQlpbm9kZS0+aV9ubGluayA9IDE7CisJfQorCWRlLT5kaV9zdGF0dXMgPSAwOworCW1lbXNldChkZS0+ZGlfZm5hbWUsIDAsIHNpemVvZiBkZS0+ZGlfZm5hbWUpOworCWRlLT5kaV9tb2RlID0gMDsKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJZGlyLT5pX2N0aW1lID0gZGlyLT5pX210aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwltYXJrX2lub2RlX2RpcnR5KGRpcik7CisJaW5vZGUtPmlfbmxpbmstLTsKKwlpbm9kZS0+aV9jdGltZSA9IGRpci0+aV9jdGltZTsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwlyZXR2YWwgPSAwOworCitlbmRfdW5saW5rOgorCXVubG9ja19rZXJuZWwoKTsKKwlicmVsc2UoYmgpOworCisJcmV0dXJuIHJldHZhbDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvcW54NC90cnVuY2F0ZS5jIGIvZnMvcW54NC90cnVuY2F0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NTYzZWMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9xbng0L3RydW5jYXRlLmMKQEAgLTAsMCArMSwzOSBAQAorLyogCisgKiBRTlg0IGZpbGUgc3lzdGVtLCBMaW51eCBpbXBsZW1lbnRhdGlvbi4KKyAqIAorICogVmVyc2lvbiA6IDAuMQorICogCisgKiBVc2luZyBwYXJ0cyBvZiB0aGUgeGlhZnMgZmlsZXN5c3RlbS4KKyAqIAorICogSGlzdG9yeSA6CisgKiAKKyAqIDMwLTA2LTE5OTggYnkgRnJhbmsgREVOSVMgOiB1Z2x5IGZpbGxlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcW54NF9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2lmZGVmIENPTkZJR19RTlg0RlNfUlcKKwordm9pZCBxbng0X3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaWYgKCEoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSB8fCBTX0lTRElSKGlub2RlLT5pX21vZGUpIHx8CisJICAgICAgU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkpIHsKKwkJcmV0dXJuOworCX0KKwlsb2NrX2tlcm5lbCgpOworCWlmICghKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpKSB7CisJCS8qIFRPRE8gKi8KKwl9CisJUU5YNERFQlVHKCgicW54NDogcW54NF90cnVuY2F0ZSBjYWxsZWRcbiIpKTsKKwlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwl1bmxvY2tfa2VybmVsKCk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMvcXVvdGEuYyBiL2ZzL3F1b3RhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YwMzMzYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3F1b3RhLmMKQEAgLTAsMCArMSwzODIgQEAKKy8qCisgKiBRdW90YSBjb2RlIG5lY2Vzc2FyeSBldmVuIHdoZW4gVkZTIHF1b3RhIHN1cHBvcnQgaXMgbm90IGNvbXBpbGVkCisgKiBpbnRvIHRoZSBrZXJuZWwuICBUaGUgaW50ZXJlc3Rpbmcgc3R1ZmYgaXMgb3ZlciBpbiBkcXVvdC5jLCBoZXJlCisgKiB3ZSBoYXZlIHN5bWJvbHMgZm9yIGluaXRpYWwgcXVvdGFjdGwoMikgaGFuZGxpbmcsIHRoZSBzeXNjdGwoMikKKyAqIHZhcmlhYmxlcywgZXRjIC0gdGhpbmdzIG5lZWRlZCBldmVuIHdoZW4gcXVvdGEgc3VwcG9ydCBkaXNhYmxlZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxhc20vY3VycmVudC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKworLyogQ2hlY2sgdmFsaWRpdHkgb2YgZ2VuZXJpYyBxdW90YWN0bCBjb21tYW5kcyAqLworc3RhdGljIGludCBnZW5lcmljX3F1b3RhY3RsX3ZhbGlkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCBpbnQgY21kLCBxaWRfdCBpZCkKK3sKKwlpZiAodHlwZSA+PSBNQVhRVU9UQVMpCisJCXJldHVybiAtRUlOVkFMOworCWlmICghc2IgJiYgY21kICE9IFFfU1lOQykKKwkJcmV0dXJuIC1FTk9ERVY7CisJLyogSXMgb3BlcmF0aW9uIHN1cHBvcnRlZD8gKi8KKwlpZiAoc2IgJiYgIXNiLT5zX3Fjb3ApCisJCXJldHVybiAtRU5PU1lTOworCisJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBRX0dFVEZNVDoKKwkJCWJyZWFrOworCQljYXNlIFFfUVVPVEFPTjoKKwkJCWlmICghc2ItPnNfcWNvcC0+cXVvdGFfb24pCisJCQkJcmV0dXJuIC1FTk9TWVM7CisJCQlicmVhazsKKwkJY2FzZSBRX1FVT1RBT0ZGOgorCQkJaWYgKCFzYi0+c19xY29wLT5xdW90YV9vZmYpCisJCQkJcmV0dXJuIC1FTk9TWVM7CisJCQlicmVhazsKKwkJY2FzZSBRX1NFVElORk86CisJCQlpZiAoIXNiLT5zX3Fjb3AtPnNldF9pbmZvKQorCQkJCXJldHVybiAtRU5PU1lTOworCQkJYnJlYWs7CisJCWNhc2UgUV9HRVRJTkZPOgorCQkJaWYgKCFzYi0+c19xY29wLT5nZXRfaW5mbykKKwkJCQlyZXR1cm4gLUVOT1NZUzsKKwkJCWJyZWFrOworCQljYXNlIFFfU0VUUVVPVEE6CisJCQlpZiAoIXNiLT5zX3Fjb3AtPnNldF9kcWJsaykKKwkJCQlyZXR1cm4gLUVOT1NZUzsKKwkJCWJyZWFrOworCQljYXNlIFFfR0VUUVVPVEE6CisJCQlpZiAoIXNiLT5zX3Fjb3AtPmdldF9kcWJsaykKKwkJCQlyZXR1cm4gLUVOT1NZUzsKKwkJCWJyZWFrOworCQljYXNlIFFfU1lOQzoKKwkJCWlmIChzYiAmJiAhc2ItPnNfcWNvcC0+cXVvdGFfc3luYykKKwkJCQlyZXR1cm4gLUVOT1NZUzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogSXMgcXVvdGEgdHVybmVkIG9uIGZvciBjb21tYW5kcyB3aGljaCBuZWVkIGl0PyAqLworCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgUV9HRVRGTVQ6CisJCWNhc2UgUV9HRVRJTkZPOgorCQljYXNlIFFfUVVPVEFPRkY6CisJCWNhc2UgUV9TRVRJTkZPOgorCQljYXNlIFFfU0VUUVVPVEE6CisJCWNhc2UgUV9HRVRRVU9UQToKKwkJCS8qIFRoaXMgaXMganVzdCBpbmZvcm1hdGl2ZSB0ZXN0IHNvIHdlIGFyZSBzYXRpc2ZpZWQgd2l0aG91dCBhIGxvY2sgKi8KKwkJCWlmICghc2JfaGFzX3F1b3RhX2VuYWJsZWQoc2IsIHR5cGUpKQorCQkJCXJldHVybiAtRVNSQ0g7CisJfQorCisJLyogQ2hlY2sgcHJpdmlsZWdlcyAqLworCWlmIChjbWQgPT0gUV9HRVRRVU9UQSkgeworCQlpZiAoKCh0eXBlID09IFVTUlFVT1RBICYmIGN1cnJlbnQtPmV1aWQgIT0gaWQpIHx8CisJCSAgICAgKHR5cGUgPT0gR1JQUVVPVEEgJiYgIWluX2Vncm91cF9wKGlkKSkpICYmCisJCSAgICAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJfQorCWVsc2UgaWYgKGNtZCAhPSBRX0dFVEZNVCAmJiBjbWQgIT0gUV9TWU5DICYmIGNtZCAhPSBRX0dFVElORk8pCisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2hlY2sgdmFsaWRpdHkgb2YgWEZTIFF1b3RhIE1hbmFnZXIgY29tbWFuZHMgKi8KK3N0YXRpYyBpbnQgeHFtX3F1b3RhY3RsX3ZhbGlkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCBpbnQgY21kLCBxaWRfdCBpZCkKK3sKKwlpZiAodHlwZSA+PSBYUU1fTUFYUVVPVEFTKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIXNiKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoIXNiLT5zX3Fjb3ApCisJCXJldHVybiAtRU5PU1lTOworCisJc3dpdGNoIChjbWQpIHsKKwkJY2FzZSBRX1hRVU9UQU9OOgorCQljYXNlIFFfWFFVT1RBT0ZGOgorCQljYXNlIFFfWFFVT1RBUk06CisJCQlpZiAoIXNiLT5zX3Fjb3AtPnNldF94c3RhdGUpCisJCQkJcmV0dXJuIC1FTk9TWVM7CisJCQlicmVhazsKKwkJY2FzZSBRX1hHRVRRU1RBVDoKKwkJCWlmICghc2ItPnNfcWNvcC0+Z2V0X3hzdGF0ZSkKKwkJCQlyZXR1cm4gLUVOT1NZUzsKKwkJCWJyZWFrOworCQljYXNlIFFfWFNFVFFMSU06CisJCQlpZiAoIXNiLT5zX3Fjb3AtPnNldF94cXVvdGEpCisJCQkJcmV0dXJuIC1FTk9TWVM7CisJCQlicmVhazsKKwkJY2FzZSBRX1hHRVRRVU9UQToKKwkJCWlmICghc2ItPnNfcWNvcC0+Z2V0X3hxdW90YSkKKwkJCQlyZXR1cm4gLUVOT1NZUzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ2hlY2sgcHJpdmlsZWdlcyAqLworCWlmIChjbWQgPT0gUV9YR0VUUVVPVEEpIHsKKwkJaWYgKCgodHlwZSA9PSBYUU1fVVNSUVVPVEEgJiYgY3VycmVudC0+ZXVpZCAhPSBpZCkgfHwKKwkJICAgICAodHlwZSA9PSBYUU1fR1JQUVVPVEEgJiYgIWluX2Vncm91cF9wKGlkKSkpICYmCisJCSAgICAgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCX0gZWxzZSBpZiAoY21kICE9IFFfWEdFVFFTVEFUKSB7CisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfcXVvdGFjdGxfdmFsaWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIGludCBjbWQsIHFpZF90IGlkKQoreworCWludCBlcnJvcjsKKworCWlmIChYUU1fQ09NTUFORChjbWQpKQorCQllcnJvciA9IHhxbV9xdW90YWN0bF92YWxpZChzYiwgdHlwZSwgY21kLCBpZCk7CisJZWxzZQorCQllcnJvciA9IGdlbmVyaWNfcXVvdGFjdGxfdmFsaWQoc2IsIHR5cGUsIGNtZCwgaWQpOworCWlmICghZXJyb3IpCisJCWVycm9yID0gc2VjdXJpdHlfcXVvdGFjdGwoY21kLCB0eXBlLCBpZCwgc2IpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqZ2V0X3N1cGVyX3RvX3N5bmMoaW50IHR5cGUpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKKwlpbnQgY250LCBkaXJ0eTsKKworcmVzdGFydDoKKwlzcGluX2xvY2soJnNiX2xvY2spOworCWxpc3RfZm9yX2VhY2goaGVhZCwgJnN1cGVyX2Jsb2NrcykgeworCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gbGlzdF9lbnRyeShoZWFkLCBzdHJ1Y3Qgc3VwZXJfYmxvY2ssIHNfbGlzdCk7CisKKwkJLyogVGhpcyB0ZXN0IGp1c3QgaW1wcm92ZXMgcGVyZm9ybWFuY2Ugc28gaXQgbmVlZG4ndCBiZSByZWxpYWJsZS4uLiAqLworCQlmb3IgKGNudCA9IDAsIGRpcnR5ID0gMDsgY250IDwgTUFYUVVPVEFTOyBjbnQrKykKKwkJCWlmICgodHlwZSA9PSBjbnQgfHwgdHlwZSA9PSAtMSkgJiYgc2JfaGFzX3F1b3RhX2VuYWJsZWQoc2IsIGNudCkKKwkJCSAgICAmJiBpbmZvX2FueV9kaXJ0eSgmc2JfZHFvcHQoc2IpLT5pbmZvW2NudF0pKQorCQkJCWRpcnR5ID0gMTsKKwkJaWYgKCFkaXJ0eSkKKwkJCWNvbnRpbnVlOworCQlzYi0+c19jb3VudCsrOworCQlzcGluX3VubG9jaygmc2JfbG9jayk7CisJCWRvd25fcmVhZCgmc2ItPnNfdW1vdW50KTsKKwkJaWYgKCFzYi0+c19yb290KSB7CisJCQlkcm9wX3N1cGVyKHNiKTsKKwkJCWdvdG8gcmVzdGFydDsKKwkJfQorCQlyZXR1cm4gc2I7CisJfQorCXNwaW5fdW5sb2NrKCZzYl9sb2NrKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgcXVvdGFfc3luY19zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKK3sKKwlpbnQgY250OworCXN0cnVjdCBpbm9kZSAqZGlzY2FyZFtNQVhRVU9UQVNdOworCisJc2ItPnNfcWNvcC0+cXVvdGFfc3luYyhzYiwgdHlwZSk7CisJLyogVGhpcyBpcyBub3QgdmVyeSBjbGV2ZXIgKGFuZCBmYXN0KSBidXQgY3VycmVudGx5IEkgZG9uJ3Qga25vdyBhYm91dAorCSAqIGFueSBvdGhlciBzaW1wbGUgd2F5IG9mIGdldHRpbmcgcXVvdGEgZGF0YSB0byBkaXNrIGFuZCB3ZSBtdXN0IGdldAorCSAqIHRoZW0gdGhlcmUgZm9yIHVzZXJzcGFjZSB0byBiZSB2aXNpYmxlLi4uICovCisJaWYgKHNiLT5zX29wLT5zeW5jX2ZzKQorCQlzYi0+c19vcC0+c3luY19mcyhzYiwgMSk7CisJc3luY19ibG9ja2RldihzYi0+c19iZGV2KTsKKworCS8qIE5vdyB3aGVuIGV2ZXJ5dGhpbmcgaXMgd3JpdHRlbiB3ZSBjYW4gZGlzY2FyZCB0aGUgcGFnZWNhY2hlIHNvCisJICogdGhhdCB1c2Vyc3BhY2Ugc2VlcyB0aGUgY2hhbmdlcy4gV2UgbmVlZCBpX3NlbSBhbmQgc28gd2UgY291bGQKKwkgKiBub3QgZG8gaXQgaW5zaWRlIGRxb25vZmZfc2VtLiBNb3Jlb3ZlciB3ZSBuZWVkIHRvIGJlIGNhcmVmdWxsCisJICogYWJvdXQgcmFjZXMgd2l0aCBxdW90YW9mZigpICh0aGF0IGlzIHRoZSByZWFzb24gd2h5IHdlIGhhdmUgb3duCisJICogcmVmZXJlbmNlIHRvIGlub2RlKS4gKi8KKwlkb3duKCZzYl9kcW9wdChzYiktPmRxb25vZmZfc2VtKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IE1BWFFVT1RBUzsgY250KyspIHsKKwkJZGlzY2FyZFtjbnRdID0gTlVMTDsKKwkJaWYgKHR5cGUgIT0gLTEgJiYgY250ICE9IHR5cGUpCisJCQljb250aW51ZTsKKwkJaWYgKCFzYl9oYXNfcXVvdGFfZW5hYmxlZChzYiwgY250KSkKKwkJCWNvbnRpbnVlOworCQlkaXNjYXJkW2NudF0gPSBpZ3JhYihzYl9kcW9wdChzYiktPmZpbGVzW2NudF0pOworCX0KKwl1cCgmc2JfZHFvcHQoc2IpLT5kcW9ub2ZmX3NlbSk7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBNQVhRVU9UQVM7IGNudCsrKSB7CisJCWlmIChkaXNjYXJkW2NudF0pIHsKKwkJCWRvd24oJmRpc2NhcmRbY250XS0+aV9zZW0pOworCQkJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoJmRpc2NhcmRbY250XS0+aV9kYXRhLCAwKTsKKwkJCXVwKCZkaXNjYXJkW2NudF0tPmlfc2VtKTsKKwkJCWlwdXQoZGlzY2FyZFtjbnRdKTsKKwkJfQorCX0KK30KKwordm9pZCBzeW5jX2RxdW90cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKK3sKKwlpZiAoc2IpIHsKKwkJaWYgKHNiLT5zX3Fjb3AtPnF1b3RhX3N5bmMpCisJCQlxdW90YV9zeW5jX3NiKHNiLCB0eXBlKTsKKwl9CisJZWxzZSB7CisJCXdoaWxlICgoc2IgPSBnZXRfc3VwZXJfdG9fc3luYyh0eXBlKSkgIT0gTlVMTCkgeworCQkJaWYgKHNiLT5zX3Fjb3AtPnF1b3RhX3N5bmMpCisJCQkJcXVvdGFfc3luY19zYihzYiwgdHlwZSk7CisJCQlkcm9wX3N1cGVyKHNiKTsKKwkJfQorCX0KK30KKworLyogQ29weSBwYXJhbWV0ZXJzIGFuZCBjYWxsIHByb3BlciBmdW5jdGlvbiAqLworc3RhdGljIGludCBkb19xdW90YWN0bChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwgaW50IGNtZCwgcWlkX3QgaWQsIHZvaWQgX191c2VyICphZGRyKQoreworCWludCByZXQ7CisKKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIFFfUVVPVEFPTjogeworCQkJY2hhciAqcGF0aG5hbWU7CisKKwkJCWlmIChJU19FUlIocGF0aG5hbWUgPSBnZXRuYW1lKGFkZHIpKSkKKwkJCQlyZXR1cm4gUFRSX0VSUihwYXRobmFtZSk7CisJCQlyZXQgPSBzYi0+c19xY29wLT5xdW90YV9vbihzYiwgdHlwZSwgaWQsIHBhdGhuYW1lKTsKKwkJCXB1dG5hbWUocGF0aG5hbWUpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQljYXNlIFFfUVVPVEFPRkY6CisJCQlyZXR1cm4gc2ItPnNfcWNvcC0+cXVvdGFfb2ZmKHNiLCB0eXBlKTsKKworCQljYXNlIFFfR0VURk1UOiB7CisJCQlfX3UzMiBmbXQ7CisKKwkJCWRvd25fcmVhZCgmc2JfZHFvcHQoc2IpLT5kcXB0cl9zZW0pOworCQkJaWYgKCFzYl9oYXNfcXVvdGFfZW5hYmxlZChzYiwgdHlwZSkpIHsKKwkJCQl1cF9yZWFkKCZzYl9kcW9wdChzYiktPmRxcHRyX3NlbSk7CisJCQkJcmV0dXJuIC1FU1JDSDsKKwkJCX0KKwkJCWZtdCA9IHNiX2Rxb3B0KHNiKS0+aW5mb1t0eXBlXS5kcWlfZm9ybWF0LT5xZl9mbXRfaWQ7CisJCQl1cF9yZWFkKCZzYl9kcW9wdChzYiktPmRxcHRyX3NlbSk7CisJCQlpZiAoY29weV90b191c2VyKGFkZHIsICZmbXQsIHNpemVvZihmbXQpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCQl9CisJCWNhc2UgUV9HRVRJTkZPOiB7CisJCQlzdHJ1Y3QgaWZfZHFpbmZvIGluZm87CisKKwkJCWlmICgocmV0ID0gc2ItPnNfcWNvcC0+Z2V0X2luZm8oc2IsIHR5cGUsICZpbmZvKSkpCisJCQkJcmV0dXJuIHJldDsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYWRkciwgJmluZm8sIHNpemVvZihpbmZvKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCQljYXNlIFFfU0VUSU5GTzogeworCQkJc3RydWN0IGlmX2RxaW5mbyBpbmZvOworCisJCQlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sIGFkZHIsIHNpemVvZihpbmZvKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gc2ItPnNfcWNvcC0+c2V0X2luZm8oc2IsIHR5cGUsICZpbmZvKTsKKwkJfQorCQljYXNlIFFfR0VUUVVPVEE6IHsKKwkJCXN0cnVjdCBpZl9kcWJsayBpZHE7CisKKwkJCWlmICgocmV0ID0gc2ItPnNfcWNvcC0+Z2V0X2RxYmxrKHNiLCB0eXBlLCBpZCwgJmlkcSkpKQorCQkJCXJldHVybiByZXQ7CisJCQlpZiAoY29weV90b191c2VyKGFkZHIsICZpZHEsIHNpemVvZihpZHEpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCQl9CisJCWNhc2UgUV9TRVRRVU9UQTogeworCQkJc3RydWN0IGlmX2RxYmxrIGlkcTsKKworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZpZHEsIGFkZHIsIHNpemVvZihpZHEpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiBzYi0+c19xY29wLT5zZXRfZHFibGsoc2IsIHR5cGUsIGlkLCAmaWRxKTsKKwkJfQorCQljYXNlIFFfU1lOQzoKKwkJCXN5bmNfZHF1b3RzKHNiLCB0eXBlKTsKKwkJCXJldHVybiAwOworCisJCWNhc2UgUV9YUVVPVEFPTjoKKwkJY2FzZSBRX1hRVU9UQU9GRjoKKwkJY2FzZSBRX1hRVU9UQVJNOiB7CisJCQlfX3UzMiBmbGFnczsKKworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZmbGFncywgYWRkciwgc2l6ZW9mKGZsYWdzKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gc2ItPnNfcWNvcC0+c2V0X3hzdGF0ZShzYiwgZmxhZ3MsIGNtZCk7CisJCX0KKwkJY2FzZSBRX1hHRVRRU1RBVDogeworCQkJc3RydWN0IGZzX3F1b3RhX3N0YXQgZnFzOworCQkKKwkJCWlmICgocmV0ID0gc2ItPnNfcWNvcC0+Z2V0X3hzdGF0ZShzYiwgJmZxcykpKQorCQkJCXJldHVybiByZXQ7CisJCQlpZiAoY29weV90b191c2VyKGFkZHIsICZmcXMsIHNpemVvZihmcXMpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCQl9CisJCWNhc2UgUV9YU0VUUUxJTTogeworCQkJc3RydWN0IGZzX2Rpc2tfcXVvdGEgZmRxOworCisJCQlpZiAoY29weV9mcm9tX3VzZXIoJmZkcSwgYWRkciwgc2l6ZW9mKGZkcSkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkgICAgICAgcmV0dXJuIHNiLT5zX3Fjb3AtPnNldF94cXVvdGEoc2IsIHR5cGUsIGlkLCAmZmRxKTsKKwkJfQorCQljYXNlIFFfWEdFVFFVT1RBOiB7CisJCQlzdHJ1Y3QgZnNfZGlza19xdW90YSBmZHE7CisKKwkJCWlmICgocmV0ID0gc2ItPnNfcWNvcC0+Z2V0X3hxdW90YShzYiwgdHlwZSwgaWQsICZmZHEpKSkKKwkJCQlyZXR1cm4gcmV0OworCQkJaWYgKGNvcHlfdG9fdXNlcihhZGRyLCAmZmRxLCBzaXplb2YoZmRxKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKiBXZSBuZXZlciByZWFjaCBoZXJlIHVubGVzcyB2YWxpZGl0eSBjaGVjayBpcyBicm9rZW4gKi8KKwkJZGVmYXVsdDoKKwkJCUJVRygpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIHN5c3RlbSBjYWxsIGludGVyZmFjZS4gVGhpcyBjb21tdW5pY2F0ZXMgd2l0aAorICogdGhlIHVzZXItbGV2ZWwgcHJvZ3JhbXMuIEN1cnJlbnRseSB0aGlzIG9ubHkgc3VwcG9ydHMgZGlza3F1b3RhCisgKiBjYWxscy4gTWF5YmUgd2UgbmVlZCB0byBhZGQgdGhlIHByb2Nlc3MgcXVvdGFzIGV0Yy4gaW4gdGhlIGZ1dHVyZSwKKyAqIGJ1dCB3ZSBwcm9iYWJseSBzaG91bGQgdXNlIHJsaW1pdHMgZm9yIHRoYXQuCisgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfcXVvdGFjdGwodW5zaWduZWQgaW50IGNtZCwgY29uc3QgY2hhciBfX3VzZXIgKnNwZWNpYWwsIHFpZF90IGlkLCB2b2lkIF9fdXNlciAqYWRkcikKK3sKKwl1aW50IGNtZHMsIHR5cGU7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IE5VTEw7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKKwljaGFyICp0bXA7CisJaW50IHJldDsKKworCWNtZHMgPSBjbWQgPj4gU1VCQ01EU0hJRlQ7CisJdHlwZSA9IGNtZCAmIFNVQkNNRE1BU0s7CisKKwlpZiAoY21kcyAhPSBRX1NZTkMgfHwgc3BlY2lhbCkgeworCQl0bXAgPSBnZXRuYW1lKHNwZWNpYWwpOworCQlpZiAoSVNfRVJSKHRtcCkpCisJCQlyZXR1cm4gUFRSX0VSUih0bXApOworCQliZGV2ID0gbG9va3VwX2JkZXYodG1wKTsKKwkJcHV0bmFtZSh0bXApOworCQlpZiAoSVNfRVJSKGJkZXYpKQorCQkJcmV0dXJuIFBUUl9FUlIoYmRldik7CisJCXNiID0gZ2V0X3N1cGVyKGJkZXYpOworCQliZHB1dChiZGV2KTsKKwkJaWYgKCFzYikKKwkJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldCA9IGNoZWNrX3F1b3RhY3RsX3ZhbGlkKHNiLCB0eXBlLCBjbWRzLCBpZCk7CisJaWYgKHJldCA+PSAwKQorCQlyZXQgPSBkb19xdW90YWN0bChzYiwgdHlwZSwgY21kcywgaWQsIGFkZHIpOworCWlmIChzYikKKwkJZHJvcF9zdXBlcihzYik7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZnMvcXVvdGFfdjEuYyBiL2ZzL3F1b3RhX3YxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM4NDFmMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3F1b3RhX3YxLmMKQEAgLTAsMCArMSwyMDAgQEAKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGEuaD4KKyNpbmNsdWRlIDxsaW51eC9kcWJsa192MS5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3RhaW9fdjEuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKK01PRFVMRV9BVVRIT1IoIkphbiBLYXJhIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk9sZCBxdW90YSBmb3JtYXQgc3VwcG9ydCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgdm9pZCB2MV9kaXNrMm1lbV9kcWJsayhzdHJ1Y3QgbWVtX2RxYmxrICptLCBzdHJ1Y3QgdjFfZGlza19kcWJsayAqZCkKK3sKKwltLT5kcWJfaWhhcmRsaW1pdCA9IGQtPmRxYl9paGFyZGxpbWl0OworCW0tPmRxYl9pc29mdGxpbWl0ID0gZC0+ZHFiX2lzb2Z0bGltaXQ7CisJbS0+ZHFiX2N1cmlub2RlcyA9IGQtPmRxYl9jdXJpbm9kZXM7CisJbS0+ZHFiX2JoYXJkbGltaXQgPSBkLT5kcWJfYmhhcmRsaW1pdDsKKwltLT5kcWJfYnNvZnRsaW1pdCA9IGQtPmRxYl9ic29mdGxpbWl0OworCW0tPmRxYl9jdXJzcGFjZSA9ICgocXNpemVfdClkLT5kcWJfY3VyYmxvY2tzKSA8PCBRVU9UQUJMT0NLX0JJVFM7CisJbS0+ZHFiX2l0aW1lID0gZC0+ZHFiX2l0aW1lOworCW0tPmRxYl9idGltZSA9IGQtPmRxYl9idGltZTsKK30KKworc3RhdGljIHZvaWQgdjFfbWVtMmRpc2tfZHFibGsoc3RydWN0IHYxX2Rpc2tfZHFibGsgKmQsIHN0cnVjdCBtZW1fZHFibGsgKm0pCit7CisJZC0+ZHFiX2loYXJkbGltaXQgPSBtLT5kcWJfaWhhcmRsaW1pdDsKKwlkLT5kcWJfaXNvZnRsaW1pdCA9IG0tPmRxYl9pc29mdGxpbWl0OworCWQtPmRxYl9jdXJpbm9kZXMgPSBtLT5kcWJfY3VyaW5vZGVzOworCWQtPmRxYl9iaGFyZGxpbWl0ID0gbS0+ZHFiX2JoYXJkbGltaXQ7CisJZC0+ZHFiX2Jzb2Z0bGltaXQgPSBtLT5kcWJfYnNvZnRsaW1pdDsKKwlkLT5kcWJfY3VyYmxvY2tzID0gdG9xYihtLT5kcWJfY3Vyc3BhY2UpOworCWQtPmRxYl9pdGltZSA9IG0tPmRxYl9pdGltZTsKKwlkLT5kcWJfYnRpbWUgPSBtLT5kcWJfYnRpbWU7Cit9CisKK3N0YXRpYyBpbnQgdjFfcmVhZF9kcWJsayhzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCWludCB0eXBlID0gZHF1b3QtPmRxX3R5cGU7CisJc3RydWN0IHYxX2Rpc2tfZHFibGsgZHFibGs7CisKKwlpZiAoIXNiX2Rxb3B0KGRxdW90LT5kcV9zYiktPmZpbGVzW3R5cGVdKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFNldCBzdHJ1Y3R1cmUgdG8gMHMgaW4gY2FzZSByZWFkIGZhaWxzL2lzIGFmdGVyIGVuZCBvZiBmaWxlICovCisJbWVtc2V0KCZkcWJsaywgMCwgc2l6ZW9mKHN0cnVjdCB2MV9kaXNrX2RxYmxrKSk7CisJZHF1b3QtPmRxX3NiLT5zX29wLT5xdW90YV9yZWFkKGRxdW90LT5kcV9zYiwgdHlwZSwgKGNoYXIgKikmZHFibGssIHNpemVvZihzdHJ1Y3QgdjFfZGlza19kcWJsayksIHYxX2Rxb2ZmKGRxdW90LT5kcV9pZCkpOworCisJdjFfZGlzazJtZW1fZHFibGsoJmRxdW90LT5kcV9kcWIsICZkcWJsayk7CisJaWYgKGRxdW90LT5kcV9kcWIuZHFiX2JoYXJkbGltaXQgPT0gMCAmJiBkcXVvdC0+ZHFfZHFiLmRxYl9ic29mdGxpbWl0ID09IDAgJiYKKwkgICAgZHF1b3QtPmRxX2RxYi5kcWJfaWhhcmRsaW1pdCA9PSAwICYmIGRxdW90LT5kcV9kcWIuZHFiX2lzb2Z0bGltaXQgPT0gMCkKKwkJc2V0X2JpdChEUV9GQUtFX0IsICZkcXVvdC0+ZHFfZmxhZ3MpOworCWRxc3RhdHMucmVhZHMrKzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHYxX2NvbW1pdF9kcWJsayhzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCXNob3J0IHR5cGUgPSBkcXVvdC0+ZHFfdHlwZTsKKwlzc2l6ZV90IHJldDsKKwlzdHJ1Y3QgdjFfZGlza19kcWJsayBkcWJsazsKKworCXYxX21lbTJkaXNrX2RxYmxrKCZkcWJsaywgJmRxdW90LT5kcV9kcWIpOworCWlmIChkcXVvdC0+ZHFfaWQgPT0gMCkgeworCQlkcWJsay5kcWJfYnRpbWUgPSBzYl9kcW9wdChkcXVvdC0+ZHFfc2IpLT5pbmZvW3R5cGVdLmRxaV9iZ3JhY2U7CisJCWRxYmxrLmRxYl9pdGltZSA9IHNiX2Rxb3B0KGRxdW90LT5kcV9zYiktPmluZm9bdHlwZV0uZHFpX2lncmFjZTsKKwl9CisJcmV0ID0gMDsKKwlpZiAoc2JfZHFvcHQoZHF1b3QtPmRxX3NiKS0+ZmlsZXNbdHlwZV0pCisJCXJldCA9IGRxdW90LT5kcV9zYi0+c19vcC0+cXVvdGFfd3JpdGUoZHF1b3QtPmRxX3NiLCB0eXBlLCAoY2hhciAqKSZkcWJsaywKKwkJCQkJc2l6ZW9mKHN0cnVjdCB2MV9kaXNrX2RxYmxrKSwgdjFfZHFvZmYoZHF1b3QtPmRxX2lkKSk7CisJaWYgKHJldCAhPSBzaXplb2Yoc3RydWN0IHYxX2Rpc2tfZHFibGspKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlZGUzogZHF1b3RhIHdyaXRlIGZhaWxlZCBvbiBkZXYgJXNcbiIsCisJCQlkcXVvdC0+ZHFfc2ItPnNfaWQpOworCQlpZiAocmV0ID49IDApCisJCQlyZXQgPSAtRUlPOworCQlnb3RvIG91dDsKKwl9CisJcmV0ID0gMDsKKworb3V0OgorCWRxc3RhdHMud3JpdGVzKys7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBNYWdpY3Mgb2YgbmV3IHF1b3RhIGZvcm1hdCAqLworI2RlZmluZSBWMl9JTklUUU1BR0lDUyB7XAorCTB4ZDljMDFmMTEsICAgICAvKiBVU1JRVU9UQSAqL1wKKwkweGQ5YzAxOTI3ICAgICAgLyogR1JQUVVPVEEgKi9cCit9CisKKy8qIEhlYWRlciBvZiBuZXcgcXVvdGEgZm9ybWF0ICovCitzdHJ1Y3QgdjJfZGlza19kcWhlYWRlciB7CisJX19sZTMyIGRxaF9tYWdpYzsgICAgICAgIC8qIE1hZ2ljIG51bWJlciBpZGVudGlmeWluZyBmaWxlICovCisJX19sZTMyIGRxaF92ZXJzaW9uOyAgICAgIC8qIEZpbGUgdmVyc2lvbiAqLworfTsKKworc3RhdGljIGludCB2MV9jaGVja19xdW90YV9maWxlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBzYl9kcW9wdChzYiktPmZpbGVzW3R5cGVdOworCXVsb25nIGJsb2NrczsKKwlzaXplX3Qgb2ZmOyAKKwlzdHJ1Y3QgdjJfZGlza19kcWhlYWRlciBkcWhlYWQ7CisJc3NpemVfdCBzaXplOworCWxvZmZfdCBpc2l6ZTsKKwlzdGF0aWMgY29uc3QgdWludCBxdW90YV9tYWdpY3NbXSA9IFYyX0lOSVRRTUFHSUNTOworCisJaXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CisJaWYgKCFpc2l6ZSkKKwkJcmV0dXJuIDA7CisJYmxvY2tzID0gaXNpemUgPj4gQkxPQ0tfU0laRV9CSVRTOworCW9mZiA9IGlzaXplICYgKEJMT0NLX1NJWkUgLSAxKTsKKwlpZiAoKGJsb2NrcyAlIHNpemVvZihzdHJ1Y3QgdjFfZGlza19kcWJsaykgKiBCTE9DS19TSVpFICsgb2ZmKSAlIHNpemVvZihzdHJ1Y3QgdjFfZGlza19kcWJsaykpCisJCXJldHVybiAwOworCS8qIERvdWJsZWNoZWNrIHdoZXRoZXIgd2UgZGlkbid0IGdldCBmaWxlIHdpdGggbmV3IGZvcm1hdCAtIHdpdGggb2xkIHF1b3RhY3RsKCkgdGhpcyBjb3VsZCBoYXBwZW4gKi8KKwlzaXplID0gc2ItPnNfb3AtPnF1b3RhX3JlYWQoc2IsIHR5cGUsIChjaGFyICopJmRxaGVhZCwgc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxaGVhZGVyKSwgMCk7CisJaWYgKHNpemUgIT0gc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxaGVhZGVyKSkKKwkJcmV0dXJuIDE7CS8qIFByb2JhYmx5IG5vdCBuZXcgZm9ybWF0ICovCisJaWYgKGxlMzJfdG9fY3B1KGRxaGVhZC5kcWhfbWFnaWMpICE9IHF1b3RhX21hZ2ljc1t0eXBlXSkKKwkJcmV0dXJuIDE7CS8qIERlZmluaXRlbHkgbm90IG5ldyBmb3JtYXQgKi8KKwlwcmludGsoS0VSTl9JTkZPICJWRlM6ICVzOiBSZWZ1c2luZyB0byB0dXJuIG9uIG9sZCBxdW90YSBmb3JtYXQgb24gZ2l2ZW4gZmlsZS4gSXQgcHJvYmFibHkgY29udGFpbnMgbmV3ZXIgcXVvdGEgZm9ybWF0LlxuIiwgc2ItPnNfaWQpOworICAgICAgICByZXR1cm4gMDsJCS8qIFNlZW1zIGxpa2UgYSBuZXcgZm9ybWF0IGZpbGUgLT4gcmVmdXNlIGl0ICovCit9CisKK3N0YXRpYyBpbnQgdjFfcmVhZF9maWxlX2luZm8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpCit7CisJc3RydWN0IHF1b3RhX2luZm8gKmRxb3B0ID0gc2JfZHFvcHQoc2IpOworCXN0cnVjdCB2MV9kaXNrX2RxYmxrIGRxYmxrOworCWludCByZXQ7CisKKwlpZiAoKHJldCA9IHNiLT5zX29wLT5xdW90YV9yZWFkKHNiLCB0eXBlLCAoY2hhciAqKSZkcWJsaywgc2l6ZW9mKHN0cnVjdCB2MV9kaXNrX2RxYmxrKSwgdjFfZHFvZmYoMCkpKSAhPSBzaXplb2Yoc3RydWN0IHYxX2Rpc2tfZHFibGspKSB7CisJCWlmIChyZXQgPj0gMCkKKwkJCXJldCA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKwlyZXQgPSAwOworCWRxb3B0LT5pbmZvW3R5cGVdLmRxaV9pZ3JhY2UgPSBkcWJsay5kcWJfaXRpbWUgPyBkcWJsay5kcWJfaXRpbWUgOiBNQVhfSVFfVElNRTsKKwlkcW9wdC0+aW5mb1t0eXBlXS5kcWlfYmdyYWNlID0gZHFibGsuZHFiX2J0aW1lID8gZHFibGsuZHFiX2J0aW1lIDogTUFYX0RRX1RJTUU7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2MV93cml0ZV9maWxlX2luZm8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpCit7CisJc3RydWN0IHF1b3RhX2luZm8gKmRxb3B0ID0gc2JfZHFvcHQoc2IpOworCXN0cnVjdCB2MV9kaXNrX2RxYmxrIGRxYmxrOworCWludCByZXQ7CisKKwlkcW9wdC0+aW5mb1t0eXBlXS5kcWlfZmxhZ3MgJj0gfkRRRl9JTkZPX0RJUlRZOworCWlmICgocmV0ID0gc2ItPnNfb3AtPnF1b3RhX3JlYWQoc2IsIHR5cGUsIChjaGFyICopJmRxYmxrLAorCSAgICBzaXplb2Yoc3RydWN0IHYxX2Rpc2tfZHFibGspLCB2MV9kcW9mZigwKSkpICE9IHNpemVvZihzdHJ1Y3QgdjFfZGlza19kcWJsaykpIHsKKwkJaWYgKHJldCA+PSAwKQorCQkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXQ7CisJfQorCWRxYmxrLmRxYl9pdGltZSA9IGRxb3B0LT5pbmZvW3R5cGVdLmRxaV9pZ3JhY2U7CisJZHFibGsuZHFiX2J0aW1lID0gZHFvcHQtPmluZm9bdHlwZV0uZHFpX2JncmFjZTsKKwlyZXQgPSBzYi0+c19vcC0+cXVvdGFfd3JpdGUoc2IsIHR5cGUsIChjaGFyICopJmRxYmxrLAorCSAgICAgIHNpemVvZihzdHJ1Y3QgdjFfZGlza19kcWJsayksIHYxX2Rxb2ZmKDApKTsKKwlpZiAocmV0ID09IHNpemVvZihzdHJ1Y3QgdjFfZGlza19kcWJsaykpCisJCXJldCA9IDA7CisJZWxzZSBpZiAocmV0ID4gMCkKKwkJcmV0ID0gLUVJTzsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHF1b3RhX2Zvcm1hdF9vcHMgdjFfZm9ybWF0X29wcyA9IHsKKwkuY2hlY2tfcXVvdGFfZmlsZQk9IHYxX2NoZWNrX3F1b3RhX2ZpbGUsCisJLnJlYWRfZmlsZV9pbmZvCQk9IHYxX3JlYWRfZmlsZV9pbmZvLAorCS53cml0ZV9maWxlX2luZm8JPSB2MV93cml0ZV9maWxlX2luZm8sCisJLmZyZWVfZmlsZV9pbmZvCQk9IE5VTEwsCisJLnJlYWRfZHFibGsJCT0gdjFfcmVhZF9kcWJsaywKKwkuY29tbWl0X2RxYmxrCQk9IHYxX2NvbW1pdF9kcWJsaywKK307CisKK3N0YXRpYyBzdHJ1Y3QgcXVvdGFfZm9ybWF0X3R5cGUgdjFfcXVvdGFfZm9ybWF0ID0geworCS5xZl9mbXRfaWQJPSBRRk1UX1ZGU19PTEQsCisJLnFmX29wcwkJPSAmdjFfZm9ybWF0X29wcywKKwkucWZfb3duZXIJPSBUSElTX01PRFVMRQorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF92MV9xdW90YV9mb3JtYXQodm9pZCkKK3sKKyAgICAgICAgcmV0dXJuIHJlZ2lzdGVyX3F1b3RhX2Zvcm1hdCgmdjFfcXVvdGFfZm9ybWF0KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfdjFfcXVvdGFfZm9ybWF0KHZvaWQpCit7CisgICAgICAgIHVucmVnaXN0ZXJfcXVvdGFfZm9ybWF0KCZ2MV9xdW90YV9mb3JtYXQpOworfQorCittb2R1bGVfaW5pdChpbml0X3YxX3F1b3RhX2Zvcm1hdCk7Cittb2R1bGVfZXhpdChleGl0X3YxX3F1b3RhX2Zvcm1hdCk7CisKZGlmZiAtLWdpdCBhL2ZzL3F1b3RhX3YyLmMgYi9mcy9xdW90YV92Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YmRiN2IKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9xdW90YV92Mi5jCkBAIC0wLDAgKzEsNjkzIEBACisvKgorICoJdmZzdjAgcXVvdGEgSU8gb3BlcmF0aW9ucyBvbiBmaWxlCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L2RxYmxrX3YyLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFpb192Mi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKK01PRFVMRV9BVVRIT1IoIkphbiBLYXJhIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlF1b3RhIGZvcm1hdCB2MiBzdXBwb3J0Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNkZWZpbmUgX19RVU9UQV9WMl9QQVJBTk9JQQorCit0eXBlZGVmIGNoYXIgKmRxYnVmX3Q7CisKKyNkZWZpbmUgR0VUSURJTkRFWChpZCwgZGVwdGgpICgoKGlkKSA+PiAoKFYyX0RRVFJFRURFUFRILShkZXB0aCktMSkqOCkpICYgMHhmZikKKyNkZWZpbmUgR0VURU5UUklFUyhidWYpICgoc3RydWN0IHYyX2Rpc2tfZHFibGsgKikoKChjaGFyICopYnVmKStzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFkYmhlYWRlcikpKQorCisvKiBDaGVjayB3aGV0aGVyIGdpdmVuIGZpbGUgaXMgcmVhbGx5IHZmc3YwIHF1b3RhZmlsZSAqLworc3RhdGljIGludCB2Ml9jaGVja19xdW90YV9maWxlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlKQoreworCXN0cnVjdCB2Ml9kaXNrX2RxaGVhZGVyIGRxaGVhZDsKKwlzc2l6ZV90IHNpemU7CisJc3RhdGljIGNvbnN0IHVpbnQgcXVvdGFfbWFnaWNzW10gPSBWMl9JTklUUU1BR0lDUzsKKwlzdGF0aWMgY29uc3QgdWludCBxdW90YV92ZXJzaW9uc1tdID0gVjJfSU5JVFFWRVJTSU9OUzsKKyAKKwlzaXplID0gc2ItPnNfb3AtPnF1b3RhX3JlYWQoc2IsIHR5cGUsIChjaGFyICopJmRxaGVhZCwgc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxaGVhZGVyKSwgMCk7CisJaWYgKHNpemUgIT0gc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxaGVhZGVyKSkgeworCQlwcmludGsoImZhaWxlZCByZWFkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChsZTMyX3RvX2NwdShkcWhlYWQuZHFoX21hZ2ljKSAhPSBxdW90YV9tYWdpY3NbdHlwZV0gfHwKKwkgICAgbGUzMl90b19jcHUoZHFoZWFkLmRxaF92ZXJzaW9uKSAhPSBxdW90YV92ZXJzaW9uc1t0eXBlXSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKy8qIFJlYWQgaW5mb3JtYXRpb24gaGVhZGVyIGZyb20gcXVvdGEgZmlsZSAqLworc3RhdGljIGludCB2Ml9yZWFkX2ZpbGVfaW5mbyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgdjJfZGlza19kcWluZm8gZGluZm87CisJc3RydWN0IG1lbV9kcWluZm8gKmluZm8gPSBzYl9kcW9wdChzYiktPmluZm8rdHlwZTsKKwlzc2l6ZV90IHNpemU7CisKKwlzaXplID0gc2ItPnNfb3AtPnF1b3RhX3JlYWQoc2IsIHR5cGUsIChjaGFyICopJmRpbmZvLAorCSAgICAgICBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFpbmZvKSwgVjJfRFFJTkZPT0ZGKTsKKwlpZiAoc2l6ZSAhPSBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFpbmZvKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJDYW4ndCByZWFkIGluZm8gc3RydWN0dXJlIG9uIGRldmljZSAlcy5cbiIsCisJCQlzYi0+c19pZCk7CisJCXJldHVybiAtMTsKKwl9CisJaW5mby0+ZHFpX2JncmFjZSA9IGxlMzJfdG9fY3B1KGRpbmZvLmRxaV9iZ3JhY2UpOworCWluZm8tPmRxaV9pZ3JhY2UgPSBsZTMyX3RvX2NwdShkaW5mby5kcWlfaWdyYWNlKTsKKwlpbmZvLT5kcWlfZmxhZ3MgPSBsZTMyX3RvX2NwdShkaW5mby5kcWlfZmxhZ3MpOworCWluZm8tPnUudjJfaS5kcWlfYmxvY2tzID0gbGUzMl90b19jcHUoZGluZm8uZHFpX2Jsb2Nrcyk7CisJaW5mby0+dS52Ml9pLmRxaV9mcmVlX2JsayA9IGxlMzJfdG9fY3B1KGRpbmZvLmRxaV9mcmVlX2Jsayk7CisJaW5mby0+dS52Ml9pLmRxaV9mcmVlX2VudHJ5ID0gbGUzMl90b19jcHUoZGluZm8uZHFpX2ZyZWVfZW50cnkpOworCXJldHVybiAwOworfQorCisvKiBXcml0ZSBpbmZvcm1hdGlvbiBoZWFkZXIgdG8gcXVvdGEgZmlsZSAqLworc3RhdGljIGludCB2Ml93cml0ZV9maWxlX2luZm8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpCit7CisJc3RydWN0IHYyX2Rpc2tfZHFpbmZvIGRpbmZvOworCXN0cnVjdCBtZW1fZHFpbmZvICppbmZvID0gc2JfZHFvcHQoc2IpLT5pbmZvK3R5cGU7CisJc3NpemVfdCBzaXplOworCisJc3Bpbl9sb2NrKCZkcV9kYXRhX2xvY2spOworCWluZm8tPmRxaV9mbGFncyAmPSB+RFFGX0lORk9fRElSVFk7CisJZGluZm8uZHFpX2JncmFjZSA9IGNwdV90b19sZTMyKGluZm8tPmRxaV9iZ3JhY2UpOworCWRpbmZvLmRxaV9pZ3JhY2UgPSBjcHVfdG9fbGUzMihpbmZvLT5kcWlfaWdyYWNlKTsKKwlkaW5mby5kcWlfZmxhZ3MgPSBjcHVfdG9fbGUzMihpbmZvLT5kcWlfZmxhZ3MgJiBEUUZfTUFTSyk7CisJc3Bpbl91bmxvY2soJmRxX2RhdGFfbG9jayk7CisJZGluZm8uZHFpX2Jsb2NrcyA9IGNwdV90b19sZTMyKGluZm8tPnUudjJfaS5kcWlfYmxvY2tzKTsKKwlkaW5mby5kcWlfZnJlZV9ibGsgPSBjcHVfdG9fbGUzMihpbmZvLT51LnYyX2kuZHFpX2ZyZWVfYmxrKTsKKwlkaW5mby5kcWlfZnJlZV9lbnRyeSA9IGNwdV90b19sZTMyKGluZm8tPnUudjJfaS5kcWlfZnJlZV9lbnRyeSk7CisJc2l6ZSA9IHNiLT5zX29wLT5xdW90YV93cml0ZShzYiwgdHlwZSwgKGNoYXIgKikmZGluZm8sCisJICAgICAgIHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWluZm8pLCBWMl9EUUlORk9PRkYpOworCWlmIChzaXplICE9IHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWluZm8pKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNhbid0IHdyaXRlIGluZm8gc3RydWN0dXJlIG9uIGRldmljZSAlcy5cbiIsCisJCQlzYi0+c19pZCk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRpc2sybWVtZHFiKHN0cnVjdCBtZW1fZHFibGsgKm0sIHN0cnVjdCB2Ml9kaXNrX2RxYmxrICpkKQoreworCW0tPmRxYl9paGFyZGxpbWl0ID0gbGUzMl90b19jcHUoZC0+ZHFiX2loYXJkbGltaXQpOworCW0tPmRxYl9pc29mdGxpbWl0ID0gbGUzMl90b19jcHUoZC0+ZHFiX2lzb2Z0bGltaXQpOworCW0tPmRxYl9jdXJpbm9kZXMgPSBsZTMyX3RvX2NwdShkLT5kcWJfY3VyaW5vZGVzKTsKKwltLT5kcWJfaXRpbWUgPSBsZTY0X3RvX2NwdShkLT5kcWJfaXRpbWUpOworCW0tPmRxYl9iaGFyZGxpbWl0ID0gbGUzMl90b19jcHUoZC0+ZHFiX2JoYXJkbGltaXQpOworCW0tPmRxYl9ic29mdGxpbWl0ID0gbGUzMl90b19jcHUoZC0+ZHFiX2Jzb2Z0bGltaXQpOworCW0tPmRxYl9jdXJzcGFjZSA9IGxlNjRfdG9fY3B1KGQtPmRxYl9jdXJzcGFjZSk7CisJbS0+ZHFiX2J0aW1lID0gbGU2NF90b19jcHUoZC0+ZHFiX2J0aW1lKTsKK30KKworc3RhdGljIHZvaWQgbWVtMmRpc2tkcWIoc3RydWN0IHYyX2Rpc2tfZHFibGsgKmQsIHN0cnVjdCBtZW1fZHFibGsgKm0sIHFpZF90IGlkKQoreworCWQtPmRxYl9paGFyZGxpbWl0ID0gY3B1X3RvX2xlMzIobS0+ZHFiX2loYXJkbGltaXQpOworCWQtPmRxYl9pc29mdGxpbWl0ID0gY3B1X3RvX2xlMzIobS0+ZHFiX2lzb2Z0bGltaXQpOworCWQtPmRxYl9jdXJpbm9kZXMgPSBjcHVfdG9fbGUzMihtLT5kcWJfY3VyaW5vZGVzKTsKKwlkLT5kcWJfaXRpbWUgPSBjcHVfdG9fbGU2NChtLT5kcWJfaXRpbWUpOworCWQtPmRxYl9iaGFyZGxpbWl0ID0gY3B1X3RvX2xlMzIobS0+ZHFiX2JoYXJkbGltaXQpOworCWQtPmRxYl9ic29mdGxpbWl0ID0gY3B1X3RvX2xlMzIobS0+ZHFiX2Jzb2Z0bGltaXQpOworCWQtPmRxYl9jdXJzcGFjZSA9IGNwdV90b19sZTY0KG0tPmRxYl9jdXJzcGFjZSk7CisJZC0+ZHFiX2J0aW1lID0gY3B1X3RvX2xlNjQobS0+ZHFiX2J0aW1lKTsKKwlkLT5kcWJfaWQgPSBjcHVfdG9fbGUzMihpZCk7Cit9CisKK3N0YXRpYyBkcWJ1Zl90IGdldGRxYnVmKHZvaWQpCit7CisJZHFidWZfdCBidWYgPSBrbWFsbG9jKFYyX0RRQkxLU0laRSwgR0ZQX05PRlMpOworCWlmICghYnVmKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJWRlM6IE5vdCBlbm91Z2ggbWVtb3J5IGZvciBxdW90YSBidWZmZXJzLlxuIik7CisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZyZWVkcWJ1ZihkcWJ1Zl90IGJ1ZikKK3sKKwlrZnJlZShidWYpOworfQorCitzdGF0aWMgaW5saW5lIHNzaXplX3QgcmVhZF9ibGsoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIHVpbnQgYmxrLCBkcWJ1Zl90IGJ1ZikKK3sKKwltZW1zZXQoYnVmLCAwLCBWMl9EUUJMS1NJWkUpOworCXJldHVybiBzYi0+c19vcC0+cXVvdGFfcmVhZChzYiwgdHlwZSwgKGNoYXIgKilidWYsCisJICAgICAgIFYyX0RRQkxLU0laRSwgYmxrIDw8IFYyX0RRQkxLU0laRV9CSVRTKTsKK30KKworc3RhdGljIGlubGluZSBzc2l6ZV90IHdyaXRlX2JsayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwgdWludCBibGssIGRxYnVmX3QgYnVmKQoreworCXJldHVybiBzYi0+c19vcC0+cXVvdGFfd3JpdGUoc2IsIHR5cGUsIChjaGFyICopYnVmLAorCSAgICAgICBWMl9EUUJMS1NJWkUsIGJsayA8PCBWMl9EUUJMS1NJWkVfQklUUyk7Cit9CisKKy8qIFJlbW92ZSBlbXB0eSBibG9jayBmcm9tIGxpc3QgYW5kIHJldHVybiBpdCAqLworc3RhdGljIGludCBnZXRfZnJlZV9kcWJsayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSkKK3sKKwlkcWJ1Zl90IGJ1ZiA9IGdldGRxYnVmKCk7CisJc3RydWN0IG1lbV9kcWluZm8gKmluZm8gPSBzYl9kcWluZm8oc2IsIHR5cGUpOworCXN0cnVjdCB2Ml9kaXNrX2RxZGJoZWFkZXIgKmRoID0gKHN0cnVjdCB2Ml9kaXNrX2RxZGJoZWFkZXIgKilidWY7CisJaW50IHJldCwgYmxrOworCisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCWlmIChpbmZvLT51LnYyX2kuZHFpX2ZyZWVfYmxrKSB7CisJCWJsayA9IGluZm8tPnUudjJfaS5kcWlfZnJlZV9ibGs7CisJCWlmICgocmV0ID0gcmVhZF9ibGsoc2IsIHR5cGUsIGJsaywgYnVmKSkgPCAwKQorCQkJZ290byBvdXRfYnVmOworCQlpbmZvLT51LnYyX2kuZHFpX2ZyZWVfYmxrID0gbGUzMl90b19jcHUoZGgtPmRxZGhfbmV4dF9mcmVlKTsKKwl9CisJZWxzZSB7CisJCW1lbXNldChidWYsIDAsIFYyX0RRQkxLU0laRSk7CisJCS8qIEFzc3VyZSBibG9jayBhbGxvY2F0aW9uLi4uICovCisJCWlmICgocmV0ID0gd3JpdGVfYmxrKHNiLCB0eXBlLCBpbmZvLT51LnYyX2kuZHFpX2Jsb2NrcywgYnVmKSkgPCAwKQorCQkJZ290byBvdXRfYnVmOworCQlibGsgPSBpbmZvLT51LnYyX2kuZHFpX2Jsb2NrcysrOworCX0KKwltYXJrX2luZm9fZGlydHkoc2IsIHR5cGUpOworCXJldCA9IGJsazsKK291dF9idWY6CisJZnJlZWRxYnVmKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworLyogSW5zZXJ0IGVtcHR5IGJsb2NrIHRvIHRoZSBsaXN0ICovCitzdGF0aWMgaW50IHB1dF9mcmVlX2RxYmxrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCBkcWJ1Zl90IGJ1ZiwgdWludCBibGspCit7CisJc3RydWN0IG1lbV9kcWluZm8gKmluZm8gPSBzYl9kcWluZm8oc2IsIHR5cGUpOworCXN0cnVjdCB2Ml9kaXNrX2RxZGJoZWFkZXIgKmRoID0gKHN0cnVjdCB2Ml9kaXNrX2RxZGJoZWFkZXIgKilidWY7CisJaW50IGVycjsKKworCWRoLT5kcWRoX25leHRfZnJlZSA9IGNwdV90b19sZTMyKGluZm8tPnUudjJfaS5kcWlfZnJlZV9ibGspOworCWRoLT5kcWRoX3ByZXZfZnJlZSA9IGNwdV90b19sZTMyKDApOworCWRoLT5kcWRoX2VudHJpZXMgPSBjcHVfdG9fbGUxNigwKTsKKwlpbmZvLT51LnYyX2kuZHFpX2ZyZWVfYmxrID0gYmxrOworCW1hcmtfaW5mb19kaXJ0eShzYiwgdHlwZSk7CisJLyogU29tZSBzdHJhbmdlIGJsb2NrLiBXZSBoYWQgYmV0dGVyIGxlYXZlIGl0Li4uICovCisJaWYgKChlcnIgPSB3cml0ZV9ibGsoc2IsIHR5cGUsIGJsaywgYnVmKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCXJldHVybiAwOworfQorCisvKiBSZW1vdmUgZ2l2ZW4gYmxvY2sgZnJvbSB0aGUgbGlzdCBvZiBibG9ja3Mgd2l0aCBmcmVlIGVudHJpZXMgKi8KK3N0YXRpYyBpbnQgcmVtb3ZlX2ZyZWVfZHFlbnRyeShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwgZHFidWZfdCBidWYsIHVpbnQgYmxrKQoreworCWRxYnVmX3QgdG1wYnVmID0gZ2V0ZHFidWYoKTsKKwlzdHJ1Y3QgbWVtX2RxaW5mbyAqaW5mbyA9IHNiX2RxaW5mbyhzYiwgdHlwZSk7CisJc3RydWN0IHYyX2Rpc2tfZHFkYmhlYWRlciAqZGggPSAoc3RydWN0IHYyX2Rpc2tfZHFkYmhlYWRlciAqKWJ1ZjsKKwl1aW50IG5leHRibGsgPSBsZTMyX3RvX2NwdShkaC0+ZHFkaF9uZXh0X2ZyZWUpLCBwcmV2YmxrID0gbGUzMl90b19jcHUoZGgtPmRxZGhfcHJldl9mcmVlKTsKKwlpbnQgZXJyOworCisJaWYgKCF0bXBidWYpCisJCXJldHVybiAtRU5PTUVNOworCWlmIChuZXh0YmxrKSB7CisJCWlmICgoZXJyID0gcmVhZF9ibGsoc2IsIHR5cGUsIG5leHRibGssIHRtcGJ1ZikpIDwgMCkKKwkJCWdvdG8gb3V0X2J1ZjsKKwkJKChzdHJ1Y3QgdjJfZGlza19kcWRiaGVhZGVyICopdG1wYnVmKS0+ZHFkaF9wcmV2X2ZyZWUgPSBkaC0+ZHFkaF9wcmV2X2ZyZWU7CisJCWlmICgoZXJyID0gd3JpdGVfYmxrKHNiLCB0eXBlLCBuZXh0YmxrLCB0bXBidWYpKSA8IDApCisJCQlnb3RvIG91dF9idWY7CisJfQorCWlmIChwcmV2YmxrKSB7CisJCWlmICgoZXJyID0gcmVhZF9ibGsoc2IsIHR5cGUsIHByZXZibGssIHRtcGJ1ZikpIDwgMCkKKwkJCWdvdG8gb3V0X2J1ZjsKKwkJKChzdHJ1Y3QgdjJfZGlza19kcWRiaGVhZGVyICopdG1wYnVmKS0+ZHFkaF9uZXh0X2ZyZWUgPSBkaC0+ZHFkaF9uZXh0X2ZyZWU7CisJCWlmICgoZXJyID0gd3JpdGVfYmxrKHNiLCB0eXBlLCBwcmV2YmxrLCB0bXBidWYpKSA8IDApCisJCQlnb3RvIG91dF9idWY7CisJfQorCWVsc2UgeworCQlpbmZvLT51LnYyX2kuZHFpX2ZyZWVfZW50cnkgPSBuZXh0YmxrOworCQltYXJrX2luZm9fZGlydHkoc2IsIHR5cGUpOworCX0KKwlmcmVlZHFidWYodG1wYnVmKTsKKwlkaC0+ZHFkaF9uZXh0X2ZyZWUgPSBkaC0+ZHFkaF9wcmV2X2ZyZWUgPSBjcHVfdG9fbGUzMigwKTsKKwkvKiBObyBtYXR0ZXIgd2hldGhlciB3cml0ZSBzdWNjZWVkcyBibG9jayBpcyBvdXQgb2YgbGlzdCAqLworCWlmICh3cml0ZV9ibGsoc2IsIHR5cGUsIGJsaywgYnVmKSA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBDYW4ndCB3cml0ZSBibG9jayAoJXUpIHdpdGggZnJlZSBlbnRyaWVzLlxuIiwgYmxrKTsKKwlyZXR1cm4gMDsKK291dF9idWY6CisJZnJlZWRxYnVmKHRtcGJ1Zik7CisJcmV0dXJuIGVycjsKK30KKworLyogSW5zZXJ0IGdpdmVuIGJsb2NrIHRvIHRoZSBiZWdpbm5pbmcgb2YgbGlzdCB3aXRoIGZyZWUgZW50cmllcyAqLworc3RhdGljIGludCBpbnNlcnRfZnJlZV9kcWVudHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCBkcWJ1Zl90IGJ1ZiwgdWludCBibGspCit7CisJZHFidWZfdCB0bXBidWYgPSBnZXRkcWJ1ZigpOworCXN0cnVjdCBtZW1fZHFpbmZvICppbmZvID0gc2JfZHFpbmZvKHNiLCB0eXBlKTsKKwlzdHJ1Y3QgdjJfZGlza19kcWRiaGVhZGVyICpkaCA9IChzdHJ1Y3QgdjJfZGlza19kcWRiaGVhZGVyICopYnVmOworCWludCBlcnI7CisKKwlpZiAoIXRtcGJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisJZGgtPmRxZGhfbmV4dF9mcmVlID0gY3B1X3RvX2xlMzIoaW5mby0+dS52Ml9pLmRxaV9mcmVlX2VudHJ5KTsKKwlkaC0+ZHFkaF9wcmV2X2ZyZWUgPSBjcHVfdG9fbGUzMigwKTsKKwlpZiAoKGVyciA9IHdyaXRlX2JsayhzYiwgdHlwZSwgYmxrLCBidWYpKSA8IDApCisJCWdvdG8gb3V0X2J1ZjsKKwlpZiAoaW5mby0+dS52Ml9pLmRxaV9mcmVlX2VudHJ5KSB7CisJCWlmICgoZXJyID0gcmVhZF9ibGsoc2IsIHR5cGUsIGluZm8tPnUudjJfaS5kcWlfZnJlZV9lbnRyeSwgdG1wYnVmKSkgPCAwKQorCQkJZ290byBvdXRfYnVmOworCQkoKHN0cnVjdCB2Ml9kaXNrX2RxZGJoZWFkZXIgKil0bXBidWYpLT5kcWRoX3ByZXZfZnJlZSA9IGNwdV90b19sZTMyKGJsayk7CisJCWlmICgoZXJyID0gd3JpdGVfYmxrKHNiLCB0eXBlLCBpbmZvLT51LnYyX2kuZHFpX2ZyZWVfZW50cnksIHRtcGJ1ZikpIDwgMCkKKwkJCWdvdG8gb3V0X2J1ZjsKKwl9CisJZnJlZWRxYnVmKHRtcGJ1Zik7CisJaW5mby0+dS52Ml9pLmRxaV9mcmVlX2VudHJ5ID0gYmxrOworCW1hcmtfaW5mb19kaXJ0eShzYiwgdHlwZSk7CisJcmV0dXJuIDA7CitvdXRfYnVmOgorCWZyZWVkcWJ1Zih0bXBidWYpOworCXJldHVybiBlcnI7Cit9CisKKy8qIEZpbmQgc3BhY2UgZm9yIGRxdW90ICovCitzdGF0aWMgdWludCBmaW5kX2ZyZWVfZHFlbnRyeShzdHJ1Y3QgZHF1b3QgKmRxdW90LCBpbnQgKmVycikKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZHF1b3QtPmRxX3NiOworCXN0cnVjdCBtZW1fZHFpbmZvICppbmZvID0gc2JfZHFvcHQoc2IpLT5pbmZvK2RxdW90LT5kcV90eXBlOworCXVpbnQgYmxrLCBpOworCXN0cnVjdCB2Ml9kaXNrX2RxZGJoZWFkZXIgKmRoOworCXN0cnVjdCB2Ml9kaXNrX2RxYmxrICpkZHF1b3Q7CisJc3RydWN0IHYyX2Rpc2tfZHFibGsgZmFrZWRxdW90OworCWRxYnVmX3QgYnVmOworCisJKmVyciA9IDA7CisJaWYgKCEoYnVmID0gZ2V0ZHFidWYoKSkpIHsKKwkJKmVyciA9IC1FTk9NRU07CisJCXJldHVybiAwOworCX0KKwlkaCA9IChzdHJ1Y3QgdjJfZGlza19kcWRiaGVhZGVyICopYnVmOworCWRkcXVvdCA9IEdFVEVOVFJJRVMoYnVmKTsKKwlpZiAoaW5mby0+dS52Ml9pLmRxaV9mcmVlX2VudHJ5KSB7CisJCWJsayA9IGluZm8tPnUudjJfaS5kcWlfZnJlZV9lbnRyeTsKKwkJaWYgKCgqZXJyID0gcmVhZF9ibGsoc2IsIGRxdW90LT5kcV90eXBlLCBibGssIGJ1ZikpIDwgMCkKKwkJCWdvdG8gb3V0X2J1ZjsKKwl9CisJZWxzZSB7CisJCWJsayA9IGdldF9mcmVlX2RxYmxrKHNiLCBkcXVvdC0+ZHFfdHlwZSk7CisJCWlmICgoaW50KWJsayA8IDApIHsKKwkJCSplcnIgPSBibGs7CisJCQlmcmVlZHFidWYoYnVmKTsKKwkJCXJldHVybiAwOworCQl9CisJCW1lbXNldChidWYsIDAsIFYyX0RRQkxLU0laRSk7CisJCS8qIFRoaXMgaXMgZW5vdWdoIGFzIGJsb2NrIGlzIGFscmVhZHkgemVyb2VkIGFuZCBlbnRyeSBsaXN0IGlzIGVtcHR5Li4uICovCisJCWluZm8tPnUudjJfaS5kcWlfZnJlZV9lbnRyeSA9IGJsazsKKwkJbWFya19pbmZvX2RpcnR5KHNiLCBkcXVvdC0+ZHFfdHlwZSk7CisJfQorCWlmIChsZTE2X3RvX2NwdShkaC0+ZHFkaF9lbnRyaWVzKSsxID49IFYyX0RRU1RSSU5CTEspCS8qIEJsb2NrIHdpbGwgYmUgZnVsbD8gKi8KKwkJaWYgKCgqZXJyID0gcmVtb3ZlX2ZyZWVfZHFlbnRyeShzYiwgZHF1b3QtPmRxX3R5cGUsIGJ1ZiwgYmxrKSkgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlZGUzogZmluZF9mcmVlX2RxZW50cnkoKTogQ2FuJ3QgcmVtb3ZlIGJsb2NrICgldSkgZnJvbSBlbnRyeSBmcmVlIGxpc3QuXG4iLCBibGspOworCQkJZ290byBvdXRfYnVmOworCQl9CisJZGgtPmRxZGhfZW50cmllcyA9IGNwdV90b19sZTE2KGxlMTZfdG9fY3B1KGRoLT5kcWRoX2VudHJpZXMpKzEpOworCW1lbXNldCgmZmFrZWRxdW90LCAwLCBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFibGspKTsKKwkvKiBGaW5kIGZyZWUgc3RydWN0dXJlIGluIGJsb2NrICovCisJZm9yIChpID0gMDsgaSA8IFYyX0RRU1RSSU5CTEsgJiYgbWVtY21wKCZmYWtlZHF1b3QsIGRkcXVvdCtpLCBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFibGspKTsgaSsrKTsKKyNpZmRlZiBfX1FVT1RBX1YyX1BBUkFOT0lBCisJaWYgKGkgPT0gVjJfRFFTVFJJTkJMSykgeworCQlwcmludGsoS0VSTl9FUlIgIlZGUzogZmluZF9mcmVlX2RxZW50cnkoKTogRGF0YSBibG9jayBmdWxsIGJ1dCBpdCBzaG91bGRuJ3QuXG4iKTsKKwkJKmVyciA9IC1FSU87CisJCWdvdG8gb3V0X2J1ZjsKKwl9CisjZW5kaWYKKwlpZiAoKCplcnIgPSB3cml0ZV9ibGsoc2IsIGRxdW90LT5kcV90eXBlLCBibGssIGJ1ZikpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIlZGUzogZmluZF9mcmVlX2RxZW50cnkoKTogQ2FuJ3Qgd3JpdGUgcXVvdGEgZGF0YSBibG9jayAldS5cbiIsIGJsayk7CisJCWdvdG8gb3V0X2J1ZjsKKwl9CisJZHF1b3QtPmRxX29mZiA9IChibGs8PFYyX0RRQkxLU0laRV9CSVRTKStzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFkYmhlYWRlcikraSpzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFibGspOworCWZyZWVkcWJ1ZihidWYpOworCXJldHVybiBibGs7CitvdXRfYnVmOgorCWZyZWVkcWJ1ZihidWYpOworCXJldHVybiAwOworfQorCisvKiBJbnNlcnQgcmVmZXJlbmNlIHRvIHN0cnVjdHVyZSBpbnRvIHRoZSB0cmllICovCitzdGF0aWMgaW50IGRvX2luc2VydF90cmVlKHN0cnVjdCBkcXVvdCAqZHF1b3QsIHVpbnQgKnRyZWVibGssIGludCBkZXB0aCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZHF1b3QtPmRxX3NiOworCWRxYnVmX3QgYnVmOworCWludCByZXQgPSAwLCBuZXdzb24gPSAwLCBuZXdhY3QgPSAwOworCV9fbGUzMiAqcmVmOworCXVpbnQgbmV3YmxrOworCisJaWYgKCEoYnVmID0gZ2V0ZHFidWYoKSkpCisJCXJldHVybiAtRU5PTUVNOworCWlmICghKnRyZWVibGspIHsKKwkJcmV0ID0gZ2V0X2ZyZWVfZHFibGsoc2IsIGRxdW90LT5kcV90eXBlKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dF9idWY7CisJCSp0cmVlYmxrID0gcmV0OworCQltZW1zZXQoYnVmLCAwLCBWMl9EUUJMS1NJWkUpOworCQluZXdhY3QgPSAxOworCX0KKwllbHNlIHsKKwkJaWYgKChyZXQgPSByZWFkX2JsayhzYiwgZHF1b3QtPmRxX3R5cGUsICp0cmVlYmxrLCBidWYpKSA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBDYW4ndCByZWFkIHRyZWUgcXVvdGEgYmxvY2sgJXUuXG4iLCAqdHJlZWJsayk7CisJCQlnb3RvIG91dF9idWY7CisJCX0KKwl9CisJcmVmID0gKF9fbGUzMiAqKWJ1ZjsKKwluZXdibGsgPSBsZTMyX3RvX2NwdShyZWZbR0VUSURJTkRFWChkcXVvdC0+ZHFfaWQsIGRlcHRoKV0pOworCWlmICghbmV3YmxrKQorCQluZXdzb24gPSAxOworCWlmIChkZXB0aCA9PSBWMl9EUVRSRUVERVBUSC0xKSB7CisjaWZkZWYgX19RVU9UQV9WMl9QQVJBTk9JQQorCQlpZiAobmV3YmxrKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlZGUzogSW5zZXJ0aW5nIGFscmVhZHkgcHJlc2VudCBxdW90YSBlbnRyeSAoYmxvY2sgJXUpLlxuIiwgbGUzMl90b19jcHUocmVmW0dFVElESU5ERVgoZHF1b3QtPmRxX2lkLCBkZXB0aCldKSk7CisJCQlyZXQgPSAtRUlPOworCQkJZ290byBvdXRfYnVmOworCQl9CisjZW5kaWYKKwkJbmV3YmxrID0gZmluZF9mcmVlX2RxZW50cnkoZHF1b3QsICZyZXQpOworCX0KKwllbHNlCisJCXJldCA9IGRvX2luc2VydF90cmVlKGRxdW90LCAmbmV3YmxrLCBkZXB0aCsxKTsKKwlpZiAobmV3c29uICYmIHJldCA+PSAwKSB7CisJCXJlZltHRVRJRElOREVYKGRxdW90LT5kcV9pZCwgZGVwdGgpXSA9IGNwdV90b19sZTMyKG5ld2Jsayk7CisJCXJldCA9IHdyaXRlX2JsayhzYiwgZHF1b3QtPmRxX3R5cGUsICp0cmVlYmxrLCBidWYpOworCX0KKwllbHNlIGlmIChuZXdhY3QgJiYgcmV0IDwgMCkKKwkJcHV0X2ZyZWVfZHFibGsoc2IsIGRxdW90LT5kcV90eXBlLCBidWYsICp0cmVlYmxrKTsKK291dF9idWY6CisJZnJlZWRxYnVmKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworLyogV3JhcHBlciBmb3IgaW5zZXJ0aW5nIHF1b3RhIHN0cnVjdHVyZSBpbnRvIHRyZWUgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGRxX2luc2VydF90cmVlKHN0cnVjdCBkcXVvdCAqZHF1b3QpCit7CisJaW50IHRtcCA9IFYyX0RRVFJFRU9GRjsKKwlyZXR1cm4gZG9faW5zZXJ0X3RyZWUoZHF1b3QsICZ0bXAsIDApOworfQorCisvKgorICoJV2UgZG9uJ3QgaGF2ZSB0byBiZSBhZnJhaWQgb2YgZGVhZGxvY2tzIGFzIHdlIG5ldmVyIGhhdmUgcXVvdGFzIG9uIHF1b3RhIGZpbGVzLi4uCisgKi8KK3N0YXRpYyBpbnQgdjJfd3JpdGVfZHF1b3Qoc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlpbnQgdHlwZSA9IGRxdW90LT5kcV90eXBlOworCXNzaXplX3QgcmV0OworCXN0cnVjdCB2Ml9kaXNrX2RxYmxrIGRkcXVvdCwgZW1wdHk7CisKKwkvKiBkcV9vZmYgaXMgZ3VhcmRlZCBieSBkcWlvX3NlbSAqLworCWlmICghZHF1b3QtPmRxX29mZikKKwkJaWYgKChyZXQgPSBkcV9pbnNlcnRfdHJlZShkcXVvdCkpIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IEVycm9yICV6ZCBvY2N1cnJlZCB3aGlsZSBjcmVhdGluZyBxdW90YS5cbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJc3Bpbl9sb2NrKCZkcV9kYXRhX2xvY2spOworCW1lbTJkaXNrZHFiKCZkZHF1b3QsICZkcXVvdC0+ZHFfZHFiLCBkcXVvdC0+ZHFfaWQpOworCS8qIEFyZ2guLi4gV2UgbWF5IG5lZWQgdG8gd3JpdGUgc3RydWN0dXJlIGZ1bGwgb2YgemVyb2VzIGJ1dCB0aGF0IHdvdWxkIGJlCisJICogdHJlYXRlZCBhcyBhbiBlbXB0eSBwbGFjZSBieSB0aGUgcmVzdCBvZiB0aGUgY29kZS4gRm9ybWF0IGNoYW5nZSB3b3VsZAorCSAqIGJlIGRlZmluaXRlbHkgY2xlYW5lciBidXQgdGhlIHByb2JsZW1zIHByb2JhYmx5IGFyZSBub3Qgd29ydGggaXQgKi8KKwltZW1zZXQoJmVtcHR5LCAwLCBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFibGspKTsKKwlpZiAoIW1lbWNtcCgmZW1wdHksICZkZHF1b3QsIHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWJsaykpKQorCQlkZHF1b3QuZHFiX2l0aW1lID0gY3B1X3RvX2xlNjQoMSk7CisJc3Bpbl91bmxvY2soJmRxX2RhdGFfbG9jayk7CisJcmV0ID0gZHF1b3QtPmRxX3NiLT5zX29wLT5xdW90YV93cml0ZShkcXVvdC0+ZHFfc2IsIHR5cGUsCisJICAgICAgKGNoYXIgKikmZGRxdW90LCBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFibGspLCBkcXVvdC0+ZHFfb2ZmKTsKKwlpZiAocmV0ICE9IHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWJsaykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVkZTOiBkcXVvdGEgd3JpdGUgZmFpbGVkIG9uIGRldiAlc1xuIiwgZHF1b3QtPmRxX3NiLT5zX2lkKTsKKwkJaWYgKHJldCA+PSAwKQorCQkJcmV0ID0gLUVOT1NQQzsKKwl9CisJZWxzZQorCQlyZXQgPSAwOworCWRxc3RhdHMud3JpdGVzKys7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBGcmVlIGRxdW90IGVudHJ5IGluIGRhdGEgYmxvY2sgKi8KK3N0YXRpYyBpbnQgZnJlZV9kcWVudHJ5KHN0cnVjdCBkcXVvdCAqZHF1b3QsIHVpbnQgYmxrKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkcXVvdC0+ZHFfc2I7CisJaW50IHR5cGUgPSBkcXVvdC0+ZHFfdHlwZTsKKwlzdHJ1Y3QgdjJfZGlza19kcWRiaGVhZGVyICpkaDsKKwlkcWJ1Zl90IGJ1ZiA9IGdldGRxYnVmKCk7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKGRxdW90LT5kcV9vZmYgPj4gVjJfRFFCTEtTSVpFX0JJVFMgIT0gYmxrKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBRdW90YSBzdHJ1Y3R1cmUgaGFzIG9mZnNldCB0byBvdGhlciAiCisJCSAgImJsb2NrICgldSkgdGhhbiBpdCBzaG91bGQgKCV1KS5cbiIsIGJsaywKKwkJICAodWludCkoZHF1b3QtPmRxX29mZiA+PiBWMl9EUUJMS1NJWkVfQklUUykpOworCQlnb3RvIG91dF9idWY7CisJfQorCWlmICgocmV0ID0gcmVhZF9ibGsoc2IsIHR5cGUsIGJsaywgYnVmKSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBDYW4ndCByZWFkIHF1b3RhIGRhdGEgYmxvY2sgJXVcbiIsIGJsayk7CisJCWdvdG8gb3V0X2J1ZjsKKwl9CisJZGggPSAoc3RydWN0IHYyX2Rpc2tfZHFkYmhlYWRlciAqKWJ1ZjsKKwlkaC0+ZHFkaF9lbnRyaWVzID0gY3B1X3RvX2xlMTYobGUxNl90b19jcHUoZGgtPmRxZGhfZW50cmllcyktMSk7CisJaWYgKCFsZTE2X3RvX2NwdShkaC0+ZHFkaF9lbnRyaWVzKSkgewkvKiBCbG9jayBnb3QgZnJlZT8gKi8KKwkJaWYgKChyZXQgPSByZW1vdmVfZnJlZV9kcWVudHJ5KHNiLCB0eXBlLCBidWYsIGJsaykpIDwgMCB8fAorCQkgICAgKHJldCA9IHB1dF9mcmVlX2RxYmxrKHNiLCB0eXBlLCBidWYsIGJsaykpIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IENhbid0IG1vdmUgcXVvdGEgZGF0YSBibG9jayAoJXUpICIKKwkJCSAgInRvIGZyZWUgbGlzdC5cbiIsIGJsayk7CisJCQlnb3RvIG91dF9idWY7CisJCX0KKwl9CisJZWxzZSB7CisJCW1lbXNldChidWYrKGRxdW90LT5kcV9vZmYgJiAoKDEgPDwgVjJfRFFCTEtTSVpFX0JJVFMpLTEpKSwgMCwKKwkJICBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFibGspKTsKKwkJaWYgKGxlMTZfdG9fY3B1KGRoLT5kcWRoX2VudHJpZXMpID09IFYyX0RRU1RSSU5CTEstMSkgeworCQkJLyogSW5zZXJ0IHdpbGwgd3JpdGUgYmxvY2sgaXRzZWxmICovCisJCQlpZiAoKHJldCA9IGluc2VydF9mcmVlX2RxZW50cnkoc2IsIHR5cGUsIGJ1ZiwgYmxrKSkgPCAwKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IENhbid0IGluc2VydCBxdW90YSBkYXRhIGJsb2NrICgldSkgdG8gZnJlZSBlbnRyeSBsaXN0LlxuIiwgYmxrKTsKKwkJCQlnb3RvIG91dF9idWY7CisJCQl9CisJCX0KKwkJZWxzZQorCQkJaWYgKChyZXQgPSB3cml0ZV9ibGsoc2IsIHR5cGUsIGJsaywgYnVmKSkgPCAwKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IENhbid0IHdyaXRlIHF1b3RhIGRhdGEgIgorCQkJCSAgImJsb2NrICV1XG4iLCBibGspOworCQkJCWdvdG8gb3V0X2J1ZjsKKwkJCX0KKwl9CisJZHF1b3QtPmRxX29mZiA9IDA7CS8qIFF1b3RhIGlzIG5vdyB1bmF0dGFjaGVkICovCitvdXRfYnVmOgorCWZyZWVkcWJ1ZihidWYpOworCXJldHVybiByZXQ7Cit9CisKKy8qIFJlbW92ZSByZWZlcmVuY2UgdG8gZHF1b3QgZnJvbSB0cmVlICovCitzdGF0aWMgaW50IHJlbW92ZV90cmVlKHN0cnVjdCBkcXVvdCAqZHF1b3QsIHVpbnQgKmJsaywgaW50IGRlcHRoKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkcXVvdC0+ZHFfc2I7CisJaW50IHR5cGUgPSBkcXVvdC0+ZHFfdHlwZTsKKwlkcWJ1Zl90IGJ1ZiA9IGdldGRxYnVmKCk7CisJaW50IHJldCA9IDA7CisJdWludCBuZXdibGs7CisJX19sZTMyICpyZWYgPSAoX19sZTMyICopYnVmOworCQorCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoKHJldCA9IHJlYWRfYmxrKHNiLCB0eXBlLCAqYmxrLCBidWYpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IENhbid0IHJlYWQgcXVvdGEgZGF0YSBibG9jayAldVxuIiwgKmJsayk7CisJCWdvdG8gb3V0X2J1ZjsKKwl9CisJbmV3YmxrID0gbGUzMl90b19jcHUocmVmW0dFVElESU5ERVgoZHF1b3QtPmRxX2lkLCBkZXB0aCldKTsKKwlpZiAoZGVwdGggPT0gVjJfRFFUUkVFREVQVEgtMSkgeworCQlyZXQgPSBmcmVlX2RxZW50cnkoZHF1b3QsIG5ld2Jsayk7CisJCW5ld2JsayA9IDA7CisJfQorCWVsc2UKKwkJcmV0ID0gcmVtb3ZlX3RyZWUoZHF1b3QsICZuZXdibGssIGRlcHRoKzEpOworCWlmIChyZXQgPj0gMCAmJiAhbmV3YmxrKSB7CisJCWludCBpOworCQlyZWZbR0VUSURJTkRFWChkcXVvdC0+ZHFfaWQsIGRlcHRoKV0gPSBjcHVfdG9fbGUzMigwKTsKKwkJZm9yIChpID0gMDsgaSA8IFYyX0RRQkxLU0laRSAmJiAhYnVmW2ldOyBpKyspOwkvKiBCbG9jayBnb3QgZW1wdHk/ICovCisJCWlmIChpID09IFYyX0RRQkxLU0laRSkgeworCQkJcHV0X2ZyZWVfZHFibGsoc2IsIHR5cGUsIGJ1ZiwgKmJsayk7CisJCQkqYmxrID0gMDsKKwkJfQorCQllbHNlCisJCQlpZiAoKHJldCA9IHdyaXRlX2JsayhzYiwgdHlwZSwgKmJsaywgYnVmKSkgPCAwKQorCQkJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBDYW4ndCB3cml0ZSBxdW90YSB0cmVlICIKKwkJCQkgICJibG9jayAldS5cbiIsICpibGspOworCX0KK291dF9idWY6CisJZnJlZWRxYnVmKGJ1Zik7CisJcmV0dXJuIHJldDsJCit9CisKKy8qIERlbGV0ZSBkcXVvdCBmcm9tIHRyZWUgKi8KK3N0YXRpYyBpbnQgdjJfZGVsZXRlX2RxdW90KHN0cnVjdCBkcXVvdCAqZHF1b3QpCit7CisJdWludCB0bXAgPSBWMl9EUVRSRUVPRkY7CisKKwlpZiAoIWRxdW90LT5kcV9vZmYpCS8qIEV2ZW4gbm90IGFsbG9jYXRlZD8gKi8KKwkJcmV0dXJuIDA7CisJcmV0dXJuIHJlbW92ZV90cmVlKGRxdW90LCAmdG1wLCAwKTsKK30KKworLyogRmluZCBlbnRyeSBpbiBibG9jayAqLworc3RhdGljIGxvZmZfdCBmaW5kX2Jsb2NrX2RxZW50cnkoc3RydWN0IGRxdW90ICpkcXVvdCwgdWludCBibGspCit7CisJZHFidWZfdCBidWYgPSBnZXRkcWJ1ZigpOworCWxvZmZfdCByZXQgPSAwOworCWludCBpOworCXN0cnVjdCB2Ml9kaXNrX2RxYmxrICpkZHF1b3QgPSBHRVRFTlRSSUVTKGJ1Zik7CisKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKChyZXQgPSByZWFkX2JsayhkcXVvdC0+ZHFfc2IsIGRxdW90LT5kcV90eXBlLCBibGssIGJ1ZikpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIlZGUzogQ2FuJ3QgcmVhZCBxdW90YSB0cmVlIGJsb2NrICV1LlxuIiwgYmxrKTsKKwkJZ290byBvdXRfYnVmOworCX0KKwlpZiAoZHF1b3QtPmRxX2lkKQorCQlmb3IgKGkgPSAwOyBpIDwgVjJfRFFTVFJJTkJMSyAmJgorCQkgICAgIGxlMzJfdG9fY3B1KGRkcXVvdFtpXS5kcWJfaWQpICE9IGRxdW90LT5kcV9pZDsgaSsrKTsKKwllbHNlIHsJLyogSUQgMCBhcyBhIGJpdCBtb3JlIGNvbXBsaWNhdGVkIHNlYXJjaGluZy4uLiAqLworCQlzdHJ1Y3QgdjJfZGlza19kcWJsayBmYWtlZHF1b3Q7CisKKwkJbWVtc2V0KCZmYWtlZHF1b3QsIDAsIHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWJsaykpOworCQlmb3IgKGkgPSAwOyBpIDwgVjJfRFFTVFJJTkJMSzsgaSsrKQorCQkJaWYgKCFsZTMyX3RvX2NwdShkZHF1b3RbaV0uZHFiX2lkKSAmJgorCQkJICAgIG1lbWNtcCgmZmFrZWRxdW90LCBkZHF1b3QraSwgc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxYmxrKSkpCisJCQkJYnJlYWs7CisJfQorCWlmIChpID09IFYyX0RRU1RSSU5CTEspIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IFF1b3RhIGZvciBpZCAldSByZWZlcmVuY2VkICIKKwkJICAiYnV0IG5vdCBwcmVzZW50LlxuIiwgZHF1b3QtPmRxX2lkKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXRfYnVmOworCX0KKwllbHNlCisJCXJldCA9IChibGsgPDwgVjJfRFFCTEtTSVpFX0JJVFMpICsgc2l6ZW9mKHN0cnVjdAorCQkgIHYyX2Rpc2tfZHFkYmhlYWRlcikgKyBpICogc2l6ZW9mKHN0cnVjdCB2Ml9kaXNrX2RxYmxrKTsKK291dF9idWY6CisJZnJlZWRxYnVmKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworLyogRmluZCBlbnRyeSBmb3IgZ2l2ZW4gaWQgaW4gdGhlIHRyZWUgKi8KK3N0YXRpYyBsb2ZmX3QgZmluZF90cmVlX2RxZW50cnkoc3RydWN0IGRxdW90ICpkcXVvdCwgdWludCBibGssIGludCBkZXB0aCkKK3sKKwlkcWJ1Zl90IGJ1ZiA9IGdldGRxYnVmKCk7CisJbG9mZl90IHJldCA9IDA7CisJX19sZTMyICpyZWYgPSAoX19sZTMyICopYnVmOworCisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCWlmICgocmV0ID0gcmVhZF9ibGsoZHF1b3QtPmRxX3NiLCBkcXVvdC0+ZHFfdHlwZSwgYmxrLCBidWYpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJWRlM6IENhbid0IHJlYWQgcXVvdGEgdHJlZSBibG9jayAldS5cbiIsIGJsayk7CisJCWdvdG8gb3V0X2J1ZjsKKwl9CisJcmV0ID0gMDsKKwlibGsgPSBsZTMyX3RvX2NwdShyZWZbR0VUSURJTkRFWChkcXVvdC0+ZHFfaWQsIGRlcHRoKV0pOworCWlmICghYmxrKQkvKiBObyByZWZlcmVuY2U/ICovCisJCWdvdG8gb3V0X2J1ZjsKKwlpZiAoZGVwdGggPCBWMl9EUVRSRUVERVBUSC0xKQorCQlyZXQgPSBmaW5kX3RyZWVfZHFlbnRyeShkcXVvdCwgYmxrLCBkZXB0aCsxKTsKKwllbHNlCisJCXJldCA9IGZpbmRfYmxvY2tfZHFlbnRyeShkcXVvdCwgYmxrKTsKK291dF9idWY6CisJZnJlZWRxYnVmKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworLyogRmluZCBlbnRyeSBmb3IgZ2l2ZW4gaWQgaW4gdGhlIHRyZWUgLSB3cmFwcGVyIGZ1bmN0aW9uICovCitzdGF0aWMgaW5saW5lIGxvZmZfdCBmaW5kX2RxZW50cnkoc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKwlyZXR1cm4gZmluZF90cmVlX2RxZW50cnkoZHF1b3QsIFYyX0RRVFJFRU9GRiwgMCk7Cit9CisKK3N0YXRpYyBpbnQgdjJfcmVhZF9kcXVvdChzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCWludCB0eXBlID0gZHF1b3QtPmRxX3R5cGU7CisJbG9mZl90IG9mZnNldDsKKwlzdHJ1Y3QgdjJfZGlza19kcWJsayBkZHF1b3QsIGVtcHR5OworCWludCByZXQgPSAwOworCisjaWZkZWYgX19RVU9UQV9WMl9QQVJBTk9JQQorCS8qIEludmFsaWRhdGVkIHF1b3RhPyAqLworCWlmICghZHF1b3QtPmRxX3NiIHx8ICFzYl9kcW9wdChkcXVvdC0+ZHFfc2IpLT5maWxlc1t0eXBlXSkgeworCQlwcmludGsoS0VSTl9FUlIgIlZGUzogUXVvdGEgaW52YWxpZGF0ZWQgd2hpbGUgcmVhZGluZyFcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisjZW5kaWYKKwlvZmZzZXQgPSBmaW5kX2RxZW50cnkoZHF1b3QpOworCWlmIChvZmZzZXQgPD0gMCkgewkvKiBFbnRyeSBub3QgcHJlc2VudD8gKi8KKwkJaWYgKG9mZnNldCA8IDApCisJCQlwcmludGsoS0VSTl9FUlIgIlZGUzogQ2FuJ3QgcmVhZCBxdW90YSAiCisJCQkgICJzdHJ1Y3R1cmUgZm9yIGlkICV1LlxuIiwgZHF1b3QtPmRxX2lkKTsKKwkJZHF1b3QtPmRxX29mZiA9IDA7CisJCXNldF9iaXQoRFFfRkFLRV9CLCAmZHF1b3QtPmRxX2ZsYWdzKTsKKwkJbWVtc2V0KCZkcXVvdC0+ZHFfZHFiLCAwLCBzaXplb2Yoc3RydWN0IG1lbV9kcWJsaykpOworCQlyZXQgPSBvZmZzZXQ7CisJfQorCWVsc2UgeworCQlkcXVvdC0+ZHFfb2ZmID0gb2Zmc2V0OworCQlpZiAoKHJldCA9IGRxdW90LT5kcV9zYi0+c19vcC0+cXVvdGFfcmVhZChkcXVvdC0+ZHFfc2IsIHR5cGUsCisJCSAgICAoY2hhciAqKSZkZHF1b3QsIHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWJsayksIG9mZnNldCkpCisJCSAgICAhPSBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFibGspKSB7CisJCQlpZiAocmV0ID49IDApCisJCQkJcmV0ID0gLUVJTzsKKwkJCXByaW50ayhLRVJOX0VSUiAiVkZTOiBFcnJvciB3aGlsZSByZWFkaW5nIHF1b3RhICIKKwkJCSAgInN0cnVjdHVyZSBmb3IgaWQgJXUuXG4iLCBkcXVvdC0+ZHFfaWQpOworCQkJbWVtc2V0KCZkZHF1b3QsIDAsIHNpemVvZihzdHJ1Y3QgdjJfZGlza19kcWJsaykpOworCQl9CisJCWVsc2UgeworCQkJcmV0ID0gMDsKKwkJCS8qIFdlIG5lZWQgdG8gZXNjYXBlIGJhY2sgYWxsLXplcm8gc3RydWN0dXJlICovCisJCQltZW1zZXQoJmVtcHR5LCAwLCBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFibGspKTsKKwkJCWVtcHR5LmRxYl9pdGltZSA9IGNwdV90b19sZTY0KDEpOworCQkJaWYgKCFtZW1jbXAoJmVtcHR5LCAmZGRxdW90LCBzaXplb2Yoc3RydWN0IHYyX2Rpc2tfZHFibGspKSkKKwkJCQlkZHF1b3QuZHFiX2l0aW1lID0gMDsKKwkJfQorCQlkaXNrMm1lbWRxYigmZHF1b3QtPmRxX2RxYiwgJmRkcXVvdCk7CisJCWlmICghZHF1b3QtPmRxX2RxYi5kcWJfYmhhcmRsaW1pdCAmJgorCQkJIWRxdW90LT5kcV9kcWIuZHFiX2Jzb2Z0bGltaXQgJiYKKwkJCSFkcXVvdC0+ZHFfZHFiLmRxYl9paGFyZGxpbWl0ICYmCisJCQkhZHF1b3QtPmRxX2RxYi5kcWJfaXNvZnRsaW1pdCkKKwkJCXNldF9iaXQoRFFfRkFLRV9CLCAmZHF1b3QtPmRxX2ZsYWdzKTsKKwl9CisJZHFzdGF0cy5yZWFkcysrOworCisJcmV0dXJuIHJldDsKK30KKworLyogQ2hlY2sgd2hldGhlciBkcXVvdCBzaG91bGQgbm90IGJlIGRlbGV0ZWQuIFdlIGtub3cgd2UgYXJlCisgKiB0aGUgb25seSBvbmUgb3BlcmF0aW5nIG9uIGRxdW90ICh0aGFua3MgdG8gZHFfbG9jaykgKi8KK3N0YXRpYyBpbnQgdjJfcmVsZWFzZV9kcXVvdChzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworCWlmICh0ZXN0X2JpdChEUV9GQUtFX0IsICZkcXVvdC0+ZHFfZmxhZ3MpICYmICEoZHF1b3QtPmRxX2RxYi5kcWJfY3VyaW5vZGVzIHwgZHF1b3QtPmRxX2RxYi5kcWJfY3Vyc3BhY2UpKQorCQlyZXR1cm4gdjJfZGVsZXRlX2RxdW90KGRxdW90KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBxdW90YV9mb3JtYXRfb3BzIHYyX2Zvcm1hdF9vcHMgPSB7CisJLmNoZWNrX3F1b3RhX2ZpbGUJPSB2Ml9jaGVja19xdW90YV9maWxlLAorCS5yZWFkX2ZpbGVfaW5mbwkJPSB2Ml9yZWFkX2ZpbGVfaW5mbywKKwkud3JpdGVfZmlsZV9pbmZvCT0gdjJfd3JpdGVfZmlsZV9pbmZvLAorCS5mcmVlX2ZpbGVfaW5mbwkJPSBOVUxMLAorCS5yZWFkX2RxYmxrCQk9IHYyX3JlYWRfZHF1b3QsCisJLmNvbW1pdF9kcWJsawkJPSB2Ml93cml0ZV9kcXVvdCwKKwkucmVsZWFzZV9kcWJsawkJPSB2Ml9yZWxlYXNlX2RxdW90LAorfTsKKworc3RhdGljIHN0cnVjdCBxdW90YV9mb3JtYXRfdHlwZSB2Ml9xdW90YV9mb3JtYXQgPSB7CisJLnFmX2ZtdF9pZAk9IFFGTVRfVkZTX1YwLAorCS5xZl9vcHMJCT0gJnYyX2Zvcm1hdF9vcHMsCisJLnFmX293bmVyCT0gVEhJU19NT0RVTEUKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfdjJfcXVvdGFfZm9ybWF0KHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX3F1b3RhX2Zvcm1hdCgmdjJfcXVvdGFfZm9ybWF0KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfdjJfcXVvdGFfZm9ybWF0KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9xdW90YV9mb3JtYXQoJnYyX3F1b3RhX2Zvcm1hdCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfdjJfcXVvdGFfZm9ybWF0KTsKK21vZHVsZV9leGl0KGV4aXRfdjJfcXVvdGFfZm9ybWF0KTsKZGlmZiAtLWdpdCBhL2ZzL3JhbWZzL01ha2VmaWxlIGIvZnMvcmFtZnMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA5NmYzMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3JhbWZzL01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IHJhbWZzIHJvdXRpbmVzLgorIworCitvYmotJChDT05GSUdfUkFNRlMpICs9IHJhbWZzLm8KKworcmFtZnMtb2JqcyA6PSBpbm9kZS5vCmRpZmYgLS1naXQgYS9mcy9yYW1mcy9pbm9kZS5jIGIvZnMvcmFtZnMvaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTg4OTE3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvcmFtZnMvaW5vZGUuYwpAQCAtMCwwICsxLDI0NiBAQAorLyoKKyAqIFJlc2l6YWJsZSBzaW1wbGUgcmFtIGZpbGVzeXN0ZW0gZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBMaW51cyBUb3J2YWxkcy4KKyAqICAgICAgICAgICAgICAgMjAwMCBUcmFuc21ldGEgQ29ycC4KKyAqCisgKiBVc2FnZSBsaW1pdHMgYWRkZWQgYnkgRGF2aWQgR2lic29uLCBMaW51eGNhcmUgQXVzdHJhbGlhLgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuCisgKi8KKworLyoKKyAqIE5PVEUhIFRoaXMgZmlsZXN5c3RlbSBpcyBwcm9iYWJseSBtb3N0IHVzZWZ1bAorICogbm90IGFzIGEgcmVhbCBmaWxlc3lzdGVtLCBidXQgYXMgYW4gZXhhbXBsZSBvZgorICogaG93IHZpcnR1YWwgZmlsZXN5c3RlbXMgY2FuIGJlIHdyaXR0ZW4uCisgKgorICogSXQgZG9lc24ndCBnZXQgbXVjaCBzaW1wbGVyIHRoYW4gdGhpcy4gQ29uc2lkZXIKKyAqIHRoYXQgdGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIGZ1bGwgc2VtYW50aWNzIG9mCisgKiBhIFBPU0lYLWNvbXBsaWFudCByZWFkLXdyaXRlIGZpbGVzeXN0ZW0uCisgKgorICogTm90ZSBpbiBwYXJ0aWN1bGFyIGhvdyB0aGUgZmlsZXN5c3RlbSBkb2VzIG5vdAorICogbmVlZCB0byBpbXBsZW1lbnQgYW55IGRhdGEgc3RydWN0dXJlcyBvZiBpdHMgb3duCisgKiB0byBrZWVwIHRyYWNrIG9mIHRoZSB2aXJ0dWFsIGRhdGE6IHVzaW5nIHRoZSBWRlMKKyAqIGNhY2hlcyBpcyBzdWZmaWNpZW50LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYmFja2luZy1kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW1mcy5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworLyogc29tZSByYW5kb20gbnVtYmVyICovCisjZGVmaW5lIFJBTUZTX01BR0lDCTB4ODU4NDU4ZjYKKworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHJhbWZzX29wczsKK3N0YXRpYyBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHJhbWZzX2FvcHM7CitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcmFtZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHJhbWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCitzdGF0aWMgc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gcmFtZnNfYmFja2luZ19kZXZfaW5mbyA9IHsKKwkucmFfcGFnZXMJPSAwLAkvKiBObyByZWFkYWhlYWQgKi8KKwkuY2FwYWJpbGl0aWVzCT0gQkRJX0NBUF9OT19BQ0NUX0RJUlRZIHwgQkRJX0NBUF9OT19XUklURUJBQ0sgfAorCQkJICBCRElfQ0FQX01BUF9ESVJFQ1QgfCBCRElfQ0FQX01BUF9DT1BZIHwKKwkJCSAgQkRJX0NBUF9SRUFEX01BUCB8IEJESV9DQVBfV1JJVEVfTUFQIHwgQkRJX0NBUF9FWEVDX01BUCwKK307CisKK3N0cnVjdCBpbm9kZSAqcmFtZnNfZ2V0X2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBtb2RlLCBkZXZfdCBkZXYpCit7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBuZXdfaW5vZGUoc2IpOworCisJaWYgKGlub2RlKSB7CisJCWlub2RlLT5pX21vZGUgPSBtb2RlOworCQlpbm9kZS0+aV91aWQgPSBjdXJyZW50LT5mc3VpZDsKKwkJaW5vZGUtPmlfZ2lkID0gY3VycmVudC0+ZnNnaWQ7CisJCWlub2RlLT5pX2Jsa3NpemUgPSBQQUdFX0NBQ0hFX1NJWkU7CisJCWlub2RlLT5pX2Jsb2NrcyA9IDA7CisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJnJhbWZzX2FvcHM7CisJCWlub2RlLT5pX21hcHBpbmctPmJhY2tpbmdfZGV2X2luZm8gPSAmcmFtZnNfYmFja2luZ19kZXZfaW5mbzsKKwkJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCQlzd2l0Y2ggKG1vZGUgJiBTX0lGTVQpIHsKKwkJZGVmYXVsdDoKKwkJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgbW9kZSwgZGV2KTsKKwkJCWJyZWFrOworCQljYXNlIFNfSUZSRUc6CisJCQlpbm9kZS0+aV9vcCA9ICZyYW1mc19maWxlX2lub2RlX29wZXJhdGlvbnM7CisJCQlpbm9kZS0+aV9mb3AgPSAmcmFtZnNfZmlsZV9vcGVyYXRpb25zOworCQkJYnJlYWs7CisJCWNhc2UgU19JRkRJUjoKKwkJCWlub2RlLT5pX29wID0gJnJhbWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCQkJaW5vZGUtPmlfZm9wID0gJnNpbXBsZV9kaXJfb3BlcmF0aW9uczsKKworCQkJLyogZGlyZWN0b3J5IGlub2RlcyBzdGFydCBvZmYgd2l0aCBpX25saW5rID09IDIgKGZvciAiLiIgZW50cnkpICovCisJCQlpbm9kZS0+aV9ubGluaysrOworCQkJYnJlYWs7CisJCWNhc2UgU19JRkxOSzoKKwkJCWlub2RlLT5pX29wID0gJnBhZ2Vfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGlub2RlOworfQorCisvKgorICogRmlsZSBjcmVhdGlvbi4gQWxsb2NhdGUgYW4gaW5vZGUsIGFuZCB3ZSdyZSBkb25lLi4KKyAqLworLyogU01QLXNhZmUgKi8KK3N0YXRpYyBpbnQKK3JhbWZzX21rbm9kKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLCBkZXZfdCBkZXYpCit7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSByYW1mc19nZXRfaW5vZGUoZGlyLT5pX3NiLCBtb2RlLCBkZXYpOworCWludCBlcnJvciA9IC1FTk9TUEM7CisKKwlpZiAoaW5vZGUpIHsKKwkJaWYgKGRpci0+aV9tb2RlICYgU19JU0dJRCkgeworCQkJaW5vZGUtPmlfZ2lkID0gZGlyLT5pX2dpZDsKKwkJCWlmIChTX0lTRElSKG1vZGUpKQorCQkJCWlub2RlLT5pX21vZGUgfD0gU19JU0dJRDsKKwkJfQorCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCQlkZ2V0KGRlbnRyeSk7CS8qIEV4dHJhIGNvdW50IC0gcGluIHRoZSBkZW50cnkgaW4gY29yZSAqLworCQllcnJvciA9IDA7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCByYW1mc19ta2RpcihzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnksIGludCBtb2RlKQoreworCWludCByZXR2YWwgPSByYW1mc19ta25vZChkaXIsIGRlbnRyeSwgbW9kZSB8IFNfSUZESVIsIDApOworCWlmICghcmV0dmFsKQorCQlkaXItPmlfbmxpbmsrKzsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHJhbWZzX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJcmV0dXJuIHJhbWZzX21rbm9kKGRpciwgZGVudHJ5LCBtb2RlIHwgU19JRlJFRywgMCk7Cit9CisKK3N0YXRpYyBpbnQgcmFtZnNfc3ltbGluayhzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqIHN5bW5hbWUpCit7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlpbnQgZXJyb3IgPSAtRU5PU1BDOworCisJaW5vZGUgPSByYW1mc19nZXRfaW5vZGUoZGlyLT5pX3NiLCBTX0lGTE5LfFNfSVJXWFVHTywgMCk7CisJaWYgKGlub2RlKSB7CisJCWludCBsID0gc3RybGVuKHN5bW5hbWUpKzE7CisJCWVycm9yID0gcGFnZV9zeW1saW5rKGlub2RlLCBzeW1uYW1lLCBsKTsKKwkJaWYgKCFlcnJvcikgeworCQkJaWYgKGRpci0+aV9tb2RlICYgU19JU0dJRCkKKwkJCQlpbm9kZS0+aV9naWQgPSBkaXItPmlfZ2lkOworCQkJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwkJCWRnZXQoZGVudHJ5KTsKKwkJfSBlbHNlCisJCQlpcHV0KGlub2RlKTsKKwl9CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyByYW1mc19hb3BzID0geworCS5yZWFkcGFnZQk9IHNpbXBsZV9yZWFkcGFnZSwKKwkucHJlcGFyZV93cml0ZQk9IHNpbXBsZV9wcmVwYXJlX3dyaXRlLAorCS5jb21taXRfd3JpdGUJPSBzaW1wbGVfY29tbWl0X3dyaXRlCit9OworCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJhbWZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkucmVhZAkJPSBnZW5lcmljX2ZpbGVfcmVhZCwKKwkud3JpdGUJCT0gZ2VuZXJpY19maWxlX3dyaXRlLAorCS5tbWFwCQk9IGdlbmVyaWNfZmlsZV9tbWFwLAorCS5mc3luYwkJPSBzaW1wbGVfc3luY19maWxlLAorCS5zZW5kZmlsZQk9IGdlbmVyaWNfZmlsZV9zZW5kZmlsZSwKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCit9OworCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcmFtZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zID0geworCS5nZXRhdHRyCT0gc2ltcGxlX2dldGF0dHIsCit9OworCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgcmFtZnNfZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLmNyZWF0ZQkJPSByYW1mc19jcmVhdGUsCisJLmxvb2t1cAkJPSBzaW1wbGVfbG9va3VwLAorCS5saW5rCQk9IHNpbXBsZV9saW5rLAorCS51bmxpbmsJCT0gc2ltcGxlX3VubGluaywKKwkuc3ltbGluawk9IHJhbWZzX3N5bWxpbmssCisJLm1rZGlyCQk9IHJhbWZzX21rZGlyLAorCS5ybWRpcgkJPSBzaW1wbGVfcm1kaXIsCisJLm1rbm9kCQk9IHJhbWZzX21rbm9kLAorCS5yZW5hbWUJCT0gc2ltcGxlX3JlbmFtZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyByYW1mc19vcHMgPSB7CisJLnN0YXRmcwkJPSBzaW1wbGVfc3RhdGZzLAorCS5kcm9wX2lub2RlCT0gZ2VuZXJpY19kZWxldGVfaW5vZGUsCit9OworCitzdGF0aWMgaW50IHJhbWZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIHZvaWQgKiBkYXRhLCBpbnQgc2lsZW50KQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCXN0cnVjdCBkZW50cnkgKiByb290OworCisJc2ItPnNfbWF4Ynl0ZXMgPSBNQVhfTEZTX0ZJTEVTSVpFOworCXNiLT5zX2Jsb2Nrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKKwlzYi0+c19ibG9ja3NpemVfYml0cyA9IFBBR0VfQ0FDSEVfU0hJRlQ7CisJc2ItPnNfbWFnaWMgPSBSQU1GU19NQUdJQzsKKwlzYi0+c19vcCA9ICZyYW1mc19vcHM7CisJc2ItPnNfdGltZV9ncmFuID0gMTsKKwlpbm9kZSA9IHJhbWZzX2dldF9pbm9kZShzYiwgU19JRkRJUiB8IDA3NTUsIDApOworCWlmICghaW5vZGUpCisJCXJldHVybiAtRU5PTUVNOworCisJcm9vdCA9IGRfYWxsb2Nfcm9vdChpbm9kZSk7CisJaWYgKCFyb290KSB7CisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJc2ItPnNfcm9vdCA9IHJvb3Q7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBzdXBlcl9ibG9jayAqcmFtZnNfZ2V0X3NiKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAorCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9ub2Rldihmc190eXBlLCBmbGFncywgZGF0YSwgcmFtZnNfZmlsbF9zdXBlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnJvb3Rmc19nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZ2V0X3NiX25vZGV2KGZzX3R5cGUsIGZsYWdzfE1TX05PVVNFUiwgZGF0YSwgcmFtZnNfZmlsbF9zdXBlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSByYW1mc19mc190eXBlID0geworCS5uYW1lCQk9ICJyYW1mcyIsCisJLmdldF9zYgkJPSByYW1mc19nZXRfc2IsCisJLmtpbGxfc2IJPSBraWxsX2xpdHRlcl9zdXBlciwKK307CitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgcm9vdGZzX2ZzX3R5cGUgPSB7CisJLm5hbWUJCT0gInJvb3RmcyIsCisJLmdldF9zYgkJPSByb290ZnNfZ2V0X3NiLAorCS5raWxsX3NiCT0ga2lsbF9saXR0ZXJfc3VwZXIsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3JhbWZzX2ZzKHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnJhbWZzX2ZzX3R5cGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9yYW1mc19mcyh2b2lkKQoreworCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmcmFtZnNfZnNfdHlwZSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfcmFtZnNfZnMpCittb2R1bGVfZXhpdChleGl0X3JhbWZzX2ZzKQorCitpbnQgX19pbml0IGluaXRfcm9vdGZzKHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnJvb3Rmc19mc190eXBlKTsKK30KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvcmVhZF93cml0ZS5jIGIvZnMvcmVhZF93cml0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZTRiMWEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9yZWFkX3dyaXRlLmMKQEAgLTAsMCArMSw3MzAgQEAKKy8qCisgKiAgbGludXgvZnMvcmVhZF93cml0ZS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPiAKKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kbm90aWZ5Lmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgZ2VuZXJpY19yb19mb3BzID0geworCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKKwkucmVhZAkJPSBnZW5lcmljX2ZpbGVfcmVhZCwKKwkubW1hcAkJPSBnZW5lcmljX2ZpbGVfcmVhZG9ubHlfbW1hcCwKKwkuc2VuZGZpbGUJPSBnZW5lcmljX2ZpbGVfc2VuZGZpbGUsCit9OworCitFWFBPUlRfU1lNQk9MKGdlbmVyaWNfcm9fZm9wcyk7CisKK2xvZmZfdCBnZW5lcmljX2ZpbGVfbGxzZWVrKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgb3JpZ2luKQoreworCWxvbmcgbG9uZyByZXR2YWw7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKKworCWRvd24oJmlub2RlLT5pX3NlbSk7CisJc3dpdGNoIChvcmlnaW4pIHsKKwkJY2FzZSAyOgorCQkJb2Zmc2V0ICs9IGlub2RlLT5pX3NpemU7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJb2Zmc2V0ICs9IGZpbGUtPmZfcG9zOworCX0KKwlyZXR2YWwgPSAtRUlOVkFMOworCWlmIChvZmZzZXQ+PTAgJiYgb2Zmc2V0PD1pbm9kZS0+aV9zYi0+c19tYXhieXRlcykgeworCQlpZiAob2Zmc2V0ICE9IGZpbGUtPmZfcG9zKSB7CisJCQlmaWxlLT5mX3BvcyA9IG9mZnNldDsKKwkJCWZpbGUtPmZfdmVyc2lvbiA9IDA7CisJCX0KKwkJcmV0dmFsID0gb2Zmc2V0OworCX0KKwl1cCgmaW5vZGUtPmlfc2VtKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitFWFBPUlRfU1lNQk9MKGdlbmVyaWNfZmlsZV9sbHNlZWspOworCitsb2ZmX3QgcmVtb3RlX2xsc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWdpbikKK3sKKwlsb25nIGxvbmcgcmV0dmFsOworCisJbG9ja19rZXJuZWwoKTsKKwlzd2l0Y2ggKG9yaWdpbikgeworCQljYXNlIDI6CisJCQlvZmZzZXQgKz0gaV9zaXplX3JlYWQoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCW9mZnNldCArPSBmaWxlLT5mX3BvczsKKwl9CisJcmV0dmFsID0gLUVJTlZBTDsKKwlpZiAob2Zmc2V0Pj0wICYmIG9mZnNldDw9ZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUtPmlfc2ItPnNfbWF4Ynl0ZXMpIHsKKwkJaWYgKG9mZnNldCAhPSBmaWxlLT5mX3BvcykgeworCQkJZmlsZS0+Zl9wb3MgPSBvZmZzZXQ7CisJCQlmaWxlLT5mX3ZlcnNpb24gPSAwOworCQl9CisJCXJldHZhbCA9IG9mZnNldDsKKwl9CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXR2YWw7Cit9CitFWFBPUlRfU1lNQk9MKHJlbW90ZV9sbHNlZWspOworCitsb2ZmX3Qgbm9fbGxzZWVrKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgb3JpZ2luKQoreworCXJldHVybiAtRVNQSVBFOworfQorRVhQT1JUX1NZTUJPTChub19sbHNlZWspOworCitsb2ZmX3QgZGVmYXVsdF9sbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsIGludCBvcmlnaW4pCit7CisJbG9uZyBsb25nIHJldHZhbDsKKworCWxvY2tfa2VybmVsKCk7CisJc3dpdGNoIChvcmlnaW4pIHsKKwkJY2FzZSAyOgorCQkJb2Zmc2V0ICs9IGlfc2l6ZV9yZWFkKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlvZmZzZXQgKz0gZmlsZS0+Zl9wb3M7CisJfQorCXJldHZhbCA9IC1FSU5WQUw7CisJaWYgKG9mZnNldCA+PSAwKSB7CisJCWlmIChvZmZzZXQgIT0gZmlsZS0+Zl9wb3MpIHsKKwkJCWZpbGUtPmZfcG9zID0gb2Zmc2V0OworCQkJZmlsZS0+Zl92ZXJzaW9uID0gMDsKKwkJfQorCQlyZXR2YWwgPSBvZmZzZXQ7CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmV0dmFsOworfQorRVhQT1JUX1NZTUJPTChkZWZhdWx0X2xsc2Vlayk7CisKK2xvZmZfdCB2ZnNfbGxzZWVrKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgb3JpZ2luKQoreworCWxvZmZfdCAoKmZuKShzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QsIGludCk7CisKKwlmbiA9IG5vX2xsc2VlazsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfTFNFRUspIHsKKwkJZm4gPSBkZWZhdWx0X2xsc2VlazsKKwkJaWYgKGZpbGUtPmZfb3AgJiYgZmlsZS0+Zl9vcC0+bGxzZWVrKQorCQkJZm4gPSBmaWxlLT5mX29wLT5sbHNlZWs7CisJfQorCXJldHVybiBmbihmaWxlLCBvZmZzZXQsIG9yaWdpbik7Cit9CitFWFBPUlRfU1lNQk9MKHZmc19sbHNlZWspOworCithc21saW5rYWdlIG9mZl90IHN5c19sc2Vlayh1bnNpZ25lZCBpbnQgZmQsIG9mZl90IG9mZnNldCwgdW5zaWduZWQgaW50IG9yaWdpbikKK3sKKwlvZmZfdCByZXR2YWw7CisJc3RydWN0IGZpbGUgKiBmaWxlOworCWludCBmcHV0X25lZWRlZDsKKworCXJldHZhbCA9IC1FQkFERjsKKwlmaWxlID0gZmdldF9saWdodChmZCwgJmZwdXRfbmVlZGVkKTsKKwlpZiAoIWZpbGUpCisJCWdvdG8gYmFkOworCisJcmV0dmFsID0gLUVJTlZBTDsKKwlpZiAob3JpZ2luIDw9IDIpIHsKKwkJbG9mZl90IHJlcyA9IHZmc19sbHNlZWsoZmlsZSwgb2Zmc2V0LCBvcmlnaW4pOworCQlyZXR2YWwgPSByZXM7CisJCWlmIChyZXMgIT0gKGxvZmZfdClyZXR2YWwpCisJCQlyZXR2YWwgPSAtRU9WRVJGTE9XOwkvKiBMRlM6IHNob3VsZCBvbmx5IGhhcHBlbiBvbiAzMiBiaXQgcGxhdGZvcm1zICovCisJfQorCWZwdXRfbGlnaHQoZmlsZSwgZnB1dF9uZWVkZWQpOworYmFkOgorCXJldHVybiByZXR2YWw7Cit9CisKKyNpZmRlZiBfX0FSQ0hfV0FOVF9TWVNfTExTRUVLCithc21saW5rYWdlIGxvbmcgc3lzX2xsc2Vlayh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0X2hpZ2gsCisJCQkgICB1bnNpZ25lZCBsb25nIG9mZnNldF9sb3csIGxvZmZfdCBfX3VzZXIgKiByZXN1bHQsCisJCQkgICB1bnNpZ25lZCBpbnQgb3JpZ2luKQoreworCWludCByZXR2YWw7CisJc3RydWN0IGZpbGUgKiBmaWxlOworCWxvZmZfdCBvZmZzZXQ7CisJaW50IGZwdXRfbmVlZGVkOworCisJcmV0dmFsID0gLUVCQURGOworCWZpbGUgPSBmZ2V0X2xpZ2h0KGZkLCAmZnB1dF9uZWVkZWQpOworCWlmICghZmlsZSkKKwkJZ290byBiYWQ7CisKKwlyZXR2YWwgPSAtRUlOVkFMOworCWlmIChvcmlnaW4gPiAyKQorCQlnb3RvIG91dF9wdXRmOworCisJb2Zmc2V0ID0gdmZzX2xsc2VlayhmaWxlLCAoKGxvZmZfdCkgb2Zmc2V0X2hpZ2ggPDwgMzIpIHwgb2Zmc2V0X2xvdywKKwkJCW9yaWdpbik7CisKKwlyZXR2YWwgPSAoaW50KW9mZnNldDsKKwlpZiAob2Zmc2V0ID49IDApIHsKKwkJcmV0dmFsID0gLUVGQVVMVDsKKwkJaWYgKCFjb3B5X3RvX3VzZXIocmVzdWx0LCAmb2Zmc2V0LCBzaXplb2Yob2Zmc2V0KSkpCisJCQlyZXR2YWwgPSAwOworCX0KK291dF9wdXRmOgorCWZwdXRfbGlnaHQoZmlsZSwgZnB1dF9uZWVkZWQpOworYmFkOgorCXJldHVybiByZXR2YWw7Cit9CisjZW5kaWYKKworCitpbnQgcndfdmVyaWZ5X2FyZWEoaW50IHJlYWRfd3JpdGUsIHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3QgKnBwb3MsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWxvZmZfdCBwb3M7CisKKwlpZiAodW5saWtlbHkoY291bnQgPiBmaWxlLT5mX21heGNvdW50KSkKKwkJZ290byBFaW52YWw7CisJcG9zID0gKnBwb3M7CisJaWYgKHVubGlrZWx5KChwb3MgPCAwKSB8fCAobG9mZl90KSAocG9zICsgY291bnQpIDwgMCkpCisJCWdvdG8gRWludmFsOworCisJaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpZiAoaW5vZGUtPmlfZmxvY2sgJiYgTUFOREFUT1JZX0xPQ0soaW5vZGUpKQorCQlyZXR1cm4gbG9ja3NfbWFuZGF0b3J5X2FyZWEocmVhZF93cml0ZSA9PSBSRUFEID8gRkxPQ0tfVkVSSUZZX1JFQUQgOiBGTE9DS19WRVJJRllfV1JJVEUsIGlub2RlLCBmaWxlLCBwb3MsIGNvdW50KTsKKwlyZXR1cm4gMDsKKworRWludmFsOgorCXJldHVybiAtRUlOVkFMOworfQorCitzc2l6ZV90IGRvX3N5bmNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBraW9jYiBraW9jYjsKKwlzc2l6ZV90IHJldDsKKworCWluaXRfc3luY19raW9jYigma2lvY2IsIGZpbHApOworCWtpb2NiLmtpX3BvcyA9ICpwcG9zOworCXJldCA9IGZpbHAtPmZfb3AtPmFpb19yZWFkKCZraW9jYiwgYnVmLCBsZW4sIGtpb2NiLmtpX3Bvcyk7CisJaWYgKC1FSU9DQlFVRVVFRCA9PSByZXQpCisJCXJldCA9IHdhaXRfb25fc3luY19raW9jYigma2lvY2IpOworCSpwcG9zID0ga2lvY2Iua2lfcG9zOworCXJldHVybiByZXQ7Cit9CisKK0VYUE9SVF9TWU1CT0woZG9fc3luY19yZWFkKTsKKworc3NpemVfdCB2ZnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKK3sKKwlzc2l6ZV90IHJldDsKKworCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQlyZXR1cm4gLUVCQURGOworCWlmICghZmlsZS0+Zl9vcCB8fCAoIWZpbGUtPmZfb3AtPnJlYWQgJiYgIWZpbGUtPmZfb3AtPmFpb19yZWFkKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHVubGlrZWx5KCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWYsIGNvdW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0ID0gcndfdmVyaWZ5X2FyZWEoUkVBRCwgZmlsZSwgcG9zLCBjb3VudCk7CisJaWYgKCFyZXQpIHsKKwkJcmV0ID0gc2VjdXJpdHlfZmlsZV9wZXJtaXNzaW9uIChmaWxlLCBNQVlfUkVBRCk7CisJCWlmICghcmV0KSB7CisJCQlpZiAoZmlsZS0+Zl9vcC0+cmVhZCkKKwkJCQlyZXQgPSBmaWxlLT5mX29wLT5yZWFkKGZpbGUsIGJ1ZiwgY291bnQsIHBvcyk7CisJCQllbHNlCisJCQkJcmV0ID0gZG9fc3luY19yZWFkKGZpbGUsIGJ1ZiwgY291bnQsIHBvcyk7CisJCQlpZiAocmV0ID4gMCkgeworCQkJCWRub3RpZnlfcGFyZW50KGZpbGUtPmZfZGVudHJ5LCBETl9BQ0NFU1MpOworCQkJCWN1cnJlbnQtPnJjaGFyICs9IHJldDsKKwkJCX0KKwkJCWN1cnJlbnQtPnN5c2NyKys7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitFWFBPUlRfU1lNQk9MKHZmc19yZWFkKTsKKworc3NpemVfdCBkb19zeW5jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGtpb2NiIGtpb2NiOworCXNzaXplX3QgcmV0OworCisJaW5pdF9zeW5jX2tpb2NiKCZraW9jYiwgZmlscCk7CisJa2lvY2Iua2lfcG9zID0gKnBwb3M7CisJcmV0ID0gZmlscC0+Zl9vcC0+YWlvX3dyaXRlKCZraW9jYiwgYnVmLCBsZW4sIGtpb2NiLmtpX3Bvcyk7CisJaWYgKC1FSU9DQlFVRVVFRCA9PSByZXQpCisJCXJldCA9IHdhaXRfb25fc3luY19raW9jYigma2lvY2IpOworCSpwcG9zID0ga2lvY2Iua2lfcG9zOworCXJldHVybiByZXQ7Cit9CisKK0VYUE9SVF9TWU1CT0woZG9fc3luY193cml0ZSk7CisKK3NzaXplX3QgdmZzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcG9zKQoreworCXNzaXplX3QgcmV0OworCisJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQlyZXR1cm4gLUVCQURGOworCWlmICghZmlsZS0+Zl9vcCB8fCAoIWZpbGUtPmZfb3AtPndyaXRlICYmICFmaWxlLT5mX29wLT5haW9fd3JpdGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodW5saWtlbHkoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmLCBjb3VudCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldCA9IHJ3X3ZlcmlmeV9hcmVhKFdSSVRFLCBmaWxlLCBwb3MsIGNvdW50KTsKKwlpZiAoIXJldCkgeworCQlyZXQgPSBzZWN1cml0eV9maWxlX3Blcm1pc3Npb24gKGZpbGUsIE1BWV9XUklURSk7CisJCWlmICghcmV0KSB7CisJCQlpZiAoZmlsZS0+Zl9vcC0+d3JpdGUpCisJCQkJcmV0ID0gZmlsZS0+Zl9vcC0+d3JpdGUoZmlsZSwgYnVmLCBjb3VudCwgcG9zKTsKKwkJCWVsc2UKKwkJCQlyZXQgPSBkb19zeW5jX3dyaXRlKGZpbGUsIGJ1ZiwgY291bnQsIHBvcyk7CisJCQlpZiAocmV0ID4gMCkgeworCQkJCWRub3RpZnlfcGFyZW50KGZpbGUtPmZfZGVudHJ5LCBETl9NT0RJRlkpOworCQkJCWN1cnJlbnQtPndjaGFyICs9IHJldDsKKwkJCX0KKwkJCWN1cnJlbnQtPnN5c2N3Kys7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitFWFBPUlRfU1lNQk9MKHZmc193cml0ZSk7CisKK3N0YXRpYyBpbmxpbmUgbG9mZl90IGZpbGVfcG9zX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIGZpbGUtPmZfcG9zOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZmlsZV9wb3Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBwb3MpCit7CisJZmlsZS0+Zl9wb3MgPSBwb3M7Cit9CisKK2FzbWxpbmthZ2Ugc3NpemVfdCBzeXNfcmVhZCh1bnNpZ25lZCBpbnQgZmQsIGNoYXIgX191c2VyICogYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJc3NpemVfdCByZXQgPSAtRUJBREY7CisJaW50IGZwdXRfbmVlZGVkOworCisJZmlsZSA9IGZnZXRfbGlnaHQoZmQsICZmcHV0X25lZWRlZCk7CisJaWYgKGZpbGUpIHsKKwkJbG9mZl90IHBvcyA9IGZpbGVfcG9zX3JlYWQoZmlsZSk7CisJCXJldCA9IHZmc19yZWFkKGZpbGUsIGJ1ZiwgY291bnQsICZwb3MpOworCQlmaWxlX3Bvc193cml0ZShmaWxlLCBwb3MpOworCQlmcHV0X2xpZ2h0KGZpbGUsIGZwdXRfbmVlZGVkKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3lzX3JlYWQpOworCithc21saW5rYWdlIHNzaXplX3Qgc3lzX3dyaXRlKHVuc2lnbmVkIGludCBmZCwgY29uc3QgY2hhciBfX3VzZXIgKiBidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlzc2l6ZV90IHJldCA9IC1FQkFERjsKKwlpbnQgZnB1dF9uZWVkZWQ7CisKKwlmaWxlID0gZmdldF9saWdodChmZCwgJmZwdXRfbmVlZGVkKTsKKwlpZiAoZmlsZSkgeworCQlsb2ZmX3QgcG9zID0gZmlsZV9wb3NfcmVhZChmaWxlKTsKKwkJcmV0ID0gdmZzX3dyaXRlKGZpbGUsIGJ1ZiwgY291bnQsICZwb3MpOworCQlmaWxlX3Bvc193cml0ZShmaWxlLCBwb3MpOworCQlmcHV0X2xpZ2h0KGZpbGUsIGZwdXRfbmVlZGVkKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCithc21saW5rYWdlIHNzaXplX3Qgc3lzX3ByZWFkNjQodW5zaWduZWQgaW50IGZkLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCBwb3MpCit7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJc3NpemVfdCByZXQgPSAtRUJBREY7CisJaW50IGZwdXRfbmVlZGVkOworCisJaWYgKHBvcyA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJZmlsZSA9IGZnZXRfbGlnaHQoZmQsICZmcHV0X25lZWRlZCk7CisJaWYgKGZpbGUpIHsKKwkJcmV0ID0gLUVTUElQRTsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1BSRUFEKQorCQkJcmV0ID0gdmZzX3JlYWQoZmlsZSwgYnVmLCBjb3VudCwgJnBvcyk7CisJCWZwdXRfbGlnaHQoZmlsZSwgZnB1dF9uZWVkZWQpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2FzbWxpbmthZ2Ugc3NpemVfdCBzeXNfcHdyaXRlNjQodW5zaWduZWQgaW50IGZkLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgcG9zKQoreworCXN0cnVjdCBmaWxlICpmaWxlOworCXNzaXplX3QgcmV0ID0gLUVCQURGOworCWludCBmcHV0X25lZWRlZDsKKworCWlmIChwb3MgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZpbGUgPSBmZ2V0X2xpZ2h0KGZkLCAmZnB1dF9uZWVkZWQpOworCWlmIChmaWxlKSB7CisJCXJldCA9IC1FU1BJUEU7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9QV1JJVEUpICAKKwkJCXJldCA9IHZmc193cml0ZShmaWxlLCBidWYsIGNvdW50LCAmcG9zKTsKKwkJZnB1dF9saWdodChmaWxlLCBmcHV0X25lZWRlZCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFJlZHVjZSBhbiBpb3ZlYydzIGxlbmd0aCBpbi1wbGFjZS4gIFJldHVybiB0aGUgcmVzdWx0aW5nIG51bWJlciBvZiBzZWdtZW50cworICovCit1bnNpZ25lZCBsb25nIGlvdl9zaG9ydGVuKHN0cnVjdCBpb3ZlYyAqaW92LCB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIHNpemVfdCB0bykKK3sKKwl1bnNpZ25lZCBsb25nIHNlZyA9IDA7CisJc2l6ZV90IGxlbiA9IDA7CisKKwl3aGlsZSAoc2VnIDwgbnJfc2VncykgeworCQlzZWcrKzsKKwkJaWYgKGxlbiArIGlvdi0+aW92X2xlbiA+PSB0bykgeworCQkJaW92LT5pb3ZfbGVuID0gdG8gLSBsZW47CisJCQlicmVhazsKKwkJfQorCQlsZW4gKz0gaW92LT5pb3ZfbGVuOworCQlpb3YrKzsKKwl9CisJcmV0dXJuIHNlZzsKK30KKworRVhQT1JUX1NZTUJPTChpb3Zfc2hvcnRlbik7CisKKy8qIEEgd3JpdGUgb3BlcmF0aW9uIGRvZXMgYSByZWFkIGZyb20gdXNlciBzcGFjZSBhbmQgdmljZSB2ZXJzYSAqLworI2RlZmluZSB2cmZ5X2Rpcih0eXBlKSAoKHR5cGUpID09IFJFQUQgPyBWRVJJRllfV1JJVEUgOiBWRVJJRllfUkVBRCkKKworc3RhdGljIHNzaXplX3QgZG9fcmVhZHZfd3JpdGV2KGludCB0eXBlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaW92ZWMgX191c2VyICogdXZlY3RvciwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGxvZmZfdCAqcG9zKQoreworCXR5cGVkZWYgc3NpemVfdCAoKmlvX2ZuX3QpKHN0cnVjdCBmaWxlICosIGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICopOworCXR5cGVkZWYgc3NpemVfdCAoKmlvdl9mbl90KShzdHJ1Y3QgZmlsZSAqLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKiwgdW5zaWduZWQgbG9uZywgbG9mZl90ICopOworCisJc2l6ZV90IHRvdF9sZW47CisJc3RydWN0IGlvdmVjIGlvdnN0YWNrW1VJT19GQVNUSU9WXTsKKwlzdHJ1Y3QgaW92ZWMgKmlvdj1pb3ZzdGFjaywgKnZlY3RvcjsKKwlzc2l6ZV90IHJldDsKKwlpbnQgc2VnOworCWlvX2ZuX3QgZm47CisJaW92X2ZuX3QgZm52OworCisJLyoKKwkgKiBTdVMgc2F5cyAiVGhlIHJlYWR2KCkgZnVuY3Rpb24gKm1heSogZmFpbCBpZiB0aGUgaW92Y250IGFyZ3VtZW50CisJICogd2FzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAwLCBvciBncmVhdGVyIHRoYW4ge0lPVl9NQVh9LiAgTGludXggaGFzCisJICogdHJhZGl0aW9uYWxseSByZXR1cm5lZCB6ZXJvIGZvciB6ZXJvIHNlZ21lbnRzLCBzby4uLgorCSAqLworCXJldCA9IDA7CisJaWYgKG5yX3NlZ3MgPT0gMCkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIEZpcnN0IGdldCB0aGUgInN0cnVjdCBpb3ZlYyIgZnJvbSB1c2VyIG1lbW9yeSBhbmQKKwkgKiB2ZXJpZnkgYWxsIHRoZSBwb2ludGVycworCSAqLworCXJldCA9IC1FSU5WQUw7CisJaWYgKChucl9zZWdzID4gVUlPX01BWElPVikgfHwgKG5yX3NlZ3MgPD0gMCkpCisJCWdvdG8gb3V0OworCWlmICghZmlsZS0+Zl9vcCkKKwkJZ290byBvdXQ7CisJaWYgKG5yX3NlZ3MgPiBVSU9fRkFTVElPVikgeworCQlyZXQgPSAtRU5PTUVNOworCQlpb3YgPSBrbWFsbG9jKG5yX3NlZ3Mqc2l6ZW9mKHN0cnVjdCBpb3ZlYyksIEdGUF9LRVJORUwpOworCQlpZiAoIWlvdikKKwkJCWdvdG8gb3V0OworCX0KKwlyZXQgPSAtRUZBVUxUOworCWlmIChjb3B5X2Zyb21fdXNlcihpb3YsIHV2ZWN0b3IsIG5yX3NlZ3Mqc2l6ZW9mKCp1dmVjdG9yKSkpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBTaW5nbGUgdW5peCBzcGVjaWZpY2F0aW9uOgorCSAqIFdlIHNob3VsZCAtRUlOVkFMIGlmIGFuIGVsZW1lbnQgbGVuZ3RoIGlzIG5vdCA+PSAwIGFuZCBmaXR0aW5nIGFuCisJICogc3NpemVfdC4gIFRoZSB0b3RhbCBsZW5ndGggaXMgZml0dGluZyBhbiBzc2l6ZV90CisJICoKKwkgKiBCZSBjYXJlZnVsIGhlcmUgYmVjYXVzZSBpb3ZfbGVuIGlzIGEgc2l6ZV90IG5vdCBhbiBzc2l6ZV90CisJICovCisJdG90X2xlbiA9IDA7CisJcmV0ID0gLUVJTlZBTDsKKwlmb3IgKHNlZyA9IDA7IHNlZyA8IG5yX3NlZ3M7IHNlZysrKSB7CisJCXZvaWQgX191c2VyICpidWYgPSBpb3Zbc2VnXS5pb3ZfYmFzZTsKKwkJc3NpemVfdCBsZW4gPSAoc3NpemVfdClpb3Zbc2VnXS5pb3ZfbGVuOworCisJCWlmICh1bmxpa2VseSghYWNjZXNzX29rKHZyZnlfZGlyKHR5cGUpLCBidWYsIGxlbikpKQorCQkJZ290byBFZmF1bHQ7CisJCWlmIChsZW4gPCAwKQkvKiBzaXplX3Qgbm90IGZpdHRpbmcgYW4gc3NpemVfdCAuLiAqLworCQkJZ290byBvdXQ7CisJCXRvdF9sZW4gKz0gbGVuOworCQlpZiAoKHNzaXplX3QpdG90X2xlbiA8IDApIC8qIG1hdGhzIG92ZXJmbG93IG9uIHRoZSBzc2l6ZV90ICovCisJCQlnb3RvIG91dDsKKwl9CisJaWYgKHRvdF9sZW4gPT0gMCkgeworCQlyZXQgPSAwOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSByd192ZXJpZnlfYXJlYSh0eXBlLCBmaWxlLCBwb3MsIHRvdF9sZW4pOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJZm52ID0gTlVMTDsKKwlpZiAodHlwZSA9PSBSRUFEKSB7CisJCWZuID0gZmlsZS0+Zl9vcC0+cmVhZDsKKwkJZm52ID0gZmlsZS0+Zl9vcC0+cmVhZHY7CisJfSBlbHNlIHsKKwkJZm4gPSAoaW9fZm5fdClmaWxlLT5mX29wLT53cml0ZTsKKwkJZm52ID0gZmlsZS0+Zl9vcC0+d3JpdGV2OworCX0KKwlpZiAoZm52KSB7CisJCXJldCA9IGZudihmaWxlLCBpb3YsIG5yX3NlZ3MsIHBvcyk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIERvIGl0IGJ5IGhhbmQsIHdpdGggZmlsZS1vcHMgKi8KKwlyZXQgPSAwOworCXZlY3RvciA9IGlvdjsKKwl3aGlsZSAobnJfc2VncyA+IDApIHsKKwkJdm9pZCBfX3VzZXIgKiBiYXNlOworCQlzaXplX3QgbGVuOworCQlzc2l6ZV90IG5yOworCisJCWJhc2UgPSB2ZWN0b3ItPmlvdl9iYXNlOworCQlsZW4gPSB2ZWN0b3ItPmlvdl9sZW47CisJCXZlY3RvcisrOworCQlucl9zZWdzLS07CisKKwkJbnIgPSBmbihmaWxlLCBiYXNlLCBsZW4sIHBvcyk7CisKKwkJaWYgKG5yIDwgMCkgeworCQkJaWYgKCFyZXQpIHJldCA9IG5yOworCQkJYnJlYWs7CisJCX0KKwkJcmV0ICs9IG5yOworCQlpZiAobnIgIT0gbGVuKQorCQkJYnJlYWs7CisJfQorb3V0OgorCWlmIChpb3YgIT0gaW92c3RhY2spCisJCWtmcmVlKGlvdik7CisJaWYgKChyZXQgKyAodHlwZSA9PSBSRUFEKSkgPiAwKQorCQlkbm90aWZ5X3BhcmVudChmaWxlLT5mX2RlbnRyeSwKKwkJCQkodHlwZSA9PSBSRUFEKSA/IEROX0FDQ0VTUyA6IEROX01PRElGWSk7CisJcmV0dXJuIHJldDsKK0VmYXVsdDoKKwlyZXQgPSAtRUZBVUxUOworCWdvdG8gb3V0OworfQorCitzc2l6ZV90IHZmc19yZWFkdihzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3Qgc3RydWN0IGlvdmVjIF9fdXNlciAqdmVjLAorCQkgIHVuc2lnbmVkIGxvbmcgdmxlbiwgbG9mZl90ICpwb3MpCit7CisJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCXJldHVybiAtRUJBREY7CisJaWYgKCFmaWxlLT5mX29wIHx8ICghZmlsZS0+Zl9vcC0+cmVhZHYgJiYgIWZpbGUtPmZfb3AtPnJlYWQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBkb19yZWFkdl93cml0ZXYoUkVBRCwgZmlsZSwgdmVjLCB2bGVuLCBwb3MpOworfQorCitFWFBPUlRfU1lNQk9MKHZmc19yZWFkdik7CisKK3NzaXplX3QgdmZzX3dyaXRldihzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3Qgc3RydWN0IGlvdmVjIF9fdXNlciAqdmVjLAorCQkgICB1bnNpZ25lZCBsb25nIHZsZW4sIGxvZmZfdCAqcG9zKQoreworCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJcmV0dXJuIC1FQkFERjsKKwlpZiAoIWZpbGUtPmZfb3AgfHwgKCFmaWxlLT5mX29wLT53cml0ZXYgJiYgIWZpbGUtPmZfb3AtPndyaXRlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gZG9fcmVhZHZfd3JpdGV2KFdSSVRFLCBmaWxlLCB2ZWMsIHZsZW4sIHBvcyk7Cit9CisKK0VYUE9SVF9TWU1CT0wodmZzX3dyaXRldik7CisKK2FzbWxpbmthZ2Ugc3NpemVfdAorc3lzX3JlYWR2KHVuc2lnbmVkIGxvbmcgZmQsIGNvbnN0IHN0cnVjdCBpb3ZlYyBfX3VzZXIgKnZlYywgdW5zaWduZWQgbG9uZyB2bGVuKQoreworCXN0cnVjdCBmaWxlICpmaWxlOworCXNzaXplX3QgcmV0ID0gLUVCQURGOworCWludCBmcHV0X25lZWRlZDsKKworCWZpbGUgPSBmZ2V0X2xpZ2h0KGZkLCAmZnB1dF9uZWVkZWQpOworCWlmIChmaWxlKSB7CisJCWxvZmZfdCBwb3MgPSBmaWxlX3Bvc19yZWFkKGZpbGUpOworCQlyZXQgPSB2ZnNfcmVhZHYoZmlsZSwgdmVjLCB2bGVuLCAmcG9zKTsKKwkJZmlsZV9wb3Nfd3JpdGUoZmlsZSwgcG9zKTsKKwkJZnB1dF9saWdodChmaWxlLCBmcHV0X25lZWRlZCk7CisJfQorCisJaWYgKHJldCA+IDApCisJCWN1cnJlbnQtPnJjaGFyICs9IHJldDsKKwljdXJyZW50LT5zeXNjcisrOworCXJldHVybiByZXQ7Cit9CisKK2FzbWxpbmthZ2Ugc3NpemVfdAorc3lzX3dyaXRldih1bnNpZ25lZCBsb25nIGZkLCBjb25zdCBzdHJ1Y3QgaW92ZWMgX191c2VyICp2ZWMsIHVuc2lnbmVkIGxvbmcgdmxlbikKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlzc2l6ZV90IHJldCA9IC1FQkFERjsKKwlpbnQgZnB1dF9uZWVkZWQ7CisKKwlmaWxlID0gZmdldF9saWdodChmZCwgJmZwdXRfbmVlZGVkKTsKKwlpZiAoZmlsZSkgeworCQlsb2ZmX3QgcG9zID0gZmlsZV9wb3NfcmVhZChmaWxlKTsKKwkJcmV0ID0gdmZzX3dyaXRldihmaWxlLCB2ZWMsIHZsZW4sICZwb3MpOworCQlmaWxlX3Bvc193cml0ZShmaWxlLCBwb3MpOworCQlmcHV0X2xpZ2h0KGZpbGUsIGZwdXRfbmVlZGVkKTsKKwl9CisKKwlpZiAocmV0ID4gMCkKKwkJY3VycmVudC0+d2NoYXIgKz0gcmV0OworCWN1cnJlbnQtPnN5c2N3Kys7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgZG9fc2VuZGZpbGUoaW50IG91dF9mZCwgaW50IGluX2ZkLCBsb2ZmX3QgKnBwb3MsCisJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCBtYXgpCit7CisJc3RydWN0IGZpbGUgKiBpbl9maWxlLCAqIG91dF9maWxlOworCXN0cnVjdCBpbm9kZSAqIGluX2lub2RlLCAqIG91dF9pbm9kZTsKKwlsb2ZmX3QgcG9zOworCXNzaXplX3QgcmV0dmFsOworCWludCBmcHV0X25lZWRlZF9pbiwgZnB1dF9uZWVkZWRfb3V0OworCisJLyoKKwkgKiBHZXQgaW5wdXQgZmlsZSwgYW5kIHZlcmlmeSB0aGF0IGl0IGlzIG9rLi4KKwkgKi8KKwlyZXR2YWwgPSAtRUJBREY7CisJaW5fZmlsZSA9IGZnZXRfbGlnaHQoaW5fZmQsICZmcHV0X25lZWRlZF9pbik7CisJaWYgKCFpbl9maWxlKQorCQlnb3RvIG91dDsKKwlpZiAoIShpbl9maWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKwkJZ290byBmcHV0X2luOworCXJldHZhbCA9IC1FSU5WQUw7CisJaW5faW5vZGUgPSBpbl9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpZiAoIWluX2lub2RlKQorCQlnb3RvIGZwdXRfaW47CisJaWYgKCFpbl9maWxlLT5mX29wIHx8ICFpbl9maWxlLT5mX29wLT5zZW5kZmlsZSkKKwkJZ290byBmcHV0X2luOworCXJldHZhbCA9IC1FU1BJUEU7CisJaWYgKCFwcG9zKQorCQlwcG9zID0gJmluX2ZpbGUtPmZfcG9zOworCWVsc2UKKwkJaWYgKCEoaW5fZmlsZS0+Zl9tb2RlICYgRk1PREVfUFJFQUQpKQorCQkJZ290byBmcHV0X2luOworCXJldHZhbCA9IHJ3X3ZlcmlmeV9hcmVhKFJFQUQsIGluX2ZpbGUsIHBwb3MsIGNvdW50KTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGZwdXRfaW47CisKKwlyZXR2YWwgPSBzZWN1cml0eV9maWxlX3Blcm1pc3Npb24gKGluX2ZpbGUsIE1BWV9SRUFEKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGZwdXRfaW47CisKKwkvKgorCSAqIEdldCBvdXRwdXQgZmlsZSwgYW5kIHZlcmlmeSB0aGF0IGl0IGlzIG9rLi4KKwkgKi8KKwlyZXR2YWwgPSAtRUJBREY7CisJb3V0X2ZpbGUgPSBmZ2V0X2xpZ2h0KG91dF9mZCwgJmZwdXRfbmVlZGVkX291dCk7CisJaWYgKCFvdXRfZmlsZSkKKwkJZ290byBmcHV0X2luOworCWlmICghKG91dF9maWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCWdvdG8gZnB1dF9vdXQ7CisJcmV0dmFsID0gLUVJTlZBTDsKKwlpZiAoIW91dF9maWxlLT5mX29wIHx8ICFvdXRfZmlsZS0+Zl9vcC0+c2VuZHBhZ2UpCisJCWdvdG8gZnB1dF9vdXQ7CisJb3V0X2lub2RlID0gb3V0X2ZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCXJldHZhbCA9IHJ3X3ZlcmlmeV9hcmVhKFdSSVRFLCBvdXRfZmlsZSwgJm91dF9maWxlLT5mX3BvcywgY291bnQpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZnB1dF9vdXQ7CisKKwlyZXR2YWwgPSBzZWN1cml0eV9maWxlX3Blcm1pc3Npb24gKG91dF9maWxlLCBNQVlfV1JJVEUpOworCWlmIChyZXR2YWwpCisJCWdvdG8gZnB1dF9vdXQ7CisKKwlpZiAoIW1heCkKKwkJbWF4ID0gbWluKGluX2lub2RlLT5pX3NiLT5zX21heGJ5dGVzLCBvdXRfaW5vZGUtPmlfc2ItPnNfbWF4Ynl0ZXMpOworCisJcG9zID0gKnBwb3M7CisJcmV0dmFsID0gLUVJTlZBTDsKKwlpZiAodW5saWtlbHkocG9zIDwgMCkpCisJCWdvdG8gZnB1dF9vdXQ7CisJaWYgKHVubGlrZWx5KHBvcyArIGNvdW50ID4gbWF4KSkgeworCQlyZXR2YWwgPSAtRU9WRVJGTE9XOworCQlpZiAocG9zID49IG1heCkKKwkJCWdvdG8gZnB1dF9vdXQ7CisJCWNvdW50ID0gbWF4IC0gcG9zOworCX0KKworCXJldHZhbCA9IGluX2ZpbGUtPmZfb3AtPnNlbmRmaWxlKGluX2ZpbGUsIHBwb3MsIGNvdW50LCBmaWxlX3NlbmRfYWN0b3IsIG91dF9maWxlKTsKKworCWlmIChyZXR2YWwgPiAwKSB7CisJCWN1cnJlbnQtPnJjaGFyICs9IHJldHZhbDsKKwkJY3VycmVudC0+d2NoYXIgKz0gcmV0dmFsOworCX0KKwljdXJyZW50LT5zeXNjcisrOworCWN1cnJlbnQtPnN5c2N3Kys7CisKKwlpZiAoKnBwb3MgPiBtYXgpCisJCXJldHZhbCA9IC1FT1ZFUkZMT1c7CisKK2ZwdXRfb3V0OgorCWZwdXRfbGlnaHQob3V0X2ZpbGUsIGZwdXRfbmVlZGVkX291dCk7CitmcHV0X2luOgorCWZwdXRfbGlnaHQoaW5fZmlsZSwgZnB1dF9uZWVkZWRfaW4pOworb3V0OgorCXJldHVybiByZXR2YWw7Cit9CisKK2FzbWxpbmthZ2Ugc3NpemVfdCBzeXNfc2VuZGZpbGUoaW50IG91dF9mZCwgaW50IGluX2ZkLCBvZmZfdCBfX3VzZXIgKm9mZnNldCwgc2l6ZV90IGNvdW50KQoreworCWxvZmZfdCBwb3M7CisJb2ZmX3Qgb2ZmOworCXNzaXplX3QgcmV0OworCisJaWYgKG9mZnNldCkgeworCQlpZiAodW5saWtlbHkoZ2V0X3VzZXIob2ZmLCBvZmZzZXQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlwb3MgPSBvZmY7CisJCXJldCA9IGRvX3NlbmRmaWxlKG91dF9mZCwgaW5fZmQsICZwb3MsIGNvdW50LCBNQVhfTk9OX0xGUyk7CisJCWlmICh1bmxpa2VseShwdXRfdXNlcihwb3MsIG9mZnNldCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIGRvX3NlbmRmaWxlKG91dF9mZCwgaW5fZmQsIE5VTEwsIGNvdW50LCAwKTsKK30KKworYXNtbGlua2FnZSBzc2l6ZV90IHN5c19zZW5kZmlsZTY0KGludCBvdXRfZmQsIGludCBpbl9mZCwgbG9mZl90IF9fdXNlciAqb2Zmc2V0LCBzaXplX3QgY291bnQpCit7CisJbG9mZl90IHBvczsKKwlzc2l6ZV90IHJldDsKKworCWlmIChvZmZzZXQpIHsKKwkJaWYgKHVubGlrZWx5KGNvcHlfZnJvbV91c2VyKCZwb3MsIG9mZnNldCwgc2l6ZW9mKGxvZmZfdCkpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXQgPSBkb19zZW5kZmlsZShvdXRfZmQsIGluX2ZkLCAmcG9zLCBjb3VudCwgMCk7CisJCWlmICh1bmxpa2VseShwdXRfdXNlcihwb3MsIG9mZnNldCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIGRvX3NlbmRmaWxlKG91dF9mZCwgaW5fZmQsIE5VTEwsIGNvdW50LCAwKTsKK30KZGlmZiAtLWdpdCBhL2ZzL3JlYWRkaXIuYyBiL2ZzL3JlYWRkaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDM1NzliCi0tLSAvZGV2L251bGwKKysrIGIvZnMvcmVhZGRpci5jCkBAIC0wLDAgKzEsMzAwIEBACisvKgorICogIGxpbnV4L2ZzL3JlYWRkaXIuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUgIExpbnVzIFRvcnZhbGRzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGlyZW50Lmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworaW50IHZmc19yZWFkZGlyKHN0cnVjdCBmaWxlICpmaWxlLCBmaWxsZGlyX3QgZmlsbGVyLCB2b2lkICpidWYpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCWludCByZXMgPSAtRU5PVERJUjsKKwlpZiAoIWZpbGUtPmZfb3AgfHwgIWZpbGUtPmZfb3AtPnJlYWRkaXIpCisJCWdvdG8gb3V0OworCisJcmVzID0gc2VjdXJpdHlfZmlsZV9wZXJtaXNzaW9uKGZpbGUsIE1BWV9SRUFEKTsKKwlpZiAocmVzKQorCQlnb3RvIG91dDsKKworCWRvd24oJmlub2RlLT5pX3NlbSk7CisJcmVzID0gLUVOT0VOVDsKKwlpZiAoIUlTX0RFQURESVIoaW5vZGUpKSB7CisJCXJlcyA9IGZpbGUtPmZfb3AtPnJlYWRkaXIoZmlsZSwgYnVmLCBmaWxsZXIpOworCQlmaWxlX2FjY2Vzc2VkKGZpbGUpOworCX0KKwl1cCgmaW5vZGUtPmlfc2VtKTsKK291dDoKKwlyZXR1cm4gcmVzOworfQorCitFWFBPUlRfU1lNQk9MKHZmc19yZWFkZGlyKTsKKworLyoKKyAqIFRyYWRpdGlvbmFsIGxpbnV4IHJlYWRkaXIoKSBoYW5kbGluZy4uCisgKgorICogImNvdW50PTEiIGlzIGEgc3BlY2lhbCBjYXNlLCBtZWFuaW5nIHRoYXQgdGhlIGJ1ZmZlciBpcyBvbmUKKyAqIGRpcmVudC1zdHJ1Y3R1cmUgaW4gc2l6ZSBhbmQgdGhhdCB0aGUgY29kZSBjYW4ndCBoYW5kbGUgbW9yZQorICogYW55d2F5LiBUaHVzIHRoZSBzcGVjaWFsICJmaWxsb25lZGlyKCkiIGZ1bmN0aW9uIGZvciB0aGF0CisgKiBjYXNlICh0aGUgbG93LWxldmVsIGhhbmRsZXJzIGRvbid0IG5lZWQgdG8gY2FyZSBhYm91dCB0aGlzKS4KKyAqLworI2RlZmluZSBOQU1FX09GRlNFVChkZSkgKChpbnQpICgoZGUpLT5kX25hbWUgLSAoY2hhciBfX3VzZXIgKikgKGRlKSkpCisjZGVmaW5lIFJPVU5EX1VQKHgpICgoKHgpK3NpemVvZihsb25nKS0xKSAmIH4oc2l6ZW9mKGxvbmcpLTEpKQorCisjaWZkZWYgX19BUkNIX1dBTlRfT0xEX1JFQURESVIKKworc3RydWN0IG9sZF9saW51eF9kaXJlbnQgeworCXVuc2lnbmVkIGxvbmcJZF9pbm87CisJdW5zaWduZWQgbG9uZwlkX29mZnNldDsKKwl1bnNpZ25lZCBzaG9ydAlkX25hbWxlbjsKKwljaGFyCQlkX25hbWVbMV07Cit9OworCitzdHJ1Y3QgcmVhZGRpcl9jYWxsYmFjayB7CisJc3RydWN0IG9sZF9saW51eF9kaXJlbnQgX191c2VyICogZGlyZW50OworCWludCByZXN1bHQ7Cit9OworCitzdGF0aWMgaW50IGZpbGxvbmVkaXIodm9pZCAqIF9fYnVmLCBjb25zdCBjaGFyICogbmFtZSwgaW50IG5hbWxlbiwgbG9mZl90IG9mZnNldCwKKwkJICAgICAgaW5vX3QgaW5vLCB1bnNpZ25lZCBpbnQgZF90eXBlKQoreworCXN0cnVjdCByZWFkZGlyX2NhbGxiYWNrICogYnVmID0gKHN0cnVjdCByZWFkZGlyX2NhbGxiYWNrICopIF9fYnVmOworCXN0cnVjdCBvbGRfbGludXhfZGlyZW50IF9fdXNlciAqIGRpcmVudDsKKworCWlmIChidWYtPnJlc3VsdCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJYnVmLT5yZXN1bHQrKzsKKwlkaXJlbnQgPSBidWYtPmRpcmVudDsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGRpcmVudCwKKwkJCSh1bnNpZ25lZCBsb25nKShkaXJlbnQtPmRfbmFtZSArIG5hbWxlbiArIDEpIC0KKwkJCQkodW5zaWduZWQgbG9uZylkaXJlbnQpKQorCQlnb3RvIGVmYXVsdDsKKwlpZiAoCV9fcHV0X3VzZXIoaW5vLCAmZGlyZW50LT5kX2lubykgfHwKKwkJX19wdXRfdXNlcihvZmZzZXQsICZkaXJlbnQtPmRfb2Zmc2V0KSB8fAorCQlfX3B1dF91c2VyKG5hbWxlbiwgJmRpcmVudC0+ZF9uYW1sZW4pIHx8CisJCV9fY29weV90b191c2VyKGRpcmVudC0+ZF9uYW1lLCBuYW1lLCBuYW1sZW4pIHx8CisJCV9fcHV0X3VzZXIoMCwgZGlyZW50LT5kX25hbWUgKyBuYW1sZW4pKQorCQlnb3RvIGVmYXVsdDsKKwlyZXR1cm4gMDsKK2VmYXVsdDoKKwlidWYtPnJlc3VsdCA9IC1FRkFVTFQ7CisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBvbGRfcmVhZGRpcih1bnNpZ25lZCBpbnQgZmQsIHN0cnVjdCBvbGRfbGludXhfZGlyZW50IF9fdXNlciAqIGRpcmVudCwgdW5zaWduZWQgaW50IGNvdW50KQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgZmlsZSAqIGZpbGU7CisJc3RydWN0IHJlYWRkaXJfY2FsbGJhY2sgYnVmOworCisJZXJyb3IgPSAtRUJBREY7CisJZmlsZSA9IGZnZXQoZmQpOworCWlmICghZmlsZSkKKwkJZ290byBvdXQ7CisKKwlidWYucmVzdWx0ID0gMDsKKwlidWYuZGlyZW50ID0gZGlyZW50OworCisJZXJyb3IgPSB2ZnNfcmVhZGRpcihmaWxlLCBmaWxsb25lZGlyLCAmYnVmKTsKKwlpZiAoZXJyb3IgPj0gMCkKKwkJZXJyb3IgPSBidWYucmVzdWx0OworCisJZnB1dChmaWxlKTsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKKyNlbmRpZiAvKiBfX0FSQ0hfV0FOVF9PTERfUkVBRERJUiAqLworCisvKgorICogTmV3LCBhbGwtaW1wcm92ZWQsIHNpbmdpbmcsIGRhbmNpbmcsIGlCQ1MyLWNvbXBsaWFudCBnZXRkZW50cygpCisgKiBpbnRlcmZhY2UuIAorICovCitzdHJ1Y3QgbGludXhfZGlyZW50IHsKKwl1bnNpZ25lZCBsb25nCWRfaW5vOworCXVuc2lnbmVkIGxvbmcJZF9vZmY7CisJdW5zaWduZWQgc2hvcnQJZF9yZWNsZW47CisJY2hhcgkJZF9uYW1lWzFdOworfTsKKworc3RydWN0IGdldGRlbnRzX2NhbGxiYWNrIHsKKwlzdHJ1Y3QgbGludXhfZGlyZW50IF9fdXNlciAqIGN1cnJlbnRfZGlyOworCXN0cnVjdCBsaW51eF9kaXJlbnQgX191c2VyICogcHJldmlvdXM7CisJaW50IGNvdW50OworCWludCBlcnJvcjsKK307CisKK3N0YXRpYyBpbnQgZmlsbGRpcih2b2lkICogX19idWYsIGNvbnN0IGNoYXIgKiBuYW1lLCBpbnQgbmFtbGVuLCBsb2ZmX3Qgb2Zmc2V0LAorCQkgICBpbm9fdCBpbm8sIHVuc2lnbmVkIGludCBkX3R5cGUpCit7CisJc3RydWN0IGxpbnV4X2RpcmVudCBfX3VzZXIgKiBkaXJlbnQ7CisJc3RydWN0IGdldGRlbnRzX2NhbGxiYWNrICogYnVmID0gKHN0cnVjdCBnZXRkZW50c19jYWxsYmFjayAqKSBfX2J1ZjsKKwlpbnQgcmVjbGVuID0gUk9VTkRfVVAoTkFNRV9PRkZTRVQoZGlyZW50KSArIG5hbWxlbiArIDIpOworCisJYnVmLT5lcnJvciA9IC1FSU5WQUw7CS8qIG9ubHkgdXNlZCBpZiB3ZSBmYWlsLi4gKi8KKwlpZiAocmVjbGVuID4gYnVmLT5jb3VudCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGlyZW50ID0gYnVmLT5wcmV2aW91czsKKwlpZiAoZGlyZW50KSB7CisJCWlmIChfX3B1dF91c2VyKG9mZnNldCwgJmRpcmVudC0+ZF9vZmYpKQorCQkJZ290byBlZmF1bHQ7CisJfQorCWRpcmVudCA9IGJ1Zi0+Y3VycmVudF9kaXI7CisJaWYgKF9fcHV0X3VzZXIoaW5vLCAmZGlyZW50LT5kX2lubykpCisJCWdvdG8gZWZhdWx0OworCWlmIChfX3B1dF91c2VyKHJlY2xlbiwgJmRpcmVudC0+ZF9yZWNsZW4pKQorCQlnb3RvIGVmYXVsdDsKKwlpZiAoY29weV90b191c2VyKGRpcmVudC0+ZF9uYW1lLCBuYW1lLCBuYW1sZW4pKQorCQlnb3RvIGVmYXVsdDsKKwlpZiAoX19wdXRfdXNlcigwLCBkaXJlbnQtPmRfbmFtZSArIG5hbWxlbikpCisJCWdvdG8gZWZhdWx0OworCWlmIChfX3B1dF91c2VyKGRfdHlwZSwgKGNoYXIgX191c2VyICopIGRpcmVudCArIHJlY2xlbiAtIDEpKQorCQlnb3RvIGVmYXVsdDsKKwlidWYtPnByZXZpb3VzID0gZGlyZW50OworCWRpcmVudCA9ICh2b2lkIF9fdXNlciAqKWRpcmVudCArIHJlY2xlbjsKKwlidWYtPmN1cnJlbnRfZGlyID0gZGlyZW50OworCWJ1Zi0+Y291bnQgLT0gcmVjbGVuOworCXJldHVybiAwOworZWZhdWx0OgorCWJ1Zi0+ZXJyb3IgPSAtRUZBVUxUOworCXJldHVybiAtRUZBVUxUOworfQorCithc21saW5rYWdlIGxvbmcgc3lzX2dldGRlbnRzKHVuc2lnbmVkIGludCBmZCwgc3RydWN0IGxpbnV4X2RpcmVudCBfX3VzZXIgKiBkaXJlbnQsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgZmlsZSAqIGZpbGU7CisJc3RydWN0IGxpbnV4X2RpcmVudCBfX3VzZXIgKiBsYXN0ZGlyZW50OworCXN0cnVjdCBnZXRkZW50c19jYWxsYmFjayBidWY7CisJaW50IGVycm9yOworCisJZXJyb3IgPSAtRUZBVUxUOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZGlyZW50LCBjb3VudCkpCisJCWdvdG8gb3V0OworCisJZXJyb3IgPSAtRUJBREY7CisJZmlsZSA9IGZnZXQoZmQpOworCWlmICghZmlsZSkKKwkJZ290byBvdXQ7CisKKwlidWYuY3VycmVudF9kaXIgPSBkaXJlbnQ7CisJYnVmLnByZXZpb3VzID0gTlVMTDsKKwlidWYuY291bnQgPSBjb3VudDsKKwlidWYuZXJyb3IgPSAwOworCisJZXJyb3IgPSB2ZnNfcmVhZGRpcihmaWxlLCBmaWxsZGlyLCAmYnVmKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIG91dF9wdXRmOworCWVycm9yID0gYnVmLmVycm9yOworCWxhc3RkaXJlbnQgPSBidWYucHJldmlvdXM7CisJaWYgKGxhc3RkaXJlbnQpIHsKKwkJaWYgKHB1dF91c2VyKGZpbGUtPmZfcG9zLCAmbGFzdGRpcmVudC0+ZF9vZmYpKQorCQkJZXJyb3IgPSAtRUZBVUxUOworCQllbHNlCisJCQllcnJvciA9IGNvdW50IC0gYnVmLmNvdW50OworCX0KKworb3V0X3B1dGY6CisJZnB1dChmaWxlKTsKK291dDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKKyNkZWZpbmUgUk9VTkRfVVA2NCh4KSAoKCh4KStzaXplb2YodTY0KS0xKSAmIH4oc2l6ZW9mKHU2NCktMSkpCisKK3N0cnVjdCBnZXRkZW50c19jYWxsYmFjazY0IHsKKwlzdHJ1Y3QgbGludXhfZGlyZW50NjQgX191c2VyICogY3VycmVudF9kaXI7CisJc3RydWN0IGxpbnV4X2RpcmVudDY0IF9fdXNlciAqIHByZXZpb3VzOworCWludCBjb3VudDsKKwlpbnQgZXJyb3I7Cit9OworCitzdGF0aWMgaW50IGZpbGxkaXI2NCh2b2lkICogX19idWYsIGNvbnN0IGNoYXIgKiBuYW1lLCBpbnQgbmFtbGVuLCBsb2ZmX3Qgb2Zmc2V0LAorCQkgICAgIGlub190IGlubywgdW5zaWduZWQgaW50IGRfdHlwZSkKK3sKKwlzdHJ1Y3QgbGludXhfZGlyZW50NjQgX191c2VyICpkaXJlbnQ7CisJc3RydWN0IGdldGRlbnRzX2NhbGxiYWNrNjQgKiBidWYgPSAoc3RydWN0IGdldGRlbnRzX2NhbGxiYWNrNjQgKikgX19idWY7CisJaW50IHJlY2xlbiA9IFJPVU5EX1VQNjQoTkFNRV9PRkZTRVQoZGlyZW50KSArIG5hbWxlbiArIDEpOworCisJYnVmLT5lcnJvciA9IC1FSU5WQUw7CS8qIG9ubHkgdXNlZCBpZiB3ZSBmYWlsLi4gKi8KKwlpZiAocmVjbGVuID4gYnVmLT5jb3VudCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZGlyZW50ID0gYnVmLT5wcmV2aW91czsKKwlpZiAoZGlyZW50KSB7CisJCWlmIChfX3B1dF91c2VyKG9mZnNldCwgJmRpcmVudC0+ZF9vZmYpKQorCQkJZ290byBlZmF1bHQ7CisJfQorCWRpcmVudCA9IGJ1Zi0+Y3VycmVudF9kaXI7CisJaWYgKF9fcHV0X3VzZXIoaW5vLCAmZGlyZW50LT5kX2lubykpCisJCWdvdG8gZWZhdWx0OworCWlmIChfX3B1dF91c2VyKDAsICZkaXJlbnQtPmRfb2ZmKSkKKwkJZ290byBlZmF1bHQ7CisJaWYgKF9fcHV0X3VzZXIocmVjbGVuLCAmZGlyZW50LT5kX3JlY2xlbikpCisJCWdvdG8gZWZhdWx0OworCWlmIChfX3B1dF91c2VyKGRfdHlwZSwgJmRpcmVudC0+ZF90eXBlKSkKKwkJZ290byBlZmF1bHQ7CisJaWYgKGNvcHlfdG9fdXNlcihkaXJlbnQtPmRfbmFtZSwgbmFtZSwgbmFtbGVuKSkKKwkJZ290byBlZmF1bHQ7CisJaWYgKF9fcHV0X3VzZXIoMCwgZGlyZW50LT5kX25hbWUgKyBuYW1sZW4pKQorCQlnb3RvIGVmYXVsdDsKKwlidWYtPnByZXZpb3VzID0gZGlyZW50OworCWRpcmVudCA9ICh2b2lkIF9fdXNlciAqKWRpcmVudCArIHJlY2xlbjsKKwlidWYtPmN1cnJlbnRfZGlyID0gZGlyZW50OworCWJ1Zi0+Y291bnQgLT0gcmVjbGVuOworCXJldHVybiAwOworZWZhdWx0OgorCWJ1Zi0+ZXJyb3IgPSAtRUZBVUxUOworCXJldHVybiAtRUZBVUxUOworfQorCithc21saW5rYWdlIGxvbmcgc3lzX2dldGRlbnRzNjQodW5zaWduZWQgaW50IGZkLCBzdHJ1Y3QgbGludXhfZGlyZW50NjQgX191c2VyICogZGlyZW50LCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJc3RydWN0IGZpbGUgKiBmaWxlOworCXN0cnVjdCBsaW51eF9kaXJlbnQ2NCBfX3VzZXIgKiBsYXN0ZGlyZW50OworCXN0cnVjdCBnZXRkZW50c19jYWxsYmFjazY0IGJ1ZjsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IC1FRkFVTFQ7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBkaXJlbnQsIGNvdW50KSkKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IC1FQkFERjsKKwlmaWxlID0gZmdldChmZCk7CisJaWYgKCFmaWxlKQorCQlnb3RvIG91dDsKKworCWJ1Zi5jdXJyZW50X2RpciA9IGRpcmVudDsKKwlidWYucHJldmlvdXMgPSBOVUxMOworCWJ1Zi5jb3VudCA9IGNvdW50OworCWJ1Zi5lcnJvciA9IDA7CisKKwllcnJvciA9IHZmc19yZWFkZGlyKGZpbGUsIGZpbGxkaXI2NCwgJmJ1Zik7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXRfcHV0ZjsKKwllcnJvciA9IGJ1Zi5lcnJvcjsKKwlsYXN0ZGlyZW50ID0gYnVmLnByZXZpb3VzOworCWlmIChsYXN0ZGlyZW50KSB7CisJCXR5cGVvZihsYXN0ZGlyZW50LT5kX29mZikgZF9vZmYgPSBmaWxlLT5mX3BvczsKKwkJZXJyb3IgPSAtRUZBVUxUOworCQlpZiAoX19wdXRfdXNlcihkX29mZiwgJmxhc3RkaXJlbnQtPmRfb2ZmKSkKKwkJCWdvdG8gb3V0X3B1dGY7CisJCWVycm9yID0gY291bnQgLSBidWYuY291bnQ7CisJfQorCitvdXRfcHV0ZjoKKwlmcHV0KGZpbGUpOworb3V0OgorCXJldHVybiBlcnJvcjsKK30KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL01ha2VmaWxlIGIvZnMvcmVpc2VyZnMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E1OTMwOQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3JlaXNlcmZzL01ha2VmaWxlCkBAIC0wLDAgKzEsMzYgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBsaW51eCByZWlzZXItZmlsZXN5c3RlbSByb3V0aW5lcy4KKyMKKworb2JqLSQoQ09ORklHX1JFSVNFUkZTX0ZTKSArPSByZWlzZXJmcy5vCisKK3JlaXNlcmZzLW9ianMgOj0gYml0bWFwLm8gZG9fYmFsYW4ubyBuYW1laS5vIGlub2RlLm8gZmlsZS5vIGRpci5vIGZpeF9ub2RlLm8gXAorCQkgc3VwZXIubyBwcmludHMubyBvYmplY3RpZC5vIGxiYWxhbmNlLm8gaWJhbGFuY2UubyBzdHJlZS5vIFwKKwkJIGhhc2hlcy5vIHRhaWxfY29udmVyc2lvbi5vIGpvdXJuYWwubyByZXNpemUubyBcCisJCSBpdGVtX29wcy5vIGlvY3RsLm8gcHJvY2ZzLm8KKworaWZlcSAoJChDT05GSUdfUkVJU0VSRlNfRlNfWEFUVFIpLHkpCityZWlzZXJmcy1vYmpzICs9IHhhdHRyLm8geGF0dHJfdXNlci5vIHhhdHRyX3RydXN0ZWQubworZW5kaWYKKworaWZlcSAoJChDT05GSUdfUkVJU0VSRlNfRlNfU0VDVVJJVFkpLHkpCityZWlzZXJmcy1vYmpzICs9IHhhdHRyX3NlY3VyaXR5Lm8KK2VuZGlmCisKK2lmZXEgKCQoQ09ORklHX1JFSVNFUkZTX0ZTX1BPU0lYX0FDTCkseSkKK3JlaXNlcmZzLW9ianMgKz0geGF0dHJfYWNsLm8KK2VuZGlmCisKKyMgZ2NjIC1PMiAodGhlIGtlcm5lbCBkZWZhdWx0KSAgaXMgb3ZlcmFnZ3Jlc3NpdmUgb24gcHBjMzIgd2hlbiBtYW55IGlubGluZQorIyBmdW5jdGlvbnMgYXJlIHVzZWQuICBUaGlzIGNhdXNlcyB0aGUgY29tcGlsZXIgdG8gYWR2YW5jZSB0aGUgc3RhY2sKKyMgcG9pbnRlciBvdXQgb2YgdGhlIGF2YWlsYWJsZSBzdGFjayBzcGFjZSwgY29ycnVwdGluZyBrZXJuZWwgc3BhY2UsCisjIGFuZCBjYXVzaW5nIGEgcGFuaWMuIFNpbmNlIHRoaXMgYmVoYXZpb3Igb25seSBhZmZlY3RzIHBwYzMyLCB0aGlzIGlmZXEKKyMgd2lsbCB3b3JrIGFyb3VuZCBpdC4gSWYgYW55IG90aGVyIGFyY2hpdGVjdHVyZSBkaXNwbGF5cyB0aGlzIGJlaGF2aW9yLAorIyBhZGQgaXQgaGVyZS4KK2lmZXEgKCQoQ09ORklHX1BQQzMyKSx5KQorRVhUUkFfQ0ZMQUdTIDo9IC1PMQorZW5kaWYKKworVEFHUzoKKwlldGFncyAqLmMKKwpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvUkVBRE1FIGIvZnMvcmVpc2VyZnMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZTE2NzAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9yZWlzZXJmcy9SRUFETUUKQEAgLTAsMCArMSwxNjEgQEAKK1tMSUNFTlNJTkddIAorCitSZWlzZXJGUyBpcyBoZXJlYnkgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCisKK1NvdXJjZSBjb2RlIGZpbGVzIHRoYXQgY29udGFpbiB0aGUgcGhyYXNlICJsaWNlbnNpbmcgZ292ZXJuZWQgYnkKK3JlaXNlcmZzL1JFQURNRSIgYXJlICJnb3Zlcm5lZCBmaWxlcyIgdGhyb3VnaG91dCB0aGlzIGZpbGUuICBHb3Zlcm5lZAorZmlsZXMgYXJlIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEwuICBUaGUgcG9ydGlvbnMgb2YgdGhlbSBvd25lZCBieSBIYW5zCitSZWlzZXIsIG9yIGF1dGhvcml6ZWQgdG8gYmUgbGljZW5zZWQgYnkgaGltLCBoYXZlIGJlZW4gaW4gdGhlIHBhc3QsCithbmQgbGlrZWx5IHdpbGwgYmUgaW4gdGhlIGZ1dHVyZSwgbGljZW5zZWQgdG8gb3RoZXIgcGFydGllcyB1bmRlcgorb3RoZXIgbGljZW5zZXMuICBJZiB5b3UgYWRkIHlvdXIgY29kZSB0byBnb3Zlcm5lZCBmaWxlcywgYW5kIGRvbid0Cit3YW50IGl0IHRvIGJlIG93bmVkIGJ5IEhhbnMgUmVpc2VyLCBwdXQgeW91ciBjb3B5cmlnaHQgbGFiZWwgb24gdGhhdAorY29kZSBzbyB0aGUgcG9vciBibGlnaHQgYW5kIGhpcyBjdXN0b21lcnMgY2FuIGtlZXAgdGhpbmdzIHN0cmFpZ2h0LgorQWxsIHBvcnRpb25zIG9mIGdvdmVybmVkIGZpbGVzIG5vdCBsYWJlbGVkIG90aGVyd2lzZSBhcmUgb3duZWQgYnkgSGFucworUmVpc2VyLCBhbmQgYnkgYWRkaW5nIHlvdXIgY29kZSB0byBpdCwgd2lkZWx5IGRpc3RyaWJ1dGluZyBpdCB0bworb3RoZXJzIG9yIHNlbmRpbmcgdXMgYSBwYXRjaCwgYW5kIGxlYXZpbmcgdGhlIHNlbnRlbmNlIGluIHN0YXRpbmcgdGhhdAorbGljZW5zaW5nIGlzIGdvdmVybmVkIGJ5IHRoZSBzdGF0ZW1lbnQgaW4gdGhpcyBmaWxlLCB5b3UgYWNjZXB0IHRoaXMuCitJdCB3aWxsIGJlIGEga2luZG5lc3MgaWYgeW91IGlkZW50aWZ5IHdoZXRoZXIgSGFucyBSZWlzZXIgaXMgYWxsb3dlZAordG8gbGljZW5zZSBjb2RlIGxhYmVsZWQgYXMgb3duZWQgYnkgeW91IG9uIHlvdXIgYmVoYWxmIG90aGVyIHRoYW4KK3VuZGVyIHRoZSBHUEwsIGJlY2F1c2UgaGUgd2FudHMgdG8ga25vdyBpZiBpdCBpcyBva2F5IHRvIGRvIHNvIGFuZCBwdXQKK2EgY2hlY2sgaW4gdGhlIG1haWwgdG8geW91IChmb3Igbm9uLXRyaXZpYWwgaW1wcm92ZW1lbnRzKSB3aGVuIGhlCittYWtlcyBoaXMgbmV4dCBzYWxlLiAgSGUgbWFrZXMgbm8gZ3VhcmFudGVlcyBhcyB0byB0aGUgYW1vdW50IGlmIGFueSwKK3Rob3VnaCBoZSBmZWVscyBtb3RpdmF0ZWQgdG8gbW90aXZhdGUgY29udHJpYnV0b3JzLCBhbmQgeW91IGNhbiBzdXJlbHkKK2Rpc2N1c3MgdGhpcyB3aXRoIGhpbSBiZWZvcmUgb3IgYWZ0ZXIgY29udHJpYnV0aW5nLiAgWW91IGhhdmUgdGhlCityaWdodCB0byBkZWNsaW5lIHRvIGFsbG93IGhpbSB0byBsaWNlbnNlIHlvdXIgY29kZSBjb250cmlidXRpb24gb3RoZXIKK3RoYW4gdW5kZXIgdGhlIEdQTC4KKworRnVydGhlciBsaWNlbnNpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIGZvciBjb21tZXJjaWFsIGFuZC9vciBvdGhlcgoraW50ZXJlc3RzIGRpcmVjdGx5IGZyb20gSGFucyBSZWlzZXI6IGhhbnNAcmVpc2VyLnRvLiAgSWYgeW91IGludGVycHJldAordGhlIEdQTCBhcyBub3QgYWxsb3dpbmcgdGhvc2UgYWRkaXRpb25hbCBsaWNlbnNpbmcgb3B0aW9ucywgeW91IHJlYWQKK2l0IHdyb25nbHksIGFuZCBSaWNoYXJkIFN0YWxsbWFuIGFncmVlcyB3aXRoIG1lLCB3aGVuIGNhcmVmdWxseSByZWFkCit5b3UgY2FuIHNlZSB0aGF0IHRob3NlIHJlc3RyaWN0aW9ucyBvbiBhZGRpdGlvbmFsIHRlcm1zIGRvIG5vdCBhcHBseQordG8gdGhlIG93bmVyIG9mIHRoZSBjb3B5cmlnaHQsIGFuZCBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGlzIHNoYWxsCitnb3Zlcm4gZm9yIHRoaXMgbGljZW5zZS4gIAorCitGaW5hbGx5LCBub3RoaW5nIGluIHRoaXMgbGljZW5zZSBzaGFsbCBiZSBpbnRlcnByZXRlZCB0byBhbGxvdyB5b3UgdG8KK2ZhaWwgdG8gZmFpcmx5IGNyZWRpdCBtZSwgb3IgdG8gcmVtb3ZlIG15IGNyZWRpdHMsIHdpdGhvdXQgbXkKK3Blcm1pc3Npb24sIHVubGVzcyB5b3UgYXJlIGFuIGVuZCB1c2VyIG5vdCByZWRpc3RyaWJ1dGluZyB0byBvdGhlcnMuCitJZiB5b3UgaGF2ZSBkb3VidHMgYWJvdXQgaG93IHRvIHByb3Blcmx5IGRvIHRoYXQsIG9yIGFib3V0IHdoYXQgaXMKK2ZhaXIsIGFzay4gIChMYXN0IEkgc3Bva2Ugd2l0aCBoaW0gUmljaGFyZCB3YXMgY29udGVtcGxhdGluZyBob3cgYmVzdAordG8gYWRkcmVzcyB0aGUgZmFpciBjcmVkaXRpbmcgaXNzdWUgaW4gdGhlIG5leHQgR1BMIHZlcnNpb24uKQorCitbRU5EIExJQ0VOU0lOR10KKworUmVpc2VyZnMgaXMgYSBmaWxlIHN5c3RlbSBiYXNlZCBvbiBiYWxhbmNlZCB0cmVlIGFsZ29yaXRobXMsIHdoaWNoIGlzCitkZXNjcmliZWQgYXQgaHR0cDovL2RldmxpbnV4LmNvbS9uYW1lc3lzLgorCitTdG9wIHJlYWRpbmcgaGVyZS4gIEdvIHRoZXJlLCB0aGVuIHJldHVybi4KKworU2VuZCBidWcgcmVwb3J0cyB0byB5dXJhQG5hbWVzeXMuYm90aWsucnUuCisKK21rcmVpc2VyZnMgYW5kIG90aGVyIHV0aWxpdGllcyBhcmUgaW4gcmVpc2VyZnMvdXRpbHMsIG9yIHdoZXJldmVyIHlvdXIKK0xpbnV4IHByb3ZpZGVyIHB1dCB0aGVtLiAgVGhlcmUgaXMgc29tZSBkaXNhZ3JlZW1lbnQgYWJvdXQgaG93IHVzZWZ1bAoraXQgaXMgZm9yIHVzZXJzIHRvIGdldCB0aGVpciBmc2NrIGFuZCBta3JlaXNlcmZzIG91dCBvZiBzeW5jIHdpdGggdGhlCit2ZXJzaW9uIG9mIHJlaXNlcmZzIHRoYXQgaXMgaW4gdGhlaXIga2VybmVsLCB3aXRoIG1hbnkgaW1wb3J0YW50CitkaXN0cmlidXRvcnMgd2FudGluZyB0aGVtIG91dCBvZiBzeW5jLjotKSBQbGVhc2UgdHJ5IHRvIHJlbWVtYmVyIHRvCityZWNvbXBpbGUgYW5kIHJlaW5zdGFsbCBmc2NrIGFuZCBta3JlaXNlcmZzIHdpdGggZXZlcnkgdXBkYXRlIG9mCityZWlzZXJmcywgdGhpcyBpcyBhIGNvbW1vbiBzb3VyY2Ugb2YgY29uZnVzaW9uLiAgTm90ZSB0aGF0IHNvbWUgb2YgdGhlCit1dGlsaXRpZXMgY2Fubm90IGJlIGNvbXBpbGVkIHdpdGhvdXQgYWNjZXNzaW5nIHRoZSBiYWxhbmNpbmcgY29kZQord2hpY2ggaXMgaW4gdGhlIGtlcm5lbCBjb2RlLCBhbmQgcmVsb2NhdGluZyB0aGUgdXRpbGl0aWVzIG1heSByZXF1aXJlCit5b3UgdG8gc3BlY2lmeSB3aGVyZSB0aGF0IGNvZGUgY2FuIGJlIGZvdW5kLgorCitZZXMsIGlmIHlvdSB1cGRhdGUgeW91ciByZWlzZXJmcyBrZXJuZWwgbW9kdWxlIHlvdSBkbyBoYXZlIHRvCityZWNvbXBpbGUgeW91ciBrZXJuZWwsIG1vc3Qgb2YgdGhlIHRpbWUuICBUaGUgZXJyb3JzIHlvdSBnZXQgd2lsbCBiZQorcXVpdGUgY3J5cHRpYyBpZiB5b3VyIGZvcmdldCB0byBkbyBzby4KKworUmVhbCB1c2VycywgYXMgb3Bwb3NlZCB0byBmb2xrcyB3aG8gd2FudCB0byBoYWNrIGFuZCB0aGVuIHVuZGVyc3RhbmQKK3doYXQgd2VudCB3cm9uZywgd2lsbCB3YW50IFJFSVNFUkZTX0NIRUNLIG9mZi4KKworSGlkZW91cyBDb21tZXJjaWFsIFBpdGNoOiBTcHJlYWQgeW91ciBkZXZlbG9wbWVudCBjb3N0cyBhY3Jvc3Mgb3RoZXIgT1MKK3ZlbmRvcnMuICBTZWxlY3QgZnJvbSB0aGUgYmVzdCBpbiB0aGUgd29ybGQsIG5vdCB0aGUgYmVzdCBpbiB5b3VyCitidWlsZGluZywgYnkgYnV5aW5nIGZyb20gdGhpcmQgcGFydHkgT1MgY29tcG9uZW50IHN1cHBsaWVycy4gIExldmVyYWdlCit0aGUgc29mdHdhcmUgY29tcG9uZW50IGRldmVsb3BtZW50IHBvd2VyIG9mIHRoZSBpbnRlcm5ldC4gIEJlIHRoZSBtb3N0CithZ2dyZXNzaXZlIGluIHRha2luZyBhZHZhbnRhZ2Ugb2YgdGhlIGNvbW1lcmNpYWwgcG9zc2liaWxpdGllcyBvZgorZGVjZW50cmFsaXplZCBpbnRlcm5ldCBkZXZlbG9wbWVudCwgYW5kIGFkZCB2YWx1ZSB0aHJvdWdoIHlvdXIgYnJhbmRlZAoraW50ZWdyYXRpb24gdGhhdCB5b3Ugc2VsbCBhcyBhbiBvcGVyYXRpbmcgc3lzdGVtLiAgTGV0IHlvdXIgY29tcGV0aXRvcnMKK2JlIHRoZSBvbmVzIHRvIGNvbXBldGUgYWdhaW5zdCB0aGUgZW50aXJlIGludGVybmV0IGJ5IHRoZW1zZWx2ZXMuICBCZQoraGlwLCBnZXQgd2l0aCB0aGUgbmV3IGVjb25vbWljIHRyZW5kLCBiZWZvcmUgeW91ciBjb21wZXRpdG9ycyBkby4gIFNlbmQKK2VtYWlsIHRvIGhhbnNAcmVpc2VyLnRvLgorCitUbyB1bmRlcnN0YW5kIHRoZSBjb2RlLCBhZnRlciByZWFkaW5nIHRoZSB3ZWJzaXRlLCBzdGFydCByZWFkaW5nIHRoZQorY29kZSBieSByZWFkaW5nIHJlaXNlcmZzX2ZzLmggZmlyc3QuCisKK0hhbnMgUmVpc2VyIHdhcyB0aGUgcHJvamVjdCBpbml0aWF0b3IsIHByaW1hcnkgYXJjaGl0ZWN0LCBzb3VyY2Ugb2YgYWxsCitmdW5kaW5nIGZvciB0aGUgZmlyc3QgNS41IHllYXJzLCBhbmQgb25lIG9mIHRoZSBwcm9ncmFtbWVycy4gIEhlIG93bnMKK3RoZSBjb3B5cmlnaHQuCisKK1ZsYWRpbWlyIFNhdmVsamV2IHdhcyBvbmUgb2YgdGhlIHByb2dyYW1tZXJzLCBhbmQgaGUgd29ya2VkIGxvbmcgaG91cnMKK3dyaXRpbmcgdGhlIGNsZWFuZXN0IGNvZGUuICBIZSBhbHdheXMgbWFkZSB0aGUgZWZmb3J0IHRvIGJlIHRoZSBiZXN0IGhlCitjb3VsZCBiZSwgYW5kIHRvIG1ha2UgaGlzIGNvZGUgdGhlIGJlc3QgdGhhdCBpdCBjb3VsZCBiZS4gIFdoYXQgcmVzdWx0ZWQKK3dhcyBxdWl0ZSByZW1hcmthYmxlLiBJIGRvbid0IHRoaW5rIHRoYXQgbW9uZXkgY2FuIGV2ZXIgbW90aXZhdGUgc29tZW9uZQordG8gd29yayB0aGUgd2F5IGhlIGRpZCwgaGUgaXMgb25lIG9mIHRoZSBtb3N0IHNlbGZsZXNzIG1lbiBJIGtub3cuCisKK1l1cmEgaGVscHMgd2l0aCBiZW5jaG1hcmtpbmcsIGNvZGluZyBoYXNoZXMsIGFuZCBibG9jayBwcmUtYWxsb2NhdGlvbgorY29kZS4KKworQW5hdG9seSBQaW5jaHVrIGlzIGEgZm9ybWVyIG1lbWJlciBvZiBvdXIgdGVhbSB3aG8gd29ya2VkIGNsb3NlbHkgd2l0aAorVmxhZGltaXIgdGhyb3VnaG91dCB0aGUgcHJvamVjdCdzIGRldmVsb3BtZW50LiAgSGUgd3JvdGUgYSBxdWl0ZQorc3Vic3RhbnRpYWwgcG9ydGlvbiBvZiB0aGUgdG90YWwgY29kZS4gIEhlIHJlYWxpemVkIHRoYXQgdGhlcmUgd2FzIGEKK3NwYWNlIHByb2JsZW0gd2l0aCBwYWNraW5nIHRhaWxzIG9mIGZpbGVzIGZvciBmaWxlcyBsYXJnZXIgdGhhbiBhIG5vZGUKK3RoYXQgc3RhcnQgb24gYSBub2RlIGFsaWduZWQgYm91bmRhcnkgKHRoZXJlIGFyZSByZWFzb25zIHRvIHdhbnQgdG8gbm9kZQorYWxpZ24gZmlsZXMpLCBhbmQgaGUgaW52ZW50ZWQgYW5kIGltcGxlbWVudGVkIGluZGlyZWN0IGl0ZW1zIGFuZAordW5mb3JtYXR0ZWQgbm9kZXMgYXMgdGhlIHNvbHV0aW9uLgorCitLb25zdGFudGluIFNodmFjaGtvLCB3aXRoIHRoZSBoZWxwIG9mIHRoZSBSdXNzaWFuIHZlcnNpb24gb2YgYSBWQywKK3RyaWVkIHRvIHB1dCBtZSBpbiBhIHBvc2l0aW9uIHdoZXJlIEkgd2FzIGZvcmNlZCBpbnRvIGdpdmluZyBjb250cm9sCitvZiB0aGUgcHJvamVjdCB0byBoaW0uICAoRm9ydHVuYXRlbHksIGFzIHRoZSBwZXJzb24gcGF5aW5nIHRoZSBtb25leQorZm9yIGFsbCBzYWxhcmllcyBmcm9tIG15IGRheWpvYiBJIG93bmVkIGFsbCBjb3B5cmlnaHRzLCBhbmQgeW91IGNhbid0CityZWFsbHkgZm9yY2UgdGFrZW92ZXJzIG9mIHNvbGUgcHJvcHJpZXRvcnNoaXBzLikgIFRoaXMgd2FzIHNvbWV0aGluZworY3VyaW91cywgYmVjYXVzZSBoZSBuZXZlciByZWFsbHkgdW5kZXJzdG9vZCB0aGUgdmFsdWUgb2Ygb3VyIHByb2plY3QsCit3aHkgd2Ugc2hvdWxkIGRvIHdoYXQgd2UgZG8sIG9yIHdoeSBpbm5vdmF0aW9uIHdhcyBwb3NzaWJsZSBpbgorZ2VuZXJhbCwgYnV0IGhlIHdhcyBzdXJlIHRoYXQgaGUgb3VnaHQgdG8gYmUgY29udHJvbGxpbmcgaXQuICBFdmVyeQoraW5ub3ZhdGlvbiBoYWQgdG8gYmUgZm9yY2VkIHBhc3QgaGltIHdoaWxlIGhlIHdhcyB3aXRoIHVzLiAgSGUgYWRkZWQKK3R3byB5ZWFycyB0byB0aGUgdGltZSByZXF1aXJlZCB0byBjb21wbGV0ZSByZWlzZXJmcywgYW5kIHdhcyBhIG5ldAorbG9zcyBmb3IgbWUuICBNaWtoYWlsIEdpbHVsYSB3YXMgYSBicmlsbGlhbnQgaW5ub3ZhdG9yIHdobyBhbHNvIGxlZnQKK2luIGEgZGVzdHJ1Y3RpdmUgd2F5IHRoYXQgZXJhc2VkIHRoZSB2YWx1ZSBvZiBoaXMgY29udHJpYnV0aW9ucywgYW5kCit0aGF0IGhlIHdhcyBzaG93biBtdWNoIGdlbmVyb3NpdHkganVzdCBtYWtlcyBpdCBtb3JlIHBhaW5mdWwuCisKK0dyaWdvcnkgWmFpZ3JhbGluIHdhcyBhbiBleHRyZW1lbHkgZWZmZWN0aXZlIHN5c3RlbSBhZG1pbmlzdHJhdG9yIGZvcgorb3VyIGdyb3VwLgorCitJZ29yIEtyYXNoZW5pbm5pa292IHdhcyB3b25kZXJmdWwgYXQgaGFyZHdhcmUgcHJvY3VyZW1lbnQsIHJlcGFpciwgYW5kCituZXR3b3JrIGluc3RhbGxhdGlvbi4KKworSmVyZW15IEZpdHpoYXJkaW5nZSB3cm90ZSB0aGUgdGVhaGFzaC5jIGNvZGUsIGFuZCBoZSBnaXZlcyBjcmVkaXQgdG8gYQordGV4dGJvb2sgaGUgZ290IHRoZSBhbGdvcml0aG0gZnJvbSBpbiB0aGUgY29kZS4gIE5vdGUgdGhhdCBoaXMgYW5hbHlzaXMKK29mIGhvdyB3ZSBjb3VsZCB1c2UgdGhlIGhhc2hpbmcgY29kZSBpbiBtYWtpbmcgMzIgYml0IE5GUyBjb29raWVzIHdvcmsKK3dhcyBwcm9iYWJseSBtb3JlIGltcG9ydGFudCB0aGFuIHRoZSBhY3R1YWwgYWxnb3JpdGhtLiAgQ29saW4gUGx1bWIgYWxzbworY29udHJpYnV0ZWQgdG8gaXQuCisKK0NocmlzIE1hc29uIGRpdmVkIHJpZ2h0IGludG8gb3VyIGNvZGUsIGFuZCBpbiBqdXN0IGEgZmV3IG1vbnRocyBwcm9kdWNlZAordGhlIGpvdXJuYWxpbmcgY29kZSB0aGF0IGRyYW1hdGljYWxseSBpbmNyZWFzZWQgdGhlIHZhbHVlIG9mIFJlaXNlckZTLgorSGUgaXMganVzdCBhbiBhbWF6aW5nIHByb2dyYW1tZXIuCisKK0lnb3IgWmFnb3JvdnNreSBpcyB3cml0aW5nIG11Y2ggb2YgdGhlIG5ldyBpdGVtIGhhbmRsZXIgYW5kIGV4dGVudCBjb2RlCitmb3Igb3VyIG5leHQgbWFqb3IgcmVsZWFzZS4KKworQWxleGFuZGVyIFphcm9jaGVudGNldiAoc29tZXRpbWVzIGtub3duIGFzIHphbSwgb3Igc2FzaGEpLCB3cm90ZSB0aGUKK3Jlc2l6ZXIsIGFuZCBpcyBoYXJkIGF0IHdvcmsgb24gaW1wbGVtZW50aW5nIGFsbG9jYXRlIG9uIGZsdXNoLiAgU0dJCitpbXBsZW1lbnRlZCBhbGxvY2F0ZSBvbiBmbHVzaCBiZWZvcmUgdXMgZm9yIFhGUywgYW5kIGdlbmVyb3VzbHkgdG9vawordGhlIHRpbWUgdG8gY29udmluY2UgbWUgd2Ugc2hvdWxkIGRvIGl0IGFsc28uICBUaGV5IGFyZSBncmVhdCBwZW9wbGUsCithbmQgYSBncmVhdCBjb21wYW55LgorCitZdXJpIFNoZXZjaHVrIGFuZCBOaWtpdGEgRGFuaWxvdiBhcmUgZG9pbmcgc3F1aWQgY2FjaGUgb3B0aW1pemF0aW9uLgorCitWaXRhbHkgRmVydG1hbiBpcyBkb2luZyBmc2NrLgorCitKZWZmIE1haG9uZXksIG9mIFN1U0UsIGNvbnRyaWJ1dGVkIGEgZmV3IGNsZWFudXAgZml4ZXMsIG1vc3Qgbm90YWJseQordGhlIGVuZGlhbiBzYWZlIHBhdGNoZXMgd2hpY2ggYWxsb3cgUmVpc2VyRlMgdG8gcnVuIG9uIGFueSBwbGF0Zm9ybQorc3VwcG9ydGVkIGJ5IHRoZSBMaW51eCBrZXJuZWwuCisKK1N1U0UsIEludGVncmF0ZWRMaW51eC5jb20sIEVjaWxhLCBNUDMuY29tLCBiaWdzdG9yYWdlLmNvbSwgYW5kIHRoZQorQWxwaGEgUEMgQ29tcGFueSBtYWRlIGl0IHBvc3NpYmxlIGZvciBtZSB0byBub3QgaGF2ZSBhIGRheSBqb2IKK2FueW1vcmUsIGFuZCB0byBkcmFtYXRpY2FsbHkgaW5jcmVhc2Ugb3VyIHN0YWZmaW5nLiAgRWNpbGEgZnVuZGVkCitoeXBlcnRleHQgZmVhdHVyZSBkZXZlbG9wbWVudCwgTVAzLmNvbSBmdW5kZWQgam91cm5hbGluZywgU3VTRSBmdW5kZWQKK2NvcmUgZGV2ZWxvcG1lbnQsIEludGVncmF0ZWRMaW51eC5jb20gZnVuZGVkIHNxdWlkIHdlYiBjYWNoZQorYXBwbGlhbmNlcywgYmlnc3RvcmFnZS5jb20gZnVuZGVkIEhTTSwgYW5kIHRoZSBhbHBoYSBQQyBjb21wYW55IGZ1bmRlZAordGhlIGFscGhhIHBvcnQuICBNYW55IG9mIHRoZXNlIHRhc2tzIHdlcmUgaGVscGVkIGJ5IHNwb25zb3JzIG90aGVyCit0aGFuIHRoZSBvbmVzIGp1c3QgbmFtZWQuICBTdVNFIGhhcyBoZWxwZWQgaW4gbXVjaCBtb3JlIHRoYW4ganVzdAorZnVuZGluZy4uLi4KKwpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvYml0bWFwLmMgYi9mcy9yZWlzZXJmcy9iaXRtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGUyZWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvcmVpc2VyZnMvYml0bWFwLmMKQEAgLTAsMCArMSwxMTY5IEBACisvKgorICogQ29weXJpZ2h0IDIwMDAgYnkgSGFucyBSZWlzZXIsIGxpY2Vuc2luZyBnb3Zlcm5lZCBieSByZWlzZXJmcy9SRUFETUUKKyAqLworLyogUmVpc2VyZnMgYmxvY2sgKGRlKWFsbG9jYXRvciwgYml0bWFwLWJhc2VkLiAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc19mc19zYi5oPgorI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2ZzX2kuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorCisjZGVmaW5lIFBSRUFMTE9DQVRJT05fU0laRSA5CisKKy8qIGRpZmZlcmVudCByZWlzZXJmcyBibG9jayBhbGxvY2F0b3Igb3B0aW9ucyAqLworCisjZGVmaW5lIFNCX0FMTE9DX09QVFMocykgKFJFSVNFUkZTX1NCKHMpLT5zX2FsbG9jX29wdGlvbnMuYml0cykKKworI2RlZmluZSAgX0FMTE9DX2NvbmNlbnRyYXRpbmdfZm9ybWF0dGVkX25vZGVzIDAKKyNkZWZpbmUgIF9BTExPQ19kaXNwbGFjaW5nX2xhcmdlX2ZpbGVzIDEKKyNkZWZpbmUgIF9BTExPQ19kaXNwbGFjaW5nX25ld19wYWNraW5nX2xvY2FsaXRpZXMgMgorI2RlZmluZSAgX0FMTE9DX29sZF9oYXNoZWRfcmVsb2NhdGlvbiAzCisjZGVmaW5lICBfQUxMT0NfbmV3X2hhc2hlZF9yZWxvY2F0aW9uIDQKKyNkZWZpbmUgIF9BTExPQ19za2lwX2J1c3kgNQorI2RlZmluZSAgX0FMTE9DX2Rpc3BsYWNlX2Jhc2VkX29uX2RpcmlkIDYKKyNkZWZpbmUgIF9BTExPQ19oYXNoZWRfZm9ybWF0dGVkX25vZGVzIDcKKyNkZWZpbmUgIF9BTExPQ19vbGRfd2F5IDgKKyNkZWZpbmUgIF9BTExPQ19odW5kcmVkdGhfc2xpY2VzIDkKKyNkZWZpbmUgIF9BTExPQ19kaXJpZF9ncm91cHMgMTAKKyNkZWZpbmUgIF9BTExPQ19vaWRfZ3JvdXBzIDExCisjZGVmaW5lICBfQUxMT0NfcGFja2luZ19ncm91cHMgMTIKKworI2RlZmluZSAgY29uY2VudHJhdGluZ19mb3JtYXR0ZWRfbm9kZXMocykJdGVzdF9iaXQoX0FMTE9DX2NvbmNlbnRyYXRpbmdfZm9ybWF0dGVkX25vZGVzLCAmU0JfQUxMT0NfT1BUUyhzKSkKKyNkZWZpbmUgIGRpc3BsYWNpbmdfbGFyZ2VfZmlsZXMocykJCXRlc3RfYml0KF9BTExPQ19kaXNwbGFjaW5nX2xhcmdlX2ZpbGVzLCAmU0JfQUxMT0NfT1BUUyhzKSkKKyNkZWZpbmUgIGRpc3BsYWNpbmdfbmV3X3BhY2tpbmdfbG9jYWxpdGllcyhzKQl0ZXN0X2JpdChfQUxMT0NfZGlzcGxhY2luZ19uZXdfcGFja2luZ19sb2NhbGl0aWVzLCAmU0JfQUxMT0NfT1BUUyhzKSkKKworI2RlZmluZSBTRVRfT1BUSU9OKG9wdG5hbWUpIFwKKyAgIGRvIHsgXAorICAgICAgICByZWlzZXJmc193YXJuaW5nKHMsICJyZWlzZXJmczogb3B0aW9uIFwiJXNcIiBpcyBzZXQiLCAjb3B0bmFtZSk7IFwKKyAgICAgICAgc2V0X2JpdChfQUxMT0NfICMjIG9wdG5hbWUgLCAmU0JfQUxMT0NfT1BUUyhzKSk7IFwKKyAgICB9IHdoaWxlKDApCisjZGVmaW5lIFRFU1RfT1BUSU9OKG9wdG5hbWUsIHMpIFwKKyAgICB0ZXN0X2JpdChfQUxMT0NfICMjIG9wdG5hbWUgLCAmU0JfQUxMT0NfT1BUUyhzKSkKKworc3RhdGljIGlubGluZSB2b2lkIGdldF9iaXRfYWRkcmVzcyAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywKKwkJCQkgICAgYl9ibG9ja25yX3QgYmxvY2ssIGludCAqIGJtYXBfbnIsIGludCAqIG9mZnNldCkKK3sKKyAgICAvKiBJdCBpcyBpbiB0aGUgYml0bWFwIGJsb2NrIG51bWJlciBlcXVhbCB0byB0aGUgYmxvY2sKKyAgICAgKiBudW1iZXIgZGl2aWRlZCBieSB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gYSBibG9jay4gKi8KKyAgICAqYm1hcF9uciA9IGJsb2NrIC8gKHMtPnNfYmxvY2tzaXplIDw8IDMpOworICAgIC8qIFdpdGhpbiB0aGF0IGJpdG1hcCBibG9jayBpdCBpcyBsb2NhdGVkIGF0IGJpdCBvZmZzZXQgKm9mZnNldC4gKi8KKyAgICAqb2Zmc2V0ID0gYmxvY2sgJiAoKHMtPnNfYmxvY2tzaXplIDw8IDMpIC0gMSApOworICAgIHJldHVybjsKK30KKworI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSworaW50IGlzX3JldXNhYmxlIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLCBiX2Jsb2NrbnJfdCBibG9jaywgaW50IGJpdF92YWx1ZSkKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGlmIChibG9jayA9PSAwIHx8IGJsb2NrID49IFNCX0JMT0NLX0NPVU5UIChzKSkgeworCXJlaXNlcmZzX3dhcm5pbmcgKHMsICJ2cy00MDEwOiBpc19yZXVzYWJsZTogYmxvY2sgbnVtYmVyIGlzIG91dCBvZiByYW5nZSAlbHUgKCV1KSIsCisJCQkgIGJsb2NrLCBTQl9CTE9DS19DT1VOVCAocykpOworCXJldHVybiAwOworICAgIH0KKworICAgIC8qIGl0IGNhbid0IGJlIG9uZSBvZiB0aGUgYml0bWFwIGJsb2NrcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBTQl9CTUFQX05SIChzKTsgaSArKykKKwlpZiAoYmxvY2sgPT0gU0JfQVBfQklUTUFQIChzKVtpXS5iaC0+Yl9ibG9ja25yKSB7CisJICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJ2czogNDAyMDogaXNfcmV1c2FibGU6ICIKKwkJCSAgICAgICJiaXRtYXAgYmxvY2sgJWx1KCV1KSBjYW4ndCBiZSBmcmVlZCBvciByZXVzZWQiLAorCQkJICAgICAgYmxvY2ssIFNCX0JNQVBfTlIgKHMpKTsKKwkgICAgcmV0dXJuIDA7CisJfQorICAKKyAgICBnZXRfYml0X2FkZHJlc3MgKHMsIGJsb2NrLCAmaSwgJmopOworCisgICAgaWYgKGkgPj0gU0JfQk1BUF9OUiAocykpIHsKKwlyZWlzZXJmc193YXJuaW5nIChzLCAidnMtNDAzMDogaXNfcmV1c2FibGU6IHRoZXJlIGlzIG5vIHNvIG1hbnkgYml0bWFwIGJsb2NrczogIgorCQkJICAiYmxvY2s9JWx1LCBiaXRtYXBfbnI9JWQiLCBibG9jaywgaSk7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKChiaXRfdmFsdWUgPT0gMCAmJiAKKyAgICAgICAgIHJlaXNlcmZzX3Rlc3RfbGVfYml0KGosIFNCX0FQX0JJVE1BUChzKVtpXS5iaC0+Yl9kYXRhKSkgfHwKKwkoYml0X3ZhbHVlID09IDEgJiYgCisJIHJlaXNlcmZzX3Rlc3RfbGVfYml0KGosIFNCX0FQX0JJVE1BUCAocylbaV0uYmgtPmJfZGF0YSkgPT0gMCkpIHsKKwlyZWlzZXJmc193YXJuaW5nIChzLCAidnMtNDA0MDogaXNfcmV1c2FibGU6IGNvcnJlc3BvbmRpbmcgYml0IG9mIGJsb2NrICVsdSBkb2VzIG5vdCAiCisJCQkgICJtYXRjaCByZXF1aXJlZCB2YWx1ZSAoaT09JWQsIGo9PSVkKSB0ZXN0X2JpdD09JWQiLAorCQlibG9jaywgaSwgaiwgcmVpc2VyZnNfdGVzdF9sZV9iaXQgKGosIFNCX0FQX0JJVE1BUCAocylbaV0uYmgtPmJfZGF0YSkpOworCisJcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKGJpdF92YWx1ZSA9PSAwICYmIGJsb2NrID09IFNCX1JPT1RfQkxPQ0sgKHMpKSB7CisJcmVpc2VyZnNfd2FybmluZyAocywgInZzLTQwNTA6IGlzX3JldXNhYmxlOiB0aGlzIGlzIHJvb3QgYmxvY2sgKCV1KSwgIgorCQkJICAiaXQgbXVzdCBiZSBidXN5IiwgU0JfUk9PVF9CTE9DSyAocykpOworCXJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiAxOworfQorI2VuZGlmIC8qIENPTkZJR19SRUlTRVJGU19DSEVDSyAqLworCisvKiBzZWFyY2hlcyBpbiBqb3VybmFsIHN0cnVjdHVyZXMgZm9yIGEgZ2l2ZW4gYmxvY2sgbnVtYmVyIChibWFwLCBvZmYpLiBJZiBibG9jaworICAgaXMgZm91bmQgaW4gcmVpc2VyZnMgam91cm5hbCBpdCBzdWdnZXN0cyBuZXh0IGZyZWUgYmxvY2sgY2FuZGlkYXRlIHRvIHRlc3QuICovCitzdGF0aWMgaW5saW5lICBpbnQgaXNfYmxvY2tfaW5fam91cm5hbCAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgaW50IGJtYXAsIGludAorb2ZmLCBpbnQgKm5leHQpCit7CisgICAgYl9ibG9ja25yX3QgdG1wOworCisgICAgaWYgKHJlaXNlcmZzX2luX2pvdXJuYWwgKHMsIGJtYXAsIG9mZiwgMSwgJnRtcCkpIHsKKwlpZiAodG1wKSB7ICAgICAgICAgICAgICAvKiBoaW50IHN1cHBsaWVkICovCisJICAgICpuZXh0ID0gdG1wOworCSAgICBQUk9DX0lORk9fSU5DKCBzLCBzY2FuX2JpdG1hcC5pbl9qb3VybmFsX2hpbnQgKTsKKwl9IGVsc2UgeworCSAgICAoKm5leHQpID0gb2ZmICsgMTsgICAgICAgICAgLyogaW5jIG9mZnNldCB0byBhdm9pZCBsb29waW5nLiAqLworCSAgICBQUk9DX0lORk9fSU5DKCBzLCBzY2FuX2JpdG1hcC5pbl9qb3VybmFsX25vaGludCApOworCX0KKwlQUk9DX0lORk9fSU5DKCBzLCBzY2FuX2JpdG1hcC5yZXRyeSApOworCXJldHVybiAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogaXQgc2VhcmNoZXMgZm9yIGEgd2luZG93IG9mIHplcm8gYml0cyB3aXRoIGdpdmVuIG1pbmltdW0gYW5kIG1heGltdW0gbGVuZ3RocyBpbiBvbmUgYml0bWFwCisgKiBibG9jazsgKi8KK3N0YXRpYyBpbnQgc2Nhbl9iaXRtYXBfYmxvY2sgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJICAgICAgaW50IGJtYXBfbiwgaW50ICpiZWcsIGludCBib3VuZGFyeSwgaW50IG1pbiwgaW50IG1heCwgaW50IHVuZm0pCit7CisgICAgc3RydWN0IHN1cGVyX2Jsb2NrICpzID0gdGgtPnRfc3VwZXI7CisgICAgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9pbmZvICpiaT0mU0JfQVBfQklUTUFQKHMpW2JtYXBfbl07CisgICAgaW50IGVuZCwgbmV4dDsKKyAgICBpbnQgb3JnID0gKmJlZzsKKworICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKworICAgIFJGQUxTRShibWFwX24gPj0gU0JfQk1BUF9OUiAocyksICJCaXRtYXAgJWQgaXMgb3V0IG9mIHJhbmdlICgwLi4lZCkiLGJtYXBfbiwgU0JfQk1BUF9OUiAocykgLSAxKTsKKyAgICBQUk9DX0lORk9fSU5DKCBzLCBzY2FuX2JpdG1hcC5ibWFwICk7CisvKiB0aGlzIGlzIHVuY2xlYXIgYW5kIGxhY2tzIGNvbW1lbnRzLCBleHBsYWluIGhvdyBqb3VybmFsIGJpdG1hcHMKKyAgIHdvcmsgaGVyZSBmb3IgdGhlIHJlYWRlci4gIENvbnZleSBhIHNlbnNlIG9mIHRoZSBkZXNpZ24gaGVyZS4gV2hhdAorICAgaXMgYSB3aW5kb3c/ICovCisvKiAtIEkgbWVhbiBgYSB3aW5kb3cgb2YgemVybyBiaXRzJyBhcyBpbiBkZXNjcmlwdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIC0gWmFtLiAqLworICAKKyAgICBpZiAoICFiaSApIHsKKwlyZWlzZXJmc193YXJuaW5nIChzLCAiTlVMTCBiaXRtYXAgaW5mbyBwb2ludGVyIGZvciBiaXRtYXAgJWQiLCBibWFwX24pOworCXJldHVybiAwOworICAgIH0KKyAgICBpZiAoYnVmZmVyX2xvY2tlZCAoYmktPmJoKSkgeworICAgICAgIFBST0NfSU5GT19JTkMoIHMsIHNjYW5fYml0bWFwLndhaXQgKTsKKyAgICAgICBfX3dhaXRfb25fYnVmZmVyIChiaS0+YmgpOworICAgIH0KKworICAgIHdoaWxlICgxKSB7CisJY29udDoKKwlpZiAoYmktPmZyZWVfY291bnQgPCBtaW4pCisJCXJldHVybiAwOyAvLyBObyBmcmVlIGJsb2NrcyBpbiB0aGlzIGJpdG1hcAorCisJLyogc2VhcmNoIGZvciBhIGZpcnN0IHplcm8gYml0IC0tIGJlZ2dpbmluZyBvZiBhIHdpbmRvdyAqLworCSpiZWcgPSByZWlzZXJmc19maW5kX25leHRfemVyb19sZV9iaXQKKwkgICAgICAgICgodW5zaWduZWQgbG9uZyopKGJpLT5iaC0+Yl9kYXRhKSwgYm91bmRhcnksICpiZWcpOworICAKKwlpZiAoKmJlZyArIG1pbiA+IGJvdW5kYXJ5KSB7IC8qIHNlYXJjaCBmb3IgYSB6ZXJvIGJpdCBmYWlscyBvciB0aGUgcmVzdCBvZiBiaXRtYXAgYmxvY2sKKwkJCQkgICAgICAqIGNhbm5vdCBjb250YWluIGEgemVybyB3aW5kb3cgb2YgbWluaW11bSBzaXplICovCisJICAgIHJldHVybiAwOworCX0KKworCWlmICh1bmZtICYmIGlzX2Jsb2NrX2luX2pvdXJuYWwocyxibWFwX24sICpiZWcsIGJlZykpCisJICAgIGNvbnRpbnVlOworCS8qIGZpcnN0IHplcm8gYml0IGZvdW5kOyB3ZSBjaGVjayBuZXh0IGJpdHMgKi8KKwlmb3IgKGVuZCA9ICpiZWcgKyAxOzsgZW5kICsrKSB7CisJICAgIGlmIChlbmQgPj0gKmJlZyArIG1heCB8fCBlbmQgPj0gYm91bmRhcnkgfHwgcmVpc2VyZnNfdGVzdF9sZV9iaXQgKGVuZCwgYmktPmJoLT5iX2RhdGEpKSB7CisJCW5leHQgPSBlbmQ7CisJCWJyZWFrOworCSAgICB9CisJICAgIC8qIGZpbmRpbmcgdGhlIG90aGVyIGVuZCBvZiB6ZXJvIGJpdCB3aW5kb3cgcmVxdWlyZXMgbG9va2luZyBpbnRvIGpvdXJuYWwgc3RydWN0dXJlcyAoaW4KKwkgICAgICogY2FzZSBvZiBzZWFyY2hpbmcgZm9yIGZyZWUgYmxvY2tzIGZvciB1bmZvcm1hdHRlZCBub2RlcykgKi8KKwkgICAgaWYgKHVuZm0gJiYgaXNfYmxvY2tfaW5fam91cm5hbChzLCBibWFwX24sIGVuZCwgJm5leHQpKQorCQlicmVhazsKKwl9CisKKwkvKiBub3cgKCpiZWcpIHBvaW50cyB0byBiZWdpbm5pbmcgb2YgemVybyBiaXRzIHdpbmRvdywKKwkgKiAoZW5kKSBwb2ludHMgdG8gb25lIGJpdCBhZnRlciB0aGUgd2luZG93IGVuZCAqLworCWlmIChlbmQgLSAqYmVnID49IG1pbikgeyAvKiBpdCBzZWVtcyB3ZSBoYXZlIGZvdW5kIHdpbmRvdyBvZiBwcm9wZXIgc2l6ZSAqLworCSAgICBpbnQgaTsKKwkgICAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbCAocywgYmktPmJoLCAxKTsKKwkgICAgLyogdHJ5IHRvIHNldCBhbGwgYmxvY2tzIHVzZWQgY2hlY2tpbmcgYXJlIHRoZXkgc3RpbGwgZnJlZSAqLworCSAgICBmb3IgKGkgPSAqYmVnOyBpIDwgZW5kOyBpKyspIHsKKwkJLyogSXQgc2VlbXMgdGhhdCB3ZSBzaG91bGQgbm90IGNoZWNrIGluIGpvdXJuYWwgYWdhaW4uICovCisJCWlmIChyZWlzZXJmc190ZXN0X2FuZF9zZXRfbGVfYml0IChpLCBiaS0+YmgtPmJfZGF0YSkpIHsKKwkJICAgIC8qIGJpdCB3YXMgc2V0IGJ5IGFub3RoZXIgcHJvY2VzcworCQkgICAgICogd2hpbGUgd2Ugc2xlcHQgaW4gcHJlcGFyZV9mb3Jfam91cm5hbCgpICovCisJCSAgICBQUk9DX0lORk9fSU5DKCBzLCBzY2FuX2JpdG1hcC5zdG9sZW4gKTsKKwkJICAgIGlmIChpID49ICpiZWcgKyBtaW4pCXsgLyogd2UgY2FuIGNvbnRpbnVlIHdpdGggc21hbGxlciBzZXQgb2YgYWxsb2NhdGVkIGJsb2NrcywKKwkJCQkJICAgKiBpZiBsZW5ndGggb2YgdGhpcyBzZXQgaXMgbW9yZSBvciBlcXVhbCB0byBgbWluJyAqLworCQkJZW5kID0gaTsKKwkJCWJyZWFrOworCQkgICAgfQorCQkgICAgLyogb3RoZXJ3aXNlIHdlIGNsZWFyIGFsbCBiaXQgd2VyZSBzZXQgLi4uICovCisJCSAgICB3aGlsZSAoLS1pID49ICpiZWcpCisJCQlyZWlzZXJmc190ZXN0X2FuZF9jbGVhcl9sZV9iaXQgKGksIGJpLT5iaC0+Yl9kYXRhKTsKKwkJICAgIHJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyIChzLCBiaS0+YmgpOworCQkgICAgKmJlZyA9IG9yZzsKKwkJICAgIC8qIC4uLiBhbmQgc2VhcmNoIGFnYWluIGluIGN1cnJlbnQgYmxvY2sgZnJvbSBiZWdpbm5pbmcgKi8KKwkJICAgIGdvdG8gY29udDsJCisJCX0KKwkgICAgfQorCSAgICBiaS0+ZnJlZV9jb3VudCAtPSAoZW5kIC0gKmJlZyk7CisJICAgIGpvdXJuYWxfbWFya19kaXJ0eSAodGgsIHMsIGJpLT5iaCk7CisKKwkgICAgLyogZnJlZSBibG9jayBjb3VudCBjYWxjdWxhdGlvbiAqLworCSAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsIChzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSwgMSk7CisJICAgIFBVVF9TQl9GUkVFX0JMT0NLUyhzLCBTQl9GUkVFX0JMT0NLUyhzKSAtIChlbmQgLSAqYmVnKSk7CisJICAgIGpvdXJuYWxfbWFya19kaXJ0eSAodGgsIHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpKTsKKworCSAgICByZXR1cm4gZW5kIC0gKCpiZWcpOworCX0gZWxzZSB7CisJICAgICpiZWcgPSBuZXh0OworCX0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgYm1hcF9oYXNoX2lkKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdTMyIGlkKSB7CisgICAgY2hhciAqIGhhc2hfaW4gPSBOVUxMOworICAgIHVuc2lnbmVkIGxvbmcgaGFzaDsKKyAgICB1bnNpZ25lZCBibTsKKworICAgIGlmIChpZCA8PSAyKSB7CisJYm0gPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGhhc2hfaW4gPSAoY2hhciAqKSgmaWQpOworICAgICAgICBoYXNoID0ga2V5ZWRfaGFzaChoYXNoX2luLCA0KTsKKwlibSA9IGhhc2ggJSBTQl9CTUFQX05SKHMpOworCWlmICghYm0pCisJICAgIGJtID0gMTsKKyAgICB9CisgICAgLyogdGhpcyBjYW4gb25seSBiZSB0cnVlIHdoZW4gU0JfQk1BUF9OUiA9IDEgKi8KKyAgICBpZiAoYm0gPj0gU0JfQk1BUF9OUihzKSkKKyAgICAJYm0gPSAwOworICAgIHJldHVybiBibTsKK30KKworLyoKKyAqIGhhc2hlcyB0aGUgaWQgYW5kIHRoZW4gcmV0dXJucyA+IDAgaWYgdGhlIGJsb2NrIGdyb3VwIGZvciB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgaGFzaCBpcyBmdWxsCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGJsb2NrX2dyb3VwX3VzZWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB1MzIgaWQpIHsKKyAgICBpbnQgYm07CisgICAgYm0gPSBibWFwX2hhc2hfaWQocywgaWQpOworICAgIGlmIChTQl9BUF9CSVRNQVAocylbYm1dLmZyZWVfY291bnQgPiAoKHMtPnNfYmxvY2tzaXplIDw8IDMpICogNjAgLyAxMDApICkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKKy8qCisgKiB0aGUgcGFja2luZyBpcyByZXR1cm5lZCBpbiBkaXNrIGJ5dGUgb3JkZXIKKyAqLwordTMyIHJlaXNlcmZzX2Nob29zZV9wYWNraW5nKHN0cnVjdCBpbm9kZSAqZGlyKSB7CisgICAgdTMyIHBhY2tpbmc7CisgICAgaWYgKFRFU1RfT1BUSU9OKHBhY2tpbmdfZ3JvdXBzLCBkaXItPmlfc2IpKSB7CisJdTMyIHBhcmVudF9kaXIgPSBsZTMyX3RvX2NwdShJTk9ERV9QS0VZKGRpciktPmtfZGlyX2lkKTsKKwkvKgorCSAqIHNvbWUgdmVyc2lvbnMgb2YgcmVpc2VyZnNjayBleHBlY3QgcGFja2luZyBsb2NhbGl0eSAxIHRvIGJlCisJICogc3BlY2lhbAorCSAqLworCWlmIChwYXJlbnRfZGlyID09IDEgfHwgYmxvY2tfZ3JvdXBfdXNlZChkaXItPmlfc2IscGFyZW50X2RpcikpCisgICAgICAgICAgICBwYWNraW5nID0gSU5PREVfUEtFWShkaXIpLT5rX29iamVjdGlkOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwYWNraW5nID0gSU5PREVfUEtFWShkaXIpLT5rX2Rpcl9pZDsKKyAgICB9IGVsc2UKKyAgICAgICAgcGFja2luZyA9IElOT0RFX1BLRVkoZGlyKS0+a19vYmplY3RpZDsKKyAgICByZXR1cm4gcGFja2luZzsKK30KKyAgCisvKiBUcmllcyB0byBmaW5kIGNvbnRpZ3VvdXMgemVybyBiaXQgd2luZG93IChnaXZlbiBzaXplKSBpbiBnaXZlbiByZWdpb24gb2YKKyAqIGJpdG1hcCBhbmQgcGxhY2UgbmV3IGJsb2NrcyB0aGVyZS4gUmV0dXJucyBudW1iZXIgb2YgYWxsb2NhdGVkIGJsb2Nrcy4gKi8KK3N0YXRpYyBpbnQgc2Nhbl9iaXRtYXAgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJYl9ibG9ja25yX3QgKnN0YXJ0LCBiX2Jsb2NrbnJfdCBmaW5pc2gsCisJCQlpbnQgbWluLCBpbnQgbWF4LCBpbnQgdW5mbSwgdW5zaWduZWQgbG9uZyBmaWxlX2Jsb2NrKQoreworICAgIGludCBucl9hbGxvY2F0ZWQ9MDsKKyAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzID0gdGgtPnRfc3VwZXI7CisgICAgLyogZmluZCBldmVyeSBibSBhbmQgYm1hcCBhbmQgYm1hcF9uciBpbiB0aGlzIGZpbGUsIGFuZCBjaGFuZ2UgdGhlbSBhbGwgdG8gYml0bWFwX2Jsb2NrbnIKKyAgICAgKiAtIEhhbnMsIGl0IGlzIG5vdCBhIGJsb2NrIG51bWJlciAtIFphbS4gKi8KKworICAgIGludCBibSwgb2ZmOworICAgIGludCBlbmRfYm0sIGVuZF9vZmY7CisgICAgaW50IG9mZl9tYXggPSBzLT5zX2Jsb2Nrc2l6ZSA8PCAzOworCisgICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCisgICAgUFJPQ19JTkZPX0lOQyggcywgc2Nhbl9iaXRtYXAuY2FsbCApOyAKKyAgICBpZiAoIFNCX0ZSRUVfQkxPQ0tTKHMpIDw9IDApCisJcmV0dXJuIDA7IC8vIE5vIHBvaW50IGluIGxvb2tpbmcgZm9yIG1vcmUgZnJlZSBibG9ja3MKKworICAgIGdldF9iaXRfYWRkcmVzcyAocywgKnN0YXJ0LCAmYm0sICZvZmYpOworICAgIGdldF9iaXRfYWRkcmVzcyAocywgZmluaXNoLCAmZW5kX2JtLCAmZW5kX29mZik7CisgICAgaWYgKGJtID4gU0JfQk1BUF9OUihzKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKGVuZF9ibSA+IFNCX0JNQVBfTlIocykpCisgICAgICAgIGVuZF9ibSA9IFNCX0JNQVBfTlIocyk7CisKKyAgICAvKiBXaGVuIHRoZSBiaXRtYXAgaXMgbW9yZSB0aGFuIDEwJSBmcmVlLCBhbnlvbmUgY2FuIGFsbG9jYXRlLgorICAgICAqIFdoZW4gaXQncyBsZXNzIHRoYW4gMTAlIGZyZWUsIG9ubHkgZmlsZXMgdGhhdCBhbHJlYWR5IHVzZSB0aGUKKyAgICAgKiBiaXRtYXAgYXJlIGFsbG93ZWQuIE9uY2Ugd2UgcGFzcyA4MCUgZnVsbCwgdGhpcyByZXN0cmljdGlvbgorICAgICAqIGlzIGxpZnRlZC4KKyAgICAgKgorICAgICAqIFdlIGRvIHRoaXMgc28gdGhhdCBmaWxlcyB0aGF0IGdyb3cgbGF0ZXIgc3RpbGwgaGF2ZSBzcGFjZSBjbG9zZSB0bworICAgICAqIHRoZWlyIG9yaWdpbmFsIGFsbG9jYXRpb24uIFRoaXMgaW1wcm92ZXMgbG9jYWxpdHksIGFuZCBwcmVzdW1hYmx5CisgICAgICogcGVyZm9ybWFuY2UgYXMgYSByZXN1bHQuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIG9ubHkgYW4gYWxsb2NhdGlvbiBwb2xpY3kgYW5kIGRvZXMgbm90IG1ha2UgdXAgZm9yIGdldHRpbmcgYQorICAgICAqIGJhZCBoaW50LiBEZWNlbnQgaGludGluZyBtdXN0IGJlIGltcGxlbWVudGVkIGZvciB0aGlzIHRvIHdvcmsgd2VsbC4KKyAgICAgKi8KKyAgICBpZiAoIFRFU1RfT1BUSU9OKHNraXBfYnVzeSwgcykgJiYgU0JfRlJFRV9CTE9DS1MocykgPiBTQl9CTE9DS19DT1VOVChzKS8yMCApIHsKKwlmb3IgKDtibSA8IGVuZF9ibTsgYm0rKywgb2ZmID0gMCkgeworCSAgICBpZiAoICggb2ZmICYmICghdW5mbSB8fCAoZmlsZV9ibG9jayAhPSAwKSkpIHx8IFNCX0FQX0JJVE1BUChzKVtibV0uZnJlZV9jb3VudCA+IChzLT5zX2Jsb2Nrc2l6ZSA8PCAzKSAvIDEwICkKKwkJbnJfYWxsb2NhdGVkID0gc2Nhbl9iaXRtYXBfYmxvY2sodGgsIGJtLCAmb2ZmLCBvZmZfbWF4LCBtaW4sIG1heCwgdW5mbSk7CisJICAgIGlmIChucl9hbGxvY2F0ZWQpCisJCWdvdG8gcmV0OworICAgICAgICB9CisJLyogd2Uga25vdyBmcm9tIGFib3ZlIHRoYXQgc3RhcnQgaXMgYSByZWFzb25hYmxlIG51bWJlciAqLworCWdldF9iaXRfYWRkcmVzcyAocywgKnN0YXJ0LCAmYm0sICZvZmYpOworICAgIH0KKworICAgIGZvciAoO2JtIDwgZW5kX2JtOyBibSsrLCBvZmYgPSAwKSB7CisJbnJfYWxsb2NhdGVkID0gc2Nhbl9iaXRtYXBfYmxvY2sodGgsIGJtLCAmb2ZmLCBvZmZfbWF4LCBtaW4sIG1heCwgdW5mbSk7CisJaWYgKG5yX2FsbG9jYXRlZCkKKwkgICAgZ290byByZXQ7CisgICAgfQorCisgICAgbnJfYWxsb2NhdGVkID0gc2Nhbl9iaXRtYXBfYmxvY2sodGgsIGJtLCAmb2ZmLCBlbmRfb2ZmICsgMSwgbWluLCBtYXgsIHVuZm0pOworICAKKyByZXQ6CisgICAgKnN0YXJ0ID0gYm0gKiBvZmZfbWF4ICsgb2ZmOworICAgIHJldHVybiBucl9hbGxvY2F0ZWQ7CisKK30KKworc3RhdGljIHZvaWQgX3JlaXNlcmZzX2ZyZWVfYmxvY2sgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLAorCQkJCSAgc3RydWN0IGlub2RlICppbm9kZSwgYl9ibG9ja25yX3QgYmxvY2ssCisJCQkJICBpbnQgZm9yX3VuZm9ybWF0dGVkKQoreworICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqIHMgPSB0aC0+dF9zdXBlcjsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiByczsKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzYmg7CisgICAgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9pbmZvICphcGJpOworICAgIGludCBuciwgb2Zmc2V0OworCisgICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCisgICAgUFJPQ19JTkZPX0lOQyggcywgZnJlZV9ibG9jayApOworCisgICAgcnMgPSBTQl9ESVNLX1NVUEVSX0JMT0NLIChzKTsKKyAgICBzYmggPSBTQl9CVUZGRVJfV0lUSF9TQiAocyk7CisgICAgYXBiaSA9IFNCX0FQX0JJVE1BUChzKTsKKworICAgIGdldF9iaXRfYWRkcmVzcyAocywgYmxvY2ssICZuciwgJm9mZnNldCk7CisKKyAgICBpZiAobnIgPj0gc2JfYm1hcF9uciAocnMpKSB7CisJcmVpc2VyZnNfd2FybmluZyAocywgInZzLTQwNzU6IHJlaXNlcmZzX2ZyZWVfYmxvY2s6ICIKKwkJCSAgImJsb2NrICVsdSBpcyBvdXQgb2YgcmFuZ2Ugb24gJXMiLAorCQkJICBibG9jaywgcmVpc2VyZnNfYmRldm5hbWUgKHMpKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBhcGJpW25yXS5iaCwgMSApIDsKKworICAgIC8qIGNsZWFyIGJpdCBmb3IgdGhlIGdpdmVuIGJsb2NrIGluIGJpdCBtYXAgKi8KKyAgICBpZiAoIXJlaXNlcmZzX3Rlc3RfYW5kX2NsZWFyX2xlX2JpdCAob2Zmc2V0LCBhcGJpW25yXS5iaC0+Yl9kYXRhKSkgeworCXJlaXNlcmZzX3dhcm5pbmcgKHMsICJ2cy00MDgwOiByZWlzZXJmc19mcmVlX2Jsb2NrOiAiCisJCQkgICJmcmVlX2Jsb2NrICglczolbHUpW2RldjpibG9ja25yXTogYml0IGFscmVhZHkgY2xlYXJlZCIsCisJCQkgIHJlaXNlcmZzX2JkZXZuYW1lIChzKSwgYmxvY2spOworICAgIH0KKyAgICBhcGJpW25yXS5mcmVlX2NvdW50ICsrOworICAgIGpvdXJuYWxfbWFya19kaXJ0eSAodGgsIHMsIGFwYmlbbnJdLmJoKTsKKworICAgIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgc2JoLCAxKSA7CisgICAgLyogdXBkYXRlIHN1cGVyIGJsb2NrICovCisgICAgc2V0X3NiX2ZyZWVfYmxvY2tzKCBycywgc2JfZnJlZV9ibG9ja3MocnMpICsgMSApOworCisgICAgam91cm5hbF9tYXJrX2RpcnR5ICh0aCwgcywgc2JoKTsKKyAgICBpZiAoZm9yX3VuZm9ybWF0dGVkKQorICAgICAgICBEUVVPVF9GUkVFX0JMT0NLX05PRElSVFkoaW5vZGUsIDEpOworfQorCit2b2lkIHJlaXNlcmZzX2ZyZWVfYmxvY2sgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCAKKwkJCSAgc3RydWN0IGlub2RlICppbm9kZSwgYl9ibG9ja25yX3QgYmxvY2ssCisJCQkgIGludCBmb3JfdW5mb3JtYXR0ZWQpCit7CisgICAgc3RydWN0IHN1cGVyX2Jsb2NrICogcyA9IHRoLT50X3N1cGVyOworCisgICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCisgICAgUkZBTFNFKCFzLCAidnMtNDA2MTogdHJ5aW5nIHRvIGZyZWUgYmxvY2sgb24gbm9uZXhpc3RlbnQgZGV2aWNlIik7CisgICAgUkZBTFNFKGlzX3JldXNhYmxlIChzLCBibG9jaywgMSkgPT0gMCwgInZzLTQwNzE6IGNhbiBub3QgZnJlZSBzdWNoIGJsb2NrIik7CisgICAgLyogbWFyayBpdCBiZWZvcmUgd2UgY2xlYXIgaXQsIGp1c3QgaW4gY2FzZSAqLworICAgIGpvdXJuYWxfbWFya19mcmVlZCh0aCwgcywgYmxvY2spIDsKKyAgICBfcmVpc2VyZnNfZnJlZV9ibG9jayh0aCwgaW5vZGUsIGJsb2NrLCBmb3JfdW5mb3JtYXR0ZWQpIDsKK30KKworLyogcHJlYWxsb2NhdGVkIGJsb2NrcyBkb24ndCBuZWVkIHRvIGJlIHJ1biB0aHJvdWdoIGpvdXJuYWxfbWFya19mcmVlZCAqLworc3RhdGljIHZvaWQgcmVpc2VyZnNfZnJlZV9wcmVhbGxvY19ibG9jayAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIGJfYmxvY2tucl90IGJsb2NrKSB7CisgICAgUkZBTFNFKCF0aC0+dF9zdXBlciwgInZzLTQwNjA6IHRyeWluZyB0byBmcmVlIGJsb2NrIG9uIG5vbmV4aXN0ZW50IGRldmljZSIpOworICAgIFJGQUxTRShpc19yZXVzYWJsZSAodGgtPnRfc3VwZXIsIGJsb2NrLCAxKSA9PSAwLCAidnMtNDA3MDogY2FuIG5vdCBmcmVlIHN1Y2ggYmxvY2siKTsKKyAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisgICAgX3JlaXNlcmZzX2ZyZWVfYmxvY2sodGgsIGlub2RlLCBibG9jaywgMSkgOworfQorCitzdGF0aWMgdm9pZCBfX2Rpc2NhcmRfcHJlYWxsb2MgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiB0aCwKKwkJCQlzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbyAqZWkpCit7CisgICAgdW5zaWduZWQgbG9uZyBzYXZlID0gZWktPmlfcHJlYWxsb2NfYmxvY2sgOworICAgIGludCBkaXJ0eSA9IDA7CisgICAgc3RydWN0IGlub2RlICppbm9kZSA9ICZlaS0+dmZzX2lub2RlOworICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKyAgICBpZiAoZWktPmlfcHJlYWxsb2NfY291bnQgPCAwKQorCXJlaXNlcmZzX3dhcm5pbmcgKHRoLT50X3N1cGVyLCAiemFtLTQwMDE6JXM6IGlub2RlIGhhcyBuZWdhdGl2ZSBwcmVhbGxvYyBibG9ja3MgY291bnQuIiwgX19GVU5DVElPTl9fICk7CisjZW5kaWYKKyAgICB3aGlsZSAoZWktPmlfcHJlYWxsb2NfY291bnQgPiAwKSB7CisJcmVpc2VyZnNfZnJlZV9wcmVhbGxvY19ibG9jayh0aCwgaW5vZGUsIGVpLT5pX3ByZWFsbG9jX2Jsb2NrKTsKKwllaS0+aV9wcmVhbGxvY19ibG9jaysrOworCWVpLT5pX3ByZWFsbG9jX2NvdW50IC0tOworCWRpcnR5ID0gMTsKKyAgICB9CisgICAgaWYgKGRpcnR5KQorICAgIAlyZWlzZXJmc191cGRhdGVfc2QodGgsIGlub2RlKTsKKyAgICBlaS0+aV9wcmVhbGxvY19ibG9jayA9IHNhdmU7CisgICAgbGlzdF9kZWxfaW5pdCgmKGVpLT5pX3ByZWFsbG9jX2xpc3QpKTsKK30KKworLyogRklYTUU6IEl0IHNob3VsZCBiZSBpbmxpbmUgZnVuY3Rpb24gKi8KK3ZvaWQgcmVpc2VyZnNfZGlzY2FyZF9wcmVhbGxvYyAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIAorCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisgICAgc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKmVpID0gUkVJU0VSRlNfSShpbm9kZSk7CisgICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworICAgIGlmIChlaS0+aV9wcmVhbGxvY19jb3VudCkKKwlfX2Rpc2NhcmRfcHJlYWxsb2ModGgsIGVpKTsKK30KKwordm9pZCByZWlzZXJmc19kaXNjYXJkX2FsbF9wcmVhbGxvYyAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgpCit7CisgICAgc3RydWN0IGxpc3RfaGVhZCAqIHBsaXN0ID0gJlNCX0pPVVJOQUwodGgtPnRfc3VwZXIpLT5qX3ByZWFsbG9jX2xpc3Q7CisKKyAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisKKyAgICB3aGlsZSAoIWxpc3RfZW1wdHkocGxpc3QpKSB7CisJc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKmVpOworCWVpID0gbGlzdF9lbnRyeShwbGlzdC0+bmV4dCwgc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8sIGlfcHJlYWxsb2NfbGlzdCk7CisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisJaWYgKCFlaS0+aV9wcmVhbGxvY19jb3VudCkgeworCSAgICByZWlzZXJmc193YXJuaW5nICh0aC0+dF9zdXBlciwgInphbS00MDAxOiVzOiBpbm9kZSBpcyBpbiBwcmVhbGxvYyBsaXN0IGJ1dCBoYXMgbm8gcHJlYWxsb2NhdGVkIGJsb2Nrcy4iLCBfX0ZVTkNUSU9OX18pOworCX0KKyNlbmRpZgorCV9fZGlzY2FyZF9wcmVhbGxvYyh0aCwgZWkpOworICAgIH0KK30KKwordm9pZCByZWlzZXJmc19pbml0X2FsbG9jX29wdGlvbnMgKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKK3sKKyAgICBzZXRfYml0IChfQUxMT0Nfc2tpcF9idXN5LCAmU0JfQUxMT0NfT1BUUyhzKSk7CisgICAgc2V0X2JpdCAoX0FMTE9DX2RpcmlkX2dyb3VwcywgJlNCX0FMTE9DX09QVFMocykpOworICAgIHNldF9iaXQgKF9BTExPQ19wYWNraW5nX2dyb3VwcywgJlNCX0FMTE9DX09QVFMocykpOworfQorCisvKiBibG9jayBhbGxvY2F0b3IgcmVsYXRlZCBvcHRpb25zIGFyZSBwYXJzZWQgaGVyZSAqLworaW50IHJlaXNlcmZzX3BhcnNlX2FsbG9jX29wdGlvbnMoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgY2hhciAqIG9wdGlvbnMpCit7CisgICAgY2hhciAqIHRoaXNfY2hhciwgKiB2YWx1ZTsKKworICAgIFJFSVNFUkZTX1NCKHMpLT5zX2FsbG9jX29wdGlvbnMuYml0cyA9IDA7IC8qIGNsZWFyIGRlZmF1bHQgc2V0dGluZ3MgKi8KKworICAgIHdoaWxlICggKHRoaXNfY2hhciA9IHN0cnNlcCAoJm9wdGlvbnMsICI6IikpICE9IE5VTEwgKSB7CisJaWYgKCh2YWx1ZSA9IHN0cmNociAodGhpc19jaGFyLCAnPScpKSAhPSBOVUxMKQorCSAgICAqdmFsdWUrKyA9IDA7CisKKwlpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJjb25jZW50cmF0aW5nX2Zvcm1hdHRlZF9ub2RlcyIpKSB7CisJICAgIGludCB0ZW1wOworCSAgICBTRVRfT1BUSU9OKGNvbmNlbnRyYXRpbmdfZm9ybWF0dGVkX25vZGVzKTsKKwkgICAgdGVtcCA9ICh2YWx1ZSAmJiAqdmFsdWUpID8gc2ltcGxlX3N0cnRvdWwgKHZhbHVlLCAmdmFsdWUsIDApIDogMTA7CisJICAgIGlmICh0ZW1wIDw9IDAgfHwgdGVtcCA+IDEwMCkgeworCQlSRUlTRVJGU19TQihzKS0+c19hbGxvY19vcHRpb25zLmJvcmRlciA9IDEwOworCSAgICB9IGVsc2UgeworCQlSRUlTRVJGU19TQihzKS0+c19hbGxvY19vcHRpb25zLmJvcmRlciA9IDEwMCAvIHRlbXA7CisJICAgfQorCSAgICBjb250aW51ZTsKKwl9CisJaWYgKCFzdHJjbXAodGhpc19jaGFyLCAiZGlzcGxhY2luZ19sYXJnZV9maWxlcyIpKSB7CisJICAgIFNFVF9PUFRJT04oZGlzcGxhY2luZ19sYXJnZV9maWxlcyk7CisJICAgIFJFSVNFUkZTX1NCKHMpLT5zX2FsbG9jX29wdGlvbnMubGFyZ2VfZmlsZV9zaXplID0KKwkJKHZhbHVlICYmICp2YWx1ZSkgPyBzaW1wbGVfc3RydG91bCAodmFsdWUsICZ2YWx1ZSwgMCkgOiAxNjsKKwkgICAgY29udGludWU7CisJfQorCWlmICghc3RyY21wKHRoaXNfY2hhciwgImRpc3BsYWNpbmdfbmV3X3BhY2tpbmdfbG9jYWxpdGllcyIpKSB7CisJICAgIFNFVF9PUFRJT04oZGlzcGxhY2luZ19uZXdfcGFja2luZ19sb2NhbGl0aWVzKTsKKwkgICAgY29udGludWU7CisJfTsKKworCWlmICghc3RyY21wKHRoaXNfY2hhciwgIm9sZF9oYXNoZWRfcmVsb2NhdGlvbiIpKSB7CisJICAgIFNFVF9PUFRJT04ob2xkX2hhc2hlZF9yZWxvY2F0aW9uKTsKKwkgICAgY29udGludWU7CisJfQorCisJaWYgKCFzdHJjbXAodGhpc19jaGFyLCAibmV3X2hhc2hlZF9yZWxvY2F0aW9uIikpIHsKKwkgICAgU0VUX09QVElPTihuZXdfaGFzaGVkX3JlbG9jYXRpb24pOworCSAgICBjb250aW51ZTsKKwl9CisKKyAgICAgICAgaWYgKCFzdHJjbXAodGhpc19jaGFyLCAiZGlyaWRfZ3JvdXBzIikpIHsKKwkgICAgU0VUX09QVElPTihkaXJpZF9ncm91cHMpOworCSAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJvaWRfZ3JvdXBzIikpIHsKKwkgICAgU0VUX09QVElPTihvaWRfZ3JvdXBzKTsKKwkgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzdHJjbXAodGhpc19jaGFyLCAicGFja2luZ19ncm91cHMiKSkgeworCSAgICBTRVRfT1BUSU9OKHBhY2tpbmdfZ3JvdXBzKTsKKwkgICAgY29udGludWU7CisgICAgICAgIH0KKwlpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJoYXNoZWRfZm9ybWF0dGVkX25vZGVzIikpIHsKKwkgICAgU0VUX09QVElPTihoYXNoZWRfZm9ybWF0dGVkX25vZGVzKTsKKwkgICAgY29udGludWU7CisJfQorCisJaWYgKCFzdHJjbXAodGhpc19jaGFyLCAic2tpcF9idXN5IikpIHsKKwkgICAgU0VUX09QVElPTihza2lwX2J1c3kpOworCSAgICBjb250aW51ZTsKKwl9CisKKwlpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJodW5kcmVkdGhfc2xpY2VzIikpIHsKKwkgICAgU0VUX09QVElPTihodW5kcmVkdGhfc2xpY2VzKTsKKwkgICAgY29udGludWU7CisJfQorCisJaWYgKCFzdHJjbXAodGhpc19jaGFyLCAib2xkX3dheSIpKSB7CisJICAgIFNFVF9PUFRJT04ob2xkX3dheSk7CisJICAgIGNvbnRpbnVlOworCX0KKworCWlmICghc3RyY21wKHRoaXNfY2hhciwgImRpc3BsYWNlX2Jhc2VkX29uX2RpcmlkIikpIHsKKwkgICAgU0VUX09QVElPTihkaXNwbGFjZV9iYXNlZF9vbl9kaXJpZCk7CisJICAgIGNvbnRpbnVlOworCX0KKworCWlmICghc3RyY21wKHRoaXNfY2hhciwgInByZWFsbG9jbWluIikpIHsKKwkgICAgUkVJU0VSRlNfU0IocyktPnNfYWxsb2Nfb3B0aW9ucy5wcmVhbGxvY21pbiA9CisJCSh2YWx1ZSAmJiAqdmFsdWUpID8gc2ltcGxlX3N0cnRvdWwgKHZhbHVlLCAmdmFsdWUsIDApIDogNDsKKwkgICAgY29udGludWU7CisJfQorCisJaWYgKCFzdHJjbXAodGhpc19jaGFyLCAicHJlYWxsb2NzaXplIikpIHsKKwkgICAgUkVJU0VSRlNfU0IocyktPnNfYWxsb2Nfb3B0aW9ucy5wcmVhbGxvY3NpemUgPQorCQkodmFsdWUgJiYgKnZhbHVlKSA/IHNpbXBsZV9zdHJ0b3VsICh2YWx1ZSwgJnZhbHVlLCAwKSA6IFBSRUFMTE9DQVRJT05fU0laRTsKKwkgICAgY29udGludWU7CisJfQorCisJcmVpc2VyZnNfd2FybmluZyAocywgInphbS00MDAxOiAlcyA6IHVua25vd24gb3B0aW9uIC0gJXMiLAorCQkJICBfX0ZVTkNUSU9OX18gLCB0aGlzX2NoYXIpOworCXJldHVybiAxOworICAgICAgfQorICAKKyAgICByZWlzZXJmc193YXJuaW5nIChzLCAiYWxsb2NhdG9yIG9wdGlvbnMgPSBbJTA4eF1cbiIsIFNCX0FMTE9DX09QVFMocykpOworICAgIHJldHVybiAwOworfQorICAKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZXdfaGFzaGVkX3JlbG9jYXRpb24gKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICogaGludCkKK3sKKyAgICBjaGFyICogaGFzaF9pbjsKKyAgICBpZiAoaGludC0+Zm9ybWF0dGVkX25vZGUpIHsKKwkgICAgaGFzaF9pbiA9IChjaGFyKikmaGludC0+a2V5LmtfZGlyX2lkOworICAgIH0gZWxzZSB7CisJaWYgKCFoaW50LT5pbm9kZSkgeworCSAgICAvL2hpbnQtPnNlYXJjaF9zdGFydCA9IGhpbnQtPmJlZzsKKwkgICAgaGFzaF9pbiA9IChjaGFyKikmaGludC0+a2V5LmtfZGlyX2lkOworCX0gZWxzZSAKKwkgICAgaWYgKCBURVNUX09QVElPTihkaXNwbGFjZV9iYXNlZF9vbl9kaXJpZCwgaGludC0+dGgtPnRfc3VwZXIpKQorCQloYXNoX2luID0gKGNoYXIgKikoJklOT0RFX1BLRVkoaGludC0+aW5vZGUpLT5rX2Rpcl9pZCk7CisJICAgIGVsc2UKKwkJaGFzaF9pbiA9IChjaGFyICopKCZJTk9ERV9QS0VZKGhpbnQtPmlub2RlKS0+a19vYmplY3RpZCk7CisgICAgICB9CisKKyAgICBoaW50LT5zZWFyY2hfc3RhcnQgPSBoaW50LT5iZWcgKyBrZXllZF9oYXNoKGhhc2hfaW4sIDQpICUgKGhpbnQtPmVuZCAtIGhpbnQtPmJlZyk7Cit9CisKKy8qCisgKiBSZWxvY2F0aW9uIGJhc2VkIG9uIGRpcmlkLCBoYXNoaW5nIHRoZW0gaW50byBhIGdpdmVuIGJpdG1hcCBibG9jaworICogZmlsZXMuIEZvcm1hdHRlZCBub2RlcyBhcmUgdW5hZmZlY3RlZCwgYSBzZXBlcmF0ZSBwb2xpY3kgY292ZXJzIHRoZW0KKyAqLworc3RhdGljIHZvaWQKK2RpcmlkX2dyb3VwcyAocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKmhpbnQpCit7CisgICAgdW5zaWduZWQgbG9uZyBoYXNoOworICAgIF9fdTMyIGRpcmlkID0gMDsKKyAgICBpbnQgYm0gPSAwOworICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBoaW50LT50aC0+dF9zdXBlcjsKKyAgICBpZiAoaGludC0+aW5vZGUpCisJZGlyaWQgPSBsZTMyX3RvX2NwdShJTk9ERV9QS0VZKGhpbnQtPmlub2RlKS0+a19kaXJfaWQpOworICAgIGVsc2UgaWYgKGhpbnQtPmZvcm1hdHRlZF9ub2RlKQorICAgICAgICBkaXJpZCA9IGhpbnQtPmtleS5rX2Rpcl9pZDsKKworICAgIGlmIChkaXJpZCkgeworCWJtID0gYm1hcF9oYXNoX2lkKHNiLCBkaXJpZCk7CisJaGFzaCA9IGJtICogKHNiLT5zX2Jsb2Nrc2l6ZSA8PCAzKTsKKwkvKiBnaXZlIGEgcG9ydGlvbiBvZiB0aGUgYmxvY2sgZ3JvdXAgdG8gbWV0YWRhdGEgKi8KKwlpZiAoaGludC0+aW5vZGUpCisJICAgIGhhc2ggKz0gc2ItPnNfYmxvY2tzaXplLzI7CisJaGludC0+c2VhcmNoX3N0YXJ0ID0gaGFzaDsKKyAgICB9Cit9CisKKy8qCisgKiBSZWxvY2F0aW9uIGJhc2VkIG9uIG9pZCwgaGFzaGluZyB0aGVtIGludG8gYSBnaXZlbiBiaXRtYXAgYmxvY2sKKyAqIGZpbGVzLiBGb3JtYXR0ZWQgbm9kZXMgYXJlIHVuYWZmZWN0ZWQsIGEgc2VwZXJhdGUgcG9saWN5IGNvdmVycyB0aGVtCisgKi8KK3N0YXRpYyB2b2lkCitvaWRfZ3JvdXBzIChyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqaGludCkKK3sKKyAgICBpZiAoaGludC0+aW5vZGUpIHsKKwl1bnNpZ25lZCBsb25nIGhhc2g7CisJX191MzIgb2lkOworCV9fdTMyIGRpcmlkOworCWludCBibTsKKworCWRpcmlkID0gbGUzMl90b19jcHUoSU5PREVfUEtFWShoaW50LT5pbm9kZSktPmtfZGlyX2lkKTsKKworCS8qIGtlZXAgdGhlIHJvb3QgZGlyIGFuZCBpdCdzIGZpcnN0IHNldCBvZiBzdWJkaXJzIGNsb3NlIHRvCisJICogdGhlIHN0YXJ0IG9mIHRoZSBkaXNrCisJICovCisJaWYgKGRpcmlkIDw9IDIpCisJICAgIGhhc2ggPSAoaGludC0+aW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIDw8IDMpOworCWVsc2UgeworCSAgICBvaWQgPSBsZTMyX3RvX2NwdShJTk9ERV9QS0VZKGhpbnQtPmlub2RlKS0+a19vYmplY3RpZCk7CisJICAgIGJtID0gYm1hcF9oYXNoX2lkKGhpbnQtPmlub2RlLT5pX3NiLCBvaWQpOworCSAgICBoYXNoID0gYm0gKiAoaGludC0+aW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIDw8IDMpOworCX0KKwloaW50LT5zZWFyY2hfc3RhcnQgPSBoYXNoOworICAgIH0KK30KKworLyogcmV0dXJucyAxIGlmIGl0IGZpbmRzIGFuIGluZGlyZWN0IGl0ZW0gYW5kIGdldHMgdmFsaWQgaGludCBpbmZvCisgKiBmcm9tIGl0LCBvdGhlcndpc2UgMAorICovCitzdGF0aWMgaW50IGdldF9sZWZ0X25laWdoYm9yKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICpoaW50KQoreworICAgIHN0cnVjdCBwYXRoICogcGF0aDsKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKyAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWg7CisgICAgaW50IHBvc19pbl9pdGVtOworICAgIF9fdTMyICogaXRlbTsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGlmICghaGludC0+cGF0aCkJCS8qIHJlaXNlcmZzIGNvZGUgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiB3L28gcG9pbnRlciB0byBwYXRoCisJCQkJICogc3RydWN0dXJlIHN1cHBsaWVkOyB0aGVuIHdlIHJlbHkgb24gc3VwcGxpZWQgc2VhcmNoX3N0YXJ0ICovCisJcmV0dXJuIDA7CisKKyAgICBwYXRoID0gaGludC0+cGF0aDsKKyAgICBiaCA9IGdldF9sYXN0X2JoKHBhdGgpOworICAgIFJGQUxTRSggIWJoLCAiZ3JlZW4tNDAwMjogSWxsZWdhbCBwYXRoIHNwZWNpZmllZCB0byBnZXRfbGVmdF9uZWlnaGJvciIpOworICAgIGloID0gZ2V0X2loKHBhdGgpOworICAgIHBvc19pbl9pdGVtID0gcGF0aC0+cG9zX2luX2l0ZW07CisgICAgaXRlbSA9IGdldF9pdGVtIChwYXRoKTsKKworICAgIGhpbnQtPnNlYXJjaF9zdGFydCA9IGJoLT5iX2Jsb2NrbnI7CisKKyAgICBpZiAoIWhpbnQtPmZvcm1hdHRlZF9ub2RlICYmIGlzX2luZGlyZWN0X2xlX2loIChpaCkpIHsKKwkvKiBmb3IgaW5kaXJlY3QgaXRlbTogZ28gdG8gbGVmdCBhbmQgbG9vayBmb3IgdGhlIGZpcnN0IG5vbi1ob2xlIGVudHJ5CisJICAgaW4gdGhlIGluZGlyZWN0IGl0ZW0gKi8KKwlpZiAocG9zX2luX2l0ZW0gPT0gSV9VTkZNX05VTSAoaWgpKQorCSAgICBwb3NfaW5faXRlbS0tOworLy8JICAgIHBvc19pbl9pdGVtID0gSV9VTkZNX05VTSAoaWgpIC0gMTsKKwl3aGlsZSAocG9zX2luX2l0ZW0gPj0gMCkgeworCSAgICBpbnQgdD1nZXRfYmxvY2tfbnVtKGl0ZW0scG9zX2luX2l0ZW0pOworCSAgICBpZiAodCkgeworCQloaW50LT5zZWFyY2hfc3RhcnQgPSB0OworCQlyZXQgPSAxOworCQlicmVhazsKKwkgICAgfQorCSAgICBwb3NfaW5faXRlbSAtLTsKKwl9CisgICAgfQorCisgICAgLyogZG9lcyByZXN1bHQgdmFsdWUgZml0IGludG8gc3BlY2lmaWVkIHJlZ2lvbj8gKi8KKyAgICByZXR1cm4gcmV0OworfQorCisvKiBzaG91bGQgYmUsIGlmIGZvcm1hdHRlZCBub2RlLCB0aGVuIHRyeSB0byBwdXQgb24gZmlyc3QgcGFydCBvZiB0aGUgZGV2aWNlCisgICBzcGVjaWZpZWQgYXMgbnVtYmVyIG9mIHBlcmNlbnQgd2l0aCBtb3VudCBvcHRpb24gZGV2aWNlLCBlbHNlIHRyeSB0byBwdXQKKyAgIG9uIGxhc3Qgb2YgZGV2aWNlLiAgVGhpcyBpcyBub3QgdG8gc2F5IGl0IGlzIGdvb2QgY29kZSB0byBkbyBzbywKKyAgIGJ1dCB0aGUgZWZmZWN0IHNob3VsZCBiZSBtZWFzdXJlZC4gICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2JvcmRlcl9pbl9oaW50KHN0cnVjdCBzdXBlcl9ibG9jayAqcywgcmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKmhpbnQpCit7CisgICAgYl9ibG9ja25yX3QgYm9yZGVyID0gU0JfQkxPQ0tfQ09VTlQocykgLyBSRUlTRVJGU19TQihzKS0+c19hbGxvY19vcHRpb25zLmJvcmRlcjsKKworICAgIGlmIChoaW50LT5mb3JtYXR0ZWRfbm9kZSkKKwloaW50LT5lbmQgPSBib3JkZXIgLSAxOworICAgIGVsc2UKKwloaW50LT5iZWcgPSBib3JkZXI7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkaXNwbGFjZV9sYXJnZV9maWxlKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICpoaW50KQoreworICAgIGlmICggVEVTVF9PUFRJT04oZGlzcGxhY2VfYmFzZWRfb25fZGlyaWQsIGhpbnQtPnRoLT50X3N1cGVyKSkKKwloaW50LT5zZWFyY2hfc3RhcnQgPSBoaW50LT5iZWcgKyBrZXllZF9oYXNoKChjaGFyICopKCZJTk9ERV9QS0VZKGhpbnQtPmlub2RlKS0+a19kaXJfaWQpLCA0KSAlIChoaW50LT5lbmQgLSBoaW50LT5iZWcpOworICAgIGVsc2UKKwloaW50LT5zZWFyY2hfc3RhcnQgPSBoaW50LT5iZWcgKyBrZXllZF9oYXNoKChjaGFyICopKCZJTk9ERV9QS0VZKGhpbnQtPmlub2RlKS0+a19vYmplY3RpZCksIDQpICUgKGhpbnQtPmVuZCAtIGhpbnQtPmJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoYXNoX2Zvcm1hdHRlZF9ub2RlKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICpoaW50KQoreworICAgY2hhciAqIGhhc2hfaW47CisKKyAgIGlmICghaGludC0+aW5vZGUpCisJaGFzaF9pbiA9IChjaGFyKikmaGludC0+a2V5LmtfZGlyX2lkOworICAgIGVsc2UgaWYgKCBURVNUX09QVElPTihkaXNwbGFjZV9iYXNlZF9vbl9kaXJpZCwgaGludC0+dGgtPnRfc3VwZXIpKQorCWhhc2hfaW4gPSAoY2hhciAqKSgmSU5PREVfUEtFWShoaW50LT5pbm9kZSktPmtfZGlyX2lkKTsKKyAgICBlbHNlCisJaGFzaF9pbiA9IChjaGFyICopKCZJTk9ERV9QS0VZKGhpbnQtPmlub2RlKS0+a19vYmplY3RpZCk7CisKKwloaW50LT5zZWFyY2hfc3RhcnQgPSBoaW50LT5iZWcgKyBrZXllZF9oYXNoKGhhc2hfaW4sIDQpICUgKGhpbnQtPmVuZCAtIGhpbnQtPmJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRoaXNfYmxvY2tucl9hbGxvY2F0aW9uX3dvdWxkX21ha2VfaXRfYV9sYXJnZV9maWxlKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICpoaW50KQoreworICAgIHJldHVybiBoaW50LT5ibG9jayA9PSBSRUlTRVJGU19TQihoaW50LT50aC0+dF9zdXBlciktPnNfYWxsb2Nfb3B0aW9ucy5sYXJnZV9maWxlX3NpemU7Cit9CisKKyNpZmRlZiBESVNQTEFDRV9ORVdfUEFDS0lOR19MT0NBTElUSUVTCitzdGF0aWMgaW5saW5lIHZvaWQgZGlzcGxhY2VfbmV3X3BhY2tpbmdfbG9jYWxpdHkgKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICpoaW50KQoreworICAgIHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXkgPSAmaGludC0+a2V5OworCisgICAgaGludC0+dGgtPmRpc3BsYWNlX25ld19ibG9ja3MgPSAwOworICAgIGhpbnQtPnNlYXJjaF9zdGFydCA9IGhpbnQtPmJlZyArIGtleWVkX2hhc2goKGNoYXIqKSgma2V5LT5rX29iamVjdGlkKSw0KSAlIChoaW50LT5lbmQgLSBoaW50LT5iZWcpOworfQorICAjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQgb2xkX2hhc2hlZF9yZWxvY2F0aW9uIChyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqIGhpbnQpCit7CisgICAgYl9ibG9ja25yX3QgYm9yZGVyOworICAgIHUzMiBoYXNoX2luOworICAgIAorICAgIGlmIChoaW50LT5mb3JtYXR0ZWRfbm9kZSB8fCBoaW50LT5pbm9kZSA9PSBOVUxMKSB7CisJcmV0dXJuIDA7CisgICAgICB9CisKKyAgICBoYXNoX2luID0gbGUzMl90b19jcHUoKElOT0RFX1BLRVkoaGludC0+aW5vZGUpKS0+a19kaXJfaWQpOworICAgIGJvcmRlciA9IGhpbnQtPmJlZyArICh1MzIpIGtleWVkX2hhc2goKChjaGFyICopICgmaGFzaF9pbikpLCA0KSAlIChoaW50LT5lbmQgLSBoaW50LT5iZWcgLSAxKTsKKyAgICBpZiAoYm9yZGVyID4gaGludC0+c2VhcmNoX3N0YXJ0KQorCWhpbnQtPnNlYXJjaF9zdGFydCA9IGJvcmRlcjsKKworICAgIHJldHVybiAxOworICB9CisgIAorc3RhdGljIGlubGluZSBpbnQgb2xkX3dheSAocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKiBoaW50KQoreworICAgIGJfYmxvY2tucl90IGJvcmRlcjsKKyAgICAKKyAgICBpZiAoaGludC0+Zm9ybWF0dGVkX25vZGUgfHwgaGludC0+aW5vZGUgPT0gTlVMTCkgeworCXJldHVybiAwOworICAgIH0KKyAgCisgICAgICBib3JkZXIgPSBoaW50LT5iZWcgKyBsZTMyX3RvX2NwdShJTk9ERV9QS0VZKGhpbnQtPmlub2RlKS0+a19kaXJfaWQpICUgKGhpbnQtPmVuZCAgLSBoaW50LT5iZWcpOworICAgIGlmIChib3JkZXIgPiBoaW50LT5zZWFyY2hfc3RhcnQpCisJaGludC0+c2VhcmNoX3N0YXJ0ID0gYm9yZGVyOworCisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBodW5kcmVkdGhfc2xpY2VzIChyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqIGhpbnQpCit7CisgICAgc3RydWN0IHJlaXNlcmZzX2tleSAqIGtleSA9ICZoaW50LT5rZXk7CisgICAgYl9ibG9ja25yX3Qgc2xpY2Vfc3RhcnQ7CisKKyAgICBzbGljZV9zdGFydCA9IChrZXllZF9oYXNoKChjaGFyKikoJmtleS0+a19kaXJfaWQpLDQpICUgMTAwKSAqIChoaW50LT5lbmQgLyAxMDApOworICAgIGlmICggc2xpY2Vfc3RhcnQgPiBoaW50LT5zZWFyY2hfc3RhcnQgfHwgc2xpY2Vfc3RhcnQgKyAoaGludC0+ZW5kIC8gMTAwKSA8PSBoaW50LT5zZWFyY2hfc3RhcnQpIHsKKwloaW50LT5zZWFyY2hfc3RhcnQgPSBzbGljZV9zdGFydDsKKyAgICB9Cit9CisgIAorc3RhdGljIHZvaWQgZGV0ZXJtaW5lX3NlYXJjaF9zdGFydChyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqaGludCwKKwkJCQkJICBpbnQgYW1vdW50X25lZWRlZCkKK3sKKyAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSBoaW50LT50aC0+dF9zdXBlcjsKKyAgICBpbnQgdW5mbV9oaW50OworCisgICAgaGludC0+YmVnID0gMDsKKyAgICBoaW50LT5lbmQgPSBTQl9CTE9DS19DT1VOVChzKSAtIDE7CisKKyAgICAvKiBUaGlzIGlzIGZvcm1lciBib3JkZXIgYWxnb3JpdGhtLiBOb3cgd2l0aCB0dW5hYmxlIGJvcmRlciBvZmZzZXQgKi8KKyAgICBpZiAoY29uY2VudHJhdGluZ19mb3JtYXR0ZWRfbm9kZXMocykpCisJc2V0X2JvcmRlcl9pbl9oaW50KHMsIGhpbnQpOworCisjaWZkZWYgRElTUExBQ0VfTkVXX1BBQ0tJTkdfTE9DQUxJVElFUworICAgIC8qIHdoZW5ldmVyIHdlIGNyZWF0ZSBhIG5ldyBkaXJlY3RvcnksIHdlIGRpc3BsYWNlIGl0LiAgQXQgZmlyc3Qgd2Ugd2lsbAorICAgICAgIGhhc2ggZm9yIGxvY2F0aW9uLCBsYXRlciB3ZSBtaWdodCBsb29rIGZvciBhIG1vZGVyYXRlbHkgZW1wdHkgcGxhY2UgZm9yCisgICAgICAgaXQgKi8KKyAgICBpZiAoZGlzcGxhY2luZ19uZXdfcGFja2luZ19sb2NhbGl0aWVzKHMpCisJJiYgaGludC0+dGgtPmRpc3BsYWNlX25ld19ibG9ja3MpIHsKKwlkaXNwbGFjZV9uZXdfcGFja2luZ19sb2NhbGl0eShoaW50KTsKKworCS8qIHdlIGRvIG5vdCBjb250aW51ZSBkZXRlcm1pbmVfc2VhcmNoX3N0YXJ0LAorCSAqIGlmIG5ldyBwYWNraW5nIGxvY2FsaXR5IGlzIGJlaW5nIGRpc3BsYWNlZCAqLworCXJldHVybjsKKyAgICB9CQkJCSAgICAgIAorI2VuZGlmCisgIAorICAgIC8qIGFsbCBwZXJzb25zIHNob3VsZCBmZWVsIGVuY291cmFnZWQgdG8gYWRkIG1vcmUgc3BlY2lhbCBjYXNlcyBoZXJlIGFuZAorICAgICAqIHRlc3QgdGhlbSAqLworCisgICAgaWYgKGRpc3BsYWNpbmdfbGFyZ2VfZmlsZXMocykgJiYgIWhpbnQtPmZvcm1hdHRlZF9ub2RlCisJJiYgdGhpc19ibG9ja25yX2FsbG9jYXRpb25fd291bGRfbWFrZV9pdF9hX2xhcmdlX2ZpbGUoaGludCkpIHsKKwlkaXNwbGFjZV9sYXJnZV9maWxlKGhpbnQpOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiBpZiBub25lIG9mIG91ciBzcGVjaWFsIGNhc2VzIGlzIHJlbGV2YW50LCB1c2UgdGhlIGxlZnQgbmVpZ2hib3IgaW4gdGhlCisgICAgICAgdHJlZSBvcmRlciBvZiB0aGUgbmV3IG5vZGUgd2UgYXJlIGFsbG9jYXRpbmcgZm9yICovCisgICAgaWYgKGhpbnQtPmZvcm1hdHRlZF9ub2RlICYmIFRFU1RfT1BUSU9OKGhhc2hlZF9mb3JtYXR0ZWRfbm9kZXMscykpIHsKKyAgICAgICAgaGFzaF9mb3JtYXR0ZWRfbm9kZShoaW50KTsKKwlyZXR1cm47CisgICAgfQorCisgICAgdW5mbV9oaW50ID0gZ2V0X2xlZnRfbmVpZ2hib3IoaGludCk7CisKKyAgICAvKiBNaW1pYyBvbGQgYmxvY2sgYWxsb2NhdG9yIGJlaGF2aW91ciwgdGhhdCBpcyBpZiBWRlMgYWxsb3dlZCBmb3IgcHJlYWxsb2NhdGlvbiwKKyAgICAgICBuZXcgYmxvY2tzIGFyZSBkaXNwbGFjZWQgYmFzZWQgb24gZGlyZWN0b3J5IElELiBBbHNvLCBpZiBzdWdnZXN0ZWQgc2VhcmNoX3N0YXJ0CisgICAgICAgaXMgbGVzcyB0aGFuIGxhc3QgcHJlYWxsb2NhdGVkIGJsb2NrLCB3ZSBzdGFydCBzZWFyY2hpbmcgZnJvbSBpdCwgYXNzdW1pbmcgdGhhdAorICAgICAgIEhERCBkYXRhZmxvdyBpcyBmYXN0ZXIgaW4gZm9yd2FyZCBkaXJlY3Rpb24gKi8KKyAgICBpZiAoIFRFU1RfT1BUSU9OKG9sZF93YXksIHMpKSB7CisJaWYgKCFoaW50LT5mb3JtYXR0ZWRfbm9kZSkgeworCSAgICBpZiAoICFyZWlzZXJmc19oYXNoZWRfcmVsb2NhdGlvbihzKSkKKwkJb2xkX3dheShoaW50KTsKKwkgICAgZWxzZSBpZiAoIXJlaXNlcmZzX25vX3VuaGFzaGVkX3JlbG9jYXRpb24ocykpCisJCW9sZF9oYXNoZWRfcmVsb2NhdGlvbihoaW50KTsKKworCSAgICBpZiAoIGhpbnQtPmlub2RlICYmIGhpbnQtPnNlYXJjaF9zdGFydCA8IFJFSVNFUkZTX0koaGludC0+aW5vZGUpLT5pX3ByZWFsbG9jX2Jsb2NrKQorCQloaW50LT5zZWFyY2hfc3RhcnQgPSBSRUlTRVJGU19JKGhpbnQtPmlub2RlKS0+aV9wcmVhbGxvY19ibG9jazsKKwl9CisJcmV0dXJuOworICAgIH0KKworICAgIC8qIFRoaXMgaXMgYW4gYXBwcm9hY2ggcHJvcG9zZWQgYnkgSGFucyAqLworICAgIGlmICggVEVTVF9PUFRJT04oaHVuZHJlZHRoX3NsaWNlcywgcykgJiYgISAoZGlzcGxhY2luZ19sYXJnZV9maWxlcyhzKSAmJiAhaGludC0+Zm9ybWF0dGVkX25vZGUpKSB7CisJaHVuZHJlZHRoX3NsaWNlcyhoaW50KTsKKwlyZXR1cm47CisgICAgfQorCisgICAgLyogb2xkX2hhc2hlZF9yZWxvY2F0aW9uIG9ubHkgd29ya3Mgb24gdW5mb3JtYXR0ZWQgKi8KKyAgICBpZiAoIXVuZm1faGludCAmJiAhaGludC0+Zm9ybWF0dGVkX25vZGUgJiYKKyAgICAgICAgVEVTVF9PUFRJT04ob2xkX2hhc2hlZF9yZWxvY2F0aW9uLCBzKSkKKyAgICB7CisJb2xkX2hhc2hlZF9yZWxvY2F0aW9uKGhpbnQpOworICAgIH0KKyAgICAvKiBuZXdfaGFzaGVkX3JlbG9jYXRpb24gd29ya3Mgd2l0aCBib3RoIGZvcm1hdHRlZC91bmZvcm1hdHRlZCBub2RlcyAqLworICAgIGlmICgoIXVuZm1faGludCB8fCBoaW50LT5mb3JtYXR0ZWRfbm9kZSkgJiYKKyAgICAgICAgVEVTVF9PUFRJT04obmV3X2hhc2hlZF9yZWxvY2F0aW9uLCBzKSkKKyAgICB7CisJbmV3X2hhc2hlZF9yZWxvY2F0aW9uKGhpbnQpOworICAgIH0KKyAgICAvKiBkaXJpZCBncm91cGluZyB3b3JrcyBvbmx5IG9uIHVuZm9ybWF0dGVkIG5vZGVzICovCisgICAgaWYgKCF1bmZtX2hpbnQgJiYgIWhpbnQtPmZvcm1hdHRlZF9ub2RlICYmIFRFU1RfT1BUSU9OKGRpcmlkX2dyb3VwcyxzKSkKKyAgICB7CisgICAgICAgIGRpcmlkX2dyb3VwcyhoaW50KTsKKyAgICB9CisKKyNpZmRlZiBESVNQTEFDRV9ORVdfUEFDS0lOR19MT0NBTElUSUVTCisgICAgaWYgKGhpbnQtPmZvcm1hdHRlZF9ub2RlICYmIFRFU1RfT1BUSU9OKGRpcmlkX2dyb3VwcyxzKSkKKyAgICB7CisgICAgICAgIGRpcmlkX2dyb3VwcyhoaW50KTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIG9pZCBncm91cGluZyB3b3JrcyBvbmx5IG9uIHVuZm9ybWF0dGVkIG5vZGVzICovCisgICAgaWYgKCF1bmZtX2hpbnQgJiYgIWhpbnQtPmZvcm1hdHRlZF9ub2RlICYmIFRFU1RfT1BUSU9OKG9pZF9ncm91cHMscykpCisgICAgeworICAgICAgICBvaWRfZ3JvdXBzKGhpbnQpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgZGV0ZXJtaW5lX3ByZWFsbG9jX3NpemUocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKiBoaW50KQoreworICAgIC8qIG1ha2UgbWluaW11bSBzaXplIGEgbW91bnQgb3B0aW9uIGFuZCBiZW5jaG1hcmsgYm90aCB3YXlzICovCisgICAgLyogd2UgcHJlYWxsb2NhdGUgYmxvY2tzIG9ubHkgZm9yIHJlZ3VsYXIgZmlsZXMsIHNwZWNpZmljIHNpemUgKi8KKyAgICAvKiBiZW5jaG1hcmsgcHJlYWxsb2NhdGluZyBhbHdheXMgYW5kIHNlZSB3aGF0IGhhcHBlbnMgKi8KKworICAgIGhpbnQtPnByZWFsbG9jX3NpemUgPSAwOworCisgICAgaWYgKCFoaW50LT5mb3JtYXR0ZWRfbm9kZSAmJiBoaW50LT5wcmVhbGxvY2F0ZSkgeworCWlmIChTX0lTUkVHKGhpbnQtPmlub2RlLT5pX21vZGUpCisJICAgICYmIGhpbnQtPmlub2RlLT5pX3NpemUgPj0gUkVJU0VSRlNfU0IoaGludC0+dGgtPnRfc3VwZXIpLT5zX2FsbG9jX29wdGlvbnMucHJlYWxsb2NtaW4gKiBoaW50LT5pbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpCisJICAgIGhpbnQtPnByZWFsbG9jX3NpemUgPSBSRUlTRVJGU19TQihoaW50LT50aC0+dF9zdXBlciktPnNfYWxsb2Nfb3B0aW9ucy5wcmVhbGxvY3NpemUgLSAxOworICAgIH0KKyAgICByZXR1cm4gQ0FSUllfT047Cit9CisKKy8qIFhYWCBJIGtub3cgaXQgY291bGQgYmUgbWVyZ2VkIHdpdGggdXBwZXItbGV2ZWwgZnVuY3Rpb247CisgICBidXQgbWF5IGJlIHJlc3VsdCBmdW5jdGlvbiB3b3VsZCBiZSB0b28gY29tcGxleC4gKi8KK3N0YXRpYyBpbmxpbmUgaW50IGFsbG9jYXRlX3dpdGhvdXRfd3JhcHBpbmdfZGlzayAocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKiBoaW50LAorCQkJCQkgYl9ibG9ja25yX3QgKiBuZXdfYmxvY2tucnMsCisJCQkJCSBiX2Jsb2NrbnJfdCBzdGFydCwgYl9ibG9ja25yX3QgZmluaXNoLAorCQkJCQkgaW50IG1pbiwKKwkJCQkJIGludCBhbW91bnRfbmVlZGVkLCBpbnQgcHJlYWxsb2Nfc2l6ZSkKK3sKKyAgICBpbnQgcmVzdCA9IGFtb3VudF9uZWVkZWQ7CisgICAgaW50IG5yX2FsbG9jYXRlZDsKKyAgCisgICAgd2hpbGUgKHJlc3QgPiAwICYmIHN0YXJ0IDw9IGZpbmlzaCkgeworCW5yX2FsbG9jYXRlZCA9IHNjYW5fYml0bWFwIChoaW50LT50aCwgJnN0YXJ0LCBmaW5pc2gsIG1pbiwKKwkJCQkgICAgcmVzdCArIHByZWFsbG9jX3NpemUsICFoaW50LT5mb3JtYXR0ZWRfbm9kZSwKKwkJCQkgICAgaGludC0+YmxvY2spOworCisJaWYgKG5yX2FsbG9jYXRlZCA9PSAwKQkvKiBubyBuZXcgYmxvY2tzIGFsbG9jYXRlZCwgcmV0dXJuICovCisJICAgIGJyZWFrOworCQorCS8qIGZpbGwgZnJlZV9ibG9ja25ycyBhcnJheSBmaXJzdCAqLworCXdoaWxlIChyZXN0ID4gMCAmJiBucl9hbGxvY2F0ZWQgPiAwKSB7CisJICAgICogbmV3X2Jsb2NrbnJzICsrID0gc3RhcnQgKys7CisJICAgIHJlc3QgLS07IG5yX2FsbG9jYXRlZCAtLTsKKwl9CisKKwkvKiBkbyB3ZSBoYXZlIHNvbWV0aGluZyB0byBmaWxsIHByZWFsbG9jLiBhcnJheSBhbHNvID8gKi8KKwlpZiAobnJfYWxsb2NhdGVkID4gMCkgeworCSAgICAvKiBpdCBtZWFucyBwcmVhbGxvY19zaXplIHdhcyBncmVhdGVyIHRoYXQgMCBhbmQgd2UgZG8gcHJlYWxsb2NhdGlvbiAqLworCSAgICBsaXN0X2FkZCgmUkVJU0VSRlNfSShoaW50LT5pbm9kZSktPmlfcHJlYWxsb2NfbGlzdCwKKwkJICAgICAmU0JfSk9VUk5BTChoaW50LT50aC0+dF9zdXBlciktPmpfcHJlYWxsb2NfbGlzdCk7CisJICAgIFJFSVNFUkZTX0koaGludC0+aW5vZGUpLT5pX3ByZWFsbG9jX2Jsb2NrID0gc3RhcnQ7CisJICAgIFJFSVNFUkZTX0koaGludC0+aW5vZGUpLT5pX3ByZWFsbG9jX2NvdW50ID0gbnJfYWxsb2NhdGVkOworCSAgICBicmVhazsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIChhbW91bnRfbmVlZGVkIC0gcmVzdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGJsb2NrbnJzX2FuZF9wcmVhbGxvY19hcnJheXNfZnJvbV9zZWFyY2hfc3RhcnQKKyAgICAocmVpc2VyZnNfYmxvY2tucl9oaW50X3QgKmhpbnQsIGJfYmxvY2tucl90ICpuZXdfYmxvY2tucnMsIGludCBhbW91bnRfbmVlZGVkKQoreworICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IGhpbnQtPnRoLT50X3N1cGVyOworICAgIGJfYmxvY2tucl90IHN0YXJ0ID0gaGludC0+c2VhcmNoX3N0YXJ0OworICAgIGJfYmxvY2tucl90IGZpbmlzaCA9IFNCX0JMT0NLX0NPVU5UKHMpIC0gMTsKKyAgICBpbnQgcGFzc25vID0gMDsKKyAgICBpbnQgbnJfYWxsb2NhdGVkID0gMDsKKyAgICBpbnQgYmlnYWxsb2MgPSAwOworCisgICAgZGV0ZXJtaW5lX3ByZWFsbG9jX3NpemUoaGludCk7CisgICAgaWYgKCFoaW50LT5mb3JtYXR0ZWRfbm9kZSkgeworICAgICAgICBpbnQgcXVvdGFfcmV0OworI2lmZGVmIFJFSVNFUlFVT1RBX0RFQlVHCisJcmVpc2VyZnNfZGVidWcgKHMsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJyZWlzZXJxdW90YTogYWxsb2NhdGluZyAlZCBibG9ja3MgaWQ9JXUiLCBhbW91bnRfbmVlZGVkLCBoaW50LT5pbm9kZS0+aV91aWQpOworI2VuZGlmCisJcXVvdGFfcmV0ID0gRFFVT1RfQUxMT0NfQkxPQ0tfTk9ESVJUWShoaW50LT5pbm9kZSwgYW1vdW50X25lZWRlZCk7CisJaWYgKHF1b3RhX3JldCkgICAgLyogUXVvdGEgZXhjZWVkZWQ/ICovCisJICAgIHJldHVybiBRVU9UQV9FWENFRURFRDsKKwlpZiAoaGludC0+cHJlYWxsb2NhdGUgJiYgaGludC0+cHJlYWxsb2Nfc2l6ZSApIHsKKyNpZmRlZiBSRUlTRVJRVU9UQV9ERUJVRworCSAgICByZWlzZXJmc19kZWJ1ZyAocywgUkVJU0VSRlNfREVCVUdfQ09ERSwgInJlaXNlcnF1b3RhOiBhbGxvY2F0aW5nIChwcmVhbGxvYykgJWQgYmxvY2tzIGlkPSV1IiwgaGludC0+cHJlYWxsb2Nfc2l6ZSwgaGludC0+aW5vZGUtPmlfdWlkKTsKKyNlbmRpZgorCSAgICBxdW90YV9yZXQgPSBEUVVPVF9QUkVBTExPQ19CTE9DS19OT0RJUlRZKGhpbnQtPmlub2RlLCBoaW50LT5wcmVhbGxvY19zaXplKTsKKwkgICAgaWYgKHF1b3RhX3JldCkKKwkJaGludC0+cHJlYWxsb2NhdGU9aGludC0+cHJlYWxsb2Nfc2l6ZT0wOworCX0KKwkvKiBmb3IgdW5mb3JtYXR0ZWQgbm9kZXMsIGZvcmNlIGxhcmdlIGFsbG9jYXRpb25zICovCisJYmlnYWxsb2MgPSBhbW91bnRfbmVlZGVkOworICAgIH0KKworICAgIGRvIHsKKwkvKiBpbiBiaWdhbGxvYyBtb2RlLCBucl9hbGxvY2F0ZWQgc2hvdWxkIHN0YXkgemVybyB1bnRpbAorCSAqIHRoZSBlbnRpcmUgYWxsb2NhdGlvbiBpcyBmaWxsZWQKKwkgKi8KKwlpZiAodW5saWtlbHkoYmlnYWxsb2MgJiYgbnJfYWxsb2NhdGVkKSkgeworCSAgICByZWlzZXJmc193YXJuaW5nKHMsICJiaWdhbGxvYyBpcyAlZCwgbnJfYWxsb2NhdGVkICVkXG4iLAorCSAgICBiaWdhbGxvYywgbnJfYWxsb2NhdGVkKTsKKwkgICAgLyogcmVzZXQgdGhpbmdzIHRvIGEgc2FuZSB2YWx1ZSAqLworCSAgICBiaWdhbGxvYyA9IGFtb3VudF9uZWVkZWQgLSBucl9hbGxvY2F0ZWQ7CisJfQorCS8qCisJICogdHJ5IHBhc3MgMCBhbmQgcGFzcyAxIGxvb2tpbmcgZm9yIGEgbmljZSBiaWcKKwkgKiBjb250aWd1b3VzIGFsbG9jYXRpb24uICBUaGVuIHJlc2V0IGFuZCBsb29rCisJICogZm9yIGFueXRoaW5nIHlvdSBjYW4gZmluZC4KKwkgKi8KKwlpZiAocGFzc25vID09IDIgJiYgYmlnYWxsb2MpIHsKKwkgICAgcGFzc25vID0gMDsKKwkgICAgYmlnYWxsb2MgPSAwOworCX0KKwlzd2l0Y2ggKHBhc3NubysrKSB7CisgICAgICAgIGNhc2UgMDogLyogU2VhcmNoIGZyb20gaGludC0+c2VhcmNoX3N0YXJ0IHRvIGVuZCBvZiBkaXNrICovCisJICAgIHN0YXJ0ID0gaGludC0+c2VhcmNoX3N0YXJ0OworCSAgICBmaW5pc2ggPSBTQl9CTE9DS19DT1VOVChzKSAtIDE7CisJICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6IC8qIFNlYXJjaCBmcm9tIGhpbnQtPmJlZyB0byBoaW50LT5zZWFyY2hfc3RhcnQgKi8KKwkgICAgc3RhcnQgPSBoaW50LT5iZWc7CisJICAgIGZpbmlzaCA9IGhpbnQtPnNlYXJjaF9zdGFydDsKKwkgICAgYnJlYWs7CisJY2FzZSAyOiAvKiBMYXN0IGNoYW5jZTogU2VhcmNoIGZyb20gMCB0byBoaW50LT5iZWcgKi8KKwkgICAgc3RhcnQgPSAwOworCSAgICBmaW5pc2ggPSBoaW50LT5iZWc7CisJICAgIGJyZWFrOworCWRlZmF1bHQ6IC8qIFdlJ3ZlIHRyaWVkIHNlYXJjaGluZyBldmVyeXdoZXJlLCBub3QgZW5vdWdoIHNwYWNlICovCisJICAgIC8qIEZyZWUgdGhlIGJsb2NrcyAqLworCSAgICBpZiAoIWhpbnQtPmZvcm1hdHRlZF9ub2RlKSB7CisjaWZkZWYgUkVJU0VSUVVPVEFfREVCVUcKKwkJcmVpc2VyZnNfZGVidWcgKHMsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJyZWlzZXJxdW90YTogZnJlZWluZyAobm9zcGFjZSkgJWQgYmxvY2tzIGlkPSV1IiwgYW1vdW50X25lZWRlZCArIGhpbnQtPnByZWFsbG9jX3NpemUgLSBucl9hbGxvY2F0ZWQsIGhpbnQtPmlub2RlLT5pX3VpZCk7CisjZW5kaWYKKwkJRFFVT1RfRlJFRV9CTE9DS19OT0RJUlRZKGhpbnQtPmlub2RlLCBhbW91bnRfbmVlZGVkICsgaGludC0+cHJlYWxsb2Nfc2l6ZSAtIG5yX2FsbG9jYXRlZCk7ICAgICAvKiBGcmVlIG5vdCBhbGxvY2F0ZWQgYmxvY2tzICovCisJICAgIH0KKyAgCSAgICB3aGlsZSAobnJfYWxsb2NhdGVkIC0tKQorCQlyZWlzZXJmc19mcmVlX2Jsb2NrKGhpbnQtPnRoLCBoaW50LT5pbm9kZSwgbmV3X2Jsb2NrbnJzW25yX2FsbG9jYXRlZF0sICFoaW50LT5mb3JtYXR0ZWRfbm9kZSk7CisKKwkgICAgcmV0dXJuIE5PX0RJU0tfU1BBQ0U7CisJfQorICAgIH0gd2hpbGUgKChucl9hbGxvY2F0ZWQgKz0gYWxsb2NhdGVfd2l0aG91dF93cmFwcGluZ19kaXNrIChoaW50LAorCQkJICAgIG5ld19ibG9ja25ycyArIG5yX2FsbG9jYXRlZCwgc3RhcnQsIGZpbmlzaCwKKwkJCSAgICBiaWdhbGxvYyA/IGJpZ2FsbG9jIDogMSwKKwkJCSAgICBhbW91bnRfbmVlZGVkIC0gbnJfYWxsb2NhdGVkLAorCQkJICAgIGhpbnQtPnByZWFsbG9jX3NpemUpKQorCQkJPCBhbW91bnRfbmVlZGVkKTsKKyAgICBpZiAoICFoaW50LT5mb3JtYXR0ZWRfbm9kZSAmJgorICAgICAgICAgYW1vdW50X25lZWRlZCArIGhpbnQtPnByZWFsbG9jX3NpemUgPgorCSBucl9hbGxvY2F0ZWQgKyBSRUlTRVJGU19JKGhpbnQtPmlub2RlKS0+aV9wcmVhbGxvY19jb3VudCkgeworICAgIC8qIFNvbWUgb2YgcHJlYWxsb2NhdGlvbiBibG9ja3Mgd2VyZSBub3QgYWxsb2NhdGVkICovCisjaWZkZWYgUkVJU0VSUVVPVEFfREVCVUcKKwlyZWlzZXJmc19kZWJ1ZyAocywgUkVJU0VSRlNfREVCVUdfQ09ERSwgInJlaXNlcnF1b3RhOiBmcmVlaW5nIChmYWlsZWQgcHJlYWxsb2MpICVkIGJsb2NrcyBpZD0ldSIsIGFtb3VudF9uZWVkZWQgKyBoaW50LT5wcmVhbGxvY19zaXplIC0gbnJfYWxsb2NhdGVkIC0gUkVJU0VSRlNfSShoaW50LT5pbm9kZSktPmlfcHJlYWxsb2NfY291bnQsIGhpbnQtPmlub2RlLT5pX3VpZCk7CisjZW5kaWYKKwlEUVVPVF9GUkVFX0JMT0NLX05PRElSVFkoaGludC0+aW5vZGUsIGFtb3VudF9uZWVkZWQgKworCSAgICAgICAgICAgICAgICAgICAgICAgICBoaW50LT5wcmVhbGxvY19zaXplIC0gbnJfYWxsb2NhdGVkIC0KKwkJCQkgUkVJU0VSRlNfSShoaW50LT5pbm9kZSktPmlfcHJlYWxsb2NfY291bnQpOworICAgIH0KKworICAgIHJldHVybiBDQVJSWV9PTjsKK30KKworLyogZ3JhYiBuZXcgYmxvY2tucnMgZnJvbSBwcmVhbGxvY2F0ZWQgbGlzdCAqLworLyogcmV0dXJuIGFtb3VudCBzdGlsbCBuZWVkZWQgYWZ0ZXIgdXNpbmcgdGhlbSAqLworc3RhdGljIGludCB1c2VfcHJlYWxsb2NhdGVkX2xpc3RfaWZfYXZhaWxhYmxlIChyZWlzZXJmc19ibG9ja25yX2hpbnRfdCAqaGludCwKKwkJCQkJICAgICAgIGJfYmxvY2tucl90ICpuZXdfYmxvY2tucnMsIGludCBhbW91bnRfbmVlZGVkKQoreworICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlID0gaGludC0+aW5vZGU7CisKKyAgICBpZiAoUkVJU0VSRlNfSShpbm9kZSktPmlfcHJlYWxsb2NfY291bnQgPiAwKSB7CisJd2hpbGUgKGFtb3VudF9uZWVkZWQpIHsKKworCSAgICAqbmV3X2Jsb2NrbnJzICsrID0gUkVJU0VSRlNfSShpbm9kZSktPmlfcHJlYWxsb2NfYmxvY2sgKys7CisJICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2NvdW50IC0tOworCisJICAgIGFtb3VudF9uZWVkZWQgLS07CisKKwkgICAgaWYgKFJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2NvdW50IDw9IDApIHsKKwkJbGlzdF9kZWwoJlJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2xpc3QpOyAgCisJCWJyZWFrOworCSAgICB9CisJfQorICAgICAgfQorICAgIC8qIHJldHVybiBhbW91bnQgc3RpbGwgbmVlZGVkIGFmdGVyIHVzaW5nIHByZWFsbG9jYXRlZCBibG9ja3MgKi8KKyAgICByZXR1cm4gYW1vdW50X25lZWRlZDsKK30KKworaW50IHJlaXNlcmZzX2FsbG9jYXRlX2Jsb2NrbnJzKHJlaXNlcmZzX2Jsb2NrbnJfaGludF90ICpoaW50LAorCQkJICAgICAgIGJfYmxvY2tucl90ICogbmV3X2Jsb2NrbnJzLCBpbnQgYW1vdW50X25lZWRlZCwKKwkJCSAgICAgICBpbnQgcmVzZXJ2ZWRfYnlfdXMgLyogQW1vdW50IG9mIGJsb2NrcyB3ZSBoYXZlCisJCQkJCQkgICAgICBhbHJlYWR5IHJlc2VydmVkICovKQoreworICAgIGludCBpbml0aWFsX2Ftb3VudF9uZWVkZWQgPSBhbW91bnRfbmVlZGVkOworICAgIGludCByZXQ7CisgICAgc3RydWN0IHN1cGVyX2Jsb2NrICpzID0gaGludC0+dGgtPnRfc3VwZXI7CisKKyAgICAvKiBDaGVjayBpZiB0aGVyZSBpcyBlbm91Z2ggc3BhY2UsIHRha2luZyBpbnRvIGFjY291bnQgcmVzZXJ2ZWQgc3BhY2UgKi8KKyAgICBpZiAoIFNCX0ZSRUVfQkxPQ0tTKHMpIC0gUkVJU0VSRlNfU0IocyktPnJlc2VydmVkX2Jsb2NrcyA8CisJIGFtb3VudF9uZWVkZWQgLSByZXNlcnZlZF9ieV91cykKKyAgICAgICAgcmV0dXJuIE5PX0RJU0tfU1BBQ0U7CisgICAgLyogc2hvdWxkIHRoaXMgYmUgaWYgIWhpbnQtPmlub2RlICYmICBoaW50LT5wcmVhbGxvY2F0ZT8gKi8KKyAgICAvKiBkbyB5b3UgbWVhbiBoaW50LT5mb3JtYXR0ZWRfbm9kZSBjYW4gYmUgcmVtb3ZlZCA/IC0gWmFtICovCisgICAgLyogaGludC0+Zm9ybWF0dGVkX25vZGUgY2Fubm90IGJlIHJlbW92ZWQgYmVjYXVzZSB3ZSB0cnkgdG8gYWNjZXNzCisgICAgICAgaW5vZGUgaW5mb3JtYXRpb24gaGVyZSwgYW5kIHRoZXJlIGlzIG9mdGVuIG5vIGlub2RlIGFzc290aWF0ZWQgd2l0aAorICAgICAgIG1ldGFkYXRhIGFsbG9jYXRpb25zIC0gZ3JlZW4gKi8KKworICAgIGlmICghaGludC0+Zm9ybWF0dGVkX25vZGUgJiYgaGludC0+cHJlYWxsb2NhdGUpIHsKKwlhbW91bnRfbmVlZGVkID0gdXNlX3ByZWFsbG9jYXRlZF9saXN0X2lmX2F2YWlsYWJsZQorCSAgICAoaGludCwgbmV3X2Jsb2NrbnJzLCBhbW91bnRfbmVlZGVkKTsKKwlpZiAoYW1vdW50X25lZWRlZCA9PSAwKQkvKiBhbGwgYmxvY2tucnMgd2UgbmVlZCB3ZSBnb3QgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVhbGxvYy4gbGlzdCAqLworCSAgICByZXR1cm4gQ0FSUllfT047CisJbmV3X2Jsb2NrbnJzICs9IChpbml0aWFsX2Ftb3VudF9uZWVkZWQgLSBhbW91bnRfbmVlZGVkKTsKKyAgICB9CisKKyAgICAvKiBmaW5kIHNlYXJjaCBzdGFydCBhbmQgc2F2ZSBpdCBpbiBoaW50IHN0cnVjdHVyZSAqLworICAgIGRldGVybWluZV9zZWFyY2hfc3RhcnQoaGludCwgYW1vdW50X25lZWRlZCk7CisgICAgaWYgKGhpbnQtPnNlYXJjaF9zdGFydCA+PSBTQl9CTE9DS19DT1VOVChzKSkKKyAgICAgICAgaGludC0+c2VhcmNoX3N0YXJ0ID0gU0JfQkxPQ0tfQ09VTlQocykgLSAxOworCisgICAgLyogYWxsb2NhdGlvbiBpdHNlbGY7IGZpbGwgbmV3X2Jsb2NrbnJzIGFuZCBwcmVhbGxvY2F0aW9uIGFycmF5cyAqLworICAgIHJldCA9IGJsb2NrbnJzX2FuZF9wcmVhbGxvY19hcnJheXNfZnJvbV9zZWFyY2hfc3RhcnQKKwkoaGludCwgbmV3X2Jsb2NrbnJzLCBhbW91bnRfbmVlZGVkKTsKKworICAgIC8qIHdlIHVzZWQgcHJlYWxsb2MuIGxpc3QgdG8gZmlsbCAocGFydGlhbGx5KSBuZXdfYmxvY2tucnMgYXJyYXkuIElmIGZpbmFsIGFsbG9jYXRpb24gZmFpbHMgd2UKKyAgICAgKiBuZWVkIHRvIHJldHVybiBibG9ja3MgYmFjayB0byBwcmVhbGxvYy4gbGlzdCBvciBqdXN0IGZyZWUgdGhlbS4gLS0gWmFtIChJIGNob3NlIHNlY29uZAorICAgICAqIHZhcmlhbnQpICovCisKKyAgICBpZiAocmV0ICE9IENBUlJZX09OKSB7CisJd2hpbGUgKGFtb3VudF9uZWVkZWQgKysgPCBpbml0aWFsX2Ftb3VudF9uZWVkZWQpIHsKKwkgICAgcmVpc2VyZnNfZnJlZV9ibG9jayhoaW50LT50aCwgaGludC0+aW5vZGUsICooLS1uZXdfYmxvY2tucnMpLCAxKTsKKwl9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKKy8qIFRoZXNlIDIgZnVuY3Rpb25zIGFyZSBoZXJlIHRvIHByb3ZpZGUgYmxvY2tzIHJlc2VydmF0aW9uIHRvIHRoZSByZXN0IG9mIGtlcm5lbCAqLworLyogUmVzZXJ2ZSBAYmxvY2tzIGFtb3VudCBvZiBibG9ja3MgaW4gZnMgcG9pbnRlZCBieSBAc2IuIENhbGxlciBtdXN0IG1ha2Ugc3VyZQorICAgdGhlcmUgYXJlIGFjdHVhbGx5IHRoaXMgbXVjaCBibG9ja3Mgb24gdGhlIEZTIGF2YWlsYWJsZSAqLwordm9pZCByZWlzZXJmc19jbGFpbV9ibG9ja3NfdG9fYmVfYWxsb2NhdGVkKCAKKwkJCQkgICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCAvKiBzdXBlciBibG9jayBvZgorCQkJCQkJCSAgICAgICAgZmlsZXN5c3RlbSB3aGVyZQorCQkJCQkJCQlibG9ja3Mgc2hvdWxkIGJlCisJCQkJCQkJCXJlc2VydmVkICovCisJCQkJICAgICAgaW50IGJsb2NrcyAvKiBIb3cgbXVjaCB0byByZXNlcnZlICovCisJCQkJCSAgKQoreworCisgICAgLyogRmFzdCBjYXNlLCBpZiByZXNlcnZhdGlvbiBpcyB6ZXJvIC0gZXhpdCBpbW1lZGlhdGVseS4gKi8KKyAgICBpZiAoICFibG9ja3MgKQorCXJldHVybjsKKworICAgIHNwaW5fbG9jaygmUkVJU0VSRlNfU0Ioc2IpLT5iaXRtYXBfbG9jayk7CisgICAgUkVJU0VSRlNfU0Ioc2IpLT5yZXNlcnZlZF9ibG9ja3MgKz0gYmxvY2tzOworICAgIHNwaW5fdW5sb2NrKCZSRUlTRVJGU19TQihzYiktPmJpdG1hcF9sb2NrKTsKK30KKworLyogVW5yZXNlcnZlIEBibG9ja3MgYW1vdW50IG9mIGJsb2NrcyBpbiBmcyBwb2ludGVkIGJ5IEBzYiAqLwordm9pZCByZWlzZXJmc19yZWxlYXNlX2NsYWltZWRfYmxvY2tzKCAKKwkJCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCAvKiBzdXBlciBibG9jayBvZgorCQkJCQkJCSAgZmlsZXN5c3RlbSB3aGVyZQorCQkJCQkJCSAgYmxvY2tzIHNob3VsZCBiZQorCQkJCQkJCSAgcmVzZXJ2ZWQgKi8KKwkJCQlpbnQgYmxvY2tzIC8qIEhvdyBtdWNoIHRvIHVucmVzZXJ2ZSAqLworCQkJCQkgICkKK3sKKworICAgIC8qIEZhc3QgY2FzZSwgaWYgdW5yZXNlcnZhdGlvbiBpcyB6ZXJvIC0gZXhpdCBpbW1lZGlhdGVseS4gKi8KKyAgICBpZiAoICFibG9ja3MgKQorCXJldHVybjsKKworICAgIHNwaW5fbG9jaygmUkVJU0VSRlNfU0Ioc2IpLT5iaXRtYXBfbG9jayk7CisgICAgUkVJU0VSRlNfU0Ioc2IpLT5yZXNlcnZlZF9ibG9ja3MgLT0gYmxvY2tzOworICAgIHNwaW5fdW5sb2NrKCZSRUlTRVJGU19TQihzYiktPmJpdG1hcF9sb2NrKTsKKyAgICBSRkFMU0UoIFJFSVNFUkZTX1NCKHNiKS0+cmVzZXJ2ZWRfYmxvY2tzIDwgMCwgImFtb3VudCBvZiBibG9ja3MgcmVzZXJ2ZWQgYmVjYW1lIHplcm8/Iik7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gZXN0aW1hdGVzIGhvdyBtdWNoIHBhZ2VzIHdlIHdpbGwgYmUgYWJsZSB0byB3cml0ZSB0byBGUworICAgdXNlZCBmb3IgcmVpc2VyZnNfZmlsZV93cml0ZSgpIHB1cnBvc2VzIGZvciBub3cuICovCitpbnQgcmVpc2VyZnNfY2FuX2ZpdF9wYWdlcyAoIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IgLyogc3VwZXJibG9jayBvZiBmaWxlc3lzdGVtCisJCQkJCQkgICAgICAgdG8gZXN0aW1hdGUgc3BhY2UgKi8gKQoreworCWludCBzcGFjZTsKKworCXNwaW5fbG9jaygmUkVJU0VSRlNfU0Ioc2IpLT5iaXRtYXBfbG9jayk7CisJc3BhY2UgPSAoU0JfRlJFRV9CTE9DS1Moc2IpIC0gUkVJU0VSRlNfU0Ioc2IpLT5yZXNlcnZlZF9ibG9ja3MpID4+ICggUEFHRV9DQUNIRV9TSElGVCAtIHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwlzcGluX3VubG9jaygmUkVJU0VSRlNfU0Ioc2IpLT5iaXRtYXBfbG9jayk7CisKKwlyZXR1cm4gc3BhY2U+MD9zcGFjZTowOworfQpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvZGlyLmMgYi9mcy9yZWlzZXJmcy9kaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTUxNGE5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvcmVpc2VyZnMvZGlyLmMKQEAgLTAsMCArMSwyNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMCBieSBIYW5zIFJlaXNlciwgbGljZW5zaW5nIGdvdmVybmVkIGJ5IHJlaXNlcmZzL1JFQURNRQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK2V4dGVybiBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICBNSU5fS0VZOworCitzdGF0aWMgaW50IHJlaXNlcmZzX3JlYWRkaXIgKHN0cnVjdCBmaWxlICosIHZvaWQgKiwgZmlsbGRpcl90KTsKK3N0YXRpYyBpbnQgcmVpc2VyZnNfZGlyX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBkYXRhc3luYykgOworCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJlaXNlcmZzX2Rpcl9vcGVyYXRpb25zID0geworICAgIC5yZWFkCT0gZ2VuZXJpY19yZWFkX2RpciwKKyAgICAucmVhZGRpcgk9IHJlaXNlcmZzX3JlYWRkaXIsCisgICAgLmZzeW5jCT0gcmVpc2VyZnNfZGlyX2ZzeW5jLAorICAgIC5pb2N0bAk9IHJlaXNlcmZzX2lvY3RsLAorfTsKKworc3RhdGljIGludCByZWlzZXJmc19kaXJfZnN5bmMoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGRhdGFzeW5jKSB7CisgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisgIGludCBlcnI7CisgIHJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworICBlcnIgPSByZWlzZXJmc19jb21taXRfZm9yX2lub2RlKGlub2RlKSA7CisgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYikgOworICBpZiAoZXJyIDwgMCkKKyAgICAgIHJldHVybiBlcnI7CisgIHJldHVybiAwOworfQorCisKKyNkZWZpbmUgc3RvcmVfaWgod2hlcmUsd2hhdCkgY29weV9pdGVtX2hlYWQgKHdoZXJlLCB3aGF0KQorCisvLworc3RhdGljIGludCByZWlzZXJmc19yZWFkZGlyIChzdHJ1Y3QgZmlsZSAqIGZpbHAsIHZvaWQgKiBkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKyAgICBzdHJ1Y3QgY3B1X2tleSBwb3Nfa2V5OwkvKiBrZXkgb2YgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgZGlyZWN0b3J5IChrZXkgb2YgZGlyZWN0b3J5IGVudHJ5KSAqLworICAgIElOSVRJQUxJWkVfUEFUSCAocGF0aF90b19lbnRyeSk7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisgICAgaW50IGl0ZW1fbnVtLCBlbnRyeV9udW07CisgICAgY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqIHJrZXk7CisgICAgc3RydWN0IGl0ZW1faGVhZCAqIGloLCB0bXBfaWg7CisgICAgaW50IHNlYXJjaF9yZXM7CisgICAgY2hhciAqIGxvY2FsX2J1ZjsKKyAgICBsb2ZmX3QgbmV4dF9wb3M7CisgICAgY2hhciBzbWFsbF9idWZbMzJdIDsgLyogYXZvaWQga21hbGxvYyBpZiB3ZSBjYW4gKi8KKyAgICBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5IGRlOworICAgIGludCByZXQgPSAwOworCisgICAgcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisKKyAgICByZWlzZXJmc19jaGVja19sb2NrX2RlcHRoKGlub2RlLT5pX3NiLCAicmVhZGRpciIpIDsKKworICAgIC8qIGZvcm0ga2V5IGZvciBzZWFyY2ggdGhlIG5leHQgZGlyZWN0b3J5IGVudHJ5IHVzaW5nIGZfcG9zIGZpZWxkIG9mCisgICAgICAgZmlsZSBzdHJ1Y3R1cmUgKi8KKyAgICBtYWtlX2NwdV9rZXkgKCZwb3Nfa2V5LCBpbm9kZSwgKGZpbHAtPmZfcG9zKSA/IChmaWxwLT5mX3BvcykgOiBET1RfT0ZGU0VULAorCQkgIFRZUEVfRElSRU5UUlksIDMpOworICAgIG5leHRfcG9zID0gY3B1X2tleV9rX29mZnNldCAoJnBvc19rZXkpOworCisgICAgLyogIHJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAicmVpc2VyZnNfcmVhZGRpciAxOiBmX3BvcyA9ICVMZCIsIGZpbHAtPmZfcG9zKTsqLworCisgICAgcGF0aF90b19lbnRyeS5yZWFkYSA9IFBBVEhfUkVBREE7CisgICAgd2hpbGUgKDEpIHsKKyAgICByZXNlYXJjaDoKKwkvKiBzZWFyY2ggdGhlIGRpcmVjdG9yeSBpdGVtLCBjb250YWluaW5nIGVudHJ5IHdpdGggc3BlY2lmaWVkIGtleSAqLworCXNlYXJjaF9yZXMgPSBzZWFyY2hfYnlfZW50cnlfa2V5IChpbm9kZS0+aV9zYiwgJnBvc19rZXksICZwYXRoX3RvX2VudHJ5LCAmZGUpOworCWlmIChzZWFyY2hfcmVzID09IElPX0VSUk9SKSB7CisJICAgIC8vIEZJWE1FOiB3ZSBjb3VsZCBqdXN0IHNraXAgcGFydCBvZiBkaXJlY3Rvcnkgd2hpY2ggY291bGQKKwkgICAgLy8gbm90IGJlIHJlYWQKKwkgICAgcmV0ID0gLUVJTzsKKwkgICAgZ290byBvdXQ7CisJfQorCWVudHJ5X251bSA9IGRlLmRlX2VudHJ5X251bTsKKwliaCA9IGRlLmRlX2JoOworCWl0ZW1fbnVtID0gZGUuZGVfaXRlbV9udW07CisJaWggPSBkZS5kZV9paDsKKwlzdG9yZV9paCAoJnRtcF9paCwgaWgpOworCQkKKwkvKiB3ZSBtdXN0IGhhdmUgZm91bmQgaXRlbSwgdGhhdCBpcyBpdGVtIG9mIHRoaXMgZGlyZWN0b3J5LCAqLworCVJGQUxTRSggQ09NUF9TSE9SVF9LRVlTICgmKGloLT5paF9rZXkpLCAmcG9zX2tleSksCisJCSJ2cy05MDAwOiBmb3VuZCBpdGVtICVoIGRvZXMgbm90IG1hdGNoIHRvIGRpciB3ZSByZWFkZGlyICVLIiwKKwkJaWgsICZwb3Nfa2V5KTsKKwlSRkFMU0UoIGl0ZW1fbnVtID4gQl9OUl9JVEVNUyAoYmgpIC0gMSwKKwkJInZzLTkwMDUgaXRlbV9udW0gPT0gJWQsIGl0ZW0gYW1vdW50ID09ICVkIiwgCisJCWl0ZW1fbnVtLCBCX05SX0lURU1TIChiaCkpOworICAgICAgCisJLyogYW5kIGVudHJ5IG11c3QgYmUgbm90IG1vcmUgdGhhbiBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgaXRlbSAqLworCVJGQUxTRSggSV9FTlRSWV9DT1VOVCAoaWgpIDwgZW50cnlfbnVtLAorCQkidnMtOTAxMDogZW50cnkgbnVtYmVyIGlzIHRvbyBiaWcgJWQgKCVkKSIsIAorCQllbnRyeV9udW0sIElfRU5UUllfQ09VTlQgKGloKSk7CisKKwlpZiAoc2VhcmNoX3JlcyA9PSBQT1NJVElPTl9GT1VORCB8fCBlbnRyeV9udW0gPCBJX0VOVFJZX0NPVU5UIChpaCkpIHsKKwkgICAgLyogZ28gdGhyb3VnaCBhbGwgZW50cmllcyBpbiB0aGUgZGlyZWN0b3J5IGl0ZW0gYmVnaW5uaW5nIGZyb20gdGhlIGVudHJ5LCB0aGF0IGhhcyBiZWVuIGZvdW5kICovCisJICAgIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogZGVoID0gQl9JX0RFSCAoYmgsIGloKSArIGVudHJ5X251bTsKKworCSAgICBmb3IgKDsgZW50cnlfbnVtIDwgSV9FTlRSWV9DT1VOVCAoaWgpOyBlbnRyeV9udW0gKyssIGRlaCArKykgeworCQlpbnQgZF9yZWNsZW47CisJCWNoYXIgKiBkX25hbWU7CisJCW9mZl90IGRfb2ZmOworCQlpbm9fdCBkX2lubzsKKworCQlpZiAoIWRlX3Zpc2libGUgKGRlaCkpCisJCSAgICAvKiBpdCBpcyBoaWRkZW4gZW50cnkgKi8KKwkJICAgIGNvbnRpbnVlOworCQlkX3JlY2xlbiA9IGVudHJ5X2xlbmd0aCAoYmgsIGloLCBlbnRyeV9udW0pOworCQlkX25hbWUgPSBCX0lfREVIX0VOVFJZX0ZJTEVfTkFNRSAoYmgsIGloLCBkZWgpOworCQlpZiAoIWRfbmFtZVtkX3JlY2xlbiAtIDFdKQorCQkgICAgZF9yZWNsZW4gPSBzdHJsZW4gKGRfbmFtZSk7CisJCisJCWlmIChkX3JlY2xlbiA+IFJFSVNFUkZTX01BWF9OQU1FKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkpeworCQkgICAgLyogdG9vIGJpZyB0byBzZW5kIGJhY2sgdG8gVkZTICovCisJCSAgICBjb250aW51ZSA7CisJCX0KKworICAgICAgICAgICAgICAgIC8qIElnbm9yZSB0aGUgLnJlaXNlcmZzX3ByaXYgZW50cnkgKi8KKyAgICAgICAgICAgICAgICBpZiAocmVpc2VyZnNfeGF0dHJzIChpbm9kZS0+aV9zYikgJiYKKyAgICAgICAgICAgICAgICAgICAgIW9sZF9mb3JtYXRfb25seShpbm9kZS0+aV9zYikgJiYKKyAgICAgICAgICAgICAgICAgICAgZmlscC0+Zl9kZW50cnkgPT0gaW5vZGUtPmlfc2ItPnNfcm9vdCAmJgorICAgICAgICAgICAgICAgICAgICBSRUlTRVJGU19TQihpbm9kZS0+aV9zYiktPnByaXZfcm9vdCAmJgorICAgICAgICAgICAgICAgICAgICBSRUlTRVJGU19TQihpbm9kZS0+aV9zYiktPnByaXZfcm9vdC0+ZF9pbm9kZSAmJgorICAgICAgICAgICAgICAgICAgICBkZWhfb2JqZWN0aWQoZGVoKSA9PSBsZTMyX3RvX2NwdSAoSU5PREVfUEtFWShSRUlTRVJGU19TQihpbm9kZS0+aV9zYiktPnByaXZfcm9vdC0+ZF9pbm9kZSktPmtfb2JqZWN0aWQpKSB7CisgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKwkJZF9vZmYgPSBkZWhfb2Zmc2V0IChkZWgpOworCQlmaWxwLT5mX3BvcyA9IGRfb2ZmIDsKKwkJZF9pbm8gPSBkZWhfb2JqZWN0aWQgKGRlaCk7CisJCWlmIChkX3JlY2xlbiA8PSAzMikgeworCQkgIGxvY2FsX2J1ZiA9IHNtYWxsX2J1ZiA7CisJCX0gZWxzZSB7CisJCSAgICBsb2NhbF9idWYgPSByZWlzZXJmc19rbWFsbG9jKGRfcmVjbGVuLCBHRlBfTk9GUywgaW5vZGUtPmlfc2IpIDsKKwkJICAgIGlmICghbG9jYWxfYnVmKSB7CisJCQlwYXRocmVsc2UgKCZwYXRoX3RvX2VudHJ5KTsKKwkJCXJldCA9IC1FTk9NRU0gOworCQkJZ290byBvdXQ7CisJCSAgICB9CisJCSAgICBpZiAoaXRlbV9tb3ZlZCAoJnRtcF9paCwgJnBhdGhfdG9fZW50cnkpKSB7CisJCQlyZWlzZXJmc19rZnJlZShsb2NhbF9idWYsIGRfcmVjbGVuLCBpbm9kZS0+aV9zYikgOworCQkJZ290byByZXNlYXJjaDsKKwkJICAgIH0KKwkJfQorCQkvLyBOb3RlLCB0aGF0IHdlIGNvcHkgbmFtZSB0byB1c2VyIHNwYWNlIHZpYSB0ZW1wb3JhcnkKKwkJLy8gYnVmZmVyIChsb2NhbF9idWYpIGJlY2F1c2UgZmlsbGRpciB3aWxsIGJsb2NrIGlmCisJCS8vIHVzZXIgc3BhY2UgYnVmZmVyIGlzIHN3YXBwZWQgb3V0LiBBdCB0aGF0IHRpbWUKKwkJLy8gZW50cnkgY2FuIG1vdmUgdG8gc29tZXdoZXJlIGVsc2UKKwkJbWVtY3B5IChsb2NhbF9idWYsIGRfbmFtZSwgZF9yZWNsZW4pOworCQlpZiAoZmlsbGRpciAoZGlyZW50LCBsb2NhbF9idWYsIGRfcmVjbGVuLCBkX29mZiwgZF9pbm8sIAorCQkgICAgICAgICAgICAgRFRfVU5LTk9XTikgPCAwKSB7CisJCSAgICBpZiAobG9jYWxfYnVmICE9IHNtYWxsX2J1ZikgeworCQkJcmVpc2VyZnNfa2ZyZWUobG9jYWxfYnVmLCBkX3JlY2xlbiwgaW5vZGUtPmlfc2IpIDsKKwkJICAgIH0KKwkJICAgIGdvdG8gZW5kOworCQl9CisJCWlmIChsb2NhbF9idWYgIT0gc21hbGxfYnVmKSB7CisJCSAgICByZWlzZXJmc19rZnJlZShsb2NhbF9idWYsIGRfcmVjbGVuLCBpbm9kZS0+aV9zYikgOworCQl9CisKKwkJLy8gbmV4dCBlbnRyeSBzaG91bGQgYmUgbG9va2VkIGZvciB3aXRoIHN1Y2ggb2Zmc2V0CisJCW5leHRfcG9zID0gZGVoX29mZnNldCAoZGVoKSArIDE7CisKKwkJaWYgKGl0ZW1fbW92ZWQgKCZ0bXBfaWgsICZwYXRoX3RvX2VudHJ5KSkgeworCQkgICAgZ290byByZXNlYXJjaDsKKwkJfQorCSAgICB9IC8qIGZvciAqLworCX0KKworCWlmIChpdGVtX251bSAhPSBCX05SX0lURU1TIChiaCkgLSAxKQorCSAgICAvLyBlbmQgb2YgZGlyZWN0b3J5IGhhcyBiZWVuIHJlYWNoZWQKKwkgICAgZ290byBlbmQ7CisKKwkvKiBpdGVtIHdlIHdlbnQgdGhyb3VnaCBpcyBsYXN0IGl0ZW0gb2Ygbm9kZS4gVXNpbmcgcmlnaHQKKwkgICBkZWxpbWl0aW5nIGtleSBjaGVjayBpcyBpdCBkaXJlY3RvcnkgZW5kICovCisJcmtleSA9IGdldF9ya2V5ICgmcGF0aF90b19lbnRyeSwgaW5vZGUtPmlfc2IpOworCWlmICghIGNvbXBfbGVfa2V5cyAocmtleSwgJk1JTl9LRVkpKSB7CisJICAgIC8qIHNldCBwb3Nfa2V5IHRvIGtleSwgdGhhdCBpcyB0aGUgc21hbGxlc3QgYW5kIGdyZWF0ZXIKKwkgICAgICAgdGhhdCBrZXkgb2YgdGhlIGxhc3QgZW50cnkgaW4gdGhlIGl0ZW0gKi8KKwkgICAgc2V0X2NwdV9rZXlfa19vZmZzZXQgKCZwb3Nfa2V5LCBuZXh0X3Bvcyk7CisJICAgIGNvbnRpbnVlOworCX0KKworCWlmICggQ09NUF9TSE9SVF9LRVlTIChya2V5LCAmcG9zX2tleSkpIHsKKwkgICAgLy8gZW5kIG9mIGRpcmVjdG9yeSBoYXMgYmVlbiByZWFjaGVkCisJICAgIGdvdG8gZW5kOworCX0KKwkKKwkvKiBkaXJlY3RvcnkgY29udGludWVzIGluIHRoZSByaWdodCBuZWlnaGJvcmluZyBibG9jayAqLworCXNldF9jcHVfa2V5X2tfb2Zmc2V0ICgmcG9zX2tleSwgbGVfa2V5X2tfb2Zmc2V0IChLRVlfRk9STUFUXzNfNSwgcmtleSkpOworCisgICAgfSAvKiB3aGlsZSAqLworCisKKyBlbmQ6CisgICAgZmlscC0+Zl9wb3MgPSBuZXh0X3BvczsKKyAgICBwYXRocmVsc2UgKCZwYXRoX3RvX2VudHJ5KTsKKyAgICByZWlzZXJmc19jaGVja19wYXRoKCZwYXRoX3RvX2VudHJ5KSA7Cisgb3V0OgorICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisgICAgcmV0dXJuIHJldDsKK30KKworLyogY29tcG9zZSBkaXJlY3RvcnkgaXRlbSBjb250YWluaW5nICIuIiBhbmQgIi4uIiBlbnRyaWVzIChlbnRyaWVzIGFyZQorICAgbm90IGFsaWduZWQgdG8gNCBieXRlIGJvdW5kYXJ5KSAqLworLyogdGhlIGxhc3QgZm91ciBwYXJhbXMgYXJlIExFICovCit2b2lkIG1ha2VfZW1wdHlfZGlyX2l0ZW1fdjEgKGNoYXIgKiBib2R5LCBfX3UzMiBkaXJpZCwgX191MzIgb2JqaWQsCisJCQkgICAgIF9fdTMyIHBhcl9kaXJpZCwgX191MzIgcGFyX29iamlkKQoreworICAgIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogZGVoOworCisgICAgbWVtc2V0IChib2R5LCAwLCBFTVBUWV9ESVJfU0laRV9WMSk7CisgICAgZGVoID0gKHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopYm9keTsKKyAgICAKKyAgICAvKiBkaXJlbnRyeSBoZWFkZXIgb2YgIi4iICovCisgICAgcHV0X2RlaF9vZmZzZXQoICYoZGVoWzBdKSwgRE9UX09GRlNFVCApOworICAgIC8qIHRoZXNlIHR3byBhcmUgZnJvbSBtYWtlX2xlX2l0ZW1faGVhZCwgYW5kIGFyZSBhcmUgTEUgKi8KKyAgICBkZWhbMF0uZGVoX2Rpcl9pZCA9IGRpcmlkOworICAgIGRlaFswXS5kZWhfb2JqZWN0aWQgPSBvYmppZDsKKyAgICBkZWhbMF0uZGVoX3N0YXRlID0gMDsgLyogRW5kaWFuIHNhZmUgaWYgMCAqLworICAgIHB1dF9kZWhfbG9jYXRpb24oICYoZGVoWzBdKSwgRU1QVFlfRElSX1NJWkVfVjEgLSBzdHJsZW4oICIuIiApKTsKKyAgICBtYXJrX2RlX3Zpc2libGUoJihkZWhbMF0pKTsKKyAgCisgICAgLyogZGlyZW50cnkgaGVhZGVyIG9mICIuLiIgKi8KKyAgICBwdXRfZGVoX29mZnNldCggJihkZWhbMV0pLCBET1RfRE9UX09GRlNFVCk7CisgICAgLyoga2V5IG9mICIuLiIgZm9yIHRoZSByb290IGRpcmVjdG9yeSAqLworICAgIC8qIHRoZXNlIHR3byBhcmUgZnJvbSB0aGUgaW5vZGUsIGFuZCBhcmUgYXJlIExFICovCisgICAgZGVoWzFdLmRlaF9kaXJfaWQgPSBwYXJfZGlyaWQ7CisgICAgZGVoWzFdLmRlaF9vYmplY3RpZCA9IHBhcl9vYmppZDsKKyAgICBkZWhbMV0uZGVoX3N0YXRlID0gMDsgLyogRW5kaWFuIHNhZmUgaWYgMCAqLworICAgIHB1dF9kZWhfbG9jYXRpb24oICYoZGVoWzFdKSwgZGVoX2xvY2F0aW9uKCAmKGRlaFswXSkgKSAtIHN0cmxlbiggIi4uIiApICk7CisgICAgbWFya19kZV92aXNpYmxlKCYoZGVoWzFdKSk7CisKKyAgICAvKiBjb3B5ICIuLiIgYW5kICIuIiAqLworICAgIG1lbWNweSAoYm9keSArIGRlaF9sb2NhdGlvbiggJihkZWhbMF0pICksICIuIiwgMSk7CisgICAgbWVtY3B5IChib2R5ICsgZGVoX2xvY2F0aW9uKCAmKGRlaFsxXSkgKSwgIi4uIiwgMik7Cit9CisKKy8qIGNvbXBvc2UgZGlyZWN0b3J5IGl0ZW0gY29udGFpbmluZyAiLiIgYW5kICIuLiIgZW50cmllcyAqLwordm9pZCBtYWtlX2VtcHR5X2Rpcl9pdGVtIChjaGFyICogYm9keSwgX191MzIgZGlyaWQsIF9fdTMyIG9iamlkLAorCQkJICBfX3UzMiBwYXJfZGlyaWQsIF9fdTMyIHBhcl9vYmppZCkKK3sKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqIGRlaDsKKworICAgIG1lbXNldCAoYm9keSwgMCwgRU1QVFlfRElSX1NJWkUpOworICAgIGRlaCA9IChzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKWJvZHk7CisgICAgCisgICAgLyogZGlyZW50cnkgaGVhZGVyIG9mICIuIiAqLworICAgIHB1dF9kZWhfb2Zmc2V0KCAmKGRlaFswXSksIERPVF9PRkZTRVQgKTsKKyAgICAvKiB0aGVzZSB0d28gYXJlIGZyb20gbWFrZV9sZV9pdGVtX2hlYWQsIGFuZCBhcmUgYXJlIExFICovCisgICAgZGVoWzBdLmRlaF9kaXJfaWQgPSBkaXJpZDsKKyAgICBkZWhbMF0uZGVoX29iamVjdGlkID0gb2JqaWQ7CisgICAgZGVoWzBdLmRlaF9zdGF0ZSA9IDA7IC8qIEVuZGlhbiBzYWZlIGlmIDAgKi8KKyAgICBwdXRfZGVoX2xvY2F0aW9uKCAmKGRlaFswXSksIEVNUFRZX0RJUl9TSVpFIC0gUk9VTkRfVVAoIHN0cmxlbiggIi4iICkgKSApOworICAgIG1hcmtfZGVfdmlzaWJsZSgmKGRlaFswXSkpOworICAKKyAgICAvKiBkaXJlbnRyeSBoZWFkZXIgb2YgIi4uIiAqLworICAgIHB1dF9kZWhfb2Zmc2V0KCAmKGRlaFsxXSksIERPVF9ET1RfT0ZGU0VUICk7CisgICAgLyoga2V5IG9mICIuLiIgZm9yIHRoZSByb290IGRpcmVjdG9yeSAqLworICAgIC8qIHRoZXNlIHR3byBhcmUgZnJvbSB0aGUgaW5vZGUsIGFuZCBhcmUgYXJlIExFICovCisgICAgZGVoWzFdLmRlaF9kaXJfaWQgPSBwYXJfZGlyaWQ7CisgICAgZGVoWzFdLmRlaF9vYmplY3RpZCA9IHBhcl9vYmppZDsKKyAgICBkZWhbMV0uZGVoX3N0YXRlID0gMDsgLyogRW5kaWFuIHNhZmUgaWYgMCAqLworICAgIHB1dF9kZWhfbG9jYXRpb24oICYoZGVoWzFdKSwgZGVoX2xvY2F0aW9uKCAmKGRlaFswXSkpIC0gUk9VTkRfVVAoIHN0cmxlbiggIi4uIiApICkgKTsKKyAgICBtYXJrX2RlX3Zpc2libGUoJihkZWhbMV0pKTsKKworICAgIC8qIGNvcHkgIi4uIiBhbmQgIi4iICovCisgICAgbWVtY3B5IChib2R5ICsgZGVoX2xvY2F0aW9uKCAmKGRlaFswXSkgKSwgIi4iLCAxKTsKKyAgICBtZW1jcHkgKGJvZHkgKyBkZWhfbG9jYXRpb24oICYoZGVoWzFdKSApLCAiLi4iLCAyKTsKK30KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2RvX2JhbGFuLmMgYi9mcy9yZWlzZXJmcy9kb19iYWxhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMThkYjIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9yZWlzZXJmcy9kb19iYWxhbi5jCkBAIC0wLDAgKzEsMTU5NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAwIGJ5IEhhbnMgUmVpc2VyLCBsaWNlbnNpbmcgZ292ZXJuZWQgYnkgcmVpc2VyZnMvUkVBRE1FCisgKi8KKworLyogTm93IHdlIGhhdmUgYWxsIGJ1ZmZlcnMgdGhhdCBtdXN0IGJlIHVzZWQgaW4gYmFsYW5jaW5nIG9mIHRoZSB0cmVlIAkqLworLyogRnVydGhlciBjYWxjdWxhdGlvbnMgY2FuIG5vdCBjYXVzZSBzY2hlZHVsZSgpLCBhbmQgdGh1cyB0aGUgYnVmZmVyIAkqLworLyogdHJlZSB3aWxsIGJlIHN0YWJsZSB1bnRpbCB0aGUgYmFsYW5jaW5nIHdpbGwgYmUgZmluaXNoZWQgCQkqLworLyogYmFsYW5jZSB0aGUgdHJlZSBhY2NvcmRpbmcgdG8gdGhlIGFuYWx5c2lzIG1hZGUgYmVmb3JlLAkJKi8KKy8qIGFuZCB1c2luZyBidWZmZXJzIG9idGFpbmVkIGFmdGVyIGFsbCBhYm92ZS4JCQkJKi8KKworCisvKioKKyAqKiBiYWxhbmNlX2xlYWZfd2hlbl9kZWxldGUKKyAqKiBiYWxhbmNlX2xlYWYKKyAqKiBkb19iYWxhbmNlCisgKioKKyAqKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKworI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSworCitzdHJ1Y3QgdHJlZV9iYWxhbmNlICogY3VyX3RiID0gTlVMTDsgLyogZGV0ZWN0cyB3aGV0aGVyIG1vcmUgdGhhbiBvbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5IG9mIHRiIGV4aXN0cyBhcyBhIG1lYW5zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgY2hlY2tpbmcgd2hldGhlciBzY2hlZHVsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGludGVycnVwdGluZyBkb19iYWxhbmNlICovCisjZW5kaWYKKworaW5saW5lIHZvaWQgZG9fYmFsYW5jZV9tYXJrX2xlYWZfZGlydHkgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgCisJCQkJCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoLCBpbnQgZmxhZykKK3sKKyAgICBqb3VybmFsX21hcmtfZGlydHkodGItPnRyYW5zYWN0aW9uX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdGItPnRyYW5zYWN0aW9uX2hhbmRsZS0+dF9zdXBlciwgYmgpIDsKK30KKworI2RlZmluZSBkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgZG9fYmFsYW5jZV9tYXJrX2xlYWZfZGlydHkKKyNkZWZpbmUgZG9fYmFsYW5jZV9tYXJrX3NiX2RpcnR5IGRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5CisKKworLyogc3VtbWFyeTogCisgaWYgZGVsZXRpbmcgc29tZXRoaW5nICggdGItPmluc2VydF9zaXplWzBdIDwgMCApCisgICByZXR1cm4oYmFsYW5jZV9sZWFmX3doZW5fZGVsZXRlKCkpOyAoZmxhZyBkIGhhbmRsZWQgaGVyZSkKKyBlbHNlCisgICBpZiBsbnVtIGlzIGxhcmdlciB0aGFuIDAgd2UgcHV0IGl0ZW1zIGludG8gdGhlIGxlZnQgbm9kZQorICAgaWYgcm51bSBpcyBsYXJnZXIgdGhhbiAwIHdlIHB1dCBpdGVtcyBpbnRvIHRoZSByaWdodCBub2RlCisgICBpZiBzbnVtMSBpcyBsYXJnZXIgdGhhbiAwIHdlIHB1dCBpdGVtcyBpbnRvIHRoZSBuZXcgbm9kZSBzMQorICAgaWYgc251bTIgaXMgbGFyZ2VyIHRoYW4gMCB3ZSBwdXQgaXRlbXMgaW50byB0aGUgbmV3IG5vZGUgczIgCitOb3RlIHRoYXQgYWxsICpudW0qIGNvdW50IG5ldyBpdGVtcyBiZWluZyBjcmVhdGVkLgorCitJdCB3b3VsZCBiZSBlYXNpZXIgdG8gcmVhZCBiYWxhbmNlX2xlYWYoKSBpZiBlYWNoIG9mIHRoZXNlIHN1bW1hcnkKK2xpbmVzIHdhcyBhIHNlcGFyYXRlIHByb2NlZHVyZSByYXRoZXIgdGhhbiBiZWluZyBpbmxpbmVkLiAgSSB0aGluawordGhhdCB0aGVyZSBhcmUgbWFueSBwYXNzYWdlcyBoZXJlIGFuZCBpbiBiYWxhbmNlX2xlYWZfd2hlbl9kZWxldGUoKSBpbgord2hpY2ggdHdvIGNhbGxzIHRvIG9uZSBwcm9jZWR1cmUgY2FuIHJlcGxhY2UgdHdvIHBhc3NhZ2VzLCBhbmQgaXQKK21pZ2h0IHNhdmUgY2FjaGUgc3BhY2UgYW5kIGltcHJvdmUgc29mdHdhcmUgbWFpbnRlbmFuY2UgY29zdHMgdG8gZG8gc28uICAKKworVmxhZGltaXIgbWFkZSB0aGUgcGVyY2VwdGl2ZSBjb21tZW50IHRoYXQgd2Ugc2hvdWxkIG9mZmxvYWQgbW9zdCBvZgordGhlIGRlY2lzaW9uIG1ha2luZyBpbiB0aGlzIGZ1bmN0aW9uIGludG8gZml4X25vZGVzL2NoZWNrX2JhbGFuY2UsIGFuZAordGhlbiBjcmVhdGUgc29tZSBzb3J0IG9mIHN0cnVjdHVyZSBpbiB0YiB0aGF0IHNheXMgd2hhdCBhY3Rpb25zIHNob3VsZAorYmUgcGVyZm9ybWVkIGJ5IGRvX2JhbGFuY2UuCisKKy1IYW5zICovCisKKworCisvKiBCYWxhbmNlIGxlYWYgbm9kZSBpbiBjYXNlIG9mIGRlbGV0ZSBvciBjdXQ6IGluc2VydF9zaXplWzBdIDwgMAorICoKKyAqIGxudW0sIHJudW0gY2FuIGhhdmUgdmFsdWVzID49IC0xCisgKgktMSBtZWFucyB0aGF0IHRoZSBuZWlnaGJvciBtdXN0IGJlIGpvaW5lZCB3aXRoIFMKKyAqCSAwIG1lYW5zIHRoYXQgbm90aGluZyBzaG91bGQgYmUgZG9uZSB3aXRoIHRoZSBuZWlnaGJvcgorICoJPjAgbWVhbnMgdG8gc2hpZnQgZW50aXJlbHkgb3IgcGFydGx5IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGl0ZW1zIHRvIHRoZSBuZWlnaGJvcgorICovCitzdGF0aWMgaW50IGJhbGFuY2VfbGVhZl93aGVuX2RlbGV0ZSAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgZmxhZykKK3sKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiB0YlMwID0gUEFUSF9QTEFTVF9CVUZGRVIgKHRiLT50Yl9wYXRoKTsKKyAgICBpbnQgaXRlbV9wb3MgPSBQQVRIX0xBU1RfUE9TSVRJT04gKHRiLT50Yl9wYXRoKTsKKyAgICBpbnQgcG9zX2luX2l0ZW0gPSB0Yi0+dGJfcGF0aC0+cG9zX2luX2l0ZW07CisgICAgc3RydWN0IGJ1ZmZlcl9pbmZvIGJpOworICAgIGludCBuOworICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKKworICAgIFJGQUxTRSggdGItPkZSWzBdICYmIEJfTEVWRUwgKHRiLT5GUlswXSkgIT0gRElTS19MRUFGX05PREVfTEVWRUwgKyAxLAorCSAgICAidnMtIDEyMDAwOiBsZXZlbDogd3JvbmcgRlIgJXoiLCB0Yi0+RlJbMF0pOworICAgIFJGQUxTRSggdGItPmJsa251bVswXSA+IDEsCisJICAgICJQQVAtMTIwMDU6IHRiLT5ibGtudW0gPT0gJWQsIGNhbiBub3QgYmUgPiAxIiwgdGItPmJsa251bVswXSk7CisgICAgUkZBTFNFKCAhIHRiLT5ibGtudW1bMF0gJiYgISBQQVRIX0hfUFBBUkVOVCh0Yi0+dGJfcGF0aCwgMCksCisJICAgICJQQVAtMTIwMTA6IHRyZWUgY2FuIG5vdCBiZSBlbXB0eSIpOworCisgICAgaWggPSBCX05fUElURU1fSEVBRCAodGJTMCwgaXRlbV9wb3MpOworCisgICAgLyogRGVsZXRlIG9yIHRydW5jYXRlIHRoZSBpdGVtICovCisKKyAgICBzd2l0Y2ggKGZsYWcpIHsKKyAgICBjYXNlIE1fREVMRVRFOiAgIC8qIGRlbGV0ZSBpdGVtIGluIFNbMF0gKi8KKworCVJGQUxTRSggaWhfaXRlbV9sZW4oaWgpICsgSUhfU0laRSAhPSAtdGItPmluc2VydF9zaXplWzBdLAorCSAgICAgICAgInZzLTEyMDEzOiBtb2RlIERlbGV0ZSwgaW5zZXJ0IHNpemUgJWQsIGloIHRvIGJlIGRlbGV0ZWQgJWgiLAorIAkJIC10Yi0+aW5zZXJ0X3NpemUgWzBdLCBpaCk7CisKKwliaS50YiA9IHRiOworCWJpLmJpX2JoID0gdGJTMDsKKwliaS5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIDApOworCWJpLmJpX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgMSk7CisJbGVhZl9kZWxldGVfaXRlbXMgKCZiaSwgMCwgaXRlbV9wb3MsIDEsIC0xKTsKKworCWlmICggISBpdGVtX3BvcyAmJiB0Yi0+Q0ZMWzBdICkgeworCSAgICBpZiAoIEJfTlJfSVRFTVModGJTMCkgKSB7CisJCXJlcGxhY2Vfa2V5KHRiLCB0Yi0+Q0ZMWzBdLHRiLT5sa2V5WzBdLHRiUzAsMCk7CisJICAgIH0KKwkgICAgZWxzZSB7CisJCWlmICggISBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCAxKSApCisJCSAgICByZXBsYWNlX2tleSh0YiwgdGItPkNGTFswXSx0Yi0+bGtleVswXSxQQVRIX0hfUFBBUkVOVCh0Yi0+dGJfcGF0aCwgMCksMCk7CisJICAgIH0KKwl9IAorCisJUkZBTFNFKCAhIGl0ZW1fcG9zICYmICF0Yi0+Q0ZMWzBdLAorCQkiUEFQLTEyMDIwOiB0Yi0+Q0ZMWzBdPT0lcCwgdGItPkxbMF09PSVwIiwgdGItPkNGTFswXSwgdGItPkxbMF0pOworICAgIAorCWJyZWFrOworCisgICAgY2FzZSBNX0NVVDogeyAgLyogY3V0IGl0ZW0gaW4gU1swXSAqLworCWJpLnRiID0gdGI7CisJYmkuYmlfYmggPSB0YlMwOworCWJpLmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgMCk7CisJYmkuYmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCAxKTsKKwlpZiAoaXNfZGlyZW50cnlfbGVfaWggKGloKSkgeworCisJICAgIC8qIFVGUyB1bmxpbmsgc2VtYW50aWNzIGFyZSBzdWNoIHRoYXQgeW91IGNhbiBvbmx5IGRlbGV0ZSBvbmUgZGlyZWN0b3J5IGVudHJ5IGF0IGEgdGltZS4gKi8KKwkgICAgLyogd2hlbiB3ZSBjdXQgYSBkaXJlY3RvcnkgdGItPmluc2VydF9zaXplWzBdIG1lYW5zIG51bWJlciBvZiBlbnRyaWVzIHRvIGJlIGN1dCAoYWx3YXlzIDEpICovCisJICAgIHRiLT5pbnNlcnRfc2l6ZVswXSA9IC0xOworCSAgICBsZWFmX2N1dF9mcm9tX2J1ZmZlciAoJmJpLCBpdGVtX3BvcywgcG9zX2luX2l0ZW0sIC10Yi0+aW5zZXJ0X3NpemVbMF0pOworCisJICAgIFJGQUxTRSggISBpdGVtX3BvcyAmJiAhIHBvc19pbl9pdGVtICYmICEgdGItPkNGTFswXSwKKwkJICAgICJQQVAtMTIwMzA6IGNhbiBub3QgY2hhbmdlIGRlbGltaXRpbmcga2V5LiBDRkxbMF09JXAiLCAKKwkJICAgIHRiLT5DRkxbMF0pOworCisJICAgIGlmICggISBpdGVtX3BvcyAmJiAhIHBvc19pbl9pdGVtICYmIHRiLT5DRkxbMF0gKSB7CisJCXJlcGxhY2Vfa2V5KHRiLCB0Yi0+Q0ZMWzBdLHRiLT5sa2V5WzBdLHRiUzAsMCk7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICBsZWFmX2N1dF9mcm9tX2J1ZmZlciAoJmJpLCBpdGVtX3BvcywgcG9zX2luX2l0ZW0sIC10Yi0+aW5zZXJ0X3NpemVbMF0pOworCisJICAgIFJGQUxTRSggISBpaF9pdGVtX2xlbihpaCksCisJCSJQQVAtMTIwMzU6IGN1dCBtdXN0IGxlYXZlIG5vbi16ZXJvIGR5bmFtaWMgbGVuZ3RoIG9mIGl0ZW0iKTsKKwl9CisJYnJlYWs7CisgICAgfQorCisgICAgZGVmYXVsdDoKKwlwcmludF9jdXJfdGIgKCIxMjA0MCIpOworCXJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJQQVAtMTIwNDA6IGJhbGFuY2VfbGVhZl93aGVuX2RlbGV0ZTogdW5leHBlY3RhYmxlIG1vZGU6ICVzKCVkKSIsCisJCQkoZmxhZyA9PSBNX1BBU1RFKSA/ICJQQVNURSIgOiAoKGZsYWcgPT0gTV9JTlNFUlQpID8gIklOU0VSVCIgOiAiVU5LTk9XTiIpLCBmbGFnKTsKKyAgICB9CisKKyAgICAvKiB0aGUgcnVsZSBpcyB0aGF0IG5vIHNoaWZ0aW5nIG9jY3VycyB1bmxlc3MgYnkgc2hpZnRpbmcgYSBub2RlIGNhbiBiZSBmcmVlZCAqLworICAgIG4gPSBCX05SX0lURU1TKHRiUzApOworICAgIGlmICggdGItPmxudW1bMF0gKSAgICAgLyogTFswXSB0YWtlcyBwYXJ0IGluIGJhbGFuY2luZyAqLworICAgIHsKKwlpZiAoIHRiLT5sbnVtWzBdID09IC0xICkgICAgLyogTFswXSBtdXN0IGJlIGpvaW5lZCB3aXRoIFNbMF0gKi8KKwl7CisJICAgIGlmICggdGItPnJudW1bMF0gPT0gLTEgKSAgICAvKiBSWzBdIG11c3QgYmUgYWxzbyBqb2luZWQgd2l0aCBTWzBdICovCisJICAgIHsJCQkKKwkJaWYgKCB0Yi0+RlJbMF0gPT0gUEFUSF9IX1BQQVJFTlQodGItPnRiX3BhdGgsIDApICkKKwkJeworCQkgICAgLyogYWxsIGNvbnRlbnRzIG9mIGFsbCB0aGUgMyBidWZmZXJzIHdpbGwgYmUgaW4gTFswXSAqLworCQkgICAgaWYgKCBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCAxKSA9PSAwICYmIDEgPCBCX05SX0lURU1TKHRiLT5GUlswXSkgKQorCQkJcmVwbGFjZV9rZXkodGIsIHRiLT5DRkxbMF0sdGItPmxrZXlbMF0sdGItPkZSWzBdLDEpOworCisJCSAgICBsZWFmX21vdmVfaXRlbXMgKExFQUZfRlJPTV9TX1RPX0wsIHRiLCBuLCAtMSwgTlVMTCk7CisJCSAgICBsZWFmX21vdmVfaXRlbXMgKExFQUZfRlJPTV9SX1RPX0wsIHRiLCBCX05SX0lURU1TKHRiLT5SWzBdKSwgLTEsIE5VTEwpOworCisJCSAgICByZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlciAodGIsIHRiUzApOworCQkgICAgcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIgKHRiLCB0Yi0+UlswXSk7CisKKwkJICAgIHJldHVybiAwOworCQl9CisJCS8qIGFsbCBjb250ZW50cyBvZiBhbGwgdGhlIDMgYnVmZmVycyB3aWxsIGJlIGluIFJbMF0gKi8KKwkJbGVhZl9tb3ZlX2l0ZW1zIChMRUFGX0ZST01fU19UT19SLCB0YiwgbiwgLTEsIE5VTEwpOworCQlsZWFmX21vdmVfaXRlbXMgKExFQUZfRlJPTV9MX1RPX1IsIHRiLCBCX05SX0lURU1TKHRiLT5MWzBdKSwgLTEsIE5VTEwpOworCisJCS8qIHJpZ2h0X2RlbGltaXRpbmdfa2V5IGlzIGNvcnJlY3QgaW4gUlswXSAqLworCQlyZXBsYWNlX2tleSh0YiwgdGItPkNGUlswXSx0Yi0+cmtleVswXSx0Yi0+UlswXSwwKTsKKworCQlyZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlciAodGIsIHRiUzApOworCQlyZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlciAodGIsIHRiLT5MWzBdKTsKKworCQlyZXR1cm4gLTE7CisJICAgIH0KKworCSAgICBSRkFMU0UoIHRiLT5ybnVtWzBdICE9IDAsIAorCQkgICAgIlBBUC0xMjA0NTogcm51bSBtdXN0IGJlIDAgKCVkKSIsIHRiLT5ybnVtWzBdKTsKKwkgICAgLyogYWxsIGNvbnRlbnRzIG9mIExbMF0gYW5kIFNbMF0gd2lsbCBiZSBpbiBMWzBdICovCisJICAgIGxlYWZfc2hpZnRfbGVmdCh0YiwgbiwgLTEpOworCisJICAgIHJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyICh0YiwgdGJTMCk7CisKKwkgICAgcmV0dXJuIDA7CisJfQorCS8qIGEgcGFydCBvZiBjb250ZW50cyBvZiBTWzBdIHdpbGwgYmUgaW4gTFswXSBhbmQgdGhlIHJlc3QgcGFydCBvZiBTWzBdIHdpbGwgYmUgaW4gUlswXSAqLworCisJUkZBTFNFKCAoIHRiLT5sbnVtWzBdICsgdGItPnJudW1bMF0gPCBuICkgfHwgCisJCSggdGItPmxudW1bMF0gKyB0Yi0+cm51bVswXSA+IG4rMSApLAorCQkiUEFQLTEyMDUwOiBybnVtKCVkKSBhbmQgbG51bSglZCkgYW5kIGl0ZW0gbnVtYmVyKCVkKSBpbiBTWzBdIGFyZSBub3QgY29uc2lzdGVudCIsCisJCXRiLT5ybnVtWzBdLCB0Yi0+bG51bVswXSwgbik7CisJUkZBTFNFKCAoIHRiLT5sbnVtWzBdICsgdGItPnJudW1bMF0gPT0gbiApICYmIAorCQkodGItPmxieXRlcyAhPSAtMSB8fCB0Yi0+cmJ5dGVzICE9IC0xKSwKKwkJIlBBUC0xMjA1NTogYmFkIHJieXRlcyAoJWQpL2xieXRlcyAoJWQpIHBhcmFtZXRlcnMgd2hlbiBpdGVtcyBhcmUgbm90IHNwbGl0IiwgCisJCXRiLT5yYnl0ZXMsIHRiLT5sYnl0ZXMpOworCVJGQUxTRSggKCB0Yi0+bG51bVswXSArIHRiLT5ybnVtWzBdID09IG4gKyAxICkgJiYgCisJCSh0Yi0+bGJ5dGVzIDwgMSB8fCB0Yi0+cmJ5dGVzICE9IC0xKSwKKwkJIlBBUC0xMjA2MDogYmFkIHJieXRlcyAoJWQpL2xieXRlcyAoJWQpIHBhcmFtZXRlcnMgd2hlbiBpdGVtcyBhcmUgc3BsaXQiLCAKKwkJdGItPnJieXRlcywgdGItPmxieXRlcyk7CisKKwlsZWFmX3NoaWZ0X2xlZnQgKHRiLCB0Yi0+bG51bVswXSwgdGItPmxieXRlcyk7CisJbGVhZl9zaGlmdF9yaWdodCh0YiwgdGItPnJudW1bMF0sIHRiLT5yYnl0ZXMpOworCisJcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIgKHRiLCB0YlMwKTsKKworCXJldHVybiAwOworICAgIH0KKworICAgIGlmICggdGItPnJudW1bMF0gPT0gLTEgKSB7CisJLyogYWxsIGNvbnRlbnRzIG9mIFJbMF0gYW5kIFNbMF0gd2lsbCBiZSBpbiBSWzBdICovCisJbGVhZl9zaGlmdF9yaWdodCh0YiwgbiwgLTEpOworCXJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyICh0YiwgdGJTMCk7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgUkZBTFNFKCB0Yi0+cm51bVswXSwgCisJICAgICJQQVAtMTIwNjU6IGJhZCBybnVtIHBhcmFtZXRlciBtdXN0IGJlIDAgKCVkKSIsIHRiLT5ybnVtWzBdKTsKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGJhbGFuY2VfbGVhZiAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLAorCQkJIHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwJCS8qIGl0ZW0gaGVhZGVyIG9mIGluc2VydGVkIGl0ZW0gKHRoaXMgaXMgb24gbGl0dGxlIGVuZGlhbikgKi8KKwkJCSBjb25zdCBjaGFyICogYm9keSwJCS8qIGJvZHkgIG9mIGluc2VydGVkIGl0ZW0gb3IgYnl0ZXMgdG8gcGFzdGUgKi8KKwkJCSBpbnQgZmxhZywJCQkvKiBpIC0gaW5zZXJ0LCBkIC0gZGVsZXRlLCBjIC0gY3V0LCBwIC0gcGFzdGUKKwkJCQkJCQkgICAoc2VlIGNvbW1lbnQgdG8gZG9fYmFsYW5jZSkgKi8KKwkJCSBzdHJ1Y3QgaXRlbV9oZWFkICogaW5zZXJ0X2tleSwgIC8qIGluIG91ciBwcm9jZXNzaW5nIG9mIG9uZSBsZXZlbCB3ZSBzb21ldGltZXMgZGV0ZXJtaW5lIHdoYXQKKwkJCQkJCQkgICAgbXVzdCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBuZXh0IGhpZ2hlciBsZXZlbC4gIFRoaXMgaW5zZXJ0aW9uCisJCQkJCQkJICAgIGNvbnNpc3RzIG9mIGEga2V5IG9yIHR3byBrZXlzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nCisJCQkJCQkJICAgIHBvaW50ZXJzICovCisJCQkgc3RydWN0IGJ1ZmZlcl9oZWFkICoqIGluc2VydF9wdHIgLyogaW5zZXJ0ZWQgbm9kZS1wdHJzIGZvciB0aGUgbmV4dCBsZXZlbCAqLworICAgICkKK3sKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiB0YlMwID0gUEFUSF9QTEFTVF9CVUZGRVIgKHRiLT50Yl9wYXRoKTsKKyAgICBpbnQgaXRlbV9wb3MgPSBQQVRIX0xBU1RfUE9TSVRJT04gKHRiLT50Yl9wYXRoKTsJLyogIGluZGV4IGludG8gdGhlIGFycmF5IG9mIGl0ZW0gaGVhZGVycyBpbiBTWzBdIAorCQkJCQkJCSAgICBvZiB0aGUgYWZmZWN0ZWQgaXRlbSAqLworICAgIHN0cnVjdCBidWZmZXJfaW5mbyBiaTsKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKlNfbmV3WzJdOyAgLyogbmV3IG5vZGVzIGFsbG9jYXRlZCB0byBob2xkIHdoYXQgY291bGQgbm90IGZpdCBpbnRvIFMgKi8KKyAgICBpbnQgc251bVsyXTsJICAgIC8qIG51bWJlciBvZiBpdGVtcyB0aGF0IHdpbGwgYmUgcGxhY2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50byBTX25ldyAoaW5jbHVkZXMgcGFydGlhbGx5IHNoaWZ0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcykgKi8KKyAgICBpbnQgc2J5dGVzWzJdOyAgICAgICAgICAvKiBpZiBhbiBpdGVtIGlzIHBhcnRpYWxseSBzaGlmdGVkIGludG8gU19uZXcgdGhlbiAKKwkJCSAgICAgICBpZiBpdCBpcyBhIGRpcmVjdG9yeSBpdGVtIAorCQkJICAgICAgIGl0IGlzIHRoZSBudW1iZXIgb2YgZW50cmllcyBmcm9tIHRoZSBpdGVtIHRoYXQgYXJlIHNoaWZ0ZWQgaW50byBTX25ldworCQkJICAgICAgIGVsc2UKKwkJCSAgICAgICBpdCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIGl0ZW0gdGhhdCBhcmUgc2hpZnRlZCBpbnRvIFNfbmV3CisJCQkgICAgKi8KKyAgICBpbnQgbiwgaTsKKyAgICBpbnQgcmV0X3ZhbDsKKyAgICBpbnQgcG9zX2luX2l0ZW07CisgICAgaW50IHplcm9zX251bTsKKworICAgIFBST0NfSU5GT19JTkMoIHRiIC0+IHRiX3NiLCBiYWxhbmNlX2F0WyAwIF0gKTsKKworICAgIC8qIE1ha2UgYmFsYW5jZSBpbiBjYXNlIGluc2VydF9zaXplWzBdIDwgMCAqLworICAgIGlmICggdGItPmluc2VydF9zaXplWzBdIDwgMCApCisJcmV0dXJuIGJhbGFuY2VfbGVhZl93aGVuX2RlbGV0ZSAodGIsIGZsYWcpOworICAKKyAgICB6ZXJvc19udW0gPSAwOworICAgIGlmIChmbGFnID09IE1fSU5TRVJUICYmIGJvZHkgPT0gMCkKKwl6ZXJvc19udW0gPSBpaF9pdGVtX2xlbiggaWggKTsKKworICAgIHBvc19pbl9pdGVtID0gdGItPnRiX3BhdGgtPnBvc19pbl9pdGVtOworICAgIC8qIGZvciBpbmRpcmVjdCBpdGVtIHBvc19pbl9pdGVtIGlzIG1lYXN1cmVkIGluIHVuZm9ybWF0dGVkIG5vZGUKKyAgICAgICBwb2ludGVycy4gUmVjYWxjdWxhdGUgdG8gYnl0ZXMgKi8KKyAgICBpZiAoZmxhZyAhPSBNX0lOU0VSVCAmJiBpc19pbmRpcmVjdF9sZV9paCAoQl9OX1BJVEVNX0hFQUQgKHRiUzAsIGl0ZW1fcG9zKSkpCisJcG9zX2luX2l0ZW0gKj0gVU5GTV9QX1NJWkU7CisKKyAgICBpZiAoIHRiLT5sbnVtWzBdID4gMCApIHsKKwkvKiBTaGlmdCBsbnVtWzBdIGl0ZW1zIGZyb20gU1swXSB0byB0aGUgbGVmdCBuZWlnaGJvciBMWzBdICovCisJaWYgKCBpdGVtX3BvcyA8IHRiLT5sbnVtWzBdICkgeworCSAgICAvKiBuZXcgaXRlbSBvciBpdCBwYXJ0IGZhbGxzIHRvIExbMF0sIHNoaWZ0IGl0IHRvbyAqLworCSAgICBuID0gQl9OUl9JVEVNUyh0Yi0+TFswXSk7CisKKwkgICAgc3dpdGNoIChmbGFnKSB7CisJICAgIGNhc2UgTV9JTlNFUlQ6ICAgLyogaW5zZXJ0IGl0ZW0gaW50byBMWzBdICovCisKKwkJaWYgKCBpdGVtX3BvcyA9PSB0Yi0+bG51bVswXSAtIDEgJiYgdGItPmxieXRlcyAhPSAtMSApIHsKKwkJICAgIC8qIHBhcnQgb2YgbmV3IGl0ZW0gZmFsbHMgaW50byBMWzBdICovCisJCSAgICBpbnQgbmV3X2l0ZW1fbGVuOworCQkgICAgaW50IHZlcnNpb247CisKKwkJICAgIHJldF92YWwgPSBsZWFmX3NoaWZ0X2xlZnQgKHRiLCB0Yi0+bG51bVswXS0xLCAtMSk7CisKKwkJICAgIC8qIENhbGN1bGF0ZSBpdGVtIGxlbmd0aCB0byBpbnNlcnQgdG8gU1swXSAqLworCQkgICAgbmV3X2l0ZW1fbGVuID0gaWhfaXRlbV9sZW4oaWgpIC0gdGItPmxieXRlczsKKwkJICAgIC8qIENhbGN1bGF0ZSBhbmQgY2hlY2sgaXRlbSBsZW5ndGggdG8gaW5zZXJ0IHRvIExbMF0gKi8KKwkJICAgIHB1dF9paF9pdGVtX2xlbihpaCwgaWhfaXRlbV9sZW4oaWgpIC0gbmV3X2l0ZW1fbGVuICk7CisKKwkJICAgIFJGQUxTRSggaWhfaXRlbV9sZW4oaWgpIDw9IDAsCisJCQkgICAgIlBBUC0xMjA4MDogdGhlcmUgaXMgbm90aGluZyB0byBpbnNlcnQgaW50byBMWzBdOiBpaF9pdGVtX2xlbj0lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWhfaXRlbV9sZW4oaWgpKTsKKworCQkgICAgLyogSW5zZXJ0IG5ldyBpdGVtIGludG8gTFswXSAqLworCQkgICAgYmkudGIgPSB0YjsKKwkJICAgIGJpLmJpX2JoID0gdGItPkxbMF07CisJCSAgICBiaS5iaV9wYXJlbnQgPSB0Yi0+RkxbMF07CisJCSAgICBiaS5iaV9wb3NpdGlvbiA9IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgMCk7CisJCSAgICBsZWFmX2luc2VydF9pbnRvX2J1ZiAoJmJpLCBuICsgaXRlbV9wb3MgLSByZXRfdmFsLCBpaCwgYm9keSwKKwkJCQkJICB6ZXJvc19udW0gPiBpaF9pdGVtX2xlbihpaCkgPyBpaF9pdGVtX2xlbihpaCkgOiB6ZXJvc19udW0pOworCisJCSAgICB2ZXJzaW9uID0gaWhfdmVyc2lvbiAoaWgpOworCisJCSAgICAvKiBDYWxjdWxhdGUga2V5IGNvbXBvbmVudCwgaXRlbSBsZW5ndGggYW5kIGJvZHkgdG8gaW5zZXJ0IGludG8gU1swXSAqLworICAgICAgICAgICAgICAgICAgICBzZXRfbGVfaWhfa19vZmZzZXQoIGloLCBsZV9paF9rX29mZnNldCggaWggKSArICh0Yi0+bGJ5dGVzIDw8IChpc19pbmRpcmVjdF9sZV9paChpaCk/dGItPnRiX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gVU5GTV9QX1NISUZUOjApKSApOworCisJCSAgICBwdXRfaWhfaXRlbV9sZW4oIGloLCBuZXdfaXRlbV9sZW4gKTsKKwkJICAgIGlmICggdGItPmxieXRlcyA+ICB6ZXJvc19udW0gKSB7CisJCQlib2R5ICs9ICh0Yi0+bGJ5dGVzIC0gemVyb3NfbnVtKTsKKwkJCXplcm9zX251bSA9IDA7CisJCSAgICB9CisJCSAgICBlbHNlCisJCQl6ZXJvc19udW0gLT0gdGItPmxieXRlczsKKworCQkgICAgUkZBTFNFKCBpaF9pdGVtX2xlbihpaCkgPD0gMCwKKwkJCSJQQVAtMTIwODU6IHRoZXJlIGlzIG5vdGhpbmcgdG8gaW5zZXJ0IGludG8gU1swXTogaWhfaXRlbV9sZW49JWQiLAorCQkJaWhfaXRlbV9sZW4oaWgpKTsKKwkJfSBlbHNlIHsKKwkJICAgIC8qIG5ldyBpdGVtIGluIHdob2xlIGZhbGxzIGludG8gTFswXSAqLworCQkgICAgLyogU2hpZnQgbG51bVswXS0xIGl0ZW1zIHRvIExbMF0gKi8KKwkJICAgIHJldF92YWwgPSBsZWFmX3NoaWZ0X2xlZnQodGIsIHRiLT5sbnVtWzBdLTEsIHRiLT5sYnl0ZXMpOworCQkgICAgLyogSW5zZXJ0IG5ldyBpdGVtIGludG8gTFswXSAqLworCQkgICAgYmkudGIgPSB0YjsKKwkJICAgIGJpLmJpX2JoID0gdGItPkxbMF07CisJCSAgICBiaS5iaV9wYXJlbnQgPSB0Yi0+RkxbMF07CisJCSAgICBiaS5iaV9wb3NpdGlvbiA9IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgMCk7CisJCSAgICBsZWFmX2luc2VydF9pbnRvX2J1ZiAoJmJpLCBuICsgaXRlbV9wb3MgLSByZXRfdmFsLCBpaCwgYm9keSwgemVyb3NfbnVtKTsKKwkJICAgIHRiLT5pbnNlcnRfc2l6ZVswXSA9IDA7CisJCSAgICB6ZXJvc19udW0gPSAwOworCQl9CisJCWJyZWFrOworCisJICAgIGNhc2UgTV9QQVNURTogICAvKiBhcHBlbmQgaXRlbSBpbiBMWzBdICovCisKKwkJaWYgKCBpdGVtX3BvcyA9PSB0Yi0+bG51bVswXSAtIDEgJiYgdGItPmxieXRlcyAhPSAtMSApIHsKKwkJICAgIC8qIHdlIG11c3Qgc2hpZnQgdGhlIHBhcnQgb2YgdGhlIGFwcGVuZGVkIGl0ZW0gKi8KKwkJICAgIGlmICggaXNfZGlyZW50cnlfbGVfaWggKEJfTl9QSVRFTV9IRUFEICh0YlMwLCBpdGVtX3BvcykpKSB7CisKKwkJCVJGQUxTRSggemVyb3NfbnVtLAorCQkJCSJQQVAtMTIwOTA6IGludmFsaWQgcGFyYW1ldGVyIGluIGNhc2Ugb2YgYSBkaXJlY3RvcnkiKTsKKwkJCS8qIGRpcmVjdG9yeSBpdGVtICovCisJCQlpZiAoIHRiLT5sYnl0ZXMgPiBwb3NfaW5faXRlbSApIHsKKwkJCSAgICAvKiBuZXcgZGlyZWN0b3J5IGVudHJ5IGZhbGxzIGludG8gTFswXSAqLworCQkJICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBwYXN0ZWQ7CisJCQkgICAgaW50IGxfcG9zX2luX2l0ZW0gPSBwb3NfaW5faXRlbTsKKwkJCQkJCQkgIAorCQkJICAgIC8qIFNoaWZ0IGxudW1bMF0gLSAxIGl0ZW1zIGluIHdob2xlLiBTaGlmdCBsYnl0ZXMgLSAxIGVudHJpZXMgZnJvbSBnaXZlbiBkaXJlY3RvcnkgaXRlbSAqLworCQkJICAgIHJldF92YWwgPSBsZWFmX3NoaWZ0X2xlZnQodGIsIHRiLT5sbnVtWzBdLCB0Yi0+bGJ5dGVzIC0gMSk7CisJCQkgICAgaWYgKCByZXRfdmFsICYmICEgaXRlbV9wb3MgKSB7CisJCQkJcGFzdGVkID0gIEJfTl9QSVRFTV9IRUFEKHRiLT5MWzBdLEJfTlJfSVRFTVModGItPkxbMF0pLTEpOworCQkJCWxfcG9zX2luX2l0ZW0gKz0gSV9FTlRSWV9DT1VOVChwYXN0ZWQpIC0gKHRiLT5sYnl0ZXMtMSk7CisJCQkgICAgfQorCisJCQkgICAgLyogQXBwZW5kIGdpdmVuIGRpcmVjdG9yeSBlbnRyeSB0byBkaXJlY3RvcnkgaXRlbSAqLworCQkJICAgIGJpLnRiID0gdGI7CisJCQkgICAgYmkuYmlfYmggPSB0Yi0+TFswXTsKKwkJCSAgICBiaS5iaV9wYXJlbnQgPSB0Yi0+RkxbMF07CisJCQkgICAgYmkuYmlfcG9zaXRpb24gPSBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIDApOworCQkJICAgIGxlYWZfcGFzdGVfaW5fYnVmZmVyICgmYmksIG4gKyBpdGVtX3BvcyAtIHJldF92YWwsIGxfcG9zX2luX2l0ZW0sCisJCQkJCQkgIHRiLT5pbnNlcnRfc2l6ZVswXSwgYm9keSwgemVyb3NfbnVtKTsKKworCQkJICAgIC8qIHByZXZpb3VzIHN0cmluZyBwcmVwYXJlZCBzcGFjZSBmb3IgcGFzdGluZyBuZXcgZW50cnksIGZvbGxvd2luZyBzdHJpbmcgcGFzdGVzIHRoaXMgZW50cnkgKi8KKworCQkJICAgIC8qIHdoZW4gd2UgaGF2ZSBtZXJnZSBkaXJlY3RvcnkgaXRlbSwgcG9zX2luX2l0ZW0gaGFzIGJlZW4gY2hhbmdlZCB0b28gKi8KKworCQkJICAgIC8qIHBhc3RlIG5ldyBkaXJlY3RvcnkgZW50cnkuIDEgaXMgZW50cnkgbnVtYmVyICovCisJCQkgICAgbGVhZl9wYXN0ZV9lbnRyaWVzIChiaS5iaV9iaCwgbiArIGl0ZW1fcG9zIC0gcmV0X3ZhbCwgbF9wb3NfaW5faXRlbSwgMSwKKwkJCQkJCShzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKWJvZHksIAorCQkJCQkJYm9keSArIERFSF9TSVpFLCB0Yi0+aW5zZXJ0X3NpemVbMF0KKwkJCQkpOworCQkJICAgIHRiLT5pbnNlcnRfc2l6ZVswXSA9IDA7CisJCQl9IGVsc2UgeworCQkJICAgIC8qIG5ldyBkaXJlY3RvcnkgaXRlbSBkb2Vzbid0IGZhbGwgaW50byBMWzBdICovCisJCQkgICAgLyogU2hpZnQgbG51bVswXS0xIGl0ZW1zIGluIHdob2xlLiBTaGlmdCBsYnl0ZXMgZGlyZWN0b3J5IGVudHJpZXMgZnJvbSBkaXJlY3RvcnkgaXRlbSBudW1iZXIgbG51bVswXSAqLworCQkJICAgIGxlYWZfc2hpZnRfbGVmdCAodGIsIHRiLT5sbnVtWzBdLCB0Yi0+bGJ5dGVzKTsKKwkJCX0KKwkJCS8qIENhbGN1bGF0ZSBuZXcgcG9zaXRpb24gdG8gYXBwZW5kIGluIGl0ZW0gYm9keSAqLworCQkJcG9zX2luX2l0ZW0gLT0gdGItPmxieXRlczsKKwkJICAgIH0KKwkJICAgIGVsc2UgeworCQkJLyogcmVndWxhciBvYmplY3QgKi8KKwkJCVJGQUxTRSggdGItPmxieXRlcyA8PSAwLAorCQkJICAgICAgICAiUEFQLTEyMDk1OiB0aGVyZSBpcyBub3RoaW5nIHRvIHNoaWZ0IHRvIExbMF0uIGxieXRlcz0lZCIsCisJCQkJdGItPmxieXRlcyk7CisJCQlSRkFMU0UoIHBvc19pbl9pdGVtICE9IGloX2l0ZW1fbGVuKEJfTl9QSVRFTV9IRUFEKHRiUzAsIGl0ZW1fcG9zKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQQVAtMTIxMDA6IGluY29ycmVjdCBwb3NpdGlvbiB0byBwYXN0ZTogaXRlbV9sZW49JWQsIHBvc19pbl9pdGVtPSVkIiwKKwkJCQlpaF9pdGVtX2xlbihCX05fUElURU1fSEVBRCh0YlMwLGl0ZW1fcG9zKSksIHBvc19pbl9pdGVtKTsKKworCQkJaWYgKCB0Yi0+bGJ5dGVzID49IHBvc19pbl9pdGVtICkgeworCQkJICAgIC8qIGFwcGVuZGVkIGl0ZW0gd2lsbCBiZSBpbiBMWzBdIGluIHdob2xlICovCisJCQkgICAgaW50IGxfbjsKKworCQkJICAgIC8qIHRoaXMgYnl0ZXMgbnVtYmVyIG11c3QgYmUgYXBwZW5kZWQgdG8gdGhlIGxhc3QgaXRlbSBvZiBMW2hdICovCisJCQkgICAgbF9uID0gdGItPmxieXRlcyAtIHBvc19pbl9pdGVtOworCisJCQkgICAgLyogQ2FsY3VsYXRlIG5ldyBpbnNlcnRfc2l6ZVswXSAqLworCQkJICAgIHRiLT5pbnNlcnRfc2l6ZVswXSAtPSBsX247CisKKwkJCSAgICBSRkFMU0UoIHRiLT5pbnNlcnRfc2l6ZVswXSA8PSAwLAorCQkJCSAgICAiUEFQLTEyMTA1OiB0aGVyZSBpcyBub3RoaW5nIHRvIHBhc3RlIGludG8gTFswXS4gaW5zZXJ0X3NpemU9JWQiLAorCQkJCSAgICB0Yi0+aW5zZXJ0X3NpemVbMF0pOworCQkJICAgIHJldF92YWwgPSAgbGVhZl9zaGlmdF9sZWZ0KHRiLHRiLT5sbnVtWzBdLCAKKwkJCQkJCSAgICAgICBpaF9pdGVtX2xlbihCX05fUElURU1fSEVBRCh0YlMwLGl0ZW1fcG9zKSkpOworCQkJICAgIC8qIEFwcGVuZCB0byBib2R5IG9mIGl0ZW0gaW4gTFswXSAqLworCQkJICAgIGJpLnRiID0gdGI7CisJCQkgICAgYmkuYmlfYmggPSB0Yi0+TFswXTsKKwkJCSAgICBiaS5iaV9wYXJlbnQgPSB0Yi0+RkxbMF07CisJCQkgICAgYmkuYmlfcG9zaXRpb24gPSBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIDApOworCQkJICAgIGxlYWZfcGFzdGVfaW5fYnVmZmVyKAorCQkJCSZiaSxuICsgaXRlbV9wb3MgLSByZXRfdmFsLAorCQkJCWloX2l0ZW1fbGVuKCBCX05fUElURU1fSEVBRCh0Yi0+TFswXSxuK2l0ZW1fcG9zLXJldF92YWwpKSwKKwkJCQlsX24sYm9keSwgemVyb3NfbnVtID4gbF9uID8gbF9uIDogemVyb3NfbnVtCisJCQkJKTsKKwkJCSAgICAvKiAwLXRoIGl0ZW0gaW4gUzAgY2FuIGJlIG9ubHkgb2YgRElSRUNUIHR5cGUgd2hlbiBsX24gIT0gMCovCisJCQkgICAgeworCQkJCWludCB2ZXJzaW9uOworCQkJCWludCB0ZW1wX2wgPSBsX247CisJCQkJCisJCQkJUkZBTFNFIChpaF9pdGVtX2xlbiAoQl9OX1BJVEVNX0hFQUQgKHRiUzAsIDApKSwKKwkJCQkJIlBBUC0xMjEwNjogaXRlbSBsZW5ndGggbXVzdCBiZSAwIik7CisJCQkJUkZBTFNFIChjb21wX3Nob3J0X2xlX2tleXMgKEJfTl9QS0VZICh0YlMwLCAwKSwKKwkJCQkJCQkgICAgQl9OX1BLRVkgKHRiLT5MWzBdLAorCQkJCQkJCQkJICAgIG4gKyBpdGVtX3BvcyAtIHJldF92YWwpKSwKKwkJCQkJIlBBUC0xMjEwNzogaXRlbXMgbXVzdCBiZSBvZiB0aGUgc2FtZSBmaWxlIik7CisJCQkJaWYgKGlzX2luZGlyZWN0X2xlX2loKEJfTl9QSVRFTV9IRUFEICh0Yi0+TFswXSwKKwkJCQkJCQkJICAgICAgbiArIGl0ZW1fcG9zIC0gcmV0X3ZhbCkpKQl7CisJCQkJICAgIHRlbXBfbCA9IGxfbiA8PCAodGItPnRiX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gVU5GTV9QX1NISUZUKTsKKwkJCQl9CisJCQkJLyogdXBkYXRlIGtleSBvZiBmaXJzdCBpdGVtIGluIFMwICovCisJCQkJdmVyc2lvbiA9IGloX3ZlcnNpb24gKEJfTl9QSVRFTV9IRUFEICh0YlMwLCAwKSk7CisJCQkJc2V0X2xlX2tleV9rX29mZnNldCAodmVyc2lvbiwgQl9OX1BLRVkgKHRiUzAsIDApLCAKKwkJCQkJCSAgICAgbGVfa2V5X2tfb2Zmc2V0ICh2ZXJzaW9uLCBCX05fUEtFWSAodGJTMCwgMCkpICsgdGVtcF9sKTsKKwkJCQkvKiB1cGRhdGUgbGVmdCBkZWxpbWl0aW5nIGtleSAqLworCQkJCXNldF9sZV9rZXlfa19vZmZzZXQgKHZlcnNpb24sIEJfTl9QREVMSU1fS0VZKHRiLT5DRkxbMF0sdGItPmxrZXlbMF0pLAorCQkJCQkJICAgICBsZV9rZXlfa19vZmZzZXQgKHZlcnNpb24sIEJfTl9QREVMSU1fS0VZKHRiLT5DRkxbMF0sdGItPmxrZXlbMF0pKSArIHRlbXBfbCk7CisJCQkgICAgfQorCisJCQkgICAgLyogQ2FsY3VsYXRlIG5ldyBib2R5LCBwb3NpdGlvbiBpbiBpdGVtIGFuZCBpbnNlcnRfc2l6ZVswXSAqLworCQkJICAgIGlmICggbF9uID4gemVyb3NfbnVtICkgeworCQkJCWJvZHkgKz0gKGxfbiAtIHplcm9zX251bSk7CisJCQkJemVyb3NfbnVtID0gMDsKKwkJCSAgICB9CisJCQkgICAgZWxzZQorCQkJCXplcm9zX251bSAtPSBsX247CisJCQkgICAgcG9zX2luX2l0ZW0gPSAwOwkKKworCQkJICAgIFJGQUxTRSggY29tcF9zaG9ydF9sZV9rZXlzIAorCQkJCSAgICAoQl9OX1BLRVkodGJTMCwwKSwKKwkJCQkgICAgIEJfTl9QS0VZKHRiLT5MWzBdLEJfTlJfSVRFTVModGItPkxbMF0pLTEpKSB8fAorCQkJCQorCQkJCSAgICAhb3BfaXNfbGVmdF9tZXJnZWFibGUgCisJCQkJICAgIChCX05fUEtFWSAodGJTMCwgMCksIHRiUzAtPmJfc2l6ZSkgfHwKKwkJCQkgICAgIW9wX2lzX2xlZnRfbWVyZ2VhYmxlCisJCQkJICAgIChCX05fUERFTElNX0tFWSh0Yi0+Q0ZMWzBdLHRiLT5sa2V5WzBdKSwgCisJCQkJICAgICB0YlMwLT5iX3NpemUpLAorCQkJCSAgICAiUEFQLTEyMTIwOiBpdGVtIG11c3QgYmUgbWVyZ2UtYWJsZSB3aXRoIGxlZnQgbmVpZ2hib3JpbmcgaXRlbSIpOworCQkJfQorCQkJZWxzZSAvKiBvbmx5IHBhcnQgb2YgdGhlIGFwcGVuZGVkIGl0ZW0gd2lsbCBiZSBpbiBMWzBdICovCisJCQl7CisJCQkgICAgLyogQ2FsY3VsYXRlIHBvc2l0aW9uIGluIGl0ZW0gZm9yIGFwcGVuZCBpbiBTWzBdICovCisJCQkgICAgcG9zX2luX2l0ZW0gLT0gdGItPmxieXRlczsKKworCQkJICAgIFJGQUxTRSggcG9zX2luX2l0ZW0gPD0gMCwKKwkJCQkgICAgIlBBUC0xMjEyNTogbm8gcGxhY2UgZm9yIHBhc3RlLiBwb3NfaW5faXRlbT0lZCIsIHBvc19pbl9pdGVtKTsKKworCQkJICAgIC8qIFNoaWZ0IGxudW1bMF0gLSAxIGl0ZW1zIGluIHdob2xlLiBTaGlmdCBsYnl0ZXMgLSAxIGJ5dGUgZnJvbSBpdGVtIG51bWJlciBsbnVtWzBdICovCisJCQkgICAgbGVhZl9zaGlmdF9sZWZ0KHRiLHRiLT5sbnVtWzBdLHRiLT5sYnl0ZXMpOworCQkJfQorCQkgICAgfQorCQl9CisJCWVsc2UgLyogYXBwZW5kZWQgaXRlbSB3aWxsIGJlIGluIExbMF0gaW4gd2hvbGUgKi8KKwkJeworCQkgICAgc3RydWN0IGl0ZW1faGVhZCAqIHBhc3RlZDsKKworCQkJaWYgKCAhIGl0ZW1fcG9zICAmJiBvcF9pc19sZWZ0X21lcmdlYWJsZSAoQl9OX1BLRVkgKHRiUzAsIDApLCB0YlMwLT5iX3NpemUpICkKKwkJCXsgLyogaWYgd2UgcGFzdGUgaW50byBmaXJzdCBpdGVtIG9mIFNbMF0gYW5kIGl0IGlzIGxlZnQgbWVyZ2FibGUgKi8KKwkJCSAgICAvKiB0aGVuIGluY3JlbWVudCBwb3NfaW5faXRlbSBieSB0aGUgc2l6ZSBvZiB0aGUgbGFzdCBpdGVtIGluIExbMF0gKi8KKwkJCSAgICBwYXN0ZWQgPSBCX05fUElURU1fSEVBRCh0Yi0+TFswXSxuLTEpOworCQkJICAgIGlmICggaXNfZGlyZW50cnlfbGVfaWggKHBhc3RlZCkgKQorCQkJCXBvc19pbl9pdGVtICs9IGloX2VudHJ5X2NvdW50KHBhc3RlZCk7CisJCQkgICAgZWxzZQorCQkJCXBvc19pbl9pdGVtICs9IGloX2l0ZW1fbGVuKHBhc3RlZCk7CisJCQl9CisKKwkJICAgIC8qIFNoaWZ0IGxudW1bMF0gLSAxIGl0ZW1zIGluIHdob2xlLiBTaGlmdCBsYnl0ZXMgLSAxIGJ5dGUgZnJvbSBpdGVtIG51bWJlciBsbnVtWzBdICovCisJCSAgICByZXRfdmFsID0gbGVhZl9zaGlmdF9sZWZ0KHRiLHRiLT5sbnVtWzBdLHRiLT5sYnl0ZXMpOworCQkgICAgLyogQXBwZW5kIHRvIGJvZHkgb2YgaXRlbSBpbiBMWzBdICovCisJCSAgICBiaS50YiA9IHRiOworCQkgICAgYmkuYmlfYmggPSB0Yi0+TFswXTsKKwkJICAgIGJpLmJpX3BhcmVudCA9IHRiLT5GTFswXTsKKwkJICAgIGJpLmJpX3Bvc2l0aW9uID0gZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCAwKTsKKwkJICAgIGxlYWZfcGFzdGVfaW5fYnVmZmVyICgmYmksIG4gKyBpdGVtX3BvcyAtIHJldF92YWwsIHBvc19pbl9pdGVtLCB0Yi0+aW5zZXJ0X3NpemVbMF0sCisJCQkJCSAgYm9keSwgemVyb3NfbnVtKTsKKworCQkgICAgLyogaWYgYXBwZW5kZWQgaXRlbSBpcyBkaXJlY3RvcnksIHBhc3RlIGVudHJ5ICovCisJCSAgICBwYXN0ZWQgPSBCX05fUElURU1fSEVBRCAodGItPkxbMF0sIG4gKyBpdGVtX3BvcyAtIHJldF92YWwpOworCQkgICAgaWYgKGlzX2RpcmVudHJ5X2xlX2loIChwYXN0ZWQpKQorCQkJbGVhZl9wYXN0ZV9lbnRyaWVzICgKKwkJCSAgICBiaS5iaV9iaCwgbiArIGl0ZW1fcG9zIC0gcmV0X3ZhbCwgcG9zX2luX2l0ZW0sIDEsIAorCQkJICAgIChzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKWJvZHksIGJvZHkgKyBERUhfU0laRSwgdGItPmluc2VydF9zaXplWzBdCisJCQkgICAgKTsKKwkJICAgIC8qIGlmIGFwcGVuZGVkIGl0ZW0gaXMgaW5kaXJlY3QgaXRlbSwgcHV0IHVuZm9ybWF0dGVkIG5vZGUgaW50byB1biBsaXN0ICovCisJCSAgICBpZiAoaXNfaW5kaXJlY3RfbGVfaWggKHBhc3RlZCkpCisJCQlzZXRfaWhfZnJlZV9zcGFjZSAocGFzdGVkLCAwKTsKKwkJICAgIHRiLT5pbnNlcnRfc2l6ZVswXSA9IDA7CisJCSAgICB6ZXJvc19udW0gPSAwOworCQl9CisJCWJyZWFrOworCSAgICBkZWZhdWx0OiAgICAvKiBjYXNlcyBkIGFuZCB0ICovCisJCXJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJQQVAtMTIxMzA6IGJhbGFuY2VfbGVhZjogbG51bSA+IDA6IHVuZXhwZWN0YWJsZSBtb2RlOiAlcyglZCkiLAorCQkJCShmbGFnID09IE1fREVMRVRFKSA/ICJERUxFVEUiIDogKChmbGFnID09IE1fQ1VUKSA/ICJDVVQiIDogIlVOS05PV04iKSwgZmxhZyk7CisJICAgIH0KKwl9IGVsc2UgeyAKKwkgICAgLyogbmV3IGl0ZW0gZG9lc24ndCBmYWxsIGludG8gTFswXSAqLworCSAgICBsZWFmX3NoaWZ0X2xlZnQodGIsdGItPmxudW1bMF0sdGItPmxieXRlcyk7CisJfQorICAgIH0JLyogdGItPmxudW1bMF0gPiAwICovCisKKyAgICAvKiBDYWxjdWxhdGUgbmV3IGl0ZW0gcG9zaXRpb24gKi8KKyAgICBpdGVtX3BvcyAtPSAoIHRiLT5sbnVtWzBdIC0gKCggdGItPmxieXRlcyAhPSAtMSApID8gMSA6IDApKTsKKworICAgIGlmICggdGItPnJudW1bMF0gPiAwICkgeworCS8qIHNoaWZ0IHJudW1bMF0gaXRlbXMgZnJvbSBTWzBdIHRvIHRoZSByaWdodCBuZWlnaGJvciBSWzBdICovCisJbiA9IEJfTlJfSVRFTVModGJTMCk7CisJc3dpdGNoICggZmxhZyApIHsKKworCWNhc2UgTV9JTlNFUlQ6ICAgLyogaW5zZXJ0IGl0ZW0gKi8KKwkgICAgaWYgKCBuIC0gdGItPnJudW1bMF0gPCBpdGVtX3BvcyApCisJICAgIHsgLyogbmV3IGl0ZW0gb3IgaXRzIHBhcnQgZmFsbHMgdG8gUlswXSAqLworCQlpZiAoIGl0ZW1fcG9zID09IG4gLSB0Yi0+cm51bVswXSArIDEgJiYgdGItPnJieXRlcyAhPSAtMSApCisJCXsgLyogcGFydCBvZiBuZXcgaXRlbSBmYWxscyBpbnRvIFJbMF0gKi8KKwkJICAgIGxvZmZfdCBvbGRfa2V5X2NvbXAsIG9sZF9sZW4sIHJfemVyb3NfbnVtYmVyOworCQkgICAgY29uc3QgY2hhciAqIHJfYm9keTsKKwkJICAgIGludCB2ZXJzaW9uOworCQkgICAgbG9mZl90IG9mZnNldDsKKworCQkgICAgbGVhZl9zaGlmdF9yaWdodCh0Yix0Yi0+cm51bVswXS0xLC0xKTsKKworCQkgICAgdmVyc2lvbiA9IGloX3ZlcnNpb24oaWgpOworCQkgICAgLyogUmVtZW1iZXIga2V5IGNvbXBvbmVudCBhbmQgaXRlbSBsZW5ndGggKi8KKyAgICAgICAgICAgICAgICAgICAgb2xkX2tleV9jb21wID0gbGVfaWhfa19vZmZzZXQoIGloICk7CisJCSAgICBvbGRfbGVuID0gaWhfaXRlbV9sZW4oaWgpOworCisJCSAgICAvKiBDYWxjdWxhdGUga2V5IGNvbXBvbmVudCBhbmQgaXRlbSBsZW5ndGggdG8gaW5zZXJ0IGludG8gUlswXSAqLworICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBsZV9paF9rX29mZnNldCggaWggKSArICgob2xkX2xlbiAtIHRiLT5yYnl0ZXMgKTw8KGlzX2luZGlyZWN0X2xlX2loKGloKT90Yi0+dGJfc2ItPnNfYmxvY2tzaXplX2JpdHMgLSBVTkZNX1BfU0hJRlQ6MCkpOworICAgICAgICAgICAgICAgICAgICBzZXRfbGVfaWhfa19vZmZzZXQoIGloLCBvZmZzZXQgKTsKKwkJICAgIHB1dF9paF9pdGVtX2xlbiggaWgsIHRiLT5yYnl0ZXMpOworCQkgICAgLyogSW5zZXJ0IHBhcnQgb2YgdGhlIGl0ZW0gaW50byBSWzBdICovCisJCSAgICBiaS50YiA9IHRiOworCQkgICAgYmkuYmlfYmggPSB0Yi0+UlswXTsKKwkJICAgIGJpLmJpX3BhcmVudCA9IHRiLT5GUlswXTsKKwkJICAgIGJpLmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgMCk7CisJCSAgICBpZiAoIChvbGRfbGVuIC0gdGItPnJieXRlcykgPiB6ZXJvc19udW0gKSB7CisJCQlyX3plcm9zX251bWJlciA9IDA7CisJCQlyX2JvZHkgPSBib2R5ICsgKG9sZF9sZW4gLSB0Yi0+cmJ5dGVzKSAtIHplcm9zX251bTsKKwkJICAgIH0KKwkJICAgIGVsc2UgeworCQkJcl9ib2R5ID0gYm9keTsKKwkJCXJfemVyb3NfbnVtYmVyID0gemVyb3NfbnVtIC0gKG9sZF9sZW4gLSB0Yi0+cmJ5dGVzKTsKKwkJCXplcm9zX251bSAtPSByX3plcm9zX251bWJlcjsKKwkJICAgIH0KKworCQkgICAgbGVhZl9pbnNlcnRfaW50b19idWYgKCZiaSwgMCwgaWgsIHJfYm9keSwgcl96ZXJvc19udW1iZXIpOworCisJCSAgICAvKiBSZXBsYWNlIHJpZ2h0IGRlbGltaXRpbmcga2V5IGJ5IGZpcnN0IGtleSBpbiBSWzBdICovCisJCSAgICByZXBsYWNlX2tleSh0YiwgdGItPkNGUlswXSx0Yi0+cmtleVswXSx0Yi0+UlswXSwwKTsKKworCQkgICAgLyogQ2FsY3VsYXRlIGtleSBjb21wb25lbnQgYW5kIGl0ZW0gbGVuZ3RoIHRvIGluc2VydCBpbnRvIFNbMF0gKi8KKyAgICAgICAgICAgICAgICAgICAgc2V0X2xlX2loX2tfb2Zmc2V0KCBpaCwgb2xkX2tleV9jb21wICk7CisJCSAgICBwdXRfaWhfaXRlbV9sZW4oIGloLCBvbGRfbGVuIC0gdGItPnJieXRlcyApOworCisJCSAgICB0Yi0+aW5zZXJ0X3NpemVbMF0gLT0gdGItPnJieXRlczsKKworCQl9CisJCWVsc2UgLyogd2hvbGUgbmV3IGl0ZW0gZmFsbHMgaW50byBSWzBdICovCisJCXsJCQkJCSAgCisJCSAgICAvKiBTaGlmdCBybnVtWzBdLTEgaXRlbXMgdG8gUlswXSAqLworCQkgICAgcmV0X3ZhbCA9IGxlYWZfc2hpZnRfcmlnaHQodGIsdGItPnJudW1bMF0tMSx0Yi0+cmJ5dGVzKTsKKwkJICAgIC8qIEluc2VydCBuZXcgaXRlbSBpbnRvIFJbMF0gKi8KKwkJICAgIGJpLnRiID0gdGI7CisJCSAgICBiaS5iaV9iaCA9IHRiLT5SWzBdOworCQkgICAgYmkuYmlfcGFyZW50ID0gdGItPkZSWzBdOworCQkgICAgYmkuYmlfcG9zaXRpb24gPSBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCAwKTsKKwkJICAgIGxlYWZfaW5zZXJ0X2ludG9fYnVmICgmYmksIGl0ZW1fcG9zIC0gbiArIHRiLT5ybnVtWzBdIC0gMSwgaWgsIGJvZHksIHplcm9zX251bSk7CisKKwkJICAgIGlmICggaXRlbV9wb3MgLSBuICsgdGItPnJudW1bMF0gLSAxID09IDAgKSB7CisJCQlyZXBsYWNlX2tleSh0YiwgdGItPkNGUlswXSx0Yi0+cmtleVswXSx0Yi0+UlswXSwwKTsKKworCQkgICAgfQorCQkgICAgemVyb3NfbnVtID0gdGItPmluc2VydF9zaXplWzBdID0gMDsKKwkJfQorCSAgICB9CisJICAgIGVsc2UgLyogbmV3IGl0ZW0gb3IgcGFydCBvZiBpdCBkb2Vzbid0IGZhbGwgaW50byBSWzBdICovCisJICAgIHsKKwkJbGVhZl9zaGlmdF9yaWdodCh0Yix0Yi0+cm51bVswXSx0Yi0+cmJ5dGVzKTsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgTV9QQVNURTogICAvKiBhcHBlbmQgaXRlbSAqLworCisJICAgIGlmICggbiAtIHRiLT5ybnVtWzBdIDw9IGl0ZW1fcG9zICkgIC8qIHBhc3RlZCBpdGVtIG9yIHBhcnQgb2YgaXQgZmFsbHMgdG8gUlswXSAqLworCSAgICB7CisJCWlmICggaXRlbV9wb3MgPT0gbiAtIHRiLT5ybnVtWzBdICYmIHRiLT5yYnl0ZXMgIT0gLTEgKQorCQl7IC8qIHdlIG11c3Qgc2hpZnQgdGhlIHBhcnQgb2YgdGhlIGFwcGVuZGVkIGl0ZW0gKi8KKwkJICAgIGlmICggaXNfZGlyZW50cnlfbGVfaWggKEJfTl9QSVRFTV9IRUFEKHRiUzAsIGl0ZW1fcG9zKSkpCisJCSAgICB7IC8qIHdlIGFwcGVuZCB0byBkaXJlY3RvcnkgaXRlbSAqLworCQkJaW50IGVudHJ5X2NvdW50OworCisJCQlSRkFMU0UoIHplcm9zX251bSwKKwkJCQkiUEFQLTEyMTQ1OiBpbnZhbGlkIHBhcmFtZXRlciBpbiBjYXNlIG9mIGEgZGlyZWN0b3J5Iik7CisJCQllbnRyeV9jb3VudCA9IElfRU5UUllfQ09VTlQoQl9OX1BJVEVNX0hFQUQodGJTMCwgaXRlbV9wb3MpKTsKKwkJCWlmICggZW50cnlfY291bnQgLSB0Yi0+cmJ5dGVzIDwgcG9zX2luX2l0ZW0gKQorCQkJICAgIC8qIG5ldyBkaXJlY3RvcnkgZW50cnkgZmFsbHMgaW50byBSWzBdICovCisJCQl7CisJCQkgICAgaW50IHBhc3RlX2VudHJ5X3Bvc2l0aW9uOworCisJCQkgICAgUkZBTFNFKCB0Yi0+cmJ5dGVzIC0gMSA+PSBlbnRyeV9jb3VudCB8fCAKKwkJCQkgICAgISB0Yi0+aW5zZXJ0X3NpemVbMF0sCisJCQkJICAgICJQQVAtMTIxNTA6IG5vIGVub3VnaCBvZiBlbnRyaWVzIHRvIHNoaWZ0IHRvIFJbMF06IHJieXRlcz0lZCwgZW50cnlfY291bnQ9JWQiLAorCQkJCSAgICB0Yi0+cmJ5dGVzLCBlbnRyeV9jb3VudCk7CisJCQkgICAgLyogU2hpZnQgcm51bVswXS0xIGl0ZW1zIGluIHdob2xlLiBTaGlmdCByYnl0ZXMtMSBkaXJlY3RvcnkgZW50cmllcyBmcm9tIGRpcmVjdG9yeSBpdGVtIG51bWJlciBybnVtWzBdICovCisJCQkgICAgbGVhZl9zaGlmdF9yaWdodCh0Yix0Yi0+cm51bVswXSx0Yi0+cmJ5dGVzIC0gMSk7CisJCQkgICAgLyogUGFzdGUgZ2l2ZW4gZGlyZWN0b3J5IGVudHJ5IHRvIGRpcmVjdG9yeSBpdGVtICovCisJCQkgICAgcGFzdGVfZW50cnlfcG9zaXRpb24gPSBwb3NfaW5faXRlbSAtIGVudHJ5X2NvdW50ICsgdGItPnJieXRlcyAtIDE7CisJCQkgICAgYmkudGIgPSB0YjsKKwkJCSAgICBiaS5iaV9iaCA9IHRiLT5SWzBdOworCQkJICAgIGJpLmJpX3BhcmVudCA9IHRiLT5GUlswXTsKKwkJCSAgICBiaS5iaV9wb3NpdGlvbiA9IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIDApOworCQkJICAgIGxlYWZfcGFzdGVfaW5fYnVmZmVyICgmYmksIDAsIHBhc3RlX2VudHJ5X3Bvc2l0aW9uLAorCQkJCQkJICB0Yi0+aW5zZXJ0X3NpemVbMF0sYm9keSx6ZXJvc19udW0pOworCQkJICAgIC8qIHBhc3RlIGVudHJ5ICovCisJCQkgICAgbGVhZl9wYXN0ZV9lbnRyaWVzICgKKwkJCQliaS5iaV9iaCwgMCwgcGFzdGVfZW50cnlfcG9zaXRpb24sIDEsIChzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKWJvZHksIAorCQkJCWJvZHkgKyBERUhfU0laRSwgdGItPmluc2VydF9zaXplWzBdCisJCQkJKTsJCQkJCQkJCQorCQkJCQkJCisJCQkgICAgaWYgKCBwYXN0ZV9lbnRyeV9wb3NpdGlvbiA9PSAwICkgeworCQkJCS8qIGNoYW5nZSBkZWxpbWl0aW5nIGtleXMgKi8KKwkJCQlyZXBsYWNlX2tleSh0YiwgdGItPkNGUlswXSx0Yi0+cmtleVswXSx0Yi0+UlswXSwwKTsKKwkJCSAgICB9CisKKwkJCSAgICB0Yi0+aW5zZXJ0X3NpemVbMF0gPSAwOworCQkJICAgIHBvc19pbl9pdGVtKys7CisJCQl9CisJCQllbHNlIC8qIG5ldyBkaXJlY3RvcnkgZW50cnkgZG9lc24ndCBmYWxsIGludG8gUlswXSAqLworCQkJeworCQkJICAgIGxlYWZfc2hpZnRfcmlnaHQodGIsdGItPnJudW1bMF0sdGItPnJieXRlcyk7CisJCQl9CisJCSAgICB9CisJCSAgICBlbHNlIC8qIHJlZ3VsYXIgb2JqZWN0ICovCisJCSAgICB7CisJCQlpbnQgbl9zaGlmdCwgbl9yZW0sIHJfemVyb3NfbnVtYmVyOworCQkJY29uc3QgY2hhciAqIHJfYm9keTsKKworCQkJLyogQ2FsY3VsYXRlIG51bWJlciBvZiBieXRlcyB3aGljaCBtdXN0IGJlIHNoaWZ0ZWQgZnJvbSBhcHBlbmRlZCBpdGVtICovCisJCQlpZiAoIChuX3NoaWZ0ID0gdGItPnJieXRlcyAtIHRiLT5pbnNlcnRfc2l6ZVswXSkgPCAwICkKKwkJCSAgICBuX3NoaWZ0ID0gMDsKKworCQkJUkZBTFNFKHBvc19pbl9pdGVtICE9IGloX2l0ZW1fbGVuKEJfTl9QSVRFTV9IRUFEICh0YlMwLCBpdGVtX3BvcykpLAorCQkJICAgICAgICJQQVAtMTIxNTU6IGludmFsaWQgcG9zaXRpb24gdG8gcGFzdGUuIGloX2l0ZW1fbGVuPSVkLCBwb3NfaW5faXRlbT0lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zX2luX2l0ZW0sIGloX2l0ZW1fbGVuKCBCX05fUElURU1fSEVBRCh0YlMwLGl0ZW1fcG9zKSkpOworCisJCQlsZWFmX3NoaWZ0X3JpZ2h0KHRiLHRiLT5ybnVtWzBdLG5fc2hpZnQpOworCQkJLyogQ2FsY3VsYXRlIG51bWJlciBvZiBieXRlcyB3aGljaCBtdXN0IHJlbWFpbiBpbiBib2R5IGFmdGVyIGFwcGVuZGluZyB0byBSWzBdICovCisJCQlpZiAoIChuX3JlbSA9IHRiLT5pbnNlcnRfc2l6ZVswXSAtIHRiLT5yYnl0ZXMpIDwgMCApCisJCQkgICAgbl9yZW0gPSAwOworCQkJCisJCQl7CisJCQkgIGludCB2ZXJzaW9uOworCQkJICB1bnNpZ25lZCBsb25nIHRlbXBfcmVtID0gbl9yZW07CisJCQkgIAorCQkJICB2ZXJzaW9uID0gaWhfdmVyc2lvbiAoQl9OX1BJVEVNX0hFQUQgKHRiLT5SWzBdLDApKTsKKwkJCSAgaWYgKGlzX2luZGlyZWN0X2xlX2tleSh2ZXJzaW9uLEJfTl9QS0VZKHRiLT5SWzBdLDApKSl7CisJCQkgICAgICB0ZW1wX3JlbSA9IG5fcmVtIDw8ICh0Yi0+dGJfc2ItPnNfYmxvY2tzaXplX2JpdHMgLQorCQkJCQkgVU5GTV9QX1NISUZUKTsKKwkJCSAgfQorCQkJICBzZXRfbGVfa2V5X2tfb2Zmc2V0ICh2ZXJzaW9uLCBCX05fUEtFWSh0Yi0+UlswXSwwKSwgCisJCQkJCSAgICAgICBsZV9rZXlfa19vZmZzZXQgKHZlcnNpb24sIEJfTl9QS0VZKHRiLT5SWzBdLDApKSArIHRlbXBfcmVtKTsKKwkJCSAgc2V0X2xlX2tleV9rX29mZnNldCAodmVyc2lvbiwgQl9OX1BERUxJTV9LRVkodGItPkNGUlswXSx0Yi0+cmtleVswXSksIAorCQkJCQkgICAgICAgbGVfa2V5X2tfb2Zmc2V0ICh2ZXJzaW9uLCBCX05fUERFTElNX0tFWSh0Yi0+Q0ZSWzBdLHRiLT5ya2V5WzBdKSkgKyB0ZW1wX3JlbSk7CisJCQl9CisvKgkJICBrX29mZnNldCAoQl9OX1BLRVkodGItPlJbMF0sMCkpICs9IG5fcmVtOworCQkgIGtfb2Zmc2V0IChCX05fUERFTElNX0tFWSh0Yi0+Q0ZSWzBdLHRiLT5ya2V5WzBdKSkgKz0gbl9yZW07Ki8KKwkJCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSAodGIsIHRiLT5DRlJbMF0sIDApOworCisJCQkvKiBBcHBlbmQgcGFydCBvZiBib2R5IGludG8gUlswXSAqLworCQkJYmkudGIgPSB0YjsKKwkJCWJpLmJpX2JoID0gdGItPlJbMF07CisJCQliaS5iaV9wYXJlbnQgPSB0Yi0+RlJbMF07CisJCQliaS5iaV9wb3NpdGlvbiA9IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIDApOworCQkJaWYgKCBuX3JlbSA+IHplcm9zX251bSApIHsKKwkJCSAgICByX3plcm9zX251bWJlciA9IDA7CisJCQkgICAgcl9ib2R5ID0gYm9keSArIG5fcmVtIC0gemVyb3NfbnVtOworCQkJfQorCQkJZWxzZSB7CisJCQkgICAgcl9ib2R5ID0gYm9keTsKKwkJCSAgICByX3plcm9zX251bWJlciA9IHplcm9zX251bSAtIG5fcmVtOworCQkJICAgIHplcm9zX251bSAtPSByX3plcm9zX251bWJlcjsKKwkJCX0KKworCQkJbGVhZl9wYXN0ZV9pbl9idWZmZXIoJmJpLCAwLCBuX3NoaWZ0LCB0Yi0+aW5zZXJ0X3NpemVbMF0gLSBuX3JlbSwgcl9ib2R5LCByX3plcm9zX251bWJlcik7CisKKwkJCWlmIChpc19pbmRpcmVjdF9sZV9paCAoQl9OX1BJVEVNX0hFQUQodGItPlJbMF0sMCkpKSB7CisjaWYgMAorCQkJICAgIFJGQUxTRSggbl9yZW0sCisJCQkJICAgICJQQVAtMTIxNjA6IHBhc3RlIG1vcmUgdGhhbiBvbmUgdW5mb3JtYXR0ZWQgbm9kZSBwb2ludGVyIik7CisjZW5kaWYKKwkJCSAgICBzZXRfaWhfZnJlZV9zcGFjZSAoQl9OX1BJVEVNX0hFQUQodGItPlJbMF0sMCksIDApOworCQkJfQorCQkJdGItPmluc2VydF9zaXplWzBdID0gbl9yZW07CisJCQlpZiAoICEgbl9yZW0gKQorCQkJICAgIHBvc19pbl9pdGVtICsrOworCQkgICAgfQorCQl9CisJCWVsc2UgLyogcGFzdGVkIGl0ZW0gaW4gd2hvbGUgZmFsbHMgaW50byBSWzBdICovCisJCXsKKwkJICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBwYXN0ZWQ7CisKKwkJICAgIHJldF92YWwgPSBsZWFmX3NoaWZ0X3JpZ2h0KHRiLHRiLT5ybnVtWzBdLHRiLT5yYnl0ZXMpOworCQkgICAgLyogYXBwZW5kIGl0ZW0gaW4gUlswXSAqLworCQkgICAgaWYgKCBwb3NfaW5faXRlbSA+PSAwICkgeworCQkJYmkudGIgPSB0YjsKKwkJCWJpLmJpX2JoID0gdGItPlJbMF07CisJCQliaS5iaV9wYXJlbnQgPSB0Yi0+RlJbMF07CisJCQliaS5iaV9wb3NpdGlvbiA9IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIDApOworCQkJbGVhZl9wYXN0ZV9pbl9idWZmZXIoJmJpLGl0ZW1fcG9zIC0gbiArIHRiLT5ybnVtWzBdLCBwb3NfaW5faXRlbSwKKwkJCQkJICAgICB0Yi0+aW5zZXJ0X3NpemVbMF0sYm9keSwgemVyb3NfbnVtKTsKKwkJICAgIH0KKworCQkgICAgLyogcGFzdGUgbmV3IGVudHJ5LCBpZiBpdGVtIGlzIGRpcmVjdG9yeSBpdGVtICovCisJCSAgICBwYXN0ZWQgPSBCX05fUElURU1fSEVBRCh0Yi0+UlswXSwgaXRlbV9wb3MgLSBuICsgdGItPnJudW1bMF0pOworCQkgICAgaWYgKGlzX2RpcmVudHJ5X2xlX2loIChwYXN0ZWQpICYmIHBvc19pbl9pdGVtID49IDAgKSB7CisJCQlsZWFmX3Bhc3RlX2VudHJpZXMgKAorCQkJICAgIGJpLmJpX2JoLCBpdGVtX3BvcyAtIG4gKyB0Yi0+cm51bVswXSwgcG9zX2luX2l0ZW0sIDEsIAorCQkJICAgIChzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKWJvZHksIGJvZHkgKyBERUhfU0laRSwgdGItPmluc2VydF9zaXplWzBdCisJCQkgICAgKTsKKwkJCWlmICggISBwb3NfaW5faXRlbSApIHsKKworCQkJICAgIFJGQUxTRSggaXRlbV9wb3MgLSBuICsgdGItPnJudW1bMF0sCisJCQkJICAgICJQQVAtMTIxNjU6IGRpcmVjdG9yeSBpdGVtIG11c3QgYmUgZmlyc3QgaXRlbSBvZiBub2RlIHdoZW4gcGFzdGluZyBpcyBpbiAwdGggcG9zaXRpb24iKTsKKworCQkJICAgIC8qIHVwZGF0ZSBkZWxpbWl0aW5nIGtleXMgKi8KKwkJCSAgICByZXBsYWNlX2tleSh0YiwgdGItPkNGUlswXSx0Yi0+cmtleVswXSx0Yi0+UlswXSwwKTsKKwkJCX0KKwkJICAgIH0KKworCQkgICAgaWYgKGlzX2luZGlyZWN0X2xlX2loIChwYXN0ZWQpKQorCQkJc2V0X2loX2ZyZWVfc3BhY2UgKHBhc3RlZCwgMCk7CisJCSAgICB6ZXJvc19udW0gPSB0Yi0+aW5zZXJ0X3NpemVbMF0gPSAwOworCQl9CisJICAgIH0KKwkgICAgZWxzZSAvKiBuZXcgaXRlbSBkb2Vzbid0IGZhbGwgaW50byBSWzBdICovCisJICAgIHsKKwkJbGVhZl9zaGlmdF9yaWdodCh0Yix0Yi0+cm51bVswXSx0Yi0+cmJ5dGVzKTsKKwkgICAgfQorCSAgICBicmVhazsKKwlkZWZhdWx0OiAgICAvKiBjYXNlcyBkIGFuZCB0ICovCisJICAgIHJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJQQVAtMTIxNzU6IGJhbGFuY2VfbGVhZjogcm51bSA+IDA6IHVuZXhwZWN0YWJsZSBtb2RlOiAlcyglZCkiLAorCQkJICAgIChmbGFnID09IE1fREVMRVRFKSA/ICJERUxFVEUiIDogKChmbGFnID09IE1fQ1VUKSA/ICJDVVQiIDogIlVOS05PV04iKSwgZmxhZyk7CisJfQorICAgIAorICAgIH0JLyogdGItPnJudW1bMF0gPiAwICovCisKKworICAgIFJGQUxTRSggdGItPmJsa251bVswXSA+IDMsCisJICAgICJQQVAtMTIxODA6IGJsa251bSBjYW4gbm90IGJlICVkLiBJdCBtdXN0IGJlIDw9IDMiLCAgdGItPmJsa251bVswXSk7CisgICAgUkZBTFNFKCB0Yi0+YmxrbnVtWzBdIDwgMCwKKwkgICAgIlBBUC0xMjE4NTogYmxrbnVtIGNhbiBub3QgYmUgJWQuIEl0IG11c3QgYmUgPj0gMCIsICB0Yi0+YmxrbnVtWzBdKTsKKworICAgIC8qIGlmIHdoaWxlIGFkZGluZyB0byBhIG5vZGUgd2UgZGlzY292ZXIgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBzcGxpdAorICAgICAgIGl0IGluIHR3bywgYW5kIG1lcmdlIHRoZSBsZWZ0IHBhcnQgaW50byB0aGUgbGVmdCBuZWlnaGJvciBhbmQgdGhlCisgICAgICAgcmlnaHQgcGFydCBpbnRvIHRoZSByaWdodCBuZWlnaGJvciwgZWxpbWluYXRpbmcgdGhlIG5vZGUgKi8KKyAgICBpZiAoIHRiLT5ibGtudW1bMF0gPT0gMCApIHsgLyogbm9kZSBTWzBdIGlzIGVtcHR5IG5vdyAqLworCisJUkZBTFNFKCAhIHRiLT5sbnVtWzBdIHx8ICEgdGItPnJudW1bMF0sCisJICAgICAgICAiUEFQLTEyMTkwOiBsbnVtIGFuZCBybnVtIG11c3Qgbm90IGJlIHplcm8iKTsKKwkvKiBpZiBpbnNlcnRpb24gd2FzIGRvbmUgYmVmb3JlIDAtdGggcG9zaXRpb24gaW4gUlswXSwgcmlnaHQKKwkgICBkZWxpbWl0aW5nIGtleSBvZiB0aGUgdGItPkxbMF0ncyBhbmQgbGVmdCBkZWxpbWl0aW5nIGtleSBhcmUKKwkgICBub3Qgc2V0IGNvcnJlY3RseSAqLworCWlmICh0Yi0+Q0ZMWzBdKSB7CisJICAgIGlmICghdGItPkNGUlswXSkKKwkJcmVpc2VyZnNfcGFuaWMgKHRiLT50Yl9zYiwgInZzLTEyMTk1OiBiYWxhbmNlX2xlYWY6IENGUiBub3QgaW5pdGlhbGl6ZWQiKTsKKwkgICAgY29weV9rZXkgKEJfTl9QREVMSU1fS0VZICh0Yi0+Q0ZMWzBdLCB0Yi0+bGtleVswXSksIEJfTl9QREVMSU1fS0VZICh0Yi0+Q0ZSWzBdLCB0Yi0+cmtleVswXSkpOworCSAgICBkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKHRiLCB0Yi0+Q0ZMWzBdLCAwKTsKKwl9CisKKwlyZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlcih0Yix0YlMwKTsJCQkJCQkJCQkKKwlyZXR1cm4gMDsKKyAgICB9CisKKworICAgIC8qIEZpbGwgbmV3IG5vZGVzIHRoYXQgYXBwZWFyIGluIHBsYWNlIG9mIFNbMF0gKi8KKworICAgIC8qIEkgYW0gdG9sZCB0aGF0IHRoaXMgY29weWluZyBpcyBiZWNhdXNlIHdlIG5lZWQgYW4gYXJyYXkgdG8gZW5hYmxlCisgICAgICAgdGhlIGxvb3BpbmcgY29kZS4gLUhhbnMgKi8KKyAgICBzbnVtWzBdID0gdGItPnMxbnVtLAorCXNudW1bMV0gPSB0Yi0+czJudW07CisgICAgc2J5dGVzWzBdID0gdGItPnMxYnl0ZXM7CisgICAgc2J5dGVzWzFdID0gdGItPnMyYnl0ZXM7CisgICAgZm9yKCBpID0gdGItPmJsa251bVswXSAtIDI7IGkgPj0gMDsgaS0tICkgeworCisJUkZBTFNFKCAhc251bVtpXSwgIlBBUC0xMjIwMDogc251bVslZF0gPT0gJWQuIE11c3QgYmUgPiAwIiwgaSwgc251bVtpXSk7CisKKwkvKiBoZXJlIHdlIHNoaWZ0IGZyb20gUyB0byBTX25ldyBub2RlcyAqLworCisJU19uZXdbaV0gPSBnZXRfRkVCKHRiKTsKKworCS8qIGluaXRpYWxpemVkIGJsb2NrIHR5cGUgYW5kIHRyZWUgbGV2ZWwgKi8KKyAgICAgICAgc2V0X2Jsa2hfbGV2ZWwoIEJfQkxLX0hFQUQoU19uZXdbaV0pLCBESVNLX0xFQUZfTk9ERV9MRVZFTCApOworCisKKwluID0gQl9OUl9JVEVNUyh0YlMwKTsKKwkKKwlzd2l0Y2ggKGZsYWcpIHsKKwljYXNlIE1fSU5TRVJUOiAgIC8qIGluc2VydCBpdGVtICovCisKKwkgICAgaWYgKCBuIC0gc251bVtpXSA8IGl0ZW1fcG9zICkKKwkgICAgeyAvKiBuZXcgaXRlbSBvciBpdCdzIHBhcnQgZmFsbHMgdG8gZmlyc3QgbmV3IG5vZGUgU19uZXdbaV0qLworCQlpZiAoIGl0ZW1fcG9zID09IG4gLSBzbnVtW2ldICsgMSAmJiBzYnl0ZXNbaV0gIT0gLTEgKQorCQl7IC8qIHBhcnQgb2YgbmV3IGl0ZW0gZmFsbHMgaW50byBTX25ld1tpXSAqLworCQkgICAgaW50IG9sZF9rZXlfY29tcCwgb2xkX2xlbiwgcl96ZXJvc19udW1iZXI7CisJCSAgICBjb25zdCBjaGFyICogcl9ib2R5OworCQkgICAgaW50IHZlcnNpb247CisKKwkJICAgIC8qIE1vdmUgc251bVtpXS0xIGl0ZW1zIGZyb20gU1swXSB0byBTX25ld1tpXSAqLworCQkgICAgbGVhZl9tb3ZlX2l0ZW1zIChMRUFGX0ZST01fU19UT19TTkVXLCB0Yiwgc251bVtpXSAtIDEsIC0xLCBTX25ld1tpXSk7CisJCSAgICAvKiBSZW1lbWJlciBrZXkgY29tcG9uZW50IGFuZCBpdGVtIGxlbmd0aCAqLworCQkgICAgdmVyc2lvbiA9IGloX3ZlcnNpb24gKGloKTsKKyAgICAgICAgICAgICAgICAgICAgb2xkX2tleV9jb21wID0gbGVfaWhfa19vZmZzZXQoIGloICk7CisJCSAgICBvbGRfbGVuID0gaWhfaXRlbV9sZW4oaWgpOworCisJCSAgICAvKiBDYWxjdWxhdGUga2V5IGNvbXBvbmVudCBhbmQgaXRlbSBsZW5ndGggdG8gaW5zZXJ0IGludG8gU19uZXdbaV0gKi8KKyAgICAgICAgICAgICAgICAgICAgc2V0X2xlX2loX2tfb2Zmc2V0KCBpaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVfaWhfa19vZmZzZXQoaWgpICsgKChvbGRfbGVuIC0gc2J5dGVzW2ldICk8PChpc19pbmRpcmVjdF9sZV9paChpaCk/dGItPnRiX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gVU5GTV9QX1NISUZUOjApKSApOworCisJCSAgICBwdXRfaWhfaXRlbV9sZW4oIGloLCBzYnl0ZXNbaV0gKTsKKworCQkgICAgLyogSW5zZXJ0IHBhcnQgb2YgdGhlIGl0ZW0gaW50byBTX25ld1tpXSBiZWZvcmUgMC10aCBpdGVtICovCisJCSAgICBiaS50YiA9IHRiOworCQkgICAgYmkuYmlfYmggPSBTX25ld1tpXTsKKwkJICAgIGJpLmJpX3BhcmVudCA9IE5VTEw7CisJCSAgICBiaS5iaV9wb3NpdGlvbiA9IDA7CisKKwkJICAgIGlmICggKG9sZF9sZW4gLSBzYnl0ZXNbaV0pID4gemVyb3NfbnVtICkgeworCQkJcl96ZXJvc19udW1iZXIgPSAwOworCQkJcl9ib2R5ID0gYm9keSArIChvbGRfbGVuIC0gc2J5dGVzW2ldKSAtIHplcm9zX251bTsKKwkJICAgIH0KKwkJICAgIGVsc2UgeworCQkJcl9ib2R5ID0gYm9keTsKKwkJCXJfemVyb3NfbnVtYmVyID0gemVyb3NfbnVtIC0gKG9sZF9sZW4gLSBzYnl0ZXNbaV0pOworCQkJemVyb3NfbnVtIC09IHJfemVyb3NfbnVtYmVyOworCQkgICAgfQorCisJCSAgICBsZWFmX2luc2VydF9pbnRvX2J1ZiAoJmJpLCAwLCBpaCwgcl9ib2R5LCByX3plcm9zX251bWJlcik7CisKKwkJICAgIC8qIENhbGN1bGF0ZSBrZXkgY29tcG9uZW50IGFuZCBpdGVtIGxlbmd0aCB0byBpbnNlcnQgaW50byBTW2ldICovCisgICAgICAgICAgICAgICAgICAgIHNldF9sZV9paF9rX29mZnNldCggaWgsIG9sZF9rZXlfY29tcCApOworCQkgICAgcHV0X2loX2l0ZW1fbGVuKCBpaCwgb2xkX2xlbiAtIHNieXRlc1tpXSApOworCQkgICAgdGItPmluc2VydF9zaXplWzBdIC09IHNieXRlc1tpXTsKKwkJfQorCQllbHNlIC8qIHdob2xlIG5ldyBpdGVtIGZhbGxzIGludG8gU19uZXdbaV0gKi8KKwkJeworCQkgICAgLyogU2hpZnQgc251bVswXSAtIDEgaXRlbXMgdG8gU19uZXdbaV0gKHNieXRlc1tpXSBvZiBzcGxpdCBpdGVtKSAqLworCQkgICAgbGVhZl9tb3ZlX2l0ZW1zIChMRUFGX0ZST01fU19UT19TTkVXLCB0Yiwgc251bVtpXSAtIDEsIHNieXRlc1tpXSwgU19uZXdbaV0pOworCisJCSAgICAvKiBJbnNlcnQgbmV3IGl0ZW0gaW50byBTX25ld1tpXSAqLworCQkgICAgYmkudGIgPSB0YjsKKwkJICAgIGJpLmJpX2JoID0gU19uZXdbaV07CisJCSAgICBiaS5iaV9wYXJlbnQgPSBOVUxMOworCQkgICAgYmkuYmlfcG9zaXRpb24gPSAwOworCQkgICAgbGVhZl9pbnNlcnRfaW50b19idWYgKCZiaSwgaXRlbV9wb3MgLSBuICsgc251bVtpXSAtIDEsIGloLCBib2R5LCB6ZXJvc19udW0pOworCisJCSAgICB6ZXJvc19udW0gPSB0Yi0+aW5zZXJ0X3NpemVbMF0gPSAwOworCQl9CisJICAgIH0KKworCSAgICBlbHNlIC8qIG5ldyBpdGVtIG9yIGl0IHBhcnQgZG9uJ3QgZmFsbHMgaW50byBTX25ld1tpXSAqLworCSAgICB7CisJCWxlYWZfbW92ZV9pdGVtcyAoTEVBRl9GUk9NX1NfVE9fU05FVywgdGIsIHNudW1baV0sIHNieXRlc1tpXSwgU19uZXdbaV0pOworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBNX1BBU1RFOiAgIC8qIGFwcGVuZCBpdGVtICovCisKKwkgICAgaWYgKCBuIC0gc251bVtpXSA8PSBpdGVtX3BvcyApICAvKiBwYXN0ZWQgaXRlbSBvciBwYXJ0IGlmIGl0IGZhbGxzIHRvIFNfbmV3W2ldICovCisJICAgIHsKKwkJaWYgKCBpdGVtX3BvcyA9PSBuIC0gc251bVtpXSAmJiBzYnl0ZXNbaV0gIT0gLTEgKQorCQl7IC8qIHdlIG11c3Qgc2hpZnQgcGFydCBvZiB0aGUgYXBwZW5kZWQgaXRlbSAqLworCQkgICAgc3RydWN0IGl0ZW1faGVhZCAqIGF1eF9paDsKKworCQkgICAgUkZBTFNFKCBpaCwgIlBBUC0xMjIxMDogaWggbXVzdCBiZSAwIik7CisKKwkJICAgIGlmICggaXNfZGlyZW50cnlfbGVfaWggKGF1eF9paCA9IEJfTl9QSVRFTV9IRUFEKHRiUzAsaXRlbV9wb3MpKSkgeworCQkJLyogd2UgYXBwZW5kIHRvIGRpcmVjdG9yeSBpdGVtICovCisKKwkJCWludCBlbnRyeV9jb3VudDsKKwkJCisJCQllbnRyeV9jb3VudCA9IGloX2VudHJ5X2NvdW50KGF1eF9paCk7CisKKwkJCWlmICggZW50cnlfY291bnQgLSBzYnl0ZXNbaV0gPCBwb3NfaW5faXRlbSAgJiYgcG9zX2luX2l0ZW0gPD0gZW50cnlfY291bnQgKSB7CisJCQkgICAgLyogbmV3IGRpcmVjdG9yeSBlbnRyeSBmYWxscyBpbnRvIFNfbmV3W2ldICovCisJCSAgCisJCQkgICAgUkZBTFNFKCAhIHRiLT5pbnNlcnRfc2l6ZVswXSwKKwkJCQkgICAgIlBBUC0xMjIxNTogaW5zZXJ0X3NpemUgaXMgYWxyZWFkeSAwIik7CisJCQkgICAgUkZBTFNFKCBzYnl0ZXNbaV0gLSAxID49IGVudHJ5X2NvdW50LAorCQkJCSAgICAiUEFQLTEyMjIwOiB0aGVyZSBhcmUgbm8gc28gbXVjaCBlbnRyaWVzICglZCksIG9ubHkgJWQiLAorCQkJCSAgICBzYnl0ZXNbaV0gLSAxLCBlbnRyeV9jb3VudCk7CisKKwkJCSAgICAvKiBTaGlmdCBzbnVtW2ldLTEgaXRlbXMgaW4gd2hvbGUuIFNoaWZ0IHNieXRlc1tpXSBkaXJlY3RvcnkgZW50cmllcyBmcm9tIGRpcmVjdG9yeSBpdGVtIG51bWJlciBzbnVtW2ldICovCisJCQkgICAgbGVhZl9tb3ZlX2l0ZW1zIChMRUFGX0ZST01fU19UT19TTkVXLCB0Yiwgc251bVtpXSwgc2J5dGVzW2ldLTEsIFNfbmV3W2ldKTsKKwkJCSAgICAvKiBQYXN0ZSBnaXZlbiBkaXJlY3RvcnkgZW50cnkgdG8gZGlyZWN0b3J5IGl0ZW0gKi8KKwkJCSAgICBiaS50YiA9IHRiOworCQkJICAgIGJpLmJpX2JoID0gU19uZXdbaV07CisJCQkgICAgYmkuYmlfcGFyZW50ID0gTlVMTDsKKwkJCSAgICBiaS5iaV9wb3NpdGlvbiA9IDA7CisJCQkgICAgbGVhZl9wYXN0ZV9pbl9idWZmZXIgKCZiaSwgMCwgcG9zX2luX2l0ZW0gLSBlbnRyeV9jb3VudCArIHNieXRlc1tpXSAtIDEsCisJCQkJCQkgIHRiLT5pbnNlcnRfc2l6ZVswXSwgYm9keSx6ZXJvc19udW0pOworCQkJICAgIC8qIHBhc3RlIG5ldyBkaXJlY3RvcnkgZW50cnkgKi8KKwkJCSAgICBsZWFmX3Bhc3RlX2VudHJpZXMgKAorCQkJCWJpLmJpX2JoLCAwLCBwb3NfaW5faXRlbSAtIGVudHJ5X2NvdW50ICsgc2J5dGVzW2ldIC0gMSwKKwkJCQkxLCAoc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKilib2R5LCBib2R5ICsgREVIX1NJWkUsCisJCQkJdGItPmluc2VydF9zaXplWzBdCisJCQkJKTsKKwkJCSAgICB0Yi0+aW5zZXJ0X3NpemVbMF0gPSAwOworCQkJICAgIHBvc19pbl9pdGVtKys7CisJCQl9IGVsc2UgeyAvKiBuZXcgZGlyZWN0b3J5IGVudHJ5IGRvZXNuJ3QgZmFsbCBpbnRvIFNfbmV3W2ldICovCisJCQkgICAgbGVhZl9tb3ZlX2l0ZW1zIChMRUFGX0ZST01fU19UT19TTkVXLCB0Yiwgc251bVtpXSwgc2J5dGVzW2ldLCBTX25ld1tpXSk7CisJCQl9CisJCSAgICB9CisJCSAgICBlbHNlIC8qIHJlZ3VsYXIgb2JqZWN0ICovCisJCSAgICB7CisJCQlpbnQgbl9zaGlmdCwgbl9yZW0sIHJfemVyb3NfbnVtYmVyOworCQkJY29uc3QgY2hhciAqIHJfYm9keTsKKworCQkJUkZBTFNFKCBwb3NfaW5faXRlbSAhPSBpaF9pdGVtX2xlbihCX05fUElURU1fSEVBRCh0YlMwLGl0ZW1fcG9zKSkgfHwKKwkJCSAgICAgICAgdGItPmluc2VydF9zaXplWzBdIDw9IDAsCisJCQkgICAgICAgICJQQVAtMTIyMjU6IGl0ZW0gdG9vIHNob3J0IG9yIGluc2VydF9zaXplIDw9IDAiKTsKKworCQkJLyogQ2FsY3VsYXRlIG51bWJlciBvZiBieXRlcyB3aGljaCBtdXN0IGJlIHNoaWZ0ZWQgZnJvbSBhcHBlbmRlZCBpdGVtICovCisJCQluX3NoaWZ0ID0gc2J5dGVzW2ldIC0gdGItPmluc2VydF9zaXplWzBdOworCQkJaWYgKCBuX3NoaWZ0IDwgMCApCisJCQkgICAgbl9zaGlmdCA9IDA7CisJCQlsZWFmX21vdmVfaXRlbXMgKExFQUZfRlJPTV9TX1RPX1NORVcsIHRiLCBzbnVtW2ldLCBuX3NoaWZ0LCBTX25ld1tpXSk7CisKKwkJCS8qIENhbGN1bGF0ZSBudW1iZXIgb2YgYnl0ZXMgd2hpY2ggbXVzdCByZW1haW4gaW4gYm9keSBhZnRlciBhcHBlbmQgdG8gU19uZXdbaV0gKi8KKwkJCW5fcmVtID0gdGItPmluc2VydF9zaXplWzBdIC0gc2J5dGVzW2ldOworCQkJaWYgKCBuX3JlbSA8IDAgKQorCQkJICAgIG5fcmVtID0gMDsKKwkJCS8qIEFwcGVuZCBwYXJ0IG9mIGJvZHkgaW50byBTX25ld1swXSAqLworCQkJYmkudGIgPSB0YjsKKwkJCWJpLmJpX2JoID0gU19uZXdbaV07CisJCQliaS5iaV9wYXJlbnQgPSBOVUxMOworCQkJYmkuYmlfcG9zaXRpb24gPSAwOworCisJCQlpZiAoIG5fcmVtID4gemVyb3NfbnVtICkgeworCQkJICAgIHJfemVyb3NfbnVtYmVyID0gMDsKKwkJCSAgICByX2JvZHkgPSBib2R5ICsgbl9yZW0gLSB6ZXJvc19udW07CisJCQl9CisJCQllbHNlIHsKKwkJCSAgICByX2JvZHkgPSBib2R5OworCQkJICAgIHJfemVyb3NfbnVtYmVyID0gemVyb3NfbnVtIC0gbl9yZW07CisJCQkgICAgemVyb3NfbnVtIC09IHJfemVyb3NfbnVtYmVyOworCQkJfQorCisJCQlsZWFmX3Bhc3RlX2luX2J1ZmZlcigmYmksIDAsIG5fc2hpZnQsIHRiLT5pbnNlcnRfc2l6ZVswXS1uX3JlbSwgcl9ib2R5LHJfemVyb3NfbnVtYmVyKTsKKwkJCXsKKwkJCSAgICBzdHJ1Y3QgaXRlbV9oZWFkICogdG1wOworCisJCQkgICAgdG1wID0gQl9OX1BJVEVNX0hFQUQoU19uZXdbaV0sMCk7CisJCQkgICAgaWYgKGlzX2luZGlyZWN0X2xlX2loICh0bXApKSB7CisJCQkJc2V0X2loX2ZyZWVfc3BhY2UgKHRtcCwgMCk7CisJCQkJc2V0X2xlX2loX2tfb2Zmc2V0KCB0bXAsIGxlX2loX2tfb2Zmc2V0KHRtcCkgKyAKKwkJCQkJICAgICAgICAgICAgKG5fcmVtIDw8ICh0Yi0+dGJfc2ItPnNfYmxvY2tzaXplX2JpdHMgLSBVTkZNX1BfU0hJRlQpKSk7CisJCQkgICAgfSBlbHNlIHsKKwkJCQlzZXRfbGVfaWhfa19vZmZzZXQoIHRtcCwgbGVfaWhfa19vZmZzZXQodG1wKSArIAorCQkJCSAgICAgICAgICAgICAgICAgICAgbl9yZW0gKTsKKwkJCSAgICB9CisJCQl9CisKKwkJCXRiLT5pbnNlcnRfc2l6ZVswXSA9IG5fcmVtOworCQkJaWYgKCAhIG5fcmVtICkKKwkJCSAgICBwb3NfaW5faXRlbSsrOworCQkgICAgfQorCQl9CisJCWVsc2UKKwkJICAgIC8qIGl0ZW0gZmFsbHMgd2hvbGx5IGludG8gU19uZXdbaV0gKi8KKwkJeworCQkgICAgaW50IHJldF92YWw7CisJCSAgICBzdHJ1Y3QgaXRlbV9oZWFkICogcGFzdGVkOworCisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisJCSAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWggPSBCX05fUElURU1fSEVBRCh0YlMwLGl0ZW1fcG9zKTsKKworCQkgICAgaWYgKCAhIGlzX2RpcmVudHJ5X2xlX2loKGloKSAmJiAocG9zX2luX2l0ZW0gIT0gaWhfaXRlbV9sZW4oaWgpIHx8CisJCQkJCQkgICAgIHRiLT5pbnNlcnRfc2l6ZVswXSA8PSAwKSApCisJCQlyZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAiUEFQLTEyMjM1OiBiYWxhbmNlX2xlYWY6IHBvc19pbl9pdGVtIG11c3QgYmUgZXF1YWwgdG8gaWhfaXRlbV9sZW4iKTsKKyNlbmRpZiAvKiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgKi8KKworCQkgICAgcmV0X3ZhbCA9IGxlYWZfbW92ZV9pdGVtcyAoTEVBRl9GUk9NX1NfVE9fU05FVywgdGIsIHNudW1baV0sIHNieXRlc1tpXSwgU19uZXdbaV0pOworCisJCSAgICBSRkFMU0UoIHJldF92YWwsCisJCQkgICAgIlBBUC0xMjI0MDogdW5leHBlY3RlZCB2YWx1ZSByZXR1cm5lZCBieSBsZWFmX21vdmVfaXRlbXMgKCVkKSIsCisJCQkgICAgcmV0X3ZhbCk7CisKKwkJICAgIC8qIHBhc3RlIGludG8gaXRlbSAqLworCQkgICAgYmkudGIgPSB0YjsKKwkJICAgIGJpLmJpX2JoID0gU19uZXdbaV07CisJCSAgICBiaS5iaV9wYXJlbnQgPSBOVUxMOworCQkgICAgYmkuYmlfcG9zaXRpb24gPSAwOworCQkgICAgbGVhZl9wYXN0ZV9pbl9idWZmZXIoJmJpLCBpdGVtX3BvcyAtIG4gKyBzbnVtW2ldLCBwb3NfaW5faXRlbSwgdGItPmluc2VydF9zaXplWzBdLCBib2R5LCB6ZXJvc19udW0pOworCisJCSAgICBwYXN0ZWQgPSBCX05fUElURU1fSEVBRChTX25ld1tpXSwgaXRlbV9wb3MgLSBuICsgc251bVtpXSk7CisJCSAgICBpZiAoaXNfZGlyZW50cnlfbGVfaWggKHBhc3RlZCkpCisJCSAgICB7CisJCQlsZWFmX3Bhc3RlX2VudHJpZXMgKAorCQkJICAgIGJpLmJpX2JoLCBpdGVtX3BvcyAtIG4gKyBzbnVtW2ldLCBwb3NfaW5faXRlbSwgMSwgCisJCQkgICAgKHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopYm9keSwgYm9keSArIERFSF9TSVpFLCB0Yi0+aW5zZXJ0X3NpemVbMF0KKwkJCSAgICApOworCQkgICAgfQorCisJCSAgICAvKiBpZiB3ZSBwYXN0ZSB0byBpbmRpcmVjdCBpdGVtIHVwZGF0ZSBpaF9mcmVlX3NwYWNlICovCisJCSAgICBpZiAoaXNfaW5kaXJlY3RfbGVfaWggKHBhc3RlZCkpCisJCQlzZXRfaWhfZnJlZV9zcGFjZSAocGFzdGVkLCAwKTsKKwkJICAgIHplcm9zX251bSA9IHRiLT5pbnNlcnRfc2l6ZVswXSA9IDA7CisJCX0KKwkgICAgfQorCisJICAgIGVsc2UgLyogcGFzdGVkIGl0ZW0gZG9lc24ndCBmYWxsIGludG8gU19uZXdbaV0gKi8KKwkgICAgeworCQlsZWFmX21vdmVfaXRlbXMgKExFQUZfRlJPTV9TX1RPX1NORVcsIHRiLCBzbnVtW2ldLCBzYnl0ZXNbaV0sIFNfbmV3W2ldKTsKKwkgICAgfQorCSAgICBicmVhazsKKwlkZWZhdWx0OiAgICAvKiBjYXNlcyBkIGFuZCB0ICovCisJICAgIHJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJQQVAtMTIyNDU6IGJhbGFuY2VfbGVhZjogYmxrbnVtID4gMjogdW5leHBlY3RhYmxlIG1vZGU6ICVzKCVkKSIsCisJCQkgICAgKGZsYWcgPT0gTV9ERUxFVEUpID8gIkRFTEVURSIgOiAoKGZsYWcgPT0gTV9DVVQpID8gIkNVVCIgOiAiVU5LTk9XTiIpLCBmbGFnKTsKKwl9CisKKwltZW1jcHkgKGluc2VydF9rZXkgKyBpLEJfTl9QS0VZKFNfbmV3W2ldLDApLEtFWV9TSVpFKTsKKwlpbnNlcnRfcHRyW2ldID0gU19uZXdbaV07CisKKwlSRkFMU0UgKCFidWZmZXJfam91cm5hbGVkIChTX25ldyBbaV0pIHx8IGJ1ZmZlcl9qb3VybmFsX2RpcnR5IChTX25ldyBbaV0pIHx8CisJCWJ1ZmZlcl9kaXJ0eSAoU19uZXcgW2ldKSwKKwkJIlBBUC0xMjI0NzogU19uZXdbJWRdIDogKCViKSIsIGksIFNfbmV3W2ldKTsKKyAgICB9CisKKyAgICAvKiBpZiB0aGUgYWZmZWN0ZWQgaXRlbSB3YXMgbm90IHdob2xseSBzaGlmdGVkIHRoZW4gd2UgcGVyZm9ybSBhbGwgbmVjZXNzYXJ5IG9wZXJhdGlvbnMgb24gdGhhdCBwYXJ0IG9yIHdob2xlIG9mIHRoZQorICAgICAgIGFmZmVjdGVkIGl0ZW0gd2hpY2ggcmVtYWlucyBpbiBTICovCisgICAgaWYgKCAwIDw9IGl0ZW1fcG9zICYmIGl0ZW1fcG9zIDwgdGItPnMwbnVtICkKKyAgICB7IC8qIGlmIHdlIG11c3QgaW5zZXJ0IG9yIGFwcGVuZCBpbnRvIGJ1ZmZlciBTWzBdICovCisKKwlzd2l0Y2ggKGZsYWcpCisJeworCWNhc2UgTV9JTlNFUlQ6ICAgLyogaW5zZXJ0IGl0ZW0gaW50byBTWzBdICovCisJICAgIGJpLnRiID0gdGI7CisJICAgIGJpLmJpX2JoID0gdGJTMDsKKwkgICAgYmkuYmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCAwKTsKKwkgICAgYmkuYmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCAxKTsKKwkgICAgbGVhZl9pbnNlcnRfaW50b19idWYgKCZiaSwgaXRlbV9wb3MsIGloLCBib2R5LCB6ZXJvc19udW0pOworCisJICAgIC8qIElmIHdlIGluc2VydCB0aGUgZmlyc3Qga2V5IGNoYW5nZSB0aGUgZGVsaW1pdGluZyBrZXkgKi8KKwkgICAgaWYoIGl0ZW1fcG9zID09IDAgKSB7CisJCWlmICh0Yi0+Q0ZMWzBdKSAvKiBjYW4gYmUgMCBpbiByZWlzZXJmc2NrICovCisJCSAgICByZXBsYWNlX2tleSh0YiwgdGItPkNGTFswXSwgdGItPmxrZXlbMF0sdGJTMCwwKTsKKworCSAgICB9CisJICAgIGJyZWFrOworCisJY2FzZSBNX1BBU1RFOiB7ICAvKiBhcHBlbmQgaXRlbSBpbiBTWzBdICovCisJICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBwYXN0ZWQ7CisKKwkgICAgcGFzdGVkID0gQl9OX1BJVEVNX0hFQUQgKHRiUzAsIGl0ZW1fcG9zKTsKKwkgICAgLyogd2hlbiBkaXJlY3RvcnksIG1heSBiZSBuZXcgZW50cnkgYWxyZWFkeSBwYXN0ZWQgKi8KKwkgICAgaWYgKGlzX2RpcmVudHJ5X2xlX2loIChwYXN0ZWQpKSB7CisJCWlmICggcG9zX2luX2l0ZW0gPj0gMCAmJgorCQkgICAgcG9zX2luX2l0ZW0gPD0gaWhfZW50cnlfY291bnQocGFzdGVkKSApIHsKKworCQkgICAgUkZBTFNFKCAhIHRiLT5pbnNlcnRfc2l6ZVswXSwgCisJCQkgICAgIlBBUC0xMjI2MDogaW5zZXJ0X3NpemUgaXMgMCBhbHJlYWR5Iik7CisKKwkJICAgIC8qIHByZXBhcmUgc3BhY2UgKi8KKwkJICAgIGJpLnRiID0gdGI7CisJCSAgICBiaS5iaV9iaCA9IHRiUzA7CisJCSAgICBiaS5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIDApOworCQkgICAgYmkuYmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCAxKTsKKwkJICAgIGxlYWZfcGFzdGVfaW5fYnVmZmVyKCZiaSwgaXRlbV9wb3MsIHBvc19pbl9pdGVtLCB0Yi0+aW5zZXJ0X3NpemVbMF0sIGJvZHksIHplcm9zX251bSk7CisKKwkJICAgIC8qIHBhc3RlIGVudHJ5ICovCisJCSAgICBsZWFmX3Bhc3RlX2VudHJpZXMgKAorCQkJYmkuYmlfYmgsIGl0ZW1fcG9zLCBwb3NfaW5faXRlbSwgMSwgKHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopYm9keSwKKwkJCWJvZHkgKyBERUhfU0laRSwgdGItPmluc2VydF9zaXplWzBdCisJCQkpOworCQkgICAgaWYgKCAhIGl0ZW1fcG9zICYmICEgcG9zX2luX2l0ZW0gKSB7CisJCQlSRkFMU0UoICF0Yi0+Q0ZMWzBdIHx8ICF0Yi0+TFswXSwgCisJCQkJIlBBUC0xMjI3MDogQ0ZMWzBdL0xbMF0gbXVzdCBiZSBzcGVjaWZpZWQiKTsKKwkJCWlmICh0Yi0+Q0ZMWzBdKSB7CisJCQkgICAgcmVwbGFjZV9rZXkodGIsIHRiLT5DRkxbMF0sIHRiLT5sa2V5WzBdLHRiUzAsMCk7CisKKwkJCX0KKwkJICAgIH0KKwkJICAgIHRiLT5pbnNlcnRfc2l6ZVswXSA9IDA7CisJCX0KKwkgICAgfSBlbHNlIHsgLyogcmVndWxhciBvYmplY3QgKi8KKwkJaWYgKCBwb3NfaW5faXRlbSA9PSBpaF9pdGVtX2xlbihwYXN0ZWQpICkgeworCisJCSAgICBSRkFMU0UoIHRiLT5pbnNlcnRfc2l6ZVswXSA8PSAwLAorCQkJICAgICJQQVAtMTIyNzU6IGluc2VydCBzaXplIG11c3Qgbm90IGJlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Yi0+aW5zZXJ0X3NpemVbMF0pOworCQkgICAgYmkudGIgPSB0YjsKKwkJICAgIGJpLmJpX2JoID0gdGJTMDsKKwkJICAgIGJpLmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgMCk7CisJCSAgICBiaS5iaV9wb3NpdGlvbiA9IFBBVEhfSF9QT1NJVElPTiAodGItPnRiX3BhdGgsIDEpOworCQkgICAgbGVhZl9wYXN0ZV9pbl9idWZmZXIgKCZiaSwgaXRlbV9wb3MsIHBvc19pbl9pdGVtLCB0Yi0+aW5zZXJ0X3NpemVbMF0sIGJvZHksIHplcm9zX251bSk7CisKKwkJICAgIGlmIChpc19pbmRpcmVjdF9sZV9paCAocGFzdGVkKSkgeworI2lmIDAKKwkJCVJGQUxTRSggdGItPmluc2VydF9zaXplWzBdICE9IFVORk1fUF9TSVpFLAorCQkJCSJQQVAtMTIyODA6IGluc2VydF9zaXplIGZvciBpbmRpcmVjdCBpdGVtIG11c3QgYmUgJWQsIG5vdCAlZCIsCisJCQkJVU5GTV9QX1NJWkUsIHRiLT5pbnNlcnRfc2l6ZVswXSk7CisjZW5kaWYKKwkJCXNldF9paF9mcmVlX3NwYWNlIChwYXN0ZWQsIDApOworCQkgICAgfQorCQkgICAgdGItPmluc2VydF9zaXplWzBdID0gMDsKKwkJfQorCisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisJCWVsc2UgeworCQkgICAgaWYgKCB0Yi0+aW5zZXJ0X3NpemVbMF0gKSB7CisJCQlwcmludF9jdXJfdGIgKCIxMjI4NSIpOworCQkJcmVpc2VyZnNfcGFuaWMgKHRiLT50Yl9zYiwgIlBBUC0xMjI4NTogYmFsYW5jZV9sZWFmOiBpbnNlcnRfc2l6ZSBtdXN0IGJlIDAgKCVkKSIsIHRiLT5pbnNlcnRfc2l6ZVswXSk7CisJCSAgICB9CisJCX0KKyNlbmRpZiAvKiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgKi8KKwkgICAgCisJICAgIH0KKwl9IC8qIGNhc2UgTV9QQVNURTogKi8KKwl9CisgICAgfQorCisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisgICAgaWYgKCBmbGFnID09IE1fUEFTVEUgJiYgdGItPmluc2VydF9zaXplWzBdICkgeworCXByaW50X2N1cl90YiAoIjEyMjkwIik7CisJcmVpc2VyZnNfcGFuaWMgKHRiLT50Yl9zYiwgIlBBUC0xMjI5MDogYmFsYW5jZV9sZWFmOiBpbnNlcnRfc2l6ZSBpcyBzdGlsbCBub3QgMCAoJWQpIiwgdGItPmluc2VydF9zaXplWzBdKTsKKyAgICB9CisjZW5kaWYgLyogQ09ORklHX1JFSVNFUkZTX0NIRUNLICovCisKKyAgICByZXR1cm4gMDsKK30gLyogTGVhZiBsZXZlbCBvZiB0aGUgdHJlZSBpcyBiYWxhbmNlZCAoZW5kIG9mIGJhbGFuY2VfbGVhZikgKi8KKworCisKKy8qIE1ha2UgZW1wdHkgbm9kZSAqLwordm9pZCBtYWtlX2VtcHR5X25vZGUgKHN0cnVjdCBidWZmZXJfaW5mbyAqIGJpKQoreworICAgIHN0cnVjdCBibG9ja19oZWFkICogYmxraDsKKworICAgIFJGQUxTRSggYmktPmJpX2JoID09IE5VTEwsICJQQVAtMTIyOTU6IHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBpcyBOVUxMIik7CisKKyAgICBibGtoID0gQl9CTEtfSEVBRChiaS0+YmlfYmgpOworICAgIHNldF9ibGtoX25yX2l0ZW0oIGJsa2gsIDAgKTsKKyAgICBzZXRfYmxraF9mcmVlX3NwYWNlKCBibGtoLCBNQVhfQ0hJTERfU0laRShiaS0+YmlfYmgpICk7CisKKyAgICBpZiAoYmktPmJpX3BhcmVudCkKKwlCX05fQ0hJTEQgKGJpLT5iaV9wYXJlbnQsIGJpLT5iaV9wb3NpdGlvbiktPmRjX3NpemUgPSAwOyAvKiBFbmRpYW4gc2FmZSBpZiAwICovCit9CisKKworLyogR2V0IGZpcnN0IGVtcHR5IGJ1ZmZlciAqLworc3RydWN0IGJ1ZmZlcl9oZWFkICogZ2V0X0ZFQiAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiKQoreworICAgIGludCBpOworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGZpcnN0X2I7CisgICAgc3RydWN0IGJ1ZmZlcl9pbmZvIGJpOworCisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9GRUJfU0laRTsgaSArKykKKwlpZiAodGItPkZFQltpXSAhPSAwKQorCSAgICBicmVhazsKKworICAgIGlmIChpID09IE1BWF9GRUJfU0laRSkKKwlyZWlzZXJmc19wYW5pYyh0Yi0+dGJfc2IsICJ2cy0xMjMwMDogZ2V0X0ZFQjogRkVCIGxpc3QgaXMgZW1wdHkiKTsKKworICAgIGJpLnRiID0gdGI7CisgICAgYmkuYmlfYmggPSBmaXJzdF9iID0gdGItPkZFQltpXTsKKyAgICBiaS5iaV9wYXJlbnQgPSBOVUxMOworICAgIGJpLmJpX3Bvc2l0aW9uID0gMDsKKyAgICBtYWtlX2VtcHR5X25vZGUgKCZiaSk7CisgICAgc2V0X2J1ZmZlcl91cHRvZGF0ZShmaXJzdF9iKTsKKyAgICB0Yi0+RkVCW2ldID0gTlVMTDsKKyAgICB0Yi0+dXNlZFtpXSA9IGZpcnN0X2I7CisKKyAgICByZXR1cm4oZmlyc3RfYik7Cit9CisKKworLyogVGhpcyBpcyBub3cgdXNlZCBiZWNhdXNlIHJlaXNlcmZzX2ZyZWVfYmxvY2sgaGFzIHRvIGJlIGFibGUgdG8KKyoqIHNjaGVkdWxlLgorKi8KK3N0YXRpYyB2b2lkIHN0b3JlX3Rocm93biAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCkKK3sKKyAgICBpbnQgaTsKKworICAgIGlmIChidWZmZXJfZGlydHkgKGJoKSkKKyAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHRiLT50Yl9zYiwgInN0b3JlX3Rocm93biBkZWFscyB3aXRoIGRpcnR5IGJ1ZmZlciIpOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHRiLT50aHJvd24pL3NpemVvZiAodGItPnRocm93blswXSk7IGkgKyspCisJaWYgKCF0Yi0+dGhyb3duW2ldKSB7CisJICAgIHRiLT50aHJvd25baV0gPSBiaDsKKwkgICAgZ2V0X2JoKGJoKSA7IC8qIGZyZWVfdGhyb3duIHB1dHMgdGhpcyAqLworCSAgICByZXR1cm47CisJfQorICAgIHJlaXNlcmZzX3dhcm5pbmcgKHRiLT50Yl9zYiwgInN0b3JlX3Rocm93bjogdG9vIG1hbnkgdGhyb3duIGJ1ZmZlcnMiKTsKK30KKworc3RhdGljIHZvaWQgZnJlZV90aHJvd24oc3RydWN0IHRyZWVfYmFsYW5jZSAqdGIpIHsKKyAgICBpbnQgaSA7CisgICAgYl9ibG9ja25yX3QgYmxvY2tuciA7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAodGItPnRocm93bikvc2l6ZW9mICh0Yi0+dGhyb3duWzBdKTsgaSsrKSB7CisJaWYgKHRiLT50aHJvd25baV0pIHsKKwkgICAgYmxvY2tuciA9IHRiLT50aHJvd25baV0tPmJfYmxvY2tuciA7CisJICAgIGlmIChidWZmZXJfZGlydHkgKHRiLT50aHJvd25baV0pKQorCSAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHRiLT50Yl9zYiwKKwkJCQkiZnJlZV90aHJvd24gZGVhbHMgd2l0aCBkaXJ0eSBidWZmZXIgJWQiLAorCQkJCWJsb2NrbnIpOworCSAgICBicmVsc2UodGItPnRocm93bltpXSkgOyAvKiBpbmNyZW1lbnRlZCBpbiBzdG9yZV90aHJvd24gKi8KKwkgICAgcmVpc2VyZnNfZnJlZV9ibG9jayAodGItPnRyYW5zYWN0aW9uX2hhbmRsZSwgTlVMTCwgYmxvY2tuciwgMCk7CisJfQorICAgIH0KK30KKwordm9pZCByZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlciAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCkKK3sKKyAgICBzdHJ1Y3QgYmxvY2tfaGVhZCAqYmxraDsKKyAgICBibGtoID0gQl9CTEtfSEVBRChiaCk7CisgICAgc2V0X2Jsa2hfbGV2ZWwoIGJsa2gsIEZSRUVfTEVWRUwgKTsKKyAgICBzZXRfYmxraF9ucl9pdGVtKCBibGtoLCAwICk7CisgICAgCisgICAgY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKKyAgICBzdG9yZV90aHJvd24gKHRiLCBiaCk7Cit9CisKKy8qIFJlcGxhY2Ugbl9kZXN0J3RoIGtleSBpbiBidWZmZXIgZGVzdCBieSBuX3NyYyd0aCBrZXkgb2YgYnVmZmVyIHNyYy4qLwordm9pZCByZXBsYWNlX2tleSAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBkZXN0LCBpbnQgbl9kZXN0LAorCQkgIHN0cnVjdCBidWZmZXJfaGVhZCAqIHNyYywgaW50IG5fc3JjKQoreworCisgICAgUkZBTFNFKCBkZXN0ID09IE5VTEwgfHwgc3JjID09IE5VTEwsCisJICAgICJ2cy0xMjMwNTogc291cmNlIG9yIGRlc3RpbmF0aW9uIGJ1ZmZlciBpcyAwIChzcmM9JXAsIGRlc3Q9JXApIiwKKwkgICAgc3JjLCBkZXN0KTsKKyAgICBSRkFMU0UoICEgQl9JU19LRVlTX0xFVkVMIChkZXN0KSwKKwkgICAgInZzLTEyMzEwOiBpbnZhbGlkIGxldmVsICgleikgZm9yIGRlc3RpbmF0aW9uIGJ1ZmZlci4gZGVzdCBtdXN0IGJlIGxlYWYiLAorCSAgICBkZXN0KTsKKyAgICBSRkFMU0UoIG5fZGVzdCA8IDAgfHwgbl9zcmMgPCAwLAorCSAgICAidnMtMTIzMTU6IHNyYyglZCkgb3IgZGVzdCglZCkga2V5IG51bWJlciA8IDAiLCBuX3NyYywgbl9kZXN0KTsKKyAgICBSRkFMU0UoIG5fZGVzdCA+PSBCX05SX0lURU1TKGRlc3QpIHx8IG5fc3JjID49IEJfTlJfSVRFTVMoc3JjKSwKKwkgICAgInZzLTEyMzIwOiBzcmMoJWQoJWQpKSBvciBkZXN0KCVkKCVkKSkga2V5IG51bWJlciBpcyB0b28gYmlnIiwKKwkgICAgbl9zcmMsIEJfTlJfSVRFTVMoc3JjKSwgbl9kZXN0LCBCX05SX0lURU1TKGRlc3QpKTsKKyAgIAorICAgIGlmIChCX0lTX0lURU1TX0xFVkVMIChzcmMpKQorCS8qIHNvdXJjZSBidWZmZXIgY29udGFpbnMgbGVhZiBub2RlICovCisJbWVtY3B5IChCX05fUERFTElNX0tFWShkZXN0LG5fZGVzdCksIEJfTl9QSVRFTV9IRUFEKHNyYyxuX3NyYyksIEtFWV9TSVpFKTsKKyAgICBlbHNlCisJbWVtY3B5IChCX05fUERFTElNX0tFWShkZXN0LG5fZGVzdCksIEJfTl9QREVMSU1fS0VZKHNyYyxuX3NyYyksIEtFWV9TSVpFKTsKKworICAgIGRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSAodGIsIGRlc3QsIDApOworfQorCisKK2ludCBnZXRfbGVmdF9uZWlnaGJvcl9wb3NpdGlvbiAoCisJCQkJc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCAKKwkJCQlpbnQgaAorCQkJCSkKK3sKKyAgaW50IFNoX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgaCArIDEpOworCisgIFJGQUxTRSggUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCBoKSA9PSAwIHx8IHRiLT5GTFtoXSA9PSAwLAorCSAgInZzLTEyMzI1OiBGTFslZF0oJXApIG9yIEZbJWRdKCVwKSBkb2VzIG5vdCBleGlzdCIsIAorCSAgaCwgdGItPkZMW2hdLCBoLCBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIGgpKTsKKworICBpZiAoU2hfcG9zaXRpb24gPT0gMCkKKyAgICByZXR1cm4gQl9OUl9JVEVNUyAodGItPkZMW2hdKTsKKyAgZWxzZQorICAgIHJldHVybiBTaF9wb3NpdGlvbiAtIDE7Cit9CisKKworaW50IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbiAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgaCkKK3sKKyAgaW50IFNoX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgaCArIDEpOworCisgIFJGQUxTRSggUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCBoKSA9PSAwIHx8IHRiLT5GUltoXSA9PSAwLAorCSAgInZzLTEyMzMwOiBGWyVkXSglcCkgb3IgRlJbJWRdKCVwKSBkb2VzIG5vdCBleGlzdCIsIAorCSAgaCwgUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCBoKSwgaCwgdGItPkZSW2hdKTsKKworICBpZiAoU2hfcG9zaXRpb24gPT0gQl9OUl9JVEVNUyAoUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCBoKSkpCisgICAgcmV0dXJuIDA7CisgIGVsc2UKKyAgICByZXR1cm4gU2hfcG9zaXRpb24gKyAxOworfQorCisKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKworaW50IGlzX3JldXNhYmxlIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLCBiX2Jsb2NrbnJfdCBibG9jaywgaW50IGJpdF92YWx1ZSk7CitzdGF0aWMgdm9pZCBjaGVja19pbnRlcm5hbF9ub2RlIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwgY2hhciAqIG1lcykKK3sKKyAgc3RydWN0IGRpc2tfY2hpbGQgKiBkYzsKKyAgaW50IGk7CisKKyAgUkZBTFNFKCAhYmgsICJQQVAtMTIzMzY6IGJoID09IDAiKTsKKworICBpZiAoIWJoIHx8ICFCX0lTX0lOX1RSRUUgKGJoKSkKKyAgICByZXR1cm47CisgCisgIFJGQUxTRSggIWJ1ZmZlcl9kaXJ0eSAoYmgpICYmIAorCSAgIShidWZmZXJfam91cm5hbGVkKGJoKSB8fCBidWZmZXJfam91cm5hbF9kaXJ0eShiaCkpLAorCSAgIlBBUC0xMjMzNzogYnVmZmVyICglYikgbXVzdCBiZSBkaXJ0eSIsIGJoKTsKKyAgZGMgPSBCX05fQ0hJTEQgKGJoLCAwKTsKKworICBmb3IgKGkgPSAwOyBpIDw9IEJfTlJfSVRFTVMgKGJoKTsgaSArKywgZGMgKyspIHsKKyAgICBpZiAoIWlzX3JldXNhYmxlIChzLCBkY19ibG9ja19udW1iZXIoZGMpLCAxKSApIHsKKyAgICAgIHByaW50X2N1cl90YiAobWVzKTsKKyAgICAgIHJlaXNlcmZzX3BhbmljIChzLCAiUEFQLTEyMzM4OiBjaGVja19pbnRlcm5hbF9ub2RlOiBpbnZhbGlkIGNoaWxkIHBvaW50ZXIgJXkgaW4gJWIiLCBkYywgYmgpOworICAgIH0KKyAgfQorfQorCisKK3N0YXRpYyBpbnQgbG9ja2VkX29yX25vdF9pbl90cmVlIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwgY2hhciAqIHdoaWNoKQoreworICBpZiAoICghYnVmZmVyX2pvdXJuYWxfcHJlcGFyZWQgKGJoKSAmJiBidWZmZXJfbG9ja2VkIChiaCkpIHx8CisgICAgICAgICFCX0lTX0lOX1RSRUUgKGJoKSApIHsKKyAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAidnMtMTIzMzk6IGxvY2tlZF9vcl9ub3RfaW5fdHJlZTogJXMgKCViKSIsCisgICAgICAgICAgICAgICAgICAgICAgd2hpY2gsIGJoKTsKKyAgICByZXR1cm4gMTsKKyAgfSAKKyAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBjaGVja19iZWZvcmVfYmFsYW5jaW5nIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIpCit7CisgIGludCByZXR2YWwgPSAwOwkKKworICBpZiAoIGN1cl90YiApIHsKKyAgICByZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAidnMtMTIzMzU6IGNoZWNrX2JlZm9yZV9iYWxhbmNpbmc6ICIKKwkJICAgICJzdXNwZWN0IHRoYXQgc2NoZWR1bGUgb2NjdXJyZWQgYmFzZWQgb24gY3VyX3RiIG5vdCBiZWluZyBudWxsIGF0IHRoaXMgcG9pbnQgaW4gY29kZS4gIgorCQkgICAgImRvX2JhbGFuY2UgY2Fubm90IHByb3Blcmx5IGhhbmRsZSBzY2hlZHVsZSBvY2N1cnJpbmcgd2hpbGUgaXQgcnVucy4iKTsKKyAgfQorICAKKyAgLyogZG91YmxlIGNoZWNrIHRoYXQgYnVmZmVycyB0aGF0IHdlIHdpbGwgbW9kaWZ5IGFyZSB1bmxvY2tlZC4gKGZpeF9ub2RlcyBzaG91bGQgYWxyZWFkeSBoYXZlCisgICAgIHByZXBwZWQgYWxsIG9mIHRoZXNlIGZvciB1cykuICovCisgIGlmICggdGItPmxudW1bMF0gKSB7CisgICAgcmV0dmFsIHw9IGxvY2tlZF9vcl9ub3RfaW5fdHJlZSAodGItPkxbMF0sICJMWzBdIik7CisgICAgcmV0dmFsIHw9IGxvY2tlZF9vcl9ub3RfaW5fdHJlZSAodGItPkZMWzBdLCAiRkxbMF0iKTsKKyAgICByZXR2YWwgfD0gbG9ja2VkX29yX25vdF9pbl90cmVlICh0Yi0+Q0ZMWzBdLCAiQ0ZMWzBdIik7CisgICAgY2hlY2tfbGVhZiAodGItPkxbMF0pOworICB9CisgIGlmICggdGItPnJudW1bMF0gKSB7CisgICAgcmV0dmFsIHw9IGxvY2tlZF9vcl9ub3RfaW5fdHJlZSAodGItPlJbMF0sICJSWzBdIik7CisgICAgcmV0dmFsIHw9IGxvY2tlZF9vcl9ub3RfaW5fdHJlZSAodGItPkZSWzBdLCAiRlJbMF0iKTsKKyAgICByZXR2YWwgfD0gbG9ja2VkX29yX25vdF9pbl90cmVlICh0Yi0+Q0ZSWzBdLCAiQ0ZSWzBdIik7CisgICAgY2hlY2tfbGVhZiAodGItPlJbMF0pOworICB9CisgIHJldHZhbCB8PSBsb2NrZWRfb3Jfbm90X2luX3RyZWUgKFBBVEhfUExBU1RfQlVGRkVSICh0Yi0+dGJfcGF0aCksICJTWzBdIik7CisgIGNoZWNrX2xlYWYgKFBBVEhfUExBU1RfQlVGRkVSICh0Yi0+dGJfcGF0aCkpOworCisgIHJldHVybiByZXR2YWw7Cit9CisKKworc3RhdGljIHZvaWQgY2hlY2tfYWZ0ZXJfYmFsYW5jZV9sZWFmIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIpCit7CisgICAgaWYgKHRiLT5sbnVtWzBdKSB7CisJaWYgKEJfRlJFRV9TUEFDRSAodGItPkxbMF0pICE9IAorCSAgICBNQVhfQ0hJTERfU0laRSAodGItPkxbMF0pIC0gZGNfc2l6ZShCX05fQ0hJTEQgKHRiLT5GTFswXSwgZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCAwKSkpKSB7CisJICAgIHByaW50X2N1cl90YiAoIjEyMjIxIik7CisJICAgIHJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJQQVAtMTIzNTU6IGNoZWNrX2FmdGVyX2JhbGFuY2VfbGVhZjogc2hpZnQgdG8gbGVmdCB3YXMgaW5jb3JyZWN0Iik7CisJfQorICAgIH0KKyAgICBpZiAodGItPnJudW1bMF0pIHsKKwlpZiAoQl9GUkVFX1NQQUNFICh0Yi0+UlswXSkgIT0gCisJICAgIE1BWF9DSElMRF9TSVpFICh0Yi0+UlswXSkgLSBkY19zaXplKEJfTl9DSElMRCAodGItPkZSWzBdLCBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCAwKSkpKSB7CisJICAgIHByaW50X2N1cl90YiAoIjEyMjIyIik7CisJICAgIHJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJQQVAtMTIzNjA6IGNoZWNrX2FmdGVyX2JhbGFuY2VfbGVhZjogc2hpZnQgdG8gcmlnaHQgd2FzIGluY29ycmVjdCIpOworCX0KKyAgICB9CisgICAgaWYgKFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLDEpICYmCisJKEJfRlJFRV9TUEFDRSAoUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsMCkpICE9IAorCQkgICAgKE1BWF9DSElMRF9TSVpFIChQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwwKSkgLQorCQkgICAgZGNfc2l6ZShCX05fQ0hJTEQgKFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLDEpLAorCQkgICAgUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgMSkpKSkgKSkgeworCWludCBsZWZ0ID0gQl9GUkVFX1NQQUNFIChQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwwKSk7CisJaW50IHJpZ2h0ID0gKE1BWF9DSElMRF9TSVpFIChQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwwKSkgLQorCQkgICAgZGNfc2l6ZShCX05fQ0hJTEQgKFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLDEpLAorCQkJUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgMSkpKSk7CisJcHJpbnRfY3VyX3RiICgiMTIyMjMiKTsKKwlyZWlzZXJmc193YXJuaW5nICh0Yi0+dGJfc2IsCisJICAgICJCX0ZSRUVfU1BBQ0UgKFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLDApKSA9ICVkOyAiCisgICAgCSAgICAiTUFYX0NISUxEX1NJWkUgKCVkKSAtIGRjX3NpemUoICV5LCAlZCApIFslZF0gPSAlZCIsCisJICAgIGxlZnQsCisJICAgIE1BWF9DSElMRF9TSVpFIChQQVRIX0hfUEJVRkZFUih0Yi0+dGJfcGF0aCwwKSksCisJICAgIFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLDEpLAorCSAgICBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCAxKSwKKwkgICAgZGNfc2l6ZShCX05fQ0hJTEQgKFBBVEhfSF9QQlVGRkVSKHRiLT50Yl9wYXRoLDEpLCBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCAxICkpICksCisJICAgIHJpZ2h0ICk7CisJcmVpc2VyZnNfcGFuaWMgKHRiLT50Yl9zYiwgIlBBUC0xMjM2NTogY2hlY2tfYWZ0ZXJfYmFsYW5jZV9sZWFmOiBTIGlzIGluY29ycmVjdCIpOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZCBjaGVja19sZWFmX2xldmVsIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIpCit7CisgIGNoZWNrX2xlYWYgKHRiLT5MWzBdKTsKKyAgY2hlY2tfbGVhZiAodGItPlJbMF0pOworICBjaGVja19sZWFmIChQQVRIX1BMQVNUX0JVRkZFUiAodGItPnRiX3BhdGgpKTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfaW50ZXJuYWxfbGV2ZWxzIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIpCit7CisgIGludCBoOworCisgIC8qIGNoZWNrIGFsbCBpbnRlcm5hbCBub2RlcyAqLworICBmb3IgKGggPSAxOyB0Yi0+aW5zZXJ0X3NpemVbaF07IGggKyspIHsKKyAgICBjaGVja19pbnRlcm5hbF9ub2RlICh0Yi0+dGJfc2IsIFBBVEhfSF9QQlVGRkVSICh0Yi0+dGJfcGF0aCwgaCksICJCQUQgQlVGRkVSIE9OIFBBVEgiKTsKKyAgICBpZiAodGItPmxudW1baF0pCisgICAgICBjaGVja19pbnRlcm5hbF9ub2RlICh0Yi0+dGJfc2IsIHRiLT5MW2hdLCAiQkFEIEwiKTsKKyAgICBpZiAodGItPnJudW1baF0pCisgICAgICBjaGVja19pbnRlcm5hbF9ub2RlICh0Yi0+dGJfc2IsIHRiLT5SW2hdLCAiQkFEIFIiKTsKKyAgfQorCit9CisKKyNlbmRpZgorCisKKworCisKKworLyogTm93IHdlIGhhdmUgYWxsIG9mIHRoZSBidWZmZXJzIHRoYXQgbXVzdCBiZSB1c2VkIGluIGJhbGFuY2luZyBvZgorICAgdGhlIHRyZWUuICBXZSByZWx5IG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgc2NoZWR1bGUoKSB3aWxsIG5vdCBvY2N1cgorICAgd2hpbGUgZG9fYmFsYW5jZSB3b3Jrcy4gKCBPbmx5IGludGVycnVwdCBoYW5kbGVycyBhcmUgYWNjZXB0YWJsZS4pCisgICBXZSBiYWxhbmNlIHRoZSB0cmVlIGFjY29yZGluZyB0byB0aGUgYW5hbHlzaXMgbWFkZSBiZWZvcmUgdGhpcywKKyAgIHVzaW5nIGJ1ZmZlcnMgYWxyZWFkeSBvYnRhaW5lZC4gIEZvciBTTVAgc3VwcG9ydCBpdCB3aWxsIHNvbWVkYXkgYmUKKyAgIG5lY2Vzc2FyeSB0byBhZGQgb3JkZXJlZCBsb2NraW5nIG9mIHRiLiAqLworCisvKiBTb21lIGludGVyZXN0aW5nIHJ1bGVzIG9mIGJhbGFuY2luZzoKKworICAgd2UgZGVsZXRlIGEgbWF4aW11bSBvZiB0d28gbm9kZXMgcGVyIGxldmVsIHBlciBiYWxhbmNpbmc6IHdlIG5ldmVyCisgICBkZWxldGUgUiwgd2hlbiB3ZSBkZWxldGUgdHdvIG9mIHRocmVlIG5vZGVzIEwsIFMsIFIgdGhlbiB3ZSBtb3ZlCisgICB0aGVtIGludG8gUi4KKworICAgd2Ugb25seSBkZWxldGUgTCBpZiB3ZSBhcmUgZGVsZXRpbmcgdHdvIG5vZGVzLCBpZiB3ZSBkZWxldGUgb25seQorICAgb25lIG5vZGUgd2UgZGVsZXRlIFMKKworICAgaWYgd2Ugc2hpZnQgbGVhdmVzIHRoZW4gd2Ugc2hpZnQgYXMgbXVjaCBhcyB3ZSBjYW46IHRoaXMgaXMgYQorICAgZGVsaWJlcmF0ZSBwb2xpY3kgb2YgZXh0cmVtaXNtIGluIG5vZGUgcGFja2luZyB3aGljaCByZXN1bHRzIGluCisgICBoaWdoZXIgYXZlcmFnZSB1dGlsaXphdGlvbiBhZnRlciByZXBlYXRlZCByYW5kb20gYmFsYW5jZSBvcGVyYXRpb25zCisgICBhdCB0aGUgY29zdCBvZiBtb3JlIG1lbW9yeSBjb3BpZXMgYW5kIG1vcmUgYmFsYW5jaW5nIGFzIGEgcmVzdWx0IG9mCisgICBzbWFsbCBpbnNlcnRpb25zIHRvIGZ1bGwgbm9kZXMuCisKKyAgIGlmIHdlIHNoaWZ0IGludGVybmFsIG5vZGVzIHdlIHRyeSB0byBldmVubHkgYmFsYW5jZSB0aGUgbm9kZQorICAgdXRpbGl6YXRpb24sIHdpdGggY29uc2VxdWVudCBsZXNzIGJhbGFuY2luZyBhdCB0aGUgY29zdCBvZiBsb3dlcgorICAgdXRpbGl6YXRpb24uCisKKyAgIG9uZSBjb3VsZCBhcmd1ZSB0aGF0IHRoZSBwb2xpY3kgZm9yIGRpcmVjdG9yaWVzIGluIGxlYXZlcyBzaG91bGQgYmUKKyAgIHRoYXQgb2YgaW50ZXJuYWwgbm9kZXMsIGJ1dCB3ZSB3aWxsIHdhaXQgdW50aWwgYW5vdGhlciBkYXkgdG8KKyAgIGV2YWx1YXRlIHRoaXMuLi4uICBJdCB3b3VsZCBiZSBuaWNlIHRvIHNvbWVkYXkgbWVhc3VyZSBhbmQgcHJvdmUKKyAgIHRoZXNlIGFzc3VtcHRpb25zIGFzIHRvIHdoYXQgaXMgb3B0aW1hbC4uLi4KKworKi8KKworc3RhdGljIGlubGluZSB2b2lkIGRvX2JhbGFuY2Vfc3RhcnRzIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICp0YikKK3sKKyAgICAvKiB1c2UgcHJpbnRfY3VyX3RiKCkgdG8gc2VlIGluaXRpYWwgc3RhdGUgb2Ygc3RydWN0CisgICAgICAgdHJlZV9iYWxhbmNlICovCisKKyAgICAvKiBzdG9yZV9wcmludF90YiAodGIpOyAqLworCisgICAgLyogZG8gbm90IGRlbGV0ZSwganVzdCBjb21tZW50IGl0IG91dCAqLworLyogICAgcHJpbnRfdGIoZmxhZywgUEFUSF9MQVNUX1BPU0lUSU9OKHRiLT50Yl9wYXRoKSwgdGItPnRiX3BhdGgtPnBvc19pbl9pdGVtLCB0YiwgCisJICAgICAiY2hlY2siKTsqLworICAgIFJGQUxTRSggY2hlY2tfYmVmb3JlX2JhbGFuY2luZyAodGIpLCAiUEFQLTEyMzQwOiBsb2NrZWQgYnVmZmVycyBpbiBUQiIpOworI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSworICAgIGN1cl90YiA9IHRiOworI2VuZGlmCit9CisKKworc3RhdGljIGlubGluZSB2b2lkIGRvX2JhbGFuY2VfY29tcGxldGVkIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIpCit7CisgICAgCisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisgICAgY2hlY2tfbGVhZl9sZXZlbCAodGIpOworICAgIGNoZWNrX2ludGVybmFsX2xldmVscyAodGIpOworICAgIGN1cl90YiA9IE5VTEw7CisjZW5kaWYKKworICAgIC8qIHJlaXNlcmZzX2ZyZWVfYmxvY2sgaXMgbm8gbG9uZ2VyIHNjaGVkdWxlIHNhZmUuICBTbywgd2UgbmVlZCB0bworICAgICoqIHB1dCB0aGUgYnVmZmVycyB3ZSB3YW50IGZyZWVkIG9uIHRoZSB0aHJvd24gbGlzdCBkdXJpbmcgZG9fYmFsYW5jZSwKKyAgICAqKiBhbmQgdGhlbiBmcmVlIHRoZW0gbm93CisgICAgKi8KKworICAgIFJFSVNFUkZTX1NCKHRiLT50Yl9zYiktPnNfZG9fYmFsYW5jZSArKzsKKworCisgICAgLyogcmVsZWFzZSBhbGwgbm9kZXMgaG9sZCB0byBwZXJmb3JtIHRoZSBiYWxhbmNpbmcgKi8KKyAgICB1bmZpeF9ub2Rlcyh0Yik7CisKKyAgICBmcmVlX3Rocm93bih0YikgOworfQorCisKKworCisKK3ZvaWQgZG9fYmFsYW5jZSAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCAvKiB0cmVlX2JhbGFuY2Ugc3RydWN0dXJlICovCisJCSBzdHJ1Y3QgaXRlbV9oZWFkICogaWgsCSAgIC8qIGl0ZW0gaGVhZGVyIG9mIGluc2VydGVkIGl0ZW0gKi8KKwkJIGNvbnN0IGNoYXIgKiBib2R5LCAgLyogYm9keSAgb2YgaW5zZXJ0ZWQgaXRlbSBvciBieXRlcyB0byBwYXN0ZSAqLworCQkgaW50IGZsYWcpICAvKiBpIC0gaW5zZXJ0LCBkIC0gZGVsZXRlCisJCQkgICAgICAgYyAtIGN1dCwgcCAtIHBhc3RlCisJCQkJCQkgICAgICAKKwkJCSAgICAgICBDdXQgbWVhbnMgZGVsZXRlIHBhcnQgb2YgYW4gaXRlbQorCQkJICAgICAgIChpbmNsdWRlcyByZW1vdmluZyBhbiBlbnRyeSBmcm9tIGEKKwkJCSAgICAgICBkaXJlY3RvcnkpLgorCQkJCQkJICAgICAgCisJCQkgICAgICAgRGVsZXRlIG1lYW5zIGRlbGV0ZSB3aG9sZSBpdGVtLgorCQkJCQkJICAgICAgCisJCQkgICAgICAgSW5zZXJ0IG1lYW5zIGFkZCBhIG5ldyBpdGVtIGludG8gdGhlCisJCQkgICAgICAgdHJlZS4KKwkJCQkJCSAgICAgIAkJCQkJCSAgICAgIAorCQkJICAgICAgIFBhc3RlIG1lYW5zIHRvIGFwcGVuZCB0byB0aGUgZW5kIG9mIGFuCisJCQkgICAgICAgZXhpc3RpbmcgZmlsZSBvciB0byBpbnNlcnQgYSBkaXJlY3RvcnkKKwkJCSAgICAgICBlbnRyeS4gICovCit7CisgICAgaW50IGNoaWxkX3BvcywgLyogcG9zaXRpb24gb2YgYSBjaGlsZCBub2RlIGluIGl0cyBwYXJlbnQgKi8KKwloOwkgICAvKiBsZXZlbCBvZiB0aGUgdHJlZSBiZWluZyBwcm9jZXNzZWQgKi8KKyAgICBzdHJ1Y3QgaXRlbV9oZWFkIGluc2VydF9rZXlbMl07IC8qIGluIG91ciBwcm9jZXNzaW5nIG9mIG9uZSBsZXZlbAorCQkJCSAgICAgICB3ZSBzb21ldGltZXMgZGV0ZXJtaW5lIHdoYXQKKwkJCQkgICAgICAgbXVzdCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBuZXh0CisJCQkJICAgICAgIGhpZ2hlciBsZXZlbC4gIFRoaXMgaW5zZXJ0aW9uCisJCQkJICAgICAgIGNvbnNpc3RzIG9mIGEga2V5IG9yIHR3byBrZXlzCisJCQkJICAgICAgIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nCisJCQkJICAgICAgIHBvaW50ZXJzICovCisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICppbnNlcnRfcHRyWzJdOyAvKiBpbnNlcnRlZCBub2RlLXB0cnMgZm9yIHRoZSBuZXh0CisJCQkJCSAgbGV2ZWwgKi8KKworICAgIHRiLT50Yl9tb2RlID0gZmxhZzsKKyAgICB0Yi0+bmVlZF9iYWxhbmNlX2RpcnR5ID0gMDsKKworICAgIGlmIChGSUxFU1lTVEVNX0NIQU5HRURfVEIodGIpKSB7CisgICAgICAgIHJlaXNlcmZzX3BhbmljKHRiLT50Yl9zYiwgImNsbS02MDAwOiBkb19iYWxhbmNlLCBmcyBnZW5lcmF0aW9uIGhhcyBjaGFuZ2VkXG4iKSA7CisgICAgfQorICAgIC8qIGlmIHdlIGhhdmUgbm8gcmVhbCB3b3JrIHRvIGRvICAqLworICAgIGlmICggISB0Yi0+aW5zZXJ0X3NpemVbMF0gKSB7CisJcmVpc2VyZnNfd2FybmluZyAodGItPnRiX3NiLAorCQkJICAiUEFQLTEyMzUwOiBkb19iYWxhbmNlOiBpbnNlcnRfc2l6ZSA9PSAwLCBtb2RlID09ICVjIiwKKwkJCSAgZmxhZyk7CisJdW5maXhfbm9kZXModGIpOworCXJldHVybjsKKyAgICB9CisKKyAgICBhdG9taWNfaW5jICgmKGZzX2dlbmVyYXRpb24gKHRiLT50Yl9zYikpKTsKKyAgICBkb19iYWxhbmNlX3N0YXJ0cyAodGIpOworICAgIAorCS8qIGJhbGFuY2UgbGVhZiByZXR1cm5zIDAgZXhjZXB0IGlmIGNvbWJpbmluZyBMIFIgYW5kIFMgaW50bworCSAgIG9uZSBub2RlLiAgc2VlIGJhbGFuY2VfaW50ZXJuYWwoKSBmb3IgZXhwbGFuYXRpb24gb2YgdGhpcworCSAgIGxpbmUgb2YgY29kZS4qLworCWNoaWxkX3BvcyA9IFBBVEhfSF9CX0lURU1fT1JERVIgKHRiLT50Yl9wYXRoLCAwKSArCisJICBiYWxhbmNlX2xlYWYgKHRiLCBpaCwgYm9keSwgZmxhZywgaW5zZXJ0X2tleSwgaW5zZXJ0X3B0cik7CisKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKyAgICBjaGVja19hZnRlcl9iYWxhbmNlX2xlYWYgKHRiKTsKKyNlbmRpZgorCisgICAgLyogQmFsYW5jZSBpbnRlcm5hbCBsZXZlbCBvZiB0aGUgdHJlZS4gKi8KKyAgICBmb3IgKCBoID0gMTsgaCA8IE1BWF9IRUlHSFQgJiYgdGItPmluc2VydF9zaXplW2hdOyBoKysgKQorCWNoaWxkX3BvcyA9IGJhbGFuY2VfaW50ZXJuYWwgKHRiLCBoLCBjaGlsZF9wb3MsIGluc2VydF9rZXksIGluc2VydF9wdHIpOworCisKKyAgICBkb19iYWxhbmNlX2NvbXBsZXRlZCAodGIpOworCit9CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9maWxlLmMgYi9mcy9yZWlzZXJmcy9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY5NTAxMQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3JlaXNlcmZzL2ZpbGUuYwpAQCAtMCwwICsxLDE0MDggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMCBieSBIYW5zIFJlaXNlciwgbGljZW5zaW5nIGdvdmVybmVkIGJ5IHJlaXNlcmZzL1JFQURNRQorICovCisKKworI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2FjbC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX3hhdHRyLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorCisvKgorKiogV2UgcGFjayB0aGUgdGFpbHMgb2YgZmlsZXMgb24gZmlsZSBjbG9zZSwgbm90IGF0IHRoZSB0aW1lIHRoZXkgYXJlIHdyaXR0ZW4uCisqKiBUaGlzIGltcGxpZXMgYW4gdW5uZWNlc3NhcnkgY29weSBvZiB0aGUgdGFpbCBhbmQgYW4gdW5uZWNlc3NhcnkgaW5kaXJlY3QgaXRlbQorKiogaW5zZXJ0aW9uL2JhbGFuY2luZywgZm9yIGZpbGVzIHRoYXQgYXJlIHdyaXR0ZW4gaW4gb25lIHdyaXRlLgorKiogSXQgYXZvaWRzIHVubmVjZXNzYXJ5IHRhaWwgcGFja2luZ3MgKGJhbGFuY2VzKSBmb3IgZmlsZXMgdGhhdCBhcmUgd3JpdHRlbiBpbgorKiogbXVsdGlwbGUgd3JpdGVzIGFuZCBhcmUgc21hbGwgZW5vdWdoIHRvIGhhdmUgdGFpbHMuCisqKiAKKyoqIGZpbGVfcmVsZWFzZSBpcyBjYWxsZWQgYnkgdGhlIFZGUyBsYXllciB3aGVuIHRoZSBmaWxlIGlzIGNsb3NlZC4gIElmCisqKiB0aGlzIGlzIHRoZSBsYXN0IG9wZW4gZmlsZSBkZXNjcmlwdG9yLCBhbmQgdGhlIGZpbGUKKyoqIHNtYWxsIGVub3VnaCB0byBoYXZlIGEgdGFpbCwgYW5kIHRoZSB0YWlsIGlzIGN1cnJlbnRseSBpbiBhbgorKiogdW5mb3JtYXR0ZWQgbm9kZSwgdGhlIHRhaWwgaXMgY29udmVydGVkIGJhY2sgaW50byBhIGRpcmVjdCBpdGVtLgorKiogCisqKiBXZSB1c2UgcmVpc2VyZnNfdHJ1bmNhdGVfZmlsZSB0byBwYWNrIHRoZSB0YWlsLCBzaW5jZSBpdCBhbHJlYWR5IGhhcworKiogYWxsIHRoZSBjb25kaXRpb25zIGNvZGVkLiAgCisqLworc3RhdGljIGludCByZWlzZXJmc19maWxlX3JlbGVhc2UgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoIDsKKyAgICBpbnQgZXJyOworICAgIGludCBqYmVnaW5fZmFpbHVyZSA9IDA7CisKKyAgICBpZiAoIVNfSVNSRUcgKGlub2RlLT5pX21vZGUpKQorCUJVRyAoKTsKKworICAgIC8qIGZhc3Qgb3V0IGZvciB3aGVuIG5vdGhpbmcgbmVlZHMgdG8gYmUgZG9uZSAqLworICAgIGlmICgoYXRvbWljX3JlYWQoJmlub2RlLT5pX2NvdW50KSA+IDEgfHwKKwkhKFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICYgaV9wYWNrX29uX2Nsb3NlX21hc2spIHx8IAorICAgICAgICAgIXRhaWxfaGFzX3RvX2JlX3BhY2tlZChpbm9kZSkpICAgICAgICYmIAorCVJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2NvdW50IDw9IDApIHsKKwlyZXR1cm4gMDsKKyAgICB9ICAgIAorICAgIAorICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworICAgIGRvd24gKCZpbm9kZS0+aV9zZW0pOyAKKyAgICAvKiBmcmVlaW5nIHByZWFsbG9jYXRpb24gb25seSBpbnZvbHZlcyByZWxvZ2dpbmcgYmxvY2tzIHRoYXQKKyAgICAgKiBhcmUgYWxyZWFkeSBpbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4gIHByZWFsbG9jYXRpb24gZ2V0cworICAgICAqIGZyZWVkIGF0IHRoZSBlbmQgb2YgZWFjaCB0cmFuc2FjdGlvbiwgc28gaXQgaXMgaW1wb3NzaWJsZSBmb3IKKyAgICAgKiB1cyB0byBsb2cgYW55IGFkZGl0aW9uYWwgYmxvY2tzIChpbmNsdWRpbmcgcXVvdGEgYmxvY2tzKQorICAgICAqLworICAgIGVyciA9IGpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwgMSk7CisgICAgaWYgKGVycikgeworCS8qIHVoIG9oLCB3ZSBjYW4ndCBhbGxvdyB0aGUgaW5vZGUgdG8gZ28gYXdheSB3aGlsZSB0aGVyZQorCSAqIGlzIHN0aWxsIHByZWFsbG9jYXRpb24gYmxvY2tzIHBlbmRpbmcuICBUcnkgdG8gam9pbiB0aGUKKwkgKiBhYm9ydGVkIHRyYW5zYWN0aW9uCisJICovCisJamJlZ2luX2ZhaWx1cmUgPSBlcnI7CisJZXJyID0gam91cm5hbF9qb2luX2Fib3J0KCZ0aCwgaW5vZGUtPmlfc2IsIDEpOworCisJaWYgKGVycikgeworCSAgICAvKiBobXBmLCBvdXIgY2hvaWNlcyBoZXJlIGFyZW4ndCBnb29kLiAgV2UgY2FuIHBpbiB0aGUgaW5vZGUKKwkgICAgICogd2hpY2ggd2lsbCBkaXNhbGxvdyB1bm1vdW50IGZyb20gZXZlcnkgaGFwcGVuaW5nLCB3ZSBjYW4KKwkgICAgICogZG8gbm90aGluZywgd2hpY2ggd2lsbCBjb3JydXB0IHJhbmRvbSBtZW1vcnkgb24gdW5tb3VudCwKKwkgICAgICogb3Igd2UgY2FuIGZvcmNpYmx5IHJlbW92ZSB0aGUgZmlsZSBmcm9tIHRoZSBwcmVhbGxvY2F0aW9uCisJICAgICAqIGxpc3QsIHdoaWNoIHdpbGwgbGVhayBibG9ja3Mgb24gZGlzay4gIExldHMgcGluIHRoZSBpbm9kZQorCSAgICAgKiBhbmQgbGV0IHRoZSBhZG1pbiBrbm93IHdoYXQgaXMgZ29pbmcgb24uCisJICAgICAqLworCSAgICBpZ3JhYihpbm9kZSk7CisJICAgIHJlaXNlcmZzX3dhcm5pbmcoaW5vZGUtPmlfc2IsICJwaW5uaW5nIGlub2RlICVsdSBiZWNhdXNlIHRoZSAiCisJICAgICAgICAgICAgICAgICAgICAgInByZWFsbG9jYXRpb24gY2FuJ3QgYmUgZnJlZWQiKTsKKwkgICAgZ290byBvdXQ7CisJfQorICAgIH0KKyAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpIDsKKworI2lmZGVmIFJFSVNFUkZTX1BSRUFMTE9DQVRFCisgICAgcmVpc2VyZnNfZGlzY2FyZF9wcmVhbGxvYyAoJnRoLCBpbm9kZSk7CisjZW5kaWYKKyAgICBlcnIgPSBqb3VybmFsX2VuZCgmdGgsIGlub2RlLT5pX3NiLCAxKTsKKworICAgIC8qIGNvcHkgYmFjayB0aGUgZXJyb3IgY29kZSBmcm9tIGpvdXJuYWxfYmVnaW4gKi8KKyAgICBpZiAoIWVycikKKyAgICAgICAgZXJyID0gamJlZ2luX2ZhaWx1cmU7CisKKyAgICBpZiAoIWVyciAmJiBhdG9taWNfcmVhZCgmaW5vZGUtPmlfY291bnQpIDw9IDEgJiYKKwkoUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJiBpX3BhY2tfb25fY2xvc2VfbWFzaykgJiYKKyAgICAgICAgdGFpbF9oYXNfdG9fYmVfcGFja2VkIChpbm9kZSkpIHsKKwkvKiBpZiByZWd1bGFyIGZpbGUgaXMgcmVsZWFzZWQgYnkgbGFzdCBob2xkZXIgYW5kIGl0IGhhcyBiZWVuCisJICAgYXBwZW5kZWQgKHdlIGFwcGVuZCBieSB1bmZvcm1hdHRlZCBub2RlIG9ubHkpIG9yIGl0cyBkaXJlY3QKKwkgICBpdGVtKHMpIGhhZCB0byBiZSBjb252ZXJ0ZWQsIHRoZW4gaXQgbWF5IGhhdmUgdG8gYmUKKwkgICBpbmRpcmVjdDJkaXJlY3QgY29udmVydGVkICovCisJZXJyID0gcmVpc2VyZnNfdHJ1bmNhdGVfZmlsZShpbm9kZSwgMCkgOworICAgIH0KK291dDoKKyAgICB1cCAoJmlub2RlLT5pX3NlbSk7IAorICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgcmVpc2VyZnNfdmZzX3RydW5jYXRlX2ZpbGUoc3RydWN0IGlub2RlICppbm9kZSkgeworICAgIHJlaXNlcmZzX3RydW5jYXRlX2ZpbGUoaW5vZGUsIDEpIDsKK30KKworLyogU3luYyBhIHJlaXNlcmZzIGZpbGUuICovCisKKy8qCisgKiBGSVhNRTogc3luY19tYXBwaW5nX2J1ZmZlcnMoKSBuZXZlciBoYXMgYW55dGhpbmcgdG8gc3luYy4gIENhbgorICogYmUgcmVtb3ZlZC4uLgorICovCisKK3N0YXRpYyBpbnQgcmVpc2VyZnNfc3luY19maWxlKAorCQkJICAgICAgc3RydWN0IGZpbGUgICAqIHBfc19maWxwLAorCQkJICAgICAgc3RydWN0IGRlbnRyeSAqIHBfc19kZW50cnksCisJCQkgICAgICBpbnQgZGF0YXN5bmMKKwkJCSAgICAgICkgeworICBzdHJ1Y3QgaW5vZGUgKiBwX3NfaW5vZGUgPSBwX3NfZGVudHJ5LT5kX2lub2RlOworICBpbnQgbl9lcnI7CisgIGludCBiYXJyaWVyX2RvbmU7CisKKyAgaWYgKCFTX0lTUkVHKHBfc19pbm9kZS0+aV9tb2RlKSkKKyAgICAgIEJVRyAoKTsKKyAgbl9lcnIgPSBzeW5jX21hcHBpbmdfYnVmZmVycyhwX3NfaW5vZGUtPmlfbWFwcGluZykgOworICByZWlzZXJmc193cml0ZV9sb2NrKHBfc19pbm9kZS0+aV9zYik7CisgIGJhcnJpZXJfZG9uZSA9IHJlaXNlcmZzX2NvbW1pdF9mb3JfaW5vZGUocF9zX2lub2RlKTsKKyAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHBfc19pbm9kZS0+aV9zYik7CisgIGlmIChiYXJyaWVyX2RvbmUgIT0gMSkKKyAgICAgIGJsa2Rldl9pc3N1ZV9mbHVzaChwX3NfaW5vZGUtPmlfc2ItPnNfYmRldiwgTlVMTCk7CisgIGlmIChiYXJyaWVyX2RvbmUgPCAwKQorICAgIHJldHVybiBiYXJyaWVyX2RvbmU7CisgIHJldHVybiAoIG5fZXJyIDwgMCApID8gLUVJTyA6IDA7Cit9CisKKy8qIEkgcmVhbGx5IGRvIG5vdCB3YW50IHRvIHBsYXkgd2l0aCBtZW1vcnkgc2hvcnRhZ2UgcmlnaHQgbm93LCBzbworICAgdG8gc2ltcGxpZnkgdGhlIGNvZGUsIHdlIGFyZSBub3QgZ29pbmcgdG8gd3JpdGUgbW9yZSB0aGFuIHRoaXMgbXVjaCBwYWdlcyBhdAorICAgYSB0aW1lLiBUaGlzIHN0aWxsIHNob3VsZCBjb25zaWRlcmFibHkgaW1wcm92ZSBwZXJmb3JtYW5jZSBjb21wYXJlZCB0byA0aworICAgYXQgYSB0aW1lIGNhc2UuIFRoaXMgaXMgMzIgcGFnZXMgb2YgNGsgc2l6ZS4gKi8KKyNkZWZpbmUgUkVJU0VSRlNfV1JJVEVfUEFHRVNfQVRfQV9USU1FICgxMjggKiAxMDI0KSAvIFBBR0VfQ0FDSEVfU0laRQorCisvKiBBbGxvY2F0ZXMgYmxvY2tzIGZvciBhIGZpbGUgdG8gZnVsZmlsIHdyaXRlIHJlcXVlc3QuCisgICBNYXBzIGFsbCB1bm1hcHBlZCBidXQgcHJlcGFyZWQgcGFnZXMgZnJvbSB0aGUgbGlzdC4KKyAgIFVwZGF0ZXMgbWV0YWRhdGEgd2l0aCBuZXdseSBhbGxvY2F0ZWQgYmxvY2tudW1iZXJzIGFzIG5lZWRlZCAqLworc3RhdGljIGludCByZWlzZXJmc19hbGxvY2F0ZV9ibG9ja3NfZm9yX3JlZ2lvbigKKwkJCQlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCAvKiBJbm9kZSB3ZSB3b3JrIHdpdGggKi8KKwkJCQlsb2ZmX3QgcG9zLCAvKiBXcml0aW5nIHBvc2l0aW9uICovCisJCQkJaW50IG51bV9wYWdlcywgLyogbnVtYmVyIG9mIHBhZ2VzIHdyaXRlIGdvaW5nCisJCQkJCQkgIHRvIHRvdWNoICovCisJCQkJaW50IHdyaXRlX2J5dGVzLCAvKiBhbW91bnQgb2YgYnl0ZXMgdG8gd3JpdGUgKi8KKwkJCQlzdHJ1Y3QgcGFnZSAqKnByZXBhcmVkX3BhZ2VzLCAvKiBhcnJheSBvZgorCQkJCQkJCSAgICAgICAgIHByZXBhcmVkIHBhZ2VzCisJCQkJCQkJICAgICAgICovCisJCQkJaW50IGJsb2Nrc190b19hbGxvY2F0ZSAvKiBBbW91bnQgb2YgYmxvY2tzIHdlCisJCQkJCQkJICBuZWVkIHRvIGFsbG9jYXRlIHRvCisJCQkJCQkJICBmaXQgdGhlIGRhdGEgaW50byBmaWxlCisJCQkJCQkJICovCisJCQkJKQoreworICAgIHN0cnVjdCBjcHVfa2V5IGtleTsgLy8gY3B1IGtleSBvZiBpdGVtIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGRlYWwgd2l0aAorICAgIHN0cnVjdCBpdGVtX2hlYWQgKmloOyAvLyBwb2ludGVyIHRvIGl0ZW0gaGVhZCB0aGF0IHdlIGFyZSBnb2luZyB0byBkZWFsIHdpdGgKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOyAvLyBCdWZmZXIgaGVhZCB0aGF0IGNvbnRhaW5zIGl0ZW1zIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGRlYWwgd2l0aAorICAgIF9fdTMyICogaXRlbTsgLy8gcG9pbnRlciB0byBpdGVtIHdlIGFyZSBnb2luZyB0byBkZWFsIHdpdGgKKyAgICBJTklUSUFMSVpFX1BBVEgocGF0aCk7IC8vIHBhdGggdG8gaXRlbSwgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gZGVhbCB3aXRoLgorICAgIGJfYmxvY2tucl90ICphbGxvY2F0ZWRfYmxvY2tzOyAvLyBQb2ludGVyIHRvIGEgcGxhY2Ugd2hlcmUgYWxsb2NhdGVkIGJsb2NrbnVtYmVycyB3b3VsZCBiZSBzdG9yZWQuCisgICAgcmVpc2VyZnNfYmxvY2tucl9oaW50X3QgaGludDsgLy8gaGludCBzdHJ1Y3R1cmUgZm9yIGJsb2NrIGFsbG9jYXRvci4KKyAgICBzaXplX3QgcmVzOyAvLyByZXR1cm4gdmFsdWUgb2YgdmFyaW91cyBmdW5jdGlvbnMgdGhhdCB3ZSBjYWxsLgorICAgIGludCBjdXJyX2Jsb2NrOyAvLyBjdXJyZW50IGJsb2NrIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB1bm1hcHBlZCBibG9ja3MuCisgICAgaW50IGk7IC8vIGxvb3AgY291bnRlcgorICAgIGludCBpdGVtcG9zOyAvLyBwb3NpdGlvbiBpbiBpdGVtCisgICAgdW5zaWduZWQgaW50IGZyb20gPSAocG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKTsgLy8gd3JpdGluZyBwb3NpdGlvbiBpbgorCQkJCQkJICAgICAgIC8vIGZpcnN0IHBhZ2UKKyAgICB1bnNpZ25lZCBpbnQgdG8gPSAoKHBvcyArIHdyaXRlX2J5dGVzIC0gMSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpICsgMTsgLyogbGFzdCBtb2RpZmllZCBieXRlIG9mZnNldCBpbiBsYXN0IHBhZ2UgKi8KKyAgICBfX3U2NCBob2xlX3NpemUgOyAvLyBhbW91bnQgb2YgYmxvY2tzIGZvciBhIGZpbGUgaG9sZSwgaWYgaXQgbmVlZGVkIHRvIGJlIGNyZWF0ZWQuCisgICAgaW50IG1vZGlmeWluZ190aGlzX2l0ZW0gPSAwOyAvLyBGbGFnIGZvciBpdGVtcyB0cmF2ZXJzYWwgY29kZSB0byBrZWVwIHRyYWNrCisJCQkJIC8vIG9mIHRoZSBmYWN0IHRoYXQgd2UgYWxyZWFkeSBwcmVwYXJlZAorCQkJCSAvLyBjdXJyZW50IGJsb2NrIGZvciBqb3VybmFsCisgICAgaW50IHdpbGxfcHJlYWxsb2MgPSAwOworICAgIFJGQUxTRSghYmxvY2tzX3RvX2FsbG9jYXRlLCAiZ3JlZW4tOTAwNDogdHJpZWQgdG8gYWxsb2NhdGUgemVybyBibG9ja3M/Iik7CisKKyAgICAvKiBvbmx5IHByZWFsbG9jYXRlIGlmIHRoaXMgaXMgYSBzbWFsbCB3cml0ZSAqLworICAgIGlmIChSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19jb3VudCB8fAorICAgICAgICghKHdyaXRlX2J5dGVzICYgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtMSkpICYmCisgICAgICAgIGJsb2Nrc190b19hbGxvY2F0ZSA8CisgICAgICAgIFJFSVNFUkZTX1NCKGlub2RlLT5pX3NiKS0+c19hbGxvY19vcHRpb25zLnByZWFsbG9jc2l6ZSkpCisgICAgICAgIHdpbGxfcHJlYWxsb2MgPSBSRUlTRVJGU19TQihpbm9kZS0+aV9zYiktPnNfYWxsb2Nfb3B0aW9ucy5wcmVhbGxvY3NpemU7CisKKyAgICBhbGxvY2F0ZWRfYmxvY2tzID0ga21hbGxvYygoYmxvY2tzX3RvX2FsbG9jYXRlICsgd2lsbF9wcmVhbGxvYykgKgorICAgIAkJCQkJc2l6ZW9mKGJfYmxvY2tucl90KSwgR0ZQX05PRlMpOworCisgICAgLyogRmlyc3Qgd2UgY29tcG9zZSBhIGtleSB0byBwb2ludCBhdCB0aGUgd3JpdGluZyBwb3NpdGlvbiwgd2Ugd2FudCB0byBkbworICAgICAgIHRoYXQgb3V0c2lkZSBvZiBhbnkgbG9ja2luZyByZWdpb24uICovCisgICAgbWFrZV9jcHVfa2V5ICgma2V5LCBpbm9kZSwgcG9zKzEsIFRZUEVfQU5ZLCAzLyprZXkgbGVuZ3RoKi8pOworCisgICAgLyogSWYgd2UgY2FtZSBoZXJlLCBpdCBtZWFucyB3ZSBhYnNvbHV0ZWx5IG5lZWQgdG8gb3BlbiBhIHRyYW5zYWN0aW9uLAorICAgICAgIHNpbmNlIHdlIG5lZWQgdG8gYWxsb2NhdGUgc29tZSBibG9ja3MgKi8KKyAgICByZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsgLy8gSm91cm5hbGluZyBzdHVmZiBhbmQgd2UgbmVlZCB0aGF0LgorICAgIHJlcyA9IGpvdXJuYWxfYmVnaW4odGgsIGlub2RlLT5pX3NiLCBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDMgKyAxICsgMiAqIFJFSVNFUkZTX1FVT1RBX1RSQU5TX0JMT0NLUyk7IC8vIFdpc2ggSSBrbm93IGlmIHRoaXMgbnVtYmVyIGVub3VnaAorICAgIGlmIChyZXMpCisgICAgICAgIGdvdG8gZXJyb3JfZXhpdDsKKyAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpIDsKKworICAgIC8qIExvb2sgZm9yIHRoZSBpbi10cmVlIHBvc2l0aW9uIG9mIG91ciB3cml0ZSwgbmVlZCBwYXRoIGZvciBibG9jayBhbGxvY2F0b3IgKi8KKyAgICByZXMgPSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpOworICAgIGlmICggcmVzID09IElPX0VSUk9SICkgeworCXJlcyA9IC1FSU87CisJZ290byBlcnJvcl9leGl0OworICAgIH0KKyAgIAorICAgIC8qIEFsbG9jYXRlIGJsb2NrcyAqLworICAgIC8qIEZpcnN0IGZpbGwgaW4gImhpbnQiIHN0cnVjdHVyZSBmb3IgYmxvY2sgYWxsb2NhdG9yICovCisgICAgaGludC50aCA9IHRoOyAvLyB0cmFuc2FjdGlvbiBoYW5kbGUuCisgICAgaGludC5wYXRoID0gJnBhdGg7IC8vIFBhdGgsIHNvIHRoYXQgYmxvY2sgYWxsb2NhdG9yIGNhbiBkZXRlcm1pbmUgcGFja2luZyBsb2NhbGl0eSBvciB3aGF0ZXZlciBpdCBuZWVkcyB0byBkZXRlcm1pbmUuCisgICAgaGludC5pbm9kZSA9IGlub2RlOyAvLyBJbm9kZSBpcyBuZWVkZWQgYnkgYmxvY2sgYWxsb2NhdG9yIHRvby4KKyAgICBoaW50LnNlYXJjaF9zdGFydCA9IDA7IC8vIFdlIGhhdmUgbm8gaGludCBvbiB3aGVyZSB0byBzZWFyY2ggZnJlZSBibG9ja3MgZm9yIGJsb2NrIGFsbG9jYXRvci4KKyAgICBoaW50LmtleSA9IGtleS5vbl9kaXNrX2tleTsgLy8gb24gZGlzayBrZXkgb2YgZmlsZS4KKyAgICBoaW50LmJsb2NrID0gaW5vZGUtPmlfYmxvY2tzPj4oaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMtOSk7IC8vIE51bWJlciBvZiBkaXNrIGJsb2NrcyB0aGlzIGZpbGUgb2NjdXBpZXMgYWxyZWFkeS4KKyAgICBoaW50LmZvcm1hdHRlZF9ub2RlID0gMDsgLy8gV2UgYXJlIGFsbG9jYXRpbmcgYmxvY2tzIGZvciB1bmZvcm1hdHRlZCBub2RlLgorICAgIGhpbnQucHJlYWxsb2NhdGUgPSB3aWxsX3ByZWFsbG9jOworCisgICAgLyogQ2FsbCBibG9jayBhbGxvY2F0b3IgdG8gYWxsb2NhdGUgYmxvY2tzICovCisgICAgcmVzID0gcmVpc2VyZnNfYWxsb2NhdGVfYmxvY2tucnMoJmhpbnQsIGFsbG9jYXRlZF9ibG9ja3MsIGJsb2Nrc190b19hbGxvY2F0ZSwgYmxvY2tzX3RvX2FsbG9jYXRlKTsKKyAgICBpZiAoIHJlcyAhPSBDQVJSWV9PTiApIHsKKwlpZiAoIHJlcyA9PSBOT19ESVNLX1NQQUNFICkgeworCSAgICAvKiBXZSBmbHVzaCB0aGUgdHJhbnNhY3Rpb24gaW4gY2FzZSBvZiBubyBzcGFjZS4gVGhpcyB3YXkgc29tZQorCSAgICAgICBibG9ja3MgbWlnaHQgYmVjb21lIGZyZWUgKi8KKwkgICAgU0JfSk9VUk5BTChpbm9kZS0+aV9zYiktPmpfbXVzdF93YWl0ID0gMTsKKwkgICAgcmVzID0gcmVzdGFydF90cmFuc2FjdGlvbih0aCwgaW5vZGUsICZwYXRoKTsKKyAgICAgICAgICAgIGlmIChyZXMpCisgICAgICAgICAgICAgICAgZ290byBlcnJvcl9leGl0OworCisJICAgIC8qIFdlIG1pZ2h0IGhhdmUgc2NoZWR1bGVkLCBzbyBzZWFyY2ggYWdhaW4gKi8KKwkgICAgcmVzID0gc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKTsKKwkgICAgaWYgKCByZXMgPT0gSU9fRVJST1IgKSB7CisJCXJlcyA9IC1FSU87CisJCWdvdG8gZXJyb3JfZXhpdDsKKwkgICAgfQorCisJICAgIC8qIHVwZGF0ZSBjaGFuZ2VkIGluZm8gZm9yIGhpbnQgc3RydWN0dXJlLiAqLworCSAgICByZXMgPSByZWlzZXJmc19hbGxvY2F0ZV9ibG9ja25ycygmaGludCwgYWxsb2NhdGVkX2Jsb2NrcywgYmxvY2tzX3RvX2FsbG9jYXRlLCBibG9ja3NfdG9fYWxsb2NhdGUpOworCSAgICBpZiAoIHJlcyAhPSBDQVJSWV9PTiApIHsKKwkJcmVzID0gLUVOT1NQQzsgCisJCXBhdGhyZWxzZSgmcGF0aCk7CisJCWdvdG8gZXJyb3JfZXhpdDsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIHJlcyA9IC1FTk9TUEM7CisJICAgIHBhdGhyZWxzZSgmcGF0aCk7CisJICAgIGdvdG8gZXJyb3JfZXhpdDsKKwl9CisgICAgfQorCisjaWZkZWYgX19CSUdfRU5ESUFOCisgICAgICAgIC8vIFRvbyBiYWQsIEkgaGF2ZSBub3QgZm91bmQgYW55IHdheSB0byBjb252ZXJ0IGEgZ2l2ZW4gcmVnaW9uIGZyb20KKyAgICAgICAgLy8gY3B1IGZvcm1hdCB0byBsaXR0bGUgZW5kaWFuIGZvcm1hdAorICAgIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgYmxvY2tzX3RvX2FsbG9jYXRlIDsgaSsrKQorICAgICAgICAgICAgYWxsb2NhdGVkX2Jsb2Nrc1tpXT1jcHVfdG9fbGUzMihhbGxvY2F0ZWRfYmxvY2tzW2ldKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIEJsb2NrcyBhbGxvY2F0aW5nIHdlbGwgbWlnaHQgaGF2ZSBzY2hlZHVsZWQgYW5kIHRyZWUgbWlnaHQgaGF2ZSBjaGFuZ2VkLAorICAgICAgIGxldCdzIHNlYXJjaCB0aGUgdHJlZSBhZ2FpbiAqLworICAgIC8qIGZpbmQgd2hlcmUgaW4gdGhlIHRyZWUgb3VyIHdyaXRlIHNob3VsZCBnbyAqLworICAgIHJlcyA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7CisgICAgaWYgKCByZXMgPT0gSU9fRVJST1IgKSB7CisJcmVzID0gLUVJTzsKKwlnb3RvIGVycm9yX2V4aXRfZnJlZV9ibG9ja3M7CisgICAgfQorCisgICAgYmggPSBnZXRfbGFzdF9iaCggJnBhdGggKTsgLy8gR2V0IGEgYnVmZmVyaGVhZCBmb3IgbGFzdCBlbGVtZW50IGluIHBhdGguCisgICAgaWggPSBnZXRfaWgoICZwYXRoICk7ICAgICAgLy8gR2V0IGEgcG9pbnRlciB0byBsYXN0IGl0ZW0gaGVhZCBpbiBwYXRoLgorICAgIGl0ZW0gPSBnZXRfaXRlbSggJnBhdGggKTsgIC8vIEdldCBhIHBvaW50ZXIgdG8gbGFzdCBpdGVtIGluIHBhdGgKKworICAgIC8qIExldCdzIHNlZSB3aGF0IHdlIGhhdmUgZm91bmQgKi8KKyAgICBpZiAoIHJlcyAhPSBQT1NJVElPTl9GT1VORCApIHsgLyogcG9zaXRpb24gbm90IGZvdW5kLCB0aGlzIG1lYW5zIHRoYXQgd2UKKwkJCQkgICAgICBtaWdodCBuZWVkIHRvIGFwcGVuZCBmaWxlIHdpdGggaG9sZXMKKwkJCQkgICAgICBmaXJzdCAqLworCS8vIFNpbmNlIHdlIGFyZSB3cml0aW5nIHBhc3QgdGhlIGZpbGUncyBlbmQsIHdlIG5lZWQgdG8gZmluZCBvdXQgaWYKKwkvLyB0aGVyZSBpcyBhIGhvbGUgdGhhdCBuZWVkcyB0byBiZSBpbnNlcnRlZCBiZWZvcmUgb3VyIHdyaXRpbmcKKwkvLyBwb3NpdGlvbiwgYW5kIGhvdyBtYW55IGJsb2NrcyBpdCBpcyBnb2luZyB0byBjb3ZlciAod2UgbmVlZCB0bworCS8vICBwb3B1bGF0ZSBwb2ludGVycyB0byBmaWxlIGJsb2NrcyByZXByZXNlbnRpbmcgdGhlIGhvbGUgd2l0aCB6ZXJvcykKKworCXsKKwkgICAgaW50IGl0ZW1fb2Zmc2V0ID0gMTsKKwkgICAgLyoKKwkgICAgICogaWYgaWggaXMgc3RhdCBkYXRhLCBpdHMgb2Zmc2V0IGlzIDAgYW5kIHdlIGRvbid0IHdhbnQgdG8KKwkgICAgICogYWRkIDEgdG8gcG9zIGluIHRoZSBob2xlX3NpemUgY2FsY3VsYXRpb24KKwkgICAgICovCisJICAgIGlmIChpc19zdGF0ZGF0YV9sZV9paChpaCkpCisJICAgICAgICBpdGVtX29mZnNldCA9IDA7CisJICAgIGhvbGVfc2l6ZSA9IChwb3MgKyBpdGVtX29mZnNldCAtCisJICAgICAgICAgICAgKGxlX2tleV9rX29mZnNldCggZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24oaW5vZGUpLAorCQkgICAgJihpaC0+aWhfa2V5KSkgKworCQkgICAgb3BfYnl0ZXNfbnVtYmVyKGloLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpKSkgPj4KKwkJICAgIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCX0KKworCWlmICggaG9sZV9zaXplID4gMCApIHsKKwkgICAgaW50IHRvX3Bhc3RlID0gbWluX3QoX191NjQsIGhvbGVfc2l6ZSwgTUFYX0lURU1fTEVOKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkvVU5GTV9QX1NJWkUgKTsgLy8gSG93IG11Y2ggZGF0YSB0byBpbnNlcnQgZmlyc3QgdGltZS4KKwkgICAgLyogYXJlYSBmaWxsZWQgd2l0aCB6ZXJvZXMsIHRvIHN1cHBseSBhcyBsaXN0IG9mIHplcm8gYmxvY2tudW1iZXJzCisJICAgICAgIFdlIGFsbG9jYXRlIGl0IG91dHNpZGUgb2YgbG9vcCBqdXN0IGluIGNhc2UgbG9vcCB3b3VsZCBzcGluIGZvcgorCSAgICAgICBzZXZlcmFsIGl0ZXJhdGlvbnMuICovCisJICAgIGNoYXIgKnplcm9zID0ga21hbGxvYyh0b19wYXN0ZSpVTkZNX1BfU0laRSwgR0ZQX0FUT01JQyk7IC8vIFdlIGNhbm5vdCBpbnNlcnQgbW9yZSB0aGFuIE1BWF9JVEVNX0xFTiBieXRlcyBhbnl3YXkuCisJICAgIGlmICggIXplcm9zICkgeworCQlyZXMgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX2V4aXRfZnJlZV9ibG9ja3M7CisJICAgIH0KKwkgICAgbWVtc2V0ICggemVyb3MsIDAsIHRvX3Bhc3RlKlVORk1fUF9TSVpFKTsKKwkgICAgZG8geworCQl0b19wYXN0ZSA9IG1pbl90KF9fdTY0LCBob2xlX3NpemUsIE1BWF9JVEVNX0xFTihpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpL1VORk1fUF9TSVpFICk7CisJCWlmICggaXNfaW5kaXJlY3RfbGVfaWgoaWgpICkgeworCQkgICAgLyogT2ssIHRoZXJlIGlzIGV4aXN0aW5nIGluZGlyZWN0IGl0ZW0gYWxyZWFkeS4gTmVlZCB0byBhcHBlbmQgaXQgKi8KKwkJICAgIC8qIENhbGN1bGF0ZSBwb3NpdGlvbiBwYXN0IGluc2VydGVkIGl0ZW0gKi8KKwkJICAgIG1ha2VfY3B1X2tleSggJmtleSwgaW5vZGUsIGxlX2tleV9rX29mZnNldCggZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24oaW5vZGUpLCAmKGloLT5paF9rZXkpKSArIG9wX2J5dGVzX251bWJlcihpaCwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKSwgVFlQRV9JTkRJUkVDVCwgMyk7CisJCSAgICByZXMgPSByZWlzZXJmc19wYXN0ZV9pbnRvX2l0ZW0oIHRoLCAmcGF0aCwgJmtleSwgaW5vZGUsIChjaGFyICopemVyb3MsIFVORk1fUF9TSVpFKnRvX3Bhc3RlKTsKKwkJICAgIGlmICggcmVzICkgeworCQkJa2ZyZWUoemVyb3MpOworCQkJZ290byBlcnJvcl9leGl0X2ZyZWVfYmxvY2tzOworCQkgICAgfQorCQl9IGVsc2UgaWYgKCBpc19zdGF0ZGF0YV9sZV9paChpaCkgKSB7CisJCSAgICAvKiBObyBleGlzdGluZyBpdGVtLCBjcmVhdGUgaXQgKi8KKwkJICAgIC8qIGl0ZW0gaGVhZCBmb3IgbmV3IGl0ZW0gKi8KKwkJICAgIHN0cnVjdCBpdGVtX2hlYWQgaW5zX2loOworCisJCSAgICAvKiBjcmVhdGUgYSBrZXkgZm9yIG91ciBuZXcgaXRlbSAqLworCQkgICAgbWFrZV9jcHVfa2V5KCAma2V5LCBpbm9kZSwgMSwgVFlQRV9JTkRJUkVDVCwgMyk7CisKKwkJICAgIC8qIENyZWF0ZSBuZXcgaXRlbSBoZWFkIGZvciBvdXIgbmV3IGl0ZW0gKi8KKwkJICAgIG1ha2VfbGVfaXRlbV9oZWFkICgmaW5zX2loLCAma2V5LCBrZXkudmVyc2lvbiwgMSwKKwkJCQkgICAgICAgVFlQRV9JTkRJUkVDVCwgdG9fcGFzdGUqVU5GTV9QX1NJWkUsCisJCQkJICAgICAgIDAgLyogZnJlZSBzcGFjZSAqLyk7CisKKwkJICAgIC8qIEZpbmQgd2hlcmUgc3VjaCBpdGVtIHNob3VsZCBsaXZlIGluIHRoZSB0cmVlICovCisJCSAgICByZXMgPSBzZWFyY2hfaXRlbSAoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKTsKKwkJICAgIGlmICggcmVzICE9IElURU1fTk9UX0ZPVU5EICkgeworCQkJLyogaXRlbSBzaG91bGQgbm90IGV4aXN0LCBvdGhlcndpc2Ugd2UgaGF2ZSBlcnJvciAqLworCQkJaWYgKCByZXMgIT0gLUVOT1NQQyApIHsKKwkJCSAgICByZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwKKwkJCQkiZ3JlZW4tOTAwODogc2VhcmNoX2J5X2tleSAoJUspIHJldHVybmVkICVkIiwKKwkJCQkJICAgICAgJmtleSwgcmVzKTsKKwkJCX0KKwkJCXJlcyA9IC1FSU87CisJCSAgICAgICAga2ZyZWUoemVyb3MpOworCQkJZ290byBlcnJvcl9leGl0X2ZyZWVfYmxvY2tzOworCQkgICAgfQorCQkgICAgcmVzID0gcmVpc2VyZnNfaW5zZXJ0X2l0ZW0oIHRoLCAmcGF0aCwgJmtleSwgJmluc19paCwgaW5vZGUsIChjaGFyICopemVyb3MpOworCQl9IGVsc2UgeworCQkgICAgcmVpc2VyZnNfcGFuaWMoaW5vZGUtPmlfc2IsICJncmVlbi05MDExOiBVbmV4cGVjdGVkIGtleSB0eXBlICVLXG4iLCAma2V5KTsKKwkJfQorCQlpZiAoIHJlcyApIHsKKwkJICAgIGtmcmVlKHplcm9zKTsKKwkJICAgIGdvdG8gZXJyb3JfZXhpdF9mcmVlX2Jsb2NrczsKKwkJfQorCQkvKiBOb3cgd2Ugd2FudCB0byBjaGVjayBpZiB0cmFuc2FjdGlvbiBpcyB0b28gZnVsbCwgYW5kIGlmIGl0IGlzCisJCSAgIHdlIHJlc3RhcnQgaXQuIFRoaXMgd2lsbCBhbHNvIGZyZWUgdGhlIHBhdGguICovCisJCWlmIChqb3VybmFsX3RyYW5zYWN0aW9uX3Nob3VsZF9lbmQodGgsIHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQpKSB7CisJCSAgICByZXMgPSByZXN0YXJ0X3RyYW5zYWN0aW9uKHRoLCBpbm9kZSwgJnBhdGgpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRocmVsc2UgKCZwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtmcmVlKHplcm9zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3JfZXhpdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworCQkvKiBXZWxsLCBuZWVkIHRvIHJlY2FsY3VsYXRlIHBhdGggYW5kIHN0dWZmICovCisJCXNldF9jcHVfa2V5X2tfb2Zmc2V0KCAma2V5LCBjcHVfa2V5X2tfb2Zmc2V0KCZrZXkpICsgKHRvX3Bhc3RlIDw8IGlub2RlLT5pX2Jsa2JpdHMpKTsKKwkJcmVzID0gc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKTsKKwkJaWYgKCByZXMgPT0gSU9fRVJST1IgKSB7CisJCSAgICByZXMgPSAtRUlPOworCQkgICAga2ZyZWUoemVyb3MpOworCQkgICAgZ290byBlcnJvcl9leGl0X2ZyZWVfYmxvY2tzOworCQl9CisJCWJoPWdldF9sYXN0X2JoKCZwYXRoKTsKKwkJaWg9Z2V0X2loKCZwYXRoKTsKKwkJaXRlbSA9IGdldF9pdGVtKCZwYXRoKTsKKwkJaG9sZV9zaXplIC09IHRvX3Bhc3RlOworCSAgICB9IHdoaWxlICggaG9sZV9zaXplICk7CisJICAgIGtmcmVlKHplcm9zKTsKKwl9CisgICAgfQorCisgICAgLy8gR28gdGhyb3VnaCBleGlzdGluZyBpbmRpcmVjdCBpdGVtcyBmaXJzdAorICAgIC8vIHJlcGxhY2UgYWxsIHplcm9lcyB3aXRoIGJsb2NrbnVtYmVycyBmcm9tIGxpc3QKKyAgICAvLyBOb3RlIHRoYXQgaWYgbm8gY29ycmVzcG9uZGluZyBpdGVtIHdhcyBmb3VuZCwgYnkgcHJldmlvdXMgc2VhcmNoLAorICAgIC8vIGl0IG1lYW5zIHRoZXJlIGFyZSBubyBleGlzdGluZyBpbi10cmVlIHJlcHJlc2VudGF0aW9uIGZvciBmaWxlIGFyZWEKKyAgICAvLyB3ZSBhcmUgZ29pbmcgdG8gb3ZlcndyaXRlLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIHNjYW4gdGhyb3VnaCBmb3IgaG9sZXMuCisgICAgZm9yICggY3Vycl9ibG9jayA9IDAsIGl0ZW1wb3MgPSBwYXRoLnBvc19pbl9pdGVtIDsgY3Vycl9ibG9jayA8IGJsb2Nrc190b19hbGxvY2F0ZSAmJiByZXMgPT0gUE9TSVRJT05fRk9VTkQgOyApIHsKK3JldHJ5OgorCisJaWYgKCBpdGVtcG9zID49IGloX2l0ZW1fbGVuKGloKS9VTkZNX1BfU0laRSApIHsKKwkgICAgLyogV2UgcnVuIG91dCBvZiBkYXRhIGluIHRoaXMgaW5kaXJlY3QgaXRlbSwgbGV0J3MgbG9vayBmb3IgYW5vdGhlcgorCSAgICAgICBvbmUuICovCisJICAgIC8qIEZpcnN0IGlmIHdlIGFyZSBhbHJlYWR5IG1vZGlmeWluZyBjdXJyZW50IGl0ZW0sIGxvZyBpdCAqLworCSAgICBpZiAoIG1vZGlmeWluZ190aGlzX2l0ZW0gKSB7CisJCWpvdXJuYWxfbWFya19kaXJ0eSAodGgsIGlub2RlLT5pX3NiLCBiaCk7CisJCW1vZGlmeWluZ190aGlzX2l0ZW0gPSAwOworCSAgICB9CisJICAgIC8qIFRoZW4gc2V0IHRoZSBrZXkgdG8gbG9vayBmb3IgYSBuZXcgaW5kaXJlY3QgaXRlbSAob2Zmc2V0IG9mIG9sZAorCSAgICAgICBpdGVtIGlzIGFkZGVkIHRvIG9sZCBpdGVtIGxlbmd0aCAqLworCSAgICBzZXRfY3B1X2tleV9rX29mZnNldCggJmtleSwgbGVfa2V5X2tfb2Zmc2V0KCBnZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbihpbm9kZSksICYoaWgtPmloX2tleSkpICsgb3BfYnl0ZXNfbnVtYmVyKGloLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpKTsKKwkgICAgLyogU2VhcmNoIG9mb3IgcG9zaXRpb24gb2YgbmV3IGtleSBpbiB0aGUgdHJlZS4gKi8KKwkgICAgcmVzID0gc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKTsKKwkgICAgaWYgKCByZXMgPT0gSU9fRVJST1IpIHsKKwkJcmVzID0gLUVJTzsKKwkJZ290byBlcnJvcl9leGl0X2ZyZWVfYmxvY2tzOworCSAgICB9CisJICAgIGJoPWdldF9sYXN0X2JoKCZwYXRoKTsKKwkgICAgaWg9Z2V0X2loKCZwYXRoKTsKKwkgICAgaXRlbSA9IGdldF9pdGVtKCZwYXRoKTsKKwkgICAgaXRlbXBvcyA9IHBhdGgucG9zX2luX2l0ZW07CisJICAgIGNvbnRpbnVlOyAvLyBsb29wIHRvIGNoZWNrIGFsbCBraW5kcyBvZiBjb25kaXRpb25zIGFuZCBzbyBvbi4KKwl9CisJLyogT2ssIHdlIGhhdmUgY29ycmVjdCBwb3NpdGlvbiBpbiBpdGVtIG5vdywgc28gbGV0J3Mgc2VlIGlmIGl0IGlzCisJICAgcmVwcmVzZW50aW5nIGZpbGUgaG9sZSAoYmxvY2tudW1iZXIgaXMgemVybykgYW5kIGZpbGwgaXQgaWYgbmVlZGVkICovCisJaWYgKCAhaXRlbVtpdGVtcG9zXSApIHsKKwkgICAgLyogT2ssIGEgaG9sZS4gTm93IHdlIG5lZWQgdG8gY2hlY2sgaWYgd2UgYWxyZWFkeSBwcmVwYXJlZCB0aGlzCisJICAgICAgIGJsb2NrIHRvIGJlIGpvdXJuYWxlZCAqLworCSAgICB3aGlsZSAoICFtb2RpZnlpbmdfdGhpc19pdGVtICkgeyAvLyBsb29wIHVudGlsIHN1Y2NlZWQKKwkJLyogV2VsbCwgdGhpcyBpdGVtIGlzIG5vdCBqb3VybmFsZWQgeWV0LCBzbyB3ZSBtdXN0IHByZXBhcmUKKwkJICAgaXQgZm9yIGpvdXJuYWwgZmlyc3QsIGJlZm9yZSB3ZSBjYW4gY2hhbmdlIGl0ICovCisJCXN0cnVjdCBpdGVtX2hlYWQgdG1wX2loOyAvLyBXZSBjb3B5IGl0ZW0gaGVhZCBvZiBmb3VuZCBpdGVtLAorCQkJCQkgLy8gaGVyZSB0byBkZXRlY3QgaWYgZnMgY2hhbmdlZCB1bmRlcgorCQkJCQkgLy8gdXMgd2hpbGUgd2Ugd2VyZSBwcmVwYXJpbmcgZm9yCisJCQkJCSAvLyBqb3VybmFsLgorCQlpbnQgZnNfZ2VuOyAvLyBXZSBzdG9yZSBmcyBnZW5lcmF0aW9uIGhlcmUgdG8gZmluZCBpZiBzb21lb25lCisJCQkgICAgLy8gY2hhbmdlcyBmcyB1bmRlciBvdXIgZmVldAorCisJCWNvcHlfaXRlbV9oZWFkICgmdG1wX2loLCBpaCk7IC8vIFJlbWVtYmVyIGl0ZW1oZWFkCisJCWZzX2dlbiA9IGdldF9nZW5lcmF0aW9uIChpbm9kZS0+aV9zYik7IC8vIHJlbWVtYmVyIGZzIGdlbmVyYXRpb24KKwkJcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChpbm9kZS0+aV9zYiwgYmgsIDEpOyAvLyBQcmVwYXJlIGEgYnVmZmVyIHdpdGhpbiB3aGljaCBpbmRpcmVjdCBpdGVtIGlzIHN0b3JlZCBmb3IgY2hhbmdpbmcuCisJCWlmIChmc19jaGFuZ2VkIChmc19nZW4sIGlub2RlLT5pX3NiKSAmJiBpdGVtX21vdmVkICgmdG1wX2loLCAmcGF0aCkpIHsKKwkJICAgIC8vIFNpZ2gsIGZzIHdhcyBjaGFuZ2VkIHVuZGVyIHVzLCB3ZSBuZWVkIHRvIGxvb2sgZm9yIG5ldworCQkgICAgLy8gbG9jYXRpb24gb2YgaXRlbSB3ZSBhcmUgd29ya2luZyB3aXRoCisKKwkJICAgIC8qIHVubWFyayBwcmVwYWVyZCBhcmVhIGFzIGpvdXJuYWxlZCBhbmQgc2VhcmNoIGZvciBpdCdzCisJCSAgICAgICBuZXcgcG9zaXRpb24gKi8KKwkJICAgIHJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKGlub2RlLT5pX3NiLCBiaCk7CisJCSAgICByZXMgPSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpOworCQkgICAgaWYgKCByZXMgPT0gSU9fRVJST1IpIHsKKwkJCXJlcyA9IC1FSU87CisJCQlnb3RvIGVycm9yX2V4aXRfZnJlZV9ibG9ja3M7CisJCSAgICB9CisJCSAgICBiaD1nZXRfbGFzdF9iaCgmcGF0aCk7CisJCSAgICBpaD1nZXRfaWgoJnBhdGgpOworCQkgICAgaXRlbSA9IGdldF9pdGVtKCZwYXRoKTsKKwkJICAgIGl0ZW1wb3MgPSBwYXRoLnBvc19pbl9pdGVtOworCQkgICAgZ290byByZXRyeTsKKwkJfQorCQltb2RpZnlpbmdfdGhpc19pdGVtID0gMTsKKwkgICAgfQorCSAgICBpdGVtW2l0ZW1wb3NdID0gYWxsb2NhdGVkX2Jsb2Nrc1tjdXJyX2Jsb2NrXTsgLy8gQXNzaWduIG5ldyBibG9jaworCSAgICBjdXJyX2Jsb2NrKys7CisJfQorCWl0ZW1wb3MrKzsKKyAgICB9CisKKyAgICBpZiAoIG1vZGlmeWluZ190aGlzX2l0ZW0gKSB7IC8vIFdlIG5lZWQgdG8gbG9nIGxhc3QtYWNjZXNzZWQgYmxvY2ssIGlmIGl0CisJCQkJIC8vIHdhcyBtb2RpZmllZCwgYnV0IG5vdCBsb2dnZWQgeWV0LgorCWpvdXJuYWxfbWFya19kaXJ0eSAodGgsIGlub2RlLT5pX3NiLCBiaCk7CisgICAgfQorCisgICAgaWYgKCBjdXJyX2Jsb2NrIDwgYmxvY2tzX3RvX2FsbG9jYXRlICkgeworCS8vIE9oLCB3ZWxsIG5lZWQgdG8gYXBwZW5kIHRvIGluZGlyZWN0IGl0ZW0sIG9yIHRvIGNyZWF0ZSBpbmRpcmVjdCBpdGVtCisJLy8gaWYgdGhlcmUgd2VyZW4ndCBhbnkKKwlpZiAoIGlzX2luZGlyZWN0X2xlX2loKGloKSApIHsKKwkgICAgLy8gRXhpc3RpbmcgaW5kaXJlY3QgaXRlbSAtIGFwcGVuZC4gRmlyc3QgY2FsY3VsYXRlIGtleSBmb3IgYXBwZW5kCisJICAgIC8vIHBvc2l0aW9uLiBXZSBkbyBub3QgbmVlZCB0byByZWNhbGN1bGF0ZSBwYXRoIGFzIGl0IHNob3VsZAorCSAgICAvLyBhbHJlYWR5IHBvaW50IHRvIGNvcnJlY3QgcGxhY2UuCisJICAgIG1ha2VfY3B1X2tleSggJmtleSwgaW5vZGUsIGxlX2tleV9rX29mZnNldCggZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24oaW5vZGUpLCAmKGloLT5paF9rZXkpKSArIG9wX2J5dGVzX251bWJlcihpaCwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKSwgVFlQRV9JTkRJUkVDVCwgMyk7CisJICAgIHJlcyA9IHJlaXNlcmZzX3Bhc3RlX2ludG9faXRlbSggdGgsICZwYXRoLCAma2V5LCBpbm9kZSwgKGNoYXIgKikoYWxsb2NhdGVkX2Jsb2NrcytjdXJyX2Jsb2NrKSwgVU5GTV9QX1NJWkUqKGJsb2Nrc190b19hbGxvY2F0ZS1jdXJyX2Jsb2NrKSk7CisJICAgIGlmICggcmVzICkgeworCQlnb3RvIGVycm9yX2V4aXRfZnJlZV9ibG9ja3M7CisJICAgIH0KKwl9IGVsc2UgaWYgKGlzX3N0YXRkYXRhX2xlX2loKGloKSApIHsKKwkgICAgLy8gTGFzdCBmb3VuZCBpdGVtIHdhcyBzdGF0ZGF0YS4gVGhhdCBtZWFucyB3ZSBuZWVkIHRvIGNyZWF0ZSBpbmRpcmVjdCBpdGVtLgorCSAgICBzdHJ1Y3QgaXRlbV9oZWFkIGluc19paDsgLyogaXRlbWhlYWQgZm9yIG5ldyBpdGVtICovCisKKwkgICAgLyogY3JlYXRlIGEga2V5IGZvciBvdXIgbmV3IGl0ZW0gKi8KKwkgICAgbWFrZV9jcHVfa2V5KCAma2V5LCBpbm9kZSwgMSwgVFlQRV9JTkRJUkVDVCwgMyk7IC8vIFBvc2l0aW9uIG9uZSwKKwkJCQkJCQkgICAgLy8gYmVjYXVzZSB0aGF0J3MKKwkJCQkJCQkgICAgLy8gd2hlcmUgZmlyc3QKKwkJCQkJCQkgICAgLy8gaW5kaXJlY3QgaXRlbQorCQkJCQkJCSAgICAvLyBiZWdpbnMKKwkgICAgLyogQ3JlYXRlIG5ldyBpdGVtIGhlYWQgZm9yIG91ciBuZXcgaXRlbSAqLworCSAgICBtYWtlX2xlX2l0ZW1faGVhZCAoJmluc19paCwgJmtleSwga2V5LnZlcnNpb24sIDEsIFRZUEVfSU5ESVJFQ1QsCisJCQkgICAgICAgKGJsb2Nrc190b19hbGxvY2F0ZS1jdXJyX2Jsb2NrKSpVTkZNX1BfU0laRSwKKwkJCSAgICAgICAwIC8qIGZyZWUgc3BhY2UgKi8pOworCSAgICAvKiBGaW5kIHdoZXJlIHN1Y2ggaXRlbSBzaG91bGQgbGl2ZSBpbiB0aGUgdHJlZSAqLworCSAgICByZXMgPSBzZWFyY2hfaXRlbSAoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoKTsKKwkgICAgaWYgKCByZXMgIT0gSVRFTV9OT1RfRk9VTkQgKSB7CisJCS8qIFdlbGwsIGlmIHdlIGhhdmUgZm91bmQgc3VjaCBpdGVtIGFscmVhZHksIG9yIHNvbWUgZXJyb3IKKwkJICAgb2NjdXJlZCwgd2UgbmVlZCB0byB3YXJuIHVzZXIgYW5kIHJldHVybiBlcnJvciAqLworCQlpZiAoIHJlcyAhPSAtRU5PU1BDICkgeworCQkgICAgcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsCisJCQkJICAgICAgImdyZWVuLTkwMDk6IHNlYXJjaF9ieV9rZXkgKCVLKSAiCisJCQkJICAgICAgInJldHVybmVkICVkIiwgJmtleSwgcmVzKTsKKwkJfQorCQlyZXMgPSAtRUlPOworCQlnb3RvIGVycm9yX2V4aXRfZnJlZV9ibG9ja3M7CisJICAgIH0KKwkgICAgLyogSW5zZXJ0IGl0ZW0gaW50byB0aGUgdHJlZSB3aXRoIHRoZSBkYXRhIGFzIGl0cyBib2R5ICovCisJICAgIHJlcyA9IHJlaXNlcmZzX2luc2VydF9pdGVtKCB0aCwgJnBhdGgsICZrZXksICZpbnNfaWgsIGlub2RlLCAoY2hhciAqKShhbGxvY2F0ZWRfYmxvY2tzK2N1cnJfYmxvY2spKTsKKwl9IGVsc2UgeworCSAgICByZWlzZXJmc19wYW5pYyhpbm9kZS0+aV9zYiwgImdyZWVuLTkwMTA6IHVuZXhwZWN0ZWQgaXRlbSB0eXBlIGZvciBrZXkgJUtcbiIsJmtleSk7CisJfQorICAgIH0KKworICAgIC8vIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNsb3NpbmcgdGhlIHRyYW5zYWN0aW9uCisgICAgLy8gdW5sZXNzIHdlIHJldHVybiBhbiBlcnJvciwgdGhleSBhcmUgYWxzbyByZXNwb25zaWJsZSBmb3IgbG9nZ2luZworICAgIC8vIHRoZSBpbm9kZS4KKyAgICAvLworICAgIHBhdGhyZWxzZSgmcGF0aCk7CisgICAgLyoKKyAgICAgKiBjbGVhbnVwIHByZWxsb2NhdGlvbiBmcm9tIHByZXZpb3VzIHdyaXRlcworICAgICAqIGlmIHRoaXMgaXMgYSBwYXJ0aWFsIGJsb2NrIHdyaXRlCisgICAgICovCisgICAgaWYgKHdyaXRlX2J5dGVzICYgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtMSkpCisgICAgICAgIHJlaXNlcmZzX2Rpc2NhcmRfcHJlYWxsb2ModGgsIGlub2RlKTsKKyAgICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCisgICAgLy8gZ28gdGhyb3VnaCBhbGwgdGhlIHBhZ2VzL2J1ZmZlcnMgYW5kIG1hcCB0aGUgYnVmZmVycyB0byBuZXdseSBhbGxvY2F0ZWQKKyAgICAvLyBibG9ja3MgKHNvIHRoYXQgc3lzdGVtIGtub3dzIHdoZXJlIHRvIHdyaXRlIHRoZXNlIHBhZ2VzIGxhdGVyKS4KKyAgICBjdXJyX2Jsb2NrID0gMDsKKyAgICBmb3IgKCBpID0gMDsgaSA8IG51bV9wYWdlcyA7IGkrKyApIHsKKwlzdHJ1Y3QgcGFnZSAqcGFnZT1wcmVwYXJlZF9wYWdlc1tpXTsgLy9jdXJyZW50IHBhZ2UKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7Ly8gZmlyc3QgYnVmZmVyIGZvciBhIHBhZ2UKKwlpbnQgYmxvY2tfc3RhcnQsIGJsb2NrX2VuZDsgLy8gaW4tcGFnZSBvZmZzZXRzIGZvciBidWZmZXJzLgorCisJaWYgKCFwYWdlX2J1ZmZlcnMocGFnZSkpCisJICAgIHJlaXNlcmZzX3BhbmljKGlub2RlLT5pX3NiLCAiZ3JlZW4tOTAwNTogTm8gYnVmZmVycyBmb3IgcHJlcGFyZWQgcGFnZT8/PyIpOworCisJLyogRm9yIGVhY2ggYnVmZmVyIGluIHBhZ2UgKi8KKwlmb3IoYmggPSBoZWFkLCBibG9ja19zdGFydCA9IDA7IGJoICE9IGhlYWQgfHwgIWJsb2NrX3N0YXJ0OworCSAgICBibG9ja19zdGFydD1ibG9ja19lbmQsIGJoID0gYmgtPmJfdGhpc19wYWdlKSB7CisJICAgIGlmICghYmgpCisJCXJlaXNlcmZzX3BhbmljKGlub2RlLT5pX3NiLCAiZ3JlZW4tOTAwNjogQWxsb2NhdGVkIGJ1dCBhYnNlbnQgYnVmZmVyIGZvciBhIHBhZ2U/Iik7CisJICAgIGJsb2NrX2VuZCA9IGJsb2NrX3N0YXJ0K2lub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwkgICAgaWYgKGkgPT0gMCAmJiBibG9ja19lbmQgPD0gZnJvbSApCisJCS8qIGlmIHRoaXMgYnVmZmVyIGlzIGJlZm9yZSByZXF1ZXN0ZWQgZGF0YSB0byBtYXAsIHNraXAgaXQgKi8KKwkJY29udGludWU7CisJICAgIGlmIChpID09IG51bV9wYWdlcyAtIDEgJiYgYmxvY2tfc3RhcnQgPj0gdG8pCisJCS8qIElmIHRoaXMgYnVmZmVyIGlzIGFmdGVyIHJlcXVlc3RlZCBkYXRhIHRvIG1hcCwgYWJvcnQKKwkJICAgcHJvY2Vzc2luZyBvZiBjdXJyZW50IHBhZ2UgKi8KKwkJYnJlYWs7CisKKwkgICAgaWYgKCAhYnVmZmVyX21hcHBlZChiaCkgKSB7IC8vIE9rLCB1bm1hcHBlZCBidWZmZXIsIG5lZWQgdG8gbWFwIGl0CisJCW1hcF9iaCggYmgsIGlub2RlLT5pX3NiLCBsZTMyX3RvX2NwdShhbGxvY2F0ZWRfYmxvY2tzW2N1cnJfYmxvY2tdKSk7CisJCWN1cnJfYmxvY2srKzsKKwkJc2V0X2J1ZmZlcl9uZXcoYmgpOworCSAgICB9CisJfQorICAgIH0KKworICAgIFJGQUxTRSggY3Vycl9ibG9jayA+IGJsb2Nrc190b19hbGxvY2F0ZSwgImdyZWVuLTkwMDc6IFVzZWQgdG9vIG1hbnkgYmxvY2tzPyB3ZWlyZCIpOworCisgICAga2ZyZWUoYWxsb2NhdGVkX2Jsb2Nrcyk7CisgICAgcmV0dXJuIDA7CisKKy8vIE5lZWQgdG8gZGVhbCB3aXRoIHRyYW5zYWN0aW9uIGhlcmUuCitlcnJvcl9leGl0X2ZyZWVfYmxvY2tzOgorICAgIHBhdGhyZWxzZSgmcGF0aCk7CisgICAgLy8gZnJlZSBibG9ja3MKKyAgICBmb3IoIGkgPSAwOyBpIDwgYmxvY2tzX3RvX2FsbG9jYXRlOyBpKysgKQorCXJlaXNlcmZzX2ZyZWVfYmxvY2sodGgsIGlub2RlLCBsZTMyX3RvX2NwdShhbGxvY2F0ZWRfYmxvY2tzW2ldKSwgMSk7CisKK2Vycm9yX2V4aXQ6CisgICAgaWYgKHRoLT50X3RyYW5zX2lkKSB7CisgICAgICAgIGludCBlcnI7CisgICAgICAgIC8vIHVwZGF0ZSBhbnkgY2hhbmdlcyB3ZSBtYWRlIHRvIGJsayBjb3VudAorICAgICAgICByZWlzZXJmc191cGRhdGVfc2QodGgsIGlub2RlKTsKKyAgICAgICAgZXJyID0gam91cm5hbF9lbmQodGgsIGlub2RlLT5pX3NiLCBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDMgKyAxICsgMiAqIFJFSVNFUkZTX1FVT1RBX1RSQU5TX0JMT0NLUyk7CisgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICByZXMgPSBlcnI7CisgICAgfQorICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisgICAga2ZyZWUoYWxsb2NhdGVkX2Jsb2Nrcyk7CisKKyAgICByZXR1cm4gcmVzOworfQorCisvKiBVbmxvY2sgcGFnZXMgcHJlcGFyZWQgYnkgcmVpc2VyZnNfcHJlcGFyZV9maWxlX3JlZ2lvbl9mb3Jfd3JpdGUgKi8KK3N0YXRpYyB2b2lkIHJlaXNlcmZzX3VucHJlcGFyZV9wYWdlcyhzdHJ1Y3QgcGFnZSAqKnByZXBhcmVkX3BhZ2VzLCAvKiBsaXN0IG9mIGxvY2tlZCBwYWdlcyAqLworCQkJICAgICAgc2l6ZV90IG51bV9wYWdlcyAvKiBhbW91bnQgb2YgcGFnZXMgKi8pIHsKKyAgICBpbnQgaTsgLy8gbG9vcCBjb3VudGVyCisKKyAgICBmb3IgKGk9MDsgaSA8IG51bV9wYWdlcyA7IGkrKykgeworCXN0cnVjdCBwYWdlICpwYWdlID0gcHJlcGFyZWRfcGFnZXNbaV07CisKKwl0cnlfdG9fZnJlZV9idWZmZXJzKHBhZ2UpOworCXVubG9ja19wYWdlKHBhZ2UpOworCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKyAgICB9Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBjb3B5IGRhdGEgZnJvbSB1c2Vyc3BhY2UgdG8gc3BlY2lmaWVkIHBhZ2VzIHdpdGhpbgorICAgc3VwcGxpZWQgYnl0ZSByYW5nZSAqLworc3RhdGljIGludCByZWlzZXJmc19jb3B5X2Zyb21fdXNlcl90b19maWxlX3JlZ2lvbigKKwkJCQlsb2ZmX3QgcG9zLCAvKiBJbi1maWxlIHBvc2l0aW9uICovCisJCQkJaW50IG51bV9wYWdlcywgLyogTnVtYmVyIG9mIHBhZ2VzIGFmZmVjdGVkICovCisJCQkJaW50IHdyaXRlX2J5dGVzLCAvKiBBbW91bnQgb2YgYnl0ZXMgdG8gd3JpdGUgKi8KKwkJCQlzdHJ1Y3QgcGFnZSAqKnByZXBhcmVkX3BhZ2VzLCAvKiBwb2ludGVyIHRvIAorCQkJCQkJCQkgYXJyYXkgdG8KKwkJCQkJCQkJIHByZXBhcmVkIHBhZ2VzCisJCQkJCQkJCSovCisJCQkJY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiAvKiBQb2ludGVyIHRvIHVzZXItc3VwcGxpZWQKKwkJCQkJCSAgIGRhdGEqLworCQkJCSkKK3sKKyAgICBsb25nIHBhZ2VfZmF1bHQ9MDsgLy8gc3RhdHVzIG9mIGNvcHlfZnJvbV91c2VyLgorICAgIGludCBpOyAvLyBsb29wIGNvdW50ZXIuCisgICAgaW50IG9mZnNldDsgLy8gb2Zmc2V0IGluIHBhZ2UKKworICAgIGZvciAoIGkgPSAwLCBvZmZzZXQgPSAocG9zICYgKFBBR0VfQ0FDSEVfU0laRS0xKSk7IGkgPCBudW1fcGFnZXMgOyBpKyssb2Zmc2V0PTApIHsKKwlzaXplX3QgY291bnQgPSBtaW5fdChzaXplX3QsUEFHRV9DQUNIRV9TSVpFLW9mZnNldCx3cml0ZV9ieXRlcyk7IC8vIEhvdyBtdWNoIG9mIGJ5dGVzIHRvIHdyaXRlIHRvIHRoaXMgcGFnZQorCXN0cnVjdCBwYWdlICpwYWdlPXByZXBhcmVkX3BhZ2VzW2ldOyAvLyBDdXJyZW50IHBhZ2Ugd2UgcHJvY2Vzcy4KKworCWZhdWx0X2luX3BhZ2VzX3JlYWRhYmxlKCBidWYsIGNvdW50KTsKKworCS8qIENvcHkgZGF0YSBmcm9tIHVzZXJzcGFjZSB0byB0aGUgY3VycmVudCBwYWdlICovCisJa21hcChwYWdlKTsKKwlwYWdlX2ZhdWx0ID0gX19jb3B5X2Zyb21fdXNlcihwYWdlX2FkZHJlc3MocGFnZSkrb2Zmc2V0LCBidWYsIGNvdW50KTsgLy8gQ29weSB0aGUgZGF0YS4KKwkvKiBGbHVzaCBwcm9jZXNzb3IncyBkY2FjaGUgZm9yIHRoaXMgcGFnZSAqLworCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCWt1bm1hcChwYWdlKTsKKwlidWYrPWNvdW50OworCXdyaXRlX2J5dGVzLT1jb3VudDsKKworCWlmIChwYWdlX2ZhdWx0KQorCSAgICBicmVhazsgLy8gV2FzIHRoZXJlIGEgZmF1bHQ/IGFib3J0LgorICAgIH0KKworICAgIHJldHVybiBwYWdlX2ZhdWx0Py1FRkFVTFQ6MDsKK30KKworLyogdGFrZW4gZnMvYnVmZmVyLmM6X19ibG9ja19jb21taXRfd3JpdGUgKi8KK2ludCByZWlzZXJmc19jb21taXRfcGFnZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCit7CisgICAgdW5zaWduZWQgYmxvY2tfc3RhcnQsIGJsb2NrX2VuZDsKKyAgICBpbnQgcGFydGlhbCA9IDA7CisgICAgdW5zaWduZWQgYmxvY2tzaXplOworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsICpoZWFkOworICAgIHVuc2lnbmVkIGxvbmcgaV9zaXplX2luZGV4ID0gaW5vZGUtPmlfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUOworICAgIGludCBuZXc7CisgICAgaW50IGxvZ2l0ID0gcmVpc2VyZnNfZmlsZV9kYXRhX2xvZyhpbm9kZSk7CisgICAgc3RydWN0IHN1cGVyX2Jsb2NrICpzID0gaW5vZGUtPmlfc2I7CisgICAgaW50IGJoX3Blcl9wYWdlID0gUEFHRV9DQUNIRV9TSVpFIC8gcy0+c19ibG9ja3NpemU7CisgICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIHRoLnRfdHJhbnNfaWQgPSAwOworICAgIGJsb2Nrc2l6ZSA9IDEgPDwgaW5vZGUtPmlfYmxrYml0czsKKworICAgIGlmIChsb2dpdCkgeworCXJlaXNlcmZzX3dyaXRlX2xvY2socyk7CisJcmV0ID0gam91cm5hbF9iZWdpbigmdGgsIHMsIGJoX3Blcl9wYWdlICsgMSk7CisJaWYgKHJldCkKKwkgICAgZ290byBkcm9wX3dyaXRlX2xvY2s7CisJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKTsKKyAgICB9CisgICAgZm9yKGJoID0gaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKSwgYmxvY2tfc3RhcnQgPSAwOworICAgICAgICBiaCAhPSBoZWFkIHx8ICFibG9ja19zdGFydDsKKwlibG9ja19zdGFydD1ibG9ja19lbmQsIGJoID0gYmgtPmJfdGhpc19wYWdlKQorICAgIHsKKworCW5ldyA9IGJ1ZmZlcl9uZXcoYmgpOworCWNsZWFyX2J1ZmZlcl9uZXcoYmgpOworCWJsb2NrX2VuZCA9IGJsb2NrX3N0YXJ0ICsgYmxvY2tzaXplOworCWlmIChibG9ja19lbmQgPD0gZnJvbSB8fCBibG9ja19zdGFydCA+PSB0bykgeworCSAgICBpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCSAgICBwYXJ0aWFsID0gMTsKKwl9IGVsc2UgeworCSAgICBzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkgICAgaWYgKGxvZ2l0KSB7CisJCXJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocywgYmgsIDEpOworCQlqb3VybmFsX21hcmtfZGlydHkoJnRoLCBzLCBiaCk7CisJICAgIH0gZWxzZSBpZiAoIWJ1ZmZlcl9kaXJ0eShiaCkpIHsKKwkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQkvKiBkbyBkYXRhPW9yZGVyZWQgb24gYW55IHBhZ2UgcGFzdCB0aGUgZW5kCisJCSAqIG9mIGZpbGUgYW5kIGFueSBidWZmZXIgbWFya2VkIEJIX05ldy4KKwkJICovCisJCWlmIChyZWlzZXJmc19kYXRhX29yZGVyZWQoaW5vZGUtPmlfc2IpICYmCisJCSAgICAobmV3IHx8IHBhZ2UtPmluZGV4ID49IGlfc2l6ZV9pbmRleCkpIHsKKwkJICAgIHJlaXNlcmZzX2FkZF9vcmRlcmVkX2xpc3QoaW5vZGUsIGJoKTsKKwkgICAgICAgIH0KKwkgICAgfQorCX0KKyAgICB9CisgICAgaWYgKGxvZ2l0KSB7CisJcmV0ID0gam91cm5hbF9lbmQoJnRoLCBzLCBiaF9wZXJfcGFnZSArIDEpOworZHJvcF93cml0ZV9sb2NrOgorCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzKTsKKyAgICB9CisgICAgLyoKKyAgICAgKiBJZiB0aGlzIGlzIGEgcGFydGlhbCB3cml0ZSB3aGljaCBoYXBwZW5lZCB0byBtYWtlIGFsbCBidWZmZXJzCisgICAgICogdXB0b2RhdGUgdGhlbiB3ZSBjYW4gb3B0aW1pemUgYXdheSBhIGJvZ3VzIHJlYWRwYWdlKCkgZm9yCisgICAgICogdGhlIG5leHQgcmVhZCgpLiBIZXJlIHdlICdkaXNjb3Zlcicgd2hldGhlciB0aGUgcGFnZSB3ZW50CisgICAgICogdXB0b2RhdGUgYXMgYSByZXN1bHQgb2YgdGhpcyAocG90ZW50aWFsbHkgcGFydGlhbCkgd3JpdGUuCisgICAgICovCisgICAgaWYgKCFwYXJ0aWFsKQorCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKyAgICByZXR1cm4gcmV0OworfQorCisKKy8qIFN1Ym1pdCBwYWdlcyBmb3Igd3JpdGUuIFRoaXMgd2FzIHNlcGFyYXRlZCBmcm9tIGFjdHVhbCBmaWxlIGNvcHlpbmcKKyAgIGJlY2F1c2Ugd2UgbWlnaHQgd2FudCB0byBhbGxvY2F0ZSBibG9jayBudW1iZXJzIGluLWJldHdlZW4uCisgICBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBjYWxsZXIgd2lsbCBhZGp1c3QgZmlsZSBzaXplIHRvIGNvcnJlY3QgdmFsdWUuICovCitzdGF0aWMgaW50IHJlaXNlcmZzX3N1Ym1pdF9maWxlX3JlZ2lvbl9mb3Jfd3JpdGUoCisJCQkJc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkJc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQlsb2ZmX3QgcG9zLCAvKiBXcml0aW5nIHBvc2l0aW9uIG9mZnNldCAqLworCQkJCXNpemVfdCBudW1fcGFnZXMsIC8qIE51bWJlciBvZiBwYWdlcyB0byB3cml0ZSAqLworCQkJCXNpemVfdCB3cml0ZV9ieXRlcywgLyogbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlICovCisJCQkJc3RydWN0IHBhZ2UgKipwcmVwYXJlZF9wYWdlcyAvKiBsaXN0IG9mIHBhZ2VzICovCisJCQkJKQoreworICAgIGludCBzdGF0dXM7IC8vIHJldHVybiBzdGF0dXMgb2YgYmxvY2tfY29tbWl0X3dyaXRlLgorICAgIGludCByZXR2YWwgPSAwOyAvLyBSZXR1cm4gdmFsdWUgd2UgYXJlIGdvaW5nIHRvIHJldHVybi4KKyAgICBpbnQgaTsgLy8gbG9vcCBjb3VudGVyCisgICAgaW50IG9mZnNldDsgLy8gV3JpdGluZyBvZmZzZXQgaW4gcGFnZS4KKyAgICBpbnQgb3JpZ193cml0ZV9ieXRlcyA9IHdyaXRlX2J5dGVzOworICAgIGludCBzZF91cGRhdGUgPSAwOworCisgICAgZm9yICggaSA9IDAsIG9mZnNldCA9IChwb3MgJiAoUEFHRV9DQUNIRV9TSVpFLTEpKTsgaSA8IG51bV9wYWdlcyA7IGkrKyxvZmZzZXQ9MCkgeworCWludCBjb3VudCA9IG1pbl90KGludCxQQUdFX0NBQ0hFX1NJWkUtb2Zmc2V0LHdyaXRlX2J5dGVzKTsgLy8gSG93IG11Y2ggb2YgYnl0ZXMgdG8gd3JpdGUgdG8gdGhpcyBwYWdlCisJc3RydWN0IHBhZ2UgKnBhZ2U9cHJlcGFyZWRfcGFnZXNbaV07IC8vIEN1cnJlbnQgcGFnZSB3ZSBwcm9jZXNzLgorCisJc3RhdHVzID0gcmVpc2VyZnNfY29tbWl0X3BhZ2UoaW5vZGUsIHBhZ2UsIG9mZnNldCwgb2Zmc2V0K2NvdW50KTsKKwlpZiAoIHN0YXR1cyApCisJICAgIHJldHZhbCA9IHN0YXR1czsgLy8gVG8gbm90IG92ZXJjb21wbGljYXRlIG1hdHRlcnMgV2UgYXJlIGdvaW5nIHRvCisJCQkgICAgIC8vIHN1Ym1pdCBhbGwgdGhlIHBhZ2VzIGV2ZW4gaWYgdGhlcmUgd2FzIGVycm9yLgorCQkJICAgICAvLyB3ZSBvbmx5IHJlbWVtYmVyIGVycm9yIHN0YXR1cyB0byByZXBvcnQgaXQgb24KKwkJCSAgICAgLy8gZXhpdC4KKwl3cml0ZV9ieXRlcy09Y291bnQ7CisgICAgfQorICAgIC8qIG5vdyB0aGF0IHdlJ3ZlIGdvdHRlbiBhbGwgdGhlIG9yZGVyZWQgYnVmZmVycyBtYXJrZWQgZGlydHksCisgICAgICogd2UgY2FuIHNhZmVseSB1cGRhdGUgaV9zaXplIGFuZCBjbG9zZSBhbnkgcnVubmluZyB0cmFuc2FjdGlvbgorICAgICAqLworICAgIGlmICggcG9zICsgb3JpZ193cml0ZV9ieXRlcyA+IGlub2RlLT5pX3NpemUpIHsKKwlpbm9kZS0+aV9zaXplID0gcG9zICsgb3JpZ193cml0ZV9ieXRlczsgLy8gU2V0IG5ldyBzaXplCisJLyogSWYgdGhlIGZpbGUgaGF2ZSBncm93biBzbyBtdWNoIHRoYXQgdGFpbCBwYWNraW5nIGlzIG5vCisJICogbG9uZ2VyIHBvc3NpYmxlLCByZXNldCAibmVlZCB0byBwYWNrIiBmbGFnICovCisJaWYgKCAoaGF2ZV9sYXJnZV90YWlscyAoaW5vZGUtPmlfc2IpICYmCisJICAgICAgaW5vZGUtPmlfc2l6ZSA+IGlfYmxvY2tfc2l6ZSAoaW5vZGUpKjQpIHx8CisJICAgICAoaGF2ZV9zbWFsbF90YWlscyAoaW5vZGUtPmlfc2IpICYmCisJICAgICBpbm9kZS0+aV9zaXplID4gaV9ibG9ja19zaXplKGlub2RlKSkgKQorCSAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmPSB+aV9wYWNrX29uX2Nsb3NlX21hc2sgOworICAgICAgICBlbHNlIGlmICggKGhhdmVfbGFyZ2VfdGFpbHMgKGlub2RlLT5pX3NiKSAmJgorCSAgICAgICAgICBpbm9kZS0+aV9zaXplIDwgaV9ibG9ja19zaXplIChpbm9kZSkqNCkgfHwKKwkgICAgICAgICAgKGhhdmVfc21hbGxfdGFpbHMgKGlub2RlLT5pX3NiKSAmJgorCQkgIGlub2RlLT5pX3NpemUgPCBpX2Jsb2NrX3NpemUoaW5vZGUpKSApCisJICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzIHw9IGlfcGFja19vbl9jbG9zZV9tYXNrIDsKKworCWlmICh0aC0+dF90cmFuc19pZCkgeworCSAgICByZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKwkgICAgcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSk7IC8vIEFuZCB1cGRhdGUgb24tZGlzayBtZXRhZGF0YQorCSAgICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCX0gZWxzZQorCSAgICBpbm9kZS0+aV9zYi0+c19vcC0+ZGlydHlfaW5vZGUoaW5vZGUpOworCisgICAgICAgIHNkX3VwZGF0ZSA9IDE7CisgICAgfQorICAgIGlmICh0aC0+dF90cmFuc19pZCkgeworCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCWlmICghc2RfdXBkYXRlKQorCSAgICByZWlzZXJmc191cGRhdGVfc2QodGgsIGlub2RlKTsKKwlzdGF0dXMgPSBqb3VybmFsX2VuZCh0aCwgdGgtPnRfc3VwZXIsIHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQpOworICAgICAgICBpZiAoc3RhdHVzKQorICAgICAgICAgICAgcmV0dmFsID0gc3RhdHVzOworCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisgICAgfQorICAgIHRoLT50X3RyYW5zX2lkID0gMDsKKworICAgIC8qIAorICAgICAqIHdlIGhhdmUgdG8gdW5sb2NrIHRoZSBwYWdlcyBhZnRlciB1cGRhdGluZyBpX3NpemUsIG90aGVyd2lzZQorICAgICAqIHdlIHJhY2Ugd2l0aCB3cml0ZXBhZ2UKKyAgICAgKi8KKyAgICBmb3IgKCBpID0gMDsgaSA8IG51bV9wYWdlcyA7IGkrKykgeworCXN0cnVjdCBwYWdlICpwYWdlPXByZXBhcmVkX3BhZ2VzW2ldOworCXVubG9ja19wYWdlKHBhZ2UpOyAKKwltYXJrX3BhZ2VfYWNjZXNzZWQocGFnZSk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvKiBMb29rIGlmIHBhc3NlZCB3cml0aW5nIHJlZ2lvbiBpcyBnb2luZyB0byB0b3VjaCBmaWxlJ3MgdGFpbAorICAgKGlmIGl0IGlzIHByZXNlbnQpLiBBbmQgaWYgaXQgaXMsIGNvbnZlcnQgdGhlIHRhaWwgdG8gdW5mb3JtYXR0ZWQgbm9kZSAqLworc3RhdGljIGludCByZWlzZXJmc19jaGVja19mb3JfdGFpbF9hbmRfY29udmVydCggc3RydWN0IGlub2RlICppbm9kZSwgLyogaW5vZGUgdG8gZGVhbCB3aXRoICovCisJCQkJCSBsb2ZmX3QgcG9zLCAvKiBXcml0aW5nIHBvc2l0aW9uICovCisJCQkJCSBpbnQgd3JpdGVfYnl0ZXMgLyogYW1vdW50IG9mIGJ5dGVzIHRvIHdyaXRlICovCisJCQkJICAgICAgICApCit7CisgICAgSU5JVElBTElaRV9QQVRIKHBhdGgpOyAvLyBuZWVkZWQgZm9yIHNlYXJjaF9mb3JfcG9zaXRpb24KKyAgICBzdHJ1Y3QgY3B1X2tleSBrZXk7IC8vIEtleSB0aGF0IHdvdWxkIHJlcHJlc2VudCBsYXN0IHRvdWNoZWQgd3JpdGluZyBieXRlLgorICAgIHN0cnVjdCBpdGVtX2hlYWQgKmloOyAvLyBpdGVtIGhlYWRlciBvZiBmb3VuZCBibG9jazsKKyAgICBpbnQgcmVzOyAvLyBSZXR1cm4gdmFsdWUgb2YgdmFyaW91cyBmdW5jdGlvbnMgd2UgY2FsbC4KKyAgICBpbnQgY29udF9leHBhbmRfb2Zmc2V0OyAvLyBXZSB3aWxsIHB1dCBvZmZzZXQgZm9yIGdlbmVyaWNfY29udF9leHBhbmQgaGVyZQorCQkJICAgIC8vIFRoaXMgY2FuIGJlIGludCBqdXN0IGJlY2F1c2UgdGFpbHMgYXJlIGNyZWF0ZWQKKwkJCSAgICAvLyBvbmx5IGZvciBzbWFsbCBmaWxlcy4KKyAKKy8qIHRoaXMgZW1ib2RpZXMgYSBkZXBlbmRlbmN5IG9uIGEgcGFydGljdWxhciB0YWlsIHBvbGljeSAqLworICAgIGlmICggaW5vZGUtPmlfc2l6ZSA+PSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUqNCApIHsKKwkvKiBzdWNoIGEgYmlnIGZpbGVzIGRvIG5vdCBoYXZlIHRhaWxzLCBzbyB3ZSB3b24ndCBib3RoZXIgb3Vyc2VsdmVzCisJICAgdG8gbG9vayBmb3IgdGFpbHMsIHNpbXBseSByZXR1cm4gKi8KKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICByZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKyAgICAvKiBmaW5kIHRoZSBpdGVtIGNvbnRhaW5pbmcgdGhlIGxhc3QgYnl0ZSB0byBiZSB3cml0dGVuLCBvciBpZgorICAgICAqIHdyaXRpbmcgcGFzdCB0aGUgZW5kIG9mIHRoZSBmaWxlIHRoZW4gdGhlIGxhc3QgaXRlbSBvZiB0aGUKKyAgICAgKiBmaWxlIChhbmQgdGhlbiB3ZSBjaGVjayBpdHMgdHlwZSkuICovCisgICAgbWFrZV9jcHVfa2V5ICgma2V5LCBpbm9kZSwgcG9zK3dyaXRlX2J5dGVzKzEsIFRZUEVfQU5ZLCAzLyprZXkgbGVuZ3RoKi8pOworICAgIHJlcyA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7CisgICAgaWYgKCByZXMgPT0gSU9fRVJST1IgKSB7CisgICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJcmV0dXJuIC1FSU87CisgICAgfQorICAgIGloID0gZ2V0X2loKCZwYXRoKTsKKyAgICByZXMgPSAwOworICAgIGlmICggaXNfZGlyZWN0X2xlX2loKGloKSApIHsKKwkvKiBPaywgY2xvc2VzdCBpdGVtIGlzIGZpbGUgdGFpbCAodGFpbHMgYXJlIHN0b3JlZCBpbiAiZGlyZWN0IgorCSAqIGl0ZW1zKSwgc28gd2UgbmVlZCB0byB1bnBhY2sgaXQuICovCisJLyogVG8gbm90IG92ZXJjb21wbGljYXRlIG1hdHRlcnMsIHdlIGp1c3QgY2FsbCBnZW5lcmljX2NvbnRfZXhwYW5kCisJICAgd2hpY2ggd2lsbCBpbiB0dXJuIGNhbGwgb3RoZXIgc3R1ZmYgYW5kIGZpbmFsbHkgd2lsbCBib2lsIGRvd24gdG8KKwkgICAgcmVpc2VyZnNfZ2V0X2Jsb2NrKCkgdGhhdCB3b3VsZCBkbyBuZWNlc3NhcnkgY29udmVyc2lvbi4gKi8KKwljb250X2V4cGFuZF9vZmZzZXQgPSBsZV9rZXlfa19vZmZzZXQoZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24oaW5vZGUpLCAmKGloLT5paF9rZXkpKTsKKwlwYXRocmVsc2UoJnBhdGgpOworCXJlcyA9IGdlbmVyaWNfY29udF9leHBhbmQoIGlub2RlLCBjb250X2V4cGFuZF9vZmZzZXQpOworICAgIH0gZWxzZQorCXBhdGhyZWxzZSgmcGF0aCk7CisKKyAgICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworICAgIHJldHVybiByZXM7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gbG9ja3MgcGFnZXMgc3RhcnRpbmcgZnJvbSBAcG9zIGZvciBAaW5vZGUuCisgICBAbnVtX3BhZ2VzIHBhZ2VzIGFyZSBsb2NrZWQgYW5kIHN0b3JlZCBpbgorICAgQHByZXBhcmVkX3BhZ2VzIGFycmF5LiBBbHNvIGJ1ZmZlcnMgYXJlIGFsbG9jYXRlZCBmb3IgdGhlc2UgcGFnZXMuCisgICBGaXJzdCBhbmQgbGFzdCBwYWdlIG9mIHRoZSByZWdpb24gaXMgcmVhZCBpZiBpdCBpcyBvdmVyd3JpdHRlbiBvbmx5CisgICBwYXJ0aWFsbHkuIElmIGxhc3QgcGFnZSBkaWQgbm90IGV4aXN0IGJlZm9yZSB3cml0ZSAoZmlsZSBob2xlIG9yIGZpbGUKKyAgIGFwcGVuZCksIGl0IGlzIHplcm9lZCwgdGhlbi4gCisgICBSZXR1cm5zIG51bWJlciBvZiB1bmFsbG9jYXRlZCBibG9ja3MgdGhhdCBzaG91bGQgYmUgYWxsb2NhdGVkIHRvIGNvdmVyCisgICBuZXcgZmlsZSBkYXRhLiovCitzdGF0aWMgaW50IHJlaXNlcmZzX3ByZXBhcmVfZmlsZV9yZWdpb25fZm9yX3dyaXRlKAorCQkJCXN0cnVjdCBpbm9kZSAqaW5vZGUgLyogSW5vZGUgb2YgdGhlIGZpbGUgKi8sCisJCQkJbG9mZl90IHBvcywgLyogcG9zaXRpb24gaW4gdGhlIGZpbGUgKi8KKwkJCQlzaXplX3QgbnVtX3BhZ2VzLCAvKiBudW1iZXIgb2YgcGFnZXMgdG8KKwkJCQkJICAgICAgICAgIHByZXBhcmUgKi8KKwkJCQlzaXplX3Qgd3JpdGVfYnl0ZXMsIC8qIEFtb3VudCBvZiBieXRlcyB0byBiZQorCQkJCQkJICAgIG92ZXJ3cml0dGVuIGZyb20KKwkJCQkJCSAgICBAcG9zICovCisJCQkJc3RydWN0IHBhZ2UgKipwcmVwYXJlZF9wYWdlcyAvKiBwb2ludGVyIHRvIGFycmF5CisJCQkJCQkJICAgICAgIHdoZXJlIHRvIHN0b3JlCisJCQkJCQkJICAgICAgIHByZXBhcmVkIHBhZ2VzICovCisJCQkJCSAgICkKK3sKKyAgICBpbnQgcmVzPTA7IC8vIFJldHVybiB2YWx1ZXMgb2YgZGlmZmVyZW50IGZ1bmN0aW9ucyB3ZSBjYWxsLgorICAgIHVuc2lnbmVkIGxvbmcgaW5kZXggPSBwb3MgPj4gUEFHRV9DQUNIRV9TSElGVDsgLy8gT2Zmc2V0IGluIGZpbGUgaW4gcGFnZXMuCisgICAgaW50IGZyb20gPSAocG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKTsgLy8gV3JpdGluZyBvZmZzZXQgaW4gZmlyc3QgcGFnZQorICAgIGludCB0byA9ICgocG9zICsgd3JpdGVfYnl0ZXMgLSAxKSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSkgKyAxOworCQkJCQkgLyogb2Zmc2V0IG9mIGxhc3QgbW9kaWZpZWQgYnl0ZSBpbiBsYXN0CisJCQkJICAgICAgICAgICAgcGFnZSAqLworICAgIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsgLy8gUGFnZXMgYXJlIG1hcHBlZCBoZXJlLgorICAgIGludCBpOyAvLyBTaW1wbGUgY291bnRlcgorICAgIGludCBibG9ja3MgPSAwOyAvKiBSZXR1cm4gdmFsdWUgKGJsb2NrcyB0aGF0IHNob3VsZCBiZSBhbGxvY2F0ZWQpICovCisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKmhlYWQ7IC8vIEN1cnJlbnQgYnVmZmVyaGVhZCBhbmQgZmlyc3QgYnVmZmVyaGVhZAorCQkJCSAgIC8vIG9mIGEgcGFnZS4KKyAgICB1bnNpZ25lZCBibG9ja19zdGFydCwgYmxvY2tfZW5kOyAvLyBTdGFydGluZyBhbmQgZW5kaW5nIG9mZnNldHMgb2YgY3VycmVudAorCQkJCSAgICAgLy8gYnVmZmVyIGluIHRoZSBwYWdlLgorICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqd2FpdFsyXSwgKip3YWl0X2JoPXdhaXQ7IC8vIEJ1ZmZlcnMgZm9yIHBhZ2UsIGlmCisJCQkJCQkgLy8gUGFnZSBhcHBlYXJlZCB0byBiZSBub3QgdXAKKwkJCQkJCSAvLyB0byBkYXRlLiBOb3RlIGhvdyB3ZSBoYXZlCisJCQkJCQkgLy8gYXQgbW9zdCAyIGJ1ZmZlcnMsIHRoaXMgaXMKKwkJCQkJCSAvLyBiZWNhdXNlIHdlIGF0IG1vc3QgbWF5CisJCQkJCQkgLy8gcGFydGlhbGx5IG92ZXJ3cml0ZSB0d28KKwkJCQkJCSAvLyBidWZmZXJzIGZvciBvbmUgcGFnZS4gT25lIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBiZWdpbm5pbmcgb2Ygd3JpdGUgYXJlYQorCQkJCQkJIC8vIGFuZCBvbmUgYXQgdGhlIGVuZC4KKwkJCQkJCSAvLyBFdmVyeXRoaW5nIGludGhlIG1pZGRsZSBnZXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXJ3cml0dGVuIHRvdGFsbHkuCisKKyAgICBzdHJ1Y3QgY3B1X2tleSBrZXk7IC8vIGNwdSBrZXkgb2YgaXRlbSB0aGF0IHdlIGFyZSBnb2luZyB0byBkZWFsIHdpdGgKKyAgICBzdHJ1Y3QgaXRlbV9oZWFkICppaCA9IE5VTEw7IC8vIHBvaW50ZXIgdG8gaXRlbSBoZWFkIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGRlYWwgd2l0aAorICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqaXRlbWJ1Zj1OVUxMOyAvLyBCdWZmZXIgaGVhZCB0aGF0IGNvbnRhaW5zIGl0ZW1zIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGRlYWwgd2l0aAorICAgIElOSVRJQUxJWkVfUEFUSChwYXRoKTsgLy8gcGF0aCB0byBpdGVtLCB0aGF0IHdlIGFyZSBnb2luZyB0byBkZWFsIHdpdGguCisgICAgX191MzIgKiBpdGVtPU5VTEw7IC8vIHBvaW50ZXIgdG8gaXRlbSB3ZSBhcmUgZ29pbmcgdG8gZGVhbCB3aXRoCisgICAgaW50IGl0ZW1fcG9zPS0xOyAvKiBQb3NpdGlvbiBpbiBpbmRpcmVjdCBpdGVtICovCisKKworICAgIGlmICggbnVtX3BhZ2VzIDwgMSApIHsKKwlyZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwKKwkJCSAgImdyZWVuLTkwMDE6IHJlaXNlcmZzX3ByZXBhcmVfZmlsZV9yZWdpb25fZm9yX3dyaXRlICIKKwkJCSAgImNhbGxlZCB3aXRoIHplcm8gbnVtYmVyIG9mIHBhZ2VzIHRvIHByb2Nlc3MiKTsKKwlyZXR1cm4gLUVGQVVMVDsKKyAgICB9CisKKyAgICAvKiBXZSBoYXZlIDIgbG9vcHMgZm9yIHBhZ2VzLiBJbiBmaXJzdCBsb29wIHdlIGdyYWIgYW5kIGxvY2sgdGhlIHBhZ2VzLCBzbworICAgICAgIHRoYXQgbm9ib2R5IHdvdWxkIHRvdWNoIHRoZXNlIHVudGlsIHdlIHJlbGVhc2UgdGhlIHBhZ2VzLiBUaGVuCisgICAgICAgd2UnZCBzdGFydCB0byBkZWFsIHdpdGggbWFwcGluZyBidWZmZXJzIHRvIGJsb2Nrcy4gKi8KKyAgICBmb3IgKCBpID0gMDsgaSA8IG51bV9wYWdlczsgaSsrKSB7CisJcHJlcGFyZWRfcGFnZXNbaV0gPSBncmFiX2NhY2hlX3BhZ2UobWFwcGluZywgaW5kZXggKyBpKTsgLy8gbG9ja3MgdGhlIHBhZ2UKKwlpZiAoICFwcmVwYXJlZF9wYWdlc1tpXSkgeworCSAgICByZXMgPSAtRU5PTUVNOworCSAgICBnb3RvIGZhaWxlZF9wYWdlX2dyYWJiaW5nOworCX0KKwlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocHJlcGFyZWRfcGFnZXNbaV0pKQorCSAgICBjcmVhdGVfZW1wdHlfYnVmZmVycyhwcmVwYXJlZF9wYWdlc1tpXSwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplLCAwKTsKKyAgICB9CisKKyAgICAvKiBMZXQncyBjb3VudCBhbW91bnQgb2YgYmxvY2tzIGZvciBhIGNhc2Ugd2hlcmUgYWxsIHRoZSBibG9ja3MKKyAgICAgICBvdmVyd3JpdHRlbiBhcmUgbmV3ICh3ZSB3aWxsIHN1YnN0cmFjdCBhbHJlYWR5IGFsbG9jYXRlZCBibG9ja3MgbGF0ZXIpKi8KKyAgICBpZiAoIG51bV9wYWdlcyA+IDIgKQorCS8qIFRoZXNlIGFyZSBmdWxsLW92ZXJ3cml0dGVuIHBhZ2VzIHNvIHdlIGNvdW50IGFsbCB0aGUgYmxvY2tzIGluCisJICAgdGhlc2UgcGFnZXMgYXJlIGNvdW50ZWQgYXMgbmVlZGVkIHRvIGJlIGFsbG9jYXRlZCAqLworCWJsb2NrcyA9IChudW1fcGFnZXMgLSAyKSA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIGlub2RlLT5pX2Jsa2JpdHMpOworCisgICAgLyogY291bnQgYmxvY2tzIG5lZWRlZCBmb3IgZmlyc3QgcGFnZSAocG9zc2libHkgcGFydGlhbGx5IHdyaXR0ZW4pICovCisgICAgYmxvY2tzICs9ICgoUEFHRV9DQUNIRV9TSVpFIC0gZnJvbSkgPj4gaW5vZGUtPmlfYmxrYml0cykgKworCSAgICEhKGZyb20gJiAoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplLTEpKTsgLyogcm91bmR1cCAqLworCisgICAgLyogTm93IHdlIGFjY291bnQgZm9yIGxhc3QgcGFnZS4gSWYgbGFzdCBwYWdlID09IGZpcnN0IHBhZ2UgKHdlCisgICAgICAgb3ZlcndyaXRlIG9ubHkgb25lIHBhZ2UpLCB3ZSBzdWJzdHJhY3QgYWxsIHRoZSBibG9ja3MgcGFzdCB0aGUKKyAgICAgICBsYXN0IHdyaXRpbmcgcG9zaXRpb24gaW4gYSBwYWdlIG91dCBvZiBhbHJlYWR5IGNhbGN1bGF0ZWQgbnVtYmVyCisgICAgICAgb2YgYmxvY2tzICovCisgICAgYmxvY2tzICs9ICgobnVtX3BhZ2VzID4gMSkgPDwgKFBBR0VfQ0FDSEVfU0hJRlQtaW5vZGUtPmlfYmxrYml0cykpIC0KKwkgICAoKFBBR0VfQ0FDSEVfU0laRSAtIHRvKSA+PiBpbm9kZS0+aV9ibGtiaXRzKTsKKwkgICAvKiBOb3RlIGhvdyB3ZSBkbyBub3Qgcm91bmR1cCBoZXJlIHNpbmNlIHBhcnRpYWwgYmxvY2tzIHN0aWxsCisJCSAgIHNob3VsZCBiZSBhbGxvY2F0ZWQgKi8KKworICAgIC8qIE5vdyBpZiBhbGwgdGhlIHdyaXRlIGFyZWEgbGllcyBwYXN0IHRoZSBmaWxlIGVuZCwgbm8gcG9pbnQgaW4KKyAgICAgICBtYXBpbmcgYmxvY2tzLCBzaW5jZSB0aGVyZSBpcyBub25lLCBzbyB3ZSBqdXN0IHplcm8gb3V0IHJlbWFpbmluZworICAgICAgIHBhcnRzIG9mIGZpcnN0IGFuZCBsYXN0IHBhZ2VzIGluIHdyaXRlIGFyZWEgKGlmIG5lZWRlZCkgKi8KKyAgICBpZiAoIChwb3MgJiB+KChsb2ZmX3QpUEFHRV9DQUNIRV9TSVpFIC0gMSkpID4gaW5vZGUtPmlfc2l6ZSApIHsKKwlpZiAoIGZyb20gIT0gMCApIHsvKiBGaXJzdCBwYWdlIG5lZWRzIHRvIGJlIHBhcnRpYWxseSB6ZXJvZWQgKi8KKwkgICAgY2hhciAqa2FkZHIgPSBrbWFwX2F0b21pYyhwcmVwYXJlZF9wYWdlc1swXSwgS01fVVNFUjApOworCSAgICBtZW1zZXQoa2FkZHIsIDAsIGZyb20pOworCSAgICBrdW5tYXBfYXRvbWljKCBrYWRkciwgS01fVVNFUjApOworCX0KKwlpZiAoIHRvICE9IFBBR0VfQ0FDSEVfU0laRSApIHsgLyogTGFzdCBwYWdlIG5lZWRzIHRvIGJlIHBhcnRpYWxseSB6ZXJvZWQgKi8KKwkgICAgY2hhciAqa2FkZHIgPSBrbWFwX2F0b21pYyhwcmVwYXJlZF9wYWdlc1tudW1fcGFnZXMtMV0sIEtNX1VTRVIwKTsKKwkgICAgbWVtc2V0KGthZGRyK3RvLCAwLCBQQUdFX0NBQ0hFX1NJWkUgLSB0byk7CisJICAgIGt1bm1hcF9hdG9taWMoIGthZGRyLCBLTV9VU0VSMCk7CisJfQorCisJLyogU2luY2UgYWxsIGJsb2NrcyBhcmUgbmV3IC0gdXNlIGFscmVhZHkgY2FsY3VsYXRlZCB2YWx1ZSAqLworCXJldHVybiBibG9ja3M7CisgICAgfQorCisgICAgLyogV2VsbCwgc2luY2Ugd2Ugd3JpdGUgc29tZXdoZXJlIGludG8gdGhlIG1pZGRsZSBvZiBhIGZpbGUsIHRoZXJlIGlzCisgICAgICAgcG9zc2liaWxpdHkgd2UgYXJlIHdyaXRpbmcgb3ZlciBzb21lIGFscmVhZHkgYWxsb2NhdGVkIGJsb2Nrcywgc28KKyAgICAgICBsZXQncyBtYXAgdGhlc2UgYmxvY2tzIGFuZCBzdWJzdHJhY3QgbnVtYmVyIG9mIHN1Y2ggYmxvY2tzIG91dCBvZiBibG9ja3MKKyAgICAgICB3ZSBuZWVkIHRvIGFsbG9jYXRlIChjYWxjdWxhdGVkIGFib3ZlKSAqLworICAgIC8qIE1hc2sgd3JpdGUgcG9zaXRpb24gdG8gc3RhcnQgb24gYmxvY2tzaXplLCB3ZSBkbyBpdCBvdXQgb2YgdGhlCisgICAgICAgbG9vcCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyAqLworICAgIHBvcyAmPSB+KChsb2ZmX3QpIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpOworICAgIC8qIFNldCBjcHUga2V5IHRvIHRoZSBzdGFydGluZyBwb3NpdGlvbiBpbiBhIGZpbGUgKG9uIGxlZnQgYmxvY2sgYm91bmRhcnkpKi8KKyAgICBtYWtlX2NwdV9rZXkgKCZrZXksIGlub2RlLCAxICsgKChwb3MpICYgfigobG9mZl90KSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSksIFRZUEVfQU5ZLCAzLyprZXkgbGVuZ3RoKi8pOworCisgICAgcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7IC8vIFdlIG5lZWQgdGhhdCBmb3IgYXQgbGVhc3Qgc2VhcmNoX2J5X2tleSgpCisgICAgZm9yICggaSA9IDA7IGkgPCBudW1fcGFnZXMgOyBpKysgKSB7IAorCisJaGVhZCA9IHBhZ2VfYnVmZmVycyhwcmVwYXJlZF9wYWdlc1tpXSk7CisJLyogRm9yIGVhY2ggYnVmZmVyIGluIHRoZSBwYWdlICovCisJZm9yKGJoID0gaGVhZCwgYmxvY2tfc3RhcnQgPSAwOyBiaCAhPSBoZWFkIHx8ICFibG9ja19zdGFydDsKKwkgICAgYmxvY2tfc3RhcnQ9YmxvY2tfZW5kLCBiaCA9IGJoLT5iX3RoaXNfcGFnZSkgeworCQlpZiAoIWJoKQorCQkgICAgcmVpc2VyZnNfcGFuaWMoaW5vZGUtPmlfc2IsICJncmVlbi05MDAyOiBBbGxvY2F0ZWQgYnV0IGFic2VudCBidWZmZXIgZm9yIGEgcGFnZT8iKTsKKwkJLyogRmluZCB3aGVyZSB0aGlzIGJ1ZmZlciBlbmRzICovCisJCWJsb2NrX2VuZCA9IGJsb2NrX3N0YXJ0K2lub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwkJaWYgKGkgPT0gMCAmJiBibG9ja19lbmQgPD0gZnJvbSApCisJCSAgICAvKiBpZiB0aGlzIGJ1ZmZlciBpcyBiZWZvcmUgcmVxdWVzdGVkIGRhdGEgdG8gbWFwLCBza2lwIGl0Ki8KKwkJICAgIGNvbnRpbnVlOworCisJCWlmIChpID09IG51bV9wYWdlcyAtIDEgJiYgYmxvY2tfc3RhcnQgPj0gdG8pIHsKKwkJICAgIC8qIElmIHRoaXMgYnVmZmVyIGlzIGFmdGVyIHJlcXVlc3RlZCBkYXRhIHRvIG1hcCwgYWJvcnQKKwkJICAgICAgIHByb2Nlc3Npbmcgb2YgY3VycmVudCBwYWdlICovCisJCSAgICBicmVhazsKKwkJfQorCisJCWlmICggYnVmZmVyX21hcHBlZChiaCkgJiYgYmgtPmJfYmxvY2tuciAhPTAgKSB7CisJCSAgICAvKiBUaGlzIGlzIG9wdGltaXNhdGlvbiBmb3IgYSBjYXNlIHdoZXJlIGJ1ZmZlciBpcyBtYXBwZWQKKwkJICAgICAgIGFuZCBoYXZlIGJsb2NrbnVtYmVyIGFzc2lnbmVkLiBJbiBjYXNlIHNpZ25pZmljYW50IGFtb3VudAorCQkgICAgICAgb2Ygc3VjaCBidWZmZXJzIGFyZSBwcmVzZW50LCB3ZSBtYXkgYXZvaWQgc29tZSBhbW91bnQKKwkJICAgICAgIG9mIHNlYXJjaF9ieV9rZXkgY2FsbHMuCisJCSAgICAgICBQcm9iYWJseSBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBtb3ZlIHBhcnRzIG9mIHRoaXMgY29kZQorCQkgICAgICAgb3V0IG9mIEJLTCwgYnV0IEkgYWZyYWlkIHRoYXQgd291bGQgb3ZlcmNvbXBsaWNhdGUgY29kZQorCQkgICAgICAgd2l0aG91dCBhbnkgbm90aWNlYWJsZSBiZW5lZml0LgorCQkgICAgKi8KKwkJICAgIGl0ZW1fcG9zKys7CisJCSAgICAvKiBVcGRhdGUgdGhlIGtleSAqLworCQkgICAgc2V0X2NwdV9rZXlfa19vZmZzZXQoICZrZXksIGNwdV9rZXlfa19vZmZzZXQoJmtleSkgKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOworCQkgICAgYmxvY2tzLS07IC8vIERlY3JlYXNlIHRoZSBhbW91bnQgb2YgYmxvY2tzIHRoYXQgbmVlZCB0byBiZQorCQkJICAgICAgLy8gYWxsb2NhdGVkCisJCSAgICBjb250aW51ZTsgLy8gR28gdG8gdGhlIG5leHQgYnVmZmVyCisJCX0KKworCQlpZiAoICFpdGVtYnVmIHx8IC8qIGlmIGZpcnN0IGl0ZXJhdGlvbiAqLworCQkgICAgIGl0ZW1fcG9zID49IGloX2l0ZW1fbGVuKGloKS9VTkZNX1BfU0laRSkKKwkJCQkJICAgICB7IC8qIG9yIGlmIHdlIHByb2dyZXNzZWQgcGFzdCB0aGUKKwkJCQkJCSAgY3VycmVudCB1bmZvcm1hdHRlZF9pdGVtICovCisJCQkvKiBUcnkgdG8gZmluZCBuZXh0IGl0ZW0gKi8KKwkJCXJlcyA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7CisJCQkvKiBBYm9ydCBpZiBubyBtb3JlIGl0ZW1zICovCisJCQlpZiAoIHJlcyAhPSBQT1NJVElPTl9GT1VORCApIHsKKwkJCSAgICAvKiBtYWtlIHN1cmUgbGF0ZXIgbG9vcHMgZG9uJ3QgdXNlIHRoaXMgaXRlbSAqLworCQkJICAgIGl0ZW1idWYgPSBOVUxMOworCQkJICAgIGl0ZW0gPSBOVUxMOworCQkJICAgIGJyZWFrOworCQkJfQorCisJCQkvKiBVcGRhdGUgaW5mb3JtYXRpb24gYWJvdXQgY3VycmVudCBpbmRpcmVjdCBpdGVtICovCisJCQlpdGVtYnVmID0gZ2V0X2xhc3RfYmgoICZwYXRoICk7CisJCQlpaCA9IGdldF9paCggJnBhdGggKTsKKwkJCWl0ZW0gPSBnZXRfaXRlbSggJnBhdGggKTsKKwkJCWl0ZW1fcG9zID0gcGF0aC5wb3NfaW5faXRlbTsKKworCQkJUkZBTFNFKCAhaXNfaW5kaXJlY3RfbGVfaWggKGloKSwgImdyZWVuLTkwMDM6IGluZGlyZWN0IGl0ZW0gZXhwZWN0ZWQiKTsKKwkJfQorCisJCS8qIFNlZSBpZiB0aGVyZSBpcyBzb21lIGJsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZQorCQkgICBhdCB0aGF0IHBvc2l0aW9uLCBtYXAgdGhlIGJ1ZmZlciB0byB0aGlzIGJsb2NrICovCisJCWlmICggZ2V0X2Jsb2NrX251bShpdGVtLGl0ZW1fcG9zKSApIHsKKwkJICAgIG1hcF9iaChiaCwgaW5vZGUtPmlfc2IsIGdldF9ibG9ja19udW0oaXRlbSxpdGVtX3BvcykpOworCQkgICAgYmxvY2tzLS07IC8vIERlY3JlYXNlIHRoZSBhbW91bnQgb2YgYmxvY2tzIHRoYXQgbmVlZCB0byBiZQorCQkJICAgICAgLy8gYWxsb2NhdGVkCisJCX0KKwkJaXRlbV9wb3MrKzsKKwkJLyogVXBkYXRlIHRoZSBrZXkgKi8KKwkJc2V0X2NwdV9rZXlfa19vZmZzZXQoICZrZXksIGNwdV9rZXlfa19vZmZzZXQoJmtleSkgKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOworCX0KKyAgICB9CisgICAgcGF0aHJlbHNlKCZwYXRoKTsgLy8gRnJlZSB0aGUgcGF0aAorICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisKKwkvKiBOb3cgemVybyBvdXQgdW5tYXBwZW5kIGJ1ZmZlcnMgZm9yIHRoZSBmaXJzdCBhbmQgbGFzdCBwYWdlcyBvZgorCSAgIHdyaXRlIGFyZWEgb3IgaXNzdWUgcmVhZCByZXF1ZXN0cyBpZiBwYWdlIGlzIG1hcHBlZC4gKi8KKwkvKiBGaXJzdCBwYWdlLCBzZWUgaWYgaXQgaXMgbm90IHVwdG9kYXRlICovCisJaWYgKCAhUGFnZVVwdG9kYXRlKHByZXBhcmVkX3BhZ2VzWzBdKSApIHsKKwkgICAgaGVhZCA9IHBhZ2VfYnVmZmVycyhwcmVwYXJlZF9wYWdlc1swXSk7CisKKwkgICAgLyogRm9yIGVhY2ggYnVmZmVyIGluIHBhZ2UgKi8KKwkgICAgZm9yKGJoID0gaGVhZCwgYmxvY2tfc3RhcnQgPSAwOyBiaCAhPSBoZWFkIHx8ICFibG9ja19zdGFydDsKKwkJYmxvY2tfc3RhcnQ9YmxvY2tfZW5kLCBiaCA9IGJoLT5iX3RoaXNfcGFnZSkgeworCisJCWlmICghYmgpCisJCSAgICByZWlzZXJmc19wYW5pYyhpbm9kZS0+aV9zYiwgImdyZWVuLTkwMDI6IEFsbG9jYXRlZCBidXQgYWJzZW50IGJ1ZmZlciBmb3IgYSBwYWdlPyIpOworCQkvKiBGaW5kIHdoZXJlIHRoaXMgYnVmZmVyIGVuZHMgKi8KKwkJYmxvY2tfZW5kID0gYmxvY2tfc3RhcnQraW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCQlpZiAoIGJsb2NrX2VuZCA8PSBmcm9tICkKKwkJICAgIC8qIGlmIHRoaXMgYnVmZmVyIGlzIGJlZm9yZSByZXF1ZXN0ZWQgZGF0YSB0byBtYXAsIHNraXAgaXQqLworCQkgICAgY29udGludWU7CisJCWlmICggYmxvY2tfc3RhcnQgPCBmcm9tICkgeyAvKiBBaGEsIG91ciBwYXJ0aWFsIGJ1ZmZlciAqLworCQkgICAgaWYgKCBidWZmZXJfbWFwcGVkKGJoKSApIHsgLyogSWYgaXQgaXMgbWFwcGVkLCB3ZSBuZWVkIHRvCisJCQkJCQkgIGlzc3VlIFJFQUQgcmVxdWVzdCBmb3IgaXQgdG8KKwkJCQkJCSAgbm90IGxvb3NlIGRhdGEgKi8KKwkJCWxsX3J3X2Jsb2NrKFJFQUQsIDEsICZiaCk7CisJCQkqd2FpdF9iaCsrPWJoOworCQkgICAgfSBlbHNlIHsgLyogTm90IG1hcHBlZCwgemVybyBpdCAqLworCQkJY2hhciAqa2FkZHIgPSBrbWFwX2F0b21pYyhwcmVwYXJlZF9wYWdlc1swXSwgS01fVVNFUjApOworCQkJbWVtc2V0KGthZGRyK2Jsb2NrX3N0YXJ0LCAwLCBmcm9tLWJsb2NrX3N0YXJ0KTsKKwkJCWt1bm1hcF9hdG9taWMoIGthZGRyLCBLTV9VU0VSMCk7CisJCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJfQorCisJLyogTGFzdCBwYWdlLCBzZWUgaWYgaXQgaXMgbm90IHVwdG9kYXRlLCBvciBpZiB0aGUgbGFzdCBwYWdlIGlzIHBhc3QgdGhlIGVuZCBvZiB0aGUgZmlsZS4gKi8KKwlpZiAoICFQYWdlVXB0b2RhdGUocHJlcGFyZWRfcGFnZXNbbnVtX3BhZ2VzLTFdKSB8fCAKKwkgICAgKChwb3Mrd3JpdGVfYnl0ZXMpPj5QQUdFX0NBQ0hFX1NISUZUKSA+IChpbm9kZS0+aV9zaXplPj5QQUdFX0NBQ0hFX1NISUZUKSApIHsKKwkgICAgaGVhZCA9IHBhZ2VfYnVmZmVycyhwcmVwYXJlZF9wYWdlc1tudW1fcGFnZXMtMV0pOworCisJICAgIC8qIGZvciBlYWNoIGJ1ZmZlciBpbiBwYWdlICovCisJICAgIGZvcihiaCA9IGhlYWQsIGJsb2NrX3N0YXJ0ID0gMDsgYmggIT0gaGVhZCB8fCAhYmxvY2tfc3RhcnQ7CisJCWJsb2NrX3N0YXJ0PWJsb2NrX2VuZCwgYmggPSBiaC0+Yl90aGlzX3BhZ2UpIHsKKworCQlpZiAoIWJoKQorCQkgICAgcmVpc2VyZnNfcGFuaWMoaW5vZGUtPmlfc2IsICJncmVlbi05MDAyOiBBbGxvY2F0ZWQgYnV0IGFic2VudCBidWZmZXIgZm9yIGEgcGFnZT8iKTsKKwkJLyogRmluZCB3aGVyZSB0aGlzIGJ1ZmZlciBlbmRzICovCisJCWJsb2NrX2VuZCA9IGJsb2NrX3N0YXJ0K2lub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwkJaWYgKCBibG9ja19zdGFydCA+PSB0byApCisJCSAgICAvKiBpZiB0aGlzIGJ1ZmZlciBpcyBhZnRlciByZXF1ZXN0ZWQgZGF0YSB0byBtYXAsIHNraXAgaXQqLworCQkgICAgYnJlYWs7CisJCWlmICggYmxvY2tfZW5kID4gdG8gKSB7IC8qIEFoYSwgb3VyIHBhcnRpYWwgYnVmZmVyICovCisJCSAgICBpZiAoIGJ1ZmZlcl9tYXBwZWQoYmgpICkgeyAvKiBJZiBpdCBpcyBtYXBwZWQsIHdlIG5lZWQgdG8KKwkJCQkJCSAgaXNzdWUgUkVBRCByZXF1ZXN0IGZvciBpdCB0bworCQkJCQkJICBub3QgbG9vc2UgZGF0YSAqLworCQkJbGxfcndfYmxvY2soUkVBRCwgMSwgJmJoKTsKKwkJCSp3YWl0X2JoKys9Ymg7CisJCSAgICB9IGVsc2UgeyAvKiBOb3QgbWFwcGVkLCB6ZXJvIGl0ICovCisJCQljaGFyICprYWRkciA9IGttYXBfYXRvbWljKHByZXBhcmVkX3BhZ2VzW251bV9wYWdlcy0xXSwgS01fVVNFUjApOworCQkJbWVtc2V0KGthZGRyK3RvLCAwLCBibG9ja19lbmQtdG8pOworCQkJa3VubWFwX2F0b21pYygga2FkZHIsIEtNX1VTRVIwKTsKKwkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisKKyAgICAvKiBXYWl0IGZvciByZWFkIHJlcXVlc3RzIHdlIG1hZGUgdG8gaGFwcGVuLCBpZiBuZWNlc3NhcnkgKi8KKyAgICB3aGlsZSh3YWl0X2JoID4gd2FpdCkgeworCXdhaXRfb25fYnVmZmVyKCotLXdhaXRfYmgpOworCWlmICghYnVmZmVyX3VwdG9kYXRlKCp3YWl0X2JoKSkgeworCSAgICByZXMgPSAtRUlPOworCSAgICBnb3RvIGZhaWxlZF9yZWFkOworCX0KKyAgICB9CisKKyAgICByZXR1cm4gYmxvY2tzOworZmFpbGVkX3BhZ2VfZ3JhYmJpbmc6CisgICAgbnVtX3BhZ2VzID0gaTsKK2ZhaWxlZF9yZWFkOgorICAgIHJlaXNlcmZzX3VucHJlcGFyZV9wYWdlcyhwcmVwYXJlZF9wYWdlcywgbnVtX3BhZ2VzKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvKiBXcml0ZSBAY291bnQgYnl0ZXMgYXQgcG9zaXRpb24gQHBwb3MgaW4gYSBmaWxlIGluZGljYXRlZCBieSBAZmlsZQorICAgZnJvbSB0aGUgYnVmZmVyIEBidWYuICAKKworICAgZ2VuZXJpY19maWxlX3dyaXRlKCkgaXMgb25seSBhcHByb3ByaWF0ZSBmb3IgZmlsZXN5c3RlbXMgdGhhdCBhcmUgbm90IHNlZWtpbmcgdG8gb3B0aW1pemUgcGVyZm9ybWFuY2UgYW5kIHdhbnQKKyAgIHNvbWV0aGluZyBzaW1wbGUgdGhhdCB3b3Jrcy4gIEl0IGlzIG5vdCBmb3Igc2VyaW91cyB1c2UgYnkgZ2VuZXJhbCBwdXJwb3NlIGZpbGVzeXN0ZW1zLCBleGNlcHRpbmcgdGhlIG9uZSB0aGF0IGl0IHdhcworICAgd3JpdHRlbiBmb3IgKGV4dDIvMykuICBUaGlzIGlzIGZvciBzZXZlcmFsIHJlYXNvbnM6CisKKyAgICogSXQgaGFzIG5vIHVuZGVyc3RhbmRpbmcgb2YgYW55IGZpbGVzeXN0ZW0gc3BlY2lmaWMgb3B0aW1pemF0aW9ucy4KKworICAgKiBJdCBlbnRlcnMgdGhlIGZpbGVzeXN0ZW0gcmVwZWF0ZWRseSBmb3IgZWFjaCBwYWdlIHRoYXQgaXMgd3JpdHRlbi4KKworICAgKiBJdCBkZXBlbmRzIG9uIHJlaXNlcmZzX2dldF9ibG9jaygpIGZ1bmN0aW9uIHdoaWNoIGlmIGltcGxlbWVudGVkIGJ5IHJlaXNlcmZzIHBlcmZvcm1zIGNvc3RseSBzZWFyY2hfYnlfa2V5CisgICAqIG9wZXJhdGlvbiBmb3IgZWFjaCBwYWdlIGl0IGlzIHN1cHBsaWVkIHdpdGguIEJ5IGNvbnRyYXN0IHJlaXNlcmZzX2ZpbGVfd3JpdGUoKSBmZWVkcyBhcyBtdWNoIGFzIHBvc3NpYmxlIGF0IGEgdGltZQorICAgKiB0byByZWlzZXJmcyB3aGljaCBhbGxvd3MgZm9yIGZld2VyIHRyZWUgdHJhdmVyc2Fscy4KKworICAgKiBFYWNoIGluZGlyZWN0IHBvaW50ZXIgaW5zZXJ0aW9uIHRha2VzIGEgbG90IG9mIGNwdSwgYmVjYXVzZSBpdCBpbnZvbHZlcyBtZW1vcnkgbW92ZXMgaW5zaWRlIG9mIGJsb2Nrcy4KKworICAgKiBBc2tpbmcgdGhlIGJsb2NrIGFsbG9jYXRpb24gY29kZSBmb3IgYmxvY2tzIG9uZSBhdCBhIHRpbWUgaXMgc2xpZ2h0bHkgbGVzcyBlZmZpY2llbnQuCisKKyAgIEFsbCBvZiB0aGVzZSByZWFzb25zIGZvciBub3QgdXNpbmcgb25seSBnZW5lcmljIGZpbGUgd3JpdGUgd2VyZSB1bmRlcnN0b29kIGJhY2sgd2hlbiByZWlzZXJmcyB3YXMgZmlyc3QgbWlzY29kZWQgdG8KKyAgIHVzZSBpdCwgYnV0IHdlIHdlcmUgaW4gYSBodXJyeSB0byBtYWtlIGNvZGUgZnJlZXplLCBhbmQgc28gaXQgY291bGRuJ3QgYmUgcmV2aXNlZCB0aGVuLiAgVGhpcyBuZXcgY29kZSBzaG91bGQgbWFrZQorICAgdGhpbmdzIHJpZ2h0IGZpbmFsbHkuCisKKyAgIEZ1dHVyZSBGZWF0dXJlczogcHJvdmlkaW5nIHNlYXJjaF9ieV9rZXkgd2l0aCBoaW50cy4KKworKi8KK3N0YXRpYyBzc2l6ZV90IHJlaXNlcmZzX2ZpbGVfd3JpdGUoIHN0cnVjdCBmaWxlICpmaWxlLCAvKiB0aGUgZmlsZSB3ZSBhcmUgZ29pbmcgdG8gd3JpdGUgaW50byAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCAvKiAgcG9pbnRlciB0byB1c2VyIHN1cHBsaWVkIGRhdGEKKyhpbiB1c2Vyc3BhY2UpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCwgLyogYW1vdW50IG9mIGJ5dGVzIHRvIHdyaXRlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZmZfdCAqcHBvcyAvKiBwb2ludGVyIHRvIHBvc2l0aW9uIGluIGZpbGUgdGhhdCB3ZSBzdGFydCB3cml0aW5nIGF0LiBTaG91bGQgYmUgdXBkYXRlZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbmV3IGN1cnJlbnQgcG9zaXRpb24gYmVmb3JlIHJldHVybmluZy4gKi8gKQoreworICAgIHNpemVfdCBhbHJlYWR5X3dyaXR0ZW4gPSAwOyAvLyBOdW1iZXIgb2YgYnl0ZXMgYWxyZWFkeSB3cml0dGVuIHRvIHRoZSBmaWxlLgorICAgIGxvZmZfdCBwb3M7IC8vIEN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGZpbGUuCisgICAgc3NpemVfdCByZXM7IC8vIHJldHVybiB2YWx1ZSBvZiB2YXJpb3VzIGZ1bmN0aW9ucyB0aGF0IHdlIGNhbGwuCisgICAgaW50IGVyciA9IDA7CisgICAgc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOyAvLyBJbm9kZSBvZiB0aGUgZmlsZSB0aGF0IHdlIGFyZSB3cml0aW5nIHRvLgorCQkJCS8qIFRvIHNpbXBsaWZ5IGNvZGluZyBhdCB0aGlzIHRpbWUsIHdlIHN0b3JlCisJCQkJICAgbG9ja2VkIHBhZ2VzIGluIGFycmF5IGZvciBub3cgKi8KKyAgICBzdHJ1Y3QgcGFnZSAqIHByZXBhcmVkX3BhZ2VzW1JFSVNFUkZTX1dSSVRFX1BBR0VTX0FUX0FfVElNRV07CisgICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKyAgICB0aC50X3RyYW5zX2lkID0gMDsKKworICAgIGlmICggZmlsZS0+Zl9mbGFncyAmIE9fRElSRUNUKSB7IC8vIERpcmVjdCBJTyBuZWVkcyB0cmVhdG1lbnQKKwlzc2l6ZV90IHJlc3VsdCwgYWZ0ZXJfZmlsZV9lbmQgPSAwOworCWlmICggKCpwcG9zICsgY291bnQgPj0gaW5vZGUtPmlfc2l6ZSkgfHwgKGZpbGUtPmZfZmxhZ3MgJiBPX0FQUEVORCkgKSB7CisJICAgIC8qIElmIHdlIGFyZSBhcHBlbmRpbmcgYSBmaWxlLCB3ZSBuZWVkIHRvIHB1dCB0aGlzIHNhdmVsaW5rIGluIGhlcmUuCisJICAgICAgIElmIHdlIHdpbGwgY3Jhc2ggd2hpbGUgZG9pbmcgZGlyZWN0IGlvLCBmaW5pc2hfdW5maW5pc2hlZCB3aWxsCisJICAgICAgIGN1dCB0aGUgZ2FyYmFnZSBmcm9tIHRoZSBmaWxlIGVuZC4gKi8KKwkgICAgcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJICAgIGVyciA9IGpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwgIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICk7CisgICAgICAgICAgICBpZiAoZXJyKSB7CisJCXJlaXNlcmZzX3dyaXRlX3VubG9jayAoaW5vZGUtPmlfc2IpOworCQlyZXR1cm4gZXJyOworCSAgICB9CisJICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSk7CisJICAgIGFkZF9zYXZlX2xpbmsgKCZ0aCwgaW5vZGUsIDEgLyogVHJ1bmNhdGUgKi8pOworCSAgICBhZnRlcl9maWxlX2VuZCA9IDE7CisJICAgIGVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICk7CisgICAgICAgICAgICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCSAgICBpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCX0KKwlyZXN1bHQgPSBnZW5lcmljX2ZpbGVfd3JpdGUoZmlsZSwgYnVmLCBjb3VudCwgcHBvcyk7CisKKwlpZiAoIGFmdGVyX2ZpbGVfZW5kICkgeyAvKiBOb3cgdXBkYXRlIGlfc2l6ZSBhbmQgcmVtb3ZlIHRoZSBzYXZlbGluayAqLworCSAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworCSAgICByZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKwkgICAgZXJyID0gam91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLCAxKTsKKyAgICAgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICAgICAgICByZWlzZXJmc193cml0ZV91bmxvY2sgKGlub2RlLT5pX3NiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorCSAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpOworCSAgICByZWlzZXJmc191cGRhdGVfc2QoJnRoLCBpbm9kZSk7CisJICAgIGVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsIDEpOworICAgICAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayAoaW5vZGUtPmlfc2IpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisJICAgIGVyciA9IHJlbW92ZV9zYXZlX2xpbmsgKGlub2RlLCAxLyogdHJ1bmNhdGUgKi8pOworCSAgICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworICAgICAgICAgICAgaWYgKGVycikKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworCX0KKworCXJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgaWYgKCB1bmxpa2VseSgoc3NpemVfdCkgY291bnQgPCAwICkpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgaWYgKHVubGlrZWx5KCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZiwgY291bnQpKSkKKyAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisKKyAgICBkb3duKCZpbm9kZS0+aV9zZW0pOyAvLyBsb2NrcyB0aGUgZW50aXJlIGZpbGUgZm9yIGp1c3QgdXMKKworICAgIHBvcyA9ICpwcG9zOworCisgICAgLyogQ2hlY2sgaWYgd2UgY2FuIHdyaXRlIHRvIHNwZWNpZmllZCByZWdpb24gb2YgZmlsZSwgZmlsZQorICAgICAgIGlzIG5vdCBvdmVybHkgYmlnIGFuZCB0aGlzIGtpbmQgb2Ygc3R1ZmYuIEFkanVzdCBwb3MgYW5kCisgICAgICAgY291bnQsIGlmIG5lZWRlZCAqLworICAgIHJlcyA9IGdlbmVyaWNfd3JpdGVfY2hlY2tzKGZpbGUsICZwb3MsICZjb3VudCwgMCk7CisgICAgaWYgKHJlcykKKwlnb3RvIG91dDsKKworICAgIGlmICggY291bnQgPT0gMCApCisJZ290byBvdXQ7CisKKyAgICByZXMgPSByZW1vdmVfc3VpZChmaWxlLT5mX2RlbnRyeSk7CisgICAgaWYgKHJlcykKKwlnb3RvIG91dDsKKworICAgIGlub2RlX3VwZGF0ZV90aW1lKGlub2RlLCAxKTsgLyogQm90aCBtdGltZSBhbmQgY3RpbWUgKi8KKworICAgIC8vIE9rLCB3ZSBhcmUgZG9uZSB3aXRoIGFsbCB0aGUgY2hlY2tzLgorCisgICAgLy8gTm93IHdlIHNob3VsZCBzdGFydCByZWFsIHdvcmsKKworICAgIC8qIElmIHdlIGFyZSBnb2luZyB0byB3cml0ZSBwYXN0IHRoZSBmaWxlJ3MgcGFja2VkIHRhaWwgb3IgaWYgd2UgYXJlIGdvaW5nCisgICAgICAgdG8gb3ZlcndyaXRlIHBhcnQgb2YgdGhlIHRhaWwsIHdlIG5lZWQgdGhhdCB0YWlsIHRvIGJlIGNvbnZlcnRlZCBpbnRvCisgICAgICAgdW5mb3JtYXR0ZWQgbm9kZSAqLworICAgIHJlcyA9IHJlaXNlcmZzX2NoZWNrX2Zvcl90YWlsX2FuZF9jb252ZXJ0KCBpbm9kZSwgcG9zLCBjb3VudCk7CisgICAgaWYgKHJlcykKKwlnb3RvIG91dDsKKworICAgIHdoaWxlICggY291bnQgPiAwKSB7CisJLyogVGhpcyBpcyB0aGUgbWFpbiBsb29wIGluIHdoaWNoIHdlIHJ1bm5pbmcgdW50aWwgc29tZSBlcnJvciBvY2N1cmVzCisJICAgb3IgdW50aWwgd2Ugd3JpdGUgYWxsIG9mIHRoZSBkYXRhLiAqLworCXNpemVfdCBudW1fcGFnZXM7LyogYW1vdW50IG9mIHBhZ2VzIHdlIGFyZSBnb2luZyB0byB3cml0ZSB0aGlzIGl0ZXJhdGlvbiAqLworCXNpemVfdCB3cml0ZV9ieXRlczsgLyogYW1vdW50IG9mIGJ5dGVzIHRvIHdyaXRlIGR1cmluZyB0aGlzIGl0ZXJhdGlvbiAqLworCXNpemVfdCBibG9ja3NfdG9fYWxsb2NhdGU7IC8qIGhvdyBtdWNoIGJsb2NrcyB3ZSBuZWVkIHRvIGFsbG9jYXRlIGZvciB0aGlzIGl0ZXJhdGlvbiAqLworICAgICAgICAKKyAgICAgICAgLyogIChwb3MgJiAoUEFHRV9DQUNIRV9TSVpFLTEpKSBpcyBhbiBpZGlvbSBmb3Igb2Zmc2V0IGludG8gYSBwYWdlIG9mIHBvcyovCisJbnVtX3BhZ2VzID0gISEoKHBvcytjb3VudCkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpICsgLyogcm91bmQgdXAgcGFydGlhbAorCQkJCQkJCSAgcGFnZXMgKi8KKwkJICAgICgoY291bnQgKyAocG9zICYgKFBBR0VfQ0FDSEVfU0laRS0xKSkpID4+IFBBR0VfQ0FDSEVfU0hJRlQpOyAKKwkJCQkJCS8qIGNvbnZlcnQgc2l6ZSB0byBhbW91bnQgb2YKKwkJCQkJCSAgIHBhZ2VzICovCisJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJaWYgKCBudW1fcGFnZXMgPiBSRUlTRVJGU19XUklURV9QQUdFU19BVF9BX1RJTUUgCisJCXx8IG51bV9wYWdlcyA+IHJlaXNlcmZzX2Nhbl9maXRfcGFnZXMoaW5vZGUtPmlfc2IpICkgeworCSAgICAvKiBJZiB3ZSB3ZXJlIGFza2VkIHRvIHdyaXRlIG1vcmUgZGF0YSB0aGFuIHdlIHdhbnQgdG8gb3IgaWYgdGhlcmUKKwkgICAgICAgaXMgbm90IHRoYXQgbXVjaCBzcGFjZSwgdGhlbiB3ZSBzaG9ydGVuIGFtb3VudCBvZiBkYXRhIHRvIHdyaXRlCisJICAgICAgIGZvciB0aGlzIGl0ZXJhdGlvbi4gKi8KKwkgICAgbnVtX3BhZ2VzID0gbWluX3Qoc2l6ZV90LCBSRUlTRVJGU19XUklURV9QQUdFU19BVF9BX1RJTUUsIHJlaXNlcmZzX2Nhbl9maXRfcGFnZXMoaW5vZGUtPmlfc2IpKTsKKwkgICAgLyogQWxzbyB3ZSBzaG91bGQgbm90IGZvcmdldCB0byBzZXQgc2l6ZSBpbiBieXRlcyBhY2NvcmRpbmdseSAqLworCSAgICB3cml0ZV9ieXRlcyA9IChudW1fcGFnZXMgPDwgUEFHRV9DQUNIRV9TSElGVCkgLSAKKwkJCSAgICAocG9zICYgKFBBR0VfQ0FDSEVfU0laRS0xKSk7CisJCQkJCSAvKiBJZiBwb3NpdGlvbiBpcyBub3Qgb24gdGhlCisJCQkJCSAgICBzdGFydCBvZiB0aGUgcGFnZSwgd2UgbmVlZAorCQkJCQkgICAgdG8gc3Vic3RyYWN0IHRoZSBvZmZzZXQKKwkJCQkJICAgIHdpdGhpbiBwYWdlICovCisJfSBlbHNlCisJICAgIHdyaXRlX2J5dGVzID0gY291bnQ7CisKKwkvKiByZXNlcnZlIHRoZSBibG9ja3MgdG8gYmUgYWxsb2NhdGVkIGxhdGVyLCBzbyB0aGF0IGxhdGVyIG9uCisJICAgd2Ugc3RpbGwgaGF2ZSB0aGUgc3BhY2UgdG8gd3JpdGUgdGhlIGJsb2NrcyB0byAqLworCXJlaXNlcmZzX2NsYWltX2Jsb2Nrc190b19iZV9hbGxvY2F0ZWQoaW5vZGUtPmlfc2IsIG51bV9wYWdlcyA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIGlub2RlLT5pX2Jsa2JpdHMpKTsKKwlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCisJaWYgKCAhbnVtX3BhZ2VzICkgeyAvKiBJZiB3ZSBkbyBub3QgaGF2ZSBlbm91Z2ggc3BhY2UgZXZlbiBmb3IgKi8KKwkgICAgcmVzID0gLUVOT1NQQzsgIC8qIHNpbmdsZSBwYWdlLCByZXR1cm4gLUVOT1NQQyAqLworCSAgICBpZiAoIHBvcyA+IChpbm9kZS0+aV9zaXplICYgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZS0xKSkpCisJCWJyZWFrOyAvLyBJbiBjYXNlIHdlIGFyZSB3cml0aW5nIHBhc3QgdGhlIGZpbGUgZW5kLCBicmVhay4KKwkgICAgLy8gT3RoZXJ3aXNlIHdlIGFyZSBwb3NzaWJseSBvdmVyd3JpdGluZyB0aGUgZmlsZSwgc28KKwkgICAgLy8gbGV0J3Mgc2V0IHdyaXRlIHNpemUgdG8gYmUgZXF1YWwgb3IgbGVzcyB0aGFuIGJsb2Nrc2l6ZS4KKwkgICAgLy8gVGhpcyB3YXkgd2UgZ2V0IGl0IGNvcnJlY3RseSBmb3IgZmlsZSBob2xlcy4KKwkgICAgLy8gQnV0IG92ZXJ3cml0aW5nIGZpbGVzIG9uIGFic29sdXRlbGx5IGZ1bGwgdm9sdW1lcyB3b3VsZCBub3QKKwkgICAgLy8gYmUgdmVyeSBlZmZpY2llbnQuIFdlbGwsIHBlb3BsZSBhcmUgbm90IHN1cHBvc2VkIHRvIGZpbGwKKwkgICAgLy8gMTAwJSBvZiBkaXNrIHNwYWNlIGFueXdheS4KKwkgICAgd3JpdGVfYnl0ZXMgPSBtaW5fdChzaXplX3QsIGNvdW50LCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAocG9zICYgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKSk7CisJICAgIG51bV9wYWdlcyA9IDE7CisJICAgIC8vIE5vIGJsb2NrcyB3ZXJlIGNsYWltZWQgYmVmb3JlLCBzbyBkbyBpdCBub3cuCisJICAgIHJlaXNlcmZzX2NsYWltX2Jsb2Nrc190b19iZV9hbGxvY2F0ZWQoaW5vZGUtPmlfc2IsIDEgPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBpbm9kZS0+aV9ibGtiaXRzKSk7CisJfQorCisJLyogUHJlcGFyZSBmb3Igd3JpdGluZyBpbnRvIHRoZSByZWdpb24sIHJlYWQgaW4gYWxsIHRoZQorCSAgIHBhcnRpYWxseSBvdmVyd3JpdHRlbiBwYWdlcywgaWYgbmVlZGVkLiBBbmQgbG9jayB0aGUgcGFnZXMsCisJICAgc28gdGhhdCBub2JvZHkgZWxzZSBjYW4gYWNjZXNzIHRoZXNlIHVudGlsIHdlIGFyZSBkb25lLgorCSAgIFdlIGdldCBudW1iZXIgb2YgYWN0dWFsIGJsb2NrcyBuZWVkZWQgYXMgYSByZXN1bHQuKi8KKwlibG9ja3NfdG9fYWxsb2NhdGUgPSByZWlzZXJmc19wcmVwYXJlX2ZpbGVfcmVnaW9uX2Zvcl93cml0ZShpbm9kZSwgcG9zLCBudW1fcGFnZXMsIHdyaXRlX2J5dGVzLCBwcmVwYXJlZF9wYWdlcyk7CisJaWYgKCBibG9ja3NfdG9fYWxsb2NhdGUgPCAwICkgeworCSAgICByZXMgPSBibG9ja3NfdG9fYWxsb2NhdGU7CisJICAgIHJlaXNlcmZzX3JlbGVhc2VfY2xhaW1lZF9ibG9ja3MoaW5vZGUtPmlfc2IsIG51bV9wYWdlcyA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIGlub2RlLT5pX2Jsa2JpdHMpKTsKKwkgICAgYnJlYWs7CisJfQorCisJLyogRmlyc3Qgd2UgY29ycmVjdCBvdXIgZXN0aW1hdGUgb2YgaG93IG1hbnkgYmxvY2tzIHdlIG5lZWQgKi8KKwlyZWlzZXJmc19yZWxlYXNlX2NsYWltZWRfYmxvY2tzKGlub2RlLT5pX3NiLCAobnVtX3BhZ2VzIDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpKSAtIGJsb2Nrc190b19hbGxvY2F0ZSApOworCisJaWYgKCBibG9ja3NfdG9fYWxsb2NhdGUgPiAwKSB7LypXZSBvbmx5IGFsbG9jYXRlIGJsb2NrcyBpZiB3ZSBuZWVkIHRvKi8KKwkgICAgLyogRmlsbCBpbiBhbGwgdGhlIHBvc3NpYmxlIGhvbGVzIGFuZCBhcHBlbmQgdGhlIGZpbGUgaWYgbmVlZGVkICovCisJICAgIHJlcyA9IHJlaXNlcmZzX2FsbG9jYXRlX2Jsb2Nrc19mb3JfcmVnaW9uKCZ0aCwgaW5vZGUsIHBvcywgbnVtX3BhZ2VzLCB3cml0ZV9ieXRlcywgcHJlcGFyZWRfcGFnZXMsIGJsb2Nrc190b19hbGxvY2F0ZSk7CisJfQorCisJLyogd2VsbCwgd2UgaGF2ZSBhbGxvY2F0ZWQgdGhlIGJsb2Nrcywgc28gaXQgaXMgdGltZSB0byBmcmVlCisJICAgdGhlIHJlc2VydmF0aW9uIHdlIG1hZGUgZWFybGllci4gKi8KKwlyZWlzZXJmc19yZWxlYXNlX2NsYWltZWRfYmxvY2tzKGlub2RlLT5pX3NiLCBibG9ja3NfdG9fYWxsb2NhdGUpOworCWlmICggcmVzICkgeworCSAgICByZWlzZXJmc191bnByZXBhcmVfcGFnZXMocHJlcGFyZWRfcGFnZXMsIG51bV9wYWdlcyk7CisJICAgIGJyZWFrOworCX0KKworLyogTk9URSB0aGF0IGFsbG9jYXRpbmcgYmxvY2tzIGFuZCBmaWxsaW5nIGJsb2NrcyBjYW4gYmUgZG9uZSBpbiByZXZlcnNlIG9yZGVyCisgICBhbmQgcHJvYmFibHkgd2Ugd291bGQgZG8gdGhhdCBqdXN0IHRvIGdldCByaWQgb2YgZ2FyYmFnZSBpbiBmaWxlcyBhZnRlciBhCisgICBjcmFzaCAqLworCisJLyogQ29weSBkYXRhIGZyb20gdXNlci1zdXBwbGllZCBidWZmZXIgdG8gZmlsZSdzIHBhZ2VzICovCisJcmVzID0gcmVpc2VyZnNfY29weV9mcm9tX3VzZXJfdG9fZmlsZV9yZWdpb24ocG9zLCBudW1fcGFnZXMsIHdyaXRlX2J5dGVzLCBwcmVwYXJlZF9wYWdlcywgYnVmKTsKKwlpZiAoIHJlcyApIHsKKwkgICAgcmVpc2VyZnNfdW5wcmVwYXJlX3BhZ2VzKHByZXBhcmVkX3BhZ2VzLCBudW1fcGFnZXMpOworCSAgICBicmVhazsKKwl9CisKKwkvKiBTZW5kIHRoZSBwYWdlcyB0byBkaXNrIGFuZCB1bmxvY2sgdGhlbS4gKi8KKwlyZXMgPSByZWlzZXJmc19zdWJtaXRfZmlsZV9yZWdpb25fZm9yX3dyaXRlKCZ0aCwgaW5vZGUsIHBvcywgbnVtX3BhZ2VzLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfYnl0ZXMscHJlcGFyZWRfcGFnZXMpOworCWlmICggcmVzICkKKwkgICAgYnJlYWs7CisKKwlhbHJlYWR5X3dyaXR0ZW4gKz0gd3JpdGVfYnl0ZXM7CisJYnVmICs9IHdyaXRlX2J5dGVzOworCSpwcG9zID0gcG9zICs9IHdyaXRlX2J5dGVzOworCWNvdW50IC09IHdyaXRlX2J5dGVzOworCWJhbGFuY2VfZGlydHlfcGFnZXNfcmF0ZWxpbWl0ZWQoaW5vZGUtPmlfbWFwcGluZyk7CisgICAgfQorCisgICAgLyogdGhpcyBpcyBvbmx5IHRydWUgb24gZXJyb3IgKi8KKyAgICBpZiAodGgudF90cmFuc19pZCkgeworICAgICAgICByZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKyAgICAgICAgZXJyID0gam91cm5hbF9lbmQoJnRoLCB0aC50X3N1cGVyLCB0aC50X2Jsb2Nrc19hbGxvY2F0ZWQpOworICAgICAgICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICByZXMgPSBlcnI7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoZmlsZS0+Zl9mbGFncyAmIE9fU1lOQykgfHwgSVNfU1lOQyhpbm9kZSkpCisJcmVzID0gZ2VuZXJpY19vc3luY19pbm9kZShpbm9kZSwgZmlsZS0+Zl9tYXBwaW5nLCBPU1lOQ19NRVRBREFUQXxPU1lOQ19EQVRBKTsKKworICAgIHVwKCZpbm9kZS0+aV9zZW0pOworICAgIHJlaXNlcmZzX2FzeW5jX3Byb2dyZXNzX3dhaXQoaW5vZGUtPmlfc2IpOworICAgIHJldHVybiAoYWxyZWFkeV93cml0dGVuICE9IDApP2FscmVhZHlfd3JpdHRlbjpyZXM7CisKK291dDoKKyAgICB1cCgmaW5vZGUtPmlfc2VtKTsgLy8gdW5sb2NrIHRoZSBmaWxlIG9uIGV4aXQuCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIHNzaXplX3QgcmVpc2VyZnNfYWlvX3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCBwb3MpCit7CisgICAgcmV0dXJuIGdlbmVyaWNfZmlsZV9haW9fd3JpdGUoaW9jYiwgYnVmLCBjb3VudCwgcG9zKTsKK30KKworCisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmVpc2VyZnNfZmlsZV9vcGVyYXRpb25zID0geworICAgIC5yZWFkCT0gZ2VuZXJpY19maWxlX3JlYWQsCisgICAgLndyaXRlCT0gcmVpc2VyZnNfZmlsZV93cml0ZSwKKyAgICAuaW9jdGwJPSByZWlzZXJmc19pb2N0bCwKKyAgICAubW1hcAk9IGdlbmVyaWNfZmlsZV9tbWFwLAorICAgIC5yZWxlYXNlCT0gcmVpc2VyZnNfZmlsZV9yZWxlYXNlLAorICAgIC5mc3luYwk9IHJlaXNlcmZzX3N5bmNfZmlsZSwKKyAgICAuc2VuZGZpbGUJPSBnZW5lcmljX2ZpbGVfc2VuZGZpbGUsCisgICAgLmFpb19yZWFkICAgPSBnZW5lcmljX2ZpbGVfYWlvX3JlYWQsCisgICAgLmFpb193cml0ZSAgPSByZWlzZXJmc19haW9fd3JpdGUsCit9OworCisKK3N0cnVjdCAgaW5vZGVfb3BlcmF0aW9ucyByZWlzZXJmc19maWxlX2lub2RlX29wZXJhdGlvbnMgPSB7CisgICAgLnRydW5jYXRlCT0gcmVpc2VyZnNfdmZzX3RydW5jYXRlX2ZpbGUsCisgICAgLnNldGF0dHIgICAgPSByZWlzZXJmc19zZXRhdHRyLAorICAgIC5zZXR4YXR0ciAgID0gcmVpc2VyZnNfc2V0eGF0dHIsCisgICAgLmdldHhhdHRyICAgPSByZWlzZXJmc19nZXR4YXR0ciwKKyAgICAubGlzdHhhdHRyICA9IHJlaXNlcmZzX2xpc3R4YXR0ciwKKyAgICAucmVtb3ZleGF0dHIgPSByZWlzZXJmc19yZW1vdmV4YXR0ciwKKyAgICAucGVybWlzc2lvbiA9IHJlaXNlcmZzX3Blcm1pc3Npb24sCit9OworCisKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2ZpeF9ub2RlLmMgYi9mcy9yZWlzZXJmcy9maXhfbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZjY0YmUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9yZWlzZXJmcy9maXhfbm9kZS5jCkBAIC0wLDAgKzEsMjUxOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAwIGJ5IEhhbnMgUmVpc2VyLCBsaWNlbnNpbmcgZ292ZXJuZWQgYnkgcmVpc2VyZnMvUkVBRE1FCisgKi8KKworLyoqCisgKiogb2xkX2l0ZW1fbnVtCisgKiogb2xkX2VudHJ5X251bQorICoqIHNldF9lbnRyeV9zaXplcworICoqIGNyZWF0ZV92aXJ0dWFsX25vZGUKKyAqKiBjaGVja19sZWZ0CisgKiogY2hlY2tfcmlnaHQKKyAqKiBkaXJlY3RvcnlfcGFydF9zaXplCisgKiogZ2V0X251bV92ZXIKKyAqKiBzZXRfcGFyYW1ldGVycworICoqIGlzX2xlYWZfcmVtb3ZhYmxlCisgKiogYXJlX2xlYXZlc19yZW1vdmFibGUKKyAqKiBnZXRfZW1wdHlfbm9kZXMKKyAqKiBnZXRfbGZyZWUKKyAqKiBnZXRfcmZyZWUKKyAqKiBpc19sZWZ0X25laWdoYm9yX2luX2NhY2hlCisgKiogZGVjcmVtZW50X2tleQorICoqIGdldF9mYXJfcGFyZW50CisgKiogZ2V0X3BhcmVudHMKKyAqKiBjYW5fbm9kZV9iZV9yZW1vdmVkCisgKiogaXBfY2hlY2tfYmFsYW5jZQorICoqIGRjX2NoZWNrX2JhbGFuY2VfaW50ZXJuYWwKKyAqKiBkY19jaGVja19iYWxhbmNlX2xlYWYKKyAqKiBkY19jaGVja19iYWxhbmNlCisgKiogY2hlY2tfYmFsYW5jZQorICoqIGdldF9kaXJlY3RfcGFyZW50CisgKiogZ2V0X25laWdoYm9ycworICoqIGZpeF9ub2RlcworICoqIAorICoqIAorICoqLworCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorCisKKy8qIFRvIG1ha2UgYW55IGNoYW5nZXMgaW4gdGhlIHRyZWUgd2UgZmluZCBhIG5vZGUsIHRoYXQgY29udGFpbnMgaXRlbQorICAgdG8gYmUgY2hhbmdlZC9kZWxldGVkIG9yIHBvc2l0aW9uIGluIHRoZSBub2RlIHdlIGluc2VydCBhIG5ldyBpdGVtCisgICB0by4gV2UgY2FsbCB0aGlzIG5vZGUgUy4gVG8gZG8gYmFsYW5jaW5nIHdlIG5lZWQgdG8gZGVjaWRlIHdoYXQgd2UKKyAgIHdpbGwgc2hpZnQgdG8gbGVmdC9yaWdodCBuZWlnaGJvciwgb3IgdG8gYSBuZXcgbm9kZSwgd2hlcmUgbmV3IGl0ZW0KKyAgIHdpbGwgYmUgZXRjLiBUbyBtYWtlIHRoaXMgYW5hbHlzaXMgc2ltcGxlciB3ZSBidWlsZCB2aXJ0dWFsCisgICBub2RlLiBWaXJ0dWFsIG5vZGUgaXMgYW4gYXJyYXkgb2YgaXRlbXMsIHRoYXQgd2lsbCByZXBsYWNlIGl0ZW1zIG9mCisgICBub2RlIFMuIChGb3IgaW5zdGFuY2UgaWYgd2UgYXJlIGdvaW5nIHRvIGRlbGV0ZSBhbiBpdGVtLCB2aXJ0dWFsCisgICBub2RlIGRvZXMgbm90IGNvbnRhaW4gaXQpLiBWaXJ0dWFsIG5vZGUga2VlcHMgaW5mb3JtYXRpb24gYWJvdXQKKyAgIGl0ZW0gc2l6ZXMgYW5kIHR5cGVzLCBtZXJnZWFiaWxpdHkgb2YgZmlyc3QgYW5kIGxhc3QgaXRlbXMsIHNpemVzCisgICBvZiBhbGwgZW50cmllcyBpbiBkaXJlY3RvcnkgaXRlbS4gV2UgdXNlIHRoaXMgYXJyYXkgb2YgaXRlbXMgd2hlbgorICAgY2FsY3VsYXRpbmcgd2hhdCB3ZSBjYW4gc2hpZnQgdG8gbmVpZ2hib3JzIGFuZCBob3cgbWFueSBub2RlcyB3ZQorICAgaGF2ZSB0byBoYXZlIGlmIHdlIGRvIG5vdCBhbnkgc2hpZnRpbmdzLCBpZiB3ZSBzaGlmdCB0byBsZWZ0L3JpZ2h0CisgICBuZWlnaGJvciBvciB0byBib3RoLiAqLworCisKKy8qIHRha2luZyBpdGVtIG51bWJlciBpbiB2aXJ0dWFsIG5vZGUsIHJldHVybnMgbnVtYmVyIG9mIGl0ZW0sIHRoYXQgaXQgaGFzIGluIHNvdXJjZSBidWZmZXIgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG9sZF9pdGVtX251bSAoaW50IG5ld19udW0sIGludCBhZmZlY3RlZF9pdGVtX251bSwgaW50IG1vZGUpCit7CisgIGlmIChtb2RlID09IE1fUEFTVEUgfHwgbW9kZSA9PSBNX0NVVCB8fCBuZXdfbnVtIDwgYWZmZWN0ZWRfaXRlbV9udW0pCisgICAgcmV0dXJuIG5ld19udW07CisKKyAgaWYgKG1vZGUgPT0gTV9JTlNFUlQpIHsKKworICAgIFJGQUxTRSggbmV3X251bSA9PSAwLCAKKwkgICAgInZzLTgwMDU6IGZvciBJTlNFUlQgbW9kZSBhbmQgaXRlbSBudW1iZXIgb2YgaW5zZXJ0ZWQgaXRlbSIpOworCisgICAgcmV0dXJuIG5ld19udW0gLSAxOworICB9CisKKyAgUkZBTFNFKCBtb2RlICE9IE1fREVMRVRFLAorCSAgInZzLTgwMTA6IG9sZF9pdGVtX251bTogbW9kZSBtdXN0IGJlIE1fREVMRVRFIChtb2RlID0gXCclY1wnIiwgbW9kZSk7CisgIC8qIGRlbGV0ZSBtb2RlICovCisgIHJldHVybiBuZXdfbnVtICsgMTsKK30KKworc3RhdGljIHZvaWQgY3JlYXRlX3ZpcnR1YWxfbm9kZSAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgaCkKK3sKKyAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWg7CisgICAgc3RydWN0IHZpcnR1YWxfbm9kZSAqIHZuID0gdGItPnRiX3ZuOworICAgIGludCBuZXdfbnVtOworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIFNoOwkvKiB0aGlzIGNvbWVzIGZyb20gdGItPlNbaF0gKi8KKworICAgIFNoID0gUEFUSF9IX1BCVUZGRVIgKHRiLT50Yl9wYXRoLCBoKTsKKworICAgIC8qIHNpemUgb2YgY2hhbmdlZCBub2RlICovCisgICAgdm4tPnZuX3NpemUgPSBNQVhfQ0hJTERfU0laRSAoU2gpIC0gQl9GUkVFX1NQQUNFIChTaCkgKyB0Yi0+aW5zZXJ0X3NpemVbaF07CisKKyAgICAvKiBmb3IgaW50ZXJuYWwgbm9kZXMgYXJyYXkgaWYgdmlydHVhbCBpdGVtcyBpcyBub3QgY3JlYXRlZCAqLworICAgIGlmIChoKSB7CisJdm4tPnZuX25yX2l0ZW0gPSAodm4tPnZuX3NpemUgLSBEQ19TSVpFKSAvIChEQ19TSVpFICsgS0VZX1NJWkUpOworCXJldHVybjsKKyAgICB9CisKKyAgICAvKiBudW1iZXIgb2YgaXRlbXMgaW4gdmlydHVhbCBub2RlICAqLworICAgIHZuLT52bl9ucl9pdGVtID0gQl9OUl9JVEVNUyAoU2gpICsgKCh2bi0+dm5fbW9kZSA9PSBNX0lOU0VSVCk/IDEgOiAwKSAtICgodm4tPnZuX21vZGUgPT0gTV9ERUxFVEUpPyAxIDogMCk7CisKKyAgICAvKiBmaXJzdCB2aXJ0dWFsIGl0ZW0gKi8KKyAgICB2bi0+dm5fdmkgPSAoc3RydWN0IHZpcnR1YWxfaXRlbSAqKSh0Yi0+dGJfdm4gKyAxKTsKKyAgICBtZW1zZXQgKHZuLT52bl92aSwgMCwgdm4tPnZuX25yX2l0ZW0gKiBzaXplb2YgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0pKTsKKyAgICB2bi0+dm5fZnJlZV9wdHIgKz0gdm4tPnZuX25yX2l0ZW0gKiBzaXplb2YgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0pOworCisKKyAgICAvKiBmaXJzdCBpdGVtIGluIHRoZSBub2RlICovCisgICAgaWggPSBCX05fUElURU1fSEVBRCAoU2gsIDApOworCisgICAgLyogZGVmaW5lIHRoZSBtZXJnZWFiaWxpdHkgZm9yIDAtdGggaXRlbSAoaWYgaXQgaXMgbm90IGJlaW5nIGRlbGV0ZWQpICovCisgICAgaWYgKG9wX2lzX2xlZnRfbWVyZ2VhYmxlICgmKGloLT5paF9rZXkpLCBTaC0+Yl9zaXplKSAmJiAodm4tPnZuX21vZGUgIT0gTV9ERUxFVEUgfHwgdm4tPnZuX2FmZmVjdGVkX2l0ZW1fbnVtKSkKKwkgICAgdm4tPnZuX3ZpWzBdLnZpX3R5cGUgfD0gVklfVFlQRV9MRUZUX01FUkdFQUJMRTsKKworICAgIC8qIGdvIHRocm91Z2ggYWxsIGl0ZW1zIHRob3NlIHJlbWFpbiBpbiB0aGUgdmlydHVhbCBub2RlIChleGNlcHQgZm9yIHRoZSBuZXcgKGluc2VydGVkKSBvbmUpICovCisgICAgZm9yIChuZXdfbnVtID0gMDsgbmV3X251bSA8IHZuLT52bl9ucl9pdGVtOyBuZXdfbnVtICsrKSB7CisJaW50IGo7CisJc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpID0gdm4tPnZuX3ZpICsgbmV3X251bTsKKwlpbnQgaXNfYWZmZWN0ZWQgPSAoKG5ld19udW0gIT0gdm4tPnZuX2FmZmVjdGVkX2l0ZW1fbnVtKSA/IDAgOiAxKTsKKyAgICAKKworCWlmIChpc19hZmZlY3RlZCAmJiB2bi0+dm5fbW9kZSA9PSBNX0lOU0VSVCkKKwkgICAgY29udGludWU7CisgICAgCisJLyogZ2V0IGl0ZW0gbnVtYmVyIGluIHNvdXJjZSBub2RlICovCisJaiA9IG9sZF9pdGVtX251bSAobmV3X251bSwgdm4tPnZuX2FmZmVjdGVkX2l0ZW1fbnVtLCB2bi0+dm5fbW9kZSk7CisgICAgCisJdmktPnZpX2l0ZW1fbGVuICs9IGloX2l0ZW1fbGVuKGloICsgaikgKyBJSF9TSVpFOworCXZpLT52aV9paCA9IGloICsgajsKKwl2aS0+dmlfaXRlbSA9IEJfSV9QSVRFTSAoU2gsIGloICsgaik7CisJdmktPnZpX3VhcmVhID0gdm4tPnZuX2ZyZWVfcHRyOworCisJLy8gRklYTUU6IHRoZXJlIGlzIG5vIGNoZWNrLCB0aGF0IGl0ZW0gb3BlcmF0aW9uIGRpZCBub3QKKwkvLyBjb25zdW1lIHRvbyBtdWNoIG1lbW9yeQorCXZuLT52bl9mcmVlX3B0ciArPSBvcF9jcmVhdGVfdmkgKHZuLCB2aSwgaXNfYWZmZWN0ZWQsIHRiLT5pbnNlcnRfc2l6ZSBbMF0pOworCWlmICh0Yi0+dm5fYnVmICsgdGItPnZuX2J1Zl9zaXplIDwgdm4tPnZuX2ZyZWVfcHRyKQorCSAgICByZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAidnMtODAzMDogY3JlYXRlX3ZpcnR1YWxfbm9kZTogIgorCQkJICAgICJ2aXJ0dWFsIG5vZGUgc3BhY2UgY29uc3VtZWQiKTsKKworCWlmICghaXNfYWZmZWN0ZWQpCisJICAgIC8qIHRoaXMgaXMgbm90IGJlaW5nIGNoYW5nZWQgKi8KKwkgICAgY29udGludWU7CisgICAgCisJaWYgKHZuLT52bl9tb2RlID09IE1fUEFTVEUgfHwgdm4tPnZuX21vZGUgPT0gTV9DVVQpIHsKKwkgICAgdm4tPnZuX3ZpW25ld19udW1dLnZpX2l0ZW1fbGVuICs9IHRiLT5pbnNlcnRfc2l6ZVswXTsKKwkgICAgdmktPnZpX25ld19kYXRhID0gdm4tPnZuX2RhdGE7IC8vIHBvaW50ZXIgdG8gZGF0YSB3aGljaCBpcyBnb2luZyB0byBiZSBwYXN0ZWQKKwl9CisgICAgfQorCisgIAorICAgIC8qIHZpcnR1YWwgaW5zZXJ0ZWQgaXRlbSBpcyBub3QgZGVmaW5lZCB5ZXQgKi8KKyAgICBpZiAodm4tPnZuX21vZGUgPT0gTV9JTlNFUlQpIHsKKwlzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmkgPSB2bi0+dm5fdmkgKyB2bi0+dm5fYWZmZWN0ZWRfaXRlbV9udW07CisgICAgICAKKwlSRkFMU0UoIHZuLT52bl9pbnNfaWggPT0gMCwKKwkJInZzLTgwNDA6IGl0ZW0gaGVhZGVyIG9mIGluc2VydGVkIGl0ZW0gaXMgbm90IHNwZWNpZmllZCIpOworCXZpLT52aV9pdGVtX2xlbiA9IHRiLT5pbnNlcnRfc2l6ZVswXTsKKwl2aS0+dmlfaWggPSB2bi0+dm5faW5zX2loOworCXZpLT52aV9pdGVtID0gdm4tPnZuX2RhdGE7CisJdmktPnZpX3VhcmVhID0gdm4tPnZuX2ZyZWVfcHRyOworCQorCW9wX2NyZWF0ZV92aSAodm4sIHZpLCAwLypub3QgcGFzdGVkIG9yIGN1dCovLCB0Yi0+aW5zZXJ0X3NpemUgWzBdKTsKKyAgICB9CisgIAorICAgIC8qIHNldCByaWdodCBtZXJnZSBmbGFnIHdlIHRha2UgcmlnaHQgZGVsaW1pdGluZyBrZXkgYW5kIGNoZWNrIHdoZXRoZXIgaXQgaXMgYSBtZXJnZWFibGUgaXRlbSAqLworICAgIGlmICh0Yi0+Q0ZSWzBdKSB7CisJc3RydWN0IHJlaXNlcmZzX2tleSAqIGtleTsKKworCWtleSA9IEJfTl9QREVMSU1fS0VZICh0Yi0+Q0ZSWzBdLCB0Yi0+cmtleVswXSk7CisJaWYgKG9wX2lzX2xlZnRfbWVyZ2VhYmxlIChrZXksIFNoLT5iX3NpemUpICYmICh2bi0+dm5fbW9kZSAhPSBNX0RFTEVURSB8fAorCQkJCQkJICAgICAgIHZuLT52bl9hZmZlY3RlZF9pdGVtX251bSAhPSBCX05SX0lURU1TIChTaCkgLSAxKSkKKwkJdm4tPnZuX3ZpW3ZuLT52bl9ucl9pdGVtLTFdLnZpX3R5cGUgfD0gVklfVFlQRV9SSUdIVF9NRVJHRUFCTEU7CisKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKwlpZiAob3BfaXNfbGVmdF9tZXJnZWFibGUgKGtleSwgU2gtPmJfc2l6ZSkgJiYKKwkgICAgISh2bi0+dm5fbW9kZSAhPSBNX0RFTEVURSB8fCB2bi0+dm5fYWZmZWN0ZWRfaXRlbV9udW0gIT0gQl9OUl9JVEVNUyAoU2gpIC0gMSkgKSB7CisJICAgIC8qIHdlIGRlbGV0ZSBsYXN0IGl0ZW0gYW5kIGl0IGNvdWxkIGJlIG1lcmdlZCB3aXRoIHJpZ2h0IG5laWdoYm9yJ3MgZmlyc3QgaXRlbSAqLworCSAgICBpZiAoIShCX05SX0lURU1TIChTaCkgPT0gMSAmJiBpc19kaXJlbnRyeV9sZV9paCAoQl9OX1BJVEVNX0hFQUQgKFNoLCAwKSkgJiYKKwkJICBJX0VOVFJZX0NPVU5UIChCX05fUElURU1fSEVBRCAoU2gsIDApKSA9PSAxKSkgeworCQkvKiBub2RlIGNvbnRhaW5zIG1vcmUgdGhhbiAxIGl0ZW0sIG9yIGl0ZW0gaXMgbm90IGRpcmVjdG9yeSBpdGVtLCBvciB0aGlzIGl0ZW0gY29udGFpbnMgbW9yZSB0aGFuIDEgZW50cnkgKi8KKwkJcHJpbnRfYmxvY2sgKFNoLCAwLCAtMSwgLTEpOworCQlyZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAidnMtODA0NTogY3JlYXRlX3ZpcnR1YWxfbm9kZTogcmRrZXkgJWssIGFmZmVjdGVkIGl0ZW09PSVkIChtb2RlPT0lYykgTXVzdCBiZSAlYyIsIAorCQkJCWtleSwgdm4tPnZuX2FmZmVjdGVkX2l0ZW1fbnVtLCB2bi0+dm5fbW9kZSwgTV9ERUxFVEUpOworCSAgICB9IGVsc2UKKwkJLyogd2UgY2FuIGRlbGV0ZSBkaXJlY3RvcnkgaXRlbSwgdGhhdCBoYXMgb25seSBvbmUgZGlyZWN0b3J5IGVudHJ5IGluIGl0ICovCisJCTsKKwl9CisjZW5kaWYKKyAgICAKKyAgICB9Cit9CisKKworLyogdXNpbmcgdmlydHVhbCBub2RlIGNoZWNrLCBob3cgbWFueSBpdGVtcyBjYW4gYmUgc2hpZnRlZCB0byBsZWZ0CisgICBuZWlnaGJvciAqLworc3RhdGljIHZvaWQgY2hlY2tfbGVmdCAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgaCwgaW50IGN1cl9mcmVlKQoreworICAgIGludCBpOworICAgIHN0cnVjdCB2aXJ0dWFsX25vZGUgKiB2biA9IHRiLT50Yl92bjsKKyAgICBzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmk7CisgICAgaW50IGRfc2l6ZSwgaWhfc2l6ZTsKKworICAgIFJGQUxTRSggY3VyX2ZyZWUgPCAwLCAidnMtODA1MDogY3VyX2ZyZWUgKCVkKSA8IDAiLCBjdXJfZnJlZSk7CisKKyAgICAvKiBpbnRlcm5hbCBsZXZlbCAqLworICAgIGlmIChoID4gMCkgewkKKwl0Yi0+bG51bVtoXSA9IGN1cl9mcmVlIC8gKERDX1NJWkUgKyBLRVlfU0laRSk7CisJcmV0dXJuOworICAgIH0KKworICAgIC8qIGxlYWYgbGV2ZWwgKi8KKworICAgIGlmICghY3VyX2ZyZWUgfHwgIXZuLT52bl9ucl9pdGVtKSB7CisJLyogbm8gZnJlZSBzcGFjZSBvciBub3RoaW5nIHRvIG1vdmUgKi8KKwl0Yi0+bG51bVtoXSA9IDA7CisJdGItPmxieXRlcyA9IC0xOworCXJldHVybjsKKyAgICB9CisKKyAgICBSRkFMU0UoICFQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIDApLAorCSAgICAidnMtODA1NTogcGFyZW50IGRvZXMgbm90IGV4aXN0IG9yIGludmFsaWQiKTsKKworICAgIHZpID0gdm4tPnZuX3ZpOworICAgIGlmICgodW5zaWduZWQgaW50KWN1cl9mcmVlID49ICh2bi0+dm5fc2l6ZSAtICgodmktPnZpX3R5cGUgJiBWSV9UWVBFX0xFRlRfTUVSR0VBQkxFKSA/IElIX1NJWkUgOiAwKSkpIHsKKwkvKiBhbGwgY29udGVudHMgb2YgU1swXSBmaXRzIGludG8gTFswXSAqLworCisJUkZBTFNFKCB2bi0+dm5fbW9kZSA9PSBNX0lOU0VSVCB8fCB2bi0+dm5fbW9kZSA9PSBNX1BBU1RFLAorCQkidnMtODA1NTogaW52YWxpZCBtb2RlIG9yIGJhbGFuY2UgY29uZGl0aW9uIGZhaWxlZCIpOworCisJdGItPmxudW1bMF0gPSB2bi0+dm5fbnJfaXRlbTsKKwl0Yi0+bGJ5dGVzID0gLTE7CisJcmV0dXJuOworICAgIH0KKyAgCisKKyAgICBkX3NpemUgPSAwLCBpaF9zaXplID0gSUhfU0laRTsKKworICAgIC8qIGZpcnN0IGl0ZW0gbWF5IGJlIG1lcmdlIHdpdGggbGFzdCBpdGVtIGluIGxlZnQgbmVpZ2hib3IgKi8KKyAgICBpZiAodmktPnZpX3R5cGUgJiBWSV9UWVBFX0xFRlRfTUVSR0VBQkxFKQorCWRfc2l6ZSA9IC0oKGludClJSF9TSVpFKSwgaWhfc2l6ZSA9IDA7CisKKyAgICB0Yi0+bG51bVswXSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IHZuLT52bl9ucl9pdGVtOyBpICsrLCBpaF9zaXplID0gSUhfU0laRSwgZF9zaXplID0gMCwgdmkgKyspIHsKKwlkX3NpemUgKz0gdmktPnZpX2l0ZW1fbGVuOworCWlmIChjdXJfZnJlZSA+PSBkX3NpemUpIHsJCisJICAgIC8qIHRoZSBpdGVtIGNhbiBiZSBzaGlmdGVkIGVudGlyZWx5ICovCisJICAgIGN1cl9mcmVlIC09IGRfc2l6ZTsKKwkgICAgdGItPmxudW1bMF0gKys7CisJICAgIGNvbnRpbnVlOworCX0KKyAgICAgIAorCS8qIHRoZSBpdGVtIGNhbm5vdCBiZSBzaGlmdGVkIGVudGlyZWx5LCB0cnkgdG8gc3BsaXQgaXQgKi8KKwkvKiBjaGVjayB3aGV0aGVyIExbMF0gY2FuIGhvbGQgaWggYW5kIGF0IGxlYXN0IG9uZSBieXRlIG9mIHRoZSBpdGVtIGJvZHkgKi8KKwlpZiAoY3VyX2ZyZWUgPD0gaWhfc2l6ZSkgeworCSAgICAvKiBjYW5ub3Qgc2hpZnQgZXZlbiBhIHBhcnQgb2YgdGhlIGN1cnJlbnQgaXRlbSAqLworCSAgICB0Yi0+bGJ5dGVzID0gLTE7CisJICAgIHJldHVybjsKKwl9CisJY3VyX2ZyZWUgLT0gaWhfc2l6ZTsKKyAgICAKKwl0Yi0+bGJ5dGVzID0gb3BfY2hlY2tfbGVmdCAodmksIGN1cl9mcmVlLCAwLCAwKTsKKwlpZiAodGItPmxieXRlcyAhPSAtMSkKKwkgICAgLyogY291bnQgcGFydGlhbGx5IHNoaWZ0ZWQgaXRlbSAqLworCSAgICB0Yi0+bG51bVswXSArKzsKKyAgICAKKwlicmVhazsKKyAgICB9CisgIAorICAgIHJldHVybjsKK30KKworCisvKiB1c2luZyB2aXJ0dWFsIG5vZGUgY2hlY2ssIGhvdyBtYW55IGl0ZW1zIGNhbiBiZSBzaGlmdGVkIHRvIHJpZ2h0CisgICBuZWlnaGJvciAqLworc3RhdGljIHZvaWQgY2hlY2tfcmlnaHQgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IGgsIGludCBjdXJfZnJlZSkKK3sKKyAgICBpbnQgaTsKKyAgICBzdHJ1Y3QgdmlydHVhbF9ub2RlICogdm4gPSB0Yi0+dGJfdm47CisgICAgc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpOworICAgIGludCBkX3NpemUsIGloX3NpemU7CisKKyAgICBSRkFMU0UoIGN1cl9mcmVlIDwgMCwgInZzLTgwNzA6IGN1cl9mcmVlIDwgMCIpOworICAgIAorICAgIC8qIGludGVybmFsIGxldmVsICovCisgICAgaWYgKGggPiAwKSB7CisJdGItPnJudW1baF0gPSBjdXJfZnJlZSAvIChEQ19TSVpFICsgS0VZX1NJWkUpOworCXJldHVybjsKKyAgICB9CisgICAgCisgICAgLyogbGVhZiBsZXZlbCAqLworICAgIAorICAgIGlmICghY3VyX2ZyZWUgfHwgIXZuLT52bl9ucl9pdGVtKSB7CisJLyogbm8gZnJlZSBzcGFjZSAgKi8KKwl0Yi0+cm51bVtoXSA9IDA7CisJdGItPnJieXRlcyA9IC0xOworCXJldHVybjsKKyAgICB9CisgIAorICAgIFJGQUxTRSggIVBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgMCksCisJICAgICJ2cy04MDc1OiBwYXJlbnQgZG9lcyBub3QgZXhpc3Qgb3IgaW52YWxpZCIpOworICAKKyAgICB2aSA9IHZuLT52bl92aSArIHZuLT52bl9ucl9pdGVtIC0gMTsKKyAgICBpZiAoKHVuc2lnbmVkIGludCljdXJfZnJlZSA+PSAodm4tPnZuX3NpemUgLSAoKHZpLT52aV90eXBlICYgVklfVFlQRV9SSUdIVF9NRVJHRUFCTEUpID8gSUhfU0laRSA6IDApKSkgeworCS8qIGFsbCBjb250ZW50cyBvZiBTWzBdIGZpdHMgaW50byBSWzBdICovCisJCisJUkZBTFNFKCB2bi0+dm5fbW9kZSA9PSBNX0lOU0VSVCB8fCB2bi0+dm5fbW9kZSA9PSBNX1BBU1RFLAorCQkidnMtODA4MDogaW52YWxpZCBtb2RlIG9yIGJhbGFuY2UgY29uZGl0aW9uIGZhaWxlZCIpOworCisJdGItPnJudW1baF0gPSB2bi0+dm5fbnJfaXRlbTsKKwl0Yi0+cmJ5dGVzID0gLTE7CisJcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBkX3NpemUgPSAwLCBpaF9zaXplID0gSUhfU0laRTsKKyAgICAKKyAgICAvKiBsYXN0IGl0ZW0gbWF5IGJlIG1lcmdlIHdpdGggZmlyc3QgaXRlbSBpbiByaWdodCBuZWlnaGJvciAqLworICAgIGlmICh2aS0+dmlfdHlwZSAmIFZJX1RZUEVfUklHSFRfTUVSR0VBQkxFKQorCWRfc2l6ZSA9IC0oaW50KUlIX1NJWkUsIGloX3NpemUgPSAwOworCisgICAgdGItPnJudW1bMF0gPSAwOworICAgIGZvciAoaSA9IHZuLT52bl9ucl9pdGVtIC0gMTsgaSA+PSAwOyBpIC0tLCBkX3NpemUgPSAwLCBpaF9zaXplID0gSUhfU0laRSwgdmkgLS0pIHsKKwlkX3NpemUgKz0gdmktPnZpX2l0ZW1fbGVuOworCWlmIChjdXJfZnJlZSA+PSBkX3NpemUpIHsJCisJICAgIC8qIHRoZSBpdGVtIGNhbiBiZSBzaGlmdGVkIGVudGlyZWx5ICovCisJICAgIGN1cl9mcmVlIC09IGRfc2l6ZTsKKwkgICAgdGItPnJudW1bMF0gKys7CisJICAgIGNvbnRpbnVlOworCX0KKwkKKwkvKiBjaGVjayB3aGV0aGVyIFJbMF0gY2FuIGhvbGQgaWggYW5kIGF0IGxlYXN0IG9uZSBieXRlIG9mIHRoZSBpdGVtIGJvZHkgKi8KKwlpZiAoIGN1cl9mcmVlIDw9IGloX3NpemUgKSB7ICAgIC8qIGNhbm5vdCBzaGlmdCBldmVuIGEgcGFydCBvZiB0aGUgY3VycmVudCBpdGVtICovCisJICAgIHRiLT5yYnl0ZXMgPSAtMTsKKwkgICAgcmV0dXJuOworCX0KKwkKKwkvKiBSWzBdIGNhbiBob2xkIHRoZSBoZWFkZXIgb2YgdGhlIGl0ZW0gYW5kIGF0IGxlYXN0IG9uZSBieXRlIG9mIGl0cyBib2R5ICovCisJY3VyX2ZyZWUgLT0gaWhfc2l6ZTsJLyogY3VyX2ZyZWUgaXMgc3RpbGwgPiAwICovCisKKwl0Yi0+cmJ5dGVzID0gb3BfY2hlY2tfcmlnaHQgKHZpLCBjdXJfZnJlZSk7CisJaWYgKHRiLT5yYnl0ZXMgIT0gLTEpCisJICAgIC8qIGNvdW50IHBhcnRpYWxseSBzaGlmdGVkIGl0ZW0gKi8KKwkgICAgdGItPnJudW1bMF0gKys7CisgICAgCisJYnJlYWs7CisgICAgfQorCQorICByZXR1cm47Cit9CisKKworLyoKKyAqIGZyb20gLSBudW1iZXIgb2YgaXRlbXMsIHdoaWNoIGFyZSBzaGlmdGVkIHRvIGxlZnQgbmVpZ2hib3IgZW50aXJlbHkKKyAqIHRvIC0gbnVtYmVyIG9mIGl0ZW0sIHdoaWNoIGFyZSBzaGlmdGVkIHRvIHJpZ2h0IG5laWdoYm9yIGVudGlyZWx5CisgKiBmcm9tX2J5dGVzIC0gbnVtYmVyIG9mIGJ5dGVzIG9mIGJvdW5kYXJ5IGl0ZW0gKG9yIGRpcmVjdG9yeSBlbnRyaWVzKSB3aGljaCBhcmUgc2hpZnRlZCB0byBsZWZ0IG5laWdoYm9yCisgKiB0b19ieXRlcyAtIG51bWJlciBvZiBieXRlcyBvZiBib3VuZGFyeSBpdGVtIChvciBkaXJlY3RvcnkgZW50cmllcykgd2hpY2ggYXJlIHNoaWZ0ZWQgdG8gcmlnaHQgbmVpZ2hib3IgKi8KK3N0YXRpYyBpbnQgZ2V0X251bV92ZXIgKGludCBtb2RlLCBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIGludCBoLAorCQkJaW50IGZyb20sIGludCBmcm9tX2J5dGVzLAorCQkJaW50IHRvLCAgIGludCB0b19ieXRlcywKKwkJCXNob3J0ICogc251bTAxMiwgaW50IGZsb3cKKyAgICApCit7CisgICAgaW50IGk7CisgICAgaW50IGN1cl9mcmVlOworICAgIC8vICAgIGludCBieXRlczsKKyAgICBpbnQgdW5pdHM7CisgICAgc3RydWN0IHZpcnR1YWxfbm9kZSAqIHZuID0gdGItPnRiX3ZuOworICAgIC8vICAgIHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aTsKKworICAgIGludCB0b3RhbF9ub2RlX3NpemUsIG1heF9ub2RlX3NpemUsIGN1cnJlbnRfaXRlbV9zaXplOworICAgIGludCBuZWVkZWRfbm9kZXM7CisgICAgaW50IHN0YXJ0X2l0ZW0sIAkvKiBwb3NpdGlvbiBvZiBpdGVtIHdlIHN0YXJ0IGZpbGxpbmcgbm9kZSBmcm9tICovCisJZW5kX2l0ZW0sCS8qIHBvc2l0aW9uIG9mIGl0ZW0gd2UgZmluaXNoIGZpbGxpbmcgbm9kZSBieSAqLworCXN0YXJ0X2J5dGVzLC8qIG51bWJlciBvZiBmaXJzdCBieXRlcyAoZW50cmllcyBmb3IgZGlyZWN0b3J5KSBvZiBzdGFydF9pdGVtLXRoIGl0ZW0gCisJCSAgICAgICB3ZSBkbyBub3QgaW5jbHVkZSBpbnRvIG5vZGUgdGhhdCBpcyBiZWluZyBmaWxsZWQgKi8KKwllbmRfYnl0ZXM7CS8qIG51bWJlciBvZiBsYXN0IGJ5dGVzIChlbnRyaWVzIGZvciBkaXJlY3RvcnkpIG9mIGVuZF9pdGVtLXRoIGl0ZW0gCisJCQkgICB3ZSBkbyBub2RlIGluY2x1ZGUgaW50byBub2RlIHRoYXQgaXMgYmVpbmcgZmlsbGVkICovCisgICAgaW50IHNwbGl0X2l0ZW1fcG9zaXRpb25zWzJdOyAvKiB0aGVzZSBhcmUgcG9zaXRpb25zIGluIHZpcnR1YWwgaXRlbSBvZgorCQkJCSAgICBpdGVtcywgdGhhdCBhcmUgc3BsaXQgYmV0d2VlbiBTWzBdIGFuZAorCQkJCSAgICBTMW5ldyBhbmQgUzFuZXcgYW5kIFMybmV3ICovCisKKyAgICBzcGxpdF9pdGVtX3Bvc2l0aW9uc1swXSA9IC0xOworICAgIHNwbGl0X2l0ZW1fcG9zaXRpb25zWzFdID0gLTE7CisKKyAgICAvKiBXZSBvbmx5IGNyZWF0ZSBhZGRpdGlvbmFsIG5vZGVzIGlmIHdlIGFyZSBpbiBpbnNlcnQgb3IgcGFzdGUgbW9kZQorICAgICAgIG9yIHdlIGFyZSBpbiByZXBsYWNlIG1vZGUgYXQgdGhlIGludGVybmFsIGxldmVsLiBJZiBoIGlzIDAgYW5kCisgICAgICAgdGhlIG1vZGUgaXMgTV9SRVBMQUNFIHRoZW4gaW4gZml4X25vZGVzIHdlIGNoYW5nZSB0aGUgbW9kZSB0bworICAgICAgIHBhc3RlIG9yIGluc2VydCBiZWZvcmUgd2UgZ2V0IGhlcmUgaW4gdGhlIGNvZGUuICAqLworICAgIFJGQUxTRSggdGItPmluc2VydF9zaXplW2hdIDwgMCAgfHwgKG1vZGUgIT0gTV9JTlNFUlQgJiYgbW9kZSAhPSBNX1BBU1RFKSwKKwkgICAgInZzLTgxMDA6IGluc2VydF9zaXplIDwgMCBpbiBvdmVyZmxvdyIpOworCisgICAgbWF4X25vZGVfc2l6ZSA9IE1BWF9DSElMRF9TSVpFIChQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpKTsKKworICAgIC8qIHNudW0wMTIgWzAtMl0gLSBudW1iZXIgb2YgaXRlbXMsIHRoYXQgbGF5CisgICAgICAgdG8gU1swXSwgZmlyc3QgbmV3IG5vZGUgYW5kIHNlY29uZCBuZXcgbm9kZSAqLworICAgIHNudW0wMTJbM10gPSAtMTsJLyogczFieXRlcyAqLworICAgIHNudW0wMTJbNF0gPSAtMTsJLyogczJieXRlcyAqLworCisgICAgLyogaW50ZXJuYWwgbGV2ZWwgKi8KKyAgICBpZiAoaCA+IDApIHsKKwlpID0gKCh0byAtIGZyb20pICogKEtFWV9TSVpFICsgRENfU0laRSkgKyBEQ19TSVpFKTsKKwlpZiAoaSA9PSBtYXhfbm9kZV9zaXplKQorCSAgICByZXR1cm4gMTsKKwlyZXR1cm4gKGkgLyBtYXhfbm9kZV9zaXplICsgMSk7CisgICAgfQorCisgICAgLyogbGVhZiBsZXZlbCAqLworICAgIG5lZWRlZF9ub2RlcyA9IDE7CisgICAgdG90YWxfbm9kZV9zaXplID0gMDsKKyAgICBjdXJfZnJlZSA9IG1heF9ub2RlX3NpemU7CisKKyAgICAvLyBzdGFydCBmcm9tICdmcm9tJy10aCBpdGVtCisgICAgc3RhcnRfaXRlbSA9IGZyb207CisgICAgLy8gc2tpcCBpdHMgZmlyc3QgJ3N0YXJ0X2J5dGVzJyB1bml0cworICAgIHN0YXJ0X2J5dGVzID0gKChmcm9tX2J5dGVzICE9IC0xKSA/IGZyb21fYnl0ZXMgOiAwKTsKKworICAgIC8vIGxhc3QgaW5jbHVkZWQgaXRlbSBpcyB0aGUgJ2VuZF9pdGVtJy10aCBvbmUKKyAgICBlbmRfaXRlbSA9IHZuLT52bl9ucl9pdGVtIC0gdG8gLSAxOworICAgIC8vIGRvIG5vdCBjb3VudCBsYXN0ICdlbmRfYnl0ZXMnIHVuaXRzIG9mICdlbmRfaXRlbSctdGggaXRlbQorICAgIGVuZF9ieXRlcyA9ICh0b19ieXRlcyAhPSAtMSkgPyB0b19ieXRlcyA6IDA7CisKKyAgICAvKiBnbyB0aHJvdWdoIGFsbCBpdGVtIGJlZ2lubmluZyBmcm9tIHRoZSBzdGFydF9pdGVtLXRoIGl0ZW0gYW5kIGVuZGluZyBieQorICAgICAgIHRoZSBlbmRfaXRlbS10aCBpdGVtLiBEbyBub3QgY291bnQgZmlyc3QgJ3N0YXJ0X2J5dGVzJyB1bml0cyBvZgorICAgICAgICdzdGFydF9pdGVtJy10aCBpdGVtIGFuZCBsYXN0ICdlbmRfYnl0ZXMnIG9mICdlbmRfaXRlbSctdGggaXRlbSAqLworICAgIAorICAgIGZvciAoaSA9IHN0YXJ0X2l0ZW07IGkgPD0gZW5kX2l0ZW07IGkgKyspIHsKKwlzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmkgPSB2bi0+dm5fdmkgKyBpOworCWludCBza2lwX2Zyb21fZW5kID0gKChpID09IGVuZF9pdGVtKSA/IGVuZF9ieXRlcyA6IDApOworCisJUkZBTFNFKCBuZWVkZWRfbm9kZXMgPiAzLCAidnMtODEwNTogdG9vIG1hbnkgbm9kZXMgYXJlIG5lZWRlZCIpOworCisJLyogZ2V0IHNpemUgb2YgY3VycmVudCBpdGVtICovCisJY3VycmVudF9pdGVtX3NpemUgPSB2aS0+dmlfaXRlbV9sZW47CisKKwkvKiBkbyBub3QgdGFrZSBpbiBjYWxjdWxhdGlvbiBoZWFkIHBhcnQgKGZyb21fYnl0ZXMpIG9mIGZyb20tdGggaXRlbSAqLworCWN1cnJlbnRfaXRlbV9zaXplIC09IG9wX3BhcnRfc2l6ZSAodmksIDAvKmZyb20gc3RhcnQqLywgc3RhcnRfYnl0ZXMpOworCisJLyogZG8gbm90IHRha2UgaW4gY2FsY3VsYXRpb24gdGFpbCBwYXJ0IG9mIGxhc3QgaXRlbSAqLworCWN1cnJlbnRfaXRlbV9zaXplIC09IG9wX3BhcnRfc2l6ZSAodmksIDEvKmZyb20gZW5kKi8sIHNraXBfZnJvbV9lbmQpOworCisJLyogaWYgaXRlbSBmaXRzIGludG8gY3VycmVudCBub2RlIGVudGllcmx5ICovCisJaWYgKHRvdGFsX25vZGVfc2l6ZSArIGN1cnJlbnRfaXRlbV9zaXplIDw9IG1heF9ub2RlX3NpemUpIHsKKwkgICAgc251bTAxMltuZWVkZWRfbm9kZXMgLSAxXSArKzsKKwkgICAgdG90YWxfbm9kZV9zaXplICs9IGN1cnJlbnRfaXRlbV9zaXplOworCSAgICBzdGFydF9ieXRlcyA9IDA7CisJICAgIGNvbnRpbnVlOworCX0KKworCWlmIChjdXJyZW50X2l0ZW1fc2l6ZSA+IG1heF9ub2RlX3NpemUpIHsKKwkgICAgLyogdmlydHVhbCBpdGVtIGxlbmd0aCBpcyBsb25nZXIsIHRoYW4gbWF4IHNpemUgb2YgaXRlbSBpbgorICAgICAgICAgICAgICAgYSBub2RlLiBJdCBpcyBpbXBvc3NpYmxlIGZvciBkaXJlY3QgaXRlbSAqLworCSAgICBSRkFMU0UoIGlzX2RpcmVjdF9sZV9paCAodmktPnZpX2loKSwKKwkJICAgICJ2cy04MTEwOiAiCisJCSAgICAiZGlyZWN0IGl0ZW0gbGVuZ3RoIGlzICVkLiBJdCBjYW4gbm90IGJlIGxvbmdlciB0aGFuICVkIiwKKwkJICAgIGN1cnJlbnRfaXRlbV9zaXplLCBtYXhfbm9kZV9zaXplKTsKKwkgICAgLyogd2Ugd2lsbCB0cnkgdG8gc3BsaXQgaXQgKi8KKwkgICAgZmxvdyA9IDE7CisJfQorCisJaWYgKCFmbG93KSB7CisJICAgIC8qIGFzIHdlIGRvIG5vdCBzcGxpdCBpdGVtcywgdGFrZSBuZXcgbm9kZSBhbmQgY29udGludWUgKi8KKwkgICAgbmVlZGVkX25vZGVzICsrOyBpIC0tOyB0b3RhbF9ub2RlX3NpemUgPSAwOworCSAgICBjb250aW51ZTsKKwl9CisKKwkvLyBjYWxjdWxhdGUgbnVtYmVyIG9mIGl0ZW0gdW5pdHMgd2hpY2ggZml0IGludG8gbm9kZSBiZWluZworCS8vIGZpbGxlZAorCXsKKwkgICAgaW50IGZyZWVfc3BhY2U7CisKKwkgICAgZnJlZV9zcGFjZSA9IG1heF9ub2RlX3NpemUgLSB0b3RhbF9ub2RlX3NpemUgLSBJSF9TSVpFOworCSAgICB1bml0cyA9IG9wX2NoZWNrX2xlZnQgKHZpLCBmcmVlX3NwYWNlLCBzdGFydF9ieXRlcywgc2tpcF9mcm9tX2VuZCk7CisJICAgIGlmICh1bml0cyA9PSAtMSkgeworCQkvKiBub3RoaW5nIGZpdHMgaW50byBjdXJyZW50IG5vZGUsIHRha2UgbmV3IG5vZGUgYW5kIGNvbnRpbnVlICovCisJCW5lZWRlZF9ub2RlcyArKywgaS0tLCB0b3RhbF9ub2RlX3NpemUgPSAwOworCQljb250aW51ZTsKKwkgICAgfQorCX0KKworCS8qIHNvbWV0aGluZyBmaXRzIGludG8gdGhlIGN1cnJlbnQgbm9kZSAqLworCS8vaWYgKHNudW0wMTJbM10gIT0gLTEgfHwgbmVlZGVkX25vZGVzICE9IDEpCisJLy8gIHJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJ2cy04MTE1OiBnZXRfbnVtX3ZlcjogdG9vIG1hbnkgbm9kZXMgcmVxdWlyZWQiKTsKKwkvL3NudW0wMTJbbmVlZGVkX25vZGVzIC0gMSArIDNdID0gb3BfdW5pdF9udW0gKHZpKSAtIHN0YXJ0X2J5dGVzIC0gdW5pdHM7CisJc3RhcnRfYnl0ZXMgKz0gdW5pdHM7CisJc251bTAxMltuZWVkZWRfbm9kZXMgLSAxICsgM10gPSB1bml0czsKKworCWlmIChuZWVkZWRfbm9kZXMgPiAyKQorCSAgICByZWlzZXJmc193YXJuaW5nICh0Yi0+dGJfc2IsICJ2cy04MTExOiBnZXRfbnVtX3ZlcjogIgorCQkJICAgICAgInNwbGl0X2l0ZW1fcG9zaXRpb24gaXMgb3V0IG9mIGJvdW5kYXJ5Iik7CisJc251bTAxMltuZWVkZWRfbm9kZXMgLSAxXSArKzsKKwlzcGxpdF9pdGVtX3Bvc2l0aW9uc1tuZWVkZWRfbm9kZXMgLSAxXSA9IGk7CisJbmVlZGVkX25vZGVzICsrOworCS8qIGNvbnRpbnVlIGZyb20gdGhlIHNhbWUgaXRlbSB3aXRoIHN0YXJ0X2J5dGVzICE9IC0xICovCisJc3RhcnRfaXRlbSA9IGk7CisJaSAtLTsKKwl0b3RhbF9ub2RlX3NpemUgPSAwOworICAgIH0KKworICAgIC8vIHN1bTAxMls0XSAoaWYgaXQgaXMgbm90IC0xKSBjb250YWlucyBudW1iZXIgb2YgdW5pdHMgb2Ygd2hpY2gKKyAgICAvLyBhcmUgdG8gYmUgaW4gUzFuZXcsIHNudW0wMTJbM10gLSB0byBiZSBpbiBTMC4gVGhleSBhcmUgc3VwcG9zZWQKKyAgICAvLyB0byBiZSBTMWJ5dGVzIGFuZCBTMmJ5dGVzIGNvcnJlc3BvbmRpbmdseSwgc28gcmVjYWxjdWxhdGUKKyAgICBpZiAoc251bTAxMls0XSA+IDApIHsKKwlpbnQgc3BsaXRfaXRlbV9udW07CisJaW50IGJ5dGVzX3RvX3IsIGJ5dGVzX3RvX2w7CisJaW50IGJ5dGVzX3RvX1MxbmV3OworICAgIAorCXNwbGl0X2l0ZW1fbnVtID0gc3BsaXRfaXRlbV9wb3NpdGlvbnNbMV07CisJYnl0ZXNfdG9fbCA9ICgoZnJvbSA9PSBzcGxpdF9pdGVtX251bSAmJiBmcm9tX2J5dGVzICE9IC0xKSA/IGZyb21fYnl0ZXMgOiAwKTsKKwlieXRlc190b19yID0gKChlbmRfaXRlbSA9PSBzcGxpdF9pdGVtX251bSAmJiBlbmRfYnl0ZXMgIT0gLTEpID8gZW5kX2J5dGVzIDogMCk7CisJYnl0ZXNfdG9fUzFuZXcgPSAoKHNwbGl0X2l0ZW1fcG9zaXRpb25zWzBdID09IHNwbGl0X2l0ZW1fcG9zaXRpb25zWzFdKSA/IHNudW0wMTJbM10gOiAwKTsKKworCS8vIHMyYnl0ZXMKKwlzbnVtMDEyWzRdID0gb3BfdW5pdF9udW0gKCZ2bi0+dm5fdmlbc3BsaXRfaXRlbV9udW1dKSAtIHNudW0wMTJbNF0gLSBieXRlc190b19yIC0gYnl0ZXNfdG9fbCAtIGJ5dGVzX3RvX1MxbmV3OworCisJaWYgKHZuLT52bl92aVtzcGxpdF9pdGVtX251bV0udmlfaW5kZXggIT0gVFlQRV9ESVJFTlRSWSAmJgorCSAgICB2bi0+dm5fdmlbc3BsaXRfaXRlbV9udW1dLnZpX2luZGV4ICE9IFRZUEVfSU5ESVJFQ1QpCisJICAgIHJlaXNlcmZzX3dhcm5pbmcgKHRiLT50Yl9zYiwgInZzLTgxMTU6IGdldF9udW1fdmVyOiBub3QgIgorCQkJICAgICAgImRpcmVjdG9yeSBvciBpbmRpcmVjdCBpdGVtIik7CisgICAgfQorCisgICAgLyogbm93IHdlIGtub3cgUzJieXRlcywgY2FsY3VsYXRlIFMxYnl0ZXMgKi8KKyAgICBpZiAoc251bTAxMlszXSA+IDApIHsKKwlpbnQgc3BsaXRfaXRlbV9udW07CisJaW50IGJ5dGVzX3RvX3IsIGJ5dGVzX3RvX2w7CisJaW50IGJ5dGVzX3RvX1MybmV3OworICAgIAorCXNwbGl0X2l0ZW1fbnVtID0gc3BsaXRfaXRlbV9wb3NpdGlvbnNbMF07CisJYnl0ZXNfdG9fbCA9ICgoZnJvbSA9PSBzcGxpdF9pdGVtX251bSAmJiBmcm9tX2J5dGVzICE9IC0xKSA/IGZyb21fYnl0ZXMgOiAwKTsKKwlieXRlc190b19yID0gKChlbmRfaXRlbSA9PSBzcGxpdF9pdGVtX251bSAmJiBlbmRfYnl0ZXMgIT0gLTEpID8gZW5kX2J5dGVzIDogMCk7CisJYnl0ZXNfdG9fUzJuZXcgPSAoKHNwbGl0X2l0ZW1fcG9zaXRpb25zWzBdID09IHNwbGl0X2l0ZW1fcG9zaXRpb25zWzFdICYmIHNudW0wMTJbNF0gIT0gLTEpID8gc251bTAxMls0XSA6IDApOworCisJLy8gczFieXRlcworCXNudW0wMTJbM10gPSBvcF91bml0X251bSAoJnZuLT52bl92aVtzcGxpdF9pdGVtX251bV0pIC0gc251bTAxMlszXSAtIGJ5dGVzX3RvX3IgLSBieXRlc190b19sIC0gYnl0ZXNfdG9fUzJuZXc7CisgICAgfQorICAgIAorICAgIHJldHVybiBuZWVkZWRfbm9kZXM7Cit9CisKKworI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSworZXh0ZXJuIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiBjdXJfdGI7CisjZW5kaWYKKworCisvKiBTZXQgcGFyYW1ldGVycyBmb3IgYmFsYW5jaW5nLgorICogUGVyZm9ybXMgd3JpdGUgb2YgcmVzdWx0cyBvZiBhbmFseXNpcyBvZiBiYWxhbmNpbmcgaW50byBzdHJ1Y3R1cmUgdGIsCisgKiB3aGVyZSBpdCB3aWxsIGxhdGVyIGJlIHVzZWQgYnkgdGhlIGZ1bmN0aW9ucyB0aGF0IGFjdHVhbGx5IGRvIHRoZSBiYWxhbmNpbmcuIAorICogUGFyYW1ldGVyczoKKyAqCXRiCXRyZWVfYmFsYW5jZSBzdHJ1Y3R1cmU7CisgKgloCWN1cnJlbnQgbGV2ZWwgb2YgdGhlIG5vZGU7CisgKglsbnVtCW51bWJlciBvZiBpdGVtcyBmcm9tIFNbaF0gdGhhdCBtdXN0IGJlIHNoaWZ0ZWQgdG8gTFtoXTsKKyAqCXJudW0JbnVtYmVyIG9mIGl0ZW1zIGZyb20gU1toXSB0aGF0IG11c3QgYmUgc2hpZnRlZCB0byBSW2hdOworICoJYmxrX251bQludW1iZXIgb2YgYmxvY2tzIHRoYXQgU1toXSB3aWxsIGJlIHNwbGl0dGVkIGludG87CisgKglzMDEyCW51bWJlciBvZiBpdGVtcyB0aGF0IGZhbGwgaW50byBzcGxpdHRlZCBub2Rlcy4KKyAqCWxieXRlcwludW1iZXIgb2YgYnl0ZXMgd2hpY2ggZmxvdyB0byB0aGUgbGVmdCBuZWlnaGJvciBmcm9tIHRoZSBpdGVtIHRoYXQgaXMgbm90CisgKgkJbm90IHNoaWZ0ZWQgZW50aXJlbHkKKyAqCXJieXRlcwludW1iZXIgb2YgYnl0ZXMgd2hpY2ggZmxvdyB0byB0aGUgcmlnaHQgbmVpZ2hib3IgZnJvbSB0aGUgaXRlbSB0aGF0IGlzIG5vdAorICoJCW5vdCBzaGlmdGVkIGVudGlyZWx5CisgKglzMWJ5dGVzCW51bWJlciBvZiBieXRlcyB3aGljaCBmbG93IHRvIHRoZSBmaXJzdCAgbmV3IG5vZGUgd2hlbiBTWzBdIHNwbGl0cyAodGhpcyBudW1iZXIgaXMgY29udGFpbmVkIGluIHMwMTIgYXJyYXkpCisgKi8KKworc3RhdGljIHZvaWQgc2V0X3BhcmFtZXRlcnMgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IGgsIGludCBsbnVtLAorCQkJICAgIGludCBybnVtLCBpbnQgYmxrX251bSwgc2hvcnQgKiBzMDEyLCBpbnQgbGIsIGludCByYikKK3sKKworICB0Yi0+bG51bVtoXSA9IGxudW07CisgIHRiLT5ybnVtW2hdID0gcm51bTsKKyAgdGItPmJsa251bVtoXSA9IGJsa19udW07CisKKyAgaWYgKGggPT0gMCkKKyAgICB7ICAvKiBvbmx5IGZvciBsZWFmIGxldmVsICovCisgICAgICBpZiAoczAxMiAhPSBOVUxMKQorCXsKKwkgIHRiLT5zMG51bSA9ICogczAxMiArKywKKwkgIHRiLT5zMW51bSA9ICogczAxMiArKywKKwkgIHRiLT5zMm51bSA9ICogczAxMiArKzsKKwkgIHRiLT5zMWJ5dGVzID0gKiBzMDEyICsrOworCSAgdGItPnMyYnl0ZXMgPSAqIHMwMTI7CisJfQorICAgICAgdGItPmxieXRlcyA9IGxiOworICAgICAgdGItPnJieXRlcyA9IHJiOworICAgIH0KKyAgUFJPQ19JTkZPX0FERCggdGIgLT4gdGJfc2IsIGxudW1bIGggXSwgbG51bSApOworICBQUk9DX0lORk9fQUREKCB0YiAtPiB0Yl9zYiwgcm51bVsgaCBdLCBybnVtICk7CisKKyAgUFJPQ19JTkZPX0FERCggdGIgLT4gdGJfc2IsIGxieXRlc1sgaCBdLCBsYiApOworICBQUk9DX0lORk9fQUREKCB0YiAtPiB0Yl9zYiwgcmJ5dGVzWyBoIF0sIHJiICk7Cit9CisKKworCisvKiBjaGVjaywgZG9lcyBub2RlIGRpc2FwcGVhciBpZiB3ZSBzaGlmdCB0Yi0+bG51bVswXSBpdGVtcyB0byBsZWZ0CisgICBuZWlnaGJvciBhbmQgdGItPnJudW1bMF0gdG8gdGhlIHJpZ2h0IG9uZS4gKi8KK3N0YXRpYyBpbnQgaXNfbGVhZl9yZW1vdmFibGUgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YikKK3sKKyAgc3RydWN0IHZpcnR1YWxfbm9kZSAqIHZuID0gdGItPnRiX3ZuOworICBpbnQgdG9fbGVmdCwgdG9fcmlnaHQ7CisgIGludCBzaXplOworICBpbnQgcmVtYWluX2l0ZW1zOworCisgIC8qIG51bWJlciBvZiBpdGVtcywgdGhhdCB3aWxsIGJlIHNoaWZ0ZWQgdG8gbGVmdCAocmlnaHQpIG5laWdoYm9yCisgICAgIGVudGlyZWx5ICovCisgIHRvX2xlZnQgPSB0Yi0+bG51bVswXSAtICgodGItPmxieXRlcyAhPSAtMSkgPyAxIDogMCk7CisgIHRvX3JpZ2h0ID0gdGItPnJudW1bMF0gLSAoKHRiLT5yYnl0ZXMgIT0gLTEpID8gMSA6IDApOworICByZW1haW5faXRlbXMgPSB2bi0+dm5fbnJfaXRlbTsKKworICAvKiBob3cgbWFueSBpdGVtcyByZW1haW4gaW4gU1swXSBhZnRlciBzaGlmdGluZ3MgdG8gbmVpZ2hib3JzICovCisgIHJlbWFpbl9pdGVtcyAtPSAodG9fbGVmdCArIHRvX3JpZ2h0KTsKKworICBpZiAocmVtYWluX2l0ZW1zIDwgMSkgeworICAgIC8qIGFsbCBjb250ZW50IG9mIG5vZGUgY2FuIGJlIHNoaWZ0ZWQgdG8gbmVpZ2hib3JzICovCisgICAgc2V0X3BhcmFtZXRlcnMgKHRiLCAwLCB0b19sZWZ0LCB2bi0+dm5fbnJfaXRlbSAtIHRvX2xlZnQsIDAsIE5VTEwsIC0xLCAtMSk7ICAgIAorICAgIHJldHVybiAxOworICB9CisgIAorICBpZiAocmVtYWluX2l0ZW1zID4gMSB8fCB0Yi0+bGJ5dGVzID09IC0xIHx8IHRiLT5yYnl0ZXMgPT0gLTEpCisgICAgLyogU1swXSBpcyBub3QgcmVtb3ZhYmxlICovCisgICAgcmV0dXJuIDA7CisKKyAgLyogY2hlY2ssIHdoZXRoZXIgd2UgY2FuIGRpdmlkZSAxIHJlbWFpbmluZyBpdGVtIGJldHdlZW4gbmVpZ2hib3JzICovCisKKyAgLyogZ2V0IHNpemUgb2YgcmVtYWluaW5nIGl0ZW0gKGluIGl0ZW0gdW5pdHMpICovCisgIHNpemUgPSBvcF91bml0X251bSAoJih2bi0+dm5fdmlbdG9fbGVmdF0pKTsKKworICBpZiAodGItPmxieXRlcyArIHRiLT5yYnl0ZXMgPj0gc2l6ZSkgeworICAgIHNldF9wYXJhbWV0ZXJzICh0YiwgMCwgdG9fbGVmdCArIDEsIHRvX3JpZ2h0ICsgMSwgMCwgTlVMTCwgdGItPmxieXRlcywgLTEpOworICAgIHJldHVybiAxOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKworLyogY2hlY2sgd2hldGhlciBMLCBTLCBSIGNhbiBiZSBqb2luZWQgaW4gb25lIG5vZGUgKi8KK3N0YXRpYyBpbnQgYXJlX2xlYXZlc19yZW1vdmFibGUgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IGxmcmVlLCBpbnQgcmZyZWUpCit7CisgIHN0cnVjdCB2aXJ0dWFsX25vZGUgKiB2biA9IHRiLT50Yl92bjsKKyAgaW50IGloX3NpemU7CisgIHN0cnVjdCBidWZmZXJfaGVhZCAqUzA7CisKKyAgUzAgPSBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIDApOworCisgIGloX3NpemUgPSAwOworICBpZiAodm4tPnZuX25yX2l0ZW0pIHsKKyAgICBpZiAodm4tPnZuX3ZpWzBdLnZpX3R5cGUgJiBWSV9UWVBFX0xFRlRfTUVSR0VBQkxFKQorICAgICAgaWhfc2l6ZSArPSBJSF9TSVpFOworICAgIAorCWlmICh2bi0+dm5fdmlbdm4tPnZuX25yX2l0ZW0tMV0udmlfdHlwZSAmIFZJX1RZUEVfUklHSFRfTUVSR0VBQkxFKQorCSAgICBpaF9zaXplICs9IElIX1NJWkU7CisgICAgfSBlbHNlIHsKKwkvKiB0aGVyZSB3YXMgb25seSBvbmUgaXRlbSBhbmQgaXQgd2lsbCBiZSBkZWxldGVkICovCisJc3RydWN0IGl0ZW1faGVhZCAqIGloOworICAgIAorICAgIFJGQUxTRSggQl9OUl9JVEVNUyAoUzApICE9IDEsCisJICAgICJ2cy04MTI1OiBpdGVtIG51bWJlciBtdXN0IGJlIDE6IGl0IGlzICVkIiwgQl9OUl9JVEVNUyhTMCkpOworCisgICAgaWggPSBCX05fUElURU1fSEVBRCAoUzAsIDApOworICAgIGlmICh0Yi0+Q0ZSWzBdICYmICFjb21wX3Nob3J0X2xlX2tleXMgKCYoaWgtPmloX2tleSksIEJfTl9QREVMSU1fS0VZICh0Yi0+Q0ZSWzBdLCB0Yi0+cmtleVswXSkpKQorCWlmIChpc19kaXJlbnRyeV9sZV9paCAoaWgpKSB7CisJICAgIC8qIERpcmVjdG9yeSBtdXN0IGJlIGluIGNvcnJlY3Qgc3RhdGUgaGVyZTogdGhhdCBpcworCSAgICAgICBzb21ld2hlcmUgYXQgdGhlIGxlZnQgc2lkZSBzaG91bGQgZXhpc3QgZmlyc3QgZGlyZWN0b3J5CisJICAgICAgIGl0ZW0uIEJ1dCB0aGUgaXRlbSBiZWluZyBkZWxldGVkIGNhbiBub3QgYmUgdGhhdCBmaXJzdAorCSAgICAgICBvbmUgYmVjYXVzZSBpdHMgcmlnaHQgbmVpZ2hib3IgaXMgaXRlbSBvZiB0aGUgc2FtZQorCSAgICAgICBkaXJlY3RvcnkuIChCdXQgZmlyc3QgaXRlbSBhbHdheXMgZ2V0cyBkZWxldGVkIGluIGxhc3QKKwkgICAgICAgdHVybikuIFNvLCBuZWlnaGJvcnMgb2YgZGVsZXRlZCBpdGVtIGNhbiBiZSBtZXJnZWQsIHNvCisJICAgICAgIHdlIGNhbiBzYXZlIGloX3NpemUgKi8KKwkgICAgaWhfc2l6ZSA9IElIX1NJWkU7CisJICAgIAorCSAgICAvKiB3ZSBtaWdodCBjaGVjayB0aGF0IGxlZnQgbmVpZ2hib3IgZXhpc3RzIGFuZCBpcyBvZiB0aGUKKwkgICAgICAgc2FtZSBkaXJlY3RvcnkgKi8KKwkgICAgUkZBTFNFKGxlX2loX2tfb2Zmc2V0IChpaCkgPT0gRE9UX09GRlNFVCwKKwkJInZzLTgxMzA6IGZpcnN0IGRpcmVjdG9yeSBpdGVtIGNhbiBub3QgYmUgcmVtb3ZlZCB1bnRpbCBkaXJlY3RvcnkgaXMgbm90IGVtcHR5Iik7CisgICAgICB9CisgICAgCisgIH0KKworICBpZiAoTUFYX0NISUxEX1NJWkUgKFMwKSArIHZuLT52bl9zaXplIDw9IHJmcmVlICsgbGZyZWUgKyBpaF9zaXplKSB7CisgICAgc2V0X3BhcmFtZXRlcnMgKHRiLCAwLCAtMSwgLTEsIC0xLCBOVUxMLCAtMSwgLTEpOworICAgIFBST0NfSU5GT19JTkMoIHRiIC0+IHRiX3NiLCBsZWF2ZXNfcmVtb3ZhYmxlICk7CisgICAgcmV0dXJuIDE7ICAKKyAgfQorICByZXR1cm4gMDsKKyAgCit9CisKKworCisvKiB3aGVuIHdlIGRvIG5vdCBzcGxpdCBpdGVtLCBsbnVtIGFuZCBybnVtIGFyZSBudW1iZXJzIG9mIGVudGlyZSBpdGVtcyAqLworI2RlZmluZSBTRVRfUEFSX1NISUZUX0xFRlQgXAoraWYgKGgpXAore1wKKyAgIGludCB0b19sO1wKKyAgIFwKKyAgIHRvX2wgPSAoTUFYX05SX0tFWShTaCkrMSAtIGxwYXIgKyB2bi0+dm5fbnJfaXRlbSArIDEpIC8gMiAtXAorCSAgICAgIChNQVhfTlJfS0VZKFNoKSArIDEgLSBscGFyKTtcCisJICAgICAgXAorCSAgICAgIHNldF9wYXJhbWV0ZXJzICh0YiwgaCwgdG9fbCwgMCwgbG52ZXIsIE5VTEwsIC0xLCAtMSk7XAorfVwKK2Vsc2UgXAore1wKKyAgIGlmIChsc2V0PT1MRUZUX1NISUZUX0ZMT1cpXAorICAgICBzZXRfcGFyYW1ldGVycyAodGIsIGgsIGxwYXIsIDAsIGxudmVyLCBzbnVtMDEyK2xzZXQsXAorCQkgICAgIHRiLT5sYnl0ZXMsIC0xKTtcCisgICBlbHNlXAorICAgICBzZXRfcGFyYW1ldGVycyAodGIsIGgsIGxwYXIgLSAodGItPmxieXRlcyE9LTEpLCAwLCBsbnZlciwgc251bTAxMitsc2V0LFwKKwkJICAgICAtMSwgLTEpO1wKK30KKworCisjZGVmaW5lIFNFVF9QQVJfU0hJRlRfUklHSFQgXAoraWYgKGgpXAore1wKKyAgIGludCB0b19yO1wKKyAgIFwKKyAgIHRvX3IgPSAoTUFYX05SX0tFWShTaCkrMSAtIHJwYXIgKyB2bi0+dm5fbnJfaXRlbSArIDEpIC8gMiAtIChNQVhfTlJfS0VZKFNoKSArIDEgLSBycGFyKTtcCisgICBcCisgICBzZXRfcGFyYW1ldGVycyAodGIsIGgsIDAsIHRvX3IsIHJudmVyLCBOVUxMLCAtMSwgLTEpO1wKK31cCitlbHNlIFwKK3tcCisgICBpZiAocnNldD09UklHSFRfU0hJRlRfRkxPVylcCisgICAgIHNldF9wYXJhbWV0ZXJzICh0YiwgaCwgMCwgcnBhciwgcm52ZXIsIHNudW0wMTIrcnNldCxcCisJCSAgLTEsIHRiLT5yYnl0ZXMpO1wKKyAgIGVsc2VcCisgICAgIHNldF9wYXJhbWV0ZXJzICh0YiwgaCwgMCwgcnBhciAtICh0Yi0+cmJ5dGVzIT0tMSksIHJudmVyLCBzbnVtMDEyK3JzZXQsXAorCQkgIC0xLCAtMSk7XAorfQorCisKK3N0YXRpYyB2b2lkIGZyZWVfYnVmZmVyc19pbl90YiAoCisJCSAgICAgICBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogcF9zX3RiCisJCSAgICAgICApIHsKKyAgaW50IG5fY291bnRlcjsKKworICBkZWNyZW1lbnRfY291bnRlcnNfaW5fcGF0aChwX3NfdGItPnRiX3BhdGgpOworICAKKyAgZm9yICggbl9jb3VudGVyID0gMDsgbl9jb3VudGVyIDwgTUFYX0hFSUdIVDsgbl9jb3VudGVyKysgKSB7CisgICAgZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkxbbl9jb3VudGVyXSk7CisgICAgcF9zX3RiLT5MW25fY291bnRlcl0gPSBOVUxMOworICAgIGRlY3JlbWVudF9iY291bnQocF9zX3RiLT5SW25fY291bnRlcl0pOworICAgIHBfc190Yi0+UltuX2NvdW50ZXJdID0gTlVMTDsKKyAgICBkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+Rkxbbl9jb3VudGVyXSk7CisgICAgcF9zX3RiLT5GTFtuX2NvdW50ZXJdID0gTlVMTDsKKyAgICBkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+RlJbbl9jb3VudGVyXSk7CisgICAgcF9zX3RiLT5GUltuX2NvdW50ZXJdID0gTlVMTDsKKyAgICBkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+Q0ZMW25fY291bnRlcl0pOworICAgIHBfc190Yi0+Q0ZMW25fY291bnRlcl0gPSBOVUxMOworICAgIGRlY3JlbWVudF9iY291bnQocF9zX3RiLT5DRlJbbl9jb3VudGVyXSk7CisgICAgcF9zX3RiLT5DRlJbbl9jb3VudGVyXSA9IE5VTEw7CisgIH0KK30KKworCisvKiBHZXQgbmV3IGJ1ZmZlcnMgZm9yIHN0b3JpbmcgbmV3IG5vZGVzIHRoYXQgYXJlIGNyZWF0ZWQgd2hpbGUgYmFsYW5jaW5nLgorICogUmV0dXJuczoJU0NIRURVTEVfT0NDVVJSRUQgLSBzY2hlZHVsZSBvY2N1cnJlZCB3aGlsZSB0aGUgZnVuY3Rpb24gd29ya2VkOworICoJICAgICAgICBDQVJSWV9PTiAtIHNjaGVkdWxlIGRpZG4ndCBvY2N1ciB3aGlsZSB0aGUgZnVuY3Rpb24gd29ya2VkOworICoJICAgICAgICBOT19ESVNLX1NQQUNFIC0gbm8gZGlzayBzcGFjZS4KKyAqLworLyogVGhlIGZ1bmN0aW9uIGlzIE5PVCBTQ0hFRFVMRS1TQUZFISAqLworc3RhdGljIGludCAgZ2V0X2VtcHR5X25vZGVzKAorICAgICAgICAgICAgICBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogcF9zX3RiLAorICAgICAgICAgICAgICBpbnQgbl9oCisgICAgICAgICAgICApIHsKKyAgc3RydWN0IGJ1ZmZlcl9oZWFkICAqIHBfc19uZXdfYmgsCisgICAgCQkgICAgICAqCXBfc19TaCA9IFBBVEhfSF9QQlVGRkVSIChwX3NfdGItPnRiX3BhdGgsIG5faCk7CisgIGJfYmxvY2tucl90CSAgICAgICoJcF9uX2Jsb2NrbnIsCisgICAgCQkJYV9uX2Jsb2NrbnJzW01BWF9BTU9VTlRfTkVFREVEXSA9IHswLCB9OworICBpbnQgICAgICAgCQluX2NvdW50ZXIsCisgICAJCQluX251bWJlcl9vZl9mcmVlYmxrLAorICAgICAgICAgICAgICAgIAluX2Ftb3VudF9uZWVkZWQsLyogbnVtYmVyIG9mIG5lZWRlZCBlbXB0eSBibG9ja3MgKi8KKwkJCW5fcmV0dmFsID0gQ0FSUllfT047CisgIHN0cnVjdCBzdXBlcl9ibG9jayAqCXBfc19zYiA9IHBfc190Yi0+dGJfc2I7CisKKworICAvKiBudW1iZXJfb2ZfZnJlZWJsayBpcyB0aGUgbnVtYmVyIG9mIGVtcHR5IGJsb2NrcyB3aGljaCBoYXZlIGJlZW4KKyAgICAgYWNxdWlyZWQgZm9yIHVzZSBieSB0aGUgYmFsYW5jaW5nIGFsZ29yaXRobSBtaW51cyB0aGUgbnVtYmVyIG9mCisgICAgIGVtcHR5IGJsb2NrcyB1c2VkIGluIHRoZSBwcmV2aW91cyBsZXZlbHMgb2YgdGhlIGFuYWx5c2lzLAorICAgICBudW1iZXJfb2ZfZnJlZWJsayA9IHRiLT5jdXJfYmxrbnVtIGNhbiBiZSBub24temVybyBpZiBhIHNjaGVkdWxlIG9jY3VycworICAgICBhZnRlciBlbXB0eSBibG9ja3MgYXJlIGFjcXVpcmVkLCBhbmQgdGhlIGJhbGFuY2luZyBhbmFseXNpcyBpcworICAgICB0aGVuIHJlc3RhcnRlZCwgYW1vdW50X25lZWRlZCBpcyB0aGUgbnVtYmVyIG5lZWRlZCBieSB0aGlzIGxldmVsCisgICAgIChuX2gpIG9mIHRoZSBiYWxhbmNpbmcgYW5hbHlzaXMuCisJCQkgICAgCisgICAgIE5vdGUgdGhhdCBmb3Igc3lzdGVtcyB3aXRoIG1hbnkgcHJvY2Vzc2VzIHdyaXRpbmcsIGl0IHdvdWxkIGJlCisgICAgIG1vcmUgbGF5b3V0IG9wdGltYWwgdG8gY2FsY3VsYXRlIHRoZSB0b3RhbCBudW1iZXIgbmVlZGVkIGJ5IGFsbAorICAgICBsZXZlbHMgYW5kIHRoZW4gdG8gcnVuIHJlaXNlcmZzX25ld19ibG9ja3MgdG8gZ2V0IGFsbCBvZiB0aGVtIGF0IG9uY2UuICAqLworCisgIC8qIEluaXRpYXRlIG51bWJlcl9vZl9mcmVlYmxrIHRvIHRoZSBhbW91bnQgYWNxdWlyZWQgcHJpb3IgdG8gdGhlIHJlc3RhcnQgb2YKKyAgICAgdGhlIGFuYWx5c2lzIG9yIDAgaWYgbm90IHJlc3RhcnRlZCwgdGhlbiBzdWJ0cmFjdCB0aGUgYW1vdW50IG5lZWRlZAorICAgICBieSBhbGwgb2YgdGhlIGxldmVscyBvZiB0aGUgdHJlZSBiZWxvdyBuX2guICovCisgIC8qIGJsa251bSBpbmNsdWRlcyBTW25faF0sIHNvIHdlIHN1YnRyYWN0IDEgaW4gdGhpcyBjYWxjdWxhdGlvbiAqLworICBmb3IgKCBuX2NvdW50ZXIgPSAwLCBuX251bWJlcl9vZl9mcmVlYmxrID0gcF9zX3RiLT5jdXJfYmxrbnVtOyBuX2NvdW50ZXIgPCBuX2g7IG5fY291bnRlcisrICkKKyAgICBuX251bWJlcl9vZl9mcmVlYmxrIC09ICggcF9zX3RiLT5ibGtudW1bbl9jb3VudGVyXSApID8gKHBfc190Yi0+YmxrbnVtW25fY291bnRlcl0gLSAxKSA6IDA7CisKKyAgLyogQWxsb2NhdGUgbWlzc2luZyBlbXB0eSBibG9ja3MuICovCisgIC8qIGlmIHBfc19TaCA9PSAwICB0aGVuIHdlIGFyZSBnZXR0aW5nIGEgbmV3IHJvb3QgKi8KKyAgbl9hbW91bnRfbmVlZGVkID0gKCBwX3NfU2ggKSA/IChwX3NfdGItPmJsa251bVtuX2hdIC0gMSkgOiAxOworICAvKiAgQW1vdW50X25lZWRlZCA9IHRoZSBhbW91bnQgdGhhdCB3ZSBuZWVkIG1vcmUgdGhhbiB0aGUgYW1vdW50IHRoYXQgd2UgaGF2ZS4gKi8KKyAgaWYgKCBuX2Ftb3VudF9uZWVkZWQgPiBuX251bWJlcl9vZl9mcmVlYmxrICkKKyAgICBuX2Ftb3VudF9uZWVkZWQgLT0gbl9udW1iZXJfb2ZfZnJlZWJsazsKKyAgZWxzZSAvKiBJZiB3ZSBoYXZlIGVub3VnaCBhbHJlYWR5IHRoZW4gdGhlcmUgaXMgbm90aGluZyB0byBkby4gKi8KKyAgICByZXR1cm4gQ0FSUllfT047CisKKyAgLyogTm8gbmVlZCB0byBjaGVjayBxdW90YSAtIGlzIG5vdCBhbGxvY2F0ZWQgZm9yIGJsb2NrcyB1c2VkIGZvciBmb3JtYXR0ZWQgbm9kZXMgKi8KKyAgaWYgKHJlaXNlcmZzX25ld19mb3JtX2Jsb2NrbnJzIChwX3NfdGIsIGFfbl9ibG9ja25ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9hbW91bnRfbmVlZGVkKSA9PSBOT19ESVNLX1NQQUNFKQorICAgIHJldHVybiBOT19ESVNLX1NQQUNFOworCisgIC8qIGZvciBlYWNoIGJsb2NrbnVtYmVyIHdlIGp1c3QgZ290LCBnZXQgYSBidWZmZXIgYW5kIHN0aWNrIGl0IG9uIEZFQiAqLworICBmb3IgKCBwX25fYmxvY2tuciA9IGFfbl9ibG9ja25ycywgbl9jb3VudGVyID0gMDsgbl9jb3VudGVyIDwgbl9hbW91bnRfbmVlZGVkOworCXBfbl9ibG9ja25yKyssIG5fY291bnRlcisrICkgeyAKKworICAgIFJGQUxTRSggISAqcF9uX2Jsb2NrbnIsCisJICAgICJQQVAtODEzNTogcmVpc2VyZnNfbmV3X2Jsb2NrbnJzIGZhaWxlZCB3aGVuIGdvdCBuZXcgYmxvY2tzIik7CisKKyAgICBwX3NfbmV3X2JoID0gc2JfZ2V0YmxrKHBfc19zYiwgKnBfbl9ibG9ja25yKTsKKyAgICBSRkFMU0UgKGJ1ZmZlcl9kaXJ0eSAocF9zX25ld19iaCkgfHwKKwkgICAgYnVmZmVyX2pvdXJuYWxlZCAocF9zX25ld19iaCkgfHwKKwkgICAgYnVmZmVyX2pvdXJuYWxfZGlydHkgKHBfc19uZXdfYmgpLAorCSAgICAiUEFQLTgxNDA6IGpvdXJubGFsZWQgb3IgZGlydHkgYnVmZmVyICViIGZvciB0aGUgbmV3IGJsb2NrIiwgCisJICAgIHBfc19uZXdfYmgpOworICAgIAorICAgIC8qIFB1dCBlbXB0eSBidWZmZXJzIGludG8gdGhlIGFycmF5LiAqLworICAgIFJGQUxTRSAocF9zX3RiLT5GRUJbcF9zX3RiLT5jdXJfYmxrbnVtXSwKKwkgICAgIlBBUC04MTQxOiBidXN5IHNsb3QgZm9yIG5ldyBidWZmZXIiKTsKKworICAgIHNldF9idWZmZXJfam91cm5hbF9uZXcgKHBfc19uZXdfYmgpOworICAgIHBfc190Yi0+RkVCW3Bfc190Yi0+Y3VyX2Jsa251bSsrXSA9IHBfc19uZXdfYmg7CisgIH0KKworICBpZiAoIG5fcmV0dmFsID09IENBUlJZX09OICYmIEZJTEVTWVNURU1fQ0hBTkdFRF9UQiAocF9zX3RiKSApCisgICAgbl9yZXR2YWwgPSBSRVBFQVRfU0VBUkNIIDsKKworICByZXR1cm4gbl9yZXR2YWw7Cit9CisKKworLyogR2V0IGZyZWUgc3BhY2Ugb2YgdGhlIGxlZnQgbmVpZ2hib3IsIHdoaWNoIGlzIHN0b3JlZCBpbiB0aGUgcGFyZW50CisgKiBub2RlIG9mIHRoZSBsZWZ0IG5laWdoYm9yLiAgKi8KK3N0YXRpYyBpbnQgZ2V0X2xmcmVlIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIGludCBoKQoreworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGwsICogZjsKKyAgICBpbnQgb3JkZXI7CisKKyAgICBpZiAoKGYgPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIGgpKSA9PSAwIHx8IChsID0gdGItPkZMW2hdKSA9PSAwKQorCXJldHVybiAwOworCisgICAgaWYgKGYgPT0gbCkKKwlvcmRlciA9IFBBVEhfSF9CX0lURU1fT1JERVIgKHRiLT50Yl9wYXRoLCBoKSAtIDE7CisgICAgZWxzZSB7CisJb3JkZXIgPSBCX05SX0lURU1TIChsKTsKKwlmID0gbDsKKyAgICB9CisKKyAgICByZXR1cm4gKE1BWF9DSElMRF9TSVpFKGYpIC0gZGNfc2l6ZShCX05fQ0hJTEQoZixvcmRlcikpKTsKK30KKworCisvKiBHZXQgZnJlZSBzcGFjZSBvZiB0aGUgcmlnaHQgbmVpZ2hib3IsCisgKiB3aGljaCBpcyBzdG9yZWQgaW4gdGhlIHBhcmVudCBub2RlIG9mIHRoZSByaWdodCBuZWlnaGJvci4KKyAqLworc3RhdGljIGludCBnZXRfcmZyZWUgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IGgpCit7CisgIHN0cnVjdCBidWZmZXJfaGVhZCAqIHIsICogZjsKKyAgaW50IG9yZGVyOworCisgIGlmICgoZiA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgaCkpID09IDAgfHwgKHIgPSB0Yi0+RlJbaF0pID09IDApCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKGYgPT0gcikKKyAgICAgIG9yZGVyID0gUEFUSF9IX0JfSVRFTV9PUkRFUiAodGItPnRiX3BhdGgsIGgpICsgMTsKKyAgZWxzZSB7CisgICAgICBvcmRlciA9IDA7CisgICAgICBmID0gcjsKKyAgfQorCisgIHJldHVybiAoTUFYX0NISUxEX1NJWkUoZikgLSBkY19zaXplKCBCX05fQ0hJTEQoZixvcmRlcikpKTsKKworfQorCisKKy8qIENoZWNrIHdoZXRoZXIgbGVmdCBuZWlnaGJvciBpcyBpbiBtZW1vcnkuICovCitzdGF0aWMgaW50ICBpc19sZWZ0X25laWdoYm9yX2luX2NhY2hlKAorICAgICAgICAgICAgICBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogcF9zX3RiLAorICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgbl9oCisgICAgICAgICAgICApIHsKKyAgc3RydWN0IGJ1ZmZlcl9oZWFkICAqIHBfc19mYXRoZXIsICogbGVmdDsKKyAgc3RydWN0IHN1cGVyX2Jsb2NrICAqIHBfc19zYiA9IHBfc190Yi0+dGJfc2I7CisgIGJfYmxvY2tucl90CQluX2xlZnRfbmVpZ2hib3JfYmxvY2tucjsKKyAgaW50ICAgICAgICAgICAgICAgICAgIG5fbGVmdF9uZWlnaGJvcl9wb3NpdGlvbjsKKworICBpZiAoICEgcF9zX3RiLT5GTFtuX2hdICkgLyogRmF0aGVyIG9mIHRoZSBsZWZ0IG5laWdoYm9yIGRvZXMgbm90IGV4aXN0LiAqLworICAgIHJldHVybiAwOworCisgIC8qIENhbGN1bGF0ZSBmYXRoZXIgb2YgdGhlIG5vZGUgdG8gYmUgYmFsYW5jZWQuICovCisgIHBfc19mYXRoZXIgPSBQQVRIX0hfUEJVRkZFUihwX3NfdGItPnRiX3BhdGgsIG5faCArIDEpOworCisgIFJGQUxTRSggISBwX3NfZmF0aGVyIHx8IAorCSAgISBCX0lTX0lOX1RSRUUgKHBfc19mYXRoZXIpIHx8IAorCSAgISBCX0lTX0lOX1RSRUUgKHBfc190Yi0+Rkxbbl9oXSkgfHwKKwkgICEgYnVmZmVyX3VwdG9kYXRlIChwX3NfZmF0aGVyKSB8fCAKKwkgICEgYnVmZmVyX3VwdG9kYXRlIChwX3NfdGItPkZMW25faF0pLAorCSAgInZzLTgxNjU6IEZbaF0gKCViKSBvciBGTFtoXSAoJWIpIGlzIGludmFsaWQiLCAKKwkgIHBfc19mYXRoZXIsIHBfc190Yi0+Rkxbbl9oXSk7CisKKworICAvKiBHZXQgcG9zaXRpb24gb2YgdGhlIHBvaW50ZXIgdG8gdGhlIGxlZnQgbmVpZ2hib3IgaW50byB0aGUgbGVmdCBmYXRoZXIuICovCisgIG5fbGVmdF9uZWlnaGJvcl9wb3NpdGlvbiA9ICggcF9zX2ZhdGhlciA9PSBwX3NfdGItPkZMW25faF0gKSA/CisgICAgICAgICAgICAgICAgICAgICAgcF9zX3RiLT5sa2V5W25faF0gOiBCX05SX0lURU1TIChwX3NfdGItPkZMW25faF0pOworICAvKiBHZXQgbGVmdCBuZWlnaGJvciBibG9jayBudW1iZXIuICovCisgIG5fbGVmdF9uZWlnaGJvcl9ibG9ja25yID0gQl9OX0NISUxEX05VTShwX3NfdGItPkZMW25faF0sIG5fbGVmdF9uZWlnaGJvcl9wb3NpdGlvbik7CisgIC8qIExvb2sgZm9yIHRoZSBsZWZ0IG5laWdoYm9yIGluIHRoZSBjYWNoZS4gKi8KKyAgaWYgKCAobGVmdCA9IHNiX2ZpbmRfZ2V0X2Jsb2NrKHBfc19zYiwgbl9sZWZ0X25laWdoYm9yX2Jsb2NrbnIpKSApIHsKKworICAgIFJGQUxTRSggYnVmZmVyX3VwdG9kYXRlIChsZWZ0KSAmJiAhIEJfSVNfSU5fVFJFRShsZWZ0KSwKKwkgICAgInZzLTgxNzA6IGxlZnQgbmVpZ2hib3IgKCViICV6KSBpcyBub3QgaW4gdGhlIHRyZWUiLCBsZWZ0LCBsZWZ0KTsKKyAgICBwdXRfYmgobGVmdCkgOworICAgIHJldHVybiAxOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKKworI2RlZmluZSBMRUZUX1BBUkVOVFMgICdsJworI2RlZmluZSBSSUdIVF9QQVJFTlRTICdyJworCisKK3N0YXRpYyB2b2lkIGRlY3JlbWVudF9rZXkgKHN0cnVjdCBjcHVfa2V5ICogcF9zX2tleSkKK3sKKyAgICAvLyBjYWxsIGl0ZW0gc3BlY2lmaWMgZnVuY3Rpb24gZm9yIHRoaXMga2V5CisgICAgaXRlbV9vcHNbY3B1X2tleV9rX3R5cGUgKHBfc19rZXkpXS0+ZGVjcmVtZW50X2tleSAocF9zX2tleSk7Cit9CisKKworCisKKy8qIENhbGN1bGF0ZSBmYXIgbGVmdC9yaWdodCBwYXJlbnQgb2YgdGhlIGxlZnQvcmlnaHQgbmVpZ2hib3Igb2YgdGhlIGN1cnJlbnQgbm9kZSwgdGhhdAorICogaXMgY2FsY3VsYXRlIHRoZSBsZWZ0L3JpZ2h0IChGTFtoXS9GUltoXSkgbmVpZ2hib3Igb2YgdGhlIHBhcmVudCBGW2hdLgorICogQ2FsY3VsYXRlIGxlZnQvcmlnaHQgY29tbW9uIHBhcmVudCBvZiB0aGUgY3VycmVudCBub2RlIGFuZCBMW2hdL1JbaF0uCisgKiBDYWxjdWxhdGUgbGVmdC9yaWdodCBkZWxpbWl0aW5nIGtleSBwb3NpdGlvbi4KKyAqIFJldHVybnM6CVBBVEhfSU5DT1JSRUNUICAgLSBwYXRoIGluIHRoZSB0cmVlIGlzIG5vdCBjb3JyZWN0OworIAkJU0NIRURVTEVfT0NDVVJSRUQgLSBzY2hlZHVsZSBvY2N1cnJlZCB3aGlsZSB0aGUgZnVuY3Rpb24gd29ya2VkOworICoJICAgICAgICBDQVJSWV9PTiAgICAgICAgIC0gc2NoZWR1bGUgZGlkbid0IG9jY3VyIHdoaWxlIHRoZSBmdW5jdGlvbiB3b3JrZWQ7CisgKi8KK3N0YXRpYyBpbnQgIGdldF9mYXJfcGFyZW50IChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogICBwX3NfdGIsCisJCQkgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbl9oLAorCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAgKiogIHBwX3NfZmF0aGVyLAorCQkJICAgIHN0cnVjdCBidWZmZXJfaGVhZCAgKiogIHBwX3NfY29tX2ZhdGhlciwKKwkJCSAgICBjaGFyICAgICAgICAgICAgICAgICAgICBjX2xyX3BhcikgCit7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICAqIHBfc19wYXJlbnQ7CisgICAgSU5JVElBTElaRV9QQVRIIChzX3BhdGhfdG9fbmVpZ2hib3JfZmF0aGVyKTsKKyAgICBzdHJ1Y3QgcGF0aCAqIHBfc19wYXRoID0gcF9zX3RiLT50Yl9wYXRoOworICAgIHN0cnVjdCBjcHVfa2V5CXNfbHJfZmF0aGVyX2tleTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgbl9jb3VudGVyLAorCW5fcG9zaXRpb24gPSBJTlRfTUFYLAorCW5fZmlyc3RfbGFzdF9wb3NpdGlvbiA9IDAsCisJbl9wYXRoX29mZnNldCA9IFBBVEhfSF9QQVRIX09GRlNFVChwX3NfcGF0aCwgbl9oKTsKKworICAgIC8qIFN0YXJ0aW5nIGZyb20gRltuX2hdIGdvIHVwd2FyZHMgaW4gdGhlIHRyZWUsIGFuZCBsb29rIGZvciB0aGUgY29tbW9uCisgICAgICBhbmNlc3RvciBvZiBGW25faF0sIGFuZCBpdHMgbmVpZ2hib3IgbC9yLCB0aGF0IHNob3VsZCBiZSBvYnRhaW5lZC4gKi8KKworICAgIG5fY291bnRlciA9IG5fcGF0aF9vZmZzZXQ7CisKKyAgICBSRkFMU0UoIG5fY291bnRlciA8IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQsCisJICAgICJQQVAtODE4MDogaW52YWxpZCBwYXRoIGxlbmd0aCIpOworCisgIAorICAgIGZvciAoIDsgbl9jb3VudGVyID4gRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVDsgbl9jb3VudGVyLS0gICkgIHsKKwkvKiBDaGVjayB3aGV0aGVyIHBhcmVudCBvZiB0aGUgY3VycmVudCBidWZmZXIgaW4gdGhlIHBhdGggaXMgcmVhbGx5IHBhcmVudCBpbiB0aGUgdHJlZS4gKi8KKwlpZiAoICEgQl9JU19JTl9UUkVFKHBfc19wYXJlbnQgPSBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLCBuX2NvdW50ZXIgLSAxKSkgKQorCSAgICByZXR1cm4gUkVQRUFUX1NFQVJDSDsKKwkvKiBDaGVjayB3aGV0aGVyIHBvc2l0aW9uIGluIHRoZSBwYXJlbnQgaXMgY29ycmVjdC4gKi8KKwlpZiAoIChuX3Bvc2l0aW9uID0gUEFUSF9PRkZTRVRfUE9TSVRJT04ocF9zX3BhdGgsIG5fY291bnRlciAtIDEpKSA+IEJfTlJfSVRFTVMocF9zX3BhcmVudCkgKQorCSAgICByZXR1cm4gUkVQRUFUX1NFQVJDSDsKKwkvKiBDaGVjayB3aGV0aGVyIHBhcmVudCBhdCB0aGUgcGF0aCByZWFsbHkgcG9pbnRzIHRvIHRoZSBjaGlsZC4gKi8KKwlpZiAoIEJfTl9DSElMRF9OVU0ocF9zX3BhcmVudCwgbl9wb3NpdGlvbikgIT0KKwkgICAgIFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3BhdGgsIG5fY291bnRlciktPmJfYmxvY2tuciApCisJICAgIHJldHVybiBSRVBFQVRfU0VBUkNIOworCS8qIFJldHVybiBkZWxpbWl0aW5nIGtleSBpZiBwb3NpdGlvbiBpbiB0aGUgcGFyZW50IGlzIG5vdCBlcXVhbCB0byBmaXJzdC9sYXN0IG9uZS4gKi8KKwlpZiAoIGNfbHJfcGFyID09IFJJR0hUX1BBUkVOVFMgKQorCSAgICBuX2ZpcnN0X2xhc3RfcG9zaXRpb24gPSBCX05SX0lURU1TIChwX3NfcGFyZW50KTsKKwlpZiAoIG5fcG9zaXRpb24gIT0gbl9maXJzdF9sYXN0X3Bvc2l0aW9uICkgeworCSAgICAqcHBfc19jb21fZmF0aGVyID0gcF9zX3BhcmVudDsKKwkgICAgZ2V0X2JoKCpwcF9zX2NvbV9mYXRoZXIpIDsKKwkgICAgLyooKnBwX3NfY29tX2ZhdGhlciA9IHBfc19wYXJlbnQpLT5iX2NvdW50Kys7Ki8KKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAgIC8qIGlmIHdlIGFyZSBpbiB0aGUgcm9vdCBvZiB0aGUgdHJlZSwgdGhlbiB0aGVyZSBpcyBubyBjb21tb24gZmF0aGVyICovCisgICAgaWYgKCBuX2NvdW50ZXIgPT0gRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCApIHsKKwkvKiBDaGVjayB3aGV0aGVyIGZpcnN0IGJ1ZmZlciBpbiB0aGUgcGF0aCBpcyB0aGUgcm9vdCBvZiB0aGUgdHJlZS4gKi8KKwlpZiAoIFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3RiLT50Yl9wYXRoLCBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VUKS0+Yl9ibG9ja25yID09CisJICAgICBTQl9ST09UX0JMT0NLIChwX3NfdGItPnRiX3NiKSApIHsKKwkgICAgKnBwX3NfZmF0aGVyID0gKnBwX3NfY29tX2ZhdGhlciA9IE5VTEw7CisJICAgIHJldHVybiBDQVJSWV9PTjsKKwl9CisJcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CisgICAgfQorCisgICAgUkZBTFNFKCBCX0xFVkVMICgqcHBfc19jb21fZmF0aGVyKSA8PSBESVNLX0xFQUZfTk9ERV9MRVZFTCwKKwkgICAgIlBBUC04MTg1OiAoJWIgJXopIGxldmVsIHRvbyBzbWFsbCIsIAorCSAgICAqcHBfc19jb21fZmF0aGVyLCAqcHBfc19jb21fZmF0aGVyKTsKKworICAgIC8qIENoZWNrIHdoZXRoZXIgdGhlIGNvbW1vbiBwYXJlbnQgaXMgbG9ja2VkLiAqLworCisgICAgaWYgKCBidWZmZXJfbG9ja2VkICgqcHBfc19jb21fZmF0aGVyKSApIHsKKwlfX3dhaXRfb25fYnVmZmVyKCpwcF9zX2NvbV9mYXRoZXIpOworCWlmICggRklMRVNZU1RFTV9DSEFOR0VEX1RCIChwX3NfdGIpICkgeworCSAgICBkZWNyZW1lbnRfYmNvdW50KCpwcF9zX2NvbV9mYXRoZXIpOworCSAgICByZXR1cm4gUkVQRUFUX1NFQVJDSDsKKwl9CisgICAgfQorCisgICAgLyogU28sIHdlIGdvdCBjb21tb24gcGFyZW50IG9mIHRoZSBjdXJyZW50IG5vZGUgYW5kIGl0cyBsZWZ0L3JpZ2h0IG5laWdoYm9yLgorICAgICBOb3cgd2UgYXJlIGdldGluZyB0aGUgcGFyZW50IG9mIHRoZSBsZWZ0L3JpZ2h0IG5laWdoYm9yLiAqLworCisgICAgLyogRm9ybSBrZXkgdG8gZ2V0IHBhcmVudCBvZiB0aGUgbGVmdC9yaWdodCBuZWlnaGJvci4gKi8KKyAgICBsZV9rZXkyY3B1X2tleSAoJnNfbHJfZmF0aGVyX2tleSwgQl9OX1BERUxJTV9LRVkoKnBwX3NfY29tX2ZhdGhlciwgKCBjX2xyX3BhciA9PSBMRUZUX1BBUkVOVFMgKSA/CisJCQkJCQkgICAgIChwX3NfdGItPmxrZXlbbl9oIC0gMV0gPSBuX3Bvc2l0aW9uIC0gMSkgOiAocF9zX3RiLT5ya2V5W25faCAtIDFdID0gbl9wb3NpdGlvbikpKTsKKworCisgICAgaWYgKCBjX2xyX3BhciA9PSBMRUZUX1BBUkVOVFMgKQorCWRlY3JlbWVudF9rZXkoJnNfbHJfZmF0aGVyX2tleSk7CisKKyAgICBpZiAoc2VhcmNoX2J5X2tleShwX3NfdGItPnRiX3NiLCAmc19scl9mYXRoZXJfa2V5LCAmc19wYXRoX3RvX25laWdoYm9yX2ZhdGhlciwgbl9oICsgMSkgPT0gSU9fRVJST1IpCisJLy8gcGF0aCBpcyByZWxlYXNlZAorCXJldHVybiBJT19FUlJPUjsKKworICAgIGlmICggRklMRVNZU1RFTV9DSEFOR0VEX1RCIChwX3NfdGIpICkgeworCWRlY3JlbWVudF9jb3VudGVyc19pbl9wYXRoKCZzX3BhdGhfdG9fbmVpZ2hib3JfZmF0aGVyKTsKKwlkZWNyZW1lbnRfYmNvdW50KCpwcF9zX2NvbV9mYXRoZXIpOworCXJldHVybiBSRVBFQVRfU0VBUkNIOworICAgIH0KKworICAgICpwcF9zX2ZhdGhlciA9IFBBVEhfUExBU1RfQlVGRkVSKCZzX3BhdGhfdG9fbmVpZ2hib3JfZmF0aGVyKTsKKworICAgIFJGQUxTRSggQl9MRVZFTCAoKnBwX3NfZmF0aGVyKSAhPSBuX2ggKyAxLAorCSAgICAiUEFQLTgxOTA6ICglYiAleikgbGV2ZWwgdG9vIHNtYWxsIiwgKnBwX3NfZmF0aGVyLCAqcHBfc19mYXRoZXIpOworICAgIFJGQUxTRSggc19wYXRoX3RvX25laWdoYm9yX2ZhdGhlci5wYXRoX2xlbmd0aCA8IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQsCisJICAgICJQQVAtODE5MjogcGF0aCBsZW5ndGggaXMgdG9vIHNtYWxsIik7CisKKyAgICBzX3BhdGhfdG9fbmVpZ2hib3JfZmF0aGVyLnBhdGhfbGVuZ3RoLS07CisgICAgZGVjcmVtZW50X2NvdW50ZXJzX2luX3BhdGgoJnNfcGF0aF90b19uZWlnaGJvcl9mYXRoZXIpOworICAgIHJldHVybiBDQVJSWV9PTjsKK30KKworCisvKiBHZXQgcGFyZW50cyBvZiBuZWlnaGJvcnMgb2Ygbm9kZSBpbiB0aGUgcGF0aChTW25fcGF0aF9vZmZzZXRdKSBhbmQgY29tbW9uIHBhcmVudHMgb2YKKyAqIFNbbl9wYXRoX29mZnNldF0gYW5kIExbbl9wYXRoX29mZnNldF0vUltuX3BhdGhfb2Zmc2V0XTogRltuX3BhdGhfb2Zmc2V0XSwgRkxbbl9wYXRoX29mZnNldF0sCisgKiBGUltuX3BhdGhfb2Zmc2V0XSwgQ0ZMW25fcGF0aF9vZmZzZXRdLCBDRlJbbl9wYXRoX29mZnNldF0uCisgKiBDYWxjdWxhdGUgbnVtYmVycyBvZiBsZWZ0IGFuZCByaWdodCBkZWxpbWl0aW5nIGtleXMgcG9zaXRpb246IGxrZXlbbl9wYXRoX29mZnNldF0sIHJrZXlbbl9wYXRoX29mZnNldF0uCisgKiBSZXR1cm5zOglTQ0hFRFVMRV9PQ0NVUlJFRCAtIHNjaGVkdWxlIG9jY3VycmVkIHdoaWxlIHRoZSBmdW5jdGlvbiB3b3JrZWQ7CisgKgkgICAgICAgIENBUlJZX09OIC0gc2NoZWR1bGUgZGlkbid0IG9jY3VyIHdoaWxlIHRoZSBmdW5jdGlvbiB3b3JrZWQ7CisgKi8KK3N0YXRpYyBpbnQgIGdldF9wYXJlbnRzIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogcF9zX3RiLCBpbnQgbl9oKQoreworICAgIHN0cnVjdCBwYXRoICAgICAgICAgKiBwX3NfcGF0aCA9IHBfc190Yi0+dGJfcGF0aDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgbl9wb3NpdGlvbiwKKwluX3JldF92YWx1ZSwKKwluX3BhdGhfb2Zmc2V0ID0gUEFUSF9IX1BBVEhfT0ZGU0VUKHBfc190Yi0+dGJfcGF0aCwgbl9oKTsKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgICogcF9zX2N1cmYsCisJKiBwX3NfY3VyY2Y7CisKKyAgICAvKiBDdXJyZW50IG5vZGUgaXMgdGhlIHJvb3Qgb2YgdGhlIHRyZWUgb3Igd2lsbCBiZSByb290IG9mIHRoZSB0cmVlICovCisgICAgaWYgKCBuX3BhdGhfb2Zmc2V0IDw9IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQgKSB7CisJLyogVGhlIHJvb3QgY2FuIG5vdCBoYXZlIHBhcmVudHMuCisJICAgUmVsZWFzZSBub2RlcyB3aGljaCBwcmV2aW91c2x5IHdlcmUgb2J0YWluZWQgYXMgcGFyZW50cyBvZiB0aGUgY3VycmVudCBub2RlIG5laWdoYm9ycy4gKi8KKwlkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+Rkxbbl9oXSk7CisJZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkNGTFtuX2hdKTsKKwlkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+RlJbbl9oXSk7CisJZGVjcmVtZW50X2Jjb3VudChwX3NfdGItPkNGUltuX2hdKTsKKwlwX3NfdGItPkZMW25faF0gPSBwX3NfdGItPkNGTFtuX2hdID0gcF9zX3RiLT5GUltuX2hdID0gcF9zX3RiLT5DRlJbbl9oXSA9IE5VTEw7CisJcmV0dXJuIENBUlJZX09OOworICAgIH0KKyAgCisgICAgLyogR2V0IHBhcmVudCBGTFtuX3BhdGhfb2Zmc2V0XSBvZiBMW25fcGF0aF9vZmZzZXRdLiAqLworICAgIGlmICggKG5fcG9zaXRpb24gPSBQQVRIX09GRlNFVF9QT1NJVElPTihwX3NfcGF0aCwgbl9wYXRoX29mZnNldCAtIDEpKSApICB7CisJLyogQ3VycmVudCBub2RlIGlzIG5vdCB0aGUgZmlyc3QgY2hpbGQgb2YgaXRzIHBhcmVudC4gKi8KKwkvKihwX3NfY3VyZiA9IHBfc19jdXJjZiA9IFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3BhdGgsIG5fcGF0aF9vZmZzZXQgLSAxKSktPmJfY291bnQgKz0gMjsqLworCXBfc19jdXJmID0gcF9zX2N1cmNmID0gUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfcGF0aCwgbl9wYXRoX29mZnNldCAtIDEpOworCWdldF9iaChwX3NfY3VyZikgOworCWdldF9iaChwX3NfY3VyZikgOworCXBfc190Yi0+bGtleVtuX2hdID0gbl9wb3NpdGlvbiAtIDE7CisgICAgfQorICAgIGVsc2UgIHsKKwkvKiBDYWxjdWxhdGUgY3VycmVudCBwYXJlbnQgb2YgTFtuX3BhdGhfb2Zmc2V0XSwgd2hpY2ggaXMgdGhlIGxlZnQgbmVpZ2hib3Igb2YgdGhlIGN1cnJlbnQgbm9kZS4KKwkgICBDYWxjdWxhdGUgY3VycmVudCBjb21tb24gcGFyZW50IG9mIExbbl9wYXRoX29mZnNldF0gYW5kIHRoZSBjdXJyZW50IG5vZGUuIE5vdGUgdGhhdAorCSAgIENGTFtuX3BhdGhfb2Zmc2V0XSBub3QgZXF1YWwgRkxbbl9wYXRoX29mZnNldF0gYW5kIENGTFtuX3BhdGhfb2Zmc2V0XSBub3QgZXF1YWwgRltuX3BhdGhfb2Zmc2V0XS4KKwkgICBDYWxjdWxhdGUgbGtleVtuX3BhdGhfb2Zmc2V0XS4gKi8KKwlpZiAoIChuX3JldF92YWx1ZSA9IGdldF9mYXJfcGFyZW50KHBfc190Yiwgbl9oICsgMSwgJnBfc19jdXJmLAorCQkJCQkgICAmcF9zX2N1cmNmLCBMRUZUX1BBUkVOVFMpKSAhPSBDQVJSWV9PTiApCisJICAgIHJldHVybiBuX3JldF92YWx1ZTsKKyAgICB9CisKKyAgICBkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+Rkxbbl9oXSk7CisgICAgcF9zX3RiLT5GTFtuX2hdID0gcF9zX2N1cmY7IC8qIE5ldyBpbml0aWFsaXphdGlvbiBvZiBGTFtuX2hdLiAqLworICAgIGRlY3JlbWVudF9iY291bnQocF9zX3RiLT5DRkxbbl9oXSk7CisgICAgcF9zX3RiLT5DRkxbbl9oXSA9IHBfc19jdXJjZjsgLyogTmV3IGluaXRpYWxpemF0aW9uIG9mIENGTFtuX2hdLiAqLworCisgICAgUkZBTFNFKCAocF9zX2N1cmYgJiYgIUJfSVNfSU5fVFJFRSAocF9zX2N1cmYpKSB8fCAKKwkgICAgKHBfc19jdXJjZiAmJiAhQl9JU19JTl9UUkVFIChwX3NfY3VyY2YpKSwKKwkgICAgIlBBUC04MTk1OiBGTCAoJWIpIG9yIENGTCAoJWIpIGlzIGludmFsaWQiLCBwX3NfY3VyZiwgcF9zX2N1cmNmKTsKKworLyogR2V0IHBhcmVudCBGUltuX2hdIG9mIFJbbl9oXS4gKi8KKworLyogQ3VycmVudCBub2RlIGlzIHRoZSBsYXN0IGNoaWxkIG9mIEZbbl9oXS4gRlJbbl9oXSAhPSBGW25faF0uICovCisgICAgaWYgKCBuX3Bvc2l0aW9uID09IEJfTlJfSVRFTVMgKFBBVEhfSF9QQlVGRkVSKHBfc19wYXRoLCBuX2ggKyAxKSkgKSB7CisvKiBDYWxjdWxhdGUgY3VycmVudCBwYXJlbnQgb2YgUltuX2hdLCB3aGljaCBpcyB0aGUgcmlnaHQgbmVpZ2hib3Igb2YgRltuX2hdLgorICAgQ2FsY3VsYXRlIGN1cnJlbnQgY29tbW9uIHBhcmVudCBvZiBSW25faF0gYW5kIGN1cnJlbnQgbm9kZS4gTm90ZSB0aGF0IENGUltuX2hdCisgICBub3QgZXF1YWwgRlJbbl9wYXRoX29mZnNldF0gYW5kIENGUltuX2hdIG5vdCBlcXVhbCBGW25faF0uICovCisJaWYgKCAobl9yZXRfdmFsdWUgPSBnZXRfZmFyX3BhcmVudChwX3NfdGIsIG5faCArIDEsICZwX3NfY3VyZiwgICZwX3NfY3VyY2YsIFJJR0hUX1BBUkVOVFMpKSAhPSBDQVJSWV9PTiApCisJICAgIHJldHVybiBuX3JldF92YWx1ZTsKKyAgICB9CisgICAgZWxzZSB7CisvKiBDdXJyZW50IG5vZGUgaXMgbm90IHRoZSBsYXN0IGNoaWxkIG9mIGl0cyBwYXJlbnQgRltuX2hdLiAqLworCS8qKHBfc19jdXJmID0gcF9zX2N1cmNmID0gUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfcGF0aCwgbl9wYXRoX29mZnNldCAtIDEpKS0+Yl9jb3VudCArPSAyOyovCisJcF9zX2N1cmYgPSBwX3NfY3VyY2YgPSBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLCBuX3BhdGhfb2Zmc2V0IC0gMSk7CisJZ2V0X2JoKHBfc19jdXJmKSA7CisJZ2V0X2JoKHBfc19jdXJmKSA7CisJcF9zX3RiLT5ya2V5W25faF0gPSBuX3Bvc2l0aW9uOworICAgIH0JCisKKyAgICBkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+RlJbbl9oXSk7CisgICAgcF9zX3RiLT5GUltuX2hdID0gcF9zX2N1cmY7IC8qIE5ldyBpbml0aWFsaXphdGlvbiBvZiBGUltuX3BhdGhfb2Zmc2V0XS4gKi8KKyAgICAKKyAgICBkZWNyZW1lbnRfYmNvdW50KHBfc190Yi0+Q0ZSW25faF0pOworICAgIHBfc190Yi0+Q0ZSW25faF0gPSBwX3NfY3VyY2Y7IC8qIE5ldyBpbml0aWFsaXphdGlvbiBvZiBDRlJbbl9wYXRoX29mZnNldF0uICovCisKKyAgICBSRkFMU0UoIChwX3NfY3VyZiAmJiAhQl9JU19JTl9UUkVFIChwX3NfY3VyZikpIHx8CisgICAgICAgICAgICAocF9zX2N1cmNmICYmICFCX0lTX0lOX1RSRUUgKHBfc19jdXJjZikpLAorCSAgICAiUEFQLTgyMDU6IEZSICglYikgb3IgQ0ZSICglYikgaXMgaW52YWxpZCIsIHBfc19jdXJmLCBwX3NfY3VyY2YpOworCisgICAgcmV0dXJuIENBUlJZX09OOworfQorCisKKy8qIGl0IGlzIHBvc3NpYmxlIHRvIHJlbW92ZSBub2RlIGFzIHJlc3VsdCBvZiBzaGlmdGluZ3MgdG8KKyAgIG5laWdoYm9ycyBldmVuIHdoZW4gd2UgaW5zZXJ0IG9yIHBhc3RlIGl0ZW0uICovCitzdGF0aWMgaW5saW5lIGludCBjYW5fbm9kZV9iZV9yZW1vdmVkIChpbnQgbW9kZSwgaW50IGxmcmVlLCBpbnQgc2ZyZWUsIGludCByZnJlZSwgc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgaCkKK3sKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBTaCA9IFBBVEhfSF9QQlVGRkVSICh0Yi0+dGJfcGF0aCwgaCk7CisgICAgaW50IGxldmJ5dGVzID0gdGItPmluc2VydF9zaXplW2hdOworICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICogcl9rZXkgPSBOVUxMOworCisgICAgaWggPSBCX05fUElURU1fSEVBRCAoU2gsIDApOworICAgIGlmICggdGItPkNGUltoXSApCisJcl9rZXkgPSBCX05fUERFTElNX0tFWSh0Yi0+Q0ZSW2hdLHRiLT5ya2V5W2hdKTsKKyAgCisgICAgaWYgKAorCWxmcmVlICsgcmZyZWUgKyBzZnJlZSA8IE1BWF9DSElMRF9TSVpFKFNoKSArIGxldmJ5dGVzCisJLyogc2hpZnRpbmcgbWF5IG1lcmdlIGl0ZW1zIHdoaWNoIG1pZ2h0IHNhdmUgc3BhY2UgKi8KKwktICgoICEgaCAmJiBvcF9pc19sZWZ0X21lcmdlYWJsZSAoJihpaC0+aWhfa2V5KSwgU2gtPmJfc2l6ZSkgKSA/IElIX1NJWkUgOiAwKQorCS0gKCggISBoICYmIHJfa2V5ICYmIG9wX2lzX2xlZnRfbWVyZ2VhYmxlIChyX2tleSwgU2gtPmJfc2l6ZSkgKSA/IElIX1NJWkUgOiAwKQorCSsgKCggaCApID8gS0VZX1NJWkUgOiAwKSkKKyAgICB7CisJLyogbm9kZSBjYW4gbm90IGJlIHJlbW92ZWQgKi8KKwlpZiAoc2ZyZWUgPj0gbGV2Ynl0ZXMgKSB7IC8qIG5ldyBpdGVtIGZpdHMgaW50byBub2RlIFNbaF0gd2l0aG91dCBhbnkgc2hpZnRpbmcgKi8KKwkgICAgaWYgKCAhIGggKQorCQl0Yi0+czBudW0gPSBCX05SX0lURU1TKFNoKSArICgobW9kZSA9PSBNX0lOU0VSVCApID8gMSA6IDApOworCSAgICBzZXRfcGFyYW1ldGVycyAodGIsIGgsIDAsIDAsIDEsIE5VTEwsIC0xLCAtMSk7CisJICAgIHJldHVybiBOT19CQUxBTkNJTkdfTkVFREVEOworCX0KKyAgICB9CisgICAgUFJPQ19JTkZPX0lOQyggdGIgLT4gdGJfc2IsIGNhbl9ub2RlX2JlX3JlbW92ZWRbIGggXSApOworICAgIHJldHVybiAhTk9fQkFMQU5DSU5HX05FRURFRDsKK30KKworCisKKy8qIENoZWNrIHdoZXRoZXIgY3VycmVudCBub2RlIFNbaF0gaXMgYmFsYW5jZWQgd2hlbiBpbmNyZWFzaW5nIGl0cyBzaXplIGJ5CisgKiBJbnNlcnRpbmcgb3IgUGFzdGluZy4KKyAqIENhbGN1bGF0ZSBwYXJhbWV0ZXJzIGZvciBiYWxhbmNpbmcgZm9yIGN1cnJlbnQgbGV2ZWwgaC4KKyAqIFBhcmFtZXRlcnM6CisgKgl0Ygl0cmVlX2JhbGFuY2Ugc3RydWN0dXJlOworICoJaAljdXJyZW50IGxldmVsIG9mIHRoZSBub2RlOworICoJaW51bQlpdGVtIG51bWJlciBpbiBTW2hdOworICoJbW9kZQlpIC0gaW5zZXJ0LCBwIC0gcGFzdGU7CisgKiBSZXR1cm5zOgkxIC0gc2NoZWR1bGUgb2NjdXJyZWQ7IAorICoJICAgICAgICAwIC0gYmFsYW5jaW5nIGZvciBoaWdoZXIgbGV2ZWxzIG5lZWRlZDsKKyAqCSAgICAgICAtMSAtIG5vIGJhbGFuY2luZyBmb3IgaGlnaGVyIGxldmVscyBuZWVkZWQ7CisgKgkgICAgICAgLTIgLSBubyBkaXNrIHNwYWNlLgorICovCisvKiBpcCBtZWFucyBJbnNlcnRpbmcgb3IgUGFzdGluZyAqLworc3RhdGljIGludCBpcF9jaGVja19iYWxhbmNlIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIGludCBoKQoreworICAgIHN0cnVjdCB2aXJ0dWFsX25vZGUgKiB2biA9IHRiLT50Yl92bjsKKyAgICBpbnQgbGV2Ynl0ZXMsICAvKiBOdW1iZXIgb2YgYnl0ZXMgdGhhdCBtdXN0IGJlIGluc2VydGVkIGludG8gKHZhbHVlCisJCSAgICAgIGlzIG5lZ2F0aXZlIGlmIGJ5dGVzIGFyZSBkZWxldGVkKSBidWZmZXIgd2hpY2gKKwkJICAgICAgY29udGFpbnMgbm9kZSBiZWluZyBiYWxhbmNlZC4gIFRoZSBtbmVtb25pYyBpcworCQkgICAgICB0aGF0IHRoZSBhdHRlbXB0ZWQgY2hhbmdlIGluIG5vZGUgc3BhY2UgdXNlZCBsZXZlbAorCQkgICAgICBpcyBsZXZieXRlcyBieXRlcy4gKi8KKwluX3JldF92YWx1ZTsKKworICAgIGludCBsZnJlZSwgc2ZyZWUsIHJmcmVlIC8qIGZyZWUgc3BhY2UgaW4gTCwgUyBhbmQgUiAqLzsKKworICAgIC8qIG52ZXIgaXMgc2hvcnQgZm9yIG51bWJlciBvZiB2ZXJ0aXhlcywgYW5kIGxudmVyIGlzIHRoZSBudW1iZXIgaWYKKyAgICAgICB3ZSBzaGlmdCB0byB0aGUgbGVmdCwgcm52ZXIgaXMgdGhlIG51bWJlciBpZiB3ZSBzaGlmdCB0byB0aGUKKyAgICAgICByaWdodCwgYW5kIGxybnZlciBpcyB0aGUgbnVtYmVyIGlmIHdlIHNoaWZ0IGluIGJvdGggZGlyZWN0aW9ucy4KKyAgICAgICBUaGUgZ29hbCBpcyB0byBtaW5pbWl6ZSBmaXJzdCB0aGUgbnVtYmVyIG9mIHZlcnRpeGVzLCBhbmQgc2Vjb25kLAorICAgICAgIHRoZSBudW1iZXIgb2YgdmVydGl4ZXMgd2hvc2UgY29udGVudHMgYXJlIGNoYW5nZWQgYnkgc2hpZnRpbmcsCisgICAgICAgYW5kIHRoaXJkIHRoZSBudW1iZXIgb2YgdW5jYWNoZWQgdmVydGl4ZXMgd2hvc2UgY29udGVudHMgYXJlCisgICAgICAgY2hhbmdlZCBieSBzaGlmdGluZyBhbmQgbXVzdCBiZSByZWFkIGZyb20gZGlzay4gICovCisgICAgaW50IG52ZXIsIGxudmVyLCBybnZlciwgbHJudmVyOworCisgICAgLyogdXNlZCBhdCBsZWFmIGxldmVsIG9ubHksIFMwID0gU1swXSBpcyB0aGUgbm9kZSBiZWluZyBiYWxhbmNlZCwKKyAgICAgICBzSW51bSBbIEkgPSAwLDEsMiBdIGlzIHRoZSBudW1iZXIgb2YgaXRlbXMgdGhhdCB3aWxsCisgICAgICAgcmVtYWluIGluIG5vZGUgU0kgYWZ0ZXIgYmFsYW5jaW5nLiAgUzEgYW5kIFMyIGFyZSBuZXcKKyAgICAgICBub2RlcyB0aGF0IG1pZ2h0IGJlIGNyZWF0ZWQuICovCisgIAorICAgIC8qIHdlIHBlcmZvcm0gOCBjYWxscyB0byBnZXRfbnVtX3ZlcigpLiAgRm9yIGVhY2ggY2FsbCB3ZSBjYWxjdWxhdGUgZml2ZSBwYXJhbWV0ZXJzLgorICAgICAgIHdoZXJlIDR0aCBwYXJhbWV0ZXIgaXMgczFieXRlcyBhbmQgNXRoIC0gczJieXRlcworICAgICovCisgICAgc2hvcnQgc251bTAxMls0MF0gPSB7MCx9OwkvKiBzMG51bSwgczFudW0sIHMybnVtIGZvciA4IGNhc2VzIAorCQkJCSAgIDAsMSAtIGRvIG5vdCBzaGlmdCBhbmQgZG8gbm90IHNoaWZ0IGJ1dCBib3R0bGUKKwkJCQkgICAyIC0gc2hpZnQgb25seSB3aG9sZSBpdGVtIHRvIGxlZnQKKwkJCQkgICAzIC0gc2hpZnQgdG8gbGVmdCBhbmQgYm90dGxlIGFzIG11Y2ggYXMgcG9zc2libGUKKwkJCQkgICA0LDUgLSBzaGlmdCB0byByaWdodAkod2hvbGUgaXRlbXMgYW5kIGFzIG11Y2ggYXMgcG9zc2libGUKKwkJCQkgICA2LDcgLSBzaGlmdCB0byBib3RoIGRpcmVjdGlvbnMgKHdob2xlIGl0ZW1zIGFuZCBhcyBtdWNoIGFzIHBvc3NpYmxlKQorCQkJCSovCisKKyAgICAvKiBTaCBpcyB0aGUgbm9kZSB3aG9zZSBiYWxhbmNlIGlzIGN1cnJlbnRseSBiZWluZyBjaGVja2VkICovCisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogU2g7CisgIAorICAgIFNoID0gUEFUSF9IX1BCVUZGRVIgKHRiLT50Yl9wYXRoLCBoKTsKKyAgICBsZXZieXRlcyA9IHRiLT5pbnNlcnRfc2l6ZVtoXTsKKyAgCisgICAgLyogQ2FsY3VsYXRlIGJhbGFuY2UgcGFyYW1ldGVycyBmb3IgY3JlYXRpbmcgbmV3IHJvb3QuICovCisgICAgaWYgKCAhIFNoICkgIHsKKwlpZiAoICEgaCApCisJICAgIHJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJ2cy04MjEwOiBpcF9jaGVja19iYWxhbmNlOiBTWzBdIGNhbiBub3QgYmUgMCIpOworCXN3aXRjaCAoIG5fcmV0X3ZhbHVlID0gZ2V0X2VtcHR5X25vZGVzICh0YiwgaCkgKSAgeworCWNhc2UgQ0FSUllfT046CisJICAgIHNldF9wYXJhbWV0ZXJzICh0YiwgaCwgMCwgMCwgMSwgTlVMTCwgLTEsIC0xKTsKKwkgICAgcmV0dXJuIE5PX0JBTEFOQ0lOR19ORUVERUQ7IC8qIG5vIGJhbGFuY2luZyBmb3IgaGlnaGVyIGxldmVscyBuZWVkZWQgKi8KKworCWNhc2UgTk9fRElTS19TUEFDRToKKwljYXNlIFJFUEVBVF9TRUFSQ0g6CisJICAgIHJldHVybiBuX3JldF92YWx1ZTsKKwlkZWZhdWx0OiAgIAorCSAgICByZWlzZXJmc19wYW5pYyh0Yi0+dGJfc2IsICJ2cy04MjE1OiBpcF9jaGVja19iYWxhbmNlOiBpbmNvcnJlY3QgcmV0dXJuIHZhbHVlIG9mIGdldF9lbXB0eV9ub2RlcyIpOworCX0KKyAgICB9CisgIAorICAgIGlmICggKG5fcmV0X3ZhbHVlID0gZ2V0X3BhcmVudHMgKHRiLCBoKSkgIT0gQ0FSUllfT04gKSAvKiBnZXQgcGFyZW50cyBvZiBTW2hdIG5laWdoYm9ycy4gKi8KKwlyZXR1cm4gbl9yZXRfdmFsdWU7CisgIAorICAgIHNmcmVlID0gQl9GUkVFX1NQQUNFIChTaCk7CisKKyAgICAvKiBnZXQgZnJlZSBzcGFjZSBvZiBuZWlnaGJvcnMgKi8KKyAgICByZnJlZSA9IGdldF9yZnJlZSAodGIsIGgpOworICAgIGxmcmVlID0gZ2V0X2xmcmVlICh0YiwgaCk7CisKKyAgICBpZiAoY2FuX25vZGVfYmVfcmVtb3ZlZCAodm4tPnZuX21vZGUsIGxmcmVlLCBzZnJlZSwgcmZyZWUsIHRiLCBoKSA9PSBOT19CQUxBTkNJTkdfTkVFREVEKQorCS8qIGFuZCBuZXcgaXRlbSBmaXRzIGludG8gbm9kZSBTW2hdIHdpdGhvdXQgYW55IHNoaWZ0aW5nICovCisJcmV0dXJuIE5PX0JBTEFOQ0lOR19ORUVERUQ7CisgICAgIAorICAgIGNyZWF0ZV92aXJ0dWFsX25vZGUgKHRiLCBoKTsKKworICAgIC8qCQorCWRldGVybWluZSBtYXhpbWFsIG51bWJlciBvZiBpdGVtcyB3ZSBjYW4gc2hpZnQgdG8gdGhlIGxlZnQgbmVpZ2hib3IgKGluIHRiIHN0cnVjdHVyZSkKKwlhbmQgdGhlIG1heGltYWwgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGZsb3cgdG8gdGhlIGxlZnQgbmVpZ2hib3IKKwlmcm9tIHRoZSBsZWZ0IG1vc3QgbGlxdWlkIGl0ZW0gdGhhdCBjYW5ub3QgYmUgc2hpZnRlZCBmcm9tIFNbMF0gZW50aXJlbHkgKHJldHVybmVkIHZhbHVlKQorICAgICovCisgICAgY2hlY2tfbGVmdCAodGIsIGgsIGxmcmVlKTsKKworICAgIC8qCisgICAgICBkZXRlcm1pbmUgbWF4aW1hbCBudW1iZXIgb2YgaXRlbXMgd2UgY2FuIHNoaWZ0IHRvIHRoZSByaWdodCBuZWlnaGJvciAoaW4gdGIgc3RydWN0dXJlKQorICAgICAgYW5kIHRoZSBtYXhpbWFsIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBmbG93IHRvIHRoZSByaWdodCBuZWlnaGJvcgorICAgICAgZnJvbSB0aGUgcmlnaHQgbW9zdCBsaXF1aWQgaXRlbSB0aGF0IGNhbm5vdCBiZSBzaGlmdGVkIGZyb20gU1swXSBlbnRpcmVseSAocmV0dXJuZWQgdmFsdWUpCisgICAgKi8KKyAgICBjaGVja19yaWdodCAodGIsIGgsIHJmcmVlKTsKKworCisgICAgLyogYWxsIGNvbnRlbnRzIG9mIGludGVybmFsIG5vZGUgU1toXSBjYW4gYmUgbW92ZWQgaW50byBpdHMKKyAgICAgICBuZWlnaGJvcnMsIFNbaF0gd2lsbCBiZSByZW1vdmVkIGFmdGVyIGJhbGFuY2luZyAqLworICAgIGlmIChoICYmICh0Yi0+cm51bVtoXSArIHRiLT5sbnVtW2hdID49IHZuLT52bl9ucl9pdGVtICsgMSkpIHsKKwlpbnQgdG9fcjsgCisgICAgICAgCisJLyogU2luY2Ugd2UgYXJlIHdvcmtpbmcgb24gaW50ZXJuYWwgbm9kZXMsIGFuZCBvdXIgaW50ZXJuYWwKKwkgICBub2RlcyBoYXZlIGZpeGVkIHNpemUgZW50cmllcywgdGhlbiB3ZSBjYW4gYmFsYW5jZSBieSB0aGUKKwkgICBudW1iZXIgb2YgaXRlbXMgcmF0aGVyIHRoYW4gdGhlIHNwYWNlIHRoZXkgY29uc3VtZS4gIEluIHRoaXMKKwkgICByb3V0aW5lIHdlIHNldCB0aGUgbGVmdCBub2RlIGVxdWFsIHRvIHRoZSByaWdodCBub2RlLAorCSAgIGFsbG93aW5nIGEgZGlmZmVyZW5jZSBvZiBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMSBjaGlsZAorCSAgIHBvaW50ZXIuICovCisJdG9fciA9ICgoTUFYX05SX0tFWShTaCk8PDEpKzItdGItPmxudW1baF0tdGItPnJudW1baF0rdm4tPnZuX25yX2l0ZW0rMSkvMiAtIAorCSAgICAoTUFYX05SX0tFWShTaCkgKyAxIC0gdGItPnJudW1baF0pOworCXNldF9wYXJhbWV0ZXJzICh0YiwgaCwgdm4tPnZuX25yX2l0ZW0gKyAxIC0gdG9fciwgdG9fciwgMCwgTlVMTCwgLTEsIC0xKTsKKwlyZXR1cm4gQ0FSUllfT047CisgICAgfQorCisgICAgLyogdGhpcyBjaGVja3MgYmFsYW5jZSBjb25kaXRpb24sIHRoYXQgYW55IHR3byBuZWlnaGJvcmluZyBub2RlcyBjYW4gbm90IGZpdCBpbiBvbmUgbm9kZSAqLworICAgIFJGQUxTRSggaCAmJiAKKwkgICAgKCB0Yi0+bG51bVtoXSA+PSB2bi0+dm5fbnJfaXRlbSArIDEgfHwgCisJICAgICAgdGItPnJudW1baF0gPj0gdm4tPnZuX25yX2l0ZW0gKyAxKSwKKwkgICAgInZzLTgyMjA6IHRyZWUgaXMgbm90IGJhbGFuY2VkIG9uIGludGVybmFsIGxldmVsIik7CisgICAgUkZBTFNFKCAhIGggJiYgKCh0Yi0+bG51bVtoXSA+PSB2bi0+dm5fbnJfaXRlbSAmJiAodGItPmxieXRlcyA9PSAtMSkpIHx8CisJCSAgICAodGItPnJudW1baF0gPj0gdm4tPnZuX25yX2l0ZW0gJiYgKHRiLT5yYnl0ZXMgPT0gLTEpKSApLAorCSAgICAidnMtODIyNTogdHJlZSBpcyBub3QgYmFsYW5jZWQgb24gbGVhZiBsZXZlbCIpOworCisgICAgLyogYWxsIGNvbnRlbnRzIG9mIFNbMF0gY2FuIGJlIG1vdmVkIGludG8gaXRzIG5laWdoYm9ycworICAgICAgIFNbMF0gd2lsbCBiZSByZW1vdmVkIGFmdGVyIGJhbGFuY2luZy4gKi8KKyAgICBpZiAoIWggJiYgaXNfbGVhZl9yZW1vdmFibGUgKHRiKSkKKwlyZXR1cm4gQ0FSUllfT047CisKKworICAgIC8qIHdoeSBkbyB3ZSBwZXJmb3JtIHRoaXMgY2hlY2sgaGVyZSByYXRoZXIgdGhhbiBlYXJsaWVyPz8KKyAgICAgICBBbnN3ZXI6IHdlIGNhbiB3aW4gMSBub2RlIGluIHNvbWUgY2FzZXMgYWJvdmUuIE1vcmVvdmVyIHdlCisgICAgICAgY2hlY2tlZCBpdCBhYm92ZSwgd2hlbiB3ZSBjaGVja2VkLCB0aGF0IFNbMF0gaXMgbm90IHJlbW92YWJsZQorICAgICAgIGluIHByaW5jaXBsZSAqLworICAgIGlmIChzZnJlZSA+PSBsZXZieXRlcykgeyAvKiBuZXcgaXRlbSBmaXRzIGludG8gbm9kZSBTW2hdIHdpdGhvdXQgYW55IHNoaWZ0aW5nICovCisJaWYgKCAhIGggKQorCSAgICB0Yi0+czBudW0gPSB2bi0+dm5fbnJfaXRlbTsKKwlzZXRfcGFyYW1ldGVycyAodGIsIGgsIDAsIDAsIDEsIE5VTEwsIC0xLCAtMSk7CisJcmV0dXJuIE5PX0JBTEFOQ0lOR19ORUVERUQ7CisgICAgfQorCisKKyAgICB7CisJaW50IGxwYXIsIHJwYXIsIG5zZXQsIGxzZXQsIHJzZXQsIGxyc2V0OworCS8qIAorCSAqIHJlZ3VsYXIgb3ZlcmZsb3dpbmcgb2YgdGhlIG5vZGUKKwkgKi8KKworCS8qIGdldF9udW1fdmVyIHdvcmtzIGluIDIgbW9kZXMgKEZMT1cgJiBOT19GTE9XKSAKKwkgICBscGFyLCBycGFyIC0gbnVtYmVyIG9mIGl0ZW1zIHdlIGNhbiBzaGlmdCB0byBsZWZ0L3JpZ2h0IG5laWdoYm9yIChpbmNsdWRpbmcgc3BsaXR0aW5nIGl0ZW0pCisJICAgbnNldCwgbHNldCwgcnNldCwgbHJzZXQgLSBzaG93cywgd2hldGhlciBmbG93aW5nIGl0ZW1zIGdpdmUgYmV0dGVyIHBhY2tpbmcgCisJKi8KKyNkZWZpbmUgRkxPVyAxCisjZGVmaW5lIE5PX0ZMT1cgMAkvKiBkbyBub3QgYW55IHNwbGl0dGluZyAqLworCisJLyogd2UgY2hvb3NlIG9uZSB0aGUgZm9sbG93aW5nICovCisjZGVmaW5lIE5PVEhJTkdfU0hJRlRfTk9fRkxPVwkwCisjZGVmaW5lIE5PVEhJTkdfU0hJRlRfRkxPVwk1CisjZGVmaW5lIExFRlRfU0hJRlRfTk9fRkxPVwkxMAorI2RlZmluZSBMRUZUX1NISUZUX0ZMT1cJCTE1CisjZGVmaW5lIFJJR0hUX1NISUZUX05PX0ZMT1cJMjAKKyNkZWZpbmUgUklHSFRfU0hJRlRfRkxPVwkyNQorI2RlZmluZSBMUl9TSElGVF9OT19GTE9XCTMwCisjZGVmaW5lIExSX1NISUZUX0ZMT1cJCTM1CisKKworCWxwYXIgPSB0Yi0+bG51bVtoXTsKKwlycGFyID0gdGItPnJudW1baF07CisKKworCS8qIGNhbGN1bGF0ZSBudW1iZXIgb2YgYmxvY2tzIFNbaF0gbXVzdCBiZSBzcGxpdCBpbnRvIHdoZW4KKwkgICBub3RoaW5nIGlzIHNoaWZ0ZWQgdG8gdGhlIG5laWdoYm9ycywKKwkgICBhcyB3ZWxsIGFzIG51bWJlciBvZiBpdGVtcyBpbiBlYWNoIHBhcnQgb2YgdGhlIHNwbGl0IG5vZGUgKHMwMTIgbnVtYmVycyksCisJICAgYW5kIG51bWJlciBvZiBieXRlcyAoczFieXRlcykgb2YgdGhlIHNoYXJlZCBkcm9wIHdoaWNoIGZsb3cgdG8gUzEgaWYgYW55ICovCisJbnNldCA9IE5PVEhJTkdfU0hJRlRfTk9fRkxPVzsKKwludmVyID0gZ2V0X251bV92ZXIgKHZuLT52bl9tb2RlLCB0YiwgaCwKKwkJCSAgICAwLCAtMSwgaD92bi0+dm5fbnJfaXRlbTowLCAtMSwgCisJCQkgICAgc251bTAxMiwgTk9fRkxPVyk7CisKKwlpZiAoIWgpCisJeworCSAgICBpbnQgbnZlcjE7CisKKwkgICAgLyogbm90ZSwgdGhhdCBpbiB0aGlzIGNhc2Ugd2UgdHJ5IHRvIGJvdHRsZSBiZXR3ZWVuIFNbMF0gYW5kIFMxIChTMSAtIHRoZSBmaXJzdCBuZXcgbm9kZSkgKi8KKwkgICAgbnZlcjEgPSBnZXRfbnVtX3ZlciAodm4tPnZuX21vZGUsIHRiLCBoLCAKKwkJCQkgMCwgLTEsIDAsIC0xLCAKKwkJCQkgc251bTAxMiArIE5PVEhJTkdfU0hJRlRfRkxPVywgRkxPVyk7CisJICAgIGlmIChudmVyID4gbnZlcjEpCisJCW5zZXQgPSBOT1RISU5HX1NISUZUX0ZMT1csIG52ZXIgPSBudmVyMTsKKwl9CisgICAgICAgCisgCisJLyogY2FsY3VsYXRlIG51bWJlciBvZiBibG9ja3MgU1toXSBtdXN0IGJlIHNwbGl0IGludG8gd2hlbgorCSAgIGxfc2hpZnRfbnVtIGZpcnN0IGl0ZW1zIGFuZCBsX3NoaWZ0X2J5dGVzIG9mIHRoZSByaWdodCBtb3N0CisJICAgbGlxdWlkIGl0ZW0gdG8gYmUgc2hpZnRlZCBhcmUgc2hpZnRlZCB0byB0aGUgbGVmdCBuZWlnaGJvciwKKwkgICBhcyB3ZWxsIGFzIG51bWJlciBvZiBpdGVtcyBpbiBlYWNoIHBhcnQgb2YgdGhlIHNwbGl0dGVkIG5vZGUgKHMwMTIgbnVtYmVycyksCisJICAgYW5kIG51bWJlciBvZiBieXRlcyAoczFieXRlcykgb2YgdGhlIHNoYXJlZCBkcm9wIHdoaWNoIGZsb3cgdG8gUzEgaWYgYW55CisJKi8KKwlsc2V0ID0gTEVGVF9TSElGVF9OT19GTE9XOworCWxudmVyID0gZ2V0X251bV92ZXIgKHZuLT52bl9tb2RlLCB0YiwgaCwgCisJCQkgICAgIGxwYXIgLSAoKCBoIHx8IHRiLT5sYnl0ZXMgPT0gLTEgKSA/IDAgOiAxKSwgLTEsIGggPyB2bi0+dm5fbnJfaXRlbTowLCAtMSwKKwkJCSAgICAgc251bTAxMiArIExFRlRfU0hJRlRfTk9fRkxPVywgTk9fRkxPVyk7CisJaWYgKCFoKQorCXsKKwkgICAgaW50IGxudmVyMTsKKworCSAgICBsbnZlcjEgPSBnZXRfbnVtX3ZlciAodm4tPnZuX21vZGUsIHRiLCBoLCAKKwkJCQkgIGxwYXIgLSAoKHRiLT5sYnl0ZXMgIT0gLTEpID8gMSA6IDApLCB0Yi0+bGJ5dGVzLCAwLCAtMSwKKwkJCQkgIHNudW0wMTIgKyBMRUZUX1NISUZUX0ZMT1csIEZMT1cpOworCSAgICBpZiAobG52ZXIgPiBsbnZlcjEpCisJCWxzZXQgPSBMRUZUX1NISUZUX0ZMT1csIGxudmVyID0gbG52ZXIxOworCX0KKworCisJLyogY2FsY3VsYXRlIG51bWJlciBvZiBibG9ja3MgU1toXSBtdXN0IGJlIHNwbGl0IGludG8gd2hlbgorCSAgIHJfc2hpZnRfbnVtIGZpcnN0IGl0ZW1zIGFuZCByX3NoaWZ0X2J5dGVzIG9mIHRoZSBsZWZ0IG1vc3QKKwkgICBsaXF1aWQgaXRlbSB0byBiZSBzaGlmdGVkIGFyZSBzaGlmdGVkIHRvIHRoZSByaWdodCBuZWlnaGJvciwKKwkgICBhcyB3ZWxsIGFzIG51bWJlciBvZiBpdGVtcyBpbiBlYWNoIHBhcnQgb2YgdGhlIHNwbGl0dGVkIG5vZGUgKHMwMTIgbnVtYmVycyksCisJICAgYW5kIG51bWJlciBvZiBieXRlcyAoczFieXRlcykgb2YgdGhlIHNoYXJlZCBkcm9wIHdoaWNoIGZsb3cgdG8gUzEgaWYgYW55CisJKi8KKwlyc2V0ID0gUklHSFRfU0hJRlRfTk9fRkxPVzsKKwlybnZlciA9IGdldF9udW1fdmVyICh2bi0+dm5fbW9kZSwgdGIsIGgsIAorCQkJICAgICAwLCAtMSwgaCA/ICh2bi0+dm5fbnJfaXRlbS1ycGFyKSA6IChycGFyIC0gKCggdGItPnJieXRlcyAhPSAtMSApID8gMSA6IDApKSwgLTEsIAorCQkJICAgICBzbnVtMDEyICsgUklHSFRfU0hJRlRfTk9fRkxPVywgTk9fRkxPVyk7CisJaWYgKCFoKQorCXsKKwkgICAgaW50IHJudmVyMTsKKworCSAgICBybnZlcjEgPSBnZXRfbnVtX3ZlciAodm4tPnZuX21vZGUsIHRiLCBoLCAKKwkJCQkgIDAsIC0xLCAocnBhciAtICgodGItPnJieXRlcyAhPSAtMSkgPyAxIDogMCkpLCB0Yi0+cmJ5dGVzLCAKKwkJCQkgIHNudW0wMTIgKyBSSUdIVF9TSElGVF9GTE9XLCBGTE9XKTsKKworCSAgICBpZiAocm52ZXIgPiBybnZlcjEpCisJCXJzZXQgPSBSSUdIVF9TSElGVF9GTE9XLCBybnZlciA9IHJudmVyMTsKKwl9CisKKworCS8qIGNhbGN1bGF0ZSBudW1iZXIgb2YgYmxvY2tzIFNbaF0gbXVzdCBiZSBzcGxpdCBpbnRvIHdoZW4KKwkgICBpdGVtcyBhcmUgc2hpZnRlZCBpbiBib3RoIGRpcmVjdGlvbnMsCisJICAgYXMgd2VsbCBhcyBudW1iZXIgb2YgaXRlbXMgaW4gZWFjaCBwYXJ0IG9mIHRoZSBzcGxpdHRlZCBub2RlIChzMDEyIG51bWJlcnMpLAorCSAgIGFuZCBudW1iZXIgb2YgYnl0ZXMgKHMxYnl0ZXMpIG9mIHRoZSBzaGFyZWQgZHJvcCB3aGljaCBmbG93IHRvIFMxIGlmIGFueQorCSovCisJbHJzZXQgPSBMUl9TSElGVF9OT19GTE9XOworCWxybnZlciA9IGdldF9udW1fdmVyICh2bi0+dm5fbW9kZSwgdGIsIGgsIAorCQkJICAgICAgbHBhciAtICgoaCB8fCB0Yi0+bGJ5dGVzID09IC0xKSA/IDAgOiAxKSwgLTEsIGggPyAodm4tPnZuX25yX2l0ZW0tcnBhcik6KHJwYXIgLSAoKHRiLT5yYnl0ZXMgIT0gLTEpID8gMSA6IDApKSwgLTEsCisJCQkgICAgICBzbnVtMDEyICsgTFJfU0hJRlRfTk9fRkxPVywgTk9fRkxPVyk7CisJaWYgKCFoKQorCXsKKwkgICAgaW50IGxybnZlcjE7CisKKwkgICAgbHJudmVyMSA9IGdldF9udW1fdmVyICh2bi0+dm5fbW9kZSwgdGIsIGgsIAorCQkJCSAgIGxwYXIgLSAoKHRiLT5sYnl0ZXMgIT0gLTEpID8gMSA6IDApLCB0Yi0+bGJ5dGVzLCAocnBhciAtICgodGItPnJieXRlcyAhPSAtMSkgPyAxIDogMCkpLCB0Yi0+cmJ5dGVzLAorCQkJCSAgIHNudW0wMTIgKyBMUl9TSElGVF9GTE9XLCBGTE9XKTsKKwkgICAgaWYgKGxybnZlciA+IGxybnZlcjEpCisJCWxyc2V0ID0gTFJfU0hJRlRfRkxPVywgbHJudmVyID0gbHJudmVyMTsKKwl9CisKKworCisJLyogT3VyIGdlbmVyYWwgc2hpZnRpbmcgc3RyYXRlZ3kgaXM6CisJICAgMSkgdG8gbWluaW1pemVkIG51bWJlciBvZiBuZXcgbm9kZXM7CisJICAgMikgdG8gbWluaW1pemVkIG51bWJlciBvZiBuZWlnaGJvcnMgaW52b2x2ZWQgaW4gc2hpZnRpbmc7CisJICAgMykgdG8gbWluaW1pemVkIG51bWJlciBvZiBkaXNrIHJlYWRzOyAqLworCisJLyogd2UgY2FuIHdpbiBUV08gb3IgT05FIG5vZGVzIGJ5IHNoaWZ0aW5nIGluIGJvdGggZGlyZWN0aW9ucyAqLworCWlmIChscm52ZXIgPCBsbnZlciAmJiBscm52ZXIgPCBybnZlcikKKwl7CisJICAgIFJGQUxTRSggaCAmJiAKKwkJICAgICh0Yi0+bG51bVtoXSAhPSAxIHx8IAorCQkgICAgIHRiLT5ybnVtW2hdICE9IDEgfHwgCisJCSAgICAgbHJudmVyICE9IDEgfHwgcm52ZXIgIT0gMiB8fCBsbnZlciAhPSAyIHx8IGggIT0gMSksCisJCSAgICAidnMtODIzMDogYmFkIGgiKTsKKwkgICAgaWYgKGxyc2V0ID09IExSX1NISUZUX0ZMT1cpCisJCXNldF9wYXJhbWV0ZXJzICh0YiwgaCwgdGItPmxudW1baF0sIHRiLT5ybnVtW2hdLCBscm52ZXIsIHNudW0wMTIgKyBscnNldCwKKwkJCQl0Yi0+bGJ5dGVzLCB0Yi0+cmJ5dGVzKTsKKwkgICAgZWxzZQorCQlzZXRfcGFyYW1ldGVycyAodGIsIGgsIHRiLT5sbnVtW2hdIC0gKCh0Yi0+bGJ5dGVzID09IC0xKSA/IDAgOiAxKSwgCisJCQkJdGItPnJudW1baF0gLSAoKHRiLT5yYnl0ZXMgPT0gLTEpID8gMCA6IDEpLCBscm52ZXIsIHNudW0wMTIgKyBscnNldCwgLTEsIC0xKTsKKworCSAgICByZXR1cm4gQ0FSUllfT047CisJfQorCisJLyogaWYgc2hpZnRpbmcgZG9lc24ndCBsZWFkIHRvIGJldHRlciBwYWNraW5nIHRoZW4gZG9uJ3Qgc2hpZnQgKi8KKwlpZiAobnZlciA9PSBscm52ZXIpCisJeworCSAgICBzZXRfcGFyYW1ldGVycyAodGIsIGgsIDAsIDAsIG52ZXIsIHNudW0wMTIgKyBuc2V0LCAtMSwgLTEpOworCSAgICByZXR1cm4gQ0FSUllfT047CisJfQorCisKKwkvKiBub3cgd2Uga25vdyB0aGF0IGZvciBiZXR0ZXIgcGFja2luZyBzaGlmdGluZyBpbiBvbmx5IG9uZQorCSAgIGRpcmVjdGlvbiBlaXRoZXIgdG8gdGhlIGxlZnQgb3IgdG8gdGhlIHJpZ2h0IGlzIHJlcXVpcmVkICovCisKKwkvKiAgaWYgc2hpZnRpbmcgdG8gdGhlIGxlZnQgaXMgYmV0dGVyIHRoYW4gc2hpZnRpbmcgdG8gdGhlIHJpZ2h0ICovCisJaWYgKGxudmVyIDwgcm52ZXIpCisJeworCSAgICBTRVRfUEFSX1NISUZUX0xFRlQ7CisJICAgIHJldHVybiBDQVJSWV9PTjsKKwl9CisKKwkvKiBpZiBzaGlmdGluZyB0byB0aGUgcmlnaHQgaXMgYmV0dGVyIHRoYW4gc2hpZnRpbmcgdG8gdGhlIGxlZnQgKi8KKwlpZiAobG52ZXIgPiBybnZlcikKKwl7CisJICAgIFNFVF9QQVJfU0hJRlRfUklHSFQ7CisJICAgIHJldHVybiBDQVJSWV9PTjsKKwl9CisKKworCS8qIG5vdyBzaGlmdGluZyBpbiBlaXRoZXIgZGlyZWN0aW9uIGdpdmVzIHRoZSBzYW1lIG51bWJlcgorCSAgIG9mIG5vZGVzIGFuZCB3ZSBjYW4gbWFrZSB1c2Ugb2YgdGhlIGNhY2hlZCBuZWlnaGJvcnMgKi8KKwlpZiAoaXNfbGVmdF9uZWlnaGJvcl9pbl9jYWNoZSAodGIsaCkpCisJeworCSAgICBTRVRfUEFSX1NISUZUX0xFRlQ7CisJICAgIHJldHVybiBDQVJSWV9PTjsKKwl9CisKKwkvKiBzaGlmdCB0byB0aGUgcmlnaHQgaW5kZXBlbmRlbnRseSBvbiB3aGV0aGVyIHRoZSByaWdodCBuZWlnaGJvciBpbiBjYWNoZSBvciBub3QgKi8KKwlTRVRfUEFSX1NISUZUX1JJR0hUOworCXJldHVybiBDQVJSWV9PTjsKKyAgICB9Cit9CisKKworLyogQ2hlY2sgd2hldGhlciBjdXJyZW50IG5vZGUgU1toXSBpcyBiYWxhbmNlZCB3aGVuIERlY3JlYXNpbmcgaXRzIHNpemUgYnkKKyAqIERlbGV0aW5nIG9yIEN1dHRpbmcgZm9yIElOVEVSTkFMIG5vZGUgb2YgUyt0cmVlLgorICogQ2FsY3VsYXRlIHBhcmFtZXRlcnMgZm9yIGJhbGFuY2luZyBmb3IgY3VycmVudCBsZXZlbCBoLgorICogUGFyYW1ldGVyczoKKyAqCXRiCXRyZWVfYmFsYW5jZSBzdHJ1Y3R1cmU7CisgKgloCWN1cnJlbnQgbGV2ZWwgb2YgdGhlIG5vZGU7CisgKglpbnVtCWl0ZW0gbnVtYmVyIGluIFNbaF07CisgKgltb2RlCWkgLSBpbnNlcnQsIHAgLSBwYXN0ZTsKKyAqIFJldHVybnM6CTEgLSBzY2hlZHVsZSBvY2N1cnJlZDsgCisgKgkgICAgICAgIDAgLSBiYWxhbmNpbmcgZm9yIGhpZ2hlciBsZXZlbHMgbmVlZGVkOworICoJICAgICAgIC0xIC0gbm8gYmFsYW5jaW5nIGZvciBoaWdoZXIgbGV2ZWxzIG5lZWRlZDsKKyAqCSAgICAgICAtMiAtIG5vIGRpc2sgc3BhY2UuCisgKgorICogTm90ZTogSXRlbXMgb2YgaW50ZXJuYWwgbm9kZXMgaGF2ZSBmaXhlZCBzaXplLCBzbyB0aGUgYmFsYW5jZSBjb25kaXRpb24gZm9yCisgKiB0aGUgaW50ZXJuYWwgcGFydCBvZiBTK3RyZWUgaXMgYXMgZm9yIHRoZSBCLXRyZWVzLgorICovCitzdGF0aWMgaW50IGRjX2NoZWNrX2JhbGFuY2VfaW50ZXJuYWwgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IGgpCit7CisgIHN0cnVjdCB2aXJ0dWFsX25vZGUgKiB2biA9IHRiLT50Yl92bjsKKworICAvKiBTaCBpcyB0aGUgbm9kZSB3aG9zZSBiYWxhbmNlIGlzIGN1cnJlbnRseSBiZWluZyBjaGVja2VkLAorICAgICBhbmQgRmggaXMgaXRzIGZhdGhlci4gICovCisgIHN0cnVjdCBidWZmZXJfaGVhZCAqIFNoLCAqIEZoOworICBpbnQgbWF4c2l6ZSwKKyAgICAgIG5fcmV0X3ZhbHVlOworICBpbnQgbGZyZWUsIHJmcmVlIC8qIGZyZWUgc3BhY2UgaW4gTCBhbmQgUiAqLzsKKworICBTaCA9IFBBVEhfSF9QQlVGRkVSICh0Yi0+dGJfcGF0aCwgaCk7IAorICBGaCA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgaCk7IAorCisgIG1heHNpemUgPSBNQVhfQ0hJTERfU0laRShTaCk7IAorCisvKiAgIHVzaW5nIHRiLT5pbnNlcnRfc2l6ZVtoXSwgd2hpY2ggaXMgbmVnYXRpdmUgaW4gdGhpcyBjYXNlLCBjcmVhdGVfdmlydHVhbF9ub2RlIGNhbGN1bGF0ZXM6ICovCisvKiAgIG5ld19ucl9pdGVtID0gbnVtYmVyIG9mIGl0ZW1zIG5vZGUgd291bGQgaGF2ZSBpZiBvcGVyYXRpb24gaXMgKi8KKy8qIAlwZXJmb3JtZWQgd2l0aG91dCBiYWxhbmNpbmcgKG5ld19ucl9pdGVtKTsgKi8KKyAgY3JlYXRlX3ZpcnR1YWxfbm9kZSAodGIsIGgpOworCisgIGlmICggISBGaCApCisgICAgeyAgIC8qIFNbaF0gaXMgdGhlIHJvb3QuICovCisgICAgICBpZiAoIHZuLT52bl9ucl9pdGVtID4gMCApCisJeworCSAgc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCAwLCAwLCAxLCBOVUxMLCAtMSwgLTEpOworCSAgcmV0dXJuIE5PX0JBTEFOQ0lOR19ORUVERUQ7IC8qIG5vIGJhbGFuY2luZyBmb3IgaGlnaGVyIGxldmVscyBuZWVkZWQgKi8KKwl9CisgICAgICAvKiBuZXdfbnJfaXRlbSA9PSAwLgorICAgICAgICogQ3VycmVudCByb290IHdpbGwgYmUgZGVsZXRlZCByZXN1bHRpbmcgaW4KKyAgICAgICAqIGRlY3JlbWVudGluZyB0aGUgdHJlZSBoZWlnaHQuICovCisgICAgICBzZXRfcGFyYW1ldGVycyAodGIsIGgsIDAsIDAsIDAsIE5VTEwsIC0xLCAtMSk7CisgICAgICByZXR1cm4gQ0FSUllfT047CisgICAgfQorCisgIGlmICggKG5fcmV0X3ZhbHVlID0gZ2V0X3BhcmVudHModGIsaCkpICE9IENBUlJZX09OICkKKyAgICByZXR1cm4gbl9yZXRfdmFsdWU7CisKKworICAvKiBnZXQgZnJlZSBzcGFjZSBvZiBuZWlnaGJvcnMgKi8KKyAgcmZyZWUgPSBnZXRfcmZyZWUgKHRiLCBoKTsKKyAgbGZyZWUgPSBnZXRfbGZyZWUgKHRiLCBoKTsKKwkJCisgIC8qIGRldGVybWluZSBtYXhpbWFsIG51bWJlciBvZiBpdGVtcyB3ZSBjYW4gZml0IGludG8gbmVpZ2hib3JzICovCisgIGNoZWNrX2xlZnQgKHRiLCBoLCBsZnJlZSk7CisgIGNoZWNrX3JpZ2h0ICh0YiwgaCwgcmZyZWUpOworCisKKyAgaWYgKCB2bi0+dm5fbnJfaXRlbSA+PSBNSU5fTlJfS0VZKFNoKSApCisgICAgeyAvKiBCYWxhbmNlIGNvbmRpdGlvbiBmb3IgdGhlIGludGVybmFsIG5vZGUgaXMgdmFsaWQuCisgICAgICAgKiBJbiB0aGlzIGNhc2Ugd2UgYmFsYW5jZSBvbmx5IGlmIGl0IGxlYWRzIHRvIGJldHRlciBwYWNraW5nLiAqLyAKKyAgICAgIGlmICggdm4tPnZuX25yX2l0ZW0gPT0gTUlOX05SX0tFWShTaCkgKQorCXsgLyogSGVyZSB3ZSBqb2luIFNbaF0gd2l0aCBvbmUgb2YgaXRzIG5laWdoYm9ycywKKwkgICAqIHdoaWNoIGlzIGltcG9zc2libGUgd2l0aCBncmVhdGVyIHZhbHVlcyBvZiBuZXdfbnJfaXRlbS4gKi8KKwkgIGlmICggdGItPmxudW1baF0gPj0gdm4tPnZuX25yX2l0ZW0gKyAxICkKKwkgICAgeworCSAgICAgIC8qIEFsbCBjb250ZW50cyBvZiBTW2hdIGNhbiBiZSBtb3ZlZCB0byBMW2hdLiAqLworCSAgICAgIGludCBuOworCSAgICAgIGludCBvcmRlcl9MOworCSAgICAgIAorCSAgICAgIG9yZGVyX0wgPSAoKG49UEFUSF9IX0JfSVRFTV9PUkRFUih0Yi0+dGJfcGF0aCwgaCkpPT0wKSA/IEJfTlJfSVRFTVModGItPkZMW2hdKSA6IG4gLSAxOworCSAgICAgIG4gPSBkY19zaXplKEJfTl9DSElMRCh0Yi0+RkxbaF0sb3JkZXJfTCkpIC8gKERDX1NJWkUgKyBLRVlfU0laRSk7CisJICAgICAgc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCAtbi0xLCAwLCAwLCBOVUxMLCAtMSwgLTEpOworCSAgICAgIHJldHVybiBDQVJSWV9PTjsKKwkgICAgfQorCisJICBpZiAoIHRiLT5ybnVtW2hdID49IHZuLT52bl9ucl9pdGVtICsgMSApCisJICAgIHsKKwkgICAgICAvKiBBbGwgY29udGVudHMgb2YgU1toXSBjYW4gYmUgbW92ZWQgdG8gUltoXS4gKi8KKwkgICAgICBpbnQgbjsKKwkgICAgICBpbnQgb3JkZXJfUjsKKwkgICAgCisJICAgICAgb3JkZXJfUiA9ICgobj1QQVRIX0hfQl9JVEVNX09SREVSKHRiLT50Yl9wYXRoLCBoKSk9PUJfTlJfSVRFTVMoRmgpKSA/IDAgOiBuICsgMTsKKwkgICAgICBuID0gZGNfc2l6ZShCX05fQ0hJTEQodGItPkZSW2hdLG9yZGVyX1IpKSAvIChEQ19TSVpFICsgS0VZX1NJWkUpOworCSAgICAgIHNldF9wYXJhbWV0ZXJzICh0YiwgaCwgMCwgLW4tMSwgMCwgTlVMTCwgLTEsIC0xKTsKKwkgICAgICByZXR1cm4gQ0FSUllfT047ICAgCisJICAgIH0KKwl9CisKKyAgICAgIGlmICh0Yi0+cm51bVtoXSArIHRiLT5sbnVtW2hdID49IHZuLT52bl9ucl9pdGVtICsgMSkKKwl7CisJICAvKiBBbGwgY29udGVudHMgb2YgU1toXSBjYW4gYmUgbW92ZWQgdG8gdGhlIG5laWdoYm9ycyAoTFtoXSAmIFJbaF0pLiAqLworCSAgaW50IHRvX3I7CisKKwkgIHRvX3IgPSAoKE1BWF9OUl9LRVkoU2gpPDwxKSsyLXRiLT5sbnVtW2hdLXRiLT5ybnVtW2hdK3ZuLT52bl9ucl9pdGVtKzEpLzIgLSAKKwkgICAgKE1BWF9OUl9LRVkoU2gpICsgMSAtIHRiLT5ybnVtW2hdKTsKKwkgIHNldF9wYXJhbWV0ZXJzICh0YiwgaCwgdm4tPnZuX25yX2l0ZW0gKyAxIC0gdG9fciwgdG9fciwgMCwgTlVMTCwgLTEsIC0xKTsKKwkgIHJldHVybiBDQVJSWV9PTjsKKwl9CisKKyAgICAgIC8qIEJhbGFuY2luZyBkb2VzIG5vdCBsZWFkIHRvIGJldHRlciBwYWNraW5nLiAqLworICAgICAgc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCAwLCAwLCAxLCBOVUxMLCAtMSwgLTEpOworICAgICAgcmV0dXJuIE5PX0JBTEFOQ0lOR19ORUVERUQ7CisgICAgfQorCisgIC8qIEN1cnJlbnQgbm9kZSBjb250YWluIGluc3VmZmljaWVudCBudW1iZXIgb2YgaXRlbXMuIEJhbGFuY2luZyBpcyByZXF1aXJlZC4gKi8JCisgIC8qIENoZWNrIHdoZXRoZXIgd2UgY2FuIG1lcmdlIFNbaF0gd2l0aCBsZWZ0IG5laWdoYm9yLiAqLworICBpZiAodGItPmxudW1baF0gPj0gdm4tPnZuX25yX2l0ZW0gKyAxKQorICAgIGlmIChpc19sZWZ0X25laWdoYm9yX2luX2NhY2hlICh0YixoKSB8fCB0Yi0+cm51bVtoXSA8IHZuLT52bl9ucl9pdGVtICsgMSB8fCAhdGItPkZSW2hdKQorICAgICAgeworCWludCBuOworCWludCBvcmRlcl9MOworCSAgICAgIAorCW9yZGVyX0wgPSAoKG49UEFUSF9IX0JfSVRFTV9PUkRFUih0Yi0+dGJfcGF0aCwgaCkpPT0wKSA/IEJfTlJfSVRFTVModGItPkZMW2hdKSA6IG4gLSAxOworCW4gPSBkY19zaXplKEJfTl9DSElMRCh0Yi0+RkxbaF0sb3JkZXJfTCkpIC8gKERDX1NJWkUgKyBLRVlfU0laRSk7CisJc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCAtbi0xLCAwLCAwLCBOVUxMLCAtMSwgLTEpOworCXJldHVybiBDQVJSWV9PTjsKKyAgICAgIH0KKworICAvKiBDaGVjayB3aGV0aGVyIHdlIGNhbiBtZXJnZSBTW2hdIHdpdGggcmlnaHQgbmVpZ2hib3IuICovCisgIGlmICh0Yi0+cm51bVtoXSA+PSB2bi0+dm5fbnJfaXRlbSArIDEpCisgICAgeworICAgICAgaW50IG47CisgICAgICBpbnQgb3JkZXJfUjsKKwkgICAgCisgICAgICBvcmRlcl9SID0gKChuPVBBVEhfSF9CX0lURU1fT1JERVIodGItPnRiX3BhdGgsIGgpKT09Ql9OUl9JVEVNUyhGaCkpID8gMCA6IChuICsgMSk7CisgICAgICBuID0gZGNfc2l6ZShCX05fQ0hJTEQodGItPkZSW2hdLG9yZGVyX1IpKSAvIChEQ19TSVpFICsgS0VZX1NJWkUpOworICAgICAgc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCAwLCAtbi0xLCAwLCBOVUxMLCAtMSwgLTEpOworICAgICAgcmV0dXJuIENBUlJZX09OOyAgIAorICAgIH0KKworICAvKiBBbGwgY29udGVudHMgb2YgU1toXSBjYW4gYmUgbW92ZWQgdG8gdGhlIG5laWdoYm9ycyAoTFtoXSAmIFJbaF0pLiAqLworICBpZiAodGItPnJudW1baF0gKyB0Yi0+bG51bVtoXSA+PSB2bi0+dm5fbnJfaXRlbSArIDEpCisgICAgeworICAgICAgaW50IHRvX3I7CisJICAgIAorICAgICAgdG9fciA9ICgoTUFYX05SX0tFWShTaCk8PDEpKzItdGItPmxudW1baF0tdGItPnJudW1baF0rdm4tPnZuX25yX2l0ZW0rMSkvMiAtIAorCShNQVhfTlJfS0VZKFNoKSArIDEgLSB0Yi0+cm51bVtoXSk7CisgICAgICBzZXRfcGFyYW1ldGVycyAodGIsIGgsIHZuLT52bl9ucl9pdGVtICsgMSAtIHRvX3IsIHRvX3IsIDAsIE5VTEwsIC0xLCAtMSk7CisgICAgICByZXR1cm4gQ0FSUllfT047CisgICAgfQorCisgIC8qIEZvciBpbnRlcm5hbCBub2RlcyB0cnkgdG8gYm9ycm93IGl0ZW0gZnJvbSBhIG5laWdoYm9yICovCisgIFJGQUxTRSggIXRiLT5GTFtoXSAmJiAhdGItPkZSW2hdLCAidnMtODIzNTogdHJ5aW5nIHRvIGJvcnJvdyBmb3Igcm9vdCIpOworCisgIC8qIEJvcnJvdyBvbmUgb3IgdHdvIGl0ZW1zIGZyb20gY2FjaGluZyBuZWlnaGJvciAqLworICBpZiAoaXNfbGVmdF9uZWlnaGJvcl9pbl9jYWNoZSAodGIsaCkgfHwgIXRiLT5GUltoXSkKKyAgICB7CisgICAgICBpbnQgZnJvbV9sOworCQkKKyAgICAgIGZyb21fbCA9IChNQVhfTlJfS0VZKFNoKSArIDEgLSB0Yi0+bG51bVtoXSArIHZuLT52bl9ucl9pdGVtICsgMSkgLyAyIC0gICh2bi0+dm5fbnJfaXRlbSArIDEpOworICAgICAgc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCAtZnJvbV9sLCAwLCAxLCBOVUxMLCAtMSwgLTEpOworICAgICAgcmV0dXJuIENBUlJZX09OOworICAgIH0KKworICBzZXRfcGFyYW1ldGVycyAodGIsIGgsIDAsIC0oKE1BWF9OUl9LRVkoU2gpKzEtdGItPnJudW1baF0rdm4tPnZuX25yX2l0ZW0rMSkvMi0odm4tPnZuX25yX2l0ZW0rMSkpLCAxLCAKKwkJICBOVUxMLCAtMSwgLTEpOworICByZXR1cm4gQ0FSUllfT047Cit9CisKKworLyogQ2hlY2sgd2hldGhlciBjdXJyZW50IG5vZGUgU1toXSBpcyBiYWxhbmNlZCB3aGVuIERlY3JlYXNpbmcgaXRzIHNpemUgYnkKKyAqIERlbGV0aW5nIG9yIFRydW5jYXRpbmcgZm9yIExFQUYgbm9kZSBvZiBTK3RyZWUuCisgKiBDYWxjdWxhdGUgcGFyYW1ldGVycyBmb3IgYmFsYW5jaW5nIGZvciBjdXJyZW50IGxldmVsIGguCisgKiBQYXJhbWV0ZXJzOgorICoJdGIJdHJlZV9iYWxhbmNlIHN0cnVjdHVyZTsKKyAqCWgJY3VycmVudCBsZXZlbCBvZiB0aGUgbm9kZTsKKyAqCWludW0JaXRlbSBudW1iZXIgaW4gU1toXTsKKyAqCW1vZGUJaSAtIGluc2VydCwgcCAtIHBhc3RlOworICogUmV0dXJuczoJMSAtIHNjaGVkdWxlIG9jY3VycmVkOyAKKyAqCSAgICAgICAgMCAtIGJhbGFuY2luZyBmb3IgaGlnaGVyIGxldmVscyBuZWVkZWQ7CisgKgkgICAgICAgLTEgLSBubyBiYWxhbmNpbmcgZm9yIGhpZ2hlciBsZXZlbHMgbmVlZGVkOworICoJICAgICAgIC0yIC0gbm8gZGlzayBzcGFjZS4KKyAqLworc3RhdGljIGludCBkY19jaGVja19iYWxhbmNlX2xlYWYgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IGgpCit7CisgIHN0cnVjdCB2aXJ0dWFsX25vZGUgKiB2biA9IHRiLT50Yl92bjsKKworICAvKiBOdW1iZXIgb2YgYnl0ZXMgdGhhdCBtdXN0IGJlIGRlbGV0ZWQgZnJvbQorICAgICAodmFsdWUgaXMgbmVnYXRpdmUgaWYgYnl0ZXMgYXJlIGRlbGV0ZWQpIGJ1ZmZlciB3aGljaAorICAgICBjb250YWlucyBub2RlIGJlaW5nIGJhbGFuY2VkLiAgVGhlIG1uZW1vbmljIGlzIHRoYXQgdGhlCisgICAgIGF0dGVtcHRlZCBjaGFuZ2UgaW4gbm9kZSBzcGFjZSB1c2VkIGxldmVsIGlzIGxldmJ5dGVzIGJ5dGVzLiAqLworICBpbnQgbGV2Ynl0ZXM7CisgIC8qIHRoZSBtYXhpbWFsIGl0ZW0gc2l6ZSAqLworICBpbnQgbWF4c2l6ZSwKKyAgICAgIG5fcmV0X3ZhbHVlOworICAvKiBTMCBpcyB0aGUgbm9kZSB3aG9zZSBiYWxhbmNlIGlzIGN1cnJlbnRseSBiZWluZyBjaGVja2VkLAorICAgICBhbmQgRjAgaXMgaXRzIGZhdGhlci4gICovCisgIHN0cnVjdCBidWZmZXJfaGVhZCAqIFMwLCAqIEYwOworICBpbnQgbGZyZWUsIHJmcmVlIC8qIGZyZWUgc3BhY2UgaW4gTCBhbmQgUiAqLzsKKworICBTMCA9IFBBVEhfSF9QQlVGRkVSICh0Yi0+dGJfcGF0aCwgMCk7CisgIEYwID0gUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCAwKTsKKworICBsZXZieXRlcyA9IHRiLT5pbnNlcnRfc2l6ZVtoXTsKKworICBtYXhzaXplID0gTUFYX0NISUxEX1NJWkUoUzApOyAJLyogbWF4aW1hbCBwb3NzaWJsZSBzaXplIG9mIGFuIGl0ZW0gKi8KKworICBpZiAoICEgRjAgKQorICAgIHsgIC8qIFNbMF0gaXMgdGhlIHJvb3Qgbm93LiAqLworCisgICAgICBSRkFMU0UoIC1sZXZieXRlcyA+PSBtYXhzaXplIC0gQl9GUkVFX1NQQUNFIChTMCksCisJICAgICAgInZzLTgyNDA6IGF0dGVtcHQgdG8gY3JlYXRlIGVtcHR5IGJ1ZmZlciB0cmVlIik7CisKKyAgICAgIHNldF9wYXJhbWV0ZXJzICh0YiwgaCwgMCwgMCwgMSwgTlVMTCwgLTEsIC0xKTsKKyAgICAgIHJldHVybiBOT19CQUxBTkNJTkdfTkVFREVEOworICAgIH0KKworICBpZiAoIChuX3JldF92YWx1ZSA9IGdldF9wYXJlbnRzKHRiLGgpKSAhPSBDQVJSWV9PTiApCisgICAgcmV0dXJuIG5fcmV0X3ZhbHVlOworCisgIC8qIGdldCBmcmVlIHNwYWNlIG9mIG5laWdoYm9ycyAqLworICByZnJlZSA9IGdldF9yZnJlZSAodGIsIGgpOworICBsZnJlZSA9IGdldF9sZnJlZSAodGIsIGgpOwkJCisKKyAgY3JlYXRlX3ZpcnR1YWxfbm9kZSAodGIsIGgpOworCisgIC8qIGlmIDMgbGVhdmVzIGNhbiBiZSBtZXJnZSB0byBvbmUsIHNldCBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gKi8KKyAgaWYgKGFyZV9sZWF2ZXNfcmVtb3ZhYmxlICh0YiwgbGZyZWUsIHJmcmVlKSkKKyAgICByZXR1cm4gQ0FSUllfT047CisKKyAgLyogZGV0ZXJtaW5lIG1heGltYWwgbnVtYmVyIG9mIGl0ZW1zIHdlIGNhbiBzaGlmdCB0byB0aGUgbGVmdC9yaWdodCAgbmVpZ2hib3IKKyAgICAgYW5kIHRoZSBtYXhpbWFsIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBmbG93IHRvIHRoZSBsZWZ0L3JpZ2h0IG5laWdoYm9yCisgICAgIGZyb20gdGhlIGxlZnQvcmlnaHQgbW9zdCBsaXF1aWQgaXRlbSB0aGF0IGNhbm5vdCBiZSBzaGlmdGVkIGZyb20gU1swXSBlbnRpcmVseQorICAgICAqLworICBjaGVja19sZWZ0ICh0YiwgaCwgbGZyZWUpOworICBjaGVja19yaWdodCAodGIsIGgsIHJmcmVlKTsgICAKKworICAvKiBjaGVjayB3aGV0aGVyIHdlIGNhbiBtZXJnZSBTIHdpdGggbGVmdCBuZWlnaGJvci4gKi8KKyAgaWYgKHRiLT5sbnVtWzBdID49IHZuLT52bl9ucl9pdGVtICYmIHRiLT5sYnl0ZXMgPT0gLTEpCisgICAgaWYgKGlzX2xlZnRfbmVpZ2hib3JfaW5fY2FjaGUgKHRiLGgpIHx8CisJKCh0Yi0+cm51bVswXSAtICgodGItPnJieXRlcyA9PSAtMSkgPyAwIDogMSkpIDwgdm4tPnZuX25yX2l0ZW0pIHx8IC8qIFMgY2FuIG5vdCBiZSBtZXJnZWQgd2l0aCBSICovCisJIXRiLT5GUltoXSkgeworICAgICAgCisgICAgICBSRkFMU0UoICF0Yi0+RkxbaF0sICJ2cy04MjQ1OiBkY19jaGVja19iYWxhbmNlX2xlYWY6IEZMW2hdIG11c3QgZXhpc3QiKTsKKworICAgICAgLyogc2V0IHBhcmFtZXRlciB0byBtZXJnZSBTWzBdIHdpdGggaXRzIGxlZnQgbmVpZ2hib3IgKi8KKyAgICAgIHNldF9wYXJhbWV0ZXJzICh0YiwgaCwgLTEsIDAsIDAsIE5VTEwsIC0xLCAtMSk7CisgICAgICByZXR1cm4gQ0FSUllfT047CisgICAgfQorCisgIC8qIGNoZWNrIHdoZXRoZXIgd2UgY2FuIG1lcmdlIFNbMF0gd2l0aCByaWdodCBuZWlnaGJvci4gKi8KKyAgaWYgKHRiLT5ybnVtWzBdID49IHZuLT52bl9ucl9pdGVtICYmIHRiLT5yYnl0ZXMgPT0gLTEpIHsKKyAgICBzZXRfcGFyYW1ldGVycyAodGIsIGgsIDAsIC0xLCAwLCBOVUxMLCAtMSwgLTEpOworICAgIHJldHVybiBDQVJSWV9PTjsKKyAgfQorICAKKyAgLyogQWxsIGNvbnRlbnRzIG9mIFNbMF0gY2FuIGJlIG1vdmVkIHRvIHRoZSBuZWlnaGJvcnMgKExbMF0gJiBSWzBdKS4gU2V0IHBhcmFtZXRlcnMgYW5kIHJldHVybiAqLworICBpZiAoaXNfbGVhZl9yZW1vdmFibGUgKHRiKSkKKyAgICByZXR1cm4gQ0FSUllfT047CisgIAorICAvKiBCYWxhbmNpbmcgaXMgbm90IHJlcXVpcmVkLiAqLworICB0Yi0+czBudW0gPSB2bi0+dm5fbnJfaXRlbTsKKyAgc2V0X3BhcmFtZXRlcnMgKHRiLCBoLCAwLCAwLCAxLCBOVUxMLCAtMSwgLTEpOworICByZXR1cm4gTk9fQkFMQU5DSU5HX05FRURFRDsKK30KKworCisKKy8qIENoZWNrIHdoZXRoZXIgY3VycmVudCBub2RlIFNbaF0gaXMgYmFsYW5jZWQgd2hlbiBEZWNyZWFzaW5nIGl0cyBzaXplIGJ5CisgKiBEZWxldGluZyBvciBDdXR0aW5nLgorICogQ2FsY3VsYXRlIHBhcmFtZXRlcnMgZm9yIGJhbGFuY2luZyBmb3IgY3VycmVudCBsZXZlbCBoLgorICogUGFyYW1ldGVyczoKKyAqCXRiCXRyZWVfYmFsYW5jZSBzdHJ1Y3R1cmU7CisgKgloCWN1cnJlbnQgbGV2ZWwgb2YgdGhlIG5vZGU7CisgKglpbnVtCWl0ZW0gbnVtYmVyIGluIFNbaF07CisgKgltb2RlCWQgLSBkZWxldGUsIGMgLSBjdXQuCisgKiBSZXR1cm5zOgkxIC0gc2NoZWR1bGUgb2NjdXJyZWQ7IAorICoJICAgICAgICAwIC0gYmFsYW5jaW5nIGZvciBoaWdoZXIgbGV2ZWxzIG5lZWRlZDsKKyAqCSAgICAgICAtMSAtIG5vIGJhbGFuY2luZyBmb3IgaGlnaGVyIGxldmVscyBuZWVkZWQ7CisgKgkgICAgICAgLTIgLSBubyBkaXNrIHNwYWNlLgorICovCitzdGF0aWMgaW50IGRjX2NoZWNrX2JhbGFuY2UgKHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgaW50IGgpCit7CisgUkZBTFNFKCAhIChQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpKSwgInZzLTgyNTA6IFMgaXMgbm90IGluaXRpYWxpemVkIik7CisKKyBpZiAoIGggKQorICAgcmV0dXJuIGRjX2NoZWNrX2JhbGFuY2VfaW50ZXJuYWwgKHRiLCBoKTsKKyBlbHNlCisgICByZXR1cm4gZGNfY2hlY2tfYmFsYW5jZV9sZWFmICh0YiwgaCk7Cit9CisKKworCisvKiBDaGVjayB3aGV0aGVyIGN1cnJlbnQgbm9kZSBTW2hdIGlzIGJhbGFuY2VkLgorICogQ2FsY3VsYXRlIHBhcmFtZXRlcnMgZm9yIGJhbGFuY2luZyBmb3IgY3VycmVudCBsZXZlbCBoLgorICogUGFyYW1ldGVyczoKKyAqCisgKgl0Ygl0cmVlX2JhbGFuY2Ugc3RydWN0dXJlOgorICoKKyAqICAgICAgICAgICAgICB0YiBpcyBhIGxhcmdlIHN0cnVjdHVyZSB0aGF0IG11c3QgYmUgcmVhZCBhYm91dCBpbiB0aGUgaGVhZGVyIGZpbGUKKyAqICAgICAgICAgICAgICBhdCB0aGUgc2FtZSB0aW1lIGFzIHRoaXMgcHJvY2VkdXJlIGlmIHRoZSByZWFkZXIgaXMgdG8gc3VjY2Vzc2Z1bGx5CisgKiAgICAgICAgICAgICAgdW5kZXJzdGFuZCB0aGlzIHByb2NlZHVyZQorICoKKyAqCWgJY3VycmVudCBsZXZlbCBvZiB0aGUgbm9kZTsKKyAqCWludW0JaXRlbSBudW1iZXIgaW4gU1toXTsKKyAqCW1vZGUJaSAtIGluc2VydCwgcCAtIHBhc3RlLCBkIC0gZGVsZXRlLCBjIC0gY3V0LgorICogUmV0dXJuczoJMSAtIHNjaGVkdWxlIG9jY3VycmVkOyAKKyAqCSAgICAgICAgMCAtIGJhbGFuY2luZyBmb3IgaGlnaGVyIGxldmVscyBuZWVkZWQ7CisgKgkgICAgICAgLTEgLSBubyBiYWxhbmNpbmcgZm9yIGhpZ2hlciBsZXZlbHMgbmVlZGVkOworICoJICAgICAgIC0yIC0gbm8gZGlzayBzcGFjZS4KKyAqLworc3RhdGljIGludCBjaGVja19iYWxhbmNlIChpbnQgbW9kZSwgCisJCQkgIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwKKwkJCSAgaW50IGgsIAorCQkJICBpbnQgaW51bSwKKwkJCSAgaW50IHBvc19pbl9pdGVtLAorCQkJICBzdHJ1Y3QgaXRlbV9oZWFkICogaW5zX2loLAorCQkJICBjb25zdCB2b2lkICogZGF0YQorCQkJICApCit7CisgIHN0cnVjdCB2aXJ0dWFsX25vZGUgKiB2bjsKKworICB2biA9IHRiLT50Yl92biA9IChzdHJ1Y3QgdmlydHVhbF9ub2RlICopKHRiLT52bl9idWYpOworICB2bi0+dm5fZnJlZV9wdHIgPSAoY2hhciAqKSh0Yi0+dGJfdm4gKyAxKTsKKyAgdm4tPnZuX21vZGUgPSBtb2RlOworICB2bi0+dm5fYWZmZWN0ZWRfaXRlbV9udW0gPSBpbnVtOworICB2bi0+dm5fcG9zX2luX2l0ZW0gPSBwb3NfaW5faXRlbTsKKyAgdm4tPnZuX2luc19paCA9IGluc19paDsKKyAgdm4tPnZuX2RhdGEgPSBkYXRhOworCisgIFJGQUxTRSggbW9kZSA9PSBNX0lOU0VSVCAmJiAhdm4tPnZuX2luc19paCwKKwkgICJ2cy04MjU1OiBpbnNfaWggY2FuIG5vdCBiZSAwIGluIGluc2VydCBtb2RlIik7CisKKyBpZiAoIHRiLT5pbnNlcnRfc2l6ZVtoXSA+IDAgKQorICAgLyogQ2FsY3VsYXRlIGJhbGFuY2UgcGFyYW1ldGVycyB3aGVuIHNpemUgb2Ygbm9kZSBpcyBpbmNyZWFzaW5nLiAqLworICAgcmV0dXJuIGlwX2NoZWNrX2JhbGFuY2UgKHRiLCBoKTsKKworIC8qIENhbGN1bGF0ZSBiYWxhbmNlIHBhcmFtZXRlcnMgd2hlbiAgc2l6ZSBvZiBub2RlIGlzIGRlY3JlYXNpbmcuICovCisgcmV0dXJuIGRjX2NoZWNrX2JhbGFuY2UgKHRiLCBoKTsKK30KKworCisKKy8qIENoZWNrIHdoZXRoZXIgcGFyZW50IGF0IHRoZSBwYXRoIGlzIHRoZSByZWFsbHkgcGFyZW50IG9mIHRoZSBjdXJyZW50IG5vZGUuKi8KK3N0YXRpYyBpbnQgIGdldF9kaXJlY3RfcGFyZW50KAorICAgICAgICAgICAgICBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogcF9zX3RiLAorICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgbl9oCisgICAgICAgICAgICApIHsKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgICogcF9zX2JoOworICAgIHN0cnVjdCBwYXRoICAgICAgICAgKiBwX3NfcGF0aCAgICAgID0gcF9zX3RiLT50Yl9wYXRoOworICAgIGludCAgICAgICAgICAgICAgICAgICBuX3Bvc2l0aW9uLAorCW5fcGF0aF9vZmZzZXQgPSBQQVRIX0hfUEFUSF9PRkZTRVQocF9zX3RiLT50Yl9wYXRoLCBuX2gpOworICAgIAorICAgIC8qIFdlIGFyZSBpbiB0aGUgcm9vdCBvciBpbiB0aGUgbmV3IHJvb3QuICovCisgICAgaWYgKCBuX3BhdGhfb2Zmc2V0IDw9IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQgKSB7CisJCisJUkZBTFNFKCBuX3BhdGhfb2Zmc2V0IDwgRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCAtIDEsCisJCSJQQVAtODI2MDogaW52YWxpZCBvZmZzZXQgaW4gdGhlIHBhdGgiKTsKKworCWlmICggUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfcGF0aCwgRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCktPmJfYmxvY2tuciA9PQorCSAgICAgU0JfUk9PVF9CTE9DSyAocF9zX3RiLT50Yl9zYikgKSB7CisJICAgIC8qIFJvb3QgaXMgbm90IGNoYW5nZWQuICovCisJICAgIFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX3BhdGgsIG5fcGF0aF9vZmZzZXQgLSAxKSA9IE5VTEw7CisJICAgIFBBVEhfT0ZGU0VUX1BPU0lUSU9OKHBfc19wYXRoLCBuX3BhdGhfb2Zmc2V0IC0gMSkgPSAwOworCSAgICByZXR1cm4gQ0FSUllfT047CisJfQorCXJldHVybiBSRVBFQVRfU0VBUkNIOyAvKiBSb290IGlzIGNoYW5nZWQgYW5kIHdlIG11c3QgcmVjYWxjdWxhdGUgdGhlIHBhdGguICovCisgICAgfQorCisgICAgaWYgKCAhIEJfSVNfSU5fVFJFRShwX3NfYmggPSBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLCBuX3BhdGhfb2Zmc2V0IC0gMSkpICkKKwlyZXR1cm4gUkVQRUFUX1NFQVJDSDsgLyogUGFyZW50IGluIHRoZSBwYXRoIGlzIG5vdCBpbiB0aGUgdHJlZS4gKi8KKworICAgIGlmICggKG5fcG9zaXRpb24gPSBQQVRIX09GRlNFVF9QT1NJVElPTihwX3NfcGF0aCwgbl9wYXRoX29mZnNldCAtIDEpKSA+IEJfTlJfSVRFTVMocF9zX2JoKSApCisJcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CisgICAgCisgICAgaWYgKCBCX05fQ0hJTERfTlVNKHBfc19iaCwgbl9wb3NpdGlvbikgIT0gUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfcGF0aCwgbl9wYXRoX29mZnNldCktPmJfYmxvY2tuciApCisJLyogUGFyZW50IGluIHRoZSBwYXRoIGlzIG5vdCBwYXJlbnQgb2YgdGhlIGN1cnJlbnQgbm9kZSBpbiB0aGUgdHJlZS4gKi8KKwlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKKworICAgIGlmICggYnVmZmVyX2xvY2tlZChwX3NfYmgpICkgeworCV9fd2FpdF9vbl9idWZmZXIocF9zX2JoKTsKKwlpZiAoIEZJTEVTWVNURU1fQ0hBTkdFRF9UQiAocF9zX3RiKSApCisJICAgIHJldHVybiBSRVBFQVRfU0VBUkNIOworICAgIH0KKworICAgIHJldHVybiBDQVJSWV9PTjsgLyogUGFyZW50IGluIHRoZSBwYXRoIGlzIHVubG9ja2VkIGFuZCByZWFsbHkgcGFyZW50IG9mIHRoZSBjdXJyZW50IG5vZGUuICAqLworfQorCisKKy8qIFVzaW5nIGxudW1bbl9oXSBhbmQgcm51bVtuX2hdIHdlIHNob3VsZCBkZXRlcm1pbmUgd2hhdCBuZWlnaGJvcnMKKyAqIG9mIFNbbl9oXSB3ZQorICogbmVlZCBpbiBvcmRlciB0byBiYWxhbmNlIFNbbl9oXSwgYW5kIGdldCB0aGVtIGlmIG5lY2Vzc2FyeS4KKyAqIFJldHVybnM6CVNDSEVEVUxFX09DQ1VSUkVEIC0gc2NoZWR1bGUgb2NjdXJyZWQgd2hpbGUgdGhlIGZ1bmN0aW9uIHdvcmtlZDsKKyAqCSAgICAgICAgQ0FSUllfT04gLSBzY2hlZHVsZSBkaWRuJ3Qgb2NjdXIgd2hpbGUgdGhlIGZ1bmN0aW9uIHdvcmtlZDsKKyAqLworc3RhdGljIGludCAgZ2V0X25laWdoYm9ycygKKwkgICAgICAgICAgICBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogcF9zX3RiLAorCSAgICAgICAgICAgIGludCAJCSAgbl9oCisJICAgICAgICAgICkgeworICAgIGludAkJIAluX2NoaWxkX3Bvc2l0aW9uLAorCW5fcGF0aF9vZmZzZXQgPSBQQVRIX0hfUEFUSF9PRkZTRVQocF9zX3RiLT50Yl9wYXRoLCBuX2ggKyAxKTsKKyAgICB1bnNpZ25lZCBsb25nCQluX3Nvbl9udW1iZXI7CisgICAgc3RydWN0IHN1cGVyX2Jsb2NrICAqCXBfc19zYiA9IHBfc190Yi0+dGJfc2I7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICAqIHBfc19iaDsKKworCisgICAgUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBnZXRfbmVpZ2hib3JzWyBuX2ggXSApOworCisgICAgaWYgKCBwX3NfdGItPmxudW1bbl9oXSApIHsKKwkvKiBXZSBuZWVkIGxlZnQgbmVpZ2hib3IgdG8gYmFsYW5jZSBTW25faF0uICovCisJUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBuZWVkX2xfbmVpZ2hib3JbIG5faCBdICk7CisJcF9zX2JoID0gUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfdGItPnRiX3BhdGgsIG5fcGF0aF9vZmZzZXQpOworCQorCVJGQUxTRSggcF9zX2JoID09IHBfc190Yi0+Rkxbbl9oXSAmJiAKKwkJISBQQVRIX09GRlNFVF9QT1NJVElPTihwX3NfdGItPnRiX3BhdGgsIG5fcGF0aF9vZmZzZXQpLAorCQkiUEFQLTgyNzA6IGludmFsaWQgcG9zaXRpb24gaW4gdGhlIHBhcmVudCIpOworCisJbl9jaGlsZF9wb3NpdGlvbiA9ICggcF9zX2JoID09IHBfc190Yi0+Rkxbbl9oXSApID8gcF9zX3RiLT5sa2V5W25faF0gOiBCX05SX0lURU1TIChwX3NfdGItPkZMW25faF0pOworCW5fc29uX251bWJlciA9IEJfTl9DSElMRF9OVU0ocF9zX3RiLT5GTFtuX2hdLCBuX2NoaWxkX3Bvc2l0aW9uKTsKKwlwX3NfYmggPSBzYl9icmVhZChwX3Nfc2IsIG5fc29uX251bWJlcik7CisJaWYgKCFwX3NfYmgpCisJICAgIHJldHVybiBJT19FUlJPUjsKKwlpZiAoIEZJTEVTWVNURU1fQ0hBTkdFRF9UQiAocF9zX3RiKSApIHsKKwkgICAgZGVjcmVtZW50X2Jjb3VudChwX3NfYmgpOworCSAgICBQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIGdldF9uZWlnaGJvcnNfcmVzdGFydFsgbl9oIF0gKTsKKwkgICAgcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CisJfQorCQorCVJGQUxTRSggISBCX0lTX0lOX1RSRUUocF9zX3RiLT5GTFtuX2hdKSB8fAorICAgICAgICAgICAgICAgIG5fY2hpbGRfcG9zaXRpb24gPiBCX05SX0lURU1TKHBfc190Yi0+Rkxbbl9oXSkgfHwKKwkgICAgICAgIEJfTl9DSElMRF9OVU0ocF9zX3RiLT5GTFtuX2hdLCBuX2NoaWxkX3Bvc2l0aW9uKSAhPQorICAgICAgICAgICAgICAgIHBfc19iaC0+Yl9ibG9ja25yLCAiUEFQLTgyNzU6IGludmFsaWQgcGFyZW50Iik7CisJUkZBTFNFKCAhIEJfSVNfSU5fVFJFRShwX3NfYmgpLCAiUEFQLTgyODA6IGludmFsaWQgY2hpbGQiKTsKKwlSRkFMU0UoICEgbl9oICYmCisgICAgICAgICAgICAgICAgQl9GUkVFX1NQQUNFIChwX3NfYmgpICE9IE1BWF9DSElMRF9TSVpFIChwX3NfYmgpIC0gZGNfc2l6ZShCX05fQ0hJTEQgKHBfc190Yi0+RkxbMF0sbl9jaGlsZF9wb3NpdGlvbikpLAorICAgICAgICAgICAgICAgICJQQVAtODI5MDogaW52YWxpZCBjaGlsZCBzaXplIG9mIGxlZnQgbmVpZ2hib3IiKTsKKworCWRlY3JlbWVudF9iY291bnQocF9zX3RiLT5MW25faF0pOworCXBfc190Yi0+TFtuX2hdID0gcF9zX2JoOworICAgIH0KKworCisgICAgaWYgKCBwX3NfdGItPnJudW1bbl9oXSApIHsgLyogV2UgbmVlZCByaWdodCBuZWlnaGJvciB0byBiYWxhbmNlIFNbbl9wYXRoX29mZnNldF0uICovCisJUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBuZWVkX3JfbmVpZ2hib3JbIG5faCBdICk7CisJcF9zX2JoID0gUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfdGItPnRiX3BhdGgsIG5fcGF0aF9vZmZzZXQpOworCQorCVJGQUxTRSggcF9zX2JoID09IHBfc190Yi0+RlJbbl9oXSAmJiAKKwkJUEFUSF9PRkZTRVRfUE9TSVRJT04ocF9zX3RiLT50Yl9wYXRoLCBuX3BhdGhfb2Zmc2V0KSA+PSBCX05SX0lURU1TKHBfc19iaCksCisJCSJQQVAtODI5NTogaW52YWxpZCBwb3NpdGlvbiBpbiB0aGUgcGFyZW50Iik7CisKKwluX2NoaWxkX3Bvc2l0aW9uID0gKCBwX3NfYmggPT0gcF9zX3RiLT5GUltuX2hdICkgPyBwX3NfdGItPnJrZXlbbl9oXSArIDEgOiAwOworCW5fc29uX251bWJlciA9IEJfTl9DSElMRF9OVU0ocF9zX3RiLT5GUltuX2hdLCBuX2NoaWxkX3Bvc2l0aW9uKTsKKwlwX3NfYmggPSBzYl9icmVhZChwX3Nfc2IsIG5fc29uX251bWJlcik7CisJaWYgKCFwX3NfYmgpCisJICAgIHJldHVybiBJT19FUlJPUjsKKwlpZiAoIEZJTEVTWVNURU1fQ0hBTkdFRF9UQiAocF9zX3RiKSApIHsKKwkgICAgZGVjcmVtZW50X2Jjb3VudChwX3NfYmgpOworCSAgICBQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIGdldF9uZWlnaGJvcnNfcmVzdGFydFsgbl9oIF0gKTsKKwkgICAgcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CisJfQorCWRlY3JlbWVudF9iY291bnQocF9zX3RiLT5SW25faF0pOworCXBfc190Yi0+UltuX2hdID0gcF9zX2JoOworCisJUkZBTFNFKCAhIG5faCAmJiBCX0ZSRUVfU1BBQ0UgKHBfc19iaCkgIT0gTUFYX0NISUxEX1NJWkUgKHBfc19iaCkgLSBkY19zaXplKEJfTl9DSElMRCAocF9zX3RiLT5GUlswXSxuX2NoaWxkX3Bvc2l0aW9uKSksCisgICAgICAgICAgICAgICAgIlBBUC04MzAwOiBpbnZhbGlkIGNoaWxkIHNpemUgb2YgcmlnaHQgbmVpZ2hib3IgKCVkICE9ICVkIC0gJWQpIiwKKyAgICAgICAgICAgICAgICBCX0ZSRUVfU1BBQ0UgKHBfc19iaCksIE1BWF9DSElMRF9TSVpFIChwX3NfYmgpLAorICAgICAgICAgICAgICAgIGRjX3NpemUoQl9OX0NISUxEIChwX3NfdGItPkZSWzBdLG5fY2hpbGRfcG9zaXRpb24pKSk7CisJCisgICAgfQorICAgIHJldHVybiBDQVJSWV9PTjsKK30KKworI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSwordm9pZCAqIHJlaXNlcmZzX2ttYWxsb2MgKHNpemVfdCBzaXplLCBpbnQgZmxhZ3MsIHN0cnVjdCBzdXBlcl9ibG9jayAqIHMpCit7CisgICAgdm9pZCAqIHZwOworICAgIHN0YXRpYyBzaXplX3QgbWFsbG9jZWQ7CisKKworICAgIHZwID0ga21hbGxvYyAoc2l6ZSwgZmxhZ3MpOworICAgIGlmICh2cCkgeworCVJFSVNFUkZTX1NCKHMpLT5zX2ttYWxsb2NzICs9IHNpemU7CisJaWYgKFJFSVNFUkZTX1NCKHMpLT5zX2ttYWxsb2NzID4gbWFsbG9jZWQgKyAyMDAwMDApIHsKKwkgICAgcmVpc2VyZnNfd2FybmluZyAocywKKwkJCSAgICAgICJ2cy04MzAxOiByZWlzZXJmc19rbWFsbG9jOiBhbGxvY2F0ZWQgbWVtb3J5ICVkIiwKKwkJCSAgICAgIFJFSVNFUkZTX1NCKHMpLT5zX2ttYWxsb2NzKTsKKwkgICAgbWFsbG9jZWQgPSBSRUlTRVJGU19TQihzKS0+c19rbWFsbG9jczsKKwl9CisgICAgfQorICAgIHJldHVybiB2cDsKK30KKwordm9pZCByZWlzZXJmc19rZnJlZSAoY29uc3Qgdm9pZCAqIHZwLCBzaXplX3Qgc2l6ZSwgc3RydWN0IHN1cGVyX2Jsb2NrICogcykKK3sKKyAgICBrZnJlZSAodnApOworICAKKyAgICBSRUlTRVJGU19TQihzKS0+c19rbWFsbG9jcyAtPSBzaXplOworICAgIGlmIChSRUlTRVJGU19TQihzKS0+c19rbWFsbG9jcyA8IDApCisJcmVpc2VyZnNfd2FybmluZyAocywgInZzLTgzMDI6IHJlaXNlcmZzX2tmcmVlOiBhbGxvY2F0ZWQgbWVtb3J5ICVkIiwKKwkJCSAgUkVJU0VSRlNfU0IocyktPnNfa21hbGxvY3MpOworCit9CisjZW5kaWYKKworCitzdGF0aWMgaW50IGdldF92aXJ0dWFsX25vZGVfc2l6ZSAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoKQoreworICAgIGludCBtYXhfbnVtX29mX2l0ZW1zOworICAgIGludCBtYXhfbnVtX29mX2VudHJpZXM7CisgICAgdW5zaWduZWQgbG9uZyBibG9ja3NpemUgPSBzYi0+c19ibG9ja3NpemU7CisKKyNkZWZpbmUgTUlOX05BTUVfTEVOIDEKKworICAgIG1heF9udW1fb2ZfaXRlbXMgPSAoYmxvY2tzaXplIC0gQkxLSF9TSVpFKSAvIChJSF9TSVpFICsgTUlOX0lURU1fTEVOKTsKKyAgICBtYXhfbnVtX29mX2VudHJpZXMgPSAoYmxvY2tzaXplIC0gQkxLSF9TSVpFIC0gSUhfU0laRSkgLyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAoREVIX1NJWkUgKyBNSU5fTkFNRV9MRU4pOworCisgICAgcmV0dXJuIHNpemVvZihzdHJ1Y3QgdmlydHVhbF9ub2RlKSArIAorICAgICAgICAgICBtYXgobWF4X251bV9vZl9pdGVtcyAqIHNpemVvZiAoc3RydWN0IHZpcnR1YWxfaXRlbSksCisJICAgICAgIHNpemVvZiAoc3RydWN0IHZpcnR1YWxfaXRlbSkgKyBzaXplb2Yoc3RydWN0IGRpcmVudHJ5X3VhcmVhKSArIAorICAgICAgICAgICAgICAgKG1heF9udW1fb2ZfZW50cmllcyAtIDEpICogc2l6ZW9mIChfX3UxNikpOworfQorCisKKworLyogbWF5YmUgd2Ugc2hvdWxkIGZhaWwgYmFsYW5jaW5nIHdlIGFyZSBnb2luZyB0byBwZXJmb3JtIHdoZW4ga21hbGxvYworICAgZmFpbHMgc2V2ZXJhbCB0aW1lcy4gQnV0IG5vdyBpdCB3aWxsIGxvb3AgdW50aWwga21hbGxvYyBnZXRzCisgICByZXF1aXJlZCBtZW1vcnkgKi8KK3N0YXRpYyBpbnQgZ2V0X21lbV9mb3JfdmlydHVhbF9ub2RlIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIpCit7CisgICAgaW50IGNoZWNrX2ZzID0gMDsKKyAgICBpbnQgc2l6ZTsKKyAgICBjaGFyICogYnVmOworCisgICAgc2l6ZSA9IGdldF92aXJ0dWFsX25vZGVfc2l6ZSAodGItPnRiX3NiLCBQQVRIX1BMQVNUX0JVRkZFUiAodGItPnRiX3BhdGgpKTsKKworICAgIGlmIChzaXplID4gdGItPnZuX2J1Zl9zaXplKSB7CisJLyogd2UgaGF2ZSB0byBhbGxvY2F0ZSBtb3JlIG1lbW9yeSBmb3IgdmlydHVhbCBub2RlICovCisJaWYgKHRiLT52bl9idWYpIHsKKwkgICAgLyogZnJlZSBtZW1vcnkgYWxsb2NhdGVkIGJlZm9yZSAqLworCSAgICByZWlzZXJmc19rZnJlZSAodGItPnZuX2J1ZiwgdGItPnZuX2J1Zl9zaXplLCB0Yi0+dGJfc2IpOworCSAgICAvKiB0aGlzIGlzIG5vdCBuZWVkZWQgaWYga2ZyZWUgaXMgYXRvbWljICovCisgICAgICAgICAgICBjaGVja19mcyA9IDE7CisJfQorCisJLyogdmlydHVhbCBub2RlIHJlcXVpcmVzIG5vdyBtb3JlIG1lbW9yeSAqLworCXRiLT52bl9idWZfc2l6ZSA9IHNpemU7CisKKwkvKiBnZXQgbWVtb3J5IGZvciB2aXJ0dWFsIGl0ZW0gKi8KKwlidWYgPSByZWlzZXJmc19rbWFsbG9jKHNpemUsIEdGUF9BVE9NSUMgfCBfX0dGUF9OT1dBUk4sIHRiLT50Yl9zYik7CisJaWYgKCAhIGJ1ZiApIHsKKwkgICAgLyogZ2V0dGluZyBtZW1vcnkgd2l0aCBHRlBfS0VSTkVMIHByaW9yaXR5IG1heSBpbnZvbHZlCisgICAgICAgICAgICAgICBiYWxhbmNpbmcgbm93IChkdWUgdG8gaW5kaXJlY3RfdG9fZGlyZWN0IGNvbnZlcnNpb24gb24KKyAgICAgICAgICAgICAgIGRjYWNoZSBzaHJpbmtpbmcpLiBTbywgcmVsZWFzZSBwYXRoIGFuZCBjb2xsZWN0ZWQKKyAgICAgICAgICAgICAgIHJlc291cmNlcyBoZXJlICovCisJICAgIGZyZWVfYnVmZmVyc19pbl90YiAodGIpOworCSAgICBidWYgPSByZWlzZXJmc19rbWFsbG9jKHNpemUsIEdGUF9OT0ZTLCB0Yi0+dGJfc2IpOworCSAgICBpZiAoICFidWYgKSB7CisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisJCXJlaXNlcmZzX3dhcm5pbmcgKHRiLT50Yl9zYiwKKwkJCQkgICJ2cy04MzQ1OiBnZXRfbWVtX2Zvcl92aXJ0dWFsX25vZGU6ICIKKwkJCQkgICJrbWFsbG9jIGZhaWxlZC4gcmVpc2VyZnMga21hbGxvY2VkICVkIGJ5dGVzIiwKKwkJCQkgIFJFSVNFUkZTX1NCKHRiLT50Yl9zYiktPnNfa21hbGxvY3MpOworI2VuZGlmCisJCXRiLT52bl9idWZfc2l6ZSA9IDA7CisJICAgIH0KKwkgICAgdGItPnZuX2J1ZiA9IGJ1ZjsKKwkgICAgc2NoZWR1bGUoKSA7CisJICAgIHJldHVybiBSRVBFQVRfU0VBUkNIOworCX0KKworCXRiLT52bl9idWYgPSBidWY7CisgICAgfQorCisgICAgaWYgKCBjaGVja19mcyAmJiBGSUxFU1lTVEVNX0NIQU5HRURfVEIgKHRiKSApCisgICAgICAgIHJldHVybiBSRVBFQVRfU0VBUkNIOworCisgICAgcmV0dXJuIENBUlJZX09OOworfQorCisKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKK3N0YXRpYyB2b2lkIHRiX2J1ZmZlcl9zYW5pdHlfY2hlY2sgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHBfc19zYiwKKwkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogcF9zX2JoLCAKKwkJCQkgICAgY29uc3QgY2hhciAqZGVzY3IsIGludCBsZXZlbCkgeworICBpZiAocF9zX2JoKSB7CisgICAgaWYgKGF0b21pY19yZWFkICgmKHBfc19iaC0+Yl9jb3VudCkpIDw9IDApIHsKKworICAgICAgcmVpc2VyZnNfcGFuaWMgKHBfc19zYiwgImptYWNkLTE6IHRiX2J1ZmZlcl9zYW5pdHlfY2hlY2soKTogbmVnYXRpdmUgb3IgemVybyByZWZlcmVuY2UgY291bnRlciBmb3IgYnVmZmVyICVzWyVkXSAoJWIpXG4iLCBkZXNjciwgbGV2ZWwsIHBfc19iaCk7CisgICAgfQorCisgICAgaWYgKCAhIGJ1ZmZlcl91cHRvZGF0ZSAocF9zX2JoKSApIHsKKyAgICAgIHJlaXNlcmZzX3BhbmljIChwX3Nfc2IsICJqbWFjZC0yOiB0Yl9idWZmZXJfc2FuaXR5X2NoZWNrKCk6IGJ1ZmZlciBpcyBub3QgdXAgdG8gZGF0ZSAlc1slZF0gKCViKVxuIiwgZGVzY3IsIGxldmVsLCBwX3NfYmgpOworICAgIH0KKworICAgIGlmICggISBCX0lTX0lOX1RSRUUgKHBfc19iaCkgKSB7CisgICAgICByZWlzZXJmc19wYW5pYyAocF9zX3NiLCAiam1hY2QtMzogdGJfYnVmZmVyX3Nhbml0eV9jaGVjaygpOiBidWZmZXIgaXMgbm90IGluIHRyZWUgJXNbJWRdICglYilcbiIsIGRlc2NyLCBsZXZlbCwgcF9zX2JoKTsKKyAgICB9CisKKyAgICBpZiAocF9zX2JoLT5iX2JkZXYgIT0gcF9zX3NiLT5zX2JkZXYpIHsKKwlyZWlzZXJmc19wYW5pYyAocF9zX3NiLCAiam1hY2QtNDogdGJfYnVmZmVyX3Nhbml0eV9jaGVjaygpOiBidWZmZXIgaGFzIHdyb25nIGRldmljZSAlc1slZF0gKCViKVxuIiwgZGVzY3IsIGxldmVsLCBwX3NfYmgpOworICAgIH0KKworICAgIGlmIChwX3NfYmgtPmJfc2l6ZSAhPSBwX3Nfc2ItPnNfYmxvY2tzaXplKSB7CisJcmVpc2VyZnNfcGFuaWMgKHBfc19zYiwgImptYWNkLTU6IHRiX2J1ZmZlcl9zYW5pdHlfY2hlY2soKTogYnVmZmVyIGhhcyB3cm9uZyBibG9ja3NpemUgJXNbJWRdICglYilcbiIsIGRlc2NyLCBsZXZlbCwgcF9zX2JoKTsKKyAgICB9CisKKyAgICBpZiAocF9zX2JoLT5iX2Jsb2NrbnIgPiBTQl9CTE9DS19DT1VOVChwX3Nfc2IpKSB7CisJcmVpc2VyZnNfcGFuaWMgKHBfc19zYiwgImptYWNkLTY6IHRiX2J1ZmZlcl9zYW5pdHlfY2hlY2soKTogYnVmZmVyIGJsb2NrIG51bWJlciB0b28gaGlnaCAlc1slZF0gKCViKVxuIiwgZGVzY3IsIGxldmVsLCBwX3NfYmgpOworICAgIH0KKyAgfQorfQorI2Vsc2UKK3N0YXRpYyB2b2lkIHRiX2J1ZmZlcl9zYW5pdHlfY2hlY2sgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHBfc19zYiwKKwkJCQkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogcF9zX2JoLCAKKwkJCQkgICAgY29uc3QgY2hhciAqZGVzY3IsIGludCBsZXZlbCkKK3s7fQorI2VuZGlmCisKK3N0YXRpYyBpbnQgY2xlYXJfYWxsX2RpcnR5X2JpdHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkgeworICByZXR1cm4gcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBiaCwgMCkgOworfQorCitzdGF0aWMgaW50IHdhaXRfdGJfYnVmZmVyc191bnRpbF91bmxvY2tlZCAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHBfc190YikKK3sKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBsb2NrZWQ7CisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisgICAgaW50IHJlcGVhdF9jb3VudGVyID0gMDsKKyNlbmRpZgorICAgIGludCBpOworCisgICAgZG8geworCisJbG9ja2VkID0gTlVMTDsKKworCWZvciAoIGkgPSBwX3NfdGItPnRiX3BhdGgtPnBhdGhfbGVuZ3RoOyAhbG9ja2VkICYmIGkgPiBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQ7IGktLSApIHsKKwkgICAgaWYgKCBQQVRIX09GRlNFVF9QQlVGRkVSIChwX3NfdGItPnRiX3BhdGgsIGkpICkgeworCQkvKiBpZiBJIHVuZGVyc3RhbmQgY29ycmVjdGx5LCB3ZSBjYW4gb25seSBiZSBzdXJlIHRoZSBsYXN0IGJ1ZmZlcgorCQkqKiBpbiB0aGUgcGF0aCBpcyBpbiB0aGUgdHJlZSAtLWNsbQorCQkqLworI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSworCQlpZiAoUEFUSF9QTEFTVF9CVUZGRVIocF9zX3RiLT50Yl9wYXRoKSA9PQorCQkgICAgUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfdGItPnRiX3BhdGgsIGkpKSB7CisJCSAgICB0Yl9idWZmZXJfc2FuaXR5X2NoZWNrIChwX3NfdGItPnRiX3NiLCAKKwkJCQkJICAgIFBBVEhfT0ZGU0VUX1BCVUZGRVIgKHBfc190Yi0+dGJfcGF0aCwgaSksIAorCQkJCQkgICAgIlMiLCAKKwkJCQkJICAgIHBfc190Yi0+dGJfcGF0aC0+cGF0aF9sZW5ndGggLSBpKTsKKwkJfQorI2VuZGlmCisJCWlmICghY2xlYXJfYWxsX2RpcnR5X2JpdHMocF9zX3RiLT50Yl9zYiwKKwkJCQkgICAgIFBBVEhfT0ZGU0VUX1BCVUZGRVIgKHBfc190Yi0+dGJfcGF0aCwgaSkpKQorCQl7CisJCSAgICBsb2NrZWQgPSBQQVRIX09GRlNFVF9QQlVGRkVSIChwX3NfdGItPnRiX3BhdGgsIGkpOworCQl9CisJICAgIH0KKwl9CisKKwlmb3IgKCBpID0gMDsgIWxvY2tlZCAmJiBpIDwgTUFYX0hFSUdIVCAmJiBwX3NfdGItPmluc2VydF9zaXplW2ldOyBpKysgKSB7IAorCisJICAgIGlmIChwX3NfdGItPmxudW1baV0gKSB7CisKKwkJaWYgKCBwX3NfdGItPkxbaV0gKSB7CisJCSAgICB0Yl9idWZmZXJfc2FuaXR5X2NoZWNrIChwX3NfdGItPnRiX3NiLCBwX3NfdGItPkxbaV0sICJMIiwgaSk7CisJCSAgICBpZiAoIWNsZWFyX2FsbF9kaXJ0eV9iaXRzKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+TFtpXSkpCisJCQlsb2NrZWQgPSBwX3NfdGItPkxbaV07CisJCX0KKworCQlpZiAoICFsb2NrZWQgJiYgcF9zX3RiLT5GTFtpXSApIHsKKwkJICAgIHRiX2J1ZmZlcl9zYW5pdHlfY2hlY2sgKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+RkxbaV0sICJGTCIsIGkpOworCQkgICAgaWYgKCFjbGVhcl9hbGxfZGlydHlfYml0cyhwX3NfdGItPnRiX3NiLCBwX3NfdGItPkZMW2ldKSkKKwkJCWxvY2tlZCA9IHBfc190Yi0+RkxbaV07CisJCX0KKworCQlpZiAoICFsb2NrZWQgJiYgcF9zX3RiLT5DRkxbaV0gKSB7CisJCSAgICB0Yl9idWZmZXJfc2FuaXR5X2NoZWNrIChwX3NfdGItPnRiX3NiLCBwX3NfdGItPkNGTFtpXSwgIkNGTCIsIGkpOworCQkgICAgaWYgKCFjbGVhcl9hbGxfZGlydHlfYml0cyhwX3NfdGItPnRiX3NiLCBwX3NfdGItPkNGTFtpXSkpCisJCQlsb2NrZWQgPSBwX3NfdGItPkNGTFtpXTsKKwkJfQorCisJICAgIH0KKworCSAgICBpZiAoICFsb2NrZWQgJiYgKHBfc190Yi0+cm51bVtpXSkgKSB7CisKKwkJaWYgKCBwX3NfdGItPlJbaV0gKSB7CisJCSAgICB0Yl9idWZmZXJfc2FuaXR5X2NoZWNrIChwX3NfdGItPnRiX3NiLCBwX3NfdGItPlJbaV0sICJSIiwgaSk7CisJCSAgICBpZiAoIWNsZWFyX2FsbF9kaXJ0eV9iaXRzKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+UltpXSkpCisJCQlsb2NrZWQgPSBwX3NfdGItPlJbaV07CisJCX0KKworICAgICAgIAorCQlpZiAoICFsb2NrZWQgJiYgcF9zX3RiLT5GUltpXSApIHsKKwkJICAgIHRiX2J1ZmZlcl9zYW5pdHlfY2hlY2sgKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+RlJbaV0sICJGUiIsIGkpOworCQkgICAgaWYgKCFjbGVhcl9hbGxfZGlydHlfYml0cyhwX3NfdGItPnRiX3NiLCBwX3NfdGItPkZSW2ldKSkKKwkJCWxvY2tlZCA9IHBfc190Yi0+RlJbaV07CisJCX0KKworCQlpZiAoICFsb2NrZWQgJiYgcF9zX3RiLT5DRlJbaV0gKSB7CisJCSAgICB0Yl9idWZmZXJfc2FuaXR5X2NoZWNrIChwX3NfdGItPnRiX3NiLCBwX3NfdGItPkNGUltpXSwgIkNGUiIsIGkpOworCQkgICAgaWYgKCFjbGVhcl9hbGxfZGlydHlfYml0cyhwX3NfdGItPnRiX3NiLCBwX3NfdGItPkNGUltpXSkpCisJCQlsb2NrZWQgPSBwX3NfdGItPkNGUltpXTsKKwkJfQorCSAgICB9CisJfQorCS8qIGFzIGZhciBhcyBJIGNhbiB0ZWxsLCB0aGlzIGlzIG5vdCByZXF1aXJlZC4gIFRoZSBGRUIgbGlzdCBzZWVtcworCSoqIHRvIGJlIGZ1bGwgb2YgbmV3bHkgYWxsb2NhdGVkIG5vZGVzLCB3aGljaCB3aWxsIG5ldmVyIGJlIGxvY2tlZCwKKwkqKiBkaXJ0eSwgb3IgYW55dGhpbmcgZWxzZS4KKwkqKiBUbyBiZSBzYWZlLCBJJ20gcHV0dGluZyBpbiB0aGUgY2hlY2tzIGFuZCB3YWl0cyBpbi4gIEZvciB0aGUgbW9tZW50LAorCSoqIHRoZXkgYXJlIG5lZWRlZCB0byBrZWVwIHRoZSBjb2RlIGluIGpvdXJuYWwuYyBmcm9tIGNvbXBsYWluaW5nCisJKiogYWJvdXQgdGhlIGJ1ZmZlci4gIFRoYXQgY29kZSBpcyBpbnNpZGUgQ09ORklHX1JFSVNFUkZTX0NIRUNLIGFzIHdlbGwuCisJKiogLS1jbG0KKwkqLworCWZvciAoIGkgPSAwOyAhbG9ja2VkICYmIGkgPCBNQVhfRkVCX1NJWkU7IGkrKyApIHsgCisJICAgIGlmICggcF9zX3RiLT5GRUJbaV0gKSB7CisJCWlmICghY2xlYXJfYWxsX2RpcnR5X2JpdHMocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5GRUJbaV0pKQorCQkgICAgbG9ja2VkID0gcF9zX3RiLT5GRUJbaV0gOworCSAgICB9CisJfQorCisJaWYgKGxvY2tlZCkgeworI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSworCSAgICByZXBlYXRfY291bnRlcisrOworCSAgICBpZiAoIChyZXBlYXRfY291bnRlciAlIDEwMDAwKSA9PSAwKSB7CisJCXJlaXNlcmZzX3dhcm5pbmcgKHBfc190Yi0+dGJfc2IsCisJCQkJICAid2FpdF90Yl9idWZmZXJzX3VudGlsX3JlbGVhc2VkKCk6IHRvbyBtYW55ICIKKwkJCQkgICJpdGVyYXRpb25zIHdhaXRpbmcgZm9yIGJ1ZmZlciB0byB1bmxvY2sgIgorCQkJCSAgIiglYikiLCBsb2NrZWQpOworCisJCS8qIERvbid0IGxvb3AgZm9yZXZlci4gIFRyeSB0byByZWNvdmVyIGZyb20gcG9zc2libGUgZXJyb3IuICovCisKKwkJcmV0dXJuICggRklMRVNZU1RFTV9DSEFOR0VEX1RCIChwX3NfdGIpICkgPyBSRVBFQVRfU0VBUkNIIDogQ0FSUllfT047CisJICAgIH0KKyNlbmRpZgorCSAgICBfX3dhaXRfb25fYnVmZmVyIChsb2NrZWQpOworCSAgICBpZiAoIEZJTEVTWVNURU1fQ0hBTkdFRF9UQiAocF9zX3RiKSApIHsKKwkJcmV0dXJuIFJFUEVBVF9TRUFSQ0g7CisJICAgIH0KKwl9CisKKyAgICB9IHdoaWxlIChsb2NrZWQpOworCisgICAgcmV0dXJuIENBUlJZX09OOworfQorCisKKy8qIFByZXBhcmUgZm9yIGJhbGFuY2luZywgdGhhdCBpcworICoJZ2V0IGFsbCBuZWNlc3NhcnkgcGFyZW50cywgYW5kIG5laWdoYm9yczsKKyAqCWFuYWx5emUgd2hhdCBhbmQgd2hlcmUgc2hvdWxkIGJlIG1vdmVkOworICoJZ2V0IHN1ZmZpY2llbnQgbnVtYmVyIG9mIG5ldyBub2RlczsKKyAqIEJhbGFuY2luZyB3aWxsIHN0YXJ0IG9ubHkgYWZ0ZXIgYWxsIHJlc291cmNlcyB3aWxsIGJlIGNvbGxlY3RlZCBhdCBhIHRpbWUuCisgKiAKKyAqIFdoZW4gcG9ydGVkIHRvIFNNUCBrZXJuZWxzLCBvbmx5IGF0IHRoZSBsYXN0IG1vbWVudCBhZnRlciBhbGwgbmVlZGVkIG5vZGVzCisgKiBhcmUgY29sbGVjdGVkIGluIGNhY2hlLCB3aWxsIHRoZSByZXNvdXJjZXMgYmUgbG9ja2VkIHVzaW5nIHRoZSB1c3VhbAorICogdGV4dGJvb2sgb3JkZXJlZCBsb2NrIGFjcXVpc2l0aW9uIGFsZ29yaXRobXMuICBOb3RlIHRoYXQgZW5zdXJpbmcgdGhhdAorICogdGhpcyBjb2RlIG5laXRoZXIgd3JpdGUgbG9ja3Mgd2hhdCBpdCBkb2VzIG5vdCBuZWVkIHRvIHdyaXRlIGxvY2sgbm9yIGxvY2tzIG91dCBvZiBvcmRlcgorICogd2lsbCBiZSBhIHBhaW4gaW4gdGhlIGJ1dHQgdGhhdCBjb3VsZCBoYXZlIGJlZW4gYXZvaWRlZC4gIEdydW1ibGUgZ3J1bWJsZS4gLUhhbnMKKyAqIAorICogZml4IGlzIG1lYW50IGluIHRoZSBzZW5zZSBvZiByZW5kZXIgdW5jaGFuZ2luZworICogCisgKiBMYXRlbmN5IG1pZ2h0IGJlIGltcHJvdmVkIGJ5IGZpcnN0IGdhdGhlcmluZyBhIGxpc3Qgb2Ygd2hhdCBidWZmZXJzIGFyZSBuZWVkZWQKKyAqIGFuZCB0aGVuIGdldHRpbmcgYXMgbWFueSBvZiB0aGVtIGluIHBhcmFsbGVsIGFzIHBvc3NpYmxlPyAtSGFucworICoKKyAqIFBhcmFtZXRlcnM6CisgKglvcF9tb2RlCWkgLSBpbnNlcnQsIGQgLSBkZWxldGUsIGMgLSBjdXQgKHRydW5jYXRlKSwgcCAtIHBhc3RlIChhcHBlbmQpCisgKgl0Ygl0cmVlX2JhbGFuY2Ugc3RydWN0dXJlOworICoJaW51bQlpdGVtIG51bWJlciBpbiBTW2hdOworICogICAgICBwb3NfaW5faXRlbSAtIGNvbW1lbnQgdGhpcyBpZiB5b3UgY2FuCisgKiAgICAgIGluc19paCAmIGluc19zZCBhcmUgdXNlZCB3aGVuIGluc2VydGluZworICogUmV0dXJuczoJMSAtIHNjaGVkdWxlIG9jY3VycmVkIHdoaWxlIHRoZSBmdW5jdGlvbiB3b3JrZWQ7CisgKgkgICAgICAgIDAgLSBzY2hlZHVsZSBkaWRuJ3Qgb2NjdXIgd2hpbGUgdGhlIGZ1bmN0aW9uIHdvcmtlZDsKKyAqICAgICAgICAgICAgIC0xIC0gaWYgbm9fZGlza19zcGFjZSAKKyAqLworCisKK2ludCBmaXhfbm9kZXMgKGludCBuX29wX21vZGUsCisJICAgICAgIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiAJcF9zX3RiLAorCSAgICAgICBzdHJ1Y3QgaXRlbV9oZWFkICogcF9zX2luc19paCwgLy8gaXRlbSBoZWFkIG9mIGl0ZW0gYmVpbmcgaW5zZXJ0ZWQKKwkgICAgICAgY29uc3Qgdm9pZCAqIGRhdGEgLy8gaW5zZXJ0ZWQgaXRlbSBvciBkYXRhIHRvIGJlIHBhc3RlZAorICAgICkgeworICAgIGludAluX3JldF92YWx1ZSwKKyAgICAJbl9oLAorICAgIAluX2l0ZW1fbnVtID0gUEFUSF9MQVNUX1BPU0lUSU9OKHBfc190Yi0+dGJfcGF0aCk7CisgICAgaW50IG5fcG9zX2luX2l0ZW07CisKKyAgICAvKiB3ZSBzZXQgd2FpdF90Yl9idWZmZXJzX3J1biB3aGVuIHdlIGhhdmUgdG8gcmVzdG9yZSBhbnkgZGlydHkgYml0cyBjbGVhcmVkCisgICAgKiogZHVyaW5nIHdhaXRfdGJfYnVmZmVyc19ydW4KKyAgICAqLworICAgIGludCB3YWl0X3RiX2J1ZmZlcnNfcnVuID0gMCA7IAorICAgIHN0cnVjdCBidWZmZXJfaGVhZCAgKiBwX3NfdGJTMCA9IFBBVEhfUExBU1RfQlVGRkVSKHBfc190Yi0+dGJfcGF0aCk7CisKKyAgICArKyBSRUlTRVJGU19TQihwX3NfdGIgLT4gdGJfc2IpIC0+IHNfZml4X25vZGVzOworCisgICAgbl9wb3NfaW5faXRlbSA9IHBfc190Yi0+dGJfcGF0aC0+cG9zX2luX2l0ZW07CisKKworICAgIHBfc190Yi0+ZnNfZ2VuID0gZ2V0X2dlbmVyYXRpb24gKHBfc190Yi0+dGJfc2IpOworCisgICAgLyogd2UgcHJlcGFyZSBhbmQgbG9nIHRoZSBzdXBlciBoZXJlIHNvIGl0IHdpbGwgYWxyZWFkeSBiZSBpbiB0aGUKKyAgICAqKiB0cmFuc2FjdGlvbiB3aGVuIGRvX2JhbGFuY2UgbmVlZHMgdG8gY2hhbmdlIGl0LgorICAgICoqIFRoaXMgd2F5IGRvX2JhbGFuY2Ugd29uJ3QgaGF2ZSB0byBzY2hlZHVsZSB3aGVuIHRyeWluZyB0byBwcmVwYXJlCisgICAgKiogdGhlIHN1cGVyIGZvciBsb2dnaW5nCisgICAgKi8KKyAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHBfc190Yi0+dGJfc2IsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0JfQlVGRkVSX1dJVEhfU0IocF9zX3RiLT50Yl9zYiksIDEpIDsKKyAgICBqb3VybmFsX21hcmtfZGlydHkocF9zX3RiLT50cmFuc2FjdGlvbl9oYW5kbGUsIHBfc190Yi0+dGJfc2IsIAorICAgICAgICAgICAgICAgICAgICAgICBTQl9CVUZGRVJfV0lUSF9TQihwX3NfdGItPnRiX3NiKSkgOworICAgIGlmICggRklMRVNZU1RFTV9DSEFOR0VEX1RCIChwX3NfdGIpICkKKwlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKKworICAgIC8qIGlmIGl0IHBvc3NpYmxlIGluIGluZGlyZWN0X3RvX2RpcmVjdCBjb252ZXJzaW9uICovCisgICAgaWYgKGJ1ZmZlcl9sb2NrZWQgKHBfc190YlMwKSkgeworICAgICAgICBfX3dhaXRfb25fYnVmZmVyIChwX3NfdGJTMCk7CisgICAgICAgIGlmICggRklMRVNZU1RFTV9DSEFOR0VEX1RCIChwX3NfdGIpICkKKyAgICAgICAgICAgIHJldHVybiBSRVBFQVRfU0VBUkNIOworICAgIH0KKworI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSworICAgIGlmICggY3VyX3RiICkgeworCXByaW50X2N1cl90YiAoImZpeF9ub2RlcyIpOworCXJlaXNlcmZzX3BhbmljKHBfc190Yi0+dGJfc2IsIlBBUC04MzA1OiBmaXhfbm9kZXM6ICB0aGVyZSBpcyBwZW5kaW5nIGRvX2JhbGFuY2UiKTsKKyAgICB9CisKKyAgICBpZiAoIWJ1ZmZlcl91cHRvZGF0ZSAocF9zX3RiUzApIHx8ICFCX0lTX0lOX1RSRUUgKHBfc190YlMwKSkgeworCXJlaXNlcmZzX3BhbmljIChwX3NfdGItPnRiX3NiLCAiUEFQLTgzMjA6IGZpeF9ub2RlczogU1swXSAoJWIgJXopIGlzIG5vdCB1cHRvZGF0ZSAiCisJCQkiYXQgdGhlIGJlZ2lubmluZyBvZiBmaXhfbm9kZXMgb3Igbm90IGluIHRyZWUgKG1vZGUgJWMpIiwgcF9zX3RiUzAsIHBfc190YlMwLCBuX29wX21vZGUpOworICAgIH0KKworICAgIC8qIENoZWNrIHBhcmFtZXRlcnMuICovCisgICAgc3dpdGNoIChuX29wX21vZGUpIHsKKyAgICBjYXNlIE1fSU5TRVJUOgorCWlmICggbl9pdGVtX251bSA8PSAwIHx8IG5faXRlbV9udW0gPiBCX05SX0lURU1TKHBfc190YlMwKSApCisJICAgIHJlaXNlcmZzX3BhbmljKHBfc190Yi0+dGJfc2IsIlBBUC04MzMwOiBmaXhfbm9kZXM6IEluY29ycmVjdCBpdGVtIG51bWJlciAlZCAoaW4gUzAgLSAlZCkgaW4gY2FzZSBvZiBpbnNlcnQiLAorCQkJICAgbl9pdGVtX251bSwgQl9OUl9JVEVNUyhwX3NfdGJTMCkpOworCWJyZWFrOworICAgIGNhc2UgTV9QQVNURToKKyAgICBjYXNlIE1fREVMRVRFOgorICAgIGNhc2UgTV9DVVQ6CisJaWYgKCBuX2l0ZW1fbnVtIDwgMCB8fCBuX2l0ZW1fbnVtID49IEJfTlJfSVRFTVMocF9zX3RiUzApICkgeworCSAgICBwcmludF9ibG9jayAocF9zX3RiUzAsIDAsIC0xLCAtMSk7CisJICAgIHJlaXNlcmZzX3BhbmljKHBfc190Yi0+dGJfc2IsIlBBUC04MzM1OiBmaXhfbm9kZXM6IEluY29ycmVjdCBpdGVtIG51bWJlciglZCk7IG1vZGUgPSAlYyBpbnNlcnRfc2l6ZSA9ICVkXG4iLCBuX2l0ZW1fbnVtLCBuX29wX21vZGUsIHBfc190Yi0+aW5zZXJ0X3NpemVbMF0pOworCX0KKwlicmVhazsKKyAgICBkZWZhdWx0OgorCXJlaXNlcmZzX3BhbmljKHBfc190Yi0+dGJfc2IsIlBBUC04MzQwOiBmaXhfbm9kZXM6IEluY29ycmVjdCBtb2RlIG9mIG9wZXJhdGlvbiIpOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKGdldF9tZW1fZm9yX3ZpcnR1YWxfbm9kZSAocF9zX3RiKSA9PSBSRVBFQVRfU0VBUkNIKQorCS8vIEZJWE1FOiBtYXliZSAtRU5PTUVNIHdoZW4gdGItPnZuX2J1ZiA9PSAwPyBOb3cganVzdCByZXBlYXQKKwlyZXR1cm4gUkVQRUFUX1NFQVJDSDsKKworCisgICAgLyogU3RhcnRpbmcgZnJvbSB0aGUgbGVhZiBsZXZlbDsgZm9yIGFsbCBsZXZlbHMgbl9oIG9mIHRoZSB0cmVlLiAqLworICAgIGZvciAoIG5faCA9IDA7IG5faCA8IE1BWF9IRUlHSFQgJiYgcF9zX3RiLT5pbnNlcnRfc2l6ZVtuX2hdOyBuX2grKyApIHsgCisJaWYgKCAobl9yZXRfdmFsdWUgPSBnZXRfZGlyZWN0X3BhcmVudChwX3NfdGIsIG5faCkpICE9IENBUlJZX09OICkgeworCSAgICBnb3RvIHJlcGVhdDsKKwl9CisKKwlpZiAoIChuX3JldF92YWx1ZSA9IGNoZWNrX2JhbGFuY2UgKG5fb3BfbW9kZSwgcF9zX3RiLCBuX2gsIG5faXRlbV9udW0sCisJCQkJCSAgIG5fcG9zX2luX2l0ZW0sIHBfc19pbnNfaWgsIGRhdGEpKSAhPSBDQVJSWV9PTiApIHsKKwkgICAgaWYgKCBuX3JldF92YWx1ZSA9PSBOT19CQUxBTkNJTkdfTkVFREVEICkgeworCQkvKiBObyBiYWxhbmNpbmcgZm9yIGhpZ2hlciBsZXZlbHMgbmVlZGVkLiAqLworCQlpZiAoIChuX3JldF92YWx1ZSA9IGdldF9uZWlnaGJvcnMocF9zX3RiLCBuX2gpKSAhPSBDQVJSWV9PTiApIHsKKwkJICAgIGdvdG8gcmVwZWF0OworCQl9CisJCWlmICggbl9oICE9IE1BWF9IRUlHSFQgLSAxICkgIAorCQkgICAgcF9zX3RiLT5pbnNlcnRfc2l6ZVtuX2ggKyAxXSA9IDA7CisJCS8qIG9rLCBhbmFseXNpcyBhbmQgcmVzb3VyY2UgZ2F0aGVyaW5nIGFyZSBjb21wbGV0ZSAqLworCQlicmVhazsKKwkgICAgfQorCSAgICBnb3RvIHJlcGVhdDsKKwl9CisKKwlpZiAoIChuX3JldF92YWx1ZSA9IGdldF9uZWlnaGJvcnMocF9zX3RiLCBuX2gpKSAhPSBDQVJSWV9PTiApIHsKKwkgICAgZ290byByZXBlYXQ7CisJfQorCisJaWYgKCAobl9yZXRfdmFsdWUgPSBnZXRfZW1wdHlfbm9kZXMocF9zX3RiLCBuX2gpKSAhPSBDQVJSWV9PTiApIHsKKwkgICAgZ290byByZXBlYXQ7ICAgICAgICAvKiBObyBkaXNrIHNwYWNlLCBvciBzY2hlZHVsZSBvY2N1cnJlZCBhbmQKKwkJCQkgICBhbmFseXNpcyBtYXkgYmUgaW52YWxpZCBhbmQgbmVlZHMgdG8gYmUgcmVkb25lLiAqLworCX0KKyAgICAKKwlpZiAoICEgUEFUSF9IX1BCVUZGRVIocF9zX3RiLT50Yl9wYXRoLCBuX2gpICkgeworCSAgICAvKiBXZSBoYXZlIGEgcG9zaXRpdmUgaW5zZXJ0IHNpemUgYnV0IG5vIG5vZGVzIGV4aXN0IG9uIHRoaXMKKwkgICAgICAgbGV2ZWwsIHRoaXMgbWVhbnMgdGhhdCB3ZSBhcmUgY3JlYXRpbmcgYSBuZXcgcm9vdC4gKi8KKworCSAgICBSRkFMU0UoIHBfc190Yi0+YmxrbnVtW25faF0gIT0gMSwKKwkJICAgICJQQVAtODM1MDogY3JlYXRpbmcgbmV3IGVtcHR5IHJvb3QiKTsKKworCSAgICBpZiAoIG5faCA8IE1BWF9IRUlHSFQgLSAxICkKKwkJcF9zX3RiLT5pbnNlcnRfc2l6ZVtuX2ggKyAxXSA9IDA7CisJfQorCWVsc2UKKwkgICAgaWYgKCAhIFBBVEhfSF9QQlVGRkVSKHBfc190Yi0+dGJfcGF0aCwgbl9oICsgMSkgKSB7CisJCWlmICggcF9zX3RiLT5ibGtudW1bbl9oXSA+IDEgKSB7CisJCSAgICAvKiBUaGUgdHJlZSBuZWVkcyB0byBiZSBncm93biwgc28gdGhpcyBub2RlIFNbbl9oXQorCQkgICAgICAgd2hpY2ggaXMgdGhlIHJvb3Qgbm9kZSBpcyBzcGxpdCBpbnRvIHR3byBub2RlcywKKwkJICAgICAgIGFuZCBhIG5ldyBub2RlIChTW25faCsxXSkgd2lsbCBiZSBjcmVhdGVkIHRvCisJCSAgICAgICBiZWNvbWUgdGhlIHJvb3Qgbm9kZS4gICovCisJICAKKwkJICAgIFJGQUxTRSggbl9oID09IE1BWF9IRUlHSFQgLSAxLAorCQkJICAgICJQQVAtODM1NTogYXR0ZW1wdCB0byBjcmVhdGUgdG9vIGhpZ2ggb2YgYSB0cmVlIik7CisKKwkJICAgIHBfc190Yi0+aW5zZXJ0X3NpemVbbl9oICsgMV0gPSAoRENfU0laRSArIEtFWV9TSVpFKSAqIChwX3NfdGItPmJsa251bVtuX2hdIC0gMSkgKyBEQ19TSVpFOworCQl9CisJCWVsc2UKKwkJICAgIGlmICggbl9oIDwgTUFYX0hFSUdIVCAtIDEgKQorCQkJcF9zX3RiLT5pbnNlcnRfc2l6ZVtuX2ggKyAxXSA9IDA7CisJICAgIH0KKwkgICAgZWxzZQorCQlwX3NfdGItPmluc2VydF9zaXplW25faCArIDFdID0gKERDX1NJWkUgKyBLRVlfU0laRSkgKiAocF9zX3RiLT5ibGtudW1bbl9oXSAtIDEpOworICAgIH0KKworICAgIGlmICgobl9yZXRfdmFsdWUgPSB3YWl0X3RiX2J1ZmZlcnNfdW50aWxfdW5sb2NrZWQgKHBfc190YikpID09IENBUlJZX09OKSB7CisJaWYgKEZJTEVTWVNURU1fQ0hBTkdFRF9UQihwX3NfdGIpKSB7CisJICAgIHdhaXRfdGJfYnVmZmVyc19ydW4gPSAxIDsKKwkgICAgbl9yZXRfdmFsdWUgPSBSRVBFQVRfU0VBUkNIIDsKKwkgICAgZ290byByZXBlYXQ7IAorCX0gZWxzZSB7CisJICAgIHJldHVybiBDQVJSWV9PTjsKKwl9CisgICAgfSBlbHNlIHsKKwl3YWl0X3RiX2J1ZmZlcnNfcnVuID0gMSA7CisJZ290byByZXBlYXQ7IAorICAgIH0KKworIHJlcGVhdDoKKyAgICAvLyBmaXhfbm9kZXMgd2FzIHVuYWJsZSB0byBwZXJmb3JtIGl0cyBjYWxjdWxhdGlvbiBkdWUgdG8KKyAgICAvLyBmaWxlc3lzdGVtIGdvdCBjaGFuZ2VkIHVuZGVyIHVzLCBsYWNrIG9mIGZyZWUgZGlzayBzcGFjZSBvciBpL28KKyAgICAvLyBmYWlsdXJlLiBJZiB0aGUgZmlyc3QgaXMgdGhlIGNhc2UgLSB0aGUgc2VhcmNoIHdpbGwgYmUKKyAgICAvLyByZXBlYXRlZC4gRm9yIG5vdyAtIGZyZWUgYWxsIHJlc291cmNlcyBhY3F1aXJlZCBzbyBmYXIgZXhjZXB0CisgICAgLy8gZm9yIHRoZSBuZXcgYWxsb2NhdGVkIG5vZGVzCisgICAgeworCWludCBpOworCisJLyogUmVsZWFzZSBwYXRoIGJ1ZmZlcnMuICovCisJaWYgKHdhaXRfdGJfYnVmZmVyc19ydW4pIHsKKwkgICAgcGF0aHJlbHNlX2FuZF9yZXN0b3JlKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+dGJfcGF0aCkgOworCX0gZWxzZSB7CisJICAgIHBhdGhyZWxzZSAocF9zX3RiLT50Yl9wYXRoKTsKKyAgICAgICAgfQkKKwkvKiBicmVsc2UgYWxsIHJlc291cmNlcyBjb2xsZWN0ZWQgZm9yIGJhbGFuY2luZyAqLworCWZvciAoIGkgPSAwOyBpIDwgTUFYX0hFSUdIVDsgaSsrICkgeworCSAgICBpZiAod2FpdF90Yl9idWZmZXJzX3J1bikgeworCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihwX3NfdGItPnRiX3NiLCBwX3NfdGItPkxbaV0pOworCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihwX3NfdGItPnRiX3NiLCBwX3NfdGItPlJbaV0pOworCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihwX3NfdGItPnRiX3NiLCBwX3NfdGItPkZMW2ldKTsKKwkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5GUltpXSk7CisJCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHBfc190Yi0+dGJfc2IsIHBfc190Yi0+Q0ZMW2ldKTsKKwkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIocF9zX3RiLT50Yl9zYiwgcF9zX3RiLT5DRlJbaV0pOworCSAgICB9CisKKwkgICAgYnJlbHNlIChwX3NfdGItPkxbaV0pO3Bfc190Yi0+TFtpXSA9IE5VTEw7CisJICAgIGJyZWxzZSAocF9zX3RiLT5SW2ldKTtwX3NfdGItPlJbaV0gPSBOVUxMOworCSAgICBicmVsc2UgKHBfc190Yi0+RkxbaV0pO3Bfc190Yi0+RkxbaV0gPSBOVUxMOworCSAgICBicmVsc2UgKHBfc190Yi0+RlJbaV0pO3Bfc190Yi0+RlJbaV0gPSBOVUxMOworCSAgICBicmVsc2UgKHBfc190Yi0+Q0ZMW2ldKTtwX3NfdGItPkNGTFtpXSA9IE5VTEw7CisJICAgIGJyZWxzZSAocF9zX3RiLT5DRlJbaV0pO3Bfc190Yi0+Q0ZSW2ldID0gTlVMTDsKKwl9CisKKwlpZiAod2FpdF90Yl9idWZmZXJzX3J1bikgeworCSAgICBmb3IgKCBpID0gMDsgaSA8IE1BWF9GRUJfU0laRTsgaSsrICkgeyAKKwkJaWYgKCBwX3NfdGItPkZFQltpXSApIHsKKwkJICAgIHJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHBfc190Yi0+dGJfc2IsIAorCQkJCQkJICAgICBwX3NfdGItPkZFQltpXSkgOworCQl9CisJICAgIH0KKwl9CisJcmV0dXJuIG5fcmV0X3ZhbHVlOworICAgIH0KKworfQorCisKKy8qIEFuYXRvbHkgd2lsbCBwcm9iYWJseSBmb3JnaXZlIG1lIHJlbmFtaW5nIHBfc190YiB0byB0Yi4gSSBqdXN0CisgICB3YW50ZWQgdG8gbWFrZSBsaW5lcyBzaG9ydGVyICovCit2b2lkIHVuZml4X25vZGVzIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIpCit7CisgICAgaW50CWk7CisKKyAgICAvKiBSZWxlYXNlIHBhdGggYnVmZmVycy4gKi8KKyAgICBwYXRocmVsc2VfYW5kX3Jlc3RvcmUgKHRiLT50Yl9zYiwgdGItPnRiX3BhdGgpOworCisgICAgLyogYnJlbHNlIGFsbCByZXNvdXJjZXMgY29sbGVjdGVkIGZvciBiYWxhbmNpbmcgKi8KKyAgICBmb3IgKCBpID0gMDsgaSA8IE1BWF9IRUlHSFQ7IGkrKyApIHsKKwlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlciAodGItPnRiX3NiLCB0Yi0+TFtpXSk7CisJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIgKHRiLT50Yl9zYiwgdGItPlJbaV0pOworCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyICh0Yi0+dGJfc2IsIHRiLT5GTFtpXSk7CisJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIgKHRiLT50Yl9zYiwgdGItPkZSW2ldKTsKKwlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlciAodGItPnRiX3NiLCB0Yi0+Q0ZMW2ldKTsKKwlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlciAodGItPnRiX3NiLCB0Yi0+Q0ZSW2ldKTsKKworCWJyZWxzZSAodGItPkxbaV0pOworCWJyZWxzZSAodGItPlJbaV0pOworCWJyZWxzZSAodGItPkZMW2ldKTsKKwlicmVsc2UgKHRiLT5GUltpXSk7CisJYnJlbHNlICh0Yi0+Q0ZMW2ldKTsKKwlicmVsc2UgKHRiLT5DRlJbaV0pOworICAgIH0KKworICAgIC8qIGRlYWwgd2l0aCBsaXN0IG9mIGFsbG9jYXRlZCAodXNlZCBhbmQgdW51c2VkKSBub2RlcyAqLworICAgIGZvciAoIGkgPSAwOyBpIDwgTUFYX0ZFQl9TSVpFOyBpKysgKSB7CisJaWYgKCB0Yi0+RkVCW2ldICkgeworCSAgICBiX2Jsb2NrbnJfdCBibG9ja25yICA9IHRiLT5GRUJbaV0tPmJfYmxvY2tuciA7CisJICAgIC8qIGRlLWFsbG9jYXRlZCBibG9jayB3aGljaCB3YXMgbm90IHVzZWQgYnkgYmFsYW5jaW5nIGFuZAorICAgICAgICAgICAgICAgYmZvcmdldCBhYm91dCBidWZmZXIgZm9yIGl0ICovCisJICAgIGJyZWxzZSAodGItPkZFQltpXSk7CisJICAgIHJlaXNlcmZzX2ZyZWVfYmxvY2sgKHRiLT50cmFuc2FjdGlvbl9oYW5kbGUsIE5VTEwsIGJsb2NrbnIsIDApOworCX0KKwlpZiAodGItPnVzZWRbaV0pIHsKKwkgICAgLyogcmVsZWFzZSB1c2VkIGFzIG5ldyBub2RlcyBpbmNsdWRpbmcgYSBuZXcgcm9vdCAqLworCSAgICBicmVsc2UgKHRiLT51c2VkW2ldKTsKKwl9CisgICAgfQorCisgICAgaWYgKHRiLT52bl9idWYpIAorICAgIHJlaXNlcmZzX2tmcmVlICh0Yi0+dm5fYnVmLCB0Yi0+dm5fYnVmX3NpemUsIHRiLT50Yl9zYik7CisKK30gCisKKworCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9oYXNoZXMuYyBiL2ZzL3JlaXNlcmZzL2hhc2hlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZDA1MDgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9yZWlzZXJmcy9oYXNoZXMuYwpAQCAtMCwwICsxLDIwOSBAQAorCisvKgorICogS2V5ZWQgMzItYml0IGhhc2ggZnVuY3Rpb24gdXNpbmcgVEVBIGluIGEgRGF2aXMtTWV5ZXIgZnVuY3Rpb24KKyAqICAgSDAgPSBLZXkKKyAqICAgSGkgPSBFIE1pKEhpLTEpICsgSGktMQorICoKKyAqIChzZWUgQXBwbGllZCBDcnlwdG9ncmFwaHksIDJuZCBlZGl0aW9uLCBwNDQ4KS4KKyAqCisgKiBKZXJlbXkgRml0emhhcmRpbmdlIDxqZXJlbXlAemlwLmNvbS5hdT4gMTk5OAorICogCisgKiBKZXJlbXkgaGFzIGFncmVlZCB0byB0aGUgY29udGVudHMgb2YgcmVpc2VyZnMvUkVBRE1FLiAtSGFucworICogWXVyYSdzIGZ1bmN0aW9uIGlzIGFkZGVkICgwNC8wNy8yMDAwKQorICovCisKKy8vCisvLyBrZXllZF9oYXNoCisvLyB5dXJhX2hhc2gKKy8vIHI1X2hhc2gKKy8vCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vYnVnLmg+CisKKworI2RlZmluZSBERUxUQSAweDlFMzc3OUI5CisjZGVmaW5lIEZVTExST1VORFMgMTAJCS8qIDMyIGlzIG92ZXJraWxsLCAxNiBpcyBzdHJvbmcgY3J5cHRvICovCisjZGVmaW5lIFBBUlRST1VORFMgNgkJLyogNiBnZXRzIGNvbXBsZXRlIG1peGluZyAqLworCisvKiBhLCBiLCBjLCBkIC0gZGF0YTsgaDAsIGgxIC0gYWNjdW11bGF0ZWQgaGFzaCAqLworI2RlZmluZSBURUFDT1JFKHJvdW5kcykJCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJdTMyIHN1bSA9IDA7CQkJCQkJXAorCQlpbnQgbiA9IHJvdW5kczsJCQkJCQlcCisJCXUzMiBiMCwgYjE7CQkJCQkJXAorCQkJCQkJCQkJXAorCQliMCA9IGgwOwkJCQkJCVwKKwkJYjEgPSBoMTsJCQkJCQlcCisJCQkJCQkJCQlcCisJCWRvCQkJCQkJCVwKKwkJewkJCQkJCQlcCisJCQlzdW0gKz0gREVMVEE7CQkJCQlcCisJCQliMCArPSAoKGIxIDw8IDQpK2EpIF4gKGIxK3N1bSkgXiAoKGIxID4+IDUpK2IpOwlcCisJCQliMSArPSAoKGIwIDw8IDQpK2MpIF4gKGIwK3N1bSkgXiAoKGIwID4+IDUpK2QpOwlcCisJCX0gd2hpbGUoLS1uKTsJCQkJCQlcCisJCQkJCQkJCQlcCisJCWgwICs9IGIwOwkJCQkJCVwKKwkJaDEgKz0gYjE7CQkJCQkJXAorCX0gd2hpbGUoMCkKKworCit1MzIga2V5ZWRfaGFzaChjb25zdCBzaWduZWQgY2hhciAqbXNnLCBpbnQgbGVuKQoreworCXUzMiBrW10gPSB7IDB4OTQ2NGE0ODUsIDB4NTQyZTFhOTQsIDB4M2U4NDZiZmYsIDB4Yjc1YmNmYzN9OyAKKworCXUzMiBoMCA9IGtbMF0sIGgxID0ga1sxXTsKKwl1MzIgYSwgYiwgYywgZDsKKwl1MzIgcGFkOworCWludCBpOworIAorCS8vCWFzc2VydChsZW4gPj0gMCAmJiBsZW4gPCAyNTYpOworCisJcGFkID0gKHUzMilsZW4gfCAoKHUzMilsZW4gPDwgOCk7CisJcGFkIHw9IHBhZCA8PCAxNjsKKworCXdoaWxlKGxlbiA+PSAxNikKKwl7CisJCWEgPSAodTMyKW1zZ1sgMF0gICAgICB8CisJCSAgICAodTMyKW1zZ1sgMV0gPDwgOCB8CisJCSAgICAodTMyKW1zZ1sgMl0gPDwgMTZ8CisJCSAgICAodTMyKW1zZ1sgM10gPDwgMjQ7CisJCWIgPSAodTMyKW1zZ1sgNF0gICAgICB8CisJCSAgICAodTMyKW1zZ1sgNV0gPDwgOCB8CisJCSAgICAodTMyKW1zZ1sgNl0gPDwgMTZ8CisJCSAgICAodTMyKW1zZ1sgN10gPDwgMjQ7CisJCWMgPSAodTMyKW1zZ1sgOF0gICAgICB8CisJCSAgICAodTMyKW1zZ1sgOV0gPDwgOCB8CisJCSAgICAodTMyKW1zZ1sxMF0gPDwgMTZ8CisJCSAgICAodTMyKW1zZ1sxMV0gPDwgMjQ7CisJCWQgPSAodTMyKW1zZ1sxMl0gICAgICB8CisJCSAgICAodTMyKW1zZ1sxM10gPDwgOCB8CisJCSAgICAodTMyKW1zZ1sxNF0gPDwgMTZ8CisJCSAgICAodTMyKW1zZ1sxNV0gPDwgMjQ7CisJCQorCQlURUFDT1JFKFBBUlRST1VORFMpOworCisJCWxlbiAtPSAxNjsKKwkJbXNnICs9IDE2OworCX0KKworCWlmIChsZW4gPj0gMTIpCisJeworCQlhID0gKHUzMiltc2dbIDBdICAgICAgfAorCQkgICAgKHUzMiltc2dbIDFdIDw8IDggfAorCQkgICAgKHUzMiltc2dbIDJdIDw8IDE2fAorCQkgICAgKHUzMiltc2dbIDNdIDw8IDI0OworCQliID0gKHUzMiltc2dbIDRdICAgICAgfAorCQkgICAgKHUzMiltc2dbIDVdIDw8IDggfAorCQkgICAgKHUzMiltc2dbIDZdIDw8IDE2fAorCQkgICAgKHUzMiltc2dbIDddIDw8IDI0OworCQljID0gKHUzMiltc2dbIDhdICAgICAgfAorCQkgICAgKHUzMiltc2dbIDldIDw8IDggfAorCQkgICAgKHUzMiltc2dbMTBdIDw8IDE2fAorCQkgICAgKHUzMiltc2dbMTFdIDw8IDI0OworCisJCWQgPSBwYWQ7CisJCWZvcihpID0gMTI7IGkgPCBsZW47IGkrKykKKwkJeworCQkJZCA8PD0gODsKKwkJCWQgfD0gbXNnW2ldOworCQl9CisJfQorCWVsc2UgaWYgKGxlbiA+PSA4KQorCXsKKwkJYSA9ICh1MzIpbXNnWyAwXSAgICAgIHwKKwkJICAgICh1MzIpbXNnWyAxXSA8PCA4IHwKKwkJICAgICh1MzIpbXNnWyAyXSA8PCAxNnwKKwkJICAgICh1MzIpbXNnWyAzXSA8PCAyNDsKKwkJYiA9ICh1MzIpbXNnWyA0XSAgICAgIHwKKwkJICAgICh1MzIpbXNnWyA1XSA8PCA4IHwKKwkJICAgICh1MzIpbXNnWyA2XSA8PCAxNnwKKwkJICAgICh1MzIpbXNnWyA3XSA8PCAyNDsKKworCQljID0gZCA9IHBhZDsKKwkJZm9yKGkgPSA4OyBpIDwgbGVuOyBpKyspCisJCXsKKwkJCWMgPDw9IDg7CisJCQljIHw9IG1zZ1tpXTsKKwkJfQorCX0KKwllbHNlIGlmIChsZW4gPj0gNCkKKwl7CisJCWEgPSAodTMyKW1zZ1sgMF0gICAgICB8CisJCSAgICAodTMyKW1zZ1sgMV0gPDwgOCB8CisJCSAgICAodTMyKW1zZ1sgMl0gPDwgMTZ8CisJCSAgICAodTMyKW1zZ1sgM10gPDwgMjQ7CisKKwkJYiA9IGMgPSBkID0gcGFkOworCQlmb3IoaSA9IDQ7IGkgPCBsZW47IGkrKykKKwkJeworCQkJYiA8PD0gODsKKwkJCWIgfD0gbXNnW2ldOworCQl9CisJfQorCWVsc2UKKwl7CisJCWEgPSBiID0gYyA9IGQgPSBwYWQ7CisJCWZvcihpID0gMDsgaSA8IGxlbjsgaSsrKQorCQl7CisJCQlhIDw8PSA4OworCQkJYSB8PSBtc2dbaV07CisJCX0KKwl9CisKKwlURUFDT1JFKEZVTExST1VORFMpOworCisvKglyZXR1cm4gMDsqLworCXJldHVybiBoMF5oMTsKK30KKworLyogV2hhdCBmb2xsb3dzIGluIHRoaXMgZmlsZSBpcyBjb3B5cmlnaHQgMjAwMCBieSBIYW5zIFJlaXNlciwgYW5kIHRoZQorICogbGljZW5zaW5nIG9mIHdoYXQgZm9sbG93cyBpcyBnb3Zlcm5lZCBieSByZWlzZXJmcy9SRUFETUUgKi8KKwordTMyIHl1cmFfaGFzaCAoY29uc3Qgc2lnbmVkIGNoYXIgKm1zZywgaW50IGxlbikKK3sKKyAgICBpbnQgaiwgcG93OworICAgIHUzMiBhLCBjOworICAgIGludCBpOworICAgIAorICAgIGZvciAocG93PTEsaT0xOyBpIDwgbGVuOyBpKyspIHBvdyA9IHBvdyAqIDEwOyAKKyAgICAKKyAgICBpZiAobGVuID09IDEpIAorCWEgPSBtc2dbMF0tNDg7CisgICAgZWxzZQorCWEgPSAobXNnWzBdIC0gNDgpICogcG93OworICAgIAorICAgIGZvciAoaT0xOyBpIDwgbGVuOyBpKyspIHsKKwljID0gbXNnW2ldIC0gNDg7IAorCWZvciAocG93PTEsaj1pOyBqIDwgbGVuLTE7IGorKykgcG93ID0gcG93ICogMTA7IAorCWEgPSBhICsgYyAqIHBvdzsKKyAgICB9CisgICAgCisgICAgZm9yICg7IGkgPCA0MDsgaSsrKSB7CisJYyA9ICcwJyAtIDQ4OyAKKwlmb3IgKHBvdz0xLGo9aTsgaiA8IGxlbi0xOyBqKyspIHBvdyA9IHBvdyAqIDEwOyAKKwlhID0gYSArIGMgKiBwb3c7CisgICAgfQorICAgIAorICAgIGZvciAoOyBpIDwgMjU2OyBpKyspIHsKKwljID0gaTsgCisJZm9yIChwb3c9MSxqPWk7IGogPCBsZW4tMTsgaisrKSBwb3cgPSBwb3cgKiAxMDsgCisJYSA9IGEgKyBjICogcG93OworICAgIH0KKyAgICAKKyAgICBhID0gYSA8PCA3OworICAgIHJldHVybiBhOworfQorCit1MzIgcjVfaGFzaCAoY29uc3Qgc2lnbmVkIGNoYXIgKm1zZywgaW50IGxlbikKK3sKKyAgdTMyIGE9MDsKKyAgd2hpbGUoKm1zZykgeyAKKyAgICBhICs9ICptc2cgPDwgNDsKKyAgICBhICs9ICptc2cgPj4gNDsKKyAgICBhICo9IDExOworICAgIG1zZysrOworICAgfSAKKyAgcmV0dXJuIGE7Cit9CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9pYmFsYW5jZS5jIGIvZnMvcmVpc2VyZnMvaWJhbGFuY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzYyMTI1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvcmVpc2VyZnMvaWJhbGFuY2UuYwpAQCAtMCwwICsxLDEwNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMCBieSBIYW5zIFJlaXNlciwgbGljZW5zaW5nIGdvdmVybmVkIGJ5IHJlaXNlcmZzL1JFQURNRQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisKKy8qIHRoaXMgaXMgb25lIGFuZCBvbmx5IGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCBvdXRzaWRlIChkb19iYWxhbmNlLmMpICovCitpbnQJYmFsYW5jZV9pbnRlcm5hbCAoCisJCQkgIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiAsCisJCQkgIGludCwKKwkJCSAgaW50LAorCQkJICBzdHJ1Y3QgaXRlbV9oZWFkICogLAorCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiogCisJCQkgICk7CisKKy8qIG1vZGVzIG9mIGludGVybmFsX3NoaWZ0X2xlZnQsIGludGVybmFsX3NoaWZ0X3JpZ2h0IGFuZCBpbnRlcm5hbF9pbnNlcnRfY2hpbGRzICovCisjZGVmaW5lIElOVEVSTkFMX1NISUZUX0ZST01fU19UT19MIDAKKyNkZWZpbmUgSU5URVJOQUxfU0hJRlRfRlJPTV9SX1RPX1MgMQorI2RlZmluZSBJTlRFUk5BTF9TSElGVF9GUk9NX0xfVE9fUyAyCisjZGVmaW5lIElOVEVSTkFMX1NISUZUX0ZST01fU19UT19SIDMKKyNkZWZpbmUgSU5URVJOQUxfSU5TRVJUX1RPX1MgNAorI2RlZmluZSBJTlRFUk5BTF9JTlNFUlRfVE9fTCA1CisjZGVmaW5lIElOVEVSTkFMX0lOU0VSVF9UT19SIDYKKworc3RhdGljIHZvaWQJaW50ZXJuYWxfZGVmaW5lX2Rlc3Rfc3JjX2luZm9zICgKKwkJCQkJCWludCBzaGlmdF9tb2RlLAorCQkJCQkJc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLAorCQkJCQkJaW50IGgsCisJCQkJCQlzdHJ1Y3QgYnVmZmVyX2luZm8gKiBkZXN0X2JpLAorCQkJCQkJc3RydWN0IGJ1ZmZlcl9pbmZvICogc3JjX2JpLAorCQkJCQkJaW50ICogZF9rZXksCisJCQkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiogY2YKKwkJCQkJCSkKK3sKKyAgICBtZW1zZXQgKGRlc3RfYmksIDAsIHNpemVvZiAoc3RydWN0IGJ1ZmZlcl9pbmZvKSk7CisgICAgbWVtc2V0IChzcmNfYmksIDAsIHNpemVvZiAoc3RydWN0IGJ1ZmZlcl9pbmZvKSk7CisgICAgLyogZGVmaW5lIGRlc3QsIHNyYywgZGVzdCBwYXJlbnQsIGRlc3QgcG9zaXRpb24gKi8KKyAgICBzd2l0Y2ggKHNoaWZ0X21vZGUpIHsKKyAgICBjYXNlIElOVEVSTkFMX1NISUZUX0ZST01fU19UT19MOgkvKiB1c2VkIGluIGludGVybmFsX3NoaWZ0X2xlZnQgKi8KKwlzcmNfYmktPnRiID0gdGI7CisJc3JjX2JpLT5iaV9iaCA9IFBBVEhfSF9QQlVGRkVSICh0Yi0+dGJfcGF0aCwgaCk7CisJc3JjX2JpLT5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIGgpOworCXNyY19iaS0+YmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCBoICsgMSk7CisJZGVzdF9iaS0+dGIgPSB0YjsKKwlkZXN0X2JpLT5iaV9iaCA9IHRiLT5MW2hdOworCWRlc3RfYmktPmJpX3BhcmVudCA9IHRiLT5GTFtoXTsKKwlkZXN0X2JpLT5iaV9wb3NpdGlvbiA9IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgaCk7CisJKmRfa2V5ID0gdGItPmxrZXlbaF07CisJKmNmID0gdGItPkNGTFtoXTsKKwlicmVhazsKKyAgICBjYXNlIElOVEVSTkFMX1NISUZUX0ZST01fTF9UT19TOgorCXNyY19iaS0+dGIgPSB0YjsKKwlzcmNfYmktPmJpX2JoID0gdGItPkxbaF07CisJc3JjX2JpLT5iaV9wYXJlbnQgPSB0Yi0+RkxbaF07CisJc3JjX2JpLT5iaV9wb3NpdGlvbiA9IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgaCk7CisJZGVzdF9iaS0+dGIgPSB0YjsKKwlkZXN0X2JpLT5iaV9iaCA9IFBBVEhfSF9QQlVGRkVSICh0Yi0+dGJfcGF0aCwgaCk7CisJZGVzdF9iaS0+YmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCBoKTsKKwlkZXN0X2JpLT5iaV9wb3NpdGlvbiA9IFBBVEhfSF9QT1NJVElPTiAodGItPnRiX3BhdGgsIGggKyAxKTsgLyogZGVzdCBwb3NpdGlvbiBpcyBhbmFsb2cgb2YgZGVzdC0+Yl9pdGVtX29yZGVyICovCisJKmRfa2V5ID0gdGItPmxrZXlbaF07CisJKmNmID0gdGItPkNGTFtoXTsKKwlicmVhazsKKyAgICAgIAorICAgIGNhc2UgSU5URVJOQUxfU0hJRlRfRlJPTV9SX1RPX1M6CS8qIHVzZWQgaW4gaW50ZXJuYWxfc2hpZnRfbGVmdCAqLworCXNyY19iaS0+dGIgPSB0YjsKKwlzcmNfYmktPmJpX2JoID0gdGItPlJbaF07CisJc3JjX2JpLT5iaV9wYXJlbnQgPSB0Yi0+RlJbaF07CisJc3JjX2JpLT5iaV9wb3NpdGlvbiA9IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIGgpOworCWRlc3RfYmktPnRiID0gdGI7CisJZGVzdF9iaS0+YmlfYmggPSBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpOworCWRlc3RfYmktPmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgaCk7CisJZGVzdF9iaS0+YmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCBoICsgMSk7CisJKmRfa2V5ID0gdGItPnJrZXlbaF07CisJKmNmID0gdGItPkNGUltoXTsKKwlicmVhazsKKworICAgIGNhc2UgSU5URVJOQUxfU0hJRlRfRlJPTV9TX1RPX1I6CisJc3JjX2JpLT50YiA9IHRiOworCXNyY19iaS0+YmlfYmggPSBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpOworCXNyY19iaS0+YmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCBoKTsKKwlzcmNfYmktPmJpX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgaCArIDEpOworCWRlc3RfYmktPnRiID0gdGI7CisJZGVzdF9iaS0+YmlfYmggPSB0Yi0+UltoXTsKKwlkZXN0X2JpLT5iaV9wYXJlbnQgPSB0Yi0+RlJbaF07CisJZGVzdF9iaS0+YmlfcG9zaXRpb24gPSBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCBoKTsKKwkqZF9rZXkgPSB0Yi0+cmtleVtoXTsKKwkqY2YgPSB0Yi0+Q0ZSW2hdOworCWJyZWFrOworCisgICAgY2FzZSBJTlRFUk5BTF9JTlNFUlRfVE9fTDoKKwlkZXN0X2JpLT50YiA9IHRiOworCWRlc3RfYmktPmJpX2JoID0gdGItPkxbaF07CisJZGVzdF9iaS0+YmlfcGFyZW50ID0gdGItPkZMW2hdOworCWRlc3RfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCBoKTsKKwlicmVhazsKKwkKKyAgICBjYXNlIElOVEVSTkFMX0lOU0VSVF9UT19TOgorCWRlc3RfYmktPnRiID0gdGI7CisJZGVzdF9iaS0+YmlfYmggPSBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpOworCWRlc3RfYmktPmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgaCk7CisJZGVzdF9iaS0+YmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCBoICsgMSk7CisJYnJlYWs7CisKKyAgICBjYXNlIElOVEVSTkFMX0lOU0VSVF9UT19SOgorCWRlc3RfYmktPnRiID0gdGI7CisJZGVzdF9iaS0+YmlfYmggPSB0Yi0+UltoXTsKKwlkZXN0X2JpLT5iaV9wYXJlbnQgPSB0Yi0+RlJbaF07CisJZGVzdF9iaS0+YmlfcG9zaXRpb24gPSBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCBoKTsKKwlicmVhazsKKworICAgIGRlZmF1bHQ6CisJcmVpc2VyZnNfcGFuaWMgKHRiLT50Yl9zYiwgImludGVybmFsX2RlZmluZV9kZXN0X3NyY19pbmZvczogc2hpZnQgdHlwZSBpcyB1bmtub3duICglZCkiLCBzaGlmdF9tb2RlKTsKKyAgICB9Cit9CisKKworCisvKiBJbnNlcnQgY291bnQgbm9kZSBwb2ludGVycyBpbnRvIGJ1ZmZlciBjdXIgYmVmb3JlIHBvc2l0aW9uIHRvICsgMS4KKyAqIEluc2VydCBjb3VudCBpdGVtcyBpbnRvIGJ1ZmZlciBjdXIgYmVmb3JlIHBvc2l0aW9uIHRvLgorICogSXRlbXMgYW5kIG5vZGUgcG9pbnRlcnMgYXJlIHNwZWNpZmllZCBieSBpbnNlcnRlZCBhbmQgYmggcmVzcGVjdGl2ZWx5LgorICovIAorc3RhdGljIHZvaWQgaW50ZXJuYWxfaW5zZXJ0X2NoaWxkcyAoc3RydWN0IGJ1ZmZlcl9pbmZvICogY3VyX2JpLAorCQkJCSAgICBpbnQgdG8sIGludCBjb3VudCwKKwkJCQkgICAgc3RydWN0IGl0ZW1faGVhZCAqIGluc2VydGVkLAorCQkJCSAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiogYmgKKyAgICApCit7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogY3VyID0gY3VyX2JpLT5iaV9iaDsKKyAgICBzdHJ1Y3QgYmxvY2tfaGVhZCAqIGJsa2g7CisgICAgaW50IG5yOworICAgIHN0cnVjdCByZWlzZXJmc19rZXkgKiBpaDsKKyAgICBzdHJ1Y3QgZGlza19jaGlsZCBuZXdfZGNbMl07CisgICAgc3RydWN0IGRpc2tfY2hpbGQgKiBkYzsKKyAgICBpbnQgaTsKKworICAgIGlmIChjb3VudCA8PSAwKQorCXJldHVybjsKKworICAgIGJsa2ggPSBCX0JMS19IRUFEKGN1cik7CisgICAgbnIgPSBibGtoX25yX2l0ZW0oYmxraCk7CisKKyAgICBSRkFMU0UoIGNvdW50ID4gMiwKKwkgICAgInRvbyBtYW55IGNoaWxkcmVuICglZCkgYXJlIHRvIGJlIGluc2VydGVkIiwgY291bnQpOworICAgIFJGQUxTRSggQl9GUkVFX1NQQUNFIChjdXIpIDwgY291bnQgKiAoS0VZX1NJWkUgKyBEQ19TSVpFKSwKKwkgICAgIm5vIGVub3VnaCBmcmVlIHNwYWNlICglZCksIG5lZWRlZCAlZCBieXRlcyIsIAorCSAgICBCX0ZSRUVfU1BBQ0UgKGN1ciksIGNvdW50ICogKEtFWV9TSVpFICsgRENfU0laRSkpOworCisgICAgLyogcHJlcGFyZSBzcGFjZSBmb3IgY291bnQgZGlza19jaGlsZCAqLworICAgIGRjID0gQl9OX0NISUxEKGN1cix0bysxKTsKKworICAgIG1lbW1vdmUgKGRjICsgY291bnQsIGRjLCAobnIrMS0odG8rMSkpICogRENfU0laRSk7CisKKyAgICAvKiBjb3B5IHRvX2JlX2luc2VydCBkaXNrIGNoaWxkcmVuICovCisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpICsrKSB7CisJcHV0X2RjX3NpemUoICYobmV3X2RjW2ldKSwgTUFYX0NISUxEX1NJWkUoYmhbaV0pIC0gQl9GUkVFX1NQQUNFKGJoW2ldKSk7CisJcHV0X2RjX2Jsb2NrX251bWJlciggJihuZXdfZGNbaV0pLCBiaFtpXS0+Yl9ibG9ja25yICk7CisgICAgfQorICAgIG1lbWNweSAoZGMsIG5ld19kYywgRENfU0laRSAqIGNvdW50KTsKKworICAKKyAgICAvKiBwcmVwYXJlIHNwYWNlIGZvciBjb3VudCBpdGVtcyAgKi8KKyAgICBpaCA9IEJfTl9QREVMSU1fS0VZIChjdXIsICgodG8gPT0gLTEpID8gMCA6IHRvKSk7CisKKyAgICBtZW1tb3ZlIChpaCArIGNvdW50LCBpaCwgKG5yIC0gdG8pICogS0VZX1NJWkUgKyAobnIgKyAxICsgY291bnQpICogRENfU0laRSk7CisKKyAgICAvKiBjb3B5IGl0ZW0gaGVhZGVycyAoa2V5cykgKi8KKyAgICBtZW1jcHkgKGloLCBpbnNlcnRlZCwgS0VZX1NJWkUpOworICAgIGlmICggY291bnQgPiAxICkKKwltZW1jcHkgKGloICsgMSwgaW5zZXJ0ZWQgKyAxLCBLRVlfU0laRSk7CisKKyAgICAvKiBzaXplcywgaXRlbSBudW1iZXIgKi8KKyAgICBzZXRfYmxraF9ucl9pdGVtKCBibGtoLCBibGtoX25yX2l0ZW0oYmxraCkgKyBjb3VudCApOworICAgIHNldF9ibGtoX2ZyZWVfc3BhY2UoIGJsa2gsCisgICAgICAgICAgICAgICAgICAgICAgICBibGtoX2ZyZWVfc3BhY2UoYmxraCkgLSBjb3VudCAqIChEQ19TSVpFICsgS0VZX1NJWkUgKSApOworCisgICAgZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5IChjdXJfYmktPnRiLCBjdXIsMCk7CisKKyAgICAvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovCisgICAgY2hlY2tfaW50ZXJuYWwgKGN1cik7CisgICAgLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLworCisgICAgaWYgKGN1cl9iaS0+YmlfcGFyZW50KSB7CisJc3RydWN0IGRpc2tfY2hpbGQgKnRfZGMgPSBCX05fQ0hJTEQgKGN1cl9iaS0+YmlfcGFyZW50LGN1cl9iaS0+YmlfcG9zaXRpb24pOworCXB1dF9kY19zaXplKCB0X2RjLCBkY19zaXplKHRfZGMpICsgKGNvdW50ICogKERDX1NJWkUgKyBLRVlfU0laRSkpKTsKKwlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkoY3VyX2JpLT50YiwgY3VyX2JpLT5iaV9wYXJlbnQsIDApOworCisJLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLworCWNoZWNrX2ludGVybmFsIChjdXJfYmktPmJpX3BhcmVudCk7CisJLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLyAgIAorICAgIH0KKworfQorCisKKy8qIERlbGV0ZSBkZWxfbnVtIGl0ZW1zIGFuZCBub2RlIHBvaW50ZXJzIGZyb20gYnVmZmVyIGN1ciBzdGFydGluZyBmcm9tICoKKyAqIHRoZSBmaXJzdF9pJ3RoIGl0ZW0gYW5kIGZpcnN0X3AndGggcG9pbnRlcnMgcmVzcGVjdGl2ZWx5LgkJKi8KK3N0YXRpYyB2b2lkCWludGVybmFsX2RlbGV0ZV9wb2ludGVyc19pdGVtcyAoCisJCQkJCQlzdHJ1Y3QgYnVmZmVyX2luZm8gKiBjdXJfYmksCisJCQkJCQlpbnQgZmlyc3RfcCwgCisJCQkJCQlpbnQgZmlyc3RfaSwgCisJCQkJCQlpbnQgZGVsX251bQorCQkJCQkJKQoreworICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBjdXIgPSBjdXJfYmktPmJpX2JoOworICBpbnQgbnI7CisgIHN0cnVjdCBibG9ja19oZWFkICogYmxraDsKKyAgc3RydWN0IHJlaXNlcmZzX2tleSAqIGtleTsKKyAgc3RydWN0IGRpc2tfY2hpbGQgKiBkYzsKKworICBSRkFMU0UoIGN1ciA9PSBOVUxMLCAiYnVmZmVyIGlzIDAiKTsKKyAgUkZBTFNFKCBkZWxfbnVtIDwgMCwKKyAgICAgICAgICAibmVnYXRpdmUgbnVtYmVyIG9mIGl0ZW1zICglZCkgY2FuIG5vdCBiZSBkZWxldGVkIiwgZGVsX251bSk7CisgIFJGQUxTRSggZmlyc3RfcCA8IDAgfHwgZmlyc3RfcCArIGRlbF9udW0gPiBCX05SX0lURU1TIChjdXIpICsgMSB8fCBmaXJzdF9pIDwgMCwKKyAgICAgICAgICAiZmlyc3QgcG9pbnRlciBvcmRlciAoJWQpIDwgMCBvciAiCisgICAgICAgICAgIm5vIHNvIG1hbnkgcG9pbnRlcnMgKCVkKSwgb25seSAoJWQpIG9yICIKKyAgICAgICAgICAiZmlyc3Qga2V5IG9yZGVyICVkIDwgMCIsIGZpcnN0X3AsIAorICAgICAgICAgIGZpcnN0X3AgKyBkZWxfbnVtLCBCX05SX0lURU1TIChjdXIpICsgMSwgZmlyc3RfaSk7CisgIGlmICggZGVsX251bSA9PSAwICkKKyAgICByZXR1cm47CisKKyAgYmxraCA9IEJfQkxLX0hFQUQoY3VyKTsKKyAgbnIgPSBibGtoX25yX2l0ZW0oYmxraCk7CisKKyAgaWYgKCBmaXJzdF9wID09IDAgJiYgZGVsX251bSA9PSBuciArIDEgKSB7CisgICAgUkZBTFNFKCBmaXJzdF9pICE9IDAsICIxc3QgZGVsZXRlZCBrZXkgbXVzdCBoYXZlIG9yZGVyIDAsIG5vdCAlZCIsIGZpcnN0X2kpOworICAgIG1ha2VfZW1wdHlfbm9kZSAoY3VyX2JpKTsKKyAgICByZXR1cm47CisgIH0KKworICBSRkFMU0UoIGZpcnN0X2kgKyBkZWxfbnVtID4gQl9OUl9JVEVNUyAoY3VyKSwKKyAgICAgICAgICAiZmlyc3RfaSA9ICVkIGRlbF9udW0gPSAlZCAiCisgICAgICAgICAgIm5vIHNvIG1hbnkga2V5cyAoJWQpIGluIHRoZSBub2RlICglYikoJXopIiwKKyAgICAgICAgICBmaXJzdF9pLCBkZWxfbnVtLCBmaXJzdF9pICsgZGVsX251bSwgY3VyLCBjdXIpOworCisKKyAgLyogZGVsZXRpbmcgKi8KKyAgZGMgPSBCX05fQ0hJTEQgKGN1ciwgZmlyc3RfcCk7CisKKyAgbWVtbW92ZSAoZGMsIGRjICsgZGVsX251bSwgKG5yICsgMSAtIGZpcnN0X3AgLSBkZWxfbnVtKSAqIERDX1NJWkUpOworICBrZXkgPSBCX05fUERFTElNX0tFWSAoY3VyLCBmaXJzdF9pKTsKKyAgbWVtbW92ZSAoa2V5LCBrZXkgKyBkZWxfbnVtLCAobnIgLSBmaXJzdF9pIC0gZGVsX251bSkgKiBLRVlfU0laRSArIChuciArIDEgLSBkZWxfbnVtKSAqIERDX1NJWkUpOworCisKKyAgLyogc2l6ZXMsIGl0ZW0gbnVtYmVyICovCisgIHNldF9ibGtoX25yX2l0ZW0oIGJsa2gsIGJsa2hfbnJfaXRlbShibGtoKSAtIGRlbF9udW0gKTsKKyAgc2V0X2Jsa2hfZnJlZV9zcGFjZSggYmxraCwKKyAgICAgICAgICAgICAgICAgICAgYmxraF9mcmVlX3NwYWNlKGJsa2gpICsgKGRlbF9udW0gKiAoS0VZX1NJWkUgKyBEQ19TSVpFKSApICk7CisKKyAgZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5IChjdXJfYmktPnRiLCBjdXIsIDApOworICAvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KKyAgY2hlY2tfaW50ZXJuYWwgKGN1cik7CisgIC8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLworIAorICBpZiAoY3VyX2JpLT5iaV9wYXJlbnQpIHsKKyAgICBzdHJ1Y3QgZGlza19jaGlsZCAqdF9kYzsKKyAgICB0X2RjID0gQl9OX0NISUxEIChjdXJfYmktPmJpX3BhcmVudCwgY3VyX2JpLT5iaV9wb3NpdGlvbik7CisgICAgcHV0X2RjX3NpemUoIHRfZGMsIGRjX3NpemUodF9kYykgLSAoZGVsX251bSAqIChLRVlfU0laRSArIERDX1NJWkUpICkgKTsKKworICAgIGRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSAoY3VyX2JpLT50YiwgY3VyX2JpLT5iaV9wYXJlbnQsMCk7CisgICAgLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLworICAgIGNoZWNrX2ludGVybmFsIChjdXJfYmktPmJpX3BhcmVudCk7CisgICAgLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLyAgIAorICB9Cit9CisKKworLyogZGVsZXRlIG4gbm9kZSBwb2ludGVycyBhbmQgaXRlbXMgc3RhcnRpbmcgZnJvbSBnaXZlbiBwb3NpdGlvbiAqLworc3RhdGljIHZvaWQgIGludGVybmFsX2RlbGV0ZV9jaGlsZHMgKHN0cnVjdCBidWZmZXJfaW5mbyAqIGN1cl9iaSwgCisJCQkJICAgICBpbnQgZnJvbSwgaW50IG4pCit7CisgIGludCBpX2Zyb207CisKKyAgaV9mcm9tID0gKGZyb20gPT0gMCkgPyBmcm9tIDogZnJvbSAtIDE7CisKKyAgLyogZGVsZXRlIG4gcG9pbnRlcnMgc3RhcnRpbmcgZnJvbSBgZnJvbScgcG9zaXRpb24gaW4gQ1VSOworICAgICBkZWxldGUgbiBrZXlzIHN0YXJ0aW5nIGZyb20gJ2lfZnJvbScgcG9zaXRpb24gaW4gQ1VSOworICAgICAqLworICBpbnRlcm5hbF9kZWxldGVfcG9pbnRlcnNfaXRlbXMgKGN1cl9iaSwgZnJvbSwgaV9mcm9tLCBuKTsKK30KKworCisvKiBjb3B5IGNweV9udW0gbm9kZSBwb2ludGVycyBhbmQgY3B5X251bSAtIDEgaXRlbXMgZnJvbSBidWZmZXIgc3JjIHRvIGJ1ZmZlciBkZXN0CisqIGxhc3RfZmlyc3QgPT0gRklSU1RfVE9fTEFTVCBtZWFucywgdGhhdCB3ZSBjb3B5IGZpcnN0IGl0ZW1zIGZyb20gc3JjIHRvIHRhaWwgb2YgZGVzdAorICogbGFzdF9maXJzdCA9PSBMQVNUX1RPX0ZJUlNUIG1lYW5zLCB0aGF0IHdlIGNvcHkgbGFzdCBpdGVtcyBmcm9tIHNyYyB0byBoZWFkIG9mIGRlc3QgCisgKi8KK3N0YXRpYyB2b2lkIGludGVybmFsX2NvcHlfcG9pbnRlcnNfaXRlbXMgKAorCQkJCQkgIHN0cnVjdCBidWZmZXJfaW5mbyAqIGRlc3RfYmksCisJCQkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICogc3JjLAorCQkJCQkgIGludCBsYXN0X2ZpcnN0LCBpbnQgY3B5X251bQorCQkJCQkgICkKK3sKKyAgLyogQVRURU5USU9OISBOdW1iZXIgb2Ygbm9kZSBwb2ludGVycyBpbiBERVNUIGlzIGVxdWFsIHRvIG51bWJlciBvZiBpdGVtcyBpbiBERVNUICoKKyAgICogYXMgZGVsaW1pdGluZyBrZXkgaGF2ZSBhbHJlYWR5IGluc2VydGVkIHRvIGJ1ZmZlciBkZXN0LiovCisgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGRlc3QgPSBkZXN0X2JpLT5iaV9iaDsKKyAgaW50IG5yX2Rlc3QsIG5yX3NyYzsKKyAgaW50IGRlc3Rfb3JkZXIsIHNyY19vcmRlcjsKKyAgc3RydWN0IGJsb2NrX2hlYWQgKiBibGtoOworICBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5OworICBzdHJ1Y3QgZGlza19jaGlsZCAqIGRjOworCisgIG5yX3NyYyA9IEJfTlJfSVRFTVMgKHNyYyk7CisKKyAgUkZBTFNFKCBkZXN0ID09IE5VTEwgfHwgc3JjID09IE5VTEwsIAorCSAgInNyYyAoJXApIG9yIGRlc3QgKCVwKSBidWZmZXIgaXMgMCIsIHNyYywgZGVzdCk7CisgIFJGQUxTRSggbGFzdF9maXJzdCAhPSBGSVJTVF9UT19MQVNUICYmIGxhc3RfZmlyc3QgIT0gTEFTVF9UT19GSVJTVCwKKwkgICJpbnZhbGlkIGxhc3RfZmlyc3QgcGFyYW1ldGVyICglZCkiLCBsYXN0X2ZpcnN0KTsKKyAgUkZBTFNFKCBucl9zcmMgPCBjcHlfbnVtIC0gMSwgCisJICAibm8gc28gbWFueSBpdGVtcyAoJWQpIGluIHNyYyAoJWQpIiwgY3B5X251bSwgbnJfc3JjKTsKKyAgUkZBTFNFKCBjcHlfbnVtIDwgMCwgImNweV9udW0gbGVzcyB0aGFuIDAgKCVkKSIsIGNweV9udW0pOworICBSRkFMU0UoIGNweV9udW0gLSAxICsgQl9OUl9JVEVNUyhkZXN0KSA+IChpbnQpTUFYX05SX0tFWShkZXN0KSwKKwkgICJjcHlfbnVtICglZCkgKyBpdGVtIG51bWJlciBpbiBkZXN0ICglZCkgY2FuIG5vdCBiZSA+IE1BWF9OUl9LRVkoJWQpIiwKKwkgIGNweV9udW0sIEJfTlJfSVRFTVMoZGVzdCksIE1BWF9OUl9LRVkoZGVzdCkpOworCisgIGlmICggY3B5X251bSA9PSAwICkKKyAgICByZXR1cm47CisKKwkvKiBjb3BpbmcgKi8KKyAgYmxraCA9IEJfQkxLX0hFQUQoZGVzdCk7CisgIG5yX2Rlc3QgPSBibGtoX25yX2l0ZW0oYmxraCk7CisKKyAgLypkZXN0X29yZGVyID0gKGxhc3RfZmlyc3QgPT0gTEFTVF9UT19GSVJTVCkgPyAwIDogbnJfZGVzdDsqLworICAvKnNyY19vcmRlciA9IChsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QpID8gKG5yX3NyYyAtIGNweV9udW0gKyAxKSA6IDA7Ki8KKyAgKGxhc3RfZmlyc3QgPT0gTEFTVF9UT19GSVJTVCkgPwkoZGVzdF9vcmRlciA9IDAsIHNyY19vcmRlciA9IG5yX3NyYyAtIGNweV9udW0gKyAxKSA6CisgICAgKGRlc3Rfb3JkZXIgPSBucl9kZXN0LCBzcmNfb3JkZXIgPSAwKTsKKworICAvKiBwcmVwYXJlIHNwYWNlIGZvciBjcHlfbnVtIHBvaW50ZXJzICovCisgIGRjID0gQl9OX0NISUxEIChkZXN0LCBkZXN0X29yZGVyKTsKKworICBtZW1tb3ZlIChkYyArIGNweV9udW0sIGRjLCAobnJfZGVzdCAtIGRlc3Rfb3JkZXIpICogRENfU0laRSk7CisKKwkvKiBpbnNlcnQgcG9pbnRlcnMgKi8KKyAgbWVtY3B5IChkYywgQl9OX0NISUxEIChzcmMsIHNyY19vcmRlciksIERDX1NJWkUgKiBjcHlfbnVtKTsKKworCisgIC8qIHByZXBhcmUgc3BhY2UgZm9yIGNweV9udW0gLSAxIGl0ZW0gaGVhZGVycyAqLworICBrZXkgPSBCX05fUERFTElNX0tFWShkZXN0LCBkZXN0X29yZGVyKTsKKyAgbWVtbW92ZSAoa2V5ICsgY3B5X251bSAtIDEsIGtleSwKKwkgICBLRVlfU0laRSAqIChucl9kZXN0IC0gZGVzdF9vcmRlcikgKyBEQ19TSVpFICogKG5yX2Rlc3QgKyBjcHlfbnVtKSk7CisKKworICAvKiBpbnNlcnQgaGVhZGVycyAqLworICBtZW1jcHkgKGtleSwgQl9OX1BERUxJTV9LRVkgKHNyYywgc3JjX29yZGVyKSwgS0VZX1NJWkUgKiAoY3B5X251bSAtIDEpKTsKKworICAvKiBzaXplcywgaXRlbSBudW1iZXIgKi8KKyAgc2V0X2Jsa2hfbnJfaXRlbSggYmxraCwgYmxraF9ucl9pdGVtKGJsa2gpICsgKGNweV9udW0gLSAxICkgKTsKKyAgc2V0X2Jsa2hfZnJlZV9zcGFjZSggYmxraCwKKyAgICAgIGJsa2hfZnJlZV9zcGFjZShibGtoKSAtIChLRVlfU0laRSAqIChjcHlfbnVtIC0gMSkgKyBEQ19TSVpFICogY3B5X251bSApICk7CisKKyAgZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5IChkZXN0X2JpLT50YiwgZGVzdCwgMCk7CisKKyAgLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLworICBjaGVja19pbnRlcm5hbCAoZGVzdCk7CisgIC8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KKworICBpZiAoZGVzdF9iaS0+YmlfcGFyZW50KSB7CisgICAgc3RydWN0IGRpc2tfY2hpbGQgKnRfZGM7CisgICAgdF9kYyA9IEJfTl9DSElMRChkZXN0X2JpLT5iaV9wYXJlbnQsZGVzdF9iaS0+YmlfcG9zaXRpb24pOworICAgIHB1dF9kY19zaXplKCB0X2RjLCBkY19zaXplKHRfZGMpICsgKEtFWV9TSVpFICogKGNweV9udW0gLSAxKSArIERDX1NJWkUgKiBjcHlfbnVtKSApOworCisgICAgZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5IChkZXN0X2JpLT50YiwgZGVzdF9iaS0+YmlfcGFyZW50LDApOworICAgIC8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KKyAgICBjaGVja19pbnRlcm5hbCAoZGVzdF9iaS0+YmlfcGFyZW50KTsKKyAgICAvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiovICAgCisgIH0KKworfQorCisKKy8qIENvcHkgY3B5X251bSBub2RlIHBvaW50ZXJzIGFuZCBjcHlfbnVtIC0gMSBpdGVtcyBmcm9tIGJ1ZmZlciBzcmMgdG8gYnVmZmVyIGRlc3QuCisgKiBEZWxldGUgY3B5X251bSAtIGRlbF9wYXIgaXRlbXMgYW5kIG5vZGUgcG9pbnRlcnMgZnJvbSBidWZmZXIgc3JjLgorICogbGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUIG1lYW5zLCB0aGF0IHdlIGNvcHkvZGVsZXRlIGZpcnN0IGl0ZW1zIGZyb20gc3JjLgorICogbGFzdF9maXJzdCA9PSBMQVNUX1RPX0ZJUlNUIG1lYW5zLCB0aGF0IHdlIGNvcHkvZGVsZXRlIGxhc3QgaXRlbXMgZnJvbSBzcmMuCisgKi8KK3N0YXRpYyB2b2lkIGludGVybmFsX21vdmVfcG9pbnRlcnNfaXRlbXMgKHN0cnVjdCBidWZmZXJfaW5mbyAqIGRlc3RfYmksIAorCQkJCQkgIHN0cnVjdCBidWZmZXJfaW5mbyAqIHNyY19iaSwgCisJCQkJCSAgaW50IGxhc3RfZmlyc3QsIGludCBjcHlfbnVtLCBpbnQgZGVsX3BhcikKK3sKKyAgICBpbnQgZmlyc3RfcG9pbnRlcjsKKyAgICBpbnQgZmlyc3RfaXRlbTsKKyAgICAKKyAgICBpbnRlcm5hbF9jb3B5X3BvaW50ZXJzX2l0ZW1zIChkZXN0X2JpLCBzcmNfYmktPmJpX2JoLCBsYXN0X2ZpcnN0LCBjcHlfbnVtKTsKKworICAgIGlmIChsYXN0X2ZpcnN0ID09IEZJUlNUX1RPX0xBU1QpIHsJLyogc2hpZnRfbGVmdCBvY2N1cnMgKi8KKwlmaXJzdF9wb2ludGVyID0gMDsKKwlmaXJzdF9pdGVtID0gMDsKKwkvKiBkZWxldGUgY3B5X251bSAtIGRlbF9wYXIgcG9pbnRlcnMgYW5kIGtleXMgc3RhcnRpbmcgZm9yIHBvaW50ZXJzIHdpdGggZmlyc3RfcG9pbnRlciwgCisJICAgZm9yIGtleSAtIHdpdGggZmlyc3RfaXRlbSAqLworCWludGVybmFsX2RlbGV0ZV9wb2ludGVyc19pdGVtcyAoc3JjX2JpLCBmaXJzdF9wb2ludGVyLCBmaXJzdF9pdGVtLCBjcHlfbnVtIC0gZGVsX3Bhcik7CisgICAgfSBlbHNlIHsJCQkvKiBzaGlmdF9yaWdodCBvY2N1cnMgKi8KKwlpbnQgaSwgajsKKworCWkgPSAoIGNweV9udW0gLSBkZWxfcGFyID09ICggaiA9IEJfTlJfSVRFTVMoc3JjX2JpLT5iaV9iaCkpICsgMSApID8gMCA6IGogLSBjcHlfbnVtICsgZGVsX3BhcjsKKworCWludGVybmFsX2RlbGV0ZV9wb2ludGVyc19pdGVtcyAoc3JjX2JpLCBqICsgMSAtIGNweV9udW0gKyBkZWxfcGFyLCBpLCBjcHlfbnVtIC0gZGVsX3Bhcik7CisgICAgfQorfQorCisvKiBJbnNlcnQgbl9zcmMndGgga2V5IG9mIGJ1ZmZlciBzcmMgYmVmb3JlIG5fZGVzdCd0aCBrZXkgb2YgYnVmZmVyIGRlc3QuICovCitzdGF0aWMgdm9pZCBpbnRlcm5hbF9pbnNlcnRfa2V5IChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBkZXN0X2JpLCAKKwkJCQkgaW50IGRlc3RfcG9zaXRpb25fYmVmb3JlLCAgICAgICAgICAgICAgICAgLyogaW5zZXJ0IGtleSBiZWZvcmUga2V5IHdpdGggbl9kZXN0IG51bWJlciAqLworCQkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzcmMsIAorCQkJCSBpbnQgc3JjX3Bvc2l0aW9uKQoreworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGRlc3QgPSBkZXN0X2JpLT5iaV9iaDsKKyAgICBpbnQgbnI7CisgICAgc3RydWN0IGJsb2NrX2hlYWQgKiBibGtoOworICAgIHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXk7CisKKyAgICBSRkFMU0UoIGRlc3QgPT0gTlVMTCB8fCBzcmMgPT0gTlVMTCwKKwkgICAgInNvdXJjZSglcCkgb3IgZGVzdCglcCkgYnVmZmVyIGlzIDAiLCBzcmMsIGRlc3QpOworICAgIFJGQUxTRSggZGVzdF9wb3NpdGlvbl9iZWZvcmUgPCAwIHx8IHNyY19wb3NpdGlvbiA8IDAsCisJICAgICJzb3VyY2UoJWQpIG9yIGRlc3QoJWQpIGtleSBudW1iZXIgbGVzcyB0aGFuIDAiLCAKKwkgICAgc3JjX3Bvc2l0aW9uLCBkZXN0X3Bvc2l0aW9uX2JlZm9yZSk7CisgICAgUkZBTFNFKCBkZXN0X3Bvc2l0aW9uX2JlZm9yZSA+IEJfTlJfSVRFTVMgKGRlc3QpIHx8IAorCSAgICBzcmNfcG9zaXRpb24gPj0gQl9OUl9JVEVNUyhzcmMpLAorCSAgICAiaW52YWxpZCBwb3NpdGlvbiBpbiBkZXN0ICglZCAoa2V5IG51bWJlciAlZCkpIG9yIGluIHNyYyAoJWQgKGtleSBudW1iZXIgJWQpKSIsCisJICAgIGRlc3RfcG9zaXRpb25fYmVmb3JlLCBCX05SX0lURU1TIChkZXN0KSwgCisJICAgIHNyY19wb3NpdGlvbiwgQl9OUl9JVEVNUyhzcmMpKTsKKyAgICBSRkFMU0UoIEJfRlJFRV9TUEFDRSAoZGVzdCkgPCBLRVlfU0laRSwKKwkgICAgIm5vIGVub3VnaCBmcmVlIHNwYWNlICglZCkgaW4gZGVzdCBidWZmZXIiLCBCX0ZSRUVfU1BBQ0UgKGRlc3QpKTsKKworICAgIGJsa2ggPSBCX0JMS19IRUFEKGRlc3QpOworICAgIG5yID0gYmxraF9ucl9pdGVtKGJsa2gpOworCisgICAgLyogcHJlcGFyZSBzcGFjZSBmb3IgaW5zZXJ0aW5nIGtleSAqLworICAgIGtleSA9IEJfTl9QREVMSU1fS0VZIChkZXN0LCBkZXN0X3Bvc2l0aW9uX2JlZm9yZSk7CisgICAgbWVtbW92ZSAoa2V5ICsgMSwga2V5LCAobnIgLSBkZXN0X3Bvc2l0aW9uX2JlZm9yZSkgKiBLRVlfU0laRSArIChuciArIDEpICogRENfU0laRSk7CisKKyAgICAvKiBpbnNlcnQga2V5ICovCisgICAgbWVtY3B5IChrZXksIEJfTl9QREVMSU1fS0VZKHNyYywgc3JjX3Bvc2l0aW9uKSwgS0VZX1NJWkUpOworCisgICAgLyogQ2hhbmdlIGRpcnQsIGZyZWUgc3BhY2UsIGl0ZW0gbnVtYmVyIGZpZWxkcy4gKi8KKworICAgIHNldF9ibGtoX25yX2l0ZW0oIGJsa2gsIGJsa2hfbnJfaXRlbShibGtoKSArIDEgKTsKKyAgICBzZXRfYmxraF9mcmVlX3NwYWNlKCBibGtoLCBibGtoX2ZyZWVfc3BhY2UoYmxraCkgLSBLRVlfU0laRSApOworCisgICAgZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5IChkZXN0X2JpLT50YiwgZGVzdCwgMCk7CisKKyAgICBpZiAoZGVzdF9iaS0+YmlfcGFyZW50KSB7CisJc3RydWN0IGRpc2tfY2hpbGQgKnRfZGM7CisJdF9kYyA9IEJfTl9DSElMRChkZXN0X2JpLT5iaV9wYXJlbnQsZGVzdF9iaS0+YmlfcG9zaXRpb24pOworCXB1dF9kY19zaXplKCB0X2RjLCBkY19zaXplKHRfZGMpICsgS0VZX1NJWkUgKTsKKworCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSAoZGVzdF9iaS0+dGIsIGRlc3RfYmktPmJpX3BhcmVudCwwKTsKKyAgICB9Cit9CisKKworCisvKiBJbnNlcnQgZF9rZXkndGggKGRlbGltaXRpbmcpIGtleSBmcm9tIGJ1ZmZlciBjZmwgdG8gdGFpbCBvZiBkZXN0LiAKKyAqIENvcHkgcG9pbnRlcl9hbW91bnQgbm9kZSBwb2ludGVycyBhbmQgcG9pbnRlcl9hbW91bnQgLSAxIGl0ZW1zIGZyb20gYnVmZmVyIHNyYyB0byBidWZmZXIgZGVzdC4KKyAqIFJlcGxhY2UgIGRfa2V5J3RoIGtleSBpbiBidWZmZXIgY2ZsLgorICogRGVsZXRlIHBvaW50ZXJfYW1vdW50IGl0ZW1zIGFuZCBub2RlIHBvaW50ZXJzIGZyb20gYnVmZmVyIHNyYy4KKyAqLworLyogdGhpcyBjYW4gYmUgaW52b2tlZCBib3RoIHRvIHNoaWZ0IGZyb20gUyB0byBMIGFuZCBmcm9tIFIgdG8gUyAqLworc3RhdGljIHZvaWQJaW50ZXJuYWxfc2hpZnRfbGVmdCAoCisJCQkJICAgICBpbnQgbW9kZSwJLyogSU5URVJOQUxfRlJPTV9TX1RPX0wgfCBJTlRFUk5BTF9GUk9NX1JfVE9fUyAqLworCQkJCSAgICAgc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLAorCQkJCSAgICAgaW50IGgsCisJCQkJICAgICBpbnQgcG9pbnRlcl9hbW91bnQKKwkJCQkgICAgICkKK3sKKyAgc3RydWN0IGJ1ZmZlcl9pbmZvIGRlc3RfYmksIHNyY19iaTsKKyAgc3RydWN0IGJ1ZmZlcl9oZWFkICogY2Y7CisgIGludCBkX2tleV9wb3NpdGlvbjsKKworICBpbnRlcm5hbF9kZWZpbmVfZGVzdF9zcmNfaW5mb3MgKG1vZGUsIHRiLCBoLCAmZGVzdF9iaSwgJnNyY19iaSwgJmRfa2V5X3Bvc2l0aW9uLCAmY2YpOworCisgIC8qcHJpbnRrKCJwb2ludGVyX2Ftb3VudCA9ICVkXG4iLHBvaW50ZXJfYW1vdW50KTsqLworCisgIGlmIChwb2ludGVyX2Ftb3VudCkgeworICAgIC8qIGluc2VydCBkZWxpbWl0aW5nIGtleSBmcm9tIGNvbW1vbiBmYXRoZXIgb2YgZGVzdCBhbmQgc3JjIHRvIG5vZGUgZGVzdCBpbnRvIHBvc2l0aW9uIEJfTlJfSVRFTShkZXN0KSAqLworICAgIGludGVybmFsX2luc2VydF9rZXkgKCZkZXN0X2JpLCBCX05SX0lURU1TKGRlc3RfYmkuYmlfYmgpLCBjZiwgZF9rZXlfcG9zaXRpb24pOworCisgICAgaWYgKEJfTlJfSVRFTVMoc3JjX2JpLmJpX2JoKSA9PSBwb2ludGVyX2Ftb3VudCAtIDEpIHsKKyAgICAgIGlmIChzcmNfYmkuYmlfcG9zaXRpb24vKnNyYy0+Yl9pdGVtX29yZGVyKi8gPT0gMCkKKwlyZXBsYWNlX2tleSAodGIsIGNmLCBkX2tleV9wb3NpdGlvbiwgc3JjX2JpLmJpX3BhcmVudC8qc3JjLT5iX3BhcmVudCovLCAwKTsKKyAgICB9IGVsc2UKKyAgICAgIHJlcGxhY2Vfa2V5ICh0YiwgY2YsIGRfa2V5X3Bvc2l0aW9uLCBzcmNfYmkuYmlfYmgsIHBvaW50ZXJfYW1vdW50IC0gMSk7CisgIH0KKyAgLyogbGFzdCBwYXJhbWV0ZXIgaXMgZGVsX3BhcmFtZXRlciAqLworICBpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zICgmZGVzdF9iaSwgJnNyY19iaSwgRklSU1RfVE9fTEFTVCwgcG9pbnRlcl9hbW91bnQsIDApOworCit9CisKKy8qIEluc2VydCBkZWxpbWl0aW5nIGtleSB0byBMW2hdLgorICogQ29weSBuIG5vZGUgcG9pbnRlcnMgYW5kIG4gLSAxIGl0ZW1zIGZyb20gYnVmZmVyIFNbaF0gdG8gTFtoXS4KKyAqIERlbGV0ZSBuIC0gMSBpdGVtcyBhbmQgbm9kZSBwb2ludGVycyBmcm9tIGJ1ZmZlciBTW2hdLgorICovCisvKiBpdCBhbHdheXMgc2hpZnRzIGZyb20gU1toXSB0byBMW2hdICovCitzdGF0aWMgdm9pZAlpbnRlcm5hbF9zaGlmdDFfbGVmdCAoCisJCQkJICAgICAgc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCAKKwkJCQkgICAgICBpbnQgaCwgCisJCQkJICAgICAgaW50IHBvaW50ZXJfYW1vdW50CisJCQkJICAgICAgKQoreworICBzdHJ1Y3QgYnVmZmVyX2luZm8gZGVzdF9iaSwgc3JjX2JpOworICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBjZjsKKyAgaW50IGRfa2V5X3Bvc2l0aW9uOworCisgIGludGVybmFsX2RlZmluZV9kZXN0X3NyY19pbmZvcyAoSU5URVJOQUxfU0hJRlRfRlJPTV9TX1RPX0wsIHRiLCBoLCAmZGVzdF9iaSwgJnNyY19iaSwgJmRfa2V5X3Bvc2l0aW9uLCAmY2YpOworCisgIGlmICggcG9pbnRlcl9hbW91bnQgPiAwICkgLyogaW5zZXJ0IGxrZXlbaF0tdGgga2V5ICBmcm9tIENGTFtoXSB0byBsZWZ0IG5laWdoYm9yIExbaF0gKi8KKyAgICBpbnRlcm5hbF9pbnNlcnRfa2V5ICgmZGVzdF9iaSwgQl9OUl9JVEVNUyhkZXN0X2JpLmJpX2JoKSwgY2YsIGRfa2V5X3Bvc2l0aW9uKTsKKyAgLyoJCWludGVybmFsX2luc2VydF9rZXkgKHRiLT5MW2hdLCBCX05SX0lURU0odGItPkxbaF0pLCB0Yi0+Q0ZMW2hdLCB0Yi0+bGtleVtoXSk7Ki8KKworICAvKiBsYXN0IHBhcmFtZXRlciBpcyBkZWxfcGFyYW1ldGVyICovCisgIGludGVybmFsX21vdmVfcG9pbnRlcnNfaXRlbXMgKCZkZXN0X2JpLCAmc3JjX2JpLCBGSVJTVF9UT19MQVNULCBwb2ludGVyX2Ftb3VudCwgMSk7CisgIC8qCWludGVybmFsX21vdmVfcG9pbnRlcnNfaXRlbXMgKHRiLT5MW2hdLCB0Yi0+U1toXSwgRklSU1RfVE9fTEFTVCwgcG9pbnRlcl9hbW91bnQsIDEpOyovCit9CisKKworLyogSW5zZXJ0IGRfa2V5J3RoIChkZWxpbWl0aW5nKSBrZXkgZnJvbSBidWZmZXIgY2ZyIHRvIGhlYWQgb2YgZGVzdC4gCisgKiBDb3B5IG4gbm9kZSBwb2ludGVycyBhbmQgbiAtIDEgaXRlbXMgZnJvbSBidWZmZXIgc3JjIHRvIGJ1ZmZlciBkZXN0LgorICogUmVwbGFjZSAgZF9rZXkndGgga2V5IGluIGJ1ZmZlciBjZnIuCisgKiBEZWxldGUgbiBpdGVtcyBhbmQgbm9kZSBwb2ludGVycyBmcm9tIGJ1ZmZlciBzcmMuCisgKi8KK3N0YXRpYyB2b2lkIGludGVybmFsX3NoaWZ0X3JpZ2h0ICgKKwkJCQkgIGludCBtb2RlLAkvKiBJTlRFUk5BTF9GUk9NX1NfVE9fUiB8IElOVEVSTkFMX0ZST01fTF9UT19TICovCisJCQkJICBzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsCisJCQkJICBpbnQgaCwKKwkJCQkgIGludCBwb2ludGVyX2Ftb3VudAorCQkJCSAgKQoreworICBzdHJ1Y3QgYnVmZmVyX2luZm8gZGVzdF9iaSwgc3JjX2JpOworICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBjZjsKKyAgaW50IGRfa2V5X3Bvc2l0aW9uOworICBpbnQgbnI7CisKKworICBpbnRlcm5hbF9kZWZpbmVfZGVzdF9zcmNfaW5mb3MgKG1vZGUsIHRiLCBoLCAmZGVzdF9iaSwgJnNyY19iaSwgJmRfa2V5X3Bvc2l0aW9uLCAmY2YpOworCisgIG5yID0gQl9OUl9JVEVNUyAoc3JjX2JpLmJpX2JoKTsKKworICBpZiAocG9pbnRlcl9hbW91bnQgPiAwKSB7CisgICAgLyogaW5zZXJ0IGRlbGltaXRpbmcga2V5IGZyb20gY29tbW9uIGZhdGhlciBvZiBkZXN0IGFuZCBzcmMgdG8gZGVzdCBub2RlIGludG8gcG9zaXRpb24gMCAqLworICAgIGludGVybmFsX2luc2VydF9rZXkgKCZkZXN0X2JpLCAwLCBjZiwgZF9rZXlfcG9zaXRpb24pOworICAgIGlmIChuciA9PSBwb2ludGVyX2Ftb3VudCAtIDEpIHsKKwkgUkZBTFNFKCBzcmNfYmkuYmlfYmggIT0gUEFUSF9IX1BCVUZGRVIgKHRiLT50Yl9wYXRoLCBoKS8qdGItPlNbaF0qLyB8fCAKKwkJIGRlc3RfYmkuYmlfYmggIT0gdGItPlJbaF0sCisJCSAic3JjICglcCkgbXVzdCBiZSA9PSB0Yi0+U1toXSglcCkgd2hlbiBpdCBkaXNhcHBlYXJzIiwKKwkJIHNyY19iaS5iaV9iaCwgUEFUSF9IX1BCVUZGRVIgKHRiLT50Yl9wYXRoLCBoKSk7CisgICAgICAvKiB3aGVuIFNbaF0gZGlzYXBwZXJzIHJlcGxhY2UgbGVmdCBkZWxlbWl0aW5nIGtleSBhcyB3ZWxsICovCisgICAgICBpZiAodGItPkNGTFtoXSkKKwlyZXBsYWNlX2tleSAodGIsIGNmLCBkX2tleV9wb3NpdGlvbiwgdGItPkNGTFtoXSwgdGItPmxrZXlbaF0pOworICAgIH0gZWxzZQorICAgICAgcmVwbGFjZV9rZXkgKHRiLCBjZiwgZF9rZXlfcG9zaXRpb24sIHNyY19iaS5iaV9iaCwgbnIgLSBwb2ludGVyX2Ftb3VudCk7CisgIH0gICAgICAKKworICAvKiBsYXN0IHBhcmFtZXRlciBpcyBkZWxfcGFyYW1ldGVyICovCisgIGludGVybmFsX21vdmVfcG9pbnRlcnNfaXRlbXMgKCZkZXN0X2JpLCAmc3JjX2JpLCBMQVNUX1RPX0ZJUlNULCBwb2ludGVyX2Ftb3VudCwgMCk7Cit9CisKKy8qIEluc2VydCBkZWxpbWl0aW5nIGtleSB0byBSW2hdLgorICogQ29weSBuIG5vZGUgcG9pbnRlcnMgYW5kIG4gLSAxIGl0ZW1zIGZyb20gYnVmZmVyIFNbaF0gdG8gUltoXS4KKyAqIERlbGV0ZSBuIC0gMSBpdGVtcyBhbmQgbm9kZSBwb2ludGVycyBmcm9tIGJ1ZmZlciBTW2hdLgorICovCisvKiBpdCBhbHdheXMgc2hpZnQgZnJvbSBTW2hdIHRvIFJbaF0gKi8KK3N0YXRpYyB2b2lkCWludGVybmFsX3NoaWZ0MV9yaWdodCAoCisJCQkJICAgICAgIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwgCisJCQkJICAgICAgIGludCBoLCAKKwkJCQkgICAgICAgaW50IHBvaW50ZXJfYW1vdW50CisJCQkJICAgICAgICkKK3sKKyAgc3RydWN0IGJ1ZmZlcl9pbmZvIGRlc3RfYmksIHNyY19iaTsKKyAgc3RydWN0IGJ1ZmZlcl9oZWFkICogY2Y7CisgIGludCBkX2tleV9wb3NpdGlvbjsKKworICBpbnRlcm5hbF9kZWZpbmVfZGVzdF9zcmNfaW5mb3MgKElOVEVSTkFMX1NISUZUX0ZST01fU19UT19SLCB0YiwgaCwgJmRlc3RfYmksICZzcmNfYmksICZkX2tleV9wb3NpdGlvbiwgJmNmKTsKKworICBpZiAocG9pbnRlcl9hbW91bnQgPiAwKSAvKiBpbnNlcnQgcmtleSBmcm9tIENGUltoXSB0byByaWdodCBuZWlnaGJvciBSW2hdICovCisgICAgaW50ZXJuYWxfaW5zZXJ0X2tleSAoJmRlc3RfYmksIDAsIGNmLCBkX2tleV9wb3NpdGlvbik7CisgIC8qCQlpbnRlcm5hbF9pbnNlcnRfa2V5ICh0Yi0+UltoXSwgMCwgdGItPkNGUltoXSwgdGItPnJrZXlbaF0pOyovCisJCisgIC8qIGxhc3QgcGFyYW1ldGVyIGlzIGRlbF9wYXJhbWV0ZXIgKi8KKyAgaW50ZXJuYWxfbW92ZV9wb2ludGVyc19pdGVtcyAoJmRlc3RfYmksICZzcmNfYmksIExBU1RfVE9fRklSU1QsIHBvaW50ZXJfYW1vdW50LCAxKTsKKyAgLyoJaW50ZXJuYWxfbW92ZV9wb2ludGVyc19pdGVtcyAodGItPlJbaF0sIHRiLT5TW2hdLCBMQVNUX1RPX0ZJUlNULCBwb2ludGVyX2Ftb3VudCwgMSk7Ki8KK30KKworCisvKiBEZWxldGUgaW5zZXJ0X251bSBub2RlIHBvaW50ZXJzIHRvZ2V0aGVyIHdpdGggdGhlaXIgbGVmdCBpdGVtcworICogYW5kIGJhbGFuY2UgY3VycmVudCBub2RlLiovCitzdGF0aWMgdm9pZCBiYWxhbmNlX2ludGVybmFsX3doZW5fZGVsZXRlIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIAorCQkJCQkgIGludCBoLCBpbnQgY2hpbGRfcG9zKQoreworICAgIGludCBpbnNlcnRfbnVtOworICAgIGludCBuOworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIHRiU2ggPSBQQVRIX0hfUEJVRkZFUiAodGItPnRiX3BhdGgsIGgpOworICAgIHN0cnVjdCBidWZmZXJfaW5mbyBiaTsKKworICAgIGluc2VydF9udW0gPSB0Yi0+aW5zZXJ0X3NpemVbaF0gLyAoKGludCkoRENfU0laRSArIEtFWV9TSVpFKSk7CisgIAorICAgIC8qIGRlbGV0ZSBjaGlsZC1ub2RlLXBvaW50ZXIocykgdG9nZXRoZXIgd2l0aCB0aGVpciBsZWZ0IGl0ZW0ocykgKi8KKyAgICBiaS50YiA9IHRiOworICAgIGJpLmJpX2JoID0gdGJTaDsKKyAgICBiaS5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIGgpOworICAgIGJpLmJpX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgaCArIDEpOworCisgICAgaW50ZXJuYWxfZGVsZXRlX2NoaWxkcyAoJmJpLCBjaGlsZF9wb3MsIC1pbnNlcnRfbnVtKTsKKworICAgIFJGQUxTRSggdGItPmJsa251bVtoXSA+IDEsCisJICAgICJ0Yi0+YmxrbnVtWyVkXT0lZCB3aGVuIGluc2VydF9zaXplIDwgMCIsIGgsIHRiLT5ibGtudW1baF0pOworCisgICAgbiA9IEJfTlJfSVRFTVModGJTaCk7CisKKyAgICBpZiAoIHRiLT5sbnVtW2hdID09IDAgJiYgdGItPnJudW1baF0gPT0gMCApIHsKKwlpZiAoIHRiLT5ibGtudW1baF0gPT0gMCApIHsKKwkgICAgLyogbm9kZSBTW2hdIChyb290IG9mIHRoZSB0cmVlKSBpcyBlbXB0eSBub3cgKi8KKwkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpuZXdfcm9vdDsKKworCSAgICBSRkFMU0UoIG4gfHwgQl9GUkVFX1NQQUNFICh0YlNoKSAhPSBNQVhfQ0hJTERfU0laRSh0YlNoKSAtIERDX1NJWkUsCisJCSAgICAiYnVmZmVyIG11c3QgaGF2ZSBvbmx5IDAga2V5cyAoJWQpIiwgbik7CisJICAgIFJGQUxTRSggYmkuYmlfcGFyZW50LCAicm9vdCBoYXMgcGFyZW50ICglcCkiLCBiaS5iaV9wYXJlbnQpOworCQkKKwkgICAgLyogY2hvb3NlIGEgbmV3IHJvb3QgKi8KKwkgICAgaWYgKCAhIHRiLT5MW2gtMV0gfHwgISBCX05SX0lURU1TKHRiLT5MW2gtMV0pICkKKwkJbmV3X3Jvb3QgPSB0Yi0+UltoLTFdOworCSAgICBlbHNlCisJCW5ld19yb290ID0gdGItPkxbaC0xXTsKKwkgICAgLyogc3dpdGNoIHN1cGVyIGJsb2NrJ3MgdHJlZSByb290IGJsb2NrIG51bWJlciB0byB0aGUgbmV3IHZhbHVlICovCisgICAgICAgICAgICBQVVRfU0JfUk9PVF9CTE9DSyggdGItPnRiX3NiLCBuZXdfcm9vdC0+Yl9ibG9ja25yICk7CisJICAgIC8vUkVJU0VSRlNfU0IodGItPnRiX3NiKS0+c19ycy0+c190cmVlX2hlaWdodCAtLTsKKyAgICAgICAgICAgIFBVVF9TQl9UUkVFX0hFSUdIVCggdGItPnRiX3NiLCBTQl9UUkVFX0hFSUdIVCh0Yi0+dGJfc2IpIC0gMSApOworCisJICAgIGRvX2JhbGFuY2VfbWFya19zYl9kaXJ0eSAodGIsIFJFSVNFUkZTX1NCKHRiLT50Yl9zYiktPnNfc2JoLCAxKTsKKwkgICAgLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KKwkgICAgaWYgKGggPiAxKQorCQkvKiB1c2UgY2hlY2tfaW50ZXJuYWwgaWYgbmV3IHJvb3QgaXMgYW4gaW50ZXJuYWwgbm9kZSAqLworCQljaGVja19pbnRlcm5hbCAobmV3X3Jvb3QpOworCSAgICAvKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLworCisJICAgIC8qIGRvIHdoYXQgaXMgbmVlZGVkIGZvciBidWZmZXIgdGhyb3duIGZyb20gdHJlZSAqLworCSAgICByZWlzZXJmc19pbnZhbGlkYXRlX2J1ZmZlcih0YiwgdGJTaCk7CisJICAgIHJldHVybjsKKwl9CisJcmV0dXJuOworICAgIH0KKworICAgIGlmICggdGItPkxbaF0gJiYgdGItPmxudW1baF0gPT0gLUJfTlJfSVRFTVModGItPkxbaF0pIC0gMSApIHsgLyogam9pbiBTW2hdIHdpdGggTFtoXSAqLworCisJUkZBTFNFKCB0Yi0+cm51bVtoXSAhPSAwLAorCQkiaW52YWxpZCB0Yi0+cm51bVslZF09PSVkIHdoZW4gam9pbmluZyBTW2hdIHdpdGggTFtoXSIsCisJCWgsIHRiLT5ybnVtW2hdKTsKKworCWludGVybmFsX3NoaWZ0X2xlZnQgKElOVEVSTkFMX1NISUZUX0ZST01fU19UT19MLCB0YiwgaCwgbiArIDEpOworCXJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyKHRiLCB0YlNoKTsKKworCXJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIHRiLT5SW2hdICYmICB0Yi0+cm51bVtoXSA9PSAtQl9OUl9JVEVNUyh0Yi0+UltoXSkgLSAxICkgeyAvKiBqb2luIFNbaF0gd2l0aCBSW2hdICovCisJUkZBTFNFKCB0Yi0+bG51bVtoXSAhPSAwLAorCQkiaW52YWxpZCB0Yi0+bG51bVslZF09PSVkIHdoZW4gam9pbmluZyBTW2hdIHdpdGggUltoXSIsCisJCWgsIHRiLT5sbnVtW2hdKTsKKworCWludGVybmFsX3NoaWZ0X3JpZ2h0IChJTlRFUk5BTF9TSElGVF9GUk9NX1NfVE9fUiwgdGIsIGgsIG4gKyAxKTsKKworCXJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyKHRiLHRiU2gpOworCXJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIHRiLT5sbnVtW2hdIDwgMCApIHsgLyogYm9ycm93IGZyb20gbGVmdCBuZWlnaGJvciBMW2hdICovCisJUkZBTFNFKCB0Yi0+cm51bVtoXSAhPSAwLAorCQkid3JvbmcgdGItPnJudW1bJWRdPT0lZCB3aGVuIGJvcnJvdyBmcm9tIExbaF0iLCBoLCB0Yi0+cm51bVtoXSk7CisJLyppbnRlcm5hbF9zaGlmdF9yaWdodCAodGIsIGgsIHRiLT5MW2hdLCB0Yi0+Q0ZMW2hdLCB0Yi0+bGtleVtoXSwgdGItPlNbaF0sIC10Yi0+bG51bVtoXSk7Ki8KKwlpbnRlcm5hbF9zaGlmdF9yaWdodCAoSU5URVJOQUxfU0hJRlRfRlJPTV9MX1RPX1MsIHRiLCBoLCAtdGItPmxudW1baF0pOworCXJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIHRiLT5ybnVtW2hdIDwgMCApIHsgLyogYm9ycm93IGZyb20gcmlnaHQgbmVpZ2hib3IgUltoXSAqLworCSBSRkFMU0UoIHRiLT5sbnVtW2hdICE9IDAsCisJCSAiaW52YWxpZCB0Yi0+bG51bVslZF09PSVkIHdoZW4gYm9ycm93IGZyb20gUltoXSIsIAorCQkgaCwgdGItPmxudW1baF0pOworCWludGVybmFsX3NoaWZ0X2xlZnQgKElOVEVSTkFMX1NISUZUX0ZST01fUl9UT19TLCB0YiwgaCwgLXRiLT5ybnVtW2hdKTsvKnRiLT5TW2hdLCB0Yi0+Q0ZSW2hdLCB0Yi0+cmtleVtoXSwgdGItPlJbaF0sIC10Yi0+cm51bVtoXSk7Ki8KKwlyZXR1cm47CisgICAgfQorCisgICAgaWYgKCB0Yi0+bG51bVtoXSA+IDAgKSB7IC8qIHNwbGl0IFNbaF0gaW50byB0d28gcGFydHMgYW5kIHB1dCB0aGVtIGludG8gbmVpZ2hib3JzICovCisJUkZBTFNFKCB0Yi0+cm51bVtoXSA9PSAwIHx8IHRiLT5sbnVtW2hdICsgdGItPnJudW1baF0gIT0gbiArIDEsCisJCSJpbnZhbGlkIHRiLT5sbnVtWyVkXT09JWQgb3IgdGItPnJudW1bJWRdPT0lZCB3aGVuIFNbaF0oaXRlbSBudW1iZXIgPT0gJWQpIGlzIHNwbGl0IGJldHdlZW4gdGhlbSIsCisJCWgsIHRiLT5sbnVtW2hdLCBoLCB0Yi0+cm51bVtoXSwgbik7CisKKwlpbnRlcm5hbF9zaGlmdF9sZWZ0IChJTlRFUk5BTF9TSElGVF9GUk9NX1NfVE9fTCwgdGIsIGgsIHRiLT5sbnVtW2hdKTsvKnRiLT5MW2hdLCB0Yi0+Q0ZMW2hdLCB0Yi0+bGtleVtoXSwgdGItPlNbaF0sIHRiLT5sbnVtW2hdKTsqLworCWludGVybmFsX3NoaWZ0X3JpZ2h0IChJTlRFUk5BTF9TSElGVF9GUk9NX1NfVE9fUiwgdGIsIGgsIHRiLT5ybnVtW2hdKTsKKworCXJlaXNlcmZzX2ludmFsaWRhdGVfYnVmZmVyICh0YiwgdGJTaCk7CisKKwlyZXR1cm47CisgICAgfQorICAgIHJlaXNlcmZzX3BhbmljICh0Yi0+dGJfc2IsICJiYWxhbmNlX2ludGVybmFsX3doZW5fZGVsZXRlOiB1bmV4cGVjdGVkIHRiLT5sbnVtWyVkXT09JWQgb3IgdGItPnJudW1bJWRdPT0lZCIsCisJCSAgICBoLCB0Yi0+bG51bVtoXSwgaCwgdGItPnJudW1baF0pOworfQorCisKKy8qIFJlcGxhY2UgZGVsaW1pdGluZyBrZXkgb2YgYnVmZmVycyBMW2hdIGFuZCBTW2hdIGJ5IHRoZSBnaXZlbiBrZXkuKi8KK3N0YXRpYyB2b2lkIHJlcGxhY2VfbGtleSAoCisJCSAgICAgIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwKKwkJICAgICAgaW50IGgsCisJCSAgICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBrZXkKKwkJICAgICAgKQoreworICAgUkZBTFNFKCB0Yi0+TFtoXSA9PSBOVUxMIHx8IHRiLT5DRkxbaF0gPT0gTlVMTCwKKwkgICAiTFtoXSglcCkgYW5kIENGTFtoXSglcCkgbXVzdCBleGlzdCBpbiByZXBsYWNlX2xrZXkiLCAKKwkgICB0Yi0+TFtoXSwgdGItPkNGTFtoXSk7CisKKyAgaWYgKEJfTlJfSVRFTVMoUEFUSF9IX1BCVUZGRVIodGItPnRiX3BhdGgsIGgpKSA9PSAwKQorICAgIHJldHVybjsKKworICBtZW1jcHkgKEJfTl9QREVMSU1fS0VZKHRiLT5DRkxbaF0sdGItPmxrZXlbaF0pLCBrZXksIEtFWV9TSVpFKTsKKworICBkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKHRiLCB0Yi0+Q0ZMW2hdLDApOworfQorCisKKy8qIFJlcGxhY2UgZGVsaW1pdGluZyBrZXkgb2YgYnVmZmVycyBTW2hdIGFuZCBSW2hdIGJ5IHRoZSBnaXZlbiBrZXkuKi8KK3N0YXRpYyB2b2lkIHJlcGxhY2VfcmtleSAoCisJCSAgICAgIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0YiwKKwkJICAgICAgaW50IGgsCisJCSAgICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBrZXkKKwkJICAgICAgKQoreworICBSRkFMU0UoIHRiLT5SW2hdID09IE5VTEwgfHwgdGItPkNGUltoXSA9PSBOVUxMLAorCSAgIlJbaF0oJXApIGFuZCBDRlJbaF0oJXApIG11c3QgZXhpc3QgaW4gcmVwbGFjZV9ya2V5IiwgCisJICB0Yi0+UltoXSwgdGItPkNGUltoXSk7CisgIFJGQUxTRSggQl9OUl9JVEVNUyh0Yi0+UltoXSkgPT0gMCwKKwkgICJSW2hdIGNhbiBub3QgYmUgZW1wdHkgaWYgaXQgZXhpc3RzIChpdGVtIG51bWJlcj0lZCkiLCAKKwkgIEJfTlJfSVRFTVModGItPlJbaF0pKTsKKworICBtZW1jcHkgKEJfTl9QREVMSU1fS0VZKHRiLT5DRlJbaF0sdGItPnJrZXlbaF0pLCBrZXksIEtFWV9TSVpFKTsKKworICBkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKHRiLCB0Yi0+Q0ZSW2hdLCAwKTsKK30KKworCitpbnQgYmFsYW5jZV9pbnRlcm5hbCAoc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLAkJCS8qIHRyZWVfYmFsYW5jZSBzdHJ1Y3R1cmUgCQkqLworCQkgICAgICBpbnQgaCwJCQkJCS8qIGxldmVsIG9mIHRoZSB0cmVlIAkJCSovCisJCSAgICAgIGludCBjaGlsZF9wb3MsCisJCSAgICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpbnNlcnRfa2V5LAkJLyoga2V5IGZvciBpbnNlcnRpb24gb24gaGlnaGVyIGxldmVsICAgCSovCisJCSAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqKiBpbnNlcnRfcHRyCS8qIG5vZGUgZm9yIGluc2VydGlvbiBvbiBoaWdoZXIgbGV2ZWwqLworICAgICkKKyAgICAvKiBpZiBpbnNlcnRpbmcvcGFzdGluZworICAgICAgIHsKKyAgICAgICBjaGlsZF9wb3MgaXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBub2RlLXBvaW50ZXIgaW4gU1toXSB0aGF0CSAqCisgICAgICAgcG9pbnRlZCB0byBTW2gtMV0gYmVmb3JlIGJhbGFuY2luZyBvZiB0aGUgaC0xIGxldmVsOwkJICoKKyAgICAgICB0aGlzIG1lYW5zIHRoYXQgbmV3IHBvaW50ZXJzIGFuZCBpdGVtcyBtdXN0IGJlIGluc2VydGVkIEFGVEVSICoKKyAgICAgICBjaGlsZF9wb3MKKyAgICAgICB9CisgICAgICAgZWxzZSAKKyAgICAgICB7CisgICBpdCBpcyB0aGUgcG9zaXRpb24gb2YgdGhlIGxlZnRtb3N0IHBvaW50ZXIgdGhhdCBtdXN0IGJlIGRlbGV0ZWQgKHRvZ2V0aGVyIHdpdGgKKyAgIGl0cyBjb3JyZXNwb25kaW5nIGtleSB0byB0aGUgbGVmdCBvZiB0aGUgcG9pbnRlcikKKyAgIGFzIGEgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBsZXZlbCdzIGJhbGFuY2luZy4KKyAgIH0KKyovCit7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogdGJTaCA9IFBBVEhfSF9QQlVGRkVSICh0Yi0+dGJfcGF0aCwgaCk7CisgICAgc3RydWN0IGJ1ZmZlcl9pbmZvIGJpOworICAgIGludCBvcmRlcjsJCS8qIHdlIHJldHVybiB0aGlzOiBpdCBpcyAwIGlmIHRoZXJlIGlzIG5vIFNbaF0sIGVsc2UgaXQgaXMgdGItPlNbaF0tPmJfaXRlbV9vcmRlciAqLworICAgIGludCBpbnNlcnRfbnVtLCBuLCBrOworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIFNfbmV3OworICAgIHN0cnVjdCBpdGVtX2hlYWQgbmV3X2luc2VydF9rZXk7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogbmV3X2luc2VydF9wdHIgPSBOVUxMOworICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBuZXdfaW5zZXJ0X2tleV9hZGRyID0gaW5zZXJ0X2tleTsKKworICAgIFJGQUxTRSggaCA8IDEsICJoICglZCkgY2FuIG5vdCBiZSA8IDEgb24gaW50ZXJuYWwgbGV2ZWwiLCBoKTsKKworICAgIFBST0NfSU5GT19JTkMoIHRiIC0+IHRiX3NiLCBiYWxhbmNlX2F0WyBoIF0gKTsKKworICAgIG9yZGVyID0gKCB0YlNoICkgPyBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCBoICsgMSkvKnRiLT5TW2hdLT5iX2l0ZW1fb3JkZXIqLyA6IDA7CisKKyAgLyogVXNpbmcgaW5zZXJ0X3NpemVbaF0gY2FsY3VsYXRlIHRoZSBudW1iZXIgaW5zZXJ0X251bSBvZiBpdGVtcworICAgICB0aGF0IG11c3QgYmUgaW5zZXJ0ZWQgdG8gb3IgZGVsZXRlZCBmcm9tIFNbaF0uICovCisgICAgaW5zZXJ0X251bSA9IHRiLT5pbnNlcnRfc2l6ZVtoXS8oKGludCkoS0VZX1NJWkUgKyBEQ19TSVpFKSk7CisKKyAgICAvKiBDaGVjayB3aGV0aGVyIGluc2VydF9udW0gaXMgcHJvcGVyICoqLworICAgIFJGQUxTRSggaW5zZXJ0X251bSA8IC0yICB8fCAgaW5zZXJ0X251bSA+IDIsCisJICAgICJpbmNvcnJlY3QgbnVtYmVyIG9mIGl0ZW1zIGluc2VydGVkIHRvIHRoZSBpbnRlcm5hbCBub2RlICglZCkiLCAKKwkgICAgaW5zZXJ0X251bSk7CisgICAgUkZBTFNFKCBoID4gMSAgJiYgKGluc2VydF9udW0gPiAxIHx8IGluc2VydF9udW0gPCAtMSksCisJICAgICJpbmNvcnJlY3QgbnVtYmVyIG9mIGl0ZW1zICglZCkgaW5zZXJ0ZWQgdG8gdGhlIGludGVybmFsIG5vZGUgb24gYSBsZXZlbCAoaD0lZCkgaGlnaGVyIHRoYW4gbGFzdCBpbnRlcm5hbCBsZXZlbCIsIAorCSAgICBpbnNlcnRfbnVtLCBoKTsKKworICAgIC8qIE1ha2UgYmFsYW5jZSBpbiBjYXNlIGluc2VydF9udW0gPCAwICovCisgICAgaWYgKCBpbnNlcnRfbnVtIDwgMCApIHsKKwliYWxhbmNlX2ludGVybmFsX3doZW5fZGVsZXRlICh0YiwgaCwgY2hpbGRfcG9zKTsKKwlyZXR1cm4gb3JkZXI7CisgICAgfQorIAorICAgIGsgPSAwOworICAgIGlmICggdGItPmxudW1baF0gPiAwICkgeworCS8qIHNoaWZ0IGxudW1baF0gaXRlbXMgZnJvbSBTW2hdIHRvIHRoZSBsZWZ0IG5laWdoYm9yIExbaF0uCisJICAgY2hlY2sgaG93IG1hbnkgb2YgbmV3IGl0ZW1zIGZhbGwgaW50byBMW2hdIG9yIENGTFtoXSBhZnRlcgorCSAgIHNoaWZ0aW5nICovCisJbiA9IEJfTlJfSVRFTVMgKHRiLT5MW2hdKTsgLyogbnVtYmVyIG9mIGl0ZW1zIGluIExbaF0gKi8KKwlpZiAoIHRiLT5sbnVtW2hdIDw9IGNoaWxkX3BvcyApIHsKKwkgICAgLyogbmV3IGl0ZW1zIGRvbid0IGZhbGwgaW50byBMW2hdIG9yIENGTFtoXSAqLworCSAgICBpbnRlcm5hbF9zaGlmdF9sZWZ0IChJTlRFUk5BTF9TSElGVF9GUk9NX1NfVE9fTCwgdGIsIGgsIHRiLT5sbnVtW2hdKTsKKwkgICAgLyppbnRlcm5hbF9zaGlmdF9sZWZ0ICh0Yi0+TFtoXSx0Yi0+Q0ZMW2hdLHRiLT5sa2V5W2hdLHRiU2gsdGItPmxudW1baF0pOyovCisJICAgIGNoaWxkX3BvcyAtPSB0Yi0+bG51bVtoXTsKKwl9IGVsc2UgaWYgKCB0Yi0+bG51bVtoXSA+IGNoaWxkX3BvcyArIGluc2VydF9udW0gKSB7CisJICAgIC8qIGFsbCBuZXcgaXRlbXMgZmFsbCBpbnRvIExbaF0gKi8KKwkgICAgaW50ZXJuYWxfc2hpZnRfbGVmdCAoSU5URVJOQUxfU0hJRlRfRlJPTV9TX1RPX0wsIHRiLCBoLCB0Yi0+bG51bVtoXSAtIGluc2VydF9udW0pOworCSAgICAvKgkJCWludGVybmFsX3NoaWZ0X2xlZnQodGItPkxbaF0sdGItPkNGTFtoXSx0Yi0+bGtleVtoXSx0YlNoLAorCQkJCXRiLT5sbnVtW2hdLWluc2VydF9udW0pOworCSAgICAqLworCSAgICAvKiBpbnNlcnQgaW5zZXJ0X251bSBrZXlzIGFuZCBub2RlLXBvaW50ZXJzIGludG8gTFtoXSAqLworCSAgICBiaS50YiA9IHRiOworCSAgICBiaS5iaV9iaCA9IHRiLT5MW2hdOworCSAgICBiaS5iaV9wYXJlbnQgPSB0Yi0+RkxbaF07CisJICAgIGJpLmJpX3Bvc2l0aW9uID0gZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCBoKTsKKwkgICAgaW50ZXJuYWxfaW5zZXJ0X2NoaWxkcyAoJmJpLC8qdGItPkxbaF0sIHRiLT5TW2gtMV0tPmJfbmV4dCovIG4gKyBjaGlsZF9wb3MgKyAxLAorCQkJCSAgICBpbnNlcnRfbnVtLGluc2VydF9rZXksaW5zZXJ0X3B0cik7CisKKwkgICAgaW5zZXJ0X251bSA9IDA7IAorCX0gZWxzZSB7CisJICAgIHN0cnVjdCBkaXNrX2NoaWxkICogZGM7CisKKwkgICAgLyogc29tZSBpdGVtcyBmYWxsIGludG8gTFtoXSBvciBDRkxbaF0sIGJ1dCBzb21lIGRvbid0IGZhbGwgKi8KKwkgICAgaW50ZXJuYWxfc2hpZnQxX2xlZnQodGIsaCxjaGlsZF9wb3MrMSk7CisJICAgIC8qIGNhbGN1bGF0ZSBudW1iZXIgb2YgbmV3IGl0ZW1zIHRoYXQgZmFsbCBpbnRvIExbaF0gKi8KKwkgICAgayA9IHRiLT5sbnVtW2hdIC0gY2hpbGRfcG9zIC0gMTsKKwkgICAgYmkudGIgPSB0YjsKKwkgICAgYmkuYmlfYmggPSB0Yi0+TFtoXTsKKwkgICAgYmkuYmlfcGFyZW50ID0gdGItPkZMW2hdOworCSAgICBiaS5iaV9wb3NpdGlvbiA9IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgaCk7CisJICAgIGludGVybmFsX2luc2VydF9jaGlsZHMgKCZiaSwvKnRiLT5MW2hdLCB0Yi0+U1toLTFdLT5iX25leHQsKi8gbiArIGNoaWxkX3BvcyArIDEsaywKKwkJCQkgICAgaW5zZXJ0X2tleSxpbnNlcnRfcHRyKTsKKworCSAgICByZXBsYWNlX2xrZXkodGIsaCxpbnNlcnRfa2V5ICsgayk7CisKKwkgICAgLyogcmVwbGFjZSB0aGUgZmlyc3Qgbm9kZS1wdHIgaW4gU1toXSBieSBub2RlLXB0ciB0byBpbnNlcnRfcHRyW2tdICovCisJICAgIGRjID0gQl9OX0NISUxEKHRiU2gsIDApOworCSAgICBwdXRfZGNfc2l6ZSggZGMsIE1BWF9DSElMRF9TSVpFKGluc2VydF9wdHJba10pIC0gQl9GUkVFX1NQQUNFIChpbnNlcnRfcHRyW2tdKSk7CisJICAgIHB1dF9kY19ibG9ja19udW1iZXIoIGRjLCBpbnNlcnRfcHRyW2tdLT5iX2Jsb2NrbnIgKTsKKworCSAgICBkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKHRiLCB0YlNoLCAwKTsKKworCSAgICBrKys7CisJICAgIGluc2VydF9rZXkgKz0gazsKKwkgICAgaW5zZXJ0X3B0ciArPSBrOworCSAgICBpbnNlcnRfbnVtIC09IGs7CisJICAgIGNoaWxkX3BvcyA9IDA7CisJfQorICAgIH0JLyogdGItPmxudW1baF0gPiAwICovCisKKyAgICBpZiAoIHRiLT5ybnVtW2hdID4gMCApIHsKKwkvKnNoaWZ0IHJudW1baF0gaXRlbXMgZnJvbSBTW2hdIHRvIHRoZSByaWdodCBuZWlnaGJvciBSW2hdKi8KKwkvKiBjaGVjayBob3cgbWFueSBvZiBuZXcgaXRlbXMgZmFsbCBpbnRvIFIgb3IgQ0ZSIGFmdGVyIHNoaWZ0aW5nICovCisJbiA9IEJfTlJfSVRFTVMgKHRiU2gpOyAvKiBudW1iZXIgb2YgaXRlbXMgaW4gU1toXSAqLworCWlmICggbiAtIHRiLT5ybnVtW2hdID49IGNoaWxkX3BvcyApCisJICAgIC8qIG5ldyBpdGVtcyBmYWxsIGludG8gU1toXSAqLworCSAgICAvKmludGVybmFsX3NoaWZ0X3JpZ2h0KHRiLGgsdGJTaCx0Yi0+Q0ZSW2hdLHRiLT5ya2V5W2hdLHRiLT5SW2hdLHRiLT5ybnVtW2hdKTsqLworCSAgICBpbnRlcm5hbF9zaGlmdF9yaWdodCAoSU5URVJOQUxfU0hJRlRfRlJPTV9TX1RPX1IsIHRiLCBoLCB0Yi0+cm51bVtoXSk7CisJZWxzZQorCSAgICBpZiAoIG4gKyBpbnNlcnRfbnVtIC0gdGItPnJudW1baF0gPCBjaGlsZF9wb3MgKQorCSAgICB7CisJCS8qIGFsbCBuZXcgaXRlbXMgZmFsbCBpbnRvIFJbaF0gKi8KKwkJLyppbnRlcm5hbF9zaGlmdF9yaWdodCh0YixoLHRiU2gsdGItPkNGUltoXSx0Yi0+cmtleVtoXSx0Yi0+UltoXSwKKwkgICAgdGItPnJudW1baF0gLSBpbnNlcnRfbnVtKTsqLworCQlpbnRlcm5hbF9zaGlmdF9yaWdodCAoSU5URVJOQUxfU0hJRlRfRlJPTV9TX1RPX1IsIHRiLCBoLCB0Yi0+cm51bVtoXSAtIGluc2VydF9udW0pOworCisJCS8qIGluc2VydCBpbnNlcnRfbnVtIGtleXMgYW5kIG5vZGUtcG9pbnRlcnMgaW50byBSW2hdICovCisJCWJpLnRiID0gdGI7CisJCWJpLmJpX2JoID0gdGItPlJbaF07CisJCWJpLmJpX3BhcmVudCA9IHRiLT5GUltoXTsKKwkJYmkuYmlfcG9zaXRpb24gPSBnZXRfcmlnaHRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCBoKTsKKwkJaW50ZXJuYWxfaW5zZXJ0X2NoaWxkcyAoJmJpLCAvKnRiLT5SW2hdLHRiLT5TW2gtMV0tPmJfbmV4dCovIGNoaWxkX3BvcyAtIG4gLSBpbnNlcnRfbnVtICsgdGItPnJudW1baF0gLSAxLAorCQkJCQlpbnNlcnRfbnVtLGluc2VydF9rZXksaW5zZXJ0X3B0cik7CisJCWluc2VydF9udW0gPSAwOworCSAgICB9CisJICAgIGVsc2UKKwkgICAgeworCQlzdHJ1Y3QgZGlza19jaGlsZCAqIGRjOworCisJCS8qIG9uZSBvZiB0aGUgaXRlbXMgZmFsbHMgaW50byBDRlJbaF0gKi8KKwkJaW50ZXJuYWxfc2hpZnQxX3JpZ2h0KHRiLGgsbiAtIGNoaWxkX3BvcyArIDEpOworCQkvKiBjYWxjdWxhdGUgbnVtYmVyIG9mIG5ldyBpdGVtcyB0aGF0IGZhbGwgaW50byBSW2hdICovCisJCWsgPSB0Yi0+cm51bVtoXSAtIG4gKyBjaGlsZF9wb3MgLSAxOworCQliaS50YiA9IHRiOworCQliaS5iaV9iaCA9IHRiLT5SW2hdOworCQliaS5iaV9wYXJlbnQgPSB0Yi0+RlJbaF07CisJCWJpLmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgaCk7CisJCWludGVybmFsX2luc2VydF9jaGlsZHMgKCZiaSwgLyp0Yi0+UltoXSwgdGItPlJbaF0tPmJfY2hpbGQsKi8gMCwgaywgaW5zZXJ0X2tleSArIDEsIGluc2VydF9wdHIgKyAxKTsKKworCQlyZXBsYWNlX3JrZXkodGIsaCxpbnNlcnRfa2V5ICsgaW5zZXJ0X251bSAtIGsgLSAxKTsKKworCQkvKiByZXBsYWNlIHRoZSBmaXJzdCBub2RlLXB0ciBpbiBSW2hdIGJ5IG5vZGUtcHRyIGluc2VydF9wdHJbaW5zZXJ0X251bS1rLTFdKi8KKwkJZGMgPSBCX05fQ0hJTEQodGItPlJbaF0sIDApOworCQlwdXRfZGNfc2l6ZSggZGMsIE1BWF9DSElMRF9TSVpFKGluc2VydF9wdHJbaW5zZXJ0X251bS1rLTFdKSAtCisgICAgCQkJCSAgICBCX0ZSRUVfU1BBQ0UgKGluc2VydF9wdHJbaW5zZXJ0X251bS1rLTFdKSk7CisJCXB1dF9kY19ibG9ja19udW1iZXIoIGRjLCBpbnNlcnRfcHRyW2luc2VydF9udW0tay0xXS0+Yl9ibG9ja25yICk7CisKKwkJZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5ICh0YiwgdGItPlJbaF0sMCk7CisKKwkJaW5zZXJ0X251bSAtPSAoayArIDEpOworCSAgICB9CisgICAgfQorCisgICAgLyoqIEZpbGwgbmV3IG5vZGUgdGhhdCBhcHBlYXJzIGluc3RlYWQgb2YgU1toXSAqKi8KKyAgICBSRkFMU0UoIHRiLT5ibGtudW1baF0gPiAyLCAiYmxrbnVtIGNhbiBub3QgYmUgPiAyIGZvciBpbnRlcm5hbCBsZXZlbCIpOworICAgIFJGQUxTRSggdGItPmJsa251bVtoXSA8IDAsICJibGtudW0gY2FuIG5vdCBiZSA8IDAiKTsKKworICAgIGlmICggISB0Yi0+YmxrbnVtW2hdICkKKyAgICB7IC8qIG5vZGUgU1toXSBpcyBlbXB0eSBub3cgKi8KKwlSRkFMU0UoICEgdGJTaCwgIlNbaF0gaXMgZXF1YWwgTlVMTCIpOworCisJLyogZG8gd2hhdCBpcyBuZWVkZWQgZm9yIGJ1ZmZlciB0aHJvd24gZnJvbSB0cmVlICovCisJcmVpc2VyZnNfaW52YWxpZGF0ZV9idWZmZXIodGIsdGJTaCk7CisJcmV0dXJuIG9yZGVyOworICAgIH0KKworICAgIGlmICggISB0YlNoICkgeworCS8qIGNyZWF0ZSBuZXcgcm9vdCAqLworCXN0cnVjdCBkaXNrX2NoaWxkICAqIGRjOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIHRiU2hfMSA9IFBBVEhfSF9QQlVGRkVSICh0Yi0+dGJfcGF0aCwgaCAtIDEpOworICAgICAgICBzdHJ1Y3QgYmxvY2tfaGVhZCAqICBibGtoOworCisKKwlpZiAoIHRiLT5ibGtudW1baF0gIT0gMSApCisJICAgIHJlaXNlcmZzX3BhbmljKE5VTEwsICJiYWxhbmNlX2ludGVybmFsOiBPbmUgbmV3IG5vZGUgcmVxdWlyZWQgZm9yIGNyZWF0aW5nIHRoZSBuZXcgcm9vdCIpOworCS8qIFNbaF0gPSBlbXB0eSBidWZmZXIgZnJvbSB0aGUgbGlzdCBGRUIuICovCisJdGJTaCA9IGdldF9GRUIgKHRiKTsKKyAgICAgICAgYmxraCA9IEJfQkxLX0hFQUQodGJTaCk7CisgICAgICAgIHNldF9ibGtoX2xldmVsKCBibGtoLCBoICsgMSApOworCisJLyogUHV0IHRoZSB1bmlxdWUgbm9kZS1wb2ludGVyIHRvIFNbaF0gdGhhdCBwb2ludHMgdG8gU1toLTFdLiAqLworCisJZGMgPSBCX05fQ0hJTEQodGJTaCwgMCk7CisJcHV0X2RjX2Jsb2NrX251bWJlciggZGMsIHRiU2hfMS0+Yl9ibG9ja25yICk7CisJcHV0X2RjX3NpemUoIGRjLCAoTUFYX0NISUxEX1NJWkUgKHRiU2hfMSkgLSBCX0ZSRUVfU1BBQ0UgKHRiU2hfMSkpKTsKKworCXRiLT5pbnNlcnRfc2l6ZVtoXSAtPSBEQ19TSVpFOworICAgICAgICBzZXRfYmxraF9mcmVlX3NwYWNlKCBibGtoLCBibGtoX2ZyZWVfc3BhY2UoYmxraCkgLSBEQ19TSVpFICk7CisKKwlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKHRiLCB0YlNoLCAwKTsKKworCS8qJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmKi8KKwljaGVja19pbnRlcm5hbCAodGJTaCk7CisJLyomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYqLworICAgIAorICAgIC8qIHB1dCBuZXcgcm9vdCBpbnRvIHBhdGggc3RydWN0dXJlICovCisJUEFUSF9PRkZTRVRfUEJVRkZFUih0Yi0+dGJfcGF0aCwgSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUKSA9IHRiU2g7CisKKwkvKiBDaGFuZ2Ugcm9vdCBpbiBzdHJ1Y3R1cmUgc3VwZXIgYmxvY2suICovCisgICAgICAgIFBVVF9TQl9ST09UX0JMT0NLKCB0Yi0+dGJfc2IsIHRiU2gtPmJfYmxvY2tuciApOworICAgICAgICBQVVRfU0JfVFJFRV9IRUlHSFQoIHRiLT50Yl9zYiwgU0JfVFJFRV9IRUlHSFQodGItPnRiX3NiKSArIDEgKTsKKwlkb19iYWxhbmNlX21hcmtfc2JfZGlydHkgKHRiLCBSRUlTRVJGU19TQih0Yi0+dGJfc2IpLT5zX3NiaCwgMSk7CisgICAgfQorCQorICAgIGlmICggdGItPmJsa251bVtoXSA9PSAyICkgeworCWludCBzbnVtOworCXN0cnVjdCBidWZmZXJfaW5mbyBkZXN0X2JpLCBzcmNfYmk7CisKKworCS8qIFNfbmV3ID0gZnJlZSBidWZmZXIgZnJvbSBsaXN0IEZFQiAqLworCVNfbmV3ID0gZ2V0X0ZFQih0Yik7CisKKyAgICAgICAgc2V0X2Jsa2hfbGV2ZWwoIEJfQkxLX0hFQUQoU19uZXcpLCBoICsgMSApOworCisJZGVzdF9iaS50YiA9IHRiOworCWRlc3RfYmkuYmlfYmggPSBTX25ldzsKKwlkZXN0X2JpLmJpX3BhcmVudCA9IE5VTEw7CisJZGVzdF9iaS5iaV9wb3NpdGlvbiA9IDA7CisJc3JjX2JpLnRiID0gdGI7CisJc3JjX2JpLmJpX2JoID0gdGJTaDsKKwlzcmNfYmkuYmlfcGFyZW50ID0gUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCBoKTsKKwlzcmNfYmkuYmlfcG9zaXRpb24gPSBQQVRIX0hfUE9TSVRJT04gKHRiLT50Yl9wYXRoLCBoICsgMSk7CisJCQorCW4gPSBCX05SX0lURU1TICh0YlNoKTsgLyogbnVtYmVyIG9mIGl0ZW1zIGluIFNbaF0gKi8KKwlzbnVtID0gKGluc2VydF9udW0gKyBuICsgMSkvMjsKKwlpZiAoIG4gLSBzbnVtID49IGNoaWxkX3BvcyApIHsKKwkgICAgLyogbmV3IGl0ZW1zIGRvbid0IGZhbGwgaW50byBTX25ldyAqLworCSAgICAvKglzdG9yZSB0aGUgZGVsaW1pdGluZyBrZXkgZm9yIHRoZSBuZXh0IGxldmVsICovCisJICAgIC8qIG5ld19pbnNlcnRfa2V5ID0gKG4gLSBzbnVtKSd0aCBrZXkgaW4gU1toXSAqLworCSAgICBtZW1jcHkgKCZuZXdfaW5zZXJ0X2tleSxCX05fUERFTElNX0tFWSh0YlNoLG4gLSBzbnVtKSwKKwkJICAgIEtFWV9TSVpFKTsKKwkgICAgLyogbGFzdCBwYXJhbWV0ZXIgaXMgZGVsX3BhciAqLworCSAgICBpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zICgmZGVzdF9iaSwgJnNyY19iaSwgTEFTVF9UT19GSVJTVCwgc251bSwgMCk7CisJICAgIC8qICAgICAgICAgICAgaW50ZXJuYWxfbW92ZV9wb2ludGVyc19pdGVtcyhTX25ldywgdGJTaCwgTEFTVF9UT19GSVJTVCwgc251bSwgMCk7Ki8KKwl9IGVsc2UgaWYgKCBuICsgaW5zZXJ0X251bSAtIHNudW0gPCBjaGlsZF9wb3MgKSB7CisJICAgIC8qIGFsbCBuZXcgaXRlbXMgZmFsbCBpbnRvIFNfbmV3ICovCisJICAgIC8qCXN0b3JlIHRoZSBkZWxpbWl0aW5nIGtleSBmb3IgdGhlIG5leHQgbGV2ZWwgKi8KKwkgICAgLyogbmV3X2luc2VydF9rZXkgPSAobiArIGluc2VydF9pdGVtIC0gc251bSkndGgga2V5IGluIFNbaF0gKi8KKwkgICAgbWVtY3B5KCZuZXdfaW5zZXJ0X2tleSxCX05fUERFTElNX0tFWSh0YlNoLG4gKyBpbnNlcnRfbnVtIC0gc251bSksCisJCSAgIEtFWV9TSVpFKTsKKwkgICAgLyogbGFzdCBwYXJhbWV0ZXIgaXMgZGVsX3BhciAqLworCSAgICBpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zICgmZGVzdF9iaSwgJnNyY19iaSwgTEFTVF9UT19GSVJTVCwgc251bSAtIGluc2VydF9udW0sIDApOworCSAgICAvKgkJCWludGVybmFsX21vdmVfcG9pbnRlcnNfaXRlbXMoU19uZXcsdGJTaCwxLHNudW0gLSBpbnNlcnRfbnVtLDApOyovCisKKwkgICAgLyogaW5zZXJ0IGluc2VydF9udW0ga2V5cyBhbmQgbm9kZS1wb2ludGVycyBpbnRvIFNfbmV3ICovCisJICAgIGludGVybmFsX2luc2VydF9jaGlsZHMgKCZkZXN0X2JpLCAvKlNfbmV3LHRiLT5TW2gtMV0tPmJfbmV4dCwqL2NoaWxkX3BvcyAtIG4gLSBpbnNlcnRfbnVtICsgc251bSAtIDEsCisJCQkJICAgIGluc2VydF9udW0saW5zZXJ0X2tleSxpbnNlcnRfcHRyKTsKKworCSAgICBpbnNlcnRfbnVtID0gMDsKKwl9IGVsc2UgeworCSAgICBzdHJ1Y3QgZGlza19jaGlsZCAqIGRjOworCisJICAgIC8qIHNvbWUgaXRlbXMgZmFsbCBpbnRvIFNfbmV3LCBidXQgc29tZSBkb24ndCBmYWxsICovCisJICAgIC8qIGxhc3QgcGFyYW1ldGVyIGlzIGRlbF9wYXIgKi8KKwkgICAgaW50ZXJuYWxfbW92ZV9wb2ludGVyc19pdGVtcyAoJmRlc3RfYmksICZzcmNfYmksIExBU1RfVE9fRklSU1QsIG4gLSBjaGlsZF9wb3MgKyAxLCAxKTsKKwkgICAgLyoJCQlpbnRlcm5hbF9tb3ZlX3BvaW50ZXJzX2l0ZW1zKFNfbmV3LHRiU2gsMSxuIC0gY2hpbGRfcG9zICsgMSwxKTsqLworCSAgICAvKiBjYWxjdWxhdGUgbnVtYmVyIG9mIG5ldyBpdGVtcyB0aGF0IGZhbGwgaW50byBTX25ldyAqLworCSAgICBrID0gc251bSAtIG4gKyBjaGlsZF9wb3MgLSAxOworCisJICAgIGludGVybmFsX2luc2VydF9jaGlsZHMgKCZkZXN0X2JpLCAvKlNfbmV3LCovIDAsIGssIGluc2VydF9rZXkgKyAxLCBpbnNlcnRfcHRyKzEpOworCisJICAgIC8qIG5ld19pbnNlcnRfa2V5ID0gaW5zZXJ0X2tleVtpbnNlcnRfbnVtIC0gayAtIDFdICovCisJICAgIG1lbWNweSgmbmV3X2luc2VydF9rZXksaW5zZXJ0X2tleSArIGluc2VydF9udW0gLSBrIC0gMSwKKwkJICAgS0VZX1NJWkUpOworCSAgICAvKiByZXBsYWNlIGZpcnN0IG5vZGUtcHRyIGluIFNfbmV3IGJ5IG5vZGUtcHRyIHRvIGluc2VydF9wdHJbaW5zZXJ0X251bS1rLTFdICovCisKKwkgICAgZGMgPSBCX05fQ0hJTEQoU19uZXcsMCk7CisJICAgIHB1dF9kY19zaXplKCBkYywgKE1BWF9DSElMRF9TSVpFKGluc2VydF9wdHJbaW5zZXJ0X251bS1rLTFdKSAtCisJCQkJQl9GUkVFX1NQQUNFKGluc2VydF9wdHJbaW5zZXJ0X251bS1rLTFdKSkgKTsKKwkgICAgcHV0X2RjX2Jsb2NrX251bWJlciggZGMsIGluc2VydF9wdHJbaW5zZXJ0X251bS1rLTFdLT5iX2Jsb2NrbnIgKTsKKworCSAgICBkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKHRiLCBTX25ldywwKTsKKwkJCQorCSAgICBpbnNlcnRfbnVtIC09IChrICsgMSk7CisJfQorCS8qIG5ld19pbnNlcnRfcHRyID0gbm9kZV9wb2ludGVyIHRvIFNfbmV3ICovCisJbmV3X2luc2VydF9wdHIgPSBTX25ldzsKKworCVJGQUxTRSAoIWJ1ZmZlcl9qb3VybmFsZWQoU19uZXcpIHx8IGJ1ZmZlcl9qb3VybmFsX2RpcnR5KFNfbmV3KSB8fAorCQlidWZmZXJfZGlydHkgKFNfbmV3KSwKKwkJImNtLTAwMDAxOiBiYWQgU19uZXcgKCViKSIsIFNfbmV3KTsKKworCS8vIFNfbmV3IGlzIHJlbGVhc2VkIGluIHVuZml4X25vZGVzCisgICAgfQorCisgICAgbiA9IEJfTlJfSVRFTVMgKHRiU2gpOyAvKm51bWJlciBvZiBpdGVtcyBpbiBTW2hdICovCisKKwlpZiAoIDAgPD0gY2hpbGRfcG9zICYmIGNoaWxkX3BvcyA8PSBuICYmIGluc2VydF9udW0gPiAwICkgeworCSAgICBiaS50YiA9IHRiOworCSAgICBiaS5iaV9iaCA9IHRiU2g7CisJICAgIGJpLmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgaCk7CisJICAgIGJpLmJpX3Bvc2l0aW9uID0gUEFUSF9IX1BPU0lUSU9OICh0Yi0+dGJfcGF0aCwgaCArIDEpOworCQlpbnRlcm5hbF9pbnNlcnRfY2hpbGRzICgKKwkJICAgICZiaSwvKnRiU2gsKi8KKwkJICAgIC8qCQkoIHRiLT5TW2gtMV0tPmJfcGFyZW50ID09IHRiLT5TW2hdICkgPyB0Yi0+U1toLTFdLT5iX25leHQgOiAgdGItPlNbaF0tPmJfY2hpbGQtPmJfbmV4dCwqLworCQkgICAgY2hpbGRfcG9zLGluc2VydF9udW0saW5zZXJ0X2tleSxpbnNlcnRfcHRyCisJCSAgICApOworCX0KKworCisJbWVtY3B5IChuZXdfaW5zZXJ0X2tleV9hZGRyLCZuZXdfaW5zZXJ0X2tleSxLRVlfU0laRSk7CisJaW5zZXJ0X3B0clswXSA9IG5ld19pbnNlcnRfcHRyOworCisJcmV0dXJuIG9yZGVyOworICAgIH0KKworICAKKyAgICAKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2lub2RlLmMgYi9mcy9yZWlzZXJmcy9pbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NDMwMzEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9yZWlzZXJmcy9pbm9kZS5jCkBAIC0wLDAgKzEsMjg0NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDAwIGJ5IEhhbnMgUmVpc2VyLCBsaWNlbnNpbmcgZ292ZXJuZWQgYnkgcmVpc2VyZnMvUkVBRE1FCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfYWNsLmg+CisjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfeGF0dHIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tcGFnZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CisKK2V4dGVybiBpbnQgcmVpc2VyZnNfZGVmYXVsdF9pb19zaXplOyAvKiBkZWZhdWx0IGlvIHNpemUgZGV2dW5lZCBpbiBzdXBlci5jICovCisKK3N0YXRpYyBpbnQgcmVpc2VyZnNfY29tbWl0X3dyaXRlKHN0cnVjdCBmaWxlICpmLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKTsKK3N0YXRpYyBpbnQgcmVpc2VyZnNfcHJlcGFyZV93cml0ZShzdHJ1Y3QgZmlsZSAqZiwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJICB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0byk7CisKK3ZvaWQgcmVpc2VyZnNfZGVsZXRlX2lub2RlIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKyAgICAvKiBXZSBuZWVkIGJsb2NrcyBmb3IgdHJhbnNhY3Rpb24gKyAodXNlcitncm91cCkgcXVvdGEgdXBkYXRlIChwb3NzaWJseSBkZWxldGUpICovCisgICAgaW50IGpiZWdpbl9jb3VudCA9IEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMiArIDIgKiBSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUzsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoIDsKKyAgCisgICAgcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisKKyAgICAvKiBUaGUgPSAwIGhhcHBlbnMgd2hlbiB3ZSBhYm9ydCBjcmVhdGluZyBhIG5ldyBpbm9kZSBmb3Igc29tZSByZWFzb24gbGlrZSBsYWNrIG9mIHNwYWNlLi4gKi8KKyAgICBpZiAoIShpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSAmJiBJTk9ERV9QS0VZKGlub2RlKS0+a19vYmplY3RpZCAhPSAwKSB7IC8qIGFsc28gaGFuZGxlcyBiYWRfaW5vZGUgY2FzZSAqLworCWRvd24gKCZpbm9kZS0+aV9zZW0pOyAKKworCXJlaXNlcmZzX2RlbGV0ZV94YXR0cnMgKGlub2RlKTsKKworCWlmIChqb3VybmFsX2JlZ2luKCZ0aCwgaW5vZGUtPmlfc2IsIGpiZWdpbl9jb3VudCkpIHsKKwkgICAgdXAgKCZpbm9kZS0+aV9zZW0pOworCSAgICBnb3RvIG91dDsKKwl9CisJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKSA7CisKKwlpZiAocmVpc2VyZnNfZGVsZXRlX29iamVjdCAoJnRoLCBpbm9kZSkpIHsKKwkgICAgdXAgKCZpbm9kZS0+aV9zZW0pOworCSAgICBnb3RvIG91dDsKKwl9CisKKwkvKiBEbyBxdW90YSB1cGRhdGUgaW5zaWRlIGEgdHJhbnNhY3Rpb24gZm9yIGpvdXJuYWxlZCBxdW90YXMuIFdlIG11c3QgZG8gdGhhdAorCSAqIGFmdGVyIGRlbGV0ZV9vYmplY3Qgc28gdGhhdCBxdW90YSB1cGRhdGVzIGdvIGludG8gdGhlIHNhbWUgdHJhbnNhY3Rpb24gYXMKKwkgKiBzdGF0IGRhdGEgZGVsZXRpb24gKi8KKwlEUVVPVF9GUkVFX0lOT0RFKGlub2RlKTsKKworCWlmIChqb3VybmFsX2VuZCgmdGgsIGlub2RlLT5pX3NiLCBqYmVnaW5fY291bnQpKSB7CisJICAgIHVwICgmaW5vZGUtPmlfc2VtKTsKKwkgICAgZ290byBvdXQ7CisJfQorCisgICAgICAgIHVwICgmaW5vZGUtPmlfc2VtKTsKKworICAgICAgICAvKiBhbGwgaXRlbXMgb2YgZmlsZSBhcmUgZGVsZXRlZCwgc28gd2UgY2FuIHJlbW92ZSAic2F2ZSIgbGluayAqLworCXJlbW92ZV9zYXZlX2xpbmsgKGlub2RlLCAwLyogbm90IHRydW5jYXRlICovKTsgLyogd2UgY2FuJ3QgZG8gYW55dGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhYm91dCBhbiBlcnJvciBoZXJlICovCisgICAgfSBlbHNlIHsKKwkvKiBubyBvYmplY3QgaXRlbXMgYXJlIGluIHRoZSB0cmVlICovCisJOworICAgIH0KK291dDoKKyAgICBjbGVhcl9pbm9kZSAoaW5vZGUpOyAvKiBub3RlIHRoaXMgbXVzdCBnbyBhZnRlciB0aGUgam91cm5hbF9lbmQgdG8gcHJldmVudCBkZWFkbG9jayAqLworICAgIGlub2RlLT5pX2Jsb2NrcyA9IDA7CisgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKK30KKworc3RhdGljIHZvaWQgX21ha2VfY3B1X2tleSAoc3RydWN0IGNwdV9rZXkgKiBrZXksIGludCB2ZXJzaW9uLCBfX3UzMiBkaXJpZCwgX191MzIgb2JqZWN0aWQsIAorCSAgICAgICBsb2ZmX3Qgb2Zmc2V0LCBpbnQgdHlwZSwgaW50IGxlbmd0aCApCit7CisgICAga2V5LT52ZXJzaW9uID0gdmVyc2lvbjsKKworICAgIGtleS0+b25fZGlza19rZXkua19kaXJfaWQgPSBkaXJpZDsKKyAgICBrZXktPm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQgPSBvYmplY3RpZDsKKyAgICBzZXRfY3B1X2tleV9rX29mZnNldCAoa2V5LCBvZmZzZXQpOworICAgIHNldF9jcHVfa2V5X2tfdHlwZSAoa2V5LCB0eXBlKTsgIAorICAgIGtleS0+a2V5X2xlbmd0aCA9IGxlbmd0aDsKK30KKworCisvKiB0YWtlIGJhc2Ugb2YgaW5vZGVfa2V5IChpdCBjb21lcyBmcm9tIGlub2RlIGFsd2F5cykgKGRpcmlkLCBvYmplY3RpZCkgYW5kIHZlcnNpb24gZnJvbSBhbiBpbm9kZSwgc2V0CisgICBvZmZzZXQgYW5kIHR5cGUgb2Yga2V5ICovCit2b2lkIG1ha2VfY3B1X2tleSAoc3RydWN0IGNwdV9rZXkgKiBrZXksIHN0cnVjdCBpbm9kZSAqIGlub2RlLCBsb2ZmX3Qgb2Zmc2V0LAorCSAgICAgIGludCB0eXBlLCBpbnQgbGVuZ3RoICkKK3sKKyAgX21ha2VfY3B1X2tleSAoa2V5LCBnZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbiAoaW5vZGUpLCBsZTMyX3RvX2NwdSAoSU5PREVfUEtFWSAoaW5vZGUpLT5rX2Rpcl9pZCksCisJCSBsZTMyX3RvX2NwdSAoSU5PREVfUEtFWSAoaW5vZGUpLT5rX29iamVjdGlkKSwgCisJCSBvZmZzZXQsIHR5cGUsIGxlbmd0aCk7Cit9CisKKworLy8KKy8vIHdoZW4ga2V5IGlzIDAsIGRvIG5vdCBzZXQgdmVyc2lvbiBhbmQgc2hvcnQga2V5CisvLworaW5saW5lIHZvaWQgbWFrZV9sZV9pdGVtX2hlYWQgKHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgY29uc3Qgc3RydWN0IGNwdV9rZXkgKiBrZXksCisJCQkgICAgICAgaW50IHZlcnNpb24sCisJCQkgICAgICAgbG9mZl90IG9mZnNldCwgaW50IHR5cGUsIGludCBsZW5ndGgsIAorCQkJICAgICAgIGludCBlbnRyeV9jb3VudC8qb3IgaWhfZnJlZV9zcGFjZSovKQoreworICAgIGlmIChrZXkpIHsKKwlpaC0+aWhfa2V5LmtfZGlyX2lkID0gY3B1X3RvX2xlMzIgKGtleS0+b25fZGlza19rZXkua19kaXJfaWQpOworCWloLT5paF9rZXkua19vYmplY3RpZCA9IGNwdV90b19sZTMyIChrZXktPm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQpOworICAgIH0KKyAgICBwdXRfaWhfdmVyc2lvbiggaWgsIHZlcnNpb24gKTsKKyAgICBzZXRfbGVfaWhfa19vZmZzZXQgKGloLCBvZmZzZXQpOworICAgIHNldF9sZV9paF9rX3R5cGUgKGloLCB0eXBlKTsKKyAgICBwdXRfaWhfaXRlbV9sZW4oIGloLCBsZW5ndGggKTsKKyAgICAvKiAgICBzZXRfaWhfZnJlZV9zcGFjZSAoaWgsIDApOyovCisgICAgLy8gZm9yIGRpcmVjdG9yeSBpdGVtcyBpdCBpcyBlbnRyeSBjb3VudCwgZm9yIGRpcmVjdHMgYW5kIHN0YXQKKyAgICAvLyBkYXRhcyAtIDB4ZmZmZiwgZm9yIGluZGlyZWN0cyAtIDAKKyAgICBwdXRfaWhfZW50cnlfY291bnQoIGloLCBlbnRyeV9jb3VudCApOworfQorCisvLworLy8gRklYTUU6IHdlIG1pZ2h0IGNhY2hlIHJlY2VudGx5IGFjY2Vzc2VkIGluZGlyZWN0IGl0ZW0KKworLy8gVWdoLiAgTm90IHRvbyBlYWdlciBmb3IgdGhhdC4uLi4KKy8vICBJIGN1dCB0aGUgY29kZSB1bnRpbCBzdWNoIHRpbWUgYXMgSSBzZWUgYSBjb252aW5jaW5nIGFyZ3VtZW50IChiZW5jaG1hcmspLgorLy8gSSBkb24ndCB3YW50IGEgYmxvYXRlZCBpbm9kZSBzdHJ1Y3QuLi4sIGFuZCBJIGRvbid0IGxpa2UgY29kZSBjb21wbGV4aXR5Li4uLgorCisvKiBjdXR0aW5nIHRoZSBjb2RlIGlzIGZpbmUsIHNpbmNlIGl0IHJlYWxseSBpc24ndCBpbiB1c2UgeWV0IGFuZCBpcyBlYXN5CisqKiB0byBhZGQgYmFjayBpbi4gIEJ1dCwgVmxhZGltaXIgaGFzIGEgcmVhbGx5IGdvb2QgaWRlYSBoZXJlLiAgVGhpbmsKKyoqIGFib3V0IHdoYXQgaGFwcGVucyBmb3IgcmVhZGluZyBhIGZpbGUuICBGb3IgZWFjaCBwYWdlLAorKiogVGhlIFZGUyBsYXllciBjYWxscyByZWlzZXJmc19yZWFkcGFnZSwgd2hvIHNlYXJjaGVzIHRoZSB0cmVlIHRvIGZpbmQKKyoqIGFuIGluZGlyZWN0IGl0ZW0uICBUaGlzIGluZGlyZWN0IGl0ZW0gaGFzIFggbnVtYmVyIG9mIHBvaW50ZXJzLCB3aGVyZQorKiogWCBpcyBhIGJpZyBudW1iZXIgaWYgd2UndmUgZG9uZSB0aGUgYmxvY2sgYWxsb2NhdGlvbiByaWdodC4gIEJ1dCwKKyoqIHdlIG9ubHkgdXNlIG9uZSBvciB0d28gb2YgdGhlc2UgcG9pbnRlcnMgZHVyaW5nIGVhY2ggY2FsbCB0byByZWFkcGFnZSwKKyoqIG5lZWRsZXNzbHkgcmVzZWFyY2hpbmcgYWdhaW4gbGF0ZXIgb24uCisqKgorKiogVGhlIHNpemUgb2YgdGhlIGNhY2hlIGNvdWxkIGJlIGR5bmFtaWMgYmFzZWQgb24gdGhlIHNpemUgb2YgdGhlIGZpbGUuCisqKgorKiogSSdkIGFsc28gbGlrZSB0byBzZWUgdXMgY2FjaGUgdGhlIGxvY2F0aW9uIHRoZSBzdGF0IGRhdGEgaXRlbSwgc2luY2UKKyoqIHdlIGFyZSBuZWVkbGVzc2x5IHJlc2VhcmNoaW5nIGZvciB0aGF0IGZyZXF1ZW50bHkuCisqKgorKiogLS1jaHJpcworKi8KKworLyogSWYgdGhpcyBwYWdlIGhhcyBhIGZpbGUgdGFpbCBpbiBpdCwgYW5kCisqKiBpdCB3YXMgcmVhZCBpbiBieSBnZXRfYmxvY2tfY3JlYXRlXzAsIHRoZSBwYWdlIGRhdGEgaXMgdmFsaWQsCisqKiBidXQgdGFpbCBpcyBzdGlsbCBzaXR0aW5nIGluIGEgZGlyZWN0IGl0ZW0sIGFuZCB3ZSBjYW4ndCB3cml0ZSB0bworKiogaXQuICBTbywgbG9vayB0aHJvdWdoIHRoaXMgcGFnZSwgYW5kIGNoZWNrIGFsbCB0aGUgbWFwcGVkIGJ1ZmZlcnMKKyoqIHRvIG1ha2Ugc3VyZSB0aGV5IGhhdmUgdmFsaWQgYmxvY2sgbnVtYmVycy4gIEFueSB0aGF0IGRvbid0IG5lZWQKKyoqIHRvIGJlIHVubWFwcGVkLCBzbyB0aGF0IGJsb2NrX3ByZXBhcmVfd3JpdGUgd2lsbCBjb3JyZWN0bHkgY2FsbAorKiogcmVpc2VyZnNfZ2V0X2Jsb2NrIHRvIGNvbnZlcnQgdGhlIHRhaWwgaW50byBhbiB1bmZvcm1hdHRlZCBub2RlCisqLworc3RhdGljIGlubGluZSB2b2lkIGZpeF90YWlsX3BhZ2VfZm9yX3dyaXRpbmcoc3RydWN0IHBhZ2UgKnBhZ2UpIHsKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQsICpuZXh0LCAqYmggOworCisgICAgaWYgKHBhZ2UgJiYgcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkgeworCWhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSkgOworCWJoID0gaGVhZCA7CisJZG8geworCSAgICBuZXh0ID0gYmgtPmJfdGhpc19wYWdlIDsKKwkgICAgaWYgKGJ1ZmZlcl9tYXBwZWQoYmgpICYmIGJoLT5iX2Jsb2NrbnIgPT0gMCkgeworCSAgICAgICAgcmVpc2VyZnNfdW5tYXBfYnVmZmVyKGJoKSA7CisJICAgIH0KKwkgICAgYmggPSBuZXh0IDsKKwl9IHdoaWxlIChiaCAhPSBoZWFkKSA7CisgICAgfQorfQorCisvKiByZWlzZXJmc19nZXRfYmxvY2sgZG9lcyBub3QgbmVlZCB0byBhbGxvY2F0ZSBhIGJsb2NrIG9ubHkgaWYgaXQgaGFzIGJlZW4KKyAgIGRvbmUgYWxyZWFkeSBvciBub24taG9sZSBwb3NpdGlvbiBoYXMgYmVlbiBmb3VuZCBpbiB0aGUgaW5kaXJlY3QgaXRlbSAqLworc3RhdGljIGlubGluZSBpbnQgYWxsb2NhdGlvbl9uZWVkZWQgKGludCByZXR2YWwsIGJfYmxvY2tucl90IGFsbG9jYXRlZCwgCisJCQkJICAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWgsCisJCQkJICAgICBfX3UzMiAqIGl0ZW0sIGludCBwb3NfaW5faXRlbSkKK3sKKyAgaWYgKGFsbG9jYXRlZCkKKwkgcmV0dXJuIDA7CisgIGlmIChyZXR2YWwgPT0gUE9TSVRJT05fRk9VTkQgJiYgaXNfaW5kaXJlY3RfbGVfaWggKGloKSAmJiAKKyAgICAgIGdldF9ibG9ja19udW0oaXRlbSwgcG9zX2luX2l0ZW0pKQorCSByZXR1cm4gMDsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGluZGlyZWN0X2l0ZW1fZm91bmQgKGludCByZXR2YWwsIHN0cnVjdCBpdGVtX2hlYWQgKiBpaCkKK3sKKyAgcmV0dXJuIChyZXR2YWwgPT0gUE9TSVRJT05fRk9VTkQpICYmIGlzX2luZGlyZWN0X2xlX2loIChpaCk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIHNldF9ibG9ja19kZXZfbWFwcGVkIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwgCisJCQkJCSBiX2Jsb2NrbnJfdCBibG9jaywgc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJbWFwX2JoKGJoLCBpbm9kZS0+aV9zYiwgYmxvY2spOworfQorCisKKy8vCisvLyBmaWxlcyB3aGljaCB3ZXJlIGNyZWF0ZWQgaW4gdGhlIGVhcmxpZXIgdmVyc2lvbiBjYW4gbm90IGJlIGxvbmdlciwKKy8vIHRoYW4gMiBnYgorLy8KK3N0YXRpYyBpbnQgZmlsZV9jYXBhYmxlIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgbG9uZyBibG9jaykKK3sKKyAgICBpZiAoZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24gKGlub2RlKSAhPSBLRVlfRk9STUFUXzNfNSB8fCAvLyBpdCBpcyBuZXcgZmlsZS4KKwlibG9jayA8ICgxIDw8ICgzMSAtIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSkpIC8vIG9sZCBmaWxlLCBidXQgJ2Jsb2NrJyBpcyBpbnNpZGUgb2YgMmdiCisJcmV0dXJuIDE7CisKKyAgICByZXR1cm4gMDsKK30KKworLypzdGF0aWMqLyBpbnQgcmVzdGFydF90cmFuc2FjdGlvbihzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgcGF0aCAqcGF0aCkgeworICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSB0aC0+dF9zdXBlciA7CisgIGludCBsZW4gPSB0aC0+dF9ibG9ja3NfYWxsb2NhdGVkIDsKKyAgaW50IGVycjsKKworICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisgIEJVR19PTiAoIXRoLT50X3JlZmNvdW50KTsKKworICAvKiB3ZSBjYW5ub3QgcmVzdGFydCB3aGlsZSBuZXN0ZWQgKi8KKyAgaWYgKHRoLT50X3JlZmNvdW50ID4gMSkgeworICAgICAgcmV0dXJuIDAgIDsKKyAgfQorICBwYXRocmVsc2UocGF0aCkgOworICByZWlzZXJmc191cGRhdGVfc2QodGgsIGlub2RlKSA7CisgIGVyciA9IGpvdXJuYWxfZW5kKHRoLCBzLCBsZW4pIDsKKyAgaWYgKCFlcnIpIHsKKyAgICAgIGVyciA9IGpvdXJuYWxfYmVnaW4odGgsIHMsIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogNikgOworICAgICAgaWYgKCFlcnIpCisgICAgICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSkgOworICB9CisgIHJldHVybiBlcnI7Cit9CisKKy8vIGl0IGlzIGNhbGxlZCBieSBnZXRfYmxvY2sgd2hlbiBjcmVhdGUgPT0gMC4gUmV0dXJucyBibG9jayBudW1iZXIKKy8vIGZvciAnYmxvY2snLXRoIGxvZ2ljYWwgYmxvY2sgb2YgZmlsZS4gV2hlbiBpdCBoaXRzIGRpcmVjdCBpdGVtIGl0CisvLyByZXR1cm5zIDAgKGJlaW5nIGNhbGxlZCBmcm9tIGJtYXApIG9yIHJlYWQgZGlyZWN0IGl0ZW0gaW50byBwaWVjZQorLy8gb2YgcGFnZSAoYmhfcmVzdWx0KQorCisvLyBQbGVhc2UgaW1wcm92ZSB0aGUgZW5nbGlzaC9jbGFyaXR5IGluIHRoZSBjb21tZW50IGFib3ZlLCBhcyBpdCBpcworLy8gaGFyZCB0byB1bmRlcnN0YW5kLgorCitzdGF0aWMgaW50IF9nZXRfYmxvY2tfY3JlYXRlXzAgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBsb25nIGJsb2NrLAorCQkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaF9yZXN1bHQsCisJCQkJIGludCBhcmdzKQoreworICAgIElOSVRJQUxJWkVfUEFUSCAocGF0aCk7CisgICAgc3RydWN0IGNwdV9rZXkga2V5OworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgdG1wX2loOworICAgIGludCBmc19nZW4gOworICAgIGludCBibG9ja25yOworICAgIGNoYXIgKiBwID0gTlVMTDsKKyAgICBpbnQgY2hhcnM7CisgICAgaW50IHJldCA7CisgICAgaW50IGRvbmUgPSAwIDsKKyAgICB1bnNpZ25lZCBsb25nIG9mZnNldCA7CisKKyAgICAvLyBwcmVwYXJlIHRoZSBrZXkgdG8gbG9vayBmb3IgdGhlICdibG9jayctdGggYmxvY2sgb2YgZmlsZQorICAgIG1ha2VfY3B1X2tleSAoJmtleSwgaW5vZGUsCisJCSAgKGxvZmZfdClibG9jayAqIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSArIDEsIFRZUEVfQU5ZLCAzKTsKKworcmVzZWFyY2g6CisgICAgaWYgKHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5IChpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpICE9IFBPU0lUSU9OX0ZPVU5EKSB7CisJcGF0aHJlbHNlICgmcGF0aCk7CisgICAgICAgIGlmIChwKQorICAgICAgICAgICAga3VubWFwKGJoX3Jlc3VsdC0+Yl9wYWdlKSA7CisJLy8gV2UgZG8gbm90IHJldHVybiAtRU5PRU5UIGlmIHRoZXJlIGlzIGEgaG9sZSBidXQgcGFnZSBpcyB1cHRvZGF0ZSwgYmVjYXVzZSBpdCBtZWFucworCS8vIFRoYXQgdGhlcmUgaXMgc29tZSBNTUFQRUQgZGF0YSBhc3NvY2lhdGVkIHdpdGggaXQgdGhhdCBpcyB5ZXQgdG8gYmUgd3JpdHRlbiB0byBkaXNrLgorCWlmICgoYXJncyAmIEdFVF9CTE9DS19OT19IT0xFKSAmJiAhUGFnZVVwdG9kYXRlKGJoX3Jlc3VsdC0+Yl9wYWdlKSApIHsKKwkgICAgcmV0dXJuIC1FTk9FTlQgOworCX0KKyAgICAgICAgcmV0dXJuIDAgOworICAgIH0KKyAgICAKKyAgICAvLworICAgIGJoID0gZ2V0X2xhc3RfYmggKCZwYXRoKTsKKyAgICBpaCA9IGdldF9paCAoJnBhdGgpOworICAgIGlmIChpc19pbmRpcmVjdF9sZV9paCAoaWgpKSB7CisJX191MzIgKiBpbmRfaXRlbSA9IChfX3UzMiAqKUJfSV9QSVRFTSAoYmgsIGloKTsKKwkKKwkvKiBGSVhNRTogaGVyZSB3ZSBjb3VsZCBjYWNoZSBpbmRpcmVjdCBpdGVtIG9yIHBhcnQgb2YgaXQgaW4KKwkgICB0aGUgaW5vZGUgdG8gYXZvaWQgc2VhcmNoX2J5X2tleSBpbiBjYXNlIG9mIHN1YnNlcXVlbnQKKwkgICBhY2Nlc3MgdG8gZmlsZSAqLworCWJsb2NrbnIgPSBnZXRfYmxvY2tfbnVtKGluZF9pdGVtLCBwYXRoLnBvc19pbl9pdGVtKSA7CisJcmV0ID0gMCA7CisJaWYgKGJsb2NrbnIpIHsKKwkgICAgbWFwX2JoKGJoX3Jlc3VsdCwgaW5vZGUtPmlfc2IsIGJsb2NrbnIpOworCSAgICBpZiAocGF0aC5wb3NfaW5faXRlbSA9PSAoKGloX2l0ZW1fbGVuKGloKSAvIFVORk1fUF9TSVpFKSAtIDEpKSB7CisJCXNldF9idWZmZXJfYm91bmRhcnkoYmhfcmVzdWx0KTsKKwkgICAgfQorCX0gZWxzZSAKKwkgICAgLy8gV2UgZG8gbm90IHJldHVybiAtRU5PRU5UIGlmIHRoZXJlIGlzIGEgaG9sZSBidXQgcGFnZSBpcyB1cHRvZGF0ZSwgYmVjYXVzZSBpdCBtZWFucworCSAgICAvLyBUaGF0IHRoZXJlIGlzIHNvbWUgTU1BUEVEIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGl0IHRoYXQgaXMgeWV0IHRvICBiZSB3cml0dGVuIHRvIGRpc2suCisJICAgIGlmICgoYXJncyAmIEdFVF9CTE9DS19OT19IT0xFKSAmJiAhUGFnZVVwdG9kYXRlKGJoX3Jlc3VsdC0+Yl9wYWdlKSApIHsKKwkgICAgcmV0ID0gLUVOT0VOVCA7CisJICAgIH0KKworCXBhdGhyZWxzZSAoJnBhdGgpOworICAgICAgICBpZiAocCkKKyAgICAgICAgICAgIGt1bm1hcChiaF9yZXN1bHQtPmJfcGFnZSkgOworCXJldHVybiByZXQgOworICAgIH0KKworICAgIC8vIHJlcXVlc3RlZCBkYXRhIGFyZSBpbiBkaXJlY3QgaXRlbShzKQorICAgIGlmICghKGFyZ3MgJiBHRVRfQkxPQ0tfUkVBRF9ESVJFQ1QpKSB7CisJLy8gd2UgYXJlIGNhbGxlZCBieSBibWFwLiBGSVhNRTogd2UgY2FuIG5vdCBtYXAgYmxvY2sgb2YgZmlsZQorCS8vIHdoZW4gaXQgaXMgc3RvcmVkIGluIGRpcmVjdCBpdGVtKHMpCisJcGF0aHJlbHNlICgmcGF0aCk7CQorICAgICAgICBpZiAocCkKKyAgICAgICAgICAgIGt1bm1hcChiaF9yZXN1bHQtPmJfcGFnZSkgOworCXJldHVybiAtRU5PRU5UOworICAgIH0KKworICAgIC8qIGlmIHdlJ3ZlIGdvdCBhIGRpcmVjdCBpdGVtLCBhbmQgdGhlIGJ1ZmZlciBvciBwYWdlIHdhcyB1cHRvZGF0ZSwKKyAgICAqKiB3ZSBkb24ndCB3YW50IHRvIHB1bGwgZGF0YSBvZmYgZGlzayBhZ2Fpbi4gIHNraXAgdG8gdGhlCisgICAgKiogZW5kLCB3aGVyZSB3ZSBtYXAgdGhlIGJ1ZmZlciBhbmQgcmV0dXJuCisgICAgKi8KKyAgICBpZiAoYnVmZmVyX3VwdG9kYXRlKGJoX3Jlc3VsdCkpIHsKKyAgICAgICAgZ290byBmaW5pc2hlZCA7CisgICAgfSBlbHNlIAorCS8qCisJKiogZ3JhYl90YWlsX3BhZ2UgY2FuIHRyaWdnZXIgY2FsbHMgdG8gcmVpc2VyZnNfZ2V0X2Jsb2NrIG9uIHVwIHRvIGRhdGUKKwkqKiBwYWdlcyB3aXRob3V0IGFueSBidWZmZXJzLiAgSWYgdGhlIHBhZ2UgaXMgdXAgdG8gZGF0ZSwgd2UgZG9uJ3Qgd2FudAorCSoqIHJlYWQgb2xkIGRhdGEgb2ZmIGRpc2suICBTZXQgdGhlIHVwIHRvIGRhdGUgYml0IG9uIHRoZSBidWZmZXIgaW5zdGVhZAorCSoqIGFuZCBqdW1wIHRvIHRoZSBlbmQKKwkqLworCSAgICBpZiAoIWJoX3Jlc3VsdC0+Yl9wYWdlIHx8IFBhZ2VVcHRvZGF0ZShiaF9yZXN1bHQtPmJfcGFnZSkpIHsKKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaF9yZXN1bHQpOworCQlnb3RvIGZpbmlzaGVkIDsKKyAgICB9CisKKyAgICAvLyByZWFkIGZpbGUgdGFpbCBpbnRvIHBhcnQgb2YgcGFnZQorICAgIG9mZnNldCA9IChjcHVfa2V5X2tfb2Zmc2V0KCZrZXkpIC0gMSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkgOworICAgIGZzX2dlbiA9IGdldF9nZW5lcmF0aW9uKGlub2RlLT5pX3NiKSA7CisgICAgY29weV9pdGVtX2hlYWQgKCZ0bXBfaWgsIGloKTsKKworICAgIC8qIHdlIG9ubHkgd2FudCB0byBrbWFwIGlmIHdlIGFyZSByZWFkaW5nIHRoZSB0YWlsIGludG8gdGhlIHBhZ2UuCisgICAgKiogdGhpcyBpcyBub3QgdGhlIGNvbW1vbiBjYXNlLCBzbyB3ZSBkb24ndCBrbWFwIHVudGlsIHdlIGFyZQorICAgICoqIHN1cmUgd2UgbmVlZCB0by4gIEJ1dCwgdGhpcyBtZWFucyB0aGUgaXRlbSBtaWdodCBtb3ZlIGlmCisgICAgKioga21hcCBzY2hlZHVsZXMKKyAgICAqLworICAgIGlmICghcCkgeworCXAgPSAoY2hhciAqKWttYXAoYmhfcmVzdWx0LT5iX3BhZ2UpIDsKKwlpZiAoZnNfY2hhbmdlZCAoZnNfZ2VuLCBpbm9kZS0+aV9zYikgJiYgaXRlbV9tb3ZlZCAoJnRtcF9paCwgJnBhdGgpKSB7CisJICAgIGdvdG8gcmVzZWFyY2g7CisJfQorICAgIH0KKyAgICBwICs9IG9mZnNldCA7CisgICAgbWVtc2V0IChwLCAwLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOworICAgIGRvIHsKKwlpZiAoIWlzX2RpcmVjdF9sZV9paCAoaWgpKSB7CisJICAgIEJVRyAoKTsKKyAgICAgICAgfQorCS8qIG1ha2Ugc3VyZSB3ZSBkb24ndCByZWFkIG1vcmUgYnl0ZXMgdGhhbiBhY3R1YWxseSBleGlzdCBpbgorCSoqIHRoZSBmaWxlLiAgVGhpcyBjYW4gaGFwcGVuIGluIG9kZCBjYXNlcyB3aGVyZSBpX3NpemUgaXNuJ3QKKwkqKiBjb3JyZWN0LCBhbmQgd2hlbiBkaXJlY3QgaXRlbSBwYWRkaW5nIHJlc3VsdHMgaW4gYSBmZXcgCisJKiogZXh0cmEgYnl0ZXMgYXQgdGhlIGVuZCBvZiB0aGUgZGlyZWN0IGl0ZW0KKwkqLworICAgICAgICBpZiAoKGxlX2loX2tfb2Zmc2V0KGloKSArIHBhdGgucG9zX2luX2l0ZW0pID4gaW5vZGUtPmlfc2l6ZSkKKwkgICAgYnJlYWsgOworCWlmICgobGVfaWhfa19vZmZzZXQoaWgpIC0gMSArIGloX2l0ZW1fbGVuKGloKSkgPiBpbm9kZS0+aV9zaXplKSB7CisJICAgIGNoYXJzID0gaW5vZGUtPmlfc2l6ZSAtIChsZV9paF9rX29mZnNldChpaCkgLSAxKSAtIHBhdGgucG9zX2luX2l0ZW07CisJICAgIGRvbmUgPSAxIDsKKwl9IGVsc2UgeworCSAgICBjaGFycyA9IGloX2l0ZW1fbGVuKGloKSAtIHBhdGgucG9zX2luX2l0ZW07CisJfQorCW1lbWNweSAocCwgQl9JX1BJVEVNIChiaCwgaWgpICsgcGF0aC5wb3NfaW5faXRlbSwgY2hhcnMpOworCisJaWYgKGRvbmUpIAorCSAgICBicmVhayA7CisKKwlwICs9IGNoYXJzOworCisJaWYgKFBBVEhfTEFTVF9QT1NJVElPTiAoJnBhdGgpICE9IChCX05SX0lURU1TIChiaCkgLSAxKSkKKwkgICAgLy8gd2UgZG9uZSwgaWYgcmVhZCBkaXJlY3QgaXRlbSBpcyBub3QgdGhlIGxhc3QgaXRlbSBvZgorCSAgICAvLyBub2RlIEZJWE1FOiB3ZSBjb3VsZCB0cnkgdG8gY2hlY2sgcmlnaHQgZGVsaW1pdGluZyBrZXkKKwkgICAgLy8gdG8gc2VlIHdoZXRoZXIgZGlyZWN0IGl0ZW0gY29udGludWVzIGluIHRoZSByaWdodAorCSAgICAvLyBuZWlnaGJvciBvciByZWx5IG9uIGlfc2l6ZQorCSAgICBicmVhazsKKworCS8vIHVwZGF0ZSBrZXkgdG8gbG9vayBmb3IgdGhlIG5leHQgcGllY2UKKwlzZXRfY3B1X2tleV9rX29mZnNldCAoJmtleSwgY3B1X2tleV9rX29mZnNldCAoJmtleSkgKyBjaGFycyk7CisJaWYgKHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5IChpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpICE9IFBPU0lUSU9OX0ZPVU5EKQorCSAgICAvLyB3ZSByZWFkIHNvbWV0aGluZyBmcm9tIHRhaWwsIGV2ZW4gaWYgbm93IHdlIGdvdCBJT19FUlJPUgorCSAgICBicmVhazsKKwliaCA9IGdldF9sYXN0X2JoICgmcGF0aCk7CisJaWggPSBnZXRfaWggKCZwYXRoKTsKKyAgICB9IHdoaWxlICgxKTsKKworICAgIGZsdXNoX2RjYWNoZV9wYWdlKGJoX3Jlc3VsdC0+Yl9wYWdlKSA7CisgICAga3VubWFwKGJoX3Jlc3VsdC0+Yl9wYWdlKSA7CisKK2ZpbmlzaGVkOgorICAgIHBhdGhyZWxzZSAoJnBhdGgpOworICAgIC8qIHRoaXMgYnVmZmVyIGhhcyB2YWxpZCBkYXRhLCBidXQgaXNuJ3QgdmFsaWQgZm9yIGlvLiAgbWFwcGluZyBpdCB0bworICAgICAqIGJsb2NrICMwIHRlbGxzIHRoZSByZXN0IG9mIHJlaXNlcmZzIGl0IGp1c3QgaGFzIGEgdGFpbCBpbiBpdAorICAgICAqLworICAgIG1hcF9iaChiaF9yZXN1bHQsIGlub2RlLT5pX3NiLCAwKTsKKyAgICBzZXRfYnVmZmVyX3VwdG9kYXRlIChiaF9yZXN1bHQpOworICAgIHJldHVybiAwOworfQorCisKKy8vIHRoaXMgaXMgY2FsbGVkIHRvIGNyZWF0ZSBmaWxlIG1hcC4gU28sIF9nZXRfYmxvY2tfY3JlYXRlXzAgd2lsbCBub3QKKy8vIHJlYWQgZGlyZWN0IGl0ZW0KK3N0YXRpYyBpbnQgcmVpc2VyZnNfYm1hcCAoc3RydWN0IGlub2RlICogaW5vZGUsIHNlY3Rvcl90IGJsb2NrLAorCQkJICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaF9yZXN1bHQsIGludCBjcmVhdGUpCit7CisgICAgaWYgKCFmaWxlX2NhcGFibGUgKGlub2RlLCBibG9jaykpCisJcmV0dXJuIC1FRkJJRzsKKworICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworICAgIC8qIGRvIG5vdCByZWFkIHRoZSBkaXJlY3QgaXRlbSAqLworICAgIF9nZXRfYmxvY2tfY3JlYXRlXzAgKGlub2RlLCBibG9jaywgYmhfcmVzdWx0LCAwKSA7CisgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogc3BlY2lhbCB2ZXJzaW9uIG9mIGdldF9ibG9jayB0aGF0IGlzIG9ubHkgdXNlZCBieSBncmFiX3RhaWxfcGFnZSByaWdodAorKiogbm93LiAgSXQgaXMgc2VudCB0byBibG9ja19wcmVwYXJlX3dyaXRlLCBhbmQgd2hlbiB5b3UgdHJ5IHRvIGdldCBhCisqKiBibG9jayBwYXN0IHRoZSBlbmQgb2YgdGhlIGZpbGUgKG9yIGEgYmxvY2sgZnJvbSBhIGhvbGUpIGl0IHJldHVybnMKKyoqIC1FTk9FTlQgaW5zdGVhZCBvZiBhIHZhbGlkIGJ1ZmZlci4gIGJsb2NrX3ByZXBhcmVfd3JpdGUgZXhwZWN0cyB0bworKiogYmUgYWJsZSB0byBkbyBpL28gb24gdGhlIGJ1ZmZlcnMgcmV0dXJuZWQsIHVubGVzcyBhbiBlcnJvciB2YWx1ZQorKiogaXMgYWxzbyByZXR1cm5lZC4KKyoqIAorKiogU28sIHRoaXMgYWxsb3dzIGJsb2NrX3ByZXBhcmVfd3JpdGUgdG8gYmUgdXNlZCBmb3IgcmVhZGluZyBhIHNpbmdsZSBibG9jaworKiogaW4gYSBwYWdlLiAgV2hlcmUgaXQgZG9lcyBub3QgcHJvZHVjZSBhIHZhbGlkIHBhZ2UgZm9yIGhvbGVzLCBvciBwYXN0IHRoZQorKiogZW5kIG9mIHRoZSBmaWxlLiAgVGhpcyB0dXJucyBvdXQgdG8gYmUgZXhhY3RseSB3aGF0IHdlIG5lZWQgZm9yIHJlYWRpbmcKKyoqIHRhaWxzIGZvciBjb252ZXJzaW9uLgorKioKKyoqIFRoZSBwb2ludCBvZiB0aGUgd3JhcHBlciBpcyBmb3JjaW5nIGEgY2VydGFpbiB2YWx1ZSBmb3IgY3JlYXRlLCBldmVuCisqKiB0aG91Z2ggdGhlIFZGUyBsYXllciBpcyBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2l0aCBjcmVhdGU9PTEuICBJZiB5b3UgCisqKiBkb24ndCB3YW50IHRvIHNlbmQgY3JlYXRlID09IEdFVF9CTE9DS19OT19IT0xFIHRvIHJlaXNlcmZzX2dldF9ibG9jaywgCisqKiBkb24ndCB1c2UgdGhpcyBmdW5jdGlvbi4KKyovCitzdGF0aWMgaW50IHJlaXNlcmZzX2dldF9ibG9ja19jcmVhdGVfMCAoc3RydWN0IGlub2RlICogaW5vZGUsIHNlY3Rvcl90IGJsb2NrLAorCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmhfcmVzdWx0LCBpbnQgY3JlYXRlKSB7CisgICAgcmV0dXJuIHJlaXNlcmZzX2dldF9ibG9jayhpbm9kZSwgYmxvY2ssIGJoX3Jlc3VsdCwgR0VUX0JMT0NLX05PX0hPTEUpIDsKK30KKworLyogVGhpcyBpcyBzcGVjaWFsIGhlbHBlciBmb3IgcmVpc2VyZnNfZ2V0X2Jsb2NrIGluIGNhc2Ugd2UgYXJlIGV4ZWN1dGluZworICAgZGlyZWN0X0lPIHJlcXVlc3QuICovCitzdGF0aWMgaW50IHJlaXNlcmZzX2dldF9ibG9ja3NfZGlyZWN0X2lvKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCSBzZWN0b3JfdCBpYmxvY2ssCisJCQkJCSB1bnNpZ25lZCBsb25nIG1heF9ibG9ja3MsCisJCQkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoX3Jlc3VsdCwKKwkJCQkJIGludCBjcmVhdGUpCit7CisgICAgaW50IHJldCA7CisKKyAgICBiaF9yZXN1bHQtPmJfcGFnZSA9IE5VTEw7CisKKyAgICAvKiBXZSBzZXQgdGhlIGJfc2l6ZSBiZWZvcmUgcmVpc2VyZnNfZ2V0X2Jsb2NrIGNhbGwgc2luY2UgaXQgaXMKKyAgICAgICByZWZlcmVuY2VkIGluIGNvbnZlcnRfdGFpbF9mb3JfaG9sZSgpIHRoYXQgbWF5IGJlIGNhbGxlZCBmcm9tCisgICAgICAgcmVpc2VyZnNfZ2V0X2Jsb2NrKCkgKi8KKyAgICBiaF9yZXN1bHQtPmJfc2l6ZSA9ICgxIDw8IGlub2RlLT5pX2Jsa2JpdHMpOworCisgICAgcmV0ID0gcmVpc2VyZnNfZ2V0X2Jsb2NrKGlub2RlLCBpYmxvY2ssIGJoX3Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlIHwgR0VUX0JMT0NLX05PX0RBTkdMRSkgOworICAgIGlmIChyZXQpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgLyogZG9uJ3QgYWxsb3cgZGlyZWN0IGlvIG9udG8gdGFpbCBwYWdlcyAqLworICAgIGlmIChidWZmZXJfbWFwcGVkKGJoX3Jlc3VsdCkgJiYgYmhfcmVzdWx0LT5iX2Jsb2NrbnIgPT0gMCkgeworICAgICAgICAvKiBtYWtlIHN1cmUgZnV0dXJlIGNhbGxzIHRvIHRoZSBkaXJlY3QgaW8gZnVuY3MgZm9yIHRoaXMgb2Zmc2V0CisgICAgICAgICoqIGluIHRoZSBmaWxlIGZhaWwgYnkgdW5tYXBwaW5nIHRoZSBidWZmZXIKKyAgICAgICAgKi8KKyAgICAgICAgY2xlYXJfYnVmZmVyX21hcHBlZChiaF9yZXN1bHQpOworICAgICAgICByZXQgPSAtRUlOVkFMIDsKKyAgICB9CisgICAgLyogUG9zc2libGUgdW5wYWNrZWQgdGFpbC4gRmx1c2ggdGhlIGRhdGEgYmVmb3JlIHBhZ2VzIGhhdmUKKyAgICAgICBkaXNhcHBlYXJlZCAqLworICAgIGlmIChSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmIGlfcGFja19vbl9jbG9zZV9tYXNrKSB7CisgICAgICAgIGludCBlcnI7CisgICAgICAgIGxvY2tfa2VybmVsKCk7CisgICAgICAgIGVyciA9IHJlaXNlcmZzX2NvbW1pdF9mb3JfaW5vZGUoaW5vZGUpOworICAgICAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmPSB+aV9wYWNrX29uX2Nsb3NlX21hc2s7CisgICAgICAgIHVubG9ja19rZXJuZWwoKTsKKyAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICByZXQgPSBlcnI7CisgICAgfQorb3V0OgorICAgIHJldHVybiByZXQgOworfQorCisKKy8qCisqKiBoZWxwZXIgZnVuY3Rpb24gZm9yIHdoZW4gcmVpc2VyZnNfZ2V0X2Jsb2NrIGlzIGNhbGxlZCBmb3IgYSBob2xlCisqKiBidXQgdGhlIGZpbGUgdGFpbCBpcyBzdGlsbCBpbiBhIGRpcmVjdCBpdGVtCisqKiBiaF9yZXN1bHQgaXMgdGhlIGJ1ZmZlciBoZWFkIGZvciB0aGUgaG9sZQorKiogdGFpbF9vZmZzZXQgaXMgdGhlIG9mZnNldCBvZiB0aGUgc3RhcnQgb2YgdGhlIHRhaWwgaW4gdGhlIGZpbGUKKyoqCisqKiBUaGlzIGNhbGxzIHByZXBhcmVfd3JpdGUsIHdoaWNoIHdpbGwgc3RhcnQgYSBuZXcgdHJhbnNhY3Rpb24KKyoqIHlvdSBzaG91bGQgbm90IGJlIGluIGEgdHJhbnNhY3Rpb24sIG9yIGhhdmUgYW55IHBhdGhzIGhlbGQgd2hlbiB5b3UKKyoqIGNhbGwgdGhpcy4KKyovCitzdGF0aWMgaW50IGNvbnZlcnRfdGFpbF9mb3JfaG9sZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmhfcmVzdWx0LAorCQkJCSBsb2ZmX3QgdGFpbF9vZmZzZXQpIHsKKyAgICB1bnNpZ25lZCBsb25nIGluZGV4IDsKKyAgICB1bnNpZ25lZCBsb25nIHRhaWxfZW5kIDsgCisgICAgdW5zaWduZWQgbG9uZyB0YWlsX3N0YXJ0IDsKKyAgICBzdHJ1Y3QgcGFnZSAqIHRhaWxfcGFnZSA7CisgICAgc3RydWN0IHBhZ2UgKiBob2xlX3BhZ2UgPSBiaF9yZXN1bHQtPmJfcGFnZSA7CisgICAgaW50IHJldHZhbCA9IDAgOworCisgICAgaWYgKCh0YWlsX29mZnNldCAmIChiaF9yZXN1bHQtPmJfc2l6ZSAtIDEpKSAhPSAxKSAKKyAgICAgICAgcmV0dXJuIC1FSU8gOworCisgICAgLyogYWx3YXlzIHRyeSB0byByZWFkIHVudGlsIHRoZSBlbmQgb2YgdGhlIGJsb2NrICovCisgICAgdGFpbF9zdGFydCA9IHRhaWxfb2Zmc2V0ICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpIDsKKyAgICB0YWlsX2VuZCA9ICh0YWlsX3N0YXJ0IHwgKGJoX3Jlc3VsdC0+Yl9zaXplIC0gMSkpICsgMSA7CisKKyAgICBpbmRleCA9IHRhaWxfb2Zmc2V0ID4+IFBBR0VfQ0FDSEVfU0hJRlQgOworICAgIC8qIGhvbGVfcGFnZSBjYW4gYmUgemVybyBpbiBjYXNlIG9mIGRpcmVjdF9pbywgd2UgYXJlIHN1cmUKKyAgICAgICB0aGF0IHdlIGNhbm5vdCBnZXQgaGVyZSBpZiB3ZSB3cml0ZSB3aXRoIE9fRElSRUNUIGludG8KKyAgICAgICB0YWlsIHBhZ2UgKi8KKyAgICBpZiAoIWhvbGVfcGFnZSB8fCBpbmRleCAhPSBob2xlX3BhZ2UtPmluZGV4KSB7CisJdGFpbF9wYWdlID0gZ3JhYl9jYWNoZV9wYWdlKGlub2RlLT5pX21hcHBpbmcsIGluZGV4KSA7CisJcmV0dmFsID0gLUVOT01FTTsKKwlpZiAoIXRhaWxfcGFnZSkgeworCSAgICBnb3RvIG91dCA7CisJfQorICAgIH0gZWxzZSB7CisgICAgICAgIHRhaWxfcGFnZSA9IGhvbGVfcGFnZSA7CisgICAgfQorCisgICAgLyogd2UgZG9uJ3QgaGF2ZSB0byBtYWtlIHN1cmUgdGhlIGNvbnZlcnNpb24gZGlkIG5vdCBoYXBwZW4gd2hpbGUKKyAgICAqKiB3ZSB3ZXJlIGxvY2tpbmcgdGhlIHBhZ2UgYmVjYXVzZSBhbnlvbmUgdGhhdCBjb3VsZCBjb252ZXJ0CisgICAgKiogbXVzdCBmaXJzdCB0YWtlIGlfc2VtLgorICAgICoqCisgICAgKiogV2UgbXVzdCBmaXggdGhlIHRhaWwgcGFnZSBmb3Igd3JpdGluZyBiZWNhdXNlIGl0IG1pZ2h0IGhhdmUgYnVmZmVycworICAgICoqIHRoYXQgYXJlIG1hcHBlZCwgYnV0IGhhdmUgYSBibG9jayBudW1iZXIgb2YgMC4gIFRoaXMgaW5kaWNhdGVzIHRhaWwKKyAgICAqKiBkYXRhIHRoYXQgaGFzIGJlZW4gcmVhZCBkaXJlY3RseSBpbnRvIHRoZSBwYWdlLCBhbmQgYmxvY2tfcHJlcGFyZV93cml0ZQorICAgICoqIHdvbid0IHRyaWdnZXIgYSBnZXRfYmxvY2sgaW4gdGhpcyBjYXNlLgorICAgICovCisgICAgZml4X3RhaWxfcGFnZV9mb3Jfd3JpdGluZyh0YWlsX3BhZ2UpIDsKKyAgICByZXR2YWwgPSByZWlzZXJmc19wcmVwYXJlX3dyaXRlKE5VTEwsIHRhaWxfcGFnZSwgdGFpbF9zdGFydCwgdGFpbF9lbmQpOworICAgIGlmIChyZXR2YWwpCisgICAgICAgIGdvdG8gdW5sb2NrIDsKKworICAgIC8qIHRhaWwgY29udmVyc2lvbiBtaWdodCBjaGFuZ2UgdGhlIGRhdGEgaW4gdGhlIHBhZ2UgKi8KKyAgICBmbHVzaF9kY2FjaGVfcGFnZSh0YWlsX3BhZ2UpIDsKKworICAgIHJldHZhbCA9IHJlaXNlcmZzX2NvbW1pdF93cml0ZShOVUxMLCB0YWlsX3BhZ2UsIHRhaWxfc3RhcnQsIHRhaWxfZW5kKSA7CisKK3VubG9jazoKKyAgICBpZiAodGFpbF9wYWdlICE9IGhvbGVfcGFnZSkgeworICAgICAgICB1bmxvY2tfcGFnZSh0YWlsX3BhZ2UpIDsKKwlwYWdlX2NhY2hlX3JlbGVhc2UodGFpbF9wYWdlKSA7CisgICAgfQorb3V0OgorICAgIHJldHVybiByZXR2YWwgOworfQorCitzdGF0aWMgaW5saW5lIGludCBfYWxsb2NhdGVfYmxvY2soc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgICBsb25nIGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlub2RlICppbm9kZSwgCisJCQkgICBiX2Jsb2NrbnJfdCAqYWxsb2NhdGVkX2Jsb2NrX25yLCAKKwkJCSAgIHN0cnVjdCBwYXRoICogcGF0aCwKKwkJCSAgIGludCBmbGFncykgeworICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKyAgCisjaWZkZWYgUkVJU0VSRlNfUFJFQUxMT0NBVEUKKyAgICBpZiAoIShmbGFncyAmIEdFVF9CTE9DS19OT19JU0VNKSkgeworCXJldHVybiByZWlzZXJmc19uZXdfdW5mX2Jsb2NrbnJzMih0aCwgaW5vZGUsIGFsbG9jYXRlZF9ibG9ja19uciwgcGF0aCwgYmxvY2spOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiByZWlzZXJmc19uZXdfdW5mX2Jsb2NrbnJzICh0aCwgaW5vZGUsIGFsbG9jYXRlZF9ibG9ja19uciwgcGF0aCwgYmxvY2spOworfQorCitpbnQgcmVpc2VyZnNfZ2V0X2Jsb2NrIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc2VjdG9yX3QgYmxvY2ssCisJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaF9yZXN1bHQsIGludCBjcmVhdGUpCit7CisgICAgaW50IHJlcGVhdCwgcmV0dmFsID0gMDsKKyAgICBiX2Jsb2NrbnJfdCBhbGxvY2F0ZWRfYmxvY2tfbnIgPSAwOy8vIGJfYmxvY2tucl90IGlzICh1bnNpZ25lZCkgMzIgYml0IGludAorICAgIElOSVRJQUxJWkVfUEFUSChwYXRoKTsKKyAgICBpbnQgcG9zX2luX2l0ZW07CisgICAgc3RydWN0IGNwdV9rZXkga2V5OworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoLCAqIHVuYmggPSBOVUxMOworICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgdG1wX2loOworICAgIF9fdTMyICogaXRlbTsKKyAgICBpbnQgZG9uZTsKKyAgICBpbnQgZnNfZ2VuOworICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoID0gTlVMTDsKKyAgICAvKiBzcGFjZSByZXNlcnZlZCBpbiB0cmFuc2FjdGlvbiBiYXRjaDogCisgICAgICAgIC4gMyBiYWxhbmNpbmdzIGluIGRpcmVjdC0+aW5kaXJlY3QgY29udmVyc2lvbgorICAgICAgICAuIDEgYmxvY2sgaW52b2x2ZWQgaW50byByZWlzZXJmc191cGRhdGVfc2QoKQorICAgICAgIFhYWCBpbiBwcmFjdGljYWxseSBpbXBvc3NpYmxlIHdvcnN0IGNhc2UgZGlyZWN0MmluZGlyZWN0KCkKKyAgICAgICBjYW4gaW5jdXIgKG11Y2gpIG1vcmUgdGhhbiAzIGJhbGFuY2luZ3MuCisgICAgICAgcXVvdGEgdXBkYXRlIGZvciB1c2VyLCBncm91cCAqLworICAgIGludCBqYmVnaW5fY291bnQgPSBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDMgKyAxICsgMiAqIFJFSVNFUkZTX1FVT1RBX1RSQU5TX0JMT0NLUzsKKyAgICBpbnQgdmVyc2lvbjsKKyAgICBpbnQgZGFuZ2xlID0gMTsKKyAgICBsb2ZmX3QgbmV3X29mZnNldCA9ICgoKGxvZmZfdClibG9jaykgPDwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpICsgMSA7CisKKwkJCQkvKiBiYWQuLi4uICovCisgICAgcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisgICAgdmVyc2lvbiA9IGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uIChpbm9kZSk7CisKKyAgICBpZiAoYmxvY2sgPCAwKSB7CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwlyZXR1cm4gLUVJTzsKKyAgICB9CisKKyAgICBpZiAoIWZpbGVfY2FwYWJsZSAoaW5vZGUsIGJsb2NrKSkgeworCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJcmV0dXJuIC1FRkJJRzsKKyAgICB9CisKKyAgICAvKiBpZiAhY3JlYXRlLCB3ZSBhcmVuJ3QgY2hhbmdpbmcgdGhlIEZTLCBzbyB3ZSBkb24ndCBuZWVkIHRvCisgICAgKiogbG9nIGFueXRoaW5nLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHN0YXJ0IGEgdHJhbnNhY3Rpb24KKyAgICAqLworICAgIGlmICghKGNyZWF0ZSAmIEdFVF9CTE9DS19DUkVBVEUpKSB7CisJaW50IHJldCA7CisJLyogZmluZCBudW1iZXIgb2YgYmxvY2stdGggbG9naWNhbCBibG9jayBvZiB0aGUgZmlsZSAqLworCXJldCA9IF9nZXRfYmxvY2tfY3JlYXRlXzAgKGlub2RlLCBibG9jaywgYmhfcmVzdWx0LCAKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGUgfCBHRVRfQkxPQ0tfUkVBRF9ESVJFQ1QpIDsKKwlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCXJldHVybiByZXQ7CisgICAgfQorICAgIC8qCisgICAgICogaWYgd2UncmUgYWxyZWFkeSBpbiBhIHRyYW5zYWN0aW9uLCBtYWtlIHN1cmUgdG8gY2xvc2UKKyAgICAgKiBhbnkgbmV3IHRyYW5zYWN0aW9ucyB3ZSBzdGFydCBpbiB0aGlzIGZ1bmMKKyAgICAgKi8KKyAgICBpZiAoKGNyZWF0ZSAmIEdFVF9CTE9DS19OT19EQU5HTEUpIHx8CisgICAgICAgIHJlaXNlcmZzX3RyYW5zYWN0aW9uX3J1bm5pbmcoaW5vZGUtPmlfc2IpKQorICAgICAgICBkYW5nbGUgPSAwOworCisgICAgLyogSWYgZmlsZSBpcyBvZiBzdWNoIGEgc2l6ZSwgdGhhdCBpdCBtaWdodCBoYXZlIGEgdGFpbCBhbmQgdGFpbHMgYXJlIGVuYWJsZWQKKyAgICAqKiB3ZSBzaG91bGQgbWFyayBpdCBhcyBwb3NzaWJseSBuZWVkaW5nIHRhaWwgcGFja2luZyBvbiBjbG9zZQorICAgICovCisgICAgaWYgKCAoaGF2ZV9sYXJnZV90YWlscyAoaW5vZGUtPmlfc2IpICYmIGlub2RlLT5pX3NpemUgPCBpX2Jsb2NrX3NpemUgKGlub2RlKSo0KSB8fAorCSAoaGF2ZV9zbWFsbF90YWlscyAoaW5vZGUtPmlfc2IpICYmIGlub2RlLT5pX3NpemUgPCBpX2Jsb2NrX3NpemUoaW5vZGUpKSApCisJUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgfD0gaV9wYWNrX29uX2Nsb3NlX21hc2sgOworCisgICAgLyogc2V0IHRoZSBrZXkgb2YgdGhlIGZpcnN0IGJ5dGUgaW4gdGhlICdibG9jayctdGggYmxvY2sgb2YgZmlsZSAqLworICAgIG1ha2VfY3B1X2tleSAoJmtleSwgaW5vZGUsIG5ld19vZmZzZXQsCisJCSAgVFlQRV9BTlksIDMvKmtleSBsZW5ndGgqLyk7CisgICAgaWYgKChuZXdfb2Zmc2V0ICsgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkgPiBpbm9kZS0+aV9zaXplKSB7CitzdGFydF90cmFuczoKKwl0aCA9IHJlaXNlcmZzX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24oaW5vZGUtPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJaWYgKCF0aCkgeworCSAgICByZXR2YWwgPSAtRU5PTUVNOworCSAgICBnb3RvIGZhaWx1cmU7CisJfQorCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSkgOworICAgIH0KKyByZXNlYXJjaDoKKworICAgIHJldHZhbCA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5IChpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpOworICAgIGlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKKwlyZXR2YWwgPSAtRUlPOworCWdvdG8gZmFpbHVyZTsKKyAgICB9CisJCisgICAgYmggPSBnZXRfbGFzdF9iaCAoJnBhdGgpOworICAgIGloID0gZ2V0X2loICgmcGF0aCk7CisgICAgaXRlbSA9IGdldF9pdGVtICgmcGF0aCk7CisgICAgcG9zX2luX2l0ZW0gPSBwYXRoLnBvc19pbl9pdGVtOworCisgICAgZnNfZ2VuID0gZ2V0X2dlbmVyYXRpb24gKGlub2RlLT5pX3NiKTsKKyAgICBjb3B5X2l0ZW1faGVhZCAoJnRtcF9paCwgaWgpOworCisgICAgaWYgKGFsbG9jYXRpb25fbmVlZGVkIChyZXR2YWwsIGFsbG9jYXRlZF9ibG9ja19uciwgaWgsIGl0ZW0sIHBvc19pbl9pdGVtKSkgeworCS8qIHdlIGhhdmUgdG8gYWxsb2NhdGUgYmxvY2sgZm9yIHRoZSB1bmZvcm1hdHRlZCBub2RlICovCisJaWYgKCF0aCkgeworCSAgICBwYXRocmVsc2UoJnBhdGgpIDsKKwkgICAgZ290byBzdGFydF90cmFuczsKKwl9CisKKwlyZXBlYXQgPSBfYWxsb2NhdGVfYmxvY2sodGgsIGJsb2NrLCBpbm9kZSwgJmFsbG9jYXRlZF9ibG9ja19uciwgJnBhdGgsIGNyZWF0ZSk7CisKKwlpZiAocmVwZWF0ID09IE5PX0RJU0tfU1BBQ0UgfHwgcmVwZWF0ID09IFFVT1RBX0VYQ0VFREVEKSB7CisJICAgIC8qIHJlc3RhcnQgdGhlIHRyYW5zYWN0aW9uIHRvIGdpdmUgdGhlIGpvdXJuYWwgYSBjaGFuY2UgdG8gZnJlZQorCSAgICAqKiBzb21lIGJsb2Nrcy4gIHJlbGVhc2VzIHRoZSBwYXRoLCBzbyB3ZSBoYXZlIHRvIGdvIGJhY2sgdG8KKwkgICAgKiogcmVzZWFyY2ggaWYgd2Ugc3VjY2VlZCBvbiB0aGUgc2Vjb25kIHRyeQorCSAgICAqLworCSAgICBTQl9KT1VSTkFMKGlub2RlLT5pX3NiKS0+al9uZXh0X2FzeW5jX2ZsdXNoID0gMTsKKwkgICAgcmV0dmFsID0gcmVzdGFydF90cmFuc2FjdGlvbih0aCwgaW5vZGUsICZwYXRoKSA7CisgICAgICAgICAgICBpZiAocmV0dmFsKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbHVyZTsKKwkgICAgcmVwZWF0ID0gX2FsbG9jYXRlX2Jsb2NrKHRoLCBibG9jaywgaW5vZGUsICZhbGxvY2F0ZWRfYmxvY2tfbnIsIE5VTEwsIGNyZWF0ZSk7CisKKwkgICAgaWYgKHJlcGVhdCAhPSBOT19ESVNLX1NQQUNFICYmIHJlcGVhdCAhPSBRVU9UQV9FWENFRURFRCkgeworCQlnb3RvIHJlc2VhcmNoIDsKKwkgICAgfQorCSAgICBpZiAocmVwZWF0ID09IFFVT1RBX0VYQ0VFREVEKQorCQlyZXR2YWwgPSAtRURRVU9UOworCSAgICBlbHNlCisJCXJldHZhbCA9IC1FTk9TUEM7CisJICAgIGdvdG8gZmFpbHVyZTsKKwl9CisKKwlpZiAoZnNfY2hhbmdlZCAoZnNfZ2VuLCBpbm9kZS0+aV9zYikgJiYgaXRlbV9tb3ZlZCAoJnRtcF9paCwgJnBhdGgpKSB7CisJICAgIGdvdG8gcmVzZWFyY2g7CisJfQorICAgIH0KKworICAgIGlmIChpbmRpcmVjdF9pdGVtX2ZvdW5kIChyZXR2YWwsIGloKSkgeworICAgICAgICBiX2Jsb2NrbnJfdCB1bmZtX3B0cjsKKwkvKiAnYmxvY2snLXRoIGJsb2NrIGlzIGluIHRoZSBmaWxlIGFscmVhZHkgKHRoZXJlIGlzCisJICAgY29ycmVzcG9uZGluZyBjZWxsIGluIHNvbWUgaW5kaXJlY3QgaXRlbSkuIEJ1dCBpdCBtYXkgYmUKKwkgICB6ZXJvIHVuZm9ybWF0dGVkIG5vZGUgcG9pbnRlciAoaG9sZSkgKi8KKyAgICAgICAgdW5mbV9wdHIgPSBnZXRfYmxvY2tfbnVtIChpdGVtLCBwb3NfaW5faXRlbSk7CisJaWYgKHVuZm1fcHRyID09IDApIHsKKwkgICAgLyogdXNlIGFsbG9jYXRlZCBibG9jayB0byBwbHVnIHRoZSBob2xlICovCisJICAgIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwoaW5vZGUtPmlfc2IsIGJoLCAxKSA7CisJICAgIGlmIChmc19jaGFuZ2VkIChmc19nZW4sIGlub2RlLT5pX3NiKSAmJiBpdGVtX21vdmVkICgmdG1wX2loLCAmcGF0aCkpIHsKKwkJcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIoaW5vZGUtPmlfc2IsIGJoKSA7CisJCWdvdG8gcmVzZWFyY2g7CisJICAgIH0KKwkgICAgc2V0X2J1ZmZlcl9uZXcoYmhfcmVzdWx0KTsKKwkgICAgaWYgKGJ1ZmZlcl9kaXJ0eShiaF9yZXN1bHQpICYmIHJlaXNlcmZzX2RhdGFfb3JkZXJlZChpbm9kZS0+aV9zYikpCisJICAgIAlyZWlzZXJmc19hZGRfb3JkZXJlZF9saXN0KGlub2RlLCBiaF9yZXN1bHQpOworCSAgICBwdXRfYmxvY2tfbnVtKGl0ZW0sIHBvc19pbl9pdGVtLCBhbGxvY2F0ZWRfYmxvY2tfbnIpIDsKKyAgICAgICAgICAgIHVuZm1fcHRyID0gYWxsb2NhdGVkX2Jsb2NrX25yOworCSAgICBqb3VybmFsX21hcmtfZGlydHkgKHRoLCBpbm9kZS0+aV9zYiwgYmgpOworCSAgICByZWlzZXJmc191cGRhdGVfc2QodGgsIGlub2RlKSA7CisJfQorCXNldF9ibG9ja19kZXZfbWFwcGVkKGJoX3Jlc3VsdCwgdW5mbV9wdHIsIGlub2RlKTsKKwlwYXRocmVsc2UgKCZwYXRoKTsKKyAgICAgICAgcmV0dmFsID0gMDsKKwlpZiAoIWRhbmdsZSAmJiB0aCkKKwkgICAgcmV0dmFsID0gcmVpc2VyZnNfZW5kX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24odGgpOworCisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKwkgCisJLyogdGhlIGl0ZW0gd2FzIGZvdW5kLCBzbyBuZXcgYmxvY2tzIHdlcmUgbm90IGFkZGVkIHRvIHRoZSBmaWxlCisJKiogdGhlcmUgaXMgbm8gbmVlZCB0byBtYWtlIHN1cmUgdGhlIGlub2RlIGlzIHVwZGF0ZWQgd2l0aCB0aGlzIAorCSoqIHRyYW5zYWN0aW9uCisJKi8KKwlyZXR1cm4gcmV0dmFsOworICAgIH0KKworICAgIGlmICghdGgpIHsKKwlwYXRocmVsc2UoJnBhdGgpIDsKKwlnb3RvIHN0YXJ0X3RyYW5zOworICAgIH0KKworICAgIC8qIGRlc2lyZWQgcG9zaXRpb24gaXMgbm90IGZvdW5kIG9yIGlzIGluIHRoZSBkaXJlY3QgaXRlbS4gV2UgaGF2ZQorICAgICAgIHRvIGFwcGVuZCBmaWxlIHdpdGggaG9sZXMgdXAgdG8gJ2Jsb2NrJy10aCBibG9jayBjb252ZXJ0aW5nCisgICAgICAgZGlyZWN0IGl0ZW1zIHRvIGluZGlyZWN0IG9uZSBpZiBuZWNlc3NhcnkgKi8KKyAgICBkb25lID0gMDsKKyAgICBkbyB7CisJaWYgKGlzX3N0YXRkYXRhX2xlX2loIChpaCkpIHsKKwkgICAgX191MzIgdW5wID0gMDsKKwkgICAgc3RydWN0IGNwdV9rZXkgdG1wX2tleTsKKworCSAgICAvKiBpbmRpcmVjdCBpdGVtIGhhcyB0byBiZSBpbnNlcnRlZCAqLworCSAgICBtYWtlX2xlX2l0ZW1faGVhZCAoJnRtcF9paCwgJmtleSwgdmVyc2lvbiwgMSwgVFlQRV9JTkRJUkVDVCwgCisJCQkgICAgICAgVU5GTV9QX1NJWkUsIDAvKiBmcmVlX3NwYWNlICovKTsKKworCSAgICBpZiAoY3B1X2tleV9rX29mZnNldCAoJmtleSkgPT0gMSkgeworCQkvKiB3ZSBhcmUgZ29pbmcgdG8gYWRkICdibG9jayctdGggYmxvY2sgdG8gdGhlIGZpbGUuIFVzZQorCQkgICBhbGxvY2F0ZWQgYmxvY2sgZm9yIHRoYXQgKi8KKwkJdW5wID0gY3B1X3RvX2xlMzIgKGFsbG9jYXRlZF9ibG9ja19ucik7CisJCXNldF9ibG9ja19kZXZfbWFwcGVkIChiaF9yZXN1bHQsIGFsbG9jYXRlZF9ibG9ja19uciwgaW5vZGUpOworCQlzZXRfYnVmZmVyX25ldyhiaF9yZXN1bHQpOworCQlkb25lID0gMTsKKwkgICAgfQorCSAgICB0bXBfa2V5ID0ga2V5OyAvLyA7KQorCSAgICBzZXRfY3B1X2tleV9rX29mZnNldCAoJnRtcF9rZXksIDEpOworCSAgICBQQVRIX0xBU1RfUE9TSVRJT04oJnBhdGgpICsrOworCisJICAgIHJldHZhbCA9IHJlaXNlcmZzX2luc2VydF9pdGVtICh0aCwgJnBhdGgsICZ0bXBfa2V5LCAmdG1wX2loLCBpbm9kZSwgKGNoYXIgKikmdW5wKTsKKwkgICAgaWYgKHJldHZhbCkgeworCQlyZWlzZXJmc19mcmVlX2Jsb2NrICh0aCwgaW5vZGUsIGFsbG9jYXRlZF9ibG9ja19uciwgMSk7CisJCWdvdG8gZmFpbHVyZTsgLy8gcmV0dmFsID09IC1FTk9TUEMsIC1FRFFVT1Qgb3IgLUVJTyBvciAtRUVYSVNUCisJICAgIH0KKwkgICAgLy9tYXJrX3RhaWxfY29udmVydGVkIChpbm9kZSk7CisJfSBlbHNlIGlmIChpc19kaXJlY3RfbGVfaWggKGloKSkgeworCSAgICAvKiBkaXJlY3QgaXRlbSBoYXMgdG8gYmUgY29udmVydGVkICovCisJICAgIGxvZmZfdCB0YWlsX29mZnNldDsKKworCSAgICB0YWlsX29mZnNldCA9ICgobGVfaWhfa19vZmZzZXQgKGloKSAtIDEpICYgfihpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSkgKyAxOworCSAgICBpZiAodGFpbF9vZmZzZXQgPT0gY3B1X2tleV9rX29mZnNldCAoJmtleSkpIHsKKwkJLyogZGlyZWN0IGl0ZW0gd2UganVzdCBmb3VuZCBmaXRzIGludG8gYmxvY2sgd2UgaGF2ZQorICAgICAgICAgICAgICAgICAgIHRvIG1hcC4gQ29udmVydCBpdCBpbnRvIHVuZm9ybWF0dGVkIG5vZGU6IHVzZQorICAgICAgICAgICAgICAgICAgIGJoX3Jlc3VsdCBmb3IgdGhlIGNvbnZlcnNpb24gKi8KKwkJc2V0X2Jsb2NrX2Rldl9tYXBwZWQgKGJoX3Jlc3VsdCwgYWxsb2NhdGVkX2Jsb2NrX25yLCBpbm9kZSk7CisJCXVuYmggPSBiaF9yZXN1bHQ7CisJCWRvbmUgPSAxOworCSAgICB9IGVsc2UgeworCQkvKiB3ZSBoYXZlIHRvIHBhZGQgZmlsZSB0YWlsIHN0b3JlZCBpbiBkaXJlY3QgaXRlbShzKQorCQkgICB1cCB0byBibG9jayBzaXplIGFuZCBjb252ZXJ0IGl0IHRvIHVuZm9ybWF0dGVkCisJCSAgIG5vZGUuIEZJWE1FOiB0aGlzIHNob3VsZCBhbHNvIGdldCBpbnRvIHBhZ2UgY2FjaGUgKi8KKworCQlwYXRocmVsc2UoJnBhdGgpIDsKKwkJLyoKKwkJICogdWdseSwgYnV0IHdlIGNhbiBvbmx5IGVuZCB0aGUgdHJhbnNhY3Rpb24gaWYKKwkJICogd2UgYXJlbid0IG5lc3RlZAorCQkgKi8KKwkJQlVHX09OICghdGgtPnRfcmVmY291bnQpOworCQlpZiAodGgtPnRfcmVmY291bnQgPT0gMSkgeworCQkgICAgcmV0dmFsID0gcmVpc2VyZnNfZW5kX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24odGgpOworCQkgICAgdGggPSBOVUxMOworCQkgICAgaWYgKHJldHZhbCkKKwkJCWdvdG8gZmFpbHVyZTsKKwkJfQorCisJCXJldHZhbCA9IGNvbnZlcnRfdGFpbF9mb3JfaG9sZShpbm9kZSwgYmhfcmVzdWx0LCB0YWlsX29mZnNldCkgOworCQlpZiAocmV0dmFsKSB7CisJCSAgICBpZiAoIHJldHZhbCAhPSAtRU5PU1BDICkKKwkJCXJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAiY2xtLTYwMDQ6IGNvbnZlcnQgdGFpbCBmYWlsZWQgaW5vZGUgJWx1LCBlcnJvciAlZCIsIGlub2RlLT5pX2lubywgcmV0dmFsKSA7CisJCSAgICBpZiAoYWxsb2NhdGVkX2Jsb2NrX25yKSB7CisJCQkvKiB0aGUgYml0bWFwLCB0aGUgc3VwZXIsIGFuZCB0aGUgc3RhdCBkYXRhID09IDMgKi8KKwkJCWlmICghdGgpCisJCQkgICAgdGggPSByZWlzZXJmc19wZXJzaXN0ZW50X3RyYW5zYWN0aW9uKGlub2RlLT5pX3NiLDMpOworCQkJaWYgKHRoKQorCQkJICAgIHJlaXNlcmZzX2ZyZWVfYmxvY2sgKHRoLGlub2RlLGFsbG9jYXRlZF9ibG9ja19uciwxKTsKKwkJICAgIH0KKwkJICAgIGdvdG8gZmFpbHVyZSA7CisJCX0KKwkJZ290byByZXNlYXJjaCA7CisJICAgIH0KKwkgICAgcmV0dmFsID0gZGlyZWN0MmluZGlyZWN0ICh0aCwgaW5vZGUsICZwYXRoLCB1bmJoLCB0YWlsX29mZnNldCk7CisJICAgIGlmIChyZXR2YWwpIHsKKwkJcmVpc2VyZnNfdW5tYXBfYnVmZmVyKHVuYmgpOworCQlyZWlzZXJmc19mcmVlX2Jsb2NrICh0aCwgaW5vZGUsIGFsbG9jYXRlZF9ibG9ja19uciwgMSk7CisJCWdvdG8gZmFpbHVyZTsKKwkgICAgfQorCSAgICAvKiBpdCBpcyBpbXBvcnRhbnQgdGhlIHNldF9idWZmZXJfdXB0b2RhdGUgaXMgZG9uZSBhZnRlcgorCSAgICAqKiB0aGUgZGlyZWN0MmluZGlyZWN0LiAgVGhlIGJ1ZmZlciBtaWdodCBjb250YWluIHZhbGlkCisJICAgICoqIGRhdGEgbmV3ZXIgdGhhbiB0aGUgZGF0YSBvbiBkaXNrIChyZWFkIGJ5IHJlYWRwYWdlLCBjaGFuZ2VkLAorCSAgICAqKiBhbmQgdGhlbiBzZW50IGhlcmUgYnkgd3JpdGVwYWdlKS4gIGRpcmVjdDJpbmRpcmVjdCBuZWVkcworCSAgICAqKiB0byBrbm93IGlmIHVuYmggd2FzIGFscmVhZHkgdXAgdG8gZGF0ZSwgc28gaXQgY2FuIGRlY2lkZQorCSAgICAqKiBpZiB0aGUgZGF0YSBpbiB1bmJoIG5lZWRzIHRvIGJlIHJlcGxhY2VkIHdpdGggZGF0YSBmcm9tCisJICAgICoqIHRoZSBkaXNrCisJICAgICovCisJICAgIHNldF9idWZmZXJfdXB0b2RhdGUgKHVuYmgpOworCisJICAgIC8qIHVuYmgtPmJfcGFnZSA9PSBOVUxMIGluIGNhc2Ugb2YgRElSRUNUX0lPIHJlcXVlc3QsIHRoaXMgbWVhbnMKKwkgICAgICAgYnVmZmVyIHdpbGwgZGlzYXBwZWFyIHNob3J0bHksIHNvIGl0IHNob3VsZCBub3QgYmUgYWRkZWQgdG8KKwkgICAgICovCisJICAgIGlmICggdW5iaC0+Yl9wYWdlICkgeworCQkvKiB3ZSd2ZSBjb252ZXJ0ZWQgdGhlIHRhaWwsIHNvIHdlIG11c3QKKwkJKiogZmx1c2ggdW5iaCBiZWZvcmUgdGhlIHRyYW5zYWN0aW9uIGNvbW1pdHMKKwkJKi8KKwkJcmVpc2VyZnNfYWRkX3RhaWxfbGlzdChpbm9kZSwgdW5iaCkgOworCisJCS8qIG1hcmsgaXQgZGlydHkgbm93IHRvIHByZXZlbnQgY29tbWl0X3dyaXRlIGZyb20gYWRkaW5nCisJCSoqIHRoaXMgYnVmZmVyIHRvIHRoZSBpbm9kZSdzIGRpcnR5IGJ1ZmZlciBsaXN0CisJCSovCisJCS8qCisJCSAqIEFLUE06IGNoYW5nZWQgX19tYXJrX2J1ZmZlcl9kaXJ0eSB0byBtYXJrX2J1ZmZlcl9kaXJ0eSgpLgorCQkgKiBJdCdzIHN0aWxsIGF0b21pYywgYnV0IGl0IHNldHMgdGhlIHBhZ2UgZGlydHkgdG9vLAorCQkgKiB3aGljaCBtYWtlcyBpdCBlbGlnaWJsZSBmb3Igd3JpdGViYWNrIGF0IGFueSB0aW1lIGJ5IHRoZQorCQkgKiBWTSAod2hpY2ggd2FzIGFsc28gdGhlIGNhc2Ugd2l0aCBfX21hcmtfYnVmZmVyX2RpcnR5KCkpCisJCSAqLworCQltYXJrX2J1ZmZlcl9kaXJ0eSh1bmJoKSA7CisJICAgIH0KKwl9IGVsc2UgeworCSAgICAvKiBhcHBlbmQgaW5kaXJlY3QgaXRlbSB3aXRoIGhvbGVzIGlmIG5lZWRlZCwgd2hlbiBhcHBlbmRpbmcKKwkgICAgICAgcG9pbnRlciB0byAnYmxvY2snLXRoIGJsb2NrIHVzZSBibG9jaywgd2hpY2ggaXMgYWxyZWFkeQorCSAgICAgICBhbGxvY2F0ZWQgKi8KKwkgICAgc3RydWN0IGNwdV9rZXkgdG1wX2tleTsKKwkgICAgdW5wX3QgdW5mX3NpbmdsZT0wOyAvLyBXZSB1c2UgdGhpcyBpbiBjYXNlIHdlIG5lZWQgdG8gYWxsb2NhdGUgb25seQorCQkJCS8vIG9uZSBibG9jayB3aGljaCBpcyBhIGZhc3RwYXRoCisJICAgIHVucF90ICp1bjsKKwkgICAgX191NjQgbWF4X3RvX2luc2VydD1NQVhfSVRFTV9MRU4oaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKS9VTkZNX1BfU0laRTsKKwkgICAgX191NjQgYmxvY2tzX25lZWRlZDsKKworCSAgICBSRkFMU0UoIHBvc19pbl9pdGVtICE9IGloX2l0ZW1fbGVuKGloKSAvIFVORk1fUF9TSVpFLAorCQkgICAgInZzLTgwNDogaW52YWxpZCBwb3NpdGlvbiBmb3IgYXBwZW5kIik7CisJICAgIC8qIGluZGlyZWN0IGl0ZW0gaGFzIHRvIGJlIGFwcGVuZGVkLCBzZXQgdXAga2V5IG9mIHRoYXQgcG9zaXRpb24gKi8KKwkgICAgbWFrZV9jcHVfa2V5ICgmdG1wX2tleSwgaW5vZGUsCisJCQkgIGxlX2tleV9rX29mZnNldCAodmVyc2lvbiwgJihpaC0+aWhfa2V5KSkgKyBvcF9ieXRlc19udW1iZXIgKGloLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpLAorCQkJICAvL3Bvc19pbl9pdGVtICogaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplLAorCQkJICBUWVBFX0lORElSRUNULCAzKTsvLyBrZXkgdHlwZSBpcyB1bmltcG9ydGFudAorCisJICAgIGJsb2Nrc19uZWVkZWQgPSAxICsgKChjcHVfa2V5X2tfb2Zmc2V0ICgma2V5KSAtIGNwdV9rZXlfa19vZmZzZXQgKCZ0bXBfa2V5KSkgPj4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCSAgICBSRkFMU0UoIGJsb2Nrc19uZWVkZWQgPCAwLCAiZ3JlZW4tODA1OiBpbnZhbGlkIG9mZnNldCIpOworCisJICAgIGlmICggYmxvY2tzX25lZWRlZCA9PSAxICkgeworCQl1biA9ICZ1bmZfc2luZ2xlOworCSAgICB9IGVsc2UgeworCQl1bj1rbWFsbG9jKCBtaW4oYmxvY2tzX25lZWRlZCxtYXhfdG9faW5zZXJ0KSpVTkZNX1BfU0laRSwKKwkJCSAgICBHRlBfQVRPTUlDKTsgLy8gV2UgbmVlZCB0byBhdm9pZCBzY2hlZHVsaW5nLgorCQlpZiAoICF1bikgeworCQkgICAgdW4gPSAmdW5mX3NpbmdsZTsKKwkJICAgIGJsb2Nrc19uZWVkZWQgPSAxOworCQkgICAgbWF4X3RvX2luc2VydCA9IDA7CisJCX0gZWxzZQorCQkgICAgbWVtc2V0KHVuLCAwLCBVTkZNX1BfU0laRSAqIG1pbihibG9ja3NfbmVlZGVkLG1heF90b19pbnNlcnQpKTsKKwkgICAgfQorCSAgICBpZiAoIGJsb2Nrc19uZWVkZWQgPD0gbWF4X3RvX2luc2VydCkgeworCQkvKiB3ZSBhcmUgZ29pbmcgdG8gYWRkIHRhcmdldCBibG9jayB0byB0aGUgZmlsZS4gVXNlIGFsbG9jYXRlZAorCQkgICBibG9jayBmb3IgdGhhdCAqLworCQl1bltibG9ja3NfbmVlZGVkLTFdID0gY3B1X3RvX2xlMzIgKGFsbG9jYXRlZF9ibG9ja19ucik7CisJCXNldF9ibG9ja19kZXZfbWFwcGVkIChiaF9yZXN1bHQsIGFsbG9jYXRlZF9ibG9ja19uciwgaW5vZGUpOworCQlzZXRfYnVmZmVyX25ldyhiaF9yZXN1bHQpOworCQlkb25lID0gMTsKKwkgICAgfSBlbHNlIHsKKwkJLyogcGFzdGUgaG9sZSB0byB0aGUgaW5kaXJlY3QgaXRlbSAqLworCQkvKiBJZiBrbWFsbG9jIGZhaWxlZCwgbWF4X3RvX2luc2VydCBiZWNvbWVzIHplcm8gYW5kIGl0IG1lYW5zIHdlCisJCSAgIG9ubHkgaGF2ZSBzcGFjZSBmb3Igb25lIGJsb2NrICovCisJCWJsb2Nrc19uZWVkZWQ9bWF4X3RvX2luc2VydD9tYXhfdG9faW5zZXJ0OjE7CisJICAgIH0KKwkgICAgcmV0dmFsID0gcmVpc2VyZnNfcGFzdGVfaW50b19pdGVtICh0aCwgJnBhdGgsICZ0bXBfa2V5LCBpbm9kZSwgKGNoYXIgKil1biwgVU5GTV9QX1NJWkUgKiBibG9ja3NfbmVlZGVkKTsKKworCSAgICBpZiAoYmxvY2tzX25lZWRlZCAhPSAxKQorCQlrZnJlZSh1bik7CisKKwkgICAgaWYgKHJldHZhbCkgeworCQlyZWlzZXJmc19mcmVlX2Jsb2NrICh0aCwgaW5vZGUsIGFsbG9jYXRlZF9ibG9ja19uciwgMSk7CisJCWdvdG8gZmFpbHVyZTsKKwkgICAgfQorCSAgICBpZiAoIWRvbmUpIHsKKwkJLyogV2UgbmVlZCB0byBtYXJrIG5ldyBmaWxlIHNpemUgaW4gY2FzZSB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUKKwkJICAgaW50ZXJydXB0ZWQvYWJvcnRlZCBsYXRlciBvbi4gQW5kIHdlIG1heSBkbyB0aGlzIG9ubHkgZm9yCisJCSAgIGhvbGVzLiAqLworCQlpbm9kZS0+aV9zaXplICs9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAqIGJsb2Nrc19uZWVkZWQ7CisJICAgIH0KKwl9CisKKwlpZiAoZG9uZSA9PSAxKQorCSAgICBicmVhazsKKworCS8qIHRoaXMgbG9vcCBjb3VsZCBsb2cgbW9yZSBibG9ja3MgdGhhbiB3ZSBoYWQgb3JpZ2luYWxseSBhc2tlZAorCSoqIGZvci4gIFNvLCB3ZSBoYXZlIHRvIGFsbG93IHRoZSB0cmFuc2FjdGlvbiB0byBlbmQgaWYgaXQgaXMKKwkqKiB0b28gYmlnIG9yIHRvbyBmdWxsLiAgVXBkYXRlIHRoZSBpbm9kZSBzbyB0aGluZ3MgYXJlIAorCSoqIGNvbnNpc3RlbnQgaWYgd2UgY3Jhc2ggYmVmb3JlIHRoZSBmdW5jdGlvbiByZXR1cm5zCisJKioKKwkqKiByZWxlYXNlIHRoZSBwYXRoIHNvIHRoYXQgYW55Ym9keSB3YWl0aW5nIG9uIHRoZSBwYXRoIGJlZm9yZQorCSoqIGVuZGluZyB0aGVpciB0cmFuc2FjdGlvbiB3aWxsIGJlIGFibGUgdG8gY29udGludWUuCisJKi8KKwlpZiAoam91cm5hbF90cmFuc2FjdGlvbl9zaG91bGRfZW5kKHRoLCB0aC0+dF9ibG9ja3NfYWxsb2NhdGVkKSkgeworCSAgcmV0dmFsID0gcmVzdGFydF90cmFuc2FjdGlvbih0aCwgaW5vZGUsICZwYXRoKSA7CisJICBpZiAocmV0dmFsKQorCSAgICBnb3RvIGZhaWx1cmU7CisJfQorCS8qIGluc2VydGluZyBpbmRpcmVjdCBwb2ludGVycyBmb3IgYSBob2xlIGNhbiB0YWtlIGEgCisJKiogbG9uZyB0aW1lLiAgcmVzY2hlZHVsZSBpZiBuZWVkZWQKKwkqLworCWNvbmRfcmVzY2hlZCgpOworCisJcmV0dmFsID0gc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkgKGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCk7CisJaWYgKHJldHZhbCA9PSBJT19FUlJPUikgeworCSAgICByZXR2YWwgPSAtRUlPOworCSAgICBnb3RvIGZhaWx1cmU7CisJfQorCWlmIChyZXR2YWwgPT0gUE9TSVRJT05fRk9VTkQpIHsKKwkgICAgcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICJ2cy04MjU6IHJlaXNlcmZzX2dldF9ibG9jazogIgorCQkJICAgICAgIiVLIHNob3VsZCBub3QgYmUgZm91bmQiLCAma2V5KTsKKwkgICAgcmV0dmFsID0gLUVFWElTVDsKKwkgICAgaWYgKGFsbG9jYXRlZF9ibG9ja19ucikKKwkgICAgICAgIHJlaXNlcmZzX2ZyZWVfYmxvY2sgKHRoLCBpbm9kZSwgYWxsb2NhdGVkX2Jsb2NrX25yLCAxKTsKKwkgICAgcGF0aHJlbHNlKCZwYXRoKSA7CisJICAgIGdvdG8gZmFpbHVyZTsKKwl9CisJYmggPSBnZXRfbGFzdF9iaCAoJnBhdGgpOworCWloID0gZ2V0X2loICgmcGF0aCk7CisJaXRlbSA9IGdldF9pdGVtICgmcGF0aCk7CisJcG9zX2luX2l0ZW0gPSBwYXRoLnBvc19pbl9pdGVtOworICAgIH0gd2hpbGUgKDEpOworCisKKyAgICByZXR2YWwgPSAwOworCisgZmFpbHVyZToKKyAgICBpZiAodGggJiYgKCFkYW5nbGUgfHwgKHJldHZhbCAmJiAhdGgtPnRfdHJhbnNfaWQpKSkgeworICAgICAgICBpbnQgZXJyOworICAgICAgICBpZiAodGgtPnRfdHJhbnNfaWQpCisgICAgICAgICAgICByZWlzZXJmc191cGRhdGVfc2QodGgsIGlub2RlKTsKKyAgICAgICAgZXJyID0gcmVpc2VyZnNfZW5kX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24odGgpOworICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgcmV0dmFsID0gZXJyOworICAgIH0KKworICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisgICAgcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aCkgOworICAgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQKK3JlaXNlcmZzX3JlYWRwYWdlcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCXN0cnVjdCBsaXN0X2hlYWQgKnBhZ2VzLCB1bnNpZ25lZCBucl9wYWdlcykKK3sKKyAgICByZXR1cm4gbXBhZ2VfcmVhZHBhZ2VzKG1hcHBpbmcsIHBhZ2VzLCBucl9wYWdlcywgcmVpc2VyZnNfZ2V0X2Jsb2NrKTsKK30KKworLyogQ29tcHV0ZSByZWFsIG51bWJlciBvZiB1c2VkIGJ5dGVzIGJ5IGZpbGUKKyAqIEZvbGxvd2luZyB0aHJlZSBmdW5jdGlvbnMgY2FuIGdvIGF3YXkgd2hlbiB3ZSdsbCBoYXZlIGVub3VnaCBzcGFjZSBpbiBzdGF0IGl0ZW0KKyAqLworc3RhdGljIGludCByZWFsX3NwYWNlX2RpZmYoc3RydWN0IGlub2RlICppbm9kZSwgaW50IHNkX3NpemUpCit7CisgICAgaW50IGJ5dGVzOworICAgIGxvZmZfdCBibG9ja3NpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgOworCisgICAgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKyAgICAgICAgcmV0dXJuIHNkX3NpemUgOworCisgICAgLyogRW5kIG9mIGZpbGUgaXMgYWxzbyBpbiBmdWxsIGJsb2NrIHdpdGggaW5kaXJlY3QgcmVmZXJlbmNlLCBzbyByb3VuZAorICAgICoqIHVwIHRvIHRoZSBuZXh0IGJsb2NrLgorICAgICoqCisgICAgKiogdGhlcmUgaXMganVzdCBubyB3YXkgdG8ga25vdyBpZiB0aGUgdGFpbCBpcyBhY3R1YWxseSBwYWNrZWQKKyAgICAqKiBvbiB0aGUgZmlsZSwgc28gd2UgaGF2ZSB0byBhc3N1bWUgaXQgaXNuJ3QuICBXaGVuIHdlIHBhY2sgdGhlCisgICAgKiogdGFpbCwgd2UgYWRkIDQgYnl0ZXMgdG8gcHJldGVuZCB0aGVyZSByZWFsbHkgaXMgYW4gdW5mb3JtYXR0ZWQKKyAgICAqKiBub2RlIHBvaW50ZXIKKyAgICAqLworICAgIGJ5dGVzID0gKChpbm9kZS0+aV9zaXplICsgKGJsb2Nrc2l6ZS0xKSkgPj4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpICogVU5GTV9QX1NJWkUgKyBzZF9zaXplOworICAgIHJldHVybiBieXRlcyA7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9mZl90IHRvX3JlYWxfdXNlZF9zcGFjZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bG9uZyBibG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNkX3NpemUpCit7CisgICAgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgeworICAgICAgICByZXR1cm4gaW5vZGUtPmlfc2l6ZSArIChsb2ZmX3QpKHJlYWxfc3BhY2VfZGlmZihpbm9kZSwgc2Rfc2l6ZSkpIDsKKyAgICB9CisgICAgcmV0dXJuICgobG9mZl90KXJlYWxfc3BhY2VfZGlmZihpbm9kZSwgc2Rfc2l6ZSkpICsgKCgobG9mZl90KWJsb2NrcykgPDwgOSk7Cit9CisKKy8qIENvbXB1dGUgbnVtYmVyIG9mIGJsb2NrcyB1c2VkIGJ5IGZpbGUgaW4gUmVpc2VyRlMgY291bnRpbmcgKi8KK3N0YXRpYyBpbmxpbmUgdWxvbmcgdG9fZmFrZV91c2VkX2Jsb2NrcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgc2Rfc2l6ZSkKK3sKKyAgICBsb2ZmX3QgYnl0ZXMgPSBpbm9kZV9nZXRfYnl0ZXMoaW5vZGUpIDsKKyAgICBsb2ZmX3QgcmVhbF9zcGFjZSA9IHJlYWxfc3BhY2VfZGlmZihpbm9kZSwgc2Rfc2l6ZSkgOworCisgICAgLyoga2VlcHMgZnNjayBhbmQgbm9uLXF1b3RhIHZlcnNpb25zIG9mIHJlaXNlcmZzIGhhcHB5ICovCisgICAgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgeworICAgICAgICBieXRlcyArPSAobG9mZl90KTUxMSA7CisgICAgfQorCisgICAgLyogZmlsZXMgZnJvbSBiZWZvcmUgdGhlIHF1b3RhIHBhdGNoIG1pZ2h0IGlfYmxvY2tzIHN1Y2ggdGhhdAorICAgICoqIGJ5dGVzIDwgcmVhbF9zcGFjZS4gIERlYWwgd2l0aCB0aGF0IGhlcmUgdG8gcHJldmVudCBpdCBmcm9tCisgICAgKiogZ29pbmcgbmVnYXRpdmUuCisgICAgKi8KKyAgICBpZiAoYnl0ZXMgPCByZWFsX3NwYWNlKQorICAgICAgICByZXR1cm4gMCA7CisgICAgcmV0dXJuIChieXRlcyAtIHJlYWxfc3BhY2UpID4+IDk7Cit9CisKKy8vCisvLyBCQUQ6IG5ldyBkaXJlY3RvcmllcyBoYXZlIHN0YXQgZGF0YSBvZiBuZXcgdHlwZSBhbmQgYWxsIG90aGVyIGl0ZW1zCisvLyBvZiBvbGQgdHlwZS4gVmVyc2lvbiBzdG9yZWQgaW4gdGhlIGlub2RlIHNheXMgYWJvdXQgYm9keSBpdGVtcywgc28KKy8vIGluIHVwZGF0ZV9zdGF0X2RhdGEgd2UgY2FuIG5vdCByZWx5IG9uIGlub2RlLCBidXQgaGF2ZSB0byBjaGVjaworLy8gaXRlbSB2ZXJzaW9uIGRpcmVjdGx5CisvLworCisvLyBjYWxsZWQgYnkgcmVhZF9sb2NrZWRfaW5vZGUKK3N0YXRpYyB2b2lkIGluaXRfaW5vZGUgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgcGF0aCAqIHBhdGgpCit7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisgICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOworICAgIF9fdTMyIHJkZXY7CisgICAgLy9pbnQgdmVyc2lvbiA9IElURU1fVkVSU0lPTl8xOworCisgICAgYmggPSBQQVRIX1BMQVNUX0JVRkZFUiAocGF0aCk7CisgICAgaWggPSBQQVRIX1BJVEVNX0hFQUQgKHBhdGgpOworCisKKyAgICBjb3B5X2tleSAoSU5PREVfUEtFWSAoaW5vZGUpLCAmKGloLT5paF9rZXkpKTsKKyAgICBpbm9kZS0+aV9ibGtzaXplID0gcmVpc2VyZnNfZGVmYXVsdF9pb19zaXplOworCisgICAgSU5JVF9MSVNUX0hFQUQoJihSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19saXN0ICkpOworICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzID0gMDsKKyAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9wcmVhbGxvY19ibG9jayA9IDA7CisgICAgUkVJU0VSRlNfSShpbm9kZSktPmlfcHJlYWxsb2NfY291bnQgPSAwOworICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX3RyYW5zX2lkID0gMDsKKyAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9qbCA9IE5VTEw7CisgICAgUkVJU0VSRlNfSShpbm9kZSktPmlfYWNsX2FjY2VzcyA9IE5VTEw7CisgICAgUkVJU0VSRlNfSShpbm9kZSktPmlfYWNsX2RlZmF1bHQgPSBOVUxMOworICAgIGluaXRfcndzZW0gKCZSRUlTRVJGU19JKGlub2RlKS0+eGF0dHJfc2VtKTsKKworICAgIGlmIChzdGF0X2RhdGFfdjEgKGloKSkgeworCXN0cnVjdCBzdGF0X2RhdGFfdjEgKiBzZCA9IChzdHJ1Y3Qgc3RhdF9kYXRhX3YxICopQl9JX1BJVEVNIChiaCwgaWgpOworCXVuc2lnbmVkIGxvbmcgYmxvY2tzOworCisJc2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24gKGlub2RlLCBLRVlfRk9STUFUXzNfNSk7CisgICAgICAgIHNldF9pbm9kZV9zZF92ZXJzaW9uIChpbm9kZSwgU1RBVF9EQVRBX1YxKTsKKwlpbm9kZS0+aV9tb2RlICA9IHNkX3YxX21vZGUoc2QpOworCWlub2RlLT5pX25saW5rID0gc2RfdjFfbmxpbmsoc2QpOworCWlub2RlLT5pX3VpZCAgID0gc2RfdjFfdWlkKHNkKTsKKwlpbm9kZS0+aV9naWQgICA9IHNkX3YxX2dpZChzZCk7CisJaW5vZGUtPmlfc2l6ZSAgPSBzZF92MV9zaXplKHNkKTsKKwlpbm9kZS0+aV9hdGltZS50dl9zZWMgPSBzZF92MV9hdGltZShzZCk7CisJaW5vZGUtPmlfbXRpbWUudHZfc2VjID0gc2RfdjFfbXRpbWUoc2QpOworCWlub2RlLT5pX2N0aW1lLnR2X3NlYyA9IHNkX3YxX2N0aW1lKHNkKTsKKwlpbm9kZS0+aV9hdGltZS50dl9uc2VjID0gMDsKKwlpbm9kZS0+aV9jdGltZS50dl9uc2VjID0gMDsKKwlpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gMDsKKworCWlub2RlLT5pX2Jsb2NrcyA9IHNkX3YxX2Jsb2NrcyhzZCk7CisJaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IGxlMzJfdG9fY3B1IChJTk9ERV9QS0VZIChpbm9kZSktPmtfZGlyX2lkKTsKKwlibG9ja3MgPSAoaW5vZGUtPmlfc2l6ZSArIDUxMSkgPj4gOTsKKwlibG9ja3MgPSBfUk9VTkRfVVAgKGJsb2NrcywgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplID4+IDkpOworCWlmIChpbm9kZS0+aV9ibG9ja3MgPiBibG9ja3MpIHsKKwkgICAgLy8gdGhlcmUgd2FzIGEgYnVnIGluIDw9My41LjIzIHdoZW4gaV9ibG9ja3MgY291bGQgdGFrZSBuZWdhdGl2ZQorCSAgICAvLyB2YWx1ZXMuIFN0YXJ0aW5nIGZyb20gMy41LjE3IHRoaXMgdmFsdWUgY291bGQgZXZlbiBiZSBzdG9yZWQgaW4KKwkgICAgLy8gc3RhdCBkYXRhLiBGb3Igc3VjaCBmaWxlcyB3ZSBzZXQgaV9ibG9ja3MgYmFzZWQgb24gZmlsZQorCSAgICAvLyBzaXplLiBKdXN0IDIgbm90ZXM6IHRoaXMgY2FuIGJlIHdyb25nIGZvciBzcGFyY2UgZmlsZXMuIE9uLWRpc2sgdmFsdWUgd2lsbCBiZQorCSAgICAvLyBvbmx5IHVwZGF0ZWQgaWYgZmlsZSdzIGlub2RlIHdpbGwgZXZlciBjaGFuZ2UKKwkgICAgaW5vZGUtPmlfYmxvY2tzID0gYmxvY2tzOworCX0KKworICAgICAgICByZGV2ID0gc2RfdjFfcmRldihzZCk7CisJUkVJU0VSRlNfSShpbm9kZSktPmlfZmlyc3RfZGlyZWN0X2J5dGUgPSBzZF92MV9maXJzdF9kaXJlY3RfYnl0ZShzZCk7CisJLyogYW4gZWFybHkgYnVnIGluIHRoZSBxdW90YSBjb2RlIGNhbiBnaXZlIHVzIGFuIG9kZCBudW1iZXIgZm9yIHRoZQorCSoqIGJsb2NrIGNvdW50LiAgVGhpcyBpcyBpbmNvcnJlY3QsIGZpeCBpdCBoZXJlLgorCSovCisJaWYgKGlub2RlLT5pX2Jsb2NrcyAmIDEpIHsKKwkgICAgaW5vZGUtPmlfYmxvY2tzKysgOworCX0KKwlpbm9kZV9zZXRfYnl0ZXMoaW5vZGUsIHRvX3JlYWxfdXNlZF9zcGFjZShpbm9kZSwgaW5vZGUtPmlfYmxvY2tzLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEX1YxX1NJWkUpKTsKKwkvKiBub3BhY2sgaXMgaW5pdGlhbGx5IHplcm8gZm9yIHYxIG9iamVjdHMuIEZvciB2MiBvYmplY3RzLAorCSAgIG5vcGFjayBpcyBpbml0aWFsaXNlZCBmcm9tIHNkX2F0dHJzICovCisJUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJj0gfmlfbm9wYWNrX21hc2s7CisgICAgfSBlbHNlIHsKKwkvLyBuZXcgc3RhdCBkYXRhIGZvdW5kLCBidXQgb2JqZWN0IG1heSBoYXZlIG9sZCBpdGVtcworCS8vIChkaXJlY3RvcmllcyBhbmQgc3ltbGlua3MpCisJc3RydWN0IHN0YXRfZGF0YSAqIHNkID0gKHN0cnVjdCBzdGF0X2RhdGEgKilCX0lfUElURU0gKGJoLCBpaCk7CisKKwlpbm9kZS0+aV9tb2RlICAgPSBzZF92Ml9tb2RlKHNkKTsKKwlpbm9kZS0+aV9ubGluayAgPSBzZF92Ml9ubGluayhzZCk7CisJaW5vZGUtPmlfdWlkICAgID0gc2RfdjJfdWlkKHNkKTsKKwlpbm9kZS0+aV9zaXplICAgPSBzZF92Ml9zaXplKHNkKTsKKwlpbm9kZS0+aV9naWQgICAgPSBzZF92Ml9naWQoc2QpOworCWlub2RlLT5pX210aW1lLnR2X3NlYyAgPSBzZF92Ml9tdGltZShzZCk7CisJaW5vZGUtPmlfYXRpbWUudHZfc2VjID0gc2RfdjJfYXRpbWUoc2QpOworCWlub2RlLT5pX2N0aW1lLnR2X3NlYyAgPSBzZF92Ml9jdGltZShzZCk7CisJaW5vZGUtPmlfY3RpbWUudHZfbnNlYyA9IDA7CisJaW5vZGUtPmlfbXRpbWUudHZfbnNlYyA9IDA7CisJaW5vZGUtPmlfYXRpbWUudHZfbnNlYyA9IDA7CisJaW5vZGUtPmlfYmxvY2tzID0gc2RfdjJfYmxvY2tzKHNkKTsKKyAgICAgICAgcmRldiAgICAgICAgICAgID0gc2RfdjJfcmRldihzZCk7CisJaWYoIFNfSVNDSFIoIGlub2RlIC0+IGlfbW9kZSApIHx8IFNfSVNCTEsoIGlub2RlIC0+IGlfbW9kZSApICkKKwkgICAgaW5vZGUtPmlfZ2VuZXJhdGlvbiA9IGxlMzJfdG9fY3B1IChJTk9ERV9QS0VZIChpbm9kZSktPmtfZGlyX2lkKTsKKwllbHNlCisgICAgICAgICAgICBpbm9kZS0+aV9nZW5lcmF0aW9uID0gc2RfdjJfZ2VuZXJhdGlvbihzZCk7CisKKwlpZiAoU19JU0RJUiAoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0xOSyAoaW5vZGUtPmlfbW9kZSkpCisJICAgIHNldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uIChpbm9kZSwgS0VZX0ZPUk1BVF8zXzUpOworCWVsc2UKKwkgICAgc2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24gKGlub2RlLCBLRVlfRk9STUFUXzNfNik7CisJUkVJU0VSRlNfSShpbm9kZSktPmlfZmlyc3RfZGlyZWN0X2J5dGUgPSAwOworCXNldF9pbm9kZV9zZF92ZXJzaW9uIChpbm9kZSwgU1RBVF9EQVRBX1YyKTsKKwlpbm9kZV9zZXRfYnl0ZXMoaW5vZGUsIHRvX3JlYWxfdXNlZF9zcGFjZShpbm9kZSwgaW5vZGUtPmlfYmxvY2tzLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEX1YyX1NJWkUpKTsKKwkvKiByZWFkIHBlcnNpc3RlbnQgaW5vZGUgYXR0cmlidXRlcyBmcm9tIHNkIGFuZCBpbml0YWxpc2UKKwkgICBnZW5lcmljIGlub2RlIGZsYWdzIGZyb20gdGhlbSAqLworCVJFSVNFUkZTX0koaW5vZGUpLT5pX2F0dHJzID0gc2RfdjJfYXR0cnMoIHNkICk7CisJc2RfYXR0cnNfdG9faV9hdHRycyggc2RfdjJfYXR0cnMoIHNkICksIGlub2RlICk7CisgICAgfQorCisgICAgcGF0aHJlbHNlIChwYXRoKTsKKyAgICBpZiAoU19JU1JFRyAoaW5vZGUtPmlfbW9kZSkpIHsKKwlpbm9kZS0+aV9vcCA9ICZyZWlzZXJmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfZm9wID0gJnJlaXNlcmZzX2ZpbGVfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZyZWlzZXJmc19hZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgOworICAgIH0gZWxzZSBpZiAoU19JU0RJUiAoaW5vZGUtPmlfbW9kZSkpIHsKKwlpbm9kZS0+aV9vcCA9ICZyZWlzZXJmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9mb3AgPSAmcmVpc2VyZnNfZGlyX29wZXJhdGlvbnM7CisgICAgfSBlbHNlIGlmIChTX0lTTE5LIChpbm9kZS0+aV9tb2RlKSkgeworCWlub2RlLT5pX29wID0gJnJlaXNlcmZzX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZyZWlzZXJmc19hZGRyZXNzX3NwYWNlX29wZXJhdGlvbnM7CisgICAgfSBlbHNlIHsKKwlpbm9kZS0+aV9ibG9ja3MgPSAwOworCWlub2RlLT5pX29wID0gJnJlaXNlcmZzX3NwZWNpYWxfaW5vZGVfb3BlcmF0aW9uczsKKwlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsIG5ld19kZWNvZGVfZGV2KHJkZXYpKTsKKyAgICB9Cit9CisKKworLy8gdXBkYXRlIG5ldyBzdGF0IGRhdGEgd2l0aCBpbm9kZSBmaWVsZHMKK3N0YXRpYyB2b2lkIGlub2RlMnNkICh2b2lkICogc2QsIHN0cnVjdCBpbm9kZSAqIGlub2RlLCBsb2ZmX3Qgc2l6ZSkKK3sKKyAgICBzdHJ1Y3Qgc3RhdF9kYXRhICogc2RfdjIgPSAoc3RydWN0IHN0YXRfZGF0YSAqKXNkOworICAgIF9fdTE2IGZsYWdzOworCisgICAgc2V0X3NkX3YyX21vZGUoc2RfdjIsIGlub2RlLT5pX21vZGUgKTsKKyAgICBzZXRfc2RfdjJfbmxpbmsoc2RfdjIsIGlub2RlLT5pX25saW5rICk7CisgICAgc2V0X3NkX3YyX3VpZChzZF92MiwgaW5vZGUtPmlfdWlkICk7CisgICAgc2V0X3NkX3YyX3NpemUoc2RfdjIsIHNpemUgKTsKKyAgICBzZXRfc2RfdjJfZ2lkKHNkX3YyLCBpbm9kZS0+aV9naWQgKTsKKyAgICBzZXRfc2RfdjJfbXRpbWUoc2RfdjIsIGlub2RlLT5pX210aW1lLnR2X3NlYyApOworICAgIHNldF9zZF92Ml9hdGltZShzZF92MiwgaW5vZGUtPmlfYXRpbWUudHZfc2VjICk7CisgICAgc2V0X3NkX3YyX2N0aW1lKHNkX3YyLCBpbm9kZS0+aV9jdGltZS50dl9zZWMgKTsKKyAgICBzZXRfc2RfdjJfYmxvY2tzKHNkX3YyLCB0b19mYWtlX3VzZWRfYmxvY2tzKGlub2RlLCBTRF9WMl9TSVpFKSk7CisgICAgaWYgKFNfSVNDSFIoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkKKwlzZXRfc2RfdjJfcmRldihzZF92MiwgbmV3X2VuY29kZV9kZXYoaW5vZGUtPmlfcmRldikpOworICAgIGVsc2UKKwlzZXRfc2RfdjJfZ2VuZXJhdGlvbihzZF92MiwgaW5vZGUtPmlfZ2VuZXJhdGlvbik7CisgICAgZmxhZ3MgPSBSRUlTRVJGU19JKGlub2RlKS0+aV9hdHRyczsKKyAgICBpX2F0dHJzX3RvX3NkX2F0dHJzKCBpbm9kZSwgJmZsYWdzICk7CisgICAgc2V0X3NkX3YyX2F0dHJzKCBzZF92MiwgZmxhZ3MgKTsKK30KKworCisvLyB1c2VkIHRvIGNvcHkgaW5vZGUncyBmaWVsZHMgdG8gb2xkIHN0YXQgZGF0YQorc3RhdGljIHZvaWQgaW5vZGUyc2RfdjEgKHZvaWQgKiBzZCwgc3RydWN0IGlub2RlICogaW5vZGUsIGxvZmZfdCBzaXplKQoreworICAgIHN0cnVjdCBzdGF0X2RhdGFfdjEgKiBzZF92MSA9IChzdHJ1Y3Qgc3RhdF9kYXRhX3YxICopc2Q7CisKKyAgICBzZXRfc2RfdjFfbW9kZShzZF92MSwgaW5vZGUtPmlfbW9kZSApOworICAgIHNldF9zZF92MV91aWQoc2RfdjEsIGlub2RlLT5pX3VpZCApOworICAgIHNldF9zZF92MV9naWQoc2RfdjEsIGlub2RlLT5pX2dpZCApOworICAgIHNldF9zZF92MV9ubGluayhzZF92MSwgaW5vZGUtPmlfbmxpbmsgKTsKKyAgICBzZXRfc2RfdjFfc2l6ZShzZF92MSwgc2l6ZSApOworICAgIHNldF9zZF92MV9hdGltZShzZF92MSwgaW5vZGUtPmlfYXRpbWUudHZfc2VjICk7CisgICAgc2V0X3NkX3YxX2N0aW1lKHNkX3YxLCBpbm9kZS0+aV9jdGltZS50dl9zZWMgKTsKKyAgICBzZXRfc2RfdjFfbXRpbWUoc2RfdjEsIGlub2RlLT5pX210aW1lLnR2X3NlYyApOworCisgICAgaWYgKFNfSVNDSFIoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkKKyAgICAgICAgc2V0X3NkX3YxX3JkZXYoc2RfdjEsIG5ld19lbmNvZGVfZGV2KGlub2RlLT5pX3JkZXYpKTsKKyAgICBlbHNlCisgICAgICAgIHNldF9zZF92MV9ibG9ja3Moc2RfdjEsIHRvX2Zha2VfdXNlZF9ibG9ja3MoaW5vZGUsIFNEX1YxX1NJWkUpKTsKKworICAgIC8vIFNpZ2guIGlfZmlyc3RfZGlyZWN0X2J5dGUgaXMgYmFjaworICAgIHNldF9zZF92MV9maXJzdF9kaXJlY3RfYnl0ZShzZF92MSwgUkVJU0VSRlNfSShpbm9kZSktPmlfZmlyc3RfZGlyZWN0X2J5dGUpOworfQorCisKKy8qIE5PVEUsIHlvdSBtdXN0IHByZXBhcmUgdGhlIGJ1ZmZlciBoZWFkIGJlZm9yZSBzZW5kaW5nIGl0IGhlcmUsCisqKiBhbmQgdGhlbiBsb2cgaXQgYWZ0ZXIgdGhlIGNhbGwKKyovCitzdGF0aWMgdm9pZCB1cGRhdGVfc3RhdF9kYXRhIChzdHJ1Y3QgcGF0aCAqIHBhdGgsIHN0cnVjdCBpbm9kZSAqIGlub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9mZl90IHNpemUpCit7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisgICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOworICAKKyAgICBiaCA9IFBBVEhfUExBU1RfQlVGRkVSIChwYXRoKTsKKyAgICBpaCA9IFBBVEhfUElURU1fSEVBRCAocGF0aCk7CisKKyAgICBpZiAoIWlzX3N0YXRkYXRhX2xlX2loIChpaCkpCisJcmVpc2VyZnNfcGFuaWMgKGlub2RlLT5pX3NiLCAidnMtMTMwNjU6IHVwZGF0ZV9zdGF0X2RhdGE6IGtleSAlaywgZm91bmQgaXRlbSAlaCIsCisJCQlJTk9ERV9QS0VZIChpbm9kZSksIGloKTsKKyAgCisgICAgaWYgKHN0YXRfZGF0YV92MSAoaWgpKSB7CisJLy8gcGF0aCBwb2ludHMgdG8gb2xkIHN0YXQgZGF0YQorCWlub2RlMnNkX3YxIChCX0lfUElURU0gKGJoLCBpaCksIGlub2RlLCBzaXplKTsKKyAgICB9IGVsc2UgeworCWlub2RlMnNkIChCX0lfUElURU0gKGJoLCBpaCksIGlub2RlLCBzaXplKTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKwordm9pZCByZWlzZXJmc191cGRhdGVfc2Rfc2l6ZSAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkgICAgICBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgbG9mZl90IHNpemUpCit7CisgICAgc3RydWN0IGNwdV9rZXkga2V5OworICAgIElOSVRJQUxJWkVfUEFUSChwYXRoKTsKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoIDsKKyAgICBpbnQgZnNfZ2VuIDsKKyAgICBzdHJ1Y3QgaXRlbV9oZWFkICppaCwgdG1wX2loIDsKKyAgICBpbnQgcmV0dmFsOworCisgICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCisgICAgbWFrZV9jcHVfa2V5ICgma2V5LCBpbm9kZSwgU0RfT0ZGU0VULCBUWVBFX1NUQVRfREFUQSwgMyk7Ly9rZXkgdHlwZSBpcyB1bmltcG9ydGFudAorICAgIAorICAgIGZvcig7OykgeworCWludCBwb3M7CisJLyogbG9vayBmb3IgdGhlIG9iamVjdCdzIHN0YXQgZGF0YSAqLworCXJldHZhbCA9IHNlYXJjaF9pdGVtIChpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpOworCWlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKKwkgICAgcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICJ2cy0xMzA1MDogcmVpc2VyZnNfdXBkYXRlX3NkOiAiCisJCQkgICAgICAiaS9vIGZhaWx1cmUgb2NjdXJyZWQgdHJ5aW5nIHRvIHVwZGF0ZSAlSyBzdGF0IGRhdGEiLAorCQkJICAgICAgJmtleSk7CisJICAgIHJldHVybjsKKwl9CisJaWYgKHJldHZhbCA9PSBJVEVNX05PVF9GT1VORCkgeworCSAgICBwb3MgPSBQQVRIX0xBU1RfUE9TSVRJT04gKCZwYXRoKTsKKwkgICAgcGF0aHJlbHNlKCZwYXRoKSA7CisJICAgIGlmIChpbm9kZS0+aV9ubGluayA9PSAwKSB7CisJCS8qcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICJ2cy0xMzA1MDogcmVpc2VyZnNfdXBkYXRlX3NkOiBpX25saW5rID09IDAsIHN0YXQgZGF0YSBub3QgZm91bmQiKTsqLworCQlyZXR1cm47CisJICAgIH0KKwkgICAgcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICJ2cy0xMzA2MDogcmVpc2VyZnNfdXBkYXRlX3NkOiAiCisJCQkgICAgICAic3RhdCBkYXRhIG9mIG9iamVjdCAlayAobmxpbmsgPT0gJWQpIG5vdCBmb3VuZCAocG9zICVkKSIsCisJCQkgICAgICBJTk9ERV9QS0VZIChpbm9kZSksIGlub2RlLT5pX25saW5rLCBwb3MpOworCSAgICByZWlzZXJmc19jaGVja19wYXRoKCZwYXRoKSA7CisJICAgIHJldHVybjsKKwl9CisJCisJLyogc2lnaCwgcHJlcGFyZV9mb3Jfam91cm5hbCBtaWdodCBzY2hlZHVsZS4gIFdoZW4gaXQgc2NoZWR1bGVzIHRoZQorCSoqIEZTIG1pZ2h0IGNoYW5nZS4gIFdlIGhhdmUgdG8gZGV0ZWN0IHRoYXQsIGFuZCBsb29wIGJhY2sgdG8gdGhlCisJKiogc2VhcmNoIGlmIHRoZSBzdGF0IGRhdGEgaXRlbSBoYXMgbW92ZWQKKwkqLworCWJoID0gZ2V0X2xhc3RfYmgoJnBhdGgpIDsKKwlpaCA9IGdldF9paCgmcGF0aCkgOworCWNvcHlfaXRlbV9oZWFkICgmdG1wX2loLCBpaCk7CisJZnNfZ2VuID0gZ2V0X2dlbmVyYXRpb24gKGlub2RlLT5pX3NiKTsKKwlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKGlub2RlLT5pX3NiLCBiaCwgMSkgOworCWlmIChmc19jaGFuZ2VkIChmc19nZW4sIGlub2RlLT5pX3NiKSAmJiBpdGVtX21vdmVkKCZ0bXBfaWgsICZwYXRoKSkgeworCSAgICByZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihpbm9kZS0+aV9zYiwgYmgpIDsKKwkgICAgY29udGludWUgOwkvKiBTdGF0X2RhdGEgaXRlbSBoYXMgYmVlbiBtb3ZlZCBhZnRlciBzY2hlZHVsaW5nLiAqLworCX0KKwlicmVhazsKKyAgICB9CisgICAgdXBkYXRlX3N0YXRfZGF0YSAoJnBhdGgsIGlub2RlLCBzaXplKTsKKyAgICBqb3VybmFsX21hcmtfZGlydHkodGgsIHRoLT50X3N1cGVyLCBiaCkgOyAKKyAgICBwYXRocmVsc2UgKCZwYXRoKTsKKyAgICByZXR1cm47Cit9CisKKy8qIHJlaXNlcmZzX3JlYWRfbG9ja2VkX2lub2RlIGlzIGNhbGxlZCB0byByZWFkIHRoZSBpbm9kZSBvZmYgZGlzaywgYW5kIGl0CisqKiBkb2VzIGEgbWFrZV9iYWRfaW5vZGUgd2hlbiB0aGluZ3MgZ28gd3JvbmcuICBCdXQsIHdlIG5lZWQgdG8gbWFrZSBzdXJlCisqKiBhbmQgY2xlYXIgdGhlIGtleSBpbiB0aGUgcHJpdmF0ZSBwb3J0aW9uIG9mIHRoZSBpbm9kZSwgb3RoZXJ3aXNlIGEKKyoqIGNvcnJlc3BvbmRpbmcgaXB1dCBtaWdodCB0cnkgdG8gZGVsZXRlIHdoYXRldmVyIG9iamVjdCB0aGUgaW5vZGUgbGFzdAorKiogcmVwcmVzZW50ZWQuCisqLworc3RhdGljIHZvaWQgcmVpc2VyZnNfbWFrZV9iYWRfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkgeworICAgIG1lbXNldChJTk9ERV9QS0VZKGlub2RlKSwgMCwgS0VZX1NJWkUpOworICAgIG1ha2VfYmFkX2lub2RlKGlub2RlKTsKK30KKworLy8KKy8vIGluaXRpYWxseSB0aGlzIGZ1bmN0aW9uIHdhcyBkZXJpdmVkIGZyb20gbWluaXggb3IgZXh0MidzIGFuYWxvZyBhbmQKKy8vIGV2b2x2ZWQgYXMgdGhlIHByb3RvdHlwZSBkaWQKKy8vCisKK2ludCByZWlzZXJmc19pbml0X2xvY2tlZF9pbm9kZSAoc3RydWN0IGlub2RlICogaW5vZGUsIHZvaWQgKnApCit7CisgICAgc3RydWN0IHJlaXNlcmZzX2lnZXRfYXJncyAqYXJncyA9IChzdHJ1Y3QgcmVpc2VyZnNfaWdldF9hcmdzICopcCA7CisgICAgaW5vZGUtPmlfaW5vID0gYXJncy0+b2JqZWN0aWQ7CisgICAgSU5PREVfUEtFWShpbm9kZSktPmtfZGlyX2lkID0gY3B1X3RvX2xlMzIoYXJncy0+ZGlyaWQpOworICAgIHJldHVybiAwOworfQorCisvKiBsb29rcyBmb3Igc3RhdCBkYXRhIGluIHRoZSB0cmVlLCBhbmQgZmlsbHMgdXAgdGhlIGZpZWxkcyBvZiBpbi1jb3JlCisgICBpbm9kZSBzdGF0IGRhdGEgZmllbGRzICovCit2b2lkIHJlaXNlcmZzX3JlYWRfbG9ja2VkX2lub2RlIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IHJlaXNlcmZzX2lnZXRfYXJncyAqYXJncykKK3sKKyAgICBJTklUSUFMSVpFX1BBVEggKHBhdGhfdG9fc2QpOworICAgIHN0cnVjdCBjcHVfa2V5IGtleTsKKyAgICB1bnNpZ25lZCBsb25nIGRpcmlubzsKKyAgICBpbnQgcmV0dmFsOworCisgICAgZGlyaW5vID0gYXJncy0+ZGlyaWQgOworCisgICAgLyogc2V0IHZlcnNpb24gMSwgdmVyc2lvbiAyIGNvdWxkIGJlIHVzZWQgdG9vLCBiZWNhdXNlIHN0YXQgZGF0YQorICAgICAgIGtleSBpcyB0aGUgc2FtZSBpbiBib3RoIHZlcnNpb25zICovCisgICAga2V5LnZlcnNpb24gPSBLRVlfRk9STUFUXzNfNTsKKyAgICBrZXkub25fZGlza19rZXkua19kaXJfaWQgPSBkaXJpbm87CisgICAga2V5Lm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQgPSBpbm9kZS0+aV9pbm87CisgICAga2V5Lm9uX2Rpc2tfa2V5LnUua19vZmZzZXRfdjEua19vZmZzZXQgPSBTRF9PRkZTRVQ7CisgICAga2V5Lm9uX2Rpc2tfa2V5LnUua19vZmZzZXRfdjEua191bmlxdWVuZXNzID0gU0RfVU5JUVVFTkVTUzsKKworICAgIC8qIGxvb2sgZm9yIHRoZSBvYmplY3QncyBzdGF0IGRhdGEgKi8KKyAgICByZXR2YWwgPSBzZWFyY2hfaXRlbSAoaW5vZGUtPmlfc2IsICZrZXksICZwYXRoX3RvX3NkKTsKKyAgICBpZiAocmV0dmFsID09IElPX0VSUk9SKSB7CisJcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICJ2cy0xMzA3MDogcmVpc2VyZnNfcmVhZF9sb2NrZWRfaW5vZGU6ICIKKwkJCSAgImkvbyBmYWlsdXJlIG9jY3VycmVkIHRyeWluZyB0byBmaW5kIHN0YXQgZGF0YSBvZiAlSyIsCisJCQkgICZrZXkpOworCXJlaXNlcmZzX21ha2VfYmFkX2lub2RlKGlub2RlKSA7CisJcmV0dXJuOworICAgIH0KKyAgICBpZiAocmV0dmFsICE9IElURU1fRk9VTkQpIHsKKwkvKiBhIHN0YWxlIE5GUyBoYW5kbGUgY2FuIHRyaWdnZXIgdGhpcyB3aXRob3V0IGl0IGJlaW5nIGFuIGVycm9yICovCisJcGF0aHJlbHNlICgmcGF0aF90b19zZCk7CisJcmVpc2VyZnNfbWFrZV9iYWRfaW5vZGUoaW5vZGUpIDsKKwlpbm9kZS0+aV9ubGluayA9IDA7CisJcmV0dXJuOworICAgIH0KKworICAgIGluaXRfaW5vZGUgKGlub2RlLCAmcGF0aF90b19zZCk7CisgICAKKyAgICAvKiBJdCBpcyBwb3NzaWJsZSB0aGF0IGtuZnNkIGlzIHRyeWluZyB0byBhY2Nlc3MgaW5vZGUgb2YgYSBmaWxlCisgICAgICAgdGhhdCBpcyBiZWluZyByZW1vdmVkIGZyb20gdGhlIGRpc2sgYnkgc29tZSBvdGhlciB0aHJlYWQuIEFzIHdlCisgICAgICAgdXBkYXRlIHNkIG9uIHVubGluayBhbGwgdGhhdCBpcyByZXF1aXJlZCBpcyB0byBjaGVjayBmb3IgbmxpbmsKKyAgICAgICBoZXJlLiBUaGlzIGJ1ZyB3YXMgZmlyc3QgZm91bmQgYnkgU2l6aWYgd2hlbiBkZWJ1Z2dpbmcKKyAgICAgICBTcXVpZE5HL0J1dHRlcmZseSwgZm9yZ290dGVuLCBhbmQgZm91bmQgYWdhaW4gYWZ0ZXIgUGhpbGlwcGUKKyAgICAgICBHcmFtb3VsbGUgPHBoaWxpcHBlLmdyYW1vdWxsZUBtbWFuaWEuY29tPiByZXByb2R1Y2VkIGl0LiAKKworICAgICAgIE1vcmUgbG9naWNhbCBmaXggd291bGQgcmVxdWlyZSBjaGFuZ2VzIGluIGZzL2lub2RlLmM6aXB1dCgpIHRvCisgICAgICAgcmVtb3ZlIGlub2RlIGZyb20gaGFzaC10YWJsZSBfYWZ0ZXJfIGZzIGNsZWFuZWQgZGlzayBzdHVmZiB1cCBhbmQKKyAgICAgICBpbiBpZ2V0KCkgdG8gcmV0dXJuIE5VTEwgaWYgSV9GUkVFSU5HIGlub2RlIGlzIGZvdW5kIGluCisgICAgICAgaGFzaC10YWJsZS4gKi8KKyAgICAvKiBDdXJyZW50bHkgdGhlcmUgaXMgb25lIHBsYWNlIHdoZXJlIGl0J3Mgb2sgdG8gbWVldCBpbm9kZSB3aXRoCisgICAgICAgbmxpbms9PTA6IHByb2Nlc3Npbmcgb2Ygb3Blbi11bmxpbmtlZCBhbmQgaGFsZi10cnVuY2F0ZWQgZmlsZXMKKyAgICAgICBkdXJpbmcgbW91bnQgKGZzL3JlaXNlcmZzL3N1cGVyLmM6ZmluaXNoX3VuZmluaXNoZWQoKSkuICovCisgICAgaWYoICggaW5vZGUgLT4gaV9ubGluayA9PSAwICkgJiYgCisJISBSRUlTRVJGU19TQihpbm9kZSAtPiBpX3NiKSAtPiBzX2lzX3VubGlua2VkX29rICkgeworCSAgICByZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwKKwkJCSAgICAgICJ2cy0xMzA3NTogcmVpc2VyZnNfcmVhZF9sb2NrZWRfaW5vZGU6ICIKKwkJCSAgICAgICJkZWFkIGlub2RlIHJlYWQgZnJvbSBkaXNrICVLLiAiCisJCQkgICAgICAiVGhpcyBpcyBsaWtlbHkgdG8gYmUgcmFjZSB3aXRoIGtuZnNkLiBJZ25vcmUiLAorCQkJICAgICAgJmtleSApOworCSAgICByZWlzZXJmc19tYWtlX2JhZF9pbm9kZSggaW5vZGUgKTsKKyAgICB9CisKKyAgICByZWlzZXJmc19jaGVja19wYXRoKCZwYXRoX3RvX3NkKSA7IC8qIGluaXQgaW5vZGUgc2hvdWxkIGJlIHJlbHNpbmcgKi8KKworfQorCisvKioKKyAqIHJlaXNlcmZzX2ZpbmRfYWN0b3IoKSAtICJmaW5kIGFjdG9yIiByZWlzZXJmcyBzdXBwbGllcyB0byBpZ2V0NV9sb2NrZWQoKS4KKyAqCisgKiBAaW5vZGU6ICAgIGlub2RlIGZyb20gaGFzaCB0YWJsZSB0byBjaGVjaworICogQG9wYXF1ZTogICAiY29va2llIiBwYXNzZWQgdG8gaWdldDVfbG9ja2VkKCkuIFRoaXMgaXMgJnJlaXNlcmZzX2lnZXRfYXJncy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBpZ2V0NV9sb2NrZWQoKSB0byBkaXN0aW5ndWlzaCByZWlzZXJmcyBpbm9kZXMKKyAqIGhhdmluZyB0aGUgc2FtZSBpbm9kZSBudW1iZXJzLiBTdWNoIGlub2RlcyBjYW4gb25seSBleGlzdCBkdWUgdG8gc29tZQorICogZXJyb3IgY29uZGl0aW9uLiBPbmUgb2YgdGhlbSBzaG91bGQgYmUgYmFkLiBJbm9kZXMgd2l0aCBpZGVudGljYWwKKyAqIGlub2RlIG51bWJlcnMgKG9iamVjdGlkcykgYXJlIGRpc3Rpbmd1aXNoZWQgYnkgcGFyZW50IGRpcmVjdG9yeSBpZHMuCisgKgorICovCitpbnQgcmVpc2VyZnNfZmluZF9hY3Rvciggc3RydWN0IGlub2RlICppbm9kZSwgdm9pZCAqb3BhcXVlICkKK3sKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfaWdldF9hcmdzICphcmdzOworCisgICAgYXJncyA9IG9wYXF1ZTsKKyAgICAvKiBhcmdzIGlzIGFscmVhZHkgaW4gQ1BVIG9yZGVyICovCisgICAgcmV0dXJuIChpbm9kZS0+aV9pbm8gPT0gYXJncy0+b2JqZWN0aWQpICYmCisJKGxlMzJfdG9fY3B1KElOT0RFX1BLRVkoaW5vZGUpLT5rX2Rpcl9pZCkgPT0gYXJncy0+ZGlyaWQpOworfQorCitzdHJ1Y3QgaW5vZGUgKiByZWlzZXJmc19pZ2V0IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLCBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqIGtleSkKK3sKKyAgICBzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfaWdldF9hcmdzIGFyZ3MgOworCisgICAgYXJncy5vYmplY3RpZCA9IGtleS0+b25fZGlza19rZXkua19vYmplY3RpZCA7CisgICAgYXJncy5kaXJpZCA9IGtleS0+b25fZGlza19rZXkua19kaXJfaWQgOworICAgIGlub2RlID0gaWdldDVfbG9ja2VkIChzLCBrZXktPm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQsIAorCQkgICByZWlzZXJmc19maW5kX2FjdG9yLCByZWlzZXJmc19pbml0X2xvY2tlZF9pbm9kZSwgKHZvaWQgKikoJmFyZ3MpKTsKKyAgICBpZiAoIWlub2RlKSAKKwlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKSA7CisKKyAgICBpZiAoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykgeworCXJlaXNlcmZzX3JlYWRfbG9ja2VkX2lub2RlKGlub2RlLCAmYXJncyk7CisJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CisgICAgfQorCisgICAgaWYgKGNvbXBfc2hvcnRfa2V5cyAoSU5PREVfUEtFWSAoaW5vZGUpLCBrZXkpIHx8IGlzX2JhZF9pbm9kZSAoaW5vZGUpKSB7CisJLyogZWl0aGVyIGR1ZSB0byBpL28gZXJyb3Igb3IgYSBzdGFsZSBORlMgaGFuZGxlICovCisJaXB1dCAoaW5vZGUpOworCWlub2RlID0gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGlub2RlOworfQorCitzdHJ1Y3QgZGVudHJ5ICpyZWlzZXJmc19nZXRfZGVudHJ5KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKnZvYmpwKQoreworICAgIF9fdTMyICpkYXRhID0gdm9ianA7CisgICAgc3RydWN0IGNwdV9rZXkga2V5IDsKKyAgICBzdHJ1Y3QgZGVudHJ5ICpyZXN1bHQ7CisgICAgc3RydWN0IGlub2RlICppbm9kZTsKKyAgICAKKyAgICBrZXkub25fZGlza19rZXkua19vYmplY3RpZCA9IGRhdGFbMF0gOworICAgIGtleS5vbl9kaXNrX2tleS5rX2Rpcl9pZCA9IGRhdGFbMV0gOworICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soc2IpOworICAgIGlub2RlID0gcmVpc2VyZnNfaWdldChzYiwgJmtleSkgOworICAgIGlmIChpbm9kZSAmJiAhSVNfRVJSKGlub2RlKSAmJiBkYXRhWzJdICE9IDAgJiYKKwlkYXRhWzJdICE9IGlub2RlLT5pX2dlbmVyYXRpb24pIHsKKwkgICAgaXB1dChpbm9kZSkgOworCSAgICBpbm9kZSA9IE5VTEwgOworICAgIH0KKyAgICByZWlzZXJmc193cml0ZV91bmxvY2soc2IpOworICAgIGlmICghaW5vZGUpCisJICAgIGlub2RlID0gRVJSX1BUUigtRVNUQUxFKTsKKyAgICBpZiAoSVNfRVJSKGlub2RlKSkKKwkgICAgcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihpbm9kZSkpOworICAgIHJlc3VsdCA9IGRfYWxsb2NfYW5vbihpbm9kZSk7CisgICAgaWYgKCFyZXN1bHQpIHsKKwkgICAgaXB1dChpbm9kZSk7CisJICAgIHJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdHJ1Y3QgZGVudHJ5ICpyZWlzZXJmc19kZWNvZGVfZmgoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgX191MzIgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IGZodHlwZSwKKwkJCQkgIGludCAoKmFjY2VwdGFibGUpKHZvaWQgKmNvbnRlY3QsIHN0cnVjdCBkZW50cnkgKmRlKSwKKwkJCQkgIHZvaWQgKmNvbnRleHQpIHsKKyAgICBfX3UzMiBvYmpbM10sIHBhcmVudFszXTsKKworICAgIC8qIGZodHlwZSBoYXBwZW5zIHRvIHJlZmxlY3QgdGhlIG51bWJlciBvZiB1MzJzIGVuY29kZWQuCisgICAgICogZHVlIHRvIGEgYnVnIGluIGVhcmxpZXIgY29kZSwgZmh0eXBlIG1pZ2h0IGluZGljYXRlIHRoZXJlCisgICAgICogYXJlIG1vcmUgdTMycyB0aGVuIGFjdHVhbGx5IGZpdHRlZC4KKyAgICAgKiBzbyBpZiBmaHR5cGUgc2VlbXMgdG8gYmUgbW9yZSB0aGFuIGxlbiwgcmVkdWNlIGZodHlwZS4KKyAgICAgKiBWYWxpZCB0eXBlcyBhcmU6CisgICAgICogICAyIC0gb2JqZWN0aWQgKyBkaXJfaWQgLSBsZWdhY3kgc3VwcG9ydAorICAgICAqICAgMyAtIG9iamVjdGlkICsgZGlyX2lkICsgZ2VuZXJhdGlvbgorICAgICAqICAgNCAtIG9iamVjdGlkICsgZGlyX2lkICsgb2JqZWN0aWQgYW5kIGRpcmlkIG9mIHBhcmVudCAtIGxlZ2FjeQorICAgICAqICAgNSAtIG9iamVjdGlkICsgZGlyX2lkICsgZ2VuZXJhdGlvbiArIG9iamVjdGlkIGFuZCBkaXJpZCBvZiBwYXJlbnQKKyAgICAgKiAgIDYgLSBhcyBhYm92ZSBwbHVzIGdlbmVyYXRpb24gb2YgZGlyZWN0b3J5CisgICAgICogNiBkb2VzIG5vdCBmaXQgaW4gTkZTdjIgaGFuZGxlcworICAgICAqLworICAgIGlmIChmaHR5cGUgPiBsZW4pIHsKKwkgICAgaWYgKGZodHlwZSAhPSA2IHx8IGxlbiAhPSA1KQorCQkgICAgcmVpc2VyZnNfd2FybmluZyAoc2IsICJuZnNkL3JlaXNlcmZzLCBmaHR5cGU9JWQsIGxlbj0lZCAtIG9kZCIsCisJCQkgICBmaHR5cGUsIGxlbik7CisJICAgIGZodHlwZSA9IDU7CisgICAgfQorCisgICAgb2JqWzBdID0gZGF0YVswXTsKKyAgICBvYmpbMV0gPSBkYXRhWzFdOworICAgIGlmIChmaHR5cGUgPT0gMyB8fCBmaHR5cGUgPj0gNSkKKwkgICAgb2JqWzJdID0gZGF0YVsyXTsKKyAgICBlbHNlICAgIG9ialsyXSA9IDA7IC8qIGdlbmVyYXRpb24gbnVtYmVyICovCisKKyAgICBpZiAoZmh0eXBlID49IDQpIHsKKwkgICAgcGFyZW50WzBdID0gZGF0YVtmaHR5cGU+PTU/MzoyXSA7CisJICAgIHBhcmVudFsxXSA9IGRhdGFbZmh0eXBlPj01PzQ6M10gOworCSAgICBpZiAoZmh0eXBlID09IDYpCisJCSAgICBwYXJlbnRbMl0gPSBkYXRhWzVdOworCSAgICBlbHNlICAgIHBhcmVudFsyXSA9IDA7CisgICAgfQorICAgIHJldHVybiBzYi0+c19leHBvcnRfb3AtPmZpbmRfZXhwb3J0ZWRfZGVudHJ5KHNiLCBvYmosIGZodHlwZSA8IDQgPyBOVUxMIDogcGFyZW50LAorCQkJICAgICAgIGFjY2VwdGFibGUsIGNvbnRleHQpOworfQorCitpbnQgcmVpc2VyZnNfZW5jb2RlX2ZoKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgX191MzIgKmRhdGEsIGludCAqbGVucCwgaW50IG5lZWRfcGFyZW50KSB7CisgICAgc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZSA7CisgICAgaW50IG1heGxlbiA9ICpsZW5wOworICAgIAorICAgIGlmIChtYXhsZW4gPCAzKQorICAgICAgICByZXR1cm4gMjU1IDsKKworICAgIGRhdGFbMF0gPSBpbm9kZS0+aV9pbm8gOworICAgIGRhdGFbMV0gPSBsZTMyX3RvX2NwdShJTk9ERV9QS0VZIChpbm9kZSktPmtfZGlyX2lkKSA7CisgICAgZGF0YVsyXSA9IGlub2RlLT5pX2dlbmVyYXRpb24gOworICAgICpsZW5wID0gMyA7CisgICAgLyogbm8gcm9vbSBmb3IgZGlyZWN0b3J5IGluZm8/IHJldHVybiB3aGF0IHdlJ3ZlIHN0b3JlZCBzbyBmYXIgKi8KKyAgICBpZiAobWF4bGVuIDwgNSB8fCAhIG5lZWRfcGFyZW50KQorICAgICAgICByZXR1cm4gMyA7CisKKyAgICBzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKyAgICBpbm9kZSA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGUgOworICAgIGRhdGFbM10gPSBpbm9kZS0+aV9pbm8gOworICAgIGRhdGFbNF0gPSBsZTMyX3RvX2NwdShJTk9ERV9QS0VZIChpbm9kZSktPmtfZGlyX2lkKSA7CisgICAgKmxlbnAgPSA1IDsKKyAgICBpZiAobWF4bGVuID49IDYpIHsKKwkgICAgZGF0YVs1XSA9IGlub2RlLT5pX2dlbmVyYXRpb24gOworCSAgICAqbGVucCA9IDYgOworICAgIH0KKyAgICBzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworICAgIHJldHVybiAqbGVucCA7Cit9CisKKworLyogbG9va3MgZm9yIHN0YXQgZGF0YSwgdGhlbiBjb3BpZXMgZmllbGRzIHRvIGl0LCBtYXJrcyB0aGUgYnVmZmVyCisgICBjb250YWluaW5nIHN0YXQgZGF0YSBhcyBkaXJ0eSAqLworLyogcmVpc2VyZnMgaW5vZGVzIGFyZSBuZXZlciByZWFsbHkgZGlydHksIHNpbmNlIHRoZSBkaXJ0eSBpbm9kZSBjYWxsCisqKiBhbHdheXMgbG9ncyB0aGVtLiAgVGhpcyBjYWxsIGFsbG93cyB0aGUgVkZTIGlub2RlIG1hcmtpbmcgcm91dGluZXMKKyoqIHRvIHByb3Blcmx5IG1hcmsgaW5vZGVzIGZvciBkYXRhc3luYyBhbmQgc3VjaCwgYnV0IG9ubHkgYWN0dWFsbHkKKyoqIGRvZXMgc29tZXRoaW5nIHdoZW4gY2FsbGVkIGZvciBhIHN5bmNocm9ub3VzIHVwZGF0ZS4KKyovCitpbnQgcmVpc2VyZnNfd3JpdGVfaW5vZGUgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBpbnQgZG9fc3luYykgeworICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGggOworICAgIGludCBqYmVnaW5fY291bnQgPSAxIDsKKworICAgIGlmIChpbm9kZS0+aV9zYi0+c19mbGFncyAmIE1TX1JET05MWSkKKyAgICAgICAgcmV0dXJuIC1FUk9GUzsKKyAgICAvKiBtZW1vcnkgcHJlc3N1cmUgY2FuIHNvbWV0aW1lcyBpbml0aWF0ZSB3cml0ZV9pbm9kZSBjYWxscyB3aXRoIHN5bmMgPT0gMSwKKyAgICAqKiB0aGVzZSBjYXNlcyBhcmUganVzdCB3aGVuIHRoZSBzeXN0ZW0gbmVlZHMgcmFtLCBub3Qgd2hlbiB0aGUgCisgICAgKiogaW5vZGUgbmVlZHMgdG8gcmVhY2ggZGlzayBmb3Igc2FmZXR5LCBhbmQgdGhleSBjYW4gc2FmZWx5IGJlCisgICAgKiogaWdub3JlZCBiZWNhdXNlIHRoZSBhbHRlcmVkIGlub2RlIGhhcyBhbHJlYWR5IGJlZW4gbG9nZ2VkLgorICAgICovCisgICAgaWYgKGRvX3N5bmMgJiYgIShjdXJyZW50LT5mbGFncyAmIFBGX01FTUFMTE9DKSkgeworCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCWlmICgham91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLCBqYmVnaW5fY291bnQpKSB7CisgICAgICAgICAgICByZWlzZXJmc191cGRhdGVfc2QgKCZ0aCwgaW5vZGUpOworICAgICAgICAgICAgam91cm5hbF9lbmRfc3luYygmdGgsIGlub2RlLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKKyAgICAgICAgfQorCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiBzdGF0IGRhdGEgb2YgbmV3IG9iamVjdCBpcyBpbnNlcnRlZCBhbHJlYWR5LCB0aGlzIGluc2VydHMgdGhlIGl0ZW0KKyAgIGNvbnRhaW5pbmcgIi4iIGFuZCAiLi4iIGVudHJpZXMgKi8KK3N0YXRpYyBpbnQgcmVpc2VyZnNfbmV3X2RpcmVjdG9yeSAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIAorCQkJCSAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICAgc3RydWN0IGl0ZW1faGVhZCAqIGloLCBzdHJ1Y3QgcGF0aCAqIHBhdGgsCisJCQkJICAgc3RydWN0IGlub2RlICogZGlyKQoreworICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiID0gdGgtPnRfc3VwZXI7CisgICAgY2hhciBlbXB0eV9kaXIgW0VNUFRZX0RJUl9TSVpFXTsKKyAgICBjaGFyICogYm9keSA9IGVtcHR5X2RpcjsKKyAgICBzdHJ1Y3QgY3B1X2tleSBrZXk7CisgICAgaW50IHJldHZhbDsKKworICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKyAgICAKKyAgICBfbWFrZV9jcHVfa2V5ICgma2V5LCBLRVlfRk9STUFUXzNfNSwgbGUzMl90b19jcHUgKGloLT5paF9rZXkua19kaXJfaWQpLAorCQkgICBsZTMyX3RvX2NwdSAoaWgtPmloX2tleS5rX29iamVjdGlkKSwgRE9UX09GRlNFVCwgVFlQRV9ESVJFTlRSWSwgMy8qa2V5IGxlbmd0aCovKTsKKyAgICAKKyAgICAvKiBjb21wb3NlIGl0ZW0gaGVhZCBmb3IgbmV3IGl0ZW0uIERpcmVjdG9yaWVzIGNvbnNpc3Qgb2YgaXRlbXMgb2YKKyAgICAgICBvbGQgdHlwZSAoSVRFTV9WRVJTSU9OXzEpLiBEbyBub3Qgc2V0IGtleSAoc2Vjb25kIGFyZyBpcyAwKSwgaXQKKyAgICAgICBpcyBkb25lIGJ5IHJlaXNlcmZzX25ld19pbm9kZSAqLworICAgIGlmIChvbGRfZm9ybWF0X29ubHkgKHNiKSkgeworCW1ha2VfbGVfaXRlbV9oZWFkIChpaCwgTlVMTCwgS0VZX0ZPUk1BVF8zXzUsIERPVF9PRkZTRVQsIFRZUEVfRElSRU5UUlksIEVNUFRZX0RJUl9TSVpFX1YxLCAyKTsKKwkKKwltYWtlX2VtcHR5X2Rpcl9pdGVtX3YxIChib2R5LCBpaC0+aWhfa2V5LmtfZGlyX2lkLCBpaC0+aWhfa2V5Lmtfb2JqZWN0aWQsCisJCQkJSU5PREVfUEtFWSAoZGlyKS0+a19kaXJfaWQsIAorCQkJCUlOT0RFX1BLRVkgKGRpciktPmtfb2JqZWN0aWQgKTsKKyAgICB9IGVsc2UgeworCW1ha2VfbGVfaXRlbV9oZWFkIChpaCwgTlVMTCwgS0VZX0ZPUk1BVF8zXzUsIERPVF9PRkZTRVQsIFRZUEVfRElSRU5UUlksIEVNUFRZX0RJUl9TSVpFLCAyKTsKKwkKKwltYWtlX2VtcHR5X2Rpcl9pdGVtIChib2R5LCBpaC0+aWhfa2V5LmtfZGlyX2lkLCBpaC0+aWhfa2V5Lmtfb2JqZWN0aWQsCisJCSAgIAkJSU5PREVfUEtFWSAoZGlyKS0+a19kaXJfaWQsIAorCQkgICAJCUlOT0RFX1BLRVkgKGRpciktPmtfb2JqZWN0aWQgKTsKKyAgICB9CisgICAgCisgICAgLyogbG9vayBmb3IgcGxhY2UgaW4gdGhlIHRyZWUgZm9yIG5ldyBpdGVtICovCisgICAgcmV0dmFsID0gc2VhcmNoX2l0ZW0gKHNiLCAma2V5LCBwYXRoKTsKKyAgICBpZiAocmV0dmFsID09IElPX0VSUk9SKSB7CisJcmVpc2VyZnNfd2FybmluZyAoc2IsICJ2cy0xMzA4MDogcmVpc2VyZnNfbmV3X2RpcmVjdG9yeTogIgorCQkJICAiaS9vIGZhaWx1cmUgb2NjdXJyZWQgY3JlYXRpbmcgbmV3IGRpcmVjdG9yeSIpOworCXJldHVybiAtRUlPOworICAgIH0KKyAgICBpZiAocmV0dmFsID09IElURU1fRk9VTkQpIHsKKwlwYXRocmVsc2UgKHBhdGgpOworCXJlaXNlcmZzX3dhcm5pbmcgKHNiLCAidnMtMTMwNzA6IHJlaXNlcmZzX25ld19kaXJlY3Rvcnk6ICIKKwkJCSAgIm9iamVjdCB3aXRoIHRoaXMga2V5IGV4aXN0cyAoJWspIiwgJihpaC0+aWhfa2V5KSk7CisJcmV0dXJuIC1FRVhJU1Q7CisgICAgfQorCisgICAgLyogaW5zZXJ0IGl0ZW0sIHRoYXQgaXMgZW1wdHkgZGlyZWN0b3J5IGl0ZW0gKi8KKyAgICByZXR1cm4gcmVpc2VyZnNfaW5zZXJ0X2l0ZW0gKHRoLCBwYXRoLCAma2V5LCBpaCwgaW5vZGUsIGJvZHkpOworfQorCisKKy8qIHN0YXQgZGF0YSBvZiBvYmplY3QgaGFzIGJlZW4gaW5zZXJ0ZWQsIHRoaXMgaW5zZXJ0cyB0aGUgaXRlbQorICAgY29udGFpbmluZyB0aGUgYm9keSBvZiBzeW1saW5rICovCitzdGF0aWMgaW50IHJlaXNlcmZzX25ld19zeW1saW5rIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgCisJCQkJIHN0cnVjdCBpbm9kZSAqaW5vZGUsCS8qIElub2RlIG9mIHN5bWxpbmsgKi8KKwkJCQkgc3RydWN0IGl0ZW1faGVhZCAqIGloLAorCQkJCSBzdHJ1Y3QgcGF0aCAqIHBhdGgsIGNvbnN0IGNoYXIgKiBzeW1uYW1lLCBpbnQgaXRlbV9sZW4pCit7CisgICAgc3RydWN0IHN1cGVyX2Jsb2NrICogc2IgPSB0aC0+dF9zdXBlcjsKKyAgICBzdHJ1Y3QgY3B1X2tleSBrZXk7CisgICAgaW50IHJldHZhbDsKKworICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKworICAgIF9tYWtlX2NwdV9rZXkgKCZrZXksIEtFWV9GT1JNQVRfM181LCAKKwkJICAgbGUzMl90b19jcHUgKGloLT5paF9rZXkua19kaXJfaWQpLCAKKwkJICAgbGUzMl90b19jcHUgKGloLT5paF9rZXkua19vYmplY3RpZCksCisJCSAgIDEsIFRZUEVfRElSRUNULCAzLyprZXkgbGVuZ3RoKi8pOworCisgICAgbWFrZV9sZV9pdGVtX2hlYWQgKGloLCBOVUxMLCBLRVlfRk9STUFUXzNfNSwgMSwgVFlQRV9ESVJFQ1QsIGl0ZW1fbGVuLCAwLypmcmVlX3NwYWNlKi8pOworCisgICAgLyogbG9vayBmb3IgcGxhY2UgaW4gdGhlIHRyZWUgZm9yIG5ldyBpdGVtICovCisgICAgcmV0dmFsID0gc2VhcmNoX2l0ZW0gKHNiLCAma2V5LCBwYXRoKTsKKyAgICBpZiAocmV0dmFsID09IElPX0VSUk9SKSB7CisJcmVpc2VyZnNfd2FybmluZyAoc2IsICJ2cy0xMzA4MDogcmVpc2VyZnNfbmV3X3N5bWxpbmlrOiAiCisJCQkgICJpL28gZmFpbHVyZSBvY2N1cnJlZCBjcmVhdGluZyBuZXcgc3ltbGluayIpOworCXJldHVybiAtRUlPOworICAgIH0KKyAgICBpZiAocmV0dmFsID09IElURU1fRk9VTkQpIHsKKwlwYXRocmVsc2UgKHBhdGgpOworCXJlaXNlcmZzX3dhcm5pbmcgKHNiLCAidnMtMTMwODA6IHJlaXNlcmZzX25ld19zeW1saW5rOiAiCisJCQkgICJvYmplY3Qgd2l0aCB0aGlzIGtleSBleGlzdHMgKCVrKSIsICYoaWgtPmloX2tleSkpOworCXJldHVybiAtRUVYSVNUOworICAgIH0KKworICAgIC8qIGluc2VydCBpdGVtLCB0aGF0IGlzIGJvZHkgb2Ygc3ltbGluayAqLworICAgIHJldHVybiByZWlzZXJmc19pbnNlcnRfaXRlbSAodGgsIHBhdGgsICZrZXksIGloLCBpbm9kZSwgc3ltbmFtZSk7Cit9CisKKworLyogaW5zZXJ0cyB0aGUgc3RhdCBkYXRhIGludG8gdGhlIHRyZWUsIGFuZCB0aGVuIGNhbGxzCisgICByZWlzZXJmc19uZXdfZGlyZWN0b3J5ICh0byBpbnNlcnQgIi4iLCAiLi4iIGl0ZW0gaWYgbmV3IG9iamVjdCBpcworICAgZGlyZWN0b3J5KSBvciByZWlzZXJmc19uZXdfc3ltbGluayAodG8gaW5zZXJ0IHN5bWxpbmsgYm9keSBpZiBuZXcKKyAgIG9iamVjdCBpcyBzeW1saW5rKSBvciBub3RoaW5nIChpZiBuZXcgb2JqZWN0IGlzIHJlZ3VsYXIgZmlsZSkgCisKKyAgIE5PVEUhIHVpZCBhbmQgZ2lkIG11c3QgYWxyZWFkeSBiZSBzZXQgaW4gdGhlIGlub2RlLiAgSWYgd2UgcmV0dXJuCisgICBub24temVybyBkdWUgdG8gYW4gZXJyb3IsIHdlIGhhdmUgdG8gZHJvcCB0aGUgcXVvdGEgcHJldmlvdXNseSBhbGxvY2F0ZWQKKyAgIGZvciB0aGUgZnJlc2ggaW5vZGUuICBUaGlzIGNhbiBvbmx5IGJlIGRvbmUgb3V0c2lkZSBhIHRyYW5zYWN0aW9uLCBzbworICAgaWYgd2UgcmV0dXJuIG5vbi16ZXJvLCB3ZSBhbHNvIGVuZCB0aGUgdHJhbnNhY3Rpb24uICAqLworaW50IHJlaXNlcmZzX25ld19pbm9kZSAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQlzdHJ1Y3QgaW5vZGUgKiBkaXIsIGludCBtb2RlLCAKKwkJCWNvbnN0IGNoYXIgKiBzeW1uYW1lLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDAgZm9yIHJlZ3VsYXIsIEVNVFJZX0RJUl9TSVpFIGZvciBkaXJzLCAKKwkJCSAgIHN0cmxlbiAoc3ltbmFtZSkgZm9yIHN5bWxpbmtzKSovCisJCSAgICAgICAgIGxvZmZfdCBpX3NpemUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgCisJCQkgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKyAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKKyAgICBJTklUSUFMSVpFX1BBVEggKHBhdGhfdG9fa2V5KTsKKyAgICBzdHJ1Y3QgY3B1X2tleSBrZXk7CisgICAgc3RydWN0IGl0ZW1faGVhZCBpaDsKKyAgICBzdHJ1Y3Qgc3RhdF9kYXRhIHNkOworICAgIGludCByZXR2YWw7CisgICAgaW50IGVycjsKKworICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKyAgCisgICAgaWYgKERRVU9UX0FMTE9DX0lOT0RFKGlub2RlKSkgeworCWVyciA9IC1FRFFVT1Q7CisJZ290byBvdXRfZW5kX3RyYW5zOworICAgIH0KKyAgICBpZiAoIWRpciB8fCAhZGlyLT5pX25saW5rKSB7CisJZXJyID0gLUVQRVJNOworCWdvdG8gb3V0X2JhZF9pbm9kZTsKKyAgICB9CisKKyAgICBzYiA9IGRpci0+aV9zYjsKKworICAgIC8qIGl0ZW0gaGVhZCBvZiBuZXcgaXRlbSAqLworICAgIGloLmloX2tleS5rX2Rpcl9pZCA9IHJlaXNlcmZzX2Nob29zZV9wYWNraW5nKGRpcik7CisgICAgaWguaWhfa2V5Lmtfb2JqZWN0aWQgPSBjcHVfdG9fbGUzMiAocmVpc2VyZnNfZ2V0X3VudXNlZF9vYmplY3RpZCAodGgpKTsKKyAgICBpZiAoIWloLmloX2tleS5rX29iamVjdGlkKSB7CisJZXJyID0gLUVOT01FTTsKKwlnb3RvIG91dF9iYWRfaW5vZGUgOworICAgIH0KKyAgICBpZiAob2xkX2Zvcm1hdF9vbmx5IChzYikpCisJLyogbm90IGEgcGVyZmVjdCBnZW5lcmF0aW9uIGNvdW50LCBhcyBvYmplY3QgaWRzIGNhbiBiZSByZXVzZWQsIGJ1dCAKKwkqKiB0aGlzIGlzIGFzIGdvb2QgYXMgcmVpc2VyZnMgY2FuIGRvIHJpZ2h0IG5vdy4KKwkqKiBub3RlIHRoYXQgdGhlIHByaXZhdGUgcGFydCBvZiBpbm9kZSBpc24ndCBmaWxsZWQgaW4geWV0LCB3ZSBoYXZlCisJKiogdG8gdXNlIHRoZSBkaXJlY3RvcnkuCisJKi8KKwlpbm9kZS0+aV9nZW5lcmF0aW9uID0gbGUzMl90b19jcHUgKElOT0RFX1BLRVkgKGRpciktPmtfb2JqZWN0aWQpOworICAgIGVsc2UKKyNpZiBkZWZpbmVkKCBVU0VfSU5PREVfR0VORVJBVElPTl9DT1VOVEVSICkKKwlpbm9kZS0+aV9nZW5lcmF0aW9uID0gbGUzMl90b19jcHUoUkVJU0VSRlNfU0Ioc2IpLT5zX3JzLT5zX2lub2RlX2dlbmVyYXRpb24pOworI2Vsc2UKKwlpbm9kZS0+aV9nZW5lcmF0aW9uID0gKytldmVudDsKKyNlbmRpZgorCisgICAgLyogZmlsbCBzdGF0IGRhdGEgKi8KKyAgICBpbm9kZS0+aV9ubGluayA9IChTX0lTRElSIChtb2RlKSA/IDIgOiAxKTsKKworICAgIC8qIHVpZCBhbmQgZ2lkIG11c3QgYWxyZWFkeSBiZSBzZXQgYnkgdGhlIGNhbGxlciBmb3IgcXVvdGEgaW5pdCAqLworCisgICAgLyogc3ltbGluayBjYW5ub3QgYmUgaW1tdXRhYmxlIG9yIGFwcGVuZCBvbmx5LCByaWdodD8gKi8KKyAgICBpZiggU19JU0xOSyggaW5vZGUgLT4gaV9tb2RlICkgKQorCSAgICBpbm9kZSAtPiBpX2ZsYWdzICY9IH4gKCBTX0lNTVVUQUJMRSB8IFNfQVBQRU5EICk7CisKKyAgICBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfY3RpbWUgPQorCSAgICBDVVJSRU5UX1RJTUVfU0VDOworICAgIGlub2RlLT5pX3NpemUgPSBpX3NpemU7CisgICAgaW5vZGUtPmlfYmxvY2tzID0gMDsKKyAgICBpbm9kZS0+aV9ieXRlcyA9IDA7CisgICAgUkVJU0VSRlNfSShpbm9kZSktPmlfZmlyc3RfZGlyZWN0X2J5dGUgPSBTX0lTTE5LKG1vZGUpID8gMSA6IAorICAgICAgVTMyX01BWC8qTk9fQllURVNfSU5fRElSRUNUX0lURU0qLzsKKworICAgIElOSVRfTElTVF9IRUFEKCYoUkVJU0VSRlNfSShpbm9kZSktPmlfcHJlYWxsb2NfbGlzdCApKTsKKyAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyA9IDA7CisgICAgUkVJU0VSRlNfSShpbm9kZSktPmlfcHJlYWxsb2NfYmxvY2sgPSAwOworICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX3ByZWFsbG9jX2NvdW50ID0gMDsKKyAgICBSRUlTRVJGU19JKGlub2RlKS0+aV90cmFuc19pZCA9IDA7CisgICAgUkVJU0VSRlNfSShpbm9kZSktPmlfamwgPSBOVUxMOworICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2F0dHJzID0KKwlSRUlTRVJGU19JKGRpciktPmlfYXR0cnMgJiBSRUlTRVJGU19JTkhFUklUX01BU0s7CisgICAgc2RfYXR0cnNfdG9faV9hdHRycyggUkVJU0VSRlNfSShpbm9kZSkgLT4gaV9hdHRycywgaW5vZGUgKTsKKyAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9hY2xfYWNjZXNzID0gTlVMTDsKKyAgICBSRUlTRVJGU19JKGlub2RlKS0+aV9hY2xfZGVmYXVsdCA9IE5VTEw7CisgICAgaW5pdF9yd3NlbSAoJlJFSVNFUkZTX0koaW5vZGUpLT54YXR0cl9zZW0pOworCisgICAgaWYgKG9sZF9mb3JtYXRfb25seSAoc2IpKQorCW1ha2VfbGVfaXRlbV9oZWFkICgmaWgsIE5VTEwsIEtFWV9GT1JNQVRfM181LCBTRF9PRkZTRVQsIFRZUEVfU1RBVF9EQVRBLCBTRF9WMV9TSVpFLCBNQVhfVVNfSU5UKTsKKyAgICBlbHNlCisJbWFrZV9sZV9pdGVtX2hlYWQgKCZpaCwgTlVMTCwgS0VZX0ZPUk1BVF8zXzYsIFNEX09GRlNFVCwgVFlQRV9TVEFUX0RBVEEsIFNEX1NJWkUsIE1BWF9VU19JTlQpOworCisgICAgLyoga2V5IHRvIHNlYXJjaCBmb3IgY29ycmVjdCBwbGFjZSBmb3IgbmV3IHN0YXQgZGF0YSAqLworICAgIF9tYWtlX2NwdV9rZXkgKCZrZXksIEtFWV9GT1JNQVRfM182LCBsZTMyX3RvX2NwdSAoaWguaWhfa2V5LmtfZGlyX2lkKSwKKwkJICAgbGUzMl90b19jcHUgKGloLmloX2tleS5rX29iamVjdGlkKSwgU0RfT0ZGU0VULCBUWVBFX1NUQVRfREFUQSwgMy8qa2V5IGxlbmd0aCovKTsKKworICAgIC8qIGZpbmQgcHJvcGVyIHBsYWNlIGZvciBpbnNlcnRpbmcgb2Ygc3RhdCBkYXRhICovCisgICAgcmV0dmFsID0gc2VhcmNoX2l0ZW0gKHNiLCAma2V5LCAmcGF0aF90b19rZXkpOworICAgIGlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKKwllcnIgPSAtRUlPOworCWdvdG8gb3V0X2JhZF9pbm9kZTsKKyAgICB9CisgICAgaWYgKHJldHZhbCA9PSBJVEVNX0ZPVU5EKSB7CisJcGF0aHJlbHNlICgmcGF0aF90b19rZXkpOworCWVyciA9IC1FRVhJU1Q7CisJZ290byBvdXRfYmFkX2lub2RlOworICAgIH0KKyAgICBpZiAob2xkX2Zvcm1hdF9vbmx5IChzYikpIHsKKwlpZiAoaW5vZGUtPmlfdWlkICYgfjB4ZmZmZiB8fCBpbm9kZS0+aV9naWQgJiB+MHhmZmZmKSB7CisJICAgIHBhdGhyZWxzZSAoJnBhdGhfdG9fa2V5KTsKKwkgICAgLyogaV91aWQgb3IgaV9naWQgaXMgdG9vIGJpZyB0byBiZSBzdG9yZWQgaW4gc3RhdCBkYXRhIHYzLjUgKi8KKwkgICAgZXJyID0gLUVJTlZBTDsKKwkgICAgZ290byBvdXRfYmFkX2lub2RlOworCX0KKwlpbm9kZTJzZF92MSAoJnNkLCBpbm9kZSwgaW5vZGUtPmlfc2l6ZSk7CisgICAgfSBlbHNlIHsKKwlpbm9kZTJzZCAoJnNkLCBpbm9kZSwgaW5vZGUtPmlfc2l6ZSk7CisgICAgfQorICAgIC8vIHRoZXNlIGRvIG5vdCBnbyB0byBvbi1kaXNrIHN0YXQgZGF0YQorICAgIGlub2RlLT5pX2lubyA9IGxlMzJfdG9fY3B1IChpaC5paF9rZXkua19vYmplY3RpZCk7CisgICAgaW5vZGUtPmlfYmxrc2l6ZSA9IHJlaXNlcmZzX2RlZmF1bHRfaW9fc2l6ZTsKKyAgCisgICAgLy8gc3RvcmUgaW4gaW4tY29yZSBpbm9kZSB0aGUga2V5IG9mIHN0YXQgZGF0YSBhbmQgdmVyc2lvbiBhbGwKKyAgICAvLyBvYmplY3QgaXRlbXMgd2lsbCBoYXZlIChkaXJlY3RvcnkgaXRlbXMgd2lsbCBoYXZlIG9sZCBvZmZzZXQKKyAgICAvLyBmb3JtYXQsIG90aGVyIG5ldyBvYmplY3RzIHdpbGwgY29uc2lzdCBvZiBuZXcgaXRlbXMpCisgICAgbWVtY3B5IChJTk9ERV9QS0VZIChpbm9kZSksICYoaWguaWhfa2V5KSwgS0VZX1NJWkUpOworICAgIGlmIChvbGRfZm9ybWF0X29ubHkgKHNiKSB8fCBTX0lTRElSKG1vZGUpIHx8IFNfSVNMTksobW9kZSkpCisgICAgICAgIHNldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uIChpbm9kZSwgS0VZX0ZPUk1BVF8zXzUpOworICAgIGVsc2UKKyAgICAgICAgc2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24gKGlub2RlLCBLRVlfRk9STUFUXzNfNik7CisgICAgaWYgKG9sZF9mb3JtYXRfb25seSAoc2IpKQorCXNldF9pbm9kZV9zZF92ZXJzaW9uIChpbm9kZSwgU1RBVF9EQVRBX1YxKTsKKyAgICBlbHNlCisJc2V0X2lub2RlX3NkX3ZlcnNpb24gKGlub2RlLCBTVEFUX0RBVEFfVjIpOworICAgIAorICAgIC8qIGluc2VydCB0aGUgc3RhdCBkYXRhIGludG8gdGhlIHRyZWUgKi8KKyNpZmRlZiBESVNQTEFDRV9ORVdfUEFDS0lOR19MT0NBTElUSUVTCisgICAgaWYgKFJFSVNFUkZTX0koZGlyKS0+bmV3X3BhY2tpbmdfbG9jYWxpdHkpCisJdGgtPmRpc3BsYWNlX25ld19ibG9ja3MgPSAxOworI2VuZGlmCisgICAgcmV0dmFsID0gcmVpc2VyZnNfaW5zZXJ0X2l0ZW0gKHRoLCAmcGF0aF90b19rZXksICZrZXksICZpaCwgaW5vZGUsIChjaGFyICopKCZzZCkpOworICAgIGlmIChyZXR2YWwpIHsKKwllcnIgPSByZXR2YWw7CisJcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aF90b19rZXkpIDsKKwlnb3RvIG91dF9iYWRfaW5vZGU7CisgICAgfQorCisjaWZkZWYgRElTUExBQ0VfTkVXX1BBQ0tJTkdfTE9DQUxJVElFUworICAgIGlmICghdGgtPmRpc3BsYWNlX25ld19ibG9ja3MpCisJUkVJU0VSRlNfSShkaXIpLT5uZXdfcGFja2luZ19sb2NhbGl0eSA9IDA7CisjZW5kaWYKKyAgICBpZiAoU19JU0RJUihtb2RlKSkgeworCS8qIGluc2VydCBpdGVtIHdpdGggIi4iIGFuZCAiLi4iICovCisJcmV0dmFsID0gcmVpc2VyZnNfbmV3X2RpcmVjdG9yeSAodGgsIGlub2RlLCAmaWgsICZwYXRoX3RvX2tleSwgZGlyKTsKKyAgICB9CisKKyAgICBpZiAoU19JU0xOSyhtb2RlKSkgeworCS8qIGluc2VydCBib2R5IG9mIHN5bWxpbmsgKi8KKwlpZiAoIW9sZF9mb3JtYXRfb25seSAoc2IpKQorCSAgICBpX3NpemUgPSBST1VORF9VUChpX3NpemUpOworCXJldHZhbCA9IHJlaXNlcmZzX25ld19zeW1saW5rICh0aCwgaW5vZGUsICZpaCwgJnBhdGhfdG9fa2V5LCBzeW1uYW1lLCBpX3NpemUpOworICAgIH0KKyAgICBpZiAocmV0dmFsKSB7CisJZXJyID0gcmV0dmFsOworCXJlaXNlcmZzX2NoZWNrX3BhdGgoJnBhdGhfdG9fa2V5KSA7CisJam91cm5hbF9lbmQodGgsIHRoLT50X3N1cGVyLCB0aC0+dF9ibG9ja3NfYWxsb2NhdGVkKTsKKwlnb3RvIG91dF9pbnNlcnRlZF9zZDsKKyAgICB9CisKKyAgICAvKiBYWFggQ0hFQ0sgVEhJUyAqLworICAgIGlmIChyZWlzZXJmc19wb3NpeGFjbCAoaW5vZGUtPmlfc2IpKSB7CisgICAgICAgIHJldHZhbCA9IHJlaXNlcmZzX2luaGVyaXRfZGVmYXVsdF9hY2wgKGRpciwgZGVudHJ5LCBpbm9kZSk7CisgICAgICAgIGlmIChyZXR2YWwpIHsKKyAgICAgICAgICAgIGVyciA9IHJldHZhbDsKKyAgICAgICAgICAgIHJlaXNlcmZzX2NoZWNrX3BhdGgoJnBhdGhfdG9fa2V5KSA7CisgICAgICAgICAgICBqb3VybmFsX2VuZCh0aCwgdGgtPnRfc3VwZXIsIHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQpOworICAgICAgICAgICAgZ290byBvdXRfaW5zZXJ0ZWRfc2Q7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGlub2RlLT5pX3NiLT5zX2ZsYWdzICYgTVNfUE9TSVhBQ0wpIHsKKwlyZWlzZXJmc193YXJuaW5nIChpbm9kZS0+aV9zYiwgIkFDTHMgYXJlbid0IGVuYWJsZWQgaW4gdGhlIGZzLCAiCisJCQkgICJidXQgdmZzIHRoaW5rcyB0aGV5IGFyZSEiKTsKKyAgICB9IGVsc2UgaWYgKGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0IChkaXIpKSB7CisJcmVpc2VyZnNfbWFya19pbm9kZV9wcml2YXRlIChpbm9kZSk7CisgICAgfQorCisgICAgaW5zZXJ0X2lub2RlX2hhc2ggKGlub2RlKTsKKyAgICByZWlzZXJmc191cGRhdGVfc2QodGgsIGlub2RlKTsKKyAgICByZWlzZXJmc19jaGVja19wYXRoKCZwYXRoX3RvX2tleSkgOworCisgICAgcmV0dXJuIDA7CisKKy8qIGl0IGxvb2tzIGxpa2UgeW91IGNhbiBlYXNpbHkgY29tcHJlc3MgdGhlc2UgdHdvIGdvdG8gdGFyZ2V0cyBpbnRvCisgKiBvbmUuICBLZWVwaW5nIGl0IGxpa2UgdGhpcyBkb2Vzbid0IGFjdHVhbGx5IGh1cnQgYW55dGhpbmcsIGFuZCB0aGV5CisgKiBhcmUgcGxhY2UgaG9sZGVycyBmb3Igd2hhdCB0aGUgcXVvdGEgY29kZSBhY3R1YWxseSBuZWVkcy4KKyAqLworb3V0X2JhZF9pbm9kZToKKyAgICAvKiBJbnZhbGlkYXRlIHRoZSBvYmplY3QsIG5vdGhpbmcgd2FzIGluc2VydGVkIHlldCAqLworICAgIElOT0RFX1BLRVkoaW5vZGUpLT5rX29iamVjdGlkID0gMDsKKworICAgIC8qIFF1b3RhIGNoYW5nZSBtdXN0IGJlIGluc2lkZSBhIHRyYW5zYWN0aW9uIGZvciBqb3VybmFsaW5nICovCisgICAgRFFVT1RfRlJFRV9JTk9ERShpbm9kZSk7CisKK291dF9lbmRfdHJhbnM6CisgICAgam91cm5hbF9lbmQodGgsIHRoLT50X3N1cGVyLCB0aC0+dF9ibG9ja3NfYWxsb2NhdGVkKSA7CisgICAgLyogRHJvcCBjYW4gYmUgb3V0c2lkZSBhbmQgaXQgbmVlZHMgbW9yZSBjcmVkaXRzIHNvIGl0J3MgYmV0dGVyIHRvIGhhdmUgaXQgb3V0c2lkZSAqLworICAgIERRVU9UX0RST1AoaW5vZGUpOworICAgIGlub2RlLT5pX2ZsYWdzIHw9IFNfTk9RVU9UQTsKKyAgICBtYWtlX2JhZF9pbm9kZShpbm9kZSk7CisKK291dF9pbnNlcnRlZF9zZDoKKyAgICBpbm9kZS0+aV9ubGluayA9IDA7CisgICAgdGgtPnRfdHJhbnNfaWQgPSAwOyAvKiBzbyB0aGUgY2FsbGVyIGNhbid0IHVzZSB0aGlzIGhhbmRsZSBsYXRlciAqLworICAgIGlwdXQoaW5vZGUpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qCisqKiBmaW5kcyB0aGUgdGFpbCBwYWdlIGluIHRoZSBwYWdlIGNhY2hlLAorKiogcmVhZHMgdGhlIGxhc3QgYmxvY2sgaW4uCisqKgorKiogT24gc3VjY2VzcywgcGFnZV9yZXN1bHQgaXMgc2V0IHRvIGEgbG9ja2VkLCBwaW5uZWQgcGFnZSwgYW5kIGJoX3Jlc3VsdAorKiogaXMgc2V0IHRvIGFuIHVwIHRvIGRhdGUgYnVmZmVyIGZvciB0aGUgbGFzdCBibG9jayBpbiB0aGUgZmlsZS4gIHJldHVybnMgMC4KKyoqCisqKiB0YWlsIGNvbnZlcnNpb24gaXMgbm90IGRvbmUsIHNvIGJoX3Jlc3VsdCBtaWdodCBub3QgYmUgdmFsaWQgZm9yIHdyaXRpbmcKKyoqIGNoZWNrIGJ1ZmZlcl9tYXBwZWQoYmhfcmVzdWx0KSBhbmQgYmhfcmVzdWx0LT5iX2Jsb2NrbnIgIT0gMCBiZWZvcmUKKyoqIHRyeWluZyB0byB3cml0ZSB0aGUgYmxvY2suCisqKgorKiogb24gZmFpbHVyZSwgbm9uemVybyBpcyByZXR1cm5lZCwgcGFnZV9yZXN1bHQgYW5kIGJoX3Jlc3VsdCBhcmUgdW50b3VjaGVkLgorKi8KK3N0YXRpYyBpbnQgZ3JhYl90YWlsX3BhZ2Uoc3RydWN0IGlub2RlICpwX3NfaW5vZGUsIAorCQkJICBzdHJ1Y3QgcGFnZSAqKnBhZ2VfcmVzdWx0LCAKKwkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmhfcmVzdWx0KSB7CisKKyAgICAvKiB3ZSB3YW50IHRoZSBwYWdlIHdpdGggdGhlIGxhc3QgYnl0ZSBpbiB0aGUgZmlsZSwKKyAgICAqKiBub3QgdGhlIHBhZ2UgdGhhdCB3aWxsIGhvbGQgdGhlIG5leHQgYnl0ZSBmb3IgYXBwZW5kaW5nCisgICAgKi8KKyAgICB1bnNpZ25lZCBsb25nIGluZGV4ID0gKHBfc19pbm9kZS0+aV9zaXplLTEpID4+IFBBR0VfQ0FDSEVfU0hJRlQgOworICAgIHVuc2lnbmVkIGxvbmcgcG9zID0gMCA7CisgICAgdW5zaWduZWQgbG9uZyBzdGFydCA9IDAgOworICAgIHVuc2lnbmVkIGxvbmcgYmxvY2tzaXplID0gcF9zX2lub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSA7CisgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAocF9zX2lub2RlLT5pX3NpemUpICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpIDsKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoIDsKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmhlYWQgOworICAgIHN0cnVjdCBwYWdlICogcGFnZSA7CisgICAgaW50IGVycm9yIDsKKyAgICAKKyAgICAvKiB3ZSBrbm93IHRoYXQgd2UgYXJlIG9ubHkgY2FsbGVkIHdpdGggaW5vZGUtPmlfc2l6ZSA+IDAuCisgICAgKiogd2UgYWxzbyBrbm93IHRoYXQgYSBmaWxlIHRhaWwgY2FuIG5ldmVyIGJlIGFzIGJpZyBhcyBhIGJsb2NrCisgICAgKiogSWYgaV9zaXplICUgYmxvY2tzaXplID09IDAsIG91ciBmaWxlIGlzIGN1cnJlbnRseSBibG9jayBhbGlnbmVkCisgICAgKiogYW5kIGl0IHdvbid0IG5lZWQgY29udmVydGluZyBvciB6ZXJvaW5nIGFmdGVyIGEgdHJ1bmNhdGUuCisgICAgKi8KKyAgICBpZiAoKG9mZnNldCAmIChibG9ja3NpemUgLSAxKSkgPT0gMCkgeworICAgICAgICByZXR1cm4gLUVOT0VOVCA7CisgICAgfQorICAgIHBhZ2UgPSBncmFiX2NhY2hlX3BhZ2UocF9zX2lub2RlLT5pX21hcHBpbmcsIGluZGV4KSA7CisgICAgZXJyb3IgPSAtRU5PTUVNIDsKKyAgICBpZiAoIXBhZ2UpIHsKKyAgICAgICAgZ290byBvdXQgOworICAgIH0KKyAgICAvKiBzdGFydCB3aXRoaW4gdGhlIHBhZ2Ugb2YgdGhlIGxhc3QgYmxvY2sgaW4gdGhlIGZpbGUgKi8KKyAgICBzdGFydCA9IChvZmZzZXQgLyBibG9ja3NpemUpICogYmxvY2tzaXplIDsKKworICAgIGVycm9yID0gYmxvY2tfcHJlcGFyZV93cml0ZShwYWdlLCBzdGFydCwgb2Zmc2V0LCAKKwkJCQlyZWlzZXJmc19nZXRfYmxvY2tfY3JlYXRlXzApIDsKKyAgICBpZiAoZXJyb3IpCisJZ290byB1bmxvY2sgOworCisgICAgaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKSA7ICAgICAgCisgICAgYmggPSBoZWFkOworICAgIGRvIHsKKwlpZiAocG9zID49IHN0YXJ0KSB7CisJICAgIGJyZWFrIDsKKwl9CisJYmggPSBiaC0+Yl90aGlzX3BhZ2UgOworCXBvcyArPSBibG9ja3NpemUgOworICAgIH0gd2hpbGUoYmggIT0gaGVhZCkgOworCisgICAgaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKSB7CisJLyogbm90ZSwgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCBwcmVwYXJlX3dyaXRlIHNob3VsZAorCSoqIGJlIHRha2luZyBjYXJlIG9mIHRoaXMgZm9yIHVzLiAgSWYgdGhlIGJ1ZmZlciBpc24ndCB1cCB0byBkYXRlLAorCSoqIEkndmUgc2NyZXdlZCB1cCB0aGUgY29kZSB0byBmaW5kIHRoZSBidWZmZXIsIG9yIHRoZSBjb2RlIHRvCisJKiogY2FsbCBwcmVwYXJlX3dyaXRlCisJKi8KKwlyZWlzZXJmc193YXJuaW5nIChwX3NfaW5vZGUtPmlfc2IsCisJCQkgICJjbG0tNjAwMDogZXJyb3IgcmVhZGluZyBibG9jayAlbHUgb24gZGV2ICVzIiwKKwkJCSAgYmgtPmJfYmxvY2tuciwKKwkJCSAgcmVpc2VyZnNfYmRldm5hbWUgKHBfc19pbm9kZS0+aV9zYikpIDsKKwllcnJvciA9IC1FSU8gOworCWdvdG8gdW5sb2NrIDsKKyAgICB9CisgICAgKmJoX3Jlc3VsdCA9IGJoIDsKKyAgICAqcGFnZV9yZXN1bHQgPSBwYWdlIDsKKworb3V0OgorICAgIHJldHVybiBlcnJvciA7CisKK3VubG9jazoKKyAgICB1bmxvY2tfcGFnZShwYWdlKSA7CisgICAgcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpIDsKKyAgICByZXR1cm4gZXJyb3IgOworfQorCisvKgorKiogdmZzIHZlcnNpb24gb2YgdHJ1bmNhdGUgZmlsZS4gIE11c3QgTk9UIGJlIGNhbGxlZCB3aXRoCisqKiBhIHRyYW5zYWN0aW9uIGFscmVhZHkgc3RhcnRlZC4KKyoqCisqKiBzb21lIGNvZGUgdGFrZW4gZnJvbSBibG9ja190cnVuY2F0ZV9wYWdlCisqLworaW50IHJlaXNlcmZzX3RydW5jYXRlX2ZpbGUoc3RydWN0IGlub2RlICpwX3NfaW5vZGUsIGludCB1cGRhdGVfdGltZXN0YW1wcykgeworICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGggOworICAgIC8qIHdlIHdhbnQgdGhlIG9mZnNldCBmb3IgdGhlIGZpcnN0IGJ5dGUgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgZmlsZSAqLworICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gcF9zX2lub2RlLT5pX3NpemUgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkgOworICAgIHVuc2lnbmVkIGJsb2Nrc2l6ZSA9IHBfc19pbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgOworICAgIHVuc2lnbmVkIGxlbmd0aCA7CisgICAgc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMIDsKKyAgICBpbnQgZXJyb3IgOworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMIDsKKworICAgIHJlaXNlcmZzX3dyaXRlX2xvY2socF9zX2lub2RlLT5pX3NiKTsKKworICAgIGlmIChwX3NfaW5vZGUtPmlfc2l6ZSA+IDApIHsKKyAgICAgICAgaWYgKChlcnJvciA9IGdyYWJfdGFpbF9wYWdlKHBfc19pbm9kZSwgJnBhZ2UsICZiaCkpKSB7CisJICAgIC8vIC1FTk9FTlQgbWVhbnMgd2UgdHJ1bmNhdGVkIHBhc3QgdGhlIGVuZCBvZiB0aGUgZmlsZSwgCisJICAgIC8vIGFuZCBnZXRfYmxvY2tfY3JlYXRlXzAgY291bGQgbm90IGZpbmQgYSBibG9jayB0byByZWFkIGluLAorCSAgICAvLyB3aGljaCBpcyBvay4KKwkgICAgaWYgKGVycm9yICE9IC1FTk9FTlQpCisJICAgICAgICByZWlzZXJmc193YXJuaW5nIChwX3NfaW5vZGUtPmlfc2IsCisJCQkJICAiY2xtLTYwMDE6IGdyYWJfdGFpbF9wYWdlIGZhaWxlZCAlZCIsCisJCQkJICBlcnJvcik7CisJICAgIHBhZ2UgPSBOVUxMIDsKKwkgICAgYmggPSBOVUxMIDsKKwl9CisgICAgfQorCisgICAgLyogc28sIGlmIHBhZ2UgIT0gTlVMTCwgd2UgaGF2ZSBhIGJ1ZmZlciBoZWFkIGZvciB0aGUgb2Zmc2V0IGF0IAorICAgICoqIHRoZSBlbmQgb2YgdGhlIGZpbGUuIGlmIHRoZSBiaCBpcyBtYXBwZWQsIGFuZCBiaC0+Yl9ibG9ja25yICE9IDAsIAorICAgICoqIHRoZW4gd2UgaGF2ZSBhbiB1bmZvcm1hdHRlZCBub2RlLiAgT3RoZXJ3aXNlLCB3ZSBoYXZlIGEgZGlyZWN0IGl0ZW0sIAorICAgICoqIGFuZCBubyB6ZXJvaW5nIGlzIHJlcXVpcmVkIG9uIGRpc2suICBXZSB6ZXJvIGFmdGVyIHRoZSB0cnVuY2F0ZSwgCisgICAgKiogYmVjYXVzZSB0aGUgdHJ1bmNhdGUgbWlnaHQgcGFjayB0aGUgaXRlbSBhbnl3YXkgCisgICAgKiogKGl0IHdpbGwgdW5tYXAgYmggaWYgaXQgcGFja3MpLgorICAgICovCisgICAgLyogaXQgaXMgZW5vdWdoIHRvIHJlc2VydmUgc3BhY2UgaW4gdHJhbnNhY3Rpb24gZm9yIDIgYmFsYW5jaW5nczoKKyAgICAgICBvbmUgZm9yICJzYXZlIiBsaW5rIGFkZGluZyBhbmQgYW5vdGhlciBmb3IgdGhlIGZpcnN0CisgICAgICAgY3V0X2Zyb21faXRlbS4gMSBpcyBmb3IgdXBkYXRlX3NkICovCisgICAgZXJyb3IgPSBqb3VybmFsX2JlZ2luICgmdGgsIHBfc19pbm9kZS0+aV9zYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMiArIDEpOworICAgIGlmIChlcnJvcikKKyAgICAgICAgZ290byBvdXQ7CisgICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKHBfc19pbm9kZSkgOworICAgIGlmICh1cGRhdGVfdGltZXN0YW1wcykKKwkgICAgLyogd2UgYXJlIGRvaW5nIHJlYWwgdHJ1bmNhdGU6IGlmIHRoZSBzeXN0ZW0gY3Jhc2hlcyBiZWZvcmUgdGhlIGxhc3QKKwkgICAgICAgdHJhbnNhY3Rpb24gb2YgdHJ1bmNhdGluZyBnZXRzIGNvbW1pdHRlZCAtIG9uIHJlYm9vdCB0aGUgZmlsZQorCSAgICAgICBlaXRoZXIgYXBwZWFycyB0cnVuY2F0ZWQgcHJvcGVybHkgb3Igbm90IHRydW5jYXRlZCBhdCBhbGwgKi8KKwlhZGRfc2F2ZV9saW5rICgmdGgsIHBfc19pbm9kZSwgMSk7CisgICAgZXJyb3IgPSByZWlzZXJmc19kb190cnVuY2F0ZSAoJnRoLCBwX3NfaW5vZGUsIHBhZ2UsIHVwZGF0ZV90aW1lc3RhbXBzKSA7CisgICAgaWYgKGVycm9yKQorICAgICAgICBnb3RvIG91dDsKKyAgICBlcnJvciA9IGpvdXJuYWxfZW5kICgmdGgsIHBfc19pbm9kZS0+aV9zYiwgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAyICsgMSk7CisgICAgaWYgKGVycm9yKQorICAgICAgICBnb3RvIG91dDsKKworICAgIGlmICh1cGRhdGVfdGltZXN0YW1wcykgeworCWVycm9yID0gcmVtb3ZlX3NhdmVfbGluayAocF9zX2lub2RlLCAxLyogdHJ1bmNhdGUgKi8pOworICAgICAgICBpZiAoZXJyb3IpCisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBpZiAocGFnZSkgeworICAgICAgICBsZW5ndGggPSBvZmZzZXQgJiAoYmxvY2tzaXplIC0gMSkgOworCS8qIGlmIHdlIGFyZSBub3Qgb24gYSBibG9jayBib3VuZGFyeSAqLworCWlmIChsZW5ndGgpIHsKKwkgICAgY2hhciAqa2FkZHI7CisKKwkgICAgbGVuZ3RoID0gYmxvY2tzaXplIC0gbGVuZ3RoIDsKKwkgICAga2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCkgOworCSAgICBtZW1zZXQoa2FkZHIgKyBvZmZzZXQsIDAsIGxlbmd0aCkgOyAgIAorCSAgICBmbHVzaF9kY2FjaGVfcGFnZShwYWdlKSA7CisJICAgIGt1bm1hcF9hdG9taWMoa2FkZHIsIEtNX1VTRVIwKSA7CisJICAgIGlmIChidWZmZXJfbWFwcGVkKGJoKSAmJiBiaC0+Yl9ibG9ja25yICE9IDApIHsKKwkgICAgICAgIG1hcmtfYnVmZmVyX2RpcnR5KGJoKSA7CisJICAgIH0KKwl9CisJdW5sb2NrX3BhZ2UocGFnZSkgOworCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKSA7CisgICAgfQorCisgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHBfc19pbm9kZS0+aV9zYik7CisgICAgcmV0dXJuIDA7CitvdXQ6CisgICAgaWYgKHBhZ2UpIHsKKyAgICAgICAgdW5sb2NrX3BhZ2UgKHBhZ2UpOworICAgICAgICBwYWdlX2NhY2hlX3JlbGVhc2UgKHBhZ2UpOworICAgIH0KKyAgICByZWlzZXJmc193cml0ZV91bmxvY2socF9zX2lub2RlLT5pX3NiKTsKKyAgICByZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgbWFwX2Jsb2NrX2Zvcl93cml0ZXBhZ2Uoc3RydWN0IGlub2RlICppbm9kZSwgCisJCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYmxvY2spIHsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoIDsKKyAgICBpbnQgZnNfZ2VuIDsKKyAgICBzdHJ1Y3QgaXRlbV9oZWFkIHRtcF9paCA7CisgICAgc3RydWN0IGl0ZW1faGVhZCAqaWggOworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmggOworICAgIF9fdTMyICppdGVtIDsKKyAgICBzdHJ1Y3QgY3B1X2tleSBrZXkgOworICAgIElOSVRJQUxJWkVfUEFUSChwYXRoKSA7CisgICAgaW50IHBvc19pbl9pdGVtIDsKKyAgICBpbnQgamJlZ2luX2NvdW50ID0gSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgOworICAgIGxvZmZfdCBieXRlX29mZnNldCA9IChibG9jayA8PCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cykgKyAxIDsKKyAgICBpbnQgcmV0dmFsIDsKKyAgICBpbnQgdXNlX2dldF9ibG9jayA9IDAgOworICAgIGludCBieXRlc19jb3BpZWQgPSAwIDsKKyAgICBpbnQgY29weV9zaXplIDsKKyAgICBpbnQgdHJhbnNfcnVubmluZyA9IDA7CisKKyAgICAvKiBjYXRjaCBwbGFjZXMgYmVsb3cgdGhhdCB0cnkgdG8gbG9nIHNvbWV0aGluZyB3aXRob3V0IHN0YXJ0aW5nIGEgdHJhbnMgKi8KKyAgICB0aC50X3RyYW5zX2lkID0gMDsKKworICAgIGlmICghYnVmZmVyX3VwdG9kYXRlKGJoX3Jlc3VsdCkpIHsKKwlyZXR1cm4gLUVJTzsKKyAgICB9CisKKyAgICBrbWFwKGJoX3Jlc3VsdC0+Yl9wYWdlKSA7CitzdGFydF9vdmVyOgorICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworICAgIG1ha2VfY3B1X2tleSgma2V5LCBpbm9kZSwgYnl0ZV9vZmZzZXQsIFRZUEVfQU5ZLCAzKSA7CisKK3Jlc2VhcmNoOgorICAgIHJldHZhbCA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KGlub2RlLT5pX3NiLCAma2V5LCAmcGF0aCkgOworICAgIGlmIChyZXR2YWwgIT0gUE9TSVRJT05fRk9VTkQpIHsKKyAgICAgICAgdXNlX2dldF9ibG9jayA9IDE7CisJZ290byBvdXQgOworICAgIH0gCisKKyAgICBiaCA9IGdldF9sYXN0X2JoKCZwYXRoKSA7CisgICAgaWggPSBnZXRfaWgoJnBhdGgpIDsKKyAgICBpdGVtID0gZ2V0X2l0ZW0oJnBhdGgpIDsKKyAgICBwb3NfaW5faXRlbSA9IHBhdGgucG9zX2luX2l0ZW0gOworCisgICAgLyogd2UndmUgZm91bmQgYW4gdW5mb3JtYXR0ZWQgbm9kZSAqLworICAgIGlmIChpbmRpcmVjdF9pdGVtX2ZvdW5kKHJldHZhbCwgaWgpKSB7CisJaWYgKGJ5dGVzX2NvcGllZCA+IDApIHsKKwkgICAgcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICJjbG0tNjAwMjogYnl0ZXNfY29waWVkICVkIiwKKwkJCSAgICAgIGJ5dGVzX2NvcGllZCkgOworCX0KKyAgICAgICAgaWYgKCFnZXRfYmxvY2tfbnVtKGl0ZW0sIHBvc19pbl9pdGVtKSkgeworCSAgICAvKiBjcmFwLCB3ZSBhcmUgd3JpdGluZyB0byBhIGhvbGUgKi8KKwkgICAgdXNlX2dldF9ibG9jayA9IDE7CisJICAgIGdvdG8gb3V0IDsKKwl9CisJc2V0X2Jsb2NrX2Rldl9tYXBwZWQoYmhfcmVzdWx0LCBnZXRfYmxvY2tfbnVtKGl0ZW0scG9zX2luX2l0ZW0pLGlub2RlKTsKKyAgICB9IGVsc2UgaWYgKGlzX2RpcmVjdF9sZV9paChpaCkpIHsKKyAgICAgICAgY2hhciAqcCA7IAorICAgICAgICBwID0gcGFnZV9hZGRyZXNzKGJoX3Jlc3VsdC0+Yl9wYWdlKSA7CisgICAgICAgIHAgKz0gKGJ5dGVfb2Zmc2V0IC0xKSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSA7CisgICAgICAgIGNvcHlfc2l6ZSA9IGloX2l0ZW1fbGVuKGloKSAtIHBvc19pbl9pdGVtOworCisJZnNfZ2VuID0gZ2V0X2dlbmVyYXRpb24oaW5vZGUtPmlfc2IpIDsKKwljb3B5X2l0ZW1faGVhZCgmdG1wX2loLCBpaCkgOworCisJaWYgKCF0cmFuc19ydW5uaW5nKSB7CisJICAgIC8qIHZzLTMwNTAgaXMgZ29uZSwgbm8gbmVlZCB0byBkcm9wIHRoZSBwYXRoICovCisJICAgIHJldHZhbCA9IGpvdXJuYWxfYmVnaW4oJnRoLCBpbm9kZS0+aV9zYiwgamJlZ2luX2NvdW50KSA7CisgICAgICAgICAgICBpZiAocmV0dmFsKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OworCSAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpIDsKKwkgICAgdHJhbnNfcnVubmluZyA9IDE7CisJICAgIGlmIChmc19jaGFuZ2VkKGZzX2dlbiwgaW5vZGUtPmlfc2IpICYmIGl0ZW1fbW92ZWQoJnRtcF9paCwgJnBhdGgpKSB7CisJCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKGlub2RlLT5pX3NiLCBiaCkgOworCQlnb3RvIHJlc2VhcmNoOworCSAgICB9CisJfQorCisJcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChpbm9kZS0+aV9zYiwgYmgsIDEpIDsKKworCWlmIChmc19jaGFuZ2VkIChmc19nZW4sIGlub2RlLT5pX3NiKSAmJiBpdGVtX21vdmVkICgmdG1wX2loLCAmcGF0aCkpIHsKKwkgICAgcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIoaW5vZGUtPmlfc2IsIGJoKSA7CisJICAgIGdvdG8gcmVzZWFyY2g7CisJfQorCisJbWVtY3B5KCBCX0lfUElURU0oYmgsIGloKSArIHBvc19pbl9pdGVtLCBwICsgYnl0ZXNfY29waWVkLCBjb3B5X3NpemUpIDsKKworCWpvdXJuYWxfbWFya19kaXJ0eSgmdGgsIGlub2RlLT5pX3NiLCBiaCkgOworCWJ5dGVzX2NvcGllZCArPSBjb3B5X3NpemUgOworCXNldF9ibG9ja19kZXZfbWFwcGVkKGJoX3Jlc3VsdCwgMCwgaW5vZGUpOworCisJLyogYXJlIHRoZXJlIHN0aWxsIGJ5dGVzIGxlZnQ/ICovCisgICAgICAgIGlmIChieXRlc19jb3BpZWQgPCBiaF9yZXN1bHQtPmJfc2l6ZSAmJiAKKwkgICAgKGJ5dGVfb2Zmc2V0ICsgYnl0ZXNfY29waWVkKSA8IGlub2RlLT5pX3NpemUpIHsKKwkgICAgc2V0X2NwdV9rZXlfa19vZmZzZXQoJmtleSwgY3B1X2tleV9rX29mZnNldCgma2V5KSArIGNvcHlfc2l6ZSkgOworCSAgICBnb3RvIHJlc2VhcmNoIDsKKwl9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsCisJCQkgICJjbG0tNjAwMzogYmFkIGl0ZW0gaW5vZGUgJWx1LCBkZXZpY2UgJXMiLAorCQkJICBpbm9kZS0+aV9pbm8sIHJlaXNlcmZzX2JkZXZuYW1lIChpbm9kZS0+aV9zYikpIDsKKyAgICAgICAgcmV0dmFsID0gLUVJTyA7CisJZ290byBvdXQgOworICAgIH0KKyAgICByZXR2YWwgPSAwIDsKKyAgICAKK291dDoKKyAgICBwYXRocmVsc2UoJnBhdGgpIDsKKyAgICBpZiAodHJhbnNfcnVubmluZykgeworICAgICAgICBpbnQgZXJyID0gam91cm5hbF9lbmQoJnRoLCBpbm9kZS0+aV9zYiwgamJlZ2luX2NvdW50KSA7CisgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICByZXR2YWwgPSBlcnI7CisJdHJhbnNfcnVubmluZyA9IDA7CisgICAgfQorICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisKKyAgICAvKiB0aGlzIGlzIHdoZXJlIHdlIGZpbGwgaW4gaG9sZXMgaW4gdGhlIGZpbGUuICovCisgICAgaWYgKHVzZV9nZXRfYmxvY2spIHsKKwlyZXR2YWwgPSByZWlzZXJmc19nZXRfYmxvY2soaW5vZGUsIGJsb2NrLCBiaF9yZXN1bHQsIAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfQkxPQ0tfQ1JFQVRFIHwgR0VUX0JMT0NLX05PX0lTRU0gfAorCQkJCSAgICBHRVRfQkxPQ0tfTk9fREFOR0xFKTsKKwlpZiAoIXJldHZhbCkgeworCSAgICBpZiAoIWJ1ZmZlcl9tYXBwZWQoYmhfcmVzdWx0KSB8fCBiaF9yZXN1bHQtPmJfYmxvY2tuciA9PSAwKSB7CisJICAgICAgICAvKiBnZXRfYmxvY2sgZmFpbGVkIHRvIGZpbmQgYSBtYXBwZWQgdW5mb3JtYXR0ZWQgbm9kZS4gKi8KKwkJdXNlX2dldF9ibG9jayA9IDAgOworCQlnb3RvIHN0YXJ0X292ZXIgOworCSAgICB9CisJfQorICAgIH0KKyAgICBrdW5tYXAoYmhfcmVzdWx0LT5iX3BhZ2UpIDsKKworICAgIGlmICghcmV0dmFsICYmIGJ1ZmZlcl9tYXBwZWQoYmhfcmVzdWx0KSAmJiBiaF9yZXN1bHQtPmJfYmxvY2tuciA9PSAwKSB7CisJLyogd2UndmUgY29waWVkIGRhdGEgZnJvbSB0aGUgcGFnZSBpbnRvIHRoZSBkaXJlY3QgaXRlbSwgc28gdGhlCisJICogYnVmZmVyIGluIHRoZSBwYWdlIGlzIG5vdyBjbGVhbiwgbWFyayBpdCB0byByZWZsZWN0IHRoYXQuCisJICovCisgICAgICAgIGxvY2tfYnVmZmVyKGJoX3Jlc3VsdCk7CisJY2xlYXJfYnVmZmVyX2RpcnR5KGJoX3Jlc3VsdCk7CisJdW5sb2NrX2J1ZmZlcihiaF9yZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsIDsKK30KKworLyogCisgKiBtYXNvbkBzdXNlLmNvbTogdXBkYXRlZCBpbiAyLjUuNTQgdG8gZm9sbG93IHRoZSBzYW1lIGdlbmVyYWwgaW8gCisgKiBzdGFydC9yZWNvdmVyeSBwYXRoIGFzIF9fYmxvY2tfd3JpdGVfZnVsbF9wYWdlLCBhbG9uZyB3aXRoIHNwZWNpYWwKKyAqIGNvZGUgdG8gaGFuZGxlIHJlaXNlcmZzIHRhaWxzLgorICovCitzdGF0aWMgaW50IHJlaXNlcmZzX3dyaXRlX2Z1bGxfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpIHsKKyAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdCA7CisgICAgdW5zaWduZWQgbG9uZyBlbmRfaW5kZXggPSBpbm9kZS0+aV9zaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQgOworICAgIGludCBlcnJvciA9IDA7CisgICAgdW5zaWduZWQgbG9uZyBibG9jayA7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpoZWFkLCAqYmg7CisgICAgaW50IHBhcnRpYWwgPSAwIDsKKyAgICBpbnQgbnIgPSAwOworICAgIGludCBjaGVja2VkID0gUGFnZUNoZWNrZWQocGFnZSk7CisgICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKyAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSBpbm9kZS0+aV9zYjsKKyAgICBpbnQgYmhfcGVyX3BhZ2UgPSBQQUdFX0NBQ0hFX1NJWkUgLyBzLT5zX2Jsb2Nrc2l6ZTsKKyAgICB0aC50X3RyYW5zX2lkID0gMDsKKworICAgIC8qIFRoZSBwYWdlIGRpcnR5IGJpdCBpcyBjbGVhcmVkIGJlZm9yZSB3cml0ZXBhZ2UgaXMgY2FsbGVkLCB3aGljaAorICAgICAqIG1lYW5zIHdlIGhhdmUgdG8gdGVsbCBjcmVhdGVfZW1wdHlfYnVmZmVycyB0byBtYWtlIGRpcnR5IGJ1ZmZlcnMKKyAgICAgKiBUaGUgcGFnZSByZWFsbHkgc2hvdWxkIGJlIHVwIHRvIGRhdGUgYXQgdGhpcyBwb2ludCwgc28gdG9zc2luZworICAgICAqIGluIHRoZSBCSF9VcHRvZGF0ZSBpcyBqdXN0IGEgc2FuaXR5IGNoZWNrLgorICAgICAqLworICAgIGlmICghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkgeworCWNyZWF0ZV9lbXB0eV9idWZmZXJzKHBhZ2UsIHMtPnNfYmxvY2tzaXplLAorCSAgICAgICAgICAgICAgICAgICAgKDEgPDwgQkhfRGlydHkpIHwgKDEgPDwgQkhfVXB0b2RhdGUpKTsKKyAgICB9CisgICAgaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKSA7CisKKyAgICAvKiBsYXN0IHBhZ2UgaW4gdGhlIGZpbGUsIHplcm8gb3V0IGFueSBjb250ZW50cyBwYXN0IHRoZQorICAgICoqIGxhc3QgYnl0ZSBpbiB0aGUgZmlsZQorICAgICovCisgICAgaWYgKHBhZ2UtPmluZGV4ID49IGVuZF9pbmRleCkgeworCWNoYXIgKmthZGRyOworCXVuc2lnbmVkIGxhc3Rfb2Zmc2V0OworCisgICAgICAgIGxhc3Rfb2Zmc2V0ID0gaW5vZGUtPmlfc2l6ZSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSA7CisJLyogbm8gZmlsZSBjb250ZW50cyBpbiB0aGlzIHBhZ2UgKi8KKwlpZiAocGFnZS0+aW5kZXggPj0gZW5kX2luZGV4ICsgMSB8fCAhbGFzdF9vZmZzZXQpIHsKKyAgICAJICAgIHVubG9ja19wYWdlKHBhZ2UpOworCSAgICByZXR1cm4gMDsKKwl9CisJa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlLCBLTV9VU0VSMCk7CisJbWVtc2V0KGthZGRyICsgbGFzdF9vZmZzZXQsIDAsIFBBR0VfQ0FDSEVfU0laRS1sYXN0X29mZnNldCkgOworCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpIDsKKwlrdW5tYXBfYXRvbWljKGthZGRyLCBLTV9VU0VSMCkgOworICAgIH0KKyAgICBiaCA9IGhlYWQgOworICAgIGJsb2NrID0gcGFnZS0+aW5kZXggPDwgKFBBR0VfQ0FDSEVfU0hJRlQgLSBzLT5zX2Jsb2Nrc2l6ZV9iaXRzKSA7CisgICAgLyogZmlyc3QgbWFwIGFsbCB0aGUgYnVmZmVycywgbG9nZ2luZyBhbnkgZGlyZWN0IGl0ZW1zIHdlIGZpbmQgKi8KKyAgICBkbyB7CisJaWYgKChjaGVja2VkIHx8IGJ1ZmZlcl9kaXJ0eShiaCkpICYmICghYnVmZmVyX21hcHBlZChiaCkgfHwKKwkgICAoYnVmZmVyX21hcHBlZChiaCkgJiYgYmgtPmJfYmxvY2tuciA9PSAwKSkpIHsKKwkgICAgLyogbm90IG1hcHBlZCB5ZXQsIG9yIGl0IHBvaW50cyB0byBhIGRpcmVjdCBpdGVtLCBzZWFyY2gKKwkgICAgICogdGhlIGJ0cmVlIGZvciB0aGUgbWFwcGluZyBpbmZvLCBhbmQgbG9nIGFueSBkaXJlY3QKKwkgICAgICogaXRlbXMgZm91bmQKKwkgICAgICovCisJICAgIGlmICgoZXJyb3IgPSBtYXBfYmxvY2tfZm9yX3dyaXRlcGFnZShpbm9kZSwgYmgsIGJsb2NrKSkpIHsKKwkJZ290byBmYWlsIDsKKwkgICAgfQorCX0KKyAgICAgICAgYmggPSBiaC0+Yl90aGlzX3BhZ2U7CisJYmxvY2srKzsKKyAgICB9IHdoaWxlKGJoICE9IGhlYWQpIDsKKworICAgIC8qCisgICAgICogd2Ugc3RhcnQgdGhlIHRyYW5zYWN0aW9uIGFmdGVyIG1hcF9ibG9ja19mb3Jfd3JpdGVwYWdlLAorICAgICAqIGJlY2F1c2UgaXQgY2FuIGNyZWF0ZSBob2xlcyBpbiB0aGUgZmlsZSAoYW4gdW5ib3VuZGVkIG9wZXJhdGlvbikuCisgICAgICogc3RhcnRpbmcgaXQgaGVyZSwgd2UgY2FuIG1ha2UgYSByZWxpYWJsZSBlc3RpbWF0ZSBmb3IgaG93IG1hbnkKKyAgICAgKiBibG9ja3Mgd2UncmUgZ29pbmcgdG8gbG9nCisgICAgICovCisgICAgaWYgKGNoZWNrZWQpIHsKKwlDbGVhclBhZ2VDaGVja2VkKHBhZ2UpOworCXJlaXNlcmZzX3dyaXRlX2xvY2socyk7CisJZXJyb3IgPSBqb3VybmFsX2JlZ2luKCZ0aCwgcywgYmhfcGVyX3BhZ2UgKyAxKTsKKwlpZiAoZXJyb3IpIHsKKwkgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHMpOworCSAgICBnb3RvIGZhaWw7CisJfQorCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSk7CisgICAgfQorICAgIC8qIG5vdyBnbyB0aHJvdWdoIGFuZCBsb2NrIGFueSBkaXJ0eSBidWZmZXJzIG9uIHRoZSBwYWdlICovCisgICAgZG8geworCWdldF9iaChiaCk7CisJaWYgKCFidWZmZXJfbWFwcGVkKGJoKSkKKwkgICAgY29udGludWU7CisJaWYgKGJ1ZmZlcl9tYXBwZWQoYmgpICYmIGJoLT5iX2Jsb2NrbnIgPT0gMCkKKwkgICAgY29udGludWU7CisKKwlpZiAoY2hlY2tlZCkgeworCSAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIGJoLCAxKTsKKwkgICAgam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgcywgYmgpOworCSAgICBjb250aW51ZTsKKwl9CisJLyogZnJvbSB0aGlzIHBvaW50IG9uLCB3ZSBrbm93IHRoZSBidWZmZXIgaXMgbWFwcGVkIHRvIGEKKwkgKiByZWFsIGJsb2NrIGFuZCBub3QgYSBkaXJlY3QgaXRlbQorCSAqLworCWlmICh3YmMtPnN5bmNfbW9kZSAhPSBXQl9TWU5DX05PTkUgfHwgIXdiYy0+bm9uYmxvY2tpbmcpIHsKKwkgICAgbG9ja19idWZmZXIoYmgpOworCX0gZWxzZSB7CisJICAgIGlmICh0ZXN0X3NldF9idWZmZXJfbG9ja2VkKGJoKSkgeworCQlyZWRpcnR5X3BhZ2VfZm9yX3dyaXRlcGFnZSh3YmMsIHBhZ2UpOworCQljb250aW51ZTsKKwkgICAgfQorCX0KKwlpZiAodGVzdF9jbGVhcl9idWZmZXJfZGlydHkoYmgpKSB7CisJICAgIG1hcmtfYnVmZmVyX2FzeW5jX3dyaXRlKGJoKTsKKwl9IGVsc2UgeworCSAgICB1bmxvY2tfYnVmZmVyKGJoKTsKKwl9CisgICAgfSB3aGlsZSgoYmggPSBiaC0+Yl90aGlzX3BhZ2UpICE9IGhlYWQpOworCisgICAgaWYgKGNoZWNrZWQpIHsKKwllcnJvciA9IGpvdXJuYWxfZW5kKCZ0aCwgcywgYmhfcGVyX3BhZ2UgKyAxKTsKKwlyZWlzZXJmc193cml0ZV91bmxvY2socyk7CisJaWYgKGVycm9yKQorCSAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIEJVR19PTihQYWdlV3JpdGViYWNrKHBhZ2UpKTsKKyAgICBzZXRfcGFnZV93cml0ZWJhY2socGFnZSk7CisgICAgdW5sb2NrX3BhZ2UocGFnZSk7CisKKyAgICAvKgorICAgICAqIHNpbmNlIGFueSBidWZmZXIgbWlnaHQgYmUgdGhlIG9ubHkgZGlydHkgYnVmZmVyIG9uIHRoZSBwYWdlLCAKKyAgICAgKiB0aGUgZmlyc3Qgc3VibWl0X2JoIGNhbiBicmluZyB0aGUgcGFnZSBvdXQgb2Ygd3JpdGViYWNrLgorICAgICAqIGJlIGNhcmVmdWwgd2l0aCB0aGUgYnVmZmVycy4KKyAgICAgKi8KKyAgICBkbyB7CisgICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqbmV4dCA9IGJoLT5iX3RoaXNfcGFnZTsKKwlpZiAoYnVmZmVyX2FzeW5jX3dyaXRlKGJoKSkgeworCSAgICBzdWJtaXRfYmgoV1JJVEUsIGJoKTsKKwkgICAgbnIrKzsKKwl9CisJcHV0X2JoKGJoKTsKKwliaCA9IG5leHQ7CisgICAgfSB3aGlsZShiaCAhPSBoZWFkKTsKKworICAgIGVycm9yID0gMDsKK2RvbmU6CisgICAgaWYgKG5yID09IDApIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogaWYgdGhpcyBwYWdlIG9ubHkgaGFkIGEgZGlyZWN0IGl0ZW0sIGl0IGlzIHZlcnkgcG9zc2libGUgZm9yCisgICAgICAgICAqIG5vIGlvIHRvIGJlIHJlcXVpcmVkIHdpdGhvdXQgdGhlcmUgYmVpbmcgYW4gZXJyb3IuICBPciwgCisJICogc29tZW9uZSBlbHNlIGNvdWxkIGhhdmUgbG9ja2VkIHRoZW0gYW5kIHNlbnQgdGhlbSBkb3duIHRoZSAKKwkgKiBwaXBlIHdpdGhvdXQgbG9ja2luZyB0aGUgcGFnZQorCSAqLworCWJoID0gaGVhZCA7CisJZG8geworCSAgICBpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaCkpIHsKKwkgICAgICAgIHBhcnRpYWwgPSAxOworCQlicmVhazsKKwkgICAgfQorCSAgICBiaCA9IGJoLT5iX3RoaXNfcGFnZTsKKwl9IHdoaWxlKGJoICE9IGhlYWQpOworCWlmICghcGFydGlhbCkKKwkgICAgU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCWVuZF9wYWdlX3dyaXRlYmFjayhwYWdlKTsKKyAgICB9CisgICAgcmV0dXJuIGVycm9yOworCitmYWlsOgorICAgIC8qIGNhdGNoZXMgdmFyaW91cyBlcnJvcnMsIHdlIG5lZWQgdG8gbWFrZSBzdXJlIGFueSB2YWxpZCBkaXJ0eSBibG9ja3MKKyAgICAgKiBnZXQgdG8gdGhlIG1lZGlhLiAgVGhlIHBhZ2UgaXMgY3VycmVudGx5IGxvY2tlZCBhbmQgbm90IG1hcmtlZCBmb3IgCisgICAgICogd3JpdGViYWNrCisgICAgICovCisgICAgQ2xlYXJQYWdlVXB0b2RhdGUocGFnZSk7CisgICAgYmggPSBoZWFkOworICAgIGRvIHsKKwlnZXRfYmgoYmgpOworCWlmIChidWZmZXJfbWFwcGVkKGJoKSAmJiBidWZmZXJfZGlydHkoYmgpICYmIGJoLT5iX2Jsb2NrbnIpIHsKKwkgICAgbG9ja19idWZmZXIoYmgpOworCSAgICBtYXJrX2J1ZmZlcl9hc3luY193cml0ZShiaCk7CisJfSBlbHNlIHsKKwkgICAgLyoKKwkgICAgICogY2xlYXIgYW55IGRpcnR5IGJpdHMgdGhhdCBtaWdodCBoYXZlIGNvbWUgZnJvbSBnZXR0aW5nCisJICAgICAqIGF0dGFjaGVkIHRvIGEgZGlydHkgcGFnZQorCSAgICAgKi8KKwkgICAgIGNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisJfQorICAgICAgICBiaCA9IGJoLT5iX3RoaXNfcGFnZTsKKyAgICB9IHdoaWxlKGJoICE9IGhlYWQpOworICAgIFNldFBhZ2VFcnJvcihwYWdlKTsKKyAgICBCVUdfT04oUGFnZVdyaXRlYmFjayhwYWdlKSk7CisgICAgc2V0X3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworICAgIHVubG9ja19wYWdlKHBhZ2UpOworICAgIGRvIHsKKyAgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpuZXh0ID0gYmgtPmJfdGhpc19wYWdlOworCWlmIChidWZmZXJfYXN5bmNfd3JpdGUoYmgpKSB7CisJICAgIGNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisJICAgIHN1Ym1pdF9iaChXUklURSwgYmgpOworCSAgICBucisrOworCX0KKwlwdXRfYmgoYmgpOworCWJoID0gbmV4dDsKKyAgICB9IHdoaWxlKGJoICE9IGhlYWQpOworICAgIGdvdG8gZG9uZTsKK30KKworCitzdGF0aWMgaW50IHJlaXNlcmZzX3JlYWRwYWdlIChzdHJ1Y3QgZmlsZSAqZiwgc3RydWN0IHBhZ2UgKiBwYWdlKQoreworICAgIHJldHVybiBibG9ja19yZWFkX2Z1bGxfcGFnZSAocGFnZSwgcmVpc2VyZnNfZ2V0X2Jsb2NrKTsKK30KKworCitzdGF0aWMgaW50IHJlaXNlcmZzX3dyaXRlcGFnZSAoc3RydWN0IHBhZ2UgKiBwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKyAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdCA7CisgICAgcmVpc2VyZnNfd2FpdF9vbl93cml0ZV9ibG9jayhpbm9kZS0+aV9zYikgOworICAgIHJldHVybiByZWlzZXJmc193cml0ZV9mdWxsX3BhZ2UocGFnZSwgd2JjKSA7Cit9CisKK3N0YXRpYyBpbnQgcmVpc2VyZnNfcHJlcGFyZV93cml0ZShzdHJ1Y3QgZmlsZSAqZiwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkgICB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykgeworICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0IDsKKyAgICBpbnQgcmV0OworICAgIGludCBvbGRfcmVmID0gMDsKKworICAgIHJlaXNlcmZzX3dhaXRfb25fd3JpdGVfYmxvY2soaW5vZGUtPmlfc2IpIDsKKyAgICBmaXhfdGFpbF9wYWdlX2Zvcl93cml0aW5nKHBhZ2UpIDsKKyAgICBpZiAocmVpc2VyZnNfdHJhbnNhY3Rpb25fcnVubmluZyhpbm9kZS0+aV9zYikpIHsKKwlzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aDsKKwl0aCA9IChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICopY3VycmVudC0+am91cm5hbF9pbmZvOworICAgICAgICBCVUdfT04gKCF0aC0+dF9yZWZjb3VudCk7CisgICAgICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKwlvbGRfcmVmID0gdGgtPnRfcmVmY291bnQ7CisJdGgtPnRfcmVmY291bnQrKzsKKyAgICB9CisKKyAgICByZXQgPSBibG9ja19wcmVwYXJlX3dyaXRlKHBhZ2UsIGZyb20sIHRvLCByZWlzZXJmc19nZXRfYmxvY2spIDsKKyAgICBpZiAocmV0ICYmIHJlaXNlcmZzX3RyYW5zYWN0aW9uX3J1bm5pbmcoaW5vZGUtPmlfc2IpKSB7CisgICAgCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoID0gY3VycmVudC0+am91cm5hbF9pbmZvOworCS8qIHRoaXMgZ2V0cyBhIGxpdHRsZSB1Z2x5LiAgSWYgcmVpc2VyZnNfZ2V0X2Jsb2NrIHJldHVybmVkIGFuCisJICogZXJyb3IgYW5kIGxlZnQgYSB0cmFuc2Fjc3Rpb24gcnVubmluZywgd2UndmUgZ290IHRvIGNsb3NlIGl0LAorCSAqIGFuZCB3ZSd2ZSBnb3QgdG8gZnJlZSBoYW5kbGUgaWYgaXQgd2FzIGEgcGVyc2lzdGVudCB0cmFuc2FjdGlvbi4KKwkgKgorCSAqIEJ1dCwgaWYgd2UgaGFkIG5lc3RlZCBpbnRvIGFuIGV4aXN0aW5nIHRyYW5zYWN0aW9uLCB3ZSBuZWVkCisJICogdG8ganVzdCBkcm9wIHRoZSByZWYgY291bnQgb24gdGhlIGhhbmRsZS4KKwkgKgorCSAqIElmIG9sZF9yZWYgPT0gMCwgdGhlIHRyYW5zYWN0aW9uIGlzIGZyb20gcmVpc2VyZnNfZ2V0X2Jsb2NrLAorCSAqIGFuZCBpdCB3YXMgYSBwZXJzaXN0ZW50IHRyYW5zLiAgT3RoZXJ3aXNlLCBpdCB3YXMgbmVzdGVkIGFib3ZlLgorCSAqLworCWlmICh0aC0+dF9yZWZjb3VudCA+IG9sZF9yZWYpIHsKKwkgICAgaWYgKG9sZF9yZWYpCisJICAgIAl0aC0+dF9yZWZjb3VudC0tOworCSAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgZXJyOworCQlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKwkJZXJyID0gcmVpc2VyZnNfZW5kX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24odGgpOworCQlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworICAgICAgICAgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICAgICAgICAgIHJldCA9IGVycjsKKwkgICAgfQorCX0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKKworfQorCisKK3N0YXRpYyBzZWN0b3JfdCByZWlzZXJmc19hb3BfYm1hcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqYXMsIHNlY3Rvcl90IGJsb2NrKSB7CisgIHJldHVybiBnZW5lcmljX2Jsb2NrX2JtYXAoYXMsIGJsb2NrLCByZWlzZXJmc19ibWFwKSA7Cit9CisKK3N0YXRpYyBpbnQgcmVpc2VyZnNfY29tbWl0X3dyaXRlKHN0cnVjdCBmaWxlICpmLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCB0bykgeworICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0IDsKKyAgICBsb2ZmX3QgcG9zID0gKChsb2ZmX3QpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkgKyB0bzsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBpbnQgdXBkYXRlX3NkID0gMDsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCA9IE5VTEw7CisgICAgCisgICAgcmVpc2VyZnNfd2FpdF9vbl93cml0ZV9ibG9jayhpbm9kZS0+aV9zYikgOworICAgIGlmIChyZWlzZXJmc190cmFuc2FjdGlvbl9ydW5uaW5nKGlub2RlLT5pX3NiKSkgeworICAgICAgICB0aCA9IGN1cnJlbnQtPmpvdXJuYWxfaW5mbzsKKyAgICB9CisgICAgcmVpc2VyZnNfY29tbWl0X3BhZ2UoaW5vZGUsIHBhZ2UsIGZyb20sIHRvKTsKKyAKKyAgICAvKiBnZW5lcmljX2NvbW1pdF93cml0ZSBkb2VzIHRoaXMgZm9yIHVzLCBidXQgZG9lcyBub3QgdXBkYXRlIHRoZQorICAgICoqIHRyYW5zYWN0aW9uIHRyYWNraW5nIHN0dWZmIHdoZW4gdGhlIHNpemUgY2hhbmdlcy4gIFNvLCB3ZSBoYXZlCisgICAgKiogdG8gZG8gdGhlIGlfc2l6ZSB1cGRhdGVzIGhlcmUuCisgICAgKi8KKyAgICBpZiAocG9zID4gaW5vZGUtPmlfc2l6ZSkgeworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgbXl0aCA7CisJcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisJLyogSWYgdGhlIGZpbGUgaGF2ZSBncm93biBiZXlvbmQgdGhlIGJvcmRlciB3aGVyZSBpdAorCSAgIGNhbiBoYXZlIGEgdGFpbCwgdW5tYXJrIGl0IGFzIG5lZWRpbmcgYSB0YWlsCisJICAgcGFja2luZyAqLworCWlmICggKGhhdmVfbGFyZ2VfdGFpbHMgKGlub2RlLT5pX3NiKSAmJiBpbm9kZS0+aV9zaXplID4gaV9ibG9ja19zaXplIChpbm9kZSkqNCkgfHwKKwkgICAgIChoYXZlX3NtYWxsX3RhaWxzIChpbm9kZS0+aV9zYikgJiYgaW5vZGUtPmlfc2l6ZSA+IGlfYmxvY2tfc2l6ZShpbm9kZSkpICkKKwkgICAgUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgJj0gfmlfcGFja19vbl9jbG9zZV9tYXNrIDsKKworCXJldCA9IGpvdXJuYWxfYmVnaW4oJm15dGgsIGlub2RlLT5pX3NiLCAxKSA7CisJaWYgKHJldCkgeworCSAgICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCSAgICBnb3RvIGpvdXJuYWxfZXJyb3I7CisJfQorCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSkgOworCWlub2RlLT5pX3NpemUgPSBwb3MgOworCXJlaXNlcmZzX3VwZGF0ZV9zZCgmbXl0aCwgaW5vZGUpIDsKKwl1cGRhdGVfc2QgPSAxOworCXJldCA9IGpvdXJuYWxfZW5kKCZteXRoLCBpbm9kZS0+aV9zYiwgMSkgOworCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisJaWYgKHJldCkKKwkgICAgZ290byBqb3VybmFsX2Vycm9yOworICAgIH0KKyAgICBpZiAodGgpIHsKKwlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKwlpZiAoIXVwZGF0ZV9zZCkKKwkgICAgcmVpc2VyZnNfdXBkYXRlX3NkKHRoLCBpbm9kZSkgOworCXJldCA9IHJlaXNlcmZzX2VuZF9wZXJzaXN0ZW50X3RyYW5zYWN0aW9uKHRoKTsKKwlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworCWlmIChyZXQpCisJICAgIGdvdG8gb3V0OworICAgIH0KKyAKKyAgICAvKiB3ZSB0ZXN0IGZvciBPX1NZTkMgaGVyZSBzbyB3ZSBjYW4gY29tbWl0IHRoZSB0cmFuc2FjdGlvbgorICAgICoqIGZvciBhbnkgcGFja2VkIHRhaWxzIHRoZSBmaWxlIG1pZ2h0IGhhdmUgaGFkCisgICAgKi8KKyAgICBpZiAoZiAmJiAoZi0+Zl9mbGFncyAmIE9fU1lOQykpIHsKKwlyZWlzZXJmc193cml0ZV9sb2NrKGlub2RlLT5pX3NiKTsKKyAJcmV0ID0gcmVpc2VyZnNfY29tbWl0X2Zvcl9pbm9kZShpbm9kZSkgOworCXJlaXNlcmZzX3dyaXRlX3VubG9jayhpbm9kZS0+aV9zYik7CisgICAgfQorb3V0OgorICAgIHJldHVybiByZXQgOworCitqb3VybmFsX2Vycm9yOgorICAgIGlmICh0aCkgeworCXJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCWlmICghdXBkYXRlX3NkKQorCSAgICByZWlzZXJmc191cGRhdGVfc2QodGgsIGlub2RlKSA7CisgICAgICAgIHJldCA9IHJlaXNlcmZzX2VuZF9wZXJzaXN0ZW50X3RyYW5zYWN0aW9uKHRoKTsKKwlyZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgc2RfYXR0cnNfdG9faV9hdHRycyggX191MTYgc2RfYXR0cnMsIHN0cnVjdCBpbm9kZSAqaW5vZGUgKQoreworCWlmKCByZWlzZXJmc19hdHRycyggaW5vZGUgLT4gaV9zYiApICkgeworCQlpZiggc2RfYXR0cnMgJiBSRUlTRVJGU19TWU5DX0ZMICkKKwkJCWlub2RlIC0+IGlfZmxhZ3MgfD0gU19TWU5DOworCQllbHNlCisJCQlpbm9kZSAtPiBpX2ZsYWdzICY9IH5TX1NZTkM7CisJCWlmKCBzZF9hdHRycyAmIFJFSVNFUkZTX0lNTVVUQUJMRV9GTCApCisJCQlpbm9kZSAtPiBpX2ZsYWdzIHw9IFNfSU1NVVRBQkxFOworCQllbHNlCisJCQlpbm9kZSAtPiBpX2ZsYWdzICY9IH5TX0lNTVVUQUJMRTsKKwkJaWYoIHNkX2F0dHJzICYgUkVJU0VSRlNfQVBQRU5EX0ZMICkKKwkJCWlub2RlIC0+IGlfZmxhZ3MgfD0gU19BUFBFTkQ7CisJCWVsc2UKKwkJCWlub2RlIC0+IGlfZmxhZ3MgJj0gflNfQVBQRU5EOworCQlpZiggc2RfYXR0cnMgJiBSRUlTRVJGU19OT0FUSU1FX0ZMICkKKwkJCWlub2RlIC0+IGlfZmxhZ3MgfD0gU19OT0FUSU1FOworCQllbHNlCisJCQlpbm9kZSAtPiBpX2ZsYWdzICY9IH5TX05PQVRJTUU7CisJCWlmKCBzZF9hdHRycyAmIFJFSVNFUkZTX05PVEFJTF9GTCApCisJCQlSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyB8PSBpX25vcGFja19tYXNrOworCQllbHNlCisJCQlSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmPSB+aV9ub3BhY2tfbWFzazsKKwl9Cit9CisKK3ZvaWQgaV9hdHRyc190b19zZF9hdHRycyggc3RydWN0IGlub2RlICppbm9kZSwgX191MTYgKnNkX2F0dHJzICkKK3sKKwlpZiggcmVpc2VyZnNfYXR0cnMoIGlub2RlIC0+IGlfc2IgKSApIHsKKwkJaWYoIGlub2RlIC0+IGlfZmxhZ3MgJiBTX0lNTVVUQUJMRSApCisJCQkqc2RfYXR0cnMgfD0gUkVJU0VSRlNfSU1NVVRBQkxFX0ZMOworCQllbHNlCisJCQkqc2RfYXR0cnMgJj0gflJFSVNFUkZTX0lNTVVUQUJMRV9GTDsKKwkJaWYoIGlub2RlIC0+IGlfZmxhZ3MgJiBTX1NZTkMgKQorCQkJKnNkX2F0dHJzIHw9IFJFSVNFUkZTX1NZTkNfRkw7CisJCWVsc2UKKwkJCSpzZF9hdHRycyAmPSB+UkVJU0VSRlNfU1lOQ19GTDsKKwkJaWYoIGlub2RlIC0+IGlfZmxhZ3MgJiBTX05PQVRJTUUgKQorCQkJKnNkX2F0dHJzIHw9IFJFSVNFUkZTX05PQVRJTUVfRkw7CisJCWVsc2UKKwkJCSpzZF9hdHRycyAmPSB+UkVJU0VSRlNfTk9BVElNRV9GTDsKKwkJaWYoIFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICYgaV9ub3BhY2tfbWFzayApCisJCQkqc2RfYXR0cnMgfD0gUkVJU0VSRlNfTk9UQUlMX0ZMOworCQllbHNlCisJCQkqc2RfYXR0cnMgJj0gflJFSVNFUkZTX05PVEFJTF9GTDsKKwl9Cit9CisKKy8qIGRlY2lkZSBpZiB0aGlzIGJ1ZmZlciBuZWVkcyB0byBzdGF5IGFyb3VuZCBmb3IgZGF0YSBsb2dnaW5nIG9yIG9yZGVyZWQKKyoqIHdyaXRlIHB1cnBvc2VzCisqLworc3RhdGljIGludCBpbnZhbGlkYXRlcGFnZV9jYW5fZHJvcChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworICAgIGludCByZXQgPSAxIDsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqaiA9IFNCX0pPVVJOQUwoaW5vZGUtPmlfc2IpIDsKKworICAgIHNwaW5fbG9jaygmai0+al9kaXJ0eV9idWZmZXJzX2xvY2spIDsKKyAgICBpZiAoIWJ1ZmZlcl9tYXBwZWQoYmgpKSB7CisgICAgICAgIGdvdG8gZnJlZV9qaDsKKyAgICB9CisgICAgLyogdGhlIHBhZ2UgaXMgbG9ja2VkLCBhbmQgdGhlIG9ubHkgcGxhY2VzIHRoYXQgbG9nIGEgZGF0YSBidWZmZXIKKyAgICAgKiBhbHNvIGxvY2sgdGhlIHBhZ2UuCisgICAgICovCisgICAgaWYgKHJlaXNlcmZzX2ZpbGVfZGF0YV9sb2coaW5vZGUpKSB7CisJLyoKKwkgKiB2ZXJ5IGNvbnNlcnZhdGl2ZSwgbGVhdmUgdGhlIGJ1ZmZlciBwaW5uZWQgaWYKKwkgKiBhbnlvbmUgbWlnaHQgbmVlZCBpdC4KKwkgKi8KKyAgICAgICAgaWYgKGJ1ZmZlcl9qb3VybmFsZWQoYmgpIHx8IGJ1ZmZlcl9qb3VybmFsX2RpcnR5KGJoKSkgeworCSAgICByZXQgPSAwIDsKKwl9CisgICAgfSBlbHNlCisgICAgaWYgKGJ1ZmZlcl9kaXJ0eShiaCkgfHwgYnVmZmVyX2xvY2tlZChiaCkpIHsKKwlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbDsKKwlzdHJ1Y3QgcmVpc2VyZnNfamggKmpoID0gYmgtPmJfcHJpdmF0ZTsKKworCS8qIHdoeSBpcyB0aGlzIHNhZmU/CisJICogcmVpc2VyZnNfc2V0YXR0ciB1cGRhdGVzIGlfc2l6ZSBpbiB0aGUgb24gZGlzaworCSAqIHN0YXQgZGF0YSBiZWZvcmUgYWxsb3dpbmcgdm10cnVuY2F0ZSB0byBiZSBjYWxsZWQuCisJICoKKwkgKiBJZiBidWZmZXIgd2FzIHB1dCBvbnRvIHRoZSBvcmRlcmVkIGxpc3QgZm9yIHRoaXMKKwkgKiB0cmFuc2FjdGlvbiwgd2Uga25vdyBmb3Igc3VyZSBlaXRoZXIgdGhpcyB0cmFuc2FjdGlvbgorCSAqIG9yIGFuIG9sZGVyIG9uZSBhbHJlYWR5IGhhcyB1cGRhdGVkIGlfc2l6ZSBvbiBkaXNrLAorCSAqIGFuZCB0aGlzIG9yZGVyZWQgZGF0YSB3b24ndCBiZSByZWZlcmVuY2VkIGluIHRoZSBmaWxlCisJICogaWYgd2UgY3Jhc2guCisJICoKKwkgKiBpZiB0aGUgYnVmZmVyIHdhcyBwdXQgb250byB0aGUgb3JkZXJlZCBsaXN0IGZvciBhbiBvbGRlcgorCSAqIHRyYW5zYWN0aW9uLCB3ZSBuZWVkIHRvIGxlYXZlIGl0IGFyb3VuZAorCSAqLworCWlmIChqaCAmJiAoamwgPSBqaC0+amwpICYmIGpsICE9IFNCX0pPVVJOQUwoaW5vZGUtPmlfc2IpLT5qX2N1cnJlbnRfamwpCisJICAgIHJldCA9IDA7CisgICAgfQorZnJlZV9qaDoKKyAgICBpZiAocmV0ICYmIGJoLT5iX3ByaXZhdGUpIHsKKyAgICAgICAgcmVpc2VyZnNfZnJlZV9qaChiaCk7CisgICAgfQorICAgIHNwaW5fdW5sb2NrKCZqLT5qX2RpcnR5X2J1ZmZlcnNfbG9jaykgOworICAgIHJldHVybiByZXQgOworfQorCisvKiBjbG0gLS0gdGFrZW4gZnJvbSBmcy9idWZmZXIuYzpibG9ja19pbnZhbGlkYXRlX3BhZ2UgKi8KK3N0YXRpYyBpbnQgcmVpc2VyZnNfaW52YWxpZGF0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZCwgKmJoLCAqbmV4dDsKKyAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKyAgICB1bnNpZ25lZCBpbnQgY3Vycl9vZmYgPSAwOworICAgIGludCByZXQgPSAxOworCisgICAgQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKKworICAgIGlmIChvZmZzZXQgPT0gMCkKKwlDbGVhclBhZ2VDaGVja2VkKHBhZ2UpOworCisgICAgaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKQorCWdvdG8gb3V0OworCisgICAgaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKyAgICBiaCA9IGhlYWQ7CisgICAgZG8geworCXVuc2lnbmVkIGludCBuZXh0X29mZiA9IGN1cnJfb2ZmICsgYmgtPmJfc2l6ZTsKKwluZXh0ID0gYmgtPmJfdGhpc19wYWdlOworCisJLyoKKwkgKiBpcyB0aGlzIGJsb2NrIGZ1bGx5IGludmFsaWRhdGVkPworCSAqLworCWlmIChvZmZzZXQgPD0gY3Vycl9vZmYpIHsKKwkgICAgaWYgKGludmFsaWRhdGVwYWdlX2Nhbl9kcm9wKGlub2RlLCBiaCkpCisJCXJlaXNlcmZzX3VubWFwX2J1ZmZlcihiaCk7CisJICAgIGVsc2UKKwkgICAgICAgIHJldCA9IDA7CisJfQorCWN1cnJfb2ZmID0gbmV4dF9vZmY7CisJYmggPSBuZXh0OworICAgIH0gd2hpbGUgKGJoICE9IGhlYWQpOworCisgICAgLyoKKyAgICAgKiBXZSByZWxlYXNlIGJ1ZmZlcnMgb25seSBpZiB0aGUgZW50aXJlIHBhZ2UgaXMgYmVpbmcgaW52YWxpZGF0ZWQuCisgICAgICogVGhlIGdldF9ibG9jayBjYWNoZWQgdmFsdWUgaGFzIGJlZW4gdW5jb25kaXRpb25hbGx5IGludmFsaWRhdGVkLAorICAgICAqIHNvIHJlYWwgSU8gaXMgbm90IHBvc3NpYmxlIGFueW1vcmUuCisgICAgICovCisgICAgaWYgKCFvZmZzZXQgJiYgcmV0KQorCXJldCA9IHRyeV90b19yZWxlYXNlX3BhZ2UocGFnZSwgMCk7CitvdXQ6CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByZWlzZXJmc19zZXRfcGFnZV9kaXJ0eShzdHJ1Y3QgcGFnZSAqcGFnZSkgeworICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworICAgIGlmIChyZWlzZXJmc19maWxlX2RhdGFfbG9nKGlub2RlKSkgeworCVNldFBhZ2VDaGVja2VkKHBhZ2UpOworCXJldHVybiBfX3NldF9wYWdlX2RpcnR5X25vYnVmZmVycyhwYWdlKTsKKyAgICB9CisgICAgcmV0dXJuIF9fc2V0X3BhZ2VfZGlydHlfYnVmZmVycyhwYWdlKTsKK30KKworLyoKKyAqIFJldHVybnMgMSBpZiB0aGUgcGFnZSdzIGJ1ZmZlcnMgd2VyZSBkcm9wcGVkLiAgVGhlIHBhZ2UgaXMgbG9ja2VkLgorICoKKyAqIFRha2VzIGpfZGlydHlfYnVmZmVyc19sb2NrIHRvIHByb3RlY3QgdGhlIGJfYXNzb2NfYnVmZmVycyBsaXN0X2hlYWRzCisgKiBpbiB0aGUgYnVmZmVycyBhdCBwYWdlX2J1ZmZlcnMocGFnZSkuCisgKgorICogZXZlbiBpbiAtbyBub3RhaWwgbW9kZSwgd2UgY2FuJ3QgYmUgc3VyZSBhbiBvbGQgbW91bnQgd2l0aG91dCAtbyBub3RhaWwKKyAqIGRpZG4ndCBjcmVhdGUgZmlsZXMgd2l0aCB0YWlscy4KKyAqLworc3RhdGljIGludCByZWlzZXJmc19yZWxlYXNlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IHVudXNlZF9nZnBfZmxhZ3MpCit7CisgICAgc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3QgOworICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqID0gU0JfSk9VUk5BTChpbm9kZS0+aV9zYikgOworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZCA7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA7CisgICAgaW50IHJldCA9IDEgOworCisgICAgV0FSTl9PTihQYWdlQ2hlY2tlZChwYWdlKSk7CisgICAgc3Bpbl9sb2NrKCZqLT5qX2RpcnR5X2J1ZmZlcnNfbG9jaykgOworICAgIGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSkgOworICAgIGJoID0gaGVhZCA7CisgICAgZG8geworCWlmIChiaC0+Yl9wcml2YXRlKSB7CisJICAgIGlmICghYnVmZmVyX2RpcnR5KGJoKSAmJiAhYnVmZmVyX2xvY2tlZChiaCkpIHsKKwkJcmVpc2VyZnNfZnJlZV9qaChiaCk7CisJICAgIH0gZWxzZSB7CisJCXJldCA9IDAgOworCQlicmVhayA7CisJICAgIH0KKwl9CisJYmggPSBiaC0+Yl90aGlzX3BhZ2UgOworICAgIH0gd2hpbGUgKGJoICE9IGhlYWQpIDsKKyAgICBpZiAocmV0KQorCXJldCA9IHRyeV90b19mcmVlX2J1ZmZlcnMocGFnZSkgOworICAgIHNwaW5fdW5sb2NrKCZqLT5qX2RpcnR5X2J1ZmZlcnNfbG9jaykgOworICAgIHJldHVybiByZXQgOworfQorCisvKiBXZSB0aGFuayBNaW5nbWluZyBDYW8gZm9yIGhlbHBpbmcgdXMgdW5kZXJzdGFuZCBpbiBncmVhdCBkZXRhaWwgd2hhdAorICAgdG8gZG8gaW4gdGhpcyBzZWN0aW9uIG9mIHRoZSBjb2RlLiAqLworc3RhdGljIHNzaXplX3QgcmVpc2VyZnNfZGlyZWN0X0lPKGludCBydywgc3RydWN0IGtpb2NiICppb2NiLAorCQljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgbG9mZl90IG9mZnNldCwgdW5zaWduZWQgbG9uZyBucl9zZWdzKQoreworICAgIHN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKKyAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OworCisgICAgcmV0dXJuIGJsb2NrZGV2X2RpcmVjdF9JTyhydywgaW9jYiwgaW5vZGUsIGlub2RlLT5pX3NiLT5zX2JkZXYsIGlvdiwKKwkJCW9mZnNldCwgbnJfc2VncywgcmVpc2VyZnNfZ2V0X2Jsb2Nrc19kaXJlY3RfaW8sIE5VTEwpOworfQorCitpbnQgcmVpc2VyZnNfc2V0YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpYXR0ciAqYXR0cikgeworICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGUgOworICAgIGludCBlcnJvciA7CisgICAgdW5zaWduZWQgaW50IGlhX3ZhbGlkID0gYXR0ci0+aWFfdmFsaWQ7CisgICAgcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisgICAgaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9TSVpFKSB7CisJLyogdmVyc2lvbiAyIGl0ZW1zIHdpbGwgYmUgY2F1Z2h0IGJ5IHRoZSBzX21heGJ5dGVzIGNoZWNrCisJKiogZG9uZSBmb3IgdXMgaW4gdm10cnVuY2F0ZQorCSovCisJaWYgKGdldF9pbm9kZV9pdGVtX2tleV92ZXJzaW9uKGlub2RlKSA9PSBLRVlfRk9STUFUXzNfNSAmJgorCSAgICBhdHRyLT5pYV9zaXplID4gTUFYX05PTl9MRlMpIHsKKwkgICAgZXJyb3IgPSAtRUZCSUcgOworCSAgICBnb3RvIG91dDsKKwl9CisJLyogZmlsbCBpbiBob2xlIHBvaW50ZXJzIGluIHRoZSBleHBhbmRpbmcgdHJ1bmNhdGUgY2FzZS4gKi8KKyAgICAgICAgaWYgKGF0dHItPmlhX3NpemUgPiBpbm9kZS0+aV9zaXplKSB7CisJICAgIGVycm9yID0gZ2VuZXJpY19jb250X2V4cGFuZChpbm9kZSwgYXR0ci0+aWFfc2l6ZSkgOworCSAgICBpZiAoUkVJU0VSRlNfSShpbm9kZSktPmlfcHJlYWxsb2NfY291bnQgPiAwKSB7CisJCWludCBlcnI7CisJCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGggOworCQkvKiB3ZSdyZSBjaGFuZ2luZyBhdCBtb3N0IDIgYml0bWFwcywgaW5vZGUgKyBzdXBlciAqLworCQllcnIgPSBqb3VybmFsX2JlZ2luKCZ0aCwgaW5vZGUtPmlfc2IsIDQpIDsKKwkJaWYgKCFlcnIpIHsKKwkJICAgIHJlaXNlcmZzX2Rpc2NhcmRfcHJlYWxsb2MgKCZ0aCwgaW5vZGUpOworCQkgICAgZXJyID0gam91cm5hbF9lbmQoJnRoLCBpbm9kZS0+aV9zYiwgNCkgOworCQl9CisJCWlmIChlcnIpCisJCSAgICBlcnJvciA9IGVycjsKKwkgICAgfQorCSAgICBpZiAoZXJyb3IpCisJICAgICAgICBnb3RvIG91dDsKKwl9CisgICAgfQorCisgICAgaWYgKCgoKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9VSUQpICYmIChhdHRyLT5pYV91aWQgJiB+MHhmZmZmKSkgfHwKKwkgKChhdHRyLT5pYV92YWxpZCAmIEFUVFJfR0lEKSAmJiAoYXR0ci0+aWFfZ2lkICYgfjB4ZmZmZikpKSAmJgorCShnZXRfaW5vZGVfc2RfdmVyc2lvbiAoaW5vZGUpID09IFNUQVRfREFUQV9WMSkpIHsKKwkJLyogc3RhdCBkYXRhIG9mIGZvcm1hdCB2My41IGhhcyAxNiBiaXQgdWlkIGFuZCBnaWQgKi8KKwkgICAgZXJyb3IgPSAtRUlOVkFMOworCSAgICBnb3RvIG91dDsKKwl9CisKKyAgICBlcnJvciA9IGlub2RlX2NoYW5nZV9vayhpbm9kZSwgYXR0cikgOworICAgIGlmICghZXJyb3IpIHsKKwlpZiAoKGlhX3ZhbGlkICYgQVRUUl9VSUQgJiYgYXR0ci0+aWFfdWlkICE9IGlub2RlLT5pX3VpZCkgfHwKKwkgICAgKGlhX3ZhbGlkICYgQVRUUl9HSUQgJiYgYXR0ci0+aWFfZ2lkICE9IGlub2RlLT5pX2dpZCkpIHsKKyAgICAgICAgICAgICAgICBlcnJvciA9IHJlaXNlcmZzX2Nob3duX3hhdHRycyAoaW5vZGUsIGF0dHIpOworCisgICAgICAgICAgICAgICAgaWYgKCFlcnJvcikgeworCQkgICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKworCQkgICAgLyogKHVzZXIrZ3JvdXApKihvbGQrbmV3KSBzdHJ1Y3R1cmUgLSB3ZSBjb3VudCBxdW90YSBpbmZvIGFuZCAsIGlub2RlIHdyaXRlIChzYiwgaW5vZGUpICovCisJCSAgICBqb3VybmFsX2JlZ2luKCZ0aCwgaW5vZGUtPmlfc2IsIDQqUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MrMik7CisgICAgICAgICAgICAgICAgICAgIGVycm9yID0gRFFVT1RfVFJBTlNGRVIoaW5vZGUsIGF0dHIpID8gLUVEUVVPVCA6IDA7CisJCSAgICBpZiAoZXJyb3IpIHsKKwkJCWpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsIDQqUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MrMik7CisJCQlnb3RvIG91dDsKKwkJICAgIH0KKwkJICAgIC8qIFVwZGF0ZSBjb3JyZXNwb25kaW5nIGluZm8gaW4gaW5vZGUgc28gdGhhdCBldmVyeXRoaW5nIGlzIGluCisJCSAgICAgKiBvbmUgdHJhbnNhY3Rpb24gKi8KKwkJICAgIGlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfVUlEKQorCQkJaW5vZGUtPmlfdWlkID0gYXR0ci0+aWFfdWlkOworCQkgICAgaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9HSUQpCisJCQlpbm9kZS0+aV9naWQgPSBhdHRyLT5pYV9naWQ7CisJCSAgICBtYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJICAgIGpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsIDQqUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MrMik7CisJCX0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWVycm9yKQorICAgICAgICAgICAgZXJyb3IgPSBpbm9kZV9zZXRhdHRyKGlub2RlLCBhdHRyKSA7CisgICAgfQorCisKKyAgICBpZiAoIWVycm9yICYmIHJlaXNlcmZzX3Bvc2l4YWNsIChpbm9kZS0+aV9zYikpIHsKKyAgICAgICAgaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9NT0RFKQorICAgICAgICAgICAgZXJyb3IgPSByZWlzZXJmc19hY2xfY2htb2QgKGlub2RlKTsKKyAgICB9CisKK291dDoKKyAgICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworICAgIHJldHVybiBlcnJvciA7Cit9CisKKworCitzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHJlaXNlcmZzX2FkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyA9IHsKKyAgICAud3JpdGVwYWdlID0gcmVpc2VyZnNfd3JpdGVwYWdlLAorICAgIC5yZWFkcGFnZSA9IHJlaXNlcmZzX3JlYWRwYWdlLCAKKyAgICAucmVhZHBhZ2VzID0gcmVpc2VyZnNfcmVhZHBhZ2VzLCAKKyAgICAucmVsZWFzZXBhZ2UgPSByZWlzZXJmc19yZWxlYXNlcGFnZSwKKyAgICAuaW52YWxpZGF0ZXBhZ2UgPSByZWlzZXJmc19pbnZhbGlkYXRlcGFnZSwKKyAgICAuc3luY19wYWdlID0gYmxvY2tfc3luY19wYWdlLAorICAgIC5wcmVwYXJlX3dyaXRlID0gcmVpc2VyZnNfcHJlcGFyZV93cml0ZSwKKyAgICAuY29tbWl0X3dyaXRlID0gcmVpc2VyZnNfY29tbWl0X3dyaXRlLAorICAgIC5ibWFwID0gcmVpc2VyZnNfYW9wX2JtYXAsCisgICAgLmRpcmVjdF9JTyA9IHJlaXNlcmZzX2RpcmVjdF9JTywKKyAgICAuc2V0X3BhZ2VfZGlydHkgPSByZWlzZXJmc19zZXRfcGFnZV9kaXJ0eSwKK30gOwpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvaW9jdGwuYyBiL2ZzL3JlaXNlcmZzL2lvY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRkYzQyNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3JlaXNlcmZzL2lvY3RsLmMKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMCBieSBIYW5zIFJlaXNlciwgbGljZW5zaW5nIGdvdmVybmVkIGJ5IHJlaXNlcmZzL1JFQURNRQorICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisKK3N0YXRpYyBpbnQgcmVpc2VyZnNfdW5wYWNrIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxwKTsKKworLyoKKyoqIHJlaXNlcmZzX2lvY3RsIC0gaGFuZGxlciBmb3IgaW9jdGwgZm9yIGlub2RlCisqKiBzdXBwb3J0ZWQgY29tbWFuZHM6CisqKiAgMSkgUkVJU0VSRlNfSU9DX1VOUEFDSyAtIHRyeSB0byB1bnBhY2sgdGFpbCBmcm9tIGRpcmVjdCBpdGVtIGludG8gaW5kaXJlY3QKKyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHByZXZlbnQgcGFja2luZyBmaWxlIChhcmd1bWVudCBhcmcgaGFzIHRvIGJlIG5vbi16ZXJvKQorKiogIDIpIFJFSVNFUkZTX0lPQ19bR1NdRVRGTEFHUywgUkVJU0VSRlNfSU9DX1tHU11FVFZFUlNJT04KKyoqICAzKSBUaGF0J3MgYWxsIGZvciBhIHdoaWxlIC4uLgorKi8KK2ludCByZWlzZXJmc19pb2N0bCAoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCwgdW5zaWduZWQgaW50IGNtZCwKKwkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdW5zaWduZWQgaW50IGZsYWdzOworCisJc3dpdGNoIChjbWQpIHsKKwkgICAgY2FzZSBSRUlTRVJGU19JT0NfVU5QQUNLOgorCQlpZiggU19JU1JFRyggaW5vZGUgLT4gaV9tb2RlICkgKSB7CisJCWlmIChhcmcpCisJCSAgICByZXR1cm4gcmVpc2VyZnNfdW5wYWNrIChpbm9kZSwgZmlscCk7CisJCQllbHNlCisJCQkJcmV0dXJuIDA7CisJCX0gZWxzZQorCQkJcmV0dXJuIC1FTk9UVFk7CisJLyogZm9sbG93aW5nIHR3byBjYXNlcyBhcmUgdGFrZW4gZnJvbSBmcy9leHQyL2lvY3RsLmMgYnkgUmVteQorCSAgIENhcmQgKGNhcmRAbWFzaS5pYnAuZnIpICovCisJY2FzZSBSRUlTRVJGU19JT0NfR0VURkxBR1M6CisJCWZsYWdzID0gUkVJU0VSRlNfSShpbm9kZSkgLT4gaV9hdHRyczsKKwkJaV9hdHRyc190b19zZF9hdHRycyggaW5vZGUsICggX191MTYgKiApICZmbGFncyApOworCQlyZXR1cm4gcHV0X3VzZXIoZmxhZ3MsIChpbnQgX191c2VyICopIGFyZyk7CisJY2FzZSBSRUlTRVJGU19JT0NfU0VURkxBR1M6IHsKKwkJaWYgKElTX1JET05MWShpbm9kZSkpCisJCQlyZXR1cm4gLUVST0ZTOworCisJCWlmICgoY3VycmVudC0+ZnN1aWQgIT0gaW5vZGUtPmlfdWlkKSAmJiAhY2FwYWJsZShDQVBfRk9XTkVSKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJaWYgKGdldF91c2VyKGZsYWdzLCAoaW50IF9fdXNlciAqKSBhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKCAoICggZmxhZ3MgXiBSRUlTRVJGU19JKGlub2RlKSAtPiBpX2F0dHJzKSAmICggUkVJU0VSRlNfSU1NVVRBQkxFX0ZMIHwgUkVJU0VSRlNfQVBQRU5EX0ZMKSkgJiYKKwkJICAgICAhY2FwYWJsZSggQ0FQX0xJTlVYX0lNTVVUQUJMRSApICkKKwkJCXJldHVybiAtRVBFUk07CisJCQkKKwkJaWYoICggZmxhZ3MgJiBSRUlTRVJGU19OT1RBSUxfRkwgKSAmJgorCQkgICAgU19JU1JFRyggaW5vZGUgLT4gaV9tb2RlICkgKSB7CisJCQkJaW50IHJlc3VsdDsKKworCQkJCXJlc3VsdCA9IHJlaXNlcmZzX3VucGFjayggaW5vZGUsIGZpbHAgKTsKKwkJCQlpZiggcmVzdWx0ICkKKwkJCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCQlzZF9hdHRyc190b19pX2F0dHJzKCBmbGFncywgaW5vZGUgKTsKKwkJUkVJU0VSRlNfSShpbm9kZSkgLT4gaV9hdHRycyA9IGZsYWdzOworCQlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQlyZXR1cm4gMDsKKwl9CisJY2FzZSBSRUlTRVJGU19JT0NfR0VUVkVSU0lPTjoKKwkJcmV0dXJuIHB1dF91c2VyKGlub2RlLT5pX2dlbmVyYXRpb24sIChpbnQgX191c2VyICopIGFyZyk7CisJY2FzZSBSRUlTRVJGU19JT0NfU0VUVkVSU0lPTjoKKwkJaWYgKChjdXJyZW50LT5mc3VpZCAhPSBpbm9kZS0+aV91aWQpICYmICFjYXBhYmxlKENBUF9GT1dORVIpKQorCQkJcmV0dXJuIC1FUEVSTTsKKwkJaWYgKElTX1JET05MWShpbm9kZSkpCisJCQlyZXR1cm4gLUVST0ZTOworCQlpZiAoZ2V0X3VzZXIoaW5vZGUtPmlfZ2VuZXJhdGlvbiwgKGludCBfX3VzZXIgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOwkKKwkJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9UVFk7CisJfQorfQorCisvKgorKiogcmVpc2VyZnNfdW5wYWNrCisqKiBGdW5jdGlvbiB0cnkgdG8gY29udmVydCB0YWlsIGZyb20gZGlyZWN0IGl0ZW0gaW50byBpbmRpcmVjdC4KKyoqIEl0IHNldCB1cCBub3BhY2sgYXR0cmlidXRlIGluIHRoZSBSRUlTRVJGU19JKGlub2RlKS0+bm9wYWNrCisqLworc3RhdGljIGludCByZWlzZXJmc191bnBhY2sgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbHApCit7CisgICAgaW50IHJldHZhbCA9IDA7CisgICAgaW50IGluZGV4IDsKKyAgICBzdHJ1Y3QgcGFnZSAqcGFnZSA7CisgICAgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgOworICAgIHVuc2lnbmVkIGxvbmcgd3JpdGVfZnJvbSA7CisgICAgdW5zaWduZWQgbG9uZyBibG9ja3NpemUgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgOworICAgIAkKKyAgICBpZiAoaW5vZGUtPmlfc2l6ZSA9PSAwKSB7CisgICAgICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzIHw9IGlfbm9wYWNrX21hc2s7CisgICAgICAgIHJldHVybiAwIDsKKyAgICB9CisgICAgLyogaW9jdGwgYWxyZWFkeSBkb25lICovCisgICAgaWYgKFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzICYgaV9ub3BhY2tfbWFzaykgeworICAgICAgICByZXR1cm4gMCA7CisgICAgfQorICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soaW5vZGUtPmlfc2IpOworCisgICAgLyogd2UgbmVlZCB0byBtYWtlIHN1cmUgbm9ib2R5IGlzIGNoYW5naW5nIHRoZSBmaWxlIHNpemUgYmVuZWF0aAorICAgICoqIHVzCisgICAgKi8KKyAgICBkb3duKCZpbm9kZS0+aV9zZW0pIDsKKworICAgIHdyaXRlX2Zyb20gPSBpbm9kZS0+aV9zaXplICYgKGJsb2Nrc2l6ZSAtIDEpIDsKKyAgICAvKiBpZiB3ZSBhcmUgb24gYSBibG9jayBib3VuZGFyeSwgd2UgYXJlIGFscmVhZHkgdW5wYWNrZWQuICAqLworICAgIGlmICggd3JpdGVfZnJvbSA9PSAwKSB7CisJUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgfD0gaV9ub3BhY2tfbWFzazsKKwlnb3RvIG91dCA7CisgICAgfQorCisgICAgLyogd2UgdW5wYWNrIGJ5IGZpbmRpbmcgdGhlIHBhZ2Ugd2l0aCB0aGUgdGFpbCwgYW5kIGNhbGxpbmcKKyAgICAqKiByZWlzZXJmc19wcmVwYXJlX3dyaXRlIG9uIHRoYXQgcGFnZS4gIFRoaXMgd2lsbCBmb3JjZSBhIAorICAgICoqIHJlaXNlcmZzX2dldF9ibG9jayB0byB1bnBhY2sgdGhlIHRhaWwgZm9yIHVzLgorICAgICovCisgICAgaW5kZXggPSBpbm9kZS0+aV9zaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQgOworICAgIG1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nIDsKKyAgICBwYWdlID0gZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsIGluZGV4KSA7CisgICAgcmV0dmFsID0gLUVOT01FTTsKKyAgICBpZiAoIXBhZ2UpIHsKKyAgICAgICAgZ290byBvdXQgOworICAgIH0KKyAgICByZXR2YWwgPSBtYXBwaW5nLT5hX29wcy0+cHJlcGFyZV93cml0ZShOVUxMLCBwYWdlLCB3cml0ZV9mcm9tLCB3cml0ZV9mcm9tKSA7CisgICAgaWYgKHJldHZhbCkKKyAgICAgICAgZ290byBvdXRfdW5sb2NrIDsKKworICAgIC8qIGNvbnZlcnNpb24gY2FuIGNoYW5nZSBwYWdlIGNvbnRlbnRzLCBtdXN0IGZsdXNoICovCisgICAgZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSkgOworICAgIHJldHZhbCA9IG1hcHBpbmctPmFfb3BzLT5jb21taXRfd3JpdGUoTlVMTCwgcGFnZSwgd3JpdGVfZnJvbSwgd3JpdGVfZnJvbSkgOworICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzIHw9IGlfbm9wYWNrX21hc2s7CisKK291dF91bmxvY2s6CisgICAgdW5sb2NrX3BhZ2UocGFnZSkgOworICAgIHBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKSA7CisKK291dDoKKyAgICB1cCgmaW5vZGUtPmlfc2VtKSA7CisgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGlub2RlLT5pX3NiKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvaXRlbV9vcHMuYyBiL2ZzL3JlaXNlcmZzL2l0ZW1fb3BzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNmN2MxMwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3JlaXNlcmZzL2l0ZW1fb3BzLmMKQEAgLTAsMCArMSw3ODggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMCBieSBIYW5zIFJlaXNlciwgbGljZW5zaW5nIGdvdmVybmVkIGJ5IHJlaXNlcmZzL1JFQURNRQorICovCisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfZnMuaD4KKworLy8gdGhpcyBjb250YWlucyBpdGVtIGhhbmRsZXJzIGZvciBvbGQgaXRlbSB0eXBlczogc2QsIGRpcmVjdCwKKy8vIGluZGlyZWN0LCBkaXJlY3RvcnkKKworLyogYW5kIHdoZXJlIGFyZSB0aGUgY29tbWVudHM/IGhvdyBhYm91dCBzYXlpbmcgd2hlcmUgd2UgY2FuIGZpbmQgYW4KKyAgIGV4cGxhbmF0aW9uIG9mIGVhY2ggaXRlbSBoYW5kbGVyIG1ldGhvZD8gLUhhbnMgKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBzdGF0IGRhdGEgZnVuY3Rpb25zCisvLworc3RhdGljIGludCBzZF9ieXRlc19udW1iZXIgKHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgaW50IGJsb2NrX3NpemUpCit7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZF9kZWNyZW1lbnRfa2V5IChzdHJ1Y3QgY3B1X2tleSAqIGtleSkKK3sKKyAgICBrZXktPm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQgLS07CisgICAgc2V0X2NwdV9rZXlfa190eXBlIChrZXksIFRZUEVfQU5ZKTsKKyAgICBzZXRfY3B1X2tleV9rX29mZnNldChrZXksIChsb2ZmX3QpKC0xKSk7Cit9CisKK3N0YXRpYyBpbnQgc2RfaXNfbGVmdF9tZXJnZWFibGUgKHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXksIHVuc2lnbmVkIGxvbmcgYnNpemUpCit7CisgICAgcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgY2hhciAqIHByaW50X3RpbWUgKHRpbWVfdCB0KQoreworICAgIHN0YXRpYyBjaGFyIHRpbWVidWZbMjU2XTsKKworICAgIHNwcmludGYgKHRpbWVidWYsICIlbGQiLCB0KTsKKyAgICByZXR1cm4gdGltZWJ1ZjsKK30KKworCitzdGF0aWMgdm9pZCBzZF9wcmludF9pdGVtIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGNoYXIgKiBpdGVtKQoreworICAgIHByaW50ayAoIlx0bW9kZSB8IHNpemUgfCBubGlua3MgfCBmaXJzdCBkaXJlY3QgfCBtdGltZVxuIik7CisgICAgaWYgKHN0YXRfZGF0YV92MSAoaWgpKSB7CisgICAgICAJc3RydWN0IHN0YXRfZGF0YV92MSAqIHNkID0gKHN0cnVjdCBzdGF0X2RhdGFfdjEgKilpdGVtOworCisJcHJpbnRrICgiXHQwJS02byB8ICU2dSB8ICUydSB8ICVkIHwgJXNcbiIsIHNkX3YxX21vZGUoc2QpLAorICAgICAgICAgICAgICAgIHNkX3YxX3NpemUoc2QpLCBzZF92MV9ubGluayhzZCksIHNkX3YxX2ZpcnN0X2RpcmVjdF9ieXRlKHNkKSwKKyAgICAgICAgICAgICAgICBwcmludF90aW1lKCBzZF92MV9tdGltZShzZCkgKSApOworICAgIH0gZWxzZSB7CisJc3RydWN0IHN0YXRfZGF0YSAqIHNkID0gKHN0cnVjdCBzdGF0X2RhdGEgKilpdGVtOworCisJcHJpbnRrICgiXHQwJS02byB8ICU2THUgfCAlMnUgfCAlZCB8ICVzXG4iLCBzZF92Ml9tb2RlKHNkKSwKKyAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2RfdjJfc2l6ZShzZCksIHNkX3YyX25saW5rKHNkKSwKKyAgICAgICAgICAgIHNkX3YyX3JkZXYoc2QpLCBwcmludF90aW1lKHNkX3YyX210aW1lKHNkKSkpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgc2RfY2hlY2tfaXRlbSAoc3RydWN0IGl0ZW1faGVhZCAqIGloLCBjaGFyICogaXRlbSkKK3sKKyAgICAvLyBGSVhNRTogdHlwZSBzb21ldGhpbmcgaGVyZSEKK30KKworCitzdGF0aWMgaW50IHNkX2NyZWF0ZV92aSAoc3RydWN0IHZpcnR1YWxfbm9kZSAqIHZuLAorCQkJIHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgCisJCQkgaW50IGlzX2FmZmVjdGVkLCAKKwkJCSBpbnQgaW5zZXJ0X3NpemUpCit7CisgICAgdmktPnZpX2luZGV4ID0gVFlQRV9TVEFUX0RBVEE7CisgICAgLy92aS0+dmlfdHlwZSB8PSBWSV9UWVBFX1NUQVRfREFUQTsvLyBub3QgbmVlZGVkPworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgc2RfY2hlY2tfbGVmdCAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCBpbnQgZnJlZSwgCisJCQkgIGludCBzdGFydF9za2lwLCBpbnQgZW5kX3NraXApCit7CisgICAgaWYgKHN0YXJ0X3NraXAgfHwgZW5kX3NraXApCisJQlVHICgpOworICAgIHJldHVybiAtMTsKK30KKworCitzdGF0aWMgaW50IHNkX2NoZWNrX3JpZ2h0IChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmcmVlKQoreworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCBzZF9wYXJ0X3NpemUgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgaW50IGZpcnN0LCBpbnQgY291bnQpCit7CisgICAgaWYgKGNvdW50KQorCUJVRyAoKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZF91bml0X251bSAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpKQoreworICAgIHJldHVybiB2aS0+dmlfaXRlbV9sZW4gLSBJSF9TSVpFOworfQorCisKK3N0YXRpYyB2b2lkIHNkX3ByaW50X3ZpIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmkpCit7CisgICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgIlNUQVREQVRBLCBpbmRleCAlZCwgdHlwZSAweCV4LCAlaCIsCisJCSAgICAgIHZpLT52aV9pbmRleCwgdmktPnZpX3R5cGUsIHZpLT52aV9paCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXRlbV9vcGVyYXRpb25zIHN0YXRfZGF0YV9vcHMgPSB7CisJLmJ5dGVzX251bWJlcgkJPSBzZF9ieXRlc19udW1iZXIsCisJLmRlY3JlbWVudF9rZXkJCT0gc2RfZGVjcmVtZW50X2tleSwKKwkuaXNfbGVmdF9tZXJnZWFibGUJPSBzZF9pc19sZWZ0X21lcmdlYWJsZSwKKwkucHJpbnRfaXRlbQkJPSBzZF9wcmludF9pdGVtLAorCS5jaGVja19pdGVtCQk9IHNkX2NoZWNrX2l0ZW0sCisKKwkuY3JlYXRlX3ZpCQk9IHNkX2NyZWF0ZV92aSwKKwkuY2hlY2tfbGVmdAkJPSBzZF9jaGVja19sZWZ0LAorCS5jaGVja19yaWdodAkJPSBzZF9jaGVja19yaWdodCwKKwkucGFydF9zaXplCQk9IHNkX3BhcnRfc2l6ZSwKKwkudW5pdF9udW0JCT0gc2RfdW5pdF9udW0sCisJLnByaW50X3ZpCQk9IHNkX3ByaW50X3ZpCit9OworCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBkaXJlY3QgaXRlbSBmdW5jdGlvbnMKKy8vCitzdGF0aWMgaW50IGRpcmVjdF9ieXRlc19udW1iZXIgKHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgaW50IGJsb2NrX3NpemUpCit7CisgIHJldHVybiBpaF9pdGVtX2xlbihpaCk7Cit9CisKKworLy8gRklYTUU6IHRoaXMgc2hvdWxkIHByb2JhYmx5IHN3aXRjaCB0byBpbmRpcmVjdCBhcyB3ZWxsCitzdGF0aWMgdm9pZCBkaXJlY3RfZGVjcmVtZW50X2tleSAoc3RydWN0IGNwdV9rZXkgKiBrZXkpCit7CisgICAgY3B1X2tleV9rX29mZnNldF9kZWMgKGtleSk7CisgICAgaWYgKGNwdV9rZXlfa19vZmZzZXQgKGtleSkgPT0gMCkKKwlzZXRfY3B1X2tleV9rX3R5cGUgKGtleSwgVFlQRV9TVEFUX0RBVEEpOwkKK30KKworCitzdGF0aWMgaW50IGRpcmVjdF9pc19sZWZ0X21lcmdlYWJsZSAoc3RydWN0IHJlaXNlcmZzX2tleSAqIGtleSwgdW5zaWduZWQgbG9uZyBic2l6ZSkKK3sKKyAgICBpbnQgdmVyc2lvbiA9IGxlX2tleV92ZXJzaW9uIChrZXkpOworICAgIHJldHVybiAoKGxlX2tleV9rX29mZnNldCAodmVyc2lvbiwga2V5KSAmIChic2l6ZSAtIDEpKSAhPSAxKTsKK30KKworCitzdGF0aWMgdm9pZCBkaXJlY3RfcHJpbnRfaXRlbSAoc3RydWN0IGl0ZW1faGVhZCAqIGloLCBjaGFyICogaXRlbSkKK3sKKyAgICBpbnQgaiA9IDA7CisKKy8vICAgIHJldHVybjsKKyAgICBwcmludGsgKCJcIiIpOworICAgIHdoaWxlIChqIDwgaWhfaXRlbV9sZW4oaWgpKQorCXByaW50ayAoIiVjIiwgaXRlbVtqKytdKTsKKyAgICBwcmludGsgKCJcIlxuIik7Cit9CisKKworc3RhdGljIHZvaWQgZGlyZWN0X2NoZWNrX2l0ZW0gKHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgY2hhciAqIGl0ZW0pCit7CisgICAgLy8gRklYTUU6IHR5cGUgc29tZXRoaW5nIGhlcmUhCit9CisKKworc3RhdGljIGludCBkaXJlY3RfY3JlYXRlX3ZpIChzdHJ1Y3QgdmlydHVhbF9ub2RlICogdm4sCisJCQkgICAgIHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgCisJCQkgICAgIGludCBpc19hZmZlY3RlZCwgCisJCQkgICAgIGludCBpbnNlcnRfc2l6ZSkKK3sKKyAgICB2aS0+dmlfaW5kZXggPSBUWVBFX0RJUkVDVDsKKyAgICAvL3ZpLT52aV90eXBlIHw9IFZJX1RZUEVfRElSRUNUOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRpcmVjdF9jaGVja19sZWZ0IChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmcmVlLAorCQkJICAgICAgaW50IHN0YXJ0X3NraXAsIGludCBlbmRfc2tpcCkKK3sKKyAgICBpbnQgYnl0ZXM7CisKKyAgICBieXRlcyA9IGZyZWUgLSBmcmVlICUgODsKKyAgICByZXR1cm4gYnl0ZXMgPzogLTE7ICAgIAorfQorCisKK3N0YXRpYyBpbnQgZGlyZWN0X2NoZWNrX3JpZ2h0IChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmcmVlKQoreworICAgIHJldHVybiBkaXJlY3RfY2hlY2tfbGVmdCAodmksIGZyZWUsIDAsIDApOworfQorCitzdGF0aWMgaW50IGRpcmVjdF9wYXJ0X3NpemUgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgaW50IGZpcnN0LCBpbnQgY291bnQpCit7CisgICAgcmV0dXJuIGNvdW50OworfQorCisKK3N0YXRpYyBpbnQgZGlyZWN0X3VuaXRfbnVtIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmkpCit7CisgICAgcmV0dXJuIHZpLT52aV9pdGVtX2xlbiAtIElIX1NJWkU7Cit9CisKKworc3RhdGljIHZvaWQgZGlyZWN0X3ByaW50X3ZpIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmkpCit7CisgICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgIkRJUkVDVCwgaW5kZXggJWQsIHR5cGUgMHgleCwgJWgiLAorCQkgICAgICB2aS0+dmlfaW5kZXgsIHZpLT52aV90eXBlLCB2aS0+dmlfaWgpOworfQorCitzdGF0aWMgc3RydWN0IGl0ZW1fb3BlcmF0aW9ucyBkaXJlY3Rfb3BzID0geworCS5ieXRlc19udW1iZXIJCT0gZGlyZWN0X2J5dGVzX251bWJlciwKKwkuZGVjcmVtZW50X2tleQkJPSBkaXJlY3RfZGVjcmVtZW50X2tleSwKKwkuaXNfbGVmdF9tZXJnZWFibGUJPSBkaXJlY3RfaXNfbGVmdF9tZXJnZWFibGUsCisJLnByaW50X2l0ZW0JCT0gZGlyZWN0X3ByaW50X2l0ZW0sCisJLmNoZWNrX2l0ZW0JCT0gZGlyZWN0X2NoZWNrX2l0ZW0sCisKKwkuY3JlYXRlX3ZpCQk9IGRpcmVjdF9jcmVhdGVfdmksCisJLmNoZWNrX2xlZnQJCT0gZGlyZWN0X2NoZWNrX2xlZnQsCisJLmNoZWNrX3JpZ2h0CQk9IGRpcmVjdF9jaGVja19yaWdodCwKKwkucGFydF9zaXplCQk9IGRpcmVjdF9wYXJ0X3NpemUsCisJLnVuaXRfbnVtCQk9IGRpcmVjdF91bml0X251bSwKKwkucHJpbnRfdmkJCT0gZGlyZWN0X3ByaW50X3ZpCit9OworCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBpbmRpcmVjdCBpdGVtIGZ1bmN0aW9ucworLy8KKworc3RhdGljIGludCBpbmRpcmVjdF9ieXRlc19udW1iZXIgKHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgaW50IGJsb2NrX3NpemUpCit7CisgIHJldHVybiBpaF9pdGVtX2xlbihpaCkgLyBVTkZNX1BfU0laRSAqIGJsb2NrX3NpemU7IC8vLSBnZXRfaWhfZnJlZV9zcGFjZSAoaWgpOworfQorCisKKy8vIGRlY3JlYXNlIG9mZnNldCwgaWYgaXQgYmVjb21lcyAwLCBjaGFuZ2UgdHlwZSB0byBzdGF0IGRhdGEKK3N0YXRpYyB2b2lkIGluZGlyZWN0X2RlY3JlbWVudF9rZXkgKHN0cnVjdCBjcHVfa2V5ICoga2V5KQoreworICAgIGNwdV9rZXlfa19vZmZzZXRfZGVjIChrZXkpOworICAgIGlmIChjcHVfa2V5X2tfb2Zmc2V0IChrZXkpID09IDApCisJc2V0X2NwdV9rZXlfa190eXBlIChrZXksIFRZUEVfU1RBVF9EQVRBKTsKK30KKworCisvLyBpZiBpdCBpcyBub3QgZmlyc3QgaXRlbSBvZiB0aGUgYm9keSwgdGhlbiBpdCBpcyBtZXJnZWFibGUKK3N0YXRpYyBpbnQgaW5kaXJlY3RfaXNfbGVmdF9tZXJnZWFibGUgKHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXksIHVuc2lnbmVkIGxvbmcgYnNpemUpCit7CisgICAgaW50IHZlcnNpb24gPSBsZV9rZXlfdmVyc2lvbiAoa2V5KTsKKyAgICByZXR1cm4gKGxlX2tleV9rX29mZnNldCAodmVyc2lvbiwga2V5KSAhPSAxKTsKK30KKworCisvLyBwcmludGluZyBvZiBpbmRpcmVjdCBpdGVtCitzdGF0aWMgdm9pZCBzdGFydF9uZXdfc2VxdWVuY2UgKF9fdTMyICogc3RhcnQsIGludCAqIGxlbiwgX191MzIgbmV3KQoreworICAgICpzdGFydCA9IG5ldzsKKyAgICAqbGVuID0gMTsKK30KKworCitzdGF0aWMgaW50IHNlcXVlbmNlX2ZpbmlzaGVkIChfX3UzMiBzdGFydCwgaW50ICogbGVuLCBfX3UzMiBuZXcpCit7CisgICAgaWYgKHN0YXJ0ID09IElOVF9NQVgpCisJcmV0dXJuIDE7CisKKyAgICBpZiAoc3RhcnQgPT0gMCAmJiBuZXcgPT0gMCkgeworCSgqbGVuKSArKzsKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKHN0YXJ0ICE9IDAgJiYgKHN0YXJ0ICsgKmxlbikgPT0gbmV3KSB7CisJKCpsZW4pICsrOworCXJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfc2VxdWVuY2UgKF9fdTMyIHN0YXJ0LCBpbnQgbGVuKQoreworICAgIGlmIChzdGFydCA9PSBJTlRfTUFYKQorCXJldHVybjsKKworICAgIGlmIChsZW4gPT0gMSkKKwlwcmludGsgKCIgJWQiLCBzdGFydCk7CisgICAgZWxzZQorCXByaW50ayAoIiAlZCglZCkiLCBzdGFydCwgbGVuKTsKK30KKworCitzdGF0aWMgdm9pZCBpbmRpcmVjdF9wcmludF9pdGVtIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGNoYXIgKiBpdGVtKQoreworICAgIGludCBqOworICAgIF9fdTMyICogdW5wLCBwcmV2ID0gSU5UX01BWDsKKyAgICBpbnQgbnVtOworCisgICAgdW5wID0gKF9fdTMyICopaXRlbTsKKworICAgIGlmIChpaF9pdGVtX2xlbihpaCkgJSBVTkZNX1BfU0laRSkKKwlyZWlzZXJmc193YXJuaW5nIChOVUxMLCAiaW5kaXJlY3RfcHJpbnRfaXRlbTogaW52YWxpZCBpdGVtIGxlbiIpOworCisgICAgcHJpbnRrICgiJWQgcG9pbnRlcnNcblsgIiwgKGludClJX1VORk1fTlVNIChpaCkpOworICAgIGZvciAoaiA9IDA7IGogPCBJX1VORk1fTlVNIChpaCk7IGogKyspIHsKKwlpZiAoc2VxdWVuY2VfZmluaXNoZWQgKHByZXYsICZudW0sIGdldF9ibG9ja19udW0odW5wLCBqKSkpIHsKKwkgICAgcHJpbnRfc2VxdWVuY2UgKHByZXYsIG51bSk7CisJICAgIHN0YXJ0X25ld19zZXF1ZW5jZSAoJnByZXYsICZudW0sIGdldF9ibG9ja19udW0odW5wLCBqKSk7CisJfQorICAgIH0KKyAgICBwcmludF9zZXF1ZW5jZSAocHJldiwgbnVtKTsKKyAgICBwcmludGsgKCJdXG4iKTsKK30KKworc3RhdGljIHZvaWQgaW5kaXJlY3RfY2hlY2tfaXRlbSAoc3RydWN0IGl0ZW1faGVhZCAqIGloLCBjaGFyICogaXRlbSkKK3sKKyAgICAvLyBGSVhNRTogdHlwZSBzb21ldGhpbmcgaGVyZSEKK30KKworCitzdGF0aWMgaW50IGluZGlyZWN0X2NyZWF0ZV92aSAoc3RydWN0IHZpcnR1YWxfbm9kZSAqIHZuLAorCQkJICAgICAgIHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgCisJCQkgICAgICAgaW50IGlzX2FmZmVjdGVkLCAKKwkJCSAgICAgICBpbnQgaW5zZXJ0X3NpemUpCit7CisgICAgdmktPnZpX2luZGV4ID0gVFlQRV9JTkRJUkVDVDsKKyAgICAvL3ZpLT52aV90eXBlIHw9IFZJX1RZUEVfSU5ESVJFQ1Q7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5kaXJlY3RfY2hlY2tfbGVmdCAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCBpbnQgZnJlZSwKKwkJCQlpbnQgc3RhcnRfc2tpcCwgaW50IGVuZF9za2lwKQoreworICAgIGludCBieXRlczsKKworICAgIGJ5dGVzID0gZnJlZSAtIGZyZWUgJSBVTkZNX1BfU0laRTsKKyAgICByZXR1cm4gYnl0ZXMgPzogLTE7ICAgIAorfQorCisKK3N0YXRpYyBpbnQgaW5kaXJlY3RfY2hlY2tfcmlnaHQgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgaW50IGZyZWUpCit7CisgICAgcmV0dXJuIGluZGlyZWN0X2NoZWNrX2xlZnQgKHZpLCBmcmVlLCAwLCAwKTsKK30KKworCisKKy8vIHJldHVybiBzaXplIGluIGJ5dGVzIG9mICd1bml0cycgdW5pdHMuIElmIGZpcnN0ID09IDAgLSBjYWxjdWxhdGUgZnJvbSB0aGUgaGVhZCAobGVmdCksIG90aGVyd2lzZSAtIGZyb20gdGFpbCAocmlnaHQpCitzdGF0aWMgaW50IGluZGlyZWN0X3BhcnRfc2l6ZSAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpLCBpbnQgZmlyc3QsIGludCB1bml0cykKK3sKKyAgICAvLyB1bml0IG9mIGluZGlyZWN0IGl0ZW0gaXMgYnl0ZSAoeWV0KQorICAgIHJldHVybiB1bml0czsKK30KKworc3RhdGljIGludCBpbmRpcmVjdF91bml0X251bSAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpKQoreworICAgIC8vIHVuaXQgb2YgaW5kaXJlY3QgaXRlbSBpcyBieXRlICh5ZXQpCisgICAgcmV0dXJuIHZpLT52aV9pdGVtX2xlbiAtIElIX1NJWkU7Cit9CisKK3N0YXRpYyB2b2lkIGluZGlyZWN0X3ByaW50X3ZpIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmkpCit7CisgICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgIklORElSRUNULCBpbmRleCAlZCwgdHlwZSAweCV4LCAlaCIsCisJCSAgICAgIHZpLT52aV9pbmRleCwgdmktPnZpX3R5cGUsIHZpLT52aV9paCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXRlbV9vcGVyYXRpb25zIGluZGlyZWN0X29wcyA9IHsKKwkuYnl0ZXNfbnVtYmVyCQk9IGluZGlyZWN0X2J5dGVzX251bWJlciwKKwkuZGVjcmVtZW50X2tleQkJPSBpbmRpcmVjdF9kZWNyZW1lbnRfa2V5LAorCS5pc19sZWZ0X21lcmdlYWJsZQk9IGluZGlyZWN0X2lzX2xlZnRfbWVyZ2VhYmxlLAorCS5wcmludF9pdGVtCQk9IGluZGlyZWN0X3ByaW50X2l0ZW0sCisJLmNoZWNrX2l0ZW0JCT0gaW5kaXJlY3RfY2hlY2tfaXRlbSwKKworCS5jcmVhdGVfdmkJCT0gaW5kaXJlY3RfY3JlYXRlX3ZpLAorCS5jaGVja19sZWZ0CQk9IGluZGlyZWN0X2NoZWNrX2xlZnQsCisJLmNoZWNrX3JpZ2h0CQk9IGluZGlyZWN0X2NoZWNrX3JpZ2h0LAorCS5wYXJ0X3NpemUJCT0gaW5kaXJlY3RfcGFydF9zaXplLAorCS51bml0X251bQkJPSBpbmRpcmVjdF91bml0X251bSwKKwkucHJpbnRfdmkJCT0gaW5kaXJlY3RfcHJpbnRfdmkKK307CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBkaXJlbnRyeSBmdW5jdGlvbnMKKy8vCisKKworc3RhdGljIGludCBkaXJlbnRyeV9ieXRlc19udW1iZXIgKHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgaW50IGJsb2NrX3NpemUpCit7CisgICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgInZzLTE2MDkwOiBkaXJlbnRyeV9ieXRlc19udW1iZXI6ICIKKwkJICAgICAgImJ5dGVzIG51bWJlciBpcyBhc2tlZCBmb3IgZGlyZW50cnkiKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGlyZW50cnlfZGVjcmVtZW50X2tleSAoc3RydWN0IGNwdV9rZXkgKiBrZXkpCit7CisgICAgY3B1X2tleV9rX29mZnNldF9kZWMgKGtleSk7CisgICAgaWYgKGNwdV9rZXlfa19vZmZzZXQgKGtleSkgPT0gMCkKKwlzZXRfY3B1X2tleV9rX3R5cGUgKGtleSwgVFlQRV9TVEFUX0RBVEEpOwkKK30KKworCitzdGF0aWMgaW50IGRpcmVudHJ5X2lzX2xlZnRfbWVyZ2VhYmxlIChzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5LCB1bnNpZ25lZCBsb25nIGJzaXplKQoreworICAgIGlmIChsZTMyX3RvX2NwdSAoa2V5LT51Lmtfb2Zmc2V0X3YxLmtfb2Zmc2V0KSA9PSBET1RfT0ZGU0VUKQorCXJldHVybiAwOworICAgIHJldHVybiAxOworCQorfQorCisKK3N0YXRpYyB2b2lkIGRpcmVudHJ5X3ByaW50X2l0ZW0gKHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgY2hhciAqIGl0ZW0pCit7CisgICAgaW50IGk7CisgICAgaW50IG5hbWVsZW47CisgICAgc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKiBkZWg7CisgICAgY2hhciAqIG5hbWU7CisgICAgc3RhdGljIGNoYXIgbmFtZWJ1ZiBbODBdOworCisKKyAgICBwcmludGsgKCJcbiAjICUtMTVzJS0zMHMlLTE1cyUtMTVzJS0xNXNcbiIsICJOYW1lIiwgIktleSBvZiBwb2ludGVkIG9iamVjdCIsICJIYXNoIiwgIkdlbiBudW1iZXIiLCAiU3RhdHVzIik7CisKKyAgICBkZWggPSAoc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKilpdGVtOworCisgICAgZm9yIChpID0gMDsgaSA8IElfRU5UUllfQ09VTlQgKGloKTsgaSArKywgZGVoICsrKSB7CisJbmFtZWxlbiA9IChpID8gKGRlaF9sb2NhdGlvbihkZWggLSAxKSkgOiBpaF9pdGVtX2xlbihpaCkpIC0gZGVoX2xvY2F0aW9uKGRlaCk7CisJbmFtZSA9IGl0ZW0gKyBkZWhfbG9jYXRpb24oZGVoKTsKKwlpZiAobmFtZVtuYW1lbGVuLTFdID09IDApCisJICBuYW1lbGVuID0gc3RybGVuIChuYW1lKTsKKwluYW1lYnVmWzBdID0gJyInOworCWlmIChuYW1lbGVuID4gc2l6ZW9mIChuYW1lYnVmKSAtIDMpIHsKKwkgICAgc3RybmNweSAobmFtZWJ1ZiArIDEsIG5hbWUsIHNpemVvZiAobmFtZWJ1ZikgLSAzKTsKKwkgICAgbmFtZWJ1ZltzaXplb2YgKG5hbWVidWYpIC0gMl0gPSAnIic7CisJICAgIG5hbWVidWZbc2l6ZW9mIChuYW1lYnVmKSAtIDFdID0gMDsKKwl9IGVsc2UgeworCSAgICBtZW1jcHkgKG5hbWVidWYgKyAxLCBuYW1lLCBuYW1lbGVuKTsKKwkgICAgbmFtZWJ1ZltuYW1lbGVuICsgMV0gPSAnIic7CisJICAgIG5hbWVidWZbbmFtZWxlbiArIDJdID0gMDsKKwl9CisKKwlwcmludGsgKCIlZDogICUtMTVzJS0xNWQlLTE1ZCUtMTVMZCUtMTVMZCglcylcbiIsIAorCQlpLCBuYW1lYnVmLAorCQlkZWhfZGlyX2lkKGRlaCksIGRlaF9vYmplY3RpZChkZWgpLAorCQlHRVRfSEFTSF9WQUxVRSAoZGVoX29mZnNldCAoZGVoKSksIEdFVF9HRU5FUkFUSU9OX05VTUJFUiAoKGRlaF9vZmZzZXQgKGRlaCkpKSwKKwkJKGRlX2hpZGRlbiAoZGVoKSkgPyAiSElEREVOIiA6ICJWSVNJQkxFIik7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIGRpcmVudHJ5X2NoZWNrX2l0ZW0gKHN0cnVjdCBpdGVtX2hlYWQgKiBpaCwgY2hhciAqIGl0ZW0pCit7CisgICAgaW50IGk7CisgICAgc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKiBkZWg7CisKKyAgICAvLyBGSVhNRTogdHlwZSBzb21ldGhpbmcgaGVyZSEKKyAgICBkZWggPSAoc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKilpdGVtOworICAgIGZvciAoaSA9IDA7IGkgPCBJX0VOVFJZX0NPVU5UIChpaCk7IGkgKyssIGRlaCArKykgeworCTsKKyAgICB9Cit9CisKKworCisjZGVmaW5lIERJUkVOVFJZX1ZJX0ZJUlNUX0RJUkVOVFJZX0lURU0gMQorCisvKgorICogZnVuY3Rpb24gcmV0dXJucyBvbGQgZW50cnkgbnVtYmVyIGluIGRpcmVjdG9yeSBpdGVtIGluIHJlYWwgbm9kZQorICogdXNpbmcgbmV3IGVudHJ5IG51bWJlciBpbiB2aXJ0dWFsIGl0ZW0gaW4gdmlydHVhbCBub2RlICovCitzdGF0aWMgaW5saW5lIGludCBvbGRfZW50cnlfbnVtIChpbnQgaXNfYWZmZWN0ZWQsIGludCB2aXJ0dWFsX2VudHJ5X251bSwgaW50IHBvc19pbl9pdGVtLCBpbnQgbW9kZSkKK3sKKyAgICBpZiAoIG1vZGUgPT0gTV9JTlNFUlQgfHwgbW9kZSA9PSBNX0RFTEVURSkKKwlyZXR1cm4gdmlydHVhbF9lbnRyeV9udW07CisgICAgCisgICAgaWYgKCFpc19hZmZlY3RlZCkKKwkvKiBjdXQgb3IgcGFzdGUgaXMgYXBwbGllZCB0byBhbm90aGVyIGl0ZW0gKi8KKwlyZXR1cm4gdmlydHVhbF9lbnRyeV9udW07CisKKyAgICBpZiAodmlydHVhbF9lbnRyeV9udW0gPCBwb3NfaW5faXRlbSkKKwlyZXR1cm4gdmlydHVhbF9lbnRyeV9udW07CisKKyAgICBpZiAobW9kZSA9PSBNX0NVVCkKKwlyZXR1cm4gdmlydHVhbF9lbnRyeV9udW0gKyAxOworCisgICAgUkZBTFNFKCBtb2RlICE9IE1fUEFTVEUgfHwgdmlydHVhbF9lbnRyeV9udW0gPT0gMCwKKwkgICAgInZzLTgwMTU6IG9sZF9lbnRyeV9udW06IG1vZGUgbXVzdCBiZSBNX1BBU1RFIChtb2RlID0gXCclY1wnIiwgbW9kZSk7CisgICAgCisgICAgcmV0dXJuIHZpcnR1YWxfZW50cnlfbnVtIC0gMTsKK30KKworCisKKworLyogQ3JlYXRlIGFuIGFycmF5IG9mIHNpemVzIG9mIGRpcmVjdG9yeSBlbnRyaWVzIGZvciB2aXJ0dWFsCisgICBpdGVtLiBSZXR1cm4gc3BhY2UgdXNlZCBieSBhbiBpdGVtLiBGSVhNRTogbm8gY29udHJvbCBvdmVyCisgICBjb25zdW1pbmcgb2Ygc3BhY2UgdXNlZCBieSB0aGlzIGl0ZW0gaGFuZGxlciAqLworc3RhdGljIGludCBkaXJlbnRyeV9jcmVhdGVfdmkgKHN0cnVjdCB2aXJ0dWFsX25vZGUgKiB2biwKKwkJCSAgICAgICBzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIAorCQkJICAgICAgIGludCBpc19hZmZlY3RlZCwgCisJCQkgICAgICAgaW50IGluc2VydF9zaXplKQoreworICAgIHN0cnVjdCBkaXJlbnRyeV91YXJlYSAqIGRpcl91ID0gdmktPnZpX3VhcmVhOworICAgIGludCBpLCBqOworICAgIGludCBzaXplID0gc2l6ZW9mIChzdHJ1Y3QgZGlyZW50cnlfdWFyZWEpOworICAgIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogZGVoOworICAKKyAgICB2aS0+dmlfaW5kZXggPSBUWVBFX0RJUkVOVFJZOworCisgICAgaWYgKCEodmktPnZpX2loKSB8fCAhdmktPnZpX2l0ZW0pCisJQlVHICgpOworCisKKyAgICBkaXJfdS0+ZmxhZ3MgPSAwOworICAgIGlmIChsZV9paF9rX29mZnNldCAodmktPnZpX2loKSA9PSBET1RfT0ZGU0VUKQorCWRpcl91LT5mbGFncyB8PSBESVJFTlRSWV9WSV9GSVJTVF9ESVJFTlRSWV9JVEVNOworCisgICAgZGVoID0gKHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopKHZpLT52aV9pdGVtKTsKKyAgICAKKyAgICAKKyAgICAvKiB2aXJ0dWFsIGRpcmVjdG9yeSBpdGVtIGhhdmUgdGhpcyBhbW91bnQgb2YgZW50cnkgYWZ0ZXIgKi8KKyAgICBkaXJfdS0+ZW50cnlfY291bnQgPSBpaF9lbnRyeV9jb3VudCAodmktPnZpX2loKSArIAorCSgoaXNfYWZmZWN0ZWQpID8gKCh2bi0+dm5fbW9kZSA9PSBNX0NVVCkgPyAtMSA6CisJCQkgICh2bi0+dm5fbW9kZSA9PSBNX1BBU1RFID8gMSA6IDApKSA6IDApOworICAgIAorICAgIGZvciAoaSA9IDA7IGkgPCBkaXJfdS0+ZW50cnlfY291bnQ7IGkgKyspIHsKKwlqID0gb2xkX2VudHJ5X251bSAoaXNfYWZmZWN0ZWQsIGksIHZuLT52bl9wb3NfaW5faXRlbSwgdm4tPnZuX21vZGUpOworICAgICAgICBkaXJfdS0+ZW50cnlfc2l6ZXNbaV0gPSAoaiA/IGRlaF9sb2NhdGlvbiggJihkZWhbaiAtIDFdKSApIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWhfaXRlbV9sZW4gKHZpLT52aV9paCkpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVoX2xvY2F0aW9uKCAmKGRlaFtqXSkpICsgREVIX1NJWkU7CisgICAgfQorCisgICAgc2l6ZSArPSAoZGlyX3UtPmVudHJ5X2NvdW50ICogc2l6ZW9mIChzaG9ydCkpOworICAgIAorICAgIC8qIHNldCBzaXplIG9mIHBhc3RlZCBlbnRyeSAqLworICAgIGlmIChpc19hZmZlY3RlZCAmJiB2bi0+dm5fbW9kZSA9PSBNX1BBU1RFKQorCWRpcl91LT5lbnRyeV9zaXplc1t2bi0+dm5fcG9zX2luX2l0ZW1dID0gaW5zZXJ0X3NpemU7CisKKworI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSworICAgIC8qIGNvbXBhcmUgdG90YWwgc2l6ZSBvZiBlbnRyaWVzIHdpdGggaXRlbSBsZW5ndGggKi8KKyAgICB7CisJaW50IGssIGw7CisgICAgCisJbCA9IDA7CisJZm9yIChrID0gMDsgayA8IGRpcl91LT5lbnRyeV9jb3VudDsgayArKykKKwkgICAgbCArPSBkaXJfdS0+ZW50cnlfc2l6ZXNba107CisgICAgCisJaWYgKGwgKyBJSF9TSVpFICE9IHZpLT52aV9pdGVtX2xlbiArIAorCSAgICAoKGlzX2FmZmVjdGVkICYmICh2bi0+dm5fbW9kZSA9PSBNX1BBU1RFIHx8IHZuLT52bl9tb2RlID09IE1fQ1VUKSkgPyBpbnNlcnRfc2l6ZSA6IDApICkgeworCSAgICByZWlzZXJmc19wYW5pYyAoTlVMTCwgInZzLTgwMjU6IHNldF9lbnRyeV9zaXplczogKG1vZGU9PSVjLCBpbnNlcnRfc2l6ZT09JWQpLCBpbnZhbGlkIGxlbmd0aCBvZiBkaXJlY3RvcnkgaXRlbSIsCisJCQkgICAgdm4tPnZuX21vZGUsIGluc2VydF9zaXplKTsKKwl9CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gc2l6ZTsKKworCit9CisKKworLy8KKy8vIHJldHVybiBudW1iZXIgb2YgZW50cmllcyB3aGljaCBtYXkgZml0IGludG8gc3BlY2lmaWVkIGFtb3VudCBvZgorLy8gZnJlZSBzcGFjZSwgb3IgLTEgaWYgZnJlZSBzcGFjZSBpcyBub3QgZW5vdWdoIGV2ZW4gZm9yIDEgZW50cnkKKy8vCitzdGF0aWMgaW50IGRpcmVudHJ5X2NoZWNrX2xlZnQgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgaW50IGZyZWUsCisJCQkJaW50IHN0YXJ0X3NraXAsIGludCBlbmRfc2tpcCkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgZW50cmllcyA9IDA7CisgICAgc3RydWN0IGRpcmVudHJ5X3VhcmVhICogZGlyX3UgPSB2aS0+dmlfdWFyZWE7CisKKyAgICBmb3IgKGkgPSBzdGFydF9za2lwOyBpIDwgZGlyX3UtPmVudHJ5X2NvdW50IC0gZW5kX3NraXA7IGkgKyspIHsKKwlpZiAoZGlyX3UtPmVudHJ5X3NpemVzW2ldID4gZnJlZSkKKwkgICAgLyogaS10aCBlbnRyeSBkb2Vzbid0IGZpdCBpbnRvIHRoZSByZW1haW5pbmcgZnJlZSBzcGFjZSAqLworCSAgICBicmVhazsKKwkJICAKKwlmcmVlIC09IGRpcl91LT5lbnRyeV9zaXplc1tpXTsKKwllbnRyaWVzICsrOworICAgIH0KKworICAgIGlmIChlbnRyaWVzID09IGRpcl91LT5lbnRyeV9jb3VudCkgeworCXJlaXNlcmZzX3BhbmljIChOVUxMLCAiZnJlZSBzcGFjZSAlZCwgZW50cnlfY291bnQgJWRcbiIsIGZyZWUsIGRpcl91LT5lbnRyeV9jb3VudCk7CisgICAgfQorCisgICAgLyogIi4iIGFuZCAiLi4iIGNhbiBub3QgYmUgc2VwYXJhdGVkIGZyb20gZWFjaCBvdGhlciAqLworICAgIGlmIChzdGFydF9za2lwID09IDAgJiYgKGRpcl91LT5mbGFncyAmIERJUkVOVFJZX1ZJX0ZJUlNUX0RJUkVOVFJZX0lURU0pICYmIGVudHJpZXMgPCAyKQorCWVudHJpZXMgPSAwOworICAgIAorICAgIHJldHVybiBlbnRyaWVzID86IC0xOworfQorCisKK3N0YXRpYyBpbnQgZGlyZW50cnlfY2hlY2tfcmlnaHQgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSwgaW50IGZyZWUpCit7CisgICAgaW50IGk7CisgICAgaW50IGVudHJpZXMgPSAwOworICAgIHN0cnVjdCBkaXJlbnRyeV91YXJlYSAqIGRpcl91ID0gdmktPnZpX3VhcmVhOworICAgIAorICAgIGZvciAoaSA9IGRpcl91LT5lbnRyeV9jb3VudCAtIDE7IGkgPj0gMDsgaSAtLSkgeworCWlmIChkaXJfdS0+ZW50cnlfc2l6ZXNbaV0gPiBmcmVlKQorCSAgICAvKiBpLXRoIGVudHJ5IGRvZXNuJ3QgZml0IGludG8gdGhlIHJlbWFpbmluZyBmcmVlIHNwYWNlICovCisJICAgIGJyZWFrOworCQorCWZyZWUgLT0gZGlyX3UtPmVudHJ5X3NpemVzW2ldOworCWVudHJpZXMgKys7CisgICAgfQorICAgIGlmIChlbnRyaWVzID09IGRpcl91LT5lbnRyeV9jb3VudCkKKwlCVUcgKCk7CisKKyAgICAvKiAiLiIgYW5kICIuLiIgY2FuIG5vdCBiZSBzZXBhcmF0ZWQgZnJvbSBlYWNoIG90aGVyICovCisgICAgaWYgKChkaXJfdS0+ZmxhZ3MgJiBESVJFTlRSWV9WSV9GSVJTVF9ESVJFTlRSWV9JVEVNKSAmJiBlbnRyaWVzID4gZGlyX3UtPmVudHJ5X2NvdW50IC0gMikKKwllbnRyaWVzID0gZGlyX3UtPmVudHJ5X2NvdW50IC0gMjsKKworICAgIHJldHVybiBlbnRyaWVzID86IC0xOworfQorCisKKy8qIHN1bSBvZiBlbnRyeSBzaXplcyBiZXR3ZWVuIGZyb20tdGggYW5kIHRvLXRoIGVudHJpZXMgaW5jbHVkaW5nIGJvdGggZWRnZXMgKi8KK3N0YXRpYyBpbnQgZGlyZW50cnlfcGFydF9zaXplIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmaXJzdCwgaW50IGNvdW50KQoreworICAgIGludCBpLCByZXR2YWw7CisgICAgaW50IGZyb20sIHRvOworICAgIHN0cnVjdCBkaXJlbnRyeV91YXJlYSAqIGRpcl91ID0gdmktPnZpX3VhcmVhOworICAgIAorICAgIHJldHZhbCA9IDA7CisgICAgaWYgKGZpcnN0ID09IDApCisJZnJvbSA9IDA7CisgICAgZWxzZQorCWZyb20gPSBkaXJfdS0+ZW50cnlfY291bnQgLSBjb3VudDsKKyAgICB0byA9IGZyb20gKyBjb3VudCAtIDE7CisKKyAgICBmb3IgKGkgPSBmcm9tOyBpIDw9IHRvOyBpICsrKQorCXJldHZhbCArPSBkaXJfdS0+ZW50cnlfc2l6ZXNbaV07CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IGRpcmVudHJ5X3VuaXRfbnVtIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmkpCit7CisgICAgc3RydWN0IGRpcmVudHJ5X3VhcmVhICogZGlyX3UgPSB2aS0+dmlfdWFyZWE7CisgICAgCisgICAgcmV0dXJuIGRpcl91LT5lbnRyeV9jb3VudDsKK30KKworCisKK3N0YXRpYyB2b2lkIGRpcmVudHJ5X3ByaW50X3ZpIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmkpCit7CisgICAgaW50IGk7CisgICAgc3RydWN0IGRpcmVudHJ5X3VhcmVhICogZGlyX3UgPSB2aS0+dmlfdWFyZWE7CisKKyAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAiRElSRU5UUlksIGluZGV4ICVkLCB0eXBlIDB4JXgsICVoLCBmbGFncyAweCV4IiwKKwkJICAgICAgdmktPnZpX2luZGV4LCB2aS0+dmlfdHlwZSwgdmktPnZpX2loLCBkaXJfdS0+ZmxhZ3MpOworICAgIHByaW50ayAoIiVkIGVudHJpZXM6ICIsIGRpcl91LT5lbnRyeV9jb3VudCk7CisgICAgZm9yIChpID0gMDsgaSA8IGRpcl91LT5lbnRyeV9jb3VudDsgaSArKykKKwlwcmludGsgKCIlZCAiLCBkaXJfdS0+ZW50cnlfc2l6ZXNbaV0pOworICAgIHByaW50ayAoIlxuIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXRlbV9vcGVyYXRpb25zIGRpcmVudHJ5X29wcyA9IHsKKwkuYnl0ZXNfbnVtYmVyCQk9IGRpcmVudHJ5X2J5dGVzX251bWJlciwKKwkuZGVjcmVtZW50X2tleQkJPSBkaXJlbnRyeV9kZWNyZW1lbnRfa2V5LAorCS5pc19sZWZ0X21lcmdlYWJsZQk9IGRpcmVudHJ5X2lzX2xlZnRfbWVyZ2VhYmxlLAorCS5wcmludF9pdGVtCQk9IGRpcmVudHJ5X3ByaW50X2l0ZW0sCisJLmNoZWNrX2l0ZW0JCT0gZGlyZW50cnlfY2hlY2tfaXRlbSwKKworCS5jcmVhdGVfdmkJCT0gZGlyZW50cnlfY3JlYXRlX3ZpLAorCS5jaGVja19sZWZ0CQk9IGRpcmVudHJ5X2NoZWNrX2xlZnQsCisJLmNoZWNrX3JpZ2h0CQk9IGRpcmVudHJ5X2NoZWNrX3JpZ2h0LAorCS5wYXJ0X3NpemUJCT0gZGlyZW50cnlfcGFydF9zaXplLAorCS51bml0X251bQkJPSBkaXJlbnRyeV91bml0X251bSwKKwkucHJpbnRfdmkJCT0gZGlyZW50cnlfcHJpbnRfdmkKK307CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBFcnJvciBjYXRjaGluZyBmdW5jdGlvbnMgdG8gY2F0Y2ggZXJyb3JzIGNhdXNlZCBieSBpbmNvcnJlY3QgaXRlbSB0eXBlcy4KKy8vCitzdGF0aWMgaW50IGVycmNhdGNoX2J5dGVzX251bWJlciAoc3RydWN0IGl0ZW1faGVhZCAqIGloLCBpbnQgYmxvY2tfc2l6ZSkKK3sKKyAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAiZ3JlZW4tMTYwMDE6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVycmNhdGNoX2RlY3JlbWVudF9rZXkgKHN0cnVjdCBjcHVfa2V5ICoga2V5KQoreworICAgIHJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJncmVlbi0xNjAwMjogSW52YWxpZCBpdGVtIHR5cGUgb2JzZXJ2ZWQsIHJ1biBmc2NrIEFTQVAiKTsKK30KKworCitzdGF0aWMgaW50IGVycmNhdGNoX2lzX2xlZnRfbWVyZ2VhYmxlIChzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5LCB1bnNpZ25lZCBsb25nIGJzaXplKQoreworICAgIHJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJncmVlbi0xNjAwMzogSW52YWxpZCBpdGVtIHR5cGUgb2JzZXJ2ZWQsIHJ1biBmc2NrIEFTQVAiKTsKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBlcnJjYXRjaF9wcmludF9pdGVtIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGNoYXIgKiBpdGVtKQoreworICAgIHJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJncmVlbi0xNjAwNDogSW52YWxpZCBpdGVtIHR5cGUgb2JzZXJ2ZWQsIHJ1biBmc2NrIEFTQVAiKTsKK30KKworCitzdGF0aWMgdm9pZCBlcnJjYXRjaF9jaGVja19pdGVtIChzdHJ1Y3QgaXRlbV9oZWFkICogaWgsIGNoYXIgKiBpdGVtKQoreworICAgIHJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJncmVlbi0xNjAwNTogSW52YWxpZCBpdGVtIHR5cGUgb2JzZXJ2ZWQsIHJ1biBmc2NrIEFTQVAiKTsKK30KKworc3RhdGljIGludCBlcnJjYXRjaF9jcmVhdGVfdmkgKHN0cnVjdCB2aXJ0dWFsX25vZGUgKiB2biwKKwkJCSAgICAgICBzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIAorCQkJICAgICAgIGludCBpc19hZmZlY3RlZCwgCisJCQkgICAgICAgaW50IGluc2VydF9zaXplKQoreworICAgIHJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJncmVlbi0xNjAwNjogSW52YWxpZCBpdGVtIHR5cGUgb2JzZXJ2ZWQsIHJ1biBmc2NrIEFTQVAiKTsKKyAgICByZXR1cm4gMDsJLy8gV2UgbWlnaHQgcmV0dXJuIC0xIGhlcmUgYXMgd2VsbCwgYnV0IGl0IHdvbid0IGhlbHAgYXMgY3JlYXRlX3ZpcnR1YWxfbm9kZSgpIGZyb20gd2hlcmUKKwkJLy8gdGhpcyBvcGVyYXRpb24gaXMgY2FsbGVkIGZyb20gaXMgb2YgcmV0dXJuIHR5cGUgdm9pZC4KK30KKworc3RhdGljIGludCBlcnJjYXRjaF9jaGVja19sZWZ0IChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmcmVlLAorCQkJCWludCBzdGFydF9za2lwLCBpbnQgZW5kX3NraXApCit7CisgICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImdyZWVuLTE2MDA3OiBJbnZhbGlkIGl0ZW0gdHlwZSBvYnNlcnZlZCwgcnVuIGZzY2sgQVNBUCIpOworICAgIHJldHVybiAtMTsKK30KKworCitzdGF0aWMgaW50IGVycmNhdGNoX2NoZWNrX3JpZ2h0IChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmcmVlKQoreworICAgIHJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJncmVlbi0xNjAwODogSW52YWxpZCBpdGVtIHR5cGUgb2JzZXJ2ZWQsIHJ1biBmc2NrIEFTQVAiKTsKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgZXJyY2F0Y2hfcGFydF9zaXplIChzdHJ1Y3QgdmlydHVhbF9pdGVtICogdmksIGludCBmaXJzdCwgaW50IGNvdW50KQoreworICAgIHJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJncmVlbi0xNjAwOTogSW52YWxpZCBpdGVtIHR5cGUgb2JzZXJ2ZWQsIHJ1biBmc2NrIEFTQVAiKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlcnJjYXRjaF91bml0X251bSAoc3RydWN0IHZpcnR1YWxfaXRlbSAqIHZpKQoreworICAgIHJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJncmVlbi0xNjAxMDogSW52YWxpZCBpdGVtIHR5cGUgb2JzZXJ2ZWQsIHJ1biBmc2NrIEFTQVAiKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZXJyY2F0Y2hfcHJpbnRfdmkgKHN0cnVjdCB2aXJ0dWFsX2l0ZW0gKiB2aSkKK3sKKyAgICByZWlzZXJmc193YXJuaW5nIChOVUxMLCAiZ3JlZW4tMTYwMTE6IEludmFsaWQgaXRlbSB0eXBlIG9ic2VydmVkLCBydW4gZnNjayBBU0FQIik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXRlbV9vcGVyYXRpb25zIGVycmNhdGNoX29wcyA9IHsKKyAgICBlcnJjYXRjaF9ieXRlc19udW1iZXIsCisgICAgZXJyY2F0Y2hfZGVjcmVtZW50X2tleSwKKyAgICBlcnJjYXRjaF9pc19sZWZ0X21lcmdlYWJsZSwKKyAgICBlcnJjYXRjaF9wcmludF9pdGVtLAorICAgIGVycmNhdGNoX2NoZWNrX2l0ZW0sCisKKyAgICBlcnJjYXRjaF9jcmVhdGVfdmksCisgICAgZXJyY2F0Y2hfY2hlY2tfbGVmdCwKKyAgICBlcnJjYXRjaF9jaGVja19yaWdodCwKKyAgICBlcnJjYXRjaF9wYXJ0X3NpemUsCisgICAgZXJyY2F0Y2hfdW5pdF9udW0sCisgICAgZXJyY2F0Y2hfcHJpbnRfdmkKK307CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLworI2lmICEgKFRZUEVfU1RBVF9EQVRBID09IDAgJiYgVFlQRV9JTkRJUkVDVCA9PSAxICYmIFRZUEVfRElSRUNUID09IDIgJiYgVFlQRV9ESVJFTlRSWSA9PSAzKQorICBkbyBub3QgY29tcGlsZQorI2VuZGlmCisKK3N0cnVjdCBpdGVtX29wZXJhdGlvbnMgKiBpdGVtX29wcyBbVFlQRV9BTlkgKyAxXSA9IHsKKyAgJnN0YXRfZGF0YV9vcHMsCisgICZpbmRpcmVjdF9vcHMsCisgICZkaXJlY3Rfb3BzLAorICAmZGlyZW50cnlfb3BzLAorICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorICAmZXJyY2F0Y2hfb3BzCQkvKiBUaGlzIGlzIHRvIGNhdGNoIGVycm9ycyB3aXRoIGludmFsaWQgdHlwZSAoMTV0aCBlbnRyeSBmb3IgVFlQRV9BTlkpICovCit9OworCisKKworCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9qb3VybmFsLmMgYi9mcy9yZWlzZXJmcy9qb3VybmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlhZDNhNwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3JlaXNlcmZzL2pvdXJuYWwuYwpAQCAtMCwwICsxLDM4NzYgQEAKKy8qCisqKiBXcml0ZSBhaGVhZCBsb2dnaW5nIGltcGxlbWVudGF0aW9uIGNvcHlyaWdodCBDaHJpcyBNYXNvbiAyMDAwCisqKgorKiogVGhlIGJhY2tncm91bmQgY29tbWl0cyBtYWtlIHRoaXMgY29kZSB2ZXJ5IGludGVyZWxhdGVkLCBhbmQgCisqKiBvdmVybHkgY29tcGxleC4gIEkgbmVlZCB0byByZXRoaW5rIHRoaW5ncyBhIGJpdC4uLi5UaGUgbWFqb3IgcGxheWVyczoKKyoqCisqKiBqb3VybmFsX2JlZ2luIC0tIGNhbGwgd2l0aCB0aGUgbnVtYmVyIG9mIGJsb2NrcyB5b3UgZXhwZWN0IHRvIGxvZy4gIAorKiogICAgICAgICAgICAgICAgICBJZiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBpcyB0b28KKyoqIAkJICAgIG9sZCwgaXQgd2lsbCBibG9jayB1bnRpbCB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBpcyAKKyoqIAkJICAgIGZpbmlzaGVkLCBhbmQgdGhlbiBzdGFydCBhIG5ldyBvbmUuCisqKgkJICAgIFVzdWFsbHksIHlvdXIgdHJhbnNhY3Rpb24gd2lsbCBnZXQgam9pbmVkIGluIHdpdGggCisqKiAgICAgICAgICAgICAgICAgIHByZXZpb3VzIG9uZXMgZm9yIHNwZWVkLgorKioKKyoqIGpvdXJuYWxfam9pbiAgLS0gc2FtZSBhcyBqb3VybmFsX2JlZ2luLCBidXQgd29uJ3QgYmxvY2sgb24gdGhlIGN1cnJlbnQgCisqKiAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uIHJlZ2FyZGxlc3Mgb2YgYWdlLiAgRG9uJ3QgZXZlciBjYWxsCisqKiAgICAgICAgICAgICAgICAgIHRoaXMuICBFdmVyLiAgVGhlcmUgYXJlIG9ubHkgdHdvIHBsYWNlcyBpdCBzaG91bGQgYmUgCisqKiAgICAgICAgICAgICAgICAgIGNhbGxlZCBmcm9tLCBhbmQgdGhleSBhcmUgYm90aCBpbnNpZGUgdGhpcyBmaWxlLgorKioKKyoqIGpvdXJuYWxfbWFya19kaXJ0eSAtLSBhZGRzIGJsb2NrcyBpbnRvIHRoaXMgdHJhbnNhY3Rpb24uICBjbGVhcnMgYW55IGZsYWdzIAorKiogICAgICAgICAgICAgICAgICAgICAgIHRoYXQgbWlnaHQgbWFrZSB0aGVtIGdldCBzZW50IHRvIGRpc2sKKyoqICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBtYXJrcyB0aGVtIEJIX0pEaXJ0eS4gIFB1dHMgdGhlIGJ1ZmZlciBoZWFkIAorKiogICAgICAgICAgICAgICAgICAgICAgIGludG8gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gaGFzaC4gIAorKioKKyoqIGpvdXJuYWxfZW5kIC0tIGlmIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGlzIGJhdGNoYWJsZSwgaXQgZG9lcyBub3RoaW5nCisqKiAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UsIGl0IGNvdWxkIGRvIGFuIGFzeW5jL3N5bmNocm9ub3VzIGNvbW1pdCwgb3IKKyoqICAgICAgICAgICAgICAgICAgIGEgZnVsbCBmbHVzaCBvZiBhbGwgbG9nIGFuZCByZWFsIGJsb2NrcyBpbiB0aGUgCisqKiAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbi4KKyoqCisqKiBmbHVzaF9vbGRfY29tbWl0cyAtLSBpZiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBpcyB0b28gb2xkLCBpdCBpcyBlbmRlZCBhbmQgCisqKiAgICAgICAgICAgICAgICAgICAgICBjb21taXQgYmxvY2tzIGFyZSBzZW50IHRvIGRpc2suICBGb3JjZXMgY29tbWl0IGJsb2NrcyAKKyoqICAgICAgICAgICAgICAgICAgICAgIHRvIGRpc2sgZm9yIGFsbCBiYWNrZ3JvdW5kZWQgY29tbWl0cyB0aGF0IGhhdmUgYmVlbiAKKyoqICAgICAgICAgICAgICAgICAgICAgIGFyb3VuZCB0b28gbG9uZy4KKyoqCQkgICAgIC0tIE5vdGUsIGlmIHlvdSBjYWxsIHRoaXMgYXMgYW4gaW1tZWRpYXRlIGZsdXNoIGZyb20gCisqKgkJICAgICAgICBmcm9tIHdpdGhpbiBrdXBkYXRlLCBpdCB3aWxsIGlnbm9yZSB0aGUgaW1tZWRpYXRlIGZsYWcKKyovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfZnMuaD4KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorCisKKy8qIGdldHMgYSBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICogZnJvbSBhIGxpc3QgaGVhZCAqLworI2RlZmluZSBKT1VSTkFMX0xJU1RfRU5UUlkoaCkgKGxpc3RfZW50cnkoKGgpLCBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgal9saXN0KSkKKyNkZWZpbmUgSk9VUk5BTF9XT1JLX0VOVFJZKGgpIChsaXN0X2VudHJ5KChoKSwgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpfd29ya2luZ19saXN0KSkKKworLyogdGhlIG51bWJlciBvZiBtb3VudGVkIGZpbGVzeXN0ZW1zLiAgVGhpcyBpcyB1c2VkIHRvIGRlY2lkZSB3aGVuIHRvCisqKiBzdGFydCBhbmQga2lsbCB0aGUgY29tbWl0IHdvcmtxdWV1ZQorKi8KK3N0YXRpYyBpbnQgcmVpc2VyZnNfbW91bnRlZF9mc19jb3VudDsKKworc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpjb21taXRfd3E7CisKKyNkZWZpbmUgSk9VUk5BTF9UUkFOU19IQUxGIDEwMTggICAvKiBtdXN0IGJlIGNvcnJlY3QgdG8ga2VlcCB0aGUgZGVzYyBhbmQgY29tbWl0CisJCQkJICAgICBzdHJ1Y3RzIGF0IDRrICovCisjZGVmaW5lIEJVRk5SIDY0IC8qcmVhZCBhaGVhZCAqLworCisvKiBjbm9kZSBzdGF0IGJpdHMuICBNb3ZlIHRoZXNlIGludG8gcmVpc2VyZnNfZnMuaCAqLworCisjZGVmaW5lIEJMT0NLX0ZSRUVEIDIJCS8qIHRoaXMgYmxvY2sgd2FzIGZyZWVkLCBhbmQgY2FuJ3QgYmUgd3JpdHRlbi4gICovCisjZGVmaW5lIEJMT0NLX0ZSRUVEX0hPTERFUiAzICAgIC8qIHRoaXMgYmxvY2sgd2FzIGZyZWVkIGR1cmluZyB0aGlzIHRyYW5zYWN0aW9uLCBhbmQgY2FuJ3QgYmUgd3JpdHRlbiAqLworCisjZGVmaW5lIEJMT0NLX05FRURTX0ZMVVNIIDQJLyogdXNlZCBpbiBmbHVzaF9qb3VybmFsX2xpc3QgKi8KKyNkZWZpbmUgQkxPQ0tfRElSVElFRCA1CisKKworLyogam91cm5hbCBsaXN0IHN0YXRlIGJpdHMgKi8KKyNkZWZpbmUgTElTVF9UT1VDSEVEIDEKKyNkZWZpbmUgTElTVF9ESVJUWSAgIDIKKyNkZWZpbmUgTElTVF9DT01NSVRfUEVORElORyAgNAkJLyogc29tZW9uZSB3aWxsIGNvbW1pdCB0aGlzIGxpc3QgKi8KKworLyogZmxhZ3MgZm9yIGRvX2pvdXJuYWxfZW5kICovCisjZGVmaW5lIEZMVVNIX0FMTCAgIDEJCS8qIGZsdXNoIGNvbW1pdCBhbmQgcmVhbCBibG9ja3MgKi8KKyNkZWZpbmUgQ09NTUlUX05PVyAgMgkJLyogZW5kIGFuZCBjb21taXQgdGhpcyB0cmFuc2FjdGlvbiAqLworI2RlZmluZSBXQUlUICAgICAgICA0CQkvKiB3YWl0IGZvciB0aGUgbG9nIGJsb2NrcyB0byBoaXQgdGhlIGRpc2sqLworCitzdGF0aWMgaW50IGRvX2pvdXJuYWxfZW5kKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKixzdHJ1Y3Qgc3VwZXJfYmxvY2sgKix1bnNpZ25lZCBsb25nIG5ibG9ja3MsaW50IGZsYWdzKSA7CitzdGF0aWMgaW50IGZsdXNoX2pvdXJuYWxfbGlzdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsLCBpbnQgZmx1c2hhbGwpIDsKK3N0YXRpYyBpbnQgZmx1c2hfY29tbWl0X2xpc3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCwgaW50IGZsdXNoYWxsKSAgOworc3RhdGljIGludCBjYW5fZGlydHkoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuKSA7CitzdGF0aWMgaW50IGpvdXJuYWxfam9pbihzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIHVuc2lnbmVkIGxvbmcgbmJsb2Nrcyk7CitzdGF0aWMgaW50IHJlbGVhc2Vfam91cm5hbF9kZXYoIHN0cnVjdCBzdXBlcl9ibG9jayAqc3VwZXIsCisJCQkJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgKTsKK3N0YXRpYyBpbnQgZGlydHlfb25lX3RyYW5zYWN0aW9uKHN0cnVjdCBzdXBlcl9ibG9jayAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsKTsKK3N0YXRpYyB2b2lkIGZsdXNoX2FzeW5jX2NvbW1pdHModm9pZCAqcCk7CitzdGF0aWMgdm9pZCBxdWV1ZV9sb2dfd3JpdGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcyk7CisKKy8qIHZhbHVlcyBmb3Igam9pbiBpbiBkb19qb3VybmFsX2JlZ2luX3IgKi8KK2VudW0geworICAgIEpCRUdJTl9SRUcgPSAwLCAvKiByZWd1bGFyIGpvdXJuYWwgYmVnaW4gKi8KKyAgICBKQkVHSU5fSk9JTiA9IDEsIC8qIGpvaW4gdGhlIHJ1bm5pbmcgdHJhbnNhY3Rpb24gaWYgYXQgYWxsIHBvc3NpYmxlICovCisgICAgSkJFR0lOX0FCT1JUID0gMiwgLyogY2FsbGVkIGZyb20gY2xlYW51cCBjb2RlLCBpZ25vcmVzIGFib3J0ZWQgZmxhZyAqLworfTsKKworc3RhdGljIGludCBkb19qb3VybmFsX2JlZ2luX3Ioc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqIHBfc19zYiwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBuYmxvY2tzLGludCBqb2luKTsKKworc3RhdGljIHZvaWQgaW5pdF9qb3VybmFsX2hhc2goc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpIHsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOworICBtZW1zZXQoam91cm5hbC0+al9oYXNoX3RhYmxlLCAwLCBKT1VSTkFMX0hBU0hfU0laRSAqIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqKSkgOworfQorCisvKgorKiogY2xlYXJzIEJIX0RpcnR5IGFuZCBzdGlja3MgdGhlIGJ1ZmZlciBvbiB0aGUgY2xlYW4gbGlzdC4gIENhbGxlZCBiZWNhdXNlIEkgY2FuJ3QgYWxsb3cgcmVmaWxlX2J1ZmZlciB0bworKiogbWFrZSBzY2hlZHVsZSBoYXBwZW4gYWZ0ZXIgSSd2ZSBmcmVlZCBhIGJsb2NrLiAgTG9vayBhdCByZW1vdmVfZnJvbV90cmFuc2FjdGlvbiBhbmQgam91cm5hbF9tYXJrX2ZyZWVkIGZvcgorKiogbW9yZSBkZXRhaWxzLgorKi8KK3N0YXRpYyBpbnQgcmVpc2VyZnNfY2xlYW5fYW5kX2ZpbGVfYnVmZmVyKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpIHsKKyAgaWYgKGJoKSB7CisgICAgY2xlYXJfYnVmZmVyX2RpcnR5KGJoKTsKKyAgICBjbGVhcl9idWZmZXJfam91cm5hbF90ZXN0KGJoKTsKKyAgfQorICByZXR1cm4gMCA7Cit9CisKK3N0YXRpYyB2b2lkIGRpc2FibGVfYmFycmllcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCit7CisgICAgUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0ICY9IH4oMSA8PCBSRUlTRVJGU19CQVJSSUVSX0ZMVVNIKTsKKyAgICBwcmludGsoInJlaXNlcmZzOiBkaXNhYmxpbmcgZmx1c2ggYmFycmllcnMgb24gJXNcbiIsIHJlaXNlcmZzX2JkZXZuYW1lKHMpKTsKK30KKworc3RhdGljIHN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSAqCithbGxvY2F0ZV9iaXRtYXBfbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikgeworICBzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUgKmJuIDsKKyAgc3RhdGljIGludCBpZDsKKworICBibiA9IHJlaXNlcmZzX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSksIEdGUF9OT0ZTLCBwX3Nfc2IpIDsKKyAgaWYgKCFibikgeworICAgIHJldHVybiBOVUxMIDsKKyAgfQorICBibi0+ZGF0YSA9IHJlaXNlcmZzX2ttYWxsb2MocF9zX3NiLT5zX2Jsb2Nrc2l6ZSwgR0ZQX05PRlMsIHBfc19zYikgOworICBpZiAoIWJuLT5kYXRhKSB7CisgICAgcmVpc2VyZnNfa2ZyZWUoYm4sIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUpLCBwX3Nfc2IpIDsKKyAgICByZXR1cm4gTlVMTCA7CisgIH0KKyAgYm4tPmlkID0gaWQrKyA7CisgIG1lbXNldChibi0+ZGF0YSwgMCwgcF9zX3NiLT5zX2Jsb2Nrc2l6ZSkgOworICBJTklUX0xJU1RfSEVBRCgmYm4tPmxpc3QpIDsKKyAgcmV0dXJuIGJuIDsKK30KKworc3RhdGljIHN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSAqCitnZXRfYml0bWFwX25vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpIHsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOworICBzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUgKmJuID0gTlVMTDsKKyAgc3RydWN0IGxpc3RfaGVhZCAqZW50cnkgPSBqb3VybmFsLT5qX2JpdG1hcF9ub2Rlcy5uZXh0IDsKKworICBqb3VybmFsLT5qX3VzZWRfYml0bWFwX25vZGVzKysgOworcmVwZWF0OgorCisgIGlmKGVudHJ5ICE9ICZqb3VybmFsLT5qX2JpdG1hcF9ub2RlcykgeworICAgIGJuID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlLCBsaXN0KSA7CisgICAgbGlzdF9kZWwoZW50cnkpIDsKKyAgICBtZW1zZXQoYm4tPmRhdGEsIDAsIHBfc19zYi0+c19ibG9ja3NpemUpIDsKKyAgICBqb3VybmFsLT5qX2ZyZWVfYml0bWFwX25vZGVzLS0gOworICAgIHJldHVybiBibiA7CisgIH0KKyAgYm4gPSBhbGxvY2F0ZV9iaXRtYXBfbm9kZShwX3Nfc2IpIDsKKyAgaWYgKCFibikgeworICAgIHlpZWxkKCk7CisgICAgZ290byByZXBlYXQgOworICB9CisgIHJldHVybiBibiA7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9iaXRtYXBfbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSAqYm4pIHsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOworICBqb3VybmFsLT5qX3VzZWRfYml0bWFwX25vZGVzLS0gOworICBpZiAoam91cm5hbC0+al9mcmVlX2JpdG1hcF9ub2RlcyA+IFJFSVNFUkZTX01BWF9CSVRNQVBfTk9ERVMpIHsKKyAgICByZWlzZXJmc19rZnJlZShibi0+ZGF0YSwgcF9zX3NiLT5zX2Jsb2Nrc2l6ZSwgcF9zX3NiKSA7CisgICAgcmVpc2VyZnNfa2ZyZWUoYm4sIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUpLCBwX3Nfc2IpIDsKKyAgfSBlbHNlIHsKKyAgICBsaXN0X2FkZCgmYm4tPmxpc3QsICZqb3VybmFsLT5qX2JpdG1hcF9ub2RlcykgOworICAgIGpvdXJuYWwtPmpfZnJlZV9iaXRtYXBfbm9kZXMrKyA7CisgIH0KK30KKworc3RhdGljIHZvaWQgYWxsb2NhdGVfYml0bWFwX25vZGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKSB7CisgIGludCBpIDsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOworICBzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUgKmJuID0gTlVMTCA7CisgIGZvciAoaSA9IDAgOyBpIDwgUkVJU0VSRlNfTUlOX0JJVE1BUF9OT0RFUyA7IGkrKykgeworICAgIGJuID0gYWxsb2NhdGVfYml0bWFwX25vZGUocF9zX3NiKSA7CisgICAgaWYgKGJuKSB7CisgICAgICBsaXN0X2FkZCgmYm4tPmxpc3QsICZqb3VybmFsLT5qX2JpdG1hcF9ub2RlcykgOworICAgICAgam91cm5hbC0+al9mcmVlX2JpdG1hcF9ub2RlcysrIDsKKyAgICB9IGVsc2UgeworICAgICAgYnJlYWsgOyAvLyB0aGlzIGlzIG9rLCB3ZSdsbCB0cnkgYWdhaW4gd2hlbiBtb3JlIGFyZSBuZWVkZWQgCisgICAgfQorICB9Cit9CisKK3N0YXRpYyBpbnQgc2V0X2JpdF9pbl9saXN0X2JpdG1hcChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgaW50IGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCAqamIpIHsKKyAgaW50IGJtYXBfbnIgPSBibG9jayAvIChwX3Nfc2ItPnNfYmxvY2tzaXplIDw8IDMpIDsKKyAgaW50IGJpdF9uciA9IGJsb2NrICUgKHBfc19zYi0+c19ibG9ja3NpemUgPDwgMykgOworCisgIGlmICghamItPmJpdG1hcHNbYm1hcF9ucl0pIHsKKyAgICBqYi0+Yml0bWFwc1tibWFwX25yXSA9IGdldF9iaXRtYXBfbm9kZShwX3Nfc2IpIDsKKyAgfQorICBzZXRfYml0KGJpdF9uciwgKHVuc2lnbmVkIGxvbmcgKilqYi0+Yml0bWFwc1tibWFwX25yXS0+ZGF0YSkgOworICByZXR1cm4gMCA7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfYml0bWFwX2xpc3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCAqamIpIHsKKyAgaW50IGk7CisgIGlmIChqYi0+Yml0bWFwcyA9PSBOVUxMKQorICAgIHJldHVybjsKKworICBmb3IgKGkgPSAwIDsgaSA8IFNCX0JNQVBfTlIocF9zX3NiKSA7IGkrKykgeworICAgIGlmIChqYi0+Yml0bWFwc1tpXSkgeworICAgICAgZnJlZV9iaXRtYXBfbm9kZShwX3Nfc2IsIGpiLT5iaXRtYXBzW2ldKSA7CisgICAgICBqYi0+Yml0bWFwc1tpXSA9IE5VTEwgOworICAgIH0KKyAgfQorfQorCisvKgorKiogb25seSBjYWxsIHRoaXMgb24gRlMgdW5tb3VudC4KKyovCitzdGF0aWMgaW50IGZyZWVfbGlzdF9iaXRtYXBzKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKmpiX2FycmF5KSB7CisgIGludCBpIDsKKyAgc3RydWN0IHJlaXNlcmZzX2xpc3RfYml0bWFwICpqYiA7CisgIGZvciAoaSA9IDAgOyBpIDwgSk9VUk5BTF9OVU1fQklUTUFQUyA7IGkrKykgeworICAgIGpiID0gamJfYXJyYXkgKyBpIDsKKyAgICBqYi0+am91cm5hbF9saXN0ID0gTlVMTCA7CisgICAgY2xlYW51cF9iaXRtYXBfbGlzdChwX3Nfc2IsIGpiKSA7CisgICAgdmZyZWUoamItPmJpdG1hcHMpIDsKKyAgICBqYi0+Yml0bWFwcyA9IE5VTEwgOworICB9CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZyZWVfYml0bWFwX25vZGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKSB7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKKyAgc3RydWN0IGxpc3RfaGVhZCAqbmV4dCA9IGpvdXJuYWwtPmpfYml0bWFwX25vZGVzLm5leHQgOworICBzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUgKmJuIDsKKworICB3aGlsZShuZXh0ICE9ICZqb3VybmFsLT5qX2JpdG1hcF9ub2RlcykgeworICAgIGJuID0gbGlzdF9lbnRyeShuZXh0LCBzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX25vZGUsIGxpc3QpIDsKKyAgICBsaXN0X2RlbChuZXh0KSA7CisgICAgcmVpc2VyZnNfa2ZyZWUoYm4tPmRhdGEsIHBfc19zYi0+c19ibG9ja3NpemUsIHBfc19zYikgOworICAgIHJlaXNlcmZzX2tmcmVlKGJuLCBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlKSwgcF9zX3NiKSA7CisgICAgbmV4dCA9IGpvdXJuYWwtPmpfYml0bWFwX25vZGVzLm5leHQgOworICAgIGpvdXJuYWwtPmpfZnJlZV9iaXRtYXBfbm9kZXMtLSA7CisgIH0KKworICByZXR1cm4gMCA7Cit9CisKKy8qCisqKiBnZXQgbWVtb3J5IGZvciBKT1VSTkFMX05VTV9CSVRNQVBTIHdvcnRoIG9mIGJpdG1hcHMuIAorKiogamJfYXJyYXkgaXMgdGhlIGFycmF5IHRvIGJlIGZpbGxlZCBpbi4KKyovCitpbnQgcmVpc2VyZnNfYWxsb2NhdGVfbGlzdF9iaXRtYXBzKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKmpiX2FycmF5LAorCQkJCSAgIGludCBibWFwX25yKSB7CisgIGludCBpIDsKKyAgaW50IGZhaWxlZCA9IDAgOworICBzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKmpiIDsKKyAgaW50IG1lbSA9IGJtYXBfbnIgKiBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9ub2RlICopIDsKKworICBmb3IgKGkgPSAwIDsgaSA8IEpPVVJOQUxfTlVNX0JJVE1BUFMgOyBpKyspIHsKKyAgICBqYiA9IGpiX2FycmF5ICsgaSA7CisgICAgamItPmpvdXJuYWxfbGlzdCA9IE5VTEwgOworICAgIGpiLT5iaXRtYXBzID0gdm1hbGxvYyggbWVtICkgOworICAgIGlmICghamItPmJpdG1hcHMpIHsKKyAgICAgIHJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLCAiY2xtLTIwMDAsIHVuYWJsZSB0byBhbGxvY2F0ZSBiaXRtYXBzIGZvciBqb3VybmFsIGxpc3RzIikgOworICAgICAgZmFpbGVkID0gMTsgICAKKyAgICAgIGJyZWFrIDsKKyAgICB9CisgICAgbWVtc2V0KGpiLT5iaXRtYXBzLCAwLCBtZW0pIDsKKyAgfQorICBpZiAoZmFpbGVkKSB7CisgICAgZnJlZV9saXN0X2JpdG1hcHMocF9zX3NiLCBqYl9hcnJheSkgOworICAgIHJldHVybiAtMSA7CisgIH0KKyAgcmV0dXJuIDAgOworfQorCisvKgorKiogZmluZCBhbiBhdmFpbGFibGUgbGlzdCBiaXRtYXAuICBJZiB5b3UgY2FuJ3QgZmluZCBvbmUsIGZsdXNoIGEgY29tbWl0IGxpc3QgCisqKiBhbmQgdHJ5IGFnYWluCisqLworc3RhdGljIHN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCAqCitnZXRfbGlzdF9iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsKSB7CisgIGludCBpLGogOyAKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOworICBzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKmpiID0gTlVMTCA7CisKKyAgZm9yIChqID0gMCA7IGogPCAoSk9VUk5BTF9OVU1fQklUTUFQUyAqIDMpIDsgaisrKSB7CisgICAgaSA9IGpvdXJuYWwtPmpfbGlzdF9iaXRtYXBfaW5kZXggOworICAgIGpvdXJuYWwtPmpfbGlzdF9iaXRtYXBfaW5kZXggPSAoaSArIDEpICUgSk9VUk5BTF9OVU1fQklUTUFQUyA7CisgICAgamIgPSBqb3VybmFsLT5qX2xpc3RfYml0bWFwICsgaSA7CisgICAgaWYgKGpvdXJuYWwtPmpfbGlzdF9iaXRtYXBbaV0uam91cm5hbF9saXN0KSB7CisgICAgICBmbHVzaF9jb21taXRfbGlzdChwX3Nfc2IsIGpvdXJuYWwtPmpfbGlzdF9iaXRtYXBbaV0uam91cm5hbF9saXN0LCAxKSA7CisgICAgICBpZiAoIWpvdXJuYWwtPmpfbGlzdF9iaXRtYXBbaV0uam91cm5hbF9saXN0KSB7CisJYnJlYWsgOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBicmVhayA7CisgICAgfQorICB9CisgIGlmIChqYi0+am91cm5hbF9saXN0KSB7IC8qIGRvdWJsZSBjaGVjayB0byBtYWtlIHN1cmUgaWYgZmx1c2hlZCBjb3JyZWN0bHkgKi8KKyAgICByZXR1cm4gTlVMTCA7CisgIH0KKyAgamItPmpvdXJuYWxfbGlzdCA9IGpsIDsKKyAgcmV0dXJuIGpiIDsKK30KKworLyogCisqKiBhbGxvY2F0ZXMgYSBuZXcgY2h1bmsgb2YgWCBub2RlcywgYW5kIGxpbmtzIHRoZW0gYWxsIHRvZ2V0aGVyIGFzIGEgbGlzdC4KKyoqIFVzZXMgdGhlIGNub2RlLT5uZXh0IGFuZCBjbm9kZS0+cHJldiBwb2ludGVycworKiogcmV0dXJucyBOVUxMIG9uIGZhaWx1cmUKKyovCitzdGF0aWMgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmFsbG9jYXRlX2Nub2RlcyhpbnQgbnVtX2Nub2RlcykgeworICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqaGVhZCA7CisgIGludCBpIDsKKyAgaWYgKG51bV9jbm9kZXMgPD0gMCkgeworICAgIHJldHVybiBOVUxMIDsKKyAgfQorICBoZWFkID0gdm1hbGxvYyhudW1fY25vZGVzICogc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlKSkgOworICBpZiAoIWhlYWQpIHsKKyAgICByZXR1cm4gTlVMTCA7CisgIH0KKyAgbWVtc2V0KGhlYWQsIDAsIG51bV9jbm9kZXMgKiBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUpKSA7CisgIGhlYWRbMF0ucHJldiA9IE5VTEwgOworICBoZWFkWzBdLm5leHQgPSBoZWFkICsgMSA7CisgIGZvciAoaSA9IDEgOyBpIDwgbnVtX2Nub2RlczsgaSsrKSB7CisgICAgaGVhZFtpXS5wcmV2ID0gaGVhZCArIChpIC0gMSkgOworICAgIGhlYWRbaV0ubmV4dCA9IGhlYWQgKyAoaSArIDEpIDsgLyogaWYgbGFzdCBvbmUsIG92ZXJ3cml0ZSBpdCBhZnRlciB0aGUgaWYgKi8KKyAgfQorICBoZWFkW251bV9jbm9kZXMgLTFdLm5leHQgPSBOVUxMIDsKKyAgcmV0dXJuIGhlYWQgOworfQorCisvKgorKiogcHVsbHMgYSBjbm9kZSBvZmYgdGhlIGZyZWUgbGlzdCwgb3IgcmV0dXJucyBOVUxMIG9uIGZhaWx1cmUgCisqLworc3RhdGljIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpnZXRfY25vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpIHsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuIDsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOworCisgIHJlaXNlcmZzX2NoZWNrX2xvY2tfZGVwdGgocF9zX3NiLCAiZ2V0X2Nub2RlIikgOworCisgIGlmIChqb3VybmFsLT5qX2Nub2RlX2ZyZWUgPD0gMCkgeworICAgIHJldHVybiBOVUxMIDsKKyAgfQorICBqb3VybmFsLT5qX2Nub2RlX3VzZWQrKyA7CisgIGpvdXJuYWwtPmpfY25vZGVfZnJlZS0tIDsKKyAgY24gPSBqb3VybmFsLT5qX2Nub2RlX2ZyZWVfbGlzdCA7CisgIGlmICghY24pIHsKKyAgICByZXR1cm4gY24gOworICB9CisgIGlmIChjbi0+bmV4dCkgeworICAgIGNuLT5uZXh0LT5wcmV2ID0gTlVMTCA7CisgIH0KKyAgam91cm5hbC0+al9jbm9kZV9mcmVlX2xpc3QgPSBjbi0+bmV4dCA7CisgIG1lbXNldChjbiwgMCwgc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlKSkgOworICByZXR1cm4gY24gOworfQorCisvKgorKiogcmV0dXJucyBhIGNub2RlIHRvIHRoZSBmcmVlIGxpc3QgCisqLworc3RhdGljIHZvaWQgZnJlZV9jbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuKSB7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKKworICByZWlzZXJmc19jaGVja19sb2NrX2RlcHRoKHBfc19zYiwgImZyZWVfY25vZGUiKSA7CisKKyAgam91cm5hbC0+al9jbm9kZV91c2VkLS0gOworICBqb3VybmFsLT5qX2Nub2RlX2ZyZWUrKyA7CisgIC8qIG1lbXNldChjbiwgMCwgc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlKSkgOyAqLworICBjbi0+bmV4dCA9IGpvdXJuYWwtPmpfY25vZGVfZnJlZV9saXN0IDsKKyAgaWYgKGpvdXJuYWwtPmpfY25vZGVfZnJlZV9saXN0KSB7CisgICAgam91cm5hbC0+al9jbm9kZV9mcmVlX2xpc3QtPnByZXYgPSBjbiA7CisgIH0KKyAgY24tPnByZXYgPSBOVUxMIDsgLyogbm90IG5lZWRlZCB3aXRoIHRoZSBtZW1zZXQsIGJ1dCBJIG1pZ2h0IGtpbGwgdGhlIG1lbXNldCwgYW5kIGZvcmdldCB0byBkbyB0aGlzICovCisgIGpvdXJuYWwtPmpfY25vZGVfZnJlZV9saXN0ID0gY24gOworfQorCitzdGF0aWMgdm9pZCBjbGVhcl9wcmVwYXJlZF9iaXRzKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpIHsKKyAgY2xlYXJfYnVmZmVyX2pvdXJuYWxfcHJlcGFyZWQgKGJoKTsKKyAgY2xlYXJfYnVmZmVyX2pvdXJuYWxfcmVzdG9yZV9kaXJ0eSAoYmgpOworfQorCisvKiB1dGlsaXR5IGZ1bmN0aW9uIHRvIGZvcmNlIGEgQlVHIGlmIGl0IGlzIGNhbGxlZCB3aXRob3V0IHRoZSBiaWcKKyoqIGtlcm5lbCBsb2NrIGhlbGQuICBjYWxsZXIgaXMgdGhlIHN0cmluZyBwcmludGVkIGp1c3QgYmVmb3JlIGNhbGxpbmcgQlVHKCkKKyovCit2b2lkIHJlaXNlcmZzX2NoZWNrX2xvY2tfZGVwdGgoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY2hhciAqY2FsbGVyKSB7CisjaWZkZWYgQ09ORklHX1NNUAorICBpZiAoY3VycmVudC0+bG9ja19kZXB0aCA8IDApIHsKKyAgICByZWlzZXJmc19wYW5pYyAoc2IsICIlcyBjYWxsZWQgd2l0aG91dCBrZXJuZWwgbG9jayBoZWxkIiwgY2FsbGVyKSA7CisgIH0KKyNlbHNlCisgIDsKKyNlbmRpZgorfQorCisvKiByZXR1cm4gYSBjbm9kZSB3aXRoIHNhbWUgZGV2LCBibG9jayBudW1iZXIgYW5kIHNpemUgaW4gdGFibGUsIG9yIG51bGwgaWYgbm90IGZvdW5kICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICoKK2dldF9qb3VybmFsX2hhc2hfZGV2KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCSAgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKip0YWJsZSwKKwkJICAgICBsb25nIGJsKQoreworICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24gOworICBjbiA9IGpvdXJuYWxfaGFzaCh0YWJsZSwgc2IsIGJsKSA7CisgIHdoaWxlKGNuKSB7CisgICAgaWYgKGNuLT5ibG9ja25yID09IGJsICYmIGNuLT5zYiA9PSBzYikKKyAgICAgIHJldHVybiBjbiA7CisgICAgY24gPSBjbi0+aG5leHQgOworICB9CisgIHJldHVybiAoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKikwIDsKK30KKworLyoKKyoqIHRoaXMgYWN0dWFsbHkgbWVhbnMgJ2NhbiB0aGlzIGJsb2NrIGJlIHJlYWxsb2NhdGVkIHlldD8nLiAgSWYgeW91IHNldCBzZWFyY2hfYWxsLCBhIGJsb2NrIGNhbiBvbmx5IGJlIGFsbG9jYXRlZAorKiogaWYgaXQgaXMgbm90IGluIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLCB3YXMgbm90IGZyZWVkIGJ5IHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLCBhbmQgaGFzIG5vIGNoYW5jZSBvZiBldmVyCisqKiBiZWluZyBvdmVyd3JpdHRlbiBieSBhIHJlcGxheSBhZnRlciBjcmFzaGluZy4KKyoqCisqKiBJZiB5b3UgZG9uJ3Qgc2V0IHNlYXJjaF9hbGwsIGEgYmxvY2sgY2FuIG9ubHkgYmUgYWxsb2NhdGVkIGlmIGl0IGlzIG5vdCBpbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4gIFNpbmNlIGRlbGV0aW5nCisqKiBhIGJsb2NrIHJlbW92ZXMgaXQgZnJvbSB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiwgdGhpcyBjYXNlIHNob3VsZCBuZXZlciBoYXBwZW4uICBJZiB5b3UgZG9uJ3Qgc2V0IHNlYXJjaF9hbGwsIG1ha2UKKyoqIHN1cmUgeW91IG5ldmVyIHdyaXRlIHRoZSBibG9jayB3aXRob3V0IGxvZ2dpbmcgaXQuCisqKgorKiogbmV4dF96ZXJvX2JpdCBpcyBhIHN1Z2dlc3Rpb24gYWJvdXQgdGhlIG5leHQgYmxvY2sgdG8gdHJ5IGZvciBmaW5kX2ZvcndhcmQuCisqKiB3aGVuIGJsIGlzIHJlamVjdGVkIGJlY2F1c2UgaXQgaXMgc2V0IGluIGEgam91cm5hbCBsaXN0IGJpdG1hcCwgd2Ugc2VhcmNoCisqKiBmb3IgdGhlIG5leHQgemVybyBiaXQgaW4gdGhlIGJpdG1hcCB0aGF0IHJlamVjdGVkIGJsLiAgVGhlbiwgd2UgcmV0dXJuIHRoYXQKKyoqIHRocm91Z2ggbmV4dF96ZXJvX2JpdCBmb3IgZmluZF9mb3J3YXJkIHRvIHRyeS4KKyoqCisqKiBKdXN0IGJlY2F1c2Ugd2UgcmV0dXJuIHNvbWV0aGluZyBpbiBuZXh0X3plcm9fYml0IGRvZXMgbm90IG1lYW4gd2Ugd29uJ3QKKyoqIHJlamVjdCBpdCBvbiB0aGUgbmV4dCBjYWxsIHRvIHJlaXNlcmZzX2luX2pvdXJuYWwKKyoqCisqLworaW50IHJlaXNlcmZzX2luX2pvdXJuYWwoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYm1hcF9uciwgaW50IGJpdF9uciwgaW50IHNlYXJjaF9hbGwsIAorCQkJYl9ibG9ja25yX3QgKm5leHRfemVyb19iaXQpIHsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOworICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24gOworICBzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKmpiIDsKKyAgaW50IGkgOworICB1bnNpZ25lZCBsb25nIGJsOworCisgICpuZXh0X3plcm9fYml0ID0gMCA7IC8qIGFsd2F5cyBzdGFydCB0aGlzIGF0IHplcm8uICovCisKKyAgUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBqb3VybmFsLmluX2pvdXJuYWwgKTsKKyAgLyogSWYgd2UgYXJlbid0IGRvaW5nIGEgc2VhcmNoX2FsbCwgdGhpcyBpcyBhIG1ldGFibG9jaywgYW5kIGl0IHdpbGwgYmUgbG9nZ2VkIGJlZm9yZSB1c2UuCisgICoqIGlmIHdlIGNyYXNoIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gdGhhdCBmcmVlZCBpdCBjb21taXRzLCAgdGhpcyB0cmFuc2FjdGlvbiB3b24ndAorICAqKiBoYXZlIGNvbW1pdHRlZCBlaXRoZXIsIGFuZCB0aGUgYmxvY2sgd2lsbCBuZXZlciBiZSB3cml0dGVuCisgICovCisgIGlmIChzZWFyY2hfYWxsKSB7CisgICAgZm9yIChpID0gMCA7IGkgPCBKT1VSTkFMX05VTV9CSVRNQVBTIDsgaSsrKSB7CisgICAgICBQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIGpvdXJuYWwuaW5fam91cm5hbF9iaXRtYXAgKTsKKyAgICAgIGpiID0gam91cm5hbC0+al9saXN0X2JpdG1hcCArIGkgOworICAgICAgaWYgKGpiLT5qb3VybmFsX2xpc3QgJiYgamItPmJpdG1hcHNbYm1hcF9ucl0gJiYKKyAgICAgICAgICB0ZXN0X2JpdChiaXRfbnIsICh1bnNpZ25lZCBsb25nICopamItPmJpdG1hcHNbYm1hcF9ucl0tPmRhdGEpKSB7CisJKm5leHRfemVyb19iaXQgPSBmaW5kX25leHRfemVyb19iaXQoKHVuc2lnbmVkIGxvbmcgKikKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqYi0+Yml0bWFwc1tibWFwX25yXS0+ZGF0YSksCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3Nfc2ItPnNfYmxvY2tzaXplIDw8IDMsIGJpdF9ucisxKSA7IAorCXJldHVybiAxIDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBibCA9IGJtYXBfbnIgKiAocF9zX3NiLT5zX2Jsb2Nrc2l6ZSA8PCAzKSArIGJpdF9ucjsKKyAgLyogaXMgaXQgaW4gYW55IG9sZCB0cmFuc2FjdGlvbnM/ICovCisgIGlmIChzZWFyY2hfYWxsICYmIChjbiA9IGdldF9qb3VybmFsX2hhc2hfZGV2KHBfc19zYiwgam91cm5hbC0+al9saXN0X2hhc2hfdGFibGUsIGJsKSkpIHsKKyAgICByZXR1cm4gMTsgCisgIH0KKworICAvKiBpcyBpdCBpbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4gIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworICBpZiAoKGNuID0gZ2V0X2pvdXJuYWxfaGFzaF9kZXYocF9zX3NiLCBqb3VybmFsLT5qX2hhc2hfdGFibGUsIGJsKSkpIHsKKyAgICBCVUcoKTsKKyAgICByZXR1cm4gMTsgCisgIH0KKworICBQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIGpvdXJuYWwuaW5fam91cm5hbF9yZXVzYWJsZSApOworICAvKiBzYWZlIGZvciByZXVzZSAqLworICByZXR1cm4gMCA7Cit9CisKKy8qIGluc2VydCBjbiBpbnRvIHRhYmxlCisqLworc3RhdGljIGlubGluZSB2b2lkIGluc2VydF9qb3VybmFsX2hhc2goc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKip0YWJsZSwgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuKSB7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbl9vcmlnIDsKKworICBjbl9vcmlnID0gam91cm5hbF9oYXNoKHRhYmxlLCBjbi0+c2IsIGNuLT5ibG9ja25yKSA7CisgIGNuLT5obmV4dCA9IGNuX29yaWcgOworICBjbi0+aHByZXYgPSBOVUxMIDsKKyAgaWYgKGNuX29yaWcpIHsKKyAgICBjbl9vcmlnLT5ocHJldiA9IGNuIDsKKyAgfQorICBqb3VybmFsX2hhc2godGFibGUsIGNuLT5zYiwgY24tPmJsb2NrbnIpID0gIGNuIDsKK30KKworLyogbG9jayB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiAqLworaW5saW5lIHN0YXRpYyB2b2lkIGxvY2tfam91cm5hbChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikgeworICAgIFBST0NfSU5GT19JTkMoIHBfc19zYiwgam91cm5hbC5sb2NrX2pvdXJuYWwgKTsKKyAgICBkb3duKCZTQl9KT1VSTkFMKHBfc19zYiktPmpfbG9jayk7Cit9CisKKy8qIHVubG9jayB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiAqLworaW5saW5lIHN0YXRpYyB2b2lkIHVubG9ja19qb3VybmFsKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiKSB7CisgICAgdXAoJlNCX0pPVVJOQUwocF9zX3NiKS0+al9sb2NrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdldF9qb3VybmFsX2xpc3Qoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwpCit7CisgICAgamwtPmpfcmVmY291bnQrKzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHB1dF9qb3VybmFsX2xpc3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCkKK3sKKyAgICBpZiAoamwtPmpfcmVmY291bnQgPCAxKSB7CisgICAgICAgIHJlaXNlcmZzX3BhbmljIChzLCAidHJhbnMgaWQgJWx1LCByZWZjb3VudCBhdCAlZCIsIGpsLT5qX3RyYW5zX2lkLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamwtPmpfcmVmY291bnQpOworICAgIH0KKyAgICBpZiAoLS1qbC0+al9yZWZjb3VudCA9PSAwKQorICAgICAgICByZWlzZXJmc19rZnJlZShqbCwgc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QpLCBzKTsKK30KKworLyoKKyoqIHRoaXMgdXNlZCB0byBiZSBtdWNoIG1vcmUgaW52b2x2ZWQsIGFuZCBJJ20ga2VlcGluZyBpdCBqdXN0IGluIGNhc2UgdGhpbmdzIGdldCB1Z2x5IGFnYWluLgorKiogaXQgZ2V0cyBjYWxsZWQgYnkgZmx1c2hfY29tbWl0X2xpc3QsIGFuZCBjbGVhbnMgdXAgYW55IGRhdGEgc3RvcmVkIGFib3V0IGJsb2NrcyBmcmVlZCBkdXJpbmcgYQorKiogdHJhbnNhY3Rpb24uCisqLworc3RhdGljIHZvaWQgY2xlYW51cF9mcmVlZF9mb3Jfam91cm5hbF9saXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCkgeworCisgIHN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcCAqamIgPSBqbC0+al9saXN0X2JpdG1hcCA7CisgIGlmIChqYikgeworICAgIGNsZWFudXBfYml0bWFwX2xpc3QocF9zX3NiLCBqYikgOworICB9CisgIGpsLT5qX2xpc3RfYml0bWFwLT5qb3VybmFsX2xpc3QgPSBOVUxMIDsKKyAgamwtPmpfbGlzdF9iaXRtYXAgPSBOVUxMIDsKK30KKworc3RhdGljIGludCBqb3VybmFsX2xpc3Rfc3RpbGxfYWxpdmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB0cmFuc19pZCkKK3sKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHMpOworICAgIHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5ID0gJmpvdXJuYWwtPmpfam91cm5hbF9saXN0OworICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsOworCisgICAgaWYgKCFsaXN0X2VtcHR5KGVudHJ5KSkgeworICAgICAgICBqbCA9IEpPVVJOQUxfTElTVF9FTlRSWShlbnRyeS0+bmV4dCk7CisJaWYgKGpsLT5qX3RyYW5zX2lkIDw9IHRyYW5zX2lkKSB7CisJICAgIHJldHVybiAxOworCX0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJlaXNlcmZzX2VuZF9idWZmZXJfaW9fc3luYyhzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBpbnQgdXB0b2RhdGUpIHsKKyAgICBjaGFyIGJbQkRFVk5BTUVfU0laRV07CisKKyAgICBpZiAoYnVmZmVyX2pvdXJuYWxlZChiaCkpIHsKKyAgICAgICAgcmVpc2VyZnNfd2FybmluZyhOVUxMLCAiY2xtLTIwODQ6IHBpbm5lZCBidWZmZXIgJWx1OiVzIHNlbnQgdG8gZGlzayIsCisJICAgICAgICAgICAgICAgICBiaC0+Yl9ibG9ja25yLCBiZGV2bmFtZShiaC0+Yl9iZGV2LCBiKSkgOworICAgIH0KKyAgICBpZiAodXB0b2RhdGUpCisgICAgCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpIDsKKyAgICBlbHNlCisgICAgCWNsZWFyX2J1ZmZlcl91cHRvZGF0ZShiaCkgOworICAgIHVubG9ja19idWZmZXIoYmgpIDsKKyAgICBwdXRfYmgoYmgpIDsKK30KKworc3RhdGljIHZvaWQgcmVpc2VyZnNfZW5kX29yZGVyZWRfaW8oc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgaW50IHVwdG9kYXRlKSB7CisgICAgaWYgKHVwdG9kYXRlKQorICAgIAlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKSA7CisgICAgZWxzZQorICAgIAljbGVhcl9idWZmZXJfdXB0b2RhdGUoYmgpIDsKKyAgICB1bmxvY2tfYnVmZmVyKGJoKSA7CisgICAgcHV0X2JoKGJoKSA7Cit9CisKK3N0YXRpYyB2b2lkIHN1Ym1pdF9sb2dnZWRfYnVmZmVyKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpIHsKKyAgICBnZXRfYmgoYmgpIDsKKyAgICBiaC0+Yl9lbmRfaW8gPSByZWlzZXJmc19lbmRfYnVmZmVyX2lvX3N5bmMgOworICAgIGNsZWFyX2J1ZmZlcl9qb3VybmFsX25ldyAoYmgpOworICAgIGNsZWFyX2J1ZmZlcl9kaXJ0eShiaCkgOworICAgIGlmICghdGVzdF9jbGVhcl9idWZmZXJfam91cm5hbF90ZXN0IChiaCkpCisgICAgICAgIEJVRygpOworICAgIGlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkKKyAgICAgICAgQlVHKCk7CisgICAgc3VibWl0X2JoKFdSSVRFLCBiaCkgOworfQorCitzdGF0aWMgdm9pZCBzdWJtaXRfb3JkZXJlZF9idWZmZXIoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkgeworICAgIGdldF9iaChiaCkgOworICAgIGJoLT5iX2VuZF9pbyA9IHJlaXNlcmZzX2VuZF9vcmRlcmVkX2lvOworICAgIGNsZWFyX2J1ZmZlcl9kaXJ0eShiaCkgOworICAgIGlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkKKyAgICAgICAgQlVHKCk7CisgICAgc3VibWl0X2JoKFdSSVRFLCBiaCkgOworfQorCitzdGF0aWMgaW50IHN1Ym1pdF9iYXJyaWVyX2J1ZmZlcihzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKSB7CisgICAgZ2V0X2JoKGJoKSA7CisgICAgYmgtPmJfZW5kX2lvID0gcmVpc2VyZnNfZW5kX29yZGVyZWRfaW87CisgICAgY2xlYXJfYnVmZmVyX2RpcnR5KGJoKSA7CisgICAgaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKQorICAgICAgICBCVUcoKTsKKyAgICByZXR1cm4gc3VibWl0X2JoKFdSSVRFX0JBUlJJRVIsIGJoKSA7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2JhcnJpZXJfY29tcGxldGlvbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkgeworICAgIGlmIChidWZmZXJfZW9wbm90c3VwcChiaCkpIHsKKwljbGVhcl9idWZmZXJfZW9wbm90c3VwcChiaCk7CisJZGlzYWJsZV9iYXJyaWVyKHMpOworCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCXNldF9idWZmZXJfZGlydHkoYmgpOworCXN5bmNfZGlydHlfYnVmZmVyKGJoKTsKKyAgICB9Cit9CisKKyNkZWZpbmUgQ0hVTktfU0laRSAzMgorc3RydWN0IGJ1ZmZlcl9jaHVuayB7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaFtDSFVOS19TSVpFXTsKKyAgICBpbnQgbnI7Cit9OworCitzdGF0aWMgdm9pZCB3cml0ZV9jaHVuayhzdHJ1Y3QgYnVmZmVyX2NodW5rICpjaHVuaykgeworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBjaHVuay0+bnIgOyBpKyspIHsKKwlzdWJtaXRfbG9nZ2VkX2J1ZmZlcihjaHVuay0+YmhbaV0pIDsKKyAgICB9CisgICAgY2h1bmstPm5yID0gMDsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfb3JkZXJlZF9jaHVuayhzdHJ1Y3QgYnVmZmVyX2NodW5rICpjaHVuaykgeworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBjaHVuay0+bnIgOyBpKyspIHsKKwlzdWJtaXRfb3JkZXJlZF9idWZmZXIoY2h1bmstPmJoW2ldKSA7CisgICAgfQorICAgIGNodW5rLT5uciA9IDA7Cit9CisKK3N0YXRpYyBpbnQgYWRkX3RvX2NodW5rKHN0cnVjdCBidWZmZXJfY2h1bmsgKmNodW5rLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAorCQkJIHNwaW5sb2NrX3QgKmxvY2ssCisJCQkgdm9pZCAoZm4pKHN0cnVjdCBidWZmZXJfY2h1bmsgKikpCit7CisgICAgaW50IHJldCA9IDA7CisgICAgaWYgKGNodW5rLT5uciA+PSBDSFVOS19TSVpFKQorICAgICAgICBCVUcoKTsKKyAgICBjaHVuay0+YmhbY2h1bmstPm5yKytdID0gYmg7CisgICAgaWYgKGNodW5rLT5uciA+PSBDSFVOS19TSVpFKSB7CisJcmV0ID0gMTsKKyAgICAgICAgaWYgKGxvY2spCisJICAgIHNwaW5fdW5sb2NrKGxvY2spOworICAgICAgICBmbihjaHVuayk7CisgICAgICAgIGlmIChsb2NrKQorCSAgICBzcGluX2xvY2sobG9jayk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGF0b21pY190IG5yX3JlaXNlcmZzX2poID0gQVRPTUlDX0lOSVQoMCk7CitzdGF0aWMgc3RydWN0IHJlaXNlcmZzX2poICphbGxvY19qaCh2b2lkKSB7CisgICAgc3RydWN0IHJlaXNlcmZzX2poICpqaDsKKyAgICB3aGlsZSgxKSB7CisJamggPSBrbWFsbG9jKHNpemVvZigqamgpLCBHRlBfTk9GUyk7CisJaWYgKGpoKSB7CisJICAgIGF0b21pY19pbmMoJm5yX3JlaXNlcmZzX2poKTsKKwkgICAgcmV0dXJuIGpoOworCX0KKyAgICAgICAgeWllbGQoKTsKKyAgICB9Cit9CisKKy8qCisgKiB3ZSB3YW50IHRvIGZyZWUgdGhlIGpoIHdoZW4gdGhlIGJ1ZmZlciBoYXMgYmVlbiB3cml0dGVuCisgKiBhbmQgd2FpdGVkIG9uCisgKi8KK3ZvaWQgcmVpc2VyZnNfZnJlZV9qaChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKSB7CisgICAgc3RydWN0IHJlaXNlcmZzX2poICpqaDsKKworICAgIGpoID0gYmgtPmJfcHJpdmF0ZTsKKyAgICBpZiAoamgpIHsKKwliaC0+Yl9wcml2YXRlID0gTlVMTDsKKwlqaC0+YmggPSBOVUxMOworCWxpc3RfZGVsX2luaXQoJmpoLT5saXN0KTsKKwlrZnJlZShqaCk7CisJaWYgKGF0b21pY19yZWFkKCZucl9yZWlzZXJmc19qaCkgPD0gMCkKKwkgICAgQlVHKCk7CisJYXRvbWljX2RlYygmbnJfcmVpc2VyZnNfamgpOworCXB1dF9iaChiaCk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGludCBfX2FkZF9qaChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqaiwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0YWlsKQoreworICAgIHN0cnVjdCByZWlzZXJmc19qaCAqamg7CisKKyAgICBpZiAoYmgtPmJfcHJpdmF0ZSkgeworCXNwaW5fbG9jaygmai0+al9kaXJ0eV9idWZmZXJzX2xvY2spOworCWlmICghYmgtPmJfcHJpdmF0ZSkgeworCSAgICBzcGluX3VubG9jaygmai0+al9kaXJ0eV9idWZmZXJzX2xvY2spOworCSAgICBnb3RvIG5vX2poOworCX0KKyAgICAgICAgamggPSBiaC0+Yl9wcml2YXRlOworCWxpc3RfZGVsX2luaXQoJmpoLT5saXN0KTsKKyAgICB9IGVsc2Ugeworbm9famg6CisJZ2V0X2JoKGJoKTsKKwlqaCA9IGFsbG9jX2poKCk7CisJc3Bpbl9sb2NrKCZqLT5qX2RpcnR5X2J1ZmZlcnNfbG9jayk7CisJLyogYnVmZmVyIG11c3QgYmUgbG9ja2VkIGZvciBfX2FkZF9qaCwgc2hvdWxkIGJlIGFibGUgdG8gaGF2ZQorCSAqIHR3byBhZGRzIGF0IHRoZSBzYW1lIHRpbWUKKwkgKi8KKwlpZiAoYmgtPmJfcHJpdmF0ZSkKKwkgICAgQlVHKCk7CisJamgtPmJoID0gYmg7CisJYmgtPmJfcHJpdmF0ZSA9IGpoOworICAgIH0KKyAgICBqaC0+amwgPSBqLT5qX2N1cnJlbnRfamw7CisgICAgaWYgKHRhaWwpCisJbGlzdF9hZGRfdGFpbCgmamgtPmxpc3QsICZqaC0+amwtPmpfdGFpbF9iaF9saXN0KTsKKyAgICBlbHNlIHsKKwlsaXN0X2FkZF90YWlsKCZqaC0+bGlzdCwgJmpoLT5qbC0+al9iaF9saXN0KTsKKyAgICB9CisgICAgc3Bpbl91bmxvY2soJmotPmpfZGlydHlfYnVmZmVyc19sb2NrKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IHJlaXNlcmZzX2FkZF90YWlsX2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkgeworICAgIHJldHVybiBfX2FkZF9qaChTQl9KT1VSTkFMKGlub2RlLT5pX3NiKSwgYmgsIDEpOworfQoraW50IHJlaXNlcmZzX2FkZF9vcmRlcmVkX2xpc3Qoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkgeworICAgIHJldHVybiBfX2FkZF9qaChTQl9KT1VSTkFMKGlub2RlLT5pX3NiKSwgYmgsIDApOworfQorCisjZGVmaW5lIEpIX0VOVFJZKGwpIGxpc3RfZW50cnkoKGwpLCBzdHJ1Y3QgcmVpc2VyZnNfamgsIGxpc3QpCitzdGF0aWMgaW50IHdyaXRlX29yZGVyZWRfYnVmZmVycyhzcGlubG9ja190ICpsb2NrLAorCQkJCSBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsLAorCQkJCSBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQoreworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisgICAgc3RydWN0IHJlaXNlcmZzX2poICpqaDsKKyAgICBpbnQgcmV0ID0gai0+al9lcnJubzsKKyAgICBzdHJ1Y3QgYnVmZmVyX2NodW5rIGNodW5rOworICAgIHN0cnVjdCBsaXN0X2hlYWQgdG1wOworICAgIElOSVRfTElTVF9IRUFEKCZ0bXApOworCisgICAgY2h1bmsubnIgPSAwOworICAgIHNwaW5fbG9jayhsb2NrKTsKKyAgICB3aGlsZSghbGlzdF9lbXB0eShsaXN0KSkgeworICAgICAgICBqaCA9IEpIX0VOVFJZKGxpc3QtPm5leHQpOworCWJoID0gamgtPmJoOworCWdldF9iaChiaCk7CisJaWYgKHRlc3Rfc2V0X2J1ZmZlcl9sb2NrZWQoYmgpKSB7CisJICAgIGlmICghYnVmZmVyX2RpcnR5KGJoKSkgeworCQlsaXN0X2RlbF9pbml0KCZqaC0+bGlzdCk7CisJCWxpc3RfYWRkKCZqaC0+bGlzdCwgJnRtcCk7CisJCWdvdG8gbG9vcF9uZXh0OworCSAgICB9CisJICAgIHNwaW5fdW5sb2NrKGxvY2spOworCSAgICBpZiAoY2h1bmsubnIpCisJCXdyaXRlX29yZGVyZWRfY2h1bmsoJmNodW5rKTsKKwkgICAgd2FpdF9vbl9idWZmZXIoYmgpOworCSAgICBjb25kX3Jlc2NoZWQoKTsKKwkgICAgc3Bpbl9sb2NrKGxvY2spOworCSAgICBnb3RvIGxvb3BfbmV4dDsKKyAgICAgICAgfQorCWlmIChidWZmZXJfZGlydHkoYmgpKSB7CisJICAgIGxpc3RfZGVsX2luaXQoJmpoLT5saXN0KTsKKwkgICAgbGlzdF9hZGQoJmpoLT5saXN0LCAmdG1wKTsKKyAgICAgICAgICAgIGFkZF90b19jaHVuaygmY2h1bmssIGJoLCBsb2NrLCB3cml0ZV9vcmRlcmVkX2NodW5rKTsKKwl9IGVsc2UgeworCSAgICByZWlzZXJmc19mcmVlX2poKGJoKTsKKwkgICAgdW5sb2NrX2J1ZmZlcihiaCk7CisJfQorbG9vcF9uZXh0OgorCXB1dF9iaChiaCk7CisJY29uZF9yZXNjaGVkX2xvY2sobG9jayk7CisgICAgfQorICAgIGlmIChjaHVuay5ucikgeworCXNwaW5fdW5sb2NrKGxvY2spOworICAgICAgICB3cml0ZV9vcmRlcmVkX2NodW5rKCZjaHVuayk7CisJc3Bpbl9sb2NrKGxvY2spOworICAgIH0KKyAgICB3aGlsZSghbGlzdF9lbXB0eSgmdG1wKSkgeworICAgICAgICBqaCA9IEpIX0VOVFJZKHRtcC5wcmV2KTsKKwliaCA9IGpoLT5iaDsKKwlnZXRfYmgoYmgpOworCXJlaXNlcmZzX2ZyZWVfamgoYmgpOworCisJaWYgKGJ1ZmZlcl9sb2NrZWQoYmgpKSB7CisJICAgIHNwaW5fdW5sb2NrKGxvY2spOworCSAgICB3YWl0X29uX2J1ZmZlcihiaCk7CisJICAgIHNwaW5fbG9jayhsb2NrKTsKKwl9CisJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKSB7CisJICAgIHJldCA9IC1FSU87CisgICAgICAgIH0KKwlwdXRfYmgoYmgpOworCWNvbmRfcmVzY2hlZF9sb2NrKGxvY2spOworICAgIH0KKyAgICBzcGluX3VubG9jayhsb2NrKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZsdXNoX29sZGVyX2NvbW1pdHMoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCkgeworICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocyk7CisgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqb3RoZXJfamw7CisgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqZmlyc3Rfamw7CisgICAgc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7CisgICAgdW5zaWduZWQgbG9uZyB0cmFuc19pZCA9IGpsLT5qX3RyYW5zX2lkOworICAgIHVuc2lnbmVkIGxvbmcgb3RoZXJfdHJhbnNfaWQ7CisgICAgdW5zaWduZWQgbG9uZyBmaXJzdF90cmFuc19pZDsKKworZmluZF9maXJzdDoKKyAgICAvKgorICAgICAqIGZpcnN0IHdlIHdhbGsgYmFja3dhcmRzIHRvIGZpbmQgdGhlIG9sZGVzdCB1bmNvbW1pdHRlZCB0cmFuc2F0aW9uCisgICAgICovCisgICAgZmlyc3RfamwgPSBqbDsKKyAgICBlbnRyeSA9IGpsLT5qX2xpc3QucHJldjsKKyAgICB3aGlsZSgxKSB7CisJb3RoZXJfamwgPSBKT1VSTkFMX0xJU1RfRU5UUlkoZW50cnkpOworCWlmIChlbnRyeSA9PSAmam91cm5hbC0+al9qb3VybmFsX2xpc3QgfHwKKwkgICAgYXRvbWljX3JlYWQoJm90aGVyX2psLT5qX29sZGVyX2NvbW1pdHNfZG9uZSkpCisJICAgIGJyZWFrOworCisgICAgICAgIGZpcnN0X2psID0gb3RoZXJfamw7CisJZW50cnkgPSBvdGhlcl9qbC0+al9saXN0LnByZXY7CisgICAgfQorCisgICAgLyogaWYgd2UgZGlkbid0IGZpbmQgYW55IG9sZGVyIHVuY29tbWl0dGVkIHRyYW5zYWN0aW9ucywgcmV0dXJuIG5vdyAqLworICAgIGlmIChmaXJzdF9qbCA9PSBqbCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmaXJzdF90cmFuc19pZCA9IGZpcnN0X2psLT5qX3RyYW5zX2lkOworCisgICAgZW50cnkgPSAmZmlyc3RfamwtPmpfbGlzdDsKKyAgICB3aGlsZSgxKSB7CisJb3RoZXJfamwgPSBKT1VSTkFMX0xJU1RfRU5UUlkoZW50cnkpOworCW90aGVyX3RyYW5zX2lkID0gb3RoZXJfamwtPmpfdHJhbnNfaWQ7CisKKwlpZiAob3RoZXJfdHJhbnNfaWQgPCB0cmFuc19pZCkgeworCSAgICBpZiAoYXRvbWljX3JlYWQoJm90aGVyX2psLT5qX2NvbW1pdF9sZWZ0KSAhPSAwKSB7CisJCWZsdXNoX2NvbW1pdF9saXN0KHMsIG90aGVyX2psLCAwKTsKKworCQkvKiBsaXN0IHdlIHdlcmUgY2FsbGVkIHdpdGggaXMgZ29uZSwgcmV0dXJuICovCisJCWlmICgham91cm5hbF9saXN0X3N0aWxsX2FsaXZlKHMsIHRyYW5zX2lkKSkKKwkJICAgIHJldHVybiAxOworCisJCS8qIHRoZSBvbmUgd2UganVzdCBmbHVzaGVkIGlzIGdvbmUsIHRoaXMgbWVhbnMgYWxsCisJCSAqIG9sZGVyIGxpc3RzIGFyZSBhbHNvIGdvbmUsIHNvIGZpcnN0X2psIGlzIG5vIGxvbmdlcgorCQkgKiB2YWxpZCBlaXRoZXIuICBHbyBiYWNrIHRvIHRoZSBiZWdpbm5pbmcuCisJCSAqLworCQlpZiAoIWpvdXJuYWxfbGlzdF9zdGlsbF9hbGl2ZShzLCBvdGhlcl90cmFuc19pZCkpIHsKKwkJICAgIGdvdG8gZmluZF9maXJzdDsKKwkJfQorCSAgICB9CisJICAgIGVudHJ5ID0gZW50cnktPm5leHQ7CisJICAgIGlmIChlbnRyeSA9PSAmam91cm5hbC0+al9qb3VybmFsX2xpc3QpCisJCXJldHVybiAwOworCX0gZWxzZSB7CisJICAgIHJldHVybiAwOworCX0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CitpbnQgcmVpc2VyZnNfYXN5bmNfcHJvZ3Jlc3Nfd2FpdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpIHsKKyAgICBERUZJTkVfV0FJVCh3YWl0KTsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqaiA9IFNCX0pPVVJOQUwocyk7CisgICAgaWYgKGF0b21pY19yZWFkKCZqLT5qX2FzeW5jX3Rocm90dGxlKSkKKyAgICAJYmxrX2Nvbmdlc3Rpb25fd2FpdChXUklURSwgSFovMTApOworICAgIHJldHVybiAwOworfQorCisvKgorKiogaWYgdGhpcyBqb3VybmFsIGxpc3Qgc3RpbGwgaGFzIGNvbW1pdCBibG9ja3MgdW5mbHVzaGVkLCBzZW5kIHRoZW0gdG8gZGlzay4KKyoqCisqKiBsb2cgYXJlYXMgbXVzdCBiZSBmbHVzaGVkIGluIG9yZGVyICh0cmFuc2FjdGlvbiAyIGNhbid0IGNvbW1pdCBiZWZvcmUgdHJhbnNhY3Rpb24gMSkKKyoqIEJlZm9yZSB0aGUgY29tbWl0IGJsb2NrIGNhbiBieSB3cml0dGVuLCBldmVyeSBvdGhlciBsb2cgYmxvY2sgbXVzdCBiZSBzYWZlbHkgb24gZGlzaworKioKKyovCitzdGF0aWMgaW50IGZsdXNoX2NvbW1pdF9saXN0KHN0cnVjdCBzdXBlcl9ibG9jayAqcywgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwsIGludCBmbHVzaGFsbCkgeworICBpbnQgaTsKKyAgaW50IGJuIDsKKyAgc3RydWN0IGJ1ZmZlcl9oZWFkICp0YmggPSBOVUxMIDsKKyAgdW5zaWduZWQgbG9uZyB0cmFuc19pZCA9IGpsLT5qX3RyYW5zX2lkOworICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHMpOworICBpbnQgYmFycmllciA9IDA7CisgIGludCByZXR2YWwgPSAwOworCisgIHJlaXNlcmZzX2NoZWNrX2xvY2tfZGVwdGgocywgImZsdXNoX2NvbW1pdF9saXN0IikgOworCisgIGlmIChhdG9taWNfcmVhZCgmamwtPmpfb2xkZXJfY29tbWl0c19kb25lKSkgeworICAgIHJldHVybiAwIDsKKyAgfQorCisgIC8qIGJlZm9yZSB3ZSBjYW4gcHV0IG91ciBjb21taXQgYmxvY2tzIG9uIGRpc2ssIHdlIGhhdmUgdG8gbWFrZSBzdXJlIGV2ZXJ5b25lIG9sZGVyIHRoYW4KKyAgKiogdXMgaXMgb24gZGlzayB0b28KKyAgKi8KKyAgQlVHX09OIChqbC0+al9sZW4gPD0gMCk7CisgIEJVR19PTiAodHJhbnNfaWQgPT0gam91cm5hbC0+al90cmFuc19pZCk7CisKKyAgZ2V0X2pvdXJuYWxfbGlzdChqbCk7CisgIGlmIChmbHVzaGFsbCkgeworICAgIGlmIChmbHVzaF9vbGRlcl9jb21taXRzKHMsIGpsKSA9PSAxKSB7CisgICAgICAvKiBsaXN0IGRpc2FwcGVhcmVkIGR1cmluZyBmbHVzaF9vbGRlcl9jb21taXRzLiAgcmV0dXJuICovCisgICAgICBnb3RvIHB1dF9qbDsKKyAgICB9CisgIH0KKworICAvKiBtYWtlIHN1cmUgbm9ib2R5IGlzIHRyeWluZyB0byBmbHVzaCB0aGlzIG9uZSBhdCB0aGUgc2FtZSB0aW1lICovCisgIGRvd24oJmpsLT5qX2NvbW1pdF9sb2NrKTsKKyAgaWYgKCFqb3VybmFsX2xpc3Rfc3RpbGxfYWxpdmUocywgdHJhbnNfaWQpKSB7CisgICAgdXAoJmpsLT5qX2NvbW1pdF9sb2NrKTsKKyAgICBnb3RvIHB1dF9qbDsKKyAgfQorICBCVUdfT04gKGpsLT5qX3RyYW5zX2lkID09IDApOworCisgIC8qIHRoaXMgY29tbWl0IGlzIGRvbmUsIGV4aXQgKi8KKyAgaWYgKGF0b21pY19yZWFkKCYoamwtPmpfY29tbWl0X2xlZnQpKSA8PSAwKSB7CisgICAgaWYgKGZsdXNoYWxsKSB7CisgICAgICBhdG9taWNfc2V0KCYoamwtPmpfb2xkZXJfY29tbWl0c19kb25lKSwgMSkgOworICAgIH0KKyAgICB1cCgmamwtPmpfY29tbWl0X2xvY2spOworICAgIGdvdG8gcHV0X2psOworICB9CisKKyAgaWYgKCFsaXN0X2VtcHR5KCZqbC0+al9iaF9saXN0KSkgeworICAgICAgdW5sb2NrX2tlcm5lbCgpOworICAgICAgd3JpdGVfb3JkZXJlZF9idWZmZXJzKCZqb3VybmFsLT5qX2RpcnR5X2J1ZmZlcnNfbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb3VybmFsLCBqbCwgJmpsLT5qX2JoX2xpc3QpOworICAgICAgbG9ja19rZXJuZWwoKTsKKyAgfQorICBCVUdfT04gKCFsaXN0X2VtcHR5KCZqbC0+al9iaF9saXN0KSk7CisgIC8qCisgICAqIGZvciB0aGUgZGVzY3JpcHRpb24gYmxvY2sgYW5kIGFsbCB0aGUgbG9nIGJsb2Nrcywgc3VibWl0IGFueSBidWZmZXJzCisgICAqIHRoYXQgaGF2ZW4ndCBhbHJlYWR5IHJlYWNoZWQgdGhlIGRpc2sKKyAgICovCisgIGF0b21pY19pbmMoJmpvdXJuYWwtPmpfYXN5bmNfdGhyb3R0bGUpOworICBmb3IgKGkgPSAwIDsgaSA8IChqbC0+al9sZW4gKyAxKSA7IGkrKykgeworICAgIGJuID0gU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHMpICsgKGpsLT5qX3N0YXJ0K2kpICUKKyAgICAgICAgIFNCX09ORElTS19KT1VSTkFMX1NJWkUocyk7CisgICAgdGJoID0gam91cm5hbF9maW5kX2dldF9ibG9jayhzLCBibikgOworICAgIGlmIChidWZmZXJfZGlydHkodGJoKSkgLyogcmVkdW5kYW50LCBsbF9yd19ibG9jaygpIGNoZWNrcyAqLworCWxsX3J3X2Jsb2NrKFdSSVRFLCAxLCAmdGJoKSA7CisgICAgcHV0X2JoKHRiaCkgOworICB9CisgIGF0b21pY19kZWMoJmpvdXJuYWwtPmpfYXN5bmNfdGhyb3R0bGUpOworCisgIC8qIHdhaXQgb24gZXZlcnl0aGluZyB3cml0dGVuIHNvIGZhciBiZWZvcmUgd3JpdGluZyB0aGUgY29tbWl0CisgICAqIGlmIHdlIGFyZSBpbiBiYXJyaWVyIG1vZGUsIHNlbmQgdGhlIGNvbW1pdCBkb3duIG5vdworICAgKi8KKyAgYmFycmllciA9IHJlaXNlcmZzX2JhcnJpZXJfZmx1c2gocyk7CisgIGlmIChiYXJyaWVyKSB7CisgICAgICBpbnQgcmV0OworICAgICAgbG9ja19idWZmZXIoamwtPmpfY29tbWl0X2JoKTsKKyAgICAgIHJldCA9IHN1Ym1pdF9iYXJyaWVyX2J1ZmZlcihqbC0+al9jb21taXRfYmgpOworICAgICAgaWYgKHJldCA9PSAtRU9QTk9UU1VQUCkgeworCSAgc2V0X2J1ZmZlcl91cHRvZGF0ZShqbC0+al9jb21taXRfYmgpOworICAgICAgICAgIGRpc2FibGVfYmFycmllcihzKTsKKwkgIGJhcnJpZXIgPSAwOworICAgICAgfQorICB9CisgIGZvciAoaSA9IDAgOyAgaSA8IChqbC0+al9sZW4gKyAxKSA7IGkrKykgeworICAgIGJuID0gU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHMpICsKKwkgKGpsLT5qX3N0YXJ0ICsgaSkgJSBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHMpIDsKKyAgICB0YmggPSBqb3VybmFsX2ZpbmRfZ2V0X2Jsb2NrKHMsIGJuKSA7CisgICAgd2FpdF9vbl9idWZmZXIodGJoKSA7CisgICAgLy8gc2luY2Ugd2UncmUgdXNpbmcgbGxfcndfYmxrIGFib3ZlLCBpdCBtaWdodCBoYXZlIHNraXBwZWQgb3ZlcgorICAgIC8vIGEgbG9ja2VkIGJ1ZmZlci4gIERvdWJsZSBjaGVjayBoZXJlCisgICAgLy8KKyAgICBpZiAoYnVmZmVyX2RpcnR5KHRiaCkpIC8qIHJlZHVuZGFudCwgc3luY19kaXJ0eV9idWZmZXIoKSBjaGVja3MgKi8KKyAgICAgIHN5bmNfZGlydHlfYnVmZmVyKHRiaCk7CisgICAgaWYgKHVubGlrZWx5ICghYnVmZmVyX3VwdG9kYXRlKHRiaCkpKSB7CisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisgICAgICByZWlzZXJmc193YXJuaW5nKHMsICJqb3VybmFsLTYwMSwgYnVmZmVyIHdyaXRlIGZhaWxlZCIpIDsKKyNlbmRpZgorICAgICAgcmV0dmFsID0gLUVJTzsKKyAgICB9CisgICAgcHV0X2JoKHRiaCkgOyAvKiBvbmNlIGZvciBqb3VybmFsX2ZpbmRfZ2V0X2Jsb2NrICovCisgICAgcHV0X2JoKHRiaCkgOyAgICAvKiBvbmNlIGR1ZSB0byBvcmlnaW5hbCBnZXRibGsgaW4gZG9fam91cm5hbF9lbmQgKi8KKyAgICBhdG9taWNfZGVjKCYoamwtPmpfY29tbWl0X2xlZnQpKSA7CisgIH0KKworICBCVUdfT04gKGF0b21pY19yZWFkKCYoamwtPmpfY29tbWl0X2xlZnQpKSAhPSAxKTsKKworICBpZiAoIWJhcnJpZXIpIHsKKyAgICAgIGlmIChidWZmZXJfZGlydHkoamwtPmpfY29tbWl0X2JoKSkKKwlCVUcoKTsKKyAgICAgIG1hcmtfYnVmZmVyX2RpcnR5KGpsLT5qX2NvbW1pdF9iaCkgOworICAgICAgc3luY19kaXJ0eV9idWZmZXIoamwtPmpfY29tbWl0X2JoKSA7CisgIH0gZWxzZQorICAgICAgd2FpdF9vbl9idWZmZXIoamwtPmpfY29tbWl0X2JoKTsKKworICBjaGVja19iYXJyaWVyX2NvbXBsZXRpb24ocywgamwtPmpfY29tbWl0X2JoKTsKKworICAvKiBJZiB0aGVyZSB3YXMgYSB3cml0ZSBlcnJvciBpbiB0aGUgam91cm5hbCAtIHdlIGNhbid0IGNvbW1pdCB0aGlzCisgICAqIHRyYW5zYWN0aW9uIC0gaXQgd2lsbCBiZSBpbnZhbGlkIGFuZCwgaWYgc3VjY2Vzc2Z1bCwgd2lsbCBqdXN0IGVuZAorICAgKiB1cCBwcm9wb2dhdGluZyB0aGUgd3JpdGUgZXJyb3Igb3V0IHRvIHRoZSBmaWxlc3lzdGVtLiAqLworICBpZiAodW5saWtlbHkgKCFidWZmZXJfdXB0b2RhdGUoamwtPmpfY29tbWl0X2JoKSkpIHsKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKyAgICByZWlzZXJmc193YXJuaW5nKHMsICJqb3VybmFsLTYxNTogYnVmZmVyIHdyaXRlIGZhaWxlZCIpIDsKKyNlbmRpZgorICAgIHJldHZhbCA9IC1FSU87CisgIH0KKyAgYmZvcmdldChqbC0+al9jb21taXRfYmgpIDsKKyAgaWYgKGpvdXJuYWwtPmpfbGFzdF9jb21taXRfaWQgIT0gMCAmJgorICAgICAoamwtPmpfdHJhbnNfaWQgLSBqb3VybmFsLT5qX2xhc3RfY29tbWl0X2lkKSAhPSAxKSB7CisgICAgICByZWlzZXJmc193YXJuaW5nKHMsICJjbG0tMjIwMDogbGFzdCBjb21taXQgJWx1LCBjdXJyZW50ICVsdSIsCisgICAgICAgICAgICAgICAgICAgICAgIGpvdXJuYWwtPmpfbGFzdF9jb21taXRfaWQsCisJCSAgICAgICBqbC0+al90cmFuc19pZCk7CisgIH0KKyAgam91cm5hbC0+al9sYXN0X2NvbW1pdF9pZCA9IGpsLT5qX3RyYW5zX2lkOworCisgIC8qIG5vdywgZXZlcnkgY29tbWl0IGJsb2NrIGlzIG9uIHRoZSBkaXNrLiAgSXQgaXMgc2FmZSB0byBhbGxvdyBibG9ja3MgZnJlZWQgZHVyaW5nIHRoaXMgdHJhbnNhY3Rpb24gdG8gYmUgcmVhbGxvY2F0ZWQgKi8KKyAgY2xlYW51cF9mcmVlZF9mb3Jfam91cm5hbF9saXN0KHMsIGpsKSA7CisKKyAgcmV0dmFsID0gcmV0dmFsID8gcmV0dmFsIDogam91cm5hbC0+al9lcnJubzsKKworICAvKiBtYXJrIHRoZSBtZXRhZGF0YSBkaXJ0eSAqLworICBpZiAoIXJldHZhbCkKKyAgICBkaXJ0eV9vbmVfdHJhbnNhY3Rpb24ocywgamwpOworICBhdG9taWNfZGVjKCYoamwtPmpfY29tbWl0X2xlZnQpKSA7CisKKyAgaWYgKGZsdXNoYWxsKSB7CisgICAgYXRvbWljX3NldCgmKGpsLT5qX29sZGVyX2NvbW1pdHNfZG9uZSksIDEpIDsKKyAgfQorICB1cCgmamwtPmpfY29tbWl0X2xvY2spOworcHV0X2psOgorICBwdXRfam91cm5hbF9saXN0KHMsIGpsKTsKKworICBpZiAocmV0dmFsKQorICAgIHJlaXNlcmZzX2Fib3J0IChzLCByZXR2YWwsICJKb3VybmFsIHdyaXRlIGVycm9yIGluICVzIiwgX19GVU5DVElPTl9fKTsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyoqIGZsdXNoX2pvdXJuYWxfbGlzdCBmcmVxdWVudGx5IG5lZWRzIHRvIGZpbmQgYSBuZXdlciB0cmFuc2FjdGlvbiBmb3IgYSBnaXZlbiBibG9jay4gIFRoaXMgZG9lcyB0aGF0LCBvciAKKyoqIHJldHVybnMgTlVMTCBpZiBpdCBjYW4ndCBmaW5kIGFueXRoaW5nIAorKi8KK3N0YXRpYyBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpmaW5kX25ld2VyX2psX2Zvcl9jbihzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24pIHsKKyAgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGNuLT5zYjsKKyAgYl9ibG9ja25yX3QgYmxvY2tuciA9IGNuLT5ibG9ja25yIDsKKworICBjbiA9IGNuLT5ocHJldiA7CisgIHdoaWxlKGNuKSB7CisgICAgaWYgKGNuLT5zYiA9PSBzYiAmJiBjbi0+YmxvY2tuciA9PSBibG9ja25yICYmIGNuLT5qbGlzdCkgeworICAgICAgcmV0dXJuIGNuLT5qbGlzdCA7CisgICAgfQorICAgIGNuID0gY24tPmhwcmV2IDsKKyAgfQorICByZXR1cm4gTlVMTCA7Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9qb3VybmFsX2hhc2goc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICoqLAorc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqLCB1bnNpZ25lZCBsb25nLCBpbnQpOworCisvKgorKiogb25jZSBhbGwgdGhlIHJlYWwgYmxvY2tzIGhhdmUgYmVlbiBmbHVzaGVkLCBpdCBpcyBzYWZlIHRvIHJlbW92ZSB0aGVtIGZyb20gdGhlCisqKiBqb3VybmFsIGxpc3QgZm9yIHRoaXMgdHJhbnNhY3Rpb24uICBBc2lkZSBmcm9tIGZyZWVpbmcgdGhlIGNub2RlLCB0aGlzIGFsc28gYWxsb3dzIHRoZQorKiogYmxvY2sgdG8gYmUgcmVhbGxvY2F0ZWQgZm9yIGRhdGEgYmxvY2tzIGlmIGl0IGhhZCBiZWVuIGRlbGV0ZWQuCisqLworc3RhdGljIHZvaWQgcmVtb3ZlX2FsbF9mcm9tX2pvdXJuYWxfbGlzdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwsIGludCBkZWJ1ZykgeworICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHBfc19zYik7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbiwgKmxhc3QgOworICBjbiA9IGpsLT5qX3JlYWxibG9jayA7CisKKyAgLyogd2hpY2ggaXMgYmV0dGVyLCB0byBsb2NrIG9uY2UgYXJvdW5kIHRoZSB3aG9sZSBsb29wLCBvcgorICAqKiB0byBsb2NrIGZvciBlYWNoIGNhbGwgdG8gcmVtb3ZlX2pvdXJuYWxfaGFzaD8KKyAgKi8KKyAgd2hpbGUoY24pIHsKKyAgICBpZiAoY24tPmJsb2NrbnIgIT0gMCkgeworICAgICAgaWYgKGRlYnVnKSB7CisgICAgICAgcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAiYmxvY2sgJXUsIGJoIGlzICVkLCBzdGF0ZSAlbGQiLCBjbi0+YmxvY2tuciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjbi0+YmggPyAxOiAwLCBjbi0+c3RhdGUpIDsKKyAgICAgIH0KKyAgICAgIGNuLT5zdGF0ZSA9IDAgOworICAgICAgcmVtb3ZlX2pvdXJuYWxfaGFzaChwX3Nfc2IsIGpvdXJuYWwtPmpfbGlzdF9oYXNoX3RhYmxlLCBqbCwgY24tPmJsb2NrbnIsIDEpIDsKKyAgICB9CisgICAgbGFzdCA9IGNuIDsKKyAgICBjbiA9IGNuLT5uZXh0IDsKKyAgICBmcmVlX2Nub2RlKHBfc19zYiwgbGFzdCkgOworICB9CisgIGpsLT5qX3JlYWxibG9jayA9IE5VTEwgOworfQorCisvKgorKiogaWYgdGhpcyB0aW1lc3RhbXAgaXMgZ3JlYXRlciB0aGFuIHRoZSB0aW1lc3RhbXAgd2Ugd3JvdGUgbGFzdCB0byB0aGUgaGVhZGVyIGJsb2NrLCB3cml0ZSBpdCB0byB0aGUgaGVhZGVyIGJsb2NrLgorKiogb25jZSB0aGlzIGlzIGRvbmUsIEkgY2FuIHNhZmVseSBzYXkgdGhlIGxvZyBhcmVhIGZvciB0aGlzIHRyYW5zYWN0aW9uIHdvbid0IGV2ZXIgYmUgcmVwbGF5ZWQsIGFuZCBJIGNhbiBzdGFydAorKiogcmVsZWFzaW5nIGJsb2NrcyBpbiB0aGlzIHRyYW5zYWN0aW9uIGZvciByZXVzZSBhcyBkYXRhIGJsb2Nrcy4KKyoqIGNhbGxlZCBieSBmbHVzaF9qb3VybmFsX2xpc3QsIGJlZm9yZSBpdCBjYWxscyByZW1vdmVfYWxsX2Zyb21fam91cm5hbF9saXN0CisqKgorKi8KK3N0YXRpYyBpbnQgX3VwZGF0ZV9qb3VybmFsX2hlYWRlcl9ibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgdHJhbnNfaWQpIHsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfaGVhZGVyICpqaCA7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKKworICBpZiAocmVpc2VyZnNfaXNfam91cm5hbF9hYm9ydGVkIChqb3VybmFsKSkKKyAgICByZXR1cm4gLUVJTzsKKworICBpZiAodHJhbnNfaWQgPj0gam91cm5hbC0+al9sYXN0X2ZsdXNoX3RyYW5zX2lkKSB7CisgICAgaWYgKGJ1ZmZlcl9sb2NrZWQoKGpvdXJuYWwtPmpfaGVhZGVyX2JoKSkpICB7CisgICAgICB3YWl0X29uX2J1ZmZlcigoam91cm5hbC0+al9oZWFkZXJfYmgpKSA7CisgICAgICBpZiAodW5saWtlbHkgKCFidWZmZXJfdXB0b2RhdGUoam91cm5hbC0+al9oZWFkZXJfYmgpKSkgeworI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSworICAgICAgICByZWlzZXJmc193YXJuaW5nIChwX3Nfc2IsICJqb3VybmFsLTY5OTogYnVmZmVyIHdyaXRlIGZhaWxlZCIpIDsKKyNlbmRpZgorICAgICAgICByZXR1cm4gLUVJTzsKKyAgICAgIH0KKyAgICB9CisgICAgam91cm5hbC0+al9sYXN0X2ZsdXNoX3RyYW5zX2lkID0gdHJhbnNfaWQgOworICAgIGpvdXJuYWwtPmpfZmlyc3RfdW5mbHVzaGVkX29mZnNldCA9IG9mZnNldCA7CisgICAgamggPSAoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfaGVhZGVyICopKGpvdXJuYWwtPmpfaGVhZGVyX2JoLT5iX2RhdGEpIDsKKyAgICBqaC0+al9sYXN0X2ZsdXNoX3RyYW5zX2lkID0gY3B1X3RvX2xlMzIodHJhbnNfaWQpIDsKKyAgICBqaC0+al9maXJzdF91bmZsdXNoZWRfb2Zmc2V0ID0gY3B1X3RvX2xlMzIob2Zmc2V0KSA7CisgICAgamgtPmpfbW91bnRfaWQgPSBjcHVfdG9fbGUzMihqb3VybmFsLT5qX21vdW50X2lkKSA7CisKKyAgICBpZiAocmVpc2VyZnNfYmFycmllcl9mbHVzaChwX3Nfc2IpKSB7CisJaW50IHJldDsKKwlsb2NrX2J1ZmZlcihqb3VybmFsLT5qX2hlYWRlcl9iaCk7CisJcmV0ID0gc3VibWl0X2JhcnJpZXJfYnVmZmVyKGpvdXJuYWwtPmpfaGVhZGVyX2JoKTsKKwlpZiAocmV0ID09IC1FT1BOT1RTVVBQKSB7CisJICAgIHNldF9idWZmZXJfdXB0b2RhdGUoam91cm5hbC0+al9oZWFkZXJfYmgpOworCSAgICBkaXNhYmxlX2JhcnJpZXIocF9zX3NiKTsKKwkgICAgZ290byBzeW5jOworCX0KKwl3YWl0X29uX2J1ZmZlcihqb3VybmFsLT5qX2hlYWRlcl9iaCk7CisJY2hlY2tfYmFycmllcl9jb21wbGV0aW9uKHBfc19zYiwgam91cm5hbC0+al9oZWFkZXJfYmgpOworICAgIH0gZWxzZSB7CitzeW5jOgorCXNldF9idWZmZXJfZGlydHkoam91cm5hbC0+al9oZWFkZXJfYmgpIDsKKwlzeW5jX2RpcnR5X2J1ZmZlcihqb3VybmFsLT5qX2hlYWRlcl9iaCkgOworICAgIH0KKyAgICBpZiAoIWJ1ZmZlcl91cHRvZGF0ZShqb3VybmFsLT5qX2hlYWRlcl9iaCkpIHsKKyAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgImpvdXJuYWwtODM3OiBJTyBlcnJvciBkdXJpbmcgam91cm5hbCByZXBsYXkiKTsKKyAgICAgIHJldHVybiAtRUlPIDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDAgOworfQorCitzdGF0aWMgaW50IHVwZGF0ZV9qb3VybmFsX2hlYWRlcl9ibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgCisJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdHJhbnNfaWQpIHsKKyAgICByZXR1cm4gX3VwZGF0ZV9qb3VybmFsX2hlYWRlcl9ibG9jayhwX3Nfc2IsIG9mZnNldCwgdHJhbnNfaWQpOworfQorLyogCisqKiBmbHVzaCBhbnkgYW5kIGFsbCBqb3VybmFsIGxpc3RzIG9sZGVyIHRoYW4geW91IGFyZSAKKyoqIGNhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIGZsdXNoX2pvdXJuYWxfbGlzdAorKi8KK3N0YXRpYyBpbnQgZmx1c2hfb2xkZXJfam91cm5hbF9saXN0cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCkKK3sKKyAgICBzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpvdGhlcl9qbCA7CisgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOworICAgIHVuc2lnbmVkIGxvbmcgdHJhbnNfaWQgPSBqbC0+al90cmFuc19pZDsKKworICAgIC8qIHdlIGtub3cgd2UgYXJlIHRoZSBvbmx5IG9uZXMgZmx1c2hpbmcgdGhpbmdzLCBubyBleHRyYSByYWNlCisgICAgICogcHJvdGVjdGlvbiBpcyByZXF1aXJlZC4KKyAgICAgKi8KK3Jlc3RhcnQ6CisgICAgZW50cnkgPSBqb3VybmFsLT5qX2pvdXJuYWxfbGlzdC5uZXh0OworICAgIC8qIERpZCB3ZSB3cmFwPyAqLworICAgIGlmIChlbnRyeSA9PSAmam91cm5hbC0+al9qb3VybmFsX2xpc3QpCisgICAgICAgIHJldHVybiAwOworICAgIG90aGVyX2psID0gSk9VUk5BTF9MSVNUX0VOVFJZKGVudHJ5KTsKKyAgICBpZiAob3RoZXJfamwtPmpfdHJhbnNfaWQgPCB0cmFuc19pZCkgeworICAgICAgICBCVUdfT04gKG90aGVyX2psLT5qX3JlZmNvdW50IDw9IDApOworCS8qIGRvIG5vdCBmbHVzaCBhbGwgKi8KKwlmbHVzaF9qb3VybmFsX2xpc3QocF9zX3NiLCBvdGhlcl9qbCwgMCkgOworCisJLyogb3RoZXJfamwgaXMgbm93IGRlbGV0ZWQgZnJvbSB0aGUgbGlzdCAqLworCWdvdG8gcmVzdGFydDsKKyAgICB9CisgICAgcmV0dXJuIDAgOworfQorCitzdGF0aWMgdm9pZCBkZWxfZnJvbV93b3JrX2xpc3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsKSB7CisgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChzKTsKKyAgICBpZiAoIWxpc3RfZW1wdHkoJmpsLT5qX3dvcmtpbmdfbGlzdCkpIHsKKwlsaXN0X2RlbF9pbml0KCZqbC0+al93b3JraW5nX2xpc3QpOworCWpvdXJuYWwtPmpfbnVtX3dvcmtfbGlzdHMtLTsKKyAgICB9Cit9CisKKy8qIGZsdXNoIGEgam91cm5hbCBsaXN0LCBib3RoIGNvbW1pdCBhbmQgcmVhbCBibG9ja3MKKyoqCisqKiBhbHdheXMgc2V0IGZsdXNoYWxsIHRvIDEsIHVubGVzcyB5b3UgYXJlIGNhbGxpbmcgZnJvbSBpbnNpZGUKKyoqIGZsdXNoX2pvdXJuYWxfbGlzdAorKioKKyoqIElNUE9SVEFOVC4gIFRoaXMgY2FuIG9ubHkgYmUgY2FsbGVkIHdoaWxlIHRoZXJlIGFyZSBubyBqb3VybmFsIHdyaXRlcnMsIAorKiogYW5kIHRoZSBqb3VybmFsIGlzIGxvY2tlZC4gIFRoYXQgbWVhbnMgaXQgY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gCisqKiBkb19qb3VybmFsX2VuZCwgb3IgYnkgam91cm5hbF9yZWxlYXNlCisqLworc3RhdGljIGludCBmbHVzaF9qb3VybmFsX2xpc3Qoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsLCBpbnQgZmx1c2hhbGwpIHsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqcGpsIDsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuLCAqbGFzdCA7CisgIGludCBjb3VudCA7CisgIGludCB3YXNfandhaXQgPSAwIDsKKyAgaW50IHdhc19kaXJ0eSA9IDAgOworICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnNhdmVkX2JoIDsgCisgIHVuc2lnbmVkIGxvbmcgal9sZW5fc2F2ZWQgPSBqbC0+al9sZW4gOworICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHMpOworICBpbnQgZXJyID0gMDsKKworICBCVUdfT04gKGpfbGVuX3NhdmVkIDw9IDApOworCisgIGlmIChhdG9taWNfcmVhZCgmam91cm5hbC0+al93Y291bnQpICE9IDApIHsKKyAgICByZWlzZXJmc193YXJuaW5nKHMsICJjbG0tMjA0ODogZmx1c2hfam91cm5hbF9saXN0IGNhbGxlZCB3aXRoIHdjb3VudCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfd2NvdW50KSkgOworICB9CisgIEJVR19PTiAoamwtPmpfdHJhbnNfaWQgPT0gMCk7CisKKyAgLyogaWYgZmx1c2hhbGwgPT0gMCwgdGhlIGxvY2sgaXMgYWxyZWFkeSBoZWxkICovCisgIGlmIChmbHVzaGFsbCkgeworICAgICAgZG93bigmam91cm5hbC0+al9mbHVzaF9zZW0pOworICB9IGVsc2UgaWYgKCFkb3duX3RyeWxvY2soJmpvdXJuYWwtPmpfZmx1c2hfc2VtKSkgeworICAgICAgQlVHKCk7CisgIH0KKworICBjb3VudCA9IDAgOworICBpZiAoal9sZW5fc2F2ZWQgPiBqb3VybmFsLT5qX3RyYW5zX21heCkgeworICAgIHJlaXNlcmZzX3BhbmljKHMsICJqb3VybmFsLTcxNTogZmx1c2hfam91cm5hbF9saXN0LCBsZW5ndGggaXMgJWx1LCB0cmFucyBpZCAlbHVcbiIsIGpfbGVuX3NhdmVkLCBqbC0+al90cmFuc19pZCk7CisgICAgcmV0dXJuIDAgOworICB9CisKKyAgLyogaWYgYWxsIHRoZSB3b3JrIGlzIGFscmVhZHkgZG9uZSwgZ2V0IG91dCBvZiBoZXJlICovCisgIGlmIChhdG9taWNfcmVhZCgmKGpsLT5qX25vbnplcm9sZW4pKSA8PSAwICYmIAorICAgICAgYXRvbWljX3JlYWQoJihqbC0+al9jb21taXRfbGVmdCkpIDw9IDApIHsKKyAgICBnb3RvIGZsdXNoX29sZGVyX2FuZF9yZXR1cm4gOworICB9IAorCisgIC8qIHN0YXJ0IGJ5IHB1dHRpbmcgdGhlIGNvbW1pdCBsaXN0IG9uIGRpc2suICBUaGlzIHdpbGwgYWxzbyBmbHVzaCAKKyAgKiogdGhlIGNvbW1pdCBsaXN0cyBvZiBhbnkgb2xkZXJzIHRyYW5zYWN0aW9ucworICAqLworICBmbHVzaF9jb21taXRfbGlzdChzLCBqbCwgMSkgOworCisgIGlmICghKGpsLT5qX3N0YXRlICYgTElTVF9ESVJUWSkgJiYgIXJlaXNlcmZzX2lzX2pvdXJuYWxfYWJvcnRlZCAoam91cm5hbCkpCisgICAgICBCVUcoKTsKKworICAvKiBhcmUgd2UgZG9uZSBub3c/ICovCisgIGlmIChhdG9taWNfcmVhZCgmKGpsLT5qX25vbnplcm9sZW4pKSA8PSAwICYmIAorICAgICAgYXRvbWljX3JlYWQoJihqbC0+al9jb21taXRfbGVmdCkpIDw9IDApIHsKKyAgICBnb3RvIGZsdXNoX29sZGVyX2FuZF9yZXR1cm4gOworICB9CisKKyAgLyogbG9vcCB0aHJvdWdoIGVhY2ggY25vZGUsIHNlZSBpZiB3ZSBuZWVkIHRvIHdyaXRlIGl0LCAKKyAgKiogb3Igd2FpdCBvbiBhIG1vcmUgcmVjZW50IHRyYW5zYWN0aW9uLCBvciBqdXN0IGlnbm9yZSBpdCAKKyAgKi8KKyAgaWYgKGF0b21pY19yZWFkKCYoam91cm5hbC0+al93Y291bnQpKSAhPSAwKSB7CisgICAgcmVpc2VyZnNfcGFuaWMocywgImpvdXJuYWwtODQ0OiBwYW5pYyBqb3VybmFsIGxpc3QgaXMgZmx1c2hpbmcsIHdjb3VudCBpcyBub3QgMFxuIikgOworICB9CisgIGNuID0gamwtPmpfcmVhbGJsb2NrIDsKKyAgd2hpbGUoY24pIHsKKyAgICB3YXNfandhaXQgPSAwIDsKKyAgICB3YXNfZGlydHkgPSAwIDsKKyAgICBzYXZlZF9iaCA9IE5VTEwgOworICAgIC8qIGJsb2NrbnIgb2YgMCBpcyBubyBsb25nZXIgaW4gdGhlIGhhc2gsIGlnbm9yZSBpdCAqLworICAgIGlmIChjbi0+YmxvY2tuciA9PSAwKSB7CisgICAgICBnb3RvIGZyZWVfY25vZGUgOworICAgIH0KKworICAgIC8qIFRoaXMgdHJhbnNhY3Rpb24gZmFpbGVkIGNvbW1pdC4gRG9uJ3Qgd3JpdGUgb3V0IHRvIHRoZSBkaXNrICovCisgICAgaWYgKCEoamwtPmpfc3RhdGUgJiBMSVNUX0RJUlRZKSkKKyAgICAgICAgZ290byBmcmVlX2Nub2RlOworCisgICAgcGpsID0gZmluZF9uZXdlcl9qbF9mb3JfY24oY24pIDsKKyAgICAvKiB0aGUgb3JkZXIgaXMgaW1wb3J0YW50IGhlcmUuICBXZSBjaGVjayBwamwgdG8gbWFrZSBzdXJlIHdlCisgICAgKiogZG9uJ3QgY2xlYXIgQkhfSkRpcnR5X3dhaXQgaWYgd2UgYXJlbid0IHRoZSBvbmUgd3JpdGluZyB0aGlzCisgICAgKiogYmxvY2sgdG8gZGlzaworICAgICovCisgICAgaWYgKCFwamwgJiYgY24tPmJoKSB7CisgICAgICBzYXZlZF9iaCA9IGNuLT5iaCA7CisKKyAgICAgIC8qIHdlIGRvIHRoaXMgdG8gbWFrZSBzdXJlIG5vYm9keSByZWxlYXNlcyB0aGUgYnVmZmVyIHdoaWxlIAorICAgICAgKiogd2UgYXJlIHdvcmtpbmcgd2l0aCBpdCAKKyAgICAgICovCisgICAgICBnZXRfYmgoc2F2ZWRfYmgpIDsKKworICAgICAgaWYgKGJ1ZmZlcl9qb3VybmFsX2RpcnR5KHNhdmVkX2JoKSkgeworICAgICAgICBCVUdfT04gKCFjYW5fZGlydHkgKGNuKSk7CisgICAgICAgIHdhc19qd2FpdCA9IDEgOworICAgICAgICB3YXNfZGlydHkgPSAxIDsKKyAgICAgIH0gZWxzZSBpZiAoY2FuX2RpcnR5KGNuKSkgeworICAgICAgICAvKiBldmVyeXRoaW5nIHdpdGggIXBqbCAmJiBqd2FpdCBzaG91bGQgYmUgd3JpdGFibGUgKi8KKwlCVUcoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZiBzb21lb25lIGhhcyB0aGlzIGJsb2NrIGluIGEgbmV3ZXIgdHJhbnNhY3Rpb24sIGp1c3QgbWFrZQorICAgICoqIHN1cmUgdGhleSBhcmUgY29tbWl0ZWQsIGFuZCBkb24ndCB0cnkgd3JpdGluZyBpdCB0byBkaXNrCisgICAgKi8KKyAgICBpZiAocGpsKSB7CisgICAgICBpZiAoYXRvbWljX3JlYWQoJnBqbC0+al9jb21taXRfbGVmdCkpCisgICAgICAgIGZsdXNoX2NvbW1pdF9saXN0KHMsIHBqbCwgMSkgOworICAgICAgZ290byBmcmVlX2Nub2RlIDsKKyAgICB9CisKKyAgICAvKiBiaCA9PSBOVUxMIHdoZW4gdGhlIGJsb2NrIGdvdCB0byBkaXNrIG9uIGl0cyBvd24sIE9SLCAKKyAgICAqKiB0aGUgYmxvY2sgZ290IGZyZWVkIGluIGEgZnV0dXJlIHRyYW5zYWN0aW9uIAorICAgICovCisgICAgaWYgKHNhdmVkX2JoID09IE5VTEwpIHsKKyAgICAgIGdvdG8gZnJlZV9jbm9kZSA7CisgICAgfQorCisgICAgLyogdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLiAga3VwZGF0ZV9vbmVfdHJhbnNhY3Rpb24gaGFzIHRoaXMgbGlzdAorICAgICoqIGxvY2tlZCB3aGlsZSBpdCB3b3Jrcywgc28gd2Ugc2hvdWxkIG5ldmVyIHNlZSBhIGJ1ZmZlciBoZXJlIHRoYXQKKyAgICAqKiBpcyBub3QgbWFya2VkIEpEaXJ0eV93YWl0CisgICAgKi8KKyAgICBpZiAoKCF3YXNfandhaXQpICYmICFidWZmZXJfbG9ja2VkKHNhdmVkX2JoKSkgeworCXJlaXNlcmZzX3dhcm5pbmcgKHMsICJqb3VybmFsLTgxMzogQkFEISBidWZmZXIgJWxsdSAlY2RpcnR5ICVjandhaXQsICIKKwkJCSAgIm5vdCBpbiBhIG5ld2VyIHRyYW5hc2N0aW9uIiwKKwkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylzYXZlZF9iaC0+Yl9ibG9ja25yLAorCQkJICB3YXNfZGlydHkgPyAnICcgOiAnIScsIHdhc19qd2FpdCA/ICcgJyA6ICchJykgOworICAgIH0KKyAgICBpZiAod2FzX2RpcnR5KSB7IAorICAgICAgLyogd2UgaW5jIGFnYWluIGJlY2F1c2Ugc2F2ZWRfYmggZ2V0cyBkZWNyZW1lbnRlZCBhdCBmcmVlX2Nub2RlICovCisgICAgICBnZXRfYmgoc2F2ZWRfYmgpIDsKKyAgICAgIHNldF9iaXQoQkxPQ0tfTkVFRFNfRkxVU0gsICZjbi0+c3RhdGUpIDsKKyAgICAgIGxvY2tfYnVmZmVyKHNhdmVkX2JoKTsKKyAgICAgIEJVR19PTiAoY24tPmJsb2NrbnIgIT0gc2F2ZWRfYmgtPmJfYmxvY2tucik7CisgICAgICBpZiAoYnVmZmVyX2RpcnR5KHNhdmVkX2JoKSkKKyAgICAgICAgc3VibWl0X2xvZ2dlZF9idWZmZXIoc2F2ZWRfYmgpIDsKKyAgICAgIGVsc2UKKyAgICAgICAgdW5sb2NrX2J1ZmZlcihzYXZlZF9iaCk7CisgICAgICBjb3VudCsrIDsKKyAgICB9IGVsc2UgeworICAgICAgcmVpc2VyZnNfd2FybmluZyAocywgImNsbS0yMDgyOiBVbmFibGUgdG8gZmx1c2ggYnVmZmVyICVsbHUgaW4gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzYXZlZF9iaC0+Yl9ibG9ja25yLCBfX0ZVTkNUSU9OX18pOworICAgIH0KK2ZyZWVfY25vZGU6CisgICAgbGFzdCA9IGNuIDsKKyAgICBjbiA9IGNuLT5uZXh0IDsKKyAgICBpZiAoc2F2ZWRfYmgpIHsKKyAgICAgIC8qIHdlIGluY3JlbWVudGVkIHRoaXMgdG8ga2VlcCBvdGhlcnMgZnJvbSB0YWtpbmcgdGhlIGJ1ZmZlciBoZWFkIGF3YXkgKi8KKyAgICAgIHB1dF9iaChzYXZlZF9iaCkgOworICAgICAgaWYgKGF0b21pY19yZWFkKCYoc2F2ZWRfYmgtPmJfY291bnQpKSA8IDApIHsKKyAgICAgICAgcmVpc2VyZnNfd2FybmluZyAocywgImpvdXJuYWwtOTQ1OiBzYXZlZF9iaC0+Yl9jb3VudCA8IDAiKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKGNvdW50ID4gMCkgeworICAgIGNuID0gamwtPmpfcmVhbGJsb2NrIDsKKyAgICB3aGlsZShjbikgeworICAgICAgaWYgKHRlc3RfYml0KEJMT0NLX05FRURTX0ZMVVNILCAmY24tPnN0YXRlKSkgeworCWlmICghY24tPmJoKSB7CisJICByZWlzZXJmc19wYW5pYyhzLCAiam91cm5hbC0xMDExOiBjbi0+YmggaXMgTlVMTFxuIikgOworCX0KKwl3YWl0X29uX2J1ZmZlcihjbi0+YmgpIDsKKwlpZiAoIWNuLT5iaCkgeworCSAgcmVpc2VyZnNfcGFuaWMocywgImpvdXJuYWwtMTAxMjogY24tPmJoIGlzIE5VTExcbiIpIDsKKwl9CisJaWYgKHVubGlrZWx5ICghYnVmZmVyX3VwdG9kYXRlKGNuLT5iaCkpKSB7CisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisJICByZWlzZXJmc193YXJuaW5nKHMsICJqb3VybmFsLTk0OTogYnVmZmVyIHdyaXRlIGZhaWxlZFxuIikgOworI2VuZGlmCisgICAgICAgICAgZXJyID0gLUVJTzsKKyAgCX0KKwkvKiBub3RlLCB3ZSBtdXN0IGNsZWFyIHRoZSBKRGlydHlfd2FpdCBiaXQgYWZ0ZXIgdGhlIHVwIHRvIGRhdGUKKwkqKiBjaGVjaywgb3RoZXJ3aXNlIHdlIHJhY2UgYWdhaW5zdCBvdXIgZmx1c2hwYWdlIHJvdXRpbmUKKwkqLworICAgICAgICBCVUdfT04gKCF0ZXN0X2NsZWFyX2J1ZmZlcl9qb3VybmFsX2RpcnR5IChjbi0+YmgpKTsKKworICAgICAgICAvKiB1bmRvIHRoZSBpbmMgZnJvbSBqb3VybmFsX21hcmtfZGlydHkgKi8KKwlwdXRfYmgoY24tPmJoKSA7CisgICAgICAgIGJyZWxzZShjbi0+YmgpIDsKKyAgICAgIH0KKyAgICAgIGNuID0gY24tPm5leHQgOworICAgIH0KKyAgfQorCisgIGlmIChlcnIpCisgICAgcmVpc2VyZnNfYWJvcnQgKHMsIC1FSU8sICJXcml0ZSBlcnJvciB3aGlsZSBwdXNoaW5nIHRyYW5zYWN0aW9uIHRvIGRpc2sgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOworZmx1c2hfb2xkZXJfYW5kX3JldHVybjoKKworCisgIC8qIGJlZm9yZSB3ZSBjYW4gdXBkYXRlIHRoZSBqb3VybmFsIGhlYWRlciBibG9jaywgd2UgX211c3RfIGZsdXNoIGFsbCAKKyAgKiogcmVhbCBibG9ja3MgZnJvbSBhbGwgb2xkZXIgdHJhbnNhY3Rpb25zIHRvIGRpc2suICBUaGlzIGlzIGJlY2F1c2UKKyAgKiogb25jZSB0aGUgaGVhZGVyIGJsb2NrIGlzIHVwZGF0ZWQsIHRoaXMgdHJhbnNhY3Rpb24gd2lsbCBub3QgYmUKKyAgKiogcmVwbGF5ZWQgYWZ0ZXIgYSBjcmFzaAorICAqLworICBpZiAoZmx1c2hhbGwpIHsKKyAgICBmbHVzaF9vbGRlcl9qb3VybmFsX2xpc3RzKHMsIGpsKTsKKyAgfSAKKyAgCisgIGVyciA9IGpvdXJuYWwtPmpfZXJybm87CisgIC8qIGJlZm9yZSB3ZSBjYW4gcmVtb3ZlIGV2ZXJ5dGhpbmcgZnJvbSB0aGUgaGFzaCB0YWJsZXMgZm9yIHRoaXMgCisgICoqIHRyYW5zYWN0aW9uLCB3ZSBtdXN0IG1ha2Ugc3VyZSBpdCBjYW4gbmV2ZXIgYmUgcmVwbGF5ZWQKKyAgKioKKyAgKiogc2luY2Ugd2UgYXJlIG9ubHkgY2FsbGVkIGZyb20gZG9fam91cm5hbF9lbmQsIHdlIGtub3cgZm9yIHN1cmUgdGhlcmUKKyAgKiogYXJlIG5vIGFsbG9jYXRpb25zIGdvaW5nIG9uIHdoaWxlIHdlIGFyZSBmbHVzaGluZyBqb3VybmFsIGxpc3RzLiAgU28sCisgICoqIHdlIG9ubHkgbmVlZCB0byB1cGRhdGUgdGhlIGpvdXJuYWwgaGVhZGVyIGJsb2NrIGZvciB0aGUgbGFzdCBsaXN0CisgICoqIGJlaW5nIGZsdXNoZWQKKyAgKi8KKyAgaWYgKCFlcnIgJiYgZmx1c2hhbGwpIHsKKyAgICBlcnIgPSB1cGRhdGVfam91cm5hbF9oZWFkZXJfYmxvY2socywgKGpsLT5qX3N0YXJ0ICsgamwtPmpfbGVuICsgMikgJSBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHMpLCBqbC0+al90cmFuc19pZCkgOworICAgIGlmIChlcnIpCisgICAgICAgIHJlaXNlcmZzX2Fib3J0IChzLCAtRUlPLCAiV3JpdGUgZXJyb3Igd2hpbGUgdXBkYXRpbmcgam91cm5hbCBoZWFkZXIgaW4gJXMiLCBfX0ZVTkNUSU9OX18pOworICB9CisgIHJlbW92ZV9hbGxfZnJvbV9qb3VybmFsX2xpc3QocywgamwsIDApIDsKKyAgbGlzdF9kZWxfaW5pdCgmamwtPmpfbGlzdCk7CisgIGpvdXJuYWwtPmpfbnVtX2xpc3RzLS07CisgIGRlbF9mcm9tX3dvcmtfbGlzdChzLCBqbCk7CisKKyAgaWYgKGpvdXJuYWwtPmpfbGFzdF9mbHVzaF9pZCAhPSAwICYmCisgICAgIChqbC0+al90cmFuc19pZCAtIGpvdXJuYWwtPmpfbGFzdF9mbHVzaF9pZCkgIT0gMSkgeworICAgICAgcmVpc2VyZnNfd2FybmluZyhzLCAiY2xtLTIyMDE6IGxhc3QgZmx1c2ggJWx1LCBjdXJyZW50ICVsdSIsCisgICAgICAgICAgICAgICAgICAgICAgIGpvdXJuYWwtPmpfbGFzdF9mbHVzaF9pZCwKKwkJICAgICAgIGpsLT5qX3RyYW5zX2lkKTsKKyAgfQorICBqb3VybmFsLT5qX2xhc3RfZmx1c2hfaWQgPSBqbC0+al90cmFuc19pZDsKKworICAvKiBub3Qgc3RyaWN0bHkgcmVxdWlyZWQgc2luY2Ugd2UgYXJlIGZyZWVpbmcgdGhlIGxpc3QsIGJ1dCBpdCBzaG91bGQKKyAgICogaGVscCBmaW5kIGNvZGUgdXNpbmcgZGVhZCBsaXN0cyBsYXRlciBvbgorICAgKi8KKyAgamwtPmpfbGVuID0gMCA7CisgIGF0b21pY19zZXQoJihqbC0+al9ub256ZXJvbGVuKSwgMCkgOworICBqbC0+al9zdGFydCA9IDAgOworICBqbC0+al9yZWFsYmxvY2sgPSBOVUxMIDsKKyAgamwtPmpfY29tbWl0X2JoID0gTlVMTCA7CisgIGpsLT5qX3RyYW5zX2lkID0gMCA7CisgIGpsLT5qX3N0YXRlID0gMDsKKyAgcHV0X2pvdXJuYWxfbGlzdChzLCBqbCk7CisgIGlmIChmbHVzaGFsbCkKKyAgICB1cCgmam91cm5hbC0+al9mbHVzaF9zZW0pOworICByZXR1cm4gZXJyIDsKK30gCisKK3N0YXRpYyBpbnQgd3JpdGVfb25lX3RyYW5zYWN0aW9uKHN0cnVjdCBzdXBlcl9ibG9jayAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsLAorCQkJCSBzdHJ1Y3QgYnVmZmVyX2NodW5rICpjaHVuaykKK3sKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY247CisgICAgaW50IHJldCA9IDAgOworCisgICAgamwtPmpfc3RhdGUgfD0gTElTVF9UT1VDSEVEOworICAgIGRlbF9mcm9tX3dvcmtfbGlzdChzLCBqbCk7CisgICAgaWYgKGpsLT5qX2xlbiA9PSAwIHx8IGF0b21pY19yZWFkKCZqbC0+al9ub256ZXJvbGVuKSA9PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGNuID0gamwtPmpfcmVhbGJsb2NrIDsKKyAgICB3aGlsZShjbikgeworICAgICAgICAvKiBpZiB0aGUgYmxvY2tuciA9PSAwLCB0aGlzIGhhcyBiZWVuIGNsZWFyZWQgZnJvbSB0aGUgaGFzaCwKKyAgICAgICAgKiogc2tpcCBpdAorICAgICAgICAqLworICAgICAgICBpZiAoY24tPmJsb2NrbnIgPT0gMCkgeworICAgICAgICAgICAgZ290byBuZXh0IDsKKyAgICAgICAgfQorICAgICAgICBpZiAoY24tPmJoICYmIGNhbl9kaXJ0eShjbikgJiYgYnVmZmVyX2RpcnR5KGNuLT5iaCkpIHsKKwkgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICp0bXBfYmg7CisJICAgIC8qIHdlIGNhbiByYWNlIGFnYWluc3Qgam91cm5hbF9tYXJrX2ZyZWVkIHdoZW4gd2UgdHJ5CisJICAgICAqIHRvIGxvY2tfYnVmZmVyKGNuLT5iaCksIHNvIHdlIGhhdmUgdG8gaW5jIHRoZSBidWZmZXIKKwkgICAgICogY291bnQsIGFuZCByZWNoZWNrIHRoaW5ncyBhZnRlciBsb2NraW5nCisJICAgICAqLworCSAgICB0bXBfYmggPSBjbi0+Ymg7CisJICAgIGdldF9iaCh0bXBfYmgpOworCSAgICBsb2NrX2J1ZmZlcih0bXBfYmgpOworCSAgICBpZiAoY24tPmJoICYmIGNhbl9kaXJ0eShjbikgJiYgYnVmZmVyX2RpcnR5KHRtcF9iaCkpIHsKKwkJaWYgKCFidWZmZXJfam91cm5hbF9kaXJ0eSh0bXBfYmgpIHx8CisJCSAgICBidWZmZXJfam91cm5hbF9wcmVwYXJlZCh0bXBfYmgpKQorCQkgICAgQlVHKCk7CisJCWFkZF90b19jaHVuayhjaHVuaywgdG1wX2JoLCBOVUxMLCB3cml0ZV9jaHVuayk7CisJCXJldCsrOworCSAgICB9IGVsc2UgeworCQkvKiBub3RlLCBjbi0+YmggbWlnaHQgYmUgbnVsbCBub3cgKi8KKwkJdW5sb2NrX2J1ZmZlcih0bXBfYmgpOworCSAgICB9CisJICAgIHB1dF9iaCh0bXBfYmgpOworICAgICAgICB9CituZXh0OgorICAgICAgICBjbiA9IGNuLT5uZXh0IDsKKwljb25kX3Jlc2NoZWQoKTsKKyAgICB9CisgICAgcmV0dXJuIHJldCA7Cit9CisKKy8qIHVzZWQgYnkgZmx1c2hfY29tbWl0X2xpc3QgKi8KK3N0YXRpYyBpbnQgZGlydHlfb25lX3RyYW5zYWN0aW9uKHN0cnVjdCBzdXBlcl9ibG9jayAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsKQoreworICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbjsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpwamw7CisgICAgaW50IHJldCA9IDAgOworCisgICAgamwtPmpfc3RhdGUgfD0gTElTVF9ESVJUWTsKKyAgICBjbiA9IGpsLT5qX3JlYWxibG9jayA7CisgICAgd2hpbGUoY24pIHsKKyAgICAgICAgLyogbG9vayBmb3IgYSBtb3JlIHJlY2VudCB0cmFuc2FjdGlvbiB0aGF0IGxvZ2dlZCB0aGlzCisgICAgICAgICoqIGJ1ZmZlci4gIE9ubHkgdGhlIG1vc3QgcmVjZW50IHRyYW5zYWN0aW9uIHdpdGggYSBidWZmZXIgaW4KKyAgICAgICAgKiogaXQgaXMgYWxsb3dlZCB0byBzZW5kIHRoYXQgYnVmZmVyIHRvIGRpc2sKKyAgICAgICAgKi8KKwlwamwgPSBmaW5kX25ld2VyX2psX2Zvcl9jbihjbikgOworICAgICAgICBpZiAoIXBqbCAmJiBjbi0+YmxvY2tuciAmJiBjbi0+YmggJiYgYnVmZmVyX2pvdXJuYWxfZGlydHkoY24tPmJoKSkKKwl7CisJICAgIEJVR19PTiAoIWNhbl9kaXJ0eShjbikpOworCSAgICAvKiBpZiB0aGUgYnVmZmVyIGlzIHByZXBhcmVkLCBpdCB3aWxsIGVpdGhlciBiZSBsb2dnZWQKKwkgICAgICogb3IgcmVzdG9yZWQuICBJZiByZXN0b3JlZCwgd2UgbmVlZCB0byBtYWtlIHN1cmUKKwkgICAgICogaXQgYWN0dWFsbHkgZ2V0cyBtYXJrZWQgZGlydHkKKwkgICAgICovCisgICAgICAgICAgICBjbGVhcl9idWZmZXJfam91cm5hbF9uZXcgKGNuLT5iaCk7CisgICAgICAgICAgICBpZiAoYnVmZmVyX2pvdXJuYWxfcHJlcGFyZWQgKGNuLT5iaCkpIHsKKyAgICAgICAgICAgICAgICBzZXRfYnVmZmVyX2pvdXJuYWxfcmVzdG9yZV9kaXJ0eSAoY24tPmJoKTsKKwkgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZXRfYnVmZmVyX2pvdXJuYWxfdGVzdCAoY24tPmJoKTsKKwkgICAgICAgIG1hcmtfYnVmZmVyX2RpcnR5KGNuLT5iaCk7CisJICAgIH0KKyAgICAgICAgfSAKKyAgICAgICAgY24gPSBjbi0+bmV4dCA7CisgICAgfQorICAgIHJldHVybiByZXQgOworfQorCitzdGF0aWMgaW50IGt1cGRhdGVfdHJhbnNhY3Rpb25zKHN0cnVjdCBzdXBlcl9ibG9jayAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwsCisJCQkJICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqKm5leHRfamwsCisJCQkJICAgdW5zaWduZWQgbG9uZyAqbmV4dF90cmFuc19pZCwKKwkJCQkgICBpbnQgbnVtX2Jsb2NrcywKKwkJCQkgICBpbnQgbnVtX3RyYW5zKSB7CisgICAgaW50IHJldCA9IDA7CisgICAgaW50IHdyaXR0ZW4gPSAwIDsKKyAgICBpbnQgdHJhbnNhY3Rpb25zX2ZsdXNoZWQgPSAwOworICAgIHVuc2lnbmVkIGxvbmcgb3JpZ190cmFuc19pZCA9IGpsLT5qX3RyYW5zX2lkOworICAgIHN0cnVjdCBidWZmZXJfY2h1bmsgY2h1bms7CisgICAgc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7CisgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChzKTsKKyAgICBjaHVuay5uciA9IDA7CisKKyAgICBkb3duKCZqb3VybmFsLT5qX2ZsdXNoX3NlbSk7CisgICAgaWYgKCFqb3VybmFsX2xpc3Rfc3RpbGxfYWxpdmUocywgb3JpZ190cmFuc19pZCkpIHsKKwlnb3RvIGRvbmU7CisgICAgfQorCisgICAgLyogd2UndmUgZ290IGpfZmx1c2hfc2VtIGhlbGQsIG5vYm9keSBpcyBnb2luZyB0byBkZWxldGUgYW55CisgICAgICogb2YgdGhlc2UgbGlzdHMgb3V0IGZyb20gdW5kZXJuZWF0aCB1cworICAgICAqLworICAgIHdoaWxlKChudW1fdHJhbnMgJiYgdHJhbnNhY3Rpb25zX2ZsdXNoZWQgPCBudW1fdHJhbnMpIHx8CisgICAgICAgICAgKCFudW1fdHJhbnMgJiYgd3JpdHRlbiA8IG51bV9ibG9ja3MpKSB7CisKKwlpZiAoamwtPmpfbGVuID09IDAgfHwgKGpsLT5qX3N0YXRlICYgTElTVF9UT1VDSEVEKSB8fAorCSAgICBhdG9taWNfcmVhZCgmamwtPmpfY29tbWl0X2xlZnQpIHx8ICEoamwtPmpfc3RhdGUgJiBMSVNUX0RJUlRZKSkKKwl7CisJICAgIGRlbF9mcm9tX3dvcmtfbGlzdChzLCBqbCk7CisJICAgIGJyZWFrOworCX0KKwlyZXQgPSB3cml0ZV9vbmVfdHJhbnNhY3Rpb24ocywgamwsICZjaHVuayk7CisKKwlpZiAocmV0IDwgMCkKKwkgICAgZ290byBkb25lOworCXRyYW5zYWN0aW9uc19mbHVzaGVkKys7CisJd3JpdHRlbiArPSByZXQ7CisJZW50cnkgPSBqbC0+al9saXN0Lm5leHQ7CisKKwkvKiBkaWQgd2Ugd3JhcD8gKi8KKwlpZiAoZW50cnkgPT0gJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KSB7CisJICAgIGJyZWFrOworICAgICAgICB9CisJamwgPSBKT1VSTkFMX0xJU1RfRU5UUlkoZW50cnkpOworCisJLyogZG9uJ3QgYm90aGVyIHdpdGggb2xkZXIgdHJhbnNhY3Rpb25zICovCisJaWYgKGpsLT5qX3RyYW5zX2lkIDw9IG9yaWdfdHJhbnNfaWQpCisJICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoY2h1bmsubnIpIHsKKyAgICAgICAgd3JpdGVfY2h1bmsoJmNodW5rKTsKKyAgICB9CisKK2RvbmU6CisgICAgdXAoJmpvdXJuYWwtPmpfZmx1c2hfc2VtKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBmb3Igb19zeW5jIGFuZCBmc3luYyBoZWF2eSBhcHBsaWNhdGlvbnMsIHRoZXkgdGVuZCB0byB1c2UKKyoqIGFsbCB0aGUgam91cm5hIGxpc3Qgc2xvdHMgd2l0aCB0aW55IHRyYW5zYWN0aW9ucy4gIFRoZXNlCisqKiB0cmlnZ2VyIGxvdHMgYW5kIGxvdHMgb2YgY2FsbHMgdG8gdXBkYXRlIHRoZSBoZWFkZXIgYmxvY2ssIHdoaWNoCisqKiBhZGRzIHNlZWtzIGFuZCBzbG93cyB0aGluZ3MgZG93bi4KKyoqCisqKiBUaGlzIGZ1bmN0aW9uIHRyaWVzIHRvIGNsZWFyIG91dCBhIGxhcmdlIGNodW5rIG9mIHRoZSBqb3VybmFsIGxpc3RzCisqKiBhdCBvbmNlLCB3aGljaCBtYWtlcyBldmVyeXRoaW5nIGZhc3RlciBzaW5jZSBvbmx5IHRoZSBuZXdlc3Qgam91cm5hbAorKiogbGlzdCB1cGRhdGVzIHRoZSBoZWFkZXIgYmxvY2sKKyovCitzdGF0aWMgaW50IGZsdXNoX3VzZWRfam91cm5hbF9saXN0cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCkgeworICAgIHVuc2lnbmVkIGxvbmcgbGVuID0gMDsKKyAgICB1bnNpZ25lZCBsb25nIGN1cl9sZW47CisgICAgaW50IHJldDsKKyAgICBpbnQgaTsKKyAgICBpbnQgbGltaXQgPSAyNTY7CisgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqdGpsOworICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmZsdXNoX2psOworICAgIHVuc2lnbmVkIGxvbmcgdHJhbnNfaWQ7CisgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChzKTsKKworICAgIGZsdXNoX2psID0gdGpsID0gamw7CisKKyAgICAvKiBpbiBkYXRhIGxvZ2dpbmcgbW9kZSwgdHJ5IGhhcmRlciB0byBmbHVzaCBhIGxvdCBvZiBibG9ja3MgKi8KKyAgICBpZiAocmVpc2VyZnNfZGF0YV9sb2cocykpCisJbGltaXQgPSAxMDI0OworICAgIC8qIGZsdXNoIGZvciAyNTYgdHJhbnNhY3Rpb25zIG9yIGxpbWl0IGJsb2Nrcywgd2hpY2hldmVyIGNvbWVzIGZpcnN0ICovCisgICAgZm9yKGkgPSAwIDsgaSA8IDI1NiAmJiBsZW4gPCBsaW1pdCA7IGkrKykgeworCWlmIChhdG9taWNfcmVhZCgmdGpsLT5qX2NvbW1pdF9sZWZ0KSB8fAorCSAgICB0amwtPmpfdHJhbnNfaWQgPCBqbC0+al90cmFuc19pZCkgeworCSAgICBicmVhazsKKwl9CisJY3VyX2xlbiA9IGF0b21pY19yZWFkKCZ0amwtPmpfbm9uemVyb2xlbik7CisJaWYgKGN1cl9sZW4gPiAwKSB7CisJICAgIHRqbC0+al9zdGF0ZSAmPSB+TElTVF9UT1VDSEVEOworCX0KKwlsZW4gKz0gY3VyX2xlbjsKKwlmbHVzaF9qbCA9IHRqbDsKKwlpZiAodGpsLT5qX2xpc3QubmV4dCA9PSAmam91cm5hbC0+al9qb3VybmFsX2xpc3QpCisJICAgIGJyZWFrOworCXRqbCA9IEpPVVJOQUxfTElTVF9FTlRSWSh0amwtPmpfbGlzdC5uZXh0KTsKKyAgICB9CisgICAgLyogdHJ5IHRvIGZpbmQgYSBncm91cCBvZiBibG9ja3Mgd2UgY2FuIGZsdXNoIGFjcm9zcyBhbGwgdGhlCisgICAgKiogdHJhbnNhY3Rpb25zLCBidXQgb25seSBib3RoZXIgaWYgd2UndmUgYWN0dWFsbHkgc3Bhbm5lZAorICAgICoqIGFjcm9zcyBtdWx0aXBsZSBsaXN0cworICAgICovCisgICAgaWYgKGZsdXNoX2psICE9IGpsKSB7CisgICAgICAgIHJldCA9IGt1cGRhdGVfdHJhbnNhY3Rpb25zKHMsIGpsLCAmdGpsLCAmdHJhbnNfaWQsIGxlbiwgaSk7CisgICAgfQorICAgIGZsdXNoX2pvdXJuYWxfbGlzdChzLCBmbHVzaF9qbCwgMSk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisqKiByZW1vdmVzIGFueSBub2RlcyBpbiB0YWJsZSB3aXRoIG5hbWUgYmxvY2sgYW5kIGRldiBhcyBiaC4KKyoqIG9ubHkgdG91Y2hzIHRoZSBobmV4dCBhbmQgaHByZXYgcG9pbnRlcnMuCisqLwordm9pZCByZW1vdmVfam91cm5hbF9oYXNoKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCQlzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqKnRhYmxlLAorCQkJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamwsCisJCQl1bnNpZ25lZCBsb25nIGJsb2NrLCBpbnQgcmVtb3ZlX2ZyZWVkKQoreworICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY3VyIDsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKipoZWFkIDsKKworICBoZWFkPSAmKGpvdXJuYWxfaGFzaCh0YWJsZSwgc2IsIGJsb2NrKSkgOworICBpZiAoIWhlYWQpIHsKKyAgICByZXR1cm4gOworICB9CisgIGN1ciA9ICpoZWFkIDsKKyAgd2hpbGUoY3VyKSB7CisgICAgaWYgKGN1ci0+YmxvY2tuciA9PSBibG9jayAmJiBjdXItPnNiID09IHNiICYmIChqbCA9PSBOVUxMIHx8IGpsID09IGN1ci0+amxpc3QpICYmIAorICAgICAgICAoIXRlc3RfYml0KEJMT0NLX0ZSRUVELCAmY3VyLT5zdGF0ZSkgfHwgcmVtb3ZlX2ZyZWVkKSkgeworICAgICAgaWYgKGN1ci0+aG5leHQpIHsKKyAgICAgICAgY3VyLT5obmV4dC0+aHByZXYgPSBjdXItPmhwcmV2IDsKKyAgICAgIH0KKyAgICAgIGlmIChjdXItPmhwcmV2KSB7CisJY3VyLT5ocHJldi0+aG5leHQgPSBjdXItPmhuZXh0IDsKKyAgICAgIH0gZWxzZSB7CisJKmhlYWQgPSBjdXItPmhuZXh0IDsKKyAgICAgIH0KKyAgICAgIGN1ci0+YmxvY2tuciA9IDAgOworICAgICAgY3VyLT5zYiA9IE5VTEwgOworICAgICAgY3VyLT5zdGF0ZSA9IDAgOworICAgICAgaWYgKGN1ci0+YmggJiYgY3VyLT5qbGlzdCkgLyogYW55Ym9keSB3aG8gY2xlYXJzIHRoZSBjdXItPmJoIHdpbGwgYWxzbyBkZWMgdGhlIG5vbnplcm9sZW4gKi8KKwlhdG9taWNfZGVjKCYoY3VyLT5qbGlzdC0+al9ub256ZXJvbGVuKSkgOworICAgICAgY3VyLT5iaCA9IE5VTEwgOworICAgICAgY3VyLT5qbGlzdCA9IE5VTEwgOworICAgIH0gCisgICAgY3VyID0gY3VyLT5obmV4dCA7CisgIH0KK30KKworc3RhdGljIHZvaWQgZnJlZV9qb3VybmFsX3JhbShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikgeworICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKKyAgcmVpc2VyZnNfa2ZyZWUoam91cm5hbC0+al9jdXJyZW50X2psLAorICAgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCksIHBfc19zYik7CisgIGpvdXJuYWwtPmpfbnVtX2xpc3RzLS07CisKKyAgdmZyZWUoam91cm5hbC0+al9jbm9kZV9mcmVlX29yaWcpIDsKKyAgZnJlZV9saXN0X2JpdG1hcHMocF9zX3NiLCBqb3VybmFsLT5qX2xpc3RfYml0bWFwKSA7CisgIGZyZWVfYml0bWFwX25vZGVzKHBfc19zYikgOyAvKiBtdXN0IGJlIGFmdGVyIGZyZWVfbGlzdF9iaXRtYXBzICovCisgIGlmIChqb3VybmFsLT5qX2hlYWRlcl9iaCkgeworICAgIGJyZWxzZShqb3VybmFsLT5qX2hlYWRlcl9iaCkgOworICB9CisgIC8qIGpfaGVhZGVyX2JoIGlzIG9uIHRoZSBqb3VybmFsIGRldiwgbWFrZSBzdXJlIG5vdCB0byByZWxlYXNlIHRoZSBqb3VybmFsCisgICAqIGRldiB1bnRpbCB3ZSBicmVsc2Ugal9oZWFkZXJfYmgKKyAgICovCisgIHJlbGVhc2Vfam91cm5hbF9kZXYocF9zX3NiLCBqb3VybmFsKTsKKyAgdmZyZWUoam91cm5hbCkgOworfQorCisvKgorKiogY2FsbCBvbiB1bm1vdW50LiAgT25seSBzZXQgZXJyb3IgdG8gMSBpZiB5b3UgaGF2ZW4ndCBtYWRlIHlvdXIgd2F5IG91dAorKiogb2YgcmVhZF9zdXBlcigpIHlldC4gIEFueSBvdGhlciBjYWxsZXIgbXVzdCBrZWVwIGVycm9yIGF0IDAuCisqLworc3RhdGljIGludCBkb19qb3VybmFsX3JlbGVhc2Uoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCBpbnQgZXJyb3IpIHsKKyAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSBteXRoIDsKKyAgaW50IGZsdXNoZWQgPSAwOworICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKKworICAvKiB3ZSBvbmx5IHdhbnQgdG8gZmx1c2ggb3V0IHRyYW5zYWN0aW9ucyBpZiB3ZSB3ZXJlIGNhbGxlZCB3aXRoIGVycm9yID09IDAKKyAgKi8KKyAgaWYgKCFlcnJvciAmJiAhKHBfc19zYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKyAgICAvKiBlbmQgdGhlIGN1cnJlbnQgdHJhbnMgKi8KKyAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisgICAgZG9fam91cm5hbF9lbmQodGgsIHBfc19zYiwxMCwgRkxVU0hfQUxMKSA7CisKKyAgICAvKiBtYWtlIHN1cmUgc29tZXRoaW5nIGdldHMgbG9nZ2VkIHRvIGZvcmNlIG91ciB3YXkgaW50byB0aGUgZmx1c2ggY29kZSAqLworICAgIGlmICgham91cm5hbF9qb2luKCZteXRoLCBwX3Nfc2IsIDEpKSB7CisgICAgICAgIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocF9zX3NiLCBTQl9CVUZGRVJfV0lUSF9TQihwX3Nfc2IpLCAxKSA7CisgICAgICAgIGpvdXJuYWxfbWFya19kaXJ0eSgmbXl0aCwgcF9zX3NiLCBTQl9CVUZGRVJfV0lUSF9TQihwX3Nfc2IpKSA7CisgICAgICAgIGRvX2pvdXJuYWxfZW5kKCZteXRoLCBwX3Nfc2IsMSwgRkxVU0hfQUxMKSA7CisgICAgICAgIGZsdXNoZWQgPSAxOworICAgIH0KKyAgfQorCisgIC8qIHRoaXMgYWxzbyBjYXRjaGVzIGVycm9ycyBkdXJpbmcgdGhlIGRvX2pvdXJuYWxfZW5kIGFib3ZlICovCisgIGlmICghZXJyb3IgJiYgcmVpc2VyZnNfaXNfam91cm5hbF9hYm9ydGVkKGpvdXJuYWwpKSB7CisgICAgICBtZW1zZXQoJm15dGgsIDAsIHNpemVvZihteXRoKSk7CisgICAgICBpZiAoIWpvdXJuYWxfam9pbl9hYm9ydCgmbXl0aCwgcF9zX3NiLCAxKSkgeworCSAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChwX3Nfc2IsIFNCX0JVRkZFUl9XSVRIX1NCKHBfc19zYiksIDEpIDsKKwkgIGpvdXJuYWxfbWFya19kaXJ0eSgmbXl0aCwgcF9zX3NiLCBTQl9CVUZGRVJfV0lUSF9TQihwX3Nfc2IpKSA7CisgICAgICAgICAgZG9fam91cm5hbF9lbmQoJm15dGgsIHBfc19zYiwgMSwgRkxVU0hfQUxMKSA7CisgICAgICB9CisgIH0KKworICByZWlzZXJmc19tb3VudGVkX2ZzX2NvdW50LS0gOworICAvKiB3YWl0IGZvciBhbGwgY29tbWl0cyB0byBmaW5pc2ggKi8KKyAgY2FuY2VsX2RlbGF5ZWRfd29yaygmU0JfSk9VUk5BTChwX3Nfc2IpLT5qX3dvcmspOworICBmbHVzaF93b3JrcXVldWUoY29tbWl0X3dxKTsKKyAgaWYgKCFyZWlzZXJmc19tb3VudGVkX2ZzX2NvdW50KSB7CisgICAgZGVzdHJveV93b3JrcXVldWUoY29tbWl0X3dxKTsKKyAgICBjb21taXRfd3EgPSBOVUxMOworICB9CisKKyAgZnJlZV9qb3VybmFsX3JhbShwX3Nfc2IpIDsKKworICByZXR1cm4gMCA7Cit9CisKKy8qCisqKiBjYWxsIG9uIHVubW91bnQuICBmbHVzaCBhbGwgam91cm5hbCB0cmFucywgcmVsZWFzZSBhbGwgYWxsb2MnZCByYW0KKyovCitpbnQgam91cm5hbF9yZWxlYXNlKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikgeworICByZXR1cm4gZG9fam91cm5hbF9yZWxlYXNlKHRoLCBwX3Nfc2IsIDApIDsKK30KKy8qCisqKiBvbmx5IGNhbGwgZnJvbSBhbiBlcnJvciBjb25kaXRpb24gaW5zaWRlIHJlaXNlcmZzX3JlYWRfc3VwZXIhCisqLworaW50IGpvdXJuYWxfcmVsZWFzZV9lcnJvcihzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpIHsKKyAgcmV0dXJuIGRvX2pvdXJuYWxfcmVsZWFzZSh0aCwgcF9zX3NiLCAxKSA7Cit9CisKKy8qIGNvbXBhcmVzIGRlc2NyaXB0aW9uIGJsb2NrIHdpdGggY29tbWl0IGJsb2NrLiAgcmV0dXJucyAxIGlmIHRoZXkgZGlmZmVyLCAwIGlmIHRoZXkgYXJlIHRoZSBzYW1lICovCitzdGF0aWMgaW50IGpvdXJuYWxfY29tcGFyZV9kZXNjX2NvbW1pdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfZGVzYyAqZGVzYywgCisJCQkgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jb21taXQgKmNvbW1pdCkgeworICBpZiAoZ2V0X2NvbW1pdF90cmFuc19pZCAoY29tbWl0KSAhPSBnZXRfZGVzY190cmFuc19pZCAoZGVzYykgfHwgCisgICAgICBnZXRfY29tbWl0X3RyYW5zX2xlbiAoY29tbWl0KSAhPSBnZXRfZGVzY190cmFuc19sZW4gKGRlc2MpIHx8IAorICAgICAgZ2V0X2NvbW1pdF90cmFuc19sZW4gKGNvbW1pdCkgPiBTQl9KT1VSTkFMKHBfc19zYiktPmpfdHJhbnNfbWF4IHx8CisgICAgICBnZXRfY29tbWl0X3RyYW5zX2xlbiAoY29tbWl0KSA8PSAwIAorICApIHsKKyAgICByZXR1cm4gMSA7CisgIH0KKyAgcmV0dXJuIDAgOworfQorLyogcmV0dXJucyAwIGlmIGl0IGRpZCBub3QgZmluZCBhIGRlc2NyaXB0aW9uIGJsb2NrICAKKyoqIHJldHVybnMgLTEgaWYgaXQgZm91bmQgYSBjb3JydXB0IGNvbW1pdCBibG9jaworKiogcmV0dXJucyAxIGlmIGJvdGggZGVzYyBhbmQgY29tbWl0IHdlcmUgdmFsaWQgCisqLworc3RhdGljIGludCBqb3VybmFsX3RyYW5zYWN0aW9uX2lzX3ZhbGlkKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRfYmgsIHVuc2lnbmVkIGxvbmcgKm9sZGVzdF9pbnZhbGlkX3RyYW5zX2lkLCB1bnNpZ25lZCBsb25nICpuZXdlc3RfbW91bnRfaWQpIHsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfZGVzYyAqZGVzYyA7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2NvbW1pdCAqY29tbWl0IDsKKyAgc3RydWN0IGJ1ZmZlcl9oZWFkICpjX2JoIDsKKyAgdW5zaWduZWQgbG9uZyBvZmZzZXQgOworCisgIGlmICghZF9iaCkKKyAgICAgIHJldHVybiAwIDsKKworICBkZXNjID0gKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Rlc2MgKilkX2JoLT5iX2RhdGEgOworICBpZiAoZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpID4gMCAmJiAhbWVtY21wKGdldF9qb3VybmFsX2Rlc2NfbWFnaWMgKGRfYmgpLCBKT1VSTkFMX0RFU0NfTUFHSUMsIDgpKSB7CisgICAgaWYgKG9sZGVzdF9pbnZhbGlkX3RyYW5zX2lkICYmICpvbGRlc3RfaW52YWxpZF90cmFuc19pZCAmJiBnZXRfZGVzY190cmFuc19pZChkZXNjKSA+ICpvbGRlc3RfaW52YWxpZF90cmFuc19pZCkgeworICAgICAgcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAiam91cm5hbC05ODY6IHRyYW5zYWN0aW9uICIKKwkgICAgICAgICAgICAgICJpcyB2YWxpZCByZXR1cm5pbmcgYmVjYXVzZSB0cmFuc19pZCAlZCBpcyBncmVhdGVyIHRoYW4gIgorCQkgICAgICAib2xkZXN0X2ludmFsaWQgJWx1IiwgZ2V0X2Rlc2NfdHJhbnNfaWQoZGVzYyksCisJCSAgICAgICAqb2xkZXN0X2ludmFsaWRfdHJhbnNfaWQpOworICAgICAgcmV0dXJuIDAgOworICAgIH0KKyAgICBpZiAobmV3ZXN0X21vdW50X2lkICYmICpuZXdlc3RfbW91bnRfaWQgPiBnZXRfZGVzY19tb3VudF9pZCAoZGVzYykpIHsKKyAgICAgIHJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgImpvdXJuYWwtMTA4NzogdHJhbnNhY3Rpb24gIgorICAgICAgICAgICAgICAgICAgICAgImlzIHZhbGlkIHJldHVybmluZyBiZWNhdXNlIG1vdW50X2lkICVkIGlzIGxlc3MgdGhhbiAiCisJCSAgICAgIm5ld2VzdF9tb3VudF9pZCAlbHUiLCBnZXRfZGVzY19tb3VudF9pZCAoZGVzYyksCisJCSAgICAgKm5ld2VzdF9tb3VudF9pZCkgOworICAgICAgcmV0dXJuIC0xIDsKKyAgICB9CisgICAgaWYgKCBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgPiBTQl9KT1VSTkFMKHBfc19zYiktPmpfdHJhbnNfbWF4ICkgeworICAgICAgcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsICJqb3VybmFsLTIwMTg6IEJhZCB0cmFuc2FjdGlvbiBsZW5ndGggJWQgZW5jb3VudGVyZWQsIGlnbm9yaW5nIHRyYW5zYWN0aW9uIiwgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpKTsKKyAgICAgIHJldHVybiAtMSA7CisgICAgfQorICAgIG9mZnNldCA9IGRfYmgtPmJfYmxvY2tuciAtIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpIDsKKworICAgIC8qIG9rLCB3ZSBoYXZlIGEgam91cm5hbCBkZXNjcmlwdGlvbiBibG9jaywgbGV0cyBzZWUgaWYgdGhlIHRyYW5zYWN0aW9uIHdhcyB2YWxpZCAqLworICAgIGNfYmggPSBqb3VybmFsX2JyZWFkKHBfc19zYiwgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKworCQkgKChvZmZzZXQgKyBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKyAxKSAlIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSkpIDsKKyAgICBpZiAoIWNfYmgpCisgICAgICByZXR1cm4gMCA7CisgICAgY29tbWl0ID0gKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2NvbW1pdCAqKWNfYmgtPmJfZGF0YSA7CisgICAgaWYgKGpvdXJuYWxfY29tcGFyZV9kZXNjX2NvbW1pdChwX3Nfc2IsIGRlc2MsIGNvbW1pdCkpIHsKKyAgICAgIHJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgCisgICAgICAgICAgICAgICAgICAgICAiam91cm5hbF90cmFuc2FjdGlvbl9pc192YWxpZCwgY29tbWl0IG9mZnNldCAlbGQgaGFkIGJhZCAiCisJCSAgICAgInRpbWUgJWQgb3IgbGVuZ3RoICVkIiwKKwkJICAgICBjX2JoLT5iX2Jsb2NrbnIgLSAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYiksCisJCSAgICAgZ2V0X2NvbW1pdF90cmFuc19pZCAoY29tbWl0KSwgCisJCSAgICAgZ2V0X2NvbW1pdF90cmFuc19sZW4oY29tbWl0KSk7CisgICAgICBicmVsc2UoY19iaCkgOworICAgICAgaWYgKG9sZGVzdF9pbnZhbGlkX3RyYW5zX2lkKSB7CisJKm9sZGVzdF9pbnZhbGlkX3RyYW5zX2lkID0gZ2V0X2Rlc2NfdHJhbnNfaWQoZGVzYykgOworCXJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgImpvdXJuYWwtMTAwNDogIgorCQkgICAgICAgInRyYW5zYWN0aW9uX2lzX3ZhbGlkIHNldHRpbmcgb2xkZXN0IGludmFsaWQgdHJhbnNfaWQgIgorCQkgICAgICAgInRvICVkIiwgZ2V0X2Rlc2NfdHJhbnNfaWQoZGVzYykpIDsKKyAgICAgIH0KKyAgICAgIHJldHVybiAtMTsgCisgICAgfQorICAgIGJyZWxzZShjX2JoKSA7CisgICAgcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAiam91cm5hbC0xMDA2OiBmb3VuZCB2YWxpZCAiCisgICAgICAgICAgICAgICAgICAgInRyYW5zYWN0aW9uIHN0YXJ0IG9mZnNldCAlbGx1LCBsZW4gJWQgaWQgJWQiLAorCQkgICBkX2JoLT5iX2Jsb2NrbnIgLSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSwgCisJCSAgIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSwgZ2V0X2Rlc2NfdHJhbnNfaWQoZGVzYykpIDsKKyAgICByZXR1cm4gMSA7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDAgOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGJyZWxzZV9hcnJheShzdHJ1Y3QgYnVmZmVyX2hlYWQgKipoZWFkcywgaW50IG51bSkgeworICBpbnQgaSA7CisgIGZvciAoaSA9IDAgOyBpIDwgbnVtIDsgaSsrKSB7CisgICAgYnJlbHNlKGhlYWRzW2ldKSA7CisgIH0KK30KKworLyoKKyoqIGdpdmVuIHRoZSBzdGFydCwgYW5kIHZhbHVlcyBmb3IgdGhlIG9sZGVzdCBhY2NlcHRhYmxlIHRyYW5zYWN0aW9ucywKKyoqIHRoaXMgZWl0aGVyIHJlYWRzIGluIGEgcmVwbGF5cyBhIHRyYW5zYWN0aW9uLCBvciByZXR1cm5zIGJlY2F1c2UgdGhlIHRyYW5zYWN0aW9uCisqKiBpcyBpbnZhbGlkLCBvciB0b28gb2xkLgorKi8KK3N0YXRpYyBpbnQgam91cm5hbF9yZWFkX3RyYW5zYWN0aW9uKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCB1bnNpZ25lZCBsb25nIGN1cl9kYmxvY2ssIHVuc2lnbmVkIGxvbmcgb2xkZXN0X3N0YXJ0LCAKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBvbGRlc3RfdHJhbnNfaWQsIHVuc2lnbmVkIGxvbmcgbmV3ZXN0X21vdW50X2lkKSB7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfZGVzYyAqZGVzYyA7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2NvbW1pdCAqY29tbWl0IDsKKyAgdW5zaWduZWQgbG9uZyB0cmFuc19pZCA9IDAgOworICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmNfYmggOworICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRfYmggOworICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipsb2dfYmxvY2tzID0gTlVMTCA7CisgIHN0cnVjdCBidWZmZXJfaGVhZCAqKnJlYWxfYmxvY2tzID0gTlVMTCA7CisgIHVuc2lnbmVkIGxvbmcgdHJhbnNfb2Zmc2V0IDsKKyAgaW50IGk7CisgIGludCB0cmFuc19oYWxmOworCisgIGRfYmggPSBqb3VybmFsX2JyZWFkKHBfc19zYiwgY3VyX2RibG9jaykgOworICBpZiAoIWRfYmgpCisgICAgcmV0dXJuIDEgOworICBkZXNjID0gKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Rlc2MgKilkX2JoLT5iX2RhdGEgOworICB0cmFuc19vZmZzZXQgPSBkX2JoLT5iX2Jsb2NrbnIgLSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSA7CisgIHJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgImpvdXJuYWwtMTAzNzogIgorICAgICAgICAgICAgICAgICAiam91cm5hbF9yZWFkX3RyYW5zYWN0aW9uLCBvZmZzZXQgJWxsdSwgbGVuICVkIG1vdW50X2lkICVkIiwKKwkJIGRfYmgtPmJfYmxvY2tuciAtIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpLCAKKwkJIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSwgZ2V0X2Rlc2NfbW91bnRfaWQoZGVzYykpIDsKKyAgaWYgKGdldF9kZXNjX3RyYW5zX2lkKGRlc2MpIDwgb2xkZXN0X3RyYW5zX2lkKSB7CisgICAgcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAiam91cm5hbC0xMDM5OiAiCisgICAgICAgICAgICAgICAgICAgImpvdXJuYWxfcmVhZF90cmFucyBza2lwcGluZyBiZWNhdXNlICVsdSBpcyB0b28gb2xkIiwKKwkJICAgY3VyX2RibG9jayAtIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpKSA7CisgICAgYnJlbHNlKGRfYmgpIDsKKyAgICByZXR1cm4gMSA7CisgIH0KKyAgaWYgKGdldF9kZXNjX21vdW50X2lkKGRlc2MpICE9IG5ld2VzdF9tb3VudF9pZCkgeworICAgIHJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgImpvdXJuYWwtMTE0NjogIgorICAgICAgICAgICAgICAgICAgICJqb3VybmFsX3JlYWRfdHJhbnMgc2tpcHBpbmcgYmVjYXVzZSAlZCBpcyAhPSAiCisJCSAgICJuZXdlc3RfbW91bnRfaWQgJWx1IiwgZ2V0X2Rlc2NfbW91bnRfaWQoZGVzYyksCisJCSAgICBuZXdlc3RfbW91bnRfaWQpIDsKKyAgICBicmVsc2UoZF9iaCkgOworICAgIHJldHVybiAxIDsKKyAgfQorICBjX2JoID0gam91cm5hbF9icmVhZChwX3Nfc2IsIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpICsKKwkJKCh0cmFuc19vZmZzZXQgKyBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKyAxKSAlIAorCQkgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKSkgOworICBpZiAoIWNfYmgpIHsKKyAgICBicmVsc2UoZF9iaCkgOworICAgIHJldHVybiAxIDsKKyAgfQorICBjb21taXQgPSAoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY29tbWl0ICopY19iaC0+Yl9kYXRhIDsKKyAgaWYgKGpvdXJuYWxfY29tcGFyZV9kZXNjX2NvbW1pdChwX3Nfc2IsIGRlc2MsIGNvbW1pdCkpIHsKKyAgICByZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsX3JlYWRfdHJhbnNhY3Rpb24sICIKKyAgICAgICAgICAgICAgICAgICAiY29tbWl0IG9mZnNldCAlbGx1IGhhZCBiYWQgdGltZSAlZCBvciBsZW5ndGggJWQiLAorCQkgICBjX2JoLT5iX2Jsb2NrbnIgLSAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYiksIAorCQkgICBnZXRfY29tbWl0X3RyYW5zX2lkKGNvbW1pdCksIGdldF9jb21taXRfdHJhbnNfbGVuKGNvbW1pdCkpOworICAgIGJyZWxzZShjX2JoKSA7CisgICAgYnJlbHNlKGRfYmgpIDsKKyAgICByZXR1cm4gMTsgCisgIH0KKyAgdHJhbnNfaWQgPSBnZXRfZGVzY190cmFuc19pZChkZXNjKSA7CisgIC8qIG5vdyB3ZSBrbm93IHdlJ3ZlIGdvdCBhIGdvb2QgdHJhbnNhY3Rpb24sIGFuZCBpdCB3YXMgaW5zaWRlIHRoZSB2YWxpZCB0aW1lIHJhbmdlcyAqLworICBsb2dfYmxvY2tzID0gcmVpc2VyZnNfa21hbGxvYyhnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKiBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBHRlBfTk9GUywgcF9zX3NiKSA7CisgIHJlYWxfYmxvY2tzID0gcmVpc2VyZnNfa21hbGxvYyhnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKiBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBHRlBfTk9GUywgcF9zX3NiKSA7CisgIGlmICghbG9nX2Jsb2NrcyAgfHwgIXJlYWxfYmxvY2tzKSB7CisgICAgYnJlbHNlKGNfYmgpIDsKKyAgICBicmVsc2UoZF9iaCkgOworICAgIHJlaXNlcmZzX2tmcmVlKGxvZ19ibG9ja3MsIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksIHBfc19zYikgOworICAgIHJlaXNlcmZzX2tmcmVlKHJlYWxfYmxvY2tzLCBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKiBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBwX3Nfc2IpIDsKKyAgICByZWlzZXJmc193YXJuaW5nKHBfc19zYiwgImpvdXJuYWwtMTE2OToga21hbGxvYyBmYWlsZWQsIHVuYWJsZSB0byBtb3VudCBGUyIpIDsKKyAgICByZXR1cm4gLTEgOworICB9CisgIC8qIGdldCBhbGwgdGhlIGJ1ZmZlciBoZWFkcyAqLworICB0cmFuc19oYWxmID0gam91cm5hbF90cmFuc19oYWxmIChwX3Nfc2ItPnNfYmxvY2tzaXplKSA7CisgIGZvcihpID0gMCA7IGkgPCBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgOyBpKyspIHsKKyAgICBsb2dfYmxvY2tzW2ldID0gIGpvdXJuYWxfZ2V0YmxrKHBfc19zYiwgIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpICsgKHRyYW5zX29mZnNldCArIDEgKyBpKSAlIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSk7CisgICAgaWYgKGkgPCB0cmFuc19oYWxmKSB7CisgICAgICByZWFsX2Jsb2Nrc1tpXSA9IHNiX2dldGJsayhwX3Nfc2IsIGxlMzJfdG9fY3B1KGRlc2MtPmpfcmVhbGJsb2NrW2ldKSkgOworICAgIH0gZWxzZSB7CisgICAgICByZWFsX2Jsb2Nrc1tpXSA9IHNiX2dldGJsayhwX3Nfc2IsIGxlMzJfdG9fY3B1KGNvbW1pdC0+al9yZWFsYmxvY2tbaSAtIHRyYW5zX2hhbGZdKSkgOworICAgIH0KKyAgICBpZiAoIHJlYWxfYmxvY2tzW2ldLT5iX2Jsb2NrbnIgPiBTQl9CTE9DS19DT1VOVChwX3Nfc2IpICkgeworICAgICAgcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsICJqb3VybmFsLTEyMDc6IFJFUExBWSBGQUlMVVJFIGZzY2sgcmVxdWlyZWQhIEJsb2NrIHRvIHJlcGxheSBpcyBvdXRzaWRlIG9mIGZpbGVzeXN0ZW0iKTsKKyAgICAgIGdvdG8gYWJvcnRfcmVwbGF5OworICAgIH0KKyAgICAvKiBtYWtlIHN1cmUgd2UgZG9uJ3QgdHJ5IHRvIHJlcGxheSBvbnRvIGxvZyBvciByZXNlcnZlZCBhcmVhICovCisgICAgaWYgKGlzX2Jsb2NrX2luX2xvZ19vcl9yZXNlcnZlZF9hcmVhKHBfc19zYiwgcmVhbF9ibG9ja3NbaV0tPmJfYmxvY2tucikpIHsKKyAgICAgIHJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLCAiam91cm5hbC0xMjA0OiBSRVBMQVkgRkFJTFVSRSBmc2NrIHJlcXVpcmVkISBUcnlpbmcgdG8gcmVwbGF5IG9udG8gYSBsb2cgYmxvY2siKSA7CithYm9ydF9yZXBsYXk6CisgICAgICBicmVsc2VfYXJyYXkobG9nX2Jsb2NrcywgaSkgOworICAgICAgYnJlbHNlX2FycmF5KHJlYWxfYmxvY2tzLCBpKSA7CisgICAgICBicmVsc2UoY19iaCkgOworICAgICAgYnJlbHNlKGRfYmgpIDsKKyAgICAgIHJlaXNlcmZzX2tmcmVlKGxvZ19ibG9ja3MsIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksIHBfc19zYikgOworICAgICAgcmVpc2VyZnNfa2ZyZWUocmVhbF9ibG9ja3MsIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksIHBfc19zYikgOworICAgICAgcmV0dXJuIC0xIDsKKyAgICB9CisgIH0KKyAgLyogcmVhZCBpbiB0aGUgbG9nIGJsb2NrcywgbWVtY3B5IHRvIHRoZSBjb3JyZXNwb25kaW5nIHJlYWwgYmxvY2sgKi8KKyAgbGxfcndfYmxvY2soUkVBRCwgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpLCBsb2dfYmxvY2tzKSA7CisgIGZvciAoaSA9IDAgOyBpIDwgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpIDsgaSsrKSB7CisgICAgd2FpdF9vbl9idWZmZXIobG9nX2Jsb2Nrc1tpXSkgOworICAgIGlmICghYnVmZmVyX3VwdG9kYXRlKGxvZ19ibG9ja3NbaV0pKSB7CisgICAgICByZWlzZXJmc193YXJuaW5nKHBfc19zYiwgImpvdXJuYWwtMTIxMjogUkVQTEFZIEZBSUxVUkUgZnNjayByZXF1aXJlZCEgYnVmZmVyIHdyaXRlIGZhaWxlZCIpIDsKKyAgICAgIGJyZWxzZV9hcnJheShsb2dfYmxvY2tzICsgaSwgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpIC0gaSkgOworICAgICAgYnJlbHNlX2FycmF5KHJlYWxfYmxvY2tzLCBnZXRfZGVzY190cmFuc19sZW4oZGVzYykpIDsKKyAgICAgIGJyZWxzZShjX2JoKSA7CisgICAgICBicmVsc2UoZF9iaCkgOworICAgICAgcmVpc2VyZnNfa2ZyZWUobG9nX2Jsb2NrcywgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICogc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgcF9zX3NiKSA7CisgICAgICByZWlzZXJmc19rZnJlZShyZWFsX2Jsb2NrcywgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICogc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgcF9zX3NiKSA7CisgICAgICByZXR1cm4gLTEgOworICAgIH0KKyAgICBtZW1jcHkocmVhbF9ibG9ja3NbaV0tPmJfZGF0YSwgbG9nX2Jsb2Nrc1tpXS0+Yl9kYXRhLCByZWFsX2Jsb2Nrc1tpXS0+Yl9zaXplKSA7CisgICAgc2V0X2J1ZmZlcl91cHRvZGF0ZShyZWFsX2Jsb2Nrc1tpXSkgOworICAgIGJyZWxzZShsb2dfYmxvY2tzW2ldKSA7CisgIH0KKyAgLyogZmx1c2ggb3V0IHRoZSByZWFsIGJsb2NrcyAqLworICBmb3IgKGkgPSAwIDsgaSA8IGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSA7IGkrKykgeworICAgIHNldF9idWZmZXJfZGlydHkocmVhbF9ibG9ja3NbaV0pIDsKKyAgICBsbF9yd19ibG9jayhXUklURSwgMSwgcmVhbF9ibG9ja3MgKyBpKSA7CisgIH0KKyAgZm9yIChpID0gMCA7IGkgPCBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgOyBpKyspIHsKKyAgICB3YWl0X29uX2J1ZmZlcihyZWFsX2Jsb2Nrc1tpXSkgOyAKKyAgICBpZiAoIWJ1ZmZlcl91cHRvZGF0ZShyZWFsX2Jsb2Nrc1tpXSkpIHsKKyAgICAgIHJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLCAiam91cm5hbC0xMjI2OiBSRVBMQVkgRkFJTFVSRSwgZnNjayByZXF1aXJlZCEgYnVmZmVyIHdyaXRlIGZhaWxlZCIpIDsKKyAgICAgIGJyZWxzZV9hcnJheShyZWFsX2Jsb2NrcyArIGksIGdldF9kZXNjX3RyYW5zX2xlbihkZXNjKSAtIGkpIDsKKyAgICAgIGJyZWxzZShjX2JoKSA7CisgICAgICBicmVsc2UoZF9iaCkgOworICAgICAgcmVpc2VyZnNfa2ZyZWUobG9nX2Jsb2NrcywgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICogc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgcF9zX3NiKSA7CisgICAgICByZWlzZXJmc19rZnJlZShyZWFsX2Jsb2NrcywgZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICogc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgcF9zX3NiKSA7CisgICAgICByZXR1cm4gLTEgOworICAgIH0KKyAgICBicmVsc2UocmVhbF9ibG9ja3NbaV0pIDsKKyAgfQorICBjdXJfZGJsb2NrID0gIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpICsgKCh0cmFuc19vZmZzZXQgKyBnZXRfZGVzY190cmFuc19sZW4oZGVzYykgKyAyKSAlIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSkgOworICByZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTEwOTU6IHNldHRpbmcgam91cm5hbCAiCisgICAgICAgICAgICAgICAgICJzdGFydCB0byBvZmZzZXQgJWxkIiwKKwkJIGN1cl9kYmxvY2sgLSAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikpIDsKKyAgCisgIC8qIGluaXQgc3RhcnRpbmcgdmFsdWVzIGZvciB0aGUgZmlyc3QgdHJhbnNhY3Rpb24sIGluIGNhc2UgdGhpcyBpcyB0aGUgbGFzdCB0cmFuc2FjdGlvbiB0byBiZSByZXBsYXllZC4gKi8KKyAgam91cm5hbC0+al9zdGFydCA9IGN1cl9kYmxvY2sgLSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSA7CisgIGpvdXJuYWwtPmpfbGFzdF9mbHVzaF90cmFuc19pZCA9IHRyYW5zX2lkIDsKKyAgam91cm5hbC0+al90cmFuc19pZCA9IHRyYW5zX2lkICsgMTsKKyAgYnJlbHNlKGNfYmgpIDsKKyAgYnJlbHNlKGRfYmgpIDsKKyAgcmVpc2VyZnNfa2ZyZWUobG9nX2Jsb2NrcywgbGUzMl90b19jcHUoZGVzYy0+al9sZW4pICogc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwgcF9zX3NiKSA7CisgIHJlaXNlcmZzX2tmcmVlKHJlYWxfYmxvY2tzLCBsZTMyX3RvX2NwdShkZXNjLT5qX2xlbikgKiBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLCBwX3Nfc2IpIDsKKyAgcmV0dXJuIDAgOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIGJsb2NrcyBzdGFydGluZyBmcm9tIGJsb2NrIGFuZCB0byBtYXhfYmxvY2sgb2YgYnVmc2l6ZQorICAgc2l6ZSAoYnV0IG5vIG1vcmUgdGhhbiBCVUZOUiBibG9ja3MgYXQgYSB0aW1lKS4gVGhpcyBwcm92ZWQgdG8gaW1wcm92ZQorICAgbW91bnRpbmcgc3BlZWQgb24gc2VsZi1yZWJ1aWxkaW5nIHJhaWQ1IGFycmF5cyBhdCBsZWFzdC4KKyAgIFJpZ2h0IG5vdyBpdCBpcyBvbmx5IHVzZWQgZnJvbSBqb3VybmFsIGNvZGUuIEJ1dCBsYXRlciB3ZSBtaWdodCB1c2UgaXQKKyAgIGZyb20gb3RoZXIgcGxhY2VzLgorICAgTm90ZTogRG8gbm90IHVzZSBqb3VybmFsX2dldGJsay9zYl9nZXRibGsgZnVuY3Rpb25zIGhlcmUhICovCitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICogcmVpc2VyZnNfYnJlYWRhIChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpkZXYsIGludCBibG9jaywgaW50IGJ1ZnNpemUsCisJCQkgICAgdW5zaWduZWQgaW50IG1heF9ibG9jaykKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaGxpc3RbQlVGTlJdOworCXVuc2lnbmVkIGludCBibG9ja3MgPSBCVUZOUjsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlpbnQgaSwgajsKKwkKKwliaCA9IF9fZ2V0YmxrIChkZXYsIGJsb2NrLCBidWZzaXplICk7CisJaWYgKGJ1ZmZlcl91cHRvZGF0ZSAoYmgpKQorCQlyZXR1cm4gKGJoKTsgICAKKwkJCisJaWYgKGJsb2NrICsgQlVGTlIgPiBtYXhfYmxvY2spIHsKKwkJYmxvY2tzID0gbWF4X2Jsb2NrIC0gYmxvY2s7CisJfQorCWJobGlzdFswXSA9IGJoOworCWogPSAxOworCWZvciAoaSA9IDE7IGkgPCBibG9ja3M7IGkrKykgeworCQliaCA9IF9fZ2V0YmxrIChkZXYsIGJsb2NrICsgaSwgYnVmc2l6ZSk7CisJCWlmIChidWZmZXJfdXB0b2RhdGUgKGJoKSkgeworCQkJYnJlbHNlIChiaCk7CisJCQlicmVhazsKKwkJfQorCQllbHNlIGJobGlzdFtqKytdID0gYmg7CisJfQorCWxsX3J3X2Jsb2NrIChSRUFELCBqLCBiaGxpc3QpOworCWZvcihpID0gMTsgaSA8IGo7IGkrKykgCisJCWJyZWxzZSAoYmhsaXN0W2ldKTsKKwliaCA9IGJobGlzdFswXTsKKwl3YWl0X29uX2J1ZmZlciAoYmgpOworCWlmIChidWZmZXJfdXB0b2RhdGUgKGJoKSkKKwkJcmV0dXJuIGJoOworCWJyZWxzZSAoYmgpOworCXJldHVybiBOVUxMOworfQorCisvKgorKiogcmVhZCBhbmQgcmVwbGF5IHRoZSBsb2cKKyoqIG9uIGEgY2xlYW4gdW5tb3VudCwgdGhlIGpvdXJuYWwgaGVhZGVyJ3MgbmV4dCB1bmZsdXNoZWQgcG9pbnRlciB3aWxsIGJlIHRvIGFuIGludmFsaWQKKyoqIHRyYW5zYWN0aW9uLiAgVGhpcyB0ZXN0cyB0aGF0IGJlZm9yZSBmaW5kaW5nIGFsbCB0aGUgdHJhbnNhY3Rpb25zIGluIHRoZSBsb2csIHdoaWNoIG1ha2VzIG5vcm1hbCBtb3VudCB0aW1lcyBmYXN0LgorKioKKyoqIEFmdGVyIGEgY3Jhc2gsIHRoaXMgc3RhcnRzIHdpdGggdGhlIG5leHQgdW5mbHVzaGVkIHRyYW5zYWN0aW9uLCBhbmQgcmVwbGF5cyB1bnRpbCBpdCBmaW5kcyBvbmUgdG9vIG9sZCwgb3IgaW52YWxpZC4KKyoqCisqKiBPbiBleGl0LCBpdCBzZXRzIHRoaW5ncyB1cCBzbyB0aGUgZmlyc3QgdHJhbnNhY3Rpb24gd2lsbCB3b3JrIGNvcnJlY3RseS4KKyovCitzdGF0aWMgaW50IGpvdXJuYWxfcmVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikgeworICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHBfc19zYik7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Rlc2MgKmRlc2MgOworICB1bnNpZ25lZCBsb25nIG9sZGVzdF90cmFuc19pZCA9IDA7CisgIHVuc2lnbmVkIGxvbmcgb2xkZXN0X2ludmFsaWRfdHJhbnNfaWQgPSAwIDsKKyAgdGltZV90IHN0YXJ0IDsKKyAgdW5zaWduZWQgbG9uZyBvbGRlc3Rfc3RhcnQgPSAwOworICB1bnNpZ25lZCBsb25nIGN1cl9kYmxvY2sgPSAwIDsKKyAgdW5zaWduZWQgbG9uZyBuZXdlc3RfbW91bnRfaWQgPSA5IDsKKyAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkX2JoIDsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfaGVhZGVyICpqaCA7CisgIGludCB2YWxpZF9qb3VybmFsX2hlYWRlciA9IDAgOworICBpbnQgcmVwbGF5X2NvdW50ID0gMCA7CisgIGludCBjb250aW51ZV9yZXBsYXkgPSAxIDsKKyAgaW50IHJldCA7CisgIGNoYXIgYltCREVWTkFNRV9TSVpFXTsKKworICBjdXJfZGJsb2NrID0gU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgOworICByZWlzZXJmc19pbmZvIChwX3Nfc2IsICJjaGVja2luZyB0cmFuc2FjdGlvbiBsb2cgKCVzKVxuIiwKKwkgYmRldm5hbWUoam91cm5hbC0+al9kZXZfYmQsIGIpKTsKKyAgc3RhcnQgPSBnZXRfc2Vjb25kcygpOworCisgIC8qIHN0ZXAgMSwgcmVhZCBpbiB0aGUgam91cm5hbCBoZWFkZXIgYmxvY2suICBDaGVjayB0aGUgdHJhbnNhY3Rpb24gaXQgc2F5cyAKKyAgKiogaXMgdGhlIGZpcnN0IHVuZmx1c2hlZCwgYW5kIGlmIHRoYXQgdHJhbnNhY3Rpb24gaXMgbm90IHZhbGlkLCAKKyAgKiogcmVwbGF5IGlzIGRvbmUKKyAgKi8KKyAgam91cm5hbC0+al9oZWFkZXJfYmggPSBqb3VybmFsX2JyZWFkKHBfc19zYiwKKwkJCQkJICAgU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKyAKKwkJCQkJICAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKTsKKyAgaWYgKCFqb3VybmFsLT5qX2hlYWRlcl9iaCkgeworICAgIHJldHVybiAxIDsKKyAgfQorICBqaCA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9oZWFkZXIgKikoam91cm5hbC0+al9oZWFkZXJfYmgtPmJfZGF0YSkgOworICBpZiAobGUzMl90b19jcHUoamgtPmpfZmlyc3RfdW5mbHVzaGVkX29mZnNldCkgPj0gMCAmJiAKKyAgICAgIGxlMzJfdG9fY3B1KGpoLT5qX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQpIDwgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpICYmIAorICAgICAgbGUzMl90b19jcHUoamgtPmpfbGFzdF9mbHVzaF90cmFuc19pZCkgPiAwKSB7CisgICAgb2xkZXN0X3N0YXJ0ID0gU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgbGUzMl90b19jcHUoamgtPmpfZmlyc3RfdW5mbHVzaGVkX29mZnNldCkgOworICAgIG9sZGVzdF90cmFuc19pZCA9IGxlMzJfdG9fY3B1KGpoLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQpICsgMTsKKyAgICBuZXdlc3RfbW91bnRfaWQgPSBsZTMyX3RvX2NwdShqaC0+al9tb3VudF9pZCk7CisgICAgcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAiam91cm5hbC0xMTUzOiBmb3VuZCBpbiAiCisgICAgICAgICAgICAgICAgICAgImhlYWRlcjogZmlyc3RfdW5mbHVzaGVkX29mZnNldCAlZCwgbGFzdF9mbHVzaGVkX3RyYW5zX2lkICIKKwkJICAgIiVsdSIsIGxlMzJfdG9fY3B1KGpoLT5qX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQpLAorCQkgICBsZTMyX3RvX2NwdShqaC0+al9sYXN0X2ZsdXNoX3RyYW5zX2lkKSkgOworICAgIHZhbGlkX2pvdXJuYWxfaGVhZGVyID0gMSA7CisKKyAgICAvKiBub3csIHdlIHRyeSB0byByZWFkIHRoZSBmaXJzdCB1bmZsdXNoZWQgb2Zmc2V0LiAgSWYgaXQgaXMgbm90IHZhbGlkLCAKKyAgICAqKiB0aGVyZSBpcyBub3RoaW5nIG1vcmUgd2UgY2FuIGRvLCBhbmQgaXQgbWFrZXMgbm8gc2Vuc2UgdG8gcmVhZCAKKyAgICAqKiB0aHJvdWdoIHRoZSB3aG9sZSBsb2cuCisgICAgKi8KKyAgICBkX2JoID0gam91cm5hbF9icmVhZChwX3Nfc2IsIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpICsgbGUzMl90b19jcHUoamgtPmpfZmlyc3RfdW5mbHVzaGVkX29mZnNldCkpIDsKKyAgICByZXQgPSBqb3VybmFsX3RyYW5zYWN0aW9uX2lzX3ZhbGlkKHBfc19zYiwgZF9iaCwgTlVMTCwgTlVMTCkgOworICAgIGlmICghcmV0KSB7CisgICAgICBjb250aW51ZV9yZXBsYXkgPSAwIDsKKyAgICB9CisgICAgYnJlbHNlKGRfYmgpIDsKKyAgICBnb3RvIHN0YXJ0X2xvZ19yZXBsYXk7CisgIH0KKworICBpZiAoY29udGludWVfcmVwbGF5ICYmIGJkZXZfcmVhZF9vbmx5KHBfc19zYi0+c19iZGV2KSkgeworICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwKKwkJICAgICAgImNsbS0yMDc2OiBkZXZpY2UgaXMgcmVhZG9ubHksIHVuYWJsZSB0byByZXBsYXkgbG9nIikgOworICAgIHJldHVybiAtMSA7CisgIH0KKworICAvKiBvaywgdGhlcmUgYXJlIHRyYW5zYWN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgcmVwbGF5ZWQuICBzdGFydCB3aXRoIHRoZSBmaXJzdCBsb2cgYmxvY2ssIGZpbmQKKyAgKiogYWxsIHRoZSB2YWxpZCB0cmFuc2FjdGlvbnMsIGFuZCBwaWNrIG91dCB0aGUgb2xkZXN0LgorICAqLworICB3aGlsZShjb250aW51ZV9yZXBsYXkgJiYgY3VyX2RibG9jayA8IChTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSkpIHsKKyAgICAvKiBOb3RlIHRoYXQgaXQgaXMgcmVxdWlyZWQgZm9yIGJsb2Nrc2l6ZSBvZiBwcmltYXJ5IGZzIGRldmljZSBhbmQgam91cm5hbAorICAgICAgIGRldmljZSB0byBiZSB0aGUgc2FtZSAqLworICAgIGRfYmggPSByZWlzZXJmc19icmVhZGEoam91cm5hbC0+al9kZXZfYmQsIGN1cl9kYmxvY2ssIHBfc19zYi0+c19ibG9ja3NpemUsCisJCQkgICBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSkgOworICAgIHJldCA9IGpvdXJuYWxfdHJhbnNhY3Rpb25faXNfdmFsaWQocF9zX3NiLCBkX2JoLCAmb2xkZXN0X2ludmFsaWRfdHJhbnNfaWQsICZuZXdlc3RfbW91bnRfaWQpIDsKKyAgICBpZiAocmV0ID09IDEpIHsKKyAgICAgIGRlc2MgPSAoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfZGVzYyAqKWRfYmgtPmJfZGF0YSA7CisgICAgICBpZiAob2xkZXN0X3N0YXJ0ID09IDApIHsgLyogaW5pdCBhbGwgb2xkZXN0XyB2YWx1ZXMgKi8KKyAgICAgICAgb2xkZXN0X3RyYW5zX2lkID0gZ2V0X2Rlc2NfdHJhbnNfaWQoZGVzYykgOworCW9sZGVzdF9zdGFydCA9IGRfYmgtPmJfYmxvY2tuciA7CisJbmV3ZXN0X21vdW50X2lkID0gZ2V0X2Rlc2NfbW91bnRfaWQoZGVzYykgOworCXJlaXNlcmZzX2RlYnVnKHBfc19zYiwgUkVJU0VSRlNfREVCVUdfQ09ERSwgImpvdXJuYWwtMTE3OTogU2V0dGluZyAiCisJICAgICAgICAgICAgICAgIm9sZGVzdF9zdGFydCB0byBvZmZzZXQgJWxsdSwgdHJhbnNfaWQgJWx1IiwKKwkJICAgICAgIG9sZGVzdF9zdGFydCAtIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpLCAKKwkJICAgICAgIG9sZGVzdF90cmFuc19pZCkgOworICAgICAgfSBlbHNlIGlmIChvbGRlc3RfdHJhbnNfaWQgPiBnZXRfZGVzY190cmFuc19pZChkZXNjKSkgeyAKKyAgICAgICAgLyogb25lIHdlIGp1c3QgcmVhZCB3YXMgb2xkZXIgKi8KKyAgICAgICAgb2xkZXN0X3RyYW5zX2lkID0gZ2V0X2Rlc2NfdHJhbnNfaWQoZGVzYykgOworCW9sZGVzdF9zdGFydCA9IGRfYmgtPmJfYmxvY2tuciA7CisJcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAiam91cm5hbC0xMTgwOiBSZXNldHRpbmcgIgorCSAgICAgICAgICAgICAgICJvbGRlc3Rfc3RhcnQgdG8gb2Zmc2V0ICVsdSwgdHJhbnNfaWQgJWx1IiwKKwkJCW9sZGVzdF9zdGFydCAtIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpLCAKKwkJCW9sZGVzdF90cmFuc19pZCkgOworICAgICAgfQorICAgICAgaWYgKG5ld2VzdF9tb3VudF9pZCA8IGdldF9kZXNjX21vdW50X2lkKGRlc2MpKSB7CisgICAgICAgIG5ld2VzdF9tb3VudF9pZCA9IGdldF9kZXNjX21vdW50X2lkKGRlc2MpIDsKKwlyZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTEyOTk6IFNldHRpbmcgIgorCSAgICAgICAgICAgICAgIm5ld2VzdF9tb3VudF9pZCB0byAlZCIsIGdldF9kZXNjX21vdW50X2lkKGRlc2MpKTsKKyAgICAgIH0KKyAgICAgIGN1cl9kYmxvY2sgKz0gZ2V0X2Rlc2NfdHJhbnNfbGVuKGRlc2MpICsgMiA7CisgICAgfSBlbHNlIHsKKyAgICAgIGN1cl9kYmxvY2srKyA7CisgICAgfQorICAgIGJyZWxzZShkX2JoKSA7CisgIH0KKworc3RhcnRfbG9nX3JlcGxheToKKyAgY3VyX2RibG9jayA9IG9sZGVzdF9zdGFydCA7CisgIGlmIChvbGRlc3RfdHJhbnNfaWQpICB7CisgICAgcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAiam91cm5hbC0xMjA2OiBTdGFydGluZyByZXBsYXkgIgorICAgICAgICAgICAgICAgICAgICJmcm9tIG9mZnNldCAlbGx1LCB0cmFuc19pZCAlbHUiLAorCQkgICBjdXJfZGJsb2NrIC0gU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYiksIAorCQkgICBvbGRlc3RfdHJhbnNfaWQpIDsKKworICB9CisgIHJlcGxheV9jb3VudCA9IDAgOworICB3aGlsZShjb250aW51ZV9yZXBsYXkgJiYgb2xkZXN0X3RyYW5zX2lkID4gMCkgeworICAgIHJldCA9IGpvdXJuYWxfcmVhZF90cmFuc2FjdGlvbihwX3Nfc2IsIGN1cl9kYmxvY2ssIG9sZGVzdF9zdGFydCwgb2xkZXN0X3RyYW5zX2lkLCBuZXdlc3RfbW91bnRfaWQpIDsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgcmV0dXJuIHJldCA7CisgICAgfSBlbHNlIGlmIChyZXQgIT0gMCkgeworICAgICAgYnJlYWsgOworICAgIH0KKyAgICBjdXJfZGJsb2NrID0gU0JfT05ESVNLX0pPVVJOQUxfMXN0X0JMT0NLKHBfc19zYikgKyBqb3VybmFsLT5qX3N0YXJ0IDsKKyAgICByZXBsYXlfY291bnQrKyA7CisgICBpZiAoY3VyX2RibG9jayA9PSBvbGRlc3Rfc3RhcnQpCisgICAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKG9sZGVzdF90cmFuc19pZCA9PSAwKSB7CisgICAgcmVpc2VyZnNfZGVidWcocF9zX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAiam91cm5hbC0xMjI1OiBObyB2YWxpZCAiCisgICAgICAgICAgICAgICAgICAgInRyYW5zYWN0aW9ucyBmb3VuZCIpIDsKKyAgfQorICAvKiBqX3N0YXJ0IGRvZXMgbm90IGdldCBzZXQgY29ycmVjdGx5IGlmIHdlIGRvbid0IHJlcGxheSBhbnkgdHJhbnNhY3Rpb25zLgorICAqKiBpZiB3ZSBoYWQgYSB2YWxpZCBqb3VybmFsX2hlYWRlciwgc2V0IGpfc3RhcnQgdG8gdGhlIGZpcnN0IHVuZmx1c2hlZCB0cmFuc2FjdGlvbiB2YWx1ZSwKKyAgKiogY29weSB0aGUgdHJhbnNfaWQgZnJvbSB0aGUgaGVhZGVyCisgICovCisgIGlmICh2YWxpZF9qb3VybmFsX2hlYWRlciAmJiByZXBsYXlfY291bnQgPT0gMCkgeyAKKyAgICBqb3VybmFsLT5qX3N0YXJ0ID0gbGUzMl90b19jcHUoamgtPmpfZmlyc3RfdW5mbHVzaGVkX29mZnNldCkgOworICAgIGpvdXJuYWwtPmpfdHJhbnNfaWQgPSBsZTMyX3RvX2NwdShqaC0+al9sYXN0X2ZsdXNoX3RyYW5zX2lkKSArIDE7CisgICAgam91cm5hbC0+al9sYXN0X2ZsdXNoX3RyYW5zX2lkID0gbGUzMl90b19jcHUoamgtPmpfbGFzdF9mbHVzaF90cmFuc19pZCkgOworICAgIGpvdXJuYWwtPmpfbW91bnRfaWQgPSBsZTMyX3RvX2NwdShqaC0+al9tb3VudF9pZCkgKyAxOworICB9IGVsc2UgeworICAgIGpvdXJuYWwtPmpfbW91bnRfaWQgPSBuZXdlc3RfbW91bnRfaWQgKyAxIDsKKyAgfQorICByZWlzZXJmc19kZWJ1ZyhwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJqb3VybmFsLTEyOTk6IFNldHRpbmcgIgorICAgICAgICAgICAgICAgICAibmV3ZXN0X21vdW50X2lkIHRvICVsdSIsIGpvdXJuYWwtPmpfbW91bnRfaWQpIDsKKyAgam91cm5hbC0+al9maXJzdF91bmZsdXNoZWRfb2Zmc2V0ID0gam91cm5hbC0+al9zdGFydCA7CisgIGlmIChyZXBsYXlfY291bnQgPiAwKSB7CisgICAgcmVpc2VyZnNfaW5mbyAocF9zX3NiLCAicmVwbGF5ZWQgJWQgdHJhbnNhY3Rpb25zIGluICVsdSBzZWNvbmRzXG4iLAorCQkgICByZXBsYXlfY291bnQsIGdldF9zZWNvbmRzKCkgLSBzdGFydCkgOworICB9CisgIGlmICghYmRldl9yZWFkX29ubHkocF9zX3NiLT5zX2JkZXYpICYmIAorICAgICAgIF91cGRhdGVfam91cm5hbF9oZWFkZXJfYmxvY2socF9zX3NiLCBqb3VybmFsLT5qX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb3VybmFsLT5qX2xhc3RfZmx1c2hfdHJhbnNfaWQpKQorICB7CisgICAgICAvKiByZXBsYXkgZmFpbGVkLCBjYWxsZXIgbXVzdCBjYWxsIGZyZWVfam91cm5hbF9yYW0gYW5kIGFib3J0CisgICAgICAqKiB0aGUgbW91bnQKKyAgICAgICovCisgICAgICByZXR1cm4gLTEgOworICB9CisgIHJldHVybiAwIDsKK30KKworc3RhdGljIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmFsbG9jX2pvdXJuYWxfbGlzdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCit7CisgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamw7CityZXRyeToKKyAgICBqbCA9IHJlaXNlcmZzX2ttYWxsb2Moc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QpLCBHRlBfTk9GUywgcyk7CisgICAgaWYgKCFqbCkgeworCXlpZWxkKCk7CisJZ290byByZXRyeTsKKyAgICB9CisgICAgbWVtc2V0KGpsLCAwLCBzaXplb2YoKmpsKSk7CisgICAgSU5JVF9MSVNUX0hFQUQoJmpsLT5qX2xpc3QpOworICAgIElOSVRfTElTVF9IRUFEKCZqbC0+al93b3JraW5nX2xpc3QpOworICAgIElOSVRfTElTVF9IRUFEKCZqbC0+al90YWlsX2JoX2xpc3QpOworICAgIElOSVRfTElTVF9IRUFEKCZqbC0+al9iaF9saXN0KTsKKyAgICBzZW1hX2luaXQoJmpsLT5qX2NvbW1pdF9sb2NrLCAxKTsKKyAgICBTQl9KT1VSTkFMKHMpLT5qX251bV9saXN0cysrOworICAgIGdldF9qb3VybmFsX2xpc3QoamwpOworICAgIHJldHVybiBqbDsKK30KKworc3RhdGljIHZvaWQgam91cm5hbF9saXN0X2luaXQoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IpIHsKKyAgICBTQl9KT1VSTkFMKHBfc19zYiktPmpfY3VycmVudF9qbCA9IGFsbG9jX2pvdXJuYWxfbGlzdChwX3Nfc2IpOworfQorCitzdGF0aWMgaW50IHJlbGVhc2Vfam91cm5hbF9kZXYoIHN0cnVjdCBzdXBlcl9ibG9jayAqc3VwZXIsCisJCQkJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgKQoreworICAgIGludCByZXN1bHQ7CisgICAgCisgICAgcmVzdWx0ID0gMDsKKworICAgIGlmKCBqb3VybmFsIC0+IGpfZGV2X2ZpbGUgIT0gTlVMTCApIHsKKwlyZXN1bHQgPSBmaWxwX2Nsb3NlKCBqb3VybmFsIC0+IGpfZGV2X2ZpbGUsIE5VTEwgKTsKKwlqb3VybmFsIC0+IGpfZGV2X2ZpbGUgPSBOVUxMOworCWpvdXJuYWwgLT4gal9kZXZfYmQgPSBOVUxMOworICAgIH0gZWxzZSBpZiggam91cm5hbCAtPiBqX2Rldl9iZCAhPSBOVUxMICkgeworCXJlc3VsdCA9IGJsa2Rldl9wdXQoIGpvdXJuYWwgLT4gal9kZXZfYmQgKTsKKwlqb3VybmFsIC0+IGpfZGV2X2JkID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiggcmVzdWx0ICE9IDAgKSB7CisJcmVpc2VyZnNfd2FybmluZyhzdXBlciwgInNoLTQ1NzogcmVsZWFzZV9qb3VybmFsX2RldjogQ2Fubm90IHJlbGVhc2Ugam91cm5hbCBkZXZpY2U6ICVpIiwgcmVzdWx0ICk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgam91cm5hbF9pbml0X2Rldiggc3RydWN0IHN1cGVyX2Jsb2NrICpzdXBlciwgCisJCQkgICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsLCAKKwkJCSAgICAgY29uc3QgY2hhciAqamRldl9uYW1lICkKK3sKKwlpbnQgcmVzdWx0OworCWRldl90IGpkZXY7CisJaW50IGJsa2Rldl9tb2RlID0gRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFOworCWNoYXIgYltCREVWTkFNRV9TSVpFXTsKKworCXJlc3VsdCA9IDA7CisKKwlqb3VybmFsIC0+IGpfZGV2X2JkID0gTlVMTDsKKwlqb3VybmFsIC0+IGpfZGV2X2ZpbGUgPSBOVUxMOworCWpkZXYgPSBTQl9PTkRJU0tfSk9VUk5BTF9ERVZJQ0UoIHN1cGVyICkgPworCQluZXdfZGVjb2RlX2RldihTQl9PTkRJU0tfSk9VUk5BTF9ERVZJQ0Uoc3VwZXIpKSA6IHN1cGVyLT5zX2RldjsJCisKKwlpZiAoYmRldl9yZWFkX29ubHkoc3VwZXItPnNfYmRldikpCisJICAgIGJsa2Rldl9tb2RlID0gRk1PREVfUkVBRDsKKworCS8qIHRoZXJlIGlzIG5vICJqZGV2IiBvcHRpb24gYW5kIGpvdXJuYWwgaXMgb24gc2VwYXJhdGUgZGV2aWNlICovCisJaWYoICggIWpkZXZfbmFtZSB8fCAhamRldl9uYW1lWyAwIF0gKSApIHsKKwkJam91cm5hbC0+al9kZXZfYmQgPSBvcGVuX2J5X2Rldm51bShqZGV2LCBibGtkZXZfbW9kZSk7CisJCWlmIChJU19FUlIoam91cm5hbC0+al9kZXZfYmQpKSB7CisJCQlyZXN1bHQgPSBQVFJfRVJSKGpvdXJuYWwtPmpfZGV2X2JkKTsKKwkJCWpvdXJuYWwtPmpfZGV2X2JkID0gTlVMTDsKKwkJCXJlaXNlcmZzX3dhcm5pbmcgKHN1cGVyLCAic2gtNDU4OiBqb3VybmFsX2luaXRfZGV2OiAiCisJCQkJCSAgImNhbm5vdCBpbml0IGpvdXJuYWwgZGV2aWNlICclcyc6ICVpIiwKKwkJCQkJICBfX2JkZXZuYW1lKGpkZXYsIGIpLCByZXN1bHQgKTsKKwkJCXJldHVybiByZXN1bHQ7CisJCX0gZWxzZSBpZiAoamRldiAhPSBzdXBlci0+c19kZXYpCisJCQlzZXRfYmxvY2tzaXplKGpvdXJuYWwtPmpfZGV2X2JkLCBzdXBlci0+c19ibG9ja3NpemUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlqb3VybmFsIC0+IGpfZGV2X2ZpbGUgPSBmaWxwX29wZW4oIGpkZXZfbmFtZSwgMCwgMCApOworCWlmKCAhSVNfRVJSKCBqb3VybmFsIC0+IGpfZGV2X2ZpbGUgKSApIHsKKwkJc3RydWN0IGlub2RlICpqZGV2X2lub2RlID0gam91cm5hbC0+al9kZXZfZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OworCQlpZiggIVNfSVNCTEsoIGpkZXZfaW5vZGUgLT4gaV9tb2RlICkgKSB7CisJCQlyZWlzZXJmc193YXJuaW5nICAoc3VwZXIsICJqb3VybmFsX2luaXRfZGV2OiAnJXMnIGlzICIKKwkJCQkJICAgIm5vdCBhIGJsb2NrIGRldmljZSIsIGpkZXZfbmFtZSApOworCQkJcmVzdWx0ID0gLUVOT1RCTEs7CisJCX0gZWxzZSAgeworCQkJLyogb2sgKi8KKwkJCWpvdXJuYWwtPmpfZGV2X2JkID0gSV9CREVWKGpkZXZfaW5vZGUpOworCQkJc2V0X2Jsb2Nrc2l6ZShqb3VybmFsLT5qX2Rldl9iZCwgc3VwZXItPnNfYmxvY2tzaXplKTsKKwkJfQorCX0gZWxzZSB7CisJCXJlc3VsdCA9IFBUUl9FUlIoIGpvdXJuYWwgLT4gal9kZXZfZmlsZSApOworCQlqb3VybmFsIC0+IGpfZGV2X2ZpbGUgPSBOVUxMOworCQlyZWlzZXJmc193YXJuaW5nIChzdXBlciwKKwkJCQkgICJqb3VybmFsX2luaXRfZGV2OiBDYW5ub3Qgb3BlbiAnJXMnOiAlaSIsCisJCQkJICBqZGV2X25hbWUsIHJlc3VsdCApOworCX0KKwlpZiggcmVzdWx0ICE9IDAgKSB7CisJCXJlbGVhc2Vfam91cm5hbF9kZXYoIHN1cGVyLCBqb3VybmFsICk7CisJfQorCXJlaXNlcmZzX2luZm8oc3VwZXIsICJqb3VybmFsX2luaXRfZGV2OiBqb3VybmFsIGRldmljZTogJXNcbiIsCisJCWJkZXZuYW1lKGpvdXJuYWwtPmpfZGV2X2JkLCBiKSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyoqIG11c3QgYmUgY2FsbGVkIG9uY2Ugb24gZnMgbW91bnQuICBjYWxscyBqb3VybmFsX3JlYWQgZm9yIHlvdQorKi8KK2ludCBqb3VybmFsX2luaXQoc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIGNvbnN0IGNoYXIgKiBqX2Rldl9uYW1lLCBpbnQgb2xkX2Zvcm1hdCwgdW5zaWduZWQgaW50IGNvbW1pdF9tYXhfYWdlKSB7CisgICAgaW50IG51bV9jbm9kZXMgPSBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikgKiAyIDsKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoamg7CisgICAgc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICogcnM7CisgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfaGVhZGVyICpqaDsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbDsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbDsKKyAgICBjaGFyIGJbQkRFVk5BTUVfU0laRV07CisKKyAgICBqb3VybmFsID0gU0JfSk9VUk5BTChwX3Nfc2IpID0gdm1hbGxvYyhzaXplb2YgKHN0cnVjdCByZWlzZXJmc19qb3VybmFsKSkgOworICAgIGlmICgham91cm5hbCkgeworCXJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgImpvdXJuYWwtMTI1NjogdW5hYmxlIHRvIGdldCBtZW1vcnkgZm9yIGpvdXJuYWwgc3RydWN0dXJlIikgOworCXJldHVybiAxIDsKKyAgICB9CisgICAgbWVtc2V0KGpvdXJuYWwsIDAsIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCkpIDsKKyAgICBJTklUX0xJU1RfSEVBRCgmam91cm5hbC0+al9iaXRtYXBfbm9kZXMpIDsKKyAgICBJTklUX0xJU1RfSEVBRCAoJmpvdXJuYWwtPmpfcHJlYWxsb2NfbGlzdCk7CisgICAgSU5JVF9MSVNUX0hFQUQoJmpvdXJuYWwtPmpfd29ya2luZ19saXN0KTsKKyAgICBJTklUX0xJU1RfSEVBRCgmam91cm5hbC0+al9qb3VybmFsX2xpc3QpOworICAgIGpvdXJuYWwtPmpfcGVyc2lzdGVudF90cmFucyA9IDA7CisgICAgaWYgKHJlaXNlcmZzX2FsbG9jYXRlX2xpc3RfYml0bWFwcyhwX3Nfc2IsCisJCQkJICAgICAgIGpvdXJuYWwtPmpfbGlzdF9iaXRtYXAsCisgCQkJCSAgICAgICBTQl9CTUFQX05SKHBfc19zYikpKQorCWdvdG8gZnJlZV9hbmRfcmV0dXJuIDsKKyAgICBhbGxvY2F0ZV9iaXRtYXBfbm9kZXMocF9zX3NiKSA7CisKKyAgICAvKiByZXNlcnZlZCBmb3Igam91cm5hbCBhcmVhIHN1cHBvcnQgKi8KKyAgICBTQl9KT1VSTkFMXzFzdF9SRVNFUlZFRF9CTE9DSyhwX3Nfc2IpID0gKG9sZF9mb3JtYXQgPworCQkJCQkgICAgIFJFSVNFUkZTX09MRF9ESVNLX09GRlNFVF9JTl9CWVRFUyAvIHBfc19zYi0+c19ibG9ja3NpemUgKworCQkJCQkgICAgIFNCX0JNQVBfTlIocF9zX3NiKSArIDEgOgorCQkJCQkgICAgIFJFSVNFUkZTX0RJU0tfT0ZGU0VUX0lOX0JZVEVTIC8gcF9zX3NiLT5zX2Jsb2Nrc2l6ZSArIDIpOyAKKyAgICAKKyAgICAvKiBTYW5pdHkgY2hlY2sgdG8gc2VlIGlzIHRoZSBzdGFuZGFyZCBqb3VybmFsIGZpdHRpbmcgd2l0aGluZyBmaXJzdCBiaXRtYXAKKyAgICAgICAoYWN0dWFsIGZvciBzbWFsbCBibG9ja3NpemVzKSAqLworICAgIGlmICggIVNCX09ORElTS19KT1VSTkFMX0RFVklDRSggcF9zX3NiICkgJiYKKyAgICAgICAgIChTQl9KT1VSTkFMXzFzdF9SRVNFUlZFRF9CTE9DSyhwX3Nfc2IpICsgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpID4gcF9zX3NiLT5zX2Jsb2Nrc2l6ZSAqIDgpICkgeworCXJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgImpvdXJuYWwtMTM5Mzogam91cm5hbCBkb2VzIG5vdCBmaXQgZm9yIGFyZWEgIgorCQkJICAiYWRkcmVzc2VkIGJ5IGZpcnN0IG9mIGJpdG1hcCBibG9ja3MuIEl0IHN0YXJ0cyBhdCAiCisJCQkgICIldSBhbmQgaXRzIHNpemUgaXMgJXUuIEJsb2NrIHNpemUgJWxkIiwKKwkJCSAgU0JfSk9VUk5BTF8xc3RfUkVTRVJWRURfQkxPQ0socF9zX3NiKSwKKwkJCSAgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpLCBwX3Nfc2ItPnNfYmxvY2tzaXplKTsKKwlnb3RvIGZyZWVfYW5kX3JldHVybjsKKyAgICB9CisKKyAgICBpZiggam91cm5hbF9pbml0X2RldiggcF9zX3NiLCBqb3VybmFsLCBqX2Rldl9uYW1lICkgIT0gMCApIHsKKyAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgInNoLTQ2MjogdW5hYmxlIHRvIGluaXRpYWxpemUgam9ybmFsIGRldmljZSIpOworICAgICAgZ290byBmcmVlX2FuZF9yZXR1cm47CisgICAgfQorCisgICAgIHJzID0gU0JfRElTS19TVVBFUl9CTE9DSyhwX3Nfc2IpOworICAgICAKKyAgICAgLyogcmVhZCBqb3VybmFsIGhlYWRlciAqLworICAgICBiaGpoID0gam91cm5hbF9icmVhZChwX3Nfc2IsCisJCSAgIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpICsgU0JfT05ESVNLX0pPVVJOQUxfU0laRShwX3Nfc2IpKTsKKyAgICAgaWYgKCFiaGpoKSB7CisJIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgInNoLTQ1OTogdW5hYmxlIHRvIHJlYWQgam91cm5hbCBoZWFkZXIiKTsKKwkgZ290byBmcmVlX2FuZF9yZXR1cm47CisgICAgIH0KKyAgICAgamggPSAoc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfaGVhZGVyICopKGJoamgtPmJfZGF0YSk7CisgICAgIAorICAgICAvKiBtYWtlIHN1cmUgdGhhdCBqb3VybmFsIG1hdGNoZXMgdG8gdGhlIHN1cGVyIGJsb2NrICovCisgICAgIGlmIChpc19yZWlzZXJmc19qcihycykgJiYgKGpoLT5qaF9qb3VybmFsLmpwX2pvdXJuYWxfbWFnaWMgIT0gc2JfanBfam91cm5hbF9tYWdpYyhycykpKSB7CisJIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgInNoLTQ2MDogam91cm5hbCBoZWFkZXIgbWFnaWMgJXggIgorCQkJICAgIihkZXZpY2UgJXMpIGRvZXMgbm90IG1hdGNoIHRvIG1hZ2ljIGZvdW5kIGluIHN1cGVyICIKKwkJCSAgICJibG9jayAleCIsCisJCQkgICBqaC0+amhfam91cm5hbC5qcF9qb3VybmFsX21hZ2ljLAorCQkJICAgYmRldm5hbWUoIGpvdXJuYWwtPmpfZGV2X2JkLCBiKSwKKwkJCSAgIHNiX2pwX2pvdXJuYWxfbWFnaWMocnMpKTsKKwkgYnJlbHNlIChiaGpoKTsKKwkgZ290byBmcmVlX2FuZF9yZXR1cm47CisgIH0KKyAgICAgCisgIGpvdXJuYWwtPmpfdHJhbnNfbWF4ICAgICAgPSBsZTMyX3RvX2NwdSAoamgtPmpoX2pvdXJuYWwuanBfam91cm5hbF90cmFuc19tYXgpOworICBqb3VybmFsLT5qX21heF9iYXRjaCAgICAgID0gbGUzMl90b19jcHUgKGpoLT5qaF9qb3VybmFsLmpwX2pvdXJuYWxfbWF4X2JhdGNoKTsKKyAgam91cm5hbC0+al9tYXhfY29tbWl0X2FnZSA9IGxlMzJfdG9fY3B1IChqaC0+amhfam91cm5hbC5qcF9qb3VybmFsX21heF9jb21taXRfYWdlKTsKKyAgam91cm5hbC0+al9tYXhfdHJhbnNfYWdlID0gSk9VUk5BTF9NQVhfVFJBTlNfQUdFOworCisgIGlmIChqb3VybmFsLT5qX3RyYW5zX21heCkgeworICAgIC8qIG1ha2Ugc3VyZSB0aGVzZSBwYXJhbWV0ZXJzIGFyZSBhdmFpbGFibGUsIGFzc2lnbiBpdCBpZiB0aGV5IGFyZSBub3QgKi8KKyAgICBfX3UzMiBpbml0aWFsID0gam91cm5hbC0+al90cmFuc19tYXg7CisgICAgX191MzIgcmF0aW8gPSAxOworICAgIAorICAgIGlmIChwX3Nfc2ItPnNfYmxvY2tzaXplIDwgNDA5NikKKyAgICAgIHJhdGlvID0gNDA5NiAvIHBfc19zYi0+c19ibG9ja3NpemU7CisgICAgCisgICAgaWYgKFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKS9qb3VybmFsLT5qX3RyYW5zX21heCA8IEpPVVJOQUxfTUlOX1JBVElPKQorICAgICAgam91cm5hbC0+al90cmFuc19tYXggPSBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikgLyBKT1VSTkFMX01JTl9SQVRJTzsKKyAgICBpZiAoam91cm5hbC0+al90cmFuc19tYXggPiBKT1VSTkFMX1RSQU5TX01BWF9ERUZBVUxUIC8gcmF0aW8pCisgICAgICBqb3VybmFsLT5qX3RyYW5zX21heCA9IEpPVVJOQUxfVFJBTlNfTUFYX0RFRkFVTFQgLyByYXRpbzsKKyAgICBpZiAoam91cm5hbC0+al90cmFuc19tYXggPCBKT1VSTkFMX1RSQU5TX01JTl9ERUZBVUxUIC8gcmF0aW8pCisgICAgICBqb3VybmFsLT5qX3RyYW5zX21heCA9IEpPVVJOQUxfVFJBTlNfTUlOX0RFRkFVTFQgLyByYXRpbzsKKyAgICAKKyAgICBpZiAoam91cm5hbC0+al90cmFuc19tYXggIT0gaW5pdGlhbCkKKyAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgInNoLTQ2MTogam91cm5hbF9pbml0OiB3cm9uZyB0cmFuc2FjdGlvbiBtYXggc2l6ZSAoJXUpLiBDaGFuZ2VkIHRvICV1IiwKKwkgICAgICBpbml0aWFsLCBqb3VybmFsLT5qX3RyYW5zX21heCk7CisKKyAgICBqb3VybmFsLT5qX21heF9iYXRjaCA9IGpvdXJuYWwtPmpfdHJhbnNfbWF4KgorICAgICAgSk9VUk5BTF9NQVhfQkFUQ0hfREVGQVVMVC9KT1VSTkFMX1RSQU5TX01BWF9ERUZBVUxUOworICB9ICAKKyAgCisgIGlmICgham91cm5hbC0+al90cmFuc19tYXgpIHsKKyAgICAvKndlIGhhdmUgdGhlIGZpbGUgc3lzdGVtIHdhcyBjcmVhdGVkIGJ5IG9sZCB2ZXJzaW9uIG9mIG1rcmVpc2VyZnMgCisgICAgICBzbyB0aGlzIGZpZWxkIGNvbnRhaW5zIHplcm8gdmFsdWUgKi8KKyAgICBqb3VybmFsLT5qX3RyYW5zX21heCAgICAgID0gSk9VUk5BTF9UUkFOU19NQVhfREVGQVVMVCA7CisgICAgam91cm5hbC0+al9tYXhfYmF0Y2ggICAgICA9IEpPVVJOQUxfTUFYX0JBVENIX0RFRkFVTFQgOworICAgIGpvdXJuYWwtPmpfbWF4X2NvbW1pdF9hZ2UgPSBKT1VSTkFMX01BWF9DT01NSVRfQUdFIDsKKyAgICAKKyAgICAvKiBmb3IgYmxvY2tzaXplID49IDQwOTYgLSBtYXggdHJhbnNhY3Rpb24gc2l6ZSBpcyAxMDI0LiBGb3IgYmxvY2sgc2l6ZSA8IDQwOTYKKyAgICAgICB0cmFucyBtYXggc2l6ZSBpcyBkZWNyZWFzZWQgcHJvcG9ydGlvbmFsbHkgKi8KKyAgICBpZiAocF9zX3NiLT5zX2Jsb2Nrc2l6ZSA8IDQwOTYpIHsKKyAgICAgIGpvdXJuYWwtPmpfdHJhbnNfbWF4IC89ICg0MDk2IC8gcF9zX3NiLT5zX2Jsb2Nrc2l6ZSkgOworICAgICAgam91cm5hbC0+al9tYXhfYmF0Y2ggPSAoam91cm5hbC0+al90cmFuc19tYXgpICogOSAvIDEwIDsKKyAgICB9CisgIH0KKworICBqb3VybmFsLT5qX2RlZmF1bHRfbWF4X2NvbW1pdF9hZ2UgPSBqb3VybmFsLT5qX21heF9jb21taXRfYWdlOworCisgIGlmIChjb21taXRfbWF4X2FnZSAhPSAwKSB7CisgICAgICBqb3VybmFsLT5qX21heF9jb21taXRfYWdlID0gY29tbWl0X21heF9hZ2U7CisgICAgICBqb3VybmFsLT5qX21heF90cmFuc19hZ2UgPSBjb21taXRfbWF4X2FnZTsKKyAgfQorCisgIHJlaXNlcmZzX2luZm8gKHBfc19zYiwgImpvdXJuYWwgcGFyYW1zOiBkZXZpY2UgJXMsIHNpemUgJXUsICIKKwkJICJqb3VybmFsIGZpcnN0IGJsb2NrICV1LCBtYXggdHJhbnMgbGVuICV1LCBtYXggYmF0Y2ggJXUsICIKKwkJICJtYXggY29tbWl0IGFnZSAldSwgbWF4IHRyYW5zIGFnZSAldVxuIiwKKwkJIGJkZXZuYW1lKCBqb3VybmFsLT5qX2Rldl9iZCwgYiksCisJCSBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYiksCisJCSBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSwKKwkJIGpvdXJuYWwtPmpfdHJhbnNfbWF4LAorCQkgam91cm5hbC0+al9tYXhfYmF0Y2gsCisJCSBqb3VybmFsLT5qX21heF9jb21taXRfYWdlLAorCQkgam91cm5hbC0+al9tYXhfdHJhbnNfYWdlKTsKKworICBicmVsc2UgKGJoamgpOworICAgICAKKyAgam91cm5hbC0+al9saXN0X2JpdG1hcF9pbmRleCA9IDAgOworICBqb3VybmFsX2xpc3RfaW5pdChwX3Nfc2IpIDsKKworICBtZW1zZXQoam91cm5hbC0+al9saXN0X2hhc2hfdGFibGUsIDAsIEpPVVJOQUxfSEFTSF9TSVpFICogc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICopKSA7CisKKyAgSU5JVF9MSVNUX0hFQUQoJmpvdXJuYWwtPmpfZGlydHlfYnVmZmVycykgOworICBzcGluX2xvY2tfaW5pdCgmam91cm5hbC0+al9kaXJ0eV9idWZmZXJzX2xvY2spIDsKKworICBqb3VybmFsLT5qX3N0YXJ0ID0gMCA7CisgIGpvdXJuYWwtPmpfbGVuID0gMCA7CisgIGpvdXJuYWwtPmpfbGVuX2FsbG9jID0gMCA7CisgIGF0b21pY19zZXQoJihqb3VybmFsLT5qX3djb3VudCksIDApIDsKKyAgYXRvbWljX3NldCgmKGpvdXJuYWwtPmpfYXN5bmNfdGhyb3R0bGUpLCAwKSA7CisgIGpvdXJuYWwtPmpfYmNvdW50ID0gMCA7CisgIGpvdXJuYWwtPmpfdHJhbnNfc3RhcnRfdGltZSA9IDAgOworICBqb3VybmFsLT5qX2xhc3QgPSBOVUxMIDsKKyAgam91cm5hbC0+al9maXJzdCA9IE5VTEwgOworICBpbml0X3dhaXRxdWV1ZV9oZWFkKCYoam91cm5hbC0+al9qb2luX3dhaXQpKSA7CisgIHNlbWFfaW5pdCgmam91cm5hbC0+al9sb2NrLCAxKTsKKyAgc2VtYV9pbml0KCZqb3VybmFsLT5qX2ZsdXNoX3NlbSwgMSk7CisKKyAgam91cm5hbC0+al90cmFuc19pZCA9IDEwIDsKKyAgam91cm5hbC0+al9tb3VudF9pZCA9IDEwIDsKKyAgam91cm5hbC0+al9zdGF0ZSA9IDAgOworICBhdG9taWNfc2V0KCYoam91cm5hbC0+al9qbG9jayksIDApIDsKKyAgam91cm5hbC0+al9jbm9kZV9mcmVlX2xpc3QgPSBhbGxvY2F0ZV9jbm9kZXMobnVtX2Nub2RlcykgOworICBqb3VybmFsLT5qX2Nub2RlX2ZyZWVfb3JpZyA9IGpvdXJuYWwtPmpfY25vZGVfZnJlZV9saXN0IDsKKyAgam91cm5hbC0+al9jbm9kZV9mcmVlID0gam91cm5hbC0+al9jbm9kZV9mcmVlX2xpc3QgPyBudW1fY25vZGVzIDogMCA7CisgIGpvdXJuYWwtPmpfY25vZGVfdXNlZCA9IDAgOworICBqb3VybmFsLT5qX211c3Rfd2FpdCA9IDAgOworCisgIGluaXRfam91cm5hbF9oYXNoKHBfc19zYikgOworICBqbCA9IGpvdXJuYWwtPmpfY3VycmVudF9qbDsKKyAgamwtPmpfbGlzdF9iaXRtYXAgPSBnZXRfbGlzdF9iaXRtYXAocF9zX3NiLCBqbCk7CisgIGlmICghamwtPmpfbGlzdF9iaXRtYXApIHsKKyAgICByZWlzZXJmc193YXJuaW5nKHBfc19zYiwgImpvdXJuYWwtMjAwNSwgZ2V0X2xpc3RfYml0bWFwIGZhaWxlZCBmb3Igam91cm5hbCBsaXN0IDAiKSA7CisgICAgZ290byBmcmVlX2FuZF9yZXR1cm47CisgIH0KKyAgaWYgKGpvdXJuYWxfcmVhZChwX3Nfc2IpIDwgMCkgeworICAgIHJlaXNlcmZzX3dhcm5pbmcocF9zX3NiLCAiUmVwbGF5IEZhaWx1cmUsIHVuYWJsZSB0byBtb3VudCIpIDsKKyAgICBnb3RvIGZyZWVfYW5kX3JldHVybjsKKyAgfQorCisgIHJlaXNlcmZzX21vdW50ZWRfZnNfY291bnQrKyA7CisgIGlmIChyZWlzZXJmc19tb3VudGVkX2ZzX2NvdW50IDw9IDEpCisgICAgY29tbWl0X3dxID0gY3JlYXRlX3dvcmtxdWV1ZSgicmVpc2VyZnMiKTsKKworICBJTklUX1dPUksoJmpvdXJuYWwtPmpfd29yaywgZmx1c2hfYXN5bmNfY29tbWl0cywgcF9zX3NiKTsKKyAgcmV0dXJuIDAgOworZnJlZV9hbmRfcmV0dXJuOgorICBmcmVlX2pvdXJuYWxfcmFtKHBfc19zYik7CisgIHJldHVybiAxOworfQorCisvKgorKiogdGVzdCBmb3IgYSBwb2xpdGUgZW5kIG9mIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiAgVXNlZCBieSBmaWxlX3dyaXRlLCBhbmQgc2hvdWxkCisqKiBiZSB1c2VkIGJ5IGRlbGV0ZSB0byBtYWtlIHN1cmUgdGhleSBkb24ndCB3cml0ZSBtb3JlIHRoYW4gY2FuIGZpdCBpbnNpZGUgYSBzaW5nbGUKKyoqIHRyYW5zYWN0aW9uCisqLworaW50IGpvdXJuYWxfdHJhbnNhY3Rpb25fc2hvdWxkX2VuZChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgaW50IG5ld19hbGxvYykgeworICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHRoLT50X3N1cGVyKTsKKyAgdGltZV90IG5vdyA9IGdldF9zZWNvbmRzKCkgOworICAvKiBjYW5ub3QgcmVzdGFydCB3aGlsZSBuZXN0ZWQgKi8KKyAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworICBpZiAodGgtPnRfcmVmY291bnQgPiAxKQorICAgIHJldHVybiAwIDsKKyAgaWYgKCBqb3VybmFsLT5qX211c3Rfd2FpdCA+IDAgfHwKKyAgICAgICAoam91cm5hbC0+al9sZW5fYWxsb2MgKyBuZXdfYWxsb2MpID49IGpvdXJuYWwtPmpfbWF4X2JhdGNoIHx8CisgICAgICAgYXRvbWljX3JlYWQoJihqb3VybmFsLT5qX2psb2NrKSkgfHwKKyAgICAgIChub3cgLSBqb3VybmFsLT5qX3RyYW5zX3N0YXJ0X3RpbWUpID4gam91cm5hbC0+al9tYXhfdHJhbnNfYWdlIHx8CisgICAgICAgam91cm5hbC0+al9jbm9kZV9mcmVlIDwgKGpvdXJuYWwtPmpfdHJhbnNfbWF4ICogMykpIHsKKyAgICByZXR1cm4gMSA7CisgIH0KKyAgcmV0dXJuIDAgOworfQorCisvKiB0aGlzIG11c3QgYmUgY2FsbGVkIGluc2lkZSBhIHRyYW5zYWN0aW9uLCBhbmQgcmVxdWlyZXMgdGhlIAorKioga2VybmVsX2xvY2sgdG8gYmUgaGVsZAorKi8KK3ZvaWQgcmVpc2VyZnNfYmxvY2tfd3JpdGVzKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoKSB7CisgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMICh0aC0+dF9zdXBlcik7CisgICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworICAgIGpvdXJuYWwtPmpfbXVzdF93YWl0ID0gMSA7CisgICAgc2V0X2JpdChKX1dSSVRFUlNfQkxPQ0tFRCwgJmpvdXJuYWwtPmpfc3RhdGUpIDsKKyAgICByZXR1cm4gOworfQorCisvKiB0aGlzIG11c3QgYmUgY2FsbGVkIHdpdGhvdXQgYSB0cmFuc2FjdGlvbiBzdGFydGVkLCBhbmQgZG9lcyBub3QKKyoqIHJlcXVpcmUgQktMCisqLwordm9pZCByZWlzZXJmc19hbGxvd193cml0ZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzKSB7CisgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChzKTsKKyAgICBjbGVhcl9iaXQoSl9XUklURVJTX0JMT0NLRUQsICZqb3VybmFsLT5qX3N0YXRlKSA7CisgICAgd2FrZV91cCgmam91cm5hbC0+al9qb2luX3dhaXQpIDsKK30KKworLyogdGhpcyBtdXN0IGJlIGNhbGxlZCB3aXRob3V0IGEgdHJhbnNhY3Rpb24gc3RhcnRlZCwgYW5kIGRvZXMgbm90CisqKiByZXF1aXJlIEJLTAorKi8KK3ZvaWQgcmVpc2VyZnNfd2FpdF9vbl93cml0ZV9ibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpIHsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHMpOworICAgIHdhaXRfZXZlbnQoam91cm5hbC0+al9qb2luX3dhaXQsCisgICAgICAgICAgICAgICAhdGVzdF9iaXQoSl9XUklURVJTX0JMT0NLRUQsICZqb3VybmFsLT5qX3N0YXRlKSkgOworfQorCitzdGF0aWMgdm9pZCBxdWV1ZV9sb2dfd3JpdGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcykgeworICAgIHdhaXRfcXVldWVfdCB3YWl0OworICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocyk7CisgICAgc2V0X2JpdChKX1dSSVRFUlNfUVVFVUVELCAmam91cm5hbC0+al9zdGF0ZSk7CisKKyAgICAvKgorICAgICAqIHdlIGRvbid0IHdhbnQgdG8gdXNlIHdhaXRfZXZlbnQgaGVyZSBiZWNhdXNlCisgICAgICogd2Ugb25seSB3YW50IHRvIHdhaXQgb25jZS4KKyAgICAgKi8KKyAgICBpbml0X3dhaXRxdWV1ZV9lbnRyeSgmd2FpdCwgY3VycmVudCk7CisgICAgYWRkX3dhaXRfcXVldWUoJmpvdXJuYWwtPmpfam9pbl93YWl0LCAmd2FpdCk7CisgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworICAgIGlmICh0ZXN0X2JpdChKX1dSSVRFUlNfUVVFVUVELCAmam91cm5hbC0+al9zdGF0ZSkpCisgICAgICAgIHNjaGVkdWxlKCk7CisgICAgY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisgICAgcmVtb3ZlX3dhaXRfcXVldWUoJmpvdXJuYWwtPmpfam9pbl93YWl0LCAmd2FpdCk7Cit9CisKK3N0YXRpYyB2b2lkIHdha2VfcXVldWVkX3dyaXRlcnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzKSB7CisgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChzKTsKKyAgICBpZiAodGVzdF9hbmRfY2xlYXJfYml0KEpfV1JJVEVSU19RVUVVRUQsICZqb3VybmFsLT5qX3N0YXRlKSkKKyAgICAgICAgd2FrZV91cCgmam91cm5hbC0+al9qb2luX3dhaXQpOworfQorCitzdGF0aWMgdm9pZCBsZXRfdHJhbnNhY3Rpb25fZ3JvdyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB0cmFuc19pZCkKK3sKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHNiKTsKKyAgICB1bnNpZ25lZCBsb25nIGJjb3VudCA9IGpvdXJuYWwtPmpfYmNvdW50OworICAgIHdoaWxlKDEpIHsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJc2NoZWR1bGVfdGltZW91dCgxKTsKKwlqb3VybmFsLT5qX2N1cnJlbnRfamwtPmpfc3RhdGUgfD0gTElTVF9DT01NSVRfUEVORElORzsKKyAgICAgICAgd2hpbGUgKChhdG9taWNfcmVhZCgmam91cm5hbC0+al93Y291bnQpID4gMCB8fAorCSAgICAgICAgYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfamxvY2spKSAmJgorCSAgICAgICBqb3VybmFsLT5qX3RyYW5zX2lkID09IHRyYW5zX2lkKSB7CisJICAgIHF1ZXVlX2xvZ193cml0ZXIoc2IpOworCX0KKwlpZiAoam91cm5hbC0+al90cmFuc19pZCAhPSB0cmFuc19pZCkKKwkgICAgYnJlYWs7CisJaWYgKGJjb3VudCA9PSBqb3VybmFsLT5qX2Jjb3VudCkKKwkgICAgYnJlYWs7CisJYmNvdW50ID0gam91cm5hbC0+al9iY291bnQ7CisgICAgfQorfQorCisvKiBqb2luID09IHRydWUgaWYgeW91IG11c3Qgam9pbiBhbiBleGlzdGluZyB0cmFuc2FjdGlvbi4KKyoqIGpvaW4gPT0gZmFsc2UgaWYgeW91IGNhbiBkZWFsIHdpdGggd2FpdGluZyBmb3Igb3RoZXJzIHRvIGZpbmlzaAorKioKKyoqIHRoaXMgd2lsbCBibG9jayB1bnRpbCB0aGUgdHJhbnNhY3Rpb24gaXMgam9pbmFibGUuICBzZW5kIHRoZSBudW1iZXIgb2YgYmxvY2tzIHlvdQorKiogZXhwZWN0IHRvIHVzZSBpbiBuYmxvY2tzLgorKi8KK3N0YXRpYyBpbnQgZG9fam91cm5hbF9iZWdpbl9yKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBwX3Nfc2IsdW5zaWduZWQgbG9uZyBuYmxvY2tzLGludCBqb2luKSB7CisgIHRpbWVfdCBub3cgPSBnZXRfc2Vjb25kcygpIDsKKyAgaW50IG9sZF90cmFuc19pZCAgOworICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwocF9zX3NiKTsKKyAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSBteXRoOworICBpbnQgc2NoZWRfY291bnQgPSAwOworICBpbnQgcmV0dmFsOworCisgIHJlaXNlcmZzX2NoZWNrX2xvY2tfZGVwdGgocF9zX3NiLCAiam91cm5hbF9iZWdpbiIpIDsKKworICBQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIGpvdXJuYWwuam91cm5hbF9iZWluZyApOworICAvKiBzZXQgaGVyZSBmb3Igam91cm5hbF9qb2luICovCisgIHRoLT50X3JlZmNvdW50ID0gMTsKKyAgdGgtPnRfc3VwZXIgPSBwX3Nfc2IgOworCityZWxvY2s6CisgIGxvY2tfam91cm5hbChwX3Nfc2IpIDsKKyAgaWYgKGpvaW4gIT0gSkJFR0lOX0FCT1JUICYmIHJlaXNlcmZzX2lzX2pvdXJuYWxfYWJvcnRlZCAoam91cm5hbCkpIHsKKyAgICB1bmxvY2tfam91cm5hbCAocF9zX3NiKTsKKyAgICByZXR2YWwgPSBqb3VybmFsLT5qX2Vycm5vOworICAgIGdvdG8gb3V0X2ZhaWw7CisgIH0KKyAgam91cm5hbC0+al9iY291bnQrKzsKKworICBpZiAodGVzdF9iaXQoSl9XUklURVJTX0JMT0NLRUQsICZqb3VybmFsLT5qX3N0YXRlKSkgeworICAgIHVubG9ja19qb3VybmFsKHBfc19zYikgOworICAgIHJlaXNlcmZzX3dhaXRfb25fd3JpdGVfYmxvY2socF9zX3NiKSA7CisgICAgUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBqb3VybmFsLmpvdXJuYWxfcmVsb2NrX3dyaXRlcnMgKTsKKyAgICBnb3RvIHJlbG9jayA7CisgIH0KKyAgbm93ID0gZ2V0X3NlY29uZHMoKTsKKworICAvKiBpZiB0aGVyZSBpcyBubyByb29tIGluIHRoZSBqb3VybmFsIE9SCisgICoqIGlmIHRoaXMgdHJhbnNhY3Rpb24gaXMgdG9vIG9sZCwgYW5kIHdlIHdlcmVuJ3QgY2FsbGVkIGpvaW5hYmxlLCB3YWl0IGZvciBpdCB0byBmaW5pc2ggYmVmb3JlIGJlZ2lubmluZyAKKyAgKiogd2UgZG9uJ3Qgc2xlZXAgaWYgdGhlcmUgYXJlbid0IG90aGVyIHdyaXRlcnMKKyAgKi8KKworICBpZiAoICgham9pbiAmJiBqb3VybmFsLT5qX211c3Rfd2FpdCA+IDApIHx8CisgICAgICggIWpvaW4gJiYgKGpvdXJuYWwtPmpfbGVuX2FsbG9jICsgbmJsb2NrcyArIDIpID49IGpvdXJuYWwtPmpfbWF4X2JhdGNoKSB8fAorICAgICAoIWpvaW4gJiYgYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfd2NvdW50KSA+IDAgJiYgam91cm5hbC0+al90cmFuc19zdGFydF90aW1lID4gMCAmJgorICAgICAgKG5vdyAtIGpvdXJuYWwtPmpfdHJhbnNfc3RhcnRfdGltZSkgPiBqb3VybmFsLT5qX21heF90cmFuc19hZ2UpIHx8CisgICAgICgham9pbiAmJiBhdG9taWNfcmVhZCgmam91cm5hbC0+al9qbG9jaykpIHx8CisgICAgICgham9pbiAmJiBqb3VybmFsLT5qX2Nub2RlX2ZyZWUgPCAoam91cm5hbC0+al90cmFuc19tYXggKiAzKSkpIHsKKworICAgIG9sZF90cmFuc19pZCA9IGpvdXJuYWwtPmpfdHJhbnNfaWQ7CisgICAgdW5sb2NrX2pvdXJuYWwocF9zX3NiKSA7IC8qIGFsbG93IG90aGVycyB0byBmaW5pc2ggdGhpcyB0cmFuc2FjdGlvbiAqLworCisgICAgaWYgKCFqb2luICYmIChqb3VybmFsLT5qX2xlbl9hbGxvYyArIG5ibG9ja3MgKyAyKSA+PQorICAgICAgICBqb3VybmFsLT5qX21heF9iYXRjaCAmJgorCSgoam91cm5hbC0+al9sZW4gKyBuYmxvY2tzICsgMikgKiAxMDApIDwgKGpvdXJuYWwtPmpfbGVuX2FsbG9jICogNzUpKQorICAgIHsKKwlpZiAoYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfd2NvdW50KSA+IDEwKSB7CisJICAgIHNjaGVkX2NvdW50Kys7CisJICAgIHF1ZXVlX2xvZ193cml0ZXIocF9zX3NiKTsKKwkgICAgZ290byByZWxvY2s7CisJfQorICAgIH0KKyAgICAvKiBkb24ndCBtZXNzIHdpdGggam9pbmluZyB0aGUgdHJhbnNhY3Rpb24gaWYgYWxsIHdlIGhhdmUgdG8gZG8gaXMKKyAgICAgKiB3YWl0IGZvciBzb21lb25lIGVsc2UgdG8gZG8gYSBjb21taXQKKyAgICAgKi8KKyAgICBpZiAoYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfamxvY2spKSB7CisJd2hpbGUgKGpvdXJuYWwtPmpfdHJhbnNfaWQgPT0gb2xkX3RyYW5zX2lkICYmCisJICAgICAgIGF0b21pY19yZWFkKCZqb3VybmFsLT5qX2psb2NrKSkgeworCSAgICBxdWV1ZV9sb2dfd3JpdGVyKHBfc19zYik7CisgICAgICAgIH0KKwlnb3RvIHJlbG9jazsKKyAgICB9CisgICAgcmV0dmFsID0gam91cm5hbF9qb2luKCZteXRoLCBwX3Nfc2IsIDEpIDsKKyAgICBpZiAocmV0dmFsKQorICAgICAgICBnb3RvIG91dF9mYWlsOworCisgICAgLyogc29tZW9uZSBtaWdodCBoYXZlIGVuZGVkIHRoZSB0cmFuc2FjdGlvbiB3aGlsZSB3ZSBqb2luZWQgKi8KKyAgICBpZiAob2xkX3RyYW5zX2lkICE9IGpvdXJuYWwtPmpfdHJhbnNfaWQpIHsKKyAgICAgICAgcmV0dmFsID0gZG9fam91cm5hbF9lbmQoJm15dGgsIHBfc19zYiwgMSwgMCkgOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHZhbCA9IGRvX2pvdXJuYWxfZW5kKCZteXRoLCBwX3Nfc2IsIDEsIENPTU1JVF9OT1cpIDsKKyAgICB9CisKKyAgICBpZiAocmV0dmFsKQorICAgICAgICBnb3RvIG91dF9mYWlsOworCisgICAgUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBqb3VybmFsLmpvdXJuYWxfcmVsb2NrX3djb3VudCApOworICAgIGdvdG8gcmVsb2NrIDsKKyAgfQorICAvKiB3ZSBhcmUgdGhlIGZpcnN0IHdyaXRlciwgc2V0IHRyYW5zX2lkICovCisgIGlmIChqb3VybmFsLT5qX3RyYW5zX3N0YXJ0X3RpbWUgPT0gMCkgeworICAgIGpvdXJuYWwtPmpfdHJhbnNfc3RhcnRfdGltZSA9IGdldF9zZWNvbmRzKCk7CisgIH0KKyAgYXRvbWljX2luYygmKGpvdXJuYWwtPmpfd2NvdW50KSkgOworICBqb3VybmFsLT5qX2xlbl9hbGxvYyArPSBuYmxvY2tzIDsKKyAgdGgtPnRfYmxvY2tzX2xvZ2dlZCA9IDAgOworICB0aC0+dF9ibG9ja3NfYWxsb2NhdGVkID0gbmJsb2NrcyA7CisgIHRoLT50X3RyYW5zX2lkID0gam91cm5hbC0+al90cmFuc19pZCA7CisgIHVubG9ja19qb3VybmFsKHBfc19zYikgOworICBJTklUX0xJU1RfSEVBRCAoJnRoLT50X2xpc3QpOworICByZXR1cm4gMCA7CisKK291dF9mYWlsOgorICBtZW1zZXQgKHRoLCAwLCBzaXplb2YgKCp0aCkpOworICAvKiBSZS1zZXQgdGgtPnRfc3VwZXIsIHNvIHdlIGNhbiBwcm9wZXJseSBrZWVwIHRyYWNrIG9mIGhvdyBtYW55CisgICAqIHBlcnNpc3RlbnQgdHJhbnNhY3Rpb25zIHRoZXJlIGFyZS4gV2UgbmVlZCB0byBkbyB0aGlzIHNvIGlmIHRoaXMKKyAgICogY2FsbCBpcyBwYXJ0IG9mIGEgZmFpbGVkIHJlc3RhcnRfdHJhbnNhY3Rpb24sIHdlIGNhbiBmcmVlIGl0IGxhdGVyICovCisgIHRoLT50X3N1cGVyID0gcF9zX3NiOworICByZXR1cm4gcmV0dmFsOworfQorCitzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICoKK3JlaXNlcmZzX3BlcnNpc3RlbnRfdHJhbnNhY3Rpb24oc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBpbnQgbmJsb2NrcykgeworICAgIGludCByZXQgOworICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoIDsKKworICAgIC8qIGlmIHdlJ3JlIG5lc3RpbmcgaW50byBhbiBleGlzdGluZyB0cmFuc2FjdGlvbi4gIEl0IHdpbGwgYmUKKyAgICAqKiBwZXJzaXN0ZW50IG9uIGl0cyBvd24KKyAgICAqLworICAgIGlmIChyZWlzZXJmc190cmFuc2FjdGlvbl9ydW5uaW5nKHMpKSB7CisgICAgICAgIHRoID0gY3VycmVudC0+am91cm5hbF9pbmZvIDsKKwl0aC0+dF9yZWZjb3VudCsrIDsKKwlpZiAodGgtPnRfcmVmY291bnQgPCAyKSB7CisJICAgIEJVRygpIDsKKwl9CisJcmV0dXJuIHRoIDsKKyAgICB9CisgICAgdGggPSByZWlzZXJmc19rbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlKSwgR0ZQX05PRlMsIHMpIDsKKyAgICBpZiAoIXRoKQorICAgICAgIHJldHVybiBOVUxMOworICAgIHJldCA9IGpvdXJuYWxfYmVnaW4odGgsIHMsIG5ibG9ja3MpIDsKKyAgICBpZiAocmV0KSB7CisJcmVpc2VyZnNfa2ZyZWUodGgsIHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlKSwgcykgOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBTQl9KT1VSTkFMKHMpLT5qX3BlcnNpc3RlbnRfdHJhbnMrKzsKKyAgICByZXR1cm4gdGggOworfQorCitpbnQKK3JlaXNlcmZzX2VuZF9wZXJzaXN0ZW50X3RyYW5zYWN0aW9uKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoKSB7CisgICAgc3RydWN0IHN1cGVyX2Jsb2NrICpzID0gdGgtPnRfc3VwZXI7CisgICAgaW50IHJldCA9IDA7CisgICAgaWYgKHRoLT50X3RyYW5zX2lkKQorICAgICAgICByZXQgPSBqb3VybmFsX2VuZCh0aCwgdGgtPnRfc3VwZXIsIHRoLT50X2Jsb2Nrc19hbGxvY2F0ZWQpOworICAgIGVsc2UKKyAgICAgICAgcmV0ID0gLUVJTzsKKyAgICBpZiAodGgtPnRfcmVmY291bnQgPT0gMCkgeworICAgICAgICBTQl9KT1VSTkFMKHMpLT5qX3BlcnNpc3RlbnRfdHJhbnMtLTsKKwlyZWlzZXJmc19rZnJlZSh0aCwgc2l6ZW9mKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUpLCBzKSA7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgam91cm5hbF9qb2luKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgdW5zaWduZWQgbG9uZyBuYmxvY2tzKSB7CisgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKmN1cl90aCA9IGN1cnJlbnQtPmpvdXJuYWxfaW5mbzsKKworICAvKiB0aGlzIGtlZXBzIGRvX2pvdXJuYWxfZW5kIGZyb20gTlVMTGluZyBvdXQgdGhlIGN1cnJlbnQtPmpvdXJuYWxfaW5mbworICAqKiBwb2ludGVyCisgICovCisgIHRoLT50X2hhbmRsZV9zYXZlID0gY3VyX3RoIDsKKyAgaWYgKGN1cl90aCAmJiBjdXJfdGgtPnRfcmVmY291bnQgPiAxKSB7CisgICAgICBCVUcoKSA7CisgIH0KKyAgcmV0dXJuIGRvX2pvdXJuYWxfYmVnaW5fcih0aCwgcF9zX3NiLCBuYmxvY2tzLCBKQkVHSU5fSk9JTikgOworfQorCitpbnQgam91cm5hbF9qb2luX2Fib3J0KHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgdW5zaWduZWQgbG9uZyBuYmxvY2tzKSB7CisgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKmN1cl90aCA9IGN1cnJlbnQtPmpvdXJuYWxfaW5mbzsKKworICAvKiB0aGlzIGtlZXBzIGRvX2pvdXJuYWxfZW5kIGZyb20gTlVMTGluZyBvdXQgdGhlIGN1cnJlbnQtPmpvdXJuYWxfaW5mbworICAqKiBwb2ludGVyCisgICovCisgIHRoLT50X2hhbmRsZV9zYXZlID0gY3VyX3RoIDsKKyAgaWYgKGN1cl90aCAmJiBjdXJfdGgtPnRfcmVmY291bnQgPiAxKSB7CisgICAgICBCVUcoKSA7CisgIH0KKyAgcmV0dXJuIGRvX2pvdXJuYWxfYmVnaW5fcih0aCwgcF9zX3NiLCBuYmxvY2tzLCBKQkVHSU5fQUJPUlQpIDsKK30KKworaW50IGpvdXJuYWxfYmVnaW4oc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIHN0cnVjdCBzdXBlcl9ibG9jayAgKiBwX3Nfc2IsIHVuc2lnbmVkIGxvbmcgbmJsb2NrcykgeworICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKmN1cl90aCA9IGN1cnJlbnQtPmpvdXJuYWxfaW5mbyA7CisgICAgaW50IHJldCA7CisKKyAgICB0aC0+dF9oYW5kbGVfc2F2ZSA9IE5VTEwgOworICAgIGlmIChjdXJfdGgpIHsKKwkvKiB3ZSBhcmUgbmVzdGluZyBpbnRvIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uICovCisJaWYgKGN1cl90aC0+dF9zdXBlciA9PSBwX3Nfc2IpIHsKKyAgICAgICAgICAgICAgQlVHX09OICghY3VyX3RoLT50X3JlZmNvdW50KTsKKwkgICAgICBjdXJfdGgtPnRfcmVmY291bnQrKyA7CisJICAgICAgbWVtY3B5KHRoLCBjdXJfdGgsIHNpemVvZigqdGgpKTsKKwkgICAgICBpZiAodGgtPnRfcmVmY291bnQgPD0gMSkKKwkJICAgICAgcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAiQkFEOiByZWZjb3VudCA8PSAxLCBidXQgam91cm5hbF9pbmZvICE9IDAiKTsKKwkgICAgICByZXR1cm4gMDsKKwl9IGVsc2UgeworCSAgICAvKiB3ZSd2ZSBlbmRlZCB1cCB3aXRoIGEgaGFuZGxlIGZyb20gYSBkaWZmZXJlbnQgZmlsZXN5c3RlbS4KKwkgICAgKiogc2F2ZSBpdCBhbmQgcmVzdG9yZSBvbiBqb3VybmFsX2VuZC4gIFRoaXMgc2hvdWxkIG5ldmVyCisJICAgICoqIHJlYWxseSBoYXBwZW4uLi4KKwkgICAgKi8KKwkgICAgcmVpc2VyZnNfd2FybmluZyhwX3Nfc2IsICJjbG0tMjEwMDogbmVzdGluZyBpbmZvIGEgZGlmZmVyZW50IEZTIikgOworCSAgICB0aC0+dF9oYW5kbGVfc2F2ZSA9IGN1cnJlbnQtPmpvdXJuYWxfaW5mbyA7CisJICAgIGN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IHRoOworCX0KKyAgICB9IGVsc2UgeworCWN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IHRoOworICAgIH0KKyAgICByZXQgPSBkb19qb3VybmFsX2JlZ2luX3IodGgsIHBfc19zYiwgbmJsb2NrcywgSkJFR0lOX1JFRykgOworICAgIGlmIChjdXJyZW50LT5qb3VybmFsX2luZm8gIT0gdGgpCisgICAgICAgIEJVRygpIDsKKworICAgIC8qIEkgZ3Vlc3MgdGhpcyBib2lscyBkb3duIHRvIGJlaW5nIHRoZSByZWNpcHJvY2FsIG9mIGNsbS0yMTAwIGFib3ZlLgorICAgICAqIElmIGRvX2pvdXJuYWxfYmVnaW5fciBmYWlscywgd2UgbmVlZCB0byBwdXQgaXQgYmFjaywgc2luY2Ugam91cm5hbF9lbmQKKyAgICAgKiB3b24ndCBiZSBjYWxsZWQgdG8gZG8gaXQuICovCisgICAgaWYgKHJldCkKKyAgICAgICAgY3VycmVudC0+am91cm5hbF9pbmZvID0gdGgtPnRfaGFuZGxlX3NhdmU7CisgICAgZWxzZQorICAgICAgICBCVUdfT04gKCF0aC0+dF9yZWZjb3VudCk7CisKKyAgICByZXR1cm4gcmV0IDsKK30KKworLyoKKyoqIHB1dHMgYmggaW50byB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4gIElmIGl0IHdhcyBhbHJlYWR5IHRoZXJlLCByZW9yZGVycyByZW1vdmVzIHRoZQorKiogb2xkIHBvaW50ZXJzIGZyb20gdGhlIGhhc2gsIGFuZCBwdXRzIG5ldyBvbmVzIGluICh0byBtYWtlIHN1cmUgcmVwbGF5IGhhcHBlbiBpbiB0aGUgcmlnaHQgb3JkZXIpLgorKioKKyoqIGlmIGl0IHdhcyBkaXJ0eSwgY2xlYW5zIGFuZCBmaWxlcyBvbnRvIHRoZSBjbGVhbiBsaXN0LiAgSSBjYW4ndCBsZXQgaXQgYmUgZGlydHkgYWdhaW4gdW50aWwgdGhlCisqKiB0cmFuc2FjdGlvbiBpcyBjb21taXR0ZWQuCisqKiAKKyoqIGlmIGpfbGVuLCBpcyBiaWdnZXIgdGhhbiBqX2xlbl9hbGxvYywgaXQgcHVzaGVzIGpfbGVuX2FsbG9jIHRvIDEwICsgal9sZW4uCisqLworaW50IGpvdXJuYWxfbWFya19kaXJ0eShzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpIHsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOworICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24gPSBOVUxMOworICBpbnQgY291bnRfYWxyZWFkeV9pbmNkID0gMCA7CisgIGludCBwcmVwYXJlZCA9IDAgOworICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisKKyAgUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBqb3VybmFsLm1hcmtfZGlydHkgKTsKKyAgaWYgKHRoLT50X3RyYW5zX2lkICE9IGpvdXJuYWwtPmpfdHJhbnNfaWQpIHsKKyAgICByZWlzZXJmc19wYW5pYyh0aC0+dF9zdXBlciwgImpvdXJuYWwtMTU3NzogaGFuZGxlIHRyYW5zIGlkICVsZCAhPSBjdXJyZW50IHRyYW5zIGlkICVsZFxuIiwgCisgICAgICAgICAgICAgICAgICAgdGgtPnRfdHJhbnNfaWQsIGpvdXJuYWwtPmpfdHJhbnNfaWQpOworICB9CisKKyAgcF9zX3NiLT5zX2RpcnQgPSAxOworCisgIHByZXBhcmVkID0gdGVzdF9jbGVhcl9idWZmZXJfam91cm5hbF9wcmVwYXJlZCAoYmgpOworICBjbGVhcl9idWZmZXJfam91cm5hbF9yZXN0b3JlX2RpcnR5IChiaCk7CisgIC8qIGFscmVhZHkgaW4gdGhpcyB0cmFuc2FjdGlvbiwgd2UgYXJlIGRvbmUgKi8KKyAgaWYgKGJ1ZmZlcl9qb3VybmFsZWQoYmgpKSB7CisgICAgUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBqb3VybmFsLm1hcmtfZGlydHlfYWxyZWFkeSApOworICAgIHJldHVybiAwIDsKKyAgfQorCisgIC8qIHRoaXMgbXVzdCBiZSB0dXJuZWQgaW50byBhIHBhbmljIGluc3RlYWQgb2YgYSB3YXJuaW5nLiAgV2UgY2FuJ3QgYWxsb3cKKyAgKiogYSBkaXJ0eSBvciBqb3VybmFsX2RpcnR5IG9yIGxvY2tlZCBidWZmZXIgdG8gYmUgbG9nZ2VkLCBhcyBzb21lIGNoYW5nZXMKKyAgKiogY291bGQgZ2V0IHRvIGRpc2sgdG9vIGVhcmx5LiAgTk9UIEdPT0QuCisgICovCisgIGlmICghcHJlcGFyZWQgfHwgYnVmZmVyX2RpcnR5KGJoKSkgeworICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgImpvdXJuYWwtMTc3NzogYnVmZmVyICVsbHUgYmFkIHN0YXRlICIKKwkJICAgICAgIiVjUFJFUEFSRUQgJWNMT0NLRUQgJWNESVJUWSAlY0pESVJUWV9XQUlUIiwKKwkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yLCBwcmVwYXJlZCA/ICcgJyA6ICchJywKKwkJCSAgICBidWZmZXJfbG9ja2VkKGJoKSA/ICcgJyA6ICchJywKKwkJCSAgICBidWZmZXJfZGlydHkoYmgpID8gJyAnIDogJyEnLAorCQkJICAgIGJ1ZmZlcl9qb3VybmFsX2RpcnR5KGJoKSA/ICcgJyA6ICchJykgOworICB9CisKKyAgaWYgKGF0b21pY19yZWFkKCYoam91cm5hbC0+al93Y291bnQpKSA8PSAwKSB7CisgICAgcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAiam91cm5hbC0xNDA5OiBqb3VybmFsX21hcmtfZGlydHkgcmV0dXJuaW5nIGJlY2F1c2Ugal93Y291bnQgd2FzICVkIiwgYXRvbWljX3JlYWQoJihqb3VybmFsLT5qX3djb3VudCkpKSA7CisgICAgcmV0dXJuIDEgOworICB9CisgIC8qIHRoaXMgZXJyb3IgbWVhbnMgSSd2ZSBzY3Jld2VkIHVwLCBhbmQgd2UndmUgb3ZlcmZsb3dlZCB0aGUgdHJhbnNhY3Rpb24uICAKKyAgKiogTm90aGluZyBjYW4gYmUgZG9uZSBoZXJlLCBleGNlcHQgbWFrZSB0aGUgRlMgcmVhZG9ubHkgb3IgcGFuaWMuCisgICovIAorICBpZiAoam91cm5hbC0+al9sZW4gPj0gam91cm5hbC0+al90cmFuc19tYXgpIHsKKyAgICByZWlzZXJmc19wYW5pYyh0aC0+dF9zdXBlciwgImpvdXJuYWwtMTQxMzogam91cm5hbF9tYXJrX2RpcnR5OiBqX2xlbiAoJWx1KSBpcyB0b28gYmlnXG4iLCBqb3VybmFsLT5qX2xlbikgOworICB9CisKKyAgaWYgKGJ1ZmZlcl9qb3VybmFsX2RpcnR5KGJoKSkgeworICAgIGNvdW50X2FscmVhZHlfaW5jZCA9IDEgOworICAgIFBST0NfSU5GT19JTkMoIHBfc19zYiwgam91cm5hbC5tYXJrX2RpcnR5X25vdGpvdXJuYWwgKTsKKyAgICBjbGVhcl9idWZmZXJfam91cm5hbF9kaXJ0eSAoYmgpOworICB9CisKKyAgaWYgKGpvdXJuYWwtPmpfbGVuID4gam91cm5hbC0+al9sZW5fYWxsb2MpIHsKKyAgICBqb3VybmFsLT5qX2xlbl9hbGxvYyA9IGpvdXJuYWwtPmpfbGVuICsgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgOworICB9CisKKyAgc2V0X2J1ZmZlcl9qb3VybmFsZWQgKGJoKTsKKworICAvKiBub3cgcHV0IHRoaXMgZ3V5IG9uIHRoZSBlbmQgKi8KKyAgaWYgKCFjbikgeworICAgIGNuID0gZ2V0X2Nub2RlKHBfc19zYikgOworICAgIGlmICghY24pIHsKKyAgICAgIHJlaXNlcmZzX3BhbmljKHBfc19zYiwgImdldF9jbm9kZSBmYWlsZWQhXG4iKTsgCisgICAgfQorCisgICAgaWYgKHRoLT50X2Jsb2Nrc19sb2dnZWQgPT0gdGgtPnRfYmxvY2tzX2FsbG9jYXRlZCkgeworICAgICAgdGgtPnRfYmxvY2tzX2FsbG9jYXRlZCArPSBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCA7CisgICAgICBqb3VybmFsLT5qX2xlbl9hbGxvYyArPSBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCA7CisgICAgfQorICAgIHRoLT50X2Jsb2Nrc19sb2dnZWQrKyA7CisgICAgam91cm5hbC0+al9sZW4rKyA7CisKKyAgICBjbi0+YmggPSBiaCA7CisgICAgY24tPmJsb2NrbnIgPSBiaC0+Yl9ibG9ja25yIDsKKyAgICBjbi0+c2IgPSBwX3Nfc2I7CisgICAgY24tPmpsaXN0ID0gTlVMTCA7CisgICAgaW5zZXJ0X2pvdXJuYWxfaGFzaChqb3VybmFsLT5qX2hhc2hfdGFibGUsIGNuKSA7CisgICAgaWYgKCFjb3VudF9hbHJlYWR5X2luY2QpIHsKKyAgICAgIGdldF9iaChiaCkgOworICAgIH0KKyAgfQorICBjbi0+bmV4dCA9IE5VTEwgOworICBjbi0+cHJldiA9IGpvdXJuYWwtPmpfbGFzdCA7CisgIGNuLT5iaCA9IGJoIDsKKyAgaWYgKGpvdXJuYWwtPmpfbGFzdCkgeworICAgIGpvdXJuYWwtPmpfbGFzdC0+bmV4dCA9IGNuIDsKKyAgICBqb3VybmFsLT5qX2xhc3QgPSBjbiA7CisgIH0gZWxzZSB7CisgICAgam91cm5hbC0+al9maXJzdCA9IGNuIDsKKyAgICBqb3VybmFsLT5qX2xhc3QgPSBjbiA7CisgIH0KKyAgcmV0dXJuIDAgOworfQorCitpbnQgam91cm5hbF9lbmQoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCB1bnNpZ25lZCBsb25nIG5ibG9ja3MpIHsKKyAgaWYgKCFjdXJyZW50LT5qb3VybmFsX2luZm8gJiYgdGgtPnRfcmVmY291bnQgPiAxKQorICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgIlJFSVNFUi1ORVNUSU5HOiB0aCBOVUxMLCByZWZjb3VudCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgdGgtPnRfcmVmY291bnQpOworCisgIGlmICghdGgtPnRfdHJhbnNfaWQpIHsKKyAgICBXQVJOX09OICgxKTsKKyAgICByZXR1cm4gLUVJTzsKKyAgfQorCisgIHRoLT50X3JlZmNvdW50LS07CisgIGlmICh0aC0+dF9yZWZjb3VudCA+IDApIHsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICpjdXJfdGggPSBjdXJyZW50LT5qb3VybmFsX2luZm8gOworCisgICAgLyogd2UgYXJlbid0IGFsbG93ZWQgdG8gY2xvc2UgYSBuZXN0ZWQgdHJhbnNhY3Rpb24gb24gYSBkaWZmZXJlbnQKKyAgICAqKiBmaWxlc3lzdGVtIGZyb20gdGhlIG9uZSBpbiB0aGUgdGFzayBzdHJ1Y3QKKyAgICAqLworICAgIGlmIChjdXJfdGgtPnRfc3VwZXIgIT0gdGgtPnRfc3VwZXIpCisgICAgICBCVUcoKSA7CisKKyAgICBpZiAodGggIT0gY3VyX3RoKSB7CisgICAgICBtZW1jcHkoY3VycmVudC0+am91cm5hbF9pbmZvLCB0aCwgc2l6ZW9mKCp0aCkpOworICAgICAgdGgtPnRfdHJhbnNfaWQgPSAwOworICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZG9fam91cm5hbF9lbmQodGgsIHBfc19zYiwgbmJsb2NrcywgMCkgOworICB9Cit9CisKKy8qIHJlbW92ZXMgZnJvbSB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiwgcmVsc2luZyBhbmQgZGVzY3JlbWVudGluZyBhbnkgY291bnRlcnMuICAKKyoqIGFsc28gZmlsZXMgdGhlIHJlbW92ZWQgYnVmZmVyIGRpcmVjdGx5IG9udG8gdGhlIGNsZWFuIGxpc3QKKyoqCisqKiBjYWxsZWQgYnkgam91cm5hbF9tYXJrX2ZyZWVkIHdoZW4gYSBibG9jayBoYXMgYmVlbiBkZWxldGVkCisqKgorKiogcmV0dXJucyAxIGlmIGl0IGNsZWFuZWQgYW5kIHJlbHNlZCB0aGUgYnVmZmVyLiAwIG90aGVyd2lzZQorKi8KK3N0YXRpYyBpbnQgcmVtb3ZlX2Zyb21fdHJhbnNhY3Rpb24oc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIGJfYmxvY2tucl90IGJsb2NrbnIsIGludCBhbHJlYWR5X2NsZWFuZWQpIHsKKyAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjbiA7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKKyAgaW50IHJldCA9IDA7CisKKyAgY24gPSBnZXRfam91cm5hbF9oYXNoX2RldihwX3Nfc2IsIGpvdXJuYWwtPmpfaGFzaF90YWJsZSwgYmxvY2tucikgOworICBpZiAoIWNuIHx8ICFjbi0+YmgpIHsKKyAgICByZXR1cm4gcmV0IDsKKyAgfQorICBiaCA9IGNuLT5iaCA7CisgIGlmIChjbi0+cHJldikgeworICAgIGNuLT5wcmV2LT5uZXh0ID0gY24tPm5leHQgOworICB9CisgIGlmIChjbi0+bmV4dCkgeworICAgIGNuLT5uZXh0LT5wcmV2ID0gY24tPnByZXYgOworICB9CisgIGlmIChjbiA9PSBqb3VybmFsLT5qX2ZpcnN0KSB7CisgICAgam91cm5hbC0+al9maXJzdCA9IGNuLT5uZXh0IDsKKyAgfQorICBpZiAoY24gPT0gam91cm5hbC0+al9sYXN0KSB7CisgICAgam91cm5hbC0+al9sYXN0ID0gY24tPnByZXYgOworICB9CisgIGlmIChiaCkKKwlyZW1vdmVfam91cm5hbF9oYXNoKHBfc19zYiwgam91cm5hbC0+al9oYXNoX3RhYmxlLCBOVUxMLCBiaC0+Yl9ibG9ja25yLCAwKSA7CisgIGNsZWFyX2J1ZmZlcl9qb3VybmFsZWQgIChiaCk7IC8qIGRvbid0IGxvZyB0aGlzIG9uZSAqLworCisgIGlmICghYWxyZWFkeV9jbGVhbmVkKSB7CisgICAgY2xlYXJfYnVmZmVyX2pvdXJuYWxfZGlydHkgKGJoKTsKKyAgICBjbGVhcl9idWZmZXJfZGlydHkoYmgpOworICAgIGNsZWFyX2J1ZmZlcl9qb3VybmFsX3Rlc3QgKGJoKTsKKyAgICBwdXRfYmgoYmgpIDsKKyAgICBpZiAoYXRvbWljX3JlYWQoJihiaC0+Yl9jb3VudCkpIDwgMCkgeworICAgICAgcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAiam91cm5hbC0xNzUyOiByZW1vdmUgZnJvbSB0cmFucywgYl9jb3VudCA8IDAiKTsKKyAgICB9CisgICAgcmV0ID0gMSA7CisgIH0KKyAgam91cm5hbC0+al9sZW4tLSA7CisgIGpvdXJuYWwtPmpfbGVuX2FsbG9jLS0gOworICBmcmVlX2Nub2RlKHBfc19zYiwgY24pIDsKKyAgcmV0dXJuIHJldCA7Cit9CisKKy8qCisqKiBmb3IgYW55IGNub2RlIGluIGEgam91cm5hbCBsaXN0LCBpdCBjYW4gb25seSBiZSBkaXJ0aWVkIG9mIGFsbCB0aGUKKyoqIHRyYW5zYWN0aW9ucyB0aGF0IGluY2x1ZGUgaXQgYXJlIGNvbW1pdGVkIHRvIGRpc2suCisqKiB0aGlzIGNoZWNrcyB0aHJvdWdoIGVhY2ggdHJhbnNhY3Rpb24sIGFuZCByZXR1cm5zIDEgaWYgeW91IGFyZSBhbGxvd2VkIHRvIGRpcnR5LAorKiogYW5kIDAgaWYgeW91IGFyZW4ndAorKioKKyoqIGl0IGlzIGNhbGxlZCBieSBkaXJ0eV9qb3VybmFsX2xpc3QsIHdoaWNoIGlzIGNhbGxlZCBhZnRlciBmbHVzaF9jb21taXRfbGlzdCBoYXMgZ290dGVuIGFsbCB0aGUgbG9nCisqKiBibG9ja3MgZm9yIGEgZ2l2ZW4gdHJhbnNhY3Rpb24gb24gZGlzaworKioKKyovCitzdGF0aWMgaW50IGNhbl9kaXJ0eShzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24pIHsKKyAgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGNuLT5zYjsKKyAgYl9ibG9ja25yX3QgYmxvY2tuciA9IGNuLT5ibG9ja25yICA7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Nub2RlICpjdXIgPSBjbi0+aHByZXYgOworICBpbnQgY2FuX2RpcnR5ID0gMSA7CisgIAorICAvKiBmaXJzdCB0ZXN0IGhwcmV2LiAgVGhlc2UgYXJlIGFsbCBuZXdlciB0aGFuIGNuLCBzbyBhbnkgbm9kZSBoZXJlCisgICoqIHdpdGggdGhlIHNhbWUgYmxvY2sgbnVtYmVyIGFuZCBkZXYgbWVhbnMgdGhpcyBub2RlIGNhbid0IGJlIHNlbnQKKyAgKiogdG8gZGlzayByaWdodCBub3cuCisgICovCisgIHdoaWxlKGN1ciAmJiBjYW5fZGlydHkpIHsKKyAgICBpZiAoY3VyLT5qbGlzdCAmJiBjdXItPmJoICYmIGN1ci0+YmxvY2tuciAmJiBjdXItPnNiID09IHNiICYmIAorICAgICAgICBjdXItPmJsb2NrbnIgPT0gYmxvY2tucikgeworICAgICAgY2FuX2RpcnR5ID0gMCA7CisgICAgfQorICAgIGN1ciA9IGN1ci0+aHByZXYgOworICB9CisgIC8qIHRoZW4gdGVzdCBobmV4dC4gIFRoZXNlIGFyZSBhbGwgb2xkZXIgdGhhbiBjbi4gIEFzIGxvbmcgYXMgdGhleQorICAqKiBhcmUgY29tbWl0dGVkIHRvIHRoZSBsb2csIGl0IGlzIHNhZmUgdG8gd3JpdGUgY24gdG8gZGlzaworICAqLworICBjdXIgPSBjbi0+aG5leHQgOworICB3aGlsZShjdXIgJiYgY2FuX2RpcnR5KSB7CisgICAgaWYgKGN1ci0+amxpc3QgJiYgY3VyLT5qbGlzdC0+al9sZW4gPiAwICYmIAorICAgICAgICBhdG9taWNfcmVhZCgmKGN1ci0+amxpc3QtPmpfY29tbWl0X2xlZnQpKSA+IDAgJiYgY3VyLT5iaCAmJiAKKyAgICAgICAgY3VyLT5ibG9ja25yICYmIGN1ci0+c2IgPT0gc2IgJiYgY3VyLT5ibG9ja25yID09IGJsb2NrbnIpIHsKKyAgICAgIGNhbl9kaXJ0eSA9IDAgOworICAgIH0KKyAgICBjdXIgPSBjdXItPmhuZXh0IDsKKyAgfQorICByZXR1cm4gY2FuX2RpcnR5IDsKK30KKworLyogc3luY3MgdGhlIGNvbW1pdCBibG9ja3MsIGJ1dCBkb2VzIG5vdCBmb3JjZSB0aGUgcmVhbCBidWZmZXJzIHRvIGRpc2sKKyoqIHdpbGwgd2FpdCB1bnRpbCB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBpcyBkb25lL2NvbW1pdGVkIGJlZm9yZSByZXR1cm5pbmcgCisqLworaW50IGpvdXJuYWxfZW5kX3N5bmMoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLCB1bnNpZ25lZCBsb25nIG5ibG9ja3MpIHsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOworCisgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKyAgLyogeW91IGNhbiBzeW5jIHdoaWxlIG5lc3RlZCwgdmVyeSwgdmVyeSBiYWQgKi8KKyAgaWYgKHRoLT50X3JlZmNvdW50ID4gMSkgeworICAgIEJVRygpIDsKKyAgfQorICBpZiAoam91cm5hbC0+al9sZW4gPT0gMCkgeworICAgIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocF9zX3NiLCBTQl9CVUZGRVJfV0lUSF9TQihwX3Nfc2IpLCAxKSA7CisgICAgam91cm5hbF9tYXJrX2RpcnR5KHRoLCBwX3Nfc2IsIFNCX0JVRkZFUl9XSVRIX1NCKHBfc19zYikpIDsKKyAgfQorICByZXR1cm4gZG9fam91cm5hbF9lbmQodGgsIHBfc19zYiwgbmJsb2NrcywgQ09NTUlUX05PVyB8IFdBSVQpIDsKK30KKworLyoKKyoqIHdyaXRlYmFjayB0aGUgcGVuZGluZyBhc3luYyBjb21taXRzIHRvIGRpc2sKKyovCitzdGF0aWMgdm9pZCBmbHVzaF9hc3luY19jb21taXRzKHZvaWQgKnApIHsKKyAgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IgPSBwOworICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHBfc19zYik7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsOworICBzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKworICBsb2NrX2tlcm5lbCgpOworICBpZiAoIWxpc3RfZW1wdHkoJmpvdXJuYWwtPmpfam91cm5hbF9saXN0KSkgeworICAgICAgLyogbGFzdCBlbnRyeSBpcyB0aGUgeW91bmdlc3QsIGNvbW1pdCBpdCBhbmQgeW91IGdldCBldmVyeXRoaW5nICovCisgICAgICBlbnRyeSA9IGpvdXJuYWwtPmpfam91cm5hbF9saXN0LnByZXY7CisgICAgICBqbCA9IEpPVVJOQUxfTElTVF9FTlRSWShlbnRyeSk7CisgICAgICBmbHVzaF9jb21taXRfbGlzdChwX3Nfc2IsIGpsLCAxKTsKKyAgfQorICB1bmxvY2tfa2VybmVsKCk7CisgIC8qCisgICAqIHRoaXMgaXMgYSBsaXR0bGUgcmFjZXksIGJ1dCB0aGVyZSdzIG5vIGhhcm0gaW4gbWlzc2luZworICAgKiB0aGUgZmlsZW1hcF9mZGF0YV93cml0ZQorICAgKi8KKyAgaWYgKCFhdG9taWNfcmVhZCgmam91cm5hbC0+al9hc3luY190aHJvdHRsZSkgJiYgIXJlaXNlcmZzX2lzX2pvdXJuYWxfYWJvcnRlZCAoam91cm5hbCkpIHsKKyAgICAgIGF0b21pY19pbmMoJmpvdXJuYWwtPmpfYXN5bmNfdGhyb3R0bGUpOworICAgICAgZmlsZW1hcF9mZGF0YXdyaXRlKHBfc19zYi0+c19iZGV2LT5iZF9pbm9kZS0+aV9tYXBwaW5nKTsKKyAgICAgIGF0b21pY19kZWMoJmpvdXJuYWwtPmpfYXN5bmNfdGhyb3R0bGUpOworICB9Cit9CisKKy8qCisqKiBmbHVzaGVzIGFueSBvbGQgdHJhbnNhY3Rpb25zIHRvIGRpc2sKKyoqIGVuZHMgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gaWYgaXQgaXMgdG9vIG9sZAorKi8KK2ludCByZWlzZXJmc19mbHVzaF9vbGRfY29tbWl0cyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYikgeworICAgIHRpbWVfdCBub3cgOworICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGggOworICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKKworICAgIG5vdyA9IGdldF9zZWNvbmRzKCk7CisgICAgLyogc2FmZXR5IGNoZWNrIHNvIHdlIGRvbid0IGZsdXNoIHdoaWxlIHdlIGFyZSByZXBsYXlpbmcgdGhlIGxvZyBkdXJpbmcKKyAgICAgKiBtb3VudAorICAgICAqLworICAgIGlmIChsaXN0X2VtcHR5KCZqb3VybmFsLT5qX2pvdXJuYWxfbGlzdCkpIHsKKwlyZXR1cm4gMCAgOworICAgIH0KKworICAgIC8qIGNoZWNrIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiAgSWYgdGhlcmUgYXJlIG5vIHdyaXRlcnMsIGFuZCBpdCBpcworICAgICAqIHRvbyBvbGQsIGZpbmlzaCBpdCwgYW5kIGZvcmNlIHRoZSBjb21taXQgYmxvY2tzIHRvIGRpc2sKKyAgICAgKi8KKyAgICBpZiAoYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfd2NvdW50KSA8PSAwICYmCisgICAgICAgIGpvdXJuYWwtPmpfdHJhbnNfc3RhcnRfdGltZSA+IDAgJiYKKyAgICAgICAgam91cm5hbC0+al9sZW4gPiAwICYmCisgICAgICAgIChub3cgLSBqb3VybmFsLT5qX3RyYW5zX3N0YXJ0X3RpbWUpID4gam91cm5hbC0+al9tYXhfdHJhbnNfYWdlKQorICAgIHsKKwlpZiAoIWpvdXJuYWxfam9pbigmdGgsIHBfc19zYiwgMSkpIHsKKyAgICAgICAgICAgIHJlaXNlcmZzX3ByZXBhcmVfZm9yX2pvdXJuYWwocF9zX3NiLCBTQl9CVUZGRVJfV0lUSF9TQihwX3Nfc2IpLCAxKSA7CisgICAgICAgICAgICBqb3VybmFsX21hcmtfZGlydHkoJnRoLCBwX3Nfc2IsIFNCX0JVRkZFUl9XSVRIX1NCKHBfc19zYikpIDsKKworICAgICAgICAgICAgLyogd2UncmUgb25seSBiZWluZyBjYWxsZWQgZnJvbSBrcmVpc2VyZnNkLCBpdCBtYWtlcyBubyBzZW5zZSB0byBkbworICAgICAgICAgICAgKiogYW4gYXN5bmMgY29tbWl0IHNvIHRoYXQga3JlaXNlcmZzZCBjYW4gZG8gaXQgbGF0ZXIKKyAgICAgICAgICAgICovCisgICAgICAgICAgICBkb19qb3VybmFsX2VuZCgmdGgsIHBfc19zYiwxLCBDT01NSVRfTk9XIHwgV0FJVCkgOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBwX3Nfc2ItPnNfZGlydDsKK30KKworLyoKKyoqIHJldHVybnMgMCBpZiBkb19qb3VybmFsX2VuZCBzaG91bGQgcmV0dXJuIHJpZ2h0IGF3YXksIHJldHVybnMgMSBpZiBkb19qb3VybmFsX2VuZCBzaG91bGQgZmluaXNoIHRoZSBjb21taXQKKyoqIAorKiogaWYgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gaXMgdG9vIG9sZCwgYnV0IHN0aWxsIGhhcyB3cml0ZXJzLCB0aGlzIHdpbGwgd2FpdCBvbiBqX2pvaW5fd2FpdCB1bnRpbCBhbGwgCisqKiB0aGUgd3JpdGVycyBhcmUgZG9uZS4gIEJ5IHRoZSB0aW1lIGl0IHdha2VzIHVwLCB0aGUgdHJhbnNhY3Rpb24gaXQgd2FzIGNhbGxlZCBoYXMgYWxyZWFkeSBlbmRlZCwgc28gaXQganVzdAorKiogZmx1c2hlcyB0aGUgY29tbWl0IGxpc3QgYW5kIHJldHVybnMgMC4KKyoqCisqKiBXb24ndCBiYXRjaCB3aGVuIGZsdXNoIG9yIGNvbW1pdF9ub3cgaXMgc2V0LiAgQWxzbyB3b24ndCBiYXRjaCB3aGVuIG90aGVycyBhcmUgd2FpdGluZyBvbiBqX2pvaW5fd2FpdC4KKyoqIAorKiogTm90ZSwgd2UgY2FuJ3QgYWxsb3cgdGhlIGpvdXJuYWxfZW5kIHRvIHByb2NlZWQgd2hpbGUgdGhlcmUgYXJlIHN0aWxsIHdyaXRlcnMgaW4gdGhlIGxvZy4KKyovCitzdGF0aWMgaW50IGNoZWNrX2pvdXJuYWxfZW5kKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgICogcF9zX3NiLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBuYmxvY2tzLCBpbnQgZmxhZ3MpIHsKKworICB0aW1lX3Qgbm93IDsKKyAgaW50IGZsdXNoID0gZmxhZ3MgJiBGTFVTSF9BTEwgOworICBpbnQgY29tbWl0X25vdyA9IGZsYWdzICYgQ09NTUlUX05PVyA7CisgIGludCB3YWl0X29uX2NvbW1pdCA9IGZsYWdzICYgV0FJVCA7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2xpc3QgKmpsOworICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHBfc19zYik7CisKKyAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCisgIGlmICh0aC0+dF90cmFuc19pZCAhPSBqb3VybmFsLT5qX3RyYW5zX2lkKSB7CisgICAgcmVpc2VyZnNfcGFuaWModGgtPnRfc3VwZXIsICJqb3VybmFsLTE1Nzc6IGhhbmRsZSB0cmFucyBpZCAlbGQgIT0gY3VycmVudCB0cmFucyBpZCAlbGRcbiIsIAorICAgICAgICAgICAgICAgICAgIHRoLT50X3RyYW5zX2lkLCBqb3VybmFsLT5qX3RyYW5zX2lkKTsKKyAgfQorCisgIGpvdXJuYWwtPmpfbGVuX2FsbG9jIC09ICh0aC0+dF9ibG9ja3NfYWxsb2NhdGVkIC0gdGgtPnRfYmxvY2tzX2xvZ2dlZCkgOworICBpZiAoYXRvbWljX3JlYWQoJihqb3VybmFsLT5qX3djb3VudCkpID4gMCkgeyAvKiA8PSAwIGlzIGFsbG93ZWQuICB1bm1vdW50aW5nIG1pZ2h0IG5vdCBjYWxsIGJlZ2luICovCisgICAgYXRvbWljX2RlYygmKGpvdXJuYWwtPmpfd2NvdW50KSkgOworICB9CisKKyAgLyogQlVHLCBkZWFsIHdpdGggY2FzZSB3aGVyZSBqX2xlbiBpcyAwLCBidXQgcGVvcGxlIHByZXZpb3VzbHkgZnJlZWQgYmxvY2tzIG5lZWQgdG8gYmUgcmVsZWFzZWQgCisgICoqIHdpbGwgYmUgZGVhbHQgd2l0aCBieSBuZXh0IHRyYW5zYWN0aW9uIHRoYXQgYWN0dWFsbHkgd3JpdGVzIHNvbWV0aGluZywgYnV0IHNob3VsZCBiZSB0YWtlbgorICAqKiBjYXJlIG9mIGluIHRoaXMgdHJhbnMKKyAgKi8KKyAgaWYgKGpvdXJuYWwtPmpfbGVuID09IDApIHsKKyAgICBCVUcoKTsKKyAgfQorICAvKiBpZiB3Y291bnQgPiAwLCBhbmQgd2UgYXJlIGNhbGxlZCB0byB3aXRoIGZsdXNoIG9yIGNvbW1pdF9ub3csCisgICoqIHdlIHdhaXQgb24gal9qb2luX3dhaXQuICBXZSB3aWxsIHdha2UgdXAgd2hlbiB0aGUgbGFzdCB3cml0ZXIgaGFzCisgICoqIGZpbmlzaGVkIHRoZSB0cmFuc2FjdGlvbiwgYW5kIHN0YXJ0ZWQgaXQgb24gaXRzIHdheSB0byB0aGUgZGlzay4KKyAgKiogVGhlbiwgd2UgZmx1c2ggdGhlIGNvbW1pdCBvciBqb3VybmFsIGxpc3QsIGFuZCBqdXN0IHJldHVybiAwIAorICAqKiBiZWNhdXNlIHRoZSByZXN0IG9mIGpvdXJuYWwgZW5kIHdhcyBhbHJlYWR5IGRvbmUgZm9yIHRoaXMgdHJhbnNhY3Rpb24uCisgICovCisgIGlmIChhdG9taWNfcmVhZCgmKGpvdXJuYWwtPmpfd2NvdW50KSkgPiAwKSB7CisgICAgaWYgKGZsdXNoIHx8IGNvbW1pdF9ub3cpIHsKKyAgICAgIHVuc2lnbmVkIHRyYW5zX2lkIDsKKworICAgICAgamwgPSBqb3VybmFsLT5qX2N1cnJlbnRfamw7CisgICAgICB0cmFuc19pZCA9IGpsLT5qX3RyYW5zX2lkOworICAgICAgaWYgKHdhaXRfb25fY29tbWl0KQorICAgICAgICBqbC0+al9zdGF0ZSB8PSBMSVNUX0NPTU1JVF9QRU5ESU5HOworICAgICAgYXRvbWljX3NldCgmKGpvdXJuYWwtPmpfamxvY2spLCAxKSA7CisgICAgICBpZiAoZmx1c2gpIHsKKyAgICAgICAgam91cm5hbC0+al9uZXh0X2Z1bGxfZmx1c2ggPSAxIDsKKyAgICAgIH0KKyAgICAgIHVubG9ja19qb3VybmFsKHBfc19zYikgOworCisgICAgICAvKiBzbGVlcCB3aGlsZSB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBpcyBzdGlsbCBqX2psb2NrZWQgKi8KKyAgICAgIHdoaWxlKGpvdXJuYWwtPmpfdHJhbnNfaWQgPT0gdHJhbnNfaWQpIHsKKwlpZiAoYXRvbWljX3JlYWQoJmpvdXJuYWwtPmpfamxvY2spKSB7CisJICAgIHF1ZXVlX2xvZ193cml0ZXIocF9zX3NiKTsKKyAgICAgICAgfSBlbHNlIHsKKwkgICAgbG9ja19qb3VybmFsKHBfc19zYik7CisJICAgIGlmIChqb3VybmFsLT5qX3RyYW5zX2lkID09IHRyYW5zX2lkKSB7CisJICAgICAgICBhdG9taWNfc2V0KCYoam91cm5hbC0+al9qbG9jayksIDEpIDsKKwkgICAgfQorCSAgICB1bmxvY2tfam91cm5hbChwX3Nfc2IpOworCX0KKyAgICAgIH0KKyAgICAgIGlmIChqb3VybmFsLT5qX3RyYW5zX2lkID09IHRyYW5zX2lkKSB7CisgICAgICAgICAgQlVHKCk7CisgICAgICB9CisgICAgICBpZiAoY29tbWl0X25vdyAmJiBqb3VybmFsX2xpc3Rfc3RpbGxfYWxpdmUocF9zX3NiLCB0cmFuc19pZCkgJiYKKyAgICAgICAgICB3YWl0X29uX2NvbW1pdCkKKyAgICAgIHsKKwkgIGZsdXNoX2NvbW1pdF9saXN0KHBfc19zYiwgamwsIDEpIDsKKyAgICAgIH0KKyAgICAgIHJldHVybiAwIDsKKyAgICB9IAorICAgIHVubG9ja19qb3VybmFsKHBfc19zYikgOworICAgIHJldHVybiAwIDsKKyAgfQorCisgIC8qIGRlYWwgd2l0aCBvbGQgdHJhbnNhY3Rpb25zIHdoZXJlIHdlIGFyZSB0aGUgbGFzdCB3cml0ZXJzICovCisgIG5vdyA9IGdldF9zZWNvbmRzKCk7CisgIGlmICgobm93IC0gam91cm5hbC0+al90cmFuc19zdGFydF90aW1lKSA+IGpvdXJuYWwtPmpfbWF4X3RyYW5zX2FnZSkgeworICAgIGNvbW1pdF9ub3cgPSAxIDsKKyAgICBqb3VybmFsLT5qX25leHRfYXN5bmNfZmx1c2ggPSAxIDsKKyAgfQorICAvKiBkb24ndCBiYXRjaCB3aGVuIHNvbWVvbmUgaXMgd2FpdGluZyBvbiBqX2pvaW5fd2FpdCAqLworICAvKiBkb24ndCBiYXRjaCB3aGVuIHN5bmNpbmcgdGhlIGNvbW1pdCBvciBmbHVzaGluZyB0aGUgd2hvbGUgdHJhbnMgKi8KKyAgaWYgKCEoam91cm5hbC0+al9tdXN0X3dhaXQgPiAwKSAmJiAhKGF0b21pY19yZWFkKCYoam91cm5hbC0+al9qbG9jaykpKSAmJiAhZmx1c2ggJiYgIWNvbW1pdF9ub3cgJiYKKyAgICAgIChqb3VybmFsLT5qX2xlbiA8IGpvdXJuYWwtPmpfbWF4X2JhdGNoKSAgJiYKKyAgICAgIGpvdXJuYWwtPmpfbGVuX2FsbG9jIDwgam91cm5hbC0+al9tYXhfYmF0Y2ggJiYgam91cm5hbC0+al9jbm9kZV9mcmVlID4gKGpvdXJuYWwtPmpfdHJhbnNfbWF4ICogMykpIHsKKyAgICBqb3VybmFsLT5qX2Jjb3VudCsrIDsKKyAgICB1bmxvY2tfam91cm5hbChwX3Nfc2IpIDsKKyAgICByZXR1cm4gMCA7CisgIH0KKworICBpZiAoam91cm5hbC0+al9zdGFydCA+IFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSkgeworICAgIHJlaXNlcmZzX3BhbmljKHBfc19zYiwgImpvdXJuYWwtMDAzOiBqb3VybmFsX2VuZDogal9zdGFydCAoJWxkKSBpcyB0b28gaGlnaFxuIiwgam91cm5hbC0+al9zdGFydCkgOworICB9CisgIHJldHVybiAxIDsKK30KKworLyoKKyoqIERvZXMgYWxsIHRoZSB3b3JrIHRoYXQgbWFrZXMgZGVsZXRpbmcgYmxvY2tzIHNhZmUuCisqKiB3aGVuIGRlbGV0aW5nIGEgYmxvY2sgbWFyayBCSF9KTmV3LCBqdXN0IHJlbW92ZSBpdCBmcm9tIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLCBjbGVhbiBpdCdzIGJ1ZmZlcl9oZWFkIGFuZCBtb3ZlIG9uLgorKiogCisqKiBvdGhlcndpc2U6CisqKiBzZXQgYSBiaXQgZm9yIHRoZSBibG9jayBpbiB0aGUgam91cm5hbCBiaXRtYXAuICBUaGF0IHdpbGwgcHJldmVudCBpdCBmcm9tIGJlaW5nIGFsbG9jYXRlZCBmb3IgdW5mb3JtYXR0ZWQgbm9kZXMKKyoqIGJlZm9yZSB0aGlzIHRyYW5zYWN0aW9uIGhhcyBmaW5pc2hlZC4KKyoqCisqKiBtYXJrIGFueSBjbm9kZXMgZm9yIHRoaXMgYmxvY2sgYXMgQkxPQ0tfRlJFRUQsIGFuZCBjbGVhciB0aGVpciBiaCBwb2ludGVycy4gIFRoYXQgd2lsbCBwcmV2ZW50IGFueSBvbGQgdHJhbnNhY3Rpb25zIHdpdGgKKyoqIHRoaXMgYmxvY2sgZnJvbSB0cnlpbmcgdG8gZmx1c2ggdG8gdGhlIHJlYWwgbG9jYXRpb24uICBTaW5jZSB3ZSBhcmVuJ3QgcmVtb3ZpbmcgdGhlIGNub2RlIGZyb20gdGhlIGpvdXJuYWxfbGlzdF9oYXNoLAorKiogdGhlIGJsb2NrIGNhbid0IGJlIHJlYWxsb2NhdGVkIHlldC4KKyoqCisqKiBUaGVuIHJlbW92ZSBpdCBmcm9tIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLCBkZWNyZW1lbnRpbmcgYW55IGNvdW50ZXJzIGFuZCBmaWxpbmcgaXQgb24gdGhlIGNsZWFuIGxpc3QuCisqLworaW50IGpvdXJuYWxfbWFya19mcmVlZChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgc3RydWN0IHN1cGVyX2Jsb2NrICpwX3Nfc2IsIGJfYmxvY2tucl90IGJsb2NrbnIpIHsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChwX3Nfc2IpOworICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9jbm9kZSAqY24gPSBOVUxMIDsKKyAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEwgOworICBzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKmpiID0gTlVMTCA7CisgIGludCBjbGVhbmVkID0gMCA7CisgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKworICBjbiA9IGdldF9qb3VybmFsX2hhc2hfZGV2KHBfc19zYiwgam91cm5hbC0+al9oYXNoX3RhYmxlLCBibG9ja25yKTsKKyAgaWYgKGNuICYmIGNuLT5iaCkgeworICAgICAgYmggPSBjbi0+YmggOworICAgICAgZ2V0X2JoKGJoKSA7CisgIH0KKyAgLyogaWYgaXQgaXMgam91cm5hbCBuZXcsIHdlIGp1c3QgcmVtb3ZlIGl0IGZyb20gdGhpcyB0cmFuc2FjdGlvbiAqLworICBpZiAoYmggJiYgYnVmZmVyX2pvdXJuYWxfbmV3KGJoKSkgeworICAgIGNsZWFyX2J1ZmZlcl9qb3VybmFsX25ldyAoYmgpOworICAgIGNsZWFyX3ByZXBhcmVkX2JpdHMoYmgpIDsKKyAgICByZWlzZXJmc19jbGVhbl9hbmRfZmlsZV9idWZmZXIoYmgpIDsKKyAgICBjbGVhbmVkID0gcmVtb3ZlX2Zyb21fdHJhbnNhY3Rpb24ocF9zX3NiLCBibG9ja25yLCBjbGVhbmVkKSA7CisgIH0gZWxzZSB7CisgICAgLyogc2V0IHRoZSBiaXQgZm9yIHRoaXMgYmxvY2sgaW4gdGhlIGpvdXJuYWwgYml0bWFwIGZvciB0aGlzIHRyYW5zYWN0aW9uICovCisgICAgamIgPSBqb3VybmFsLT5qX2N1cnJlbnRfamwtPmpfbGlzdF9iaXRtYXA7CisgICAgaWYgKCFqYikgeworICAgICAgcmVpc2VyZnNfcGFuaWMocF9zX3NiLCAiam91cm5hbC0xNzAyOiBqb3VybmFsX21hcmtfZnJlZWQsIGpvdXJuYWxfbGlzdF9iaXRtYXAgaXMgTlVMTFxuIikgOworICAgIH0KKyAgICBzZXRfYml0X2luX2xpc3RfYml0bWFwKHBfc19zYiwgYmxvY2tuciwgamIpIDsKKworICAgIC8qIE5vdGUsIHRoZSBlbnRpcmUgd2hpbGUgbG9vcCBpcyBub3QgYWxsb3dlZCB0byBzY2hlZHVsZS4gICovCisKKyAgICBpZiAoYmgpIHsKKyAgICAgIGNsZWFyX3ByZXBhcmVkX2JpdHMoYmgpIDsKKyAgICAgIHJlaXNlcmZzX2NsZWFuX2FuZF9maWxlX2J1ZmZlcihiaCkgOworICAgIH0KKyAgICBjbGVhbmVkID0gcmVtb3ZlX2Zyb21fdHJhbnNhY3Rpb24ocF9zX3NiLCBibG9ja25yLCBjbGVhbmVkKSA7CisKKyAgICAvKiBmaW5kIGFsbCBvbGRlciB0cmFuc2FjdGlvbnMgd2l0aCB0aGlzIGJsb2NrLCBtYWtlIHN1cmUgdGhleSBkb24ndCB0cnkgdG8gd3JpdGUgaXQgb3V0ICovCisgICAgY24gPSBnZXRfam91cm5hbF9oYXNoX2RldihwX3Nfc2Isam91cm5hbC0+al9saXN0X2hhc2hfdGFibGUsICBibG9ja25yKSA7CisgICAgd2hpbGUgKGNuKSB7CisgICAgICBpZiAocF9zX3NiID09IGNuLT5zYiAmJiBibG9ja25yID09IGNuLT5ibG9ja25yKSB7CisJc2V0X2JpdChCTE9DS19GUkVFRCwgJmNuLT5zdGF0ZSkgOworCWlmIChjbi0+YmgpIHsKKwkgIGlmICghY2xlYW5lZCkgeworCSAgICAvKiByZW1vdmVfZnJvbV90cmFuc2FjdGlvbiB3aWxsIGJyZWxzZSB0aGUgYnVmZmVyIGlmIGl0IHdhcyAKKwkgICAgKiogaW4gdGhlIGN1cnJlbnQgdHJhbnMKKwkgICAgKi8KKyAgICAgICAgICAgIGNsZWFyX2J1ZmZlcl9qb3VybmFsX2RpcnR5IChjbi0+YmgpOworCSAgICBjbGVhcl9idWZmZXJfZGlydHkoY24tPmJoKTsKKwkgICAgY2xlYXJfYnVmZmVyX2pvdXJuYWxfdGVzdChjbi0+YmgpOworCSAgICBjbGVhbmVkID0gMSA7CisJICAgIHB1dF9iaChjbi0+YmgpIDsKKwkgICAgaWYgKGF0b21pY19yZWFkKCYoY24tPmJoLT5iX2NvdW50KSkgPCAwKSB7CisJICAgICAgcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAiam91cm5hbC0yMTM4OiBjbi0+YmgtPmJfY291bnQgPCAwIik7CisJICAgIH0KKwkgIH0KKwkgIGlmIChjbi0+amxpc3QpIHsgLyogc2luY2Ugd2UgYXJlIGNsZWFyaW5nIHRoZSBiaCwgd2UgTVVTVCBkZWMgbm9uemVyb2xlbiAqLworCSAgICBhdG9taWNfZGVjKCYoY24tPmpsaXN0LT5qX25vbnplcm9sZW4pKSA7CisJICB9CisJICBjbi0+YmggPSBOVUxMIDsgCisJfSAKKyAgICAgIH0KKyAgICAgIGNuID0gY24tPmhuZXh0IDsKKyAgICB9CisgIH0KKworICBpZiAoYmgpIHsKKyAgICBwdXRfYmgoYmgpIDsgLyogZ2V0X2hhc2ggZ3JhYnMgdGhlIGJ1ZmZlciAqLworICAgIGlmIChhdG9taWNfcmVhZCgmKGJoLT5iX2NvdW50KSkgPCAwKSB7CisgICAgICByZWlzZXJmc193YXJuaW5nIChwX3Nfc2IsICJqb3VybmFsLTIxNjU6IGJoLT5iX2NvdW50IDwgMCIpOworICAgIH0KKyAgfQorICByZXR1cm4gMCA7Cit9CisKK3ZvaWQgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKHN0cnVjdCBpbm9kZSAqaW5vZGUpIHsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChpbm9kZS0+aV9zYik7CisgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2psID0gam91cm5hbC0+al9jdXJyZW50X2psOworICBSRUlTRVJGU19JKGlub2RlKS0+aV90cmFuc19pZCA9IGpvdXJuYWwtPmpfdHJhbnNfaWQgOworfQorCisvKgorICogcmV0dXJucyAtMSBvbiBlcnJvciwgMCBpZiBubyBjb21taXRzL2JhcnJpZXJzIHdlcmUgZG9uZSBhbmQgMQorICogaWYgYSB0cmFuc2FjdGlvbiB3YXMgYWN0dWFsbHkgY29tbWl0dGVkIGFuZCB0aGUgYmFycmllciB3YXMgZG9uZQorICovCitzdGF0aWMgaW50IF9fY29tbWl0X3RyYW5zX2psKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGxvbmcgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCkKK3sKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoIDsKKyAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2IgOworICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAoc2IpOworICAgIGludCByZXQgPSAwOworCisgICAgLyogaXMgaXQgZnJvbSB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiwgb3IgZnJvbSBhbiB1bmtub3duIHRyYW5zYWN0aW9uPyAqLworICAgIGlmIChpZCA9PSBqb3VybmFsLT5qX3RyYW5zX2lkKSB7CisJamwgPSBqb3VybmFsLT5qX2N1cnJlbnRfamw7CisJLyogdHJ5IHRvIGxldCBvdGhlciB3cml0ZXJzIGNvbWUgaW4gYW5kIGdyb3cgdGhpcyB0cmFuc2FjdGlvbiAqLworCWxldF90cmFuc2FjdGlvbl9ncm93KHNiLCBpZCk7CisJaWYgKGpvdXJuYWwtPmpfdHJhbnNfaWQgIT0gaWQpIHsKKwkgICAgZ290byBmbHVzaF9jb21taXRfb25seTsKKwl9CisKKwlyZXQgPSBqb3VybmFsX2JlZ2luKCZ0aCwgc2IsIDEpIDsKKwlpZiAocmV0KQorCSAgICByZXR1cm4gcmV0OworCisJLyogc29tZW9uZSBtaWdodCBoYXZlIGVuZGVkIHRoaXMgdHJhbnNhY3Rpb24gd2hpbGUgd2Ugam9pbmVkICovCisJaWYgKGpvdXJuYWwtPmpfdHJhbnNfaWQgIT0gaWQpIHsKKwkgICAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzYiwgU0JfQlVGRkVSX1dJVEhfU0Ioc2IpLCAxKSA7CisJICAgIGpvdXJuYWxfbWFya19kaXJ0eSgmdGgsIHNiLCBTQl9CVUZGRVJfV0lUSF9TQihzYikpIDsKKwkgICAgcmV0ID0gam91cm5hbF9lbmQoJnRoLCBzYiwgMSkgOworCSAgICBnb3RvIGZsdXNoX2NvbW1pdF9vbmx5OworCX0KKworCXJldCA9IGpvdXJuYWxfZW5kX3N5bmMoJnRoLCBzYiwgMSkgOworCWlmICghcmV0KQorCSAgICByZXQgPSAxOworCisgICAgfSBlbHNlIHsKKwkvKiB0aGlzIGdldHMgdHJpY2t5LCB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGUgam91cm5hbCBsaXN0IGluCisJICogdGhlIGlub2RlIHN0aWxsIGV4aXN0cy4gIFdlIGtub3cgdGhlIGxpc3QgaXMgc3RpbGwgYXJvdW5kCisJICogaWYgd2UndmUgZ290IGEgbGFyZ2VyIHRyYW5zYWN0aW9uIGlkIHRoYW4gdGhlIG9sZGVzdCBsaXN0CisJICovCitmbHVzaF9jb21taXRfb25seToKKwlpZiAoam91cm5hbF9saXN0X3N0aWxsX2FsaXZlKGlub2RlLT5pX3NiLCBpZCkpIHsKKwkgICAgLyoKKwkgICAgICogd2Ugb25seSBzZXQgcmV0IHRvIDEgd2hlbiB3ZSBrbm93IGZvciBzdXJlCisJICAgICAqIHRoZSBiYXJyaWVyIGhhc24ndCBiZWVuIHN0YXJ0ZWQgeWV0IG9uIHRoZSBjb21taXQKKwkgICAgICogYmxvY2suCisJICAgICAqLworCSAgICBpZiAoYXRvbWljX3JlYWQoJmpsLT5qX2NvbW1pdF9sZWZ0KSA+IDEpCisJICAgICAgICByZXQgPSAxOworCSAgICBmbHVzaF9jb21taXRfbGlzdChzYiwgamwsIDEpIDsKKwkgICAgaWYgKGpvdXJuYWwtPmpfZXJybm8pCisJCXJldCA9IGpvdXJuYWwtPmpfZXJybm87CisJfQorICAgIH0KKyAgICAvKiBvdGhlcndpc2UgdGhlIGxpc3QgaXMgZ29uZSwgYW5kIGxvbmcgc2luY2UgY29tbWl0dGVkICovCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IHJlaXNlcmZzX2NvbW1pdF9mb3JfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkgeworICAgIHVuc2lnbmVkIGxvbmcgaWQgPSBSRUlTRVJGU19JKGlub2RlKS0+aV90cmFuc19pZDsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCA9IFJFSVNFUkZTX0koaW5vZGUpLT5pX2psOworCisgICAgLyogZm9yIHRoZSB3aG9sZSBpbm9kZSwgYXNzdW1lIHVuc2V0IGlkIG1lYW5zIGl0IHdhcworICAgICAqIGNoYW5nZWQgaW4gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uICBNb3JlIGNvbnNlcnZhdGl2ZQorICAgICAqLworICAgIGlmICghaWQgfHwgIWpsKSB7CisJcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKSA7CisJaWQgPSBSRUlTRVJGU19JKGlub2RlKS0+aV90cmFuc19pZDsKKwkvKiBqbCB3aWxsIGJlIHVwZGF0ZWQgaW4gX19jb21taXRfdHJhbnNfamwgKi8KKyAgICB9CisKKyAgIHJldHVybiBfX2NvbW1pdF90cmFuc19qbChpbm9kZSwgaWQsIGpsKTsKK30KKwordm9pZCByZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBfc19zYiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpIHsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHBfc19zYik7CisgICAgUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBqb3VybmFsLnJlc3RvcmVfcHJlcGFyZWQgKTsKKyAgICBpZiAoIWJoKSB7CisJcmV0dXJuIDsKKyAgICB9CisgICAgaWYgKHRlc3RfY2xlYXJfYnVmZmVyX2pvdXJuYWxfcmVzdG9yZV9kaXJ0eSAoYmgpICYmCisJYnVmZmVyX2pvdXJuYWxfZGlydHkoYmgpKSB7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuOworCWNuID0gZ2V0X2pvdXJuYWxfaGFzaF9kZXYocF9zX3NiLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgam91cm5hbC0+al9saXN0X2hhc2hfdGFibGUsCisJCQkJICBiaC0+Yl9ibG9ja25yKTsKKwlpZiAoY24gJiYgY2FuX2RpcnR5KGNuKSkgeworICAgICAgICAgICAgc2V0X2J1ZmZlcl9qb3VybmFsX3Rlc3QgKGJoKTsKKwkgICAgbWFya19idWZmZXJfZGlydHkoYmgpOworICAgICAgICB9CisgICAgfQorICAgIGNsZWFyX2J1ZmZlcl9qb3VybmFsX3ByZXBhcmVkIChiaCk7Cit9CisKK2V4dGVybiBzdHJ1Y3QgdHJlZV9iYWxhbmNlICpjdXJfdGIgOworLyoKKyoqIGJlZm9yZSB3ZSBjYW4gY2hhbmdlIGEgbWV0YWRhdGEgYmxvY2ssIHdlIGhhdmUgdG8gbWFrZSBzdXJlIGl0IHdvbid0CisqKiBiZSB3cml0dGVuIHRvIGRpc2sgd2hpbGUgd2UgYXJlIGFsdGVyaW5nIGl0LiAgU28sIHdlIG11c3Q6CisqKiBjbGVhbiBpdAorKiogd2FpdCBvbiBpdC4KKyoqIAorKi8KK2ludCByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHN0cnVjdCBzdXBlcl9ibG9jayAqcF9zX3NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCB3YWl0KSB7CisgIFBST0NfSU5GT19JTkMoIHBfc19zYiwgam91cm5hbC5wcmVwYXJlICk7CisKKyAgICBpZiAodGVzdF9zZXRfYnVmZmVyX2xvY2tlZChiaCkpIHsKKwlpZiAoIXdhaXQpCisJICAgIHJldHVybiAwOworCWxvY2tfYnVmZmVyKGJoKTsKKyAgICB9CisgICAgc2V0X2J1ZmZlcl9qb3VybmFsX3ByZXBhcmVkIChiaCk7CisgICAgaWYgKHRlc3RfY2xlYXJfYnVmZmVyX2RpcnR5KGJoKSAmJiBidWZmZXJfam91cm5hbF9kaXJ0eShiaCkpICB7CisgICAgICAgIGNsZWFyX2J1ZmZlcl9qb3VybmFsX3Rlc3QgKGJoKTsKKyAgICAgICAgc2V0X2J1ZmZlcl9qb3VybmFsX3Jlc3RvcmVfZGlydHkgKGJoKTsKKyAgICB9CisgICAgdW5sb2NrX2J1ZmZlcihiaCk7CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGZsdXNoX29sZF9qb3VybmFsX2xpc3RzKHN0cnVjdCBzdXBlcl9ibG9jayAqcykgeworICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocyk7CisgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfbGlzdCAqamw7CisgICAgc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7CisgICAgdGltZV90IG5vdyA9IGdldF9zZWNvbmRzKCk7CisKKyAgICB3aGlsZSghbGlzdF9lbXB0eSgmam91cm5hbC0+al9qb3VybmFsX2xpc3QpKSB7CisgICAgICAgIGVudHJ5ID0gam91cm5hbC0+al9qb3VybmFsX2xpc3QubmV4dDsKKwlqbCA9IEpPVVJOQUxfTElTVF9FTlRSWShlbnRyeSk7CisJLyogdGhpcyBjaGVjayBzaG91bGQgYWx3YXlzIGJlIHJ1biwgdG8gc2VuZCBvbGQgbGlzdHMgdG8gZGlzayAqLworCWlmIChqbC0+al90aW1lc3RhbXAgPCAobm93IC0gKEpPVVJOQUxfTUFYX1RSQU5TX0FHRSAqIDQpKSkgeworCSAgICBmbHVzaF91c2VkX2pvdXJuYWxfbGlzdHMocywgamwpOworCX0gZWxzZSB7CisJICAgIGJyZWFrOworCX0KKyAgICB9Cit9CisKKy8qIAorKiogbG9uZyBhbmQgdWdseS4gIElmIGZsdXNoLCB3aWxsIG5vdCByZXR1cm4gdW50aWwgYWxsIGNvbW1pdAorKiogYmxvY2tzIGFuZCBhbGwgcmVhbCBidWZmZXJzIGluIHRoZSB0cmFucyBhcmUgb24gZGlzay4KKyoqIElmIG5vX2FzeW5jLCB3b24ndCByZXR1cm4gdW50aWwgYWxsIGNvbW1pdCBibG9ja3MgYXJlIG9uIGRpc2suCisqKgorKioga2VlcCByZWFkaW5nLCB0aGVyZSBhcmUgY29tbWVudHMgYXMgeW91IGdvIGFsb25nCisqKgorKiogSWYgdGhlIGpvdXJuYWwgaXMgYWJvcnRlZCwgd2UganVzdCBjbGVhbiB1cC4gVGhpbmdzIGxpa2UgZmx1c2hpbmcKKyoqIGpvdXJuYWwgbGlzdHMsIGV0YyBqdXN0IHdvbid0IGhhcHBlbi4KKyovCitzdGF0aWMgaW50IGRvX2pvdXJuYWxfZW5kKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgICogcF9zX3NiLCB1bnNpZ25lZCBsb25nIG5ibG9ja3MsIAorCQkgICAgICAgICAgaW50IGZsYWdzKSB7CisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsICpqb3VybmFsID0gU0JfSk9VUk5BTCAocF9zX3NiKTsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmNuLCAqbmV4dCwgKmpsX2NuOyAKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfY25vZGUgKmxhc3RfY24gPSBOVUxMOworICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjICpkZXNjIDsgCisgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2NvbW1pdCAqY29tbWl0IDsgCisgIHN0cnVjdCBidWZmZXJfaGVhZCAqY19iaCA7IC8qIGNvbW1pdCBiaCAqLworICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRfYmggOyAvKiBkZXNjIGJoICovCisgIGludCBjdXJfd3JpdGVfc3RhcnQgPSAwIDsgLyogc3RhcnQgaW5kZXggb2YgY3VycmVudCBsb2cgd3JpdGUgKi8KKyAgaW50IG9sZF9zdGFydCA7CisgIGludCBpIDsKKyAgaW50IGZsdXNoID0gZmxhZ3MgJiBGTFVTSF9BTEwgOworICBpbnQgd2FpdF9vbl9jb21taXQgPSBmbGFncyAmIFdBSVQgOworICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9saXN0ICpqbCwgKnRlbXBfamw7CisgIHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5LCAqc2FmZTsKKyAgdW5zaWduZWQgbG9uZyBqaW5kZXg7CisgIHVuc2lnbmVkIGxvbmcgY29tbWl0X3RyYW5zX2lkOworICBpbnQgdHJhbnNfaGFsZjsKKworICBCVUdfT04gKHRoLT50X3JlZmNvdW50ID4gMSk7CisgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKworICBjdXJyZW50LT5qb3VybmFsX2luZm8gPSB0aC0+dF9oYW5kbGVfc2F2ZTsKKyAgcmVpc2VyZnNfY2hlY2tfbG9ja19kZXB0aChwX3Nfc2IsICJqb3VybmFsIGVuZCIpOworICBpZiAoam91cm5hbC0+al9sZW4gPT0gMCkgeworICAgICAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChwX3Nfc2IsIFNCX0JVRkZFUl9XSVRIX1NCKHBfc19zYiksIDEpIDsKKyAgICAgIGpvdXJuYWxfbWFya19kaXJ0eSh0aCwgcF9zX3NiLCBTQl9CVUZGRVJfV0lUSF9TQihwX3Nfc2IpKSA7CisgIH0KKworICBsb2NrX2pvdXJuYWwocF9zX3NiKSA7CisgIGlmIChqb3VybmFsLT5qX25leHRfZnVsbF9mbHVzaCkgeworICAgIGZsYWdzIHw9IEZMVVNIX0FMTCA7CisgICAgZmx1c2ggPSAxIDsKKyAgfQorICBpZiAoam91cm5hbC0+al9uZXh0X2FzeW5jX2ZsdXNoKSB7CisgICAgZmxhZ3MgfD0gQ09NTUlUX05PVyB8IFdBSVQ7CisgICAgd2FpdF9vbl9jb21taXQgPSAxOworICB9CisKKyAgLyogY2hlY2tfam91cm5hbF9lbmQgbG9ja3MgdGhlIGpvdXJuYWwsIGFuZCB1bmxvY2tzIGlmIGl0IGRvZXMgbm90IHJldHVybiAxIAorICAqKiBpdCB0ZWxscyB1cyBpZiB3ZSBzaG91bGQgY29udGludWUgd2l0aCB0aGUgam91cm5hbF9lbmQsIG9yIGp1c3QgcmV0dXJuCisgICovCisgIGlmICghY2hlY2tfam91cm5hbF9lbmQodGgsIHBfc19zYiwgbmJsb2NrcywgZmxhZ3MpKSB7CisgICAgcF9zX3NiLT5zX2RpcnQgPSAxOworICAgIHdha2VfcXVldWVkX3dyaXRlcnMocF9zX3NiKTsKKyAgICByZWlzZXJmc19hc3luY19wcm9ncmVzc193YWl0KHBfc19zYik7CisgICAgZ290byBvdXQgOworICB9CisKKyAgLyogY2hlY2tfam91cm5hbF9lbmQgbWlnaHQgc2V0IHRoZXNlLCBjaGVjayBhZ2FpbiAqLworICBpZiAoam91cm5hbC0+al9uZXh0X2Z1bGxfZmx1c2gpIHsKKyAgICBmbHVzaCA9IDEgOworICB9CisKKyAgLyoKKyAgKiogaiBtdXN0IHdhaXQgbWVhbnMgd2UgaGF2ZSB0byBmbHVzaCB0aGUgbG9nIGJsb2NrcywgYW5kIHRoZSByZWFsIGJsb2NrcyBmb3IKKyAgKiogdGhpcyB0cmFuc2FjdGlvbgorICAqLworICBpZiAoam91cm5hbC0+al9tdXN0X3dhaXQgPiAwKSB7CisgICAgZmx1c2ggPSAxIDsKKyAgfQorCisjaWZkZWYgUkVJU0VSRlNfUFJFQUxMT0NBVEUKKyAgLyogcXVvdGEgb3BzIG1pZ2h0IG5lZWQgdG8gbmVzdCwgc2V0dXAgdGhlIGpvdXJuYWxfaW5mbyBwb2ludGVyIGZvciB0aGVtICovCisgIGN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IHRoIDsKKyAgcmVpc2VyZnNfZGlzY2FyZF9hbGxfcHJlYWxsb2ModGgpOyAvKiBpdCBzaG91bGQgbm90IGludm9sdmUgbmV3IGJsb2NrcyBpbnRvCisJCQkJICAgICAgKiB0aGUgdHJhbnNhY3Rpb24gKi8KKyAgY3VycmVudC0+am91cm5hbF9pbmZvID0gdGgtPnRfaGFuZGxlX3NhdmUgOworI2VuZGlmCisgIAorICAvKiBzZXR1cCBkZXNjcmlwdGlvbiBibG9jayAqLworICBkX2JoID0gam91cm5hbF9nZXRibGsocF9zX3NiLCBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArIGpvdXJuYWwtPmpfc3RhcnQpIDsKKyAgc2V0X2J1ZmZlcl91cHRvZGF0ZShkX2JoKTsKKyAgZGVzYyA9IChzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbF9kZXNjICopKGRfYmgpLT5iX2RhdGEgOworICBtZW1zZXQoZF9iaC0+Yl9kYXRhLCAwLCBkX2JoLT5iX3NpemUpIDsKKyAgbWVtY3B5KGdldF9qb3VybmFsX2Rlc2NfbWFnaWMgKGRfYmgpLCBKT1VSTkFMX0RFU0NfTUFHSUMsIDgpIDsKKyAgc2V0X2Rlc2NfdHJhbnNfaWQoZGVzYywgam91cm5hbC0+al90cmFuc19pZCkgOworCisgIC8qIHNldHVwIGNvbW1pdCBibG9jay4gIERvbid0IHdyaXRlIChrZWVwIGl0IGNsZWFuIHRvbykgdGhpcyBvbmUgdW50aWwgYWZ0ZXIgZXZlcnlvbmUgZWxzZSBpcyB3cml0dGVuICovCisgIGNfYmggPSAgam91cm5hbF9nZXRibGsocF9zX3NiLCBTQl9PTkRJU0tfSk9VUk5BTF8xc3RfQkxPQ0socF9zX3NiKSArIAorCQkgKChqb3VybmFsLT5qX3N0YXJ0ICsgam91cm5hbC0+al9sZW4gKyAxKSAlIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSkpIDsKKyAgY29tbWl0ID0gKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2NvbW1pdCAqKWNfYmgtPmJfZGF0YSA7CisgIG1lbXNldChjX2JoLT5iX2RhdGEsIDAsIGNfYmgtPmJfc2l6ZSkgOworICBzZXRfY29tbWl0X3RyYW5zX2lkKGNvbW1pdCwgam91cm5hbC0+al90cmFuc19pZCkgOworICBzZXRfYnVmZmVyX3VwdG9kYXRlKGNfYmgpIDsKKworICAvKiBpbml0IHRoaXMgam91cm5hbCBsaXN0ICovCisgIGpsID0gam91cm5hbC0+al9jdXJyZW50X2psOworCisgIC8qIHdlIGxvY2sgdGhlIGNvbW1pdCBiZWZvcmUgZG9pbmcgYW55dGhpbmcgYmVjYXVzZQorICAgKiB3ZSB3YW50IHRvIG1ha2Ugc3VyZSBub2JvZHkgdHJpZXMgdG8gcnVuIGZsdXNoX2NvbW1pdF9saXN0IHVudGlsCisgICAqIHRoZSBuZXcgdHJhbnNhY3Rpb24gaXMgZnVsbHkgc2V0dXAsIGFuZCB3ZSd2ZSBhbHJlYWR5IGZsdXNoZWQgdGhlCisgICAqIG9yZGVyZWQgYmggbGlzdAorICAgKi8KKyAgZG93bigmamwtPmpfY29tbWl0X2xvY2spOworCisgIC8qIHNhdmUgdGhlIHRyYW5zYWN0aW9uIGlkIGluIGNhc2Ugd2UgbmVlZCB0byBjb21taXQgaXQgbGF0ZXIgKi8KKyAgY29tbWl0X3RyYW5zX2lkID0gamwtPmpfdHJhbnNfaWQ7CisKKyAgYXRvbWljX3NldCgmamwtPmpfb2xkZXJfY29tbWl0c19kb25lLCAwKSA7CisgIGpsLT5qX3RyYW5zX2lkID0gam91cm5hbC0+al90cmFuc19pZCA7CisgIGpsLT5qX3RpbWVzdGFtcCA9IGpvdXJuYWwtPmpfdHJhbnNfc3RhcnRfdGltZSA7CisgIGpsLT5qX2NvbW1pdF9iaCA9IGNfYmggOworICBqbC0+al9zdGFydCA9IGpvdXJuYWwtPmpfc3RhcnQgOworICBqbC0+al9sZW4gPSBqb3VybmFsLT5qX2xlbiA7CisgIGF0b21pY19zZXQoJmpsLT5qX25vbnplcm9sZW4sIGpvdXJuYWwtPmpfbGVuKSA7CisgIGF0b21pY19zZXQoJmpsLT5qX2NvbW1pdF9sZWZ0LCBqb3VybmFsLT5qX2xlbiArIDIpOworICBqbC0+al9yZWFsYmxvY2sgPSBOVUxMIDsKKworICAvKiBUaGUgRU5USVJFIEZPUiBMT09QIE1VU1Qgbm90IGNhdXNlIHNjaGVkdWxlIHRvIG9jY3VyLgorICAqKiAgZm9yIGVhY2ggcmVhbCBibG9jaywgYWRkIGl0IHRvIHRoZSBqb3VybmFsIGxpc3QgaGFzaCwKKyAgKiogY29weSBpbnRvIHJlYWwgYmxvY2sgaW5kZXggYXJyYXkgaW4gdGhlIGNvbW1pdCBvciBkZXNjIGJsb2NrCisgICovCisgIHRyYW5zX2hhbGYgPSBqb3VybmFsX3RyYW5zX2hhbGYocF9zX3NiLT5zX2Jsb2Nrc2l6ZSk7CisgIGZvciAoaSA9IDAsIGNuID0gam91cm5hbC0+al9maXJzdCA7IGNuIDsgY24gPSBjbi0+bmV4dCwgaSsrKSB7CisgICAgaWYgKGJ1ZmZlcl9qb3VybmFsZWQgKGNuLT5iaCkpIHsKKyAgICAgIGpsX2NuID0gZ2V0X2Nub2RlKHBfc19zYikgOworICAgICAgaWYgKCFqbF9jbikgeworICAgICAgICByZWlzZXJmc19wYW5pYyhwX3Nfc2IsICJqb3VybmFsLTE2NzYsIGdldF9jbm9kZSByZXR1cm5lZCBOVUxMXG4iKSA7CisgICAgICB9CisgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgIGpsLT5qX3JlYWxibG9jayA9IGpsX2NuIDsKKyAgICAgIH0KKyAgICAgIGpsX2NuLT5wcmV2ID0gbGFzdF9jbiA7CisgICAgICBqbF9jbi0+bmV4dCA9IE5VTEwgOworICAgICAgaWYgKGxhc3RfY24pIHsKKyAgICAgICAgbGFzdF9jbi0+bmV4dCA9IGpsX2NuIDsKKyAgICAgIH0KKyAgICAgIGxhc3RfY24gPSBqbF9jbiA7CisgICAgICAvKiBtYWtlIHN1cmUgdGhlIGJsb2NrIHdlIGFyZSB0cnlpbmcgdG8gbG9nIGlzIG5vdCBhIGJsb2NrIAorICAgICAgICAgb2Ygam91cm5hbCBvciByZXNlcnZlZCBhcmVhICovCisKKyAgICAgIGlmIChpc19ibG9ja19pbl9sb2dfb3JfcmVzZXJ2ZWRfYXJlYShwX3Nfc2IsIGNuLT5iaC0+Yl9ibG9ja25yKSkgeworICAgICAgICByZWlzZXJmc19wYW5pYyhwX3Nfc2IsICJqb3VybmFsLTIzMzI6IFRyeWluZyB0byBsb2cgYmxvY2sgJWx1LCB3aGljaCBpcyBhIGxvZyBibG9ja1xuIiwgY24tPmJoLT5iX2Jsb2NrbnIpIDsKKyAgICAgIH0KKyAgICAgIGpsX2NuLT5ibG9ja25yID0gY24tPmJoLT5iX2Jsb2NrbnIgOyAKKyAgICAgIGpsX2NuLT5zdGF0ZSA9IDAgOworICAgICAgamxfY24tPnNiID0gcF9zX3NiOworICAgICAgamxfY24tPmJoID0gY24tPmJoIDsKKyAgICAgIGpsX2NuLT5qbGlzdCA9IGpsOworICAgICAgaW5zZXJ0X2pvdXJuYWxfaGFzaChqb3VybmFsLT5qX2xpc3RfaGFzaF90YWJsZSwgamxfY24pIDsKKyAgICAgIGlmIChpIDwgdHJhbnNfaGFsZikgeworCWRlc2MtPmpfcmVhbGJsb2NrW2ldID0gY3B1X3RvX2xlMzIoY24tPmJoLT5iX2Jsb2NrbnIpIDsKKyAgICAgIH0gZWxzZSB7CisJY29tbWl0LT5qX3JlYWxibG9ja1tpIC0gdHJhbnNfaGFsZl0gPSBjcHVfdG9fbGUzMihjbi0+YmgtPmJfYmxvY2tucikgOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpLS0gOworICAgIH0KKyAgfQorICBzZXRfZGVzY190cmFuc19sZW4oZGVzYywgam91cm5hbC0+al9sZW4pIDsKKyAgc2V0X2Rlc2NfbW91bnRfaWQoZGVzYywgam91cm5hbC0+al9tb3VudF9pZCkgOworICBzZXRfZGVzY190cmFuc19pZChkZXNjLCBqb3VybmFsLT5qX3RyYW5zX2lkKSA7CisgIHNldF9jb21taXRfdHJhbnNfbGVuKGNvbW1pdCwgam91cm5hbC0+al9sZW4pOworCisgIC8qIHNwZWNpYWwgY2hlY2sgaW4gY2FzZSBhbGwgYnVmZmVycyBpbiB0aGUgam91cm5hbCB3ZXJlIG1hcmtlZCBmb3Igbm90IGxvZ2dpbmcgKi8KKyAgaWYgKGpvdXJuYWwtPmpfbGVuID09IDApIHsKKyAgICBCVUcoKTsKKyAgfQorCisgIC8qIHdlJ3JlIGFib3V0IHRvIGRpcnR5IGFsbCB0aGUgbG9nIGJsb2NrcywgbWFyayB0aGUgZGVzY3JpcHRpb24gYmxvY2sKKyAgICogZGlydHkgbm93IHRvby4gIERvbid0IG1hcmsgdGhlIGNvbW1pdCBibG9jayBkaXJ0eSB1bnRpbCBhbGwgdGhlCisgICAqIG90aGVycyBhcmUgb24gZGlzaworICAgKi8KKyAgbWFya19idWZmZXJfZGlydHkoZF9iaCk7CisKKyAgLyogZmlyc3QgZGF0YSBibG9jayBpcyBqX3N0YXJ0ICsgMSwgc28gYWRkIG9uZSB0byBjdXJfd3JpdGVfc3RhcnQgd2hlcmV2ZXIgeW91IHVzZSBpdCAqLworICBjdXJfd3JpdGVfc3RhcnQgPSBqb3VybmFsLT5qX3N0YXJ0IDsKKyAgY24gPSBqb3VybmFsLT5qX2ZpcnN0IDsKKyAgamluZGV4ID0gMSA7IC8qIHN0YXJ0IGF0IG9uZSBzbyB3ZSBkb24ndCBnZXQgdGhlIGRlc2MgYWdhaW4gKi8KKyAgd2hpbGUoY24pIHsKKyAgICBjbGVhcl9idWZmZXJfam91cm5hbF9uZXcgKGNuLT5iaCk7CisgICAgLyogY29weSBhbGwgdGhlIHJlYWwgYmxvY2tzIGludG8gbG9nIGFyZWEuICBkaXJ0eSBsb2cgYmxvY2tzICovCisgICAgaWYgKGJ1ZmZlcl9qb3VybmFsZWQgKGNuLT5iaCkpIHsKKyAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqdG1wX2JoIDsKKyAgICAgIGNoYXIgKmFkZHI7CisgICAgICBzdHJ1Y3QgcGFnZSAqcGFnZTsKKyAgICAgIHRtcF9iaCA9ICBqb3VybmFsX2dldGJsayhwX3Nfc2IsIFNCX09ORElTS19KT1VSTkFMXzFzdF9CTE9DSyhwX3Nfc2IpICsgCisJCSAgICAgICAoKGN1cl93cml0ZV9zdGFydCArIGppbmRleCkgJSBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpKSA7CisgICAgICBzZXRfYnVmZmVyX3VwdG9kYXRlKHRtcF9iaCk7CisgICAgICBwYWdlID0gY24tPmJoLT5iX3BhZ2U7CisgICAgICBhZGRyID0ga21hcChwYWdlKTsKKyAgICAgIG1lbWNweSh0bXBfYmgtPmJfZGF0YSwgYWRkciArIG9mZnNldF9pbl9wYWdlKGNuLT5iaC0+Yl9kYXRhKSwKKyAgICAgICAgICAgICBjbi0+YmgtPmJfc2l6ZSk7CisgICAgICBrdW5tYXAocGFnZSk7CisgICAgICBtYXJrX2J1ZmZlcl9kaXJ0eSh0bXBfYmgpOworICAgICAgamluZGV4KysgOworICAgICAgc2V0X2J1ZmZlcl9qb3VybmFsX2RpcnR5IChjbi0+YmgpOworICAgICAgY2xlYXJfYnVmZmVyX2pvdXJuYWxlZCAoY24tPmJoKTsKKyAgICB9IGVsc2UgeworICAgICAgLyogSkRpcnR5IGNsZWFyZWQgc29tZXRpbWUgZHVyaW5nIHRyYW5zYWN0aW9uLiAgZG9uJ3QgbG9nIHRoaXMgb25lICovCisgICAgICByZWlzZXJmc193YXJuaW5nKHBfc19zYiwgImpvdXJuYWwtMjA0ODogZG9fam91cm5hbF9lbmQ6IEJBRCwgYnVmZmVyIGluIGpvdXJuYWwgaGFzaCwgYnV0IG5vdCBKRGlydHkhIikgOworICAgICAgYnJlbHNlKGNuLT5iaCkgOworICAgIH0KKyAgICBuZXh0ID0gY24tPm5leHQgOworICAgIGZyZWVfY25vZGUocF9zX3NiLCBjbikgOworICAgIGNuID0gbmV4dCA7CisgICAgY29uZF9yZXNjaGVkKCk7CisgIH0KKworICAvKiB3ZSBhcmUgZG9uZSAgd2l0aCBib3RoIHRoZSBjX2JoIGFuZCBkX2JoLCBidXQKKyAgKiogY19iaCBtdXN0IGJlIHdyaXR0ZW4gYWZ0ZXIgYWxsIG90aGVyIGNvbW1pdCBibG9ja3MsCisgICoqIHNvIHdlIGRpcnR5L3JlbHNlIGNfYmggaW4gZmx1c2hfY29tbWl0X2xpc3QsIHdpdGggY29tbWl0X2xlZnQgPD0gMS4KKyAgKi8KKworICBqb3VybmFsLT5qX2N1cnJlbnRfamwgPSBhbGxvY19qb3VybmFsX2xpc3QocF9zX3NiKTsKKworICAvKiBub3cgaXQgaXMgc2FmZSB0byBpbnNlcnQgdGhpcyB0cmFuc2FjdGlvbiBvbiB0aGUgbWFpbiBsaXN0ICovCisgIGxpc3RfYWRkX3RhaWwoJmpsLT5qX2xpc3QsICZqb3VybmFsLT5qX2pvdXJuYWxfbGlzdCk7CisgIGxpc3RfYWRkX3RhaWwoJmpsLT5qX3dvcmtpbmdfbGlzdCwgJmpvdXJuYWwtPmpfd29ya2luZ19saXN0KTsKKyAgam91cm5hbC0+al9udW1fd29ya19saXN0cysrOworCisgIC8qIHJlc2V0IGpvdXJuYWwgdmFsdWVzIGZvciB0aGUgbmV4dCB0cmFuc2FjdGlvbiAqLworICBvbGRfc3RhcnQgPSBqb3VybmFsLT5qX3N0YXJ0IDsKKyAgam91cm5hbC0+al9zdGFydCA9IChqb3VybmFsLT5qX3N0YXJ0ICsgam91cm5hbC0+al9sZW4gKyAyKSAlIFNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKTsKKyAgYXRvbWljX3NldCgmKGpvdXJuYWwtPmpfd2NvdW50KSwgMCkgOworICBqb3VybmFsLT5qX2Jjb3VudCA9IDAgOworICBqb3VybmFsLT5qX2xhc3QgPSBOVUxMIDsKKyAgam91cm5hbC0+al9maXJzdCA9IE5VTEwgOworICBqb3VybmFsLT5qX2xlbiA9IDAgOworICBqb3VybmFsLT5qX3RyYW5zX3N0YXJ0X3RpbWUgPSAwIDsKKyAgam91cm5hbC0+al90cmFuc19pZCsrIDsKKyAgam91cm5hbC0+al9jdXJyZW50X2psLT5qX3RyYW5zX2lkID0gam91cm5hbC0+al90cmFuc19pZDsKKyAgam91cm5hbC0+al9tdXN0X3dhaXQgPSAwIDsKKyAgam91cm5hbC0+al9sZW5fYWxsb2MgPSAwIDsKKyAgam91cm5hbC0+al9uZXh0X2Z1bGxfZmx1c2ggPSAwIDsKKyAgam91cm5hbC0+al9uZXh0X2FzeW5jX2ZsdXNoID0gMCA7CisgIGluaXRfam91cm5hbF9oYXNoKHBfc19zYikgOyAKKworICAvLyBtYWtlIHN1cmUgcmVpc2VyZnNfYWRkX2poIHNlZXMgdGhlIG5ldyBjdXJyZW50X2psIGJlZm9yZSB3ZQorICAvLyB3cml0ZSBvdXQgdGhlIHRhaWxzCisgIHNtcF9tYigpOworCisgIC8qIHRhaWwgY29udmVyc2lvbiB0YXJnZXRzIGhhdmUgdG8gaGl0IHRoZSBkaXNrIGJlZm9yZSB3ZSBlbmQgdGhlCisgICAqIHRyYW5zYWN0aW9uLiAgT3RoZXJ3aXNlIGEgbGF0ZXIgdHJhbnNhY3Rpb24gbWlnaHQgcmVwYWNrIHRoZSB0YWlsCisgICAqIGJlZm9yZSB0aGlzIHRyYW5zYWN0aW9uIGNvbW1pdHMsIGxlYXZpbmcgdGhlIGRhdGEgYmxvY2sgdW5mbHVzaGVkIGFuZAorICAgKiBjbGVhbiwgaWYgd2UgY3Jhc2ggYmVmb3JlIHRoZSBsYXRlciB0cmFuc2FjdGlvbiBjb21taXRzLCB0aGUgZGF0YSBibG9jaworICAgKiBpcyBsb3N0LgorICAgKi8KKyAgaWYgKCFsaXN0X2VtcHR5KCZqbC0+al90YWlsX2JoX2xpc3QpKSB7CisgICAgICB1bmxvY2tfa2VybmVsKCk7CisgICAgICB3cml0ZV9vcmRlcmVkX2J1ZmZlcnMoJmpvdXJuYWwtPmpfZGlydHlfYnVmZmVyc19sb2NrLAorCQkJICAgIGpvdXJuYWwsIGpsLCAmamwtPmpfdGFpbF9iaF9saXN0KTsKKyAgICAgIGxvY2tfa2VybmVsKCk7CisgIH0KKyAgaWYgKCFsaXN0X2VtcHR5KCZqbC0+al90YWlsX2JoX2xpc3QpKQorICAgICAgQlVHKCk7CisgIHVwKCZqbC0+al9jb21taXRfbG9jayk7CisKKyAgLyogaG9ub3IgdGhlIGZsdXNoIHdpc2hlcyBmcm9tIHRoZSBjYWxsZXIsIHNpbXBsZSBjb21taXRzIGNhbgorICAqKiBiZSBkb25lIG91dHNpZGUgdGhlIGpvdXJuYWwgbG9jaywgdGhleSBhcmUgZG9uZSBiZWxvdworICAqKgorICAqKiBpZiB3ZSBkb24ndCBmbHVzaCB0aGUgY29tbWl0IGxpc3QgcmlnaHQgbm93LCB3ZSBwdXQgaXQgaW50bworICAqKiB0aGUgd29yayBxdWV1ZSBzbyB0aGUgcGVvcGxlIHdhaXRpbmcgb24gdGhlIGFzeW5jIHByb2dyZXNzIHdvcmsKKyAgKiogcXVldWUgZG9uJ3Qgd2FpdCBmb3IgdGhpcyBwcm9jIHRvIGZsdXNoIGpvdXJuYWwgbGlzdHMgYW5kIHN1Y2guCisgICovCisgIGlmIChmbHVzaCkgeworICAgIGZsdXNoX2NvbW1pdF9saXN0KHBfc19zYiwgamwsIDEpIDsKKyAgICBmbHVzaF9qb3VybmFsX2xpc3QocF9zX3NiLCBqbCwgMSkgOworICB9IGVsc2UgaWYgKCEoamwtPmpfc3RhdGUgJiBMSVNUX0NPTU1JVF9QRU5ESU5HKSkKKyAgICBxdWV1ZV9kZWxheWVkX3dvcmsoY29tbWl0X3dxLCAmam91cm5hbC0+al93b3JrLCBIWi8xMCk7CisKKworICAvKiBpZiB0aGUgbmV4dCB0cmFuc2FjdGlvbiBoYXMgYW55IGNoYW5jZSBvZiB3cmFwcGluZywgZmx1c2ggCisgICoqIHRyYW5zYWN0aW9ucyB0aGF0IG1pZ2h0IGdldCBvdmVyd3JpdHRlbi4gIElmIGFueSBqb3VybmFsIGxpc3RzIGFyZSB2ZXJ5IAorICAqKiBvbGQgZmx1c2ggdGhlbSBhcyB3ZWxsLiAgCisgICovCitmaXJzdF9qbDoKKyAgbGlzdF9mb3JfZWFjaF9zYWZlKGVudHJ5LCBzYWZlLCAmam91cm5hbC0+al9qb3VybmFsX2xpc3QpIHsKKyAgICB0ZW1wX2psID0gSk9VUk5BTF9MSVNUX0VOVFJZKGVudHJ5KTsKKyAgICBpZiAoam91cm5hbC0+al9zdGFydCA8PSB0ZW1wX2psLT5qX3N0YXJ0KSB7CisgICAgICBpZiAoKGpvdXJuYWwtPmpfc3RhcnQgKyBqb3VybmFsLT5qX3RyYW5zX21heCArIDEpID49CisgICAgICAgICAgdGVtcF9qbC0+al9zdGFydCkKKyAgICAgIHsKKwlmbHVzaF91c2VkX2pvdXJuYWxfbGlzdHMocF9zX3NiLCB0ZW1wX2psKTsKKwlnb3RvIGZpcnN0X2psOworICAgICAgfSBlbHNlIGlmICgoam91cm5hbC0+al9zdGFydCArCisgICAgICAgICAgICAgICAgICBqb3VybmFsLT5qX3RyYW5zX21heCArIDEpIDwKKwkJICBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpCisgICAgICB7CisgICAgICAgICAgLyogaWYgd2UgZG9uJ3QgY3Jvc3MgaW50byB0aGUgbmV4dCB0cmFuc2FjdGlvbiBhbmQgd2UgZG9uJ3QKKwkgICAqIHdyYXAsIHRoZXJlIGlzIG5vIHdheSB3ZSBjYW4gb3ZlcmxhcCBhbnkgbGF0ZXIgdHJhbnNhY3Rpb25zCisJICAgKiBicmVhayBub3cKKwkgICAqLworCSAgYnJlYWs7CisgICAgICB9CisgICAgfSBlbHNlIGlmICgoam91cm5hbC0+al9zdGFydCArCisgICAgICAgICAgICAgICAgam91cm5hbC0+al90cmFuc19tYXggKyAxKSA+CisJCVNCX09ORElTS19KT1VSTkFMX1NJWkUocF9zX3NiKSkKKyAgICB7CisgICAgICBpZiAoKChqb3VybmFsLT5qX3N0YXJ0ICsgam91cm5hbC0+al90cmFuc19tYXggKyAxKSAlCisgICAgICAgICAgICBTQl9PTkRJU0tfSk9VUk5BTF9TSVpFKHBfc19zYikpID49IHRlbXBfamwtPmpfc3RhcnQpCisgICAgICB7CisJZmx1c2hfdXNlZF9qb3VybmFsX2xpc3RzKHBfc19zYiwgdGVtcF9qbCk7CisJZ290byBmaXJzdF9qbDsKKyAgICAgIH0gZWxzZSB7CisJICAvKiB3ZSBkb24ndCBvdmVybGFwIGFueXRoaW5nIGZyb20gb3V0IHN0YXJ0IHRvIHRoZSBlbmQgb2YgdGhlCisJICAgKiBsb2csIGFuZCBvdXIgd3JhcHBlZCBwb3J0aW9uIGRvZXNuJ3Qgb3ZlcmxhcCBhbnl0aGluZyBhdAorCSAgICogdGhlIHN0YXJ0IG9mIHRoZSBsb2cuICBXZSBjYW4gYnJlYWsKKwkgICAqLworCSAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIGZsdXNoX29sZF9qb3VybmFsX2xpc3RzKHBfc19zYik7CisKKyAgam91cm5hbC0+al9jdXJyZW50X2psLT5qX2xpc3RfYml0bWFwID0gZ2V0X2xpc3RfYml0bWFwKHBfc19zYiwgam91cm5hbC0+al9jdXJyZW50X2psKSA7CisKKyAgaWYgKCEoam91cm5hbC0+al9jdXJyZW50X2psLT5qX2xpc3RfYml0bWFwKSkgeworICAgIHJlaXNlcmZzX3BhbmljKHBfc19zYiwgImpvdXJuYWwtMTk5NjogZG9fam91cm5hbF9lbmQsIGNvdWxkIG5vdCBnZXQgYSBsaXN0IGJpdG1hcFxuIikgOworICB9CisKKyAgYXRvbWljX3NldCgmKGpvdXJuYWwtPmpfamxvY2spLCAwKSA7CisgIHVubG9ja19qb3VybmFsKHBfc19zYikgOworICAvKiB3YWtlIHVwIGFueSBib2R5IHdhaXRpbmcgdG8gam9pbi4gKi8KKyAgY2xlYXJfYml0KEpfV1JJVEVSU19RVUVVRUQsICZqb3VybmFsLT5qX3N0YXRlKTsKKyAgd2FrZV91cCgmKGpvdXJuYWwtPmpfam9pbl93YWl0KSkgOworCisgIGlmICghZmx1c2ggJiYgd2FpdF9vbl9jb21taXQgJiYKKyAgICAgIGpvdXJuYWxfbGlzdF9zdGlsbF9hbGl2ZShwX3Nfc2IsIGNvbW1pdF90cmFuc19pZCkpIHsKKwkgIGZsdXNoX2NvbW1pdF9saXN0KHBfc19zYiwgamwsIDEpIDsKKyAgfQorb3V0OgorICByZWlzZXJmc19jaGVja19sb2NrX2RlcHRoKHBfc19zYiwgImpvdXJuYWwgZW5kMiIpOworCisgIG1lbXNldCAodGgsIDAsIHNpemVvZiAoKnRoKSk7CisgIC8qIFJlLXNldCB0aC0+dF9zdXBlciwgc28gd2UgY2FuIHByb3Blcmx5IGtlZXAgdHJhY2sgb2YgaG93IG1hbnkKKyAgICogcGVyc2lzdGVudCB0cmFuc2FjdGlvbnMgdGhlcmUgYXJlLiBXZSBuZWVkIHRvIGRvIHRoaXMgc28gaWYgdGhpcworICAgKiBjYWxsIGlzIHBhcnQgb2YgYSBmYWlsZWQgcmVzdGFydF90cmFuc2FjdGlvbiwgd2UgY2FuIGZyZWUgaXQgbGF0ZXIgKi8KKyAgdGgtPnRfc3VwZXIgPSBwX3Nfc2I7CisKKyAgcmV0dXJuIGpvdXJuYWwtPmpfZXJybm87Cit9CisKK3N0YXRpYyB2b2lkCitfX3JlaXNlcmZzX2pvdXJuYWxfYWJvcnRfaGFyZCAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfam91cm5hbCAqam91cm5hbCA9IFNCX0pPVVJOQUwgKHNiKTsKKyAgICBpZiAodGVzdF9iaXQgKEpfQUJPUlRFRCwgJmpvdXJuYWwtPmpfc3RhdGUpKQorICAgICAgICByZXR1cm47CisKKyAgICBwcmludGsgKEtFUk5fQ1JJVCAiUkVJU0VSRlM6IEFib3J0aW5nIGpvdXJuYWwgZm9yIGZpbGVzeXN0ZW0gb24gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgcmVpc2VyZnNfYmRldm5hbWUgKHNiKSk7CisKKyAgICBzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CisgICAgc2V0X2JpdCAoSl9BQk9SVEVELCAmam91cm5hbC0+al9zdGF0ZSk7CisKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKyAgICBkdW1wX3N0YWNrKCk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQKK19fcmVpc2VyZnNfam91cm5hbF9hYm9ydF9zb2Z0IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZXJybm8pCit7CisgICAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMIChzYik7CisgICAgaWYgKHRlc3RfYml0IChKX0FCT1JURUQsICZqb3VybmFsLT5qX3N0YXRlKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCFqb3VybmFsLT5qX2Vycm5vKQorICAgICAgICBqb3VybmFsLT5qX2Vycm5vID0gZXJybm87CisKKyAgICBfX3JlaXNlcmZzX2pvdXJuYWxfYWJvcnRfaGFyZCAoc2IpOworfQorCit2b2lkCityZWlzZXJmc19qb3VybmFsX2Fib3J0IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZXJybm8pCit7CisgICAgcmV0dXJuIF9fcmVpc2VyZnNfam91cm5hbF9hYm9ydF9zb2Z0IChzYiwgZXJybm8pOworfQpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvbGJhbGFuY2UuYyBiL2ZzL3JlaXNlcmZzL2xiYWxhbmNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQwNjYwOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3JlaXNlcmZzL2xiYWxhbmNlLmMKQEAgLTAsMCArMSwxMjIyIEBACisvKgorICogQ29weXJpZ2h0IDIwMDAgYnkgSGFucyBSZWlzZXIsIGxpY2Vuc2luZyBnb3Zlcm5lZCBieSByZWlzZXJmcy9SRUFETUUKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorCisvKiB0aGVzZSBhcmUgdXNlZCBpbiBkb19iYWxhbmNlLmMgKi8KKworLyogbGVhZl9tb3ZlX2l0ZW1zCisgICBsZWFmX3NoaWZ0X2xlZnQKKyAgIGxlYWZfc2hpZnRfcmlnaHQKKyAgIGxlYWZfZGVsZXRlX2l0ZW1zCisgICBsZWFmX2luc2VydF9pbnRvX2J1ZgorICAgbGVhZl9wYXN0ZV9pbl9idWZmZXIKKyAgIGxlYWZfY3V0X2Zyb21fYnVmZmVyCisgICBsZWFmX3Bhc3RlX2VudHJpZXMKKyAgICovCisKKworLyogY29weSBjb3B5X2NvdW50IGVudHJpZXMgZnJvbSBzb3VyY2UgZGlyZWN0b3J5IGl0ZW0gdG8gZGVzdCBidWZmZXIgKGNyZWF0aW5nIG5ldyBpdGVtIGlmIG5lZWRlZCkgKi8KK3N0YXRpYyB2b2lkIGxlYWZfY29weV9kaXJfZW50cmllcyAoc3RydWN0IGJ1ZmZlcl9pbmZvICogZGVzdF9iaSwgc3RydWN0IGJ1ZmZlcl9oZWFkICogc291cmNlLCAKKwkJCQkgICBpbnQgbGFzdF9maXJzdCwgaW50IGl0ZW1fbnVtLCBpbnQgZnJvbSwgaW50IGNvcHlfY291bnQpCit7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogZGVzdCA9IGRlc3RfYmktPmJpX2JoOworICAgIGludCBpdGVtX251bV9pbl9kZXN0OwkJLyogZWl0aGVyIHRoZSBudW1iZXIgb2YgdGFyZ2V0IGl0ZW0sCisJCQkJCSAgIG9yIGlmIHdlIG11c3QgY3JlYXRlIGEgbmV3IGl0ZW0sCisJCQkJCSAgIHRoZSBudW1iZXIgb2YgdGhlIGl0ZW0gd2Ugd2lsbAorCQkJCQkgICBjcmVhdGUgaXQgbmV4dCB0byAqLworICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqIGRlaDsKKyAgICBpbnQgY29weV9yZWNvcmRzX2xlbjsJCQkvKiBsZW5ndGggb2YgYWxsIHJlY29yZHMgaW4gaXRlbSB0byBiZSBjb3BpZWQgKi8KKyAgICBjaGFyICogcmVjb3JkczsKKworICAgIGloID0gQl9OX1BJVEVNX0hFQUQgKHNvdXJjZSwgaXRlbV9udW0pOworCisgICAgUkZBTFNFKCAhaXNfZGlyZW50cnlfbGVfaWggKGloKSwgInZzLTEwMDAwOiBpdGVtIG11c3QgYmUgZGlyZWN0b3J5IGl0ZW0iKTsKKworICAgIC8qIGxlbmd0aCBvZiBhbGwgcmVjb3JkIHRvIGJlIGNvcGllZCBhbmQgZmlyc3QgYnl0ZSBvZiB0aGUgbGFzdCBvZiB0aGVtICovCisgICAgZGVoID0gQl9JX0RFSCAoc291cmNlLCBpaCk7CisgICAgaWYgKGNvcHlfY291bnQpIHsKKwljb3B5X3JlY29yZHNfbGVuID0gKGZyb20gPyBkZWhfbG9jYXRpb24oICYoZGVoW2Zyb20gLSAxXSkgKSA6CisgICAgICAgICAgICBpaF9pdGVtX2xlbihpaCkpIC0gZGVoX2xvY2F0aW9uKCAmKGRlaFtmcm9tICsgY29weV9jb3VudCAtIDFdKSk7CisJcmVjb3JkcyA9IHNvdXJjZS0+Yl9kYXRhICsgaWhfbG9jYXRpb24oaWgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVoX2xvY2F0aW9uKCAmKGRlaFtmcm9tICsgY29weV9jb3VudCAtIDFdKSk7CisgICAgfSBlbHNlIHsKKwljb3B5X3JlY29yZHNfbGVuID0gMDsKKwlyZWNvcmRzID0gTlVMTDsKKyAgICB9CisKKyAgICAvKiB3aGVuIGNvcHkgbGFzdCB0byBmaXJzdCwgZGVzdCBidWZmZXIgY2FuIGNvbnRhaW4gMCBpdGVtcyAqLworICAgIGl0ZW1fbnVtX2luX2Rlc3QgPSAobGFzdF9maXJzdCA9PSBMQVNUX1RPX0ZJUlNUKSA/ICgoIEJfTlJfSVRFTVMoZGVzdCkgKSA/IDAgOiAtMSkgOiAoQl9OUl9JVEVNUyhkZXN0KSAtIDEpOworCisgICAgLyogaWYgdGhlcmUgYXJlIG5vIGl0ZW1zIGluIGRlc3Qgb3IgdGhlIGZpcnN0L2xhc3QgaXRlbSBpbiBkZXN0IGlzIG5vdCBpdGVtIG9mIHRoZSBzYW1lIGRpcmVjdG9yeSAqLworICAgIGlmICggKGl0ZW1fbnVtX2luX2Rlc3QgPT0gLSAxKSB8fAorCShsYXN0X2ZpcnN0ID09IEZJUlNUX1RPX0xBU1QgJiYgbGVfaWhfa19vZmZzZXQgKGloKSA9PSBET1RfT0ZGU0VUKSB8fAorCSAgICAobGFzdF9maXJzdCA9PSBMQVNUX1RPX0ZJUlNUICYmIGNvbXBfc2hvcnRfbGVfa2V5cy8qQ09NUF9TSE9SVF9LRVlTKi8gKCZpaC0+aWhfa2V5LCBCX05fUEtFWSAoZGVzdCwgaXRlbV9udW1faW5fZGVzdCkpKSkgeworCS8qIGNyZWF0ZSBuZXcgaXRlbSBpbiBkZXN0ICovCisJc3RydWN0IGl0ZW1faGVhZCBuZXdfaWg7CisKKwkvKiBmb3JtIGl0ZW0gaGVhZGVyICovCisJbWVtY3B5ICgmbmV3X2loLmloX2tleSwgJmloLT5paF9rZXksIEtFWV9TSVpFKTsKKwlwdXRfaWhfdmVyc2lvbiggJm5ld19paCwgS0VZX0ZPUk1BVF8zXzUgKTsKKwkvKiBjYWxjdWxhdGUgaXRlbSBsZW4gKi8KKwlwdXRfaWhfaXRlbV9sZW4oICZuZXdfaWgsIERFSF9TSVpFICogY29weV9jb3VudCArIGNvcHlfcmVjb3Jkc19sZW4gKTsKKwlwdXRfaWhfZW50cnlfY291bnQoICZuZXdfaWgsIDAgKTsKKyAgICAKKwlpZiAobGFzdF9maXJzdCA9PSBMQVNUX1RPX0ZJUlNUKSB7CisJICAgIC8qIGZvcm0ga2V5IGJ5IHRoZSBmb2xsb3dpbmcgd2F5ICovCisJICAgIGlmIChmcm9tIDwgSV9FTlRSWV9DT1VOVChpaCkpIHsKKwkJc2V0X2xlX2loX2tfb2Zmc2V0KCAmbmV3X2loLCBkZWhfb2Zmc2V0KCAmKGRlaFtmcm9tXSkgKSApOworCQkvKm1lbWNweSAoJm5ld19paC5paF9rZXkua19vZmZzZXQsICZkZWhbZnJvbV0uZGVoX29mZnNldCwgU0hPUlRfS0VZX1NJWkUpOyovCisJICAgIH0gZWxzZSB7CisJCS8qIG5vIGVudHJpZXMgd2lsbCBiZSBjb3BpZWQgdG8gdGhpcyBpdGVtIGluIHRoaXMgZnVuY3Rpb24gKi8KKwkJc2V0X2xlX2loX2tfb2Zmc2V0ICgmbmV3X2loLCBVMzJfTUFYKTsKKwkJLyogdGhpcyBpdGVtIGlzIG5vdCB5ZXQgdmFsaWQsIGJ1dCB3ZSB3YW50IElfSVNfRElSRUNUT1JZX0lURU0gdG8gcmV0dXJuIDEgZm9yIGl0LCBzbyB3ZSAtMSAqLworCSAgICB9CisJICAgIHNldF9sZV9rZXlfa190eXBlIChLRVlfRk9STUFUXzNfNSwgJihuZXdfaWguaWhfa2V5KSwgVFlQRV9ESVJFTlRSWSk7CisJfQorICAgIAorCS8qIGluc2VydCBpdGVtIGludG8gZGVzdCBidWZmZXIgKi8KKwlsZWFmX2luc2VydF9pbnRvX2J1ZiAoZGVzdF9iaSwgKGxhc3RfZmlyc3QgPT0gTEFTVF9UT19GSVJTVCkgPyAwIDogQl9OUl9JVEVNUyhkZXN0KSwgJm5ld19paCwgTlVMTCwgMCk7CisgICAgfSBlbHNlIHsKKwkvKiBwcmVwYXJlIHNwYWNlIGZvciBlbnRyaWVzICovCisJbGVhZl9wYXN0ZV9pbl9idWZmZXIgKGRlc3RfYmksIChsYXN0X2ZpcnN0PT1GSVJTVF9UT19MQVNUKSA/IChCX05SX0lURU1TKGRlc3QpIC0gMSkgOiAwLCBNQVhfVVNfSU5ULAorCQkJICAgICAgREVIX1NJWkUgKiBjb3B5X2NvdW50ICsgY29weV9yZWNvcmRzX2xlbiwgcmVjb3JkcywgMAorCSAgICApOworICAgIH0KKyAgCisgICAgaXRlbV9udW1faW5fZGVzdCA9IChsYXN0X2ZpcnN0ID09IEZJUlNUX1RPX0xBU1QpID8gKEJfTlJfSVRFTVMoZGVzdCktMSkgOiAwOworICAgIAorICAgIGxlYWZfcGFzdGVfZW50cmllcyAoZGVzdF9iaS0+YmlfYmgsIGl0ZW1fbnVtX2luX2Rlc3QsCisJCQkobGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUKSA/IElfRU5UUllfQ09VTlQoQl9OX1BJVEVNX0hFQUQgKGRlc3QsIGl0ZW1fbnVtX2luX2Rlc3QpKSA6IDAsCisJCQljb3B5X2NvdW50LCBkZWggKyBmcm9tLCByZWNvcmRzLAorCQkJREVIX1NJWkUgKiBjb3B5X2NvdW50ICsgY29weV9yZWNvcmRzX2xlbgorCSk7Cit9CisKKworLyogQ29weSB0aGUgZmlyc3QgKGlmIGxhc3RfZmlyc3QgPT0gRklSU1RfVE9fTEFTVCkgb3IgbGFzdCAobGFzdF9maXJzdCA9PSBMQVNUX1RPX0ZJUlNUKSBpdGVtIG9yIAorICAgcGFydCBvZiBpdCBvciBub3RoaW5nIChzZWUgdGhlIHJldHVybiAwIGJlbG93KSBmcm9tIFNPVVJDRSB0byB0aGUgZW5kIAorICAgKGlmIGxhc3RfZmlyc3QpIG9yIGJlZ2lubmluZyAoIWxhc3RfZmlyc3QpIG9mIHRoZSBERVNUICovCisvKiByZXR1cm5zIDEgaWYgYW55dGhpbmcgd2FzIGNvcGllZCwgZWxzZSAwICovCitzdGF0aWMgaW50IGxlYWZfY29weV9ib3VuZGFyeV9pdGVtIChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBkZXN0X2JpLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzcmMsIGludCBsYXN0X2ZpcnN0LAorCQkJCSAgICBpbnQgYnl0ZXNfb3JfZW50cmllcykKK3sKKyAgc3RydWN0IGJ1ZmZlcl9oZWFkICogZGVzdCA9IGRlc3RfYmktPmJpX2JoOworICBpbnQgZGVzdF9ucl9pdGVtLCBzcmNfbnJfaXRlbTsgLyogbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGJ1ZmZlcnMgKi8KKyAgc3RydWN0IGl0ZW1faGVhZCAqIGloOworICBzdHJ1Y3QgaXRlbV9oZWFkICogZGloOworICAKKyAgZGVzdF9ucl9pdGVtID0gQl9OUl9JVEVNUyhkZXN0KTsKKyAgCisgIGlmICggbGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUICkgeworICAgIC8qIGlmICggREVTVCBpcyBlbXB0eSBvciBmaXJzdCBpdGVtIG9mIFNPVVJDRSBhbmQgbGFzdCBpdGVtIG9mIERFU1QgYXJlIHRoZSBpdGVtcyBvZiBkaWZmZXJlbnQgb2JqZWN0cworICAgICAgIG9yIG9mIGRpZmZlcmVudCB0eXBlcyApIHRoZW4gdGhlcmUgaXMgbm8gbmVlZCB0byB0cmVhdCB0aGlzIGl0ZW0gZGlmZmVyZW50bHkgZnJvbSB0aGUgb3RoZXIgaXRlbXMKKyAgICAgICB0aGF0IHdlIGNvcHksIHNvIHdlIHJldHVybiAqLworICAgIGloID0gQl9OX1BJVEVNX0hFQUQgKHNyYywgMCk7CisgICAgZGloID0gQl9OX1BJVEVNX0hFQUQgKGRlc3QsIGRlc3RfbnJfaXRlbSAtIDEpOworICAgIGlmICghZGVzdF9ucl9pdGVtIHx8ICghb3BfaXNfbGVmdF9tZXJnZWFibGUgKCYoaWgtPmloX2tleSksIHNyYy0+Yl9zaXplKSkpCisgICAgICAvKiB0aGVyZSBpcyBub3RoaW5nIHRvIG1lcmdlICovCisgICAgICByZXR1cm4gMDsKKyAgICAgIAorICAgIFJGQUxTRSggISBpaF9pdGVtX2xlbihpaCksICJ2cy0xMDAxMDogaXRlbSBjYW4gbm90IGhhdmUgZW1wdHkgbGVuZ3RoIik7CisgICAgICAKKyAgICBpZiAoIGlzX2RpcmVudHJ5X2xlX2loIChpaCkgKSB7CisgICAgICBpZiAoIGJ5dGVzX29yX2VudHJpZXMgPT0gLTEgKQorCS8qIGNvcHkgYWxsIGVudHJpZXMgdG8gZGVzdCAqLworCWJ5dGVzX29yX2VudHJpZXMgPSBpaF9lbnRyeV9jb3VudChpaCk7CisgICAgICBsZWFmX2NvcHlfZGlyX2VudHJpZXMgKGRlc3RfYmksIHNyYywgRklSU1RfVE9fTEFTVCwgMCwgMCwgYnl0ZXNfb3JfZW50cmllcyk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgICAKKyAgICAvKiBjb3B5IHBhcnQgb2YgdGhlIGJvZHkgb2YgdGhlIGZpcnN0IGl0ZW0gb2YgU09VUkNFIHRvIHRoZSBlbmQgb2YgdGhlIGJvZHkgb2YgdGhlIGxhc3QgaXRlbSBvZiB0aGUgREVTVAorICAgICAgIHBhcnQgZGVmaW5lZCBieSAnYnl0ZXNfb3JfZW50cmllcyc7IGlmIGJ5dGVzX29yX2VudHJpZXMgPT0gLTEgY29weSB3aG9sZSBib2R5OyBkb24ndCBjcmVhdGUgbmV3IGl0ZW0gaGVhZGVyCisgICAgICAgKi8KKyAgICBpZiAoIGJ5dGVzX29yX2VudHJpZXMgPT0gLTEgKQorICAgICAgYnl0ZXNfb3JfZW50cmllcyA9IGloX2l0ZW1fbGVuKGloKTsKKworI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSworICAgIGVsc2UgeworICAgICAgaWYgKGJ5dGVzX29yX2VudHJpZXMgPT0gaWhfaXRlbV9sZW4oaWgpICYmIGlzX2luZGlyZWN0X2xlX2loKGloKSkKKwlpZiAoZ2V0X2loX2ZyZWVfc3BhY2UgKGloKSkKKwkgIHJlaXNlcmZzX3BhbmljIChOVUxMLCAidnMtMTAwMjA6IGxlYWZfY29weV9ib3VuZGFyeV9pdGVtOiAiCisJCQkgICJsYXN0IHVuZm9ybWF0dGVkIG5vZGUgbXVzdCBiZSBmaWxsZWQgZW50aXJlbHkgKCVoKSIsCisJCQkgIGloKTsKKyAgICB9CisjZW5kaWYKKyAgICAgIAorICAgIC8qIG1lcmdlIGZpcnN0IGl0ZW0gKG9yIGl0cyBwYXJ0KSBvZiBzcmMgYnVmZmVyIHdpdGggdGhlIGxhc3QKKyAgICAgICBpdGVtIG9mIGRlc3QgYnVmZmVyLiBCb3RoIGFyZSBvZiB0aGUgc2FtZSBmaWxlICovCisgICAgbGVhZl9wYXN0ZV9pbl9idWZmZXIgKGRlc3RfYmksCisJCQkgIGRlc3RfbnJfaXRlbSAtIDEsIGloX2l0ZW1fbGVuKGRpaCksIGJ5dGVzX29yX2VudHJpZXMsIEJfSV9QSVRFTShzcmMsaWgpLCAwCisJCQkgICk7CisgICAgICAKKyAgICBpZiAoaXNfaW5kaXJlY3RfbGVfaWggKGRpaCkpIHsKKyAgICAgIFJGQUxTRSggZ2V0X2loX2ZyZWVfc3BhY2UgKGRpaCksCisgICAgICAgICAgICAgICJ2cy0xMDAzMDogbWVyZ2UgdG8gbGVmdDogbGFzdCB1bmZvcm1hdHRlZCBub2RlIG9mIG5vbi1sYXN0IGluZGlyZWN0IGl0ZW0gJWggbXVzdCBoYXZlIHplcnRvIGZyZWUgc3BhY2UiLAorICAgICAgICAgICAgICBpaCk7CisgICAgICBpZiAoYnl0ZXNfb3JfZW50cmllcyA9PSBpaF9pdGVtX2xlbihpaCkpCisJc2V0X2loX2ZyZWVfc3BhY2UgKGRpaCwgZ2V0X2loX2ZyZWVfc3BhY2UgKGloKSk7CisgICAgfQorICAgIAorICAgIHJldHVybiAxOworICB9CisgIAorCisgIC8qIGNvcHkgYm91bmRhcnkgaXRlbSB0byByaWdodCAobGFzdF9maXJzdCA9PSBMQVNUX1RPX0ZJUlNUKSAqLworCisgIC8qICggREVTVCBpcyBlbXB0eSBvciBsYXN0IGl0ZW0gb2YgU09VUkNFIGFuZCBmaXJzdCBpdGVtIG9mIERFU1QKKyAgICAgYXJlIHRoZSBpdGVtcyBvZiBkaWZmZXJlbnQgb2JqZWN0IG9yIG9mIGRpZmZlcmVudCB0eXBlcyApCisgICAgICovCisgIHNyY19ucl9pdGVtID0gQl9OUl9JVEVNUyAoc3JjKTsKKyAgaWggPSBCX05fUElURU1fSEVBRCAoc3JjLCBzcmNfbnJfaXRlbSAtIDEpOworICBkaWggPSBCX05fUElURU1fSEVBRCAoZGVzdCwgMCk7CisKKyAgaWYgKCFkZXN0X25yX2l0ZW0gfHwgIW9wX2lzX2xlZnRfbWVyZ2VhYmxlICgmKGRpaC0+aWhfa2V5KSwgc3JjLT5iX3NpemUpKQorICAgIHJldHVybiAwOworICAKKyAgaWYgKCBpc19kaXJlbnRyeV9sZV9paCAoaWgpKSB7CisgICAgaWYgKCBieXRlc19vcl9lbnRyaWVzID09IC0xICkKKyAgICAgIC8qIGJ5dGVzX29yX2VudHJpZXMgPSBlbnRyaWVzIG51bWJlciBpbiBsYXN0IGl0ZW0gYm9keSBvZiBTT1VSQ0UgKi8KKyAgICAgIGJ5dGVzX29yX2VudHJpZXMgPSBpaF9lbnRyeV9jb3VudChpaCk7CisgICAgCisgICAgbGVhZl9jb3B5X2Rpcl9lbnRyaWVzIChkZXN0X2JpLCBzcmMsIExBU1RfVE9fRklSU1QsIHNyY19ucl9pdGVtIC0gMSwgaWhfZW50cnlfY291bnQoaWgpIC0gYnl0ZXNfb3JfZW50cmllcywgYnl0ZXNfb3JfZW50cmllcyk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICAvKiBjb3B5IHBhcnQgb2YgdGhlIGJvZHkgb2YgdGhlIGxhc3QgaXRlbSBvZiBTT1VSQ0UgdG8gdGhlIGJlZ2luIG9mIHRoZSBib2R5IG9mIHRoZSBmaXJzdCBpdGVtIG9mIHRoZSBERVNUOworICAgICBwYXJ0IGRlZmluZWQgYnkgJ2J5dGVzX29yX2VudHJpZXMnOyBpZiBieXRlX29yX2VudHJpZXNzID09IC0xIGNvcHkgd2hvbGUgYm9keTsgY2hhbmdlIGZpcnN0IGl0ZW0ga2V5IG9mIHRoZSBERVNUOworICAgICBkb24ndCBjcmVhdGUgbmV3IGl0ZW0gaGVhZGVyCisgICAgICovCisgIAorICBSRkFMU0UoIGlzX2luZGlyZWN0X2xlX2loKGloKSAmJiBnZXRfaWhfZnJlZV9zcGFjZSAoaWgpLAorICAgICAgICAgICJ2cy0xMDA0MDogbWVyZ2UgdG8gcmlnaHQ6IGxhc3QgdW5mb3JtYXR0ZWQgbm9kZSBvZiBub24tbGFzdCBpbmRpcmVjdCBpdGVtIG11c3QgYmUgZmlsbGVkIGVudGlyZWx5ICglaCkiLAorCQkgICAgaWgpOworCisgIGlmICggYnl0ZXNfb3JfZW50cmllcyA9PSAtMSApIHsKKyAgICAvKiBieXRlc19vcl9lbnRyaWVzID0gbGVuZ3RoIG9mIGxhc3QgaXRlbSBib2R5IG9mIFNPVVJDRSAqLworICAgIGJ5dGVzX29yX2VudHJpZXMgPSBpaF9pdGVtX2xlbihpaCk7CisKKyAgICBSRkFMU0UoIGxlX2loX2tfb2Zmc2V0IChkaWgpICE9CisgICAgICAgICAgICBsZV9paF9rX29mZnNldCAoaWgpICsgb3BfYnl0ZXNfbnVtYmVyIChpaCwgc3JjLT5iX3NpemUpLAorICAgICAgICAgICAgInZzLTEwMDUwOiBpdGVtcyAlaCBhbmQgJWggZG8gbm90IG1hdGNoIiwgaWgsIGRpaCk7CisKKyAgICAvKiBjaGFuZ2UgZmlyc3QgaXRlbSBrZXkgb2YgdGhlIERFU1QgKi8KKyAgICBzZXRfbGVfaWhfa19vZmZzZXQgKGRpaCwgbGVfaWhfa19vZmZzZXQgKGloKSk7CisKKyAgICAvKiBpdGVtIGJlY29tZXMgbm9uLW1lcmdlYWJsZSAqLworICAgIC8qIG9yIG1lcmdlYWJsZSBpZiBsZWZ0IGl0ZW0gd2FzICovCisgICAgc2V0X2xlX2loX2tfdHlwZSAoZGloLCBsZV9paF9rX3R5cGUgKGloKSk7CisgIH0gZWxzZSB7CisgICAgLyogbWVyZ2UgdG8gcmlnaHQgb25seSBwYXJ0IG9mIGl0ZW0gKi8KKyAgICBSRkFMU0UoIGloX2l0ZW1fbGVuKGloKSA8PSBieXRlc19vcl9lbnRyaWVzLAorICAgICAgICAgICAgInZzLTEwMDYwOiBubyBzbyBtdWNoIGJ5dGVzICVsdSAobmVlZGVkICVsdSkiLAorICAgICAgICAgICAgKCB1bnNpZ25lZCBsb25nIClpaF9pdGVtX2xlbihpaCksICggdW5zaWduZWQgbG9uZyApYnl0ZXNfb3JfZW50cmllcyk7CisgICAgCisgICAgLyogY2hhbmdlIGZpcnN0IGl0ZW0ga2V5IG9mIHRoZSBERVNUICovCisgICAgaWYgKCBpc19kaXJlY3RfbGVfaWggKGRpaCkgKSB7CisgICAgICBSRkFMU0UoIGxlX2loX2tfb2Zmc2V0IChkaWgpIDw9ICh1bnNpZ25lZCBsb25nKWJ5dGVzX29yX2VudHJpZXMsCisJICAgICAgInZzLTEwMDcwOiBkaWggJWgsIGJ5dGVzX29yX2VudHJpZXMoJWQpIiwgZGloLCBieXRlc19vcl9lbnRyaWVzKTsKKyAgICAgIHNldF9sZV9paF9rX29mZnNldCAoZGloLCBsZV9paF9rX29mZnNldCAoZGloKSAtIGJ5dGVzX29yX2VudHJpZXMpOworICAgIH0gZWxzZSB7CisgICAgICBSRkFMU0UoIGxlX2loX2tfb2Zmc2V0IChkaWgpIDw9CisgICAgICAgICAgICAgIChieXRlc19vcl9lbnRyaWVzIC8gVU5GTV9QX1NJWkUpICogZGVzdC0+Yl9zaXplLAorICAgICAgICAgICAgICAidnMtMTAwODA6IGRpaCAlaCwgYnl0ZXNfb3JfZW50cmllcyglZCkiLAorICAgICAgICAgICAgICBkaWgsIChieXRlc19vcl9lbnRyaWVzL1VORk1fUF9TSVpFKSpkZXN0LT5iX3NpemUpOworICAgICAgc2V0X2xlX2loX2tfb2Zmc2V0IChkaWgsIGxlX2loX2tfb2Zmc2V0IChkaWgpIC0gKChieXRlc19vcl9lbnRyaWVzIC8gVU5GTV9QX1NJWkUpICogZGVzdC0+Yl9zaXplKSk7CisgICAgfQorICB9CisgIAorICBsZWFmX3Bhc3RlX2luX2J1ZmZlciAoZGVzdF9iaSwgMCwgMCwgYnl0ZXNfb3JfZW50cmllcywgQl9JX1BJVEVNKHNyYyxpaCkgKyBpaF9pdGVtX2xlbihpaCkgLSBieXRlc19vcl9lbnRyaWVzLCAwKTsKKyAgcmV0dXJuIDE7Cit9CisKKworLyogY29weSBjcHlfbXVuIGl0ZW1zIGZyb20gYnVmZmVyIHNyYyB0byBidWZmZXIgZGVzdAorICogbGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUIG1lYW5zLCB0aGF0IHdlIGNvcHkgY3B5X251bSAgaXRlbXMgYmVnaW5uaW5nIGZyb20gZmlyc3QtdGggaXRlbSBpbiBzcmMgdG8gdGFpbCBvZiBkZXN0CisgKiBsYXN0X2ZpcnN0ID09IExBU1RfVE9fRklSU1QgbWVhbnMsIHRoYXQgd2UgY29weSBjcHlfbnVtICBpdGVtcyBiZWdpbm5pbmcgZnJvbSBmaXJzdC10aCBpdGVtIGluIHNyYyB0byBoZWFkIG9mIGRlc3QKKyAqLworc3RhdGljIHZvaWQgbGVhZl9jb3B5X2l0ZW1zX2VudGlyZWx5IChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBkZXN0X2JpLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzcmMsIGludCBsYXN0X2ZpcnN0LAorCQkJCSAgICAgIGludCBmaXJzdCwgaW50IGNweV9udW0pCit7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogZGVzdDsKKyAgICBpbnQgbnIsIGZyZWVfc3BhY2U7CisgICAgaW50IGRlc3RfYmVmb3JlOworICAgIGludCBsYXN0X2xvYywgbGFzdF9pbnNlcnRlZF9sb2MsIGxvY2F0aW9uOworICAgIGludCBpLCBqOworICAgIHN0cnVjdCBibG9ja19oZWFkICogYmxraDsKKyAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWg7CisKKyAgICBSRkFMU0UoIGxhc3RfZmlyc3QgIT0gTEFTVF9UT19GSVJTVCAgJiYgbGFzdF9maXJzdCAhPSBGSVJTVF9UT19MQVNULAorCSAgICAidnMtMTAwOTA6IGJhZCBsYXN0X2ZpcnN0IHBhcmFtZXRlciAlZCIsIGxhc3RfZmlyc3QpOworICAgIFJGQUxTRSggQl9OUl9JVEVNUyAoc3JjKSAtIGZpcnN0IDwgY3B5X251bSwKKwkgICAgInZzLTEwMTAwOiB0b28gZmV3IGl0ZW1zIGluIHNvdXJjZSAlZCwgcmVxdWlyZWQgJWQgZnJvbSAlZCIsCisJICAgIEJfTlJfSVRFTVMoc3JjKSwgY3B5X251bSwgZmlyc3QpOworICAgIFJGQUxTRSggY3B5X251bSA8IDAsICJ2cy0xMDExMDogY2FuIG5vdCBjb3B5IG5lZ2F0aXZlIGFtb3VudCBvZiBpdGVtcyIpOworICAgIFJGQUxTRSggISBkZXN0X2JpLCAidnMtMTAxMjA6IGNhbiBub3QgY29weSBuZWdhdGl2ZSBhbW91bnQgb2YgaXRlbXMiKTsKKworICAgIGRlc3QgPSBkZXN0X2JpLT5iaV9iaDsKKworICAgIFJGQUxTRSggISBkZXN0LCAidnMtMTAxMzA6IGNhbiBub3QgY29weSBuZWdhdGl2ZSBhbW91bnQgb2YgaXRlbXMiKTsKKworICAgIGlmIChjcHlfbnVtID09IDApCisJcmV0dXJuOworCisgICAgYmxraCA9IEJfQkxLX0hFQUQoZGVzdCk7CisgICAgbnIgPSBibGtoX25yX2l0ZW0oIGJsa2ggKTsKKyAgICBmcmVlX3NwYWNlID0gYmxraF9mcmVlX3NwYWNlKGJsa2gpOworICAKKyAgICAvKiB3ZSB3aWxsIGluc2VydCBpdGVtcyBiZWZvcmUgMC10aCBvciBuci10aCBpdGVtIGluIGRlc3QgYnVmZmVyLiBJdCBkZXBlbmRzIG9mIGxhc3RfZmlyc3QgcGFyYW1ldGVyICovCisgICAgZGVzdF9iZWZvcmUgPSAobGFzdF9maXJzdCA9PSBMQVNUX1RPX0ZJUlNUKSA/IDAgOiBucjsKKworICAgIC8qIGxvY2F0aW9uIG9mIGhlYWQgb2YgZmlyc3QgbmV3IGl0ZW0gKi8KKyAgICBpaCA9IEJfTl9QSVRFTV9IRUFEIChkZXN0LCBkZXN0X2JlZm9yZSk7CisKKyAgICBSRkFMU0UoIGJsa2hfZnJlZV9zcGFjZShibGtoKSA8IGNweV9udW0gKiBJSF9TSVpFLAorICAgICAgICAgICAgInZzLTEwMTQwOiBub3QgZW5vdWdoIGZyZWUgc3BhY2UgZm9yIGhlYWRlcnMgJWQgKG5lZWRlZCAlZCkiLAorICAgICAgICAgICAgQl9GUkVFX1NQQUNFIChkZXN0KSwgY3B5X251bSAqIElIX1NJWkUpOworCisgICAgLyogcHJlcGFyZSBzcGFjZSBmb3IgaGVhZGVycyAqLworICAgIG1lbW1vdmUgKGloICsgY3B5X251bSwgaWgsIChuci1kZXN0X2JlZm9yZSkgKiBJSF9TSVpFKTsKKworICAgIC8qIGNvcHkgaXRlbSBoZWFkZXJzICovCisgICAgbWVtY3B5IChpaCwgQl9OX1BJVEVNX0hFQUQgKHNyYywgZmlyc3QpLCBjcHlfbnVtICogSUhfU0laRSk7CisKKyAgICBmcmVlX3NwYWNlIC09IChJSF9TSVpFICogY3B5X251bSk7CisgICAgc2V0X2Jsa2hfZnJlZV9zcGFjZSggYmxraCwgZnJlZV9zcGFjZSApOworCisgICAgLyogbG9jYXRpb24gb2YgdW5tb3ZhYmxlIGl0ZW0gKi8KKyAgICBqID0gbG9jYXRpb24gPSAoZGVzdF9iZWZvcmUgPT0gMCkgPyBkZXN0LT5iX3NpemUgOiBpaF9sb2NhdGlvbihpaC0xKTsKKyAgICBmb3IgKGkgPSBkZXN0X2JlZm9yZTsgaSA8IG5yICsgY3B5X251bTsgaSArKykgeworICAgICAgICBsb2NhdGlvbiAtPSBpaF9pdGVtX2xlbiggaWggKyBpIC0gZGVzdF9iZWZvcmUgKTsKKyAgICAgICAgcHV0X2loX2xvY2F0aW9uKCBpaCArIGkgLSBkZXN0X2JlZm9yZSwgbG9jYXRpb24gKTsKKyAgICB9CisKKyAgICAvKiBwcmVwYXJlIHNwYWNlIGZvciBpdGVtcyAqLworICAgIGxhc3RfbG9jID0gaWhfbG9jYXRpb24oICYoaWhbbnIrY3B5X251bS0xLWRlc3RfYmVmb3JlXSkgKTsKKyAgICBsYXN0X2luc2VydGVkX2xvYyA9IGloX2xvY2F0aW9uKCAmKGloW2NweV9udW0tMV0pICk7CisKKyAgICAvKiBjaGVjayBmcmVlIHNwYWNlICovCisgICAgUkZBTFNFKCBmcmVlX3NwYWNlIDwgaiAtIGxhc3RfaW5zZXJ0ZWRfbG9jLAorCSAgICAidnMtMTAxNTA6IG5vdCBlbm91Z2ggZnJlZSBzcGFjZSBmb3IgaXRlbXMgJWQgKG5lZWRlZCAlZCkiLAorICAgICAgICAgICAgZnJlZV9zcGFjZSwgaiAtIGxhc3RfaW5zZXJ0ZWRfbG9jKTsKKworICAgIG1lbW1vdmUgKGRlc3QtPmJfZGF0YSArIGxhc3RfbG9jLAorCSAgICAgZGVzdC0+Yl9kYXRhICsgbGFzdF9sb2MgKyBqIC0gbGFzdF9pbnNlcnRlZF9sb2MsCisJICAgICBsYXN0X2luc2VydGVkX2xvYyAtIGxhc3RfbG9jKTsKKworICAgIC8qIGNvcHkgaXRlbXMgKi8KKyAgICBtZW1jcHkgKGRlc3QtPmJfZGF0YSArIGxhc3RfaW5zZXJ0ZWRfbG9jLCBCX05fUElURU0oc3JjLChmaXJzdCArIGNweV9udW0gLSAxKSksCisJICAgIGogLSBsYXN0X2luc2VydGVkX2xvYyk7CisKKyAgICAvKiBzaXplcywgaXRlbSBudW1iZXIgKi8KKyAgICBzZXRfYmxraF9ucl9pdGVtKCBibGtoLCBuciArIGNweV9udW0gKTsKKyAgICBzZXRfYmxraF9mcmVlX3NwYWNlKCBibGtoLCBmcmVlX3NwYWNlIC0gKGogLSBsYXN0X2luc2VydGVkX2xvYykgKTsKKworICAgIGRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5IChkZXN0X2JpLT50YiwgZGVzdCwgMCk7CisKKyAgICBpZiAoZGVzdF9iaS0+YmlfcGFyZW50KSB7CisJc3RydWN0IGRpc2tfY2hpbGQgKnRfZGM7CisJdF9kYyA9IEJfTl9DSElMRCAoZGVzdF9iaS0+YmlfcGFyZW50LCBkZXN0X2JpLT5iaV9wb3NpdGlvbik7CisJUkZBTFNFKCBkY19ibG9ja19udW1iZXIodF9kYykgIT0gZGVzdC0+Yl9ibG9ja25yLAorCSAgICAgICAgInZzLTEwMTYwOiBibG9jayBudW1iZXIgaW4gYmggZG9lcyBub3QgbWF0Y2ggdG8gZmllbGQgaW4gZGlza19jaGlsZCBzdHJ1Y3R1cmUgJWx1IGFuZCAlbHUiLAorICAgICAgICAgICAgICAgICggbG9uZyB1bnNpZ25lZCApIGRlc3QtPmJfYmxvY2tuciwgCisJCSggbG9uZyB1bnNpZ25lZCApIGRjX2Jsb2NrX251bWJlcih0X2RjKSk7CisJcHV0X2RjX3NpemUoIHRfZGMsIGRjX3NpemUodF9kYykgKyAoaiAtIGxhc3RfaW5zZXJ0ZWRfbG9jICsgSUhfU0laRSAqIGNweV9udW0gKSApOworICAgIAorCWRvX2JhbGFuY2VfbWFya19pbnRlcm5hbF9kaXJ0eSAoZGVzdF9iaS0+dGIsIGRlc3RfYmktPmJpX3BhcmVudCwgMCk7CisgICAgfQorfQorCisKKy8qIFRoaXMgZnVuY3Rpb24gc3BsaXRzIHRoZSAobGlxdWlkKSBpdGVtIGludG8gdHdvIGl0ZW1zICh1c2VmdWwgd2hlbgorICAgc2hpZnRpbmcgcGFydCBvZiBhbiBpdGVtIGludG8gYW5vdGhlciBub2RlLikgKi8KK3N0YXRpYyB2b2lkIGxlYWZfaXRlbV9ib3R0bGUgKHN0cnVjdCBidWZmZXJfaW5mbyAqIGRlc3RfYmksIHN0cnVjdCBidWZmZXJfaGVhZCAqIHNyYywgaW50IGxhc3RfZmlyc3QsCisJCQkgICAgICBpbnQgaXRlbV9udW0sIGludCBjcHlfYnl0ZXMpCit7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogZGVzdCA9IGRlc3RfYmktPmJpX2JoOworICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKKyAgCisgICAgUkZBTFNFKCBjcHlfYnl0ZXMgPT0gLTEsICJ2cy0xMDE3MDogYnl0ZXMgPT0gLSAxIG1lYW5zOiBkbyBub3Qgc3BsaXQgaXRlbSIpOworCisgICAgaWYgKCBsYXN0X2ZpcnN0ID09IEZJUlNUX1RPX0xBU1QgKSB7CisJLyogaWYgKCBpZiBpdGVtIGluIHBvc2l0aW9uIGl0ZW1fbnVtIGluIGJ1ZmZlciBTT1VSQ0UgaXMgZGlyZWN0b3J5IGl0ZW0gKSAqLworCWlmIChpc19kaXJlbnRyeV9sZV9paCAoaWggPSBCX05fUElURU1fSEVBRChzcmMsaXRlbV9udW0pKSkKKwkgICAgbGVhZl9jb3B5X2Rpcl9lbnRyaWVzIChkZXN0X2JpLCBzcmMsIEZJUlNUX1RPX0xBU1QsIGl0ZW1fbnVtLCAwLCBjcHlfYnl0ZXMpOworCWVsc2UgeworCSAgICBzdHJ1Y3QgaXRlbV9oZWFkIG5faWg7CisgICAgICAKKwkgICAgLyogY29weSBwYXJ0IG9mIHRoZSBib2R5IG9mIHRoZSBpdGVtIG51bWJlciAnaXRlbV9udW0nIG9mIFNPVVJDRSB0byB0aGUgZW5kIG9mIHRoZSBERVNUIAorCSAgICAgICBwYXJ0IGRlZmluZWQgYnkgJ2NweV9ieXRlcyc7IGNyZWF0ZSBuZXcgaXRlbSBoZWFkZXI7IGNoYW5nZSBvbGQgaXRlbV9oZWFkZXIgKD8/Pz8pOworCSAgICAgICBuX2loID0gbmV3IGl0ZW1faGVhZGVyOworCSAgICAqLworCSAgICBtZW1jcHkgKCZuX2loLCBpaCwgSUhfU0laRSk7CisJICAgIHB1dF9paF9pdGVtX2xlbiggJm5faWgsIGNweV9ieXRlcyApOworCSAgICBpZiAoaXNfaW5kaXJlY3RfbGVfaWggKGloKSkgeworCQlSRkFMU0UoIGNweV9ieXRlcyA9PSBpaF9pdGVtX2xlbihpaCkgJiYgZ2V0X2loX2ZyZWVfc3BhY2UoaWgpLAorCQkgICAgICAgICJ2cy0xMDE4MDogd2hlbiB3aG9sZSBpbmRpcmVjdCBpdGVtIGlzIGJvdHRsZSB0byBsZWZ0IG5laWdoYm9yLCBpdCBtdXN0IGhhdmUgZnJlZV9zcGFjZT09MCAobm90ICVsdSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgKCBsb25nIHVuc2lnbmVkICkgZ2V0X2loX2ZyZWVfc3BhY2UgKGloKSk7CisJCXNldF9paF9mcmVlX3NwYWNlICgmbl9paCwgMCk7CisJICAgIH0KKworCSAgICBSRkFMU0UoIG9wX2lzX2xlZnRfbWVyZ2VhYmxlICgmKGloLT5paF9rZXkpLCBzcmMtPmJfc2l6ZSksCisJCSAgICAidnMtMTAxOTA6IGJhZCBtZXJnZWFiaWxpdHkgb2YgaXRlbSAlaCIsIGloKTsKKwkgICAgbl9paC5paF92ZXJzaW9uID0gaWgtPmloX3ZlcnNpb247IC8qIEpETSBFbmRpYW4gc2FmZSwgYm90aCBsZSAqLworCSAgICBsZWFmX2luc2VydF9pbnRvX2J1ZiAoZGVzdF9iaSwgQl9OUl9JVEVNUyhkZXN0KSwgJm5faWgsIEJfTl9QSVRFTSAoc3JjLCBpdGVtX251bSksIDApOworCX0KKyAgICB9IGVsc2UgeworCS8qICBpZiAoIGlmIGl0ZW0gaW4gcG9zaXRpb24gaXRlbV9udW0gaW4gYnVmZmVyIFNPVVJDRSBpcyBkaXJlY3RvcnkgaXRlbSApICovCisJaWYgKGlzX2RpcmVudHJ5X2xlX2loKGloID0gQl9OX1BJVEVNX0hFQUQgKHNyYywgaXRlbV9udW0pKSkKKwkgICAgbGVhZl9jb3B5X2Rpcl9lbnRyaWVzIChkZXN0X2JpLCBzcmMsIExBU1RfVE9fRklSU1QsIGl0ZW1fbnVtLCBJX0VOVFJZX0NPVU5UKGloKSAtIGNweV9ieXRlcywgY3B5X2J5dGVzKTsKKwllbHNlIHsKKwkgICAgc3RydWN0IGl0ZW1faGVhZCBuX2loOworICAgICAgCisJICAgIC8qIGNvcHkgcGFydCBvZiB0aGUgYm9keSBvZiB0aGUgaXRlbSBudW1iZXIgJ2l0ZW1fbnVtJyBvZiBTT1VSQ0UgdG8gdGhlIGJlZ2luIG9mIHRoZSBERVNUIAorCSAgICAgICBwYXJ0IGRlZmluZWQgYnkgJ2NweV9ieXRlcyc7IGNyZWF0ZSBuZXcgaXRlbSBoZWFkZXI7CisJICAgICAgIG5faWggPSBuZXcgaXRlbV9oZWFkZXI7CisJICAgICovCisJICAgIG1lbWNweSAoJm5faWgsIGloLCBTSE9SVF9LRVlfU0laRSk7CisKKwkgICAgbl9paC5paF92ZXJzaW9uID0gaWgtPmloX3ZlcnNpb247IC8qIEpETSBFbmRpYW4gc2FmZSwgYm90aCBsZSAqLworCisJICAgIGlmIChpc19kaXJlY3RfbGVfaWggKGloKSkgeworCQlzZXRfbGVfaWhfa19vZmZzZXQgKCZuX2loLCBsZV9paF9rX29mZnNldCAoaWgpICsgaWhfaXRlbV9sZW4oaWgpIC0gY3B5X2J5dGVzKTsKKwkJc2V0X2xlX2loX2tfdHlwZSAoJm5faWgsIFRZUEVfRElSRUNUKTsKKwkJc2V0X2loX2ZyZWVfc3BhY2UgKCZuX2loLCBNQVhfVVNfSU5UKTsKKwkgICAgfSBlbHNlIHsKKwkJLyogaW5kaXJlY3QgaXRlbSAqLworCQlSRkFMU0UoICFjcHlfYnl0ZXMgJiYgZ2V0X2loX2ZyZWVfc3BhY2UgKGloKSwKKwkJICAgICAgICAidnMtMTAyMDA6IGloLT5paF9mcmVlX3NwYWNlIG11c3QgYmUgMCB3aGVuIGluZGlyZWN0IGl0ZW0gd2lsbCBiZSBhcHBlbmRlZCIpOworCQlzZXRfbGVfaWhfa19vZmZzZXQgKCZuX2loLCBsZV9paF9rX29mZnNldCAoaWgpICsgKGloX2l0ZW1fbGVuKGloKSAtIGNweV9ieXRlcykgLyBVTkZNX1BfU0laRSAqIGRlc3QtPmJfc2l6ZSk7CisJCXNldF9sZV9paF9rX3R5cGUgKCZuX2loLCBUWVBFX0lORElSRUNUKTsKKwkJc2V0X2loX2ZyZWVfc3BhY2UgKCZuX2loLCBnZXRfaWhfZnJlZV9zcGFjZSAoaWgpKTsKKwkgICAgfQorICAgICAgCisJICAgIC8qIHNldCBpdGVtIGxlbmd0aCAqLworCSAgICBwdXRfaWhfaXRlbV9sZW4oICZuX2loLCBjcHlfYnl0ZXMgKTsKKworCSAgICBuX2loLmloX3ZlcnNpb24gPSBpaC0+aWhfdmVyc2lvbjsgLyogSkRNIEVuZGlhbiBzYWZlLCBib3RoIGxlICovCisKKwkgICAgbGVhZl9pbnNlcnRfaW50b19idWYgKGRlc3RfYmksIDAsICZuX2loLCBCX05fUElURU0oc3JjLGl0ZW1fbnVtKSArIGloX2l0ZW1fbGVuKGloKSAtIGNweV9ieXRlcywgMCk7CisJfQorICAgIH0KK30KKworCisvKiBJZiBjcHlfYnl0ZXMgZXF1YWxzIG1pbnVzIG9uZSB0aGFuIGNvcHkgY3B5X251bSB3aG9sZSBpdGVtcyBmcm9tIFNPVVJDRSB0byBERVNULgorICAgSWYgY3B5X2J5dGVzIG5vdCBlcXVhbCB0byBtaW51cyBvbmUgdGhhbiBjb3B5IGNweV9udW0tMSB3aG9sZSBpdGVtcyBmcm9tIFNPVVJDRSB0byBERVNULgorICAgRnJvbSBsYXN0IGl0ZW0gY29weSBjcHlfbnVtIGJ5dGVzIGZvciByZWd1bGFyIGl0ZW0gYW5kIGNweV9udW0gZGlyZWN0b3J5IGVudHJpZXMgZm9yCisgICBkaXJlY3RvcnkgaXRlbS4gKi8KK3N0YXRpYyBpbnQgbGVhZl9jb3B5X2l0ZW1zIChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBkZXN0X2JpLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBzcmMsIGludCBsYXN0X2ZpcnN0LCBpbnQgY3B5X251bSwKKwkJCSAgICBpbnQgY3B5X2J5dGVzKQoreworICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBkZXN0OworICBpbnQgcG9zLCBpLCBzcmNfbnJfaXRlbSwgYnl0ZXM7CisKKyAgZGVzdCA9IGRlc3RfYmktPmJpX2JoOworICBSRkFMU0UoICFkZXN0IHx8ICFzcmMsICJ2cy0xMDIxMDogIWRlc3QgfHwgIXNyYyIpOworICBSRkFMU0UoIGxhc3RfZmlyc3QgIT0gRklSU1RfVE9fTEFTVCAmJiBsYXN0X2ZpcnN0ICE9IExBU1RfVE9fRklSU1QsCisJICAidnMtMTAyMjA6bGFzdF9maXJzdCAhPSBGSVJTVF9UT19MQVNUICYmIGxhc3RfZmlyc3QgIT0gTEFTVF9UT19GSVJTVCIpOworICBSRkFMU0UoIEJfTlJfSVRFTVMoc3JjKSA8IGNweV9udW0sCisJICAidnMtMTAyMzA6IE5vIGVub3VnaCBpdGVtczogJWQsIHJlcS4gJWQiLCBCX05SX0lURU1TKHNyYyksIGNweV9udW0pOworICBSRkFMU0UoIGNweV9udW0gPCAwLCJ2cy0xMDI0MDogY3B5X251bSA8IDAgKCVkKSIsIGNweV9udW0pOworCisgaWYgKCBjcHlfbnVtID09IDAgKQorICAgcmV0dXJuIDA7CisgCisgaWYgKCBsYXN0X2ZpcnN0ID09IEZJUlNUX1RPX0xBU1QgKSB7CisgICAvKiBjb3B5IGl0ZW1zIHRvIGxlZnQgKi8KKyAgIHBvcyA9IDA7CisgICBpZiAoIGNweV9udW0gPT0gMSApCisgICAgIGJ5dGVzID0gY3B5X2J5dGVzOworICAgZWxzZQorICAgICBieXRlcyA9IC0xOworICAgCisgICAvKiBjb3B5IHRoZSBmaXJzdCBpdGVtIG9yIGl0IHBhcnQgb3Igbm90aGluZyB0byB0aGUgZW5kIG9mIHRoZSBERVNUIChpID0gbGVhZl9jb3B5X2JvdW5kYXJ5X2l0ZW0oREVTVCxTT1VSQ0UsMCxieXRlcykpICovCisgICBpID0gbGVhZl9jb3B5X2JvdW5kYXJ5X2l0ZW0gKGRlc3RfYmksIHNyYywgRklSU1RfVE9fTEFTVCwgYnl0ZXMpOworICAgY3B5X251bSAtPSBpOworICAgaWYgKCBjcHlfbnVtID09IDAgKQorICAgICByZXR1cm4gaTsKKyAgIHBvcyArPSBpOworICAgaWYgKCBjcHlfYnl0ZXMgPT0gLTEgKQorICAgICAvKiBjb3B5IGZpcnN0IGNweV9udW0gaXRlbXMgc3RhcnRpbmcgZnJvbSBwb3NpdGlvbiAncG9zJyBvZiBTT1VSQ0UgdG8gZW5kIG9mIERFU1QgKi8KKyAgICAgbGVhZl9jb3B5X2l0ZW1zX2VudGlyZWx5IChkZXN0X2JpLCBzcmMsIEZJUlNUX1RPX0xBU1QsIHBvcywgY3B5X251bSk7CisgICBlbHNlIHsKKyAgICAgLyogY29weSBmaXJzdCBjcHlfbnVtLTEgaXRlbXMgc3RhcnRpbmcgZnJvbSBwb3NpdGlvbiAncG9zLTEnIG9mIHRoZSBTT1VSQ0UgdG8gdGhlIGVuZCBvZiB0aGUgREVTVCAqLworICAgICBsZWFmX2NvcHlfaXRlbXNfZW50aXJlbHkgKGRlc3RfYmksIHNyYywgRklSU1RfVE9fTEFTVCwgcG9zLCBjcHlfbnVtLTEpOworCSAgICAgCisgICAgIC8qIGNvcHkgcGFydCBvZiB0aGUgaXRlbSB3aGljaCBudW1iZXIgaXMgY3B5X251bStwb3MtMSB0byB0aGUgZW5kIG9mIHRoZSBERVNUICovCisgICAgIGxlYWZfaXRlbV9ib3R0bGUgKGRlc3RfYmksIHNyYywgRklSU1RfVE9fTEFTVCwgY3B5X251bStwb3MtMSwgY3B5X2J5dGVzKTsKKyAgIH0gCisgfSBlbHNlIHsKKyAgIC8qIGNvcHkgaXRlbXMgdG8gcmlnaHQgKi8KKyAgIHNyY19ucl9pdGVtID0gQl9OUl9JVEVNUyAoc3JjKTsKKyAgIGlmICggY3B5X251bSA9PSAxICkKKyAgICAgYnl0ZXMgPSBjcHlfYnl0ZXM7CisgICBlbHNlCisgICAgIGJ5dGVzID0gLTE7CisgICAKKyAgIC8qIGNvcHkgdGhlIGxhc3QgaXRlbSBvciBpdCBwYXJ0IG9yIG5vdGhpbmcgdG8gdGhlIGJlZ2luIG9mIHRoZSBERVNUIChpID0gbGVhZl9jb3B5X2JvdW5kYXJ5X2l0ZW0oREVTVCxTT1VSQ0UsMSxieXRlcykpOyAqLworICAgaSA9IGxlYWZfY29weV9ib3VuZGFyeV9pdGVtIChkZXN0X2JpLCBzcmMsIExBU1RfVE9fRklSU1QsIGJ5dGVzKTsKKyAgIAorICAgY3B5X251bSAtPSBpOworICAgaWYgKCBjcHlfbnVtID09IDAgKQorICAgICByZXR1cm4gaTsKKyAgIAorICAgcG9zID0gc3JjX25yX2l0ZW0gLSBjcHlfbnVtIC0gaTsKKyAgIGlmICggY3B5X2J5dGVzID09IC0xICkgeworICAgICAvKiBzdGFydGluZyBmcm9tIHBvc2l0aW9uICdwb3MnIGNvcHkgbGFzdCBjcHlfbnVtIGl0ZW1zIG9mIFNPVVJDRSB0byBiZWdpbiBvZiBERVNUICovCisgICAgIGxlYWZfY29weV9pdGVtc19lbnRpcmVseSAoZGVzdF9iaSwgc3JjLCBMQVNUX1RPX0ZJUlNULCBwb3MsIGNweV9udW0pOworICAgfSBlbHNlIHsKKyAgICAgLyogY29weSBsYXN0IGNweV9udW0tMSBpdGVtcyBzdGFydGluZyBmcm9tIHBvc2l0aW9uICdwb3MrMScgb2YgdGhlIFNPVVJDRSB0byB0aGUgYmVnaW4gb2YgdGhlIERFU1Q7ICovCisgICAgIGxlYWZfY29weV9pdGVtc19lbnRpcmVseSAoZGVzdF9iaSwgc3JjLCBMQVNUX1RPX0ZJUlNULCBwb3MrMSwgY3B5X251bS0xKTsKKworICAgICAvKiBjb3B5IHBhcnQgb2YgdGhlIGl0ZW0gd2hpY2ggbnVtYmVyIGlzIHBvcyB0byB0aGUgYmVnaW4gb2YgdGhlIERFU1QgKi8KKyAgICAgbGVhZl9pdGVtX2JvdHRsZSAoZGVzdF9iaSwgc3JjLCBMQVNUX1RPX0ZJUlNULCBwb3MsIGNweV9ieXRlcyk7CisgICB9CisgfQorIHJldHVybiBpOworfQorCisKKy8qIHRoZXJlIGFyZSB0eXBlcyBvZiBjb3Bpbmc6IGZyb20gU1swXSB0byBMWzBdLCBmcm9tIFNbMF0gdG8gUlswXSwKKyAgIGZyb20gUlswXSB0byBMWzBdLiBmb3IgZWFjaCBvZiB0aGVzZSB3ZSBoYXZlIHRvIGRlZmluZSBwYXJlbnQgYW5kCisgICBwb3NpdGlvbnMgb2YgZGVzdGluYXRpb24gYW5kIHNvdXJjZSBidWZmZXJzICovCitzdGF0aWMgdm9pZCBsZWFmX2RlZmluZV9kZXN0X3NyY19pbmZvcyAoaW50IHNoaWZ0X21vZGUsIHN0cnVjdCB0cmVlX2JhbGFuY2UgKiB0Yiwgc3RydWN0IGJ1ZmZlcl9pbmZvICogZGVzdF9iaSwKKwkJCQkJc3RydWN0IGJ1ZmZlcl9pbmZvICogc3JjX2JpLCBpbnQgKiBmaXJzdF9sYXN0LAorCQkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBTbmV3KQoreworICAgIG1lbXNldCAoZGVzdF9iaSwgMCwgc2l6ZW9mIChzdHJ1Y3QgYnVmZmVyX2luZm8pKTsKKyAgICBtZW1zZXQgKHNyY19iaSwgMCwgc2l6ZW9mIChzdHJ1Y3QgYnVmZmVyX2luZm8pKTsKKworICAgIC8qIGRlZmluZSBkZXN0LCBzcmMsIGRlc3QgcGFyZW50LCBkZXN0IHBvc2l0aW9uICovCisgICAgc3dpdGNoIChzaGlmdF9tb2RlKSB7CisgICAgY2FzZSBMRUFGX0ZST01fU19UT19MOiAgICAvKiBpdCBpcyB1c2VkIGluIGxlYWZfc2hpZnRfbGVmdCAqLworCXNyY19iaS0+dGIgPSB0YjsKKwlzcmNfYmktPmJpX2JoID0gUEFUSF9QTEFTVF9CVUZGRVIgKHRiLT50Yl9wYXRoKTsKKwlzcmNfYmktPmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgMCk7CisJc3JjX2JpLT5iaV9wb3NpdGlvbiA9IFBBVEhfSF9CX0lURU1fT1JERVIgKHRiLT50Yl9wYXRoLCAwKTsJLyogc3JjLT5iX2l0ZW1fb3JkZXIgKi8KKwlkZXN0X2JpLT50YiA9IHRiOworCWRlc3RfYmktPmJpX2JoID0gdGItPkxbMF07CisJZGVzdF9iaS0+YmlfcGFyZW50ID0gdGItPkZMWzBdOworCWRlc3RfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCAwKTsKKwkqZmlyc3RfbGFzdCA9IEZJUlNUX1RPX0xBU1Q7CisJYnJlYWs7CisKKyAgICBjYXNlIExFQUZfRlJPTV9TX1RPX1I6ICAvKiBpdCBpcyB1c2VkIGluIGxlYWZfc2hpZnRfcmlnaHQgKi8KKwlzcmNfYmktPnRiID0gdGI7CisJc3JjX2JpLT5iaV9iaCA9IFBBVEhfUExBU1RfQlVGRkVSICh0Yi0+dGJfcGF0aCk7CisJc3JjX2JpLT5iaV9wYXJlbnQgPSBQQVRIX0hfUFBBUkVOVCAodGItPnRiX3BhdGgsIDApOworCXNyY19iaS0+YmlfcG9zaXRpb24gPSBQQVRIX0hfQl9JVEVNX09SREVSICh0Yi0+dGJfcGF0aCwgMCk7CisJZGVzdF9iaS0+dGIgPSB0YjsKKwlkZXN0X2JpLT5iaV9iaCA9IHRiLT5SWzBdOworCWRlc3RfYmktPmJpX3BhcmVudCA9IHRiLT5GUlswXTsKKwlkZXN0X2JpLT5iaV9wb3NpdGlvbiA9IGdldF9yaWdodF9uZWlnaGJvcl9wb3NpdGlvbiAodGIsIDApOworCSpmaXJzdF9sYXN0ID0gTEFTVF9UT19GSVJTVDsKKwlicmVhazsKKworICAgIGNhc2UgTEVBRl9GUk9NX1JfVE9fTDogIC8qIGl0IGlzIHVzZWQgaW4gYmFsYW5jZV9sZWFmX3doZW5fZGVsZXRlICovCisJc3JjX2JpLT50YiA9IHRiOworCXNyY19iaS0+YmlfYmggPSB0Yi0+UlswXTsKKwlzcmNfYmktPmJpX3BhcmVudCA9IHRiLT5GUlswXTsKKwlzcmNfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgMCk7CisJZGVzdF9iaS0+dGIgPSB0YjsKKwlkZXN0X2JpLT5iaV9iaCA9IHRiLT5MWzBdOworCWRlc3RfYmktPmJpX3BhcmVudCA9IHRiLT5GTFswXTsKKwlkZXN0X2JpLT5iaV9wb3NpdGlvbiA9IGdldF9sZWZ0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgMCk7CisJKmZpcnN0X2xhc3QgPSBGSVJTVF9UT19MQVNUOworCWJyZWFrOworICAgIAorICAgIGNhc2UgTEVBRl9GUk9NX0xfVE9fUjogIC8qIGl0IGlzIHVzZWQgaW4gYmFsYW5jZV9sZWFmX3doZW5fZGVsZXRlICovCisJc3JjX2JpLT50YiA9IHRiOworCXNyY19iaS0+YmlfYmggPSB0Yi0+TFswXTsKKwlzcmNfYmktPmJpX3BhcmVudCA9IHRiLT5GTFswXTsKKwlzcmNfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X2xlZnRfbmVpZ2hib3JfcG9zaXRpb24gKHRiLCAwKTsKKwlkZXN0X2JpLT50YiA9IHRiOworCWRlc3RfYmktPmJpX2JoID0gdGItPlJbMF07CisJZGVzdF9iaS0+YmlfcGFyZW50ID0gdGItPkZSWzBdOworCWRlc3RfYmktPmJpX3Bvc2l0aW9uID0gZ2V0X3JpZ2h0X25laWdoYm9yX3Bvc2l0aW9uICh0YiwgMCk7CisJKmZpcnN0X2xhc3QgPSBMQVNUX1RPX0ZJUlNUOworCWJyZWFrOworCisgICAgY2FzZSBMRUFGX0ZST01fU19UT19TTkVXOgorCXNyY19iaS0+dGIgPSB0YjsKKwlzcmNfYmktPmJpX2JoID0gUEFUSF9QTEFTVF9CVUZGRVIgKHRiLT50Yl9wYXRoKTsKKwlzcmNfYmktPmJpX3BhcmVudCA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgMCk7CisJc3JjX2JpLT5iaV9wb3NpdGlvbiA9IFBBVEhfSF9CX0lURU1fT1JERVIgKHRiLT50Yl9wYXRoLCAwKTsKKwlkZXN0X2JpLT50YiA9IHRiOworCWRlc3RfYmktPmJpX2JoID0gU25ldzsKKwlkZXN0X2JpLT5iaV9wYXJlbnQgPSBOVUxMOworCWRlc3RfYmktPmJpX3Bvc2l0aW9uID0gMDsKKwkqZmlyc3RfbGFzdCA9IExBU1RfVE9fRklSU1Q7CisJYnJlYWs7CisgICAgCisgICAgZGVmYXVsdDoKKwlyZWlzZXJmc19wYW5pYyAoTlVMTCwgInZzLTEwMjUwOiBsZWFmX2RlZmluZV9kZXN0X3NyY19pbmZvczogc2hpZnQgdHlwZSBpcyB1bmtub3duICglZCkiLCBzaGlmdF9tb2RlKTsKKyAgICB9CisgICAgUkZBTFNFKCBzcmNfYmktPmJpX2JoID09IDAgfHwgZGVzdF9iaS0+YmlfYmggPT0gMCwKKwkgICAgInZzLTEwMjYwOiBtb2RlPT0lZCwgc291cmNlICglcCkgb3IgZGVzdCAoJXApIGJ1ZmZlciBpcyBpbml0aWFsaXplZCBpbmNvcnJlY3RseSIsCisJICAgIHNoaWZ0X21vZGUsIHNyY19iaS0+YmlfYmgsIGRlc3RfYmktPmJpX2JoKTsKK30KKworCisKKworLyogY29weSBtb3ZfbnVtIGl0ZW1zIGFuZCBtb3ZfYnl0ZXMgb2YgdGhlIChtb3ZfbnVtLTEpdGggaXRlbSB0bworICAgbmVpZ2hib3IuIERlbGV0ZSB0aGVtIGZyb20gc291cmNlICovCitpbnQgbGVhZl9tb3ZlX2l0ZW1zIChpbnQgc2hpZnRfbW9kZSwgc3RydWN0IHRyZWVfYmFsYW5jZSAqIHRiLCBpbnQgbW92X251bSwgaW50IG1vdl9ieXRlcywgc3RydWN0IGJ1ZmZlcl9oZWFkICogU25ldykKK3sKKyAgaW50IHJldF92YWx1ZTsKKyAgc3RydWN0IGJ1ZmZlcl9pbmZvIGRlc3RfYmksIHNyY19iaTsKKyAgaW50IGZpcnN0X2xhc3Q7CisKKyAgbGVhZl9kZWZpbmVfZGVzdF9zcmNfaW5mb3MgKHNoaWZ0X21vZGUsIHRiLCAmZGVzdF9iaSwgJnNyY19iaSwgJmZpcnN0X2xhc3QsIFNuZXcpOworCisgIHJldF92YWx1ZSA9IGxlYWZfY29weV9pdGVtcyAoJmRlc3RfYmksIHNyY19iaS5iaV9iaCwgZmlyc3RfbGFzdCwgbW92X251bSwgbW92X2J5dGVzKTsKKworICBsZWFmX2RlbGV0ZV9pdGVtcyAoJnNyY19iaSwgZmlyc3RfbGFzdCwgKGZpcnN0X2xhc3QgPT0gRklSU1RfVE9fTEFTVCkgPyAwIDogKEJfTlJfSVRFTVMoc3JjX2JpLmJpX2JoKSAtIG1vdl9udW0pLCBtb3ZfbnVtLCBtb3ZfYnl0ZXMpOworCisgIAorICByZXR1cm4gcmV0X3ZhbHVlOworfQorCisKKy8qIFNoaWZ0IHNoaWZ0X251bSBpdGVtcyAoYW5kIHNoaWZ0X2J5dGVzIG9mIGxhc3Qgc2hpZnRlZCBpdGVtIGlmIHNoaWZ0X2J5dGVzICE9IC0xKQorICAgZnJvbSBTWzBdIHRvIExbMF0gYW5kIHJlcGxhY2UgdGhlIGRlbGltaXRpbmcga2V5ICovCitpbnQgbGVhZl9zaGlmdF9sZWZ0IChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIGludCBzaGlmdF9udW0sIGludCBzaGlmdF9ieXRlcykKK3sKKyAgc3RydWN0IGJ1ZmZlcl9oZWFkICogUzAgPSBQQVRIX1BMQVNUX0JVRkZFUiAodGItPnRiX3BhdGgpOworICBpbnQgaTsKKworICAvKiBtb3ZlIHNoaWZ0X251bSAoYW5kIHNoaWZ0X2J5dGVzIGJ5dGVzKSBpdGVtcyBmcm9tIFNbMF0gdG8gbGVmdCBuZWlnaGJvciBMWzBdICovCisgIGkgPSBsZWFmX21vdmVfaXRlbXMgKExFQUZfRlJPTV9TX1RPX0wsIHRiLCBzaGlmdF9udW0sIHNoaWZ0X2J5dGVzLCBOVUxMKTsKKworICBpZiAoIHNoaWZ0X251bSApIHsKKyAgICBpZiAoQl9OUl9JVEVNUyAoUzApID09IDApIHsgLyogbnVtYmVyIG9mIGl0ZW1zIGluIFNbMF0gPT0gMCAqLworCisgICAgICBSRkFMU0UoIHNoaWZ0X2J5dGVzICE9IC0xLAorCSAgICAgICJ2cy0xMDI3MDogUzAgaXMgZW1wdHkgbm93LCBidXQgc2hpZnRfYnl0ZXMgIT0gLTEgKCVkKSIsIAorCSAgICAgIHNoaWZ0X2J5dGVzKTsKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKyAgICAgIGlmICh0Yi0+dGJfbW9kZSA9PSBNX1BBU1RFIHx8IHRiLT50Yl9tb2RlID09IE1fSU5TRVJUKSB7CisJcHJpbnRfY3VyX3RiICgidnMtMTAyNzUiKTsKKwlyZWlzZXJmc19wYW5pYyAodGItPnRiX3NiLCAidnMtMTAyNzU6IGxlYWZfc2hpZnRfbGVmdDogYmFsYW5jZSBjb25kaXRpb24gY29ycnVwdGVkICglYykiLCB0Yi0+dGJfbW9kZSk7CisgICAgICB9CisjZW5kaWYKKworICAgICAgaWYgKFBBVEhfSF9QT1NJVElPTiAodGItPnRiX3BhdGgsIDEpID09IDApCisJcmVwbGFjZV9rZXkgKHRiLCB0Yi0+Q0ZMWzBdLCB0Yi0+bGtleVswXSwgUEFUSF9IX1BQQVJFTlQgKHRiLT50Yl9wYXRoLCAwKSwgMCk7CisKKyAgICB9IGVsc2UgeyAgICAgCisgICAgICAvKiByZXBsYWNlIGxrZXkgaW4gQ0ZMWzBdIGJ5IDAtdGgga2V5IGZyb20gU1swXTsgKi8KKyAgICAgIHJlcGxhY2Vfa2V5ICh0YiwgdGItPkNGTFswXSwgdGItPmxrZXlbMF0sIFMwLCAwKTsKKyAgICAgIAorICAgICAgUkZBTFNFKCAoc2hpZnRfYnl0ZXMgIT0gLTEgJiYKKyAgICAgICAgICAgICAgIShpc19kaXJlbnRyeV9sZV9paCAoQl9OX1BJVEVNX0hFQUQgKFMwLCAwKSkKKyAgICAgICAgICAgICAgICAmJiAhSV9FTlRSWV9DT1VOVCAoQl9OX1BJVEVNX0hFQUQgKFMwLCAwKSkpKSAmJgorCSAgICAgICghb3BfaXNfbGVmdF9tZXJnZWFibGUgKEJfTl9QS0VZIChTMCwgMCksIFMwLT5iX3NpemUpKSwKKwkgICAgICAidnMtMTAyODA6IGl0ZW0gbXVzdCBiZSBtZXJnZWFibGUiKTsKKyAgICB9CisgIH0KKyAgCisgIHJldHVybiBpOworfQorCisKKworCisKKy8qIENMRUFOSU5HIFNUT1BQRUQgSEVSRSAqLworCisKKworCisvKiBTaGlmdCBzaGlmdF9udW0gKHNoaWZ0X2J5dGVzKSBpdGVtcyBmcm9tIFNbMF0gdG8gdGhlIHJpZ2h0IG5laWdoYm9yLCBhbmQgcmVwbGFjZSB0aGUgZGVsaW1pdGluZyBrZXkgKi8KK2ludAlsZWFmX3NoaWZ0X3JpZ2h0KAorCQlzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIsIAorCQlpbnQgc2hpZnRfbnVtLAorCQlpbnQgc2hpZnRfYnl0ZXMKKwkpCit7CisgIC8vICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBTMCA9IFBBVEhfUExBU1RfQlVGRkVSICh0Yi0+dGJfcGF0aCk7CisgIGludCByZXRfdmFsdWU7CisKKyAgLyogbW92ZSBzaGlmdF9udW0gKGFuZCBzaGlmdF9ieXRlcykgaXRlbXMgZnJvbSBTWzBdIHRvIHJpZ2h0IG5laWdoYm9yIFJbMF0gKi8KKyAgcmV0X3ZhbHVlID0gbGVhZl9tb3ZlX2l0ZW1zIChMRUFGX0ZST01fU19UT19SLCB0Yiwgc2hpZnRfbnVtLCBzaGlmdF9ieXRlcywgTlVMTCk7CisKKyAgLyogcmVwbGFjZSBya2V5IGluIENGUlswXSBieSB0aGUgMC10aCBrZXkgZnJvbSBSWzBdICovCisgIGlmIChzaGlmdF9udW0pIHsKKyAgICByZXBsYWNlX2tleSAodGIsIHRiLT5DRlJbMF0sIHRiLT5ya2V5WzBdLCB0Yi0+UlswXSwgMCk7CisKKyAgfQorCisgIHJldHVybiByZXRfdmFsdWU7Cit9CisKKworCitzdGF0aWMgdm9pZCBsZWFmX2RlbGV0ZV9pdGVtc19lbnRpcmVseSAoc3RydWN0IGJ1ZmZlcl9pbmZvICogYmksCisJCQkJCWludCBmaXJzdCwgaW50IGRlbF9udW0pOworLyogIElmIGRlbF9ieXRlcyA9PSAtMSwgc3RhcnRpbmcgZnJvbSBwb3NpdGlvbiAnZmlyc3QnIGRlbGV0ZSBkZWxfbnVtIGl0ZW1zIGluIHdob2xlIGluIGJ1ZmZlciBDVVIuCisgICAgSWYgbm90LiAKKyAgICBJZiBsYXN0X2ZpcnN0ID09IDAuIFN0YXJ0aW5nIGZyb20gcG9zaXRpb24gJ2ZpcnN0JyBkZWxldGUgZGVsX251bS0xIGl0ZW1zIGluIHdob2xlLiBEZWxldGUgcGFydCBvZiBib2R5IG9mCisgICAgdGhlIGZpcnN0IGl0ZW0uIFBhcnQgZGVmaW5lZCBieSBkZWxfYnl0ZXMuIERvbid0IGRlbGV0ZSBmaXJzdCBpdGVtIGhlYWRlcgorICAgIElmIGxhc3RfZmlyc3QgPT0gMS4gU3RhcnRpbmcgZnJvbSBwb3NpdGlvbiAnZmlyc3QrMScgZGVsZXRlIGRlbF9udW0tMSBpdGVtcyBpbiB3aG9sZS4gRGVsZXRlIHBhcnQgb2YgYm9keSBvZgorICAgIHRoZSBsYXN0IGl0ZW0gLiBQYXJ0IGRlZmluZWQgYnkgZGVsX2J5dGVzLiBEb24ndCBkZWxldGUgbGFzdCBpdGVtIGhlYWRlci4KKyovCit2b2lkIGxlYWZfZGVsZXRlX2l0ZW1zIChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBjdXJfYmksIGludCBsYXN0X2ZpcnN0LCAKKwkJCWludCBmaXJzdCwgaW50IGRlbF9udW0sIGludCBkZWxfYnl0ZXMpCit7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisgICAgaW50IGl0ZW1fYW1vdW50ID0gQl9OUl9JVEVNUyAoYmggPSBjdXJfYmktPmJpX2JoKTsKKworICAgIFJGQUxTRSggIWJoLCAiMTAxNTU6IGJoIGlzIG5vdCBkZWZpbmVkIik7CisgICAgUkZBTFNFKCBkZWxfbnVtIDwgMCwgIjEwMTYwOiBkZWxfbnVtIGNhbiBub3QgYmUgPCAwLiBkZWxfbnVtPT0lZCIsIGRlbF9udW0pOworICAgIFJGQUxTRSggZmlyc3QgPCAwIHx8IGZpcnN0ICsgZGVsX251bSA+IGl0ZW1fYW1vdW50LAorCSAgICAiMTAxNjU6IGludmFsaWQgbnVtYmVyIG9mIGZpcnN0IGl0ZW0gdG8gYmUgZGVsZXRlZCAoJWQpIG9yICIKKwkgICAgIm5vIHNvIG11Y2ggaXRlbXMgKCVkKSB0byBkZWxldGUgKG9ubHkgJWQpIiwgCisJICAgIGZpcnN0LCBmaXJzdCArIGRlbF9udW0sIGl0ZW1fYW1vdW50KTsKKworICAgIGlmICggZGVsX251bSA9PSAwICkKKwlyZXR1cm47CisKKyAgICBpZiAoIGZpcnN0ID09IDAgJiYgZGVsX251bSA9PSBpdGVtX2Ftb3VudCAmJiBkZWxfYnl0ZXMgPT0gLTEgKSB7CisJbWFrZV9lbXB0eV9ub2RlIChjdXJfYmkpOworCWRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5IChjdXJfYmktPnRiLCBiaCwgMCk7CisJcmV0dXJuOworICAgIH0KKworICAgIGlmICggZGVsX2J5dGVzID09IC0xICkKKwkvKiBkZWxldGUgZGVsX251bSBpdGVtcyBiZWdpbm5pbmcgZnJvbSBpdGVtIGluIHBvc2l0aW9uIGZpcnN0ICovCisJbGVhZl9kZWxldGVfaXRlbXNfZW50aXJlbHkgKGN1cl9iaSwgZmlyc3QsIGRlbF9udW0pOworICAgIGVsc2UgeworCWlmICggbGFzdF9maXJzdCA9PSBGSVJTVF9UT19MQVNUICkgeworCSAgICAvKiBkZWxldGUgZGVsX251bS0xIGl0ZW1zIGJlZ2lubmluZyBmcm9tIGl0ZW0gaW4gcG9zaXRpb24gZmlyc3QgICovCisJICAgIGxlYWZfZGVsZXRlX2l0ZW1zX2VudGlyZWx5IChjdXJfYmksIGZpcnN0LCBkZWxfbnVtLTEpOworCisJICAgIC8qIGRlbGV0ZSB0aGUgcGFydCBvZiB0aGUgZmlyc3QgaXRlbSBvZiB0aGUgYmgKKwkgICAgICAgZG8gbm90IGRlbGV0ZSBpdGVtIGhlYWRlcgorCSAgICAqLworCSAgICBsZWFmX2N1dF9mcm9tX2J1ZmZlciAoY3VyX2JpLCAwLCAwLCBkZWxfYnl0ZXMpOworCX0gZWxzZSAgeworCSAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWg7CisJICAgIGludCBsZW47CisKKwkgICAgLyogZGVsZXRlIGRlbF9udW0tMSBpdGVtcyBiZWdpbm5pbmcgZnJvbSBpdGVtIGluIHBvc2l0aW9uIGZpcnN0KzEgICovCisJICAgIGxlYWZfZGVsZXRlX2l0ZW1zX2VudGlyZWx5IChjdXJfYmksIGZpcnN0KzEsIGRlbF9udW0tMSk7CisKKwkgICAgaWYgKGlzX2RpcmVudHJ5X2xlX2loIChpaCA9IEJfTl9QSVRFTV9IRUFEKGJoLCBCX05SX0lURU1TKGJoKS0xKSkpIAkvKiB0aGUgbGFzdCBpdGVtIGlzIGRpcmVjdG9yeSAgKi8KKwkgICAgICAgIC8qIGxlbiA9IG51bWJlcnMgb2YgZGlyZWN0b3J5IGVudHJpZXMgaW4gdGhpcyBpdGVtICovCisJCWxlbiA9IGloX2VudHJ5X2NvdW50KGloKTsKKwkgICAgZWxzZQorCSAgICAgICAgLyogbGVuID0gYm9keSBsZW4gb2YgaXRlbSAqLworCQlsZW4gPSBpaF9pdGVtX2xlbihpaCk7CisKKwkgICAgLyogZGVsZXRlIHRoZSBwYXJ0IG9mIHRoZSBsYXN0IGl0ZW0gb2YgdGhlIGJoIAorCSAgICAgICBkbyBub3QgZGVsZXRlIGl0ZW0gaGVhZGVyCisJICAgICovCisJICAgIGxlYWZfY3V0X2Zyb21fYnVmZmVyIChjdXJfYmksIEJfTlJfSVRFTVMoYmgpLTEsIGxlbiAtIGRlbF9ieXRlcywgZGVsX2J5dGVzKTsKKwl9CisgICAgfQorfQorCisKKy8qIGluc2VydCBpdGVtIGludG8gdGhlIGxlYWYgbm9kZSBpbiBwb3NpdGlvbiBiZWZvcmUgKi8KK3ZvaWQgbGVhZl9pbnNlcnRfaW50b19idWYgKHN0cnVjdCBidWZmZXJfaW5mbyAqIGJpLCBpbnQgYmVmb3JlLAorCQkJICAgc3RydWN0IGl0ZW1faGVhZCAqIGluc2VydGVkX2l0ZW1faWgsCisJCQkgICBjb25zdCBjaGFyICogaW5zZXJ0ZWRfaXRlbV9ib2R5LAorCQkJICAgaW50IHplcm9zX251bWJlcikKK3sKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCA9IGJpLT5iaV9iaDsKKyAgICBpbnQgbnIsIGZyZWVfc3BhY2U7CisgICAgc3RydWN0IGJsb2NrX2hlYWQgKiBibGtoOworICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKKyAgICBpbnQgaTsKKyAgICBpbnQgbGFzdF9sb2MsIHVubW92ZWRfbG9jOworICAgIGNoYXIgKiB0bzsKKworCisgICAgYmxraCA9IEJfQkxLX0hFQUQoYmgpOworICAgIG5yID0gYmxraF9ucl9pdGVtKGJsa2gpOworICAgIGZyZWVfc3BhY2UgPSBibGtoX2ZyZWVfc3BhY2UoIGJsa2ggKTsKKworICAgIC8qIGNoZWNrIGZyZWUgc3BhY2UgKi8KKyAgICBSRkFMU0UoIGZyZWVfc3BhY2UgPCBpaF9pdGVtX2xlbihpbnNlcnRlZF9pdGVtX2loKSArIElIX1NJWkUsCisgICAgICAgICAgICAidnMtMTAxNzA6IG5vdCBlbm91Z2ggZnJlZSBzcGFjZSBpbiBibG9jayAleiwgbmV3IGl0ZW0gJWgiLAorICAgICAgICAgICAgYmgsIGluc2VydGVkX2l0ZW1faWgpOworICAgIFJGQUxTRSggemVyb3NfbnVtYmVyID4gaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCksCisJICAgICJ2cy0xMDE3MjogemVybyBudW1iZXIgPT0gJWQsIGl0ZW0gbGVuZ3RoID09ICVkIiwKKyAgICAgICAgICAgIHplcm9zX251bWJlciwgaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCkpOworCisKKyAgICAvKiBnZXQgaXRlbSBuZXcgaXRlbSBtdXN0IGJlIGluc2VydGVkIGJlZm9yZSAqLworICAgIGloID0gQl9OX1BJVEVNX0hFQUQgKGJoLCBiZWZvcmUpOworCisgICAgLyogcHJlcGFyZSBzcGFjZSBmb3IgdGhlIGJvZHkgb2YgbmV3IGl0ZW0gKi8KKyAgICBsYXN0X2xvYyA9IG5yID8gaWhfbG9jYXRpb24oICYoaWhbbnIgLSBiZWZvcmUgLSAxXSkgKSA6IGJoLT5iX3NpemU7CisgICAgdW5tb3ZlZF9sb2MgPSBiZWZvcmUgPyBpaF9sb2NhdGlvbiggaWgtMSApIDogYmgtPmJfc2l6ZTsKKworCisgICAgbWVtbW92ZSAoYmgtPmJfZGF0YSArIGxhc3RfbG9jIC0gaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCksIAorCSAgICAgYmgtPmJfZGF0YSArIGxhc3RfbG9jLCB1bm1vdmVkX2xvYyAtIGxhc3RfbG9jKTsKKworICAgIHRvID0gYmgtPmJfZGF0YSArIHVubW92ZWRfbG9jIC0gaWhfaXRlbV9sZW4oaW5zZXJ0ZWRfaXRlbV9paCk7CisgICAgbWVtc2V0ICh0bywgMCwgemVyb3NfbnVtYmVyKTsKKyAgICB0byArPSB6ZXJvc19udW1iZXI7CisKKyAgICAvKiBjb3B5IGJvZHkgdG8gcHJlcGFyZWQgc3BhY2UgKi8KKyAgICBpZiAoaW5zZXJ0ZWRfaXRlbV9ib2R5KQorCW1lbW1vdmUgKHRvLCBpbnNlcnRlZF9pdGVtX2JvZHksIGloX2l0ZW1fbGVuKGluc2VydGVkX2l0ZW1faWgpIC0gemVyb3NfbnVtYmVyKTsKKyAgICBlbHNlCisJbWVtc2V0KHRvLCAnXDAnLCBpaF9pdGVtX2xlbihpbnNlcnRlZF9pdGVtX2loKSAtIHplcm9zX251bWJlcik7CisgIAorICAgIC8qIGluc2VydCBpdGVtIGhlYWRlciAqLworICAgIG1lbW1vdmUgKGloICsgMSwgaWgsIElIX1NJWkUgKiAobnIgLSBiZWZvcmUpKTsKKyAgICBtZW1tb3ZlIChpaCwgaW5zZXJ0ZWRfaXRlbV9paCwgSUhfU0laRSk7CisgIAorICAgIC8qIGNoYW5nZSBsb2NhdGlvbnMgKi8KKyAgICBmb3IgKGkgPSBiZWZvcmU7IGkgPCBuciArIDE7IGkgKyspCisgICAgeworICAgICAgICB1bm1vdmVkX2xvYyAtPSBpaF9pdGVtX2xlbiggJihpaFtpLWJlZm9yZV0pKTsKKwlwdXRfaWhfbG9jYXRpb24oICYoaWhbaS1iZWZvcmVdKSwgdW5tb3ZlZF9sb2MgKTsKKyAgICB9CisgIAorICAgIC8qIHNpemVzLCBmcmVlIHNwYWNlLCBpdGVtIG51bWJlciAqLworICAgIHNldF9ibGtoX25yX2l0ZW0oIGJsa2gsIGJsa2hfbnJfaXRlbShibGtoKSArIDEgKTsKKyAgICBzZXRfYmxraF9mcmVlX3NwYWNlKCBibGtoLAorICAgICAgICAgICAgICAgICAgICBmcmVlX3NwYWNlIC0gKElIX1NJWkUgKyBpaF9pdGVtX2xlbihpbnNlcnRlZF9pdGVtX2loICkgKSApOworICAgIGRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5IChiaS0+dGIsIGJoLCAxKTsKKworICAgIGlmIChiaS0+YmlfcGFyZW50KSB7IAorCXN0cnVjdCBkaXNrX2NoaWxkICp0X2RjOworCXRfZGMgPSBCX05fQ0hJTEQgKGJpLT5iaV9wYXJlbnQsIGJpLT5iaV9wb3NpdGlvbik7CisJcHV0X2RjX3NpemUoIHRfZGMsIGRjX3NpemUodF9kYykgKyAoSUhfU0laRSArIGloX2l0ZW1fbGVuKGluc2VydGVkX2l0ZW1faWgpKSk7CisJZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5IChiaS0+dGIsIGJpLT5iaV9wYXJlbnQsIDApOworICAgIH0KK30KKworCisvKiBwYXN0ZSBwYXN0ZV9zaXplIGJ5dGVzIHRvIGFmZmVjdGVkX2l0ZW1fbnVtLXRoIGl0ZW0uIAorICAgV2hlbiBpdGVtIGlzIGEgZGlyZWN0b3J5LCB0aGlzIG9ubHkgcHJlcGFyZSBzcGFjZSBmb3IgbmV3IGVudHJpZXMgKi8KK3ZvaWQgbGVhZl9wYXN0ZV9pbl9idWZmZXIgKHN0cnVjdCBidWZmZXJfaW5mbyAqIGJpLCBpbnQgYWZmZWN0ZWRfaXRlbV9udW0sCisJCQkgICBpbnQgcG9zX2luX2l0ZW0sIGludCBwYXN0ZV9zaXplLAorCQkJICAgY29uc3QgY2hhciAqIGJvZHksCisJCQkgICBpbnQgemVyb3NfbnVtYmVyKQoreworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoID0gYmktPmJpX2JoOworICAgIGludCBuciwgZnJlZV9zcGFjZTsKKyAgICBzdHJ1Y3QgYmxvY2tfaGVhZCAqIGJsa2g7CisgICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOworICAgIGludCBpOworICAgIGludCBsYXN0X2xvYywgdW5tb3ZlZF9sb2M7CisKKyAgICBibGtoID0gQl9CTEtfSEVBRChiaCk7CisgICAgbnIgPSBibGtoX25yX2l0ZW0oYmxraCk7CisgICAgZnJlZV9zcGFjZSA9IGJsa2hfZnJlZV9zcGFjZShibGtoKTsKKworCisgICAgLyogY2hlY2sgZnJlZSBzcGFjZSAqLworICAgIFJGQUxTRSggZnJlZV9zcGFjZSA8IHBhc3RlX3NpemUsCisgICAgICAgICAgICAidnMtMTAxNzU6IG5vdCBlbm91Z2ggZnJlZSBzcGFjZTogbmVlZGVkICVkLCBhdmFpbGFibGUgJWQiLAorICAgICAgICAgICAgcGFzdGVfc2l6ZSwgZnJlZV9zcGFjZSk7CisKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKyAgICBpZiAoemVyb3NfbnVtYmVyID4gcGFzdGVfc2l6ZSkgeworCXByaW50X2N1cl90YiAoIjEwMTc3Iik7CisJcmVpc2VyZnNfcGFuaWMgKCBOVUxMLCAidnMtMTAxNzc6IGxlYWZfcGFzdGVfaW5fYnVmZmVyOiBlcm8gbnVtYmVyID09ICVkLCBwYXN0ZV9zaXplID09ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB6ZXJvc19udW1iZXIsIHBhc3RlX3NpemUpOworICAgIH0KKyNlbmRpZiAvKiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sgKi8KKworCisgICAgLyogaXRlbSB0byBiZSBhcHBlbmRlZCAqLworICAgIGloID0gQl9OX1BJVEVNX0hFQUQoYmgsIGFmZmVjdGVkX2l0ZW1fbnVtKTsKKworICAgIGxhc3RfbG9jID0gaWhfbG9jYXRpb24oICYoaWhbbnIgLSBhZmZlY3RlZF9pdGVtX251bSAtIDFdKSApOworICAgIHVubW92ZWRfbG9jID0gYWZmZWN0ZWRfaXRlbV9udW0gPyBpaF9sb2NhdGlvbiggaWgtMSApIDogYmgtPmJfc2l6ZTsKKworICAgIC8qIHByZXBhcmUgc3BhY2UgKi8KKyAgICBtZW1tb3ZlIChiaC0+Yl9kYXRhICsgbGFzdF9sb2MgLSBwYXN0ZV9zaXplLCBiaC0+Yl9kYXRhICsgbGFzdF9sb2MsCisJICAgICB1bm1vdmVkX2xvYyAtIGxhc3RfbG9jKTsKKworCisgICAgLyogY2hhbmdlIGxvY2F0aW9ucyAqLworICAgIGZvciAoaSA9IGFmZmVjdGVkX2l0ZW1fbnVtOyBpIDwgbnI7IGkgKyspCisJcHV0X2loX2xvY2F0aW9uKCAmKGloW2ktYWZmZWN0ZWRfaXRlbV9udW1dKSwKKyAgICAgICAgICAgICAgICAgICAgaWhfbG9jYXRpb24oICYoaWhbaS1hZmZlY3RlZF9pdGVtX251bV0pKSAtIHBhc3RlX3NpemUgKTsKKworICAgIGlmICggYm9keSApIHsKKwlpZiAoIWlzX2RpcmVudHJ5X2xlX2loIChpaCkpIHsKKwkgICAgaWYgKCFwb3NfaW5faXRlbSkgeworCQkvKiBzaGlmdCBkYXRhIHRvIHJpZ2h0ICovCisJCW1lbW1vdmUgKGJoLT5iX2RhdGEgKyBpaF9sb2NhdGlvbihpaCkgKyBwYXN0ZV9zaXplLCAKKwkJCSBiaC0+Yl9kYXRhICsgaWhfbG9jYXRpb24oaWgpLCBpaF9pdGVtX2xlbihpaCkpOworCQkvKiBwYXN0ZSBkYXRhIGluIHRoZSBoZWFkIG9mIGl0ZW0gKi8KKwkJbWVtc2V0IChiaC0+Yl9kYXRhICsgaWhfbG9jYXRpb24oaWgpLCAwLCB6ZXJvc19udW1iZXIpOworCQltZW1jcHkgKGJoLT5iX2RhdGEgKyBpaF9sb2NhdGlvbihpaCkgKyB6ZXJvc19udW1iZXIsIGJvZHksIHBhc3RlX3NpemUgLSB6ZXJvc19udW1iZXIpOworCSAgICB9IGVsc2UgeworCQltZW1zZXQgKGJoLT5iX2RhdGEgKyB1bm1vdmVkX2xvYyAtIHBhc3RlX3NpemUsIDAsIHplcm9zX251bWJlcik7CisJCW1lbWNweSAoYmgtPmJfZGF0YSArIHVubW92ZWRfbG9jIC0gcGFzdGVfc2l6ZSArIHplcm9zX251bWJlciwgYm9keSwgcGFzdGVfc2l6ZSAtIHplcm9zX251bWJlcik7CisJICAgIH0KKwl9CisgICAgfQorICAgIGVsc2UKKwltZW1zZXQoYmgtPmJfZGF0YSArIHVubW92ZWRfbG9jIC0gcGFzdGVfc2l6ZSwgJ1wwJywgcGFzdGVfc2l6ZSk7CisKKyAgICBwdXRfaWhfaXRlbV9sZW4oIGloLCBpaF9pdGVtX2xlbihpaCkgKyBwYXN0ZV9zaXplICk7CisKKyAgICAvKiBjaGFuZ2UgZnJlZSBzcGFjZSAqLworICAgIHNldF9ibGtoX2ZyZWVfc3BhY2UoIGJsa2gsIGZyZWVfc3BhY2UgLSBwYXN0ZV9zaXplICk7CisKKyAgICBkb19iYWxhbmNlX21hcmtfbGVhZl9kaXJ0eSAoYmktPnRiLCBiaCwgMCk7CisKKyAgICBpZiAoYmktPmJpX3BhcmVudCkgeyAKKwlzdHJ1Y3QgZGlza19jaGlsZCAqdF9kYyA9IEJfTl9DSElMRCAoYmktPmJpX3BhcmVudCwgYmktPmJpX3Bvc2l0aW9uKTsKKwlwdXRfZGNfc2l6ZSggdF9kYywgZGNfc2l6ZSh0X2RjKSArIHBhc3RlX3NpemUgKTsKKwlkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKGJpLT50YiwgYmktPmJpX3BhcmVudCwgMCk7CisgICAgfQorfQorCisKKy8qIGN1dHMgREVMX0NPVU5UIGVudHJpZXMgYmVnaW5uaW5nIGZyb20gRlJPTS10aCBlbnRyeS4gRGlyZWN0b3J5IGl0ZW0KKyAgIGRvZXMgbm90IGhhdmUgZnJlZSBzcGFjZSwgc28gaXQgbW92ZXMgREVIcyBhbmQgcmVtYWluaW5nIHJlY29yZHMgYXMKKyAgIG5lY2Vzc2FyeS4gUmV0dXJuIHZhbHVlIGlzIHNpemUgb2YgcmVtb3ZlZCBwYXJ0IG9mIGRpcmVjdG9yeSBpdGVtCisgICBpbiBieXRlcy4gKi8KK3N0YXRpYyBpbnQJbGVhZl9jdXRfZW50cmllcyAoCisJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgsCisJCQkJc3RydWN0IGl0ZW1faGVhZCAqIGloLCAKKwkJCQlpbnQgZnJvbSwgCisJCQkJaW50IGRlbF9jb3VudAorCQkJKQoreworICBjaGFyICogaXRlbTsKKyAgc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKiBkZWg7CisgIGludCBwcmV2X3JlY29yZF9vZmZzZXQ7CS8qIG9mZnNldCBvZiByZWNvcmQsIHRoYXQgaXMgKGZyb20tMSl0aCAqLworICBjaGFyICogcHJldl9yZWNvcmQ7CQkvKiAqLworICBpbnQgY3V0X3JlY29yZHNfbGVuOwkJLyogbGVuZ3RoIG9mIGFsbCByZW1vdmVkIHJlY29yZHMgKi8KKyAgaW50IGk7CisKKworICAvKiBtYWtlIHN1cmUsIHRoYXQgaXRlbSBpcyBkaXJlY3RvcnkgYW5kIHRoZXJlIGFyZSBlbm91Z2ggZW50cmllcyB0bworICAgICByZW1vdmUgKi8KKyAgUkZBTFNFKCAhaXNfZGlyZW50cnlfbGVfaWggKGloKSwgIjEwMTgwOiBpdGVtIGlzIG5vdCBkaXJlY3RvcnkgaXRlbSIpOworICBSRkFMU0UoIElfRU5UUllfQ09VTlQoaWgpIDwgZnJvbSArIGRlbF9jb3VudCwKKwkgICIxMDE4NTogaXRlbSBjb250YWlucyBub3QgZW5vdWdoIGVudHJpZXM6IGVudHJ5X2NvdXQgPSAlZCwgZnJvbSA9ICVkLCB0byBkZWxldGUgPSAlZCIsCisJICBJX0VOVFJZX0NPVU5UKGloKSwgZnJvbSwgZGVsX2NvdW50KTsKKworICBpZiAoZGVsX2NvdW50ID09IDApCisgICAgcmV0dXJuIDA7CisKKyAgLyogZmlyc3QgYnl0ZSBvZiBpdGVtICovCisgIGl0ZW0gPSBiaC0+Yl9kYXRhICsgaWhfbG9jYXRpb24oaWgpOworCisgIC8qIGVudHJ5IGhlYWQgYXJyYXkgKi8KKyAgZGVoID0gQl9JX0RFSCAoYmgsIGloKTsKKworICAvKiBmaXJzdCBieXRlIG9mIHJlbWFpbmluZyBlbnRyaWVzLCB0aG9zZSBhcmUgQkVGT1JFIGN1dCBlbnRyaWVzCisgICAgIChwcmV2X3JlY29yZCkgYW5kIGxlbmd0aCBvZiBhbGwgcmVtb3ZlZCByZWNvcmRzIChjdXRfcmVjb3Jkc19sZW4pICovCisgIHByZXZfcmVjb3JkX29mZnNldCA9IChmcm9tID8gZGVoX2xvY2F0aW9uKCAmKGRlaFtmcm9tIC0gMV0pKSA6IGloX2l0ZW1fbGVuKGloKSk7CisgIGN1dF9yZWNvcmRzX2xlbiA9IHByZXZfcmVjb3JkX29mZnNldC8qZnJvbV9yZWNvcmQqLyAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlaF9sb2NhdGlvbiggJihkZWhbZnJvbSArIGRlbF9jb3VudCAtIDFdKSk7CisgIHByZXZfcmVjb3JkID0gaXRlbSArIHByZXZfcmVjb3JkX29mZnNldDsKKworCisgIC8qIGFkanVzdCBsb2NhdGlvbnMgb2YgcmVtYWluaW5nIGVudHJpZXMgKi8KKyAgZm9yIChpID0gSV9FTlRSWV9DT1VOVChpaCkgLSAxOyBpID4gZnJvbSArIGRlbF9jb3VudCAtIDE7IGkgLS0pCisgICAgcHV0X2RlaF9sb2NhdGlvbiggJihkZWhbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVoX2xvY2F0aW9uKCAmZGVoW2ldICkgLSAoREVIX1NJWkUgKiBkZWxfY291bnQgKSApOworCisgIGZvciAoaSA9IDA7IGkgPCBmcm9tOyBpICsrKQorICAgIHB1dF9kZWhfbG9jYXRpb24oICYoZGVoW2ldKSwKKyAgICAgICAgZGVoX2xvY2F0aW9uKCAmZGVoW2ldICkgLSAoREVIX1NJWkUgKiBkZWxfY291bnQgKyBjdXRfcmVjb3Jkc19sZW4pICk7CisKKyAgcHV0X2loX2VudHJ5X2NvdW50KCBpaCwgaWhfZW50cnlfY291bnQoaWgpIC0gZGVsX2NvdW50ICk7CisKKyAgLyogc2hpZnQgZW50cnkgaGVhZCBhcnJheSBhbmQgZW50cmllcyB0aG9zZSBhcmUgQUZURVIgcmVtb3ZlZCBlbnRyaWVzICovCisgIG1lbW1vdmUgKChjaGFyICopKGRlaCArIGZyb20pLAorCSAgIGRlaCArIGZyb20gKyBkZWxfY291bnQsIAorCSAgIHByZXZfcmVjb3JkIC0gY3V0X3JlY29yZHNfbGVuIC0gKGNoYXIgKikoZGVoICsgZnJvbSArIGRlbF9jb3VudCkpOworICAKKyAgLyogc2hpZnQgcmVjb3JkcywgdGhvc2UgYXJlIEJFRk9SRSByZW1vdmVkIGVudHJpZXMgKi8KKyAgbWVtbW92ZSAocHJldl9yZWNvcmQgLSBjdXRfcmVjb3Jkc19sZW4gLSBERUhfU0laRSAqIGRlbF9jb3VudCwKKwkgICBwcmV2X3JlY29yZCwgaXRlbSArIGloX2l0ZW1fbGVuKGloKSAtIHByZXZfcmVjb3JkKTsKKworICByZXR1cm4gREVIX1NJWkUgKiBkZWxfY291bnQgKyBjdXRfcmVjb3Jkc19sZW47Cit9CisKKworLyogIHdoZW4gY3V0IGl0ZW0gaXMgcGFydCBvZiByZWd1bGFyIGZpbGUKKyAgICAgICAgcG9zX2luX2l0ZW0gLSBmaXJzdCBieXRlIHRoYXQgbXVzdCBiZSBjdXQKKyAgICAgICAgY3V0X3NpemUgLSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgY3V0IGJlZ2lubmluZyBmcm9tIHBvc19pbl9pdGVtCisgCisgICB3aGVuIGN1dCBpdGVtIGlzIHBhcnQgb2YgZGlyZWN0b3J5CisgICAgICAgIHBvc19pbl9pdGVtIC0gbnVtYmVyIG9mIGZpcnN0IGRlbGV0ZWQgZW50cnkKKyAgICAgICAgY3V0X3NpemUgLSBjb3VudCBvZiBkZWxldGVkIGVudHJpZXMKKyAgICAqLwordm9pZCBsZWFmX2N1dF9mcm9tX2J1ZmZlciAoc3RydWN0IGJ1ZmZlcl9pbmZvICogYmksIGludCBjdXRfaXRlbV9udW0sCisJCQkgICBpbnQgcG9zX2luX2l0ZW0sIGludCBjdXRfc2l6ZSkKK3sKKyAgICBpbnQgbnI7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmggPSBiaS0+YmlfYmg7CisgICAgc3RydWN0IGJsb2NrX2hlYWQgKiBibGtoOworICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKKyAgICBpbnQgbGFzdF9sb2MsIHVubW92ZWRfbG9jOworICAgIGludCBpOworCisgICAgYmxraCA9IEJfQkxLX0hFQUQoYmgpOworICAgIG5yID0gYmxraF9ucl9pdGVtKGJsa2gpOworCisgICAgLyogaXRlbSBoZWFkIG9mIHRydW5jYXRlZCBpdGVtICovCisgICAgaWggPSBCX05fUElURU1fSEVBRCAoYmgsIGN1dF9pdGVtX251bSk7CisKKyAgICBpZiAoaXNfZGlyZW50cnlfbGVfaWggKGloKSkgeworICAgICAgICAvKiBmaXJzdCBjdXQgZW50cnkgKCkqLworICAgICAgICBjdXRfc2l6ZSA9IGxlYWZfY3V0X2VudHJpZXMgKGJoLCBpaCwgcG9zX2luX2l0ZW0sIGN1dF9zaXplKTsKKyAgICAgICAgaWYgKHBvc19pbl9pdGVtID09IDApIHsKKwkgICAgICAgIC8qIGNoYW5nZSBrZXkgKi8KKyAgICAgICAgICAgIFJGQUxTRSggY3V0X2l0ZW1fbnVtLAorICAgICAgICAgICAgICAgICAgICAid2hlbiAwLXRoIGVucnR5IG9mIGl0ZW0gaXMgY3V0LCB0aGF0IGl0ZW0gbXVzdCBiZSBmaXJzdCBpbiB0aGUgbm9kZSwgbm90ICVkLXRoIiwgY3V0X2l0ZW1fbnVtKTsKKyAgICAgICAgICAgIC8qIGNoYW5nZSBpdGVtIGtleSBieSBrZXkgb2YgZmlyc3QgZW50cnkgaW4gdGhlIGl0ZW0gKi8KKwkgICAgc2V0X2xlX2loX2tfb2Zmc2V0IChpaCwgZGVoX29mZnNldChCX0lfREVIIChiaCwgaWgpKSk7CisgICAgICAgICAgICAvKm1lbWNweSAoJmloLT5paF9rZXkua19vZmZzZXQsICYoQl9JX0RFSCAoYmgsIGloKS0+ZGVoX29mZnNldCksIFNIT1JUX0tFWV9TSVpFKTsqLworCSAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogaXRlbSBpcyBkaXJlY3Qgb3IgaW5kaXJlY3QgKi8KKyAgICAgICAgUkZBTFNFKCBpc19zdGF0ZGF0YV9sZV9paCAoaWgpLCAiMTAxOTU6IGl0ZW0gaXMgc3RhdCBkYXRhIik7CisgICAgICAgIFJGQUxTRSggcG9zX2luX2l0ZW0gJiYgcG9zX2luX2l0ZW0gKyBjdXRfc2l6ZSAhPSBpaF9pdGVtX2xlbihpaCksCisgICAgICAgICAgICAgICAgIjEwMjAwOiBpbnZhbGlkIG9mZnNldCAoJWx1KSBvciB0cnVuY19zaXplICglbHUpIG9yIGloX2l0ZW1fbGVuICglbHUpIiwKKyAgICAgICAgICAgICAgICAoIGxvbmcgdW5zaWduZWQgKSBwb3NfaW5faXRlbSwgKCBsb25nIHVuc2lnbmVkICkgY3V0X3NpemUsIAorCQkoIGxvbmcgdW5zaWduZWQgKSBpaF9pdGVtX2xlbiAoaWgpKTsKKworICAgICAgICAvKiBzaGlmdCBpdGVtIGJvZHkgdG8gbGVmdCBpZiBjdXQgaXMgZnJvbSB0aGUgaGVhZCBvZiBpdGVtICovCisgICAgICAgIGlmIChwb3NfaW5faXRlbSA9PSAwKSB7CisgICAgICAgICAgICBtZW1tb3ZlKCBiaC0+Yl9kYXRhICsgaWhfbG9jYXRpb24oaWgpLAorCQkgICAgIGJoLT5iX2RhdGEgKyBpaF9sb2NhdGlvbihpaCkgKyBjdXRfc2l6ZSwKKwkJICAgICBpaF9pdGVtX2xlbihpaCkgLSBjdXRfc2l6ZSk7CisJICAgIAorICAgICAgICAgICAgLyogY2hhbmdlIGtleSBvZiBpdGVtICovCisgICAgICAgICAgICBpZiAoaXNfZGlyZWN0X2xlX2loIChpaCkpCisJCXNldF9sZV9paF9rX29mZnNldCAoaWgsIGxlX2loX2tfb2Zmc2V0IChpaCkgKyBjdXRfc2l6ZSk7CisgICAgICAgICAgICBlbHNlIHsKKwkJc2V0X2xlX2loX2tfb2Zmc2V0IChpaCwgbGVfaWhfa19vZmZzZXQgKGloKSArIChjdXRfc2l6ZSAvIFVORk1fUF9TSVpFKSAqIGJoLT5iX3NpemUpOworICAgICAgICAgICAgICAgIFJGQUxTRSggaWhfaXRlbV9sZW4oaWgpID09IGN1dF9zaXplICYmIGdldF9paF9mcmVlX3NwYWNlIChpaCksCisgICAgICAgICAgICAgICAgICAgICAgICAiMTAyMDU6IGludmFsaWQgaWhfZnJlZV9zcGFjZSAoJWgpIiwgaWgpOworCSAgICAgICAgfQorCSAgICB9CisgICAgfQorICAKKworICAgIC8qIGxvY2F0aW9uIG9mIHRoZSBsYXN0IGl0ZW0gKi8KKyAgICBsYXN0X2xvYyA9IGloX2xvY2F0aW9uKCAmKGloW25yIC0gY3V0X2l0ZW1fbnVtIC0gMV0pICk7CisKKyAgICAvKiBsb2NhdGlvbiBvZiB0aGUgaXRlbSwgd2hpY2ggaXMgcmVtYWluaW5nIGF0IHRoZSBzYW1lIHBsYWNlICovCisgICAgdW5tb3ZlZF9sb2MgPSBjdXRfaXRlbV9udW0gPyBpaF9sb2NhdGlvbihpaC0xKSA6IGJoLT5iX3NpemU7CisKKworICAgIC8qIHNoaWZ0ICovCisgICAgbWVtbW92ZSAoYmgtPmJfZGF0YSArIGxhc3RfbG9jICsgY3V0X3NpemUsIGJoLT5iX2RhdGEgKyBsYXN0X2xvYywKKwkgICAgICAgdW5tb3ZlZF9sb2MgLSBsYXN0X2xvYyAtIGN1dF9zaXplKTsKKworICAgIC8qIGNoYW5nZSBpdGVtIGxlbmd0aCAqLworICAgIHB1dF9paF9pdGVtX2xlbiggaWgsIGloX2l0ZW1fbGVuKGloKSAtIGN1dF9zaXplICk7CisgIAorICAgIGlmIChpc19pbmRpcmVjdF9sZV9paCAoaWgpKSB7CisgICAgICAgIGlmIChwb3NfaW5faXRlbSkKKyAgICAgICAgICAgIHNldF9paF9mcmVlX3NwYWNlIChpaCwgMCk7CisgICAgfQorCisgICAgLyogY2hhbmdlIGxvY2F0aW9ucyAqLworICAgIGZvciAoaSA9IGN1dF9pdGVtX251bTsgaSA8IG5yOyBpICsrKQorICAgIHB1dF9paF9sb2NhdGlvbiggJihpaFtpLWN1dF9pdGVtX251bV0pLCBpaF9sb2NhdGlvbiggJmloW2ktY3V0X2l0ZW1fbnVtXSkgKyBjdXRfc2l6ZSApOworCisgICAgLyogc2l6ZSwgZnJlZSBzcGFjZSAqLworICAgIHNldF9ibGtoX2ZyZWVfc3BhY2UoIGJsa2gsIGJsa2hfZnJlZV9zcGFjZShibGtoKSArIGN1dF9zaXplICk7CisKKyAgICBkb19iYWxhbmNlX21hcmtfbGVhZl9kaXJ0eSAoYmktPnRiLCBiaCwgMCk7CisgICAgCisgICAgaWYgKGJpLT5iaV9wYXJlbnQpIHsgCisgICAgICBzdHJ1Y3QgZGlza19jaGlsZCAqdF9kYzsKKyAgICAgIHRfZGMgPSBCX05fQ0hJTEQgKGJpLT5iaV9wYXJlbnQsIGJpLT5iaV9wb3NpdGlvbik7CisgICAgICBwdXRfZGNfc2l6ZSggdF9kYywgZGNfc2l6ZSh0X2RjKSAtIGN1dF9zaXplICk7CisgICAgICBkb19iYWxhbmNlX21hcmtfaW50ZXJuYWxfZGlydHkgKGJpLT50YiwgYmktPmJpX3BhcmVudCwgMCk7CisgICAgfQorfQorCisKKy8qIGRlbGV0ZSBkZWxfbnVtIGl0ZW1zIGZyb20gYnVmZmVyIHN0YXJ0aW5nIGZyb20gdGhlIGZpcnN0J3RoIGl0ZW0gKi8KK3N0YXRpYyB2b2lkIGxlYWZfZGVsZXRlX2l0ZW1zX2VudGlyZWx5IChzdHJ1Y3QgYnVmZmVyX2luZm8gKiBiaSwKKwkJCQkJaW50IGZpcnN0LCBpbnQgZGVsX251bSkKK3sKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCA9IGJpLT5iaV9iaDsKKyAgICBpbnQgbnI7CisgICAgaW50IGksIGo7CisgICAgaW50IGxhc3RfbG9jLCBsYXN0X3JlbW92ZWRfbG9jOworICAgIHN0cnVjdCBibG9ja19oZWFkICogYmxraDsKKyAgICBzdHJ1Y3QgaXRlbV9oZWFkICogaWg7CisKKyAgUkZBTFNFKCBiaCA9PSBOVUxMLCAiMTAyMTA6IGJ1ZmZlciBpcyAwIik7CisgIFJGQUxTRSggZGVsX251bSA8IDAsICIxMDIxNTogZGVsX251bSBsZXNzIHRoYW4gMCAoJWQpIiwgZGVsX251bSk7CisKKyAgaWYgKGRlbF9udW0gPT0gMCkKKyAgICByZXR1cm47CisKKyAgYmxraCA9IEJfQkxLX0hFQUQoYmgpOworICBuciA9IGJsa2hfbnJfaXRlbShibGtoKTsKKworICBSRkFMU0UoIGZpcnN0IDwgMCB8fCBmaXJzdCArIGRlbF9udW0gPiBuciwKKyAgICAgICAgICAiMTAyMjA6IGZpcnN0PSVkLCBudW1iZXI9JWQsIHRoZXJlIGlzICVkIGl0ZW1zIiwgZmlyc3QsIGRlbF9udW0sIG5yKTsKKworICBpZiAoZmlyc3QgPT0gMCAmJiBkZWxfbnVtID09IG5yKSB7CisgICAgLyogdGhpcyBkb2VzIG5vdCB3b3JrICovCisgICAgbWFrZV9lbXB0eV9ub2RlIChiaSk7CisgICAgCisgICAgZG9fYmFsYW5jZV9tYXJrX2xlYWZfZGlydHkgKGJpLT50YiwgYmgsIDApOworICAgIHJldHVybjsKKyAgfQorCisgIGloID0gQl9OX1BJVEVNX0hFQUQgKGJoLCBmaXJzdCk7CisgIAorICAvKiBsb2NhdGlvbiBvZiB1bm1vdmFibGUgaXRlbSAqLworICBqID0gKGZpcnN0ID09IDApID8gYmgtPmJfc2l6ZSA6IGloX2xvY2F0aW9uKGloLTEpOworICAgICAgCisgIC8qIGRlbGV0ZSBpdGVtcyAqLworICBsYXN0X2xvYyA9IGloX2xvY2F0aW9uKCAmKGloW25yLTEtZmlyc3RdKSApOworICBsYXN0X3JlbW92ZWRfbG9jID0gaWhfbG9jYXRpb24oICYoaWhbZGVsX251bS0xXSkgKTsKKworICBtZW1tb3ZlIChiaC0+Yl9kYXRhICsgbGFzdF9sb2MgKyBqIC0gbGFzdF9yZW1vdmVkX2xvYywKKwkgICBiaC0+Yl9kYXRhICsgbGFzdF9sb2MsIGxhc3RfcmVtb3ZlZF9sb2MgLSBsYXN0X2xvYyk7CisgIAorICAvKiBkZWxldGUgaXRlbSBoZWFkZXJzICovCisgIG1lbW1vdmUgKGloLCBpaCArIGRlbF9udW0sIChuciAtIGZpcnN0IC0gZGVsX251bSkgKiBJSF9TSVpFKTsKKyAgCisgIC8qIGNoYW5nZSBpdGVtIGxvY2F0aW9uICovCisgIGZvciAoaSA9IGZpcnN0OyBpIDwgbnIgLSBkZWxfbnVtOyBpICsrKQorICAgIHB1dF9paF9sb2NhdGlvbiggJihpaFtpLWZpcnN0XSksIGloX2xvY2F0aW9uKCAmKGloW2ktZmlyc3RdKSApICsgKGogLSBsYXN0X3JlbW92ZWRfbG9jKSApOworCisgIC8qIHNpemVzLCBpdGVtIG51bWJlciAqLworICBzZXRfYmxraF9ucl9pdGVtKCBibGtoLCBibGtoX25yX2l0ZW0oYmxraCkgLSBkZWxfbnVtICk7CisgIHNldF9ibGtoX2ZyZWVfc3BhY2UoIGJsa2gsIGJsa2hfZnJlZV9zcGFjZShibGtoKSArIChqIC0gbGFzdF9yZW1vdmVkX2xvYyArIElIX1NJWkUgKiBkZWxfbnVtKSApOworCisgIGRvX2JhbGFuY2VfbWFya19sZWFmX2RpcnR5IChiaS0+dGIsIGJoLCAwKTsKKyAgCisgIGlmIChiaS0+YmlfcGFyZW50KSB7CisgICAgc3RydWN0IGRpc2tfY2hpbGQgKnRfZGMgPSBCX05fQ0hJTEQgKGJpLT5iaV9wYXJlbnQsIGJpLT5iaV9wb3NpdGlvbik7CisgICAgcHV0X2RjX3NpemUoIHRfZGMsIGRjX3NpemUodF9kYykgLQorCQkJCShqIC0gbGFzdF9yZW1vdmVkX2xvYyArIElIX1NJWkUgKiBkZWxfbnVtKSk7CisgICAgZG9fYmFsYW5jZV9tYXJrX2ludGVybmFsX2RpcnR5IChiaS0+dGIsIGJpLT5iaV9wYXJlbnQsIDApOworICB9Cit9CisKKworCisKKworLyogcGFzdGUgbmV3X2VudHJ5X2NvdW50IGVudHJpZXMgKG5ld19kZWhzLCByZWNvcmRzKSBpbnRvIHBvc2l0aW9uIGJlZm9yZSB0byBpdGVtX251bS10aCBpdGVtICovCit2b2lkICAgIGxlYWZfcGFzdGVfZW50cmllcyAoCisJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwKKwkJCWludCBpdGVtX251bSwKKwkJCWludCBiZWZvcmUsCisJCQlpbnQgbmV3X2VudHJ5X2NvdW50LAorCQkJc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKiBuZXdfZGVocywKKwkJCWNvbnN0IGNoYXIgKiByZWNvcmRzLAorCQkJaW50IHBhc3RlX3NpemUKKwkJKQoreworICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKKyAgICBjaGFyICogaXRlbTsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqIGRlaDsKKyAgICBjaGFyICogaW5zZXJ0X3BvaW50OworICAgIGludCBpLCBvbGRfZW50cnlfbnVtOworCisgICAgaWYgKG5ld19lbnRyeV9jb3VudCA9PSAwKQorICAgICAgICByZXR1cm47CisKKyAgICBpaCA9IEJfTl9QSVRFTV9IRUFEKGJoLCBpdGVtX251bSk7CisKKyAgLyogbWFrZSBzdXJlLCB0aGF0IGl0ZW0gaXMgZGlyZWN0b3J5LCBhbmQgdGhlcmUgYXJlIGVub3VnaCByZWNvcmRzIGluIGl0ICovCisgIFJGQUxTRSggIWlzX2RpcmVudHJ5X2xlX2loIChpaCksICIxMDIyNTogaXRlbSBpcyBub3QgZGlyZWN0b3J5IGl0ZW0iKTsKKyAgUkZBTFNFKCBJX0VOVFJZX0NPVU5UIChpaCkgPCBiZWZvcmUsCisJICAiMTAyMzA6IHRoZXJlIGFyZSBubyBlbnRyeSB3ZSBwYXN0ZSBlbnRyaWVzIGJlZm9yZS4gZW50cnlfY291bnQgPSAlZCwgYmVmb3JlID0gJWQiLAorCSAgSV9FTlRSWV9DT1VOVCAoaWgpLCBiZWZvcmUpOworCisKKyAgLyogZmlyc3QgYnl0ZSBvZiBkZXN0IGl0ZW0gKi8KKyAgaXRlbSA9IGJoLT5iX2RhdGEgKyBpaF9sb2NhdGlvbihpaCk7CisKKyAgLyogZW50cnkgaGVhZCBhcnJheSAqLworICBkZWggPSBCX0lfREVIIChiaCwgaWgpOworCisgIC8qIG5ldyByZWNvcmRzIHdpbGwgYmUgcGFzdGVkIGF0IHRoaXMgcG9pbnQgKi8KKyAgaW5zZXJ0X3BvaW50ID0gaXRlbSArIChiZWZvcmUgPyBkZWhfbG9jYXRpb24oICYoZGVoW2JlZm9yZSAtIDFdKSkgOiAoaWhfaXRlbV9sZW4oaWgpIC0gcGFzdGVfc2l6ZSkpOworCisgIC8qIGFkanVzdCBsb2NhdGlvbnMgb2YgcmVjb3JkcyB0aGF0IHdpbGwgYmUgQUZURVIgbmV3IHJlY29yZHMgKi8KKyAgZm9yIChpID0gSV9FTlRSWV9DT1VOVChpaCkgLSAxOyBpID49IGJlZm9yZTsgaSAtLSkKKyAgICBwdXRfZGVoX2xvY2F0aW9uKCAmKGRlaFtpXSksCisgICAgICAgICAgICAgICAgZGVoX2xvY2F0aW9uKCYoZGVoW2ldKSkgKyAoREVIX1NJWkUgKiBuZXdfZW50cnlfY291bnQgKSk7IAorCisgIC8qIGFkanVzdCBsb2NhdGlvbnMgb2YgcmVjb3JkcyB0aGF0IHdpbGwgYmUgQkVGT1JFIG5ldyByZWNvcmRzICovCisgIGZvciAoaSA9IDA7IGkgPCBiZWZvcmU7IGkgKyspCisgICAgcHV0X2RlaF9sb2NhdGlvbiggJihkZWhbaV0pLCBkZWhfbG9jYXRpb24oJihkZWhbaV0pKSArIHBhc3RlX3NpemUgKTsKKworICBvbGRfZW50cnlfbnVtID0gSV9FTlRSWV9DT1VOVChpaCk7CisgIHB1dF9paF9lbnRyeV9jb3VudCggaWgsIGloX2VudHJ5X2NvdW50KGloKSArIG5ld19lbnRyeV9jb3VudCApOworCisgIC8qIHByZXBhcmUgc3BhY2UgZm9yIHBhc3RlZCByZWNvcmRzICovCisgIG1lbW1vdmUgKGluc2VydF9wb2ludCArIHBhc3RlX3NpemUsIGluc2VydF9wb2ludCwgaXRlbSArIChpaF9pdGVtX2xlbihpaCkgLSBwYXN0ZV9zaXplKSAtIGluc2VydF9wb2ludCk7CisKKyAgLyogY29weSBuZXcgcmVjb3JkcyAqLworICBtZW1jcHkgKGluc2VydF9wb2ludCArIERFSF9TSVpFICogbmV3X2VudHJ5X2NvdW50LCByZWNvcmRzLAorCQkgICBwYXN0ZV9zaXplIC0gREVIX1NJWkUgKiBuZXdfZW50cnlfY291bnQpOworICAKKyAgLyogcHJlcGFyZSBzcGFjZSBmb3IgbmV3IGVudHJ5IGhlYWRzICovCisgIGRlaCArPSBiZWZvcmU7CisgIG1lbW1vdmUgKChjaGFyICopKGRlaCArIG5ld19lbnRyeV9jb3VudCksIGRlaCwgaW5zZXJ0X3BvaW50IC0gKGNoYXIgKilkZWgpOworCisgIC8qIGNvcHkgbmV3IGVudHJ5IGhlYWRzICovCisgIGRlaCA9IChzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqKSgoY2hhciAqKWRlaCk7CisgIG1lbWNweSAoZGVoLCBuZXdfZGVocywgREVIX1NJWkUgKiBuZXdfZW50cnlfY291bnQpOworCisgIC8qIHNldCBsb2NhdGlvbnMgb2YgbmV3IHJlY29yZHMgKi8KKyAgZm9yIChpID0gMDsgaSA8IG5ld19lbnRyeV9jb3VudDsgaSArKykKKyAgeworICAgIHB1dF9kZWhfbG9jYXRpb24oICYoZGVoW2ldKSwKKyAgICAgICAgZGVoX2xvY2F0aW9uKCAmKGRlaFtpXSApKSArCisgICAgICAgICgtIGRlaF9sb2NhdGlvbiggJihuZXdfZGVoc1tuZXdfZW50cnlfY291bnQgLSAxXSkpICsKKyAgICAgICAgaW5zZXJ0X3BvaW50ICsgREVIX1NJWkUgKiBuZXdfZW50cnlfY291bnQgLSBpdGVtKSk7CisgIH0KKworCisgIC8qIGNoYW5nZSBpdGVtIGtleSBpZiBuZWNlc3NhcnkgKHdoZW4gd2UgcGFzdGUgYmVmb3JlIDAtdGggZW50cnkgKi8KKyAgaWYgKCFiZWZvcmUpCisgICAgeworCXNldF9sZV9paF9rX29mZnNldCAoaWgsIGRlaF9vZmZzZXQobmV3X2RlaHMpKTsKKy8qICAgICAgbWVtY3B5ICgmaWgtPmloX2tleS5rX29mZnNldCwgCisJCSAgICAgICAmbmV3X2RlaHMtPmRlaF9vZmZzZXQsIFNIT1JUX0tFWV9TSVpFKTsqLworICAgIH0KKworI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSworICB7CisgICAgaW50IHByZXYsIG5leHQ7CisgICAgLyogY2hlY2sgcmVjb3JkIGxvY2F0aW9ucyAqLworICAgIGRlaCA9IEJfSV9ERUggKGJoLCBpaCk7CisgICAgZm9yIChpID0gMDsgaSA8IElfRU5UUllfQ09VTlQoaWgpOyBpICsrKSB7CisgICAgICBuZXh0ID0gKGkgPCBJX0VOVFJZX0NPVU5UKGloKSAtIDEpID8gZGVoX2xvY2F0aW9uKCAmKGRlaFtpICsgMV0pKSA6IDA7CisgICAgICBwcmV2ID0gKGkgIT0gMCkgPyBkZWhfbG9jYXRpb24oICYoZGVoW2kgLSAxXSkgKSA6IDA7CisgICAgICAKKyAgICAgIGlmIChwcmV2ICYmIHByZXYgPD0gZGVoX2xvY2F0aW9uKCAmKGRlaFtpXSkpKQorCXJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJ2cy0xMDI0MDogbGVhZl9wYXN0ZV9lbnRyaWVzOiBkaXJlY3RvcnkgaXRlbSAoJWgpIGNvcnJ1cHRlZCAocHJldiAlYSwgY3VyKCVkKSAlYSkiLAorCQkJICBpaCwgZGVoICsgaSAtIDEsIGksIGRlaCArIGkpOworICAgICAgaWYgKG5leHQgJiYgbmV4dCA+PSBkZWhfbG9jYXRpb24oICYoZGVoW2ldKSkpCisJcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgInZzLTEwMjUwOiBsZWFmX3Bhc3RlX2VudHJpZXM6IGRpcmVjdG9yeSBpdGVtICglaCkgY29ycnVwdGVkIChjdXIoJWQpICVhLCBuZXh0ICVhKSIsCisJCQkgIGloLCBpLCBkZWggKyBpLCBkZWggKyBpICsgMSk7CisgICAgfQorICB9CisjZW5kaWYKKworfQpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvbmFtZWkuYyBiL2ZzL3JlaXNlcmZzL25hbWVpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBlOTJkOQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3JlaXNlcmZzL25hbWVpLmMKQEAgLTAsMCArMSwxNDkxIEBACisvKgorICogQ29weXJpZ2h0IDIwMDAgYnkgSGFucyBSZWlzZXIsIGxpY2Vuc2luZyBnb3Zlcm5lZCBieSByZWlzZXJmcy9SRUFETUUKKyAqCisgKiBUcml2aWFsIGNoYW5nZXMgYnkgQWxhbiBDb3ggdG8gcmVtb3ZlIEVIQVNIQ09MTElTSU9OIGZvciBjb21wYXRpYmlsaXR5CisgKgorICogVHJpdmlhbCBDaGFuZ2VzOgorICogUmlnaHRzIGdyYW50ZWQgdG8gSGFucyBSZWlzZXIgdG8gcmVkaXN0cmlidXRlIHVuZGVyIG90aGVyIHRlcm1zIHByb3ZpZGluZworICogaGUgYWNjZXB0cyBhbGwgbGlhYmlsaXR5IGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcGF0ZW50LCBmaXRuZXNzCisgKiBmb3IgcHVycG9zZSwgYW5kIGRpcmVjdCBvciBpbmRpcmVjdCBjbGFpbXMgYXJpc2luZyBmcm9tIGZhaWx1cmUgdG8gcGVyZm9ybS4KKyAqCisgKiBOTyBXQVJSQU5UWQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc19hY2wuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc194YXR0ci5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKworI2RlZmluZSBJTkNfRElSX0lOT0RFX05MSU5LKGkpIGlmIChpLT5pX25saW5rICE9IDEpIHsgaS0+aV9ubGluaysrOyBpZiAoaS0+aV9ubGluayA+PSBSRUlTRVJGU19MSU5LX01BWCkgaS0+aV9ubGluaz0xOyB9CisjZGVmaW5lIERFQ19ESVJfSU5PREVfTkxJTksoaSkgaWYgKGktPmlfbmxpbmsgIT0gMSkgaS0+aV9ubGluay0tOworCisvLyBkaXJlY3RvcnkgaXRlbSBjb250YWlucyBhcnJheSBvZiBlbnRyeSBoZWFkZXJzLiBUaGlzIHBlcmZvcm1zCisvLyBiaW5hcnkgc2VhcmNoIHRocm91Z2ggdGhhdCBhcnJheQorc3RhdGljIGludCBiaW5fc2VhcmNoX2luX2Rpcl9pdGVtIChzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICogZGUsIGxvZmZfdCBvZmYpCit7CisgICAgc3RydWN0IGl0ZW1faGVhZCAqIGloID0gZGUtPmRlX2loOworICAgIHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICogZGVoID0gZGUtPmRlX2RlaDsKKyAgICBpbnQgcmJvdW5kLCBsYm91bmQsIGo7CisKKyAgICBsYm91bmQgPSAwOworICAgIHJib3VuZCA9IElfRU5UUllfQ09VTlQgKGloKSAtIDE7CisKKyAgICBmb3IgKGogPSAocmJvdW5kICsgbGJvdW5kKSAvIDI7IGxib3VuZCA8PSByYm91bmQ7IGogPSAocmJvdW5kICsgbGJvdW5kKSAvIDIpIHsKKwlpZiAob2ZmIDwgZGVoX29mZnNldCAoZGVoICsgaikpIHsKKwkgICAgcmJvdW5kID0gaiAtIDE7CisJICAgIGNvbnRpbnVlOworCX0KKwlpZiAob2ZmID4gZGVoX29mZnNldCAoZGVoICsgaikpIHsKKwkgICAgbGJvdW5kID0gaiArIDE7CisJICAgIGNvbnRpbnVlOworCX0KKwkvLyB0aGlzIGlzIG5vdCBuYW1lIGZvdW5kLCBidXQgbWF0Y2hlZCB0aGlyZCBrZXkgY29tcG9uZW50CisJZGUtPmRlX2VudHJ5X251bSA9IGo7CisJcmV0dXJuIE5BTUVfRk9VTkQ7CisgICAgfQorCisgICAgZGUtPmRlX2VudHJ5X251bSA9IGxib3VuZDsKKyAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Cit9CisKKworLy8gY29tbWVudD8gIG1heWJlIHNvbWV0aGluZyBsaWtlIHNldCBkZSB0byBwb2ludCB0byB3aGF0IHRoZSBwYXRoIHBvaW50cyB0bz8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZGVfaXRlbV9sb2NhdGlvbiAoc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqIGRlLCBzdHJ1Y3QgcGF0aCAqIHBhdGgpCit7CisgICAgZGUtPmRlX2JoID0gZ2V0X2xhc3RfYmggKHBhdGgpOworICAgIGRlLT5kZV9paCA9IGdldF9paCAocGF0aCk7CisgICAgZGUtPmRlX2RlaCA9IEJfSV9ERUggKGRlLT5kZV9iaCwgZGUtPmRlX2loKTsKKyAgICBkZS0+ZGVfaXRlbV9udW0gPSBQQVRIX0xBU1RfUE9TSVRJT04gKHBhdGgpOworfSAKKworCisvLyBkZV9iaCwgZGVfaWgsIGRlX2RlaCAocG9pbnRzIHRvIGZpcnN0IGVsZW1lbnQgb2YgYXJyYXkpLCBkZV9pdGVtX251bSBpcyBzZXQKK2lubGluZSB2b2lkIHNldF9kZV9uYW1lX2FuZF9uYW1lbGVuIChzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICogZGUpCit7CisgICAgc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKiBkZWggPSBkZS0+ZGVfZGVoICsgZGUtPmRlX2VudHJ5X251bTsKKworICAgIGlmIChkZS0+ZGVfZW50cnlfbnVtID49IGloX2VudHJ5X2NvdW50IChkZS0+ZGVfaWgpKQorCUJVRyAoKTsKKworICAgIGRlLT5kZV9lbnRyeWxlbiA9IGVudHJ5X2xlbmd0aCAoZGUtPmRlX2JoLCBkZS0+ZGVfaWgsIGRlLT5kZV9lbnRyeV9udW0pOworICAgIGRlLT5kZV9uYW1lbGVuID0gZGUtPmRlX2VudHJ5bGVuIC0gKGRlX3dpdGhfc2QgKGRlaCkgPyBTRF9TSVpFIDogMCk7CisgICAgZGUtPmRlX25hbWUgPSBCX0lfUElURU0gKGRlLT5kZV9iaCwgZGUtPmRlX2loKSArIGRlaF9sb2NhdGlvbihkZWgpOworICAgIGlmIChkZS0+ZGVfbmFtZVtkZS0+ZGVfbmFtZWxlbiAtIDFdID09IDApCisJZGUtPmRlX25hbWVsZW4gPSBzdHJsZW4gKGRlLT5kZV9uYW1lKTsKK30KKworCisvLyB3aGF0IGVudHJ5IHBvaW50cyB0bworc3RhdGljIGlubGluZSB2b2lkIHNldF9kZV9vYmplY3Rfa2V5IChzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICogZGUpCit7CisgICAgaWYgKGRlLT5kZV9lbnRyeV9udW0gPj0gaWhfZW50cnlfY291bnQgKGRlLT5kZV9paCkpCisJQlVHICgpOworICAgIGRlLT5kZV9kaXJfaWQgPSBkZWhfZGlyX2lkKCAmKGRlLT5kZV9kZWhbZGUtPmRlX2VudHJ5X251bV0pKTsKKyAgICBkZS0+ZGVfb2JqZWN0aWQgPSBkZWhfb2JqZWN0aWQoICYoZGUtPmRlX2RlaFtkZS0+ZGVfZW50cnlfbnVtXSkpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdG9yZV9kZV9lbnRyeV9rZXkgKHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKiBkZSkKK3sKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqIGRlaCA9IGRlLT5kZV9kZWggKyBkZS0+ZGVfZW50cnlfbnVtOworCisgICAgaWYgKGRlLT5kZV9lbnRyeV9udW0gPj0gaWhfZW50cnlfY291bnQgKGRlLT5kZV9paCkpCisJQlVHICgpOworCisgICAgLyogc3RvcmUga2V5IG9mIHRoZSBmb3VuZCBlbnRyeSAqLworICAgIGRlLT5kZV9lbnRyeV9rZXkudmVyc2lvbiA9IEtFWV9GT1JNQVRfM181OworICAgIGRlLT5kZV9lbnRyeV9rZXkub25fZGlza19rZXkua19kaXJfaWQgPSBsZTMyX3RvX2NwdSAoZGUtPmRlX2loLT5paF9rZXkua19kaXJfaWQpOworICAgIGRlLT5kZV9lbnRyeV9rZXkub25fZGlza19rZXkua19vYmplY3RpZCA9IGxlMzJfdG9fY3B1IChkZS0+ZGVfaWgtPmloX2tleS5rX29iamVjdGlkKTsKKyAgICBzZXRfY3B1X2tleV9rX29mZnNldCAoJihkZS0+ZGVfZW50cnlfa2V5KSwgZGVoX29mZnNldCAoZGVoKSk7CisgICAgc2V0X2NwdV9rZXlfa190eXBlICgmKGRlLT5kZV9lbnRyeV9rZXkpLCBUWVBFX0RJUkVOVFJZKTsKK30KKworCisvKiBXZSBhc3NpZ24gYSBrZXkgdG8gZWFjaCBkaXJlY3RvcnkgaXRlbSwgYW5kIHBsYWNlIG11bHRpcGxlIGVudHJpZXMKK2luIGEgc2luZ2xlIGRpcmVjdG9yeSBpdGVtLiAgQSBkaXJlY3RvcnkgaXRlbSBoYXMgYSBrZXkgZXF1YWwgdG8gdGhlCitrZXkgb2YgdGhlIGZpcnN0IGRpcmVjdG9yeSBlbnRyeSBpbiBpdC4KKworVGhpcyBmdW5jdGlvbiBmaXJzdCBjYWxscyBzZWFyY2hfYnlfa2V5LCB0aGVuLCBpZiBpdGVtIHdob3NlIGZpcnN0CitlbnRyeSBtYXRjaGVzIGlzIG5vdCBmb3VuZCBpdCBsb29rcyBmb3IgdGhlIGVudHJ5IGluc2lkZSBkaXJlY3RvcnkKK2l0ZW0gZm91bmQgYnkgc2VhcmNoX2J5X2tleS4gRmlsbHMgdGhlIHBhdGggdG8gdGhlIGVudHJ5LCBhbmQgdG8gdGhlCitlbnRyeSBwb3NpdGlvbiBpbiB0aGUgaXRlbSAKKworKi8KKworLyogVGhlIGZ1bmN0aW9uIGlzIE5PVCBTQ0hFRFVMRS1TQUZFISAqLworaW50IHNlYXJjaF9ieV9lbnRyeV9rZXkgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqIGtleSwKKwkJCSBzdHJ1Y3QgcGF0aCAqIHBhdGgsIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKiBkZSkKK3sKKyAgICBpbnQgcmV0dmFsOworCisgICAgcmV0dmFsID0gc2VhcmNoX2l0ZW0gKHNiLCBrZXksIHBhdGgpOworICAgIHN3aXRjaCAocmV0dmFsKSB7CisgICAgY2FzZSBJVEVNX05PVF9GT1VORDoKKwlpZiAoIVBBVEhfTEFTVF9QT1NJVElPTiAocGF0aCkpIHsKKwkgICAgcmVpc2VyZnNfd2FybmluZyAoc2IsICJ2cy03MDAwOiBzZWFyY2hfYnlfZW50cnlfa2V5OiBzZWFyY2hfYnlfa2V5IHJldHVybmVkIGl0ZW0gcG9zaXRpb24gPT0gMCIpOworCSAgICBwYXRocmVsc2UocGF0aCkgOworCSAgICByZXR1cm4gSU9fRVJST1IgOworCX0KKwlQQVRIX0xBU1RfUE9TSVRJT04gKHBhdGgpIC0tOworCisgICAgY2FzZSBJVEVNX0ZPVU5EOgorCWJyZWFrOworCisgICAgY2FzZSBJT19FUlJPUjoKKwlyZXR1cm4gcmV0dmFsOworCisgICAgZGVmYXVsdDoKKwlwYXRocmVsc2UgKHBhdGgpOworCXJlaXNlcmZzX3dhcm5pbmcgKHNiLCAidnMtNzAwMjogc2VhcmNoX2J5X2VudHJ5X2tleTogbm8gcGF0aCB0byBoZXJlIik7CisJcmV0dXJuIElPX0VSUk9SOworICAgIH0KKworICAgIHNldF9kZV9pdGVtX2xvY2F0aW9uIChkZSwgcGF0aCk7CisKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKyAgICBpZiAoIWlzX2RpcmVudHJ5X2xlX2loIChkZS0+ZGVfaWgpIHx8IAorCUNPTVBfU0hPUlRfS0VZUyAoJihkZS0+ZGVfaWgtPmloX2tleSksIGtleSkpIHsKKwlwcmludF9ibG9jayAoZGUtPmRlX2JoLCAwLCAtMSwgLTEpOworCXJlaXNlcmZzX3BhbmljIChzYiwgInZzLTcwMDU6IHNlYXJjaF9ieV9lbnRyeV9rZXk6IGZvdW5kIGl0ZW0gJWggaXMgbm90IGRpcmVjdG9yeSBpdGVtIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJkb2VzIG5vdCBiZWxvbmcgdG8gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIGtleSAlSyIsIGRlLT5kZV9paCwga2V5KTsKKyAgICB9CisjZW5kaWYgLyogQ09ORklHX1JFSVNFUkZTX0NIRUNLICovCisKKyAgICAvKiBiaW5hcnkgc2VhcmNoIGluIGRpcmVjdG9yeSBpdGVtIGJ5IHRoaXJkIGNvbXBvbmVuIHQgb2YgdGhlCisgICAgICAga2V5LiBzZXRzIGRlLT5kZV9lbnRyeV9udW0gb2YgZGUgKi8KKyAgICByZXR2YWwgPSBiaW5fc2VhcmNoX2luX2Rpcl9pdGVtIChkZSwgY3B1X2tleV9rX29mZnNldCAoa2V5KSk7CisgICAgcGF0aC0+cG9zX2luX2l0ZW0gPSBkZS0+ZGVfZW50cnlfbnVtOworICAgIGlmIChyZXR2YWwgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKwkvLyB1Z2x5LCBidXQgcmVuYW1lIG5lZWRzIGRlX2JoLCBkZV9kZWgsIGRlX25hbWUsIGRlX25hbWVsZW4sIGRlX29iamVjdGlkIHNldAorCXNldF9kZV9uYW1lX2FuZF9uYW1lbGVuIChkZSk7CisJc2V0X2RlX29iamVjdF9rZXkgKGRlKTsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworCisKKy8qIEtleWVkIDMyLWJpdCBoYXNoIGZ1bmN0aW9uIHVzaW5nIFRFQSBpbiBhIERhdmlzLU1leWVyIGZ1bmN0aW9uICovCisKKy8qIFRoZSB0aGlyZCBjb21wb25lbnQgaXMgaGFzaGVkLCBhbmQgeW91IGNhbiBjaG9vc2UgZnJvbSBtb3JlIHRoYW4KKyAgIG9uZSBoYXNoIGZ1bmN0aW9uLiAgUGVyIGRpcmVjdG9yeSBoYXNoZXMgYXJlIG5vdCB5ZXQgaW1wbGVtZW50ZWQKKyAgIGJ1dCBhcmUgdGhvdWdodCBhYm91dC4gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgbW92ZWQgdG8gaGFzaGVzLmMKKyAgIEplZGksIHBsZWFzZSBkbyBzby4gIC1IYW5zICovCisKK3N0YXRpYyBfX3UzMiBnZXRfdGhpcmRfY29tcG9uZW50IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLCAKKwkJCQkgIGNvbnN0IGNoYXIgKiBuYW1lLCBpbnQgbGVuKQoreworICAgIF9fdTMyIHJlczsKKworICAgIGlmICghbGVuIHx8IChsZW4gPT0gMSAmJiBuYW1lWzBdID09ICcuJykpCisJcmV0dXJuIERPVF9PRkZTRVQ7CisgICAgaWYgKGxlbiA9PSAyICYmIG5hbWVbMF0gPT0gJy4nICYmIG5hbWVbMV0gPT0gJy4nKQorCXJldHVybiBET1RfRE9UX09GRlNFVDsKKworICAgIHJlcyA9IFJFSVNFUkZTX1NCKHMpLT5zX2hhc2hfZnVuY3Rpb24gKG5hbWUsIGxlbik7CisKKyAgICAvLyB0YWtlIGJpdHMgZnJvbSA3LXRoIHRvIDMwLXRoIGluY2x1ZGluZyBib3RoIGJvdW5kcworICAgIHJlcyA9IEdFVF9IQVNIX1ZBTFVFKHJlcyk7CisgICAgaWYgKHJlcyA9PSAwKQorCS8vIG5lZWRlZCB0byBoYXZlIG5vIG5hbWVzIGJlZm9yZSAiLiIgYW5kICIuLiIgdGhvc2UgaGF2ZSBoYXNoCisJLy8gdmFsdWUgPT0gMCBhbmQgZ2VuZXJhdGlvbiBjb250ZXJzIDEgYW5kIDIgYWNjb3JkaW5nbHkKKwlyZXMgPSAxMjg7CisgICAgcmV0dXJuIHJlcyArIE1BWF9HRU5FUkFUSU9OX05VTUJFUjsKK30KKworCitzdGF0aWMgaW50IHJlaXNlcmZzX21hdGNoIChzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICogZGUsIAorCQkJICAgY29uc3QgY2hhciAqIG5hbWUsIGludCBuYW1lbGVuKQoreworICAgIGludCByZXR2YWwgPSBOQU1FX05PVF9GT1VORDsKKworICAgIGlmICgobmFtZWxlbiA9PSBkZS0+ZGVfbmFtZWxlbikgJiYKKwkhbWVtY21wKGRlLT5kZV9uYW1lLCBuYW1lLCBkZS0+ZGVfbmFtZWxlbikpCisJcmV0dmFsID0gKGRlX3Zpc2libGUgKGRlLT5kZV9kZWggKyBkZS0+ZGVfZW50cnlfbnVtKSA/IE5BTUVfRk9VTkQgOiBOQU1FX0ZPVU5EX0lOVklTSUJMRSk7CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCisKKy8qIGRlJ3MgZGVfYmgsIGRlX2loLCBkZV9kZWgsIGRlX2l0ZW1fbnVtLCBkZV9lbnRyeV9udW0gYXJlIHNldCBhbHJlYWR5ICovCisKKwkJCQkvKiB1c2VkIHdoZW4gaGFzaCBjb2xsaXNpb25zIGV4aXN0ICovCisKKworc3RhdGljIGludCBsaW5lYXJfc2VhcmNoX2luX2Rpcl9pdGVtIChzdHJ1Y3QgY3B1X2tleSAqIGtleSwgc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqIGRlLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKiBuYW1lLCBpbnQgbmFtZWxlbikKK3sKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqIGRlaCA9IGRlLT5kZV9kZWg7CisgICAgaW50IHJldHZhbDsKKyAgICBpbnQgaTsKKworICAgIGkgPSBkZS0+ZGVfZW50cnlfbnVtOworCisgICAgaWYgKGkgPT0gSV9FTlRSWV9DT1VOVCAoZGUtPmRlX2loKSB8fAorCUdFVF9IQVNIX1ZBTFVFIChkZWhfb2Zmc2V0IChkZWggKyBpKSkgIT0gR0VUX0hBU0hfVkFMVUUgKGNwdV9rZXlfa19vZmZzZXQgKGtleSkpKSB7CisJaSAtLTsKKyAgICB9CisKKyAgICBSRkFMU0UoIGRlLT5kZV9kZWggIT0gQl9JX0RFSCAoZGUtPmRlX2JoLCBkZS0+ZGVfaWgpLAorCSAgICAidnMtNzAxMDogYXJyYXkgb2YgZW50cnkgaGVhZGVycyBub3QgZm91bmQiKTsKKworICAgIGRlaCArPSBpOworCisgICAgZm9yICg7IGkgPj0gMDsgaSAtLSwgZGVoIC0tKSB7CisJaWYgKEdFVF9IQVNIX1ZBTFVFIChkZWhfb2Zmc2V0IChkZWgpKSAhPQorCSAgICBHRVRfSEFTSF9WQUxVRSAoY3B1X2tleV9rX29mZnNldCAoa2V5KSkpIHsKKwkgICAgLy8gaGFzaCB2YWx1ZSBkb2VzIG5vdCBtYXRjaCwgbm8gbmVlZCB0byBjaGVjayB3aG9sZSBuYW1lCisJICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKwl9CisgICAKKwkvKiBtYXJrLCB0aGF0IHRoaXMgZ2VuZXJhdGlvbiBudW1iZXIgaXMgdXNlZCAqLworCWlmIChkZS0+ZGVfZ2VuX251bWJlcl9iaXRfc3RyaW5nKQorCSAgICBzZXRfYml0IChHRVRfR0VORVJBVElPTl9OVU1CRVIgKGRlaF9vZmZzZXQgKGRlaCkpLCAodW5zaWduZWQgbG9uZyAqKWRlLT5kZV9nZW5fbnVtYmVyX2JpdF9zdHJpbmcpOworCisJLy8gY2FsY3VsYXRlIHBvaW50ZXIgdG8gbmFtZSBhbmQgbmFtZWxlbgorCWRlLT5kZV9lbnRyeV9udW0gPSBpOworCXNldF9kZV9uYW1lX2FuZF9uYW1lbGVuIChkZSk7CisKKwlpZiAoKHJldHZhbCA9IHJlaXNlcmZzX21hdGNoIChkZSwgbmFtZSwgbmFtZWxlbikpICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisJICAgIC8vIGRlJ3MgZGVfbmFtZSwgZGVfbmFtZWxlbiwgZGVfcmVjb3JkbGVuIGFyZSBzZXQuIEZpbGwgdGhlIHJlc3Q6CisKKwkgICAgLy8ga2V5IG9mIHBvaW50ZWQgb2JqZWN0CisJICAgIHNldF9kZV9vYmplY3Rfa2V5IChkZSk7CisKKwkgICAgc3RvcmVfZGVfZW50cnlfa2V5IChkZSk7CisKKwkgICAgLy8gcmV0dmFsIGNhbiBiZSBOQU1FX0ZPVU5EIG9yIE5BTUVfRk9VTkRfSU5WSVNJQkxFCisJICAgIHJldHVybiByZXR2YWw7CisJfQorICAgIH0KKworICAgIGlmIChHRVRfR0VORVJBVElPTl9OVU1CRVIgKGxlX2loX2tfb2Zmc2V0IChkZS0+ZGVfaWgpKSA9PSAwKQorCS8qIHdlIGhhdmUgcmVhY2hlZCBsZWZ0IG1vc3QgZW50cnkgaW4gdGhlIG5vZGUuIEluIGNvbW1vbiB3ZQorICAgICAgICAgICBoYXZlIHRvIGdvIHRvIHRoZSBsZWZ0IG5laWdoYm9yLCBidXQgaWYgZ2VuZXJhdGlvbiBjb3VudGVyCisgICAgICAgICAgIGlzIDAgYWxyZWFkeSwgd2Uga25vdyBmb3Igc3VyZSwgdGhhdCB0aGVyZSBpcyBubyBuYW1lIHdpdGgKKyAgICAgICAgICAgdGhlIHNhbWUgaGFzaCB2YWx1ZSAqLworCS8vIEZJWE1FOiB0aGlzIHdvcmsgY29ycmVjdGx5IG9ubHkgYmVjYXVzZSBoYXNoIHZhbHVlIGNhbiBub3QKKwkvLyBiZSAwLiBCdHcsIGluIGNhc2Ugb2YgWXVyYSdzIGhhc2ggaXQgaXMgcHJvYmFibHkgcG9zc2libGUsCisJLy8gc28sIHRoaXMgaXMgYSBidWcKKwlyZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisKKyAgICBSRkFMU0UoIGRlLT5kZV9pdGVtX251bSwKKwkgICAgInZzLTcwMTU6IHR3byBkaXJpdGVtcyBvZiB0aGUgc2FtZSBkaXJlY3RvcnkgaW4gb25lIG5vZGU/Iik7CisKKyAgICByZXR1cm4gR09UT19QUkVWSU9VU19JVEVNOworfQorCisKKy8vIG1heSByZXR1cm4gTkFNRV9GT1VORCwgTkFNRV9GT1VORF9JTlZJU0lCTEUsIE5BTUVfTk9UX0ZPVU5ECisvLyBGSVhNRTogc2hvdWxkIGFkZCBzb21ldGhpbmcgbGlrZSBJT0VSUk9SCitzdGF0aWMgaW50IHJlaXNlcmZzX2ZpbmRfZW50cnkgKHN0cnVjdCBpbm9kZSAqIGRpciwgY29uc3QgY2hhciAqIG5hbWUsIGludCBuYW1lbGVuLCAKKwkJCQlzdHJ1Y3QgcGF0aCAqIHBhdGhfdG9fZW50cnksIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKiBkZSkKK3sKKyAgICBzdHJ1Y3QgY3B1X2tleSBrZXlfdG9fc2VhcmNoOworICAgIGludCByZXR2YWw7CisKKworICAgIGlmIChuYW1lbGVuID4gUkVJU0VSRlNfTUFYX05BTUUgKGRpci0+aV9zYi0+c19ibG9ja3NpemUpKQorCXJldHVybiBOQU1FX05PVF9GT1VORDsKKworICAgIC8qIHdlIHdpbGwgc2VhcmNoIGZvciB0aGlzIGtleSBpbiB0aGUgdHJlZSAqLworICAgIG1ha2VfY3B1X2tleSAoJmtleV90b19zZWFyY2gsIGRpciwgCisJCSAgZ2V0X3RoaXJkX2NvbXBvbmVudCAoZGlyLT5pX3NiLCBuYW1lLCBuYW1lbGVuKSwgVFlQRV9ESVJFTlRSWSwgMyk7CisKKyAgICB3aGlsZSAoMSkgeworCXJldHZhbCA9IHNlYXJjaF9ieV9lbnRyeV9rZXkgKGRpci0+aV9zYiwgJmtleV90b19zZWFyY2gsIHBhdGhfdG9fZW50cnksIGRlKTsKKwlpZiAocmV0dmFsID09IElPX0VSUk9SKSB7CisJICAgIHJlaXNlcmZzX3dhcm5pbmcgKGRpci0+aV9zYiwgInphbS03MDAxOiBpbyBlcnJvciBpbiAlcyIsCisJCQkgICAgICBfX0ZVTkNUSU9OX18pOworCSAgICByZXR1cm4gSU9fRVJST1I7CisJfQorCisJLyogY29tcGFyZSBuYW1lcyBmb3IgYWxsIGVudHJpZXMgaGF2aW5nIGdpdmVuIGhhc2ggdmFsdWUgKi8KKwlyZXR2YWwgPSBsaW5lYXJfc2VhcmNoX2luX2Rpcl9pdGVtICgma2V5X3RvX3NlYXJjaCwgZGUsIG5hbWUsIG5hbWVsZW4pOworCWlmIChyZXR2YWwgIT0gR09UT19QUkVWSU9VU19JVEVNKSB7CisJICAgIC8qIHRoZXJlIGlzIG5vIG5lZWQgdG8gc2NhbiBkaXJlY3RvcnkgYW55bW9yZS4gR2l2ZW4gZW50cnkgZm91bmQgb3IgZG9lcyBub3QgZXhpc3QgKi8KKwkgICAgcGF0aF90b19lbnRyeS0+cG9zX2luX2l0ZW0gPSBkZS0+ZGVfZW50cnlfbnVtOworCSAgICByZXR1cm4gcmV0dmFsOworCX0KKworCS8qIHRoZXJlIGlzIGxlZnQgbmVpZ2hib3JpbmcgaXRlbSBvZiB0aGlzIGRpcmVjdG9yeSBhbmQgZ2l2ZW4gZW50cnkgY2FuIGJlIHRoZXJlICovCisJc2V0X2NwdV9rZXlfa19vZmZzZXQgKCZrZXlfdG9fc2VhcmNoLCBsZV9paF9rX29mZnNldCAoZGUtPmRlX2loKSAtIDEpOworCXBhdGhyZWxzZSAocGF0aF90b19lbnRyeSk7CisKKyAgICB9IC8qIHdoaWxlICgxKSAqLworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICogcmVpc2VyZnNfbG9va3VwIChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworICAgIGludCByZXR2YWw7CisgICAgc3RydWN0IGlub2RlICogaW5vZGUgPSBOVUxMOworICAgIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgZGU7CisgICAgSU5JVElBTElaRV9QQVRIIChwYXRoX3RvX2VudHJ5KTsKKworICAgIGlmIChSRUlTRVJGU19NQVhfTkFNRSAoZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkgPCBkZW50cnktPmRfbmFtZS5sZW4pCisJcmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7CisKKyAgICByZWlzZXJmc193cml0ZV9sb2NrKGRpci0+aV9zYik7CisgICAgZGUuZGVfZ2VuX251bWJlcl9iaXRfc3RyaW5nID0gTlVMTDsKKyAgICByZXR2YWwgPSByZWlzZXJmc19maW5kX2VudHJ5IChkaXIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsIGRlbnRyeS0+ZF9uYW1lLmxlbiwgJnBhdGhfdG9fZW50cnksICZkZSk7CisgICAgcGF0aHJlbHNlICgmcGF0aF90b19lbnRyeSk7CisgICAgaWYgKHJldHZhbCA9PSBOQU1FX0ZPVU5EKSB7CisgICAgICAgIC8qIEhpZGUgdGhlIC5yZWlzZXJmc19wcml2IGRpcmVjdG9yeSAqLworCWlmIChyZWlzZXJmc194YXR0cnMgKGRpci0+aV9zYikgJiYKKwkgICAgIW9sZF9mb3JtYXRfb25seShkaXItPmlfc2IpICYmCisgICAgICAgICAgICBSRUlTRVJGU19TQihkaXItPmlfc2IpLT5wcml2X3Jvb3QgJiYKKyAgICAgICAgICAgIFJFSVNFUkZTX1NCKGRpci0+aV9zYiktPnByaXZfcm9vdC0+ZF9pbm9kZSAmJgorCSAgICBkZS5kZV9vYmplY3RpZCA9PSBsZTMyX3RvX2NwdSAoSU5PREVfUEtFWShSRUlTRVJGU19TQihkaXItPmlfc2IpLT5wcml2X3Jvb3QtPmRfaW5vZGUpLT5rX29iamVjdGlkKSkgeworCSAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrIChkaXItPmlfc2IpOworCSAgcmV0dXJuIEVSUl9QVFIgKC1FQUNDRVMpOworCX0KKworCWlub2RlID0gcmVpc2VyZnNfaWdldCAoZGlyLT5pX3NiLCAoc3RydWN0IGNwdV9rZXkgKikmKGRlLmRlX2Rpcl9pZCkpOworCWlmICghaW5vZGUgfHwgSVNfRVJSKGlub2RlKSkgeworCSAgICByZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKKwkgICAgcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CisgICAgICAgIH0KKworCS8qIFByb3BvZ2F0ZSB0aGUgcHJpdl9vYmplY3QgZmxhZyBzbyB3ZSBrbm93IHdlJ3JlIGluIHRoZSBwcml2IHRyZWUgKi8KKwlpZiAoaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QgKGRpcikpCisJICAgIHJlaXNlcmZzX21hcmtfaW5vZGVfcHJpdmF0ZSAoaW5vZGUpOworICAgIH0KKyAgICByZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKKyAgICBpZiAoIHJldHZhbCA9PSBJT19FUlJPUiApIHsKKwlyZXR1cm4gRVJSX1BUUigtRUlPKTsKKyAgICB9CisKKyAgICBpZiAoaW5vZGUpCisJICAgIHJldHVybiBkX3NwbGljZV9hbGlhcyhpbm9kZSwgZGVudHJ5KTsKKyAgICAKKyAgICBkX2FkZChkZW50cnksIGlub2RlKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworCisvKiAKKyoqIGxvb2tzIHVwIHRoZSBkZW50cnkgb2YgdGhlIHBhcmVudCBkaXJlY3RvcnkgZm9yIGNoaWxkLgorKiogdGFrZW4gZnJvbSBleHQyX2dldF9wYXJlbnQKKyovCitzdHJ1Y3QgZGVudHJ5ICpyZWlzZXJmc19nZXRfcGFyZW50KHN0cnVjdCBkZW50cnkgKmNoaWxkKQoreworICAgIGludCByZXR2YWw7CisgICAgc3RydWN0IGlub2RlICogaW5vZGUgPSBOVUxMOworICAgIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgZGU7CisgICAgSU5JVElBTElaRV9QQVRIIChwYXRoX3RvX2VudHJ5KTsKKyAgICBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQ7CisgICAgc3RydWN0IGlub2RlICpkaXIgPSBjaGlsZC0+ZF9pbm9kZSA7CisKKworICAgIGlmIChkaXItPmlfbmxpbmsgPT0gMCkgeworCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworICAgIH0KKyAgICBkZS5kZV9nZW5fbnVtYmVyX2JpdF9zdHJpbmcgPSBOVUxMOworCisgICAgcmVpc2VyZnNfd3JpdGVfbG9jayhkaXItPmlfc2IpOworICAgIHJldHZhbCA9IHJlaXNlcmZzX2ZpbmRfZW50cnkgKGRpciwgIi4uIiwgMiwgJnBhdGhfdG9fZW50cnksICZkZSk7CisgICAgcGF0aHJlbHNlICgmcGF0aF90b19lbnRyeSk7CisgICAgaWYgKHJldHZhbCAhPSBOQU1FX0ZPVU5EKSB7CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7CisJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CisgICAgfQorICAgIGlub2RlID0gcmVpc2VyZnNfaWdldCAoZGlyLT5pX3NiLCAoc3RydWN0IGNwdV9rZXkgKikmKGRlLmRlX2Rpcl9pZCkpOworICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOworCisgICAgaWYgKCFpbm9kZSB8fCBJU19FUlIoaW5vZGUpKSB7CisJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CisgICAgfQorICAgIHBhcmVudCA9IGRfYWxsb2NfYW5vbihpbm9kZSk7CisgICAgaWYgKCFwYXJlbnQpIHsKKwlpcHV0KGlub2RlKTsKKwlwYXJlbnQgPSBFUlJfUFRSKC1FTk9NRU0pOworICAgIH0KKyAgICByZXR1cm4gcGFyZW50OworfQorCisKKy8qIGFkZCBlbnRyeSB0byB0aGUgZGlyZWN0b3J5IChlbnRyeSBjYW4gYmUgaGlkZGVuKS4gCisKK2luc2VydCBkZWZpbml0aW9uIG9mIHdoZW4gaGlkZGVuIGRpcmVjdG9yaWVzIGFyZSB1c2VkIGhlcmUgLUhhbnMKKworIERvZXMgbm90IG1hcmsgZGlyICAgaW5vZGUgZGlydHksIGRvIGl0IGFmdGVyIHN1Y2Nlc3Nlc2Z1bGwgY2FsbCB0byBpdCAqLworCitzdGF0aWMgaW50IHJlaXNlcmZzX2FkZF9lbnRyeSAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIHN0cnVjdCBpbm9kZSAqIGRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogbmFtZSwgaW50IG5hbWVsZW4sIHN0cnVjdCBpbm9kZSAqIGlub2RlLAorCQkJICAgICAgIGludCB2aXNpYmxlKQoreworICAgIHN0cnVjdCBjcHVfa2V5IGVudHJ5X2tleTsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqIGRlaDsKKyAgICBJTklUSUFMSVpFX1BBVEggKHBhdGgpOworICAgIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgZGU7CisgICAgaW50IGJpdF9zdHJpbmcgW01BWF9HRU5FUkFUSU9OX05VTUJFUiAvIChzaXplb2YoaW50KSAqIDgpICsgMV07CisgICAgaW50IGdlbl9udW1iZXI7CisgICAgY2hhciBzbWFsbF9idWZbMzIrREVIX1NJWkVdIDsgLyogNDggYnl0ZXMgbm93IGFuZCB3ZSBhdm9pZCBrbWFsbG9jCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgd2UgY3JlYXRlIGZpbGUgd2l0aCBzaG9ydCBuYW1lICovCisgICAgY2hhciAqIGJ1ZmZlcjsKKyAgICBpbnQgYnVmbGVuLCBwYXN0ZV9zaXplOworICAgIGludCByZXR2YWw7CisKKyAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisKKyAgICAvKiBjYW5ub3QgYWxsb3cgaXRlbXMgdG8gYmUgYWRkZWQgaW50byBhIGJ1c3kgZGVsZXRlZCBkaXJlY3RvcnkgKi8KKyAgICBpZiAoIW5hbWVsZW4pCisJcmV0dXJuIC1FSU5WQUw7CisKKyAgICBpZiAobmFtZWxlbiA+IFJFSVNFUkZTX01BWF9OQU1FIChkaXItPmlfc2ItPnNfYmxvY2tzaXplKSkKKwlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworICAgIC8qIGVhY2ggZW50cnkgaGFzIHVuaXF1ZSBrZXkuIGNvbXBvc2UgaXQgKi8KKyAgICBtYWtlX2NwdV9rZXkgKCZlbnRyeV9rZXksIGRpciwgCisJCSAgZ2V0X3RoaXJkX2NvbXBvbmVudCAoZGlyLT5pX3NiLCBuYW1lLCBuYW1lbGVuKSwgVFlQRV9ESVJFTlRSWSwgMyk7CisKKyAgICAvKiBnZXQgbWVtb3J5IGZvciBjb21wb3NpbmcgdGhlIGVudHJ5ICovCisgICAgYnVmbGVuID0gREVIX1NJWkUgKyBST1VORF9VUCAobmFtZWxlbik7CisgICAgaWYgKGJ1ZmxlbiA+IHNpemVvZiAoc21hbGxfYnVmKSkgeworCWJ1ZmZlciA9IHJlaXNlcmZzX2ttYWxsb2MgKGJ1ZmxlbiwgR0ZQX05PRlMsIGRpci0+aV9zYik7CisJaWYgKGJ1ZmZlciA9PSAwKQorCSAgICByZXR1cm4gLUVOT01FTTsKKyAgICB9IGVsc2UKKwlidWZmZXIgPSBzbWFsbF9idWY7CisKKyAgICBwYXN0ZV9zaXplID0gKGdldF9pbm9kZV9zZF92ZXJzaW9uIChkaXIpID09IFNUQVRfREFUQV9WMSkgPyAoREVIX1NJWkUgKyBuYW1lbGVuKSA6IGJ1ZmxlbjsKKworICAgIC8qIGZpbGwgYnVmZmVyIDogZGlyZWN0b3J5IGVudHJ5IGhlYWQsIG5hbWVbLCBkaXIgb2JqZWN0aWQgfCAsIHN0YXQgZGF0YSB8ICxzdGF0IGRhdGEsIGRpciBvYmplY3RpZCBdICovCisgICAgZGVoID0gKHN0cnVjdCByZWlzZXJmc19kZV9oZWFkICopYnVmZmVyOworICAgIGRlaC0+ZGVoX2xvY2F0aW9uID0gMDsgLyogSkRNIEVuZGlhbiBzYWZlIGlmIDAgKi8KKyAgICBwdXRfZGVoX29mZnNldCggZGVoLCBjcHVfa2V5X2tfb2Zmc2V0KCAmZW50cnlfa2V5ICkgKTsKKyAgICBkZWgtPmRlaF9zdGF0ZSA9IDA7IC8qIEpETSBFbmRpYW4gc2FmZSBpZiAwICovCisgICAgLyogcHV0IGtleSAoaW5vIGFuYWxvZykgdG8gZGUgKi8KKyAgICBkZWgtPmRlaF9kaXJfaWQgPSBJTk9ERV9QS0VZIChpbm9kZSktPmtfZGlyX2lkOyAvKiBzYWZlOiBrX2Rpcl9pZCBpcyBsZSAqLworICAgIGRlaC0+ZGVoX29iamVjdGlkID0gSU5PREVfUEtFWSAoaW5vZGUpLT5rX29iamVjdGlkOyAvKiBzYWZlOiBrX29iamVjdGlkIGlzIGxlICovCisKKyAgICAvKiBjb3B5IG5hbWUgKi8KKyAgICBtZW1jcHkgKChjaGFyICopKGRlaCArIDEpLCBuYW1lLCBuYW1lbGVuKTsKKyAgICAvKiBwYWRkIGJ5IDBzIHRvIHRoZSA0IGJ5dGUgYm91bmRhcnkgKi8KKyAgICBwYWRkX2l0ZW0gKChjaGFyICopKGRlaCArIDEpLCBST1VORF9VUCAobmFtZWxlbiksIG5hbWVsZW4pOworCisgICAgLyogZW50cnkgaXMgcmVhZHkgdG8gYmUgcGFzdGVkIGludG8gdHJlZSwgc2V0ICd2aXNpYmlsaXR5JyBhbmQgJ3N0YXQgZGF0YSBpbiBlbnRyeScgYXR0cmlidXRlcyAqLworICAgIG1hcmtfZGVfd2l0aG91dF9zZCAoZGVoKTsKKyAgICB2aXNpYmxlID8gbWFya19kZV92aXNpYmxlIChkZWgpIDogbWFya19kZV9oaWRkZW4gKGRlaCk7CisKKyAgICAvKiBmaW5kIHRoZSBwcm9wZXIgcGxhY2UgZm9yIHRoZSBuZXcgZW50cnkgKi8KKyAgICBtZW1zZXQgKGJpdF9zdHJpbmcsIDAsIHNpemVvZiAoYml0X3N0cmluZykpOworICAgIGRlLmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyA9IChjaGFyICopYml0X3N0cmluZzsKKyAgICByZXR2YWwgPSByZWlzZXJmc19maW5kX2VudHJ5IChkaXIsIG5hbWUsIG5hbWVsZW4sICZwYXRoLCAmZGUpOworICAgIGlmKCByZXR2YWwgIT0gTkFNRV9OT1RfRk9VTkQgKSB7CisJaWYgKGJ1ZmZlciAhPSBzbWFsbF9idWYpCisJICAgIHJlaXNlcmZzX2tmcmVlIChidWZmZXIsIGJ1ZmxlbiwgZGlyLT5pX3NiKTsKKwlwYXRocmVsc2UgKCZwYXRoKTsKKworCWlmICggcmV0dmFsID09IElPX0VSUk9SICkgeworCSAgICByZXR1cm4gLUVJTzsKKwl9CisKKyAgICAgICAgaWYgKHJldHZhbCAhPSBOQU1FX0ZPVU5EKSB7CisJICAgIHJlaXNlcmZzX3dhcm5pbmcgKGRpci0+aV9zYiwgInphbS03MDAyOiVzOiBcInJlaXNlcmZzX2ZpbmRfZW50cnlcIiAiCisJCQkgICAgICAiaGFzIHJldHVybmVkIHVuZXhwZWN0ZWQgdmFsdWUgKCVkKSIsCisJCQkgICAgICBfX0ZVTkNUSU9OX18sIHJldHZhbCk7CisgICAgICAgfQorCisJcmV0dXJuIC1FRVhJU1Q7CisgICAgfQorCisgICAgZ2VuX251bWJlciA9IGZpbmRfZmlyc3RfemVyb19iaXQgKCh1bnNpZ25lZCBsb25nICopYml0X3N0cmluZywgTUFYX0dFTkVSQVRJT05fTlVNQkVSICsgMSk7CisgICAgaWYgKGdlbl9udW1iZXIgPiBNQVhfR0VORVJBVElPTl9OVU1CRVIpIHsKKyAgICAgIC8qIHRoZXJlIGlzIG5vIGZyZWUgZ2VuZXJhdGlvbiBudW1iZXIgKi8KKyAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKGRpci0+aV9zYiwgInJlaXNlcmZzX2FkZF9lbnRyeTogQ29uZ3JhdHVsYXRpb25zISB3ZSBoYXZlIGdvdCBoYXNoIGZ1bmN0aW9uIHNjcmV3ZWQgdXAiKTsKKyAgICAgIGlmIChidWZmZXIgIT0gc21hbGxfYnVmKQorICAgICAgICAgIHJlaXNlcmZzX2tmcmVlIChidWZmZXIsIGJ1ZmxlbiwgZGlyLT5pX3NiKTsKKyAgICAgIHBhdGhyZWxzZSAoJnBhdGgpOworICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICB9CisgICAgLyogYWRqdXN0IG9mZnNldCBvZiBkaXJlY3RvcnkgZW5ydHkgKi8KKyAgICBwdXRfZGVoX29mZnNldChkZWgsIFNFVF9HRU5FUkFUSU9OX05VTUJFUihkZWhfb2Zmc2V0KGRlaCksIGdlbl9udW1iZXIpKTsKKyAgICBzZXRfY3B1X2tleV9rX29mZnNldCAoJmVudHJ5X2tleSwgZGVoX29mZnNldChkZWgpKTsKKyAKKyAgICAvKiB1cGRhdGUgbWF4LWhhc2gtY29sbGlzaW9ucyBjb3VudGVyIGluIHJlaXNlcmZzX3NiX2luZm8gKi8KKyAgICBQUk9DX0lORk9fTUFYKCB0aCAtPiB0X3N1cGVyLCBtYXhfaGFzaF9jb2xsaXNpb25zLCBnZW5fbnVtYmVyICk7CisgCQkgIAorICAgIGlmIChnZW5fbnVtYmVyICE9IDApIHsJLyogd2UgbmVlZCB0byByZS1zZWFyY2ggZm9yIHRoZSBpbnNlcnRpb24gcG9pbnQgKi8KKyAgICAgIGlmIChzZWFyY2hfYnlfZW50cnlfa2V5IChkaXItPmlfc2IsICZlbnRyeV9rZXksICZwYXRoLCAmZGUpICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICByZWlzZXJmc193YXJuaW5nIChkaXItPmlfc2IsICJ2cy03MDMyOiByZWlzZXJmc19hZGRfZW50cnk6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbnRyeSB3aXRoIHRoaXMga2V5ICglSykgYWxyZWFkeSBleGlzdHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVudHJ5X2tleSk7CisKKwkgICAgaWYgKGJ1ZmZlciAhPSBzbWFsbF9idWYpCisJCXJlaXNlcmZzX2tmcmVlIChidWZmZXIsIGJ1ZmxlbiwgZGlyLT5pX3NiKTsKKwkgICAgcGF0aHJlbHNlICgmcGF0aCk7CisJICAgIHJldHVybiAtRUJVU1k7CisJfQorICAgIH0KKyAgCisgICAgLyogcGVyZm9ybSB0aGUgaW5zZXJ0aW9uIG9mIHRoZSBlbnRyeSB0aGF0IHdlIGhhdmUgcHJlcGFyZWQgKi8KKyAgICByZXR2YWwgPSByZWlzZXJmc19wYXN0ZV9pbnRvX2l0ZW0gKHRoLCAmcGF0aCwgJmVudHJ5X2tleSwgZGlyLCBidWZmZXIsIHBhc3RlX3NpemUpOworICAgIGlmIChidWZmZXIgIT0gc21hbGxfYnVmKQorCXJlaXNlcmZzX2tmcmVlIChidWZmZXIsIGJ1ZmxlbiwgZGlyLT5pX3NiKTsKKyAgICBpZiAocmV0dmFsKSB7CisJcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aCkgOworCXJldHVybiByZXR2YWw7CisgICAgfQorCisgICAgZGlyLT5pX3NpemUgKz0gcGFzdGVfc2l6ZTsKKyAgICBkaXItPmlfbXRpbWUgPSBkaXItPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworICAgIGlmICghU19JU0RJUiAoaW5vZGUtPmlfbW9kZSkgJiYgdmlzaWJsZSkKKwkvLyByZWlzZXJmc19ta2RpciBvciByZWlzZXJmc19yZW5hbWUgd2lsbCBkbyB0aGF0IGJ5IGl0c2VsZgorCXJlaXNlcmZzX3VwZGF0ZV9zZCAodGgsIGRpcik7CisKKyAgICByZWlzZXJmc19jaGVja19wYXRoKCZwYXRoKSA7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIHF1b3RhIHV0aWxpdHkgZnVuY3Rpb24sIGNhbGwgaWYgeW91J3ZlIGhhZCB0byBhYm9ydCBhZnRlciBjYWxsaW5nCisqKiBuZXdfaW5vZGVfaW5pdCwgYW5kIGhhdmUgbm90IGNhbGxlZCByZWlzZXJmc19uZXdfaW5vZGUgeWV0LgorKiogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgb24gaW5vZGVzIHRoYXQgZG8gbm90IGhhdmUgc3RhdCBkYXRhCisqKiBpbnNlcnRlZCBpbnRvIHRoZSB0cmVlIHlldC4KKyovCitzdGF0aWMgaW50IGRyb3BfbmV3X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpIHsKKyAgICBEUVVPVF9EUk9QKGlub2RlKTsKKyAgICBtYWtlX2JhZF9pbm9kZShpbm9kZSkgOworICAgIGlub2RlLT5pX2ZsYWdzIHw9IFNfTk9RVU9UQTsKKyAgICBpcHV0KGlub2RlKSA7CisgICAgcmV0dXJuIDAgOworfQorCisvKiB1dGlsaXR5IGZ1bmN0aW9uIHRoYXQgZG9lcyBzZXR1cCBmb3IgcmVpc2VyZnNfbmV3X2lub2RlLiAgCisqKiBEUVVPVF9JTklUIG5lZWRzIGxvdHMgb2YgY3JlZGl0cyBzbyBpdCdzIGJldHRlciB0byBoYXZlIGl0CisqKiBvdXRzaWRlIG9mIGEgdHJhbnNhY3Rpb24sIHNvIHdlIGhhZCB0byBwdWxsIHNvbWUgYml0cyBvZgorKiogcmVpc2VyZnNfbmV3X2lub2RlIG91dCBpbnRvIHRoaXMgZnVuYy4KKyovCitzdGF0aWMgaW50IG5ld19pbm9kZV9pbml0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpbm9kZSAqZGlyLCBpbnQgbW9kZSkgeworCisgICAgLyogdGhlIHF1b3RhIGluaXQgY2FsbHMgaGF2ZSB0byBrbm93IHdobyB0byBjaGFyZ2UgdGhlIHF1b3RhIHRvLCBzbworICAgICoqIHdlIGhhdmUgdG8gc2V0IHVpZCBhbmQgZ2lkIGhlcmUKKyAgICAqLworICAgIGlub2RlLT5pX3VpZCA9IGN1cnJlbnQtPmZzdWlkOworICAgIGlub2RlLT5pX21vZGUgPSBtb2RlOworCisgICAgaWYgKGRpci0+aV9tb2RlICYgU19JU0dJRCkgeworICAgICAgICBpbm9kZS0+aV9naWQgPSBkaXItPmlfZ2lkOworICAgICAgICBpZiAoU19JU0RJUihtb2RlKSkKKyAgICAgICAgICAgIGlub2RlLT5pX21vZGUgfD0gU19JU0dJRDsKKyAgICB9IGVsc2UgeworICAgICAgICBpbm9kZS0+aV9naWQgPSBjdXJyZW50LT5mc2dpZDsKKyAgICB9CisgICAgRFFVT1RfSU5JVChpbm9kZSk7CisgICAgcmV0dXJuIDAgOworfQorCitzdGF0aWMgaW50IHJlaXNlcmZzX2NyZWF0ZSAoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLAorCQlzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKyAgICBpbnQgcmV0dmFsOworICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlOworICAgIC8qIFdlIG5lZWQgYmxvY2tzIGZvciB0cmFuc2FjdGlvbiArICh1c2VyK2dyb3VwKSoocXVvdGFzIGZvciBuZXcgaW5vZGUgKyB1cGRhdGUgb2YgcXVvdGEgZm9yIGRpcmVjdG9yeSBvd25lcikgKi8KKyAgICBpbnQgamJlZ2luX2NvdW50ID0gSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAyICsgMiAqIChSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUytSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1MpOworICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGggOworICAgIGludCBsb2NrZWQ7CisKKyAgICBpZiAoIShpbm9kZSA9IG5ld19pbm9kZShkaXItPmlfc2IpKSkgeworCXJldHVybiAtRU5PTUVNIDsKKyAgICB9CisgICAgbmV3X2lub2RlX2luaXQoaW5vZGUsIGRpciwgbW9kZSk7CisKKyAgICBsb2NrZWQgPSByZWlzZXJmc19jYWNoZV9kZWZhdWx0X2FjbCAoZGlyKTsKKworICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soZGlyLT5pX3NiKTsKKworICAgIGlmIChsb2NrZWQpCisgICAgICAgIHJlaXNlcmZzX3dyaXRlX2xvY2tfeGF0dHJzIChkaXItPmlfc2IpOworCisgICAgcmV0dmFsID0gam91cm5hbF9iZWdpbigmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KTsKKyAgICBpZiAocmV0dmFsKSB7CisgICAgICAgIGRyb3BfbmV3X2lub2RlIChpbm9kZSk7CisgICAgICAgIGdvdG8gb3V0X2ZhaWxlZDsKKyAgICB9CisKKyAgICByZXR2YWwgPSByZWlzZXJmc19uZXdfaW5vZGUgKCZ0aCwgZGlyLCBtb2RlLCAwLCAwLyppX3NpemUqLywgZGVudHJ5LCBpbm9kZSk7CisgICAgaWYgKHJldHZhbCkKKyAgICAgICAgZ290byBvdXRfZmFpbGVkOworCQorICAgIGlmIChsb2NrZWQpIHsKKyAgICAgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRycyAoZGlyLT5pX3NiKTsKKyAgICAgICAgbG9ja2VkID0gMDsKKyAgICB9CisKKyAgICBpbm9kZS0+aV9vcCA9ICZyZWlzZXJmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CisgICAgaW5vZGUtPmlfZm9wID0gJnJlaXNlcmZzX2ZpbGVfb3BlcmF0aW9uczsKKyAgICBpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZyZWlzZXJmc19hZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgOworCisgICAgcmV0dmFsID0gcmVpc2VyZnNfYWRkX2VudHJ5ICgmdGgsIGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLCAKKwkJCQlpbm9kZSwgMS8qdmlzaWJsZSovKTsKKyAgICBpZiAocmV0dmFsKSB7CisgICAgICAgIGludCBlcnI7CisJaW5vZGUtPmlfbmxpbmstLTsKKwlyZWlzZXJmc191cGRhdGVfc2QgKCZ0aCwgaW5vZGUpOworCWVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKKyAgICAgICAgaWYgKGVycikKKyAgICAgICAgICAgIHJldHZhbCA9IGVycjsKKwlpcHV0IChpbm9kZSk7CisJZ290byBvdXRfZmFpbGVkOworICAgIH0KKyAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpIDsKKyAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oZGlyKSA7CisKKyAgICBkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworICAgIHJldHZhbCA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKKworb3V0X2ZhaWxlZDoKKyAgICBpZiAobG9ja2VkKQorICAgICAgICByZWlzZXJmc193cml0ZV91bmxvY2tfeGF0dHJzIChkaXItPmlfc2IpOworICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOworICAgIHJldHVybiByZXR2YWw7Cit9CisKKworc3RhdGljIGludCByZWlzZXJmc19ta25vZCAoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLCBkZXZfdCByZGV2KQoreworICAgIGludCByZXR2YWw7CisgICAgc3RydWN0IGlub2RlICogaW5vZGU7CisgICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7CisgICAgLyogV2UgbmVlZCBibG9ja3MgZm9yIHRyYW5zYWN0aW9uICsgKHVzZXIrZ3JvdXApKihxdW90YXMgZm9yIG5ldyBpbm9kZSArIHVwZGF0ZSBvZiBxdW90YSBmb3IgZGlyZWN0b3J5IG93bmVyKSAqLworICAgIGludCBqYmVnaW5fY291bnQgPSBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDMgKyAyICogKFJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTK1JFSVNFUkZTX1FVT1RBX1RSQU5TX0JMT0NLUyk7CisgICAgaW50IGxvY2tlZDsKKworICAgIGlmICghbmV3X3ZhbGlkX2RldihyZGV2KSkKKwlyZXR1cm4gLUVJTlZBTDsKKworICAgIGlmICghKGlub2RlID0gbmV3X2lub2RlKGRpci0+aV9zYikpKSB7CisJcmV0dXJuIC1FTk9NRU0gOworICAgIH0KKyAgICBuZXdfaW5vZGVfaW5pdChpbm9kZSwgZGlyLCBtb2RlKTsKKworICAgIGxvY2tlZCA9IHJlaXNlcmZzX2NhY2hlX2RlZmF1bHRfYWNsIChkaXIpOworCisgICAgcmVpc2VyZnNfd3JpdGVfbG9jayhkaXItPmlfc2IpOworCisgICAgaWYgKGxvY2tlZCkKKyAgICAgICAgcmVpc2VyZnNfd3JpdGVfbG9ja194YXR0cnMgKGRpci0+aV9zYik7CisKKyAgICByZXR2YWwgPSBqb3VybmFsX2JlZ2luKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKKyAgICBpZiAocmV0dmFsKSB7CisgICAgICAgIGRyb3BfbmV3X2lub2RlIChpbm9kZSk7CisgICAgICAgIGdvdG8gb3V0X2ZhaWxlZDsKKyAgICB9CisKKyAgICByZXR2YWwgPSByZWlzZXJmc19uZXdfaW5vZGUgKCZ0aCwgZGlyLCBtb2RlLCBOVUxMLCAwLyppX3NpemUqLywgZGVudHJ5LCBpbm9kZSk7CisgICAgaWYgKHJldHZhbCkgeworICAgICAgICBnb3RvIG91dF9mYWlsZWQ7CisgICAgfQorCisgICAgaWYgKGxvY2tlZCkgeworICAgICAgICByZWlzZXJmc193cml0ZV91bmxvY2tfeGF0dHJzIChkaXItPmlfc2IpOworICAgICAgICBsb2NrZWQgPSAwOworICAgIH0KKworCisgICAgaW5vZGUtPmlfb3AgPSAmcmVpc2VyZnNfc3BlY2lhbF9pbm9kZV9vcGVyYXRpb25zOworICAgIGluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwgcmRldikgOworCisgICAgLy9GSVhNRTogbmVlZGVkIGZvciBibG9jayBhbmQgY2hhciBkZXZpY2VzIG9ubHkKKyAgICByZWlzZXJmc191cGRhdGVfc2QgKCZ0aCwgaW5vZGUpOworCisgICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKSA7CisgICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGRpcikgOworCisgICAgcmV0dmFsID0gcmVpc2VyZnNfYWRkX2VudHJ5ICgmdGgsIGRpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLCAKKwkJCQkgaW5vZGUsIDEvKnZpc2libGUqLyk7CisgICAgaWYgKHJldHZhbCkgeworICAgICAgICBpbnQgZXJyOworCWlub2RlLT5pX25saW5rLS07CisJcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIGlub2RlKTsKKwllcnIgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7CisgICAgICAgIGlmIChlcnIpCisJICAgIHJldHZhbCA9IGVycjsKKwlpcHV0IChpbm9kZSk7CisJZ290byBvdXRfZmFpbGVkOworICAgIH0KKworICAgIGRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisgICAgcmV0dmFsID0gam91cm5hbF9lbmQoJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOworCitvdXRfZmFpbGVkOgorICAgIGlmIChsb2NrZWQpCisgICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cnMgKGRpci0+aV9zYik7CisgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworCitzdGF0aWMgaW50IHJlaXNlcmZzX21rZGlyIChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpCit7CisgICAgaW50IHJldHZhbDsKKyAgICBzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoIDsKKyAgICAvKiBXZSBuZWVkIGJsb2NrcyBmb3IgdHJhbnNhY3Rpb24gKyAodXNlcitncm91cCkqKHF1b3RhcyBmb3IgbmV3IGlub2RlICsgdXBkYXRlIG9mIHF1b3RhIGZvciBkaXJlY3Rvcnkgb3duZXIpICovCisgICAgaW50IGpiZWdpbl9jb3VudCA9IEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMyArIDIgKiAoUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MrUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKTsKKyAgICBpbnQgbG9ja2VkOworCisjaWZkZWYgRElTUExBQ0VfTkVXX1BBQ0tJTkdfTE9DQUxJVElFUworICAgIC8qIHNldCBmbGFnIHRoYXQgbmV3IHBhY2tpbmcgbG9jYWxpdHkgY3JlYXRlZCBhbmQgbmV3IGJsb2NrcyBmb3IgdGhlIGNvbnRlbnQgICAgICogb2YgdGhhdCBkaXJlY3RvcnkgYXJlIG5vdCBkaXNwbGFjZWQgeWV0ICovCisgICAgUkVJU0VSRlNfSShkaXIpLT5uZXdfcGFja2luZ19sb2NhbGl0eSA9IDE7CisjZW5kaWYKKyAgICBtb2RlID0gU19JRkRJUiB8IG1vZGU7CisgICAgaWYgKCEoaW5vZGUgPSBuZXdfaW5vZGUoZGlyLT5pX3NiKSkpIHsKKwlyZXR1cm4gLUVOT01FTSA7CisgICAgfQorICAgIG5ld19pbm9kZV9pbml0KGlub2RlLCBkaXIsIG1vZGUpOworCisgICAgbG9ja2VkID0gcmVpc2VyZnNfY2FjaGVfZGVmYXVsdF9hY2wgKGRpcik7CisKKyAgICByZWlzZXJmc193cml0ZV9sb2NrKGRpci0+aV9zYik7CisgICAgaWYgKGxvY2tlZCkKKyAgICAgICAgcmVpc2VyZnNfd3JpdGVfbG9ja194YXR0cnMgKGRpci0+aV9zYik7CisKKyAgICByZXR2YWwgPSBqb3VybmFsX2JlZ2luKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKKyAgICBpZiAocmV0dmFsKSB7CisgICAgICAgIGRyb3BfbmV3X2lub2RlIChpbm9kZSk7CisgICAgICAgIGdvdG8gb3V0X2ZhaWxlZDsKKyAgICB9CisKKworICAgIC8qIGluYyB0aGUgbGluayBjb3VudCBub3csIHNvIGFub3RoZXIgd3JpdGVyIGRvZXNuJ3Qgb3ZlcmZsb3cgaXQgd2hpbGUKKyAgICAqKiB3ZSBzbGVlcCBsYXRlciBvbi4KKyAgICAqLworICAgIElOQ19ESVJfSU5PREVfTkxJTksoZGlyKQorCisgICAgcmV0dmFsID0gcmVpc2VyZnNfbmV3X2lub2RlICgmdGgsIGRpciwgbW9kZSwgTlVMTC8qc3ltbGluayovLAorCQkJCW9sZF9mb3JtYXRfb25seSAoZGlyLT5pX3NiKSA/IAorCQkJCUVNUFRZX0RJUl9TSVpFX1YxIDogRU1QVFlfRElSX1NJWkUsCisJCQkJZGVudHJ5LCBpbm9kZSk7CisgICAgaWYgKHJldHZhbCkgeworCWRpci0+aV9ubGluay0tIDsKKwlnb3RvIG91dF9mYWlsZWQ7CisgICAgfQorCisgICAgaWYgKGxvY2tlZCkgeworCXJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cnMgKGRpci0+aV9zYik7CisJbG9ja2VkID0gMDsKKyAgICB9CisKKyAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oaW5vZGUpIDsKKyAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24oZGlyKSA7CisKKyAgICBpbm9kZS0+aV9vcCA9ICZyZWlzZXJmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKKyAgICBpbm9kZS0+aV9mb3AgPSAmcmVpc2VyZnNfZGlyX29wZXJhdGlvbnM7CisKKyAgICAvLyBub3RlLCBfdGhpc18gYWRkX2VudHJ5IHdpbGwgbm90IHVwZGF0ZSBkaXIncyBzdGF0IGRhdGEKKyAgICByZXR2YWwgPSByZWlzZXJmc19hZGRfZW50cnkgKCZ0aCwgZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5sZW4sIAorCQkJCWlub2RlLCAxLyp2aXNpYmxlKi8pOworICAgIGlmIChyZXR2YWwpIHsKKwlpbnQgZXJyOworCWlub2RlLT5pX25saW5rID0gMDsKKwlERUNfRElSX0lOT0RFX05MSU5LKGRpcik7CisJcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIGlub2RlKTsKKwllcnIgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7CisJaWYgKGVycikKKwkgICAgcmV0dmFsID0gZXJyOworCWlwdXQgKGlub2RlKTsKKwlnb3RvIG91dF9mYWlsZWQ7CisgICAgfQorCisgICAgLy8gdGhlIGFib3ZlIGFkZF9lbnRyeSBkaWQgbm90IHVwZGF0ZSBkaXIncyBzdGF0IGRhdGEKKyAgICByZWlzZXJmc191cGRhdGVfc2QgKCZ0aCwgZGlyKTsKKworICAgIGRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisgICAgcmV0dmFsID0gam91cm5hbF9lbmQoJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOworb3V0X2ZhaWxlZDoKKyAgICBpZiAobG9ja2VkKQorICAgICAgICByZWlzZXJmc193cml0ZV91bmxvY2tfeGF0dHJzIChkaXItPmlfc2IpOworICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOworICAgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJlaXNlcmZzX2VtcHR5X2RpcihzdHJ1Y3QgaW5vZGUgKmlub2RlKSB7CisgICAgLyogd2UgY2FuIGNoZWF0IGJlY2F1c2UgYW4gb2xkIGZvcm1hdCBkaXIgY2Fubm90IGhhdmUKKyAgICAqKiBFTVBUWV9ESVJfU0laRSwgYW5kIGEgbmV3IGZvcm1hdCBkaXIgY2Fubm90IGhhdmUKKyAgICAqKiBFTVBUWV9ESVJfU0laRV9WMS4gIFNvLCBpZiB0aGUgaW5vZGUgaXMgZWl0aGVyIHNpemUsIAorICAgICoqIHJlZ2FyZGxlc3Mgb2YgZGlzayBmb3JtYXQgdmVyc2lvbiwgdGhlIGRpcmVjdG9yeSBpcyBlbXB0eS4KKyAgICAqLworICAgIGlmIChpbm9kZS0+aV9zaXplICE9IEVNUFRZX0RJUl9TSVpFICYmCisgICAgICAgIGlub2RlLT5pX3NpemUgIT0gRU1QVFlfRElSX1NJWkVfVjEpIHsKKyAgICAgICAgcmV0dXJuIDAgOworICAgIH0KKyAgICByZXR1cm4gMSA7Cit9CisKK3N0YXRpYyBpbnQgcmVpc2VyZnNfcm1kaXIgKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworICAgIGludCByZXR2YWwsIGVycjsKKyAgICBzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoIDsKKyAgICBpbnQgamJlZ2luX2NvdW50OyAKKyAgICBJTklUSUFMSVpFX1BBVEggKHBhdGgpOworICAgIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgZGU7CisKKworICAgIC8qIHdlIHdpbGwgYmUgZG9pbmcgMiBiYWxhbmNpbmdzIGFuZCB1cGRhdGUgMiBzdGF0IGRhdGEsIHdlIGNoYW5nZSBxdW90YXMKKyAgICAgKiBvZiB0aGUgb3duZXIgb2YgdGhlIGRpcmVjdG9yeSBhbmQgb2YgdGhlIG93bmVyIG9mIHRoZSBwYXJlbnQgZGlyZWN0b3J5ICovCisgICAgamJlZ2luX2NvdW50ID0gSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiAyICsgMiArIDIgKiAoUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MrUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKTsKKworICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soZGlyLT5pX3NiKTsKKyAgICByZXR2YWwgPSBqb3VybmFsX2JlZ2luKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKKyAgICBpZiAocmV0dmFsKQorICAgICAgICBnb3RvIG91dF9ybWRpcjsKKworICAgIGRlLmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyA9IE5VTEw7CisgICAgaWYgKCAocmV0dmFsID0gcmVpc2VyZnNfZmluZF9lbnRyeSAoZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5sZW4sICZwYXRoLCAmZGUpKSA9PSBOQU1FX05PVF9GT1VORCkgeworCXJldHZhbCA9IC1FTk9FTlQ7CisJZ290byBlbmRfcm1kaXI7CisgICAgfSBlbHNlIGlmICggcmV0dmFsID09IElPX0VSUk9SKSB7CisJcmV0dmFsID0gLUVJTzsKKwlnb3RvIGVuZF9ybWRpcjsKKyAgICB9CisKKyAgICBpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKworICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSkgOworICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihkaXIpIDsKKworICAgIGlmIChkZS5kZV9vYmplY3RpZCAhPSBpbm9kZS0+aV9pbm8pIHsKKwkvLyBGSVhNRTogY29tcGFyZSBrZXkgb2YgYW4gb2JqZWN0IGFuZCBhIGtleSBmb3VuZCBpbiB0aGUKKwkvLyBlbnRyeQorCXJldHZhbCA9IC1FSU87CisJZ290byBlbmRfcm1kaXI7CisgICAgfQorICAgIGlmICghcmVpc2VyZnNfZW1wdHlfZGlyKGlub2RlKSkgeworCXJldHZhbCA9IC1FTk9URU1QVFk7CisJZ290byBlbmRfcm1kaXI7CisgICAgfQorCisgICAgLyogY3V0IGVudHJ5IGZyb20gZGlyIGRpcmVjdG9yeSAqLworICAgIHJldHZhbCA9IHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW0gKCZ0aCwgJnBhdGgsICYoZGUuZGVfZW50cnlfa2V5KSwgZGlyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAvKiBwYWdlICovIAorCQkJCSAgICAgMC8qbmV3IGZpbGUgc2l6ZSAtIG5vdCB1c2VkIGhlcmUqLyk7CisgICAgaWYgKHJldHZhbCA8IDApCisJZ290byBlbmRfcm1kaXI7CisKKyAgICBpZiAoIGlub2RlLT5pX25saW5rICE9IDIgJiYgaW5vZGUtPmlfbmxpbmsgIT0gMSApCisJcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICIlczogZW1wdHkgZGlyZWN0b3J5IGhhcyBubGluayAiCisJCQkgICIhPSAyICglZCkiLCBfX0ZVTkNUSU9OX18sIGlub2RlLT5pX25saW5rKTsKKworICAgIGlub2RlLT5pX25saW5rID0gMDsKKyAgICBpbm9kZS0+aV9jdGltZSA9IGRpci0+aV9jdGltZSA9IGRpci0+aV9tdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisgICAgcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIGlub2RlKTsKKworICAgIERFQ19ESVJfSU5PREVfTkxJTksoZGlyKQorICAgIGRpci0+aV9zaXplIC09IChERUhfU0laRSArIGRlLmRlX2VudHJ5bGVuKTsKKyAgICByZWlzZXJmc191cGRhdGVfc2QgKCZ0aCwgZGlyKTsKKworICAgIC8qIHByZXZlbnQgZW1wdHkgZGlyZWN0b3J5IGZyb20gZ2V0dGluZyBsb3N0ICovCisgICAgYWRkX3NhdmVfbGluayAoJnRoLCBpbm9kZSwgMC8qIG5vdCB0cnVuY2F0ZSAqLyk7CisKKyAgICByZXR2YWwgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7CisgICAgcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aCkgOworb3V0X3JtZGlyOgorICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOworICAgIHJldHVybiByZXR2YWw7CisJCisgZW5kX3JtZGlyOgorICAgIC8qIHdlIG11c3QgcmVsZWFzZSBwYXRoLCBiZWNhdXNlIHdlIGRpZCBub3QgY2FsbAorICAgICAgIHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW0sIG9yIHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW0gZG9lcyBub3QKKyAgICAgICByZWxlYXNlIHBhdGggaWYgb3BlcmF0aW9uIHdhcyBub3QgY29tcGxldGUgKi8KKyAgICBwYXRocmVsc2UgKCZwYXRoKTsKKyAgICBlcnIgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7CisgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7CisgICAgcmV0dXJuIGVyciA/IGVyciA6IHJldHZhbDsKK30KKworc3RhdGljIGludCByZWlzZXJmc191bmxpbmsgKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworICAgIGludCByZXR2YWwsIGVycjsKKyAgICBzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5IGRlOworICAgIElOSVRJQUxJWkVfUEFUSCAocGF0aCk7CisgICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7CisgICAgaW50IGpiZWdpbl9jb3VudDsKKyAgICB1bnNpZ25lZCBsb25nIHNhdmVsaW5rOworCisgICAgaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisKKyAgICAvKiBpbiB0aGlzIHRyYW5zYWN0aW9uIHdlIGNhbiBiZSBkb2luZyBhdCBtYXggdHdvIGJhbGFuY2luZ3MgYW5kIHVwZGF0ZQorICAgICAgIHR3byBzdGF0IGRhdGFzLCB3ZSBjaGFuZ2UgcXVvdGFzIG9mIHRoZSBvd25lciBvZiB0aGUgZGlyZWN0b3J5IGFuZCBvZgorICAgICAgIHRoZSBvd25lciBvZiB0aGUgcGFyZW50IGRpcmVjdG9yeSAqLworICAgIGpiZWdpbl9jb3VudCA9IEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMiArIDIgKyAyICogKFJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTK1JFSVNFUkZTX1FVT1RBX1RSQU5TX0JMT0NLUyk7CisKKyAgICByZWlzZXJmc193cml0ZV9sb2NrKGRpci0+aV9zYik7CisgICAgcmV0dmFsID0gam91cm5hbF9iZWdpbigmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7CisgICAgaWYgKHJldHZhbCkKKyAgICAgICAgZ290byBvdXRfdW5saW5rOworCQorICAgIGRlLmRlX2dlbl9udW1iZXJfYml0X3N0cmluZyA9IE5VTEw7CisgICAgaWYgKCAocmV0dmFsID0gcmVpc2VyZnNfZmluZF9lbnRyeSAoZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5sZW4sICZwYXRoLCAmZGUpKSA9PSBOQU1FX05PVF9GT1VORCkgeworCXJldHZhbCA9IC1FTk9FTlQ7CisJZ290byBlbmRfdW5saW5rOworICAgIH0gZWxzZSBpZiAocmV0dmFsID09IElPX0VSUk9SKSB7CisJcmV0dmFsID0gLUVJTzsKKwlnb3RvIGVuZF91bmxpbms7CisgICAgfQorCisgICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKSA7CisgICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGRpcikgOworCisgICAgaWYgKGRlLmRlX29iamVjdGlkICE9IGlub2RlLT5pX2lubykgeworCS8vIEZJWE1FOiBjb21wYXJlIGtleSBvZiBhbiBvYmplY3QgYW5kIGEga2V5IGZvdW5kIGluIHRoZQorCS8vIGVudHJ5CisJcmV0dmFsID0gLUVJTzsKKwlnb3RvIGVuZF91bmxpbms7CisgICAgfQorICAKKyAgICBpZiAoIWlub2RlLT5pX25saW5rKSB7CisJcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICIlczogZGVsZXRpbmcgbm9uZXhpc3RlbnQgZmlsZSAiCisJCQkgICIoJXM6JWx1KSwgJWQiLCBfX0ZVTkNUSU9OX18sCisJCQkgIHJlaXNlcmZzX2JkZXZuYW1lIChpbm9kZS0+aV9zYiksIGlub2RlLT5pX2lubywKKwkJCSAgaW5vZGUtPmlfbmxpbmspOworCWlub2RlLT5pX25saW5rID0gMTsKKyAgICB9CisKKyAgICBpbm9kZS0+aV9ubGluay0tOworCisgICAgLyoKKyAgICAgKiB3ZSBzY2hlZHVsZSBiZWZvcmUgZG9pbmcgdGhlIGFkZF9zYXZlX2xpbmsgY2FsbCwgc2F2ZSB0aGUgbGluaworICAgICAqIGNvdW50IHNvIHdlIGRvbid0IHJhY2UKKyAgICAgKi8KKyAgICBzYXZlbGluayA9IGlub2RlLT5pX25saW5rOworCisKKyAgICByZXR2YWwgPSByZWlzZXJmc19jdXRfZnJvbV9pdGVtICgmdGgsICZwYXRoLCAmKGRlLmRlX2VudHJ5X2tleSksIGRpciwgTlVMTCwgMCk7CisgICAgaWYgKHJldHZhbCA8IDApIHsKKwlpbm9kZS0+aV9ubGluaysrOworCWdvdG8gZW5kX3VubGluazsKKyAgICB9CisgICAgaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCAoJnRoLCBpbm9kZSk7CisKKyAgICBkaXItPmlfc2l6ZSAtPSAoZGUuZGVfZW50cnlsZW4gKyBERUhfU0laRSk7CisgICAgZGlyLT5pX2N0aW1lID0gZGlyLT5pX210aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKyAgICByZWlzZXJmc191cGRhdGVfc2QgKCZ0aCwgZGlyKTsKKworICAgIGlmICghc2F2ZWxpbmspCisgICAgICAgLyogcHJldmVudCBmaWxlIGZyb20gZ2V0dGluZyBsb3N0ICovCisgICAgICAgYWRkX3NhdmVfbGluayAoJnRoLCBpbm9kZSwgMC8qIG5vdCB0cnVuY2F0ZSAqLyk7CisKKyAgICByZXR2YWwgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7CisgICAgcmVpc2VyZnNfY2hlY2tfcGF0aCgmcGF0aCkgOworICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOworICAgIHJldHVybiByZXR2YWw7CisKKyBlbmRfdW5saW5rOgorICAgIHBhdGhyZWxzZSAoJnBhdGgpOworICAgIGVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKKyAgICByZWlzZXJmc19jaGVja19wYXRoKCZwYXRoKSA7CisgICAgaWYgKGVycikKKyAgICAgICAgcmV0dmFsID0gZXJyOworb3V0X3VubGluazoKKyAgICByZWlzZXJmc193cml0ZV91bmxvY2soZGlyLT5pX3NiKTsKKyAgICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHJlaXNlcmZzX3N5bWxpbmsgKHN0cnVjdCBpbm9kZSAqIHBhcmVudF9kaXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkZW50cnkgKiBkZW50cnksIGNvbnN0IGNoYXIgKiBzeW1uYW1lKQoreworICAgIGludCByZXR2YWw7CisgICAgc3RydWN0IGlub2RlICogaW5vZGU7CisgICAgY2hhciAqIG5hbWU7CisgICAgaW50IGl0ZW1fbGVuOworICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGggOworICAgIGludCBtb2RlID0gU19JRkxOSyB8IFNfSVJXWFVHTzsKKyAgICAvKiBXZSBuZWVkIGJsb2NrcyBmb3IgdHJhbnNhY3Rpb24gKyAodXNlcitncm91cCkqKHF1b3RhcyBmb3IgbmV3IGlub2RlICsgdXBkYXRlIG9mIHF1b3RhIGZvciBkaXJlY3Rvcnkgb3duZXIpICovCisgICAgaW50IGpiZWdpbl9jb3VudCA9IEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMyArIDIgKiAoUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MrUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKTsKKworICAgIGlmICghKGlub2RlID0gbmV3X2lub2RlKHBhcmVudF9kaXItPmlfc2IpKSkgeworCXJldHVybiAtRU5PTUVNIDsKKyAgICB9CisgICAgbmV3X2lub2RlX2luaXQoaW5vZGUsIHBhcmVudF9kaXIsIG1vZGUpOworCisgICAgcmVpc2VyZnNfd3JpdGVfbG9jayhwYXJlbnRfZGlyLT5pX3NiKTsKKyAgICBpdGVtX2xlbiA9IFJPVU5EX1VQIChzdHJsZW4gKHN5bW5hbWUpKTsKKyAgICBpZiAoaXRlbV9sZW4gPiBNQVhfRElSRUNUX0lURU1fTEVOIChwYXJlbnRfZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkpIHsKKwlyZXR2YWwgPSAgLUVOQU1FVE9PTE9ORzsKKwlkcm9wX25ld19pbm9kZShpbm9kZSk7CisJZ290byBvdXRfZmFpbGVkOworICAgIH0KKyAgCisgICAgbmFtZSA9IHJlaXNlcmZzX2ttYWxsb2MgKGl0ZW1fbGVuLCBHRlBfTk9GUywgcGFyZW50X2Rpci0+aV9zYik7CisgICAgaWYgKCFuYW1lKSB7CisJZHJvcF9uZXdfaW5vZGUoaW5vZGUpOworCXJldHZhbCA9ICAtRU5PTUVNOworCWdvdG8gb3V0X2ZhaWxlZDsKKyAgICB9CisgICAgbWVtY3B5IChuYW1lLCBzeW1uYW1lLCBzdHJsZW4gKHN5bW5hbWUpKTsKKyAgICBwYWRkX2l0ZW0gKG5hbWUsIGl0ZW1fbGVuLCBzdHJsZW4gKHN5bW5hbWUpKTsKKworICAgIC8qIFdlIHdvdWxkIGluaGVyaXQgdGhlIGRlZmF1bHQgQUNMIGhlcmUsIGJ1dCBzeW1saW5rcyBkb24ndCBnZXQgQUNMcyAqLworCisgICAgcmV0dmFsID0gam91cm5hbF9iZWdpbigmdGgsIHBhcmVudF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOworICAgIGlmIChyZXR2YWwpIHsKKyAgICAgICAgZHJvcF9uZXdfaW5vZGUgKGlub2RlKTsKKyAgICAgICAgcmVpc2VyZnNfa2ZyZWUgKG5hbWUsIGl0ZW1fbGVuLCBwYXJlbnRfZGlyLT5pX3NiKTsKKyAgICAgICAgZ290byBvdXRfZmFpbGVkOworICAgIH0KKworICAgIHJldHZhbCA9IHJlaXNlcmZzX25ld19pbm9kZSAoJnRoLCBwYXJlbnRfZGlyLCBtb2RlLCBuYW1lLCBzdHJsZW4gKHN5bW5hbWUpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbnRyeSwgaW5vZGUpOworICAgIHJlaXNlcmZzX2tmcmVlIChuYW1lLCBpdGVtX2xlbiwgcGFyZW50X2Rpci0+aV9zYik7CisgICAgaWYgKHJldHZhbCkgeyAvKiByZWlzZXJmc19uZXdfaW5vZGUgaXB1dHMgZm9yIHVzICovCisJZ290byBvdXRfZmFpbGVkOworICAgIH0KKworICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihpbm9kZSkgOworICAgIHJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihwYXJlbnRfZGlyKSA7CisKKyAgICBpbm9kZS0+aV9vcCA9ICZyZWlzZXJmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisgICAgaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmcmVpc2VyZnNfYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zOworCisgICAgLy8gbXVzdCBiZSBzdXJlIHRoaXMgaW5vZGUgaXMgd3JpdHRlbiB3aXRoIHRoaXMgdHJhbnNhY3Rpb24KKyAgICAvLworICAgIC8vcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIGlub2RlLCBSRUFEX0JMT0NLUyk7CisKKyAgICByZXR2YWwgPSByZWlzZXJmc19hZGRfZW50cnkgKCZ0aCwgcGFyZW50X2RpciwgZGVudHJ5LT5kX25hbWUubmFtZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZW50cnktPmRfbmFtZS5sZW4sIGlub2RlLCAxLyp2aXNpYmxlKi8pOworICAgIGlmIChyZXR2YWwpIHsKKwlpbnQgZXJyOworCWlub2RlLT5pX25saW5rLS07CisJcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIGlub2RlKTsKKwllcnIgPSBqb3VybmFsX2VuZCgmdGgsIHBhcmVudF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOworCWlmIChlcnIpCisJICAgIHJldHZhbCA9IGVycjsKKwlpcHV0IChpbm9kZSk7CisJZ290byBvdXRfZmFpbGVkOworICAgIH0KKworICAgIGRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisgICAgcmV0dmFsID0gam91cm5hbF9lbmQoJnRoLCBwYXJlbnRfZGlyLT5pX3NiLCBqYmVnaW5fY291bnQpIDsKK291dF9mYWlsZWQ6CisgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHBhcmVudF9kaXItPmlfc2IpOworICAgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgcmVpc2VyZnNfbGluayAoc3RydWN0IGRlbnRyeSAqIG9sZF9kZW50cnksIHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqIGRlbnRyeSkKK3sKKyAgICBpbnQgcmV0dmFsOworICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBvbGRfZGVudHJ5LT5kX2lub2RlOworICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGggOworICAgIC8qIFdlIG5lZWQgYmxvY2tzIGZvciB0cmFuc2FjdGlvbiArIHVwZGF0ZSBvZiBxdW90YXMgZm9yIHRoZSBvd25lcnMgb2YgdGhlIGRpcmVjdG9yeSAqLworICAgIGludCBqYmVnaW5fY291bnQgPSBKT1VSTkFMX1BFUl9CQUxBTkNFX0NOVCAqIDMgKyAyICogUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTOworCisgICAgcmVpc2VyZnNfd3JpdGVfbG9jayhkaXItPmlfc2IpOworICAgIGlmIChpbm9kZS0+aV9ubGluayA+PSBSRUlTRVJGU19MSU5LX01BWCkgeworCS8vRklYTUU6IHNkX25saW5rIGlzIDMyIGJpdCBmb3IgbmV3IGZpbGVzCisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7CisJcmV0dXJuIC1FTUxJTks7CisgICAgfQorICAgIGlmIChpbm9kZS0+aV9ubGluayA9PSAwKSB7CisgICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhkaXItPmlfc2IpOworICAgICAgICByZXR1cm4gLUVOT0VOVDsKKyAgICB9CisKKyAgICAvKiBpbmMgYmVmb3JlIHNjaGVkdWxpbmcgc28gcmVpc2VyZnNfdW5saW5rIGtub3dzIHdlIGFyZSBoZXJlICovCisgICAgaW5vZGUtPmlfbmxpbmsrKzsKKworICAgIHJldHZhbCA9IGpvdXJuYWxfYmVnaW4oJnRoLCBkaXItPmlfc2IsIGpiZWdpbl9jb3VudCkgOworICAgIGlmIChyZXR2YWwpIHsKKyAgICAgICAgaW5vZGUtPmlfbmxpbmstLTsKKyAgICAgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrIChkaXItPmlfc2IpOworICAgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKworICAgIC8qIGNyZWF0ZSBuZXcgZW50cnkgKi8KKyAgICByZXR2YWwgPSByZWlzZXJmc19hZGRfZW50cnkgKCZ0aCwgZGlyLCBkZW50cnktPmRfbmFtZS5uYW1lLCBkZW50cnktPmRfbmFtZS5sZW4sCisJCQkJIGlub2RlLCAxLyp2aXNpYmxlKi8pOworCisgICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGlub2RlKSA7CisgICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKGRpcikgOworCisgICAgaWYgKHJldHZhbCkgeworCWludCBlcnI7CisJaW5vZGUtPmlfbmxpbmstLTsKKwllcnIgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7CisJcmV0dXJuIGVyciA/IGVyciA6IHJldHZhbDsKKyAgICB9CisKKyAgICBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisgICAgcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIGlub2RlKTsKKworICAgIGF0b21pY19pbmMoJmlub2RlLT5pX2NvdW50KSA7CisgICAgZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKyAgICByZXR2YWwgPSBqb3VybmFsX2VuZCgmdGgsIGRpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7CisgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRpci0+aV9zYik7CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworCisvLyBkZSBjb250YWlucyBpbmZvcm1hdGlvbiBwb2ludGluZyB0byBhbiBlbnRyeSB3aGljaCAKK3N0YXRpYyBpbnQgZGVfc3RpbGxfdmFsaWQgKGNvbnN0IGNoYXIgKiBuYW1lLCBpbnQgbGVuLCBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICogZGUpCit7CisgICAgc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSB0bXAgPSAqZGU7CisgICAgCisgICAgLy8gcmVjYWxjdWxhdGUgcG9pbnRlciB0byBuYW1lIGFuZCBuYW1lIGxlbmd0aAorICAgIHNldF9kZV9uYW1lX2FuZF9uYW1lbGVuICgmdG1wKTsKKyAgICAvLyBGSVhNRTogY291bGQgY2hlY2sgbW9yZQorICAgIGlmICh0bXAuZGVfbmFtZWxlbiAhPSBsZW4gfHwgbWVtY21wIChuYW1lLCBkZS0+ZGVfbmFtZSwgbGVuKSkKKwlyZXR1cm4gMDsKKyAgICByZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IGVudHJ5X3BvaW50c190b19vYmplY3QgKGNvbnN0IGNoYXIgKiBuYW1lLCBpbnQgbGVuLCBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5ICogZGUsIHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworICAgIGlmICghZGVfc3RpbGxfdmFsaWQgKG5hbWUsIGxlbiwgZGUpKQorCXJldHVybiAwOworCisgICAgaWYgKGlub2RlKSB7CisJaWYgKCFkZV92aXNpYmxlIChkZS0+ZGVfZGVoICsgZGUtPmRlX2VudHJ5X251bSkpCisJICAgIHJlaXNlcmZzX3BhbmljIChOVUxMLCAidnMtNzA0MjogZW50cnlfcG9pbnRzX3RvX29iamVjdDogZW50cnkgbXVzdCBiZSB2aXNpYmxlIik7CisJcmV0dXJuIChkZS0+ZGVfb2JqZWN0aWQgPT0gaW5vZGUtPmlfaW5vKSA/IDEgOiAwOworICAgIH0KKworICAgIC8qIHRoaXMgbXVzdCBiZSBhZGRlZCBoaWRkZW4gZW50cnkgKi8KKyAgICBpZiAoZGVfdmlzaWJsZSAoZGUtPmRlX2RlaCArIGRlLT5kZV9lbnRyeV9udW0pKQorCXJlaXNlcmZzX3BhbmljIChOVUxMLCAidnMtNzA0MzogZW50cnlfcG9pbnRzX3RvX29iamVjdDogZW50cnkgbXVzdCBiZSB2aXNpYmxlIik7CisKKyAgICByZXR1cm4gMTsKK30KKworCisvKiBzZXRzIGtleSBvZiBvYmplY3RpZCB0aGUgZW50cnkgaGFzIHRvIHBvaW50IHRvICovCitzdGF0aWMgdm9pZCBzZXRfaW5vX2luX2Rpcl9lbnRyeSAoc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqIGRlLCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICoga2V5KQoreworICAgIC8qIEpETSBUaGVzZSBvcGVyYXRpb25zIGFyZSBlbmRpYW4gc2FmZSAtIGJvdGggYXJlIGxlICovCisgICAgZGUtPmRlX2RlaFtkZS0+ZGVfZW50cnlfbnVtXS5kZWhfZGlyX2lkID0ga2V5LT5rX2Rpcl9pZDsKKyAgICBkZS0+ZGVfZGVoW2RlLT5kZV9lbnRyeV9udW1dLmRlaF9vYmplY3RpZCA9IGtleS0+a19vYmplY3RpZDsKK30KKworCisvKiAKKyAqIHByb2Nlc3MsIHRoYXQgaXMgZ29pbmcgdG8gY2FsbCBmaXhfbm9kZXMvZG9fYmFsYW5jZSBtdXN0IGhvbGQgb25seQorICogb25lIHBhdGguIElmIGl0IGhvbGRzIDIgb3IgbW9yZSwgaXQgY2FuIGdldCBpbnRvIGVuZGxlc3Mgd2FpdGluZyBpbgorICogZ2V0X2VtcHR5X25vZGVzIG9yIGl0cyBjbG9uZXMgCisgKi8KK3N0YXRpYyBpbnQgcmVpc2VyZnNfcmVuYW1lIChzdHJ1Y3QgaW5vZGUgKiBvbGRfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAorCQkJICAgIHN0cnVjdCBpbm9kZSAqIG5ld19kaXIsIHN0cnVjdCBkZW50cnkgKm5ld19kZW50cnkpCit7CisgICAgaW50IHJldHZhbDsKKyAgICBJTklUSUFMSVpFX1BBVEggKG9sZF9lbnRyeV9wYXRoKTsKKyAgICBJTklUSUFMSVpFX1BBVEggKG5ld19lbnRyeV9wYXRoKTsKKyAgICBJTklUSUFMSVpFX1BBVEggKGRvdF9kb3RfZW50cnlfcGF0aCk7CisgICAgc3RydWN0IGl0ZW1faGVhZCBuZXdfZW50cnlfaWgsIG9sZF9lbnRyeV9paCwgZG90X2RvdF9paCA7CisgICAgc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSBvbGRfZGUsIG5ld19kZSwgZG90X2RvdF9kZTsKKyAgICBzdHJ1Y3QgaW5vZGUgKiBvbGRfaW5vZGUsICogbmV3X2RlbnRyeV9pbm9kZTsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoIDsKKyAgICBpbnQgamJlZ2luX2NvdW50IDsgCisgICAgdW1vZGVfdCBvbGRfaW5vZGVfbW9kZTsKKyAgICB1bnNpZ25lZCBsb25nIHNhdmVsaW5rID0gMTsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgY3RpbWU7CisKKyAgICAvKiB0aHJlZSBiYWxhbmNpbmdzOiAoMSkgb2xkIG5hbWUgcmVtb3ZhbCwgKDIpIG5ldyBuYW1lIGluc2VydGlvbgorICAgICAgIGFuZCAoMykgbWF5YmUgInNhdmUiIGxpbmsgaW5zZXJ0aW9uCisgICAgICAgc3RhdCBkYXRhIHVwZGF0ZXM6ICgxKSBvbGQgZGlyZWN0b3J5LAorICAgICAgICgyKSBuZXcgZGlyZWN0b3J5IGFuZCAoMykgbWF5YmUgb2xkIG9iamVjdCBzdGF0IGRhdGEgKHdoZW4gaXQgaXMKKyAgICAgICBkaXJlY3RvcnkpIGFuZCAoNCkgbWF5YmUgc3RhdCBkYXRhIG9mIG9iamVjdCB0byB3aGljaCBuZXcgZW50cnkKKyAgICAgICBwb2ludGVkIGluaXRpYWxseSBhbmQgKDUpIG1heWJlIGJsb2NrIGNvbnRhaW5pbmcgIi4uIiBvZgorICAgICAgIHJlbmFtZWQgZGlyZWN0b3J5CisgICAgICAgcXVvdGEgdXBkYXRlczogdHdvIHBhcmVudCBkaXJlY3RvcmllcyAqLworICAgIGpiZWdpbl9jb3VudCA9IEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UICogMyArIDUgKyA0ICogUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTOworCisgICAgb2xkX2lub2RlID0gb2xkX2RlbnRyeS0+ZF9pbm9kZTsKKyAgICBuZXdfZGVudHJ5X2lub2RlID0gbmV3X2RlbnRyeS0+ZF9pbm9kZTsKKworICAgIC8vIG1ha2Ugc3VyZSwgdGhhdCBvbGRuYW1lIHN0aWxsIGV4aXN0cyBhbmQgcG9pbnRzIHRvIGFuIG9iamVjdCB3ZQorICAgIC8vIGFyZSBnb2luZyB0byByZW5hbWUKKyAgICBvbGRfZGUuZGVfZ2VuX251bWJlcl9iaXRfc3RyaW5nID0gTlVMTDsKKyAgICByZWlzZXJmc193cml0ZV9sb2NrKG9sZF9kaXItPmlfc2IpOworICAgIHJldHZhbCA9IHJlaXNlcmZzX2ZpbmRfZW50cnkgKG9sZF9kaXIsIG9sZF9kZW50cnktPmRfbmFtZS5uYW1lLCBvbGRfZGVudHJ5LT5kX25hbWUubGVuLAorCQkJCSAgJm9sZF9lbnRyeV9wYXRoLCAmb2xkX2RlKTsKKyAgICBwYXRocmVsc2UgKCZvbGRfZW50cnlfcGF0aCk7CisgICAgaWYgKHJldHZhbCA9PSBJT19FUlJPUikgeworCXJlaXNlcmZzX3dyaXRlX3VubG9jayhvbGRfZGlyLT5pX3NiKTsKKwlyZXR1cm4gLUVJTzsKKyAgICB9CisKKyAgICBpZiAocmV0dmFsICE9IE5BTUVfRk9VTkQgfHwgb2xkX2RlLmRlX29iamVjdGlkICE9IG9sZF9pbm9kZS0+aV9pbm8pIHsKKwlyZWlzZXJmc193cml0ZV91bmxvY2sob2xkX2Rpci0+aV9zYik7CisJcmV0dXJuIC1FTk9FTlQ7CisgICAgfQorCisgICAgb2xkX2lub2RlX21vZGUgPSBvbGRfaW5vZGUtPmlfbW9kZTsKKyAgICBpZiAoU19JU0RJUihvbGRfaW5vZGVfbW9kZSkpIHsKKwkvLyBtYWtlIHN1cmUsIHRoYXQgZGlyZWN0b3J5IGJlaW5nIHJlbmFtZWQgaGFzIGNvcnJlY3QgIi4uIiAKKwkvLyBhbmQgdGhhdCBpdHMgbmV3IHBhcmVudCBkaXJlY3RvcnkgaGFzIG5vdCB0b28gbWFueSBsaW5rcworCS8vIGFscmVhZHkKKworCWlmIChuZXdfZGVudHJ5X2lub2RlKSB7CisJICAgIGlmICghcmVpc2VyZnNfZW1wdHlfZGlyKG5ld19kZW50cnlfaW5vZGUpKSB7CisJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhvbGRfZGlyLT5pX3NiKTsKKwkJcmV0dXJuIC1FTk9URU1QVFk7CisJICAgIH0KKwl9CisJCisJLyogZGlyZWN0b3J5IGlzIHJlbmFtZWQsIGl0cyBwYXJlbnQgZGlyZWN0b3J5IHdpbGwgYmUgY2hhbmdlZCwgCisJKiogc28gZmluZCAiLi4iIGVudHJ5IAorCSovCisJZG90X2RvdF9kZS5kZV9nZW5fbnVtYmVyX2JpdF9zdHJpbmcgPSBOVUxMOworCXJldHZhbCA9IHJlaXNlcmZzX2ZpbmRfZW50cnkgKG9sZF9pbm9kZSwgIi4uIiwgMiwgJmRvdF9kb3RfZW50cnlfcGF0aCwgJmRvdF9kb3RfZGUpOworCXBhdGhyZWxzZSAoJmRvdF9kb3RfZW50cnlfcGF0aCk7CisJaWYgKHJldHZhbCAhPSBOQU1FX0ZPVU5EKSB7CisJICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhvbGRfZGlyLT5pX3NiKTsKKwkgICAgcmV0dXJuIC1FSU87CisJfQorCisJLyogaW5vZGUgbnVtYmVyIG9mIC4uIG11c3QgZXF1YWwgb2xkX2Rpci0+aV9pbm8gKi8KKwlpZiAoZG90X2RvdF9kZS5kZV9vYmplY3RpZCAhPSBvbGRfZGlyLT5pX2lubykgeworCSAgICByZWlzZXJmc193cml0ZV91bmxvY2sob2xkX2Rpci0+aV9zYik7CisJICAgIHJldHVybiAtRUlPOworCX0KKyAgICB9CisKKyAgICByZXR2YWwgPSBqb3VybmFsX2JlZ2luKCZ0aCwgb2xkX2Rpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7CisgICAgaWYgKHJldHZhbCkgeworICAgICAgICByZWlzZXJmc193cml0ZV91bmxvY2sgKG9sZF9kaXItPmlfc2IpOworICAgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKworICAgIC8qIGFkZCBuZXcgZW50cnkgKG9yIGZpbmQgdGhlIGV4aXN0aW5nIG9uZSkgKi8KKyAgICByZXR2YWwgPSByZWlzZXJmc19hZGRfZW50cnkgKCZ0aCwgbmV3X2RpciwgbmV3X2RlbnRyeS0+ZF9uYW1lLm5hbWUsIG5ld19kZW50cnktPmRfbmFtZS5sZW4sIAorCQkJCSBvbGRfaW5vZGUsIDApOworICAgIGlmIChyZXR2YWwgPT0gLUVFWElTVCkgeworCWlmICghbmV3X2RlbnRyeV9pbm9kZSkgeworCSAgICByZWlzZXJmc19wYW5pYyAob2xkX2Rpci0+aV9zYiwKKwkJCSAgICAidnMtNzA1MDogbmV3IGVudHJ5IGlzIGZvdW5kLCBuZXcgaW5vZGUgPT0gMFxuIik7CisJfQorICAgIH0gZWxzZSBpZiAocmV0dmFsKSB7CisJaW50IGVyciA9IGpvdXJuYWxfZW5kKCZ0aCwgb2xkX2Rpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7CisJcmVpc2VyZnNfd3JpdGVfdW5sb2NrKG9sZF9kaXItPmlfc2IpOworCXJldHVybiBlcnIgPyBlcnIgOiByZXR2YWw7CisgICAgfQorCisgICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKG9sZF9kaXIpIDsKKyAgICByZWlzZXJmc191cGRhdGVfaW5vZGVfdHJhbnNhY3Rpb24obmV3X2RpcikgOworCisgICAgLyogdGhpcyBtYWtlcyBpdCBzbyBhbiBmc3luYyBvbiBhbiBvcGVuIGZkIGZvciB0aGUgb2xkIG5hbWUgd2lsbAorICAgICoqIGNvbW1pdCB0aGUgcmVuYW1lIG9wZXJhdGlvbgorICAgICovCisgICAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKG9sZF9pbm9kZSkgOworCisgICAgaWYgKG5ld19kZW50cnlfaW5vZGUpIAorCXJlaXNlcmZzX3VwZGF0ZV9pbm9kZV90cmFuc2FjdGlvbihuZXdfZGVudHJ5X2lub2RlKSA7CisKKyAgICB3aGlsZSAoMSkgeworCS8vIGxvb2sgZm9yIG9sZCBuYW1lIHVzaW5nIGNvcnJlc3BvbmRpbmcgZW50cnkga2V5IChmb3VuZCBieSByZWlzZXJmc19maW5kX2VudHJ5KQorCWlmICgocmV0dmFsID0gc2VhcmNoX2J5X2VudHJ5X2tleSAobmV3X2Rpci0+aV9zYiwgJm9sZF9kZS5kZV9lbnRyeV9rZXksCisJCQkJCSAgICZvbGRfZW50cnlfcGF0aCwgJm9sZF9kZSkpICE9IE5BTUVfRk9VTkQpIHsKKwkgICAgcGF0aHJlbHNlKCZvbGRfZW50cnlfcGF0aCk7CisJICAgIGpvdXJuYWxfZW5kKCZ0aCwgb2xkX2Rpci0+aV9zYiwgamJlZ2luX2NvdW50KTsKKwkgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKG9sZF9kaXItPmlfc2IpOworCSAgICByZXR1cm4gLUVJTzsKKwl9CisKKwljb3B5X2l0ZW1faGVhZCgmb2xkX2VudHJ5X2loLCBnZXRfaWgoJm9sZF9lbnRyeV9wYXRoKSkgOworCisJcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChvbGRfaW5vZGUtPmlfc2IsIG9sZF9kZS5kZV9iaCwgMSkgOworCisJLy8gbG9vayBmb3IgbmV3IG5hbWUgYnkgcmVpc2VyZnNfZmluZF9lbnRyeQorCW5ld19kZS5kZV9nZW5fbnVtYmVyX2JpdF9zdHJpbmcgPSBOVUxMOworCXJldHZhbCA9IHJlaXNlcmZzX2ZpbmRfZW50cnkgKG5ld19kaXIsIG5ld19kZW50cnktPmRfbmFtZS5uYW1lLCBuZXdfZGVudHJ5LT5kX25hbWUubGVuLCAKKwkJCQkgICAgICAmbmV3X2VudHJ5X3BhdGgsICZuZXdfZGUpOworCS8vIHJlaXNlcmZzX2FkZF9lbnRyeSBzaG91bGQgbm90IHJldHVybiBJT19FUlJPUiwgYmVjYXVzZSBpdCBpcyBjYWxsZWQgd2l0aCBlc3NlbnRpYWxseSBzYW1lIHBhcmFtZXRlcnMgZnJvbQorICAgICAgICAvLyByZWlzZXJmc19hZGRfZW50cnkgYWJvdmUsIGFuZCB3ZSdsbCBjYXRjaCBhbnkgaS9vIGVycm9ycyBiZWZvcmUgd2UgZ2V0IGhlcmUuCisJaWYgKHJldHZhbCAhPSBOQU1FX0ZPVU5EX0lOVklTSUJMRSAmJiByZXR2YWwgIT0gTkFNRV9GT1VORCkgeworCSAgICBwYXRocmVsc2UoJm5ld19lbnRyeV9wYXRoKTsKKwkgICAgcGF0aHJlbHNlKCZvbGRfZW50cnlfcGF0aCk7CisJICAgIGpvdXJuYWxfZW5kKCZ0aCwgb2xkX2Rpci0+aV9zYiwgamJlZ2luX2NvdW50KTsKKwkgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKG9sZF9kaXItPmlfc2IpOworCSAgICByZXR1cm4gLUVJTzsKKwl9CisKKwljb3B5X2l0ZW1faGVhZCgmbmV3X2VudHJ5X2loLCBnZXRfaWgoJm5ld19lbnRyeV9wYXRoKSkgOworCisJcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChvbGRfaW5vZGUtPmlfc2IsIG5ld19kZS5kZV9iaCwgMSkgOworCisJaWYgKFNfSVNESVIob2xkX2lub2RlLT5pX21vZGUpKSB7CisJICAgIGlmICgocmV0dmFsID0gc2VhcmNoX2J5X2VudHJ5X2tleSAobmV3X2Rpci0+aV9zYiwgJmRvdF9kb3RfZGUuZGVfZW50cnlfa2V5LAorCQkJCQkgICAgICAgJmRvdF9kb3RfZW50cnlfcGF0aCwgJmRvdF9kb3RfZGUpKSAhPSBOQU1FX0ZPVU5EKSB7CisJCXBhdGhyZWxzZSgmZG90X2RvdF9lbnRyeV9wYXRoKTsKKwkJcGF0aHJlbHNlKCZuZXdfZW50cnlfcGF0aCk7CisJCXBhdGhyZWxzZSgmb2xkX2VudHJ5X3BhdGgpOworCQlqb3VybmFsX2VuZCgmdGgsIG9sZF9kaXItPmlfc2IsIGpiZWdpbl9jb3VudCk7CisJCXJlaXNlcmZzX3dyaXRlX3VubG9jayhvbGRfZGlyLT5pX3NiKTsKKwkJcmV0dXJuIC1FSU87CisJICAgIH0KKwkgICAgY29weV9pdGVtX2hlYWQoJmRvdF9kb3RfaWgsIGdldF9paCgmZG90X2RvdF9lbnRyeV9wYXRoKSkgOworCSAgICAvLyBub2RlIGNvbnRhaW5pbmcgIi4uIiBnZXRzIGludG8gdHJhbnNhY3Rpb24KKwkgICAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChvbGRfaW5vZGUtPmlfc2IsIGRvdF9kb3RfZGUuZGVfYmgsIDEpIDsKKwl9CisJCQkJLyogd2Ugc2hvdWxkIGNoZWNrIHNlYWxzIGhlcmUsIG5vdCBkbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHN0dWZmLCB5ZXM/IFRoZW4sIGhhdmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYXRoZXJlZCBldmVyeXRoaW5nIGludG8gUkFNIHdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBsb2NrIHRoZSBidWZmZXJzLCB5ZXM/ICAtSGFucyAqLworCQkJCS8qIHByb2JhYmx5LiAgb3VyIHJlbmFtZSBuZWVkcyB0byBob2xkIG1vcmUgCisJCQkJKiogdGhhbiBvbmUgcGF0aCBhdCBvbmNlLiAgVGhlIHNlYWxzIHdvdWxkIAorCQkJCSoqIGhhdmUgdG8gYmUgd3JpdHRlbiB0byBkZWFsIHdpdGggbXVsdGktcGF0aCAKKwkJCQkqKiBpc3N1ZXMgLWNocmlzCisJCQkJKi8KKwkvKiBzYW5pdHkgY2hlY2tpbmcgYmVmb3JlIGRvaW5nIHRoZSByZW5hbWUgLSBhdm9pZCByYWNlcyBtYW55CisJKiogb2YgdGhlIGFib3ZlIGNoZWNrcyBjb3VsZCBoYXZlIHNjaGVkdWxlZC4gIFdlIGhhdmUgdG8gYmUKKwkqKiBzdXJlIG91ciBpdGVtcyBoYXZlbid0IGJlZW4gc2hpZnRlZCBieSBhbm90aGVyIHByb2Nlc3MuCisJKi8KKwlpZiAoaXRlbV9tb3ZlZCgmbmV3X2VudHJ5X2loLCAmbmV3X2VudHJ5X3BhdGgpIHx8CisJICAgICFlbnRyeV9wb2ludHNfdG9fb2JqZWN0KG5ld19kZW50cnktPmRfbmFtZS5uYW1lLCAKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2RlbnRyeS0+ZF9uYW1lLmxlbiwKKwkJCQkgICAgJm5ld19kZSwgbmV3X2RlbnRyeV9pbm9kZSkgfHwKKwkgICAgaXRlbV9tb3ZlZCgmb2xkX2VudHJ5X2loLCAmb2xkX2VudHJ5X3BhdGgpIHx8IAorCSAgICAhZW50cnlfcG9pbnRzX3RvX29iamVjdCAob2xkX2RlbnRyeS0+ZF9uYW1lLm5hbWUsIAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkX2RlbnRyeS0+ZF9uYW1lLmxlbiwKKwkJCQkgICAgICZvbGRfZGUsIG9sZF9pbm9kZSkpIHsKKwkgICAgcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIgKG9sZF9pbm9kZS0+aV9zYiwgbmV3X2RlLmRlX2JoKTsKKwkgICAgcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIgKG9sZF9pbm9kZS0+aV9zYiwgb2xkX2RlLmRlX2JoKTsKKwkgICAgaWYgKFNfSVNESVIob2xkX2lub2RlX21vZGUpKQorCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlciAob2xkX2lub2RlLT5pX3NiLCBkb3RfZG90X2RlLmRlX2JoKTsKKwkgICAgY29udGludWU7CisJfQorCWlmIChTX0lTRElSKG9sZF9pbm9kZV9tb2RlKSkgeworCSAgICBpZiAoIGl0ZW1fbW92ZWQoJmRvdF9kb3RfaWgsICZkb3RfZG90X2VudHJ5X3BhdGgpIHx8CisJCSFlbnRyeV9wb2ludHNfdG9fb2JqZWN0ICggIi4uIiwgMiwgJmRvdF9kb3RfZGUsIG9sZF9kaXIpICkgeworCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlciAob2xkX2lub2RlLT5pX3NiLCBvbGRfZGUuZGVfYmgpOworCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlciAob2xkX2lub2RlLT5pX3NiLCBuZXdfZGUuZGVfYmgpOworCQlyZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlciAob2xkX2lub2RlLT5pX3NiLCBkb3RfZG90X2RlLmRlX2JoKTsKKwkJY29udGludWU7CisJICAgIH0KKwl9CisKKwlSRkFMU0UoIFNfSVNESVIob2xkX2lub2RlX21vZGUpICYmIAorCQkgIWJ1ZmZlcl9qb3VybmFsX3ByZXBhcmVkKGRvdF9kb3RfZGUuZGVfYmgpLCAiIiApOworCisJYnJlYWs7CisgICAgfQorCisgICAgLyogb2ssIGFsbCB0aGUgY2hhbmdlcyBjYW4gYmUgZG9uZSBpbiBvbmUgZmVsbCBzd29vcCB3aGVuIHdlCisgICAgICAgaGF2ZSBjbGFpbWVkIGFsbCB0aGUgYnVmZmVycyBuZWVkZWQuKi8KKyAgICAKKyAgICBtYXJrX2RlX3Zpc2libGUgKG5ld19kZS5kZV9kZWggKyBuZXdfZGUuZGVfZW50cnlfbnVtKTsKKyAgICBzZXRfaW5vX2luX2Rpcl9lbnRyeSAoJm5ld19kZSwgSU5PREVfUEtFWSAob2xkX2lub2RlKSk7CisgICAgam91cm5hbF9tYXJrX2RpcnR5ICgmdGgsIG9sZF9kaXItPmlfc2IsIG5ld19kZS5kZV9iaCk7CisKKyAgICBtYXJrX2RlX2hpZGRlbiAob2xkX2RlLmRlX2RlaCArIG9sZF9kZS5kZV9lbnRyeV9udW0pOworICAgIGpvdXJuYWxfbWFya19kaXJ0eSAoJnRoLCBvbGRfZGlyLT5pX3NiLCBvbGRfZGUuZGVfYmgpOworICAgIGN0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKyAgICBvbGRfZGlyLT5pX2N0aW1lID0gb2xkX2Rpci0+aV9tdGltZSA9IGN0aW1lOworICAgIG5ld19kaXItPmlfY3RpbWUgPSBuZXdfZGlyLT5pX210aW1lID0gY3RpbWU7CisgICAgLyogdGhhbmtzIHRvIEFsZXggQWRyaWFhbnNlIDxhbGV4X2FAY2FsdGVjaC5lZHU+IGZvciBwYXRjaCB3aGljaCBhZGRzIGN0aW1lIHVwZGF0ZSBvZgorICAgICAgIHJlbmFtZWQgb2JqZWN0ICovCisgICAgb2xkX2lub2RlLT5pX2N0aW1lID0gY3RpbWU7CisKKyAgICBpZiAobmV3X2RlbnRyeV9pbm9kZSkgeworCS8vIGFkanVzdCBsaW5rIG51bWJlciBvZiB0aGUgdmljdGltCisJaWYgKFNfSVNESVIobmV3X2RlbnRyeV9pbm9kZS0+aV9tb2RlKSkgeworCSAgICBuZXdfZGVudHJ5X2lub2RlLT5pX25saW5rICA9IDA7CisJfSBlbHNlIHsKKwkgICAgbmV3X2RlbnRyeV9pbm9kZS0+aV9ubGluay0tOworCX0KKwluZXdfZGVudHJ5X2lub2RlLT5pX2N0aW1lID0gY3RpbWU7CisJc2F2ZWxpbmsgPSBuZXdfZGVudHJ5X2lub2RlLT5pX25saW5rOworICAgIH0KKworICAgIGlmIChTX0lTRElSKG9sZF9pbm9kZV9tb2RlKSkgeworCS8vIGFkanVzdCAiLi4iIG9mIHJlbmFtZWQgZGlyZWN0b3J5IAorCXNldF9pbm9faW5fZGlyX2VudHJ5ICgmZG90X2RvdF9kZSwgSU5PREVfUEtFWSAobmV3X2RpcikpOworCWpvdXJuYWxfbWFya19kaXJ0eSAoJnRoLCBuZXdfZGlyLT5pX3NiLCBkb3RfZG90X2RlLmRlX2JoKTsKKwkKKyAgICAgICAgaWYgKCFuZXdfZGVudHJ5X2lub2RlKQorCSAgICAvKiB0aGVyZSAoaW4gbmV3X2Rpcikgd2FzIG5vIGRpcmVjdG9yeSwgc28gaXQgZ290IG5ldyBsaW5rCisJICAgICAgICgiLi4iICBvZiByZW5hbWVkIGRpcmVjdG9yeSkgKi8KKwkgICAgSU5DX0RJUl9JTk9ERV9OTElOSyhuZXdfZGlyKTsKKwkJCisJLyogb2xkIGRpcmVjdG9yeSBsb3N0IG9uZSBsaW5rIC0gIi4uICIgb2YgcmVuYW1lZCBkaXJlY3RvcnkgKi8KKwlERUNfRElSX0lOT0RFX05MSU5LKG9sZF9kaXIpOworICAgIH0KKworICAgIC8vIGxvb2tzIGxpa2UgaW4gMi4zLjk5cHJlMyBicmVsc2UgaXMgYXRvbWljLiBzbyB3ZSBjYW4gdXNlIHBhdGhyZWxzZQorICAgIHBhdGhyZWxzZSAoJm5ld19lbnRyeV9wYXRoKTsKKyAgICBwYXRocmVsc2UgKCZkb3RfZG90X2VudHJ5X3BhdGgpOworCisgICAgLy8gRklYTUU6IHRoaXMgcmVpc2VyZnNfY3V0X2Zyb21faXRlbSdzIHJldHVybiB2YWx1ZSBtYXkgc2NyZXcgdXAKKyAgICAvLyBhbnlib2R5LCBidXQgaXQgd2lsbCBwYW5pYyBpZiB3aWxsIG5vdCBiZSBhYmxlIHRvIGZpbmQgdGhlCisgICAgLy8gZW50cnkuIFRoaXMgbmVlZHMgb25lIG1vcmUgY2xlYW4gdXAKKyAgICBpZiAocmVpc2VyZnNfY3V0X2Zyb21faXRlbSAoJnRoLCAmb2xkX2VudHJ5X3BhdGgsICYob2xkX2RlLmRlX2VudHJ5X2tleSksIG9sZF9kaXIsIE5VTEwsIDApIDwgMCkKKwlyZWlzZXJmc193YXJuaW5nIChvbGRfZGlyLT5pX3NiLCAidnMtNzA2MDogcmVpc2VyZnNfcmVuYW1lOiBjb3VsZG4ndCBub3QgY3V0IG9sZCBuYW1lLiBGc2NrIGxhdGVyPyIpOworCisgICAgb2xkX2Rpci0+aV9zaXplIC09IERFSF9TSVpFICsgb2xkX2RlLmRlX2VudHJ5bGVuOworCisgICAgcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIG9sZF9kaXIpOworICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCAoJnRoLCBuZXdfZGlyKTsKKyAgICByZWlzZXJmc191cGRhdGVfc2QgKCZ0aCwgb2xkX2lub2RlKTsKKworICAgIGlmIChuZXdfZGVudHJ5X2lub2RlKSB7CisJaWYgKHNhdmVsaW5rID09IDApCisJICAgIGFkZF9zYXZlX2xpbmsgKCZ0aCwgbmV3X2RlbnRyeV9pbm9kZSwgMC8qIG5vdCB0cnVuY2F0ZSAqLyk7CisJcmVpc2VyZnNfdXBkYXRlX3NkICgmdGgsIG5ld19kZW50cnlfaW5vZGUpOworICAgIH0KKworICAgIHJldHZhbCA9IGpvdXJuYWxfZW5kKCZ0aCwgb2xkX2Rpci0+aV9zYiwgamJlZ2luX2NvdW50KSA7CisgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKG9sZF9kaXItPmlfc2IpOworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBkaXJlY3RvcmllcyBjYW4gaGFuZGxlIG1vc3Qgb3BlcmF0aW9ucy4uLgorICovCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyByZWlzZXJmc19kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKyAgLy8mcmVpc2VyZnNfZGlyX29wZXJhdGlvbnMsCS8qIGRlZmF1bHRfZmlsZV9vcHMgKi8KKyAgICAuY3JlYXRlCT0gcmVpc2VyZnNfY3JlYXRlLAorICAgIC5sb29rdXAJPSByZWlzZXJmc19sb29rdXAsCisgICAgLmxpbmsJPSByZWlzZXJmc19saW5rLAorICAgIC51bmxpbmsJPSByZWlzZXJmc191bmxpbmssCisgICAgLnN5bWxpbmsJPSByZWlzZXJmc19zeW1saW5rLAorICAgIC5ta2Rpcgk9IHJlaXNlcmZzX21rZGlyLAorICAgIC5ybWRpcgk9IHJlaXNlcmZzX3JtZGlyLAorICAgIC5ta25vZAk9IHJlaXNlcmZzX21rbm9kLAorICAgIC5yZW5hbWUJPSByZWlzZXJmc19yZW5hbWUsCisgICAgLnNldGF0dHIgICAgPSByZWlzZXJmc19zZXRhdHRyLAorICAgIC5zZXR4YXR0ciAgID0gcmVpc2VyZnNfc2V0eGF0dHIsCisgICAgLmdldHhhdHRyICAgPSByZWlzZXJmc19nZXR4YXR0ciwKKyAgICAubGlzdHhhdHRyICA9IHJlaXNlcmZzX2xpc3R4YXR0ciwKKyAgICAucmVtb3ZleGF0dHIgPSByZWlzZXJmc19yZW1vdmV4YXR0ciwKKyAgICAucGVybWlzc2lvbiAgICAgPSByZWlzZXJmc19wZXJtaXNzaW9uLAorfTsKKworLyoKKyAqIHN5bWxpbmsgb3BlcmF0aW9ucy4uIHNhbWUgYXMgcGFnZV9zeW1saW5rX2lub2RlX29wZXJhdGlvbnMsIHdpdGggeGF0dHIKKyAqIHN0dWZmIGFkZGVkCisgKi8KK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHJlaXNlcmZzX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKyAgICAucmVhZGxpbmsgICAgICAgPSBnZW5lcmljX3JlYWRsaW5rLAorICAgIC5mb2xsb3dfbGluayAgICA9IHBhZ2VfZm9sbG93X2xpbmtfbGlnaHQsCisgICAgLnB1dF9saW5rICAgICAgID0gcGFnZV9wdXRfbGluaywKKyAgICAuc2V0YXR0ciAgICAgICAgPSByZWlzZXJmc19zZXRhdHRyLAorICAgIC5zZXR4YXR0ciAgICAgICA9IHJlaXNlcmZzX3NldHhhdHRyLAorICAgIC5nZXR4YXR0ciAgICAgICA9IHJlaXNlcmZzX2dldHhhdHRyLAorICAgIC5saXN0eGF0dHIgICAgICA9IHJlaXNlcmZzX2xpc3R4YXR0ciwKKyAgICAucmVtb3ZleGF0dHIgICAgPSByZWlzZXJmc19yZW1vdmV4YXR0ciwKKyAgICAucGVybWlzc2lvbiAgICAgPSByZWlzZXJmc19wZXJtaXNzaW9uLAorCit9OworCisKKy8qCisgKiBzcGVjaWFsIGZpbGUgb3BlcmF0aW9ucy4uIGp1c3QgeGF0dHIvYWNsIHN0dWZmCisgKi8KK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHJlaXNlcmZzX3NwZWNpYWxfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKyAgICAuc2V0YXR0ciAgICAgICAgPSByZWlzZXJmc19zZXRhdHRyLAorICAgIC5zZXR4YXR0ciAgICAgICA9IHJlaXNlcmZzX3NldHhhdHRyLAorICAgIC5nZXR4YXR0ciAgICAgICA9IHJlaXNlcmZzX2dldHhhdHRyLAorICAgIC5saXN0eGF0dHIgICAgICA9IHJlaXNlcmZzX2xpc3R4YXR0ciwKKyAgICAucmVtb3ZleGF0dHIgICAgPSByZWlzZXJmc19yZW1vdmV4YXR0ciwKKyAgICAucGVybWlzc2lvbiAgICAgPSByZWlzZXJmc19wZXJtaXNzaW9uLAorCit9OwpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvb2JqZWN0aWQuYyBiL2ZzL3JlaXNlcmZzL29iamVjdGlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc4NWM0MwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3JlaXNlcmZzL29iamVjdGlkLmMKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMCBieSBIYW5zIFJlaXNlciwgbGljZW5zaW5nIGdvdmVybmVkIGJ5IHJlaXNlcmZzL1JFQURNRQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc19mc19zYi5oPgorCisvLyBmaW5kIHdoZXJlIG9iamVjdGlkIG1hcCBzdGFydHMKKyNkZWZpbmUgb2JqZWN0aWRfbWFwKHMscnMpIChvbGRfZm9ybWF0X29ubHkgKHMpID8gXAorICAgICAgICAgICAgICAgICAgICAgICAgIChfX3UzMiAqKSgoc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrX3YxICopKHJzKSArIDEpIDpcCisJCQkgKF9fdTMyICopKChycykgKyAxKSkKKworCisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisKK3N0YXRpYyB2b2lkIGNoZWNrX29iamVjdGlkX21hcCAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgX191MzIgKiBtYXApCit7CisgICAgaWYgKGxlMzJfdG9fY3B1IChtYXBbMF0pICE9IDEpCisJcmVpc2VyZnNfcGFuaWMgKHMsICJ2cy0xNTAxMDogY2hlY2tfb2JqZWN0aWRfbWFwOiBtYXAgY29ycnVwdGVkOiAlbHgiLAorCQkJKCBsb25nIHVuc2lnbmVkIGludCApIGxlMzJfdG9fY3B1IChtYXBbMF0pKTsKKworICAgIC8vIEZJWE1FOiBhZGQgc29tZXRoaW5nIGVsc2UgaGVyZQorfQorCisjZWxzZQorc3RhdGljIHZvaWQgY2hlY2tfb2JqZWN0aWRfbWFwIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLCBfX3UzMiAqIG1hcCkKK3s7fQorI2VuZGlmCisKKworLyogV2hlbiB3ZSBhbGxvY2F0ZSBvYmplY3RpZHMgd2UgYWxsb2NhdGUgdGhlIGZpcnN0IHVudXNlZCBvYmplY3RpZC4KKyAgIEVhY2ggc2VxdWVuY2Ugb2Ygb2JqZWN0aWRzIGluIHVzZSAodGhlIG9kZCBzZXF1ZW5jZXMpIGlzIGZvbGxvd2VkCisgICBieSBhIHNlcXVlbmNlIG9mIG9iamVjdGlkcyBub3QgaW4gdXNlICh0aGUgZXZlbiBzZXF1ZW5jZXMpLiAgV2UKKyAgIG9ubHkgbmVlZCB0byByZWNvcmQgdGhlIGxhc3Qgb2JqZWN0aWQgaW4gZWFjaCBvZiB0aGVzZSBzZXF1ZW5jZXMKKyAgIChib3RoIHRoZSBvZGQgYW5kIGV2ZW4gc2VxdWVuY2VzKSBpbiBvcmRlciB0byBmdWxseSBkZWZpbmUgdGhlCisgICBib3VuZGFyaWVzIG9mIHRoZSBzZXF1ZW5jZXMuICBBIGNvbnNlcXVlbmNlIG9mIGFsbG9jYXRpbmcgdGhlIGZpcnN0CisgICBvYmplY3RpZCBub3QgaW4gdXNlIGlzIHRoYXQgdW5kZXIgbW9zdCBjb25kaXRpb25zIHRoaXMgc2NoZW1lIGlzCisgICBleHRyZW1lbHkgY29tcGFjdC4gIFRoZSBleGNlcHRpb24gaXMgaW1tZWRpYXRlbHkgYWZ0ZXIgYSBzZXF1ZW5jZQorICAgb2Ygb3BlcmF0aW9ucyB3aGljaCBkZWxldGVzIGEgbGFyZ2UgbnVtYmVyIG9mIG9iamVjdHMgb2YKKyAgIG5vbi1zZXF1ZW50aWFsIG9iamVjdGlkcywgYW5kIGV2ZW4gdGhlbiBpdCB3aWxsIGJlY29tZSBjb21wYWN0CisgICBhZ2FpbiBhcyBzb29uIGFzIG1vcmUgb2JqZWN0cyBhcmUgY3JlYXRlZC4gIE5vdGUgdGhhdCBtYW55CisgICBpbnRlcmVzdGluZyBvcHRpbWl6YXRpb25zIG9mIGxheW91dCBjb3VsZCByZXN1bHQgZnJvbSBjb21wbGljYXRpbmcKKyAgIG9iamVjdGlkIGFzc2lnbm1lbnQsIGJ1dCB3ZSBoYXZlIGRlZmVycmVkIG1ha2luZyB0aGVtIGZvciBub3cuICovCisKKworLyogZ2V0IHVuaXF1ZSBvYmplY3QgaWRlbnRpZmllciAqLworX191MzIgcmVpc2VyZnNfZ2V0X3VudXNlZF9vYmplY3RpZCAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgpCit7CisgICAgc3RydWN0IHN1cGVyX2Jsb2NrICogcyA9IHRoLT50X3N1cGVyOworICAgIHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqIHJzID0gU0JfRElTS19TVVBFUl9CTE9DSyAocyk7CisgICAgX191MzIgKiBtYXAgPSBvYmplY3RpZF9tYXAgKHMsIHJzKTsKKyAgICBfX3UzMiB1bnVzZWRfb2JqZWN0aWQ7CisKKyAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisKKyAgICBjaGVja19vYmplY3RpZF9tYXAgKHMsIG1hcCk7CisKKyAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpLCAxKSA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbW1lbnQgbmVlZGVkIC1IYW5zICovCisgICAgdW51c2VkX29iamVjdGlkID0gbGUzMl90b19jcHUgKG1hcFsxXSk7CisgICAgaWYgKHVudXNlZF9vYmplY3RpZCA9PSBVMzJfTUFYKSB7CisJcmVpc2VyZnNfd2FybmluZyAocywgIiVzOiBubyBtb3JlIG9iamVjdCBpZHMiLCBfX0ZVTkNUSU9OX18pOworCXJlaXNlcmZzX3Jlc3RvcmVfcHJlcGFyZWRfYnVmZmVyKHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpKSA7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogVGhpcyBpbmNyZW1lbnRhdGlvbiBhbGxvY2F0ZXMgdGhlIGZpcnN0IHVudXNlZCBvYmplY3RpZC4gVGhhdAorICAgICAgIGlzIHRvIHNheSwgdGhlIGZpcnN0IGVudHJ5IG9uIHRoZSBvYmplY3RpZCBtYXAgaXMgdGhlIGZpcnN0CisgICAgICAgdW51c2VkIG9iamVjdGlkLCBhbmQgYnkgaW5jcmVtZW50aW5nIGl0IHdlIHVzZSBpdC4gIFNlZSBiZWxvdworICAgICAgIHdoZXJlIHdlIGNoZWNrIHRvIHNlZSBpZiB3ZSBlbGltaW5hdGVkIGEgc2VxdWVuY2Ugb2YgdW51c2VkCisgICAgICAgb2JqZWN0aWRzLi4uLiAqLworICAgIG1hcFsxXSA9IGNwdV90b19sZTMyICh1bnVzZWRfb2JqZWN0aWQgKyAxKTsKKworICAgIC8qIE5vdyB3ZSBjaGVjayB0byBzZWUgaWYgd2UgZWxpbWluYXRlZCB0aGUgbGFzdCByZW1haW5pbmcgbWVtYmVyIG9mCisgICAgICAgdGhlIGZpcnN0IGV2ZW4gc2VxdWVuY2UgKGFuZCBjYW4gZWxpbWluYXRlIHRoZSBzZXF1ZW5jZSBieQorICAgICAgIGVsaW1pbmF0aW5nIGl0cyBsYXN0IG9iamVjdGlkIGZyb20gb2lkcyksIGFuZCBjYW4gY29sbGFwc2UgdGhlCisgICAgICAgZmlyc3QgdHdvIG9kZCBzZXF1ZW5jZXMgaW50byBvbmUgc2VxdWVuY2UuICBJZiBzbywgdGhlbiB0aGUgbmV0CisgICAgICAgcmVzdWx0IGlzIHRvIGVsaW1pbmF0ZSBhIHBhaXIgb2Ygb2JqZWN0aWRzIGZyb20gb2lkcy4gIFdlIGRvIHRoaXMKKyAgICAgICBieSBzaGlmdGluZyB0aGUgZW50aXJlIG1hcCB0byB0aGUgbGVmdC4gKi8KKyAgICBpZiAoc2Jfb2lkX2N1cnNpemUocnMpID4gMiAmJiBtYXBbMV0gPT0gbWFwWzJdKSB7CisJbWVtbW92ZSAobWFwICsgMSwgbWFwICsgMywgKHNiX29pZF9jdXJzaXplKHJzKSAtIDMpICogc2l6ZW9mKF9fdTMyKSk7CisgICAgICAgIHNldF9zYl9vaWRfY3Vyc2l6ZSggcnMsIHNiX29pZF9jdXJzaXplKHJzKSAtIDIgKTsKKyAgICB9CisKKyAgICBqb3VybmFsX21hcmtfZGlydHkodGgsIHMsIFNCX0JVRkZFUl9XSVRIX1NCIChzKSk7CisgICAgcmV0dXJuIHVudXNlZF9vYmplY3RpZDsKK30KKworCisvKiBtYWtlcyBvYmplY3QgaWRlbnRpZmllciB1bnVzZWQgKi8KK3ZvaWQgcmVpc2VyZnNfcmVsZWFzZV9vYmplY3RpZCAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIAorCQkJCV9fdTMyIG9iamVjdGlkX3RvX3JlbGVhc2UpCit7CisgICAgc3RydWN0IHN1cGVyX2Jsb2NrICogcyA9IHRoLT50X3N1cGVyOworICAgIHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqIHJzID0gU0JfRElTS19TVVBFUl9CTE9DSyAocyk7CisgICAgX191MzIgKiBtYXAgPSBvYmplY3RpZF9tYXAgKHMsIHJzKTsKKyAgICBpbnQgaSA9IDA7CisKKyAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisgICAgLy9yZXR1cm47CisgICAgY2hlY2tfb2JqZWN0aWRfbWFwIChzLCBtYXApOworCisgICAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSwgMSkgOworICAgIGpvdXJuYWxfbWFya19kaXJ0eSh0aCwgcywgU0JfQlVGRkVSX1dJVEhfU0IgKHMpKTsgCisKKyAgICAvKiBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvYmplY3RpZCBtYXAgKGkgPSAwKSBhbmQgZ28gdG8KKyAgICAgICB0aGUgZW5kIG9mIGl0IChpID0gZGlza19zYi0+c19vaWRfY3Vyc2l6ZSkuICBMaW5lYXIgc2VhcmNoIGlzCisgICAgICAgd2hhdCB3ZSB1c2UsIHRob3VnaCBpdCBpcyBwb3NzaWJsZSB0aGF0IGJpbmFyeSBzZWFyY2ggd291bGQgYmUKKyAgICAgICBtb3JlIGVmZmljaWVudCBhZnRlciBwZXJmb3JtaW5nIGxvdHMgb2YgZGVsZXRpb25zICh3aGljaCBpcworICAgICAgIHdoZW4gb2lkcyBpcyBsYXJnZS4pICBXZSBvbmx5IGNoZWNrIGV2ZW4gaSdzLiAqLworICAgIHdoaWxlIChpIDwgc2Jfb2lkX2N1cnNpemUocnMpKSB7CisJaWYgKG9iamVjdGlkX3RvX3JlbGVhc2UgPT0gbGUzMl90b19jcHUgKG1hcFtpXSkpIHsKKwkgICAgLyogVGhpcyBpbmNyZW1lbnRhdGlvbiB1bmFsbG9jYXRlcyB0aGUgb2JqZWN0aWQuICovCisJICAgIC8vbWFwW2ldKys7CisJICAgIG1hcFtpXSA9IGNwdV90b19sZTMyIChsZTMyX3RvX2NwdSAobWFwW2ldKSArIDEpOworCisJICAgIC8qIERpZCB3ZSB1bmFsbG9jYXRlIHRoZSBsYXN0IG1lbWJlciBvZiBhbiBvZGQgc2VxdWVuY2UsIGFuZCBjYW4gc2hyaW5rIG9pZHM/ICovCisJICAgIGlmIChtYXBbaV0gPT0gbWFwW2krMV0pIHsKKwkJLyogc2hyaW5rIG9iamVjdGlkIG1hcCAqLworCQltZW1tb3ZlIChtYXAgKyBpLCBtYXAgKyBpICsgMiwgCisJCQkgKHNiX29pZF9jdXJzaXplKHJzKSAtIGkgLSAyKSAqIHNpemVvZiAoX191MzIpKTsKKwkJLy9kaXNrX3NiLT5zX29pZF9jdXJzaXplIC09IDI7CisgICAgICAgICAgICAgICAgc2V0X3NiX29pZF9jdXJzaXplKCBycywgc2Jfb2lkX2N1cnNpemUocnMpIC0gMiApOworCisJCVJGQUxTRSggc2Jfb2lkX2N1cnNpemUocnMpIDwgMiB8fCAKKwkJICAgICAgICBzYl9vaWRfY3Vyc2l6ZShycykgPiBzYl9vaWRfbWF4c2l6ZShycyksCisJCSAgICAgICAgInZzLTE1MDA1OiBvYmplY3RpZCBtYXAgY29ycnVwdGVkIGN1cl9zaXplID09ICVkIChtYXggPT0gJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiX29pZF9jdXJzaXplKHJzKSwgc2Jfb2lkX21heHNpemUocnMpKTsKKwkgICAgfQorCSAgICByZXR1cm47CisJfQorCisJaWYgKG9iamVjdGlkX3RvX3JlbGVhc2UgPiBsZTMyX3RvX2NwdSAobWFwW2ldKSAmJiAKKwkgICAgb2JqZWN0aWRfdG9fcmVsZWFzZSA8IGxlMzJfdG9fY3B1IChtYXBbaSArIDFdKSkgeworCSAgICAvKiBzaXplIG9mIG9iamVjdGlkIG1hcCBpcyBub3QgY2hhbmdlZCAqLworCSAgICBpZiAob2JqZWN0aWRfdG9fcmVsZWFzZSArIDEgPT0gbGUzMl90b19jcHUgKG1hcFtpICsgMV0pKSB7CisJCS8vb2JqZWN0aWRfbWFwW2krMV0tLTsKKwkJbWFwW2kgKyAxXSA9IGNwdV90b19sZTMyIChsZTMyX3RvX2NwdSAobWFwW2kgKyAxXSkgLSAxKTsKKwkJcmV0dXJuOworCSAgICB9CisKKyAgICAgICAgICAgIC8qIEpETSBjb21wYXJpbmcgdHdvIGxpdHRsZS1lbmRpYW4gdmFsdWVzIGZvciBlcXVhbGl0eSAtLSBzYWZlICovCisJaWYgKHNiX29pZF9jdXJzaXplKHJzKSA9PSBzYl9vaWRfbWF4c2l6ZShycykpIHsKKwkJLyogb2JqZWN0aWQgbWFwIG11c3QgYmUgZXhwYW5kZWQsIGJ1dCB0aGVyZSBpcyBubyBzcGFjZSAqLworCQlQUk9DX0lORk9fSU5DKCBzLCBsZWFrZWRfb2lkICk7CisJCXJldHVybjsKKwl9CisKKwkgICAgLyogZXhwYW5kIHRoZSBvYmplY3RpZCBtYXAqLworCSAgICBtZW1tb3ZlIChtYXAgKyBpICsgMywgbWFwICsgaSArIDEsIAorCQkgICAgIChzYl9vaWRfY3Vyc2l6ZShycykgLSBpIC0gMSkgKiBzaXplb2YoX191MzIpKTsKKwkgICAgbWFwW2kgKyAxXSA9IGNwdV90b19sZTMyIChvYmplY3RpZF90b19yZWxlYXNlKTsKKwkgICAgbWFwW2kgKyAyXSA9IGNwdV90b19sZTMyIChvYmplY3RpZF90b19yZWxlYXNlICsgMSk7CisgICAgICAgICAgICBzZXRfc2Jfb2lkX2N1cnNpemUoIHJzLCBzYl9vaWRfY3Vyc2l6ZShycykgKyAyICk7CisJICAgIHJldHVybjsKKwl9CisJaSArPSAyOworICAgIH0KKworICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJ2cy0xNTAxMTogcmVpc2VyZnNfcmVsZWFzZV9vYmplY3RpZDogdHJpZWQgdG8gZnJlZSBmcmVlIG9iamVjdCBpZCAoJWx1KSIsCisJCSAgICAgICggbG9uZyB1bnNpZ25lZCApIG9iamVjdGlkX3RvX3JlbGVhc2UpOworfQorCisKK2ludCByZWlzZXJmc19jb252ZXJ0X29iamVjdGlkX21hcF92MShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpIHsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKmRpc2tfc2IgPSBTQl9ESVNLX1NVUEVSX0JMT0NLIChzKTsKKyAgICBpbnQgY3VyX3NpemUgPSBzYl9vaWRfY3Vyc2l6ZShkaXNrX3NiKTsKKyAgICBpbnQgbmV3X3NpemUgPSAocy0+c19ibG9ja3NpemUgLSBTQl9TSVpFKSAvIHNpemVvZihfX3UzMikgLyAyICogMiA7CisgICAgaW50IG9sZF9tYXggPSBzYl9vaWRfbWF4c2l6ZShkaXNrX3NiKTsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2tfdjEgKmRpc2tfc2JfdjEgOworICAgIF9fdTMyICpvYmplY3RpZF9tYXAsICpuZXdfb2JqZWN0aWRfbWFwIDsKKyAgICBpbnQgaSA7CisKKyAgICBkaXNrX3NiX3YxPShzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2tfdjEgKikoU0JfQlVGRkVSX1dJVEhfU0IocyktPmJfZGF0YSk7CisgICAgb2JqZWN0aWRfbWFwID0gKF9fdTMyICopKGRpc2tfc2JfdjEgKyAxKSA7CisgICAgbmV3X29iamVjdGlkX21hcCA9IChfX3UzMiAqKShkaXNrX3NiICsgMSkgOworCisgICAgaWYgKGN1cl9zaXplID4gbmV3X3NpemUpIHsKKwkvKiBtYXJrIGV2ZXJ5b25lIHVzZWQgdGhhdCB3YXMgbGlzdGVkIGFzIGZyZWUgYXQgdGhlIGVuZCBvZiB0aGUgb2JqZWN0aWQKKwkqKiBtYXAgCisJKi8KKwlvYmplY3RpZF9tYXBbbmV3X3NpemUgLSAxXSA9IG9iamVjdGlkX21hcFtjdXJfc2l6ZSAtIDFdIDsKKwlzZXRfc2Jfb2lkX2N1cnNpemUoZGlza19zYixuZXdfc2l6ZSkgOworICAgIH0KKyAgICAvKiBtb3ZlIHRoZSBzbWFsbGVyIG9iamVjdGlkIG1hcCBwYXN0IHRoZSBlbmQgb2YgdGhlIG5ldyBzdXBlciAqLworICAgIGZvciAoaSA9IG5ld19zaXplIC0gMSA7IGkgPj0gMCA7IGktLSkgeworICAgICAgICBvYmplY3RpZF9tYXBbaSArIChvbGRfbWF4IC0gbmV3X3NpemUpXSA9IG9iamVjdGlkX21hcFtpXSA7IAorICAgIH0KKworCisgICAgLyogc2V0IHRoZSBtYXggc2l6ZSBzbyB3ZSBkb24ndCBvdmVyZmxvdyBsYXRlciAqLworICAgIHNldF9zYl9vaWRfbWF4c2l6ZShkaXNrX3NiLG5ld19zaXplKSA7CisKKyAgICAvKiBaZXJvIG91dCBsYWJlbCBhbmQgZ2VuZXJhdGUgcmFuZG9tIFVVSUQgKi8KKyAgICBtZW1zZXQoZGlza19zYi0+c19sYWJlbCwgMCwgc2l6ZW9mKGRpc2tfc2ItPnNfbGFiZWwpKSA7CisgICAgZ2VuZXJhdGVfcmFuZG9tX3V1aWQoZGlza19zYi0+c191dWlkKTsKKworICAgIC8qIGZpbmFsbHksIHplcm8gb3V0IHRoZSB1bnVzZWQgY2h1bmsgb2YgdGhlIG5ldyBzdXBlciAqLworICAgIG1lbXNldChkaXNrX3NiLT5zX3VudXNlZCwgMCwgc2l6ZW9mKGRpc2tfc2ItPnNfdW51c2VkKSkgOworICAgIHJldHVybiAwIDsKK30KKwpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMvcHJpbnRzLmMgYi9mcy9yZWlzZXJmcy9wcmludHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmZkY2ExCi0tLSAvZGV2L251bGwKKysrIGIvZnMvcmVpc2VyZnMvcHJpbnRzLmMKQEAgLTAsMCArMSw3MjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMCBieSBIYW5zIFJlaXNlciwgbGljZW5zaW5nIGdvdmVybmVkIGJ5IHJlaXNlcmZzL1JFQURNRQorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworc3RhdGljIGNoYXIgZXJyb3JfYnVmWzEwMjRdOworc3RhdGljIGNoYXIgZm10X2J1ZlsxMDI0XTsKK3N0YXRpYyBjaGFyIG9mZl9idWZbODBdOworCisKK3N0YXRpYyBjaGFyICogcmVpc2VyZnNfY3B1X29mZnNldCAoc3RydWN0IGNwdV9rZXkgKiBrZXkpCit7CisgIGlmIChjcHVfa2V5X2tfdHlwZShrZXkpID09IFRZUEVfRElSRU5UUlkpCisgICAgc3ByaW50ZiAob2ZmX2J1ZiwgIiVMdSglTHUpIiwgCisJICAgICAodW5zaWduZWQgbG9uZyBsb25nKUdFVF9IQVNIX1ZBTFVFIChjcHVfa2V5X2tfb2Zmc2V0IChrZXkpKSwKKwkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpR0VUX0dFTkVSQVRJT05fTlVNQkVSIChjcHVfa2V5X2tfb2Zmc2V0IChrZXkpKSk7CisgIGVsc2UKKyAgICBzcHJpbnRmIChvZmZfYnVmLCAiMHglTHgiLCAodW5zaWduZWQgbG9uZyBsb25nKWNwdV9rZXlfa19vZmZzZXQgKGtleSkpOworICByZXR1cm4gb2ZmX2J1ZjsKK30KKworCitzdGF0aWMgY2hhciAqIGxlX29mZnNldCAoc3RydWN0IHJlaXNlcmZzX2tleSAqIGtleSkKK3sKKyAgaW50IHZlcnNpb247CisKKyAgdmVyc2lvbiA9IGxlX2tleV92ZXJzaW9uIChrZXkpOworICBpZiAobGVfa2V5X2tfdHlwZSAodmVyc2lvbiwga2V5KSA9PSBUWVBFX0RJUkVOVFJZKQorICAgIHNwcmludGYgKG9mZl9idWYsICIlTHUoJUx1KSIsIAorCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylHRVRfSEFTSF9WQUxVRSAobGVfa2V5X2tfb2Zmc2V0ICh2ZXJzaW9uLCBrZXkpKSwKKwkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpR0VUX0dFTkVSQVRJT05fTlVNQkVSIChsZV9rZXlfa19vZmZzZXQgKHZlcnNpb24sIGtleSkpKTsKKyAgZWxzZQorICAgIHNwcmludGYgKG9mZl9idWYsICIweCVMeCIsICh1bnNpZ25lZCBsb25nIGxvbmcpbGVfa2V5X2tfb2Zmc2V0ICh2ZXJzaW9uLCBrZXkpKTsKKyAgcmV0dXJuIG9mZl9idWY7Cit9CisKKworc3RhdGljIGNoYXIgKiBjcHVfdHlwZSAoc3RydWN0IGNwdV9rZXkgKiBrZXkpCit7CisgICAgaWYgKGNwdV9rZXlfa190eXBlIChrZXkpID09IFRZUEVfU1RBVF9EQVRBKQorCXJldHVybiAiU0QiOworICAgIGlmIChjcHVfa2V5X2tfdHlwZSAoa2V5KSA9PSBUWVBFX0RJUkVOVFJZKQorCXJldHVybiAiRElSIjsKKyAgICBpZiAoY3B1X2tleV9rX3R5cGUgKGtleSkgPT0gVFlQRV9ESVJFQ1QpCisJcmV0dXJuICJESVJFQ1QiOworICAgIGlmIChjcHVfa2V5X2tfdHlwZSAoa2V5KSA9PSBUWVBFX0lORElSRUNUKQorCXJldHVybiAiSU5EIjsKKyAgICByZXR1cm4gIlVOS05PV04iOworfQorCisKK3N0YXRpYyBjaGFyICogbGVfdHlwZSAoc3RydWN0IHJlaXNlcmZzX2tleSAqIGtleSkKK3sKKyAgICBpbnQgdmVyc2lvbjsKKyAgICAKKyAgICB2ZXJzaW9uID0gbGVfa2V5X3ZlcnNpb24gKGtleSk7CisKKyAgICBpZiAobGVfa2V5X2tfdHlwZSAodmVyc2lvbiwga2V5KSA9PSBUWVBFX1NUQVRfREFUQSkKKwlyZXR1cm4gIlNEIjsKKyAgICBpZiAobGVfa2V5X2tfdHlwZSAodmVyc2lvbiwga2V5KSA9PSBUWVBFX0RJUkVOVFJZKQorCXJldHVybiAiRElSIjsKKyAgICBpZiAobGVfa2V5X2tfdHlwZSAodmVyc2lvbiwga2V5KSA9PSBUWVBFX0RJUkVDVCkKKwlyZXR1cm4gIkRJUkVDVCI7CisgICAgaWYgKGxlX2tleV9rX3R5cGUgKHZlcnNpb24sIGtleSkgPT0gVFlQRV9JTkRJUkVDVCkKKwlyZXR1cm4gIklORCI7CisgICAgcmV0dXJuICJVTktOT1dOIjsKK30KKworCisvKiAlayAqLworc3RhdGljIHZvaWQgc3ByaW50Zl9sZV9rZXkgKGNoYXIgKiBidWYsIHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXkpCit7CisgIGlmIChrZXkpCisgICAgc3ByaW50ZiAoYnVmLCAiWyVkICVkICVzICVzXSIsIGxlMzJfdG9fY3B1IChrZXktPmtfZGlyX2lkKSwKKwkgICAgIGxlMzJfdG9fY3B1IChrZXktPmtfb2JqZWN0aWQpLCBsZV9vZmZzZXQgKGtleSksIGxlX3R5cGUgKGtleSkpOworICBlbHNlCisgICAgc3ByaW50ZiAoYnVmLCAiW05VTExdIik7Cit9CisKKworLyogJUsgKi8KK3N0YXRpYyB2b2lkIHNwcmludGZfY3B1X2tleSAoY2hhciAqIGJ1Ziwgc3RydWN0IGNwdV9rZXkgKiBrZXkpCit7CisgIGlmIChrZXkpCisgICAgc3ByaW50ZiAoYnVmLCAiWyVkICVkICVzICVzXSIsIGtleS0+b25fZGlza19rZXkua19kaXJfaWQsCisJICAgICBrZXktPm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQsIHJlaXNlcmZzX2NwdV9vZmZzZXQgKGtleSksCisgICAgICAgICAgICAgY3B1X3R5cGUgKGtleSkpOworICBlbHNlCisgICAgc3ByaW50ZiAoYnVmLCAiW05VTExdIik7Cit9CisKK3N0YXRpYyB2b2lkIHNwcmludGZfZGVfaGVhZCggY2hhciAqYnVmLCBzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqZGVoICkKK3sKKyAgICBpZiggZGVoICkKKyAgICAgICAgc3ByaW50ZiggYnVmLCAiW29mZnNldD0lZCBkaXJfaWQ9JWQgb2JqZWN0aWQ9JWQgbG9jYXRpb249JWQgc3RhdGU9JTA0eF0iLCBkZWhfb2Zmc2V0KGRlaCksIGRlaF9kaXJfaWQoZGVoKSwKKyAgICAgICAgICAgICAgICAgZGVoX29iamVjdGlkKGRlaCksIGRlaF9sb2NhdGlvbihkZWgpLCBkZWhfc3RhdGUoZGVoKSApOworICAgIGVsc2UKKyAgICAgICAgc3ByaW50ZiggYnVmLCAiW05VTExdIiApOworCit9CisKK3N0YXRpYyB2b2lkIHNwcmludGZfaXRlbV9oZWFkIChjaGFyICogYnVmLCBzdHJ1Y3QgaXRlbV9oZWFkICogaWgpCit7CisgICAgaWYgKGloKSB7CisJc3RyY3B5IChidWYsIChpaF92ZXJzaW9uIChpaCkgPT0gS0VZX0ZPUk1BVF8zXzYpID8gIiozLjYqICIgOiAiKjMuNSoiKTsKKwlzcHJpbnRmX2xlX2tleSAoYnVmICsgc3RybGVuIChidWYpLCAmKGloLT5paF9rZXkpKTsKKwlzcHJpbnRmIChidWYgKyBzdHJsZW4gKGJ1ZiksICIsIGl0ZW1fbGVuICVkLCBpdGVtX2xvY2F0aW9uICVkLCAiCisJCSAiZnJlZV9zcGFjZShlbnRyeV9jb3VudCkgJWQiLAorCQkgaWhfaXRlbV9sZW4oaWgpLCBpaF9sb2NhdGlvbihpaCksIGloX2ZyZWVfc3BhY2UgKGloKSk7CisgICAgfSBlbHNlCisJc3ByaW50ZiAoYnVmLCAiW05VTExdIik7Cit9CisKKworc3RhdGljIHZvaWQgc3ByaW50Zl9kaXJlbnRyeSAoY2hhciAqIGJ1Ziwgc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSAqIGRlKQoreworICBjaGFyIG5hbWVbMjBdOworCisgIG1lbWNweSAobmFtZSwgZGUtPmRlX25hbWUsIGRlLT5kZV9uYW1lbGVuID4gMTkgPyAxOSA6IGRlLT5kZV9uYW1lbGVuKTsKKyAgbmFtZSBbZGUtPmRlX25hbWVsZW4gPiAxOSA/IDE5IDogZGUtPmRlX25hbWVsZW5dID0gMDsKKyAgc3ByaW50ZiAoYnVmLCAiXCIlc1wiPT0+WyVkICVkXSIsIG5hbWUsIGRlLT5kZV9kaXJfaWQsIGRlLT5kZV9vYmplY3RpZCk7Cit9CisKKworc3RhdGljIHZvaWQgc3ByaW50Zl9ibG9ja19oZWFkIChjaGFyICogYnVmLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCkKK3sKKyAgc3ByaW50ZiAoYnVmLCAibGV2ZWw9JWQsIG5yX2l0ZW1zPSVkLCBmcmVlX3NwYWNlPSVkIHJka2V5ICIsCisJICAgQl9MRVZFTCAoYmgpLCBCX05SX0lURU1TIChiaCksIEJfRlJFRV9TUEFDRSAoYmgpKTsKK30KKworCitzdGF0aWMgdm9pZCBzcHJpbnRmX2J1ZmZlcl9oZWFkIChjaGFyICogYnVmLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCkgCit7CisgIGNoYXIgYltCREVWTkFNRV9TSVpFXTsKKworICBzcHJpbnRmIChidWYsICJkZXYgJXMsIHNpemUgJWQsIGJsb2NrbnIgJWxsdSwgY291bnQgJWQsIHN0YXRlIDB4JWx4LCBwYWdlICVwLCAoJXMsICVzLCAlcykiLAorCSAgIGJkZXZuYW1lIChiaC0+Yl9iZGV2LCBiKSwgYmgtPmJfc2l6ZSwKKwkgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIsCisJICAgYXRvbWljX3JlYWQgKCYoYmgtPmJfY291bnQpKSwKKwkgICBiaC0+Yl9zdGF0ZSwgYmgtPmJfcGFnZSwKKwkgICBidWZmZXJfdXB0b2RhdGUgKGJoKSA/ICJVUFRPREFURSIgOiAiIVVQVE9EQVRFIiwKKwkgICBidWZmZXJfZGlydHkgKGJoKSA/ICJESVJUWSIgOiAiQ0xFQU4iLAorCSAgIGJ1ZmZlcl9sb2NrZWQgKGJoKSA/ICJMT0NLRUQiIDogIlVOTE9DS0VEIik7Cit9CisKKworc3RhdGljIHZvaWQgc3ByaW50Zl9kaXNrX2NoaWxkIChjaGFyICogYnVmLCBzdHJ1Y3QgZGlza19jaGlsZCAqIGRjKQoreworICBzcHJpbnRmIChidWYsICJbZGNfbnVtYmVyPSVkLCBkY19zaXplPSV1XSIsIGRjX2Jsb2NrX251bWJlcihkYyksIGRjX3NpemUoZGMpKTsKK30KKworCitzdGF0aWMgY2hhciAqIGlzX3RoZXJlX3JlaXNlcmZzX3N0cnVjdCAoY2hhciAqIGZtdCwgaW50ICogd2hhdCwgaW50ICogc2tpcCkKK3sKKyAgY2hhciAqIGsgPSBmbXQ7CisKKyAgKnNraXAgPSAwOworICAKKyAgd2hpbGUgKChrID0gc3RyY2hyIChrLCAnJScpKSAhPSBOVUxMKQorICB7CisgICAgaWYgKGtbMV0gPT0gJ2snIHx8IGtbMV0gPT0gJ0snIHx8IGtbMV0gPT0gJ2gnIHx8IGtbMV0gPT0gJ3QnIHx8CisJICAgICAga1sxXSA9PSAneicgfHwga1sxXSA9PSAnYicgfHwga1sxXSA9PSAneScgfHwga1sxXSA9PSAnYScgKSB7CisgICAgICAqd2hhdCA9IGtbMV07CisgICAgICBicmVhazsKKyAgICB9CisgICAgKCpza2lwKSArKzsKKyAgICBrICsrOworICB9CisgIHJldHVybiBrOworfQorCisKKy8qIGRlYnVnZ2luZyByZWlzZXJmcyB3ZSB1c2VkIHRvIHByaW50IG91dCBhIGxvdCBvZiBkaWZmZXJlbnQKKyAgIHZhcmlhYmxlcywgbGlrZSBrZXlzLCBpdGVtIGhlYWRlcnMsIGJ1ZmZlciBoZWFkcyBldGMuIFZhbHVlcyBvZgorICAgbW9zdCBmaWVsZHMgbWF0dGVyLiBTbyBpdCB0b29rIGEgbG9uZyB0aW1lIGp1c3QgdG8gd3JpdGUKKyAgIGFwcHJvcHJpYXRpdmUgcHJpbnRrLiBXaXRoIHRoaXMgcmVpc2VyZnNfd2FybmluZyB5b3UgY2FuIHVzZSBmb3JtYXQKKyAgIHNwZWNpZmljYXRpb24gZm9yIGNvbXBsZXggc3RydWN0dXJlcyBsaWtlIHlvdSB1c2VkIHRvIGRvIHdpdGgKKyAgIHByaW50ZnMgZm9yIGludGVnZXJzLCBkb3VibGVzIGFuZCBwb2ludGVycy4gRm9yIGluc3RhbmNlLCB0byBwcmludAorICAgb3V0IGtleSBzdHJ1Y3R1cmUgeW91IGhhdmUgdG8gd3JpdGUganVzdDogCisgICByZWlzZXJmc193YXJuaW5nICgiYmFkIGtleSAlayIsIGtleSk7IAorICAgaW5zdGVhZCBvZiAKKyAgIHByaW50ayAoImJhZCBrZXkgJWx1ICVsdSAlbHUgJWx1Iiwga2V5LT5rX2Rpcl9pZCwga2V5LT5rX29iamVjdGlkLCAKKyAgICAgICAgICAga2V5LT5rX29mZnNldCwga2V5LT5rX3VuaXF1ZW5lc3MpOyAKKyovCisKKworc3RhdGljIHZvaWQKK3ByZXBhcmVfZXJyb3JfYnVmKCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncyApCit7CisgICAgY2hhciAqIGZtdDEgPSBmbXRfYnVmOworICAgIGNoYXIgKiBrOworICAgIGNoYXIgKiBwID0gZXJyb3JfYnVmOworICAgIGludCBpLCBqLCB3aGF0LCBza2lwOworCisgICAgc3RyY3B5IChmbXQxLCBmbXQpOworCisgICAgd2hpbGUoIChrID0gaXNfdGhlcmVfcmVpc2VyZnNfc3RydWN0KCBmbXQxLCAmd2hhdCwgJnNraXAgKSkgIT0gTlVMTCApCisgICAgeworICAgICAgICAqayA9IDA7CisKKyAgICAgICAgcCArPSB2c3ByaW50ZiAocCwgZm10MSwgYXJncyk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNraXA7IGkgKyspCisgICAgICAgICAgICBqID0gdmFfYXJnIChhcmdzLCBpbnQpOworCisgICAgICAgIHN3aXRjaCAod2hhdCkgeworICAgICAgICBjYXNlICdrJzoKKyAgICAgICAgICAgIHNwcmludGZfbGVfa2V5IChwLCB2YV9hcmcoYXJncywgc3RydWN0IHJlaXNlcmZzX2tleSAqKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnSyc6CisgICAgICAgICAgICBzcHJpbnRmX2NwdV9rZXkgKHAsIHZhX2FyZyhhcmdzLCBzdHJ1Y3QgY3B1X2tleSAqKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnaCc6CisgICAgICAgICAgICBzcHJpbnRmX2l0ZW1faGVhZCAocCwgdmFfYXJnKGFyZ3MsIHN0cnVjdCBpdGVtX2hlYWQgKikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgc3ByaW50Zl9kaXJlbnRyeSAocCwgdmFfYXJnKGFyZ3MsIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgKikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3knOgorICAgICAgICAgICAgc3ByaW50Zl9kaXNrX2NoaWxkIChwLCB2YV9hcmcoYXJncywgc3RydWN0IGRpc2tfY2hpbGQgKikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3onOgorICAgICAgICAgICAgc3ByaW50Zl9ibG9ja19oZWFkIChwLCB2YV9hcmcoYXJncywgc3RydWN0IGJ1ZmZlcl9oZWFkICopKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdiJzoKKyAgICAgICAgICAgIHNwcmludGZfYnVmZmVyX2hlYWQgKHAsIHZhX2FyZyhhcmdzLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2EnOgorICAgICAgICAgICAgc3ByaW50Zl9kZV9oZWFkIChwLCB2YV9hcmcoYXJncywgc3RydWN0IHJlaXNlcmZzX2RlX2hlYWQgKikpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBwICs9IHN0cmxlbiAocCk7CisgICAgICAgIGZtdDEgPSBrICsgMjsKKyAgICB9CisgICAgdnNwcmludGYgKHAsIGZtdDEsIGFyZ3MpOworCit9CisKKworLyogaW4gYWRkaXRpb24gdG8gdXN1YWwgY29udmVyc2lvbiBzcGVjaWZpZXJzIHRoaXMgYWNjZXB0cyByZWlzZXJmcworICAgc3BlY2lmaWMgY29udmVyc2lvbiBzcGVjaWZpZXJzOiAKKyAgICVrIHRvIHByaW50IGxpdHRsZSBlbmRpYW4ga2V5LCAKKyAgICVLIHRvIHByaW50IGNwdSBrZXksIAorICAgJWggdG8gcHJpbnQgaXRlbV9oZWFkLAorICAgJXQgdG8gcHJpbnQgZGlyZWN0b3J5IGVudHJ5IAorICAgJXogdG8gcHJpbnQgYmxvY2sgaGVhZCAoYXJnIG11c3QgYmUgc3RydWN0IGJ1ZmZlcl9oZWFkICoKKyAgICViIHRvIHByaW50IGJ1ZmZlcl9oZWFkCisqLworCisjZGVmaW5lIGRvX3JlaXNlcmZzX3dhcm5pbmcoZm10KVwKK3tcCisgICAgdmFfbGlzdCBhcmdzO1wKKyAgICB2YV9zdGFydCggYXJncywgZm10ICk7XAorICAgIHByZXBhcmVfZXJyb3JfYnVmKCBmbXQsIGFyZ3MgKTtcCisgICAgdmFfZW5kKCBhcmdzICk7XAorfQorCit2b2lkIHJlaXNlcmZzX3dhcm5pbmcgKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKiBmbXQsIC4uLikKK3sKKyAgZG9fcmVpc2VyZnNfd2FybmluZyhmbXQpOworICBpZiAoc2IpCisgICAgICBwcmludGsgKEtFUk5fV0FSTklORyAiUmVpc2VyRlM6ICVzOiB3YXJuaW5nOiAlc1xuIiwKKyAgICAgICAgICAgICByZWlzZXJmc19iZGV2bmFtZSAoc2IpLCBlcnJvcl9idWYpOworICBlbHNlCisgICAgICBwcmludGsgKEtFUk5fV0FSTklORyAiUmVpc2VyRlM6IHdhcm5pbmc6ICVzXG4iLCBlcnJvcl9idWYpOworfQorCisvKiBObyBuZXdsaW5lLi4gcmVpc2VyZnNfaW5mbyBjYWxscyBjYW4gYmUgZm9sbG93ZWQgYnkgcHJpbnRrJ3MgKi8KK3ZvaWQgcmVpc2VyZnNfaW5mbyAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqIGZtdCwgLi4uKQoreworICBkb19yZWlzZXJmc193YXJuaW5nKGZtdCk7CisgIGlmIChzYikKKyAgICAgIHByaW50ayAoS0VSTl9OT1RJQ0UgIlJlaXNlckZTOiAlczogJXMiLAorICAgICAgICAgICAgIHJlaXNlcmZzX2JkZXZuYW1lIChzYiksIGVycm9yX2J1Zik7CisgIGVsc2UKKyAgICAgIHByaW50ayAoS0VSTl9OT1RJQ0UgIlJlaXNlckZTOiAlcyIsIGVycm9yX2J1Zik7Cit9CisKKy8qIE5vIG5ld2xpbmUuLiByZWlzZXJmc19wcmludGsgY2FsbHMgY2FuIGJlIGZvbGxvd2VkIGJ5IHByaW50aydzICovCitzdGF0aWMgdm9pZCByZWlzZXJmc19wcmludGsgKGNvbnN0IGNoYXIgKiBmbXQsIC4uLikKK3sKKyAgZG9fcmVpc2VyZnNfd2FybmluZyhmbXQpOworICBwcmludGsgKGVycm9yX2J1Zik7Cit9CisKK3ZvaWQgcmVpc2VyZnNfZGVidWcgKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgaW50IGxldmVsLCBjb25zdCBjaGFyICogZm10LCAuLi4pCit7CisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisgIGRvX3JlaXNlcmZzX3dhcm5pbmcoZm10KTsKKyAgaWYgKHMpCisgICAgICBwcmludGsgKEtFUk5fREVCVUcgIlJlaXNlckZTOiAlczogJXNcbiIsCisgICAgICAgICAgICAgcmVpc2VyZnNfYmRldm5hbWUgKHMpLCBlcnJvcl9idWYpOworICBlbHNlCisgICAgICBwcmludGsgKEtFUk5fREVCVUcgIlJlaXNlckZTOiAlc1xuIiwgZXJyb3JfYnVmKTsKKyNlbmRpZgorfQorCisvKiBUaGUgZm9ybWF0OgorCisgICAgICAgICAgIG1haW50YWluZXItZXJyb3JpZDogW2Z1bmN0aW9uLW5hbWU6XSBtZXNzYWdlCisKKyAgICB3aGVyZSBlcnJvcmlkIGlzIHVuaXF1ZSB0byB0aGUgbWFpbnRhaW5lciBhbmQgZnVuY3Rpb24tbmFtZSBpcworICAgIG9wdGlvbmFsLCBpcyByZWNvbW1lbmRlZCwgc28gdGhhdCBhbnlvbmUgY2FuIGVhc2lseSBmaW5kIHRoZSBidWcKKyAgICB3aXRoIGEgc2ltcGxlIGdyZXAgZm9yIHRoZSBzaG9ydCB0byB0eXBlIHN0cmluZworICAgIG1haW50YWluZXItZXJyb3JpZC4gIERvbid0IGJvdGhlciB3aXRoIHJldXNpbmcgZXJyb3JpZHMsIHRoZXJlIGFyZQorICAgIGxvdHMgb2YgbnVtYmVycyBvdXQgdGhlcmUuCisKKyAgICBFeGFtcGxlOiAKKyAgICAKKyAgICByZWlzZXJmc19wYW5pYygKKwlwX3NiLCAicmVpc2VyLTI5OiByZWlzZXJmc19uZXdfYmxvY2tucnM6ICIKKwkib25lIG9mIHNlYXJjaF9zdGFydCBvciBybiglZCkgaXMgZXF1YWwgdG8gTUFYX0JfTlVNLCIKKwkid2hpY2ggbWVhbnMgdGhhdCB3ZSBhcmUgb3B0aW1pemluZyBsb2NhdGlvbiBiYXNlZCBvbiB0aGUgYm9ndXMgbG9jYXRpb24gb2YgYSB0ZW1wIGJ1ZmZlciAoJXApLiIsIAorCXJuLCBiaAorICAgICk7CisKKyAgICBSZWd1bGFyIHBhbmljKClzIHNvbWV0aW1lcyBjbGVhciB0aGUgc2NyZWVuIGJlZm9yZSB0aGUgbWVzc2FnZSBjYW4KKyAgICBiZSByZWFkLCB0aHVzIHRoZSBuZWVkIGZvciB0aGUgd2hpbGUgbG9vcC4gIAorCisgICAgTnVtYmVyaW5nIHNjaGVtZSBmb3IgcGFuaWMgdXNlZCBieSBWbGFkaW1pciBhbmQgQW5hdG9seSggSGFucyBjb21wbGV0ZWx5IGlnbm9yZXMgdGhpcyBzY2hlbWUsIGFuZCBjb25zaWRlcnMgaXQKKyAgICBwb2ludGxlc3MgY29tcGxleGl0eSk6CisKKyAgICBwYW5pY3MgaW4gcmVpc2VyZnNfZnMuaCBoYXZlIG51bWJlcnMgZnJvbSAxMDAwIHRvIDE5OTkKKyAgICBzdXBlci5jCQkJCSAgICAgICAgMjAwMCB0byAyOTk5CisgICAgcHJlc2VydmUuYyAodW51c2VkKQkJCSAgICAzMDAwIHRvIDM5OTkKKyAgICBiaXRtYXAuYwkJCQkgICAgNDAwMCB0byA0OTk5CisgICAgc3RyZWUuYwkJCQkgICAgICAgIDUwMDAgdG8gNTk5OQorICAgIHByaW50cy5jCQkJCSAgICA2MDAwIHRvIDY5OTkKKyAgICBuYW1laS5jICAgICAgICAgICAgICAgICAgICAgNzAwMCB0byA3OTk5CisgICAgZml4X25vZGVzLmMgICAgICAgICAgICAgICAgIDgwMDAgdG8gODk5OQorICAgIGRpci5jICAgICAgICAgICAgICAgICAgICAgICA5MDAwIHRvIDk5OTkKKwlsYmFsYW5jZS5jCQkJCQkxMDAwMCB0byAxMDk5OQorCWliYWxhbmNlLmMJCTExMDAwIHRvIDExOTk5IG5vdCByZWFkeQorCWRvX2JhbGFuLmMJCTEyMDAwIHRvIDEyOTk5CisJaW5vZGUuYwkJCTEzMDAwIHRvIDEzOTk5CisJZmlsZS5jCQkJMTQwMDAgdG8gMTQ5OTkKKyAgICBvYmplY3RpZC5jICAgICAgICAgICAgICAgICAgICAgICAxNTAwMCAtIDE1OTk5CisgICAgYnVmZmVyLmMgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMDAgLSAxNjk5OQorICAgIHN5bWxpbmsuYyAgICAgICAgICAgICAgICAgICAgICAgIDE3MDAwIC0gMTc5OTkKKworICAgLiAgKi8KKworCisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCitleHRlcm4gc3RydWN0IHRyZWVfYmFsYW5jZSAqIGN1cl90YjsKKyNlbmRpZgorCit2b2lkIHJlaXNlcmZzX3BhbmljIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgY29uc3QgY2hhciAqIGZtdCwgLi4uKQoreworICBkb19yZWlzZXJmc193YXJuaW5nKGZtdCk7CisgIHByaW50ayAoS0VSTl9FTUVSRyAiUkVJU0VSRlM6IHBhbmljIChkZXZpY2UgJXMpOiAlc1xuIiwKKyAgICAgICAgICByZWlzZXJmc19iZGV2bmFtZSAoc2IpLCBlcnJvcl9idWYpOworICBCVUcgKCk7CisKKyAgLyogdGhpcyBpcyBub3QgYWN0dWFsbHkgY2FsbGVkLCBidXQgbWFrZXMgcmVpc2VyZnNfcGFuaWMoKSAibm9yZXR1cm4iICovCisgIHBhbmljICgiUkVJU0VSRlM6IHBhbmljIChkZXZpY2UgJXMpOiAlc1xuIiwKKwkgcmVpc2VyZnNfYmRldm5hbWUgKHNiKSwgZXJyb3JfYnVmKTsKK30KKwordm9pZAorcmVpc2VyZnNfYWJvcnQgKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBlcnJubywgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgICAgZG9fcmVpc2VyZnNfd2FybmluZyAoZm10KTsKKworICAgIGlmIChyZWlzZXJmc19lcnJvcl9wYW5pYyAoc2IpKSB7CisgICAgICAgIHBhbmljIChLRVJOX0NSSVQgIlJFSVNFUkZTOiBwYW5pYyAoZGV2aWNlICVzKTogJXNcbiIsCisgICAgICAgICAgICAgICByZWlzZXJmc19iZGV2bmFtZSAoc2IpLCBlcnJvcl9idWYpOworICAgIH0KKworICAgIGlmIChzYi0+c19mbGFncyAmIE1TX1JET05MWSkKKyAgICAgICAgcmV0dXJuOworCisgICAgcHJpbnRrIChLRVJOX0NSSVQgIlJFSVNFUkZTOiBhYm9ydCAoZGV2aWNlICVzKTogJXNcbiIsCisgICAgICAgICAgICByZWlzZXJmc19iZGV2bmFtZSAoc2IpLCBlcnJvcl9idWYpOworCisgICAgc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworICAgIHJlaXNlcmZzX2pvdXJuYWxfYWJvcnQgKHNiLCBlcnJubyk7Cit9CisKKy8qIHRoaXMgcHJpbnRzIGludGVybmFsIG5vZGVzICg0IGtleXMvaXRlbXMgaW4gbGluZSkgKGRjX251bWJlciwKKyAgIGRjX3NpemUpW2tfZGlyaWQsIGtfb2JqZWN0aWQsIGtfb2Zmc2V0LCBrX3VuaXF1ZW5lc3NdKGRjX251bWJlciwKKyAgIGRjX3NpemUpLi4uKi8KK3N0YXRpYyBpbnQgcHJpbnRfaW50ZXJuYWwgKHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoLCBpbnQgZmlyc3QsIGludCBsYXN0KQoreworICAgIHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXk7CisgICAgc3RydWN0IGRpc2tfY2hpbGQgKiBkYzsKKyAgICBpbnQgaTsKKyAgICBpbnQgZnJvbSwgdG87CisgICAgCisgICAgaWYgKCFCX0lTX0tFWVNfTEVWRUwgKGJoKSkKKwlyZXR1cm4gMTsKKworICAgIGNoZWNrX2ludGVybmFsIChiaCk7CisgICAgCisgICAgaWYgKGZpcnN0ID09IC0xKSB7CisJZnJvbSA9IDA7CisJdG8gPSBCX05SX0lURU1TIChiaCk7CisgICAgfSBlbHNlIHsKKwlmcm9tID0gZmlyc3Q7CisJdG8gPSBsYXN0IDwgQl9OUl9JVEVNUyAoYmgpID8gbGFzdCA6IEJfTlJfSVRFTVMgKGJoKTsKKyAgICB9CisKKyAgICByZWlzZXJmc19wcmludGsgKCJJTlRFUk5BTCBOT0RFICglbGQpIGNvbnRhaW5zICV6XG4iLCAgYmgtPmJfYmxvY2tuciwgYmgpOworICAgIAorICAgIGRjID0gQl9OX0NISUxEIChiaCwgZnJvbSk7CisgICAgcmVpc2VyZnNfcHJpbnRrICgiUFRSICVkOiAleSAiLCBmcm9tLCBkYyk7CisgICAgCisgICAgZm9yIChpID0gZnJvbSwga2V5ID0gQl9OX1BERUxJTV9LRVkgKGJoLCBmcm9tKSwgZGMgKys7IGkgPCB0bzsgaSArKywga2V5ICsrLCBkYyArKykgeworCXJlaXNlcmZzX3ByaW50ayAoIktFWSAlZDogJWsgUFRSICVkOiAleSAiLCBpLCBrZXksIGkgKyAxLCBkYyk7CisJaWYgKGkgJiYgaSAlIDQgPT0gMCkKKwkgICAgcHJpbnRrICgiXG4iKTsKKyAgICB9CisgICAgcHJpbnRrICgiXG4iKTsKKyAgICByZXR1cm4gMDsKK30KKworCisKKworCitzdGF0aWMgaW50IHByaW50X2xlYWYgKHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoLCBpbnQgcHJpbnRfbW9kZSwgaW50IGZpcnN0LCBpbnQgbGFzdCkKK3sKKyAgICBzdHJ1Y3QgYmxvY2tfaGVhZCAqIGJsa2g7CisgICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOworICAgIGludCBpLCBucjsKKyAgICBpbnQgZnJvbSwgdG87CisKKyAgICBpZiAoIUJfSVNfSVRFTVNfTEVWRUwgKGJoKSkKKwlyZXR1cm4gMTsKKworICAgIGNoZWNrX2xlYWYgKGJoKTsKKworICAgIGJsa2ggPSBCX0JMS19IRUFEIChiaCk7CisgICAgaWggPSBCX05fUElURU1fSEVBRCAoYmgsMCk7CisgICAgbnIgPSBibGtoX25yX2l0ZW0oYmxraCk7CisKKyAgICBwcmludGsgKCJcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworICAgIHJlaXNlcmZzX3ByaW50ayAoIkxFQUYgTk9ERSAoJWxkKSBjb250YWlucyAlelxuIiwgYmgtPmJfYmxvY2tuciwgYmgpOworCisgICAgaWYgKCEocHJpbnRfbW9kZSAmIFBSSU5UX0xFQUZfSVRFTVMpKSB7CisJcmVpc2VyZnNfcHJpbnRrICgiRklSU1QgSVRFTV9LRVk6ICVrLCBMQVNUIElURU0gS0VZOiAla1xuIiwKKwkJCSAgJihpaC0+aWhfa2V5KSwgJigoaWggKyBuciAtIDEpLT5paF9rZXkpKTsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoZmlyc3QgPCAwIHx8IGZpcnN0ID4gbnIgLSAxKSAKKwlmcm9tID0gMDsKKyAgICBlbHNlIAorCWZyb20gPSBmaXJzdDsKKworICAgIGlmIChsYXN0IDwgMCB8fCBsYXN0ID4gbnIgKQorCXRvID0gbnI7CisgICAgZWxzZQorCXRvID0gbGFzdDsKKworICAgIGloICs9IGZyb207CisgICAgcHJpbnRrICgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisgICAgcHJpbnRrICgifCMjfCAgIHR5cGUgICAgfCAgICAgICAgICAga2V5ICAgICAgICAgICB8IGlsZW4gfCBmcmVlX3NwYWNlIHwgdmVyc2lvbiB8IGxvYyAgfFxuIik7CisgICAgZm9yIChpID0gZnJvbTsgaSA8IHRvOyBpKyssIGloICsrKSB7CisJcHJpbnRrICgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJcmVpc2VyZnNfcHJpbnRrICgifCUyZHwgJWggfFxuIiwgaSwgaWgpOworCWlmIChwcmludF9tb2RlICYgUFJJTlRfTEVBRl9JVEVNUykKKwkgICAgb3BfcHJpbnRfaXRlbSAoaWgsIEJfSV9QSVRFTSAoYmgsIGloKSk7CisgICAgfQorCisgICAgcHJpbnRrICgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisKKyAgICByZXR1cm4gMDsKK30KKworY2hhciAqIHJlaXNlcmZzX2hhc2huYW1lKGludCBjb2RlKQoreworICAgIGlmICggY29kZSA9PSBZVVJBX0hBU0gpCisJcmV0dXJuICJydXBhc292IjsKKyAgICBpZiAoIGNvZGUgPT0gVEVBX0hBU0gpCisJcmV0dXJuICJ0ZWEiOworICAgIGlmICggY29kZSA9PSBSNV9IQVNIKQorCXJldHVybiAicjUiOworCisgICAgcmV0dXJuICJ1bmtub3duIjsKK30KKworLyogcmV0dXJuIDEgaWYgdGhpcyBpcyBub3Qgc3VwZXIgYmxvY2sgKi8KK3N0YXRpYyBpbnQgcHJpbnRfc3VwZXJfYmxvY2sgKHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoKQoreworICAgIHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqIHJzID0gKHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqKShiaC0+Yl9kYXRhKTsKKyAgICBpbnQgc2tpcHBlZCwgZGF0YV9ibG9ja3M7CisgICAgY2hhciAqdmVyc2lvbjsKKyAgICBjaGFyIGJbQkRFVk5BTUVfU0laRV07CisKKyAgICBpZiAoaXNfcmVpc2VyZnNfM181KHJzKSkgeworICAgICAgICB2ZXJzaW9uID0gIjMuNSI7CisgICAgfSBlbHNlIGlmIChpc19yZWlzZXJmc18zXzYocnMpKSB7CisgICAgICAgIHZlcnNpb24gPSAiMy42IjsKKyAgICB9IGVsc2UgaWYgKGlzX3JlaXNlcmZzX2pyKHJzKSkgeworICAgICAgdmVyc2lvbiA9ICgoc2JfdmVyc2lvbihycykgPT0gUkVJU0VSRlNfVkVSU0lPTl8yKSA/CisgCQkgIjMuNiIgOiAiMy41Iik7ICAKKyAgICB9IGVsc2UgeworCXJldHVybiAxOworICAgIH0KKworICAgIHByaW50ayAoIiVzXCdzIHN1cGVyIGJsb2NrIGlzIGluIGJsb2NrICVsbHVcbiIsIGJkZXZuYW1lIChiaC0+Yl9iZGV2LCBiKSwKKyAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmgtPmJfYmxvY2tucik7CisgICAgcHJpbnRrICgiUmVpc2VyZnMgdmVyc2lvbiAlc1xuIiwgdmVyc2lvbiApOworICAgIHByaW50ayAoIkJsb2NrIGNvdW50ICV1XG4iLCBzYl9ibG9ja19jb3VudChycykpOworICAgIHByaW50ayAoIkJsb2Nrc2l6ZSAlZFxuIiwgc2JfYmxvY2tzaXplKHJzKSk7CisgICAgcHJpbnRrICgiRnJlZSBibG9ja3MgJXVcbiIsIHNiX2ZyZWVfYmxvY2tzKHJzKSk7CisgICAgLy8gRklYTUU6IHRoaXMgd291bGQgYmUgY29uZnVzaW5nIGlmCisgICAgLy8gc29tZW9uZSBzdG9yZXMgcmVpc2VyZnMgc3VwZXIgYmxvY2sgaW4gc29tZSBkYXRhIGJsb2NrIDspCisvLyAgICBza2lwcGVkID0gKGJoLT5iX2Jsb2NrbnIgKiBiaC0+Yl9zaXplKSAvIHNiX2Jsb2Nrc2l6ZShycyk7CisgICAgc2tpcHBlZCA9IGJoLT5iX2Jsb2NrbnI7CisgICAgZGF0YV9ibG9ja3MgPSBzYl9ibG9ja19jb3VudChycykgLSBza2lwcGVkIC0gMSAtIHNiX2JtYXBfbnIocnMpIC0KKwkgICAgKCFpc19yZWlzZXJmc19qcihycykgPyBzYl9qcF9qb3VybmFsX3NpemUocnMpICsgMSA6IHNiX3Jlc2VydmVkX2Zvcl9qb3VybmFsKHJzKSkgLQkgICAgCisJICAgIHNiX2ZyZWVfYmxvY2tzKHJzKTsKKyAgICBwcmludGsgKCJCdXN5IGJsb2NrcyAoc2tpcHBlZCAlZCwgYml0bWFwcyAtICVkLCBqb3VybmFsIChvciByZXNlcnZlZCkgYmxvY2tzIC0gJWRcbiIKKwkgICAgIjEgc3VwZXIgYmxvY2ssICVkIGRhdGEgYmxvY2tzXG4iLCAKKwkgICAgc2tpcHBlZCwgc2JfYm1hcF9ucihycyksICghaXNfcmVpc2VyZnNfanIocnMpID8gKHNiX2pwX2pvdXJuYWxfc2l6ZShycykgKyAxKSA6CisJCQkJICAgICAgc2JfcmVzZXJ2ZWRfZm9yX2pvdXJuYWwocnMpKSAsIGRhdGFfYmxvY2tzKTsKKyAgICBwcmludGsgKCJSb290IGJsb2NrICV1XG4iLCBzYl9yb290X2Jsb2NrKHJzKSk7CisgICAgcHJpbnRrICgiSm91cm5hbCBibG9jayAoZmlyc3QpICVkXG4iLCBzYl9qcF9qb3VybmFsXzFzdF9ibG9jayhycykpOworICAgIHByaW50ayAoIkpvdXJuYWwgZGV2ICVkXG4iLCBzYl9qcF9qb3VybmFsX2RldihycykpOworICAgIHByaW50ayAoIkpvdXJuYWwgb3JpZyBzaXplICVkXG4iLCBzYl9qcF9qb3VybmFsX3NpemUocnMpKTsKKyAgICBwcmludGsgKCJGUyBzdGF0ZSAlZFxuIiwgc2JfZnNfc3RhdGUocnMpKTsKKyAgICBwcmludGsgKCJIYXNoIGZ1bmN0aW9uIFwiJXNcIlxuIiwKKwkgICAgcmVpc2VyZnNfaGFzaG5hbWUoc2JfaGFzaF9mdW5jdGlvbl9jb2RlKHJzKSkpOworICAgIAorICAgIHByaW50ayAoIlRyZWUgaGVpZ2h0ICVkXG4iLCBzYl90cmVlX2hlaWdodChycykpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByaW50X2Rlc2NfYmxvY2sgKHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoKQoreworICAgIHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Rlc2MgKiBkZXNjOworCisgICAgaWYgKG1lbWNtcChnZXRfam91cm5hbF9kZXNjX21hZ2ljIChiaCksIEpPVVJOQUxfREVTQ19NQUdJQywgOCkpCisJcmV0dXJuIDE7CisKKyAgICBkZXNjID0gKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2Rlc2MgKikoYmgtPmJfZGF0YSk7CisgICAgcHJpbnRrICgiRGVzYyBibG9jayAlbGx1IChqX3RyYW5zX2lkICVkLCBqX21vdW50X2lkICVkLCBqX2xlbiAlZCkiLAorCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIsIGdldF9kZXNjX3RyYW5zX2lkIChkZXNjKSwgZ2V0X2Rlc2NfbW91bnRfaWQgKGRlc2MpLAorCSAgICBnZXRfZGVzY190cmFuc19sZW4gKGRlc2MpKTsKKworICAgIHJldHVybiAwOworfQorCisKK3ZvaWQgcHJpbnRfYmxvY2sgKHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoLCAuLi4pLy9pbnQgcHJpbnRfbW9kZSwgaW50IGZpcnN0LCBpbnQgbGFzdCkKK3sKKyAgICB2YV9saXN0IGFyZ3M7CisgICAgaW50IG1vZGUsIGZpcnN0LCBsYXN0OworCisgICAgdmFfc3RhcnQgKGFyZ3MsIGJoKTsKKworICAgIGlmICggISBiaCApIHsKKwlwcmludGsoInByaW50X2Jsb2NrOiBidWZmZXIgaXMgTlVMTFxuIik7CisJcmV0dXJuOworICAgIH0KKworICAgIG1vZGUgPSB2YV9hcmcgKGFyZ3MsIGludCk7CisgICAgZmlyc3QgPSB2YV9hcmcgKGFyZ3MsIGludCk7CisgICAgbGFzdCA9IHZhX2FyZyAoYXJncywgaW50KTsKKyAgICBpZiAocHJpbnRfbGVhZiAoYmgsIG1vZGUsIGZpcnN0LCBsYXN0KSkKKwlpZiAocHJpbnRfaW50ZXJuYWwgKGJoLCBmaXJzdCwgbGFzdCkpCisJICAgIGlmIChwcmludF9zdXBlcl9ibG9jayAoYmgpKQorCQlpZiAocHJpbnRfZGVzY19ibG9jayAoYmgpKQorCQkgICAgcHJpbnRrICgiQmxvY2sgJWxsdSBjb250YWlucyB1bmZvcm1hdHRlZCBkYXRhXG4iLCAodW5zaWduZWQgbG9uZyBsb25nKWJoLT5iX2Jsb2NrbnIpOworfQorCisKKworc3RhdGljIGNoYXIgcHJpbnRfdGJfYnVmWzIwNDhdOworCisvKiB0aGlzIHN0b3JlcyBpbml0aWFsIHN0YXRlIG9mIHRyZWUgYmFsYW5jZSBpbiB0aGUgcHJpbnRfdGJfYnVmICovCit2b2lkIHN0b3JlX3ByaW50X3RiIChzdHJ1Y3QgdHJlZV9iYWxhbmNlICogdGIpCit7CisgICAgaW50IGggPSAwOworICAgIGludCBpOworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIHRiU2gsICogdGJGaDsKKworICAgIGlmICghdGIpCisJcmV0dXJuOworCisgICAgc3ByaW50ZiAocHJpbnRfdGJfYnVmLCAiXG4iCisJICAgICAiQkFMQU5DSU5HICVkXG4iCisJICAgICAiTU9ERT0lYywgSVRFTV9QT1M9JWQgUE9TX0lOX0lURU09JWRcbiIgCisJICAgICAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCisJICAgICAiKiBoICogICAgUyAgICAqICAgIEwgICAgKiAgICBSICAgICogICBGICAgKiAgIEZMICAqICAgRlIgICogIENGTCAgKiAgQ0ZSICAqXG4iLAorCSAgICAgUkVJU0VSRlNfU0IodGItPnRiX3NiKS0+c19kb19iYWxhbmNlLAorCSAgICAgdGItPnRiX21vZGUsIFBBVEhfTEFTVF9QT1NJVElPTiAodGItPnRiX3BhdGgpLCB0Yi0+dGJfcGF0aC0+cG9zX2luX2l0ZW0pOworICAKKyAgICBmb3IgKGggPSAwOyBoIDwgc2l6ZW9mKHRiLT5pbnNlcnRfc2l6ZSkgLyBzaXplb2YgKHRiLT5pbnNlcnRfc2l6ZVswXSk7IGggKyspIHsKKwlpZiAoUEFUSF9IX1BBVEhfT0ZGU0VUICh0Yi0+dGJfcGF0aCwgaCkgPD0gdGItPnRiX3BhdGgtPnBhdGhfbGVuZ3RoICYmIAorCSAgICBQQVRIX0hfUEFUSF9PRkZTRVQgKHRiLT50Yl9wYXRoLCBoKSA+IElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCkgeworCSAgICB0YlNoID0gUEFUSF9IX1BCVUZGRVIgKHRiLT50Yl9wYXRoLCBoKTsKKwkgICAgdGJGaCA9IFBBVEhfSF9QUEFSRU5UICh0Yi0+dGJfcGF0aCwgaCk7CisJfSBlbHNlIHsKKwkgICAgdGJTaCA9IE5VTEw7CisJICAgIHRiRmggPSBOVUxMOworCX0KKwlzcHJpbnRmIChwcmludF90Yl9idWYgKyBzdHJsZW4gKHByaW50X3RiX2J1ZiksCisJCSAiKiAlZCAqICUzbGxkKCUyZCkgKiAlM2xsZCglMmQpICogJTNsbGQoJTJkKSAqICU1bGxkICogJTVsbGQgKiAlNWxsZCAqICU1bGxkICogJTVsbGQgKlxuIiwKKwkJIGgsIAorCQkgKHRiU2gpID8gKGxvbmcgbG9uZykodGJTaC0+Yl9ibG9ja25yKTooLTFMTCksCisJCSAodGJTaCkgPyBhdG9taWNfcmVhZCAoJih0YlNoLT5iX2NvdW50KSkgOiAtMSwKKwkJICh0Yi0+TFtoXSkgPyAobG9uZyBsb25nKSh0Yi0+TFtoXS0+Yl9ibG9ja25yKTooLTFMTCksCisJCSAodGItPkxbaF0pID8gYXRvbWljX3JlYWQgKCYodGItPkxbaF0tPmJfY291bnQpKSA6IC0xLAorCQkgKHRiLT5SW2hdKSA/IChsb25nIGxvbmcpKHRiLT5SW2hdLT5iX2Jsb2NrbnIpOigtMUxMKSwKKwkJICh0Yi0+UltoXSkgPyBhdG9taWNfcmVhZCAoJih0Yi0+UltoXS0+Yl9jb3VudCkpIDogLTEsCisJCSAodGJGaCkgPyAobG9uZyBsb25nKSh0YkZoLT5iX2Jsb2NrbnIpOigtMUxMKSwKKwkJICh0Yi0+RkxbaF0pID8gKGxvbmcgbG9uZykodGItPkZMW2hdLT5iX2Jsb2NrbnIpOigtMUxMKSwKKwkJICh0Yi0+RlJbaF0pID8gKGxvbmcgbG9uZykodGItPkZSW2hdLT5iX2Jsb2NrbnIpOigtMUxMKSwKKwkJICh0Yi0+Q0ZMW2hdKSA/IChsb25nIGxvbmcpKHRiLT5DRkxbaF0tPmJfYmxvY2tucik6KC0xTEwpLAorCQkgKHRiLT5DRlJbaF0pID8gKGxvbmcgbG9uZykodGItPkNGUltoXS0+Yl9ibG9ja25yKTooLTFMTCkpOworICAgIH0KKworICAgIHNwcmludGYgKHByaW50X3RiX2J1ZiArIHN0cmxlbiAocHJpbnRfdGJfYnVmKSwgCisJICAgICAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iCisJICAgICAiKiBoICogc2l6ZSAqIGxuICogbGIgKiBybiAqIHJiICogYmxrbiAqIHMwICogczEgKiBzMWIgKiBzMiAqIHMyYiAqIGN1cmIgKiBsayAqIHJrICpcbiIKKwkgICAgICIqIDAgKiAlNGQgKiAlMmQgKiAlMmQgKiAlMmQgKiAlMmQgKiAlNGQgKiAlMmQgKiAlMmQgKiAlM2QgKiAlMmQgKiAlM2QgKiAlNGQgKiAlMmQgKiAlMmQgKlxuIiwKKwkgICAgIHRiLT5pbnNlcnRfc2l6ZVswXSwgdGItPmxudW1bMF0sIHRiLT5sYnl0ZXMsIHRiLT5ybnVtWzBdLHRiLT5yYnl0ZXMsIHRiLT5ibGtudW1bMF0sIAorCSAgICAgdGItPnMwbnVtLCB0Yi0+czFudW0sdGItPnMxYnl0ZXMsICB0Yi0+czJudW0sIHRiLT5zMmJ5dGVzLCB0Yi0+Y3VyX2Jsa251bSwgdGItPmxrZXlbMF0sIHRiLT5ya2V5WzBdKTsKKworICAgIC8qIHRoaXMgcHJpbnRzIGJhbGFuY2UgcGFyYW1ldGVycyBmb3Igbm9uLWxlYWYgbGV2ZWxzICovCisgICAgaCA9IDA7CisgICAgZG8geworCWgrKzsKKwlzcHJpbnRmIChwcmludF90Yl9idWYgKyBzdHJsZW4gKHByaW50X3RiX2J1ZiksCisJCSAiKiAlZCAqICU0ZCAqICUyZCAqICAgICogJTJkICogICAgKiAlMmQgKlxuIiwKKwkJaCwgdGItPmluc2VydF9zaXplW2hdLCB0Yi0+bG51bVtoXSwgdGItPnJudW1baF0sIHRiLT5ibGtudW1baF0pOworICAgIH0gd2hpbGUgKHRiLT5pbnNlcnRfc2l6ZVtoXSk7CisKKyAgICBzcHJpbnRmIChwcmludF90Yl9idWYgKyBzdHJsZW4gKHByaW50X3RiX2J1ZiksIAorCSAgICAgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIgorCSAgICAgIkZFQiBsaXN0OiAiKTsKKworICAgIC8qIHByaW50IEZFQiBsaXN0IChsaXN0IG9mIGJ1ZmZlcnMgaW4gZm9ybSAoYmggKGJfYmxvY2tuciwgYl9jb3VudCksIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBuZXcgbm9kZXMpICovCisgICAgaCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZiAodGItPkZFQikgLyBzaXplb2YgKHRiLT5GRUJbMF0pOyBpICsrKQorCXNwcmludGYgKHByaW50X3RiX2J1ZiArIHN0cmxlbiAocHJpbnRfdGJfYnVmKSwKKwkJICIlcCAoJWxsdSAlZCklcyIsIHRiLT5GRUJbaV0sIHRiLT5GRUJbaV0gPyAodW5zaWduZWQgbG9uZyBsb25nKXRiLT5GRUJbaV0tPmJfYmxvY2tuciA6IDBVTEwsCisJCSB0Yi0+RkVCW2ldID8gYXRvbWljX3JlYWQgKCYodGItPkZFQltpXS0+Yl9jb3VudCkpIDogMCwgCisJCSAoaSA9PSBzaXplb2YgKHRiLT5GRUIpIC8gc2l6ZW9mICh0Yi0+RkVCWzBdKSAtIDEpID8gIlxuIiA6ICIsICIpOworCisgICAgc3ByaW50ZiAocHJpbnRfdGJfYnVmICsgc3RybGVuIChwcmludF90Yl9idWYpLCAKKwkgICAgICI9PT09PT09PT09PT09PT09PT09PT09PT0gdGhlIGVuZCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworfQorCit2b2lkIHByaW50X2N1cl90YiAoY2hhciAqIG1lcykKK3sKKyAgICBwcmludGsgKCIlc1xuJXMiLCBtZXMsIHByaW50X3RiX2J1Zik7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2xlYWZfYmxvY2tfaGVhZCAoc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpCit7CisgIHN0cnVjdCBibG9ja19oZWFkICogYmxraDsKKyAgaW50IG5yOworCisgIGJsa2ggPSBCX0JMS19IRUFEIChiaCk7CisgIG5yID0gYmxraF9ucl9pdGVtKGJsa2gpOworICBpZiAoIG5yID4gKGJoLT5iX3NpemUgLSBCTEtIX1NJWkUpIC8gSUhfU0laRSkKKyAgICByZWlzZXJmc19wYW5pYyAoTlVMTCwgInZzLTYwMTA6IGNoZWNrX2xlYWZfYmxvY2tfaGVhZDogaW52YWxpZCBpdGVtIG51bWJlciAleiIsIGJoKTsKKyAgaWYgKCBibGtoX2ZyZWVfc3BhY2UoYmxraCkgPiAKKyAgICAgIGJoLT5iX3NpemUgLSBCTEtIX1NJWkUgLSBJSF9TSVpFICogbnIgKQorICAgIHJlaXNlcmZzX3BhbmljIChOVUxMLCAidnMtNjAyMDogY2hlY2tfbGVhZl9ibG9ja19oZWFkOiBpbnZhbGlkIGZyZWUgc3BhY2UgJXoiLCBiaCk7CisgICAgCit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2ludGVybmFsX2Jsb2NrX2hlYWQgKHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoKQoreworICAgIHN0cnVjdCBibG9ja19oZWFkICogYmxraDsKKyAgICAKKyAgICBibGtoID0gQl9CTEtfSEVBRCAoYmgpOworICAgIGlmICghKEJfTEVWRUwgKGJoKSA+IERJU0tfTEVBRl9OT0RFX0xFVkVMICYmIEJfTEVWRUwgKGJoKSA8PSBNQVhfSEVJR0hUKSkKKwlyZWlzZXJmc19wYW5pYyAoTlVMTCwgInZzLTYwMjU6IGNoZWNrX2ludGVybmFsX2Jsb2NrX2hlYWQ6IGludmFsaWQgbGV2ZWwgJXoiLCBiaCk7CisKKyAgICBpZiAoQl9OUl9JVEVNUyAoYmgpID4gKGJoLT5iX3NpemUgLSBCTEtIX1NJWkUpIC8gSUhfU0laRSkKKwlyZWlzZXJmc19wYW5pYyAoTlVMTCwgInZzLTYwMzA6IGNoZWNrX2ludGVybmFsX2Jsb2NrX2hlYWQ6IGludmFsaWQgaXRlbSBudW1iZXIgJXoiLCBiaCk7CisKKyAgICBpZiAoQl9GUkVFX1NQQUNFIChiaCkgIT0gCisJYmgtPmJfc2l6ZSAtIEJMS0hfU0laRSAtIEtFWV9TSVpFICogQl9OUl9JVEVNUyAoYmgpIC0gRENfU0laRSAqIChCX05SX0lURU1TIChiaCkgKyAxKSkKKwlyZWlzZXJmc19wYW5pYyAoTlVMTCwgInZzLTYwNDA6IGNoZWNrX2ludGVybmFsX2Jsb2NrX2hlYWQ6IGludmFsaWQgZnJlZSBzcGFjZSAleiIsIGJoKTsKKworfQorCisKK3ZvaWQgY2hlY2tfbGVhZiAoc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpCit7CisgICAgaW50IGk7CisgICAgc3RydWN0IGl0ZW1faGVhZCAqIGloOworCisgICAgaWYgKCFiaCkKKwlyZXR1cm47CisgICAgY2hlY2tfbGVhZl9ibG9ja19oZWFkIChiaCk7CisgICAgZm9yIChpID0gMCwgaWggPSBCX05fUElURU1fSEVBRCAoYmgsIDApOyBpIDwgQl9OUl9JVEVNUyAoYmgpOyBpICsrLCBpaCArKykKKwlvcF9jaGVja19pdGVtIChpaCwgQl9JX1BJVEVNIChiaCwgaWgpKTsKK30KKworCit2b2lkIGNoZWNrX2ludGVybmFsIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCkKK3sKKyAgaWYgKCFiaCkKKyAgICByZXR1cm47CisgIGNoZWNrX2ludGVybmFsX2Jsb2NrX2hlYWQgKGJoKTsKK30KKworCit2b2lkIHByaW50X3N0YXRpc3RpY3MgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMpCit7CisKKyAgLyoKKyAgcHJpbnRrICgicmVpc2VyZnNfcHV0X3N1cGVyOiBzZXNzaW9uIHN0YXRpc3RpY3M6IGJhbGFuY2VzICVkLCBmaXhfbm9kZXMgJWQsIFwKK2JtYXAgd2l0aCBzZWFyY2ggJWQsIHdpdGhvdXQgJWQsIGRpcjJpbmQgJWQsIGluZDJkaXIgJWRcbiIsCisJICBSRUlTRVJGU19TQihzKS0+c19kb19iYWxhbmNlLCBSRUlTRVJGU19TQihzKS0+c19maXhfbm9kZXMsCisJICBSRUlTRVJGU19TQihzKS0+c19ibWFwcywgUkVJU0VSRlNfU0IocyktPnNfYm1hcHNfd2l0aG91dF9zZWFyY2gsCisJICBSRUlTRVJGU19TQihzKS0+c19kaXJlY3QyaW5kaXJlY3QsIFJFSVNFUkZTX1NCKHMpLT5zX2luZGlyZWN0MmRpcmVjdCk7CisgICovCisKK30KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL3Byb2Nmcy5jIGIvZnMvcmVpc2VyZnMvcHJvY2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRlYTgxYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3JlaXNlcmZzL3Byb2Nmcy5jCkBAIC0wLDAgKzEsNjY0IEBACisvKiAtKi0gbGludXgtYyAtKi0gKi8KKworLyogZnMvcmVpc2VyZnMvcHJvY2ZzLmMgKi8KKworLyoKKyAqIENvcHlyaWdodCAyMDAwIGJ5IEhhbnMgUmVpc2VyLCBsaWNlbnNpbmcgZ292ZXJuZWQgYnkgcmVpc2VyZnMvUkVBRE1FCisgKi8KKworLyogcHJvYyBpbmZvIHN1cHBvcnQgYSBsYSBvbmUgY3JlYXRlZCBieSBTaXppZkBCb3Rpay5SVSBmb3IgUEdDICovCisKKy8qICRJZDogcHJvY2ZzLmMsdiAxLjEuOC4yIDIwMDEvMDcvMTUgMTc6MDg6NDIgZ29kIEV4cCAkICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfZnNfc2IuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisKKyNpZiBkZWZpbmVkKCBSRUlTRVJGU19QUk9DX0lORk8gKQorCisvKgorICogTE9DS0lORzoKKyAqCisgKiBXZSByZWx5IG9uIG5ldyBBbGV4YW5kZXIgVmlybydzIHN1cGVyLWJsb2NrIGxvY2tpbmcuCisgKgorICovCisKK3N0YXRpYyBpbnQgc2hvd192ZXJzaW9uKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwljaGFyICpmb3JtYXQ7CisgICAgCisJaWYgKCBSRUlTRVJGU19TQihzYiktPnNfcHJvcGVydGllcyAmICgxIDw8IFJFSVNFUkZTXzNfNikgKSB7CisJCWZvcm1hdCA9ICIzLjYiOworCX0gZWxzZSBpZiAoIFJFSVNFUkZTX1NCKHNiKS0+c19wcm9wZXJ0aWVzICYgKDEgPDwgUkVJU0VSRlNfM181KSApIHsKKwkJZm9ybWF0ID0gIjMuNSI7CisJfSBlbHNlIHsKKwkJZm9ybWF0ID0gInVua25vd24iOworCX0KKworCXNlcV9wcmludGYobSwgIiVzIGZvcm1hdFx0d2l0aCBjaGVja3MgJXNcbiIsCisJCQlmb3JtYXQsCisjaWYgZGVmaW5lZCggQ09ORklHX1JFSVNFUkZTX0NIRUNLICkKKwkJCSJvbiIKKyNlbHNlCisJCQkib2ZmIgorI2VuZGlmCisJCSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCByZWlzZXJmc19nbG9iYWxfdmVyc2lvbl9pbl9wcm9jKCBjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LAorCQkJCSAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSApCit7CisJKnN0YXJ0ID0gYnVmZmVyOworCSplb2YgPSAxOworCXJldHVybiAwOworfQorCisjZGVmaW5lIFNGKCB4ICkgKCByIC0+IHggKQorI2RlZmluZSBTRlAoIHggKSBTRiggc19wcm9jX2luZm9fZGF0YS54ICkKKyNkZWZpbmUgU0ZQTCggeCApIFNGUCggeFsgbGV2ZWwgXSApCisjZGVmaW5lIFNGUEYoIHggKSBTRlAoIHNjYW5fYml0bWFwLnggKQorI2RlZmluZSBTRlBKKCB4ICkgU0ZQKCBqb3VybmFsLnggKQorCisjZGVmaW5lIEQyQyggeCApIGxlMTZfdG9fY3B1KCB4ICkKKyNkZWZpbmUgRDRDKCB4ICkgbGUzMl90b19jcHUoIHggKQorI2RlZmluZSBERiggeCApIEQyQyggcnMgLT4gc192MS54ICkKKyNkZWZpbmUgREZMKCB4ICkgRDRDKCBycyAtPiBzX3YxLnggKQorCisjZGVmaW5lIG9iamVjdGlkX21hcCggcywgcnMgKSAob2xkX2Zvcm1hdF9vbmx5IChzKSA/CQkJCVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoX191MzIgKikoKHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9ja192MSAqKXJzICsgMSkgOglcCisJCQkgKF9fdTMyICopKHJzICsgMSkpCisjZGVmaW5lIE1BUCggaSApIEQ0Qyggb2JqZWN0aWRfbWFwKCBzYiwgcnMgKVsgaSBdICkKKworI2RlZmluZSBESkYoIHggKSBsZTMyX3RvX2NwdSggcnMgLT4geCApCisjZGVmaW5lIERKViggeCApIGxlMzJfdG9fY3B1KCBzX3YxIC0+IHggKQorI2RlZmluZSBESlAoIHggKSBsZTMyX3RvX2NwdSgganAgLT4geCApIAorI2RlZmluZSBKRiggeCApICggciAtPiBzX2pvdXJuYWwgLT4geCApCisKK3N0YXRpYyBpbnQgc2hvd19zdXBlcihzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IHJlaXNlcmZzX3NiX2luZm8gKnIgPSBSRUlTRVJGU19TQihzYik7CisgICAgCisJc2VxX3ByaW50ZihtLAkic3RhdGU6IFx0JXNcbiIKKwkJCSJtb3VudCBvcHRpb25zOiBcdCVzJXMlcyVzJXMlcyVzJXMlcyVzJXNcbiIKKwkJCSJnZW4uIGNvdW50ZXI6IFx0JWlcbiIKKwkJCSJzX2ttYWxsb2NzOiBcdCVpXG4iCisJCQkic19kaXNrX3JlYWRzOiBcdCVpXG4iCisJCQkic19kaXNrX3dyaXRlczogXHQlaVxuIgorCQkJInNfZml4X25vZGVzOiBcdCVpXG4iCisJCQkic19kb19iYWxhbmNlOiBcdCVpXG4iCisJCQkic191bm5lZWRlZF9sZWZ0X25laWdoYm9yOiBcdCVpXG4iCisJCQkic19nb29kX3NlYXJjaF9ieV9rZXlfcmVhZGE6IFx0JWlcbiIKKwkJCSJzX2JtYXBzOiBcdCVpXG4iCisJCQkic19ibWFwc193aXRob3V0X3NlYXJjaDogXHQlaVxuIgorCQkJInNfZGlyZWN0MmluZGlyZWN0OiBcdCVpXG4iCisJCQkic19pbmRpcmVjdDJkaXJlY3Q6IFx0JWlcbiIKKwkJCSJcbiIKKwkJCSJtYXhfaGFzaF9jb2xsaXNpb25zOiBcdCVpXG4iCisKKwkJCSJicmVhZHM6IFx0JWx1XG4iCisJCQkiYnJlYWRfbWlzc2VzOiBcdCVsdVxuIgorCisJCQkic2VhcmNoX2J5X2tleTogXHQlbHVcbiIKKwkJCSJzZWFyY2hfYnlfa2V5X2ZzX2NoYW5nZWQ6IFx0JWx1XG4iCisJCQkic2VhcmNoX2J5X2tleV9yZXN0YXJ0ZWQ6IFx0JWx1XG4iCisJCQkKKwkJCSJpbnNlcnRfaXRlbV9yZXN0YXJ0ZWQ6IFx0JWx1XG4iCisJCQkicGFzdGVfaW50b19pdGVtX3Jlc3RhcnRlZDogXHQlbHVcbiIKKwkJCSJjdXRfZnJvbV9pdGVtX3Jlc3RhcnRlZDogXHQlbHVcbiIKKwkJCSJkZWxldGVfc29saWRfaXRlbV9yZXN0YXJ0ZWQ6IFx0JWx1XG4iCisJCQkiZGVsZXRlX2l0ZW1fcmVzdGFydGVkOiBcdCVsdVxuIgorCisJCQkibGVha2VkX29pZDogXHQlbHVcbiIKKwkJCSJsZWF2ZXNfcmVtb3ZhYmxlOiBcdCVsdVxuIiwKKworCQkJU0YoIHNfbW91bnRfc3RhdGUgKSA9PSBSRUlTRVJGU19WQUxJRF9GUyA/CisJCQkiUkVJU0VSRlNfVkFMSURfRlMiIDogIlJFSVNFUkZTX0VSUk9SX0ZTIiwKKwkJCXJlaXNlcmZzX3I1X2hhc2goIHNiICkgPyAiRk9SQ0VfUjUgIiA6ICIiLAorCQkJcmVpc2VyZnNfcnVwYXNvdl9oYXNoKCBzYiApID8gIkZPUkNFX1JVUEFTT1YgIiA6ICIiLAorCQkJcmVpc2VyZnNfdGVhX2hhc2goIHNiICkgPyAiRk9SQ0VfVEVBICIgOiAiIiwKKwkJCXJlaXNlcmZzX2hhc2hfZGV0ZWN0KCBzYiApID8gIkRFVEVDVF9IQVNIICIgOiAiIiwKKwkJCXJlaXNlcmZzX25vX2JvcmRlciggc2IgKSA/ICJOT19CT1JERVIgIiA6ICJCT1JERVIgIiwKKwkJCXJlaXNlcmZzX25vX3VuaGFzaGVkX3JlbG9jYXRpb24oIHNiICkgPyAiTk9fVU5IQVNIRURfUkVMT0NBVElPTiAiIDogIiIsCisJCQlyZWlzZXJmc19oYXNoZWRfcmVsb2NhdGlvbiggc2IgKSA/ICJVTkhBU0hFRF9SRUxPQ0FUSU9OICIgOiAiIiwKKwkJCXJlaXNlcmZzX3Rlc3Q0KCBzYiApID8gIlRFU1Q0ICIgOiAiIiwKKwkJCWhhdmVfbGFyZ2VfdGFpbHMoIHNiICkgPyAiVEFJTFMgIiA6IGhhdmVfc21hbGxfdGFpbHMoc2IpPyJTTUFMTF9UQUlMUyAiOiJOT19UQUlMUyAiLAorCQkJcmVwbGF5X29ubHkoIHNiICkgPyAiUkVQTEFZX09OTFkgIiA6ICIiLAorCQkJY29udmVydF9yZWlzZXJmcyggc2IgKSA/ICJDT05WICIgOiAiIiwKKworCQkJYXRvbWljX3JlYWQoICZyIC0+IHNfZ2VuZXJhdGlvbl9jb3VudGVyICksCisJCQlTRiggc19rbWFsbG9jcyApLAorCQkJU0YoIHNfZGlza19yZWFkcyApLAorCQkJU0YoIHNfZGlza193cml0ZXMgKSwKKwkJCVNGKCBzX2ZpeF9ub2RlcyApLAorCQkJU0YoIHNfZG9fYmFsYW5jZSApLAorCQkJU0YoIHNfdW5uZWVkZWRfbGVmdF9uZWlnaGJvciApLAorCQkJU0YoIHNfZ29vZF9zZWFyY2hfYnlfa2V5X3JlYWRhICksCisJCQlTRiggc19ibWFwcyApLAorCQkJU0YoIHNfYm1hcHNfd2l0aG91dF9zZWFyY2ggKSwKKwkJCVNGKCBzX2RpcmVjdDJpbmRpcmVjdCApLAorCQkJU0YoIHNfaW5kaXJlY3QyZGlyZWN0ICksCisJCQlTRlAoIG1heF9oYXNoX2NvbGxpc2lvbnMgKSwKKwkJCVNGUCggYnJlYWRzICksCisJCQlTRlAoIGJyZWFkX21pc3MgKSwKKwkJCVNGUCggc2VhcmNoX2J5X2tleSApLAorCQkJU0ZQKCBzZWFyY2hfYnlfa2V5X2ZzX2NoYW5nZWQgKSwKKwkJCVNGUCggc2VhcmNoX2J5X2tleV9yZXN0YXJ0ZWQgKSwKKworCQkJU0ZQKCBpbnNlcnRfaXRlbV9yZXN0YXJ0ZWQgKSwKKwkJCVNGUCggcGFzdGVfaW50b19pdGVtX3Jlc3RhcnRlZCApLAorCQkJU0ZQKCBjdXRfZnJvbV9pdGVtX3Jlc3RhcnRlZCApLAorCQkJU0ZQKCBkZWxldGVfc29saWRfaXRlbV9yZXN0YXJ0ZWQgKSwKKwkJCVNGUCggZGVsZXRlX2l0ZW1fcmVzdGFydGVkICksCisKKwkJCVNGUCggbGVha2VkX29pZCApLAorCQkJU0ZQKCBsZWF2ZXNfcmVtb3ZhYmxlICkgKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNob3dfcGVyX2xldmVsKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfc2JfaW5mbyAqciA9IFJFSVNFUkZTX1NCKHNiKTsKKwlpbnQgbGV2ZWw7CisKKwlzZXFfcHJpbnRmKG0sCSJsZXZlbFx0IgorCQkJIiAgICAgYmFsYW5jZXMiCisJCQkiIFtzYms6ICByZWFkcyIKKwkJCSIgICBmc19jaGFuZ2VkIgorCQkJIiAgIHJlc3RhcnRlZF0iCisJCQkiICAgZnJlZSBzcGFjZSIKKwkJCSIgICAgICAgIGl0ZW1zIgorCQkJIiAgIGNhbl9yZW1vdmUiCisJCQkiICAgICAgICAgbG51bSIKKwkJCSIgICAgICAgICBybnVtIgorCQkJIiAgICAgICBsYnl0ZXMiCisJCQkiICAgICAgIHJieXRlcyIKKwkJCSIgICAgIGdldF9uZWlnIgorCQkJIiBnZXRfbmVpZ19yZXMiCisJCQkiICBuZWVkX2xfbmVpZyIKKwkJCSIgIG5lZWRfcl9uZWlnIgorCQkJIlxuIgorCQkJCisJCSk7CisKKwlmb3IoIGxldmVsID0gMCA7IGxldmVsIDwgTUFYX0hFSUdIVCA7ICsrIGxldmVsICkgeworCQlzZXFfcHJpbnRmKG0sCSIlaVx0IgorCQkJCSIgJTEybHUiCisJCQkJIiAlMTJsdSIKKwkJCQkiICUxMmx1IgorCQkJCSIgJTEybHUiCisJCQkJIiAlMTJsdSIKKwkJCQkiICUxMmx1IgorCQkJCSIgJTEybHUiCisJCQkJIiAlMTJsaSIKKwkJCQkiICUxMmxpIgorCQkJCSIgJTEybGkiCisJCQkJIiAlMTJsaSIKKwkJCQkiICUxMmx1IgorCQkJCSIgJTEybHUiCisJCQkJIiAlMTJsdSIKKwkJCQkiICUxMmx1IgorCQkJCSJcbiIsCisJCQkJbGV2ZWwsIAorCQkJCVNGUEwoIGJhbGFuY2VfYXQgKSwKKwkJCQlTRlBMKCBzYmtfcmVhZF9hdCApLAorCQkJCVNGUEwoIHNia19mc19jaGFuZ2VkICksCisJCQkJU0ZQTCggc2JrX3Jlc3RhcnRlZCApLAorCQkJCVNGUEwoIGZyZWVfYXQgKSwKKwkJCQlTRlBMKCBpdGVtc19hdCApLAorCQkJCVNGUEwoIGNhbl9ub2RlX2JlX3JlbW92ZWQgKSwKKwkJCQlTRlBMKCBsbnVtICksCisJCQkJU0ZQTCggcm51bSApLAorCQkJCVNGUEwoIGxieXRlcyApLAorCQkJCVNGUEwoIHJieXRlcyApLAorCQkJCVNGUEwoIGdldF9uZWlnaGJvcnMgKSwKKwkJCQlTRlBMKCBnZXRfbmVpZ2hib3JzX3Jlc3RhcnQgKSwKKwkJCQlTRlBMKCBuZWVkX2xfbmVpZ2hib3IgKSwKKwkJCQlTRlBMKCBuZWVkX3JfbmVpZ2hib3IgKQorCQkJKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2hvd19iaXRtYXAoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCByZWlzZXJmc19zYl9pbmZvICpyID0gUkVJU0VSRlNfU0Ioc2IpOworCisJc2VxX3ByaW50ZihtLAkiZnJlZV9ibG9jazogJWx1XG4iCisJCQkiICBzY2FuX2JpdG1hcDoiCisJCQkiICAgICAgICAgIHdhaXQiCisJCQkiICAgICAgICAgIGJtYXAiCisJCQkiICAgICAgICAgcmV0cnkiCisJCQkiICAgICAgICBzdG9sZW4iCisJCQkiICBqb3VybmFsX2hpbnQiCisJCQkiam91cm5hbF9ub2hpbnQiCisJCQkiXG4iCisJCQkiICUxNGx1IgorCQkJIiAlMTRsdSIKKwkJCSIgJTE0bHUiCisJCQkiICUxNGx1IgorCQkJIiAlMTRsdSIKKwkJCSIgJTE0bHUiCisJCQkiICUxNGx1IgorCQkJIlxuIiwKKwkJCVNGUCggZnJlZV9ibG9jayApLAorCQkJU0ZQRiggY2FsbCApLCAKKwkJCVNGUEYoIHdhaXQgKSwgCisJCQlTRlBGKCBibWFwICksCisJCQlTRlBGKCByZXRyeSApLAorCQkJU0ZQRiggc3RvbGVuICksCisJCQlTRlBGKCBpbl9qb3VybmFsX2hpbnQgKSwKKwkJCVNGUEYoIGluX2pvdXJuYWxfbm9oaW50ICkgKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNob3dfb25fZGlza19zdXBlcihzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IHJlaXNlcmZzX3NiX2luZm8gKnNiX2luZm8gPSBSRUlTRVJGU19TQihzYik7CisJc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpycyA9IHNiX2luZm8gLT4gc19yczsKKwlpbnQgaGFzaF9jb2RlID0gREZMKCBzX2hhc2hfZnVuY3Rpb25fY29kZSApOworCV9fdTMyIGZsYWdzID0gREpGKCBzX2ZsYWdzICk7CisKKwlzZXFfcHJpbnRmKG0sCSJibG9ja19jb3VudDogXHQlaVxuIgorCQkJImZyZWVfYmxvY2tzOiBcdCVpXG4iCisJCQkicm9vdF9ibG9jazogXHQlaVxuIgorCQkJImJsb2Nrc2l6ZTogXHQlaVxuIgorCQkJIm9pZF9tYXhzaXplOiBcdCVpXG4iCisJCQkib2lkX2N1cnNpemU6IFx0JWlcbiIKKwkJCSJ1bW91bnRfc3RhdGU6IFx0JWlcbiIKKwkJCSJtYWdpYzogXHQlMTAuMTBzXG4iCisJCQkiZnNfc3RhdGU6IFx0JWlcbiIKKwkJCSJoYXNoOiBcdCVzXG4iCisJCQkidHJlZV9oZWlnaHQ6IFx0JWlcbiIKKwkJCSJibWFwX25yOiBcdCVpXG4iCisJCQkidmVyc2lvbjogXHQlaVxuIgorCQkJImZsYWdzOiBcdCV4WyVzXVxuIgorCQkJInJlc2VydmVkX2Zvcl9qb3VybmFsOiBcdCVpXG4iLAorCisJCQlERkwoIHNfYmxvY2tfY291bnQgKSwKKwkJCURGTCggc19mcmVlX2Jsb2NrcyApLAorCQkJREZMKCBzX3Jvb3RfYmxvY2sgKSwKKwkJCURGKCBzX2Jsb2Nrc2l6ZSApLAorCQkJREYoIHNfb2lkX21heHNpemUgKSwKKwkJCURGKCBzX29pZF9jdXJzaXplICksCisJCQlERiggc191bW91bnRfc3RhdGUgKSwKKwkJCXJzIC0+IHNfdjEuc19tYWdpYywKKwkJCURGKCBzX2ZzX3N0YXRlICksCisJCQloYXNoX2NvZGUgPT0gVEVBX0hBU0ggPyAidGVhIiA6CisJCQkoIGhhc2hfY29kZSA9PSBZVVJBX0hBU0ggKSA/ICJydXBhc292IiA6CisJCQkoIGhhc2hfY29kZSA9PSBSNV9IQVNIICkgPyAicjUiIDoKKwkJCSggaGFzaF9jb2RlID09IFVOU0VUX0hBU0ggKSA/ICJ1bnNldCIgOiAidW5rbm93biIsCisJCQlERiggc190cmVlX2hlaWdodCApLAorCQkJREYoIHNfYm1hcF9uciApLAorCQkJREYoIHNfdmVyc2lvbiApLAorCQkJZmxhZ3MsCisJCQkoIGZsYWdzICYgcmVpc2VyZnNfYXR0cnNfY2xlYXJlZCApCisJCQk/ICJhdHRyc19jbGVhcmVkIiA6ICIiLAorCQkJREYgKHNfcmVzZXJ2ZWRfZm9yX2pvdXJuYWwpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNob3dfb2lkbWFwKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgcmVpc2VyZnNfc2JfaW5mbyAqc2JfaW5mbyA9IFJFSVNFUkZTX1NCKHNiKTsKKwlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzID0gc2JfaW5mbyAtPiBzX3JzOworCXVuc2lnbmVkIGludCBtYXBzaXplID0gbGUxNl90b19jcHUoIHJzIC0+IHNfdjEuc19vaWRfY3Vyc2l6ZSApOworCXVuc2lnbmVkIGxvbmcgdG90YWxfdXNlZCA9IDA7CisJaW50IGk7CisKKwlmb3IoIGkgPSAwIDsgaSA8IG1hcHNpemUgOyArK2kgKSB7CisJCV9fdTMyIHJpZ2h0OworCisJCXJpZ2h0ID0gKCBpID09IG1hcHNpemUgLSAxICkgPyBNQVhfS0VZX09CSkVDVElEIDogTUFQKCBpICsgMSApOworCQlzZXFfcHJpbnRmKG0sICIlczogWyAleCAuLiAleCApXG4iLAorCQkJCSggaSAmIDEgKSA/ICJmcmVlIiA6ICJ1c2VkIiwgTUFQKCBpICksIHJpZ2h0ICk7CisJCWlmKCAhICggaSAmIDEgKSApIHsKKwkJCXRvdGFsX3VzZWQgKz0gcmlnaHQgLSBNQVAoIGkgKTsKKwkJfQorCX0KKyNpZiBkZWZpbmVkKCBSRUlTRVJGU19VU0VfT0lETUFQRiApCisJaWYoIHNiX2luZm8gLT4gb2lkbWFwLnVzZV9maWxlICYmICggc2JfaW5mbyAtPiBvaWRtYXAubWFwZiAhPSBOVUxMICkgKSB7CisJCWxvZmZfdCBzaXplID0gc2JfaW5mby0+b2lkbWFwLm1hcGYtPmZfZGVudHJ5LT5kX2lub2RlLT5pX3NpemU7CisJCXRvdGFsX3VzZWQgKz0gc2l6ZSAvIHNpemVvZiggcmVpc2VyZnNfb2lkaW50ZXJ2YWxfZF90ICk7CisJfQorI2VuZGlmCisJc2VxX3ByaW50ZihtLCAidG90YWw6IFx0JWkgWyVpLyVpXSB1c2VkOiAlbHUgW2V4YWN0XVxuIiwgCisJCQltYXBzaXplLCAKKwkJCW1hcHNpemUsIGxlMTZfdG9fY3B1KCBycyAtPiBzX3YxLnNfb2lkX21heHNpemUgKSwKKwkJCXRvdGFsX3VzZWQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNob3dfam91cm5hbChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IHJlaXNlcmZzX3NiX2luZm8gKnIgPSBSRUlTRVJGU19TQihzYik7CisJc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICpycyA9IHIgLT4gc19yczsKKwlzdHJ1Y3Qgam91cm5hbF9wYXJhbXMgKmpwID0gJnJzLT5zX3YxLnNfam91cm5hbDsKKwljaGFyIGJbQkRFVk5BTUVfU0laRV07CisgICAgCisKKwlzZXFfcHJpbnRmKG0sCSAvKiBvbi1kaXNrIGZpZWxkcyAqLworIAkJCSJqcF9qb3VybmFsXzFzdF9ibG9jazogXHQlaVxuIgorIAkJCSJqcF9qb3VybmFsX2RldjogXHQlc1sleF1cbiIKKyAJCQkianBfam91cm5hbF9zaXplOiBcdCVpXG4iCisgCQkJImpwX2pvdXJuYWxfdHJhbnNfbWF4OiBcdCVpXG4iCisgCQkJImpwX2pvdXJuYWxfbWFnaWM6IFx0JWlcbiIKKyAJCQkianBfam91cm5hbF9tYXhfYmF0Y2g6IFx0JWlcbiIKKyAJCQkianBfam91cm5hbF9tYXhfY29tbWl0X2FnZTogXHQlaVxuIgorIAkJCSJqcF9qb3VybmFsX21heF90cmFuc19hZ2U6IFx0JWlcbiIKKwkJCS8qIGluY29yZSBmaWVsZHMgKi8KKwkJCSJqXzFzdF9yZXNlcnZlZF9ibG9jazogXHQlaVxuIgkgIAorCQkJImpfc3RhdGU6IFx0JWxpXG4iCQkJCisJCQkial90cmFuc19pZDogXHQlbHVcbiIKKwkJCSJqX21vdW50X2lkOiBcdCVsdVxuIgorCQkJImpfc3RhcnQ6IFx0JWx1XG4iCisJCQkial9sZW46IFx0JWx1XG4iCisJCQkial9sZW5fYWxsb2M6IFx0JWx1XG4iCisJCQkial93Y291bnQ6IFx0JWlcbiIKKwkJCSJqX2Jjb3VudDogXHQlbHVcbiIKKwkJCSJqX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQ6IFx0JWx1XG4iCisJCQkial9sYXN0X2ZsdXNoX3RyYW5zX2lkOiBcdCVsdVxuIgorCQkJImpfdHJhbnNfc3RhcnRfdGltZTogXHQlbGlcbiIKKwkJCSJqX2xpc3RfYml0bWFwX2luZGV4OiBcdCVpXG4iCisJCQkial9tdXN0X3dhaXQ6IFx0JWlcbiIKKwkJCSJqX25leHRfZnVsbF9mbHVzaDogXHQlaVxuIgorCQkJImpfbmV4dF9hc3luY19mbHVzaDogXHQlaVxuIgorCQkJImpfY25vZGVfdXNlZDogXHQlaVxuIgorCQkJImpfY25vZGVfZnJlZTogXHQlaVxuIgorCQkJIlxuIgorCQkJLyogcmVpc2VyZnNfcHJvY19pbmZvX2RhdGFfdC5qb3VybmFsIGZpZWxkcyAqLworCQkJImluX2pvdXJuYWw6IFx0JTEybHVcbiIKKwkJCSJpbl9qb3VybmFsX2JpdG1hcDogXHQlMTJsdVxuIgorCQkJImluX2pvdXJuYWxfcmV1c2FibGU6IFx0JTEybHVcbiIKKwkJCSJsb2NrX2pvdXJuYWw6IFx0JTEybHVcbiIKKwkJCSJsb2NrX2pvdXJuYWxfd2FpdDogXHQlMTJsdVxuIgorCQkJImpvdXJuYWxfYmVnaW46IFx0JTEybHVcbiIKKwkJCSJqb3VybmFsX3JlbG9ja193cml0ZXJzOiBcdCUxMmx1XG4iCisJCQkiam91cm5hbF9yZWxvY2tfd2NvdW50OiBcdCUxMmx1XG4iCisJCQkibWFya19kaXJ0eTogXHQlMTJsdVxuIgorCQkJIm1hcmtfZGlydHlfYWxyZWFkeTogXHQlMTJsdVxuIgorCQkJIm1hcmtfZGlydHlfbm90am91cm5hbDogXHQlMTJsdVxuIgorCQkJInJlc3RvcmVfcHJlcGFyZWQ6IFx0JTEybHVcbiIKKwkJCSJwcmVwYXJlOiBcdCUxMmx1XG4iCisJCQkicHJlcGFyZV9yZXRyeTogXHQlMTJsdVxuIiwKKworICAgICAgICAgICAgICAgICAgICAgICAgREpQKCBqcF9qb3VybmFsXzFzdF9ibG9jayApLAorICAgICAgICAgICAgICAgICAgICAgICAgYmRldm5hbWUoU0JfSk9VUk5BTChzYiktPmpfZGV2X2JkLCBiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERKUCgganBfam91cm5hbF9kZXYgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERKUCgganBfam91cm5hbF9zaXplICksCisgICAgICAgICAgICAgICAgICAgICAgICBESlAoIGpwX2pvdXJuYWxfdHJhbnNfbWF4ICksCisgICAgICAgICAgICAgICAgICAgICAgICBESlAoIGpwX2pvdXJuYWxfbWFnaWMgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERKUCgganBfam91cm5hbF9tYXhfYmF0Y2ggKSwKKwkJCVNCX0pPVVJOQUwoc2IpLT5qX21heF9jb21taXRfYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgREpQKCBqcF9qb3VybmFsX21heF90cmFuc19hZ2UgKSwKKworCQkJSkYoIGpfMXN0X3Jlc2VydmVkX2Jsb2NrICksCQkJCisJCQlKRiggal9zdGF0ZSApLAkJCQorCQkJSkYoIGpfdHJhbnNfaWQgKSwKKwkJCUpGKCBqX21vdW50X2lkICksCisJCQlKRiggal9zdGFydCApLAorCQkJSkYoIGpfbGVuICksCisJCQlKRiggal9sZW5fYWxsb2MgKSwKKwkJCWF0b21pY19yZWFkKCAmIHIgLT4gc19qb3VybmFsIC0+IGpfd2NvdW50ICksCisJCQlKRiggal9iY291bnQgKSwKKwkJCUpGKCBqX2ZpcnN0X3VuZmx1c2hlZF9vZmZzZXQgKSwKKwkJCUpGKCBqX2xhc3RfZmx1c2hfdHJhbnNfaWQgKSwKKwkJCUpGKCBqX3RyYW5zX3N0YXJ0X3RpbWUgKSwKKwkJCUpGKCBqX2xpc3RfYml0bWFwX2luZGV4ICksCisJCQlKRiggal9tdXN0X3dhaXQgKSwKKwkJCUpGKCBqX25leHRfZnVsbF9mbHVzaCApLAorCQkJSkYoIGpfbmV4dF9hc3luY19mbHVzaCApLAorCQkJSkYoIGpfY25vZGVfdXNlZCApLAorCQkJSkYoIGpfY25vZGVfZnJlZSApLAorCisJCQlTRlBKKCBpbl9qb3VybmFsICksCisJCQlTRlBKKCBpbl9qb3VybmFsX2JpdG1hcCApLAorCQkJU0ZQSiggaW5fam91cm5hbF9yZXVzYWJsZSApLAorCQkJU0ZQSiggbG9ja19qb3VybmFsICksCisJCQlTRlBKKCBsb2NrX2pvdXJuYWxfd2FpdCApLAorCQkJU0ZQSiggam91cm5hbF9iZWluZyApLAorCQkJU0ZQSiggam91cm5hbF9yZWxvY2tfd3JpdGVycyApLAorCQkJU0ZQSiggam91cm5hbF9yZWxvY2tfd2NvdW50ICksCisJCQlTRlBKKCBtYXJrX2RpcnR5ICksCisJCQlTRlBKKCBtYXJrX2RpcnR5X2FscmVhZHkgKSwKKwkJCVNGUEooIG1hcmtfZGlydHlfbm90am91cm5hbCApLAorCQkJU0ZQSiggcmVzdG9yZV9wcmVwYXJlZCApLAorCQkJU0ZQSiggcHJlcGFyZSApLAorCQkJU0ZQSiggcHJlcGFyZV9yZXRyeSApCisJCSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIGl0ZXJhdG9yICovCitzdGF0aWMgaW50IHRlc3Rfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZGF0YSA9PSBzYjsKK30KKworc3RhdGljIGludCBzZXRfc2Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gLUVOT0VOVDsKK30KKworc3RhdGljIHZvaWQgKnJfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlID0gbS0+cHJpdmF0ZTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSBkZS0+cGFyZW50LT5kYXRhOworCWxvZmZfdCBsID0gKnBvczsKKworCWlmIChsKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChJU19FUlIoc2dldCgmcmVpc2VyZnNfZnNfdHlwZSwgdGVzdF9zYiwgc2V0X3NiLCBzKSkpCisJCXJldHVybiBOVUxMOworCisJdXBfd3JpdGUoJnMtPnNfdW1vdW50KTsKKworCWlmIChkZS0+ZGVsZXRlZCkgeworCQlkZWFjdGl2YXRlX3N1cGVyKHMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gczsKK30KKworc3RhdGljIHZvaWQgKnJfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQoreworCSsrKnBvczsKKwlpZiAodikKKwkJZGVhY3RpdmF0ZV9zdXBlcih2KTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgcl9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlpZiAodikKKwkJZGVhY3RpdmF0ZV9zdXBlcih2KTsKK30KKworc3RhdGljIGludCByX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZGUgPSBtLT5wcml2YXRlOworCWludCAoKnNob3cpKHN0cnVjdCBzZXFfZmlsZSAqLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKikgPSBkZS0+ZGF0YTsKKwlyZXR1cm4gc2hvdyhtLCB2KTsKK30KKworc3RhdGljIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyByX29wcyA9IHsKKwkuc3RhcnQgPSByX3N0YXJ0LAorCS5uZXh0ID0gcl9uZXh0LAorCS5zdG9wID0gcl9zdG9wLAorCS5zaG93ID0gcl9zaG93LAorfTsKKworc3RhdGljIGludCByX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IHJldCA9IHNlcV9vcGVuKGZpbGUsICZyX29wcyk7CisKKwlpZiAoIXJldCkgeworCQlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJCW0tPnByaXZhdGUgPSBQREUoaW5vZGUpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSByX29wZW4sCisJLnJlYWQJCT0gc2VxX3JlYWQsCisJLmxsc2VlawkJPSBzZXFfbHNlZWssCisJLnJlbGVhc2UJPSBzZXFfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfaW5mb19yb290ID0gTlVMTDsKK3N0YXRpYyBjb25zdCBjaGFyIHByb2NfaW5mb19yb290X25hbWVbXSA9ICJmcy9yZWlzZXJmcyI7CisKK3N0YXRpYyB2b2lkIGFkZF9maWxlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNoYXIgKm5hbWUsCisJaW50ICgqZnVuYykoc3RydWN0IHNlcV9maWxlICosIHN0cnVjdCBzdXBlcl9ibG9jayAqKSkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlOworCWRlID0gY3JlYXRlX3Byb2NfZW50cnkobmFtZSwgMCwgUkVJU0VSRlNfU0Ioc2IpLT5wcm9jZGlyKTsKKwlpZiAoZGUpIHsKKwkJZGUtPmRhdGEgPSBmdW5jOworCQlkZS0+cHJvY19mb3BzID0gJnJfZmlsZV9vcGVyYXRpb25zOworCX0KK30KKworaW50IHJlaXNlcmZzX3Byb2NfaW5mb19pbml0KCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiICkKK3sKKwlzcGluX2xvY2tfaW5pdCggJiBfX1BJTkZPKCBzYiApLmxvY2sgKTsKKwlSRUlTRVJGU19TQihzYiktPnByb2NkaXIgPSBwcm9jX21rZGlyKHJlaXNlcmZzX2JkZXZuYW1lIChzYiksIHByb2NfaW5mb19yb290KTsKKwlpZiggUkVJU0VSRlNfU0Ioc2IpLT5wcm9jZGlyICkgeworCQlSRUlTRVJGU19TQihzYiktPnByb2NkaXItPm93bmVyID0gVEhJU19NT0RVTEU7CisJCVJFSVNFUkZTX1NCKHNiKS0+cHJvY2Rpci0+ZGF0YSA9IHNiOworCQlhZGRfZmlsZShzYiwgInZlcnNpb24iLCBzaG93X3ZlcnNpb24pOworCQlhZGRfZmlsZShzYiwgInN1cGVyIiwgc2hvd19zdXBlcik7CisJCWFkZF9maWxlKHNiLCAicGVyLWxldmVsIiwgc2hvd19wZXJfbGV2ZWwpOworCQlhZGRfZmlsZShzYiwgImJpdG1hcCIsIHNob3dfYml0bWFwKTsKKwkJYWRkX2ZpbGUoc2IsICJvbi1kaXNrLXN1cGVyIiwgc2hvd19vbl9kaXNrX3N1cGVyKTsKKwkJYWRkX2ZpbGUoc2IsICJvaWRtYXAiLCBzaG93X29pZG1hcCk7CisJCWFkZF9maWxlKHNiLCAiam91cm5hbCIsIHNob3dfam91cm5hbCk7CisJCXJldHVybiAwOworCX0KKwlyZWlzZXJmc193YXJuaW5nKHNiLCAicmVpc2VyZnM6IGNhbm5vdCBjcmVhdGUgL3Byb2MvJXMvJXMiLAorCQkJIHByb2NfaW5mb19yb290X25hbWUsIHJlaXNlcmZzX2JkZXZuYW1lIChzYikgKTsKKwlyZXR1cm4gMTsKK30KKworaW50IHJlaXNlcmZzX3Byb2NfaW5mb19kb25lKCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiICkKK3sKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmRlID0gUkVJU0VSRlNfU0Ioc2IpLT5wcm9jZGlyOworCWlmIChkZSkgeworCQlyZW1vdmVfcHJvY19lbnRyeSgiam91cm5hbCIsIGRlKTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoIm9pZG1hcCIsIGRlKTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoIm9uLWRpc2stc3VwZXIiLCBkZSk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJiaXRtYXAiLCBkZSk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJwZXItbGV2ZWwiLCBkZSk7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCJzdXBlciIsIGRlKTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkoInZlcnNpb24iLCBkZSk7CisJfQorCXNwaW5fbG9jayggJiBfX1BJTkZPKCBzYiApLmxvY2sgKTsKKwlfX1BJTkZPKCBzYiApLmV4aXRpbmcgPSAxOworCXNwaW5fdW5sb2NrKCAmIF9fUElORk8oIHNiICkubG9jayApOworCWlmICggcHJvY19pbmZvX3Jvb3QgKSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KCByZWlzZXJmc19iZGV2bmFtZSAoc2IpLCBwcm9jX2luZm9fcm9vdCApOworCQlSRUlTRVJGU19TQihzYiktPnByb2NkaXIgPSBOVUxMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHByb2NfZGlyX2VudHJ5ICpyZWlzZXJmc19wcm9jX3JlZ2lzdGVyX2dsb2JhbCggY2hhciAqbmFtZSwgCisJCQkJCQkgICAgICByZWFkX3Byb2NfdCAqZnVuYyApCit7CisJcmV0dXJuICggcHJvY19pbmZvX3Jvb3QgKSA/IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoIG5hbWUsIDAsIAorCQkJCQkJCSAgICBwcm9jX2luZm9fcm9vdCwgCisJCQkJCQkJICAgIGZ1bmMsIE5VTEwgKSA6IE5VTEw7Cit9CisKK3ZvaWQgcmVpc2VyZnNfcHJvY191bnJlZ2lzdGVyX2dsb2JhbCggY29uc3QgY2hhciAqbmFtZSApCit7CisJcmVtb3ZlX3Byb2NfZW50cnkoIG5hbWUsIHByb2NfaW5mb19yb290ICk7Cit9CisKK2ludCByZWlzZXJmc19wcm9jX2luZm9fZ2xvYmFsX2luaXQoIHZvaWQgKQoreworCWlmKCBwcm9jX2luZm9fcm9vdCA9PSBOVUxMICkgeworCQlwcm9jX2luZm9fcm9vdCA9IHByb2NfbWtkaXIocHJvY19pbmZvX3Jvb3RfbmFtZSwgTlVMTCk7CisJCWlmKCBwcm9jX2luZm9fcm9vdCApIHsKKwkJCXByb2NfaW5mb19yb290IC0+IG93bmVyID0gVEhJU19NT0RVTEU7CisJCX0gZWxzZSB7CisJCQlyZWlzZXJmc193YXJuaW5nIChOVUxMLAorCQkJCQkgICJyZWlzZXJmczogY2Fubm90IGNyZWF0ZSAvcHJvYy8lcyIsCisJCQkJCSAgcHJvY19pbmZvX3Jvb3RfbmFtZSApOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCByZWlzZXJmc19wcm9jX2luZm9fZ2xvYmFsX2RvbmUoIHZvaWQgKQoreworCWlmICggcHJvY19pbmZvX3Jvb3QgIT0gTlVMTCApIHsKKwkJcHJvY19pbmZvX3Jvb3QgPSBOVUxMOworCQlyZW1vdmVfcHJvY19lbnRyeShwcm9jX2luZm9fcm9vdF9uYW1lLCBOVUxMKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFJFSVNFUkZTX1BST0NfSU5GTyAqLworI2Vsc2UKKworaW50IHJlaXNlcmZzX3Byb2NfaW5mb19pbml0KCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiICkgeyByZXR1cm4gMDsgfQoraW50IHJlaXNlcmZzX3Byb2NfaW5mb19kb25lKCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiICkgeyByZXR1cm4gMDsgfQorCitzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnJlaXNlcmZzX3Byb2NfcmVnaXN0ZXJfZ2xvYmFsKCBjaGFyICpuYW1lLCAKKwkJCQkJCSAgICAgIHJlYWRfcHJvY190ICpmdW5jICkKK3sgcmV0dXJuIE5VTEw7IH0KKwordm9pZCByZWlzZXJmc19wcm9jX3VucmVnaXN0ZXJfZ2xvYmFsKCBjb25zdCBjaGFyICpuYW1lICkgezt9CisKK2ludCByZWlzZXJmc19wcm9jX2luZm9fZ2xvYmFsX2luaXQoIHZvaWQgKSB7IHJldHVybiAwOyB9CitpbnQgcmVpc2VyZnNfcHJvY19pbmZvX2dsb2JhbF9kb25lKCB2b2lkICkgeyByZXR1cm4gMDsgfQorCitpbnQgcmVpc2VyZnNfZ2xvYmFsX3ZlcnNpb25faW5fcHJvYyggY2hhciAqYnVmZmVyLCBjaGFyICoqc3RhcnQsIAorCQkJCSAgICAgb2ZmX3Qgb2Zmc2V0LAorCQkJCSAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSApCit7IHJldHVybiAwOyB9CisKKy8qIFJFSVNFUkZTX1BST0NfSU5GTyAqLworI2VuZGlmCisKKy8qCisgKiAkTG9nOiBwcm9jZnMuYyx2ICQKKyAqIFJldmlzaW9uIDEuMS44LjIgIDIwMDEvMDcvMTUgMTc6MDg6NDIgIGdvZAorICogIC4gdXNlIGdldF9zdXBlcigpIGluIHByb2Nmcy5jCisgKiAgLiByZW1vdmUgcmVtb3ZlX3NhdmVfbGluaygpIGZyb20gcmVpc2VyZnNfZG9fdHJ1bmNhdGUoKQorICoKKyAqIEkgYWNjZXB0IHRlcm1zIGFuZCBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGUgTGVnYWwgQWdyZWVtZW50CisgKiAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubmFtZXN5cy5jb20vbGVnYWxlc2UuaHRtbCkKKyAqCisgKiBSZXZpc2lvbiAxLjEuOC4xICAyMDAxLzA3LzExIDE2OjQ4OjUwICBnb2QKKyAqIHByb2MgaW5mbyBzdXBwb3J0CisgKgorICogSSBhY2NlcHQgdGVybXMgYW5kIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoZSBMZWdhbCBBZ3JlZW1lbnQKKyAqIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5uYW1lc3lzLmNvbS9sZWdhbGVzZS5odG1sKQorICoKKyAqLworCisvKiAKKyAqIE1ha2UgTGludXMgaGFwcHkuCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWluZGVudGF0aW9uLXN0eWxlOiAiSyZSIgorICogbW9kZS1uYW1lOiAiTEMiCisgKiBjLWJhc2ljLW9mZnNldDogOAorICogdGFiLXdpZHRoOiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL3Jlc2l6ZS5jIGIvZnMvcmVpc2VyZnMvcmVzaXplLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcwMDEyMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3JlaXNlcmZzL3Jlc2l6ZS5jCkBAIC0wLDAgKzEsMTgyIEBACisvKiAKKyAqIENvcHlyaWdodCAyMDAwIGJ5IEhhbnMgUmVpc2VyLCBsaWNlbnNpbmcgZ292ZXJuZWQgYnkgcmVpc2VyZnMvUkVBRE1FCisgKi8KKyAKKy8qIAorICogV3JpdHRlbiBieSBBbGV4YW5kZXIgWmFyb2NoZW50Y2V2LgorICoKKyAqIFRoZSBrZXJuZWwgcGFydCBvZiB0aGUgKG9uLWxpbmUpIHJlaXNlcmZzIHJlc2l6ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc19mc19zYi5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisKK2ludCByZWlzZXJmc19yZXNpemUgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIHVuc2lnbmVkIGxvbmcgYmxvY2tfY291bnRfbmV3KQoreworICAgICAgICBpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiBzYjsKKyAgICAgICAgc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9pbmZvICpiaXRtYXA7CisJc3RydWN0IHJlaXNlcmZzX2JpdG1hcF9pbmZvICpvbGRfYml0bWFwID0gU0JfQVBfQklUTUFQKHMpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisJdW5zaWduZWQgaW50IGJtYXBfbnJfbmV3LCBibWFwX25yOworCXVuc2lnbmVkIGludCBibG9ja19yX25ldywgYmxvY2tfcjsKKwkKKwlzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgKiBqYjsKKwlzdHJ1Y3QgcmVpc2VyZnNfbGlzdF9iaXRtYXAgamJpdG1hcFtKT1VSTkFMX05VTV9CSVRNQVBTXTsKKwkKKwl1bnNpZ25lZCBsb25nIGludCBibG9ja19jb3VudCwgZnJlZV9ibG9ja3M7CisJaW50IGk7CisJaW50IGNvcHlfc2l6ZSA7CisKKwlzYiA9IFNCX0RJU0tfU1VQRVJfQkxPQ0socyk7CisKKwlpZiAoU0JfQkxPQ0tfQ09VTlQocykgPj0gYmxvY2tfY291bnRfbmV3KSB7CisJCXByaW50aygiY2FuXCd0IHNocmluayBmaWxlc3lzdGVtIG9uLWxpbmVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBjaGVjayB0aGUgZGV2aWNlIHNpemUgKi8KKwliaCA9IHNiX2JyZWFkKHMsIGJsb2NrX2NvdW50X25ldyAtIDEpOworCWlmICghYmgpIHsKKwkJcHJpbnRrKCJyZWlzZXJmc19yZXNpemU6IGNhblwndCByZWFkIGxhc3QgYmxvY2tcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CQorCWJmb3JnZXQoYmgpOworCisJLyogb2xkIGRpc2sgbGF5b3V0IGRldGVjdGlvbjsgdGhvc2UgcGFydGl0aW9ucyBjYW4gYmUgbW91bnRlZCwgYnV0CisJICogY2Fubm90IGJlIHJlc2l6ZWQgKi8KKwlpZiAoU0JfQlVGRkVSX1dJVEhfU0IocyktPmJfYmxvY2tuciAqCVNCX0JVRkZFUl9XSVRIX1NCKHMpLT5iX3NpemUgCisJCSE9IFJFSVNFUkZTX0RJU0tfT0ZGU0VUX0lOX0JZVEVTICkgeworCQlwcmludGsoInJlaXNlcmZzX3Jlc2l6ZTogdW5hYmxlIHRvIHJlc2l6ZSBhIHJlaXNlcmZzIHdpdGhvdXQgZGlzdHJpYnV0ZWQgYml0bWFwIChmcyB2ZXJzaW9uIDwgMy41LjEyKVxuIik7CisJCXJldHVybiAtRU5PVFNVUFA7CisJfQorICAgICAgIAorCS8qIGNvdW50IHVzZWQgYml0cyBpbiBsYXN0IGJpdG1hcCBibG9jayAqLworCWJsb2NrX3IgPSBTQl9CTE9DS19DT1VOVChzKSAtCisJICAgICAgICAoU0JfQk1BUF9OUihzKSAtIDEpICogcy0+c19ibG9ja3NpemUgKiA4OworCQorCS8qIGNvdW50IGJpdG1hcCBibG9ja3MgaW4gbmV3IGZzICovCisJYm1hcF9ucl9uZXcgPSBibG9ja19jb3VudF9uZXcgLyAoIHMtPnNfYmxvY2tzaXplICogOCApOworCWJsb2NrX3JfbmV3ID0gYmxvY2tfY291bnRfbmV3IC0gYm1hcF9ucl9uZXcgKiBzLT5zX2Jsb2Nrc2l6ZSAqIDg7CisJaWYgKGJsb2NrX3JfbmV3KSAKKwkJYm1hcF9ucl9uZXcrKzsKKwllbHNlCisJCWJsb2NrX3JfbmV3ID0gcy0+c19ibG9ja3NpemUgKiA4OworCisJLyogc2F2ZSBvbGQgdmFsdWVzICovCisJYmxvY2tfY291bnQgPSBTQl9CTE9DS19DT1VOVChzKTsKKwlibWFwX25yICAgICA9IFNCX0JNQVBfTlIocyk7CisKKwkvKiByZXNpemluZyBvZiByZWlzZXJmcyBiaXRtYXBzIChqb3VybmFsIGFuZCByZWFsKSwgaWYgbmVlZGVkICovCisJaWYgKGJtYXBfbnJfbmV3ID4gYm1hcF9ucikgewkgICAgCisJICAgIC8qIHJlYWxsb2NhdGUgam91cm5hbCBiaXRtYXBzICovCisJICAgIGlmIChyZWlzZXJmc19hbGxvY2F0ZV9saXN0X2JpdG1hcHMocywgamJpdG1hcCwgYm1hcF9ucl9uZXcpIDwgMCkgeworCQlwcmludGsoInJlaXNlcmZzX3Jlc2l6ZTogdW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igam91cm5hbCBiaXRtYXBzXG4iKTsKKwkJdW5sb2NrX3N1cGVyKHMpIDsKKwkJcmV0dXJuIC1FTk9NRU0gOworCSAgICB9CisJICAgIC8qIHRoZSBuZXcgam91cm5hbCBiaXRtYXBzIGFyZSB6ZXJvIGZpbGxlZCwgbm93IHdlIGNvcHkgaW4gdGhlIGJpdG1hcAorCSAgICAqKiBub2RlIHBvaW50ZXJzIGZyb20gdGhlIG9sZCBqb3VybmFsIGJpdG1hcCBzdHJ1Y3RzLCBhbmQgdGhlbgorCSAgICAqKiB0cmFuc2ZlciB0aGUgbmV3IGRhdGEgc3RydWN0dXJlcyBpbnRvIHRoZSBqb3VybmFsIHN0cnVjdC4KKwkgICAgKioKKwkgICAgKiogdXNpbmcgdGhlIGNvcHlfc2l6ZSB2YXIgYmVsb3cgYWxsb3dzIHRoaXMgY29kZSB0byB3b3JrIGZvcgorCSAgICAqKiBib3RoIHNocmlua2luZyBhbmQgZXhwYW5kaW5nIHRoZSBGUy4KKwkgICAgKi8KKwkgICAgY29weV9zaXplID0gYm1hcF9ucl9uZXcgPCBibWFwX25yID8gYm1hcF9ucl9uZXcgOiBibWFwX25yIDsKKwkgICAgY29weV9zaXplID0gY29weV9zaXplICogc2l6ZW9mKHN0cnVjdCByZWlzZXJmc19saXN0X2JpdG1hcF9ub2RlICopIDsKKwkgICAgZm9yIChpID0gMCA7IGkgPCBKT1VSTkFMX05VTV9CSVRNQVBTIDsgaSsrKSB7CisJCXN0cnVjdCByZWlzZXJmc19iaXRtYXBfbm9kZSAqKm5vZGVfdG1wIDsKKwkJamIgPSBTQl9KT1VSTkFMKHMpLT5qX2xpc3RfYml0bWFwICsgaSA7CisJCW1lbWNweShqYml0bWFwW2ldLmJpdG1hcHMsIGpiLT5iaXRtYXBzLCBjb3B5X3NpemUpIDsKKworCQkvKiBqdXN0IGluIGNhc2UgdmZyZWUgc2NoZWR1bGVzIG9uIHVzLCBjb3B5IHRoZSBuZXcKKwkJKiogcG9pbnRlciBpbnRvIHRoZSBqb3VybmFsIHN0cnVjdCBiZWZvcmUgZnJlZWluZyB0aGUgCisJCSoqIG9sZCBvbmUKKwkJKi8KKwkJbm9kZV90bXAgPSBqYi0+Yml0bWFwcyA7CisJCWpiLT5iaXRtYXBzID0gamJpdG1hcFtpXS5iaXRtYXBzIDsKKwkJdmZyZWUobm9kZV90bXApIDsKKwkgICAgfQkKKwkKKwkgICAgLyogYWxsb2NhdGUgYWRkaXRpb25hbCBiaXRtYXAgYmxvY2tzLCByZWFsbG9jYXRlIGFycmF5IG9mIGJpdG1hcAorCSAgICAgKiBibG9jayBwb2ludGVycyAqLworCSAgICBiaXRtYXAgPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX2luZm8pICogYm1hcF9ucl9uZXcpOworCSAgICBpZiAoIWJpdG1hcCkgeworCQkvKiBKb3VybmFsIGJpdG1hcHMgYXJlIHN0aWxsIHN1cGVyc2l6ZWQsIGJ1dCB0aGUgbWVtb3J5IGlzbid0CisJCSAqIGxlYWtlZCwgc28gSSBndWVzcyBpdCdzIG9rICovCisJCXByaW50aygicmVpc2VyZnNfcmVzaXplOiB1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5LlxuIik7CisJCXJldHVybiAtRU5PTUVNOworCSAgICB9CisJICAgIG1lbXNldCAoYml0bWFwLCAwLCBzaXplb2YgKHN0cnVjdCByZWlzZXJmc19iaXRtYXBfaW5mbykgKiBTQl9CTUFQX05SKHMpKTsKKwkgICAgZm9yIChpID0gMDsgaSA8IGJtYXBfbnI7IGkrKykKKwkJYml0bWFwW2ldID0gb2xkX2JpdG1hcFtpXTsKKworCSAgICAvKiBUaGlzIGRvZXNuJ3QgZ28gdGhyb3VnaCB0aGUgam91cm5hbCwgYnV0IGl0IGRvZXNuJ3QgaGF2ZSB0by4KKwkgICAgICogVGhlIGNoYW5nZXMgYXJlIHN0aWxsIGF0b21pYzogV2UncmUgc3luY2VkIHVwIHdoZW4gdGhlIGpvdXJuYWwKKwkgICAgICogdHJhbnNhY3Rpb24gYmVnaW5zLCBhbmQgdGhlIG5ldyBiaXRtYXBzIGRvbid0IG1hdHRlciBpZiB0aGUKKwkgICAgICogdHJhbnNhY3Rpb24gZmFpbHMuICovCisJICAgIGZvciAoaSA9IGJtYXBfbnI7IGkgPCBibWFwX25yX25ldzsgaSsrKSB7CisJCWJpdG1hcFtpXS5iaCA9IHNiX2dldGJsayhzLCBpICogcy0+c19ibG9ja3NpemUgKiA4KTsKKwkJbWVtc2V0KGJpdG1hcFtpXS5iaC0+Yl9kYXRhLCAwLCBzYl9ibG9ja3NpemUoc2IpKTsKKwkJcmVpc2VyZnNfdGVzdF9hbmRfc2V0X2xlX2JpdCgwLCBiaXRtYXBbaV0uYmgtPmJfZGF0YSk7CisKKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaXRtYXBbaV0uYmgpOworCQltYXJrX2J1ZmZlcl9kaXJ0eShiaXRtYXBbaV0uYmgpIDsKKwkJc3luY19kaXJ0eV9idWZmZXIoYml0bWFwW2ldLmJoKTsKKwkJLy8gdXBkYXRlIGJpdG1hcF9pbmZvIHN0dWZmCisJCWJpdG1hcFtpXS5maXJzdF96ZXJvX2hpbnQ9MTsKKwkJYml0bWFwW2ldLmZyZWVfY291bnQgPSBzYl9ibG9ja3NpemUoc2IpICogOCAtIDE7CisJICAgIH0JCisJICAgIC8qIGZyZWUgb2xkIGJpdG1hcCBibG9ja3MgYXJyYXkgKi8KKwkgICAgU0JfQVBfQklUTUFQKHMpID0gYml0bWFwOworCSAgICB2ZnJlZSAob2xkX2JpdG1hcCk7CisJfQorCQorCS8qIGJlZ2luIHRyYW5zYWN0aW9uLCBpZiB0aGVyZSB3YXMgYW4gZXJyb3IsIGl0J3MgZmluZS4gWWVzLCB3ZSBoYXZlCisJICogaW5jb3JyZWN0IGJpdG1hcHMgbm93LCBidXQgbm9uZSBvZiBpdCBpcyBldmVyIGdvaW5nIHRvIHRvdWNoIHRoZQorCSAqIGRpc2sgYW55d2F5LiAqLworCWVyciA9IGpvdXJuYWxfYmVnaW4oJnRoLCBzLCAxMCk7CisJaWYgKGVycikKKwkgICAgcmV0dXJuIGVycjsKKworCS8qIGNvcnJlY3QgbGFzdCBiaXRtYXAgYmxvY2tzIGluIG9sZCBhbmQgbmV3IGRpc2sgbGF5b3V0ICovCisJcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBTQl9BUF9CSVRNQVAocylbYm1hcF9uciAtIDFdLmJoLCAxKTsKKwlmb3IgKGkgPSBibG9ja19yOyBpIDwgcy0+c19ibG9ja3NpemUgKiA4OyBpKyspCisJICAgIHJlaXNlcmZzX3Rlc3RfYW5kX2NsZWFyX2xlX2JpdChpLCAKKwkJCQkJICAgU0JfQVBfQklUTUFQKHMpW2JtYXBfbnIgLSAxXS5iaC0+Yl9kYXRhKTsKKwlTQl9BUF9CSVRNQVAocylbYm1hcF9uciAtIDFdLmZyZWVfY291bnQgKz0gcy0+c19ibG9ja3NpemUgKiA4IC0gYmxvY2tfcjsKKwlpZiAoICFTQl9BUF9CSVRNQVAocylbYm1hcF9uciAtIDFdLmZpcnN0X3plcm9faGludCkKKwkgICAgU0JfQVBfQklUTUFQKHMpW2JtYXBfbnIgLSAxXS5maXJzdF96ZXJvX2hpbnQgPSBibG9ja19yOworCisJam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgcywgU0JfQVBfQklUTUFQKHMpW2JtYXBfbnIgLSAxXS5iaCk7CisKKwlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIFNCX0FQX0JJVE1BUChzKVtibWFwX25yX25ldyAtIDFdLmJoLCAxKTsKKwlmb3IgKGkgPSBibG9ja19yX25ldzsgaSA8IHMtPnNfYmxvY2tzaXplICogODsgaSsrKQorCSAgICByZWlzZXJmc190ZXN0X2FuZF9zZXRfbGVfYml0KGksCisJCQkJCSBTQl9BUF9CSVRNQVAocylbYm1hcF9ucl9uZXcgLSAxXS5iaC0+Yl9kYXRhKTsKKwlqb3VybmFsX21hcmtfZGlydHkoJnRoLCBzLCBTQl9BUF9CSVRNQVAocylbYm1hcF9ucl9uZXcgLSAxXS5iaCk7CisgCisJU0JfQVBfQklUTUFQKHMpW2JtYXBfbnJfbmV3IC0gMV0uZnJlZV9jb3VudCAtPSBzLT5zX2Jsb2Nrc2l6ZSAqIDggLSBibG9ja19yX25ldzsKKwkvKiBFeHRyZW1lIGNhc2Ugd2hlcmUgbGFzdCBiaXRtYXAgaXMgdGhlIG9ubHkgdmFsaWQgYmxvY2sgaW4gaXRzZWxmLiAqLworCWlmICggIVNCX0FQX0JJVE1BUChzKVtibWFwX25yX25ldyAtIDFdLmZyZWVfY291bnQgKQorCSAgICBTQl9BUF9CSVRNQVAocylbYm1hcF9ucl9uZXcgLSAxXS5maXJzdF96ZXJvX2hpbnQgPSAwOworIAkvKiB1cGRhdGUgc3VwZXIgKi8KKwlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpLCAxKSA7CisJZnJlZV9ibG9ja3MgPSBTQl9GUkVFX0JMT0NLUyhzKTsKKwlQVVRfU0JfRlJFRV9CTE9DS1MocywgZnJlZV9ibG9ja3MgKyAoYmxvY2tfY291bnRfbmV3IC0gYmxvY2tfY291bnQgLSAoYm1hcF9ucl9uZXcgLSBibWFwX25yKSkpOworCVBVVF9TQl9CTE9DS19DT1VOVChzLCBibG9ja19jb3VudF9uZXcpOworCVBVVF9TQl9CTUFQX05SKHMsIGJtYXBfbnJfbmV3KTsKKwlzLT5zX2RpcnQgPSAxOworCisJam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgcywgU0JfQlVGRkVSX1dJVEhfU0IocykpOworCQorCVNCX0pPVVJOQUwocyktPmpfbXVzdF93YWl0ID0gMTsKKwlyZXR1cm4gam91cm5hbF9lbmQoJnRoLCBzLCAxMCk7Cit9CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9zdHJlZS5jIGIvZnMvcmVpc2VyZnMvc3RyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2VjNTIxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvcmVpc2VyZnMvc3RyZWUuYwpAQCAtMCwwICsxLDIwNzMgQEAKKy8qCisgKiAgQ29weXJpZ2h0IDIwMDAgYnkgSGFucyBSZWlzZXIsIGxpY2Vuc2luZyBnb3Zlcm5lZCBieSByZWlzZXJmcy9SRUFETUUKKyAqLworCisvKgorICogIFdyaXR0ZW4gYnkgQW5hdG9seSBQLiBQaW5jaHVrIHBhcEBuYW1lc3lzLmJvdGlrLnJ1CisgKiAgUHJvZ3JhbW0gU3lzdGVtIEluc3RpdHV0ZQorICogIFBlcmVzbGF2bC1aYWxlc3NreSBSdXNzaWEKKyAqLworCisvKgorICogIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgZGVhbGluZyB3aXRoIFMrdHJlZQorICoKKyAqIEJfSVNfSU5fVFJFRQorICogY29weV9pdGVtX2hlYWQKKyAqIGNvbXBfc2hvcnRfa2V5cworICogY29tcF9rZXlzCisgKiBjb21wX3Nob3J0X2xlX2tleXMKKyAqIGxlX2tleTJjcHVfa2V5CisgKiBjb21wX2xlX2tleXMKKyAqIGJpbl9zZWFyY2gKKyAqIGdldF9sa2V5CisgKiBnZXRfcmtleQorICoga2V5X2luX2J1ZmZlcgorICogZGVjcmVtZW50X2Jjb3VudAorICogZGVjcmVtZW50X2NvdW50ZXJzX2luX3BhdGgKKyAqIHJlaXNlcmZzX2NoZWNrX3BhdGgKKyAqIHBhdGhyZWxzZV9hbmRfcmVzdG9yZQorICogcGF0aHJlbHNlCisgKiBzZWFyY2hfYnlfa2V5X3JlYWRhCisgKiBzZWFyY2hfYnlfa2V5CisgKiBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleQorICogY29tcF9pdGVtcworICogcHJlcGFyZV9mb3JfZGlyZWN0X2l0ZW0KKyAqIHByZXBhcmVfZm9yX2RpcmVudHJ5X2l0ZW0KKyAqIHByZXBhcmVfZm9yX2RlbGV0ZV9vcl9jdXQKKyAqIGNhbGNfZGVsZXRlZF9ieXRlc19udW1iZXIKKyAqIGluaXRfdGJfc3RydWN0CisgKiBwYWRkX2l0ZW0KKyAqIHJlaXNlcmZzX2RlbGV0ZV9pdGVtCisgKiByZWlzZXJmc19kZWxldGVfc29saWRfaXRlbQorICogcmVpc2VyZnNfZGVsZXRlX29iamVjdAorICogbWF5YmVfaW5kaXJlY3RfdG9fZGlyZWN0CisgKiBpbmRpcmVjdF90b19kaXJlY3Rfcm9sbF9iYWNrCisgKiByZWlzZXJmc19jdXRfZnJvbV9pdGVtCisgKiB0cnVuY2F0ZV9kaXJlY3RvcnkKKyAqIHJlaXNlcmZzX2RvX3RydW5jYXRlCisgKiByZWlzZXJmc19wYXN0ZV9pbnRvX2l0ZW0KKyAqIHJlaXNlcmZzX2luc2VydF9pdGVtCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKworLyogRG9lcyB0aGUgYnVmZmVyIGNvbnRhaW4gYSBkaXNrIGJsb2NrIHdoaWNoIGlzIGluIHRoZSB0cmVlLiAqLworaW5saW5lIGludCBCX0lTX0lOX1RSRUUgKGNvbnN0IHN0cnVjdCBidWZmZXJfaGVhZCAqIHBfc19iaCkKK3sKKworICBSRkFMU0UoIEJfTEVWRUwgKHBfc19iaCkgPiBNQVhfSEVJR0hULAorCSAgIlBBUC0xMDEwOiBibG9jayAoJWIpIGhhcyB0b28gYmlnIGxldmVsICgleikiLCBwX3NfYmgsIHBfc19iaCk7CisKKyAgcmV0dXJuICggQl9MRVZFTCAocF9zX2JoKSAhPSBGUkVFX0xFVkVMICk7Cit9CisKKy8vCisvLyB0byBnZXRzIGl0ZW0gaGVhZCBpbiBsZSBmb3JtCisvLworaW5saW5lIHZvaWQgY29weV9pdGVtX2hlYWQoc3RydWN0IGl0ZW1faGVhZCAqIHBfdl90bywgCisJCQkgICBjb25zdCBzdHJ1Y3QgaXRlbV9oZWFkICogcF92X2Zyb20pCit7CisgIG1lbWNweSAocF92X3RvLCBwX3ZfZnJvbSwgSUhfU0laRSk7Cit9CisKKworLyogazEgaXMgcG9pbnRlciB0byBvbi1kaXNrIHN0cnVjdHVyZSB3aGljaCBpcyBzdG9yZWQgaW4gbGl0dGxlLWVuZGlhbgorICAgZm9ybS4gazIgaXMgcG9pbnRlciB0byBjcHUgdmFyaWFibGUuIEZvciBrZXkgb2YgaXRlbXMgb2YgdGhlIHNhbWUKKyAgIG9iamVjdCB0aGlzIHJldHVybnMgMC4KKyAgIFJldHVybnM6IC0xIGlmIGtleTEgPCBrZXkyIAorICAgMCBpZiBrZXkxID09IGtleTIKKyAgIDEgaWYga2V5MSA+IGtleTIgKi8KK2lubGluZSBpbnQgIGNvbXBfc2hvcnRfa2V5cyAoY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqIGxlX2tleSwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGNwdV9rZXkgKiBjcHVfa2V5KQoreworICBfX3UzMiAqIHBfc19sZV91MzIsICogcF9zX2NwdV91MzI7CisgIGludCBuX2tleV9sZW5ndGggPSBSRUlTRVJGU19TSE9SVF9LRVlfTEVOOworCisgIHBfc19sZV91MzIgPSAoX191MzIgKilsZV9rZXk7CisgIHBfc19jcHVfdTMyID0gKF9fdTMyICopJmNwdV9rZXktPm9uX2Rpc2tfa2V5OworICBmb3IoIDsgbl9rZXlfbGVuZ3RoLS07ICsrcF9zX2xlX3UzMiwgKytwX3NfY3B1X3UzMiApIHsKKyAgICBpZiAoIGxlMzJfdG9fY3B1ICgqcF9zX2xlX3UzMikgPCAqcF9zX2NwdV91MzIgKQorICAgICAgcmV0dXJuIC0xOworICAgIGlmICggbGUzMl90b19jcHUgKCpwX3NfbGVfdTMyKSA+ICpwX3NfY3B1X3UzMiApCisgICAgICByZXR1cm4gMTsKKyAgfQorCisgIHJldHVybiAwOworfQorCisKKy8qIGsxIGlzIHBvaW50ZXIgdG8gb24tZGlzayBzdHJ1Y3R1cmUgd2hpY2ggaXMgc3RvcmVkIGluIGxpdHRsZS1lbmRpYW4KKyAgIGZvcm0uIGsyIGlzIHBvaW50ZXIgdG8gY3B1IHZhcmlhYmxlLgorICAgQ29tcGFyZSBrZXlzIHVzaW5nIGFsbCA0IGtleSBmaWVsZHMuCisgICBSZXR1cm5zOiAtMSBpZiBrZXkxIDwga2V5MiAwCisgICBpZiBrZXkxID0ga2V5MiAxIGlmIGtleTEgPiBrZXkyICovCitzdGF0aWMgaW5saW5lIGludCAgY29tcF9rZXlzIChjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICogbGVfa2V5LCBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqIGNwdV9rZXkpCit7CisgIGludCByZXR2YWw7CisKKyAgcmV0dmFsID0gY29tcF9zaG9ydF9rZXlzIChsZV9rZXksIGNwdV9rZXkpOworICBpZiAocmV0dmFsKQorICAgICAgcmV0dXJuIHJldHZhbDsKKyAgaWYgKGxlX2tleV9rX29mZnNldCAobGVfa2V5X3ZlcnNpb24obGVfa2V5KSwgbGVfa2V5KSA8IGNwdV9rZXlfa19vZmZzZXQgKGNwdV9rZXkpKQorICAgICAgcmV0dXJuIC0xOworICBpZiAobGVfa2V5X2tfb2Zmc2V0IChsZV9rZXlfdmVyc2lvbihsZV9rZXkpLCBsZV9rZXkpID4gY3B1X2tleV9rX29mZnNldCAoY3B1X2tleSkpCisgICAgICByZXR1cm4gMTsKKworICBpZiAoY3B1X2tleS0+a2V5X2xlbmd0aCA9PSAzKQorICAgICAgcmV0dXJuIDA7CisKKyAgLyogdGhpcyBwYXJ0IGlzIG5lZWRlZCBvbmx5IHdoZW4gdGFpbCBjb252ZXJzaW9uIGlzIGluIHByb2dyZXNzICovCisgIGlmIChsZV9rZXlfa190eXBlIChsZV9rZXlfdmVyc2lvbihsZV9rZXkpLCBsZV9rZXkpIDwgY3B1X2tleV9rX3R5cGUgKGNwdV9rZXkpKQorICAgIHJldHVybiAtMTsKKworICBpZiAobGVfa2V5X2tfdHlwZSAobGVfa2V5X3ZlcnNpb24obGVfa2V5KSwgbGVfa2V5KSA+IGNwdV9rZXlfa190eXBlIChjcHVfa2V5KSkKKyAgICByZXR1cm4gMTsKKworICByZXR1cm4gMDsKK30KKworCitpbmxpbmUgaW50IGNvbXBfc2hvcnRfbGVfa2V5cyAoY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAqIGtleTEsIGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXkyKQoreworICBfX3UzMiAqIHBfc18xX3UzMiwgKiBwX3NfMl91MzI7CisgIGludCBuX2tleV9sZW5ndGggPSBSRUlTRVJGU19TSE9SVF9LRVlfTEVOOworCisgIHBfc18xX3UzMiA9IChfX3UzMiAqKWtleTE7CisgIHBfc18yX3UzMiA9IChfX3UzMiAqKWtleTI7CisgIGZvciggOyBuX2tleV9sZW5ndGgtLTsgKytwX3NfMV91MzIsICsrcF9zXzJfdTMyICkgeworICAgIGlmICggbGUzMl90b19jcHUgKCpwX3NfMV91MzIpIDwgbGUzMl90b19jcHUgKCpwX3NfMl91MzIpICkKKyAgICAgIHJldHVybiAtMTsKKyAgICBpZiAoIGxlMzJfdG9fY3B1ICgqcF9zXzFfdTMyKSA+IGxlMzJfdG9fY3B1ICgqcF9zXzJfdTMyKSApCisgICAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW5saW5lIHZvaWQgbGVfa2V5MmNwdV9rZXkgKHN0cnVjdCBjcHVfa2V5ICogdG8sIGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKiBmcm9tKQoreworICAgIHRvLT5vbl9kaXNrX2tleS5rX2Rpcl9pZCA9IGxlMzJfdG9fY3B1IChmcm9tLT5rX2Rpcl9pZCk7CisgICAgdG8tPm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQgPSBsZTMyX3RvX2NwdSAoZnJvbS0+a19vYmplY3RpZCk7CisgICAgCisgICAgLy8gZmluZCBvdXQgdmVyc2lvbiBvZiB0aGUga2V5CisgICAgdG8tPnZlcnNpb24gPSBsZV9rZXlfdmVyc2lvbiAoZnJvbSk7CisgICAgaWYgKHRvLT52ZXJzaW9uID09IEtFWV9GT1JNQVRfM181KSB7CisJdG8tPm9uX2Rpc2tfa2V5LnUua19vZmZzZXRfdjEua19vZmZzZXQgPSBsZTMyX3RvX2NwdSAoZnJvbS0+dS5rX29mZnNldF92MS5rX29mZnNldCk7CisJdG8tPm9uX2Rpc2tfa2V5LnUua19vZmZzZXRfdjEua191bmlxdWVuZXNzID0gbGUzMl90b19jcHUgKGZyb20tPnUua19vZmZzZXRfdjEua191bmlxdWVuZXNzKTsKKyAgICB9IGVsc2UgeworCXRvLT5vbl9kaXNrX2tleS51Lmtfb2Zmc2V0X3YyLmtfb2Zmc2V0ID0gb2Zmc2V0X3YyX2tfb2Zmc2V0KCZmcm9tLT51Lmtfb2Zmc2V0X3YyKTsKKwl0by0+b25fZGlza19rZXkudS5rX29mZnNldF92Mi5rX3R5cGUgPSBvZmZzZXRfdjJfa190eXBlKCZmcm9tLT51Lmtfb2Zmc2V0X3YyKTsKKyAgICB9IAorfQorCisKKworLy8gdGhpcyBkb2VzIG5vdCBzYXkgd2hpY2ggb25lIGlzIGJpZ2dlciwgaXQgb25seSByZXR1cm5zIDEgaWYga2V5cworLy8gYXJlIG5vdCBlcXVhbCwgMCBvdGhlcndpc2UKK2lubGluZSBpbnQgY29tcF9sZV9rZXlzIChjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICogazEsIGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgKiBrMikKK3sKKyAgICByZXR1cm4gbWVtY21wIChrMSwgazIsIHNpemVvZiAoc3RydWN0IHJlaXNlcmZzX2tleSkpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBCaW5hcnkgc2VhcmNoIHRvb2xraXQgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogIFNlYXJjaCBmb3IgYW4gaXRlbSBpbiB0aGUgYXJyYXkgYnkgdGhlIGl0ZW0ga2V5ICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgUmV0dXJuczogICAgMSBpZiBmb3VuZCwgIDAgaWYgbm90IGZvdW5kOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAqcF9uX3BvcyA9IG51bWJlciBvZiB0aGUgc2VhcmNoZWQgZWxlbWVudCBpZiBmb3VuZCwgZWxzZSB0aGUgICAgKgorICogICAgICAgIG51bWJlciBvZiB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGlzIGxhcmdlciB0aGFuIHBfdl9rZXkuICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGb3IgdGhvc2Ugbm90IGZhbWlsaWFyIHdpdGggYmluYXJ5IHNlYXJjaDogbl9sYm91bmQgaXMgdGhlIGxlZnRtb3N0IGl0ZW0gdGhhdCBpdAorIGNvdWxkIGJlLCBuX3Jib3VuZCB0aGUgcmlnaHRtb3N0IGl0ZW0gdGhhdCBpdCBjb3VsZCBiZS4gIFdlIGV4YW1pbmUgdGhlIGl0ZW0KKyBoYWxmd2F5IGJldHdlZW4gbl9sYm91bmQgYW5kIG5fcmJvdW5kLCBhbmQgdGhhdCB0ZWxscyB1cyBlaXRoZXIgdGhhdCB3ZSBjYW4gaW5jcmVhc2UKKyBuX2xib3VuZCwgb3IgZGVjcmVhc2Ugbl9yYm91bmQsIG9yIHRoYXQgd2UgaGF2ZSBmb3VuZCBpdCwgb3IgaWYgbl9sYm91bmQgPD0gbl9yYm91bmQgdGhhdAorIHRoZXJlIGFyZSBubyBwb3NzaWJsZSBpdGVtcywgYW5kIHdlIGhhdmUgbm90IGZvdW5kIGl0LiBXaXRoIGVhY2ggZXhhbWluYXRpb24gd2UKKyBjdXQgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBpdGVtcyBpdCBjb3VsZCBiZSBieSBvbmUgbW9yZSB0aGFuIGhhbGYgcm91bmRlZCBkb3duLAorIG9yIHdlIGZpbmQgaXQuICovCitzdGF0aWMgaW5saW5lCWludCBiaW5fc2VhcmNoICgKKyAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqIHBfdl9rZXksIC8qIEtleSB0byBzZWFyY2ggZm9yLiAgICAgICAgICAgICAgICAgICAqLworCSAgICAgIGNvbnN0IHZvaWQgKiBwX3ZfYmFzZSwvKiBGaXJzdCBpdGVtIGluIHRoZSBhcnJheS4gICAgICAgICAgICAgKi8KKwkgICAgICBpbnQgICAgICAgcF9uX251bSwgICAgLyogTnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBhcnJheS4gICAgICAgICovCisJICAgICAgaW50ICAgICAgIHBfbl93aWR0aCwgIC8qIEl0ZW0gc2l6ZSBpbiB0aGUgYXJyYXkuCisJCQkJICAgICAgIHNlYXJjaGVkLiBMZXN0IHRoZSByZWFkZXIgYmUKKwkJCQkgICAgICAgY29uZnVzZWQsIG5vdGUgdGhhdCB0aGlzIGlzIGNyYWZ0ZWQKKwkJCQkgICAgICAgYXMgYSBnZW5lcmFsIGZ1bmN0aW9uLCBhbmQgd2hlbiBpdAorCQkJCSAgICAgICBpcyBhcHBsaWVkIHNwZWNpZmljYWxseSB0byB0aGUgYXJyYXkKKwkJCQkgICAgICAgb2YgaXRlbSBoZWFkZXJzIGluIGEgbm9kZSwgcF9uX3dpZHRoCisJCQkJICAgICAgIGlzIGFjdHVhbGx5IHRoZSBpdGVtIGhlYWRlciBzaXplIG5vdAorCQkJCSAgICAgICB0aGUgaXRlbSBzaXplLiAgICAgICAgICAgICAgICAgICAgICAqLworCSAgICAgIGludCAgICAgKiBwX25fcG9zICAgICAvKiBOdW1iZXIgb2YgdGhlIHNlYXJjaGVkIGZvciBlbGVtZW50LiAqLworICAgICAgICAgICAgKSB7CisgICAgaW50ICAgbl9yYm91bmQsIG5fbGJvdW5kLCBuX2o7CisKKyAgIGZvciAoIG5faiA9ICgobl9yYm91bmQgPSBwX25fbnVtIC0gMSkgKyAobl9sYm91bmQgPSAwKSkvMjsgbl9sYm91bmQgPD0gbl9yYm91bmQ7IG5faiA9IChuX3Jib3VuZCArIG5fbGJvdW5kKS8yICkKKyAgICAgc3dpdGNoKCBjb21wX2tleXMoKHN0cnVjdCByZWlzZXJmc19rZXkgKikoKGNoYXIgKiApcF92X2Jhc2UgKyBuX2ogKiBwX25fd2lkdGgpLCAoc3RydWN0IGNwdV9rZXkgKilwX3Zfa2V5KSApICB7CisgICAgIGNhc2UgLTE6IG5fbGJvdW5kID0gbl9qICsgMTsgY29udGludWU7CisgICAgIGNhc2UgIDE6IG5fcmJvdW5kID0gbl9qIC0gMTsgY29udGludWU7CisgICAgIGNhc2UgIDA6ICpwX25fcG9zID0gbl9qOyAgICAgcmV0dXJuIElURU1fRk9VTkQ7IC8qIEtleSBmb3VuZCBpbiB0aGUgYXJyYXkuICAqLworICAgICAgICB9CisKKyAgICAvKiBiaW5fc2VhcmNoIGRpZCBub3QgZmluZCBnaXZlbiBrZXksIGl0IHJldHVybnMgcG9zaXRpb24gb2Yga2V5LAorICAgICAgICB0aGF0IGlzIG1pbmltYWwgYW5kIGdyZWF0ZXIgdGhhbiB0aGUgZ2l2ZW4gb25lLiAqLworICAgICpwX25fcG9zID0gbl9sYm91bmQ7CisgICAgcmV0dXJuIElURU1fTk9UX0ZPVU5EOworfQorCisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCitleHRlcm4gc3RydWN0IHRyZWVfYmFsYW5jZSAqIGN1cl90YjsKKyNlbmRpZgorCisKKworLyogTWluaW1hbCBwb3NzaWJsZSBrZXkuIEl0IGlzIG5ldmVyIGluIHRoZSB0cmVlLiAqLworY29uc3Qgc3RydWN0IHJlaXNlcmZzX2tleSAgTUlOX0tFWSA9IHswLCAwLCB7ezAsIDB9LH19OworCisvKiBNYXhpbWFsIHBvc3NpYmxlIGtleS4gSXQgaXMgbmV2ZXIgaW4gdGhlIHRyZWUuICovCitjb25zdCBzdHJ1Y3QgcmVpc2VyZnNfa2V5ICBNQVhfS0VZID0gezB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIHt7MHhmZmZmZmZmZiwgMHhmZmZmZmZmZn0sfX07CisKKworLyogR2V0IGRlbGltaXRpbmcga2V5IG9mIHRoZSBidWZmZXIgYnkgbG9va2luZyBmb3IgaXQgaW4gdGhlIGJ1ZmZlcnMgaW4gdGhlIHBhdGgsIHN0YXJ0aW5nIGZyb20gdGhlIGJvdHRvbQorICAgb2YgdGhlIHBhdGgsIGFuZCBnb2luZyB1cHdhcmRzLiAgV2UgbXVzdCBjaGVjayB0aGUgcGF0aCdzIHZhbGlkaXR5IGF0IGVhY2ggc3RlcC4gIElmIHRoZSBrZXkgaXMgbm90IGluCisgICB0aGUgcGF0aCwgdGhlcmUgaXMgbm8gZGVsaW1pdGluZyBrZXkgaW4gdGhlIHRyZWUgKGJ1ZmZlciBpcyBmaXJzdCBvciBsYXN0IGJ1ZmZlciBpbiB0cmVlKSwgYW5kIGluIHRoaXMKKyAgIGNhc2Ugd2UgcmV0dXJuIGEgc3BlY2lhbCBrZXksIGVpdGhlciBNSU5fS0VZIG9yIE1BWF9LRVkuICovCitzdGF0aWMgaW5saW5lCWNvbnN0IHN0cnVjdCAgcmVpc2VyZnNfa2V5ICogZ2V0X2xrZXkgICgKKwkgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHBhdGggICAgICAgICAqIHBfc19jaGtfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jayAgKiBwX3Nfc2IKKyAgICAgICAgICAgICAgICAgICAgICApIHsKKyAgaW50ICAgICAgICAgICAgICAgICAgIG5fcG9zaXRpb24sIG5fcGF0aF9vZmZzZXQgPSBwX3NfY2hrX3BhdGgtPnBhdGhfbGVuZ3RoOworICBzdHJ1Y3QgYnVmZmVyX2hlYWQgICogcF9zX3BhcmVudDsKKyAgCisgIFJGQUxTRSggbl9wYXRoX29mZnNldCA8IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQsIAorCSAgIlBBUC01MDEwOiBpbnZhbGlkIG9mZnNldCBpbiB0aGUgcGF0aCIpOworCisgIC8qIFdoaWxlIG5vdCBoaWdoZXIgaW4gcGF0aCB0aGFuIGZpcnN0IGVsZW1lbnQuICovCisgIHdoaWxlICggbl9wYXRoX29mZnNldC0tID4gRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCApIHsKKworICAgIFJGQUxTRSggISBidWZmZXJfdXB0b2RhdGUoUEFUSF9PRkZTRVRfUEJVRkZFUihwX3NfY2hrX3BhdGgsIG5fcGF0aF9vZmZzZXQpKSwKKwkgICAgIlBBUC01MDIwOiBwYXJlbnQgaXMgbm90IHVwdG9kYXRlIik7CisKKyAgICAvKiBQYXJlbnQgYXQgdGhlIHBhdGggaXMgbm90IGluIHRoZSB0cmVlIG5vdy4gKi8KKyAgICBpZiAoICEgQl9JU19JTl9UUkVFKHBfc19wYXJlbnQgPSBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19jaGtfcGF0aCwgbl9wYXRoX29mZnNldCkpICkKKyAgICAgIHJldHVybiAmTUFYX0tFWTsKKyAgICAvKiBDaGVjayB3aGV0aGVyIHBvc2l0aW9uIGluIHRoZSBwYXJlbnQgaXMgY29ycmVjdC4gKi8KKyAgICBpZiAoIChuX3Bvc2l0aW9uID0gUEFUSF9PRkZTRVRfUE9TSVRJT04ocF9zX2Noa19wYXRoLCBuX3BhdGhfb2Zmc2V0KSkgPiBCX05SX0lURU1TKHBfc19wYXJlbnQpICkKKyAgICAgICByZXR1cm4gJk1BWF9LRVk7CisgICAgLyogQ2hlY2sgd2hldGhlciBwYXJlbnQgYXQgdGhlIHBhdGggcmVhbGx5IHBvaW50cyB0byB0aGUgY2hpbGQuICovCisgICAgaWYgKCBCX05fQ0hJTERfTlVNKHBfc19wYXJlbnQsIG5fcG9zaXRpb24pICE9CisJIFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX2Noa19wYXRoLCBuX3BhdGhfb2Zmc2V0ICsgMSktPmJfYmxvY2tuciApCisgICAgICByZXR1cm4gJk1BWF9LRVk7CisgICAgLyogUmV0dXJuIGRlbGltaXRpbmcga2V5IGlmIHBvc2l0aW9uIGluIHRoZSBwYXJlbnQgaXMgbm90IGVxdWFsIHRvIHplcm8uICovCisgICAgaWYgKCBuX3Bvc2l0aW9uICkKKyAgICAgIHJldHVybiBCX05fUERFTElNX0tFWShwX3NfcGFyZW50LCBuX3Bvc2l0aW9uIC0gMSk7CisgIH0KKyAgLyogUmV0dXJuIE1JTl9LRVkgaWYgd2UgYXJlIGluIHRoZSByb290IG9mIHRoZSBidWZmZXIgdHJlZS4gKi8KKyAgaWYgKCBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19jaGtfcGF0aCwgRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCktPmJfYmxvY2tuciA9PQorICAgICAgIFNCX1JPT1RfQkxPQ0sgKHBfc19zYikgKQorICAgIHJldHVybiAmTUlOX0tFWTsKKyAgcmV0dXJuICAmTUFYX0tFWTsKK30KKworCisvKiBHZXQgZGVsaW1pdGluZyBrZXkgb2YgdGhlIGJ1ZmZlciBhdCB0aGUgcGF0aCBhbmQgaXRzIHJpZ2h0IG5laWdoYm9yLiAqLworaW5saW5lCWNvbnN0IHN0cnVjdCAgcmVpc2VyZnNfa2V5ICogZ2V0X3JrZXkgICgKKwkgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHBhdGggICAgICAgICAqIHBfc19jaGtfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBzdXBlcl9ibG9jayAgKiBwX3Nfc2IKKyAgICAgICAgICAgICAgICAgICAgICApIHsKKyAgaW50ICAgICAgICAgICAgICAgICAgIG5fcG9zaXRpb24sCisgICAgCQkJbl9wYXRoX29mZnNldCA9IHBfc19jaGtfcGF0aC0+cGF0aF9sZW5ndGg7CisgIHN0cnVjdCBidWZmZXJfaGVhZCAgKiBwX3NfcGFyZW50OworCisgIFJGQUxTRSggbl9wYXRoX29mZnNldCA8IEZJUlNUX1BBVEhfRUxFTUVOVF9PRkZTRVQsCisJICAiUEFQLTUwMzA6IGludmFsaWQgb2Zmc2V0IGluIHRoZSBwYXRoIik7CisKKyAgd2hpbGUgKCBuX3BhdGhfb2Zmc2V0LS0gPiBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VUICkgeworCisgICAgUkZBTFNFKCAhIGJ1ZmZlcl91cHRvZGF0ZShQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19jaGtfcGF0aCwgbl9wYXRoX29mZnNldCkpLAorCSAgICAiUEFQLTUwNDA6IHBhcmVudCBpcyBub3QgdXB0b2RhdGUiKTsKKworICAgIC8qIFBhcmVudCBhdCB0aGUgcGF0aCBpcyBub3QgaW4gdGhlIHRyZWUgbm93LiAqLworICAgIGlmICggISBCX0lTX0lOX1RSRUUocF9zX3BhcmVudCA9IFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX2Noa19wYXRoLCBuX3BhdGhfb2Zmc2V0KSkgKQorICAgICAgcmV0dXJuICZNSU5fS0VZOworICAgIC8qIENoZWNrIHdoZXRoZXIgcG9zaXRpb24gaW4gdGhlIHBhcmVudCBpcyBjb3JyZWN0LiAqLworICAgIGlmICggKG5fcG9zaXRpb24gPSBQQVRIX09GRlNFVF9QT1NJVElPTihwX3NfY2hrX3BhdGgsIG5fcGF0aF9vZmZzZXQpKSA+IEJfTlJfSVRFTVMocF9zX3BhcmVudCkgKQorICAgICAgcmV0dXJuICZNSU5fS0VZOworICAgIC8qIENoZWNrIHdoZXRoZXIgcGFyZW50IGF0IHRoZSBwYXRoIHJlYWxseSBwb2ludHMgdG8gdGhlIGNoaWxkLiAqLworICAgIGlmICggQl9OX0NISUxEX05VTShwX3NfcGFyZW50LCBuX3Bvc2l0aW9uKSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBVEhfT0ZGU0VUX1BCVUZGRVIocF9zX2Noa19wYXRoLCBuX3BhdGhfb2Zmc2V0ICsgMSktPmJfYmxvY2tuciApCisgICAgICByZXR1cm4gJk1JTl9LRVk7CisgICAgLyogUmV0dXJuIGRlbGltaXRpbmcga2V5IGlmIHBvc2l0aW9uIGluIHRoZSBwYXJlbnQgaXMgbm90IHRoZSBsYXN0IG9uZS4gKi8KKyAgICBpZiAoIG5fcG9zaXRpb24gIT0gQl9OUl9JVEVNUyhwX3NfcGFyZW50KSApCisgICAgICByZXR1cm4gQl9OX1BERUxJTV9LRVkocF9zX3BhcmVudCwgbl9wb3NpdGlvbik7CisgIH0KKyAgLyogUmV0dXJuIE1BWF9LRVkgaWYgd2UgYXJlIGluIHRoZSByb290IG9mIHRoZSBidWZmZXIgdHJlZS4gKi8KKyAgaWYgKCBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19jaGtfcGF0aCwgRklSU1RfUEFUSF9FTEVNRU5UX09GRlNFVCktPmJfYmxvY2tuciA9PQorICAgICAgIFNCX1JPT1RfQkxPQ0sgKHBfc19zYikgKQorICAgIHJldHVybiAmTUFYX0tFWTsKKyAgcmV0dXJuICAmTUlOX0tFWTsKK30KKworCisvKiBDaGVjayB3aGV0aGVyIGEga2V5IGlzIGNvbnRhaW5lZCBpbiB0aGUgdHJlZSByb290ZWQgZnJvbSBhIGJ1ZmZlciBhdCBhIHBhdGguICovCisvKiBUaGlzIHdvcmtzIGJ5IGxvb2tpbmcgYXQgdGhlIGxlZnQgYW5kIHJpZ2h0IGRlbGltaXRpbmcga2V5cyBmb3IgdGhlIGJ1ZmZlciBpbiB0aGUgbGFzdCBwYXRoX2VsZW1lbnQgaW4KKyAgIHRoZSBwYXRoLiAgVGhlc2UgZGVsaW1pdGluZyBrZXlzIGFyZSBzdG9yZWQgYXQgbGVhc3Qgb25lIGxldmVsIGFib3ZlIHRoYXQgYnVmZmVyIGluIHRoZSB0cmVlLiBJZiB0aGUKKyAgIGJ1ZmZlciBpcyB0aGUgZmlyc3Qgb3IgbGFzdCBub2RlIGluIHRoZSB0cmVlIG9yZGVyIHRoZW4gb25lIG9mIHRoZSBkZWxpbWl0aW5nIGtleXMgbWF5IGJlIGFic2VudCwgYW5kIGluCisgICB0aGlzIGNhc2UgZ2V0X2xrZXkgYW5kIGdldF9ya2V5IHJldHVybiBhIHNwZWNpYWwga2V5IHdoaWNoIGlzIE1JTl9LRVkgb3IgTUFYX0tFWS4gKi8KK3N0YXRpYyAgaW5saW5lICBpbnQga2V5X2luX2J1ZmZlciAoCisgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHBhdGggICAgICAgICAqIHBfc19jaGtfcGF0aCwgLyogUGF0aCB3aGljaCBzaG91bGQgYmUgY2hlY2tlZC4gICovCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGNwdV9rZXkgICAgICAqIHBfc19rZXksICAgICAgLyogS2V5IHdoaWNoIHNob3VsZCBiZSBjaGVja2VkLiAgICovCisgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN1cGVyX2Jsb2NrICAqIHBfc19zYiAgICAgICAgLyogU3VwZXIgYmxvY2sgcG9pbnRlci4gICAgICAgICAgICovCisJCSAgICAgICkgeworCisgIFJGQUxTRSggISBwX3Nfa2V5IHx8IHBfc19jaGtfcGF0aC0+cGF0aF9sZW5ndGggPCBGSVJTVF9QQVRIX0VMRU1FTlRfT0ZGU0VUIHx8CisJICBwX3NfY2hrX3BhdGgtPnBhdGhfbGVuZ3RoID4gTUFYX0hFSUdIVCwKKwkgICJQQVAtNTA1MDogcG9pbnRlciB0byB0aGUga2V5KCVwKSBpcyBOVUxMIG9yIGludmFsaWQgcGF0aCBsZW5ndGgoJWQpIiwKKwkgIHBfc19rZXksIHBfc19jaGtfcGF0aC0+cGF0aF9sZW5ndGgpOworICBSRkFMU0UoICFQQVRIX1BMQVNUX0JVRkZFUihwX3NfY2hrX3BhdGgpLT5iX2JkZXYsCisJICAiUEFQLTUwNjA6IGRldmljZSBtdXN0IG5vdCBiZSBOT0RFViIpOworCisgIGlmICggY29tcF9rZXlzKGdldF9sa2V5KHBfc19jaGtfcGF0aCwgcF9zX3NiKSwgcF9zX2tleSkgPT0gMSApCisgICAgLyogbGVmdCBkZWxpbWl0aW5nIGtleSBpcyBiaWdnZXIsIHRoYXQgdGhlIGtleSB3ZSBsb29rIGZvciAqLworICAgIHJldHVybiAwOworICAvLyAgaWYgKCBjb21wX2tleXMocF9zX2tleSwgZ2V0X3JrZXkocF9zX2Noa19wYXRoLCBwX3Nfc2IpKSAhPSAtMSApCisgIGlmICggY29tcF9rZXlzKGdldF9ya2V5KHBfc19jaGtfcGF0aCwgcF9zX3NiKSwgcF9zX2tleSkgIT0gMSApCisgICAgLyogcF9zX2tleSBtdXN0IGJlIGxlc3MgdGhhbiByaWdodCBkZWxpbWl0aWluZyBrZXkgKi8KKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIDE7Cit9CisKKworaW5saW5lIHZvaWQgZGVjcmVtZW50X2Jjb3VudCgKKyAgICAgICAgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICAqIHBfc19iaAorICAgICAgICAgICAgKSB7IAorICBpZiAoIHBfc19iaCApIHsKKyAgICBpZiAoIGF0b21pY19yZWFkICgmKHBfc19iaC0+Yl9jb3VudCkpICkgeworICAgICAgcHV0X2JoKHBfc19iaCkgOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICByZWlzZXJmc19wYW5pYyhOVUxMLCAiUEFQLTUwNzA6IGRlY3JlbWVudF9iY291bnQ6IHRyeWluZyB0byBmcmVlIGZyZWUgYnVmZmVyICViIiwgcF9zX2JoKTsKKyAgfQorfQorCisKKy8qIERlY3JlbWVudCBiX2NvdW50IGZpZWxkIG9mIHRoZSBhbGwgYnVmZmVycyBpbiB0aGUgcGF0aC4gKi8KK3ZvaWQgZGVjcmVtZW50X2NvdW50ZXJzX2luX3BhdGggKAorICAgICAgICAgICAgICBzdHJ1Y3QgcGF0aCAqIHBfc19zZWFyY2hfcGF0aAorICAgICAgICAgICAgKSB7CisgIGludCBuX3BhdGhfb2Zmc2V0ID0gcF9zX3NlYXJjaF9wYXRoLT5wYXRoX2xlbmd0aDsKKworICBSRkFMU0UoIG5fcGF0aF9vZmZzZXQgPCBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQgfHwKKwkgIG5fcGF0aF9vZmZzZXQgPiBFWFRFTkRFRF9NQVhfSEVJR0hUIC0gMSwKKwkgICJQQVAtNTA4MDogaW52YWxpZCBwYXRoIG9mZnNldCBvZiAlZCIsIG5fcGF0aF9vZmZzZXQpOworCisgIHdoaWxlICggbl9wYXRoX29mZnNldCA+IElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCApIHsKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKworICAgIGJoID0gUEFUSF9PRkZTRVRfUEJVRkZFUihwX3Nfc2VhcmNoX3BhdGgsIG5fcGF0aF9vZmZzZXQtLSk7CisgICAgZGVjcmVtZW50X2Jjb3VudCAoYmgpOworICB9CisgIHBfc19zZWFyY2hfcGF0aC0+cGF0aF9sZW5ndGggPSBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQ7Cit9CisKKworaW50IHJlaXNlcmZzX2NoZWNrX3BhdGgoc3RydWN0IHBhdGggKnApIHsKKyAgUkZBTFNFKCBwLT5wYXRoX2xlbmd0aCAhPSBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQsCisJICAicGF0aCBub3QgcHJvcGVybHkgcmVsc2VkIikgOworICByZXR1cm4gMCA7Cit9CisKKworLyogUmVsZWFzZSBhbGwgYnVmZmVycyBpbiB0aGUgcGF0aC4gUmVzdG9yZSBkaXJ0eSBiaXRzIGNsZWFuCisqKiB3aGVuIHByZXBhcmluZyB0aGUgYnVmZmVyIGZvciB0aGUgbG9nCisqKgorKiogb25seSBjYWxsZWQgZnJvbSBmaXhfbm9kZXMoKQorKi8KK3ZvaWQgIHBhdGhyZWxzZV9hbmRfcmVzdG9yZSAoCisJc3RydWN0IHN1cGVyX2Jsb2NrICpzLCAKKyAgICAgICAgc3RydWN0IHBhdGggKiBwX3Nfc2VhcmNoX3BhdGgKKyAgICAgICkgeworICBpbnQgbl9wYXRoX29mZnNldCA9IHBfc19zZWFyY2hfcGF0aC0+cGF0aF9sZW5ndGg7CisKKyAgUkZBTFNFKCBuX3BhdGhfb2Zmc2V0IDwgSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VULCAKKwkgICJjbG0tNDAwMDogaW52YWxpZCBwYXRoIG9mZnNldCIpOworICAKKyAgd2hpbGUgKCBuX3BhdGhfb2Zmc2V0ID4gSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUICkgIHsKKyAgICByZWlzZXJmc19yZXN0b3JlX3ByZXBhcmVkX2J1ZmZlcihzLCBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19zZWFyY2hfcGF0aCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9wYXRoX29mZnNldCkpOworICAgIGJyZWxzZShQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19zZWFyY2hfcGF0aCwgbl9wYXRoX29mZnNldC0tKSk7CisgIH0KKyAgcF9zX3NlYXJjaF9wYXRoLT5wYXRoX2xlbmd0aCA9IElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVDsKK30KKworLyogUmVsZWFzZSBhbGwgYnVmZmVycyBpbiB0aGUgcGF0aC4gKi8KK3ZvaWQgIHBhdGhyZWxzZSAoCisgICAgICAgIHN0cnVjdCBwYXRoICogcF9zX3NlYXJjaF9wYXRoCisgICAgICApIHsKKyAgaW50IG5fcGF0aF9vZmZzZXQgPSBwX3Nfc2VhcmNoX3BhdGgtPnBhdGhfbGVuZ3RoOworCisgIFJGQUxTRSggbl9wYXRoX29mZnNldCA8IElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVCwKKwkgICJQQVAtNTA5MDogaW52YWxpZCBwYXRoIG9mZnNldCIpOworICAKKyAgd2hpbGUgKCBuX3BhdGhfb2Zmc2V0ID4gSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUICkgIAorICAgIGJyZWxzZShQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19zZWFyY2hfcGF0aCwgbl9wYXRoX29mZnNldC0tKSk7CisKKyAgcF9zX3NlYXJjaF9wYXRoLT5wYXRoX2xlbmd0aCA9IElMTEVHQUxfUEFUSF9FTEVNRU5UX09GRlNFVDsKK30KKworCisKK3N0YXRpYyBpbnQgaXNfbGVhZiAoY2hhciAqIGJ1ZiwgaW50IGJsb2Nrc2l6ZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpCit7CisgICAgc3RydWN0IGJsb2NrX2hlYWQgKiBibGtoOworICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKKyAgICBpbnQgdXNlZF9zcGFjZTsKKyAgICBpbnQgcHJldl9sb2NhdGlvbjsKKyAgICBpbnQgaTsKKyAgICBpbnQgbnI7CisKKyAgICBibGtoID0gKHN0cnVjdCBibG9ja19oZWFkICopYnVmOworICAgIGlmICggYmxraF9sZXZlbChibGtoKSAhPSBESVNLX0xFQUZfTk9ERV9MRVZFTCkgeworCXJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJpc19sZWFmOiB0aGlzIHNob3VsZCBiZSBjYXVnaHQgZWFybGllciIpOworCXJldHVybiAwOworICAgIH0KKworICAgIG5yID0gYmxraF9ucl9pdGVtKGJsa2gpOworICAgIGlmIChuciA8IDEgfHwgbnIgPiAoKGJsb2Nrc2l6ZSAtIEJMS0hfU0laRSkgLyAoSUhfU0laRSArIE1JTl9JVEVNX0xFTikpKSB7CisJLyogaXRlbSBudW1iZXIgaXMgdG9vIGJpZyBvciB0b28gc21hbGwgKi8KKwlyZWlzZXJmc193YXJuaW5nIChOVUxMLCAiaXNfbGVhZjogbnJfaXRlbSBzZWVtcyB3cm9uZzogJXoiLCBiaCk7CisJcmV0dXJuIDA7CisgICAgfQorICAgIGloID0gKHN0cnVjdCBpdGVtX2hlYWQgKikoYnVmICsgQkxLSF9TSVpFKSArIG5yIC0gMTsKKyAgICB1c2VkX3NwYWNlID0gQkxLSF9TSVpFICsgSUhfU0laRSAqIG5yICsgKGJsb2Nrc2l6ZSAtIGloX2xvY2F0aW9uIChpaCkpOworICAgIGlmICh1c2VkX3NwYWNlICE9IGJsb2Nrc2l6ZSAtIGJsa2hfZnJlZV9zcGFjZShibGtoKSkgeworCS8qIGZyZWUgc3BhY2UgZG9lcyBub3QgbWF0Y2ggdG8gY2FsY3VsYXRlZCBhbW91bnQgb2YgdXNlIHNwYWNlICovCisJcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImlzX2xlYWY6IGZyZWUgc3BhY2Ugc2VlbXMgd3Jvbmc6ICV6IiwgYmgpOworCXJldHVybiAwOworICAgIH0KKworICAgIC8vIEZJWE1FOiBpdCBpc19sZWFmIHdpbGwgaGl0IHBlcmZvcm1hbmNlIHRvbyBtdWNoIC0gd2UgbWF5IGhhdmUKKyAgICAvLyByZXR1cm4gMSBoZXJlCisKKyAgICAvKiBjaGVjayB0YWJsZXMgb2YgaXRlbSBoZWFkcyAqLworICAgIGloID0gKHN0cnVjdCBpdGVtX2hlYWQgKikoYnVmICsgQkxLSF9TSVpFKTsKKyAgICBwcmV2X2xvY2F0aW9uID0gYmxvY2tzaXplOworICAgIGZvciAoaSA9IDA7IGkgPCBucjsgaSArKywgaWggKyspIHsKKwlpZiAoIGxlX2loX2tfdHlwZShpaCkgPT0gVFlQRV9BTlkpIHsKKwkgICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImlzX2xlYWY6IHdyb25nIGl0ZW0gdHlwZSBmb3IgaXRlbSAlaCIsaWgpOworCSAgICByZXR1cm4gMDsKKwl9CisJaWYgKGloX2xvY2F0aW9uIChpaCkgPj0gYmxvY2tzaXplIHx8IGloX2xvY2F0aW9uIChpaCkgPCBJSF9TSVpFICogbnIpIHsKKwkgICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImlzX2xlYWY6IGl0ZW0gbG9jYXRpb24gc2VlbXMgd3Jvbmc6ICVoIiwgaWgpOworCSAgICByZXR1cm4gMDsKKwl9CisJaWYgKGloX2l0ZW1fbGVuIChpaCkgPCAxIHx8IGloX2l0ZW1fbGVuIChpaCkgPiBNQVhfSVRFTV9MRU4gKGJsb2Nrc2l6ZSkpIHsKKwkgICAgcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImlzX2xlYWY6IGl0ZW0gbGVuZ3RoIHNlZW1zIHdyb25nOiAlaCIsIGloKTsKKwkgICAgcmV0dXJuIDA7CisJfQorCWlmIChwcmV2X2xvY2F0aW9uIC0gaWhfbG9jYXRpb24gKGloKSAhPSBpaF9pdGVtX2xlbiAoaWgpKSB7CisJICAgIHJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJpc19sZWFmOiBpdGVtIGxvY2F0aW9uIHNlZW1zIHdyb25nIChzZWNvbmQgb25lKTogJWgiLCBpaCk7CisJICAgIHJldHVybiAwOworCX0KKwlwcmV2X2xvY2F0aW9uID0gaWhfbG9jYXRpb24gKGloKTsKKyAgICB9CisKKyAgICAvLyBvbmUgbWF5IGltYWdpbmUgbXVjaCBtb3JlIGNoZWNrcworICAgIHJldHVybiAxOworfQorCisKKy8qIHJldHVybnMgMSBpZiBidWYgbG9va3MgbGlrZSBhbiBpbnRlcm5hbCBub2RlLCAwIG90aGVyd2lzZSAqLworc3RhdGljIGludCBpc19pbnRlcm5hbCAoY2hhciAqIGJ1ZiwgaW50IGJsb2Nrc2l6ZSwgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmgpCit7CisgICAgc3RydWN0IGJsb2NrX2hlYWQgKiBibGtoOworICAgIGludCBucjsKKyAgICBpbnQgdXNlZF9zcGFjZTsKKworICAgIGJsa2ggPSAoc3RydWN0IGJsb2NrX2hlYWQgKilidWY7CisgICAgbnIgPSBibGtoX2xldmVsKGJsa2gpOworICAgIGlmIChuciA8PSBESVNLX0xFQUZfTk9ERV9MRVZFTCB8fCBuciA+IE1BWF9IRUlHSFQpIHsKKwkvKiB0aGlzIGxldmVsIGlzIG5vdCBwb3NzaWJsZSBmb3IgaW50ZXJuYWwgbm9kZXMgKi8KKwlyZWlzZXJmc193YXJuaW5nIChOVUxMLCAiaXNfaW50ZXJuYWw6IHRoaXMgc2hvdWxkIGJlIGNhdWdodCBlYXJsaWVyIik7CisJcmV0dXJuIDA7CisgICAgfQorICAgIAorICAgIG5yID0gYmxraF9ucl9pdGVtKGJsa2gpOworICAgIGlmIChuciA+IChibG9ja3NpemUgLSBCTEtIX1NJWkUgLSBEQ19TSVpFKSAvIChLRVlfU0laRSArIERDX1NJWkUpKSB7CisJLyogZm9yIGludGVybmFsIHdoaWNoIGlzIG5vdCByb290IHdlIG1pZ2h0IGNoZWNrIG1pbiBudW1iZXIgb2Yga2V5cyAqLworCXJlaXNlcmZzX3dhcm5pbmcgKE5VTEwsICJpc19pbnRlcm5hbDogbnVtYmVyIG9mIGtleSBzZWVtcyB3cm9uZzogJXoiLCBiaCk7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgdXNlZF9zcGFjZSA9IEJMS0hfU0laRSArIEtFWV9TSVpFICogbnIgKyBEQ19TSVpFICogKG5yICsgMSk7CisgICAgaWYgKHVzZWRfc3BhY2UgIT0gYmxvY2tzaXplIC0gYmxraF9mcmVlX3NwYWNlKGJsa2gpKSB7CisJcmVpc2VyZnNfd2FybmluZyAoTlVMTCwgImlzX2ludGVybmFsOiBmcmVlIHNwYWNlIHNlZW1zIHdyb25nOiAleiIsIGJoKTsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyBvbmUgbWF5IGltYWdpbmUgbXVjaCBtb3JlIGNoZWNrcworICAgIHJldHVybiAxOworfQorCisKKy8vIG1ha2Ugc3VyZSB0aGF0IGJoIGNvbnRhaW5zIGZvcm1hdHRlZCBub2RlIG9mIHJlaXNlcmZzIHRyZWUgb2YKKy8vICdsZXZlbCctdGggbGV2ZWwKK3N0YXRpYyBpbnQgaXNfdHJlZV9ub2RlIChzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaCwgaW50IGxldmVsKQoreworICAgIGlmIChCX0xFVkVMIChiaCkgIT0gbGV2ZWwpIHsKKwlyZWlzZXJmc193YXJuaW5nIChOVUxMLCAiaXNfdHJlZV9ub2RlOiBub2RlIGxldmVsICVkIGRvZXMgbm90IG1hdGNoIHRvIHRoZSBleHBlY3RlZCBvbmUgJWQiLAorCQlCX0xFVkVMIChiaCksIGxldmVsKTsKKwlyZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKGxldmVsID09IERJU0tfTEVBRl9OT0RFX0xFVkVMKQorCXJldHVybiBpc19sZWFmIChiaC0+Yl9kYXRhLCBiaC0+Yl9zaXplLCBiaCk7CisKKyAgICByZXR1cm4gaXNfaW50ZXJuYWwgKGJoLT5iX2RhdGEsIGJoLT5iX3NpemUsIGJoKTsKK30KKworCisKKyNkZWZpbmUgU0VBUkNIX0JZX0tFWV9SRUFEQSAxNgorCisvKiBUaGUgZnVuY3Rpb24gaXMgTk9UIFNDSEVEVUxFLVNBRkUhICovCitzdGF0aWMgdm9pZCBzZWFyY2hfYnlfa2V5X3JlYWRhIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgsCisJCQkJIHVuc2lnbmVkIGxvbmcgKmIsIGludCBudW0pCit7CisgICAgaW50IGksajsKKyAgCisgICAgZm9yIChpID0gMCA7IGkgPCBudW0gOyBpKyspIHsKKwliaFtpXSA9IHNiX2dldGJsayAocywgYltpXSk7CisgICAgfQorICAgIGZvciAoaiA9IDAgOyBqIDwgaSA7IGorKykgeworCS8qCisJICogbm90ZSwgdGhpcyBuZWVkcyBhdHRlbnRpb24gaWYgd2UgYXJlIGdldHRpbmcgcmlkIG9mIHRoZSBCS0wKKwkgKiB5b3UgaGF2ZSB0byBtYWtlIHN1cmUgdGhlIHByZXBhcmVkIGJpdCBpc24ndCBzZXQgb24gdGhpcyBidWZmZXIKKwkgKi8KKwlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShiaFtqXSkpCisJICAgIGxsX3J3X2Jsb2NrKFJFQURBLCAxLCBiaCArIGopOworICAgIAlicmVsc2UoYmhbal0pOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBBbGdvcml0aG0gICBTZWFyY2hCeUtleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqICAgICAgICAgICAgIGxvb2sgZm9yIGl0ZW0gaW4gdGhlIERpc2sgUytUcmVlIGJ5IGl0cyBrZXkgICAgICAgICAgICAgICAgKgorICogSW5wdXQ6ICBwX3Nfc2IgICAtICBzdXBlciBibG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiAgICAgICAgIHBfc19rZXkgIC0gcG9pbnRlciB0byB0aGUga2V5IHRvIHNlYXJjaCAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIE91dHB1dDogSVRFTV9GT1VORCwgSVRFTV9OT1RfRk9VTkQgb3IgSU9fRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogICAgICAgICBwX3Nfc2VhcmNoX3BhdGggLSBwYXRoIGZyb20gdGhlIHJvb3QgdG8gdGhlIG5lZWRlZCBsZWFmICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoaXMgZnVuY3Rpb24gZmlsbHMgdXAgdGhlIHBhdGggZnJvbSB0aGUgcm9vdCB0byB0aGUgbGVhZiBhcyBpdAorICAgZGVzY2VuZHMgdGhlIHRyZWUgbG9va2luZyBmb3IgdGhlIGtleS4gIEl0IHVzZXMgcmVpc2VyZnNfYnJlYWQgdG8KKyAgIHRyeSB0byBmaW5kIGJ1ZmZlcnMgaW4gdGhlIGNhY2hlIGdpdmVuIHRoZWlyIGJsb2NrIG51bWJlci4gIElmIGl0CisgICBkb2VzIG5vdCBmaW5kIHRoZW0gaW4gdGhlIGNhY2hlIGl0IHJlYWRzIHRoZW0gZnJvbSBkaXNrLiAgRm9yIGVhY2gKKyAgIG5vZGUgc2VhcmNoX2J5X2tleSBmaW5kcyB1c2luZyByZWlzZXJmc19icmVhZCBpdCB0aGVuIHVzZXMKKyAgIGJpbl9zZWFyY2ggdG8gbG9vayB0aHJvdWdoIHRoYXQgbm9kZS4gIGJpbl9zZWFyY2ggd2lsbCBmaW5kIHRoZQorICAgcG9zaXRpb24gb2YgdGhlIGJsb2NrX251bWJlciBvZiB0aGUgbmV4dCBub2RlIGlmIGl0IGlzIGxvb2tpbmcKKyAgIHRocm91Z2ggYW4gaW50ZXJuYWwgbm9kZS4gIElmIGl0IGlzIGxvb2tpbmcgdGhyb3VnaCBhIGxlYWYgbm9kZQorICAgYmluX3NlYXJjaCB3aWxsIGZpbmQgdGhlIHBvc2l0aW9uIG9mIHRoZSBpdGVtIHdoaWNoIGhhcyBrZXkgZWl0aGVyCisgICBlcXVhbCB0byBnaXZlbiBrZXksIG9yIHdoaWNoIGlzIHRoZSBtYXhpbWFsIGtleSBsZXNzIHRoYW4gdGhlIGdpdmVuCisgICBrZXkuICBzZWFyY2hfYnlfa2V5IHJldHVybnMgYSBwYXRoIHRoYXQgbXVzdCBiZSBjaGVja2VkIGZvciB0aGUKKyAgIGNvcnJlY3RuZXNzIG9mIHRoZSB0b3Agb2YgdGhlIHBhdGggYnV0IG5lZWQgbm90IGJlIGNoZWNrZWQgZm9yIHRoZQorICAgY29ycmVjdG5lc3Mgb2YgdGhlIGJvdHRvbSBvZiB0aGUgcGF0aCAqLworLyogVGhlIGZ1bmN0aW9uIGlzIE5PVCBTQ0hFRFVMRS1TQUZFISAqLworaW50IHNlYXJjaF9ieV9rZXkgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHBfc19zYiwKKwkJICAgY29uc3Qgc3RydWN0IGNwdV9rZXkgKiBwX3Nfa2V5LCAvKiBLZXkgdG8gc2VhcmNoLiAqLworCQkgICBzdHJ1Y3QgcGF0aCAqIHBfc19zZWFyY2hfcGF0aCwgLyogVGhpcyBzdHJ1Y3R1cmUgd2FzCisJCQkJCQkgICAgIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQKKwkJCQkJCSAgICAgYnkgdGhlIGNhbGxpbmcKKwkJCQkJCSAgICAgZnVuY3Rpb24uIEl0IGlzIGZpbGxlZCB1cAorCQkJCQkJICAgICBieSB0aGlzIGZ1bmN0aW9uLiAgKi8KKwkJICAgaW50IG5fc3RvcF9sZXZlbCAvKiBIb3cgZmFyIGRvd24gdGhlIHRyZWUgdG8gc2VhcmNoLiBUbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcCBhdCBsZWFmIGxldmVsIC0gc2V0IHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVNLX0xFQUZfTk9ERV9MRVZFTCAqLworICAgICkgeworICAgIGludCAgbl9ibG9ja19udW1iZXI7CisgICAgaW50ICBleHBlY3RlZF9sZXZlbDsKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgICogICAgICAgcF9zX2JoOworICAgIHN0cnVjdCBwYXRoX2VsZW1lbnQgKiAgICAgICBwX3NfbGFzdF9lbGVtZW50OworICAgIGludAkJCQluX25vZGVfbGV2ZWwsIG5fcmV0dmFsOworICAgIGludCAJCQlyaWdodF9uZWlnaGJvcl9vZl9sZWFmX25vZGU7CisgICAgaW50CQkJCWZzX2dlbjsKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnJlYWRhX2JoW1NFQVJDSF9CWV9LRVlfUkVBREFdOworICAgIHVuc2lnbmVkIGxvbmcgICAgICByZWFkYV9ibG9ja3NbU0VBUkNIX0JZX0tFWV9SRUFEQV07CisgICAgaW50IHJlYWRhX2NvdW50ID0gMDsKKworI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSworICAgIGludCBuX3JlcGVhdF9jb3VudGVyID0gMDsKKyNlbmRpZgorICAgIAorICAgIFBST0NfSU5GT19JTkMoIHBfc19zYiwgc2VhcmNoX2J5X2tleSApOworICAgIAorICAgIC8qIEFzIHdlIGFkZCBlYWNoIG5vZGUgdG8gYSBwYXRoIHdlIGluY3JlYXNlIGl0cyBjb3VudC4gIFRoaXMgbWVhbnMgdGhhdAorICAgICAgIHdlIG11c3QgYmUgY2FyZWZ1bCB0byByZWxlYXNlIGFsbCBub2RlcyBpbiBhIHBhdGggYmVmb3JlIHdlIGVpdGhlcgorICAgICAgIGRpc2NhcmQgdGhlIHBhdGggc3RydWN0IG9yIHJlLXVzZSB0aGUgcGF0aCBzdHJ1Y3QsIGFzIHdlIGRvIGhlcmUuICovCisKKyAgICBkZWNyZW1lbnRfY291bnRlcnNfaW5fcGF0aChwX3Nfc2VhcmNoX3BhdGgpOworCisgICAgcmlnaHRfbmVpZ2hib3Jfb2ZfbGVhZl9ub2RlID0gMDsKKworICAgIC8qIFdpdGggZWFjaCBpdGVyYXRpb24gb2YgdGhpcyBsb29wIHdlIHNlYXJjaCB0aHJvdWdoIHRoZSBpdGVtcyBpbiB0aGUKKyAgICAgICBjdXJyZW50IG5vZGUsIGFuZCBjYWxjdWxhdGUgdGhlIG5leHQgY3VycmVudCBub2RlKG5leHQgcGF0aCBlbGVtZW50KQorICAgICAgIGZvciB0aGUgbmV4dCBpdGVyYXRpb24gb2YgdGhpcyBsb29wLi4gKi8KKyAgICBuX2Jsb2NrX251bWJlciA9IFNCX1JPT1RfQkxPQ0sgKHBfc19zYik7CisgICAgZXhwZWN0ZWRfbGV2ZWwgPSAtMTsKKyAgICB3aGlsZSAoIDEgKSB7CisKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKwlpZiAoICEoKytuX3JlcGVhdF9jb3VudGVyICUgNTAwMDApICkKKwkgICAgcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAiUEFQLTUxMDA6IHNlYXJjaF9ieV9rZXk6ICVzOiIKKwkJCSAgICAgICJ0aGVyZSB3ZXJlICVkIGl0ZXJhdGlvbnMgb2Ygd2hpbGUgbG9vcCAiCisJCQkgICAgICAibG9va2luZyBmb3Iga2V5ICVLIiwKKwkJCSAgICAgIGN1cnJlbnQtPmNvbW0sIG5fcmVwZWF0X2NvdW50ZXIsIHBfc19rZXkpOworI2VuZGlmCisKKwkvKiBwcmVwIHBhdGggdG8gaGF2ZSBhbm90aGVyIGVsZW1lbnQgYWRkZWQgdG8gaXQuICovCisJcF9zX2xhc3RfZWxlbWVudCA9IFBBVEhfT0ZGU0VUX1BFTEVNRU5UKHBfc19zZWFyY2hfcGF0aCwgKytwX3Nfc2VhcmNoX3BhdGgtPnBhdGhfbGVuZ3RoKTsKKwlmc19nZW4gPSBnZXRfZ2VuZXJhdGlvbiAocF9zX3NiKTsKKworCS8qIFJlYWQgdGhlIG5leHQgdHJlZSBub2RlLCBhbmQgc2V0IHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIHBhdGggdG8KKyAgICAgICAgICAgaGF2ZSBhIHBvaW50ZXIgdG8gaXQuICovCisJaWYgKChwX3NfYmggPSBwX3NfbGFzdF9lbGVtZW50LT5wZV9idWZmZXIgPQorCSAgICAgc2JfZ2V0YmxrKHBfc19zYiwgbl9ibG9ja19udW1iZXIpKSApIHsKKwkgICAgaWYgKCFidWZmZXJfdXB0b2RhdGUocF9zX2JoKSAmJiByZWFkYV9jb3VudCA+IDEpIHsKKwkJc2VhcmNoX2J5X2tleV9yZWFkYSAocF9zX3NiLCByZWFkYV9iaCwKKwkJICAgICAgICAgICAgICAgICAgICAgcmVhZGFfYmxvY2tzLCByZWFkYV9jb3VudCk7CisJICAgIH0KKwkgICAgbGxfcndfYmxvY2soUkVBRCwgMSwgJnBfc19iaCk7CisJICAgIHdhaXRfb25fYnVmZmVyKHBfc19iaCk7CisJICAgIGlmICghYnVmZmVyX3VwdG9kYXRlKHBfc19iaCkpCisJICAgICAgICBnb3RvIGlvX2Vycm9yOworCX0gZWxzZSB7Citpb19lcnJvcjoKKwkgICAgcF9zX3NlYXJjaF9wYXRoLT5wYXRoX2xlbmd0aCAtLTsKKwkgICAgcGF0aHJlbHNlKHBfc19zZWFyY2hfcGF0aCk7CisJICAgIHJldHVybiBJT19FUlJPUjsKKwl9CisJcmVhZGFfY291bnQgPSAwOworCWlmIChleHBlY3RlZF9sZXZlbCA9PSAtMSkKKwkJZXhwZWN0ZWRfbGV2ZWwgPSBTQl9UUkVFX0hFSUdIVCAocF9zX3NiKTsKKwlleHBlY3RlZF9sZXZlbCAtLTsKKworCS8qIEl0IGlzIHBvc3NpYmxlIHRoYXQgc2NoZWR1bGUgb2NjdXJyZWQuIFdlIG11c3QgY2hlY2sgd2hldGhlciB0aGUga2V5CisJICAgdG8gc2VhcmNoIGlzIHN0aWxsIGluIHRoZSB0cmVlIHJvb3RlZCBmcm9tIHRoZSBjdXJyZW50IGJ1ZmZlci4gSWYKKwkgICBub3QgdGhlbiByZXBlYXQgc2VhcmNoIGZyb20gdGhlIHJvb3QuICovCisJaWYgKCBmc19jaGFuZ2VkIChmc19nZW4sIHBfc19zYikgJiYgCisJICAgICghQl9JU19JTl9UUkVFIChwX3NfYmgpIHx8CisJICAgICBCX0xFVkVMKHBfc19iaCkgIT0gZXhwZWN0ZWRfbGV2ZWwgfHwKKwkgICAgICFrZXlfaW5fYnVmZmVyKHBfc19zZWFyY2hfcGF0aCwgcF9zX2tleSwgcF9zX3NiKSkpIHsKKwkgICAgUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBzZWFyY2hfYnlfa2V5X2ZzX2NoYW5nZWQgKTsKKwkgICAgUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBzZWFyY2hfYnlfa2V5X3Jlc3RhcnRlZCApOworCSAgICBQUk9DX0lORk9fSU5DKCBwX3Nfc2IsIHNia19yZXN0YXJ0ZWRbIGV4cGVjdGVkX2xldmVsIC0gMSBdICk7CisJICAgIGRlY3JlbWVudF9jb3VudGVyc19pbl9wYXRoKHBfc19zZWFyY2hfcGF0aCk7CisJICAgIAorCSAgICAvKiBHZXQgdGhlIHJvb3QgYmxvY2sgbnVtYmVyIHNvIHRoYXQgd2UgY2FuIHJlcGVhdCB0aGUgc2VhcmNoCisJICAgICAgIHN0YXJ0aW5nIGZyb20gdGhlIHJvb3QuICovCisJICAgIG5fYmxvY2tfbnVtYmVyID0gU0JfUk9PVF9CTE9DSyAocF9zX3NiKTsKKwkgICAgZXhwZWN0ZWRfbGV2ZWwgPSAtMTsKKwkgICAgcmlnaHRfbmVpZ2hib3Jfb2ZfbGVhZl9ub2RlID0gMDsKKwkgICAgCisJICAgIC8qIHJlcGVhdCBzZWFyY2ggZnJvbSB0aGUgcm9vdCAqLworCSAgICBjb250aW51ZTsKKwl9CisKKyAgICAgICAgLyogb25seSBjaGVjayB0aGF0IHRoZSBrZXkgaXMgaW4gdGhlIGJ1ZmZlciBpZiBwX3Nfa2V5IGlzIG5vdAorICAgICAgICAgICBlcXVhbCB0byB0aGUgTUFYX0tFWS4gTGF0dGVyIGNhc2UgaXMgb25seSBwb3NzaWJsZSBpbgorICAgICAgICAgICAiZmluaXNoX3VuZmluaXNoZWQoKSIgcHJvY2Vzc2luZyBkdXJpbmcgbW91bnQuICovCisgICAgICAgIFJGQUxTRSggY29tcF9rZXlzKCAmTUFYX0tFWSwgcF9zX2tleSApICYmCisgICAgICAgICAgICAgICAgISBrZXlfaW5fYnVmZmVyKHBfc19zZWFyY2hfcGF0aCwgcF9zX2tleSwgcF9zX3NiKSwKKwkJIlBBUC01MTMwOiBrZXkgaXMgbm90IGluIHRoZSBidWZmZXIiKTsKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKwlpZiAoIGN1cl90YiApIHsKKwkgICAgcHJpbnRfY3VyX3RiICgiNTE0MCIpOworCSAgICByZWlzZXJmc19wYW5pYyhwX3Nfc2IsICJQQVAtNTE0MDogc2VhcmNoX2J5X2tleTogc2NoZWR1bGUgb2NjdXJyZWQgaW4gZG9fYmFsYW5jZSEiKTsKKwl9CisjZW5kaWYKKworCS8vIG1ha2Ugc3VyZSwgdGhhdCB0aGUgbm9kZSBjb250ZW50cyBsb29rIGxpa2UgYSBub2RlIG9mCisJLy8gY2VydGFpbiBsZXZlbAorCWlmICghaXNfdHJlZV9ub2RlIChwX3NfYmgsIGV4cGVjdGVkX2xldmVsKSkgeworCSAgICByZWlzZXJmc193YXJuaW5nIChwX3Nfc2IsICJ2cy01MTUwOiBzZWFyY2hfYnlfa2V5OiAiCisJCQkgICAgICAiaW52YWxpZCBmb3JtYXQgZm91bmQgaW4gYmxvY2sgJWxkLiBGc2NrPyIsCisJCQkgICAgICBwX3NfYmgtPmJfYmxvY2tucik7CisJICAgIHBhdGhyZWxzZSAocF9zX3NlYXJjaF9wYXRoKTsKKwkgICAgcmV0dXJuIElPX0VSUk9SOworCX0KKwkKKwkvKiBvaywgd2UgaGF2ZSBhY3F1aXJlZCBuZXh0IGZvcm1hdHRlZCBub2RlIGluIHRoZSB0cmVlICovCisJbl9ub2RlX2xldmVsID0gQl9MRVZFTCAocF9zX2JoKTsKKworCVBST0NfSU5GT19CSF9TVEFUKCBwX3Nfc2IsIHBfc19iaCwgbl9ub2RlX2xldmVsIC0gMSApOworCisJUkZBTFNFKCBuX25vZGVfbGV2ZWwgPCBuX3N0b3BfbGV2ZWwsCisJCSJ2cy01MTUyOiB0cmVlIGxldmVsICglZCkgaXMgbGVzcyB0aGFuIHN0b3AgbGV2ZWwgKCVkKSIsCisJCW5fbm9kZV9sZXZlbCwgbl9zdG9wX2xldmVsKTsKKworCW5fcmV0dmFsID0gYmluX3NlYXJjaCggcF9zX2tleSwgQl9OX1BJVEVNX0hFQUQocF9zX2JoLCAwKSwKKyAgICAgICAgICAgICAgICBCX05SX0lURU1TKHBfc19iaCksCisgICAgICAgICAgICAgICAgKCBuX25vZGVfbGV2ZWwgPT0gRElTS19MRUFGX05PREVfTEVWRUwgKSA/IElIX1NJWkUgOiBLRVlfU0laRSwKKyAgICAgICAgICAgICAgICAmKHBfc19sYXN0X2VsZW1lbnQtPnBlX3Bvc2l0aW9uKSk7CisJaWYgKG5fbm9kZV9sZXZlbCA9PSBuX3N0b3BfbGV2ZWwpIHsKKwkgICAgcmV0dXJuIG5fcmV0dmFsOworCX0KKworCS8qIHdlIGFyZSBub3QgaW4gdGhlIHN0b3AgbGV2ZWwgKi8KKwlpZiAobl9yZXR2YWwgPT0gSVRFTV9GT1VORCkKKwkgICAgLyogaXRlbSBoYXMgYmVlbiBmb3VuZCwgc28gd2UgY2hvb3NlIHRoZSBwb2ludGVyIHdoaWNoIGlzIHRvIHRoZSByaWdodCBvZiB0aGUgZm91bmQgb25lICovCisJICAgIHBfc19sYXN0X2VsZW1lbnQtPnBlX3Bvc2l0aW9uKys7CisKKwkvKiBpZiBpdGVtIHdhcyBub3QgZm91bmQgd2UgY2hvb3NlIHRoZSBwb3NpdGlvbiB3aGljaCBpcyB0bworCSAgIHRoZSBsZWZ0IG9mIHRoZSBmb3VuZCBpdGVtLiBUaGlzIHJlcXVpcmVzIG5vIGNvZGUsCisJICAgYmluX3NlYXJjaCBkaWQgaXQgYWxyZWFkeS4qLworCisJLyogU28gd2UgaGF2ZSBjaG9zZW4gYSBwb3NpdGlvbiBpbiB0aGUgY3VycmVudCBub2RlIHdoaWNoIGlzCisJICAgYW4gaW50ZXJuYWwgbm9kZS4gIE5vdyB3ZSBjYWxjdWxhdGUgY2hpbGQgYmxvY2sgbnVtYmVyIGJ5CisJICAgcG9zaXRpb24gaW4gdGhlIG5vZGUuICovCisJbl9ibG9ja19udW1iZXIgPSBCX05fQ0hJTERfTlVNKHBfc19iaCwgcF9zX2xhc3RfZWxlbWVudC0+cGVfcG9zaXRpb24pOworCisJLyogaWYgd2UgYXJlIGdvaW5nIHRvIHJlYWQgbGVhZiBub2RlcywgdHJ5IGZvciByZWFkIGFoZWFkIGFzIHdlbGwgKi8KKwlpZiAoKHBfc19zZWFyY2hfcGF0aC0+cmVhZGEgJiBQQVRIX1JFQURBKSAmJgorCSAgICBuX25vZGVfbGV2ZWwgPT0gRElTS19MRUFGX05PREVfTEVWRUwgKyAxKQorCXsKKwkgICAgaW50IHBvcyA9IHBfc19sYXN0X2VsZW1lbnQtPnBlX3Bvc2l0aW9uOworCSAgICBpbnQgbGltaXQgPSBCX05SX0lURU1TKHBfc19iaCk7CisJICAgIHN0cnVjdCByZWlzZXJmc19rZXkgKmxlX2tleTsKKworCSAgICBpZiAocF9zX3NlYXJjaF9wYXRoLT5yZWFkYSAmIFBBVEhfUkVBREFfQkFDSykKKwkJbGltaXQgPSAwOworCSAgICB3aGlsZShyZWFkYV9jb3VudCA8IFNFQVJDSF9CWV9LRVlfUkVBREEpIHsKKwkJaWYgKHBvcyA9PSBsaW1pdCkKKwkJICAgIGJyZWFrOworCSAgICAgICAgcmVhZGFfYmxvY2tzW3JlYWRhX2NvdW50KytdID0gQl9OX0NISUxEX05VTShwX3NfYmgsIHBvcyk7CisJCWlmIChwX3Nfc2VhcmNoX3BhdGgtPnJlYWRhICYgUEFUSF9SRUFEQV9CQUNLKQorCQkgICAgcG9zLS07CisJCWVsc2UKKwkJICAgIHBvcysrOworCisJCS8qCisJCSAqIGNoZWNrIHRvIG1ha2Ugc3VyZSB3ZSdyZSBpbiB0aGUgc2FtZSBvYmplY3QKKwkJICovCisJCWxlX2tleSA9IEJfTl9QREVMSU1fS0VZKHBfc19iaCwgcG9zKTsKKwkJaWYgKGxlMzJfdG9fY3B1KGxlX2tleS0+a19vYmplY3RpZCkgIT0KKwkJICAgIHBfc19rZXktPm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQpCisJCXsKKwkJICAgIGJyZWFrOworCQl9CisJICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworCisvKiBGb3JtIHRoZSBwYXRoIHRvIGFuIGl0ZW0gYW5kIHBvc2l0aW9uIGluIHRoaXMgaXRlbSB3aGljaCBjb250YWlucworICAgZmlsZSBieXRlIGRlZmluZWQgYnkgcF9zX2tleS4gSWYgdGhlcmUgaXMgbm8gc3VjaCBpdGVtCisgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBrZXksIHdlIHBvaW50IHRoZSBwYXRoIHRvIHRoZSBpdGVtIHdpdGgKKyAgIG1heGltYWwga2V5IGxlc3MgdGhhbiBwX3Nfa2V5LCBhbmQgKnBfbl9wb3NfaW5faXRlbSBpcyBzZXQgdG8gb25lCisgICBwYXN0IHRoZSBsYXN0IGVudHJ5L2J5dGUgaW4gdGhlIGl0ZW0uICBJZiBzZWFyY2hpbmcgZm9yIGVudHJ5IGluIGEKKyAgIGRpcmVjdG9yeSBpdGVtLCBhbmQgaXQgaXMgbm90IGZvdW5kLCAqcF9uX3Bvc19pbl9pdGVtIGlzIHNldCB0byBvbmUKKyAgIGVudHJ5IG1vcmUgdGhhbiB0aGUgZW50cnkgd2l0aCBtYXhpbWFsIGtleSB3aGljaCBpcyBsZXNzIHRoYW4gdGhlCisgICBzb3VnaHQga2V5LgorCisgICBOb3RlIHRoYXQgaWYgdGhlcmUgaXMgbm8gZW50cnkgaW4gdGhpcyBzYW1lIG5vZGUgd2hpY2ggaXMgb25lIG1vcmUsCisgICB0aGVuIHdlIHBvaW50IHRvIGFuIGltYWdpbmFyeSBlbnRyeS4gIGZvciBkaXJlY3QgaXRlbXMsIHRoZQorICAgcG9zaXRpb24gaXMgaW4gdW5pdHMgb2YgYnl0ZXMsIGZvciBpbmRpcmVjdCBpdGVtcyB0aGUgcG9zaXRpb24gaXMKKyAgIGluIHVuaXRzIG9mIGJsb2NrbnIgZW50cmllcywgZm9yIGRpcmVjdG9yeSBpdGVtcyB0aGUgcG9zaXRpb24gaXMgaW4KKyAgIHVuaXRzIG9mIGRpcmVjdG9yeSBlbnRyaWVzLiAgKi8KKworLyogVGhlIGZ1bmN0aW9uIGlzIE5PVCBTQ0hFRFVMRS1TQUZFISAqLworaW50IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgICogcF9zX3NiLCAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIHN1cGVyIGJsb2NrLiAgICAgICAgICAqLworCQkJCWNvbnN0IHN0cnVjdCBjcHVfa2V5ICAqIHBfY3B1X2tleSwgICAgICAvKiBLZXkgdG8gc2VhcmNoIChjcHUgdmFyaWFibGUpICAgICAgICAgKi8KKwkJCQlzdHJ1Y3QgcGF0aCAgICAgICAgICogcF9zX3NlYXJjaF9wYXRoIC8qIEZpbGxlZCB1cCBieSB0aGlzIGZ1bmN0aW9uLiAgICAgICAgICAqLworICAgICkgeworICAgIHN0cnVjdCBpdGVtX2hlYWQgICAgKiBwX2xlX2loOyAvKiBwb2ludGVyIHRvIG9uLWRpc2sgc3RydWN0dXJlICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgIG5fYmxrX3NpemU7CisgICAgbG9mZl90IGl0ZW1fb2Zmc2V0LCBvZmZzZXQ7CisgICAgc3RydWN0IHJlaXNlcmZzX2Rpcl9lbnRyeSBkZTsKKyAgICBpbnQgcmV0dmFsOworCisgICAgLyogSWYgc2VhcmNoaW5nIGZvciBkaXJlY3RvcnkgZW50cnkuICovCisgICAgaWYgKCBpc19kaXJlbnRyeV9jcHVfa2V5IChwX2NwdV9rZXkpICkKKwlyZXR1cm4gIHNlYXJjaF9ieV9lbnRyeV9rZXkgKHBfc19zYiwgcF9jcHVfa2V5LCBwX3Nfc2VhcmNoX3BhdGgsICZkZSk7CisKKyAgICAvKiBJZiBub3Qgc2VhcmNoaW5nIGZvciBkaXJlY3RvcnkgZW50cnkuICovCisgICAgCisgICAgLyogSWYgaXRlbSBpcyBmb3VuZC4gKi8KKyAgICByZXR2YWwgPSBzZWFyY2hfaXRlbSAocF9zX3NiLCBwX2NwdV9rZXksIHBfc19zZWFyY2hfcGF0aCk7CisgICAgaWYgKHJldHZhbCA9PSBJT19FUlJPUikKKwlyZXR1cm4gcmV0dmFsOworICAgIGlmICggcmV0dmFsID09IElURU1fRk9VTkQgKSAgeworCisJUkZBTFNFKCAhIGloX2l0ZW1fbGVuKAorICAgICAgICAgICAgICAgIEJfTl9QSVRFTV9IRUFEKFBBVEhfUExBU1RfQlVGRkVSKHBfc19zZWFyY2hfcGF0aCksCisJCQkgICAgICAgUEFUSF9MQVNUX1BPU0lUSU9OKHBfc19zZWFyY2hfcGF0aCkpKSwKKwkgICAgICAgICJQQVAtNTE2NTogaXRlbSBsZW5ndGggZXF1YWxzIHplcm8iKTsKKworCXBvc19pbl9pdGVtKHBfc19zZWFyY2hfcGF0aCkgPSAwOworCXJldHVybiBQT1NJVElPTl9GT1VORDsKKyAgICB9CisKKyAgICBSRkFMU0UoICEgUEFUSF9MQVNUX1BPU0lUSU9OKHBfc19zZWFyY2hfcGF0aCksCisJICAgICJQQVAtNTE3MDogcG9zaXRpb24gZXF1YWxzIHplcm8iKTsKKworICAgIC8qIEl0ZW0gaXMgbm90IGZvdW5kLiBTZXQgcGF0aCB0byB0aGUgcHJldmlvdXMgaXRlbS4gKi8KKyAgICBwX2xlX2loID0gQl9OX1BJVEVNX0hFQUQoUEFUSF9QTEFTVF9CVUZGRVIocF9zX3NlYXJjaF9wYXRoKSwgLS1QQVRIX0xBU1RfUE9TSVRJT04ocF9zX3NlYXJjaF9wYXRoKSk7CisgICAgbl9ibGtfc2l6ZSA9IHBfc19zYi0+c19ibG9ja3NpemU7CisKKyAgICBpZiAoY29tcF9zaG9ydF9rZXlzICgmKHBfbGVfaWgtPmloX2tleSksIHBfY3B1X2tleSkpIHsKKwlyZXR1cm4gRklMRV9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgLy8gRklYTUU6IHF1aXRlIHVnbHkgdGhpcyBmYXIKKworICAgIGl0ZW1fb2Zmc2V0ID0gbGVfaWhfa19vZmZzZXQgKHBfbGVfaWgpOworICAgIG9mZnNldCA9IGNwdV9rZXlfa19vZmZzZXQgKHBfY3B1X2tleSk7CisKKyAgICAvKiBOZWVkZWQgYnl0ZSBpcyBjb250YWluZWQgaW4gdGhlIGl0ZW0gcG9pbnRlZCB0byBieSB0aGUgcGF0aC4qLworICAgIGlmIChpdGVtX29mZnNldCA8PSBvZmZzZXQgJiYKKwlpdGVtX29mZnNldCArIG9wX2J5dGVzX251bWJlciAocF9sZV9paCwgbl9ibGtfc2l6ZSkgPiBvZmZzZXQpIHsKKwlwb3NfaW5faXRlbSAocF9zX3NlYXJjaF9wYXRoKSA9IG9mZnNldCAtIGl0ZW1fb2Zmc2V0OworCWlmICggaXNfaW5kaXJlY3RfbGVfaWgocF9sZV9paCkgKSB7CisJICAgIHBvc19pbl9pdGVtIChwX3Nfc2VhcmNoX3BhdGgpIC89IG5fYmxrX3NpemU7CisJfQorCXJldHVybiBQT1NJVElPTl9GT1VORDsKKyAgICB9CisKKyAgICAvKiBOZWVkZWQgYnl0ZSBpcyBub3QgY29udGFpbmVkIGluIHRoZSBpdGVtIHBvaW50ZWQgdG8gYnkgdGhlCisgICAgIHBhdGguIFNldCBwb3NfaW5faXRlbSBvdXQgb2YgdGhlIGl0ZW0uICovCisgICAgaWYgKCBpc19pbmRpcmVjdF9sZV9paCAocF9sZV9paCkgKQorCXBvc19pbl9pdGVtIChwX3Nfc2VhcmNoX3BhdGgpID0gaWhfaXRlbV9sZW4ocF9sZV9paCkgLyBVTkZNX1BfU0laRTsKKyAgICBlbHNlCisgICAgICAgIHBvc19pbl9pdGVtIChwX3Nfc2VhcmNoX3BhdGgpID0gaWhfaXRlbV9sZW4oIHBfbGVfaWggKTsKKyAgCisgICAgcmV0dXJuIFBPU0lUSU9OX05PVF9GT1VORDsKK30KKworCisvKiBDb21wYXJlIGdpdmVuIGl0ZW0gYW5kIGl0ZW0gcG9pbnRlZCB0byBieSB0aGUgcGF0aC4gKi8KK2ludCBjb21wX2l0ZW1zIChjb25zdCBzdHJ1Y3QgaXRlbV9oZWFkICogc3RvcmVkX2loLCBjb25zdCBzdHJ1Y3QgcGF0aCAqIHBfc19wYXRoKQoreworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAgKiBwX3NfYmg7CisgICAgc3RydWN0IGl0ZW1faGVhZCAgICAqIGloOworCisgICAgLyogTGFzdCBidWZmZXIgYXQgdGhlIHBhdGggaXMgbm90IGluIHRoZSB0cmVlLiAqLworICAgIGlmICggISBCX0lTX0lOX1RSRUUocF9zX2JoID0gUEFUSF9QTEFTVF9CVUZGRVIocF9zX3BhdGgpKSApCisJcmV0dXJuIDE7CisKKyAgICAvKiBMYXN0IHBhdGggcG9zaXRpb24gaXMgaW52YWxpZC4gKi8KKyAgICBpZiAoIFBBVEhfTEFTVF9QT1NJVElPTihwX3NfcGF0aCkgPj0gQl9OUl9JVEVNUyhwX3NfYmgpICkKKwlyZXR1cm4gMTsKKworICAgIC8qIHdlIG5lZWQgb25seSB0byBrbm93LCB3aGV0aGVyIGl0IGlzIHRoZSBzYW1lIGl0ZW0gKi8KKyAgICBpaCA9IGdldF9paCAocF9zX3BhdGgpOworICAgIHJldHVybiBtZW1jbXAgKHN0b3JlZF9paCwgaWgsIElIX1NJWkUpOworfQorCisKKy8qIHVuZm9ybWF0dGVkIG5vZGVzIGFyZSBub3QgbG9nZ2VkIGFueW1vcmUsIGV2ZXIuICBUaGlzIGlzIHNhZmUKKyoqIG5vdworKi8KKyNkZWZpbmUgaGVsZF9ieV9vdGhlcnMoYmgpIChhdG9taWNfcmVhZCgmKGJoKS0+Yl9jb3VudCkgPiAxKQorCisvLyBibG9jayBjYW4gbm90IGJlIGZvcmdvdHRlbiBhcyBpdCBpcyBpbiBJL08gb3IgaGVsZCBieSBzb21lb25lCisjZGVmaW5lIGJsb2NrX2luX3VzZShiaCkgKGJ1ZmZlcl9sb2NrZWQoYmgpIHx8IChoZWxkX2J5X290aGVycyhiaCkpKQorCisKKworLy8gcHJlcGFyZSBmb3IgZGVsZXRlIG9yIGN1dCBvZiBkaXJlY3QgaXRlbQorc3RhdGljIGlubGluZSBpbnQgcHJlcGFyZV9mb3JfZGlyZWN0X2l0ZW0gKHN0cnVjdCBwYXRoICogcGF0aCwKKwkJCQkJICAgc3RydWN0IGl0ZW1faGVhZCAqIGxlX2loLAorCQkJCQkgICBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwKKwkJCQkJICAgbG9mZl90IG5ld19maWxlX2xlbmd0aCwKKwkJCQkJICAgaW50ICogY3V0X3NpemUpCit7CisgICAgbG9mZl90IHJvdW5kX2xlbjsKKworCisgICAgaWYgKCBuZXdfZmlsZV9sZW5ndGggPT0gbWF4X3JlaXNlcmZzX29mZnNldCAoaW5vZGUpICkgeworCS8qIGl0ZW0gaGFzIHRvIGJlIGRlbGV0ZWQgKi8KKwkqY3V0X3NpemUgPSAtKElIX1NJWkUgKyBpaF9pdGVtX2xlbihsZV9paCkpOworCXJldHVybiBNX0RFTEVURTsKKyAgICB9CisJCisgICAgLy8gbmV3IGZpbGUgZ2V0cyB0cnVuY2F0ZWQKKyAgICBpZiAoZ2V0X2lub2RlX2l0ZW1fa2V5X3ZlcnNpb24gKGlub2RlKSA9PSBLRVlfRk9STUFUXzNfNikgeworCS8vIAorCXJvdW5kX2xlbiA9IFJPVU5EX1VQIChuZXdfZmlsZV9sZW5ndGgpOyAKKwkvKiB0aGlzIHdhcyBuX25ld19maWxlX2xlbmd0aCA8IGxlX2loIC4uLiAqLworCWlmICggcm91bmRfbGVuIDwgbGVfaWhfa19vZmZzZXQgKGxlX2loKSApICB7CisJICAgICpjdXRfc2l6ZSA9IC0oSUhfU0laRSArIGloX2l0ZW1fbGVuKGxlX2loKSk7CisJICAgIHJldHVybiBNX0RFTEVURTsgLyogRGVsZXRlIHRoaXMgaXRlbS4gKi8KKwl9CisJLyogQ2FsY3VsYXRlIGZpcnN0IHBvc2l0aW9uIGFuZCBzaXplIGZvciBjdXR0aW5nIGZyb20gaXRlbS4gKi8KKwlwb3NfaW5faXRlbSAocGF0aCkgPSByb3VuZF9sZW4gLSAobGVfaWhfa19vZmZzZXQgKGxlX2loKSAtIDEpOworCSpjdXRfc2l6ZSA9IC0oaWhfaXRlbV9sZW4obGVfaWgpIC0gcG9zX2luX2l0ZW0ocGF0aCkpOworCQorCXJldHVybiBNX0NVVDsgLyogQ3V0IGZyb20gdGhpcyBpdGVtLiAqLworICAgIH0KKworCisgICAgLy8gb2xkIGZpbGU6IGl0ZW1zIG1heSBoYXZlIGFueSBsZW5ndGgKKworICAgIGlmICggbmV3X2ZpbGVfbGVuZ3RoIDwgbGVfaWhfa19vZmZzZXQgKGxlX2loKSApICB7CisJKmN1dF9zaXplID0gLShJSF9TSVpFICsgaWhfaXRlbV9sZW4obGVfaWgpKTsKKwlyZXR1cm4gTV9ERUxFVEU7IC8qIERlbGV0ZSB0aGlzIGl0ZW0uICovCisgICAgfQorICAgIC8qIENhbGN1bGF0ZSBmaXJzdCBwb3NpdGlvbiBhbmQgc2l6ZSBmb3IgY3V0dGluZyBmcm9tIGl0ZW0uICovCisgICAgKmN1dF9zaXplID0gLShpaF9pdGVtX2xlbihsZV9paCkgLQorCQkgICAgICAocG9zX2luX2l0ZW0gKHBhdGgpID0gbmV3X2ZpbGVfbGVuZ3RoICsgMSAtIGxlX2loX2tfb2Zmc2V0IChsZV9paCkpKTsKKyAgICByZXR1cm4gTV9DVVQ7IC8qIEN1dCBmcm9tIHRoaXMgaXRlbS4gKi8KK30KKworCitzdGF0aWMgaW5saW5lIGludCBwcmVwYXJlX2Zvcl9kaXJlbnRyeV9pdGVtIChzdHJ1Y3QgcGF0aCAqIHBhdGgsCisJCQkJCSAgICAgc3RydWN0IGl0ZW1faGVhZCAqIGxlX2loLAorCQkJCQkgICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlLAorCQkJCQkgICAgIGxvZmZfdCBuZXdfZmlsZV9sZW5ndGgsCisJCQkJCSAgICAgaW50ICogY3V0X3NpemUpCit7CisgICAgaWYgKGxlX2loX2tfb2Zmc2V0IChsZV9paCkgPT0gRE9UX09GRlNFVCAmJiAKKwluZXdfZmlsZV9sZW5ndGggPT0gbWF4X3JlaXNlcmZzX29mZnNldCAoaW5vZGUpKSB7CisJUkZBTFNFKCBpaF9lbnRyeV9jb3VudCAobGVfaWgpICE9IDIsCisJICAgICAgICAiUEFQLTUyMjA6IGluY29ycmVjdCBlbXB0eSBkaXJlY3RvcnkgaXRlbSAoJWgpIiwgbGVfaWgpOworCSpjdXRfc2l6ZSA9IC0oSUhfU0laRSArIGloX2l0ZW1fbGVuKGxlX2loKSk7CisJcmV0dXJuIE1fREVMRVRFOyAvKiBEZWxldGUgdGhlIGRpcmVjdG9yeSBpdGVtIGNvbnRhaW5pbmcgIi4iIGFuZCAiLi4iIGVudHJ5LiAqLworICAgIH0KKyAgICAKKyAgICBpZiAoIGloX2VudHJ5X2NvdW50IChsZV9paCkgPT0gMSApICB7CisJLyogRGVsZXRlIHRoZSBkaXJlY3RvcnkgaXRlbSBzdWNoIGFzIHRoZXJlIGlzIG9uZSByZWNvcmQgb25seQorCSAgIGluIHRoaXMgaXRlbSovCisJKmN1dF9zaXplID0gLShJSF9TSVpFICsgaWhfaXRlbV9sZW4obGVfaWgpKTsKKwlyZXR1cm4gTV9ERUxFVEU7CisgICAgfQorICAgIAorICAgIC8qIEN1dCBvbmUgcmVjb3JkIGZyb20gdGhlIGRpcmVjdG9yeSBpdGVtLiAqLworICAgICpjdXRfc2l6ZSA9IC0oREVIX1NJWkUgKyBlbnRyeV9sZW5ndGggKGdldF9sYXN0X2JoIChwYXRoKSwgbGVfaWgsIHBvc19pbl9pdGVtIChwYXRoKSkpOworICAgIHJldHVybiBNX0NVVDsgCit9CisKKworLyogIElmIHRoZSBwYXRoIHBvaW50cyB0byBhIGRpcmVjdG9yeSBvciBkaXJlY3QgaXRlbSwgY2FsY3VsYXRlIG1vZGUgYW5kIHRoZSBzaXplIGN1dCwgZm9yIGJhbGFuY2UuCisgICAgSWYgdGhlIHBhdGggcG9pbnRzIHRvIGFuIGluZGlyZWN0IGl0ZW0sIHJlbW92ZSBzb21lIG51bWJlciBvZiBpdHMgdW5mb3JtYXR0ZWQgbm9kZXMuCisgICAgSW4gY2FzZSBvZiBmaWxlIHRydW5jYXRlIGNhbGN1bGF0ZSB3aGV0aGVyIHRoaXMgaXRlbSBtdXN0IGJlIGRlbGV0ZWQvdHJ1bmNhdGVkIG9yIGxhc3QKKyAgICB1bmZvcm1hdHRlZCBub2RlIG9mIHRoaXMgaXRlbSB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIGRpcmVjdCBpdGVtLgorICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGRldGVybWluYXRpb24gb2Ygd2hhdCBiYWxhbmNlIG1vZGUgdGhlIGNhbGxpbmcgZnVuY3Rpb24gc2hvdWxkIGVtcGxveS4gKi8KK3N0YXRpYyBjaGFyICBwcmVwYXJlX2Zvcl9kZWxldGVfb3JfY3V0KAorCQkJCSAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgCisJCQkJICAgICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlLAorCQkJCSAgICAgICBzdHJ1Y3QgcGF0aCAgICAgICAgICogcF9zX3BhdGgsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICAgICAgKiBwX3NfaXRlbV9rZXksCisJCQkJICAgICAgIGludCAgICAgICAgICAgICAgICAgKiBwX25fcmVtb3ZlZCwgICAgICAvKiBOdW1iZXIgb2YgdW5mb3JtYXR0ZWQgbm9kZXMgd2hpY2ggd2VyZSByZW1vdmVkCisJCQkJCQkJCQkJICBmcm9tIGVuZCBvZiB0aGUgZmlsZS4gKi8KKwkJCQkgICAgICAgaW50ICAgICAgICAgICAgICAgICAqIHBfbl9jdXRfc2l6ZSwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBsb25nICAgIG5fbmV3X2ZpbGVfbGVuZ3RoIC8qIE1BWF9LRVlfT0ZGU0VUIGluIGNhc2Ugb2YgZGVsZXRlLiAqLworICAgICkgeworICAgIHN0cnVjdCBzdXBlcl9ibG9jayAgKiBwX3Nfc2IgPSBpbm9kZS0+aV9zYjsKKyAgICBzdHJ1Y3QgaXRlbV9oZWFkICAgICogcF9sZV9paCA9IFBBVEhfUElURU1fSEVBRChwX3NfcGF0aCk7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICAqIHBfc19iaCA9IFBBVEhfUExBU1RfQlVGRkVSKHBfc19wYXRoKTsKKworICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKworICAgIC8qIFN0YXRfZGF0YSBpdGVtLiAqLworICAgIGlmICggaXNfc3RhdGRhdGFfbGVfaWggKHBfbGVfaWgpICkgeworCisJUkZBTFNFKCBuX25ld19maWxlX2xlbmd0aCAhPSBtYXhfcmVpc2VyZnNfb2Zmc2V0IChpbm9kZSksCisJCSJQQVAtNTIxMDogbW9kZSBtdXN0IGJlIE1fREVMRVRFIik7CisKKwkqcF9uX2N1dF9zaXplID0gLShJSF9TSVpFICsgaWhfaXRlbV9sZW4ocF9sZV9paCkpOworCXJldHVybiBNX0RFTEVURTsKKyAgICB9CisKKworICAgIC8qIERpcmVjdG9yeSBpdGVtLiAqLworICAgIGlmICggaXNfZGlyZW50cnlfbGVfaWggKHBfbGVfaWgpICkKKwlyZXR1cm4gcHJlcGFyZV9mb3JfZGlyZW50cnlfaXRlbSAocF9zX3BhdGgsIHBfbGVfaWgsIGlub2RlLCBuX25ld19maWxlX2xlbmd0aCwgcF9uX2N1dF9zaXplKTsKKworICAgIC8qIERpcmVjdCBpdGVtLiAqLworICAgIGlmICggaXNfZGlyZWN0X2xlX2loIChwX2xlX2loKSApCisJcmV0dXJuIHByZXBhcmVfZm9yX2RpcmVjdF9pdGVtIChwX3NfcGF0aCwgcF9sZV9paCwgaW5vZGUsIG5fbmV3X2ZpbGVfbGVuZ3RoLCBwX25fY3V0X3NpemUpOworCisKKyAgICAvKiBDYXNlIG9mIGFuIGluZGlyZWN0IGl0ZW0uICovCisgICAgeworCWludCAgICAgICAgICAgICAgICAgICBuX3VuZm1fbnVtYmVyLCAgICAvKiBOdW1iZXIgb2YgdGhlIGl0ZW0gdW5mb3JtYXR0ZWQgbm9kZXMuICovCisJICAgIG5fY291bnRlciwKKwkgICAgbl9ibGtfc2l6ZTsKKwlfX3UzMiAgICAgICAgICAgICAgICogcF9uX3VuZm1fcG9pbnRlcjsgLyogUG9pbnRlciB0byB0aGUgdW5mb3JtYXR0ZWQgbm9kZSBudW1iZXIuICovCisJX191MzIgdG1wOworCXN0cnVjdCBpdGVtX2hlYWQgICAgICBzX2loOyAgICAgICAgICAgLyogSXRlbSBoZWFkZXIuICovCisJY2hhciAgICAgICAgICAgICAgICAgIGNfbW9kZTsgICAgICAgICAgIC8qIFJldHVybmVkIG1vZGUgb2YgdGhlIGJhbGFuY2UuICovCisJaW50IG5lZWRfcmVzZWFyY2g7CisKKworCW5fYmxrX3NpemUgPSBwX3Nfc2ItPnNfYmxvY2tzaXplOworCisJLyogU2VhcmNoIGZvciB0aGUgbmVlZGVkIG9iamVjdCBpbmRpcmVjdCBpdGVtIHVudGlsIHRoZXJlIGFyZSBubyB1bmZvcm1hdHRlZCBub2RlcyB0byBiZSByZW1vdmVkLiAqLworCWRvICB7CisJICAgIG5lZWRfcmVzZWFyY2ggPSAwOworICAgICAgICAgICAgcF9zX2JoID0gUEFUSF9QTEFTVF9CVUZGRVIocF9zX3BhdGgpOworCSAgICAvKiBDb3B5IGluZGlyZWN0IGl0ZW0gaGVhZGVyIHRvIGEgdGVtcCB2YXJpYWJsZS4gKi8KKwkgICAgY29weV9pdGVtX2hlYWQoJnNfaWgsIFBBVEhfUElURU1fSEVBRChwX3NfcGF0aCkpOworCSAgICAvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIHVuZm9ybWF0dGVkIG5vZGVzIGluIHRoaXMgaXRlbS4gKi8KKwkgICAgbl91bmZtX251bWJlciA9IElfVU5GTV9OVU0oJnNfaWgpOworCisJICAgIFJGQUxTRSggISBpc19pbmRpcmVjdF9sZV9paCgmc19paCkgfHwgISBuX3VuZm1fbnVtYmVyIHx8CisJCSAgICBwb3NfaW5faXRlbSAocF9zX3BhdGgpICsgMSAhPSAgbl91bmZtX251bWJlciwKKwkJICAgICJQQVAtNTI0MDogaW52YWxpZCBpdGVtICVoICIKKwkJICAgICJuX3VuZm1fbnVtYmVyID0gJWQgKnBfbl9wb3NfaW5faXRlbSA9ICVkIiwgCisJCSAgICAmc19paCwgbl91bmZtX251bWJlciwgcG9zX2luX2l0ZW0gKHBfc19wYXRoKSk7CisKKwkgICAgLyogQ2FsY3VsYXRlIGJhbGFuY2UgbW9kZSBhbmQgcG9zaXRpb24gaW4gdGhlIGl0ZW0gdG8gcmVtb3ZlIHVuZm9ybWF0dGVkIG5vZGVzLiAqLworCSAgICBpZiAoIG5fbmV3X2ZpbGVfbGVuZ3RoID09IG1heF9yZWlzZXJmc19vZmZzZXQgKGlub2RlKSApIHsvKiBDYXNlIG9mIGRlbGV0ZS4gKi8KKwkJcG9zX2luX2l0ZW0gKHBfc19wYXRoKSA9IDA7CisJCSpwX25fY3V0X3NpemUgPSAtKElIX1NJWkUgKyBpaF9pdGVtX2xlbigmc19paCkpOworCQljX21vZGUgPSBNX0RFTEVURTsKKwkgICAgfQorCSAgICBlbHNlICB7IC8qIENhc2Ugb2YgdHJ1bmNhdGUuICovCisJCWlmICggbl9uZXdfZmlsZV9sZW5ndGggPCBsZV9paF9rX29mZnNldCAoJnNfaWgpICkgIHsKKwkJICAgIHBvc19pbl9pdGVtIChwX3NfcGF0aCkgPSAwOworCQkgICAgKnBfbl9jdXRfc2l6ZSA9IC0oSUhfU0laRSArIGloX2l0ZW1fbGVuKCZzX2loKSk7CisJCSAgICBjX21vZGUgPSBNX0RFTEVURTsgLyogRGVsZXRlIHRoaXMgaXRlbS4gKi8KKwkJfQorCQllbHNlICB7CisJCSAgICAvKiBpbmRpcmVjdCBpdGVtIG11c3QgYmUgdHJ1bmNhdGVkIHN0YXJ0aW5nIGZyb20gKnBfbl9wb3NfaW5faXRlbS10aCBwb3NpdGlvbiAqLworCQkgICAgcG9zX2luX2l0ZW0gKHBfc19wYXRoKSA9IChuX25ld19maWxlX2xlbmd0aCArIG5fYmxrX3NpemUgLSBsZV9paF9rX29mZnNldCAoJnNfaWgpICkgPj4gcF9zX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCisJCSAgICBSRkFMU0UoIHBvc19pbl9pdGVtIChwX3NfcGF0aCkgPiBuX3VuZm1fbnVtYmVyLAorCQkJICAgICJQQVAtNTI1MDogaW52YWxpZCBwb3NpdGlvbiBpbiB0aGUgaXRlbSIpOworCisJCSAgICAvKiBFaXRoZXIgY29udmVydCBsYXN0IHVuZm9ybWF0dGVkIG5vZGUgb2YgaW5kaXJlY3QgaXRlbSB0byBkaXJlY3QgaXRlbSBvciBpbmNyZWFzZQorCQkgICAgICAgaXRzIGZyZWUgc3BhY2UuICAqLworCQkgICAgaWYgKCBwb3NfaW5faXRlbSAocF9zX3BhdGgpID09IG5fdW5mbV9udW1iZXIgKSAgeworCQkJKnBfbl9jdXRfc2l6ZSA9IDA7IC8qIE5vdGhpbmcgdG8gY3V0LiAqLworCQkJcmV0dXJuIE1fQ09OVkVSVDsgLyogTWF5YmUgY29udmVydCBsYXN0IHVuZm9ybWF0dGVkIG5vZGUgdG8gdGhlIGRpcmVjdCBpdGVtLiAqLworCQkgICAgfQorCQkgICAgLyogQ2FsY3VsYXRlIHNpemUgdG8gY3V0LiAqLworCQkgICAgKnBfbl9jdXRfc2l6ZSA9IC0oaWhfaXRlbV9sZW4oJnNfaWgpIC0gcG9zX2luX2l0ZW0ocF9zX3BhdGgpICogVU5GTV9QX1NJWkUpOworCisJCSAgICBjX21vZGUgPSBNX0NVVDsgICAgIC8qIEN1dCBmcm9tIHRoaXMgaW5kaXJlY3QgaXRlbS4gKi8KKwkJfQorCSAgICB9CisKKwkgICAgUkZBTFNFKCBuX3VuZm1fbnVtYmVyIDw9IHBvc19pbl9pdGVtIChwX3NfcGF0aCksCisJCSAgICAiUEFQLTUyNjA6IGludmFsaWQgcG9zaXRpb24gaW4gdGhlIGluZGlyZWN0IGl0ZW0iKTsKKworCSAgICAvKiBwb2ludGVycyB0byBiZSBjdXQgKi8KKwkgICAgbl91bmZtX251bWJlciAtPSBwb3NfaW5faXRlbSAocF9zX3BhdGgpOworCSAgICAvKiBTZXQgcG9pbnRlciB0byB0aGUgbGFzdCB1bmZvcm1hdHRlZCBub2RlIHBvaW50ZXIgdGhhdCBpcyB0byBiZSBjdXQuICovCisJICAgIHBfbl91bmZtX3BvaW50ZXIgPSAoX191MzIgKilCX0lfUElURU0ocF9zX2JoLCAmc19paCkgKyBJX1VORk1fTlVNKCZzX2loKSAtIDEgLSAqcF9uX3JlbW92ZWQ7CisKKworCSAgICAvKiBXZSBnbyB0aHJvdWdoIHRoZSB1bmZvcm1hdHRlZCBub2RlcyBwb2ludGVycyBvZiB0aGUgaW5kaXJlY3QKKwkgICAgICAgaXRlbSBhbmQgbG9vayBmb3IgdGhlIHVuZm9ybWF0dGVkIG5vZGVzIGluIHRoZSBjYWNoZS4gSWYgd2UKKwkgICAgICAgZm91bmQgc29tZSBvZiB0aGVtIHdlIGZyZWUgaXQsIHplcm8gY29ycmVzcG9uZGluZyBpbmRpcmVjdCBpdGVtCisJICAgICAgIGVudHJ5IGFuZCBsb2cgYnVmZmVyIGNvbnRhaW5pbmcgdGhhdCBpbmRpcmVjdCBpdGVtLiBGb3IgdGhpcyB3ZQorCSAgICAgICBuZWVkIHRvIHByZXBhcmUgbGFzdCBwYXRoIGVsZW1lbnQgZm9yIGxvZ2dpbmcuIElmIHNvbWUKKwkgICAgICAgdW5mb3JtYXR0ZWQgbm9kZSBoYXMgYl9jb3VudCA+IDEgd2UgbXVzdCBub3QgZnJlZSB0aGlzCisJICAgICAgIHVuZm9ybWF0dGVkIG5vZGUgc2luY2UgaXQgaXMgaW4gdXNlLiAqLworCSAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHBfc19zYiwgcF9zX2JoLCAxKTsKKwkgICAgLy8gbm90ZTogcGF0aCBjb3VsZCBiZSBjaGFuZ2VkLCBmaXJzdCBsaW5lIGluIGZvciBsb29wIHRha2VzIGNhcmUKKwkgICAgLy8gb2YgaXQKKworCSAgICBmb3IgKG5fY291bnRlciA9ICpwX25fcmVtb3ZlZDsKKwkJIG5fY291bnRlciA8IG5fdW5mbV9udW1iZXI7IG5fY291bnRlcisrLCBwX25fdW5mbV9wb2ludGVyLS0gKSB7CisKKwkJY29uZF9yZXNjaGVkKCk7CisJCWlmIChpdGVtX21vdmVkICgmc19paCwgcF9zX3BhdGgpKSB7CisJCSAgICBuZWVkX3Jlc2VhcmNoID0gMSA7CisJCSAgICBicmVhazsKKwkJfQorCQlSRkFMU0UoIHBfbl91bmZtX3BvaW50ZXIgPCAoX191MzIgKilCX0lfUElURU0ocF9zX2JoLCAmc19paCkgfHwKKwkJCXBfbl91bmZtX3BvaW50ZXIgPiAoX191MzIgKilCX0lfUElURU0ocF9zX2JoLCAmc19paCkgKyBJX1VORk1fTlVNKCZzX2loKSAtIDEsCisJCQkidnMtNTI2NTogcG9pbnRlciBvdXQgb2YgcmFuZ2UiKTsKKworCQkvKiBIb2xlLCBub3RoaW5nIHRvIHJlbW92ZS4gKi8KKwkJaWYgKCAhIGdldF9ibG9ja19udW0ocF9uX3VuZm1fcG9pbnRlciwwKSApICB7CisJCQkoKnBfbl9yZW1vdmVkKSsrOworCQkJY29udGludWU7CisJCX0KKworCQkoKnBfbl9yZW1vdmVkKSsrOworCisJCXRtcCA9IGdldF9ibG9ja19udW0ocF9uX3VuZm1fcG9pbnRlciwwKTsKKwkJcHV0X2Jsb2NrX251bShwX25fdW5mbV9wb2ludGVyLCAwLCAwKTsKKwkJam91cm5hbF9tYXJrX2RpcnR5ICh0aCwgcF9zX3NiLCBwX3NfYmgpOworCQlyZWlzZXJmc19mcmVlX2Jsb2NrKHRoLCBpbm9kZSwgdG1wLCAxKTsKKwkJaWYgKCBpdGVtX21vdmVkICgmc19paCwgcF9zX3BhdGgpICkgIHsKKwkJCW5lZWRfcmVzZWFyY2ggPSAxOworCQkJYnJlYWsgOworCQl9CisJICAgIH0KKworCSAgICAvKiBhIHRyaWNrLiAgSWYgdGhlIGJ1ZmZlciBoYXMgYmVlbiBsb2dnZWQsIHRoaXMKKwkgICAgKiogd2lsbCBkbyBub3RoaW5nLiAgSWYgd2UndmUgYnJva2VuIHRoZSBsb29wIHdpdGhvdXQKKwkgICAgKiogbG9nZ2luZyBpdCwgaXQgd2lsbCByZXN0b3JlIHRoZSBidWZmZXIKKwkgICAgKioKKwkgICAgKi8KKwkgICAgcmVpc2VyZnNfcmVzdG9yZV9wcmVwYXJlZF9idWZmZXIocF9zX3NiLCBwX3NfYmgpOworCisJICAgIC8qIFRoaXMgbG9vcCBjYW4gYmUgb3B0aW1pemVkLiAqLworCX0gd2hpbGUgKCAoKnBfbl9yZW1vdmVkIDwgbl91bmZtX251bWJlciB8fCBuZWVkX3Jlc2VhcmNoKSAmJgorCQkgIHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KHBfc19zYiwgcF9zX2l0ZW1fa2V5LCBwX3NfcGF0aCkgPT0gUE9TSVRJT05fRk9VTkQgKTsKKworCVJGQUxTRSggKnBfbl9yZW1vdmVkIDwgbl91bmZtX251bWJlciwgCisJCSJQQVAtNTMxMDogaW5kaXJlY3QgaXRlbSBpcyBub3QgZm91bmQiKTsKKwlSRkFMU0UoIGl0ZW1fbW92ZWQgKCZzX2loLCBwX3NfcGF0aCksIAorCQkiYWZ0ZXIgd2hpbGUsIGNvbXAgZmFpbGVkLCByZXRyeSIpIDsKKworCWlmIChjX21vZGUgPT0gTV9DVVQpCisJICAgIHBvc19pbl9pdGVtIChwX3NfcGF0aCkgKj0gVU5GTV9QX1NJWkU7CisJcmV0dXJuIGNfbW9kZTsKKyAgICB9Cit9CisKKy8qIENhbGN1bGF0ZSBudW1iZXIgb2YgYnl0ZXMgd2hpY2ggd2lsbCBiZSBkZWxldGVkIG9yIGN1dCBkdXJpbmcgYmFsYW5jZSAqLworc3RhdGljIGludCBjYWxjX2RlbGV0ZWRfYnl0ZXNfbnVtYmVyKAorICAgIHN0cnVjdCAgdHJlZV9iYWxhbmNlICAqIHBfc190YiwKKyAgICBjaGFyICAgICAgICAgICAgICAgICAgICBjX21vZGUKKyAgICApIHsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBuX2RlbF9zaXplOworICAgIHN0cnVjdCAgaXRlbV9oZWFkICAgICAqIHBfbGVfaWggPSBQQVRIX1BJVEVNX0hFQUQocF9zX3RiLT50Yl9wYXRoKTsKKworICAgIGlmICggaXNfc3RhdGRhdGFfbGVfaWggKHBfbGVfaWgpICkKKwlyZXR1cm4gMDsKKworICAgIG5fZGVsX3NpemUgPSAoIGNfbW9kZSA9PSBNX0RFTEVURSApID8gaWhfaXRlbV9sZW4ocF9sZV9paCkgOiAtcF9zX3RiLT5pbnNlcnRfc2l6ZVswXTsKKyAgICBpZiAoIGlzX2RpcmVudHJ5X2xlX2loIChwX2xlX2loKSApIHsKKwkvLyByZXR1cm4gRU1QVFlfRElSX1NJWkU7IC8qIFdlIGRlbGV0ZSBlbXR5IGRpcmVjdG9yaXMgb25seS4gKi8KKwkvLyB3ZSBjYW4ndCB1c2UgRU1QVFlfRElSX1NJWkUsIGFzIG9sZCBmb3JtYXQgZGlycyBoYXZlIGEgZGlmZmVyZW50CisJLy8gZW1wdHkgc2l6ZS4gIGljay4gRklYTUUsIGlzIHRoaXMgcmlnaHQ/CisJLy8KKwlyZXR1cm4gbl9kZWxfc2l6ZSA7CisgICAgfQorCisgICAgaWYgKCBpc19pbmRpcmVjdF9sZV9paCAocF9sZV9paCkgKQorCW5fZGVsX3NpemUgPSAobl9kZWxfc2l6ZS9VTkZNX1BfU0laRSkqCisJICAoUEFUSF9QTEFTVF9CVUZGRVIocF9zX3RiLT50Yl9wYXRoKS0+Yl9zaXplKTsvLyAtIGdldF9paF9mcmVlX3NwYWNlIChwX2xlX2loKTsKKyAgICByZXR1cm4gbl9kZWxfc2l6ZTsKK30KKworc3RhdGljIHZvaWQgaW5pdF90Yl9zdHJ1Y3QoCisgICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisgICAgc3RydWN0IHRyZWVfYmFsYW5jZSAqIHBfc190YiwKKyAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgICogcF9zX3NiLAorICAgIHN0cnVjdCBwYXRoICAgICAgICAgKiBwX3NfcGF0aCwKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgbl9zaXplCisgICAgKSB7CisKKyAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisKKyAgICBtZW1zZXQgKHBfc190YiwnXDAnLHNpemVvZihzdHJ1Y3QgdHJlZV9iYWxhbmNlKSk7CisgICAgcF9zX3RiLT50cmFuc2FjdGlvbl9oYW5kbGUgPSB0aCA7CisgICAgcF9zX3RiLT50Yl9zYiA9IHBfc19zYjsKKyAgICBwX3NfdGItPnRiX3BhdGggPSBwX3NfcGF0aDsKKyAgICBQQVRIX09GRlNFVF9QQlVGRkVSKHBfc19wYXRoLCBJTExFR0FMX1BBVEhfRUxFTUVOVF9PRkZTRVQpID0gTlVMTDsKKyAgICBQQVRIX09GRlNFVF9QT1NJVElPTihwX3NfcGF0aCwgSUxMRUdBTF9QQVRIX0VMRU1FTlRfT0ZGU0VUKSA9IDA7CisgICAgcF9zX3RiLT5pbnNlcnRfc2l6ZVswXSA9IG5fc2l6ZTsKK30KKworCisKK3ZvaWQgcGFkZF9pdGVtIChjaGFyICogaXRlbSwgaW50IHRvdGFsX2xlbmd0aCwgaW50IGxlbmd0aCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IHRvdGFsX2xlbmd0aDsgaSA+IGxlbmd0aDsgKQorCWl0ZW0gWy0taV0gPSAwOworfQorCisjaWZkZWYgUkVJU0VSUVVPVEFfREVCVUcKK2NoYXIga2V5MnR5cGUoc3RydWN0IHJlaXNlcmZzX2tleSAqaWgpCit7CisgIGlmIChpc19kaXJlbnRyeV9sZV9rZXkoMiwgaWgpKQorICAgIHJldHVybiAnZCc7CisgIGlmIChpc19kaXJlY3RfbGVfa2V5KDIsIGloKSkKKyAgICByZXR1cm4gJ0QnOworICBpZiAoaXNfaW5kaXJlY3RfbGVfa2V5KDIsIGloKSkKKyAgICByZXR1cm4gJ2knOworICBpZiAoaXNfc3RhdGRhdGFfbGVfa2V5KDIsIGloKSkKKyAgICByZXR1cm4gJ3MnOworICByZXR1cm4gJ3UnOworfQorCitjaGFyIGhlYWQydHlwZShzdHJ1Y3QgaXRlbV9oZWFkICppaCkKK3sKKyAgaWYgKGlzX2RpcmVudHJ5X2xlX2loKGloKSkKKyAgICByZXR1cm4gJ2QnOworICBpZiAoaXNfZGlyZWN0X2xlX2loKGloKSkKKyAgICByZXR1cm4gJ0QnOworICBpZiAoaXNfaW5kaXJlY3RfbGVfaWgoaWgpKQorICAgIHJldHVybiAnaSc7CisgIGlmIChpc19zdGF0ZGF0YV9sZV9paChpaCkpCisgICAgcmV0dXJuICdzJzsKKyAgcmV0dXJuICd1JzsKK30KKyNlbmRpZgorCisvKiBEZWxldGUgb2JqZWN0IGl0ZW0uICovCitpbnQgcmVpc2VyZnNfZGVsZXRlX2l0ZW0gKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCAKKwkJCSAgc3RydWN0IHBhdGggKiBwX3NfcGF0aCwgLyogUGF0aCB0byB0aGUgZGVsZXRlZCBpdGVtLiAqLworCQkJICBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqIHBfc19pdGVtX2tleSwgLyogS2V5IHRvIHNlYXJjaCBmb3IgdGhlIGRlbGV0ZWQgaXRlbS4gICovCisJCQkgIHN0cnVjdCBpbm9kZSAqIHBfc19pbm9kZSwvKiBpbm9kZSBpcyBoZXJlIGp1c3QgdG8gdXBkYXRlIGlfYmxvY2tzIGFuZCBxdW90YXMgKi8KKwkJCSAgc3RydWN0IGJ1ZmZlcl9oZWFkICAqIHBfc191bl9iaCkgICAgLyogTlVMTCBvciB1bmZvcm1hdHRlZCBub2RlIHBvaW50ZXIuICAgICovCit7CisgICAgc3RydWN0IHN1cGVyX2Jsb2NrICogcF9zX3NiID0gcF9zX2lub2RlLT5pX3NiOworICAgIHN0cnVjdCB0cmVlX2JhbGFuY2UgICBzX2RlbF9iYWxhbmNlOworICAgIHN0cnVjdCBpdGVtX2hlYWQgICAgICBzX2loOworICAgIHN0cnVjdCBpdGVtX2hlYWQgICAgICAqcV9paDsKKyAgICBpbnQJCQkgIHF1b3RhX2N1dF9ieXRlczsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgbl9yZXRfdmFsdWUsCisJbl9kZWxfc2l6ZSwKKwluX3JlbW92ZWQ7CisKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKyAgICBjaGFyICAgICAgICAgICAgICAgICAgY19tb2RlOworICAgIGludAkJCW5faXRlciA9IDA7CisjZW5kaWYKKworICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKworICAgIGluaXRfdGJfc3RydWN0KHRoLCAmc19kZWxfYmFsYW5jZSwgcF9zX3NiLCBwX3NfcGF0aCwgMC8qc2l6ZSBpcyB1bmtub3duKi8pOworCisgICAgd2hpbGUgKCAxICkgeworCW5fcmVtb3ZlZCA9IDA7CisKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKwluX2l0ZXIrKzsKKwljX21vZGUgPQorI2VuZGlmCisJICAgIHByZXBhcmVfZm9yX2RlbGV0ZV9vcl9jdXQodGgsIHBfc19pbm9kZSwgcF9zX3BhdGgsIHBfc19pdGVtX2tleSwgJm5fcmVtb3ZlZCwgJm5fZGVsX3NpemUsIG1heF9yZWlzZXJmc19vZmZzZXQgKHBfc19pbm9kZSkpOworCisJUkZBTFNFKCBjX21vZGUgIT0gTV9ERUxFVEUsICJQQVAtNTMyMDogbW9kZSBtdXN0IGJlIE1fREVMRVRFIik7CisKKwljb3B5X2l0ZW1faGVhZCgmc19paCwgUEFUSF9QSVRFTV9IRUFEKHBfc19wYXRoKSk7CisJc19kZWxfYmFsYW5jZS5pbnNlcnRfc2l6ZVswXSA9IG5fZGVsX3NpemU7CisKKwluX3JldF92YWx1ZSA9IGZpeF9ub2RlcyhNX0RFTEVURSwgJnNfZGVsX2JhbGFuY2UsIE5VTEwsIE5VTEwpOworCWlmICggbl9yZXRfdmFsdWUgIT0gUkVQRUFUX1NFQVJDSCApCisJICAgIGJyZWFrOworCisJUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBkZWxldGVfaXRlbV9yZXN0YXJ0ZWQgKTsKKworCS8vIGZpbGUgc3lzdGVtIGNoYW5nZWQsIHJlcGVhdCBzZWFyY2gKKwluX3JldF92YWx1ZSA9IHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KHBfc19zYiwgcF9zX2l0ZW1fa2V5LCBwX3NfcGF0aCk7CisJaWYgKG5fcmV0X3ZhbHVlID09IElPX0VSUk9SKQorCSAgICBicmVhazsKKwlpZiAobl9yZXRfdmFsdWUgPT0gRklMRV9OT1RfRk9VTkQpIHsKKwkgICAgcmVpc2VyZnNfd2FybmluZyAocF9zX3NiLCAidnMtNTM0MDogcmVpc2VyZnNfZGVsZXRlX2l0ZW06ICIKKwkJCSAgICAgICJubyBpdGVtcyBvZiB0aGUgZmlsZSAlSyBmb3VuZCIsIHBfc19pdGVtX2tleSk7CisJICAgIGJyZWFrOworCX0KKyAgICB9IC8qIHdoaWxlICgxKSAqLworCisgICAgaWYgKCBuX3JldF92YWx1ZSAhPSBDQVJSWV9PTiApIHsKKwl1bmZpeF9ub2Rlcygmc19kZWxfYmFsYW5jZSk7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gcmVpc2VyZnNfZGVsZXRlX2l0ZW0gcmV0dXJucyBpdGVtIGxlbmd0aCB3aGVuIHN1Y2Nlc3MKKyAgICBuX3JldF92YWx1ZSA9IGNhbGNfZGVsZXRlZF9ieXRlc19udW1iZXIoJnNfZGVsX2JhbGFuY2UsIE1fREVMRVRFKTsKKyAgICBxX2loID0gZ2V0X2loKHBfc19wYXRoKSA7CisgICAgcXVvdGFfY3V0X2J5dGVzID0gaWhfaXRlbV9sZW4ocV9paCkgOworCisgICAgLyogaGFjayBzbyB0aGUgcXVvdGEgY29kZSBkb2Vzbid0IGhhdmUgdG8gZ3Vlc3MgaWYgdGhlIGZpbGUKKyAgICAqKiBoYXMgYSB0YWlsLiAgT24gdGFpbCBpbnNlcnQsIHdlIGFsbG9jYXRlIHF1b3RhIGZvciAxIHVuZm9ybWF0dGVkIG5vZGUuCisgICAgKiogV2UgdGVzdCB0aGUgb2Zmc2V0IGJlY2F1c2UgdGhlIHRhaWwgbWlnaHQgaGF2ZSBiZWVuCisgICAgKiogc3BsaXQgaW50byBtdWx0aXBsZSBpdGVtcywgYW5kIHdlIG9ubHkgd2FudCB0byBkZWNyZW1lbnQgZm9yCisgICAgKiogdGhlIHVuZm0gbm9kZSBvbmNlCisgICAgKi8KKyAgICBpZiAoIVNfSVNMTksgKHBfc19pbm9kZS0+aV9tb2RlKSAmJiBpc19kaXJlY3RfbGVfaWgocV9paCkpIHsKKyAgICAgICAgaWYgKChsZV9paF9rX29mZnNldChxX2loKSAmIChwX3Nfc2ItPnNfYmxvY2tzaXplIC0gMSkpID09IDEpIHsKKyAgICAgICAgICAgIHF1b3RhX2N1dF9ieXRlcyA9IHBfc19zYi0+c19ibG9ja3NpemUgKyBVTkZNX1BfU0laRTsKKyAgICAgICAgfSBlbHNlIHsKKwkgICAgcXVvdGFfY3V0X2J5dGVzID0gMCA7CisJfQorICAgIH0KKworICAgIGlmICggcF9zX3VuX2JoICkgIHsKKwlpbnQgb2ZmOworICAgICAgICBjaGFyICpkYXRhIDsKKworCS8qIFdlIGFyZSBpbiBkaXJlY3QyaW5kaXJlY3QgY29udmVyc2lvbiwgc28gbW92ZSB0YWlsIGNvbnRlbnRzCisgICAgICAgICAgIHRvIHRoZSB1bmZvcm1hdHRlZCBub2RlICovCisJLyogbm90ZSwgd2UgZG8gdGhlIGNvcHkgYmVmb3JlIHByZXBhcmluZyB0aGUgYnVmZmVyIGJlY2F1c2Ugd2UKKwkqKiBkb24ndCBjYXJlIGFib3V0IHRoZSBjb250ZW50cyBvZiB0aGUgdW5mb3JtYXR0ZWQgbm9kZSB5ZXQuCisJKiogdGhlIG9ubHkgdGhpbmcgd2UgcmVhbGx5IGNhcmUgYWJvdXQgaXMgdGhlIGRpcmVjdCBpdGVtJ3MgZGF0YQorCSoqIGlzIGluIHRoZSB1bmZvcm1hdHRlZCBub2RlLgorCSoqCisJKiogT3RoZXJ3aXNlLCB3ZSB3b3VsZCBoYXZlIHRvIGNhbGwgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbCBvbgorCSoqIHRoZSB1bmZvcm1hdHRlZCBub2RlLCB3aGljaCBtaWdodCBzY2hlZHVsZSwgbWVhbmluZyB3ZSdkIGhhdmUgdG8KKwkqKiBsb29wIGFsbCB0aGUgd2F5IGJhY2sgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSB3aGlsZSBsb29wLgorCSoqCisJKiogVGhlIHVuZm9ybWF0dGVkIG5vZGUgbXVzdCBiZSBkaXJ0aWVkIGxhdGVyIG9uLiAgV2UgY2FuJ3QgYmUKKwkqKiBzdXJlIGhlcmUgaWYgdGhlIGVudGlyZSB0YWlsIGhhcyBiZWVuIGRlbGV0ZWQgeWV0LgorICAgICAgICAqKgorICAgICAgICAqKiBwX3NfdW5fYmggaXMgZnJvbSB0aGUgcGFnZSBjYWNoZSAoYWxsIHVuZm9ybWF0dGVkIG5vZGVzIGFyZQorICAgICAgICAqKiBmcm9tIHRoZSBwYWdlIGNhY2hlKSBhbmQgbWlnaHQgYmUgYSBoaWdobWVtIHBhZ2UuICBTbywgd2UKKyAgICAgICAgKiogY2FuJ3QgdXNlIHBfc191bl9iaC0+Yl9kYXRhLgorCSoqIC1jbG0KKwkqLworCisgICAgICAgIGRhdGEgPSBrbWFwX2F0b21pYyhwX3NfdW5fYmgtPmJfcGFnZSwgS01fVVNFUjApOworCW9mZiA9ICgobGVfaWhfa19vZmZzZXQgKCZzX2loKSAtIDEpICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKTsKKwltZW1jcHkoZGF0YSArIG9mZiwKKwkgICAgICAgQl9JX1BJVEVNKFBBVEhfUExBU1RfQlVGRkVSKHBfc19wYXRoKSwgJnNfaWgpLCBuX3JldF92YWx1ZSk7CisJa3VubWFwX2F0b21pYyhkYXRhLCBLTV9VU0VSMCk7CisgICAgfQorICAgIC8qIFBlcmZvcm0gYmFsYW5jaW5nIGFmdGVyIGFsbCByZXNvdXJjZXMgaGF2ZSBiZWVuIGNvbGxlY3RlZCBhdCBvbmNlLiAqLyAKKyAgICBkb19iYWxhbmNlKCZzX2RlbF9iYWxhbmNlLCBOVUxMLCBOVUxMLCBNX0RFTEVURSk7CisKKyNpZmRlZiBSRUlTRVJRVU9UQV9ERUJVRworICAgIHJlaXNlcmZzX2RlYnVnIChwX3Nfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJyZWlzZXJxdW90YSBkZWxldGVfaXRlbSgpOiBmcmVlaW5nICV1LCBpZD0ldSB0eXBlPSVjIiwgcXVvdGFfY3V0X2J5dGVzLCBwX3NfaW5vZGUtPmlfdWlkLCBoZWFkMnR5cGUoJnNfaWgpKTsKKyNlbmRpZgorICAgIERRVU9UX0ZSRUVfU1BBQ0VfTk9ESVJUWShwX3NfaW5vZGUsIHF1b3RhX2N1dF9ieXRlcyk7CisKKyAgICAvKiBSZXR1cm4gZGVsZXRlZCBib2R5IGxlbmd0aCAqLworICAgIHJldHVybiBuX3JldF92YWx1ZTsKK30KKworCisvKiBTdW1tYXJ5IE9mIE1lY2hhbmlzbXMgRm9yIEhhbmRsaW5nIENvbGxpc2lvbnMgQmV0d2VlbiBQcm9jZXNzZXM6CisKKyBkZWxldGlvbiBvZiB0aGUgYm9keSBvZiB0aGUgb2JqZWN0IGlzIHBlcmZvcm1lZCBieSBpcHV0KCksIHdpdGggdGhlCisgcmVzdWx0IHRoYXQgaWYgbXVsdGlwbGUgcHJvY2Vzc2VzIGFyZSBvcGVyYXRpbmcgb24gYSBmaWxlLCB0aGUKKyBkZWxldGlvbiBvZiB0aGUgYm9keSBvZiB0aGUgZmlsZSBpcyBkZWZlcnJlZCB1bnRpbCB0aGUgbGFzdCBwcm9jZXNzCisgdGhhdCBoYXMgYW4gb3BlbiBpbm9kZSBwZXJmb3JtcyBpdHMgaXB1dCgpLgorCisgd3JpdGVzIGFuZCB0cnVuY2F0ZXMgYXJlIHByb3RlY3RlZCBmcm9tIGNvbGxpc2lvbnMgYnkgdXNlIG9mCisgc2VtYXBob3Jlcy4KKworIGNyZWF0ZXMsIGxpbmtpbmcsIGFuZCBta25vZCBhcmUgcHJvdGVjdGVkIGZyb20gY29sbGlzaW9ucyB3aXRoIG90aGVyCisgcHJvY2Vzc2VzIGJ5IG1ha2luZyB0aGUgcmVpc2VyZnNfYWRkX2VudHJ5KCkgdGhlIGxhc3Qgc3RlcCBpbiB0aGUKKyBjcmVhdGlvbiwgYW5kIHRoZW4gcm9sbGluZyBiYWNrIGFsbCBjaGFuZ2VzIGlmIHRoZXJlIHdhcyBhIGNvbGxpc2lvbi4KKyAtIEhhbnMKKyovCisKKworLyogdGhpcyBkZWxldGVzIGl0ZW0gd2hpY2ggbmV2ZXIgZ2V0cyBzcGxpdCAqLwordm9pZCByZWlzZXJmc19kZWxldGVfc29saWRfaXRlbSAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsCisJCQkJIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJIHN0cnVjdCByZWlzZXJmc19rZXkgKiBrZXkpCit7CisgICAgc3RydWN0IHRyZWVfYmFsYW5jZSB0YjsKKyAgICBJTklUSUFMSVpFX1BBVEggKHBhdGgpOworICAgIGludCBpdGVtX2xlbiA9IDA7CisgICAgaW50IHRiX2luaXQgPSAwIDsKKyAgICBzdHJ1Y3QgY3B1X2tleSBjcHVfa2V5OworICAgIGludCByZXR2YWw7CisgICAgaW50IHF1b3RhX2N1dF9ieXRlcyA9IDA7CisKKyAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisgICAgCisgICAgbGVfa2V5MmNwdV9rZXkgKCZjcHVfa2V5LCBrZXkpOworICAgIAorICAgIHdoaWxlICgxKSB7CisJcmV0dmFsID0gc2VhcmNoX2l0ZW0gKHRoLT50X3N1cGVyLCAmY3B1X2tleSwgJnBhdGgpOworCWlmIChyZXR2YWwgPT0gSU9fRVJST1IpIHsKKwkgICAgcmVpc2VyZnNfd2FybmluZyAodGgtPnRfc3VwZXIsCisJCQkgICAgICAidnMtNTM1MDogcmVpc2VyZnNfZGVsZXRlX3NvbGlkX2l0ZW06ICIKKwkJCSAgICAgICJpL28gZmFpbHVyZSBvY2N1cnJlZCB0cnlpbmcgdG8gZGVsZXRlICVLIiwKKwkJCSAgICAgICZjcHVfa2V5KTsKKwkgICAgYnJlYWs7CisJfQorCWlmIChyZXR2YWwgIT0gSVRFTV9GT1VORCkgeworCSAgICBwYXRocmVsc2UgKCZwYXRoKTsKKwkgICAgLy8gTm8gbmVlZCBmb3IgYSB3YXJuaW5nLCBpZiB0aGVyZSBpcyBqdXN0IG5vIGZyZWUgc3BhY2UgdG8gaW5zZXJ0ICcuLicgaXRlbSBpbnRvIHRoZSBuZXdseS1jcmVhdGVkIHN1YmRpcgorCSAgICBpZiAoICEoICh1bnNpZ25lZCBsb25nIGxvbmcpIEdFVF9IQVNIX1ZBTFVFIChsZV9rZXlfa19vZmZzZXQgKGxlX2tleV92ZXJzaW9uIChrZXkpLCBrZXkpKSA9PSAwICYmIFwKKwkJICh1bnNpZ25lZCBsb25nIGxvbmcpIEdFVF9HRU5FUkFUSU9OX05VTUJFUiAobGVfa2V5X2tfb2Zmc2V0IChsZV9rZXlfdmVyc2lvbiAoa2V5KSwga2V5KSkgPT0gMSApICkKKwkJcmVpc2VyZnNfd2FybmluZyAodGgtPnRfc3VwZXIsICJ2cy01MzU1OiByZWlzZXJmc19kZWxldGVfc29saWRfaXRlbTogJWsgbm90IGZvdW5kIiwga2V5KTsKKwkgICAgYnJlYWs7CisJfQorCWlmICghdGJfaW5pdCkgeworCSAgICB0Yl9pbml0ID0gMSA7CisJICAgIGl0ZW1fbGVuID0gaWhfaXRlbV9sZW4oIFBBVEhfUElURU1fSEVBRCgmcGF0aCkgKTsKKwkgICAgaW5pdF90Yl9zdHJ1Y3QgKHRoLCAmdGIsIHRoLT50X3N1cGVyLCAmcGF0aCwgLSAoSUhfU0laRSArIGl0ZW1fbGVuKSk7CisJfQorCXF1b3RhX2N1dF9ieXRlcyA9IGloX2l0ZW1fbGVuKFBBVEhfUElURU1fSEVBRCgmcGF0aCkpIDsKKworCXJldHZhbCA9IGZpeF9ub2RlcyAoTV9ERUxFVEUsICZ0YiwgTlVMTCwgTlVMTCk7CisJaWYgKHJldHZhbCA9PSBSRVBFQVRfU0VBUkNIKSB7CisJICAgIFBST0NfSU5GT19JTkMoIHRoIC0+IHRfc3VwZXIsIGRlbGV0ZV9zb2xpZF9pdGVtX3Jlc3RhcnRlZCApOworCSAgICBjb250aW51ZTsKKwl9CisKKwlpZiAocmV0dmFsID09IENBUlJZX09OKSB7CisJICAgIGRvX2JhbGFuY2UgKCZ0YiwgTlVMTCwgTlVMTCwgTV9ERUxFVEUpOworCSAgICBpZiAoaW5vZGUpIHsJLyogU2hvdWxkIHdlIGNvdW50IHF1b3RhIGZvciBpdGVtPyAod2UgZG9uJ3QgY291bnQgcXVvdGFzIGZvciBzYXZlLWxpbmtzKSAqLworI2lmZGVmIFJFSVNFUlFVT1RBX0RFQlVHCisJCXJlaXNlcmZzX2RlYnVnICh0aC0+dF9zdXBlciwgUkVJU0VSRlNfREVCVUdfQ09ERSwgInJlaXNlcnF1b3RhIGRlbGV0ZV9zb2xpZF9pdGVtKCk6IGZyZWVpbmcgJXUgaWQ9JXUgdHlwZT0lYyIsIHF1b3RhX2N1dF9ieXRlcywgaW5vZGUtPmlfdWlkLCBrZXkydHlwZShrZXkpKTsKKyNlbmRpZgorCQlEUVVPVF9GUkVFX1NQQUNFX05PRElSVFkoaW5vZGUsIHF1b3RhX2N1dF9ieXRlcyk7CisJICAgIH0KKwkgICAgYnJlYWs7CisJfQorCisJLy8gSU9fRVJST1IsIE5PX0RJU0tfU1BBQ0UsIGV0YworCXJlaXNlcmZzX3dhcm5pbmcgKHRoLT50X3N1cGVyLCAidnMtNTM2MDogcmVpc2VyZnNfZGVsZXRlX3NvbGlkX2l0ZW06ICIKKwkJCSAgImNvdWxkIG5vdCBkZWxldGUgJUsgZHVlIHRvIGZpeF9ub2RlcyBmYWlsdXJlIiwgJmNwdV9rZXkpOworCXVuZml4X25vZGVzICgmdGIpOworCWJyZWFrOworICAgIH0KKworICAgIHJlaXNlcmZzX2NoZWNrX3BhdGgoJnBhdGgpIDsKK30KKworCitpbnQgcmVpc2VyZnNfZGVsZXRlX29iamVjdCAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworICAgIGludCBlcnI7CisgICAgaW5vZGUtPmlfc2l6ZSA9IDA7CisgICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCisgICAgLyogZm9yIGRpcmVjdG9yeSB0aGlzIGRlbGV0ZXMgaXRlbSBjb250YWluaW5nICIuIiBhbmQgIi4uIiAqLworICAgIGVyciA9IHJlaXNlcmZzX2RvX3RydW5jYXRlICh0aCwgaW5vZGUsIE5VTEwsIDAvKm5vIHRpbWVzdGFtcCB1cGRhdGVzKi8pOworICAgIGlmIChlcnIpCisgICAgICAgIHJldHVybiBlcnI7CisgICAgCisjaWYgZGVmaW5lZCggVVNFX0lOT0RFX0dFTkVSQVRJT05fQ09VTlRFUiApCisgICAgaWYoICFvbGRfZm9ybWF0X29ubHkgKCB0aCAtPiB0X3N1cGVyICkgKQorICAgICAgeworICAgICAgIF9fdTMyICppbm9kZV9nZW5lcmF0aW9uOworICAgICAgIAorICAgICAgIGlub2RlX2dlbmVyYXRpb24gPSAKKyAgICAgICAgICZSRUlTRVJGU19TQih0aCAtPiB0X3N1cGVyKSAtPiBzX3JzIC0+IHNfaW5vZGVfZ2VuZXJhdGlvbjsKKyAgICAgICAqaW5vZGVfZ2VuZXJhdGlvbiA9IGNwdV90b19sZTMyKCBsZTMyX3RvX2NwdSggKmlub2RlX2dlbmVyYXRpb24gKSArIDEgKTsKKyAgICAgIH0KKy8qIFVTRV9JTk9ERV9HRU5FUkFUSU9OX0NPVU5URVIgKi8KKyNlbmRpZgorICAgIHJlaXNlcmZzX2RlbGV0ZV9zb2xpZF9pdGVtICh0aCwgaW5vZGUsIElOT0RFX1BLRVkgKGlub2RlKSk7CisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZAordW5tYXBfYnVmZmVycyhzdHJ1Y3QgcGFnZSAqcGFnZSwgbG9mZl90IHBvcykgeworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmggOworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqaGVhZCA7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpuZXh0IDsKKyAgICB1bnNpZ25lZCBsb25nIHRhaWxfaW5kZXggOworICAgIHVuc2lnbmVkIGxvbmcgY3VyX2luZGV4IDsKKworICAgIGlmIChwYWdlKSB7CisJaWYgKHBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpIHsKKwkgICAgdGFpbF9pbmRleCA9IHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSA7CisJICAgIGN1cl9pbmRleCA9IDAgOworCSAgICBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpIDsKKwkgICAgYmggPSBoZWFkIDsKKwkgICAgZG8geworCQluZXh0ID0gYmgtPmJfdGhpc19wYWdlIDsKKworCQkvKiB3ZSB3YW50IHRvIHVubWFwIHRoZSBidWZmZXJzIHRoYXQgY29udGFpbiB0aGUgdGFpbCwgYW5kCisJCSoqIGFsbCB0aGUgYnVmZmVycyBhZnRlciBpdCAoc2luY2UgdGhlIHRhaWwgbXVzdCBiZSBhdCB0aGUKKwkJKiogZW5kIG9mIHRoZSBmaWxlKS4gIFdlIGRvbid0IHdhbnQgdG8gdW5tYXAgZmlsZSBkYXRhCisJCSoqIGJlZm9yZSB0aGUgdGFpbCwgc2luY2UgaXQgbWlnaHQgYmUgZGlydHkgYW5kIHdhaXRpbmcgdG8KKwkJKiogcmVhY2ggZGlzaworCQkqLworCQljdXJfaW5kZXggKz0gYmgtPmJfc2l6ZSA7CisJCWlmIChjdXJfaW5kZXggPiB0YWlsX2luZGV4KSB7CisJCSAgICByZWlzZXJmc191bm1hcF9idWZmZXIoYmgpIDsKKwkJfQorCQliaCA9IG5leHQgOworCSAgICB9IHdoaWxlIChiaCAhPSBoZWFkKSA7CisJICAgIGlmICggUEFHRV9TSVpFID09IGJoLT5iX3NpemUgKSB7CisJCWNsZWFyX3BhZ2VfZGlydHkocGFnZSk7CisJICAgIH0KKwl9CisgICAgfQorfQorCitzdGF0aWMgaW50IG1heWJlX2luZGlyZWN0X3RvX2RpcmVjdCAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIAorCQkJICAgICAgc3RydWN0IGlub2RlICogcF9zX2lub2RlLAorCQkJICAgICAgc3RydWN0IHBhZ2UgKnBhZ2UsIAorCQkJICAgICAgc3RydWN0IHBhdGggICAgICAgICAqIHBfc19wYXRoLAorCQkJICAgICAgY29uc3Qgc3RydWN0IGNwdV9rZXkgICAgICAqIHBfc19pdGVtX2tleSwKKwkJCSAgICAgIGxvZmZfdCAgICAgICAgIG5fbmV3X2ZpbGVfc2l6ZSwKKwkJCSAgICAgIGNoYXIgICAgICAgICAgICAgICAgKiBwX2NfbW9kZQorCQkJICAgICAgKSB7CisgICAgc3RydWN0IHN1cGVyX2Jsb2NrICogcF9zX3NiID0gcF9zX2lub2RlLT5pX3NiOworICAgIGludCBuX2Jsb2NrX3NpemUgPSBwX3Nfc2ItPnNfYmxvY2tzaXplOworICAgIGludCBjdXRfYnl0ZXM7CisgICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCisgICAgaWYgKG5fbmV3X2ZpbGVfc2l6ZSAhPSBwX3NfaW5vZGUtPmlfc2l6ZSkKKwlCVUcgKCk7CisKKyAgICAvKiB0aGUgcGFnZSBiZWluZyBzZW50IGluIGNvdWxkIGJlIE5VTEwgaWYgdGhlcmUgd2FzIGFuIGkvbyBlcnJvcgorICAgICoqIHJlYWRpbmcgaW4gdGhlIGxhc3QgYmxvY2suICBUaGUgdXNlciB3aWxsIGhpdCBwcm9ibGVtcyB0cnlpbmcgdG8KKyAgICAqKiByZWFkIHRoZSBmaWxlLCBidXQgZm9yIG5vdyB3ZSBqdXN0IHNraXAgdGhlIGluZGlyZWN0MmRpcmVjdAorICAgICovCisgICAgaWYgKGF0b21pY19yZWFkKCZwX3NfaW5vZGUtPmlfY291bnQpID4gMSB8fCAKKyAgICAgICAgIXRhaWxfaGFzX3RvX2JlX3BhY2tlZCAocF9zX2lub2RlKSB8fCAKKwkhcGFnZSB8fCAoUkVJU0VSRlNfSShwX3NfaW5vZGUpLT5pX2ZsYWdzICYgaV9ub3BhY2tfbWFzaykpIHsKKwkvLyBsZWF2ZSB0YWlsIGluIGFuIHVuZm9ybWF0dGVkIG5vZGUJCisJKnBfY19tb2RlID0gTV9TS0lQX0JBTEFOQ0lORzsKKwljdXRfYnl0ZXMgPSBuX2Jsb2NrX3NpemUgLSAobl9uZXdfZmlsZV9zaXplICYgKG5fYmxvY2tfc2l6ZSAtIDEpKTsKKwlwYXRocmVsc2UocF9zX3BhdGgpOworCXJldHVybiBjdXRfYnl0ZXM7CisgICAgfQorICAgIC8qIFBlcm1vcm0gdGhlIGNvbnZlcnNpb24gdG8gYSBkaXJlY3RfaXRlbS4gKi8KKyAgICAvKnJldHVybiBpbmRpcmVjdF90b19kaXJlY3QgKHBfc19pbm9kZSwgcF9zX3BhdGgsIHBfc19pdGVtX2tleSwgbl9uZXdfZmlsZV9zaXplLCBwX2NfbW9kZSk7Ki8KKyAgICByZXR1cm4gaW5kaXJlY3QyZGlyZWN0ICh0aCwgcF9zX2lub2RlLCBwYWdlLCBwX3NfcGF0aCwgcF9zX2l0ZW1fa2V5LCBuX25ld19maWxlX3NpemUsIHBfY19tb2RlKTsKK30KKworCisvKiB3ZSBkaWQgaW5kaXJlY3RfdG9fZGlyZWN0IGNvbnZlcnNpb24uIEFuZCB3ZSBoYXZlIGluc2VydGVkIGRpcmVjdAorICAgaXRlbSBzdWNjZXNzZXNmdWxseSwgYnV0IHRoZXJlIHdlcmUgbm8gZGlzayBzcGFjZSB0byBjdXQgdW5mbQorICAgcG9pbnRlciBiZWluZyBjb252ZXJ0ZWQuIFRoZXJlZm9yZSB3ZSBoYXZlIHRvIGRlbGV0ZSBpbnNlcnRlZAorICAgZGlyZWN0IGl0ZW0ocykgKi8KK3N0YXRpYyB2b2lkIGluZGlyZWN0X3RvX2RpcmVjdF9yb2xsX2JhY2sgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IHBhdGggKiBwYXRoKQoreworICAgIHN0cnVjdCBjcHVfa2V5IHRhaWxfa2V5OworICAgIGludCB0YWlsX2xlbjsKKyAgICBpbnQgcmVtb3ZlZDsKKyAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisKKyAgICBtYWtlX2NwdV9rZXkgKCZ0YWlsX2tleSwgaW5vZGUsIGlub2RlLT5pX3NpemUgKyAxLCBUWVBFX0RJUkVDVCwgNCk7Ly8gISEhIQorICAgIHRhaWxfa2V5LmtleV9sZW5ndGggPSA0OworCisgICAgdGFpbF9sZW4gPSAoY3B1X2tleV9rX29mZnNldCAoJnRhaWxfa2V5KSAmIChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSkgLSAxOworICAgIHdoaWxlICh0YWlsX2xlbikgeworCS8qIGxvb2sgZm9yIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIHRhaWwgKi8KKwlpZiAoc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkgKGlub2RlLT5pX3NiLCAmdGFpbF9rZXksIHBhdGgpID09IFBPU0lUSU9OX05PVF9GT1VORCkKKwkgICAgcmVpc2VyZnNfcGFuaWMgKGlub2RlLT5pX3NiLCAidnMtNTYxNTogaW5kaXJlY3RfdG9fZGlyZWN0X3JvbGxfYmFjazogZm91bmQgaW52YWxpZCBpdGVtIik7CisJUkZBTFNFKCBwYXRoLT5wb3NfaW5faXRlbSAhPSBpaF9pdGVtX2xlbihQQVRIX1BJVEVNX0hFQUQgKHBhdGgpKSAtIDEsCisJICAgICAgICAidnMtNTYxNjogYXBwZW5kZWQgYnl0ZXMgZm91bmQiKTsKKwlQQVRIX0xBU1RfUE9TSVRJT04gKHBhdGgpIC0tOworCQorCXJlbW92ZWQgPSByZWlzZXJmc19kZWxldGVfaXRlbSAodGgsIHBhdGgsICZ0YWlsX2tleSwgaW5vZGUsIE5VTEwvKnVuYmggbm90IG5lZWRlZCovKTsKKwlSRkFMU0UoIHJlbW92ZWQgPD0gMCB8fCByZW1vdmVkID4gdGFpbF9sZW4sCisJICAgICAgICAidnMtNTYxNzogdGhlcmUgd2FzIHRhaWwgJWQgYnl0ZXMsIHJlbW92ZWQgaXRlbSBsZW5ndGggJWQgYnl0ZXMiLAorICAgICAgICAgICAgICAgIHRhaWxfbGVuLCByZW1vdmVkKTsKKwl0YWlsX2xlbiAtPSByZW1vdmVkOworCXNldF9jcHVfa2V5X2tfb2Zmc2V0ICgmdGFpbF9rZXksIGNwdV9rZXlfa19vZmZzZXQgKCZ0YWlsX2tleSkgLSByZW1vdmVkKTsKKyAgICB9CisgICAgcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICJpbmRpcmVjdF90b19kaXJlY3Rfcm9sbF9iYWNrOiBpbmRpcmVjdF90b19kaXJlY3QgY29udmVyc2lvbiBoYXMgYmVlbiByb2xsZWQgYmFjayBkdWUgdG8gbGFjayBvZiBkaXNrIHNwYWNlIik7CisgICAgLy9tYXJrX2ZpbGVfd2l0aG91dF90YWlsIChpbm9kZSk7CisgICAgbWFya19pbm9kZV9kaXJ0eSAoaW5vZGUpOworfQorCisKKy8qIChUcnVuY2F0ZSBvciBjdXQgZW50cnkpIG9yIGRlbGV0ZSBvYmplY3QgaXRlbS4gUmV0dXJucyA8IDAgb24gZmFpbHVyZSAqLworaW50IHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW0gKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCAKKwkJCSAgICBzdHJ1Y3QgcGF0aCAqIHBfc19wYXRoLAorCQkJICAgIHN0cnVjdCBjcHVfa2V5ICogcF9zX2l0ZW1fa2V5LAorCQkJICAgIHN0cnVjdCBpbm9kZSAqIHBfc19pbm9kZSwKKwkJCSAgICBzdHJ1Y3QgcGFnZSAqcGFnZSwgCisJCQkgICAgbG9mZl90IG5fbmV3X2ZpbGVfc2l6ZSkKK3sKKyAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBwX3Nfc2IgPSBwX3NfaW5vZGUtPmlfc2I7CisgICAgLyogRXZlcnkgZnVuY3Rpb24gd2hpY2ggaXMgZ29pbmcgdG8gY2FsbCBkb19iYWxhbmNlIG11c3QgZmlyc3QKKyAgICAgICBjcmVhdGUgYSB0cmVlX2JhbGFuY2Ugc3RydWN0dXJlLiAgVGhlbiBpdCBtdXN0IGZpbGwgdXAgdGhpcworICAgICAgIHN0cnVjdHVyZSBieSB1c2luZyB0aGUgaW5pdF90Yl9zdHJ1Y3QgYW5kIGZpeF9ub2RlcyBmdW5jdGlvbnMuCisgICAgICAgQWZ0ZXIgdGhhdCB3ZSBjYW4gbWFrZSB0cmVlIGJhbGFuY2luZy4gKi8KKyAgICBzdHJ1Y3QgdHJlZV9iYWxhbmNlIHNfY3V0X2JhbGFuY2U7CisgICAgc3RydWN0IGl0ZW1faGVhZCAqcF9sZV9paDsKKyAgICBpbnQgbl9jdXRfc2l6ZSA9IDAsICAgICAgICAvKiBBbW91bnQgdG8gYmUgY3V0LiAqLworCW5fcmV0X3ZhbHVlID0gQ0FSUllfT04sCisJbl9yZW1vdmVkID0gMCwgICAgIC8qIE51bWJlciBvZiB0aGUgcmVtb3ZlZCB1bmZvcm1hdHRlZCBub2Rlcy4gKi8KKwluX2lzX2lub2RlX2xvY2tlZCA9IDA7CisgICAgY2hhciAgICAgICAgICAgICAgICBjX21vZGU7ICAgICAgICAgICAgLyogTW9kZSBvZiB0aGUgYmFsYW5jZS4gKi8KKyAgICBpbnQgcmV0dmFsMiA9IC0xOworICAgIGludCBxdW90YV9jdXRfYnl0ZXM7CisgICAgbG9mZl90IHRhaWxfcG9zID0gMDsKKworICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKyAgICAKKyAgICBpbml0X3RiX3N0cnVjdCh0aCwgJnNfY3V0X2JhbGFuY2UsIHBfc19pbm9kZS0+aV9zYiwgcF9zX3BhdGgsIG5fY3V0X3NpemUpOworCisKKyAgICAvKiBSZXBlYXQgdGhpcyBsb29wIHVudGlsIHdlIGVpdGhlciBjdXQgdGhlIGl0ZW0gd2l0aG91dCBuZWVkaW5nCisgICAgICAgdG8gYmFsYW5jZSwgb3Igd2UgZml4X25vZGVzIHdpdGhvdXQgc2NoZWR1bGUgb2NjdXJyaW5nICovCisgICAgd2hpbGUgKCAxICkgeworCS8qIERldGVybWluZSB0aGUgYmFsYW5jZSBtb2RlLCBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgYnl0ZSB0bworCSAgIGJlIGN1dCwgYW5kIHNpemUgdG8gYmUgY3V0LiAgSW4gY2FzZSBvZiB0aGUgaW5kaXJlY3QgaXRlbQorCSAgIGZyZWUgdW5mb3JtYXR0ZWQgbm9kZXMgd2hpY2ggYXJlIHBvaW50ZWQgdG8gYnkgdGhlIGN1dAorCSAgIHBvaW50ZXJzLiAqLworICAgICAgCisJY19tb2RlID0gcHJlcGFyZV9mb3JfZGVsZXRlX29yX2N1dCh0aCwgcF9zX2lub2RlLCBwX3NfcGF0aCwgcF9zX2l0ZW1fa2V5LCAmbl9yZW1vdmVkLCAKKwkJCQkJICAgJm5fY3V0X3NpemUsIG5fbmV3X2ZpbGVfc2l6ZSk7CisJaWYgKCBjX21vZGUgPT0gTV9DT05WRVJUICkgIHsKKwkgICAgLyogY29udmVydCBsYXN0IHVuZm9ybWF0dGVkIG5vZGUgdG8gZGlyZWN0IGl0ZW0gb3IgbGVhdmUKKyAgICAgICAgICAgICAgIHRhaWwgaW4gdGhlIHVuZm9ybWF0dGVkIG5vZGUgKi8KKwkgICAgUkZBTFNFKCBuX3JldF92YWx1ZSAhPSBDQVJSWV9PTiwgIlBBUC01NTcwOiBjYW4gbm90IGNvbnZlcnQgdHdpY2UiKTsKKworCSAgICBuX3JldF92YWx1ZSA9IG1heWJlX2luZGlyZWN0X3RvX2RpcmVjdCAodGgsIHBfc19pbm9kZSwgcGFnZSwgcF9zX3BhdGgsIHBfc19pdGVtX2tleSwKKwkJCQkJCSAgICBuX25ld19maWxlX3NpemUsICZjX21vZGUpOworCSAgICBpZiAoIGNfbW9kZSA9PSBNX1NLSVBfQkFMQU5DSU5HICkKKwkJLyogdGFpbCBoYXMgYmVlbiBsZWZ0IGluIHRoZSB1bmZvcm1hdHRlZCBub2RlICovCisJCXJldHVybiBuX3JldF92YWx1ZTsKKworCSAgICBuX2lzX2lub2RlX2xvY2tlZCA9IDE7CisJICAKKwkgICAgLyogcmVtb3Zpbmcgb2YgbGFzdCB1bmZvcm1hdHRlZCBub2RlIHdpbGwgY2hhbmdlIHZhbHVlIHdlCisgICAgICAgICAgICAgICBoYXZlIHRvIHJldHVybiB0byB0cnVuY2F0ZS4gU2F2ZSBpdCAqLworCSAgICByZXR2YWwyID0gbl9yZXRfdmFsdWU7CisJICAgIC8qcmV0dmFsMiA9IHBfc19zYi0+c19ibG9ja3NpemUgLSAobl9uZXdfZmlsZV9zaXplICYgKHBfc19zYi0+c19ibG9ja3NpemUgLSAxKSk7Ki8KKwkgIAorCSAgICAvKiBTbywgd2UgaGF2ZSBwZXJmb3JtZWQgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGNvbnZlcnNpb246CisJICAgICAgIGluc2VydGluZyB0aGUgbmV3IGRpcmVjdCBpdGVtLiAgTm93IHdlIGFyZSByZW1vdmluZyB0aGUKKwkgICAgICAgbGFzdCB1bmZvcm1hdHRlZCBub2RlIHBvaW50ZXIuIFNldCBrZXkgdG8gc2VhcmNoIGZvcgorCSAgICAgICBpdC4gKi8KKyAgICAgIAkgICAgc2V0X2NwdV9rZXlfa190eXBlIChwX3NfaXRlbV9rZXksIFRZUEVfSU5ESVJFQ1QpOworCSAgICBwX3NfaXRlbV9rZXktPmtleV9sZW5ndGggPSA0OworCSAgICBuX25ld19maWxlX3NpemUgLT0gKG5fbmV3X2ZpbGVfc2l6ZSAmIChwX3Nfc2ItPnNfYmxvY2tzaXplIC0gMSkpOworCSAgICB0YWlsX3BvcyA9IG5fbmV3X2ZpbGVfc2l6ZTsKKwkgICAgc2V0X2NwdV9rZXlfa19vZmZzZXQgKHBfc19pdGVtX2tleSwgbl9uZXdfZmlsZV9zaXplICsgMSk7CisJICAgIGlmICggc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkocF9zX3NiLCBwX3NfaXRlbV9rZXksIHBfc19wYXRoKSA9PSBQT1NJVElPTl9OT1RfRk9VTkQgKXsKKwkJcHJpbnRfYmxvY2sgKFBBVEhfUExBU1RfQlVGRkVSIChwX3NfcGF0aCksIDMsIFBBVEhfTEFTVF9QT1NJVElPTiAocF9zX3BhdGgpIC0gMSwgUEFUSF9MQVNUX1BPU0lUSU9OIChwX3NfcGF0aCkgKyAxKTsKKwkJcmVpc2VyZnNfcGFuaWMocF9zX3NiLCAiUEFQLTU1ODA6IHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW06IGl0ZW0gdG8gY29udmVydCBkb2VzIG5vdCBleGlzdCAoJUspIiwgcF9zX2l0ZW1fa2V5KTsKKwkgICAgfQorCSAgICBjb250aW51ZTsKKwl9CisJaWYgKG5fY3V0X3NpemUgPT0gMCkgeworCSAgICBwYXRocmVsc2UgKHBfc19wYXRoKTsKKwkgICAgcmV0dXJuIDA7CisJfQorCisJc19jdXRfYmFsYW5jZS5pbnNlcnRfc2l6ZVswXSA9IG5fY3V0X3NpemU7CisJCisJbl9yZXRfdmFsdWUgPSBmaXhfbm9kZXMoY19tb2RlLCAmc19jdXRfYmFsYW5jZSwgTlVMTCwgTlVMTCk7CisgICAgICAJaWYgKCBuX3JldF92YWx1ZSAhPSBSRVBFQVRfU0VBUkNIICkKKwkgICAgYnJlYWs7CisJCisJUFJPQ19JTkZPX0lOQyggcF9zX3NiLCBjdXRfZnJvbV9pdGVtX3Jlc3RhcnRlZCApOworCisJbl9yZXRfdmFsdWUgPSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShwX3Nfc2IsIHBfc19pdGVtX2tleSwgcF9zX3BhdGgpOworCWlmIChuX3JldF92YWx1ZSA9PSBQT1NJVElPTl9GT1VORCkKKwkgICAgY29udGludWU7CisKKwlyZWlzZXJmc193YXJuaW5nIChwX3Nfc2IsICJQQVAtNTYxMDogcmVpc2VyZnNfY3V0X2Zyb21faXRlbTogaXRlbSAlSyBub3QgZm91bmQiLCBwX3NfaXRlbV9rZXkpOworCXVuZml4X25vZGVzICgmc19jdXRfYmFsYW5jZSk7CisJcmV0dXJuIChuX3JldF92YWx1ZSA9PSBJT19FUlJPUikgPyAtRUlPIDogLUVOT0VOVDsKKyAgICB9IC8qIHdoaWxlICovCisgIAorICAgIC8vIGNoZWNrIGZpeF9ub2RlcyByZXN1bHRzIChJT19FUlJPUiBvciBOT19ESVNLX1NQQUNFKQorICAgIGlmICggbl9yZXRfdmFsdWUgIT0gQ0FSUllfT04gKSB7CisJaWYgKCBuX2lzX2lub2RlX2xvY2tlZCApIHsKKwkgICAgLy8gRklYTUU6IHRoaXMgc2VlbXMgdG8gYmUgbm90IG5lZWRlZDogd2UgYXJlIGFsd2F5cyBhYmxlCisJICAgIC8vIHRvIGN1dCBpdGVtCisJICAgIGluZGlyZWN0X3RvX2RpcmVjdF9yb2xsX2JhY2sgKHRoLCBwX3NfaW5vZGUsIHBfc19wYXRoKTsKKwl9CisJaWYgKG5fcmV0X3ZhbHVlID09IE5PX0RJU0tfU1BBQ0UpCisJICAgIHJlaXNlcmZzX3dhcm5pbmcgKHBfc19zYiwgIk5PX0RJU0tfU1BBQ0UiKTsKKwl1bmZpeF9ub2RlcyAoJnNfY3V0X2JhbGFuY2UpOworCXJldHVybiAtRUlPOworICAgIH0KKworICAgIC8qIGdvIGFoZWFkIGFuZCBwZXJmb3JtIGJhbGFuY2luZyAqLworICAgIAorICAgIFJGQUxTRSggY19tb2RlID09IE1fUEFTVEUgfHwgY19tb2RlID09IE1fSU5TRVJULCAiaW52YWxpZCBtb2RlIik7CisKKyAgICAvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbmVlZCB0byBiZSBjdXQgZnJvbSB0aGUgaXRlbS4gKi8KKyAgICBxdW90YV9jdXRfYnl0ZXMgPSAoIGNfbW9kZSA9PSBNX0RFTEVURSApID8gaWhfaXRlbV9sZW4oZ2V0X2loKHBfc19wYXRoKSkgOiAtc19jdXRfYmFsYW5jZS5pbnNlcnRfc2l6ZVswXTsKKyAgICBpZiAocmV0dmFsMiA9PSAtMSkKKwluX3JldF92YWx1ZSA9IGNhbGNfZGVsZXRlZF9ieXRlc19udW1iZXIoJnNfY3V0X2JhbGFuY2UsIGNfbW9kZSk7CisgICAgZWxzZQorCW5fcmV0X3ZhbHVlID0gcmV0dmFsMjsKKworCisgICAgLyogRm9yIGRpcmVjdCBpdGVtcywgd2Ugb25seSBjaGFuZ2UgdGhlIHF1b3RhIHdoZW4gZGVsZXRpbmcgdGhlIGxhc3QKKyAgICAqKiBpdGVtLgorICAgICovCisgICAgcF9sZV9paCA9IFBBVEhfUElURU1fSEVBRCAoc19jdXRfYmFsYW5jZS50Yl9wYXRoKTsKKyAgICBpZiAoIVNfSVNMTksgKHBfc19pbm9kZS0+aV9tb2RlKSAmJiBpc19kaXJlY3RfbGVfaWgocF9sZV9paCkpIHsKKyAgICAgICAgaWYgKGNfbW9kZSA9PSBNX0RFTEVURSAmJgorCSAgIChsZV9paF9rX29mZnNldCAocF9sZV9paCkgJiAocF9zX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKSA9PSAxICkgeworCSAgICAvLyBGSVhNRTogdGhpcyBpcyB0byBrZWVwIDMuNSBoYXBweQorCSAgICBSRUlTRVJGU19JKHBfc19pbm9kZSktPmlfZmlyc3RfZGlyZWN0X2J5dGUgPSBVMzJfTUFYOworCSAgICBxdW90YV9jdXRfYnl0ZXMgPSBwX3Nfc2ItPnNfYmxvY2tzaXplICsgVU5GTV9QX1NJWkUgOworICAgICAgICB9IGVsc2UgeworCSAgICBxdW90YV9jdXRfYnl0ZXMgPSAwIDsKKwl9CisgICAgfQorI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSworICAgIGlmIChuX2lzX2lub2RlX2xvY2tlZCkgeworCXN0cnVjdCBpdGVtX2hlYWQgKiBsZV9paCA9IFBBVEhfUElURU1fSEVBRCAoc19jdXRfYmFsYW5jZS50Yl9wYXRoKTsKKwkvKiB3ZSBhcmUgZ29pbmcgdG8gY29tcGxldGUgaW5kaXJlY3QyZGlyZWN0IGNvbnZlcnNpb24uIE1ha2UKKyAgICAgICAgICAgc3VyZSwgdGhhdCB3ZSBleGFjdGx5IHJlbW92ZSBsYXN0IHVuZm9ybWF0dGVkIG5vZGUgcG9pbnRlcgorICAgICAgICAgICBvZiB0aGUgaXRlbSAqLworCWlmICghaXNfaW5kaXJlY3RfbGVfaWggKGxlX2loKSkKKwkgICAgcmVpc2VyZnNfcGFuaWMgKHBfc19zYiwgInZzLTU2NTI6IHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW06ICIKKwkJCSAgICAiaXRlbSBtdXN0IGJlIGluZGlyZWN0ICVoIiwgbGVfaWgpOworCisJaWYgKGNfbW9kZSA9PSBNX0RFTEVURSAmJiBpaF9pdGVtX2xlbihsZV9paCkgIT0gVU5GTV9QX1NJWkUpCisJICAgIHJlaXNlcmZzX3BhbmljIChwX3Nfc2IsICJ2cy01NjUzOiByZWlzZXJmc19jdXRfZnJvbV9pdGVtOiAiCisJCQkgICAgImNvbXBsZXRpbmcgaW5kaXJlY3QyZGlyZWN0IGNvbnZlcnNpb24gaW5kaXJlY3QgaXRlbSAlaCAiCisJCQkgICAgImJlaW5nIGRlbGV0ZWQgbXVzdCBiZSBvZiA0IGJ5dGUgbG9uZyIsIGxlX2loKTsKKworCWlmIChjX21vZGUgPT0gTV9DVVQgJiYgc19jdXRfYmFsYW5jZS5pbnNlcnRfc2l6ZVswXSAhPSAtVU5GTV9QX1NJWkUpIHsKKwkgICAgcmVpc2VyZnNfcGFuaWMgKHBfc19zYiwgInZzLTU2NTQ6IHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW06ICIKKwkJCSAgICAiY2FuIG5vdCBjb21wbGV0ZSBpbmRpcmVjdDJkaXJlY3QgY29udmVyc2lvbiBvZiAlaCAoQ1VULCBpbnNlcnRfc2l6ZT09JWQpIiwKKwkJCSAgICBsZV9paCwgc19jdXRfYmFsYW5jZS5pbnNlcnRfc2l6ZVswXSk7CisJfQorCS8qIGl0IHdvdWxkIGJlIHVzZWZ1bCB0byBtYWtlIHN1cmUsIHRoYXQgcmlnaHQgbmVpZ2hib3JpbmcKKyAgICAgICAgICAgaXRlbSBpcyBkaXJlY3QgaXRlbSBvZiB0aGlzIGZpbGUgKi8KKyAgICB9CisjZW5kaWYKKyAgICAKKyAgICBkb19iYWxhbmNlKCZzX2N1dF9iYWxhbmNlLCBOVUxMLCBOVUxMLCBjX21vZGUpOworICAgIGlmICggbl9pc19pbm9kZV9sb2NrZWQgKSB7CisJLyogd2UndmUgZG9uZSBhbiBpbmRpcmVjdC0+ZGlyZWN0IGNvbnZlcnNpb24uICB3aGVuIHRoZSBkYXRhIGJsb2NrCisJKiogd2FzIGZyZWVkLCBpdCB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IG9mIGJsb2NrcyB0aGF0IG11c3QKKwkqKiBiZSBmbHVzaGVkIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gY29tbWl0cywgbWFrZSBzdXJlIHRvCisJKiogdW5tYXAgYW5kIGludmFsaWRhdGUgaXQKKwkqLworCXVubWFwX2J1ZmZlcnMocGFnZSwgdGFpbF9wb3MpOworCVJFSVNFUkZTX0kocF9zX2lub2RlKS0+aV9mbGFncyAmPSB+aV9wYWNrX29uX2Nsb3NlX21hc2sgOworICAgIH0KKyNpZmRlZiBSRUlTRVJRVU9UQV9ERUJVRworICAgIHJlaXNlcmZzX2RlYnVnIChwX3NfaW5vZGUtPmlfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJyZWlzZXJxdW90YSBjdXRfZnJvbV9pdGVtKCk6IGZyZWVpbmcgJXUgaWQ9JXUgdHlwZT0lYyIsIHF1b3RhX2N1dF9ieXRlcywgcF9zX2lub2RlLT5pX3VpZCwgJz8nKTsKKyNlbmRpZgorICAgIERRVU9UX0ZSRUVfU1BBQ0VfTk9ESVJUWShwX3NfaW5vZGUsIHF1b3RhX2N1dF9ieXRlcyk7CisgICAgcmV0dXJuIG5fcmV0X3ZhbHVlOworfQorCitzdGF0aWMgdm9pZCB0cnVuY2F0ZV9kaXJlY3RvcnkgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKyAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisgICAgaWYgKGlub2RlLT5pX25saW5rKQorCXJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLAorCQkJICAidnMtNTY1NTogdHJ1bmNhdGVfZGlyZWN0b3J5OiBsaW5rIGNvdW50ICE9IDAiKTsKKworICAgIHNldF9sZV9rZXlfa19vZmZzZXQgKEtFWV9GT1JNQVRfM181LCBJTk9ERV9QS0VZIChpbm9kZSksIERPVF9PRkZTRVQpOworICAgIHNldF9sZV9rZXlfa190eXBlIChLRVlfRk9STUFUXzNfNSwgSU5PREVfUEtFWSAoaW5vZGUpLCBUWVBFX0RJUkVOVFJZKTsKKyAgICByZWlzZXJmc19kZWxldGVfc29saWRfaXRlbSAodGgsIGlub2RlLCBJTk9ERV9QS0VZIChpbm9kZSkpOworICAgIHJlaXNlcmZzX3VwZGF0ZV9zZCh0aCwgaW5vZGUpIDsKKyAgICBzZXRfbGVfa2V5X2tfb2Zmc2V0IChLRVlfRk9STUFUXzNfNSwgSU5PREVfUEtFWSAoaW5vZGUpLCBTRF9PRkZTRVQpOworICAgIHNldF9sZV9rZXlfa190eXBlIChLRVlfRk9STUFUXzNfNSwgSU5PREVfUEtFWSAoaW5vZGUpLCBUWVBFX1NUQVRfREFUQSk7ICAgIAorfQorCisKKworCisvKiBUcnVuY2F0ZSBmaWxlIHRvIHRoZSBuZXcgc2l6ZS4gTm90ZSwgdGhpcyBtdXN0IGJlIGNhbGxlZCB3aXRoIGEgdHJhbnNhY3Rpb24KKyAgIGFscmVhZHkgc3RhcnRlZCAqLworaW50IHJlaXNlcmZzX2RvX3RydW5jYXRlIChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwKKwkJCSAgIHN0cnVjdCAgaW5vZGUgKiBwX3NfaW5vZGUsIC8qIC0+aV9zaXplIGNvbnRhaW5zIG5ldworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSAqLworCQkJICAgc3RydWN0IHBhZ2UgKnBhZ2UsIC8qIHVwIHRvIGRhdGUgZm9yIGxhc3QgYmxvY2sgKi8KKwkJCSAgIGludCB1cGRhdGVfdGltZXN0YW1wcyAgLyogd2hlbiBpdCBpcyBjYWxsZWQgYnkKKwkJCQkJCSAgICAgZmlsZV9yZWxlYXNlIHRvIGNvbnZlcnQKKwkJCQkJCSAgICAgdGhlIHRhaWwgLSBubyB0aW1lc3RhbXBzCisJCQkJCQkgICAgIHNob3VsZCBiZSB1cGRhdGVkICovCisgICAgKSB7CisgICAgSU5JVElBTElaRV9QQVRIIChzX3NlYXJjaF9wYXRoKTsgICAgICAgLyogUGF0aCB0byB0aGUgY3VycmVudCBvYmplY3QgaXRlbS4gKi8KKyAgICBzdHJ1Y3QgaXRlbV9oZWFkICAgICogcF9sZV9paDsgICAgICAgICAvKiBQb2ludGVyIHRvIGFuIGl0ZW0gaGVhZGVyLiAqLworICAgIHN0cnVjdCBjcHVfa2V5ICAgICAgc19pdGVtX2tleTsgICAgIC8qIEtleSB0byBzZWFyY2ggZm9yIGEgcHJldmlvdXMgZmlsZSBpdGVtLiAqLworICAgIGxvZmZfdCAgICAgICAgIG5fZmlsZV9zaXplLCAgICAvKiBPbGQgZmlsZSBzaXplLiAqLworCW5fbmV3X2ZpbGVfc2l6ZTsvKiBOZXcgZmlsZSBzaXplLiAqLworICAgIGludCAgICAgICAgICAgICAgICAgICBuX2RlbGV0ZWQ7ICAgICAgLyogTnVtYmVyIG9mIGRlbGV0ZWQgb3IgdHJ1bmNhdGVkIGJ5dGVzLiAqLworICAgIGludCByZXR2YWw7CisgICAgaW50IGVyciA9IDA7CisKKyAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisgICAgaWYgKCAhIChTX0lTUkVHKHBfc19pbm9kZS0+aV9tb2RlKSB8fCBTX0lTRElSKHBfc19pbm9kZS0+aV9tb2RlKSB8fCBTX0lTTE5LKHBfc19pbm9kZS0+aV9tb2RlKSkgKQorCXJldHVybiAwOworCisgICAgaWYgKFNfSVNESVIocF9zX2lub2RlLT5pX21vZGUpKSB7CisJLy8gZGVsZXRpb24gb2YgZGlyZWN0b3J5IC0gbm8gbmVlZCB0byB1cGRhdGUgdGltZXN0YW1wcworCXRydW5jYXRlX2RpcmVjdG9yeSAodGgsIHBfc19pbm9kZSk7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogR2V0IG5ldyBmaWxlIHNpemUuICovCisgICAgbl9uZXdfZmlsZV9zaXplID0gcF9zX2lub2RlLT5pX3NpemU7CisKKyAgICAvLyBGSVhNRTogbm90ZSwgdGhhdCBrZXkgdHlwZSBpcyB1bmltcG9ydGFudCBoZXJlCisgICAgbWFrZV9jcHVfa2V5ICgmc19pdGVtX2tleSwgcF9zX2lub2RlLCBtYXhfcmVpc2VyZnNfb2Zmc2V0IChwX3NfaW5vZGUpLCBUWVBFX0RJUkVDVCwgMyk7CisKKyAgICByZXR2YWwgPSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleShwX3NfaW5vZGUtPmlfc2IsICZzX2l0ZW1fa2V5LCAmc19zZWFyY2hfcGF0aCk7CisgICAgaWYgKHJldHZhbCA9PSBJT19FUlJPUikgeworCXJlaXNlcmZzX3dhcm5pbmcgKHBfc19pbm9kZS0+aV9zYiwgInZzLTU2NTc6IHJlaXNlcmZzX2RvX3RydW5jYXRlOiAiCisJCQkgICJpL28gZmFpbHVyZSBvY2N1cnJlZCB0cnlpbmcgdG8gdHJ1bmNhdGUgJUsiLCAmc19pdGVtX2tleSk7CisgICAgICAgIGVyciA9IC1FSU87CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKyAgICBpZiAocmV0dmFsID09IFBPU0lUSU9OX0ZPVU5EIHx8IHJldHZhbCA9PSBGSUxFX05PVF9GT1VORCkgeworCXJlaXNlcmZzX3dhcm5pbmcgKHBfc19pbm9kZS0+aV9zYiwgIlBBUC01NjYwOiByZWlzZXJmc19kb190cnVuY2F0ZTogIgorCQkJICAid3JvbmcgcmVzdWx0ICVkIG9mIHNlYXJjaCBmb3IgJUsiLCByZXR2YWwsICZzX2l0ZW1fa2V5KTsKKworICAgICAgICBlcnIgPSAtRUlPOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBzX3NlYXJjaF9wYXRoLnBvc19pbl9pdGVtIC0tOworCisgICAgLyogR2V0IHJlYWwgZmlsZSBzaXplICh0b3RhbCBsZW5ndGggb2YgYWxsIGZpbGUgaXRlbXMpICovCisgICAgcF9sZV9paCA9IFBBVEhfUElURU1fSEVBRCgmc19zZWFyY2hfcGF0aCk7CisgICAgaWYgKCBpc19zdGF0ZGF0YV9sZV9paCAocF9sZV9paCkgKQorCW5fZmlsZV9zaXplID0gMDsKKyAgICBlbHNlIHsKKwlsb2ZmX3Qgb2Zmc2V0ID0gbGVfaWhfa19vZmZzZXQgKHBfbGVfaWgpOworCWludCBieXRlcyA9IG9wX2J5dGVzX251bWJlciAocF9sZV9paCxwX3NfaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKKworCS8qIHRoaXMgbWF5IG1pc21hdGNoIHdpdGggcmVhbCBmaWxlIHNpemU6IGlmIGxhc3QgZGlyZWN0IGl0ZW0KKyAgICAgICAgICAgaGFkIG5vIHBhZGRpbmcgemVyb3MgYW5kIGxhc3QgdW5mb3JtYXR0ZWQgbm9kZSBoYWQgbm8gZnJlZQorICAgICAgICAgICBzcGFjZSwgdGhpcyBmaWxlIHdvdWxkIGhhdmUgdGhpcyBmaWxlIHNpemUgKi8KKwluX2ZpbGVfc2l6ZSA9IG9mZnNldCArIGJ5dGVzIC0gMTsKKyAgICB9CisgICAgLyoKKyAgICAgKiBhcmUgd2UgZG9pbmcgYSBmdWxsIHRydW5jYXRlIG9yIGRlbGV0ZSwgaWYgc28KKyAgICAgKiBraWNrIGluIHRoZSByZWFkYSBjb2RlCisgICAgICovCisgICAgaWYgKG5fbmV3X2ZpbGVfc2l6ZSA9PSAwKQorICAgICAgICBzX3NlYXJjaF9wYXRoLnJlYWRhID0gUEFUSF9SRUFEQSB8IFBBVEhfUkVBREFfQkFDSzsKKworICAgIGlmICggbl9maWxlX3NpemUgPT0gMCB8fCBuX2ZpbGVfc2l6ZSA8IG5fbmV3X2ZpbGVfc2l6ZSApIHsKKwlnb3RvIHVwZGF0ZV9hbmRfb3V0IDsKKyAgICB9CisKKyAgICAvKiBVcGRhdGUga2V5IHRvIHNlYXJjaCBmb3IgdGhlIGxhc3QgZmlsZSBpdGVtLiAqLworICAgIHNldF9jcHVfa2V5X2tfb2Zmc2V0ICgmc19pdGVtX2tleSwgbl9maWxlX3NpemUpOworCisgICAgZG8gIHsKKwkvKiBDdXQgb3IgZGVsZXRlIGZpbGUgaXRlbS4gKi8KKwluX2RlbGV0ZWQgPSByZWlzZXJmc19jdXRfZnJvbV9pdGVtKHRoLCAmc19zZWFyY2hfcGF0aCwgJnNfaXRlbV9rZXksIHBfc19pbm9kZSwgIHBhZ2UsIG5fbmV3X2ZpbGVfc2l6ZSk7CisJaWYgKG5fZGVsZXRlZCA8IDApIHsKKwkgICAgcmVpc2VyZnNfd2FybmluZyAocF9zX2lub2RlLT5pX3NiLCAidnMtNTY2NTogcmVpc2VyZnNfZG9fdHJ1bmNhdGU6IHJlaXNlcmZzX2N1dF9mcm9tX2l0ZW0gZmFpbGVkIik7CisJICAgIHJlaXNlcmZzX2NoZWNrX3BhdGgoJnNfc2VhcmNoX3BhdGgpIDsKKwkgICAgcmV0dXJuIDA7CisJfQorCisJUkZBTFNFKCBuX2RlbGV0ZWQgPiBuX2ZpbGVfc2l6ZSwKKwkJIlBBUC01NjcwOiByZWlzZXJmc19jdXRfZnJvbV9pdGVtOiB0b28gbWFueSBieXRlcyBkZWxldGVkOiBkZWxldGVkICVkLCBmaWxlX3NpemUgJWx1LCBpdGVtX2tleSAlSyIsCisJCW5fZGVsZXRlZCwgbl9maWxlX3NpemUsICZzX2l0ZW1fa2V5KTsKKworCS8qIENoYW5nZSBrZXkgdG8gc2VhcmNoIHRoZSBsYXN0IGZpbGUgaXRlbS4gKi8KKwluX2ZpbGVfc2l6ZSAtPSBuX2RlbGV0ZWQ7CisKKwlzZXRfY3B1X2tleV9rX29mZnNldCAoJnNfaXRlbV9rZXksIG5fZmlsZV9zaXplKTsKKworCS8qIFdoaWxlIHRoZXJlIGFyZSBieXRlcyB0byB0cnVuY2F0ZSBhbmQgcHJldmlvdXMgZmlsZSBpdGVtIGlzIHByZXNlbnRlZCBpbiB0aGUgdHJlZS4gKi8KKworCS8qCisJKiogVGhpcyBsb29wIGNvdWxkIHRha2UgYSByZWFsbHkgbG9uZyB0aW1lLCBhbmQgY291bGQgbG9nIAorCSoqIG1hbnkgbW9yZSBibG9ja3MgdGhhbiBhIHRyYW5zYWN0aW9uIGNhbiBob2xkLiAgU28sIHdlIGRvIGEgcG9saXRlCisJKiogam91cm5hbCBlbmQgaGVyZSwgYW5kIGlmIHRoZSB0cmFuc2FjdGlvbiBuZWVkcyBlbmRpbmcsIHdlIG1ha2UKKwkqKiBzdXJlIHRoZSBmaWxlIGlzIGNvbnNpc3RlbnQgYmVmb3JlIGVuZGluZyB0aGUgY3VycmVudCB0cmFucworCSoqIGFuZCBzdGFydGluZyBhIG5ldyBvbmUKKwkqLworICAgICAgICBpZiAoam91cm5hbF90cmFuc2FjdGlvbl9zaG91bGRfZW5kKHRoLCB0aC0+dF9ibG9ja3NfYWxsb2NhdGVkKSkgeworCSAgaW50IG9yaWdfbGVuX2FsbG9jID0gdGgtPnRfYmxvY2tzX2FsbG9jYXRlZCA7CisJICBkZWNyZW1lbnRfY291bnRlcnNfaW5fcGF0aCgmc19zZWFyY2hfcGF0aCkgOworCisJICBpZiAodXBkYXRlX3RpbWVzdGFtcHMpIHsKKwkgICAgICBwX3NfaW5vZGUtPmlfbXRpbWUgPSBwX3NfaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCSAgfSAKKwkgIHJlaXNlcmZzX3VwZGF0ZV9zZCh0aCwgcF9zX2lub2RlKSA7CisKKwkgIGVyciA9IGpvdXJuYWxfZW5kKHRoLCBwX3NfaW5vZGUtPmlfc2IsIG9yaWdfbGVuX2FsbG9jKSA7CisJICBpZiAoZXJyKQorCSAgICBnb3RvIG91dDsKKwkgIGVyciA9IGpvdXJuYWxfYmVnaW4gKHRoLCBwX3NfaW5vZGUtPmlfc2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQgKiA2KTsKKwkgIGlmIChlcnIpCisJICAgIGdvdG8gb3V0OworCSAgcmVpc2VyZnNfdXBkYXRlX2lub2RlX3RyYW5zYWN0aW9uKHBfc19pbm9kZSkgOworCX0KKyAgICB9IHdoaWxlICggbl9maWxlX3NpemUgPiBST1VORF9VUCAobl9uZXdfZmlsZV9zaXplKSAmJgorCSAgICAgIHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5KHBfc19pbm9kZS0+aV9zYiwgJnNfaXRlbV9rZXksICZzX3NlYXJjaF9wYXRoKSA9PSBQT1NJVElPTl9GT1VORCApICA7CisKKyAgICBSRkFMU0UoIG5fZmlsZV9zaXplID4gUk9VTkRfVVAgKG5fbmV3X2ZpbGVfc2l6ZSksCisJICAgICJQQVAtNTY4MDogdHJ1bmNhdGUgZGlkIG5vdCBmaW5pc2g6IG5ld19maWxlX3NpemUgJUxkLCBjdXJyZW50ICVMZCwgb2lkICVkIiwKKwkgICAgbl9uZXdfZmlsZV9zaXplLCBuX2ZpbGVfc2l6ZSwgc19pdGVtX2tleS5vbl9kaXNrX2tleS5rX29iamVjdGlkKTsKKwordXBkYXRlX2FuZF9vdXQ6CisgICAgaWYgKHVwZGF0ZV90aW1lc3RhbXBzKSB7CisJLy8gdGhpcyBpcyB0cnVuY2F0ZSwgbm90IGZpbGUgY2xvc2luZworCSAgICBwX3NfaW5vZGUtPmlfbXRpbWUgPSBwX3NfaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworICAgIH0KKyAgICByZWlzZXJmc191cGRhdGVfc2QgKHRoLCBwX3NfaW5vZGUpOworCitvdXQ6CisgICAgcGF0aHJlbHNlKCZzX3NlYXJjaF9wYXRoKSA7CisgICAgcmV0dXJuIGVycjsKK30KKworCisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisvLyB0aGlzIG1ha2VzIHN1cmUsIHRoYXQgd2UgX19hcHBlbmRfXywgbm90IG92ZXJ3cml0ZSBvciBhZGQgaG9sZXMKK3N0YXRpYyB2b2lkIGNoZWNrX3Jlc2VhcmNoX2Zvcl9wYXN0ZSAoc3RydWN0IHBhdGggKiBwYXRoLCAKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgY3B1X2tleSAqIHBfc19rZXkpCit7CisgICAgc3RydWN0IGl0ZW1faGVhZCAqIGZvdW5kX2loID0gZ2V0X2loIChwYXRoKTsKKyAgICAKKyAgICBpZiAoaXNfZGlyZWN0X2xlX2loIChmb3VuZF9paCkpIHsKKwlpZiAobGVfaWhfa19vZmZzZXQgKGZvdW5kX2loKSArIG9wX2J5dGVzX251bWJlciAoZm91bmRfaWgsIGdldF9sYXN0X2JoIChwYXRoKS0+Yl9zaXplKSAhPQorCSAgICBjcHVfa2V5X2tfb2Zmc2V0IChwX3Nfa2V5KSB8fAorCSAgICBvcF9ieXRlc19udW1iZXIgKGZvdW5kX2loLCBnZXRfbGFzdF9iaCAocGF0aCktPmJfc2l6ZSkgIT0gcG9zX2luX2l0ZW0gKHBhdGgpKQorCSAgICByZWlzZXJmc19wYW5pYyAoTlVMTCwgIlBBUC01NzIwOiBjaGVja19yZXNlYXJjaF9mb3JfcGFzdGU6ICIKKwkJCSAgICAiZm91bmQgZGlyZWN0IGl0ZW0gJWggb3IgcG9zaXRpb24gKCVkKSBkb2VzIG5vdCBtYXRjaCB0byBrZXkgJUsiLAorCQkJICAgIGZvdW5kX2loLCBwb3NfaW5faXRlbSAocGF0aCksIHBfc19rZXkpOworICAgIH0KKyAgICBpZiAoaXNfaW5kaXJlY3RfbGVfaWggKGZvdW5kX2loKSkgeworCWlmIChsZV9paF9rX29mZnNldCAoZm91bmRfaWgpICsgb3BfYnl0ZXNfbnVtYmVyIChmb3VuZF9paCwgZ2V0X2xhc3RfYmggKHBhdGgpLT5iX3NpemUpICE9IGNwdV9rZXlfa19vZmZzZXQgKHBfc19rZXkpIHx8IAorCSAgICBJX1VORk1fTlVNIChmb3VuZF9paCkgIT0gcG9zX2luX2l0ZW0gKHBhdGgpIHx8CisJICAgIGdldF9paF9mcmVlX3NwYWNlIChmb3VuZF9paCkgIT0gMCkKKwkgICAgcmVpc2VyZnNfcGFuaWMgKE5VTEwsICJQQVAtNTczMDogY2hlY2tfcmVzZWFyY2hfZm9yX3Bhc3RlOiAiCisJCQkgICAgImZvdW5kIGluZGlyZWN0IGl0ZW0gKCVoKSBvciBwb3NpdGlvbiAoJWQpIGRvZXMgbm90IG1hdGNoIHRvIGtleSAoJUspIiwKKwkJCSAgICBmb3VuZF9paCwgcG9zX2luX2l0ZW0gKHBhdGgpLCBwX3Nfa2V5KTsKKyAgICB9Cit9CisjZW5kaWYgLyogY29uZmlnIHJlaXNlcmZzIGNoZWNrICovCisKKworLyogUGFzdGUgYnl0ZXMgdG8gdGhlIGV4aXN0aW5nIGl0ZW0uIFJldHVybnMgYnl0ZXMgbnVtYmVyIHBhc3RlZCBpbnRvIHRoZSBpdGVtLiAqLworaW50IHJlaXNlcmZzX3Bhc3RlX2ludG9faXRlbSAoc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSAqdGgsIAorCQkJICAgICAgc3RydWN0IHBhdGggICAgICAgICAqIHBfc19zZWFyY2hfcGF0aCwJLyogUGF0aCB0byB0aGUgcGFzdGVkIGl0ZW0uICAgICAgICAgICovCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgY3B1X2tleSAgICAgICogcF9zX2tleSwgICAgICAgIAkvKiBLZXkgdG8gc2VhcmNoIGZvciB0aGUgbmVlZGVkIGl0ZW0uKi8KKwkJCSAgICAgIHN0cnVjdCBpbm9kZQkgICogaW5vZGUsCQkvKiBJbm9kZSBpdGVtIGJlbG9uZ3MgdG8gKi8KKwkJCSAgICAgIGNvbnN0IGNoYXIgICAgICAgICAgKiBwX2NfYm9keSwgICAgICAgCS8qIFBvaW50ZXIgdG8gdGhlIGJ5dGVzIHRvIHBhc3RlLiAgICAqLworCQkJICAgICAgaW50ICAgICAgICAgICAgICAgICAgIG5fcGFzdGVkX3NpemUpICAJLyogU2l6ZSBvZiBwYXN0ZWQgYnl0ZXMuICAgICAgICAgICAgICovCit7CisgICAgc3RydWN0IHRyZWVfYmFsYW5jZSBzX3Bhc3RlX2JhbGFuY2U7CisgICAgaW50ICAgICAgICAgICAgICAgICByZXR2YWw7CisgICAgaW50CQkJZnNfZ2VuOworCisgICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCisgICAgZnNfZ2VuID0gZ2V0X2dlbmVyYXRpb24oaW5vZGUtPmlfc2IpIDsKKworI2lmZGVmIFJFSVNFUlFVT1RBX0RFQlVHCisgICAgcmVpc2VyZnNfZGVidWcgKGlub2RlLT5pX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAicmVpc2VycXVvdGEgcGFzdGVfaW50b19pdGVtKCk6IGFsbG9jYXRpbmcgJXUgaWQ9JXUgdHlwZT0lYyIsIG5fcGFzdGVkX3NpemUsIGlub2RlLT5pX3VpZCwga2V5MnR5cGUoJihwX3Nfa2V5LT5vbl9kaXNrX2tleSkpKTsKKyNlbmRpZgorCisgICAgaWYgKERRVU9UX0FMTE9DX1NQQUNFX05PRElSVFkoaW5vZGUsIG5fcGFzdGVkX3NpemUpKSB7CisJcGF0aHJlbHNlKHBfc19zZWFyY2hfcGF0aCk7CisJcmV0dXJuIC1FRFFVT1Q7CisgICAgfQorICAgIGluaXRfdGJfc3RydWN0KHRoLCAmc19wYXN0ZV9iYWxhbmNlLCB0aC0+dF9zdXBlciwgcF9zX3NlYXJjaF9wYXRoLCBuX3Bhc3RlZF9zaXplKTsKKyNpZmRlZiBESVNQTEFDRV9ORVdfUEFDS0lOR19MT0NBTElUSUVTCisgICAgc19wYXN0ZV9iYWxhbmNlLmtleSA9IHBfc19rZXktPm9uX2Rpc2tfa2V5OworI2VuZGlmCisKKyAgICAvKiBEUVVPVF8qIGNhbiBzY2hlZHVsZSwgbXVzdCBjaGVjayBiZWZvcmUgdGhlIGZpeF9ub2RlcyAqLworICAgIGlmIChmc19jaGFuZ2VkKGZzX2dlbiwgaW5vZGUtPmlfc2IpKSB7CisJZ290byBzZWFyY2hfYWdhaW47CisgICAgfQorCisgICAgd2hpbGUgKChyZXR2YWwgPSBmaXhfbm9kZXMoTV9QQVNURSwgJnNfcGFzdGVfYmFsYW5jZSwgTlVMTCwgcF9jX2JvZHkpKSA9PQorUkVQRUFUX1NFQVJDSCApIHsKK3NlYXJjaF9hZ2FpbjoKKwkvKiBmaWxlIHN5c3RlbSBjaGFuZ2VkIHdoaWxlIHdlIHdlcmUgaW4gdGhlIGZpeF9ub2RlcyAqLworCVBST0NfSU5GT19JTkMoIHRoIC0+IHRfc3VwZXIsIHBhc3RlX2ludG9faXRlbV9yZXN0YXJ0ZWQgKTsKKwlyZXR2YWwgPSBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleSAodGgtPnRfc3VwZXIsIHBfc19rZXksIHBfc19zZWFyY2hfcGF0aCk7CisJaWYgKHJldHZhbCA9PSBJT19FUlJPUikgeworCSAgICByZXR2YWwgPSAtRUlPIDsKKwkgICAgZ290byBlcnJvcl9vdXQgOworCX0KKwlpZiAocmV0dmFsID09IFBPU0lUSU9OX0ZPVU5EKSB7CisJICAgIHJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAiUEFQLTU3MTA6IHJlaXNlcmZzX3Bhc3RlX2ludG9faXRlbTogZW50cnkgb3IgcGFzdGVkIGJ5dGUgKCVLKSBleGlzdHMiLCBwX3Nfa2V5KTsKKwkgICAgcmV0dmFsID0gLUVFWElTVCA7CisJICAgIGdvdG8gZXJyb3Jfb3V0IDsKKwl9CisJCisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0NIRUNLCisJY2hlY2tfcmVzZWFyY2hfZm9yX3Bhc3RlIChwX3Nfc2VhcmNoX3BhdGgsIHBfc19rZXkpOworI2VuZGlmCisgICAgfQorCisgICAgLyogUGVyZm9ybSBiYWxhbmNpbmcgYWZ0ZXIgYWxsIHJlc291cmNlcyBhcmUgY29sbGVjdGVkIGJ5IGZpeF9ub2RlcywgYW5kCisgICAgICAgYWNjZXNzaW5nIHRoZW0gd2lsbCBub3QgcmlzayB0cmlnZ2VyaW5nIHNjaGVkdWxlLiAqLworICAgIGlmICggcmV0dmFsID09IENBUlJZX09OICkgeworCWRvX2JhbGFuY2UoJnNfcGFzdGVfYmFsYW5jZSwgTlVMTC8qaWgqLywgcF9jX2JvZHksIE1fUEFTVEUpOworCXJldHVybiAwOworICAgIH0KKyAgICByZXR2YWwgPSAocmV0dmFsID09IE5PX0RJU0tfU1BBQ0UpID8gLUVOT1NQQyA6IC1FSU87CitlcnJvcl9vdXQ6CisgICAgLyogdGhpcyBhbHNvIHJlbGVhc2VzIHRoZSBwYXRoICovCisgICAgdW5maXhfbm9kZXMoJnNfcGFzdGVfYmFsYW5jZSk7CisjaWZkZWYgUkVJU0VSUVVPVEFfREVCVUcKKyAgICByZWlzZXJmc19kZWJ1ZyAoaW5vZGUtPmlfc2IsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJyZWlzZXJxdW90YSBwYXN0ZV9pbnRvX2l0ZW0oKTogZnJlZWluZyAldSBpZD0ldSB0eXBlPSVjIiwgbl9wYXN0ZWRfc2l6ZSwgaW5vZGUtPmlfdWlkLCBrZXkydHlwZSgmKHBfc19rZXktPm9uX2Rpc2tfa2V5KSkpOworI2VuZGlmCisgICAgRFFVT1RfRlJFRV9TUEFDRV9OT0RJUlRZKGlub2RlLCBuX3Bhc3RlZF9zaXplKTsKKyAgICByZXR1cm4gcmV0dmFsIDsKK30KKworCisvKiBJbnNlcnQgbmV3IGl0ZW0gaW50byB0aGUgYnVmZmVyIGF0IHRoZSBwYXRoLiAqLworaW50IHJlaXNlcmZzX2luc2VydF9pdGVtKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCAKKwkJCSBzdHJ1Y3QgcGF0aCAgICAgICAgICogCXBfc19wYXRoLCAgICAgICAgIC8qIFBhdGggdG8gdGhlIGluc2VydGVkZWQgaXRlbS4gICAgICAgICAqLworCQkJIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICAgICAgKiBrZXksCisJCQkgc3RydWN0IGl0ZW1faGVhZCAgICAqIAlwX3NfaWgsICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpdGVtIGhlYWRlciB0byBpbnNlcnQuKi8KKwkJCSBzdHJ1Y3QgaW5vZGUgICAgICAgICogaW5vZGUsCisJCQkgY29uc3QgY2hhciAgICAgICAgICAqIAlwX2NfYm9keSkgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBieXRlcyB0byBpbnNlcnQuICAgICAgKi8KK3sKKyAgICBzdHJ1Y3QgdHJlZV9iYWxhbmNlIHNfaW5zX2JhbGFuY2U7CisgICAgaW50ICAgICAgICAgICAgICAgICByZXR2YWw7CisgICAgaW50IGZzX2dlbiA9IDAgOworICAgIGludCBxdW90YV9ieXRlcyA9IDAgOworCisgICAgQlVHX09OICghdGgtPnRfdHJhbnNfaWQpOworCisgICAgaWYgKGlub2RlKSB7ICAgICAgLyogRG8gd2UgY291bnQgcXVvdGFzIGZvciBpdGVtPyAqLworCWZzX2dlbiA9IGdldF9nZW5lcmF0aW9uKGlub2RlLT5pX3NiKTsKKwlxdW90YV9ieXRlcyA9IGloX2l0ZW1fbGVuKHBfc19paCk7CisKKwkvKiBoYWNrIHNvIHRoZSBxdW90YSBjb2RlIGRvZXNuJ3QgaGF2ZSB0byBndWVzcyBpZiB0aGUgZmlsZSBoYXMKKwkgKiogYSB0YWlsLCBsaW5rcyBhcmUgYWx3YXlzIHRhaWxzLCBzbyB0aGVyZSdzIG5vIGd1ZXNzaW5nIG5lZWRlZAorCSAqLworCWlmICghU19JU0xOSyAoaW5vZGUtPmlfbW9kZSkgJiYgaXNfZGlyZWN0X2xlX2loKHBfc19paCkpIHsKKwkgICAgcXVvdGFfYnl0ZXMgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgKyBVTkZNX1BfU0laRSA7CisJfQorI2lmZGVmIFJFSVNFUlFVT1RBX0RFQlVHCisJcmVpc2VyZnNfZGVidWcgKGlub2RlLT5pX3NiLCBSRUlTRVJGU19ERUJVR19DT0RFLCAicmVpc2VycXVvdGEgaW5zZXJ0X2l0ZW0oKTogYWxsb2NhdGluZyAldSBpZD0ldSB0eXBlPSVjIiwgcXVvdGFfYnl0ZXMsIGlub2RlLT5pX3VpZCwgaGVhZDJ0eXBlKHBfc19paCkpOworI2VuZGlmCisJLyogV2UgY2FuJ3QgZGlydHkgaW5vZGUgaGVyZS4gSXQgd291bGQgYmUgaW1tZWRpYXRlbHkgd3JpdHRlbiBidXQKKwkgKiBhcHByb3ByaWF0ZSBzdGF0IGl0ZW0gaXNuJ3QgaW5zZXJ0ZWQgeWV0Li4uICovCisJaWYgKERRVU9UX0FMTE9DX1NQQUNFX05PRElSVFkoaW5vZGUsIHF1b3RhX2J5dGVzKSkgeworCSAgICBwYXRocmVsc2UocF9zX3BhdGgpOworCSAgICByZXR1cm4gLUVEUVVPVDsKKwl9CisgICAgfQorICAgIGluaXRfdGJfc3RydWN0KHRoLCAmc19pbnNfYmFsYW5jZSwgdGgtPnRfc3VwZXIsIHBfc19wYXRoLCBJSF9TSVpFICsgaWhfaXRlbV9sZW4ocF9zX2loKSk7CisjaWZkZWYgRElTUExBQ0VfTkVXX1BBQ0tJTkdfTE9DQUxJVElFUworICAgIHNfaW5zX2JhbGFuY2Uua2V5ID0ga2V5LT5vbl9kaXNrX2tleTsKKyNlbmRpZgorICAgIC8qIERRVU9UXyogY2FuIHNjaGVkdWxlLCBtdXN0IGNoZWNrIHRvIGJlIHN1cmUgY2FsbGluZyBmaXhfbm9kZXMgaXMgc2FmZSAqLworICAgIGlmIChpbm9kZSAmJiBmc19jaGFuZ2VkKGZzX2dlbiwgaW5vZGUtPmlfc2IpKSB7CisJZ290byBzZWFyY2hfYWdhaW47CisgICAgfQorCisgICAgd2hpbGUgKCAocmV0dmFsID0gZml4X25vZGVzKE1fSU5TRVJULCAmc19pbnNfYmFsYW5jZSwgcF9zX2loLCBwX2NfYm9keSkpID09IFJFUEVBVF9TRUFSQ0gpIHsKK3NlYXJjaF9hZ2FpbjoKKwkvKiBmaWxlIHN5c3RlbSBjaGFuZ2VkIHdoaWxlIHdlIHdlcmUgaW4gdGhlIGZpeF9ub2RlcyAqLworCVBST0NfSU5GT19JTkMoIHRoIC0+IHRfc3VwZXIsIGluc2VydF9pdGVtX3Jlc3RhcnRlZCApOworCXJldHZhbCA9IHNlYXJjaF9pdGVtICh0aC0+dF9zdXBlciwga2V5LCBwX3NfcGF0aCk7CisJaWYgKHJldHZhbCA9PSBJT19FUlJPUikgeworCSAgICByZXR2YWwgPSAtRUlPOworCSAgICBnb3RvIGVycm9yX291dCA7CisJfQorCWlmIChyZXR2YWwgPT0gSVRFTV9GT1VORCkgeworCSAgICByZWlzZXJmc193YXJuaW5nICh0aC0+dF9zdXBlciwgIlBBUC01NzYwOiByZWlzZXJmc19pbnNlcnRfaXRlbTogIgorCQkJICAgICAgImtleSAlSyBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgdHJlZSIsIGtleSk7CisJICAgIHJldHZhbCA9IC1FRVhJU1QgOworCSAgICBnb3RvIGVycm9yX291dDsgCisJfQorICAgIH0KKworICAgIC8qIG1ha2UgYmFsYW5jaW5nIGFmdGVyIGFsbCByZXNvdXJjZXMgd2lsbCBiZSBjb2xsZWN0ZWQgYXQgYSB0aW1lICovIAorICAgIGlmICggcmV0dmFsID09IENBUlJZX09OICkgeworCWRvX2JhbGFuY2UgKCZzX2luc19iYWxhbmNlLCBwX3NfaWgsIHBfY19ib2R5LCBNX0lOU0VSVCk7CisJcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dmFsID0gKHJldHZhbCA9PSBOT19ESVNLX1NQQUNFKSA/IC1FTk9TUEMgOiAtRUlPOworZXJyb3Jfb3V0OgorICAgIC8qIGFsc28gcmVsZWFzZXMgdGhlIHBhdGggKi8KKyAgICB1bmZpeF9ub2Rlcygmc19pbnNfYmFsYW5jZSk7CisjaWZkZWYgUkVJU0VSUVVPVEFfREVCVUcKKyAgICByZWlzZXJmc19kZWJ1ZyAodGgtPnRfc3VwZXIsIFJFSVNFUkZTX0RFQlVHX0NPREUsICJyZWlzZXJxdW90YSBpbnNlcnRfaXRlbSgpOiBmcmVlaW5nICV1IGlkPSV1IHR5cGU9JWMiLCBxdW90YV9ieXRlcywgaW5vZGUtPmlfdWlkLCBoZWFkMnR5cGUocF9zX2loKSk7CisjZW5kaWYKKyAgICBpZiAoaW5vZGUpCisJRFFVT1RfRlJFRV9TUEFDRV9OT0RJUlRZKGlub2RlLCBxdW90YV9ieXRlcykgOworICAgIHJldHVybiByZXR2YWw7IAorfQorCisKKworCmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9zdXBlci5jIGIvZnMvcmVpc2VyZnMvc3VwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2RmMjQzCi0tLSAvZGV2L251bGwKKysrIGIvZnMvcmVpc2VyZnMvc3VwZXIuYwpAQCAtMCwwICsxLDIxNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwMCBieSBIYW5zIFJlaXNlciwgbGljZW5zaW5nIGdvdmVybmVkIGJ5IHJlaXNlcmZzL1JFQURNRQorICoKKyAqIFRyaXZpYWwgY2hhbmdlcyBieSBBbGFuIENveCB0byBhZGQgdGhlIExGUyBmaXhlcworICoKKyAqIFRyaXZpYWwgQ2hhbmdlczoKKyAqIFJpZ2h0cyBncmFudGVkIHRvIEhhbnMgUmVpc2VyIHRvIHJlZGlzdHJpYnV0ZSB1bmRlciBvdGhlciB0ZXJtcyBwcm92aWRpbmcKKyAqIGhlIGFjY2VwdHMgYWxsIGxpYWJpbGl0eSBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHBhdGVudCwgZml0bmVzcworICogZm9yIHB1cnBvc2UsIGFuZCBkaXJlY3Qgb3IgaW5kaXJlY3QgY2xhaW1zIGFyaXNpbmcgZnJvbSBmYWlsdXJlIHRvIHBlcmZvcm0uCisgKgorICogTk8gV0FSUkFOVFkKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfYWNsLmg+CisjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfeGF0dHIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVzcGFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorCitzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSByZWlzZXJmc19mc190eXBlOworCitzdGF0aWMgY29uc3QgY2hhciByZWlzZXJmc18zXzVfbWFnaWNfc3RyaW5nW10gPSBSRUlTRVJGU19TVVBFUl9NQUdJQ19TVFJJTkc7CitzdGF0aWMgY29uc3QgY2hhciByZWlzZXJmc18zXzZfbWFnaWNfc3RyaW5nW10gPSBSRUlTRVIyRlNfU1VQRVJfTUFHSUNfU1RSSU5HOworc3RhdGljIGNvbnN0IGNoYXIgcmVpc2VyZnNfanJfbWFnaWNfc3RyaW5nW10gPSBSRUlTRVIyRlNfSlJfU1VQRVJfTUFHSUNfU1RSSU5HOworCitpbnQgaXNfcmVpc2VyZnNfM181IChzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiBycykKK3sKKyAgcmV0dXJuICFzdHJuY21wIChycy0+c192MS5zX21hZ2ljLCByZWlzZXJmc18zXzVfbWFnaWNfc3RyaW5nLAorCQkgICBzdHJsZW4gKHJlaXNlcmZzXzNfNV9tYWdpY19zdHJpbmcpKTsKK30KKworCitpbnQgaXNfcmVpc2VyZnNfM182IChzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiBycykKK3sKKyAgcmV0dXJuICFzdHJuY21wIChycy0+c192MS5zX21hZ2ljLCByZWlzZXJmc18zXzZfbWFnaWNfc3RyaW5nLAorIAkJICAgc3RybGVuIChyZWlzZXJmc18zXzZfbWFnaWNfc3RyaW5nKSk7Cit9CisKKworaW50IGlzX3JlaXNlcmZzX2pyIChzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiBycykKK3sKKyAgcmV0dXJuICFzdHJuY21wIChycy0+c192MS5zX21hZ2ljLCByZWlzZXJmc19qcl9tYWdpY19zdHJpbmcsCisgCQkgICBzdHJsZW4gKHJlaXNlcmZzX2pyX21hZ2ljX3N0cmluZykpOworfQorCisKK3N0YXRpYyBpbnQgaXNfYW55X3JlaXNlcmZzX21hZ2ljX3N0cmluZyAoc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICogcnMpCit7CisgIHJldHVybiAoaXNfcmVpc2VyZnNfM181IChycykgfHwgaXNfcmVpc2VyZnNfM182IChycykgfHwKKwkgIGlzX3JlaXNlcmZzX2pyIChycykpOworfQorCitzdGF0aWMgaW50IHJlaXNlcmZzX3JlbW91bnQgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIGludCAqIGZsYWdzLCBjaGFyICogZGF0YSk7CitzdGF0aWMgaW50IHJlaXNlcmZzX3N0YXRmcyAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgc3RydWN0IGtzdGF0ZnMgKiBidWYpOworCitzdGF0aWMgaW50IHJlaXNlcmZzX3N5bmNfZnMgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIGludCB3YWl0KQoreworICAgIGlmICghKHMtPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisgICAgICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisJcmVpc2VyZnNfd3JpdGVfbG9jayhzKTsKKwlpZiAoIWpvdXJuYWxfYmVnaW4oJnRoLCBzLCAxKSkKKyAgICAgICAgICAgIGlmICgham91cm5hbF9lbmRfc3luYygmdGgsIHMsIDEpKQorICAgICAgICAgICAgICAgIHJlaXNlcmZzX2ZsdXNoX29sZF9jb21taXRzKHMpOworCXMtPnNfZGlydCA9IDA7IC8qIEV2ZW4gaWYgaXQncyBub3QgdHJ1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICogV2UnbGwgbG9vcCBmb3JldmVyIGluIHN5bmNfc3VwZXJzIG90aGVyd2lzZSAqLworCXJlaXNlcmZzX3dyaXRlX3VubG9jayhzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5zX2RpcnQgPSAwOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmVpc2VyZnNfd3JpdGVfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQoreworICAgIHJlaXNlcmZzX3N5bmNfZnMocywgMSk7Cit9CisKK3N0YXRpYyB2b2lkIHJlaXNlcmZzX3dyaXRlX3N1cGVyX2xvY2tmcyAoc3RydWN0IHN1cGVyX2Jsb2NrICogcykKK3sKKyAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7CisgIHJlaXNlcmZzX3dyaXRlX2xvY2socyk7CisgIGlmICghKHMtPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisgICAgaW50IGVyciA9IGpvdXJuYWxfYmVnaW4oJnRoLCBzLCAxKSA7CisgICAgaWYgKGVycikgeworICAgICAgICByZWlzZXJmc19ibG9ja193cml0ZXMoJnRoKSA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSwgMSk7CisgICAgICAgIGpvdXJuYWxfbWFya19kaXJ0eSgmdGgsIHMsIFNCX0JVRkZFUl9XSVRIX1NCIChzKSk7CisgICAgICAgIHJlaXNlcmZzX2Jsb2NrX3dyaXRlcygmdGgpIDsKKyAgICAgICAgam91cm5hbF9lbmRfc3luYygmdGgsIHMsIDEpIDsKKyAgICB9CisgIH0KKyAgcy0+c19kaXJ0ID0gMDsKKyAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHMpOworfQorCitzdGF0aWMgdm9pZCByZWlzZXJmc191bmxvY2tmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpIHsKKyAgcmVpc2VyZnNfYWxsb3dfd3JpdGVzKHMpIDsKK30KKworZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWlzZXJmc19rZXkgIE1BWF9LRVk7CisKKworLyogdGhpcyBpcyB1c2VkIHRvIGRlbGV0ZSAic2F2ZSBsaW5rIiB3aGVuIHRoZXJlIGFyZSBubyBpdGVtcyBvZiBhCisgICBmaWxlIGl0IHBvaW50cyB0by4gSXQgY2FuIGVpdGhlciBoYXBwZW4gaWYgdW5saW5rIGlzIGNvbXBsZXRlZCBidXQKKyAgICJzYXZlIHVubGluayIgcmVtb3ZhbCwgb3IgaWYgZmlsZSBoYXMgYm90aCB1bmxpbmsgYW5kIHRydW5jYXRlCisgICBwZW5kaW5nIGFuZCBhcyB1bmxpbmsgY29tcGxldGVzIGZpcnN0IChiZWNhdXNlIGtleSBvZiAic2F2ZSBsaW5rIgorICAgcHJvdGVjdGluZyB1bmxpbmsgaXMgYmlnZ2VyIHRoYXQgYSBrZXkgbGYgInNhdmUgbGluayIgd2hpY2gKKyAgIHByb3RlY3RzIHRydW5jYXRlKSwgc28gdGhlcmUgbGVmdCBubyBpdGVtcyB0byBtYWtlIHRydW5jYXRlCisgICBjb21wbGV0aW9uIG9uICovCitzdGF0aWMgaW50IHJlbW92ZV9zYXZlX2xpbmtfb25seSAoc3RydWN0IHN1cGVyX2Jsb2NrICogcywgc3RydWN0IHJlaXNlcmZzX2tleSAqIGtleSwgaW50IG9pZF9mcmVlKQoreworICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisgICAgaW50IGVycjsKKworICAgICAvKiB3ZSBhcmUgZ29pbmcgdG8gZG8gb25lIGJhbGFuY2luZyAqLworICAgICBlcnIgPSBqb3VybmFsX2JlZ2luICgmdGgsIHMsIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UKTsKKyAgICAgaWYgKGVycikKKyAgICAgICAgcmV0dXJuIGVycjsKKyAKKyAgICAgcmVpc2VyZnNfZGVsZXRlX3NvbGlkX2l0ZW0gKCZ0aCwgTlVMTCwga2V5KTsKKyAgICAgaWYgKG9pZF9mcmVlKQorICAgICAgICAvKiByZW1vdmFscyBhcmUgcHJvdGVjdGVkIGJ5IGRpcmVjdCBpdGVtcyAqLworICAgICAgICByZWlzZXJmc19yZWxlYXNlX29iamVjdGlkICgmdGgsIGxlMzJfdG9fY3B1IChrZXktPmtfb2JqZWN0aWQpKTsKKworICAgICByZXR1cm4gam91cm5hbF9lbmQgKCZ0aCwgcywgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQpOworfQorIAorI2lmZGVmIENPTkZJR19RVU9UQQorc3RhdGljIGludCByZWlzZXJmc19xdW90YV9vbl9tb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50KTsKKyNlbmRpZgorIAorLyogbG9vayBmb3IgdW5jb21wbGV0ZWQgdW5saW5rcyBhbmQgdHJ1bmNhdGVzIGFuZCBjb21wbGV0ZSB0aGVtICovCitzdGF0aWMgaW50IGZpbmlzaF91bmZpbmlzaGVkIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzKQoreworICAgIElOSVRJQUxJWkVfUEFUSCAocGF0aCk7CisgICAgc3RydWN0IGNwdV9rZXkgbWF4X2NwdV9rZXksIG9ial9rZXk7CisgICAgc3RydWN0IHJlaXNlcmZzX2tleSBzYXZlX2xpbmtfa2V5OworICAgIGludCByZXR2YWwgPSAwOworICAgIHN0cnVjdCBpdGVtX2hlYWQgKiBpaDsKKyAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKyAgICBpbnQgaXRlbV9wb3M7CisgICAgY2hhciAqIGl0ZW07CisgICAgaW50IGRvbmU7CisgICAgc3RydWN0IGlub2RlICogaW5vZGU7CisgICAgaW50IHRydW5jYXRlOworI2lmZGVmIENPTkZJR19RVU9UQQorICAgIGludCBpOworICAgIGludCBtc19hY3RpdmVfc2V0OworI2VuZGlmCisgCisgCisgICAgLyogY29tcG9zZSBrZXkgdG8gbG9vayBmb3IgInNhdmUiIGxpbmtzICovCisgICAgbWF4X2NwdV9rZXkudmVyc2lvbiA9IEtFWV9GT1JNQVRfM181OworICAgIG1heF9jcHVfa2V5Lm9uX2Rpc2tfa2V5ID0gTUFYX0tFWTsKKyAgICBtYXhfY3B1X2tleS5rZXlfbGVuZ3RoID0gMzsKKworI2lmZGVmIENPTkZJR19RVU9UQQorICAgIC8qIE5lZWRlZCBmb3IgaXB1dCgpIHRvIHdvcmsgY29ycmVjdGx5IGFuZCBub3QgdHJhc2ggZGF0YSAqLworICAgIGlmIChzLT5zX2ZsYWdzICYgTVNfQUNUSVZFKSB7CisJICAgIG1zX2FjdGl2ZV9zZXQgPSAwOworICAgIH0gZWxzZSB7CisJICAgIG1zX2FjdGl2ZV9zZXQgPSAxOworCSAgICBzLT5zX2ZsYWdzIHw9IE1TX0FDVElWRTsKKyAgICB9CisgICAgLyogVHVybiBvbiBxdW90YXMgc28gdGhhdCB0aGV5IGFyZSB1cGRhdGVkIGNvcnJlY3RseSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhRVU9UQVM7IGkrKykgeworCWlmIChSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1tpXSkgeworCSAgICBpbnQgcmV0ID0gcmVpc2VyZnNfcXVvdGFfb25fbW91bnQocywgaSk7CisJICAgIGlmIChyZXQgPCAwKQorCQlyZWlzZXJmc193YXJuaW5nKHMsICJyZWlzZXJmczogY2Fubm90IHR1cm4gb24gam91cm5hbGxlZCBxdW90YTogZXJyb3IgJWQiLCByZXQpOworCX0KKyAgICB9CisjZW5kaWYKKyAKKyAgICBkb25lID0gMDsKKyAgICBSRUlTRVJGU19TQihzKS0+c19pc191bmxpbmtlZF9vayA9IDE7CisgICAgd2hpbGUgKCFyZXR2YWwpIHsKKyAgICAgICAgcmV0dmFsID0gc2VhcmNoX2l0ZW0gKHMsICZtYXhfY3B1X2tleSwgJnBhdGgpOworICAgICAgICBpZiAocmV0dmFsICE9IElURU1fTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICByZWlzZXJmc193YXJuaW5nIChzLCAidnMtMjE0MDogZmluaXNoX3VuZmluaXNoZWQ6IHNlYXJjaF9ieV9rZXkgcmV0dXJuZWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBiaCA9IGdldF9sYXN0X2JoICgmcGF0aCk7CisgICAgICAgIGl0ZW1fcG9zID0gZ2V0X2l0ZW1fcG9zICgmcGF0aCk7CisgICAgICAgIGlmIChpdGVtX3BvcyAhPSBCX05SX0lURU1TIChiaCkpIHsKKyAgICAgICAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJ2cy0yMDYwOiBmaW5pc2hfdW5maW5pc2hlZDogd3JvbmcgcG9zaXRpb24gZm91bmQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGl0ZW1fcG9zIC0tOworICAgICAgICBpaCA9IEJfTl9QSVRFTV9IRUFEIChiaCwgaXRlbV9wb3MpOworIAorICAgICAgICBpZiAobGUzMl90b19jcHUgKGloLT5paF9rZXkua19kaXJfaWQpICE9IE1BWF9LRVlfT0JKRUNUSUQpCisgICAgICAgICAgICAvKiB0aGVyZSBhcmUgbm8gInNhdmUiIGxpbmtzIGFueW1vcmUgKi8KKyAgICAgICAgICAgIGJyZWFrOworIAorICAgICAgICBzYXZlX2xpbmtfa2V5ID0gaWgtPmloX2tleTsKKyAgICAgICAgaWYgKGlzX2luZGlyZWN0X2xlX2loIChpaCkpCisgICAgICAgICAgICB0cnVuY2F0ZSA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRydW5jYXRlID0gMDsKKyAKKyAgICAgICAgLyogcmVpc2VyZnNfaWdldCBuZWVkcyBrX2RpcmlkIGFuZCBrX29iamVjdGlkIG9ubHkgKi8KKyAgICAgICAgaXRlbSA9IEJfSV9QSVRFTSAoYmgsIGloKTsKKyAgICAgICAgb2JqX2tleS5vbl9kaXNrX2tleS5rX2Rpcl9pZCA9IGxlMzJfdG9fY3B1ICgqKF9fdTMyICopaXRlbSk7CisgICAgICAgIG9ial9rZXkub25fZGlza19rZXkua19vYmplY3RpZCA9IGxlMzJfdG9fY3B1IChpaC0+aWhfa2V5Lmtfb2JqZWN0aWQpOworCW9ial9rZXkub25fZGlza19rZXkudS5rX29mZnNldF92MS5rX29mZnNldCA9IDA7CisJb2JqX2tleS5vbl9kaXNrX2tleS51Lmtfb2Zmc2V0X3YxLmtfdW5pcXVlbmVzcyA9IDA7CisJCisgICAgICAgIHBhdGhyZWxzZSAoJnBhdGgpOworIAorICAgICAgICBpbm9kZSA9IHJlaXNlcmZzX2lnZXQgKHMsICZvYmpfa2V5KTsKKyAgICAgICAgaWYgKCFpbm9kZSkgeworICAgICAgICAgICAgLyogdGhlIHVubGluayBhbG1vc3QgY29tcGxldGVkLCBpdCBqdXN0IGRpZCBub3QgbWFuYWdlIHRvIHJlbW92ZQorCSAgICAgICAic2F2ZSIgbGluayBhbmQgcmVsZWFzZSBvYmplY3RpZCAqLworICAgICAgICAgICAgcmVpc2VyZnNfd2FybmluZyAocywgInZzLTIxODA6IGZpbmlzaF91bmZpbmlzaGVkOiBpZ2V0IGZhaWxlZCBmb3IgJUsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9ial9rZXkpOworICAgICAgICAgICAgcmV0dmFsID0gcmVtb3ZlX3NhdmVfbGlua19vbmx5IChzLCAmc2F2ZV9saW5rX2tleSwgMSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisJaWYgKCF0cnVuY2F0ZSAmJiBpbm9kZS0+aV9ubGluaykgeworCSAgICAvKiBmaWxlIGlzIG5vdCB1bmxpbmtlZCAqLworICAgICAgICAgICAgcmVpc2VyZnNfd2FybmluZyAocywgInZzLTIxODU6IGZpbmlzaF91bmZpbmlzaGVkOiBmaWxlICVLIGlzIG5vdCB1bmxpbmtlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2JqX2tleSk7CisgICAgICAgICAgICByZXR2YWwgPSByZW1vdmVfc2F2ZV9saW5rX29ubHkgKHMsICZzYXZlX2xpbmtfa2V5LCAwKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworCX0KKwlEUVVPVF9JTklUKGlub2RlKTsKKworCWlmICh0cnVuY2F0ZSAmJiBTX0lTRElSIChpbm9kZS0+aV9tb2RlKSApIHsKKwkgICAgLyogV2UgZ290IGEgdHJ1bmNhdGUgcmVxdWVzdCBmb3IgYSBkaXIgd2hpY2ggaXMgaW1wb3NzaWJsZS4KKwkgICAgICAgVGhlIG9ubHkgaW1hZ2luYWJsZSB3YXkgaXMgdG8gZXhlY3V0ZSB1bmZpbmlzaGVkIHRydW5jYXRlIHJlcXVlc3QKKwkgICAgICAgdGhlbiBib290IGludG8gb2xkIGtlcm5lbCwgcmVtb3ZlIHRoZSBmaWxlIGFuZCBjcmVhdGUgZGlyIHdpdGgKKwkgICAgICAgdGhlIHNhbWUga2V5LiAqLworCSAgICByZWlzZXJmc193YXJuaW5nKHMsICJncmVlbi0yMTAxOiBpbXBvc3NpYmxlIHRydW5jYXRlIG9uIGEgZGlyZWN0b3J5ICVrLiBQbGVhc2UgcmVwb3J0IiwgSU5PREVfUEtFWSAoaW5vZGUpKTsKKwkgICAgcmV0dmFsID0gcmVtb3ZlX3NhdmVfbGlua19vbmx5IChzLCAmc2F2ZV9saW5rX2tleSwgMCk7CisJICAgIHRydW5jYXRlID0gMDsKKwkgICAgaXB1dCAoaW5vZGUpOyAKKwkgICAgY29udGludWU7CisJfQorIAorICAgICAgICBpZiAodHJ1bmNhdGUpIHsKKyAgICAgICAgICAgIFJFSVNFUkZTX0koaW5vZGUpIC0+IGlfZmxhZ3MgfD0gaV9saW5rX3NhdmVkX3RydW5jYXRlX21hc2s7CisgICAgICAgICAgICAvKiBub3QgY29tcGxldGVkIHRydW5jYXRlIGZvdW5kLiBOZXcgc2l6ZSB3YXMgY29tbWl0dGVkIHRvZ2V0aGVyCisJICAgICAgIHdpdGggInNhdmUiIGxpbmsgKi8KKyAgICAgICAgICAgIHJlaXNlcmZzX2luZm8gKHMsICJUcnVuY2F0aW5nICVrIHRvICVMZCAuLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTk9ERV9QS0VZIChpbm9kZSksIGlub2RlLT5pX3NpemUpOworICAgICAgICAgICAgcmVpc2VyZnNfdHJ1bmNhdGVfZmlsZSAoaW5vZGUsIDAvKmRvbid0IHVwZGF0ZSBtb2RpZmljYXRpb24gdGltZSovKTsKKyAgICAgICAgICAgIHJldHZhbCA9IHJlbW92ZV9zYXZlX2xpbmsgKGlub2RlLCB0cnVuY2F0ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBSRUlTRVJGU19JKGlub2RlKSAtPiBpX2ZsYWdzIHw9IGlfbGlua19zYXZlZF91bmxpbmtfbWFzazsKKyAgICAgICAgICAgIC8qIG5vdCBjb21wbGV0ZWQgdW5saW5rIChybWRpcikgZm91bmQgKi8KKyAgICAgICAgICAgIHJlaXNlcmZzX2luZm8gKHMsICJSZW1vdmluZyAlay4uIiwgSU5PREVfUEtFWSAoaW5vZGUpKTsKKyAgICAgICAgICAgIC8qIHJlbW92YWwgZ2V0cyBjb21wbGV0ZWQgaW4gaXB1dCAqLworICAgICAgICAgICAgcmV0dmFsID0gMDsKKyAgICAgICAgfQorIAorICAgICAgICBpcHV0IChpbm9kZSk7CisgICAgICAgIHByaW50ayAoImRvbmVcbiIpOworICAgICAgICBkb25lICsrOworICAgIH0KKyAgICBSRUlTRVJGU19TQihzKS0+c19pc191bmxpbmtlZF9vayA9IDA7CisgICAgIAorI2lmZGVmIENPTkZJR19RVU9UQQorICAgIC8qIFR1cm4gcXVvdGFzIG9mZiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhRVU9UQVM7IGkrKykgeworICAgICAgICAgICAgaWYgKHNiX2Rxb3B0KHMpLT5maWxlc1tpXSkKKyAgICAgICAgICAgICAgICAgICAgdmZzX3F1b3RhX29mZl9tb3VudChzLCBpKTsKKyAgICB9CisgICAgaWYgKG1zX2FjdGl2ZV9zZXQpCisJICAgIC8qIFJlc3RvcmUgdGhlIGZsYWcgYmFjayAqLworCSAgICBzLT5zX2ZsYWdzICY9IH5NU19BQ1RJVkU7CisjZW5kaWYKKyAgICBwYXRocmVsc2UgKCZwYXRoKTsKKyAgICBpZiAoZG9uZSkKKyAgICAgICAgcmVpc2VyZnNfaW5mbyAocywgIlRoZXJlIHdlcmUgJWQgdW5jb21wbGV0ZWQgdW5saW5rcy90cnVuY2F0ZXMuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbXBsZXRlZFxuIiwgZG9uZSk7CisgICAgcmV0dXJuIHJldHZhbDsKK30KKyAKKy8qIHRvIHByb3RlY3QgZmlsZSBiZWluZyB1bmxpbmtlZCBmcm9tIGdldHRpbmcgbG9zdCB3ZSAic2FmZSIgbGluayBmaWxlcworICAgYmVpbmcgdW5saW5rZWQuIFRoaXMgbGluayB3aWxsIGJlIGRlbGV0ZWQgaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb24gd2l0aCBsYXN0CisgICBpdGVtIG9mIGZpbGUuIG1vdW50aW5nIHRoZSBmaWxlc3l0ZW0gd2Ugc2NhbiBhbGwgdGhlc2UgbGlua3MgYW5kIHJlbW92ZQorICAgZmlsZXMgd2hpY2ggYWxtb3N0IGdvdCBsb3N0ICovCit2b2lkIGFkZF9zYXZlX2xpbmsgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKiB0aCwKKwkJICAgIHN0cnVjdCBpbm9kZSAqIGlub2RlLCBpbnQgdHJ1bmNhdGUpCit7CisgICAgSU5JVElBTElaRV9QQVRIIChwYXRoKTsKKyAgICBpbnQgcmV0dmFsOworICAgIHN0cnVjdCBjcHVfa2V5IGtleTsKKyAgICBzdHJ1Y3QgaXRlbV9oZWFkIGloOworICAgIF9fdTMyIGxpbms7CisKKyAgICBCVUdfT04gKCF0aC0+dF90cmFuc19pZCk7CisKKyAgICAvKiBmaWxlIGNhbiBvbmx5IGdldCBvbmUgInNhdmUgbGluayIgb2YgZWFjaCBraW5kICovCisgICAgUkZBTFNFKCB0cnVuY2F0ZSAmJiAKKwkgICAgKCBSRUlTRVJGU19JKGlub2RlKSAtPiBpX2ZsYWdzICYgaV9saW5rX3NhdmVkX3RydW5jYXRlX21hc2sgKSwKKwkgICAgInNhdmVkIGxpbmsgYWxyZWFkeSBleGlzdHMgZm9yIHRydW5jYXRlZCBpbm9kZSAlbHgiLAorCSAgICAoIGxvbmcgKSBpbm9kZSAtPiBpX2lubyApOworICAgIFJGQUxTRSggIXRydW5jYXRlICYmIAorCSAgICAoIFJFSVNFUkZTX0koaW5vZGUpIC0+IGlfZmxhZ3MgJiBpX2xpbmtfc2F2ZWRfdW5saW5rX21hc2sgKSwKKwkgICAgInNhdmVkIGxpbmsgYWxyZWFkeSBleGlzdHMgZm9yIHVubGlua2VkIGlub2RlICVseCIsCisJICAgICggbG9uZyApIGlub2RlIC0+IGlfaW5vICk7CisKKyAgICAvKiBzZXR1cCBrZXkgb2YgInNhdmUiIGxpbmsgKi8KKyAgICBrZXkudmVyc2lvbiA9IEtFWV9GT1JNQVRfM181OworICAgIGtleS5vbl9kaXNrX2tleS5rX2Rpcl9pZCA9IE1BWF9LRVlfT0JKRUNUSUQ7CisgICAga2V5Lm9uX2Rpc2tfa2V5Lmtfb2JqZWN0aWQgPSBpbm9kZS0+aV9pbm87CisgICAgaWYgKCF0cnVuY2F0ZSkgeworCS8qIHVubGluaywgcm1kaXIsIHJlbmFtZSAqLworCXNldF9jcHVfa2V5X2tfb2Zmc2V0ICgma2V5LCAxICsgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKKwlzZXRfY3B1X2tleV9rX3R5cGUgKCZrZXksIFRZUEVfRElSRUNUKTsKKworCS8qIGl0ZW0gaGVhZCBvZiAic2FmZSIgbGluayAqLworCW1ha2VfbGVfaXRlbV9oZWFkICgmaWgsICZrZXksIGtleS52ZXJzaW9uLCAxICsgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplLCBUWVBFX0RJUkVDVCwKKwkJCSAgIDQvKmxlbmd0aCovLCAweGZmZmYvKmZyZWUgc3BhY2UqLyk7CisgICAgfSBlbHNlIHsKKwkvKiB0cnVuY2F0ZSAqLworCWlmIChTX0lTRElSIChpbm9kZS0+aV9tb2RlKSkKKwkgICAgcmVpc2VyZnNfd2FybmluZyhpbm9kZS0+aV9zYiwgImdyZWVuLTIxMDI6IEFkZGluZyBhIHRydW5jYXRlIHNhdmVsaW5rIGZvciBhIGRpcmVjdG9yeSAlayEgUGxlYXNlIHJlcG9ydCIsIElOT0RFX1BLRVkoaW5vZGUpKTsKKwlzZXRfY3B1X2tleV9rX29mZnNldCAoJmtleSwgMSk7CisJc2V0X2NwdV9rZXlfa190eXBlICgma2V5LCBUWVBFX0lORElSRUNUKTsKKworCS8qIGl0ZW0gaGVhZCBvZiAic2FmZSIgbGluayAqLworCW1ha2VfbGVfaXRlbV9oZWFkICgmaWgsICZrZXksIGtleS52ZXJzaW9uLCAxLCBUWVBFX0lORElSRUNULAorCQkJICAgNC8qbGVuZ3RoKi8sIDAvKmZyZWUgc3BhY2UqLyk7CisgICAgfQorICAgIGtleS5rZXlfbGVuZ3RoID0gMzsKKworICAgIC8qIGxvb2sgZm9yIGl0cyBwbGFjZSBpbiB0aGUgdHJlZSAqLworICAgIHJldHZhbCA9IHNlYXJjaF9pdGVtIChpbm9kZS0+aV9zYiwgJmtleSwgJnBhdGgpOworICAgIGlmIChyZXR2YWwgIT0gSVRFTV9OT1RfRk9VTkQpIHsKKwlpZiAoIHJldHZhbCAhPSAtRU5PU1BDICkKKwkgICAgcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICJ2cy0yMTAwOiBhZGRfc2F2ZV9saW5rOiIKKwkJCSAgInNlYXJjaF9ieV9rZXkgKCVLKSByZXR1cm5lZCAlZCIsICZrZXksIHJldHZhbCk7CisJcGF0aHJlbHNlICgmcGF0aCk7CisJcmV0dXJuOworICAgIH0KKworICAgIC8qIGJvZHkgb2YgInNhdmUiIGxpbmsgKi8KKyAgICBsaW5rID0gSU5PREVfUEtFWSAoaW5vZGUpLT5rX2Rpcl9pZDsKKworICAgIC8qIHB1dCAic2F2ZSIgbGluayBpbm90IHRyZWUsIGRvbid0IGNoYXJnZSBxdW90YSB0byBhbnlvbmUgKi8KKyAgICByZXR2YWwgPSByZWlzZXJmc19pbnNlcnRfaXRlbSAodGgsICZwYXRoLCAma2V5LCAmaWgsIE5VTEwsIChjaGFyICopJmxpbmspOworICAgIGlmIChyZXR2YWwpIHsKKwlpZiAocmV0dmFsICE9IC1FTk9TUEMpCisJICAgIHJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAidnMtMjEyMDogYWRkX3NhdmVfbGluazogaW5zZXJ0X2l0ZW0gcmV0dXJuZWQgJWQiLAorCQkJICByZXR2YWwpOworICAgIH0gZWxzZSB7CisJaWYoIHRydW5jYXRlICkKKwkgICAgUkVJU0VSRlNfSShpbm9kZSkgLT4gaV9mbGFncyB8PSBpX2xpbmtfc2F2ZWRfdHJ1bmNhdGVfbWFzazsKKwllbHNlCisJICAgIFJFSVNFUkZTX0koaW5vZGUpIC0+IGlfZmxhZ3MgfD0gaV9saW5rX3NhdmVkX3VubGlua19tYXNrOworICAgIH0KK30KKworCisvKiB0aGlzIG9wZW5zIHRyYW5zYWN0aW9uIHVubGlrZSBhZGRfc2F2ZV9saW5rICovCitpbnQgcmVtb3ZlX3NhdmVfbGluayAoc3RydWN0IGlub2RlICogaW5vZGUsIGludCB0cnVuY2F0ZSkKK3sKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworICAgIHN0cnVjdCByZWlzZXJmc19rZXkga2V5OworICAgIGludCBlcnI7CisgCisgICAgLyogd2UgYXJlIGdvaW5nIHRvIGRvIG9uZSBiYWxhbmNpbmcgb25seSAqLworICAgIGVyciA9IGpvdXJuYWxfYmVnaW4gKCZ0aCwgaW5vZGUtPmlfc2IsIEpPVVJOQUxfUEVSX0JBTEFOQ0VfQ05UKTsKKyAgICBpZiAoZXJyKQorICAgICAgICByZXR1cm4gZXJyOworIAorICAgIC8qIHNldHVwIGtleSBvZiAic2F2ZSIgbGluayAqLworICAgIGtleS5rX2Rpcl9pZCA9IGNwdV90b19sZTMyIChNQVhfS0VZX09CSkVDVElEKTsKKyAgICBrZXkua19vYmplY3RpZCA9IElOT0RFX1BLRVkgKGlub2RlKS0+a19vYmplY3RpZDsKKyAgICBpZiAoIXRydW5jYXRlKSB7CisgICAgICAgIC8qIHVubGluaywgcm1kaXIsIHJlbmFtZSAqLworICAgICAgICBzZXRfbGVfa2V5X2tfb2Zmc2V0IChLRVlfRk9STUFUXzNfNSwgJmtleSwKKwkJCSAgICAgMSArIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CisgICAgICAgIHNldF9sZV9rZXlfa190eXBlIChLRVlfRk9STUFUXzNfNSwgJmtleSwgVFlQRV9ESVJFQ1QpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHRydW5jYXRlICovCisgICAgICAgIHNldF9sZV9rZXlfa19vZmZzZXQgKEtFWV9GT1JNQVRfM181LCAma2V5LCAxKTsKKyAgICAgICAgc2V0X2xlX2tleV9rX3R5cGUgKEtFWV9GT1JNQVRfM181LCAma2V5LCBUWVBFX0lORElSRUNUKTsKKyAgICB9CisgCisgICAgaWYoICggdHJ1bmNhdGUgJiYgCisgICAgICAgICAgKCBSRUlTRVJGU19JKGlub2RlKSAtPiBpX2ZsYWdzICYgaV9saW5rX3NhdmVkX3RydW5jYXRlX21hc2sgKSApIHx8CisgICAgICAgICggIXRydW5jYXRlICYmIAorICAgICAgICAgICggUkVJU0VSRlNfSShpbm9kZSkgLT4gaV9mbGFncyAmIGlfbGlua19zYXZlZF91bmxpbmtfbWFzayApICkgKQorCS8qIGRvbid0IHRha2UgcXVvdGEgYnl0ZXMgZnJvbSBhbnl3aGVyZSAqLworCXJlaXNlcmZzX2RlbGV0ZV9zb2xpZF9pdGVtICgmdGgsIE5VTEwsICZrZXkpOworICAgIGlmICghdHJ1bmNhdGUpIHsKKwlyZWlzZXJmc19yZWxlYXNlX29iamVjdGlkICgmdGgsIGlub2RlLT5pX2lubyk7CisJUkVJU0VSRlNfSShpbm9kZSkgLT4gaV9mbGFncyAmPSB+aV9saW5rX3NhdmVkX3VubGlua19tYXNrOworICAgIH0gZWxzZQorCVJFSVNFUkZTX0koaW5vZGUpIC0+IGlfZmxhZ3MgJj0gfmlfbGlua19zYXZlZF90cnVuY2F0ZV9tYXNrOworIAorICAgIHJldHVybiBqb3VybmFsX2VuZCAoJnRoLCBpbm9kZS0+aV9zYiwgSk9VUk5BTF9QRVJfQkFMQU5DRV9DTlQpOworfQorCisKK3N0YXRpYyB2b2lkIHJlaXNlcmZzX3B1dF9zdXBlciAoc3RydWN0IHN1cGVyX2Jsb2NrICogcykKK3sKKyAgaW50IGk7CisgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGggOworICB0aC50X3RyYW5zX2lkID0gMDsKKworICBpZiAoUkVJU0VSRlNfU0IocyktPnhhdHRyX3Jvb3QpIHsKKyAgICBkX2ludmFsaWRhdGUgKFJFSVNFUkZTX1NCKHMpLT54YXR0cl9yb290KTsKKyAgICBkcHV0IChSRUlTRVJGU19TQihzKS0+eGF0dHJfcm9vdCk7CisgIH0KKyAgCisgIGlmIChSRUlTRVJGU19TQihzKS0+cHJpdl9yb290KSB7CisgICAgZF9pbnZhbGlkYXRlIChSRUlTRVJGU19TQihzKS0+cHJpdl9yb290KTsKKyAgICBkcHV0IChSRUlTRVJGU19TQihzKS0+cHJpdl9yb290KTsKKyAgfQorCisgIC8qIGNoYW5nZSBmaWxlIHN5c3RlbSBzdGF0ZSB0byBjdXJyZW50IHN0YXRlIGlmIGl0IHdhcyBtb3VudGVkIHdpdGggcmVhZC13cml0ZSBwZXJtaXNzaW9ucyAqLworICBpZiAoIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworICAgIGlmICgham91cm5hbF9iZWdpbigmdGgsIHMsIDEwKSkgeworICAgICAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpLCAxKSA7CisgICAgICAgIHNldF9zYl91bW91bnRfc3RhdGUoIFNCX0RJU0tfU1VQRVJfQkxPQ0socyksIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X3N0YXRlICk7CisgICAgICAgIGpvdXJuYWxfbWFya19kaXJ0eSgmdGgsIHMsIFNCX0JVRkZFUl9XSVRIX1NCIChzKSk7CisgICAgfQorICB9CisKKyAgLyogbm90ZSwgam91cm5hbF9yZWxlYXNlIGNoZWNrcyBmb3IgcmVhZG9ubHkgbW91bnQsIGFuZCBjYW4gZGVjaWRlIG5vdAorICAqKiB0byBkbyBhIGpvdXJuYWxfZW5kCisgICovCisgIGpvdXJuYWxfcmVsZWFzZSgmdGgsIHMpIDsKKworICBmb3IgKGkgPSAwOyBpIDwgU0JfQk1BUF9OUiAocyk7IGkgKyspCisgICAgYnJlbHNlIChTQl9BUF9CSVRNQVAgKHMpW2ldLmJoKTsKKworICB2ZnJlZSAoU0JfQVBfQklUTUFQIChzKSk7CisKKyAgYnJlbHNlIChTQl9CVUZGRVJfV0lUSF9TQiAocykpOworCisgIHByaW50X3N0YXRpc3RpY3MgKHMpOworCisgIGlmIChSRUlTRVJGU19TQihzKS0+c19rbWFsbG9jcyAhPSAwKSB7CisgICAgcmVpc2VyZnNfd2FybmluZyAocywgInZzLTIwMDQ6IHJlaXNlcmZzX3B1dF9zdXBlcjogYWxsb2NhdGVkIG1lbW9yeSBsZWZ0ICVkIiwKKwkJICAgICAgUkVJU0VSRlNfU0IocyktPnNfa21hbGxvY3MpOworICB9CisKKyAgaWYgKFJFSVNFUkZTX1NCKHMpLT5yZXNlcnZlZF9ibG9ja3MgIT0gMCkgeworICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJncmVlbi0yMDA1OiByZWlzZXJmc19wdXRfc3VwZXI6IHJlc2VydmVkIGJsb2NrcyBsZWZ0ICVkIiwKKwkJICAgICAgUkVJU0VSRlNfU0IocyktPnJlc2VydmVkX2Jsb2Nrcyk7CisgIH0KKworICByZWlzZXJmc19wcm9jX2luZm9fZG9uZSggcyApOworCisgIGtmcmVlKHMtPnNfZnNfaW5mbyk7CisgIHMtPnNfZnNfaW5mbyA9IE5VTEw7CisKKyAgcmV0dXJuOworfQorCitzdGF0aWMga21lbV9jYWNoZV90ICogcmVpc2VyZnNfaW5vZGVfY2FjaGVwOworCitzdGF0aWMgc3RydWN0IGlub2RlICpyZWlzZXJmc19hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCByZWlzZXJmc19pbm9kZV9pbmZvICplaTsKKwllaSA9IChzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbyAqKWttZW1fY2FjaGVfYWxsb2MocmVpc2VyZnNfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJaWYgKCFlaSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuICZlaS0+dmZzX2lub2RlOworfQorCitzdGF0aWMgdm9pZCByZWlzZXJmc19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJa21lbV9jYWNoZV9mcmVlKHJlaXNlcmZzX2lub2RlX2NhY2hlcCwgUkVJU0VSRlNfSShpbm9kZSkpOworfQorCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCByZWlzZXJmc19pbm9kZV9pbmZvICplaSA9IChzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbyAqKSBmb287CisKKwlpZiAoKGZsYWdzICYgKFNMQUJfQ1RPUl9WRVJJRll8U0xBQl9DVE9SX0NPTlNUUlVDVE9SKSkgPT0KKwkgICAgU0xBQl9DVE9SX0NPTlNUUlVDVE9SKSB7CisJCUlOSVRfTElTVF9IRUFEKCZlaS0+aV9wcmVhbGxvY19saXN0KSA7CisJCWlub2RlX2luaXRfb25jZSgmZWktPnZmc19pbm9kZSk7CisJCWVpLT5pX2FjbF9hY2Nlc3MgPSBOVUxMOworCQllaS0+aV9hY2xfZGVmYXVsdCA9IE5VTEw7CisJfQorfQorIAorc3RhdGljIGludCBpbml0X2lub2RlY2FjaGUodm9pZCkKK3sKKwlyZWlzZXJmc19pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgicmVpc2VyX2lub2RlX2NhY2hlIiwKKwkJCQkJICAgICBzaXplb2Yoc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8pLAorCQkJCQkgICAgIDAsIFNMQUJfUkVDTEFJTV9BQ0NPVU5ULAorCQkJCQkgICAgIGluaXRfb25jZSwgTlVMTCk7CisJaWYgKHJlaXNlcmZzX2lub2RlX2NhY2hlcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGVzdHJveV9pbm9kZWNhY2hlKHZvaWQpCit7CisJaWYgKGttZW1fY2FjaGVfZGVzdHJveShyZWlzZXJmc19pbm9kZV9jYWNoZXApKQorCQlyZWlzZXJmc193YXJuaW5nIChOVUxMLCAicmVpc2VyZnNfaW5vZGVfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkIik7Cit9CisKKy8qIHdlIGRvbid0IG1hcmsgaW5vZGVzIGRpcnR5LCB3ZSBqdXN0IGxvZyB0aGVtICovCitzdGF0aWMgdm9pZCByZWlzZXJmc19kaXJ0eV9pbm9kZSAoc3RydWN0IGlub2RlICogaW5vZGUpIHsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoIDsKKworICAgIGludCBlcnIgPSAwOworICAgIGlmIChpbm9kZS0+aV9zYi0+c19mbGFncyAmIE1TX1JET05MWSkgeworICAgICAgICByZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLCAiY2xtLTYwMDY6IHdyaXRpbmcgaW5vZGUgJWx1IG9uIHJlYWRvbmx5IEZTIiwKKwkgICAgICAgICAgICAgICAgICBpbm9kZS0+aV9pbm8pIDsKKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisKKyAgICAvKiB0aGlzIGlzIHJlYWxseSBvbmx5IHVzZWQgZm9yIGF0aW1lIHVwZGF0ZXMsIHNvIHRoZXkgZG9uJ3QgaGF2ZQorICAgICoqIHRvIGJlIGluY2x1ZGVkIGluIE9fU1lOQyBvciBmc3luYworICAgICovCisgICAgZXJyID0gam91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLCAxKSA7CisgICAgaWYgKGVycikgeworICAgICAgICByZWlzZXJmc193cml0ZV91bmxvY2sgKGlub2RlLT5pX3NiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICByZWlzZXJmc191cGRhdGVfc2QgKCZ0aCwgaW5vZGUpOworICAgIGpvdXJuYWxfZW5kKCZ0aCwgaW5vZGUtPmlfc2IsIDEpIDsKKyAgICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworfQorCitzdGF0aWMgdm9pZCByZWlzZXJmc19jbGVhcl9pbm9kZSAoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKyAgICBzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CisKKyAgICBhY2wgPSBSRUlTRVJGU19JKGlub2RlKS0+aV9hY2xfYWNjZXNzOworICAgIGlmIChhY2wgJiYgIUlTX0VSUiAoYWNsKSkKKyAgICAgICAgcG9zaXhfYWNsX3JlbGVhc2UgKGFjbCk7CisgICAgUkVJU0VSRlNfSShpbm9kZSktPmlfYWNsX2FjY2VzcyA9IE5VTEw7CisKKyAgICBhY2wgPSBSRUlTRVJGU19JKGlub2RlKS0+aV9hY2xfZGVmYXVsdDsKKyAgICBpZiAoYWNsICYmICFJU19FUlIgKGFjbCkpCisgICAgICAgIHBvc2l4X2FjbF9yZWxlYXNlIChhY2wpOworICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2FjbF9kZWZhdWx0ID0gTlVMTDsKK30KKworI2lmZGVmIENPTkZJR19RVU9UQQorc3RhdGljIHNzaXplX3QgcmVpc2VyZnNfcXVvdGFfd3JpdGUoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCwgY29uc3QgY2hhciAqLCBzaXplX3QsIGxvZmZfdCk7CitzdGF0aWMgc3NpemVfdCByZWlzZXJmc19xdW90YV9yZWFkKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbnQsIGNoYXIgKiwgc2l6ZV90LCBsb2ZmX3QpOworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyByZWlzZXJmc19zb3BzID0KK3sKKyAgLmFsbG9jX2lub2RlID0gcmVpc2VyZnNfYWxsb2NfaW5vZGUsCisgIC5kZXN0cm95X2lub2RlID0gcmVpc2VyZnNfZGVzdHJveV9pbm9kZSwKKyAgLndyaXRlX2lub2RlID0gcmVpc2VyZnNfd3JpdGVfaW5vZGUsCisgIC5kaXJ0eV9pbm9kZSA9IHJlaXNlcmZzX2RpcnR5X2lub2RlLAorICAuZGVsZXRlX2lub2RlID0gcmVpc2VyZnNfZGVsZXRlX2lub2RlLAorICAuY2xlYXJfaW5vZGUgID0gcmVpc2VyZnNfY2xlYXJfaW5vZGUsCisgIC5wdXRfc3VwZXIgPSByZWlzZXJmc19wdXRfc3VwZXIsCisgIC53cml0ZV9zdXBlciA9IHJlaXNlcmZzX3dyaXRlX3N1cGVyLAorICAuc3luY19mcyA9IHJlaXNlcmZzX3N5bmNfZnMsCisgIC53cml0ZV9zdXBlcl9sb2NrZnMgPSByZWlzZXJmc193cml0ZV9zdXBlcl9sb2NrZnMsCisgIC51bmxvY2tmcyA9IHJlaXNlcmZzX3VubG9ja2ZzLAorICAuc3RhdGZzID0gcmVpc2VyZnNfc3RhdGZzLAorICAucmVtb3VudF9mcyA9IHJlaXNlcmZzX3JlbW91bnQsCisjaWZkZWYgQ09ORklHX1FVT1RBCisgIC5xdW90YV9yZWFkID0gcmVpc2VyZnNfcXVvdGFfcmVhZCwKKyAgLnF1b3RhX3dyaXRlID0gcmVpc2VyZnNfcXVvdGFfd3JpdGUsCisjZW5kaWYKK307CisKKyNpZmRlZiBDT05GSUdfUVVPVEEKKyNkZWZpbmUgUVRZUEUyTkFNRSh0KSAoKHQpPT1VU1JRVU9UQT8idXNlciI6Imdyb3VwIikKKworc3RhdGljIGludCByZWlzZXJmc19kcXVvdF9pbml0aWFsaXplKHN0cnVjdCBpbm9kZSAqLCBpbnQpOworc3RhdGljIGludCByZWlzZXJmc19kcXVvdF9kcm9wKHN0cnVjdCBpbm9kZSAqKTsKK3N0YXRpYyBpbnQgcmVpc2VyZnNfd3JpdGVfZHF1b3Qoc3RydWN0IGRxdW90ICopOworc3RhdGljIGludCByZWlzZXJmc19hY3F1aXJlX2RxdW90KHN0cnVjdCBkcXVvdCAqKTsKK3N0YXRpYyBpbnQgcmVpc2VyZnNfcmVsZWFzZV9kcXVvdChzdHJ1Y3QgZHF1b3QgKik7CitzdGF0aWMgaW50IHJlaXNlcmZzX21hcmtfZHF1b3RfZGlydHkoc3RydWN0IGRxdW90ICopOworc3RhdGljIGludCByZWlzZXJmc193cml0ZV9pbmZvKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbnQpOworc3RhdGljIGludCByZWlzZXJmc19xdW90YV9vbihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50LCBpbnQsIGNoYXIgKik7CisKK3N0YXRpYyBzdHJ1Y3QgZHF1b3Rfb3BlcmF0aW9ucyByZWlzZXJmc19xdW90YV9vcGVyYXRpb25zID0KK3sKKyAgLmluaXRpYWxpemUgPSByZWlzZXJmc19kcXVvdF9pbml0aWFsaXplLAorICAuZHJvcCA9IHJlaXNlcmZzX2RxdW90X2Ryb3AsCisgIC5hbGxvY19zcGFjZSA9IGRxdW90X2FsbG9jX3NwYWNlLAorICAuYWxsb2NfaW5vZGUgPSBkcXVvdF9hbGxvY19pbm9kZSwKKyAgLmZyZWVfc3BhY2UgPSBkcXVvdF9mcmVlX3NwYWNlLAorICAuZnJlZV9pbm9kZSA9IGRxdW90X2ZyZWVfaW5vZGUsCisgIC50cmFuc2ZlciA9IGRxdW90X3RyYW5zZmVyLAorICAud3JpdGVfZHF1b3QgPSByZWlzZXJmc193cml0ZV9kcXVvdCwKKyAgLmFjcXVpcmVfZHF1b3QgPSByZWlzZXJmc19hY3F1aXJlX2RxdW90LAorICAucmVsZWFzZV9kcXVvdCA9IHJlaXNlcmZzX3JlbGVhc2VfZHF1b3QsCisgIC5tYXJrX2RpcnR5ID0gcmVpc2VyZnNfbWFya19kcXVvdF9kaXJ0eSwKKyAgLndyaXRlX2luZm8gPSByZWlzZXJmc193cml0ZV9pbmZvLAorfTsKKworc3RhdGljIHN0cnVjdCBxdW90YWN0bF9vcHMgcmVpc2VyZnNfcWN0bF9vcGVyYXRpb25zID0KK3sKKyAgLnF1b3RhX29uID0gcmVpc2VyZnNfcXVvdGFfb24sCisgIC5xdW90YV9vZmYgPSB2ZnNfcXVvdGFfb2ZmLAorICAucXVvdGFfc3luYyA9IHZmc19xdW90YV9zeW5jLAorICAuZ2V0X2luZm8gPSB2ZnNfZ2V0X2RxaW5mbywKKyAgLnNldF9pbmZvID0gdmZzX3NldF9kcWluZm8sCisgIC5nZXRfZHFibGsgPSB2ZnNfZ2V0X2RxYmxrLAorICAuc2V0X2RxYmxrID0gdmZzX3NldF9kcWJsaywKK307CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBleHBvcnRfb3BlcmF0aW9ucyByZWlzZXJmc19leHBvcnRfb3BzID0geworICAuZW5jb2RlX2ZoID0gcmVpc2VyZnNfZW5jb2RlX2ZoLAorICAuZGVjb2RlX2ZoID0gcmVpc2VyZnNfZGVjb2RlX2ZoLAorICAuZ2V0X3BhcmVudCA9IHJlaXNlcmZzX2dldF9wYXJlbnQsCisgIC5nZXRfZGVudHJ5ID0gcmVpc2VyZnNfZ2V0X2RlbnRyeSwKK30gOworCisvKiB0aGlzIHN0cnVjdCBpcyB1c2VkIGluIHJlaXNlcmZzX2dldG9wdCAoKSBmb3IgY29udGFpbmluZyB0aGUgdmFsdWUgZm9yIHRob3NlCisgICBtb3VudCBvcHRpb25zIHRoYXQgaGF2ZSB2YWx1ZXMgcmF0aGVyIHRoYW4gYmVpbmcgdG9nZ2xlcy4gKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjaGFyICogdmFsdWU7CisgICAgaW50IHNldG1hc2s7IC8qIGJpdG1hc2sgd2hpY2ggaXMgdG8gc2V0IG9uIG1vdW50X29wdGlvbnMgYml0bWFzayB3aGVuIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgaXMgZm91bmQsIDAgaXMgbm8gYml0cyBhcmUgdG8gYmUgY2hhbmdlZC4gKi8KKyAgICBpbnQgY2xybWFzazsgLyogYml0bWFzayB3aGljaCBpcyB0byBjbGVhciBvbiBtb3VudF9vcHRpb25zIGJpdG1hc2sgd2hlbiAgdGhpcworCQkgICAgdmFsdWUgaXMgZm91bmQsIDAgaXMgbm8gYml0cyBhcmUgdG8gYmUgY2hhbmdlZC4gVGhpcyBpcworCQkgICAgYXBwbGllZCBCRUZPUkUgc2V0bWFzayAqLworfSBhcmdfZGVzY190OworCisvKiBTZXQgdGhpcyBiaXQgaW4gYXJnX3JlcXVpcmVkIHRvIGFsbG93IGVtcHR5IGFyZ3VtZW50cyAqLworI2RlZmluZSBSRUlTRVJGU19PUFRfQUxMT1dFTVBUWSAzMQorCisvKiB0aGlzIHN0cnVjdCBpcyB1c2VkIGluIHJlaXNlcmZzX2dldG9wdCgpIGZvciBkZXNjcmliaW5nIHRoZSBzZXQgb2YgcmVpc2VyZnMKKyAgIG1vdW50IG9wdGlvbnMgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjaGFyICogb3B0aW9uX25hbWU7CisgICAgaW50IGFyZ19yZXF1aXJlZDsgLyogMCBpZiBhcmd1bWVudCBpcyBub3QgcmVxdWlyZWQsIG5vdCAwIG90aGVyd2lzZSAqLworICAgIGNvbnN0IGFyZ19kZXNjX3QgKiB2YWx1ZXM7IC8qIGxpc3Qgb2YgdmFsdWVzIGFjY2VwdGVkIGJ5IGFuIG9wdGlvbiAqLworICAgIGludCBzZXRtYXNrOyAvKiBiaXRtYXNrIHdoaWNoIGlzIHRvIHNldCBvbiBtb3VudF9vcHRpb25zIGJpdG1hc2sgd2hlbiB0aGlzCisgICAgICAgICAgICAgICAgICAgIHZhbHVlIGlzIGZvdW5kLCAwIGlzIG5vIGJpdHMgYXJlIHRvIGJlIGNoYW5nZWQuICovCisgICAgaW50IGNscm1hc2s7IC8qIGJpdG1hc2sgd2hpY2ggaXMgdG8gY2xlYXIgb24gbW91bnRfb3B0aW9ucyBiaXRtYXNrIHdoZW4gIHRoaXMKKwkJICAgIHZhbHVlIGlzIGZvdW5kLCAwIGlzIG5vIGJpdHMgYXJlIHRvIGJlIGNoYW5nZWQuIFRoaXMgaXMKKwkJICAgIGFwcGxpZWQgQkVGT1JFIHNldG1hc2sgKi8KK30gb3B0X2Rlc2NfdDsKKworLyogcG9zc2libGUgdmFsdWVzIGZvciAtbyBkYXRhPSAqLworc3RhdGljIGNvbnN0IGFyZ19kZXNjX3QgbG9nZ2luZ19tb2RlW10gPSB7CisgICAgeyJvcmRlcmVkIiwgMTw8UkVJU0VSRlNfREFUQV9PUkRFUkVELCAoMTw8UkVJU0VSRlNfREFUQV9MT0d8MTw8UkVJU0VSRlNfREFUQV9XUklURUJBQ0spfSwKKyAgICB7ImpvdXJuYWwiLCAxPDxSRUlTRVJGU19EQVRBX0xPRywgKDE8PFJFSVNFUkZTX0RBVEFfT1JERVJFRHwxPDxSRUlTRVJGU19EQVRBX1dSSVRFQkFDSyl9LAorICAgIHsid3JpdGViYWNrIiwgMTw8UkVJU0VSRlNfREFUQV9XUklURUJBQ0ssICgxPDxSRUlTRVJGU19EQVRBX09SREVSRUR8MTw8UkVJU0VSRlNfREFUQV9MT0cpfSwKKyAgICB7TlVMTCwgMH0KK307CisKKy8qIHBvc3NpYmxlIHZhbHVlcyBmb3IgLW8gYmFycmllcj0gKi8KK3N0YXRpYyBjb25zdCBhcmdfZGVzY190IGJhcnJpZXJfbW9kZVtdID0geworICAgIHsibm9uZSIsIDE8PFJFSVNFUkZTX0JBUlJJRVJfTk9ORSwgMTw8UkVJU0VSRlNfQkFSUklFUl9GTFVTSH0sCisgICAgeyJmbHVzaCIsIDE8PFJFSVNFUkZTX0JBUlJJRVJfRkxVU0gsIDE8PFJFSVNFUkZTX0JBUlJJRVJfTk9ORX0sCisgICAge05VTEwsIDB9Cit9OworCisvKiBwb3NzaWJsZSB2YWx1ZXMgZm9yICItbyBibG9jay1hbGxvY2F0b3I9IiBhbmQgYml0cyB3aGljaCBhcmUgdG8gYmUgc2V0IGluCisgICBzX21vdW50X29wdCBvZiByZWlzZXJmcyBzcGVjaWZpYyBwYXJ0IG9mIGluLWNvcmUgc3VwZXIgYmxvY2sgKi8KK3N0YXRpYyBjb25zdCBhcmdfZGVzY190IGJhbGxvY1tdID0geworICAgIHsibm9ib3JkZXIiLCAxPDxSRUlTRVJGU19OT19CT1JERVIsIDB9LAorICAgIHsiYm9yZGVyIiwgMCwgMTw8UkVJU0VSRlNfTk9fQk9SREVSfSwKKyAgICB7Im5vX3VuaGFzaGVkX3JlbG9jYXRpb24iLCAxPDxSRUlTRVJGU19OT19VTkhBU0hFRF9SRUxPQ0FUSU9OLCAwfSwKKyAgICB7Imhhc2hlZF9yZWxvY2F0aW9uIiwgMTw8UkVJU0VSRlNfSEFTSEVEX1JFTE9DQVRJT04sIDB9LAorICAgIHsidGVzdDQiLCAxPDxSRUlTRVJGU19URVNUNCwgMH0sCisgICAgeyJub3Rlc3Q0IiwgMCwgMTw8UkVJU0VSRlNfVEVTVDR9LAorICAgIHtOVUxMLCAwLCAwfQorfTsKKworc3RhdGljIGNvbnN0IGFyZ19kZXNjX3QgdGFpbHNbXSA9IHsKKyAgICB7Im9uIiwgMTw8UkVJU0VSRlNfTEFSR0VUQUlMLCAxPDxSRUlTRVJGU19TTUFMTFRBSUx9LAorICAgIHsib2ZmIiwgMCwgKDE8PFJFSVNFUkZTX0xBUkdFVEFJTCl8KDE8PFJFSVNFUkZTX1NNQUxMVEFJTCl9LAorICAgIHsic21hbGwiLCAxPDxSRUlTRVJGU19TTUFMTFRBSUwsIDE8PFJFSVNFUkZTX0xBUkdFVEFJTH0sCisgICAge05VTEwsIDAsIDB9Cit9OworCitzdGF0aWMgY29uc3QgYXJnX2Rlc2NfdCBlcnJvcl9hY3Rpb25zW10gPSB7CisgICAgeyJwYW5pYyIsIDEgPDwgUkVJU0VSRlNfRVJST1JfUEFOSUMsCisgICAgICAgICAgICAgICgxIDw8IFJFSVNFUkZTX0VSUk9SX1JPIHwgMSA8PCBSRUlTRVJGU19FUlJPUl9DT05USU5VRSl9LAorICAgIHsicm8tcmVtb3VudCIsIDEgPDwgUkVJU0VSRlNfRVJST1JfUk8sCisgICAgICAgICAgICAgICgxIDw8IFJFSVNFUkZTX0VSUk9SX1BBTklDIHwgMSA8PCBSRUlTRVJGU19FUlJPUl9DT05USU5VRSl9LAorI2lmZGVmIFJFSVNFUkZTX0pPVVJOQUxfRVJST1JfQUxMT1dTX05PX0xPRworICAgIHsiY29udGludWUiLCAxIDw8IFJFSVNFUkZTX0VSUk9SX0NPTlRJTlVFLAorICAgICAgICAgICAgICAoMSA8PCBSRUlTRVJGU19FUlJPUl9QQU5JQyB8IDEgPDwgUkVJU0VSRlNfRVJST1JfUk8pfSwKKyNlbmRpZgorICAgIHtOVUxMLCAwLCAwfSwKK307CisKK2ludCByZWlzZXJmc19kZWZhdWx0X2lvX3NpemUgPSAxMjggKiAxMDI0OyAvKiBEZWZhdWx0IHJlY29tbWVuZGVkIEkvTyBzaXplIGlzIDEyOGsuCisJCQkJCSAgICAgIFRoZXJlIG1pZ2h0IGJlIGJyb2tlbiBhcHBsaWNhdGlvbnMgdGhhdCBhcmUKKwkJCQkJICAgICAgY29uZnVzZWQgYnkgdGhpcy4gVXNlIG5vbGFyZ2VpbyBtb3VudCBvcHRpb24KKwkJCQkJICAgICAgdG8gZ2V0IHVzdWFsIGkvbyBzaXplID0gUEFHRV9TSVpFLgorCQkJCQkgICAgKi8KKworLyogcHJvY2VlZCBvbmx5IG9uZSBvcHRpb24gZnJvbSBhIGxpc3QgKmN1ciAtIHN0cmluZyBjb250YWluaW5nIG9mIG1vdW50IG9wdGlvbnMKKyAgIG9wdHMgLSBhcnJheSBvZiBvcHRpb25zIHdoaWNoIGFyZSBhY2NlcHRlZAorICAgb3B0X2FyZyAtIGlmIG9wdGlvbiBpcyBmb3VuZCBhbmQgcmVxdWlyZXMgYW4gYXJndW1lbnQgYW5kIGlmIGl0IGlzIHNwZWNpZmVkCisgICBpbiB0aGUgaW5wdXQgLSBwb2ludGVyIHRvIHRoZSBhcmd1bWVudCBpcyBzdG9yZWQgaGVyZQorICAgYml0X2ZsYWdzIC0gaWYgb3B0aW9uIHJlcXVpcmVzIHRvIHNldCBhIGNlcnRhaW4gYml0IC0gaXQgaXMgc2V0IGhlcmUKKyAgIHJldHVybiAtMSBpZiB1bmtub3duIG9wdGlvbiBpcyBmb3VuZCwgb3B0LT5hcmdfcmVxdWlyZWQgb3RoZXJ3aXNlICovCitzdGF0aWMgaW50IHJlaXNlcmZzX2dldG9wdCAoIHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIGNoYXIgKiogY3VyLCBvcHRfZGVzY190ICogb3B0cywgY2hhciAqKiBvcHRfYXJnLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgKiBiaXRfZmxhZ3MpCit7CisgICAgY2hhciAqIHA7CisgICAgLyogZm9vPWJhciwgCisgICAgICAgXiAgIF4gIF4KKyAgICAgICB8ICAgfCAgKy0tIG9wdGlvbl9lbmQKKyAgICAgICB8ICAgKy0tIGFyZ19zdGFydAorICAgICAgICstLSBvcHRpb25fc3RhcnQKKyAgICAqLworICAgIGNvbnN0IG9wdF9kZXNjX3QgKiBvcHQ7CisgICAgY29uc3QgYXJnX2Rlc2NfdCAqIGFyZzsKKyAgICAKKyAgICAKKyAgICBwID0gKmN1cjsKKyAgICAKKyAgICAvKiBhc3N1bWUgYXJndW1lbnQgY2Fubm90IGNvbnRhaW4gY29tbWFzICovCisgICAgKmN1ciA9IHN0cmNociAocCwgJywnKTsKKyAgICBpZiAoKmN1cikgeworCSooKmN1cikgPSAnXDAnOworCSgqY3VyKSArKzsKKyAgICB9CisKKyAgICBpZiAoICFzdHJuY21wIChwLCAiYWxsb2M9IiwgNikgKSB7CisJLyogVWdseSBzcGVjaWFsIGNhc2UsIHByb2JhYmx5IHdlIHNob3VsZCByZWRvIG9wdGlvbnMgcGFyc2VyIHNvIHRoYXQKKwkgICBpdCBjYW4gdW5kZXJzdGFuZCBzZXZlcmFsIGFyZ3VtZW50cyBmb3Igc29tZSBvcHRpb25zLCBhbHNvIHNvIHRoYXQKKwkgICBpdCBjYW4gZmlsbCBzZXZlcmFsIGJpdGZpZWxkcyB3aXRoIG9wdGlvbiB2YWx1ZXMuICovCisJaWYgKCByZWlzZXJmc19wYXJzZV9hbGxvY19vcHRpb25zKCBzLCBwICsgNikgKSB7CisJICAgIHJldHVybiAtMTsKKwl9IGVsc2UgeworCSAgICByZXR1cm4gMDsKKwl9CisgICAgfQorCisgCisgICAgLyogZm9yIGV2ZXJ5IG9wdGlvbiBpbiB0aGUgbGlzdCAqLworICAgIGZvciAob3B0ID0gb3B0czsgb3B0LT5vcHRpb25fbmFtZTsgb3B0ICsrKSB7CisJaWYgKCFzdHJuY21wIChwLCBvcHQtPm9wdGlvbl9uYW1lLCBzdHJsZW4gKG9wdC0+b3B0aW9uX25hbWUpKSkgeworCSAgICBpZiAoYml0X2ZsYWdzKSB7CisgICAgICAgICAgICAgICAgaWYgKG9wdC0+Y2xybWFzayA9PSAoMSA8PCBSRUlTRVJGU19VTlNVUFBPUlRFRF9PUFQpKQorICAgICAgICAgICAgICAgICAgICByZWlzZXJmc193YXJuaW5nIChzLCAiJXMgbm90IHN1cHBvcnRlZC4iLCBwKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpiaXRfZmxhZ3MgJj0gfm9wdC0+Y2xybWFzazsKKyAgICAgICAgICAgICAgICBpZiAob3B0LT5zZXRtYXNrID09ICgxIDw8IFJFSVNFUkZTX1VOU1VQUE9SVEVEX09QVCkpCisgICAgICAgICAgICAgICAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICIlcyBub3Qgc3VwcG9ydGVkLiIsIHApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKmJpdF9mbGFncyB8PSBvcHQtPnNldG1hc2s7CisJICAgIH0KKwkgICAgYnJlYWs7CisJfQorICAgIH0KKyAgICBpZiAoIW9wdC0+b3B0aW9uX25hbWUpIHsKKwlyZWlzZXJmc193YXJuaW5nIChzLCAidW5rbm93biBtb3VudCBvcHRpb24gXCIlc1wiIiwgcCk7CisJcmV0dXJuIC0xOworICAgIH0KKyAgICAKKyAgICBwICs9IHN0cmxlbiAob3B0LT5vcHRpb25fbmFtZSk7CisgICAgc3dpdGNoICgqcCkgeworICAgIGNhc2UgJz0nOgorCWlmICghb3B0LT5hcmdfcmVxdWlyZWQpIHsKKwkgICAgcmVpc2VyZnNfd2FybmluZyAocywgInRoZSBvcHRpb24gXCIlc1wiIGRvZXMgbm90IHJlcXVpcmUgYW4gYXJndW1lbnQiLAorCQkgICAgb3B0LT5vcHRpb25fbmFtZSk7CisJICAgIHJldHVybiAtMTsKKwl9CisJYnJlYWs7CisJCisgICAgY2FzZSAwOgorCWlmIChvcHQtPmFyZ19yZXF1aXJlZCkgeworCSAgICByZWlzZXJmc193YXJuaW5nIChzLCAidGhlIG9wdGlvbiBcIiVzXCIgcmVxdWlyZXMgYW4gYXJndW1lbnQiLCBvcHQtPm9wdGlvbl9uYW1lKTsKKwkgICAgcmV0dXJuIC0xOworCX0KKwlicmVhazsKKyAgICBkZWZhdWx0OgorCXJlaXNlcmZzX3dhcm5pbmcgKHMsICJoZWFkIG9mIG9wdGlvbiBcIiVzXCIgaXMgb25seSBjb3JyZWN0Iiwgb3B0LT5vcHRpb25fbmFtZSk7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIG1vdmUgdG8gdGhlIGFyZ3VtZW50LCBvciB0byBuZXh0IG9wdGlvbiBpZiBhcmd1bWVudCBpcyBub3QgcmVxdWlyZWQgKi8KKyAgICBwICsrOworICAgIAorICAgIGlmICggb3B0LT5hcmdfcmVxdWlyZWQgJiYgIShvcHQtPmFyZ19yZXF1aXJlZCAmICgxPDxSRUlTRVJGU19PUFRfQUxMT1dFTVBUWSkpICYmICFzdHJsZW4gKHApICkgeworCS8qIHRoaXMgY2F0Y2hlcyAib3B0aW9uPSwiIGlmIG5vdCBhbGxvd2VkICovCisJcmVpc2VyZnNfd2FybmluZyAocywgImVtcHR5IGFyZ3VtZW50IGZvciBcIiVzXCIiLCBvcHQtPm9wdGlvbl9uYW1lKTsKKwlyZXR1cm4gLTE7CisgICAgfQorICAgIAorICAgIGlmICghb3B0LT52YWx1ZXMpIHsKKwkvKiAqPU5VTExvcHRfYXJnIGNvbnRhaW5zIHBvaW50ZXIgdG8gYXJndW1lbnQgKi8KKwkqb3B0X2FyZyA9IHA7CisJcmV0dXJuIG9wdC0+YXJnX3JlcXVpcmVkICYgfigxPDxSRUlTRVJGU19PUFRfQUxMT1dFTVBUWSk7CisgICAgfQorICAgIAorICAgIC8qIHZhbHVlcyBwb3NzaWJsZSBmb3IgdGhpcyBvcHRpb24gYXJlIGxpc3RlZCBpbiBvcHQtPnZhbHVlcyAqLworICAgIGZvciAoYXJnID0gb3B0LT52YWx1ZXM7IGFyZy0+dmFsdWU7IGFyZyArKykgeworCWlmICghc3RyY21wIChwLCBhcmctPnZhbHVlKSkgeworCSAgICBpZiAoYml0X2ZsYWdzKSB7CisJCSpiaXRfZmxhZ3MgJj0gfmFyZy0+Y2xybWFzazsKKwkJKmJpdF9mbGFncyB8PSBhcmctPnNldG1hc2s7CisJICAgIH0KKwkgICAgcmV0dXJuIG9wdC0+YXJnX3JlcXVpcmVkOworCX0KKyAgICB9CisgICAgCisgICAgcmVpc2VyZnNfd2FybmluZyAocywgImJhZCB2YWx1ZSBcIiVzXCIgZm9yIG9wdGlvbiBcIiVzXCIiLCBwLCBvcHQtPm9wdGlvbl9uYW1lKTsKKyAgICByZXR1cm4gLTE7Cit9CisKKy8qIHJldHVybnMgMCBpZiBzb21ldGhpbmcgaXMgd3JvbmcgaW4gb3B0aW9uIHN0cmluZywgMSAtIG90aGVyd2lzZSAqLworc3RhdGljIGludCByZWlzZXJmc19wYXJzZV9vcHRpb25zIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLCBjaGFyICogb3B0aW9ucywgLyogc3RyaW5nIGdpdmVuIHZpYSBtb3VudCdzIC1vICovCisJCQkJICAgdW5zaWduZWQgbG9uZyAqIG1vdW50X29wdGlvbnMsCisJCQkJICAgLyogYWZ0ZXIgdGhlIHBhcnNpbmcgcGhhc2UsIGNvbnRhaW5zIHRoZQorCQkJCSAgICAgIGNvbGxlY3Rpb24gb2YgYml0ZmxhZ3MgZGVmaW5pbmcgd2hhdAorCQkJCSAgICAgIG1vdW50IG9wdGlvbnMgd2VyZSBzZWxlY3RlZC4gKi8KKwkJCQkgICB1bnNpZ25lZCBsb25nICogYmxvY2tzLCAvKiBzdHJ0b2wtZWQgZnJvbSBOTk4gb2YgcmVzaXplPU5OTiAqLworCQkJCSAgIGNoYXIgKiogamRldl9uYW1lLAorCQkJCSAgIHVuc2lnbmVkIGludCAqIGNvbW1pdF9tYXhfYWdlKQoreworICAgIGludCBjOworICAgIGNoYXIgKiBhcmcgPSBOVUxMOworICAgIGNoYXIgKiBwb3M7CisgICAgb3B0X2Rlc2NfdCBvcHRzW10gPSB7CisJLyogQ29tcGF0aWJpbGl0eSBzdHVmZiwgc28gdGhhdCAtbyBub3RhaWwgZm9yIG9sZCBzZXR1cHMgc3RpbGwgd29yayAqLworCXsidGFpbHMiLAkuYXJnX3JlcXVpcmVkID0gJ3QnLCAudmFsdWVzID0gdGFpbHN9LAorCXsibm90YWlsIiwJLmNscm1hc2sgPSAoMTw8UkVJU0VSRlNfTEFSR0VUQUlMKXwoMTw8UkVJU0VSRlNfU01BTExUQUlMKX0sCisJeyJjb252IiwJLnNldG1hc2sgPSAxPDxSRUlTRVJGU19DT05WRVJUfSwKKwl7ImF0dHJzIiwJLnNldG1hc2sgPSAxPDxSRUlTRVJGU19BVFRSU30sCisJeyJub2F0dHJzIiwJLmNscm1hc2sgPSAxPDxSRUlTRVJGU19BVFRSU30sCisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0ZTX1hBVFRSCisJeyJ1c2VyX3hhdHRyIiwJLnNldG1hc2sgPSAxPDxSRUlTRVJGU19YQVRUUlNfVVNFUn0sCisJeyJub3VzZXJfeGF0dHIiLC5jbHJtYXNrID0gMTw8UkVJU0VSRlNfWEFUVFJTX1VTRVJ9LAorI2Vsc2UKKwl7InVzZXJfeGF0dHIiLAkuc2V0bWFzayA9IDE8PFJFSVNFUkZTX1VOU1VQUE9SVEVEX09QVH0sCisJeyJub3VzZXJfeGF0dHIiLC5jbHJtYXNrID0gMTw8UkVJU0VSRlNfVU5TVVBQT1JURURfT1BUfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19SRUlTRVJGU19GU19QT1NJWF9BQ0wKKwl7ImFjbCIsCQkuc2V0bWFzayA9IDE8PFJFSVNFUkZTX1BPU0lYQUNMfSwKKwl7Im5vYWNsIiwJLmNscm1hc2sgPSAxPDxSRUlTRVJGU19QT1NJWEFDTH0sCisjZWxzZQorCXsiYWNsIiwJCS5zZXRtYXNrID0gMTw8UkVJU0VSRlNfVU5TVVBQT1JURURfT1BUfSwKKwl7Im5vYWNsIiwJLmNscm1hc2sgPSAxPDxSRUlTRVJGU19VTlNVUFBPUlRFRF9PUFR9LAorI2VuZGlmCisJeyJub2xvZyIsfSwJIC8qIFRoaXMgaXMgdW5zdXBwb3J0ZWQgKi8KKwl7InJlcGxheW9ubHkiLAkuc2V0bWFzayA9IDE8PFJFUExBWU9OTFl9LAorCXsiYmxvY2stYWxsb2NhdG9yIiwgLmFyZ19yZXF1aXJlZCA9ICdhJywgLnZhbHVlcyA9IGJhbGxvY30sCisJeyJkYXRhIiwJLmFyZ19yZXF1aXJlZCA9ICdkJywgLnZhbHVlcyA9IGxvZ2dpbmdfbW9kZX0sCisJeyJiYXJyaWVyIiwJLmFyZ19yZXF1aXJlZCA9ICdiJywgLnZhbHVlcyA9IGJhcnJpZXJfbW9kZX0sCisJeyJyZXNpemUiLAkuYXJnX3JlcXVpcmVkID0gJ3InLCAudmFsdWVzID0gTlVMTH0sCisJeyJqZGV2IiwJLmFyZ19yZXF1aXJlZCA9ICdqJywgLnZhbHVlcyA9IE5VTEx9LAorCXsibm9sYXJnZWlvIiwJLmFyZ19yZXF1aXJlZCA9ICd3JywgLnZhbHVlcyA9IE5VTEx9LAorCXsiY29tbWl0IiwJLmFyZ19yZXF1aXJlZCA9ICdjJywgLnZhbHVlcyA9IE5VTEx9LAorCXsidXNycXVvdGEiLH0sCisJeyJncnBxdW90YSIsfSwKKwl7ImVycm9ycyIsIAkuYXJnX3JlcXVpcmVkID0gJ2UnLCAudmFsdWVzID0gZXJyb3JfYWN0aW9uc30sCisJeyJ1c3JqcXVvdGEiLAkuYXJnX3JlcXVpcmVkID0gJ3UnfCgxPDxSRUlTRVJGU19PUFRfQUxMT1dFTVBUWSksIC52YWx1ZXMgPSBOVUxMfSwKKwl7ImdycGpxdW90YSIsCS5hcmdfcmVxdWlyZWQgPSAnZyd8KDE8PFJFSVNFUkZTX09QVF9BTExPV0VNUFRZKSwgLnZhbHVlcyA9IE5VTEx9LAorCXsianFmbXQiLAkuYXJnX3JlcXVpcmVkID0gJ2YnLCAudmFsdWVzID0gTlVMTH0sCisJe05VTEwsfQorICAgIH07CisJCisgICAgKmJsb2NrcyA9IDA7CisgICAgaWYgKCFvcHRpb25zIHx8ICEqb3B0aW9ucykKKwkvKiB1c2UgZGVmYXVsdCBjb25maWd1cmF0aW9uOiBjcmVhdGUgdGFpbHMsIGpvdXJuYWxpbmcgb24sIG5vCisJICAgY29udmVyc2lvbiB0byBuZXdlc3QgZm9ybWF0ICovCisJcmV0dXJuIDE7CisgICAgCisgICAgZm9yIChwb3MgPSBvcHRpb25zOyBwb3M7ICkgeworCWMgPSByZWlzZXJmc19nZXRvcHQgKHMsICZwb3MsIG9wdHMsICZhcmcsIG1vdW50X29wdGlvbnMpOworCWlmIChjID09IC0xKQorCSAgICAvKiB3cm9uZyBvcHRpb24gaXMgZ2l2ZW4gKi8KKwkgICAgcmV0dXJuIDA7CisJCisJaWYgKGMgPT0gJ3InKSB7CisJICAgIGNoYXIgKiBwOworCSAgICAKKwkgICAgcCA9IE5VTEw7CisJICAgIC8qICJyZXNpemU9Tk5OIiAqLworCSAgICAqYmxvY2tzID0gc2ltcGxlX3N0cnRvdWwgKGFyZywgJnAsIDApOworCSAgICBpZiAoKnAgIT0gJ1wwJykgeworCQkvKiBOTk4gZG9lcyBub3QgbG9vayBsaWtlIGEgbnVtYmVyICovCisJCXJlaXNlcmZzX3dhcm5pbmcgKHMsICJyZWlzZXJmc19wYXJzZV9vcHRpb25zOiBiYWQgdmFsdWUgJXMiLCBhcmcpOworCQlyZXR1cm4gMDsKKwkgICAgfQorCX0KKworCWlmICggYyA9PSAnYycgKSB7CisJCWNoYXIgKnAgPSBOVUxMOworCQl1bnNpZ25lZCBsb25nIHZhbCA9IHNpbXBsZV9zdHJ0b3VsIChhcmcsICZwLCAwKTsKKwkJLyogY29tbWl0PU5OTiAodGltZSBpbiBzZWNvbmRzKSAqLworCQlpZiAoICpwICE9ICdcMCcgfHwgdmFsID49ICh1bnNpZ25lZCBpbnQpLTEpIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcgKHMsICJyZWlzZXJmc19wYXJzZV9vcHRpb25zOiBiYWQgdmFsdWUgJXMiLCBhcmcpOwkJCXJldHVybiAwOworCQl9CisJCSpjb21taXRfbWF4X2FnZSA9ICh1bnNpZ25lZCBpbnQpdmFsOworCX0KKworCWlmICggYyA9PSAndycgKSB7CisJCWNoYXIgKnA9TlVMTDsKKwkJaW50IHZhbCA9IHNpbXBsZV9zdHJ0b3VsIChhcmcsICZwLCAwKTsKKworCQlpZiAoICpwICE9ICdcMCcpIHsKKwkJICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJyZWlzZXJmc19wYXJzZV9vcHRpb25zOiBub24tbnVtZXJpYyB2YWx1ZSAlcyBmb3Igbm9sYXJnZWlvIG9wdGlvbiIsIGFyZyk7CisJCSAgICByZXR1cm4gMDsKKwkJfQorCQlpZiAoIHZhbCApIAorCQkgICAgcmVpc2VyZnNfZGVmYXVsdF9pb19zaXplID0gUEFHRV9TSVpFOworCQllbHNlCisJCSAgICByZWlzZXJmc19kZWZhdWx0X2lvX3NpemUgPSAxMjggKiAxMDI0OworCX0KKworCWlmIChjID09ICdqJykgeworCSAgICBpZiAoYXJnICYmICphcmcgJiYgamRldl9uYW1lKSB7CisJCWlmICggKmpkZXZfbmFtZSApIHsgLy9IbSwgYWxyZWFkeSBhc3NpZ25lZD8KKwkJICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJyZWlzZXJmc19wYXJzZV9vcHRpb25zOiBqb3VybmFsIGRldmljZSB3YXMgYWxyZWFkeSAgc3BlY2lmaWVkIHRvIGJlICVzIiwgKmpkZXZfbmFtZSk7CisJCSAgICByZXR1cm4gMDsKKwkJfQorCQkqamRldl9uYW1lID0gYXJnOworCSAgICB9CisJfQorCisjaWZkZWYgQ09ORklHX1FVT1RBCisJaWYgKGMgPT0gJ3UnIHx8IGMgPT0gJ2cnKSB7CisJICAgIGludCBxdHlwZSA9IGMgPT0gJ3UnID8gVVNSUVVPVEEgOiBHUlBRVU9UQTsKKworCSAgICBpZiAoc2JfYW55X3F1b3RhX2VuYWJsZWQocykpIHsKKwkJcmVpc2VyZnNfd2FybmluZyhzLCAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogY2Fubm90IGNoYW5nZSBqb3VybmFsbGVkIHF1b3RhIG9wdGlvbnMgd2hlbiBxdW90YSB0dXJuZWQgb24uIik7CisJCXJldHVybiAwOworCSAgICB9CisJICAgIGlmICgqYXJnKSB7CS8qIFNvbWUgZmlsZW5hbWUgc3BlY2lmaWVkPyAqLworCSAgICAgICAgaWYgKFJFSVNFUkZTX1NCKHMpLT5zX3FmX25hbWVzW3F0eXBlXSAmJiBzdHJjbXAoUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbcXR5cGVdLCBhcmcpKSB7CisJCSAgICByZWlzZXJmc193YXJuaW5nKHMsICJyZWlzZXJmc19wYXJzZV9vcHRpb25zOiAlcyBxdW90YSBmaWxlIGFscmVhZHkgc3BlY2lmaWVkLiIsIFFUWVBFMk5BTUUocXR5cGUpKTsKKwkJICAgIHJldHVybiAwOworCQl9CisJCWlmIChzdHJjaHIoYXJnLCAnLycpKSB7CisJCSAgICByZWlzZXJmc193YXJuaW5nKHMsICJyZWlzZXJmc19wYXJzZV9vcHRpb25zOiBxdW90YWZpbGUgbXVzdCBiZSBvbiBmaWxlc3lzdGVtIHJvb3QuIik7CisJCSAgICByZXR1cm4gMDsKKwkJfQorCSAgICAJUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbcXR5cGVdID0ga21hbGxvYyhzdHJsZW4oYXJnKSsxLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1txdHlwZV0pIHsKKwkJICAgIHJlaXNlcmZzX3dhcm5pbmcocywgInJlaXNlcmZzX3BhcnNlX29wdGlvbnM6IG5vdCBlbm91Z2ggbWVtb3J5IGZvciBzdG9yaW5nIHF1b3RhZmlsZSBuYW1lLiIpOworCQkgICAgcmV0dXJuIDA7CisJCX0KKwkJc3RyY3B5KFJFSVNFUkZTX1NCKHMpLT5zX3FmX25hbWVzW3F0eXBlXSwgYXJnKTsKKwkgICAgfQorCSAgICBlbHNlIHsKKwkJaWYgKFJFSVNFUkZTX1NCKHMpLT5zX3FmX25hbWVzW3F0eXBlXSkgeworCQkgICAga2ZyZWUoUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbcXR5cGVdKTsKKwkJICAgIFJFSVNFUkZTX1NCKHMpLT5zX3FmX25hbWVzW3F0eXBlXSA9IE5VTEw7CisJCX0KKwkgICAgfQorCX0KKwlpZiAoYyA9PSAnZicpIHsKKwkgICAgaWYgKCFzdHJjbXAoYXJnLCAidmZzb2xkIikpCisJCVJFSVNFUkZTX1NCKHMpLT5zX2pxdW90YV9mbXQgPSBRRk1UX1ZGU19PTEQ7CisJICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJnLCAidmZzdjAiKSkKKwkJUkVJU0VSRlNfU0IocyktPnNfanF1b3RhX2ZtdCA9IFFGTVRfVkZTX1YwOworCSAgICBlbHNlIHsKKwkJcmVpc2VyZnNfd2FybmluZyhzLCAicmVpc2VyZnNfcGFyc2Vfb3B0aW9uczogdW5rbm93biBxdW90YSBmb3JtYXQgc3BlY2lmaWVkLiIpOworCQlyZXR1cm4gMDsKKwkgICAgfQorCX0KKyNlbHNlCisJaWYgKGMgPT0gJ3UnIHx8IGMgPT0gJ2cnIHx8IGMgPT0gJ2YnKSB7CisJICAgIHJlaXNlcmZzX3dhcm5pbmcocywgInJlaXNlcmZzX3BhcnNlX29wdGlvbnM6IGpvdXJuYWxsZWQgcXVvdGEgb3B0aW9ucyBub3Qgc3VwcG9ydGVkLiIpOworCSAgICByZXR1cm4gMDsKKwl9CisjZW5kaWYKKyAgICB9CisgICAgCisjaWZkZWYgQ09ORklHX1FVT1RBCisgICAgaWYgKCFSRUlTRVJGU19TQihzKS0+c19qcXVvdGFfZm10ICYmIChSRUlTRVJGU19TQihzKS0+c19xZl9uYW1lc1tVU1JRVU9UQV0gfHwgUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbR1JQUVVPVEFdKSkgeworCXJlaXNlcmZzX3dhcm5pbmcocywgInJlaXNlcmZzX3BhcnNlX29wdGlvbnM6IGpvdXJuYWxsZWQgcXVvdGEgZm9ybWF0IG5vdCBzcGVjaWZpZWQuIik7CisJcmV0dXJuIDA7CisgICAgfQorI2VuZGlmCisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHN3aXRjaF9kYXRhX21vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB1bnNpZ25lZCBsb25nIG1vZGUpIHsKKyAgICBSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgJj0gfigoMSA8PCBSRUlTRVJGU19EQVRBX0xPRykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgUkVJU0VSRlNfREFUQV9PUkRFUkVEKSB8CisJCQkJICAgICAgICgxIDw8IFJFSVNFUkZTX0RBVEFfV1JJVEVCQUNLKSk7CisgICAgUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0IHw9ICgxIDw8IG1vZGUpOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfZGF0YV9tb2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdW5zaWduZWQgbG9uZyBtb3VudF9vcHRpb25zKQoreworICAgIGlmIChtb3VudF9vcHRpb25zICYgKDEgPDwgUkVJU0VSRlNfREFUQV9MT0cpKSB7CisgICAgICAgIGlmICghcmVpc2VyZnNfZGF0YV9sb2cocykpIHsKKwkgICAgc3dpdGNoX2RhdGFfbW9kZShzLCBSRUlTRVJGU19EQVRBX0xPRyk7CisJICAgIHJlaXNlcmZzX2luZm8gKHMsICJzd2l0Y2hpbmcgdG8gam91cm5hbGVkIGRhdGEgbW9kZVxuIik7CisJfQorICAgIH0gZWxzZSBpZiAobW91bnRfb3B0aW9ucyAmICgxIDw8IFJFSVNFUkZTX0RBVEFfT1JERVJFRCkpIHsKKyAgICAgICAgaWYgKCFyZWlzZXJmc19kYXRhX29yZGVyZWQocykpIHsKKwkgICAgc3dpdGNoX2RhdGFfbW9kZShzLCBSRUlTRVJGU19EQVRBX09SREVSRUQpOworCSAgICByZWlzZXJmc19pbmZvIChzLCAic3dpdGNoaW5nIHRvIG9yZGVyZWQgZGF0YSBtb2RlXG4iKTsKKwl9CisgICAgfSBlbHNlIGlmIChtb3VudF9vcHRpb25zICYgKDEgPDwgUkVJU0VSRlNfREFUQV9XUklURUJBQ0spKSB7CisgICAgICAgIGlmICghcmVpc2VyZnNfZGF0YV93cml0ZWJhY2socykpIHsKKwkgICAgc3dpdGNoX2RhdGFfbW9kZShzLCBSRUlTRVJGU19EQVRBX1dSSVRFQkFDSyk7CisJICAgIHJlaXNlcmZzX2luZm8gKHMsICJzd2l0Y2hpbmcgdG8gd3JpdGViYWNrIGRhdGEgbW9kZVxuIik7CisJfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2JhcnJpZXJfbW9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMsIHVuc2lnbmVkIGxvbmcgYml0cykgeworICAgIGludCBmbHVzaCA9ICgxIDw8IFJFSVNFUkZTX0JBUlJJRVJfRkxVU0gpOworICAgIGludCBub25lID0gKDEgPDwgUkVJU0VSRlNfQkFSUklFUl9OT05FKTsKKyAgICBpbnQgYWxsX2JhcnJpZXIgPSBmbHVzaCB8IG5vbmU7CisKKyAgICBpZiAoYml0cyAmIGFsbF9iYXJyaWVyKSB7CisgICAgICAgIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCAmPSB+YWxsX2JhcnJpZXI7CisJaWYgKGJpdHMgJiBmbHVzaCkgeworCSAgICBSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgfD0gZmx1c2g7CisJICAgIHByaW50aygicmVpc2VyZnM6IGVuYWJsaW5nIHdyaXRlIGJhcnJpZXIgZmx1c2ggbW9kZVxuIik7CisJfSBlbHNlIGlmIChiaXRzICYgbm9uZSkgeworCSAgICBSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgfD0gbm9uZTsKKwkgICAgcHJpbnRrKCJyZWlzZXJmczogd3JpdGUgYmFycmllcnMgdHVybmVkIG9mZlxuIik7CisJfQorICAgfQorfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfYXR0cnMoIHN0cnVjdCBzdXBlcl9ibG9jayAqcyApCit7CisJc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICogcnM7CisKKwlpZiggcmVpc2VyZnNfYXR0cnMoIHMgKSApIHsKKwkJcnMgPSBTQl9ESVNLX1NVUEVSX0JMT0NLIChzKTsKKwkJaWYoIG9sZF9mb3JtYXRfb25seShzKSApIHsKKwkJCXJlaXNlcmZzX3dhcm5pbmcocywgInJlaXNlcmZzOiBjYW5ub3Qgc3VwcG9ydCBhdHRyaWJ1dGVzIG9uIDMuNS54IGRpc2sgZm9ybWF0IiApOworCQkJUkVJU0VSRlNfU0IocykgLT4gc19tb3VudF9vcHQgJj0gfiAoIDEgPDwgUkVJU0VSRlNfQVRUUlMgKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiggISggbGUzMl90b19jcHUoIHJzIC0+IHNfZmxhZ3MgKSAmIHJlaXNlcmZzX2F0dHJzX2NsZWFyZWQgKSApIHsKKwkJCQlyZWlzZXJmc193YXJuaW5nKHMsICJyZWlzZXJmczogY2Fubm90IHN1cHBvcnQgYXR0cmlidXRlcyB1bnRpbCBmbGFnIGlzIHNldCBpbiBzdXBlci1ibG9jayIgKTsKKwkJCQlSRUlTRVJGU19TQihzKSAtPiBzX21vdW50X29wdCAmPSB+ICggMSA8PCBSRUlTRVJGU19BVFRSUyApOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IHJlaXNlcmZzX3JlbW91bnQgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIGludCAqIG1vdW50X2ZsYWdzLCBjaGFyICogYXJnKQoreworICBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiByczsKKyAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7CisgIHVuc2lnbmVkIGxvbmcgYmxvY2tzOworICB1bnNpZ25lZCBsb25nIG1vdW50X29wdGlvbnMgPSBSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQ7CisgIHVuc2lnbmVkIGxvbmcgc2FmZV9tYXNrID0gMDsKKyAgdW5zaWduZWQgaW50IGNvbW1pdF9tYXhfYWdlID0gKHVuc2lnbmVkIGludCktMTsKKyAgc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmpvdXJuYWwgPSBTQl9KT1VSTkFMKHMpOworICBpbnQgZXJyOworI2lmZGVmIENPTkZJR19RVU9UQQorICBpbnQgaTsKKyNlbmRpZgorCisgIHJzID0gU0JfRElTS19TVVBFUl9CTE9DSyAocyk7CisKKyAgaWYgKCFyZWlzZXJmc19wYXJzZV9vcHRpb25zKHMsIGFyZywgJm1vdW50X29wdGlvbnMsICZibG9ja3MsIE5VTEwsICZjb21taXRfbWF4X2FnZSkpIHsKKyNpZmRlZiBDT05GSUdfUVVPVEEKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYUVVPVEFTOyBpKyspCisJaWYgKFJFSVNFUkZTX1NCKHMpLT5zX3FmX25hbWVzW2ldKSB7CisJICAgIGtmcmVlKFJFSVNFUkZTX1NCKHMpLT5zX3FmX25hbWVzW2ldKTsKKwkgICAgUkVJU0VSRlNfU0IocyktPnNfcWZfbmFtZXNbaV0gPSBOVUxMOworCX0KKyNlbmRpZgorICAgIHJldHVybiAtRUlOVkFMOworICB9CisgIAorICBoYW5kbGVfYXR0cnMocyk7CisKKyAgLyogQWRkIG9wdGlvbnMgdGhhdCBhcmUgc2FmZSBoZXJlICovCisgIHNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX1NNQUxMVEFJTDsKKyAgc2FmZV9tYXNrIHw9IDEgPDwgUkVJU0VSRlNfTEFSR0VUQUlMOworICBzYWZlX21hc2sgfD0gMSA8PCBSRUlTRVJGU19OT19CT1JERVI7CisgIHNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX05PX1VOSEFTSEVEX1JFTE9DQVRJT047CisgIHNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX0hBU0hFRF9SRUxPQ0FUSU9OOworICBzYWZlX21hc2sgfD0gMSA8PCBSRUlTRVJGU19URVNUNDsKKyAgc2FmZV9tYXNrIHw9IDEgPDwgUkVJU0VSRlNfQVRUUlM7CisgIHNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX1hBVFRSU19VU0VSOworICBzYWZlX21hc2sgfD0gMSA8PCBSRUlTRVJGU19QT1NJWEFDTDsKKyAgc2FmZV9tYXNrIHw9IDEgPDwgUkVJU0VSRlNfQkFSUklFUl9GTFVTSDsKKyAgc2FmZV9tYXNrIHw9IDEgPDwgUkVJU0VSRlNfQkFSUklFUl9OT05FOworICBzYWZlX21hc2sgfD0gMSA8PCBSRUlTRVJGU19FUlJPUl9STzsKKyAgc2FmZV9tYXNrIHw9IDEgPDwgUkVJU0VSRlNfRVJST1JfQ09OVElOVUU7CisgIHNhZmVfbWFzayB8PSAxIDw8IFJFSVNFUkZTX0VSUk9SX1BBTklDOworCisgIC8qIFVwZGF0ZSB0aGUgYml0bWFzaywgdGFraW5nIGNhcmUgdG8ga2VlcAorICAgKiB0aGUgYml0cyB3ZSdyZSBub3QgYWxsb3dlZCB0byBjaGFuZ2UgaGVyZSAqLworICBSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQgPSAoUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0ICYgfnNhZmVfbWFzaykgfCAgKG1vdW50X29wdGlvbnMgJiBzYWZlX21hc2spOworCisgIGlmKGNvbW1pdF9tYXhfYWdlICE9IDAgJiYgY29tbWl0X21heF9hZ2UgIT0gKHVuc2lnbmVkIGludCktMSkgeworICAgIGpvdXJuYWwtPmpfbWF4X2NvbW1pdF9hZ2UgPSBjb21taXRfbWF4X2FnZTsKKyAgICBqb3VybmFsLT5qX21heF90cmFuc19hZ2UgPSBjb21taXRfbWF4X2FnZTsKKyAgfQorICBlbHNlIGlmKGNvbW1pdF9tYXhfYWdlID09IDApCisgIHsKKyAgICAvKiAwIG1lYW5zIHJlc3RvcmUgZGVmYXVsdHMuICovCisgICAgam91cm5hbC0+al9tYXhfY29tbWl0X2FnZSA9IGpvdXJuYWwtPmpfZGVmYXVsdF9tYXhfY29tbWl0X2FnZTsKKyAgICBqb3VybmFsLT5qX21heF90cmFuc19hZ2UgPSBKT1VSTkFMX01BWF9UUkFOU19BR0U7CisgIH0KKworICBpZihibG9ja3MpIHsKKyAgICBpbnQgcmMgPSByZWlzZXJmc19yZXNpemUocywgYmxvY2tzKTsKKyAgICBpZiAocmMgIT0gMCkKKyAgICAgIHJldHVybiByYzsKKyAgfQorCisgIGlmICgqbW91bnRfZmxhZ3MgJiBNU19SRE9OTFkpIHsKKyAgICByZWlzZXJmc194YXR0cl9pbml0IChzLCAqbW91bnRfZmxhZ3MpOworICAgIC8qIHJlbW91bnQgcmVhZC1vbmx5ICovCisgICAgaWYgKHMtPnNfZmxhZ3MgJiBNU19SRE9OTFkpCisgICAgICAvKiBpdCBpcyByZWFkLW9ubHkgYWxyZWFkeSAqLworICAgICAgcmV0dXJuIDA7CisgICAgLyogdHJ5IHRvIHJlbW91bnQgZmlsZSBzeXN0ZW0gd2l0aCByZWFkLW9ubHkgcGVybWlzc2lvbnMgKi8KKyAgICBpZiAoc2JfdW1vdW50X3N0YXRlKHJzKSA9PSBSRUlTRVJGU19WQUxJRF9GUyB8fCBSRUlTRVJGU19TQihzKS0+c19tb3VudF9zdGF0ZSAhPSBSRUlTRVJGU19WQUxJRF9GUykgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZXJyID0gam91cm5hbF9iZWdpbigmdGgsIHMsIDEwKSA7CisgICAgaWYgKGVycikKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIC8qIE1vdW50aW5nIGEgcncgcGFydGl0aW9uIHJlYWQtb25seS4gKi8KKyAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpLCAxKSA7CisgICAgc2V0X3NiX3Vtb3VudF9zdGF0ZSggcnMsIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X3N0YXRlICk7CisgICAgam91cm5hbF9tYXJrX2RpcnR5KCZ0aCwgcywgU0JfQlVGRkVSX1dJVEhfU0IgKHMpKTsKKyAgfSBlbHNlIHsKKyAgICAvKiByZW1vdW50IHJlYWQtd3JpdGUgKi8KKyAgICBpZiAoIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCXJlaXNlcmZzX3hhdHRyX2luaXQgKHMsICptb3VudF9mbGFncyk7CisJcmV0dXJuIDA7IC8qIFdlIGFyZSByZWFkLXdyaXRlIGFscmVhZHkgKi8KKyAgICB9CisKKyAgICBpZiAocmVpc2VyZnNfaXNfam91cm5hbF9hYm9ydGVkIChqb3VybmFsKSkKKwlyZXR1cm4gam91cm5hbC0+al9lcnJubzsKKworICAgIGhhbmRsZV9kYXRhX21vZGUocywgbW91bnRfb3B0aW9ucyk7CisgICAgaGFuZGxlX2JhcnJpZXJfbW9kZShzLCBtb3VudF9vcHRpb25zKTsKKyAgICBSRUlTRVJGU19TQihzKS0+c19tb3VudF9zdGF0ZSA9IHNiX3Vtb3VudF9zdGF0ZShycykgOworICAgIHMtPnNfZmxhZ3MgJj0gfk1TX1JET05MWSA7IC8qIG5vdyBpdCBpcyBzYWZlIHRvIGNhbGwgam91cm5hbF9iZWdpbiAqLworICAgIGVyciA9IGpvdXJuYWxfYmVnaW4oJnRoLCBzLCAxMCkgOworICAgIGlmIChlcnIpCisJcmV0dXJuIGVycjsKKyAgICAKKyAgICAvKiBNb3VudCBhIHBhcnRpdGlvbiB3aGljaCBpcyByZWFkLW9ubHksIHJlYWQtd3JpdGUgKi8KKyAgICByZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHMsIFNCX0JVRkZFUl9XSVRIX1NCKHMpLCAxKSA7CisgICAgUkVJU0VSRlNfU0IocyktPnNfbW91bnRfc3RhdGUgPSBzYl91bW91bnRfc3RhdGUocnMpOworICAgIHMtPnNfZmxhZ3MgJj0gfk1TX1JET05MWTsKKyAgICBzZXRfc2JfdW1vdW50X3N0YXRlKCBycywgUkVJU0VSRlNfRVJST1JfRlMgKTsKKyAgICAvKiBtYXJrX2J1ZmZlcl9kaXJ0eSAoU0JfQlVGRkVSX1dJVEhfU0IgKHMpLCAxKTsgKi8KKyAgICBqb3VybmFsX21hcmtfZGlydHkoJnRoLCBzLCBTQl9CVUZGRVJfV0lUSF9TQiAocykpOworICAgIFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X3N0YXRlID0gUkVJU0VSRlNfVkFMSURfRlMgOworICB9CisgIC8qIHRoaXMgd2lsbCBmb3JjZSBhIGZ1bGwgZmx1c2ggb2YgYWxsIGpvdXJuYWwgbGlzdHMgKi8KKyAgU0JfSk9VUk5BTChzKS0+al9tdXN0X3dhaXQgPSAxIDsKKyAgZXJyID0gam91cm5hbF9lbmQoJnRoLCBzLCAxMCkgOworICBpZiAoZXJyKQorICAgIHJldHVybiBlcnI7CisgIHMtPnNfZGlydCA9IDA7CisKKyAgaWYgKCEoICptb3VudF9mbGFncyAmIE1TX1JET05MWSApICkgeworICAgIGZpbmlzaF91bmZpbmlzaGVkKCBzICk7CisgICAgcmVpc2VyZnNfeGF0dHJfaW5pdCAocywgKm1vdW50X2ZsYWdzKTsKKyAgfQorCisgIHJldHVybiAwOworfQorCisvKiBsb2FkX2JpdG1hcF9pbmZvX2RhdGEgLSBTZXRzIHVwIHRoZSByZWlzZXJmc19iaXRtYXBfaW5mbyBzdHJ1Y3R1cmUgZnJvbSBkaXNrLgorICogQHNiIC0gc3VwZXJibG9jayBmb3IgdGhpcyBmaWxlc3lzdGVtCisgKiBAYmkgLSB0aGUgYml0bWFwIGluZm8gdG8gYmUgbG9hZGVkLiBSZXF1aXJlcyB0aGF0IGJpLT5iaCBpcyB2YWxpZC4KKyAqCisgKiBUaGlzIHJvdXRpbmUgY291bnRzIGhvdyBtYW55IGZyZWUgYml0cyB0aGVyZSBhcmUsIGZpbmRpbmcgdGhlIGZpcnN0IHplcm8KKyAqIGFzIGEgc2lkZSBlZmZlY3QuIENvdWxkIGFsc28gYmUgaW1wbGVtZW50ZWQgYXMgYSBsb29wIG9mIHRlc3RfYml0KCkgY2FsbHMsIG9yCisgKiBhIGxvb3Agb2YgZmluZF9maXJzdF96ZXJvX2JpdCgpIGNhbGxzLiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHNpbWlsYXIgdG8KKyAqIGZpbmRfZmlyc3RfemVyb19iaXQoKSwgYnV0IGRvZXNuJ3QgcmV0dXJuIGFmdGVyIGl0IGZpbmRzIHRoZSBmaXJzdCBiaXQuCisgKiBTaG91bGQgb25seSBiZSBjYWxsZWQgb24gZnMgbW91bnQsIGJ1dCBzaG91bGQgYmUgZmFpcmx5IGVmZmljaWVudCBhbnl3YXlzLgorICoKKyAqIGJpLT5maXJzdF96ZXJvX2hpbnQgaXMgY29uc2lkZXJlZCB1bnNldCBpZiBpdCA9PSAwLCBzaW5jZSB0aGUgYml0bWFwIGl0c2VsZgorICogd2lsbCAqIGludmFyaWFibHkgb2NjdXB0IGJsb2NrIDAgcmVwcmVzZW50ZWQgaW4gdGhlIGJpdG1hcC4gVGhlIG9ubHkKKyAqIGV4Y2VwdGlvbiB0byB0aGlzIGlzIHdoZW4gZnJlZV9jb3VudCBhbHNvID09IDAsIHNpbmNlIHRoZXJlIHdpbGwgYmUgbm8KKyAqIGZyZWUgYmxvY2tzIGF0IGFsbC4KKyAqLworCitzdGF0aWMgdm9pZCBsb2FkX2JpdG1hcF9pbmZvX2RhdGEgKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCByZWlzZXJmc19iaXRtYXBfaW5mbyAqYmkpCit7CisgICAgdW5zaWduZWQgbG9uZyAqY3VyID0gKHVuc2lnbmVkIGxvbmcgKiliaS0+YmgtPmJfZGF0YTsKKworICAgIHdoaWxlICgoY2hhciAqKWN1ciA8IChiaS0+YmgtPmJfZGF0YSArIHNiLT5zX2Jsb2Nrc2l6ZSkpIHsKKworCS8qIE5vIG5lZWQgdG8gc2NhbiBpZiBhbGwgMCdzIG9yIGFsbCAxJ3MuCisJICogU2luY2Ugd2UncmUgb25seSBjb3VudGluZyAwJ3MsIHdlIGNhbiBzaW1wbHkgaWdub3JlIGFsbCAxJ3MgKi8KKwlpZiAoKmN1ciA9PSAwKSB7CisJICAgIGlmIChiaS0+Zmlyc3RfemVyb19oaW50ID09IDApIHsKKwkJYmktPmZpcnN0X3plcm9faGludCA9ICgoY2hhciAqKWN1ciAtIGJpLT5iaC0+Yl9kYXRhKSA8PCAzOworCSAgICB9CisJICAgIGJpLT5mcmVlX2NvdW50ICs9IHNpemVvZih1bnNpZ25lZCBsb25nKSo4OworCX0gZWxzZSBpZiAoKmN1ciAhPSB+MEwpIHsKKwkgICAgaW50IGI7CisJICAgIGZvciAoYiA9IDA7IGIgPCBzaXplb2YodW5zaWduZWQgbG9uZykqODsgYisrKSB7CisJCWlmICghcmVpc2VyZnNfdGVzdF9sZV9iaXQgKGIsIGN1cikpIHsKKwkJICAgIGJpLT5mcmVlX2NvdW50ICsrOworCQkgICAgaWYgKGJpLT5maXJzdF96ZXJvX2hpbnQgPT0gMCkKKwkJCWJpLT5maXJzdF96ZXJvX2hpbnQgPQorCQkJCQkoKChjaGFyICopY3VyIC0gYmktPmJoLT5iX2RhdGEpIDw8IDMpICsgYjsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJY3VyICsrOworICAgIH0KKworI2lmZGVmIENPTkZJR19SRUlTRVJGU19DSEVDSworLy8gVGhpcyBvdXRwdXRzIGEgbG90IG9mIHVubmVkZWQgaW5mbyBvbiBiaWcgRlNlcworLy8gICAgcmVpc2VyZnNfd2FybmluZyAoImJpdG1hcCBsb2FkZWQgZnJvbSBibG9jayAlZDogJWQgZnJlZSBibG9ja3MiLAorLy8JCSAgICAgIGJpLT5iaC0+Yl9ibG9ja25yLCBiaS0+ZnJlZV9jb3VudCk7CisjZW5kaWYKK30KKyAgCitzdGF0aWMgaW50IHJlYWRfYml0bWFwcyAoc3RydWN0IHN1cGVyX2Jsb2NrICogcykKK3sKKyAgICBpbnQgaSwgYm1hcF9ucjsKKworICAgIFNCX0FQX0JJVE1BUCAocykgPSB2bWFsbG9jIChzaXplb2YgKHN0cnVjdCByZWlzZXJmc19iaXRtYXBfaW5mbykgKiBTQl9CTUFQX05SKHMpKTsKKyAgICBpZiAoU0JfQVBfQklUTUFQIChzKSA9PSAwKQorCXJldHVybiAxOworICAgIG1lbXNldCAoU0JfQVBfQklUTUFQIChzKSwgMCwgc2l6ZW9mIChzdHJ1Y3QgcmVpc2VyZnNfYml0bWFwX2luZm8pICogU0JfQk1BUF9OUihzKSk7CisgICAgZm9yIChpID0gMCwgYm1hcF9uciA9IFJFSVNFUkZTX0RJU0tfT0ZGU0VUX0lOX0JZVEVTIC8gcy0+c19ibG9ja3NpemUgKyAxOworCSBpIDwgU0JfQk1BUF9OUihzKTsgaSsrLCBibWFwX25yID0gcy0+c19ibG9ja3NpemUgKiA4ICogaSkgeworCVNCX0FQX0JJVE1BUCAocylbaV0uYmggPSBzYl9nZXRibGsocywgYm1hcF9ucik7CisJaWYgKCFidWZmZXJfdXB0b2RhdGUoU0JfQVBfQklUTUFQKHMpW2ldLmJoKSkKKwkgICAgbGxfcndfYmxvY2soUkVBRCwgMSwgJlNCX0FQX0JJVE1BUChzKVtpXS5iaCk7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBTQl9CTUFQX05SKHMpOyBpKyspIHsKKwl3YWl0X29uX2J1ZmZlcihTQl9BUF9CSVRNQVAgKHMpW2ldLmJoKTsKKwlpZiAoIWJ1ZmZlcl91cHRvZGF0ZShTQl9BUF9CSVRNQVAocylbaV0uYmgpKSB7CisJICAgIHJlaXNlcmZzX3dhcm5pbmcocywic2gtMjAyOTogcmVpc2VyZnMgcmVhZF9iaXRtYXBzOiAiCisJCQkgImJpdG1hcCBibG9jayAoIyVsdSkgcmVhZGluZyBmYWlsZWQiLAorCQkJIFNCX0FQX0JJVE1BUChzKVtpXS5iaC0+Yl9ibG9ja25yKTsKKwkgICAgZm9yIChpID0gMDsgaSA8IFNCX0JNQVBfTlIocyk7IGkrKykKKwkJYnJlbHNlKFNCX0FQX0JJVE1BUChzKVtpXS5iaCk7CisJICAgIHZmcmVlKFNCX0FQX0JJVE1BUChzKSk7CisJICAgIFNCX0FQX0JJVE1BUChzKSA9IE5VTEw7CisJICAgIHJldHVybiAxOworCX0KKwlsb2FkX2JpdG1hcF9pbmZvX2RhdGEgKHMsIFNCX0FQX0JJVE1BUCAocykgKyBpKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9vbGRfYml0bWFwcyAoc3RydWN0IHN1cGVyX2Jsb2NrICogcykKK3sKKyAgaW50IGkgOworICBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiBycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0socyk7CisgIGludCBibXAxID0gKFJFSVNFUkZTX09MRF9ESVNLX09GRlNFVF9JTl9CWVRFUyAvIHMtPnNfYmxvY2tzaXplKSArIDE7ICAvKiBmaXJzdCBvZiBiaXRtYXAgYmxvY2tzICovCisKKyAgLyogcmVhZCB0cnVlIGJpdG1hcCAqLworICBTQl9BUF9CSVRNQVAgKHMpID0gdm1hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgcmVpc2VyZnNfYnVmZmVyX2luZm8gKikgKiBzYl9ibWFwX25yKHJzKSk7CisgIGlmIChTQl9BUF9CSVRNQVAgKHMpID09IDApCisgICAgcmV0dXJuIDE7CisKKyAgbWVtc2V0IChTQl9BUF9CSVRNQVAgKHMpLCAwLCBzaXplb2YgKHN0cnVjdCByZWlzZXJmc19idWZmZXJfaW5mbyAqKSAqIHNiX2JtYXBfbnIocnMpKTsKKworICBmb3IgKGkgPSAwOyBpIDwgc2JfYm1hcF9ucihycyk7IGkgKyspIHsKKyAgICBTQl9BUF9CSVRNQVAgKHMpW2ldLmJoID0gc2JfYnJlYWQgKHMsIGJtcDEgKyBpKTsKKyAgICBpZiAoIVNCX0FQX0JJVE1BUCAocylbaV0uYmgpCisgICAgICByZXR1cm4gMTsKKyAgICBsb2FkX2JpdG1hcF9pbmZvX2RhdGEgKHMsIFNCX0FQX0JJVE1BUCAocykgKyBpKTsKKyAgfQorCisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfc3VwZXJfYmxvY2sgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIGludCBvZmZzZXQpCit7CisgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisgICAgc3RydWN0IHJlaXNlcmZzX3N1cGVyX2Jsb2NrICogcnM7CisgICAgaW50IGZzX2Jsb2Nrc2l6ZTsKKyAKKworICAgIGJoID0gc2JfYnJlYWQgKHMsIG9mZnNldCAvIHMtPnNfYmxvY2tzaXplKTsKKyAgICBpZiAoIWJoKSB7CisgICAgICByZWlzZXJmc193YXJuaW5nIChzLCAic2gtMjAwNjogcmVhZF9zdXBlcl9ibG9jazogIgorICAgICAgICAgICAgICAiYnJlYWQgZmFpbGVkIChkZXYgJXMsIGJsb2NrICVsdSwgc2l6ZSAlbHUpIiwKKyAgICAgICAgICAgICAgcmVpc2VyZnNfYmRldm5hbWUgKHMpLCBvZmZzZXQgLyBzLT5zX2Jsb2Nrc2l6ZSwgcy0+c19ibG9ja3NpemUpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorIAorICAgIHJzID0gKHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqKWJoLT5iX2RhdGE7CisgICAgaWYgKCFpc19hbnlfcmVpc2VyZnNfbWFnaWNfc3RyaW5nIChycykpIHsKKyAgICAgIGJyZWxzZSAoYmgpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorIAorICAgIC8vCisgICAgLy8gb2ssIHJlaXNlcmZzIHNpZ25hdHVyZSAob2xkIG9yIG5ldykgZm91bmQgaW4gYXQgdGhlIGdpdmVuIG9mZnNldAorICAgIC8vICAgIAorICAgIGZzX2Jsb2Nrc2l6ZSA9IHNiX2Jsb2Nrc2l6ZShycyk7CisgICAgYnJlbHNlIChiaCk7CisgICAgc2Jfc2V0X2Jsb2Nrc2l6ZSAocywgZnNfYmxvY2tzaXplKTsKKyAgICAKKyAgICBiaCA9IHNiX2JyZWFkIChzLCBvZmZzZXQgLyBzLT5zX2Jsb2Nrc2l6ZSk7CisgICAgaWYgKCFiaCkgeworCXJlaXNlcmZzX3dhcm5pbmcgKHMsICJzaC0yMDA3OiByZWFkX3N1cGVyX2Jsb2NrOiAiCisgICAgICAgICAgICAgICAgImJyZWFkIGZhaWxlZCAoZGV2ICVzLCBibG9jayAlbHUsIHNpemUgJWx1KVxuIiwKKyAgICAgICAgICAgICAgICByZWlzZXJmc19iZGV2bmFtZSAocyksIG9mZnNldCAvIHMtPnNfYmxvY2tzaXplLCBzLT5zX2Jsb2Nrc2l6ZSk7CisJcmV0dXJuIDE7CisgICAgfQorICAgIAorICAgIHJzID0gKHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqKWJoLT5iX2RhdGE7CisgICAgaWYgKHNiX2Jsb2Nrc2l6ZShycykgIT0gcy0+c19ibG9ja3NpemUpIHsKKwlyZWlzZXJmc193YXJuaW5nIChzLCAic2gtMjAxMTogcmVhZF9zdXBlcl9ibG9jazogIgorCQkiY2FuJ3QgZmluZCBhIHJlaXNlcmZzIGZpbGVzeXN0ZW0gb24gKGRldiAlcywgYmxvY2sgJUx1LCBzaXplICVsdSlcbiIsCisJCXJlaXNlcmZzX2JkZXZuYW1lIChzKSwgKHVuc2lnbmVkIGxvbmcgbG9uZyliaC0+Yl9ibG9ja25yLCBzLT5zX2Jsb2Nrc2l6ZSk7CisJYnJlbHNlIChiaCk7CisJcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKCBycy0+c192MS5zX3Jvb3RfYmxvY2sgPT0gLTEgKSB7CisgICAgICAgYnJlbHNlKGJoKSA7CisgICAgICAgcmVpc2VyZnNfd2FybmluZyAocywgIlVuZmluaXNoZWQgcmVpc2VyZnNjayAtLXJlYnVpbGQtdHJlZSBydW4gZGV0ZWN0ZWQuIFBsZWFzZSBydW5cbiIKKyAgICAgICAgICAgICAgInJlaXNlcmZzY2sgLS1yZWJ1aWxkLXRyZWUgYW5kIHdhaXQgZm9yIGEgY29tcGxldGlvbi4gSWYgdGhhdCBmYWlsc1xuIgorICAgICAgICAgICAgICAiZ2V0IG5ld2VyIHJlaXNlcmZzcHJvZ3MgcGFja2FnZSIpOworICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIFNCX0JVRkZFUl9XSVRIX1NCIChzKSA9IGJoOworICAgIFNCX0RJU0tfU1VQRVJfQkxPQ0sgKHMpID0gcnM7CisKKyAgICBpZiAoaXNfcmVpc2VyZnNfanIgKHJzKSkgeworCS8qIG1hZ2ljIGlzIG9mIG5vbi1zdGFuZGFyZCBqb3VybmFsIGZpbGVzeXN0ZW0sIGxvb2sgYXQgc192ZXJzaW9uIHRvCisJICAgZmluZCB3aGljaCBmb3JtYXQgaXMgaW4gdXNlICovCisJaWYgKHNiX3ZlcnNpb24ocnMpID09IFJFSVNFUkZTX1ZFUlNJT05fMikKKwkgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJyZWFkX3N1cGVyX2Jsb2NrOiBmb3VuZCByZWlzZXJmcyBmb3JtYXQgXCIzLjZcIiIKKwkJICAiIHdpdGggbm9uLXN0YW5kYXJkIGpvdXJuYWwiKTsKKwllbHNlIGlmIChzYl92ZXJzaW9uKHJzKSA9PSBSRUlTRVJGU19WRVJTSU9OXzEpCisJICByZWlzZXJmc193YXJuaW5nIChzLCAicmVhZF9zdXBlcl9ibG9jazogZm91bmQgcmVpc2VyZnMgZm9ybWF0IFwiMy41XCIiCisJCSAgIiB3aXRoIG5vbi1zdGFuZGFyZCBqb3VybmFsIik7CisJZWxzZSB7CisJICByZWlzZXJmc193YXJuaW5nIChzLCAic2gtMjAxMjogcmVhZF9zdXBlcl9ibG9jazogZm91bmQgdW5rbm93biAiCisJCQkgICAgImZvcm1hdCBcIiV1XCIgb2YgcmVpc2VyZnMgd2l0aCBub24tc3RhbmRhcmQgbWFnaWMiLAorCQkJICAgIHNiX3ZlcnNpb24ocnMpKTsKKwlyZXR1cm4gMTsKKwl9CisgICAgfQorICAgIGVsc2UKKyAgICAgIC8qIHNfdmVyc2lvbiBvZiBzdGFuZGFyZCBmb3JtYXQgbWF5IGNvbnRhaW4gaW5jb3JyZWN0IGluZm9ybWF0aW9uLAorCSBzbyB3ZSBqdXN0IGxvb2sgYXQgdGhlIG1hZ2ljIHN0cmluZyAqLworICAgICAgcmVpc2VyZnNfaW5mbyAocywgImZvdW5kIHJlaXNlcmZzIGZvcm1hdCBcIiVzXCIgd2l0aCBzdGFuZGFyZCBqb3VybmFsXG4iLAorCSAgICAgIGlzX3JlaXNlcmZzXzNfNSAocnMpID8gIjMuNSIgOiAiMy42Iik7CisKKyAgICBzLT5zX29wID0gJnJlaXNlcmZzX3NvcHM7CisgICAgcy0+c19leHBvcnRfb3AgPSAmcmVpc2VyZnNfZXhwb3J0X29wczsKKyNpZmRlZiBDT05GSUdfUVVPVEEKKyAgICBzLT5zX3Fjb3AgPSAmcmVpc2VyZnNfcWN0bF9vcGVyYXRpb25zOworICAgIHMtPmRxX29wID0gJnJlaXNlcmZzX3F1b3RhX29wZXJhdGlvbnM7CisjZW5kaWYKKworICAgIC8qIG5ldyBmb3JtYXQgaXMgbGltaXRlZCBieSB0aGUgMzIgYml0IHdpZGUgaV9ibG9ja3MgZmllbGQsIHdhbnQgdG8KKyAgICAqKiBiZSBvbmUgZnVsbCBibG9jayBiZWxvdyB0aGF0LgorICAgICovCisgICAgcy0+c19tYXhieXRlcyA9ICg1MTJMTCA8PCAzMikgLSBzLT5zX2Jsb2Nrc2l6ZSA7CisgICAgcmV0dXJuIDA7Cit9CisKKworCisvKiBhZnRlciBqb3VybmFsIHJlcGxheSwgcmVyZWFkIGFsbCBiaXRtYXAgYW5kIHN1cGVyIGJsb2NrcyAqLworc3RhdGljIGludCByZXJlYWRfbWV0YV9ibG9ja3Moc3RydWN0IHN1cGVyX2Jsb2NrICpzKSB7CisgIGludCBpIDsKKyAgbGxfcndfYmxvY2soUkVBRCwgMSwgJihTQl9CVUZGRVJfV0lUSF9TQihzKSkpIDsKKyAgd2FpdF9vbl9idWZmZXIoU0JfQlVGRkVSX1dJVEhfU0IocykpIDsKKyAgaWYgKCFidWZmZXJfdXB0b2RhdGUoU0JfQlVGRkVSX1dJVEhfU0IocykpKSB7CisgICAgcmVpc2VyZnNfd2FybmluZyAocywgInJlcmVhZF9tZXRhX2Jsb2NrcywgZXJyb3IgcmVhZGluZyB0aGUgc3VwZXIiKSA7CisgICAgcmV0dXJuIDEgOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IFNCX0JNQVBfTlIocykgOyBpKyspIHsKKyAgICBsbF9yd19ibG9jayhSRUFELCAxLCAmKFNCX0FQX0JJVE1BUChzKVtpXS5iaCkpIDsKKyAgICB3YWl0X29uX2J1ZmZlcihTQl9BUF9CSVRNQVAocylbaV0uYmgpIDsKKyAgICBpZiAoIWJ1ZmZlcl91cHRvZGF0ZShTQl9BUF9CSVRNQVAocylbaV0uYmgpKSB7CisgICAgICByZWlzZXJmc193YXJuaW5nIChzLCAicmVyZWFkX21ldGFfYmxvY2tzLCBlcnJvciByZWFkaW5nIGJpdG1hcCBibG9jayBudW1iZXIgJWQgYXQgJWxsdSIsCisgICAgICAgIGksICh1bnNpZ25lZCBsb25nIGxvbmcpU0JfQVBfQklUTUFQKHMpW2ldLmJoLT5iX2Jsb2NrbnIpIDsKKyAgICAgIHJldHVybiAxIDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDAgOworCit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIGhhc2ggZGV0ZWN0aW9uIHN0dWZmCisKKworLy8gaWYgcm9vdCBkaXJlY3RvcnkgaXMgZW1wdHkgLSB3ZSBzZXQgZGVmYXVsdCAtIFl1cmEncyAtIGhhc2ggYW5kCisvLyB3YXJuIGFib3V0IGl0CisvLyBGSVhNRTogd2UgbG9vayBmb3Igb25seSBvbmUgbmFtZSBpbiBhIGRpcmVjdG9yeS4gSWYgdGVhIGFuZCB5dXJhCisvLyBiaXRoIGhhdmUgdGhlIHNhbWUgdmFsdWUgLSB3ZSBhc2sgdXNlciB0byBzZW5kIHJlcG9ydCB0byB0aGUKKy8vIG1haWxpbmcgbGlzdAorc3RhdGljIF9fdTMyIGZpbmRfaGFzaF9vdXQgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMpCit7CisgICAgaW50IHJldHZhbDsKKyAgICBzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKyAgICBzdHJ1Y3QgY3B1X2tleSBrZXk7CisgICAgSU5JVElBTElaRV9QQVRIIChwYXRoKTsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfZGlyX2VudHJ5IGRlOworICAgIF9fdTMyIGhhc2ggPSBERUZBVUxUX0hBU0g7CisKKyAgICBpbm9kZSA9IHMtPnNfcm9vdC0+ZF9pbm9kZTsKKworICAgIGRvIHsgLy8gU29tZSBzZXJpb3VzICJnb3RvIi1oYXRlciB3YXMgdGhlcmUgOykKKwl1MzIgdGVhaGFzaCwgcjVoYXNoLCB5dXJhaGFzaDsKKworCW1ha2VfY3B1X2tleSAoJmtleSwgaW5vZGUsIH4wLCBUWVBFX0RJUkVOVFJZLCAzKTsKKwlyZXR2YWwgPSBzZWFyY2hfYnlfZW50cnlfa2V5IChzLCAma2V5LCAmcGF0aCwgJmRlKTsKKwlpZiAocmV0dmFsID09IElPX0VSUk9SKSB7CisJICAgIHBhdGhyZWxzZSAoJnBhdGgpOworCSAgICByZXR1cm4gVU5TRVRfSEFTSCA7CisJfQorCWlmIChyZXR2YWwgPT0gTkFNRV9OT1RfRk9VTkQpCisJICAgIGRlLmRlX2VudHJ5X251bSAtLTsKKwlzZXRfZGVfbmFtZV9hbmRfbmFtZWxlbiAoJmRlKTsKKwlpZiAoZGVoX29mZnNldCggJihkZS5kZV9kZWhbZGUuZGVfZW50cnlfbnVtXSkgKSA9PSBET1RfRE9UX09GRlNFVCkgeworCSAgICAvKiBhbGxvdyBvdmVycmlkZSBpbiB0aGlzIGNhc2UgKi8KKwkgICAgaWYgKHJlaXNlcmZzX3J1cGFzb3ZfaGFzaChzKSkgeworCQloYXNoID0gWVVSQV9IQVNIIDsKKwkgICAgfQorCSAgICByZWlzZXJmc193YXJuaW5nKHMsIkZTIHNlZW1zIHRvIGJlIGVtcHR5LCBhdXRvZGV0ZWN0ICIKKwkgICAgICAgICAgICAgICAgICAgICAiaXMgdXNpbmcgdGhlIGRlZmF1bHQgaGFzaCIpOworCSAgICBicmVhazsKKwl9CisJcjVoYXNoPUdFVF9IQVNIX1ZBTFVFIChyNV9oYXNoIChkZS5kZV9uYW1lLCBkZS5kZV9uYW1lbGVuKSk7CisJdGVhaGFzaD1HRVRfSEFTSF9WQUxVRSAoa2V5ZWRfaGFzaCAoZGUuZGVfbmFtZSwgZGUuZGVfbmFtZWxlbikpOworCXl1cmFoYXNoPUdFVF9IQVNIX1ZBTFVFICh5dXJhX2hhc2ggKGRlLmRlX25hbWUsIGRlLmRlX25hbWVsZW4pKTsKKwlpZiAoICggKHRlYWhhc2ggPT0gcjVoYXNoKSAmJiAoR0VUX0hBU0hfVkFMVUUoIGRlaF9vZmZzZXQoJihkZS5kZV9kZWhbZGUuZGVfZW50cnlfbnVtXSkpKSA9PSByNWhhc2gpICkgfHwKKwkgICAgICggKHRlYWhhc2ggPT0geXVyYWhhc2gpICYmICh5dXJhaGFzaCA9PSBHRVRfSEFTSF9WQUxVRSggZGVoX29mZnNldCgmKGRlLmRlX2RlaFtkZS5kZV9lbnRyeV9udW1dKSkpKSApIHx8CisJICAgICAoIChyNWhhc2ggPT0geXVyYWhhc2gpICYmICh5dXJhaGFzaCA9PSBHRVRfSEFTSF9WQUxVRSggZGVoX29mZnNldCgmKGRlLmRlX2RlaFtkZS5kZV9lbnRyeV9udW1dKSkpKSApICkgeworCSAgICByZWlzZXJmc193YXJuaW5nKHMsIlVuYWJsZSB0byBhdXRvbWF0aWNhbGx5IGRldGVjdCBoYXNoIGZ1bmN0aW9uLiAiCisJCQkgICAgICJQbGVhc2UgbW91bnQgd2l0aCAtbyBoYXNoPXt0ZWEscnVwYXNvdixyNX0iLAorCQkJICAgICByZWlzZXJmc19iZGV2bmFtZSAocykpOworCSAgICBoYXNoID0gVU5TRVRfSEFTSDsKKwkgICAgYnJlYWs7CisJfQorCWlmIChHRVRfSEFTSF9WQUxVRSggZGVoX29mZnNldCgmKGRlLmRlX2RlaFtkZS5kZV9lbnRyeV9udW1dKSkgKSA9PSB5dXJhaGFzaCkKKwkgICAgaGFzaCA9IFlVUkFfSEFTSDsKKwllbHNlIGlmIChHRVRfSEFTSF9WQUxVRSggZGVoX29mZnNldCgmKGRlLmRlX2RlaFtkZS5kZV9lbnRyeV9udW1dKSkgKSA9PSB0ZWFoYXNoKQorCSAgICBoYXNoID0gVEVBX0hBU0g7CisJZWxzZSBpZiAoR0VUX0hBU0hfVkFMVUUoIGRlaF9vZmZzZXQoJihkZS5kZV9kZWhbZGUuZGVfZW50cnlfbnVtXSkpICkgPT0gcjVoYXNoKQorCSAgICBoYXNoID0gUjVfSEFTSDsKKwllbHNlIHsKKwkgICAgcmVpc2VyZnNfd2FybmluZyAocywiVW5yZWNvZ25pc2VkIGhhc2ggZnVuY3Rpb24iKTsKKwkgICAgaGFzaCA9IFVOU0VUX0hBU0g7CisJfQorICAgIH0gd2hpbGUgKDApOworCisgICAgcGF0aHJlbHNlICgmcGF0aCk7CisgICAgcmV0dXJuIGhhc2g7Cit9CisKKy8vIGZpbmRzIG91dCB3aGljaCBoYXNoIG5hbWVzIGFyZSBzb3J0ZWQgd2l0aAorc3RhdGljIGludCB3aGF0X2hhc2ggKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMpCit7CisgICAgX191MzIgY29kZTsKKworICAgIGNvZGUgPSBzYl9oYXNoX2Z1bmN0aW9uX2NvZGUoU0JfRElTS19TVVBFUl9CTE9DSyhzKSk7CisKKyAgICAvKiByZWlzZXJmc19oYXNoX2RldGVjdCgpID09IHRydWUgaWYgYW55IG9mIHRoZSBoYXNoIG1vdW50IG9wdGlvbnMKKyAgICAqKiB3ZXJlIHVzZWQuICBXZSBtdXN0IGNoZWNrIHRoZW0gdG8gbWFrZSBzdXJlIHRoZSB1c2VyIGlzbid0CisgICAgKiogdXNpbmcgYSBiYWQgaGFzaCB2YWx1ZQorICAgICovCisgICAgaWYgKGNvZGUgPT0gVU5TRVRfSEFTSCB8fCByZWlzZXJmc19oYXNoX2RldGVjdChzKSkKKwljb2RlID0gZmluZF9oYXNoX291dCAocyk7CisKKyAgICBpZiAoY29kZSAhPSBVTlNFVF9IQVNIICYmIHJlaXNlcmZzX2hhc2hfZGV0ZWN0KHMpKSB7CisJLyogZGV0ZWN0aW9uIGhhcyBmb3VuZCB0aGUgaGFzaCwgYW5kIHdlIG11c3QgY2hlY2sgYWdhaW5zdCB0aGUgCisJKiogbW91bnQgb3B0aW9ucyAKKwkqLworCWlmIChyZWlzZXJmc19ydXBhc292X2hhc2gocykgJiYgY29kZSAhPSBZVVJBX0hBU0gpIHsKKwkgICAgcmVpc2VyZnNfd2FybmluZyAocywgIkVycm9yLCAlcyBoYXNoIGRldGVjdGVkLCAiCisJCSAgICJ1bmFibGUgdG8gZm9yY2UgcnVwYXNvdiBoYXNoIiwgcmVpc2VyZnNfaGFzaG5hbWUoY29kZSkpIDsKKwkgICAgY29kZSA9IFVOU0VUX0hBU0ggOworCX0gZWxzZSBpZiAocmVpc2VyZnNfdGVhX2hhc2gocykgJiYgY29kZSAhPSBURUFfSEFTSCkgeworCSAgICByZWlzZXJmc193YXJuaW5nIChzLCAiRXJyb3IsICVzIGhhc2ggZGV0ZWN0ZWQsICIKKwkJICAgInVuYWJsZSB0byBmb3JjZSB0ZWEgaGFzaCIsIHJlaXNlcmZzX2hhc2huYW1lKGNvZGUpKSA7CisJICAgIGNvZGUgPSBVTlNFVF9IQVNIIDsKKwl9IGVsc2UgaWYgKHJlaXNlcmZzX3I1X2hhc2gocykgJiYgY29kZSAhPSBSNV9IQVNIKSB7CisJICAgIHJlaXNlcmZzX3dhcm5pbmcgKHMsICJFcnJvciwgJXMgaGFzaCBkZXRlY3RlZCwgIgorCQkgICAidW5hYmxlIHRvIGZvcmNlIHI1IGhhc2giLCByZWlzZXJmc19oYXNobmFtZShjb2RlKSkgOworCSAgICBjb2RlID0gVU5TRVRfSEFTSCA7CisJfSAKKyAgICB9IGVsc2UgeyAKKyAgICAgICAgLyogZmluZF9oYXNoX291dCB3YXMgbm90IGNhbGxlZCBvciBjb3VsZCBub3QgZGV0ZXJtaW5lIHRoZSBoYXNoICovCisJaWYgKHJlaXNlcmZzX3J1cGFzb3ZfaGFzaChzKSkgeworCSAgICBjb2RlID0gWVVSQV9IQVNIIDsKKwl9IGVsc2UgaWYgKHJlaXNlcmZzX3RlYV9oYXNoKHMpKSB7CisJICAgIGNvZGUgPSBURUFfSEFTSCA7CisJfSBlbHNlIGlmIChyZWlzZXJmc19yNV9oYXNoKHMpKSB7CisJICAgIGNvZGUgPSBSNV9IQVNIIDsKKwl9IAorICAgIH0KKworICAgIC8qIGlmIHdlIGFyZSBtb3VudGVkIFJXLCBhbmQgd2UgaGF2ZSBhIG5ldyB2YWxpZCBoYXNoIGNvZGUsIHVwZGF0ZSAKKyAgICAqKiB0aGUgc3VwZXIKKyAgICAqLworICAgIGlmIChjb2RlICE9IFVOU0VUX0hBU0ggJiYgCisJIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSAmJiAKKyAgICAgICAgY29kZSAhPSBzYl9oYXNoX2Z1bmN0aW9uX2NvZGUoU0JfRElTS19TVVBFUl9CTE9DSyhzKSkpIHsKKyAgICAgICAgc2V0X3NiX2hhc2hfZnVuY3Rpb25fY29kZShTQl9ESVNLX1NVUEVSX0JMT0NLKHMpLCBjb2RlKTsKKyAgICB9CisgICAgcmV0dXJuIGNvZGU7Cit9CisKKy8vIHJldHVybiBwb2ludGVyIHRvIGFwcHJvcHJpYXRlIGZ1bmN0aW9uCitzdGF0aWMgaGFzaGZfdCBoYXNoX2Z1bmN0aW9uIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzKQoreworICAgIHN3aXRjaCAod2hhdF9oYXNoIChzKSkgeworICAgIGNhc2UgVEVBX0hBU0g6CisJcmVpc2VyZnNfaW5mbyAocywgIlVzaW5nIHRlYSBoYXNoIHRvIHNvcnQgbmFtZXNcbiIpOworCXJldHVybiBrZXllZF9oYXNoOworICAgIGNhc2UgWVVSQV9IQVNIOgorCXJlaXNlcmZzX2luZm8gKHMsICJVc2luZyBydXBhc292IGhhc2ggdG8gc29ydCBuYW1lc1xuIik7CisJcmV0dXJuIHl1cmFfaGFzaDsKKyAgICBjYXNlIFI1X0hBU0g6CisJcmVpc2VyZnNfaW5mbyAocywgIlVzaW5nIHI1IGhhc2ggdG8gc29ydCBuYW1lc1xuIik7CisJcmV0dXJuIHI1X2hhc2g7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisvLyB0aGlzIGlzIHVzZWQgdG8gc2V0IHVwIGNvcnJlY3QgdmFsdWUgZm9yIG9sZCBwYXJ0aXRpb25zCitzdGF0aWMgaW50IGZ1bmN0aW9uMmNvZGUgKGhhc2hmX3QgZnVuYykKK3sKKyAgICBpZiAoZnVuYyA9PSBrZXllZF9oYXNoKQorCXJldHVybiBURUFfSEFTSDsKKyAgICBpZiAoZnVuYyA9PSB5dXJhX2hhc2gpCisJcmV0dXJuIFlVUkFfSEFTSDsKKyAgICBpZiAoZnVuYyA9PSByNV9oYXNoKQorCXJldHVybiBSNV9IQVNIOworCisgICAgQlVHKCkgOyAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuCisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBTV0FSTihzaWxlbnQsIHMsIC4uLikJCQlcCisJaWYgKCEoc2lsZW50KSkJCQkJXAorCQlyZWlzZXJmc193YXJuaW5nIChzLCBfX1ZBX0FSR1NfXykKKworc3RhdGljIGludCByZWlzZXJmc19maWxsX3N1cGVyIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzLCB2b2lkICogZGF0YSwgaW50IHNpbGVudCkKK3sKKyAgICBzdHJ1Y3QgaW5vZGUgKnJvb3RfaW5vZGU7CisgICAgaW50IGo7CisgICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aCA7CisgICAgaW50IG9sZF9mb3JtYXQgPSAwOworICAgIHVuc2lnbmVkIGxvbmcgYmxvY2tzOworICAgIHVuc2lnbmVkIGludCBjb21taXRfbWF4X2FnZSA9IDA7CisgICAgaW50IGppbml0X2RvbmUgPSAwIDsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfaWdldF9hcmdzIGFyZ3MgOworICAgIHN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqIHJzOworICAgIGNoYXIgKmpkZXZfbmFtZTsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfc2JfaW5mbyAqc2JpOworICAgIGludCBlcnJ2YWwgPSAtRUlOVkFMOworCisgICAgc2JpID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHJlaXNlcmZzX3NiX2luZm8pLCBHRlBfS0VSTkVMKTsKKyAgICBpZiAoIXNiaSkgeworCWVycnZhbCA9IC1FTk9NRU07CisJZ290byBlcnJvcjsKKyAgICB9CisgICAgcy0+c19mc19pbmZvID0gc2JpOworICAgIG1lbXNldCAoc2JpLCAwLCBzaXplb2YgKHN0cnVjdCByZWlzZXJmc19zYl9pbmZvKSk7CisgICAgLyogU2V0IGRlZmF1bHQgdmFsdWVzIGZvciBvcHRpb25zOiBub24tYWdncmVzc2l2ZSB0YWlscywgUk8gb24gZXJyb3JzICovCisgICAgUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0IHw9ICgxIDw8IFJFSVNFUkZTX1NNQUxMVEFJTCk7CisgICAgUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0IHw9ICgxIDw8IFJFSVNFUkZTX0VSUk9SX1JPKTsKKyAgICAvKiBubyBwcmVhbGxvY2F0aW9uIG1pbmltdW0sIGJlIHNtYXJ0IGluCisgICAgICAgcmVpc2VyZnNfZmlsZV93cml0ZSBpbnN0ZWFkICovCisgICAgUkVJU0VSRlNfU0IocyktPnNfYWxsb2Nfb3B0aW9ucy5wcmVhbGxvY21pbiA9IDA7CisgICAgLyogUHJlYWxsb2NhdGUgYnkgMTYgYmxvY2tzICgxNy0xKSBhdCBvbmNlICovCisgICAgUkVJU0VSRlNfU0IocyktPnNfYWxsb2Nfb3B0aW9ucy5wcmVhbGxvY3NpemUgPSAxNzsKKyAgICAvKiBJbml0aWFsaXplIHRoZSByd3NlbSBmb3IgeGF0dHIgZGlyICovCisgICAgaW5pdF9yd3NlbSgmUkVJU0VSRlNfU0IocyktPnhhdHRyX2Rpcl9zZW0pOworCisgICAgLyogc2V0dXAgZGVmYXVsdCBibG9jayBhbGxvY2F0b3Igb3B0aW9ucyAqLworICAgIHJlaXNlcmZzX2luaXRfYWxsb2Nfb3B0aW9ucyhzKTsKKworICAgIGpkZXZfbmFtZSA9IE5VTEw7CisgICAgaWYgKHJlaXNlcmZzX3BhcnNlX29wdGlvbnMgKHMsIChjaGFyICopIGRhdGEsICYoc2JpLT5zX21vdW50X29wdCksICZibG9ja3MsICZqZGV2X25hbWUsICZjb21taXRfbWF4X2FnZSkgPT0gMCkgeworCWdvdG8gZXJyb3I7CisgICAgfQorCisgICAgaWYgKGJsb2NrcykgeworCVNXQVJOIChzaWxlbnQsIHMsICJqbWFjZC03OiByZWlzZXJmc19maWxsX3N1cGVyOiByZXNpemUgb3B0aW9uICIKKwkgICAgICAgImZvciByZW1vdW50IG9ubHkiKTsKKwlnb3RvIGVycm9yOworICAgIH0JCisKKyAgICAvKiB0cnkgb2xkIGZvcm1hdCAodW5kaXN0cmlidXRlZCBiaXRtYXAsIHN1cGVyIGJsb2NrIGluIDgtdGggMWsgYmxvY2sgb2YgYSBkZXZpY2UpICovCisgICAgaWYgKCFyZWFkX3N1cGVyX2Jsb2NrIChzLCBSRUlTRVJGU19PTERfRElTS19PRkZTRVRfSU5fQllURVMpKQorICAgICAgb2xkX2Zvcm1hdCA9IDE7CisgICAgLyogdHJ5IG5ldyBmb3JtYXQgKDY0LXRoIDFrIGJsb2NrKSwgd2hpY2ggY2FuIGNvbnRhaW4gcmVpc2VyZnMgc3VwZXIgYmxvY2sgKi8KKyAgICBlbHNlIGlmIChyZWFkX3N1cGVyX2Jsb2NrIChzLCBSRUlTRVJGU19ESVNLX09GRlNFVF9JTl9CWVRFUykpIHsKKyAgICAgIFNXQVJOKHNpbGVudCwgcywgInNoLTIwMjE6IHJlaXNlcmZzX2ZpbGxfc3VwZXI6IGNhbiBub3QgZmluZCByZWlzZXJmcyBvbiAlcyIsIHJlaXNlcmZzX2JkZXZuYW1lIChzKSk7CisgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHJzID0gU0JfRElTS19TVVBFUl9CTE9DSyAocyk7CisgICAgLyogTGV0J3MgZG8gYmFzaWMgc2FuaXR5IGNoZWNrIHRvIHZlcmlmeSB0aGF0IHVuZGVybHlpbmcgZGV2aWNlIGlzIG5vdAorICAgICAgIHNtYWxsZXIgdGhhbiB0aGUgZmlsZXN5c3RlbS4gSWYgdGhlIGNoZWNrIGZhaWxzIHRoZW4gYWJvcnQgYW5kIHNjcmVhbSwKKyAgICAgICBiZWNhdXNlIGJhZCBzdHVmZiB3aWxsIGhhcHBlbiBvdGhlcndpc2UuICovCisgICAgaWYgKCBzLT5zX2JkZXYgJiYgcy0+c19iZGV2LT5iZF9pbm9kZSAmJiBpX3NpemVfcmVhZChzLT5zX2JkZXYtPmJkX2lub2RlKSA8IHNiX2Jsb2NrX2NvdW50KHJzKSpzYl9ibG9ja3NpemUocnMpKSB7CisJU1dBUk4gKHNpbGVudCwgcywgIkZpbGVzeXN0ZW0gb24gJXMgY2Fubm90IGJlIG1vdW50ZWQgYmVjYXVzZSBpdCBpcyBiaWdnZXIgdGhhbiB0aGUgZGV2aWNlIiwgcmVpc2VyZnNfYmRldm5hbWUocykpOworCVNXQVJOKHNpbGVudCwgcywgIllvdSBtYXkgbmVlZCB0byBydW4gZnNjayBvciBpbmNyZWFzZSBzaXplIG9mIHlvdXIgTFZNIHBhcnRpdGlvbiIpOworCVNXQVJOKHNpbGVudCwgcywgIk9yIG1heSBiZSB5b3UgZm9yZ290IHRvIHJlYm9vdCBhZnRlciBmZGlzayB3aGVuIGl0IHRvbGQgeW91IHRvIik7CisJZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBzYmktPnNfbW91bnRfc3RhdGUgPSBTQl9SRUlTRVJGU19TVEFURShzKTsKKyAgICBzYmktPnNfbW91bnRfc3RhdGUgPSBSRUlTRVJGU19WQUxJRF9GUyA7CisKKyAgICBpZiAob2xkX2Zvcm1hdCA/IHJlYWRfb2xkX2JpdG1hcHMocykgOiByZWFkX2JpdG1hcHMocykpIHsKKwlTV0FSTihzaWxlbnQsIHMsICJqbWFjZC04OiByZWlzZXJmc19maWxsX3N1cGVyOiB1bmFibGUgdG8gcmVhZCBiaXRtYXAiKTsKKwlnb3RvIGVycm9yOworICAgIH0KKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKyAgICBTV0FSTiAoc2lsZW50LCBzLCAiQ09ORklHX1JFSVNFUkZTX0NIRUNLIGlzIHNldCBPTiIpOworICAgIFNXQVJOIChzaWxlbnQsIHMsICItIGl0IGlzIHNsb3cgbW9kZSBmb3IgZGVidWdnaW5nLiIpOworI2VuZGlmCisKKyAgICAvKiBtYWtlIGRhdGE9b3JkZXJlZCB0aGUgZGVmYXVsdCAqLworICAgIGlmICghcmVpc2VyZnNfZGF0YV9sb2cocykgJiYgIXJlaXNlcmZzX2RhdGFfb3JkZXJlZChzKSAmJgorICAgICAgICAhcmVpc2VyZnNfZGF0YV93cml0ZWJhY2socykpCisgICAgeworICAgICAgICAgUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0IHw9ICgxIDw8IFJFSVNFUkZTX0RBVEFfT1JERVJFRCk7CisgICAgfQorCisgICAgaWYgKHJlaXNlcmZzX2RhdGFfbG9nKHMpKSB7CisgICAgICAgIHJlaXNlcmZzX2luZm8gKHMsICJ1c2luZyBqb3VybmFsZWQgZGF0YSBtb2RlXG4iKTsKKyAgICB9IGVsc2UgaWYgKHJlaXNlcmZzX2RhdGFfb3JkZXJlZChzKSkgeworICAgICAgICByZWlzZXJmc19pbmZvIChzLCAidXNpbmcgb3JkZXJlZCBkYXRhIG1vZGVcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlaXNlcmZzX2luZm8gKHMsICJ1c2luZyB3cml0ZWJhY2sgZGF0YSBtb2RlXG4iKTsKKyAgICB9CisgICAgaWYgKHJlaXNlcmZzX2JhcnJpZXJfZmx1c2gocykpIHsKKyAgICAJcHJpbnRrKCJyZWlzZXJmczogdXNpbmcgZmx1c2ggYmFycmllcnNcbiIpOworICAgIH0KKworICAgIC8vIHNldF9kZXZpY2Vfcm8ocy0+c19kZXYsIDEpIDsKKyAgICBpZiggam91cm5hbF9pbml0KHMsIGpkZXZfbmFtZSwgb2xkX2Zvcm1hdCwgY29tbWl0X21heF9hZ2UpICkgeworCVNXQVJOKHNpbGVudCwgcywgInNoLTIwMjI6IHJlaXNlcmZzX2ZpbGxfc3VwZXI6IHVuYWJsZSB0byBpbml0aWFsaXplIGpvdXJuYWwgc3BhY2UiKSA7CisJZ290byBlcnJvciA7CisgICAgfSBlbHNlIHsKKwlqaW5pdF9kb25lID0gMSA7IC8qIG9uY2UgdGhpcyBpcyBzZXQsIGpvdXJuYWxfcmVsZWFzZSBtdXN0IGJlIGNhbGxlZAorCQkJICoqIGlmIHdlIGVycm9yIG91dCBvZiB0aGUgbW91bnQKKwkJCSAqLworICAgIH0KKyAgICBpZiAocmVyZWFkX21ldGFfYmxvY2tzKHMpKSB7CisJU1dBUk4oc2lsZW50LCBzLCAiam1hY2QtOTogcmVpc2VyZnNfZmlsbF9zdXBlcjogdW5hYmxlIHRvIHJlcmVhZCBtZXRhIGJsb2NrcyBhZnRlciBqb3VybmFsIGluaXQiKSA7CisJZ290byBlcnJvciA7CisgICAgfQorCisgICAgaWYgKHJlcGxheV9vbmx5IChzKSkKKwlnb3RvIGVycm9yOworCisgICAgaWYgKGJkZXZfcmVhZF9vbmx5KHMtPnNfYmRldikgJiYgIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworICAgICAgICBTV0FSTihzaWxlbnQsIHMsICJjbG0tNzAwMDogRGV0ZWN0ZWQgcmVhZG9ubHkgZGV2aWNlLCBtYXJraW5nIEZTIHJlYWRvbmx5IikgOworCXMtPnNfZmxhZ3MgfD0gTVNfUkRPTkxZIDsKKyAgICB9CisgICAgYXJncy5vYmplY3RpZCA9IFJFSVNFUkZTX1JPT1RfT0JKRUNUSUQgOworICAgIGFyZ3MuZGlyaWQgPSBSRUlTRVJGU19ST09UX1BBUkVOVF9PQkpFQ1RJRCA7CisgICAgcm9vdF9pbm9kZSA9IGlnZXQ1X2xvY2tlZCAocywgUkVJU0VSRlNfUk9PVF9PQkpFQ1RJRCwgcmVpc2VyZnNfZmluZF9hY3RvciwgcmVpc2VyZnNfaW5pdF9sb2NrZWRfaW5vZGUsICh2b2lkICopKCZhcmdzKSk7CisgICAgaWYgKCFyb290X2lub2RlKSB7CisJU1dBUk4oc2lsZW50LCBzLCAiam1hY2QtMTA6IHJlaXNlcmZzX2ZpbGxfc3VwZXI6IGdldCByb290IGlub2RlIGZhaWxlZCIpOworCWdvdG8gZXJyb3I7CisgICAgfQorCisgICAgaWYgKHJvb3RfaW5vZGUtPmlfc3RhdGUgJiBJX05FVykgeworCXJlaXNlcmZzX3JlYWRfbG9ja2VkX2lub2RlKHJvb3RfaW5vZGUsICZhcmdzKTsKKwl1bmxvY2tfbmV3X2lub2RlKHJvb3RfaW5vZGUpOworICAgIH0KKworICAgIHMtPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290X2lub2RlKTsgIAorICAgIGlmICghcy0+c19yb290KSB7CisJaXB1dChyb290X2lub2RlKTsKKwlnb3RvIGVycm9yOworICAgIH0KKworICAgIC8vIGRlZmluZSBhbmQgaW5pdGlhbGl6ZSBoYXNoIGZ1bmN0aW9uCisgICAgc2JpLT5zX2hhc2hfZnVuY3Rpb24gPSBoYXNoX2Z1bmN0aW9uIChzKTsKKyAgICBpZiAoc2JpLT5zX2hhc2hfZnVuY3Rpb24gPT0gTlVMTCkgeworICAgICAgZHB1dChzLT5zX3Jvb3QpIDsKKyAgICAgIHMtPnNfcm9vdCA9IE5VTEwgOworICAgICAgZ290byBlcnJvciA7CisgICAgfQorCisgICAgaWYgKGlzX3JlaXNlcmZzXzNfNSAocnMpIHx8IChpc19yZWlzZXJmc19qciAocnMpICYmIFNCX1ZFUlNJT04gKHMpID09IFJFSVNFUkZTX1ZFUlNJT05fMSkpCisJc2V0X2JpdChSRUlTRVJGU18zXzUsICYoc2JpLT5zX3Byb3BlcnRpZXMpKTsKKyAgICBlbHNlCisJc2V0X2JpdChSRUlTRVJGU18zXzYsICYoc2JpLT5zX3Byb3BlcnRpZXMpKTsKKyAgICAKKyAgICBpZiAoIShzLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCisJZXJydmFsID0gam91cm5hbF9iZWdpbigmdGgsIHMsIDEpIDsKKyAgICAgICAgaWYgKGVycnZhbCkgeworCSAgICBkcHV0IChzLT5zX3Jvb3QpOworCSAgICBzLT5zX3Jvb3QgPSBOVUxMOworCSAgICBnb3RvIGVycm9yOworICAgICAgICB9CisJcmVpc2VyZnNfcHJlcGFyZV9mb3Jfam91cm5hbChzLCBTQl9CVUZGRVJfV0lUSF9TQihzKSwgMSkgOworCisgICAgICAgIHNldF9zYl91bW91bnRfc3RhdGUoIHJzLCBSRUlTRVJGU19FUlJPUl9GUyApOworCXNldF9zYl9mc19zdGF0ZSAocnMsIDApOworCQorCWlmIChvbGRfZm9ybWF0X29ubHkocykpIHsKKwkgIC8qIGZpbGVzeXN0ZW0gb2YgZm9ybWF0IDMuNSBlaXRoZXIgd2l0aCBzdGFuZGFyZCBvciBub24tc3RhbmRhcmQKKwkgICAgIGpvdXJuYWwgKi8KKwkgIGlmIChjb252ZXJ0X3JlaXNlcmZzIChzKSkgeworCSAgICAvKiBhbmQgLW8gY29udiBpcyBnaXZlbiAqLworCSAgICBpZighc2lsZW50KQorCSAgICAgIHJlaXNlcmZzX2luZm8gKHMsImNvbnZlcnRpbmcgMy41IGZpbGVzeXN0ZW0gdG8gdGhlIDMuNiBmb3JtYXQiKSA7CisKKwkgICAgaWYgKGlzX3JlaXNlcmZzXzNfNSAocnMpKQorCSAgICAgIC8qIHB1dCBtYWdpYyBzdHJpbmcgb2YgMy42IGZvcm1hdC4gMi4yIHdpbGwgbm90IGJlIGFibGUgdG8KKwkJIG1vdW50IHRoaXMgZmlsZXN5c3RlbSBhbnltb3JlICovCisJICAgICAgbWVtY3B5IChycy0+c192MS5zX21hZ2ljLCByZWlzZXJmc18zXzZfbWFnaWNfc3RyaW5nLAorCQkgICAgICBzaXplb2YgKHJlaXNlcmZzXzNfNl9tYWdpY19zdHJpbmcpKTsKKworCSAgICBzZXRfc2JfdmVyc2lvbihycyxSRUlTRVJGU19WRVJTSU9OXzIpOworCSAgICByZWlzZXJmc19jb252ZXJ0X29iamVjdGlkX21hcF92MShzKSA7CisJICAgIHNldF9iaXQoUkVJU0VSRlNfM182LCAmKHNiaS0+c19wcm9wZXJ0aWVzKSk7CisJICAgIGNsZWFyX2JpdChSRUlTRVJGU18zXzUsICYoc2JpLT5zX3Byb3BlcnRpZXMpKTsKKwkgIH0gZWxzZSBpZiAoIXNpbGVudCl7CisJICAgIHJlaXNlcmZzX2luZm8gKHMsICJ1c2luZyAzLjUueCBkaXNrIGZvcm1hdFxuIikgOworCSAgfQorCX0KKworCWpvdXJuYWxfbWFya19kaXJ0eSgmdGgsIHMsIFNCX0JVRkZFUl9XSVRIX1NCIChzKSk7CisJZXJydmFsID0gam91cm5hbF9lbmQoJnRoLCBzLCAxKSA7CisJaWYgKGVycnZhbCkgeworCSAgICBkcHV0IChzLT5zX3Jvb3QpOworCSAgICBzLT5zX3Jvb3QgPSBOVUxMOworCSAgICBnb3RvIGVycm9yOworCX0KKworCWlmICgoZXJydmFsID0gcmVpc2VyZnNfeGF0dHJfaW5pdCAocywgcy0+c19mbGFncykpKSB7CisJICAgIGRwdXQgKHMtPnNfcm9vdCk7CisJICAgIHMtPnNfcm9vdCA9IE5VTEw7CisJICAgIGdvdG8gZXJyb3I7CisJfQorCisJLyogbG9vayBmb3IgZmlsZXMgd2hpY2ggd2VyZSB0byBiZSByZW1vdmVkIGluIHByZXZpb3VzIHNlc3Npb24gKi8KKwlmaW5pc2hfdW5maW5pc2hlZCAocyk7CisgICAgfSBlbHNlIHsKKwlpZiAoIG9sZF9mb3JtYXRfb25seShzKSAmJiAhc2lsZW50KSB7CisJICAgIHJlaXNlcmZzX2luZm8gKHMsICJ1c2luZyAzLjUueCBkaXNrIGZvcm1hdFxuIikgOworCX0KKworCWlmICgoZXJydmFsID0gcmVpc2VyZnNfeGF0dHJfaW5pdCAocywgcy0+c19mbGFncykpKSB7CisJICAgIGRwdXQgKHMtPnNfcm9vdCk7CisJICAgIHMtPnNfcm9vdCA9IE5VTEw7CisJICAgIGdvdG8gZXJyb3I7CisJfQorICAgIH0KKyAgICAvLyBtYXJrIGhhc2ggaW4gc3VwZXIgYmxvY2s6IGl0IGNvdWxkIGJlIHVuc2V0LiBvdmVyd3JpdGUgc2hvdWxkIGJlIG9rCisgICAgc2V0X3NiX2hhc2hfZnVuY3Rpb25fY29kZSggcnMsIGZ1bmN0aW9uMmNvZGUoc2JpLT5zX2hhc2hfZnVuY3Rpb24gKSApOworCisgICAgaGFuZGxlX2F0dHJzKCBzICk7CisKKyAgICByZWlzZXJmc19wcm9jX2luZm9faW5pdCggcyApOworCisgICAgaW5pdF93YWl0cXVldWVfaGVhZCAoJihzYmktPnNfd2FpdCkpOworICAgIHNwaW5fbG9ja19pbml0KCZzYmktPmJpdG1hcF9sb2NrKTsKKworICAgIHJldHVybiAoMCk7CisKKyBlcnJvcjoKKyAgICBpZiAoamluaXRfZG9uZSkgeyAvKiBraWxsIHRoZSBjb21taXQgdGhyZWFkLCBmcmVlIGpvdXJuYWwgcmFtICovCisJam91cm5hbF9yZWxlYXNlX2Vycm9yKE5VTEwsIHMpIDsKKyAgICB9CisgICAgaWYgKFNCX0RJU0tfU1VQRVJfQkxPQ0sgKHMpKSB7CisJZm9yIChqID0gMDsgaiA8IFNCX0JNQVBfTlIgKHMpOyBqICsrKSB7CisJICAgIGlmIChTQl9BUF9CSVRNQVAgKHMpKQorCQlicmVsc2UgKFNCX0FQX0JJVE1BUCAocylbal0uYmgpOworCX0KKwlpZiAoU0JfQVBfQklUTUFQIChzKSkKKwkgICAgdmZyZWUgKFNCX0FQX0JJVE1BUCAocykpOworICAgIH0KKyAgICBpZiAoU0JfQlVGRkVSX1dJVEhfU0IgKHMpKQorCWJyZWxzZShTQl9CVUZGRVJfV0lUSF9TQiAocykpOworI2lmZGVmIENPTkZJR19RVU9UQQorICAgIGZvciAoaiA9IDA7IGogPCBNQVhRVU9UQVM7IGorKykgeworCWlmIChzYmktPnNfcWZfbmFtZXNbal0pCisJICAgIGtmcmVlKHNiaS0+c19xZl9uYW1lc1tqXSk7CisgICAgfQorI2VuZGlmCisgICAgaWYgKHNiaSAhPSBOVUxMKSB7CisJa2ZyZWUoc2JpKTsKKyAgICB9CisKKyAgICBzLT5zX2ZzX2luZm8gPSBOVUxMOworICAgIHJldHVybiBlcnJ2YWw7Cit9CisKKworc3RhdGljIGludCByZWlzZXJmc19zdGF0ZnMgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHMsIHN0cnVjdCBrc3RhdGZzICogYnVmKQoreworICBzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKiBycyA9IFNCX0RJU0tfU1VQRVJfQkxPQ0sgKHMpOworICAKKyAgYnVmLT5mX25hbWVsZW4gPSAoUkVJU0VSRlNfTUFYX05BTUUgKHMtPnNfYmxvY2tzaXplKSk7CisgIGJ1Zi0+Zl9iZnJlZSAgID0gc2JfZnJlZV9ibG9ja3MocnMpOworICBidWYtPmZfYmF2YWlsICA9IGJ1Zi0+Zl9iZnJlZTsKKyAgYnVmLT5mX2Jsb2NrcyAgPSBzYl9ibG9ja19jb3VudChycykgLSBzYl9ibWFwX25yKHJzKSAtIDE7CisgIGJ1Zi0+Zl9ic2l6ZSAgID0gcy0+c19ibG9ja3NpemU7CisgIC8qIGNoYW5nZWQgdG8gYWNjb21tb2RhdGUgZ2NjIGZvbGtzLiovCisgIGJ1Zi0+Zl90eXBlICAgID0gIFJFSVNFUkZTX1NVUEVSX01BR0lDOworICByZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19RVU9UQQorc3RhdGljIGludCByZWlzZXJmc19kcXVvdF9pbml0aWFsaXplKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKQoreworICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisgICAgaW50IHJldDsKKworICAgIC8qIFdlIG1heSBjcmVhdGUgcXVvdGEgc3RydWN0dXJlIHNvIHdlIG5lZWQgdG8gcmVzZXJ2ZSBlbm91Z2ggYmxvY2tzICovCisgICAgcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisgICAgam91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLCAyKlJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTKTsKKyAgICByZXQgPSBkcXVvdF9pbml0aWFsaXplKGlub2RlLCB0eXBlKTsKKyAgICBqb3VybmFsX2VuZCgmdGgsIGlub2RlLT5pX3NiLCAyKlJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTKTsKKyAgICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmVpc2VyZnNfZHF1b3RfZHJvcChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisgICAgaW50IHJldDsKKworICAgIC8qIFdlIG1heSBkZWxldGUgcXVvdGEgc3RydWN0dXJlIHNvIHdlIG5lZWQgdG8gcmVzZXJ2ZSBlbm91Z2ggYmxvY2tzICovCisgICAgcmVpc2VyZnNfd3JpdGVfbG9jayhpbm9kZS0+aV9zYik7CisgICAgam91cm5hbF9iZWdpbigmdGgsIGlub2RlLT5pX3NiLCAyKlJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTKTsKKyAgICByZXQgPSBkcXVvdF9kcm9wKGlub2RlKTsKKyAgICBqb3VybmFsX2VuZCgmdGgsIGlub2RlLT5pX3NiLCAyKlJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTKTsKKyAgICByZWlzZXJmc193cml0ZV91bmxvY2soaW5vZGUtPmlfc2IpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmVpc2VyZnNfd3JpdGVfZHF1b3Qoc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworICAgIGludCByZXQ7CisKKyAgICByZWlzZXJmc193cml0ZV9sb2NrKGRxdW90LT5kcV9zYik7CisgICAgam91cm5hbF9iZWdpbigmdGgsIGRxdW90LT5kcV9zYiwgUkVJU0VSRlNfUVVPVEFfVFJBTlNfQkxPQ0tTKTsKKyAgICByZXQgPSBkcXVvdF9jb21taXQoZHF1b3QpOworICAgIGpvdXJuYWxfZW5kKCZ0aCwgZHF1b3QtPmRxX3NiLCBSRUlTRVJGU19RVU9UQV9UUkFOU19CTE9DS1MpOworICAgIHJlaXNlcmZzX3dyaXRlX3VubG9jayhkcXVvdC0+ZHFfc2IpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmVpc2VyZnNfYWNxdWlyZV9kcXVvdChzdHJ1Y3QgZHF1b3QgKmRxdW90KQoreworICAgIHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgdGg7CisgICAgaW50IHJldDsKKworICAgIHJlaXNlcmZzX3dyaXRlX2xvY2soZHF1b3QtPmRxX3NiKTsKKyAgICBqb3VybmFsX2JlZ2luKCZ0aCwgZHF1b3QtPmRxX3NiLCBSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUyk7CisgICAgcmV0ID0gZHF1b3RfYWNxdWlyZShkcXVvdCk7CisgICAgam91cm5hbF9lbmQoJnRoLCBkcXVvdC0+ZHFfc2IsIFJFSVNFUkZTX1FVT1RBX0lOSVRfQkxPQ0tTKTsKKyAgICByZWlzZXJmc193cml0ZV91bmxvY2soZHF1b3QtPmRxX3NiKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJlaXNlcmZzX3JlbGVhc2VfZHF1b3Qoc3RydWN0IGRxdW90ICpkcXVvdCkKK3sKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlIHRoOworICAgIGludCByZXQ7CisKKyAgICByZWlzZXJmc193cml0ZV9sb2NrKGRxdW90LT5kcV9zYik7CisgICAgam91cm5hbF9iZWdpbigmdGgsIGRxdW90LT5kcV9zYiwgUkVJU0VSRlNfUVVPVEFfSU5JVF9CTE9DS1MpOworICAgIHJldCA9IGRxdW90X3JlbGVhc2UoZHF1b3QpOworICAgIGpvdXJuYWxfZW5kKCZ0aCwgZHF1b3QtPmRxX3NiLCBSRUlTRVJGU19RVU9UQV9JTklUX0JMT0NLUyk7CisgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKGRxdW90LT5kcV9zYik7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByZWlzZXJmc19tYXJrX2RxdW90X2RpcnR5KHN0cnVjdCBkcXVvdCAqZHF1b3QpCit7CisgICAgLyogQXJlIHdlIGpvdXJuYWxsaW5nIHF1b3Rhcz8gKi8KKyAgICBpZiAoUkVJU0VSRlNfU0IoZHF1b3QtPmRxX3NiKS0+c19xZl9uYW1lc1tVU1JRVU9UQV0gfHwKKyAgICAgICAgUkVJU0VSRlNfU0IoZHF1b3QtPmRxX3NiKS0+c19xZl9uYW1lc1tHUlBRVU9UQV0pIHsKKwlkcXVvdF9tYXJrX2RxdW90X2RpcnR5KGRxdW90KTsKKwlyZXR1cm4gcmVpc2VyZnNfd3JpdGVfZHF1b3QoZHF1b3QpOworICAgIH0KKyAgICBlbHNlCisJcmV0dXJuIGRxdW90X21hcmtfZHF1b3RfZGlydHkoZHF1b3QpOworfQorCitzdGF0aWMgaW50IHJlaXNlcmZzX3dyaXRlX2luZm8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpCit7CisgICAgc3RydWN0IHJlaXNlcmZzX3RyYW5zYWN0aW9uX2hhbmRsZSB0aDsKKyAgICBpbnQgcmV0OworCisgICAgLyogRGF0YSBibG9jayArIGlub2RlIGJsb2NrICovCisgICAgcmVpc2VyZnNfd3JpdGVfbG9jayhzYik7CisgICAgam91cm5hbF9iZWdpbigmdGgsIHNiLCAyKTsKKyAgICByZXQgPSBkcXVvdF9jb21taXRfaW5mbyhzYiwgdHlwZSk7CisgICAgam91cm5hbF9lbmQoJnRoLCBzYiwgMik7CisgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrKHNiKTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKgorICogVHVybiBvbiBxdW90YXMgZHVyaW5nIG1vdW50IHRpbWUgLSB3ZSBuZWVkIHRvIGZpbmQKKyAqIHRoZSBxdW90YSBmaWxlIGFuZCBzdWNoLi4uCisgKi8KK3N0YXRpYyBpbnQgcmVpc2VyZnNfcXVvdGFfb25fbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUpCit7CisgICAgaW50IGVycjsKKyAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisgICAgc3RydWN0IHFzdHIgbmFtZSA9IHsgLm5hbWUgPSBSRUlTRVJGU19TQihzYiktPnNfcWZfbmFtZXNbdHlwZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgLmhhc2ggPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIC5sZW4gPSBzdHJsZW4oUkVJU0VSRlNfU0Ioc2IpLT5zX3FmX25hbWVzW3R5cGVdKX07CisKKyAgICBkZW50cnkgPSBsb29rdXBfaGFzaCgmbmFtZSwgc2ItPnNfcm9vdCk7CisgICAgaWYgKElTX0VSUihkZW50cnkpKQorICAgICAgICAgICAgcmV0dXJuIFBUUl9FUlIoZGVudHJ5KTsKKyAgICBlcnIgPSB2ZnNfcXVvdGFfb25fbW91bnQodHlwZSwgUkVJU0VSRlNfU0Ioc2IpLT5zX2pxdW90YV9mbXQsIGRlbnRyeSk7CisgICAgLyogTm93IGludmFsaWRhdGUgYW5kIHB1dCB0aGUgZGVudHJ5IC0gcXVvdGEgZ290IGl0cyBvd24gcmVmZXJlbmNlCisgICAgICogdG8gaW5vZGUgYW5kIGRlbnRyeSBoYXMgYXQgbGVhc3Qgd3JvbmcgaGFzaCBzbyB3ZSBoYWQgYmV0dGVyCisgICAgICogdGhyb3cgaXQgYXdheSAqLworICAgIGRfaW52YWxpZGF0ZShkZW50cnkpOworICAgIGRwdXQoZGVudHJ5KTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKgorICogU3RhbmRhcmQgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIHF1b3RhX29uCisgKi8KK3N0YXRpYyBpbnQgcmVpc2VyZnNfcXVvdGFfb24oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IHR5cGUsIGludCBmb3JtYXRfaWQsIGNoYXIgKnBhdGgpCit7CisgICAgaW50IGVycjsKKyAgICBzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCisgICAgZXJyID0gcGF0aF9sb29rdXAocGF0aCwgTE9PS1VQX0ZPTExPVywgJm5kKTsKKyAgICBpZiAoZXJyKQorICAgICAgICByZXR1cm4gZXJyOworICAgIC8qIFF1b3RhZmlsZSBub3Qgb24gdGhlIHNhbWUgZmlsZXN5c3RlbT8gKi8KKyAgICBpZiAobmQubW50LT5tbnRfc2IgIT0gc2IpIHsKKwlwYXRoX3JlbGVhc2UoJm5kKTsKKyAgICAgICAgcmV0dXJuIC1FWERFVjsKKyAgICB9CisgICAgLyogV2UgbXVzdCBub3QgcGFjayB0YWlscyBmb3IgcXVvdGEgZmlsZXMgb24gcmVpc2VyZnMgZm9yIHF1b3RhIElPIHRvIHdvcmsgKi8KKyAgICBpZiAoIVJFSVNFUkZTX0kobmQuZGVudHJ5LT5kX2lub2RlKS0+aV9mbGFncyAmIGlfbm9wYWNrX21hc2spIHsKKwlyZWlzZXJmc193YXJuaW5nKHNiLCAicmVpc2VyZnM6IFF1b3RhIGZpbGUgbXVzdCBoYXZlIHRhaWwgcGFja2luZyBkaXNhYmxlZC4iKTsKKwlwYXRoX3JlbGVhc2UoJm5kKTsKKwlyZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgLyogTm90IGpvdXJuYWxsaW5nIHF1b3RhPyBObyBtb3JlIHRlc3RzIG5lZWRlZC4uLiAqLworICAgIGlmICghUkVJU0VSRlNfU0Ioc2IpLT5zX3FmX25hbWVzW1VTUlFVT1RBXSAmJgorICAgICAgICAhUkVJU0VSRlNfU0Ioc2IpLT5zX3FmX25hbWVzW0dSUFFVT1RBXSkgeworCXBhdGhfcmVsZWFzZSgmbmQpOworICAgICAgICByZXR1cm4gdmZzX3F1b3RhX29uKHNiLCB0eXBlLCBmb3JtYXRfaWQsIHBhdGgpOworICAgIH0KKyAgICAvKiBRdW90YWZpbGUgbm90IG9mIGZzIHJvb3Q/ICovCisgICAgaWYgKG5kLmRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGUgIT0gc2ItPnNfcm9vdC0+ZF9pbm9kZSkKKwlyZWlzZXJmc193YXJuaW5nKHNiLCAicmVpc2VyZnM6IFF1b3RhIGZpbGUgbm90IG9uIGZpbGVzeXN0ZW0gcm9vdC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSm91cm5hbGxlZCBxdW90YSB3aWxsIG5vdCB3b3JrLiIpOworICAgIHBhdGhfcmVsZWFzZSgmbmQpOworICAgIHJldHVybiB2ZnNfcXVvdGFfb24oc2IsIHR5cGUsIGZvcm1hdF9pZCwgcGF0aCk7Cit9CisKKy8qIFJlYWQgZGF0YSBmcm9tIHF1b3RhZmlsZSAtIGF2b2lkIHBhZ2VjYWNoZSBhbmQgc3VjaCBiZWNhdXNlIHdlIGNhbm5vdCBhZmZvcmQKKyAqIGFjcXVpcmluZyB0aGUgbG9ja3MuLi4gQXMgcXVvdGEgZmlsZXMgYXJlIG5ldmVyIHRydW5jYXRlZCBhbmQgcXVvdGEgY29kZQorICogaXRzZWxmIHNlcmlhbGl6ZXMgdGhlIG9wZXJhdGlvbnMgKGFuZCBub29uZSBlbHNlIHNob3VsZCB0b3VjaCB0aGUgZmlsZXMpCisgKiB3ZSBkb24ndCBoYXZlIHRvIGJlIGFmcmFpZCBvZiByYWNlcyAqLworc3RhdGljIHNzaXplX3QgcmVpc2VyZnNfcXVvdGFfcmVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwgY2hhciAqZGF0YSwKKwkJCQkgICBzaXplX3QgbGVuLCBsb2ZmX3Qgb2ZmKQoreworICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBzYl9kcW9wdChzYiktPmZpbGVzW3R5cGVdOworICAgIHVuc2lnbmVkIGxvbmcgYmxrID0gb2ZmID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworICAgIGludCBlcnIgPSAwLCBvZmZzZXQgPSBvZmYgJiAoc2ItPnNfYmxvY2tzaXplIC0gMSksIHRvY29weTsKKyAgICBzaXplX3QgdG9yZWFkOworICAgIHN0cnVjdCBidWZmZXJfaGVhZCB0bXBfYmgsICpiaDsKKyAgICBsb2ZmX3QgaV9zaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOworCisgICAgaWYgKG9mZiA+IGlfc2l6ZSkKKwlyZXR1cm4gMDsKKyAgICBpZiAob2ZmK2xlbiA+IGlfc2l6ZSkKKwlsZW4gPSBpX3NpemUtb2ZmOworICAgIHRvcmVhZCA9IGxlbjsKKyAgICB3aGlsZSAodG9yZWFkID4gMCkgeworCXRvY29weSA9IHNiLT5zX2Jsb2Nrc2l6ZSAtIG9mZnNldCA8IHRvcmVhZCA/IHNiLT5zX2Jsb2Nrc2l6ZSAtIG9mZnNldCA6IHRvcmVhZDsKKwl0bXBfYmguYl9zdGF0ZSA9IDA7CisJLyogUXVvdGEgZmlsZXMgYXJlIHdpdGhvdXQgdGFpbHMgc28gd2UgY2FuIHNhZmVseSB1c2UgdGhpcyBmdW5jdGlvbiAqLworCXJlaXNlcmZzX3dyaXRlX2xvY2soc2IpOworCWVyciA9IHJlaXNlcmZzX2dldF9ibG9jayhpbm9kZSwgYmxrLCAmdG1wX2JoLCAwKTsKKwlyZWlzZXJmc193cml0ZV91bmxvY2soc2IpOworCWlmIChlcnIpCisJICAgIHJldHVybiBlcnI7CisJaWYgKCFidWZmZXJfbWFwcGVkKCZ0bXBfYmgpKSAgICAvKiBBIGhvbGU/ICovCisJICAgIG1lbXNldChkYXRhLCAwLCB0b2NvcHkpOworCWVsc2UgeworCSAgICBiaCA9IHNiX2JyZWFkKHNiLCB0bXBfYmguYl9ibG9ja25yKTsKKwkgICAgaWYgKCFiaCkKKwkJcmV0dXJuIC1FSU87CisJICAgIG1lbWNweShkYXRhLCBiaC0+Yl9kYXRhK29mZnNldCwgdG9jb3B5KTsKKwkgICAgYnJlbHNlKGJoKTsKKwl9CisJb2Zmc2V0ID0gMDsKKwl0b3JlYWQgLT0gdG9jb3B5OworCWRhdGEgKz0gdG9jb3B5OworCWJsaysrOworICAgIH0KKyAgICByZXR1cm4gbGVuOworfQorCisvKiBXcml0ZSB0byBxdW90YWZpbGUgKHdlIGtub3cgdGhlIHRyYW5zYWN0aW9uIGlzIGFscmVhZHkgc3RhcnRlZCBhbmQgaGFzCisgKiBlbm91Z2ggY3JlZGl0cykgKi8KK3N0YXRpYyBzc2l6ZV90IHJlaXNlcmZzX3F1b3RhX3dyaXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLAorCQkJCSAgICBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuLCBsb2ZmX3Qgb2ZmKQoreworICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBzYl9kcW9wdChzYiktPmZpbGVzW3R5cGVdOworICAgIHVuc2lnbmVkIGxvbmcgYmxrID0gb2ZmID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworICAgIGludCBlcnIgPSAwLCBvZmZzZXQgPSBvZmYgJiAoc2ItPnNfYmxvY2tzaXplIC0gMSksIHRvY29weTsKKyAgICBpbnQgam91cm5hbF9xdW90YSA9IFJFSVNFUkZTX1NCKHNiKS0+c19xZl9uYW1lc1t0eXBlXSAhPSBOVUxMOworICAgIHNpemVfdCB0b3dyaXRlID0gbGVuOworICAgIHN0cnVjdCBidWZmZXJfaGVhZCB0bXBfYmgsICpiaDsKKworICAgIGRvd24oJmlub2RlLT5pX3NlbSk7CisgICAgd2hpbGUgKHRvd3JpdGUgPiAwKSB7CisJdG9jb3B5ID0gc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0IDwgdG93cml0ZSA/CisJICAgICAgICAgc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0IDogdG93cml0ZTsKKwl0bXBfYmguYl9zdGF0ZSA9IDA7CisJZXJyID0gcmVpc2VyZnNfZ2V0X2Jsb2NrKGlub2RlLCBibGssICZ0bXBfYmgsIEdFVF9CTE9DS19DUkVBVEUpOworCWlmIChlcnIpCisJICAgIGdvdG8gb3V0OworCWlmIChvZmZzZXQgfHwgdG9jb3B5ICE9IHNiLT5zX2Jsb2Nrc2l6ZSkKKwkgICAgYmggPSBzYl9icmVhZChzYiwgdG1wX2JoLmJfYmxvY2tucik7CisJZWxzZQorCSAgICBiaCA9IHNiX2dldGJsayhzYiwgdG1wX2JoLmJfYmxvY2tucik7CisJaWYgKCFiaCkgeworCSAgICBlcnIgPSAtRUlPOworCSAgICBnb3RvIG91dDsKKwl9CisJbG9ja19idWZmZXIoYmgpOworCW1lbWNweShiaC0+Yl9kYXRhK29mZnNldCwgZGF0YSwgdG9jb3B5KTsKKwlmbHVzaF9kY2FjaGVfcGFnZShiaC0+Yl9wYWdlKTsKKwlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwl1bmxvY2tfYnVmZmVyKGJoKTsKKwlyZWlzZXJmc19wcmVwYXJlX2Zvcl9qb3VybmFsKHNiLCBiaCwgMSk7CisJam91cm5hbF9tYXJrX2RpcnR5KGN1cnJlbnQtPmpvdXJuYWxfaW5mbywgc2IsIGJoKTsKKwlpZiAoIWpvdXJuYWxfcXVvdGEpCisJCXJlaXNlcmZzX2FkZF9vcmRlcmVkX2xpc3QoaW5vZGUsIGJoKTsKKwlicmVsc2UoYmgpOworCW9mZnNldCA9IDA7CisJdG93cml0ZSAtPSB0b2NvcHk7CisJZGF0YSArPSB0b2NvcHk7CisJYmxrKys7CisgICAgfQorb3V0OgorICAgIGlmIChsZW4gPT0gdG93cml0ZSkKKwlyZXR1cm4gZXJyOworICAgIGlmIChpbm9kZS0+aV9zaXplIDwgb2ZmK2xlbi10b3dyaXRlKQorCWlfc2l6ZV93cml0ZShpbm9kZSwgb2ZmK2xlbi10b3dyaXRlKTsKKyAgICBpbm9kZS0+aV92ZXJzaW9uKys7CisgICAgaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKKyAgICBtYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKyAgICB1cCgmaW5vZGUtPmlfc2VtKTsKKyAgICByZXR1cm4gbGVuIC0gdG93cml0ZTsKK30KKworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sqCitnZXRfc3VwZXJfYmxvY2sgKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLCBpbnQgZmxhZ3MsCisJCSBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gZ2V0X3NiX2JkZXYoZnNfdHlwZSwgZmxhZ3MsIGRldl9uYW1lLCBkYXRhLCByZWlzZXJmc19maWxsX3N1cGVyKTsKK30KKworc3RhdGljIGludCBfX2luaXQKK2luaXRfcmVpc2VyZnNfZnMgKCB2b2lkICkKK3sKKwlpbnQgcmV0OworCisJaWYgKChyZXQgPSBpbml0X2lub2RlY2FjaGUgKCkpKSB7CisJCXJldHVybiByZXQ7CisJfQorCisgICAgICAgIGlmICgocmV0ID0gcmVpc2VyZnNfeGF0dHJfcmVnaXN0ZXJfaGFuZGxlcnMgKCkpKQorICAgICAgICAgICAgZ290byBmYWlsZWRfcmVpc2VyZnNfeGF0dHJfcmVnaXN0ZXJfaGFuZGxlcnM7CisKKwlyZWlzZXJmc19wcm9jX2luZm9fZ2xvYmFsX2luaXQgKCk7CisJcmVpc2VyZnNfcHJvY19yZWdpc3Rlcl9nbG9iYWwgKCJ2ZXJzaW9uIiwgcmVpc2VyZnNfZ2xvYmFsX3ZlcnNpb25faW5fcHJvYyk7CisKKyAgICAgICAgcmV0ID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSAoJiByZWlzZXJmc19mc190eXBlKTsKKworCWlmIChyZXQgPT0gMCkgeworCQlyZXR1cm4gMDsKKwl9CisKKyAgICAgICAgcmVpc2VyZnNfeGF0dHJfdW5yZWdpc3Rlcl9oYW5kbGVycyAoKTsKKworZmFpbGVkX3JlaXNlcmZzX3hhdHRyX3JlZ2lzdGVyX2hhbmRsZXJzOgorCXJlaXNlcmZzX3Byb2NfdW5yZWdpc3Rlcl9nbG9iYWwgKCJ2ZXJzaW9uIik7CisJcmVpc2VyZnNfcHJvY19pbmZvX2dsb2JhbF9kb25lICgpOworCWRlc3Ryb3lfaW5vZGVjYWNoZSAoKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAorZXhpdF9yZWlzZXJmc19mcyAoIHZvaWQgKQoreworICAgICAgICByZWlzZXJmc194YXR0cl91bnJlZ2lzdGVyX2hhbmRsZXJzICgpOworCXJlaXNlcmZzX3Byb2NfdW5yZWdpc3Rlcl9nbG9iYWwgKCJ2ZXJzaW9uIik7CisJcmVpc2VyZnNfcHJvY19pbmZvX2dsb2JhbF9kb25lICgpOworICAgICAgICB1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0gKCYgcmVpc2VyZnNfZnNfdHlwZSk7CisJZGVzdHJveV9pbm9kZWNhY2hlICgpOworfQorCitzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSByZWlzZXJmc19mc190eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAicmVpc2VyZnMiLAorCS5nZXRfc2IJCT0gZ2V0X3N1cGVyX2Jsb2NrLAorCS5raWxsX3NiCT0ga2lsbF9ibG9ja19zdXBlciwKKwkuZnNfZmxhZ3MJPSBGU19SRVFVSVJFU19ERVYsCit9OworCitNT0RVTEVfREVTQ1JJUFRJT04gKCJSZWlzZXJGUyBqb3VybmFsZWQgZmlsZXN5c3RlbSIpOworTU9EVUxFX0FVVEhPUiAgICAgICgiSGFucyBSZWlzZXIgPHJlaXNlckBuYW1lc3lzLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFICAgICAoIkdQTCIpOworCittb2R1bGVfaW5pdCAoaW5pdF9yZWlzZXJmc19mcyk7Cittb2R1bGVfZXhpdCAoZXhpdF9yZWlzZXJmc19mcyk7CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy90YWlsX2NvbnZlcnNpb24uYyBiL2ZzL3JlaXNlcmZzL3RhaWxfY29udmVyc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxOTE5MDkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9yZWlzZXJmcy90YWlsX2NvbnZlcnNpb24uYwpAQCAtMCwwICsxLDI3NiBAQAorLyoKKyAqIENvcHlyaWdodCAxOTk5IEhhbnMgUmVpc2VyLCBzZWUgcmVpc2VyZnMvUkVBRE1FIGZvciBsaWNlbnNpbmcgYW5kIGNvcHlyaWdodCBkZXRhaWxzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc19mcy5oPgorCisvKiBhY2Nlc3MgdG8gdGFpbCA6IHdoZW4gb25lIGlzIGdvaW5nIHRvIHJlYWQgdGFpbCBpdCBtdXN0IG1ha2Ugc3VyZSwgdGhhdCBpcyBub3QgcnVubmluZy4KKyBkaXJlY3QyaW5kaXJlY3QgYW5kIGluZGlyZWN0MmRpcmVjdCBjYW4gbm90IHJ1biBjb25jdXJyZW50bHkgKi8KKworCisvKiBDb252ZXJ0cyBkaXJlY3QgaXRlbXMgdG8gYW4gdW5mb3JtYXR0ZWQgbm9kZS4gUGFuaWNzIGlmIGZpbGUgaGFzIG5vCisgICB0YWlsLiAtRU5PU1BDIGlmIG5vIGRpc2sgc3BhY2UgZm9yIGNvbnZlcnNpb24gKi8KKy8qIHBhdGggcG9pbnRzIHRvIGZpcnN0IGRpcmVjdCBpdGVtIG9mIHRoZSBmaWxlIHJlZ2FybGVzcyBvZiBob3cgbWFueSBvZgorICAgdGhlbSBhcmUgdGhlcmUgKi8KK2ludCBkaXJlY3QyaW5kaXJlY3QgKHN0cnVjdCByZWlzZXJmc190cmFuc2FjdGlvbl9oYW5kbGUgKnRoLCBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgCisJCSAgICAgc3RydWN0IHBhdGggKiBwYXRoLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiB1bmJoLAorCQkgICAgIGxvZmZfdCB0YWlsX29mZnNldCkKK3sKKyAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiA9IGlub2RlLT5pX3NiOworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqdXBfdG9fZGF0ZV9iaCA7CisgICAgc3RydWN0IGl0ZW1faGVhZCAqIHBfbGVfaWggPSBQQVRIX1BJVEVNX0hFQUQgKHBhdGgpOworICAgIHVuc2lnbmVkIGxvbmcgdG90YWxfdGFpbCA9IDAgOworICAgIHN0cnVjdCBjcHVfa2V5IGVuZF9rZXk7ICAvKiBLZXkgdG8gc2VhcmNoIGZvciB0aGUgbGFzdCBieXRlIG9mIHRoZQorCQkJCWNvbnZlcnRlZCBpdGVtLiAqLworICAgIHN0cnVjdCBpdGVtX2hlYWQgaW5kX2loOyAvKiBuZXcgaW5kaXJlY3QgaXRlbSB0byBiZSBpbnNlcnRlZCBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgb2YgdW5mbSBwb2ludGVyIHRvIGJlIHBhc3RlZCAqLworICAgIGludAluX2Jsa19zaXplLAorICAgICAgbl9yZXR2YWw7CSAgLyogcmV0dXJuZWQgdmFsdWUgZm9yIHJlaXNlcmZzX2luc2VydF9pdGVtIGFuZCBjbG9uZXMgKi8KKyAgICB1bnBfdCB1bmZtX3B0cjsgIC8qIEhhbmRsZSBvbiBhbiB1bmZvcm1hdHRlZCBub2RlCisJCQkJICAgICAgIHRoYXQgd2lsbCBiZSBpbnNlcnRlZCBpbiB0aGUKKwkJCQkgICAgICAgdHJlZS4gKi8KKworICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKworICAgIFJFSVNFUkZTX1NCKHNiKS0+c19kaXJlY3QyaW5kaXJlY3QgKys7CisKKyAgICBuX2Jsa19zaXplID0gc2ItPnNfYmxvY2tzaXplOworCisgICAgLyogYW5kIGtleSB0byBzZWFyY2ggZm9yIGFwcGVuZCBvciBpbnNlcnQgcG9pbnRlciB0byB0aGUgbmV3CisgICAgICAgdW5mb3JtYXR0ZWQgbm9kZS4gKi8KKyAgICBjb3B5X2l0ZW1faGVhZCAoJmluZF9paCwgcF9sZV9paCk7CisgICAgc2V0X2xlX2loX2tfb2Zmc2V0ICgmaW5kX2loLCB0YWlsX29mZnNldCk7CisgICAgc2V0X2xlX2loX2tfdHlwZSAoJmluZF9paCwgVFlQRV9JTkRJUkVDVCk7CisKKyAgICAvKiBTZXQgdGhlIGtleSB0byBzZWFyY2ggZm9yIHRoZSBwbGFjZSBmb3IgbmV3IHVuZm0gcG9pbnRlciAqLworICAgIG1ha2VfY3B1X2tleSAoJmVuZF9rZXksIGlub2RlLCB0YWlsX29mZnNldCwgVFlQRV9JTkRJUkVDVCwgNCk7CisKKyAgICAvLyBGSVhNRTogd2UgY291bGQgYXZvaWQgdGhpcyAKKyAgICBpZiAoIHNlYXJjaF9mb3JfcG9zaXRpb25fYnlfa2V5IChzYiwgJmVuZF9rZXksIHBhdGgpID09IFBPU0lUSU9OX0ZPVU5EICkgeworCXJlaXNlcmZzX3dhcm5pbmcgKHNiLCAiUEFQLTE0MDMwOiBkaXJlY3QyaW5kaXJlY3Q6ICIKKwkJCSJwYXN0ZWQgb3IgaW5zZXJ0ZWQgYnl0ZSBleGlzdHMgaW4gdGhlIHRyZWUgJUsuICIKKwkJCSJVc2UgZnNjayB0byByZXBhaXIuIiwgJmVuZF9rZXkpOworCXBhdGhyZWxzZShwYXRoKTsKKwlyZXR1cm4gLUVJTzsKKyAgICB9CisgICAgCisgICAgcF9sZV9paCA9IFBBVEhfUElURU1fSEVBRCAocGF0aCk7CisKKyAgICB1bmZtX3B0ciA9IGNwdV90b19sZTMyICh1bmJoLT5iX2Jsb2NrbnIpOworICAgIAorICAgIGlmICggaXNfc3RhdGRhdGFfbGVfaWggKHBfbGVfaWgpICkgIHsKKwkvKiBJbnNlcnQgbmV3IGluZGlyZWN0IGl0ZW0uICovCisJc2V0X2loX2ZyZWVfc3BhY2UgKCZpbmRfaWgsIDApOyAvKiBkZWxldGUgYXQgbmVhcmVzdCBmdXR1cmUgKi8KKyAgICAgICAgcHV0X2loX2l0ZW1fbGVuKCAmaW5kX2loLCBVTkZNX1BfU0laRSApOworCVBBVEhfTEFTVF9QT1NJVElPTiAocGF0aCkrKzsKKwluX3JldHZhbCA9IHJlaXNlcmZzX2luc2VydF9pdGVtICh0aCwgcGF0aCwgJmVuZF9rZXksICZpbmRfaWgsIGlub2RlLAorCQkJCQkgKGNoYXIgKikmdW5mbV9wdHIpOworICAgIH0gZWxzZSB7CisJLyogUGFzdGUgaW50byBsYXN0IGluZGlyZWN0IGl0ZW0gb2YgYW4gb2JqZWN0LiAqLworCW5fcmV0dmFsID0gcmVpc2VyZnNfcGFzdGVfaW50b19pdGVtKHRoLCBwYXRoLCAmZW5kX2tleSwgaW5vZGUsCisJCQkJCSAgICAoY2hhciAqKSZ1bmZtX3B0ciwgVU5GTV9QX1NJWkUpOworICAgIH0KKyAgICBpZiAoIG5fcmV0dmFsICkgeworCXJldHVybiBuX3JldHZhbDsKKyAgICB9CisKKyAgICAvLyBub3RlOiBmcm9tIGhlcmUgdGhlcmUgYXJlIHR3byBrZXlzIHdoaWNoIGhhdmUgbWF0Y2hpbmcgZmlyc3QKKyAgICAvLyB0aHJlZSBrZXkgY29tcG9uZW50cy4gVGhleSBvbmx5IGRpZmZlciBieSB0aGUgZm91cnRoIG9uZS4KKworCisgICAgLyogU2V0IHRoZSBrZXkgdG8gc2VhcmNoIGZvciB0aGUgZGlyZWN0IGl0ZW1zIG9mIHRoZSBmaWxlICovCisgICAgbWFrZV9jcHVfa2V5ICgmZW5kX2tleSwgaW5vZGUsIG1heF9yZWlzZXJmc19vZmZzZXQgKGlub2RlKSwgVFlQRV9ESVJFQ1QsIDQpOworCisgICAgLyogTW92ZSBieXRlcyBmcm9tIHRoZSBkaXJlY3QgaXRlbXMgdG8gdGhlIG5ldyB1bmZvcm1hdHRlZCBub2RlCisgICAgICAgYW5kIGRlbGV0ZSB0aGVtLiAqLworICAgIHdoaWxlICgxKSAgeworCWludCB0YWlsX3NpemU7CisKKwkvKiBlbmRfa2V5Lmtfb2Zmc2V0IGlzIHNldCBzbywgdGhhdCB3ZSB3aWxsIGFsd2F5cyBoYXZlIGZvdW5kCisgICAgICAgICAgIGxhc3QgaXRlbSBvZiB0aGUgZmlsZSAqLworCWlmICggc2VhcmNoX2Zvcl9wb3NpdGlvbl9ieV9rZXkgKHNiLCAmZW5kX2tleSwgcGF0aCkgPT0gUE9TSVRJT05fRk9VTkQgKQorCSAgICByZWlzZXJmc19wYW5pYyAoc2IsICJQQVAtMTQwNTA6IGRpcmVjdDJpbmRpcmVjdDogIgorCQkJICAgICJkaXJlY3QgaXRlbSAoJUspIG5vdCBmb3VuZCIsICZlbmRfa2V5KTsKKwlwX2xlX2loID0gUEFUSF9QSVRFTV9IRUFEIChwYXRoKTsKKwlSRkFMU0UoICFpc19kaXJlY3RfbGVfaWggKHBfbGVfaWgpLAorCSAgICAgICAgInZzLTE0MDU1OiBkaXJlY3QgaXRlbSBleHBlY3RlZCglSyksIGZvdW5kICVoIiwKKyAgICAgICAgICAgICAgICAmZW5kX2tleSwgcF9sZV9paCk7CisgICAgICAgIHRhaWxfc2l6ZSA9IChsZV9paF9rX29mZnNldCAocF9sZV9paCkgJiAobl9ibGtfc2l6ZSAtIDEpKQorICAgICAgICAgICAgKyBpaF9pdGVtX2xlbihwX2xlX2loKSAtIDE7CisKKwkvKiB3ZSBvbmx5IHNlbmQgdGhlIHVuYmggcG9pbnRlciBpZiB0aGUgYnVmZmVyIGlzIG5vdCB1cCB0byBkYXRlLgorCSoqIHRoaXMgYXZvaWRzIG92ZXJ3cml0aW5nIGdvb2QgZGF0YSBmcm9tIHdyaXRlcGFnZSgpIHdpdGggb2xkIGRhdGEKKwkqKiBmcm9tIHRoZSBkaXNrIG9yIGJ1ZmZlciBjYWNoZQorCSoqIFNwZWNpYWwgY2FzZTogdW5iaC0+Yl9wYWdlIHdpbGwgYmUgTlVMTCBpZiB3ZSBhcmUgY29taW5nIHRocm91Z2gKKwkqKiBESVJFQ1RfSU8gaGFuZGxlciBoZXJlLgorCSovCisJaWYgKCF1bmJoLT5iX3BhZ2UgfHwgYnVmZmVyX3VwdG9kYXRlKHVuYmgpIHx8IFBhZ2VVcHRvZGF0ZSh1bmJoLT5iX3BhZ2UpKSB7CisJICAgIHVwX3RvX2RhdGVfYmggPSBOVUxMIDsKKwl9IGVsc2UgeworCSAgICB1cF90b19kYXRlX2JoID0gdW5iaCA7CisJfQorCW5fcmV0dmFsID0gcmVpc2VyZnNfZGVsZXRlX2l0ZW0gKHRoLCBwYXRoLCAmZW5kX2tleSwgaW5vZGUsIAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwX3RvX2RhdGVfYmgpIDsKKworCXRvdGFsX3RhaWwgKz0gbl9yZXR2YWwgOworCWlmICh0YWlsX3NpemUgPT0gbl9yZXR2YWwpCisJICAgIC8vIGRvbmU6IGZpbGUgZG9lcyBub3QgaGF2ZSBkaXJlY3QgaXRlbXMgYW55bW9yZQorCSAgICBicmVhazsKKworICAgIH0KKyAgICAvKiBpZiB3ZSd2ZSBjb3BpZWQgYnl0ZXMgZnJvbSBkaXNrIGludG8gdGhlIHBhZ2UsIHdlIG5lZWQgdG8gemVybworICAgICoqIG91dCB0aGUgdW51c2VkIHBhcnQgb2YgdGhlIGJsb2NrIChpdCB3YXMgbm90IHVwIHRvIGRhdGUgYmVmb3JlKQorICAgICovCisgICAgaWYgKHVwX3RvX2RhdGVfYmgpIHsKKyAgICAgICAgdW5zaWduZWQgcGdvZmYgPSAodGFpbF9vZmZzZXQgKyB0b3RhbF90YWlsIC0gMSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7CisJY2hhciAqa2FkZHI9a21hcF9hdG9taWModXBfdG9fZGF0ZV9iaC0+Yl9wYWdlLCBLTV9VU0VSMCk7CisJbWVtc2V0KGthZGRyICsgcGdvZmYsIDAsIG5fYmxrX3NpemUgLSB0b3RhbF90YWlsKSA7CisJa3VubWFwX2F0b21pYyhrYWRkciwgS01fVVNFUjApOworICAgIH0KKworICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZpcnN0X2RpcmVjdF9ieXRlID0gVTMyX01BWDsKKworICAgIHJldHVybiAwOworfQorCisKKy8qIHN0b2xlbiBmcm9tIGZzL2J1ZmZlci5jICovCit2b2lkIHJlaXNlcmZzX3VubWFwX2J1ZmZlcihzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKSB7CisgICAgbG9ja19idWZmZXIoYmgpIDsKKyAgICBpZiAoYnVmZmVyX2pvdXJuYWxlZChiaCkgfHwgYnVmZmVyX2pvdXJuYWxfZGlydHkoYmgpKSB7CisgICAgICBCVUcoKSA7CisgICAgfQorICAgIGNsZWFyX2J1ZmZlcl9kaXJ0eShiaCkgOworICAgIC8qIFJlbW92ZSB0aGUgYnVmZmVyIGZyb20gd2hhdGV2ZXIgbGlzdCBpdCBiZWxvbmdzIHRvLiBXZSBhcmUgbW9zdGx5CisgICAgICAgaW50ZXJlc3RlZCBpbiByZW1vdmluZyBpdCBmcm9tIHBlci1zYiBqX2RpcnR5X2J1ZmZlcnMgbGlzdCwgdG8gYXZvaWQKKyAgICAgICAgQlVHKCkgb24gYXR0ZW1wdCB0byB3cml0ZSBub3QgbWFwcGVkIGJ1ZmZlciAqLworICAgIGlmICggKCFsaXN0X2VtcHR5KCZiaC0+Yl9hc3NvY19idWZmZXJzKSB8fCBiaC0+Yl9wcml2YXRlKSAmJiBiaC0+Yl9wYWdlKSB7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGJoLT5iX3BhZ2UtPm1hcHBpbmctPmhvc3Q7CisJc3RydWN0IHJlaXNlcmZzX2pvdXJuYWwgKmogPSBTQl9KT1VSTkFMKGlub2RlLT5pX3NiKTsKKwlzcGluX2xvY2soJmotPmpfZGlydHlfYnVmZmVyc19sb2NrKTsKKwlsaXN0X2RlbF9pbml0KCZiaC0+Yl9hc3NvY19idWZmZXJzKTsKKwlyZWlzZXJmc19mcmVlX2poKGJoKTsKKwlzcGluX3VubG9jaygmai0+al9kaXJ0eV9idWZmZXJzX2xvY2spOworICAgIH0KKyAgICBjbGVhcl9idWZmZXJfbWFwcGVkKGJoKSA7CisgICAgY2xlYXJfYnVmZmVyX3JlcShiaCkgOworICAgIGNsZWFyX2J1ZmZlcl9uZXcoYmgpOworICAgIGJoLT5iX2JkZXYgPSBOVUxMOworICAgIHVubG9ja19idWZmZXIoYmgpIDsKK30KKworLyogdGhpcyBmaXJzdCBsb2NrcyBpbm9kZSAobmVpdGhlciByZWFkcyBub3Igc3luYyBhcmUgcGVybWl0dGVkKSwKKyAgIHJlYWRzIHRhaWwgdGhyb3VnaCBwYWdlIGNhY2hlLCBpbnNlcnQgZGlyZWN0IGl0ZW0uIFdoZW4gZGlyZWN0IGl0ZW0KKyAgIGluc2VydGVkIHN1Y2Nlc3NmdWxseSBpbm9kZSBpcyBsZWZ0IGxvY2tlZC4gUmV0dXJuIHZhbHVlIGlzIGFsd2F5cworICAgd2hhdCB3ZSBleHBlY3QgZnJvbSBpdCAobnVtYmVyIG9mIGN1dCBieXRlcykuIEJ1dCB3aGVuIHRhaWwgcmVtYWlucworICAgaW4gdGhlIHVuZm9ybWF0dGVkIG5vZGUsIHdlIHNldCBtb2RlIHRvIFNLSVBfQkFMQU5DSU5HIGFuZCB1bmxvY2sKKyAgIGlub2RlICovCitpbnQgaW5kaXJlY3QyZGlyZWN0IChzdHJ1Y3QgcmVpc2VyZnNfdHJhbnNhY3Rpb25faGFuZGxlICp0aCwgCisJCSAgICAgc3RydWN0IGlub2RlICogcF9zX2lub2RlLAorCQkgICAgIHN0cnVjdCBwYWdlICpwYWdlLCAKKwkJICAgICBzdHJ1Y3QgcGF0aCAqIHBfc19wYXRoLCAvKiBwYXRoIHRvIHRoZSBpbmRpcmVjdCBpdGVtLiAqLworCQkgICAgIGNvbnN0IHN0cnVjdCBjcHVfa2V5ICogcF9zX2l0ZW1fa2V5LCAvKiBLZXkgdG8gbG9vayBmb3IgdW5mb3JtYXR0ZWQgbm9kZSBwb2ludGVyIHRvIGJlIGN1dC4gKi8KKwkJICAgICBsb2ZmX3Qgbl9uZXdfZmlsZV9zaXplLCAvKiBOZXcgZmlsZSBzaXplLiAqLworCQkgICAgIGNoYXIgKiBwX2NfbW9kZSkKK3sKKyAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBwX3Nfc2IgPSBwX3NfaW5vZGUtPmlfc2I7CisgICAgc3RydWN0IGl0ZW1faGVhZCAgICAgIHNfaWg7CisgICAgdW5zaWduZWQgbG9uZyBuX2Jsb2NrX3NpemUgPSBwX3Nfc2ItPnNfYmxvY2tzaXplOworICAgIGNoYXIgKiB0YWlsOworICAgIGludCB0YWlsX2xlbiwgcm91bmRfdGFpbF9sZW47CisgICAgbG9mZl90IHBvcywgcG9zMTsgLyogcG9zaXRpb24gb2YgZmlyc3QgYnl0ZSBvZiB0aGUgdGFpbCAqLworICAgIHN0cnVjdCBjcHVfa2V5IGtleTsKKworICAgIEJVR19PTiAoIXRoLT50X3RyYW5zX2lkKTsKKworICAgIFJFSVNFUkZTX1NCKHBfc19zYiktPnNfaW5kaXJlY3QyZGlyZWN0ICsrOworCisgICAgKnBfY19tb2RlID0gTV9TS0lQX0JBTEFOQ0lORzsKKworICAgIC8qIHN0b3JlIGl0ZW0gaGVhZCBwYXRoIHBvaW50cyB0by4gKi8KKyAgICBjb3B5X2l0ZW1faGVhZCAoJnNfaWgsIFBBVEhfUElURU1fSEVBRChwX3NfcGF0aCkpOworCisgICAgdGFpbF9sZW4gPSAobl9uZXdfZmlsZV9zaXplICYgKG5fYmxvY2tfc2l6ZSAtIDEpKTsKKyAgICBpZiAoZ2V0X2lub2RlX3NkX3ZlcnNpb24gKHBfc19pbm9kZSkgPT0gU1RBVF9EQVRBX1YyKQorCXJvdW5kX3RhaWxfbGVuID0gUk9VTkRfVVAgKHRhaWxfbGVuKTsKKyAgICBlbHNlCisJcm91bmRfdGFpbF9sZW4gPSB0YWlsX2xlbjsKKworICAgIHBvcyA9IGxlX2loX2tfb2Zmc2V0ICgmc19paCkgLSAxICsgKGloX2l0ZW1fbGVuKCZzX2loKSAvIFVORk1fUF9TSVpFIC0gMSkgKiBwX3Nfc2ItPnNfYmxvY2tzaXplOworICAgIHBvczEgPSBwb3M7CisKKyAgICAvLyB3ZSBhcmUgcHJvdGVjdGVkIGJ5IGlfc2VtLiBUaGUgdGFpbCBjYW4gbm90IGRpc2FwcGVyLCBub3QKKyAgICAvLyBhcHBlbmQgY2FuIGJlIGRvbmUgZWl0aGVyCisgICAgLy8gd2UgYXJlIGluIHRydW5jYXRlIG9yIHBhY2tpbmcgdGFpbCBpbiBmaWxlX3JlbGVhc2UKKworICAgIHRhaWwgPSAoY2hhciAqKWttYXAocGFnZSkgOyAvKiB0aGlzIGNhbiBzY2hlZHVsZSAqLworCisgICAgaWYgKHBhdGhfY2hhbmdlZCAoJnNfaWgsIHBfc19wYXRoKSkgeworCS8qIHJlLXNlYXJjaCBpbmRpcmVjdCBpdGVtICovCisJaWYgKCBzZWFyY2hfZm9yX3Bvc2l0aW9uX2J5X2tleSAocF9zX3NiLCBwX3NfaXRlbV9rZXksIHBfc19wYXRoKSA9PSBQT1NJVElPTl9OT1RfRk9VTkQgKQorCSAgICByZWlzZXJmc19wYW5pYyhwX3Nfc2IsICJQQVAtNTUyMDogaW5kaXJlY3QyZGlyZWN0OiAiCisJCQkgICAiaXRlbSB0byBiZSBjb252ZXJ0ZWQgJUsgZG9lcyBub3QgZXhpc3QiLCBwX3NfaXRlbV9rZXkpOworCWNvcHlfaXRlbV9oZWFkKCZzX2loLCBQQVRIX1BJVEVNX0hFQUQocF9zX3BhdGgpKTsKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfQ0hFQ0sKKwlwb3MgPSBsZV9paF9rX29mZnNldCAoJnNfaWgpIC0gMSArIAorCSAgICAoaWhfaXRlbV9sZW4oJnNfaWgpIC8gVU5GTV9QX1NJWkUgLSAxKSAqIHBfc19zYi0+c19ibG9ja3NpemU7CisJaWYgKHBvcyAhPSBwb3MxKQorCSAgICByZWlzZXJmc19wYW5pYyAocF9zX3NiLCAidnMtNTUzMDogaW5kaXJlY3QyZGlyZWN0OiAiCisJCQkgICAgInRhaWwgcG9zaXRpb24gY2hhbmdlZCB3aGlsZSB3ZSB3ZXJlIHJlYWRpbmcgaXQiKTsKKyNlbmRpZgorICAgIH0KKworCisgICAgLyogU2V0IGRpcmVjdCBpdGVtIGhlYWRlciB0byBpbnNlcnQuICovCisgICAgbWFrZV9sZV9pdGVtX2hlYWQgKCZzX2loLCBOVUxMLCBnZXRfaW5vZGVfaXRlbV9rZXlfdmVyc2lvbiAocF9zX2lub2RlKSwgcG9zMSArIDEsCisJCSAgICAgICBUWVBFX0RJUkVDVCwgcm91bmRfdGFpbF9sZW4sIDB4ZmZmZi8qaWhfZnJlZV9zcGFjZSovKTsKKworICAgIC8qIHdlIHdhbnQgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBieXRlIG9mIHRoZSB0YWlsIGluIHRoZSBwYWdlLgorICAgICoqIHRoZSBwYWdlIHdhcyBsb2NrZWQgYW5kIHRoaXMgcGFydCBvZiB0aGUgcGFnZSB3YXMgdXAgdG8gZGF0ZSB3aGVuCisgICAgKiogaW5kaXJlY3QyZGlyZWN0IHdhcyBjYWxsZWQsIHNvIHdlIGtub3cgdGhlIGJ5dGVzIGFyZSBzdGlsbCB2YWxpZAorICAgICovCisgICAgdGFpbCA9IHRhaWwgKyAocG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKSA7CisKKyAgICBQQVRIX0xBU1RfUE9TSVRJT04ocF9zX3BhdGgpKys7CisKKyAgICBrZXkgPSAqcF9zX2l0ZW1fa2V5OworICAgIHNldF9jcHVfa2V5X2tfdHlwZSAoJmtleSwgVFlQRV9ESVJFQ1QpOworICAgIGtleS5rZXlfbGVuZ3RoID0gNDsKKyAgICAvKiBJbnNlcnQgdGFpbCBhcyBuZXcgZGlyZWN0IGl0ZW0gaW4gdGhlIHRyZWUgKi8KKyAgICBpZiAoIHJlaXNlcmZzX2luc2VydF9pdGVtKHRoLCBwX3NfcGF0aCwgJmtleSwgJnNfaWgsIHBfc19pbm9kZSwKKwkJCSAgICAgIHRhaWwgPyB0YWlsIDogTlVMTCkgPCAwICkgeworCS8qIE5vIGRpc2sgbWVtb3J5LiBTbyB3ZSBjYW4gbm90IGNvbnZlcnQgbGFzdCB1bmZvcm1hdHRlZCBub2RlCisJICAgdG8gdGhlIGRpcmVjdCBpdGVtLiAgSW4gdGhpcyBjYXNlIHdlIHVzZWQgdG8gYWRqdXN0CisJICAgaW5kaXJlY3QgaXRlbXMncyBpaF9mcmVlX3NwYWNlLiBOb3cgaWhfZnJlZV9zcGFjZSBpcyBub3QKKwkgICB1c2VkLCBpdCB3b3VsZCBiZSBpZGVhbCB0byB3cml0ZSB6ZXJvcyB0byBjb3JyZXNwb25kaW5nCisJICAgdW5mb3JtYXR0ZWQgbm9kZS4gRm9yIG5vdyBpX3NpemUgaXMgY29uc2lkZXJlZCBhcyBndWFyZCBmb3IKKwkgICBnb2luZyBvdXQgb2YgZmlsZSBzaXplICovCisJa3VubWFwKHBhZ2UpIDsKKwlyZXR1cm4gbl9ibG9ja19zaXplIC0gcm91bmRfdGFpbF9sZW47CisgICAgfQorICAgIGt1bm1hcChwYWdlKSA7CisKKyAgICAvKiBtYWtlIHN1cmUgdG8gZ2V0IHRoZSBpX2Jsb2NrcyBjaGFuZ2VzIGZyb20gcmVpc2VyZnNfaW5zZXJ0X2l0ZW0gKi8KKyAgICByZWlzZXJmc191cGRhdGVfc2QodGgsIHBfc19pbm9kZSk7CisKKyAgICAvLyBub3RlOiB3ZSBoYXZlIG5vdyB0aGUgc2FtZSBhcyBpbiBhYm92ZSBkaXJlY3QyaW5kaXJlY3QKKyAgICAvLyBjb252ZXJzaW9uOiB0aGVyZSBhcmUgdHdvIGtleXMgd2hpY2ggaGF2ZSBtYXRjaGluZyBmaXJzdCB0aHJlZQorICAgIC8vIGtleSBjb21wb25lbnRzLiBUaGV5IG9ubHkgZGlmZmVyIGJ5IHRoZSBmb3VodGggb25lLgorCisgICAgLyogV2UgaGF2ZSBpbnNlcnRlZCBuZXcgZGlyZWN0IGl0ZW0gYW5kIG11c3QgcmVtb3ZlIGxhc3QKKyAgICAgICB1bmZvcm1hdHRlZCBub2RlLiAqLworICAgICpwX2NfbW9kZSA9IE1fQ1VUOworCisgICAgLyogd2Ugc3RvcmUgcG9zaXRpb24gb2YgZmlyc3QgZGlyZWN0IGl0ZW0gaW4gdGhlIGluLWNvcmUgaW5vZGUgKi8KKyAgICAvL21hcmtfZmlsZV93aXRoX3RhaWwgKHBfc19pbm9kZSwgcG9zMSArIDEpOworICAgIFJFSVNFUkZTX0kocF9zX2lub2RlKS0+aV9maXJzdF9kaXJlY3RfYnl0ZSA9IHBvczEgKyAxOworCisgICAgcmV0dXJuIG5fYmxvY2tfc2l6ZSAtIHJvdW5kX3RhaWxfbGVuOworfQorCisKKwpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMveGF0dHIuYyBiL2ZzL3JlaXNlcmZzL3hhdHRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU1ODJmZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3JlaXNlcmZzL3hhdHRyLmMKQEAgLTAsMCArMSwxNDUwIEBACisvKgorICogbGludXgvZnMvcmVpc2VyZnMveGF0dHIuYworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBieSBKZWZmIE1haG9uZXksIDxqZWZmbUBzdXNlLmNvbT4KKyAqCisgKi8KKworLyoKKyAqIEluIG9yZGVyIHRvIGltcGxlbWVudCBFQS9BQ0xzIGluIGEgY2xlYW4sIGJhY2t3YXJkcyBjb21wYXRpYmxlIG1hbm5lciwKKyAqIHRoZXkgYXJlIGltcGxlbWVudGVkIGFzIGZpbGVzIGluIGEgInByaXZhdGUiIGRpcmVjdG9yeS4KKyAqIEVhY2ggRUEgaXMgaW4gaXQncyBvd24gZmlsZSwgd2l0aCB0aGUgZGlyZWN0b3J5IGxheW91dCBsaWtlIHNvICgvIGlzIGFzc3VtZWQKKyAqIHRvIGJlIHJlbGF0aXZlIHRvIGZzIHJvb3QpLiBJbnNpZGUgdGhlIC8ucmVpc2VyZnNfcHJpdi94YXR0cnMgZGlyZWN0b3J5LAorICogZGlyZWN0b3JpZXMgbmFtZWQgdXNpbmcgdGhlIGNhcGl0YWwtaGV4IGZvcm0gb2YgdGhlIG9iamVjdGlkIGFuZAorICogZ2VuZXJhdGlvbiBudW1iZXIgYXJlIHVzZWQuIEluc2lkZSBlYWNoIGRpcmVjdG9yeSBhcmUgaW5kaXZpZHVhbCBmaWxlcworICogbmFtZWQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlLgorICoKKyAqIFNvLCBmb3Igb2JqZWN0aWQgMTI2NDg0MzAsIHdlIGNvdWxkIGhhdmU6CisgKiAvLnJlaXNlcmZzX3ByaXYveGF0dHJzL0MwRkZFRS4wL3N5c3RlbS5wb3NpeF9hY2xfYWNjZXNzCisgKiAvLnJlaXNlcmZzX3ByaXYveGF0dHJzL0MwRkZFRS4wL3N5c3RlbS5wb3NpeF9hY2xfZGVmYXVsdAorICogLy5yZWlzZXJmc19wcml2L3hhdHRycy9DMEZGRUUuMC91c2VyLkNvbnRlbnQtVHlwZQorICogLi4gb3Igc2ltaWxhci4KKyAqCisgKiBUaGUgZmlsZSBjb250ZW50cyBhcmUgdGhlIHRleHQgb2YgdGhlIEVBLiBUaGUgc2l6ZSBpcyBrbm93biBiYXNlZCBvbiB0aGUKKyAqIHN0YXQgZGF0YSBkZXNjcmliaW5nIHRoZSBmaWxlLgorICoKKyAqIEluIHRoZSBjYXNlIG9mIHN5c3RlbS5wb3NpeF9hY2xfYWNjZXNzIGFuZCBzeXN0ZW0ucG9zaXhfYWNsX2RlZmF1bHQsIHNpbmNlCisgKiB0aGVzZSBhcmUgc3BlY2lhbCBjYXNlcyBmb3IgZmlsZXN5c3RlbSBBQ0xzLCB0aGV5IGFyZSBpbnRlcnByZXRlZCBieSB0aGUKKyAqIGtlcm5lbCwgaW4gYWRkaXRpb24sIHRoZXkgYXJlIG5lZ2F0aXZlbHkgYW5kIHBvc2l0aXZlbHkgY2FjaGVkIGFuZCBhdHRhY2hlZAorICogdG8gdGhlIGlub2RlIHNvIHRoYXQgdW5uZWNlc3NhcnkgbG9va3VwcyBhcmUgYXZvaWRlZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3hhdHRyLmg+CisjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfeGF0dHIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc19hY2wuaD4KKyNpbmNsdWRlIDxsaW51eC9tYmNhY2hlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKyNkZWZpbmUgRkxfUkVBRE9OTFkgMTI4CisjZGVmaW5lIEZMX0RJUl9TRU1fSEVMRCAyNTYKKyNkZWZpbmUgUFJJVlJPT1RfTkFNRSAiLnJlaXNlcmZzX3ByaXYiCisjZGVmaW5lIFhBUk9PVF9OQU1FICAgInhhdHRycyIKKworc3RhdGljIHN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyICpmaW5kX3hhdHRyX2hhbmRsZXJfcHJlZml4IChjb25zdCBjaGFyICpwcmVmaXgpOworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqCitjcmVhdGVfeGFfcm9vdCAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKyAgICBzdHJ1Y3QgZGVudHJ5ICpwcml2cm9vdCA9IGRnZXQgKFJFSVNFUkZTX1NCKHNiKS0+cHJpdl9yb290KTsKKyAgICBzdHJ1Y3QgZGVudHJ5ICp4YXJvb3Q7CisKKyAgICAvKiBUaGlzIG5lZWRzIHRvIGJlIGNyZWF0ZWQgYXQgbW91bnQtdGltZSAqLworICAgIGlmICghcHJpdnJvb3QpCisgICAgICAgIHJldHVybiBFUlJfUFRSKC1FT1BOT1RTVVBQKTsKKworICAgIHhhcm9vdCA9IGxvb2t1cF9vbmVfbGVuIChYQVJPT1RfTkFNRSwgcHJpdnJvb3QsIHN0cmxlbiAoWEFST09UX05BTUUpKTsKKyAgICBpZiAoSVNfRVJSICh4YXJvb3QpKSB7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0gZWxzZSBpZiAoIXhhcm9vdC0+ZF9pbm9kZSkgeworICAgICAgICBpbnQgZXJyOworICAgICAgICBkb3duICgmcHJpdnJvb3QtPmRfaW5vZGUtPmlfc2VtKTsKKyAgICAgICAgZXJyID0gcHJpdnJvb3QtPmRfaW5vZGUtPmlfb3AtPm1rZGlyIChwcml2cm9vdC0+ZF9pbm9kZSwgeGFyb290LCAwNzAwKTsKKyAgICAgICAgdXAgKCZwcml2cm9vdC0+ZF9pbm9kZS0+aV9zZW0pOworCisgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICAgIGRwdXQgKHhhcm9vdCk7CisgICAgICAgICAgICBkcHV0IChwcml2cm9vdCk7CisgICAgICAgICAgICByZXR1cm4gRVJSX1BUUiAoZXJyKTsKKyAgICAgICAgfQorICAgICAgICBSRUlTRVJGU19TQihzYiktPnhhdHRyX3Jvb3QgPSBkZ2V0ICh4YXJvb3QpOworICAgIH0KKworb3V0OgorICAgIGRwdXQgKHByaXZyb290KTsKKyAgICByZXR1cm4geGFyb290OworfQorCisvKiBUaGlzIHdpbGwgcmV0dXJuIGEgZGVudHJ5LCBvciBlcnJvciwgcmVmZXJpbmcgdG8gdGhlIHhhIHJvb3QgZGlyZWN0b3J5LgorICogSWYgdGhlIHhhIHJvb3QgZG9lc24ndCBleGlzdCB5ZXQsIHRoZSBkZW50cnkgd2lsbCBiZSByZXR1cm5lZCB3aXRob3V0CisgKiBhbiBhc3NvY2lhdGVkIGlub2RlLiBUaGlzIGRlbnRyeSBjYW4gYmUgdXNlZCB3aXRoIC0+bWtkaXIgdG8gY3JlYXRlCisgKiB0aGUgeGEgZGlyZWN0b3J5LiAqLworc3RhdGljIHN0cnVjdCBkZW50cnkgKgorX19nZXRfeGFfcm9vdCAoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQoreworICAgIHN0cnVjdCBkZW50cnkgKnByaXZyb290ID0gZGdldCAoUkVJU0VSRlNfU0IocyktPnByaXZfcm9vdCk7CisgICAgc3RydWN0IGRlbnRyeSAqeGFyb290ID0gTlVMTDsKKworICAgIGlmIChJU19FUlIgKHByaXZyb290KSB8fCAhcHJpdnJvb3QpCisgICAgICAgIHJldHVybiBwcml2cm9vdDsKKworICAgIHhhcm9vdCA9IGxvb2t1cF9vbmVfbGVuIChYQVJPT1RfTkFNRSwgcHJpdnJvb3QsIHN0cmxlbiAoWEFST09UX05BTUUpKTsKKyAgICBpZiAoSVNfRVJSICh4YXJvb3QpKSB7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0gZWxzZSBpZiAoIXhhcm9vdC0+ZF9pbm9kZSkgeworICAgICAgICBkcHV0ICh4YXJvb3QpOworICAgICAgICB4YXJvb3QgPSBOVUxMOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBSRUlTRVJGU19TQihzKS0+eGF0dHJfcm9vdCA9IGRnZXQgKHhhcm9vdCk7CisKK291dDoKKyAgICBkcHV0IChwcml2cm9vdCk7CisgICAgcmV0dXJuIHhhcm9vdDsKK30KKworLyogUmV0dXJucyB0aGUgZGVudHJ5IChvciBOVUxMKSByZWZlcnJpbmcgdG8gdGhlIHJvb3Qgb2YgdGhlIGV4dGVuZGVkCisgKiBhdHRyaWJ1dGUgZGlyZWN0b3J5IHRyZWUuIElmIGl0IGhhcyBhbHJlYWR5IGJlZW4gcmV0cmVpdmVkLCBpdCBpcyB1c2VkLgorICogT3RoZXJ3aXNlLCB3ZSBhdHRlbXB0IHRvIHJldHJlaXZlIGl0IGZyb20gZGlzay4gSXQgbWF5IGFsc28gcmV0dXJuCisgKiBhIHBvaW50ZXItZW5jb2RlZCBlcnJvci4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgZGVudHJ5ICoKK2dldF94YV9yb290IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCit7CisgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZGdldCAoUkVJU0VSRlNfU0IocyktPnhhdHRyX3Jvb3QpOworCisgICAgaWYgKCFkZW50cnkpCisgICAgICAgIGRlbnRyeSA9IF9fZ2V0X3hhX3Jvb3QgKHMpOworCisgICAgcmV0dXJuIGRlbnRyeTsKK30KKworLyogT3BlbnMgdGhlIGRpcmVjdG9yeSBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbm9kZSdzIGV4dGVuZGVkIGF0dHJpYnV0ZSBzdG9yZS4KKyAqIElmIGZsYWdzIGFsbG93LCB0aGUgdHJlZSB0byB0aGUgZGlyZWN0b3J5IG1heSBiZSBjcmVhdGVkLiBJZiBjcmVhdGlvbiBpcworICogcHJvaGliaXRlZCwgLUVOT0RBVEEgaXMgcmV0dXJuZWQuICovCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqCitvcGVuX3hhX2RpciAoY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZsYWdzKQoreworICAgIHN0cnVjdCBkZW50cnkgKnhhcm9vdCwgKnhhZGlyOworICAgIGNoYXIgbmFtZWJ1ZlsxN107CisKKyAgICB4YXJvb3QgPSBnZXRfeGFfcm9vdCAoaW5vZGUtPmlfc2IpOworICAgIGlmIChJU19FUlIgKHhhcm9vdCkpIHsKKyAgICAgICAgcmV0dXJuIHhhcm9vdDsKKyAgICB9IGVsc2UgaWYgKCF4YXJvb3QpIHsKKyAgICAgICAgaWYgKGZsYWdzID09IDAgfHwgZmxhZ3MgJiBYQVRUUl9DUkVBVEUpIHsKKyAgICAgICAgICAgIHhhcm9vdCA9IGNyZWF0ZV94YV9yb290IChpbm9kZS0+aV9zYik7CisgICAgICAgICAgICBpZiAoSVNfRVJSICh4YXJvb3QpKQorICAgICAgICAgICAgICAgIHJldHVybiB4YXJvb3Q7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF4YXJvb3QpCisgICAgICAgICAgICByZXR1cm4gRVJSX1BUUiAoLUVOT0RBVEEpOworICAgIH0KKworICAgIC8qIG9rLCB3ZSBoYXZlIHhhcm9vdCBvcGVuICovCisKKyAgICBzbnByaW50ZiAobmFtZWJ1Ziwgc2l6ZW9mIChuYW1lYnVmKSwgIiVYLiVYIiwKKyAgICAgICAgICAgICAgbGUzMl90b19jcHUgKElOT0RFX1BLRVkgKGlub2RlKS0+a19vYmplY3RpZCksCisgICAgICAgICAgICAgIGlub2RlLT5pX2dlbmVyYXRpb24pOworICAgIHhhZGlyID0gbG9va3VwX29uZV9sZW4gKG5hbWVidWYsIHhhcm9vdCwgc3RybGVuIChuYW1lYnVmKSk7CisgICAgaWYgKElTX0VSUiAoeGFkaXIpKSB7CisgICAgICAgIGRwdXQgKHhhcm9vdCk7CisgICAgICAgIHJldHVybiB4YWRpcjsKKyAgICB9CisKKyAgICBpZiAoIXhhZGlyLT5kX2lub2RlKSB7CisgICAgICAgIGludCBlcnI7CisgICAgICAgIGlmIChmbGFncyA9PSAwIHx8IGZsYWdzICYgWEFUVFJfQ1JFQVRFKSB7CisgICAgICAgICAgICAvKiBBbHRob3VnaCB0aGVyZSBpcyBub3RoaW5nIGVsc2UgdHJ5aW5nIHRvIGNyZWF0ZSB0aGlzIGRpcmVjdG9yeSwKKyAgICAgICAgICAgICAqIGFub3RoZXIgZGlyZWN0b3J5IHdpdGggdGhlIHNhbWUgaGFzaCBtYXkgYmUgY3JlYXRlZCwgc28gd2UgbmVlZAorICAgICAgICAgICAgICogdG8gcHJvdGVjdCBhZ2FpbnN0IHRoYXQgKi8KKyAgICAgICAgICAgIGVyciA9IHhhcm9vdC0+ZF9pbm9kZS0+aV9vcC0+bWtkaXIgKHhhcm9vdC0+ZF9pbm9kZSwgeGFkaXIsIDA3MDApOworICAgICAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgICAgIGRwdXQgKHhhcm9vdCk7CisgICAgICAgICAgICAgICAgZHB1dCAoeGFkaXIpOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJfUFRSIChlcnIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgheGFkaXItPmRfaW5vZGUpIHsKKyAgICAgICAgICAgIGRwdXQgKHhhcm9vdCk7CisgICAgICAgICAgICBkcHV0ICh4YWRpcik7CisgICAgICAgICAgICByZXR1cm4gRVJSX1BUUiAoLUVOT0RBVEEpOworICAgICAgICB9CisgICAgfQorCisgICAgZHB1dCAoeGFyb290KTsKKyAgICByZXR1cm4geGFkaXI7Cit9CisKKy8qIFJldHVybnMgYSBkZW50cnkgY29ycmVzcG9uZGluZyB0byBhIHNwZWNpZmljIGV4dGVuZGVkIGF0dHJpYnV0ZSBmaWxlCisgKiBmb3IgdGhlIGlub2RlLiBJZiBmbGFncyBhbGxvdywgdGhlIGZpbGUgaXMgY3JlYXRlZC4gT3RoZXJ3aXNlLCBhCisgKiB2YWxpZCBvciBuZWdhdGl2ZSBkZW50cnksIG9yIGFuIGVycm9yIGlzIHJldHVybmVkLiAqLworc3RhdGljIHN0cnVjdCBkZW50cnkgKgorZ2V0X3hhX2ZpbGVfZGVudHJ5IChjb25zdCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgZmxhZ3MpCit7CisgICAgc3RydWN0IGRlbnRyeSAqeGFkaXIsICp4YWZpbGU7CisgICAgaW50IGVyciA9IDA7CisKKyAgICB4YWRpciA9IG9wZW5feGFfZGlyIChpbm9kZSwgZmxhZ3MpOworICAgIGlmIChJU19FUlIgKHhhZGlyKSkgeworICAgICAgICByZXR1cm4gRVJSX1BUUiAoUFRSX0VSUiAoeGFkaXIpKTsKKyAgICB9IGVsc2UgaWYgKHhhZGlyICYmICF4YWRpci0+ZF9pbm9kZSkgeworICAgICAgICBkcHV0ICh4YWRpcik7CisgICAgICAgIHJldHVybiBFUlJfUFRSICgtRU5PREFUQSk7CisgICAgfQorCisgICAgeGFmaWxlID0gbG9va3VwX29uZV9sZW4gKG5hbWUsIHhhZGlyLCBzdHJsZW4gKG5hbWUpKTsKKyAgICBpZiAoSVNfRVJSICh4YWZpbGUpKSB7CisgICAgICAgIGRwdXQgKHhhZGlyKTsKKyAgICAgICAgcmV0dXJuIEVSUl9QVFIgKFBUUl9FUlIgKHhhZmlsZSkpOworICAgIH0KKworICAgIGlmICh4YWZpbGUtPmRfaW5vZGUpIHsgLyogZmlsZSBleGlzdHMgKi8KKyAgICAgICAgaWYgKGZsYWdzICYgWEFUVFJfQ1JFQVRFKSB7CisgICAgICAgICAgICBlcnIgPSAtRUVYSVNUOworICAgICAgICAgICAgZHB1dCAoeGFmaWxlKTsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChmbGFncyAmIFhBVFRSX1JFUExBQ0UgfHwgZmxhZ3MgJiBGTF9SRUFET05MWSkgeworICAgICAgICBnb3RvIG91dDsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBpbm9kZS0+aV9zZW0gaXMgZG93biwgc28gbm90aGluZyBlbHNlIGNhbiB0cnkgdG8gY3JlYXRlCisgICAgICAgICAqIHRoZSBzYW1lIHhhdHRyICovCisgICAgICAgIGVyciA9IHhhZGlyLT5kX2lub2RlLT5pX29wLT5jcmVhdGUgKHhhZGlyLT5kX2lub2RlLCB4YWZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA3MDB8U19JRlJFRywgTlVMTCk7CisKKyAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgZHB1dCAoeGFmaWxlKTsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgfQorCitvdXQ6CisgICAgZHB1dCAoeGFkaXIpOworICAgIGlmIChlcnIpCisgICAgICAgIHhhZmlsZSA9IEVSUl9QVFIgKGVycik7CisgICAgcmV0dXJuIHhhZmlsZTsKK30KKworCisvKiBPcGVucyBhIGZpbGUgcG9pbnRlciB0byB0aGUgYXR0cmlidXRlIGFzc29jaWF0ZWQgd2l0aCBpbm9kZSAqLworc3RhdGljIHN0cnVjdCBmaWxlICoKK29wZW5feGFfZmlsZSAoY29uc3Qgc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWdzKQoreworICAgIHN0cnVjdCBkZW50cnkgKnhhZmlsZTsKKyAgICBzdHJ1Y3QgZmlsZSAqZnA7CisKKyAgICB4YWZpbGUgPSBnZXRfeGFfZmlsZV9kZW50cnkgKGlub2RlLCBuYW1lLCBmbGFncyk7CisgICAgaWYgKElTX0VSUiAoeGFmaWxlKSkKKyAgICAgICAgcmV0dXJuIEVSUl9QVFIgKFBUUl9FUlIgKHhhZmlsZSkpOworICAgIGVsc2UgaWYgKCF4YWZpbGUtPmRfaW5vZGUpIHsKKyAgICAgICAgZHB1dCAoeGFmaWxlKTsKKyAgICAgICAgcmV0dXJuIEVSUl9QVFIgKC1FTk9EQVRBKTsKKyAgICB9CisKKyAgICBmcCA9IGRlbnRyeV9vcGVuICh4YWZpbGUsIE5VTEwsIE9fUkRXUik7CisgICAgLyogZGVudHJ5X29wZW4gZHB1dHMgdGhlIGRlbnRyeSBpZiBpdCBmYWlscyAqLworCisgICAgcmV0dXJuIGZwOworfQorCisKKy8qCisgKiB0aGlzIGlzIHZlcnkgc2ltaWxhciB0byBmcy9yZWlzZXJmcy9kaXIuYzpyZWlzZXJmc19yZWFkZGlyLCBidXQKKyAqIHdlIG5lZWQgdG8gZHJvcCB0aGUgcGF0aCBiZWZvcmUgY2FsbGluZyB0aGUgZmlsbGRpciBzdHJ1Y3QuICBUaGF0CisgKiB3b3VsZCBiZSBhIGJpZyBwZXJmb3JtYW5jZSBoaXQgdG8gdGhlIG5vbi14YXR0ciBjYXNlLCBzbyBJJ3ZlIGNvcGllZAorICogdGhlIHdob2xlIHRoaW5nIGZvciBub3cuIC0tY2xtCisgKgorICogdGhlIGJpZyBkaWZmZXJlbmNlIGlzIHRoYXQgSSBnbyBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgZGlyZWN0b3J5LAorICogYW5kIGRvbid0IG1lc3Mgd2l0aCBmLT5mX3BvcywgYnV0IHRoZSBpZGVhIGlzIHRoZSBzYW1lLiAgRG8gc29tZQorICogYWN0aW9uIG9uIGVhY2ggYW5kIGV2ZXJ5IGVudHJ5IGluIHRoZSBkaXJlY3RvcnkuCisgKgorICogd2UncmUgY2FsbGVkIHdpdGggaV9zZW0gaGVsZCwgc28gdGhlcmUgYXJlIG5vIHdvcnJpZXMgYWJvdXQgdGhlIGRpcmVjdG9yeQorICogY2hhbmdpbmcgdW5kZXJuZWF0aCB1cy4KKyAqLworc3RhdGljIGludCBfX3hhdHRyX3JlYWRkaXIoc3RydWN0IGZpbGUgKiBmaWxwLCB2b2lkICogZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKyAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisgICAgc3RydWN0IGNwdV9rZXkgcG9zX2tleTsJLyoga2V5IG9mIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIGRpcmVjdG9yeSAoa2V5IG9mIGRpcmVjdG9yeSBlbnRyeSkgKi8KKyAgICBJTklUSUFMSVpFX1BBVEggKHBhdGhfdG9fZW50cnkpOworICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworICAgIGludCBlbnRyeV9udW07CisgICAgc3RydWN0IGl0ZW1faGVhZCAqIGloLCB0bXBfaWg7CisgICAgaW50IHNlYXJjaF9yZXM7CisgICAgY2hhciAqIGxvY2FsX2J1ZjsKKyAgICBsb2ZmX3QgbmV4dF9wb3M7CisgICAgY2hhciBzbWFsbF9idWZbMzJdIDsgLyogYXZvaWQga21hbGxvYyBpZiB3ZSBjYW4gKi8KKyAgICBzdHJ1Y3QgcmVpc2VyZnNfZGVfaGVhZCAqZGVoOworICAgIGludCBkX3JlY2xlbjsKKyAgICBjaGFyICogZF9uYW1lOworICAgIG9mZl90IGRfb2ZmOworICAgIGlub190IGRfaW5vOworICAgIHN0cnVjdCByZWlzZXJmc19kaXJfZW50cnkgZGU7CisKKworICAgIC8qIGZvcm0ga2V5IGZvciBzZWFyY2ggdGhlIG5leHQgZGlyZWN0b3J5IGVudHJ5IHVzaW5nIGZfcG9zIGZpZWxkIG9mCisgICAgICAgZmlsZSBzdHJ1Y3R1cmUgKi8KKyAgICBuZXh0X3BvcyA9IG1heF9yZWlzZXJmc19vZmZzZXQoaW5vZGUpOworCisgICAgd2hpbGUgKDEpIHsKK3Jlc2VhcmNoOgorCWlmIChuZXh0X3BvcyA8PSBET1RfRE9UX09GRlNFVCkKKwkgICAgYnJlYWs7CisJbWFrZV9jcHVfa2V5ICgmcG9zX2tleSwgaW5vZGUsIG5leHRfcG9zLCBUWVBFX0RJUkVOVFJZLCAzKTsKKworCXNlYXJjaF9yZXMgPSBzZWFyY2hfYnlfZW50cnlfa2V5KGlub2RlLT5pX3NiLCAmcG9zX2tleSwgJnBhdGhfdG9fZW50cnksICZkZSk7CisJaWYgKHNlYXJjaF9yZXMgPT0gSU9fRVJST1IpIHsKKwkgICAgLy8gRklYTUU6IHdlIGNvdWxkIGp1c3Qgc2tpcCBwYXJ0IG9mIGRpcmVjdG9yeSB3aGljaCBjb3VsZAorCSAgICAvLyBub3QgYmUgcmVhZAorCSAgICBwYXRocmVsc2UoJnBhdGhfdG9fZW50cnkpOworCSAgICByZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAoc2VhcmNoX3JlcyA9PSBOQU1FX05PVF9GT1VORCkKKwkgICAgZGUuZGVfZW50cnlfbnVtLS07CisKKwlzZXRfZGVfbmFtZV9hbmRfbmFtZWxlbigmZGUpOworCWVudHJ5X251bSA9IGRlLmRlX2VudHJ5X251bTsKKwlkZWggPSAmKGRlLmRlX2RlaFtlbnRyeV9udW1dKTsKKworCWJoID0gZGUuZGVfYmg7CisJaWggPSBkZS5kZV9paDsKKworCWlmICghaXNfZGlyZW50cnlfbGVfaWgoaWgpKSB7CisgICAgICAgICAgICByZWlzZXJmc193YXJuaW5nKGlub2RlLT5pX3NiLCAibm90IGRpcmVudHJ5ICVoIiwgaWgpOworCSAgICBicmVhazsKKyAgICAgICAgfQorCWNvcHlfaXRlbV9oZWFkKCZ0bXBfaWgsIGloKTsKKworCS8qIHdlIG11c3QgaGF2ZSBmb3VuZCBpdGVtLCB0aGF0IGlzIGl0ZW0gb2YgdGhpcyBkaXJlY3RvcnksICovCisJUkZBTFNFKCBDT01QX1NIT1JUX0tFWVMgKCYoaWgtPmloX2tleSksICZwb3Nfa2V5KSwKKwkJInZzLTkwMDA6IGZvdW5kIGl0ZW0gJWggZG9lcyBub3QgbWF0Y2ggdG8gZGlyIHdlIHJlYWRkaXIgJUsiLAorCQlpaCwgJnBvc19rZXkpOworCisJaWYgKGRlaF9vZmZzZXQoZGVoKSA8PSBET1RfRE9UX09GRlNFVCkgeworCSAgICBicmVhazsKKwl9CisKKwkvKiBsb29rIGZvciB0aGUgcHJldmlvdXMgZW50cnkgaW4gdGhlIGRpcmVjdG9yeSAqLworCW5leHRfcG9zID0gZGVoX29mZnNldCAoZGVoKSAtIDE7CisKKwlpZiAoIWRlX3Zpc2libGUgKGRlaCkpCisJICAgIC8qIGl0IGlzIGhpZGRlbiBlbnRyeSAqLworCSAgICBjb250aW51ZTsKKworCWRfcmVjbGVuID0gZW50cnlfbGVuZ3RoKGJoLCBpaCwgZW50cnlfbnVtKTsKKwlkX25hbWUgPSBCX0lfREVIX0VOVFJZX0ZJTEVfTkFNRSAoYmgsIGloLCBkZWgpOworCWRfb2ZmID0gZGVoX29mZnNldCAoZGVoKTsKKwlkX2lubyA9IGRlaF9vYmplY3RpZCAoZGVoKTsKKworCWlmICghZF9uYW1lW2RfcmVjbGVuIC0gMV0pCisJICAgIGRfcmVjbGVuID0gc3RybGVuIChkX25hbWUpOworCisJaWYgKGRfcmVjbGVuID4gUkVJU0VSRlNfTUFYX05BTUUoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKSl7CisJICAgIC8qIHRvbyBiaWcgdG8gc2VuZCBiYWNrIHRvIFZGUyAqLworCSAgICBjb250aW51ZSA7CisJfQorCisgICAgICAgIC8qIElnbm9yZSB0aGUgLnJlaXNlcmZzX3ByaXYgZW50cnkgKi8KKyAgICAgICAgaWYgKHJlaXNlcmZzX3hhdHRycyAoaW5vZGUtPmlfc2IpICYmCisgICAgICAgICAgICAhb2xkX2Zvcm1hdF9vbmx5KGlub2RlLT5pX3NiKSAmJgorICAgICAgICAgICAgZGVoX29iamVjdGlkIChkZWgpID09IGxlMzJfdG9fY3B1IChJTk9ERV9QS0VZKFJFSVNFUkZTX1NCKGlub2RlLT5pX3NiKS0+cHJpdl9yb290LT5kX2lub2RlKS0+a19vYmplY3RpZCkpCisgICAgICAgICAgY29udGludWU7CisKKwlpZiAoZF9yZWNsZW4gPD0gMzIpIHsKKwkgIGxvY2FsX2J1ZiA9IHNtYWxsX2J1ZiA7CisJfSBlbHNlIHsKKwkgICAgbG9jYWxfYnVmID0gcmVpc2VyZnNfa21hbGxvYyhkX3JlY2xlbiwgR0ZQX05PRlMsIGlub2RlLT5pX3NiKSA7CisJICAgIGlmICghbG9jYWxfYnVmKSB7CisJCXBhdGhyZWxzZSAoJnBhdGhfdG9fZW50cnkpOworCQlyZXR1cm4gLUVOT01FTSA7CisJICAgIH0KKwkgICAgaWYgKGl0ZW1fbW92ZWQgKCZ0bXBfaWgsICZwYXRoX3RvX2VudHJ5KSkgeworCQlyZWlzZXJmc19rZnJlZShsb2NhbF9idWYsIGRfcmVjbGVuLCBpbm9kZS0+aV9zYikgOworCisJCS8qIHNpZ2gsIG11c3QgcmV0cnkuICBEbyB0aGlzIHNhbWUgb2Zmc2V0IGFnYWluICovCisJCW5leHRfcG9zID0gZF9vZmY7CisJCWdvdG8gcmVzZWFyY2g7CisJICAgIH0KKwl9CisKKwkvLyBOb3RlLCB0aGF0IHdlIGNvcHkgbmFtZSB0byB1c2VyIHNwYWNlIHZpYSB0ZW1wb3JhcnkKKwkvLyBidWZmZXIgKGxvY2FsX2J1ZikgYmVjYXVzZSBmaWxsZGlyIHdpbGwgYmxvY2sgaWYKKwkvLyB1c2VyIHNwYWNlIGJ1ZmZlciBpcyBzd2FwcGVkIG91dC4gQXQgdGhhdCB0aW1lCisJLy8gZW50cnkgY2FuIG1vdmUgdG8gc29tZXdoZXJlIGVsc2UKKwltZW1jcHkgKGxvY2FsX2J1ZiwgZF9uYW1lLCBkX3JlY2xlbik7CisKKwkvKiB0aGUgZmlsbGRpciBmdW5jdGlvbiBtaWdodCBuZWVkIHRvIHN0YXJ0IHRyYW5zYWN0aW9ucywKKwkgKiBvciBkbyB3aG8ga25vd3Mgd2hhdC4gIFJlbGVhc2UgdGhlIHBhdGggbm93IHRoYXQgd2UndmUKKwkgKiBjb3BpZWQgYWxsIHRoZSBpbXBvcnRhbnQgc3R1ZmYgb3V0IG9mIHRoZSBkZWgKKwkgKi8KKwlwYXRocmVsc2UgKCZwYXRoX3RvX2VudHJ5KTsKKworCWlmIChmaWxsZGlyIChkaXJlbnQsIGxvY2FsX2J1ZiwgZF9yZWNsZW4sIGRfb2ZmLCBkX2lubywKKwkJICAgICBEVF9VTktOT1dOKSA8IDApIHsKKwkgICAgaWYgKGxvY2FsX2J1ZiAhPSBzbWFsbF9idWYpIHsKKwkJcmVpc2VyZnNfa2ZyZWUobG9jYWxfYnVmLCBkX3JlY2xlbiwgaW5vZGUtPmlfc2IpIDsKKwkgICAgfQorCSAgICBnb3RvIGVuZDsKKwl9CisJaWYgKGxvY2FsX2J1ZiAhPSBzbWFsbF9idWYpIHsKKwkgICAgcmVpc2VyZnNfa2ZyZWUobG9jYWxfYnVmLCBkX3JlY2xlbiwgaW5vZGUtPmlfc2IpIDsKKwl9CisgICAgfSAvKiB3aGlsZSAqLworCitlbmQ6CisgICAgcGF0aHJlbHNlICgmcGF0aF90b19lbnRyeSk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiB0aGlzIGNvdWxkIGJlIGRvbmUgd2l0aCBkZWRpY2F0ZWQgcmVhZGRpciBvcHMgZm9yIHRoZSB4YXR0ciBmaWxlcywKKyAqIGJ1dCBJIHdhbnQgdG8gZ2V0IHNvbWV0aGluZyB3b3JraW5nIGFzYXAKKyAqIHRoaXMgaXMgc3RvbGVuIGZyb20gdmZzX3JlYWRkaXIKKyAqCisgKi8KK3N0YXRpYworaW50IHhhdHRyX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbGUsIGZpbGxkaXJfdCBmaWxsZXIsIHZvaWQgKmJ1ZikKK3sKKyAgICAgICAgc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworICAgICAgICBpbnQgcmVzID0gLUVOT1RESVI7CisgICAgICAgIGlmICghZmlsZS0+Zl9vcCB8fCAhZmlsZS0+Zl9vcC0+cmVhZGRpcikKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgZG93bigmaW5vZGUtPmlfc2VtKTsKKy8vICAgICAgICBkb3duKCZpbm9kZS0+aV96b21iaWUpOworICAgICAgICByZXMgPSAtRU5PRU5UOworICAgICAgICBpZiAoIUlTX0RFQURESVIoaW5vZGUpKSB7CisgICAgICAgICAgICAgICAgbG9ja19rZXJuZWwoKTsKKyAgICAgICAgICAgICAgICByZXMgPSBfX3hhdHRyX3JlYWRkaXIoZmlsZSwgYnVmLCBmaWxsZXIpOworICAgICAgICAgICAgICAgIHVubG9ja19rZXJuZWwoKTsKKyAgICAgICAgfQorLy8gICAgICAgIHVwKCZpbm9kZS0+aV96b21iaWUpOworICAgICAgICB1cCgmaW5vZGUtPmlfc2VtKTsKK291dDoKKyAgICAgICAgcmV0dXJuIHJlczsKK30KKworCisvKiBJbnRlcm5hbCBvcGVyYXRpb25zIG9uIGZpbGUgZGF0YSAqLworc3RhdGljIGlubGluZSB2b2lkCityZWlzZXJmc19wdXRfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKyAgICAgICAga3VubWFwKHBhZ2UpOworICAgICAgICBwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqCityZWlzZXJmc19nZXRfcGFnZShzdHJ1Y3QgaW5vZGUgKmRpciwgdW5zaWduZWQgbG9uZyBuKQoreworICAgICAgICBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGRpci0+aV9tYXBwaW5nOworICAgICAgICBzdHJ1Y3QgcGFnZSAqcGFnZTsKKyAgICAgICAgLyogV2UgY2FuIGRlYWRsb2NrIGlmIHdlIHRyeSB0byBmcmVlIGRlbnRyaWVzLAorICAgICAgICAgICBhbmQgYW4gdW5saW5rL3JtZGlyIGhhcyBqdXN0IG9jY3VyZWQgLSBHRlBfTk9GUyBhdm9pZHMgdGhpcyAqLworICAgICAgICBtYXBwaW5nLT5mbGFncyA9IChtYXBwaW5nLT5mbGFncyAmIH5fX0dGUF9CSVRTX01BU0spIHwgR0ZQX05PRlM7CisgICAgICAgIHBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UgKG1hcHBpbmcsIG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxsZXJfdCopbWFwcGluZy0+YV9vcHMtPnJlYWRwYWdlLCBOVUxMKTsKKyAgICAgICAgaWYgKCFJU19FUlIocGFnZSkpIHsKKyAgICAgICAgICAgICAgICB3YWl0X29uX3BhZ2VfbG9ja2VkKHBhZ2UpOworICAgICAgICAgICAgICAgIGttYXAocGFnZSk7CisgICAgICAgICAgICAgICAgaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgICAgICAgICBpZiAoUGFnZUVycm9yKHBhZ2UpKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYWdlOworCitmYWlsOgorICAgICAgICByZWlzZXJmc19wdXRfcGFnZShwYWdlKTsKKyAgICAgICAgcmV0dXJuIEVSUl9QVFIoLUVJTyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX191MzIKK3hhdHRyX2hhc2ggKGNvbnN0IGNoYXIgKm1zZywgaW50IGxlbikKK3sKKyAgICByZXR1cm4gY3N1bV9wYXJ0aWFsIChtc2csIGxlbiwgMCk7Cit9CisKKy8qIEdlbmVyaWMgZXh0ZW5kZWQgYXR0cmlidXRlIG9wZXJhdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCBieSB4YSBwbHVnaW5zICovCisKKy8qCisgKiBpbm9kZS0+aV9zZW06IGRvd24KKyAqLworaW50CityZWlzZXJmc194YXR0cl9zZXQgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlcl9zaXplLCBpbnQgZmxhZ3MpCit7CisgICAgaW50IGVyciA9IDA7CisgICAgc3RydWN0IGZpbGUgKmZwOworICAgIHN0cnVjdCBwYWdlICpwYWdlOworICAgIGNoYXIgKmRhdGE7CisgICAgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CisgICAgc2l6ZV90IGZpbGVfcG9zID0gMDsKKyAgICBzaXplX3QgYnVmZmVyX3BvcyA9IDA7CisgICAgc3RydWN0IGlub2RlICp4aW5vZGU7CisgICAgc3RydWN0IGlhdHRyIG5ld2F0dHJzOworICAgIF9fdTMyIHhhaGFzaCA9IDA7CisKKyAgICBpZiAoSVNfUkRPTkxZIChpbm9kZSkpCisgICAgICAgIHJldHVybiAtRVJPRlM7CisKKyAgICBpZiAoSVNfSU1NVVRBQkxFIChpbm9kZSkgfHwgSVNfQVBQRU5EIChpbm9kZSkpCisgICAgICAgIHJldHVybiAtRVBFUk07CisKKyAgICBpZiAoZ2V0X2lub2RlX3NkX3ZlcnNpb24gKGlub2RlKSA9PSBTVEFUX0RBVEFfVjEpCisgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKworICAgIC8qIEVtcHR5IHhhdHRycyBhcmUgb2ssIHRoZXkncmUganVzdCBlbXB0eSBmaWxlcywgbm8gaGFzaCAqLworICAgIGlmIChidWZmZXIgJiYgYnVmZmVyX3NpemUpCisgICAgICAgIHhhaGFzaCA9IHhhdHRyX2hhc2ggKGJ1ZmZlciwgYnVmZmVyX3NpemUpOworCitvcGVuX2ZpbGU6CisgICAgZnAgPSBvcGVuX3hhX2ZpbGUgKGlub2RlLCBuYW1lLCBmbGFncyk7CisgICAgaWYgKElTX0VSUiAoZnApKSB7CisgICAgICAgIGVyciA9IFBUUl9FUlIgKGZwKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgeGlub2RlID0gZnAtPmZfZGVudHJ5LT5kX2lub2RlOworICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzIHw9IGlfaGFzX3hhdHRyX2RpcjsKKworICAgIC8qIHdlIG5lZWQgdG8gY29weSBpdCBvZmYuLiAqLworICAgIGlmICh4aW5vZGUtPmlfbmxpbmsgPiAxKSB7CisJZnB1dChmcCk7CisgICAgICAgIGVyciA9IHJlaXNlcmZzX3hhdHRyX2RlbCAoaW5vZGUsIG5hbWUpOworICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAvKiBXZSBqdXN0IGtpbGxlZCB0aGUgb2xkIG9uZSwgd2UncmUgbm90IHJlcGxhY2luZyBhbnltb3JlICovCisgICAgICAgIGlmIChmbGFncyAmIFhBVFRSX1JFUExBQ0UpCisgICAgICAgICAgICBmbGFncyAmPSB+WEFUVFJfUkVQTEFDRTsKKyAgICAgICAgZ290byBvcGVuX2ZpbGU7CisgICAgfQorCisgICAgLyogUmVzaXplIGl0IHNvIHdlJ3JlIG9rIHRvIHdyaXRlIHRoZXJlICovCisgICAgbmV3YXR0cnMuaWFfc2l6ZSA9IGJ1ZmZlcl9zaXplOworICAgIG5ld2F0dHJzLmlhX3ZhbGlkID0gQVRUUl9TSVpFIHwgQVRUUl9DVElNRTsKKyAgICBkb3duICgmeGlub2RlLT5pX3NlbSk7CisgICAgZXJyID0gbm90aWZ5X2NoYW5nZShmcC0+Zl9kZW50cnksICZuZXdhdHRycyk7CisgICAgaWYgKGVycikKKyAgICAgICAgZ290byBvdXRfZmlscDsKKworICAgIG1hcHBpbmcgPSB4aW5vZGUtPmlfbWFwcGluZzsKKyAgICB3aGlsZSAoYnVmZmVyX3BvcyA8IGJ1ZmZlcl9zaXplIHx8IGJ1ZmZlcl9wb3MgPT0gMCkgeworICAgICAgICBzaXplX3QgY2h1bms7CisgICAgICAgIHNpemVfdCBza2lwID0gMDsKKyAgICAgICAgc2l6ZV90IHBhZ2Vfb2Zmc2V0ID0gKGZpbGVfcG9zICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKTsKKyAgICAgICAgaWYgKGJ1ZmZlcl9zaXplIC0gYnVmZmVyX3BvcyA+IFBBR0VfQ0FDSEVfU0laRSkKKyAgICAgICAgICAgIGNodW5rID0gUEFHRV9DQUNIRV9TSVpFOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjaHVuayA9IGJ1ZmZlcl9zaXplIC0gYnVmZmVyX3BvczsKKworICAgICAgICBwYWdlID0gcmVpc2VyZnNfZ2V0X3BhZ2UgKHhpbm9kZSwgZmlsZV9wb3MgPj4gUEFHRV9DQUNIRV9TSElGVCk7CisgICAgICAgIGlmIChJU19FUlIgKHBhZ2UpKSB7CisgICAgICAgICAgICBlcnIgPSBQVFJfRVJSIChwYWdlKTsKKyAgICAgICAgICAgIGdvdG8gb3V0X2ZpbHA7CisgICAgICAgIH0KKworICAgICAgICBsb2NrX3BhZ2UgKHBhZ2UpOworICAgICAgICBkYXRhID0gcGFnZV9hZGRyZXNzIChwYWdlKTsKKworICAgICAgICBpZiAoZmlsZV9wb3MgPT0gMCkgeworICAgICAgICAgICAgc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hlYWRlciAqcnhoOworICAgICAgICAgICAgc2tpcCA9IGZpbGVfcG9zID0gc2l6ZW9mIChzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGVhZGVyKTsKKyAgICAgICAgICAgIGlmIChjaHVuayArIHNraXAgPiBQQUdFX0NBQ0hFX1NJWkUpCisgICAgICAgICAgICAgICAgY2h1bmsgPSBQQUdFX0NBQ0hFX1NJWkUgLSBza2lwOworICAgICAgICAgICAgcnhoID0gKHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIgKilkYXRhOworICAgICAgICAgICAgcnhoLT5oX21hZ2ljID0gY3B1X3RvX2xlMzIgKFJFSVNFUkZTX1hBVFRSX01BR0lDKTsKKyAgICAgICAgICAgIHJ4aC0+aF9oYXNoID0gY3B1X3RvX2xlMzIgKHhhaGFzaCk7CisgICAgICAgIH0KKworICAgICAgICBlcnIgPSBtYXBwaW5nLT5hX29wcy0+cHJlcGFyZV93cml0ZSAoZnAsIHBhZ2UsIHBhZ2Vfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZV9vZmZzZXQgKyBjaHVuayArIHNraXApOworICAgICAgICBpZiAoIWVycikgeworCSAgICBpZiAoYnVmZmVyKQorCQltZW1jcHkgKGRhdGEgKyBza2lwLCBidWZmZXIgKyBidWZmZXJfcG9zLCBjaHVuayk7CisgICAgICAgICAgICBlcnIgPSBtYXBwaW5nLT5hX29wcy0+Y29tbWl0X3dyaXRlIChmcCwgcGFnZSwgcGFnZV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlX29mZnNldCArIGNodW5rICsgc2tpcCk7CisJfQorICAgICAgICB1bmxvY2tfcGFnZSAocGFnZSk7CisgICAgICAgIHJlaXNlcmZzX3B1dF9wYWdlIChwYWdlKTsKKyAgICAgICAgYnVmZmVyX3BvcyArPSBjaHVuazsKKyAgICAgICAgZmlsZV9wb3MgKz0gY2h1bms7CisgICAgICAgIHNraXAgPSAwOworICAgICAgICBpZiAoZXJyIHx8IGJ1ZmZlcl9zaXplID09IDAgfHwgIWJ1ZmZlcikKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIFdlIGNhbid0IG1hcmsgdGhlIGlub2RlIGRpcnR5IGlmIGl0J3Mgbm90IGhhc2hlZC4gVGhpcyBpcyB0aGUgY2FzZQorICAgICAqIHdoZW4gd2UncmUgaW5oZXJpdGluZyB0aGUgZGVmYXVsdCBBQ0wuIElmIHdlIGRpcnR5IGl0LCB0aGUgaW5vZGUKKyAgICAgKiBnZXRzIG1hcmtlZCBkaXJ0eSwgYnV0IHdvbid0IChldmVyKSBtYWtlIGl0IG9udG8gdGhlIGRpcnR5IGxpc3QgdW50aWwKKyAgICAgKiBpdCdzIHN5bmNlZCBleHBsaWNpdGx5IHRvIGNsZWFyIElfRElSVFkuIFRoaXMgaXMgYmFkLiAqLworICAgIGlmICghaGxpc3RfdW5oYXNoZWQoJmlub2RlLT5pX2hhc2gpKSB7CisgICAgICAgIGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKyAgICAgICAgbWFya19pbm9kZV9kaXJ0eSAoaW5vZGUpOworICAgIH0KKworb3V0X2ZpbHA6CisgICAgdXAgKCZ4aW5vZGUtPmlfc2VtKTsKKyAgICBmcHV0KGZwKTsKKworb3V0OgorICAgIHJldHVybiBlcnI7Cit9CisKKy8qCisgKiBpbm9kZS0+aV9zZW06IGRvd24KKyAqLworaW50CityZWlzZXJmc194YXR0cl9nZXQgKGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlcl9zaXplKQoreworICAgIHNzaXplX3QgZXJyID0gMDsKKyAgICBzdHJ1Y3QgZmlsZSAqZnA7CisgICAgc2l6ZV90IGlzaXplOworICAgIHNpemVfdCBmaWxlX3BvcyA9IDA7CisgICAgc2l6ZV90IGJ1ZmZlcl9wb3MgPSAwOworICAgIHN0cnVjdCBwYWdlICpwYWdlOworICAgIHN0cnVjdCBpbm9kZSAqeGlub2RlOworICAgIF9fdTMyIGhhc2ggPSAwOworCisgICAgaWYgKG5hbWUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAvKiBXZSBjYW4ndCBoYXZlIHhhdHRycyBhdHRhY2hlZCB0byB2MSBpdGVtcyBzaW5jZSB0aGV5IGRvbid0IGhhdmUKKyAgICAgKiBnZW5lcmF0aW9uIG51bWJlcnMgKi8KKyAgICBpZiAoZ2V0X2lub2RlX3NkX3ZlcnNpb24gKGlub2RlKSA9PSBTVEFUX0RBVEFfVjEpCisgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKworICAgIGZwID0gb3Blbl94YV9maWxlIChpbm9kZSwgbmFtZSwgRkxfUkVBRE9OTFkpOworICAgIGlmIChJU19FUlIgKGZwKSkgeworICAgICAgICBlcnIgPSBQVFJfRVJSIChmcCk7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIHhpbm9kZSA9IGZwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKyAgICBpc2l6ZSA9IHhpbm9kZS0+aV9zaXplOworICAgIFJFSVNFUkZTX0koaW5vZGUpLT5pX2ZsYWdzIHw9IGlfaGFzX3hhdHRyX2RpcjsKKworICAgIC8qIEp1c3QgcmV0dXJuIHRoZSBzaXplIG5lZWRlZCAqLworICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICBlcnIgPSBpc2l6ZSAtIHNpemVvZiAoc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hlYWRlcik7CisgICAgICAgIGdvdG8gb3V0X2RwdXQ7CisgICAgfQorCisgICAgaWYgKGJ1ZmZlcl9zaXplIDwgaXNpemUgLSBzaXplb2YgKHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIpKSB7CisgICAgICAgIGVyciA9IC1FUkFOR0U7CisgICAgICAgIGdvdG8gb3V0X2RwdXQ7CisgICAgfQorCisgICAgd2hpbGUgKGZpbGVfcG9zIDwgaXNpemUpIHsKKyAgICAgICAgc2l6ZV90IGNodW5rOworICAgICAgICBjaGFyICpkYXRhOworICAgICAgICBzaXplX3Qgc2tpcCA9IDA7CisgICAgICAgIGlmIChpc2l6ZSAtIGZpbGVfcG9zID4gUEFHRV9DQUNIRV9TSVpFKQorICAgICAgICAgICAgY2h1bmsgPSBQQUdFX0NBQ0hFX1NJWkU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNodW5rID0gaXNpemUgLSBmaWxlX3BvczsKKworICAgICAgICBwYWdlID0gcmVpc2VyZnNfZ2V0X3BhZ2UgKHhpbm9kZSwgZmlsZV9wb3MgPj4gUEFHRV9DQUNIRV9TSElGVCk7CisgICAgICAgIGlmIChJU19FUlIgKHBhZ2UpKSB7CisgICAgICAgICAgICBlcnIgPSBQVFJfRVJSIChwYWdlKTsKKyAgICAgICAgICAgIGdvdG8gb3V0X2RwdXQ7CisgICAgICAgIH0KKworICAgICAgICBsb2NrX3BhZ2UgKHBhZ2UpOworICAgICAgICBkYXRhID0gcGFnZV9hZGRyZXNzIChwYWdlKTsKKyAgICAgICAgaWYgKGZpbGVfcG9zID09IDApIHsKKyAgICAgICAgICAgIHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIgKnJ4aCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIgKilkYXRhOworICAgICAgICAgICAgc2tpcCA9IGZpbGVfcG9zID0gc2l6ZW9mIChzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGVhZGVyKTsKKyAgICAgICAgICAgIGNodW5rIC09IHNraXA7CisgICAgICAgICAgICAvKiBNYWdpYyBkb2Vzbid0IG1hdGNoIHVwLi4gKi8KKyAgICAgICAgICAgIGlmIChyeGgtPmhfbWFnaWMgIT0gY3B1X3RvX2xlMzIgKFJFSVNFUkZTX1hBVFRSX01BR0lDKSkgeworICAgICAgICAgICAgICAgIHVubG9ja19wYWdlIChwYWdlKTsKKyAgICAgICAgICAgICAgICByZWlzZXJmc19wdXRfcGFnZSAocGFnZSk7CisgICAgICAgICAgICAgICAgcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICJJbnZhbGlkIG1hZ2ljIGZvciB4YXR0ciAoJXMpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXNzb2NpYXRlZCB3aXRoICVrIiwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTk9ERV9QS0VZIChpbm9kZSkpOworICAgICAgICAgICAgICAgIGVyciA9IC1FSU87CisgICAgICAgICAgICAgICAgZ290byBvdXRfZHB1dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhhc2ggPSBsZTMyX3RvX2NwdSAocnhoLT5oX2hhc2gpOworICAgICAgICB9CisgICAgICAgIG1lbWNweSAoYnVmZmVyICsgYnVmZmVyX3BvcywgZGF0YSArIHNraXAsIGNodW5rKTsKKyAgICAgICAgdW5sb2NrX3BhZ2UgKHBhZ2UpOworICAgICAgICByZWlzZXJmc19wdXRfcGFnZSAocGFnZSk7CisgICAgICAgIGZpbGVfcG9zICs9IGNodW5rOworICAgICAgICBidWZmZXJfcG9zICs9IGNodW5rOworICAgICAgICBza2lwID0gMDsKKyAgICB9CisgICAgZXJyID0gaXNpemUgLSBzaXplb2YgKHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIpOworCisgICAgaWYgKHhhdHRyX2hhc2ggKGJ1ZmZlciwgaXNpemUgLSBzaXplb2YgKHN0cnVjdCByZWlzZXJmc194YXR0cl9oZWFkZXIpKSAhPSBoYXNoKSB7CisgICAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKGlub2RlLT5pX3NiLCAiSW52YWxpZCBoYXNoIGZvciB4YXR0ciAoJXMpIGFzc29jaWF0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAid2l0aCAlayIsIG5hbWUsIElOT0RFX1BLRVkgKGlub2RlKSk7CisgICAgICAgIGVyciA9IC1FSU87CisgICAgfQorCitvdXRfZHB1dDoKKyAgICBmcHV0KGZwKTsKKworb3V0OgorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQKK19fcmVpc2VyZnNfeGF0dHJfZGVsIChzdHJ1Y3QgZGVudHJ5ICp4YWRpciwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pCit7CisgICAgc3RydWN0IGRlbnRyeSAqZGVudHJ5OworICAgIHN0cnVjdCBpbm9kZSAqZGlyID0geGFkaXItPmRfaW5vZGU7CisgICAgaW50IGVyciA9IDA7CisKKyAgICBkZW50cnkgPSBsb29rdXBfb25lX2xlbiAobmFtZSwgeGFkaXIsIG5hbWVsZW4pOworICAgIGlmIChJU19FUlIgKGRlbnRyeSkpIHsKKyAgICAgICAgZXJyID0gUFRSX0VSUiAoZGVudHJ5KTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfSBlbHNlIGlmICghZGVudHJ5LT5kX2lub2RlKSB7CisgICAgICAgIGVyciA9IC1FTk9EQVRBOworICAgICAgICBnb3RvIG91dF9maWxlOworICAgIH0KKworICAgIC8qIFNraXAgZGlyZWN0b3JpZXMuLiAqLworICAgIGlmIChTX0lTRElSIChkZW50cnktPmRfaW5vZGUtPmlfbW9kZSkpCisgICAgICAgIGdvdG8gb3V0X2ZpbGU7CisKKyAgICBpZiAoIWlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0IChkZW50cnktPmRfaW5vZGUpKSB7CisgICAgICAgIHJlaXNlcmZzX3dhcm5pbmcgKGRpci0+aV9zYiwgIk9JRCAlMDh4IFslLipzLyUuKnNdIGRvZXNuJ3QgaGF2ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByaXYgZmxhZyBzZXQgW3BhcmVudCBpcyAlc3NldF0uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlMzJfdG9fY3B1IChJTk9ERV9QS0VZIChkZW50cnktPmRfaW5vZGUpLT5rX29iamVjdGlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHhhZGlyLT5kX25hbWUubGVuLCB4YWRpci0+ZF9uYW1lLm5hbWUsIG5hbWVsZW4sIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBpc19yZWlzZXJmc19wcml2X29iamVjdCAoeGFkaXItPmRfaW5vZGUpID8gIiIgOiAibm90ICIpOworICAgICAgICBkcHV0IChkZW50cnkpOworICAgICAgICByZXR1cm4gLUVJTzsKKyAgICB9CisKKyAgICBlcnIgPSBkaXItPmlfb3AtPnVubGluayAoZGlyLCBkZW50cnkpOworICAgIGlmICghZXJyKQorICAgICAgICBkX2RlbGV0ZSAoZGVudHJ5KTsKKworb3V0X2ZpbGU6CisgICAgZHB1dCAoZGVudHJ5KTsKKworb3V0OgorICAgIHJldHVybiBlcnI7Cit9CisKKworaW50CityZWlzZXJmc194YXR0cl9kZWwgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgc3RydWN0IGRlbnRyeSAqZGlyOworICAgIGludCBlcnI7CisKKyAgICBpZiAoSVNfUkRPTkxZIChpbm9kZSkpCisgICAgICAgIHJldHVybiAtRVJPRlM7CisKKyAgICBkaXIgPSBvcGVuX3hhX2RpciAoaW5vZGUsIEZMX1JFQURPTkxZKTsKKyAgICBpZiAoSVNfRVJSIChkaXIpKSB7CisgICAgICAgIGVyciA9IFBUUl9FUlIgKGRpcik7CisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIGVyciA9IF9fcmVpc2VyZnNfeGF0dHJfZGVsIChkaXIsIG5hbWUsIHN0cmxlbiAobmFtZSkpOworICAgIGRwdXQgKGRpcik7CisKKyAgICBpZiAoIWVycikgeworICAgICAgICBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisgICAgICAgIG1hcmtfaW5vZGVfZGlydHkgKGlub2RlKTsKKyAgICB9CisKK291dDoKKyAgICByZXR1cm4gZXJyOworfQorCisvKiBUaGUgZm9sbG93aW5nIGFyZSBzaWRlIGVmZmVjdHMgb2Ygb3RoZXIgb3BlcmF0aW9ucyB0aGF0IGFyZW4ndCBleHBsaWNpdGx5CisgKiBtb2RpZnlpbmcgZXh0ZW5kZWQgYXR0cmlidXRlcy4gVGhpcyBpbmNsdWRlcyBvcGVyYXRpb25zIHN1Y2ggYXMgcGVybWlzc2lvbnMKKyAqIG9yIG93bmVyc2hpcCBjaGFuZ2VzLCBvYmplY3QgZGVsZXRpb25zLCBldGMuICovCisKK3N0YXRpYyBpbnQKK3JlaXNlcmZzX2RlbGV0ZV94YXR0cnNfZmlsbGVyICh2b2lkICpidWYsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZmZfdCBvZmZzZXQsIGlub190IGlubywgdW5zaWduZWQgaW50IGRfdHlwZSkKK3sKKyAgICBzdHJ1Y3QgZGVudHJ5ICp4YWRpciA9IChzdHJ1Y3QgZGVudHJ5ICopYnVmOworCisgICAgcmV0dXJuIF9fcmVpc2VyZnNfeGF0dHJfZGVsICh4YWRpciwgbmFtZSwgbmFtZWxlbik7CisKK30KKworLyogVGhpcyBpcyBjYWxsZWQgdy8gaW5vZGUtPmlfc2VtIGRvd25lZCAqLworaW50CityZWlzZXJmc19kZWxldGVfeGF0dHJzIChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworICAgIHN0cnVjdCBmaWxlICpmcDsKKyAgICBzdHJ1Y3QgZGVudHJ5ICpkaXIsICpyb290OworICAgIGludCBlcnIgPSAwOworCisgICAgLyogU2tpcCBvdXQsIGFuIHhhdHRyIGhhcyBubyB4YXR0cnMgYXNzb2NpYXRlZCB3aXRoIGl0ICovCisgICAgaWYgKGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0IChpbm9kZSkgfHwKKyAgICAgICAgZ2V0X2lub2RlX3NkX3ZlcnNpb24gKGlub2RlKSA9PSBTVEFUX0RBVEFfVjEgfHwKKyAgICAgICAgIXJlaXNlcmZzX3hhdHRycyhpbm9kZS0+aV9zYikpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRycyAoaW5vZGUtPmlfc2IpOworICAgIGRpciA9IG9wZW5feGFfZGlyIChpbm9kZSwgRkxfUkVBRE9OTFkpOworICAgIHJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRycyAoaW5vZGUtPmlfc2IpOworICAgIGlmIChJU19FUlIgKGRpcikpIHsKKyAgICAgICAgZXJyID0gUFRSX0VSUiAoZGlyKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfSBlbHNlIGlmICghZGlyLT5kX2lub2RlKSB7CisgICAgICAgIGRwdXQgKGRpcik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGZwID0gZGVudHJ5X29wZW4gKGRpciwgTlVMTCwgT19SRFdSKTsKKyAgICBpZiAoSVNfRVJSIChmcCkpIHsKKyAgICAgICAgZXJyID0gUFRSX0VSUiAoZnApOworICAgICAgICAvKiBkZW50cnlfb3BlbiBkcHV0cyB0aGUgZGVudHJ5IGlmIGl0IGZhaWxzICovCisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIGxvY2tfa2VybmVsICgpOworICAgIGVyciA9IHhhdHRyX3JlYWRkaXIgKGZwLCByZWlzZXJmc19kZWxldGVfeGF0dHJzX2ZpbGxlciwgZGlyKTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIHVubG9ja19rZXJuZWwgKCk7CisgICAgICAgIGdvdG8gb3V0X2RpcjsKKyAgICB9CisKKyAgICAvKiBMZWZ0b3ZlcnMgYmVzaWRlcyAuIGFuZCAuLiAtLSB0aGF0J3Mgbm90IGdvb2QuICovCisgICAgaWYgKGRpci0+ZF9pbm9kZS0+aV9ubGluayA8PSAyKSB7CisgICAgICAgIHJvb3QgPSBnZXRfeGFfcm9vdCAoaW5vZGUtPmlfc2IpOworICAgICAgICByZWlzZXJmc193cml0ZV9sb2NrX3hhdHRycyAoaW5vZGUtPmlfc2IpOworICAgICAgICBlcnIgPSB2ZnNfcm1kaXIgKHJvb3QtPmRfaW5vZGUsIGRpcik7CisgICAgICAgIHJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cnMgKGlub2RlLT5pX3NiKTsKKyAgICAgICAgZHB1dCAocm9vdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVpc2VyZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCByZW1vdmUgYWxsIGVudHJpZXMgaW4gZGlyZWN0b3J5Iik7CisgICAgfQorICAgIHVubG9ja19rZXJuZWwgKCk7CisKK291dF9kaXI6CisgICAgZnB1dChmcCk7CisKK291dDoKKyAgICBpZiAoIWVycikKKyAgICAgICAgUkVJU0VSRlNfSShpbm9kZSktPmlfZmxhZ3MgPSBSRUlTRVJGU19JKGlub2RlKS0+aV9mbGFncyAmIH5pX2hhc194YXR0cl9kaXI7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RydWN0IHJlaXNlcmZzX2Nob3duX2J1ZiB7CisgICAgc3RydWN0IGlub2RlICppbm9kZTsKKyAgICBzdHJ1Y3QgZGVudHJ5ICp4YWRpcjsKKyAgICBzdHJ1Y3QgaWF0dHIgKmF0dHJzOworfTsKKworLyogWFhYOiBJZiB0aGVyZSBpcyBhIGJldHRlciB3YXkgdG8gZG8gdGhpcywgSSdkIGxvdmUgdG8gaGVhciBhYm91dCBpdCAqLworc3RhdGljIGludAorcmVpc2VyZnNfY2hvd25feGF0dHJzX2ZpbGxlciAodm9pZCAqYnVmLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2ZmX3Qgb2Zmc2V0LCBpbm9fdCBpbm8sIHVuc2lnbmVkIGludCBkX3R5cGUpCit7CisgICAgc3RydWN0IHJlaXNlcmZzX2Nob3duX2J1ZiAqY2hvd25fYnVmID0gKHN0cnVjdCByZWlzZXJmc19jaG93bl9idWYgKilidWY7CisgICAgc3RydWN0IGRlbnRyeSAqeGFmaWxlLCAqeGFkaXIgPSBjaG93bl9idWYtPnhhZGlyOworICAgIHN0cnVjdCBpYXR0ciAqYXR0cnMgPSBjaG93bl9idWYtPmF0dHJzOworICAgIGludCBlcnIgPSAwOworCisgICAgeGFmaWxlID0gbG9va3VwX29uZV9sZW4gKG5hbWUsIHhhZGlyLCBuYW1lbGVuKTsKKyAgICBpZiAoSVNfRVJSICh4YWZpbGUpKQorICAgICAgICByZXR1cm4gUFRSX0VSUiAoeGFmaWxlKTsKKyAgICBlbHNlIGlmICgheGFmaWxlLT5kX2lub2RlKSB7CisgICAgICAgIGRwdXQgKHhhZmlsZSk7CisgICAgICAgIHJldHVybiAtRU5PREFUQTsKKyAgICB9CisKKyAgICBpZiAoIVNfSVNESVIgKHhhZmlsZS0+ZF9pbm9kZS0+aV9tb2RlKSkKKyAgICAgICAgZXJyID0gbm90aWZ5X2NoYW5nZSAoeGFmaWxlLCBhdHRycyk7CisgICAgZHB1dCAoeGFmaWxlKTsKKworICAgIHJldHVybiBlcnI7Cit9CisKK2ludAorcmVpc2VyZnNfY2hvd25feGF0dHJzIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaWF0dHIgKmF0dHJzKQoreworICAgIHN0cnVjdCBmaWxlICpmcDsKKyAgICBzdHJ1Y3QgZGVudHJ5ICpkaXI7CisgICAgaW50IGVyciA9IDA7CisgICAgc3RydWN0IHJlaXNlcmZzX2Nob3duX2J1ZiBidWY7CisgICAgdW5zaWduZWQgaW50IGlhX3ZhbGlkID0gYXR0cnMtPmlhX3ZhbGlkOworCisgICAgLyogU2tpcCBvdXQsIGFuIHhhdHRyIGhhcyBubyB4YXR0cnMgYXNzb2NpYXRlZCB3aXRoIGl0ICovCisgICAgaWYgKGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0IChpbm9kZSkgfHwKKyAgICAgICAgZ2V0X2lub2RlX3NkX3ZlcnNpb24gKGlub2RlKSA9PSBTVEFUX0RBVEFfVjEgfHwKKyAgICAgICAgIXJlaXNlcmZzX3hhdHRycyhpbm9kZS0+aV9zYikpCisgICAgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRycyAoaW5vZGUtPmlfc2IpOworICAgIGRpciA9IG9wZW5feGFfZGlyIChpbm9kZSwgRkxfUkVBRE9OTFkpOworICAgIHJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRycyAoaW5vZGUtPmlfc2IpOworICAgIGlmIChJU19FUlIgKGRpcikpIHsKKyAgICAgICAgaWYgKFBUUl9FUlIgKGRpcikgIT0gLUVOT0RBVEEpCisgICAgICAgICAgICBlcnIgPSBQVFJfRVJSIChkaXIpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9IGVsc2UgaWYgKCFkaXItPmRfaW5vZGUpIHsKKyAgICAgICAgZHB1dCAoZGlyKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgZnAgPSBkZW50cnlfb3BlbiAoZGlyLCBOVUxMLCBPX1JEV1IpOworICAgIGlmIChJU19FUlIgKGZwKSkgeworICAgICAgICBlcnIgPSBQVFJfRVJSIChmcCk7CisgICAgICAgIC8qIGRlbnRyeV9vcGVuIGRwdXRzIHRoZSBkZW50cnkgaWYgaXQgZmFpbHMgKi8KKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgbG9ja19rZXJuZWwgKCk7CisKKyAgICBhdHRycy0+aWFfdmFsaWQgJj0gKEFUVFJfVUlEIHwgQVRUUl9HSUQgfCBBVFRSX0NUSU1FKTsKKyAgICBidWYueGFkaXIgPSBkaXI7CisgICAgYnVmLmF0dHJzID0gYXR0cnM7CisgICAgYnVmLmlub2RlID0gaW5vZGU7CisKKyAgICBlcnIgPSB4YXR0cl9yZWFkZGlyIChmcCwgcmVpc2VyZnNfY2hvd25feGF0dHJzX2ZpbGxlciwgJmJ1Zik7CisgICAgaWYgKGVycikgeworICAgICAgICB1bmxvY2tfa2VybmVsICgpOworICAgICAgICBnb3RvIG91dF9kaXI7CisgICAgfQorCisgICAgZXJyID0gbm90aWZ5X2NoYW5nZSAoZGlyLCBhdHRycyk7CisgICAgdW5sb2NrX2tlcm5lbCAoKTsKKworb3V0X2RpcjoKKyAgICBmcHV0KGZwKTsKKworb3V0OgorICAgIGF0dHJzLT5pYV92YWxpZCA9IGlhX3ZhbGlkOworICAgIHJldHVybiBlcnI7Cit9CisKKworLyogQWN0dWFsIG9wZXJhdGlvbnMgdGhhdCBhcmUgZXhwb3J0ZWQgdG8gVkZTLWxhbmQgKi8KKworLyoKKyAqIElub2RlIG9wZXJhdGlvbiBnZXR4YXR0cigpCisgKiBQcmVsaW1pbmFyeSBsb2NraW5nOiB3ZSBkb3duIGRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0KKyAqLworc3NpemVfdAorcmVpc2VyZnNfZ2V0eGF0dHIgKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKQoreworICAgIHN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyICp4YWggPSBmaW5kX3hhdHRyX2hhbmRsZXJfcHJlZml4IChuYW1lKTsKKyAgICBpbnQgZXJyOworCisgICAgaWYgKCF4YWggfHwgIXJlaXNlcmZzX3hhdHRycyhkZW50cnktPmRfc2IpIHx8CisgICAgICAgIGdldF9pbm9kZV9zZF92ZXJzaW9uIChkZW50cnktPmRfaW5vZGUpID09IFNUQVRfREFUQV9WMSkKKyAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCisgICAgcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRyX2kgKGRlbnRyeS0+ZF9pbm9kZSk7CisgICAgcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRycyAoZGVudHJ5LT5kX3NiKTsKKyAgICBlcnIgPSB4YWgtPmdldCAoZGVudHJ5LT5kX2lub2RlLCBuYW1lLCBidWZmZXIsIHNpemUpOworICAgIHJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRycyAoZGVudHJ5LT5kX3NiKTsKKyAgICByZWlzZXJmc19yZWFkX3VubG9ja194YXR0cl9pIChkZW50cnktPmRfaW5vZGUpOworICAgIHJldHVybiBlcnI7Cit9CisKKworLyoKKyAqIElub2RlIG9wZXJhdGlvbiBzZXR4YXR0cigpCisgKgorICogZGVudHJ5LT5kX2lub2RlLT5pX3NlbSBkb3duCisgKi8KK2ludAorcmVpc2VyZnNfc2V0eGF0dHIgKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqdmFsdWUsCisgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciAqeGFoID0gZmluZF94YXR0cl9oYW5kbGVyX3ByZWZpeCAobmFtZSk7CisgICAgaW50IGVycjsKKyAgICBpbnQgbG9jazsKKworICAgIGlmICgheGFoIHx8ICFyZWlzZXJmc194YXR0cnMoZGVudHJ5LT5kX3NiKSB8fAorICAgICAgICBnZXRfaW5vZGVfc2RfdmVyc2lvbiAoZGVudHJ5LT5kX2lub2RlKSA9PSBTVEFUX0RBVEFfVjEpCisgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKworICAgIGlmIChJU19SRE9OTFkgKGRlbnRyeS0+ZF9pbm9kZSkpCisgICAgICAgIHJldHVybiAtRVJPRlM7CisKKyAgICBpZiAoSVNfSU1NVVRBQkxFIChkZW50cnktPmRfaW5vZGUpIHx8IElTX0FQUEVORCAoZGVudHJ5LT5kX2lub2RlKSkKKyAgICAgICAgcmV0dXJuIC1FUk9GUzsKKworICAgIHJlaXNlcmZzX3dyaXRlX2xvY2tfeGF0dHJfaSAoZGVudHJ5LT5kX2lub2RlKTsKKyAgICBsb2NrID0gIWhhc194YXR0cl9kaXIgKGRlbnRyeS0+ZF9pbm9kZSk7CisgICAgaWYgKGxvY2spCisgICAgICAgIHJlaXNlcmZzX3dyaXRlX2xvY2tfeGF0dHJzIChkZW50cnktPmRfc2IpOworICAgIGVsc2UKKyAgICAgICAgcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRycyAoZGVudHJ5LT5kX3NiKTsKKyAgICBlcnIgPSB4YWgtPnNldCAoZGVudHJ5LT5kX2lub2RlLCBuYW1lLCB2YWx1ZSwgc2l6ZSwgZmxhZ3MpOworICAgIGlmIChsb2NrKQorICAgICAgICByZWlzZXJmc193cml0ZV91bmxvY2tfeGF0dHJzIChkZW50cnktPmRfc2IpOworICAgIGVsc2UKKyAgICAgICAgcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJzIChkZW50cnktPmRfc2IpOworICAgIHJlaXNlcmZzX3dyaXRlX3VubG9ja194YXR0cl9pIChkZW50cnktPmRfaW5vZGUpOworICAgIHJldHVybiBlcnI7Cit9CisKKy8qCisgKiBJbm9kZSBvcGVyYXRpb24gcmVtb3ZleGF0dHIoKQorICoKKyAqIGRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0gZG93bgorICovCitpbnQKK3JlaXNlcmZzX3JlbW92ZXhhdHRyIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgaW50IGVycjsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciAqeGFoID0gZmluZF94YXR0cl9oYW5kbGVyX3ByZWZpeCAobmFtZSk7CisKKyAgICBpZiAoIXhhaCB8fCAhcmVpc2VyZnNfeGF0dHJzKGRlbnRyeS0+ZF9zYikgfHwKKyAgICAgICAgZ2V0X2lub2RlX3NkX3ZlcnNpb24gKGRlbnRyeS0+ZF9pbm9kZSkgPT0gU1RBVF9EQVRBX1YxKQorICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisKKyAgICBpZiAoSVNfUkRPTkxZIChkZW50cnktPmRfaW5vZGUpKQorICAgICAgICByZXR1cm4gLUVST0ZTOworCisgICAgaWYgKElTX0lNTVVUQUJMRSAoZGVudHJ5LT5kX2lub2RlKSB8fCBJU19BUFBFTkQgKGRlbnRyeS0+ZF9pbm9kZSkpCisgICAgICAgIHJldHVybiAtRVBFUk07CisKKyAgICByZWlzZXJmc193cml0ZV9sb2NrX3hhdHRyX2kgKGRlbnRyeS0+ZF9pbm9kZSk7CisgICAgcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRycyAoZGVudHJ5LT5kX3NiKTsKKworICAgIC8qIERlbGV0aW9uIHByZS1vcGVyYXRpb24gKi8KKyAgICBpZiAoeGFoLT5kZWwpIHsKKyAgICAgICAgZXJyID0geGFoLT5kZWwgKGRlbnRyeS0+ZF9pbm9kZSwgbmFtZSk7CisgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBlcnIgPSByZWlzZXJmc194YXR0cl9kZWwgKGRlbnRyeS0+ZF9pbm9kZSwgbmFtZSk7CisKKyAgICBkZW50cnktPmRfaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworICAgIG1hcmtfaW5vZGVfZGlydHkgKGRlbnRyeS0+ZF9pbm9kZSk7CisKK291dDoKKyAgICByZWlzZXJmc19yZWFkX3VubG9ja194YXR0cnMgKGRlbnRyeS0+ZF9zYik7CisgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRyX2kgKGRlbnRyeS0+ZF9pbm9kZSk7CisgICAgcmV0dXJuIGVycjsKK30KKworCisvKiBUaGlzIGlzIHdoYXQgZmlsbGRpciB3aWxsIHVzZToKKyAqIHJfcG9zIHdpbGwgYWx3YXlzIGNvbnRhaW4gdGhlIGFtb3VudCBvZiBzcGFjZSByZXF1aXJlZCBmb3IgdGhlIGVudGlyZQorICogbGlzdC4gSWYgcl9wb3MgYmVjb21lcyBsYXJnZXIgdGhhbiByX3NpemUsIHdlIG5lZWQgbW9yZSBzcGFjZSBhbmQgd2UKKyAqIHJldHVybiBhbiBlcnJvciBpbmRpY2F0aW5nIHRoaXMuIElmIHJfcG9zIGlzIGxlc3MgdGhhbiByX3NpemUsIHRoZW4gd2UndmUKKyAqIGZpbGxlZCB0aGUgYnVmZmVyIHN1Y2Nlc3NmdWxseSBhbmQgd2UgcmV0dXJuIHN1Y2Nlc3MgKi8KK3N0cnVjdCByZWlzZXJmc19saXN0eGF0dHJfYnVmIHsKKyAgICBpbnQgcl9wb3M7CisgICAgaW50IHJfc2l6ZTsKKyAgICBjaGFyICpyX2J1ZjsKKyAgICBzdHJ1Y3QgaW5vZGUgKnJfaW5vZGU7Cit9OworCitzdGF0aWMgaW50CityZWlzZXJmc19saXN0eGF0dHJfZmlsbGVyICh2b2lkICpidWYsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9mZl90IG9mZnNldCwgaW5vX3QgaW5vLCB1bnNpZ25lZCBpbnQgZF90eXBlKQoreworICAgIHN0cnVjdCByZWlzZXJmc19saXN0eGF0dHJfYnVmICpiID0gKHN0cnVjdCByZWlzZXJmc19saXN0eGF0dHJfYnVmICopYnVmOworICAgIGludCBsZW4gPSAwOworICAgIGlmIChuYW1lWzBdICE9ICcuJyB8fCAobmFtZWxlbiAhPSAxICYmIChuYW1lWzFdICE9ICcuJyB8fCBuYW1lbGVuICE9IDIpKSkgeworICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciAqeGFoID0gZmluZF94YXR0cl9oYW5kbGVyX3ByZWZpeCAobmFtZSk7CisgICAgICAgIGlmICgheGFoKSByZXR1cm4gMDsgLyogVW5zdXBwb3J0ZWQgeGF0dHIgbmFtZSwgc2tpcCBpdCAqLworCisgICAgICAgIC8qIFdlIGNhbGwgLT5saXN0KCkgdHdpY2UgYmVjYXVzZSB0aGUgb3BlcmF0aW9uIGlzbid0IHJlcXVpcmVkIHRvIGp1c3QKKyAgICAgICAgICogcmV0dXJuIHRoZSBuYW1lIGJhY2sgLSB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIGVub3VnaCBzcGFjZSAqLworICAgICAgICBsZW4gKz0geGFoLT5saXN0IChiLT5yX2lub2RlLCBuYW1lLCBuYW1lbGVuLCBOVUxMKTsKKworICAgICAgICBpZiAobGVuKSB7CisgICAgICAgICAgICBpZiAoYi0+cl9wb3MgKyBsZW4gKyAxIDw9IGItPnJfc2l6ZSkgeworICAgICAgICAgICAgICAgIGNoYXIgKnAgPSBiLT5yX2J1ZiArIGItPnJfcG9zOworICAgICAgICAgICAgICAgIHAgKz0geGFoLT5saXN0IChiLT5yX2lub2RlLCBuYW1lLCBuYW1lbGVuLCBwKTsKKyAgICAgICAgICAgICAgICAqcCsrID0gJ1wwJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGItPnJfcG9zICs9IGxlbiArIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKy8qCisgKiBJbm9kZSBvcGVyYXRpb24gbGlzdHhhdHRyKCkKKyAqCisgKiBQcmVsaW1pbmFyeSBsb2NraW5nOiB3ZSBkb3duIGRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0KKyAqLworc3NpemVfdAorcmVpc2VyZnNfbGlzdHhhdHRyIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisgICAgc3RydWN0IGZpbGUgKmZwOworICAgIHN0cnVjdCBkZW50cnkgKmRpcjsKKyAgICBpbnQgZXJyID0gMDsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfbGlzdHhhdHRyX2J1ZiBidWY7CisKKyAgICBpZiAoIWRlbnRyeS0+ZF9pbm9kZSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBpZiAoIXJlaXNlcmZzX3hhdHRycyhkZW50cnktPmRfc2IpIHx8CisgICAgICAgIGdldF9pbm9kZV9zZF92ZXJzaW9uIChkZW50cnktPmRfaW5vZGUpID09IFNUQVRfREFUQV9WMSkKKyAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCisgICAgcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRyX2kgKGRlbnRyeS0+ZF9pbm9kZSk7CisgICAgcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRycyAoZGVudHJ5LT5kX3NiKTsKKyAgICBkaXIgPSBvcGVuX3hhX2RpciAoZGVudHJ5LT5kX2lub2RlLCBGTF9SRUFET05MWSk7CisgICAgcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJzIChkZW50cnktPmRfc2IpOworICAgIGlmIChJU19FUlIgKGRpcikpIHsKKyAgICAgICAgZXJyID0gUFRSX0VSUiAoZGlyKTsKKyAgICAgICAgaWYgKGVyciA9PSAtRU5PREFUQSkKKyAgICAgICAgICAgIGVyciA9IDA7IC8qIE5vdCBhbiBlcnJvciBpZiB0aGVyZSBhcmVuJ3QgYW55IHhhdHRycyAqLworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBmcCA9IGRlbnRyeV9vcGVuIChkaXIsIE5VTEwsIE9fUkRXUik7CisgICAgaWYgKElTX0VSUiAoZnApKSB7CisgICAgICAgIGVyciA9IFBUUl9FUlIgKGZwKTsKKyAgICAgICAgLyogZGVudHJ5X29wZW4gZHB1dHMgdGhlIGRlbnRyeSBpZiBpdCBmYWlscyAqLworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBidWYucl9idWYgPSBidWZmZXI7CisgICAgYnVmLnJfc2l6ZSA9IGJ1ZmZlciA/IHNpemUgOiAwOworICAgIGJ1Zi5yX3BvcyA9IDA7CisgICAgYnVmLnJfaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisKKyAgICBSRUlTRVJGU19JKGRlbnRyeS0+ZF9pbm9kZSktPmlfZmxhZ3MgfD0gaV9oYXNfeGF0dHJfZGlyOworCisgICAgZXJyID0geGF0dHJfcmVhZGRpciAoZnAsIHJlaXNlcmZzX2xpc3R4YXR0cl9maWxsZXIsICZidWYpOworICAgIGlmIChlcnIpCisgICAgICAgIGdvdG8gb3V0X2RpcjsKKworICAgIGlmIChidWYucl9wb3MgPiBidWYucl9zaXplICYmIGJ1ZmZlciAhPSBOVUxMKQorICAgICAgICBlcnIgPSAtRVJBTkdFOworICAgIGVsc2UKKyAgICAgICAgZXJyID0gYnVmLnJfcG9zOworCitvdXRfZGlyOgorICAgIGZwdXQoZnApOworCitvdXQ6CisgICAgcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJfaSAoZGVudHJ5LT5kX2lub2RlKTsKKyAgICByZXR1cm4gZXJyOworfQorCisvKiBUaGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHhhdHRyIHBsdWdpbiBpbmZyYXN0cnVjdHVyZSAqLworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgeGF0dHJfaGFuZGxlcnMgPSBMSVNUX0hFQURfSU5JVCAoeGF0dHJfaGFuZGxlcnMpOworc3RhdGljIERFRklORV9SV0xPQ0soaGFuZGxlcl9sb2NrKTsKKworc3RhdGljIHN0cnVjdCByZWlzZXJmc194YXR0cl9oYW5kbGVyICoKK2ZpbmRfeGF0dHJfaGFuZGxlcl9wcmVmaXggKGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciAqeGFoID0gTlVMTDsKKyAgICBzdHJ1Y3QgbGlzdF9oZWFkICpwOworCisgICAgcmVhZF9sb2NrICgmaGFuZGxlcl9sb2NrKTsKKyAgICBsaXN0X2Zvcl9lYWNoIChwLCAmeGF0dHJfaGFuZGxlcnMpIHsKKyAgICAgICAgeGFoID0gbGlzdF9lbnRyeSAocCwgc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIsIGhhbmRsZXJzKTsKKyAgICAgICAgaWYgKHN0cm5jbXAgKHhhaC0+cHJlZml4LCBwcmVmaXgsIHN0cmxlbiAoeGFoLT5wcmVmaXgpKSA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHhhaCA9IE5VTEw7CisgICAgfQorCisgICAgcmVhZF91bmxvY2sgKCZoYW5kbGVyX2xvY2spOworICAgIHJldHVybiB4YWg7Cit9CisKK3N0YXRpYyB2b2lkCitfX3VucmVnaXN0ZXJfaGFuZGxlcnMgKHZvaWQpCit7CisgICAgc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgKnhhaDsKKyAgICBzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqdG1wOworCisgICAgbGlzdF9mb3JfZWFjaF9zYWZlIChwLCB0bXAsICZ4YXR0cl9oYW5kbGVycykgeworICAgICAgICB4YWggPSBsaXN0X2VudHJ5IChwLCBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciwgaGFuZGxlcnMpOworICAgICAgICBpZiAoeGFoLT5leGl0KQorICAgICAgICAgICAgeGFoLT5leGl0KCk7CisKKyAgICAgICAgbGlzdF9kZWxfaW5pdCAocCk7CisgICAgfQorICAgIElOSVRfTElTVF9IRUFEICgmeGF0dHJfaGFuZGxlcnMpOworfQorCitpbnQgX19pbml0CityZWlzZXJmc194YXR0cl9yZWdpc3Rlcl9oYW5kbGVycyAodm9pZCkKK3sKKyAgICBpbnQgZXJyID0gMDsKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciAqeGFoOworICAgIHN0cnVjdCBsaXN0X2hlYWQgKnA7CisKKyAgICB3cml0ZV9sb2NrICgmaGFuZGxlcl9sb2NrKTsKKworICAgIC8qIElmIHdlJ3JlIGFscmVhZHkgaW5pdGlhbGl6ZWQsIG5vdGhpbmcgdG8gZG8gKi8KKyAgICBpZiAoIWxpc3RfZW1wdHkgKCZ4YXR0cl9oYW5kbGVycykpIHsKKyAgICAgICAgd3JpdGVfdW5sb2NrICgmaGFuZGxlcl9sb2NrKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogQWRkIHRoZSBoYW5kbGVycyAqLworICAgIGxpc3RfYWRkX3RhaWwgKCZ1c2VyX2hhbmRsZXIuaGFuZGxlcnMsICZ4YXR0cl9oYW5kbGVycyk7CisgICAgbGlzdF9hZGRfdGFpbCAoJnRydXN0ZWRfaGFuZGxlci5oYW5kbGVycywgJnhhdHRyX2hhbmRsZXJzKTsKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfRlNfU0VDVVJJVFkKKyAgICBsaXN0X2FkZF90YWlsICgmc2VjdXJpdHlfaGFuZGxlci5oYW5kbGVycywgJnhhdHRyX2hhbmRsZXJzKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19SRUlTRVJGU19GU19QT1NJWF9BQ0wKKyAgICBsaXN0X2FkZF90YWlsICgmcG9zaXhfYWNsX2FjY2Vzc19oYW5kbGVyLmhhbmRsZXJzLCAmeGF0dHJfaGFuZGxlcnMpOworICAgIGxpc3RfYWRkX3RhaWwgKCZwb3NpeF9hY2xfZGVmYXVsdF9oYW5kbGVyLmhhbmRsZXJzLCAmeGF0dHJfaGFuZGxlcnMpOworI2VuZGlmCisKKyAgICAvKiBSdW4gaW5pdGlhbGl6ZXJzLCBpZiBhdmFpbGFibGUgKi8KKyAgICBsaXN0X2Zvcl9lYWNoIChwLCAmeGF0dHJfaGFuZGxlcnMpIHsKKyAgICAgICAgeGFoID0gbGlzdF9lbnRyeSAocCwgc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIsIGhhbmRsZXJzKTsKKyAgICAgICAgaWYgKHhhaC0+aW5pdCkgeworICAgICAgICAgICAgZXJyID0geGFoLT5pbml0ICgpOworICAgICAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgICAgIGxpc3RfZGVsX2luaXQgKHApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogQ2xlYW4gdXAgb3RoZXIgaGFuZGxlcnMsIGlmIGFueSBmYWlsZWQgKi8KKyAgICBpZiAoZXJyKQorICAgICAgICBfX3VucmVnaXN0ZXJfaGFuZGxlcnMgKCk7CisKKyAgICB3cml0ZV91bmxvY2sgKCZoYW5kbGVyX2xvY2spOworICAgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQKK3JlaXNlcmZzX3hhdHRyX3VucmVnaXN0ZXJfaGFuZGxlcnMgKHZvaWQpCit7CisgICAgd3JpdGVfbG9jayAoJmhhbmRsZXJfbG9jayk7CisgICAgX191bnJlZ2lzdGVyX2hhbmRsZXJzICgpOworICAgIHdyaXRlX3VubG9jayAoJmhhbmRsZXJfbG9jayk7Cit9CisKKy8qIFRoaXMgd2lsbCBjYXRjaCBsb29rdXBzIGZyb20gdGhlIGZzIHJvb3QgdG8gLnJlaXNlcmZzX3ByaXYgKi8KK3N0YXRpYyBpbnQKK3hhdHRyX2xvb2t1cF9wb2lzb24gKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHFzdHIgKnExLCBzdHJ1Y3QgcXN0ciAqbmFtZSkKK3sKKyAgICBzdHJ1Y3QgZGVudHJ5ICpwcml2X3Jvb3QgPSBSRUlTRVJGU19TQihkZW50cnktPmRfc2IpLT5wcml2X3Jvb3Q7CisgICAgaWYgKG5hbWUtPmxlbiA9PSBwcml2X3Jvb3QtPmRfbmFtZS5sZW4gJiYKKyAgICAgICAgbmFtZS0+aGFzaCA9PSBwcml2X3Jvb3QtPmRfbmFtZS5oYXNoICYmCisgICAgICAgICFtZW1jbXAgKG5hbWUtPm5hbWUsIHByaXZfcm9vdC0+ZF9uYW1lLm5hbWUsIG5hbWUtPmxlbikpIHsKKyAgICAgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIH0gZWxzZSBpZiAocTEtPmxlbiA9PSBuYW1lLT5sZW4gJiYKKyAgICAgICAgICAgICAgICFtZW1jbXAocTEtPm5hbWUsIG5hbWUtPm5hbWUsIG5hbWUtPmxlbikpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIHhhdHRyX2xvb2t1cF9wb2lzb25fb3BzID0geworICAgIC5kX2NvbXBhcmUgPSB4YXR0cl9sb29rdXBfcG9pc29uLAorfTsKKworCisvKiBXZSBuZWVkIHRvIHRha2UgYSBjb3B5IG9mIHRoZSBtb3VudCBmbGFncyBzaW5jZSB0aGluZ3MgbGlrZQorICogTVNfUkRPTkxZIGRvbid0IGdldCBzZXQgdW50aWwgKmFmdGVyKiB3ZSdyZSBjYWxsZWQuCisgKiBtb3VudF9mbGFncyAhPSBtb3VudF9vcHRpb25zICovCitpbnQKK3JlaXNlcmZzX3hhdHRyX2luaXQgKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgaW50IG1vdW50X2ZsYWdzKQoreworICBpbnQgZXJyID0gMDsKKworICAvKiBXZSBuZWVkIGdlbmVyYXRpb24gbnVtYmVycyB0byBlbnN1cmUgdGhhdCB0aGUgb2lkIG1hcHBpbmcgaXMgY29ycmVjdAorICAgKiB2My41IGZpbGVzeXN0ZW1zIGRvbid0IGhhdmUgdGhlbS4gKi8KKyAgaWYgKCFvbGRfZm9ybWF0X29ubHkgKHMpKSB7CisgICAgc2V0X2JpdCAoUkVJU0VSRlNfWEFUVFJTLCAmKFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCkpOworICB9IGVsc2UgaWYgKHJlaXNlcmZzX3hhdHRyc19vcHRpb25hbCAocykpIHsKKyAgICAvKiBPbGQgZm9ybWF0IGZpbGVzeXN0ZW0sIGJ1dCBvcHRpb25hbCB4YXR0cnMgaGF2ZSBiZWVuIGVuYWJsZWQKKyAgICAgKiBhdCBtb3VudCB0aW1lLiBFcnJvciBvdXQuICovCisgICAgcmVpc2VyZnNfd2FybmluZyAocywgInhhdHRycy9BQ0xzIG5vdCBzdXBwb3J0ZWQgb24gcHJlIHYzLjYgIgorICAgICAgICAgICAgICAgICAgICAgICJmb3JtYXQgZmlsZXN5c3RlbS4gRmFpbGluZyBtb3VudC4iKTsKKyAgICBlcnIgPSAtRU9QTk9UU1VQUDsKKyAgICBnb3RvIGVycm9yOworICB9IGVsc2UgeworICAgIC8qIE9sZCBmb3JtYXQgZmlsZXN5c3RlbSwgYnV0IG5vIG9wdGlvbmFsIHhhdHRycyBoYXZlIGJlZW4gZW5hYmxlZC4gVGhpcworICAgICAqIG1lYW5zIHdlIHNpbGVudGx5IGRpc2FibGUgeGF0dHJzIG9uIHRoZSBmaWxlc3lzdGVtLiAqLworICAgIGNsZWFyX2JpdCAoUkVJU0VSRlNfWEFUVFJTLCAmKFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCkpOworICB9CisKKyAgLyogSWYgd2UgZG9uJ3QgaGF2ZSB0aGUgcHJpdnJvb3QgbG9jYXRlZCB5ZXQgLSBnbyBmaW5kIGl0ICovCisgIGlmIChyZWlzZXJmc194YXR0cnMgKHMpICYmICFSRUlTRVJGU19TQihzKS0+cHJpdl9yb290KSB7CisgICAgICBzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisgICAgICBkZW50cnkgPSBsb29rdXBfb25lX2xlbiAoUFJJVlJPT1RfTkFNRSwgcy0+c19yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbiAoUFJJVlJPT1RfTkFNRSkpOworICAgICAgaWYgKCFJU19FUlIgKGRlbnRyeSkpIHsKKyAgICAgICAgaWYgKCEobW91bnRfZmxhZ3MgJiBNU19SRE9OTFkpICYmICFkZW50cnktPmRfaW5vZGUpIHsKKyAgICAgICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOworICAgICAgICAgICAgZG93biAoJmlub2RlLT5pX3NlbSk7CisgICAgICAgICAgICBlcnIgPSBpbm9kZS0+aV9vcC0+bWtkaXIgKGlub2RlLCBkZW50cnksIDA3MDApOworICAgICAgICAgICAgdXAgKCZpbm9kZS0+aV9zZW0pOworICAgICAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgICAgIGRwdXQgKGRlbnRyeSk7CisgICAgICAgICAgICAgICAgZGVudHJ5ID0gTlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRlbnRyeSAmJiBkZW50cnktPmRfaW5vZGUpCisgICAgICAgICAgICAgICAgcmVpc2VyZnNfd2FybmluZyAocywgIkNyZWF0ZWQgJXMgb24gJXMgLSByZXNlcnZlZCBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4YXR0ciBzdG9yYWdlLiIsIFBSSVZST09UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpc2VyZnNfYmRldm5hbWUgKGlub2RlLT5pX3NiKSk7CisgICAgICAgIH0gZWxzZSBpZiAoIWRlbnRyeS0+ZF9pbm9kZSkgeworICAgICAgICAgICAgZHB1dCAoZGVudHJ5KTsKKyAgICAgICAgICAgIGRlbnRyeSA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZQorICAgICAgICBlcnIgPSBQVFJfRVJSIChkZW50cnkpOworCisgICAgICBpZiAoIWVyciAmJiBkZW50cnkpIHsKKyAgICAgICAgICBzLT5zX3Jvb3QtPmRfb3AgPSAmeGF0dHJfbG9va3VwX3BvaXNvbl9vcHM7CisgICAgICAgICAgcmVpc2VyZnNfbWFya19pbm9kZV9wcml2YXRlIChkZW50cnktPmRfaW5vZGUpOworICAgICAgICAgIFJFSVNFUkZTX1NCKHMpLT5wcml2X3Jvb3QgPSBkZW50cnk7CisgICAgICB9IGVsc2UgaWYgKCEobW91bnRfZmxhZ3MgJiBNU19SRE9OTFkpKSB7IC8qIHhhdHRycyBhcmUgdW5hdmFpbGFibGUgKi8KKyAgICAgICAgICAvKiBJZiB3ZSdyZSByZWFkLW9ubHkgaXQganVzdCBtZWFucyB0aGF0IHRoZSBkaXIgaGFzbid0IGJlZW4KKyAgICAgICAgICAgKiBjcmVhdGVkLiBOb3QgYW4gZXJyb3IgLS0ganVzdCBubyB4YXR0cnMgb24gdGhlIGZzLiBXZSdsbAorICAgICAgICAgICAqIGNoZWNrIGFnYWluIGlmIHdlIGdvIHJlYWQtd3JpdGUgKi8KKyAgICAgICAgICByZWlzZXJmc193YXJuaW5nIChzLCAieGF0dHJzL0FDTHMgZW5hYmxlZCBhbmQgY291bGRuJ3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaW5kL2NyZWF0ZSAucmVpc2VyZnNfcHJpdi4gRmFpbGluZyBtb3VudC4iKTsKKyAgICAgICAgICBlcnIgPSAtRU9QTk9UU1VQUDsKKyAgICAgIH0KKyAgfQorCitlcnJvcjoKKyAgIC8qIFRoaXMgaXMgb25seSBub256ZXJvIGlmIHRoZXJlIHdhcyBhbiBlcnJvciBpbml0aWFsaXppbmcgdGhlIHhhdHRyCisgICAgKiBkaXJlY3Rvcnkgb3IgaWYgdGhlcmUgaXMgYSBjb25kaXRpb24gd2hlcmUgd2UgZG9uJ3Qgc3VwcG9ydCB0aGVtLiAqLworICAgIGlmIChlcnIpIHsKKyAgICAgICAgICBjbGVhcl9iaXQgKFJFSVNFUkZTX1hBVFRSUywgJihSRUlTRVJGU19TQihzKS0+c19tb3VudF9vcHQpKTsKKyAgICAgICAgICBjbGVhcl9iaXQgKFJFSVNFUkZTX1hBVFRSU19VU0VSLCAmKFJFSVNFUkZTX1NCKHMpLT5zX21vdW50X29wdCkpOworICAgICAgICAgIGNsZWFyX2JpdCAoUkVJU0VSRlNfUE9TSVhBQ0wsICYoUkVJU0VSRlNfU0IocyktPnNfbW91bnRfb3B0KSk7CisgICAgfQorCisgICAgLyogVGhlIHN1cGVyX2Jsb2NrIE1TX1BPU0lYQUNMIG11c3QgbWlycm9yIHRoZSAobm8pYWNsIG1vdW50IG9wdGlvbi4gKi8KKyAgICBzLT5zX2ZsYWdzID0gcy0+c19mbGFncyAmIH5NU19QT1NJWEFDTDsKKyAgICBpZiAocmVpc2VyZnNfcG9zaXhhY2wgKHMpKQorCXMtPnNfZmxhZ3MgfD0gTVNfUE9TSVhBQ0w7CisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50CitfX3JlaXNlcmZzX3Blcm1pc3Npb24gKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG5lZWRfbG9jaykKK3sKKwl1bW9kZV90CQkJbW9kZSA9IGlub2RlLT5pX21vZGU7CisKKwlpZiAobWFzayAmIE1BWV9XUklURSkgeworCQkvKgorCQkgKiBOb2JvZHkgZ2V0cyB3cml0ZSBhY2Nlc3MgdG8gYSByZWFkLW9ubHkgZnMuCisJCSAqLworCQlpZiAoSVNfUkRPTkxZKGlub2RlKSAmJgorCQkgICAgKFNfSVNSRUcobW9kZSkgfHwgU19JU0RJUihtb2RlKSB8fCBTX0lTTE5LKG1vZGUpKSkKKwkJCXJldHVybiAtRVJPRlM7CisKKwkJLyoKKwkJICogTm9ib2R5IGdldHMgd3JpdGUgYWNjZXNzIHRvIGFuIGltbXV0YWJsZSBmaWxlLgorCQkgKi8KKwkJaWYgKElTX0lNTVVUQUJMRShpbm9kZSkpCisJCQlyZXR1cm4gLUVBQ0NFUzsKKwl9CisKKwkvKiBXZSBkb24ndCBkbyBwZXJtaXNzaW9uIGNoZWNrcyBvbiB0aGUgaW50ZXJuYWwgb2JqZWN0cy4KKwkqIFBlcm1pc3Npb25zIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSAib3duaW5nIiBvYmplY3QuICovCisgICAgICAgIGlmIChpc19yZWlzZXJmc19wcml2X29iamVjdCAoaW5vZGUpKQorCQlyZXR1cm4gMDsKKworCWlmIChjdXJyZW50LT5mc3VpZCA9PSBpbm9kZS0+aV91aWQpIHsKKwkJbW9kZSA+Pj0gNjsKKyNpZmRlZiBDT05GSUdfUkVJU0VSRlNfRlNfUE9TSVhfQUNMCisJfSBlbHNlIGlmIChyZWlzZXJmc19wb3NpeGFjbChpbm9kZS0+aV9zYikgJiYKKyAgICAgICAgICAgICAgICAgICBnZXRfaW5vZGVfc2RfdmVyc2lvbiAoaW5vZGUpICE9IFNUQVRfREFUQV9WMSkgeworICAgICAgICAgICAgICAgIHN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKKworCQkvKiBBQ0wgY2FuJ3QgY29udGFpbiBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGlmCisJCSAgIHRoZSBBQ0xfTUFTSyBlbnRyeSBpcyAwICovCisJCWlmICghKG1vZGUgJiBTX0lSV1hHKSkKKwkJCWdvdG8gY2hlY2tfZ3JvdXBzOworCisgICAgICAgICAgICAgICAgaWYgKG5lZWRfbG9jaykgeworCQkgICAgcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRyX2kgKGlub2RlKTsKKyAgICAgICAgICAgICAgICAgICAgcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRycyAoaW5vZGUtPmlfc2IpOworCQl9CisgICAgICAgICAgICAgICAgYWNsID0gcmVpc2VyZnNfZ2V0X2FjbCAoaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUyk7CisgICAgICAgICAgICAgICAgaWYgKG5lZWRfbG9jaykgeworICAgICAgICAgICAgICAgICAgICByZWlzZXJmc19yZWFkX3VubG9ja194YXR0cnMgKGlub2RlLT5pX3NiKTsKKwkJICAgIHJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRyX2kgKGlub2RlKTsKKwkJfQorICAgICAgICAgICAgICAgIGlmIChJU19FUlIgKGFjbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFBUUl9FUlIgKGFjbCkgPT0gLUVOT0RBVEEpCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGNoZWNrX2dyb3VwczsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBUUl9FUlIgKGFjbCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGFjbCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgZXJyID0gcG9zaXhfYWNsX3Blcm1pc3Npb24gKGlub2RlLCBhY2wsIG1hc2spOworICAgICAgICAgICAgICAgICAgICBwb3NpeF9hY2xfcmVsZWFzZSAoYWNsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSAtRUFDQ0VTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGNoZWNrX2NhcGFiaWxpdGllczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworCQl9IGVsc2UgeworCQkJZ290byBjaGVja19ncm91cHM7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisJfSBlbHNlIHsKK2NoZWNrX2dyb3VwczoKKwkJaWYgKGluX2dyb3VwX3AoaW5vZGUtPmlfZ2lkKSkKKwkJCW1vZGUgPj49IDM7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgREFDcyBhcmUgb2sgd2UgZG9uJ3QgbmVlZCBhbnkgY2FwYWJpbGl0eSBjaGVjay4KKwkgKi8KKwlpZiAoKChtb2RlICYgbWFzayAmIChNQVlfUkVBRHxNQVlfV1JJVEV8TUFZX0VYRUMpKSA9PSBtYXNrKSkKKwkJcmV0dXJuIDA7CisKK2NoZWNrX2NhcGFiaWxpdGllczoKKwkvKgorCSAqIFJlYWQvd3JpdGUgREFDcyBhcmUgYWx3YXlzIG92ZXJyaWRhYmxlLgorCSAqIEV4ZWN1dGFibGUgREFDcyBhcmUgb3ZlcnJpZGFibGUgaWYgYXQgbGVhc3Qgb25lIGV4ZWMgYml0IGlzIHNldC4KKwkgKi8KKwlpZiAoIShtYXNrICYgTUFZX0VYRUMpIHx8CisJICAgIChpbm9kZS0+aV9tb2RlICYgU19JWFVHTykgfHwgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJaWYgKGNhcGFibGUoQ0FQX0RBQ19PVkVSUklERSkpCisJCQlyZXR1cm4gMDsKKworCS8qCisJICogU2VhcmNoaW5nIGluY2x1ZGVzIGV4ZWN1dGFibGUgb24gZGlyZWN0b3JpZXMsIGVsc2UganVzdCByZWFkLgorCSAqLworCWlmIChtYXNrID09IE1BWV9SRUFEIHx8IChTX0lTRElSKGlub2RlLT5pX21vZGUpICYmICEobWFzayAmIE1BWV9XUklURSkpKQorCQlpZiAoY2FwYWJsZShDQVBfREFDX1JFQURfU0VBUkNIKSkKKwkJCXJldHVybiAwOworCisJcmV0dXJuIC1FQUNDRVM7Cit9CisKK2ludAorcmVpc2VyZnNfcGVybWlzc2lvbiAoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworICAgIHJldHVybiBfX3JlaXNlcmZzX3Blcm1pc3Npb24gKGlub2RlLCBtYXNrLCBuZCwgMSk7Cit9CisKK2ludAorcmVpc2VyZnNfcGVybWlzc2lvbl9sb2NrZWQgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBtYXNrLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKyAgICByZXR1cm4gX19yZWlzZXJmc19wZXJtaXNzaW9uIChpbm9kZSwgbWFzaywgbmQsIDApOworfQpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMveGF0dHJfYWNsLmMgYi9mcy9yZWlzZXJmcy94YXR0cl9hY2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzAyMDcxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvcmVpc2VyZnMveGF0dHJfYWNsLmMKQEAgLTAsMCArMSw1NzEgQEAKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvc2l4X2FjbC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgveGF0dHIuaD4KKyNpbmNsdWRlIDxsaW51eC94YXR0cl9hY2wuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWlzZXJmc194YXR0ci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2FjbC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKK3N0YXRpYyBpbnQgcmVpc2VyZnNfc2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSwgc3RydWN0IHBvc2l4X2FjbCAqYWNsKTsKKworc3RhdGljIGludAoreGF0dHJfc2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSwgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKKwlpbnQgZXJyb3I7CisKKwlpZiAoIXJlaXNlcmZzX3Bvc2l4YWNsKGlub2RlLT5pX3NiKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCWlmICgoY3VycmVudC0+ZnN1aWQgIT0gaW5vZGUtPmlfdWlkKSAmJiAhY2FwYWJsZShDQVBfRk9XTkVSKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmICh2YWx1ZSkgeworCQlhY2wgPSBwb3NpeF9hY2xfZnJvbV94YXR0cih2YWx1ZSwgc2l6ZSk7CisJCWlmIChJU19FUlIoYWNsKSkgeworCQkJcmV0dXJuIFBUUl9FUlIoYWNsKTsKKwkJfSBlbHNlIGlmIChhY2wpIHsKKwkJCWVycm9yID0gcG9zaXhfYWNsX3ZhbGlkKGFjbCk7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byByZWxlYXNlX2FuZF9vdXQ7CisJCX0KKwl9IGVsc2UKKwkJYWNsID0gTlVMTDsKKworCWVycm9yID0gcmVpc2VyZnNfc2V0X2FjbCAoaW5vZGUsIHR5cGUsIGFjbCk7CisKK3JlbGVhc2VfYW5kX291dDoKKwlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOworCXJldHVybiBlcnJvcjsKK30KKworCitzdGF0aWMgaW50Cit4YXR0cl9nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKKwlpbnQgZXJyb3I7CisKKwlpZiAoIXJlaXNlcmZzX3Bvc2l4YWNsKGlub2RlLT5pX3NiKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJYWNsID0gcmVpc2VyZnNfZ2V0X2FjbCAoaW5vZGUsIHR5cGUpOworCWlmIChJU19FUlIoYWNsKSkKKwkJcmV0dXJuIFBUUl9FUlIoYWNsKTsKKwlpZiAoYWNsID09IE5VTEwpCisJCXJldHVybiAtRU5PREFUQTsKKwllcnJvciA9IHBvc2l4X2FjbF90b194YXR0cihhY2wsIGJ1ZmZlciwgc2l6ZSk7CisJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKworCXJldHVybiBlcnJvcjsKK30KKworCisvKgorICogQ29udmVydCBmcm9tIGZpbGVzeXN0ZW0gdG8gaW4tbWVtb3J5IHJlcHJlc2VudGF0aW9uLgorICovCitzdGF0aWMgc3RydWN0IHBvc2l4X2FjbCAqCitwb3NpeF9hY2xfZnJvbV9kaXNrKGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSkKK3sKKwljb25zdCBjaGFyICplbmQgPSAoY2hhciAqKXZhbHVlICsgc2l6ZTsKKwlpbnQgbiwgY291bnQ7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsOworCisJaWYgKCF2YWx1ZSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKHNpemUgPCBzaXplb2YocmVpc2VyZnNfYWNsX2hlYWRlcikpCisJCSByZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwlpZiAoKChyZWlzZXJmc19hY2xfaGVhZGVyICopdmFsdWUpLT5hX3ZlcnNpb24gIT0KKwkgICAgY3B1X3RvX2xlMzIoUkVJU0VSRlNfQUNMX1ZFUlNJT04pKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl2YWx1ZSA9IChjaGFyICopdmFsdWUgKyBzaXplb2YocmVpc2VyZnNfYWNsX2hlYWRlcik7CisJY291bnQgPSByZWlzZXJmc19hY2xfY291bnQoc2l6ZSk7CisJaWYgKGNvdW50IDwgMCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJaWYgKGNvdW50ID09IDApCisJCXJldHVybiBOVUxMOworCWFjbCA9IHBvc2l4X2FjbF9hbGxvYyhjb3VudCwgR0ZQX05PRlMpOworCWlmICghYWNsKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlmb3IgKG49MDsgbiA8IGNvdW50OyBuKyspIHsKKwkJcmVpc2VyZnNfYWNsX2VudHJ5ICplbnRyeSA9CisJCQkocmVpc2VyZnNfYWNsX2VudHJ5ICopdmFsdWU7CisJCWlmICgoY2hhciAqKXZhbHVlICsgc2l6ZW9mKHJlaXNlcmZzX2FjbF9lbnRyeV9zaG9ydCkgPiBlbmQpCisJCQlnb3RvIGZhaWw7CisJCWFjbC0+YV9lbnRyaWVzW25dLmVfdGFnICA9IGxlMTZfdG9fY3B1KGVudHJ5LT5lX3RhZyk7CisJCWFjbC0+YV9lbnRyaWVzW25dLmVfcGVybSA9IGxlMTZfdG9fY3B1KGVudHJ5LT5lX3Blcm0pOworCQlzd2l0Y2goYWNsLT5hX2VudHJpZXNbbl0uZV90YWcpIHsKKwkJCWNhc2UgQUNMX1VTRVJfT0JKOgorCQkJY2FzZSBBQ0xfR1JPVVBfT0JKOgorCQkJY2FzZSBBQ0xfTUFTSzoKKwkJCWNhc2UgQUNMX09USEVSOgorCQkJCXZhbHVlID0gKGNoYXIgKil2YWx1ZSArCisJCQkJCXNpemVvZihyZWlzZXJmc19hY2xfZW50cnlfc2hvcnQpOworCQkJCWFjbC0+YV9lbnRyaWVzW25dLmVfaWQgPSBBQ0xfVU5ERUZJTkVEX0lEOworCQkJCWJyZWFrOworCisJCQljYXNlIEFDTF9VU0VSOgorCQkJY2FzZSBBQ0xfR1JPVVA6CisJCQkJdmFsdWUgPSAoY2hhciAqKXZhbHVlICsgc2l6ZW9mKHJlaXNlcmZzX2FjbF9lbnRyeSk7CisJCQkJaWYgKChjaGFyICopdmFsdWUgPiBlbmQpCisJCQkJCWdvdG8gZmFpbDsKKwkJCQlhY2wtPmFfZW50cmllc1tuXS5lX2lkID0KKwkJCQkJbGUzMl90b19jcHUoZW50cnktPmVfaWQpOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKwlpZiAodmFsdWUgIT0gZW5kKQorCQlnb3RvIGZhaWw7CisJcmV0dXJuIGFjbDsKKworZmFpbDoKKwlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOworCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworfQorCisvKgorICogQ29udmVydCBmcm9tIGluLW1lbW9yeSB0byBmaWxlc3lzdGVtIHJlcHJlc2VudGF0aW9uLgorICovCitzdGF0aWMgdm9pZCAqCitwb3NpeF9hY2xfdG9fZGlzayhjb25zdCBzdHJ1Y3QgcG9zaXhfYWNsICphY2wsIHNpemVfdCAqc2l6ZSkKK3sKKwlyZWlzZXJmc19hY2xfaGVhZGVyICpleHRfYWNsOworCWNoYXIgKmU7CisJaW50IG47CisKKwkqc2l6ZSA9IHJlaXNlcmZzX2FjbF9zaXplKGFjbC0+YV9jb3VudCk7CisJZXh0X2FjbCA9IChyZWlzZXJmc19hY2xfaGVhZGVyICopa21hbGxvYyhzaXplb2YocmVpc2VyZnNfYWNsX2hlYWRlcikgKworCQlhY2wtPmFfY291bnQgKiBzaXplb2YocmVpc2VyZnNfYWNsX2VudHJ5KSwgR0ZQX05PRlMpOworCWlmICghZXh0X2FjbCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJZXh0X2FjbC0+YV92ZXJzaW9uID0gY3B1X3RvX2xlMzIoUkVJU0VSRlNfQUNMX1ZFUlNJT04pOworCWUgPSAoY2hhciAqKWV4dF9hY2wgKyBzaXplb2YocmVpc2VyZnNfYWNsX2hlYWRlcik7CisJZm9yIChuPTA7IG4gPCBhY2wtPmFfY291bnQ7IG4rKykgeworCQlyZWlzZXJmc19hY2xfZW50cnkgKmVudHJ5ID0gKHJlaXNlcmZzX2FjbF9lbnRyeSAqKWU7CisJCWVudHJ5LT5lX3RhZyAgPSBjcHVfdG9fbGUxNihhY2wtPmFfZW50cmllc1tuXS5lX3RhZyk7CisJCWVudHJ5LT5lX3Blcm0gPSBjcHVfdG9fbGUxNihhY2wtPmFfZW50cmllc1tuXS5lX3Blcm0pOworCQlzd2l0Y2goYWNsLT5hX2VudHJpZXNbbl0uZV90YWcpIHsKKwkJCWNhc2UgQUNMX1VTRVI6CisJCQljYXNlIEFDTF9HUk9VUDoKKwkJCQllbnRyeS0+ZV9pZCA9CisJCQkJCWNwdV90b19sZTMyKGFjbC0+YV9lbnRyaWVzW25dLmVfaWQpOworCQkJCWUgKz0gc2l6ZW9mKHJlaXNlcmZzX2FjbF9lbnRyeSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgQUNMX1VTRVJfT0JKOgorCQkJY2FzZSBBQ0xfR1JPVVBfT0JKOgorCQkJY2FzZSBBQ0xfTUFTSzoKKwkJCWNhc2UgQUNMX09USEVSOgorCQkJCWUgKz0gc2l6ZW9mKHJlaXNlcmZzX2FjbF9lbnRyeV9zaG9ydCk7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJZ290byBmYWlsOworCQl9CisJfQorCXJldHVybiAoY2hhciAqKWV4dF9hY2w7CisKK2ZhaWw6CisJa2ZyZWUoZXh0X2FjbCk7CisJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Cit9CisKKy8qCisgKiBJbm9kZSBvcGVyYXRpb24gZ2V0X3Bvc2l4X2FjbCgpLgorICoKKyAqIGlub2RlLT5pX3NlbTogZG93bgorICogQktMIGhlbGQgW2JlZm9yZSAyLjUueF0KKyAqLworc3RydWN0IHBvc2l4X2FjbCAqCityZWlzZXJmc19nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKQoreworCWNoYXIgKm5hbWUsICp2YWx1ZTsKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2wsICoqcF9hY2w7CisJc2l6ZV90IHNpemU7CisJaW50IHJldHZhbDsKKyAgICAgICAgc3RydWN0IHJlaXNlcmZzX2lub2RlX2luZm8gKnJlaXNlcmZzX2kgPSBSRUlTRVJGU19JKGlub2RlKTsKKworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQUNMX1RZUEVfQUNDRVNTOgorICAgICAgICAgICAgICAgIG5hbWUgPSBYQVRUUl9OQU1FX0FDTF9BQ0NFU1M7CisgICAgICAgICAgICAgICAgcF9hY2wgPSAmcmVpc2VyZnNfaS0+aV9hY2xfYWNjZXNzOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBQ0xfVFlQRV9ERUZBVUxUOgorICAgICAgICAgICAgICAgIG5hbWUgPSBYQVRUUl9OQU1FX0FDTF9ERUZBVUxUOworICAgICAgICAgICAgICAgIHBfYWNsID0gJnJlaXNlcmZzX2ktPmlfYWNsX2RlZmF1bHQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBFUlJfUFRSICgtRUlOVkFMKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChJU19FUlIgKCpwX2FjbCkpIHsKKyAgICAgICAgICAgIGlmIChQVFJfRVJSICgqcF9hY2wpID09IC1FTk9EQVRBKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9IGVsc2UgaWYgKCpwX2FjbCAhPSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIHBvc2l4X2FjbF9kdXAgKCpwX2FjbCk7CisKKyAgICAgICAgc2l6ZSA9IHJlaXNlcmZzX3hhdHRyX2dldCAoaW5vZGUsIG5hbWUsIE5VTEwsIDApOworICAgICAgICBpZiAoKGludClzaXplIDwgMCkgeworICAgICAgICAgICAgaWYgKHNpemUgPT0gLUVOT0RBVEEgfHwgc2l6ZSA9PSAtRU5PU1lTKSB7CisJCSpwX2FjbCA9IEVSUl9QVFIgKC1FTk9EQVRBKTsKKwkJcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gRVJSX1BUUiAoc2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSA9IGttYWxsb2MgKHNpemUsIEdGUF9OT0ZTKTsKKyAgICAgICAgaWYgKCF2YWx1ZSkKKyAgICAgICAgICAgIHJldHVybiBFUlJfUFRSICgtRU5PTUVNKTsKKworCXJldHZhbCA9IHJlaXNlcmZzX3hhdHRyX2dldChpbm9kZSwgbmFtZSwgdmFsdWUsIHNpemUpOworCWlmIChyZXR2YWwgPT0gLUVOT0RBVEEgfHwgcmV0dmFsID09IC1FTk9TWVMpIHsKKwkJLyogVGhpcyBzaG91bGRuJ3QgYWN0dWFsbHkgaGFwcGVuIGFzIGl0IHNob3VsZCBoYXZlCisJCSAgIGJlZW4gY2F1Z2h0IGFib3ZlLi4gYnV0IGp1c3QgaW4gY2FzZSAqLworCQlhY2wgPSBOVUxMOworCQkqcF9hY2wgPSBFUlJfUFRSICgtRU5PREFUQSk7CisgICAgICAgIH0gZWxzZSBpZiAocmV0dmFsIDwgMCkgeworCQlhY2wgPSBFUlJfUFRSKHJldHZhbCk7CisJfSBlbHNlIHsKKwkJYWNsID0gcG9zaXhfYWNsX2Zyb21fZGlzayh2YWx1ZSwgcmV0dmFsKTsKKwkJKnBfYWNsID0gcG9zaXhfYWNsX2R1cCAoYWNsKTsKKyAgICAgICAgfQorCisJa2ZyZWUodmFsdWUpOworCXJldHVybiBhY2w7Cit9CisKKy8qCisgKiBJbm9kZSBvcGVyYXRpb24gc2V0X3Bvc2l4X2FjbCgpLgorICoKKyAqIGlub2RlLT5pX3NlbTogZG93bgorICogQktMIGhlbGQgW2JlZm9yZSAyLjUueF0KKyAqLworc3RhdGljIGludAorcmVpc2VyZnNfc2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSwgc3RydWN0IHBvc2l4X2FjbCAqYWNsKQoreworICAgICAgICBjaGFyICpuYW1lOworCXZvaWQgKnZhbHVlID0gTlVMTDsKKwlzdHJ1Y3QgcG9zaXhfYWNsICoqcF9hY2w7CisJc2l6ZV90IHNpemU7CisJaW50IGVycm9yOworICAgICAgICBzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbyAqcmVpc2VyZnNfaSA9IFJFSVNFUkZTX0koaW5vZGUpOworCisJaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQUNMX1RZUEVfQUNDRVNTOgorICAgICAgICAgICAgICAgIG5hbWUgPSBYQVRUUl9OQU1FX0FDTF9BQ0NFU1M7CisgICAgICAgICAgICAgICAgcF9hY2wgPSAmcmVpc2VyZnNfaS0+aV9hY2xfYWNjZXNzOworICAgICAgICAgICAgICAgIGlmIChhY2wpIHsKKyAgICAgICAgICAgICAgICAgICAgbW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOworICAgICAgICAgICAgICAgICAgICBlcnJvciA9IHBvc2l4X2FjbF9lcXVpdl9tb2RlIChhY2wsICZtb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbm9kZS0+aV9tb2RlID0gbW9kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjbCA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFDTF9UWVBFX0RFRkFVTFQ6CisgICAgICAgICAgICAgICAgbmFtZSA9IFhBVFRSX05BTUVfQUNMX0RFRkFVTFQ7CisgICAgICAgICAgICAgICAgcF9hY2wgPSAmcmVpc2VyZnNfaS0+aV9hY2xfZGVmYXVsdDsKKyAgICAgICAgICAgICAgICBpZiAoIVNfSVNESVIgKGlub2RlLT5pX21vZGUpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNsID8gLUVBQ0NFUyA6IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisKKyAJaWYgKGFjbCkgeworICAgICAgICAgICAgdmFsdWUgPSBwb3NpeF9hY2xfdG9fZGlzayhhY2wsICZzaXplKTsKKyAgICAgICAgICAgIGlmIChJU19FUlIodmFsdWUpKQorICAgICAgICAgICAgICAgIHJldHVybiAoaW50KVBUUl9FUlIodmFsdWUpOworICAgICAgICAgICAgZXJyb3IgPSByZWlzZXJmc194YXR0cl9zZXQoaW5vZGUsIG5hbWUsIHZhbHVlLCBzaXplLCAwKTsKKwl9IGVsc2UgeworICAgICAgICAgICAgZXJyb3IgPSByZWlzZXJmc194YXR0cl9kZWwgKGlub2RlLCBuYW1lKTsKKyAgICAgICAgICAgIGlmIChlcnJvciA9PSAtRU5PREFUQSkgeworICAgICAgICAgICAgICAgIC8qIFRoaXMgbWF5IHNlZW0gb2RkIGhlcmUsIGJ1dCBpdCBtZWFucyB0aGF0IHRoZSBBQ0wgd2FzIHNldAorICAgICAgICAgICAgICAgICAqIHdpdGggYSB2YWx1ZSByZXByZXNlbnRhYmxlIHdpdGggbW9kZSBiaXRzLiBJZiB0aGVyZSB3YXMKKyAgICAgICAgICAgICAgICAgKiBhbiBBQ0wgYmVmb3JlLCByZWlzZXJmc194YXR0cl9kZWwgYWxyZWFkeSBkaXJ0aWVkIHRoZSBpbm9kZS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBtYXJrX2lub2RlX2RpcnR5IChpbm9kZSk7CisgICAgICAgICAgICAgICAgZXJyb3IgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKwlpZiAodmFsdWUpCisJCWtmcmVlKHZhbHVlKTsKKworICAgICAgICBpZiAoIWVycm9yKSB7CisgICAgICAgICAgICAvKiBSZWxlYXNlIHRoZSBvbGQgb25lICovCisgICAgICAgICAgICBpZiAoIUlTX0VSUiAoKnBfYWNsKSAmJiAqcF9hY2wpCisgICAgICAgICAgICAgICAgcG9zaXhfYWNsX3JlbGVhc2UgKCpwX2FjbCk7CisKKyAgICAgICAgICAgIGlmIChhY2wgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAqcF9hY2wgPSBFUlJfUFRSICgtRU5PREFUQSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgKnBfYWNsID0gcG9zaXhfYWNsX2R1cCAoYWNsKTsKKyAgICAgICAgfQorCisJcmV0dXJuIGVycm9yOworfQorCisvKiBkaXItPmlfc2VtOiBkb3duLAorICogaW5vZGUgaXMgbmV3IGFuZCBub3QgcmVsZWFzZWQgaW50byB0aGUgd2lsZCB5ZXQgKi8KK2ludAorcmVpc2VyZnNfaW5oZXJpdF9kZWZhdWx0X2FjbCAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKyAgICBzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CisgICAgaW50IGVyciA9IDA7CisKKyAgICAvKiBBQ0xzIG9ubHkgZ2V0IGFwcGxpZWQgdG8gZmlsZXMgYW5kIGRpcmVjdG9yaWVzICovCisgICAgaWYgKFNfSVNMTksgKGlub2RlLT5pX21vZGUpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIEFDTHMgY2FuIG9ubHkgYmUgdXNlZCBvbiAibmV3IiBvYmplY3RzLCBzbyBpZiBpdCdzIGFuIG9sZCBvYmplY3QKKyAgICAgKiB0aGVyZSBpcyBub3RoaW5nIHRvIGluaGVyaXQgZnJvbSAqLworICAgIGlmIChnZXRfaW5vZGVfc2RfdmVyc2lvbiAoZGlyKSA9PSBTVEFUX0RBVEFfVjEpCisgICAgICAgIGdvdG8gYXBwbHlfdW1hc2s7CisKKyAgICAvKiBEb24ndCBhcHBseSBBQ0xzIHRvIG9iamVjdHMgaW4gdGhlIC5yZWlzZXJmc19wcml2IHRyZWUuLiBUaGlzCisgICAgICogd291bGQgYmUgdXNlbGVzcyBzaW5jZSBwZXJtaXNzaW9ucyBhcmUgaWdub3JlZCwgYW5kIGEgcGFpbiBiZWNhdXNlCisgICAgICogaXQgaW50cm9kdWNlcyBsb2NraW5nIGN5Y2xlcyAqLworICAgIGlmIChpc19yZWlzZXJmc19wcml2X29iamVjdCAoZGlyKSkgeworICAgICAgICByZWlzZXJmc19tYXJrX2lub2RlX3ByaXZhdGUgKGlub2RlKTsKKyAgICAgICAgZ290byBhcHBseV91bWFzazsKKyAgICB9CisKKyAgICBhY2wgPSByZWlzZXJmc19nZXRfYWNsIChkaXIsIEFDTF9UWVBFX0RFRkFVTFQpOworICAgIGlmIChJU19FUlIgKGFjbCkpIHsKKyAgICAgICAgaWYgKFBUUl9FUlIgKGFjbCkgPT0gLUVOT0RBVEEpCisgICAgICAgICAgICBnb3RvIGFwcGx5X3VtYXNrOworICAgICAgICByZXR1cm4gUFRSX0VSUiAoYWNsKTsKKyAgICB9CisKKyAgICBpZiAoYWNsKSB7CisgICAgICAgIHN0cnVjdCBwb3NpeF9hY2wgKmFjbF9jb3B5OworICAgICAgICBtb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7CisgICAgICAgIGludCBuZWVkX2FjbDsKKworICAgICAgICAvKiBDb3B5IHRoZSBkZWZhdWx0IEFDTCB0byB0aGUgZGVmYXVsdCBBQ0wgb2YgYSBuZXcgZGlyZWN0b3J5ICovCisgICAgICAgIGlmIChTX0lTRElSIChpbm9kZS0+aV9tb2RlKSkgeworICAgICAgICAgICAgZXJyID0gcmVpc2VyZnNfc2V0X2FjbCAoaW5vZGUsIEFDTF9UWVBFX0RFRkFVTFQsIGFjbCk7CisgICAgICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIE5vdyB3ZSByZWNvbmNpbGUgdGhlIG5ldyBBQ0wgYW5kIHRoZSBtb2RlLAorICAgICAgICAgICBwb3RlbnRpYWxseSBtb2RpZnlpbmcgYm90aCAqLworICAgICAgICBhY2xfY29weSA9IHBvc2l4X2FjbF9jbG9uZSAoYWNsLCBHRlBfTk9GUyk7CisgICAgICAgIGlmICghYWNsX2NvcHkpIHsKKyAgICAgICAgICAgIGVyciA9IC1FTk9NRU07CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKworCisgICAgICAgIG5lZWRfYWNsID0gcG9zaXhfYWNsX2NyZWF0ZV9tYXNxIChhY2xfY29weSwgJm1vZGUpOworICAgICAgICBpZiAobmVlZF9hY2wgPj0gMCkgeworICAgICAgICAgICAgaWYgKG1vZGUgIT0gaW5vZGUtPmlfbW9kZSkgeworICAgICAgICAgICAgICAgIGlub2RlLT5pX21vZGUgPSBtb2RlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBJZiB3ZSBuZWVkIGFuIEFDTC4uICovCisgICAgICAgICAgICBpZiAobmVlZF9hY2wgPiAwKSB7CisgICAgICAgICAgICAgICAgZXJyID0gcmVpc2VyZnNfc2V0X2FjbCAoaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgYWNsX2NvcHkpOworICAgICAgICAgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cF9jb3B5OworICAgICAgICAgICAgfQorICAgICAgICB9CitjbGVhbnVwX2NvcHk6CisgICAgICAgIHBvc2l4X2FjbF9yZWxlYXNlIChhY2xfY29weSk7CitjbGVhbnVwOgorICAgICAgICBwb3NpeF9hY2xfcmVsZWFzZSAoYWNsKTsKKyAgICB9IGVsc2UgeworYXBwbHlfdW1hc2s6CisgICAgICAgIC8qIG5vIEFDTCwgYXBwbHkgdW1hc2sgKi8KKyAgICAgICAgaW5vZGUtPmlfbW9kZSAmPSB+Y3VycmVudC0+ZnMtPnVtYXNrOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKKy8qIExvb2tzIHVwIGFuZCBjYWNoZXMgdGhlIHJlc3VsdCBvZiB0aGUgZGVmYXVsdCBBQ0wuCisgKiBXZSBkbyB0aGlzIHNvIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBjYXJyeSB0aGUgeGF0dHJfc2VtIGludG8KKyAqIHJlaXNlcmZzX25ld19pbm9kZSBpZiB3ZSBkb24ndCBuZWVkIHRvICovCitpbnQKK3JlaXNlcmZzX2NhY2hlX2RlZmF1bHRfYWNsIChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworICAgIGludCByZXQgPSAwOworICAgIGlmIChyZWlzZXJmc19wb3NpeGFjbCAoaW5vZGUtPmlfc2IpICYmCisgICAgICAgICFpc19yZWlzZXJmc19wcml2X29iamVjdCAoaW5vZGUpKSB7CisgICAgICAgIHN0cnVjdCBwb3NpeF9hY2wgKmFjbDsKKyAgICAgICAgcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRyX2kgKGlub2RlKTsKKyAgICAgICAgcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRycyAoaW5vZGUtPmlfc2IpOworICAgICAgICBhY2wgPSByZWlzZXJmc19nZXRfYWNsIChpbm9kZSwgQUNMX1RZUEVfREVGQVVMVCk7CisgICAgICAgIHJlaXNlcmZzX3JlYWRfdW5sb2NrX3hhdHRycyAoaW5vZGUtPmlfc2IpOworICAgICAgICByZWlzZXJmc19yZWFkX3VubG9ja194YXR0cl9pIChpbm9kZSk7CisgICAgICAgIHJldCA9IGFjbCA/IDEgOiAwOworICAgICAgICBwb3NpeF9hY2xfcmVsZWFzZSAoYWNsKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQKK3JlaXNlcmZzX2FjbF9jaG1vZCAoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKyAgICAgICAgc3RydWN0IHBvc2l4X2FjbCAqYWNsLCAqY2xvbmU7CisgICAgICAgIGludCBlcnJvcjsKKworICAgICAgICBpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoZ2V0X2lub2RlX3NkX3ZlcnNpb24gKGlub2RlKSA9PSBTVEFUX0RBVEFfVjEgfHwKKwkgICAgIXJlaXNlcmZzX3Bvc2l4YWNsKGlub2RlLT5pX3NiKSkKKyAgICAgICAgeworCSAgICByZXR1cm4gMDsKKwl9CisKKyAgICAgICAgcmVpc2VyZnNfcmVhZF9sb2NrX3hhdHRycyAoaW5vZGUtPmlfc2IpOworICAgICAgICBhY2wgPSByZWlzZXJmc19nZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MpOworICAgICAgICByZWlzZXJmc19yZWFkX3VubG9ja194YXR0cnMgKGlub2RlLT5pX3NiKTsKKyAgICAgICAgaWYgKCFhY2wpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmIChJU19FUlIoYWNsKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gUFRSX0VSUihhY2wpOworICAgICAgICBjbG9uZSA9IHBvc2l4X2FjbF9jbG9uZShhY2wsIEdGUF9OT0ZTKTsKKyAgICAgICAgcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKyAgICAgICAgaWYgKCFjbG9uZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgZXJyb3IgPSBwb3NpeF9hY2xfY2htb2RfbWFzcShjbG9uZSwgaW5vZGUtPmlfbW9kZSk7CisgICAgICAgIGlmICghZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBpbnQgbG9jayA9ICFoYXNfeGF0dHJfZGlyIChpbm9kZSk7CisgICAgICAgICAgICAgICAgcmVpc2VyZnNfd3JpdGVfbG9ja194YXR0cl9pIChpbm9kZSk7CisgICAgICAgICAgICAgICAgaWYgKGxvY2spCisgICAgICAgICAgICAgICAgICAgIHJlaXNlcmZzX3dyaXRlX2xvY2tfeGF0dHJzIChpbm9kZS0+aV9zYik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZWlzZXJmc19yZWFkX2xvY2tfeGF0dHJzIChpbm9kZS0+aV9zYik7CisgICAgICAgICAgICAgICAgZXJyb3IgPSByZWlzZXJmc19zZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsIGNsb25lKTsKKyAgICAgICAgICAgICAgICBpZiAobG9jaykKKyAgICAgICAgICAgICAgICAgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRycyAoaW5vZGUtPmlfc2IpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmVpc2VyZnNfcmVhZF91bmxvY2tfeGF0dHJzIChpbm9kZS0+aV9zYik7CisgICAgICAgICAgICAgICAgcmVpc2VyZnNfd3JpdGVfdW5sb2NrX3hhdHRyX2kgKGlub2RlKTsKKyAgICAgICAgfQorICAgICAgICBwb3NpeF9hY2xfcmVsZWFzZShjbG9uZSk7CisgICAgICAgIHJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludAorcG9zaXhfYWNsX2FjY2Vzc19nZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKwlpZiAoc3RybGVuKG5hbWUpICE9IHNpemVvZihYQVRUUl9OQU1FX0FDTF9BQ0NFU1MpLTEpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiB4YXR0cl9nZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsIGJ1ZmZlciwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQKK3Bvc2l4X2FjbF9hY2Nlc3Nfc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCWlmIChzdHJsZW4obmFtZSkgIT0gc2l6ZW9mKFhBVFRSX05BTUVfQUNMX0FDQ0VTUyktMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHhhdHRyX3NldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgdmFsdWUsIHNpemUpOworfQorCitzdGF0aWMgaW50Citwb3NpeF9hY2xfYWNjZXNzX2RlbCAoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbyAqcmVpc2VyZnNfaSA9IFJFSVNFUkZTX0koaW5vZGUpOworICAgIHN0cnVjdCBwb3NpeF9hY2wgKiphY2wgPSAmcmVpc2VyZnNfaS0+aV9hY2xfYWNjZXNzOworICAgIGlmIChzdHJsZW4obmFtZSkgIT0gc2l6ZW9mKFhBVFRSX05BTUVfQUNMX0FDQ0VTUyktMSkKKwlyZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAoIUlTX0VSUiAoKmFjbCkgJiYgKmFjbCkgeworICAgICAgICBwb3NpeF9hY2xfcmVsZWFzZSAoKmFjbCk7CisgICAgICAgICphY2wgPSBFUlJfUFRSICgtRU5PREFUQSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3Bvc2l4X2FjbF9hY2Nlc3NfbGlzdCAoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sIGNoYXIgKm91dCkKK3sKKyAgICBpbnQgbGVuID0gbmFtZWxlbjsKKyAgICBpZiAoIXJlaXNlcmZzX3Bvc2l4YWNsIChpbm9kZS0+aV9zYikpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChvdXQpCisgICAgICAgIG1lbWNweSAob3V0LCBuYW1lLCBsZW4pOworCisgICAgcmV0dXJuIGxlbjsKK30KKworc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgcG9zaXhfYWNsX2FjY2Vzc19oYW5kbGVyID0geworCS5wcmVmaXggPSBYQVRUUl9OQU1FX0FDTF9BQ0NFU1MsCisJLmdldCA9IHBvc2l4X2FjbF9hY2Nlc3NfZ2V0LAorCS5zZXQgPSBwb3NpeF9hY2xfYWNjZXNzX3NldCwKKwkuZGVsID0gcG9zaXhfYWNsX2FjY2Vzc19kZWwsCisJLmxpc3QgPSBwb3NpeF9hY2xfYWNjZXNzX2xpc3QsCit9OworCitzdGF0aWMgaW50Citwb3NpeF9hY2xfZGVmYXVsdF9nZXQgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQoreworCWlmIChzdHJsZW4obmFtZSkgIT0gc2l6ZW9mKFhBVFRSX05BTUVfQUNMX0RFRkFVTFQpLTEpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiB4YXR0cl9nZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9ERUZBVUxULCBidWZmZXIsIHNpemUpOworfQorCitzdGF0aWMgaW50Citwb3NpeF9hY2xfZGVmYXVsdF9zZXQoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCWlmIChzdHJsZW4obmFtZSkgIT0gc2l6ZW9mKFhBVFRSX05BTUVfQUNMX0RFRkFVTFQpLTEpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiB4YXR0cl9zZXRfYWNsKGlub2RlLCBBQ0xfVFlQRV9ERUZBVUxULCB2YWx1ZSwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQKK3Bvc2l4X2FjbF9kZWZhdWx0X2RlbCAoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBzdHJ1Y3QgcmVpc2VyZnNfaW5vZGVfaW5mbyAqcmVpc2VyZnNfaSA9IFJFSVNFUkZTX0koaW5vZGUpOworICAgIHN0cnVjdCBwb3NpeF9hY2wgKiphY2wgPSAmcmVpc2VyZnNfaS0+aV9hY2xfZGVmYXVsdDsKKyAgICBpZiAoc3RybGVuKG5hbWUpICE9IHNpemVvZihYQVRUUl9OQU1FX0FDTF9ERUZBVUxUKS0xKQorCXJldHVybiAtRUlOVkFMOworICAgIGlmICghSVNfRVJSICgqYWNsKSAmJiAqYWNsKSB7CisgICAgICAgIHBvc2l4X2FjbF9yZWxlYXNlICgqYWNsKTsKKyAgICAgICAgKmFjbCA9IEVSUl9QVFIgKC1FTk9EQVRBKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcG9zaXhfYWNsX2RlZmF1bHRfbGlzdCAoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sIGNoYXIgKm91dCkKK3sKKyAgICBpbnQgbGVuID0gbmFtZWxlbjsKKyAgICBpZiAoIXJlaXNlcmZzX3Bvc2l4YWNsIChpbm9kZS0+aV9zYikpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChvdXQpCisgICAgICAgIG1lbWNweSAob3V0LCBuYW1lLCBsZW4pOworCisgICAgcmV0dXJuIGxlbjsKK30KKworc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgcG9zaXhfYWNsX2RlZmF1bHRfaGFuZGxlciA9IHsKKwkucHJlZml4ID0gWEFUVFJfTkFNRV9BQ0xfREVGQVVMVCwKKwkuZ2V0ID0gcG9zaXhfYWNsX2RlZmF1bHRfZ2V0LAorCS5zZXQgPSBwb3NpeF9hY2xfZGVmYXVsdF9zZXQsCisJLmRlbCA9IHBvc2l4X2FjbF9kZWZhdWx0X2RlbCwKKwkubGlzdCA9IHBvc2l4X2FjbF9kZWZhdWx0X2xpc3QsCit9OwpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMveGF0dHJfc2VjdXJpdHkuYyBiL2ZzL3JlaXNlcmZzL3hhdHRyX3NlY3VyaXR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA0NGQ1MQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3JlaXNlcmZzL3hhdHRyX3NlY3VyaXR5LmMKQEAgLTAsMCArMSw2OSBAQAorI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC94YXR0ci5oPgorI2luY2x1ZGUgPGxpbnV4L3JlaXNlcmZzX3hhdHRyLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2RlZmluZSBYQVRUUl9TRUNVUklUWV9QUkVGSVggInNlY3VyaXR5LiIKKworc3RhdGljIGludAorc2VjdXJpdHlfZ2V0IChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQoreworICAgIGlmIChzdHJsZW4obmFtZSkgPCBzaXplb2YoWEFUVFJfU0VDVVJJVFlfUFJFRklYKSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBpZiAoaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoaW5vZGUpKQorICAgICAgICByZXR1cm4gLUVQRVJNOworCisgICAgcmV0dXJuIHJlaXNlcmZzX3hhdHRyX2dldCAoaW5vZGUsIG5hbWUsIGJ1ZmZlciwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQKK3NlY3VyaXR5X3NldCAoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqYnVmZmVyLAorICAgICAgICAgIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisgICAgaWYgKHN0cmxlbihuYW1lKSA8IHNpemVvZihYQVRUUl9TRUNVUklUWV9QUkVGSVgpKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGlmIChpc19yZWlzZXJmc19wcml2X29iamVjdChpbm9kZSkpCisgICAgICAgIHJldHVybiAtRVBFUk07CisKKyAgICByZXR1cm4gcmVpc2VyZnNfeGF0dHJfc2V0IChpbm9kZSwgbmFtZSwgYnVmZmVyLCBzaXplLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQKK3NlY3VyaXR5X2RlbCAoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBpZiAoc3RybGVuKG5hbWUpIDwgc2l6ZW9mKFhBVFRSX1NFQ1VSSVRZX1BSRUZJWCkpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgaWYgKGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0KGlub2RlKSkKKyAgICAgICAgcmV0dXJuIC1FUEVSTTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzZWN1cml0eV9saXN0IChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwgY2hhciAqb3V0KQoreworICAgIGludCBsZW4gPSBuYW1lbGVuOworCisgICAgaWYgKGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0KGlub2RlKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAob3V0KQorICAgICAgICBtZW1jcHkgKG91dCwgbmFtZSwgbGVuKTsKKworICAgIHJldHVybiBsZW47Cit9CisKKworc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgc2VjdXJpdHlfaGFuZGxlciA9IHsKKwkucHJlZml4ID0gWEFUVFJfU0VDVVJJVFlfUFJFRklYLAorCS5nZXQgPSBzZWN1cml0eV9nZXQsCisJLnNldCA9IHNlY3VyaXR5X3NldCwKKwkuZGVsID0gc2VjdXJpdHlfZGVsLAorCS5saXN0ID0gc2VjdXJpdHlfbGlzdCwKK307CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy94YXR0cl90cnVzdGVkLmMgYi9mcy9yZWlzZXJmcy94YXR0cl90cnVzdGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM3NjIxOQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3JlaXNlcmZzL3hhdHRyX3RydXN0ZWQuYwpAQCAtMCwwICsxLDgxIEBACisjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3hhdHRyLmg+CisjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfeGF0dHIuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjZGVmaW5lIFhBVFRSX1RSVVNURURfUFJFRklYICJ0cnVzdGVkLiIKKworc3RhdGljIGludAordHJ1c3RlZF9nZXQgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisgICAgaWYgKHN0cmxlbihuYW1lKSA8IHNpemVvZihYQVRUUl9UUlVTVEVEX1BSRUZJWCkpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgaWYgKCFyZWlzZXJmc194YXR0cnMgKGlub2RlLT5pX3NiKSkKKyAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCisgICAgaWYgKCEoY2FwYWJsZShDQVBfU1lTX0FETUlOKSB8fCBpc19yZWlzZXJmc19wcml2X29iamVjdChpbm9kZSkpKQorICAgICAgICByZXR1cm4gLUVQRVJNOworCisgICAgcmV0dXJuIHJlaXNlcmZzX3hhdHRyX2dldCAoaW5vZGUsIG5hbWUsIGJ1ZmZlciwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQKK3RydXN0ZWRfc2V0IChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCB2b2lkICpidWZmZXIsCisgICAgICAgICAgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKyAgICBpZiAoc3RybGVuKG5hbWUpIDwgc2l6ZW9mKFhBVFRSX1RSVVNURURfUFJFRklYKSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBpZiAoIXJlaXNlcmZzX3hhdHRycyAoaW5vZGUtPmlfc2IpKQorICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisKKyAgICBpZiAoIShjYXBhYmxlKENBUF9TWVNfQURNSU4pIHx8IGlzX3JlaXNlcmZzX3ByaXZfb2JqZWN0KGlub2RlKSkpCisgICAgICAgIHJldHVybiAtRVBFUk07CisKKyAgICByZXR1cm4gcmVpc2VyZnNfeGF0dHJfc2V0IChpbm9kZSwgbmFtZSwgYnVmZmVyLCBzaXplLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQKK3RydXN0ZWRfZGVsIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lKQoreworICAgIGlmIChzdHJsZW4obmFtZSkgPCBzaXplb2YoWEFUVFJfVFJVU1RFRF9QUkVGSVgpKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGlmICghcmVpc2VyZnNfeGF0dHJzIChpbm9kZS0+aV9zYikpCisgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKworICAgIGlmICghKGNhcGFibGUoQ0FQX1NZU19BRE1JTikgfHwgaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoaW5vZGUpKSkKKyAgICAgICAgcmV0dXJuIC1FUEVSTTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit0cnVzdGVkX2xpc3QgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLCBjaGFyICpvdXQpCit7CisgICAgaW50IGxlbiA9IG5hbWVsZW47CisKKyAgICBpZiAoIXJlaXNlcmZzX3hhdHRycyAoaW5vZGUtPmlfc2IpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICghKGNhcGFibGUoQ0FQX1NZU19BRE1JTikgfHwgaXNfcmVpc2VyZnNfcHJpdl9vYmplY3QoaW5vZGUpKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAob3V0KQorICAgICAgICBtZW1jcHkgKG91dCwgbmFtZSwgbGVuKTsKKworICAgIHJldHVybiBsZW47Cit9CisKKworc3RydWN0IHJlaXNlcmZzX3hhdHRyX2hhbmRsZXIgdHJ1c3RlZF9oYW5kbGVyID0geworCS5wcmVmaXggPSBYQVRUUl9UUlVTVEVEX1BSRUZJWCwKKwkuZ2V0ID0gdHJ1c3RlZF9nZXQsCisJLnNldCA9IHRydXN0ZWRfc2V0LAorCS5kZWwgPSB0cnVzdGVkX2RlbCwKKwkubGlzdCA9IHRydXN0ZWRfbGlzdCwKK307CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy94YXR0cl91c2VyLmMgYi9mcy9yZWlzZXJmcy94YXR0cl91c2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc3MjgwNgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3JlaXNlcmZzL3hhdHRyX3VzZXIuYwpAQCAtMCwwICsxLDk5IEBACisjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3hhdHRyLmg+CisjaW5jbHVkZSA8bGludXgvcmVpc2VyZnNfeGF0dHIuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaWZkZWYgQ09ORklHX1JFSVNFUkZTX0ZTX1BPU0lYX0FDTAorIyBpbmNsdWRlIDxsaW51eC9yZWlzZXJmc19hY2wuaD4KKyNlbmRpZgorCisjZGVmaW5lIFhBVFRSX1VTRVJfUFJFRklYICJ1c2VyLiIKKworc3RhdGljIGludAordXNlcl9nZXQgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisKKyAgICBpbnQgZXJyb3I7CisKKyAgICBpZiAoc3RybGVuKG5hbWUpIDwgc2l6ZW9mKFhBVFRSX1VTRVJfUFJFRklYKSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBpZiAoIXJlaXNlcmZzX3hhdHRyc191c2VyIChpbm9kZS0+aV9zYikpCisgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKKworICAgIGVycm9yID0gcmVpc2VyZnNfcGVybWlzc2lvbl9sb2NrZWQgKGlub2RlLCBNQVlfUkVBRCwgTlVMTCk7CisgICAgaWYgKGVycm9yKQorICAgICAgICByZXR1cm4gZXJyb3I7CisKKyAgICByZXR1cm4gcmVpc2VyZnNfeGF0dHJfZ2V0IChpbm9kZSwgbmFtZSwgYnVmZmVyLCBzaXplKTsKK30KKworc3RhdGljIGludAordXNlcl9zZXQgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKKyAgICAgICAgICBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCisgICAgaW50IGVycm9yOworCisgICAgaWYgKHN0cmxlbihuYW1lKSA8IHNpemVvZihYQVRUUl9VU0VSX1BSRUZJWCkpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgaWYgKCFyZWlzZXJmc194YXR0cnNfdXNlciAoaW5vZGUtPmlfc2IpKQorICAgICAgICByZXR1cm4gLUVPUE5PVFNVUFA7CisKKyAgICBpZiAoIVNfSVNSRUcgKGlub2RlLT5pX21vZGUpICYmCisgICAgICAgICghU19JU0RJUiAoaW5vZGUtPmlfbW9kZSkgfHwgaW5vZGUtPmlfbW9kZSAmIFNfSVNWVFgpKQorICAgICAgICByZXR1cm4gLUVQRVJNOworCisgICAgZXJyb3IgPSByZWlzZXJmc19wZXJtaXNzaW9uX2xvY2tlZCAoaW5vZGUsIE1BWV9XUklURSwgTlVMTCk7CisgICAgaWYgKGVycm9yKQorICAgICAgICByZXR1cm4gZXJyb3I7CisKKyAgICByZXR1cm4gcmVpc2VyZnNfeGF0dHJfc2V0IChpbm9kZSwgbmFtZSwgYnVmZmVyLCBzaXplLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQKK3VzZXJfZGVsIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBjb25zdCBjaGFyICpuYW1lKQoreworICAgIGludCBlcnJvcjsKKworICAgIGlmIChzdHJsZW4obmFtZSkgPCBzaXplb2YoWEFUVFJfVVNFUl9QUkVGSVgpKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGlmICghcmVpc2VyZnNfeGF0dHJzX3VzZXIgKGlub2RlLT5pX3NiKSkKKyAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOworCisgICAgaWYgKCFTX0lTUkVHIChpbm9kZS0+aV9tb2RlKSAmJgorICAgICAgICAoIVNfSVNESVIgKGlub2RlLT5pX21vZGUpIHx8IGlub2RlLT5pX21vZGUgJiBTX0lTVlRYKSkKKyAgICAgICAgcmV0dXJuIC1FUEVSTTsKKworICAgIGVycm9yID0gcmVpc2VyZnNfcGVybWlzc2lvbl9sb2NrZWQgKGlub2RlLCBNQVlfV1JJVEUsIE5VTEwpOworICAgIGlmIChlcnJvcikKKyAgICAgICAgcmV0dXJuIGVycm9yOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3VzZXJfbGlzdCAoc3RydWN0IGlub2RlICppbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sIGNoYXIgKm91dCkKK3sKKyAgICBpbnQgbGVuID0gbmFtZWxlbjsKKyAgICBpZiAoIXJlaXNlcmZzX3hhdHRyc191c2VyIChpbm9kZS0+aV9zYikpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKG91dCkKKyAgICAgICAgbWVtY3B5IChvdXQsIG5hbWUsIGxlbik7CisKKyAgICByZXR1cm4gbGVuOworfQorCitzdHJ1Y3QgcmVpc2VyZnNfeGF0dHJfaGFuZGxlciB1c2VyX2hhbmRsZXIgPSB7CisJLnByZWZpeCA9IFhBVFRSX1VTRVJfUFJFRklYLAorCS5nZXQgPSB1c2VyX2dldCwKKwkuc2V0ID0gdXNlcl9zZXQsCisJLmRlbCA9IHVzZXJfZGVsLAorCS5saXN0ID0gdXNlcl9saXN0LAorfTsKZGlmZiAtLWdpdCBhL2ZzL3JvbWZzL01ha2VmaWxlIGIvZnMvcm9tZnMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk1YjIxYwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3JvbWZzL01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IHJvbWZzIGZpbGVzeXN0ZW0gcm91dGluZXMuCisjCisKK29iai0kKENPTkZJR19ST01GU19GUykgKz0gcm9tZnMubworCityb21mcy1vYmpzIDo9IGlub2RlLm8KZGlmZiAtLWdpdCBhL2ZzL3JvbWZzL2lub2RlLmMgYi9mcy9yb21mcy9pbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NGYzODIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9yb21mcy9pbm9kZS5jCkBAIC0wLDAgKzEsNjQ4IEBACisvKgorICogUk9NRlMgZmlsZSBzeXN0ZW0sIExpbnV4IGltcGxlbWVudGF0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk3LTE5OTkgIEphbm9zIEZhcmthcyA8Y2hleHVtQHNoYWRvdy5iYW5raS5odT4KKyAqCisgKiBVc2luZyBwYXJ0cyBvZiB0aGUgbWluaXggZmlsZXN5c3RlbQorICogQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqIGFuZCBwYXJ0cyBvZiB0aGUgYWZmcyBmaWxlc3lzdGVtIGFkZGl0aW9uYWxseQorICogQ29weXJpZ2h0IChDKSAxOTkzICBSYXkgQnVycgorICogQ29weXJpZ2h0IChDKSAxOTk2ICBIYW5zLUpvYWNoaW0gV2lkbWFpZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIENoYW5nZXMKKyAqCQkJCQlDaGFuZ2VkIGZvciAyLjEuMTkgbW9kdWxlcworICoJSmFuIDE5OTcJCQlJbml0aWFsIHJlbGVhc2UKKyAqCUp1biAxOTk3CQkJMi4xLjQzKyBjaGFuZ2VzCisgKgkJCQkJUHJvcGVyIHBhZ2UgbG9ja2luZyBpbiByZWFkcGFnZQorICoJCQkJCUNoYW5nZWQgdG8gd29yayB3aXRoIDIuMS40NSsgZnMKKyAqCUp1bCAxOTk3CQkJRml4ZWQgZm9sbG93X2xpbmsKKyAqCQkJMi4xLjQ3CisgKgkJCQkJbG9va3VwIHNob3VsZG4ndCByZXR1cm4gLUVOT0VOVAorICoJCQkJCWZyb20gSG9yc3Qgdm9uIEJyYW5kOgorICoJCQkJCSAgZmFpbCBvbiB3cm9uZyBjaGVja3N1bQorICoJCQkJCSAgZG91YmxlIHVubG9ja19zdXBlciB3YXMgcG9zc2libGUKKyAqCQkJCQkgIGNvcnJlY3QgbmFtZWxlbiBmb3Igc3RhdGZzCisgKgkJCQkJc3BvdHRlZCBieSBCaWxsIEhhd2VzOgorICoJCQkJCSAgcmVhZGxpbmsgc2hvdWxkbid0IGlwdXQoKQorICoJSnVuIDE5OTgJMi4xLjEwNgkJZnJvbSBBdmVyeSBQZW5uYXJ1bjogZ2xpYmMgc2NhbmRpcigpCisgKgkJCQkJICBleHBvc2VkIGEgcHJvYmxlbSBpbiByZWFkZGlyCisgKgkJCTIuMS4xMDcJCWNvZGUtZnJlZXplIHNwZWxsY2hlY2tlciBydW4KKyAqCUF1ZyAxOTk4CQkJMi4xLjExOCsgVkZTIGNoYW5nZXMKKyAqCVNlcCAxOTk4CTIuMS4xMjIJCWFub3RoZXIgVkZTIGNoYW5nZSAoZm9sbG93X2xpbmspCisgKglBcHIgMTk5OQkyLjIuNwkJbm8gbW9yZSBFQkFERiBjaGVja2luZyBpbgorICoJCQkJCSAgbG9va3VwL3JlYWRkaXIsIHVzZSBFUlJfUFRSCisgKglKdW4gMTk5OQkyLjMuNgkJZF9hbGxvY19yb290IHVzZSBjaGFuZ2VkCisgKgkJCTIuMy45CQljbGVhbiB1cCB1c2FnZSBvZiBFTk9FTlQvbmVnYXRpdmUKKyAqCQkJCQkgIGRlbnRyaWVzIGluIGxvb2t1cAorICoJCQkJCWNsZWFuIHVwIHBhZ2UgZmxhZ3Mgc2V0dGluZworICoJCQkJCSAgKGVycm9yLCB1cHRvZGF0ZSwgbG9ja2luZykgaW4KKyAqCQkJCQkgIGluIHJlYWRwYWdlCisgKgkJCQkJdXNlIGluaXRfc3BlY2lhbF9pbm9kZSBmb3IKKyAqCQkJCQkgIGZpZm9zL3NvY2tldHMgKGFuZCBzdHJlYW1saW5lKSBpbgorICoJCQkJCSAgcmVhZF9pbm9kZSwgZml4IF9vcHMgdGFibGUgb3JkZXIKKyAqCUF1ZyAxOTk5CTIuMy4xNgkJX19pbml0ZnVuYygpID0+IF9faW5pdCBjaGFuZ2UKKyAqCU9jdCAxOTk5CTIuMy4yNAkJcGFnZS0+b3duZXIgaGFjayBvYnNvbGV0ZWQKKyAqCU5vdiAxOTk5CTIuMy4yNwkJMi4zLjI1KyBwYWdlLT5vZmZzZXQgPT4gaW5kZXggY2hhbmdlCisgKi8KKworLyogdG9kbzoKKyAqCS0gc2VlIERvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcm9tZnMudHh0CisgKgktIHVzZSBhbGxvY2F0ZWQsIG5vdCBzdGFjayBtZW1vcnkgZm9yIGZpbGUgbmFtZXM/CisgKgktIGNvbnNpZGVyaW5nIHdyaXRlIGFjY2Vzcy4uLgorICoJLSBuZXR3b3JrICh0ZnRwKSBmaWxlcz8KKyAqCS0gbWVyZ2UgYmFjayBzb21lIF9vcCB0YWJsZXMKKyAqLworCisvKgorICogU29ycnkgYWJvdXQgc29tZSBvcHRpbWl6YXRpb25zIGFuZCBmb3Igc29tZSBnb3RvJ3MuICBJIGp1c3Qgd2FudGVkCisgKiB0byBzcXVlZXplIHNvbWUgbW9yZSBieXRlcyBvdXQgb2YgdGhpcyBjb2RlLi4gOikKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9yb21mc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCitzdHJ1Y3Qgcm9tZnNfaW5vZGVfaW5mbyB7CisJdW5zaWduZWQgbG9uZyBpX21ldGFzaXplOwkvKiBzaXplIG9mIG5vbi1kYXRhIGFyZWEgKi8KKwl1bnNpZ25lZCBsb25nIGlfZGF0YW9mZnNldDsJLyogZnJvbSB0aGUgc3RhcnQgb2YgZnMgKi8KKwlzdHJ1Y3QgaW5vZGUgdmZzX2lub2RlOworfTsKKworLyogaW5zdGVhZCBvZiBwcml2YXRlIHN1cGVyYmxvY2sgZGF0YSAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJvbWZzX21heHNpemUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpc2ItPnNfZnNfaW5mbzsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgcm9tZnNfaW5vZGVfaW5mbyAqUk9NRlNfSShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiBsaXN0X2VudHJ5KGlub2RlLCBzdHJ1Y3Qgcm9tZnNfaW5vZGVfaW5mbywgdmZzX2lub2RlKTsKK30KKworc3RhdGljIF9fdTMyCityb21mc19jaGVja3N1bSh2b2lkICpkYXRhLCBpbnQgc2l6ZSkKK3sKKwlfX3UzMiBzdW07CisJX19iZTMyICpwdHI7CisKKwlzdW0gPSAwOyBwdHIgPSBkYXRhOworCXNpemU+Pj0yOworCXdoaWxlIChzaXplPjApIHsKKwkJc3VtICs9IGJlMzJfdG9fY3B1KCpwdHIrKyk7CisJCXNpemUtLTsKKwl9CisJcmV0dXJuIHN1bTsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHJvbWZzX29wczsKKworc3RhdGljIGludCByb21mc19maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXN0cnVjdCByb21mc19zdXBlcl9ibG9jayAqcnNiOworCXN0cnVjdCBpbm9kZSAqcm9vdDsKKwlpbnQgc3o7CisKKwkvKiBJIHdvdWxkIHBhcnNlIHRoZSBvcHRpb25zIGhlcmUsIGJ1dCB0aGVyZSBhcmUgbm9uZS4uIDopICovCisKKwlzYl9zZXRfYmxvY2tzaXplKHMsIFJPTUJTSVpFKTsKKwlzLT5zX21heGJ5dGVzID0gMHhGRkZGRkZGRjsKKworCWJoID0gc2JfYnJlYWQocywgMCk7CisJaWYgKCFiaCkgeworCQkvKiBYWFggbWVyZ2Ugd2l0aCBvdGhlciBwcmludGs/ICovCisgICAgICAgICAgICAgICAgcHJpbnRrICgicm9tZnM6IHVuYWJsZSB0byByZWFkIHN1cGVyYmxvY2tcbiIpOworCQlnb3RvIG91dG5vYmg7CisJfQorCisJcnNiID0gKHN0cnVjdCByb21mc19zdXBlcl9ibG9jayAqKWJoLT5iX2RhdGE7CisJc3ogPSBiZTMyX3RvX2NwdShyc2ItPnNpemUpOworCWlmIChyc2ItPndvcmQwICE9IFJPTVNCX1dPUkQwIHx8IHJzYi0+d29yZDEgIT0gUk9NU0JfV09SRDEKKwkgICB8fCBzeiA8IFJPTUZIX1NJWkUpIHsKKwkJaWYgKCFzaWxlbnQpCisJCQlwcmludGsgKCJWRlM6IENhbid0IGZpbmQgYSByb21mcyBmaWxlc3lzdGVtIG9uIGRldiAiCisJCQkJIiVzLlxuIiwgcy0+c19pZCk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAocm9tZnNfY2hlY2tzdW0ocnNiLCBtaW5fdChpbnQsIHN6LCA1MTIpKSkgeworCQlwcmludGsgKCJyb21mczogYmFkIGluaXRpYWwgY2hlY2tzdW0gb24gZGV2ICIKKwkJCSIlcy5cbiIsIHMtPnNfaWQpOworCQlnb3RvIG91dDsKKwl9CisKKwlzLT5zX21hZ2ljID0gUk9NRlNfTUFHSUM7CisJcy0+c19mc19pbmZvID0gKHZvaWQgKikobG9uZylzejsKKworCXMtPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCisJLyogRmluZCB0aGUgc3RhcnQgb2YgdGhlIGZzICovCisJc3ogPSAoUk9NRkhfU0laRSArCisJICAgICAgc3Rybmxlbihyc2ItPm5hbWUsIFJPTUZTX01BWEZOKSArIDEgKyBST01GSF9QQUQpCisJICAgICAmIFJPTUZIX01BU0s7CisKKwlzLT5zX29wCT0gJnJvbWZzX29wczsKKwlyb290ID0gaWdldChzLCBzeik7CisJaWYgKCFyb290KQorCQlnb3RvIG91dDsKKworCXMtPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290KTsKKwlpZiAoIXMtPnNfcm9vdCkKKwkJZ290byBvdXRpcHV0OworCisJYnJlbHNlKGJoKTsKKwlyZXR1cm4gMDsKKworb3V0aXB1dDoKKwlpcHV0KHJvb3QpOworb3V0OgorCWJyZWxzZShiaCk7CitvdXRub2JoOgorCXJldHVybiAtRUlOVkFMOworfQorCisvKiBUaGF0J3Mgc2ltcGxlIHRvby4gKi8KKworc3RhdGljIGludAorcm9tZnNfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICpidWYpCit7CisJYnVmLT5mX3R5cGUgPSBST01GU19NQUdJQzsKKwlidWYtPmZfYnNpemUgPSBST01CU0laRTsKKwlidWYtPmZfYmZyZWUgPSBidWYtPmZfYmF2YWlsID0gYnVmLT5mX2ZmcmVlOworCWJ1Zi0+Zl9ibG9ja3MgPSAocm9tZnNfbWF4c2l6ZShzYikrUk9NQlNJWkUtMSk+PlJPTUJTQklUUzsKKwlidWYtPmZfbmFtZWxlbiA9IFJPTUZTX01BWEZOOworCXJldHVybiAwOworfQorCisvKiBzb21lIGhlbHBlciByb3V0aW5lcyAqLworCitzdGF0aWMgaW50Cityb21mc19zdHJubGVuKHN0cnVjdCBpbm9kZSAqaSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwl1bnNpZ25lZCBsb25nIGF2YWlsLCBtYXhzaXplLCByZXM7CisKKwltYXhzaXplID0gcm9tZnNfbWF4c2l6ZShpLT5pX3NiKTsKKwlpZiAob2Zmc2V0ID49IG1heHNpemUpCisJCXJldHVybiAtMTsKKworCS8qIHN0cm5sZW4gaXMgYWxtb3N0IGFsd2F5cyB2YWxpZCAqLworCWlmIChjb3VudCA+IG1heHNpemUgfHwgb2Zmc2V0K2NvdW50ID4gbWF4c2l6ZSkKKwkJY291bnQgPSBtYXhzaXplLW9mZnNldDsKKworCWJoID0gc2JfYnJlYWQoaS0+aV9zYiwgb2Zmc2V0Pj5ST01CU0JJVFMpOworCWlmICghYmgpCisJCXJldHVybiAtMTsJCS8qIGVycm9yICovCisKKwlhdmFpbCA9IFJPTUJTSVpFIC0gKG9mZnNldCAmIFJPTUJNQVNLKTsKKwltYXhzaXplID0gbWluX3QodW5zaWduZWQgbG9uZywgY291bnQsIGF2YWlsKTsKKwlyZXMgPSBzdHJubGVuKCgoY2hhciAqKWJoLT5iX2RhdGEpKyhvZmZzZXQmUk9NQk1BU0spLCBtYXhzaXplKTsKKwlicmVsc2UoYmgpOworCisJaWYgKHJlcyA8IG1heHNpemUpCisJCXJldHVybiByZXM7CQkvKiBmb3VuZCBhbGwgb2YgaXQgKi8KKworCXdoaWxlIChyZXMgPCBjb3VudCkgeworCQlvZmZzZXQgKz0gbWF4c2l6ZTsKKworCQliaCA9IHNiX2JyZWFkKGktPmlfc2IsIG9mZnNldD4+Uk9NQlNCSVRTKTsKKwkJaWYgKCFiaCkKKwkJCXJldHVybiAtMTsKKwkJbWF4c2l6ZSA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIGNvdW50IC0gcmVzLCBST01CU0laRSk7CisJCWF2YWlsID0gc3RybmxlbihiaC0+Yl9kYXRhLCBtYXhzaXplKTsKKwkJcmVzICs9IGF2YWlsOworCQlicmVsc2UoYmgpOworCQlpZiAoYXZhaWwgPCBtYXhzaXplKQorCQkJcmV0dXJuIHJlczsKKwl9CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludAorcm9tZnNfY29weWZyb20oc3RydWN0IGlub2RlICppLCB2b2lkICpkZXN0LCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCXVuc2lnbmVkIGxvbmcgYXZhaWwsIG1heHNpemUsIHJlczsKKworCW1heHNpemUgPSByb21mc19tYXhzaXplKGktPmlfc2IpOworCWlmIChvZmZzZXQgPj0gbWF4c2l6ZSB8fCBjb3VudCA+IG1heHNpemUgfHwgb2Zmc2V0K2NvdW50Pm1heHNpemUpCisJCXJldHVybiAtMTsKKworCWJoID0gc2JfYnJlYWQoaS0+aV9zYiwgb2Zmc2V0Pj5ST01CU0JJVFMpOworCWlmICghYmgpCisJCXJldHVybiAtMTsJCS8qIGVycm9yICovCisKKwlhdmFpbCA9IFJPTUJTSVpFIC0gKG9mZnNldCAmIFJPTUJNQVNLKTsKKwltYXhzaXplID0gbWluX3QodW5zaWduZWQgbG9uZywgY291bnQsIGF2YWlsKTsKKwltZW1jcHkoZGVzdCwgKChjaGFyICopYmgtPmJfZGF0YSkgKyAob2Zmc2V0ICYgUk9NQk1BU0spLCBtYXhzaXplKTsKKwlicmVsc2UoYmgpOworCisJcmVzID0gbWF4c2l6ZTsJCQkvKiBhbGwgb2YgaXQgKi8KKworCXdoaWxlIChyZXMgPCBjb3VudCkgeworCQlvZmZzZXQgKz0gbWF4c2l6ZTsKKwkJZGVzdCArPSBtYXhzaXplOworCisJCWJoID0gc2JfYnJlYWQoaS0+aV9zYiwgb2Zmc2V0Pj5ST01CU0JJVFMpOworCQlpZiAoIWJoKQorCQkJcmV0dXJuIC0xOworCQltYXhzaXplID0gbWluX3QodW5zaWduZWQgbG9uZywgY291bnQgLSByZXMsIFJPTUJTSVpFKTsKKwkJbWVtY3B5KGRlc3QsIGJoLT5iX2RhdGEsIG1heHNpemUpOworCQlicmVsc2UoYmgpOworCQlyZXMgKz0gbWF4c2l6ZTsKKwl9CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgcm9tZnNfZHR5cGVfdGFibGVbXSA9IHsKKwlEVF9VTktOT1dOLCBEVF9ESVIsIERUX1JFRywgRFRfTE5LLCBEVF9CTEssIERUX0NIUiwgRFRfU09DSywgRFRfRklGTworfTsKKworc3RhdGljIGludAorcm9tZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmkgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3Qgcm9tZnNfaW5vZGUgcmk7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQsIG1heG9mZjsKKwlpbnQgaiwgaW5vLCBuZXh0Zmg7CisJaW50IHN0b3JlZCA9IDA7CisJY2hhciBmc25hbWVbUk9NRlNfTUFYRk5dOwkvKiBYWFggZHluYW1pYz8gKi8KKworCWxvY2tfa2VybmVsKCk7CisKKwltYXhvZmYgPSByb21mc19tYXhzaXplKGktPmlfc2IpOworCisJb2Zmc2V0ID0gZmlscC0+Zl9wb3M7CisJaWYgKCFvZmZzZXQpIHsKKwkJb2Zmc2V0ID0gaS0+aV9pbm8gJiBST01GSF9NQVNLOworCQlpZiAocm9tZnNfY29weWZyb20oaSwgJnJpLCBvZmZzZXQsIFJPTUZIX1NJWkUpIDw9IDApCisJCQlnb3RvIG91dDsKKwkJb2Zmc2V0ID0gYmUzMl90b19jcHUocmkuc3BlYykgJiBST01GSF9NQVNLOworCX0KKworCS8qIE5vdCByZWFsbHkgZmFpbHNhZmUsIGJ1dCB3ZSBhcmUgcmVhZC1vbmx5Li4uICovCisJZm9yKDs7KSB7CisJCWlmICghb2Zmc2V0IHx8IG9mZnNldCA+PSBtYXhvZmYpIHsKKwkJCW9mZnNldCA9IG1heG9mZjsKKwkJCWZpbHAtPmZfcG9zID0gb2Zmc2V0OworCQkJZ290byBvdXQ7CisJCX0KKwkJZmlscC0+Zl9wb3MgPSBvZmZzZXQ7CisKKwkJLyogRmV0Y2ggaW5vZGUgaW5mbyAqLworCQlpZiAocm9tZnNfY29weWZyb20oaSwgJnJpLCBvZmZzZXQsIFJPTUZIX1NJWkUpIDw9IDApCisJCQlnb3RvIG91dDsKKworCQlqID0gcm9tZnNfc3RybmxlbihpLCBvZmZzZXQrUk9NRkhfU0laRSwgc2l6ZW9mKGZzbmFtZSktMSk7CisJCWlmIChqIDwgMCkKKwkJCWdvdG8gb3V0OworCisJCWZzbmFtZVtqXT0wOworCQlyb21mc19jb3B5ZnJvbShpLCBmc25hbWUsIG9mZnNldCtST01GSF9TSVpFLCBqKTsKKworCQlpbm8gPSBvZmZzZXQ7CisJCW5leHRmaCA9IGJlMzJfdG9fY3B1KHJpLm5leHQpOworCQlpZiAoKG5leHRmaCAmIFJPTUZIX1RZUEUpID09IFJPTUZIX0hSRCkKKwkJCWlubyA9IGJlMzJfdG9fY3B1KHJpLnNwZWMpOworCQlpZiAoZmlsbGRpcihkaXJlbnQsIGZzbmFtZSwgaiwgb2Zmc2V0LCBpbm8sCisJCQkgICAgcm9tZnNfZHR5cGVfdGFibGVbbmV4dGZoICYgUk9NRkhfVFlQRV0pIDwgMCkgeworCQkJZ290byBvdXQ7CisJCX0KKwkJc3RvcmVkKys7CisJCW9mZnNldCA9IG5leHRmaCAmIFJPTUZIX01BU0s7CisJfQorb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gc3RvcmVkOworfQorCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqCityb21mc19sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQsIG1heG9mZjsKKwlpbnQgZnNsZW4sIHJlczsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWNoYXIgZnNuYW1lW1JPTUZTX01BWEZOXTsJLyogWFhYIGR5bmFtaWM/ICovCisJc3RydWN0IHJvbWZzX2lub2RlIHJpOworCWNvbnN0IGNoYXIgKm5hbWU7CQkvKiBnb3QgZnJvbSBkZW50cnkgKi8KKwlpbnQgbGVuOworCisJcmVzID0gLUVBQ0NFUzsJCQkvKiBwbGFjZWhvbGRlciBmb3IgIm5vIGRhdGEgaGVyZSIgKi8KKwlvZmZzZXQgPSBkaXItPmlfaW5vICYgUk9NRkhfTUFTSzsKKwlsb2NrX2tlcm5lbCgpOworCWlmIChyb21mc19jb3B5ZnJvbShkaXIsICZyaSwgb2Zmc2V0LCBST01GSF9TSVpFKSA8PSAwKQorCQlnb3RvIG91dDsKKworCW1heG9mZiA9IHJvbWZzX21heHNpemUoZGlyLT5pX3NiKTsKKwlvZmZzZXQgPSBiZTMyX3RvX2NwdShyaS5zcGVjKSAmIFJPTUZIX01BU0s7CisKKwkvKiBPSywgbm93IGZpbmQgdGhlIGZpbGUgd2hvc2UgbmFtZSBpcyBpbiAiZGVudHJ5IiBpbiB0aGUKKwkgKiBkaXJlY3Rvcnkgc3BlY2lmaWVkIGJ5ICJkaXIiLiAgKi8KKworCW5hbWUgPSBkZW50cnktPmRfbmFtZS5uYW1lOworCWxlbiA9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKKworCWZvcig7OykgeworCQlpZiAoIW9mZnNldCB8fCBvZmZzZXQgPj0gbWF4b2ZmKQorCQkJZ290byBvdXQwOworCQlpZiAocm9tZnNfY29weWZyb20oZGlyLCAmcmksIG9mZnNldCwgUk9NRkhfU0laRSkgPD0gMCkKKwkJCWdvdG8gb3V0OworCisJCS8qIHRyeSB0byBtYXRjaCB0aGUgZmlyc3QgMTYgYnl0ZXMgb2YgbmFtZSAqLworCQlmc2xlbiA9IHJvbWZzX3N0cm5sZW4oZGlyLCBvZmZzZXQrUk9NRkhfU0laRSwgUk9NRkhfU0laRSk7CisJCWlmIChsZW4gPCBST01GSF9TSVpFKSB7CisJCQlpZiAobGVuID09IGZzbGVuKSB7CisJCQkJLyogYm90aCBhcmUgc2hvcnRlciwgYW5kIHNhbWUgc2l6ZSAqLworCQkJCXJvbWZzX2NvcHlmcm9tKGRpciwgZnNuYW1lLCBvZmZzZXQrUk9NRkhfU0laRSwgbGVuKzEpOworCQkJCWlmIChzdHJuY21wIChuYW1lLCBmc25hbWUsIGxlbikgPT0gMCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSBpZiAoZnNsZW4gPj0gUk9NRkhfU0laRSkgeworCQkJLyogYm90aCBhcmUgbG9uZ2VyOyBYWFggb3B0aW1pemUgbWF4IHNpemUgKi8KKwkJCWZzbGVuID0gcm9tZnNfc3RybmxlbihkaXIsIG9mZnNldCtST01GSF9TSVpFLCBzaXplb2YoZnNuYW1lKS0xKTsKKwkJCWlmIChsZW4gPT0gZnNsZW4pIHsKKwkJCQlyb21mc19jb3B5ZnJvbShkaXIsIGZzbmFtZSwgb2Zmc2V0K1JPTUZIX1NJWkUsIGxlbisxKTsKKwkJCQlpZiAoc3RybmNtcChuYW1lLCBmc25hbWUsIGxlbikgPT0gMCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJLyogbmV4dCBlbnRyeSAqLworCQlvZmZzZXQgPSBiZTMyX3RvX2NwdShyaS5uZXh0KSAmIFJPTUZIX01BU0s7CisJfQorCisJLyogSGFyZCBsaW5rIGhhbmRsaW5nICovCisJaWYgKChiZTMyX3RvX2NwdShyaS5uZXh0KSAmIFJPTUZIX1RZUEUpID09IFJPTUZIX0hSRCkKKwkJb2Zmc2V0ID0gYmUzMl90b19jcHUocmkuc3BlYykgJiBST01GSF9NQVNLOworCisJaWYgKChpbm9kZSA9IGlnZXQoZGlyLT5pX3NiLCBvZmZzZXQpKSkKKwkJZ290byBvdXRpOworCisJLyoKKwkgKiBpdCdzIGEgYml0IGZ1bmt5LCBfbG9va3VwIG5lZWRzIHRvIHJldHVybiBhbiBlcnJvciBjb2RlCisJICogKG5lZ2F0aXZlKSBvciBhIE5VTEwsIGJvdGggYXMgYSBkZW50cnkuICBFTk9FTlQgc2hvdWxkIG5vdAorCSAqIGJlIHJldHVybmVkLCBpbnN0ZWFkIHdlIG5lZWQgdG8gY3JlYXRlIGEgbmVnYXRpdmUgZGVudHJ5IGJ5CisJICogZF9hZGQoZGVudHJ5LCBOVUxMKTsgYW5kIHJldHVybiAwIGFzIG5vIGVycm9yLgorCSAqIChBbHRob3VnaCBhcyBJIHNlZSwgaXQgb25seSBtYXR0ZXJzIG9uIHdyaXRhYmxlIGZpbGUKKwkgKiBzeXN0ZW1zKS4KKwkgKi8KKworb3V0MDoJaW5vZGUgPSBOVUxMOworb3V0aToJcmVzID0gMDsKKwlkX2FkZCAoZGVudHJ5LCBpbm9kZSk7CisKK291dDoJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBFUlJfUFRSKHJlcyk7Cit9CisKKy8qCisgKiBPaywgd2UgZG8gcmVhZHBhZ2UsIHRvIGJlIGFibGUgdG8gZXhlY3V0ZSBwcm9ncmFtcy4gIFVuZm9ydHVuYXRlbHksCisgKiB3ZSBjYW4ndCB1c2UgYm1hcCwgc2luY2Ugd2UgbWF5IGhhdmUgbG9vc2VyIGFsaWdubWVudHMuCisgKi8KKworc3RhdGljIGludAorcm9tZnNfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICogcGFnZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCwgYXZhaWwsIHJlYWRsZW47CisJdm9pZCAqYnVmOworCWludCByZXN1bHQgPSAtRUlPOworCisJcGFnZV9jYWNoZV9nZXQocGFnZSk7CisJbG9ja19rZXJuZWwoKTsKKwlidWYgPSBrbWFwKHBhZ2UpOworCWlmICghYnVmKQorCQlnb3RvIGVycl9vdXQ7CisKKwkvKiAzMiBiaXQgd2FybmluZyAtLSBidXQgbm90IGZvciB1cyA6KSAqLworCW9mZnNldCA9IHBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisJaWYgKG9mZnNldCA8IGlub2RlLT5pX3NpemUpIHsKKwkJYXZhaWwgPSBpbm9kZS0+aV9zaXplLW9mZnNldDsKKwkJcmVhZGxlbiA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIGF2YWlsLCBQQUdFX1NJWkUpOworCQlpZiAocm9tZnNfY29weWZyb20oaW5vZGUsIGJ1ZiwgUk9NRlNfSShpbm9kZSktPmlfZGF0YW9mZnNldCtvZmZzZXQsIHJlYWRsZW4pID09IHJlYWRsZW4pIHsKKwkJCWlmIChyZWFkbGVuIDwgUEFHRV9TSVpFKSB7CisJCQkJbWVtc2V0KGJ1ZiArIHJlYWRsZW4sMCxQQUdFX1NJWkUtcmVhZGxlbik7CisJCQl9CisJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJCQlyZXN1bHQgPSAwOworCQl9CisJfQorCWlmIChyZXN1bHQpIHsKKwkJbWVtc2V0KGJ1ZiwgMCwgUEFHRV9TSVpFKTsKKwkJU2V0UGFnZUVycm9yKHBhZ2UpOworCX0KKwlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKKworCXVubG9ja19wYWdlKHBhZ2UpOworCisJa3VubWFwKHBhZ2UpOworZXJyX291dDoKKwlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJdW5sb2NrX2tlcm5lbCgpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyogTWFwcGluZyBmcm9tIG91ciB0eXBlcyB0byB0aGUga2VybmVsICovCisKK3N0YXRpYyBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHJvbWZzX2FvcHMgPSB7CisJLnJlYWRwYWdlID0gcm9tZnNfcmVhZHBhZ2UKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJvbWZzX2Rpcl9vcGVyYXRpb25zID0geworCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIJPSByb21mc19yZWFkZGlyLAorfTsKKworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHJvbWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0geworCS5sb29rdXAJCT0gcm9tZnNfbG9va3VwLAorfTsKKworc3RhdGljIG1vZGVfdCByb21mc19tb2RlbWFwW10gPQoreworCTAsIFNfSUZESVIrMDY0NCwgU19JRlJFRyswNjQ0LCBTX0lGTE5LKzA3NzcsCisJU19JRkJMSyswNjAwLCBTX0lGQ0hSKzA2MDAsIFNfSUZTT0NLKzA2NDQsIFNfSUZJRk8rMDY0NAorfTsKKworc3RhdGljIHZvaWQKK3JvbWZzX3JlYWRfaW5vZGUoc3RydWN0IGlub2RlICppKQoreworCWludCBuZXh0ZmgsIGlubzsKKwlzdHJ1Y3Qgcm9tZnNfaW5vZGUgcmk7CisKKwlpbm8gPSBpLT5pX2lubyAmIFJPTUZIX01BU0s7CisJaS0+aV9tb2RlID0gMDsKKworCS8qIExvb3AgZm9yIGZpbmRpbmcgdGhlIHJlYWwgaGFyZCBsaW5rICovCisJZm9yKDs7KSB7CisJCWlmIChyb21mc19jb3B5ZnJvbShpLCAmcmksIGlubywgUk9NRkhfU0laRSkgPD0gMCkgeworCQkJcHJpbnRrKCJyb21mczogcmVhZCBlcnJvciBmb3IgaW5vZGUgMHgleFxuIiwgaW5vKTsKKwkJCXJldHVybjsKKwkJfQorCQkvKiBYWFg6IGRvIHJvbWZzX2NoZWNrc3VtIGhlcmUgdG9vICh3aXRoIG5hbWUpICovCisKKwkJbmV4dGZoID0gYmUzMl90b19jcHUocmkubmV4dCk7CisJCWlmICgobmV4dGZoICYgUk9NRkhfVFlQRSkgIT0gUk9NRkhfSFJEKQorCQkJYnJlYWs7CisKKwkJaW5vID0gYmUzMl90b19jcHUocmkuc3BlYykgJiBST01GSF9NQVNLOworCX0KKworCWktPmlfbmxpbmsgPSAxOwkJLyogSGFyZCB0byBkZWNpZGUuLiAqLworCWktPmlfc2l6ZSA9IGJlMzJfdG9fY3B1KHJpLnNpemUpOworCWktPmlfbXRpbWUudHZfc2VjID0gaS0+aV9hdGltZS50dl9zZWMgPSBpLT5pX2N0aW1lLnR2X3NlYyA9IDA7CisJaS0+aV9tdGltZS50dl9uc2VjID0gaS0+aV9hdGltZS50dl9uc2VjID0gaS0+aV9jdGltZS50dl9uc2VjID0gMDsKKwlpLT5pX3VpZCA9IGktPmlfZ2lkID0gMDsKKworICAgICAgICAvKiBQcmVjYWxjdWxhdGUgdGhlIGRhdGEgb2Zmc2V0ICovCisgICAgICAgIGlubyA9IHJvbWZzX3N0cm5sZW4oaSwgaW5vK1JPTUZIX1NJWkUsIFJPTUZTX01BWEZOKTsKKyAgICAgICAgaWYgKGlubyA+PSAwKQorICAgICAgICAgICAgICAgIGlubyA9ICgoUk9NRkhfU0laRStpbm8rMStST01GSF9QQUQpJlJPTUZIX01BU0spOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaW5vID0gMDsKKworICAgICAgICBST01GU19JKGkpLT5pX21ldGFzaXplID0gaW5vOworICAgICAgICBST01GU19JKGkpLT5pX2RhdGFvZmZzZXQgPSBpbm8rKGktPmlfaW5vJlJPTUZIX01BU0spOworCisgICAgICAgIC8qIENvbXB1dGUgcGVybWlzc2lvbnMgKi8KKyAgICAgICAgaW5vID0gcm9tZnNfbW9kZW1hcFtuZXh0ZmggJiBST01GSF9UWVBFXTsKKwkvKiBvbmx5ICJub3JtYWwiIGZpbGVzIGhhdmUgb3BzICovCisJc3dpdGNoIChuZXh0ZmggJiBST01GSF9UWVBFKSB7CisJCWNhc2UgMToKKwkJCWktPmlfc2l6ZSA9IFJPTUZTX0koaSktPmlfbWV0YXNpemU7CisJCQlpLT5pX29wID0gJnJvbWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCQkJaS0+aV9mb3AgPSAmcm9tZnNfZGlyX29wZXJhdGlvbnM7CisJCQlpZiAobmV4dGZoICYgUk9NRkhfRVhFQykKKwkJCQlpbm8gfD0gU19JWFVHTzsKKwkJCWktPmlfbW9kZSA9IGlubzsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlpLT5pX2ZvcCA9ICZnZW5lcmljX3JvX2ZvcHM7CisJCQlpLT5pX2RhdGEuYV9vcHMgPSAmcm9tZnNfYW9wczsKKwkJCWlmIChuZXh0ZmggJiBST01GSF9FWEVDKQorCQkJCWlubyB8PSBTX0lYVUdPOworCQkJaS0+aV9tb2RlID0gaW5vOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWktPmlfb3AgPSAmcGFnZV9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJCQlpLT5pX2RhdGEuYV9vcHMgPSAmcm9tZnNfYW9wczsKKwkJCWktPmlfbW9kZSA9IGlubyB8IFNfSVJXWFVHTzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogZGVwZW5kaW5nIG9uIE1CWiBmb3Igc29jay9maWZvcyAqLworCQkJbmV4dGZoID0gYmUzMl90b19jcHUocmkuc3BlYyk7CisJCQlpbml0X3NwZWNpYWxfaW5vZGUoaSwgaW5vLAorCQkJCQlNS0RFVihuZXh0Zmg+PjE2LG5leHRmaCYweGZmZmYpKTsKKwl9Cit9CisKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKiByb21mc19pbm9kZV9jYWNoZXA7CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKnJvbWZzX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IHJvbWZzX2lub2RlX2luZm8gKmVpOworCWVpID0gKHN0cnVjdCByb21mc19pbm9kZV9pbmZvICopa21lbV9jYWNoZV9hbGxvYyhyb21mc19pbm9kZV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwlpZiAoIWVpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gJmVpLT52ZnNfaW5vZGU7Cit9CisKK3N0YXRpYyB2b2lkIHJvbWZzX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlrbWVtX2NhY2hlX2ZyZWUocm9tZnNfaW5vZGVfY2FjaGVwLCBST01GU19JKGlub2RlKSk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICogZm9vLCBrbWVtX2NhY2hlX3QgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IHJvbWZzX2lub2RlX2luZm8gKmVpID0gKHN0cnVjdCByb21mc19pbm9kZV9pbmZvICopIGZvbzsKKworCWlmICgoZmxhZ3MgJiAoU0xBQl9DVE9SX1ZFUklGWXxTTEFCX0NUT1JfQ09OU1RSVUNUT1IpKSA9PQorCSAgICBTTEFCX0NUT1JfQ09OU1RSVUNUT1IpCisJCWlub2RlX2luaXRfb25jZSgmZWktPnZmc19pbm9kZSk7Cit9CisgCitzdGF0aWMgaW50IGluaXRfaW5vZGVjYWNoZSh2b2lkKQoreworCXJvbWZzX2lub2RlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJyb21mc19pbm9kZV9jYWNoZSIsCisJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCByb21mc19pbm9kZV9pbmZvKSwKKwkJCQkJICAgICAwLCBTTEFCX1JFQ0xBSU1fQUNDT1VOVCwKKwkJCQkJICAgICBpbml0X29uY2UsIE5VTEwpOworCWlmIChyb21mc19pbm9kZV9jYWNoZXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfaW5vZGVjYWNoZSh2b2lkKQoreworCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3kocm9tZnNfaW5vZGVfY2FjaGVwKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAicm9tZnNfaW5vZGVfY2FjaGU6IG5vdCBhbGwgc3RydWN0dXJlcyB3ZXJlIGZyZWVkXG4iKTsKK30KKworc3RhdGljIGludCByb21mc19yZW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpCit7CisJKmZsYWdzIHw9IE1TX1JET05MWTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHJvbWZzX29wcyA9IHsKKwkuYWxsb2NfaW5vZGUJPSByb21mc19hbGxvY19pbm9kZSwKKwkuZGVzdHJveV9pbm9kZQk9IHJvbWZzX2Rlc3Ryb3lfaW5vZGUsCisJLnJlYWRfaW5vZGUJPSByb21mc19yZWFkX2lub2RlLAorCS5zdGF0ZnMJCT0gcm9tZnNfc3RhdGZzLAorCS5yZW1vdW50X2ZzCT0gcm9tZnNfcmVtb3VudCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnJvbWZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoreworCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIHJvbWZzX2ZpbGxfc3VwZXIpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgcm9tZnNfZnNfdHlwZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gInJvbWZzIiwKKwkuZ2V0X3NiCQk9IHJvbWZzX2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfYmxvY2tfc3VwZXIsCisJLmZzX2ZsYWdzCT0gRlNfUkVRVUlSRVNfREVWLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9yb21mc19mcyh2b2lkKQoreworCWludCBlcnIgPSBpbml0X2lub2RlY2FjaGUoKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisgICAgICAgIGVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnJvbWZzX2ZzX3R5cGUpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCXJldHVybiAwOworb3V0OgorCWRlc3Ryb3lfaW5vZGVjYWNoZSgpOworb3V0MToKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9yb21mc19mcyh2b2lkKQoreworCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmcm9tZnNfZnNfdHlwZSk7CisJZGVzdHJveV9pbm9kZWNhY2hlKCk7Cit9CisKKy8qIFllcywgd29ya3MgZXZlbiBhcyBhIG1vZHVsZS4uLiA6KSAqLworCittb2R1bGVfaW5pdChpbml0X3JvbWZzX2ZzKQorbW9kdWxlX2V4aXQoZXhpdF9yb21mc19mcykKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2ZzL3NlbGVjdC5jIGIvZnMvc2VsZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjViMWNjYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3NlbGVjdC5jCkBAIC0wLDAgKzEsNTM0IEBACisvKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBwcm9jZWR1cmVzIGZvciB0aGUgaGFuZGxpbmcgb2Ygc2VsZWN0IGFuZCBwb2xsCisgKgorICogQ3JlYXRlZCBmb3IgTGludXggYmFzZWQgbG9vc2VseSB1cG9uIE1hdGhpdXMgTGF0dG5lcidzIG1pbml4CisgKiBwYXRjaGVzIGJ5IFBldGVyIE1hY0RvbmFsZC4gSGVhdmlseSBlZGl0ZWQgYnkgTGludXMuCisgKgorICogIDQgRmVicnVhcnkgMTk5NAorICogICAgIENPRkYvRUxGIGJpbmFyeSBlbXVsYXRpb24uIElmIHRoZSBwcm9jZXNzIGhhcyB0aGUgU1RJQ0tZX1RJTUVPVVRTCisgKiAgICAgZmxhZyBzZXQgaW4gaXRzIHBlcnNvbmFsaXR5IHdlIGRvICpub3QqIG1vZGlmeSB0aGUgZ2l2ZW4gdGltZW91dAorICogICAgIHBhcmFtZXRlciB0byByZWZsZWN0IHRpbWUgcmVtYWluaW5nLgorICoKKyAqICAyNCBKYW51YXJ5IDIwMDAKKyAqICAgICBDaGFuZ2VkIHN5c19wb2xsKCkvZG9fcG9sbCgpIHRvIHVzZSBQQUdFX1NJWkUgY2h1bmstYmFzZWQgYWxsb2NhdGlvbiAKKyAqICAgICBvZiBmZHMgdG8gb3ZlcmNvbWUgbmZkcyA8IDE2MzkwIGRlc2NyaXB0b3JzIGxpbWl0IChUaWdyYW4gQWl2YXppYW4pLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJzb25hbGl0eS5oPiAvKiBmb3IgU1RJQ0tZX1RJTUVPVVRTICovCisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjZGVmaW5lIFJPVU5EX1VQKHgseSkgKCgoeCkrKHkpLTEpLyh5KSkKKyNkZWZpbmUgREVGQVVMVF9QT0xMTUFTSyAoUE9MTElOIHwgUE9MTE9VVCB8IFBPTExSRE5PUk0gfCBQT0xMV1JOT1JNKQorCitzdHJ1Y3QgcG9sbF90YWJsZV9lbnRyeSB7CisJc3RydWN0IGZpbGUgKiBmaWxwOworCXdhaXRfcXVldWVfdCB3YWl0OworCXdhaXRfcXVldWVfaGVhZF90ICogd2FpdF9hZGRyZXNzOworfTsKKworc3RydWN0IHBvbGxfdGFibGVfcGFnZSB7CisJc3RydWN0IHBvbGxfdGFibGVfcGFnZSAqIG5leHQ7CisJc3RydWN0IHBvbGxfdGFibGVfZW50cnkgKiBlbnRyeTsKKwlzdHJ1Y3QgcG9sbF90YWJsZV9lbnRyeSBlbnRyaWVzWzBdOworfTsKKworI2RlZmluZSBQT0xMX1RBQkxFX0ZVTEwodGFibGUpIFwKKwkoKHVuc2lnbmVkIGxvbmcpKCh0YWJsZSktPmVudHJ5KzEpID4gUEFHRV9TSVpFICsgKHVuc2lnbmVkIGxvbmcpKHRhYmxlKSkKKworLyoKKyAqIE9rLCBQZXRlciBtYWRlIGEgY29tcGxpY2F0ZWQsIGJ1dCBzdHJhaWdodGZvcndhcmQgbXVsdGlwbGVfd2FpdCgpIGZ1bmN0aW9uLgorICogSSBoYXZlIHJld3JpdHRlbiB0aGlzLCB0YWtpbmcgc29tZSBzaG9ydGN1dHM6IFRoaXMgY29kZSBtYXkgbm90IGJlIGVhc3kgdG8KKyAqIGZvbGxvdywgYnV0IGl0IHNob3VsZCBiZSBmcmVlIG9mIHJhY2UtY29uZGl0aW9ucywgYW5kIGl0J3MgcHJhY3RpY2FsLiBJZiB5b3UKKyAqIHVuZGVyc3RhbmQgd2hhdCBJJ20gZG9pbmcgaGVyZSwgdGhlbiB5b3UgdW5kZXJzdGFuZCBob3cgdGhlIGxpbnV4CisgKiBzbGVlcC93YWtldXAgbWVjaGFuaXNtIHdvcmtzLgorICoKKyAqIFR3byB2ZXJ5IHNpbXBsZSBwcm9jZWR1cmVzLCBwb2xsX3dhaXQoKSBhbmQgcG9sbF9mcmVld2FpdCgpIG1ha2UgYWxsIHRoZQorICogd29yay4gIHBvbGxfd2FpdCgpIGlzIGFuIGlubGluZS1mdW5jdGlvbiBkZWZpbmVkIGluIDxsaW51eC9wb2xsLmg+LAorICogYXMgYWxsIHNlbGVjdC9wb2xsIGZ1bmN0aW9ucyBoYXZlIHRvIGNhbGwgaXQgdG8gYWRkIGFuIGVudHJ5IHRvIHRoZQorICogcG9sbCB0YWJsZS4KKyAqLwordm9pZCBfX3BvbGx3YWl0KHN0cnVjdCBmaWxlICpmaWxwLCB3YWl0X3F1ZXVlX2hlYWRfdCAqd2FpdF9hZGRyZXNzLCBwb2xsX3RhYmxlICpwKTsKKwordm9pZCBwb2xsX2luaXR3YWl0KHN0cnVjdCBwb2xsX3dxdWV1ZXMgKnB3cSkKK3sKKwlpbml0X3BvbGxfZnVuY3B0cigmcHdxLT5wdCwgX19wb2xsd2FpdCk7CisJcHdxLT5lcnJvciA9IDA7CisJcHdxLT50YWJsZSA9IE5VTEw7Cit9CisKK0VYUE9SVF9TWU1CT0wocG9sbF9pbml0d2FpdCk7CisKK3ZvaWQgcG9sbF9mcmVld2FpdChzdHJ1Y3QgcG9sbF93cXVldWVzICpwd3EpCit7CisJc3RydWN0IHBvbGxfdGFibGVfcGFnZSAqIHAgPSBwd3EtPnRhYmxlOworCXdoaWxlIChwKSB7CisJCXN0cnVjdCBwb2xsX3RhYmxlX2VudHJ5ICogZW50cnk7CisJCXN0cnVjdCBwb2xsX3RhYmxlX3BhZ2UgKm9sZDsKKworCQllbnRyeSA9IHAtPmVudHJ5OworCQlkbyB7CisJCQllbnRyeS0tOworCQkJcmVtb3ZlX3dhaXRfcXVldWUoZW50cnktPndhaXRfYWRkcmVzcywmZW50cnktPndhaXQpOworCQkJZnB1dChlbnRyeS0+ZmlscCk7CisJCX0gd2hpbGUgKGVudHJ5ID4gcC0+ZW50cmllcyk7CisJCW9sZCA9IHA7CisJCXAgPSBwLT5uZXh0OworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIG9sZCk7CisJfQorfQorCitFWFBPUlRfU1lNQk9MKHBvbGxfZnJlZXdhaXQpOworCit2b2lkIF9fcG9sbHdhaXQoc3RydWN0IGZpbGUgKmZpbHAsIHdhaXRfcXVldWVfaGVhZF90ICp3YWl0X2FkZHJlc3MsIHBvbGxfdGFibGUgKl9wKQoreworCXN0cnVjdCBwb2xsX3dxdWV1ZXMgKnAgPSBjb250YWluZXJfb2YoX3AsIHN0cnVjdCBwb2xsX3dxdWV1ZXMsIHB0KTsKKwlzdHJ1Y3QgcG9sbF90YWJsZV9wYWdlICp0YWJsZSA9IHAtPnRhYmxlOworCisJaWYgKCF0YWJsZSB8fCBQT0xMX1RBQkxFX0ZVTEwodGFibGUpKSB7CisJCXN0cnVjdCBwb2xsX3RhYmxlX3BhZ2UgKm5ld190YWJsZTsKKworCQluZXdfdGFibGUgPSAoc3RydWN0IHBvbGxfdGFibGVfcGFnZSAqKSBfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CisJCWlmICghbmV3X3RhYmxlKSB7CisJCQlwLT5lcnJvciA9IC1FTk9NRU07CisJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCQlyZXR1cm47CisJCX0KKwkJbmV3X3RhYmxlLT5lbnRyeSA9IG5ld190YWJsZS0+ZW50cmllczsKKwkJbmV3X3RhYmxlLT5uZXh0ID0gdGFibGU7CisJCXAtPnRhYmxlID0gbmV3X3RhYmxlOworCQl0YWJsZSA9IG5ld190YWJsZTsKKwl9CisKKwkvKiBBZGQgYSBuZXcgZW50cnkgKi8KKwl7CisJCXN0cnVjdCBwb2xsX3RhYmxlX2VudHJ5ICogZW50cnkgPSB0YWJsZS0+ZW50cnk7CisJCXRhYmxlLT5lbnRyeSA9IGVudHJ5KzE7CisJIAlnZXRfZmlsZShmaWxwKTsKKwkgCWVudHJ5LT5maWxwID0gZmlscDsKKwkJZW50cnktPndhaXRfYWRkcmVzcyA9IHdhaXRfYWRkcmVzczsKKwkJaW5pdF93YWl0cXVldWVfZW50cnkoJmVudHJ5LT53YWl0LCBjdXJyZW50KTsKKwkJYWRkX3dhaXRfcXVldWUod2FpdF9hZGRyZXNzLCZlbnRyeS0+d2FpdCk7CisJfQorfQorCisjZGVmaW5lIEZEU19JTihmZHMsIG4pCQkoZmRzLT5pbiArIG4pCisjZGVmaW5lIEZEU19PVVQoZmRzLCBuKQkJKGZkcy0+b3V0ICsgbikKKyNkZWZpbmUgRkRTX0VYKGZkcywgbikJCShmZHMtPmV4ICsgbikKKworI2RlZmluZSBCSVRTKGZkcywgbikJKCpGRFNfSU4oZmRzLCBuKXwqRkRTX09VVChmZHMsIG4pfCpGRFNfRVgoZmRzLCBuKSkKKworc3RhdGljIGludCBtYXhfc2VsZWN0X2ZkKHVuc2lnbmVkIGxvbmcgbiwgZmRfc2V0X2JpdHMgKmZkcykKK3sKKwl1bnNpZ25lZCBsb25nICpvcGVuX2ZkczsKKwl1bnNpZ25lZCBsb25nIHNldDsKKwlpbnQgbWF4OworCisJLyogaGFuZGxlIGxhc3QgaW4tY29tcGxldGUgbG9uZy13b3JkIGZpcnN0ICovCisJc2V0ID0gfih+MFVMIDw8IChuICYgKF9fTkZEQklUUy0xKSkpOworCW4gLz0gX19ORkRCSVRTOworCW9wZW5fZmRzID0gY3VycmVudC0+ZmlsZXMtPm9wZW5fZmRzLT5mZHNfYml0cytuOworCW1heCA9IDA7CisJaWYgKHNldCkgeworCQlzZXQgJj0gQklUUyhmZHMsIG4pOworCQlpZiAoc2V0KSB7CisJCQlpZiAoIShzZXQgJiB+Km9wZW5fZmRzKSkKKwkJCQlnb3RvIGdldF9tYXg7CisJCQlyZXR1cm4gLUVCQURGOworCQl9CisJfQorCXdoaWxlIChuKSB7CisJCW9wZW5fZmRzLS07CisJCW4tLTsKKwkJc2V0ID0gQklUUyhmZHMsIG4pOworCQlpZiAoIXNldCkKKwkJCWNvbnRpbnVlOworCQlpZiAoc2V0ICYgfipvcGVuX2ZkcykKKwkJCXJldHVybiAtRUJBREY7CisJCWlmIChtYXgpCisJCQljb250aW51ZTsKK2dldF9tYXg6CisJCWRvIHsKKwkJCW1heCsrOworCQkJc2V0ID4+PSAxOworCQl9IHdoaWxlIChzZXQpOworCQltYXggKz0gbiAqIF9fTkZEQklUUzsKKwl9CisKKwlyZXR1cm4gbWF4OworfQorCisjZGVmaW5lIEJJVChpKQkJKDFVTCA8PCAoKGkpJihfX05GREJJVFMtMSkpKQorI2RlZmluZSBNRU0oaSxtKQkoKG0pKyh1bnNpZ25lZCkoaSkvX19ORkRCSVRTKQorI2RlZmluZSBJU1NFVChpLG0pCSgoKGkpJioobSkpICE9IDApCisjZGVmaW5lIFNFVChpLG0pCSgqKG0pIHw9IChpKSkKKworI2RlZmluZSBQT0xMSU5fU0VUIChQT0xMUkROT1JNIHwgUE9MTFJEQkFORCB8IFBPTExJTiB8IFBPTExIVVAgfCBQT0xMRVJSKQorI2RlZmluZSBQT0xMT1VUX1NFVCAoUE9MTFdSQkFORCB8IFBPTExXUk5PUk0gfCBQT0xMT1VUIHwgUE9MTEVSUikKKyNkZWZpbmUgUE9MTEVYX1NFVCAoUE9MTFBSSSkKKworaW50IGRvX3NlbGVjdChpbnQgbiwgZmRfc2V0X2JpdHMgKmZkcywgbG9uZyAqdGltZW91dCkKK3sKKwlzdHJ1Y3QgcG9sbF93cXVldWVzIHRhYmxlOworCXBvbGxfdGFibGUgKndhaXQ7CisJaW50IHJldHZhbCwgaTsKKwlsb25nIF9fdGltZW91dCA9ICp0aW1lb3V0OworCisgCXNwaW5fbG9jaygmY3VycmVudC0+ZmlsZXMtPmZpbGVfbG9jayk7CisJcmV0dmFsID0gbWF4X3NlbGVjdF9mZChuLCBmZHMpOworCXNwaW5fdW5sb2NrKCZjdXJyZW50LT5maWxlcy0+ZmlsZV9sb2NrKTsKKworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCW4gPSByZXR2YWw7CisKKwlwb2xsX2luaXR3YWl0KCZ0YWJsZSk7CisJd2FpdCA9ICZ0YWJsZS5wdDsKKwlpZiAoIV9fdGltZW91dCkKKwkJd2FpdCA9IE5VTEw7CisJcmV0dmFsID0gMDsKKwlmb3IgKDs7KSB7CisJCXVuc2lnbmVkIGxvbmcgKnJpbnAsICpyb3V0cCwgKnJleHAsICppbnAsICpvdXRwLCAqZXhwOworCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwkJaW5wID0gZmRzLT5pbjsgb3V0cCA9IGZkcy0+b3V0OyBleHAgPSBmZHMtPmV4OworCQlyaW5wID0gZmRzLT5yZXNfaW47IHJvdXRwID0gZmRzLT5yZXNfb3V0OyByZXhwID0gZmRzLT5yZXNfZXg7CisKKwkJZm9yIChpID0gMDsgaSA8IG47ICsrcmlucCwgKytyb3V0cCwgKytyZXhwKSB7CisJCQl1bnNpZ25lZCBsb25nIGluLCBvdXQsIGV4LCBhbGxfYml0cywgYml0ID0gMSwgbWFzaywgajsKKwkJCXVuc2lnbmVkIGxvbmcgcmVzX2luID0gMCwgcmVzX291dCA9IDAsIHJlc19leCA9IDA7CisJCQlzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmX29wID0gTlVMTDsKKwkJCXN0cnVjdCBmaWxlICpmaWxlID0gTlVMTDsKKworCQkJaW4gPSAqaW5wKys7IG91dCA9ICpvdXRwKys7IGV4ID0gKmV4cCsrOworCQkJYWxsX2JpdHMgPSBpbiB8IG91dCB8IGV4OworCQkJaWYgKGFsbF9iaXRzID09IDApIHsKKwkJCQlpICs9IF9fTkZEQklUUzsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJZm9yIChqID0gMDsgaiA8IF9fTkZEQklUUzsgKytqLCArK2ksIGJpdCA8PD0gMSkgeworCQkJCWlmIChpID49IG4pCisJCQkJCWJyZWFrOworCQkJCWlmICghKGJpdCAmIGFsbF9iaXRzKSkKKwkJCQkJY29udGludWU7CisJCQkJZmlsZSA9IGZnZXQoaSk7CisJCQkJaWYgKGZpbGUpIHsKKwkJCQkJZl9vcCA9IGZpbGUtPmZfb3A7CisJCQkJCW1hc2sgPSBERUZBVUxUX1BPTExNQVNLOworCQkJCQlpZiAoZl9vcCAmJiBmX29wLT5wb2xsKQorCQkJCQkJbWFzayA9ICgqZl9vcC0+cG9sbCkoZmlsZSwgcmV0dmFsID8gTlVMTCA6IHdhaXQpOworCQkJCQlmcHV0KGZpbGUpOworCQkJCQlpZiAoKG1hc2sgJiBQT0xMSU5fU0VUKSAmJiAoaW4gJiBiaXQpKSB7CisJCQkJCQlyZXNfaW4gfD0gYml0OworCQkJCQkJcmV0dmFsKys7CisJCQkJCX0KKwkJCQkJaWYgKChtYXNrICYgUE9MTE9VVF9TRVQpICYmIChvdXQgJiBiaXQpKSB7CisJCQkJCQlyZXNfb3V0IHw9IGJpdDsKKwkJCQkJCXJldHZhbCsrOworCQkJCQl9CisJCQkJCWlmICgobWFzayAmIFBPTExFWF9TRVQpICYmIChleCAmIGJpdCkpIHsKKwkJCQkJCXJlc19leCB8PSBiaXQ7CisJCQkJCQlyZXR2YWwrKzsKKwkJCQkJfQorCQkJCX0KKwkJCQljb25kX3Jlc2NoZWQoKTsKKwkJCX0KKwkJCWlmIChyZXNfaW4pCisJCQkJKnJpbnAgPSByZXNfaW47CisJCQlpZiAocmVzX291dCkKKwkJCQkqcm91dHAgPSByZXNfb3V0OworCQkJaWYgKHJlc19leCkKKwkJCQkqcmV4cCA9IHJlc19leDsKKwkJfQorCQl3YWl0ID0gTlVMTDsKKwkJaWYgKHJldHZhbCB8fCAhX190aW1lb3V0IHx8IHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJYnJlYWs7CisJCWlmKHRhYmxlLmVycm9yKSB7CisJCQlyZXR2YWwgPSB0YWJsZS5lcnJvcjsKKwkJCWJyZWFrOworCQl9CisJCV9fdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQoX190aW1lb3V0KTsKKwl9CisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCisJcG9sbF9mcmVld2FpdCgmdGFibGUpOworCisJLyoKKwkgKiBVcC10by1kYXRlIHRoZSBjYWxsZXIgdGltZW91dC4KKwkgKi8KKwkqdGltZW91dCA9IF9fdGltZW91dDsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCAqc2VsZWN0X2JpdHNfYWxsb2MoaW50IHNpemUpCit7CisJcmV0dXJuIGttYWxsb2MoNiAqIHNpemUsIEdGUF9LRVJORUwpOworfQorCitzdGF0aWMgdm9pZCBzZWxlY3RfYml0c19mcmVlKHZvaWQgKmJpdHMsIGludCBzaXplKQoreworCWtmcmVlKGJpdHMpOworfQorCisvKgorICogV2UgY2FuIGFjdHVhbGx5IHJldHVybiBFUkVTVEFSVFNZUyBpbnN0ZWFkIG9mIEVJTlRSLCBidXQgSSdkCisgKiBsaWtlIHRvIGJlIGNlcnRhaW4gdGhpcyBsZWFkcyB0byBubyBwcm9ibGVtcy4gU28gSSByZXR1cm4KKyAqIEVJTlRSIGp1c3QgZm9yIHNhZmV0eS4KKyAqCisgKiBVcGRhdGU6IEVSRVNUQVJUU1lTIGJyZWFrcyBhdCBsZWFzdCB0aGUgeHZpZXcgY2xvY2sgYmluYXJ5LCBzbworICogSSdtIHRyeWluZyBFUkVTVEFSVE5PSEFORCB3aGljaCByZXN0YXJ0IG9ubHkgd2hlbiB5b3Ugd2FudCB0by4KKyAqLworI2RlZmluZSBNQVhfU0VMRUNUX1NFQ09ORFMgXAorCSgodW5zaWduZWQgbG9uZykgKE1BWF9TQ0hFRFVMRV9USU1FT1VUIC8gSFopLTEpCisKK2FzbWxpbmthZ2UgbG9uZworc3lzX3NlbGVjdChpbnQgbiwgZmRfc2V0IF9fdXNlciAqaW5wLCBmZF9zZXQgX191c2VyICpvdXRwLCBmZF9zZXQgX191c2VyICpleHAsIHN0cnVjdCB0aW1ldmFsIF9fdXNlciAqdHZwKQoreworCWZkX3NldF9iaXRzIGZkczsKKwljaGFyICpiaXRzOworCWxvbmcgdGltZW91dDsKKwlpbnQgcmV0LCBzaXplLCBtYXhfZmRzZXQ7CisKKwl0aW1lb3V0ID0gTUFYX1NDSEVEVUxFX1RJTUVPVVQ7CisJaWYgKHR2cCkgeworCQl0aW1lX3Qgc2VjLCB1c2VjOworCisJCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB0dnAsIHNpemVvZigqdHZwKSkKKwkJICAgIHx8IF9fZ2V0X3VzZXIoc2VjLCAmdHZwLT50dl9zZWMpCisJCSAgICB8fCBfX2dldF91c2VyKHVzZWMsICZ0dnAtPnR2X3VzZWMpKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBvdXRfbm9mZHM7CisJCX0KKworCQlyZXQgPSAtRUlOVkFMOworCQlpZiAoc2VjIDwgMCB8fCB1c2VjIDwgMCkKKwkJCWdvdG8gb3V0X25vZmRzOworCisJCWlmICgodW5zaWduZWQgbG9uZykgc2VjIDwgTUFYX1NFTEVDVF9TRUNPTkRTKSB7CisJCQl0aW1lb3V0ID0gUk9VTkRfVVAodXNlYywgMTAwMDAwMC9IWik7CisJCQl0aW1lb3V0ICs9IHNlYyAqICh1bnNpZ25lZCBsb25nKSBIWjsKKwkJfQorCX0KKworCXJldCA9IC1FSU5WQUw7CisJaWYgKG4gPCAwKQorCQlnb3RvIG91dF9ub2ZkczsKKworCS8qIG1heF9mZHNldCBjYW4gaW5jcmVhc2UsIHNvIGdyYWIgaXQgb25jZSB0byBhdm9pZCByYWNlICovCisJbWF4X2Zkc2V0ID0gY3VycmVudC0+ZmlsZXMtPm1heF9mZHNldDsKKwlpZiAobiA+IG1heF9mZHNldCkKKwkJbiA9IG1heF9mZHNldDsKKworCS8qCisJICogV2UgbmVlZCA2IGJpdG1hcHMgKGluL291dC9leCBmb3IgYm90aCBpbmNvbWluZyBhbmQgb3V0Z29pbmcpLAorCSAqIHNpbmNlIHdlIHVzZWQgZmRzZXQgd2UgbmVlZCB0byBhbGxvY2F0ZSBtZW1vcnkgaW4gdW5pdHMgb2YKKwkgKiBsb25nLXdvcmRzLiAKKwkgKi8KKwlyZXQgPSAtRU5PTUVNOworCXNpemUgPSBGRFNfQllURVMobik7CisJYml0cyA9IHNlbGVjdF9iaXRzX2FsbG9jKHNpemUpOworCWlmICghYml0cykKKwkJZ290byBvdXRfbm9mZHM7CisJZmRzLmluICAgICAgPSAodW5zaWduZWQgbG9uZyAqKSAgYml0czsKKwlmZHMub3V0ICAgICA9ICh1bnNpZ25lZCBsb25nICopIChiaXRzICsgICBzaXplKTsKKwlmZHMuZXggICAgICA9ICh1bnNpZ25lZCBsb25nICopIChiaXRzICsgMipzaXplKTsKKwlmZHMucmVzX2luICA9ICh1bnNpZ25lZCBsb25nICopIChiaXRzICsgMypzaXplKTsKKwlmZHMucmVzX291dCA9ICh1bnNpZ25lZCBsb25nICopIChiaXRzICsgNCpzaXplKTsKKwlmZHMucmVzX2V4ICA9ICh1bnNpZ25lZCBsb25nICopIChiaXRzICsgNSpzaXplKTsKKworCWlmICgocmV0ID0gZ2V0X2ZkX3NldChuLCBpbnAsIGZkcy5pbikpIHx8CisJICAgIChyZXQgPSBnZXRfZmRfc2V0KG4sIG91dHAsIGZkcy5vdXQpKSB8fAorCSAgICAocmV0ID0gZ2V0X2ZkX3NldChuLCBleHAsIGZkcy5leCkpKQorCQlnb3RvIG91dDsKKwl6ZXJvX2ZkX3NldChuLCBmZHMucmVzX2luKTsKKwl6ZXJvX2ZkX3NldChuLCBmZHMucmVzX291dCk7CisJemVyb19mZF9zZXQobiwgZmRzLnJlc19leCk7CisKKwlyZXQgPSBkb19zZWxlY3QobiwgJmZkcywgJnRpbWVvdXQpOworCisJaWYgKHR2cCAmJiAhKGN1cnJlbnQtPnBlcnNvbmFsaXR5ICYgU1RJQ0tZX1RJTUVPVVRTKSkgeworCQl0aW1lX3Qgc2VjID0gMCwgdXNlYyA9IDA7CisJCWlmICh0aW1lb3V0KSB7CisJCQlzZWMgPSB0aW1lb3V0IC8gSFo7CisJCQl1c2VjID0gdGltZW91dCAlIEhaOworCQkJdXNlYyAqPSAoMTAwMDAwMC9IWik7CisJCX0KKwkJcHV0X3VzZXIoc2VjLCAmdHZwLT50dl9zZWMpOworCQlwdXRfdXNlcih1c2VjLCAmdHZwLT50dl91c2VjKTsKKwl9CisKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisJaWYgKCFyZXQpIHsKKwkJcmV0ID0gLUVSRVNUQVJUTk9IQU5EOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlnb3RvIG91dDsKKwkJcmV0ID0gMDsKKwl9CisKKwlpZiAoc2V0X2ZkX3NldChuLCBpbnAsIGZkcy5yZXNfaW4pIHx8CisJICAgIHNldF9mZF9zZXQobiwgb3V0cCwgZmRzLnJlc19vdXQpIHx8CisJICAgIHNldF9mZF9zZXQobiwgZXhwLCBmZHMucmVzX2V4KSkKKwkJcmV0ID0gLUVGQVVMVDsKKworb3V0OgorCXNlbGVjdF9iaXRzX2ZyZWUoYml0cywgc2l6ZSk7CitvdXRfbm9mZHM6CisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IHBvbGxfbGlzdCB7CisJc3RydWN0IHBvbGxfbGlzdCAqbmV4dDsKKwlpbnQgbGVuOworCXN0cnVjdCBwb2xsZmQgZW50cmllc1swXTsKK307CisKKyNkZWZpbmUgUE9MTEZEX1BFUl9QQUdFICAoKFBBR0VfU0laRS1zaXplb2Yoc3RydWN0IHBvbGxfbGlzdCkpIC8gc2l6ZW9mKHN0cnVjdCBwb2xsZmQpKQorCitzdGF0aWMgdm9pZCBkb19wb2xsZmQodW5zaWduZWQgaW50IG51bSwgc3RydWN0IHBvbGxmZCAqIGZkcGFnZSwKKwlwb2xsX3RhYmxlICoqIHB3YWl0LCBpbnQgKmNvdW50KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCWludCBmZDsKKwkJdW5zaWduZWQgaW50IG1hc2s7CisJCXN0cnVjdCBwb2xsZmQgKmZkcDsKKworCQltYXNrID0gMDsKKwkJZmRwID0gZmRwYWdlK2k7CisJCWZkID0gZmRwLT5mZDsKKwkJaWYgKGZkID49IDApIHsKKwkJCXN0cnVjdCBmaWxlICogZmlsZSA9IGZnZXQoZmQpOworCQkJbWFzayA9IFBPTExOVkFMOworCQkJaWYgKGZpbGUgIT0gTlVMTCkgeworCQkJCW1hc2sgPSBERUZBVUxUX1BPTExNQVNLOworCQkJCWlmIChmaWxlLT5mX29wICYmIGZpbGUtPmZfb3AtPnBvbGwpCisJCQkJCW1hc2sgPSBmaWxlLT5mX29wLT5wb2xsKGZpbGUsICpwd2FpdCk7CisJCQkJbWFzayAmPSBmZHAtPmV2ZW50cyB8IFBPTExFUlIgfCBQT0xMSFVQOworCQkJCWZwdXQoZmlsZSk7CisJCQl9CisJCQlpZiAobWFzaykgeworCQkJCSpwd2FpdCA9IE5VTEw7CisJCQkJKCpjb3VudCkrKzsKKwkJCX0KKwkJfQorCQlmZHAtPnJldmVudHMgPSBtYXNrOworCX0KK30KKworc3RhdGljIGludCBkb19wb2xsKHVuc2lnbmVkIGludCBuZmRzLCAgc3RydWN0IHBvbGxfbGlzdCAqbGlzdCwKKwkJCXN0cnVjdCBwb2xsX3dxdWV1ZXMgKndhaXQsIGxvbmcgdGltZW91dCkKK3sKKwlpbnQgY291bnQgPSAwOworCXBvbGxfdGFibGUqIHB0ID0gJndhaXQtPnB0OworCisJaWYgKCF0aW1lb3V0KQorCQlwdCA9IE5VTEw7CisgCisJZm9yICg7OykgeworCQlzdHJ1Y3QgcG9sbF9saXN0ICp3YWxrOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQl3YWxrID0gbGlzdDsKKwkJd2hpbGUod2FsayAhPSBOVUxMKSB7CisJCQlkb19wb2xsZmQoIHdhbGstPmxlbiwgd2Fsay0+ZW50cmllcywgJnB0LCAmY291bnQpOworCQkJd2FsayA9IHdhbGstPm5leHQ7CisJCX0KKwkJcHQgPSBOVUxMOworCQlpZiAoY291bnQgfHwgIXRpbWVvdXQgfHwgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlicmVhazsKKwkJY291bnQgPSB3YWl0LT5lcnJvcjsKKwkJaWYgKGNvdW50KQorCQkJYnJlYWs7CisJCXRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOworCX0KKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmV0dXJuIGNvdW50OworfQorCithc21saW5rYWdlIGxvbmcgc3lzX3BvbGwoc3RydWN0IHBvbGxmZCBfX3VzZXIgKiB1ZmRzLCB1bnNpZ25lZCBpbnQgbmZkcywgbG9uZyB0aW1lb3V0KQoreworCXN0cnVjdCBwb2xsX3dxdWV1ZXMgdGFibGU7CisgCWludCBmZGNvdW50LCBlcnI7CisgCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCBwb2xsX2xpc3QgKmhlYWQ7CisgCXN0cnVjdCBwb2xsX2xpc3QgKndhbGs7CisKKwkvKiBEbyBhIHNhbml0eSBjaGVjayBvbiBuZmRzIC4uLiAqLworCWlmIChuZmRzID4gY3VycmVudC0+ZmlsZXMtPm1heF9mZHNldCAmJiBuZmRzID4gT1BFTl9NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHRpbWVvdXQpIHsKKwkJLyogQ2FyZWZ1bCBhYm91dCBvdmVyZmxvdyBpbiB0aGUgaW50ZXJtZWRpYXRlIHZhbHVlcyAqLworCQlpZiAoKHVuc2lnbmVkIGxvbmcpIHRpbWVvdXQgPCBNQVhfU0NIRURVTEVfVElNRU9VVCAvIEhaKQorCQkJdGltZW91dCA9ICh1bnNpZ25lZCBsb25nKSh0aW1lb3V0KkhaKzk5OSkvMTAwMCsxOworCQllbHNlIC8qIE5lZ2F0aXZlIG9yIG92ZXJmbG93ICovCisJCQl0aW1lb3V0ID0gTUFYX1NDSEVEVUxFX1RJTUVPVVQ7CisJfQorCisJcG9sbF9pbml0d2FpdCgmdGFibGUpOworCisJaGVhZCA9IE5VTEw7CisJd2FsayA9IE5VTEw7CisJaSA9IG5mZHM7CisJZXJyID0gLUVOT01FTTsKKwl3aGlsZShpIT0wKSB7CisJCXN0cnVjdCBwb2xsX2xpc3QgKnBwOworCQlwcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwb2xsX2xpc3QpKworCQkJCXNpemVvZihzdHJ1Y3QgcG9sbGZkKSoKKwkJCQkoaT5QT0xMRkRfUEVSX1BBR0U/UE9MTEZEX1BFUl9QQUdFOmkpLAorCQkJCQlHRlBfS0VSTkVMKTsKKwkJaWYocHA9PU5VTEwpCisJCQlnb3RvIG91dF9mZHM7CisJCXBwLT5uZXh0PU5VTEw7CisJCXBwLT5sZW4gPSAoaT5QT0xMRkRfUEVSX1BBR0U/UE9MTEZEX1BFUl9QQUdFOmkpOworCQlpZiAoaGVhZCA9PSBOVUxMKQorCQkJaGVhZCA9IHBwOworCQllbHNlCisJCQl3YWxrLT5uZXh0ID0gcHA7CisKKwkJd2FsayA9IHBwOworCQlpZiAoY29weV9mcm9tX3VzZXIocHAtPmVudHJpZXMsIHVmZHMgKyBuZmRzLWksIAorCQkJCXNpemVvZihzdHJ1Y3QgcG9sbGZkKSpwcC0+bGVuKSkgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0X2ZkczsKKwkJfQorCQlpIC09IHBwLT5sZW47CisJfQorCWZkY291bnQgPSBkb19wb2xsKG5mZHMsIGhlYWQsICZ0YWJsZSwgdGltZW91dCk7CisKKwkvKiBPSywgbm93IGNvcHkgdGhlIHJldmVudHMgZmllbGRzIGJhY2sgdG8gdXNlciBzcGFjZS4gKi8KKwl3YWxrID0gaGVhZDsKKwllcnIgPSAtRUZBVUxUOworCXdoaWxlKHdhbGsgIT0gTlVMTCkgeworCQlzdHJ1Y3QgcG9sbGZkICpmZHMgPSB3YWxrLT5lbnRyaWVzOworCQlpbnQgajsKKworCQlmb3IgKGo9MDsgaiA8IHdhbGstPmxlbjsgaisrLCB1ZmRzKyspIHsKKwkJCWlmKF9fcHV0X3VzZXIoZmRzW2pdLnJldmVudHMsICZ1ZmRzLT5yZXZlbnRzKSkKKwkJCQlnb3RvIG91dF9mZHM7CisJCX0KKwkJd2FsayA9IHdhbGstPm5leHQ7CisgIAl9CisJZXJyID0gZmRjb3VudDsKKwlpZiAoIWZkY291bnQgJiYgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCWVyciA9IC1FSU5UUjsKK291dF9mZHM6CisJd2FsayA9IGhlYWQ7CisJd2hpbGUod2FsayE9TlVMTCkgeworCQlzdHJ1Y3QgcG9sbF9saXN0ICpwcCA9IHdhbGstPm5leHQ7CisJCWtmcmVlKHdhbGspOworCQl3YWxrID0gcHA7CisJfQorCXBvbGxfZnJlZXdhaXQoJnRhYmxlKTsKKwlyZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvZnMvc2VxX2ZpbGUuYyBiL2ZzL3NlcV9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUwYzQzYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3NlcV9maWxlLmMKQEAgLTAsMCArMSw0NDAgQEAKKy8qCisgKiBsaW51eC9mcy9zZXFfZmlsZS5jCisgKgorICogaGVscGVyIGZ1bmN0aW9ucyBmb3IgbWFraW5nIHN5bnRoZXRpYyBmaWxlcyBmcm9tIHNlcXVlbmNlcyBvZiByZWNvcmRzLgorICogaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAtLSBBViwgT2N0IDIwMDEuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKKy8qKgorICoJc2VxX29wZW4gLQlpbml0aWFsaXplIHNlcXVlbnRpYWwgZmlsZQorICoJQGZpbGU6IGZpbGUgd2UgaW5pdGlhbGl6ZQorICoJQG9wOiBtZXRob2QgdGFibGUgZGVzY3JpYmluZyB0aGUgc2VxdWVuY2UKKyAqCisgKglzZXFfb3BlbigpIHNldHMgQGZpbGUsIGFzc29jaWF0aW5nIGl0IHdpdGggYSBzZXF1ZW5jZSBkZXNjcmliZWQKKyAqCWJ5IEBvcC4gIEBvcC0+c3RhcnQoKSBzZXRzIHRoZSBpdGVyYXRvciB1cCBhbmQgcmV0dXJucyB0aGUgZmlyc3QKKyAqCWVsZW1lbnQgb2Ygc2VxdWVuY2UuIEBvcC0+c3RvcCgpIHNodXRzIGl0IGRvd24uICBAb3AtPm5leHQoKQorICoJcmV0dXJucyB0aGUgbmV4dCBlbGVtZW50IG9mIHNlcXVlbmNlLiAgQG9wLT5zaG93KCkgcHJpbnRzIGVsZW1lbnQKKyAqCWludG8gdGhlIGJ1ZmZlci4gIEluIGNhc2Ugb2YgZXJyb3IgLT5zdGFydCgpIGFuZCAtPm5leHQoKSByZXR1cm4KKyAqCUVSUl9QVFIoZXJyb3IpLiAgSW4gdGhlIGVuZCBvZiBzZXF1ZW5jZSB0aGV5IHJldHVybiAlTlVMTC4gLT5zaG93KCkKKyAqCXJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MgYW5kIG5lZ2F0aXZlIG51bWJlciBpbiBjYXNlIG9mIGVycm9yLgorICovCitpbnQgc2VxX29wZW4oc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBzZXFfb3BlcmF0aW9ucyAqb3ApCit7CisJc3RydWN0IHNlcV9maWxlICpwID0ga21hbGxvYyhzaXplb2YoKnApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXApCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKKwlzZW1hX2luaXQoJnAtPnNlbSwgMSk7CisJcC0+b3AgPSBvcDsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBwOworCisJLyoKKwkgKiBXcmFwcGVycyBhcm91bmQgc2VxX29wZW4oZS5nLiBzd2Fwc19vcGVuKSBuZWVkIHRvIGJlCisJICogYXdhcmUgb2YgdGhpcy4gSWYgdGhleSBzZXQgZl92ZXJzaW9uIHRoZW1zZWx2ZXMsIHRoZXkKKwkgKiBzaG91bGQgY2FsbCBzZXFfb3BlbiBmaXJzdCBhbmQgdGhlbiBzZXQgZl92ZXJzaW9uLgorCSAqLworCWZpbGUtPmZfdmVyc2lvbiA9IDA7CisKKwkvKiBTRVEgZmlsZXMgc3VwcG9ydCBsc2VlaywgYnV0IG5vdCBwcmVhZC9wd3JpdGUgKi8KKwlmaWxlLT5mX21vZGUgJj0gfihGTU9ERV9QUkVBRCB8IEZNT0RFX1BXUklURSk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHNlcV9vcGVuKTsKKworLyoqCisgKglzZXFfcmVhZCAtCS0+cmVhZCgpIG1ldGhvZCBmb3Igc2VxdWVudGlhbCBmaWxlcy4KKyAqCUBmaWxlLCBAYnVmLCBAc2l6ZSwgQHBwb3M6IHNlZSBmaWxlX29wZXJhdGlvbnMgbWV0aG9kCisgKgorICoJUmVhZHktbWFkZSAtPmZfb3AtPnJlYWQoKQorICovCitzc2l6ZV90IHNlcV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3Qgc2l6ZSwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBzZXFfZmlsZSAqbSA9IChzdHJ1Y3Qgc2VxX2ZpbGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc2l6ZV90IGNvcGllZCA9IDA7CisJbG9mZl90IHBvczsKKwlzaXplX3QgbjsKKwl2b2lkICpwOworCWludCBlcnIgPSAwOworCisJZG93bigmbS0+c2VtKTsKKwkvKgorCSAqIHNlcV9maWxlLT5vcC0+Li5tX3N0YXJ0L21fc3RvcC9tX25leHQgbWF5IGRvIHNwZWNpYWwgYWN0aW9ucworCSAqIG9yIG9wdGltaXNhdGlvbnMgYmFzZWQgb24gdGhlIGZpbGUtPmZfdmVyc2lvbiwgc28gd2Ugd2FudCB0bworCSAqIHBhc3MgdGhlIGZpbGUtPmZfdmVyc2lvbiB0byB0aG9zZSBtZXRob2RzLgorCSAqCisJICogc2VxX2ZpbGUtPnZlcnNpb24gaXMganVzdCBjb3B5IG9mIGZfdmVyc2lvbiwgYW5kIHNlcV9maWxlCisJICogbWV0aG9kcyBjYW4gdHJlYXQgaXQgc2ltcGx5IGFzIGZpbGUgdmVyc2lvbi4KKwkgKiBJdCBpcyBjb3BpZWQgaW4gZmlyc3QgYW5kIGNvcGllZCBvdXQgYWZ0ZXIgYWxsIG9wZXJhdGlvbnMuCisJICogSXQgaXMgY29udmVuaWVudCB0byBoYXZlIGl0IGFzICBwYXJ0IG9mIHN0cnVjdHVyZSB0byBhdm9pZCB0aGUKKwkgKiBuZWVkIG9mIHBhc3NpbmcgYW5vdGhlciBhcmd1bWVudCB0byBhbGwgdGhlIHNlcV9maWxlIG1ldGhvZHMuCisJICovCisJbS0+dmVyc2lvbiA9IGZpbGUtPmZfdmVyc2lvbjsKKwkvKiBncmFiIGJ1ZmZlciBpZiB3ZSBkaWRuJ3QgaGF2ZSBvbmUgKi8KKwlpZiAoIW0tPmJ1ZikgeworCQltLT5idWYgPSBrbWFsbG9jKG0tPnNpemUgPSBQQUdFX1NJWkUsIEdGUF9LRVJORUwpOworCQlpZiAoIW0tPmJ1ZikKKwkJCWdvdG8gRW5vbWVtOworCX0KKwkvKiBpZiBub3QgZW1wdHkgLSBmbHVzaCBpdCBmaXJzdCAqLworCWlmIChtLT5jb3VudCkgeworCQluID0gbWluKG0tPmNvdW50LCBzaXplKTsKKwkJZXJyID0gY29weV90b191c2VyKGJ1ZiwgbS0+YnVmICsgbS0+ZnJvbSwgbik7CisJCWlmIChlcnIpCisJCQlnb3RvIEVmYXVsdDsKKwkJbS0+Y291bnQgLT0gbjsKKwkJbS0+ZnJvbSArPSBuOworCQlzaXplIC09IG47CisJCWJ1ZiArPSBuOworCQljb3BpZWQgKz0gbjsKKwkJaWYgKCFtLT5jb3VudCkKKwkJCW0tPmluZGV4Kys7CisJCWlmICghc2l6ZSkKKwkJCWdvdG8gRG9uZTsKKwl9CisJLyogd2UgbmVlZCBhdCBsZWFzdCBvbmUgcmVjb3JkIGluIGJ1ZmZlciAqLworCXdoaWxlICgxKSB7CisJCXBvcyA9IG0tPmluZGV4OworCQlwID0gbS0+b3AtPnN0YXJ0KG0sICZwb3MpOworCQllcnIgPSBQVFJfRVJSKHApOworCQlpZiAoIXAgfHwgSVNfRVJSKHApKQorCQkJYnJlYWs7CisJCWVyciA9IG0tPm9wLT5zaG93KG0sIHApOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisJCWlmIChtLT5jb3VudCA8IG0tPnNpemUpCisJCQlnb3RvIEZpbGw7CisJCW0tPm9wLT5zdG9wKG0sIHApOworCQlrZnJlZShtLT5idWYpOworCQltLT5idWYgPSBrbWFsbG9jKG0tPnNpemUgPDw9IDEsIEdGUF9LRVJORUwpOworCQlpZiAoIW0tPmJ1ZikKKwkJCWdvdG8gRW5vbWVtOworCQltLT5jb3VudCA9IDA7CisJCW0tPnZlcnNpb24gPSAwOworCX0KKwltLT5vcC0+c3RvcChtLCBwKTsKKwltLT5jb3VudCA9IDA7CisJZ290byBEb25lOworRmlsbDoKKwkvKiB0aGV5IHdhbnQgbW9yZT8gbGV0J3MgdHJ5IHRvIGdldCBzb21lIG1vcmUgKi8KKwl3aGlsZSAobS0+Y291bnQgPCBzaXplKSB7CisJCXNpemVfdCBvZmZzID0gbS0+Y291bnQ7CisJCWxvZmZfdCBuZXh0ID0gcG9zOworCQlwID0gbS0+b3AtPm5leHQobSwgcCwgJm5leHQpOworCQlpZiAoIXAgfHwgSVNfRVJSKHApKSB7CisJCQllcnIgPSBQVFJfRVJSKHApOworCQkJYnJlYWs7CisJCX0KKwkJZXJyID0gbS0+b3AtPnNob3cobSwgcCk7CisJCWlmIChlcnIgfHwgbS0+Y291bnQgPT0gbS0+c2l6ZSkgeworCQkJbS0+Y291bnQgPSBvZmZzOworCQkJYnJlYWs7CisJCX0KKwkJcG9zID0gbmV4dDsKKwl9CisJbS0+b3AtPnN0b3AobSwgcCk7CisJbiA9IG1pbihtLT5jb3VudCwgc2l6ZSk7CisJZXJyID0gY29weV90b191c2VyKGJ1ZiwgbS0+YnVmLCBuKTsKKwlpZiAoZXJyKQorCQlnb3RvIEVmYXVsdDsKKwljb3BpZWQgKz0gbjsKKwltLT5jb3VudCAtPSBuOworCWlmIChtLT5jb3VudCkKKwkJbS0+ZnJvbSA9IG47CisJZWxzZQorCQlwb3MrKzsKKwltLT5pbmRleCA9IHBvczsKK0RvbmU6CisJaWYgKCFjb3BpZWQpCisJCWNvcGllZCA9IGVycjsKKwllbHNlCisJCSpwcG9zICs9IGNvcGllZDsKKwlmaWxlLT5mX3ZlcnNpb24gPSBtLT52ZXJzaW9uOworCXVwKCZtLT5zZW0pOworCXJldHVybiBjb3BpZWQ7CitFbm9tZW06CisJZXJyID0gLUVOT01FTTsKKwlnb3RvIERvbmU7CitFZmF1bHQ6CisJZXJyID0gLUVGQVVMVDsKKwlnb3RvIERvbmU7Cit9CitFWFBPUlRfU1lNQk9MKHNlcV9yZWFkKTsKKworc3RhdGljIGludCB0cmF2ZXJzZShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCBvZmZzZXQpCit7CisJbG9mZl90IHBvcyA9IDA7CisJaW50IGVycm9yID0gMDsKKwl2b2lkICpwOworCisJbS0+dmVyc2lvbiA9IDA7CisJbS0+aW5kZXggPSAwOworCW0tPmNvdW50ID0gbS0+ZnJvbSA9IDA7CisJaWYgKCFvZmZzZXQpCisJCXJldHVybiAwOworCWlmICghbS0+YnVmKSB7CisJCW0tPmJ1ZiA9IGttYWxsb2MobS0+c2l6ZSA9IFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CisJCWlmICghbS0+YnVmKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCXAgPSBtLT5vcC0+c3RhcnQobSwgJm0tPmluZGV4KTsKKwl3aGlsZSAocCkgeworCQllcnJvciA9IFBUUl9FUlIocCk7CisJCWlmIChJU19FUlIocCkpCisJCQlicmVhazsKKwkJZXJyb3IgPSBtLT5vcC0+c2hvdyhtLCBwKTsKKwkJaWYgKGVycm9yKQorCQkJYnJlYWs7CisJCWlmIChtLT5jb3VudCA9PSBtLT5zaXplKQorCQkJZ290byBFb3ZlcmZsb3c7CisJCWlmIChwb3MgKyBtLT5jb3VudCA+IG9mZnNldCkgeworCQkJbS0+ZnJvbSA9IG9mZnNldCAtIHBvczsKKwkJCW0tPmNvdW50IC09IG0tPmZyb207CisJCQlicmVhazsKKwkJfQorCQlwb3MgKz0gbS0+Y291bnQ7CisJCW0tPmNvdW50ID0gMDsKKwkJaWYgKHBvcyA9PSBvZmZzZXQpIHsKKwkJCW0tPmluZGV4Kys7CisJCQlicmVhazsKKwkJfQorCQlwID0gbS0+b3AtPm5leHQobSwgcCwgJm0tPmluZGV4KTsKKwl9CisJbS0+b3AtPnN0b3AobSwgcCk7CisJcmV0dXJuIGVycm9yOworCitFb3ZlcmZsb3c6CisJbS0+b3AtPnN0b3AobSwgcCk7CisJa2ZyZWUobS0+YnVmKTsKKwltLT5idWYgPSBrbWFsbG9jKG0tPnNpemUgPDw9IDEsIEdGUF9LRVJORUwpOworCXJldHVybiAhbS0+YnVmID8gLUVOT01FTSA6IC1FQUdBSU47Cit9CisKKy8qKgorICoJc2VxX2xzZWVrIC0JLT5sbHNlZWsoKSBtZXRob2QgZm9yIHNlcXVlbnRpYWwgZmlsZXMuCisgKglAZmlsZSwgQG9mZnNldCwgQG9yaWdpbjogc2VlIGZpbGVfb3BlcmF0aW9ucyBtZXRob2QKKyAqCisgKglSZWFkeS1tYWRlIC0+Zl9vcC0+bGxzZWVrKCkKKyAqLworbG9mZl90IHNlcV9sc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWdpbikKK3sKKwlzdHJ1Y3Qgc2VxX2ZpbGUgKm0gPSAoc3RydWN0IHNlcV9maWxlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWxvbmcgbG9uZyByZXR2YWwgPSAtRUlOVkFMOworCisJZG93bigmbS0+c2VtKTsKKwltLT52ZXJzaW9uID0gZmlsZS0+Zl92ZXJzaW9uOworCXN3aXRjaCAob3JpZ2luKSB7CisJCWNhc2UgMToKKwkJCW9mZnNldCArPSBmaWxlLT5mX3BvczsKKwkJY2FzZSAwOgorCQkJaWYgKG9mZnNldCA8IDApCisJCQkJYnJlYWs7CisJCQlyZXR2YWwgPSBvZmZzZXQ7CisJCQlpZiAob2Zmc2V0ICE9IGZpbGUtPmZfcG9zKSB7CisJCQkJd2hpbGUgKChyZXR2YWw9dHJhdmVyc2UobSwgb2Zmc2V0KSkgPT0gLUVBR0FJTikKKwkJCQkJOworCQkJCWlmIChyZXR2YWwpIHsKKwkJCQkJLyogd2l0aCBleHRyZW1lIHByZWp1ZGljZS4uLiAqLworCQkJCQlmaWxlLT5mX3BvcyA9IDA7CisJCQkJCW0tPnZlcnNpb24gPSAwOworCQkJCQltLT5pbmRleCA9IDA7CisJCQkJCW0tPmNvdW50ID0gMDsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXR2YWwgPSBmaWxlLT5mX3BvcyA9IG9mZnNldDsKKwkJCQl9CisJCQl9CisJfQorCXVwKCZtLT5zZW0pOworCWZpbGUtPmZfdmVyc2lvbiA9IG0tPnZlcnNpb247CisJcmV0dXJuIHJldHZhbDsKK30KK0VYUE9SVF9TWU1CT0woc2VxX2xzZWVrKTsKKworLyoqCisgKglzZXFfcmVsZWFzZSAtCWZyZWUgdGhlIHN0cnVjdHVyZXMgYXNzb2NpYXRlZCB3aXRoIHNlcXVlbnRpYWwgZmlsZS4KKyAqCUBmaWxlOiBmaWxlIGluIHF1ZXN0aW9uCisgKglAaW5vZGU6IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlCisgKgorICoJRnJlZXMgdGhlIHN0cnVjdHVyZXMgYXNzb2NpYXRlZCB3aXRoIHNlcXVlbnRpYWwgZmlsZTsgY2FuIGJlIHVzZWQKKyAqCWFzIC0+Zl9vcC0+cmVsZWFzZSgpIGlmIHlvdSBkb24ndCBoYXZlIHByaXZhdGUgZGF0YSB0byBkZXN0cm95LgorICovCitpbnQgc2VxX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNlcV9maWxlICptID0gKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlrZnJlZShtLT5idWYpOworCWtmcmVlKG0pOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChzZXFfcmVsZWFzZSk7CisKKy8qKgorICoJc2VxX2VzY2FwZSAtCXByaW50IHN0cmluZyBpbnRvIGJ1ZmZlciwgZXNjYXBpbmcgc29tZSBjaGFyYWN0ZXJzCisgKglAbToJdGFyZ2V0IGJ1ZmZlcgorICoJQHM6CXN0cmluZworICoJQGVzYzoJc2V0IG9mIGNoYXJhY3RlcnMgdGhhdCBuZWVkIGVzY2FwaW5nCisgKgorICoJUHV0cyBzdHJpbmcgaW50byBidWZmZXIsIHJlcGxhY2luZyBlYWNoIG9jY3VycmVuY2Ugb2YgY2hhcmFjdGVyIGZyb20KKyAqCUBlc2Mgd2l0aCB1c3VhbCBvY3RhbCBlc2NhcGUuICBSZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCAtMSAtIGluCisgKgljYXNlIG9mIG92ZXJmbG93LgorICovCitpbnQgc2VxX2VzY2FwZShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmVzYykKK3sKKwljaGFyICplbmQgPSBtLT5idWYgKyBtLT5zaXplOworICAgICAgICBjaGFyICpwOworCWNoYXIgYzsKKworICAgICAgICBmb3IgKHAgPSBtLT5idWYgKyBtLT5jb3VudDsgKGMgPSAqcykgIT0gJ1wwJyAmJiBwIDwgZW5kOyBzKyspIHsKKwkJaWYgKCFzdHJjaHIoZXNjLCBjKSkgeworCQkJKnArKyA9IGM7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAocCArIDMgPCBlbmQpIHsKKwkJCSpwKysgPSAnXFwnOworCQkJKnArKyA9ICcwJyArICgoYyAmIDAzMDApID4+IDYpOworCQkJKnArKyA9ICcwJyArICgoYyAmIDA3MCkgPj4gMyk7CisJCQkqcCsrID0gJzAnICsgKGMgJiAwNyk7CisJCQljb250aW51ZTsKKwkJfQorCQltLT5jb3VudCA9IG0tPnNpemU7CisJCXJldHVybiAtMTsKKyAgICAgICAgfQorCW0tPmNvdW50ID0gcCAtIG0tPmJ1ZjsKKyAgICAgICAgcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHNlcV9lc2NhcGUpOworCitpbnQgc2VxX3ByaW50ZihzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGNvbnN0IGNoYXIgKmYsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJaW50IGxlbjsKKworCWlmIChtLT5jb3VudCA8IG0tPnNpemUpIHsKKwkJdmFfc3RhcnQoYXJncywgZik7CisJCWxlbiA9IHZzbnByaW50ZihtLT5idWYgKyBtLT5jb3VudCwgbS0+c2l6ZSAtIG0tPmNvdW50LCBmLCBhcmdzKTsKKwkJdmFfZW5kKGFyZ3MpOworCQlpZiAobS0+Y291bnQgKyBsZW4gPCBtLT5zaXplKSB7CisJCQltLT5jb3VudCArPSBsZW47CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwltLT5jb3VudCA9IG0tPnNpemU7CisJcmV0dXJuIC0xOworfQorRVhQT1JUX1NZTUJPTChzZXFfcHJpbnRmKTsKKworaW50IHNlcV9wYXRoKHN0cnVjdCBzZXFfZmlsZSAqbSwKKwkgICAgIHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJICAgICBjaGFyICplc2MpCit7CisJaWYgKG0tPmNvdW50IDwgbS0+c2l6ZSkgeworCQljaGFyICpzID0gbS0+YnVmICsgbS0+Y291bnQ7CisJCWNoYXIgKnAgPSBkX3BhdGgoZGVudHJ5LCBtbnQsIHMsIG0tPnNpemUgLSBtLT5jb3VudCk7CisJCWlmICghSVNfRVJSKHApKSB7CisJCQl3aGlsZSAocyA8PSBwKSB7CisJCQkJY2hhciBjID0gKnArKzsKKwkJCQlpZiAoIWMpIHsKKwkJCQkJcCA9IG0tPmJ1ZiArIG0tPmNvdW50OworCQkJCQltLT5jb3VudCA9IHMgLSBtLT5idWY7CisJCQkJCXJldHVybiBzIC0gcDsKKwkJCQl9IGVsc2UgaWYgKCFzdHJjaHIoZXNjLCBjKSkgeworCQkJCQkqcysrID0gYzsKKwkJCQl9IGVsc2UgaWYgKHMgKyA0ID4gcCkgeworCQkJCQlicmVhazsKKwkJCQl9IGVsc2UgeworCQkJCQkqcysrID0gJ1xcJzsKKwkJCQkJKnMrKyA9ICcwJyArICgoYyAmIDAzMDApID4+IDYpOworCQkJCQkqcysrID0gJzAnICsgKChjICYgMDcwKSA+PiAzKTsKKwkJCQkJKnMrKyA9ICcwJyArIChjICYgMDcpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwltLT5jb3VudCA9IG0tPnNpemU7CisJcmV0dXJuIC0xOworfQorRVhQT1JUX1NZTUJPTChzZXFfcGF0aCk7CisKK3N0YXRpYyB2b2lkICpzaW5nbGVfc3RhcnQoc3RydWN0IHNlcV9maWxlICpwLCBsb2ZmX3QgKnBvcykKK3sKKwlyZXR1cm4gTlVMTCArICgqcG9zID09IDApOworfQorCitzdGF0aWMgdm9pZCAqc2luZ2xlX25leHQoc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKK3sKKwkrKypwb3M7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHNpbmdsZV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqcCwgdm9pZCAqdikKK3sKK30KKworaW50IHNpbmdsZV9vcGVuKHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgKCpzaG93KShzdHJ1Y3Qgc2VxX2ZpbGUgKiwgdm9pZCAqKSwKKwkJdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgKm9wID0ga21hbGxvYyhzaXplb2YoKm9wKSwgR0ZQX0tFUk5FTCk7CisJaW50IHJlcyA9IC1FTk9NRU07CisKKwlpZiAob3ApIHsKKwkJb3AtPnN0YXJ0ID0gc2luZ2xlX3N0YXJ0OworCQlvcC0+bmV4dCA9IHNpbmdsZV9uZXh0OworCQlvcC0+c3RvcCA9IHNpbmdsZV9zdG9wOworCQlvcC0+c2hvdyA9IHNob3c7CisJCXJlcyA9IHNlcV9vcGVuKGZpbGUsIG9wKTsKKwkJaWYgKCFyZXMpCisJCQkoKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YSktPnByaXZhdGUgPSBkYXRhOworCQllbHNlCisJCQlrZnJlZShvcCk7CisJfQorCXJldHVybiByZXM7Cit9CitFWFBPUlRfU1lNQk9MKHNpbmdsZV9vcGVuKTsKKworaW50IHNpbmdsZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzZXFfb3BlcmF0aW9ucyAqb3AgPSAoKHN0cnVjdCBzZXFfZmlsZSAqKWZpbGUtPnByaXZhdGVfZGF0YSktPm9wOworCWludCByZXMgPSBzZXFfcmVsZWFzZShpbm9kZSwgZmlsZSk7CisJa2ZyZWUob3ApOworCXJldHVybiByZXM7Cit9CitFWFBPUlRfU1lNQk9MKHNpbmdsZV9yZWxlYXNlKTsKKworaW50IHNlcV9yZWxlYXNlX3ByaXZhdGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNlcV9maWxlICpzZXEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlrZnJlZShzZXEtPnByaXZhdGUpOworCXNlcS0+cHJpdmF0ZSA9IE5VTEw7CisJcmV0dXJuIHNlcV9yZWxlYXNlKGlub2RlLCBmaWxlKTsKK30KK0VYUE9SVF9TWU1CT0woc2VxX3JlbGVhc2VfcHJpdmF0ZSk7CisKK2ludCBzZXFfcHV0YyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGNoYXIgYykKK3sKKwlpZiAobS0+Y291bnQgPCBtLT5zaXplKSB7CisJCW0tPmJ1ZlttLT5jb3VudCsrXSA9IGM7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLTE7Cit9CitFWFBPUlRfU1lNQk9MKHNlcV9wdXRjKTsKKworaW50IHNlcV9wdXRzKHN0cnVjdCBzZXFfZmlsZSAqbSwgY29uc3QgY2hhciAqcykKK3sKKwlpbnQgbGVuID0gc3RybGVuKHMpOworCWlmIChtLT5jb3VudCArIGxlbiA8IG0tPnNpemUpIHsKKwkJbWVtY3B5KG0tPmJ1ZiArIG0tPmNvdW50LCBzLCBsZW4pOworCQltLT5jb3VudCArPSBsZW47CisJCXJldHVybiAwOworCX0KKwltLT5jb3VudCA9IG0tPnNpemU7CisJcmV0dXJuIC0xOworfQorRVhQT1JUX1NZTUJPTChzZXFfcHV0cyk7CmRpZmYgLS1naXQgYS9mcy9zbWJmcy9NYWtlZmlsZSBiL2ZzL3NtYmZzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMjQ2YjcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9zbWJmcy9NYWtlZmlsZQpAQCAtMCwwICsxLDM5IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgbGludXggc21iLWZpbGVzeXN0ZW0gcm91dGluZXMuCisjCisKK29iai0kKENPTkZJR19TTUJfRlMpICs9IHNtYmZzLm8KKworc21iZnMtb2JqcyA6PSBwcm9jLm8gZGlyLm8gY2FjaGUubyBzb2NrLm8gaW5vZGUubyBmaWxlLm8gaW9jdGwubyBnZXRvcHQubyBcCisJCXN5bWxpbmsubyBzbWJpb2QubyByZXF1ZXN0Lm8KKworIyBJZiB5b3Ugd2FudCBkZWJ1Z2dpbmcgb3V0cHV0LCB5b3UgbWF5IGFkZCB0aGVzZSBmbGFncyB0byB0aGUgRVhUUkFfQ0ZMQUdTCisjIFNNQkZTX1BBUkFOT0lBIHNob3VsZCBub3JtYWxseSBiZSBlbmFibGVkLgorCitFWFRSQV9DRkxBR1MgKz0gLURTTUJGU19QQVJBTk9JQQorI0VYVFJBX0NGTEFHUyArPSAtRFNNQkZTX0RFQlVHCisjRVhUUkFfQ0ZMQUdTICs9IC1EU01CRlNfREVCVUdfVkVSQk9TRQorI0VYVFJBX0NGTEFHUyArPSAtRERFQlVHX1NNQl9NQUxMT0MKKyNFWFRSQV9DRkxBR1MgKz0gLURERUJVR19TTUJfVElNRVNUQU1QCisjRVhUUkFfQ0ZMQUdTICs9IC1XZXJyb3IKKworIworIyBNYWludGFpbmVyIHJ1bGVzCisjCisKKyMgZ2V0b3B0LmMgbm90IGluY2x1ZGVkLiBJdCBpcyBpbnRlbnRpb25hbGx5IHNlcGFyYXRlCitTUkMgPSBwcm9jLmMgZGlyLmMgY2FjaGUuYyBzb2NrLmMgaW5vZGUuYyBmaWxlLmMgaW9jdGwuYyBzbWJpb2QuYyByZXF1ZXN0LmMgXAorCXN5bWxpbmsuYworCitwcm90bzoKKwktcm0gLWYgcHJvdG8uaAorCUBlY2hvID4gIHByb3RvMi5oICIvKiIKKwlAZWNobyA+PiBwcm90bzIuaCAiICogIEF1dG9nZW5lcmF0ZWQgd2l0aCBjcHJvdG8gb246ICIgYGRhdGVgCisJQGVjaG8gPj4gcHJvdG8yLmggIiAqLyIKKwlAZWNobyA+PiBwcm90bzIuaCAiIgorCUBlY2hvID4+IHByb3RvMi5oICJzdHJ1Y3Qgc21iX3JlcXVlc3Q7IgorCUBlY2hvID4+IHByb3RvMi5oICJzdHJ1Y3Qgc29jazsiCisJQGVjaG8gPj4gcHJvdG8yLmggInN0cnVjdCBzdGF0ZnM7IgorCUBlY2hvID4+IHByb3RvMi5oICIiCisJY3Byb3RvIC1FICJnY2MgLUUiIC1lIC12IC1JICQoVE9QRElSKS9pbmNsdWRlIC1ETUFLSU5HX1BST1RPIC1EX19LRVJORUxfXyAkKFNSQykgPj4gcHJvdG8yLmgKKwltdiBwcm90bzIuaCBwcm90by5oCmRpZmYgLS1naXQgYS9mcy9zbWJmcy9jYWNoZS5jIGIvZnMvc21iZnMvY2FjaGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2U2YjgxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvc21iZnMvY2FjaGUuYwpAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqICBjYWNoZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk3IGJ5IEJpbGwgSGF3ZXMKKyAqCisgKiBSb3V0aW5lcyB0byBzdXBwb3J0IGRpcmVjdG9yeSBjYWNoZWluZyB1c2luZyB0aGUgcGFnZSBjYWNoZS4KKyAqIFRoaXMgY2FjaGUgY29kZSBpcyBhbG1vc3QgZGlyZWN0bHkgdGFrZW4gZnJvbSBuY3Bmcy4KKyAqCisgKiBQbGVhc2UgYWRkIGEgbm90ZSBhYm91dCB5b3VyIGNoYW5nZXMgdG8gc21iZnMgaW4gdGhlIENoYW5nZUxvZyBmaWxlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RpcmVudC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtYl9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKworI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKKyNpbmNsdWRlICJzbWJfZGVidWcuaCIKKyNpbmNsdWRlICJwcm90by5oIgorCisvKgorICogRm9yY2UgdGhlIG5leHQgYXR0ZW1wdCB0byB1c2UgdGhlIGNhY2hlIHRvIGJlIGEgdGltZW91dC4KKyAqIElmIHdlIGNhbid0IGZpbmQgdGhlIHBhZ2UgdGhhdCdzIGZpbmUsIGl0IHdpbGwgY2F1c2UgYSByZWZyZXNoLgorICovCit2b2lkCitzbWJfaW52YWxpZF9kaXJfY2FjaGUoc3RydWN0IGlub2RlICogZGlyKQoreworCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyID0gc2VydmVyX2Zyb21faW5vZGUoZGlyKTsKKwl1bmlvbiAgc21iX2Rpcl9jYWNoZSAqY2FjaGUgPSBOVUxMOworCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKKworCXBhZ2UgPSBncmFiX2NhY2hlX3BhZ2UoJmRpci0+aV9kYXRhLCAwKTsKKwlpZiAoIXBhZ2UpCisJCWdvdG8gb3V0OworCisJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpCisJCWdvdG8gb3V0X3VubG9jazsKKworCWNhY2hlID0ga21hcChwYWdlKTsKKwljYWNoZS0+aGVhZC50aW1lID0gamlmZmllcyAtIFNNQl9NQVhfQUdFKHNlcnZlcik7CisKKwlrdW5tYXAocGFnZSk7CisJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworb3V0X3VubG9jazoKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CitvdXQ6CisJcmV0dXJuOworfQorCisvKgorICogTWFyayBhbGwgZGVudHJpZXMgZm9yICdwYXJlbnQnIGFzIGludmFsaWQsIGZvcmNpbmcgdGhlbSB0byBiZSByZS1yZWFkCisgKi8KK3ZvaWQKK3NtYl9pbnZhbGlkYXRlX2RpcmNhY2hlX2VudHJpZXMoc3RydWN0IGRlbnRyeSAqcGFyZW50KQoreworCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyID0gc2VydmVyX2Zyb21fZGVudHJ5KHBhcmVudCk7CisJc3RydWN0IGxpc3RfaGVhZCAqbmV4dDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisKKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwluZXh0ID0gcGFyZW50LT5kX3N1YmRpcnMubmV4dDsKKwl3aGlsZSAobmV4dCAhPSAmcGFyZW50LT5kX3N1YmRpcnMpIHsKKwkJZGVudHJ5ID0gbGlzdF9lbnRyeShuZXh0LCBzdHJ1Y3QgZGVudHJ5LCBkX2NoaWxkKTsKKwkJZGVudHJ5LT5kX2ZzZGF0YSA9IE5VTEw7CisJCXNtYl9hZ2VfZGVudHJ5KHNlcnZlciwgZGVudHJ5KTsKKwkJbmV4dCA9IG5leHQtPm5leHQ7CisJfQorCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7Cit9CisKKy8qCisgKiBkZ2V0LCBidXQgcmVxdWlyZSB0aGF0IGZwb3MgYW5kIHBhcmVudCBtYXRjaGVzIHdoYXQgdGhlIGRlbnRyeSBjb250YWlucy4KKyAqIGRlbnRyeSBpcyBub3Qga25vd24gdG8gYmUgYSB2YWxpZCBwb2ludGVyIGF0IGVudHJ5LgorICovCitzdHJ1Y3QgZGVudHJ5ICoKK3NtYl9kZ2V0X2Zwb3Moc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIHVuc2lnbmVkIGxvbmcgZnBvcykKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50ID0gZGVudHJ5OworCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQ7CisKKwlpZiAoZF92YWxpZGF0ZShkZW50LCBwYXJlbnQpKSB7CisJCWlmIChkZW50LT5kX25hbWUubGVuIDw9IFNNQl9NQVhOQU1FTEVOICYmCisJCSAgICAodW5zaWduZWQgbG9uZylkZW50LT5kX2ZzZGF0YSA9PSBmcG9zKSB7CisJCQlpZiAoIWRlbnQtPmRfaW5vZGUpIHsKKwkJCQlkcHV0KGRlbnQpOworCQkJCWRlbnQgPSBOVUxMOworCQkJfQorCQkJcmV0dXJuIGRlbnQ7CisJCX0KKwkJZHB1dChkZW50KTsKKwl9CisKKwkvKiBJZiBhIHBvaW50ZXIgaXMgaW52YWxpZCwgd2Ugc2VhcmNoIHRoZSBkZW50cnkuICovCisJc3Bpbl9sb2NrKCZkY2FjaGVfbG9jayk7CisJbmV4dCA9IHBhcmVudC0+ZF9zdWJkaXJzLm5leHQ7CisJd2hpbGUgKG5leHQgIT0gJnBhcmVudC0+ZF9zdWJkaXJzKSB7CisJCWRlbnQgPSBsaXN0X2VudHJ5KG5leHQsIHN0cnVjdCBkZW50cnksIGRfY2hpbGQpOworCQlpZiAoKHVuc2lnbmVkIGxvbmcpZGVudC0+ZF9mc2RhdGEgPT0gZnBvcykgeworCQkJaWYgKGRlbnQtPmRfaW5vZGUpCisJCQkJZGdldF9sb2NrZWQoZGVudCk7CisJCQllbHNlCisJCQkJZGVudCA9IE5VTEw7CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKwkJbmV4dCA9IG5leHQtPm5leHQ7CisJfQorCWRlbnQgPSBOVUxMOworb3V0X3VubG9jazoKKwlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCXJldHVybiBkZW50OworfQorCisKKy8qCisgKiBDcmVhdGUgZGVudHJ5L2lub2RlIGZvciB0aGlzIGZpbGUgYW5kIGFkZCBpdCB0byB0aGUgZGlyY2FjaGUuCisgKi8KK2ludAorc21iX2ZpbGxfY2FjaGUoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIsCisJICAgICAgIHN0cnVjdCBzbWJfY2FjaGVfY29udHJvbCAqY3RybCwgc3RydWN0IHFzdHIgKnFuYW1lLAorCSAgICAgICBzdHJ1Y3Qgc21iX2ZhdHRyICplbnRyeSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpuZXdkZW50LCAqZGVudHJ5ID0gZmlscC0+Zl9kZW50cnk7CisJc3RydWN0IGlub2RlICpuZXdpbm8sICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3Qgc21iX2NhY2hlX2NvbnRyb2wgY3RsID0gKmN0cmw7CisJaW50IHZhbGlkID0gMDsKKwlpbnQgaGFzaGVkID0gMDsKKwlpbm9fdCBpbm8gPSAwOworCisJcW5hbWUtPmhhc2ggPSBmdWxsX25hbWVfaGFzaChxbmFtZS0+bmFtZSwgcW5hbWUtPmxlbik7CisKKwlpZiAoZGVudHJ5LT5kX29wICYmIGRlbnRyeS0+ZF9vcC0+ZF9oYXNoKQorCQlpZiAoZGVudHJ5LT5kX29wLT5kX2hhc2goZGVudHJ5LCBxbmFtZSkgIT0gMCkKKwkJCWdvdG8gZW5kX2FkdmFuY2U7CisKKwluZXdkZW50ID0gZF9sb29rdXAoZGVudHJ5LCBxbmFtZSk7CisKKwlpZiAoIW5ld2RlbnQpIHsKKwkJbmV3ZGVudCA9IGRfYWxsb2MoZGVudHJ5LCBxbmFtZSk7CisJCWlmICghbmV3ZGVudCkKKwkJCWdvdG8gZW5kX2FkdmFuY2U7CisJfSBlbHNlIHsKKwkJaGFzaGVkID0gMTsKKwkJbWVtY3B5KChjaGFyICopIG5ld2RlbnQtPmRfbmFtZS5uYW1lLCBxbmFtZS0+bmFtZSwKKwkJICAgICAgIG5ld2RlbnQtPmRfbmFtZS5sZW4pOworCX0KKworCWlmICghbmV3ZGVudC0+ZF9pbm9kZSkgeworCQlzbWJfcmVuZXdfdGltZXMobmV3ZGVudCk7CisJCWVudHJ5LT5mX2lubyA9IGl1bmlxdWUoaW5vZGUtPmlfc2IsIDIpOworCQluZXdpbm8gPSBzbWJfaWdldChpbm9kZS0+aV9zYiwgZW50cnkpOworCQlpZiAobmV3aW5vKSB7CisJCQlzbWJfbmV3X2RlbnRyeShuZXdkZW50KTsKKwkJCWRfaW5zdGFudGlhdGUobmV3ZGVudCwgbmV3aW5vKTsKKwkJCWlmICghaGFzaGVkKQorCQkJCWRfcmVoYXNoKG5ld2RlbnQpOworCQl9CisJfSBlbHNlCisJCXNtYl9zZXRfaW5vZGVfYXR0cihuZXdkZW50LT5kX2lub2RlLCBlbnRyeSk7CisKKyAgICAgICAgaWYgKG5ld2RlbnQtPmRfaW5vZGUpIHsKKwkJaW5vID0gbmV3ZGVudC0+ZF9pbm9kZS0+aV9pbm87CisJCW5ld2RlbnQtPmRfZnNkYXRhID0gKHZvaWQgKikgY3RsLmZwb3M7CisJCXNtYl9uZXdfZGVudHJ5KG5ld2RlbnQpOworCX0KKworCWlmIChjdGwuaWR4ID49IFNNQl9ESVJDQUNIRV9TSVpFKSB7CisJCWlmIChjdGwucGFnZSkgeworCQkJa3VubWFwKGN0bC5wYWdlKTsKKwkJCVNldFBhZ2VVcHRvZGF0ZShjdGwucGFnZSk7CisJCQl1bmxvY2tfcGFnZShjdGwucGFnZSk7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UoY3RsLnBhZ2UpOworCQl9CisJCWN0bC5jYWNoZSA9IE5VTEw7CisJCWN0bC5pZHggIC09IFNNQl9ESVJDQUNIRV9TSVpFOworCQljdGwub2ZzICArPSAxOworCQljdGwucGFnZSAgPSBncmFiX2NhY2hlX3BhZ2UoJmlub2RlLT5pX2RhdGEsIGN0bC5vZnMpOworCQlpZiAoY3RsLnBhZ2UpCisJCQljdGwuY2FjaGUgPSBrbWFwKGN0bC5wYWdlKTsKKwl9CisJaWYgKGN0bC5jYWNoZSkgeworCQljdGwuY2FjaGUtPmRlbnRyeVtjdGwuaWR4XSA9IG5ld2RlbnQ7CisJCXZhbGlkID0gMTsKKwl9CisJZHB1dChuZXdkZW50KTsKKworZW5kX2FkdmFuY2U6CisJaWYgKCF2YWxpZCkKKwkJY3RsLnZhbGlkID0gMDsKKwlpZiAoIWN0bC5maWxsZWQgJiYgKGN0bC5mcG9zID09IGZpbHAtPmZfcG9zKSkgeworCQlpZiAoIWlubykKKwkJCWlubyA9IGZpbmRfaW5vZGVfbnVtYmVyKGRlbnRyeSwgcW5hbWUpOworCQlpZiAoIWlubykKKwkJCWlubyA9IGl1bmlxdWUoaW5vZGUtPmlfc2IsIDIpOworCQljdGwuZmlsbGVkID0gZmlsbGRpcihkaXJlbnQsIHFuYW1lLT5uYW1lLCBxbmFtZS0+bGVuLAorCQkJCSAgICAgZmlscC0+Zl9wb3MsIGlubywgRFRfVU5LTk9XTik7CisJCWlmICghY3RsLmZpbGxlZCkKKwkJCWZpbHAtPmZfcG9zICs9IDE7CisJfQorCWN0bC5mcG9zICs9IDE7CisJY3RsLmlkeCAgKz0gMTsKKwkqY3RybCA9IGN0bDsKKwlyZXR1cm4gKGN0bC52YWxpZCB8fCAhY3RsLmZpbGxlZCk7Cit9CmRpZmYgLS1naXQgYS9mcy9zbWJmcy9kaXIuYyBiL2ZzL3NtYmZzL2Rpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YzMzZTEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9zbWJmcy9kaXIuYwpAQCAtMCwwICsxLDY5MyBAQAorLyoKKyAqICBkaXIuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgYnkgUGFhbC1Lci4gRW5nc3RhZCBhbmQgVm9sa2VyIExlbmRlY2tlCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3IGJ5IFZvbGtlciBMZW5kZWNrZQorICoKKyAqICBQbGVhc2UgYWRkIGEgbm90ZSBhYm91dCB5b3VyIGNoYW5nZXMgdG8gc21iZnMgaW4gdGhlIENoYW5nZUxvZyBmaWxlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbWJfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbWJfbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbWJuby5oPgorCisjaW5jbHVkZSAic21iX2RlYnVnLmgiCisjaW5jbHVkZSAicHJvdG8uaCIKKworc3RhdGljIGludCBzbWJfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqLCB2b2lkICosIGZpbGxkaXJfdCk7CitzdGF0aWMgaW50IHNtYl9kaXJfb3BlbihzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpzbWJfbG9va3VwKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBuYW1laWRhdGEgKik7CitzdGF0aWMgaW50IHNtYl9jcmVhdGUoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKiwgaW50LCBzdHJ1Y3QgbmFtZWlkYXRhICopOworc3RhdGljIGludCBzbWJfbWtkaXIoc3RydWN0IGlub2RlICosIHN0cnVjdCBkZW50cnkgKiwgaW50KTsKK3N0YXRpYyBpbnQgc21iX3JtZGlyKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICopOworc3RhdGljIGludCBzbWJfdW5saW5rKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICopOworc3RhdGljIGludCBzbWJfcmVuYW1lKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICosCisJCSAgICAgIHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICopOworc3RhdGljIGludCBzbWJfbWFrZV9ub2RlKHN0cnVjdCBpbm9kZSAqLHN0cnVjdCBkZW50cnkgKixpbnQsZGV2X3QpOworc3RhdGljIGludCBzbWJfbGluayhzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZGVudHJ5ICopOworCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNtYl9kaXJfb3BlcmF0aW9ucyA9Cit7CisJLnJlYWQJCT0gZ2VuZXJpY19yZWFkX2RpciwKKwkucmVhZGRpcgk9IHNtYl9yZWFkZGlyLAorCS5pb2N0bAkJPSBzbWJfaW9jdGwsCisJLm9wZW4JCT0gc21iX2Rpcl9vcGVuLAorfTsKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgc21iX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0KK3sKKwkuY3JlYXRlCQk9IHNtYl9jcmVhdGUsCisJLmxvb2t1cAkJPSBzbWJfbG9va3VwLAorCS51bmxpbmsJCT0gc21iX3VubGluaywKKwkubWtkaXIJCT0gc21iX21rZGlyLAorCS5ybWRpcgkJPSBzbWJfcm1kaXIsCisJLnJlbmFtZQkJPSBzbWJfcmVuYW1lLAorCS5nZXRhdHRyCT0gc21iX2dldGF0dHIsCisJLnNldGF0dHIJPSBzbWJfbm90aWZ5X2NoYW5nZSwKK307CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHNtYl9kaXJfaW5vZGVfb3BlcmF0aW9uc191bml4ID0KK3sKKwkuY3JlYXRlCQk9IHNtYl9jcmVhdGUsCisJLmxvb2t1cAkJPSBzbWJfbG9va3VwLAorCS51bmxpbmsJCT0gc21iX3VubGluaywKKwkubWtkaXIJCT0gc21iX21rZGlyLAorCS5ybWRpcgkJPSBzbWJfcm1kaXIsCisJLnJlbmFtZQkJPSBzbWJfcmVuYW1lLAorCS5nZXRhdHRyCT0gc21iX2dldGF0dHIsCisJLnNldGF0dHIJPSBzbWJfbm90aWZ5X2NoYW5nZSwKKwkuc3ltbGluawk9IHNtYl9zeW1saW5rLAorCS5ta25vZAkJPSBzbWJfbWFrZV9ub2RlLAorCS5saW5rCQk9IHNtYl9saW5rLAorfTsKKworLyoKKyAqIFJlYWQgYSBkaXJlY3RvcnksIHVzaW5nIGZpbGxkaXIgdG8gZmlsbCB0aGUgZGlyZW50IG1lbW9yeS4KKyAqIHNtYl9wcm9jX3JlYWRkaXIgZG9lcyB0aGUgYWN0dWFsIHJlYWRpbmcgZnJvbSB0aGUgc21iIHNlcnZlci4KKyAqCisgKiBUaGUgY2FjaGUgY29kZSBpcyBhbG1vc3QgZGlyZWN0bHkgdGFrZW4gZnJvbSBuY3BmcworICovCitzdGF0aWMgaW50IAorc21iX3JlYWRkaXIoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKmRpcmVudCwgZmlsbGRpcl90IGZpbGxkaXIpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlscC0+Zl9kZW50cnk7CisJc3RydWN0IGlub2RlICpkaXIgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIgPSBzZXJ2ZXJfZnJvbV9kZW50cnkoZGVudHJ5KTsKKwl1bmlvbiAgc21iX2Rpcl9jYWNoZSAqY2FjaGUgPSBOVUxMOworCXN0cnVjdCBzbWJfY2FjaGVfY29udHJvbCBjdGw7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOworCWludCByZXN1bHQ7CisKKwljdGwucGFnZSAgPSBOVUxMOworCWN0bC5jYWNoZSA9IE5VTEw7CisKKwlWRVJCT1NFKCJyZWFkaW5nICVzLyVzLCBmX3Bvcz0lZFxuIiwKKwkJREVOVFJZX1BBVEgoZGVudHJ5KSwgIChpbnQpIGZpbHAtPmZfcG9zKTsKKworCXJlc3VsdCA9IDA7CisKKwlsb2NrX2tlcm5lbCgpOworCisJc3dpdGNoICgodW5zaWduZWQgaW50KSBmaWxwLT5mX3BvcykgeworCWNhc2UgMDoKKwkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLiIsIDEsIDAsIGRpci0+aV9pbm8sIERUX0RJUikgPCAwKQorCQkJZ290byBvdXQ7CisJCWZpbHAtPmZfcG9zID0gMTsKKwkJLyogZmFsbHRocm91Z2ggKi8KKwljYXNlIDE6CisJCWlmIChmaWxsZGlyKGRpcmVudCwgIi4uIiwgMiwgMSwgcGFyZW50X2lubyhkZW50cnkpLCBEVF9ESVIpIDwgMCkKKwkJCWdvdG8gb3V0OworCQlmaWxwLT5mX3BvcyA9IDI7CisJfQorCisJLyoKKwkgKiBNYWtlIHN1cmUgb3VyIGlub2RlIGlzIHVwLXRvLWRhdGUuCisJICovCisJcmVzdWx0ID0gc21iX3JldmFsaWRhdGVfaW5vZGUoZGVudHJ5KTsKKwlpZiAocmVzdWx0KQorCQlnb3RvIG91dDsKKworCisJcGFnZSA9IGdyYWJfY2FjaGVfcGFnZSgmZGlyLT5pX2RhdGEsIDApOworCWlmICghcGFnZSkKKwkJZ290byByZWFkX3JlYWxseTsKKworCWN0bC5jYWNoZSA9IGNhY2hlID0ga21hcChwYWdlKTsKKwljdGwuaGVhZCAgPSBjYWNoZS0+aGVhZDsKKworCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpIHx8ICFjdGwuaGVhZC5lb2YpIHsKKwkJVkVSQk9TRSgiJXMvJXMsIHBhZ2UgdXB0b2RhdGU9JWQsIGVvZj0lZFxuIiwKKwkJCSBERU5UUllfUEFUSChkZW50cnkpLCBQYWdlVXB0b2RhdGUocGFnZSksY3RsLmhlYWQuZW9mKTsKKwkJZ290byBpbml0X2NhY2hlOworCX0KKworCWlmIChmaWxwLT5mX3BvcyA9PSAyKSB7CisJCWlmIChqaWZmaWVzIC0gY3RsLmhlYWQudGltZSA+PSBTTUJfTUFYX0FHRShzZXJ2ZXIpKQorCQkJZ290byBpbml0X2NhY2hlOworCisJCS8qCisJCSAqIE4uQi4gbmNwZnMgY2hlY2tzIG10aW1lIG9mIGRlbnRyeSB0b28gaGVyZSwgd2UgZG9uJ3QuCisJCSAqICAgMS4gY29tbW9uIHNtYiBzZXJ2ZXJzIGRvIG5vdCB1cGRhdGUgbXRpbWUgb24gZGlyIGNoYW5nZXMKKwkJICogICAyLiBpdCByZXF1aXJlcyBhbiBleHRyYSBzbWIgcmVxdWVzdAorCQkgKiAgICAgIChyZXZhbGlkYXRlIGhhcyB0aGUgc2FtZSB0aW1lb3V0IGFzIGN0bC5oZWFkLnRpbWUpCisJCSAqCisJCSAqIEluc3RlYWQgc21iZnMgaW52YWxpZGF0ZXMgaXRzIG93biBjYWNoZSBvbiBsb2NhbCBjaGFuZ2VzCisJCSAqIGFuZCByZW1vdGUgY2hhbmdlcyBhcmUgbm90IHNlZW4gdW50aWwgdGltZW91dC4KKwkJICovCisJfQorCisJaWYgKGZpbHAtPmZfcG9zID4gY3RsLmhlYWQuZW5kKQorCQlnb3RvIGZpbmlzaGVkOworCisJY3RsLmZwb3MgPSBmaWxwLT5mX3BvcyArIChTTUJfRElSQ0FDSEVfU1RBUlQgLSAyKTsKKwljdGwub2ZzICA9IGN0bC5mcG9zIC8gU01CX0RJUkNBQ0hFX1NJWkU7CisJY3RsLmlkeCAgPSBjdGwuZnBvcyAlIFNNQl9ESVJDQUNIRV9TSVpFOworCisJZm9yICg7OykgeworCQlpZiAoY3RsLm9mcyAhPSAwKSB7CisJCQljdGwucGFnZSA9IGZpbmRfbG9ja19wYWdlKCZkaXItPmlfZGF0YSwgY3RsLm9mcyk7CisJCQlpZiAoIWN0bC5wYWdlKQorCQkJCWdvdG8gaW52YWxpZF9jYWNoZTsKKwkJCWN0bC5jYWNoZSA9IGttYXAoY3RsLnBhZ2UpOworCQkJaWYgKCFQYWdlVXB0b2RhdGUoY3RsLnBhZ2UpKQorCQkJCWdvdG8gaW52YWxpZF9jYWNoZTsKKwkJfQorCQl3aGlsZSAoY3RsLmlkeCA8IFNNQl9ESVJDQUNIRV9TSVpFKSB7CisJCQlzdHJ1Y3QgZGVudHJ5ICpkZW50OworCQkJaW50IHJlczsKKworCQkJZGVudCA9IHNtYl9kZ2V0X2Zwb3MoY3RsLmNhY2hlLT5kZW50cnlbY3RsLmlkeF0sCisJCQkJCSAgICAgZGVudHJ5LCBmaWxwLT5mX3Bvcyk7CisJCQlpZiAoIWRlbnQpCisJCQkJZ290byBpbnZhbGlkX2NhY2hlOworCisJCQlyZXMgPSBmaWxsZGlyKGRpcmVudCwgZGVudC0+ZF9uYW1lLm5hbWUsCisJCQkJICAgICAgZGVudC0+ZF9uYW1lLmxlbiwgZmlscC0+Zl9wb3MsCisJCQkJICAgICAgZGVudC0+ZF9pbm9kZS0+aV9pbm8sIERUX1VOS05PV04pOworCQkJZHB1dChkZW50KTsKKwkJCWlmIChyZXMpCisJCQkJZ290byBmaW5pc2hlZDsKKwkJCWZpbHAtPmZfcG9zICs9IDE7CisJCQljdGwuaWR4ICs9IDE7CisJCQlpZiAoZmlscC0+Zl9wb3MgPiBjdGwuaGVhZC5lbmQpCisJCQkJZ290byBmaW5pc2hlZDsKKwkJfQorCQlpZiAoY3RsLnBhZ2UpIHsKKwkJCWt1bm1hcChjdGwucGFnZSk7CisJCQlTZXRQYWdlVXB0b2RhdGUoY3RsLnBhZ2UpOworCQkJdW5sb2NrX3BhZ2UoY3RsLnBhZ2UpOworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKGN0bC5wYWdlKTsKKwkJCWN0bC5wYWdlID0gTlVMTDsKKwkJfQorCQljdGwuaWR4ICA9IDA7CisJCWN0bC5vZnMgKz0gMTsKKwl9CitpbnZhbGlkX2NhY2hlOgorCWlmIChjdGwucGFnZSkgeworCQlrdW5tYXAoY3RsLnBhZ2UpOworCQl1bmxvY2tfcGFnZShjdGwucGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShjdGwucGFnZSk7CisJCWN0bC5wYWdlID0gTlVMTDsKKwl9CisJY3RsLmNhY2hlID0gY2FjaGU7Citpbml0X2NhY2hlOgorCXNtYl9pbnZhbGlkYXRlX2RpcmNhY2hlX2VudHJpZXMoZGVudHJ5KTsKKwljdGwuaGVhZC50aW1lID0gamlmZmllczsKKwljdGwuaGVhZC5lb2YgPSAwOworCWN0bC5mcG9zID0gMjsKKwljdGwub2ZzID0gMDsKKwljdGwuaWR4ID0gU01CX0RJUkNBQ0hFX1NUQVJUOworCWN0bC5maWxsZWQgPSAwOworCWN0bC52YWxpZCAgPSAxOworcmVhZF9yZWFsbHk6CisJcmVzdWx0ID0gc2VydmVyLT5vcHMtPnJlYWRkaXIoZmlscCwgZGlyZW50LCBmaWxsZGlyLCAmY3RsKTsKKwlpZiAoY3RsLmlkeCA9PSAtMSkKKwkJZ290byBpbnZhbGlkX2NhY2hlOwkvKiByZXRyeSAqLworCWN0bC5oZWFkLmVuZCA9IGN0bC5mcG9zIC0gMTsKKwljdGwuaGVhZC5lb2YgPSBjdGwudmFsaWQ7CitmaW5pc2hlZDoKKwlpZiAocGFnZSkgeworCQljYWNoZS0+aGVhZCA9IGN0bC5oZWFkOworCQlrdW5tYXAocGFnZSk7CisJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwl9CisJaWYgKGN0bC5wYWdlKSB7CisJCWt1bm1hcChjdGwucGFnZSk7CisJCVNldFBhZ2VVcHRvZGF0ZShjdGwucGFnZSk7CisJCXVubG9ja19wYWdlKGN0bC5wYWdlKTsKKwkJcGFnZV9jYWNoZV9yZWxlYXNlKGN0bC5wYWdlKTsKKwl9CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQKK3NtYl9kaXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXI7CisJaW50IGVycm9yID0gMDsKKworCVZFUkJPU0UoIiglcy8lcylcbiIsIGRlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLAorCQlmaWxlLT5mX2RlbnRyeS0+ZF9uYW1lLm5hbWUpOworCisJLyoKKwkgKiBEaXJlY3RvcnkgdGltZXN0YW1wcyBpbiB0aGUgY29yZSBwcm90b2NvbCBhcmVuJ3QgdXBkYXRlZAorCSAqIHdoZW4gYSBmaWxlIGlzIGFkZGVkLCBzbyB3ZSBnaXZlIHRoZW0gYSB2ZXJ5IHNob3J0IFRUTC4KKwkgKi8KKwlsb2NrX2tlcm5lbCgpOworCXNlcnZlciA9IHNlcnZlcl9mcm9tX2RlbnRyeShkZW50cnkpOworCWlmIChzZXJ2ZXItPm9wdC5wcm90b2NvbCA8IFNNQl9QUk9UT0NPTF9MQU5NQU4yKSB7CisJCXVuc2lnbmVkIGxvbmcgYWdlID0gamlmZmllcyAtIFNNQl9JKGRpciktPm9sZG10aW1lOworCQlpZiAoYWdlID4gMipIWikKKwkJCXNtYl9pbnZhbGlkX2Rpcl9jYWNoZShkaXIpOworCX0KKworCS8qCisJICogTm90ZTogaW4gb3JkZXIgdG8gYWxsb3cgdGhlIHNtYm1vdW50IHByb2Nlc3MgdG8gb3BlbiB0aGUKKwkgKiBtb3VudCBwb2ludCwgd2Ugb25seSByZXZhbGlkYXRlIGlmIHRoZSBjb25uZWN0aW9uIGlzIHZhbGlkIG9yCisJICogaWYgdGhlIHByb2Nlc3MgaXMgdHJ5aW5nIHRvIGFjY2VzcyBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgcm9vdC4KKwkgKi8KKwlpZiAoc2VydmVyLT5zdGF0ZSA9PSBDT05OX1ZBTElEIHx8ICFJU19ST09UKGRlbnRyeSkpCisJCWVycm9yID0gc21iX3JldmFsaWRhdGVfaW5vZGUoZGVudHJ5KTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogRGVudHJ5IG9wZXJhdGlvbnMgcm91dGluZXMKKyAqLworc3RhdGljIGludCBzbWJfbG9va3VwX3ZhbGlkYXRlKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IG5hbWVpZGF0YSAqKTsKK3N0YXRpYyBpbnQgc21iX2hhc2hfZGVudHJ5KHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IHFzdHIgKik7CitzdGF0aWMgaW50IHNtYl9jb21wYXJlX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICosIHN0cnVjdCBxc3RyICosIHN0cnVjdCBxc3RyICopOworc3RhdGljIGludCBzbWJfZGVsZXRlX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICopOworCitzdGF0aWMgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIHNtYmZzX2RlbnRyeV9vcGVyYXRpb25zID0KK3sKKwkuZF9yZXZhbGlkYXRlCT0gc21iX2xvb2t1cF92YWxpZGF0ZSwKKwkuZF9oYXNoCQk9IHNtYl9oYXNoX2RlbnRyeSwKKwkuZF9jb21wYXJlCT0gc21iX2NvbXBhcmVfZGVudHJ5LAorCS5kX2RlbGV0ZQk9IHNtYl9kZWxldGVfZGVudHJ5LAorfTsKKworc3RhdGljIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBzbWJmc19kZW50cnlfb3BlcmF0aW9uc19jYXNlID0KK3sKKwkuZF9yZXZhbGlkYXRlCT0gc21iX2xvb2t1cF92YWxpZGF0ZSwKKwkuZF9kZWxldGUJPSBzbWJfZGVsZXRlX2RlbnRyeSwKK307CisKKworLyoKKyAqIFRoaXMgaXMgdGhlIGNhbGxiYWNrIHdoZW4gdGhlIGRjYWNoZSBoYXMgYSBsb29rdXAgaGl0LgorICovCitzdGF0aWMgaW50CitzbWJfbG9va3VwX3ZhbGlkYXRlKHN0cnVjdCBkZW50cnkgKiBkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyID0gc2VydmVyX2Zyb21fZGVudHJ5KGRlbnRyeSk7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJdW5zaWduZWQgbG9uZyBhZ2UgPSBqaWZmaWVzIC0gZGVudHJ5LT5kX3RpbWU7CisJaW50IHZhbGlkOworCisJLyoKKwkgKiBUaGUgZGVmYXVsdCB2YWxpZGF0aW9uIGlzIGJhc2VkIG9uIGRlbnRyeSBhZ2U6CisJICogd2UgYmVsaWV2ZSBpbiBkZW50cmllcyBmb3IgYSBmZXcgc2Vjb25kcy4gIChCdXQgZWFjaAorCSAqIHN1Y2Nlc3NmdWwgc2VydmVyIGxvb2t1cCByZW5ld3MgdGhlIHRpbWVzdGFtcC4pCisJICovCisJdmFsaWQgPSAoYWdlIDw9IFNNQl9NQVhfQUdFKHNlcnZlcikpOworI2lmZGVmIFNNQkZTX0RFQlVHX1ZFUkJPU0UKKwlpZiAoIXZhbGlkKQorCQlWRVJCT1NFKCIlcy8lcyBub3QgdmFsaWQsIGFnZT0lbHVcbiIsIAorCQkJREVOVFJZX1BBVEgoZGVudHJ5KSwgYWdlKTsKKyNlbmRpZgorCisJaWYgKGlub2RlKSB7CisJCWxvY2tfa2VybmVsKCk7CisJCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpKSB7CisJCQlQQVJBTk9JQSgiJXMvJXMgaGFzIGR1ZCBpbm9kZVxuIiwgREVOVFJZX1BBVEgoZGVudHJ5KSk7CisJCQl2YWxpZCA9IDA7CisJCX0gZWxzZSBpZiAoIXZhbGlkKQorCQkJdmFsaWQgPSAoc21iX3JldmFsaWRhdGVfaW5vZGUoZGVudHJ5KSA9PSAwKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFdoYXQgc2hvdWxkIHdlIGRvIGZvciBuZWdhdGl2ZSBkZW50cmllcz8KKwkJICovCisJfQorCXJldHVybiB2YWxpZDsKK30KKworc3RhdGljIGludCAKK3NtYl9oYXNoX2RlbnRyeShzdHJ1Y3QgZGVudHJ5ICpkaXIsIHN0cnVjdCBxc3RyICp0aGlzKQoreworCXVuc2lnbmVkIGxvbmcgaGFzaDsKKwlpbnQgaTsKKworCWhhc2ggPSBpbml0X25hbWVfaGFzaCgpOworCWZvciAoaT0wOyBpIDwgdGhpcy0+bGVuIDsgaSsrKQorCQloYXNoID0gcGFydGlhbF9uYW1lX2hhc2godG9sb3dlcih0aGlzLT5uYW1lW2ldKSwgaGFzaCk7CisJdGhpcy0+aGFzaCA9IGVuZF9uYW1lX2hhc2goaGFzaCk7CisgIAorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzbWJfY29tcGFyZV9kZW50cnkoc3RydWN0IGRlbnRyeSAqZGlyLCBzdHJ1Y3QgcXN0ciAqYSwgc3RydWN0IHFzdHIgKmIpCit7CisJaW50IGksIHJlc3VsdCA9IDE7CisKKwlpZiAoYS0+bGVuICE9IGItPmxlbikKKwkJZ290byBvdXQ7CisJZm9yIChpPTA7IGkgPCBhLT5sZW47IGkrKykgeworCQlpZiAodG9sb3dlcihhLT5uYW1lW2ldKSAhPSB0b2xvd2VyKGItPm5hbWVbaV0pKQorCQkJZ290byBvdXQ7CisJfQorCXJlc3VsdCA9IDA7CitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIGNhbGxiYWNrIGZyb20gZHB1dCgpIHdoZW4gZF9jb3VudCBpcyBnb2luZyB0byAwLgorICogV2UgdXNlIHRoaXMgdG8gdW5oYXNoIGRlbnRyaWVzIHdpdGggYmFkIGlub2Rlcy4KKyAqLworc3RhdGljIGludAorc21iX2RlbGV0ZV9kZW50cnkoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSkKK3sKKwlpZiAoZGVudHJ5LT5kX2lub2RlKSB7CisJCWlmIChpc19iYWRfaW5vZGUoZGVudHJ5LT5kX2lub2RlKSkgeworCQkJUEFSQU5PSUEoImJhZCBpbm9kZSwgdW5oYXNoaW5nICVzLyVzXG4iLAorCQkJCSBERU5UUllfUEFUSChkZW50cnkpKTsKKwkJCXJldHVybiAxOworCQl9CisJfSBlbHNlIHsKKwkJLyogTi5CLiBVbmhhc2ggbmVnYXRpdmUgZGVudHJpZXM/ICovCisJfQorCXJldHVybiAwOworfQorCisvKgorICogSW5pdGlhbGl6ZSBhIG5ldyBkZW50cnkKKyAqLwordm9pZAorc21iX25ld19kZW50cnkoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyID0gc2VydmVyX2Zyb21fZGVudHJ5KGRlbnRyeSk7CisKKwlpZiAoc2VydmVyLT5tbnQtPmZsYWdzICYgU01CX01PVU5UX0NBU0UpCisJCWRlbnRyeS0+ZF9vcCA9ICZzbWJmc19kZW50cnlfb3BlcmF0aW9uc19jYXNlOworCWVsc2UKKwkJZGVudHJ5LT5kX29wID0gJnNtYmZzX2RlbnRyeV9vcGVyYXRpb25zOworCWRlbnRyeS0+ZF90aW1lID0gamlmZmllczsKK30KKworCisvKgorICogV2hlbmV2ZXIgYSBsb29rdXAgc3VjY2VlZHMsIHdlIGtub3cgdGhlIHBhcmVudCBkaXJlY3RvcmllcworICogYXJlIGFsbCB2YWxpZCwgc28gd2Ugd2FudCB0byB1cGRhdGUgdGhlIGRlbnRyeSB0aW1lc3RhbXBzLgorICogTi5CLiBNb3ZlIHRoaXMgdG8gZGNhY2hlPworICovCit2b2lkCitzbWJfcmVuZXdfdGltZXMoc3RydWN0IGRlbnRyeSAqIGRlbnRyeSkKK3sKKwlkZ2V0KGRlbnRyeSk7CisJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7CisJZm9yICg7OykgeworCQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQ7CisKKwkJZGVudHJ5LT5kX3RpbWUgPSBqaWZmaWVzOworCQlpZiAoSVNfUk9PVChkZW50cnkpKQorCQkJYnJlYWs7CisJCXBhcmVudCA9IGRlbnRyeS0+ZF9wYXJlbnQ7CisJCWRnZXQocGFyZW50KTsKKwkJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwkJZHB1dChkZW50cnkpOworCQlkZW50cnkgPSBwYXJlbnQ7CisJCXNwaW5fbG9jaygmZGVudHJ5LT5kX2xvY2spOworCX0KKwlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCWRwdXQoZGVudHJ5KTsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKgorc21iX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3Qgc21iX2ZhdHRyIGZpbmZvOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IGVycm9yOworCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyOworCisJZXJyb3IgPSAtRU5BTUVUT09MT05HOworCWlmIChkZW50cnktPmRfbmFtZS5sZW4gPiBTTUJfTUFYTkFNRUxFTikKKwkJZ290byBvdXQ7CisKKwlsb2NrX2tlcm5lbCgpOworCWVycm9yID0gc21iX3Byb2NfZ2V0YXR0cihkZW50cnksICZmaW5mbyk7CisjaWZkZWYgU01CRlNfUEFSQU5PSUEKKwlpZiAoZXJyb3IgJiYgZXJyb3IgIT0gLUVOT0VOVCkKKwkJUEFSQU5PSUEoImZpbmQgJXMvJXMgZmFpbGVkLCBlcnJvcj0lZFxuIiwKKwkJCSBERU5UUllfUEFUSChkZW50cnkpLCBlcnJvcik7CisjZW5kaWYKKworCWlub2RlID0gTlVMTDsKKwlpZiAoZXJyb3IgPT0gLUVOT0VOVCkKKwkJZ290byBhZGRfZW50cnk7CisJaWYgKCFlcnJvcikgeworCQllcnJvciA9IC1FQUNDRVM7CisJCWZpbmZvLmZfaW5vID0gaXVuaXF1ZShkZW50cnktPmRfc2IsIDIpOworCQlpbm9kZSA9IHNtYl9pZ2V0KGRpci0+aV9zYiwgJmZpbmZvKTsKKwkJaWYgKGlub2RlKSB7CisJYWRkX2VudHJ5OgorCQkJc2VydmVyID0gc2VydmVyX2Zyb21fZGVudHJ5KGRlbnRyeSk7CisJCQlpZiAoc2VydmVyLT5tbnQtPmZsYWdzICYgU01CX01PVU5UX0NBU0UpCisJCQkJZGVudHJ5LT5kX29wID0gJnNtYmZzX2RlbnRyeV9vcGVyYXRpb25zX2Nhc2U7CisJCQllbHNlCisJCQkJZGVudHJ5LT5kX29wID0gJnNtYmZzX2RlbnRyeV9vcGVyYXRpb25zOworCisJCQlkX2FkZChkZW50cnksIGlub2RlKTsKKwkJCXNtYl9yZW5ld190aW1lcyhkZW50cnkpOworCQkJZXJyb3IgPSAwOworCQl9CisJfQorCXVubG9ja19rZXJuZWwoKTsKK291dDoKKwlyZXR1cm4gRVJSX1BUUihlcnJvcik7Cit9CisKKy8qCisgKiBUaGlzIGNvZGUgaXMgY29tbW9uIHRvIGFsbCByb3V0aW5lcyBjcmVhdGluZyBhIG5ldyBpbm9kZS4KKyAqLworc3RhdGljIGludAorc21iX2luc3RhbnRpYXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgX191MTYgZmlsZWlkLCBpbnQgaGF2ZV9pZCkKK3sKKwlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciA9IHNlcnZlcl9mcm9tX2RlbnRyeShkZW50cnkpOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IGVycm9yOworCXN0cnVjdCBzbWJfZmF0dHIgZmF0dHI7CisKKwlWRVJCT1NFKCJmaWxlICVzLyVzLCBmaWxlaWQ9JXVcbiIsIERFTlRSWV9QQVRIKGRlbnRyeSksIGZpbGVpZCk7CisKKwllcnJvciA9IHNtYl9wcm9jX2dldGF0dHIoZGVudHJ5LCAmZmF0dHIpOworCWlmIChlcnJvcikKKwkJZ290byBvdXRfY2xvc2U7CisKKwlzbWJfcmVuZXdfdGltZXMoZGVudHJ5KTsKKwlmYXR0ci5mX2lubyA9IGl1bmlxdWUoZGVudHJ5LT5kX3NiLCAyKTsKKwlpbm9kZSA9IHNtYl9pZ2V0KGRlbnRyeS0+ZF9zYiwgJmZhdHRyKTsKKwlpZiAoIWlub2RlKQorCQlnb3RvIG91dF9ub19pbm9kZTsKKworCWlmIChoYXZlX2lkKSB7CisJCXN0cnVjdCBzbWJfaW5vZGVfaW5mbyAqZWkgPSBTTUJfSShpbm9kZSk7CisJCWVpLT5maWxlaWQgPSBmaWxlaWQ7CisJCWVpLT5hY2Nlc3MgPSBTTUJfT19SRFdSOworCQllaS0+b3BlbiA9IHNlcnZlci0+Z2VuZXJhdGlvbjsKKwl9CisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKK291dDoKKwlyZXR1cm4gZXJyb3I7CisKK291dF9ub19pbm9kZToKKwllcnJvciA9IC1FQUNDRVM7CitvdXRfY2xvc2U6CisJaWYgKGhhdmVfaWQpIHsKKwkJUEFSQU5PSUEoIiVzLyVzIGZhaWxlZCwgZXJyb3I9JWQsIGNsb3NpbmcgJXVcbiIsCisJCQkgREVOVFJZX1BBVEgoZGVudHJ5KSwgZXJyb3IsIGZpbGVpZCk7CisJCXNtYl9jbG9zZV9maWxlaWQoZGVudHJ5LCBmaWxlaWQpOworCX0KKwlnb3RvIG91dDsKK30KKworLyogTi5CLiBIb3cgc2hvdWxkIHRoZSBtb2RlIGFyZ3VtZW50IGJlIHVzZWQ/ICovCitzdGF0aWMgaW50CitzbWJfY3JlYXRlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLAorCQlzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciA9IHNlcnZlcl9mcm9tX2RlbnRyeShkZW50cnkpOworCV9fdTE2IGZpbGVpZDsKKwlpbnQgZXJyb3I7CisJc3RydWN0IGlhdHRyIGF0dHI7CisKKwlWRVJCT1NFKCJjcmVhdGluZyAlcy8lcywgbW9kZT0lZFxuIiwgREVOVFJZX1BBVEgoZGVudHJ5KSwgbW9kZSk7CisKKwlsb2NrX2tlcm5lbCgpOworCXNtYl9pbnZhbGlkX2Rpcl9jYWNoZShkaXIpOworCWVycm9yID0gc21iX3Byb2NfY3JlYXRlKGRlbnRyeSwgMCwgZ2V0X3NlY29uZHMoKSwgJmZpbGVpZCk7CisJaWYgKCFlcnJvcikgeworCQlpZiAoc2VydmVyLT5vcHQuY2FwYWJpbGl0aWVzICYgU01CX0NBUF9VTklYKSB7CisJCQkvKiBTZXQgYXR0cmlidXRlcyBmb3IgbmV3IGZpbGUgKi8KKwkJCWF0dHIuaWFfdmFsaWQgPSBBVFRSX01PREU7CisJCQlhdHRyLmlhX21vZGUgPSBtb2RlOworCQkJZXJyb3IgPSBzbWJfcHJvY19zZXRhdHRyX3VuaXgoZGVudHJ5LCAmYXR0ciwgMCwgMCk7CisJCX0KKwkJZXJyb3IgPSBzbWJfaW5zdGFudGlhdGUoZGVudHJ5LCBmaWxlaWQsIDEpOworCX0gZWxzZSB7CisJCVBBUkFOT0lBKCIlcy8lcyBmYWlsZWQsIGVycm9yPSVkXG4iLAorCQkJIERFTlRSWV9QQVRIKGRlbnRyeSksIGVycm9yKTsKKwl9CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnJvcjsKK30KKworLyogTi5CLiBIb3cgc2hvdWxkIHRoZSBtb2RlIGFyZ3VtZW50IGJlIHVzZWQ/ICovCitzdGF0aWMgaW50CitzbWJfbWtkaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpCit7CisJc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIgPSBzZXJ2ZXJfZnJvbV9kZW50cnkoZGVudHJ5KTsKKwlpbnQgZXJyb3I7CisJc3RydWN0IGlhdHRyIGF0dHI7CisKKwlsb2NrX2tlcm5lbCgpOworCXNtYl9pbnZhbGlkX2Rpcl9jYWNoZShkaXIpOworCWVycm9yID0gc21iX3Byb2NfbWtkaXIoZGVudHJ5KTsKKwlpZiAoIWVycm9yKSB7CisJCWlmIChzZXJ2ZXItPm9wdC5jYXBhYmlsaXRpZXMgJiBTTUJfQ0FQX1VOSVgpIHsKKwkJCS8qIFNldCBhdHRyaWJ1dGVzIGZvciBuZXcgZGlyZWN0b3J5ICovCisJCQlhdHRyLmlhX3ZhbGlkID0gQVRUUl9NT0RFOworCQkJYXR0ci5pYV9tb2RlID0gbW9kZTsKKwkJCWVycm9yID0gc21iX3Byb2Nfc2V0YXR0cl91bml4KGRlbnRyeSwgJmF0dHIsIDAsIDApOworCQl9CisJCWVycm9yID0gc21iX2luc3RhbnRpYXRlKGRlbnRyeSwgMCwgMCk7CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQKK3NtYl9ybWRpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IGVycm9yOworCisJLyoKKwkgKiBDbG9zZSB0aGUgZGlyZWN0b3J5IGlmIGl0J3Mgb3Blbi4KKwkgKi8KKwlsb2NrX2tlcm5lbCgpOworCXNtYl9jbG9zZShpbm9kZSk7CisKKwkvKgorCSAqIENoZWNrIHRoYXQgbm9ib2R5IGVsc2UgaXMgdXNpbmcgdGhlIGRpcmVjdG9yeS4uCisJICovCisJZXJyb3IgPSAtRUJVU1k7CisJaWYgKCFkX3VuaGFzaGVkKGRlbnRyeSkpCisJCWdvdG8gb3V0OworCisJc21iX2ludmFsaWRfZGlyX2NhY2hlKGRpcik7CisJZXJyb3IgPSBzbWJfcHJvY19ybWRpcihkZW50cnkpOworCitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludAorc21iX3VubGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWludCBlcnJvcjsKKworCS8qCisJICogQ2xvc2UgdGhlIGZpbGUgaWYgaXQncyBvcGVuLgorCSAqLworCWxvY2tfa2VybmVsKCk7CisJc21iX2Nsb3NlKGRlbnRyeS0+ZF9pbm9kZSk7CisKKwlzbWJfaW52YWxpZF9kaXJfY2FjaGUoZGlyKTsKKwllcnJvciA9IHNtYl9wcm9jX3VubGluayhkZW50cnkpOworCWlmICghZXJyb3IpCisJCXNtYl9yZW5ld190aW1lcyhkZW50cnkpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQKK3NtYl9yZW5hbWUoc3RydWN0IGlub2RlICpvbGRfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAorCSAgIHN0cnVjdCBpbm9kZSAqbmV3X2Rpciwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSkKK3sKKwlpbnQgZXJyb3I7CisKKwkvKgorCSAqIENsb3NlIGFueSBvcGVuIGZpbGVzLCBhbmQgY2hlY2sgd2hldGhlciB0byBkZWxldGUgdGhlCisJICogdGFyZ2V0IGJlZm9yZSBhdHRlbXB0aW5nIHRoZSByZW5hbWUuCisJICovCisJbG9ja19rZXJuZWwoKTsKKwlpZiAob2xkX2RlbnRyeS0+ZF9pbm9kZSkKKwkJc21iX2Nsb3NlKG9sZF9kZW50cnktPmRfaW5vZGUpOworCWlmIChuZXdfZGVudHJ5LT5kX2lub2RlKSB7CisJCXNtYl9jbG9zZShuZXdfZGVudHJ5LT5kX2lub2RlKTsKKwkJZXJyb3IgPSBzbWJfcHJvY191bmxpbmsobmV3X2RlbnRyeSk7CisJCWlmIChlcnJvcikgeworCQkJVkVSQk9TRSgidW5saW5rICVzLyVzLCBlcnJvcj0lZFxuIiwKKwkJCQlERU5UUllfUEFUSChuZXdfZGVudHJ5KSwgZXJyb3IpOworCQkJZ290byBvdXQ7CisJCX0KKwkJLyogRklYTUUgKi8KKwkJZF9kZWxldGUobmV3X2RlbnRyeSk7CisJfQorCisJc21iX2ludmFsaWRfZGlyX2NhY2hlKG9sZF9kaXIpOworCXNtYl9pbnZhbGlkX2Rpcl9jYWNoZShuZXdfZGlyKTsKKwllcnJvciA9IHNtYl9wcm9jX212KG9sZF9kZW50cnksIG5ld19kZW50cnkpOworCWlmICghZXJyb3IpIHsKKwkJc21iX3JlbmV3X3RpbWVzKG9sZF9kZW50cnkpOworCQlzbWJfcmVuZXdfdGltZXMobmV3X2RlbnRyeSk7CisJfQorb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBGSVhNRTogc2FtYmEgc2VydmVycyB3b24ndCBsZXQgeW91IGNyZWF0ZSBkZXZpY2Ugbm9kZXMgdW5sZXNzIHVpZC9naWQKKyAqIG1hdGNoZXMgdGhlIGNvbm5lY3Rpb24gY3JlZGVudGlhbHMgKGFuZCB3ZSBkb24ndCBrbm93IHdoaWNoIHRob3NlIGFyZSAuLi4pCisgKi8KK3N0YXRpYyBpbnQKK3NtYl9tYWtlX25vZGUoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUsIGRldl90IGRldikKK3sKKwlpbnQgZXJyb3I7CisJc3RydWN0IGlhdHRyIGF0dHI7CisKKwlhdHRyLmlhX3ZhbGlkID0gQVRUUl9NT0RFIHwgQVRUUl9VSUQgfCBBVFRSX0dJRDsKKwlhdHRyLmlhX21vZGUgPSBtb2RlOworCWF0dHIuaWFfdWlkID0gY3VycmVudC0+ZXVpZDsKKwlhdHRyLmlhX2dpZCA9IGN1cnJlbnQtPmVnaWQ7CisKKwlpZiAoIW5ld192YWxpZF9kZXYoZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzbWJfaW52YWxpZF9kaXJfY2FjaGUoZGlyKTsKKwllcnJvciA9IHNtYl9wcm9jX3NldGF0dHJfdW5peChkZW50cnksICZhdHRyLCBNQUpPUihkZXYpLCBNSU5PUihkZXYpKTsKKwlpZiAoIWVycm9yKSB7CisJCWVycm9yID0gc21iX2luc3RhbnRpYXRlKGRlbnRyeSwgMCwgMCk7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIGRlbnRyeSA9IGV4aXN0aW5nIGZpbGUKKyAqIG5ld19kZW50cnkgPSBuZXcgZmlsZQorICovCitzdGF0aWMgaW50CitzbWJfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQoreworCWludCBlcnJvcjsKKworCURFQlVHMSgic21iX2xpbmsgb2xkPSVzLyVzIG5ldz0lcy8lc1xuIiwKKwkgICAgICAgREVOVFJZX1BBVEgoZGVudHJ5KSwgREVOVFJZX1BBVEgobmV3X2RlbnRyeSkpOworCXNtYl9pbnZhbGlkX2Rpcl9jYWNoZShkaXIpOworCWVycm9yID0gc21iX3Byb2NfbGluayhzZXJ2ZXJfZnJvbV9kZW50cnkoZGVudHJ5KSwgZGVudHJ5LCBuZXdfZGVudHJ5KTsKKwlpZiAoIWVycm9yKSB7CisJCXNtYl9yZW5ld190aW1lcyhkZW50cnkpOworCQllcnJvciA9IHNtYl9pbnN0YW50aWF0ZShuZXdfZGVudHJ5LCAwLCAwKTsKKwl9CisJcmV0dXJuIGVycm9yOworfQpkaWZmIC0tZ2l0IGEvZnMvc21iZnMvZmlsZS5jIGIvZnMvc21iZnMvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZmNmYTgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9zbWJmcy9maWxlLmMKQEAgLTAsMCArMSw0MjMgQEAKKy8qCisgKiAgZmlsZS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiwgMTk5NyBieSBQYWFsLUtyLiBFbmdzdGFkIGFuZCBWb2xrZXIgTGVuZGVja2UKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTcgYnkgVm9sa2VyIExlbmRlY2tlCisgKgorICogIFBsZWFzZSBhZGQgYSBub3RlIGFib3V0IHlvdXIgY2hhbmdlcyB0byBzbWJmcyBpbiB0aGUgQ2hhbmdlTG9nIGZpbGUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbWJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NtYl9mcy5oPgorCisjaW5jbHVkZSAic21iX2RlYnVnLmgiCisjaW5jbHVkZSAicHJvdG8uaCIKKworc3RhdGljIGludAorc21iX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBpbnQgZGF0YXN5bmMpCit7CisJc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIgPSBzZXJ2ZXJfZnJvbV9kZW50cnkoZGVudHJ5KTsKKwlpbnQgcmVzdWx0OworCisJVkVSQk9TRSgic3luYyBmaWxlICVzLyVzXG4iLCBERU5UUllfUEFUSChkZW50cnkpKTsKKworCS8qCisJICogVGhlIFZGUyB3aWxsIHdyaXRlcGFnZSgpIGFsbCBkaXJ0eSBwYWdlcyBmb3IgdXMsIGJ1dCB3ZQorCSAqIHNob3VsZCBzZW5kIGEgU01CZmx1c2ggdG8gdGhlIHNlcnZlciwgbGV0dGluZyBpdCBrbm93IHRoYXQKKwkgKiB3ZSB3YW50IHRoaW5ncyBzeW5jaHJvbml6ZWQgd2l0aCBhY3R1YWwgc3RvcmFnZS4KKwkgKgorCSAqIE5vdGU6IHRoaXMgZnVuY3Rpb24gcmVxdWlyZXMgYWxsIHBhZ2VzIHRvIGhhdmUgYmVlbiB3cml0dGVuIGFscmVhZHkKKwkgKiAgICAgICAoc2hvdWxkIGJlIG9rIHdpdGggd3JpdGVwYWdlX3N5bmMpCisJICovCisJcmVzdWx0ID0gc21iX3Byb2NfZmx1c2goc2VydmVyLCBTTUJfSShkZW50cnktPmRfaW5vZGUpLT5maWxlaWQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBSZWFkIGEgcGFnZSBzeW5jaHJvbm91c2x5LgorICovCitzdGF0aWMgaW50CitzbWJfcmVhZHBhZ2Vfc3luYyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBwYWdlICpwYWdlKQoreworCWNoYXIgKmJ1ZmZlciA9IGttYXAocGFnZSk7CisJbG9mZl90IG9mZnNldCA9IChsb2ZmX3QpcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVDsKKwlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciA9IHNlcnZlcl9mcm9tX2RlbnRyeShkZW50cnkpOworCXVuc2lnbmVkIGludCByc2l6ZSA9IHNtYl9nZXRfcnNpemUoc2VydmVyKTsKKwlpbnQgY291bnQgPSBQQUdFX1NJWkU7CisJaW50IHJlc3VsdDsKKworCVZFUkJPU0UoImZpbGUgJXMvJXMsIGNvdW50PSVkQCVMZCwgcnNpemU9JWRcbiIsCisJCURFTlRSWV9QQVRIKGRlbnRyeSksIGNvdW50LCBvZmZzZXQsIHJzaXplKTsKKworCXJlc3VsdCA9IHNtYl9vcGVuKGRlbnRyeSwgU01CX09fUkRPTkxZKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBpb19lcnJvcjsKKworCWRvIHsKKwkJaWYgKGNvdW50IDwgcnNpemUpCisJCQlyc2l6ZSA9IGNvdW50OworCisJCXJlc3VsdCA9IHNlcnZlci0+b3BzLT5yZWFkKGRlbnRyeS0+ZF9pbm9kZSxvZmZzZXQscnNpemUsYnVmZmVyKTsKKwkJaWYgKHJlc3VsdCA8IDApCisJCQlnb3RvIGlvX2Vycm9yOworCisJCWNvdW50IC09IHJlc3VsdDsKKwkJb2Zmc2V0ICs9IHJlc3VsdDsKKwkJYnVmZmVyICs9IHJlc3VsdDsKKwkJZGVudHJ5LT5kX2lub2RlLT5pX2F0aW1lID0KKwkJCWN1cnJlbnRfZnNfdGltZShkZW50cnktPmRfaW5vZGUtPmlfc2IpOworCQlpZiAocmVzdWx0IDwgcnNpemUpCisJCQlicmVhazsKKwl9IHdoaWxlIChjb3VudCk7CisKKwltZW1zZXQoYnVmZmVyLCAwLCBjb3VudCk7CisJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCXJlc3VsdCA9IDA7CisKK2lvX2Vycm9yOgorCWt1bm1hcChwYWdlKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogV2UgYXJlIGNhbGxlZCB3aXRoIHRoZSBwYWdlIGxvY2tlZCBhbmQgd2UgdW5sb2NrIGl0IHdoZW4gZG9uZS4KKyAqLworc3RhdGljIGludAorc21iX3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlpbnQJCWVycm9yOworCXN0cnVjdCBkZW50cnkgICpkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKworCXBhZ2VfY2FjaGVfZ2V0KHBhZ2UpOworCWVycm9yID0gc21iX3JlYWRwYWdlX3N5bmMoZGVudHJ5LCBwYWdlKTsKKwlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogV3JpdGUgYSBwYWdlIHN5bmNocm9ub3VzbHkuCisgKiBPZmZzZXQgaXMgdGhlIGRhdGEgb2Zmc2V0IHdpdGhpbiB0aGUgcGFnZS4KKyAqLworc3RhdGljIGludAorc21iX3dyaXRlcGFnZV9zeW5jKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkgICB1bnNpZ25lZCBsb25nIHBhZ2VvZmZzZXQsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwlsb2ZmX3Qgb2Zmc2V0OworCWNoYXIgKmJ1ZmZlciA9IGttYXAocGFnZSkgKyBwYWdlb2Zmc2V0OworCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyID0gc2VydmVyX2Zyb21faW5vZGUoaW5vZGUpOworCXVuc2lnbmVkIGludCB3c2l6ZSA9IHNtYl9nZXRfd3NpemUoc2VydmVyKTsKKwlpbnQgcmV0ID0gMDsKKworCW9mZnNldCA9ICgobG9mZl90KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpICsgcGFnZW9mZnNldDsKKwlWRVJCT1NFKCJmaWxlIGlubz0lbGQsIGZpbGVpZD0lZCwgY291bnQ9JWRAJUxkLCB3c2l6ZT0lZFxuIiwKKwkJaW5vZGUtPmlfaW5vLCBTTUJfSShpbm9kZSktPmZpbGVpZCwgY291bnQsIG9mZnNldCwgd3NpemUpOworCisJZG8geworCQlpbnQgd3JpdGVfcmV0OworCisJCWlmIChjb3VudCA8IHdzaXplKQorCQkJd3NpemUgPSBjb3VudDsKKworCQl3cml0ZV9yZXQgPSBzZXJ2ZXItPm9wcy0+d3JpdGUoaW5vZGUsIG9mZnNldCwgd3NpemUsIGJ1ZmZlcik7CisJCWlmICh3cml0ZV9yZXQgPCAwKSB7CisJCQlQQVJBTk9JQSgiZmFpbGVkIHdyaXRlLCB3c2l6ZT0lZCwgd3JpdGVfcmV0PSVkXG4iLAorCQkJCSB3c2l6ZSwgd3JpdGVfcmV0KTsKKwkJCXJldCA9IHdyaXRlX3JldDsKKwkJCWJyZWFrOworCQl9CisJCS8qIE4uQi4gd2hhdCBpZiByZXN1bHQgPCB3c2l6ZT8/ICovCisjaWZkZWYgU01CRlNfUEFSQU5PSUEKKwkJaWYgKHdyaXRlX3JldCA8IHdzaXplKQorCQkJUEFSQU5PSUEoInNob3J0IHdyaXRlLCB3c2l6ZT0lZCwgd3JpdGVfcmV0PSVkXG4iLAorCQkJCSB3c2l6ZSwgd3JpdGVfcmV0KTsKKyNlbmRpZgorCQlidWZmZXIgKz0gd3NpemU7CisJCW9mZnNldCArPSB3c2l6ZTsKKwkJY291bnQgLT0gd3NpemU7CisJCS8qCisJCSAqIFVwZGF0ZSB0aGUgaW5vZGUgbm93IHJhdGhlciB0aGFuIHdhaXRpbmcgZm9yIGEgcmVmcmVzaC4KKwkJICovCisJCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBjdXJyZW50X2ZzX3RpbWUoaW5vZGUtPmlfc2IpOworCQlTTUJfSShpbm9kZSktPmZsYWdzIHw9IFNNQl9GX0xPQ0FMV1JJVEU7CisJCWlmIChvZmZzZXQgPiBpbm9kZS0+aV9zaXplKQorCQkJaW5vZGUtPmlfc2l6ZSA9IG9mZnNldDsKKwl9IHdoaWxlIChjb3VudCk7CisKKwlrdW5tYXAocGFnZSk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFdyaXRlIGEgcGFnZSB0byB0aGUgc2VydmVyLiBUaGlzIHdpbGwgYmUgdXNlZCBmb3IgTkZTIHN3YXBwaW5nIG9ubHkKKyAqIChmb3Igbm93KSwgYW5kIHdlIGN1cnJlbnRseSBkbyB0aGlzIHN5bmNocm9ub3VzbHkgb25seS4KKyAqCisgKiBXZSBhcmUgY2FsbGVkIHdpdGggdGhlIHBhZ2UgbG9ja2VkIGFuZCB3ZSB1bmxvY2sgaXQgd2hlbiBkb25lLgorICovCitzdGF0aWMgaW50CitzbWJfd3JpdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IHBhZ2UtPm1hcHBpbmc7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwl1bnNpZ25lZCBsb25nIGVuZF9pbmRleDsKKwl1bnNpZ25lZCBvZmZzZXQgPSBQQUdFX0NBQ0hFX1NJWkU7CisJaW50IGVycjsKKworCWlmICghbWFwcGluZykKKwkJQlVHKCk7CisJaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCWlmICghaW5vZGUpCisJCUJVRygpOworCisJZW5kX2luZGV4ID0gaW5vZGUtPmlfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCisJLyogZWFzeSBjYXNlICovCisJaWYgKHBhZ2UtPmluZGV4IDwgZW5kX2luZGV4KQorCQlnb3RvIGRvX2l0OworCS8qIHRoaW5ncyBnb3QgY29tcGxpY2F0ZWQuLi4gKi8KKwlvZmZzZXQgPSBpbm9kZS0+aV9zaXplICYgKFBBR0VfQ0FDSEVfU0laRS0xKTsKKwkvKiBPSywgYXJlIHdlIGNvbXBsZXRlbHkgb3V0PyAqLworCWlmIChwYWdlLT5pbmRleCA+PSBlbmRfaW5kZXgrMSB8fCAhb2Zmc2V0KQorCQlyZXR1cm4gMDsgLyogdHJ1bmNhdGVkIC0gZG9uJ3QgY2FyZSAqLworZG9faXQ6CisJcGFnZV9jYWNoZV9nZXQocGFnZSk7CisJZXJyID0gc21iX3dyaXRlcGFnZV9zeW5jKGlub2RlLCBwYWdlLCAwLCBvZmZzZXQpOworCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludAorc21iX3VwZGF0ZXBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkgICAgICAgdW5zaWduZWQgaW50IGNvdW50KQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCisJREVCVUcxKCIoJXMvJXMgJWRAJWxkKVxuIiwgREVOVFJZX1BBVEgoZGVudHJ5KSwgCisJICAgICAgIGNvdW50LCAocGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVCkrb2Zmc2V0KTsKKworCXJldHVybiBzbWJfd3JpdGVwYWdlX3N5bmMoZGVudHJ5LT5kX2lub2RlLCBwYWdlLCBvZmZzZXQsIGNvdW50KTsKK30KKworc3RhdGljIHNzaXplX3QKK3NtYl9maWxlX3JlYWQoc3RydWN0IGZpbGUgKiBmaWxlLCBjaGFyIF9fdXNlciAqIGJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGRlbnRyeSAqIGRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCXNzaXplX3QJc3RhdHVzOworCisJVkVSQk9TRSgiZmlsZSAlcy8lcywgY291bnQ9JWx1QCVsdVxuIiwgREVOVFJZX1BBVEgoZGVudHJ5KSwKKwkJKHVuc2lnbmVkIGxvbmcpIGNvdW50LCAodW5zaWduZWQgbG9uZykgKnBwb3MpOworCisJc3RhdHVzID0gc21iX3JldmFsaWRhdGVfaW5vZGUoZGVudHJ5KTsKKwlpZiAoc3RhdHVzKSB7CisJCVBBUkFOT0lBKCIlcy8lcyB2YWxpZGF0aW9uIGZhaWxlZCwgZXJyb3I9JVpkXG4iLAorCQkJIERFTlRSWV9QQVRIKGRlbnRyeSksIHN0YXR1cyk7CisJCWdvdG8gb3V0OworCX0KKworCVZFUkJPU0UoImJlZm9yZSByZWFkLCBzaXplPSVsZCwgZmxhZ3M9JXgsIGF0aW1lPSVsZFxuIiwKKwkJKGxvbmcpZGVudHJ5LT5kX2lub2RlLT5pX3NpemUsCisJCWRlbnRyeS0+ZF9pbm9kZS0+aV9mbGFncywgZGVudHJ5LT5kX2lub2RlLT5pX2F0aW1lKTsKKworCXN0YXR1cyA9IGdlbmVyaWNfZmlsZV9yZWFkKGZpbGUsIGJ1ZiwgY291bnQsIHBwb3MpOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQKK3NtYl9maWxlX21tYXAoc3RydWN0IGZpbGUgKiBmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEpCit7CisJc3RydWN0IGRlbnRyeSAqIGRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCWludAlzdGF0dXM7CisKKwlWRVJCT1NFKCJmaWxlICVzLyVzLCBhZGRyZXNzICVsdSAtICVsdVxuIiwKKwkJREVOVFJZX1BBVEgoZGVudHJ5KSwgdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQpOworCisJc3RhdHVzID0gc21iX3JldmFsaWRhdGVfaW5vZGUoZGVudHJ5KTsKKwlpZiAoc3RhdHVzKSB7CisJCVBBUkFOT0lBKCIlcy8lcyB2YWxpZGF0aW9uIGZhaWxlZCwgZXJyb3I9JWRcbiIsCisJCQkgREVOVFJZX1BBVEgoZGVudHJ5KSwgc3RhdHVzKTsKKwkJZ290byBvdXQ7CisJfQorCXN0YXR1cyA9IGdlbmVyaWNfZmlsZV9tbWFwKGZpbGUsIHZtYSk7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHNzaXplX3QKK3NtYl9maWxlX3NlbmRmaWxlKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3QgKnBwb3MsCisJCSAgc2l6ZV90IGNvdW50LCByZWFkX2FjdG9yX3QgYWN0b3IsIHZvaWQgKnRhcmdldCkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlzc2l6ZV90IHN0YXR1czsKKworCVZFUkJPU0UoImZpbGUgJXMvJXMsIHBvcz0lTGQsIGNvdW50PSVkXG4iLAorCQlERU5UUllfUEFUSChkZW50cnkpLCAqcHBvcywgY291bnQpOworCisJc3RhdHVzID0gc21iX3JldmFsaWRhdGVfaW5vZGUoZGVudHJ5KTsKKwlpZiAoc3RhdHVzKSB7CisJCVBBUkFOT0lBKCIlcy8lcyB2YWxpZGF0aW9uIGZhaWxlZCwgZXJyb3I9JVpkXG4iLAorCQkJIERFTlRSWV9QQVRIKGRlbnRyeSksIHN0YXR1cyk7CisJCWdvdG8gb3V0OworCX0KKwlzdGF0dXMgPSBnZW5lcmljX2ZpbGVfc2VuZGZpbGUoZmlsZSwgcHBvcywgY291bnQsIGFjdG9yLCB0YXJnZXQpOworb3V0OgorCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBUaGlzIGRvZXMgdGhlICJyZWFsIiB3b3JrIG9mIHRoZSB3cml0ZS4gVGhlIGdlbmVyaWMgcm91dGluZSBoYXMKKyAqIGFsbG9jYXRlZCB0aGUgcGFnZSwgbG9ja2VkIGl0LCBkb25lIGFsbCB0aGUgcGFnZSBhbGlnbm1lbnQgc3R1ZmYKKyAqIGNhbGN1bGF0aW9ucyBldGMuIE5vdyB3ZSBzaG91bGQganVzdCBjb3B5IHRoZSBkYXRhIGZyb20gdXNlcgorICogc3BhY2UgYW5kIHdyaXRlIGl0IGJhY2sgdG8gdGhlIHJlYWwgbWVkaXVtLi4KKyAqCisgKiBJZiB0aGUgd3JpdGVyIGVuZHMgdXAgZGVsYXlpbmcgdGhlIHdyaXRlLCB0aGUgd3JpdGVyIG5lZWRzIHRvCisgKiBpbmNyZW1lbnQgdGhlIHBhZ2UgdXNlIGNvdW50cyB1bnRpbCBoZSBpcyBkb25lIHdpdGggdGhlIHBhZ2UuCisgKi8KK3N0YXRpYyBpbnQgc21iX3ByZXBhcmVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlLCAKKwkJCSAgICAgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCB0bykKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbWJfY29tbWl0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCSAgICB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIHRvKQoreworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSAtRUZBVUxUOworCWxvY2tfa2VybmVsKCk7CisJc3RhdHVzID0gc21iX3VwZGF0ZXBhZ2UoZmlsZSwgcGFnZSwgb2Zmc2V0LCB0by1vZmZzZXQpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHNtYl9maWxlX2FvcHMgPSB7CisJLnJlYWRwYWdlID0gc21iX3JlYWRwYWdlLAorCS53cml0ZXBhZ2UgPSBzbWJfd3JpdGVwYWdlLAorCS5wcmVwYXJlX3dyaXRlID0gc21iX3ByZXBhcmVfd3JpdGUsCisJLmNvbW1pdF93cml0ZSA9IHNtYl9jb21taXRfd3JpdGUKK307CisKKy8qIAorICogV3JpdGUgdG8gYSBmaWxlICh0aHJvdWdoIHRoZSBwYWdlIGNhY2hlKS4KKyAqLworc3RhdGljIHNzaXplX3QKK3NtYl9maWxlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJc3NpemVfdAlyZXN1bHQ7CisKKwlWRVJCT1NFKCJmaWxlICVzLyVzLCBjb3VudD0lbHVAJWx1XG4iLAorCQlERU5UUllfUEFUSChkZW50cnkpLAorCQkodW5zaWduZWQgbG9uZykgY291bnQsICh1bnNpZ25lZCBsb25nKSAqcHBvcyk7CisKKwlyZXN1bHQgPSBzbWJfcmV2YWxpZGF0ZV9pbm9kZShkZW50cnkpOworCWlmIChyZXN1bHQpIHsKKwkJUEFSQU5PSUEoIiVzLyVzIHZhbGlkYXRpb24gZmFpbGVkLCBlcnJvcj0lWmRcbiIsCisJCQkgREVOVFJZX1BBVEgoZGVudHJ5KSwgcmVzdWx0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmVzdWx0ID0gc21iX29wZW4oZGVudHJ5LCBTTUJfT19XUk9OTFkpOworCWlmIChyZXN1bHQpCisJCWdvdG8gb3V0OworCisJaWYgKGNvdW50ID4gMCkgeworCQlyZXN1bHQgPSBnZW5lcmljX2ZpbGVfd3JpdGUoZmlsZSwgYnVmLCBjb3VudCwgcHBvcyk7CisJCVZFUkJPU0UoInBvcz0lbGQsIHNpemU9JWxkLCBtdGltZT0lbGQsIGF0aW1lPSVsZFxuIiwKKwkJCShsb25nKSBmaWxlLT5mX3BvcywgKGxvbmcpIGRlbnRyeS0+ZF9pbm9kZS0+aV9zaXplLAorCQkJZGVudHJ5LT5kX2lub2RlLT5pX210aW1lLCBkZW50cnktPmRfaW5vZGUtPmlfYXRpbWUpOworCX0KK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50CitzbWJfZmlsZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICogZmlsZSkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCWludCBzbWJfbW9kZSA9IChmaWxlLT5mX21vZGUgJiBPX0FDQ01PREUpIC0gMTsKKworCWxvY2tfa2VybmVsKCk7CisJcmVzdWx0ID0gc21iX29wZW4oZGVudHJ5LCBzbWJfbW9kZSk7CisJaWYgKHJlc3VsdCkKKwkJZ290byBvdXQ7CisJU01CX0koaW5vZGUpLT5vcGVuZXJzKys7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQKK3NtYl9maWxlX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlKQoreworCWxvY2tfa2VybmVsKCk7CisJaWYgKCEtLVNNQl9JKGlub2RlKS0+b3BlbmVycykgeworCQkvKiBXZSBtdXN0IGZsdXNoIGFueSBkaXJ0eSBwYWdlcyBub3cgYXMgd2Ugd29uJ3QgYmUgYWJsZSB0bworCQkgICB3cml0ZSBhbnl0aGluZyBhZnRlciBjbG9zZS4gbW1hcCBjYW4gdHJpZ2dlciB0aGlzLgorCQkgICAib3BlbmVycyIgc2hvdWxkIHBlcmhhcHMgaW5jbHVkZSBtbWFwJ2VycyAuLi4gKi8KKwkJZmlsZW1hcF9mZGF0YXdyaXRlKGlub2RlLT5pX21hcHBpbmcpOworCQlmaWxlbWFwX2ZkYXRhd2FpdChpbm9kZS0+aV9tYXBwaW5nKTsKKwkJc21iX2Nsb3NlKGlub2RlKTsKKwl9CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCisvKgorICogQ2hlY2sgd2hldGhlciB0aGUgcmVxdWlyZWQgYWNjZXNzIGlzIGNvbXBhdGlibGUgd2l0aAorICogYW4gaW5vZGUncyBwZXJtaXNzaW9uLiBTTUIgZG9lc24ndCByZWNvZ25pemUgc3VwZXJ1c2VyCisgKiBwcml2aWxlZ2VzLCBzbyB3ZSBuZWVkIG91ciBvd24gY2hlY2sgZm9yIHRoaXMuCisgKi8KK3N0YXRpYyBpbnQKK3NtYl9maWxlX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2ssIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWludCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKKwlpbnQgZXJyb3IgPSAwOworCisJVkVSQk9TRSgibW9kZT0leCwgbWFzaz0leFxuIiwgbW9kZSwgbWFzayk7CisKKwkvKiBMb29rIGF0IHVzZXIgcGVybWlzc2lvbnMgKi8KKwltb2RlID4+PSA2OworCWlmICgobW9kZSAmIDcgJiBtYXNrKSAhPSBtYXNrKQorCQllcnJvciA9IC1FQUNDRVM7CisJcmV0dXJuIGVycm9yOworfQorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNtYl9maWxlX29wZXJhdGlvbnMgPQoreworCS5sbHNlZWsJCT0gcmVtb3RlX2xsc2VlaywKKwkucmVhZAkJPSBzbWJfZmlsZV9yZWFkLAorCS53cml0ZQkJPSBzbWJfZmlsZV93cml0ZSwKKwkuaW9jdGwJCT0gc21iX2lvY3RsLAorCS5tbWFwCQk9IHNtYl9maWxlX21tYXAsCisJLm9wZW4JCT0gc21iX2ZpbGVfb3BlbiwKKwkucmVsZWFzZQk9IHNtYl9maWxlX3JlbGVhc2UsCisJLmZzeW5jCQk9IHNtYl9mc3luYywKKwkuc2VuZGZpbGUJPSBzbWJfZmlsZV9zZW5kZmlsZSwKK307CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHNtYl9maWxlX2lub2RlX29wZXJhdGlvbnMgPQoreworCS5wZXJtaXNzaW9uCT0gc21iX2ZpbGVfcGVybWlzc2lvbiwKKwkuZ2V0YXR0cgk9IHNtYl9nZXRhdHRyLAorCS5zZXRhdHRyCT0gc21iX25vdGlmeV9jaGFuZ2UsCit9OwpkaWZmIC0tZ2l0IGEvZnMvc21iZnMvZ2V0b3B0LmMgYi9mcy9zbWJmcy9nZXRvcHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWUwZjUyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvc21iZnMvZ2V0b3B0LmMKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIGdldG9wdC5jCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorCisjaW5jbHVkZSAiZ2V0b3B0LmgiCisKKy8qKgorICoJc21iX2dldG9wdCAtIG9wdGlvbiBwYXJzZXIKKyAqCUBjYWxsZXI6IG5hbWUgb2YgdGhlIGNhbGxlciwgZm9yIGVycm9yIG1lc3NhZ2VzCisgKglAb3B0aW9uczogdGhlIG9wdGlvbnMgc3RyaW5nCisgKglAb3B0czogYW4gYXJyYXkgb2YgJnN0cnVjdCBvcHRpb24gZW50cmllcyBjb250cm9sbGluZyBwYXJzZXIgb3BlcmF0aW9ucworICoJQG9wdG9wdDogb3V0cHV0OyB3aWxsIGNvbnRhaW4gdGhlIGN1cnJlbnQgb3B0aW9uCisgKglAb3B0YXJnOiBvdXRwdXQ7IHdpbGwgY29udGFpbiB0aGUgdmFsdWUgKGlmIG9uZSBleGlzdHMpCisgKglAZmxhZzogb3V0cHV0OyBtYXkgYmUgTlVMTDsgc2hvdWxkIHBvaW50IHRvIGEgbG9uZyBmb3Igb3InaW5nIGZsYWdzCisgKglAdmFsdWU6IG91dHB1dDsgbWF5IGJlIE5VTEw7IHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgaW50ZWdlciB2YWx1ZQorICoJCW9mIHRoZSBjdXJyZW50IGFyZ3VtZW50LgorICoKKyAqCUhlbHBlciB0byBwYXJzZSBvcHRpb25zIG9uIHRoZSBmb3JtYXQgdXNlZCBieSBtb3VudCAoImE9YixjPWQsZSxmIikuCisgKglSZXR1cm5zIG9wdHMtPnZhbCBpZiBhIG1hdGNoaW5nIGVudHJ5IGluIHRoZSAnb3B0cycgYXJyYXkgaXMgZm91bmQsCisgKgkwIHdoZW4gbm8gbW9yZSB0b2tlbnMgYXJlIGZvdW5kLCAtMSBpZiBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZC4KKyAqLworaW50IHNtYl9nZXRvcHQoY2hhciAqY2FsbGVyLCBjaGFyICoqb3B0aW9ucywgc3RydWN0IG9wdGlvbiAqb3B0cywKKwkgICAgICAgY2hhciAqKm9wdG9wdCwgY2hhciAqKm9wdGFyZywgdW5zaWduZWQgbG9uZyAqZmxhZywKKwkgICAgICAgdW5zaWduZWQgbG9uZyAqdmFsdWUpCit7CisJY2hhciAqdG9rZW47CisJY2hhciAqdmFsOworCWludCBpOworCisJZG8geworCQlpZiAoKHRva2VuID0gc3Ryc2VwKG9wdGlvbnMsICIsIikpID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKwl9IHdoaWxlICgqdG9rZW4gPT0gJ1wwJyk7CisJKm9wdG9wdCA9IHRva2VuOworCisJKm9wdGFyZyA9IE5VTEw7CisJaWYgKCh2YWwgPSBzdHJjaHIgKHRva2VuLCAnPScpKSAhPSBOVUxMKSB7CisJCSp2YWwrKyA9IDA7CisJCWlmICh2YWx1ZSkKKwkJCSp2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKHZhbCwgTlVMTCwgMCk7CisJCSpvcHRhcmcgPSB2YWw7CisJfQorCisJZm9yIChpID0gMDsgb3B0c1tpXS5uYW1lICE9IE5VTEw7IGkrKykgeworCQlpZiAoIXN0cmNtcChvcHRzW2ldLm5hbWUsIHRva2VuKSkgeworCQkJaWYgKCFvcHRzW2ldLmZsYWcgJiYgKCF2YWwgfHwgISp2YWwpKSB7CisJCQkJcHJpbnRrKCIlczogdGhlICVzIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudFxuIiwKKwkJCQkgICAgICAgY2FsbGVyLCB0b2tlbik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCisJCQlpZiAoZmxhZyAmJiBvcHRzW2ldLmZsYWcpCisJCQkJKmZsYWcgfD0gb3B0c1tpXS5mbGFnOworCisJCQlyZXR1cm4gb3B0c1tpXS52YWw7CisJCX0KKwl9CisJcHJpbnRrKCIlczogVW5yZWNvZ25pemVkIG1vdW50IG9wdGlvbiAlc1xuIiwgY2FsbGVyLCB0b2tlbik7CisJcmV0dXJuIC0xOworfQpkaWZmIC0tZ2l0IGEvZnMvc21iZnMvZ2V0b3B0LmggYi9mcy9zbWJmcy9nZXRvcHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDYyMTlhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvc21iZnMvZ2V0b3B0LmgKQEAgLTAsMCArMSwxNCBAQAorI2lmbmRlZiBfTElOVVhfR0VUT1BUX0gKKyNkZWZpbmUgX0xJTlVYX0dFVE9QVF9ICisKK3N0cnVjdCBvcHRpb24geworCWNvbnN0IGNoYXIgKm5hbWU7CisJdW5zaWduZWQgbG9uZyBmbGFnOworCWludCB2YWw7Cit9OworCitleHRlcm4gaW50IHNtYl9nZXRvcHQoY2hhciAqY2FsbGVyLCBjaGFyICoqb3B0aW9ucywgc3RydWN0IG9wdGlvbiAqb3B0cywKKwkJICAgICAgY2hhciAqKm9wdG9wdCwgY2hhciAqKm9wdGFyZywgdW5zaWduZWQgbG9uZyAqZmxhZywKKwkJICAgICAgdW5zaWduZWQgbG9uZyAqdmFsdWUpOworCisjZW5kaWYgLyogX0xJTlVYX0dFVE9QVF9IICovCmRpZmYgLS1naXQgYS9mcy9zbWJmcy9pbm9kZS5jIGIvZnMvc21iZnMvaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzY1YWFhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvc21iZnMvaW5vZGUuYwpAQCAtMCwwICsxLDg0OSBAQAorLyoKKyAqICBpbm9kZS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBieSBQYWFsLUtyLiBFbmdzdGFkIGFuZCBWb2xrZXIgTGVuZGVja2UKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTcgYnkgVm9sa2VyIExlbmRlY2tlCisgKgorICogIFBsZWFzZSBhZGQgYSBub3RlIGFib3V0IHlvdXIgY2hhbmdlcyB0byBzbWJmcyBpbiB0aGUgQ2hhbmdlTG9nIGZpbGUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RjYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbmxzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2h1aWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbWJfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbWJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NtYl9tb3VudC5oPgorCisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJzbWJfZGVidWcuaCIKKyNpbmNsdWRlICJnZXRvcHQuaCIKKyNpbmNsdWRlICJwcm90by5oIgorCisvKiBBbHdheXMgcGljayBhIGRlZmF1bHQgc3RyaW5nICovCisjaWZkZWYgQ09ORklHX1NNQl9OTFNfUkVNT1RFCisjZGVmaW5lIFNNQl9OTFNfUkVNT1RFIENPTkZJR19TTUJfTkxTX1JFTU9URQorI2Vsc2UKKyNkZWZpbmUgU01CX05MU19SRU1PVEUgIiIKKyNlbmRpZgorCisjZGVmaW5lIFNNQl9UVExfREVGQVVMVCAxMDAwCisKK3N0YXRpYyB2b2lkIHNtYl9kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICopOworc3RhdGljIHZvaWQgc21iX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CitzdGF0aWMgaW50ICBzbWJfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3Qga3N0YXRmcyAqKTsKK3N0YXRpYyBpbnQgIHNtYl9zaG93X29wdGlvbnMoc3RydWN0IHNlcV9maWxlICosIHN0cnVjdCB2ZnNtb3VudCAqKTsKKworc3RhdGljIGttZW1fY2FjaGVfdCAqc21iX2lub2RlX2NhY2hlcDsKKworc3RhdGljIHN0cnVjdCBpbm9kZSAqc21iX2FsbG9jX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IHNtYl9pbm9kZV9pbmZvICplaTsKKwllaSA9IChzdHJ1Y3Qgc21iX2lub2RlX2luZm8gKilrbWVtX2NhY2hlX2FsbG9jKHNtYl9pbm9kZV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwlpZiAoIWVpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gJmVpLT52ZnNfaW5vZGU7Cit9CisKK3N0YXRpYyB2b2lkIHNtYl9kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJa21lbV9jYWNoZV9mcmVlKHNtYl9pbm9kZV9jYWNoZXAsIFNNQl9JKGlub2RlKSk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICogZm9vLCBrbWVtX2NhY2hlX3QgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IHNtYl9pbm9kZV9pbmZvICplaSA9IChzdHJ1Y3Qgc21iX2lub2RlX2luZm8gKikgZm9vOworCXVuc2lnbmVkIGxvbmcgZmxhZ21hc2sgPSBTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUjsKKworCWlmICgoZmxhZ3MgJiBmbGFnbWFzaykgPT0gU0xBQl9DVE9SX0NPTlNUUlVDVE9SKQorCQlpbm9kZV9pbml0X29uY2UoJmVpLT52ZnNfaW5vZGUpOworfQorIAorc3RhdGljIGludCBpbml0X2lub2RlY2FjaGUodm9pZCkKK3sKKwlzbWJfaW5vZGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoInNtYl9pbm9kZV9jYWNoZSIsCisJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBzbWJfaW5vZGVfaW5mbyksCisJCQkJCSAgICAgMCwgU0xBQl9SRUNMQUlNX0FDQ09VTlQsCisJCQkJCSAgICAgaW5pdF9vbmNlLCBOVUxMKTsKKwlpZiAoc21iX2lub2RlX2NhY2hlcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGVzdHJveV9pbm9kZWNhY2hlKHZvaWQpCit7CisJaWYgKGttZW1fY2FjaGVfZGVzdHJveShzbWJfaW5vZGVfY2FjaGVwKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAic21iX2lub2RlX2NhY2hlOiBub3QgYWxsIHN0cnVjdHVyZXMgd2VyZSBmcmVlZFxuIik7Cit9CisKK3N0YXRpYyBpbnQgc21iX3JlbW91bnQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50ICpmbGFncywgY2hhciAqZGF0YSkKK3sKKwkqZmxhZ3MgfD0gTVNfTk9ESVJBVElNRTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHNtYl9zb3BzID0KK3sKKwkuYWxsb2NfaW5vZGUJPSBzbWJfYWxsb2NfaW5vZGUsCisJLmRlc3Ryb3lfaW5vZGUJPSBzbWJfZGVzdHJveV9pbm9kZSwKKwkuZHJvcF9pbm9kZQk9IGdlbmVyaWNfZGVsZXRlX2lub2RlLAorCS5kZWxldGVfaW5vZGUJPSBzbWJfZGVsZXRlX2lub2RlLAorCS5wdXRfc3VwZXIJPSBzbWJfcHV0X3N1cGVyLAorCS5zdGF0ZnMJCT0gc21iX3N0YXRmcywKKwkuc2hvd19vcHRpb25zCT0gc21iX3Nob3dfb3B0aW9ucywKKwkucmVtb3VudF9mcwk9IHNtYl9yZW1vdW50LAorfTsKKworCisvKiBXZSBhcmUgYWx3YXlzIGdlbmVyYXRpbmcgYSBuZXcgaW5vZGUgaGVyZSAqLworc3RydWN0IGlub2RlICoKK3NtYl9pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBzbWJfZmF0dHIgKmZhdHRyKQoreworCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyID0gU01CX1NCKHNiKTsKKwlzdHJ1Y3QgaW5vZGUgKnJlc3VsdDsKKworCURFQlVHMSgic21iX2lnZXQ6ICVwXG4iLCBmYXR0cik7CisKKwlyZXN1bHQgPSBuZXdfaW5vZGUoc2IpOworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gcmVzdWx0OworCXJlc3VsdC0+aV9pbm8gPSBmYXR0ci0+Zl9pbm87CisJU01CX0kocmVzdWx0KS0+b3BlbiA9IDA7CisJU01CX0kocmVzdWx0KS0+ZmlsZWlkID0gMDsKKwlTTUJfSShyZXN1bHQpLT5hY2Nlc3MgPSAwOworCVNNQl9JKHJlc3VsdCktPmZsYWdzID0gMDsKKwlTTUJfSShyZXN1bHQpLT5jbG9zZWQgPSAwOworCVNNQl9JKHJlc3VsdCktPm9wZW5lcnMgPSAwOworCXNtYl9zZXRfaW5vZGVfYXR0cihyZXN1bHQsIGZhdHRyKTsKKwlpZiAoU19JU1JFRyhyZXN1bHQtPmlfbW9kZSkpIHsKKwkJcmVzdWx0LT5pX29wID0gJnNtYl9maWxlX2lub2RlX29wZXJhdGlvbnM7CisJCXJlc3VsdC0+aV9mb3AgPSAmc21iX2ZpbGVfb3BlcmF0aW9uczsKKwkJcmVzdWx0LT5pX2RhdGEuYV9vcHMgPSAmc21iX2ZpbGVfYW9wczsKKwl9IGVsc2UgaWYgKFNfSVNESVIocmVzdWx0LT5pX21vZGUpKSB7CisJCWlmIChzZXJ2ZXItPm9wdC5jYXBhYmlsaXRpZXMgJiBTTUJfQ0FQX1VOSVgpCisJCQlyZXN1bHQtPmlfb3AgPSAmc21iX2Rpcl9pbm9kZV9vcGVyYXRpb25zX3VuaXg7CisJCWVsc2UKKwkJCXJlc3VsdC0+aV9vcCA9ICZzbWJfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJCXJlc3VsdC0+aV9mb3AgPSAmc21iX2Rpcl9vcGVyYXRpb25zOworCX0gZWxzZSBpZiAoU19JU0xOSyhyZXN1bHQtPmlfbW9kZSkpIHsKKwkJcmVzdWx0LT5pX29wID0gJnNtYl9saW5rX2lub2RlX29wZXJhdGlvbnM7CisJfSBlbHNlIHsKKwkJaW5pdF9zcGVjaWFsX2lub2RlKHJlc3VsdCwgcmVzdWx0LT5pX21vZGUsIGZhdHRyLT5mX3JkZXYpOworCX0KKwlpbnNlcnRfaW5vZGVfaGFzaChyZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBDb3B5IHRoZSBpbm9kZSBkYXRhIHRvIGEgc21iX2ZhdHRyIHN0cnVjdHVyZS4KKyAqLwordm9pZAorc21iX2dldF9pbm9kZV9hdHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBzbWJfZmF0dHIgKmZhdHRyKQoreworCW1lbXNldChmYXR0ciwgMCwgc2l6ZW9mKHN0cnVjdCBzbWJfZmF0dHIpKTsKKwlmYXR0ci0+Zl9tb2RlCT0gaW5vZGUtPmlfbW9kZTsKKwlmYXR0ci0+Zl9ubGluawk9IGlub2RlLT5pX25saW5rOworCWZhdHRyLT5mX2lubwk9IGlub2RlLT5pX2lubzsKKwlmYXR0ci0+Zl91aWQJPSBpbm9kZS0+aV91aWQ7CisJZmF0dHItPmZfZ2lkCT0gaW5vZGUtPmlfZ2lkOworCWZhdHRyLT5mX3NpemUJPSBpbm9kZS0+aV9zaXplOworCWZhdHRyLT5mX210aW1lCT0gaW5vZGUtPmlfbXRpbWU7CisJZmF0dHItPmZfY3RpbWUJPSBpbm9kZS0+aV9jdGltZTsKKwlmYXR0ci0+Zl9hdGltZQk9IGlub2RlLT5pX2F0aW1lOworCWZhdHRyLT5mX2Jsa3NpemU9IGlub2RlLT5pX2Jsa3NpemU7CisJZmF0dHItPmZfYmxvY2tzCT0gaW5vZGUtPmlfYmxvY2tzOworCisJZmF0dHItPmF0dHIJPSBTTUJfSShpbm9kZSktPmF0dHI7CisJLyoKKwkgKiBLZWVwIHRoZSBhdHRyaWJ1dGVzIGluIHN5bmMgd2l0aCB0aGUgaW5vZGUgcGVybWlzc2lvbnMuCisJICovCisJaWYgKGZhdHRyLT5mX21vZGUgJiBTX0lXVVNSKQorCQlmYXR0ci0+YXR0ciAmPSB+YVJPTkxZOworCWVsc2UKKwkJZmF0dHItPmF0dHIgfD0gYVJPTkxZOworfQorCisvKgorICogVXBkYXRlIHRoZSBpbm9kZSwgcG9zc2libHkgY2F1c2luZyBpdCB0byBpbnZhbGlkYXRlIGl0cyBwYWdlcyBpZiBtdGltZS9zaXplCisgKiBpcyBkaWZmZXJlbnQgZnJvbSBsYXN0IHRpbWUuCisgKi8KK3ZvaWQKK3NtYl9zZXRfaW5vZGVfYXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qgc21iX2ZhdHRyICpmYXR0cikKK3sKKwlzdHJ1Y3Qgc21iX2lub2RlX2luZm8gKmVpID0gU01CX0koaW5vZGUpOworCisJLyoKKwkgKiBBIHNpemUgY2hhbmdlIHNob3VsZCBoYXZlIGEgZGlmZmVyZW50IG10aW1lLCBvciBzYW1lIG10aW1lCisJICogYnV0IGRpZmZlcmVudCBzaXplLgorCSAqLworCXRpbWVfdCBsYXN0X3RpbWUgPSBpbm9kZS0+aV9tdGltZS50dl9zZWM7CisJbG9mZl90IGxhc3Rfc3ogPSBpbm9kZS0+aV9zaXplOworCisJaW5vZGUtPmlfbW9kZQk9IGZhdHRyLT5mX21vZGU7CisJaW5vZGUtPmlfbmxpbmsJPSBmYXR0ci0+Zl9ubGluazsKKwlpbm9kZS0+aV91aWQJPSBmYXR0ci0+Zl91aWQ7CisJaW5vZGUtPmlfZ2lkCT0gZmF0dHItPmZfZ2lkOworCWlub2RlLT5pX2N0aW1lCT0gZmF0dHItPmZfY3RpbWU7CisJaW5vZGUtPmlfYmxrc2l6ZT0gZmF0dHItPmZfYmxrc2l6ZTsKKwlpbm9kZS0+aV9ibG9ja3MgPSBmYXR0ci0+Zl9ibG9ja3M7CisJaW5vZGUtPmlfc2l6ZQk9IGZhdHRyLT5mX3NpemU7CisJaW5vZGUtPmlfbXRpbWUJPSBmYXR0ci0+Zl9tdGltZTsKKwlpbm9kZS0+aV9hdGltZQk9IGZhdHRyLT5mX2F0aW1lOworCWVpLT5hdHRyID0gZmF0dHItPmF0dHI7CisKKwkvKgorCSAqIFVwZGF0ZSB0aGUgImxhc3QgdGltZSByZWZyZXNoZWQiIGZpZWxkIGZvciByZXZhbGlkYXRpb24uCisJICovCisJZWktPm9sZG10aW1lID0gamlmZmllczsKKworCWlmIChpbm9kZS0+aV9tdGltZS50dl9zZWMgIT0gbGFzdF90aW1lIHx8IGlub2RlLT5pX3NpemUgIT0gbGFzdF9zeikgeworCQlWRVJCT1NFKCIlbGQgY2hhbmdlZCwgb2xkPSVsZCwgbmV3PSVsZCwgb3o9JWxkLCBuej0lbGRcbiIsCisJCQlpbm9kZS0+aV9pbm8sCisJCQkobG9uZykgbGFzdF90aW1lLCAobG9uZykgaW5vZGUtPmlfbXRpbWUsCisJCQkobG9uZykgbGFzdF9zeiwgKGxvbmcpIGlub2RlLT5pX3NpemUpOworCisJCWlmICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJCWludmFsaWRhdGVfcmVtb3RlX2lub2RlKGlub2RlKTsKKwl9Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCBpZiB0aGUgY29ubmVjdGlvbiBoYXMgZ29uZSBiYWQgLi4uCisgKiB0cnkgdG8ga2lsbCBvZmYgYWxsIHRoZSBjdXJyZW50IGlub2Rlcy4KKyAqLwordm9pZAorc21iX2ludmFsaWRhdGVfaW5vZGVzKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyKQoreworCVZFUkJPU0UoIlxuIik7CisJc2hyaW5rX2RjYWNoZV9zYihTQl9vZihzZXJ2ZXIpKTsKKwlpbnZhbGlkYXRlX2lub2RlcyhTQl9vZihzZXJ2ZXIpKTsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHRvIHVwZGF0ZSB0aGUgaW5vZGUgYXR0cmlidXRlcyBhZnRlcgorICogd2UndmUgbWFkZSBjaGFuZ2VzIHRvIGEgZmlsZSBvciBkaXJlY3RvcnkuCisgKi8KK3N0YXRpYyBpbnQKK3NtYl9yZWZyZXNoX2lub2RlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludCBlcnJvcjsKKwlzdHJ1Y3Qgc21iX2ZhdHRyIGZhdHRyOworCisJZXJyb3IgPSBzbWJfcHJvY19nZXRhdHRyKGRlbnRyeSwgJmZhdHRyKTsKKwlpZiAoIWVycm9yKSB7CisJCXNtYl9yZW5ld190aW1lcyhkZW50cnkpOworCQkvKgorCQkgKiBDaGVjayB3aGV0aGVyIHRoZSB0eXBlIHBhcnQgb2YgdGhlIG1vZGUgY2hhbmdlZCwKKwkJICogYW5kIGRvbid0IHVwZGF0ZSB0aGUgYXR0cmlidXRlcyBpZiBpdCBkaWQuCisJCSAqCisJCSAqIEFuZCBkb24ndCBkaWNrIHdpdGggdGhlIHJvb3QgaW5vZGUKKwkJICovCisJCWlmIChpbm9kZS0+aV9pbm8gPT0gMikKKwkJCXJldHVybiBlcnJvcjsKKwkJaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpCisJCQlyZXR1cm4gZXJyb3I7CS8qIFZGUyB3aWxsIGRlYWwgd2l0aCBpdCAqLworCisJCWlmICgoaW5vZGUtPmlfbW9kZSAmIFNfSUZNVCkgPT0gKGZhdHRyLmZfbW9kZSAmIFNfSUZNVCkpIHsKKwkJCXNtYl9zZXRfaW5vZGVfYXR0cihpbm9kZSwgJmZhdHRyKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBCaWcgdHJvdWJsZSEgVGhlIGlub2RlIGhhcyBiZWNvbWUgYSBuZXcgb2JqZWN0LAorCQkJICogc28gYW55IG9wZXJhdGlvbnMgYXR0ZW1wdGVkIG9uIGl0IGFyZSBpbnZhbGlkLgorCQkJICoKKwkJCSAqIFRvIGxpbWl0IGRhbWFnZSwgbWFyayB0aGUgaW5vZGUgYXMgYmFkIHNvIHRoYXQKKwkJCSAqIHN1YnNlcXVlbnQgbG9va3VwIHZhbGlkYXRpb25zIHdpbGwgZmFpbC4KKwkJCSAqLworCQkJUEFSQU5PSUEoIiVzLyVzIGNoYW5nZWQgbW9kZSwgJTA3byB0byAlMDdvXG4iLAorCQkJCSBERU5UUllfUEFUSChkZW50cnkpLAorCQkJCSBpbm9kZS0+aV9tb2RlLCBmYXR0ci5mX21vZGUpOworCisJCQlmYXR0ci5mX21vZGUgPSBpbm9kZS0+aV9tb2RlOyAvKiBzYXZlIG1vZGUgKi8KKwkJCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwkJCWlub2RlLT5pX21vZGUgPSBmYXR0ci5mX21vZGU7IC8qIHJlc3RvcmUgbW9kZSAqLworCQkJLyoKKwkJCSAqIE5vIG5lZWQgdG8gd29ycnkgYWJvdXQgdW5oYXNoaW5nIHRoZSBkZW50cnk6IHRoZQorCQkJICogbG9va3VwIHZhbGlkYXRpb24gd2lsbCBzZWUgdGhhdCB0aGUgaW5vZGUgaXMgYmFkLgorCQkJICogQnV0IHdlIGRvIHdhbnQgdG8gaW52YWxpZGF0ZSB0aGUgY2FjaGVzIC4uLgorCQkJICovCisJCQlpZiAoIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCQkJaW52YWxpZGF0ZV9yZW1vdGVfaW5vZGUoaW5vZGUpOworCQkJZWxzZQorCQkJCXNtYl9pbnZhbGlkX2Rpcl9jYWNoZShpbm9kZSk7CisJCQllcnJvciA9IC1FSU87CisJCX0KKwl9CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgd2hlbiB3ZSB3YW50IHRvIGNoZWNrIHdoZXRoZXIgdGhlIGlub2RlCisgKiBoYXMgY2hhbmdlZCBvbiB0aGUgc2VydmVyLiAgSWYgaXQgaGFzIGNoYW5nZWQsIHdlIG11c3QKKyAqIGludmFsaWRhdGUgb3VyIGxvY2FsIGNhY2hlcy4KKyAqLworaW50CitzbWJfcmV2YWxpZGF0ZV9pbm9kZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IHNtYl9zYl9pbmZvICpzID0gc2VydmVyX2Zyb21fZGVudHJ5KGRlbnRyeSk7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgZXJyb3IgPSAwOworCisJREVCVUcxKCJzbWJfcmV2YWxpZGF0ZV9pbm9kZVxuIik7CisJbG9ja19rZXJuZWwoKTsKKworCS8qCisJICogQ2hlY2sgd2hldGhlciB3ZSd2ZSByZWNlbnRseSByZWZyZXNoZWQgdGhlIGlub2RlLgorCSAqLworCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBTTUJfSShpbm9kZSktPm9sZG10aW1lICsgU01CX01BWF9BR0UocykpKSB7CisJCVZFUkJPU0UoInVwLXRvLWRhdGUsIGlubz0lbGQsIGppZmZpZXM9JWx1LCBvbGR0aW1lPSVsdVxuIiwKKwkJCWlub2RlLT5pX2lubywgamlmZmllcywgU01CX0koaW5vZGUpLT5vbGRtdGltZSk7CisJCWdvdG8gb3V0OworCX0KKworCWVycm9yID0gc21iX3JlZnJlc2hfaW5vZGUoZGVudHJ5KTsKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIGlfbmxpbmsgPT0gMCBhbmQgaV9jb3VudCBnb2VzIHRvIDAuCisgKiBBbGwgYmxvY2tpbmcgY2xlYW51cCBvcGVyYXRpb25zIG5lZWQgdG8gZ28gaGVyZSB0byBhdm9pZCByYWNlcy4KKyAqLworc3RhdGljIHZvaWQKK3NtYl9kZWxldGVfaW5vZGUoc3RydWN0IGlub2RlICppbm8pCit7CisJREVCVUcxKCJpbm89JWxkXG4iLCBpbm8tPmlfaW5vKTsKKwlsb2NrX2tlcm5lbCgpOworCWlmIChzbWJfY2xvc2UoaW5vKSkKKwkJUEFSQU5PSUEoImNvdWxkIG5vdCBjbG9zZSBpbm9kZSAlbGRcbiIsIGluby0+aV9pbm8pOworCXVubG9ja19rZXJuZWwoKTsKKwljbGVhcl9pbm9kZShpbm8pOworfQorCitzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRzW10gPSB7CisJeyAidmVyc2lvbiIsCTAsICd2JyB9LAorCXsgIndpbjk1IiwJU01CX01PVU5UX1dJTjk1LCAxIH0sCisJeyAib2xkYXR0ciIsCVNNQl9NT1VOVF9PTERBVFRSLCAxIH0sCisJeyAiZGlyYXR0ciIsCVNNQl9NT1VOVF9ESVJBVFRSLCAxIH0sCisJeyAiY2FzZSIsCVNNQl9NT1VOVF9DQVNFLCAxIH0sCisJeyAidWlkIiwJMCwgJ3UnIH0sCisJeyAiZ2lkIiwJMCwgJ2cnIH0sCisJeyAiZmlsZV9tb2RlIiwJMCwgJ2YnIH0sCisJeyAiZGlyX21vZGUiLAkwLCAnZCcgfSwKKwl7ICJpb2NoYXJzZXQiLAkwLCAnaScgfSwKKwl7ICJjb2RlcGFnZSIsCTAsICdjJyB9LAorCXsgInR0bCIsCTAsICd0JyB9LAorCXsgTlVMTCwJCTAsIDB9Cit9OworCitzdGF0aWMgaW50CitwYXJzZV9vcHRpb25zKHN0cnVjdCBzbWJfbW91bnRfZGF0YV9rZXJuZWwgKm1udCwgY2hhciAqb3B0aW9ucykKK3sKKwlpbnQgYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJY2hhciAqb3B0YXJnOworCWNoYXIgKm9wdG9wdDsKKworCWZsYWdzID0gMDsKKwl3aGlsZSAoIChjID0gc21iX2dldG9wdCgic21iZnMiLCAmb3B0aW9ucywgb3B0cywKKwkJCQkmb3B0b3B0LCAmb3B0YXJnLCAmZmxhZ3MsICZ2YWx1ZSkpID4gMCkgeworCisJCVZFUkJPU0UoIiclcycgLT4gJyVzJ1xuIiwgb3B0b3B0LCBvcHRhcmcgPyBvcHRhcmcgOiAiPG5vbmU+Iik7CisJCXN3aXRjaCAoYykgeworCQljYXNlIDE6CisJCQkvKiBnb3QgYSAiZmxhZyIgb3B0aW9uICovCisJCQlicmVhazsKKwkJY2FzZSAndic6CisJCQlpZiAodmFsdWUgIT0gU01CX01PVU5UX1ZFUlNJT04pIHsKKwkJCXByaW50ayAoInNtYmZzOiBCYWQgbW91bnQgdmVyc2lvbiAlbGQsIGV4cGVjdGVkICVkXG4iLAorCQkJCXZhbHVlLCBTTUJfTU9VTlRfVkVSU0lPTik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQltbnQtPnZlcnNpb24gPSB2YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlICd1JzoKKwkJCW1udC0+dWlkID0gdmFsdWU7CisJCQlmbGFncyB8PSBTTUJfTU9VTlRfVUlEOworCQkJYnJlYWs7CisJCWNhc2UgJ2cnOgorCQkJbW50LT5naWQgPSB2YWx1ZTsKKwkJCWZsYWdzIHw9IFNNQl9NT1VOVF9HSUQ7CisJCQlicmVhazsKKwkJY2FzZSAnZic6CisJCQltbnQtPmZpbGVfbW9kZSA9ICh2YWx1ZSAmIFNfSVJXWFVHTykgfCBTX0lGUkVHOworCQkJZmxhZ3MgfD0gU01CX01PVU5UX0ZNT0RFOworCQkJYnJlYWs7CisJCWNhc2UgJ2QnOgorCQkJbW50LT5kaXJfbW9kZSA9ICh2YWx1ZSAmIFNfSVJXWFVHTykgfCBTX0lGRElSOworCQkJZmxhZ3MgfD0gU01CX01PVU5UX0RNT0RFOworCQkJYnJlYWs7CisJCWNhc2UgJ2knOgorCQkJc3RybGNweShtbnQtPmNvZGVwYWdlLmxvY2FsX25hbWUsIG9wdGFyZywgCisJCQkJU01CX05MU19NQVhOQU1FTEVOKTsKKwkJCWJyZWFrOworCQljYXNlICdjJzoKKwkJCXN0cmxjcHkobW50LT5jb2RlcGFnZS5yZW1vdGVfbmFtZSwgb3B0YXJnLAorCQkJCVNNQl9OTFNfTUFYTkFNRUxFTik7CisJCQlicmVhazsKKwkJY2FzZSAndCc6CisJCQltbnQtPnR0bCA9IHZhbHVlOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsgKCJzbWJmczogVW5yZWNvZ25pemVkIG1vdW50IG9wdGlvbiAlc1xuIiwKKwkJCQlvcHRvcHQpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCW1udC0+ZmxhZ3MgPSBmbGFnczsKKwlyZXR1cm4gYzsKK30KKworLyoKKyAqIHNtYl9zaG93X29wdGlvbnMoKSBpcyBmb3IgZGlzcGxheWluZyBtb3VudCBvcHRpb25zIGluIC9wcm9jL21vdW50cy4KKyAqIEl0IHRyaWVzIHRvIGF2b2lkIHNob3dpbmcgc2V0dGluZ3MgdGhhdCB3ZXJlIG5vdCBjaGFuZ2VkIGZyb20gdGhlaXIKKyAqIGRlZmF1bHRzLgorICovCitzdGF0aWMgaW50CitzbWJfc2hvd19vcHRpb25zKHN0cnVjdCBzZXFfZmlsZSAqcywgc3RydWN0IHZmc21vdW50ICptKQoreworCXN0cnVjdCBzbWJfbW91bnRfZGF0YV9rZXJuZWwgKm1udCA9IFNNQl9TQihtLT5tbnRfc2IpLT5tbnQ7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBvcHRzW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorCQlpZiAobW50LT5mbGFncyAmIG9wdHNbaV0uZmxhZykKKwkJCXNlcV9wcmludGYocywgIiwlcyIsIG9wdHNbaV0ubmFtZSk7CisKKwlpZiAobW50LT5mbGFncyAmIFNNQl9NT1VOVF9VSUQpCisJCXNlcV9wcmludGYocywgIix1aWQ9JWQiLCBtbnQtPnVpZCk7CisJaWYgKG1udC0+ZmxhZ3MgJiBTTUJfTU9VTlRfR0lEKQorCQlzZXFfcHJpbnRmKHMsICIsZ2lkPSVkIiwgbW50LT5naWQpOworCWlmIChtbnQtPm1vdW50ZWRfdWlkICE9IDApCisJCXNlcV9wcmludGYocywgIixtb3VudGVkX3VpZD0lZCIsIG1udC0+bW91bnRlZF91aWQpOworCisJLyogCisJICogRGVmYXVsdHMgZm9yIGZpbGVfbW9kZSBhbmQgZGlyX21vZGUgYXJlIHVua25vd24gdG8gdXM7IHRoZXkKKwkgKiBkZXBlbmQgb24gdGhlIGN1cnJlbnQgdW1hc2sgb2YgdGhlIHVzZXIgZG9pbmcgdGhlIG1vdW50LgorCSAqLworCWlmIChtbnQtPmZsYWdzICYgU01CX01PVU5UX0ZNT0RFKQorCQlzZXFfcHJpbnRmKHMsICIsZmlsZV9tb2RlPSUwNG8iLCBtbnQtPmZpbGVfbW9kZSAmIFNfSVJXWFVHTyk7CisJaWYgKG1udC0+ZmxhZ3MgJiBTTUJfTU9VTlRfRE1PREUpCisJCXNlcV9wcmludGYocywgIixkaXJfbW9kZT0lMDRvIiwgbW50LT5kaXJfbW9kZSAmIFNfSVJXWFVHTyk7CisKKwlpZiAoc3RyY21wKG1udC0+Y29kZXBhZ2UubG9jYWxfbmFtZSwgQ09ORklHX05MU19ERUZBVUxUKSkKKwkJc2VxX3ByaW50ZihzLCAiLGlvY2hhcnNldD0lcyIsIG1udC0+Y29kZXBhZ2UubG9jYWxfbmFtZSk7CisJaWYgKHN0cmNtcChtbnQtPmNvZGVwYWdlLnJlbW90ZV9uYW1lLCBTTUJfTkxTX1JFTU9URSkpCisJCXNlcV9wcmludGYocywgIixjb2RlcGFnZT0lcyIsIG1udC0+Y29kZXBhZ2UucmVtb3RlX25hbWUpOworCisJaWYgKG1udC0+dHRsICE9IFNNQl9UVExfREVGQVVMVCkKKwkJc2VxX3ByaW50ZihzLCAiLHR0bD0lZCIsIG1udC0+dHRsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorc21iX3VubG9hZF9ubHMoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIpCit7CisJaWYgKHNlcnZlci0+cmVtb3RlX25scykgeworCQl1bmxvYWRfbmxzKHNlcnZlci0+cmVtb3RlX25scyk7CisJCXNlcnZlci0+cmVtb3RlX25scyA9IE5VTEw7CisJfQorCWlmIChzZXJ2ZXItPmxvY2FsX25scykgeworCQl1bmxvYWRfbmxzKHNlcnZlci0+bG9jYWxfbmxzKTsKKwkJc2VydmVyLT5sb2NhbF9ubHMgPSBOVUxMOworCX0KK30KKworc3RhdGljIHZvaWQKK3NtYl9wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciA9IFNNQl9TQihzYik7CisKKwlzbWJfbG9ja19zZXJ2ZXIoc2VydmVyKTsKKwlzZXJ2ZXItPnN0YXRlID0gQ09OTl9JTlZBTElEOworCXNtYmlvZF91bnJlZ2lzdGVyX3NlcnZlcihzZXJ2ZXIpOworCisJc21iX2Nsb3NlX3NvY2tldChzZXJ2ZXIpOworCisJaWYgKHNlcnZlci0+Y29ubl9waWQpCisJCWtpbGxfcHJvYyhzZXJ2ZXItPmNvbm5fcGlkLCBTSUdURVJNLCAxKTsKKworCXNtYl9rZnJlZShzZXJ2ZXItPm9wcyk7CisJc21iX3VubG9hZF9ubHMoc2VydmVyKTsKKwlzYi0+c19mc19pbmZvID0gTlVMTDsKKwlzbWJfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOworCXNtYl9rZnJlZShzZXJ2ZXIpOworfQorCitzdGF0aWMgaW50IHNtYl9maWxsX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKnJhd19kYXRhLCBpbnQgc2lsZW50KQoreworCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyOworCXN0cnVjdCBzbWJfbW91bnRfZGF0YV9rZXJuZWwgKm1udDsKKwlzdHJ1Y3Qgc21iX21vdW50X2RhdGEgKm9sZG1udDsKKwlzdHJ1Y3QgaW5vZGUgKnJvb3RfaW5vZGU7CisJc3RydWN0IHNtYl9mYXR0ciByb290OworCWludCB2ZXI7CisJdm9pZCAqbWVtOworCisJaWYgKCFyYXdfZGF0YSkKKwkJZ290byBvdXRfbm9fZGF0YTsKKworCW9sZG1udCA9IChzdHJ1Y3Qgc21iX21vdW50X2RhdGEgKikgcmF3X2RhdGE7CisJdmVyID0gb2xkbW50LT52ZXJzaW9uOworCWlmICh2ZXIgIT0gU01CX01PVU5UX09MRFZFUlNJT04gJiYgY3B1X3RvX2JlMzIodmVyKSAhPSBTTUJfTU9VTlRfQVNDSUkpCisJCWdvdG8gb3V0X3dyb25nX2RhdGE7CisKKwlzYi0+c19mbGFncyB8PSBNU19OT0RJUkFUSU1FOworCXNiLT5zX2Jsb2Nrc2l6ZSA9IDEwMjQ7CS8qIEVoLi4uICBJcyB0aGlzIGNvcnJlY3Q/ICovCisJc2ItPnNfYmxvY2tzaXplX2JpdHMgPSAxMDsKKwlzYi0+c19tYWdpYyA9IFNNQl9TVVBFUl9NQUdJQzsKKwlzYi0+c19vcCA9ICZzbWJfc29wczsKKwlzYi0+c190aW1lX2dyYW4gPSAxMDA7CisKKwlzZXJ2ZXIgPSBzbWJfa21hbGxvYyhzaXplb2Yoc3RydWN0IHNtYl9zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZXJ2ZXIpCisJCWdvdG8gb3V0X25vX3NlcnZlcjsKKwlzYi0+c19mc19pbmZvID0gc2VydmVyOworCW1lbXNldChzZXJ2ZXIsIDAsIHNpemVvZihzdHJ1Y3Qgc21iX3NiX2luZm8pKTsKKworCXNlcnZlci0+c3VwZXJfYmxvY2sgPSBzYjsKKwlzZXJ2ZXItPm1udCA9IE5VTEw7CisJc2VydmVyLT5zb2NrX2ZpbGUgPSBOVUxMOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNlcnZlci0+Y29ubl93cSk7CisJaW5pdF9NVVRFWCgmc2VydmVyLT5zZW0pOworCUlOSVRfTElTVF9IRUFEKCZzZXJ2ZXItPmVudHJ5KTsKKwlJTklUX0xJU1RfSEVBRCgmc2VydmVyLT54bWl0cSk7CisJSU5JVF9MSVNUX0hFQUQoJnNlcnZlci0+cmVjdnEpOworCXNlcnZlci0+Y29ubl9lcnJvciA9IDA7CisJc2VydmVyLT5jb25uX3BpZCA9IDA7CisJc2VydmVyLT5zdGF0ZSA9IENPTk5fSU5WQUxJRDsgLyogbm8gY29ubmVjdGlvbiB5ZXQgKi8KKwlzZXJ2ZXItPmdlbmVyYXRpb24gPSAwOworCisJLyogQWxsb2NhdGUgdGhlIGdsb2JhbCB0ZW1wIGJ1ZmZlciBhbmQgc29tZSBzdXBlcmJsb2NrIGhlbHBlciBzdHJ1Y3RzICovCisJLyogRklYTUU6IG1vdmUgdGhlc2UgdG8gdGhlIHNtYl9zYl9pbmZvIHN0cnVjdCAqLworCVZFUkJPU0UoImFsbG9jIGNodW5rID0gJWRcbiIsIHNpemVvZihzdHJ1Y3Qgc21iX29wcykgKworCQlzaXplb2Yoc3RydWN0IHNtYl9tb3VudF9kYXRhX2tlcm5lbCkpOworCW1lbSA9IHNtYl9rbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc21iX29wcykgKworCQkJICBzaXplb2Yoc3RydWN0IHNtYl9tb3VudF9kYXRhX2tlcm5lbCksIEdGUF9LRVJORUwpOworCWlmICghbWVtKQorCQlnb3RvIG91dF9ub19tZW07CisKKwlzZXJ2ZXItPm9wcyA9IG1lbTsKKwlzbWJfaW5zdGFsbF9udWxsX29wcyhzZXJ2ZXItPm9wcyk7CisJc2VydmVyLT5tbnQgPSBtZW0gKyBzaXplb2Yoc3RydWN0IHNtYl9vcHMpOworCisJLyogU2V0dXAgTkxTIHN0dWZmICovCisJc2VydmVyLT5yZW1vdGVfbmxzID0gTlVMTDsKKwlzZXJ2ZXItPmxvY2FsX25scyA9IE5VTEw7CisKKwltbnQgPSBzZXJ2ZXItPm1udDsKKworCW1lbXNldChtbnQsIDAsIHNpemVvZihzdHJ1Y3Qgc21iX21vdW50X2RhdGFfa2VybmVsKSk7CisJc3RybGNweShtbnQtPmNvZGVwYWdlLmxvY2FsX25hbWUsIENPTkZJR19OTFNfREVGQVVMVCwKKwkJU01CX05MU19NQVhOQU1FTEVOKTsKKwlzdHJsY3B5KG1udC0+Y29kZXBhZ2UucmVtb3RlX25hbWUsIFNNQl9OTFNfUkVNT1RFLAorCQlTTUJfTkxTX01BWE5BTUVMRU4pOworCisJbW50LT50dGwgPSBTTUJfVFRMX0RFRkFVTFQ7CisJaWYgKHZlciA9PSBTTUJfTU9VTlRfT0xEVkVSU0lPTikgeworCQltbnQtPnZlcnNpb24gPSBvbGRtbnQtPnZlcnNpb247CisKKwkJU0VUX1VJRChtbnQtPnVpZCwgb2xkbW50LT51aWQpOworCQlTRVRfR0lEKG1udC0+Z2lkLCBvbGRtbnQtPmdpZCk7CisKKwkJbW50LT5maWxlX21vZGUgPSAob2xkbW50LT5maWxlX21vZGUgJiBTX0lSV1hVR08pIHwgU19JRlJFRzsKKwkJbW50LT5kaXJfbW9kZSA9IChvbGRtbnQtPmRpcl9tb2RlICYgU19JUldYVUdPKSB8IFNfSUZESVI7CisKKwkJbW50LT5mbGFncyA9IChvbGRtbnQtPmZpbGVfbW9kZSA+PiA5KSB8IFNNQl9NT1VOVF9VSUQgfAorCQkJU01CX01PVU5UX0dJRCB8IFNNQl9NT1VOVF9GTU9ERSB8IFNNQl9NT1VOVF9ETU9ERTsKKwl9IGVsc2UgeworCQltbnQtPmZpbGVfbW9kZSA9IFNfSVJXWFUgfCBTX0lSR1JQIHwgU19JWEdSUCB8CisJCQkJU19JUk9USCB8IFNfSVhPVEggfCBTX0lGUkVHOworCQltbnQtPmRpcl9tb2RlID0gU19JUldYVSB8IFNfSVJHUlAgfCBTX0lYR1JQIHwKKwkJCQlTX0lST1RIIHwgU19JWE9USCB8IFNfSUZESVI7CisJCWlmIChwYXJzZV9vcHRpb25zKG1udCwgcmF3X2RhdGEpKQorCQkJZ290byBvdXRfYmFkX29wdGlvbjsKKwl9CisJbW50LT5tb3VudGVkX3VpZCA9IGN1cnJlbnQtPnVpZDsKKwlzbWJfc2V0Y29kZXBhZ2Uoc2VydmVyLCAmbW50LT5jb2RlcGFnZSk7CisKKwkvKgorCSAqIERpc3BsYXkgdGhlIGVuYWJsZWQgb3B0aW9ucworCSAqIE5vdGU6IHNtYl9wcm9jX2dldGF0dHIgdXNlcyB0aGVzZSBpbiAyLjQgKGJ1dCB3YXMgY2hhbmdlZCBpbiAyLjIpCisJICovCisJaWYgKG1udC0+ZmxhZ3MgJiBTTUJfTU9VTlRfT0xEQVRUUikKKwkJcHJpbnRrKCJTTUJGUzogVXNpbmcgY29yZSBnZXRhdHRyIChXaW4gOTUgc3BlZWR1cClcbiIpOworCWVsc2UgaWYgKG1udC0+ZmxhZ3MgJiBTTUJfTU9VTlRfRElSQVRUUikKKwkJcHJpbnRrKCJTTUJGUzogVXNpbmcgZGlyIGZmIGdldGF0dHJcbiIpOworCisJaWYgKHNtYmlvZF9yZWdpc3Rlcl9zZXJ2ZXIoc2VydmVyKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzbWJmczogZmFpbGVkIHRvIHN0YXJ0IHNtYmlvZFxuIik7CisJCWdvdG8gb3V0X25vX3NtYmlvZDsKKwl9CisKKwkvKgorCSAqIEtlZXAgdGhlIHN1cGVyIGJsb2NrIGxvY2tlZCB3aGlsZSB3ZSBnZXQgdGhlIHJvb3QgaW5vZGUuCisJICovCisJc21iX2luaXRfcm9vdF9kaXJlbnQoc2VydmVyLCAmcm9vdCwgc2IpOworCXJvb3RfaW5vZGUgPSBzbWJfaWdldChzYiwgJnJvb3QpOworCWlmICghcm9vdF9pbm9kZSkKKwkJZ290byBvdXRfbm9fcm9vdDsKKworCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3Qocm9vdF9pbm9kZSk7CisJaWYgKCFzYi0+c19yb290KQorCQlnb3RvIG91dF9ub19yb290OworCisJc21iX25ld19kZW50cnkoc2ItPnNfcm9vdCk7CisKKwlyZXR1cm4gMDsKKworb3V0X25vX3Jvb3Q6CisJaXB1dChyb290X2lub2RlKTsKK291dF9ub19zbWJpb2Q6CisJc21iX3VubG9hZF9ubHMoc2VydmVyKTsKK291dF9iYWRfb3B0aW9uOgorCXNtYl9rZnJlZShtZW0pOworb3V0X25vX21lbToKKwlpZiAoIXNlcnZlci0+bW50KQorCQlwcmludGsoS0VSTl9FUlIgInNtYl9maWxsX3N1cGVyOiBhbGxvY2F0aW9uIGZhaWx1cmVcbiIpOworCXNiLT5zX2ZzX2luZm8gPSBOVUxMOworCXNtYl9rZnJlZShzZXJ2ZXIpOworCWdvdG8gb3V0X2ZhaWw7CitvdXRfd3JvbmdfZGF0YToKKwlwcmludGsoS0VSTl9FUlIgInNtYmZzOiBtb3VudF9kYXRhIHZlcnNpb24gJWQgaXMgbm90IHN1cHBvcnRlZFxuIiwgdmVyKTsKKwlnb3RvIG91dF9mYWlsOworb3V0X25vX2RhdGE6CisJcHJpbnRrKEtFUk5fRVJSICJzbWJfZmlsbF9zdXBlcjogbWlzc2luZyBkYXRhIGFyZ3VtZW50XG4iKTsKK291dF9mYWlsOgorCXJldHVybiAtRUlOVkFMOworb3V0X25vX3NlcnZlcjoKKwlwcmludGsoS0VSTl9FUlIgInNtYl9maWxsX3N1cGVyOiBjYW5ub3QgYWxsb2NhdGUgc3RydWN0IHNtYl9zYl9pbmZvXG4iKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIGludAorc21iX3N0YXRmcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqYnVmKQoreworCWludCByZXN1bHQ7CisJCisJbG9ja19rZXJuZWwoKTsKKworCXJlc3VsdCA9IHNtYl9wcm9jX2Rza2F0dHIoc2IsIGJ1Zik7CisKKwl1bmxvY2tfa2VybmVsKCk7CisKKwlidWYtPmZfdHlwZSA9IFNNQl9TVVBFUl9NQUdJQzsKKwlidWYtPmZfbmFtZWxlbiA9IFNNQl9NQVhQQVRITEVOOworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBzbWJfZ2V0YXR0cihzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXQgKnN0YXQpCit7CisJaW50IGVyciA9IHNtYl9yZXZhbGlkYXRlX2lub2RlKGRlbnRyeSk7CisJaWYgKCFlcnIpCisJCWdlbmVyaWNfZmlsbGF0dHIoZGVudHJ5LT5kX2lub2RlLCBzdGF0KTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQKK3NtYl9ub3RpZnlfY2hhbmdlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICphdHRyKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIgPSBzZXJ2ZXJfZnJvbV9kZW50cnkoZGVudHJ5KTsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IChTX0lGUkVHIHwgU19JRkRJUiB8IFNfSVJXWFVHTyk7CisJaW50IGVycm9yLCBjaGFuZ2VkLCByZWZyZXNoID0gMDsKKwlzdHJ1Y3Qgc21iX2ZhdHRyIGZhdHRyOworCisJbG9ja19rZXJuZWwoKTsKKworCWVycm9yID0gc21iX3JldmFsaWRhdGVfaW5vZGUoZGVudHJ5KTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCisJaWYgKChlcnJvciA9IGlub2RlX2NoYW5nZV9vayhpbm9kZSwgYXR0cikpIDwgMCkKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IC1FUEVSTTsKKwlpZiAoKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9VSUQpICYmIChhdHRyLT5pYV91aWQgIT0gc2VydmVyLT5tbnQtPnVpZCkpCisJCWdvdG8gb3V0OworCisJaWYgKChhdHRyLT5pYV92YWxpZCAmIEFUVFJfR0lEKSAmJiAoYXR0ci0+aWFfdWlkICE9IHNlcnZlci0+bW50LT5naWQpKQorCQlnb3RvIG91dDsKKworCWlmICgoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01PREUpICYmIChhdHRyLT5pYV9tb2RlICYgfm1hc2spKQorCQlnb3RvIG91dDsKKworCWlmICgoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpICE9IDApIHsKKwkJVkVSQk9TRSgiY2hhbmdpbmcgJXMvJXMsIG9sZCBzaXplPSVsZCwgbmV3IHNpemU9JWxkXG4iLAorCQkJREVOVFJZX1BBVEgoZGVudHJ5KSwKKwkJCShsb25nKSBpbm9kZS0+aV9zaXplLCAobG9uZykgYXR0ci0+aWFfc2l6ZSk7CisKKwkJZmlsZW1hcF9mZGF0YXdyaXRlKGlub2RlLT5pX21hcHBpbmcpOworCQlmaWxlbWFwX2ZkYXRhd2FpdChpbm9kZS0+aV9tYXBwaW5nKTsKKworCQllcnJvciA9IHNtYl9vcGVuKGRlbnRyeSwgT19XUk9OTFkpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dDsKKwkJZXJyb3IgPSBzZXJ2ZXItPm9wcy0+dHJ1bmNhdGUoaW5vZGUsIGF0dHItPmlhX3NpemUpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dDsKKwkJZXJyb3IgPSB2bXRydW5jYXRlKGlub2RlLCBhdHRyLT5pYV9zaXplKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXQ7CisJCXJlZnJlc2ggPSAxOworCX0KKworCWlmIChzZXJ2ZXItPm9wdC5jYXBhYmlsaXRpZXMgJiBTTUJfQ0FQX1VOSVgpIHsKKwkJLyogRm9yIG5vdyB3ZSBkb24ndCB3YW50IHRvIHNldCB0aGUgc2l6ZSB3aXRoIHNldGF0dHJfdW5peCAqLworCQlhdHRyLT5pYV92YWxpZCAmPSB+QVRUUl9TSVpFOworCQkvKiBGSVhNRTogb25seSBjYWxsIGlmIHdlIGFjdHVhbGx5IHdhbnQgdG8gc2V0IHNvbWV0aGluZz8gKi8KKwkJZXJyb3IgPSBzbWJfcHJvY19zZXRhdHRyX3VuaXgoZGVudHJ5LCBhdHRyLCAwLCAwKTsKKwkJaWYgKCFlcnJvcikKKwkJCXJlZnJlc2ggPSAxOworCisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgZmF0dHIgYW5kIGNoZWNrIGZvciBjaGFuZ2VkIGZpZWxkcy4KKwkgKiBOb3RlOiBDVElNRSB1bmRlciBTTUIgaXMgY3JlYXRpb24gdGltZSByYXRoZXIgdGhhbgorCSAqIGNoYW5nZSB0aW1lLCBzbyB3ZSBkb24ndCBhdHRlbXB0IHRvIGNoYW5nZSBpdC4KKwkgKi8KKwlzbWJfZ2V0X2lub2RlX2F0dHIoaW5vZGUsICZmYXR0cik7CisKKwljaGFuZ2VkID0gMDsKKwlpZiAoKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9NVElNRSkgIT0gMCkgeworCQlmYXR0ci5mX210aW1lID0gYXR0ci0+aWFfbXRpbWU7CisJCWNoYW5nZWQgPSAxOworCX0KKwlpZiAoKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9BVElNRSkgIT0gMCkgeworCQlmYXR0ci5mX2F0aW1lID0gYXR0ci0+aWFfYXRpbWU7CisJCS8qIEVhcmxpZXIgcHJvdG9jb2xzIGRvbid0IGhhdmUgYW4gYWNjZXNzIHRpbWUgKi8KKwkJaWYgKHNlcnZlci0+b3B0LnByb3RvY29sID49IFNNQl9QUk9UT0NPTF9MQU5NQU4yKQorCQkJY2hhbmdlZCA9IDE7CisJfQorCWlmIChjaGFuZ2VkKSB7CisJCWVycm9yID0gc21iX3Byb2Nfc2V0dGltZShkZW50cnksICZmYXR0cik7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gb3V0OworCQlyZWZyZXNoID0gMTsKKwl9CisKKwkvKgorCSAqIENoZWNrIGZvciBtb2RlIGNoYW5nZXMgLi4uIHdlJ3JlIGV4dHJlbWVseSBsaW1pdGVkIGluCisJICogd2hhdCBjYW4gYmUgc2V0IGZvciBTTUIgc2VydmVyczoganVzdCB0aGUgcmVhZC1vbmx5IGJpdC4KKwkgKi8KKwlpZiAoKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9NT0RFKSAhPSAwKSB7CisJCVZFUkJPU0UoIiVzLyVzIG1vZGUgY2hhbmdlLCBvbGQ9JXgsIG5ldz0leFxuIiwKKwkJCURFTlRSWV9QQVRIKGRlbnRyeSksIGZhdHRyLmZfbW9kZSwgYXR0ci0+aWFfbW9kZSk7CisJCWNoYW5nZWQgPSAwOworCQlpZiAoYXR0ci0+aWFfbW9kZSAmIFNfSVdVU1IpIHsKKwkJCWlmIChmYXR0ci5hdHRyICYgYVJPTkxZKSB7CisJCQkJZmF0dHIuYXR0ciAmPSB+YVJPTkxZOworCQkJCWNoYW5nZWQgPSAxOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKCEoZmF0dHIuYXR0ciAmIGFST05MWSkpIHsKKwkJCQlmYXR0ci5hdHRyIHw9IGFST05MWTsKKwkJCQljaGFuZ2VkID0gMTsKKwkJCX0KKwkJfQorCQlpZiAoY2hhbmdlZCkgeworCQkJZXJyb3IgPSBzbWJfcHJvY19zZXRhdHRyKGRlbnRyeSwgJmZhdHRyKTsKKwkJCWlmIChlcnJvcikKKwkJCQlnb3RvIG91dDsKKwkJCXJlZnJlc2ggPSAxOworCQl9CisJfQorCWVycm9yID0gMDsKKworb3V0OgorCWlmIChyZWZyZXNoKQorCQlzbWJfcmVmcmVzaF9pbm9kZShkZW50cnkpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKyNpZmRlZiBERUJVR19TTUJfTUFMTE9DCitpbnQgc21iX21hbGxvY2VkOworaW50IHNtYl9jdXJyZW50X2ttYWxsb2NlZDsKK2ludCBzbWJfY3VycmVudF92bWFsbG9jZWQ7CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqc21iX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoreworCXJldHVybiBnZXRfc2Jfbm9kZXYoZnNfdHlwZSwgZmxhZ3MsIGRhdGEsIHNtYl9maWxsX3N1cGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHNtYl9mc190eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAic21iZnMiLAorCS5nZXRfc2IJCT0gc21iX2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfYW5vbl9zdXBlciwKKwkuZnNfZmxhZ3MJPSBGU19CSU5BUllfTU9VTlREQVRBLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9zbWJfZnModm9pZCkKK3sKKwlpbnQgZXJyOworCURFQlVHMSgicmVnaXN0ZXJpbmcgLi4uXG4iKTsKKworI2lmZGVmIERFQlVHX1NNQl9NQUxMT0MKKwlzbWJfbWFsbG9jZWQgPSAwOworCXNtYl9jdXJyZW50X2ttYWxsb2NlZCA9IDA7CisJc21iX2N1cnJlbnRfdm1hbGxvY2VkID0gMDsKKyNlbmRpZgorCisJZXJyID0gaW5pdF9pbm9kZWNhY2hlKCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfaW5vZGU7CisJZXJyID0gc21iX2luaXRfcmVxdWVzdF9jYWNoZSgpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X3JlcXVlc3Q7CisJZXJyID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmc21iX2ZzX3R5cGUpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCXJldHVybiAwOworb3V0OgorCXNtYl9kZXN0cm95X3JlcXVlc3RfY2FjaGUoKTsKK291dF9yZXF1ZXN0OgorCWRlc3Ryb3lfaW5vZGVjYWNoZSgpOworb3V0X2lub2RlOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X3NtYl9mcyh2b2lkKQoreworCURFQlVHMSgidW5yZWdpc3RlcmluZyAuLi5cbiIpOworCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmc21iX2ZzX3R5cGUpOworCXNtYl9kZXN0cm95X3JlcXVlc3RfY2FjaGUoKTsKKwlkZXN0cm95X2lub2RlY2FjaGUoKTsKKyNpZmRlZiBERUJVR19TTUJfTUFMTE9DCisJcHJpbnRrKEtFUk5fREVCVUcgInNtYl9tYWxsb2NlZDogJWRcbiIsIHNtYl9tYWxsb2NlZCk7CisJcHJpbnRrKEtFUk5fREVCVUcgInNtYl9jdXJyZW50X2ttYWxsb2NlZDogJWRcbiIsc21iX2N1cnJlbnRfa21hbGxvY2VkKTsKKwlwcmludGsoS0VSTl9ERUJVRyAic21iX2N1cnJlbnRfdm1hbGxvY2VkOiAlZFxuIixzbWJfY3VycmVudF92bWFsbG9jZWQpOworI2VuZGlmCit9CisKK21vZHVsZV9pbml0KGluaXRfc21iX2ZzKQorbW9kdWxlX2V4aXQoZXhpdF9zbWJfZnMpCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9mcy9zbWJmcy9pb2N0bC5jIGIvZnMvc21iZnMvaW9jdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmFlMWY4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvc21iZnMvaW9jdGwuYwpAQCAtMCwwICsxLDY3IEBACisvKgorICogIGlvY3RsLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IGJ5IFZvbGtlciBMZW5kZWNrZQorICogIENvcHlyaWdodCAoQykgMTk5NyBieSBWb2xrZXIgTGVuZGVja2UKKyAqCisgKiAgUGxlYXNlIGFkZCBhIG5vdGUgYWJvdXQgeW91ciBjaGFuZ2VzIHRvIHNtYmZzIGluIHRoZSBDaGFuZ2VMb2cgZmlsZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaHVpZC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorCisjaW5jbHVkZSA8bGludXgvc21iX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc21iX21vdW50Lmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAicHJvdG8uaCIKKworaW50CitzbWJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHAsCisJICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciA9IHNlcnZlcl9mcm9tX2lub2RlKGlub2RlKTsKKwlzdHJ1Y3Qgc21iX2Nvbm5fb3B0IG9wdDsKKwlpbnQgcmVzdWx0ID0gLUVJTlZBTDsKKworCXN3aXRjaCAoY21kKSB7CisJCXVpZDE2X3QgdWlkMTY7CisJCXVpZF90IHVpZDMyOworCWNhc2UgU01CX0lPQ19HRVRNT1VOVFVJRDoKKwkJU0VUX1VJRCh1aWQxNiwgc2VydmVyLT5tbnQtPm1vdW50ZWRfdWlkKTsKKwkJcmVzdWx0ID0gcHV0X3VzZXIodWlkMTYsICh1aWQxNl90IF9fdXNlciAqKSBhcmcpOworCQlicmVhazsKKwljYXNlIFNNQl9JT0NfR0VUTU9VTlRVSUQzMjoKKwkJU0VUX1VJRCh1aWQzMiwgc2VydmVyLT5tbnQtPm1vdW50ZWRfdWlkKTsKKwkJcmVzdWx0ID0gcHV0X3VzZXIodWlkMzIsICh1aWRfdCBfX3VzZXIgKikgYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIFNNQl9JT0NfTkVXQ09OTjoKKwkJLyogYXJnIGlzIHNtYl9jb25uX29wdCwgb3IgTlVMTCBpZiBubyBjb25uZWN0aW9uIHdhcyBtYWRlICovCisJCWlmICghYXJnKSB7CisJCQlyZXN1bHQgPSAwOworCQkJc21iX2xvY2tfc2VydmVyKHNlcnZlcik7CisJCQlzZXJ2ZXItPnN0YXRlID0gQ09OTl9SRVRSSUVEOworCQkJcHJpbnRrKEtFUk5fRVJSICJDb25uZWN0aW9uIGF0dGVtcHQgZmFpbGVkISAgWyVkXVxuIiwKKwkJCSAgICAgICBzZXJ2ZXItPmNvbm5fZXJyb3IpOworCQkJc21iaW9kX2ZsdXNoKHNlcnZlcik7CisJCQlzbWJfdW5sb2NrX3NlcnZlcihzZXJ2ZXIpOworCQkJYnJlYWs7CisJCX0KKworCQlyZXN1bHQgPSAtRUZBVUxUOworCQlpZiAoIWNvcHlfZnJvbV91c2VyKCZvcHQsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKG9wdCkpKQorCQkJcmVzdWx0ID0gc21iX25ld2Nvbm4oc2VydmVyLCAmb3B0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2ZzL3NtYmZzL3Byb2MuYyBiL2ZzL3NtYmZzL3Byb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjBiYWJlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvc21iZnMvcHJvYy5jCkBAIC0wLDAgKzEsMzUwOSBAQAorLyoKKyAqICBwcm9jLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2IGJ5IFBhYWwtS3IuIEVuZ3N0YWQgYW5kIFZvbGtlciBMZW5kZWNrZQorICogIENvcHlyaWdodCAoQykgMTk5NyBieSBWb2xrZXIgTGVuZGVja2UKKyAqCisgKiAgUGxlYXNlIGFkZCBhIG5vdGUgYWJvdXQgeW91ciBjaGFuZ2VzIHRvIHNtYmZzIGluIHRoZSBDaGFuZ2VMb2cgZmlsZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9kY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kaXJlbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9ubHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtYl9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtYm5vLmg+CisjaW5jbHVkZSA8bGludXgvc21iX21vdW50Lmg+CisKKyNpbmNsdWRlIDxuZXQvc29jay5oPgorCisjaW5jbHVkZSA8YXNtL3N0cmluZy5oPgorI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorCisjaW5jbHVkZSAic21iX2RlYnVnLmgiCisjaW5jbHVkZSAicHJvdG8uaCIKKyNpbmNsdWRlICJyZXF1ZXN0LmgiCisKKworLyogRmVhdHVyZXMuIFVuZGVmaW5lIGlmIHRoZXkgY2F1c2UgcHJvYmxlbXMsIHRoaXMgc2hvdWxkIHBlcmhhcHMgYmUgYQorICAgY29uZmlnIG9wdGlvbi4gKi8KKyNkZWZpbmUgU01CRlNfUE9TSVhfVU5MSU5LIDEKKworLyogQWxsb3cgc21iX3JldHJ5IHRvIGJlIGludGVycnVwdGVkLiAqLworI2RlZmluZSBTTUJfUkVUUllfSU5UUgorCisjZGVmaW5lIFNNQl9WV1YocGFja2V0KSAgKChwYWNrZXQpICsgU01CX0hFQURFUl9MRU4pCisjZGVmaW5lIFNNQl9DTUQocGFja2V0KSAgKCoocGFja2V0KzgpKQorI2RlZmluZSBTTUJfV0NUKHBhY2tldCkgICgqKHBhY2tldCtTTUJfSEVBREVSX0xFTiAtIDEpKQorCisjZGVmaW5lIFNNQl9ESVJJTkZPX1NJWkUgNDMKKyNkZWZpbmUgU01CX1NUQVRVU19TSVpFICAyMQorCisjZGVmaW5lIFNNQl9TVF9CTEtTSVpFCShQQUdFX1NJWkUpCisjZGVmaW5lIFNNQl9TVF9CTEtTSElGVAkoUEFHRV9TSElGVCkKKworc3RhdGljIHN0cnVjdCBzbWJfb3BzIHNtYl9vcHNfY29yZTsKK3N0YXRpYyBzdHJ1Y3Qgc21iX29wcyBzbWJfb3BzX29zMjsKK3N0YXRpYyBzdHJ1Y3Qgc21iX29wcyBzbWJfb3BzX3dpbjk1Oworc3RhdGljIHN0cnVjdCBzbWJfb3BzIHNtYl9vcHNfd2luTlQ7CitzdGF0aWMgc3RydWN0IHNtYl9vcHMgc21iX29wc191bml4Oworc3RhdGljIHN0cnVjdCBzbWJfb3BzIHNtYl9vcHNfbnVsbDsKKworc3RhdGljIHZvaWQKK3NtYl9pbml0X2RpcmVudChzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgc3RydWN0IHNtYl9mYXR0ciAqZmF0dHIpOworc3RhdGljIHZvaWQKK3NtYl9maW5pc2hfZGlyZW50KHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBzdHJ1Y3Qgc21iX2ZhdHRyICpmYXR0cik7CitzdGF0aWMgaW50CitzbWJfcHJvY19nZXRhdHRyX2NvcmUoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIsIHN0cnVjdCBkZW50cnkgKmRpciwKKwkJICAgICAgc3RydWN0IHNtYl9mYXR0ciAqZmF0dHIpOworc3RhdGljIGludAorc21iX3Byb2NfZ2V0YXR0cl9mZihzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkgICAgc3RydWN0IHNtYl9mYXR0ciAqZmF0dHIpOworc3RhdGljIGludAorc21iX3Byb2Nfc2V0YXR0cl9jb3JlKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCSAgICAgIHUxNiBhdHRyKTsKK3N0YXRpYyBpbnQKK3NtYl9wcm9jX3NldGF0dHJfZXh0KHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLAorCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBzbWJfZmF0dHIgKmZhdHRyKTsKK3N0YXRpYyBpbnQKK3NtYl9wcm9jX3F1ZXJ5X2NpZnN1bml4KHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyKTsKK3N0YXRpYyB2b2lkCitpbnN0YWxsX29wcyhzdHJ1Y3Qgc21iX29wcyAqZHN0LCBzdHJ1Y3Qgc21iX29wcyAqc3JjKTsKKworCitzdGF0aWMgdm9pZAorc3RyX3VwcGVyKGNoYXIgKm5hbWUsIGludCBsZW4pCit7CisJd2hpbGUgKGxlbi0tKQorCXsKKwkJaWYgKCpuYW1lID49ICdhJyAmJiAqbmFtZSA8PSAneicpCisJCQkqbmFtZSAtPSAoJ2EnIC0gJ0EnKTsKKwkJbmFtZSsrOworCX0KK30KKworI2lmIDAKK3N0YXRpYyB2b2lkCitzdHJfbG93ZXIoY2hhciAqbmFtZSwgaW50IGxlbikKK3sKKwl3aGlsZSAobGVuLS0pCisJeworCQlpZiAoKm5hbWUgPj0gJ0EnICYmICpuYW1lIDw9ICdaJykKKwkJCSpuYW1lICs9ICgnYScgLSAnQScpOworCQluYW1lKys7CisJfQorfQorI2VuZGlmCisKKy8qIHJldmVyc2UgYSBzdHJpbmcgaW5saW5lLiBUaGlzIGlzIHVzZWQgYnkgdGhlIGRpcmNhY2hlIHdhbGtpbmcgcm91dGluZXMgKi8KK3N0YXRpYyB2b2lkIHJldmVyc2Vfc3RyaW5nKGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwljaGFyIGM7CisJY2hhciAqZW5kID0gYnVmK2xlbi0xOworCisJd2hpbGUoYnVmIDwgZW5kKSB7CisJCWMgPSAqYnVmOworCQkqKGJ1ZisrKSA9ICplbmQ7CisJCSooZW5kLS0pID0gYzsKKwl9Cit9CisKKy8qIG5vIGNvbnZlcnNpb24sIGp1c3QgYSB3cmFwcGVyIGZvciBtZW1jcHkuICovCitzdGF0aWMgaW50IGNvbnZlcnRfbWVtY3B5KHVuc2lnbmVkIGNoYXIgKm91dHB1dCwgaW50IG9sZW4sCisJCQkgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmlucHV0LCBpbnQgaWxlbiwKKwkJCSAgc3RydWN0IG5sc190YWJsZSAqbmxzX2Zyb20sCisJCQkgIHN0cnVjdCBubHNfdGFibGUgKm5sc190bykKK3sKKwlpZiAob2xlbiA8IGlsZW4pCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCW1lbWNweShvdXRwdXQsIGlucHV0LCBpbGVuKTsKKwlyZXR1cm4gaWxlbjsKK30KKworc3RhdGljIGlubGluZSBpbnQgd3JpdGVfY2hhcih1bnNpZ25lZCBjaGFyIGNoLCBjaGFyICpvdXRwdXQsIGludCBvbGVuKQoreworCWlmIChvbGVuIDwgNCkKKwkJcmV0dXJuIC1FTkFNRVRPT0xPTkc7CisJc3ByaW50ZihvdXRwdXQsICI6eCUwMngiLCBjaCk7CisJcmV0dXJuIDQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHdyaXRlX3VuaWNoYXIod2NoYXJfdCBjaCwgY2hhciAqb3V0cHV0LCBpbnQgb2xlbikKK3sKKwlpZiAob2xlbiA8IDUpCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCXNwcmludGYob3V0cHV0LCAiOiUwNHgiLCBjaCk7CisJcmV0dXJuIDU7Cit9CisKKy8qIGNvbnZlcnQgZnJvbSBvbmUgImNvZGVwYWdlIiB0byBhbm90aGVyIChwb3NzaWJseSBiZWluZyB1dGY4KS4gKi8KK3N0YXRpYyBpbnQgY29udmVydF9jcCh1bnNpZ25lZCBjaGFyICpvdXRwdXQsIGludCBvbGVuLAorCQkgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICppbnB1dCwgaW50IGlsZW4sCisJCSAgICAgIHN0cnVjdCBubHNfdGFibGUgKm5sc19mcm9tLAorCQkgICAgICBzdHJ1Y3QgbmxzX3RhYmxlICpubHNfdG8pCit7CisJaW50IGxlbiA9IDA7CisJaW50IG47CisJd2NoYXJfdCBjaDsKKworCXdoaWxlIChpbGVuID4gMCkgeworCQkvKiBjb252ZXJ0IGJ5IGNoYW5naW5nIHRvIHVuaWNvZGUgYW5kIGJhY2sgdG8gdGhlIG5ldyBjcCAqLworCQluID0gbmxzX2Zyb20tPmNoYXIydW5pKGlucHV0LCBpbGVuLCAmY2gpOworCQlpZiAobiA9PSAtRUlOVkFMKSB7CisJCQlpbGVuLS07CisJCQluID0gd3JpdGVfY2hhcigqaW5wdXQrKywgb3V0cHV0LCBvbGVuKTsKKwkJCWlmIChuIDwgMCkKKwkJCQlnb3RvIGZhaWw7CisJCQlvdXRwdXQgKz0gbjsKKwkJCW9sZW4gLT0gbjsKKwkJCWxlbiArPSBuOworCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAobiA8IDApCisJCQlnb3RvIGZhaWw7CisJCWlucHV0ICs9IG47CisJCWlsZW4gLT0gbjsKKworCQluID0gbmxzX3RvLT51bmkyY2hhcihjaCwgb3V0cHV0LCBvbGVuKTsKKwkJaWYgKG4gPT0gLUVJTlZBTCkKKwkJCW4gPSB3cml0ZV91bmljaGFyKGNoLCBvdXRwdXQsIG9sZW4pOworCQlpZiAobiA8IDApCisJCQlnb3RvIGZhaWw7CisJCW91dHB1dCArPSBuOworCQlvbGVuIC09IG47CisKKwkJbGVuICs9IG47CisJfQorCXJldHVybiBsZW47CitmYWlsOgorCXJldHVybiBuOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogbmxzX3VuaWNvZGUKKyAqCisgKiBUaGlzIGVuY29kZXMvZGVjb2RlcyBsaXR0bGUgZW5kaWFuIHVuaWNvZGUgZm9ybWF0CisgKi8KKworc3RhdGljIGludCB1bmkyY2hhcih3Y2hhcl90IHVuaSwgdW5zaWduZWQgY2hhciAqb3V0LCBpbnQgYm91bmRsZW4pCit7CisJaWYgKGJvdW5kbGVuIDwgMikKKwkJcmV0dXJuIC1FSU5WQUw7CisJKm91dCsrID0gdW5pICYgMHhmZjsKKwkqb3V0KysgPSB1bmkgPj4gODsKKwlyZXR1cm4gMjsKK30KKworc3RhdGljIGludCBjaGFyMnVuaShjb25zdCB1bnNpZ25lZCBjaGFyICpyYXdzdHJpbmcsIGludCBib3VuZGxlbiwgd2NoYXJfdCAqdW5pKQoreworCWlmIChib3VuZGxlbiA8IDIpCisJCXJldHVybiAtRUlOVkFMOworCSp1bmkgPSAocmF3c3RyaW5nWzFdIDw8IDgpIHwgcmF3c3RyaW5nWzBdOworCXJldHVybiAyOworfQorCitzdGF0aWMgc3RydWN0IG5sc190YWJsZSB1bmljb2RlX3RhYmxlID0geworCS5jaGFyc2V0CT0gInVuaWNvZGUiLAorCS51bmkyY2hhcgk9IHVuaTJjaGFyLAorCS5jaGFyMnVuaQk9IGNoYXIydW5pLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBzZXRjb2RlcGFnZShzdHJ1Y3QgbmxzX3RhYmxlICoqcCwgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbmxzX3RhYmxlICpubHM7CisKKwlpZiAoIW5hbWUgfHwgISpuYW1lKSB7CisJCW5scyA9IE5VTEw7CisJfSBlbHNlIGlmICggKG5scyA9IGxvYWRfbmxzKG5hbWUpKSA9PSBOVUxMKSB7CisJCXByaW50ayAoS0VSTl9FUlIgInNtYmZzOiBmYWlsZWQgdG8gbG9hZCBubHMgJyVzJ1xuIiwgbmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGlmIGFscmVhZHkgc2V0LCB1bmxvYWQgdGhlIHByZXZpb3VzIG9uZS4gKi8KKwlpZiAoKnAgJiYgKnAgIT0gJnVuaWNvZGVfdGFibGUpCisJCXVubG9hZF9ubHMoKnApOworCSpwID0gbmxzOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEhhbmRsZXMgYWxsIGNoYW5nZXMgdG8gY29kZXBhZ2Ugc2V0dGluZ3MuICovCitpbnQgc21iX3NldGNvZGVwYWdlKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBzdHJ1Y3Qgc21iX25sc19jb2RlcGFnZSAqY3ApCit7CisJaW50IG4gPSAwOworCisJc21iX2xvY2tfc2VydmVyKHNlcnZlcik7CisKKwkvKiBEb24ndCBsb2FkIGFueSBubHNfKiBhdCBhbGwsIGlmIG5vIHJlbW90ZSBpcyByZXF1ZXN0ZWQgKi8KKwlpZiAoISpjcC0+cmVtb3RlX25hbWUpCisJCWdvdG8gb3V0OworCisJLyogbG9jYWwgKi8KKwluID0gc2V0Y29kZXBhZ2UoJnNlcnZlci0+bG9jYWxfbmxzLCBjcC0+bG9jYWxfbmFtZSk7CisJaWYgKG4gIT0gMCkKKwkJZ290byBvdXQ7CisKKwkvKiByZW1vdGUgKi8KKwlpZiAoIXN0cmNtcChjcC0+cmVtb3RlX25hbWUsICJ1bmljb2RlIikpIHsKKwkJc2VydmVyLT5yZW1vdGVfbmxzID0gJnVuaWNvZGVfdGFibGU7CisJfSBlbHNlIHsKKwkJbiA9IHNldGNvZGVwYWdlKCZzZXJ2ZXItPnJlbW90ZV9ubHMsIGNwLT5yZW1vdGVfbmFtZSk7CisJCWlmIChuICE9IDApCisJCQlzZXRjb2RlcGFnZSgmc2VydmVyLT5sb2NhbF9ubHMsIE5VTEwpOworCX0KKworb3V0OgorCWlmIChzZXJ2ZXItPmxvY2FsX25scyAhPSBOVUxMICYmIHNlcnZlci0+cmVtb3RlX25scyAhPSBOVUxMKQorCQlzZXJ2ZXItPm9wcy0+Y29udmVydCA9IGNvbnZlcnRfY3A7CisJZWxzZQorCQlzZXJ2ZXItPm9wcy0+Y29udmVydCA9IGNvbnZlcnRfbWVtY3B5OworCisJc21iX3VubG9ja19zZXJ2ZXIoc2VydmVyKTsKKwlyZXR1cm4gbjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRW5jb2RpbmcvRGVjb2Rpbmcgc2VjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBfX3U4ICoKK3NtYl9lbmNvZGVfc21iX2xlbmd0aChfX3U4ICogcCwgX191MzIgbGVuKQoreworCSpwID0gMDsKKwkqKHArMSkgPSAwOworCSoocCsyKSA9IChsZW4gJiAweEZGMDApID4+IDg7CisJKihwKzMpID0gKGxlbiAmIDB4RkYpOworCWlmIChsZW4gPiAweEZGRkYpCisJeworCQkqKHArMSkgPSAxOworCX0KKwlyZXR1cm4gcCArIDQ7Cit9CisKKy8qCisgKiBzbWJfYnVpbGRfcGF0aDogYnVpbGQgdGhlIHBhdGggdG8gZW50cnkgYW5kIG5hbWUgc3RvcmluZyBpdCBpbiBidWYuCisgKiBUaGUgcGF0aCByZXR1cm5lZCB3aWxsIGhhdmUgdGhlIHRyYWlsaW5nICdcMCcuCisgKi8KK3N0YXRpYyBpbnQgc21iX2J1aWxkX3BhdGgoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCSAgaW50IG1heGxlbiwKKwkJCSAgc3RydWN0IGRlbnRyeSAqZW50cnksIHN0cnVjdCBxc3RyICpuYW1lKQoreworCXVuc2lnbmVkIGNoYXIgKnBhdGggPSBidWY7CisJaW50IGxlbjsKKwlpbnQgdW5pY29kZSA9IChzZXJ2ZXItPm1udC0+ZmxhZ3MgJiBTTUJfTU9VTlRfVU5JQ09ERSkgIT0gMDsKKworCWlmIChtYXhsZW4gPCAoMjw8dW5pY29kZSkpCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJaWYgKG1heGxlbiA+IFNNQl9NQVhQQVRITEVOICsgMSkKKwkJbWF4bGVuID0gU01CX01BWFBBVEhMRU4gKyAxOworCisJaWYgKGVudHJ5ID09IE5VTEwpCisJCWdvdG8gdGVzdF9uYW1lX2FuZF9vdXQ7CisKKwkvKgorCSAqIElmIElTX1JPT1QsIHdlIGhhdmUgdG8gZG8gbm8gd2Fsa2luZyBhdCBhbGwuCisJICovCisJaWYgKElTX1JPT1QoZW50cnkpICYmICFuYW1lKSB7CisJCSpwYXRoKysgPSAnXFwnOworCQlpZiAodW5pY29kZSkgKnBhdGgrKyA9ICdcMCc7CisJCSpwYXRoKysgPSAnXDAnOworCQlpZiAodW5pY29kZSkgKnBhdGgrKyA9ICdcMCc7CisJCXJldHVybiBwYXRoLWJ1ZjsKKwl9CisKKwkvKgorCSAqIEJ1aWxkIHRoZSBwYXRoIHN0cmluZyB3YWxraW5nIHRoZSB0cmVlIGJhY2t3YXJkIGZyb20gZW5kIHRvIFJPT1QKKwkgKiBhbmQgc3RvcmUgaXQgaW4gcmV2ZXJzZWQgb3JkZXIgW3NlZSByZXZlcnNlX3N0cmluZygpXQorCSAqLworCWRnZXQoZW50cnkpOworCXNwaW5fbG9jaygmZW50cnktPmRfbG9jayk7CisJd2hpbGUgKCFJU19ST09UKGVudHJ5KSkgeworCQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQ7CisKKwkJaWYgKG1heGxlbiA8ICgzPDx1bmljb2RlKSkgeworCQkJc3Bpbl91bmxvY2soJmVudHJ5LT5kX2xvY2spOworCQkJZHB1dChlbnRyeSk7CisJCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKwkJfQorCisJCWxlbiA9IHNlcnZlci0+b3BzLT5jb252ZXJ0KHBhdGgsIG1heGxlbi0yLCAKKwkJCQkgICAgICBlbnRyeS0+ZF9uYW1lLm5hbWUsIGVudHJ5LT5kX25hbWUubGVuLAorCQkJCSAgICAgIHNlcnZlci0+bG9jYWxfbmxzLCBzZXJ2ZXItPnJlbW90ZV9ubHMpOworCQlpZiAobGVuIDwgMCkgeworCQkJc3Bpbl91bmxvY2soJmVudHJ5LT5kX2xvY2spOworCQkJZHB1dChlbnRyeSk7CisJCQlyZXR1cm4gbGVuOworCQl9CisJCXJldmVyc2Vfc3RyaW5nKHBhdGgsIGxlbik7CisJCXBhdGggKz0gbGVuOworCQlpZiAodW5pY29kZSkgeworCQkJLyogTm90ZTogcmV2ZXJzZSBvcmRlciAqLworCQkJKnBhdGgrKyA9ICdcMCc7CisJCQltYXhsZW4tLTsKKwkJfQorCQkqcGF0aCsrID0gJ1xcJzsKKwkJbWF4bGVuIC09IGxlbisxOworCisJCXBhcmVudCA9IGVudHJ5LT5kX3BhcmVudDsKKwkJZGdldChwYXJlbnQpOworCQlzcGluX3VubG9jaygmZW50cnktPmRfbG9jayk7CisJCWRwdXQoZW50cnkpOworCQllbnRyeSA9IHBhcmVudDsKKwkJc3Bpbl9sb2NrKCZlbnRyeS0+ZF9sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2soJmVudHJ5LT5kX2xvY2spOworCWRwdXQoZW50cnkpOworCXJldmVyc2Vfc3RyaW5nKGJ1ZiwgcGF0aC1idWYpOworCisJLyogbWF4bGVuIGhhcyBzcGFjZSBmb3IgYXQgbGVhc3Qgb25lIGNoYXIgKi8KK3Rlc3RfbmFtZV9hbmRfb3V0OgorCWlmIChuYW1lKSB7CisJCWlmIChtYXhsZW4gPCAoMzw8dW5pY29kZSkpCisJCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKwkJKnBhdGgrKyA9ICdcXCc7CisJCWlmICh1bmljb2RlKSB7CisJCQkqcGF0aCsrID0gJ1wwJzsKKwkJCW1heGxlbi0tOworCQl9CisJCWxlbiA9IHNlcnZlci0+b3BzLT5jb252ZXJ0KHBhdGgsIG1heGxlbi0yLCAKKwkJCQkgICAgICBuYW1lLT5uYW1lLCBuYW1lLT5sZW4sCisJCQkJICAgICAgc2VydmVyLT5sb2NhbF9ubHMsIHNlcnZlci0+cmVtb3RlX25scyk7CisJCWlmIChsZW4gPCAwKQorCQkJcmV0dXJuIGxlbjsKKwkJcGF0aCArPSBsZW47CisJCW1heGxlbiAtPSBsZW4rMTsKKwl9CisJLyogbWF4bGVuIGhhcyBzcGFjZSBmb3IgYXQgbGVhc3Qgb25lIGNoYXIgKi8KKwkqcGF0aCsrID0gJ1wwJzsKKwlpZiAodW5pY29kZSkgKnBhdGgrKyA9ICdcMCc7CisJcmV0dXJuIHBhdGgtYnVmOworfQorCitzdGF0aWMgaW50IHNtYl9lbmNvZGVfcGF0aChzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgY2hhciAqYnVmLCBpbnQgbWF4bGVuLAorCQkJICAgc3RydWN0IGRlbnRyeSAqZGlyLCBzdHJ1Y3QgcXN0ciAqbmFtZSkKK3sKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gc21iX2J1aWxkX3BhdGgoc2VydmVyLCBidWYsIG1heGxlbiwgZGlyLCBuYW1lKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBvdXQ7CisJaWYgKHNlcnZlci0+b3B0LnByb3RvY29sIDw9IFNNQl9QUk9UT0NPTF9DT1JFUExVUykKKwkJc3RyX3VwcGVyKGJ1ZiwgcmVzdWx0KTsKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBlbmNvZGVfcGF0aCBmb3Igbm9uLXRyYW5zMiByZXF1ZXN0IFNNQnMgKi8KK3N0YXRpYyBpbnQgc21iX3NpbXBsZV9lbmNvZGVfcGF0aChzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcSwgY2hhciAqKnAsCisJCQkJICBzdHJ1Y3QgZGVudHJ5ICogZW50cnksIHN0cnVjdCBxc3RyICogbmFtZSkKK3sKKwlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciA9IHJlcS0+cnFfc2VydmVyOworCWNoYXIgKnMgPSAqcDsKKwlpbnQgcmVzOworCWludCBtYXhsZW4gPSAoKGNoYXIgKilyZXEtPnJxX2J1ZmZlciArIHJlcS0+cnFfYnVmc2l6ZSkgLSBzOworCWludCB1bmljb2RlID0gKHNlcnZlci0+bW50LT5mbGFncyAmIFNNQl9NT1VOVF9VTklDT0RFKTsKKworCWlmICghbWF4bGVuKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKwkqcysrID0gNDsJLyogQVNDSUkgZGF0YSBmb3JtYXQgKi8KKworCS8qCisJICogU01CIFVuaWNvZGUgc3RyaW5ncyBtdXN0IGJlIDE2Yml0IGFsaWduZWQgcmVsYXRpdmUgdGhlIHN0YXJ0IG9mIHRoZQorCSAqIHBhY2tldC4gSWYgdGhleSBhcmUgbm90IHRoZXkgbXVzdCBiZSBwYWRkZWQgd2l0aCAwLgorCSAqLworCWlmICh1bmljb2RlKSB7CisJCWludCBhbGlnbiA9IHMgLSAoY2hhciAqKXJlcS0+cnFfYnVmZmVyOworCQlpZiAoIShhbGlnbiAmIDEpKSB7CisJCQkqcysrID0gJ1wwJzsKKwkJCW1heGxlbi0tOworCQl9CisJfQorCisJcmVzID0gc21iX2VuY29kZV9wYXRoKHNlcnZlciwgcywgbWF4bGVuLTEsIGVudHJ5LCBuYW1lKTsKKwlpZiAocmVzIDwgMCkKKwkJcmV0dXJuIHJlczsKKwkqcCA9IHMgKyByZXM7CisJcmV0dXJuIDA7Cit9CisKKy8qIFRoZSBmb2xsb3dpbmcgYXJlIHRha2VuIGRpcmVjdGx5IGZyb20gbXNkb3MtZnMgKi8KKworLyogTGluZWFyIGRheSBudW1iZXJzIG9mIHRoZSByZXNwZWN0aXZlIDFzdHMgaW4gbm9uLWxlYXAgeWVhcnMuICovCisKK3N0YXRpYyBpbnQgZGF5X25bXSA9Cit7MCwgMzEsIDU5LCA5MCwgMTIwLCAxNTEsIDE4MSwgMjEyLCAyNDMsIDI3MywgMzA0LCAzMzQsIDAsIDAsIDAsIDB9OworCQkgIC8qIEphbkZlYk1hckFwciBNYXkgSnVuIEp1bCBBdWcgU2VwIE9jdCBOb3YgRGVjICovCisKKworc3RhdGljIHRpbWVfdAordXRjMmxvY2FsKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCB0aW1lX3QgdGltZSkKK3sKKwlyZXR1cm4gdGltZSAtIHNlcnZlci0+b3B0LnNlcnZlcnpvbmUqNjA7Cit9CisKK3N0YXRpYyB0aW1lX3QKK2xvY2FsMnV0YyhzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgdGltZV90IHRpbWUpCit7CisJcmV0dXJuIHRpbWUgKyBzZXJ2ZXItPm9wdC5zZXJ2ZXJ6b25lKjYwOworfQorCisvKiBDb252ZXJ0IGEgTVMtRE9TIHRpbWUvZGF0ZSBwYWlyIHRvIGEgVU5JWCBkYXRlIChzZWNvbmRzIHNpbmNlIDEgMSA3MCkuICovCisKK3N0YXRpYyB0aW1lX3QKK2RhdGVfZG9zMnVuaXgoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIsIF9fdTE2IGRhdGUsIF9fdTE2IHRpbWUpCit7CisJaW50IG1vbnRoLCB5ZWFyOworCXRpbWVfdCBzZWNzOworCisJLyogZmlyc3Qgc3VidHJhY3QgYW5kIG1hc2sgYWZ0ZXIgdGhhdC4uLiBPdGhlcndpc2UsIGlmCisJICAgZGF0ZSA9PSAwLCBiYWQgdGhpbmdzIGhhcHBlbiAqLworCW1vbnRoID0gKChkYXRlID4+IDUpIC0gMSkgJiAxNTsKKwl5ZWFyID0gZGF0ZSA+PiA5OworCXNlY3MgPSAodGltZSAmIDMxKSAqIDIgKyA2MCAqICgodGltZSA+PiA1KSAmIDYzKSArICh0aW1lID4+IDExKSAqIDM2MDAgKyA4NjQwMCAqCisJICAgICgoZGF0ZSAmIDMxKSAtIDEgKyBkYXlfblttb250aF0gKyAoeWVhciAvIDQpICsgeWVhciAqIDM2NSAtICgoeWVhciAmIDMpID09IDAgJiYKKwkJCQkJCSAgIG1vbnRoIDwgMiA/IDEgOiAwKSArIDM2NTMpOworCS8qIGRheXMgc2luY2UgMS4xLjcwIHBsdXMgODAncyBsZWFwIGRheSAqLworCXJldHVybiBsb2NhbDJ1dGMoc2VydmVyLCBzZWNzKTsKK30KKworCisvKiBDb252ZXJ0IGxpbmVhciBVTklYIGRhdGUgdG8gYSBNUy1ET1MgdGltZS9kYXRlIHBhaXIuICovCisKK3N0YXRpYyB2b2lkCitkYXRlX3VuaXgyZG9zKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLAorCSAgICAgIGludCB1bml4X2RhdGUsIF9fdTE2ICpkYXRlLCBfX3UxNiAqdGltZSkKK3sKKwlpbnQgZGF5LCB5ZWFyLCBubF9kYXksIG1vbnRoOworCisJdW5peF9kYXRlID0gdXRjMmxvY2FsKHNlcnZlciwgdW5peF9kYXRlKTsKKwlpZiAodW5peF9kYXRlIDwgMzE1NTMyODAwKQorCQl1bml4X2RhdGUgPSAzMTU1MzI4MDA7CisKKwkqdGltZSA9ICh1bml4X2RhdGUgJSA2MCkgLyAyICsKKwkJKCgodW5peF9kYXRlIC8gNjApICUgNjApIDw8IDUpICsKKwkJKCgodW5peF9kYXRlIC8gMzYwMCkgJSAyNCkgPDwgMTEpOworCisJZGF5ID0gdW5peF9kYXRlIC8gODY0MDAgLSAzNjUyOworCXllYXIgPSBkYXkgLyAzNjU7CisJaWYgKCh5ZWFyICsgMykgLyA0ICsgMzY1ICogeWVhciA+IGRheSkKKwkJeWVhci0tOworCWRheSAtPSAoeWVhciArIDMpIC8gNCArIDM2NSAqIHllYXI7CisJaWYgKGRheSA9PSA1OSAmJiAhKHllYXIgJiAzKSkgeworCQlubF9kYXkgPSBkYXk7CisJCW1vbnRoID0gMjsKKwl9IGVsc2UgeworCQlubF9kYXkgPSAoeWVhciAmIDMpIHx8IGRheSA8PSA1OSA/IGRheSA6IGRheSAtIDE7CisJCWZvciAobW9udGggPSAwOyBtb250aCA8IDEyOyBtb250aCsrKQorCQkJaWYgKGRheV9uW21vbnRoXSA+IG5sX2RheSkKKwkJCQlicmVhazsKKwl9CisJKmRhdGUgPSBubF9kYXkgLSBkYXlfblttb250aCAtIDFdICsgMSArIChtb250aCA8PCA1KSArICh5ZWFyIDw8IDkpOworfQorCisvKiBUaGUgZm9sbG93aW5nIGFyZSB0YWtlbiBmcm9tIGZzL250ZnMvdXRpbC5jICovCisKKyNkZWZpbmUgTlRGU19USU1FX09GRlNFVCAoKHU2NCkoMzY5KjM2NSArIDg5KSAqIDI0ICogMzYwMCAqIDEwMDAwMDAwKQorCisvKgorICogQ29udmVydCB0aGUgTlQgVVRDIChiYXNlZCAxNjAxLTAxLTAxLCBpbiBodW5kcmVkIG5hbm9zZWNvbmQgdW5pdHMpCisgKiBpbnRvIFVuaXggVVRDIChiYXNlZCAxOTcwLTAxLTAxLCBpbiBzZWNvbmRzKS4KKyAqLworc3RhdGljIHN0cnVjdCB0aW1lc3BlYworc21iX250dXRjMnVuaXh1dGModTY0IG50dXRjKQoreworCXN0cnVjdCB0aW1lc3BlYyB0czsKKwkvKiBGSVhNRTogd2hhdCBhYm91dCB0aGUgdGltZXpvbmUgZGlmZmVyZW5jZT8gKi8KKwkvKiBTdWJ0cmFjdCB0aGUgTlRGUyB0aW1lIG9mZnNldCwgdGhlbiBjb252ZXJ0IHRvIDFzIGludGVydmFscy4gKi8KKwl1NjQgdCA9IG50dXRjIC0gTlRGU19USU1FX09GRlNFVDsKKwl0cy50dl9uc2VjID0gZG9fZGl2KHQsIDEwMDAwMDAwKSAqIDEwMDsKKwl0cy50dl9zZWMgPSB0OyAKKwlyZXR1cm4gdHM7Cit9CisKKy8qIENvbnZlcnQgdGhlIFVuaXggVVRDIGludG8gTlQgdGltZSAqLworc3RhdGljIHU2NAorc21iX3VuaXh1dGMybnR1dGMoc3RydWN0IHRpbWVzcGVjIHRzKQoreworCS8qIE5vdGU6IHRpbWV6b25lIGNvbnZlcnNpb24gaXMgcHJvYmFibHkgd3JvbmcuICovCisJLyogcmV0dXJuICgodTY0KXV0YzJsb2NhbChzZXJ2ZXIsIHQpKSAqIDEwMDAwMDAwICsgTlRGU19USU1FX09GRlNFVDsgKi8KKwlyZXR1cm4gKCh1NjQpdHMudHZfc2VjKSAqIDEwMDAwMDAwICsgdHMudHZfbnNlYy8xMDAgKyBOVEZTX1RJTUVfT0ZGU0VUOworfQorCisjZGVmaW5lIE1BWF9GSUxFX01PREUJNgorc3RhdGljIG1vZGVfdCBmaWxlX21vZGVbXSA9IHsKKwlTX0lGUkVHLCBTX0lGRElSLCBTX0lGTE5LLCBTX0lGQ0hSLCBTX0lGQkxLLCBTX0lGSUZPLCBTX0lGU09DSworfTsKKworc3RhdGljIGludCBzbWJfZmlsZXR5cGVfdG9fbW9kZSh1MzIgZmlsZXR5cGUpCit7CisJaWYgKGZpbGV0eXBlID4gTUFYX0ZJTEVfTU9ERSkgeworCQlQQVJBTk9JQSgiRmlsZXR5cGUgb3V0IG9mIHJhbmdlOiAlZFxuIiwgZmlsZXR5cGUpOworCQlyZXR1cm4gU19JRlJFRzsKKwl9CisJcmV0dXJuIGZpbGVfbW9kZVtmaWxldHlwZV07Cit9CisKK3N0YXRpYyB1MzIgc21iX2ZpbGV0eXBlX2Zyb21fbW9kZShpbnQgbW9kZSkKK3sKKwlpZiAoU19JU1JFRyhtb2RlKSkKKwkJcmV0dXJuIFVOSVhfVFlQRV9GSUxFOworCWlmIChTX0lTRElSKG1vZGUpKQorCQlyZXR1cm4gVU5JWF9UWVBFX0RJUjsKKwlpZiAoU19JU0xOSyhtb2RlKSkKKwkJcmV0dXJuIFVOSVhfVFlQRV9TWU1MSU5LOworCWlmIChTX0lTQ0hSKG1vZGUpKQorCQlyZXR1cm4gVU5JWF9UWVBFX0NIQVJERVY7CisJaWYgKFNfSVNCTEsobW9kZSkpCisJCXJldHVybiBVTklYX1RZUEVfQkxLREVWOworCWlmIChTX0lTRklGTyhtb2RlKSkKKwkJcmV0dXJuIFVOSVhfVFlQRV9GSUZPOworCWlmIChTX0lTU09DSyhtb2RlKSkKKwkJcmV0dXJuIFVOSVhfVFlQRV9TT0NLRVQ7CisJcmV0dXJuIFVOSVhfVFlQRV9VTktOT1dOOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTdXBwb3J0IHNlY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworX191MzIKK3NtYl9sZW4oX191OCAqIHApCit7CisJcmV0dXJuICgoKihwKzEpICYgMHgxKSA8PCAxNkwpIHwgKCoocCsyKSA8PCA4TCkgfCAqKHArMyk7Cit9CisKK3N0YXRpYyBfX3UxNgorc21iX2JjYyhfX3U4ICogcGFja2V0KQoreworCWludCBwb3MgPSBTTUJfSEVBREVSX0xFTiArIFNNQl9XQ1QocGFja2V0KSAqIHNpemVvZihfX3UxNik7CisJcmV0dXJuIFdWQUwocGFja2V0LCBwb3MpOworfQorCisvKiBzbWJfdmFsaWRfcGFja2V0OiBXZSBjaGVjayBpZiBwYWNrZXQgZnVsZmlsbHMgdGhlIGJhc2ljCisgICByZXF1aXJlbWVudHMgb2YgYSBzbWIgcGFja2V0ICovCisKK3N0YXRpYyBpbnQKK3NtYl92YWxpZF9wYWNrZXQoX191OCAqIHBhY2tldCkKK3sKKwlyZXR1cm4gKHBhY2tldFs0XSA9PSAweGZmCisJCSYmIHBhY2tldFs1XSA9PSAnUycKKwkJJiYgcGFja2V0WzZdID09ICdNJworCQkmJiBwYWNrZXRbN10gPT0gJ0InCisJCSYmIChzbWJfbGVuKHBhY2tldCkgKyA0ID09IFNNQl9IRUFERVJfTEVOCisJCSAgICArIFNNQl9XQ1QocGFja2V0KSAqIDIgKyBzbWJfYmNjKHBhY2tldCkpKTsKK30KKworLyogc21iX3ZlcmlmeTogV2UgY2hlY2sgaWYgd2UgZ290IHRoZSBhbnN3ZXIgd2UgZXhwZWN0ZWQsIGFuZCBpZiB3ZQorICAgZ290IGVub3VnaCBkYXRhLiBJZiBiY2MgPT0gLTEsIHdlIGRvbid0IGNhcmUuICovCisKK3N0YXRpYyBpbnQKK3NtYl92ZXJpZnkoX191OCAqIHBhY2tldCwgaW50IGNvbW1hbmQsIGludCB3Y3QsIGludCBiY2MpCit7CisJaWYgKFNNQl9DTUQocGFja2V0KSAhPSBjb21tYW5kKQorCQlnb3RvIGJhZF9jb21tYW5kOworCWlmIChTTUJfV0NUKHBhY2tldCkgPCB3Y3QpCisJCWdvdG8gYmFkX3djdDsKKwlpZiAoYmNjICE9IC0xICYmIHNtYl9iY2MocGFja2V0KSA8IGJjYykKKwkJZ290byBiYWRfYmNjOworCXJldHVybiAwOworCitiYWRfY29tbWFuZDoKKwlwcmludGsoS0VSTl9FUlIgInNtYl92ZXJpZnk6IGNvbW1hbmQ9JXgsIFNNQl9DTUQ9JXg/P1xuIiwKKwkgICAgICAgY29tbWFuZCwgU01CX0NNRChwYWNrZXQpKTsKKwlnb3RvIGZhaWw7CitiYWRfd2N0OgorCXByaW50ayhLRVJOX0VSUiAic21iX3ZlcmlmeTogY29tbWFuZD0leCwgd2N0PSVkLCBTTUJfV0NUPSVkPz9cbiIsCisJICAgICAgIGNvbW1hbmQsIHdjdCwgU01CX1dDVChwYWNrZXQpKTsKKwlnb3RvIGZhaWw7CitiYWRfYmNjOgorCXByaW50ayhLRVJOX0VSUiAic21iX3ZlcmlmeTogY29tbWFuZD0leCwgYmNjPSVkLCBTTUJfQkNDPSVkPz9cbiIsCisJICAgICAgIGNvbW1hbmQsIGJjYywgc21iX2JjYyhwYWNrZXQpKTsKK2ZhaWw6CisJcmV0dXJuIC1FSU87Cit9CisKKy8qCisgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIHJlYWQgb3Igd3JpdGUgc2l6ZSBmb3IgdGhlICJwYXlsb2FkIi4gTWFraW5nIGFsbCBvZiB0aGUKKyAqIHBhY2tldCBmaXQgd2l0aGluIHRoZSBuZWdvdGlhdGVkIG1heF94bWl0IHNpemUuCisgKgorICogTi5CLiBTaW5jZSB0aGlzIHZhbHVlIGlzIHVzdWFsbHkgY29tcHV0ZWQgYmVmb3JlIGxvY2tpbmcgdGhlIHNlcnZlciwKKyAqIHRoZSBzZXJ2ZXIncyBwYWNrZXQgc2l6ZSBtdXN0IG5ldmVyIGJlIGRlY3JlYXNlZCEKKyAqLworc3RhdGljIGlubGluZSBpbnQKK3NtYl9nZXRfeG1pdHNpemUoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIsIGludCBvdmVyaGVhZCkKK3sKKwlyZXR1cm4gc2VydmVyLT5vcHQubWF4X3htaXQgLSBvdmVyaGVhZDsKK30KKworLyoKKyAqIENhbGN1bGF0ZSB0aGUgbWF4aW11bSByZWFkIHNpemUKKyAqLworaW50CitzbWJfZ2V0X3JzaXplKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyKQoreworCS8qIHJlYWRYIGhhcyAxMiBwYXJhbWV0ZXJzLCByZWFkIGhhcyA1ICovCisJaW50IG92ZXJoZWFkID0gU01CX0hFQURFUl9MRU4gKyAxMiAqIHNpemVvZihfX3UxNikgKyAyICsgMSArIDI7CisJaW50IHNpemUgPSBzbWJfZ2V0X3htaXRzaXplKHNlcnZlciwgb3ZlcmhlYWQpOworCisJVkVSQk9TRSgieG1pdD0lZCwgc2l6ZT0lZFxuIiwgc2VydmVyLT5vcHQubWF4X3htaXQsIHNpemUpOworCisJcmV0dXJuIHNpemU7Cit9CisKKy8qCisgKiBDYWxjdWxhdGUgdGhlIG1heGltdW0gd3JpdGUgc2l6ZQorICovCitpbnQKK3NtYl9nZXRfd3NpemUoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIpCit7CisJLyogd3JpdGVYIGhhcyAxNCBwYXJhbWV0ZXJzLCB3cml0ZSBoYXMgNSAqLworCWludCBvdmVyaGVhZCA9IFNNQl9IRUFERVJfTEVOICsgMTQgKiBzaXplb2YoX191MTYpICsgMiArIDEgKyAyOworCWludCBzaXplID0gc21iX2dldF94bWl0c2l6ZShzZXJ2ZXIsIG92ZXJoZWFkKTsKKworCVZFUkJPU0UoInhtaXQ9JWQsIHNpemU9JWRcbiIsIHNlcnZlci0+b3B0Lm1heF94bWl0LCBzaXplKTsKKworCXJldHVybiBzaXplOworfQorCisvKgorICogQ29udmVydCBTTUIgZXJyb3IgY29kZXMgdG8gLUUuLi4gZXJybm8gdmFsdWVzLgorICovCitpbnQKK3NtYl9lcnJubyhzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcSkKK3sKKwlpbnQgZXJyY2xzID0gcmVxLT5ycV9yY2xzOworCWludCBlcnJvciAgPSByZXEtPnJxX2VycjsKKwljaGFyICpjbGFzcyA9ICJVbmtub3duIjsKKworCVZFUkJPU0UoImVycmNscyAlZCAgY29kZSAlZCAgZnJvbSBjb21tYW5kIDB4JXhcbiIsCisJCWVycmNscywgZXJyb3IsIFNNQl9DTUQocmVxLT5ycV9oZWFkZXIpKTsKKworCWlmIChlcnJjbHMgPT0gRVJSRE9TKSB7CisJCXN3aXRjaCAoZXJyb3IpIHsKKwkJY2FzZSBFUlJiYWRmdW5jOgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWNhc2UgRVJSYmFkZmlsZToKKwkJY2FzZSBFUlJiYWRwYXRoOgorCQkJcmV0dXJuIC1FTk9FTlQ7CisJCWNhc2UgRVJSbm9maWRzOgorCQkJcmV0dXJuIC1FTUZJTEU7CisJCWNhc2UgRVJSbm9hY2Nlc3M6CisJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJY2FzZSBFUlJiYWRmaWQ6CisJCQlyZXR1cm4gLUVCQURGOworCQljYXNlIEVSUmJhZG1jYjoKKwkJCXJldHVybiAtRVJFTU9URUlPOworCQljYXNlIEVSUm5vbWVtOgorCQkJcmV0dXJuIC1FTk9NRU07CisJCWNhc2UgRVJSYmFkbWVtOgorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWNhc2UgRVJSYmFkZW52OgorCQljYXNlIEVSUmJhZGZvcm1hdDoKKwkJCXJldHVybiAtRVJFTU9URUlPOworCQljYXNlIEVSUmJhZGFjY2VzczoKKwkJCXJldHVybiAtRUFDQ0VTOworCQljYXNlIEVSUmJhZGRhdGE6CisJCQlyZXR1cm4gLUUyQklHOworCQljYXNlIEVSUmJhZGRyaXZlOgorCQkJcmV0dXJuIC1FTlhJTzsKKwkJY2FzZSBFUlJyZW1jZDoKKwkJCXJldHVybiAtRVJFTU9URUlPOworCQljYXNlIEVSUmRpZmZkZXZpY2U6CisJCQlyZXR1cm4gLUVYREVWOworCQljYXNlIEVSUm5vZmlsZXM6CisJCQlyZXR1cm4gLUVOT0VOVDsKKwkJY2FzZSBFUlJiYWRzaGFyZToKKwkJCXJldHVybiAtRVRYVEJTWTsKKwkJY2FzZSBFUlJsb2NrOgorCQkJcmV0dXJuIC1FREVBRExLOworCQljYXNlIEVSUmZpbGV4aXN0czoKKwkJCXJldHVybiAtRUVYSVNUOworCQljYXNlIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSOgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWNhc2UgRVJST1JfRElTS19GVUxMOgorCQkJcmV0dXJuIC1FTk9TUEM7CisJCWNhc2UgRVJST1JfSU5WQUxJRF9OQU1FOgorCQkJcmV0dXJuIC1FTk9FTlQ7CisJCWNhc2UgRVJST1JfRElSX05PVF9FTVBUWToKKwkJCXJldHVybiAtRU5PVEVNUFRZOworCQljYXNlIEVSUk9SX05PVF9MT0NLRUQ6CisgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTENLOworCQljYXNlIEVSUk9SX0FMUkVBRFlfRVhJU1RTOgorCQkJcmV0dXJuIC1FRVhJU1Q7CisJCWRlZmF1bHQ6CisJCQljbGFzcyA9ICJFUlJET1MiOworCQkJZ290byBlcnJfdW5rbm93bjsKKwkJfQorCX0gZWxzZSBpZiAoZXJyY2xzID09IEVSUlNSVikgeworCQlzd2l0Y2ggKGVycm9yKSB7CisJCS8qIE4uQi4gVGhpcyBpcyB3cm9uZyAuLi4gRUlPID8gKi8KKwkJY2FzZSBFUlJlcnJvcjoKKwkJCXJldHVybiAtRU5GSUxFOworCQljYXNlIEVSUmJhZHB3OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWNhc2UgRVJSYmFkdHlwZToKKwkJY2FzZSBFUlJ0aW1lb3V0OgorCQkJcmV0dXJuIC1FSU87CisJCWNhc2UgRVJSYWNjZXNzOgorCQkJcmV0dXJuIC1FQUNDRVM7CisJCS8qCisJCSAqIFRoaXMgaXMgYSBmYXRhbCBlcnJvciwgYXMgaXQgbWVhbnMgdGhlICJ0cmVlIElEIgorCQkgKiBmb3IgdGhpcyBjb25uZWN0aW9uIGlzIG5vIGxvbmdlciB2YWxpZC4gV2UgbWFwCisJCSAqIHRvIGEgc3BlY2lhbCBlcnJvciBjb2RlIGFuZCBnZXQgYSBuZXcgY29ubmVjdGlvbi4KKwkJICovCisJCWNhc2UgRVJSaW52bmlkOgorCQkJcmV0dXJuIC1FQkFEU0xUOworCQlkZWZhdWx0OgorCQkJY2xhc3MgPSAiRVJSU1JWIjsKKwkJCWdvdG8gZXJyX3Vua25vd247CisJCX0KKwl9IGVsc2UgaWYgKGVycmNscyA9PSBFUlJIUkQpIHsKKwkJc3dpdGNoIChlcnJvcikgeworCQljYXNlIEVSUm5vd3JpdGU6CisJCQlyZXR1cm4gLUVST0ZTOworCQljYXNlIEVSUmJhZHVuaXQ6CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJY2FzZSBFUlJub3RyZWFkeToKKwkJCXJldHVybiAtRVVDTEVBTjsKKwkJY2FzZSBFUlJiYWRjbWQ6CisJCWNhc2UgRVJSZGF0YToKKwkJCXJldHVybiAtRUlPOworCQljYXNlIEVSUmJhZHJlcToKKwkJCXJldHVybiAtRVJBTkdFOworCQljYXNlIEVSUmJhZHNoYXJlOgorCQkJcmV0dXJuIC1FVFhUQlNZOworCQljYXNlIEVSUmxvY2s6CisJCQlyZXR1cm4gLUVERUFETEs7CisJCWNhc2UgRVJSZGlza2Z1bGw6CisJCQlyZXR1cm4gLUVOT1NQQzsKKwkJZGVmYXVsdDoKKwkJCWNsYXNzID0gIkVSUkhSRCI7CisJCQlnb3RvIGVycl91bmtub3duOworCQl9CisJfSBlbHNlIGlmIChlcnJjbHMgPT0gRVJSQ01EKSB7CisJCWNsYXNzID0gIkVSUkNNRCI7CisJfSBlbHNlIGlmIChlcnJjbHMgPT0gU1VDQ0VTUykgeworCQlyZXR1cm4gMDsJLyogVGhpcyBpcyB0aGUgb25seSB2YWxpZCAwIHJldHVybiAqLworCX0KKworZXJyX3Vua25vd246CisJcHJpbnRrKEtFUk5fRVJSICJzbWJfZXJybm86IGNsYXNzICVzLCBjb2RlICVkIGZyb20gY29tbWFuZCAweCV4XG4iLAorCSAgICAgICBjbGFzcywgZXJyb3IsIFNNQl9DTUQocmVxLT5ycV9oZWFkZXIpKTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyogc21iX3JlcXVlc3Rfb2s6IFdlIGV4cGVjdCB0aGUgc2VydmVyIHRvIGJlIGxvY2tlZC4gVGhlbiB3ZSBkbyB0aGUKKyAgIHJlcXVlc3QgYW5kIGNoZWNrIHRoZSBhbnN3ZXIgY29tcGxldGVseS4gV2hlbiBzbWJfcmVxdWVzdF9vaworICAgcmV0dXJucyAwLCB5b3UgY2FuIGJlIHF1aXRlIHN1cmUgdGhhdCBldmVyeXRoaW5nIHdlbnQgd2VsbC4gV2hlbgorICAgdGhlIGFuc3dlciBpcyA8PTAsIHRoZSByZXR1cm5lZCBudW1iZXIgaXMgYSB2YWxpZCB1bml4IGVycm5vLiAqLworCitzdGF0aWMgaW50CitzbWJfcmVxdWVzdF9vayhzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcSwgaW50IGNvbW1hbmQsIGludCB3Y3QsIGludCBiY2MpCit7CisJaW50IHJlc3VsdDsKKworCXJlcS0+cnFfcmVzcF93Y3QgPSB3Y3Q7CisJcmVxLT5ycV9yZXNwX2JjYyA9IGJjYzsKKworCXJlc3VsdCA9IHNtYl9hZGRfcmVxdWVzdChyZXEpOworCWlmIChyZXN1bHQgIT0gMCkgeworCQlERUJVRzEoInNtYl9yZXF1ZXN0IGZhaWxlZFxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChzbWJfdmFsaWRfcGFja2V0KHJlcS0+cnFfaGVhZGVyKSAhPSAwKSB7CisJCVBBUkFOT0lBKCJpbnZhbGlkIHBhY2tldCFcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXN1bHQgPSBzbWJfdmVyaWZ5KHJlcS0+cnFfaGVhZGVyLCBjb21tYW5kLCB3Y3QsIGJjYyk7CisKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogVGhpcyBpbXBsZW1lbnRzIHRoZSBORVdDT05OIGlvY3RsLiBJdCBpbnN0YWxscyB0aGUgc2VydmVyIHBpZCwKKyAqIHNldHMgc2VydmVyLT5zdGF0ZSB0byBDT05OX1ZBTElELCBhbmQgd2FrZXMgdXAgdGhlIHdhaXRpbmcgcHJvY2Vzcy4KKyAqLworaW50CitzbWJfbmV3Y29ubihzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgc3RydWN0IHNtYl9jb25uX29wdCAqb3B0KQoreworCXN0cnVjdCBmaWxlICpmaWxwOworCXN0cnVjdCBzb2NrICpzazsKKwlpbnQgZXJyb3I7CisKKwlWRVJCT1NFKCJmZD0lZCwgcGlkPSVkXG4iLCBvcHQtPmZkLCBjdXJyZW50LT5waWQpOworCisJc21iX2xvY2tfc2VydmVyKHNlcnZlcik7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB3ZSBkb24ndCBhbHJlYWR5IGhhdmUgYSB2YWxpZCBjb25uZWN0aW9uIC4uLgorCSAqLworCWVycm9yID0gLUVJTlZBTDsKKwlpZiAoc2VydmVyLT5zdGF0ZSA9PSBDT05OX1ZBTElEKQorCQlnb3RvIG91dDsKKworCWVycm9yID0gLUVBQ0NFUzsKKwlpZiAoY3VycmVudC0+dWlkICE9IHNlcnZlci0+bW50LT5tb3VudGVkX3VpZCAmJiAKKwkgICAgIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCWdvdG8gb3V0OworCisJZXJyb3IgPSAtRUJBREY7CisJZmlscCA9IGZnZXQob3B0LT5mZCk7CisJaWYgKCFmaWxwKQorCQlnb3RvIG91dDsKKwlpZiAoIXNtYl92YWxpZF9zb2NrZXQoZmlscC0+Zl9kZW50cnktPmRfaW5vZGUpKQorCQlnb3RvIG91dF9wdXRmOworCisJc2VydmVyLT5zb2NrX2ZpbGUgPSBmaWxwOworCXNlcnZlci0+Y29ubl9waWQgPSBjdXJyZW50LT5waWQ7CisJc2VydmVyLT5vcHQgPSAqb3B0OworCXNlcnZlci0+Z2VuZXJhdGlvbiArPSAxOworCXNlcnZlci0+c3RhdGUgPSBDT05OX1ZBTElEOworCWVycm9yID0gMDsKKworCWlmIChzZXJ2ZXItPmNvbm5fZXJyb3IpIHsKKwkJLyoKKwkJICogY29ubl9lcnJvciBpcyB0aGUgcmV0dXJuY29kZSB3ZSBvcmlnaW5hbGx5IGRlY2lkZWQgdG8KKwkJICogZHJvcCB0aGUgb2xkIGNvbm5lY3Rpb24gb24uIFRoaXMgbWVzc2FnZSBzaG91bGQgYmUgcG9zaXRpdmUKKwkJICogYW5kIG5vdCBtYWtlIHBlb3BsZSBhc2sgcXVlc3Rpb25zIG9uIHdoeSBzbWJmcyBpcyBwcmludGluZworCQkgKiBlcnJvciBtZXNzYWdlcyAuLi4KKwkJICovCisJCXByaW50ayhLRVJOX0lORk8gIlNNQiBjb25uZWN0aW9uIHJlLWVzdGFibGlzaGVkICglZClcbiIsCisJCSAgICAgICBzZXJ2ZXItPmNvbm5fZXJyb3IpOworCQlzZXJ2ZXItPmNvbm5fZXJyb3IgPSAwOworCX0KKworCS8qCisJICogU3RvcmUgdGhlIHNlcnZlciBpbiBzb2NrIHVzZXJfZGF0YSAoT25seSB1c2VkIGJ5IHN1bnJwYykKKwkgKi8KKwlzayA9IFNPQ0tFVF9JKGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlKS0+c2s7CisJc2stPnNrX3VzZXJfZGF0YSA9IHNlcnZlcjsKKworCS8qIGNoYWluIGludG8gdGhlIGRhdGFfcmVhZHkgY2FsbGJhY2sgKi8KKwlzZXJ2ZXItPmRhdGFfcmVhZHkgPSB4Y2hnKCZzay0+c2tfZGF0YV9yZWFkeSwgc21iX2RhdGFfcmVhZHkpOworCisJLyogY2hlY2sgaWYgd2UgaGF2ZSBhbiBvbGQgc21ibW91bnQgdGhhdCB1c2VzIHNlY29uZHMgZm9yIHRoZSAKKwkgICBzZXJ2ZXJ6b25lICovCisJaWYgKHNlcnZlci0+b3B0LnNlcnZlcnpvbmUgPiAxMio2MCB8fCBzZXJ2ZXItPm9wdC5zZXJ2ZXJ6b25lIDwgLTEyKjYwKQorCQlzZXJ2ZXItPm9wdC5zZXJ2ZXJ6b25lIC89IDYwOworCisJLyogbm93IHRoYXQgd2UgaGF2ZSBhbiBlc3RhYmxpc2hlZCBjb25uZWN0aW9uIHdlIGNhbiBkZXRlY3QgdGhlIHNlcnZlcgorCSAgIHR5cGUgYW5kIGVuYWJsZSBidWcgd29ya2Fyb3VuZHMgKi8KKwlpZiAoc2VydmVyLT5vcHQucHJvdG9jb2wgPCBTTUJfUFJPVE9DT0xfTEFOTUFOMikKKwkJaW5zdGFsbF9vcHMoc2VydmVyLT5vcHMsICZzbWJfb3BzX2NvcmUpOworCWVsc2UgaWYgKHNlcnZlci0+b3B0LnByb3RvY29sID09IFNNQl9QUk9UT0NPTF9MQU5NQU4yKQorCQlpbnN0YWxsX29wcyhzZXJ2ZXItPm9wcywgJnNtYl9vcHNfb3MyKTsKKwllbHNlIGlmIChzZXJ2ZXItPm9wdC5wcm90b2NvbCA9PSBTTUJfUFJPVE9DT0xfTlQxICYmCisJCSAoc2VydmVyLT5vcHQubWF4X3htaXQgPCAweDEwMDApICYmCisJCSAhKHNlcnZlci0+b3B0LmNhcGFiaWxpdGllcyAmIFNNQl9DQVBfTlRfU01CUykpIHsKKwkJLyogRklYTUU6IGNhbiB3ZSBraWxsIHRoZSBXSU45NSBmbGFnIG5vdz8gKi8KKwkJc2VydmVyLT5tbnQtPmZsYWdzIHw9IFNNQl9NT1VOVF9XSU45NTsKKwkJVkVSQk9TRSgiZGV0ZWN0ZWQgV0lOOTUgc2VydmVyXG4iKTsKKwkJaW5zdGFsbF9vcHMoc2VydmVyLT5vcHMsICZzbWJfb3BzX3dpbjk1KTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBTYW1iYSBoYXMgbWF4X3htaXQgNjU1MzUKKwkJICogTlQ0c3BYIGhhcyBtYXhfeG1pdCA0NTM2IChvciBzb21ldGhpbmcgbGlrZSB0aGF0KQorCQkgKiB3aW4yayBoYXMgLi4uCisJCSAqLworCQlWRVJCT1NFKCJkZXRlY3RlZCBOVDEgKFNhbWJhLCBOVDQvNSkgc2VydmVyXG4iKTsKKwkJaW5zdGFsbF9vcHMoc2VydmVyLT5vcHMsICZzbWJfb3BzX3dpbk5UKTsKKwl9CisKKwkvKiBGSVhNRTogdGhlIHdpbjl4IGNvZGUgd2FudHMgdG8gbW9kaWZ5IHRoZXNlIC4uLiAoc2Vlay90cnVuYyBidWcpICovCisJaWYgKHNlcnZlci0+bW50LT5mbGFncyAmIFNNQl9NT1VOVF9PTERBVFRSKSB7CisJCXNlcnZlci0+b3BzLT5nZXRhdHRyID0gc21iX3Byb2NfZ2V0YXR0cl9jb3JlOworCX0gZWxzZSBpZiAoc2VydmVyLT5tbnQtPmZsYWdzICYgU01CX01PVU5UX0RJUkFUVFIpIHsKKwkJc2VydmVyLT5vcHMtPmdldGF0dHIgPSBzbWJfcHJvY19nZXRhdHRyX2ZmOworCX0KKworCS8qIERlY29kZSBzZXJ2ZXIgY2FwYWJpbGl0aWVzICovCisJaWYgKHNlcnZlci0+b3B0LmNhcGFiaWxpdGllcyAmIFNNQl9DQVBfTEFSR0VfRklMRVMpIHsKKwkJLyogU2hvdWxkIGJlIG9rIHRvIHNldCB0aGlzIG5vdywgYXMgbm8gb25lIGNhbiBhY2Nlc3MgdGhlCisJCSAgIG1vdW50IHVudGlsIHRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIGVzdGFibGlzaGVkLiAqLworCQlTQl9vZihzZXJ2ZXIpLT5zX21heGJ5dGVzID0gfjBVTEwgPj4gMTsKKwkJVkVSQk9TRSgiTEZTIGVuYWJsZWRcbiIpOworCX0KKwlpZiAoc2VydmVyLT5vcHQuY2FwYWJpbGl0aWVzICYgU01CX0NBUF9VTklDT0RFKSB7CisJCXNlcnZlci0+bW50LT5mbGFncyB8PSBTTUJfTU9VTlRfVU5JQ09ERTsKKwkJVkVSQk9TRSgiVW5pY29kZSBlbmFibGVkXG4iKTsKKwl9IGVsc2UgeworCQlzZXJ2ZXItPm1udC0+ZmxhZ3MgJj0gflNNQl9NT1VOVF9VTklDT0RFOworCX0KKyNpZiAwCisJLyogZmxhZ3Mgd2UgbWF5IHRlc3QgZm9yIG90aGVyIHBhdGNoZXMgLi4uICovCisJaWYgKHNlcnZlci0+b3B0LmNhcGFiaWxpdGllcyAmIFNNQl9DQVBfTEFSR0VfUkVBRFgpIHsKKwkJVkVSQk9TRSgiTGFyZ2UgcmVhZHMgZW5hYmxlZFxuIik7CisJfQorCWlmIChzZXJ2ZXItPm9wdC5jYXBhYmlsaXRpZXMgJiBTTUJfQ0FQX0xBUkdFX1dSSVRFWCkgeworCQlWRVJCT1NFKCJMYXJnZSB3cml0ZXMgZW5hYmxlZFxuIik7CisJfQorI2VuZGlmCisJaWYgKHNlcnZlci0+b3B0LmNhcGFiaWxpdGllcyAmIFNNQl9DQVBfVU5JWCkgeworCQlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCQlWRVJCT1NFKCJVc2luZyBVTklYIENJRlMgZXh0ZW5zaW9uc1xuIik7CisJCWluc3RhbGxfb3BzKHNlcnZlci0+b3BzLCAmc21iX29wc191bml4KTsKKwkJaW5vZGUgPSBTQl9vZihzZXJ2ZXIpLT5zX3Jvb3QtPmRfaW5vZGU7CisJCWlmIChpbm9kZSkKKwkJCWlub2RlLT5pX29wID0gJnNtYl9kaXJfaW5vZGVfb3BlcmF0aW9uc191bml4OworCX0KKworCVZFUkJPU0UoInByb3RvY29sPSVkLCBtYXhfeG1pdD0lZCwgcGlkPSVkIGNhcGFiaWxpdGllcz0weCV4XG4iLAorCQlzZXJ2ZXItPm9wdC5wcm90b2NvbCwgc2VydmVyLT5vcHQubWF4X3htaXQsIHNlcnZlci0+Y29ubl9waWQsCisJCXNlcnZlci0+b3B0LmNhcGFiaWxpdGllcyk7CisKKwkvKiBGSVhNRTogdGhpcyByZWFsbHkgc2hvdWxkIGJlIGRvbmUgYnkgc21ibW91bnQuICovCisJaWYgKHNlcnZlci0+b3B0Lm1heF94bWl0ID4gU01CX01BWF9QQUNLRVRfU0laRSkgeworCQlzZXJ2ZXItPm9wdC5tYXhfeG1pdCA9IFNNQl9NQVhfUEFDS0VUX1NJWkU7CisJfQorCisJc21iX3VubG9ja19zZXJ2ZXIoc2VydmVyKTsKKwlzbWJpb2Rfd2FrZV91cCgpOworCWlmIChzZXJ2ZXItPm9wdC5jYXBhYmlsaXRpZXMgJiBTTUJfQ0FQX1VOSVgpCisJCXNtYl9wcm9jX3F1ZXJ5X2NpZnN1bml4KHNlcnZlcik7CisKKwlzZXJ2ZXItPmNvbm5fY29tcGxldGUrKzsKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZzZXJ2ZXItPmNvbm5fd3EpOworCXJldHVybiBlcnJvcjsKKworb3V0OgorCXNtYl91bmxvY2tfc2VydmVyKHNlcnZlcik7CisJc21iaW9kX3dha2VfdXAoKTsKKwlyZXR1cm4gZXJyb3I7CisKK291dF9wdXRmOgorCWZwdXQoZmlscCk7CisJZ290byBvdXQ7Cit9CisKKy8qIHNtYl9zZXR1cF9oZWFkZXI6IFdlIGNvbXBsZXRlbHkgc2V0IHVwIHRoZSBwYWNrZXQuIFlvdSBvbmx5IGhhdmUgdG8KKyAgIGluc2VydCB0aGUgY29tbWFuZC1zcGVjaWZpYyBmaWVsZHMgKi8KKworX191OCAqCitzbWJfc2V0dXBfaGVhZGVyKHN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxLCBfX3U4IGNvbW1hbmQsIF9fdTE2IHdjdCwgX191MTYgYmNjKQoreworCV9fdTMyIHhtaXRfbGVuID0gU01CX0hFQURFUl9MRU4gKyB3Y3QgKiBzaXplb2YoX191MTYpICsgYmNjICsgMjsKKwlfX3U4ICpwID0gcmVxLT5ycV9oZWFkZXI7CisJc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIgPSByZXEtPnJxX3NlcnZlcjsKKworCXAgPSBzbWJfZW5jb2RlX3NtYl9sZW5ndGgocCwgeG1pdF9sZW4gLSA0KTsKKworCSpwKysgPSAweGZmOworCSpwKysgPSAnUyc7CisJKnArKyA9ICdNJzsKKwkqcCsrID0gJ0InOworCSpwKysgPSBjb21tYW5kOworCisJbWVtc2V0KHAsICdcMCcsIDE5KTsKKwlwICs9IDE5OworCXAgKz0gODsKKworCWlmIChzZXJ2ZXItPm9wdC5wcm90b2NvbCA+IFNNQl9QUk9UT0NPTF9DT1JFKSB7CisJCWludCBmbGFncyA9IFNNQl9GTEFHU19DQVNFTEVTU19QQVRITkFNRVM7CisJCWludCBmbGFnczIgPSBTTUJfRkxBR1MyX0xPTkdfUEFUSF9DT01QT05FTlRTIHwKKwkJCVNNQl9GTEFHUzJfRVhURU5ERURfQVRUUklCVVRFUzsJLyogRUE/IG5vdCByZWFsbHkgLi4uICovCisKKwkJKihyZXEtPnJxX2hlYWRlciArIHNtYl9mbGcpID0gZmxhZ3M7CisJCWlmIChzZXJ2ZXItPm1udC0+ZmxhZ3MgJiBTTUJfTU9VTlRfVU5JQ09ERSkKKwkJCWZsYWdzMiB8PSBTTUJfRkxBR1MyX1VOSUNPREVfU1RSSU5HUzsKKwkJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX2ZsZzIsIGZsYWdzMik7CisJfQorCSpwKysgPSB3Y3Q7CQkvKiB3Y3QgKi8KKwlwICs9IDIgKiB3Y3Q7CisJV1NFVChwLCAwLCBiY2MpOworCisJLyogSW5jbHVkZSB0aGUgaGVhZGVyIGluIHRoZSBkYXRhIHRvIHNlbmQgKi8KKwlyZXEtPnJxX2lvdmxlbiA9IDE7CisJcmVxLT5ycV9pb3ZbMF0uaW92X2Jhc2UgPSByZXEtPnJxX2hlYWRlcjsKKwlyZXEtPnJxX2lvdlswXS5pb3ZfbGVuICA9IHhtaXRfbGVuIC0gYmNjOworCisJcmV0dXJuIHJlcS0+cnFfYnVmZmVyOworfQorCitzdGF0aWMgdm9pZAorc21iX3NldHVwX2JjYyhzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcSwgX191OCAqcCkKK3sKKwl1MTYgYmNjID0gcCAtIHJlcS0+cnFfYnVmZmVyOworCXU4ICpwYmNjID0gcmVxLT5ycV9oZWFkZXIgKyBTTUJfSEVBREVSX0xFTiArIDIqU01CX1dDVChyZXEtPnJxX2hlYWRlcik7CisKKwlXU0VUKHBiY2MsIDAsIGJjYyk7CisKKwlzbWJfZW5jb2RlX3NtYl9sZW5ndGgocmVxLT5ycV9oZWFkZXIsIFNNQl9IRUFERVJfTEVOICsgCisJCQkgICAgICAyKlNNQl9XQ1QocmVxLT5ycV9oZWFkZXIpIC0gMiArIGJjYyk7CisKKwkvKiBJbmNsdWRlIHRoZSAiYnl0ZXMiIGluIHRoZSBkYXRhIHRvIHNlbmQgKi8KKwlyZXEtPnJxX2lvdmxlbiA9IDI7CisJcmVxLT5ycV9pb3ZbMV0uaW92X2Jhc2UgPSByZXEtPnJxX2J1ZmZlcjsKKwlyZXEtPnJxX2lvdlsxXS5pb3ZfbGVuICA9IGJjYzsKK30KKworc3RhdGljIGludAorc21iX3Byb2Nfc2VlayhzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgX191MTYgZmlsZWlkLAorCSAgICAgIF9fdTE2IG1vZGUsIG9mZl90IG9mZnNldCkKK3sKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxOworCisJcmVzdWx0ID0gLUVOT01FTTsKKwlpZiAoISAocmVxID0gc21iX2FsbG9jX3JlcXVlc3Qoc2VydmVyLCAwKSkpCisJCWdvdG8gb3V0OworCisJc21iX3NldHVwX2hlYWRlcihyZXEsIFNNQmxzZWVrLCA0LCAwKTsKKwlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2MCwgZmlsZWlkKTsKKwlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2MSwgbW9kZSk7CisJRFNFVChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djIsIG9mZnNldCk7CisJcmVxLT5ycV9mbGFncyB8PSBTTUJfUkVRX05PUkVUUlk7CisKKwlyZXN1bHQgPSBzbWJfcmVxdWVzdF9vayhyZXEsIFNNQmxzZWVrLCAyLCAwKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlyZXN1bHQgPSAwOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCXJlc3VsdCA9IERWQUwocmVxLT5ycV9oZWFkZXIsIHNtYl92d3YwKTsKK291dF9mcmVlOgorCXNtYl9ycHV0KHJlcSk7CitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludAorc21iX3Byb2Nfb3BlbihzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgd2lzaCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlubyA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3Qgc21iX2lub2RlX2luZm8gKmVpID0gU01CX0koaW5vKTsKKwlpbnQgbW9kZSwgcmVhZF93cml0ZSA9IDB4NDIsIHJlYWRfb25seSA9IDB4NDA7CisJaW50IHJlczsKKwljaGFyICpwOworCXN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxOworCisJLyoKKwkgKiBBdHRlbXB0IHRvIG9wZW4gci93LCB1bmxlc3MgdGhlcmUgYXJlIG5vIHdyaXRlIHByaXZpbGVnZXMuCisJICovCisJbW9kZSA9IHJlYWRfd3JpdGU7CisJaWYgKCEoaW5vLT5pX21vZGUgJiAoU19JV1VTUiB8IFNfSVdHUlAgfCBTX0lXT1RIKSkpCisJCW1vZGUgPSByZWFkX29ubHk7CisjaWYgMAorCS8qIEZJWE1FOiB3aHkgaXMgdGhpcyBjb2RlIG5vdCBpbj8gYmVsb3cgd2UgZml4IGl0IHNvIHRoYXQgYSBjYWxsZXIKKwkgICB3YW50aW5nIFJPIGRvZXNuJ3QgZ2V0IFJXLiBzbWJfcmV2YWxpZGF0ZV9pbm9kZSBkb2VzIHNvbWUgCisJICAgb3B0aW1pemF0aW9uIGJhc2VkIG9uIGFjY2VzcyBtb2RlLiB0YWlsIC1mIG5lZWRzIGl0IHRvIGJlIGNvcnJlY3QuCisKKwkgICBXZSBtdXN0IG9wZW4gcncgc2luY2Ugd2UgZG9uJ3QgZG8gdGhlIG9wZW4gaWYgY2FsbGVkIGEgc2Vjb25kIHRpbWUKKwkgICB3aXRoIGRpZmZlcmVudCAnd2lzaCcuIElzIHRoYXQgbm90IHN1cHBvcnRlZCBieSBzbWIgc2VydmVycz8gKi8KKwlpZiAoISh3aXNoICYgKE9fV1JPTkxZIHwgT19SRFdSKSkpCisJCW1vZGUgPSByZWFkX29ubHk7CisjZW5kaWYKKworCXJlcyA9IC1FTk9NRU07CisJaWYgKCEgKHJlcSA9IHNtYl9hbGxvY19yZXF1ZXN0KHNlcnZlciwgUEFHRV9TSVpFKSkpCisJCWdvdG8gb3V0OworCisgICAgICByZXRyeToKKwlwID0gc21iX3NldHVwX2hlYWRlcihyZXEsIFNNQm9wZW4sIDIsIDApOworCVdTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl92d3YwLCBtb2RlKTsKKwlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2MSwgYVNZU1RFTSB8IGFISURERU4gfCBhRElSKTsKKwlyZXMgPSBzbWJfc2ltcGxlX2VuY29kZV9wYXRoKHJlcSwgJnAsIGRlbnRyeSwgTlVMTCk7CisJaWYgKHJlcyA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisJc21iX3NldHVwX2JjYyhyZXEsIHApOworCisJcmVzID0gc21iX3JlcXVlc3Rfb2socmVxLCBTTUJvcGVuLCA3LCAwKTsKKwlpZiAocmVzICE9IDApIHsKKwkJaWYgKG1vZGUgPT0gcmVhZF93cml0ZSAmJgorCQkgICAgKHJlcyA9PSAtRUFDQ0VTIHx8IHJlcyA9PSAtRVRYVEJTWSB8fCByZXMgPT0gLUVST0ZTKSkKKwkJeworCQkJVkVSQk9TRSgiJXMvJXMgUi9XIGZhaWxlZCwgZXJyb3I9JWQsIHJldHJ5aW5nIFIvT1xuIiwKKwkJCQlERU5UUllfUEFUSChkZW50cnkpLCByZXMpOworCQkJbW9kZSA9IHJlYWRfb25seTsKKwkJCXJlcS0+cnFfZmxhZ3MgPSAwOworCQkJZ290byByZXRyeTsKKwkJfQorCQlnb3RvIG91dF9mcmVlOworCX0KKwkvKiBXZSBzaG91bGQgbm93IGhhdmUgZGF0YSBpbiB2d3ZbMC4uNl0uICovCisKKwllaS0+ZmlsZWlkID0gV1ZBTChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djApOworCWVpLT5hdHRyICAgPSBXVkFMKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2MSk7CisJLyogc21iX3Z3djIgaGFzIG10aW1lICovCisJLyogc21iX3Z3djQgaGFzIHNpemUgICovCisJZWktPmFjY2VzcyA9IChXVkFMKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2NikgJiBTTUJfQUNDTUFTSyk7CisJZWktPm9wZW4gPSBzZXJ2ZXItPmdlbmVyYXRpb247CisKK291dF9mcmVlOgorCXNtYl9ycHV0KHJlcSk7CitvdXQ6CisJcmV0dXJuIHJlczsKK30KKworLyoKKyAqIE1ha2Ugc3VyZSB0aGUgZmlsZSBpcyBvcGVuLCBhbmQgY2hlY2sgdGhhdCB0aGUgYWNjZXNzCisgKiBpcyBjb21wYXRpYmxlIHdpdGggdGhlIGRlc2lyZWQgYWNjZXNzLgorICovCitpbnQKK3NtYl9vcGVuKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IHdpc2gpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgcmVzdWx0OworCV9fdTE2IGFjY2VzczsKKworCXJlc3VsdCA9IC1FTk9FTlQ7CisJaWYgKCFpbm9kZSkgeworCQlwcmludGsoS0VSTl9FUlIgInNtYl9vcGVuOiBubyBpbm9kZSBmb3IgZGVudHJ5ICVzLyVzXG4iLAorCQkgICAgICAgREVOVFJZX1BBVEgoZGVudHJ5KSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghc21iX2lzX29wZW4oaW5vZGUpKSB7CisJCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyID0gc2VydmVyX2Zyb21faW5vZGUoaW5vZGUpOworCQlyZXN1bHQgPSAwOworCQlpZiAoIXNtYl9pc19vcGVuKGlub2RlKSkKKwkJCXJlc3VsdCA9IHNtYl9wcm9jX29wZW4oc2VydmVyLCBkZW50cnksIHdpc2gpOworCQlpZiAocmVzdWx0KQorCQkJZ290byBvdXQ7CisJCS8qCisJCSAqIEEgc3VjY2Vzc2Z1bCBvcGVuIG1lYW5zIHRoZSBwYXRoIGlzIHN0aWxsIHZhbGlkIC4uLgorCQkgKi8KKwkJc21iX3JlbmV3X3RpbWVzKGRlbnRyeSk7CisJfQorCisJLyoKKwkgKiBDaGVjayB3aGV0aGVyIHRoZSBhY2Nlc3MgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBkZXNpcmVkIG1vZGUuCisJICovCisJcmVzdWx0ID0gMDsKKwlhY2Nlc3MgPSBTTUJfSShpbm9kZSktPmFjY2VzczsKKwlpZiAoYWNjZXNzICE9IHdpc2ggJiYgYWNjZXNzICE9IFNNQl9PX1JEV1IpIHsKKwkJUEFSQU5PSUEoIiVzLyVzIGFjY2VzcyBkZW5pZWQsIGFjY2Vzcz0leCwgd2lzaD0leFxuIiwKKwkJCSBERU5UUllfUEFUSChkZW50cnkpLCBhY2Nlc3MsIHdpc2gpOworCQlyZXN1bHQgPSAtRUFDQ0VTOworCX0KK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IAorc21iX3Byb2NfY2xvc2Uoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIsIF9fdTE2IGZpbGVpZCwgX191MzIgbXRpbWUpCit7CisJc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXE7CisJaW50IHJlc3VsdCA9IC1FTk9NRU07CisKKwlpZiAoISAocmVxID0gc21iX2FsbG9jX3JlcXVlc3Qoc2VydmVyLCAwKSkpCisJCWdvdG8gb3V0OworCisJc21iX3NldHVwX2hlYWRlcihyZXEsIFNNQmNsb3NlLCAzLCAwKTsKKwlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2MCwgZmlsZWlkKTsKKwlEU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2MSwgdXRjMmxvY2FsKHNlcnZlciwgbXRpbWUpKTsKKwlyZXEtPnJxX2ZsYWdzIHw9IFNNQl9SRVFfTk9SRVRSWTsKKwlyZXN1bHQgPSBzbWJfcmVxdWVzdF9vayhyZXEsIFNNQmNsb3NlLCAwLCAwKTsKKworCXNtYl9ycHV0KHJlcSk7CitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIFdpbiBOVCA0LjAgaGFzIGFuIGFwcGFyZW50IGJ1ZyBpbiB0aGF0IGl0IGZhaWxzIHRvIHVwZGF0ZSB0aGUKKyAqIG1vZGlmeSB0aW1lIHdoZW4gd3JpdGluZyB0byBhIGZpbGUuIEFzIGEgd29ya2Fyb3VuZCwgd2UgdXBkYXRlCisgKiBib3RoIG1vZGlmeSBhbmQgYWNjZXNzIHRpbWUgbG9jYWxseSwgYW5kIHBvc3QgdGhlIHRpbWVzIHRvIHRoZQorICogc2VydmVyIHdoZW4gY2xvc2luZyB0aGUgZmlsZS4KKyAqLworc3RhdGljIGludCAKK3NtYl9wcm9jX2Nsb3NlX2lub2RlKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBzdHJ1Y3QgaW5vZGUgKiBpbm8pCit7CisJc3RydWN0IHNtYl9pbm9kZV9pbmZvICplaSA9IFNNQl9JKGlubyk7CisJaW50IHJlc3VsdCA9IDA7CisJaWYgKHNtYl9pc19vcGVuKGlubykpCisJeworCQkvKgorCQkgKiBXZSBjbGVhciB0aGUgb3BlbiBmbGFnIGluIGFkdmFuY2UsIGluIGNhc2UgYW5vdGhlcgorIAkJICogcHJvY2VzcyBvYnNlcnZlcyB0aGUgdmFsdWUgd2hpbGUgd2UgYmxvY2sgYmVsb3cuCisJCSAqLworCQllaS0+b3BlbiA9IDA7CisKKwkJLyoKKwkJICogS2x1ZGdlIGFsZXJ0OiBTTUIgdGltZXN0YW1wcyBhcmUgYWNjdXJhdGUgb25seSB0bworCQkgKiB0d28gc2Vjb25kcyAuLi4gcm91bmQgdGhlIHRpbWVzIHRvIGF2b2lkIG5lZWRsZXNzCisJCSAqIGNhY2hlIGludmFsaWRhdGlvbnMhCisJCSAqLworCQlpZiAoaW5vLT5pX210aW1lLnR2X3NlYyAmIDEpIHsgCisJCQlpbm8tPmlfbXRpbWUudHZfc2VjLS07CisJCQlpbm8tPmlfbXRpbWUudHZfbnNlYyA9IDA7IAorCQl9CisJCWlmIChpbm8tPmlfYXRpbWUudHZfc2VjICYgMSkgeworCQkJaW5vLT5pX2F0aW1lLnR2X3NlYy0tOworCQkJaW5vLT5pX2F0aW1lLnR2X25zZWMgPSAwOworCQl9CisJCS8qCisJCSAqIElmIHRoZSBmaWxlIGlzIG9wZW4gd2l0aCB3cml0ZSBwZXJtaXNzaW9ucywKKwkJICogdXBkYXRlIHRoZSB0aW1lIHN0YW1wcyB0byBzeW5jIG10aW1lIGFuZCBhdGltZS4KKwkJICovCisJCWlmICgoc2VydmVyLT5vcHQuY2FwYWJpbGl0aWVzICYgU01CX0NBUF9VTklYKSA9PSAwICYmCisJCSAgICAoc2VydmVyLT5vcHQucHJvdG9jb2wgPj0gU01CX1BST1RPQ09MX0xBTk1BTjIpICYmCisJCSAgICAhKGVpLT5hY2Nlc3MgPT0gU01CX09fUkRPTkxZKSkKKwkJeworCQkJc3RydWN0IHNtYl9mYXR0ciBmYXR0cjsKKwkJCXNtYl9nZXRfaW5vZGVfYXR0cihpbm8sICZmYXR0cik7CisJCQlzbWJfcHJvY19zZXRhdHRyX2V4dChzZXJ2ZXIsIGlubywgJmZhdHRyKTsKKwkJfQorCisJCXJlc3VsdCA9IHNtYl9wcm9jX2Nsb3NlKHNlcnZlciwgZWktPmZpbGVpZCwgaW5vLT5pX210aW1lLnR2X3NlYyk7CisJCS8qCisJCSAqIEZvcmNlIGEgcmV2YWxpZGF0aW9uIGFmdGVyIGNsb3NpbmcgLi4uIHNvbWUgc2VydmVycworCQkgKiBkb24ndCBwb3N0IHRoZSBzaXplIHVudGlsIHRoZSBmaWxlIGhhcyBiZWVuIGNsb3NlZC4KKwkJICovCisJCWlmIChzZXJ2ZXItPm9wdC5wcm90b2NvbCA8IFNNQl9QUk9UT0NPTF9OVDEpCisJCQllaS0+b2xkbXRpbWUgPSAwOworCQllaS0+Y2xvc2VkID0gamlmZmllczsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50CitzbWJfY2xvc2Uoc3RydWN0IGlub2RlICppbm8pCit7CisJaW50IHJlc3VsdCA9IDA7CisKKwlpZiAoc21iX2lzX29wZW4oaW5vKSkgeworCQlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciA9IHNlcnZlcl9mcm9tX2lub2RlKGlubyk7CisJCXJlc3VsdCA9IHNtYl9wcm9jX2Nsb3NlX2lub2RlKHNlcnZlciwgaW5vKTsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIFRoaXMgaXMgdXNlZCB0byBjbG9zZSBhIGZpbGUgZm9sbG93aW5nIGEgZmFpbGVkIGluc3RhbnRpYXRlLgorICogU2luY2Ugd2UgZG9uJ3QgaGF2ZSBhbiBpbm9kZSwgd2UgY2FuJ3QgdXNlIGFueSBvZiB0aGUgYWJvdmUuCisgKi8KK2ludAorc21iX2Nsb3NlX2ZpbGVpZChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIF9fdTE2IGZpbGVpZCkKK3sKKwlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciA9IHNlcnZlcl9mcm9tX2RlbnRyeShkZW50cnkpOworCWludCByZXN1bHQ7CisKKwlyZXN1bHQgPSBzbWJfcHJvY19jbG9zZShzZXJ2ZXIsIGZpbGVpZCwgZ2V0X3NlY29uZHMoKSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyogSW4gc21iX3Byb2NfcmVhZCBhbmQgc21iX3Byb2Nfd3JpdGUgd2UgZG8gbm90IHJldHJ5LCBiZWNhdXNlIHRoZQorICAgZmlsZS1pZCB3b3VsZCBub3QgYmUgdmFsaWQgYWZ0ZXIgYSByZWNvbm5lY3Rpb24uICovCisKK3N0YXRpYyB2b2lkCitzbWJfcHJvY19yZWFkX2RhdGEoc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXEpCit7CisJcmVxLT5ycV9pb3ZbMF0uaW92X2Jhc2UgPSByZXEtPnJxX2J1ZmZlcjsKKwlyZXEtPnJxX2lvdlswXS5pb3ZfbGVuICA9IDM7CisKKwlyZXEtPnJxX2lvdlsxXS5pb3ZfYmFzZSA9IHJlcS0+cnFfcGFnZTsKKwlyZXEtPnJxX2lvdlsxXS5pb3ZfbGVuICA9IHJlcS0+cnFfcnNpemU7CisJcmVxLT5ycV9pb3ZsZW4gPSAyOworCisJcmVxLT5ycV9ybGVuID0gc21iX2xlbihyZXEtPnJxX2hlYWRlcikgKyA0IC0gcmVxLT5ycV9ieXRlc19yZWN2ZDsKK30KKworc3RhdGljIGludAorc21iX3Byb2NfcmVhZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsIGNoYXIgKmRhdGEpCit7CisJc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIgPSBzZXJ2ZXJfZnJvbV9pbm9kZShpbm9kZSk7CisJX191MTYgcmV0dXJuZWRfY291bnQsIGRhdGFfbGVuOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxOworCXU4IHJidWZbNF07CisKKwlyZXN1bHQgPSAtRU5PTUVNOworCWlmICghIChyZXEgPSBzbWJfYWxsb2NfcmVxdWVzdChzZXJ2ZXIsIDApKSkKKwkJZ290byBvdXQ7CisKKwlzbWJfc2V0dXBfaGVhZGVyKHJlcSwgU01CcmVhZCwgNSwgMCk7CisJYnVmID0gcmVxLT5ycV9oZWFkZXI7CisJV1NFVChidWYsIHNtYl92d3YwLCBTTUJfSShpbm9kZSktPmZpbGVpZCk7CisJV1NFVChidWYsIHNtYl92d3YxLCBjb3VudCk7CisJRFNFVChidWYsIHNtYl92d3YyLCBvZmZzZXQpOworCVdTRVQoYnVmLCBzbWJfdnd2NCwgMCk7CisKKwlyZXEtPnJxX3BhZ2UgPSBkYXRhOworCXJlcS0+cnFfcnNpemUgPSBjb3VudDsKKwlyZXEtPnJxX2NhbGxiYWNrID0gc21iX3Byb2NfcmVhZF9kYXRhOworCXJlcS0+cnFfYnVmZmVyID0gcmJ1ZjsKKwlyZXEtPnJxX2ZsYWdzIHw9IFNNQl9SRVFfTk9SRVRSWSB8IFNNQl9SRVFfU1RBVElDOworCisJcmVzdWx0ID0gc21iX3JlcXVlc3Rfb2socmVxLCBTTUJyZWFkLCA1LCAtMSk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisJcmV0dXJuZWRfY291bnQgPSBXVkFMKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2MCk7CisKKwlkYXRhX2xlbiA9IFdWQUwocmJ1ZiwgMSk7CisKKwlpZiAocmV0dXJuZWRfY291bnQgIT0gZGF0YV9sZW4pIHsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICJzbWJfcHJvY19yZWFkOiByZXR1cm5lZCAhPSBkYXRhX2xlblxuIik7CisJCXByaW50ayhLRVJOX05PVElDRSAic21iX3Byb2NfcmVhZDogcmV0X2M9JWQsIGRhdGFfbGVuPSVkXG4iLAorCQkgICAgICAgcmV0dXJuZWRfY291bnQsIGRhdGFfbGVuKTsKKwl9CisJcmVzdWx0ID0gZGF0YV9sZW47CisKK291dF9mcmVlOgorCXNtYl9ycHV0KHJlcSk7CitvdXQ6CisJVkVSQk9TRSgiaW5vPSVsZCwgZmlsZWlkPSVkLCBjb3VudD0lZCwgcmVzdWx0PSVkXG4iLAorCQlpbm9kZS0+aV9pbm8sIFNNQl9JKGlub2RlKS0+ZmlsZWlkLCBjb3VudCwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50CitzbWJfcHJvY193cml0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsIGNvbnN0IGNoYXIgKmRhdGEpCit7CisJc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIgPSBzZXJ2ZXJfZnJvbV9pbm9kZShpbm9kZSk7CisJaW50IHJlc3VsdDsKKwl1MTYgZmlsZWlkID0gU01CX0koaW5vZGUpLT5maWxlaWQ7CisJdTggYnVmWzRdOworCXN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxOworCisJcmVzdWx0ID0gLUVOT01FTTsKKwlpZiAoISAocmVxID0gc21iX2FsbG9jX3JlcXVlc3Qoc2VydmVyLCAwKSkpCisJCWdvdG8gb3V0OworCisJVkVSQk9TRSgiaW5vPSVsZCwgZmlsZWlkPSVkLCBjb3VudD0lZEAlTGRcbiIsCisJCWlub2RlLT5pX2lubywgZmlsZWlkLCBjb3VudCwgb2Zmc2V0KTsKKworCXNtYl9zZXR1cF9oZWFkZXIocmVxLCBTTUJ3cml0ZSwgNSwgY291bnQgKyAzKTsKKwlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2MCwgZmlsZWlkKTsKKwlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2MSwgY291bnQpOworCURTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl92d3YyLCBvZmZzZXQpOworCVdTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl92d3Y0LCAwKTsKKworCWJ1ZlswXSA9IDE7CisJV1NFVChidWYsIDEsIGNvdW50KTsJLyogeWVzLCBhZ2FpbiAuLi4gKi8KKwlyZXEtPnJxX2lvdlsxXS5pb3ZfYmFzZSA9IGJ1ZjsKKwlyZXEtPnJxX2lvdlsxXS5pb3ZfbGVuID0gMzsKKwlyZXEtPnJxX2lvdlsyXS5pb3ZfYmFzZSA9IChjaGFyICopIGRhdGE7CisJcmVxLT5ycV9pb3ZbMl0uaW92X2xlbiA9IGNvdW50OworCXJlcS0+cnFfaW92bGVuID0gMzsKKwlyZXEtPnJxX2ZsYWdzIHw9IFNNQl9SRVFfTk9SRVRSWTsKKworCXJlc3VsdCA9IHNtYl9yZXF1ZXN0X29rKHJlcSwgU01Cd3JpdGUsIDEsIDApOworCWlmIChyZXN1bHQgPj0gMCkKKwkJcmVzdWx0ID0gV1ZBTChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djApOworCisJc21iX3JwdXQocmVxKTsKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogSW4gc21iX3Byb2NfcmVhZFggYW5kIHNtYl9wcm9jX3dyaXRlWCB3ZSBkbyBub3QgcmV0cnksIGJlY2F1c2UgdGhlCisgKiBmaWxlLWlkIHdvdWxkIG5vdCBiZSB2YWxpZCBhZnRlciBhIHJlY29ubmVjdGlvbi4KKyAqLworCisjZGVmaW5lIFNNQl9SRUFEWF9NQVhfUEFEICAgICAgNjQKK3N0YXRpYyB2b2lkCitzbWJfcHJvY19yZWFkWF9kYXRhKHN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxKQoreworCS8qIGhlYWRlciBsZW5ndGgsIGV4Y2x1ZGluZyB0aGUgbmV0YmlvcyBsZW5ndGggKC00KSAqLworCWludCBoZHJsZW4gPSBTTUJfSEVBREVSX0xFTiArIHJlcS0+cnFfcmVzcF93Y3QqMiAtIDI7CisJaW50IGRhdGFfb2ZmID0gV1ZBTChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djYpOworCisJLyoKKwkgKiBTb21lIGdlbml1cyBtYWRlIHRoZSBwYWRkaW5nIHRvIHRoZSBkYXRhIGJ5dGVzIGFyYml0cmFyeS4KKwkgKiBTbyB3ZSBtdXN0IGZpcnN0IGNhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIHBhZGRpbmcgdXNlZCBieSB0aGUgc2VydmVyLgorCSAqLworCWRhdGFfb2ZmIC09IGhkcmxlbjsKKwlpZiAoZGF0YV9vZmYgPiBTTUJfUkVBRFhfTUFYX1BBRCB8fCBkYXRhX29mZiA8IDApIHsKKwkJUEFSQU5PSUEoIm9mZnNldCBpcyBsYXJnZXIgdGhhbiBTTUJfUkVBRFhfTUFYX1BBRCBvciBuZWdhdGl2ZSFcbiIpOworCQlQQVJBTk9JQSgiJWQgPiAlZCB8fCAlZCA8IDBcbiIsIGRhdGFfb2ZmLCBTTUJfUkVBRFhfTUFYX1BBRCwgZGF0YV9vZmYpOworCQlyZXEtPnJxX3JsZW4gPSByZXEtPnJxX2J1ZnNpemUgKyAxOworCQlyZXR1cm47CisJfQorCXJlcS0+cnFfaW92WzBdLmlvdl9iYXNlID0gcmVxLT5ycV9idWZmZXI7CisJcmVxLT5ycV9pb3ZbMF0uaW92X2xlbiAgPSBkYXRhX29mZjsKKworCXJlcS0+cnFfaW92WzFdLmlvdl9iYXNlID0gcmVxLT5ycV9wYWdlOworCXJlcS0+cnFfaW92WzFdLmlvdl9sZW4gID0gcmVxLT5ycV9yc2l6ZTsKKwlyZXEtPnJxX2lvdmxlbiA9IDI7CisKKwlyZXEtPnJxX3JsZW4gPSBzbWJfbGVuKHJlcS0+cnFfaGVhZGVyKSArIDQgLSByZXEtPnJxX2J5dGVzX3JlY3ZkOworfQorCitzdGF0aWMgaW50CitzbWJfcHJvY19yZWFkWChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQsIGNoYXIgKmRhdGEpCit7CisJc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIgPSBzZXJ2ZXJfZnJvbV9pbm9kZShpbm9kZSk7CisJdW5zaWduZWQgY2hhciAqYnVmOworCWludCByZXN1bHQ7CisJc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXE7CisJc3RhdGljIGNoYXIgcGFkW1NNQl9SRUFEWF9NQVhfUEFEXTsKKworCXJlc3VsdCA9IC1FTk9NRU07CisJaWYgKCEgKHJlcSA9IHNtYl9hbGxvY19yZXF1ZXN0KHNlcnZlciwgMCkpKQorCQlnb3RvIG91dDsKKworCXNtYl9zZXR1cF9oZWFkZXIocmVxLCBTTUJyZWFkWCwgMTIsIDApOworCWJ1ZiA9IHJlcS0+cnFfaGVhZGVyOworCVdTRVQoYnVmLCBzbWJfdnd2MCwgMHgwMGZmKTsKKwlXU0VUKGJ1Ziwgc21iX3Z3djEsIDApOworCVdTRVQoYnVmLCBzbWJfdnd2MiwgU01CX0koaW5vZGUpLT5maWxlaWQpOworCURTRVQoYnVmLCBzbWJfdnd2MywgKHUzMilvZmZzZXQpOyAgICAgICAgICAgICAgIC8qIGxvdyAzMiBiaXRzICovCisJV1NFVChidWYsIHNtYl92d3Y1LCBjb3VudCk7CisJV1NFVChidWYsIHNtYl92d3Y2LCAwKTsKKwlEU0VUKGJ1Ziwgc21iX3Z3djcsIDApOworCVdTRVQoYnVmLCBzbWJfdnd2OSwgMCk7CisJRFNFVChidWYsIHNtYl92d3YxMCwgKHUzMikob2Zmc2V0ID4+IDMyKSk7ICAgICAgLyogaGlnaCAzMiBiaXRzICovCisJV1NFVChidWYsIHNtYl92d3YxMSwgMCk7CisKKwlyZXEtPnJxX3BhZ2UgPSBkYXRhOworCXJlcS0+cnFfcnNpemUgPSBjb3VudDsKKwlyZXEtPnJxX2NhbGxiYWNrID0gc21iX3Byb2NfcmVhZFhfZGF0YTsKKwlyZXEtPnJxX2J1ZmZlciA9IHBhZDsKKwlyZXEtPnJxX2J1ZnNpemUgPSBTTUJfUkVBRFhfTUFYX1BBRDsKKwlyZXEtPnJxX2ZsYWdzIHw9IFNNQl9SRVFfU1RBVElDIHwgU01CX1JFUV9OT1JFVFJZOworCisJcmVzdWx0ID0gc21iX3JlcXVlc3Rfb2socmVxLCBTTUJyZWFkWCwgMTIsIC0xKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBvdXRfZnJlZTsKKwlyZXN1bHQgPSBXVkFMKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2NSk7CisKK291dF9mcmVlOgorCXNtYl9ycHV0KHJlcSk7CitvdXQ6CisJVkVSQk9TRSgiaW5vPSVsZCwgZmlsZWlkPSVkLCBjb3VudD0lZCwgcmVzdWx0PSVkXG4iLAorCQlpbm9kZS0+aV9pbm8sIFNNQl9JKGlub2RlKS0+ZmlsZWlkLCBjb3VudCwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50CitzbWJfcHJvY193cml0ZVgoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IG9mZnNldCwgaW50IGNvdW50LCBjb25zdCBjaGFyICpkYXRhKQoreworCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyID0gc2VydmVyX2Zyb21faW5vZGUoaW5vZGUpOworCWludCByZXN1bHQ7CisJdTggKnA7CisJc3RhdGljIHU4IHBhZFs0XTsKKwlzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcTsKKworCXJlc3VsdCA9IC1FTk9NRU07CisJaWYgKCEgKHJlcSA9IHNtYl9hbGxvY19yZXF1ZXN0KHNlcnZlciwgMCkpKQorCQlnb3RvIG91dDsKKworCVZFUkJPU0UoImlubz0lbGQsIGZpbGVpZD0lZCwgY291bnQ9JWRAJUxkXG4iLAorCQlpbm9kZS0+aV9pbm8sIFNNQl9JKGlub2RlKS0+ZmlsZWlkLCBjb3VudCwgb2Zmc2V0KTsKKworCXAgPSBzbWJfc2V0dXBfaGVhZGVyKHJlcSwgU01Cd3JpdGVYLCAxNCwgY291bnQgKyAxKTsKKwlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2MCwgMHgwMGZmKTsKKwlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2MSwgMCk7CisJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djIsIFNNQl9JKGlub2RlKS0+ZmlsZWlkKTsKKwlEU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2MywgKHUzMilvZmZzZXQpOwkvKiBsb3cgMzIgYml0cyAqLworCURTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl92d3Y1LCAwKTsKKwlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2NywgMCk7CQkvKiB3cml0ZSBtb2RlICovCisJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djgsIDApOworCVdTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl92d3Y5LCAwKTsKKwlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2MTAsIGNvdW50KTsJCS8qIGRhdGEgbGVuZ3RoICovCisJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djExLCBzbWJfdnd2MTIgKyAyICsgMSk7CisJRFNFVChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djEyLCAodTMyKShvZmZzZXQgPj4gMzIpKTsKKworCXJlcS0+cnFfaW92WzFdLmlvdl9iYXNlID0gcGFkOworCXJlcS0+cnFfaW92WzFdLmlvdl9sZW4gPSAxOworCXJlcS0+cnFfaW92WzJdLmlvdl9iYXNlID0gKGNoYXIgKikgZGF0YTsKKwlyZXEtPnJxX2lvdlsyXS5pb3ZfbGVuID0gY291bnQ7CisJcmVxLT5ycV9pb3ZsZW4gPSAzOworCXJlcS0+cnFfZmxhZ3MgfD0gU01CX1JFUV9OT1JFVFJZOworCisJcmVzdWx0ID0gc21iX3JlcXVlc3Rfb2socmVxLCBTTUJ3cml0ZVgsIDYsIDApOworIAlpZiAocmVzdWx0ID49IDApCisJCXJlc3VsdCA9IFdWQUwocmVxLT5ycV9oZWFkZXIsIHNtYl92d3YyKTsKKworCXNtYl9ycHV0KHJlcSk7CitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50CitzbWJfcHJvY19jcmVhdGUoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBfX3UxNiBhdHRyLCB0aW1lX3QgY3RpbWUsIF9fdTE2ICpmaWxlaWQpCit7CisJc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIgPSBzZXJ2ZXJfZnJvbV9kZW50cnkoZGVudHJ5KTsKKwljaGFyICpwOworCWludCByZXN1bHQ7CisJc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXE7CisKKwlyZXN1bHQgPSAtRU5PTUVNOworCWlmICghIChyZXEgPSBzbWJfYWxsb2NfcmVxdWVzdChzZXJ2ZXIsIFBBR0VfU0laRSkpKQorCQlnb3RvIG91dDsKKworCXAgPSBzbWJfc2V0dXBfaGVhZGVyKHJlcSwgU01CY3JlYXRlLCAzLCAwKTsKKwlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2MCwgYXR0cik7CisJRFNFVChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djEsIHV0YzJsb2NhbChzZXJ2ZXIsIGN0aW1lKSk7CisJcmVzdWx0ID0gc21iX3NpbXBsZV9lbmNvZGVfcGF0aChyZXEsICZwLCBkZW50cnksIE5VTEwpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCXNtYl9zZXR1cF9iY2MocmVxLCBwKTsKKworCXJlc3VsdCA9IHNtYl9yZXF1ZXN0X29rKHJlcSwgU01CY3JlYXRlLCAxLCAwKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBvdXRfZnJlZTsKKworCSpmaWxlaWQgPSBXVkFMKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2MCk7CisJcmVzdWx0ID0gMDsKKworb3V0X2ZyZWU6CisJc21iX3JwdXQocmVxKTsKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQKK3NtYl9wcm9jX212KHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksIHN0cnVjdCBkZW50cnkgKm5ld19kZW50cnkpCit7CisJc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIgPSBzZXJ2ZXJfZnJvbV9kZW50cnkob2xkX2RlbnRyeSk7CisJY2hhciAqcDsKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxOworCisJcmVzdWx0ID0gLUVOT01FTTsKKwlpZiAoISAocmVxID0gc21iX2FsbG9jX3JlcXVlc3Qoc2VydmVyLCBQQUdFX1NJWkUpKSkKKwkJZ290byBvdXQ7CisKKwlwID0gc21iX3NldHVwX2hlYWRlcihyZXEsIFNNQm12LCAxLCAwKTsKKwlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2MCwgYVNZU1RFTSB8IGFISURERU4gfCBhRElSKTsKKwlyZXN1bHQgPSBzbWJfc2ltcGxlX2VuY29kZV9wYXRoKHJlcSwgJnAsIG9sZF9kZW50cnksIE5VTEwpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCXJlc3VsdCA9IHNtYl9zaW1wbGVfZW5jb2RlX3BhdGgocmVxLCAmcCwgbmV3X2RlbnRyeSwgTlVMTCk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisJc21iX3NldHVwX2JjYyhyZXEsIHApOworCisJaWYgKChyZXN1bHQgPSBzbWJfcmVxdWVzdF9vayhyZXEsIFNNQm12LCAwLCAwKSkgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCXJlc3VsdCA9IDA7CisKK291dF9mcmVlOgorCXNtYl9ycHV0KHJlcSk7CitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIENvZGUgY29tbW9uIHRvIG1rZGlyIGFuZCBybWRpci4KKyAqLworc3RhdGljIGludAorc21iX3Byb2NfZ2VuZXJpY19jb21tYW5kKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgX191OCBjb21tYW5kKQoreworCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyID0gc2VydmVyX2Zyb21fZGVudHJ5KGRlbnRyeSk7CisJY2hhciAqcDsKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxOworCisJcmVzdWx0ID0gLUVOT01FTTsKKwlpZiAoISAocmVxID0gc21iX2FsbG9jX3JlcXVlc3Qoc2VydmVyLCBQQUdFX1NJWkUpKSkKKwkJZ290byBvdXQ7CisKKwlwID0gc21iX3NldHVwX2hlYWRlcihyZXEsIGNvbW1hbmQsIDAsIDApOworCXJlc3VsdCA9IHNtYl9zaW1wbGVfZW5jb2RlX3BhdGgocmVxLCAmcCwgZGVudHJ5LCBOVUxMKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBvdXRfZnJlZTsKKwlzbWJfc2V0dXBfYmNjKHJlcSwgcCk7CisKKwlyZXN1bHQgPSBzbWJfcmVxdWVzdF9vayhyZXEsIGNvbW1hbmQsIDAsIDApOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCXJlc3VsdCA9IDA7CisKK291dF9mcmVlOgorCXNtYl9ycHV0KHJlcSk7CitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50CitzbWJfcHJvY19ta2RpcihzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJcmV0dXJuIHNtYl9wcm9jX2dlbmVyaWNfY29tbWFuZChkZW50cnksIFNNQm1rZGlyKTsKK30KKworaW50CitzbWJfcHJvY19ybWRpcihzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJcmV0dXJuIHNtYl9wcm9jX2dlbmVyaWNfY29tbWFuZChkZW50cnksIFNNQnJtZGlyKTsKK30KKworI2lmIFNNQkZTX1BPU0lYX1VOTElOSworLyoKKyAqIFJlbW92ZXMgcmVhZG9ubHkgYXR0cmlidXRlIGZyb20gYSBmaWxlLiBVc2VkIGJ5IHVubGluayB0byBnaXZlIHBvc2l4CisgKiBzZW1hbnRpY3MuCisgKi8KK3N0YXRpYyBpbnQKK3NtYl9zZXRfcncoc3RydWN0IGRlbnRyeSAqZGVudHJ5LHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyKQoreworCWludCByZXN1bHQ7CisJc3RydWN0IHNtYl9mYXR0ciBmYXR0cjsKKworCS8qIEZJWE1FOiBjaWZzVUUgc2hvdWxkIGFsbG93IHJlbW92aW5nIGEgcmVhZG9ubHkgZmlsZS4gKi8KKworCS8qIGZpcnN0IGdldCBjdXJyZW50IGF0dHJpYnV0ZSAqLworCXNtYl9pbml0X2RpcmVudChzZXJ2ZXIsICZmYXR0cik7CisJcmVzdWx0ID0gc2VydmVyLT5vcHMtPmdldGF0dHIoc2VydmVyLCBkZW50cnksICZmYXR0cik7CisJc21iX2ZpbmlzaF9kaXJlbnQoc2VydmVyLCAmZmF0dHIpOworCWlmIChyZXN1bHQgPCAwKQorCQlyZXR1cm4gcmVzdWx0OworCisJLyogaWYgUk9OTFkgYXR0cmlidXRlIGlzIHNldCwgcmVtb3ZlIGl0ICovCisJaWYgKGZhdHRyLmF0dHIgJiBhUk9OTFkpIHsgIC8qIHJlYWQgb25seSBhdHRyaWJ1dGUgaXMgc2V0ICovCisJCWZhdHRyLmF0dHIgJj0gfmFST05MWTsKKwkJcmVzdWx0ID0gc21iX3Byb2Nfc2V0YXR0cl9jb3JlKHNlcnZlciwgZGVudHJ5LCBmYXR0ci5hdHRyKTsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKyNlbmRpZgorCitpbnQKK3NtYl9wcm9jX3VubGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIgPSBzZXJ2ZXJfZnJvbV9kZW50cnkoZGVudHJ5KTsKKwlpbnQgZmxhZyA9IDA7CisJY2hhciAqcDsKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxOworCisJcmVzdWx0ID0gLUVOT01FTTsKKwlpZiAoISAocmVxID0gc21iX2FsbG9jX3JlcXVlc3Qoc2VydmVyLCBQQUdFX1NJWkUpKSkKKwkJZ290byBvdXQ7CisKKyAgICAgIHJldHJ5OgorCXAgPSBzbWJfc2V0dXBfaGVhZGVyKHJlcSwgU01CdW5saW5rLCAxLCAwKTsKKwlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2MCwgYVNZU1RFTSB8IGFISURERU4pOworCXJlc3VsdCA9IHNtYl9zaW1wbGVfZW5jb2RlX3BhdGgocmVxLCAmcCwgZGVudHJ5LCBOVUxMKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBvdXRfZnJlZTsKKwlzbWJfc2V0dXBfYmNjKHJlcSwgcCk7CisKKwlpZiAoKHJlc3VsdCA9IHNtYl9yZXF1ZXN0X29rKHJlcSwgU01CdW5saW5rLCAwLCAwKSkgPCAwKSB7CisjaWYgU01CRlNfUE9TSVhfVU5MSU5LCisJCWlmIChyZXN1bHQgPT0gLUVBQ0NFUyAmJiAhZmxhZykgeworCQkJLyogUG9zaXggc2VtYW50aWNzIGlzIGZvciB0aGUgcmVhZC1vbmx5IHN0YXRlCisJCQkgICBvZiBhIGZpbGUgdG8gYmUgaWdub3JlZCBpbiB1bmxpbmsoKS4gSW4gdGhlCisJCQkgICBTTUIgd29ybGQgYSB1bmxpbmsoKSBpcyByZWZ1c2VkIG9uIGEKKwkJCSAgIHJlYWQtb25seSBmaWxlLiBUbyBtYWtlIHRoaW5ncyBlYXNpZXIgZm9yCisJCQkgICB1bml4IHVzZXJzIHdlIHRyeSB0byBvdmVycmlkZSB0aGUgZmlsZXMKKwkJCSAgIHBlcm1pc3Npb24gaWYgdGhlIHVubGluayBmYWlscyB3aXRoIHRoZQorCQkJICAgcmlnaHQgZXJyb3IuCisJCQkgICBUaGlzIGludHJvZHVjZXMgYSByYWNlIGNvbmRpdGlvbiB0aGF0IGNvdWxkCisJCQkgICBsZWFkIHRvIGEgZmlsZSBiZWluZyB3cml0dGVuIGJ5IHNvbWVvbmUgd2hvCisJCQkgICBzaG91bGRuJ3QgaGF2ZSBhY2Nlc3MsIGJ1dCBhcyBmYXIgYXMgSSBjYW4KKwkJCSAgIHRlbGwgdGhhdCBpcyB1bmF2b2lkYWJsZSAqLworCisJCQkvKiByZW1vdmUgUk9OTFkgYXR0cmlidXRlIGFuZCB0cnkgYWdhaW4gKi8KKwkJCXJlc3VsdCA9IHNtYl9zZXRfcncoZGVudHJ5LHNlcnZlcik7CisJCQlpZiAocmVzdWx0ID09IDApIHsKKwkJCQlmbGFnID0gMTsKKwkJCQlyZXEtPnJxX2ZsYWdzID0gMDsKKwkJCQlnb3RvIHJldHJ5OworCQkJfQorCQl9CisjZW5kaWYKKwkJZ290byBvdXRfZnJlZTsKKwl9CisJcmVzdWx0ID0gMDsKKworb3V0X2ZyZWU6CisJc21iX3JwdXQocmVxKTsKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCitpbnQKK3NtYl9wcm9jX2ZsdXNoKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBfX3UxNiBmaWxlaWQpCit7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcTsKKworCXJlc3VsdCA9IC1FTk9NRU07CisJaWYgKCEgKHJlcSA9IHNtYl9hbGxvY19yZXF1ZXN0KHNlcnZlciwgMCkpKQorCQlnb3RvIG91dDsKKworCXNtYl9zZXR1cF9oZWFkZXIocmVxLCBTTUJmbHVzaCwgMSwgMCk7CisJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djAsIGZpbGVpZCk7CisJcmVxLT5ycV9mbGFncyB8PSBTTUJfUkVRX05PUkVUUlk7CisJcmVzdWx0ID0gc21iX3JlcXVlc3Rfb2socmVxLCBTTUJmbHVzaCwgMCwgMCk7CisKKwlzbWJfcnB1dChyZXEpOworb3V0OgorCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQKK3NtYl9wcm9jX3RydW5jMzIoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGxlbmd0aCkKK3sKKwkvKgorCSAqIFdyaXRpbmcgMGJ5dGVzIGlzIG9sZC1TTUIgbWFnaWMgZm9yIHRydW5jYXRpbmcgZmlsZXMuCisJICogTUFYX05PTl9MRlMgc2hvdWxkIHByZXZlbnQgdGhpcyBmcm9tIGJlaW5nIGNhbGxlZCB3aXRoIGEgdG9vCisJICogbGFyZ2Ugb2Zmc2V0LgorCSAqLworCXJldHVybiBzbWJfcHJvY193cml0ZShpbm9kZSwgbGVuZ3RoLCAwLCBOVUxMKTsKK30KKworc3RhdGljIGludAorc21iX3Byb2NfdHJ1bmM2NChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgbGVuZ3RoKQoreworCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyID0gc2VydmVyX2Zyb21faW5vZGUoaW5vZGUpOworCWludCByZXN1bHQ7CisJY2hhciAqcGFyYW07CisJY2hhciAqZGF0YTsKKwlzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcTsKKworCXJlc3VsdCA9IC1FTk9NRU07CisJaWYgKCEgKHJlcSA9IHNtYl9hbGxvY19yZXF1ZXN0KHNlcnZlciwgMTQpKSkKKwkJZ290byBvdXQ7CisKKwlwYXJhbSA9IHJlcS0+cnFfYnVmZmVyOworCWRhdGEgPSByZXEtPnJxX2J1ZmZlciArIDY7CisKKwkvKiBGSVhNRTogbXVzdCB3ZSBhbHNvIHNldCBhbGxvY2F0aW9uIHNpemU/IHdpbk5UIHNlZW1zIHRvIGRvIHRoYXQgKi8KKwlXU0VUKHBhcmFtLCAwLCBTTUJfSShpbm9kZSktPmZpbGVpZCk7CisJV1NFVChwYXJhbSwgMiwgU01CX1NFVF9GSUxFX0VORF9PRl9GSUxFX0lORk8pOworCVdTRVQocGFyYW0sIDQsIDApOworCUxTRVQoZGF0YSwgMCwgbGVuZ3RoKTsKKworCXJlcS0+cnFfdHJhbnMyX2NvbW1hbmQgPSBUUkFOU0FDVDJfU0VURklMRUlORk87CisJcmVxLT5ycV9sZGF0YSA9IDg7CisJcmVxLT5ycV9kYXRhICA9IGRhdGE7CisJcmVxLT5ycV9scGFybSA9IDY7CisJcmVxLT5ycV9wYXJtICA9IHBhcmFtOworCXJlcS0+cnFfZmxhZ3MgfD0gU01CX1JFUV9OT1JFVFJZOworCXJlc3VsdCA9IHNtYl9hZGRfcmVxdWVzdChyZXEpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCisJcmVzdWx0ID0gMDsKKwlpZiAocmVxLT5ycV9yY2xzICE9IDApCisJCXJlc3VsdCA9IHNtYl9lcnJubyhyZXEpOworCitvdXRfZnJlZToKKwlzbWJfcnB1dChyZXEpOworb3V0OgorCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQKK3NtYl9wcm9jX3RydW5jOTUoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGxlbmd0aCkKK3sKKwlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciA9IHNlcnZlcl9mcm9tX2lub2RlKGlub2RlKTsKKwlpbnQgcmVzdWx0ID0gc21iX3Byb2NfdHJ1bmMzMihpbm9kZSwgbGVuZ3RoKTsKKyAKKwkvKgorCSAqIHdpbjl4IGRvZXNuJ3QgYXBwZWFyIHRvIHVwZGF0ZSB0aGUgc2l6ZSBpbW1lZGlhdGVseS4KKwkgKiBJdCB3aWxsIHJldHVybiB0aGUgb2xkIGZpbGUgc2l6ZSBhZnRlciB0aGUgdHJ1bmNhdGUsCisJICogY29uZnVzaW5nIHNtYmZzLiBTbyB3ZSBmb3JjZSBhbiB1cGRhdGUuCisJICoKKwkgKiBGSVhNRTogaXMgdGhpcyBzdGlsbCBuZWNlc3Nhcnk/CisJICovCisJc21iX3Byb2NfZmx1c2goc2VydmVyLCBTTUJfSShpbm9kZSktPmZpbGVpZCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQKK3NtYl9pbml0X2RpcmVudChzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgc3RydWN0IHNtYl9mYXR0ciAqZmF0dHIpCit7CisJbWVtc2V0KGZhdHRyLCAwLCBzaXplb2YoKmZhdHRyKSk7CisKKwlmYXR0ci0+Zl9ubGluayA9IDE7CisJZmF0dHItPmZfdWlkID0gc2VydmVyLT5tbnQtPnVpZDsKKwlmYXR0ci0+Zl9naWQgPSBzZXJ2ZXItPm1udC0+Z2lkOworCWZhdHRyLT5mX2Jsa3NpemUgPSBTTUJfU1RfQkxLU0laRTsKKwlmYXR0ci0+Zl91bml4ID0gMDsKK30KKworc3RhdGljIHZvaWQKK3NtYl9maW5pc2hfZGlyZW50KHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBzdHJ1Y3Qgc21iX2ZhdHRyICpmYXR0cikKK3sKKwlpZiAoZmF0dHItPmZfdW5peCkKKwkJcmV0dXJuOworCisJZmF0dHItPmZfbW9kZSA9IHNlcnZlci0+bW50LT5maWxlX21vZGU7CisJaWYgKGZhdHRyLT5hdHRyICYgYURJUikgeworCQlmYXR0ci0+Zl9tb2RlID0gc2VydmVyLT5tbnQtPmRpcl9tb2RlOworCQlmYXR0ci0+Zl9zaXplID0gU01CX1NUX0JMS1NJWkU7CisJfQorCS8qIENoZWNrIHRoZSByZWFkLW9ubHkgZmxhZyAqLworCWlmIChmYXR0ci0+YXR0ciAmIGFST05MWSkKKwkJZmF0dHItPmZfbW9kZSAmPSB+KFNfSVdVU1IgfCBTX0lXR1JQIHwgU19JV09USCk7CisKKwkvKiBIb3cgbWFueSA1MTIgYnl0ZSBibG9ja3MgZG8gd2UgbmVlZCBmb3IgdGhpcyBmaWxlPyAqLworCWZhdHRyLT5mX2Jsb2NrcyA9IDA7CisJaWYgKGZhdHRyLT5mX3NpemUgIT0gMCkKKwkJZmF0dHItPmZfYmxvY2tzID0gMSArICgoZmF0dHItPmZfc2l6ZS0xKSA+PiA5KTsKKwlyZXR1cm47Cit9CisKK3ZvaWQKK3NtYl9pbml0X3Jvb3RfZGlyZW50KHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBzdHJ1Y3Qgc21iX2ZhdHRyICpmYXR0ciwKKwkJICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXNtYl9pbml0X2RpcmVudChzZXJ2ZXIsIGZhdHRyKTsKKwlmYXR0ci0+YXR0ciA9IGFESVI7CisJZmF0dHItPmZfaW5vID0gMjsgLyogdHJhZGl0aW9uYWwgcm9vdCBpbm9kZSBudW1iZXIgKi8KKwlmYXR0ci0+Zl9tdGltZSA9IGN1cnJlbnRfZnNfdGltZShzYik7CisJc21iX2ZpbmlzaF9kaXJlbnQoc2VydmVyLCBmYXR0cik7Cit9CisKKy8qCisgKiBEZWNvZGUgYSBkaXJlbnQgZm9yIG9sZCBwcm90b2NvbHMKKyAqCisgKiBxbmFtZSBpcyBmaWxsZWQgd2l0aCB0aGUgZGVjb2RlZCwgYW5kIHBvc3NpYmx5IHRyYW5zbGF0ZWQsIG5hbWUuCisgKiBmYXR0ciByZWNlaXZlcyBkZWNvZGVkIGF0dHJpYnV0ZXMKKyAqCisgKiBCdWdzIE5vdGVkOgorICogKDEpIFBhdGh3b3JrcyBzZXJ2ZXJzIG1heSBwYWQgdGhlIG5hbWUgd2l0aCBleHRyYSBzcGFjZXMuCisgKi8KK3N0YXRpYyBjaGFyICoKK3NtYl9kZWNvZGVfc2hvcnRfZGlyZW50KHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBjaGFyICpwLAorCQkJc3RydWN0IHFzdHIgKnFuYW1lLCBzdHJ1Y3Qgc21iX2ZhdHRyICpmYXR0ciwKKwkJCXVuc2lnbmVkIGNoYXIgKm5hbWVfYnVmKQoreworCWludCBsZW47CisKKwkvKgorCSAqIFNNQiBkb2Vzbid0IGhhdmUgYSBjb25jZXB0IG9mIGlub2RlIG51bWJlcnMgLi4uCisJICovCisJc21iX2luaXRfZGlyZW50KHNlcnZlciwgZmF0dHIpOworCWZhdHRyLT5mX2lubyA9IDA7CS8qIEZJWE1FOiBkbyB3ZSBuZWVkIHRoaXM/ICovCisKKwlwICs9IFNNQl9TVEFUVVNfU0laRTsJLyogcmVzZXJ2ZWQgKHNlYXJjaF9zdGF0dXMpICovCisJZmF0dHItPmF0dHIgPSAqcDsKKwlmYXR0ci0+Zl9tdGltZS50dl9zZWMgPSBkYXRlX2RvczJ1bml4KHNlcnZlciwgV1ZBTChwLCAzKSwgV1ZBTChwLCAxKSk7CisJZmF0dHItPmZfbXRpbWUudHZfbnNlYyA9IDA7CisJZmF0dHItPmZfc2l6ZSA9IERWQUwocCwgNSk7CisJZmF0dHItPmZfY3RpbWUgPSBmYXR0ci0+Zl9tdGltZTsKKwlmYXR0ci0+Zl9hdGltZSA9IGZhdHRyLT5mX210aW1lOworCXFuYW1lLT5uYW1lID0gcCArIDk7CisJbGVuID0gc3RybmxlbihxbmFtZS0+bmFtZSwgMTIpOworCisJLyoKKwkgKiBUcmltIHRyYWlsaW5nIGJsYW5rcyBmb3IgUGF0aHdvcmtzIHNlcnZlcnMKKwkgKi8KKwl3aGlsZSAobGVuID4gMiAmJiBxbmFtZS0+bmFtZVtsZW4tMV0gPT0gJyAnKQorCQlsZW4tLTsKKworCXNtYl9maW5pc2hfZGlyZW50KHNlcnZlciwgZmF0dHIpOworCisjaWYgMAorCS8qIEZJWE1FOiBUaGVzZSBvbmx5IHdvcmsgZm9yIGFzY2lpIGNoYXJzLCBhbmQgcmVjZW50IHNtYm1vdW50IGRvZXNuJ3QKKwkgICBhbGxvdyB0aGUgZmxhZyB0byBiZSBzZXQgYW55d2F5LiBJdCBraWxscyBjb25zdC4gUmVtb3ZlPyAqLworCXN3aXRjaCAoc2VydmVyLT5vcHQuY2FzZV9oYW5kbGluZykgeworCWNhc2UgU01CX0NBU0VfVVBQRVI6CisJCXN0cl91cHBlcihlbnRyeS0+bmFtZSwgbGVuKTsKKwkJYnJlYWs7CisJY2FzZSBTTUJfQ0FTRV9MT1dFUjoKKwkJc3RyX2xvd2VyKGVudHJ5LT5uYW1lLCBsZW4pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisjZW5kaWYKKworCXFuYW1lLT5sZW4gPSAwOworCWxlbiA9IHNlcnZlci0+b3BzLT5jb252ZXJ0KG5hbWVfYnVmLCBTTUJfTUFYTkFNRUxFTiwKKwkJCQkgICBxbmFtZS0+bmFtZSwgbGVuLAorCQkJCSAgIHNlcnZlci0+cmVtb3RlX25scywgc2VydmVyLT5sb2NhbF9ubHMpOworCWlmIChsZW4gPiAwKSB7CisJCXFuYW1lLT5sZW4gPSBsZW47CisJCXFuYW1lLT5uYW1lID0gbmFtZV9idWY7CisJCURFQlVHMSgibGVuPSVkLCBuYW1lPSUuKnNcbiIscW5hbWUtPmxlbixxbmFtZS0+bGVuLHFuYW1lLT5uYW1lKTsKKwl9CisKKwlyZXR1cm4gcCArIDIyOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIHVzZWQgdG8gcmVhZCBpbiBkaXJlY3RvcnkgZW50cmllcyBmcm9tIHRoZSBuZXR3b3JrLgorICogTm90ZSB0aGF0IGl0IGlzIGZvciBzaG9ydCBkaXJlY3RvcnkgbmFtZSBzZWVrcywgaS5lLjogcHJvdG9jb2wgPAorICogU01CX1BST1RPQ09MX0xBTk1BTjIKKyAqLworc3RhdGljIGludAorc21iX3Byb2NfcmVhZGRpcl9zaG9ydChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpciwKKwkJICAgICAgIHN0cnVjdCBzbWJfY2FjaGVfY29udHJvbCAqY3RsKQoreworCXN0cnVjdCBkZW50cnkgKmRpciA9IGZpbHAtPmZfZGVudHJ5OworCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyID0gc2VydmVyX2Zyb21fZGVudHJ5KGRpcik7CisJc3RydWN0IHFzdHIgcW5hbWU7CisJc3RydWN0IHNtYl9mYXR0ciBmYXR0cjsKKwljaGFyICpwOworCWludCByZXN1bHQ7CisJaW50IGksIGZpcnN0LCBlbnRyaWVzX3NlZW4sIGVudHJpZXM7CisJaW50IGVudHJpZXNfYXNrZWQgPSAoc2VydmVyLT5vcHQubWF4X3htaXQgLSAxMDApIC8gU01CX0RJUklORk9fU0laRTsKKwlfX3UxNiBiY2M7CisJX191MTYgY291bnQ7CisJY2hhciBzdGF0dXNbU01CX1NUQVRVU19TSVpFXTsKKwlzdGF0aWMgc3RydWN0IHFzdHIgbWFzayA9IHsKKwkJLm5hbWUJPSAiKi4qIiwKKwkJLmxlbgk9IDMsCisJfTsKKwl1bnNpZ25lZCBjaGFyICpsYXN0X3N0YXR1czsKKwlzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcTsKKwl1bnNpZ25lZCBjaGFyICpuYW1lX2J1ZjsKKworCVZFUkJPU0UoIiVzLyVzXG4iLCBERU5UUllfUEFUSChkaXIpKTsKKworCWxvY2tfa2VybmVsKCk7CisKKwlyZXN1bHQgPSAtRU5PTUVNOworCWlmICghIChuYW1lX2J1ZiA9IGttYWxsb2MoU01CX01BWE5BTUVMRU4sIEdGUF9LRVJORUwpKSkKKwkJZ290byBvdXQ7CisKKwlmaXJzdCA9IDE7CisJZW50cmllcyA9IDA7CisJZW50cmllc19zZWVuID0gMjsgLyogaW1wbGljaXQgLiBhbmQgLi4gKi8KKworCXJlc3VsdCA9IC1FTk9NRU07CisJaWYgKCEgKHJlcSA9IHNtYl9hbGxvY19yZXF1ZXN0KHNlcnZlciwgc2VydmVyLT5vcHQubWF4X3htaXQpKSkKKwkJZ290byBvdXRfbmFtZTsKKworCXdoaWxlICgxKSB7CisJCXAgPSBzbWJfc2V0dXBfaGVhZGVyKHJlcSwgU01Cc2VhcmNoLCAyLCAwKTsKKwkJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djAsIGVudHJpZXNfYXNrZWQpOworCQlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2MSwgYURJUik7CisJCWlmIChmaXJzdCA9PSAxKSB7CisJCQlyZXN1bHQgPSBzbWJfc2ltcGxlX2VuY29kZV9wYXRoKHJlcSwgJnAsIGRpciwgJm1hc2spOworCQkJaWYgKHJlc3VsdCA8IDApCisJCQkJZ290byBvdXRfZnJlZTsKKwkJCWlmIChwICsgMyA+IChjaGFyICopcmVxLT5ycV9idWZmZXIgKyByZXEtPnJxX2J1ZnNpemUpIHsKKwkJCQlyZXN1bHQgPSAtRU5BTUVUT09MT05HOworCQkJCWdvdG8gb3V0X2ZyZWU7CisJCQl9CisJCQkqcCsrID0gNTsKKwkJCVdTRVQocCwgMCwgMCk7CisJCQlwICs9IDI7CisJCQlmaXJzdCA9IDA7CisJCX0gZWxzZSB7CisJCQlpZiAocCArIDUgKyBTTUJfU1RBVFVTX1NJWkUgPgorCQkJICAgIChjaGFyICopcmVxLT5ycV9idWZmZXIgKyByZXEtPnJxX2J1ZnNpemUpIHsKKwkJCQlyZXN1bHQgPSAtRU5BTUVUT09MT05HOworCQkJCWdvdG8gb3V0X2ZyZWU7CisJCQl9CisJCQkJCisJCQkqcCsrID0gNDsKKwkJCSpwKysgPSAwOworCQkJKnArKyA9IDU7CisJCQlXU0VUKHAsIDAsIFNNQl9TVEFUVVNfU0laRSk7CisJCQlwICs9IDI7CisJCQltZW1jcHkocCwgc3RhdHVzLCBTTUJfU1RBVFVTX1NJWkUpOworCQkJcCArPSBTTUJfU1RBVFVTX1NJWkU7CisJCX0KKworCQlzbWJfc2V0dXBfYmNjKHJlcSwgcCk7CisKKwkJcmVzdWx0ID0gc21iX3JlcXVlc3Rfb2socmVxLCBTTUJzZWFyY2gsIDEsIC0xKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCWlmICgocmVxLT5ycV9yY2xzID09IEVSUkRPUykgJiYgCisJCQkgICAgKHJlcS0+cnFfZXJyICA9PSBFUlJub2ZpbGVzKSkKKwkJCQlicmVhazsKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKwkJY291bnQgPSBXVkFMKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2MCk7CisJCWlmIChjb3VudCA8PSAwKQorCQkJYnJlYWs7CisKKwkJcmVzdWx0ID0gLUVJTzsKKwkJYmNjID0gc21iX2JjYyhyZXEtPnJxX2hlYWRlcik7CisJCWlmIChiY2MgIT0gY291bnQgKiBTTUJfRElSSU5GT19TSVpFICsgMykKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCXAgPSByZXEtPnJxX2J1ZmZlciArIDM7CisKKworCQkvKiBNYWtlIHN1cmUgdGhlIHJlc3BvbnNlIGZpdHMgaW4gdGhlIGJ1ZmZlci4gRml4ZWQgc2l6ZWQgCisJCSAgIGVudHJpZXMgbWVhbnMgd2UgZG9uJ3QgaGF2ZSB0byBjaGVjayBpbiB0aGUgZGVjb2RlIGxvb3AuICovCisKKwkJbGFzdF9zdGF0dXMgPSByZXEtPnJxX2J1ZmZlciArIDMgKyAoY291bnQtMSkgKiBTTUJfRElSSU5GT19TSVpFOworCisJCWlmIChsYXN0X3N0YXR1cyArIFNNQl9ESVJJTkZPX1NJWkUgPj0KKwkJICAgIHJlcS0+cnFfYnVmZmVyICsgcmVxLT5ycV9idWZzaXplKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInNtYl9wcm9jX3JlYWRkaXJfc2hvcnQ6ICIKKwkJCSAgICAgICAibGFzdCBkaXIgZW50cnkgb3V0c2lkZSBidWZmZXIhICIKKwkJCSAgICAgICAiJWRAJXAgICVkQCVwXG4iLCBTTUJfRElSSU5GT19TSVpFLCBsYXN0X3N0YXR1cywKKwkJCSAgICAgICByZXEtPnJxX2J1ZnNpemUsIHJlcS0+cnFfYnVmZmVyKTsKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKworCQkvKiBSZWFkIHRoZSBsYXN0IGVudHJ5IGludG8gdGhlIHN0YXR1cyBmaWVsZC4gKi8KKwkJbWVtY3B5KHN0YXR1cywgbGFzdF9zdGF0dXMsIFNNQl9TVEFUVVNfU0laRSk7CisKKworCQkvKiBOb3cgd2UgYXJlIHJlYWR5IHRvIHBhcnNlIHNtYiBkaXJlY3RvcnkgZW50cmllcy4gKi8KKworCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQkJcCA9IHNtYl9kZWNvZGVfc2hvcnRfZGlyZW50KHNlcnZlciwgcCwgCisJCQkJCQkgICAgJnFuYW1lLCAmZmF0dHIsIG5hbWVfYnVmKTsKKwkJCWlmIChxbmFtZS5sZW4gPT0gMCkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGVudHJpZXNfc2VlbiA9PSAyICYmIHFuYW1lLm5hbWVbMF0gPT0gJy4nKSB7CisJCQkJaWYgKHFuYW1lLmxlbiA9PSAxKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAocW5hbWUubmFtZVsxXSA9PSAnLicgJiYgcW5hbWUubGVuID09IDIpCisJCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFzbWJfZmlsbF9jYWNoZShmaWxwLCBkaXJlbnQsIGZpbGxkaXIsIGN0bCwgCisJCQkJCSAgICAmcW5hbWUsICZmYXR0cikpCisJCQkJOwkvKiBzdG9wIHJlYWRpbmc/ICovCisJCQllbnRyaWVzX3NlZW4rKzsKKwkJfQorCX0KKwlyZXN1bHQgPSBlbnRyaWVzOworCitvdXRfZnJlZToKKwlzbWJfcnB1dChyZXEpOworb3V0X25hbWU6CisJa2ZyZWUobmFtZV9idWYpOworb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBzbWJfZGVjb2RlX3VuaXhfYmFzaWMoc3RydWN0IHNtYl9mYXR0ciAqZmF0dHIsIHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBjaGFyICpwKQoreworCXU2NCBzaXplLCBkaXNrX2J5dGVzOworCisJLyogRklYTUU6IHZlcmlmeSBubHMgc3VwcG9ydC4gYWxsIGlzIHNlbnQgYXMgdXRmOD8gKi8KKworCWZhdHRyLT5mX3VuaXggPSAxOworCWZhdHRyLT5mX21vZGUgPSAwOworCisJLyogRklYTUU6IHVzZSB0aGUgdW5pcXVlSUQgZnJvbSB0aGUgcmVtb3RlIGluc3RlYWQ/ICovCisJLyogMCBMIGZpbGUgc2l6ZSBpbiBieXRlcyAqLworCS8qIDggTCBmaWxlIHNpemUgb24gZGlzayBpbiBieXRlcyAoYmxvY2sgY291bnQpICovCisJLyogNDAgTCB1aWQgKi8KKwkvKiA0OCBMIGdpZCAqLworCS8qIDU2IFcgZmlsZSB0eXBlICovCisJLyogNjAgTCBkZXZtYWpvciAqLworCS8qIDY4IEwgZGV2bWlub3IgKi8KKwkvKiA3NiBMIHVuaXF1ZSBJRCAoaW5vZGUpICovCisJLyogODQgTCBwZXJtaXNzaW9ucyAqLworCS8qIDkyIEwgbGluayBjb3VudCAqLworCisJc2l6ZSA9IExWQUwocCwgMCk7CisJZGlza19ieXRlcyA9IExWQUwocCwgOCk7CisKKwkvKgorCSAqIFNvbWUgc2FtYmEgdmVyc2lvbnMgcm91bmQgdXAgb24tZGlzayBieXRlIHVzYWdlCisJICogdG8gMU1CIGJvdW5kYXJpZXMsIG1ha2luZyBpdCB1c2VsZXNzLiBXaGVuIHNlZWluZworCSAqIHRoYXQsIHVzZSB0aGUgc2l6ZSBpbnN0ZWFkLgorCSAqLworCWlmICghKGRpc2tfYnl0ZXMgJiAweGZmZmZmKSkKKwkJZGlza19ieXRlcyA9IHNpemUrNTExOworCisJZmF0dHItPmZfc2l6ZSA9IHNpemU7CisJZmF0dHItPmZfYmxvY2tzID0gZGlza19ieXRlcyA+PiA5OworCWZhdHRyLT5mX2N0aW1lID0gc21iX250dXRjMnVuaXh1dGMoTFZBTChwLCAxNikpOworCWZhdHRyLT5mX2F0aW1lID0gc21iX250dXRjMnVuaXh1dGMoTFZBTChwLCAyNCkpOworCWZhdHRyLT5mX210aW1lID0gc21iX250dXRjMnVuaXh1dGMoTFZBTChwLCAzMikpOworCisJaWYgKHNlcnZlci0+bW50LT5mbGFncyAmIFNNQl9NT1VOVF9VSUQpCisJCWZhdHRyLT5mX3VpZCA9IHNlcnZlci0+bW50LT51aWQ7CisJZWxzZQorCQlmYXR0ci0+Zl91aWQgPSBMVkFMKHAsIDQwKTsKKworCWlmIChzZXJ2ZXItPm1udC0+ZmxhZ3MgJiBTTUJfTU9VTlRfR0lEKQorCQlmYXR0ci0+Zl9naWQgPSBzZXJ2ZXItPm1udC0+Z2lkOworCWVsc2UKKwkJZmF0dHItPmZfZ2lkID0gTFZBTChwLCA0OCk7CisKKwlmYXR0ci0+Zl9tb2RlIHw9IHNtYl9maWxldHlwZV90b19tb2RlKFdWQUwocCwgNTYpKTsKKworCWlmIChTX0lTQkxLKGZhdHRyLT5mX21vZGUpIHx8IFNfSVNDSFIoZmF0dHItPmZfbW9kZSkpIHsKKwkJX191NjQgbWFqb3IgPSBMVkFMKHAsIDYwKTsKKwkJX191NjQgbWlub3IgPSBMVkFMKHAsIDY4KTsKKworCQlmYXR0ci0+Zl9yZGV2ID0gTUtERVYobWFqb3IgJiAweGZmZmZmZmZmLCBtaW5vciAmIDB4ZmZmZmZmZmYpOworCQlpZiAoTUFKT1IoZmF0dHItPmZfcmRldikgIT0gKG1ham9yICYgMHhmZmZmZmZmZikgfHwKKwkgICAgCU1JTk9SKGZhdHRyLT5mX3JkZXYpICE9IChtaW5vciAmIDB4ZmZmZmZmZmYpKQorCQkJZmF0dHItPmZfcmRldiA9IDA7CisJfQorCisJZmF0dHItPmZfbW9kZSB8PSBMVkFMKHAsIDg0KTsKKworCWlmICggKHNlcnZlci0+bW50LT5mbGFncyAmIFNNQl9NT1VOVF9ETU9ERSkgJiYKKwkgICAgIChTX0lTRElSKGZhdHRyLT5mX21vZGUpKSApCisJCWZhdHRyLT5mX21vZGUgPSAoc2VydmVyLT5tbnQtPmRpcl9tb2RlICYgU19JUldYVUdPKSB8IFNfSUZESVI7CisJZWxzZSBpZiAoIChzZXJ2ZXItPm1udC0+ZmxhZ3MgJiBTTUJfTU9VTlRfRk1PREUpICYmCisJICAgICAgICAgICEoU19JU0RJUihmYXR0ci0+Zl9tb2RlKSkgKQorCQlmYXR0ci0+Zl9tb2RlID0gKHNlcnZlci0+bW50LT5maWxlX21vZGUgJiBTX0lSV1hVR08pIHwKKwkJCQkoZmF0dHItPmZfbW9kZSAmIFNfSUZNVCk7CisKK30KKworLyoKKyAqIEludGVycHJldCBhIGxvbmcgZmlsZW5hbWUgc3RydWN0dXJlIHVzaW5nIHRoZSBzcGVjaWZpZWQgaW5mbyBsZXZlbDoKKyAqICAgbGV2ZWwgMSBmb3IgYW55dGhpbmcgYmVsb3cgTlQxIHByb3RvY29sCisgKiAgIGxldmVsIDI2MCBmb3IgTlQxIHByb3RvY29sCisgKgorICogcW5hbWUgaXMgZmlsbGVkIHdpdGggdGhlIGRlY29kZWQsIGFuZCBwb3NzaWJseSB0cmFuc2xhdGVkLCBuYW1lCisgKiBmYXR0ciByZWNlaXZlcyBkZWNvZGVkIGF0dHJpYnV0ZXMuCisgKgorICogQnVncyBOb3RlZDoKKyAqICgxKSBXaW4gTlQgNC4wIGFwcGVuZHMgYSBudWxsIGJ5dGUgdG8gbmFtZXMgYW5kIGNvdW50cyBpdCBpbiB0aGUgbGVuZ3RoIQorICovCitzdGF0aWMgY2hhciAqCitzbWJfZGVjb2RlX2xvbmdfZGlyZW50KHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBjaGFyICpwLCBpbnQgbGV2ZWwsCisJCSAgICAgICBzdHJ1Y3QgcXN0ciAqcW5hbWUsIHN0cnVjdCBzbWJfZmF0dHIgKmZhdHRyLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqbmFtZV9idWYpCit7CisJY2hhciAqcmVzdWx0OworCXVuc2lnbmVkIGludCBsZW4gPSAwOworCWludCBuOworCV9fdTE2IGRhdGUsIHRpbWU7CisJaW50IHVuaWNvZGUgPSAoc2VydmVyLT5tbnQtPmZsYWdzICYgU01CX01PVU5UX1VOSUNPREUpOworCisJLyoKKwkgKiBTTUIgZG9lc24ndCBoYXZlIGEgY29uY2VwdCBvZiBpbm9kZSBudW1iZXJzIC4uLgorCSAqLworCXNtYl9pbml0X2RpcmVudChzZXJ2ZXIsIGZhdHRyKTsKKwlmYXR0ci0+Zl9pbm8gPSAwOwkvKiBGSVhNRTogZG8gd2UgbmVlZCB0aGlzPyAqLworCisJc3dpdGNoIChsZXZlbCkgeworCWNhc2UgMToKKwkJbGVuID0gKigodW5zaWduZWQgY2hhciAqKSBwICsgMjIpOworCQlxbmFtZS0+bmFtZSA9IHAgKyAyMzsKKwkJcmVzdWx0ID0gcCArIDI0ICsgbGVuOworCisJCWRhdGUgPSBXVkFMKHAsIDApOworCQl0aW1lID0gV1ZBTChwLCAyKTsKKwkJZmF0dHItPmZfY3RpbWUudHZfc2VjID0gZGF0ZV9kb3MydW5peChzZXJ2ZXIsIGRhdGUsIHRpbWUpOworCQlmYXR0ci0+Zl9jdGltZS50dl9uc2VjID0gMDsKKworCQlkYXRlID0gV1ZBTChwLCA0KTsKKwkJdGltZSA9IFdWQUwocCwgNik7CisJCWZhdHRyLT5mX2F0aW1lLnR2X3NlYyA9IGRhdGVfZG9zMnVuaXgoc2VydmVyLCBkYXRlLCB0aW1lKTsKKwkJZmF0dHItPmZfYXRpbWUudHZfbnNlYyA9IDA7CisKKwkJZGF0ZSA9IFdWQUwocCwgOCk7CisJCXRpbWUgPSBXVkFMKHAsIDEwKTsKKwkJZmF0dHItPmZfbXRpbWUudHZfc2VjID0gZGF0ZV9kb3MydW5peChzZXJ2ZXIsIGRhdGUsIHRpbWUpOworCQlmYXR0ci0+Zl9tdGltZS50dl9uc2VjID0gMDsKKwkJZmF0dHItPmZfc2l6ZSA9IERWQUwocCwgMTIpOworCQkvKiBVTE9ORyBhbGxvY2F0aW9uIHNpemUgKi8KKwkJZmF0dHItPmF0dHIgPSBXVkFMKHAsIDIwKTsKKworCQlWRVJCT1NFKCJpbmZvIDEgYXQgJXAsIGxlbj0lZCwgbmFtZT0lLipzXG4iLAorCQkJcCwgbGVuLCBsZW4sIHFuYW1lLT5uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSAyNjA6CisJCXJlc3VsdCA9IHAgKyBXVkFMKHAsIDApOworCQlsZW4gPSBEVkFMKHAsIDYwKTsKKwkJaWYgKGxlbiA+IDI1NSkgbGVuID0gMjU1OworCQkvKiBOVDQgbnVsbCB0ZXJtaW5hdGVzLCB1bmxlc3Mgd2UgYXJlIHVzaW5nIHVuaWNvZGUgLi4uICovCisJCXFuYW1lLT5uYW1lID0gcCArIDk0OworCQlpZiAoIXVuaWNvZGUgJiYgbGVuICYmIHFuYW1lLT5uYW1lW2xlbi0xXSA9PSAnXDAnKQorCQkJbGVuLS07CisKKwkJZmF0dHItPmZfY3RpbWUgPSBzbWJfbnR1dGMydW5peHV0YyhMVkFMKHAsIDgpKTsKKwkJZmF0dHItPmZfYXRpbWUgPSBzbWJfbnR1dGMydW5peHV0YyhMVkFMKHAsIDE2KSk7CisJCWZhdHRyLT5mX210aW1lID0gc21iX250dXRjMnVuaXh1dGMoTFZBTChwLCAyNCkpOworCQkvKiBjaGFuZ2UgdGltZSAoMzIpICovCisJCWZhdHRyLT5mX3NpemUgPSBMVkFMKHAsIDQwKTsKKwkJLyogYWxsb2Mgc2l6ZSAoNDgpICovCisJCWZhdHRyLT5hdHRyID0gRFZBTChwLCA1Nik7CisKKwkJVkVSQk9TRSgiaW5mbyAyNjAgYXQgJXAsIGxlbj0lZCwgbmFtZT0lLipzXG4iLAorCQkJcCwgbGVuLCBsZW4sIHFuYW1lLT5uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBTTUJfRklORF9GSUxFX1VOSVg6CisJCXJlc3VsdCA9IHAgKyBXVkFMKHAsIDApOworCQlxbmFtZS0+bmFtZSA9IHAgKyAxMDg7CisKKwkJbGVuID0gc3RybGVuKHFuYW1lLT5uYW1lKTsKKwkJLyogRklYTUU6IHNob3VsZCB3ZSBjaGVjayB0aGUgbGVuZ3RoPz8gKi8KKworCQlwICs9IDg7CisJCXNtYl9kZWNvZGVfdW5peF9iYXNpYyhmYXR0ciwgc2VydmVyLCBwKTsKKwkJVkVSQk9TRSgiaW5mbyBTTUJfRklORF9GSUxFX1VOSVggYXQgJXAsIGxlbj0lZCwgbmFtZT0lLipzXG4iLAorCQkJcCwgbGVuLCBsZW4sIHFuYW1lLT5uYW1lKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJUEFSQU5PSUEoIlVua25vd24gaW5mbyBsZXZlbCAlZFxuIiwgbGV2ZWwpOworCQlyZXN1bHQgPSBwICsgV1ZBTChwLCAwKTsKKwkJZ290byBvdXQ7CisJfQorCisJc21iX2ZpbmlzaF9kaXJlbnQoc2VydmVyLCBmYXR0cik7CisKKyNpZiAwCisJLyogRklYTUU6IFRoZXNlIG9ubHkgd29yayBmb3IgYXNjaWkgY2hhcnMsIGFuZCByZWNlbnQgc21ibW91bnQgZG9lc24ndAorCSAgIGFsbG93IHRoZSBmbGFnIHRvIGJlIHNldCBhbnl3YXkuIFJlbW92ZT8gKi8KKwlzd2l0Y2ggKHNlcnZlci0+b3B0LmNhc2VfaGFuZGxpbmcpIHsKKwljYXNlIFNNQl9DQVNFX1VQUEVSOgorCQlzdHJfdXBwZXIocW5hbWUtPm5hbWUsIGxlbik7CisJCWJyZWFrOworCWNhc2UgU01CX0NBU0VfTE9XRVI6CisJCXN0cl9sb3dlcihxbmFtZS0+bmFtZSwgbGVuKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorI2VuZGlmCisKKwlxbmFtZS0+bGVuID0gMDsKKwluID0gc2VydmVyLT5vcHMtPmNvbnZlcnQobmFtZV9idWYsIFNNQl9NQVhOQU1FTEVOLAorCQkJCSBxbmFtZS0+bmFtZSwgbGVuLAorCQkJCSBzZXJ2ZXItPnJlbW90ZV9ubHMsIHNlcnZlci0+bG9jYWxfbmxzKTsKKwlpZiAobiA+IDApIHsKKwkJcW5hbWUtPmxlbiA9IG47CisJCXFuYW1lLT5uYW1lID0gbmFtZV9idWY7CisJfQorCitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyogZmluZGZpcnN0L2ZpbmRuZXh0IGZsYWdzICovCisjZGVmaW5lIFNNQl9DTE9TRV9BRlRFUl9GSVJTVCAoMTw8MCkKKyNkZWZpbmUgU01CX0NMT1NFX0lGX0VORCAoMTw8MSkKKyNkZWZpbmUgU01CX1JFUVVJUkVfUkVTVU1FX0tFWSAoMTw8MikKKyNkZWZpbmUgU01CX0NPTlRJTlVFX0JJVCAoMTw8MykKKworLyoKKyAqIE5vdGU6IHNhbWJhLTIuMC43IChhdCBsZWFzdCkgaGFzIGEgdmVyeSBzaW1pbGFyIHJvdXRpbmUsIGNsaV9saXN0LCBpbgorICogc291cmNlL2xpYnNtYi9jbGlsaXN0LmMuIFdoZW4gbG9va2luZyBmb3Igc21iIGJ1Z3MgaW4gdGhlIHJlYWRkaXIgY29kZSwKKyAqIGdvIHRoZXJlIGZvciBhZHZpc2UuCisgKgorICogQnVncyBOb3RlZDoKKyAqICgxKSBXaGVuIHVzaW5nIEluZm8gTGV2ZWwgMSBXaW4gTlQgNC4wIHRydW5jYXRlcyBkaXJlY3RvcnkgbGlzdGluZ3MgCisgKiBmb3IgY2VydGFpbiBwYXR0ZXJucyBvZiBuYW1lcyBhbmQvb3IgbGVuZ3Rocy4gVGhlIGJyZWFrYWdlIHBhdHRlcm4KKyAqIGlzIGNvbXBsZXRlbHkgcmVwcm9kdWNpYmxlIGFuZCBjYW4gYmUgdG9nZ2xlZCBieSB0aGUgY3JlYXRpb24gb2YgYQorICogc2luZ2xlIGZpbGUuIChFLmcuIGVjaG8gaGkgPmZvbyBicmVha3MsIHJtIC1mIGZvbyB3b3Jrcy4pCisgKi8KK3N0YXRpYyBpbnQKK3NtYl9wcm9jX3JlYWRkaXJfbG9uZyhzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpciwKKwkJICAgICAgc3RydWN0IHNtYl9jYWNoZV9jb250cm9sICpjdGwpCit7CisJc3RydWN0IGRlbnRyeSAqZGlyID0gZmlscC0+Zl9kZW50cnk7CisJc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIgPSBzZXJ2ZXJfZnJvbV9kZW50cnkoZGlyKTsKKwlzdHJ1Y3QgcXN0ciBxbmFtZTsKKwlzdHJ1Y3Qgc21iX2ZhdHRyIGZhdHRyOworCisJdW5zaWduZWQgY2hhciAqcCwgKmxhc3RuYW1lOworCWNoYXIgKm1hc2ssICpwYXJhbTsKKwlfX3UxNiBjb21tYW5kOworCWludCBmaXJzdCwgZW50cmllc19zZWVuOworCisJLyogQm90aCBOVCBhbmQgT1MvMiBhY2NlcHQgaW5mbyBsZXZlbCAxIChidXQgc2VlIG5vdGUgYmVsb3cpLiAqLworCWludCBpbmZvX2xldmVsID0gMjYwOworCWNvbnN0IGludCBtYXhfbWF0Y2hlcyA9IDUxMjsKKworCXVuc2lnbmVkIGludCBmZl9zZWFyY2hjb3VudCA9IDA7CisJdW5zaWduZWQgaW50IGZmX2VvcyA9IDA7CisJdW5zaWduZWQgaW50IGZmX2xhc3RuYW1lID0gMDsKKwl1bnNpZ25lZCBpbnQgZmZfZGlyX2hhbmRsZSA9IDA7CisJdW5zaWduZWQgaW50IGxvb3BfY291bnQgPSAwOworCXVuc2lnbmVkIGludCBtYXNrX2xlbiwgaTsKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxOworCXVuc2lnbmVkIGNoYXIgKm5hbWVfYnVmOworCXN0YXRpYyBzdHJ1Y3QgcXN0ciBzdGFyID0geworCQkubmFtZQk9ICIqIiwKKwkJLmxlbgk9IDEsCisJfTsKKworCWxvY2tfa2VybmVsKCk7CisKKwkvKgorCSAqIFdlIGFsd2F5cyBwcmVmZXIgdW5peCBzdHlsZS4gVXNlIGluZm8gbGV2ZWwgMSBmb3Igb2xkZXIKKwkgKiBzZXJ2ZXJzIHRoYXQgZG9uJ3QgZG8gMjYwLgorCSAqLworCWlmIChzZXJ2ZXItPm9wdC5jYXBhYmlsaXRpZXMgJiBTTUJfQ0FQX1VOSVgpCisJCWluZm9fbGV2ZWwgPSBTTUJfRklORF9GSUxFX1VOSVg7CisJZWxzZSBpZiAoc2VydmVyLT5vcHQucHJvdG9jb2wgPCBTTUJfUFJPVE9DT0xfTlQxKQorCQlpbmZvX2xldmVsID0gMTsKKworCXJlc3VsdCA9IC1FTk9NRU07CisJaWYgKCEgKG5hbWVfYnVmID0ga21hbGxvYyhTTUJfTUFYTkFNRUxFTisyLCBHRlBfS0VSTkVMKSkpCisJCWdvdG8gb3V0OworCWlmICghIChyZXEgPSBzbWJfYWxsb2NfcmVxdWVzdChzZXJ2ZXIsIHNlcnZlci0+b3B0Lm1heF94bWl0KSkpCisJCWdvdG8gb3V0X25hbWU7CisJcGFyYW0gPSByZXEtPnJxX2J1ZmZlcjsKKworCS8qCisJICogRW5jb2RlIHRoZSBpbml0aWFsIHBhdGgKKwkgKi8KKwltYXNrID0gcGFyYW0gKyAxMjsKKworCXJlc3VsdCA9IHNtYl9lbmNvZGVfcGF0aChzZXJ2ZXIsIG1hc2ssIFNNQl9NQVhQQVRITEVOKzEsIGRpciwgJnN0YXIpOworCWlmIChyZXN1bHQgPD0gMCkKKwkJZ290byBvdXRfZnJlZTsKKwltYXNrX2xlbiA9IHJlc3VsdCAtIDE7CS8qIG1hc2tfbGVuIGlzIHN0cmxlbiwgbm90ICNieXRlcyAqLworCXJlc3VsdCA9IDA7CisJZmlyc3QgPSAxOworCVZFUkJPU0UoInN0YXJ0aW5nIG1hc2tfbGVuPSVkLCBtYXNrPSVzXG4iLCBtYXNrX2xlbiwgbWFzayk7CisKKwllbnRyaWVzX3NlZW4gPSAyOworCWZmX2VvcyA9IDA7CisKKwl3aGlsZSAoZmZfZW9zID09IDApIHsKKwkJbG9vcF9jb3VudCArPSAxOworCQlpZiAobG9vcF9jb3VudCA+IDEwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJzbWJfcHJvY19yZWFkZGlyX2xvbmc6ICIKKwkJCSAgICAgICAiTG9vcGluZyBpbiBGSU5EX05FWFQ/P1xuIik7CisJCQlyZXN1bHQgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZmlyc3QgIT0gMCkgeworCQkJY29tbWFuZCA9IFRSQU5TQUNUMl9GSU5ERklSU1Q7CisJCQlXU0VUKHBhcmFtLCAwLCBhU1lTVEVNIHwgYUhJRERFTiB8IGFESVIpOworCQkJV1NFVChwYXJhbSwgMiwgbWF4X21hdGNoZXMpOwkvKiBtYXggY291bnQgKi8KKwkJCVdTRVQocGFyYW0sIDQsIFNNQl9DTE9TRV9JRl9FTkQpOworCQkJV1NFVChwYXJhbSwgNiwgaW5mb19sZXZlbCk7CisJCQlEU0VUKHBhcmFtLCA4LCAwKTsKKwkJfSBlbHNlIHsKKwkJCWNvbW1hbmQgPSBUUkFOU0FDVDJfRklORE5FWFQ7CisKKwkJCVZFUkJPU0UoImhhbmRsZT0weCVYLCBsYXN0bmFtZT0lZCwgbWFzaz0lLipzXG4iLAorCQkJCWZmX2Rpcl9oYW5kbGUsIGZmX2xhc3RuYW1lLCBtYXNrX2xlbiwgbWFzayk7CisKKwkJCVdTRVQocGFyYW0sIDAsIGZmX2Rpcl9oYW5kbGUpOwkvKiBzZWFyY2ggaGFuZGxlICovCisJCQlXU0VUKHBhcmFtLCAyLCBtYXhfbWF0Y2hlcyk7CS8qIG1heCBjb3VudCAqLworCQkJV1NFVChwYXJhbSwgNCwgaW5mb19sZXZlbCk7CisJCQlEU0VUKHBhcmFtLCA2LCAwKTsKKwkJCVdTRVQocGFyYW0sIDEwLCBTTUJfQ09OVElOVUVfQklUfFNNQl9DTE9TRV9JRl9FTkQpOworCQl9CisKKwkJcmVxLT5ycV90cmFuczJfY29tbWFuZCA9IGNvbW1hbmQ7CisJCXJlcS0+cnFfbGRhdGEgPSAwOworCQlyZXEtPnJxX2RhdGEgID0gTlVMTDsKKwkJcmVxLT5ycV9scGFybSA9IDEyICsgbWFza19sZW4gKyAxOworCQlyZXEtPnJxX3Bhcm0gID0gcGFyYW07CisJCXJlcS0+cnFfZmxhZ3MgPSAwOworCQlyZXN1bHQgPSBzbWJfYWRkX3JlcXVlc3QocmVxKTsKKwkJaWYgKHJlc3VsdCA8IDApIHsKKwkJCVBBUkFOT0lBKCJlcnJvcj0lZCwgYnJlYWtpbmdcbiIsIHJlc3VsdCk7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChyZXEtPnJxX3JjbHMgPT0gRVJSU1JWICYmIHJlcS0+cnFfZXJyID09IEVSUmVycm9yKSB7CisJCQkvKiBhIGRhbW4gV2luOTUgYnVnIC0gc29tZXRpbWVzIGl0IGNsYWdzIGlmIHlvdSAKKwkJCSAgIGFzayBpdCB0b28gZmFzdCAqLworCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJCQlzY2hlZHVsZV90aW1lb3V0KEhaLzUpOworCQkJY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisJCWlmIChyZXEtPnJxX3JjbHMgIT0gMCkgeworCQkJcmVzdWx0ID0gc21iX2Vycm5vKHJlcSk7CisJCQlQQVJBTk9JQSgibmFtZT0lcywgcmVzdWx0PSVkLCByY2xzPSVkLCBlcnI9JWRcbiIsCisJCQkJIG1hc2ssIHJlc3VsdCwgcmVxLT5ycV9yY2xzLCByZXEtPnJxX2Vycik7CisJCQlicmVhazsKKwkJfQorCisJCS8qIHBhcnNlIG91dCBzb21lIGltcG9ydGFudCByZXR1cm4gaW5mbyAqLworCQlpZiAoZmlyc3QgIT0gMCkgeworCQkJZmZfZGlyX2hhbmRsZSA9IFdWQUwocmVxLT5ycV9wYXJtLCAwKTsKKwkJCWZmX3NlYXJjaGNvdW50ID0gV1ZBTChyZXEtPnJxX3Bhcm0sIDIpOworCQkJZmZfZW9zID0gV1ZBTChyZXEtPnJxX3Bhcm0sIDQpOworCQkJZmZfbGFzdG5hbWUgPSBXVkFMKHJlcS0+cnFfcGFybSwgOCk7CisJCX0gZWxzZSB7CisJCQlmZl9zZWFyY2hjb3VudCA9IFdWQUwocmVxLT5ycV9wYXJtLCAwKTsKKwkJCWZmX2VvcyA9IFdWQUwocmVxLT5ycV9wYXJtLCAyKTsKKwkJCWZmX2xhc3RuYW1lID0gV1ZBTChyZXEtPnJxX3Bhcm0sIDYpOworCQl9CisKKwkJaWYgKGZmX3NlYXJjaGNvdW50ID09IDApCisJCQlicmVhazsKKworCQkvKiBOb3cgd2UgYXJlIHJlYWR5IHRvIHBhcnNlIHNtYiBkaXJlY3RvcnkgZW50cmllcy4gKi8KKworCQkvKiBwb2ludCB0byB0aGUgZGF0YSBieXRlcyAqLworCQlwID0gcmVxLT5ycV9kYXRhOworCQlmb3IgKGkgPSAwOyBpIDwgZmZfc2VhcmNoY291bnQ7IGkrKykgeworCQkJLyogbWFrZSBzdXJlIHdlIHN0YXkgd2l0aGluIHRoZSBidWZmZXIgKi8KKwkJCWlmIChwID49IHJlcS0+cnFfZGF0YSArIHJlcS0+cnFfbGRhdGEpIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgInNtYl9wcm9jX3JlYWRkaXJfbG9uZzogIgorCQkJCSAgICAgICAiZGlyZW50IHBvaW50ZXIgb3V0c2lkZSBidWZmZXIhICIKKwkJCQkgICAgICAgIiVwICAlZEAlcFxuIiwKKwkJCQkgICAgICAgcCwgcmVxLT5ycV9sZGF0YSwgcmVxLT5ycV9kYXRhKTsKKwkJCQlyZXN1bHQgPSAtRUlPOyAvKiBhbHdheXMgYSBjb21tLiBlcnJvcj8gKi8KKwkJCQlnb3RvIG91dF9mcmVlOworCQkJfQorCisJCQlwID0gc21iX2RlY29kZV9sb25nX2RpcmVudChzZXJ2ZXIsIHAsIGluZm9fbGV2ZWwsCisJCQkJCQkgICAmcW5hbWUsICZmYXR0ciwgbmFtZV9idWYpOworCisJCQkvKiBpZ25vcmUgLiBhbmQgLi4gZnJvbSB0aGUgc2VydmVyICovCisJCQlpZiAoZW50cmllc19zZWVuID09IDIgJiYgcW5hbWUubmFtZVswXSA9PSAnLicpIHsKKwkJCQlpZiAocW5hbWUubGVuID09IDEpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChxbmFtZS5uYW1lWzFdID09ICcuJyAmJiBxbmFtZS5sZW4gPT0gMikKKwkJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmICghc21iX2ZpbGxfY2FjaGUoZmlscCwgZGlyZW50LCBmaWxsZGlyLCBjdGwsIAorCQkJCQkgICAgJnFuYW1lLCAmZmF0dHIpKQorCQkJCTsJLyogc3RvcCByZWFkaW5nPyAqLworCQkJZW50cmllc19zZWVuKys7CisJCX0KKworCQlWRVJCT1NFKCJyZWNlaXZlZCAlZCBlbnRyaWVzLCBlb3M9JWRcbiIsIGZmX3NlYXJjaGNvdW50LGZmX2Vvcyk7CisKKwkJLyoKKwkJICogV2UgbWlnaHQgbmVlZCB0aGUgbGFzdG5hbWUgZm9yIGNvbnRpbnVhdGlvbnMuCisJCSAqCisJCSAqIE5vdGUgdGhhdCBzb21lIHNlcnZlcnMgKHdpbjk1PykgcG9pbnQgdG8gdGhlIGZpbGVuYW1lIGFuZAorCQkgKiBvdGhlcnMgKE5UNCwgU2FtYmEgdXNpbmcgTlQxKSB0byB0aGUgZGlyIGVudHJ5LiBXZSBhc3N1bWUKKwkJICogaGVyZSB0aGF0IHRob3NlIHdobyBkbyBub3QgcG9pbnQgdG8gYSBmaWxlbmFtZSBkbyBub3QgbmVlZAorCQkgKiB0aGlzIGluZm8gdG8gY29udGludWUgdGhlIGxpc3RpbmcuCisJCSAqCisJCSAqIE9TLzIgbmVlZHMgdGhpcyBhbmQgdGFsa3MgaW5mb2xldmVsIDEuCisJCSAqIE5ldEFwcHMgd2FudCBsYXN0bmFtZSB3aXRoIGluZm9sZXZlbCAyNjAuCisJCSAqIHdpbjJrIHdhbnQgbGFzdG5hbWUgd2l0aCBpbmZvbGV2ZWwgMjYwLCBhbmQgcG9pbnRzIHRvCisJCSAqICAgICAgIHRoZSByZWNvcmQgbm90IHRvIHRoZSBuYW1lLgorCQkgKiBTYW1iYStDaWZzVW5peEV4dCBkb2Vzbid0IG5lZWQgbGFzdG5hbWUuCisJCSAqCisJCSAqIEJvdGggYXJlIGhhcHB5IGlmIHdlIHJldHVybiB0aGUgZGF0YSB0aGV5IHBvaW50IHRvLiBTbyB3ZSBkby4KKwkJICogKEZJWE1FOiBhYm92ZSBpcyBub3QgdHJ1ZSB3aXRoIHdpbjJrKQorCQkgKi8KKwkJbWFza19sZW4gPSAwOworCQlpZiAoaW5mb19sZXZlbCAhPSBTTUJfRklORF9GSUxFX1VOSVggJiYKKwkJICAgIGZmX2xhc3RuYW1lID4gMCAmJiBmZl9sYXN0bmFtZSA8IHJlcS0+cnFfbGRhdGEpIHsKKwkJCWxhc3RuYW1lID0gcmVxLT5ycV9kYXRhICsgZmZfbGFzdG5hbWU7CisKKwkJCXN3aXRjaCAoaW5mb19sZXZlbCkgeworCQkJY2FzZSAyNjA6CisJCQkJbWFza19sZW4gPSByZXEtPnJxX2xkYXRhIC0gZmZfbGFzdG5hbWU7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJLyogbGFzdG5hbWUgcG9pbnRzIHRvIGEgbGVuZ3RoIGJ5dGUgKi8KKwkJCQltYXNrX2xlbiA9ICpsYXN0bmFtZSsrOworCQkJCWlmIChmZl9sYXN0bmFtZSArIDEgKyBtYXNrX2xlbiA+IHJlcS0+cnFfbGRhdGEpCisJCQkJCW1hc2tfbGVuID0gcmVxLT5ycV9sZGF0YSAtIGZmX2xhc3RuYW1lIC0gMTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyoKKwkJCSAqIFVwZGF0ZSB0aGUgbWFzayBzdHJpbmcgZm9yIHRoZSBuZXh0IG1lc3NhZ2UuCisJCQkgKi8KKwkJCWlmIChtYXNrX2xlbiA+IDI1NSkKKwkJCQltYXNrX2xlbiA9IDI1NTsKKwkJCWlmIChtYXNrX2xlbikKKwkJCQlzdHJuY3B5KG1hc2ssIGxhc3RuYW1lLCBtYXNrX2xlbik7CisJCX0KKwkJbWFza19sZW4gPSBzdHJubGVuKG1hc2ssIG1hc2tfbGVuKTsKKwkJVkVSQk9TRSgibmV3IG1hc2ssIGxlbj0lZEAlZCBvZiAlZCwgbWFzaz0lLipzXG4iLAorCQkJbWFza19sZW4sIGZmX2xhc3RuYW1lLCByZXEtPnJxX2xkYXRhLCBtYXNrX2xlbiwgbWFzayk7CisKKwkJZmlyc3QgPSAwOworCQlsb29wX2NvdW50ID0gMDsKKwl9CisKK291dF9mcmVlOgorCXNtYl9ycHV0KHJlcSk7CitvdXRfbmFtZToKKwlrZnJlZShuYW1lX2J1Zik7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBUaGlzIHZlcnNpb24gdXNlcyB0aGUgdHJhbnMyIFRSQU5TQUNUMl9GSU5ERklSU1QgbWVzc2FnZSAKKyAqIHRvIGdldCB0aGUgYXR0cmlidXRlIGRhdGEuCisgKgorICogQnVncyBOb3RlZDoKKyAqLworc3RhdGljIGludAorc21iX3Byb2NfZ2V0YXR0cl9mZihzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCQkJc3RydWN0IHNtYl9mYXR0ciAqZmF0dHIpCit7CisJY2hhciAqcGFyYW0sICptYXNrOworCV9fdTE2IGRhdGUsIHRpbWU7CisJaW50IG1hc2tfbGVuLCByZXN1bHQ7CisJc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXE7CisKKwlyZXN1bHQgPSAtRU5PTUVNOworCWlmICghIChyZXEgPSBzbWJfYWxsb2NfcmVxdWVzdChzZXJ2ZXIsIFBBR0VfU0laRSkpKQorCQlnb3RvIG91dDsKKwlwYXJhbSA9IHJlcS0+cnFfYnVmZmVyOworCW1hc2sgPSBwYXJhbSArIDEyOworCisJbWFza19sZW4gPSBzbWJfZW5jb2RlX3BhdGgoc2VydmVyLCBtYXNrLCBTTUJfTUFYUEFUSExFTisxLCBkZW50cnksTlVMTCk7CisJaWYgKG1hc2tfbGVuIDwgMCkgeworCQlyZXN1bHQgPSBtYXNrX2xlbjsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisJVkVSQk9TRSgibmFtZT0lcywgbGVuPSVkXG4iLCBtYXNrLCBtYXNrX2xlbik7CisJV1NFVChwYXJhbSwgMCwgYVNZU1RFTSB8IGFISURERU4gfCBhRElSKTsKKwlXU0VUKHBhcmFtLCAyLCAxKTsJLyogbWF4IGNvdW50ICovCisJV1NFVChwYXJhbSwgNCwgMSk7CS8qIGNsb3NlIGFmdGVyIHRoaXMgY2FsbCAqLworCVdTRVQocGFyYW0sIDYsIDEpOwkvKiBpbmZvX2xldmVsICovCisJRFNFVChwYXJhbSwgOCwgMCk7CisKKwlyZXEtPnJxX3RyYW5zMl9jb21tYW5kID0gVFJBTlNBQ1QyX0ZJTkRGSVJTVDsKKwlyZXEtPnJxX2xkYXRhID0gMDsKKwlyZXEtPnJxX2RhdGEgID0gTlVMTDsKKwlyZXEtPnJxX2xwYXJtID0gMTIgKyBtYXNrX2xlbjsKKwlyZXEtPnJxX3Bhcm0gID0gcGFyYW07CisJcmVxLT5ycV9mbGFncyA9IDA7CisJcmVzdWx0ID0gc21iX2FkZF9yZXF1ZXN0KHJlcSk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisJaWYgKHJlcS0+cnFfcmNscyAhPSAwKSB7CisJCXJlc3VsdCA9IHNtYl9lcnJubyhyZXEpOworI2lmZGVmIFNNQkZTX1BBUkFOT0lBCisJCWlmIChyZXN1bHQgIT0gLUVOT0VOVCkKKwkJCVBBUkFOT0lBKCJlcnJvciBmb3IgJXMsIHJjbHM9JWQsIGVycj0lZFxuIiwKKwkJCQkgbWFzaywgcmVxLT5ycV9yY2xzLCByZXEtPnJxX2Vycik7CisjZW5kaWYKKwkJZ290byBvdXRfZnJlZTsKKwl9CisJLyogTWFrZSBzdXJlIHdlIGdvdCBlbm91Z2ggZGF0YSAuLi4gKi8KKwlyZXN1bHQgPSAtRUlOVkFMOworCWlmIChyZXEtPnJxX2xkYXRhIDwgMjIgfHwgV1ZBTChyZXEtPnJxX3Bhcm0sIDIpICE9IDEpIHsKKwkJUEFSQU5PSUEoImJhZCByZXN1bHQgZm9yICVzLCBsZW49JWQsIGNvdW50PSVkXG4iLAorCQkJIG1hc2ssIHJlcS0+cnFfbGRhdGEsIFdWQUwocmVxLT5ycV9wYXJtLCAyKSk7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJLyoKKwkgKiBEZWNvZGUgdGhlIHJlc3BvbnNlIGludG8gdGhlIGZhdHRyIC4uLgorCSAqLworCWRhdGUgPSBXVkFMKHJlcS0+cnFfZGF0YSwgMCk7CisJdGltZSA9IFdWQUwocmVxLT5ycV9kYXRhLCAyKTsKKwlmYXR0ci0+Zl9jdGltZS50dl9zZWMgPSBkYXRlX2RvczJ1bml4KHNlcnZlciwgZGF0ZSwgdGltZSk7CisJZmF0dHItPmZfY3RpbWUudHZfbnNlYyA9IDA7CisKKwlkYXRlID0gV1ZBTChyZXEtPnJxX2RhdGEsIDQpOworCXRpbWUgPSBXVkFMKHJlcS0+cnFfZGF0YSwgNik7CisJZmF0dHItPmZfYXRpbWUudHZfc2VjID0gZGF0ZV9kb3MydW5peChzZXJ2ZXIsIGRhdGUsIHRpbWUpOworCWZhdHRyLT5mX2F0aW1lLnR2X25zZWMgPSAwOworCisJZGF0ZSA9IFdWQUwocmVxLT5ycV9kYXRhLCA4KTsKKwl0aW1lID0gV1ZBTChyZXEtPnJxX2RhdGEsIDEwKTsKKwlmYXR0ci0+Zl9tdGltZS50dl9zZWMgPSBkYXRlX2RvczJ1bml4KHNlcnZlciwgZGF0ZSwgdGltZSk7CisJZmF0dHItPmZfbXRpbWUudHZfbnNlYyA9IDA7CisJVkVSQk9TRSgibmFtZT0lcywgZGF0ZT0leCwgdGltZT0leCwgbXRpbWU9JWxkXG4iLAorCQltYXNrLCBkYXRlLCB0aW1lLCBmYXR0ci0+Zl9tdGltZSk7CisJZmF0dHItPmZfc2l6ZSA9IERWQUwocmVxLT5ycV9kYXRhLCAxMik7CisJLyogVUxPTkcgYWxsb2NhdGlvbiBzaXplICovCisJZmF0dHItPmF0dHIgPSBXVkFMKHJlcS0+cnFfZGF0YSwgMjApOworCXJlc3VsdCA9IDA7CisKK291dF9mcmVlOgorCXNtYl9ycHV0KHJlcSk7CitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludAorc21iX3Byb2NfZ2V0YXR0cl9jb3JlKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBzdHJ1Y3QgZGVudHJ5ICpkaXIsCisJCSAgICAgIHN0cnVjdCBzbWJfZmF0dHIgKmZhdHRyKQoreworCWludCByZXN1bHQ7CisJY2hhciAqcDsKKwlzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcTsKKworCXJlc3VsdCA9IC1FTk9NRU07CisJaWYgKCEgKHJlcSA9IHNtYl9hbGxvY19yZXF1ZXN0KHNlcnZlciwgUEFHRV9TSVpFKSkpCisJCWdvdG8gb3V0OworCisJcCA9IHNtYl9zZXR1cF9oZWFkZXIocmVxLCBTTUJnZXRhdHIsIDAsIDApOworCXJlc3VsdCA9IHNtYl9zaW1wbGVfZW5jb2RlX3BhdGgocmVxLCAmcCwgZGlyLCBOVUxMKTsKKwlpZiAocmVzdWx0IDwgMCkKKyAJCWdvdG8gb3V0X2ZyZWU7CisJc21iX3NldHVwX2JjYyhyZXEsIHApOworCisJaWYgKChyZXN1bHQgPSBzbWJfcmVxdWVzdF9vayhyZXEsIFNNQmdldGF0ciwgMTAsIDApKSA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisJZmF0dHItPmF0dHIgICAgPSBXVkFMKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2MCk7CisJZmF0dHItPmZfbXRpbWUudHZfc2VjID0gbG9jYWwydXRjKHNlcnZlciwgRFZBTChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djEpKTsKKwlmYXR0ci0+Zl9tdGltZS50dl9uc2VjID0gMDsKKwlmYXR0ci0+Zl9zaXplICA9IERWQUwocmVxLT5ycV9oZWFkZXIsIHNtYl92d3YzKTsKKwlmYXR0ci0+Zl9jdGltZSA9IGZhdHRyLT5mX210aW1lOyAKKwlmYXR0ci0+Zl9hdGltZSA9IGZhdHRyLT5mX210aW1lOyAKKyNpZmRlZiBTTUJGU19ERUJVR19USU1FU1RBTVAKKwlwcmludGsoImdldGF0dHJfY29yZTogJXMvJXMsIG10aW1lPSVsZFxuIiwKKwkgICAgICAgREVOVFJZX1BBVEgoZGlyKSwgZmF0dHItPmZfbXRpbWUpOworI2VuZGlmCisJcmVzdWx0ID0gMDsKKworb3V0X2ZyZWU6CisJc21iX3JwdXQocmVxKTsKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogQnVncyBOb3RlZDoKKyAqICgxKSBXaW4gOTUgc3dhcHMgdGhlIGRhdGUgYW5kIHRpbWUgZmllbGRzIGluIHRoZSBzdGFuZGFyZCBpbmZvIGxldmVsLgorICovCitzdGF0aWMgaW50CitzbWJfcHJvY19nZXRhdHRyX3RyYW5zMihzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgc3RydWN0IGRlbnRyeSAqZGlyLAorCQkJc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXEsIGludCBpbmZvbGV2ZWwpCit7CisJY2hhciAqcCwgKnBhcmFtOworCWludCByZXN1bHQ7CisKKwlwYXJhbSA9IHJlcS0+cnFfYnVmZmVyOworCVdTRVQocGFyYW0sIDAsIGluZm9sZXZlbCk7CisJRFNFVChwYXJhbSwgMiwgMCk7CisJcmVzdWx0ID0gc21iX2VuY29kZV9wYXRoKHNlcnZlciwgcGFyYW0rNiwgU01CX01BWFBBVEhMRU4rMSwgZGlyLCBOVUxMKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBvdXQ7CisJcCA9IHBhcmFtICsgNiArIHJlc3VsdDsKKworCXJlcS0+cnFfdHJhbnMyX2NvbW1hbmQgPSBUUkFOU0FDVDJfUVBBVEhJTkZPOworCXJlcS0+cnFfbGRhdGEgPSAwOworCXJlcS0+cnFfZGF0YSAgPSBOVUxMOworCXJlcS0+cnFfbHBhcm0gPSBwIC0gcGFyYW07CisJcmVxLT5ycV9wYXJtICA9IHBhcmFtOworCXJlcS0+cnFfZmxhZ3MgPSAwOworCXJlc3VsdCA9IHNtYl9hZGRfcmVxdWVzdChyZXEpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIG91dDsKKwlpZiAocmVxLT5ycV9yY2xzICE9IDApIHsKKwkJVkVSQk9TRSgiZm9yICVzOiByZXN1bHQ9JWQsIHJjbHM9JWQsIGVycj0lZFxuIiwKKwkJCSZwYXJhbVs2XSwgcmVzdWx0LCByZXEtPnJxX3JjbHMsIHJlcS0+cnFfZXJyKTsKKwkJcmVzdWx0ID0gc21iX2Vycm5vKHJlcSk7CisJCWdvdG8gb3V0OworCX0KKwlyZXN1bHQgPSAtRU5PRU5UOworCWlmIChyZXEtPnJxX2xkYXRhIDwgMjIpIHsKKwkJUEFSQU5PSUEoIm5vdCBlbm91Z2ggZGF0YSBmb3IgJXMsIGxlbj0lZFxuIiwKKwkJCSAmcGFyYW1bNl0sIHJlcS0+cnFfbGRhdGEpOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXN1bHQgPSAwOworb3V0OgorCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQKK3NtYl9wcm9jX2dldGF0dHJfdHJhbnMyX3N0ZChzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgc3RydWN0IGRlbnRyeSAqZGlyLAorCQkJICAgIHN0cnVjdCBzbWJfZmF0dHIgKmF0dHIpCit7CisJdTE2IGRhdGUsIHRpbWU7CisJaW50IG9mZl9kYXRlID0gMCwgb2ZmX3RpbWUgPSAyOworCWludCByZXN1bHQ7CisJc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXE7CisKKwlyZXN1bHQgPSAtRU5PTUVNOworCWlmICghIChyZXEgPSBzbWJfYWxsb2NfcmVxdWVzdChzZXJ2ZXIsIFBBR0VfU0laRSkpKQorCQlnb3RvIG91dDsKKworCXJlc3VsdCA9IHNtYl9wcm9jX2dldGF0dHJfdHJhbnMyKHNlcnZlciwgZGlyLCByZXEsIFNNQl9JTkZPX1NUQU5EQVJEKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBvdXRfZnJlZTsKKworCS8qCisJICogS2x1ZGdlIGFsZXJ0OiBXaW4gOTUgc3dhcHMgdGhlIGRhdGUgYW5kIHRpbWUgZmllbGQsCisJICogY29udHJhcnkgdG8gdGhlIENJRlMgZG9jcyBhbmQgV2luIE5UIHByYWN0aWNlLgorCSAqLworCWlmIChzZXJ2ZXItPm1udC0+ZmxhZ3MgJiBTTUJfTU9VTlRfV0lOOTUpIHsKKwkJb2ZmX2RhdGUgPSAyOworCQlvZmZfdGltZSA9IDA7CisJfQorCWRhdGUgPSBXVkFMKHJlcS0+cnFfZGF0YSwgb2ZmX2RhdGUpOworCXRpbWUgPSBXVkFMKHJlcS0+cnFfZGF0YSwgb2ZmX3RpbWUpOworCWF0dHItPmZfY3RpbWUudHZfc2VjID0gZGF0ZV9kb3MydW5peChzZXJ2ZXIsIGRhdGUsIHRpbWUpOworCWF0dHItPmZfY3RpbWUudHZfbnNlYyA9IDA7CisKKwlkYXRlID0gV1ZBTChyZXEtPnJxX2RhdGEsIDQgKyBvZmZfZGF0ZSk7CisJdGltZSA9IFdWQUwocmVxLT5ycV9kYXRhLCA0ICsgb2ZmX3RpbWUpOworCWF0dHItPmZfYXRpbWUudHZfc2VjID0gZGF0ZV9kb3MydW5peChzZXJ2ZXIsIGRhdGUsIHRpbWUpOworCWF0dHItPmZfYXRpbWUudHZfbnNlYyA9IDA7CisKKwlkYXRlID0gV1ZBTChyZXEtPnJxX2RhdGEsIDggKyBvZmZfZGF0ZSk7CisJdGltZSA9IFdWQUwocmVxLT5ycV9kYXRhLCA4ICsgb2ZmX3RpbWUpOworCWF0dHItPmZfbXRpbWUudHZfc2VjID0gZGF0ZV9kb3MydW5peChzZXJ2ZXIsIGRhdGUsIHRpbWUpOworCWF0dHItPmZfbXRpbWUudHZfbnNlYyA9IDA7CisjaWZkZWYgU01CRlNfREVCVUdfVElNRVNUQU1QCisJcHJpbnRrKEtFUk5fREVCVUcgImdldGF0dHJfdHJhbnMyOiAlcy8lcywgZGF0ZT0leCwgdGltZT0leCwgbXRpbWU9JWxkXG4iLAorCSAgICAgICBERU5UUllfUEFUSChkaXIpLCBkYXRlLCB0aW1lLCBhdHRyLT5mX210aW1lKTsKKyNlbmRpZgorCWF0dHItPmZfc2l6ZSA9IERWQUwocmVxLT5ycV9kYXRhLCAxMik7CisJYXR0ci0+YXR0ciA9IFdWQUwocmVxLT5ycV9kYXRhLCAyMCk7CisKK291dF9mcmVlOgorCXNtYl9ycHV0KHJlcSk7CitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludAorc21iX3Byb2NfZ2V0YXR0cl90cmFuczJfYWxsKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBzdHJ1Y3QgZGVudHJ5ICpkaXIsCisJCQkgICAgc3RydWN0IHNtYl9mYXR0ciAqYXR0cikKK3sKKwlzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcTsKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gLUVOT01FTTsKKwlpZiAoISAocmVxID0gc21iX2FsbG9jX3JlcXVlc3Qoc2VydmVyLCBQQUdFX1NJWkUpKSkKKwkJZ290byBvdXQ7CisKKwlyZXN1bHQgPSBzbWJfcHJvY19nZXRhdHRyX3RyYW5zMihzZXJ2ZXIsIGRpciwgcmVxLAorCQkJCQkgU01CX1FVRVJZX0ZJTEVfQUxMX0lORk8pOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCisJYXR0ci0+Zl9jdGltZSA9IHNtYl9udHV0YzJ1bml4dXRjKExWQUwocmVxLT5ycV9kYXRhLCAwKSk7CisJYXR0ci0+Zl9hdGltZSA9IHNtYl9udHV0YzJ1bml4dXRjKExWQUwocmVxLT5ycV9kYXRhLCA4KSk7CisJYXR0ci0+Zl9tdGltZSA9IHNtYl9udHV0YzJ1bml4dXRjKExWQUwocmVxLT5ycV9kYXRhLCAxNikpOworCS8qIGNoYW5nZSAoMjQpICovCisJYXR0ci0+YXR0ciA9IFdWQUwocmVxLT5ycV9kYXRhLCAzMik7CisJLyogcGFkPyAoMzQpICovCisJLyogYWxsb2NhdGVkIHNpemUgKDQwKSAqLworCWF0dHItPmZfc2l6ZSA9IExWQUwocmVxLT5ycV9kYXRhLCA0OCk7CisKK291dF9mcmVlOgorCXNtYl9ycHV0KHJlcSk7CitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludAorc21iX3Byb2NfZ2V0YXR0cl91bml4KHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBzdHJ1Y3QgZGVudHJ5ICpkaXIsCisJCSAgICAgIHN0cnVjdCBzbWJfZmF0dHIgKmF0dHIpCit7CisJc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXE7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IC1FTk9NRU07CisJaWYgKCEgKHJlcSA9IHNtYl9hbGxvY19yZXF1ZXN0KHNlcnZlciwgUEFHRV9TSVpFKSkpCisJCWdvdG8gb3V0OworCisJcmVzdWx0ID0gc21iX3Byb2NfZ2V0YXR0cl90cmFuczIoc2VydmVyLCBkaXIsIHJlcSwKKwkJCQkJIFNNQl9RVUVSWV9GSUxFX1VOSVhfQkFTSUMpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCisJc21iX2RlY29kZV91bml4X2Jhc2ljKGF0dHIsIHNlcnZlciwgcmVxLT5ycV9kYXRhKTsKKworb3V0X2ZyZWU6CisJc21iX3JwdXQocmVxKTsKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50CitzbWJfcHJvY19nZXRhdHRyXzk1KHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBzdHJ1Y3QgZGVudHJ5ICpkaXIsCisJCSAgICBzdHJ1Y3Qgc21iX2ZhdHRyICphdHRyKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkaXItPmRfaW5vZGU7CisJaW50IHJlc3VsdDsKKworCS8qIEZJWE1FOiB3aHkgbm90IHVzZSB0aGUgImFsbCIgdmVyc2lvbj8gKi8KKwlyZXN1bHQgPSBzbWJfcHJvY19nZXRhdHRyX3RyYW5zMl9zdGQoc2VydmVyLCBkaXIsIGF0dHIpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIG91dDsKKworCS8qCisJICogTm9uZSBvZiB0aGUgZ2V0YXR0ciB2ZXJzaW9ucyBoZXJlIGNhbiBtYWtlIHdpbjl4IHJldHVybiB0aGUgcmlnaHQKKwkgKiBmaWxlc2l6ZSBpZiB0aGVyZSBhcmUgY2hhbmdlcyBtYWRlIHRvIGFuIG9wZW4gZmlsZS4KKwkgKiBBIHNlZWstdG8tZW5kIGRvZXMgcmV0dXJuIHRoZSByaWdodCBzaXplLCBidXQgd2Ugb25seSBuZWVkIHRvIGRvCisJICogdGhhdCBvbiBmaWxlcyB3ZSBoYXZlIHdyaXR0ZW4uCisJICovCisJaWYgKGlub2RlICYmIFNNQl9JKGlub2RlKS0+ZmxhZ3MgJiBTTUJfRl9MT0NBTFdSSVRFICYmCisJICAgIHNtYl9pc19vcGVuKGlub2RlKSkKKwl7CisJCV9fdTE2IGZpbGVpZCA9IFNNQl9JKGlub2RlKS0+ZmlsZWlkOworCQlhdHRyLT5mX3NpemUgPSBzbWJfcHJvY19zZWVrKHNlcnZlciwgZmlsZWlkLCAyLCAwKTsKKwl9CisKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50CitzbWJfcHJvY19vcHNfd2FpdChzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlcikKK3sKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoc2VydmVyLT5jb25uX3dxLAorCQkJCXNlcnZlci0+Y29ubl9jb21wbGV0ZSwgMzAqSFopOworCisJaWYgKCFyZXN1bHQgfHwgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NtYl9wcm9jX2dldGF0dHJfbnVsbChzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgc3RydWN0IGRlbnRyeSAqZGlyLAorCQkJICBzdHJ1Y3Qgc21iX2ZhdHRyICpmYXR0cikKK3sKKwlpbnQgcmVzdWx0OworCisJaWYgKHNtYl9wcm9jX29wc193YWl0KHNlcnZlcikgPCAwKQorCQlyZXR1cm4gLUVJTzsKKworCXNtYl9pbml0X2RpcmVudChzZXJ2ZXIsIGZhdHRyKTsKKwlyZXN1bHQgPSBzZXJ2ZXItPm9wcy0+Z2V0YXR0cihzZXJ2ZXIsIGRpciwgZmF0dHIpOworCXNtYl9maW5pc2hfZGlyZW50KHNlcnZlciwgZmF0dHIpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludAorc21iX3Byb2NfcmVhZGRpcl9udWxsKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyLAorCQkgICAgICBzdHJ1Y3Qgc21iX2NhY2hlX2NvbnRyb2wgKmN0bCkKK3sKKwlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciA9IHNlcnZlcl9mcm9tX2RlbnRyeShmaWxwLT5mX2RlbnRyeSk7CisKKwlpZiAoc21iX3Byb2Nfb3BzX3dhaXQoc2VydmVyKSA8IDApCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIHNlcnZlci0+b3BzLT5yZWFkZGlyKGZpbHAsIGRpcmVudCwgZmlsbGRpciwgY3RsKTsKK30KKworaW50CitzbWJfcHJvY19nZXRhdHRyKHN0cnVjdCBkZW50cnkgKmRpciwgc3RydWN0IHNtYl9mYXR0ciAqZmF0dHIpCit7CisJc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIgPSBzZXJ2ZXJfZnJvbV9kZW50cnkoZGlyKTsKKwlpbnQgcmVzdWx0OworCisJc21iX2luaXRfZGlyZW50KHNlcnZlciwgZmF0dHIpOworCXJlc3VsdCA9IHNlcnZlci0+b3BzLT5nZXRhdHRyKHNlcnZlciwgZGlyLCBmYXR0cik7CisJc21iX2ZpbmlzaF9kaXJlbnQoc2VydmVyLCBmYXR0cik7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBCZWNhdXNlIG9mIGJ1Z3MgaW4gdGhlIGNvcmUgcHJvdG9jb2wsIHdlIHVzZSB0aGlzIG9ubHkgdG8gc2V0CisgKiBhdHRyaWJ1dGVzLiBTZWUgc21iX3Byb2Nfc2V0dGltZSgpIGJlbG93IGZvciB0aW1lc3RhbXAgaGFuZGxpbmcuCisgKgorICogQnVncyBOb3RlZDoKKyAqICgxKSBJZiBtdGltZSBpcyBub24temVybywgYm90aCBXaW4gMy4xIGFuZCBXaW4gOTUgZmFpbAorICogd2l0aCBhbiB1bmRvY3VtZW50ZWQgZXJyb3IgKEVSUkRPUyBjb2RlIDUwKS4gU2V0dGluZworICogbXRpbWUgdG8gMCBhbGxvd3MgdGhlIGF0dHJpYnV0ZXMgdG8gYmUgc2V0LgorICogKDIpIFRoZSBleHRyYSBwYXJhbWV0ZXJzIGZvbGxvd2luZyB0aGUgbmFtZSBzdHJpbmcgYXJlbid0CisgKiBpbiB0aGUgQ0lGUyBkb2NzLCBidXQgc2VlbSB0byBiZSBuZWNlc3NhcnkgZm9yIG9wZXJhdGlvbi4KKyAqLworc3RhdGljIGludAorc21iX3Byb2Nfc2V0YXR0cl9jb3JlKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCSAgICAgIF9fdTE2IGF0dHIpCit7CisJY2hhciAqcDsKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxOworCisJcmVzdWx0ID0gLUVOT01FTTsKKwlpZiAoISAocmVxID0gc21iX2FsbG9jX3JlcXVlc3Qoc2VydmVyLCBQQUdFX1NJWkUpKSkKKwkJZ290byBvdXQ7CisKKwlwID0gc21iX3NldHVwX2hlYWRlcihyZXEsIFNNQnNldGF0ciwgOCwgMCk7CisJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djAsIGF0dHIpOworCURTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl92d3YxLCAwKTsgLyogbXRpbWUgKi8KKwlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2MywgMCk7IC8qIHJlc2VydmVkIHZhbHVlcyAqLworCVdTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl92d3Y0LCAwKTsKKwlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2NSwgMCk7CisJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djYsIDApOworCVdTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl92d3Y3LCAwKTsKKwlyZXN1bHQgPSBzbWJfc2ltcGxlX2VuY29kZV9wYXRoKHJlcSwgJnAsIGRlbnRyeSwgTlVMTCk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisJaWYgKHAgKyAyID4gKGNoYXIgKilyZXEtPnJxX2J1ZmZlciArIHJlcS0+cnFfYnVmc2l6ZSkgeworCQlyZXN1bHQgPSAtRU5BTUVUT09MT05HOworCQlnb3RvIG91dF9mcmVlOworCX0KKwkqcCsrID0gNDsKKwkqcCsrID0gMDsKKwlzbWJfc2V0dXBfYmNjKHJlcSwgcCk7CisKKwlyZXN1bHQgPSBzbWJfcmVxdWVzdF9vayhyZXEsIFNNQnNldGF0ciwgMCwgMCk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisJcmVzdWx0ID0gMDsKKworb3V0X2ZyZWU6CisJc21iX3JwdXQocmVxKTsKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogQmVjYXVzZSBvZiBidWdzIGluIHRoZSB0cmFuczIgc2V0YXR0ciBtZXNzYWdlcywgd2UgbXVzdCBzZXQKKyAqIGF0dHJpYnV0ZXMgYW5kIHRpbWVzdGFtcHMgc2VwYXJhdGVseS4gVGhlIGNvcmUgU01Cc2V0YXRyCisgKiBtZXNzYWdlIHNlZW1zIHRvIGJlIHRoZSBvbmx5IHJlbGlhYmxlIHdheSB0byBzZXQgYXR0cmlidXRlcy4KKyAqLworaW50CitzbWJfcHJvY19zZXRhdHRyKHN0cnVjdCBkZW50cnkgKmRpciwgc3RydWN0IHNtYl9mYXR0ciAqZmF0dHIpCit7CisJc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIgPSBzZXJ2ZXJfZnJvbV9kZW50cnkoZGlyKTsKKwlpbnQgcmVzdWx0OworCisJVkVSQk9TRSgic2V0dGluZyAlcy8lcywgb3Blbj0lZFxuIiwgCisJCURFTlRSWV9QQVRIKGRpciksIHNtYl9pc19vcGVuKGRpci0+ZF9pbm9kZSkpOworCXJlc3VsdCA9IHNtYl9wcm9jX3NldGF0dHJfY29yZShzZXJ2ZXIsIGRpciwgZmF0dHItPmF0dHIpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBTZXRzIHRoZSB0aW1lc3RhbXBzIGZvciBhbiBmaWxlIG9wZW4gd2l0aCB3cml0ZSBwZXJtaXNzaW9ucy4KKyAqLworc3RhdGljIGludAorc21iX3Byb2Nfc2V0YXR0cl9leHQoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIsCisJCSAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBzbWJfZmF0dHIgKmZhdHRyKQoreworCV9fdTE2IGRhdGUsIHRpbWU7CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcTsKKworCXJlc3VsdCA9IC1FTk9NRU07CisJaWYgKCEgKHJlcSA9IHNtYl9hbGxvY19yZXF1ZXN0KHNlcnZlciwgMCkpKQorCQlnb3RvIG91dDsKKworCXNtYl9zZXR1cF9oZWFkZXIocmVxLCBTTUJzZXRhdHRyRSwgNywgMCk7CisJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djAsIFNNQl9JKGlub2RlKS0+ZmlsZWlkKTsKKwkvKiBXZSBkb24ndCBjaGFuZ2UgdGhlIGNyZWF0aW9uIHRpbWUgKi8KKwlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2MSwgMCk7CisJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djIsIDApOworCWRhdGVfdW5peDJkb3Moc2VydmVyLCBmYXR0ci0+Zl9hdGltZS50dl9zZWMsICZkYXRlLCAmdGltZSk7CisJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX3Z3djMsIGRhdGUpOworCVdTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl92d3Y0LCB0aW1lKTsKKwlkYXRlX3VuaXgyZG9zKHNlcnZlciwgZmF0dHItPmZfbXRpbWUudHZfc2VjLCAmZGF0ZSwgJnRpbWUpOworCVdTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl92d3Y1LCBkYXRlKTsKKwlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfdnd2NiwgdGltZSk7CisjaWZkZWYgU01CRlNfREVCVUdfVElNRVNUQU1QCisJcHJpbnRrKEtFUk5fREVCVUcgInNtYl9wcm9jX3NldGF0dHJfZXh0OiBkYXRlPSVkLCB0aW1lPSVkLCBtdGltZT0lbGRcbiIsCisJICAgICAgIGRhdGUsIHRpbWUsIGZhdHRyLT5mX210aW1lKTsKKyNlbmRpZgorCisJcmVxLT5ycV9mbGFncyB8PSBTTUJfUkVRX05PUkVUUlk7CisJcmVzdWx0ID0gc21iX3JlcXVlc3Rfb2socmVxLCBTTUJzZXRhdHRyRSwgMCwgMCk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisJcmVzdWx0ID0gMDsKK291dF9mcmVlOgorCXNtYl9ycHV0KHJlcSk7CitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIEJ1Z3MgTm90ZWQ6CisgKiAoMSkgVGhlIFRSQU5TQUNUMl9TRVRQQVRISU5GTyBtZXNzYWdlIHVuZGVyIFdpbiBOVCA0LjAgZG9lc24ndAorICogc2V0IHRoZSBmaWxlJ3MgYXR0cmlidXRlIGZsYWdzLgorICovCitzdGF0aWMgaW50CitzbWJfcHJvY19zZXRhdHRyX3RyYW5zMihzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwKKwkJCXN0cnVjdCBkZW50cnkgKmRpciwgc3RydWN0IHNtYl9mYXR0ciAqZmF0dHIpCit7CisJX191MTYgZGF0ZSwgdGltZTsKKwljaGFyICpwLCAqcGFyYW07CisJaW50IHJlc3VsdDsKKwljaGFyIGRhdGFbMjZdOworCXN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxOworCisJcmVzdWx0ID0gLUVOT01FTTsKKwlpZiAoISAocmVxID0gc21iX2FsbG9jX3JlcXVlc3Qoc2VydmVyLCBQQUdFX1NJWkUpKSkKKwkJZ290byBvdXQ7CisJcGFyYW0gPSByZXEtPnJxX2J1ZmZlcjsKKworCVdTRVQocGFyYW0sIDAsIDEpOwkvKiBJbmZvIGxldmVsIFNNQl9JTkZPX1NUQU5EQVJEICovCisJRFNFVChwYXJhbSwgMiwgMCk7CisJcmVzdWx0ID0gc21iX2VuY29kZV9wYXRoKHNlcnZlciwgcGFyYW0rNiwgU01CX01BWFBBVEhMRU4rMSwgZGlyLCBOVUxMKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBvdXRfZnJlZTsKKwlwID0gcGFyYW0gKyA2ICsgcmVzdWx0OworCisJV1NFVChkYXRhLCAwLCAwKTsgLyogY3JlYXRpb24gdGltZSAqLworCVdTRVQoZGF0YSwgMiwgMCk7CisJZGF0ZV91bml4MmRvcyhzZXJ2ZXIsIGZhdHRyLT5mX2F0aW1lLnR2X3NlYywgJmRhdGUsICZ0aW1lKTsKKwlXU0VUKGRhdGEsIDQsIGRhdGUpOworCVdTRVQoZGF0YSwgNiwgdGltZSk7CisJZGF0ZV91bml4MmRvcyhzZXJ2ZXIsIGZhdHRyLT5mX210aW1lLnR2X3NlYywgJmRhdGUsICZ0aW1lKTsKKwlXU0VUKGRhdGEsIDgsIGRhdGUpOworCVdTRVQoZGF0YSwgMTAsIHRpbWUpOworI2lmZGVmIFNNQkZTX0RFQlVHX1RJTUVTVEFNUAorCXByaW50ayhLRVJOX0RFQlVHICJzZXRhdHRyX3RyYW5zMjogJXMvJXMsIGRhdGU9JXgsIHRpbWU9JXgsIG10aW1lPSVsZFxuIiwgCisJICAgICAgIERFTlRSWV9QQVRIKGRpciksIGRhdGUsIHRpbWUsIGZhdHRyLT5mX210aW1lKTsKKyNlbmRpZgorCURTRVQoZGF0YSwgMTIsIDApOyAvKiBzaXplICovCisJRFNFVChkYXRhLCAxNiwgMCk7IC8qIGJsa3NpemUgKi8KKwlXU0VUKGRhdGEsIDIwLCAwKTsgLyogYXR0ciAqLworCURTRVQoZGF0YSwgMjIsIDApOyAvKiBVTE9ORyBFQSBzaXplICovCisKKwlyZXEtPnJxX3RyYW5zMl9jb21tYW5kID0gVFJBTlNBQ1QyX1NFVFBBVEhJTkZPOworCXJlcS0+cnFfbGRhdGEgPSAyNjsKKwlyZXEtPnJxX2RhdGEgID0gZGF0YTsKKwlyZXEtPnJxX2xwYXJtID0gcCAtIHBhcmFtOworCXJlcS0+cnFfcGFybSAgPSBwYXJhbTsKKwlyZXEtPnJxX2ZsYWdzID0gMDsKKwlyZXN1bHQgPSBzbWJfYWRkX3JlcXVlc3QocmVxKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBvdXRfZnJlZTsKKwlyZXN1bHQgPSAwOworCWlmIChyZXEtPnJxX3JjbHMgIT0gMCkKKwkJcmVzdWx0ID0gc21iX2Vycm5vKHJlcSk7CisKK291dF9mcmVlOgorCXNtYl9ycHV0KHJlcSk7CitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIEFUVFJfTU9ERSAgICAgIDB4MDAxCisgKiBBVFRSX1VJRCAgICAgICAweDAwMgorICogQVRUUl9HSUQgICAgICAgMHgwMDQKKyAqIEFUVFJfU0laRSAgICAgIDB4MDA4CisgKiBBVFRSX0FUSU1FICAgICAweDAxMAorICogQVRUUl9NVElNRSAgICAgMHgwMjAKKyAqIEFUVFJfQ1RJTUUgICAgIDB4MDQwCisgKiBBVFRSX0FUSU1FX1NFVCAweDA4MAorICogQVRUUl9NVElNRV9TRVQgMHgxMDAKKyAqIEFUVFJfRk9SQ0UgICAgIDB4MjAwCQorICogQVRUUl9BVFRSX0ZMQUcgMHg0MDAKKyAqCisgKiBtYWpvci9taW5vciBzaG91bGQgb25seSBiZSBzZXQgYnkgbWtub2QuCisgKi8KK2ludAorc21iX3Byb2Nfc2V0YXR0cl91bml4KHN0cnVjdCBkZW50cnkgKmQsIHN0cnVjdCBpYXR0ciAqYXR0ciwKKwkJICAgICAgdW5zaWduZWQgaW50IG1ham9yLCB1bnNpZ25lZCBpbnQgbWlub3IpCit7CisJc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIgPSBzZXJ2ZXJfZnJvbV9kZW50cnkoZCk7CisJdTY0IG50dGltZTsKKwljaGFyICpwLCAqcGFyYW07CisJaW50IHJlc3VsdDsKKwljaGFyIGRhdGFbMTAwXTsKKwlzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcTsKKworCXJlc3VsdCA9IC1FTk9NRU07CisJaWYgKCEgKHJlcSA9IHNtYl9hbGxvY19yZXF1ZXN0KHNlcnZlciwgUEFHRV9TSVpFKSkpCisJCWdvdG8gb3V0OworCXBhcmFtID0gcmVxLT5ycV9idWZmZXI7CisKKwlERUJVRzEoInZhbGlkIGZsYWdzID0gMHglMDR4XG4iLCBhdHRyLT5pYV92YWxpZCk7CisKKwlXU0VUKHBhcmFtLCAwLCBTTUJfU0VUX0ZJTEVfVU5JWF9CQVNJQyk7CisJRFNFVChwYXJhbSwgMiwgMCk7CisJcmVzdWx0ID0gc21iX2VuY29kZV9wYXRoKHNlcnZlciwgcGFyYW0rNiwgU01CX01BWFBBVEhMRU4rMSwgZCwgTlVMTCk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisJcCA9IHBhcmFtICsgNiArIHJlc3VsdDsKKworCS8qIDAgTCBmaWxlIHNpemUgaW4gYnl0ZXMgKi8KKwkvKiA4IEwgZmlsZSBzaXplIG9uIGRpc2sgaW4gYnl0ZXMgKGJsb2NrIGNvdW50KSAqLworCS8qIDQwIEwgdWlkICovCisJLyogNDggTCBnaWQgKi8KKwkvKiA1NiBXIGZpbGUgdHlwZSBlbnVtICovCisJLyogNjAgTCBkZXZtYWpvciAqLworCS8qIDY4IEwgZGV2bWlub3IgKi8KKwkvKiA3NiBMIHVuaXF1ZSBJRCAoaW5vZGUpICovCisJLyogODQgTCBwZXJtaXNzaW9ucyAqLworCS8qIDkyIEwgbGluayBjb3VudCAqLworCUxTRVQoZGF0YSwgMCwgU01CX1NJWkVfTk9fQ0hBTkdFKTsKKwlMU0VUKGRhdGEsIDgsIFNNQl9TSVpFX05PX0NIQU5HRSk7CisJTFNFVChkYXRhLCAxNiwgU01CX1RJTUVfTk9fQ0hBTkdFKTsKKwlMU0VUKGRhdGEsIDI0LCBTTUJfVElNRV9OT19DSEFOR0UpOworCUxTRVQoZGF0YSwgMzIsIFNNQl9USU1FX05PX0NIQU5HRSk7CisJTFNFVChkYXRhLCA0MCwgU01CX1VJRF9OT19DSEFOR0UpOworCUxTRVQoZGF0YSwgNDgsIFNNQl9HSURfTk9fQ0hBTkdFKTsKKwlMU0VUKGRhdGEsIDU2LCBzbWJfZmlsZXR5cGVfZnJvbV9tb2RlKGF0dHItPmlhX21vZGUpKTsKKwlMU0VUKGRhdGEsIDYwLCBtYWpvcik7CisJTFNFVChkYXRhLCA2OCwgbWlub3IpOworCUxTRVQoZGF0YSwgNzYsIDApOworCUxTRVQoZGF0YSwgODQsIFNNQl9NT0RFX05PX0NIQU5HRSk7CisJTFNFVChkYXRhLCA5MiwgMCk7CisKKwlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX1NJWkUpIHsKKwkJTFNFVChkYXRhLCAwLCBhdHRyLT5pYV9zaXplKTsKKwkJTFNFVChkYXRhLCA4LCAwKTsgLyogY2FuJ3Qgc2V0IGFueXdheSAqLworCX0KKworCS8qCisJICogRklYTUU6IGNoZWNrIHRoZSBjb252ZXJzaW9uIGZ1bmN0aW9uIGl0IHRoZSBjb3JyZWN0IG9uZQorCSAqCisJICogd2UgY2FuJ3Qgc2V0IGN0aW1lIGJ1dCB3ZSBtaWdodCBhcyB3ZWxsIHBhc3MgdGhpcyB0byB0aGUgc2VydmVyCisJICogYW5kIGxldCBpdCBpZ25vcmUgaXQuCisJICovCisJaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9DVElNRSkgeworCQludHRpbWUgPSBzbWJfdW5peHV0YzJudHV0YyhhdHRyLT5pYV9jdGltZSk7CisJCUxTRVQoZGF0YSwgMTYsIG50dGltZSk7CisJfQorCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfQVRJTUUpIHsKKwkJbnR0aW1lID0gc21iX3VuaXh1dGMybnR1dGMoYXR0ci0+aWFfYXRpbWUpOworCQlMU0VUKGRhdGEsIDI0LCBudHRpbWUpOworCX0KKwlpZiAoYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01USU1FKSB7CisJCW50dGltZSA9IHNtYl91bml4dXRjMm50dXRjKGF0dHItPmlhX210aW1lKTsKKwkJTFNFVChkYXRhLCAzMiwgbnR0aW1lKTsKKwl9CisJCisJaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9VSUQpIHsKKwkJTFNFVChkYXRhLCA0MCwgYXR0ci0+aWFfdWlkKTsKKwl9CisJaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9HSUQpIHsKKwkJTFNFVChkYXRhLCA0OCwgYXR0ci0+aWFfZ2lkKTsgCisJfQorCQorCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkgeworCQlMU0VUKGRhdGEsIDg0LCBhdHRyLT5pYV9tb2RlKTsKKwl9CisKKwlyZXEtPnJxX3RyYW5zMl9jb21tYW5kID0gVFJBTlNBQ1QyX1NFVFBBVEhJTkZPOworCXJlcS0+cnFfbGRhdGEgPSAxMDA7CisJcmVxLT5ycV9kYXRhICA9IGRhdGE7CisJcmVxLT5ycV9scGFybSA9IHAgLSBwYXJhbTsKKwlyZXEtPnJxX3Bhcm0gID0gcGFyYW07CisJcmVxLT5ycV9mbGFncyA9IDA7CisJcmVzdWx0ID0gc21iX2FkZF9yZXF1ZXN0KHJlcSk7CisKK291dF9mcmVlOgorCXNtYl9ycHV0KHJlcSk7CitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KKworCisvKgorICogU2V0IHRoZSBtb2RpZnkgYW5kIGFjY2VzcyB0aW1lc3RhbXBzIGZvciBhIGZpbGUuCisgKgorICogSW5jcmVkaWJseSBlbm91Z2gsIGluIGFsbCBvZiBTTUIgdGhlcmUgaXMgbm8gbWVzc2FnZSB0byBhbGxvdworICogc2V0dGluZyBib3RoIGF0dHJpYnV0ZXMgYW5kIHRpbWVzdGFtcHMgYXQgb25jZS4gCisgKgorICogQnVncyBOb3RlZDoKKyAqICgxKSBXaW4gOTUgZG9lc24ndCBzdXBwb3J0IHRoZSBUUkFOU0FDVDJfU0VURklMRUlORk8gbWVzc2FnZSAKKyAqIHdpdGggaW5mbyBsZXZlbCAxIChJTkZPX1NUQU5EQVJEKS4KKyAqICgyKSBXaW4gOTUgc2VlbXMgbm90IHRvIHN1cHBvcnQgc2V0dGluZyBkaXJlY3RvcnkgdGltZXN0YW1wcy4KKyAqICgzKSBVbmRlciB0aGUgY29yZSBwcm90b2NvbCBhcHBhcmVudGx5IHRoZSBvbmx5IHdheSB0byBzZXQgdGhlCisgKiB0aW1lc3RhbXAgaXMgdG8gb3BlbiBhbmQgY2xvc2UgdGhlIGZpbGUuCisgKi8KK2ludAorc21iX3Byb2Nfc2V0dGltZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBzbWJfZmF0dHIgKmZhdHRyKQoreworCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyID0gc2VydmVyX2Zyb21fZGVudHJ5KGRlbnRyeSk7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgcmVzdWx0OworCisJVkVSQk9TRSgic2V0dGluZyAlcy8lcywgb3Blbj0lZFxuIiwKKwkJREVOVFJZX1BBVEgoZGVudHJ5KSwgc21iX2lzX29wZW4oaW5vZGUpKTsKKworCS8qIHNldHRpbmcgdGhlIHRpbWUgb24gYSBXaW45NSBzZXJ2ZXIgZmFpbHMgKHRyaWRnZSkgKi8KKwlpZiAoc2VydmVyLT5vcHQucHJvdG9jb2wgPj0gU01CX1BST1RPQ09MX0xBTk1BTjIgJiYgCisJICAgICEoc2VydmVyLT5tbnQtPmZsYWdzICYgU01CX01PVU5UX1dJTjk1KSkgeworCQlpZiAoc21iX2lzX29wZW4oaW5vZGUpICYmIFNNQl9JKGlub2RlKS0+YWNjZXNzICE9IFNNQl9PX1JET05MWSkKKwkJCXJlc3VsdCA9IHNtYl9wcm9jX3NldGF0dHJfZXh0KHNlcnZlciwgaW5vZGUsIGZhdHRyKTsKKwkJZWxzZQorCQkJcmVzdWx0ID0gc21iX3Byb2Nfc2V0YXR0cl90cmFuczIoc2VydmVyLCBkZW50cnksIGZhdHRyKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBGYWlsIHNpbGVudGx5IG9uIGRpcmVjdG9yaWVzIC4uLiB0aW1lc3RhbXAgY2FuJ3QgYmUgc2V0PworCQkgKi8KKwkJcmVzdWx0ID0gMDsKKwkJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKKwkJCS8qCisJCQkgKiBTZXQgdGhlIG10aW1lIGJ5IG9wZW5pbmcgYW5kIGNsb3NpbmcgdGhlIGZpbGUuCisJCQkgKiBOb3RlIHRoYXQgdGhlIGZpbGUgaXMgb3BlbmVkIHJlYWQtb25seSwgYnV0IHRoaXMKKwkJCSAqIHN0aWxsIGFsbG93cyB1cyB0byBzZXQgdGhlIGRhdGUgKHRyaWRnZSkKKwkJCSAqLworCQkJcmVzdWx0ID0gLUVBQ0NFUzsKKwkJCWlmICghc21iX2lzX29wZW4oaW5vZGUpKQorCQkJCXNtYl9wcm9jX29wZW4oc2VydmVyLCBkZW50cnksIFNNQl9PX1JET05MWSk7CisJCQlpZiAoc21iX2lzX29wZW4oaW5vZGUpKSB7CisJCQkJaW5vZGUtPmlfbXRpbWUgPSBmYXR0ci0+Zl9tdGltZTsKKwkJCQlyZXN1bHQgPSBzbWJfcHJvY19jbG9zZV9pbm9kZShzZXJ2ZXIsIGlub2RlKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludAorc21iX3Byb2NfZHNrYXR0cihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqYXR0cikKK3sKKwlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciA9IFNNQl9TQihzYik7CisJaW50IHJlc3VsdDsKKwljaGFyICpwOworCWxvbmcgdW5pdDsKKwlzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcTsKKworCXJlc3VsdCA9IC1FTk9NRU07CisJaWYgKCEgKHJlcSA9IHNtYl9hbGxvY19yZXF1ZXN0KHNlcnZlciwgMCkpKQorCQlnb3RvIG91dDsKKworCXNtYl9zZXR1cF9oZWFkZXIocmVxLCBTTUJkc2thdHRyLCAwLCAwKTsKKwlpZiAoKHJlc3VsdCA9IHNtYl9yZXF1ZXN0X29rKHJlcSwgU01CZHNrYXR0ciwgNSwgMCkpIDwgMCkKKwkJZ290byBvdXRfZnJlZTsKKwlwID0gU01CX1ZXVihyZXEtPnJxX2hlYWRlcik7CisJdW5pdCA9IChXVkFMKHAsIDIpICogV1ZBTChwLCA0KSkgPj4gU01CX1NUX0JMS1NISUZUOworCWF0dHItPmZfYmxvY2tzID0gV1ZBTChwLCAwKSAqIHVuaXQ7CisJYXR0ci0+Zl9ic2l6ZSAgPSBTTUJfU1RfQkxLU0laRTsKKwlhdHRyLT5mX2JhdmFpbCA9IGF0dHItPmZfYmZyZWUgPSBXVkFMKHAsIDYpICogdW5pdDsKKwlyZXN1bHQgPSAwOworCitvdXRfZnJlZToKKwlzbWJfcnB1dChyZXEpOworb3V0OgorCXJldHVybiByZXN1bHQ7Cit9CisKK2ludAorc21iX3Byb2NfcmVhZF9saW5rKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBzdHJ1Y3QgZGVudHJ5ICpkLAorCQkgICBjaGFyICpidWZmZXIsIGludCBsZW4pCit7CisJY2hhciAqcCwgKnBhcmFtOworCWludCByZXN1bHQ7CisJc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXE7CisKKwlERUJVRzEoInJlYWRsaW5rIG9mICVzLyVzXG4iLCBERU5UUllfUEFUSChkKSk7CisKKwlyZXN1bHQgPSAtRU5PTUVNOworCWlmICghIChyZXEgPSBzbWJfYWxsb2NfcmVxdWVzdChzZXJ2ZXIsIFBBR0VfU0laRSkpKQorCQlnb3RvIG91dDsKKwlwYXJhbSA9IHJlcS0+cnFfYnVmZmVyOworCisJV1NFVChwYXJhbSwgMCwgU01CX1FVRVJZX0ZJTEVfVU5JWF9MSU5LKTsKKwlEU0VUKHBhcmFtLCAyLCAwKTsKKwlyZXN1bHQgPSBzbWJfZW5jb2RlX3BhdGgoc2VydmVyLCBwYXJhbSs2LCBTTUJfTUFYUEFUSExFTisxLCBkLCBOVUxMKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBvdXRfZnJlZTsKKwlwID0gcGFyYW0gKyA2ICsgcmVzdWx0OworCisJcmVxLT5ycV90cmFuczJfY29tbWFuZCA9IFRSQU5TQUNUMl9RUEFUSElORk87CisJcmVxLT5ycV9sZGF0YSA9IDA7CisJcmVxLT5ycV9kYXRhICA9IE5VTEw7CisJcmVxLT5ycV9scGFybSA9IHAgLSBwYXJhbTsKKwlyZXEtPnJxX3Bhcm0gID0gcGFyYW07CisJcmVxLT5ycV9mbGFncyA9IDA7CisJcmVzdWx0ID0gc21iX2FkZF9yZXF1ZXN0KHJlcSk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisJREVCVUcxKCJmb3IgJXM6IHJlc3VsdD0lZCwgcmNscz0lZCwgZXJyPSVkXG4iLAorCQkmcGFyYW1bNl0sIHJlc3VsdCwgcmVxLT5ycV9yY2xzLCByZXEtPnJxX2Vycik7CisKKwkvKiBjb3B5IGRhdGEgdXAgdG8gdGhlIFwwIG9yIGJ1ZmZlciBsZW5ndGggKi8KKwlyZXN1bHQgPSBsZW47CisJaWYgKHJlcS0+cnFfbGRhdGEgPCBsZW4pCisJCXJlc3VsdCA9IHJlcS0+cnFfbGRhdGE7CisJc3RybmNweShidWZmZXIsIHJlcS0+cnFfZGF0YSwgcmVzdWx0KTsKKworb3V0X2ZyZWU6CisJc21iX3JwdXQocmVxKTsKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCisKKy8qCisgKiBDcmVhdGUgYSBzeW1saW5rIG9iamVjdCBjYWxsZWQgZGVudHJ5IHdoaWNoIHBvaW50cyB0byBvbGRwYXRoLgorICogU2FtYmEgZG9lcyBub3QgcGVybWl0IGRhbmdsaW5nIGxpbmtzIGJ1dCByZXR1cm5zIGEgc3VpdGFibGUgZXJyb3IgbWVzc2FnZS4KKyAqLworaW50CitzbWJfcHJvY19zeW1saW5rKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBzdHJ1Y3QgZGVudHJ5ICpkLAorCQkgY29uc3QgY2hhciAqb2xkcGF0aCkKK3sKKwljaGFyICpwLCAqcGFyYW07CisJaW50IHJlc3VsdDsKKwlzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcTsKKworCXJlc3VsdCA9IC1FTk9NRU07CisJaWYgKCEgKHJlcSA9IHNtYl9hbGxvY19yZXF1ZXN0KHNlcnZlciwgUEFHRV9TSVpFKSkpCisJCWdvdG8gb3V0OworCXBhcmFtID0gcmVxLT5ycV9idWZmZXI7CisKKwlXU0VUKHBhcmFtLCAwLCBTTUJfU0VUX0ZJTEVfVU5JWF9MSU5LKTsKKwlEU0VUKHBhcmFtLCAyLCAwKTsKKwlyZXN1bHQgPSBzbWJfZW5jb2RlX3BhdGgoc2VydmVyLCBwYXJhbSArIDYsIFNNQl9NQVhQQVRITEVOKzEsIGQsIE5VTEwpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCXAgPSBwYXJhbSArIDYgKyByZXN1bHQ7CisKKwlyZXEtPnJxX3RyYW5zMl9jb21tYW5kID0gVFJBTlNBQ1QyX1NFVFBBVEhJTkZPOworCXJlcS0+cnFfbGRhdGEgPSBzdHJsZW4ob2xkcGF0aCkgKyAxOworCXJlcS0+cnFfZGF0YSAgPSAoY2hhciAqKSBvbGRwYXRoOworCXJlcS0+cnFfbHBhcm0gPSBwIC0gcGFyYW07CisJcmVxLT5ycV9wYXJtICA9IHBhcmFtOworCXJlcS0+cnFfZmxhZ3MgPSAwOworCXJlc3VsdCA9IHNtYl9hZGRfcmVxdWVzdChyZXEpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCisJREVCVUcxKCJmb3IgJXM6IHJlc3VsdD0lZCwgcmNscz0lZCwgZXJyPSVkXG4iLAorCQkmcGFyYW1bNl0sIHJlc3VsdCwgcmVxLT5ycV9yY2xzLCByZXEtPnJxX2Vycik7CisJcmVzdWx0ID0gMDsKKworb3V0X2ZyZWU6CisJc21iX3JwdXQocmVxKTsKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogQ3JlYXRlIGEgaGFyZCBsaW5rIG9iamVjdCBjYWxsZWQgbmV3X2RlbnRyeSB3aGljaCBwb2ludHMgdG8gZGVudHJ5LgorICovCitpbnQKK3NtYl9wcm9jX2xpbmsoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkgICAgICBzdHJ1Y3QgZGVudHJ5ICpuZXdfZGVudHJ5KQoreworCWNoYXIgKnAsICpwYXJhbTsKKwlpbnQgcmVzdWx0OworCXN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxOworCisJcmVzdWx0ID0gLUVOT01FTTsKKwlpZiAoISAocmVxID0gc21iX2FsbG9jX3JlcXVlc3Qoc2VydmVyLCBQQUdFX1NJWkUpKSkKKwkJZ290byBvdXQ7CisJcGFyYW0gPSByZXEtPnJxX2J1ZmZlcjsKKworCVdTRVQocGFyYW0sIDAsIFNNQl9TRVRfRklMRV9VTklYX0hMSU5LKTsKKwlEU0VUKHBhcmFtLCAyLCAwKTsKKwlyZXN1bHQgPSBzbWJfZW5jb2RlX3BhdGgoc2VydmVyLCBwYXJhbSArIDYsIFNNQl9NQVhQQVRITEVOKzEsCisJCQkJIG5ld19kZW50cnksIE5VTEwpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCXAgPSBwYXJhbSArIDYgKyByZXN1bHQ7CisKKwkvKiBHcnIsIHBvaW50bGVzcyBzZXBhcmF0aW9uIG9mIHBhcmFtZXRlcnMgYW5kIGRhdGEgLi4uICovCisJcmVxLT5ycV9kYXRhID0gcDsKKwlyZXEtPnJxX2xkYXRhID0gc21iX2VuY29kZV9wYXRoKHNlcnZlciwgcCwgU01CX01BWFBBVEhMRU4rMSwKKwkJCQkJZGVudHJ5LCBOVUxMKTsKKworCXJlcS0+cnFfdHJhbnMyX2NvbW1hbmQgPSBUUkFOU0FDVDJfU0VUUEFUSElORk87CisJcmVxLT5ycV9scGFybSA9IHAgLSBwYXJhbTsKKwlyZXEtPnJxX3Bhcm0gID0gcGFyYW07CisJcmVxLT5ycV9mbGFncyA9IDA7CisJcmVzdWx0ID0gc21iX2FkZF9yZXF1ZXN0KHJlcSk7CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlERUJVRzEoImZvciAlczogcmVzdWx0PSVkLCByY2xzPSVkLCBlcnI9JWRcbiIsCisJICAgICAgICZwYXJhbVs2XSwgcmVzdWx0LCByZXEtPnJxX3JjbHMsIHJlcS0+cnFfZXJyKTsKKwlyZXN1bHQgPSAwOworCitvdXRfZnJlZToKKwlzbWJfcnB1dChyZXEpOworb3V0OgorCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQKK3NtYl9wcm9jX3F1ZXJ5X2NpZnN1bml4KHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyKQoreworCWludCByZXN1bHQ7CisJaW50IG1ham9yLCBtaW5vcjsKKwl1NjQgY2FwczsKKwljaGFyIHBhcmFtWzJdOworCXN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxOworCisJcmVzdWx0ID0gLUVOT01FTTsKKwlpZiAoISAocmVxID0gc21iX2FsbG9jX3JlcXVlc3Qoc2VydmVyLCAxMDApKSkKKwkJZ290byBvdXQ7CisKKwlXU0VUKHBhcmFtLCAwLCBTTUJfUVVFUllfQ0lGU19VTklYX0lORk8pOworCisJcmVxLT5ycV90cmFuczJfY29tbWFuZCA9IFRSQU5TQUNUMl9RRlNJTkZPOworCXJlcS0+cnFfbGRhdGEgPSAwOworCXJlcS0+cnFfZGF0YSAgPSBOVUxMOworCXJlcS0+cnFfbHBhcm0gPSAyOworCXJlcS0+cnFfcGFybSAgPSBwYXJhbTsKKwlyZXEtPnJxX2ZsYWdzID0gMDsKKwlyZXN1bHQgPSBzbWJfYWRkX3JlcXVlc3QocmVxKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBvdXRfZnJlZTsKKworCWlmIChyZXEtPnJxX2xkYXRhIDwgMTIpIHsKKwkJUEFSQU5PSUEoIk5vdCBlbm91Z2ggZGF0YVxuIik7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCW1ham9yID0gV1ZBTChyZXEtPnJxX2RhdGEsIDApOworCW1pbm9yID0gV1ZBTChyZXEtPnJxX2RhdGEsIDIpOworCisJREVCVUcxKCJTZXJ2ZXIgaW1wbGVtZW50cyBDSUZTIEV4dGVuc2lvbnMgZm9yIFVOSVggc3lzdGVtcyB2JWQuJWRcbiIsCisJICAgICAgIG1ham9yLCBtaW5vcik7CisJLyogRklYTUU6IHZlcmlmeSB0aGF0IHdlIGFyZSBvayB3aXRoIHRoaXMgbWFqb3IvbWlub3I/ICovCisKKwljYXBzID0gTFZBTChyZXEtPnJxX2RhdGEsIDQpOworCURFQlVHMSgiU2VydmVyIGNhcGFiaWxpdGllcyAweCUwMTZsbHhcbiIsIGNhcHMpOworCitvdXRfZnJlZToKKwlzbWJfcnB1dChyZXEpOworb3V0OgorCXJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIHZvaWQKK2luc3RhbGxfb3BzKHN0cnVjdCBzbWJfb3BzICpkc3QsIHN0cnVjdCBzbWJfb3BzICpzcmMpCit7CisJbWVtY3B5KGRzdCwgc3JjLCBzaXplb2Yodm9pZCAqKSAqIFNNQl9PUFNfTlVNX1NUQVRJQyk7Cit9CisKKy8qIDwgTEFOTUFOMiAqLworc3RhdGljIHN0cnVjdCBzbWJfb3BzIHNtYl9vcHNfY29yZSA9Cit7CisJLnJlYWQJCT0gc21iX3Byb2NfcmVhZCwKKwkud3JpdGUJCT0gc21iX3Byb2Nfd3JpdGUsCisJLnJlYWRkaXIJPSBzbWJfcHJvY19yZWFkZGlyX3Nob3J0LAorCS5nZXRhdHRyCT0gc21iX3Byb2NfZ2V0YXR0cl9jb3JlLAorCS50cnVuY2F0ZQk9IHNtYl9wcm9jX3RydW5jMzIsCit9OworCisvKiBMQU5NQU4yLCBPUy8yLCBvdGhlcnM/ICovCitzdGF0aWMgc3RydWN0IHNtYl9vcHMgc21iX29wc19vczIgPQoreworCS5yZWFkCQk9IHNtYl9wcm9jX3JlYWQsCisJLndyaXRlCQk9IHNtYl9wcm9jX3dyaXRlLAorCS5yZWFkZGlyCT0gc21iX3Byb2NfcmVhZGRpcl9sb25nLAorCS5nZXRhdHRyCT0gc21iX3Byb2NfZ2V0YXR0cl90cmFuczJfc3RkLAorCS50cnVuY2F0ZQk9IHNtYl9wcm9jX3RydW5jMzIsCit9OworCisvKiBXaW45NSwgYW5kIHBvc3NpYmx5IHNvbWUgTmV0QXBwIHZlcnNpb25zIHRvbyAqLworc3RhdGljIHN0cnVjdCBzbWJfb3BzIHNtYl9vcHNfd2luOTUgPQoreworCS5yZWFkCQk9IHNtYl9wcm9jX3JlYWQsICAgIC8qIGRvZXMgbm90IHN1cHBvcnQgMTJ3b3JkIHJlYWRYICovCisJLndyaXRlCQk9IHNtYl9wcm9jX3dyaXRlLAorCS5yZWFkZGlyCT0gc21iX3Byb2NfcmVhZGRpcl9sb25nLAorCS5nZXRhdHRyCT0gc21iX3Byb2NfZ2V0YXR0cl85NSwKKwkudHJ1bmNhdGUJPSBzbWJfcHJvY190cnVuYzk1LAorfTsKKworLyogU2FtYmEsIE5UNCBhbmQgTlQ1ICovCitzdGF0aWMgc3RydWN0IHNtYl9vcHMgc21iX29wc193aW5OVCA9Cit7CisJLnJlYWQJCT0gc21iX3Byb2NfcmVhZFgsCisJLndyaXRlCQk9IHNtYl9wcm9jX3dyaXRlWCwKKwkucmVhZGRpcgk9IHNtYl9wcm9jX3JlYWRkaXJfbG9uZywKKwkuZ2V0YXR0cgk9IHNtYl9wcm9jX2dldGF0dHJfdHJhbnMyX2FsbCwKKwkudHJ1bmNhdGUJPSBzbWJfcHJvY190cnVuYzY0LAorfTsKKworLyogU2FtYmEgdy8gdW5peCBleHRlbnNpb25zLiBPdGhlcnM/ICovCitzdGF0aWMgc3RydWN0IHNtYl9vcHMgc21iX29wc191bml4ID0KK3sKKwkucmVhZAkJPSBzbWJfcHJvY19yZWFkWCwKKwkud3JpdGUJCT0gc21iX3Byb2Nfd3JpdGVYLAorCS5yZWFkZGlyCT0gc21iX3Byb2NfcmVhZGRpcl9sb25nLAorCS5nZXRhdHRyCT0gc21iX3Byb2NfZ2V0YXR0cl91bml4LAorCS8qIEZJWE1FOiBjb3JlL2V4dC90aW1lIHNldGF0dHIgbmVlZHMgdG8gYmUgY2xlYW5lZCB1cCEgKi8KKwkvKiAuc2V0YXR0cgk9IHNtYl9wcm9jX3NldGF0dHJfdW5peCwgKi8KKwkudHJ1bmNhdGUJPSBzbWJfcHJvY190cnVuYzY0LAorfTsKKworLyogUGxhY2UgaG9sZGVyIHVudGlsIHJlYWwgb3BzIGFyZSBpbiBwbGFjZSAqLworc3RhdGljIHN0cnVjdCBzbWJfb3BzIHNtYl9vcHNfbnVsbCA9Cit7CisJLnJlYWRkaXIJPSBzbWJfcHJvY19yZWFkZGlyX251bGwsCisJLmdldGF0dHIJPSBzbWJfcHJvY19nZXRhdHRyX251bGwsCit9OworCit2b2lkIHNtYl9pbnN0YWxsX251bGxfb3BzKHN0cnVjdCBzbWJfb3BzICpvcHMpCit7CisJaW5zdGFsbF9vcHMob3BzLCAmc21iX29wc19udWxsKTsKK30KZGlmZiAtLWdpdCBhL2ZzL3NtYmZzL3Byb3RvLmggYi9mcy9zbWJmcy9wcm90by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NjZlYzgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9zbWJmcy9wcm90by5oCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiAgQXV0b2dlbmVyYXRlZCB3aXRoIGNwcm90byBvbjogIFNhdCBTZXAgMTMgMTc6MTg6NTEgQ0VTVCAyMDAzCisgKi8KKworc3RydWN0IHNtYl9yZXF1ZXN0Oworc3RydWN0IHNvY2s7CitzdHJ1Y3Qgc3RhdGZzOworCisvKiBwcm9jLmMgKi8KK2V4dGVybiBpbnQgc21iX3NldGNvZGVwYWdlKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBzdHJ1Y3Qgc21iX25sc19jb2RlcGFnZSAqY3ApOworZXh0ZXJuIF9fdTMyIHNtYl9sZW4oX191OCAqcCk7CitleHRlcm4gaW50IHNtYl9nZXRfcnNpemUoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIpOworZXh0ZXJuIGludCBzbWJfZ2V0X3dzaXplKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyKTsKK2V4dGVybiBpbnQgc21iX2Vycm5vKHN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxKTsKK2V4dGVybiBpbnQgc21iX25ld2Nvbm4oc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIsIHN0cnVjdCBzbWJfY29ubl9vcHQgKm9wdCk7CitleHRlcm4gX191OCAqc21iX3NldHVwX2hlYWRlcihzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcSwgX191OCBjb21tYW5kLCBfX3UxNiB3Y3QsIF9fdTE2IGJjYyk7CitleHRlcm4gaW50IHNtYl9vcGVuKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IHdpc2gpOworZXh0ZXJuIGludCBzbWJfY2xvc2Uoc3RydWN0IGlub2RlICppbm8pOworZXh0ZXJuIGludCBzbWJfY2xvc2VfZmlsZWlkKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgX191MTYgZmlsZWlkKTsKK2V4dGVybiBpbnQgc21iX3Byb2NfY3JlYXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgX191MTYgYXR0ciwgdGltZV90IGN0aW1lLCBfX3UxNiAqZmlsZWlkKTsKK2V4dGVybiBpbnQgc21iX3Byb2NfbXYoc3RydWN0IGRlbnRyeSAqb2xkX2RlbnRyeSwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSk7CitleHRlcm4gaW50IHNtYl9wcm9jX21rZGlyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7CitleHRlcm4gaW50IHNtYl9wcm9jX3JtZGlyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7CitleHRlcm4gaW50IHNtYl9wcm9jX3VubGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOworZXh0ZXJuIGludCBzbWJfcHJvY19mbHVzaChzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgX191MTYgZmlsZWlkKTsKK2V4dGVybiB2b2lkIHNtYl9pbml0X3Jvb3RfZGlyZW50KHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBzdHJ1Y3Qgc21iX2ZhdHRyICpmYXR0ciwKKwkJCQkgc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CitleHRlcm4gaW50IHNtYl9wcm9jX2dldGF0dHIoc3RydWN0IGRlbnRyeSAqZGlyLCBzdHJ1Y3Qgc21iX2ZhdHRyICpmYXR0cik7CitleHRlcm4gaW50IHNtYl9wcm9jX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqZGlyLCBzdHJ1Y3Qgc21iX2ZhdHRyICpmYXR0cik7CitleHRlcm4gaW50IHNtYl9wcm9jX3NldGF0dHJfdW5peChzdHJ1Y3QgZGVudHJ5ICpkLCBzdHJ1Y3QgaWF0dHIgKmF0dHIsIHVuc2lnbmVkIGludCBtYWpvciwgdW5zaWduZWQgaW50IG1pbm9yKTsKK2V4dGVybiBpbnQgc21iX3Byb2Nfc2V0dGltZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBzbWJfZmF0dHIgKmZhdHRyKTsKK2V4dGVybiBpbnQgc21iX3Byb2NfZHNrYXR0cihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qga3N0YXRmcyAqYXR0cik7CitleHRlcm4gaW50IHNtYl9wcm9jX3JlYWRfbGluayhzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgc3RydWN0IGRlbnRyeSAqZCwgY2hhciAqYnVmZmVyLCBpbnQgbGVuKTsKK2V4dGVybiBpbnQgc21iX3Byb2Nfc3ltbGluayhzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgc3RydWN0IGRlbnRyeSAqZCwgY29uc3QgY2hhciAqb2xkcGF0aCk7CitleHRlcm4gaW50IHNtYl9wcm9jX2xpbmsoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGRlbnRyeSAqbmV3X2RlbnRyeSk7CitleHRlcm4gdm9pZCBzbWJfaW5zdGFsbF9udWxsX29wcyhzdHJ1Y3Qgc21iX29wcyAqb3BzKTsKKy8qIGRpci5jICovCitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzbWJfZGlyX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgc21iX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHNtYl9kaXJfaW5vZGVfb3BlcmF0aW9uc191bml4OworZXh0ZXJuIHZvaWQgc21iX25ld19kZW50cnkoc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKK2V4dGVybiB2b2lkIHNtYl9yZW5ld190aW1lcyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpOworLyogY2FjaGUuYyAqLworZXh0ZXJuIHZvaWQgc21iX2ludmFsaWRfZGlyX2NhY2hlKHN0cnVjdCBpbm9kZSAqZGlyKTsKK2V4dGVybiB2b2lkIHNtYl9pbnZhbGlkYXRlX2RpcmNhY2hlX2VudHJpZXMoc3RydWN0IGRlbnRyeSAqcGFyZW50KTsKK2V4dGVybiBzdHJ1Y3QgZGVudHJ5ICpzbWJfZGdldF9mcG9zKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGRlbnRyeSAqcGFyZW50LCB1bnNpZ25lZCBsb25nIGZwb3MpOworZXh0ZXJuIGludCBzbWJfZmlsbF9jYWNoZShzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpciwgc3RydWN0IHNtYl9jYWNoZV9jb250cm9sICpjdHJsLCBzdHJ1Y3QgcXN0ciAqcW5hbWUsIHN0cnVjdCBzbWJfZmF0dHIgKmVudHJ5KTsKKy8qIHNvY2suYyAqLworZXh0ZXJuIHZvaWQgc21iX2RhdGFfcmVhZHkoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuKTsKK2V4dGVybiBpbnQgc21iX3ZhbGlkX3NvY2tldChzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKK2V4dGVybiB2b2lkIHNtYl9jbG9zZV9zb2NrZXQoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIpOworZXh0ZXJuIGludCBzbWJfcmVjdl9hdmFpbGFibGUoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIpOworZXh0ZXJuIGludCBzbWJfcmVjZWl2ZV9oZWFkZXIoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIpOworZXh0ZXJuIGludCBzbWJfcmVjZWl2ZV9kcm9wKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyKTsKK2V4dGVybiBpbnQgc21iX3JlY2VpdmUoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIsIHN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxKTsKK2V4dGVybiBpbnQgc21iX3NlbmRfcmVxdWVzdChzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcSk7CisvKiBpbm9kZS5jICovCitleHRlcm4gc3RydWN0IGlub2RlICpzbWJfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3Qgc21iX2ZhdHRyICpmYXR0cik7CitleHRlcm4gdm9pZCBzbWJfZ2V0X2lub2RlX2F0dHIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHNtYl9mYXR0ciAqZmF0dHIpOworZXh0ZXJuIHZvaWQgc21iX3NldF9pbm9kZV9hdHRyKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBzbWJfZmF0dHIgKmZhdHRyKTsKK2V4dGVybiB2b2lkIHNtYl9pbnZhbGlkYXRlX2lub2RlcyhzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlcik7CitleHRlcm4gaW50IHNtYl9yZXZhbGlkYXRlX2lub2RlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7CitleHRlcm4gaW50IHNtYl9nZXRhdHRyKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBrc3RhdCAqc3RhdCk7CitleHRlcm4gaW50IHNtYl9ub3RpZnlfY2hhbmdlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICphdHRyKTsKKy8qIGZpbGUuYyAqLworZXh0ZXJuIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgc21iX2ZpbGVfYW9wczsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNtYl9maWxlX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgc21iX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKKy8qIGlvY3RsLmMgKi8KK2V4dGVybiBpbnQgc21iX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CisvKiBzbWJpb2QuYyAqLworZXh0ZXJuIHZvaWQgc21iaW9kX3dha2VfdXAodm9pZCk7CitleHRlcm4gaW50IHNtYmlvZF9yZWdpc3Rlcl9zZXJ2ZXIoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIpOworZXh0ZXJuIHZvaWQgc21iaW9kX3VucmVnaXN0ZXJfc2VydmVyKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyKTsKK2V4dGVybiB2b2lkIHNtYmlvZF9mbHVzaChzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlcik7CitleHRlcm4gaW50IHNtYmlvZF9yZXRyeShzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlcik7CisvKiByZXF1ZXN0LmMgKi8KK2V4dGVybiBpbnQgc21iX2luaXRfcmVxdWVzdF9jYWNoZSh2b2lkKTsKK2V4dGVybiB2b2lkIHNtYl9kZXN0cm95X3JlcXVlc3RfY2FjaGUodm9pZCk7CitleHRlcm4gc3RydWN0IHNtYl9yZXF1ZXN0ICpzbWJfYWxsb2NfcmVxdWVzdChzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwgaW50IGJ1ZnNpemUpOworZXh0ZXJuIHZvaWQgc21iX3JwdXQoc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXEpOworZXh0ZXJuIGludCBzbWJfYWRkX3JlcXVlc3Qoc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXEpOworZXh0ZXJuIGludCBzbWJfcmVxdWVzdF9zZW5kX3NlcnZlcihzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlcik7CitleHRlcm4gaW50IHNtYl9yZXF1ZXN0X3JlY3Yoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIpOworLyogc3ltbGluay5jICovCitleHRlcm4gaW50IHNtYl9zeW1saW5rKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqb2xkbmFtZSk7CitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgc21iX2xpbmtfaW5vZGVfb3BlcmF0aW9uczsKZGlmZiAtLWdpdCBhL2ZzL3NtYmZzL3JlcXVlc3QuYyBiL2ZzL3NtYmZzL3JlcXVlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDg1ZGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvc21iZnMvcmVxdWVzdC5jCkBAIC0wLDAgKzEsODIzIEBACisvKgorICogIHJlcXVlc3QuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEgYnkgVXJiYW4gV2lkbWFyaworICoKKyAqICBQbGVhc2UgYWRkIGEgbm90ZSBhYm91dCB5b3VyIGNoYW5nZXMgdG8gc21iZnMgaW4gdGhlIENoYW5nZUxvZyBmaWxlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorCisjaW5jbHVkZSA8bGludXgvc21iX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc21ibm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbWJfbW91bnQuaD4KKworI2luY2x1ZGUgInNtYl9kZWJ1Zy5oIgorI2luY2x1ZGUgInJlcXVlc3QuaCIKKyNpbmNsdWRlICJwcm90by5oIgorCisvKiAjZGVmaW5lIFNNQl9TTEFCX0RFQlVHCShTTEFCX1JFRF9aT05FIHwgU0xBQl9QT0lTT04pICovCisjZGVmaW5lIFNNQl9TTEFCX0RFQlVHCTAKKworI2RlZmluZSBST1VORF9VUCh4KSAoKCh4KSszKSAmIH4zKQorCisvKiBjYWNoZSBmb3IgcmVxdWVzdCBzdHJ1Y3R1cmVzICovCitzdGF0aWMga21lbV9jYWNoZV90ICpyZXFfY2FjaGVwOworCitzdGF0aWMgaW50IHNtYl9yZXF1ZXN0X3NlbmRfcmVxKHN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxKTsKKworLyoKKyAgL3Byb2Mvc2xhYmluZm86CisgIG5hbWUsIGFjdGl2ZSwgbnVtLCBvYmpzaXplLCBhY3RpdmVfc2xhYnMsIG51bV9zbGFwcywgI3BhZ2VzCisqLworCisKK2ludCBzbWJfaW5pdF9yZXF1ZXN0X2NhY2hlKHZvaWQpCit7CisJcmVxX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJzbWJfcmVxdWVzdCIsCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3Qgc21iX3JlcXVlc3QpLCAwLAorCQkJCSAgICAgICBTTUJfU0xBQl9ERUJVRyB8IFNMQUJfSFdDQUNIRV9BTElHTiwKKwkJCQkgICAgICAgTlVMTCwgTlVMTCk7CisJaWYgKHJlcV9jYWNoZXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBzbWJfZGVzdHJveV9yZXF1ZXN0X2NhY2hlKHZvaWQpCit7CisJaWYgKGttZW1fY2FjaGVfZGVzdHJveShyZXFfY2FjaGVwKSkKKwkJcHJpbnRrKEtFUk5fSU5GTyAic21iX2Rlc3Ryb3lfcmVxdWVzdF9jYWNoZTogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOworfQorCisvKgorICogQWxsb2NhdGUgYW5kIGluaXRpYWxpc2UgYSByZXF1ZXN0IHN0cnVjdHVyZQorICovCitzdGF0aWMgc3RydWN0IHNtYl9yZXF1ZXN0ICpzbWJfZG9fYWxsb2NfcmVxdWVzdChzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciwKKwkJCQkJCWludCBidWZzaXplKQoreworCXN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxOworCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IE5VTEw7CisKKwlyZXEgPSBrbWVtX2NhY2hlX2FsbG9jKHJlcV9jYWNoZXAsIFNMQUJfS0VSTkVMKTsKKwlWRVJCT1NFKCJhbGxvY2F0aW5nIHJlcXVlc3Q6ICVwXG4iLCByZXEpOworCWlmICghcmVxKQorCQlnb3RvIG91dDsKKworCWlmIChidWZzaXplID4gMCkgeworCQlidWYgPSBzbWJfa21hbGxvYyhidWZzaXplLCBHRlBfTk9GUyk7CisJCWlmICghYnVmKSB7CisJCQlrbWVtX2NhY2hlX2ZyZWUocmVxX2NhY2hlcCwgcmVxKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJbWVtc2V0KHJlcSwgMCwgc2l6ZW9mKHN0cnVjdCBzbWJfcmVxdWVzdCkpOworCXJlcS0+cnFfYnVmZmVyID0gYnVmOworCXJlcS0+cnFfYnVmc2l6ZSA9IGJ1ZnNpemU7CisJcmVxLT5ycV9zZXJ2ZXIgPSBzZXJ2ZXI7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcmVxLT5ycV93YWl0KTsKKwlJTklUX0xJU1RfSEVBRCgmcmVxLT5ycV9xdWV1ZSk7CisJYXRvbWljX3NldCgmcmVxLT5ycV9jb3VudCwgMSk7CisKK291dDoKKwlyZXR1cm4gcmVxOworfQorCitzdHJ1Y3Qgc21iX3JlcXVlc3QgKnNtYl9hbGxvY19yZXF1ZXN0KHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBpbnQgYnVmc2l6ZSkKK3sKKwlzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcSA9IE5VTEw7CisKKwlmb3IgKDs7KSB7CisJCWF0b21pY19pbmMoJnNlcnZlci0+bnJfcmVxdWVzdHMpOworCQlpZiAoYXRvbWljX3JlYWQoJnNlcnZlci0+bnJfcmVxdWVzdHMpIDw9IE1BWF9SRVFVRVNUX0hBUkQpIHsKKwkJCXJlcSA9IHNtYl9kb19hbGxvY19yZXF1ZXN0KHNlcnZlciwgYnVmc2l6ZSk7CisJCQlpZiAocmVxICE9IE5VTEwpCisJCQkJYnJlYWs7CisJCX0KKworI2lmIDAKKwkJLyoKKwkJICogVHJ5IHRvIGZyZWUgdXAgYXQgbGVhc3Qgb25lIHJlcXVlc3QgaW4gb3JkZXIgdG8gc3RheQorCQkgKiBiZWxvdyB0aGUgaGFyZCBsaW1pdAorCQkgKi8KKyAgICAgICAgICAgICAgICBpZiAobmZzX3RyeV90b19mcmVlX3BhZ2VzKHNlcnZlcikpCisJCQljb250aW51ZTsKKworCQlpZiAoc2lnbmFsbGVkKCkgJiYgKHNlcnZlci0+ZmxhZ3MgJiBORlNfTU9VTlRfSU5UUikpCisJCQlyZXR1cm4gRVJSX1BUUigtRVJFU1RBUlRTWVMpOworCQljdXJyZW50LT5wb2xpY3kgPSBTQ0hFRF9ZSUVMRDsKKwkJc2NoZWR1bGUoKTsKKyNlbHNlCisJCS8qIEZJWE1FOiB3ZSB3YW50IHNvbWV0aGluZyBsaWtlIG5mcyBkb2VzIGFib3ZlLCBidXQgdGhhdAorCQkgICByZXF1aXJlcyBjaGFuZ2VzIHRvIGFsbCBjYWxsZXJzIGFuZCBjYW4gd2FpdC4gKi8KKwkJYnJlYWs7CisjZW5kaWYKKwl9CisJcmV0dXJuIHJlcTsKK30KKworc3RhdGljIHZvaWQgc21iX2ZyZWVfcmVxdWVzdChzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcSkKK3sKKwlhdG9taWNfZGVjKCZyZXEtPnJxX3NlcnZlci0+bnJfcmVxdWVzdHMpOworCWlmIChyZXEtPnJxX2J1ZmZlciAmJiAhKHJlcS0+cnFfZmxhZ3MgJiBTTUJfUkVRX1NUQVRJQykpCisJCXNtYl9rZnJlZShyZXEtPnJxX2J1ZmZlcik7CisJaWYgKHJlcS0+cnFfdHJhbnMyYnVmZmVyKQorCQlzbWJfa2ZyZWUocmVxLT5ycV90cmFuczJidWZmZXIpOworCWttZW1fY2FjaGVfZnJlZShyZXFfY2FjaGVwLCByZXEpOworfQorCisvKgorICogV2hhdCBwcmV2ZW50cyBhIHJnZXQgdG8gcmFjZSB3aXRoIGEgcnB1dD8gVGhlIGNvdW50IG11c3QgbmV2ZXIgZHJvcCB0byB6ZXJvCisgKiB3aGlsZSBpdCBpcyBpbiB1c2UuIE9ubHkgcnB1dCBpZiBpdCBpcyBvayB0aGF0IGl0IGlzIGZyZWUnZC4KKyAqLworc3RhdGljIHZvaWQgc21iX3JnZXQoc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXEpCit7CisJYXRvbWljX2luYygmcmVxLT5ycV9jb3VudCk7Cit9Cit2b2lkIHNtYl9ycHV0KHN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxKQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZyZXEtPnJxX2NvdW50KSkgeworCQlsaXN0X2RlbF9pbml0KCZyZXEtPnJxX3F1ZXVlKTsKKwkJc21iX2ZyZWVfcmVxdWVzdChyZXEpOworCX0KK30KKworLyogc2V0dXAgdG8gcmVjZWl2ZSB0aGUgZGF0YSBwYXJ0IG9mIHRoZSBTTUIgKi8KK3N0YXRpYyBpbnQgc21iX3NldHVwX2JjYyhzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcSkKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwlyZXEtPnJxX3JsZW4gPSBzbWJfbGVuKHJlcS0+cnFfaGVhZGVyKSArIDQgLSByZXEtPnJxX2J5dGVzX3JlY3ZkOworCisJaWYgKHJlcS0+cnFfcmxlbiA+IHJlcS0+cnFfYnVmc2l6ZSkgeworCQlQQVJBTk9JQSgiUGFja2V0IHRvbyBsYXJnZSAlZCA+ICVkXG4iLAorCQkJIHJlcS0+cnFfcmxlbiwgcmVxLT5ycV9idWZzaXplKTsKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKworCXJlcS0+cnFfaW92WzBdLmlvdl9iYXNlID0gcmVxLT5ycV9idWZmZXI7CisJcmVxLT5ycV9pb3ZbMF0uaW92X2xlbiAgPSByZXEtPnJxX3JsZW47CisJcmVxLT5ycV9pb3ZsZW4gPSAxOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIFByZXBhcmUgYSAibm9ybWFsIiByZXF1ZXN0IHN0cnVjdHVyZS4KKyAqLworc3RhdGljIGludCBzbWJfc2V0dXBfcmVxdWVzdChzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcSkKK3sKKwlpbnQgbGVuID0gc21iX2xlbihyZXEtPnJxX2hlYWRlcikgKyA0OworCXJlcS0+cnFfc2xlbiA9IGxlbjsKKworCS8qIGlmIHdlIGV4cGVjdCBhIGRhdGEgcGFydCBpbiB0aGUgcmVwbHkgd2Ugc2V0IHRoZSBpb3YncyB0byByZWFkIGl0ICovCisJaWYgKHJlcS0+cnFfcmVzcF9iY2MpCisJCXJlcS0+cnFfc2V0dXBfcmVhZCA9IHNtYl9zZXR1cF9iY2M7CisKKwkvKiBUaGlzIHRyaWVzIHRvIHN1cHBvcnQgcmUtdXNpbmcgdGhlIHNhbWUgcmVxdWVzdCAqLworCXJlcS0+cnFfYnl0ZXNfc2VudCA9IDA7CisJcmVxLT5ycV9yY2xzID0gMDsKKwlyZXEtPnJxX2VyciA9IDA7CisJcmVxLT5ycV9lcnJubyA9IDA7CisJcmVxLT5ycV9mcmFnbWVudCA9IDA7CisJaWYgKHJlcS0+cnFfdHJhbnMyYnVmZmVyKQorCQlzbWJfa2ZyZWUocmVxLT5ycV90cmFuczJidWZmZXIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQcmVwYXJlIGEgdHJhbnNhY3Rpb24yIHJlcXVlc3Qgc3RydWN0dXJlCisgKi8KK3N0YXRpYyBpbnQgc21iX3NldHVwX3RyYW5zMnJlcXVlc3Qoc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIgPSByZXEtPnJxX3NlcnZlcjsKKwlpbnQgbXBhcmFtLCBtZGF0YTsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBwYWRkaW5nWzRdOworCisJLyogSSBrbm93IHRoZSBmb2xsb3dpbmcgaXMgdmVyeSB1Z2x5LCBidXQgSSB3YW50IHRvIGJ1aWxkIHRoZQorCSAgIHNtYiBwYWNrZXQgYXMgZWZmaWNpZW50bHkgYXMgcG9zc2libGUuICovCisKKwljb25zdCBpbnQgc21iX3BhcmFtZXRlcnMgPSAxNTsKKwljb25zdCBpbnQgaGVhZGVyID0gU01CX0hFQURFUl9MRU4gKyAyICogc21iX3BhcmFtZXRlcnMgKyAyOworCWNvbnN0IGludCBvcGFyYW0gPSBST1VORF9VUChoZWFkZXIgKyAzKTsKKwljb25zdCBpbnQgb2RhdGEgID0gUk9VTkRfVVAob3BhcmFtICsgcmVxLT5ycV9scGFybSk7CisJY29uc3QgaW50IGJjYyA9IChyZXEtPnJxX2RhdGEgPyBvZGF0YSArIHJlcS0+cnFfbGRhdGEgOgorCQkJCQlvcGFyYW0gKyByZXEtPnJxX2xwYXJtKSAtIGhlYWRlcjsKKworCWlmICgoYmNjICsgb3BhcmFtKSA+IHNlcnZlci0+b3B0Lm1heF94bWl0KQorCQlyZXR1cm4gLUVOT01FTTsKKwlzbWJfc2V0dXBfaGVhZGVyKHJlcSwgU01CdHJhbnMyLCBzbWJfcGFyYW1ldGVycywgYmNjKTsKKworCS8qCisJICogbWF4IHBhcmFtZXRlcnMgKyBtYXggZGF0YSArIG1heCBzZXR1cCA9PSBidWZzaXplIHRvIG1ha2UgTlQ0IGhhcHB5CisJICogYW5kIG5vdCBhYm9ydCB0aGUgdHJhbnNmZXIgb3Igc3BsaXQgaW50byBtdWx0aXBsZSByZXNwb25zZXMuIEl0IGFsc28KKwkgKiBtYWtlcyBzbWJmcyBoYXBweSBhcyBoYW5kbGluZyBwYWNrZXRzIGxhcmdlciB0aGFuIHRoZSBidWZmZXIgc2l6ZQorCSAqIGlzIGV4dHJhIHdvcmsuCisJICoKKwkgKiBPUy8yIGlzIHByb2JhYmx5IGdvaW5nIHRvIGhhdGUgbWUgZm9yIHRoaXMgLi4uCisJICovCisJbXBhcmFtID0gU01CX1RSQU5TMl9NQVhfUEFSQU07CisJbWRhdGEgPSByZXEtPnJxX2J1ZnNpemUgLSBtcGFyYW07CisKKwltZGF0YSA9IHNlcnZlci0+b3B0Lm1heF94bWl0IC0gbXBhcmFtIC0gMTAwOworCWlmIChtZGF0YSA8IDEwMjQpIHsKKwkJbWRhdGEgPSAxMDI0OworCQltcGFyYW0gPSAyMDsKKwl9CisKKyNpZiAwCisJLyogTlQvd2luMmsgaGFzIH40ayBtYXhfeG1pdCwgc28gd2l0aCB0aGlzIHdlIHJlcXVlc3QgbW9yZSB0aGFuIGl0IHdhbnRzCisJICAgdG8gcmV0dXJuIGFzIG9uZSBTTUIuIFVzZWZ1bCBmb3IgdGVzdGluZyB0aGUgZnJhZ21lbnRlZCB0cmFuczIKKwkgICBoYW5kbGluZy4gKi8KKwltZGF0YSA9IDgxOTI7CisjZW5kaWYKKworCVdTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl90cHNjbnQsIHJlcS0+cnFfbHBhcm0pOworCVdTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl90ZHNjbnQsIHJlcS0+cnFfbGRhdGEpOworCVdTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl9tcHJjbnQsIG1wYXJhbSk7CisJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX21kcmNudCwgbWRhdGEpOworCVdTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl9tc3JjbnQsIDApOyAgICAvKiBtYXggc2V0dXAgYWx3YXlzIDAgPyAqLworCVdTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl9mbGFncywgMCk7CisJRFNFVChyZXEtPnJxX2hlYWRlciwgc21iX3RpbWVvdXQsIDApOworCVdTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl9wc2NudCwgcmVxLT5ycV9scGFybSk7CisJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX3Bzb2ZmLCBvcGFyYW0gLSA0KTsKKwlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfZHNjbnQsIHJlcS0+cnFfbGRhdGEpOworCVdTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl9kc29mZiwgcmVxLT5ycV9kYXRhID8gb2RhdGEgLSA0IDogMCk7CisJKihyZXEtPnJxX2hlYWRlciArIHNtYl9zdXdjbnQpID0gMHgwMTsgICAgICAgICAgLyogc2V0dXAgY291bnQgKi8KKwkqKHJlcS0+cnFfaGVhZGVyICsgc21iX3N1d2NudCArIDEpID0gMHgwMDsgICAgICAvKiByZXNlcnZlZCAqLworCVdTRVQocmVxLT5ycV9oZWFkZXIsIHNtYl9zZXR1cDAsIHJlcS0+cnFfdHJhbnMyX2NvbW1hbmQpOworCisJcmVxLT5ycV9pb3ZsZW4gPSAyOworCXJlcS0+cnFfaW92WzBdLmlvdl9iYXNlID0gKHZvaWQgKikgcmVxLT5ycV9oZWFkZXI7CisJcmVxLT5ycV9pb3ZbMF0uaW92X2xlbiA9IG9wYXJhbTsKKwlyZXEtPnJxX2lvdlsxXS5pb3ZfYmFzZSA9IChyZXEtPnJxX3Bhcm09PU5VTEwpID8gcGFkZGluZyA6IHJlcS0+cnFfcGFybTsKKwlyZXEtPnJxX2lvdlsxXS5pb3ZfbGVuID0gcmVxLT5ycV9scGFybTsKKwlyZXEtPnJxX3NsZW4gPSBvcGFyYW0gKyByZXEtPnJxX2xwYXJtOworCisJaWYgKHJlcS0+cnFfZGF0YSkgeworCQlyZXEtPnJxX2lvdmxlbiArPSAyOworCQlyZXEtPnJxX2lvdlsyXS5pb3ZfYmFzZSA9IHBhZGRpbmc7CisJCXJlcS0+cnFfaW92WzJdLmlvdl9sZW4gPSBvZGF0YSAtIG9wYXJhbSAtIHJlcS0+cnFfbHBhcm07CisJCXJlcS0+cnFfaW92WzNdLmlvdl9iYXNlID0gcmVxLT5ycV9kYXRhOworCQlyZXEtPnJxX2lvdlszXS5pb3ZfbGVuID0gcmVxLT5ycV9sZGF0YTsKKwkJcmVxLT5ycV9zbGVuID0gb2RhdGEgKyByZXEtPnJxX2xkYXRhOworCX0KKworCS8qIGFsd2F5cyBhIGRhdGEgcGFydCBmb3IgdHJhbnMyIHJlcGxpZXMgKi8KKwlyZXEtPnJxX3NldHVwX3JlYWQgPSBzbWJfc2V0dXBfYmNjOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBZGQgYSByZXF1ZXN0IGFuZCB0ZWxsIHNtYmlvZCB0byBwcm9jZXNzIGl0CisgKi8KK2ludCBzbWJfYWRkX3JlcXVlc3Qoc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXEpCit7CisJbG9uZyB0aW1lbGVmdDsKKwlzdHJ1Y3Qgc21iX3NiX2luZm8gKnNlcnZlciA9IHJlcS0+cnFfc2VydmVyOworCWludCByZXN1bHQgPSAwOworCisJc21iX3NldHVwX3JlcXVlc3QocmVxKTsKKwlpZiAocmVxLT5ycV90cmFuczJfY29tbWFuZCkgeworCQlpZiAocmVxLT5ycV9idWZmZXIgPT0gTlVMTCkgeworCQkJUEFSQU5PSUEoInRyYW5zMiBhdHRlbXB0ZWQgd2l0aG91dCByZXNwb25zZSBidWZmZXIhXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCXJlc3VsdCA9IHNtYl9zZXR1cF90cmFuczJyZXF1ZXN0KHJlcSk7CisJfQorCWlmIChyZXN1bHQgPCAwKQorCQlyZXR1cm4gcmVzdWx0OworCisjaWZkZWYgU01CX0RFQlVHX1BBQ0tFVF9TSVpFCisJYWRkX3htaXRfc3RhdHMocmVxKTsKKyNlbmRpZgorCisJLyogYWRkICdyZXEnIHRvIHRoZSBxdWV1ZSBvZiByZXF1ZXN0cyAqLworCWlmIChzbWJfbG9ja19zZXJ2ZXJfaW50ZXJydXB0aWJsZShzZXJ2ZXIpKQorCQlyZXR1cm4gLUVJTlRSOworCisJLyoKKwkgKiBUcnkgdG8gc2VuZCB0aGUgcmVxdWVzdCBhcyB0aGUgcHJvY2Vzcy4gSWYgdGhhdCBmYWlscyB3ZSBxdWV1ZSB0aGUKKwkgKiByZXF1ZXN0IGFuZCBsZXQgc21iaW9kIHNlbmQgaXQgbGF0ZXIuCisJICovCisKKwkvKiBGSVhNRTogZWFjaCBzZXJ2ZXIgaGFzIGEgbnVtYmVyIG9uIHRoZSBtYXhpbXVtIG51bWJlciBvZiBwYXJhbGxlbAorCSAgIHJlcXVlc3RzLiAxMCwgNTAgb3Igc28uIFdlIHNob3VsZCBub3QgYWxsb3cgbW9yZSByZXF1ZXN0cyB0byBiZQorCSAgIGFjdGl2ZS4gKi8KKwlpZiAoc2VydmVyLT5taWQgPiAweGYwMDApCisJCXNlcnZlci0+bWlkID0gMDsKKwlyZXEtPnJxX21pZCA9IHNlcnZlci0+bWlkKys7CisJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX21pZCwgcmVxLT5ycV9taWQpOworCisJcmVzdWx0ID0gMDsKKwlpZiAoc2VydmVyLT5zdGF0ZSA9PSBDT05OX1ZBTElEKSB7CisJCWlmIChsaXN0X2VtcHR5KCZzZXJ2ZXItPnhtaXRxKSkKKwkJCXJlc3VsdCA9IHNtYl9yZXF1ZXN0X3NlbmRfcmVxKHJlcSk7CisJCWlmIChyZXN1bHQgPCAwKSB7CisJCQkvKiBDb25uZWN0aW9uIGxvc3Q/ICovCisJCQlzZXJ2ZXItPmNvbm5fZXJyb3IgPSByZXN1bHQ7CisJCQlzZXJ2ZXItPnN0YXRlID0gQ09OTl9JTlZBTElEOworCQl9CisJfQorCWlmIChyZXN1bHQgIT0gMSkKKwkJbGlzdF9hZGRfdGFpbCgmcmVxLT5ycV9xdWV1ZSwgJnNlcnZlci0+eG1pdHEpOworCXNtYl9yZ2V0KHJlcSk7CisKKwlpZiAoc2VydmVyLT5zdGF0ZSAhPSBDT05OX1ZBTElEKQorCQlzbWJpb2RfcmV0cnkoc2VydmVyKTsKKworCXNtYl91bmxvY2tfc2VydmVyKHNlcnZlcik7CisKKwlzbWJpb2Rfd2FrZV91cCgpOworCisJdGltZWxlZnQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChyZXEtPnJxX3dhaXQsCisJCQkJICAgIHJlcS0+cnFfZmxhZ3MgJiBTTUJfUkVRX1JFQ0VJVkVELCAzMCpIWik7CisJaWYgKCF0aW1lbGVmdCB8fCBzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkvKgorCQkgKiBPbiB0aW1lb3V0IG9yIG9uIGludGVycnVwdCB3ZSB3YW50IHRvIHRyeSBhbmQgcmVtb3ZlIHRoZQorCQkgKiByZXF1ZXN0IGZyb20gdGhlIHJlY3ZxL3htaXRxLgorCQkgKi8KKwkJc21iX2xvY2tfc2VydmVyKHNlcnZlcik7CisJCWlmICghKHJlcS0+cnFfZmxhZ3MgJiBTTUJfUkVRX1JFQ0VJVkVEKSkgeworCQkJbGlzdF9kZWxfaW5pdCgmcmVxLT5ycV9xdWV1ZSk7CisJCQlzbWJfcnB1dChyZXEpOworCQl9CisJCXNtYl91bmxvY2tfc2VydmVyKHNlcnZlcik7CisJfQorCisJaWYgKCF0aW1lbGVmdCkgeworCQlQQVJBTk9JQSgicmVxdWVzdCBbJXAsIG1pZD0lZF0gdGltZWQgb3V0IVxuIiwKKwkJCSByZXEsIHJlcS0+cnFfbWlkKTsKKwkJVkVSQk9TRSgic21iX2NvbTogICUwMnhcbiIsICoocmVxLT5ycV9oZWFkZXIgKyBzbWJfY29tKSk7CisJCVZFUkJPU0UoInNtYl9yY2xzOiAlMDJ4XG4iLCAqKHJlcS0+cnFfaGVhZGVyICsgc21iX3JjbHMpKTsKKwkJVkVSQk9TRSgic21iX2ZsZzogICUwMnhcbiIsICoocmVxLT5ycV9oZWFkZXIgKyBzbWJfZmxnKSk7CisJCVZFUkJPU0UoInNtYl90aWQ6ICAlMDR4XG4iLCBXVkFMKHJlcS0+cnFfaGVhZGVyLCBzbWJfdGlkKSk7CisJCVZFUkJPU0UoInNtYl9waWQ6ICAlMDR4XG4iLCBXVkFMKHJlcS0+cnFfaGVhZGVyLCBzbWJfcGlkKSk7CisJCVZFUkJPU0UoInNtYl91aWQ6ICAlMDR4XG4iLCBXVkFMKHJlcS0+cnFfaGVhZGVyLCBzbWJfdWlkKSk7CisJCVZFUkJPU0UoInNtYl9taWQ6ICAlMDR4XG4iLCBXVkFMKHJlcS0+cnFfaGVhZGVyLCBzbWJfbWlkKSk7CisJCVZFUkJPU0UoInNtYl93Y3Q6ICAlMDJ4XG4iLCAqKHJlcS0+cnFfaGVhZGVyICsgc21iX3djdCkpOworCisJCXJlcS0+cnFfcmNscyA9IEVSUlNSVjsKKwkJcmVxLT5ycV9lcnIgID0gRVJSdGltZW91dDsKKworCQkvKiBKdXN0IGluIGNhc2UgaXQgd2FzICJzdHVjayIgKi8KKwkJc21iaW9kX3dha2VfdXAoKTsKKwl9CisJVkVSQk9TRSgid29rZSB1cCwgcmNscz0lZFxuIiwgcmVxLT5ycV9yY2xzKTsKKworCWlmIChyZXEtPnJxX3JjbHMgIT0gMCkKKwkJcmVxLT5ycV9lcnJubyA9IHNtYl9lcnJubyhyZXEpOworCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJcmVxLT5ycV9lcnJubyA9IC1FUkVTVEFSVFNZUzsKKwlyZXR1cm4gcmVxLT5ycV9lcnJubzsKK30KKworLyoKKyAqIFNlbmQgYSByZXF1ZXN0IGFuZCBwbGFjZSBpdCBvbiB0aGUgcmVjdnEgaWYgc3VjY2Vzc2Z1bGx5IHNlbnQuCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBzZXJ2ZXIgbG9jayBoZWxkLgorICovCitzdGF0aWMgaW50IHNtYl9yZXF1ZXN0X3NlbmRfcmVxKHN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyID0gcmVxLT5ycV9zZXJ2ZXI7CisJaW50IHJlc3VsdDsKKworCWlmIChyZXEtPnJxX2J5dGVzX3NlbnQgPT0gMCkgeworCQlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfdGlkLCBzZXJ2ZXItPm9wdC50aWQpOworCQlXU0VUKHJlcS0+cnFfaGVhZGVyLCBzbWJfcGlkLCAxKTsKKwkJV1NFVChyZXEtPnJxX2hlYWRlciwgc21iX3VpZCwgc2VydmVyLT5vcHQuc2VydmVyX3VpZCk7CisJfQorCisJcmVzdWx0ID0gc21iX3NlbmRfcmVxdWVzdChyZXEpOworCWlmIChyZXN1bHQgPCAwICYmIHJlc3VsdCAhPSAtRUFHQUlOKQorCQlnb3RvIG91dDsKKworCXJlc3VsdCA9IDA7CisJaWYgKCEocmVxLT5ycV9mbGFncyAmIFNNQl9SRVFfVFJBTlNNSVRURUQpKQorCQlnb3RvIG91dDsKKworCWxpc3RfZGVsX2luaXQoJnJlcS0+cnFfcXVldWUpOworCWxpc3RfYWRkX3RhaWwoJnJlcS0+cnFfcXVldWUsICZzZXJ2ZXItPnJlY3ZxKTsKKwlyZXN1bHQgPSAxOworb3V0OgorCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBTZW5kcyBvbmUgcmVxdWVzdCBmb3IgdGhpcyBzZXJ2ZXIuIChzbWJpb2QpCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBzZXJ2ZXIgbG9jayBoZWxkLgorICogUmV0dXJuczogPDAgb24gZXJyb3IKKyAqICAgICAgICAgICAwIGlmIG5vIHJlcXVlc3QgY291bGQgYmUgY29tcGxldGVseSBzZW50CisgKiAgICAgICAgICAgMSBpZiBhbGwgZGF0YSBmb3Igb25lIHJlcXVlc3Qgd2FzIHNlbnQKKyAqLworaW50IHNtYl9yZXF1ZXN0X3NlbmRfc2VydmVyKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7CisJc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXE7CisJaW50IHJlc3VsdDsKKworCWlmIChzZXJ2ZXItPnN0YXRlICE9IENPTk5fVkFMSUQpCisJCXJldHVybiAwOworCisJLyogZGVxdWV1ZSBmaXJzdCByZXF1ZXN0LCBpZiBhbnkgKi8KKwlyZXEgPSBOVUxMOworCWhlYWQgPSBzZXJ2ZXItPnhtaXRxLm5leHQ7CisJaWYgKGhlYWQgIT0gJnNlcnZlci0+eG1pdHEpIHsKKwkJcmVxID0gbGlzdF9lbnRyeShoZWFkLCBzdHJ1Y3Qgc21iX3JlcXVlc3QsIHJxX3F1ZXVlKTsKKwl9CisJaWYgKCFyZXEpCisJCXJldHVybiAwOworCisJcmVzdWx0ID0gc21iX3JlcXVlc3Rfc2VuZF9yZXEocmVxKTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlzZXJ2ZXItPmNvbm5fZXJyb3IgPSByZXN1bHQ7CisJCWxpc3RfZGVsX2luaXQoJnJlcS0+cnFfcXVldWUpOworCQlsaXN0X2FkZCgmcmVxLT5ycV9xdWV1ZSwgJnNlcnZlci0+eG1pdHEpOworCQlyZXN1bHQgPSAtRUlPOworCQlnb3RvIG91dDsKKwl9CisKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogVHJ5IHRvIGZpbmQgYSByZXF1ZXN0IG1hdGNoaW5nIHRoaXMgIm1pZCIuIFR5cGljYWxseSB0aGUgZmlyc3QgZW50cnkgd2lsbAorICogYmUgdGhlIG1hdGNoaW5nIG9uZS4KKyAqLworc3RhdGljIHN0cnVjdCBzbWJfcmVxdWVzdCAqZmluZF9yZXF1ZXN0KHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBpbnQgbWlkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKKwlzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcSA9IE5VTEw7CisKKwlsaXN0X2Zvcl9lYWNoKHRtcCwgJnNlcnZlci0+cmVjdnEpIHsKKwkJcmVxID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBzbWJfcmVxdWVzdCwgcnFfcXVldWUpOworCQlpZiAocmVxLT5ycV9taWQgPT0gbWlkKSB7CisJCQlicmVhazsKKwkJfQorCQlyZXEgPSBOVUxMOworCX0KKworCWlmICghcmVxKSB7CisJCVZFUkJPU0UoInJlY2VpdmVkIHJlcGx5IHdpdGggbWlkICVkIGJ1dCBubyByZXF1ZXN0IVxuIiwKKwkJCVdWQUwoc2VydmVyLT5oZWFkZXIsIHNtYl9taWQpKTsKKwkJc2VydmVyLT5yc3RhdGUgPSBTTUJfUkVDVl9EUk9QOworCX0KKworCXJldHVybiByZXE7Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbiB3ZSBoYXZlIHJlYWQgdGhlIHNtYiBoZWFkZXIgYW5kIGJlbGlldmUgdGhpcyBpcyBhIHJlc3BvbnNlLgorICovCitzdGF0aWMgaW50IHNtYl9pbml0X3JlcXVlc3Qoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIsIHN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxKQoreworCWludCBoZHJsZW4sIHdjdDsKKworCW1lbWNweShyZXEtPnJxX2hlYWRlciwgc2VydmVyLT5oZWFkZXIsIFNNQl9IRUFERVJfTEVOKTsKKworCXdjdCA9ICoocmVxLT5ycV9oZWFkZXIgKyBzbWJfd2N0KTsKKwlpZiAod2N0ID4gMjApIHsJCisJCVBBUkFOT0lBKCJ3Y3QgdG9vIGxhcmdlLCAlZCA+IDIwXG4iLCB3Y3QpOworCQlzZXJ2ZXItPnJzdGF0ZSA9IFNNQl9SRUNWX0RST1A7CisJCXJldHVybiAwOworCX0KKworCXJlcS0+cnFfcmVzcF93Y3QgPSB3Y3Q7CisJaGRybGVuID0gU01CX0hFQURFUl9MRU4gKyB3Y3QqMiArIDI7CisJVkVSQk9TRSgiaGVhZGVyIGxlbmd0aDogJWQgICBzbWJfd2N0OiAlMmRcbiIsIGhkcmxlbiwgd2N0KTsKKworCXJlcS0+cnFfYnl0ZXNfcmVjdmQgPSBTTUJfSEVBREVSX0xFTjsKKwlyZXEtPnJxX3JsZW4gPSBoZHJsZW47CisJcmVxLT5ycV9pb3ZbMF0uaW92X2Jhc2UgPSByZXEtPnJxX2hlYWRlcjsKKwlyZXEtPnJxX2lvdlswXS5pb3ZfbGVuICA9IGhkcmxlbjsKKwlyZXEtPnJxX2lvdmxlbiA9IDE7CisJc2VydmVyLT5yc3RhdGUgPSBTTUJfUkVDVl9QQVJBTTsKKworI2lmZGVmIFNNQl9ERUJVR19QQUNLRVRfU0laRQorCWFkZF9yZWN2X3N0YXRzKHNtYl9sZW4oc2VydmVyLT5oZWFkZXIpKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKgorICogUmVhZHMgdGhlIFNNQiBwYXJhbWV0ZXJzCisgKi8KK3N0YXRpYyBpbnQgc21iX3JlY3ZfcGFyYW0oc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIsIHN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxKQoreworCWludCByZXN1bHQ7CisKKwlyZXN1bHQgPSBzbWJfcmVjZWl2ZShzZXJ2ZXIsIHJlcSk7CisJaWYgKHJlc3VsdCA8IDApCisJCXJldHVybiByZXN1bHQ7CisJaWYgKHJlcS0+cnFfYnl0ZXNfcmVjdmQgPCByZXEtPnJxX3JsZW4pCisJCXJldHVybiAwOworCisJVkVSQk9TRSgicmVzdWx0OiAlZCAgIHNtYl9iY2M6ICAlMDR4XG4iLCByZXN1bHQsCisJCVdWQUwocmVxLT5ycV9oZWFkZXIsIFNNQl9IRUFERVJfTEVOICsKKwkJICAgICAoKihyZXEtPnJxX2hlYWRlciArIHNtYl93Y3QpICogMikpKTsKKworCXJlc3VsdCA9IDA7CisJcmVxLT5ycV9pb3ZbMF0uaW92X2Jhc2UgPSBOVUxMOworCXJlcS0+cnFfcmxlbiA9IDA7CisJaWYgKHJlcS0+cnFfY2FsbGJhY2spCisJCXJlcS0+cnFfY2FsbGJhY2socmVxKTsKKwllbHNlIGlmIChyZXEtPnJxX3NldHVwX3JlYWQpCisJCXJlc3VsdCA9IHJlcS0+cnFfc2V0dXBfcmVhZChyZXEpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCXNlcnZlci0+cnN0YXRlID0gU01CX1JFQ1ZfRFJPUDsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlzZXJ2ZXItPnJzdGF0ZSA9IHJlcS0+cnFfcmxlbiA+IDAgPyBTTUJfUkVDVl9EQVRBIDogU01CX1JFQ1ZfRU5EOworCisJcmVxLT5ycV9ieXRlc19yZWN2ZCA9IDA7CS8vIHJlY3ZkIG91dCBvZiB0aGUgaW92CisKKwlWRVJCT1NFKCJybGVuOiAlZFxuIiwgcmVxLT5ycV9ybGVuKTsKKwlpZiAocmVxLT5ycV9ybGVuIDwgMCkgeworCQlQQVJBTk9JQSgiUGFyYW1ldGVycyByZWFkIGJleW9uZCBlbmQgb2YgcGFja2V0IVxuIik7CisJCXNlcnZlci0+cnN0YXRlID0gU01CX1JFQ1ZfRU5EOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkcyB0aGUgU01CIGRhdGEKKyAqLworc3RhdGljIGludCBzbWJfcmVjdl9kYXRhKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcSkKK3sKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gc21iX3JlY2VpdmUoc2VydmVyLCByZXEpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIG91dDsKKwlpZiAocmVxLT5ycV9ieXRlc19yZWN2ZCA8IHJlcS0+cnFfcmxlbikKKwkJZ290byBvdXQ7CisJc2VydmVyLT5yc3RhdGUgPSBTTUJfUkVDVl9FTkQ7CitvdXQ6CisJVkVSQk9TRSgicmVzdWx0OiAlZFxuIiwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogUmVjZWl2ZSBhIHRyYW5zYWN0aW9uMiByZXNwb25zZQorICogUmV0dXJuOiAwIGlmIHRoZSByZXNwb25zZSBoYXMgYmVlbiBmdWxseSByZWFkCisgKiAgICAgICAgIDEgaWYgdGhlcmUgYXJlIGZ1cnRoZXIgImZyYWdtZW50cyIgdG8gcmVhZAorICogICAgICAgIDwwIGlmIHRoZXJlIGlzIGFuIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgc21iX3JlY3ZfdHJhbnMyKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyLCBzdHJ1Y3Qgc21iX3JlcXVlc3QgKnJlcSkKK3sKKwl1bnNpZ25lZCBjaGFyICppbmJ1ZjsKKwl1bnNpZ25lZCBpbnQgcGFybV9kaXNwLCBwYXJtX29mZnNldCwgcGFybV9jb3VudCwgcGFybV90b3Q7CisJdW5zaWduZWQgaW50IGRhdGFfZGlzcCwgZGF0YV9vZmZzZXQsIGRhdGFfY291bnQsIGRhdGFfdG90OworCWludCBoZHJsZW4gPSBTTUJfSEVBREVSX0xFTiArIHJlcS0+cnFfcmVzcF93Y3QqMiAtIDI7CisKKwlWRVJCT1NFKCJoYW5kbGluZyB0cmFuczJcbiIpOworCisJaW5idWYgPSByZXEtPnJxX2hlYWRlcjsKKwlkYXRhX3RvdCAgICA9IFdWQUwoaW5idWYsIHNtYl90ZHJjbnQpOworCXBhcm1fdG90ICAgID0gV1ZBTChpbmJ1Ziwgc21iX3RwcmNudCk7CisJcGFybV9kaXNwICAgPSBXVkFMKGluYnVmLCBzbWJfcHJkaXNwKTsKKwlwYXJtX29mZnNldCA9IFdWQUwoaW5idWYsIHNtYl9wcm9mZik7CisJcGFybV9jb3VudCAgPSBXVkFMKGluYnVmLCBzbWJfcHJjbnQpOworCWRhdGFfZGlzcCAgID0gV1ZBTChpbmJ1Ziwgc21iX2RyZGlzcCk7CisJZGF0YV9vZmZzZXQgPSBXVkFMKGluYnVmLCBzbWJfZHJvZmYpOworCWRhdGFfY291bnQgID0gV1ZBTChpbmJ1Ziwgc21iX2RyY250KTsKKworCS8qIE1vZGlmeSBvZmZzZXQgZm9yIHRoZSBzcGxpdCBoZWFkZXIvYnVmZmVyIHdlIHVzZSAqLworCWlmIChkYXRhX2NvdW50IHx8IGRhdGFfb2Zmc2V0KSB7CisJCWlmICh1bmxpa2VseShkYXRhX29mZnNldCA8IGhkcmxlbikpCisJCQlnb3RvIG91dF9iYWRfZGF0YTsKKwkJZWxzZQorCQkJZGF0YV9vZmZzZXQgLT0gaGRybGVuOworCX0KKwlpZiAocGFybV9jb3VudCB8fCBwYXJtX29mZnNldCkgeworCQlpZiAodW5saWtlbHkocGFybV9vZmZzZXQgPCBoZHJsZW4pKQorCQkJZ290byBvdXRfYmFkX3Bhcm07CisJCWVsc2UKKwkJCXBhcm1fb2Zmc2V0IC09IGhkcmxlbjsKKwl9CisKKwlpZiAocGFybV9jb3VudCA9PSBwYXJtX3RvdCAmJiBkYXRhX2NvdW50ID09IGRhdGFfdG90KSB7CisJCS8qCisJCSAqIFRoaXMgcGFja2V0IGhhcyBhbGwgdGhlIHRyYW5zMiBkYXRhLgorCQkgKgorCQkgKiBXZSBzZXR1cCB0aGUgcmVxdWVzdCBzbyB0aGF0IHRoaXMgd2lsbCBiZSB0aGUgY29tbW9uCisJCSAqIGNhc2UuIEl0IG1heSBiZSBhIHNlcnZlciBlcnJvciB0byBub3QgcmV0dXJuIGEKKwkJICogcmVzcG9uc2UgdGhhdCBmaXRzLgorCQkgKi8KKwkJVkVSQk9TRSgic2luZ2xlIHRyYW5zMiByZXNwb25zZSAgIgorCQkJImRjbnQ9JXUsIHBjbnQ9JXUsIGRvZmY9JXUsIHBvZmY9JXVcbiIsCisJCQlkYXRhX2NvdW50LCBwYXJtX2NvdW50LAorCQkJZGF0YV9vZmZzZXQsIHBhcm1fb2Zmc2V0KTsKKwkJcmVxLT5ycV9sZGF0YSA9IGRhdGFfY291bnQ7CisJCXJlcS0+cnFfbHBhcm0gPSBwYXJtX2NvdW50OworCQlyZXEtPnJxX2RhdGEgPSByZXEtPnJxX2J1ZmZlciArIGRhdGFfb2Zmc2V0OworCQlyZXEtPnJxX3Bhcm0gPSByZXEtPnJxX2J1ZmZlciArIHBhcm1fb2Zmc2V0OworCQlpZiAodW5saWtlbHkocGFybV9vZmZzZXQgKyBwYXJtX2NvdW50ID4gcmVxLT5ycV9ybGVuKSkKKwkJCWdvdG8gb3V0X2JhZF9wYXJtOworCQlpZiAodW5saWtlbHkoZGF0YV9vZmZzZXQgKyBkYXRhX2NvdW50ID4gcmVxLT5ycV9ybGVuKSkKKwkJCWdvdG8gb3V0X2JhZF9kYXRhOworCQlyZXR1cm4gMDsKKwl9CisKKwlWRVJCT1NFKCJtdWx0aSB0cmFuczIgcmVzcG9uc2UgICIKKwkJImZyYWc9JWQsIGRjbnQ9JXUsIHBjbnQ9JXUsIGRvZmY9JXUsIHBvZmY9JXVcbiIsCisJCXJlcS0+cnFfZnJhZ21lbnQsCisJCWRhdGFfY291bnQsIHBhcm1fY291bnQsCisJCWRhdGFfb2Zmc2V0LCBwYXJtX29mZnNldCk7CisKKwlpZiAoIXJlcS0+cnFfZnJhZ21lbnQpIHsKKwkJaW50IGJ1Zl9sZW47CisKKwkJLyogV2UgZ290IHRoZSBmaXJzdCB0cmFuczIgZnJhZ21lbnQgKi8KKwkJcmVxLT5ycV9mcmFnbWVudCA9IDE7CisJCXJlcS0+cnFfdG90YWxfZGF0YSA9IGRhdGFfdG90OworCQlyZXEtPnJxX3RvdGFsX3Bhcm0gPSBwYXJtX3RvdDsKKwkJcmVxLT5ycV9sZGF0YSA9IDA7CisJCXJlcS0+cnFfbHBhcm0gPSAwOworCisJCWJ1Zl9sZW4gPSBkYXRhX3RvdCArIHBhcm1fdG90OworCQlpZiAoYnVmX2xlbiA+IFNNQl9NQVhfUEFDS0VUX1NJWkUpCisJCQlnb3RvIG91dF90b29fbG9uZzsKKworCQlyZXEtPnJxX3RyYW5zMmJ1ZnNpemUgPSBidWZfbGVuOworCQlyZXEtPnJxX3RyYW5zMmJ1ZmZlciA9IHNtYl9rbWFsbG9jKGJ1Zl9sZW4sIEdGUF9OT0ZTKTsKKwkJaWYgKCFyZXEtPnJxX3RyYW5zMmJ1ZmZlcikKKwkJCWdvdG8gb3V0X25vX21lbTsKKwkJbWVtc2V0KHJlcS0+cnFfdHJhbnMyYnVmZmVyLCAwLCBidWZfbGVuKTsKKworCQlyZXEtPnJxX3Bhcm0gPSByZXEtPnJxX3RyYW5zMmJ1ZmZlcjsKKwkJcmVxLT5ycV9kYXRhID0gcmVxLT5ycV90cmFuczJidWZmZXIgKyBwYXJtX3RvdDsKKwl9IGVsc2UgaWYgKHVubGlrZWx5KHJlcS0+cnFfdG90YWxfZGF0YSA8IGRhdGFfdG90IHx8CisJCQkgICAgcmVxLT5ycV90b3RhbF9wYXJtIDwgcGFybV90b3QpKQorCQlnb3RvIG91dF9kYXRhX2dyZXc7CisKKwlpZiAodW5saWtlbHkocGFybV9kaXNwICsgcGFybV9jb3VudCA+IHJlcS0+cnFfdG90YWxfcGFybSB8fAorCQkgICAgIHBhcm1fb2Zmc2V0ICsgcGFybV9jb3VudCA+IHJlcS0+cnFfcmxlbikpCisJCWdvdG8gb3V0X2JhZF9wYXJtOworCWlmICh1bmxpa2VseShkYXRhX2Rpc3AgKyBkYXRhX2NvdW50ID4gcmVxLT5ycV90b3RhbF9kYXRhIHx8CisJCSAgICAgZGF0YV9vZmZzZXQgKyBkYXRhX2NvdW50ID4gcmVxLT5ycV9ybGVuKSkKKwkJZ290byBvdXRfYmFkX2RhdGE7CisKKwlpbmJ1ZiA9IHJlcS0+cnFfYnVmZmVyOworCW1lbWNweShyZXEtPnJxX3Bhcm0gKyBwYXJtX2Rpc3AsIGluYnVmICsgcGFybV9vZmZzZXQsIHBhcm1fY291bnQpOworCW1lbWNweShyZXEtPnJxX2RhdGEgKyBkYXRhX2Rpc3AsIGluYnVmICsgZGF0YV9vZmZzZXQsIGRhdGFfY291bnQpOworCisJcmVxLT5ycV9sZGF0YSArPSBkYXRhX2NvdW50OworCXJlcS0+cnFfbHBhcm0gKz0gcGFybV9jb3VudDsKKworCS8qCisJICogQ2hlY2sgd2hldGhlciB3ZSd2ZSByZWNlaXZlZCBhbGwgb2YgdGhlIGRhdGEuIE5vdGUgdGhhdAorCSAqIHdlIHVzZSB0aGUgcGFja2V0IHRvdGFscyAtLSB0b3RhbCBsZW5ndGhzIG1pZ2h0IHNocmluayEKKwkgKi8KKwlpZiAocmVxLT5ycV9sZGF0YSA+PSBkYXRhX3RvdCAmJiByZXEtPnJxX2xwYXJtID49IHBhcm1fdG90KSB7CisJCXJlcS0+cnFfbGRhdGEgPSBkYXRhX3RvdDsKKwkJcmVxLT5ycV9scGFybSA9IHBhcm1fdG90OworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7CisKK291dF90b29fbG9uZzoKKwlwcmludGsoS0VSTl9FUlIgInNtYl90cmFuczI6IGRhdGEvcGFyYW0gdG9vIGxvbmcsIGRhdGE9JXUsIHBhcm09JXVcbiIsCisJCWRhdGFfdG90LCBwYXJtX3RvdCk7CisJZ290byBvdXRfRUlPOworb3V0X25vX21lbToKKwlwcmludGsoS0VSTl9FUlIgInNtYl90cmFuczI6IGNvdWxkbid0IGFsbG9jYXRlIGRhdGEgYXJlYSBvZiAlZCBieXRlc1xuIiwKKwkgICAgICAgcmVxLT5ycV90cmFuczJidWZzaXplKTsKKwlyZXEtPnJxX2Vycm5vID0gLUVOT01FTTsKKwlnb3RvIG91dDsKK291dF9kYXRhX2dyZXc6CisJcHJpbnRrKEtFUk5fRVJSICJzbWJfdHJhbnMyOiBkYXRhL3BhcmFtcyBncmV3IVxuIik7CisJZ290byBvdXRfRUlPOworb3V0X2JhZF9wYXJtOgorCXByaW50ayhLRVJOX0VSUiAic21iX3RyYW5zMjogaW52YWxpZCBwYXJtcywgZGlzcD0ldSwgY250PSV1LCB0b3Q9JXUsIG9mcz0ldVxuIiwKKwkgICAgICAgcGFybV9kaXNwLCBwYXJtX2NvdW50LCBwYXJtX3RvdCwgcGFybV9vZmZzZXQpOworCWdvdG8gb3V0X0VJTzsKK291dF9iYWRfZGF0YToKKwlwcmludGsoS0VSTl9FUlIgInNtYl90cmFuczI6IGludmFsaWQgZGF0YSwgZGlzcD0ldSwgY250PSV1LCB0b3Q9JXUsIG9mcz0ldVxuIiwKKwkgICAgICAgZGF0YV9kaXNwLCBkYXRhX2NvdW50LCBkYXRhX3RvdCwgZGF0YV9vZmZzZXQpOworb3V0X0VJTzoKKwlyZXEtPnJxX2Vycm5vID0gLUVJTzsKK291dDoKKwlyZXR1cm4gcmVxLT5ycV9lcnJubzsKK30KKworLyoKKyAqIFN0YXRlIG1hY2hpbmUgZm9yIHJlY2VpdmluZyByZXNwb25zZXMuIFdlIGhhbmRsZSB0aGUgZmFjdCB0aGF0IHdlIGNhbid0CisgKiByZWFkIHRoZSBmdWxsIHJlc3BvbnNlIGluIG9uZSB0cnkgYnkgaGF2aW5nIHN0YXRlcyB0ZWxsaW5nIHVzIGhvdyBtdWNoIHdlCisgKiBoYXZlIHJlYWQuCisgKgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgc2VydmVyIGxvY2sgaGVsZCAob25seSBjYWxsZWQgZnJvbSBzbWJpb2QpLgorICoKKyAqIFJldHVybjogPDAgb24gZXJyb3IKKyAqLworaW50IHNtYl9yZXF1ZXN0X3JlY3Yoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIpCit7CisJc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXEgPSBOVUxMOworCWludCByZXN1bHQgPSAwOworCisJaWYgKHNtYl9yZWN2X2F2YWlsYWJsZShzZXJ2ZXIpIDw9IDApCisJCXJldHVybiAwOworCisJVkVSQk9TRSgic3RhdGU6ICVkXG4iLCBzZXJ2ZXItPnJzdGF0ZSk7CisJc3dpdGNoIChzZXJ2ZXItPnJzdGF0ZSkgeworCWNhc2UgU01CX1JFQ1ZfRFJPUDoKKwkJcmVzdWx0ID0gc21iX3JlY2VpdmVfZHJvcChzZXJ2ZXIpOworCQlpZiAocmVzdWx0IDwgMCkKKwkJCWJyZWFrOworCQlpZiAoc2VydmVyLT5yc3RhdGUgPT0gU01CX1JFQ1ZfRFJPUCkKKwkJCWJyZWFrOworCQlzZXJ2ZXItPnJzdGF0ZSA9IFNNQl9SRUNWX1NUQVJUOworCQkvKiBmYWxsdGhyb3VnaCAqLworCWNhc2UgU01CX1JFQ1ZfU1RBUlQ6CisJCXNlcnZlci0+c21iX3JlYWQgPSAwOworCQlzZXJ2ZXItPnJzdGF0ZSA9IFNNQl9SRUNWX0hFQURFUjsKKwkJLyogZmFsbHRocm91Z2ggKi8KKwljYXNlIFNNQl9SRUNWX0hFQURFUjoKKwkJcmVzdWx0ID0gc21iX3JlY2VpdmVfaGVhZGVyKHNlcnZlcik7CisJCWlmIChyZXN1bHQgPCAwKQorCQkJYnJlYWs7CisJCWlmIChzZXJ2ZXItPnJzdGF0ZSA9PSBTTUJfUkVDVl9IRUFERVIpCisJCQlicmVhazsKKwkJaWYgKCEgKCooc2VydmVyLT5oZWFkZXIgKyBzbWJfZmxnKSAmIFNNQl9GTEFHU19SRVBMWSkgKSB7CisJCQlzZXJ2ZXItPnJzdGF0ZSA9IFNNQl9SRUNWX1JFUVVFU1Q7CisJCQlicmVhazsKKwkJfQorCQlpZiAoc2VydmVyLT5yc3RhdGUgIT0gU01CX1JFQ1ZfSENPTVBMRVRFKQorCQkJYnJlYWs7CisJCS8qIGZhbGx0aHJvdWdoICovCisJY2FzZSBTTUJfUkVDVl9IQ09NUExFVEU6CisJCXJlcSA9IGZpbmRfcmVxdWVzdChzZXJ2ZXIsIFdWQUwoc2VydmVyLT5oZWFkZXIsIHNtYl9taWQpKTsKKwkJaWYgKCFyZXEpCisJCQlicmVhazsKKwkJc21iX2luaXRfcmVxdWVzdChzZXJ2ZXIsIHJlcSk7CisJCXJlcS0+cnFfcmNscyA9ICoocmVxLT5ycV9oZWFkZXIgKyBzbWJfcmNscyk7CisJCXJlcS0+cnFfZXJyICA9IFdWQUwocmVxLT5ycV9oZWFkZXIsIHNtYl9lcnIpOworCQlpZiAoc2VydmVyLT5yc3RhdGUgIT0gU01CX1JFQ1ZfUEFSQU0pCisJCQlicmVhazsKKwkJLyogZmFsbHRocm91Z2ggKi8KKwljYXNlIFNNQl9SRUNWX1BBUkFNOgorCQlpZiAoIXJlcSkKKwkJCXJlcSA9IGZpbmRfcmVxdWVzdChzZXJ2ZXIsV1ZBTChzZXJ2ZXItPmhlYWRlcixzbWJfbWlkKSk7CisJCWlmICghcmVxKQorCQkJYnJlYWs7CisJCXJlc3VsdCA9IHNtYl9yZWN2X3BhcmFtKHNlcnZlciwgcmVxKTsKKwkJaWYgKHJlc3VsdCA8IDApCisJCQlicmVhazsKKwkJaWYgKHNlcnZlci0+cnN0YXRlICE9IFNNQl9SRUNWX0RBVEEpCisJCQlicmVhazsKKwkJLyogZmFsbHRocm91Z2ggKi8KKwljYXNlIFNNQl9SRUNWX0RBVEE6CisJCWlmICghcmVxKQorCQkJcmVxID0gZmluZF9yZXF1ZXN0KHNlcnZlcixXVkFMKHNlcnZlci0+aGVhZGVyLHNtYl9taWQpKTsKKwkJaWYgKCFyZXEpCisJCQlicmVhazsKKwkJcmVzdWx0ID0gc21iX3JlY3ZfZGF0YShzZXJ2ZXIsIHJlcSk7CisJCWlmIChyZXN1bHQgPCAwKQorCQkJYnJlYWs7CisJCWJyZWFrOworCisJCS8qIFdlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgd2l0aCBhbnkgb2YgdGhlc2Ugc3RhdGVzICovCisJY2FzZSBTTUJfUkVDVl9FTkQ6CisJY2FzZSBTTUJfUkVDVl9SRVFVRVNUOgorCQlzZXJ2ZXItPnJzdGF0ZSA9IFNNQl9SRUNWX0VORDsKKwkJYnJlYWs7CisJfQorCisJaWYgKHJlc3VsdCA8IDApIHsKKwkJLyogV2Ugc2F3IGFuIGVycm9yICovCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJaWYgKHNlcnZlci0+cnN0YXRlICE9IFNNQl9SRUNWX0VORCkKKwkJcmV0dXJuIDA7CisKKwlyZXN1bHQgPSAwOworCWlmIChyZXEtPnJxX3RyYW5zMl9jb21tYW5kICYmIHJlcS0+cnFfcmNscyA9PSBTVUNDRVNTKQorCQlyZXN1bHQgPSBzbWJfcmVjdl90cmFuczIoc2VydmVyLCByZXEpOworCisJLyoKKwkgKiBSZXNwb25zZSBjb21wbGV0ZWx5IHJlYWQuIERyb3AgYW55IGV4dHJhIGJ5dGVzIHNlbnQgYnkgdGhlIHNlcnZlci4KKwkgKiAoWWVzLCBzZXJ2ZXJzIHNvbWV0aW1lcyBhZGQgZXh0cmEgYnl0ZXMgdG8gcmVzcG9uc2VzKQorCSAqLworCVZFUkJPU0UoInNtYl9sZW46ICVkICAgc21iX3JlYWQ6ICVkXG4iLAorCQlzZXJ2ZXItPnNtYl9sZW4sIHNlcnZlci0+c21iX3JlYWQpOworCWlmIChzZXJ2ZXItPnNtYl9yZWFkIDwgc2VydmVyLT5zbWJfbGVuKQorCQlzbWJfcmVjZWl2ZV9kcm9wKHNlcnZlcik7CisKKwlzZXJ2ZXItPnJzdGF0ZSA9IFNNQl9SRUNWX1NUQVJUOworCisJaWYgKCFyZXN1bHQpIHsKKwkJbGlzdF9kZWxfaW5pdCgmcmVxLT5ycV9xdWV1ZSk7CisJCXJlcS0+cnFfZmxhZ3MgfD0gU01CX1JFUV9SRUNFSVZFRDsKKwkJc21iX3JwdXQocmVxKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZyZXEtPnJxX3dhaXQpOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL3NtYmZzL3JlcXVlc3QuaCBiL2ZzL3NtYmZzL3JlcXVlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmIyMTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvc21iZnMvcmVxdWVzdC5oCkBAIC0wLDAgKzEsNzAgQEAKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisKK3N0cnVjdCBzbWJfcmVxdWVzdCB7CisJc3RydWN0IGxpc3RfaGVhZCBycV9xdWV1ZTsJLyogcmVjdnEgb3IgeG1pdHEgZm9yIHRoZSBzZXJ2ZXIgKi8KKworCWF0b21pY190IHJxX2NvdW50OworCisJd2FpdF9xdWV1ZV9oZWFkX3QgcnFfd2FpdDsKKwlpbnQgcnFfZmxhZ3M7CisJaW50IHJxX21pZDsJLyogbXVsdGlwbGV4IElELCBzZXQgYnkgcmVxdWVzdC5jICovCisKKwlzdHJ1Y3Qgc21iX3NiX2luZm8gKnJxX3NlcnZlcjsKKworCS8qIGhlYWRlciArIHdvcmQgY291bnQgKyBwYXJhbWV0ZXIgd29yZHMgKyBieXRlIGNvdW50ICovCisJdW5zaWduZWQgY2hhciBycV9oZWFkZXJbU01CX0hFQURFUl9MRU4gKyAyMCoyICsgMl07CisKKwlpbnQgcnFfYnVmc2l6ZTsKKwl1bnNpZ25lZCBjaGFyICpycV9idWZmZXI7CisKKwkvKiBGSVhNRTogdGhpcyBpcyBub3QgZ29vZCBlbm91Z2ggZm9yIG1lcmdpbmcgSU8gcmVxdWVzdHMuICovCisJdW5zaWduZWQgY2hhciAqcnFfcGFnZTsKKwlpbnQgcnFfcnNpemU7CisKKwlpbnQgcnFfcmVzcF93Y3Q7CisJaW50IHJxX3Jlc3BfYmNjOworCisJaW50IHJxX3JsZW47CisJaW50IHJxX2J5dGVzX3JlY3ZkOworCisJaW50IHJxX3NsZW47CisJaW50IHJxX2J5dGVzX3NlbnQ7CisKKwlpbnQgcnFfaW92bGVuOworCXN0cnVjdCBrdmVjIHJxX2lvdls0XTsKKworCWludCAoKnJxX3NldHVwX3JlYWQpIChzdHJ1Y3Qgc21iX3JlcXVlc3QgKik7CisJdm9pZCAoKnJxX2NhbGxiYWNrKSAoc3RydWN0IHNtYl9yZXF1ZXN0ICopOworCisJLyogLS0tLS0tIHRyYW5zMiBzdHVmZiAtLS0tLS0gKi8KKworCXUxNiBycV90cmFuczJfY29tbWFuZDsJLyogMCBpZiBub3QgYSB0cmFuczIgcmVxdWVzdCAqLworCXVuc2lnbmVkIGludCBycV9sZGF0YTsKKwl1bnNpZ25lZCBjaGFyICpycV9kYXRhOworCXVuc2lnbmVkIGludCBycV9scGFybTsKKwl1bnNpZ25lZCBjaGFyICpycV9wYXJtOworCisJaW50IHJxX2ZyYWdtZW50OworCXUzMiBycV90b3RhbF9kYXRhOworCXUzMiBycV90b3RhbF9wYXJtOworCWludCBycV90cmFuczJidWZzaXplOworCXVuc2lnbmVkIGNoYXIgKnJxX3RyYW5zMmJ1ZmZlcjsKKworCS8qIC0tLS0tLSByZXNwb25zZSAtLS0tLS0gKi8KKworCXVuc2lnbmVkIHNob3J0IHJxX3JjbHM7CisJdW5zaWduZWQgc2hvcnQgcnFfZXJyOworCWludCBycV9lcnJubzsKK307CisKKyNkZWZpbmUgU01CX1JFUV9TVEFUSUMJCTB4MDAwMQkvKiBycV9idWZmZXIgaXMgc3RhdGljICovCisjZGVmaW5lIFNNQl9SRVFfTk9SRVRSWQkJMHgwMDAyCS8qIHJlcXVlc3QgaXMgaW52YWxpZCBhZnRlciByZXRyeSAqLworCisjZGVmaW5lIFNNQl9SRVFfVFJBTlNNSVRURUQJMHg0MDAwCS8qIGFsbCBkYXRhIGhhcyBiZWVuIHNlbnQgKi8KKyNkZWZpbmUgU01CX1JFUV9SRUNFSVZFRAkweDgwMDAJLyogcmVwbHkgcmVjZWl2ZWQsIHNtYmlvZCBpcyBkb25lICovCisKKyNkZWZpbmUgeFNNQl9SRVFfTk9SRVBMWQkweDAwMDQJLyogd2UgZG9uJ3Qgd2FudCB0aGUgcmVwbHkgKGlmIGFueSkgKi8KKyNkZWZpbmUgeFNNQl9SRVFfTk9SRUNFSVZFUgkweDAwMDgJLyogY2FsbGVyIGRvZXNuJ3Qgd2FpdCBmb3IgcmVzcG9uc2UgKi8KZGlmZiAtLWdpdCBhL2ZzL3NtYmZzL3NtYl9kZWJ1Zy5oIGIvZnMvc21iZnMvc21iX2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM0OTcyYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3NtYmZzL3NtYl9kZWJ1Zy5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBEZWZpbmVzIHNvbWUgZGVidWcgbWFjcm9zIGZvciBzbWJmcy4KKyAqLworCisvKiBUaGlzIG1ha2VzIGEgZGVudHJ5IHBhcmVudC9jaGlsZCBuYW1lIHBhaXIuIFVzZWZ1bCBmb3IgZGVidWdnaW5nIHByaW50aydzICovCisjZGVmaW5lIERFTlRSWV9QQVRIKGRlbnRyeSkgXAorCShkZW50cnkpLT5kX3BhcmVudC0+ZF9uYW1lLm5hbWUsKGRlbnRyeSktPmRfbmFtZS5uYW1lCisKKy8qCisgKiBzYWZldHkgY2hlY2tzIHRoYXQgc2hvdWxkIG5ldmVyIGhhcHBlbiA/Pz8KKyAqIHRoZXNlIGFyZSBub3JtYWxseSBlbmFibGVkLgorICovCisjaWZkZWYgU01CRlNfUEFSQU5PSUEKKyMgZGVmaW5lIFBBUkFOT0lBKGYsIGEuLi4pIHByaW50ayhLRVJOX05PVElDRSAiJXM6ICIgZiwgX19GVU5DVElPTl9fICwgIyMgYSkKKyNlbHNlCisjIGRlZmluZSBQQVJBTk9JQShmLCBhLi4uKSBkbyB7IDsgfSB3aGlsZSgwKQorI2VuZGlmCisKKy8qIGxvdHMgb2YgZGVidWcgbWVzc2FnZXMgKi8KKyNpZmRlZiBTTUJGU19ERUJVR19WRVJCT1NFCisjIGRlZmluZSBWRVJCT1NFKGYsIGEuLi4pIHByaW50ayhLRVJOX0RFQlVHICIlczogIiBmLCBfX0ZVTkNUSU9OX18gLCAjIyBhKQorI2Vsc2UKKyMgZGVmaW5lIFZFUkJPU0UoZiwgYS4uLikgZG8geyA7IH0gd2hpbGUoMCkKKyNlbmRpZgorCisvKgorICogIm5vcm1hbCIgZGVidWcgbWVzc2FnZXMsIGJ1dCBub3Qgd2l0aCBhIG5vcm1hbCBERUJVRyBkZWZpbmUgLi4uIHdheQorICogdG9vIGNvbW1vbiBuYW1lLgorICovCisjaWZkZWYgU01CRlNfREVCVUcKKyNkZWZpbmUgREVCVUcxKGYsIGEuLi4pIHByaW50ayhLRVJOX0RFQlVHICIlczogIiBmLCBfX0ZVTkNUSU9OX18gLCAjIyBhKQorI2Vsc2UKKyNkZWZpbmUgREVCVUcxKGYsIGEuLi4pIGRvIHsgOyB9IHdoaWxlKDApCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL3NtYmZzL3NtYmlvZC5jIGIvZnMvc21iZnMvc21iaW9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgxYTk3YQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3NtYmZzL3NtYmlvZC5jCkBAIC0wLDAgKzEsMzQxIEBACisvKgorICogIHNtYmlvZC5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMCwgQ2hhcmxlcyBMb2VwIC8gQ29yZWwgQ29ycC4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDEsIFVyYmFuIFdpZG1hcmsKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NtYl9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtYm5vLmg+CisjaW5jbHVkZSA8bGludXgvc21iX21vdW50Lmg+CisKKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgInNtYl9kZWJ1Zy5oIgorI2luY2x1ZGUgInJlcXVlc3QuaCIKKyNpbmNsdWRlICJwcm90by5oIgorCitlbnVtIHNtYmlvZF9zdGF0ZSB7CisJU01CSU9EX0RFQUQsCisJU01CSU9EX1NUQVJUSU5HLAorCVNNQklPRF9SVU5OSU5HLAorfTsKKworc3RhdGljIGVudW0gc21iaW9kX3N0YXRlIHNtYmlvZF9zdGF0ZSA9IFNNQklPRF9ERUFEOworc3RhdGljIHBpZF90IHNtYmlvZF9waWQ7CitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoc21iaW9kX3dhaXQpOworc3RhdGljIExJU1RfSEVBRChzbWJfc2VydmVycyk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNlcnZlcnNfbG9jayk7CisKKyNkZWZpbmUgU01CSU9EX0RBVEFfUkVBRFkJKDE8PDApCitzdGF0aWMgbG9uZyBzbWJpb2RfZmxhZ3M7CisKK3N0YXRpYyBpbnQgc21iaW9kKHZvaWQgKik7CitzdGF0aWMgaW50IHNtYmlvZF9zdGFydCh2b2lkKTsKKworLyoKKyAqIGNhbGxlZCB3aGVuIHRoZXJlJ3Mgd29yayBmb3IgdXMgdG8gZG8KKyAqLwordm9pZCBzbWJpb2Rfd2FrZV91cCh2b2lkKQoreworCWlmIChzbWJpb2Rfc3RhdGUgPT0gU01CSU9EX0RFQUQpCisJCXJldHVybjsKKwlzZXRfYml0KFNNQklPRF9EQVRBX1JFQURZLCAmc21iaW9kX2ZsYWdzKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnNtYmlvZF93YWl0KTsKK30KKworLyoKKyAqIHN0YXJ0IHNtYmlvZCBpZiBub25lIGlzIHJ1bm5pbmcKKyAqLworc3RhdGljIGludCBzbWJpb2Rfc3RhcnQodm9pZCkKK3sKKwlwaWRfdCBwaWQ7CisJaWYgKHNtYmlvZF9zdGF0ZSAhPSBTTUJJT0RfREVBRCkKKwkJcmV0dXJuIDA7CisJc21iaW9kX3N0YXRlID0gU01CSU9EX1NUQVJUSU5HOworCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisJc3Bpbl91bmxvY2soJnNlcnZlcnNfbG9jayk7CisJcGlkID0ga2VybmVsX3RocmVhZChzbWJpb2QsIE5VTEwsIDApOworCWlmIChwaWQgPCAwKQorCQltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKKworCXNwaW5fbG9jaygmc2VydmVyc19sb2NrKTsKKwlzbWJpb2Rfc3RhdGUgPSBwaWQgPCAwID8gU01CSU9EX0RFQUQgOiBTTUJJT0RfUlVOTklORzsKKwlzbWJpb2RfcGlkID0gcGlkOworCXJldHVybiBwaWQ7Cit9CisKKy8qCisgKiByZWdpc3RlciBhIHNlcnZlciAmIHN0YXJ0IHNtYmlvZCBpZiBuZWNlc3NhcnkKKyAqLworaW50IHNtYmlvZF9yZWdpc3Rlcl9zZXJ2ZXIoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIpCit7CisJaW50IHJldDsKKwlzcGluX2xvY2soJnNlcnZlcnNfbG9jayk7CisJbGlzdF9hZGQoJnNlcnZlci0+ZW50cnksICZzbWJfc2VydmVycyk7CisJVkVSQk9TRSgiJXBcbiIsIHNlcnZlcik7CisJcmV0ID0gc21iaW9kX3N0YXJ0KCk7CisJc3Bpbl91bmxvY2soJnNlcnZlcnNfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFVucmVnaXN0ZXIgYSBzZXJ2ZXIKKyAqIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIHNlcnZlciBsb2NrIGhlbGQuCisgKi8KK3ZvaWQgc21iaW9kX3VucmVnaXN0ZXJfc2VydmVyKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyKQoreworCXNwaW5fbG9jaygmc2VydmVyc19sb2NrKTsKKwlsaXN0X2RlbF9pbml0KCZzZXJ2ZXItPmVudHJ5KTsKKwlWRVJCT1NFKCIlcFxuIiwgc2VydmVyKTsKKwlzcGluX3VubG9jaygmc2VydmVyc19sb2NrKTsKKworCXNtYmlvZF93YWtlX3VwKCk7CisJc21iaW9kX2ZsdXNoKHNlcnZlcik7Cit9CisKK3ZvaWQgc21iaW9kX2ZsdXNoKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnRtcCwgKm47CisJc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXE7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUodG1wLCBuLCAmc2VydmVyLT54bWl0cSkgeworCQlyZXEgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IHNtYl9yZXF1ZXN0LCBycV9xdWV1ZSk7CisJCXJlcS0+cnFfZXJybm8gPSAtRUlPOworCQlsaXN0X2RlbF9pbml0KCZyZXEtPnJxX3F1ZXVlKTsKKwkJc21iX3JwdXQocmVxKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZyZXEtPnJxX3dhaXQpOworCX0KKwlsaXN0X2Zvcl9lYWNoX3NhZmUodG1wLCBuLCAmc2VydmVyLT5yZWN2cSkgeworCQlyZXEgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IHNtYl9yZXF1ZXN0LCBycV9xdWV1ZSk7CisJCXJlcS0+cnFfZXJybm8gPSAtRUlPOworCQlsaXN0X2RlbF9pbml0KCZyZXEtPnJxX3F1ZXVlKTsKKwkJc21iX3JwdXQocmVxKTsKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZyZXEtPnJxX3dhaXQpOworCX0KK30KKworLyoKKyAqIFdha2UgdXAgc21ibW91bnQgYW5kIG1ha2UgaXQgcmVjb25uZWN0IHRvIHRoZSBzZXJ2ZXIuCisgKiBUaGlzIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIHNlcnZlciBsb2NrZWQuCisgKgorICogRklYTUU6IGFkZCBzbWJjb25uZWN0IHZlcnNpb24gdG8gdGhpcworICovCitpbnQgc21iaW9kX3JldHJ5KHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7CisJc3RydWN0IHNtYl9yZXF1ZXN0ICpyZXE7CisJcGlkX3QgcGlkID0gc2VydmVyLT5jb25uX3BpZDsKKwlpbnQgcmVzdWx0ID0gMDsKKworCVZFUkJPU0UoInN0YXRlOiAlZFxuIiwgc2VydmVyLT5zdGF0ZSk7CisJaWYgKHNlcnZlci0+c3RhdGUgPT0gQ09OTl9WQUxJRCB8fCBzZXJ2ZXItPnN0YXRlID09IENPTk5fUkVUUllJTkcpCisJCWdvdG8gb3V0OworCisJc21iX2ludmFsaWRhdGVfaW5vZGVzKHNlcnZlcik7CisKKwkvKgorCSAqIFNvbWUgcmVxdWVzdHMgYXJlIG1lYW5pbmdsZXNzIGFmdGVyIGEgcmV0cnksIHNvIHdlIGFib3J0IHRoZW0uCisJICogT25lIGV4YW1wbGUgYXJlIGFsbCByZXF1ZXN0cyB1c2luZyAnZmlsZWlkJyBzaW5jZSB0aGUgZmlsZXMgYXJlCisJICogY2xvc2VkIG9uIHJldHJ5LgorCSAqLworCWhlYWQgPSBzZXJ2ZXItPnhtaXRxLm5leHQ7CisJd2hpbGUgKGhlYWQgIT0gJnNlcnZlci0+eG1pdHEpIHsKKwkJcmVxID0gbGlzdF9lbnRyeShoZWFkLCBzdHJ1Y3Qgc21iX3JlcXVlc3QsIHJxX3F1ZXVlKTsKKwkJaGVhZCA9IGhlYWQtPm5leHQ7CisKKwkJcmVxLT5ycV9ieXRlc19zZW50ID0gMDsKKwkJaWYgKHJlcS0+cnFfZmxhZ3MgJiBTTUJfUkVRX05PUkVUUlkpIHsKKwkJCVZFUkJPU0UoImFib3J0aW5nIHJlcXVlc3QgJXAgb24geG1pdHFcbiIsIHJlcSk7CisJCQlyZXEtPnJxX2Vycm5vID0gLUVJTzsKKwkJCWxpc3RfZGVsX2luaXQoJnJlcS0+cnFfcXVldWUpOworCQkJc21iX3JwdXQocmVxKTsKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcmVxLT5ycV93YWl0KTsKKwkJfQorCX0KKworCS8qCisJICogRklYTUU6IHRlc3QgdGhlIGNvZGUgZm9yIHJldHJ5aW5nIHJlcXVlc3Qgd2UgYWxyZWFkeSBzZW50CisJICovCisJaGVhZCA9IHNlcnZlci0+cmVjdnEubmV4dDsKKwl3aGlsZSAoaGVhZCAhPSAmc2VydmVyLT5yZWN2cSkgeworCQlyZXEgPSBsaXN0X2VudHJ5KGhlYWQsIHN0cnVjdCBzbWJfcmVxdWVzdCwgcnFfcXVldWUpOworCQloZWFkID0gaGVhZC0+bmV4dDsKKyNpZiAwCisJCWlmIChyZXEtPnJxX2ZsYWdzICYgU01CX1JFUV9SRVRSWSkgeworCQkJLyogbXVzdCBtb3ZlIHRoZSByZXF1ZXN0IHRvIHRoZSB4bWl0cSAqLworCQkJVkVSQk9TRSgicmV0cnlpbmcgcmVxdWVzdCAlcCBvbiByZWN2cVxuIiwgcmVxKTsKKwkJCWxpc3RfZGVsKCZyZXEtPnJxX3F1ZXVlKTsKKwkJCWxpc3RfYWRkKCZyZXEtPnJxX3F1ZXVlLCAmc2VydmVyLT54bWl0cSk7CisJCQljb250aW51ZTsKKwkJfQorI2VuZGlmCisKKwkJVkVSQk9TRSgiYWJvcnRpbmcgcmVxdWVzdCAlcCBvbiByZWN2cVxuIiwgcmVxKTsKKwkJLyogcmVxLT5ycV9yY2xzID0gPz8/OyAqLyAvKiBGSVhNRTogc2V0IHNtYiBlcnJvciBjb2RlIHRvbz8gKi8KKwkJcmVxLT5ycV9lcnJubyA9IC1FSU87CisJCWxpc3RfZGVsX2luaXQoJnJlcS0+cnFfcXVldWUpOworCQlzbWJfcnB1dChyZXEpOworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnJlcS0+cnFfd2FpdCk7CisJfQorCisJc21iX2Nsb3NlX3NvY2tldChzZXJ2ZXIpOworCisJaWYgKHBpZCA9PSAwKSB7CisJCS8qIEZJWE1FOiB0aGlzIGlzIGZhdGFsLCB1bW91bnQ/ICovCisJCXByaW50ayhLRVJOX0VSUiAic21iX3JldHJ5OiBubyBjb25uZWN0aW9uIHByb2Nlc3NcbiIpOworCQlzZXJ2ZXItPnN0YXRlID0gQ09OTl9SRVRSSUVEOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIENoYW5nZSBzdGF0ZSBzbyB0aGF0IG9ubHkgb25lIHJldHJ5IHBlciBzZXJ2ZXIgd2lsbCBiZSBzdGFydGVkLgorCSAqLworCXNlcnZlci0+c3RhdGUgPSBDT05OX1JFVFJZSU5HOworCisJLyoKKwkgKiBOb3RlOiB1c2UgdGhlICJwcml2IiBmbGFnLCBhcyBhIHVzZXIgcHJvY2VzcyBtYXkgbmVlZCB0byByZWNvbm5lY3QuCisJICovCisJcmVzdWx0ID0ga2lsbF9wcm9jKHBpZCwgU0lHVVNSMSwgMSk7CisJaWYgKHJlc3VsdCkgeworCQkvKiBGSVhNRTogdGhpcyBpcyBtb3N0IGxpa2VseSBmYXRhbCwgdW1vdW50PyAqLworCQlwcmludGsoS0VSTl9FUlIgInNtYl9yZXRyeTogc2lnbmFsIGZhaWxlZCBbJWRdXG4iLCByZXN1bHQpOworCQlnb3RvIG91dDsKKwl9CisJVkVSQk9TRSgic2lnbmFsbGVkIHBpZCAlZFxuIiwgcGlkKTsKKworCS8qIEZJWE1FOiBUaGUgcmV0cmllZCByZXF1ZXN0cyBzaG91bGQgcGVyaGFwcyBnZXQgYSAidGltZSBib29zdCIuICovCisKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogQ3VycmVudGx5IGhhbmRsZXMgbG9ja2luZ1ggcGFja2V0cy4KKyAqLworc3RhdGljIHZvaWQgc21iaW9kX2hhbmRsZV9yZXF1ZXN0KHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyKQoreworCVBBUkFOT0lBKCJzbWJpb2QgZ290IGEgcmVxdWVzdCAuLi4gYW5kIHdlIGRvbid0IGltcGxlbWVudCBvcGxvY2tzIVxuIik7CisJc2VydmVyLT5yc3RhdGUgPSBTTUJfUkVDVl9EUk9QOworfQorCisvKgorICogRG8gc29tZSBJTyBmb3Igb25lIHNlcnZlci4KKyAqLworc3RhdGljIHZvaWQgc21iaW9kX2RvaW8oc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIpCit7CisJaW50IHJlc3VsdDsKKwlpbnQgbWF4d29yayA9IDc7CisKKwlpZiAoc2VydmVyLT5zdGF0ZSAhPSBDT05OX1ZBTElEKQorCQlnb3RvIG91dDsKKworCWRvIHsKKwkJcmVzdWx0ID0gc21iX3JlcXVlc3RfcmVjdihzZXJ2ZXIpOworCQlpZiAocmVzdWx0IDwgMCkgeworCQkJc2VydmVyLT5zdGF0ZSA9IENPTk5fSU5WQUxJRDsKKwkJCXNtYmlvZF9yZXRyeShzZXJ2ZXIpOworCQkJZ290byBvdXQ7CS8qIHJlY29ubmVjdGluZyBpcyBzbG93ICovCisJCX0gZWxzZSBpZiAoc2VydmVyLT5yc3RhdGUgPT0gU01CX1JFQ1ZfUkVRVUVTVCkKKwkJCXNtYmlvZF9oYW5kbGVfcmVxdWVzdChzZXJ2ZXIpOworCX0gd2hpbGUgKHJlc3VsdCA+IDAgJiYgbWF4d29yay0tID4gMCk7CisKKwkvKgorCSAqIElmIHRoZXJlIGlzIG1vcmUgdG8gcmVhZCB0aGVuIHdlIHdhbnQgdG8gYmUgc3VyZSB0byB3YWtlIHVwIGFnYWluLgorCSAqLworCWlmIChzZXJ2ZXItPnN0YXRlICE9IENPTk5fVkFMSUQpCisJCWdvdG8gb3V0OworCWlmIChzbWJfcmVjdl9hdmFpbGFibGUoc2VydmVyKSA+IDApCisJCXNldF9iaXQoU01CSU9EX0RBVEFfUkVBRFksICZzbWJpb2RfZmxhZ3MpOworCisJZG8geworCQlyZXN1bHQgPSBzbWJfcmVxdWVzdF9zZW5kX3NlcnZlcihzZXJ2ZXIpOworCQlpZiAocmVzdWx0IDwgMCkgeworCQkJc2VydmVyLT5zdGF0ZSA9IENPTk5fSU5WQUxJRDsKKwkJCXNtYmlvZF9yZXRyeShzZXJ2ZXIpOworCQkJZ290byBvdXQ7CS8qIHJlY29ubmVjdGluZyBpcyBzbG93ICovCisJCX0KKwl9IHdoaWxlIChyZXN1bHQgPiAwKTsKKworCS8qCisJICogSWYgdGhlIGxhc3QgcmVxdWVzdCB3YXMgbm90IHNlbnQgb3V0IHdlIHdhbnQgdG8gd2FrZSB1cCBhZ2Fpbi4KKwkgKi8KKwlpZiAoIWxpc3RfZW1wdHkoJnNlcnZlci0+eG1pdHEpKQorCQlzZXRfYml0KFNNQklPRF9EQVRBX1JFQURZLCAmc21iaW9kX2ZsYWdzKTsKKworb3V0OgorCXJldHVybjsKK30KKworLyoKKyAqIHNtYmlvZCBrZXJuZWwgdGhyZWFkCisgKi8KK3N0YXRpYyBpbnQgc21iaW9kKHZvaWQgKnVudXNlZCkKK3sKKwlkYWVtb25pemUoInNtYmlvZCIpOworCisJYWxsb3dfc2lnbmFsKFNJR0tJTEwpOworCisJVkVSQk9TRSgiU01CIEtlcm5lbCB0aHJlYWQgc3RhcnRpbmcgKCVkKSAuLi5cbiIsIGN1cnJlbnQtPnBpZCk7CisKKwlmb3IgKDs7KSB7CisJCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyOworCQlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MsICpuOworCisJCS8qIEZJWE1FOiBVc2UgcG9sbD8gKi8KKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHNtYmlvZF93YWl0LAorCQkJIHRlc3RfYml0KFNNQklPRF9EQVRBX1JFQURZLCAmc21iaW9kX2ZsYWdzKSk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJc3Bpbl9sb2NrKCZzZXJ2ZXJzX2xvY2spOworCQkJc21iaW9kX3N0YXRlID0gU01CSU9EX0RFQUQ7CisJCQlzcGluX3VubG9jaygmc2VydmVyc19sb2NrKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2xlYXJfYml0KFNNQklPRF9EQVRBX1JFQURZLCAmc21iaW9kX2ZsYWdzKTsKKworCQlzcGluX2xvY2soJnNlcnZlcnNfbG9jayk7CisJCWlmIChsaXN0X2VtcHR5KCZzbWJfc2VydmVycykpIHsKKwkJCXNtYmlvZF9zdGF0ZSA9IFNNQklPRF9ERUFEOworCQkJc3Bpbl91bmxvY2soJnNlcnZlcnNfbG9jayk7CisJCQlicmVhazsKKwkJfQorCisJCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIG4sICZzbWJfc2VydmVycykgeworCQkJc2VydmVyID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBzbWJfc2JfaW5mbywgZW50cnkpOworCQkJVkVSQk9TRSgiY2hlY2tpbmcgc2VydmVyICVwXG4iLCBzZXJ2ZXIpOworCisJCQlpZiAoc2VydmVyLT5zdGF0ZSA9PSBDT05OX1ZBTElEKSB7CisJCQkJc3Bpbl91bmxvY2soJnNlcnZlcnNfbG9jayk7CisKKwkJCQlzbWJfbG9ja19zZXJ2ZXIoc2VydmVyKTsKKwkJCQlzbWJpb2RfZG9pbyhzZXJ2ZXIpOworCQkJCXNtYl91bmxvY2tfc2VydmVyKHNlcnZlcik7CisKKwkJCQlzcGluX2xvY2soJnNlcnZlcnNfbG9jayk7CisJCQl9CisJCX0KKwkJc3Bpbl91bmxvY2soJnNlcnZlcnNfbG9jayk7CisJfQorCisJVkVSQk9TRSgiU01CIEtlcm5lbCB0aHJlYWQgZXhpdGluZyAoJWQpIC4uLlxuIiwgY3VycmVudC0+cGlkKTsKKwltb2R1bGVfcHV0X2FuZF9leGl0KDApOworfQpkaWZmIC0tZ2l0IGEvZnMvc21iZnMvc29jay5jIGIvZnMvc21iZnMvc29jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZjNjZDIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9zbWJmcy9zb2NrLmMKQEAgLTAsMCArMSwzODggQEAKKy8qCisgKiAgc29jay5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBieSBQYWFsLUtyLiBFbmdzdGFkIGFuZCBWb2xrZXIgTGVuZGVja2UKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTcgYnkgVm9sa2VyIExlbmRlY2tlCisgKgorICogIFBsZWFzZSBhZGQgYSBub3RlIGFib3V0IHlvdXIgY2hhbmdlcyB0byBzbWJmcyBpbiB0aGUgQ2hhbmdlTG9nIGZpbGUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bmV0L3NjbS5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorCisjaW5jbHVkZSA8bGludXgvc21iX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc21iLmg+CisjaW5jbHVkZSA8bGludXgvc21ibm8uaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgorCisjaW5jbHVkZSAic21iX2RlYnVnLmgiCisjaW5jbHVkZSAicHJvdG8uaCIKKyNpbmNsdWRlICJyZXF1ZXN0LmgiCisKKworc3RhdGljIGludAorX3JlY3Zmcm9tKHN0cnVjdCBzb2NrZXQgKnNvY2tldCwgdW5zaWduZWQgY2hhciAqdWJ1ZiwgaW50IHNpemUsIHVuc2lnbmVkIGZsYWdzKQoreworCXN0cnVjdCBrdmVjIGlvdiA9IHt1YnVmLCBzaXplfTsKKwlzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsubXNnX2ZsYWdzID0gZmxhZ3N9OworCW1zZy5tc2dfZmxhZ3MgfD0gTVNHX0RPTlRXQUlUIHwgTVNHX05PU0lHTkFMOworCXJldHVybiBrZXJuZWxfcmVjdm1zZyhzb2NrZXQsICZtc2csICZpb3YsIDEsIHNpemUsIG1zZy5tc2dfZmxhZ3MpOworfQorCisvKgorICogUmV0dXJuIHRoZSBzZXJ2ZXIgdGhpcyBzb2NrZXQgYmVsb25ncyB0bworICovCitzdGF0aWMgc3RydWN0IHNtYl9zYl9pbmZvICoKK3NlcnZlcl9mcm9tX3NvY2tldChzdHJ1Y3Qgc29ja2V0ICpzb2NrZXQpCit7CisJcmV0dXJuIHNvY2tldC0+c2stPnNrX3VzZXJfZGF0YTsKK30KKworLyoKKyAqIENhbGxlZCB3aGVuIHRoZXJlIGlzIGRhdGEgb24gdGhlIHNvY2tldC4KKyAqLwordm9pZAorc21iX2RhdGFfcmVhZHkoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGVuKQoreworCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyID0gc2VydmVyX2Zyb21fc29ja2V0KHNrLT5za19zb2NrZXQpOworCXZvaWQgKCpkYXRhX3JlYWR5KShzdHJ1Y3Qgc29jayAqLCBpbnQpID0gc2VydmVyLT5kYXRhX3JlYWR5OworCisJZGF0YV9yZWFkeShzaywgbGVuKTsKKwlWRVJCT1NFKCIoJXAsICVkKVxuIiwgc2ssIGxlbik7CisJc21iaW9kX3dha2VfdXAoKTsKK30KKworaW50CitzbWJfdmFsaWRfc29ja2V0KHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCXJldHVybiAoaW5vZGUgJiYgU19JU1NPQ0soaW5vZGUtPmlfbW9kZSkgJiYgCisJCVNPQ0tFVF9JKGlub2RlKS0+dHlwZSA9PSBTT0NLX1NUUkVBTSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc29ja2V0ICoKK3NlcnZlcl9zb2NrKHN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyKQoreworCXN0cnVjdCBmaWxlICpmaWxlOworCisJaWYgKHNlcnZlciAmJiAoZmlsZSA9IHNlcnZlci0+c29ja19maWxlKSkKKwl7CisjaWZkZWYgU01CRlNfUEFSQU5PSUEKKwkJaWYgKCFzbWJfdmFsaWRfc29ja2V0KGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKSkKKwkJCVBBUkFOT0lBKCJiYWQgc29ja2V0IVxuIik7CisjZW5kaWYKKwkJcmV0dXJuIFNPQ0tFVF9JKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQKK3NtYl9jbG9zZV9zb2NrZXQoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIpCit7CisJc3RydWN0IGZpbGUgKiBmaWxlID0gc2VydmVyLT5zb2NrX2ZpbGU7CisKKwlpZiAoZmlsZSkgeworCQlzdHJ1Y3Qgc29ja2V0ICpzb2NrID0gc2VydmVyX3NvY2soc2VydmVyKTsKKworCQlWRVJCT1NFKCJjbG9zaW5nIHNvY2tldCAlcFxuIiwgc29jayk7CisJCXNvY2stPnNrLT5za19kYXRhX3JlYWR5ID0gc2VydmVyLT5kYXRhX3JlYWR5OworCQlzZXJ2ZXItPnNvY2tfZmlsZSA9IE5VTEw7CisJCWZwdXQoZmlsZSk7CisJfQorfQorCitzdGF0aWMgaW50CitzbWJfZ2V0X2xlbmd0aChzdHJ1Y3Qgc29ja2V0ICpzb2NrZXQsIHVuc2lnbmVkIGNoYXIgKmhlYWRlcikKK3sKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gX3JlY3Zmcm9tKHNvY2tldCwgaGVhZGVyLCA0LCBNU0dfUEVFSyk7CisJaWYgKHJlc3VsdCA9PSAtRUFHQUlOKQorCQlyZXR1cm4gLUVOT0RBVEE7CisJaWYgKHJlc3VsdCA8IDApIHsKKwkJUEFSQU5PSUEoInJlY3YgZXJyb3IgPSAlZFxuIiwgLXJlc3VsdCk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCWlmIChyZXN1bHQgPCA0KQorCQlyZXR1cm4gLUVOT0RBVEE7CisKKwlzd2l0Y2ggKGhlYWRlclswXSkgeworCWNhc2UgMHgwMDoKKwljYXNlIDB4ODI6CisJCWJyZWFrOworCisJY2FzZSAweDg1OgorCQlERUJVRzEoIkdvdCBTRVNTSU9OIEtFRVAgQUxJVkVcbiIpOworCQlfcmVjdmZyb20oc29ja2V0LCBoZWFkZXIsIDQsIDApOwkvKiByZWFkIGF3YXkgKi8KKwkJcmV0dXJuIC1FTk9EQVRBOworCisJZGVmYXVsdDoKKwkJUEFSQU5PSUEoIkludmFsaWQgTkJUIHBhY2tldCwgY29kZT0leFxuIiwgaGVhZGVyWzBdKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogVGhlIGxlbmd0aCBpbiB0aGUgUkZDIE5CIGhlYWRlciBpcyB0aGUgcmF3IGRhdGEgbGVuZ3RoICovCisJcmV0dXJuIHNtYl9sZW4oaGVhZGVyKTsKK30KKworaW50CitzbWJfcmVjdl9hdmFpbGFibGUoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIpCit7CisJbW1fc2VnbWVudF90IG9sZGZzOworCWludCBhdmFpbCwgZXJyOworCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBzZXJ2ZXJfc29jayhzZXJ2ZXIpOworCisJb2xkZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoZ2V0X2RzKCkpOworCWVyciA9IHNvY2stPm9wcy0+aW9jdGwoc29jaywgU0lPQ0lOUSwgKHVuc2lnbmVkIGxvbmcpICZhdmFpbCk7CisJc2V0X2ZzKG9sZGZzKTsKKwlyZXR1cm4gKGVyciA+PSAwKSA/IGF2YWlsIDogZXJyOworfQorCisvKgorICogQWRqdXN0IHRoZSBrdmVjIHRvIG1vdmUgb24gJ24nIGJ5dGVzIChmcm9tIG5mcy9zdW5ycGMpCisgKi8KK3N0YXRpYyBpbnQKK3NtYl9tb3ZlX2lvdihzdHJ1Y3Qga3ZlYyAqKmRhdGEsIHNpemVfdCAqbnVtLCBzdHJ1Y3Qga3ZlYyAqdmVjLCB1bnNpZ25lZCBhbW91bnQpCit7CisJc3RydWN0IGt2ZWMgKml2ID0gKmRhdGE7CisJaW50IGk7CisJaW50IGxlbjsKKworCS8qCisJICoJRWF0IGFueSBzZW50IGt2ZWNzCisJICovCisJd2hpbGUgKGl2LT5pb3ZfbGVuIDw9IGFtb3VudCkgeworCQlhbW91bnQgLT0gaXYtPmlvdl9sZW47CisJCWl2Kys7CisJCSgqbnVtKS0tOworCX0KKworCS8qCisJICoJQW5kIGNoZXcgZG93biB0aGUgcGFydGlhbCBvbmUKKwkgKi8KKwl2ZWNbMF0uaW92X2xlbiA9IGl2LT5pb3ZfbGVuLWFtb3VudDsKKwl2ZWNbMF0uaW92X2Jhc2UgPSgodW5zaWduZWQgY2hhciAqKWl2LT5pb3ZfYmFzZSkrYW1vdW50OworCWl2Kys7CisKKwlsZW4gPSB2ZWNbMF0uaW92X2xlbjsKKworCS8qCisJICoJQW5kIGNvcHkgYW55IG90aGVycworCSAqLworCWZvciAoaSA9IDE7IGkgPCAqbnVtOyBpKyspIHsKKwkJdmVjW2ldID0gKml2Kys7CisJCWxlbiArPSB2ZWNbaV0uaW92X2xlbjsKKwl9CisKKwkqZGF0YSA9IHZlYzsKKwlyZXR1cm4gbGVuOworfQorCisvKgorICogc21iX3JlY2VpdmVfaGVhZGVyCisgKiBPbmx5IGNhbGxlZCBieSB0aGUgc21iaW9kIHRocmVhZC4KKyAqLworaW50CitzbWJfcmVjZWl2ZV9oZWFkZXIoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIpCit7CisJc3RydWN0IHNvY2tldCAqc29jazsKKwlpbnQgcmVzdWx0ID0gMDsKKwl1bnNpZ25lZCBjaGFyIHBlZWtfYnVmWzRdOworCisJcmVzdWx0ID0gLUVJTzsgCisJc29jayA9IHNlcnZlcl9zb2NrKHNlcnZlcik7CisJaWYgKCFzb2NrKQorCQlnb3RvIG91dDsKKwlpZiAoc29jay0+c2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCkKKwkJZ290byBvdXQ7CisKKwlpZiAoIXNlcnZlci0+c21iX3JlYWQpIHsKKwkJcmVzdWx0ID0gc21iX2dldF9sZW5ndGgoc29jaywgcGVla19idWYpOworCQlpZiAocmVzdWx0IDwgMCkgeworCQkJaWYgKHJlc3VsdCA9PSAtRU5PREFUQSkKKwkJCQlyZXN1bHQgPSAwOworCQkJZ290byBvdXQ7CisJCX0KKwkJc2VydmVyLT5zbWJfbGVuID0gcmVzdWx0ICsgNDsKKworCQlpZiAoc2VydmVyLT5zbWJfbGVuIDwgU01CX0hFQURFUl9MRU4pIHsKKwkJCVBBUkFOT0lBKCJzaG9ydCBwYWNrZXQ6ICVkXG4iLCByZXN1bHQpOworCQkJc2VydmVyLT5yc3RhdGUgPSBTTUJfUkVDVl9EUk9QOworCQkJcmVzdWx0ID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChzZXJ2ZXItPnNtYl9sZW4gPiBTTUJfTUFYX1BBQ0tFVF9TSVpFKSB7CisJCQlQQVJBTk9JQSgibG9uZyBwYWNrZXQ6ICVkXG4iLCByZXN1bHQpOworCQkJc2VydmVyLT5yc3RhdGUgPSBTTUJfUkVDVl9EUk9QOworCQkJcmVzdWx0ID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJcmVzdWx0ID0gX3JlY3Zmcm9tKHNvY2ssIHNlcnZlci0+aGVhZGVyICsgc2VydmVyLT5zbWJfcmVhZCwKKwkJCSAgIFNNQl9IRUFERVJfTEVOIC0gc2VydmVyLT5zbWJfcmVhZCwgMCk7CisJVkVSQk9TRSgiX3JlY3Zmcm9tOiAlZFxuIiwgcmVzdWx0KTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlWRVJCT1NFKCJyZWNlaXZlIGVycm9yOiAlZFxuIiwgcmVzdWx0KTsKKwkJZ290byBvdXQ7CisJfQorCXNlcnZlci0+c21iX3JlYWQgKz0gcmVzdWx0OworCisJaWYgKHNlcnZlci0+c21iX3JlYWQgPT0gU01CX0hFQURFUl9MRU4pCisJCXNlcnZlci0+cnN0YXRlID0gU01CX1JFQ1ZfSENPTVBMRVRFOworb3V0OgorCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBjaGFyIGRyb3BfYnVmZmVyW1BBR0VfU0laRV07CisKKy8qCisgKiBzbWJfcmVjZWl2ZV9kcm9wIC0gcmVhZCBhbmQgdGhyb3cgYXdheSB0aGUgZGF0YQorICogT25seSBjYWxsZWQgYnkgdGhlIHNtYmlvZCB0aHJlYWQuCisgKgorICogRklYTUU6IHdlIGFyZSBpbiB0aGUga2VybmVsLCBjb3VsZCB3ZSBqdXN0IHRlbGwgdGhlIHNvY2tldCB0aGF0IHdlIHdhbnQKKyAqIHRvIGRyb3Agc3R1ZmYgZnJvbSB0aGUgYnVmZmVyPworICovCitpbnQKK3NtYl9yZWNlaXZlX2Ryb3Aoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIpCit7CisJc3RydWN0IHNvY2tldCAqc29jazsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJc3RydWN0IGt2ZWMgaW92OworCXN0cnVjdCBtc2doZHIgbXNnOworCWludCBybGVuID0gc21iX2xlbihzZXJ2ZXItPmhlYWRlcikgLSBzZXJ2ZXItPnNtYl9yZWFkICsgNDsKKwlpbnQgcmVzdWx0ID0gLUVJTzsKKworCWlmIChybGVuID4gUEFHRV9TSVpFKQorCQlybGVuID0gUEFHRV9TSVpFOworCisJc29jayA9IHNlcnZlcl9zb2NrKHNlcnZlcik7CisJaWYgKCFzb2NrKQorCQlnb3RvIG91dDsKKwlpZiAoc29jay0+c2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCkKKwkJZ290byBvdXQ7CisKKwlmbGFncyA9IE1TR19ET05UV0FJVCB8IE1TR19OT1NJR05BTDsKKwlpb3YuaW92X2Jhc2UgPSBkcm9wX2J1ZmZlcjsKKwlpb3YuaW92X2xlbiA9IFBBR0VfU0laRTsKKwltc2cubXNnX2ZsYWdzID0gZmxhZ3M7CisJbXNnLm1zZ19uYW1lID0gTlVMTDsKKwltc2cubXNnX25hbWVsZW4gPSAwOworCW1zZy5tc2dfY29udHJvbCA9IE5VTEw7CisKKwlyZXN1bHQgPSBrZXJuZWxfcmVjdm1zZyhzb2NrLCAmbXNnLCAmaW92LCAxLCBybGVuLCBmbGFncyk7CisKKwlWRVJCT1NFKCJyZWFkOiAlZFxuIiwgcmVzdWx0KTsKKwlpZiAocmVzdWx0IDwgMCkgeworCQlWRVJCT1NFKCJyZWNlaXZlIGVycm9yOiAlZFxuIiwgcmVzdWx0KTsKKwkJZ290byBvdXQ7CisJfQorCXNlcnZlci0+c21iX3JlYWQgKz0gcmVzdWx0OworCisJaWYgKHNlcnZlci0+c21iX3JlYWQgPj0gc2VydmVyLT5zbWJfbGVuKQorCQlzZXJ2ZXItPnJzdGF0ZSA9IFNNQl9SRUNWX0VORDsKKworb3V0OgorCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBzbWJfcmVjZWl2ZQorICogT25seSBjYWxsZWQgYnkgdGhlIHNtYmlvZCB0aHJlYWQuCisgKi8KK2ludAorc21iX3JlY2VpdmUoc3RydWN0IHNtYl9zYl9pbmZvICpzZXJ2ZXIsIHN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBzb2NrZXQgKnNvY2s7CisJdW5zaWduZWQgaW50IGZsYWdzOworCXN0cnVjdCBrdmVjIGlvdls0XTsKKwlzdHJ1Y3Qga3ZlYyAqcCA9IHJlcS0+cnFfaW92OworCXNpemVfdCBudW0gPSByZXEtPnJxX2lvdmxlbjsKKwlzdHJ1Y3QgbXNnaGRyIG1zZzsKKwlpbnQgcmxlbjsKKwlpbnQgcmVzdWx0ID0gLUVJTzsKKworCXNvY2sgPSBzZXJ2ZXJfc29jayhzZXJ2ZXIpOworCWlmICghc29jaykKKwkJZ290byBvdXQ7CisJaWYgKHNvY2stPnNrLT5za19zdGF0ZSAhPSBUQ1BfRVNUQUJMSVNIRUQpCisJCWdvdG8gb3V0OworCisJZmxhZ3MgPSBNU0dfRE9OVFdBSVQgfCBNU0dfTk9TSUdOQUw7CisJbXNnLm1zZ19mbGFncyA9IGZsYWdzOworCW1zZy5tc2dfbmFtZSA9IE5VTEw7CisJbXNnLm1zZ19uYW1lbGVuID0gMDsKKwltc2cubXNnX2NvbnRyb2wgPSBOVUxMOworCisJLyogRG9udCByZXBlYXQgYnl0ZXMgYW5kIGNvdW50IGF2YWlsYWJsZSBidWZmZXJzcGFjZSAqLworCXJsZW4gPSBzbWJfbW92ZV9pb3YoJnAsICZudW0sIGlvdiwgcmVxLT5ycV9ieXRlc19yZWN2ZCk7CisJaWYgKHJlcS0+cnFfcmxlbiA8IHJsZW4pCisJCXJsZW4gPSByZXEtPnJxX3JsZW47CisKKwlyZXN1bHQgPSBrZXJuZWxfcmVjdm1zZyhzb2NrLCAmbXNnLCBwLCBudW0sIHJsZW4sIGZsYWdzKTsKKworCVZFUkJPU0UoInJlYWQ6ICVkXG4iLCByZXN1bHQpOworCWlmIChyZXN1bHQgPCAwKSB7CisJCVZFUkJPU0UoInJlY2VpdmUgZXJyb3I6ICVkXG4iLCByZXN1bHQpOworCQlnb3RvIG91dDsKKwl9CisJcmVxLT5ycV9ieXRlc19yZWN2ZCArPSByZXN1bHQ7CisJc2VydmVyLT5zbWJfcmVhZCArPSByZXN1bHQ7CisKK291dDoKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogVHJ5IHRvIHNlbmQgYSBTTUIgcmVxdWVzdC4gVGhpcyBtYXkgcmV0dXJuIGFmdGVyIHNlbmRpbmcgb25seSBwYXJ0cyBvZiB0aGUKKyAqIHJlcXVlc3QuIFNNQl9SRVFfVFJBTlNNSVRURUQgd2lsbCBiZSBzZXQgaWYgYSByZXF1ZXN0IHdhcyBmdWxseSBzZW50LgorICoKKyAqIFBhcnRzIG9mIHRoaXMgd2FzIHRha2VuIGZyb20geHBydF9zZW5kbXNnIGZyb20gbmV0L3N1bnJwYy94cHJ0LmMKKyAqLworaW50CitzbWJfc2VuZF9yZXF1ZXN0KHN0cnVjdCBzbWJfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBzbWJfc2JfaW5mbyAqc2VydmVyID0gcmVxLT5ycV9zZXJ2ZXI7CisJc3RydWN0IHNvY2tldCAqc29jazsKKwlzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsubXNnX2ZsYWdzID0gTVNHX05PU0lHTkFMIHwgTVNHX0RPTlRXQUlUfTsKKyAgICAgICAgaW50IHNsZW4gPSByZXEtPnJxX3NsZW4gLSByZXEtPnJxX2J5dGVzX3NlbnQ7CisJaW50IHJlc3VsdCA9IC1FSU87CisJc3RydWN0IGt2ZWMgaW92WzRdOworCXN0cnVjdCBrdmVjICpwID0gcmVxLT5ycV9pb3Y7CisJc2l6ZV90IG51bSA9IHJlcS0+cnFfaW92bGVuOworCisJc29jayA9IHNlcnZlcl9zb2NrKHNlcnZlcik7CisJaWYgKCFzb2NrKQorCQlnb3RvIG91dDsKKwlpZiAoc29jay0+c2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCkKKwkJZ290byBvdXQ7CisKKwkvKiBEb250IHJlcGVhdCBieXRlcyAqLworCWlmIChyZXEtPnJxX2J5dGVzX3NlbnQpCisJCXNtYl9tb3ZlX2lvdigmcCwgJm51bSwgaW92LCByZXEtPnJxX2J5dGVzX3NlbnQpOworCisJcmVzdWx0ID0ga2VybmVsX3NlbmRtc2coc29jaywgJm1zZywgcCwgbnVtLCBzbGVuKTsKKworCWlmIChyZXN1bHQgPj0gMCkgeworCQlyZXEtPnJxX2J5dGVzX3NlbnQgKz0gcmVzdWx0OworCQlpZiAocmVxLT5ycV9ieXRlc19zZW50ID49IHJlcS0+cnFfc2xlbikKKwkJCXJlcS0+cnFfZmxhZ3MgfD0gU01CX1JFUV9UUkFOU01JVFRFRDsKKwl9CitvdXQ6CisJcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2ZzL3NtYmZzL3N5bWxpbmsuYyBiL2ZzL3NtYmZzL3N5bWxpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjA2OWUwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvc21iZnMvc3ltbGluay5jCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiAgc3ltbGluay5jCisgKgorICogIENvcHlyaWdodCAoQykgMjAwMiBieSBKb2huIE5ld2JpZ2luCisgKgorICogIFBsZWFzZSBhZGQgYSBub3RlIGFib3V0IHlvdXIgY2hhbmdlcyB0byBzbWJmcyBpbiB0aGUgQ2hhbmdlTG9nIGZpbGUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zbWJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NtYl9mcy5oPgorCisjaW5jbHVkZSAic21iX2RlYnVnLmgiCisjaW5jbHVkZSAicHJvdG8uaCIKKworaW50IHNtYl9zeW1saW5rKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqb2xkbmFtZSkKK3sKKwlERUJVRzEoImNyZWF0ZSBzeW1saW5rICVzIC0+ICVzLyVzXG4iLCBvbGRuYW1lLCBERU5UUllfUEFUSChkZW50cnkpKTsKKworCXJldHVybiBzbWJfcHJvY19zeW1saW5rKHNlcnZlcl9mcm9tX2RlbnRyeShkZW50cnkpLCBkZW50cnksIG9sZG5hbWUpOworfQorCitzdGF0aWMgaW50IHNtYl9mb2xsb3dfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCWNoYXIgKmxpbmsgPSBfX2dldG5hbWUoKTsKKwlERUJVRzEoImZvbGxvd2xpbmsgb2YgJXMvJXNcbiIsIERFTlRSWV9QQVRIKGRlbnRyeSkpOworCisJaWYgKCFsaW5rKSB7CisJCWxpbmsgPSBFUlJfUFRSKC1FTk9NRU0pOworCX0gZWxzZSB7CisJCWludCBsZW4gPSBzbWJfcHJvY19yZWFkX2xpbmsoc2VydmVyX2Zyb21fZGVudHJ5KGRlbnRyeSksCisJCQkJCQlkZW50cnksIGxpbmssIFBBVEhfTUFYIC0gMSk7CisJCWlmIChsZW4gPCAwKSB7CisJCQlwdXRuYW1lKGxpbmspOworCQkJbGluayA9IEVSUl9QVFIobGVuKTsKKwkJfSBlbHNlIHsKKwkJCWxpbmtbbGVuXSA9IDA7CisJCX0KKwl9CisJbmRfc2V0X2xpbmsobmQsIGxpbmspOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzbWJfcHV0X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwljaGFyICpzID0gbmRfZ2V0X2xpbmsobmQpOworCWlmICghSVNfRVJSKHMpKQorCQlwdXRuYW1lKHMpOworfQorCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBzbWJfbGlua19pbm9kZV9vcGVyYXRpb25zID0KK3sKKwkucmVhZGxpbmsJPSBnZW5lcmljX3JlYWRsaW5rLAorCS5mb2xsb3dfbGluawk9IHNtYl9mb2xsb3dfbGluaywKKwkucHV0X2xpbmsJPSBzbWJfcHV0X2xpbmssCit9OwpkaWZmIC0tZ2l0IGEvZnMvc3RhdC5jIGIvZnMvc3RhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YTBlNTEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9zdGF0LmMKQEAgLTAsMCArMSw0MTAgQEAKKy8qCisgKiAgbGludXgvZnMvc3RhdC5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2h1aWQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisKK3ZvaWQgZ2VuZXJpY19maWxsYXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3Qga3N0YXQgKnN0YXQpCit7CisJc3RhdC0+ZGV2ID0gaW5vZGUtPmlfc2ItPnNfZGV2OworCXN0YXQtPmlubyA9IGlub2RlLT5pX2lubzsKKwlzdGF0LT5tb2RlID0gaW5vZGUtPmlfbW9kZTsKKwlzdGF0LT5ubGluayA9IGlub2RlLT5pX25saW5rOworCXN0YXQtPnVpZCA9IGlub2RlLT5pX3VpZDsKKwlzdGF0LT5naWQgPSBpbm9kZS0+aV9naWQ7CisJc3RhdC0+cmRldiA9IGlub2RlLT5pX3JkZXY7CisJc3RhdC0+YXRpbWUgPSBpbm9kZS0+aV9hdGltZTsKKwlzdGF0LT5tdGltZSA9IGlub2RlLT5pX210aW1lOworCXN0YXQtPmN0aW1lID0gaW5vZGUtPmlfY3RpbWU7CisJc3RhdC0+c2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKwlzdGF0LT5ibG9ja3MgPSBpbm9kZS0+aV9ibG9ja3M7CisJc3RhdC0+Ymxrc2l6ZSA9IGlub2RlLT5pX2Jsa3NpemU7Cit9CisKK0VYUE9SVF9TWU1CT0woZ2VuZXJpY19maWxsYXR0cik7CisKK2ludCB2ZnNfZ2V0YXR0cihzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXQgKnN0YXQpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gc2VjdXJpdHlfaW5vZGVfZ2V0YXR0cihtbnQsIGRlbnRyeSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWlmIChpbm9kZS0+aV9vcC0+Z2V0YXR0cikKKwkJcmV0dXJuIGlub2RlLT5pX29wLT5nZXRhdHRyKG1udCwgZGVudHJ5LCBzdGF0KTsKKworCWdlbmVyaWNfZmlsbGF0dHIoaW5vZGUsIHN0YXQpOworCWlmICghc3RhdC0+Ymxrc2l6ZSkgeworCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMgPSBpbm9kZS0+aV9zYjsKKwkJdW5zaWduZWQgYmxvY2tzOworCQlibG9ja3MgPSAoc3RhdC0+c2l6ZStzLT5zX2Jsb2Nrc2l6ZS0xKSA+PiBzLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCQlzdGF0LT5ibG9ja3MgPSAocy0+c19ibG9ja3NpemUgLyA1MTIpICogYmxvY2tzOworCQlzdGF0LT5ibGtzaXplID0gcy0+c19ibG9ja3NpemU7CisJfQorCXJldHVybiAwOworfQorCitFWFBPUlRfU1lNQk9MKHZmc19nZXRhdHRyKTsKKworaW50IHZmc19zdGF0KGNoYXIgX191c2VyICpuYW1lLCBzdHJ1Y3Qga3N0YXQgKnN0YXQpCit7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IHVzZXJfcGF0aF93YWxrKG5hbWUsICZuZCk7CisJaWYgKCFlcnJvcikgeworCQllcnJvciA9IHZmc19nZXRhdHRyKG5kLm1udCwgbmQuZGVudHJ5LCBzdGF0KTsKKwkJcGF0aF9yZWxlYXNlKCZuZCk7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworRVhQT1JUX1NZTUJPTCh2ZnNfc3RhdCk7CisKK2ludCB2ZnNfbHN0YXQoY2hhciBfX3VzZXIgKm5hbWUsIHN0cnVjdCBrc3RhdCAqc3RhdCkKK3sKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCWludCBlcnJvcjsKKworCWVycm9yID0gdXNlcl9wYXRoX3dhbGtfbGluayhuYW1lLCAmbmQpOworCWlmICghZXJyb3IpIHsKKwkJZXJyb3IgPSB2ZnNfZ2V0YXR0cihuZC5tbnQsIG5kLmRlbnRyeSwgc3RhdCk7CisJCXBhdGhfcmVsZWFzZSgmbmQpOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKK0VYUE9SVF9TWU1CT0wodmZzX2xzdGF0KTsKKworaW50IHZmc19mc3RhdCh1bnNpZ25lZCBpbnQgZmQsIHN0cnVjdCBrc3RhdCAqc3RhdCkKK3sKKwlzdHJ1Y3QgZmlsZSAqZiA9IGZnZXQoZmQpOworCWludCBlcnJvciA9IC1FQkFERjsKKworCWlmIChmKSB7CisJCWVycm9yID0gdmZzX2dldGF0dHIoZi0+Zl92ZnNtbnQsIGYtPmZfZGVudHJ5LCBzdGF0KTsKKwkJZnB1dChmKTsKKwl9CisJcmV0dXJuIGVycm9yOworfQorCitFWFBPUlRfU1lNQk9MKHZmc19mc3RhdCk7CisKKyNpZmRlZiBfX0FSQ0hfV0FOVF9PTERfU1RBVAorCisvKgorICogRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk/ICBNYXliZSB0aGlzIHNob3VsZCBiZSBtb3ZlZAorICogaW50byBhcmNoL2kzODYgaW5zdGVhZD8KKyAqLworc3RhdGljIGludCBjcF9vbGRfc3RhdChzdHJ1Y3Qga3N0YXQgKnN0YXQsIHN0cnVjdCBfX29sZF9rZXJuZWxfc3RhdCBfX3VzZXIgKiBzdGF0YnVmKQoreworCXN0YXRpYyBpbnQgd2FybmNvdW50ID0gNTsKKwlzdHJ1Y3QgX19vbGRfa2VybmVsX3N0YXQgdG1wOworCQorCWlmICh3YXJuY291bnQgPiAwKSB7CisJCXdhcm5jb3VudC0tOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJWRlM6IFdhcm5pbmc6ICVzIHVzaW5nIG9sZCBzdGF0KCkgY2FsbC4gUmVjb21waWxlIHlvdXIgYmluYXJ5LlxuIiwKKwkJCWN1cnJlbnQtPmNvbW0pOworCX0gZWxzZSBpZiAod2FybmNvdW50IDwgMCkgeworCQkvKiBpdCdzIGxhdWdoYWJsZSwgYnV0Li4uICovCisJCXdhcm5jb3VudCA9IDA7CisJfQorCisJbWVtc2V0KCZ0bXAsIDAsIHNpemVvZihzdHJ1Y3QgX19vbGRfa2VybmVsX3N0YXQpKTsKKwl0bXAuc3RfZGV2ID0gb2xkX2VuY29kZV9kZXYoc3RhdC0+ZGV2KTsKKwl0bXAuc3RfaW5vID0gc3RhdC0+aW5vOworCXRtcC5zdF9tb2RlID0gc3RhdC0+bW9kZTsKKwl0bXAuc3RfbmxpbmsgPSBzdGF0LT5ubGluazsKKwlpZiAodG1wLnN0X25saW5rICE9IHN0YXQtPm5saW5rKQorCQlyZXR1cm4gLUVPVkVSRkxPVzsKKwlTRVRfVUlEKHRtcC5zdF91aWQsIHN0YXQtPnVpZCk7CisJU0VUX0dJRCh0bXAuc3RfZ2lkLCBzdGF0LT5naWQpOworCXRtcC5zdF9yZGV2ID0gb2xkX2VuY29kZV9kZXYoc3RhdC0+cmRldik7CisjaWYgQklUU19QRVJfTE9ORyA9PSAzMgorCWlmIChzdGF0LT5zaXplID4gTUFYX05PTl9MRlMpCisJCXJldHVybiAtRU9WRVJGTE9XOworI2VuZGlmCQorCXRtcC5zdF9zaXplID0gc3RhdC0+c2l6ZTsKKwl0bXAuc3RfYXRpbWUgPSBzdGF0LT5hdGltZS50dl9zZWM7CisJdG1wLnN0X210aW1lID0gc3RhdC0+bXRpbWUudHZfc2VjOworCXRtcC5zdF9jdGltZSA9IHN0YXQtPmN0aW1lLnR2X3NlYzsKKwlyZXR1cm4gY29weV90b191c2VyKHN0YXRidWYsJnRtcCxzaXplb2YodG1wKSkgPyAtRUZBVUxUIDogMDsKK30KKworYXNtbGlua2FnZSBsb25nIHN5c19zdGF0KGNoYXIgX191c2VyICogZmlsZW5hbWUsIHN0cnVjdCBfX29sZF9rZXJuZWxfc3RhdCBfX3VzZXIgKiBzdGF0YnVmKQoreworCXN0cnVjdCBrc3RhdCBzdGF0OworCWludCBlcnJvciA9IHZmc19zdGF0KGZpbGVuYW1lLCAmc3RhdCk7CisKKwlpZiAoIWVycm9yKQorCQllcnJvciA9IGNwX29sZF9zdGF0KCZzdGF0LCBzdGF0YnVmKTsKKworCXJldHVybiBlcnJvcjsKK30KK2FzbWxpbmthZ2UgbG9uZyBzeXNfbHN0YXQoY2hhciBfX3VzZXIgKiBmaWxlbmFtZSwgc3RydWN0IF9fb2xkX2tlcm5lbF9zdGF0IF9fdXNlciAqIHN0YXRidWYpCit7CisJc3RydWN0IGtzdGF0IHN0YXQ7CisJaW50IGVycm9yID0gdmZzX2xzdGF0KGZpbGVuYW1lLCAmc3RhdCk7CisKKwlpZiAoIWVycm9yKQorCQllcnJvciA9IGNwX29sZF9zdGF0KCZzdGF0LCBzdGF0YnVmKTsKKworCXJldHVybiBlcnJvcjsKK30KK2FzbWxpbmthZ2UgbG9uZyBzeXNfZnN0YXQodW5zaWduZWQgaW50IGZkLCBzdHJ1Y3QgX19vbGRfa2VybmVsX3N0YXQgX191c2VyICogc3RhdGJ1ZikKK3sKKwlzdHJ1Y3Qga3N0YXQgc3RhdDsKKwlpbnQgZXJyb3IgPSB2ZnNfZnN0YXQoZmQsICZzdGF0KTsKKworCWlmICghZXJyb3IpCisJCWVycm9yID0gY3Bfb2xkX3N0YXQoJnN0YXQsIHN0YXRidWYpOworCisJcmV0dXJuIGVycm9yOworfQorCisjZW5kaWYgLyogX19BUkNIX1dBTlRfT0xEX1NUQVQgKi8KKworc3RhdGljIGludCBjcF9uZXdfc3RhdChzdHJ1Y3Qga3N0YXQgKnN0YXQsIHN0cnVjdCBzdGF0IF9fdXNlciAqc3RhdGJ1ZikKK3sKKwlzdHJ1Y3Qgc3RhdCB0bXA7CisKKyNpZiBCSVRTX1BFUl9MT05HID09IDMyCisJaWYgKCFvbGRfdmFsaWRfZGV2KHN0YXQtPmRldikgfHwgIW9sZF92YWxpZF9kZXYoc3RhdC0+cmRldikpCisJCXJldHVybiAtRU9WRVJGTE9XOworI2Vsc2UKKwlpZiAoIW5ld192YWxpZF9kZXYoc3RhdC0+ZGV2KSB8fCAhbmV3X3ZhbGlkX2RldihzdGF0LT5yZGV2KSkKKwkJcmV0dXJuIC1FT1ZFUkZMT1c7CisjZW5kaWYKKworCW1lbXNldCgmdG1wLCAwLCBzaXplb2YodG1wKSk7CisjaWYgQklUU19QRVJfTE9ORyA9PSAzMgorCXRtcC5zdF9kZXYgPSBvbGRfZW5jb2RlX2RldihzdGF0LT5kZXYpOworI2Vsc2UKKwl0bXAuc3RfZGV2ID0gbmV3X2VuY29kZV9kZXYoc3RhdC0+ZGV2KTsKKyNlbmRpZgorCXRtcC5zdF9pbm8gPSBzdGF0LT5pbm87CisJdG1wLnN0X21vZGUgPSBzdGF0LT5tb2RlOworCXRtcC5zdF9ubGluayA9IHN0YXQtPm5saW5rOworCWlmICh0bXAuc3RfbmxpbmsgIT0gc3RhdC0+bmxpbmspCisJCXJldHVybiAtRU9WRVJGTE9XOworCVNFVF9VSUQodG1wLnN0X3VpZCwgc3RhdC0+dWlkKTsKKwlTRVRfR0lEKHRtcC5zdF9naWQsIHN0YXQtPmdpZCk7CisjaWYgQklUU19QRVJfTE9ORyA9PSAzMgorCXRtcC5zdF9yZGV2ID0gb2xkX2VuY29kZV9kZXYoc3RhdC0+cmRldik7CisjZWxzZQorCXRtcC5zdF9yZGV2ID0gbmV3X2VuY29kZV9kZXYoc3RhdC0+cmRldik7CisjZW5kaWYKKyNpZiBCSVRTX1BFUl9MT05HID09IDMyCisJaWYgKHN0YXQtPnNpemUgPiBNQVhfTk9OX0xGUykKKwkJcmV0dXJuIC1FT1ZFUkZMT1c7CisjZW5kaWYJCisJdG1wLnN0X3NpemUgPSBzdGF0LT5zaXplOworCXRtcC5zdF9hdGltZSA9IHN0YXQtPmF0aW1lLnR2X3NlYzsKKwl0bXAuc3RfbXRpbWUgPSBzdGF0LT5tdGltZS50dl9zZWM7CisJdG1wLnN0X2N0aW1lID0gc3RhdC0+Y3RpbWUudHZfc2VjOworI2lmZGVmIFNUQVRfSEFWRV9OU0VDCisJdG1wLnN0X2F0aW1lX25zZWMgPSBzdGF0LT5hdGltZS50dl9uc2VjOworCXRtcC5zdF9tdGltZV9uc2VjID0gc3RhdC0+bXRpbWUudHZfbnNlYzsKKwl0bXAuc3RfY3RpbWVfbnNlYyA9IHN0YXQtPmN0aW1lLnR2X25zZWM7CisjZW5kaWYKKwl0bXAuc3RfYmxvY2tzID0gc3RhdC0+YmxvY2tzOworCXRtcC5zdF9ibGtzaXplID0gc3RhdC0+Ymxrc2l6ZTsKKwlyZXR1cm4gY29weV90b191c2VyKHN0YXRidWYsJnRtcCxzaXplb2YodG1wKSkgPyAtRUZBVUxUIDogMDsKK30KKworYXNtbGlua2FnZSBsb25nIHN5c19uZXdzdGF0KGNoYXIgX191c2VyICogZmlsZW5hbWUsIHN0cnVjdCBzdGF0IF9fdXNlciAqIHN0YXRidWYpCit7CisJc3RydWN0IGtzdGF0IHN0YXQ7CisJaW50IGVycm9yID0gdmZzX3N0YXQoZmlsZW5hbWUsICZzdGF0KTsKKworCWlmICghZXJyb3IpCisJCWVycm9yID0gY3BfbmV3X3N0YXQoJnN0YXQsIHN0YXRidWYpOworCisJcmV0dXJuIGVycm9yOworfQorYXNtbGlua2FnZSBsb25nIHN5c19uZXdsc3RhdChjaGFyIF9fdXNlciAqIGZpbGVuYW1lLCBzdHJ1Y3Qgc3RhdCBfX3VzZXIgKiBzdGF0YnVmKQoreworCXN0cnVjdCBrc3RhdCBzdGF0OworCWludCBlcnJvciA9IHZmc19sc3RhdChmaWxlbmFtZSwgJnN0YXQpOworCisJaWYgKCFlcnJvcikKKwkJZXJyb3IgPSBjcF9uZXdfc3RhdCgmc3RhdCwgc3RhdGJ1Zik7CisKKwlyZXR1cm4gZXJyb3I7Cit9Cithc21saW5rYWdlIGxvbmcgc3lzX25ld2ZzdGF0KHVuc2lnbmVkIGludCBmZCwgc3RydWN0IHN0YXQgX191c2VyICogc3RhdGJ1ZikKK3sKKwlzdHJ1Y3Qga3N0YXQgc3RhdDsKKwlpbnQgZXJyb3IgPSB2ZnNfZnN0YXQoZmQsICZzdGF0KTsKKworCWlmICghZXJyb3IpCisJCWVycm9yID0gY3BfbmV3X3N0YXQoJnN0YXQsIHN0YXRidWYpOworCisJcmV0dXJuIGVycm9yOworfQorCithc21saW5rYWdlIGxvbmcgc3lzX3JlYWRsaW5rKGNvbnN0IGNoYXIgX191c2VyICogcGF0aCwgY2hhciBfX3VzZXIgKiBidWYsIGludCBidWZzaXopCit7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlpbnQgZXJyb3I7CisKKwlpZiAoYnVmc2l6IDw9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyb3IgPSB1c2VyX3BhdGhfd2Fsa19saW5rKHBhdGgsICZuZCk7CisJaWYgKCFlcnJvcikgeworCQlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IG5kLmRlbnRyeS0+ZF9pbm9kZTsKKworCQllcnJvciA9IC1FSU5WQUw7CisJCWlmIChpbm9kZS0+aV9vcCAmJiBpbm9kZS0+aV9vcC0+cmVhZGxpbmspIHsKKwkJCWVycm9yID0gc2VjdXJpdHlfaW5vZGVfcmVhZGxpbmsobmQuZGVudHJ5KTsKKwkJCWlmICghZXJyb3IpIHsKKwkJCQl0b3VjaF9hdGltZShuZC5tbnQsIG5kLmRlbnRyeSk7CisJCQkJZXJyb3IgPSBpbm9kZS0+aV9vcC0+cmVhZGxpbmsobmQuZGVudHJ5LCBidWYsIGJ1ZnNpeik7CisJCQl9CisJCX0KKwkJcGF0aF9yZWxlYXNlKCZuZCk7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworCisvKiAtLS0tLS0tLS0tIExGUy02NCAtLS0tLS0tLS0tLSAqLworI2lmZGVmIF9fQVJDSF9XQU5UX1NUQVQ2NAorCitzdGF0aWMgbG9uZyBjcF9uZXdfc3RhdDY0KHN0cnVjdCBrc3RhdCAqc3RhdCwgc3RydWN0IHN0YXQ2NCBfX3VzZXIgKnN0YXRidWYpCit7CisJc3RydWN0IHN0YXQ2NCB0bXA7CisKKwltZW1zZXQoJnRtcCwgMCwgc2l6ZW9mKHN0cnVjdCBzdGF0NjQpKTsKKyNpZmRlZiBDT05GSUdfTUlQUworCS8qIG1pcHMgaGFzIHdlaXJkIHBhZGRpbmcsIHNvIHdlIGRvbid0IGdldCA2NCBiaXRzIHRoZXJlICovCisJaWYgKCFuZXdfdmFsaWRfZGV2KHN0YXQtPmRldikgfHwgIW5ld192YWxpZF9kZXYoc3RhdC0+cmRldikpCisJCXJldHVybiAtRU9WRVJGTE9XOworCXRtcC5zdF9kZXYgPSBuZXdfZW5jb2RlX2RldihzdGF0LT5kZXYpOworCXRtcC5zdF9yZGV2ID0gbmV3X2VuY29kZV9kZXYoc3RhdC0+cmRldik7CisjZWxzZQorCXRtcC5zdF9kZXYgPSBodWdlX2VuY29kZV9kZXYoc3RhdC0+ZGV2KTsKKwl0bXAuc3RfcmRldiA9IGh1Z2VfZW5jb2RlX2RldihzdGF0LT5yZGV2KTsKKyNlbmRpZgorCXRtcC5zdF9pbm8gPSBzdGF0LT5pbm87CisjaWZkZWYgU1RBVDY0X0hBU19CUk9LRU5fU1RfSU5PCisJdG1wLl9fc3RfaW5vID0gc3RhdC0+aW5vOworI2VuZGlmCisJdG1wLnN0X21vZGUgPSBzdGF0LT5tb2RlOworCXRtcC5zdF9ubGluayA9IHN0YXQtPm5saW5rOworCXRtcC5zdF91aWQgPSBzdGF0LT51aWQ7CisJdG1wLnN0X2dpZCA9IHN0YXQtPmdpZDsKKwl0bXAuc3RfYXRpbWUgPSBzdGF0LT5hdGltZS50dl9zZWM7CisJdG1wLnN0X2F0aW1lX25zZWMgPSBzdGF0LT5hdGltZS50dl9uc2VjOworCXRtcC5zdF9tdGltZSA9IHN0YXQtPm10aW1lLnR2X3NlYzsKKwl0bXAuc3RfbXRpbWVfbnNlYyA9IHN0YXQtPm10aW1lLnR2X25zZWM7CisJdG1wLnN0X2N0aW1lID0gc3RhdC0+Y3RpbWUudHZfc2VjOworCXRtcC5zdF9jdGltZV9uc2VjID0gc3RhdC0+Y3RpbWUudHZfbnNlYzsKKwl0bXAuc3Rfc2l6ZSA9IHN0YXQtPnNpemU7CisJdG1wLnN0X2Jsb2NrcyA9IHN0YXQtPmJsb2NrczsKKwl0bXAuc3RfYmxrc2l6ZSA9IHN0YXQtPmJsa3NpemU7CisJcmV0dXJuIGNvcHlfdG9fdXNlcihzdGF0YnVmLCZ0bXAsc2l6ZW9mKHRtcCkpID8gLUVGQVVMVCA6IDA7Cit9CisKK2FzbWxpbmthZ2UgbG9uZyBzeXNfc3RhdDY0KGNoYXIgX191c2VyICogZmlsZW5hbWUsIHN0cnVjdCBzdGF0NjQgX191c2VyICogc3RhdGJ1ZikKK3sKKwlzdHJ1Y3Qga3N0YXQgc3RhdDsKKwlpbnQgZXJyb3IgPSB2ZnNfc3RhdChmaWxlbmFtZSwgJnN0YXQpOworCisJaWYgKCFlcnJvcikKKwkJZXJyb3IgPSBjcF9uZXdfc3RhdDY0KCZzdGF0LCBzdGF0YnVmKTsKKworCXJldHVybiBlcnJvcjsKK30KK2FzbWxpbmthZ2UgbG9uZyBzeXNfbHN0YXQ2NChjaGFyIF9fdXNlciAqIGZpbGVuYW1lLCBzdHJ1Y3Qgc3RhdDY0IF9fdXNlciAqIHN0YXRidWYpCit7CisJc3RydWN0IGtzdGF0IHN0YXQ7CisJaW50IGVycm9yID0gdmZzX2xzdGF0KGZpbGVuYW1lLCAmc3RhdCk7CisKKwlpZiAoIWVycm9yKQorCQllcnJvciA9IGNwX25ld19zdGF0NjQoJnN0YXQsIHN0YXRidWYpOworCisJcmV0dXJuIGVycm9yOworfQorYXNtbGlua2FnZSBsb25nIHN5c19mc3RhdDY0KHVuc2lnbmVkIGxvbmcgZmQsIHN0cnVjdCBzdGF0NjQgX191c2VyICogc3RhdGJ1ZikKK3sKKwlzdHJ1Y3Qga3N0YXQgc3RhdDsKKwlpbnQgZXJyb3IgPSB2ZnNfZnN0YXQoZmQsICZzdGF0KTsKKworCWlmICghZXJyb3IpCisJCWVycm9yID0gY3BfbmV3X3N0YXQ2NCgmc3RhdCwgc3RhdGJ1Zik7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKyNlbmRpZiAvKiBfX0FSQ0hfV0FOVF9TVEFUNjQgKi8KKwordm9pZCBpbm9kZV9hZGRfYnl0ZXMoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGJ5dGVzKQoreworCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJaW5vZGUtPmlfYmxvY2tzICs9IGJ5dGVzID4+IDk7CisJYnl0ZXMgJj0gNTExOworCWlub2RlLT5pX2J5dGVzICs9IGJ5dGVzOworCWlmIChpbm9kZS0+aV9ieXRlcyA+PSA1MTIpIHsKKwkJaW5vZGUtPmlfYmxvY2tzKys7CisJCWlub2RlLT5pX2J5dGVzIC09IDUxMjsKKwl9CisJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworfQorCitFWFBPUlRfU1lNQk9MKGlub2RlX2FkZF9ieXRlcyk7CisKK3ZvaWQgaW5vZGVfc3ViX2J5dGVzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBieXRlcykKK3sKKwlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCWlub2RlLT5pX2Jsb2NrcyAtPSBieXRlcyA+PiA5OworCWJ5dGVzICY9IDUxMTsKKwlpZiAoaW5vZGUtPmlfYnl0ZXMgPCBieXRlcykgeworCQlpbm9kZS0+aV9ibG9ja3MtLTsKKwkJaW5vZGUtPmlfYnl0ZXMgKz0gNTEyOworCX0KKwlpbm9kZS0+aV9ieXRlcyAtPSBieXRlczsKKwlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7Cit9CisKK0VYUE9SVF9TWU1CT0woaW5vZGVfc3ViX2J5dGVzKTsKKworbG9mZl90IGlub2RlX2dldF9ieXRlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWxvZmZfdCByZXQ7CisKKwlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCXJldCA9ICgoKGxvZmZfdClpbm9kZS0+aV9ibG9ja3MpIDw8IDkpICsgaW5vZGUtPmlfYnl0ZXM7CisJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK0VYUE9SVF9TWU1CT0woaW5vZGVfZ2V0X2J5dGVzKTsKKwordm9pZCBpbm9kZV9zZXRfYnl0ZXMoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGJ5dGVzKQoreworCS8qIENhbGxlciBpcyBoZXJlIHJlc3BvbnNpYmxlIGZvciBzdWZmaWNpZW50IGxvY2tpbmcKKwkgKiAoaWUuIGlub2RlLT5pX2xvY2spICovCisJaW5vZGUtPmlfYmxvY2tzID0gYnl0ZXMgPj4gOTsKKwlpbm9kZS0+aV9ieXRlcyA9IGJ5dGVzICYgNTExOworfQorCitFWFBPUlRfU1lNQk9MKGlub2RlX3NldF9ieXRlcyk7CmRpZmYgLS1naXQgYS9mcy9zdXBlci5jIGIvZnMvc3VwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTFiOGNhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvc3VwZXIuYwpAQCAtMCwwICsxLDg2MCBAQAorLyoKKyAqICBsaW51eC9mcy9zdXBlci5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgc3VwZXIuYyBjb250YWlucyBjb2RlIHRvIGhhbmRsZTogLSBtb3VudCBzdHJ1Y3R1cmVzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzdXBlci1ibG9jayB0YWJsZXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGZpbGVzeXN0ZW0gZHJpdmVycyBsaXN0CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtb3VudCBzeXN0ZW0gY2FsbAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gdW1vdW50IHN5c3RlbSBjYWxsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSB1c3RhdCBzeXN0ZW0gY2FsbAorICoKKyAqIEdLIDIvNS85NSAgLSAgQ2hhbmdlZCB0byBzdXBwb3J0IG1vdW50aW5nIHRoZSByb290IGZzIHZpYSBORlMKKyAqCisgKiAgQWRkZWQga2VybmVsZCBzdXBwb3J0OiBKYWNxdWVzIEdlbGluYXMgYW5kIEJqb3JuIEVrd2FsbAorICogIEFkZGVkIGNoYW5nZV9yb290OiBXZXJuZXIgQWxtZXNiZXJnZXIgJiBIYW5zIExlcm1lbiwgRmViICc5NgorICogIEFkZGVkIG9wdGlvbnMgdG8gL3Byb2MvbW91bnRzOgorICogICAgVG9yYmr2cm4gTGluZGggKHRvcmJqb3JuLmxpbmRoQGdvcHRhLnNlKSwgQXByaWwgMTQsIDE5OTYuCisgKiAgQWRkZWQgZGV2ZnMgc3VwcG9ydDogUmljaGFyZCBHb29jaCA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+LCAxMy1KQU4tMTk5OAorICogIEhlYXZpbHkgcmV3cml0dGVuIGZvciAnb25lIGZzIC0gb25lIHRyZWUnIGRjYWNoZSBhcmNoaXRlY3R1cmUuIEFWLCBNYXIgMjAwMAorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYWNjdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgkJLyogZm9yIGZzeW5jX3N1cGVyKCkgKi8KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKyNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4JCS8qIGZvciB0aGUgZW1lcmdlbmN5IHJlbW91bnQgc3R1ZmYgKi8KKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworCit2b2lkIGdldF9maWxlc3lzdGVtKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmcyk7Cit2b2lkIHB1dF9maWxlc3lzdGVtKHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmcyk7CitzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZ2V0X2ZzX3R5cGUoY29uc3QgY2hhciAqbmFtZSk7CisKK0xJU1RfSEVBRChzdXBlcl9ibG9ja3MpOworREVGSU5FX1NQSU5MT0NLKHNiX2xvY2spOworCisvKioKKyAqCWFsbG9jX3N1cGVyCS0JY3JlYXRlIG5ldyBzdXBlcmJsb2NrCisgKgorICoJQWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyBhIG5ldyAmc3RydWN0IHN1cGVyX2Jsb2NrLiAgYWxsb2Nfc3VwZXIoKQorICoJcmV0dXJucyBhIHBvaW50ZXIgbmV3IHN1cGVyYmxvY2sgb3IgJU5VTEwgaWYgYWxsb2NhdGlvbiBoYWQgZmFpbGVkLgorICovCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICphbGxvY19zdXBlcih2b2lkKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzdXBlcl9ibG9jayksICBHRlBfVVNFUik7CisJc3RhdGljIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGRlZmF1bHRfb3A7CisKKwlpZiAocykgeworCQltZW1zZXQocywgMCwgc2l6ZW9mKHN0cnVjdCBzdXBlcl9ibG9jaykpOworCQlpZiAoc2VjdXJpdHlfc2JfYWxsb2MocykpIHsKKwkJCWtmcmVlKHMpOworCQkJcyA9IE5VTEw7CisJCQlnb3RvIG91dDsKKwkJfQorCQlJTklUX0xJU1RfSEVBRCgmcy0+c19kaXJ0eSk7CisJCUlOSVRfTElTVF9IRUFEKCZzLT5zX2lvKTsKKwkJSU5JVF9MSVNUX0hFQUQoJnMtPnNfZmlsZXMpOworCQlJTklUX0xJU1RfSEVBRCgmcy0+c19pbnN0YW5jZXMpOworCQlJTklUX0hMSVNUX0hFQUQoJnMtPnNfYW5vbik7CisJCUlOSVRfTElTVF9IRUFEKCZzLT5zX2lub2Rlcyk7CisJCWluaXRfcndzZW0oJnMtPnNfdW1vdW50KTsKKwkJc2VtYV9pbml0KCZzLT5zX2xvY2ssIDEpOworCQlkb3duX3dyaXRlKCZzLT5zX3Vtb3VudCk7CisJCXMtPnNfY291bnQgPSBTX0JJQVM7CisJCWF0b21pY19zZXQoJnMtPnNfYWN0aXZlLCAxKTsKKwkJc2VtYV9pbml0KCZzLT5zX3Zmc19yZW5hbWVfc2VtLDEpOworCQlzZW1hX2luaXQoJnMtPnNfZHF1b3QuZHFpb19zZW0sIDEpOworCQlzZW1hX2luaXQoJnMtPnNfZHF1b3QuZHFvbm9mZl9zZW0sIDEpOworCQlpbml0X3J3c2VtKCZzLT5zX2RxdW90LmRxcHRyX3NlbSk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPnNfd2FpdF91bmZyb3plbik7CisJCXMtPnNfbWF4Ynl0ZXMgPSBNQVhfTk9OX0xGUzsKKwkJcy0+ZHFfb3AgPSBzYl9kcXVvdF9vcHM7CisJCXMtPnNfcWNvcCA9IHNiX3F1b3RhY3RsX29wczsKKwkJcy0+c19vcCA9ICZkZWZhdWx0X29wOworCQlzLT5zX3RpbWVfZ3JhbiA9IDEwMDAwMDAwMDA7CisJfQorb3V0OgorCXJldHVybiBzOworfQorCisvKioKKyAqCWRlc3Ryb3lfc3VwZXIJLQlmcmVlcyBhIHN1cGVyYmxvY2sKKyAqCUBzOiBzdXBlcmJsb2NrIHRvIGZyZWUKKyAqCisgKglGcmVlcyBhIHN1cGVyYmxvY2suCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkZXN0cm95X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcykKK3sKKwlzZWN1cml0eV9zYl9mcmVlKHMpOworCWtmcmVlKHMpOworfQorCisvKiBTdXBlcmJsb2NrIHJlZmNvdW50aW5nICAqLworCisvKgorICogRHJvcCBhIHN1cGVyYmxvY2sncyByZWZjb3VudC4gIFJldHVybnMgbm9uLXplcm8gaWYgdGhlIHN1cGVyYmxvY2sgd2FzCisgKiBkZXN0cm95ZWQuICBUaGUgY2FsbGVyIG11c3QgaG9sZCBzYl9sb2NrLgorICovCitpbnQgX19wdXRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICghLS1zYi0+c19jb3VudCkgeworCQlkZXN0cm95X3N1cGVyKHNiKTsKKwkJcmV0ID0gMTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIERyb3AgYSBzdXBlcmJsb2NrJ3MgcmVmY291bnQuCisgKiBSZXR1cm5zIG5vbi16ZXJvIGlmIHRoZSBzdXBlcmJsb2NrIGlzIGFib3V0IHRvIGJlIGRlc3Ryb3llZCBhbmQKKyAqIGF0IGxlYXN0IGlzIGFscmVhZHkgcmVtb3ZlZCBmcm9tIHN1cGVyX2Jsb2NrcyBsaXN0LCBzbyBpZiB3ZSBhcmUKKyAqIG1ha2luZyBhIGxvb3AgdGhyb3VnaCBzdXBlciBibG9ja3MgdGhlbiB3ZSBuZWVkIHRvIHJlc3RhcnQuCisgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCBzYl9sb2NrLgorICovCitpbnQgX19wdXRfc3VwZXJfYW5kX25lZWRfcmVzdGFydChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCS8qIGNoZWNrIGZvciByYWNlIHdpdGggZ2VuZXJpY19zaHV0ZG93bl9zdXBlcigpICovCisJaWYgKGxpc3RfZW1wdHkoJnNiLT5zX2xpc3QpKSB7CisJCS8qIHN1cGVyIGJsb2NrIGlzIHJlbW92ZWQsIG5lZWQgdG8gcmVzdGFydC4uLiAqLworCQlfX3B1dF9zdXBlcihzYik7CisJCXJldHVybiAxOworCX0KKwkvKiBjYW4ndCBiZSB0aGUgbGFzdCwgc2luY2Ugc19saXN0IGlzIHN0aWxsIGluIHVzZSAqLworCXNiLT5zX2NvdW50LS07CisJQlVHX09OKHNiLT5zX2NvdW50ID09IDApOworCXJldHVybiAwOworfQorCisvKioKKyAqCXB1dF9zdXBlcgktCWRyb3AgYSB0ZW1wb3JhcnkgcmVmZXJlbmNlIHRvIHN1cGVyYmxvY2sKKyAqCUBzYjogc3VwZXJibG9jayBpbiBxdWVzdGlvbgorICoKKyAqCURyb3BzIGEgdGVtcG9yYXJ5IHJlZmVyZW5jZSwgZnJlZXMgc3VwZXJibG9jayBpZiB0aGVyZSdzIG5vCisgKglyZWZlcmVuY2VzIGxlZnQuCisgKi8KK3N0YXRpYyB2b2lkIHB1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXNwaW5fbG9jaygmc2JfbG9jayk7CisJX19wdXRfc3VwZXIoc2IpOworCXNwaW5fdW5sb2NrKCZzYl9sb2NrKTsKK30KKworCisvKioKKyAqCWRlYWN0aXZhdGVfc3VwZXIJLQlkcm9wIGFuIGFjdGl2ZSByZWZlcmVuY2UgdG8gc3VwZXJibG9jaworICoJQHM6IHN1cGVyYmxvY2sgdG8gZGVhY3RpdmF0ZQorICoKKyAqCURyb3BzIGFuIGFjdGl2ZSByZWZlcmVuY2UgdG8gc3VwZXJibG9jaywgYWNxdWlyaW5nIGEgdGVtcHJvcnkgb25lIGlmCisgKgl0aGVyZSBpcyBubyBhY3RpdmUgcmVmZXJlbmNlcyBsZWZ0LiAgSW4gdGhhdCBjYXNlIHdlIGxvY2sgc3VwZXJibG9jaywKKyAqCXRlbGwgZnMgZHJpdmVyIHRvIHNodXQgaXQgZG93biBhbmQgZHJvcCB0aGUgdGVtcG9yYXJ5IHJlZmVyZW5jZSB3ZQorICoJaGFkIGp1c3QgYWNxdWlyZWQuCisgKi8KK3ZvaWQgZGVhY3RpdmF0ZV9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnMpCit7CisJc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzID0gcy0+c190eXBlOworCWlmIChhdG9taWNfZGVjX2FuZF9sb2NrKCZzLT5zX2FjdGl2ZSwgJnNiX2xvY2spKSB7CisJCXMtPnNfY291bnQgLT0gU19CSUFTLTE7CisJCXNwaW5fdW5sb2NrKCZzYl9sb2NrKTsKKwkJZG93bl93cml0ZSgmcy0+c191bW91bnQpOworCQlmcy0+a2lsbF9zYihzKTsKKwkJcHV0X2ZpbGVzeXN0ZW0oZnMpOworCQlwdXRfc3VwZXIocyk7CisJfQorfQorCitFWFBPUlRfU1lNQk9MKGRlYWN0aXZhdGVfc3VwZXIpOworCisvKioKKyAqCWdyYWJfc3VwZXIgLSBhY3F1aXJlIGFuIGFjdGl2ZSByZWZlcmVuY2UKKyAqCUBzOiByZWZlcmVuY2Ugd2UgYXJlIHRyeWluZyB0byBtYWtlIGFjdGl2ZQorICoKKyAqCVRyaWVzIHRvIGFjcXVpcmUgYW4gYWN0aXZlIHJlZmVyZW5jZS4gIGdyYWJfc3VwZXIoKSBpcyB1c2VkIHdoZW4gd2UKKyAqIAloYWQganVzdCBmb3VuZCBhIHN1cGVyYmxvY2sgaW4gc3VwZXJfYmxvY2tzIG9yIGZzX3R5cGUtPmZzX3N1cGVycworICoJYW5kIHdhbnQgdG8gdHVybiBpdCBpbnRvIGEgZnVsbC1ibG93biBhY3RpdmUgcmVmZXJlbmNlLiAgZ3JhYl9zdXBlcigpCisgKglpcyBjYWxsZWQgd2l0aCBzYl9sb2NrIGhlbGQgYW5kIGRyb3BzIGl0LiAgUmV0dXJucyAxIGluIGNhc2Ugb2YKKyAqCXN1Y2Nlc3MsIDAgaWYgd2UgaGFkIGZhaWxlZCAoc3VwZXJibG9jayBjb250ZW50cyB3YXMgYWxyZWFkeSBkZWFkIG9yCisgKglkeWluZyB3aGVuIGdyYWJfc3VwZXIoKSBoYWQgYmVlbiBjYWxsZWQpLgorICovCitzdGF0aWMgaW50IGdyYWJfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzKQoreworCXMtPnNfY291bnQrKzsKKwlzcGluX3VubG9jaygmc2JfbG9jayk7CisJZG93bl93cml0ZSgmcy0+c191bW91bnQpOworCWlmIChzLT5zX3Jvb3QpIHsKKwkJc3Bpbl9sb2NrKCZzYl9sb2NrKTsKKwkJaWYgKHMtPnNfY291bnQgPiBTX0JJQVMpIHsKKwkJCWF0b21pY19pbmMoJnMtPnNfYWN0aXZlKTsKKwkJCXMtPnNfY291bnQtLTsKKwkJCXNwaW5fdW5sb2NrKCZzYl9sb2NrKTsKKwkJCXJldHVybiAxOworCQl9CisJCXNwaW5fdW5sb2NrKCZzYl9sb2NrKTsKKwl9CisJdXBfd3JpdGUoJnMtPnNfdW1vdW50KTsKKwlwdXRfc3VwZXIocyk7CisJeWllbGQoKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglnZW5lcmljX3NodXRkb3duX3N1cGVyCS0JY29tbW9uIGhlbHBlciBmb3IgLT5raWxsX3NiKCkKKyAqCUBzYjogc3VwZXJibG9jayB0byBraWxsCisgKgorICoJZ2VuZXJpY19zaHV0ZG93bl9zdXBlcigpIGRvZXMgYWxsIGZzLWluZGVwZW5kZW50IHdvcmsgb24gc3VwZXJibG9jaworICoJc2h1dGRvd24uICBUeXBpY2FsIC0+a2lsbF9zYigpIHNob3VsZCBwaWNrIGFsbCBmcy1zcGVjaWZpYyBvYmplY3RzCisgKgl0aGF0IG5lZWQgZGVzdHJ1Y3Rpb24gb3V0IG9mIHN1cGVyYmxvY2ssIGNhbGwgZ2VuZXJpY19zaHV0ZG93bl9zdXBlcigpCisgKglhbmQgcmVsZWFzZSBhZm9yZW1lbnRpb25lZCBvYmplY3RzLiAgTm90ZTogZGVudHJpZXMgYW5kIGlub2RlcyBfYXJlXworICoJdGFrZW4gY2FyZSBvZiBhbmQgZG8gbm90IG5lZWQgc3BlY2lmaWMgaGFuZGxpbmcuCisgKi8KK3ZvaWQgZ2VuZXJpY19zaHV0ZG93bl9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBkZW50cnkgKnJvb3QgPSBzYi0+c19yb290OworCXN0cnVjdCBzdXBlcl9vcGVyYXRpb25zICpzb3AgPSBzYi0+c19vcDsKKworCWlmIChyb290KSB7CisJCXNiLT5zX3Jvb3QgPSBOVUxMOworCQlzaHJpbmtfZGNhY2hlX3BhcmVudChyb290KTsKKwkJc2hyaW5rX2RjYWNoZV9hbm9uKCZzYi0+c19hbm9uKTsKKwkJZHB1dChyb290KTsKKwkJZnN5bmNfc3VwZXIoc2IpOworCQlsb2NrX3N1cGVyKHNiKTsKKwkJc2ItPnNfZmxhZ3MgJj0gfk1TX0FDVElWRTsKKwkJLyogYmFkIG5hbWUgLSBpdCBzaG91bGQgYmUgZXZpY3RfaW5vZGVzKCkgKi8KKwkJaW52YWxpZGF0ZV9pbm9kZXMoc2IpOworCQlsb2NrX2tlcm5lbCgpOworCisJCWlmIChzb3AtPndyaXRlX3N1cGVyICYmIHNiLT5zX2RpcnQpCisJCQlzb3AtPndyaXRlX3N1cGVyKHNiKTsKKwkJaWYgKHNvcC0+cHV0X3N1cGVyKQorCQkJc29wLT5wdXRfc3VwZXIoc2IpOworCisJCS8qIEZvcmdldCBhbnkgcmVtYWluaW5nIGlub2RlcyAqLworCQlpZiAoaW52YWxpZGF0ZV9pbm9kZXMoc2IpKSB7CisJCQlwcmludGsoIlZGUzogQnVzeSBpbm9kZXMgYWZ0ZXIgdW5tb3VudC4gIgorCQkJICAgIlNlbGYtZGVzdHJ1Y3QgaW4gNSBzZWNvbmRzLiAgSGF2ZSBhIG5pY2UgZGF5Li4uXG4iKTsKKwkJfQorCisJCXVubG9ja19rZXJuZWwoKTsKKwkJdW5sb2NrX3N1cGVyKHNiKTsKKwl9CisJc3Bpbl9sb2NrKCZzYl9sb2NrKTsKKwkvKiBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgZm9yIF9fcHV0X3N1cGVyX2FuZF9uZWVkX3Jlc3RhcnQoKSAqLworCWxpc3RfZGVsX2luaXQoJnNiLT5zX2xpc3QpOworCWxpc3RfZGVsKCZzYi0+c19pbnN0YW5jZXMpOworCXNwaW5fdW5sb2NrKCZzYl9sb2NrKTsKKwl1cF93cml0ZSgmc2ItPnNfdW1vdW50KTsKK30KKworRVhQT1JUX1NZTUJPTChnZW5lcmljX3NodXRkb3duX3N1cGVyKTsKKworLyoqCisgKglzZ2V0CS0JZmluZCBvciBjcmVhdGUgYSBzdXBlcmJsb2NrCisgKglAdHlwZToJZmlsZXN5c3RlbSB0eXBlIHN1cGVyYmxvY2sgc2hvdWxkIGJlbG9uZyB0bworICoJQHRlc3Q6CWNvbXBhcmlzb24gY2FsbGJhY2sKKyAqCUBzZXQ6CXNldHVwIGNhbGxiYWNrCisgKglAZGF0YToJYXJndW1lbnQgdG8gZWFjaCBvZiB0aGVtCisgKi8KK3N0cnVjdCBzdXBlcl9ibG9jayAqc2dldChzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqdHlwZSwKKwkJCWludCAoKnRlc3QpKHN0cnVjdCBzdXBlcl9ibG9jayAqLHZvaWQgKiksCisJCQlpbnQgKCpzZXQpKHN0cnVjdCBzdXBlcl9ibG9jayAqLHZvaWQgKiksCisJCQl2b2lkICpkYXRhKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlpbnQgZXJyOworCityZXRyeToKKwlzcGluX2xvY2soJnNiX2xvY2spOworCWlmICh0ZXN0KSBsaXN0X2Zvcl9lYWNoKHAsICZ0eXBlLT5mc19zdXBlcnMpIHsKKwkJc3RydWN0IHN1cGVyX2Jsb2NrICpvbGQ7CisJCW9sZCA9IGxpc3RfZW50cnkocCwgc3RydWN0IHN1cGVyX2Jsb2NrLCBzX2luc3RhbmNlcyk7CisJCWlmICghdGVzdChvbGQsIGRhdGEpKQorCQkJY29udGludWU7CisJCWlmICghZ3JhYl9zdXBlcihvbGQpKQorCQkJZ290byByZXRyeTsKKwkJaWYgKHMpCisJCQlkZXN0cm95X3N1cGVyKHMpOworCQlyZXR1cm4gb2xkOworCX0KKwlpZiAoIXMpIHsKKwkJc3Bpbl91bmxvY2soJnNiX2xvY2spOworCQlzID0gYWxsb2Nfc3VwZXIoKTsKKwkJaWYgKCFzKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJCWdvdG8gcmV0cnk7CisJfQorCQkKKwllcnIgPSBzZXQocywgZGF0YSk7CisJaWYgKGVycikgeworCQlzcGluX3VubG9jaygmc2JfbG9jayk7CisJCWRlc3Ryb3lfc3VwZXIocyk7CisJCXJldHVybiBFUlJfUFRSKGVycik7CisJfQorCXMtPnNfdHlwZSA9IHR5cGU7CisJc3RybGNweShzLT5zX2lkLCB0eXBlLT5uYW1lLCBzaXplb2Yocy0+c19pZCkpOworCWxpc3RfYWRkX3RhaWwoJnMtPnNfbGlzdCwgJnN1cGVyX2Jsb2Nrcyk7CisJbGlzdF9hZGQoJnMtPnNfaW5zdGFuY2VzLCAmdHlwZS0+ZnNfc3VwZXJzKTsKKwlzcGluX3VubG9jaygmc2JfbG9jayk7CisJZ2V0X2ZpbGVzeXN0ZW0odHlwZSk7CisJcmV0dXJuIHM7Cit9CisKK0VYUE9SVF9TWU1CT0woc2dldCk7CisKK3ZvaWQgZHJvcF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXVwX3JlYWQoJnNiLT5zX3Vtb3VudCk7CisJcHV0X3N1cGVyKHNiKTsKK30KKworRVhQT1JUX1NZTUJPTChkcm9wX3N1cGVyKTsKKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJbG9ja19zdXBlcihzYik7CisJaWYgKHNiLT5zX3Jvb3QgJiYgc2ItPnNfZGlydCkKKwkJaWYgKHNiLT5zX29wLT53cml0ZV9zdXBlcikKKwkJCXNiLT5zX29wLT53cml0ZV9zdXBlcihzYik7CisJdW5sb2NrX3N1cGVyKHNiKTsKK30KKworLyoKKyAqIE5vdGU6IGNoZWNrIHRoZSBkaXJ0eSBmbGFnIGJlZm9yZSB3YWl0aW5nLCBzbyB3ZSBkb24ndAorICogaG9sZCB1cCB0aGUgc3luYyB3aGlsZSBtb3VudGluZyBhIGRldmljZS4gKFRoZSBuZXdseQorICogbW91bnRlZCBkZXZpY2Ugd29uJ3QgbmVlZCBzeW5jaW5nLikKKyAqLwordm9pZCBzeW5jX3N1cGVycyh2b2lkKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiOworcmVzdGFydDoKKwlzcGluX2xvY2soJnNiX2xvY2spOworCXNiID0gc2JfZW50cnkoc3VwZXJfYmxvY2tzLm5leHQpOworCXdoaWxlIChzYiAhPSBzYl9lbnRyeSgmc3VwZXJfYmxvY2tzKSkKKwkJaWYgKHNiLT5zX2RpcnQpIHsKKwkJCXNiLT5zX2NvdW50Kys7CisJCQlzcGluX3VubG9jaygmc2JfbG9jayk7CisJCQlkb3duX3JlYWQoJnNiLT5zX3Vtb3VudCk7CisJCQl3cml0ZV9zdXBlcihzYik7CisJCQlkcm9wX3N1cGVyKHNiKTsKKwkJCWdvdG8gcmVzdGFydDsKKwkJfSBlbHNlCisJCQlzYiA9IHNiX2VudHJ5KHNiLT5zX2xpc3QubmV4dCk7CisJc3Bpbl91bmxvY2soJnNiX2xvY2spOworfQorCisvKgorICogQ2FsbCB0aGUgLT5zeW5jX2ZzIHN1cGVyX29wIGFnYWluc3QgYWxsIGZpbGVzeXRlbXMgd2hpY2ggYXJlIHIvdyBhbmQKKyAqIHdoaWNoIGltcGxlbWVudCBpdC4KKyAqCisgKiBUaGlzIG9wZXJhdGlvbiBpcyBjYXJlZnVsIHRvIGF2b2lkIHRoZSBsaXZlbG9jayB3aGljaCBjb3VsZCBlYXNpbHkgaGFwcGVuCisgKiBpZiB0d28gb3IgbW9yZSBmaWxlc3lzdGVtcyBhcmUgYmVpbmcgY29udGludW91c2x5IGRpcnRpZWQuICBzX25lZWRfc3luY19mcworICogaXMgdXNlZCBvbmx5IGhlcmUuICBXZSBzZXQgaXQgYWdhaW5zdCBhbGwgZmlsZXN5c3RlbXMgYW5kIHRoZW4gY2xlYXIgaXQgYXMKKyAqIHdlIHN5bmMgdGhlbS4gIFNvIHJlZGlydGllZCBmaWxlc3lzdGVtcyBhcmUgc2tpcHBlZC4KKyAqCisgKiBCdXQgaWYgcHJvY2VzcyBBIGlzIGN1cnJlbnRseSBydW5uaW5nIHN5bmNfZmlsZXN5dGVtcyBhbmQgdGhlbiBwcm9jZXNzIEIKKyAqIGNhbGxzIHN5bmNfZmlsZXN5c3RlbXMgYXMgd2VsbCwgcHJvY2VzcyBCIHdpbGwgc2V0IGFsbCB0aGUgc19uZWVkX3N5bmNfZnMKKyAqIGZsYWdzIGFnYWluLCB3aGljaCB3aWxsIGNhdXNlIHByb2Nlc3MgQSB0byByZXN5bmMgZXZlcnl0aGluZy4gIEZpeCB0aGF0IHdpdGgKKyAqIGEgbG9jYWwgbXV0ZXguCisgKgorICogKEZhYmlhbikgQXZvaWQgc3luY19mcyB3aXRoIGNsZWFuIGZzICYgd2FpdCBtb2RlIDAKKyAqLwordm9pZCBzeW5jX2ZpbGVzeXN0ZW1zKGludCB3YWl0KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJc3RhdGljIERFQ0xBUkVfTVVURVgobXV0ZXgpOworCisJZG93bigmbXV0ZXgpOwkJLyogQ291bGQgYmUgZG93bl9pbnRlcnJ1cHRpYmxlICovCisJc3Bpbl9sb2NrKCZzYl9sb2NrKTsKKwlmb3IgKHNiID0gc2JfZW50cnkoc3VwZXJfYmxvY2tzLm5leHQpOyBzYiAhPSBzYl9lbnRyeSgmc3VwZXJfYmxvY2tzKTsKKwkJCXNiID0gc2JfZW50cnkoc2ItPnNfbGlzdC5uZXh0KSkgeworCQlpZiAoIXNiLT5zX29wLT5zeW5jX2ZzKQorCQkJY29udGludWU7CisJCWlmIChzYi0+c19mbGFncyAmIE1TX1JET05MWSkKKwkJCWNvbnRpbnVlOworCQlzYi0+c19uZWVkX3N5bmNfZnMgPSAxOworCX0KKwlzcGluX3VubG9jaygmc2JfbG9jayk7CisKK3Jlc3RhcnQ6CisJc3Bpbl9sb2NrKCZzYl9sb2NrKTsKKwlmb3IgKHNiID0gc2JfZW50cnkoc3VwZXJfYmxvY2tzLm5leHQpOyBzYiAhPSBzYl9lbnRyeSgmc3VwZXJfYmxvY2tzKTsKKwkJCXNiID0gc2JfZW50cnkoc2ItPnNfbGlzdC5uZXh0KSkgeworCQlpZiAoIXNiLT5zX25lZWRfc3luY19mcykKKwkJCWNvbnRpbnVlOworCQlzYi0+c19uZWVkX3N5bmNfZnMgPSAwOworCQlpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpCisJCQljb250aW51ZTsJLyogaG0uICBXYXMgcmVtb3VudGVkIHIvbyBtZWFud2hpbGUgKi8KKwkJc2ItPnNfY291bnQrKzsKKwkJc3Bpbl91bmxvY2soJnNiX2xvY2spOworCQlkb3duX3JlYWQoJnNiLT5zX3Vtb3VudCk7CisJCWlmIChzYi0+c19yb290ICYmICh3YWl0IHx8IHNiLT5zX2RpcnQpKQorCQkJc2ItPnNfb3AtPnN5bmNfZnMoc2IsIHdhaXQpOworCQlkcm9wX3N1cGVyKHNiKTsKKwkJZ290byByZXN0YXJ0OworCX0KKwlzcGluX3VubG9jaygmc2JfbG9jayk7CisJdXAoJm11dGV4KTsKK30KKworLyoqCisgKglnZXRfc3VwZXIgLSBnZXQgdGhlIHN1cGVyYmxvY2sgb2YgYSBkZXZpY2UKKyAqCUBiZGV2OiBkZXZpY2UgdG8gZ2V0IHRoZSBzdXBlcmJsb2NrIGZvcgorICoJCisgKglTY2FucyB0aGUgc3VwZXJibG9jayBsaXN0IGFuZCBmaW5kcyB0aGUgc3VwZXJibG9jayBvZiB0aGUgZmlsZSBzeXN0ZW0KKyAqCW1vdW50ZWQgb24gdGhlIGRldmljZSBnaXZlbi4gJU5VTEwgaXMgcmV0dXJuZWQgaWYgbm8gbWF0Y2ggaXMgZm91bmQuCisgKi8KKworc3RydWN0IHN1cGVyX2Jsb2NrICogZ2V0X3N1cGVyKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlpZiAoIWJkZXYpCisJCXJldHVybiBOVUxMOworcmVzY2FuOgorCXNwaW5fbG9jaygmc2JfbG9jayk7CisJbGlzdF9mb3JfZWFjaChwLCAmc3VwZXJfYmxvY2tzKSB7CisJCXN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IHNiX2VudHJ5KHApOworCQlpZiAocy0+c19iZGV2ID09IGJkZXYpIHsKKwkJCXMtPnNfY291bnQrKzsKKwkJCXNwaW5fdW5sb2NrKCZzYl9sb2NrKTsKKwkJCWRvd25fcmVhZCgmcy0+c191bW91bnQpOworCQkJaWYgKHMtPnNfcm9vdCkKKwkJCQlyZXR1cm4gczsKKwkJCWRyb3Bfc3VwZXIocyk7CisJCQlnb3RvIHJlc2NhbjsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmc2JfbG9jayk7CisJcmV0dXJuIE5VTEw7Cit9CisKK0VYUE9SVF9TWU1CT0woZ2V0X3N1cGVyKTsKKyAKK3N0cnVjdCBzdXBlcl9ibG9jayAqIHVzZXJfZ2V0X3N1cGVyKGRldl90IGRldikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCityZXNjYW46CisJc3Bpbl9sb2NrKCZzYl9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoKHAsICZzdXBlcl9ibG9ja3MpIHsKKwkJc3RydWN0IHN1cGVyX2Jsb2NrICpzID0gc2JfZW50cnkocCk7CisJCWlmIChzLT5zX2RldiA9PSAgZGV2KSB7CisJCQlzLT5zX2NvdW50Kys7CisJCQlzcGluX3VubG9jaygmc2JfbG9jayk7CisJCQlkb3duX3JlYWQoJnMtPnNfdW1vdW50KTsKKwkJCWlmIChzLT5zX3Jvb3QpCisJCQkJcmV0dXJuIHM7CisJCQlkcm9wX3N1cGVyKHMpOworCQkJZ290byByZXNjYW47CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJnNiX2xvY2spOworCXJldHVybiBOVUxMOworfQorCitFWFBPUlRfU1lNQk9MKHVzZXJfZ2V0X3N1cGVyKTsKKworYXNtbGlua2FnZSBsb25nIHN5c191c3RhdCh1bnNpZ25lZCBkZXYsIHN0cnVjdCB1c3RhdCBfX3VzZXIgKiB1YnVmKQoreworICAgICAgICBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnM7CisgICAgICAgIHN0cnVjdCB1c3RhdCB0bXA7CisgICAgICAgIHN0cnVjdCBrc3RhdGZzIHNidWY7CisJaW50IGVyciA9IC1FSU5WQUw7CisKKyAgICAgICAgcyA9IHVzZXJfZ2V0X3N1cGVyKG5ld19kZWNvZGVfZGV2KGRldikpOworICAgICAgICBpZiAocyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OworCWVyciA9IHZmc19zdGF0ZnMocywgJnNidWYpOworCWRyb3Bfc3VwZXIocyk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKyAgICAgICAgbWVtc2V0KCZ0bXAsMCxzaXplb2Yoc3RydWN0IHVzdGF0KSk7CisgICAgICAgIHRtcC5mX3RmcmVlID0gc2J1Zi5mX2JmcmVlOworICAgICAgICB0bXAuZl90aW5vZGUgPSBzYnVmLmZfZmZyZWU7CisKKyAgICAgICAgZXJyID0gY29weV90b191c2VyKHVidWYsJnRtcCxzaXplb2Yoc3RydWN0IHVzdGF0KSkgPyAtRUZBVUxUIDogMDsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqCW1hcmtfZmlsZXNfcm8KKyAqCUBzYjogc3VwZXJibG9jayBpbiBxdWVzdGlvbgorICoKKyAqCUFsbCBmaWxlcyBhcmUgbWFya2VkIHJlYWQvb25seS4gIFdlIGRvbid0IGNhcmUgYWJvdXQgcGVuZGluZworICoJZGVsZXRlIGZpbGVzIHNvIHRoaXMgc2hvdWxkIGJlIHVzZWQgaW4gJ2ZvcmNlJyBtb2RlIG9ubHkKKyAqLworCitzdGF0aWMgdm9pZCBtYXJrX2ZpbGVzX3JvKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGZpbGUgKmY7CisKKwlmaWxlX2xpc3RfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZiwgJnNiLT5zX2ZpbGVzLCBmX2xpc3QpIHsKKwkJaWYgKFNfSVNSRUcoZi0+Zl9kZW50cnktPmRfaW5vZGUtPmlfbW9kZSkgJiYgZmlsZV9jb3VudChmKSkKKwkJCWYtPmZfbW9kZSAmPSB+Rk1PREVfV1JJVEU7CisJfQorCWZpbGVfbGlzdF91bmxvY2soKTsKK30KKworLyoqCisgKglkb19yZW1vdW50X3NiIC0gYXNrcyBmaWxlc3lzdGVtIHRvIGNoYW5nZSBtb3VudCBvcHRpb25zLgorICoJQHNiOglzdXBlcmJsb2NrIGluIHF1ZXN0aW9uCisgKglAZmxhZ3M6CW51bWVyaWMgcGFydCBvZiBvcHRpb25zCisgKglAZGF0YToJdGhlIHJlc3Qgb2Ygb3B0aW9ucworICogICAgICBAZm9yY2U6IHdoZXRoZXIgb3Igbm90IHRvIGZvcmNlIHRoZSBjaGFuZ2UKKyAqCisgKglBbHRlcnMgdGhlIG1vdW50IG9wdGlvbnMgb2YgYSBtb3VudGVkIGZpbGUgc3lzdGVtLgorICovCitpbnQgZG9fcmVtb3VudF9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgZmxhZ3MsIHZvaWQgKmRhdGEsIGludCBmb3JjZSkKK3sKKwlpbnQgcmV0dmFsOworCQorCWlmICghKGZsYWdzICYgTVNfUkRPTkxZKSAmJiBiZGV2X3JlYWRfb25seShzYi0+c19iZGV2KSkKKwkJcmV0dXJuIC1FQUNDRVM7CisJaWYgKGZsYWdzICYgTVNfUkRPTkxZKQorCQlhY2N0X2F1dG9fY2xvc2Uoc2IpOworCXNocmlua19kY2FjaGVfc2Ioc2IpOworCWZzeW5jX3N1cGVyKHNiKTsKKworCS8qIElmIHdlIGFyZSByZW1vdW50aW5nIFJET05MWSBhbmQgY3VycmVudCBzYiBpcyByZWFkL3dyaXRlLAorCSAgIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gcncgZmlsZXMgb3BlbmVkICovCisJaWYgKChmbGFncyAmIE1TX1JET05MWSkgJiYgIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJaWYgKGZvcmNlKQorCQkJbWFya19maWxlc19ybyhzYik7CisJCWVsc2UgaWYgKCFmc19tYXlfcmVtb3VudF9ybyhzYikpCisJCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmIChzYi0+c19vcC0+cmVtb3VudF9mcykgeworCQlsb2NrX3N1cGVyKHNiKTsKKwkJcmV0dmFsID0gc2ItPnNfb3AtPnJlbW91bnRfZnMoc2IsICZmbGFncywgZGF0YSk7CisJCXVubG9ja19zdXBlcihzYik7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCX0KKwlzYi0+c19mbGFncyA9IChzYi0+c19mbGFncyAmIH5NU19STVRfTUFTSykgfCAoZmxhZ3MgJiBNU19STVRfTUFTSyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRvX2VtZXJnZW5jeV9yZW1vdW50KHVuc2lnbmVkIGxvbmcgZm9vKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisKKwlzcGluX2xvY2soJnNiX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2IsICZzdXBlcl9ibG9ja3MsIHNfbGlzdCkgeworCQlzYi0+c19jb3VudCsrOworCQlzcGluX3VubG9jaygmc2JfbG9jayk7CisJCWRvd25fcmVhZCgmc2ItPnNfdW1vdW50KTsKKwkJaWYgKHNiLT5zX3Jvb3QgJiYgc2ItPnNfYmRldiAmJiAhKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQkJLyoKKwkJCSAqIC0+cmVtb3VudF9mcyBuZWVkcyBsb2NrX2tlcm5lbCgpLgorCQkJICoKKwkJCSAqIFdoYXQgbG9jayBwcm90ZWN0cyBzYi0+c19mbGFncz8/CisJCQkgKi8KKwkJCWxvY2tfa2VybmVsKCk7CisJCQlkb19yZW1vdW50X3NiKHNiLCBNU19SRE9OTFksIE5VTEwsIDEpOworCQkJdW5sb2NrX2tlcm5lbCgpOworCQl9CisJCWRyb3Bfc3VwZXIoc2IpOworCQlzcGluX2xvY2soJnNiX2xvY2spOworCX0KKwlzcGluX3VubG9jaygmc2JfbG9jayk7CisJcHJpbnRrKCJFbWVyZ2VuY3kgUmVtb3VudCBjb21wbGV0ZVxuIik7Cit9CisKK3ZvaWQgZW1lcmdlbmN5X3JlbW91bnQodm9pZCkKK3sKKwlwZGZsdXNoX29wZXJhdGlvbihkb19lbWVyZ2VuY3lfcmVtb3VudCwgMCk7Cit9CisKKy8qCisgKiBVbm5hbWVkIGJsb2NrIGRldmljZXMgYXJlIGR1bW15IGRldmljZXMgdXNlZCBieSB2aXJ0dWFsCisgKiBmaWxlc3lzdGVtcyB3aGljaCBkb24ndCB1c2UgcmVhbCBibG9jay1kZXZpY2VzLiAgLS0ganJzCisgKi8KKworc3RhdGljIHN0cnVjdCBpZHIgdW5uYW1lZF9kZXZfaWRyOworc3RhdGljIERFRklORV9TUElOTE9DSyh1bm5hbWVkX2Rldl9sb2NrKTsvKiBwcm90ZWN0cyB0aGUgYWJvdmUgKi8KKworaW50IHNldF9hbm9uX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqcywgdm9pZCAqZGF0YSkKK3sKKwlpbnQgZGV2OworCWludCBlcnJvcjsKKworIHJldHJ5OgorCWlmIChpZHJfcHJlX2dldCgmdW5uYW1lZF9kZXZfaWRyLCBHRlBfQVRPTUlDKSA9PSAwKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzcGluX2xvY2soJnVubmFtZWRfZGV2X2xvY2spOworCWVycm9yID0gaWRyX2dldF9uZXcoJnVubmFtZWRfZGV2X2lkciwgTlVMTCwgJmRldik7CisJc3Bpbl91bmxvY2soJnVubmFtZWRfZGV2X2xvY2spOworCWlmIChlcnJvciA9PSAtRUFHQUlOKQorCQkvKiBXZSByYWNlZCBhbmQgbG9zdCB3aXRoIGFub3RoZXIgQ1BVLiAqLworCQlnb3RvIHJldHJ5OworCWVsc2UgaWYgKGVycm9yKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCWlmICgoZGV2ICYgTUFYX0lEX01BU0spID09ICgxIDw8IE1JTk9SQklUUykpIHsKKwkJc3Bpbl9sb2NrKCZ1bm5hbWVkX2Rldl9sb2NrKTsKKwkJaWRyX3JlbW92ZSgmdW5uYW1lZF9kZXZfaWRyLCBkZXYpOworCQlzcGluX3VubG9jaygmdW5uYW1lZF9kZXZfbG9jayk7CisJCXJldHVybiAtRU1GSUxFOworCX0KKwlzLT5zX2RldiA9IE1LREVWKDAsIGRldiAmIE1JTk9STUFTSyk7CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woc2V0X2Fub25fc3VwZXIpOworCit2b2lkIGtpbGxfYW5vbl9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCWludCBzbG90ID0gTUlOT1Ioc2ItPnNfZGV2KTsKKworCWdlbmVyaWNfc2h1dGRvd25fc3VwZXIoc2IpOworCXNwaW5fbG9jaygmdW5uYW1lZF9kZXZfbG9jayk7CisJaWRyX3JlbW92ZSgmdW5uYW1lZF9kZXZfaWRyLCBzbG90KTsKKwlzcGluX3VubG9jaygmdW5uYW1lZF9kZXZfbG9jayk7Cit9CisKK0VYUE9SVF9TWU1CT0woa2lsbF9hbm9uX3N1cGVyKTsKKwordm9pZCBfX2luaXQgdW5uYW1lZF9kZXZfaW5pdCh2b2lkKQoreworCWlkcl9pbml0KCZ1bm5hbWVkX2Rldl9pZHIpOworfQorCit2b2lkIGtpbGxfbGl0dGVyX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJaWYgKHNiLT5zX3Jvb3QpCisJCWRfZ2Vub2NpZGUoc2ItPnNfcm9vdCk7CisJa2lsbF9hbm9uX3N1cGVyKHNiKTsKK30KKworRVhQT1JUX1NZTUJPTChraWxsX2xpdHRlcl9zdXBlcik7CisKK3N0YXRpYyBpbnQgc2V0X2JkZXZfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB2b2lkICpkYXRhKQoreworCXMtPnNfYmRldiA9IGRhdGE7CisJcy0+c19kZXYgPSBzLT5zX2JkZXYtPmJkX2RldjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZXN0X2JkZXZfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB2b2lkICpkYXRhKQoreworCXJldHVybiAodm9pZCAqKXMtPnNfYmRldiA9PSBkYXRhOworfQorCitzdGF0aWMgdm9pZCBiZGV2X3VldmVudChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBlbnVtIGtvYmplY3RfYWN0aW9uIGFjdGlvbikKK3sKKwlpZiAoYmRldi0+YmRfZGlzaykgeworCQlpZiAoYmRldi0+YmRfcGFydCkKKwkJCWtvYmplY3RfdWV2ZW50KCZiZGV2LT5iZF9wYXJ0LT5rb2JqLCBhY3Rpb24sIE5VTEwpOworCQllbHNlCisJCQlrb2JqZWN0X3VldmVudCgmYmRldi0+YmRfZGlzay0+a29iaiwgYWN0aW9uLCBOVUxMKTsKKwl9Cit9CisKK3N0cnVjdCBzdXBlcl9ibG9jayAqZ2V0X3NiX2JkZXYoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCBjb25zdCBjaGFyICpkZXZfbmFtZSwgdm9pZCAqZGF0YSwKKwlpbnQgKCpmaWxsX3N1cGVyKShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdm9pZCAqLCBpbnQpKQoreworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzOworCWludCBlcnJvciA9IDA7CisKKwliZGV2ID0gb3Blbl9iZGV2X2V4Y2woZGV2X25hbWUsIGZsYWdzLCBmc190eXBlKTsKKwlpZiAoSVNfRVJSKGJkZXYpKQorCQlyZXR1cm4gKHN0cnVjdCBzdXBlcl9ibG9jayAqKWJkZXY7CisKKwkvKgorCSAqIG9uY2UgdGhlIHN1cGVyIGlzIGluc2VydGVkIGludG8gdGhlIGxpc3QgYnkgc2dldCwgc191bW91bnQKKwkgKiB3aWxsIHByb3RlY3QgdGhlIGxvY2tmcyBjb2RlIGZyb20gdHJ5aW5nIHRvIHN0YXJ0IGEgc25hcHNob3QKKwkgKiB3aGlsZSB3ZSBhcmUgbW91bnRpbmcKKwkgKi8KKwlkb3duKCZiZGV2LT5iZF9tb3VudF9zZW0pOworCXMgPSBzZ2V0KGZzX3R5cGUsIHRlc3RfYmRldl9zdXBlciwgc2V0X2JkZXZfc3VwZXIsIGJkZXYpOworCXVwKCZiZGV2LT5iZF9tb3VudF9zZW0pOworCWlmIChJU19FUlIocykpCisJCWdvdG8gb3V0OworCisJaWYgKHMtPnNfcm9vdCkgeworCQlpZiAoKGZsYWdzIF4gcy0+c19mbGFncykgJiBNU19SRE9OTFkpIHsKKwkJCXVwX3dyaXRlKCZzLT5zX3Vtb3VudCk7CisJCQlkZWFjdGl2YXRlX3N1cGVyKHMpOworCQkJcyA9IEVSUl9QVFIoLUVCVVNZKTsKKwkJfQorCQlnb3RvIG91dDsKKwl9IGVsc2UgeworCQljaGFyIGJbQkRFVk5BTUVfU0laRV07CisKKwkJcy0+c19mbGFncyA9IGZsYWdzOworCQlzdHJsY3B5KHMtPnNfaWQsIGJkZXZuYW1lKGJkZXYsIGIpLCBzaXplb2Yocy0+c19pZCkpOworCQlzLT5zX29sZF9ibG9ja3NpemUgPSBibG9ja19zaXplKGJkZXYpOworCQlzYl9zZXRfYmxvY2tzaXplKHMsIHMtPnNfb2xkX2Jsb2Nrc2l6ZSk7CisJCWVycm9yID0gZmlsbF9zdXBlcihzLCBkYXRhLCBmbGFncyAmIE1TX1ZFUkJPU0UgPyAxIDogMCk7CisJCWlmIChlcnJvcikgeworCQkJdXBfd3JpdGUoJnMtPnNfdW1vdW50KTsKKwkJCWRlYWN0aXZhdGVfc3VwZXIocyk7CisJCQlzID0gRVJSX1BUUihlcnJvcik7CisJCX0gZWxzZSB7CisJCQlzLT5zX2ZsYWdzIHw9IE1TX0FDVElWRTsKKwkJCWJkZXZfdWV2ZW50KGJkZXYsIEtPQkpfTU9VTlQpOworCQl9CisJfQorCisJcmV0dXJuIHM7CisKK291dDoKKwljbG9zZV9iZGV2X2V4Y2woYmRldik7CisJcmV0dXJuIHM7Cit9CisKK0VYUE9SVF9TWU1CT0woZ2V0X3NiX2JkZXYpOworCit2b2lkIGtpbGxfYmxvY2tfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gc2ItPnNfYmRldjsKKworCWJkZXZfdWV2ZW50KGJkZXYsIEtPQkpfVU1PVU5UKTsKKwlnZW5lcmljX3NodXRkb3duX3N1cGVyKHNiKTsKKwlzeW5jX2Jsb2NrZGV2KGJkZXYpOworCWNsb3NlX2JkZXZfZXhjbChiZGV2KTsKK30KKworRVhQT1JUX1NZTUJPTChraWxsX2Jsb2NrX3N1cGVyKTsKKworc3RydWN0IHN1cGVyX2Jsb2NrICpnZXRfc2Jfbm9kZXYoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCB2b2lkICpkYXRhLAorCWludCAoKmZpbGxfc3VwZXIpKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB2b2lkICosIGludCkpCit7CisJaW50IGVycm9yOworCXN0cnVjdCBzdXBlcl9ibG9jayAqcyA9IHNnZXQoZnNfdHlwZSwgTlVMTCwgc2V0X2Fub25fc3VwZXIsIE5VTEwpOworCisJaWYgKElTX0VSUihzKSkKKwkJcmV0dXJuIHM7CisKKwlzLT5zX2ZsYWdzID0gZmxhZ3M7CisKKwllcnJvciA9IGZpbGxfc3VwZXIocywgZGF0YSwgZmxhZ3MgJiBNU19WRVJCT1NFID8gMSA6IDApOworCWlmIChlcnJvcikgeworCQl1cF93cml0ZSgmcy0+c191bW91bnQpOworCQlkZWFjdGl2YXRlX3N1cGVyKHMpOworCQlyZXR1cm4gRVJSX1BUUihlcnJvcik7CisJfQorCXMtPnNfZmxhZ3MgfD0gTVNfQUNUSVZFOworCXJldHVybiBzOworfQorCitFWFBPUlRfU1lNQk9MKGdldF9zYl9ub2Rldik7CisKK3N0YXRpYyBpbnQgY29tcGFyZV9zaW5nbGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzLCB2b2lkICpwKQoreworCXJldHVybiAxOworfQorCitzdHJ1Y3Qgc3VwZXJfYmxvY2sgKmdldF9zYl9zaW5nbGUoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJaW50IGZsYWdzLCB2b2lkICpkYXRhLAorCWludCAoKmZpbGxfc3VwZXIpKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB2b2lkICosIGludCkpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzOworCWludCBlcnJvcjsKKworCXMgPSBzZ2V0KGZzX3R5cGUsIGNvbXBhcmVfc2luZ2xlLCBzZXRfYW5vbl9zdXBlciwgTlVMTCk7CisJaWYgKElTX0VSUihzKSkKKwkJcmV0dXJuIHM7CisJaWYgKCFzLT5zX3Jvb3QpIHsKKwkJcy0+c19mbGFncyA9IGZsYWdzOworCQllcnJvciA9IGZpbGxfc3VwZXIocywgZGF0YSwgZmxhZ3MgJiBNU19WRVJCT1NFID8gMSA6IDApOworCQlpZiAoZXJyb3IpIHsKKwkJCXVwX3dyaXRlKCZzLT5zX3Vtb3VudCk7CisJCQlkZWFjdGl2YXRlX3N1cGVyKHMpOworCQkJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOworCQl9CisJCXMtPnNfZmxhZ3MgfD0gTVNfQUNUSVZFOworCX0KKwlkb19yZW1vdW50X3NiKHMsIGZsYWdzLCBkYXRhLCAwKTsKKwlyZXR1cm4gczsKK30KKworRVhQT1JUX1NZTUJPTChnZXRfc2Jfc2luZ2xlKTsKKworc3RydWN0IHZmc21vdW50ICoKK2RvX2tlcm5fbW91bnQoY29uc3QgY2hhciAqZnN0eXBlLCBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKnR5cGUgPSBnZXRfZnNfdHlwZShmc3R5cGUpOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBFUlJfUFRSKC1FTk9NRU0pOworCXN0cnVjdCB2ZnNtb3VudCAqbW50OworCWludCBlcnJvcjsKKwljaGFyICpzZWNkYXRhID0gTlVMTDsKKworCWlmICghdHlwZSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CisKKwltbnQgPSBhbGxvY192ZnNtbnQobmFtZSk7CisJaWYgKCFtbnQpCisJCWdvdG8gb3V0OworCisJaWYgKGRhdGEpIHsKKwkJc2VjZGF0YSA9IGFsbG9jX3NlY2RhdGEoKTsKKwkJaWYgKCFzZWNkYXRhKSB7CisJCQlzYiA9IEVSUl9QVFIoLUVOT01FTSk7CisJCQlnb3RvIG91dF9tbnQ7CisJCX0KKworCQllcnJvciA9IHNlY3VyaXR5X3NiX2NvcHlfZGF0YSh0eXBlLCBkYXRhLCBzZWNkYXRhKTsKKwkJaWYgKGVycm9yKSB7CisJCQlzYiA9IEVSUl9QVFIoZXJyb3IpOworCQkJZ290byBvdXRfZnJlZV9zZWNkYXRhOworCQl9CisJfQorCisJc2IgPSB0eXBlLT5nZXRfc2IodHlwZSwgZmxhZ3MsIG5hbWUsIGRhdGEpOworCWlmIChJU19FUlIoc2IpKQorCQlnb3RvIG91dF9mcmVlX3NlY2RhdGE7CisgCWVycm9yID0gc2VjdXJpdHlfc2Jfa2Vybl9tb3VudChzYiwgc2VjZGF0YSk7CisgCWlmIChlcnJvcikKKyAJCWdvdG8gb3V0X3NiOworCW1udC0+bW50X3NiID0gc2I7CisJbW50LT5tbnRfcm9vdCA9IGRnZXQoc2ItPnNfcm9vdCk7CisJbW50LT5tbnRfbW91bnRwb2ludCA9IHNiLT5zX3Jvb3Q7CisJbW50LT5tbnRfcGFyZW50ID0gbW50OworCW1udC0+bW50X25hbWVzcGFjZSA9IGN1cnJlbnQtPm5hbWVzcGFjZTsKKwl1cF93cml0ZSgmc2ItPnNfdW1vdW50KTsKKwlwdXRfZmlsZXN5c3RlbSh0eXBlKTsKKwlyZXR1cm4gbW50Oworb3V0X3NiOgorCXVwX3dyaXRlKCZzYi0+c191bW91bnQpOworCWRlYWN0aXZhdGVfc3VwZXIoc2IpOworCXNiID0gRVJSX1BUUihlcnJvcik7CitvdXRfZnJlZV9zZWNkYXRhOgorCWZyZWVfc2VjZGF0YShzZWNkYXRhKTsKK291dF9tbnQ6CisJZnJlZV92ZnNtbnQobW50KTsKK291dDoKKwlwdXRfZmlsZXN5c3RlbSh0eXBlKTsKKwlyZXR1cm4gKHN0cnVjdCB2ZnNtb3VudCAqKXNiOworfQorCitFWFBPUlRfU1lNQk9MX0dQTChkb19rZXJuX21vdW50KTsKKworc3RydWN0IHZmc21vdW50ICprZXJuX21vdW50KHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICp0eXBlKQoreworCXJldHVybiBkb19rZXJuX21vdW50KHR5cGUtPm5hbWUsIDAsIHR5cGUtPm5hbWUsIE5VTEwpOworfQorCitFWFBPUlRfU1lNQk9MKGtlcm5fbW91bnQpOwpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvTWFrZWZpbGUgYi9mcy9zeXNmcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTFjZWI5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvc3lzZnMvTWFrZWZpbGUKQEAgLTAsMCArMSw2IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgc3lzZnMgdmlydHVhbCBmaWxlc3lzdGVtCisjCisKK29iai15CQk6PSBpbm9kZS5vIGZpbGUubyBkaXIubyBzeW1saW5rLm8gbW91bnQubyBiaW4ubyBcCisJCSAgIGdyb3VwLm8KZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL2Jpbi5jIGIvZnMvc3lzZnMvYmluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRhYWE4OAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3N5c2ZzL2Jpbi5jCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogYmluLmMgLSBiaW5hcnkgZmlsZSBvcGVyYXRpb25zIGZvciBzeXNmcy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgUGF0cmljayBNb2NoZWwKKyAqIENvcHlyaWdodCAoYykgMjAwMyBNYXR0aGV3IFdpbGNveAorICogQ29weXJpZ2h0IChjKSAyMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4KKyAqLworCisjdW5kZWYgREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgInN5c2ZzLmgiCisKK3N0YXRpYyBpbnQKK2ZpbGxfcmVhZChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgKmJ1ZmZlciwgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBiaW5fYXR0cmlidXRlICogYXR0ciA9IHRvX2Jpbl9hdHRyKGRlbnRyeSk7CisJc3RydWN0IGtvYmplY3QgKiBrb2JqID0gdG9fa29iaihkZW50cnktPmRfcGFyZW50KTsKKworCWlmICghYXR0ci0+cmVhZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gYXR0ci0+cmVhZChrb2JqLCBidWZmZXIsIG9mZiwgY291bnQpOworfQorCitzdGF0aWMgc3NpemVfdAorcmVhZChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNoYXIgX191c2VyICogdXNlcmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBvZmYpCit7CisJY2hhciAqYnVmZmVyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbGUtPmZfZGVudHJ5OworCWludCBzaXplID0gZGVudHJ5LT5kX2lub2RlLT5pX3NpemU7CisJbG9mZl90IG9mZnMgPSAqb2ZmOworCWludCByZXQ7CisKKwlpZiAoY291bnQgPiBQQUdFX1NJWkUpCisJCWNvdW50ID0gUEFHRV9TSVpFOworCisJaWYgKHNpemUpIHsKKwkJaWYgKG9mZnMgPiBzaXplKQorCQkJcmV0dXJuIDA7CisJCWlmIChvZmZzICsgY291bnQgPiBzaXplKQorCQkJY291bnQgPSBzaXplIC0gb2ZmczsKKwl9CisKKwlyZXQgPSBmaWxsX3JlYWQoZGVudHJ5LCBidWZmZXIsIG9mZnMsIGNvdW50KTsKKwlpZiAocmV0IDwgMCkgCisJCXJldHVybiByZXQ7CisJY291bnQgPSByZXQ7CisKKwlpZiAoY29weV90b191c2VyKHVzZXJidWYsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXByX2RlYnVnKCJvZmZzID0gJWxsZCwgKm9mZiA9ICVsbGQsIGNvdW50ID0gJXpkXG4iLCBvZmZzLCAqb2ZmLCBjb3VudCk7CisKKwkqb2ZmID0gb2ZmcyArIGNvdW50OworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50CitmbHVzaF93cml0ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNoYXIgKmJ1ZmZlciwgbG9mZl90IG9mZnNldCwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyID0gdG9fYmluX2F0dHIoZGVudHJ5KTsKKwlzdHJ1Y3Qga29iamVjdCAqa29iaiA9IHRvX2tvYmooZGVudHJ5LT5kX3BhcmVudCk7CisKKwlpZiAoIWF0dHItPndyaXRlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBhdHRyLT53cml0ZShrb2JqLCBidWZmZXIsIG9mZnNldCwgY291bnQpOworfQorCitzdGF0aWMgc3NpemVfdCB3cml0ZShzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNvbnN0IGNoYXIgX191c2VyICogdXNlcmJ1ZiwKKwkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqIG9mZikKK3sKKwljaGFyICpidWZmZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJaW50IHNpemUgPSBkZW50cnktPmRfaW5vZGUtPmlfc2l6ZTsKKwlsb2ZmX3Qgb2ZmcyA9ICpvZmY7CisKKwlpZiAoY291bnQgPiBQQUdFX1NJWkUpCisJCWNvdW50ID0gUEFHRV9TSVpFOworCWlmIChzaXplKSB7CisJCWlmIChvZmZzID4gc2l6ZSkKKwkJCXJldHVybiAwOworCQlpZiAob2ZmcyArIGNvdW50ID4gc2l6ZSkKKwkJCWNvdW50ID0gc2l6ZSAtIG9mZnM7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZmZlciwgdXNlcmJ1ZiwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWNvdW50ID0gZmx1c2hfd3JpdGUoZGVudHJ5LCBidWZmZXIsIG9mZnMsIGNvdW50KTsKKwlpZiAoY291bnQgPiAwKQorCQkqb2ZmID0gb2ZmcyArIGNvdW50OworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBtbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX2Jpbl9hdHRyKGRlbnRyeSk7CisJc3RydWN0IGtvYmplY3QgKmtvYmogPSB0b19rb2JqKGRlbnRyeS0+ZF9wYXJlbnQpOworCisJaWYgKCFhdHRyLT5tbWFwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBhdHRyLT5tbWFwKGtvYmosIGF0dHIsIHZtYSk7Cit9CisKK3N0YXRpYyBpbnQgb3BlbihzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlKQoreworCXN0cnVjdCBrb2JqZWN0ICprb2JqID0gc3lzZnNfZ2V0X2tvYmplY3QoZmlsZS0+Zl9kZW50cnktPmRfcGFyZW50KTsKKwlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqIGF0dHIgPSB0b19iaW5fYXR0cihmaWxlLT5mX2RlbnRyeSk7CisJaW50IGVycm9yID0gLUVJTlZBTDsKKworCWlmICgha29iaiB8fCAhYXR0cikKKwkJZ290byBEb25lOworCisJLyogR3JhYiB0aGUgbW9kdWxlIHJlZmVyZW5jZSBmb3IgdGhpcyBhdHRyaWJ1dGUgaWYgd2UgaGF2ZSBvbmUgKi8KKwllcnJvciA9IC1FTk9ERVY7CisJaWYgKCF0cnlfbW9kdWxlX2dldChhdHRyLT5hdHRyLm93bmVyKSkgCisJCWdvdG8gRG9uZTsKKworCWVycm9yID0gLUVBQ0NFUzsKKwlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJiAhKGF0dHItPndyaXRlIHx8IGF0dHItPm1tYXApKQorCQlnb3RvIEVycm9yOworCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgJiYgIShhdHRyLT5yZWFkIHx8IGF0dHItPm1tYXApKQorCQlnb3RvIEVycm9yOworCisJZXJyb3IgPSAtRU5PTUVNOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZpbGUtPnByaXZhdGVfZGF0YSkKKwkJZ290byBFcnJvcjsKKworCWVycm9yID0gMDsKKyAgICBnb3RvIERvbmU7CisKKyBFcnJvcjoKKwltb2R1bGVfcHV0KGF0dHItPmF0dHIub3duZXIpOworIERvbmU6CisJaWYgKGVycm9yICYmIGtvYmopCisJCWtvYmplY3RfcHV0KGtvYmopOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCByZWxlYXNlKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBzdHJ1Y3QgZmlsZSAqIGZpbGUpCit7CisJc3RydWN0IGtvYmplY3QgKiBrb2JqID0gdG9fa29iaihmaWxlLT5mX2RlbnRyeS0+ZF9wYXJlbnQpOworCXN0cnVjdCBiaW5fYXR0cmlidXRlICogYXR0ciA9IHRvX2Jpbl9hdHRyKGZpbGUtPmZfZGVudHJ5KTsKKwl1OCAqIGJ1ZmZlciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWlmIChrb2JqKSAKKwkJa29iamVjdF9wdXQoa29iaik7CisJbW9kdWxlX3B1dChhdHRyLT5hdHRyLm93bmVyKTsKKwlrZnJlZShidWZmZXIpOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJpbl9mb3BzID0geworCS5yZWFkCQk9IHJlYWQsCisJLndyaXRlCQk9IHdyaXRlLAorCS5tbWFwCQk9IG1tYXAsCisJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAorCS5vcGVuCQk9IG9wZW4sCisJLnJlbGVhc2UJPSByZWxlYXNlLAorfTsKKworLyoqCisgKglzeXNmc19jcmVhdGVfYmluX2ZpbGUgLSBjcmVhdGUgYmluYXJ5IGZpbGUgZm9yIG9iamVjdC4KKyAqCUBrb2JqOglvYmplY3QuCisgKglAYXR0cjoJYXR0cmlidXRlIGRlc2NyaXB0b3IuCisgKgorICovCisKK2ludCBzeXNmc19jcmVhdGVfYmluX2ZpbGUoc3RydWN0IGtvYmplY3QgKiBrb2JqLCBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqIGF0dHIpCit7CisJQlVHX09OKCFrb2JqIHx8ICFrb2JqLT5kZW50cnkgfHwgIWF0dHIpOworCisJcmV0dXJuIHN5c2ZzX2FkZF9maWxlKGtvYmotPmRlbnRyeSwgJmF0dHItPmF0dHIsIFNZU0ZTX0tPQkpfQklOX0FUVFIpOworfQorCisKKy8qKgorICoJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlIC0gcmVtb3ZlIGJpbmFyeSBmaWxlIGZvciBvYmplY3QuCisgKglAa29iajoJb2JqZWN0LgorICoJQGF0dHI6CWF0dHJpYnV0ZSBkZXNjcmlwdG9yLgorICoKKyAqLworCitpbnQgc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKHN0cnVjdCBrb2JqZWN0ICoga29iaiwgc3RydWN0IGJpbl9hdHRyaWJ1dGUgKiBhdHRyKQoreworCXN5c2ZzX2hhc2hfYW5kX3JlbW92ZShrb2JqLT5kZW50cnksYXR0ci0+YXR0ci5uYW1lKTsKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwoc3lzZnNfY3JlYXRlX2Jpbl9maWxlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHN5c2ZzX3JlbW92ZV9iaW5fZmlsZSk7CmRpZmYgLS1naXQgYS9mcy9zeXNmcy9kaXIuYyBiL2ZzL3N5c2ZzL2Rpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMTk4MjEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9zeXNmcy9kaXIuYwpAQCAtMCwwICsxLDQ3NSBAQAorLyoKKyAqIGRpci5jIC0gT3BlcmF0aW9ucyBmb3Igc3lzZnMgZGlyZWN0b3JpZXMuCisgKi8KKworI3VuZGVmIERFQlVHCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgorI2luY2x1ZGUgInN5c2ZzLmgiCisKK0RFQ0xBUkVfUldTRU0oc3lzZnNfcmVuYW1lX3NlbSk7CisKK3N0YXRpYyB2b2lkIHN5c2ZzX2RfaXB1dChzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICogc2QgPSBkZW50cnktPmRfZnNkYXRhOworCisJaWYgKHNkKSB7CisJCUJVR19PTihzZC0+c19kZW50cnkgIT0gZGVudHJ5KTsKKwkJc2QtPnNfZGVudHJ5ID0gTlVMTDsKKwkJc3lzZnNfcHV0KHNkKTsKKwl9CisJaXB1dChpbm9kZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgc3lzZnNfZGVudHJ5X29wcyA9IHsKKwkuZF9pcHV0CQk9IHN5c2ZzX2RfaXB1dCwKK307CisKKy8qCisgKiBBbGxvY2F0ZXMgYSBuZXcgc3lzZnNfZGlyZW50IGFuZCBsaW5rcyBpdCB0byB0aGUgcGFyZW50IHN5c2ZzX2RpcmVudAorICovCitzdGF0aWMgc3RydWN0IHN5c2ZzX2RpcmVudCAqIHN5c2ZzX25ld19kaXJlbnQoc3RydWN0IHN5c2ZzX2RpcmVudCAqIHBhcmVudF9zZCwKKwkJCQkJCXZvaWQgKiBlbGVtZW50KQoreworCXN0cnVjdCBzeXNmc19kaXJlbnQgKiBzZDsKKworCXNkID0ga21lbV9jYWNoZV9hbGxvYyhzeXNmc19kaXJfY2FjaGVwLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNkKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbXNldChzZCwgMCwgc2l6ZW9mKCpzZCkpOworCWF0b21pY19zZXQoJnNkLT5zX2NvdW50LCAxKTsKKwlJTklUX0xJU1RfSEVBRCgmc2QtPnNfY2hpbGRyZW4pOworCWxpc3RfYWRkKCZzZC0+c19zaWJsaW5nLCAmcGFyZW50X3NkLT5zX2NoaWxkcmVuKTsKKwlzZC0+c19lbGVtZW50ID0gZWxlbWVudDsKKworCXJldHVybiBzZDsKK30KKworaW50IHN5c2ZzX21ha2VfZGlyZW50KHN0cnVjdCBzeXNmc19kaXJlbnQgKiBwYXJlbnRfc2QsIHN0cnVjdCBkZW50cnkgKiBkZW50cnksCisJCQl2b2lkICogZWxlbWVudCwgdW1vZGVfdCBtb2RlLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICogc2Q7CisKKwlzZCA9IHN5c2ZzX25ld19kaXJlbnQocGFyZW50X3NkLCBlbGVtZW50KTsKKwlpZiAoIXNkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNkLT5zX21vZGUgPSBtb2RlOworCXNkLT5zX3R5cGUgPSB0eXBlOworCXNkLT5zX2RlbnRyeSA9IGRlbnRyeTsKKwlpZiAoZGVudHJ5KSB7CisJCWRlbnRyeS0+ZF9mc2RhdGEgPSBzeXNmc19nZXQoc2QpOworCQlkZW50cnktPmRfb3AgPSAmc3lzZnNfZGVudHJ5X29wczsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbml0X2RpcihzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwlpbm9kZS0+aV9vcCA9ICZzeXNmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9mb3AgPSAmc3lzZnNfZGlyX29wZXJhdGlvbnM7CisKKwkvKiBkaXJlY3RvcnkgaW5vZGVzIHN0YXJ0IG9mZiB3aXRoIGlfbmxpbmsgPT0gMiAoZm9yICIuIiBlbnRyeSkgKi8KKwlpbm9kZS0+aV9ubGluaysrOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGluaXRfZmlsZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwlpbm9kZS0+aV9zaXplID0gUEFHRV9TSVpFOworCWlub2RlLT5pX2ZvcCA9ICZzeXNmc19maWxlX29wZXJhdGlvbnM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9zeW1saW5rKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCWlub2RlLT5pX29wID0gJnN5c2ZzX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjcmVhdGVfZGlyKHN0cnVjdCBrb2JqZWN0ICogaywgc3RydWN0IGRlbnRyeSAqIHAsCisJCSAgICAgIGNvbnN0IGNoYXIgKiBuLCBzdHJ1Y3QgZGVudHJ5ICoqIGQpCit7CisJaW50IGVycm9yOworCXVtb2RlX3QgbW9kZSA9IFNfSUZESVJ8IFNfSVJXWFUgfCBTX0lSVUdPIHwgU19JWFVHTzsKKworCWRvd24oJnAtPmRfaW5vZGUtPmlfc2VtKTsKKwkqZCA9IHN5c2ZzX2dldF9kZW50cnkocCxuKTsKKwlpZiAoIUlTX0VSUigqZCkpIHsKKwkJZXJyb3IgPSBzeXNmc19jcmVhdGUoKmQsIG1vZGUsIGluaXRfZGlyKTsKKwkJaWYgKCFlcnJvcikgeworCQkJZXJyb3IgPSBzeXNmc19tYWtlX2RpcmVudChwLT5kX2ZzZGF0YSwgKmQsIGssIG1vZGUsCisJCQkJCQlTWVNGU19ESVIpOworCQkJaWYgKCFlcnJvcikgeworCQkJCXAtPmRfaW5vZGUtPmlfbmxpbmsrKzsKKwkJCQkoKmQpLT5kX29wID0gJnN5c2ZzX2RlbnRyeV9vcHM7CisJCQkJZF9yZWhhc2goKmQpOworCQkJfQorCQl9CisJCWlmIChlcnJvciAmJiAoZXJyb3IgIT0gLUVFWElTVCkpCisJCQlkX2Ryb3AoKmQpOworCQlkcHV0KCpkKTsKKwl9IGVsc2UKKwkJZXJyb3IgPSBQVFJfRVJSKCpkKTsKKwl1cCgmcC0+ZF9pbm9kZS0+aV9zZW0pOworCXJldHVybiBlcnJvcjsKK30KKworCitpbnQgc3lzZnNfY3JlYXRlX3N1YmRpcihzdHJ1Y3Qga29iamVjdCAqIGssIGNvbnN0IGNoYXIgKiBuLCBzdHJ1Y3QgZGVudHJ5ICoqIGQpCit7CisJcmV0dXJuIGNyZWF0ZV9kaXIoayxrLT5kZW50cnksbixkKTsKK30KKworLyoqCisgKglzeXNmc19jcmVhdGVfZGlyIC0gY3JlYXRlIGEgZGlyZWN0b3J5IGZvciBhbiBvYmplY3QuCisgKglAcGFyZW50OglwYXJlbnQgcGFyZW50IG9iamVjdC4KKyAqCUBrb2JqOgkJb2JqZWN0IHdlJ3JlIGNyZWF0aW5nIGRpcmVjdG9yeSBmb3IuIAorICovCisKK2ludCBzeXNmc19jcmVhdGVfZGlyKHN0cnVjdCBrb2JqZWN0ICoga29iaikKK3sKKwlzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5ID0gTlVMTDsKKwlzdHJ1Y3QgZGVudHJ5ICogcGFyZW50OworCWludCBlcnJvciA9IDA7CisKKwlCVUdfT04oIWtvYmopOworCisJaWYgKGtvYmotPnBhcmVudCkKKwkJcGFyZW50ID0ga29iai0+cGFyZW50LT5kZW50cnk7CisJZWxzZSBpZiAoc3lzZnNfbW91bnQgJiYgc3lzZnNfbW91bnQtPm1udF9zYikKKwkJcGFyZW50ID0gc3lzZnNfbW91bnQtPm1udF9zYi0+c19yb290OworCWVsc2UKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwllcnJvciA9IGNyZWF0ZV9kaXIoa29iaixwYXJlbnQsa29iamVjdF9uYW1lKGtvYmopLCZkZW50cnkpOworCWlmICghZXJyb3IpCisJCWtvYmotPmRlbnRyeSA9IGRlbnRyeTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qIGF0dGFjaGVzIGF0dHJpYnV0ZSdzIHN5c2ZzX2RpcmVudCB0byB0aGUgZGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgKiBhdHRyaWJ1dGUgZmlsZQorICovCitzdGF0aWMgaW50IHN5c2ZzX2F0dGFjaF9hdHRyKHN0cnVjdCBzeXNmc19kaXJlbnQgKiBzZCwgc3RydWN0IGRlbnRyeSAqIGRlbnRyeSkKK3sKKwlzdHJ1Y3QgYXR0cmlidXRlICogYXR0ciA9IE5VTEw7CisJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKiBiaW5fYXR0ciA9IE5VTEw7CisJaW50ICgqIGluaXQpIChzdHJ1Y3QgaW5vZGUgKikgPSBOVUxMOworCWludCBlcnJvciA9IDA7CisKKyAgICAgICAgaWYgKHNkLT5zX3R5cGUgJiBTWVNGU19LT0JKX0JJTl9BVFRSKSB7CisgICAgICAgICAgICAgICAgYmluX2F0dHIgPSBzZC0+c19lbGVtZW50OworICAgICAgICAgICAgICAgIGF0dHIgPSAmYmluX2F0dHItPmF0dHI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXR0ciA9IHNkLT5zX2VsZW1lbnQ7CisgICAgICAgICAgICAgICAgaW5pdCA9IGluaXRfZmlsZTsKKyAgICAgICAgfQorCisJZXJyb3IgPSBzeXNmc19jcmVhdGUoZGVudHJ5LCAoYXR0ci0+bW9kZSAmIFNfSUFMTFVHTykgfCBTX0lGUkVHLCBpbml0KTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworICAgICAgICBpZiAoYmluX2F0dHIpIHsKKwkJZGVudHJ5LT5kX2lub2RlLT5pX3NpemUgPSBiaW5fYXR0ci0+c2l6ZTsKKwkJZGVudHJ5LT5kX2lub2RlLT5pX2ZvcCA9ICZiaW5fZm9wczsKKwl9CisJZGVudHJ5LT5kX29wID0gJnN5c2ZzX2RlbnRyeV9vcHM7CisJZGVudHJ5LT5kX2ZzZGF0YSA9IHN5c2ZzX2dldChzZCk7CisJc2QtPnNfZGVudHJ5ID0gZGVudHJ5OworCWRfcmVoYXNoKGRlbnRyeSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzeXNmc19hdHRhY2hfbGluayhzdHJ1Y3Qgc3lzZnNfZGlyZW50ICogc2QsIHN0cnVjdCBkZW50cnkgKiBkZW50cnkpCit7CisJaW50IGVyciA9IDA7CisKKwllcnIgPSBzeXNmc19jcmVhdGUoZGVudHJ5LCBTX0lGTE5LfFNfSVJXWFVHTywgaW5pdF9zeW1saW5rKTsKKwlpZiAoIWVycikgeworCQlkZW50cnktPmRfb3AgPSAmc3lzZnNfZGVudHJ5X29wczsKKwkJZGVudHJ5LT5kX2ZzZGF0YSA9IHN5c2ZzX2dldChzZCk7CisJCXNkLT5zX2RlbnRyeSA9IGRlbnRyeTsKKwkJZF9yZWhhc2goZGVudHJ5KTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKiBzeXNmc19sb29rdXAoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwkJCQlzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICogcGFyZW50X3NkID0gZGVudHJ5LT5kX3BhcmVudC0+ZF9mc2RhdGE7CisJc3RydWN0IHN5c2ZzX2RpcmVudCAqIHNkOworCWludCBlcnIgPSAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzZCwgJnBhcmVudF9zZC0+c19jaGlsZHJlbiwgc19zaWJsaW5nKSB7CisJCWlmIChzZC0+c190eXBlICYgU1lTRlNfTk9UX1BJTk5FRCkgeworCQkJY29uc3QgdW5zaWduZWQgY2hhciAqIG5hbWUgPSBzeXNmc19nZXRfbmFtZShzZCk7CisKKwkJCWlmIChzdHJjbXAobmFtZSwgZGVudHJ5LT5kX25hbWUubmFtZSkpCisJCQkJY29udGludWU7CisKKwkJCWlmIChzZC0+c190eXBlICYgU1lTRlNfS09CSl9MSU5LKQorCQkJCWVyciA9IHN5c2ZzX2F0dGFjaF9saW5rKHNkLCBkZW50cnkpOworCQkJZWxzZQorCQkJCWVyciA9IHN5c2ZzX2F0dGFjaF9hdHRyKHNkLCBkZW50cnkpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBzeXNmc19kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkubG9va3VwCQk9IHN5c2ZzX2xvb2t1cCwKK307CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9kaXIoc3RydWN0IGRlbnRyeSAqIGQpCit7CisJc3RydWN0IGRlbnRyeSAqIHBhcmVudCA9IGRnZXQoZC0+ZF9wYXJlbnQpOworCXN0cnVjdCBzeXNmc19kaXJlbnQgKiBzZDsKKworCWRvd24oJnBhcmVudC0+ZF9pbm9kZS0+aV9zZW0pOworCWRfZGVsZXRlKGQpOworCXNkID0gZC0+ZF9mc2RhdGE7CisgCWxpc3RfZGVsX2luaXQoJnNkLT5zX3NpYmxpbmcpOworCXN5c2ZzX3B1dChzZCk7CisJaWYgKGQtPmRfaW5vZGUpCisJCXNpbXBsZV9ybWRpcihwYXJlbnQtPmRfaW5vZGUsZCk7CisKKwlwcl9kZWJ1ZygiIG8gJXMgcmVtb3ZpbmcgZG9uZSAoJWQpXG4iLGQtPmRfbmFtZS5uYW1lLAorCQkgYXRvbWljX3JlYWQoJmQtPmRfY291bnQpKTsKKworCXVwKCZwYXJlbnQtPmRfaW5vZGUtPmlfc2VtKTsKKwlkcHV0KHBhcmVudCk7Cit9CisKK3ZvaWQgc3lzZnNfcmVtb3ZlX3N1YmRpcihzdHJ1Y3QgZGVudHJ5ICogZCkKK3sKKwlyZW1vdmVfZGlyKGQpOworfQorCisKKy8qKgorICoJc3lzZnNfcmVtb3ZlX2RpciAtIHJlbW92ZSBhbiBvYmplY3QncyBkaXJlY3RvcnkuCisgKglAa29iajoJb2JqZWN0LiAKKyAqCisgKglUaGUgb25seSB0aGluZyBzcGVjaWFsIGFib3V0IHRoaXMgaXMgdGhhdCB3ZSByZW1vdmUgYW55IGZpbGVzIGluIAorICoJdGhlIGRpcmVjdG9yeSBiZWZvcmUgd2UgcmVtb3ZlIHRoZSBkaXJlY3RvcnksIGFuZCB3ZSd2ZSBpbmxpbmVkCisgKgl3aGF0IHVzZWQgdG8gYmUgc3lzZnNfcm1kaXIoKSBiZWxvdywgaW5zdGVhZCBvZiBjYWxsaW5nIHNlcGFyYXRlbHkuCisgKi8KKwordm9pZCBzeXNmc19yZW1vdmVfZGlyKHN0cnVjdCBrb2JqZWN0ICoga29iaikKK3sKKwlzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5ID0gZGdldChrb2JqLT5kZW50cnkpOworCXN0cnVjdCBzeXNmc19kaXJlbnQgKiBwYXJlbnRfc2Q7CisJc3RydWN0IHN5c2ZzX2RpcmVudCAqIHNkLCAqIHRtcDsKKworCWlmICghZGVudHJ5KQorCQlyZXR1cm47CisKKwlwcl9kZWJ1Zygic3lzZnMgJXM6IHJlbW92aW5nIGRpclxuIixkZW50cnktPmRfbmFtZS5uYW1lKTsKKwlkb3duKCZkZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwlwYXJlbnRfc2QgPSBkZW50cnktPmRfZnNkYXRhOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzZCwgdG1wLCAmcGFyZW50X3NkLT5zX2NoaWxkcmVuLCBzX3NpYmxpbmcpIHsKKwkJaWYgKCFzZC0+c19lbGVtZW50IHx8ICEoc2QtPnNfdHlwZSAmIFNZU0ZTX05PVF9QSU5ORUQpKQorCQkJY29udGludWU7CisJCWxpc3RfZGVsX2luaXQoJnNkLT5zX3NpYmxpbmcpOworCQlzeXNmc19kcm9wX2RlbnRyeShzZCwgZGVudHJ5KTsKKwkJc3lzZnNfcHV0KHNkKTsKKwl9CisJdXAoJmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCisJcmVtb3ZlX2RpcihkZW50cnkpOworCS8qKgorCSAqIERyb3AgcmVmZXJlbmNlIGZyb20gZGdldCgpIG9uIGVudHJhbmNlLgorCSAqLworCWRwdXQoZGVudHJ5KTsKK30KKworaW50IHN5c2ZzX3JlbmFtZV9kaXIoc3RydWN0IGtvYmplY3QgKiBrb2JqLCBjb25zdCBjaGFyICpuZXdfbmFtZSkKK3sKKwlpbnQgZXJyb3IgPSAwOworCXN0cnVjdCBkZW50cnkgKiBuZXdfZGVudHJ5LCAqIHBhcmVudDsKKworCWlmICghc3RyY21wKGtvYmplY3RfbmFtZShrb2JqKSwgbmV3X25hbWUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgha29iai0+cGFyZW50KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRvd25fd3JpdGUoJnN5c2ZzX3JlbmFtZV9zZW0pOworCXBhcmVudCA9IGtvYmotPnBhcmVudC0+ZGVudHJ5OworCisJZG93bigmcGFyZW50LT5kX2lub2RlLT5pX3NlbSk7CisKKwluZXdfZGVudHJ5ID0gc3lzZnNfZ2V0X2RlbnRyeShwYXJlbnQsIG5ld19uYW1lKTsKKwlpZiAoIUlTX0VSUihuZXdfZGVudHJ5KSkgeworICAJCWlmICghbmV3X2RlbnRyeS0+ZF9pbm9kZSkgeworCQkJZXJyb3IgPSBrb2JqZWN0X3NldF9uYW1lKGtvYmosICIlcyIsIG5ld19uYW1lKTsKKwkJCWlmICghZXJyb3IpIHsKKwkJCQlkX2FkZChuZXdfZGVudHJ5LCBOVUxMKTsKKwkJCQlkX21vdmUoa29iai0+ZGVudHJ5LCBuZXdfZGVudHJ5KTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlkX2Ryb3AobmV3X2RlbnRyeSk7CisJCX0gZWxzZQorCQkJZXJyb3IgPSAtRUVYSVNUOworCQlkcHV0KG5ld19kZW50cnkpOworCX0KKwl1cCgmcGFyZW50LT5kX2lub2RlLT5pX3NlbSk7CQorCXVwX3dyaXRlKCZzeXNmc19yZW5hbWVfc2VtKTsKKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBzeXNmc19kaXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisJc3RydWN0IHN5c2ZzX2RpcmVudCAqIHBhcmVudF9zZCA9IGRlbnRyeS0+ZF9mc2RhdGE7CisKKwlkb3duKCZkZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBzeXNmc19uZXdfZGlyZW50KHBhcmVudF9zZCwgTlVMTCk7CisJdXAoJmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCisJcmV0dXJuIGZpbGUtPnByaXZhdGVfZGF0YSA/IDAgOiAtRU5PTUVNOworCit9CisKK3N0YXRpYyBpbnQgc3lzZnNfZGlyX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBkZW50cnkgKiBkZW50cnkgPSBmaWxlLT5mX2RlbnRyeTsKKwlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICogY3Vyc29yID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJZG93bigmZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJbGlzdF9kZWxfaW5pdCgmY3Vyc29yLT5zX3NpYmxpbmcpOworCXVwKCZkZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKworCXJlbGVhc2Vfc3lzZnNfZGlyZW50KGN1cnNvcik7CisKKwlyZXR1cm4gMDsKK30KKworLyogUmVsYXRpb25zaGlwIGJldHdlZW4gc19tb2RlIGFuZCB0aGUgRFRfeHh4IHR5cGVzICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgZHRfdHlwZShzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZCkKK3sKKwlyZXR1cm4gKHNkLT5zX21vZGUgPj4gMTIpICYgMTU7Cit9CisKK3N0YXRpYyBpbnQgc3lzZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqIGZpbHAsIHZvaWQgKiBkaXJlbnQsIGZpbGxkaXJfdCBmaWxsZGlyKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IGZpbHAtPmZfZGVudHJ5OworCXN0cnVjdCBzeXNmc19kaXJlbnQgKiBwYXJlbnRfc2QgPSBkZW50cnktPmRfZnNkYXRhOworCXN0cnVjdCBzeXNmc19kaXJlbnQgKmN1cnNvciA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqcSA9ICZjdXJzb3ItPnNfc2libGluZzsKKwlpbm9fdCBpbm87CisJaW50IGkgPSBmaWxwLT5mX3BvczsKKworCXN3aXRjaCAoaSkgeworCQljYXNlIDA6CisJCQlpbm8gPSBkZW50cnktPmRfaW5vZGUtPmlfaW5vOworCQkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLiIsIDEsIGksIGlubywgRFRfRElSKSA8IDApCisJCQkJYnJlYWs7CisJCQlmaWxwLT5mX3BvcysrOworCQkJaSsrOworCQkJLyogZmFsbHRocm91Z2ggKi8KKwkJY2FzZSAxOgorCQkJaW5vID0gcGFyZW50X2lubyhkZW50cnkpOworCQkJaWYgKGZpbGxkaXIoZGlyZW50LCAiLi4iLCAyLCBpLCBpbm8sIERUX0RJUikgPCAwKQorCQkJCWJyZWFrOworCQkJZmlscC0+Zl9wb3MrKzsKKwkJCWkrKzsKKwkJCS8qIGZhbGx0aHJvdWdoICovCisJCWRlZmF1bHQ6CisJCQlpZiAoZmlscC0+Zl9wb3MgPT0gMikgeworCQkJCWxpc3RfZGVsKHEpOworCQkJCWxpc3RfYWRkKHEsICZwYXJlbnRfc2QtPnNfY2hpbGRyZW4pOworCQkJfQorCQkJZm9yIChwPXEtPm5leHQ7IHAhPSAmcGFyZW50X3NkLT5zX2NoaWxkcmVuOyBwPXAtPm5leHQpIHsKKwkJCQlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpuZXh0OworCQkJCWNvbnN0IGNoYXIgKiBuYW1lOworCQkJCWludCBsZW47CisKKwkJCQluZXh0ID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qgc3lzZnNfZGlyZW50LAorCQkJCQkJICAgc19zaWJsaW5nKTsKKwkJCQlpZiAoIW5leHQtPnNfZWxlbWVudCkKKwkJCQkJY29udGludWU7CisKKwkJCQluYW1lID0gc3lzZnNfZ2V0X25hbWUobmV4dCk7CisJCQkJbGVuID0gc3RybGVuKG5hbWUpOworCQkJCWlmIChuZXh0LT5zX2RlbnRyeSkKKwkJCQkJaW5vID0gbmV4dC0+c19kZW50cnktPmRfaW5vZGUtPmlfaW5vOworCQkJCWVsc2UKKwkJCQkJaW5vID0gaXVuaXF1ZShzeXNmc19zYiwgMik7CisKKwkJCQlpZiAoZmlsbGRpcihkaXJlbnQsIG5hbWUsIGxlbiwgZmlscC0+Zl9wb3MsIGlubywKKwkJCQkJCSBkdF90eXBlKG5leHQpKSA8IDApCisJCQkJCXJldHVybiAwOworCisJCQkJbGlzdF9kZWwocSk7CisJCQkJbGlzdF9hZGQocSwgcCk7CisJCQkJcCA9IHE7CisJCQkJZmlscC0+Zl9wb3MrKzsKKwkJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBsb2ZmX3Qgc3lzZnNfZGlyX2xzZWVrKHN0cnVjdCBmaWxlICogZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWdpbikKK3sKKwlzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5ID0gZmlsZS0+Zl9kZW50cnk7CisKKwlkb3duKCZkZW50cnktPmRfaW5vZGUtPmlfc2VtKTsKKwlzd2l0Y2ggKG9yaWdpbikgeworCQljYXNlIDE6CisJCQlvZmZzZXQgKz0gZmlsZS0+Zl9wb3M7CisJCWNhc2UgMDoKKwkJCWlmIChvZmZzZXQgPj0gMCkKKwkJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXVwKCZmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChvZmZzZXQgIT0gZmlsZS0+Zl9wb3MpIHsKKwkJZmlsZS0+Zl9wb3MgPSBvZmZzZXQ7CisJCWlmIChmaWxlLT5mX3BvcyA+PSAyKSB7CisJCQlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZCA9IGRlbnRyeS0+ZF9mc2RhdGE7CisJCQlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpjdXJzb3IgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJCQlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCQkJbG9mZl90IG4gPSBmaWxlLT5mX3BvcyAtIDI7CisKKwkJCWxpc3RfZGVsKCZjdXJzb3ItPnNfc2libGluZyk7CisJCQlwID0gc2QtPnNfY2hpbGRyZW4ubmV4dDsKKwkJCXdoaWxlIChuICYmIHAgIT0gJnNkLT5zX2NoaWxkcmVuKSB7CisJCQkJc3RydWN0IHN5c2ZzX2RpcmVudCAqbmV4dDsKKwkJCQluZXh0ID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3Qgc3lzZnNfZGlyZW50LAorCQkJCQkJICAgc19zaWJsaW5nKTsKKwkJCQlpZiAobmV4dC0+c19lbGVtZW50KQorCQkJCQluLS07CisJCQkJcCA9IHAtPm5leHQ7CisJCQl9CisJCQlsaXN0X2FkZF90YWlsKCZjdXJzb3ItPnNfc2libGluZywgcCk7CisJCX0KKwl9CisJdXAoJmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCXJldHVybiBvZmZzZXQ7Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3lzZnNfZGlyX29wZXJhdGlvbnMgPSB7CisJLm9wZW4JCT0gc3lzZnNfZGlyX29wZW4sCisJLnJlbGVhc2UJPSBzeXNmc19kaXJfY2xvc2UsCisJLmxsc2VlawkJPSBzeXNmc19kaXJfbHNlZWssCisJLnJlYWQJCT0gZ2VuZXJpY19yZWFkX2RpciwKKwkucmVhZGRpcgk9IHN5c2ZzX3JlYWRkaXIsCit9OworCitFWFBPUlRfU1lNQk9MX0dQTChzeXNmc19jcmVhdGVfZGlyKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHN5c2ZzX3JlbW92ZV9kaXIpOworRVhQT1JUX1NZTUJPTF9HUEwoc3lzZnNfcmVuYW1lX2Rpcik7CisKZGlmZiAtLWdpdCBhL2ZzL3N5c2ZzL2ZpbGUuYyBiL2ZzL3N5c2ZzL2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTJmOTY2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvc3lzZnMvZmlsZS5jCkBAIC0wLDAgKzEsNDQ3IEBACisvKgorICogZmlsZS5jIC0gb3BlcmF0aW9ucyBmb3IgcmVndWxhciAodGV4dCkgZmlsZXMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Rub3RpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKyNpbmNsdWRlICJzeXNmcy5oIgorCisjZGVmaW5lIHRvX3N1YnN5cyhrKSBjb250YWluZXJfb2YoayxzdHJ1Y3Qgc3Vic3lzdGVtLGtzZXQua29iaikKKyNkZWZpbmUgdG9fc2F0dHIoYSkgY29udGFpbmVyX29mKGEsc3RydWN0IHN1YnN5c19hdHRyaWJ1dGUsYXR0cikKKworLyoqCisgKiBTdWJzeXN0ZW0gZmlsZSBvcGVyYXRpb25zLgorICogVGhlc2Ugb3BlcmF0aW9ucyBhbGxvdyBzdWJzeXN0ZW1zIHRvIGhhdmUgZmlsZXMgdGhhdCBjYW4gYmUgCisgKiByZWFkL3dyaXR0ZW4uIAorICovCitzdGF0aWMgc3NpemVfdCAKK3N1YnN5c19hdHRyX3Nob3coc3RydWN0IGtvYmplY3QgKiBrb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICogYXR0ciwgY2hhciAqIHBhZ2UpCit7CisJc3RydWN0IHN1YnN5c3RlbSAqIHMgPSB0b19zdWJzeXMoa29iaik7CisJc3RydWN0IHN1YnN5c19hdHRyaWJ1dGUgKiBzYXR0ciA9IHRvX3NhdHRyKGF0dHIpOworCXNzaXplX3QgcmV0ID0gMDsKKworCWlmIChzYXR0ci0+c2hvdykKKwkJcmV0ID0gc2F0dHItPnNob3cocyxwYWdlKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCAKK3N1YnN5c19hdHRyX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICoga29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqIGF0dHIsIAorCQkgIGNvbnN0IGNoYXIgKiBwYWdlLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHN1YnN5c3RlbSAqIHMgPSB0b19zdWJzeXMoa29iaik7CisJc3RydWN0IHN1YnN5c19hdHRyaWJ1dGUgKiBzYXR0ciA9IHRvX3NhdHRyKGF0dHIpOworCXNzaXplX3QgcmV0ID0gMDsKKworCWlmIChzYXR0ci0+c3RvcmUpCisJCXJldCA9IHNhdHRyLT5zdG9yZShzLHBhZ2UsY291bnQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZnNfb3BzIHN1YnN5c19zeXNmc19vcHMgPSB7CisJLnNob3cJPSBzdWJzeXNfYXR0cl9zaG93LAorCS5zdG9yZQk9IHN1YnN5c19hdHRyX3N0b3JlLAorfTsKKworCitzdHJ1Y3Qgc3lzZnNfYnVmZmVyIHsKKwlzaXplX3QJCQljb3VudDsKKwlsb2ZmX3QJCQlwb3M7CisJY2hhcgkJCSogcGFnZTsKKwlzdHJ1Y3Qgc3lzZnNfb3BzCSogb3BzOworCXN0cnVjdCBzZW1hcGhvcmUJc2VtOworCWludAkJCW5lZWRzX3JlYWRfZmlsbDsKK307CisKKworLyoqCisgKglmaWxsX3JlYWRfYnVmZmVyIC0gYWxsb2NhdGUgYW5kIGZpbGwgYnVmZmVyIGZyb20gb2JqZWN0LgorICoJQGRlbnRyeToJZGVudHJ5IHBvaW50ZXIuCisgKglAYnVmZmVyOglkYXRhIGJ1ZmZlciBmb3IgZmlsZS4KKyAqCisgKglBbGxvY2F0ZSBAYnVmZmVyLT5wYWdlLCBpZiBpdCBoYXNuJ3QgYmVlbiBhbHJlYWR5LCB0aGVuIGNhbGwgdGhlCisgKglrb2JqZWN0J3Mgc2hvdygpIG1ldGhvZCB0byBmaWxsIHRoZSBidWZmZXIgd2l0aCB0aGlzIGF0dHJpYnV0ZSdzIAorICoJZGF0YS4gCisgKglUaGlzIGlzIGNhbGxlZCBvbmx5IG9uY2UsIG9uIHRoZSBmaWxlJ3MgZmlyc3QgcmVhZC4gCisgKi8KK3N0YXRpYyBpbnQgZmlsbF9yZWFkX2J1ZmZlcihzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBzdHJ1Y3Qgc3lzZnNfYnVmZmVyICogYnVmZmVyKQoreworCXN0cnVjdCBhdHRyaWJ1dGUgKiBhdHRyID0gdG9fYXR0cihkZW50cnkpOworCXN0cnVjdCBrb2JqZWN0ICoga29iaiA9IHRvX2tvYmooZGVudHJ5LT5kX3BhcmVudCk7CisJc3RydWN0IHN5c2ZzX29wcyAqIG9wcyA9IGJ1ZmZlci0+b3BzOworCWludCByZXQgPSAwOworCXNzaXplX3QgY291bnQ7CisKKwlpZiAoIWJ1ZmZlci0+cGFnZSkKKwkJYnVmZmVyLT5wYWdlID0gKGNoYXIgKikgZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWlmICghYnVmZmVyLT5wYWdlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNvdW50ID0gb3BzLT5zaG93KGtvYmosYXR0cixidWZmZXItPnBhZ2UpOworCWJ1ZmZlci0+bmVlZHNfcmVhZF9maWxsID0gMDsKKwlCVUdfT04oY291bnQgPiAoc3NpemVfdClQQUdFX1NJWkUpOworCWlmIChjb3VudCA+PSAwKQorCQlidWZmZXItPmNvdW50ID0gY291bnQ7CisJZWxzZQorCQlyZXQgPSBjb3VudDsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qKgorICoJZmx1c2hfcmVhZF9idWZmZXIgLSBwdXNoIGJ1ZmZlciB0byB1c2Vyc3BhY2UuCisgKglAYnVmZmVyOglkYXRhIGJ1ZmZlciBmb3IgZmlsZS4KKyAqCUB1c2VyYnVmOgl1c2VyLXBhc3NlZCBidWZmZXIuCisgKglAY291bnQ6CQludW1iZXIgb2YgYnl0ZXMgcmVxdWVzdGVkLgorICoJQHBwb3M6CQlmaWxlIHBvc2l0aW9uLgorICoKKyAqCUNvcHkgdGhlIGJ1ZmZlciB3ZSBmaWxsZWQgaW4gZmlsbF9yZWFkX2J1ZmZlcigpIHRvIHVzZXJzcGFjZS4KKyAqCVRoaXMgaXMgZG9uZSBhdCB0aGUgcmVhZGVyJ3MgbGVpc3VyZSwgY29weWluZyBhbmQgYWR2YW5jaW5nIAorICoJdGhlIGFtb3VudCB0aGV5IHNwZWNpZnkgZWFjaCB0aW1lLgorICoJVGhpcyBtYXkgYmUgY2FsbGVkIGNvbnRpbnVvdXNseSB1bnRpbCB0aGUgYnVmZmVyIGlzIGVtcHR5LgorICovCitzdGF0aWMgaW50IGZsdXNoX3JlYWRfYnVmZmVyKHN0cnVjdCBzeXNmc19idWZmZXIgKiBidWZmZXIsIGNoYXIgX191c2VyICogYnVmLAorCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCit7CisJaW50IGVycm9yOworCisJaWYgKCpwcG9zID4gYnVmZmVyLT5jb3VudCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoY291bnQgPiAoYnVmZmVyLT5jb3VudCAtICpwcG9zKSkKKwkJY291bnQgPSBidWZmZXItPmNvdW50IC0gKnBwb3M7CisKKwllcnJvciA9IGNvcHlfdG9fdXNlcihidWYsYnVmZmVyLT5wYWdlICsgKnBwb3MsY291bnQpOworCWlmICghZXJyb3IpCisJCSpwcG9zICs9IGNvdW50OworCXJldHVybiBlcnJvciA/IC1FRkFVTFQgOiBjb3VudDsKK30KKworLyoqCisgKglzeXNmc19yZWFkX2ZpbGUgLSByZWFkIGFuIGF0dHJpYnV0ZS4gCisgKglAZmlsZToJZmlsZSBwb2ludGVyLgorICoJQGJ1ZjoJYnVmZmVyIHRvIGZpbGwuCisgKglAY291bnQ6CW51bWJlciBvZiBieXRlcyB0byByZWFkLgorICoJQHBwb3M6CXN0YXJ0aW5nIG9mZnNldCBpbiBmaWxlLgorICoKKyAqCVVzZXJzcGFjZSB3YW50cyB0byByZWFkIGFuIGF0dHJpYnV0ZSBmaWxlLiBUaGUgYXR0cmlidXRlIGRlc2NyaXB0b3IKKyAqCWlzIGluIHRoZSBmaWxlJ3MgLT5kX2ZzZGF0YS4gVGhlIHRhcmdldCBvYmplY3QgaXMgaW4gdGhlIGRpcmVjdG9yeSdzCisgKgktPmRfZnNkYXRhLgorICoKKyAqCVdlIGNhbGwgZmlsbF9yZWFkX2J1ZmZlcigpIHRvIGFsbG9jYXRlIGFuZCBmaWxsIHRoZSBidWZmZXIgZnJvbSB0aGUKKyAqCW9iamVjdCdzIHNob3coKSBtZXRob2QgZXhhY3RseSBvbmNlIChpZiB0aGUgcmVhZCBpcyBoYXBwZW5pbmcgZnJvbQorICoJdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSkuIFRoYXQgc2hvdWxkIGZpbGwgdGhlIGVudGlyZSBidWZmZXIgd2l0aAorICoJYWxsIHRoZSBkYXRhIHRoZSBvYmplY3QgaGFzIHRvIG9mZmVyIGZvciB0aGF0IGF0dHJpYnV0ZS4KKyAqCVdlIHRoZW4gY2FsbCBmbHVzaF9yZWFkX2J1ZmZlcigpIHRvIGNvcHkgdGhlIGJ1ZmZlciB0byB1c2Vyc3BhY2UKKyAqCWluIHRoZSBpbmNyZW1lbnRzIHNwZWNpZmllZC4KKyAqLworCitzdGF0aWMgc3NpemVfdAorc3lzZnNfcmVhZF9maWxlKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3Qgc3lzZnNfYnVmZmVyICogYnVmZmVyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNzaXplX3QgcmV0dmFsID0gMDsKKworCWRvd24oJmJ1ZmZlci0+c2VtKTsKKwlpZiAoYnVmZmVyLT5uZWVkc19yZWFkX2ZpbGwpIHsKKwkJaWYgKChyZXR2YWwgPSBmaWxsX3JlYWRfYnVmZmVyKGZpbGUtPmZfZGVudHJ5LGJ1ZmZlcikpKQorCQkJZ290byBvdXQ7CisJfQorCXByX2RlYnVnKCIlczogY291bnQgPSAlZCwgcHBvcyA9ICVsbGQsIGJ1ZiA9ICVzXG4iLAorCQkgX19GVU5DVElPTl9fLGNvdW50LCpwcG9zLGJ1ZmZlci0+cGFnZSk7CisJcmV0dmFsID0gZmx1c2hfcmVhZF9idWZmZXIoYnVmZmVyLGJ1Zixjb3VudCxwcG9zKTsKK291dDoKKwl1cCgmYnVmZmVyLT5zZW0pOworCXJldHVybiByZXR2YWw7Cit9CisKKworLyoqCisgKglmaWxsX3dyaXRlX2J1ZmZlciAtIGNvcHkgYnVmZmVyIGZyb20gdXNlcnNwYWNlLgorICoJQGJ1ZmZlcjoJZGF0YSBidWZmZXIgZm9yIGZpbGUuCisgKglAdXNlcmJ1ZjoJZGF0YSBmcm9tIHVzZXIuCisgKglAY291bnQ6CQludW1iZXIgb2YgYnl0ZXMgaW4gQHVzZXJidWYuCisgKgorICoJQWxsb2NhdGUgQGJ1ZmZlci0+cGFnZSBpZiBpdCBoYXNuJ3QgYmVlbiBhbHJlYWR5LCB0aGVuCisgKgljb3B5IHRoZSB1c2VyLXN1cHBsaWVkIGJ1ZmZlciBpbnRvIGl0LgorICovCisKK3N0YXRpYyBpbnQgCitmaWxsX3dyaXRlX2J1ZmZlcihzdHJ1Y3Qgc3lzZnNfYnVmZmVyICogYnVmZmVyLCBjb25zdCBjaGFyIF9fdXNlciAqIGJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCBlcnJvcjsKKworCWlmICghYnVmZmVyLT5wYWdlKQorCQlidWZmZXItPnBhZ2UgPSAoY2hhciAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZmZlci0+cGFnZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoY291bnQgPj0gUEFHRV9TSVpFKQorCQljb3VudCA9IFBBR0VfU0laRSAtIDE7CisJZXJyb3IgPSBjb3B5X2Zyb21fdXNlcihidWZmZXItPnBhZ2UsYnVmLGNvdW50KTsKKwlidWZmZXItPm5lZWRzX3JlYWRfZmlsbCA9IDE7CisJcmV0dXJuIGVycm9yID8gLUVGQVVMVCA6IGNvdW50OworfQorCisKKy8qKgorICoJZmx1c2hfd3JpdGVfYnVmZmVyIC0gcHVzaCBidWZmZXIgdG8ga29iamVjdC4KKyAqCUBmaWxlOgkJZmlsZSBwb2ludGVyLgorICoJQGJ1ZmZlcjoJZGF0YSBidWZmZXIgZm9yIGZpbGUuCisgKgorICoJR2V0IHRoZSBjb3JyZWN0IHBvaW50ZXJzIGZvciB0aGUga29iamVjdCBhbmQgdGhlIGF0dHJpYnV0ZSB3ZSdyZQorICoJZGVhbGluZyB3aXRoLCB0aGVuIGNhbGwgdGhlIHN0b3JlKCkgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlLCAKKyAqCXBhc3NpbmcgdGhlIGJ1ZmZlciB0aGF0IHdlIGFjcXVpcmVkIGluIGZpbGxfd3JpdGVfYnVmZmVyKCkuCisgKi8KKworc3RhdGljIGludCAKK2ZsdXNoX3dyaXRlX2J1ZmZlcihzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBzdHJ1Y3Qgc3lzZnNfYnVmZmVyICogYnVmZmVyLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGF0dHJpYnV0ZSAqIGF0dHIgPSB0b19hdHRyKGRlbnRyeSk7CisJc3RydWN0IGtvYmplY3QgKiBrb2JqID0gdG9fa29iaihkZW50cnktPmRfcGFyZW50KTsKKwlzdHJ1Y3Qgc3lzZnNfb3BzICogb3BzID0gYnVmZmVyLT5vcHM7CisKKwlyZXR1cm4gb3BzLT5zdG9yZShrb2JqLGF0dHIsYnVmZmVyLT5wYWdlLGNvdW50KTsKK30KKworCisvKioKKyAqCXN5c2ZzX3dyaXRlX2ZpbGUgLSB3cml0ZSBhbiBhdHRyaWJ1dGUuCisgKglAZmlsZToJZmlsZSBwb2ludGVyCisgKglAYnVmOglkYXRhIHRvIHdyaXRlCisgKglAY291bnQ6CW51bWJlciBvZiBieXRlcworICoJQHBwb3M6CXN0YXJ0aW5nIG9mZnNldAorICoKKyAqCVNpbWlsYXIgdG8gc3lzZnNfcmVhZF9maWxlKCksIHRob3VnaCB3b3JraW5nIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24uCisgKglXZSBhbGxvY2F0ZSBhbmQgZmlsbCB0aGUgZGF0YSBmcm9tIHRoZSB1c2VyIGluIGZpbGxfd3JpdGVfYnVmZmVyKCksCisgKgl0aGVuIHB1c2ggaXQgdG8gdGhlIGtvYmplY3QgaW4gZmx1c2hfd3JpdGVfYnVmZmVyKCkuCisgKglUaGVyZSBpcyBubyBlYXN5IHdheSBmb3IgdXMgdG8ga25vdyBpZiB1c2Vyc3BhY2UgaXMgb25seSBkb2luZyBhIHBhcnRpYWwKKyAqCXdyaXRlLCBzbyB3ZSBkb24ndCBzdXBwb3J0IHRoZW0uIFdlIGV4cGVjdCB0aGUgZW50aXJlIGJ1ZmZlciB0byBjb21lCisgKglvbiB0aGUgZmlyc3Qgd3JpdGUuIAorICoJSGludDogaWYgeW91J3JlIHdyaXRpbmcgYSB2YWx1ZSwgZmlyc3QgcmVhZCB0aGUgZmlsZSwgbW9kaWZ5IG9ubHkgdGhlCisgKgl0aGUgdmFsdWUgeW91J3JlIGNoYW5naW5nLCB0aGVuIHdyaXRlIGVudGlyZSBidWZmZXIgYmFjay4gCisgKi8KKworc3RhdGljIHNzaXplX3QKK3N5c2ZzX3dyaXRlX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBzeXNmc19idWZmZXIgKiBidWZmZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3NpemVfdCBsZW47CisKKwlkb3duKCZidWZmZXItPnNlbSk7CisJbGVuID0gZmlsbF93cml0ZV9idWZmZXIoYnVmZmVyLCBidWYsIGNvdW50KTsKKwlpZiAobGVuID4gMCkKKwkJbGVuID0gZmx1c2hfd3JpdGVfYnVmZmVyKGZpbGUtPmZfZGVudHJ5LCBidWZmZXIsIGxlbik7CisJaWYgKGxlbiA+IDApCisJCSpwcG9zICs9IGxlbjsKKwl1cCgmYnVmZmVyLT5zZW0pOworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfcGVybShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlKQoreworCXN0cnVjdCBrb2JqZWN0ICprb2JqID0gc3lzZnNfZ2V0X2tvYmplY3QoZmlsZS0+Zl9kZW50cnktPmRfcGFyZW50KTsKKwlzdHJ1Y3QgYXR0cmlidXRlICogYXR0ciA9IHRvX2F0dHIoZmlsZS0+Zl9kZW50cnkpOworCXN0cnVjdCBzeXNmc19idWZmZXIgKiBidWZmZXI7CisJc3RydWN0IHN5c2ZzX29wcyAqIG9wcyA9IE5VTEw7CisJaW50IGVycm9yID0gMDsKKworCWlmICgha29iaiB8fCAhYXR0cikKKwkJZ290byBFaW52YWw7CisKKwkvKiBHcmFiIHRoZSBtb2R1bGUgcmVmZXJlbmNlIGZvciB0aGlzIGF0dHJpYnV0ZSBpZiB3ZSBoYXZlIG9uZSAqLworCWlmICghdHJ5X21vZHVsZV9nZXQoYXR0ci0+b3duZXIpKSB7CisJCWVycm9yID0gLUVOT0RFVjsKKwkJZ290byBEb25lOworCX0KKworCS8qIGlmIHRoZSBrb2JqZWN0IGhhcyBubyBrdHlwZSwgdGhlbiB3ZSBhc3N1bWUgdGhhdCBpdCBpcyBhIHN1YnN5c3RlbQorCSAqIGl0c2VsZiwgYW5kIHVzZSBvcHMgZm9yIGl0LgorCSAqLworCWlmIChrb2JqLT5rc2V0ICYmIGtvYmotPmtzZXQtPmt0eXBlKQorCQlvcHMgPSBrb2JqLT5rc2V0LT5rdHlwZS0+c3lzZnNfb3BzOworCWVsc2UgaWYgKGtvYmotPmt0eXBlKQorCQlvcHMgPSBrb2JqLT5rdHlwZS0+c3lzZnNfb3BzOworCWVsc2UKKwkJb3BzID0gJnN1YnN5c19zeXNmc19vcHM7CisKKwkvKiBObyBzeXNmcyBvcGVyYXRpb25zLCBlaXRoZXIgZnJvbSBoYXZpbmcgbm8gc3Vic3lzdGVtLAorCSAqIG9yIHRoZSBzdWJzeXN0ZW0gaGF2ZSBubyBvcGVyYXRpb25zLgorCSAqLworCWlmICghb3BzKQorCQlnb3RvIEVhY2Nlc3M7CisKKwkvKiBGaWxlIG5lZWRzIHdyaXRlIHN1cHBvcnQuCisJICogVGhlIGlub2RlJ3MgcGVybXMgbXVzdCBzYXkgaXQncyBvaywgCisJICogYW5kIHdlIG11c3QgaGF2ZSBhIHN0b3JlIG1ldGhvZC4KKwkgKi8KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKworCQlpZiAoIShpbm9kZS0+aV9tb2RlICYgU19JV1VHTykgfHwgIW9wcy0+c3RvcmUpCisJCQlnb3RvIEVhY2Nlc3M7CisKKwl9CisKKwkvKiBGaWxlIG5lZWRzIHJlYWQgc3VwcG9ydC4KKwkgKiBUaGUgaW5vZGUncyBwZXJtcyBtdXN0IHNheSBpdCdzIG9rLCBhbmQgd2UgdGhlcmUKKwkgKiBtdXN0IGJlIGEgc2hvdyBtZXRob2QgZm9yIGl0LgorCSAqLworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCWlmICghKGlub2RlLT5pX21vZGUgJiBTX0lSVUdPKSB8fCAhb3BzLT5zaG93KQorCQkJZ290byBFYWNjZXNzOworCX0KKworCS8qIE5vIGVycm9yPyBHcmVhdCwgYWxsb2NhdGUgYSBidWZmZXIgZm9yIHRoZSBmaWxlLCBhbmQgc3RvcmUgaXQKKwkgKiBpdCBpbiBmaWxlLT5wcml2YXRlX2RhdGEgZm9yIGVhc3kgYWNjZXNzLgorCSAqLworCWJ1ZmZlciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzeXNmc19idWZmZXIpLEdGUF9LRVJORUwpOworCWlmIChidWZmZXIpIHsKKwkJbWVtc2V0KGJ1ZmZlciwwLHNpemVvZihzdHJ1Y3Qgc3lzZnNfYnVmZmVyKSk7CisJCWluaXRfTVVURVgoJmJ1ZmZlci0+c2VtKTsKKwkJYnVmZmVyLT5uZWVkc19yZWFkX2ZpbGwgPSAxOworCQlidWZmZXItPm9wcyA9IG9wczsKKwkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gYnVmZmVyOworCX0gZWxzZQorCQllcnJvciA9IC1FTk9NRU07CisJZ290byBEb25lOworCisgRWludmFsOgorCWVycm9yID0gLUVJTlZBTDsKKwlnb3RvIERvbmU7CisgRWFjY2VzczoKKwllcnJvciA9IC1FQUNDRVM7CisJbW9kdWxlX3B1dChhdHRyLT5vd25lcik7CisgRG9uZToKKwlpZiAoZXJyb3IgJiYga29iaikKKwkJa29iamVjdF9wdXQoa29iaik7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IHN5c2ZzX29wZW5fZmlsZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCXJldHVybiBjaGVja19wZXJtKGlub2RlLGZpbHApOworfQorCitzdGF0aWMgaW50IHN5c2ZzX3JlbGVhc2Uoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCBmaWxlICogZmlscCkKK3sKKwlzdHJ1Y3Qga29iamVjdCAqIGtvYmogPSB0b19rb2JqKGZpbHAtPmZfZGVudHJ5LT5kX3BhcmVudCk7CisJc3RydWN0IGF0dHJpYnV0ZSAqIGF0dHIgPSB0b19hdHRyKGZpbHAtPmZfZGVudHJ5KTsKKwlzdHJ1Y3QgbW9kdWxlICogb3duZXIgPSBhdHRyLT5vd25lcjsKKwlzdHJ1Y3Qgc3lzZnNfYnVmZmVyICogYnVmZmVyID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCisJaWYgKGtvYmopIAorCQlrb2JqZWN0X3B1dChrb2JqKTsKKwkvKiBBZnRlciB0aGlzIHBvaW50LCBhdHRyIHNob3VsZCBub3QgYmUgYWNjZXNzZWQuICovCisJbW9kdWxlX3B1dChvd25lcik7CisKKwlpZiAoYnVmZmVyKSB7CisJCWlmIChidWZmZXItPnBhZ2UpCisJCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpYnVmZmVyLT5wYWdlKTsKKwkJa2ZyZWUoYnVmZmVyKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3lzZnNfZmlsZV9vcGVyYXRpb25zID0geworCS5yZWFkCQk9IHN5c2ZzX3JlYWRfZmlsZSwKKwkud3JpdGUJCT0gc3lzZnNfd3JpdGVfZmlsZSwKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLm9wZW4JCT0gc3lzZnNfb3Blbl9maWxlLAorCS5yZWxlYXNlCT0gc3lzZnNfcmVsZWFzZSwKK307CisKKworaW50IHN5c2ZzX2FkZF9maWxlKHN0cnVjdCBkZW50cnkgKiBkaXIsIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKiBhdHRyLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICogcGFyZW50X3NkID0gZGlyLT5kX2ZzZGF0YTsKKwl1bW9kZV90IG1vZGUgPSAoYXR0ci0+bW9kZSAmIFNfSUFMTFVHTykgfCBTX0lGUkVHOworCWludCBlcnJvciA9IDA7CisKKwlkb3duKCZkaXItPmRfaW5vZGUtPmlfc2VtKTsKKwllcnJvciA9IHN5c2ZzX21ha2VfZGlyZW50KHBhcmVudF9zZCwgTlVMTCwgKHZvaWQgKikgYXR0ciwgbW9kZSwgdHlwZSk7CisJdXAoJmRpci0+ZF9pbm9kZS0+aV9zZW0pOworCisJcmV0dXJuIGVycm9yOworfQorCisKKy8qKgorICoJc3lzZnNfY3JlYXRlX2ZpbGUgLSBjcmVhdGUgYW4gYXR0cmlidXRlIGZpbGUgZm9yIGFuIG9iamVjdC4KKyAqCUBrb2JqOglvYmplY3Qgd2UncmUgY3JlYXRpbmcgZm9yLiAKKyAqCUBhdHRyOglhdHJyaWJ1dGUgZGVzY3JpcHRvci4KKyAqLworCitpbnQgc3lzZnNfY3JlYXRlX2ZpbGUoc3RydWN0IGtvYmplY3QgKiBrb2JqLCBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICogYXR0cikKK3sKKwlCVUdfT04oIWtvYmogfHwgIWtvYmotPmRlbnRyeSB8fCAhYXR0cik7CisKKwlyZXR1cm4gc3lzZnNfYWRkX2ZpbGUoa29iai0+ZGVudHJ5LCBhdHRyLCBTWVNGU19LT0JKX0FUVFIpOworCit9CisKKworLyoqCisgKiBzeXNmc191cGRhdGVfZmlsZSAtIHVwZGF0ZSB0aGUgbW9kaWZpZWQgdGltZXN0YW1wIG9uIGFuIG9iamVjdCBhdHRyaWJ1dGUuCisgKiBAa29iajogb2JqZWN0IHdlJ3JlIGFjdGluZyBmb3IuCisgKiBAYXR0cjogYXR0cmlidXRlIGRlc2NyaXB0b3IuCisgKgorICogQWxzbyBjYWxsIGRub3RpZnkgZm9yIHRoZSBkZW50cnksIHdoaWNoIGxvdHMgb2YgdXNlcnNwYWNlIHByb2dyYW1zCisgKiB1c2UuCisgKi8KK2ludCBzeXNmc191cGRhdGVfZmlsZShzdHJ1Y3Qga29iamVjdCAqIGtvYmosIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKiBhdHRyKQoreworCXN0cnVjdCBkZW50cnkgKiBkaXIgPSBrb2JqLT5kZW50cnk7CisJc3RydWN0IGRlbnRyeSAqIHZpY3RpbTsKKwlpbnQgcmVzID0gLUVOT0VOVDsKKworCWRvd24oJmRpci0+ZF9pbm9kZS0+aV9zZW0pOworCXZpY3RpbSA9IHN5c2ZzX2dldF9kZW50cnkoZGlyLCBhdHRyLT5uYW1lKTsKKwlpZiAoIUlTX0VSUih2aWN0aW0pKSB7CisJCS8qIG1ha2Ugc3VyZSBkZW50cnkgaXMgcmVhbGx5IHRoZXJlICovCisJCWlmICh2aWN0aW0tPmRfaW5vZGUgJiYgCisJCSAgICAodmljdGltLT5kX3BhcmVudC0+ZF9pbm9kZSA9PSBkaXItPmRfaW5vZGUpKSB7CisJCQl2aWN0aW0tPmRfaW5vZGUtPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUU7CisJCQlkbm90aWZ5X3BhcmVudCh2aWN0aW0sIEROX01PRElGWSk7CisKKwkJCS8qKgorCQkJICogRHJvcCByZWZlcmVuY2UgZnJvbSBpbml0aWFsIHN5c2ZzX2dldF9kZW50cnkoKS4KKwkJCSAqLworCQkJZHB1dCh2aWN0aW0pOworCQkJcmVzID0gMDsKKwkJfSBlbHNlCisJCQlkX2Ryb3AodmljdGltKTsKKwkJCisJCS8qKgorCQkgKiBEcm9wIHRoZSByZWZlcmVuY2UgYWNxdWlyZWQgZnJvbSBzeXNmc19nZXRfZGVudHJ5KCkgYWJvdmUuCisJCSAqLworCQlkcHV0KHZpY3RpbSk7CisJfQorCXVwKCZkaXItPmRfaW5vZGUtPmlfc2VtKTsKKworCXJldHVybiByZXM7Cit9CisKKworLyoqCisgKglzeXNmc19yZW1vdmVfZmlsZSAtIHJlbW92ZSBhbiBvYmplY3QgYXR0cmlidXRlLgorICoJQGtvYmo6CW9iamVjdCB3ZSdyZSBhY3RpbmcgZm9yLgorICoJQGF0dHI6CWF0dHJpYnV0ZSBkZXNjcmlwdG9yLgorICoKKyAqCUhhc2ggdGhlIGF0dHJpYnV0ZSBuYW1lIGFuZCBraWxsIHRoZSB2aWN0aW0uCisgKi8KKwordm9pZCBzeXNmc19yZW1vdmVfZmlsZShzdHJ1Y3Qga29iamVjdCAqIGtvYmosIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKiBhdHRyKQoreworCXN5c2ZzX2hhc2hfYW5kX3JlbW92ZShrb2JqLT5kZW50cnksYXR0ci0+bmFtZSk7Cit9CisKKworRVhQT1JUX1NZTUJPTF9HUEwoc3lzZnNfY3JlYXRlX2ZpbGUpOworRVhQT1JUX1NZTUJPTF9HUEwoc3lzZnNfcmVtb3ZlX2ZpbGUpOworRVhQT1JUX1NZTUJPTF9HUEwoc3lzZnNfdXBkYXRlX2ZpbGUpOworCmRpZmYgLS1naXQgYS9mcy9zeXNmcy9ncm91cC5jIGIvZnMvc3lzZnMvZ3JvdXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTFhYzVlCi0tLSAvZGV2L251bGwKKysrIGIvZnMvc3lzZnMvZ3JvdXAuYwpAQCAtMCwwICsxLDg0IEBACisvKgorICogZnMvc3lzZnMvZ3JvdXAuYyAtIE9wZXJhdGlvbnMgZm9yIGFkZGluZy9yZW1vdmluZyBtdWx0aXBsZSBmaWxlcyBhdCBvbmNlLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBQYXRyaWNrIE1vY2hlbAorICogQ29weXJpZ2h0IChjKSAyMDAzIE9wZW4gU291cmNlIERldmVsb3BtZW50IExhYgorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlcnQgdGhlIEdQTCB2Mi4gCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSAic3lzZnMuaCIKKworCitzdGF0aWMgdm9pZCByZW1vdmVfZmlsZXMoc3RydWN0IGRlbnRyeSAqIGRpciwgCisJCQkgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqIGdycCkKK3sKKwlzdHJ1Y3QgYXR0cmlidXRlICpjb25zdCogYXR0cjsKKworCWZvciAoYXR0ciA9IGdycC0+YXR0cnM7ICphdHRyOyBhdHRyKyspCisJCXN5c2ZzX2hhc2hfYW5kX3JlbW92ZShkaXIsKCphdHRyKS0+bmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgY3JlYXRlX2ZpbGVzKHN0cnVjdCBkZW50cnkgKiBkaXIsCisJCQljb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICogZ3JwKQoreworCXN0cnVjdCBhdHRyaWJ1dGUgKmNvbnN0KiBhdHRyOworCWludCBlcnJvciA9IDA7CisKKwlmb3IgKGF0dHIgPSBncnAtPmF0dHJzOyAqYXR0ciAmJiAhZXJyb3I7IGF0dHIrKykgeworCQllcnJvciA9IHN5c2ZzX2FkZF9maWxlKGRpciwgKmF0dHIsIFNZU0ZTX0tPQkpfQVRUUik7CisJfQorCWlmIChlcnJvcikKKwkJcmVtb3ZlX2ZpbGVzKGRpcixncnApOworCXJldHVybiBlcnJvcjsKK30KKworCitpbnQgc3lzZnNfY3JlYXRlX2dyb3VwKHN0cnVjdCBrb2JqZWN0ICoga29iaiwgCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICogZ3JwKQoreworCXN0cnVjdCBkZW50cnkgKiBkaXI7CisJaW50IGVycm9yOworCisJQlVHX09OKCFrb2JqIHx8ICFrb2JqLT5kZW50cnkpOworCisJaWYgKGdycC0+bmFtZSkgeworCQllcnJvciA9IHN5c2ZzX2NyZWF0ZV9zdWJkaXIoa29iaixncnAtPm5hbWUsJmRpcik7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwl9IGVsc2UKKwkJZGlyID0ga29iai0+ZGVudHJ5OworCWRpciA9IGRnZXQoZGlyKTsKKwlpZiAoKGVycm9yID0gY3JlYXRlX2ZpbGVzKGRpcixncnApKSkgeworCQlpZiAoZ3JwLT5uYW1lKQorCQkJc3lzZnNfcmVtb3ZlX3N1YmRpcihkaXIpOworCX0KKwlkcHV0KGRpcik7CisJcmV0dXJuIGVycm9yOworfQorCit2b2lkIHN5c2ZzX3JlbW92ZV9ncm91cChzdHJ1Y3Qga29iamVjdCAqIGtvYmosIAorCQkJY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqIGdycCkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICogZGlyOworCisJaWYgKGdycC0+bmFtZSkKKwkJZGlyID0gc3lzZnNfZ2V0X2RlbnRyeShrb2JqLT5kZW50cnksZ3JwLT5uYW1lKTsKKwllbHNlCisJCWRpciA9IGRnZXQoa29iai0+ZGVudHJ5KTsKKworCXJlbW92ZV9maWxlcyhkaXIsZ3JwKTsKKwlpZiAoZ3JwLT5uYW1lKQorCQlzeXNmc19yZW1vdmVfc3ViZGlyKGRpcik7CisJLyogcmVsZWFzZSB0aGUgcmVmLiB0YWtlbiBpbiB0aGlzIHJvdXRpbmUgKi8KKwlkcHV0KGRpcik7Cit9CisKKworRVhQT1JUX1NZTUJPTF9HUEwoc3lzZnNfY3JlYXRlX2dyb3VwKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHN5c2ZzX3JlbW92ZV9ncm91cCk7CmRpZmYgLS1naXQgYS9mcy9zeXNmcy9pbm9kZS5jIGIvZnMvc3lzZnMvaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmY3YjJkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvc3lzZnMvaW5vZGUuYwpAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIGlub2RlLmMgLSBiYXNpYyBpbm9kZSBhbmQgZGVudHJ5IG9wZXJhdGlvbnMuCisgKgorICogc3lzZnMgaXMgQ29weXJpZ2h0IChjKSAyMDAxLTMgUGF0cmljayBNb2NoZWwKKyAqCisgKiBQbGVhc2Ugc2VlIERvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvc3lzZnMudHh0IGZvciBtb3JlIGluZm9ybWF0aW9uLgorICovCisKKyN1bmRlZiBERUJVRyAKKworI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CisjaW5jbHVkZSAic3lzZnMuaCIKKworZXh0ZXJuIHN0cnVjdCBzdXBlcl9ibG9jayAqIHN5c2ZzX3NiOworCitzdGF0aWMgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBzeXNmc19hb3BzID0geworCS5yZWFkcGFnZQk9IHNpbXBsZV9yZWFkcGFnZSwKKwkucHJlcGFyZV93cml0ZQk9IHNpbXBsZV9wcmVwYXJlX3dyaXRlLAorCS5jb21taXRfd3JpdGUJPSBzaW1wbGVfY29tbWl0X3dyaXRlCit9OworCitzdGF0aWMgc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gc3lzZnNfYmFja2luZ19kZXZfaW5mbyA9IHsKKwkucmFfcGFnZXMJPSAwLAkvKiBObyByZWFkYWhlYWQgKi8KKwkuY2FwYWJpbGl0aWVzCT0gQkRJX0NBUF9OT19BQ0NUX0RJUlRZIHwgQkRJX0NBUF9OT19XUklURUJBQ0ssCit9OworCitzdHJ1Y3QgaW5vZGUgKiBzeXNmc19uZXdfaW5vZGUobW9kZV90IG1vZGUpCit7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBuZXdfaW5vZGUoc3lzZnNfc2IpOworCWlmIChpbm9kZSkgeworCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKKwkJaW5vZGUtPmlfdWlkID0gMDsKKwkJaW5vZGUtPmlfZ2lkID0gMDsKKwkJaW5vZGUtPmlfYmxrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKKwkJaW5vZGUtPmlfYmxvY2tzID0gMDsKKwkJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOworCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZzeXNmc19hb3BzOworCQlpbm9kZS0+aV9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0gJnN5c2ZzX2JhY2tpbmdfZGV2X2luZm87CisJfQorCXJldHVybiBpbm9kZTsKK30KKworaW50IHN5c2ZzX2NyZWF0ZShzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5LCBpbnQgbW9kZSwgaW50ICgqaW5pdCkoc3RydWN0IGlub2RlICopKQoreworCWludCBlcnJvciA9IDA7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBOVUxMOworCWlmIChkZW50cnkpIHsKKwkJaWYgKCFkZW50cnktPmRfaW5vZGUpIHsKKwkJCWlmICgoaW5vZGUgPSBzeXNmc19uZXdfaW5vZGUobW9kZSkpKSB7CisJCQkJaWYgKGRlbnRyeS0+ZF9wYXJlbnQgJiYgZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZSkgeworCQkJCQlzdHJ1Y3QgaW5vZGUgKnBfaW5vZGUgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOworCQkJCQlwX2lub2RlLT5pX210aW1lID0gcF9pbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKKwkJCQl9CisJCQkJZ290byBQcm9jZWVkOworCQkJfQorCQkJZWxzZSAKKwkJCQllcnJvciA9IC1FTk9NRU07CisJCX0gZWxzZQorCQkJZXJyb3IgPSAtRUVYSVNUOworCX0gZWxzZSAKKwkJZXJyb3IgPSAtRU5PRU5UOworCWdvdG8gRG9uZTsKKworIFByb2NlZWQ6CisJaWYgKGluaXQpCisJCWVycm9yID0gaW5pdChpbm9kZSk7CisJaWYgKCFlcnJvcikgeworCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCQlpZiAoU19JU0RJUihtb2RlKSkKKwkJCWRnZXQoZGVudHJ5KTsgIC8qIHBpbiBvbmx5IGRpcmVjdG9yeSBkZW50cnkgaW4gY29yZSAqLworCX0gZWxzZQorCQlpcHV0KGlub2RlKTsKKyBEb25lOgorCXJldHVybiBlcnJvcjsKK30KKworc3RydWN0IGRlbnRyeSAqIHN5c2ZzX2dldF9kZW50cnkoc3RydWN0IGRlbnRyeSAqIHBhcmVudCwgY29uc3QgY2hhciAqIG5hbWUpCit7CisJc3RydWN0IHFzdHIgcXN0cjsKKworCXFzdHIubmFtZSA9IG5hbWU7CisJcXN0ci5sZW4gPSBzdHJsZW4obmFtZSk7CisJcXN0ci5oYXNoID0gZnVsbF9uYW1lX2hhc2gobmFtZSxxc3RyLmxlbik7CisJcmV0dXJuIGxvb2t1cF9oYXNoKCZxc3RyLHBhcmVudCk7Cit9CisKKy8qCisgKiBHZXQgdGhlIG5hbWUgZm9yIGNvcnJlc3BvbmRpbmcgZWxlbWVudCByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gc3lzZnNfZGlyZW50CisgKi8KK2NvbnN0IHVuc2lnbmVkIGNoYXIgKiBzeXNmc19nZXRfbmFtZShzdHJ1Y3Qgc3lzZnNfZGlyZW50ICpzZCkKK3sKKwlzdHJ1Y3QgYXR0cmlidXRlICogYXR0cjsKKwlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqIGJpbl9hdHRyOworCXN0cnVjdCBzeXNmc19zeW1saW5rICAqIHNsOworCisJaWYgKCFzZCB8fCAhc2QtPnNfZWxlbWVudCkKKwkJQlVHKCk7CisKKwlzd2l0Y2ggKHNkLT5zX3R5cGUpIHsKKwkJY2FzZSBTWVNGU19ESVI6CisJCQkvKiBBbHdheXMgaGF2ZSBhIGRlbnRyeSBzbyB1c2UgdGhhdCAqLworCQkJcmV0dXJuIHNkLT5zX2RlbnRyeS0+ZF9uYW1lLm5hbWU7CisKKwkJY2FzZSBTWVNGU19LT0JKX0FUVFI6CisJCQlhdHRyID0gc2QtPnNfZWxlbWVudDsKKwkJCXJldHVybiBhdHRyLT5uYW1lOworCisJCWNhc2UgU1lTRlNfS09CSl9CSU5fQVRUUjoKKwkJCWJpbl9hdHRyID0gc2QtPnNfZWxlbWVudDsKKwkJCXJldHVybiBiaW5fYXR0ci0+YXR0ci5uYW1lOworCisJCWNhc2UgU1lTRlNfS09CSl9MSU5LOgorCQkJc2wgPSBzZC0+c19lbGVtZW50OworCQkJcmV0dXJuIHNsLT5saW5rX25hbWU7CisJfQorCXJldHVybiBOVUxMOworfQorCisKKy8qCisgKiBVbmhhc2hlcyB0aGUgZGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gZ2l2ZW4gc3lzZnNfZGlyZW50CisgKiBDYWxsZWQgd2l0aCBwYXJlbnQgaW5vZGUncyBpX3NlbSBoZWxkLgorICovCit2b2lkIHN5c2ZzX2Ryb3BfZGVudHJ5KHN0cnVjdCBzeXNmc19kaXJlbnQgKiBzZCwgc3RydWN0IGRlbnRyeSAqIHBhcmVudCkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5ID0gc2QtPnNfZGVudHJ5OworCisJaWYgKGRlbnRyeSkgeworCQlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwkJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7CisJCWlmICghKGRfdW5oYXNoZWQoZGVudHJ5KSAmJiBkZW50cnktPmRfaW5vZGUpKSB7CisJCQlkZ2V0X2xvY2tlZChkZW50cnkpOworCQkJX19kX2Ryb3AoZGVudHJ5KTsKKwkJCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CisJCQlzcGluX3VubG9jaygmZGNhY2hlX2xvY2spOworCQkJc2ltcGxlX3VubGluayhwYXJlbnQtPmRfaW5vZGUsIGRlbnRyeSk7CisJCX0gZWxzZSB7CisJCQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCQkJc3Bpbl91bmxvY2soJmRjYWNoZV9sb2NrKTsKKwkJfQorCX0KK30KKwordm9pZCBzeXNmc19oYXNoX2FuZF9yZW1vdmUoc3RydWN0IGRlbnRyeSAqIGRpciwgY29uc3QgY2hhciAqIG5hbWUpCit7CisJc3RydWN0IHN5c2ZzX2RpcmVudCAqIHNkOworCXN0cnVjdCBzeXNmc19kaXJlbnQgKiBwYXJlbnRfc2QgPSBkaXItPmRfZnNkYXRhOworCisJZG93bigmZGlyLT5kX2lub2RlLT5pX3NlbSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShzZCwgJnBhcmVudF9zZC0+c19jaGlsZHJlbiwgc19zaWJsaW5nKSB7CisJCWlmICghc2QtPnNfZWxlbWVudCkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXN0cmNtcChzeXNmc19nZXRfbmFtZShzZCksIG5hbWUpKSB7CisJCQlsaXN0X2RlbF9pbml0KCZzZC0+c19zaWJsaW5nKTsKKwkJCXN5c2ZzX2Ryb3BfZGVudHJ5KHNkLCBkaXIpOworCQkJc3lzZnNfcHV0KHNkKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXVwKCZkaXItPmRfaW5vZGUtPmlfc2VtKTsKK30KKworCmRpZmYgLS1naXQgYS9mcy9zeXNmcy9tb3VudC5jIGIvZnMvc3lzZnMvbW91bnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzgwNWJiCi0tLSAvZGV2L251bGwKKysrIGIvZnMvc3lzZnMvbW91bnQuYwpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIG1vdW50LmMgLSBvcGVyYXRpb25zIGZvciBpbml0aWFsaXppbmcgYW5kIG1vdW50aW5nIHN5c2ZzLgorICovCisKKyNkZWZpbmUgREVCVUcgCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgInN5c2ZzLmgiCisKKy8qIFJhbmRvbSBtYWdpYyBudW1iZXIgKi8KKyNkZWZpbmUgU1lTRlNfTUFHSUMgMHg2MjY1NjU3MgorCitzdHJ1Y3QgdmZzbW91bnQgKnN5c2ZzX21vdW50Oworc3RydWN0IHN1cGVyX2Jsb2NrICogc3lzZnNfc2IgPSBOVUxMOwora21lbV9jYWNoZV90ICpzeXNmc19kaXJfY2FjaGVwOworCitzdGF0aWMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgc3lzZnNfb3BzID0geworCS5zdGF0ZnMJCT0gc2ltcGxlX3N0YXRmcywKKwkuZHJvcF9pbm9kZQk9IGdlbmVyaWNfZGVsZXRlX2lub2RlLAorfTsKKworc3RhdGljIHN0cnVjdCBzeXNmc19kaXJlbnQgc3lzZnNfcm9vdCA9IHsKKwkuc19zaWJsaW5nCT0gTElTVF9IRUFEX0lOSVQoc3lzZnNfcm9vdC5zX3NpYmxpbmcpLAorCS5zX2NoaWxkcmVuCT0gTElTVF9IRUFEX0lOSVQoc3lzZnNfcm9vdC5zX2NoaWxkcmVuKSwKKwkuc19lbGVtZW50CT0gTlVMTCwKKwkuc190eXBlCQk9IFNZU0ZTX1JPT1QsCit9OworCitzdGF0aWMgaW50IHN5c2ZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBkZW50cnkgKnJvb3Q7CisKKwlzYi0+c19ibG9ja3NpemUgPSBQQUdFX0NBQ0hFX1NJWkU7CisJc2ItPnNfYmxvY2tzaXplX2JpdHMgPSBQQUdFX0NBQ0hFX1NISUZUOworCXNiLT5zX21hZ2ljID0gU1lTRlNfTUFHSUM7CisJc2ItPnNfb3AgPSAmc3lzZnNfb3BzOworCXNiLT5zX3RpbWVfZ3JhbiA9IDE7CisJc3lzZnNfc2IgPSBzYjsKKworCWlub2RlID0gc3lzZnNfbmV3X2lub2RlKFNfSUZESVIgfCBTX0lSV1hVIHwgU19JUlVHTyB8IFNfSVhVR08pOworCWlmIChpbm9kZSkgeworCQlpbm9kZS0+aV9vcCA9ICZzeXNmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJnN5c2ZzX2Rpcl9vcGVyYXRpb25zOworCQkvKiBkaXJlY3RvcnkgaW5vZGVzIHN0YXJ0IG9mZiB3aXRoIGlfbmxpbmsgPT0gMiAoZm9yICIuIiBlbnRyeSkgKi8KKwkJaW5vZGUtPmlfbmxpbmsrKzsJCisJfSBlbHNlIHsKKwkJcHJfZGVidWcoInN5c2ZzOiBjb3VsZCBub3QgZ2V0IHJvb3QgaW5vZGVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyb290ID0gZF9hbGxvY19yb290KGlub2RlKTsKKwlpZiAoIXJvb3QpIHsKKwkJcHJfZGVidWcoIiVzOiBjb3VsZCBub3QgZ2V0IHJvb3QgZGVudHJ5IVxuIixfX0ZVTkNUSU9OX18pOworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJvb3QtPmRfZnNkYXRhID0gJnN5c2ZzX3Jvb3Q7CisJc2ItPnNfcm9vdCA9IHJvb3Q7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnN5c2ZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoreworCXJldHVybiBnZXRfc2Jfc2luZ2xlKGZzX3R5cGUsIGZsYWdzLCBkYXRhLCBzeXNmc19maWxsX3N1cGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHN5c2ZzX2ZzX3R5cGUgPSB7CisJLm5hbWUJCT0gInN5c2ZzIiwKKwkuZ2V0X3NiCQk9IHN5c2ZzX2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfbGl0dGVyX3N1cGVyLAorfTsKKworaW50IF9faW5pdCBzeXNmc19pbml0KHZvaWQpCit7CisJaW50IGVyciA9IC1FTk9NRU07CisKKwlzeXNmc19kaXJfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoInN5c2ZzX2Rpcl9jYWNoZSIsCisJCQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc3lzZnNfZGlyZW50KSwKKwkJCQkJICAgICAgMCwgMCwgTlVMTCwgTlVMTCk7CisJaWYgKCFzeXNmc19kaXJfY2FjaGVwKQorCQlnb3RvIG91dDsKKworCWVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnN5c2ZzX2ZzX3R5cGUpOworCWlmICghZXJyKSB7CisJCXN5c2ZzX21vdW50ID0ga2Vybl9tb3VudCgmc3lzZnNfZnNfdHlwZSk7CisJCWlmIChJU19FUlIoc3lzZnNfbW91bnQpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInN5c2ZzOiBjb3VsZCBub3QgbW91bnQhXG4iKTsKKwkJCWVyciA9IFBUUl9FUlIoc3lzZnNfbW91bnQpOworCQkJc3lzZnNfbW91bnQgPSBOVUxMOworCQkJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZzeXNmc19mc190eXBlKTsKKwkJCWdvdG8gb3V0X2VycjsKKwkJfQorCX0gZWxzZQorCQlnb3RvIG91dF9lcnI7CitvdXQ6CisJcmV0dXJuIGVycjsKK291dF9lcnI6CisJa21lbV9jYWNoZV9kZXN0cm95KHN5c2ZzX2Rpcl9jYWNoZXApOworCXN5c2ZzX2Rpcl9jYWNoZXAgPSBOVUxMOworCWdvdG8gb3V0OworfQpkaWZmIC0tZ2l0IGEvZnMvc3lzZnMvc3ltbGluay5jIGIvZnMvc3lzZnMvc3ltbGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZGY3MDEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9zeXNmcy9zeW1saW5rLmMKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBzeW1saW5rLmMgLSBvcGVyYXRpb25zIGZvciBzeXNmcyBzeW1saW5rcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKworI2luY2x1ZGUgInN5c2ZzLmgiCisKK3N0YXRpYyBpbnQgb2JqZWN0X2RlcHRoKHN0cnVjdCBrb2JqZWN0ICoga29iaikKK3sKKwlzdHJ1Y3Qga29iamVjdCAqIHAgPSBrb2JqOworCWludCBkZXB0aCA9IDA7CisJZG8geyBkZXB0aCsrOyB9IHdoaWxlICgocCA9IHAtPnBhcmVudCkpOworCXJldHVybiBkZXB0aDsKK30KKworc3RhdGljIGludCBvYmplY3RfcGF0aF9sZW5ndGgoc3RydWN0IGtvYmplY3QgKiBrb2JqKQoreworCXN0cnVjdCBrb2JqZWN0ICogcCA9IGtvYmo7CisJaW50IGxlbmd0aCA9IDE7CisJZG8geworCQlsZW5ndGggKz0gc3RybGVuKGtvYmplY3RfbmFtZShwKSkgKyAxOworCQlwID0gcC0+cGFyZW50OworCX0gd2hpbGUgKHApOworCXJldHVybiBsZW5ndGg7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfb2JqZWN0X3BhdGgoc3RydWN0IGtvYmplY3QgKiBrb2JqLCBjaGFyICogYnVmZmVyLCBpbnQgbGVuZ3RoKQoreworCXN0cnVjdCBrb2JqZWN0ICogcDsKKworCS0tbGVuZ3RoOworCWZvciAocCA9IGtvYmo7IHA7IHAgPSBwLT5wYXJlbnQpIHsKKwkJaW50IGN1ciA9IHN0cmxlbihrb2JqZWN0X25hbWUocCkpOworCisJCS8qIGJhY2sgdXAgZW5vdWdoIHRvIHByaW50IHRoaXMgYnVzIGlkIHdpdGggJy8nICovCisJCWxlbmd0aCAtPSBjdXI7CisJCXN0cm5jcHkoYnVmZmVyICsgbGVuZ3RoLGtvYmplY3RfbmFtZShwKSxjdXIpOworCQkqKGJ1ZmZlciArIC0tbGVuZ3RoKSA9ICcvJzsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc3lzZnNfYWRkX2xpbmsoc3RydWN0IGRlbnRyeSAqIHBhcmVudCwgY2hhciAqIG5hbWUsIHN0cnVjdCBrb2JqZWN0ICogdGFyZ2V0KQoreworCXN0cnVjdCBzeXNmc19kaXJlbnQgKiBwYXJlbnRfc2QgPSBwYXJlbnQtPmRfZnNkYXRhOworCXN0cnVjdCBzeXNmc19zeW1saW5rICogc2w7CisJaW50IGVycm9yID0gMDsKKworCWVycm9yID0gLUVOT01FTTsKKwlzbCA9IGttYWxsb2Moc2l6ZW9mKCpzbCksIEdGUF9LRVJORUwpOworCWlmICghc2wpCisJCWdvdG8gZXhpdDE7CisKKwlzbC0+bGlua19uYW1lID0ga21hbGxvYyhzdHJsZW4obmFtZSkgKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNsLT5saW5rX25hbWUpCisJCWdvdG8gZXhpdDI7CisKKwlzdHJjcHkoc2wtPmxpbmtfbmFtZSwgbmFtZSk7CisJc2wtPnRhcmdldF9rb2JqID0ga29iamVjdF9nZXQodGFyZ2V0KTsKKworCWVycm9yID0gc3lzZnNfbWFrZV9kaXJlbnQocGFyZW50X3NkLCBOVUxMLCBzbCwgU19JRkxOS3xTX0lSV1hVR08sCisJCQkJU1lTRlNfS09CSl9MSU5LKTsKKwlpZiAoIWVycm9yKQorCQlyZXR1cm4gMDsKKworCWtmcmVlKHNsLT5saW5rX25hbWUpOworZXhpdDI6CisJa2ZyZWUoc2wpOworZXhpdDE6CisJcmV0dXJuIGVycm9yOworfQorCisvKioKKyAqCXN5c2ZzX2NyZWF0ZV9saW5rIC0gY3JlYXRlIHN5bWxpbmsgYmV0d2VlbiB0d28gb2JqZWN0cy4KKyAqCUBrb2JqOglvYmplY3Qgd2hvc2UgZGlyZWN0b3J5IHdlJ3JlIGNyZWF0aW5nIHRoZSBsaW5rIGluLgorICoJQHRhcmdldDoJb2JqZWN0IHdlJ3JlIHBvaW50aW5nIHRvLgorICoJQG5hbWU6CQluYW1lIG9mIHRoZSBzeW1saW5rLgorICovCitpbnQgc3lzZnNfY3JlYXRlX2xpbmsoc3RydWN0IGtvYmplY3QgKiBrb2JqLCBzdHJ1Y3Qga29iamVjdCAqIHRhcmdldCwgY2hhciAqIG5hbWUpCit7CisJc3RydWN0IGRlbnRyeSAqIGRlbnRyeSA9IGtvYmotPmRlbnRyeTsKKwlpbnQgZXJyb3IgPSAwOworCisJQlVHX09OKCFrb2JqIHx8ICFrb2JqLT5kZW50cnkgfHwgIW5hbWUpOworCisJZG93bigmZGVudHJ5LT5kX2lub2RlLT5pX3NlbSk7CisJZXJyb3IgPSBzeXNmc19hZGRfbGluayhkZW50cnksIG5hbWUsIHRhcmdldCk7CisJdXAoJmRlbnRyeS0+ZF9pbm9kZS0+aV9zZW0pOworCXJldHVybiBlcnJvcjsKK30KKworCisvKioKKyAqCXN5c2ZzX3JlbW92ZV9saW5rIC0gcmVtb3ZlIHN5bWxpbmsgaW4gb2JqZWN0J3MgZGlyZWN0b3J5LgorICoJQGtvYmo6CW9iamVjdCB3ZSdyZSBhY3RpbmcgZm9yLgorICoJQG5hbWU6CW5hbWUgb2YgdGhlIHN5bWxpbmsgdG8gcmVtb3ZlLgorICovCisKK3ZvaWQgc3lzZnNfcmVtb3ZlX2xpbmsoc3RydWN0IGtvYmplY3QgKiBrb2JqLCBjaGFyICogbmFtZSkKK3sKKwlzeXNmc19oYXNoX2FuZF9yZW1vdmUoa29iai0+ZGVudHJ5LG5hbWUpOworfQorCitzdGF0aWMgaW50IHN5c2ZzX2dldF90YXJnZXRfcGF0aChzdHJ1Y3Qga29iamVjdCAqIGtvYmosIHN0cnVjdCBrb2JqZWN0ICogdGFyZ2V0LAorCQkJCSAgIGNoYXIgKnBhdGgpCit7CisJY2hhciAqIHM7CisJaW50IGRlcHRoLCBzaXplOworCisJZGVwdGggPSBvYmplY3RfZGVwdGgoa29iaik7CisJc2l6ZSA9IG9iamVjdF9wYXRoX2xlbmd0aCh0YXJnZXQpICsgZGVwdGggKiAzIC0gMTsKKwlpZiAoc2l6ZSA+IFBBVEhfTUFYKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCXByX2RlYnVnKCIlczogZGVwdGggPSAlZCwgc2l6ZSA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGRlcHRoLCBzaXplKTsKKworCWZvciAocyA9IHBhdGg7IGRlcHRoLS07IHMgKz0gMykKKwkJc3RyY3B5KHMsIi4uLyIpOworCisJZmlsbF9vYmplY3RfcGF0aCh0YXJnZXQsIHBhdGgsIHNpemUpOworCXByX2RlYnVnKCIlczogcGF0aCA9ICclcydcbiIsIF9fRlVOQ1RJT05fXywgcGF0aCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzeXNmc19nZXRsaW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciAqIHBhdGgpCit7CisJc3RydWN0IGtvYmplY3QgKmtvYmosICp0YXJnZXRfa29iajsKKwlpbnQgZXJyb3IgPSAwOworCisJa29iaiA9IHN5c2ZzX2dldF9rb2JqZWN0KGRlbnRyeS0+ZF9wYXJlbnQpOworCWlmICgha29iaikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0YXJnZXRfa29iaiA9IHN5c2ZzX2dldF9rb2JqZWN0KGRlbnRyeSk7CisJaWYgKCF0YXJnZXRfa29iaikgeworCQlrb2JqZWN0X3B1dChrb2JqKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZG93bl9yZWFkKCZzeXNmc19yZW5hbWVfc2VtKTsKKwllcnJvciA9IHN5c2ZzX2dldF90YXJnZXRfcGF0aChrb2JqLCB0YXJnZXRfa29iaiwgcGF0aCk7CisJdXBfcmVhZCgmc3lzZnNfcmVuYW1lX3NlbSk7CisJCisJa29iamVjdF9wdXQoa29iaik7CisJa29iamVjdF9wdXQodGFyZ2V0X2tvYmopOworCXJldHVybiBlcnJvcjsKKworfQorCitzdGF0aWMgaW50IHN5c2ZzX2ZvbGxvd19saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaW50IGVycm9yID0gLUVOT01FTTsKKwl1bnNpZ25lZCBsb25nIHBhZ2UgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKHBhZ2UpCisJCWVycm9yID0gc3lzZnNfZ2V0bGluayhkZW50cnksIChjaGFyICopIHBhZ2UpOyAKKwluZF9zZXRfbGluayhuZCwgZXJyb3IgPyBFUlJfUFRSKGVycm9yKSA6IChjaGFyICopcGFnZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN5c2ZzX3B1dF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJY2hhciAqcGFnZSA9IG5kX2dldF9saW5rKG5kKTsKKwlpZiAoIUlTX0VSUihwYWdlKSkKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBhZ2UpOworfQorCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBzeXNmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnJlYWRsaW5rID0gZ2VuZXJpY19yZWFkbGluaywKKwkuZm9sbG93X2xpbmsgPSBzeXNmc19mb2xsb3dfbGluaywKKwkucHV0X2xpbmsgPSBzeXNmc19wdXRfbGluaywKK307CisKKworRVhQT1JUX1NZTUJPTF9HUEwoc3lzZnNfY3JlYXRlX2xpbmspOworRVhQT1JUX1NZTUJPTF9HUEwoc3lzZnNfcmVtb3ZlX2xpbmspOworCmRpZmYgLS1naXQgYS9mcy9zeXNmcy9zeXNmcy5oIGIvZnMvc3lzZnMvc3lzZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGEyNGEwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvc3lzZnMvc3lzZnMuaApAQCAtMCwwICsxLDk1IEBACisKK2V4dGVybiBzdHJ1Y3QgdmZzbW91bnQgKiBzeXNmc19tb3VudDsKK2V4dGVybiBrbWVtX2NhY2hlX3QgKnN5c2ZzX2Rpcl9jYWNoZXA7CisKK2V4dGVybiBzdHJ1Y3QgaW5vZGUgKiBzeXNmc19uZXdfaW5vZGUobW9kZV90IG1vZGUpOworZXh0ZXJuIGludCBzeXNmc19jcmVhdGUoc3RydWN0IGRlbnRyeSAqLCBpbnQgbW9kZSwgaW50ICgqaW5pdCkoc3RydWN0IGlub2RlICopKTsKKworZXh0ZXJuIGludCBzeXNmc19tYWtlX2RpcmVudChzdHJ1Y3Qgc3lzZnNfZGlyZW50ICosIHN0cnVjdCBkZW50cnkgKiwgdm9pZCAqLAorCQkJCXVtb2RlX3QsIGludCk7CitleHRlcm4gc3RydWN0IGRlbnRyeSAqIHN5c2ZzX2dldF9kZW50cnkoc3RydWN0IGRlbnRyeSAqLCBjb25zdCBjaGFyICopOworCitleHRlcm4gaW50IHN5c2ZzX2FkZF9maWxlKHN0cnVjdCBkZW50cnkgKiwgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZSAqLCBpbnQpOworZXh0ZXJuIHZvaWQgc3lzZnNfaGFzaF9hbmRfcmVtb3ZlKHN0cnVjdCBkZW50cnkgKiBkaXIsIGNvbnN0IGNoYXIgKiBuYW1lKTsKKworZXh0ZXJuIGludCBzeXNmc19jcmVhdGVfc3ViZGlyKHN0cnVjdCBrb2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgc3RydWN0IGRlbnRyeSAqKik7CitleHRlcm4gdm9pZCBzeXNmc19yZW1vdmVfc3ViZGlyKHN0cnVjdCBkZW50cnkgKik7CisKK2V4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyICogc3lzZnNfZ2V0X25hbWUoc3RydWN0IHN5c2ZzX2RpcmVudCAqc2QpOworZXh0ZXJuIHZvaWQgc3lzZnNfZHJvcF9kZW50cnkoc3RydWN0IHN5c2ZzX2RpcmVudCAqc2QsIHN0cnVjdCBkZW50cnkgKnBhcmVudCk7CisKK2V4dGVybiBzdHJ1Y3Qgcndfc2VtYXBob3JlIHN5c2ZzX3JlbmFtZV9zZW07CitleHRlcm4gc3RydWN0IHN1cGVyX2Jsb2NrICogc3lzZnNfc2I7CitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzeXNmc19kaXJfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHN5c2ZzX2ZpbGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJpbl9mb3BzOworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHN5c2ZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHN5c2ZzX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKworc3RydWN0IHN5c2ZzX3N5bWxpbmsgeworCWNoYXIgKiBsaW5rX25hbWU7CisJc3RydWN0IGtvYmplY3QgKiB0YXJnZXRfa29iajsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGtvYmplY3QgKiB0b19rb2JqKHN0cnVjdCBkZW50cnkgKiBkZW50cnkpCit7CisJc3RydWN0IHN5c2ZzX2RpcmVudCAqIHNkID0gZGVudHJ5LT5kX2ZzZGF0YTsKKwlyZXR1cm4gKChzdHJ1Y3Qga29iamVjdCAqKSBzZC0+c19lbGVtZW50KTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYXR0cmlidXRlICogdG9fYXR0cihzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5KQoreworCXN0cnVjdCBzeXNmc19kaXJlbnQgKiBzZCA9IGRlbnRyeS0+ZF9mc2RhdGE7CisJcmV0dXJuICgoc3RydWN0IGF0dHJpYnV0ZSAqKSBzZC0+c19lbGVtZW50KTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqIHRvX2Jpbl9hdHRyKHN0cnVjdCBkZW50cnkgKiBkZW50cnkpCit7CisJc3RydWN0IHN5c2ZzX2RpcmVudCAqIHNkID0gZGVudHJ5LT5kX2ZzZGF0YTsKKwlyZXR1cm4gKChzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqKSBzZC0+c19lbGVtZW50KTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qga29iamVjdCAqc3lzZnNfZ2V0X2tvYmplY3Qoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBrb2JqZWN0ICoga29iaiA9IE5VTEw7CisKKwlzcGluX2xvY2soJmRjYWNoZV9sb2NrKTsKKwlpZiAoIWRfdW5oYXNoZWQoZGVudHJ5KSkgeworCQlzdHJ1Y3Qgc3lzZnNfZGlyZW50ICogc2QgPSBkZW50cnktPmRfZnNkYXRhOworCQlpZiAoc2QtPnNfdHlwZSAmIFNZU0ZTX0tPQkpfTElOSykgeworCQkJc3RydWN0IHN5c2ZzX3N5bWxpbmsgKiBzbCA9IHNkLT5zX2VsZW1lbnQ7CisJCQlrb2JqID0ga29iamVjdF9nZXQoc2wtPnRhcmdldF9rb2JqKTsKKwkJfSBlbHNlCisJCQlrb2JqID0ga29iamVjdF9nZXQoc2QtPnNfZWxlbWVudCk7CisJfQorCXNwaW5fdW5sb2NrKCZkY2FjaGVfbG9jayk7CisKKwlyZXR1cm4ga29iajsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlbGVhc2Vfc3lzZnNfZGlyZW50KHN0cnVjdCBzeXNmc19kaXJlbnQgKiBzZCkKK3sKKwlpZiAoc2QtPnNfdHlwZSAmIFNZU0ZTX0tPQkpfTElOSykgeworCQlzdHJ1Y3Qgc3lzZnNfc3ltbGluayAqIHNsID0gc2QtPnNfZWxlbWVudDsKKwkJa2ZyZWUoc2wtPmxpbmtfbmFtZSk7CisJCWtvYmplY3RfcHV0KHNsLT50YXJnZXRfa29iaik7CisJCWtmcmVlKHNsKTsKKwl9CisJa21lbV9jYWNoZV9mcmVlKHN5c2ZzX2Rpcl9jYWNoZXAsIHNkKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3lzZnNfZGlyZW50ICogc3lzZnNfZ2V0KHN0cnVjdCBzeXNmc19kaXJlbnQgKiBzZCkKK3sKKwlpZiAoc2QpIHsKKwkJV0FSTl9PTighYXRvbWljX3JlYWQoJnNkLT5zX2NvdW50KSk7CisJCWF0b21pY19pbmMoJnNkLT5zX2NvdW50KTsKKwl9CisJcmV0dXJuIHNkOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3lzZnNfcHV0KHN0cnVjdCBzeXNmc19kaXJlbnQgKiBzZCkKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmc2QtPnNfY291bnQpKQorCQlyZWxlYXNlX3N5c2ZzX2RpcmVudChzZCk7Cit9CisKZGlmZiAtLWdpdCBhL2ZzL3N5c3YvQ0hBTkdFUyBiL2ZzL3N5c3YvQ0hBTkdFUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmVhNmU5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvc3lzdi9DSEFOR0VTCkBAIC0wLDAgKzEsNjAgQEAKK01vbiwgMTUgRGVjIDE5OTcJICBLcnp5c3p0b2YgRy4gQmFyYW5vd3NraSA8a2diQG1hbmphay5rbm0ub3JnLnBsPgorCSogICAgbmFtZWkuYzogc3RydWN0IHN5c3ZfZGlyX2lub2RlX29wZXJhdGlvbnMgdXBkYXRlZCB0byB1c2UgZGVudHJpZXMuCisKK0ZyaSwgMjMgSmFuIDE5OTggICBLcnp5c3p0b2YgRy4gQmFyYW5vd3NraSA8a2diQG1hbmphay5rbm0ub3JnLnBsPgorCSogICAgaW5vZGUuYzogY29ycmVjdGVkIDEgdHJhY2sgb2Zmc2V0IHNldHRpbmcgKGluIHNiLT5zdl9ibG9ja19iYXNlKS4KKwkJICAgICAgT3JpZ2luYWxseSBpdCB3YXMgb3ZlcnJpZGRlbiAoYnkgc2V0dGluZyB0byB6ZXJvKQorCQkgICAgICBpbiBkZXRlY3RlZF9beGVuaXgsc3lzdjQsc3lzdjIsY29oZXJlbnRdLiBUaGFua3MKKwkJICAgICAgdG8gQW5kcnplaiBLcnp5c3p0b2Zvd2ljeiA8YW5rcnlAbWlmLnBnLmdkYS5wbD4KKwkJICAgICAgZm9yIGlkZW50aWZ5aW5nIHRoZSBwcm9ibGVtLgorCitUdWUsIDI3IEphbiAxOTk4ICAgS3J6eXN6dG9mIEcuIEJhcmFub3dza2kgPGtnYkBtYW5qYWsua25tLm9yZy5wbD4KKyAgICAgICAgKiAgICBpbm9kZS5jOiBhZGRlZCAyMDQ4LWJ5dGUgYmxvY2sgc3VwcG9ydCB0byBTeXN0ZW1WIEZTLgorCQkgICAgICBNZXJnZWQgZGV0ZWN0ZWRfYnNbNTEyLDEwMjQsMjA0OF0oKSBpbnRvIG9uZSBmdW5jdGlvbjoKKwkJICAgICAgdm9pZCBkZXRlY3RlZF9icyAodV9jaGFyIHR5cGUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpLgorCQkgICAgICBUaGFua3MgdG8gQW5kcnplaiBLcnp5c3p0b2Zvd2ljeiA8YW5rcnlAbWlmLnBnLmdkYS5wbD4KKwkJICAgICAgZm9yIHRoZSBwYXRjaC4KKworV2VkLCA0IEZlYiAxOTk4ICAgS3J6eXN6dG9mIEcuIEJhcmFub3dza2kgPGtnYkBtYW5qYWsua25tLm9yZy5wbD4KKwkqICAgIG5hbWVpLmM6IHJlbW92ZWQgc3RhdGljIHN1YmRpcigpOyBpc19zdWJkaXIoKSBmcm9tIGRjYWNoZS5jCisJCSAgICAgIGlzIHVzZWQgaW5zdGVhZC4gQ29zbWV0aWMgY2hhbmdlcy4KKworVGh1LCAzIERlYyAxOTk4ICAgQWwgVmlybyAodmlyb0BwYXJjZWxmYXJjZS5saW51eC50aGVwbGFuZXQuY28udWspCisJKiAgICBuYW1laS5jIChzeXN2X3JtZGlyKToKKwkJICAgICAgQnVnZWN0b215OiBvbGQgY2hlY2sgZm9yIHZpY3RpbSBiZWluZyBidXN5CisJCSAgICAgIChpbm9kZS0+aV9jb3VudCkgd2Fzbid0IHJlcGxhY2VkICh3aXRoIGNoZWNraW5nCisJCSAgICAgIGRlbnRyeS0+ZF9jb3VudCkgYW5kIGVzY2FwZWQgTGludXMgaW4gdGhlIGxhc3Qgcm91bmQKKwkJICAgICAgb2YgY2hhbmdlcy4gU2hvdCBhbmQgYnVyaWVkLgorCitXZWQsIDkgRGVjIDE5OTggICBBVgorCSogICAgbmFtZWkuYyAoZG9fc3lzdl9yZW5hbWUpOgorCQkgICAgICAgRml4ZWQgaW5jb3JyZWN0IGNoZWNrIGZvciBvdGhlciBvd25lcnMgKyByYWNlLgorCQkgICAgICAgUmVtb3ZlZCBjaGVja3MgdGhhdCB3ZW50IHRvIFZGUy4KKwkqICAgIG5hbWVpLmMgKHN5c3ZfdW5saW5rKToKKwkJICAgICAgIFJlbW92ZWQgY2hlY2tzIHRoYXQgd2VudCB0byBWRlMuCisKK1RodSwgMTAgRGVjIDE5OTggICBBVgorCSogICAgbmFtZWkuYyAoZG9fbWtub2QpOgorCQkJUmVtb3ZlZCBkZWFkIGNvZGUgLSBta25vZCBpcyBuZXZlciBhc2tlZCB0bworCQkJY3JlYXRlIGEgc3ltbGluayBvciBkaXJlY3RvcnkuIEluY2lkZW50aWFsbHksCisJCQlpdCB3b3VsZG4ndCBkbyBpdCByaWdodCBpZiBpdCB3b3VsZCBiZSBjYWxsZWQuCisKK1NhdCwgMjYgRGVjIDE5OTggICBLR0IKKwkqICAgIGlub2RlLmMgKGRldGVjdF9zeXN2NCk6CisJCQlBZGRlZCBkZXRlY3Rpb24gb2YgZXhwYW5kZWQgc190eXBlIGZpZWxkICgweDEwLAorCQkJMHgyMCBhbmQgMHgzMCkuICBGb3JjZWQgcmVhZC1vbmx5IGFjY2VzcyBpbiB0aGlzIGNhc2UuCisKK1N1biwgMjEgTWFyIDE5OTkgICBBVgorCSogICAgbmFtZWkuYyAoc3lzdl9saW5rKToKKwkJCUZpeGVkIGlfY291bnQgdXNhZ2UgdGhhdCByZXN1bHRlZCBpbiBkY2FjaGUgY29ycnVwdGlvbi4KKwkqICAgIGlub2RlLmM6CisJCQlGaWxsZWQgLT5kZWxldGVfaW5vZGUoKSBtZXRob2Qgd2l0aCBzeXN2X2RlbGV0ZV9pbm9kZSgpLgorCQkJc3lzdl9wdXRfaW5vZGUoKSBpcyBnb25lLCBhcyBpdCB0cmllZCB0byBkbyAtPmRlbGV0ZV8KKwkJCV9pbm9kZSgpJ3Mgam9iLgorCSogICAgaWFsbG9jLmM6IChzeXN2X2ZyZWVfaW5vZGUpOgorCQkJRml4ZWQgcmFjZS4KKworU3VuLCAzMCBBcHIgMTk5OSAgIEFWCisJKiAgICBuYW1laS5jIChzeXN2X21rbm9kKToKKwkJCVJlbW92ZWQgZGVhZCBjb2RlIChTX0lGUkVHIGNhc2UgaXMgbm93IHBhc3NlZCB0bworCQkJLT5jcmVhdGUoKSBieSBWRlMpLgpkaWZmIC0tZ2l0IGEvZnMvc3lzdi9DaGFuZ2VMb2cgYi9mcy9zeXN2L0NoYW5nZUxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGUzNDg3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvc3lzdi9DaGFuZ2VMb2cKQEAgLTAsMCArMSwxMDYgQEAKK1RodSBGZWIgMTQgMjAwMiAgQW5kcmV3IE1vcnRvbiAgPGFrcG1AemlwLmNvbS5hdT4KKworCSogZGlyX2NvbW1pdF9jaHVuaygpOiBjYWxsIHdyaXRlb3V0X29uZV9wYWdlKCkgYXMgd2VsbCBhcworCSAgd2FpdGZvcl9vbmVfcGFnZSgpIGZvciBJU19TWU5DIGRpcmVjdG9yaWVzLCBzbyB0aGF0IHdlCisJICBhY3R1YWxseSBkbyBzeW5jIHRoZSBkaXJlY3RvcnkuIChmb3J3YXJkLXBvcnQgZnJvbSAyLjQpLgorCitUaHUgRmViICA3IDIwMDIgIEFsZXhhbmRlciBWaXJvICA8dmlyb0BwYXJjZWxmYXJjZS5saW51eC50aGVwbGFuZXQuY28udWs+CisKKwkqIHN1cGVyLmM6IHN3aXRjaGVkIHRvIC0+Z2V0X3NiKCkKKwkqIENoYW5nZUxvZzogZml4ZWQgZGF0ZXMgOy0pCisKKzIwMDItMDEtMjQgIERhdmlkIFMuIE1pbGxlciAgPGRhdmVtQHJlZGhhdC5jb20+CisKKwkqIGlub2RlLmM6IEluY2x1ZGUgbGludXgvaW5pdC5oCisKK01vbiBKYW4gMjEgMjAwMiAgQWxleGFuZGVyIFZpcm8gIDx2aXJvQHBhcmNlbGZhcmNlLmxpbnV4LnRoZXBsYW5ldC5jby51az4KKwkqIGlhbGxvYy5jIChzeXN2X25ld19pbm9kZSk6IHplcm8gU1lTVl9JKGlub2RlKS0+aV9kYXRhIG91dC4KKwkqIGlfdm5vZGUgcmVuYW1lZCB0byB2ZnNfaW5vZGUuICBTb3JyeSwgYnV0IGxldCdzIGtlZXAgdGhhdAorCSAgY29uc2lzdGVudC4KKworU2F0IEphbiAxOSAyMDAyICBDaHJpc3RvcGggSGVsbHdpZyAgPGhjaEBpbmZyYWRlYWQub3JnPgorCisJKiBpbmNsdWRlL2xpbnV4L3N5c3ZfZnMuaCAoU1lTVl9JKTogR2V0IGZzLXByaXZhdGUgaW5vZGUgZGF0YSB1c2luZworCQlsaXN0X2VudHJ5KCkgaW5zdGVhZCBvZiBpbm9kZS0+dS4KKwkqIGluY2x1ZGUvbGludXgvc3lzdl9mc19pLmg6IEFkZCAnc3RydWN0IGlub2RlICBpX3Zub2RlJyBmaWVsZCB0bworCQlzeXN2X2lub2RlX2luZm8gc3RydWN0dXJlLgorCSogaW5vZGUuYzogSW5jbHVkZSA8bGludXgvc2xhYi5oPiwgaW1wbGVtZW50IGFsbG9jX2lub2RlL2Rlc3Ryb3lfaW5vZGUKKwkJc29wIG1ldGhvZHMsIGFkZCBpbmZyYXN0cnVjdHVyZSBmb3IgcGVyLWZzIGlub2RlIHNsYWIgY2FjaGUuCisJKiBzdXBlci5jIChpbml0X3N5c3ZfZnMpOiBJbml0aWFsaXplIGlub2RlIGNhY2hlLCByZWNvdmVyIHByb3Blcmx5CisJCWluIHRoZSBjYXNlIG9mIGZhaWxlZCByZWdpc3Rlcl9maWxlc3lzdGVtIGZvciBWNy4KKwkoZXhpdF9zeXN2X2ZzKTogRGVzdHJveSBpbm9kZSBjYWNoZS4KKworU2F0IEphbiAxOSAyMDAyICBDaHJpc3RvcGggSGVsbHdpZyAgPGhjaEBpbmZyYWRlYWQub3JnPgorCisJKiBpbmNsdWRlL2xpbnV4L3N5c3ZfZnMuaDogSW5jbHVkZSA8bGludXgvc3lzdl9mc19pLmg+LCBkZWNsYXJlIFNZU1ZfSSgpLgorCSogZGlyLmMgKHN5c3ZfZmluZF9lbnRyeSk6IFVzZSBTWVNWX0koKSBpbnN0ZWFkIG9mIC0+dS5zeXN2X2kgdG8KKwkJYWNjZXNzIGZzLXByaXZhdGUgaW5vZGUgZGF0YS4KKwkqIGlhbGxvYy5jIChzeXN2X25ld19pbm9kZSk6IExpa2V3aXNlLgorCSogaW5vZGUuYyAoc3lzdl9yZWFkX2lub2RlKTogTGlrZXdpc2UuCisJKHN5c3ZfdXBkYXRlX2lub2RlKTogTGlrZXdpc2UuCisJKiBpdHJlZS5jIChnZXRfYnJhbmNoKTogTGlrZXdpc2UuCisJKHN5c3ZfdHJ1bmNhdGUpOiBMaWtld2lzZS4KKwkqIHN5bWxpbmsuYyAoc3lzdl9yZWFkbGluayk6IExpa2V3aXNlLgorCShzeXN2X2ZvbGxvd19saW5rKTogTGlrZXdpc2UuCisKK0ZyaSBKYW4gIDQgMjAwMiAgQWxleGFuZGVyIFZpcm8gIDx2aXJvQHBhcmNlbGZhcmNlLmxpbnV4LnRoZXBsYW5ldC5jby51az4KKworCSogaWFsbG9jLmMgKHN5c3ZfZnJlZV9pbm9kZSk6IFVzZSBzYi0+c19pZCBpbnN0ZWFkIG9mIGJkZXZuYW1lKCkuCisJKiBpbm9kZS5jIChzeXN2X3JlYWRfaW5vZGUpOiBMaWtld2lzZS4KKwkgIChzeXN2X3VwZGF0ZV9pbm9kZSk6IExpa2V3aXNlLgorCSAgKHN5c3Zfc3luY19pbm9kZSk6IExpa2V3aXNlLgorCSogc3VwZXIuYyAoZGV0ZWN0X3N5c3YpOiBMaWtld2lzZS4KKwkgIChjb21wbGV0ZV9yZWFkX3N1cGVyKTogTGlrZXdpc2UuCisJICAoc3lzdl9yZWFkX3N1cGVyKTogTGlrZXdpc2UuCisJICAodjdfcmVhZF9zdXBlcik6IExpa2V3aXNlLgorCitTdW4gRGVjIDMwIDIwMDEgIE1hbmZyZWQgU3ByYXVsICA8bWFuZnJlZHNAY29sb3JmdWxsaWZlLmNvbT4KKworCSogZGlyLmMgKGRpcl9jb21taXRfY2h1bmspOiBEbyBub3Qgc2V0IGRpci0+aV92ZXJzaW9uLgorCShzeXN2X3JlYWRkaXIpOiBMaWtld2lzZS4KKworVGh1IERlYyAyNyAyMDAxICBBbGV4YW5kZXIgVmlybyAgPHZpcm9AcGFyY2VsZmFyY2UubGludXgudGhlcGxhbmV0LmNvLnVrPgorCisJKiBpdHJlZS5jIChnZXRfYmxvY2spOiBVc2UgbWFwX2JoKCkgdG8gZmlsbCBvdXQgYmhfcmVzdWx0LgorCitUdWUgRGVjIDI1IDIwMDEgIEFsZXhhbmRlciBWaXJvICA8dmlyb0BwYXJjZWxmYXJjZS5saW51eC50aGVwbGFuZXQuY28udWs+CisKKwkqIHN1cGVyLmMgKHN5c3ZfcmVhZF9zdXBlcik6IFVzZSBzYl9zZXRfYmxvY2tzaXplKCkgdG8gc2V0IGJsb2Nrc2l6ZS4KKwkgICh2N19yZWFkX3N1cGVyKTogTGlrZXdpc2UuCisKK1R1ZSBOb3YgMjcgMjAwMSAgQWxleGFuZGVyIFZpcm8gIDx2aXJvQHBhcmNlbGZhcmNlLmxpbnV4LnRoZXBsYW5ldC5jby51az4KKworCSogaXRyZWUuYyAoZ2V0X2Jsb2NrKTogQ2hhbmdlIHR5cGUgZm9yIGlibG9jayBhcmd1bWVudCB0byBzZWN0b3JfdC4KKwkqIHN1cGVyLmMgKHN5c3ZfcmVhZF9zdXBlcik6IFNldCBzX2Jsb2Nrc2l6ZSBlYXJseS4KKwkgICh2N19yZWFkX3N1cGVyKTogTGlrZXdpc2UuCisJKiBiYWxsb2MuYyAoc3lzdl9uZXdfYmxvY2spOiBVc2Ugc2JfYnJlYWQoKS4gaW5zdGVhZCBvZiBicmVhZCgpLgorCSAgKHN5c3ZfY291bnRfZnJlZV9ibG9ja3MpOiBMaWtld2lzZS4KKwkqIGlhbGxvYy5jIChzeXN2X3Jhd19pbm9kZSk6IExpa2V3aXNlLgorCSogaXRyZWUuYyAoZ2V0X2JyYW5jaCk6IExpa2V3aXNlLgorCSAgKGZyZWVfYnJhbmNoZXMpOiBMaWtld2lzZS4KKwkqIHN1cGVyLmMgKHN5c3ZfcmVhZF9zdXBlcik6IExpa2V3aXNlLgorCSAgKHY3X3JlYWRfc3VwZXIpOiBMaWtld2lzZS4KKworU2F0IERlYyAxNSAyMDAxICBDaHJpc3RvcGggSGVsbHdpZyAgPGhjaEBpbmZyYWRlYWQub3JnPgorCisJKiBpbm9kZS5jIChzeXN2X3JlYWRfaW5vZGUpOiBNYXJrIGlub2RlIGFzIGJhZCBpbiBjYXNlIG9mIGZhaWx1cmUuCisJKiBzdXBlci5jIChjb21wbGV0ZV9yZWFkX3N1cGVyKTogQ2hlY2sgZm9yIGJhZCByb290IGlub2RlLgorCitXZWQgTm92IDIxIDIwMDEgIEFuZHJldyBNb3J0b24gIDxhbmRyZXdtQHVvdy5lZHUuYXU+CisKKwkqIGZpbGUuYyAoc3lzdl9zeW5jX2ZpbGUpOiBDYWxsIGZzeW5jX2lub2RlX2RhdGFfYnVmZmVycy4KKworRnJpIE9jdCAyNiAyMDAxICBDaHJpc3RvcGggSGVsbHdpZyAgPGhjaEBpbmZyYWRlYWQub3JnPgorCisJKiBkaXIuYywgaWFsbG9jLmMsIG5hbWVpLmMsIGluY2x1ZGUvbGludXgvc3lzdl9mc19pLmg6CisJSW1wbGVtZW50IHBlci1Jbm9kZSBsb29rdXAgb2Zmc2V0IGNhY2hlLgorCU1vZGVsbGVkIGFmdGVyIFRlZCdzIGV4dDIgcGF0Y2guCisKK0ZyaSBPY3QgMjYgMjAwMSAgQ2hyaXN0b3BoIEhlbGx3aWcgIDxoY2hAaW5mcmFkZWFkLm9yZz4KKworCSogaW5vZGUuYywgc3VwZXIuYywgaW5jbHVkZS9saW51eC9zeXN2X2ZzLmgsCisJICBpbmNsdWRlL2xpbnV4L3N5c3ZfZnNfc2IuaDoKKwlSZW1vdmUgc3ltbGluayBmYWtpbmcuCU5vb25lIHJlYWxseSB3YW50cyB0byB1c2UgdGhlc2UgYXMKKwlsaW51eCBmaWxlc3lzdGVtcyBhbmQgbmF0aXZlIE9TZXMgZG9uJ3Qgc3VwcG9ydCBpdCBhbnl3YXkuCisKKwpkaWZmIC0tZ2l0IGEvZnMvc3lzdi9JTlRSTyBiL2ZzL3N5c3YvSU5UUk8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU0ZTRkMQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3N5c3YvSU5UUk8KQEAgLTAsMCArMSwxODIgQEAKK1RoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBTeXN0ZW1WL0NvaGVyZW50IGZpbGVzeXN0ZW0gZm9yIExpbnV4LgorSXQgZ3JldyBvdXQgb2Ygc2VwYXJhdGUgZmlsZXN5c3RlbSBpbXBsZW1lbnRhdGlvbnMKKworICAgIFhlbml4IEZTICAgICAgRG91ZyBFdmFucyA8ZGplQGN5Z251cy5jb20+ICBKdW5lIDE5OTIKKyAgICBTeXN0ZW1WIEZTICAgIFBhdWwgQi4gTW9uZGF5IDxwbW9uZGF5QGVlY3Mud3N1LmVkdT4gTWFyY2gtSnVuZSAxOTkzCisgICAgQ29oZXJlbnQgRlMgICBCLiBIYWlibGUgPGhhaWJsZUBtYTJzMi5tYXRoZW1hdGlrLnVuaS1rYXJsc3J1aGUuZGU+IEp1bmUgMTk5MworCithbmQgd2FzIG1lcmdlZCB0b2dldGhlciBpbiBKdWx5IDE5OTMuCisKK1RoZXNlIGZpbGVzeXN0ZW1zIGFyZSByYXRoZXIgc2ltaWxhci4gSGVyZSBpcyBhIGNvbXBhcmlzb24gd2l0aCBNaW5peCBGUzoKKworKiBMaW51eCBmZGlzayByZXBvcnRzIG9uIHBhcnRpdGlvbnMKKyAgLSBNaW5peCBGUyAgICAgMHg4MSBMaW51eC9NaW5peAorICAtIFhlbml4IEZTICAgICA/PworICAtIFN5c3RlbVYgRlMgICA/PworICAtIENvaGVyZW50IEZTICAweDA4IEFJWCBib290YWJsZQorCisqIFNpemUgb2YgYSBibG9jayBvciB6b25lIChkYXRhIGFsbG9jYXRpb24gdW5pdCBvbiBkaXNrKQorICAtIE1pbml4IEZTICAgICAxMDI0CisgIC0gWGVuaXggRlMgICAgIDEwMjQgKGFsc28gNTEyID8/KQorICAtIFN5c3RlbVYgRlMgICAxMDI0IChhbHNvIDUxMiBhbmQgMjA0OCkKKyAgLSBDb2hlcmVudCBGUyAgIDUxMgorCisqIEdlbmVyYWwgbGF5b3V0OiBhbGwgaGF2ZSBvbmUgYm9vdCBibG9jaywgb25lIHN1cGVyIGJsb2NrIGFuZAorICBzZXBhcmF0ZSBhcmVhcyBmb3IgaW5vZGVzIGFuZCBmb3IgZGlyZWN0b3JpZXMvZGF0YS4KKyAgT24gU3lzdGVtViBSZWxlYXNlIDIgRlMgKGUuZy4gTWljcm9wb3J0KSB0aGUgZmlyc3QgdHJhY2sgaXMgcmVzZXJ2ZWQgYW5kCisgIGFsbCB0aGUgYmxvY2sgbnVtYmVycyAoaW5jbHVkaW5nIHRoZSBzdXBlciBibG9jaykgYXJlIG9mZnNldCBieSBvbmUgdHJhY2suCisKKyogQnl0ZSBvcmRlcmluZyBvZiAic2hvcnQiICgxNiBiaXQgZW50aXRpZXMpIG9uIGRpc2s6CisgIC0gTWluaXggRlMgICAgIGxpdHRsZSBlbmRpYW4gIDAgMQorICAtIFhlbml4IEZTICAgICBsaXR0bGUgZW5kaWFuICAwIDEKKyAgLSBTeXN0ZW1WIEZTICAgbGl0dGxlIGVuZGlhbiAgMCAxCisgIC0gQ29oZXJlbnQgRlMgIGxpdHRsZSBlbmRpYW4gIDAgMQorICBPZiBjb3Vyc2UsIHRoaXMgYWZmZWN0cyBvbmx5IHRoZSBmaWxlIHN5c3RlbSwgbm90IHRoZSBkYXRhIG9mIGZpbGVzIG9uIGl0IQorCisqIEJ5dGUgb3JkZXJpbmcgb2YgImxvbmciICgzMiBiaXQgZW50aXRpZXMpIG9uIGRpc2s6CisgIC0gTWluaXggRlMgICAgIGxpdHRsZSBlbmRpYW4gIDAgMSAyIDMKKyAgLSBYZW5peCBGUyAgICAgbGl0dGxlIGVuZGlhbiAgMCAxIDIgMworICAtIFN5c3RlbVYgRlMgICBsaXR0bGUgZW5kaWFuICAwIDEgMiAzCisgIC0gQ29oZXJlbnQgRlMgIFBEUC0xMSAgICAgICAgIDIgMyAwIDEKKyAgT2YgY291cnNlLCB0aGlzIGFmZmVjdHMgb25seSB0aGUgZmlsZSBzeXN0ZW0sIG5vdCB0aGUgZGF0YSBvZiBmaWxlcyBvbiBpdCEKKworKiBJbm9kZSBvbiBkaXNrOiAic2hvcnQiLCAwIG1lYW5zIG5vbi1leGlzdGVudCwgdGhlIHJvb3QgZGlyIGlubyBpczoKKyAgLSBNaW5peCBGUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisgIC0gWGVuaXggRlMsIFN5c3RlbVYgRlMsIENvaGVyZW50IEZTICAgMgorCisqIE1heGltdW0gbnVtYmVyIG9mIGhhcmQgbGlua3MgdG8gYSBmaWxlOgorICAtIE1pbml4IEZTICAgICAyNTAKKyAgLSBYZW5peCBGUyAgICAgPz8KKyAgLSBTeXN0ZW1WIEZTICAgPz8KKyAgLSBDb2hlcmVudCBGUyAgPj0xMDAwMAorCisqIEZyZWUgaW5vZGUgbWFuYWdlbWVudDoKKyAgLSBNaW5peCBGUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBiaXRtYXAKKyAgLSBYZW5peCBGUywgU3lzdGVtViBGUywgQ29oZXJlbnQgRlMKKyAgICAgIFRoZXJlIGlzIGEgY2FjaGUgb2YgYSBjZXJ0YWluIG51bWJlciBvZiBmcmVlIGlub2RlcyBpbiB0aGUgc3VwZXItYmxvY2suCisgICAgICBXaGVuIGl0IGlzIGV4aGF1c3RlZCwgbmV3IGZyZWUgaW5vZGVzIGFyZSBmb3VuZCB1c2luZyBhIGxpbmVhciBzZWFyY2guCisKKyogRnJlZSBibG9jayBtYW5hZ2VtZW50OgorICAtIE1pbml4IEZTICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGJpdG1hcAorICAtIFhlbml4IEZTLCBTeXN0ZW1WIEZTLCBDb2hlcmVudCBGUworICAgICAgRnJlZSBibG9ja3MgYXJlIG9yZ2FuaXplZCBpbiBhICJmcmVlIGxpc3QiLiBNYXliZSBhIG1pc2xlYWRpbmcgdGVybSwKKyAgICAgIHNpbmNlIGl0IGlzIG5vdCB0cnVlIHRoYXQgZXZlcnkgZnJlZSBibG9jayBjb250YWlucyBhIHBvaW50ZXIgdG8KKyAgICAgIHRoZSBuZXh0IGZyZWUgYmxvY2suIFJhdGhlciwgdGhlIGZyZWUgYmxvY2tzIGFyZSBvcmdhbml6ZWQgaW4gY2h1bmtzCisgICAgICBvZiBsaW1pdGVkIHNpemUsIGFuZCBldmVyeSBub3cgYW5kIHRoZW4gYSBmcmVlIGJsb2NrIGNvbnRhaW5zIHBvaW50ZXJzCisgICAgICB0byB0aGUgZnJlZSBibG9ja3MgcGVydGFpbmluZyB0byB0aGUgbmV4dCBjaHVuazsgdGhlIGZpcnN0IG9mIHRoZXNlCisgICAgICBjb250YWlucyBwb2ludGVycyBhbmQgc28gb24uIFRoZSBsaXN0IHRlcm1pbmF0ZXMgd2l0aCBhICJibG9jayBudW1iZXIiCisgICAgICAwIG9uIFhlbml4IEZTIGFuZCBTeXN0ZW1WIEZTLCB3aXRoIGEgYmxvY2sgemVyb2VkIG91dCBvbiBDb2hlcmVudCBGUy4KKworKiBTdXBlci1ibG9jayBsb2NhdGlvbjoKKyAgLSBNaW5peCBGUyAgICAgYmxvY2sgMSA9IGJ5dGVzIDEwMjQuLjIwNDcKKyAgLSBYZW5peCBGUyAgICAgYmxvY2sgMSA9IGJ5dGVzIDEwMjQuLjIwNDcKKyAgLSBTeXN0ZW1WIEZTICAgYnl0ZXMgNTEyLi4xMDIzCisgIC0gQ29oZXJlbnQgRlMgIGJsb2NrIDEgPSBieXRlcyA1MTIuLjEwMjMKKworKiBTdXBlci1ibG9jayBsYXlvdXQ6CisgIC0gTWluaXggRlMKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgc19uaW5vZGVzOworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBzX256b25lczsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgc19pbWFwX2Jsb2NrczsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgc196bWFwX2Jsb2NrczsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgc19maXJzdGRhdGF6b25lOworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBzX2xvZ196b25lX3NpemU7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc19tYXhfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgc19tYWdpYzsKKyAgLSBYZW5peCBGUywgU3lzdGVtViBGUywgQ29oZXJlbnQgRlMKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgc19maXJzdGRhdGF6b25lOworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICBzX256b25lczsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgc19mem9uZV9jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgc19mem9uZXNbTklDRlJFRV07CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHNfZmlub2RlX2NvdW50OworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBzX2Zpbm9kZXNbTklDSU5PRF07CisgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgIHNfZmxvY2s7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgIHNfaWxvY2s7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgIHNfbW9kaWZpZWQ7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgIHNfcmRvbmx5OworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICBzX3RpbWU7CisgICAgICAgICAgICAgICAgICAgIHNob3J0ICAgICAgICAgIHNfZGluZm9bNF07IC0tIFN5c3RlbVYgRlMgb25seQorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICBzX2ZyZWVfem9uZXM7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHNfZnJlZV9pbm9kZXM7CisgICAgICAgICAgICAgICAgICAgIHNob3J0ICAgICAgICAgIHNfZGluZm9bNF07IC0tIFhlbml4IEZTIG9ubHkKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgc19pbnRlcmxlYXZlX20sc19pbnRlcmxlYXZlX247IC0tIENvaGVyZW50IEZTIG9ubHkKKyAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgc19mbmFtZVs2XTsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgc19mcGFja1s2XTsKKyAgICB0aGVuIHRoZXkgZGlmZmVyIGNvbnNpZGVyYWJseToKKyAgICAgICAgWGVuaXggRlMKKyAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgc19jbGVhbjsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgc19maWxsWzM3MV07CisgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgIHNfbWFnaWM7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgICAgIHNfdHlwZTsKKyAgICAgICAgU3lzdGVtViBGUworICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICBzX2ZpbGxbMTIgb3IgMTRdOworICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICBzX3N0YXRlOworICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICBzX21hZ2ljOworICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgICAgICBzX3R5cGU7CisgICAgICAgIENvaGVyZW50IEZTCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgIHNfdW5pcXVlOworICAgIE5vdGUgdGhhdCBDb2hlcmVudCBGUyBoYXMgbm8gbWFnaWMuCisKKyogSW5vZGUgbGF5b3V0OgorICAtIE1pbml4IEZTCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGlfbW9kZTsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgaV91aWQ7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgIGlfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgaV90aW1lOworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICBpX2dpZDsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgaV9ubGlua3M7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGlfem9uZVs3KzErMV07CisgIC0gWGVuaXggRlMsIFN5c3RlbVYgRlMsIENvaGVyZW50IEZTCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGlfbW9kZTsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgaV9ubGluazsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgaV91aWQ7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGlfZ2lkOworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICBpX3NpemU7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgIGlfem9uZVszKigxMCsxKzErMSldOworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICBpX2F0aW1lOworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICBpX210aW1lOworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICBpX2N0aW1lOworCisqIFJlZ3VsYXIgZmlsZSBkYXRhIGJsb2NrcyBhcmUgb3JnYW5pemVkIGFzCisgIC0gTWluaXggRlMKKyAgICAgICAgICAgICAgIDcgZGlyZWN0IGJsb2NrcworICAgICAgICAgICAgICAgMSBpbmRpcmVjdCBibG9jayAocG9pbnRlcnMgdG8gYmxvY2tzKQorICAgICAgICAgICAgICAgMSBkb3VibGUtaW5kaXJlY3QgYmxvY2sgKHBvaW50ZXIgdG8gcG9pbnRlcnMgdG8gYmxvY2tzKQorICAtIFhlbml4IEZTLCBTeXN0ZW1WIEZTLCBDb2hlcmVudCBGUworICAgICAgICAgICAgICAxMCBkaXJlY3QgYmxvY2tzCisgICAgICAgICAgICAgICAxIGluZGlyZWN0IGJsb2NrIChwb2ludGVycyB0byBibG9ja3MpCisgICAgICAgICAgICAgICAxIGRvdWJsZS1pbmRpcmVjdCBibG9jayAocG9pbnRlciB0byBwb2ludGVycyB0byBibG9ja3MpCisgICAgICAgICAgICAgICAxIHRyaXBsZS1pbmRpcmVjdCBibG9jayAocG9pbnRlciB0byBwb2ludGVycyB0byBwb2ludGVycyB0byBibG9ja3MpCisKKyogSW5vZGUgc2l6ZSwgaW5vZGVzIHBlciBibG9jaworICAtIE1pbml4IEZTICAgICAgICAzMiAgIDMyCisgIC0gWGVuaXggRlMgICAgICAgIDY0ICAgMTYKKyAgLSBTeXN0ZW1WIEZTICAgICAgNjQgICAxNgorICAtIENvaGVyZW50IEZTICAgICA2NCAgICA4CisKKyogRGlyZWN0b3J5IGVudHJ5IG9uIGRpc2sKKyAgLSBNaW5peCBGUworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBpbm9kZTsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBuYW1lWzE0LzMwXTsKKyAgLSBYZW5peCBGUywgU3lzdGVtViBGUywgQ29oZXJlbnQgRlMKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgaW5vZGU7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgbmFtZVsxNF07CisKKyogRGlyIGVudHJ5IHNpemUsIGRpciBlbnRyaWVzIHBlciBibG9jaworICAtIE1pbml4IEZTICAgICAxNi8zMiAgICA2NC8zMgorICAtIFhlbml4IEZTICAgICAxNiAgICAgICA2NAorICAtIFN5c3RlbVYgRlMgICAxNiAgICAgICA2NAorICAtIENvaGVyZW50IEZTICAxNiAgICAgICAzMgorCisqIEhvdyB0byBpbXBsZW1lbnQgc3ltYm9saWMgbGlua3Mgc3VjaCB0aGF0IHRoZSBob3N0IGZzY2sgZG9lc24ndCBzY3JlYW06CisgIC0gTWluaXggRlMgICAgIG5vcm1hbAorICAtIFhlbml4IEZTICAgICBrbHVkZ2U6IGFzIHJlZ3VsYXIgZmlsZXMgd2l0aCAgY2htb2QgMTAwMAorICAtIFN5c3RlbVYgRlMgICA/PworICAtIENvaGVyZW50IEZTICBrbHVkZ2U6IGFzIHJlZ3VsYXIgZmlsZXMgd2l0aCAgY2htb2QgMTAwMAorCisKK05vdGF0aW9uOiBXZSBvZnRlbiBzcGVhayBvZiBhICJibG9jayIgYnV0IG1lYW4gYSB6b25lICh0aGUgYWxsb2NhdGlvbiB1bml0KQorYW5kIG5vdCB0aGUgZGlzayBkcml2ZXIncyBub3Rpb24gb2YgImJsb2NrIi4KKworCitCcnVubyBIYWlibGUgIDxoYWlibGVAbWEyczIubWF0aGVtYXRpay51bmkta2FybHNydWhlLmRlPgpkaWZmIC0tZ2l0IGEvZnMvc3lzdi9NYWtlZmlsZSBiL2ZzL3N5c3YvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU5MWY5ZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3N5c3YvTWFrZWZpbGUKQEAgLTAsMCArMSw4IEBACisjCisjIE1ha2VmaWxlIGZvciB0aGUgTGludXggU3lzdGVtVi9Db2hlcmVudCBmaWxlc3lzdGVtIHJvdXRpbmVzLgorIworCitvYmotJChDT05GSUdfU1lTVl9GUykgKz0gc3lzdi5vCisKK3N5c3Ytb2JqcyA6PSBpYWxsb2MubyBiYWxsb2MubyBpbm9kZS5vIGl0cmVlLm8gZmlsZS5vIGRpci5vIFwKKwkgICAgIG5hbWVpLm8gc3VwZXIubyBzeW1saW5rLm8KZGlmZiAtLWdpdCBhL2ZzL3N5c3YvYmFsbG9jLmMgYi9mcy9zeXN2L2JhbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNmFkOTZhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvc3lzdi9iYWxsb2MuYwpAQCAtMCwwICsxLDIzOSBAQAorLyoKKyAqICBsaW51eC9mcy9zeXN2L2JhbGxvYy5jCisgKgorICogIG1pbml4L2JpdG1hcC5jCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICBleHQvZnJlZWxpc3RzLmMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTIgIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKKyAqCisgKiAgeGVuaXgvYWxsb2MuYworICogIENvcHlyaWdodCAoQykgMTk5MiAgRG91ZyBFdmFucworICoKKyAqICBjb2gvYWxsb2MuYworICogIENvcHlyaWdodCAoQykgMTk5MyAgUGFzY2FsIEhhaWJsZSwgQnJ1bm8gSGFpYmxlCisgKgorICogIHN5c3YvYmFsbG9jLmMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTMgIEJydW5vIEhhaWJsZQorICoKKyAqICBUaGlzIGZpbGUgY29udGFpbnMgY29kZSBmb3IgYWxsb2NhdGluZy9mcmVlaW5nIGJsb2Nrcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlICJzeXN2LmgiCisKKy8qIFdlIGRvbid0IHRydXN0IHRoZSB2YWx1ZSBvZgorICAgc2ItPnN2X3NiZDItPnNfdGZyZWUgPSAqc2ItPnN2X2ZyZWVfYmxvY2tzCisgICBidXQgd2UgbmV2ZXJ0aGVsZXNzIGtlZXAgaXQgdXAgdG8gZGF0ZS4gKi8KKworc3RhdGljIGlubGluZSBzeXN2X3pvbmVfdCAqZ2V0X2NodW5rKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJY2hhciAqYmhfZGF0YSA9IGJoLT5iX2RhdGE7CisKKwlpZiAoU1lTVl9TQihzYiktPnNfdHlwZSA9PSBGU1RZUEVfU1lTVjQpCisJCXJldHVybiAoc3lzdl96b25lX3QqKShiaF9kYXRhKzQpOworCWVsc2UKKwkJcmV0dXJuIChzeXN2X3pvbmVfdCopKGJoX2RhdGErMik7Cit9CisKKy8qIE5PVEUgTk9URSBOT1RFOiBuciBpcyBhIGJsb2NrIG51bWJlciBfYXNfIF9zdG9yZWRfIF9vbl8gX2Rpc2tfICovCisKK3ZvaWQgc3lzdl9mcmVlX2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCBzeXN2X3pvbmVfdCBucikKK3sKKwlzdHJ1Y3Qgc3lzdl9zYl9pbmZvICogc2JpID0gU1lTVl9TQihzYik7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJc3lzdl96b25lX3QgKmJsb2NrcyA9IHNiaS0+c19iY2FjaGU7CisJdW5zaWduZWQgY291bnQ7CisJdW5zaWduZWQgYmxvY2sgPSBmczMyX3RvX2NwdShzYmksIG5yKTsKKworCS8qCisJICogVGhpcyBjb2RlIGRvZXMgbm90IHdvcmsgYXQgYWxsIGZvciBBRlMgKGl0IGhhcyBhIGJpdG1hcAorCSAqIGZyZWUgbGlzdCkuICBBcyBBRlMgaXMgc3VwcG9zZWQgdG8gYmUgcmVhZC1vbmx5IG5vIG9uZQorCSAqIHNob3VsZCBjYWxsIHRoaXMgZm9yIGFuIEFGUyBmaWxlc3lzdGVtIGFueXdheS4uLgorCSAqLworCWlmIChzYmktPnNfdHlwZSA9PSBGU1RZUEVfQUZTKQorCQlyZXR1cm47CisKKwlpZiAoYmxvY2sgPCBzYmktPnNfZmlyc3RkYXRhem9uZSB8fCBibG9jayA+PSBzYmktPnNfbnpvbmVzKSB7CisJCXByaW50aygic3lzdl9mcmVlX2Jsb2NrOiB0cnlpbmcgdG8gZnJlZSBibG9jayBub3QgaW4gZGF0YXpvbmVcbiIpOworCQlyZXR1cm47CisJfQorCisJbG9ja19zdXBlcihzYik7CisJY291bnQgPSBmczE2X3RvX2NwdShzYmksICpzYmktPnNfYmNhY2hlX2NvdW50KTsKKworCWlmIChjb3VudCA+IHNiaS0+c19mbGNfc2l6ZSkgeworCQlwcmludGsoInN5c3ZfZnJlZV9ibG9jazogZmxjX2NvdW50ID4gZmxjX3NpemVcbiIpOworCQl1bmxvY2tfc3VwZXIoc2IpOworCQlyZXR1cm47CisJfQorCS8qIElmIHRoZSBmcmVlIGxpc3QgaGVhZCBpbiBzdXBlci1ibG9jayBpcyBmdWxsLCBpdCBpcyBjb3BpZWQKKwkgKiBpbnRvIHRoaXMgYmxvY2sgYmVpbmcgZnJlZWQsIGRpdHRvIGlmIGl0J3MgY29tcGxldGVseSBlbXB0eQorCSAqIChhcHBsaWVzIG9ubHkgb24gQ29oZXJlbnQpLgorCSAqLworCWlmIChjb3VudCA9PSBzYmktPnNfZmxjX3NpemUgfHwgY291bnQgPT0gMCkgeworCQlibG9jayArPSBzYmktPnNfYmxvY2tfYmFzZTsKKwkJYmggPSBzYl9nZXRibGsoc2IsIGJsb2NrKTsKKwkJaWYgKCFiaCkgeworCQkJcHJpbnRrKCJzeXN2X2ZyZWVfYmxvY2s6IGdldGJsaygpIGZhaWxlZFxuIik7CisJCQl1bmxvY2tfc3VwZXIoc2IpOworCQkJcmV0dXJuOworCQl9CisJCW1lbXNldChiaC0+Yl9kYXRhLCAwLCBzYi0+c19ibG9ja3NpemUpOworCQkqKF9fZnMxNiopYmgtPmJfZGF0YSA9IGNwdV90b19mczE2KHNiaSwgY291bnQpOworCQltZW1jcHkoZ2V0X2NodW5rKHNiLGJoKSwgYmxvY2tzLCBjb3VudCAqIHNpemVvZihzeXN2X3pvbmVfdCkpOworCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQlicmVsc2UoYmgpOworCQljb3VudCA9IDA7CisJfQorCXNiaS0+c19iY2FjaGVbY291bnQrK10gPSBucjsKKworCSpzYmktPnNfYmNhY2hlX2NvdW50ID0gY3B1X3RvX2ZzMTYoc2JpLCBjb3VudCk7CisJZnMzMl9hZGQoc2JpLCBzYmktPnNfZnJlZV9ibG9ja3MsIDEpOworCWRpcnR5X3NiKHNiKTsKKwl1bmxvY2tfc3VwZXIoc2IpOworfQorCitzeXN2X3pvbmVfdCBzeXN2X25ld19ibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYikKK3sKKwlzdHJ1Y3Qgc3lzdl9zYl9pbmZvICpzYmkgPSBTWVNWX1NCKHNiKTsKKwl1bnNpZ25lZCBpbnQgYmxvY2s7CisJc3lzdl96b25lX3QgbnI7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJdW5zaWduZWQgY291bnQ7CisKKwlsb2NrX3N1cGVyKHNiKTsKKwljb3VudCA9IGZzMTZfdG9fY3B1KHNiaSwgKnNiaS0+c19iY2FjaGVfY291bnQpOworCisJaWYgKGNvdW50ID09IDApIC8qIEFwcGxpZXMgb25seSB0byBDb2hlcmVudCBGUyAqLworCQlnb3RvIEVub3NwYzsKKwluciA9IHNiaS0+c19iY2FjaGVbLS1jb3VudF07CisJaWYgKG5yID09IDApICAvKiBBcHBsaWVzIG9ubHkgdG8gWGVuaXggRlMsIFN5c3RlbVYgRlMgKi8KKwkJZ290byBFbm9zcGM7CisKKwlibG9jayA9IGZzMzJfdG9fY3B1KHNiaSwgbnIpOworCisJKnNiaS0+c19iY2FjaGVfY291bnQgPSBjcHVfdG9fZnMxNihzYmksIGNvdW50KTsKKworCWlmIChibG9jayA8IHNiaS0+c19maXJzdGRhdGF6b25lIHx8IGJsb2NrID49IHNiaS0+c19uem9uZXMpIHsKKwkJcHJpbnRrKCJzeXN2X25ld19ibG9jazogbmV3IGJsb2NrICVkIGlzIG5vdCBpbiBkYXRhIHpvbmVcbiIsCisJCQlibG9jayk7CisJCWdvdG8gRW5vc3BjOworCX0KKworCWlmIChjb3VudCA9PSAwKSB7IC8qIHRoZSBsYXN0IGJsb2NrIGNvbnRpbnVlcyB0aGUgZnJlZSBsaXN0ICovCisJCXVuc2lnbmVkIGNvdW50OworCisJCWJsb2NrICs9IHNiaS0+c19ibG9ja19iYXNlOworCQlpZiAoIShiaCA9IHNiX2JyZWFkKHNiLCBibG9jaykpKSB7CisJCQlwcmludGsoInN5c3ZfbmV3X2Jsb2NrOiBjYW5ub3QgcmVhZCBmcmVlLWxpc3QgYmxvY2tcbiIpOworCQkJLyogcmV0cnkgdGhpcyBzYW1lIGJsb2NrIG5leHQgdGltZSAqLworCQkJKnNiaS0+c19iY2FjaGVfY291bnQgPSBjcHVfdG9fZnMxNihzYmksIDEpOworCQkJZ290byBFbm9zcGM7CisJCX0KKwkJY291bnQgPSBmczE2X3RvX2NwdShzYmksICooX19mczE2KiliaC0+Yl9kYXRhKTsKKwkJaWYgKGNvdW50ID4gc2JpLT5zX2ZsY19zaXplKSB7CisJCQlwcmludGsoInN5c3ZfbmV3X2Jsb2NrOiBmcmVlLWxpc3QgYmxvY2sgd2l0aCA+ZmxjX3NpemUgZW50cmllc1xuIik7CisJCQlicmVsc2UoYmgpOworCQkJZ290byBFbm9zcGM7CisJCX0KKwkJKnNiaS0+c19iY2FjaGVfY291bnQgPSBjcHVfdG9fZnMxNihzYmksIGNvdW50KTsKKwkJbWVtY3B5KHNiaS0+c19iY2FjaGUsIGdldF9jaHVuayhzYiwgYmgpLAorCQkJCWNvdW50ICogc2l6ZW9mKHN5c3Zfem9uZV90KSk7CisJCWJyZWxzZShiaCk7CisJfQorCS8qIE5vdyB0aGUgZnJlZSBsaXN0IGhlYWQgaW4gdGhlIHN1cGVyYmxvY2sgaXMgdmFsaWQgYWdhaW4uICovCisJZnMzMl9hZGQoc2JpLCBzYmktPnNfZnJlZV9ibG9ja3MsIC0xKTsKKwlkaXJ0eV9zYihzYik7CisJdW5sb2NrX3N1cGVyKHNiKTsKKwlyZXR1cm4gbnI7CisKK0Vub3NwYzoKKwl1bmxvY2tfc3VwZXIoc2IpOworCXJldHVybiAwOworfQorCit1bnNpZ25lZCBsb25nIHN5c3ZfY291bnRfZnJlZV9ibG9ja3Moc3RydWN0IHN1cGVyX2Jsb2NrICogc2IpCit7CisJc3RydWN0IHN5c3Zfc2JfaW5mbyAqIHNiaSA9IFNZU1ZfU0Ioc2IpOworCWludCBzYl9jb3VudDsKKwlpbnQgY291bnQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmggPSBOVUxMOworCXN5c3Zfem9uZV90ICpibG9ja3M7CisJdW5zaWduZWQgYmxvY2s7CisJaW50IG47CisKKwkvKgorCSAqIFRoaXMgY29kZSBkb2VzIG5vdCB3b3JrIGF0IGFsbCBmb3IgQUZTIChpdCBoYXMgYSBiaXRtYXAKKwkgKiBmcmVlIGxpc3QpLiAgQXMgQUZTIGlzIHN1cHBvc2VkIHRvIGJlIHJlYWQtb25seSB3ZSBqdXN0CisJICogbGllIGFuZCBzYXkgaXQgaGFzIG5vIGZyZWUgYmxvY2sgYXQgYWxsLgorCSAqLworCWlmIChzYmktPnNfdHlwZSA9PSBGU1RZUEVfQUZTKQorCQlyZXR1cm4gMDsKKworCWxvY2tfc3VwZXIoc2IpOworCXNiX2NvdW50ID0gZnMzMl90b19jcHUoc2JpLCAqc2JpLT5zX2ZyZWVfYmxvY2tzKTsKKworCWlmICgwKQorCQlnb3RvIHRydXN0X3NiOworCisJLyogdGhpcyBjYXVzZXMgYSBsb3Qgb2YgZGlzayB0cmFmZmljIC4uLiAqLworCWNvdW50ID0gMDsKKwluID0gZnMxNl90b19jcHUoc2JpLCAqc2JpLT5zX2JjYWNoZV9jb3VudCk7CisJYmxvY2tzID0gc2JpLT5zX2JjYWNoZTsKKwl3aGlsZSAoMSkgeworCQlzeXN2X3pvbmVfdCB6b25lOworCQlpZiAobiA+IHNiaS0+c19mbGNfc2l6ZSkKKwkJCWdvdG8gRTJiaWc7CisJCXpvbmUgPSAwOworCQl3aGlsZSAobiAmJiAoem9uZSA9IGJsb2Nrc1stLW5dKSAhPSAwKQorCQkJY291bnQrKzsKKwkJaWYgKHpvbmUgPT0gMCkKKwkJCWJyZWFrOworCisJCWJsb2NrID0gZnMzMl90b19jcHUoc2JpLCB6b25lKTsKKwkJaWYgKGJoKQorCQkJYnJlbHNlKGJoKTsKKworCQlpZiAoYmxvY2sgPCBzYmktPnNfZmlyc3RkYXRhem9uZSB8fCBibG9jayA+PSBzYmktPnNfbnpvbmVzKQorCQkJZ290byBFaW52YWw7CisJCWJsb2NrICs9IHNiaS0+c19ibG9ja19iYXNlOworCQliaCA9IHNiX2JyZWFkKHNiLCBibG9jayk7CisJCWlmICghYmgpCisJCQlnb3RvIEVpbzsKKwkJbiA9IGZzMTZfdG9fY3B1KHNiaSwgKihfX2ZzMTYqKWJoLT5iX2RhdGEpOworCQlibG9ja3MgPSBnZXRfY2h1bmsoc2IsIGJoKTsKKwl9CisJaWYgKGJoKQorCQlicmVsc2UoYmgpOworCWlmIChjb3VudCAhPSBzYl9jb3VudCkKKwkJZ290byBFY291bnQ7Citkb25lOgorCXVubG9ja19zdXBlcihzYik7CisJcmV0dXJuIGNvdW50OworCitFaW52YWw6CisJcHJpbnRrKCJzeXN2X2NvdW50X2ZyZWVfYmxvY2tzOiBuZXcgYmxvY2sgJWQgaXMgbm90IGluIGRhdGEgem9uZVxuIiwKKwkJYmxvY2spOworCWdvdG8gdHJ1c3Rfc2I7CitFaW86CisJcHJpbnRrKCJzeXN2X2NvdW50X2ZyZWVfYmxvY2tzOiBjYW5ub3QgcmVhZCBmcmVlLWxpc3QgYmxvY2tcbiIpOworCWdvdG8gdHJ1c3Rfc2I7CitFMmJpZzoKKwlwcmludGsoInN5c3ZfY291bnRfZnJlZV9ibG9ja3M6ID5mbGNfc2l6ZSBlbnRyaWVzIGluIGZyZWUtbGlzdCBibG9ja1xuIik7CisJaWYgKGJoKQorCQlicmVsc2UoYmgpOwordHJ1c3Rfc2I6CisJY291bnQgPSBzYl9jb3VudDsKKwlnb3RvIGRvbmU7CitFY291bnQ6CisJcHJpbnRrKCJzeXN2X2NvdW50X2ZyZWVfYmxvY2tzOiBmcmVlIGJsb2NrIGNvdW50IHdhcyAlZCwgIgorCQkiY29ycmVjdGluZyB0byAlZFxuIiwgc2JfY291bnQsIGNvdW50KTsKKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJKnNiaS0+c19mcmVlX2Jsb2NrcyA9IGNwdV90b19mczMyKHNiaSwgY291bnQpOworCQlkaXJ0eV9zYihzYik7CisJfQorCWdvdG8gZG9uZTsKK30KZGlmZiAtLWdpdCBhL2ZzL3N5c3YvZGlyLmMgYi9mcy9zeXN2L2Rpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YTA4NWEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9zeXN2L2Rpci5jCkBAIC0wLDAgKzEsMzg4IEBACisvKgorICogIGxpbnV4L2ZzL3N5c3YvZGlyLmMKKyAqCisgKiAgbWluaXgvZGlyLmMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKgorICogIGNvaC9kaXIuYworICogIENvcHlyaWdodCAoQykgMTk5MyAgUGFzY2FsIEhhaWJsZSwgQnJ1bm8gSGFpYmxlCisgKgorICogIHN5c3YvZGlyLmMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTMgIEJydW5vIEhhaWJsZQorICoKKyAqICBTeXN0ZW1WL0NvaGVyZW50IGRpcmVjdG9yeSBoYW5kbGluZyBmdW5jdGlvbnMKKyAqLworCisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgInN5c3YuaCIKKworc3RhdGljIGludCBzeXN2X3JlYWRkaXIoc3RydWN0IGZpbGUgKiwgdm9pZCAqLCBmaWxsZGlyX3QpOworCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHN5c3ZfZGlyX29wZXJhdGlvbnMgPSB7CisJLnJlYWQJCT0gZ2VuZXJpY19yZWFkX2RpciwKKwkucmVhZGRpcgk9IHN5c3ZfcmVhZGRpciwKKwkuZnN5bmMJCT0gc3lzdl9zeW5jX2ZpbGUsCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgZGlyX3B1dF9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQoreworCWt1bm1hcChwYWdlKTsKKwlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBkaXJfcGFnZXMoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gKGlub2RlLT5pX3NpemUrUEFHRV9DQUNIRV9TSVpFLTEpPj5QQUdFX0NBQ0hFX1NISUZUOworfQorCitzdGF0aWMgaW50IGRpcl9jb21taXRfY2h1bmsoc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCXN0cnVjdCBpbm9kZSAqZGlyID0gKHN0cnVjdCBpbm9kZSAqKXBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJaW50IGVyciA9IDA7CisKKwlwYWdlLT5tYXBwaW5nLT5hX29wcy0+Y29tbWl0X3dyaXRlKE5VTEwsIHBhZ2UsIGZyb20sIHRvKTsKKwlpZiAoSVNfRElSU1lOQyhkaXIpKQorCQllcnIgPSB3cml0ZV9vbmVfcGFnZShwYWdlLCAxKTsKKwllbHNlCisJCXVubG9ja19wYWdlKHBhZ2UpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqIGRpcl9nZXRfcGFnZShzdHJ1Y3QgaW5vZGUgKmRpciwgdW5zaWduZWQgbG9uZyBuKQoreworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZGlyLT5pX21hcHBpbmc7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSByZWFkX2NhY2hlX3BhZ2UobWFwcGluZywgbiwKKwkJCQkoZmlsbGVyX3QqKW1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZSwgTlVMTCk7CisJaWYgKCFJU19FUlIocGFnZSkpIHsKKwkJd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKKwkJa21hcChwYWdlKTsKKwkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpCisJCQlnb3RvIGZhaWw7CisJfQorCXJldHVybiBwYWdlOworCitmYWlsOgorCWRpcl9wdXRfcGFnZShwYWdlKTsKKwlyZXR1cm4gRVJSX1BUUigtRUlPKTsKK30KKworc3RhdGljIGludCBzeXN2X3JlYWRkaXIoc3RydWN0IGZpbGUgKiBmaWxwLCB2b2lkICogZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwl1bnNpZ25lZCBsb25nIHBvcyA9IGZpbHAtPmZfcG9zOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJdW5zaWduZWQgb2Zmc2V0ID0gcG9zICYgflBBR0VfQ0FDSEVfTUFTSzsKKwl1bnNpZ25lZCBsb25nIG4gPSBwb3MgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwl1bnNpZ25lZCBsb25nIG5wYWdlcyA9IGRpcl9wYWdlcyhpbm9kZSk7CisKKwlsb2NrX2tlcm5lbCgpOworCisJcG9zID0gKHBvcyArIFNZU1ZfRElSU0laRS0xKSAmIH4oU1lTVl9ESVJTSVpFLTEpOworCWlmIChwb3MgPj0gaW5vZGUtPmlfc2l6ZSkKKwkJZ290byBkb25lOworCisJZm9yICggOyBuIDwgbnBhZ2VzOyBuKyssIG9mZnNldCA9IDApIHsKKwkJY2hhciAqa2FkZHIsICpsaW1pdDsKKwkJc3RydWN0IHN5c3ZfZGlyX2VudHJ5ICpkZTsKKwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBkaXJfZ2V0X3BhZ2UoaW5vZGUsIG4pOworCisJCWlmIChJU19FUlIocGFnZSkpCisJCQljb250aW51ZTsKKwkJa2FkZHIgPSAoY2hhciAqKXBhZ2VfYWRkcmVzcyhwYWdlKTsKKwkJZGUgPSAoc3RydWN0IHN5c3ZfZGlyX2VudHJ5ICopKGthZGRyK29mZnNldCk7CisJCWxpbWl0ID0ga2FkZHIgKyBQQUdFX0NBQ0hFX1NJWkUgLSBTWVNWX0RJUlNJWkU7CisJCWZvciAoIDsoY2hhciopZGUgPD0gbGltaXQ7IGRlKyspIHsKKwkJCWNoYXIgKm5hbWUgPSBkZS0+bmFtZTsKKwkJCWludCBvdmVyOworCisJCQlpZiAoIWRlLT5pbm9kZSkKKwkJCQljb250aW51ZTsKKworCQkJb2Zmc2V0ID0gKGNoYXIgKilkZSAtIGthZGRyOworCisJCQlvdmVyID0gZmlsbGRpcihkaXJlbnQsIG5hbWUsIHN0cm5sZW4obmFtZSxTWVNWX05BTUVMRU4pLAorCQkJCQkobjw8UEFHRV9DQUNIRV9TSElGVCkgfCBvZmZzZXQsCisJCQkJCWZzMTZfdG9fY3B1KFNZU1ZfU0Ioc2IpLCBkZS0+aW5vZGUpLAorCQkJCQlEVF9VTktOT1dOKTsKKwkJCWlmIChvdmVyKSB7CisJCQkJZGlyX3B1dF9wYWdlKHBhZ2UpOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJfQorCQlkaXJfcHV0X3BhZ2UocGFnZSk7CisJfQorCitkb25lOgorCWZpbHAtPmZfcG9zID0gKG4gPDwgUEFHRV9DQUNIRV9TSElGVCkgfCBvZmZzZXQ7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCisvKiBjb21wYXJlIHN0cmluZ3M6IG5hbWVbMC4ubGVuLTFdIChub3QgemVyby10ZXJtaW5hdGVkKSBhbmQKKyAqIGJ1ZmZlclswLi5dIChmaWxsZWQgd2l0aCB6ZXJvZXMgdXAgdG8gYnVmZmVyWzAuLm1heGxlbi0xXSkKKyAqLworc3RhdGljIGlubGluZSBpbnQgbmFtZWNvbXBhcmUoaW50IGxlbiwgaW50IG1heGxlbiwKKwljb25zdCBjaGFyICogbmFtZSwgY29uc3QgY2hhciAqIGJ1ZmZlcikKK3sKKwlpZiAobGVuIDwgbWF4bGVuICYmIGJ1ZmZlcltsZW5dKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gIW1lbWNtcChuYW1lLCBidWZmZXIsIGxlbik7Cit9CisKKy8qCisgKglzeXN2X2ZpbmRfZW50cnkoKQorICoKKyAqIGZpbmRzIGFuIGVudHJ5IGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IHdpdGggdGhlIHdhbnRlZCBuYW1lLiBJdAorICogcmV0dXJucyB0aGUgY2FjaGUgYnVmZmVyIGluIHdoaWNoIHRoZSBlbnRyeSB3YXMgZm91bmQsIGFuZCB0aGUgZW50cnkKKyAqIGl0c2VsZiAoYXMgYSBwYXJhbWV0ZXIgLSByZXNfZGlyKS4gSXQgZG9lcyBOT1QgcmVhZCB0aGUgaW5vZGUgb2YgdGhlCisgKiBlbnRyeSAtIHlvdSdsbCBoYXZlIHRvIGRvIHRoYXQgeW91cnNlbGYgaWYgeW91IHdhbnQgdG8uCisgKi8KK3N0cnVjdCBzeXN2X2Rpcl9lbnRyeSAqc3lzdl9maW5kX2VudHJ5KHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHBhZ2UgKipyZXNfcGFnZSkKK3sKKwljb25zdCBjaGFyICogbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7CisJaW50IG5hbWVsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisJc3RydWN0IGlub2RlICogZGlyID0gZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0LCBuOworCXVuc2lnbmVkIGxvbmcgbnBhZ2VzID0gZGlyX3BhZ2VzKGRpcik7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOworCXN0cnVjdCBzeXN2X2Rpcl9lbnRyeSAqZGU7CisKKwkqcmVzX3BhZ2UgPSBOVUxMOworCisJc3RhcnQgPSBTWVNWX0koZGlyKS0+aV9kaXJfc3RhcnRfbG9va3VwOworCWlmIChzdGFydCA+PSBucGFnZXMpCisJCXN0YXJ0ID0gMDsKKwluID0gc3RhcnQ7CisKKwlkbyB7CisJCWNoYXIgKmthZGRyOworCQlwYWdlID0gZGlyX2dldF9wYWdlKGRpciwgbik7CisJCWlmICghSVNfRVJSKHBhZ2UpKSB7CisJCQlrYWRkciA9IChjaGFyKilwYWdlX2FkZHJlc3MocGFnZSk7CisJCQlkZSA9IChzdHJ1Y3Qgc3lzdl9kaXJfZW50cnkgKikga2FkZHI7CisJCQlrYWRkciArPSBQQUdFX0NBQ0hFX1NJWkUgLSBTWVNWX0RJUlNJWkU7CisJCQlmb3IgKCA7IChjaGFyICopIGRlIDw9IGthZGRyIDsgZGUrKykgeworCQkJCWlmICghZGUtPmlub2RlKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAobmFtZWNvbXBhcmUobmFtZWxlbiwgU1lTVl9OQU1FTEVOLAorCQkJCQkJCW5hbWUsIGRlLT5uYW1lKSkKKwkJCQkJZ290byBmb3VuZDsKKwkJCX0KKwkJfQorCQlkaXJfcHV0X3BhZ2UocGFnZSk7CisKKwkJaWYgKCsrbiA+PSBucGFnZXMpCisJCQluID0gMDsKKwl9IHdoaWxlIChuICE9IHN0YXJ0KTsKKworCXJldHVybiBOVUxMOworCitmb3VuZDoKKwlTWVNWX0koZGlyKS0+aV9kaXJfc3RhcnRfbG9va3VwID0gbjsKKwkqcmVzX3BhZ2UgPSBwYWdlOworCXJldHVybiBkZTsKK30KKworaW50IHN5c3ZfYWRkX2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBpbm9kZSAqZGlyID0gZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZTsKKwljb25zdCBjaGFyICogbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7CisJaW50IG5hbWVsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOworCXN0cnVjdCBzeXN2X2Rpcl9lbnRyeSAqIGRlOworCXVuc2lnbmVkIGxvbmcgbnBhZ2VzID0gZGlyX3BhZ2VzKGRpcik7CisJdW5zaWduZWQgbG9uZyBuOworCWNoYXIgKmthZGRyOworCXVuc2lnbmVkIGZyb20sIHRvOworCWludCBlcnI7CisKKwkvKiBXZSB0YWtlIGNhcmUgb2YgZGlyZWN0b3J5IGV4cGFuc2lvbiBpbiB0aGUgc2FtZSBsb29wICovCisJZm9yIChuID0gMDsgbiA8PSBucGFnZXM7IG4rKykgeworCQlwYWdlID0gZGlyX2dldF9wYWdlKGRpciwgbik7CisJCWVyciA9IFBUUl9FUlIocGFnZSk7CisJCWlmIChJU19FUlIocGFnZSkpCisJCQlnb3RvIG91dDsKKwkJa2FkZHIgPSAoY2hhciopcGFnZV9hZGRyZXNzKHBhZ2UpOworCQlkZSA9IChzdHJ1Y3Qgc3lzdl9kaXJfZW50cnkgKilrYWRkcjsKKwkJa2FkZHIgKz0gUEFHRV9DQUNIRV9TSVpFIC0gU1lTVl9ESVJTSVpFOworCQl3aGlsZSAoKGNoYXIgKilkZSA8PSBrYWRkcikgeworCQkJaWYgKCFkZS0+aW5vZGUpCisJCQkJZ290byBnb3RfaXQ7CisJCQllcnIgPSAtRUVYSVNUOworCQkJaWYgKG5hbWVjb21wYXJlKG5hbWVsZW4sIFNZU1ZfTkFNRUxFTiwgbmFtZSwgZGUtPm5hbWUpKSAKKwkJCQlnb3RvIG91dF9wYWdlOworCQkJZGUrKzsKKwkJfQorCQlkaXJfcHV0X3BhZ2UocGFnZSk7CisJfQorCUJVRygpOworCXJldHVybiAtRUlOVkFMOworCitnb3RfaXQ6CisJZnJvbSA9IChjaGFyKilkZSAtIChjaGFyKilwYWdlX2FkZHJlc3MocGFnZSk7CisJdG8gPSBmcm9tICsgU1lTVl9ESVJTSVpFOworCWxvY2tfcGFnZShwYWdlKTsKKwllcnIgPSBwYWdlLT5tYXBwaW5nLT5hX29wcy0+cHJlcGFyZV93cml0ZShOVUxMLCBwYWdlLCBmcm9tLCB0byk7CisJaWYgKGVycikKKwkJZ290byBvdXRfdW5sb2NrOworCW1lbWNweSAoZGUtPm5hbWUsIG5hbWUsIG5hbWVsZW4pOworCW1lbXNldCAoZGUtPm5hbWUgKyBuYW1lbGVuLCAwLCBTWVNWX0RJUlNJWkUgLSBuYW1lbGVuIC0gMik7CisJZGUtPmlub2RlID0gY3B1X3RvX2ZzMTYoU1lTVl9TQihpbm9kZS0+aV9zYiksIGlub2RlLT5pX2lubyk7CisJZXJyID0gZGlyX2NvbW1pdF9jaHVuayhwYWdlLCBmcm9tLCB0byk7CisJZGlyLT5pX210aW1lID0gZGlyLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwltYXJrX2lub2RlX2RpcnR5KGRpcik7CitvdXRfcGFnZToKKwlkaXJfcHV0X3BhZ2UocGFnZSk7CitvdXQ6CisJcmV0dXJuIGVycjsKK291dF91bmxvY2s6CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJZ290byBvdXRfcGFnZTsKK30KKworaW50IHN5c3ZfZGVsZXRlX2VudHJ5KHN0cnVjdCBzeXN2X2Rpcl9lbnRyeSAqZGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gcGFnZS0+bWFwcGluZzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gKHN0cnVjdCBpbm9kZSopbWFwcGluZy0+aG9zdDsKKwljaGFyICprYWRkciA9IChjaGFyKilwYWdlX2FkZHJlc3MocGFnZSk7CisJdW5zaWduZWQgZnJvbSA9IChjaGFyKilkZSAtIGthZGRyOworCXVuc2lnbmVkIHRvID0gZnJvbSArIFNZU1ZfRElSU0laRTsKKwlpbnQgZXJyOworCisJbG9ja19wYWdlKHBhZ2UpOworCWVyciA9IG1hcHBpbmctPmFfb3BzLT5wcmVwYXJlX3dyaXRlKE5VTEwsIHBhZ2UsIGZyb20sIHRvKTsKKwlpZiAoZXJyKQorCQlCVUcoKTsKKwlkZS0+aW5vZGUgPSAwOworCWVyciA9IGRpcl9jb21taXRfY2h1bmsocGFnZSwgZnJvbSwgdG8pOworCWRpcl9wdXRfcGFnZShwYWdlKTsKKwlpbm9kZS0+aV9jdGltZSA9IGlub2RlLT5pX210aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgc3lzdl9tYWtlX2VtcHR5KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpbm9kZSAqZGlyKQoreworCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGdyYWJfY2FjaGVfcGFnZShtYXBwaW5nLCAwKTsKKwlzdHJ1Y3Qgc3lzdl9kaXJfZW50cnkgKiBkZTsKKwljaGFyICpiYXNlOworCWludCBlcnI7CisKKwlpZiAoIXBhZ2UpCisJCXJldHVybiAtRU5PTUVNOworCWttYXAocGFnZSk7CisJZXJyID0gbWFwcGluZy0+YV9vcHMtPnByZXBhcmVfd3JpdGUoTlVMTCwgcGFnZSwgMCwgMiAqIFNZU1ZfRElSU0laRSk7CisJaWYgKGVycikgeworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJZ290byBmYWlsOworCX0KKworCWJhc2UgPSAoY2hhciopcGFnZV9hZGRyZXNzKHBhZ2UpOworCW1lbXNldChiYXNlLCAwLCBQQUdFX0NBQ0hFX1NJWkUpOworCisJZGUgPSAoc3RydWN0IHN5c3ZfZGlyX2VudHJ5ICopIGJhc2U7CisJZGUtPmlub2RlID0gY3B1X3RvX2ZzMTYoU1lTVl9TQihpbm9kZS0+aV9zYiksIGlub2RlLT5pX2lubyk7CisJc3RyY3B5KGRlLT5uYW1lLCIuIik7CisJZGUrKzsKKwlkZS0+aW5vZGUgPSBjcHVfdG9fZnMxNihTWVNWX1NCKGlub2RlLT5pX3NiKSwgZGlyLT5pX2lubyk7CisJc3RyY3B5KGRlLT5uYW1lLCIuLiIpOworCisJZXJyID0gZGlyX2NvbW1pdF9jaHVuayhwYWdlLCAwLCAyICogU1lTVl9ESVJTSVpFKTsKK2ZhaWw6CisJa3VubWFwKHBhZ2UpOworCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogcm91dGluZSB0byBjaGVjayB0aGF0IHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IGlzIGVtcHR5IChmb3Igcm1kaXIpCisgKi8KK2ludCBzeXN2X2VtcHR5X2RpcihzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgaSwgbnBhZ2VzID0gZGlyX3BhZ2VzKGlub2RlKTsKKworCWZvciAoaSA9IDA7IGkgPCBucGFnZXM7IGkrKykgeworCQljaGFyICprYWRkcjsKKwkJc3RydWN0IHN5c3ZfZGlyX2VudHJ5ICogZGU7CisJCXBhZ2UgPSBkaXJfZ2V0X3BhZ2UoaW5vZGUsIGkpOworCisJCWlmIChJU19FUlIocGFnZSkpCisJCQljb250aW51ZTsKKworCQlrYWRkciA9IChjaGFyICopcGFnZV9hZGRyZXNzKHBhZ2UpOworCQlkZSA9IChzdHJ1Y3Qgc3lzdl9kaXJfZW50cnkgKilrYWRkcjsKKwkJa2FkZHIgKz0gUEFHRV9DQUNIRV9TSVpFLVNZU1ZfRElSU0laRTsKKworCQlmb3IgKCA7KGNoYXIgKilkZSA8PSBrYWRkcjsgZGUrKykgeworCQkJaWYgKCFkZS0+aW5vZGUpCisJCQkJY29udGludWU7CisJCQkvKiBjaGVjayBmb3IgLiBhbmQgLi4gKi8KKwkJCWlmIChkZS0+bmFtZVswXSAhPSAnLicpCisJCQkJZ290byBub3RfZW1wdHk7CisJCQlpZiAoIWRlLT5uYW1lWzFdKSB7CisJCQkJaWYgKGRlLT5pbm9kZSA9PSBjcHVfdG9fZnMxNihTWVNWX1NCKHNiKSwKKwkJCQkJCQlpbm9kZS0+aV9pbm8pKQorCQkJCQljb250aW51ZTsKKwkJCQlnb3RvIG5vdF9lbXB0eTsKKwkJCX0KKwkJCWlmIChkZS0+bmFtZVsxXSAhPSAnLicgfHwgZGUtPm5hbWVbMl0pCisJCQkJZ290byBub3RfZW1wdHk7CisJCX0KKwkJZGlyX3B1dF9wYWdlKHBhZ2UpOworCX0KKwlyZXR1cm4gMTsKKworbm90X2VtcHR5OgorCWRpcl9wdXRfcGFnZShwYWdlKTsKKwlyZXR1cm4gMDsKK30KKworLyogUmVsZWFzZXMgdGhlIHBhZ2UgKi8KK3ZvaWQgc3lzdl9zZXRfbGluayhzdHJ1Y3Qgc3lzdl9kaXJfZW50cnkgKmRlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXN0cnVjdCBpbm9kZSAqZGlyID0gKHN0cnVjdCBpbm9kZSopcGFnZS0+bWFwcGluZy0+aG9zdDsKKwl1bnNpZ25lZCBmcm9tID0gKGNoYXIgKilkZS0oY2hhciopcGFnZV9hZGRyZXNzKHBhZ2UpOworCXVuc2lnbmVkIHRvID0gZnJvbSArIFNZU1ZfRElSU0laRTsKKwlpbnQgZXJyOworCisJbG9ja19wYWdlKHBhZ2UpOworCWVyciA9IHBhZ2UtPm1hcHBpbmctPmFfb3BzLT5wcmVwYXJlX3dyaXRlKE5VTEwsIHBhZ2UsIGZyb20sIHRvKTsKKwlpZiAoZXJyKQorCQlCVUcoKTsKKwlkZS0+aW5vZGUgPSBjcHVfdG9fZnMxNihTWVNWX1NCKGlub2RlLT5pX3NiKSwgaW5vZGUtPmlfaW5vKTsKKwllcnIgPSBkaXJfY29tbWl0X2NodW5rKHBhZ2UsIGZyb20sIHRvKTsKKwlkaXJfcHV0X3BhZ2UocGFnZSk7CisJZGlyLT5pX210aW1lID0gZGlyLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwltYXJrX2lub2RlX2RpcnR5KGRpcik7Cit9CisKK3N0cnVjdCBzeXN2X2Rpcl9lbnRyeSAqIHN5c3ZfZG90ZG90IChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHBhZ2UgKipwKQoreworCXN0cnVjdCBwYWdlICpwYWdlID0gZGlyX2dldF9wYWdlKGRpciwgMCk7CisJc3RydWN0IHN5c3ZfZGlyX2VudHJ5ICpkZSA9IE5VTEw7CisKKwlpZiAoIUlTX0VSUihwYWdlKSkgeworCQlkZSA9IChzdHJ1Y3Qgc3lzdl9kaXJfZW50cnkqKSBwYWdlX2FkZHJlc3MocGFnZSkgKyAxOworCQkqcCA9IHBhZ2U7CisJfQorCXJldHVybiBkZTsKK30KKworaW5vX3Qgc3lzdl9pbm9kZV9ieV9uYW1lKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlzdHJ1Y3Qgc3lzdl9kaXJfZW50cnkgKmRlID0gc3lzdl9maW5kX2VudHJ5IChkZW50cnksICZwYWdlKTsKKwlpbm9fdCByZXMgPSAwOworCQorCWlmIChkZSkgeworCQlyZXMgPSBmczE2X3RvX2NwdShTWVNWX1NCKGRlbnRyeS0+ZF9zYiksIGRlLT5pbm9kZSk7CisJCWRpcl9wdXRfcGFnZShwYWdlKTsKKwl9CisJcmV0dXJuIHJlczsKK30KZGlmZiAtLWdpdCBhL2ZzL3N5c3YvZmlsZS5jIGIvZnMvc3lzdi9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE2OWFiYwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3N5c3YvZmlsZS5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiAgbGludXgvZnMvc3lzdi9maWxlLmMKKyAqCisgKiAgbWluaXgvZmlsZS5jCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICBjb2gvZmlsZS5jCisgKiAgQ29weXJpZ2h0IChDKSAxOTkzICBQYXNjYWwgSGFpYmxlLCBCcnVubyBIYWlibGUKKyAqCisgKiAgc3lzdi9maWxlLmMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTMgIEJydW5vIEhhaWJsZQorICoKKyAqICBTeXN0ZW1WL0NvaGVyZW50IHJlZ3VsYXIgZmlsZSBoYW5kbGluZyBwcmltaXRpdmVzCisgKi8KKworI2luY2x1ZGUgInN5c3YuaCIKKworLyoKKyAqIFdlIGhhdmUgbW9zdGx5IE5VTExzIGhlcmU6IHRoZSBjdXJyZW50IGRlZmF1bHRzIGFyZSBPSyBmb3IKKyAqIHRoZSBjb2ggZmlsZXN5c3RlbS4KKyAqLworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzeXN2X2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlYWQJCT0gZ2VuZXJpY19maWxlX3JlYWQsCisJLndyaXRlCQk9IGdlbmVyaWNfZmlsZV93cml0ZSwKKwkubW1hcAkJPSBnZW5lcmljX2ZpbGVfbW1hcCwKKwkuZnN5bmMJCT0gc3lzdl9zeW5jX2ZpbGUsCisJLnNlbmRmaWxlCT0gZ2VuZXJpY19maWxlX3NlbmRmaWxlLAorfTsKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgc3lzdl9maWxlX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnRydW5jYXRlCT0gc3lzdl90cnVuY2F0ZSwKKwkuZ2V0YXR0cgk9IHN5c3ZfZ2V0YXR0ciwKK307CisKK2ludCBzeXN2X3N5bmNfZmlsZShzdHJ1Y3QgZmlsZSAqIGZpbGUsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IGRhdGFzeW5jKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IGVycjsKKworCWVyciA9IHN5bmNfbWFwcGluZ19idWZmZXJzKGlub2RlLT5pX21hcHBpbmcpOworCWlmICghKGlub2RlLT5pX3N0YXRlICYgSV9ESVJUWSkpCisJCXJldHVybiBlcnI7CisJaWYgKGRhdGFzeW5jICYmICEoaW5vZGUtPmlfc3RhdGUgJiBJX0RJUlRZX0RBVEFTWU5DKSkKKwkJcmV0dXJuIGVycjsKKwkKKwllcnIgfD0gc3lzdl9zeW5jX2lub2RlKGlub2RlKTsKKwlyZXR1cm4gZXJyID8gLUVJTyA6IDA7Cit9CmRpZmYgLS1naXQgYS9mcy9zeXN2L2lhbGxvYy5jIGIvZnMvc3lzdi9pYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjU4NWQxCi0tLSAvZGV2L251bGwKKysrIGIvZnMvc3lzdi9pYWxsb2MuYwpAQCAtMCwwICsxLDI0MCBAQAorLyoKKyAqICBsaW51eC9mcy9zeXN2L2lhbGxvYy5jCisgKgorICogIG1pbml4L2JpdG1hcC5jCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICBleHQvZnJlZWxpc3RzLmMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTIgIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKKyAqCisgKiAgeGVuaXgvYWxsb2MuYworICogIENvcHlyaWdodCAoQykgMTk5MiAgRG91ZyBFdmFucworICoKKyAqICBjb2gvYWxsb2MuYworICogIENvcHlyaWdodCAoQykgMTk5MyAgUGFzY2FsIEhhaWJsZSwgQnJ1bm8gSGFpYmxlCisgKgorICogIHN5c3YvaWFsbG9jLmMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTMgIEJydW5vIEhhaWJsZQorICoKKyAqICBUaGlzIGZpbGUgY29udGFpbnMgY29kZSBmb3IgYWxsb2NhdGluZy9mcmVlaW5nIGlub2Rlcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlICJzeXN2LmgiCisKKy8qIFdlIGRvbid0IHRydXN0IHRoZSB2YWx1ZSBvZgorICAgc2ItPnN2X3NiZDItPnNfdGlub2RlID0gKnNiLT5zdl9zYl90b3RhbF9mcmVlX2lub2RlcworICAgYnV0IHdlIG5ldmVydGhlbGVzcyBrZWVwIGl0IHVwIHRvIGRhdGUuICovCisKKy8qIEFuIGlub2RlIG9uIGRpc2sgaXMgY29uc2lkZXJlZCBmcmVlIGlmIGJvdGggaV9tb2RlID09IDAgYW5kIGlfbmxpbmsgPT0gMC4gKi8KKworLyogcmV0dXJuICZzYi0+c3Zfc2JfZmljX2lub2Rlc1tpXSA9ICZzYmQtPnNfaW5vZGVbaV07ICovCitzdGF0aWMgaW5saW5lIHN5c3ZfaW5vX3QgKgorc3Zfc2JfZmljX2lub2RlKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCB1bnNpZ25lZCBpbnQgaSkKK3sKKwlzdHJ1Y3Qgc3lzdl9zYl9pbmZvICpzYmkgPSBTWVNWX1NCKHNiKTsKKworCWlmIChzYmktPnNfYmgxID09IHNiaS0+c19iaDIpCisJCXJldHVybiAmc2JpLT5zX3NiX2ZpY19pbm9kZXNbaV07CisJZWxzZSB7CisJCS8qIDUxMiBieXRlIFhlbml4IEZTICovCisJCXVuc2lnbmVkIGludCBvZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgeGVuaXhfc3VwZXJfYmxvY2ssIHNfaW5vZGVbaV0pOworCQlpZiAob2Zmc2V0IDwgNTEyKQorCQkJcmV0dXJuIChzeXN2X2lub190Kikoc2JpLT5zX3NiZDEgKyBvZmZzZXQpOworCQllbHNlCisJCQlyZXR1cm4gKHN5c3ZfaW5vX3QqKShzYmktPnNfc2JkMiArIG9mZnNldCk7CisJfQorfQorCitzdHJ1Y3Qgc3lzdl9pbm9kZSAqCitzeXN2X3Jhd19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1bnNpZ25lZCBpbm8sIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJoKQoreworCXN0cnVjdCBzeXN2X3NiX2luZm8gKnNiaSA9IFNZU1ZfU0Ioc2IpOworCXN0cnVjdCBzeXN2X2lub2RlICpyZXM7CisJaW50IGJsb2NrID0gc2JpLT5zX2ZpcnN0aW5vZGV6b25lICsgc2JpLT5zX2Jsb2NrX2Jhc2U7CisKKwlibG9jayArPSAoaW5vLTEpID4+IHNiaS0+c19pbm9kZXNfcGVyX2Jsb2NrX2JpdHM7CisJKmJoID0gc2JfYnJlYWQoc2IsIGJsb2NrKTsKKwlpZiAoISpiaCkKKwkJcmV0dXJuIE5VTEw7CisJcmVzID0gKHN0cnVjdCBzeXN2X2lub2RlICopKCpiaCktPmJfZGF0YTsKKwlyZXR1cm4gcmVzICsgKChpbm8tMSkgJiBzYmktPnNfaW5vZGVzX3Blcl9ibG9ja18xKTsKK30KKworc3RhdGljIGludCByZWZpbGxfZnJlZV9jYWNoZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBzeXN2X3NiX2luZm8gKnNiaSA9IFNZU1ZfU0Ioc2IpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXN0cnVjdCBzeXN2X2lub2RlICogcmF3X2lub2RlOworCWludCBpID0gMCwgaW5vOworCisJaW5vID0gU1lTVl9ST09UX0lOTysxOworCXJhd19pbm9kZSA9IHN5c3ZfcmF3X2lub2RlKHNiLCBpbm8sICZiaCk7CisJaWYgKCFyYXdfaW5vZGUpCisJCWdvdG8gb3V0OworCXdoaWxlIChpbm8gPD0gc2JpLT5zX25pbm9kZXMpIHsKKwkJaWYgKHJhd19pbm9kZS0+aV9tb2RlID09IDAgJiYgcmF3X2lub2RlLT5pX25saW5rID09IDApIHsKKwkJCSpzdl9zYl9maWNfaW5vZGUoc2IsaSsrKSA9IGNwdV90b19mczE2KFNZU1ZfU0Ioc2IpLCBpbm8pOworCQkJaWYgKGkgPT0gc2JpLT5zX2ZpY19zaXplKQorCQkJCWJyZWFrOworCQl9CisJCWlmICgoaW5vKysgJiBzYmktPnNfaW5vZGVzX3Blcl9ibG9ja18xKSA9PSAwKSB7CisJCQlicmVsc2UoYmgpOworCQkJcmF3X2lub2RlID0gc3lzdl9yYXdfaW5vZGUoc2IsIGlubywgJmJoKTsKKwkJCWlmICghcmF3X2lub2RlKQorCQkJCWdvdG8gb3V0OworCQl9IGVsc2UKKwkJCXJhd19pbm9kZSsrOworCX0KKwlicmVsc2UoYmgpOworb3V0OgorCXJldHVybiBpOworfQorCit2b2lkIHN5c3ZfZnJlZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IHN5c3Zfc2JfaW5mbyAqc2JpID0gU1lTVl9TQihzYik7CisJdW5zaWduZWQgaW50IGlubzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlzdHJ1Y3Qgc3lzdl9pbm9kZSAqIHJhd19pbm9kZTsKKwl1bnNpZ25lZCBjb3VudDsKKworCXNiID0gaW5vZGUtPmlfc2I7CisJaW5vID0gaW5vZGUtPmlfaW5vOworCWlmIChpbm8gPD0gU1lTVl9ST09UX0lOTyB8fCBpbm8gPiBzYmktPnNfbmlub2RlcykgeworCQlwcmludGsoInN5c3ZfZnJlZV9pbm9kZTogaW5vZGUgMCwxLDIgb3Igbm9uZXhpc3RlbnQgaW5vZGVcbiIpOworCQlyZXR1cm47CisJfQorCXJhd19pbm9kZSA9IHN5c3ZfcmF3X2lub2RlKHNiLCBpbm8sICZiaCk7CisJY2xlYXJfaW5vZGUoaW5vZGUpOworCWlmICghcmF3X2lub2RlKSB7CisJCXByaW50aygic3lzdl9mcmVlX2lub2RlOiB1bmFibGUgdG8gcmVhZCBpbm9kZSBibG9jayBvbiBkZXZpY2UgIgorCQkgICAgICAgIiVzXG4iLCBpbm9kZS0+aV9zYi0+c19pZCk7CisJCXJldHVybjsKKwl9CisJbG9ja19zdXBlcihzYik7CisJY291bnQgPSBmczE2X3RvX2NwdShzYmksICpzYmktPnNfc2JfZmljX2NvdW50KTsKKwlpZiAoY291bnQgPCBzYmktPnNfZmljX3NpemUpIHsKKwkJKnN2X3NiX2ZpY19pbm9kZShzYixjb3VudCsrKSA9IGNwdV90b19mczE2KHNiaSwgaW5vKTsKKwkJKnNiaS0+c19zYl9maWNfY291bnQgPSBjcHVfdG9fZnMxNihzYmksIGNvdW50KTsKKwl9CisJZnMxNl9hZGQoc2JpLCBzYmktPnNfc2JfdG90YWxfZnJlZV9pbm9kZXMsIDEpOworCWRpcnR5X3NiKHNiKTsKKwltZW1zZXQocmF3X2lub2RlLCAwLCBzaXplb2Yoc3RydWN0IHN5c3ZfaW5vZGUpKTsKKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJdW5sb2NrX3N1cGVyKHNiKTsKKwlicmVsc2UoYmgpOworfQorCitzdHJ1Y3QgaW5vZGUgKiBzeXN2X25ld19pbm9kZShjb25zdCBzdHJ1Y3QgaW5vZGUgKiBkaXIsIG1vZGVfdCBtb2RlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPmlfc2I7CisJc3RydWN0IHN5c3Zfc2JfaW5mbyAqc2JpID0gU1lTVl9TQihzYik7CisJc3RydWN0IGlub2RlICppbm9kZTsKKwlzeXN2X2lub190IGlubzsKKwl1bnNpZ25lZCBjb3VudDsKKworCWlub2RlID0gbmV3X2lub2RlKHNiKTsKKwlpZiAoIWlub2RlKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWxvY2tfc3VwZXIoc2IpOworCWNvdW50ID0gZnMxNl90b19jcHUoc2JpLCAqc2JpLT5zX3NiX2ZpY19jb3VudCk7CisJaWYgKGNvdW50ID09IDAgfHwgKCpzdl9zYl9maWNfaW5vZGUoc2IsY291bnQtMSkgPT0gMCkpIHsKKwkJY291bnQgPSByZWZpbGxfZnJlZV9jYWNoZShzYik7CisJCWlmIChjb3VudCA9PSAwKSB7CisJCQlpcHV0KGlub2RlKTsKKwkJCXVubG9ja19zdXBlcihzYik7CisJCQlyZXR1cm4gRVJSX1BUUigtRU5PU1BDKTsKKwkJfQorCX0KKwkvKiBOb3cgY291bnQgPiAwLiAqLworCWlubyA9ICpzdl9zYl9maWNfaW5vZGUoc2IsLS1jb3VudCk7CisJKnNiaS0+c19zYl9maWNfY291bnQgPSBjcHVfdG9fZnMxNihzYmksIGNvdW50KTsKKwlmczE2X2FkZChzYmksIHNiaS0+c19zYl90b3RhbF9mcmVlX2lub2RlcywgLTEpOworCWRpcnR5X3NiKHNiKTsKKwkKKwlpZiAoZGlyLT5pX21vZGUgJiBTX0lTR0lEKSB7CisJCWlub2RlLT5pX2dpZCA9IGRpci0+aV9naWQ7CisJCWlmIChTX0lTRElSKG1vZGUpKQorCQkJbW9kZSB8PSBTX0lTR0lEOworCX0gZWxzZQorCQlpbm9kZS0+aV9naWQgPSBjdXJyZW50LT5mc2dpZDsKKworCWlub2RlLT5pX3VpZCA9IGN1cnJlbnQtPmZzdWlkOworCWlub2RlLT5pX2lubyA9IGZzMTZfdG9fY3B1KHNiaSwgaW5vKTsKKwlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCWlub2RlLT5pX2Jsb2NrcyA9IGlub2RlLT5pX2Jsa3NpemUgPSAwOworCW1lbXNldChTWVNWX0koaW5vZGUpLT5pX2RhdGEsIDAsIHNpemVvZihTWVNWX0koaW5vZGUpLT5pX2RhdGEpKTsKKwlTWVNWX0koaW5vZGUpLT5pX2Rpcl9zdGFydF9sb29rdXAgPSAwOworCWluc2VydF9pbm9kZV9oYXNoKGlub2RlKTsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKworCWlub2RlLT5pX21vZGUgPSBtb2RlOwkJLyogZm9yIHN5c3Zfd3JpdGVfaW5vZGUoKSAqLworCXN5c3Zfd3JpdGVfaW5vZGUoaW5vZGUsIDApOwkvKiBlbnN1cmUgaW5vZGUgbm90IGFsbG9jYXRlZCBhZ2FpbiAqLworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwkvKiBjbGVhcmVkIGJ5IHN5c3Zfd3JpdGVfaW5vZGUoKSAqLworCS8qIFRoYXQncyBpdC4gKi8KKwl1bmxvY2tfc3VwZXIoc2IpOworCXJldHVybiBpbm9kZTsKK30KKwordW5zaWduZWQgbG9uZyBzeXN2X2NvdW50X2ZyZWVfaW5vZGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiKQoreworCXN0cnVjdCBzeXN2X3NiX2luZm8gKnNiaSA9IFNZU1ZfU0Ioc2IpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXN0cnVjdCBzeXN2X2lub2RlICogcmF3X2lub2RlOworCWludCBpbm8sIGNvdW50LCBzYl9jb3VudDsKKworCWxvY2tfc3VwZXIoc2IpOworCisJc2JfY291bnQgPSBmczE2X3RvX2NwdShzYmksICpzYmktPnNfc2JfdG90YWxfZnJlZV9pbm9kZXMpOworCisJaWYgKDApCisJCWdvdG8gdHJ1c3Rfc2I7CisKKwkvKiB0aGlzIGNhdXNlcyBhIGxvdCBvZiBkaXNrIHRyYWZmaWMgLi4uICovCisJY291bnQgPSAwOworCWlubyA9IFNZU1ZfUk9PVF9JTk8rMTsKKwlyYXdfaW5vZGUgPSBzeXN2X3Jhd19pbm9kZShzYiwgaW5vLCAmYmgpOworCWlmICghcmF3X2lub2RlKQorCQlnb3RvIEVpbzsKKwl3aGlsZSAoaW5vIDw9IHNiaS0+c19uaW5vZGVzKSB7CisJCWlmIChyYXdfaW5vZGUtPmlfbW9kZSA9PSAwICYmIHJhd19pbm9kZS0+aV9ubGluayA9PSAwKQorCQkJY291bnQrKzsKKwkJaWYgKChpbm8rKyAmIHNiaS0+c19pbm9kZXNfcGVyX2Jsb2NrXzEpID09IDApIHsKKwkJCWJyZWxzZShiaCk7CisJCQlyYXdfaW5vZGUgPSBzeXN2X3Jhd19pbm9kZShzYiwgaW5vLCAmYmgpOworCQkJaWYgKCFyYXdfaW5vZGUpCisJCQkJZ290byBFaW87CisJCX0gZWxzZQorCQkJcmF3X2lub2RlKys7CisJfQorCWJyZWxzZShiaCk7CisJaWYgKGNvdW50ICE9IHNiX2NvdW50KQorCQlnb3RvIEVpbnZhbDsKK291dDoKKwl1bmxvY2tfc3VwZXIoc2IpOworCXJldHVybiBjb3VudDsKKworRWludmFsOgorCXByaW50aygic3lzdl9jb3VudF9mcmVlX2lub2RlczogIgorCQkiZnJlZSBpbm9kZSBjb3VudCB3YXMgJWQsIGNvcnJlY3RpbmcgdG8gJWRcbiIsCisJCXNiX2NvdW50LCBjb3VudCk7CisJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCSpzYmktPnNfc2JfdG90YWxfZnJlZV9pbm9kZXMgPSBjcHVfdG9fZnMxNihTWVNWX1NCKHNiKSwgY291bnQpOworCQlkaXJ0eV9zYihzYik7CisJfQorCWdvdG8gb3V0OworCitFaW86CisJcHJpbnRrKCJzeXN2X2NvdW50X2ZyZWVfaW5vZGVzOiB1bmFibGUgdG8gcmVhZCBpbm9kZSB0YWJsZVxuIik7Cit0cnVzdF9zYjoKKwljb3VudCA9IHNiX2NvdW50OworCWdvdG8gb3V0OworfQpkaWZmIC0tZ2l0IGEvZnMvc3lzdi9pbm9kZS5jIGIvZnMvc3lzdi9pbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MzAwNzcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9zeXN2L2lub2RlLmMKQEAgLTAsMCArMSwzNTQgQEAKKy8qCisgKiAgbGludXgvZnMvc3lzdi9pbm9kZS5jCisgKgorICogIG1pbml4L2lub2RlLmMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKgorICogIHhlbml4L2lub2RlLmMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTIgIERvdWcgRXZhbnMKKyAqCisgKiAgY29oL2lub2RlLmMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTMgIFBhc2NhbCBIYWlibGUsIEJydW5vIEhhaWJsZQorICoKKyAqICBzeXN2L2lub2RlLmMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTMgIFBhdWwgQi4gTW9uZGF5CisgKgorICogIHN5c3YvaW5vZGUuYworICogIENvcHlyaWdodCAoQykgMTk5MyAgQnJ1bm8gSGFpYmxlCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4ICBLcnp5c3p0b2YgRy4gQmFyYW5vd3NraQorICoKKyAqICBUaGlzIGZpbGUgY29udGFpbnMgY29kZSBmb3IgYWxsb2NhdGluZy9mcmVlaW5nIGlub2RlcyBhbmQgZm9yIHJlYWQvd3JpdGluZworICogIHRoZSBzdXBlcmJsb2NrLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2h1aWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgInN5c3YuaCIKKworLyogVGhpcyBpcyBvbmx5IGNhbGxlZCBvbiBzeW5jKCkgYW5kIHVtb3VudCgpLCB3aGVuIHNfZGlydD0xLiAqLworc3RhdGljIHZvaWQgc3lzdl93cml0ZV9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBzeXN2X3NiX2luZm8gKnNiaSA9IFNZU1ZfU0Ioc2IpOworCXVuc2lnbmVkIGxvbmcgdGltZSA9IGdldF9zZWNvbmRzKCksIG9sZF90aW1lOworCisJbG9ja19rZXJuZWwoKTsKKwlpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpCisJCWdvdG8gY2xlYW47CisKKwkvKgorCSAqIElmIHdlIGFyZSBnb2luZyB0byB3cml0ZSBvdXQgdGhlIHN1cGVyIGJsb2NrLAorCSAqIHRoZW4gYXR0YWNoIGN1cnJlbnQgdGltZSBzdGFtcC4KKwkgKiBCdXQgaWYgdGhlIGZpbGVzeXN0ZW0gd2FzIG1hcmtlZCBjbGVhbiwga2VlcCBpdCBjbGVhbi4KKwkgKi8KKwlvbGRfdGltZSA9IGZzMzJfdG9fY3B1KHNiaSwgKnNiaS0+c19zYl90aW1lKTsKKwlpZiAoc2JpLT5zX3R5cGUgPT0gRlNUWVBFX1NZU1Y0KSB7CisJCWlmICgqc2JpLT5zX3NiX3N0YXRlID09IGNwdV90b19mczMyKHNiaSwgMHg3YzI2OWQzOCAtIG9sZF90aW1lKSkKKwkJCSpzYmktPnNfc2Jfc3RhdGUgPSBjcHVfdG9fZnMzMihzYmksIDB4N2MyNjlkMzggLSB0aW1lKTsKKwkJKnNiaS0+c19zYl90aW1lID0gY3B1X3RvX2ZzMzIoc2JpLCB0aW1lKTsKKwkJbWFya19idWZmZXJfZGlydHkoc2JpLT5zX2JoMik7CisJfQorY2xlYW46CisJc2ItPnNfZGlydCA9IDA7CisJdW5sb2NrX2tlcm5lbCgpOworfQorCitzdGF0aWMgaW50IHN5c3ZfcmVtb3VudChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpkYXRhKQoreworCXN0cnVjdCBzeXN2X3NiX2luZm8gKnNiaSA9IFNZU1ZfU0Ioc2IpOworCWlmIChzYmktPnNfZm9yY2VkX3JvKQorCQkqZmxhZ3MgfD0gTVNfUkRPTkxZOworCWlmICghKCpmbGFncyAmIE1TX1JET05MWSkpCisJCXNiLT5zX2RpcnQgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzeXN2X3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBzeXN2X3NiX2luZm8gKnNiaSA9IFNZU1ZfU0Ioc2IpOworCisJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCS8qIFhYWCBleHQyIGFsc28gdXBkYXRlcyB0aGUgc3RhdGUgaGVyZSAqLworCQltYXJrX2J1ZmZlcl9kaXJ0eShzYmktPnNfYmgxKTsKKwkJaWYgKHNiaS0+c19iaDEgIT0gc2JpLT5zX2JoMikKKwkJCW1hcmtfYnVmZmVyX2RpcnR5KHNiaS0+c19iaDIpOworCX0KKworCWJyZWxzZShzYmktPnNfYmgxKTsKKwlpZiAoc2JpLT5zX2JoMSAhPSBzYmktPnNfYmgyKQorCQlicmVsc2Uoc2JpLT5zX2JoMik7CisKKwlrZnJlZShzYmkpOworfQorCitzdGF0aWMgaW50IHN5c3Zfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBrc3RhdGZzICpidWYpCit7CisJc3RydWN0IHN5c3Zfc2JfaW5mbyAqc2JpID0gU1lTVl9TQihzYik7CisKKwlidWYtPmZfdHlwZSA9IHNiLT5zX21hZ2ljOworCWJ1Zi0+Zl9ic2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKKwlidWYtPmZfYmxvY2tzID0gc2JpLT5zX25kYXRhem9uZXM7CisJYnVmLT5mX2JhdmFpbCA9IGJ1Zi0+Zl9iZnJlZSA9IHN5c3ZfY291bnRfZnJlZV9ibG9ja3Moc2IpOworCWJ1Zi0+Zl9maWxlcyA9IHNiaS0+c19uaW5vZGVzOworCWJ1Zi0+Zl9mZnJlZSA9IHN5c3ZfY291bnRfZnJlZV9pbm9kZXMoc2IpOworCWJ1Zi0+Zl9uYW1lbGVuID0gU1lTVl9OQU1FTEVOOworCXJldHVybiAwOworfQorCisvKiAKKyAqIE5YSSA8LT4gTjBYSSBmb3IgUERQLCBYSU4gPC0+IFhJTjAgZm9yIGxlMzIsIE5JWCA8LT4gME5JWCBmb3IgYmUzMgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcmVhZDNieXRlKHN0cnVjdCBzeXN2X3NiX2luZm8gKnNiaSwKKwl1bnNpZ25lZCBjaGFyICogZnJvbSwgdW5zaWduZWQgY2hhciAqIHRvKQoreworCWlmIChzYmktPnNfYnl0ZXNleCA9PSBCWVRFU0VYX1BEUCkgeworCQl0b1swXSA9IGZyb21bMF07CisJCXRvWzFdID0gMDsKKwkJdG9bMl0gPSBmcm9tWzFdOworCQl0b1szXSA9IGZyb21bMl07CisJfSBlbHNlIGlmIChzYmktPnNfYnl0ZXNleCA9PSBCWVRFU0VYX0xFKSB7CisJCXRvWzBdID0gZnJvbVswXTsKKwkJdG9bMV0gPSBmcm9tWzFdOworCQl0b1syXSA9IGZyb21bMl07CisJCXRvWzNdID0gMDsKKwl9IGVsc2UgeworCQl0b1swXSA9IDA7CisJCXRvWzFdID0gZnJvbVswXTsKKwkJdG9bMl0gPSBmcm9tWzFdOworCQl0b1szXSA9IGZyb21bMl07CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGUzYnl0ZShzdHJ1Y3Qgc3lzdl9zYl9pbmZvICpzYmksCisJdW5zaWduZWQgY2hhciAqIGZyb20sIHVuc2lnbmVkIGNoYXIgKiB0bykKK3sKKwlpZiAoc2JpLT5zX2J5dGVzZXggPT0gQllURVNFWF9QRFApIHsKKwkJdG9bMF0gPSBmcm9tWzBdOworCQl0b1sxXSA9IGZyb21bMl07CisJCXRvWzJdID0gZnJvbVszXTsKKwl9IGVsc2UgaWYgKHNiaS0+c19ieXRlc2V4ID09IEJZVEVTRVhfTEUpIHsKKwkJdG9bMF0gPSBmcm9tWzBdOworCQl0b1sxXSA9IGZyb21bMV07CisJCXRvWzJdID0gZnJvbVsyXTsKKwl9IGVsc2UgeworCQl0b1swXSA9IGZyb21bMV07CisJCXRvWzFdID0gZnJvbVsyXTsKKwkJdG9bMl0gPSBmcm9tWzNdOworCX0KK30KKworc3RhdGljIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHN5c3Zfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zID0geworCS5yZWFkbGluawk9IGdlbmVyaWNfcmVhZGxpbmssCisJLmZvbGxvd19saW5rCT0gcGFnZV9mb2xsb3dfbGlua19saWdodCwKKwkucHV0X2xpbmsJPSBwYWdlX3B1dF9saW5rLAorCS5nZXRhdHRyCT0gc3lzdl9nZXRhdHRyLAorfTsKKwordm9pZCBzeXN2X3NldF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBkZXZfdCByZGV2KQoreworCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisJCWlub2RlLT5pX29wID0gJnN5c3ZfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9mb3AgPSAmc3lzdl9maWxlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJnN5c3ZfYW9wczsKKwl9IGVsc2UgaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaW5vZGUtPmlfb3AgPSAmc3lzdl9kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJnN5c3ZfZGlyX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJnN5c3ZfYW9wczsKKwl9IGVsc2UgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaWYgKGlub2RlLT5pX2Jsb2NrcykgeworCQkJaW5vZGUtPmlfb3AgPSAmc3lzdl9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZzeXN2X2FvcHM7CisJCX0gZWxzZQorCQkJaW5vZGUtPmlfb3AgPSAmc3lzdl9mYXN0X3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwl9IGVsc2UKKwkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlLCByZGV2KTsKK30KKworc3RhdGljIHZvaWQgc3lzdl9yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3Qgc3lzdl9zYl9pbmZvICogc2JpID0gU1lTVl9TQihzYik7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJc3RydWN0IHN5c3ZfaW5vZGUgKiByYXdfaW5vZGU7CisJc3RydWN0IHN5c3ZfaW5vZGVfaW5mbyAqIHNpOworCXVuc2lnbmVkIGludCBibG9jaywgaW5vID0gaW5vZGUtPmlfaW5vOworCisJaWYgKCFpbm8gfHwgaW5vID4gc2JpLT5zX25pbm9kZXMpIHsKKwkJcHJpbnRrKCJCYWQgaW5vZGUgbnVtYmVyIG9uIGRldiAlczogJWQgaXMgb3V0IG9mIHJhbmdlXG4iLAorCQkgICAgICAgaW5vZGUtPmlfc2ItPnNfaWQsIGlubyk7CisJCWdvdG8gYmFkX2lub2RlOworCX0KKwlyYXdfaW5vZGUgPSBzeXN2X3Jhd19pbm9kZShzYiwgaW5vLCAmYmgpOworCWlmICghcmF3X2lub2RlKSB7CisJCXByaW50aygiTWFqb3IgcHJvYmxlbTogdW5hYmxlIHRvIHJlYWQgaW5vZGUgZnJvbSBkZXYgJXNcbiIsCisJCSAgICAgICBpbm9kZS0+aV9zYi0+c19pZCk7CisJCWdvdG8gYmFkX2lub2RlOworCX0KKwkvKiBTeXN0ZW1WIEZTOiBrbHVkZ2UgcGVybWlzc2lvbnMgaWYgaW5vPT1TWVNWX1JPT1RfSU5PID8/ICovCisJaW5vZGUtPmlfbW9kZSA9IGZzMTZfdG9fY3B1KHNiaSwgcmF3X2lub2RlLT5pX21vZGUpOworCWlub2RlLT5pX3VpZCA9ICh1aWRfdClmczE2X3RvX2NwdShzYmksIHJhd19pbm9kZS0+aV91aWQpOworCWlub2RlLT5pX2dpZCA9IChnaWRfdClmczE2X3RvX2NwdShzYmksIHJhd19pbm9kZS0+aV9naWQpOworCWlub2RlLT5pX25saW5rID0gZnMxNl90b19jcHUoc2JpLCByYXdfaW5vZGUtPmlfbmxpbmspOworCWlub2RlLT5pX3NpemUgPSBmczMyX3RvX2NwdShzYmksIHJhd19pbm9kZS0+aV9zaXplKTsKKwlpbm9kZS0+aV9hdGltZS50dl9zZWMgPSBmczMyX3RvX2NwdShzYmksIHJhd19pbm9kZS0+aV9hdGltZSk7CisJaW5vZGUtPmlfbXRpbWUudHZfc2VjID0gZnMzMl90b19jcHUoc2JpLCByYXdfaW5vZGUtPmlfbXRpbWUpOworCWlub2RlLT5pX2N0aW1lLnR2X3NlYyA9IGZzMzJfdG9fY3B1KHNiaSwgcmF3X2lub2RlLT5pX2N0aW1lKTsKKwlpbm9kZS0+aV9jdGltZS50dl9uc2VjID0gMDsKKwlpbm9kZS0+aV9hdGltZS50dl9uc2VjID0gMDsKKwlpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gMDsKKwlpbm9kZS0+aV9ibG9ja3MgPSBpbm9kZS0+aV9ibGtzaXplID0gMDsKKworCXNpID0gU1lTVl9JKGlub2RlKTsKKwlmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCAxMCsxKzErMTsgYmxvY2srKykKKwkJcmVhZDNieXRlKHNiaSwgJnJhd19pbm9kZS0+aV9kYXRhWzMqYmxvY2tdLAorCQkJCSh1OCAqKSZzaS0+aV9kYXRhW2Jsb2NrXSk7CisJYnJlbHNlKGJoKTsKKwlzaS0+aV9kaXJfc3RhcnRfbG9va3VwID0gMDsKKwlpZiAoU19JU0NIUihpbm9kZS0+aV9tb2RlKSB8fCBTX0lTQkxLKGlub2RlLT5pX21vZGUpKQorCQlzeXN2X3NldF9pbm9kZShpbm9kZSwKKwkJCSAgICAgICBvbGRfZGVjb2RlX2RldihmczMyX3RvX2NwdShzYmksIHNpLT5pX2RhdGFbMF0pKSk7CisJZWxzZQorCQlzeXN2X3NldF9pbm9kZShpbm9kZSwgMCk7CisJcmV0dXJuOworCitiYWRfaW5vZGU6CisJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCXJldHVybjsKK30KKworc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqIHN5c3ZfdXBkYXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiID0gaW5vZGUtPmlfc2I7CisJc3RydWN0IHN5c3Zfc2JfaW5mbyAqIHNiaSA9IFNZU1ZfU0Ioc2IpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXN0cnVjdCBzeXN2X2lub2RlICogcmF3X2lub2RlOworCXN0cnVjdCBzeXN2X2lub2RlX2luZm8gKiBzaTsKKwl1bnNpZ25lZCBpbnQgaW5vLCBibG9jazsKKworCWlubyA9IGlub2RlLT5pX2lubzsKKwlpZiAoIWlubyB8fCBpbm8gPiBzYmktPnNfbmlub2RlcykgeworCQlwcmludGsoIkJhZCBpbm9kZSBudW1iZXIgb24gZGV2ICVzOiAlZCBpcyBvdXQgb2YgcmFuZ2VcbiIsCisJCSAgICAgICBpbm9kZS0+aV9zYi0+c19pZCwgaW5vKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXJhd19pbm9kZSA9IHN5c3ZfcmF3X2lub2RlKHNiLCBpbm8sICZiaCk7CisJaWYgKCFyYXdfaW5vZGUpIHsKKwkJcHJpbnRrKCJ1bmFibGUgdG8gcmVhZCBpLW5vZGUgYmxvY2tcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyYXdfaW5vZGUtPmlfbW9kZSA9IGNwdV90b19mczE2KHNiaSwgaW5vZGUtPmlfbW9kZSk7CisJcmF3X2lub2RlLT5pX3VpZCA9IGNwdV90b19mczE2KHNiaSwgZnNfaGlnaDJsb3d1aWQoaW5vZGUtPmlfdWlkKSk7CisJcmF3X2lub2RlLT5pX2dpZCA9IGNwdV90b19mczE2KHNiaSwgZnNfaGlnaDJsb3dnaWQoaW5vZGUtPmlfZ2lkKSk7CisJcmF3X2lub2RlLT5pX25saW5rID0gY3B1X3RvX2ZzMTYoc2JpLCBpbm9kZS0+aV9ubGluayk7CisJcmF3X2lub2RlLT5pX3NpemUgPSBjcHVfdG9fZnMzMihzYmksIGlub2RlLT5pX3NpemUpOworCXJhd19pbm9kZS0+aV9hdGltZSA9IGNwdV90b19mczMyKHNiaSwgaW5vZGUtPmlfYXRpbWUudHZfc2VjKTsKKwlyYXdfaW5vZGUtPmlfbXRpbWUgPSBjcHVfdG9fZnMzMihzYmksIGlub2RlLT5pX210aW1lLnR2X3NlYyk7CisJcmF3X2lub2RlLT5pX2N0aW1lID0gY3B1X3RvX2ZzMzIoc2JpLCBpbm9kZS0+aV9jdGltZS50dl9zZWMpOworCisJc2kgPSBTWVNWX0koaW5vZGUpOworCWlmIChTX0lTQ0hSKGlub2RlLT5pX21vZGUpIHx8IFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpCisJCXNpLT5pX2RhdGFbMF0gPSBjcHVfdG9fZnMzMihzYmksIG9sZF9lbmNvZGVfZGV2KGlub2RlLT5pX3JkZXYpKTsKKwlmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCAxMCsxKzErMTsgYmxvY2srKykKKwkJd3JpdGUzYnl0ZShzYmksICh1OCAqKSZzaS0+aV9kYXRhW2Jsb2NrXSwKKwkJCSZyYXdfaW5vZGUtPmlfZGF0YVszKmJsb2NrXSk7CisJbWFya19idWZmZXJfZGlydHkoYmgpOworCXJldHVybiBiaDsKK30KKworaW50IHN5c3Zfd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICogaW5vZGUsIGludCB3YWl0KQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJbG9ja19rZXJuZWwoKTsKKwliaCA9IHN5c3ZfdXBkYXRlX2lub2RlKGlub2RlKTsKKwlicmVsc2UoYmgpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHN5c3Zfc3luY19pbm9kZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKyAgICAgICAgaW50IGVyciA9IDA7CisgICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKyAgICAgICAgYmggPSBzeXN2X3VwZGF0ZV9pbm9kZShpbm9kZSk7CisgICAgICAgIGlmIChiaCAmJiBidWZmZXJfZGlydHkoYmgpKSB7CisgICAgICAgICAgICAgICAgc3luY19kaXJ0eV9idWZmZXIoYmgpOworICAgICAgICAgICAgICAgIGlmIChidWZmZXJfcmVxKGJoKSAmJiAhYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrICgiSU8gZXJyb3Igc3luY2luZyBzeXN2IGlub2RlIFslczolMDhseF1cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8pOworICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCFiaCkKKyAgICAgICAgICAgICAgICBlcnIgPSAtMTsKKyAgICAgICAgYnJlbHNlIChiaCk7CisgICAgICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHN5c3ZfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW5vZGUtPmlfc2l6ZSA9IDA7CisJc3lzdl90cnVuY2F0ZShpbm9kZSk7CisJbG9ja19rZXJuZWwoKTsKKwlzeXN2X2ZyZWVfaW5vZGUoaW5vZGUpOworCXVubG9ja19rZXJuZWwoKTsKK30KKworc3RhdGljIGttZW1fY2FjaGVfdCAqc3lzdl9pbm9kZV9jYWNoZXA7CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKnN5c3ZfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3Qgc3lzdl9pbm9kZV9pbmZvICpzaTsKKworCXNpID0ga21lbV9jYWNoZV9hbGxvYyhzeXN2X2lub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCWlmICghc2kpCisJCXJldHVybiBOVUxMOworCXJldHVybiAmc2ktPnZmc19pbm9kZTsKK30KKworc3RhdGljIHZvaWQgc3lzdl9kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJa21lbV9jYWNoZV9mcmVlKHN5c3ZfaW5vZGVfY2FjaGVwLCBTWVNWX0koaW5vZGUpKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9vbmNlKHZvaWQgKnAsIGttZW1fY2FjaGVfdCAqY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBzeXN2X2lub2RlX2luZm8gKnNpID0gKHN0cnVjdCBzeXN2X2lub2RlX2luZm8gKilwOworCisJaWYgKChmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CisJCQlTTEFCX0NUT1JfQ09OU1RSVUNUT1IpCisJCWlub2RlX2luaXRfb25jZSgmc2ktPnZmc19pbm9kZSk7Cit9CisKK3N0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHN5c3Zfc29wcyA9IHsKKwkuYWxsb2NfaW5vZGUJPSBzeXN2X2FsbG9jX2lub2RlLAorCS5kZXN0cm95X2lub2RlCT0gc3lzdl9kZXN0cm95X2lub2RlLAorCS5yZWFkX2lub2RlCT0gc3lzdl9yZWFkX2lub2RlLAorCS53cml0ZV9pbm9kZQk9IHN5c3Zfd3JpdGVfaW5vZGUsCisJLmRlbGV0ZV9pbm9kZQk9IHN5c3ZfZGVsZXRlX2lub2RlLAorCS5wdXRfc3VwZXIJPSBzeXN2X3B1dF9zdXBlciwKKwkud3JpdGVfc3VwZXIJPSBzeXN2X3dyaXRlX3N1cGVyLAorCS5yZW1vdW50X2ZzCT0gc3lzdl9yZW1vdW50LAorCS5zdGF0ZnMJCT0gc3lzdl9zdGF0ZnMsCit9OworCitpbnQgX19pbml0IHN5c3ZfaW5pdF9pY2FjaGUodm9pZCkKK3sKKwlzeXN2X2lub2RlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJzeXN2X2lub2RlX2NhY2hlIiwKKwkJCXNpemVvZihzdHJ1Y3Qgc3lzdl9pbm9kZV9pbmZvKSwgMCwKKwkJCVNMQUJfUkVDTEFJTV9BQ0NPVU5ULAorCQkJaW5pdF9vbmNlLCBOVUxMKTsKKwlpZiAoIXN5c3ZfaW5vZGVfY2FjaGVwKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBzeXN2X2Rlc3Ryb3lfaWNhY2hlKHZvaWQpCit7CisJa21lbV9jYWNoZV9kZXN0cm95KHN5c3ZfaW5vZGVfY2FjaGVwKTsKK30KZGlmZiAtLWdpdCBhL2ZzL3N5c3YvaXRyZWUuYyBiL2ZzL3N5c3YvaXRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmY1ZjhkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvc3lzdi9pdHJlZS5jCkBAIC0wLDAgKzEsNDc1IEBACisvKgorICogIGxpbnV4L2ZzL3N5c3YvaXRyZWUuYworICoKKyAqICBIYW5kbGluZyBvZiBpbmRpcmVjdCBibG9ja3MnIHRyZWVzLgorICogIEFWLCBTZXAtLURlYyAyMDAwCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlICJzeXN2LmgiCisKK2VudW0ge0RJUkVDVCA9IDEwLCBERVBUSCA9IDR9OwkvKiBIYXZlIHRyaXBsZSBpbmRpcmVjdCAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgZGlydHlfaW5kaXJlY3Qoc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShiaCwgaW5vZGUpOworCWlmIChJU19TWU5DKGlub2RlKSkKKwkJc3luY19kaXJ0eV9idWZmZXIoYmgpOworfQorCitzdGF0aWMgaW50IGJsb2NrX3RvX3BhdGgoc3RydWN0IGlub2RlICppbm9kZSwgbG9uZyBibG9jaywgaW50IG9mZnNldHNbREVQVEhdKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3Qgc3lzdl9zYl9pbmZvICpzYmkgPSBTWVNWX1NCKHNiKTsKKwlpbnQgcHRyc19iaXRzID0gc2JpLT5zX2luZF9wZXJfYmxvY2tfYml0czsKKwl1bnNpZ25lZCBsb25nCWluZGlyZWN0X2Jsb2NrcyA9IHNiaS0+c19pbmRfcGVyX2Jsb2NrLAorCQkJZG91YmxlX2Jsb2NrcyA9IHNiaS0+c19pbmRfcGVyX2Jsb2NrXzI7CisJaW50IG4gPSAwOworCisJaWYgKGJsb2NrIDwgMCkgeworCQlwcmludGsoInN5c3ZfYmxvY2tfbWFwOiBibG9jayA8IDBcbiIpOworCX0gZWxzZSBpZiAoYmxvY2sgPCBESVJFQ1QpIHsKKwkJb2Zmc2V0c1tuKytdID0gYmxvY2s7CisJfSBlbHNlIGlmICggKGJsb2NrIC09IERJUkVDVCkgPCBpbmRpcmVjdF9ibG9ja3MpIHsKKwkJb2Zmc2V0c1tuKytdID0gRElSRUNUOworCQlvZmZzZXRzW24rK10gPSBibG9jazsKKwl9IGVsc2UgaWYgKChibG9jayAtPSBpbmRpcmVjdF9ibG9ja3MpIDwgZG91YmxlX2Jsb2NrcykgeworCQlvZmZzZXRzW24rK10gPSBESVJFQ1QrMTsKKwkJb2Zmc2V0c1tuKytdID0gYmxvY2sgPj4gcHRyc19iaXRzOworCQlvZmZzZXRzW24rK10gPSBibG9jayAmIChpbmRpcmVjdF9ibG9ja3MgLSAxKTsKKwl9IGVsc2UgaWYgKCgoYmxvY2sgLT0gZG91YmxlX2Jsb2NrcykgPj4gKHB0cnNfYml0cyAqIDIpKSA8IGluZGlyZWN0X2Jsb2NrcykgeworCQlvZmZzZXRzW24rK10gPSBESVJFQ1QrMjsKKwkJb2Zmc2V0c1tuKytdID0gYmxvY2sgPj4gKHB0cnNfYml0cyAqIDIpOworCQlvZmZzZXRzW24rK10gPSAoYmxvY2sgPj4gcHRyc19iaXRzKSAmIChpbmRpcmVjdF9ibG9ja3MgLSAxKTsKKwkJb2Zmc2V0c1tuKytdID0gYmxvY2sgJiAoaW5kaXJlY3RfYmxvY2tzIC0gMSk7CisJfSBlbHNlIHsKKwkJLyogbm90aGluZyAqLzsKKwl9CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGJsb2NrX3RvX2NwdShzdHJ1Y3Qgc3lzdl9zYl9pbmZvICpzYmksIHN5c3Zfem9uZV90IG5yKQoreworCXJldHVybiBzYmktPnNfYmxvY2tfYmFzZSArIGZzMzJfdG9fY3B1KHNiaSwgbnIpOworfQorCit0eXBlZGVmIHN0cnVjdCB7CisJc3lzdl96b25lX3QgICAgICpwOworCXN5c3Zfem9uZV90ICAgICBrZXk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKK30gSW5kaXJlY3Q7CisKK3N0YXRpYyBERUZJTkVfUldMT0NLKHBvaW50ZXJzX2xvY2spOworCitzdGF0aWMgaW5saW5lIHZvaWQgYWRkX2NoYWluKEluZGlyZWN0ICpwLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBzeXN2X3pvbmVfdCAqdikKK3sKKwlwLT5rZXkgPSAqKHAtPnAgPSB2KTsKKwlwLT5iaCA9IGJoOworfQorCitzdGF0aWMgaW5saW5lIGludCB2ZXJpZnlfY2hhaW4oSW5kaXJlY3QgKmZyb20sIEluZGlyZWN0ICp0bykKK3sKKwl3aGlsZSAoZnJvbSA8PSB0byAmJiBmcm9tLT5rZXkgPT0gKmZyb20tPnApCisJCWZyb20rKzsKKwlyZXR1cm4gKGZyb20gPiB0byk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3lzdl96b25lX3QgKmJsb2NrX2VuZChzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXJldHVybiAoc3lzdl96b25lX3QqKSgoY2hhciopYmgtPmJfZGF0YSArIGJoLT5iX3NpemUpOworfQorCisvKgorICogUmVxdWlyZXMgcmVhZF9sb2NrKCZwb2ludGVyc19sb2NrKSBvciB3cml0ZV9sb2NrKCZwb2ludGVyc19sb2NrKQorICovCitzdGF0aWMgSW5kaXJlY3QgKmdldF9icmFuY2goc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICBpbnQgZGVwdGgsCisJCQkgICAgaW50IG9mZnNldHNbXSwKKwkJCSAgICBJbmRpcmVjdCBjaGFpbltdLAorCQkJICAgIGludCAqZXJyKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlJbmRpcmVjdCAqcCA9IGNoYWluOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisKKwkqZXJyID0gMDsKKwlhZGRfY2hhaW4oY2hhaW4sIE5VTEwsIFNZU1ZfSShpbm9kZSktPmlfZGF0YSArICpvZmZzZXRzKTsKKwlpZiAoIXAtPmtleSkKKwkJZ290byBub19ibG9jazsKKwl3aGlsZSAoLS1kZXB0aCkgeworCQlpbnQgYmxvY2sgPSBibG9ja190b19jcHUoU1lTVl9TQihzYiksIHAtPmtleSk7CisJCWJoID0gc2JfYnJlYWQoc2IsIGJsb2NrKTsKKwkJaWYgKCFiaCkKKwkJCWdvdG8gZmFpbHVyZTsKKwkJaWYgKCF2ZXJpZnlfY2hhaW4oY2hhaW4sIHApKQorCQkJZ290byBjaGFuZ2VkOworCQlhZGRfY2hhaW4oKytwLCBiaCwgKHN5c3Zfem9uZV90KiliaC0+Yl9kYXRhICsgKisrb2Zmc2V0cyk7CisJCWlmICghcC0+a2V5KQorCQkJZ290byBub19ibG9jazsKKwl9CisJcmV0dXJuIE5VTEw7CisKK2NoYW5nZWQ6CisJYnJlbHNlKGJoKTsKKwkqZXJyID0gLUVBR0FJTjsKKwlnb3RvIG5vX2Jsb2NrOworZmFpbHVyZToKKwkqZXJyID0gLUVJTzsKK25vX2Jsb2NrOgorCXJldHVybiBwOworfQorCitzdGF0aWMgaW50IGFsbG9jX2JyYW5jaChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJaW50IG51bSwKKwkJCWludCAqb2Zmc2V0cywKKwkJCUluZGlyZWN0ICpicmFuY2gpCit7CisJaW50IGJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwlpbnQgbiA9IDA7CisJaW50IGk7CisKKwlicmFuY2hbMF0ua2V5ID0gc3lzdl9uZXdfYmxvY2soaW5vZGUtPmlfc2IpOworCWlmIChicmFuY2hbMF0ua2V5KSBmb3IgKG4gPSAxOyBuIDwgbnVtOyBuKyspIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwkJaW50IHBhcmVudDsKKwkJLyogQWxsb2NhdGUgdGhlIG5leHQgYmxvY2sgKi8KKwkJYnJhbmNoW25dLmtleSA9IHN5c3ZfbmV3X2Jsb2NrKGlub2RlLT5pX3NiKTsKKwkJaWYgKCFicmFuY2hbbl0ua2V5KQorCQkJYnJlYWs7CisJCS8qCisJCSAqIEdldCBidWZmZXJfaGVhZCBmb3IgcGFyZW50IGJsb2NrLCB6ZXJvIGl0IG91dCBhbmQgc2V0IAorCQkgKiB0aGUgcG9pbnRlciB0byBuZXcgb25lLCB0aGVuIHNlbmQgcGFyZW50IHRvIGRpc2suCisJCSAqLworCQlwYXJlbnQgPSBibG9ja190b19jcHUoU1lTVl9TQihpbm9kZS0+aV9zYiksIGJyYW5jaFtuLTFdLmtleSk7CisJCWJoID0gc2JfZ2V0YmxrKGlub2RlLT5pX3NiLCBwYXJlbnQpOworCQlsb2NrX2J1ZmZlcihiaCk7CisJCW1lbXNldChiaC0+Yl9kYXRhLCAwLCBibG9ja3NpemUpOworCQlicmFuY2hbbl0uYmggPSBiaDsKKwkJYnJhbmNoW25dLnAgPSAoc3lzdl96b25lX3QqKSBiaC0+Yl9kYXRhICsgb2Zmc2V0c1tuXTsKKwkJKmJyYW5jaFtuXS5wID0gYnJhbmNoW25dLmtleTsKKwkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCXVubG9ja19idWZmZXIoYmgpOworCQlkaXJ0eV9pbmRpcmVjdChiaCwgaW5vZGUpOworCX0KKwlpZiAobiA9PSBudW0pCisJCXJldHVybiAwOworCisJLyogQWxsb2NhdGlvbiBmYWlsZWQsIGZyZWUgd2hhdCB3ZSBhbHJlYWR5IGFsbG9jYXRlZCAqLworCWZvciAoaSA9IDE7IGkgPCBuOyBpKyspCisJCWJmb3JnZXQoYnJhbmNoW2ldLmJoKTsKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorCQlzeXN2X2ZyZWVfYmxvY2soaW5vZGUtPmlfc2IsIGJyYW5jaFtpXS5rZXkpOworCXJldHVybiAtRU5PU1BDOworfQorCitzdGF0aWMgaW5saW5lIGludCBzcGxpY2VfYnJhbmNoKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJSW5kaXJlY3QgY2hhaW5bXSwKKwkJCQlJbmRpcmVjdCAqd2hlcmUsCisJCQkJaW50IG51bSkKK3sKKwlpbnQgaTsKKworCS8qIFZlcmlmeSB0aGF0IHBsYWNlIHdlIGFyZSBzcGxpY2luZyB0byBpcyBzdGlsbCB0aGVyZSBhbmQgdmFjYW50ICovCisJd3JpdGVfbG9jaygmcG9pbnRlcnNfbG9jayk7CisJaWYgKCF2ZXJpZnlfY2hhaW4oY2hhaW4sIHdoZXJlLTEpIHx8ICp3aGVyZS0+cCkKKwkJZ290byBjaGFuZ2VkOworCSp3aGVyZS0+cCA9IHdoZXJlLT5rZXk7CisJd3JpdGVfdW5sb2NrKCZwb2ludGVyc19sb2NrKTsKKworCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKworCS8qIGhhZCB3ZSBzcGxpY2VkIGl0IG9udG8gaW5kaXJlY3QgYmxvY2s/ICovCisJaWYgKHdoZXJlLT5iaCkKKwkJZGlydHlfaW5kaXJlY3Qod2hlcmUtPmJoLCBpbm9kZSk7CisKKwlpZiAoSVNfU1lOQyhpbm9kZSkpCisJCXN5c3Zfc3luY19pbm9kZShpbm9kZSk7CisJZWxzZQorCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwlyZXR1cm4gMDsKKworY2hhbmdlZDoKKwl3cml0ZV91bmxvY2soJnBvaW50ZXJzX2xvY2spOworCWZvciAoaSA9IDE7IGkgPCBudW07IGkrKykKKwkJYmZvcmdldCh3aGVyZVtpXS5iaCk7CisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQorCQlzeXN2X2ZyZWVfYmxvY2soaW5vZGUtPmlfc2IsIHdoZXJlW2ldLmtleSk7CisJcmV0dXJuIC1FQUdBSU47Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2Jsb2NrKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGlibG9jaywgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpCit7CisJaW50IGVyciA9IC1FSU87CisJaW50IG9mZnNldHNbREVQVEhdOworCUluZGlyZWN0IGNoYWluW0RFUFRIXTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisJSW5kaXJlY3QgKnBhcnRpYWw7CisJaW50IGxlZnQ7CisJaW50IGRlcHRoID0gYmxvY2tfdG9fcGF0aChpbm9kZSwgaWJsb2NrLCBvZmZzZXRzKTsKKworCWlmIChkZXB0aCA9PSAwKQorCQlnb3RvIG91dDsKKworcmVyZWFkOgorCXJlYWRfbG9jaygmcG9pbnRlcnNfbG9jayk7CisJcGFydGlhbCA9IGdldF9icmFuY2goaW5vZGUsIGRlcHRoLCBvZmZzZXRzLCBjaGFpbiwgJmVycik7CisJcmVhZF91bmxvY2soJnBvaW50ZXJzX2xvY2spOworCisJLyogU2ltcGxlc3QgY2FzZSAtIGJsb2NrIGZvdW5kLCBubyBhbGxvY2F0aW9uIG5lZWRlZCAqLworCWlmICghcGFydGlhbCkgeworZ290X2l0OgorCQltYXBfYmgoYmhfcmVzdWx0LCBzYiwgYmxvY2tfdG9fY3B1KFNZU1ZfU0Ioc2IpLAorCQkJCQljaGFpbltkZXB0aC0xXS5rZXkpKTsKKwkJLyogQ2xlYW4gdXAgYW5kIGV4aXQgKi8KKwkJcGFydGlhbCA9IGNoYWluK2RlcHRoLTE7IC8qIHRoZSB3aG9sZSBjaGFpbiAqLworCQlnb3RvIGNsZWFudXA7CisJfQorCisJLyogTmV4dCBzaW1wbGUgY2FzZSAtIHBsYWluIGxvb2t1cCBvciBmYWlsZWQgcmVhZCBvZiBpbmRpcmVjdCBibG9jayAqLworCWlmICghY3JlYXRlIHx8IGVyciA9PSAtRUlPKSB7CitjbGVhbnVwOgorCQl3aGlsZSAocGFydGlhbCA+IGNoYWluKSB7CisJCQlicmVsc2UocGFydGlhbC0+YmgpOworCQkJcGFydGlhbC0tOworCQl9CitvdXQ6CisJCXJldHVybiBlcnI7CisJfQorCisJLyoKKwkgKiBJbmRpcmVjdCBibG9jayBtaWdodCBiZSByZW1vdmVkIGJ5IHRydW5jYXRlIHdoaWxlIHdlIHdlcmUKKwkgKiByZWFkaW5nIGl0LiBIYW5kbGluZyBvZiB0aGF0IGNhc2UgKGZvcmdldCB3aGF0IHdlJ3ZlIGdvdCBhbmQKKwkgKiByZXJlYWQpIGlzIHRha2VuIG91dCBvZiB0aGUgbWFpbiBwYXRoLgorCSAqLworCWlmIChlcnIgPT0gLUVBR0FJTikKKwkJZ290byBjaGFuZ2VkOworCisJbGVmdCA9IChjaGFpbiArIGRlcHRoKSAtIHBhcnRpYWw7CisJZXJyID0gYWxsb2NfYnJhbmNoKGlub2RlLCBsZWZ0LCBvZmZzZXRzKyhwYXJ0aWFsLWNoYWluKSwgcGFydGlhbCk7CisJaWYgKGVycikKKwkJZ290byBjbGVhbnVwOworCisJaWYgKHNwbGljZV9icmFuY2goaW5vZGUsIGNoYWluLCBwYXJ0aWFsLCBsZWZ0KSA8IDApCisJCWdvdG8gY2hhbmdlZDsKKworCXNldF9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7CisJZ290byBnb3RfaXQ7CisKK2NoYW5nZWQ6CisJd2hpbGUgKHBhcnRpYWwgPiBjaGFpbikgeworCQlicmVsc2UocGFydGlhbC0+YmgpOworCQlwYXJ0aWFsLS07CisJfQorCWdvdG8gcmVyZWFkOworfQorCitzdGF0aWMgaW5saW5lIGludCBhbGxfemVyb2VzKHN5c3Zfem9uZV90ICpwLCBzeXN2X3pvbmVfdCAqcSkKK3sKKwl3aGlsZSAocCA8IHEpCisJCWlmICgqcCsrKQorCQkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBJbmRpcmVjdCAqZmluZF9zaGFyZWQoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQlpbnQgZGVwdGgsCisJCQkJaW50IG9mZnNldHNbXSwKKwkJCQlJbmRpcmVjdCBjaGFpbltdLAorCQkJCXN5c3Zfem9uZV90ICp0b3ApCit7CisJSW5kaXJlY3QgKnBhcnRpYWwsICpwOworCWludCBrLCBlcnI7CisKKwkqdG9wID0gMDsKKwlmb3IgKGsgPSBkZXB0aDsgayA+IDEgJiYgIW9mZnNldHNbay0xXTsgay0tKQorCQk7CisKKwl3cml0ZV9sb2NrKCZwb2ludGVyc19sb2NrKTsKKwlwYXJ0aWFsID0gZ2V0X2JyYW5jaChpbm9kZSwgaywgb2Zmc2V0cywgY2hhaW4sICZlcnIpOworCWlmICghcGFydGlhbCkKKwkJcGFydGlhbCA9IGNoYWluICsgay0xOworCS8qCisJICogSWYgdGhlIGJyYW5jaCBhY3F1aXJlZCBjb250aW51YXRpb24gc2luY2Ugd2UndmUgbG9va2VkIGF0IGl0IC0KKwkgKiBmaW5lLCBpdCBzaG91bGQgYWxsIHN1cnZpdmUgYW5kIChuZXcpIHRvcCBkb2Vzbid0IGJlbG9uZyB0byB1cy4KKwkgKi8KKwlpZiAoIXBhcnRpYWwtPmtleSAmJiAqcGFydGlhbC0+cCkgeworCQl3cml0ZV91bmxvY2soJnBvaW50ZXJzX2xvY2spOworCQlnb3RvIG5vX3RvcDsKKwl9CisJZm9yIChwPXBhcnRpYWw7IHA+Y2hhaW4gJiYgYWxsX3plcm9lcygoc3lzdl96b25lX3QqKXAtPmJoLT5iX2RhdGEscC0+cCk7IHAtLSkKKwkJOworCS8qCisJICogT0ssIHdlJ3ZlIGZvdW5kIHRoZSBsYXN0IGJsb2NrIHRoYXQgbXVzdCBzdXJ2aXZlLiBUaGUgcmVzdCBvZiBvdXIKKwkgKiBicmFuY2ggc2hvdWxkIGJlIGRldGFjaGVkIGJlZm9yZSB1bmxvY2tpbmcuIEhvd2V2ZXIsIGlmIHRoYXQgcmVzdAorCSAqIG9mIGJyYW5jaCBpcyBhbGwgb3VycyBhbmQgZG9lcyBub3QgZ3JvdyBpbW1lZGlhdGVseSBmcm9tIHRoZSBpbm9kZQorCSAqIGl0J3MgZWFzaWVyIHRvIGNoZWF0IGFuZCBqdXN0IGRlY3JlbWVudCBwYXJ0aWFsLT5wLgorCSAqLworCWlmIChwID09IGNoYWluICsgayAtIDEgJiYgcCA+IGNoYWluKSB7CisJCXAtPnAtLTsKKwl9IGVsc2UgeworCQkqdG9wID0gKnAtPnA7CisJCSpwLT5wID0gMDsKKwl9CisJd3JpdGVfdW5sb2NrKCZwb2ludGVyc19sb2NrKTsKKworCXdoaWxlIChwYXJ0aWFsID4gcCkgeworCQlicmVsc2UocGFydGlhbC0+YmgpOworCQlwYXJ0aWFsLS07CisJfQorbm9fdG9wOgorCXJldHVybiBwYXJ0aWFsOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9kYXRhKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN5c3Zfem9uZV90ICpwLCBzeXN2X3pvbmVfdCAqcSkKK3sKKwlmb3IgKCA7IHAgPCBxIDsgcCsrKSB7CisJCXN5c3Zfem9uZV90IG5yID0gKnA7CisJCWlmIChucikgeworCQkJKnAgPSAwOworCQkJc3lzdl9mcmVlX2Jsb2NrKGlub2RlLT5pX3NiLCBucik7CisJCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZnJlZV9icmFuY2hlcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzeXN2X3pvbmVfdCAqcCwgc3lzdl96b25lX3QgKnEsIGludCBkZXB0aCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CisKKwlpZiAoZGVwdGgtLSkgeworCQlmb3IgKCA7IHAgPCBxIDsgcCsrKSB7CisJCQlpbnQgYmxvY2s7CisJCQlzeXN2X3pvbmVfdCBuciA9ICpwOworCQkJaWYgKCFucikKKwkJCQljb250aW51ZTsKKwkJCSpwID0gMDsKKwkJCWJsb2NrID0gYmxvY2tfdG9fY3B1KFNZU1ZfU0Ioc2IpLCBucik7CisJCQliaCA9IHNiX2JyZWFkKHNiLCBibG9jayk7CisJCQlpZiAoIWJoKQorCQkJCWNvbnRpbnVlOworCQkJZnJlZV9icmFuY2hlcyhpbm9kZSwgKHN5c3Zfem9uZV90KiliaC0+Yl9kYXRhLAorCQkJCQlibG9ja19lbmQoYmgpLCBkZXB0aCk7CisJCQliZm9yZ2V0KGJoKTsKKwkJCXN5c3ZfZnJlZV9ibG9jayhzYiwgbnIpOworCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCX0KKwl9IGVsc2UKKwkJZnJlZV9kYXRhKGlub2RlLCBwLCBxKTsKK30KKwordm9pZCBzeXN2X3RydW5jYXRlIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwlzeXN2X3pvbmVfdCAqaV9kYXRhID0gU1lTVl9JKGlub2RlKS0+aV9kYXRhOworCWludCBvZmZzZXRzW0RFUFRIXTsKKwlJbmRpcmVjdCBjaGFpbltERVBUSF07CisJSW5kaXJlY3QgKnBhcnRpYWw7CisJc3lzdl96b25lX3QgbnIgPSAwOworCWludCBuOworCWxvbmcgaWJsb2NrOworCXVuc2lnbmVkIGJsb2Nrc2l6ZTsKKworCWlmICghKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0RJUihpbm9kZS0+aV9tb2RlKSB8fAorCSAgICBTX0lTTE5LKGlub2RlLT5pX21vZGUpKSkKKwkJcmV0dXJuOworCisJYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCWlibG9jayA9IChpbm9kZS0+aV9zaXplICsgYmxvY2tzaXplLTEpCisJCQkJCT4+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCisJYmxvY2tfdHJ1bmNhdGVfcGFnZShpbm9kZS0+aV9tYXBwaW5nLCBpbm9kZS0+aV9zaXplLCBnZXRfYmxvY2spOworCisJbiA9IGJsb2NrX3RvX3BhdGgoaW5vZGUsIGlibG9jaywgb2Zmc2V0cyk7CisJaWYgKG4gPT0gMCkKKwkJcmV0dXJuOworCisJaWYgKG4gPT0gMSkgeworCQlmcmVlX2RhdGEoaW5vZGUsIGlfZGF0YStvZmZzZXRzWzBdLCBpX2RhdGEgKyBESVJFQ1QpOworCQlnb3RvIGRvX2luZGlyZWN0czsKKwl9CisKKwlwYXJ0aWFsID0gZmluZF9zaGFyZWQoaW5vZGUsIG4sIG9mZnNldHMsIGNoYWluLCAmbnIpOworCS8qIEtpbGwgdGhlIHRvcCBvZiBzaGFyZWQgYnJhbmNoIChhbHJlYWR5IGRldGFjaGVkKSAqLworCWlmIChucikgeworCQlpZiAocGFydGlhbCA9PSBjaGFpbikKKwkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQllbHNlCisJCQlkaXJ0eV9pbmRpcmVjdChwYXJ0aWFsLT5iaCwgaW5vZGUpOworCQlmcmVlX2JyYW5jaGVzKGlub2RlLCAmbnIsICZucisxLCAoY2hhaW4rbi0xKSAtIHBhcnRpYWwpOworCX0KKwkvKiBDbGVhciB0aGUgZW5kcyBvZiBpbmRpcmVjdCBibG9ja3Mgb24gdGhlIHNoYXJlZCBicmFuY2ggKi8KKwl3aGlsZSAocGFydGlhbCA+IGNoYWluKSB7CisJCWZyZWVfYnJhbmNoZXMoaW5vZGUsIHBhcnRpYWwtPnAgKyAxLCBibG9ja19lbmQocGFydGlhbC0+YmgpLAorCQkJCShjaGFpbituLTEpIC0gcGFydGlhbCk7CisJCWRpcnR5X2luZGlyZWN0KHBhcnRpYWwtPmJoLCBpbm9kZSk7CisJCWJyZWxzZSAocGFydGlhbC0+YmgpOworCQlwYXJ0aWFsLS07CisJfQorZG9faW5kaXJlY3RzOgorCS8qIEtpbGwgdGhlIHJlbWFpbmluZyAod2hvbGUpIHN1YnRyZWVzICg9PSBzdWJ0cmVlcyBkZWVwZXIgdGhhbi4uLikgKi8KKwl3aGlsZSAobiA8IERFUFRIKSB7CisJCW5yID0gaV9kYXRhW0RJUkVDVCArIG4gLSAxXTsKKwkJaWYgKG5yKSB7CisJCQlpX2RhdGFbRElSRUNUICsgbiAtIDFdID0gMDsKKwkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQkJZnJlZV9icmFuY2hlcyhpbm9kZSwgJm5yLCAmbnIrMSwgbik7CisJCX0KKwkJbisrOworCX0KKwlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlpZiAoSVNfU1lOQyhpbm9kZSkpCisJCXN5c3Zfc3luY19pbm9kZSAoaW5vZGUpOworCWVsc2UKKwkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBzeXN2X25ibG9ja3Moc3RydWN0IHN1cGVyX2Jsb2NrICpzLCBsb2ZmX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3Qgc3lzdl9zYl9pbmZvICpzYmkgPSBTWVNWX1NCKHMpOworCWludCBwdHJzX2JpdHMgPSBzYmktPnNfaW5kX3Blcl9ibG9ja19iaXRzOworCXVuc2lnbmVkIGJsb2NrcywgcmVzLCBkaXJlY3QgPSBESVJFQ1QsIGkgPSBERVBUSDsKKwlibG9ja3MgPSAoc2l6ZSArIHMtPnNfYmxvY2tzaXplIC0gMSkgPj4gcy0+c19ibG9ja3NpemVfYml0czsKKwlyZXMgPSBibG9ja3M7CisJd2hpbGUgKC0taSAmJiBibG9ja3MgPiBkaXJlY3QpIHsKKwkJYmxvY2tzID0gKChibG9ja3MgLSBkaXJlY3QgLSAxKSA+PiBwdHJzX2JpdHMpICsgMTsKKwkJcmVzICs9IGJsb2NrczsKKwkJZGlyZWN0ID0gMTsKKwl9CisJcmV0dXJuIGJsb2NrczsKK30KKworaW50IHN5c3ZfZ2V0YXR0cihzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3Qga3N0YXQgKnN0YXQpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzID0gbW50LT5tbnRfc2I7CisJZ2VuZXJpY19maWxsYXR0cihkZW50cnktPmRfaW5vZGUsIHN0YXQpOworCXN0YXQtPmJsb2NrcyA9IChzLT5zX2Jsb2Nrc2l6ZSAvIDUxMikgKiBzeXN2X25ibG9ja3Mocywgc3RhdC0+c2l6ZSk7CisJc3RhdC0+Ymxrc2l6ZSA9IHMtPnNfYmxvY2tzaXplOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN5c3Zfd3JpdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlyZXR1cm4gYmxvY2tfd3JpdGVfZnVsbF9wYWdlKHBhZ2UsZ2V0X2Jsb2NrLHdiYyk7Cit9CitzdGF0aWMgaW50IHN5c3ZfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiBibG9ja19yZWFkX2Z1bGxfcGFnZShwYWdlLGdldF9ibG9jayk7Cit9CitzdGF0aWMgaW50IHN5c3ZfcHJlcGFyZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGZyb20sIHVuc2lnbmVkIHRvKQoreworCXJldHVybiBibG9ja19wcmVwYXJlX3dyaXRlKHBhZ2UsZnJvbSx0byxnZXRfYmxvY2spOworfQorc3RhdGljIHNlY3Rvcl90IHN5c3ZfYm1hcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc2VjdG9yX3QgYmxvY2spCit7CisJcmV0dXJuIGdlbmVyaWNfYmxvY2tfYm1hcChtYXBwaW5nLGJsb2NrLGdldF9ibG9jayk7Cit9CitzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHN5c3ZfYW9wcyA9IHsKKwkucmVhZHBhZ2UgPSBzeXN2X3JlYWRwYWdlLAorCS53cml0ZXBhZ2UgPSBzeXN2X3dyaXRlcGFnZSwKKwkuc3luY19wYWdlID0gYmxvY2tfc3luY19wYWdlLAorCS5wcmVwYXJlX3dyaXRlID0gc3lzdl9wcmVwYXJlX3dyaXRlLAorCS5jb21taXRfd3JpdGUgPSBnZW5lcmljX2NvbW1pdF93cml0ZSwKKwkuYm1hcCA9IHN5c3ZfYm1hcAorfTsKZGlmZiAtLWdpdCBhL2ZzL3N5c3YvbmFtZWkuYyBiL2ZzL3N5c3YvbmFtZWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjBlNGI1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvc3lzdi9uYW1laS5jCkBAIC0wLDAgKzEsMzE4IEBACisvKgorICogIGxpbnV4L2ZzL3N5c3YvbmFtZWkuYworICoKKyAqICBtaW5peC9uYW1laS5jCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICBjb2gvbmFtZWkuYworICogIENvcHlyaWdodCAoQykgMTk5MyAgUGFzY2FsIEhhaWJsZSwgQnJ1bm8gSGFpYmxlCisgKgorICogIHN5c3YvbmFtZWkuYworICogIENvcHlyaWdodCAoQykgMTk5MyAgQnJ1bm8gSGFpYmxlCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4ICBLcnp5c3p0b2YgRy4gQmFyYW5vd3NraQorICovCisKKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlICJzeXN2LmgiCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbmNfY291bnQoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpbm9kZS0+aV9ubGluaysrOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGVjX2NvdW50KHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaW5vZGUtPmlfbmxpbmstLTsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKK30KKworc3RhdGljIGludCBhZGRfbm9uZGlyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpbnQgZXJyID0gc3lzdl9hZGRfbGluayhkZW50cnksIGlub2RlKTsKKwlpZiAoIWVycikgeworCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCQlyZXR1cm4gMDsKKwl9CisJZGVjX2NvdW50KGlub2RlKTsKKwlpcHV0KGlub2RlKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHN5c3ZfaGFzaChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICpxc3RyKQoreworCS8qIFRydW5jYXRlIHRoZSBuYW1lIGluIHBsYWNlLCBhdm9pZHMgaGF2aW5nIHRvIGRlZmluZSBhIGNvbXBhcmUKKwkgICBmdW5jdGlvbi4gKi8KKwlpZiAocXN0ci0+bGVuID4gU1lTVl9OQU1FTEVOKSB7CisJCXFzdHItPmxlbiA9IFNZU1ZfTkFNRUxFTjsKKwkJcXN0ci0+aGFzaCA9IGZ1bGxfbmFtZV9oYXNoKHFzdHItPm5hbWUsIHFzdHItPmxlbik7CisJfQorCXJldHVybiAwOworfQorCitzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgc3lzdl9kZW50cnlfb3BlcmF0aW9ucyA9IHsKKwkuZF9oYXNoCQk9IHN5c3ZfaGFzaCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpzeXN2X2xvb2t1cChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gTlVMTDsKKwlpbm9fdCBpbm87CisKKwlkZW50cnktPmRfb3AgPSBkaXItPmlfc2ItPnNfcm9vdC0+ZF9vcDsKKwlpZiAoZGVudHJ5LT5kX25hbWUubGVuID4gU1lTVl9OQU1FTEVOKQorCQlyZXR1cm4gRVJSX1BUUigtRU5BTUVUT09MT05HKTsKKwlpbm8gPSBzeXN2X2lub2RlX2J5X25hbWUoZGVudHJ5KTsKKworCWlmIChpbm8pIHsKKwkJaW5vZGUgPSBpZ2V0KGRpci0+aV9zYiwgaW5vKTsKKwkJaWYgKCFpbm9kZSkKKwkJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworCX0KKwlkX2FkZChkZW50cnksIGlub2RlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBzeXN2X21rbm9kKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgaW50IG1vZGUsIGRldl90IHJkZXYpCit7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJaW50IGVycjsKKworCWlmICghb2xkX3ZhbGlkX2RldihyZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpbm9kZSA9IHN5c3ZfbmV3X2lub2RlKGRpciwgbW9kZSk7CisJZXJyID0gUFRSX0VSUihpbm9kZSk7CisKKwlpZiAoIUlTX0VSUihpbm9kZSkpIHsKKwkJc3lzdl9zZXRfaW5vZGUoaW5vZGUsIHJkZXYpOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJZXJyID0gYWRkX25vbmRpcihkZW50cnksIGlub2RlKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzeXN2X2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnksIGludCBtb2RlLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlyZXR1cm4gc3lzdl9ta25vZChkaXIsIGRlbnRyeSwgbW9kZSwgMCk7Cit9CisKK3N0YXRpYyBpbnQgc3lzdl9zeW1saW5rKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgCisJY29uc3QgY2hhciAqIHN5bW5hbWUpCit7CisJaW50IGVyciA9IC1FTkFNRVRPT0xPTkc7CisJaW50IGwgPSBzdHJsZW4oc3ltbmFtZSkrMTsKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKworCWlmIChsID4gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkKKwkJZ290byBvdXQ7CisKKwlpbm9kZSA9IHN5c3ZfbmV3X2lub2RlKGRpciwgU19JRkxOS3wwNzc3KTsKKwllcnIgPSBQVFJfRVJSKGlub2RlKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkKKwkJZ290byBvdXQ7CisJCisJc3lzdl9zZXRfaW5vZGUoaW5vZGUsIDApOworCWVyciA9IHBhZ2Vfc3ltbGluayhpbm9kZSwgc3ltbmFtZSwgbCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZmFpbDsKKworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCWVyciA9IGFkZF9ub25kaXIoZGVudHJ5LCBpbm9kZSk7CitvdXQ6CisJcmV0dXJuIGVycjsKKworb3V0X2ZhaWw6CisJZGVjX2NvdW50KGlub2RlKTsKKwlpcHV0KGlub2RlKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIGludCBzeXN2X2xpbmsoc3RydWN0IGRlbnRyeSAqIG9sZF9kZW50cnksIHN0cnVjdCBpbm9kZSAqIGRpciwgCisJc3RydWN0IGRlbnRyeSAqIGRlbnRyeSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gb2xkX2RlbnRyeS0+ZF9pbm9kZTsKKworCWlmIChpbm9kZS0+aV9ubGluayA+PSBTWVNWX1NCKGlub2RlLT5pX3NiKS0+c19saW5rX21heCkKKwkJcmV0dXJuIC1FTUxJTks7CisKKwlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJaW5jX2NvdW50KGlub2RlKTsKKwlhdG9taWNfaW5jKCZpbm9kZS0+aV9jb3VudCk7CisKKwlyZXR1cm4gYWRkX25vbmRpcihkZW50cnksIGlub2RlKTsKK30KKworc3RhdGljIGludCBzeXN2X21rZGlyKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKwlpbnQgZXJyID0gLUVNTElOSzsKKworCWlmIChkaXItPmlfbmxpbmsgPj0gU1lTVl9TQihkaXItPmlfc2IpLT5zX2xpbmtfbWF4KSAKKwkJZ290byBvdXQ7CisJaW5jX2NvdW50KGRpcik7CisKKwlpbm9kZSA9IHN5c3ZfbmV3X2lub2RlKGRpciwgU19JRkRJUnxtb2RlKTsKKwllcnIgPSBQVFJfRVJSKGlub2RlKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkKKwkJZ290byBvdXRfZGlyOworCisJc3lzdl9zZXRfaW5vZGUoaW5vZGUsIDApOworCisJaW5jX2NvdW50KGlub2RlKTsKKworCWVyciA9IHN5c3ZfbWFrZV9lbXB0eShpbm9kZSwgZGlyKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mYWlsOworCisJZXJyID0gc3lzdl9hZGRfbGluayhkZW50cnksIGlub2RlKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mYWlsOworCisgICAgICAgIGRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CitvdXQ6CisJcmV0dXJuIGVycjsKKworb3V0X2ZhaWw6CisJZGVjX2NvdW50KGlub2RlKTsKKwlkZWNfY291bnQoaW5vZGUpOworCWlwdXQoaW5vZGUpOworb3V0X2RpcjoKKwlkZWNfY291bnQoZGlyKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIGludCBzeXN2X3VubGluayhzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnkpCit7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHBhZ2UgKiBwYWdlOworCXN0cnVjdCBzeXN2X2Rpcl9lbnRyeSAqIGRlOworCWludCBlcnIgPSAtRU5PRU5UOworCisJZGUgPSBzeXN2X2ZpbmRfZW50cnkoZGVudHJ5LCAmcGFnZSk7CisJaWYgKCFkZSkKKwkJZ290byBvdXQ7CisKKwllcnIgPSBzeXN2X2RlbGV0ZV9lbnRyeSAoZGUsIHBhZ2UpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJaW5vZGUtPmlfY3RpbWUgPSBkaXItPmlfY3RpbWU7CisJZGVjX2NvdW50KGlub2RlKTsKK291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHN5c3Zfcm1kaXIoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICogZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IGVyciA9IC1FTk9URU1QVFk7CisKKwlpZiAoc3lzdl9lbXB0eV9kaXIoaW5vZGUpKSB7CisJCWVyciA9IHN5c3ZfdW5saW5rKGRpciwgZGVudHJ5KTsKKwkJaWYgKCFlcnIpIHsKKwkJCWlub2RlLT5pX3NpemUgPSAwOworCQkJZGVjX2NvdW50KGlub2RlKTsKKwkJCWRlY19jb3VudChkaXIpOworCQl9CisJfQorCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBBbnlib2R5IGNhbiByZW5hbWUgYW55dGhpbmcgd2l0aCB0aGlzOiB0aGUgcGVybWlzc2lvbiBjaGVja3MgYXJlIGxlZnQgdG8gdGhlCisgKiBoaWdoZXItbGV2ZWwgcm91dGluZXMuCisgKi8KK3N0YXRpYyBpbnQgc3lzdl9yZW5hbWUoc3RydWN0IGlub2RlICogb2xkX2Rpciwgc3RydWN0IGRlbnRyeSAqIG9sZF9kZW50cnksCisJCSAgc3RydWN0IGlub2RlICogbmV3X2Rpciwgc3RydWN0IGRlbnRyeSAqIG5ld19kZW50cnkpCit7CisJc3RydWN0IGlub2RlICogb2xkX2lub2RlID0gb2xkX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKiBuZXdfaW5vZGUgPSBuZXdfZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCBwYWdlICogZGlyX3BhZ2UgPSBOVUxMOworCXN0cnVjdCBzeXN2X2Rpcl9lbnRyeSAqIGRpcl9kZSA9IE5VTEw7CisJc3RydWN0IHBhZ2UgKiBvbGRfcGFnZTsKKwlzdHJ1Y3Qgc3lzdl9kaXJfZW50cnkgKiBvbGRfZGU7CisJaW50IGVyciA9IC1FTk9FTlQ7CisKKwlvbGRfZGUgPSBzeXN2X2ZpbmRfZW50cnkob2xkX2RlbnRyeSwgJm9sZF9wYWdlKTsKKwlpZiAoIW9sZF9kZSkKKwkJZ290byBvdXQ7CisKKwlpZiAoU19JU0RJUihvbGRfaW5vZGUtPmlfbW9kZSkpIHsKKwkJZXJyID0gLUVJTzsKKwkJZGlyX2RlID0gc3lzdl9kb3Rkb3Qob2xkX2lub2RlLCAmZGlyX3BhZ2UpOworCQlpZiAoIWRpcl9kZSkKKwkJCWdvdG8gb3V0X29sZDsKKwl9CisKKwlpZiAobmV3X2lub2RlKSB7CisJCXN0cnVjdCBwYWdlICogbmV3X3BhZ2U7CisJCXN0cnVjdCBzeXN2X2Rpcl9lbnRyeSAqIG5ld19kZTsKKworCQllcnIgPSAtRU5PVEVNUFRZOworCQlpZiAoZGlyX2RlICYmICFzeXN2X2VtcHR5X2RpcihuZXdfaW5vZGUpKQorCQkJZ290byBvdXRfZGlyOworCisJCWVyciA9IC1FTk9FTlQ7CisJCW5ld19kZSA9IHN5c3ZfZmluZF9lbnRyeShuZXdfZGVudHJ5LCAmbmV3X3BhZ2UpOworCQlpZiAoIW5ld19kZSkKKwkJCWdvdG8gb3V0X2RpcjsKKwkJaW5jX2NvdW50KG9sZF9pbm9kZSk7CisJCXN5c3Zfc2V0X2xpbmsobmV3X2RlLCBuZXdfcGFnZSwgb2xkX2lub2RlKTsKKwkJbmV3X2lub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwkJaWYgKGRpcl9kZSkKKwkJCW5ld19pbm9kZS0+aV9ubGluay0tOworCQlkZWNfY291bnQobmV3X2lub2RlKTsKKwl9IGVsc2UgeworCQlpZiAoZGlyX2RlKSB7CisJCQllcnIgPSAtRU1MSU5LOworCQkJaWYgKG5ld19kaXItPmlfbmxpbmsgPj0gU1lTVl9TQihuZXdfZGlyLT5pX3NiKS0+c19saW5rX21heCkKKwkJCQlnb3RvIG91dF9kaXI7CisJCX0KKwkJaW5jX2NvdW50KG9sZF9pbm9kZSk7CisJCWVyciA9IHN5c3ZfYWRkX2xpbmsobmV3X2RlbnRyeSwgb2xkX2lub2RlKTsKKwkJaWYgKGVycikgeworCQkJZGVjX2NvdW50KG9sZF9pbm9kZSk7CisJCQlnb3RvIG91dF9kaXI7CisJCX0KKwkJaWYgKGRpcl9kZSkKKwkJCWluY19jb3VudChuZXdfZGlyKTsKKwl9CisKKwlzeXN2X2RlbGV0ZV9lbnRyeShvbGRfZGUsIG9sZF9wYWdlKTsKKwlkZWNfY291bnQob2xkX2lub2RlKTsKKworCWlmIChkaXJfZGUpIHsKKwkJc3lzdl9zZXRfbGluayhkaXJfZGUsIGRpcl9wYWdlLCBuZXdfZGlyKTsKKwkJZGVjX2NvdW50KG9sZF9kaXIpOworCX0KKwlyZXR1cm4gMDsKKworb3V0X2RpcjoKKwlpZiAoZGlyX2RlKSB7CisJCWt1bm1hcChkaXJfcGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShkaXJfcGFnZSk7CisJfQorb3V0X29sZDoKKwlrdW5tYXAob2xkX3BhZ2UpOworCXBhZ2VfY2FjaGVfcmVsZWFzZShvbGRfcGFnZSk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIGRpcmVjdG9yaWVzIGNhbiBoYW5kbGUgbW9zdCBvcGVyYXRpb25zLi4uCisgKi8KK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHN5c3ZfZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLmNyZWF0ZQkJPSBzeXN2X2NyZWF0ZSwKKwkubG9va3VwCQk9IHN5c3ZfbG9va3VwLAorCS5saW5rCQk9IHN5c3ZfbGluaywKKwkudW5saW5rCQk9IHN5c3ZfdW5saW5rLAorCS5zeW1saW5rCT0gc3lzdl9zeW1saW5rLAorCS5ta2RpcgkJPSBzeXN2X21rZGlyLAorCS5ybWRpcgkJPSBzeXN2X3JtZGlyLAorCS5ta25vZAkJPSBzeXN2X21rbm9kLAorCS5yZW5hbWUJCT0gc3lzdl9yZW5hbWUsCisJLmdldGF0dHIJPSBzeXN2X2dldGF0dHIsCit9OwpkaWZmIC0tZ2l0IGEvZnMvc3lzdi9zdXBlci5jIGIvZnMvc3lzdi9zdXBlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZTc2YjUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9zeXN2L3N1cGVyLmMKQEAgLTAsMCArMSw1NzIgQEAKKy8qCisgKiAgbGludXgvZnMvc3lzdi9pbm9kZS5jCisgKgorICogIG1pbml4L2lub2RlLmMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKgorICogIHhlbml4L2lub2RlLmMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTIgIERvdWcgRXZhbnMKKyAqCisgKiAgY29oL2lub2RlLmMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTMgIFBhc2NhbCBIYWlibGUsIEJydW5vIEhhaWJsZQorICoKKyAqICBzeXN2L2lub2RlLmMKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTMgIFBhdWwgQi4gTW9uZGF5CisgKgorICogIHN5c3YvaW5vZGUuYworICogIENvcHlyaWdodCAoQykgMTk5MyAgQnJ1bm8gSGFpYmxlCisgKiAgQ29weXJpZ2h0IChDKSAxOTk3LCAxOTk4ICBLcnp5c3p0b2YgRy4gQmFyYW5vd3NraQorICoKKyAqICBUaGlzIGZpbGUgY29udGFpbnMgY29kZSBmb3IgcmVhZC9wYXJzaW5nIHRoZSBzdXBlcmJsb2NrLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSAic3lzdi5oIgorCisvKgorICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgdHJ5IHRvIHJlY29nbml6ZSBzcGVjaWZpYyBmaWxlc3lzdGVtcy4KKyAqCisgKiBXZSByZWNvZ25pemU6CisgKiAtIFhlbml4IEZTIGJ5IGl0cyBtYWdpYyBudW1iZXIuCisgKiAtIFN5c3RlbVYgRlMgYnkgaXRzIG1hZ2ljIG51bWJlci4KKyAqIC0gQ29oZXJlbnQgRlMgYnkgaXRzIGZ1bm55IGZuYW1lL2ZwYWNrIGZpZWxkLgorICogLSBTQ08gQUZTIGJ5IHNfbmZyZWUgPT0gMHhmZmZmCisgKiAtIFY3IEZTIGhhcyBubyBkaXN0aW5ndWlzaGluZyBmZWF0dXJlcy4KKyAqCisgKiBXZSBkaXNjcmltaW5hdGUgYW1vbmcgU3lzdGVtVjQgYW5kIFN5c3RlbVYyIEZTIGJ5IHRoZSBhc3N1bXB0aW9uIHRoYXQKKyAqIHRoZSB0aW1lIHN0YW1wIGlzIG5vdCA8IDAxLTAxLTE5ODAuCisgKi8KKworZW51bSB7CisJSkFOXzFfMTk4MCA9ICgxMCozNjUgKyAyKSAqIDI0ICogNjAgKiA2MAorfTsKKworc3RhdGljIHZvaWQgZGV0ZWN0ZWRfeGVuaXgoc3RydWN0IHN5c3Zfc2JfaW5mbyAqc2JpKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgxID0gc2JpLT5zX2JoMTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoMiA9IHNiaS0+c19iaDI7CisJc3RydWN0IHhlbml4X3N1cGVyX2Jsb2NrICogc2JkMTsKKwlzdHJ1Y3QgeGVuaXhfc3VwZXJfYmxvY2sgKiBzYmQyOworCisJaWYgKGJoMSAhPSBiaDIpCisJCXNiZDEgPSBzYmQyID0gKHN0cnVjdCB4ZW5peF9zdXBlcl9ibG9jayAqKSBiaDEtPmJfZGF0YTsKKwllbHNlIHsKKwkJLyogYmxvY2sgc2l6ZSA9IDUxMiwgc28gYmgxICE9IGJoMiAqLworCQlzYmQxID0gKHN0cnVjdCB4ZW5peF9zdXBlcl9ibG9jayAqKSBiaDEtPmJfZGF0YTsKKwkJc2JkMiA9IChzdHJ1Y3QgeGVuaXhfc3VwZXJfYmxvY2sgKikgKGJoMi0+Yl9kYXRhIC0gNTEyKTsKKwl9CisKKwlzYmktPnNfbGlua19tYXggPSBYRU5JWF9MSU5LX01BWDsKKwlzYmktPnNfZmljX3NpemUgPSBYRU5JWF9OSUNJTk9EOworCXNiaS0+c19mbGNfc2l6ZSA9IFhFTklYX05JQ0ZSRUU7CisJc2JpLT5zX3NiZDEgPSAoY2hhciAqKXNiZDE7CisJc2JpLT5zX3NiZDIgPSAoY2hhciAqKXNiZDI7CisJc2JpLT5zX3NiX2ZpY19jb3VudCA9ICZzYmQxLT5zX25pbm9kZTsKKwlzYmktPnNfc2JfZmljX2lub2RlcyA9ICZzYmQxLT5zX2lub2RlWzBdOworCXNiaS0+c19zYl90b3RhbF9mcmVlX2lub2RlcyA9ICZzYmQyLT5zX3Rpbm9kZTsKKwlzYmktPnNfYmNhY2hlX2NvdW50ID0gJnNiZDEtPnNfbmZyZWU7CisJc2JpLT5zX2JjYWNoZSA9ICZzYmQxLT5zX2ZyZWVbMF07CisJc2JpLT5zX2ZyZWVfYmxvY2tzID0gJnNiZDItPnNfdGZyZWU7CisJc2JpLT5zX3NiX3RpbWUgPSAmc2JkMi0+c190aW1lOworCXNiaS0+c19maXJzdGRhdGF6b25lID0gZnMxNl90b19jcHUoc2JpLCBzYmQxLT5zX2lzaXplKTsKKwlzYmktPnNfbnpvbmVzID0gZnMzMl90b19jcHUoc2JpLCBzYmQxLT5zX2ZzaXplKTsKK30KKworc3RhdGljIHZvaWQgZGV0ZWN0ZWRfc3lzdjQoc3RydWN0IHN5c3Zfc2JfaW5mbyAqc2JpKQoreworCXN0cnVjdCBzeXN2NF9zdXBlcl9ibG9jayAqIHNiZDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoMSA9IHNiaS0+c19iaDE7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDIgPSBzYmktPnNfYmgyOworCisJaWYgKGJoMSA9PSBiaDIpCisJCXNiZCA9IChzdHJ1Y3Qgc3lzdjRfc3VwZXJfYmxvY2sgKikgKGJoMS0+Yl9kYXRhICsgQkxPQ0tfU0laRS8yKTsKKwllbHNlCisJCXNiZCA9IChzdHJ1Y3Qgc3lzdjRfc3VwZXJfYmxvY2sgKikgYmgyLT5iX2RhdGE7CisKKwlzYmktPnNfbGlua19tYXggPSBTWVNWX0xJTktfTUFYOworCXNiaS0+c19maWNfc2l6ZSA9IFNZU1ZfTklDSU5PRDsKKwlzYmktPnNfZmxjX3NpemUgPSBTWVNWX05JQ0ZSRUU7CisJc2JpLT5zX3NiZDEgPSAoY2hhciAqKXNiZDsKKwlzYmktPnNfc2JkMiA9IChjaGFyICopc2JkOworCXNiaS0+c19zYl9maWNfY291bnQgPSAmc2JkLT5zX25pbm9kZTsKKwlzYmktPnNfc2JfZmljX2lub2RlcyA9ICZzYmQtPnNfaW5vZGVbMF07CisJc2JpLT5zX3NiX3RvdGFsX2ZyZWVfaW5vZGVzID0gJnNiZC0+c190aW5vZGU7CisJc2JpLT5zX2JjYWNoZV9jb3VudCA9ICZzYmQtPnNfbmZyZWU7CisJc2JpLT5zX2JjYWNoZSA9ICZzYmQtPnNfZnJlZVswXTsKKwlzYmktPnNfZnJlZV9ibG9ja3MgPSAmc2JkLT5zX3RmcmVlOworCXNiaS0+c19zYl90aW1lID0gJnNiZC0+c190aW1lOworCXNiaS0+c19zYl9zdGF0ZSA9ICZzYmQtPnNfc3RhdGU7CisJc2JpLT5zX2ZpcnN0ZGF0YXpvbmUgPSBmczE2X3RvX2NwdShzYmksIHNiZC0+c19pc2l6ZSk7CisJc2JpLT5zX256b25lcyA9IGZzMzJfdG9fY3B1KHNiaSwgc2JkLT5zX2ZzaXplKTsKK30KKworc3RhdGljIHZvaWQgZGV0ZWN0ZWRfc3lzdjIoc3RydWN0IHN5c3Zfc2JfaW5mbyAqc2JpKQoreworCXN0cnVjdCBzeXN2Ml9zdXBlcl9ibG9jayAqc2JkOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgxID0gc2JpLT5zX2JoMTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoMiA9IHNiaS0+c19iaDI7CisKKwlpZiAoYmgxID09IGJoMikKKwkJc2JkID0gKHN0cnVjdCBzeXN2Ml9zdXBlcl9ibG9jayAqKSAoYmgxLT5iX2RhdGEgKyBCTE9DS19TSVpFLzIpOworCWVsc2UKKwkJc2JkID0gKHN0cnVjdCBzeXN2Ml9zdXBlcl9ibG9jayAqKSBiaDItPmJfZGF0YTsKKworCXNiaS0+c19saW5rX21heCA9IFNZU1ZfTElOS19NQVg7CisJc2JpLT5zX2ZpY19zaXplID0gU1lTVl9OSUNJTk9EOworCXNiaS0+c19mbGNfc2l6ZSA9IFNZU1ZfTklDRlJFRTsKKwlzYmktPnNfc2JkMSA9IChjaGFyICopc2JkOworCXNiaS0+c19zYmQyID0gKGNoYXIgKilzYmQ7CisJc2JpLT5zX3NiX2ZpY19jb3VudCA9ICZzYmQtPnNfbmlub2RlOworCXNiaS0+c19zYl9maWNfaW5vZGVzID0gJnNiZC0+c19pbm9kZVswXTsKKwlzYmktPnNfc2JfdG90YWxfZnJlZV9pbm9kZXMgPSAmc2JkLT5zX3Rpbm9kZTsKKwlzYmktPnNfYmNhY2hlX2NvdW50ID0gJnNiZC0+c19uZnJlZTsKKwlzYmktPnNfYmNhY2hlID0gJnNiZC0+c19mcmVlWzBdOworCXNiaS0+c19mcmVlX2Jsb2NrcyA9ICZzYmQtPnNfdGZyZWU7CisJc2JpLT5zX3NiX3RpbWUgPSAmc2JkLT5zX3RpbWU7CisJc2JpLT5zX3NiX3N0YXRlID0gJnNiZC0+c19zdGF0ZTsKKwlzYmktPnNfZmlyc3RkYXRhem9uZSA9IGZzMTZfdG9fY3B1KHNiaSwgc2JkLT5zX2lzaXplKTsKKwlzYmktPnNfbnpvbmVzID0gZnMzMl90b19jcHUoc2JpLCBzYmQtPnNfZnNpemUpOworfQorCitzdGF0aWMgdm9pZCBkZXRlY3RlZF9jb2hlcmVudChzdHJ1Y3Qgc3lzdl9zYl9pbmZvICpzYmkpCit7CisJc3RydWN0IGNvaF9zdXBlcl9ibG9jayAqIHNiZDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoMSA9IHNiaS0+c19iaDE7CisKKwlzYmQgPSAoc3RydWN0IGNvaF9zdXBlcl9ibG9jayAqKSBiaDEtPmJfZGF0YTsKKworCXNiaS0+c19saW5rX21heCA9IENPSF9MSU5LX01BWDsKKwlzYmktPnNfZmljX3NpemUgPSBDT0hfTklDSU5PRDsKKwlzYmktPnNfZmxjX3NpemUgPSBDT0hfTklDRlJFRTsKKwlzYmktPnNfc2JkMSA9IChjaGFyICopc2JkOworCXNiaS0+c19zYmQyID0gKGNoYXIgKilzYmQ7CisJc2JpLT5zX3NiX2ZpY19jb3VudCA9ICZzYmQtPnNfbmlub2RlOworCXNiaS0+c19zYl9maWNfaW5vZGVzID0gJnNiZC0+c19pbm9kZVswXTsKKwlzYmktPnNfc2JfdG90YWxfZnJlZV9pbm9kZXMgPSAmc2JkLT5zX3Rpbm9kZTsKKwlzYmktPnNfYmNhY2hlX2NvdW50ID0gJnNiZC0+c19uZnJlZTsKKwlzYmktPnNfYmNhY2hlID0gJnNiZC0+c19mcmVlWzBdOworCXNiaS0+c19mcmVlX2Jsb2NrcyA9ICZzYmQtPnNfdGZyZWU7CisJc2JpLT5zX3NiX3RpbWUgPSAmc2JkLT5zX3RpbWU7CisJc2JpLT5zX2ZpcnN0ZGF0YXpvbmUgPSBmczE2X3RvX2NwdShzYmksIHNiZC0+c19pc2l6ZSk7CisJc2JpLT5zX256b25lcyA9IGZzMzJfdG9fY3B1KHNiaSwgc2JkLT5zX2ZzaXplKTsKK30KKworc3RhdGljIHZvaWQgZGV0ZWN0ZWRfdjcoc3RydWN0IHN5c3Zfc2JfaW5mbyAqc2JpKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgyID0gc2JpLT5zX2JoMjsKKwlzdHJ1Y3Qgdjdfc3VwZXJfYmxvY2sgKnNiZCA9IChzdHJ1Y3Qgdjdfc3VwZXJfYmxvY2sgKiliaDItPmJfZGF0YTsKKworCXNiaS0+c19saW5rX21heCA9IFY3X0xJTktfTUFYOworCXNiaS0+c19maWNfc2l6ZSA9IFY3X05JQ0lOT0Q7CisJc2JpLT5zX2ZsY19zaXplID0gVjdfTklDRlJFRTsKKwlzYmktPnNfc2JkMSA9IChjaGFyICopc2JkOworCXNiaS0+c19zYmQyID0gKGNoYXIgKilzYmQ7CisJc2JpLT5zX3NiX2ZpY19jb3VudCA9ICZzYmQtPnNfbmlub2RlOworCXNiaS0+c19zYl9maWNfaW5vZGVzID0gJnNiZC0+c19pbm9kZVswXTsKKwlzYmktPnNfc2JfdG90YWxfZnJlZV9pbm9kZXMgPSAmc2JkLT5zX3Rpbm9kZTsKKwlzYmktPnNfYmNhY2hlX2NvdW50ID0gJnNiZC0+c19uZnJlZTsKKwlzYmktPnNfYmNhY2hlID0gJnNiZC0+c19mcmVlWzBdOworCXNiaS0+c19mcmVlX2Jsb2NrcyA9ICZzYmQtPnNfdGZyZWU7CisJc2JpLT5zX3NiX3RpbWUgPSAmc2JkLT5zX3RpbWU7CisJc2JpLT5zX2ZpcnN0ZGF0YXpvbmUgPSBmczE2X3RvX2NwdShzYmksIHNiZC0+c19pc2l6ZSk7CisJc2JpLT5zX256b25lcyA9IGZzMzJfdG9fY3B1KHNiaSwgc2JkLT5zX2ZzaXplKTsKK30KKworc3RhdGljIGludCBkZXRlY3RfeGVuaXgoc3RydWN0IHN5c3Zfc2JfaW5mbyAqc2JpLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXN0cnVjdCB4ZW5peF9zdXBlcl9ibG9jayAqc2JkID0gKHN0cnVjdCB4ZW5peF9zdXBlcl9ibG9jayAqKWJoLT5iX2RhdGE7CisJaWYgKCooX19sZTMyICopJnNiZC0+c19tYWdpYyA9PSBjcHVfdG9fbGUzMigweDJiNTU0NCkpCisJCXNiaS0+c19ieXRlc2V4ID0gQllURVNFWF9MRTsKKwllbHNlIGlmICgqKF9fYmUzMiAqKSZzYmQtPnNfbWFnaWMgPT0gY3B1X3RvX2JlMzIoMHgyYjU1NDQpKQorCQlzYmktPnNfYnl0ZXNleCA9IEJZVEVTRVhfQkU7CisJZWxzZQorCQlyZXR1cm4gMDsKKwlzd2l0Y2ggKGZzMzJfdG9fY3B1KHNiaSwgc2JkLT5zX3R5cGUpKSB7CisJY2FzZSAxOgorCQlzYmktPnNfdHlwZSA9IEZTVFlQRV9YRU5JWDsKKwkJcmV0dXJuIDE7CisJY2FzZSAyOgorCQlzYmktPnNfdHlwZSA9IEZTVFlQRV9YRU5JWDsKKwkJcmV0dXJuIDI7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW50IGRldGVjdF9zeXN2KHN0cnVjdCBzeXN2X3NiX2luZm8gKnNiaSwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gc2JpLT5zX3NiOworCS8qIEFsbCByZWxldmFudCBmaWVsZHMgYXJlIGF0IHRoZSBzYW1lIG9mZnNldHMgaW4gUjIgYW5kIFI0ICovCisJc3RydWN0IHN5c3Y0X3N1cGVyX2Jsb2NrICogc2JkOworCXUzMiB0eXBlOworCisJc2JkID0gKHN0cnVjdCBzeXN2NF9zdXBlcl9ibG9jayAqKSAoYmgtPmJfZGF0YSArIEJMT0NLX1NJWkUvMik7CisJaWYgKCooX19sZTMyICopJnNiZC0+c19tYWdpYyA9PSBjcHVfdG9fbGUzMigweGZkMTg3ZTIwKSkKKwkJc2JpLT5zX2J5dGVzZXggPSBCWVRFU0VYX0xFOworCWVsc2UgaWYgKCooX19iZTMyICopJnNiZC0+c19tYWdpYyA9PSBjcHVfdG9fYmUzMigweGZkMTg3ZTIwKSkKKwkJc2JpLT5zX2J5dGVzZXggPSBCWVRFU0VYX0JFOworCWVsc2UKKwkJcmV0dXJuIDA7CisKKwl0eXBlID0gZnMzMl90b19jcHUoc2JpLCBzYmQtPnNfdHlwZSk7CisgCisgCWlmIChmczE2X3RvX2NwdShzYmksIHNiZC0+c19uZnJlZSkgPT0gMHhmZmZmKSB7CisgCQlzYmktPnNfdHlwZSA9IEZTVFlQRV9BRlM7CisJCXNiaS0+c19mb3JjZWRfcm8gPSAxOworIAkJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisgCQkJcHJpbnRrKCJTeXNWIEZTOiBTQ08gRUFGUyBvbiAlcyBkZXRlY3RlZCwgIiAKKyAJCQkJImZvcmNpbmcgcmVhZC1vbmx5IG1vZGUuXG4iLCAKKyAJCQkJc2ItPnNfaWQpOworIAkJfQorIAkJcmV0dXJuIHR5cGU7CisgCX0KKyAKKwlpZiAoZnMzMl90b19jcHUoc2JpLCBzYmQtPnNfdGltZSkgPCBKQU5fMV8xOTgwKSB7CisJCS8qIHRoaXMgaXMgbGlrZWx5IHRvIGhhcHBlbiBvbiBTeXN0ZW1WMiBGUyAqLworCQlpZiAodHlwZSA+IDMgfHwgdHlwZSA8IDEpCisJCQlyZXR1cm4gMDsKKwkJc2JpLT5zX3R5cGUgPSBGU1RZUEVfU1lTVjI7CisJCXJldHVybiB0eXBlOworCX0KKwlpZiAoKHR5cGUgPiAzIHx8IHR5cGUgPCAxKSAmJiAodHlwZSA+IDB4MzAgfHwgdHlwZSA8IDB4MTApKQorCQlyZXR1cm4gMDsKKworCS8qIE9uIEludGVyYWN0aXZlIFVuaXggKElTQykgVmVyc2lvbiA0LjAvMy54IHNfdHlwZSBmaWVsZCA9IDB4MTAsCisJICAgMHgyMCBvciAweDMwIGluZGljYXRlcyB0aGF0IHN5bWJvbGljIGxpbmtzIGFuZCB0aGUgMTQtY2hhcmFjdGVyCisJICAgZmlsZW5hbWUgbGltaXQgaXMgZ29uZS4gRHVlIHRvIGxhY2sgb2YgaW5mb3JtYXRpb24gYWJvdXQgdGhpcworICAgICAgICAgICBmZWF0dXJlIHJlYWQtb25seSBtb2RlIHNlZW1zIHRvIGJlIGEgcmVhc29uYWJsZSBhcHByb2FjaC4uLiAtS0dCICovCisKKwlpZiAodHlwZSA+PSAweDEwKSB7CisJCXByaW50aygiU3lzViBGUzogY2FuJ3QgaGFuZGxlIGxvbmcgZmlsZSBuYW1lcyBvbiAlcywgIgorCQkgICAgICAgImZvcmNpbmcgcmVhZC1vbmx5IG1vZGUuXG4iLCBzYi0+c19pZCk7CisJCXNiaS0+c19mb3JjZWRfcm8gPSAxOworCX0KKworCXNiaS0+c190eXBlID0gRlNUWVBFX1NZU1Y0OworCXJldHVybiB0eXBlID49IDB4MTAgPyB0eXBlID4+IDQgOiB0eXBlOworfQorCitzdGF0aWMgaW50IGRldGVjdF9jb2hlcmVudChzdHJ1Y3Qgc3lzdl9zYl9pbmZvICpzYmksIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJc3RydWN0IGNvaF9zdXBlcl9ibG9jayAqIHNiZDsKKworCXNiZCA9IChzdHJ1Y3QgY29oX3N1cGVyX2Jsb2NrICopIChiaC0+Yl9kYXRhICsgQkxPQ0tfU0laRS8yKTsKKwlpZiAoKG1lbWNtcChzYmQtPnNfZm5hbWUsIm5vbmFtZSIsNikgJiYgbWVtY21wKHNiZC0+c19mbmFtZSwieHh4eHggIiw2KSkKKwkgICAgfHwgKG1lbWNtcChzYmQtPnNfZnBhY2ssIm5vcGFjayIsNikgJiYgbWVtY21wKHNiZC0+c19mcGFjaywieHh4eHhcbiIsNikpKQorCQlyZXR1cm4gMDsKKwlzYmktPnNfYnl0ZXNleCA9IEJZVEVTRVhfUERQOworCXNiaS0+c190eXBlID0gRlNUWVBFX0NPSDsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBkZXRlY3Rfc3lzdl9vZGQoc3RydWN0IHN5c3Zfc2JfaW5mbyAqc2JpLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCWludCBzaXplID0gZGV0ZWN0X3N5c3Yoc2JpLCBiaCk7CisKKwlyZXR1cm4gc2l6ZT4yID8gMCA6IHNpemU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeworCWludCBibG9jazsKKwlpbnQgKCp0ZXN0KShzdHJ1Y3Qgc3lzdl9zYl9pbmZvICosIHN0cnVjdCBidWZmZXJfaGVhZCAqKTsKK30gZmxhdm91cnNbXSA9IHsKKwl7MSwgZGV0ZWN0X3hlbml4fSwKKwl7MCwgZGV0ZWN0X3N5c3Z9LAorCXswLCBkZXRlY3RfY29oZXJlbnR9LAorCXs5LCBkZXRlY3Rfc3lzdl9vZGR9LAorCXsxNSxkZXRlY3Rfc3lzdl9vZGR9LAorCXsxOCxkZXRlY3Rfc3lzdn0sCit9OworCitzdGF0aWMgY2hhciAqZmxhdm91cl9uYW1lc1tdID0geworCVtGU1RZUEVfWEVOSVhdCT0gIlhlbml4IiwKKwlbRlNUWVBFX1NZU1Y0XQk9ICJTeXN0ZW1WIiwKKwlbRlNUWVBFX1NZU1YyXQk9ICJTeXN0ZW1WIFJlbGVhc2UgMiIsCisJW0ZTVFlQRV9DT0hdCT0gIkNvaGVyZW50IiwKKwlbRlNUWVBFX1Y3XQk9ICJWNyIsCisJW0ZTVFlQRV9BRlNdCT0gIkFGUyIsCit9OworCitzdGF0aWMgdm9pZCAoKmZsYXZvdXJfc2V0dXBbXSkoc3RydWN0IHN5c3Zfc2JfaW5mbyAqKSA9IHsKKwlbRlNUWVBFX1hFTklYXQk9IGRldGVjdGVkX3hlbml4LAorCVtGU1RZUEVfU1lTVjRdCT0gZGV0ZWN0ZWRfc3lzdjQsCisJW0ZTVFlQRV9TWVNWMl0JPSBkZXRlY3RlZF9zeXN2MiwKKwlbRlNUWVBFX0NPSF0JPSBkZXRlY3RlZF9jb2hlcmVudCwKKwlbRlNUWVBFX1Y3XQk9IGRldGVjdGVkX3Y3LAorCVtGU1RZUEVfQUZTXQk9IGRldGVjdGVkX3N5c3Y0LAorfTsKKworc3RhdGljIGludCBjb21wbGV0ZV9yZWFkX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBzaWxlbnQsIGludCBzaXplKQoreworCXN0cnVjdCBzeXN2X3NiX2luZm8gKnNiaSA9IFNZU1ZfU0Ioc2IpOworCXN0cnVjdCBpbm9kZSAqcm9vdF9pbm9kZTsKKwljaGFyICpmb3VuZCA9IGZsYXZvdXJfbmFtZXNbc2JpLT5zX3R5cGVdOworCXVfY2hhciBuX2JpdHMgPSBzaXplKzg7CisJaW50IGJzaXplID0gMSA8PCBuX2JpdHM7CisJaW50IGJzaXplXzQgPSBic2l6ZSA+PiAyOworCisJc2JpLT5zX2ZpcnN0aW5vZGV6b25lID0gMjsKKworCWZsYXZvdXJfc2V0dXBbc2JpLT5zX3R5cGVdKHNiaSk7CisJCisJc2JpLT5zX3RydW5jYXRlID0gMTsKKwlzYmktPnNfbmRhdGF6b25lcyA9IHNiaS0+c19uem9uZXMgLSBzYmktPnNfZmlyc3RkYXRhem9uZTsKKwlzYmktPnNfaW5vZGVzX3Blcl9ibG9jayA9IGJzaXplID4+IDY7CisJc2JpLT5zX2lub2Rlc19wZXJfYmxvY2tfMSA9IChic2l6ZSA+PiA2KS0xOworCXNiaS0+c19pbm9kZXNfcGVyX2Jsb2NrX2JpdHMgPSBuX2JpdHMtNjsKKwlzYmktPnNfaW5kX3Blcl9ibG9jayA9IGJzaXplXzQ7CisJc2JpLT5zX2luZF9wZXJfYmxvY2tfMiA9IGJzaXplXzQqYnNpemVfNDsKKwlzYmktPnNfdG9vYmlnX2Jsb2NrID0gMTAgKyBic2l6ZV80ICogKDEgKyBic2l6ZV80ICogKDEgKyBic2l6ZV80KSk7CisJc2JpLT5zX2luZF9wZXJfYmxvY2tfYml0cyA9IG5fYml0cy0yOworCisJc2JpLT5zX25pbm9kZXMgPSAoc2JpLT5zX2ZpcnN0ZGF0YXpvbmUgLSBzYmktPnNfZmlyc3Rpbm9kZXpvbmUpCisJCTw8IHNiaS0+c19pbm9kZXNfcGVyX2Jsb2NrX2JpdHM7CisKKwlpZiAoIXNpbGVudCkKKwkJcHJpbnRrKCJWRlM6IEZvdW5kIGEgJXMgRlMgKGJsb2NrIHNpemUgPSAlbGQpIG9uIGRldmljZSAlc1xuIiwKKwkJICAgICAgIGZvdW5kLCBzYi0+c19ibG9ja3NpemUsIHNiLT5zX2lkKTsKKworCXNiLT5zX21hZ2ljID0gU1lTVl9NQUdJQ19CQVNFICsgc2JpLT5zX3R5cGU7CisJLyogc2V0IHVwIGVub3VnaCBzbyB0aGF0IGl0IGNhbiByZWFkIGFuIGlub2RlICovCisJc2ItPnNfb3AgPSAmc3lzdl9zb3BzOworCXJvb3RfaW5vZGUgPSBpZ2V0KHNiLFNZU1ZfUk9PVF9JTk8pOworCWlmICghcm9vdF9pbm9kZSB8fCBpc19iYWRfaW5vZGUocm9vdF9pbm9kZSkpIHsKKwkJcHJpbnRrKCJTeXNWIEZTOiBnZXQgcm9vdCBpbm9kZSBmYWlsZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJc2ItPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290X2lub2RlKTsKKwlpZiAoIXNiLT5zX3Jvb3QpIHsKKwkJaXB1dChyb290X2lub2RlKTsKKwkJcHJpbnRrKCJTeXNWIEZTOiBnZXQgcm9vdCBkZW50cnkgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChzYmktPnNfZm9yY2VkX3JvKQorCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CisJaWYgKHNiaS0+c190cnVuY2F0ZSkKKwkJc2ItPnNfcm9vdC0+ZF9vcCA9ICZzeXN2X2RlbnRyeV9vcGVyYXRpb25zOworCXNiLT5zX2RpcnQgPSAxOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHN5c3ZfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgxLCAqYmggPSBOVUxMOworCXN0cnVjdCBzeXN2X3NiX2luZm8gKnNiaTsKKwl1bnNpZ25lZCBsb25nIGJsb2NrbnI7CisJaW50IHNpemUgPSAwLCBpOworCQorCWlmICgxMDI0ICE9IHNpemVvZiAoc3RydWN0IHhlbml4X3N1cGVyX2Jsb2NrKSkKKwkJcGFuaWMoIlhlbml4IEZTOiBiYWQgc3VwZXJibG9jayBzaXplIik7CisJaWYgKDUxMiAhPSBzaXplb2YgKHN0cnVjdCBzeXN2NF9zdXBlcl9ibG9jaykpCisJCXBhbmljKCJTeXN0ZW1WIEZTOiBiYWQgc3VwZXJibG9jayBzaXplIik7CisJaWYgKDUxMiAhPSBzaXplb2YgKHN0cnVjdCBzeXN2Ml9zdXBlcl9ibG9jaykpCisJCXBhbmljKCJTeXN0ZW1WIEZTOiBiYWQgc3VwZXJibG9jayBzaXplIik7CisJaWYgKDUwMCAhPSBzaXplb2YgKHN0cnVjdCBjb2hfc3VwZXJfYmxvY2spKQorCQlwYW5pYygiQ29oZXJlbnQgRlM6IGJhZCBzdXBlcmJsb2NrIHNpemUiKTsKKwlpZiAoNjQgIT0gc2l6ZW9mIChzdHJ1Y3Qgc3lzdl9pbm9kZSkpCisJCXBhbmljKCJzeXN2IGZzOiBiYWQgaW5vZGUgc2l6ZSIpOworCisJc2JpID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHN5c3Zfc2JfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghc2JpKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoc2JpLCAwLCBzaXplb2Yoc3RydWN0IHN5c3Zfc2JfaW5mbykpOworCisJc2JpLT5zX3NiID0gc2I7CisJc2JpLT5zX2Jsb2NrX2Jhc2UgPSAwOworCXNiLT5zX2ZzX2luZm8gPSBzYmk7CisJCisJc2Jfc2V0X2Jsb2Nrc2l6ZShzYiwgQkxPQ0tfU0laRSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGZsYXZvdXJzKS9zaXplb2YoZmxhdm91cnNbMF0pICYmICFzaXplOyBpKyspIHsKKwkJYnJlbHNlKGJoKTsKKwkJYmggPSBzYl9icmVhZChzYiwgZmxhdm91cnNbaV0uYmxvY2spOworCQlpZiAoIWJoKQorCQkJY29udGludWU7CisJCXNpemUgPSBmbGF2b3Vyc1tpXS50ZXN0KFNZU1ZfU0Ioc2IpLCBiaCk7CisJfQorCisJaWYgKCFzaXplKQorCQlnb3RvIEV1bmtub3duOworCisJc3dpdGNoIChzaXplKSB7CisJCWNhc2UgMToKKwkJCWJsb2NrbnIgPSBiaC0+Yl9ibG9ja25yIDw8IDE7CisJCQlicmVsc2UoYmgpOworCQkJc2Jfc2V0X2Jsb2Nrc2l6ZShzYiwgNTEyKTsKKwkJCWJoMSA9IHNiX2JyZWFkKHNiLCBibG9ja25yKTsKKwkJCWJoID0gc2JfYnJlYWQoc2IsIGJsb2NrbnIgKyAxKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQliaDEgPSBiaDsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlibG9ja25yID0gYmgtPmJfYmxvY2tuciA+PiAxOworCQkJYnJlbHNlKGJoKTsKKwkJCXNiX3NldF9ibG9ja3NpemUoc2IsIDIwNDgpOworCQkJYmgxID0gYmggPSBzYl9icmVhZChzYiwgYmxvY2tucik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gRWJhZHNpemU7CisJfQorCisJaWYgKGJoICYmIGJoMSkgeworCQlzYmktPnNfYmgxID0gYmgxOworCQlzYmktPnNfYmgyID0gYmg7CisJCWlmIChjb21wbGV0ZV9yZWFkX3N1cGVyKHNiLCBzaWxlbnQsIHNpemUpKQorCQkJcmV0dXJuIDA7CisJfQorCisJYnJlbHNlKGJoMSk7CisJYnJlbHNlKGJoKTsKKwlzYl9zZXRfYmxvY2tzaXplKHNiLCBCTE9DS19TSVpFKTsKKwlwcmludGsoIm9sZGZzOiBjYW5ub3QgcmVhZCBzdXBlcmJsb2NrXG4iKTsKK2ZhaWxlZDoKKwlrZnJlZShzYmkpOworCXJldHVybiAtRUlOVkFMOworCitFdW5rbm93bjoKKwlicmVsc2UoYmgpOworCWlmICghc2lsZW50KQorCQlwcmludGsoIlZGUzogdW5hYmxlIHRvIGZpbmQgb2xkZnMgc3VwZXJibG9jayBvbiBkZXZpY2UgJXNcbiIsCisJCQlzYi0+c19pZCk7CisJZ290byBmYWlsZWQ7CitFYmFkc2l6ZToKKwlicmVsc2UoYmgpOworCWlmICghc2lsZW50KQorCQlwcmludGsoIlZGUzogb2xkZnM6IHVuc3VwcG9ydGVkIGJsb2NrIHNpemUgKCVkS2IpXG4iLAorCQkJMTw8KHNpemUtMikpOworCWdvdG8gZmFpbGVkOworfQorCitzdGF0aWMgaW50IHY3X2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3Qgc3lzdl9zYl9pbmZvICpzYmk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgKmJoMiA9IE5VTEw7CisJc3RydWN0IHY3X3N1cGVyX2Jsb2NrICp2N3NiOworCXN0cnVjdCBzeXN2X2lub2RlICp2N2k7CisKKwlpZiAoNDQwICE9IHNpemVvZiAoc3RydWN0IHY3X3N1cGVyX2Jsb2NrKSkKKwkJcGFuaWMoIlY3IEZTOiBiYWQgc3VwZXItYmxvY2sgc2l6ZSIpOworCWlmICg2NCAhPSBzaXplb2YgKHN0cnVjdCBzeXN2X2lub2RlKSkKKwkJcGFuaWMoInN5c3YgZnM6IGJhZCBpLW5vZGUgc2l6ZSIpOworCisJc2JpID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHN5c3Zfc2JfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghc2JpKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoc2JpLCAwLCBzaXplb2Yoc3RydWN0IHN5c3Zfc2JfaW5mbykpOworCisJc2JpLT5zX3NiID0gc2I7CisJc2JpLT5zX2Jsb2NrX2Jhc2UgPSAwOworCXNiaS0+c190eXBlID0gRlNUWVBFX1Y3OworCXNiaS0+c19ieXRlc2V4ID0gQllURVNFWF9QRFA7CisJc2ItPnNfZnNfaW5mbyA9IHNiaTsKKwkKKwlzYl9zZXRfYmxvY2tzaXplKHNiLCA1MTIpOworCisJaWYgKChiaCA9IHNiX2JyZWFkKHNiLCAxKSkgPT0gTlVMTCkgeworCQlpZiAoIXNpbGVudCkKKwkJCXByaW50aygiVkZTOiB1bmFibGUgdG8gcmVhZCBWNyBGUyBzdXBlcmJsb2NrIG9uICIKKwkJCSAgICAgICAiZGV2aWNlICVzLlxuIiwgc2ItPnNfaWQpOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwkvKiBwbGF1c2liaWxpdHkgY2hlY2sgb24gc3VwZXJibG9jayAqLworCXY3c2IgPSAoc3RydWN0IHY3X3N1cGVyX2Jsb2NrICopIGJoLT5iX2RhdGE7CisJaWYgKGZzMTZfdG9fY3B1KHNiaSwgdjdzYi0+c19uZnJlZSkgPiBWN19OSUNGUkVFIHx8CisJICAgIGZzMTZfdG9fY3B1KHNiaSwgdjdzYi0+c19uaW5vZGUpID4gVjdfTklDSU5PRCB8fAorCSAgICBmczMyX3RvX2NwdShzYmksIHY3c2ItPnNfdGltZSkgPT0gMCkKKwkJZ290byBmYWlsZWQ7CisKKwkvKiBwbGF1c2liaWxpdHkgY2hlY2sgb24gcm9vdCBpbm9kZTogaXQgaXMgYSBkaXJlY3RvcnksCisJICAgd2l0aCBhIG5vbnplcm8gc2l6ZSB0aGF0IGlzIGEgbXVsdGlwbGUgb2YgMTYgKi8KKwlpZiAoKGJoMiA9IHNiX2JyZWFkKHNiLCAyKSkgPT0gTlVMTCkKKwkJZ290byBmYWlsZWQ7CisJdjdpID0gKHN0cnVjdCBzeXN2X2lub2RlICopKGJoMi0+Yl9kYXRhICsgNjQpOworCWlmICgoZnMxNl90b19jcHUoc2JpLCB2N2ktPmlfbW9kZSkgJiB+MDc3NykgIT0gU19JRkRJUiB8fAorCSAgICAoZnMzMl90b19jcHUoc2JpLCB2N2ktPmlfc2l6ZSkgPT0gMCkgfHwKKwkgICAgKGZzMzJfdG9fY3B1KHNiaSwgdjdpLT5pX3NpemUpICYgMDE3KSAhPSAwKQorCQlnb3RvIGZhaWxlZDsKKwlicmVsc2UoYmgyKTsKKwliaDIgPSBOVUxMOworCisJc2JpLT5zX2JoMSA9IGJoOworCXNiaS0+c19iaDIgPSBiaDsKKwlpZiAoY29tcGxldGVfcmVhZF9zdXBlcihzYiwgc2lsZW50LCAxKSkKKwkJcmV0dXJuIDA7CisKK2ZhaWxlZDoKKwlicmVsc2UoYmgyKTsKKwlicmVsc2UoYmgpOworCWtmcmVlKHNiaSk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qIEV2ZXJ5IGtlcm5lbCBtb2R1bGUgY29udGFpbnMgc3R1ZmYgbGlrZSB0aGlzLiAqLworCitzdGF0aWMgc3RydWN0IHN1cGVyX2Jsb2NrICpzeXN2X2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoreworCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIHN5c3ZfZmlsbF9zdXBlcik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnY3X2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoreworCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIHY3X2ZpbGxfc3VwZXIpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgc3lzdl9mc190eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAic3lzdiIsCisJLmdldF9zYgkJPSBzeXN2X2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfYmxvY2tfc3VwZXIsCisJLmZzX2ZsYWdzCT0gRlNfUkVRVUlSRVNfREVWLAorfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHY3X2ZzX3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJ2NyIsCisJLmdldF9zYgkJPSB2N19nZXRfc2IsCisJLmtpbGxfc2IJPSBraWxsX2Jsb2NrX3N1cGVyLAorCS5mc19mbGFncwk9IEZTX1JFUVVJUkVTX0RFViwKK307CisKK2V4dGVybiBpbnQgc3lzdl9pbml0X2ljYWNoZSh2b2lkKSBfX2luaXQ7CitleHRlcm4gdm9pZCBzeXN2X2Rlc3Ryb3lfaWNhY2hlKHZvaWQpOworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3N5c3ZfZnModm9pZCkKK3sKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IHN5c3ZfaW5pdF9pY2FjaGUoKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCWVycm9yID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmc3lzdl9mc190eXBlKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZGVzdHJveV9pY2FjaGU7CisJZXJyb3IgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZ2N19mc190eXBlKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gdW5yZWdpc3RlcjsKKwlyZXR1cm4gMDsKKwordW5yZWdpc3RlcjoKKwl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnN5c3ZfZnNfdHlwZSk7CitkZXN0cm95X2ljYWNoZToKKwlzeXN2X2Rlc3Ryb3lfaWNhY2hlKCk7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9zeXN2X2ZzKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZzeXN2X2ZzX3R5cGUpOworCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmdjdfZnNfdHlwZSk7CisJc3lzdl9kZXN0cm95X2ljYWNoZSgpOworfQorCittb2R1bGVfaW5pdChpbml0X3N5c3ZfZnMpCittb2R1bGVfZXhpdChleGl0X3N5c3ZfZnMpCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9mcy9zeXN2L3N5bWxpbmsuYyBiL2ZzL3N5c3Yvc3ltbGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNjM3ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9zeXN2L3N5bWxpbmsuYwpAQCAtMCwwICsxLDIwIEBACisvKgorICogIGxpbnV4L2ZzL3N5c3Yvc3ltbGluay5jCisgKgorICogIEhhbmRsaW5nIG9mIFN5c3RlbSBWIGZpbGVzeXN0ZW0gZmFzdCBzeW1saW5rcyBleHRlbnNpb25zLgorICogIEF1ZyAyMDAxLCBDaHJpc3RvcGggSGVsbHdpZyAoaGNoQGluZnJhZGVhZC5vcmcpCisgKi8KKworI2luY2x1ZGUgInN5c3YuaCIKKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorCitzdGF0aWMgaW50IHN5c3ZfZm9sbG93X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwluZF9zZXRfbGluayhuZCwgKGNoYXIgKilTWVNWX0koZGVudHJ5LT5kX2lub2RlKS0+aV9kYXRhKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgc3lzdl9mYXN0X3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkucmVhZGxpbmsJPSBnZW5lcmljX3JlYWRsaW5rLAorCS5mb2xsb3dfbGluawk9IHN5c3ZfZm9sbG93X2xpbmssCit9OwpkaWZmIC0tZ2l0IGEvZnMvc3lzdi9zeXN2LmggYi9mcy9zeXN2L3N5c3YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2Y5YjRhCi0tLSAvZGV2L251bGwKKysrIGIvZnMvc3lzdi9zeXN2LmgKQEAgLTAsMCArMSwyNDQgQEAKKyNpZm5kZWYgX1NZU1ZfSAorI2RlZmluZSBfU1lTVl9ICisKKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorCit0eXBlZGVmIF9fdTE2IF9fYml0d2lzZSBfX2ZzMTY7Cit0eXBlZGVmIF9fdTMyIF9fYml0d2lzZSBfX2ZzMzI7CisKKyNpbmNsdWRlIDxsaW51eC9zeXN2X2ZzLmg+CisKKy8qCisgKiBTeXN0ZW1WL1Y3L0NvaGVyZW50IHN1cGVyLWJsb2NrIGRhdGEgaW4gbWVtb3J5CisgKgorICogVGhlIFN5c3RlbVYvVjcvQ29oZXJlbnQgc3VwZXJibG9jayBjb250YWlucyBkeW5hbWljIGRhdGEgKGl0IGdldHMgbW9kaWZpZWQKKyAqIHdoaWxlIHRoZSBzeXN0ZW0gaXMgcnVubmluZykuIFRoaXMgaXMgaW4gY29udHJhc3QgdG8gdGhlIE1pbml4IGFuZCBCZXJrZWxleQorICogZmlsZXN5c3RlbXMgKHdoZXJlIHRoZSBzdXBlcmJsb2NrIGlzIG5ldmVyIG1vZGlmaWVkKS4gVGhpcyBhZmZlY3RzIHRoZQorICogc3luYygpIG9wZXJhdGlvbjogd2UgbXVzdCBrZWVwIHRoZSBzdXBlcmJsb2NrIGluIGEgZGlzayBidWZmZXIgYW5kIHVzZSB0aGlzCisgKiBvbmUgYXMgb3VyICJ3b3JraW5nIGNvcHkiLgorICovCisKK3N0cnVjdCBzeXN2X3NiX2luZm8geworCXN0cnVjdCBzdXBlcl9ibG9jayAqc19zYjsJLyogVkZTIHN1cGVyYmxvY2sgKi8KKwlpbnQJICAgICAgIHNfdHlwZTsJCS8qIGZpbGUgc3lzdGVtIHR5cGU6IEZTVFlQRV97WEVOSVh8U1lTVnxDT0h9ICovCisJY2hhcgkgICAgICAgc19ieXRlc2V4OwkvKiBieXRlc2V4IChsZS9iZS9wZHApICovCisJY2hhcgkgICAgICAgc190cnVuY2F0ZTsJLyogaWYgMTogbmFtZXMgPiBTWVNWX05BTUVMRU4gY2hhcnMgYXJlIHRydW5jYXRlZCAqLworCQkJCQkvKiBpZiAwOiB0aGV5IGFyZSBkaXNhbGxvd2VkIChFTkFNRVRPT0xPTkcpICovCisJbmxpbmtfdCAgICAgICAgc19saW5rX21heDsJLyogbWF4IG51bWJlciBvZiBoYXJkIGxpbmtzIHRvIGEgZmlsZSAqLworCXVuc2lnbmVkIGludCAgIHNfaW5vZGVzX3Blcl9ibG9jazsJLyogbnVtYmVyIG9mIGlub2RlcyBwZXIgYmxvY2sgKi8KKwl1bnNpZ25lZCBpbnQgICBzX2lub2Rlc19wZXJfYmxvY2tfMTsJLyogaW5vZGVzX3Blcl9ibG9jayAtIDEgKi8KKwl1bnNpZ25lZCBpbnQgICBzX2lub2Rlc19wZXJfYmxvY2tfYml0czsJLyogbG9nMihpbm9kZXNfcGVyX2Jsb2NrKSAqLworCXVuc2lnbmVkIGludCAgIHNfaW5kX3Blcl9ibG9jazsJCS8qIG51bWJlciBvZiBpbmRpcmVjdGlvbnMgcGVyIGJsb2NrICovCisJdW5zaWduZWQgaW50ICAgc19pbmRfcGVyX2Jsb2NrX2JpdHM7CS8qIGxvZzIoaW5kX3Blcl9ibG9jaykgKi8KKwl1bnNpZ25lZCBpbnQgICBzX2luZF9wZXJfYmxvY2tfMjsJLyogaW5kX3Blcl9ibG9jayBeIDIgKi8KKwl1bnNpZ25lZCBpbnQgICBzX3Rvb2JpZ19ibG9jazsJCS8qIDEwICsgaXBiICsgaXBiXjIgKyBpcGJeMyAqLworCXVuc2lnbmVkIGludCAgIHNfYmxvY2tfYmFzZTsJLyogcGh5c2ljYWwgYmxvY2sgbnVtYmVyIG9mIGJsb2NrIDAgKi8KKwl1bnNpZ25lZCBzaG9ydCBzX2ZpY19zaXplOwkvKiBmcmVlIGlub2RlIGNhY2hlIHNpemUsIE5JQ0lOT0QgKi8KKwl1bnNpZ25lZCBzaG9ydCBzX2ZsY19zaXplOwkvKiBmcmVlIGJsb2NrIGxpc3QgY2h1bmsgc2l6ZSwgTklDRlJFRSAqLworCS8qIFRoZSBzdXBlcmJsb2NrIGlzIGtlcHQgaW4gb25lIG9yIHR3byBkaXNrIGJ1ZmZlcnM6ICovCisJc3RydWN0IGJ1ZmZlcl9oZWFkICpzX2JoMTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnNfYmgyOworCS8qIFRoZXNlIGFyZSBwb2ludGVycyBpbnRvIHRoZSBkaXNrIGJ1ZmZlciwgdG8gY29tcGVuc2F0ZSBmb3IKKwkgICBkaWZmZXJlbnQgc3VwZXJibG9jayBsYXlvdXQuICovCisJY2hhciAqICAgICAgICAgc19zYmQxOwkJLyogZW50aXJlIHN1cGVyYmxvY2sgZGF0YSwgZm9yIHBhcnQgMSAqLworCWNoYXIgKiAgICAgICAgIHNfc2JkMjsJCS8qIGVudGlyZSBzdXBlcmJsb2NrIGRhdGEsIGZvciBwYXJ0IDIgKi8KKwlfX2ZzMTYgICAgICAgICAqc19zYl9maWNfY291bnQ7CS8qIHBvaW50ZXIgdG8gc19zYmQtPnNfbmlub2RlICovCisgICAgICAgIHN5c3ZfaW5vX3QgICAgICpzX3NiX2ZpY19pbm9kZXM7IC8qIHBvaW50ZXIgdG8gc19zYmQtPnNfaW5vZGUgKi8KKwlfX2ZzMTYgICAgICAgICAqc19zYl90b3RhbF9mcmVlX2lub2RlczsgLyogcG9pbnRlciB0byBzX3NiZC0+c190aW5vZGUgKi8KKwlfX2ZzMTYgICAgICAgICAqc19iY2FjaGVfY291bnQ7CS8qIHBvaW50ZXIgdG8gc19zYmQtPnNfbmZyZWUgKi8KKwlzeXN2X3pvbmVfdCAgICAqc19iY2FjaGU7CS8qIHBvaW50ZXIgdG8gc19zYmQtPnNfZnJlZSAqLworCV9fZnMzMiAgICAgICAgICpzX2ZyZWVfYmxvY2tzOwkvKiBwb2ludGVyIHRvIHNfc2JkLT5zX3RmcmVlICovCisJX19mczMyICAgICAgICAgKnNfc2JfdGltZTsJLyogcG9pbnRlciB0byBzX3NiZC0+c190aW1lICovCisJX19mczMyICAgICAgICAgKnNfc2Jfc3RhdGU7CS8qIHBvaW50ZXIgdG8gc19zYmQtPnNfc3RhdGUsIG9ubHkgRlNUWVBFX1NZU1YgKi8KKwkvKiBXZSBrZWVwIHRob3NlIHN1cGVyYmxvY2sgZW50aXRpZXMgdGhhdCBkb24ndCBjaGFuZ2UgaGVyZTsKKwkgICB0aGlzIHNhdmVzIHVzIGFuIGluZGlyZWN0aW9uIGFuZCBwZXJoYXBzIGEgY29udmVyc2lvbi4gKi8KKwl1MzIgICAgICAgICAgICBzX2ZpcnN0aW5vZGV6b25lOyAvKiBpbmRleCBvZiBmaXJzdCBpbm9kZSB6b25lICovCisJdTMyICAgICAgICAgICAgc19maXJzdGRhdGF6b25lOwkvKiBzYW1lIGFzIHNfc2JkLT5zX2lzaXplICovCisJdTMyICAgICAgICAgICAgc19uaW5vZGVzOwkvKiB0b3RhbCBudW1iZXIgb2YgaW5vZGVzICovCisJdTMyICAgICAgICAgICAgc19uZGF0YXpvbmVzOwkvKiB0b3RhbCBudW1iZXIgb2YgZGF0YSB6b25lcyAqLworCXUzMiAgICAgICAgICAgIHNfbnpvbmVzOwkvKiBzYW1lIGFzIHNfc2JkLT5zX2ZzaXplICovCisJdTE2CSAgICAgICBzX25hbWVsZW47ICAgICAgIC8qIG1heCBsZW5ndGggb2YgZGlyIGVudHJ5ICovCisJaW50CSAgICAgICBzX2ZvcmNlZF9ybzsKK307CisKKy8qCisgKiBTeXN0ZW1WL1Y3L0NvaGVyZW50IEZTIGlub2RlIGRhdGEgaW4gbWVtb3J5CisgKi8KK3N0cnVjdCBzeXN2X2lub2RlX2luZm8geworCV9fZnMzMgkJaV9kYXRhWzEzXTsKKwl1MzIJCWlfZGlyX3N0YXJ0X2xvb2t1cDsKKwlzdHJ1Y3QgaW5vZGUJdmZzX2lub2RlOworfTsKKworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzeXN2X2lub2RlX2luZm8gKlNZU1ZfSShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXJldHVybiBsaXN0X2VudHJ5KGlub2RlLCBzdHJ1Y3Qgc3lzdl9pbm9kZV9pbmZvLCB2ZnNfaW5vZGUpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzeXN2X3NiX2luZm8gKlNZU1ZfU0Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlyZXR1cm4gc2ItPnNfZnNfaW5mbzsKK30KKworCisvKiBpZGVudGlmeSB0aGUgRlMgaW4gbWVtb3J5ICovCitlbnVtIHsKKwlGU1RZUEVfTk9ORSA9IDAsCisJRlNUWVBFX1hFTklYLAorCUZTVFlQRV9TWVNWNCwKKwlGU1RZUEVfU1lTVjIsCisJRlNUWVBFX0NPSCwKKwlGU1RZUEVfVjcsCisJRlNUWVBFX0FGUywKKwlGU1RZUEVfRU5ELAorfTsKKworI2RlZmluZSBTWVNWX01BR0lDX0JBU0UJCTB4MDEyRkY3QjMKKworI2RlZmluZSBYRU5JWF9TVVBFUl9NQUdJQwkoU1lTVl9NQUdJQ19CQVNFK0ZTVFlQRV9YRU5JWCkKKyNkZWZpbmUgU1lTVjRfU1VQRVJfTUFHSUMJKFNZU1ZfTUFHSUNfQkFTRStGU1RZUEVfU1lTVjQpCisjZGVmaW5lIFNZU1YyX1NVUEVSX01BR0lDCShTWVNWX01BR0lDX0JBU0UrRlNUWVBFX1NZU1YyKQorI2RlZmluZSBDT0hfU1VQRVJfTUFHSUMJCShTWVNWX01BR0lDX0JBU0UrRlNUWVBFX0NPSCkKKworCisvKiBBZG1pc3NpYmxlIHZhbHVlcyBmb3IgaV9ubGluazogMC4uX0xJTktfTUFYICovCitlbnVtIHsKKwlYRU5JWF9MSU5LX01BWAk9CTEyNiwJLyogPz8gKi8KKwlTWVNWX0xJTktfTUFYCT0JMTI2LAkvKiAxMjc/IDI1MT8gKi8KKwlWN19MSU5LX01BWCAgICAgPQkxMjYsCS8qID8/ICovCisJQ09IX0xJTktfTUFYCT0JMTAwMDAsCit9OworCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkaXJ0eV9zYihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCBzeXN2X3NiX2luZm8gKnNiaSA9IFNZU1ZfU0Ioc2IpOworCisJbWFya19idWZmZXJfZGlydHkoc2JpLT5zX2JoMSk7CisJaWYgKHNiaS0+c19iaDEgIT0gc2JpLT5zX2JoMikKKwkJbWFya19idWZmZXJfZGlydHkoc2JpLT5zX2JoMik7CisJc2ItPnNfZGlydCA9IDE7Cit9CisKKworLyogaWFsbG9jLmMgKi8KK2V4dGVybiBzdHJ1Y3Qgc3lzdl9pbm9kZSAqc3lzdl9yYXdfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICosIHVuc2lnbmVkLAorCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICoqKTsKK2V4dGVybiBzdHJ1Y3QgaW5vZGUgKiBzeXN2X25ld19pbm9kZShjb25zdCBzdHJ1Y3QgaW5vZGUgKiwgbW9kZV90KTsKK2V4dGVybiB2b2lkIHN5c3ZfZnJlZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gdW5zaWduZWQgbG9uZyBzeXN2X2NvdW50X2ZyZWVfaW5vZGVzKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKKworLyogYmFsbG9jLmMgKi8KK2V4dGVybiBzeXN2X3pvbmVfdCBzeXN2X25ld19ibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CitleHRlcm4gdm9pZCBzeXN2X2ZyZWVfYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICosIHN5c3Zfem9uZV90KTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHN5c3ZfY291bnRfZnJlZV9ibG9ja3Moc3RydWN0IHN1cGVyX2Jsb2NrICopOworCisvKiBpdHJlZS5jICovCitleHRlcm4gdm9pZCBzeXN2X3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqKTsKKworLyogaW5vZGUuYyAqLworZXh0ZXJuIGludCBzeXN2X3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqLCBpbnQpOworZXh0ZXJuIGludCBzeXN2X3N5bmNfaW5vZGUoc3RydWN0IGlub2RlICopOworZXh0ZXJuIGludCBzeXN2X3N5bmNfZmlsZShzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCk7CitleHRlcm4gdm9pZCBzeXN2X3NldF9pbm9kZShzdHJ1Y3QgaW5vZGUgKiwgZGV2X3QpOworZXh0ZXJuIGludCBzeXN2X2dldGF0dHIoc3RydWN0IHZmc21vdW50ICosIHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGtzdGF0ICopOworCisvKiBkaXIuYyAqLworZXh0ZXJuIHN0cnVjdCBzeXN2X2Rpcl9lbnRyeSAqc3lzdl9maW5kX2VudHJ5KHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IHBhZ2UgKiopOworZXh0ZXJuIGludCBzeXN2X2FkZF9saW5rKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGlub2RlICopOworZXh0ZXJuIGludCBzeXN2X2RlbGV0ZV9lbnRyeShzdHJ1Y3Qgc3lzdl9kaXJfZW50cnkgKiwgc3RydWN0IHBhZ2UgKik7CitleHRlcm4gaW50IHN5c3ZfbWFrZV9lbXB0eShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGlub2RlICopOworZXh0ZXJuIGludCBzeXN2X2VtcHR5X2RpcihzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gdm9pZCBzeXN2X3NldF9saW5rKHN0cnVjdCBzeXN2X2Rpcl9lbnRyeSAqLCBzdHJ1Y3QgcGFnZSAqLAorCQkJc3RydWN0IGlub2RlICopOworZXh0ZXJuIHN0cnVjdCBzeXN2X2Rpcl9lbnRyeSAqc3lzdl9kb3Rkb3Qoc3RydWN0IGlub2RlICosIHN0cnVjdCBwYWdlICoqKTsKK2V4dGVybiBpbm9fdCBzeXN2X2lub2RlX2J5X25hbWUoc3RydWN0IGRlbnRyeSAqKTsKKworCitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgc3lzdl9maWxlX2lub2RlX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgc3lzdl9kaXJfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBzeXN2X2Zhc3Rfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3lzdl9maWxlX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzeXN2X2Rpcl9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgc3lzdl9hb3BzOworZXh0ZXJuIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIHN5c3Zfc29wczsKK2V4dGVybiBzdHJ1Y3QgZGVudHJ5X29wZXJhdGlvbnMgc3lzdl9kZW50cnlfb3BlcmF0aW9uczsKKworCitlbnVtIHsKKwlCWVRFU0VYX0xFLAorCUJZVEVTRVhfUERQLAorCUJZVEVTRVhfQkUsCit9OworCitzdGF0aWMgaW5saW5lIHUzMiBQRFBfc3dhYih1MzIgeCkKK3sKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KKwlyZXR1cm4gKCh4ICYgMHhmZmZmKSA8PCAxNikgfCAoKHggJiAweGZmZmYwMDAwKSA+PiAxNik7CisjZWxzZQorI2lmZGVmIF9fQklHX0VORElBTgorCXJldHVybiAoKHggJiAweGZmMDBmZikgPDwgOCkgfCAoKHggJiAweGZmMDBmZjAwKSA+PiA4KTsKKyNlbHNlCisjZXJyb3IgQllURVNFWAorI2VuZGlmCisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSBfX3UzMiBmczMyX3RvX2NwdShzdHJ1Y3Qgc3lzdl9zYl9pbmZvICpzYmksIF9fZnMzMiBuKQoreworCWlmIChzYmktPnNfYnl0ZXNleCA9PSBCWVRFU0VYX1BEUCkKKwkJcmV0dXJuIFBEUF9zd2FiKChfX2ZvcmNlIF9fdTMyKW4pOworCWVsc2UgaWYgKHNiaS0+c19ieXRlc2V4ID09IEJZVEVTRVhfTEUpCisJCXJldHVybiBsZTMyX3RvX2NwdSgoX19mb3JjZSBfX2xlMzIpbik7CisJZWxzZQorCQlyZXR1cm4gYmUzMl90b19jcHUoKF9fZm9yY2UgX19iZTMyKW4pOworfQorCitzdGF0aWMgaW5saW5lIF9fZnMzMiBjcHVfdG9fZnMzMihzdHJ1Y3Qgc3lzdl9zYl9pbmZvICpzYmksIF9fdTMyIG4pCit7CisJaWYgKHNiaS0+c19ieXRlc2V4ID09IEJZVEVTRVhfUERQKQorCQlyZXR1cm4gKF9fZm9yY2UgX19mczMyKVBEUF9zd2FiKG4pOworCWVsc2UgaWYgKHNiaS0+c19ieXRlc2V4ID09IEJZVEVTRVhfTEUpCisJCXJldHVybiAoX19mb3JjZSBfX2ZzMzIpY3B1X3RvX2xlMzIobik7CisJZWxzZQorCQlyZXR1cm4gKF9fZm9yY2UgX19mczMyKWNwdV90b19iZTMyKG4pOworfQorCitzdGF0aWMgaW5saW5lIF9fZnMzMiBmczMyX2FkZChzdHJ1Y3Qgc3lzdl9zYl9pbmZvICpzYmksIF9fZnMzMiAqbiwgaW50IGQpCit7CisJaWYgKHNiaS0+c19ieXRlc2V4ID09IEJZVEVTRVhfUERQKQorCQkqKF9fdTMyKiluID0gUERQX3N3YWIoUERQX3N3YWIoKihfX3UzMiopbikrZCk7CisJZWxzZSBpZiAoc2JpLT5zX2J5dGVzZXggPT0gQllURVNFWF9MRSkKKwkJKihfX2xlMzIqKW4gPSBjcHVfdG9fbGUzMihsZTMyX3RvX2NwdSgqKF9fbGUzMiopbikrZCk7CisJZWxzZQorCQkqKF9fYmUzMiopbiA9IGNwdV90b19iZTMyKGJlMzJfdG9fY3B1KCooX19iZTMyKiluKStkKTsKKwlyZXR1cm4gKm47Cit9CisKK3N0YXRpYyBpbmxpbmUgX191MTYgZnMxNl90b19jcHUoc3RydWN0IHN5c3Zfc2JfaW5mbyAqc2JpLCBfX2ZzMTYgbikKK3sKKwlpZiAoc2JpLT5zX2J5dGVzZXggIT0gQllURVNFWF9CRSkKKwkJcmV0dXJuIGxlMTZfdG9fY3B1KChfX2ZvcmNlIF9fbGUxNiluKTsKKwllbHNlCisJCXJldHVybiBiZTE2X3RvX2NwdSgoX19mb3JjZSBfX2JlMTYpbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19mczE2IGNwdV90b19mczE2KHN0cnVjdCBzeXN2X3NiX2luZm8gKnNiaSwgX191MTYgbikKK3sKKwlpZiAoc2JpLT5zX2J5dGVzZXggIT0gQllURVNFWF9CRSkKKwkJcmV0dXJuIChfX2ZvcmNlIF9fZnMxNiljcHVfdG9fbGUxNihuKTsKKwllbHNlCisJCXJldHVybiAoX19mb3JjZSBfX2ZzMTYpY3B1X3RvX2JlMTYobik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19mczE2IGZzMTZfYWRkKHN0cnVjdCBzeXN2X3NiX2luZm8gKnNiaSwgX19mczE2ICpuLCBpbnQgZCkKK3sKKwlpZiAoc2JpLT5zX2J5dGVzZXggIT0gQllURVNFWF9CRSkKKwkJKihfX2xlMTYqKW4gPSBjcHVfdG9fbGUxNihsZTE2X3RvX2NwdSgqKF9fbGUxNiAqKW4pK2QpOworCWVsc2UKKwkJKihfX2JlMTYqKW4gPSBjcHVfdG9fYmUxNihiZTE2X3RvX2NwdSgqKF9fYmUxNiAqKW4pK2QpOworCXJldHVybiAqbjsKK30KKworI2VuZGlmIC8qIF9TWVNWX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL3VkZi9NYWtlZmlsZSBiL2ZzL3VkZi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTg0NWU3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvdWRmL01ha2VmaWxlCkBAIC0wLDAgKzEsOSBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IHVkZi1maWxlc3lzdGVtIHJvdXRpbmVzLgorIworCitvYmotJChDT05GSUdfVURGX0ZTKSArPSB1ZGYubworCit1ZGYtb2JqcyAgICAgOj0gYmFsbG9jLm8gZGlyLm8gZmlsZS5vIGlhbGxvYy5vIGlub2RlLm8gbG93bGV2ZWwubyBuYW1laS5vIFwKKwkJcGFydGl0aW9uLm8gc3VwZXIubyB0cnVuY2F0ZS5vIHN5bWxpbmsubyBmc3luYy5vIFwKKwkJY3JjLm8gZGlyZWN0b3J5Lm8gbWlzYy5vIHVkZnRpbWUubyB1bmljb2RlLm8KZGlmZiAtLWdpdCBhL2ZzL3VkZi9iYWxsb2MuYyBiL2ZzL3VkZi9iYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWRlZDI2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvdWRmL2JhbGxvYy5jCkBAIC0wLDAgKzEsOTU5IEBACisvKgorICogYmFsbG9jLmMKKyAqCisgKiBQVVJQT1NFCisgKglCbG9jayBhbGxvY2F0aW9uIGhhbmRsaW5nIHJvdXRpbmVzIGZvciB0aGUgT1NUQS1VREYodG0pIGZpbGVzeXN0ZW0uCisgKgorICogQ09OVEFDVFMKKyAqCUUtbWFpbCByZWdhcmRpbmcgYW55IHBvcnRpb24gb2YgdGhlIExpbnV4IFVERiBmaWxlIHN5c3RlbSBzaG91bGQgYmUKKyAqCWRpcmVjdGVkIHRvIHRoZSBkZXZlbG9wbWVudCB0ZWFtIG1haWxpbmcgbGlzdCAocnVuIGJ5IG1ham9yZG9tbyk6CisgKgkJbGludXhfdWRmQGhwZXNqcm8uZmMuaHAuY29tCisgKgorICogQ09QWVJJR0hUCisgKglUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgKEdQTCkuIENvcGllcyBvZiB0aGUgR1BMIGNhbiBiZSBvYnRhaW5lZCBmcm9tOgorICoJCWZ0cDovL3ByZXAuYWkubWl0LmVkdS9wdWIvZ251L0dQTAorICoJRWFjaCBjb250cmlidXRpbmcgYXV0aG9yIHJldGFpbnMgYWxsIHJpZ2h0cyB0byB0aGVpciBvd24gd29yay4KKyAqCisgKiAgKEMpIDE5OTktMjAwMSBCZW4gRmVubmVtYQorICogIChDKSAxOTk5IFN0ZWxpYXMgQ29tcHV0aW5nIEluYworICoKKyAqIEhJU1RPUlkKKyAqCisgKiAgMDIvMjQvOTkgYmxmICBDcmVhdGVkLgorICoKKyAqLworCisjaW5jbHVkZSAidWRmZGVjbC5oIgorCisjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSAidWRmX2kuaCIKKyNpbmNsdWRlICJ1ZGZfc2IuaCIKKworI2RlZmluZSB1ZGZfY2xlYXJfYml0KG5yLGFkZHIpIGV4dDJfY2xlYXJfYml0KG5yLGFkZHIpCisjZGVmaW5lIHVkZl9zZXRfYml0KG5yLGFkZHIpIGV4dDJfc2V0X2JpdChucixhZGRyKQorI2RlZmluZSB1ZGZfdGVzdF9iaXQobnIsIGFkZHIpIGV4dDJfdGVzdF9iaXQobnIsIGFkZHIpCisjZGVmaW5lIHVkZl9maW5kX2ZpcnN0X29uZV9iaXQoYWRkciwgc2l6ZSkgZmluZF9maXJzdF9vbmVfYml0KGFkZHIsIHNpemUpCisjZGVmaW5lIHVkZl9maW5kX25leHRfb25lX2JpdChhZGRyLCBzaXplLCBvZmZzZXQpIGZpbmRfbmV4dF9vbmVfYml0KGFkZHIsIHNpemUsIG9mZnNldCkKKworI2RlZmluZSBsZUJQTF90b19jcHVwKHgpIGxlTlVNX3RvX2NwdXAoQklUU19QRVJfTE9ORywgeCkKKyNkZWZpbmUgbGVOVU1fdG9fY3B1cCh4LHkpIHhsZU5VTV90b19jcHVwKHgseSkKKyNkZWZpbmUgeGxlTlVNX3RvX2NwdXAoeCx5KSAobGUgIyMgeCAjIyBfdG9fY3B1cCh5KSkKKyNkZWZpbmUgdWludEJQTF90IHVpbnQoQklUU19QRVJfTE9ORykKKyNkZWZpbmUgdWludCh4KSB4dWludCh4KQorI2RlZmluZSB4dWludCh4KSBfX2xlICMjIHgKKworZXh0ZXJuIGlubGluZSBpbnQgZmluZF9uZXh0X29uZV9iaXQgKHZvaWQgKiBhZGRyLCBpbnQgc2l6ZSwgaW50IG9mZnNldCkKK3sKKwl1aW50QlBMX3QgKiBwID0gKCh1aW50QlBMX3QgKikgYWRkcikgKyAob2Zmc2V0IC8gQklUU19QRVJfTE9ORyk7CisJaW50IHJlc3VsdCA9IG9mZnNldCAmIH4oQklUU19QRVJfTE9ORy0xKTsKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCWlmIChvZmZzZXQgPj0gc2l6ZSkKKwkJcmV0dXJuIHNpemU7CisJc2l6ZSAtPSByZXN1bHQ7CisJb2Zmc2V0ICY9IChCSVRTX1BFUl9MT05HLTEpOworCWlmIChvZmZzZXQpCisJeworCQl0bXAgPSBsZUJQTF90b19jcHVwKHArKyk7CisJCXRtcCAmPSB+MFVMIDw8IG9mZnNldDsKKwkJaWYgKHNpemUgPCBCSVRTX1BFUl9MT05HKQorCQkJZ290byBmb3VuZF9maXJzdDsKKwkJaWYgKHRtcCkKKwkJCWdvdG8gZm91bmRfbWlkZGxlOworCQlzaXplIC09IEJJVFNfUEVSX0xPTkc7CisJCXJlc3VsdCArPSBCSVRTX1BFUl9MT05HOworCX0KKwl3aGlsZSAoc2l6ZSAmIH4oQklUU19QRVJfTE9ORy0xKSkKKwl7CisJCWlmICgodG1wID0gbGVCUExfdG9fY3B1cChwKyspKSkKKwkJCWdvdG8gZm91bmRfbWlkZGxlOworCQlyZXN1bHQgKz0gQklUU19QRVJfTE9ORzsKKwkJc2l6ZSAtPSBCSVRTX1BFUl9MT05HOworCX0KKwlpZiAoIXNpemUpCisJCXJldHVybiByZXN1bHQ7CisJdG1wID0gbGVCUExfdG9fY3B1cChwKTsKK2ZvdW5kX2ZpcnN0OgorCXRtcCAmPSB+MFVMID4+IChCSVRTX1BFUl9MT05HLXNpemUpOworZm91bmRfbWlkZGxlOgorCXJldHVybiByZXN1bHQgKyBmZnoofnRtcCk7Cit9CisKKyNkZWZpbmUgZmluZF9maXJzdF9vbmVfYml0KGFkZHIsIHNpemUpXAorCWZpbmRfbmV4dF9vbmVfYml0KChhZGRyKSwgKHNpemUpLCAwKQorCitzdGF0aWMgaW50IHJlYWRfYmxvY2tfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLAorCXN0cnVjdCB1ZGZfYml0bWFwICpiaXRtYXAsIHVuc2lnbmVkIGludCBibG9jaywgdW5zaWduZWQgbG9uZyBiaXRtYXBfbnIpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJaW50IHJldHZhbCA9IDA7CisJa2VybmVsX2xiX2FkZHIgbG9jOworCisJbG9jLmxvZ2ljYWxCbG9ja051bSA9IGJpdG1hcC0+c19leHRQb3NpdGlvbjsKKwlsb2MucGFydGl0aW9uUmVmZXJlbmNlTnVtID0gVURGX1NCX1BBUlRJVElPTihzYik7CisKKwliaCA9IHVkZl90cmVhZChzYiwgdWRmX2dldF9sYl9wYmxvY2soc2IsIGxvYywgYmxvY2spKTsKKwlpZiAoIWJoKQorCXsKKwkJcmV0dmFsID0gLUVJTzsKKwl9CisJYml0bWFwLT5zX2Jsb2NrX2JpdG1hcFtiaXRtYXBfbnJdID0gYmg7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBfX2xvYWRfYmxvY2tfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLAorCXN0cnVjdCB1ZGZfYml0bWFwICpiaXRtYXAsIHVuc2lnbmVkIGludCBibG9ja19ncm91cCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlpbnQgbnJfZ3JvdXBzID0gYml0bWFwLT5zX25yX2dyb3VwczsKKworCWlmIChibG9ja19ncm91cCA+PSBucl9ncm91cHMpCisJeworCQl1ZGZfZGVidWcoImJsb2NrX2dyb3VwICglZCkgPiBucl9ncm91cHMgKCVkKVxuIiwgYmxvY2tfZ3JvdXAsIG5yX2dyb3Vwcyk7CisJfQorCisJaWYgKGJpdG1hcC0+c19ibG9ja19iaXRtYXBbYmxvY2tfZ3JvdXBdKQorCQlyZXR1cm4gYmxvY2tfZ3JvdXA7CisJZWxzZQorCXsKKwkJcmV0dmFsID0gcmVhZF9ibG9ja19iaXRtYXAoc2IsIGJpdG1hcCwgYmxvY2tfZ3JvdXAsIGJsb2NrX2dyb3VwKTsKKwkJaWYgKHJldHZhbCA8IDApCisJCQlyZXR1cm4gcmV0dmFsOworCQlyZXR1cm4gYmxvY2tfZ3JvdXA7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCBsb2FkX2Jsb2NrX2JpdG1hcChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwlzdHJ1Y3QgdWRmX2JpdG1hcCAqYml0bWFwLCB1bnNpZ25lZCBpbnQgYmxvY2tfZ3JvdXApCit7CisJaW50IHNsb3Q7CisKKwlzbG90ID0gX19sb2FkX2Jsb2NrX2JpdG1hcChzYiwgYml0bWFwLCBibG9ja19ncm91cCk7CisKKwlpZiAoc2xvdCA8IDApCisJCXJldHVybiBzbG90OworCisJaWYgKCFiaXRtYXAtPnNfYmxvY2tfYml0bWFwW3Nsb3RdKQorCQlyZXR1cm4gLUVJTzsKKworCXJldHVybiBzbG90OworfQorCitzdGF0aWMgdm9pZCB1ZGZfYml0bWFwX2ZyZWVfYmxvY2tzKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLAorCXN0cnVjdCBpbm9kZSAqIGlub2RlLAorCXN0cnVjdCB1ZGZfYml0bWFwICpiaXRtYXAsCisJa2VybmVsX2xiX2FkZHIgYmxvYywgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgdWRmX3NiX2luZm8gKnNiaSA9IFVERl9TQihzYik7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmggPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgYmxvY2s7CisJdW5zaWduZWQgbG9uZyBibG9ja19ncm91cDsKKwl1bnNpZ25lZCBsb25nIGJpdDsKKwl1bnNpZ25lZCBsb25nIGk7CisJaW50IGJpdG1hcF9ucjsKKwl1bnNpZ25lZCBsb25nIG92ZXJmbG93OworCisJZG93bigmc2JpLT5zX2FsbG9jX3NlbSk7CisJaWYgKGJsb2MubG9naWNhbEJsb2NrTnVtIDwgMCB8fAorCQkoYmxvYy5sb2dpY2FsQmxvY2tOdW0gKyBjb3VudCkgPiBVREZfU0JfUEFSVExFTihzYiwgYmxvYy5wYXJ0aXRpb25SZWZlcmVuY2VOdW0pKQorCXsKKwkJdWRmX2RlYnVnKCIlZCA8ICVkIHx8ICVkICsgJWQgPiAlZFxuIiwKKwkJCWJsb2MubG9naWNhbEJsb2NrTnVtLCAwLCBibG9jLmxvZ2ljYWxCbG9ja051bSwgY291bnQsCisJCQlVREZfU0JfUEFSVExFTihzYiwgYmxvYy5wYXJ0aXRpb25SZWZlcmVuY2VOdW0pKTsKKwkJZ290byBlcnJvcl9yZXR1cm47CisJfQorCisJYmxvY2sgPSBibG9jLmxvZ2ljYWxCbG9ja051bSArIG9mZnNldCArIChzaXplb2Yoc3RydWN0IHNwYWNlQml0bWFwRGVzYykgPDwgMyk7CisKK2RvX21vcmU6CisJb3ZlcmZsb3cgPSAwOworCWJsb2NrX2dyb3VwID0gYmxvY2sgPj4gKHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzICsgMyk7CisJYml0ID0gYmxvY2sgJSAoc2ItPnNfYmxvY2tzaXplIDw8IDMpOworCisJLyoKKwkgKiBDaGVjayB0byBzZWUgaWYgd2UgYXJlIGZyZWVpbmcgYmxvY2tzIGFjcm9zcyBhIGdyb3VwIGJvdW5kYXJ5LgorCSAqLworCWlmIChiaXQgKyBjb3VudCA+IChzYi0+c19ibG9ja3NpemUgPDwgMykpCisJeworCQlvdmVyZmxvdyA9IGJpdCArIGNvdW50IC0gKHNiLT5zX2Jsb2Nrc2l6ZSA8PCAzKTsKKwkJY291bnQgLT0gb3ZlcmZsb3c7CisJfQorCWJpdG1hcF9uciA9IGxvYWRfYmxvY2tfYml0bWFwKHNiLCBiaXRtYXAsIGJsb2NrX2dyb3VwKTsKKwlpZiAoYml0bWFwX25yIDwgMCkKKwkJZ290byBlcnJvcl9yZXR1cm47CisKKwliaCA9IGJpdG1hcC0+c19ibG9ja19iaXRtYXBbYml0bWFwX25yXTsKKwlmb3IgKGk9MDsgaSA8IGNvdW50OyBpKyspCisJeworCQlpZiAodWRmX3NldF9iaXQoYml0ICsgaSwgYmgtPmJfZGF0YSkpCisJCXsKKwkJCXVkZl9kZWJ1ZygiYml0ICVsZCBhbHJlYWR5IHNldFxuIiwgYml0ICsgaSk7CisJCQl1ZGZfZGVidWcoImJ5dGU9JTJ4XG4iLCAoKGNoYXIgKiliaC0+Yl9kYXRhKVsoYml0ICsgaSkgPj4gM10pOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKGlub2RlKQorCQkJCURRVU9UX0ZSRUVfQkxPQ0soaW5vZGUsIDEpOworCQkJaWYgKFVERl9TQl9MVklEQkgoc2IpKQorCQkJeworCQkJCVVERl9TQl9MVklEKHNiKS0+ZnJlZVNwYWNlVGFibGVbVURGX1NCX1BBUlRJVElPTihzYildID0KKwkJCQkJY3B1X3RvX2xlMzIobGUzMl90b19jcHUoVURGX1NCX0xWSUQoc2IpLT5mcmVlU3BhY2VUYWJsZVtVREZfU0JfUEFSVElUSU9OKHNiKV0pKzEpOworCQkJfQorCQl9CisJfQorCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwlpZiAob3ZlcmZsb3cpCisJeworCQlibG9jayArPSBjb3VudDsKKwkJY291bnQgPSBvdmVyZmxvdzsKKwkJZ290byBkb19tb3JlOworCX0KK2Vycm9yX3JldHVybjoKKwlzYi0+c19kaXJ0ID0gMTsKKwlpZiAoVURGX1NCX0xWSURCSChzYikpCisJCW1hcmtfYnVmZmVyX2RpcnR5KFVERl9TQl9MVklEQkgoc2IpKTsKKwl1cCgmc2JpLT5zX2FsbG9jX3NlbSk7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IHVkZl9iaXRtYXBfcHJlYWxsb2NfYmxvY2tzKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLAorCXN0cnVjdCBpbm9kZSAqIGlub2RlLAorCXN0cnVjdCB1ZGZfYml0bWFwICpiaXRtYXAsIHVpbnQxNl90IHBhcnRpdGlvbiwgdWludDMyX3QgZmlyc3RfYmxvY2ssCisJdWludDMyX3QgYmxvY2tfY291bnQpCit7CisJc3RydWN0IHVkZl9zYl9pbmZvICpzYmkgPSBVREZfU0Ioc2IpOworCWludCBhbGxvY19jb3VudCA9IDA7CisJaW50IGJpdCwgYmxvY2ssIGJsb2NrX2dyb3VwLCBncm91cF9zdGFydDsKKwlpbnQgbnJfZ3JvdXBzLCBiaXRtYXBfbnI7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCWRvd24oJnNiaS0+c19hbGxvY19zZW0pOworCWlmIChmaXJzdF9ibG9jayA8IDAgfHwgZmlyc3RfYmxvY2sgPj0gVURGX1NCX1BBUlRMRU4oc2IsIHBhcnRpdGlvbikpCisJCWdvdG8gb3V0OworCisJaWYgKGZpcnN0X2Jsb2NrICsgYmxvY2tfY291bnQgPiBVREZfU0JfUEFSVExFTihzYiwgcGFydGl0aW9uKSkKKwkJYmxvY2tfY291bnQgPSBVREZfU0JfUEFSVExFTihzYiwgcGFydGl0aW9uKSAtIGZpcnN0X2Jsb2NrOworCityZXBlYXQ6CisJbnJfZ3JvdXBzID0gKFVERl9TQl9QQVJUTEVOKHNiLCBwYXJ0aXRpb24pICsKKwkJKHNpemVvZihzdHJ1Y3Qgc3BhY2VCaXRtYXBEZXNjKSA8PCAzKSArIChzYi0+c19ibG9ja3NpemUgKiA4KSAtIDEpIC8gKHNiLT5zX2Jsb2Nrc2l6ZSAqIDgpOworCWJsb2NrID0gZmlyc3RfYmxvY2sgKyAoc2l6ZW9mKHN0cnVjdCBzcGFjZUJpdG1hcERlc2MpIDw8IDMpOworCWJsb2NrX2dyb3VwID0gYmxvY2sgPj4gKHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzICsgMyk7CisJZ3JvdXBfc3RhcnQgPSBibG9ja19ncm91cCA/IDAgOiBzaXplb2Yoc3RydWN0IHNwYWNlQml0bWFwRGVzYyk7CisKKwliaXRtYXBfbnIgPSBsb2FkX2Jsb2NrX2JpdG1hcChzYiwgYml0bWFwLCBibG9ja19ncm91cCk7CisJaWYgKGJpdG1hcF9uciA8IDApCisJCWdvdG8gb3V0OworCWJoID0gYml0bWFwLT5zX2Jsb2NrX2JpdG1hcFtiaXRtYXBfbnJdOworCisJYml0ID0gYmxvY2sgJSAoc2ItPnNfYmxvY2tzaXplIDw8IDMpOworCisJd2hpbGUgKGJpdCA8IChzYi0+c19ibG9ja3NpemUgPDwgMykgJiYgYmxvY2tfY291bnQgPiAwKQorCXsKKwkJaWYgKCF1ZGZfdGVzdF9iaXQoYml0LCBiaC0+Yl9kYXRhKSkKKwkJCWdvdG8gb3V0OworCQllbHNlIGlmIChEUVVPVF9QUkVBTExPQ19CTE9DSyhpbm9kZSwgMSkpCisJCQlnb3RvIG91dDsKKwkJZWxzZSBpZiAoIXVkZl9jbGVhcl9iaXQoYml0LCBiaC0+Yl9kYXRhKSkKKwkJeworCQkJdWRmX2RlYnVnKCJiaXQgYWxyZWFkeSBjbGVhcmVkIGZvciBibG9jayAlZFxuIiwgYml0KTsKKwkJCURRVU9UX0ZSRUVfQkxPQ0soaW5vZGUsIDEpOworCQkJZ290byBvdXQ7CisJCX0KKwkJYmxvY2tfY291bnQgLS07CisJCWFsbG9jX2NvdW50ICsrOworCQliaXQgKys7CisJCWJsb2NrICsrOworCX0KKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJaWYgKGJsb2NrX2NvdW50ID4gMCkKKwkJZ290byByZXBlYXQ7CitvdXQ6CisJaWYgKFVERl9TQl9MVklEQkgoc2IpKQorCXsKKwkJVURGX1NCX0xWSUQoc2IpLT5mcmVlU3BhY2VUYWJsZVtwYXJ0aXRpb25dID0KKwkJCWNwdV90b19sZTMyKGxlMzJfdG9fY3B1KFVERl9TQl9MVklEKHNiKS0+ZnJlZVNwYWNlVGFibGVbcGFydGl0aW9uXSktYWxsb2NfY291bnQpOworCQltYXJrX2J1ZmZlcl9kaXJ0eShVREZfU0JfTFZJREJIKHNiKSk7CisJfQorCXNiLT5zX2RpcnQgPSAxOworCXVwKCZzYmktPnNfYWxsb2Nfc2VtKTsKKwlyZXR1cm4gYWxsb2NfY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgdWRmX2JpdG1hcF9uZXdfYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsCisJc3RydWN0IGlub2RlICogaW5vZGUsCisJc3RydWN0IHVkZl9iaXRtYXAgKmJpdG1hcCwgdWludDE2X3QgcGFydGl0aW9uLCB1aW50MzJfdCBnb2FsLCBpbnQgKmVycikKK3sKKwlzdHJ1Y3QgdWRmX3NiX2luZm8gKnNiaSA9IFVERl9TQihzYik7CisJaW50IG5ld2JpdCwgYml0PTAsIGJsb2NrLCBibG9ja19ncm91cCwgZ3JvdXBfc3RhcnQ7CisJaW50IGVuZF9nb2FsLCBucl9ncm91cHMsIGJpdG1hcF9uciwgaTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwljaGFyICpwdHI7CisJaW50IG5ld2Jsb2NrID0gMDsKKworCSplcnIgPSAtRU5PU1BDOworCWRvd24oJnNiaS0+c19hbGxvY19zZW0pOworCityZXBlYXQ6CisJaWYgKGdvYWwgPCAwIHx8IGdvYWwgPj0gVURGX1NCX1BBUlRMRU4oc2IsIHBhcnRpdGlvbikpCisJCWdvYWwgPSAwOworCisJbnJfZ3JvdXBzID0gYml0bWFwLT5zX25yX2dyb3VwczsKKwlibG9jayA9IGdvYWwgKyAoc2l6ZW9mKHN0cnVjdCBzcGFjZUJpdG1hcERlc2MpIDw8IDMpOworCWJsb2NrX2dyb3VwID0gYmxvY2sgPj4gKHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzICsgMyk7CisJZ3JvdXBfc3RhcnQgPSBibG9ja19ncm91cCA/IDAgOiBzaXplb2Yoc3RydWN0IHNwYWNlQml0bWFwRGVzYyk7CisKKwliaXRtYXBfbnIgPSBsb2FkX2Jsb2NrX2JpdG1hcChzYiwgYml0bWFwLCBibG9ja19ncm91cCk7CisJaWYgKGJpdG1hcF9uciA8IDApCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCWJoID0gYml0bWFwLT5zX2Jsb2NrX2JpdG1hcFtiaXRtYXBfbnJdOworCXB0ciA9IG1lbXNjYW4oKGNoYXIgKiliaC0+Yl9kYXRhICsgZ3JvdXBfc3RhcnQsIDB4RkYsIHNiLT5zX2Jsb2Nrc2l6ZSAtIGdyb3VwX3N0YXJ0KTsKKworCWlmICgocHRyIC0gKChjaGFyICopYmgtPmJfZGF0YSkpIDwgc2ItPnNfYmxvY2tzaXplKQorCXsKKwkJYml0ID0gYmxvY2sgJSAoc2ItPnNfYmxvY2tzaXplIDw8IDMpOworCisJCWlmICh1ZGZfdGVzdF9iaXQoYml0LCBiaC0+Yl9kYXRhKSkKKwkJeworCQkJZ290byBnb3RfYmxvY2s7CisJCX0KKwkJZW5kX2dvYWwgPSAoYml0ICsgNjMpICYgfjYzOworCQliaXQgPSB1ZGZfZmluZF9uZXh0X29uZV9iaXQoYmgtPmJfZGF0YSwgZW5kX2dvYWwsIGJpdCk7CisJCWlmIChiaXQgPCBlbmRfZ29hbCkKKwkJCWdvdG8gZ290X2Jsb2NrOworCQlwdHIgPSBtZW1zY2FuKChjaGFyICopYmgtPmJfZGF0YSArIChiaXQgPj4gMyksIDB4RkYsIHNiLT5zX2Jsb2Nrc2l6ZSAtICgoYml0ICsgNykgPj4gMykpOworCQluZXdiaXQgPSAocHRyIC0gKChjaGFyICopYmgtPmJfZGF0YSkpIDw8IDM7CisJCWlmIChuZXdiaXQgPCBzYi0+c19ibG9ja3NpemUgPDwgMykKKwkJeworCQkJYml0ID0gbmV3Yml0OworCQkJZ290byBzZWFyY2hfYmFjazsKKwkJfQorCQluZXdiaXQgPSB1ZGZfZmluZF9uZXh0X29uZV9iaXQoYmgtPmJfZGF0YSwgc2ItPnNfYmxvY2tzaXplIDw8IDMsIGJpdCk7CisJCWlmIChuZXdiaXQgPCBzYi0+c19ibG9ja3NpemUgPDwgMykKKwkJeworCQkJYml0ID0gbmV3Yml0OworCQkJZ290byBnb3RfYmxvY2s7CisJCX0KKwl9CisKKwlmb3IgKGk9MDsgaTwobnJfZ3JvdXBzKjIpOyBpKyspCisJeworCQlibG9ja19ncm91cCArKzsKKwkJaWYgKGJsb2NrX2dyb3VwID49IG5yX2dyb3VwcykKKwkJCWJsb2NrX2dyb3VwID0gMDsKKwkJZ3JvdXBfc3RhcnQgPSBibG9ja19ncm91cCA/IDAgOiBzaXplb2Yoc3RydWN0IHNwYWNlQml0bWFwRGVzYyk7CisKKwkJYml0bWFwX25yID0gbG9hZF9ibG9ja19iaXRtYXAoc2IsIGJpdG1hcCwgYmxvY2tfZ3JvdXApOworCQlpZiAoYml0bWFwX25yIDwgMCkKKwkJCWdvdG8gZXJyb3JfcmV0dXJuOworCQliaCA9IGJpdG1hcC0+c19ibG9ja19iaXRtYXBbYml0bWFwX25yXTsKKwkJaWYgKGkgPCBucl9ncm91cHMpCisJCXsKKwkJCXB0ciA9IG1lbXNjYW4oKGNoYXIgKiliaC0+Yl9kYXRhICsgZ3JvdXBfc3RhcnQsIDB4RkYsIHNiLT5zX2Jsb2Nrc2l6ZSAtIGdyb3VwX3N0YXJ0KTsKKwkJCWlmICgocHRyIC0gKChjaGFyICopYmgtPmJfZGF0YSkpIDwgc2ItPnNfYmxvY2tzaXplKQorCQkJeworCQkJCWJpdCA9IChwdHIgLSAoKGNoYXIgKiliaC0+Yl9kYXRhKSkgPDwgMzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWJpdCA9IHVkZl9maW5kX25leHRfb25lX2JpdCgoY2hhciAqKWJoLT5iX2RhdGEsIHNiLT5zX2Jsb2Nrc2l6ZSA8PCAzLCBncm91cF9zdGFydCA8PCAzKTsKKwkJCWlmIChiaXQgPCBzYi0+c19ibG9ja3NpemUgPDwgMykKKwkJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoaSA+PSAobnJfZ3JvdXBzKjIpKQorCXsKKwkJdXAoJnNiaS0+c19hbGxvY19zZW0pOworCQlyZXR1cm4gbmV3YmxvY2s7CisJfQorCWlmIChiaXQgPCBzYi0+c19ibG9ja3NpemUgPDwgMykKKwkJZ290byBzZWFyY2hfYmFjazsKKwllbHNlCisJCWJpdCA9IHVkZl9maW5kX25leHRfb25lX2JpdChiaC0+Yl9kYXRhLCBzYi0+c19ibG9ja3NpemUgPDwgMywgZ3JvdXBfc3RhcnQgPDwgMyk7CisJaWYgKGJpdCA+PSBzYi0+c19ibG9ja3NpemUgPDwgMykKKwl7CisJCXVwKCZzYmktPnNfYWxsb2Nfc2VtKTsKKwkJcmV0dXJuIDA7CisJfQorCitzZWFyY2hfYmFjazoKKwlmb3IgKGk9MDsgaTw3ICYmIGJpdCA+IChncm91cF9zdGFydCA8PCAzKSAmJiB1ZGZfdGVzdF9iaXQoYml0IC0gMSwgYmgtPmJfZGF0YSk7IGkrKywgYml0LS0pOworCitnb3RfYmxvY2s6CisKKwkvKgorCSAqIENoZWNrIHF1b3RhIGZvciBhbGxvY2F0aW9uIG9mIHRoaXMgYmxvY2suCisJICovCisJaWYgKGlub2RlICYmIERRVU9UX0FMTE9DX0JMT0NLKGlub2RlLCAxKSkKKwl7CisJCXVwKCZzYmktPnNfYWxsb2Nfc2VtKTsKKwkJKmVyciA9IC1FRFFVT1Q7CisJCXJldHVybiAwOworCX0KKworCW5ld2Jsb2NrID0gYml0ICsgKGJsb2NrX2dyb3VwIDw8IChzYi0+c19ibG9ja3NpemVfYml0cyArIDMpKSAtCisJCShzaXplb2Yoc3RydWN0IHNwYWNlQml0bWFwRGVzYykgPDwgMyk7CisKKwlpZiAoIXVkZl9jbGVhcl9iaXQoYml0LCBiaC0+Yl9kYXRhKSkKKwl7CisJCXVkZl9kZWJ1ZygiYml0IGFscmVhZHkgY2xlYXJlZCBmb3IgYmxvY2sgJWRcbiIsIGJpdCk7CisJCWdvdG8gcmVwZWF0OworCX0KKworCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKworCWlmIChVREZfU0JfTFZJREJIKHNiKSkKKwl7CisJCVVERl9TQl9MVklEKHNiKS0+ZnJlZVNwYWNlVGFibGVbcGFydGl0aW9uXSA9CisJCQljcHVfdG9fbGUzMihsZTMyX3RvX2NwdShVREZfU0JfTFZJRChzYiktPmZyZWVTcGFjZVRhYmxlW3BhcnRpdGlvbl0pLTEpOworCQltYXJrX2J1ZmZlcl9kaXJ0eShVREZfU0JfTFZJREJIKHNiKSk7CisJfQorCXNiLT5zX2RpcnQgPSAxOworCXVwKCZzYmktPnNfYWxsb2Nfc2VtKTsKKwkqZXJyID0gMDsKKwlyZXR1cm4gbmV3YmxvY2s7CisKK2Vycm9yX3JldHVybjoKKwkqZXJyID0gLUVJTzsKKwl1cCgmc2JpLT5zX2FsbG9jX3NlbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVkZl90YWJsZV9mcmVlX2Jsb2NrcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwKKwlzdHJ1Y3QgaW5vZGUgKiB0YWJsZSwKKwlrZXJuZWxfbGJfYWRkciBibG9jLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IGNvdW50KQoreworCXN0cnVjdCB1ZGZfc2JfaW5mbyAqc2JpID0gVURGX1NCKHNiKTsKKwl1aW50MzJfdCBzdGFydCwgZW5kOworCXVpbnQzMl90IG5leHRvZmZzZXQsIG9leHRvZmZzZXQsIGVsZW47CisJa2VybmVsX2xiX2FkZHIgbmJsb2MsIG9ibG9jLCBlbG9jOworCXN0cnVjdCBidWZmZXJfaGVhZCAqb2JoLCAqbmJoOworCWludDhfdCBldHlwZTsKKwlpbnQgaTsKKworCWRvd24oJnNiaS0+c19hbGxvY19zZW0pOworCWlmIChibG9jLmxvZ2ljYWxCbG9ja051bSA8IDAgfHwKKwkJKGJsb2MubG9naWNhbEJsb2NrTnVtICsgY291bnQpID4gVURGX1NCX1BBUlRMRU4oc2IsIGJsb2MucGFydGl0aW9uUmVmZXJlbmNlTnVtKSkKKwl7CisJCXVkZl9kZWJ1ZygiJWQgPCAlZCB8fCAlZCArICVkID4gJWRcbiIsCisJCQlibG9jLmxvZ2ljYWxCbG9ja051bSwgMCwgYmxvYy5sb2dpY2FsQmxvY2tOdW0sIGNvdW50LAorCQkJVURGX1NCX1BBUlRMRU4oc2IsIGJsb2MucGFydGl0aW9uUmVmZXJlbmNlTnVtKSk7CisJCWdvdG8gZXJyb3JfcmV0dXJuOworCX0KKworCS8qIFdlIGRvIHRoaXMgdXAgZnJvbnQgLSBUaGVyZSBhcmUgc29tZSBlcnJvciBjb25kaXRpb25zIHRoYXQgY291bGQgb2NjdXJlLAorCSAgIGJ1dC4uIG9oIHdlbGwgKi8KKwlpZiAoaW5vZGUpCisJCURRVU9UX0ZSRUVfQkxPQ0soaW5vZGUsIGNvdW50KTsKKwlpZiAoVURGX1NCX0xWSURCSChzYikpCisJeworCQlVREZfU0JfTFZJRChzYiktPmZyZWVTcGFjZVRhYmxlW1VERl9TQl9QQVJUSVRJT04oc2IpXSA9CisJCQljcHVfdG9fbGUzMihsZTMyX3RvX2NwdShVREZfU0JfTFZJRChzYiktPmZyZWVTcGFjZVRhYmxlW1VERl9TQl9QQVJUSVRJT04oc2IpXSkrY291bnQpOworCQltYXJrX2J1ZmZlcl9kaXJ0eShVREZfU0JfTFZJREJIKHNiKSk7CisJfQorCisJc3RhcnQgPSBibG9jLmxvZ2ljYWxCbG9ja051bSArIG9mZnNldDsKKwllbmQgPSBibG9jLmxvZ2ljYWxCbG9ja051bSArIG9mZnNldCArIGNvdW50IC0gMTsKKworCW9leHRvZmZzZXQgPSBuZXh0b2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCB1bmFsbG9jU3BhY2VFbnRyeSk7CisJZWxlbiA9IDA7CisJb2Jsb2MgPSBuYmxvYyA9IFVERl9JX0xPQ0FUSU9OKHRhYmxlKTsKKworCW9iaCA9IG5iaCA9IE5VTEw7CisKKwl3aGlsZSAoY291bnQgJiYgKGV0eXBlID0KKwkJdWRmX25leHRfYWV4dCh0YWJsZSwgJm5ibG9jLCAmbmV4dG9mZnNldCwgJmVsb2MsICZlbGVuLCAmbmJoLCAxKSkgIT0gLTEpCisJeworCQlpZiAoKChlbG9jLmxvZ2ljYWxCbG9ja051bSArIChlbGVuID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSkgPT0KKwkJCXN0YXJ0KSkKKwkJeworCQkJaWYgKCgweDNGRkZGRkZGIC0gZWxlbikgPCAoY291bnQgPDwgc2ItPnNfYmxvY2tzaXplX2JpdHMpKQorCQkJeworCQkJCWNvdW50IC09ICgoMHgzRkZGRkZGRiAtIGVsZW4pID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwkJCQlzdGFydCArPSAoKDB4M0ZGRkZGRkYgLSBlbGVuKSA+PiBzYi0+c19ibG9ja3NpemVfYml0cyk7CisJCQkJZWxlbiA9IChldHlwZSA8PCAzMCkgfCAoMHg0MDAwMDAwMCAtIHNiLT5zX2Jsb2Nrc2l6ZSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJZWxlbiA9IChldHlwZSA8PCAzMCkgfAorCQkJCQkoZWxlbiArIChjb3VudCA8PCBzYi0+c19ibG9ja3NpemVfYml0cykpOworCQkJCXN0YXJ0ICs9IGNvdW50OworCQkJCWNvdW50ID0gMDsKKwkJCX0KKwkJCXVkZl93cml0ZV9hZXh0KHRhYmxlLCBvYmxvYywgJm9leHRvZmZzZXQsIGVsb2MsIGVsZW4sIG9iaCwgMSk7CisJCX0KKwkJZWxzZSBpZiAoZWxvYy5sb2dpY2FsQmxvY2tOdW0gPT0gKGVuZCArIDEpKQorCQl7CisJCQlpZiAoKDB4M0ZGRkZGRkYgLSBlbGVuKSA8IChjb3VudCA8PCBzYi0+c19ibG9ja3NpemVfYml0cykpCisJCQl7CisJCQkJY291bnQgLT0gKCgweDNGRkZGRkZGIC0gZWxlbikgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCQkJCWVuZCAtPSAoKDB4M0ZGRkZGRkYgLSBlbGVuKSA+PiBzYi0+c19ibG9ja3NpemVfYml0cyk7CisJCQkJZWxvYy5sb2dpY2FsQmxvY2tOdW0gLT0KKwkJCQkJKCgweDNGRkZGRkZGIC0gZWxlbikgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCQkJCWVsZW4gPSAoZXR5cGUgPDwgMzApIHwgKDB4NDAwMDAwMDAgLSBzYi0+c19ibG9ja3NpemUpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWVsb2MubG9naWNhbEJsb2NrTnVtID0gc3RhcnQ7CisJCQkJZWxlbiA9IChldHlwZSA8PCAzMCkgfAorCQkJCQkoZWxlbiArIChjb3VudCA8PCBzYi0+c19ibG9ja3NpemVfYml0cykpOworCQkJCWVuZCAtPSBjb3VudDsKKwkJCQljb3VudCA9IDA7CisJCQl9CisJCQl1ZGZfd3JpdGVfYWV4dCh0YWJsZSwgb2Jsb2MsICZvZXh0b2Zmc2V0LCBlbG9jLCBlbGVuLCBvYmgsIDEpOworCQl9CisKKwkJaWYgKG5iaCAhPSBvYmgpCisJCXsKKwkJCWkgPSAtMTsKKwkJCW9ibG9jID0gbmJsb2M7CisJCQl1ZGZfcmVsZWFzZV9kYXRhKG9iaCk7CisJCQlhdG9taWNfaW5jKCZuYmgtPmJfY291bnQpOworCQkJb2JoID0gbmJoOworCQkJb2V4dG9mZnNldCA9IDA7CisJCX0KKwkJZWxzZQorCQkJb2V4dG9mZnNldCA9IG5leHRvZmZzZXQ7CisJfQorCisJaWYgKGNvdW50KQorCXsKKwkJLyogTk9URTogd2UgQ0FOTk9UIHVzZSB1ZGZfYWRkX2FleHQgaGVyZSwgYXMgaXQgY2FuIHRyeSB0byBhbGxvY2F0ZQorCQkJCSBhIG5ldyBibG9jaywgYW5kIHNpbmNlIHdlIGhvbGQgdGhlIHN1cGVyIGJsb2NrIGxvY2sgYWxyZWFkeQorCQkJCSB2ZXJ5IGJhZCB0aGluZ3Mgd291bGQgaGFwcGVuIDopCisKKwkJCQkgV2UgY29weSB0aGUgYmVoYXZpb3Igb2YgdWRmX2FkZF9hZXh0LCBidXQgaW5zdGVhZCBvZgorCQkJCSB0cnlpbmcgdG8gYWxsb2NhdGUgYSBuZXcgYmxvY2sgY2xvc2UgdG8gdGhlIGV4aXN0aW5nIG9uZSwKKwkJCQkgd2UganVzdCBzdGVhbCBhIGJsb2NrIGZyb20gdGhlIGV4dGVudCB3ZSBhcmUgdHJ5aW5nIHRvIGFkZC4KKworCQkJCSBJdCB3b3VsZCBiZSBuaWNlIGlmIHRoZSBibG9ja3Mgd2VyZSBjbG9zZSB0b2dldGhlciwgYnV0IGl0CisJCQkJIGlzbid0IHJlcXVpcmVkLgorCQkqLworCisJCWludCBhZHNpemU7CisJCXNob3J0X2FkICpzYWQgPSBOVUxMOworCQlsb25nX2FkICpsYWQgPSBOVUxMOworCQlzdHJ1Y3QgYWxsb2NFeHREZXNjICphZWQ7CisKKwkJZWxvYy5sb2dpY2FsQmxvY2tOdW0gPSBzdGFydDsKKwkJZWxlbiA9IEVYVF9SRUNPUkRFRF9BTExPQ0FURUQgfAorCQkJKGNvdW50IDw8IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKworCQlpZiAoVURGX0lfQUxMT0NUWVBFKHRhYmxlKSA9PSBJQ0JUQUdfRkxBR19BRF9TSE9SVCkKKwkJCWFkc2l6ZSA9IHNpemVvZihzaG9ydF9hZCk7CisJCWVsc2UgaWYgKFVERl9JX0FMTE9DVFlQRSh0YWJsZSkgPT0gSUNCVEFHX0ZMQUdfQURfTE9ORykKKwkJCWFkc2l6ZSA9IHNpemVvZihsb25nX2FkKTsKKwkJZWxzZQorCQl7CisJCQl1ZGZfcmVsZWFzZV9kYXRhKG9iaCk7CisJCQl1ZGZfcmVsZWFzZV9kYXRhKG5iaCk7CisJCQlnb3RvIGVycm9yX3JldHVybjsKKwkJfQorCisJCWlmIChuZXh0b2Zmc2V0ICsgKDIgKiBhZHNpemUpID4gc2ItPnNfYmxvY2tzaXplKQorCQl7CisJCQljaGFyICpzcHRyLCAqZHB0cjsKKwkJCWludCBsb2Zmc2V0OworCQorCQkJdWRmX3JlbGVhc2VfZGF0YShvYmgpOworCQkJb2JoID0gbmJoOworCQkJb2Jsb2MgPSBuYmxvYzsKKwkJCW9leHRvZmZzZXQgPSBuZXh0b2Zmc2V0OworCisJCQkvKiBTdGVhbCBhIGJsb2NrIGZyb20gdGhlIGV4dGVudCBiZWluZyBmcmVlJ2QgKi8KKwkJCW5ibG9jLmxvZ2ljYWxCbG9ja051bSA9IGVsb2MubG9naWNhbEJsb2NrTnVtOworCQkJZWxvYy5sb2dpY2FsQmxvY2tOdW0gKys7CisJCQllbGVuIC09IHNiLT5zX2Jsb2Nrc2l6ZTsKKworCQkJaWYgKCEobmJoID0gdWRmX3RyZWFkKHNiLAorCQkJCXVkZl9nZXRfbGJfcGJsb2NrKHNiLCBuYmxvYywgMCkpKSkKKwkJCXsKKwkJCQl1ZGZfcmVsZWFzZV9kYXRhKG9iaCk7CisJCQkJZ290byBlcnJvcl9yZXR1cm47CisJCQl9CisJCQlhZWQgPSAoc3RydWN0IGFsbG9jRXh0RGVzYyAqKShuYmgtPmJfZGF0YSk7CisJCQlhZWQtPnByZXZpb3VzQWxsb2NFeHRMb2NhdGlvbiA9IGNwdV90b19sZTMyKG9ibG9jLmxvZ2ljYWxCbG9ja051bSk7CisJCQlpZiAobmV4dG9mZnNldCArIGFkc2l6ZSA+IHNiLT5zX2Jsb2Nrc2l6ZSkKKwkJCXsKKwkJCQlsb2Zmc2V0ID0gbmV4dG9mZnNldDsKKwkJCQlhZWQtPmxlbmd0aEFsbG9jRGVzY3MgPSBjcHVfdG9fbGUzMihhZHNpemUpOworCQkJCWlmIChvYmgpCisJCQkJCXNwdHIgPSBVREZfSV9EQVRBKGlub2RlKSArIG5leHRvZmZzZXQgLSAgdWRmX2ZpbGVfZW50cnlfYWxsb2Nfb2Zmc2V0KGlub2RlKSArIFVERl9JX0xFTkVBVFRSKGlub2RlKSAtIGFkc2l6ZTsKKwkJCQllbHNlCisJCQkJCXNwdHIgPSBvYmgtPmJfZGF0YSArIG5leHRvZmZzZXQgLSBhZHNpemU7CisJCQkJZHB0ciA9IG5iaC0+Yl9kYXRhICsgc2l6ZW9mKHN0cnVjdCBhbGxvY0V4dERlc2MpOworCQkJCW1lbWNweShkcHRyLCBzcHRyLCBhZHNpemUpOworCQkJCW5leHRvZmZzZXQgPSBzaXplb2Yoc3RydWN0IGFsbG9jRXh0RGVzYykgKyBhZHNpemU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJbG9mZnNldCA9IG5leHRvZmZzZXQgKyBhZHNpemU7CisJCQkJYWVkLT5sZW5ndGhBbGxvY0Rlc2NzID0gY3B1X3RvX2xlMzIoMCk7CisJCQkJc3B0ciA9IChvYmgpLT5iX2RhdGEgKyBuZXh0b2Zmc2V0OworCQkJCW5leHRvZmZzZXQgPSBzaXplb2Yoc3RydWN0IGFsbG9jRXh0RGVzYyk7CisKKwkJCQlpZiAob2JoKQorCQkJCXsKKwkJCQkJYWVkID0gKHN0cnVjdCBhbGxvY0V4dERlc2MgKikob2JoKS0+Yl9kYXRhOworCQkJCQlhZWQtPmxlbmd0aEFsbG9jRGVzY3MgPQorCQkJCQkJY3B1X3RvX2xlMzIobGUzMl90b19jcHUoYWVkLT5sZW5ndGhBbGxvY0Rlc2NzKSArIGFkc2l6ZSk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCVVERl9JX0xFTkFMTE9DKHRhYmxlKSArPSBhZHNpemU7CisJCQkJCW1hcmtfaW5vZGVfZGlydHkodGFibGUpOworCQkJCX0KKwkJCX0KKwkJCWlmIChVREZfU0JfVURGUkVWKHNiKSA+PSAweDAyMDApCisJCQkJdWRmX25ld190YWcobmJoLT5iX2RhdGEsIFRBR19JREVOVF9BRUQsIDMsIDEsCisJCQkJCW5ibG9jLmxvZ2ljYWxCbG9ja051bSwgc2l6ZW9mKHRhZykpOworCQkJZWxzZQorCQkJCXVkZl9uZXdfdGFnKG5iaC0+Yl9kYXRhLCBUQUdfSURFTlRfQUVELCAyLCAxLAorCQkJCQluYmxvYy5sb2dpY2FsQmxvY2tOdW0sIHNpemVvZih0YWcpKTsKKwkJCXN3aXRjaCAoVURGX0lfQUxMT0NUWVBFKHRhYmxlKSkKKwkJCXsKKwkJCQljYXNlIElDQlRBR19GTEFHX0FEX1NIT1JUOgorCQkJCXsKKwkJCQkJc2FkID0gKHNob3J0X2FkICopc3B0cjsKKwkJCQkJc2FkLT5leHRMZW5ndGggPSBjcHVfdG9fbGUzMigKKwkJCQkJCUVYVF9ORVhUX0VYVEVOVF9BTExPQ0RFQ1MgfAorCQkJCQkJc2ItPnNfYmxvY2tzaXplKTsKKwkJCQkJc2FkLT5leHRQb3NpdGlvbiA9IGNwdV90b19sZTMyKG5ibG9jLmxvZ2ljYWxCbG9ja051bSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljYXNlIElDQlRBR19GTEFHX0FEX0xPTkc6CisJCQkJeworCQkJCQlsYWQgPSAobG9uZ19hZCAqKXNwdHI7CisJCQkJCWxhZC0+ZXh0TGVuZ3RoID0gY3B1X3RvX2xlMzIoCisJCQkJCQlFWFRfTkVYVF9FWFRFTlRfQUxMT0NERUNTIHwKKwkJCQkJCXNiLT5zX2Jsb2Nrc2l6ZSk7CisJCQkJCWxhZC0+ZXh0TG9jYXRpb24gPSBjcHVfdG9fbGVsYihuYmxvYyk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmIChvYmgpCisJCQl7CisJCQkJdWRmX3VwZGF0ZV90YWcob2JoLT5iX2RhdGEsIGxvZmZzZXQpOworCQkJCW1hcmtfYnVmZmVyX2RpcnR5KG9iaCk7CisJCQl9CisJCQllbHNlCisJCQkJbWFya19pbm9kZV9kaXJ0eSh0YWJsZSk7CisJCX0KKworCQlpZiAoZWxlbikgLyogSXQncyBwb3NzaWJsZSB0aGF0IHN0ZWFsaW5nIHRoZSBibG9jayBlbXB0aWVkIHRoZSBleHRlbnQgKi8KKwkJeworCQkJdWRmX3dyaXRlX2FleHQodGFibGUsIG5ibG9jLCAmbmV4dG9mZnNldCwgZWxvYywgZWxlbiwgbmJoLCAxKTsKKworCQkJaWYgKCFuYmgpCisJCQl7CisJCQkJVURGX0lfTEVOQUxMT0ModGFibGUpICs9IGFkc2l6ZTsKKwkJCQltYXJrX2lub2RlX2RpcnR5KHRhYmxlKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlhZWQgPSAoc3RydWN0IGFsbG9jRXh0RGVzYyAqKW5iaC0+Yl9kYXRhOworCQkJCWFlZC0+bGVuZ3RoQWxsb2NEZXNjcyA9CisJCQkJCWNwdV90b19sZTMyKGxlMzJfdG9fY3B1KGFlZC0+bGVuZ3RoQWxsb2NEZXNjcykgKyBhZHNpemUpOworCQkJCXVkZl91cGRhdGVfdGFnKG5iaC0+Yl9kYXRhLCBuZXh0b2Zmc2V0KTsKKwkJCQltYXJrX2J1ZmZlcl9kaXJ0eShuYmgpOworCQkJfQorCQl9CisJfQorCisJdWRmX3JlbGVhc2VfZGF0YShuYmgpOworCXVkZl9yZWxlYXNlX2RhdGEob2JoKTsKKworZXJyb3JfcmV0dXJuOgorCXNiLT5zX2RpcnQgPSAxOworCXVwKCZzYmktPnNfYWxsb2Nfc2VtKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQgdWRmX3RhYmxlX3ByZWFsbG9jX2Jsb2NrcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwKKwlzdHJ1Y3QgaW5vZGUgKnRhYmxlLCB1aW50MTZfdCBwYXJ0aXRpb24sIHVpbnQzMl90IGZpcnN0X2Jsb2NrLAorCXVpbnQzMl90IGJsb2NrX2NvdW50KQoreworCXN0cnVjdCB1ZGZfc2JfaW5mbyAqc2JpID0gVURGX1NCKHNiKTsKKwlpbnQgYWxsb2NfY291bnQgPSAwOworCXVpbnQzMl90IGV4dG9mZnNldCwgZWxlbiwgYWRzaXplOworCWtlcm5lbF9sYl9hZGRyIGJsb2MsIGVsb2M7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlpbnQ4X3QgZXR5cGUgPSAtMTsKKworCWlmIChmaXJzdF9ibG9jayA8IDAgfHwgZmlyc3RfYmxvY2sgPj0gVURGX1NCX1BBUlRMRU4oc2IsIHBhcnRpdGlvbikpCisJCXJldHVybiAwOworCisJaWYgKFVERl9JX0FMTE9DVFlQRSh0YWJsZSkgPT0gSUNCVEFHX0ZMQUdfQURfU0hPUlQpCisJCWFkc2l6ZSA9IHNpemVvZihzaG9ydF9hZCk7CisJZWxzZSBpZiAoVURGX0lfQUxMT0NUWVBFKHRhYmxlKSA9PSBJQ0JUQUdfRkxBR19BRF9MT05HKQorCQlhZHNpemUgPSBzaXplb2YobG9uZ19hZCk7CisJZWxzZQorCQlyZXR1cm4gMDsKKworCWRvd24oJnNiaS0+c19hbGxvY19zZW0pOworCWV4dG9mZnNldCA9IHNpemVvZihzdHJ1Y3QgdW5hbGxvY1NwYWNlRW50cnkpOworCWJsb2MgPSBVREZfSV9MT0NBVElPTih0YWJsZSk7CisKKwliaCA9IE5VTEw7CisJZWxvYy5sb2dpY2FsQmxvY2tOdW0gPSAweEZGRkZGRkZGOworCisJd2hpbGUgKGZpcnN0X2Jsb2NrICE9IGVsb2MubG9naWNhbEJsb2NrTnVtICYmIChldHlwZSA9CisJCXVkZl9uZXh0X2FleHQodGFibGUsICZibG9jLCAmZXh0b2Zmc2V0LCAmZWxvYywgJmVsZW4sICZiaCwgMSkpICE9IC0xKQorCXsKKwkJdWRmX2RlYnVnKCJlbG9jPSVkLCBlbGVuPSVkLCBmaXJzdF9ibG9jaz0lZFxuIiwKKwkJCWVsb2MubG9naWNhbEJsb2NrTnVtLCBlbGVuLCBmaXJzdF9ibG9jayk7CisJCTsgLyogZW1wdHkgbG9vcCBib2R5ICovCisJfQorCisJaWYgKGZpcnN0X2Jsb2NrID09IGVsb2MubG9naWNhbEJsb2NrTnVtKQorCXsKKwkJZXh0b2Zmc2V0IC09IGFkc2l6ZTsKKworCQlhbGxvY19jb3VudCA9IChlbGVuID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwkJaWYgKGlub2RlICYmIERRVU9UX1BSRUFMTE9DX0JMT0NLKGlub2RlLCBhbGxvY19jb3VudCA+IGJsb2NrX2NvdW50ID8gYmxvY2tfY291bnQgOiBhbGxvY19jb3VudCkpCisJCQlhbGxvY19jb3VudCA9IDA7CisJCWVsc2UgaWYgKGFsbG9jX2NvdW50ID4gYmxvY2tfY291bnQpCisJCXsKKwkJCWFsbG9jX2NvdW50ID0gYmxvY2tfY291bnQ7CisJCQllbG9jLmxvZ2ljYWxCbG9ja051bSArPSBhbGxvY19jb3VudDsKKwkJCWVsZW4gLT0gKGFsbG9jX2NvdW50IDw8IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwkJCXVkZl93cml0ZV9hZXh0KHRhYmxlLCBibG9jLCAmZXh0b2Zmc2V0LCBlbG9jLCAoZXR5cGUgPDwgMzApIHwgZWxlbiwgYmgsIDEpOworCQl9CisJCWVsc2UKKwkJCXVkZl9kZWxldGVfYWV4dCh0YWJsZSwgYmxvYywgZXh0b2Zmc2V0LCBlbG9jLCAoZXR5cGUgPDwgMzApIHwgZWxlbiwgYmgpOworCX0KKwllbHNlCisJCWFsbG9jX2NvdW50ID0gMDsKKworCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCisJaWYgKGFsbG9jX2NvdW50ICYmIFVERl9TQl9MVklEQkgoc2IpKQorCXsKKwkJVURGX1NCX0xWSUQoc2IpLT5mcmVlU3BhY2VUYWJsZVtwYXJ0aXRpb25dID0KKwkJCWNwdV90b19sZTMyKGxlMzJfdG9fY3B1KFVERl9TQl9MVklEKHNiKS0+ZnJlZVNwYWNlVGFibGVbcGFydGl0aW9uXSktYWxsb2NfY291bnQpOworCQltYXJrX2J1ZmZlcl9kaXJ0eShVREZfU0JfTFZJREJIKHNiKSk7CisJCXNiLT5zX2RpcnQgPSAxOworCX0KKwl1cCgmc2JpLT5zX2FsbG9jX3NlbSk7CisJcmV0dXJuIGFsbG9jX2NvdW50OworfQorCitzdGF0aWMgaW50IHVkZl90YWJsZV9uZXdfYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsCisJc3RydWN0IGlub2RlICogaW5vZGUsCisJc3RydWN0IGlub2RlICp0YWJsZSwgdWludDE2X3QgcGFydGl0aW9uLCB1aW50MzJfdCBnb2FsLCBpbnQgKmVycikKK3sKKwlzdHJ1Y3QgdWRmX3NiX2luZm8gKnNiaSA9IFVERl9TQihzYik7CisJdWludDMyX3Qgc3ByZWFkID0gMHhGRkZGRkZGRiwgbnNwcmVhZCA9IDB4RkZGRkZGRkY7CisJdWludDMyX3QgbmV3YmxvY2sgPSAwLCBhZHNpemU7CisJdWludDMyX3QgZXh0b2Zmc2V0LCBnb2FsX2V4dG9mZnNldCwgZWxlbiwgZ29hbF9lbGVuID0gMDsKKwlrZXJuZWxfbGJfYWRkciBibG9jLCBnb2FsX2Jsb2MsIGVsb2MsIGdvYWxfZWxvYzsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCAqZ29hbF9iaDsKKwlpbnQ4X3QgZXR5cGU7CisKKwkqZXJyID0gLUVOT1NQQzsKKworCWlmIChVREZfSV9BTExPQ1RZUEUodGFibGUpID09IElDQlRBR19GTEFHX0FEX1NIT1JUKQorCQlhZHNpemUgPSBzaXplb2Yoc2hvcnRfYWQpOworCWVsc2UgaWYgKFVERl9JX0FMTE9DVFlQRSh0YWJsZSkgPT0gSUNCVEFHX0ZMQUdfQURfTE9ORykKKwkJYWRzaXplID0gc2l6ZW9mKGxvbmdfYWQpOworCWVsc2UKKwkJcmV0dXJuIG5ld2Jsb2NrOworCisJZG93bigmc2JpLT5zX2FsbG9jX3NlbSk7CisJaWYgKGdvYWwgPCAwIHx8IGdvYWwgPj0gVURGX1NCX1BBUlRMRU4oc2IsIHBhcnRpdGlvbikpCisJCWdvYWwgPSAwOworCisJLyogV2Ugc2VhcmNoIGZvciB0aGUgY2xvc2VzdCBtYXRjaGluZyBibG9jayB0byBnb2FsLiBJZiB3ZSBmaW5kIGEgZXhhY3QgaGl0LAorCSAgIHdlIHN0b3AuIE90aGVyd2lzZSB3ZSBrZWVwIGdvaW5nIHRpbGwgd2UgcnVuIG91dCBvZiBleHRlbnRzLgorCSAgIFdlIHN0b3JlIHRoZSBidWZmZXJfaGVhZCwgYmxvYywgYW5kIGV4dG9mZnNldCBvZiB0aGUgY3VycmVudCBjbG9zZXN0CisJICAgbWF0Y2ggYW5kIHVzZSB0aGF0IHdoZW4gd2UgYXJlIGRvbmUuCisJKi8KKworCWV4dG9mZnNldCA9IHNpemVvZihzdHJ1Y3QgdW5hbGxvY1NwYWNlRW50cnkpOworCWJsb2MgPSBVREZfSV9MT0NBVElPTih0YWJsZSk7CisKKwlnb2FsX2JoID0gYmggPSBOVUxMOworCisJd2hpbGUgKHNwcmVhZCAmJiAoZXR5cGUgPQorCQl1ZGZfbmV4dF9hZXh0KHRhYmxlLCAmYmxvYywgJmV4dG9mZnNldCwgJmVsb2MsICZlbGVuLCAmYmgsIDEpKSAhPSAtMSkKKwl7CisJCWlmIChnb2FsID49IGVsb2MubG9naWNhbEJsb2NrTnVtKQorCQl7CisJCQlpZiAoZ29hbCA8IGVsb2MubG9naWNhbEJsb2NrTnVtICsgKGVsZW4gPj4gc2ItPnNfYmxvY2tzaXplX2JpdHMpKQorCQkJCW5zcHJlYWQgPSAwOworCQkJZWxzZQorCQkJCW5zcHJlYWQgPSBnb2FsIC0gZWxvYy5sb2dpY2FsQmxvY2tOdW0gLQorCQkJCQkoZWxlbiA+PiBzYi0+c19ibG9ja3NpemVfYml0cyk7CisJCX0KKwkJZWxzZQorCQkJbnNwcmVhZCA9IGVsb2MubG9naWNhbEJsb2NrTnVtIC0gZ29hbDsKKworCQlpZiAobnNwcmVhZCA8IHNwcmVhZCkKKwkJeworCQkJc3ByZWFkID0gbnNwcmVhZDsKKwkJCWlmIChnb2FsX2JoICE9IGJoKQorCQkJeworCQkJCXVkZl9yZWxlYXNlX2RhdGEoZ29hbF9iaCk7CisJCQkJZ29hbF9iaCA9IGJoOworCQkJCWF0b21pY19pbmMoJmdvYWxfYmgtPmJfY291bnQpOworCQkJfQorCQkJZ29hbF9ibG9jID0gYmxvYzsKKwkJCWdvYWxfZXh0b2Zmc2V0ID0gZXh0b2Zmc2V0IC0gYWRzaXplOworCQkJZ29hbF9lbG9jID0gZWxvYzsKKwkJCWdvYWxfZWxlbiA9IChldHlwZSA8PCAzMCkgfCBlbGVuOworCQl9CisJfQorCisJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisKKwlpZiAoc3ByZWFkID09IDB4RkZGRkZGRkYpCisJeworCQl1ZGZfcmVsZWFzZV9kYXRhKGdvYWxfYmgpOworCQl1cCgmc2JpLT5zX2FsbG9jX3NlbSk7CisJCXJldHVybiAwOworCX0KKworCS8qIE9ubHkgYWxsb2NhdGUgYmxvY2tzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZXh0ZW50LgorCSAgIFRoYXQgd2F5LCB3ZSBvbmx5IGRlbGV0ZSAoZW1wdHkpIGV4dGVudHMsIG5ldmVyIGhhdmUgdG8gaW5zZXJ0IGFuCisJICAgZXh0ZW50IGJlY2F1c2Ugb2Ygc3BsaXR0aW5nICovCisJLyogVGhpcyB3b3JrcywgYnV0IHZlcnkgcG9vcmx5Li4uLiAqLworCisJbmV3YmxvY2sgPSBnb2FsX2Vsb2MubG9naWNhbEJsb2NrTnVtOworCWdvYWxfZWxvYy5sb2dpY2FsQmxvY2tOdW0gKys7CisJZ29hbF9lbGVuIC09IHNiLT5zX2Jsb2Nrc2l6ZTsKKworCWlmIChpbm9kZSAmJiBEUVVPVF9BTExPQ19CTE9DSyhpbm9kZSwgMSkpCisJeworCQl1ZGZfcmVsZWFzZV9kYXRhKGdvYWxfYmgpOworCQl1cCgmc2JpLT5zX2FsbG9jX3NlbSk7CisJCSplcnIgPSAtRURRVU9UOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZ29hbF9lbGVuKQorCQl1ZGZfd3JpdGVfYWV4dCh0YWJsZSwgZ29hbF9ibG9jLCAmZ29hbF9leHRvZmZzZXQsIGdvYWxfZWxvYywgZ29hbF9lbGVuLCBnb2FsX2JoLCAxKTsKKwllbHNlCisJCXVkZl9kZWxldGVfYWV4dCh0YWJsZSwgZ29hbF9ibG9jLCBnb2FsX2V4dG9mZnNldCwgZ29hbF9lbG9jLCBnb2FsX2VsZW4sIGdvYWxfYmgpOworCXVkZl9yZWxlYXNlX2RhdGEoZ29hbF9iaCk7CisKKwlpZiAoVURGX1NCX0xWSURCSChzYikpCisJeworCQlVREZfU0JfTFZJRChzYiktPmZyZWVTcGFjZVRhYmxlW3BhcnRpdGlvbl0gPQorCQkJY3B1X3RvX2xlMzIobGUzMl90b19jcHUoVURGX1NCX0xWSUQoc2IpLT5mcmVlU3BhY2VUYWJsZVtwYXJ0aXRpb25dKS0xKTsKKwkJbWFya19idWZmZXJfZGlydHkoVURGX1NCX0xWSURCSChzYikpOworCX0KKworCXNiLT5zX2RpcnQgPSAxOworCXVwKCZzYmktPnNfYWxsb2Nfc2VtKTsKKwkqZXJyID0gMDsKKwlyZXR1cm4gbmV3YmxvY2s7Cit9CisKK2lubGluZSB2b2lkIHVkZl9mcmVlX2Jsb2NrcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwKKwlrZXJuZWxfbGJfYWRkciBibG9jLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IGNvdW50KQoreworCXVpbnQxNl90IHBhcnRpdGlvbiA9IGJsb2MucGFydGl0aW9uUmVmZXJlbmNlTnVtOworCisJaWYgKFVERl9TQl9QQVJURkxBR1Moc2IsIHBhcnRpdGlvbikgJiBVREZfUEFSVF9GTEFHX1VOQUxMT0NfQklUTUFQKQorCXsKKwkJcmV0dXJuIHVkZl9iaXRtYXBfZnJlZV9ibG9ja3Moc2IsIGlub2RlLAorCQkJVURGX1NCX1BBUlRNQVBTKHNiKVtwYXJ0aXRpb25dLnNfdXNwYWNlLnNfYml0bWFwLAorCQkJYmxvYywgb2Zmc2V0LCBjb3VudCk7CisJfQorCWVsc2UgaWYgKFVERl9TQl9QQVJURkxBR1Moc2IsIHBhcnRpdGlvbikgJiBVREZfUEFSVF9GTEFHX1VOQUxMT0NfVEFCTEUpCisJeworCQlyZXR1cm4gdWRmX3RhYmxlX2ZyZWVfYmxvY2tzKHNiLCBpbm9kZSwKKwkJCVVERl9TQl9QQVJUTUFQUyhzYilbcGFydGl0aW9uXS5zX3VzcGFjZS5zX3RhYmxlLAorCQkJYmxvYywgb2Zmc2V0LCBjb3VudCk7CisJfQorCWVsc2UgaWYgKFVERl9TQl9QQVJURkxBR1Moc2IsIHBhcnRpdGlvbikgJiBVREZfUEFSVF9GTEFHX0ZSRUVEX0JJVE1BUCkKKwl7CisJCXJldHVybiB1ZGZfYml0bWFwX2ZyZWVfYmxvY2tzKHNiLCBpbm9kZSwKKwkJCVVERl9TQl9QQVJUTUFQUyhzYilbcGFydGl0aW9uXS5zX2ZzcGFjZS5zX2JpdG1hcCwKKwkJCWJsb2MsIG9mZnNldCwgY291bnQpOworCX0KKwllbHNlIGlmIChVREZfU0JfUEFSVEZMQUdTKHNiLCBwYXJ0aXRpb24pICYgVURGX1BBUlRfRkxBR19GUkVFRF9UQUJMRSkKKwl7CisJCXJldHVybiB1ZGZfdGFibGVfZnJlZV9ibG9ja3Moc2IsIGlub2RlLAorCQkJVURGX1NCX1BBUlRNQVBTKHNiKVtwYXJ0aXRpb25dLnNfZnNwYWNlLnNfdGFibGUsCisJCQlibG9jLCBvZmZzZXQsIGNvdW50KTsKKwl9CisJZWxzZQorCQlyZXR1cm47Cit9CisKK2lubGluZSBpbnQgdWRmX3ByZWFsbG9jX2Jsb2NrcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwKKwl1aW50MTZfdCBwYXJ0aXRpb24sIHVpbnQzMl90IGZpcnN0X2Jsb2NrLCB1aW50MzJfdCBibG9ja19jb3VudCkKK3sKKwlpZiAoVURGX1NCX1BBUlRGTEFHUyhzYiwgcGFydGl0aW9uKSAmIFVERl9QQVJUX0ZMQUdfVU5BTExPQ19CSVRNQVApCisJeworCQlyZXR1cm4gdWRmX2JpdG1hcF9wcmVhbGxvY19ibG9ja3Moc2IsIGlub2RlLAorCQkJVURGX1NCX1BBUlRNQVBTKHNiKVtwYXJ0aXRpb25dLnNfdXNwYWNlLnNfYml0bWFwLAorCQkJcGFydGl0aW9uLCBmaXJzdF9ibG9jaywgYmxvY2tfY291bnQpOworCX0KKwllbHNlIGlmIChVREZfU0JfUEFSVEZMQUdTKHNiLCBwYXJ0aXRpb24pICYgVURGX1BBUlRfRkxBR19VTkFMTE9DX1RBQkxFKQorCXsKKwkJcmV0dXJuIHVkZl90YWJsZV9wcmVhbGxvY19ibG9ja3Moc2IsIGlub2RlLAorCQkJVURGX1NCX1BBUlRNQVBTKHNiKVtwYXJ0aXRpb25dLnNfdXNwYWNlLnNfdGFibGUsCisJCQlwYXJ0aXRpb24sIGZpcnN0X2Jsb2NrLCBibG9ja19jb3VudCk7CisJfQorCWVsc2UgaWYgKFVERl9TQl9QQVJURkxBR1Moc2IsIHBhcnRpdGlvbikgJiBVREZfUEFSVF9GTEFHX0ZSRUVEX0JJVE1BUCkKKwl7CisJCXJldHVybiB1ZGZfYml0bWFwX3ByZWFsbG9jX2Jsb2NrcyhzYiwgaW5vZGUsCisJCQlVREZfU0JfUEFSVE1BUFMoc2IpW3BhcnRpdGlvbl0uc19mc3BhY2Uuc19iaXRtYXAsCisJCQlwYXJ0aXRpb24sIGZpcnN0X2Jsb2NrLCBibG9ja19jb3VudCk7CisJfQorCWVsc2UgaWYgKFVERl9TQl9QQVJURkxBR1Moc2IsIHBhcnRpdGlvbikgJiBVREZfUEFSVF9GTEFHX0ZSRUVEX1RBQkxFKQorCXsKKwkJcmV0dXJuIHVkZl90YWJsZV9wcmVhbGxvY19ibG9ja3Moc2IsIGlub2RlLAorCQkJVURGX1NCX1BBUlRNQVBTKHNiKVtwYXJ0aXRpb25dLnNfZnNwYWNlLnNfdGFibGUsCisJCQlwYXJ0aXRpb24sIGZpcnN0X2Jsb2NrLCBibG9ja19jb3VudCk7CisJfQorCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK2lubGluZSBpbnQgdWRmX25ld19ibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwKKwl1aW50MTZfdCBwYXJ0aXRpb24sIHVpbnQzMl90IGdvYWwsIGludCAqZXJyKQoreworCWlmIChVREZfU0JfUEFSVEZMQUdTKHNiLCBwYXJ0aXRpb24pICYgVURGX1BBUlRfRkxBR19VTkFMTE9DX0JJVE1BUCkKKwl7CisJCXJldHVybiB1ZGZfYml0bWFwX25ld19ibG9jayhzYiwgaW5vZGUsCisJCQlVREZfU0JfUEFSVE1BUFMoc2IpW3BhcnRpdGlvbl0uc191c3BhY2Uuc19iaXRtYXAsCisJCQlwYXJ0aXRpb24sIGdvYWwsIGVycik7CisJfQorCWVsc2UgaWYgKFVERl9TQl9QQVJURkxBR1Moc2IsIHBhcnRpdGlvbikgJiBVREZfUEFSVF9GTEFHX1VOQUxMT0NfVEFCTEUpCisJeworCQlyZXR1cm4gdWRmX3RhYmxlX25ld19ibG9jayhzYiwgaW5vZGUsCisJCQlVREZfU0JfUEFSVE1BUFMoc2IpW3BhcnRpdGlvbl0uc191c3BhY2Uuc190YWJsZSwKKwkJCXBhcnRpdGlvbiwgZ29hbCwgZXJyKTsKKwl9CisJZWxzZSBpZiAoVURGX1NCX1BBUlRGTEFHUyhzYiwgcGFydGl0aW9uKSAmIFVERl9QQVJUX0ZMQUdfRlJFRURfQklUTUFQKQorCXsKKwkJcmV0dXJuIHVkZl9iaXRtYXBfbmV3X2Jsb2NrKHNiLCBpbm9kZSwKKwkJCVVERl9TQl9QQVJUTUFQUyhzYilbcGFydGl0aW9uXS5zX2ZzcGFjZS5zX2JpdG1hcCwKKwkJCXBhcnRpdGlvbiwgZ29hbCwgZXJyKTsKKwl9CisJZWxzZSBpZiAoVURGX1NCX1BBUlRGTEFHUyhzYiwgcGFydGl0aW9uKSAmIFVERl9QQVJUX0ZMQUdfRlJFRURfVEFCTEUpCisJeworCQlyZXR1cm4gdWRmX3RhYmxlX25ld19ibG9jayhzYiwgaW5vZGUsCisJCQlVREZfU0JfUEFSVE1BUFMoc2IpW3BhcnRpdGlvbl0uc19mc3BhY2Uuc190YWJsZSwKKwkJCXBhcnRpdGlvbiwgZ29hbCwgZXJyKTsKKwl9CisJZWxzZQorCXsKKwkJKmVyciA9IC1FSU87CisJCXJldHVybiAwOworCX0KK30KZGlmZiAtLWdpdCBhL2ZzL3VkZi9jcmMuYyBiL2ZzL3VkZi9jcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTVjNmUzCi0tLSAvZGV2L251bGwKKysrIGIvZnMvdWRmL2NyYy5jCkBAIC0wLDAgKzEsMTc4IEBACisvKgorICogY3JjLmMKKyAqCisgKiBQVVJQT1NFCisgKglSb3V0aW5lcyB0byBnZW5lcmF0ZSwgY2FsY3VsYXRlLCBhbmQgdGVzdCBhIDE2LWJpdCBDUkMuCisgKgorICogREVTQ1JJUFRJT04KKyAqCVRoZSBDUkMgY29kZSB3YXMgZGV2aXNlZCBieSBEb24gUC4gTWl0Y2hlbGwgb2YgQVQmVCBCZWxsIExhYm9yYXRvcmllcworICoJYW5kIE5lZCBXLiBSaG9kZXMgb2YgU29mdHdhcmUgU3lzdGVtcyBHcm91cC4gSXQgaGFzIGJlZW4gcHVibGlzaGVkIGluCisgKgkiRGVzaWduIGFuZCBWYWxpZGF0aW9uIG9mIENvbXB1dGVyIFByb3RvY29scyIsIFByZW50aWNlIEhhbGwsCisgKglFbmdsZXdvb2QgQ2xpZmZzLCBOSiwgMTk5MSwgQ2hhcHRlciAzLCBJU0JOIDAtMTMtNTM5OTI1LTQuCisgKgorICoJQ29weXJpZ2h0IGlzIGhlbGQgYnkgQVQmVC4KKyAqCisgKglBVCZUIGdpdmVzIHBlcm1pc3Npb24gZm9yIHRoZSBmcmVlIHVzZSBvZiB0aGUgQ1JDIHNvdXJjZSBjb2RlLgorICoKKyAqIENPTlRBQ1RTCisgKglFLW1haWwgcmVnYXJkaW5nIGFueSBwb3J0aW9uIG9mIHRoZSBMaW51eCBVREYgZmlsZSBzeXN0ZW0gc2hvdWxkIGJlCisgKglkaXJlY3RlZCB0byB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBtYWlsaW5nIGxpc3QgKHJ1biBieSBtYWpvcmRvbW8pOgorICoJCWxpbnV4X3VkZkBocGVzanJvLmZjLmhwLmNvbQorICoKKyAqIENPUFlSSUdIVAorICoJVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIChHUEwpLiBDb3BpZXMgb2YgdGhlIEdQTCBjYW4gYmUgb2J0YWluZWQgZnJvbToKKyAqCQlmdHA6Ly9wcmVwLmFpLm1pdC5lZHUvcHViL2dudS9HUEwKKyAqCUVhY2ggY29udHJpYnV0aW5nIGF1dGhvciByZXRhaW5zIGFsbCByaWdodHMgdG8gdGhlaXIgb3duIHdvcmsuCisgKi8KKworI2luY2x1ZGUgInVkZmRlY2wuaCIKKworc3RhdGljIHVpbnQxNl90IGNyY190YWJsZVsyNTZdID0geworCTB4MDAwMFUsIDB4MTAyMVUsIDB4MjA0MlUsIDB4MzA2M1UsIDB4NDA4NFUsIDB4NTBhNVUsIDB4NjBjNlUsIDB4NzBlN1UsCisJMHg4MTA4VSwgMHg5MTI5VSwgMHhhMTRhVSwgMHhiMTZiVSwgMHhjMThjVSwgMHhkMWFkVSwgMHhlMWNlVSwgMHhmMWVmVSwKKwkweDEyMzFVLCAweDAyMTBVLCAweDMyNzNVLCAweDIyNTJVLCAweDUyYjVVLCAweDQyOTRVLCAweDcyZjdVLCAweDYyZDZVLAorCTB4OTMzOVUsIDB4ODMxOFUsIDB4YjM3YlUsIDB4YTM1YVUsIDB4ZDNiZFUsIDB4YzM5Y1UsIDB4ZjNmZlUsIDB4ZTNkZVUsCisJMHgyNDYyVSwgMHgzNDQzVSwgMHgwNDIwVSwgMHgxNDAxVSwgMHg2NGU2VSwgMHg3NGM3VSwgMHg0NGE0VSwgMHg1NDg1VSwKKwkweGE1NmFVLCAweGI1NGJVLCAweDg1MjhVLCAweDk1MDlVLCAweGU1ZWVVLCAweGY1Y2ZVLCAweGM1YWNVLCAweGQ1OGRVLAorCTB4MzY1M1UsIDB4MjY3MlUsIDB4MTYxMVUsIDB4MDYzMFUsIDB4NzZkN1UsIDB4NjZmNlUsIDB4NTY5NVUsIDB4NDZiNFUsCisJMHhiNzViVSwgMHhhNzdhVSwgMHg5NzE5VSwgMHg4NzM4VSwgMHhmN2RmVSwgMHhlN2ZlVSwgMHhkNzlkVSwgMHhjN2JjVSwKKwkweDQ4YzRVLCAweDU4ZTVVLCAweDY4ODZVLCAweDc4YTdVLCAweDA4NDBVLCAweDE4NjFVLCAweDI4MDJVLCAweDM4MjNVLAorCTB4YzljY1UsIDB4ZDllZFUsIDB4ZTk4ZVUsIDB4ZjlhZlUsIDB4ODk0OFUsIDB4OTk2OVUsIDB4YTkwYVUsIDB4YjkyYlUsCisJMHg1YWY1VSwgMHg0YWQ0VSwgMHg3YWI3VSwgMHg2YTk2VSwgMHgxYTcxVSwgMHgwYTUwVSwgMHgzYTMzVSwgMHgyYTEyVSwKKwkweGRiZmRVLCAweGNiZGNVLCAweGZiYmZVLCAweGViOWVVLCAweDliNzlVLCAweDhiNThVLCAweGJiM2JVLCAweGFiMWFVLAorCTB4NmNhNlUsIDB4N2M4N1UsIDB4NGNlNFUsIDB4NWNjNVUsIDB4MmMyMlUsIDB4M2MwM1UsIDB4MGM2MFUsIDB4MWM0MVUsCisJMHhlZGFlVSwgMHhmZDhmVSwgMHhjZGVjVSwgMHhkZGNkVSwgMHhhZDJhVSwgMHhiZDBiVSwgMHg4ZDY4VSwgMHg5ZDQ5VSwKKwkweDdlOTdVLCAweDZlYjZVLCAweDVlZDVVLCAweDRlZjRVLCAweDNlMTNVLCAweDJlMzJVLCAweDFlNTFVLCAweDBlNzBVLAorCTB4ZmY5ZlUsIDB4ZWZiZVUsIDB4ZGZkZFUsIDB4Y2ZmY1UsIDB4YmYxYlUsIDB4YWYzYVUsIDB4OWY1OVUsIDB4OGY3OFUsCisJMHg5MTg4VSwgMHg4MWE5VSwgMHhiMWNhVSwgMHhhMWViVSwgMHhkMTBjVSwgMHhjMTJkVSwgMHhmMTRlVSwgMHhlMTZmVSwKKwkweDEwODBVLCAweDAwYTFVLCAweDMwYzJVLCAweDIwZTNVLCAweDUwMDRVLCAweDQwMjVVLCAweDcwNDZVLCAweDYwNjdVLAorCTB4ODNiOVUsIDB4OTM5OFUsIDB4YTNmYlUsIDB4YjNkYVUsIDB4YzMzZFUsIDB4ZDMxY1UsIDB4ZTM3ZlUsIDB4ZjM1ZVUsCisJMHgwMmIxVSwgMHgxMjkwVSwgMHgyMmYzVSwgMHgzMmQyVSwgMHg0MjM1VSwgMHg1MjE0VSwgMHg2Mjc3VSwgMHg3MjU2VSwKKwkweGI1ZWFVLCAweGE1Y2JVLCAweDk1YThVLCAweDg1ODlVLCAweGY1NmVVLCAweGU1NGZVLCAweGQ1MmNVLCAweGM1MGRVLAorCTB4MzRlMlUsIDB4MjRjM1UsIDB4MTRhMFUsIDB4MDQ4MVUsIDB4NzQ2NlUsIDB4NjQ0N1UsIDB4NTQyNFUsIDB4NDQwNVUsCisJMHhhN2RiVSwgMHhiN2ZhVSwgMHg4Nzk5VSwgMHg5N2I4VSwgMHhlNzVmVSwgMHhmNzdlVSwgMHhjNzFkVSwgMHhkNzNjVSwKKwkweDI2ZDNVLCAweDM2ZjJVLCAweDA2OTFVLCAweDE2YjBVLCAweDY2NTdVLCAweDc2NzZVLCAweDQ2MTVVLCAweDU2MzRVLAorCTB4ZDk0Y1UsIDB4Yzk2ZFUsIDB4ZjkwZVUsIDB4ZTkyZlUsIDB4OTljOFUsIDB4ODllOVUsIDB4Yjk4YVUsIDB4YTlhYlUsCisJMHg1ODQ0VSwgMHg0ODY1VSwgMHg3ODA2VSwgMHg2ODI3VSwgMHgxOGMwVSwgMHgwOGUxVSwgMHgzODgyVSwgMHgyOGEzVSwKKwkweGNiN2RVLCAweGRiNWNVLCAweGViM2ZVLCAweGZiMWVVLCAweDhiZjlVLCAweDliZDhVLCAweGFiYmJVLCAweGJiOWFVLAorCTB4NGE3NVUsIDB4NWE1NFUsIDB4NmEzN1UsIDB4N2ExNlUsIDB4MGFmMVUsIDB4MWFkMFUsIDB4MmFiM1UsIDB4M2E5MlUsCisJMHhmZDJlVSwgMHhlZDBmVSwgMHhkZDZjVSwgMHhjZDRkVSwgMHhiZGFhVSwgMHhhZDhiVSwgMHg5ZGU4VSwgMHg4ZGM5VSwKKwkweDdjMjZVLCAweDZjMDdVLCAweDVjNjRVLCAweDRjNDVVLCAweDNjYTJVLCAweDJjODNVLCAweDFjZTBVLCAweDBjYzFVLAorCTB4ZWYxZlUsIDB4ZmYzZVUsIDB4Y2Y1ZFUsIDB4ZGY3Y1UsIDB4YWY5YlUsIDB4YmZiYVUsIDB4OGZkOVUsIDB4OWZmOFUsCisJMHg2ZTE3VSwgMHg3ZTM2VSwgMHg0ZTU1VSwgMHg1ZTc0VSwgMHgyZTkzVSwgMHgzZWIyVSwgMHgwZWQxVSwgMHgxZWYwVQorfTsKKworLyoKKyAqIHVkZl9jcmMKKyAqCisgKiBQVVJQT1NFCisgKglDYWxjdWxhdGUgYSAxNi1iaXQgQ1JDIGNoZWNrc3VtIHVzaW5nIElUVS1UIFYuNDEgcG9seW5vbWlhbC4KKyAqCisgKiBERVNDUklQVElPTgorICoJVGhlIE9TVEEtVURGKHRtKSAxLjUwIHN0YW5kYXJkIHN0YXRlcyB0aGF0IHVzaW5nIENSQ3MgaXMgbWFuZGF0b3J5LgorICoJVGhlIHBvbHlub21pYWwgdXNlZCBpczoJeF4xNiArIHheMTIgKyB4XjE1ICsgMQorICoKKyAqIFBSRS1DT05ESVRJT05TCisgKglkYXRhCQlQb2ludGVyIHRvIHRoZSBkYXRhIGJsb2NrLgorICoJc2l6ZQkJU2l6ZSBvZiB0aGUgZGF0YSBibG9jay4KKyAqCisgKiBQT1NULUNPTkRJVElPTlMKKyAqCTxyZXR1cm4+CUNSQyBvZiB0aGUgZGF0YSBibG9jay4KKyAqCisgKiBISVNUT1JZCisgKglKdWx5IDIxLCAxOTk3IC0gQW5kcmV3IEUuIE1pbGVza2kKKyAqCUFkYXB0ZWQgZnJvbSBPU1RBLVVERih0bSkgMS41MCBzdGFuZGFyZC4KKyAqLwordWludDE2X3QKK3VkZl9jcmModWludDhfdCAqZGF0YSwgdWludDMyX3Qgc2l6ZSwgdWludDE2X3QgY3JjKQoreworCXdoaWxlIChzaXplLS0pCisJCWNyYyA9IGNyY190YWJsZVsoY3JjID4+IDggXiAqKGRhdGErKykpICYgMHhmZlVdIF4gKGNyYyA8PCA4KTsKKworCXJldHVybiBjcmM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoVEVTVCkKKworLyoKKyAqIFBVUlBPU0UKKyAqCVRlc3QgdWRmX2NyYygpCisgKgorICogSElTVE9SWQorICoJSnVseSAyMSwgMTk5NyAtIEFuZHJldyBFLiBNaWxlc2tpCisgKglBZGFwdGVkIGZyb20gT1NUQS1VREYodG0pIDEuNTAgc3RhbmRhcmQuCisgKi8KKwordW5zaWduZWQgY2hhciBieXRlc1tdID0geyAweDcwVSwgMHg2QVUsIDB4NzdVIH07CisKK2ludCBtYWluKHZvaWQpCit7CisJdW5zaWduZWQgc2hvcnQgeDsKKworCXggPSB1ZGZfY3JjMTYoYnl0ZXMsIHNpemVvZiBieXRlcyk7CisJcHJpbnRmKCJ1ZGZfY3JjMTY6IGNhbGN1bGF0ZWQgPSAlNC40eCwgY29ycmVjdCA9ICU0LjR4XG4iLCB4LCAweDMyOTlVKTsKKworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogZGVmaW5lZChURVNUKSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKEdFTkVSQVRFKQorCisvKgorICogUFVSUE9TRQorICoJR2VuZXJhdGUgYSB0YWJsZSBmb3IgZmFzdCAxNi1iaXQgQ1JDIGNhbGN1bGF0aW9ucyAoYW55IHBvbHlub21pYWwpLgorICoKKyAqIERFU0NSSVBUSU9OCisgKglUaGUgSVRVLVQgVi40MSBwb2x5bm9taWFsIGlzIDAxMDA0MS4KKyAqCisgKiBISVNUT1JZCisgKglKdWx5IDIxLCAxOTk3IC0gQW5kcmV3IEUuIE1pbGVza2kKKyAqCUFkYXB0ZWQgZnJvbSBPU1RBLVVERih0bSkgMS41MCBzdGFuZGFyZC4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIGxvbmcgY3JjLCBwb2x5OworCWludCBuLCBpOworCisJLyogR2V0IHRoZSBwb2x5bm9taWFsICovCisJc3NjYW5mKGFyZ3ZbMV0sICIlbG8iLCAmcG9seSk7CisJaWYgKHBvbHkgJiAweGZmZmYwMDAwVSl7CisJCWZwcmludGYoc3RkZXJyLCAicG9seW5vbWlhbCBpcyB0b28gbGFyZ2VcZW4iKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlwcmludGYoIi8qIENSQyAwJW8gKi9cbiIsIHBvbHkpOworCisJLyogQ3JlYXRlIGEgdGFibGUgKi8KKwlwcmludGYoInN0YXRpYyB1bnNpZ25lZCBzaG9ydCBjcmNfdGFibGVbMjU2XSA9IHtcbiIpOworCWZvciAobiA9IDA7IG4gPCAyNTY7IG4rKyl7CisJCWlmIChuICUgOCA9PSAwKQorCQkJcHJpbnRmKCJcdCIpOworCQljcmMgPSBuIDw8IDg7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspeworCQkJaWYoY3JjICYgMHg4MDAwVSkKKwkJCQljcmMgPSAoY3JjIDw8IDEpIF4gcG9seTsKKwkJCWVsc2UKKwkJCQljcmMgPDw9IDE7CisJCWNyYyAmPSAweEZGRkZVOworCQl9CisJCWlmIChuID09IDI1NSkKKwkJCXByaW50ZigiMHglMDR4VSAiLCBjcmMpOworCQllbHNlCisJCQlwcmludGYoIjB4JTA0eFUsICIsIGNyYyk7CisJCWlmKG4gJSA4ID09IDcpCisJCQlwcmludGYoIlxuIik7CisJfQorCXByaW50ZigifTtcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBkZWZpbmVkKEdFTkVSQVRFKSAqLwpkaWZmIC0tZ2l0IGEvZnMvdWRmL2Rpci5jIGIvZnMvdWRmL2Rpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNDQwYjcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy91ZGYvZGlyLmMKQEAgLTAsMCArMSwyNjggQEAKKy8qCisgKiBkaXIuYworICoKKyAqIFBVUlBPU0UKKyAqICBEaXJlY3RvcnkgaGFuZGxpbmcgcm91dGluZXMgZm9yIHRoZSBPU1RBLVVERih0bSkgZmlsZXN5c3RlbS4KKyAqCisgKiBDT05UQUNUUworICoJRS1tYWlsIHJlZ2FyZGluZyBhbnkgcG9ydGlvbiBvZiB0aGUgTGludXggVURGIGZpbGUgc3lzdGVtIHNob3VsZCBiZQorICoJZGlyZWN0ZWQgdG8gdGhlIGRldmVsb3BtZW50IHRlYW0gbWFpbGluZyBsaXN0IChydW4gYnkgbWFqb3Jkb21vKToKKyAqCQlsaW51eF91ZGZAaHBlc2pyby5mYy5ocC5jb20KKyAqCisgKiBDT1BZUklHSFQKKyAqCVRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSAoR1BMKS4gQ29waWVzIG9mIHRoZSBHUEwgY2FuIGJlIG9idGFpbmVkIGZyb206CisgKgkJZnRwOi8vcHJlcC5haS5taXQuZWR1L3B1Yi9nbnUvR1BMCisgKglFYWNoIGNvbnRyaWJ1dGluZyBhdXRob3IgcmV0YWlucyBhbGwgcmlnaHRzIHRvIHRoZWlyIG93biB3b3JrLgorICoKKyAqICAoQykgMTk5OC0yMDA0IEJlbiBGZW5uZW1hCisgKgorICogSElTVE9SWQorICoKKyAqICAxMC8wNS85OCBkZ2IgIFNwbGl0IGRpcmVjdG9yeSBvcGVyYXRpb25zIGludG8gaXRzIG93biBmaWxlCisgKiAgICAgICAgICAgICAgICBJbXBsZW1lbnRlZCBkaXJlY3RvcnkgcmVhZHMgdmlhIGRvX3VkZl9yZWFkZGlyCisgKiAgMTAvMDYvOTggICAgICBNYWRlIGRpcmVjdG9yeSBvcGVyYXRpb25zIHdvcmshCisgKiAgMTEvMTcvOTggICAgICBSZXdyb3RlIGRpcmVjdG9yeSB0byBzdXBwb3J0IElDQlRBR19GTEFHX0FEX0xPTkcKKyAqICAxMS8yNS85OCBibGYgIFJld3JvdGUgZGlyZWN0b3J5IGhhbmRsaW5nIChyZWFkZGlyK2xvb2t1cCkgdG8gc3VwcG9ydCByZWFkaW5nCisgKiAgICAgICAgICAgICAgICBhY3Jvc3MgYmxvY2tzLgorICogIDEyLzEyLzk4ICAgICAgU3BsaXQgb3V0IHRoZSBsb29rdXAgY29kZSB0byBuYW1laS5jLiBidWxrIG9mIGRpcmVjdG9yeQorICogICAgICAgICAgICAgICAgY29kZSBub3cgaW4gZGlyZWN0b3J5LmM6dWRmX2ZpbGVpZGVudF9yZWFkLgorICovCisKKyNpbmNsdWRlICJ1ZGZkZWNsLmgiCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKworI2luY2x1ZGUgInVkZl9pLmgiCisjaW5jbHVkZSAidWRmX3NiLmgiCisKKy8qIFByb3RvdHlwZXMgZm9yIGZpbGUgb3BlcmF0aW9ucyAqLworc3RhdGljIGludCB1ZGZfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqLCB2b2lkICosIGZpbGxkaXJfdCk7CitzdGF0aWMgaW50IGRvX3VkZl9yZWFkZGlyKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqLCBmaWxsZGlyX3QsIHZvaWQgKik7CisKKy8qIHJlYWRkaXIgYW5kIGxvb2t1cCBmdW5jdGlvbnMgKi8KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1ZGZfZGlyX29wZXJhdGlvbnMgPSB7CisJLnJlYWQJCQk9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIJCT0gdWRmX3JlYWRkaXIsCisJLmlvY3RsCQkJPSB1ZGZfaW9jdGwsCisJLmZzeW5jCQkJPSB1ZGZfZnN5bmNfZmlsZSwKK307CisKKy8qCisgKiB1ZGZfcmVhZGRpcgorICoKKyAqIFBVUlBPU0UKKyAqCVJlYWQgYSBkaXJlY3RvcnkgZW50cnkuCisgKgorICogREVTQ1JJUFRJT04KKyAqCU9wdGlvbmFsIC0gc3lzX2dldGRlbnRzKCkgd2lsbCByZXR1cm4gLUVOT1RESVIgaWYgdGhpcyByb3V0aW5lIGlzIG5vdAorICoJYXZhaWxhYmxlLgorICoKKyAqCVJlZmVyIHRvIHN5c19nZXRkZW50cygpIGluIGZzL3JlYWRkaXIuYworICoJc3lzX2dldGRlbnRzKCkgLT4gLgorICoKKyAqIFBSRS1DT05ESVRJT05TCisgKglmaWxwCQkJUG9pbnRlciB0byBkaXJlY3RvcnkgZmlsZS4KKyAqCWJ1ZgkJCVBvaW50ZXIgdG8gZGlyZWN0b3J5IGVudHJ5IGJ1ZmZlci4KKyAqCWZpbGxkaXIJCQlQb2ludGVyIHRvIGZpbGxkaXIgZnVuY3Rpb24uCisgKgorICogUE9TVC1DT05ESVRJT05TCisgKgk8cmV0dXJuPgkJPj0wIG9uIHN1Y2Nlc3MuCisgKgorICogSElTVE9SWQorICoJSnVseSAxLCAxOTk3IC0gQW5kcmV3IEUuIE1pbGVza2kKKyAqCVdyaXR0ZW4sIHRlc3RlZCwgYW5kIHJlbGVhc2VkLgorICovCisKK2ludCB1ZGZfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmRpciA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCWludCByZXN1bHQ7CisKKwlsb2NrX2tlcm5lbCgpOworCisJaWYgKCBmaWxwLT5mX3BvcyA9PSAwICkgCisJeworCQlpZiAoZmlsbGRpcihkaXJlbnQsICIuIiwgMSwgZmlscC0+Zl9wb3MsIGRpci0+aV9pbm8sIERUX0RJUikgPCAwKQorCQl7CisJCQl1bmxvY2tfa2VybmVsKCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlmaWxwLT5mX3BvcyArKzsKKwl9CisKKwlyZXN1bHQgPSBkb191ZGZfcmVhZGRpcihkaXIsIGZpbHAsIGZpbGxkaXIsIGRpcmVudCk7CisJdW5sb2NrX2tlcm5lbCgpOworIAlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IAorZG9fdWRmX3JlYWRkaXIoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZmlsZSAqZmlscCwgZmlsbGRpcl90IGZpbGxkaXIsIHZvaWQgKmRpcmVudCkKK3sKKwlzdHJ1Y3QgdWRmX2ZpbGVpZGVudF9iaCBmaWJoOworCXN0cnVjdCBmaWxlSWRlbnREZXNjICpmaT1OVUxMOworCXN0cnVjdCBmaWxlSWRlbnREZXNjIGNmaTsKKwlpbnQgYmxvY2ssIGlibG9jazsKKwlsb2ZmX3QgbmZfcG9zID0gZmlscC0+Zl9wb3MgLSAxOworCWludCBmbGVuOworCWNoYXIgZm5hbWVbVURGX05BTUVfTEVOXTsKKwljaGFyICpuYW1lcHRyOworCXVpbnQxNl90IGxpdTsKKwl1aW50OF90IGxmaTsKKwlsb2ZmX3Qgc2l6ZSA9ICh1ZGZfZXh0MF9vZmZzZXQoZGlyKSArIGRpci0+aV9zaXplKSA+PiAyOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoID0gTlVMTCwgKiB0bXAsICogYmhhWzE2XTsKKwlrZXJuZWxfbGJfYWRkciBibG9jLCBlbG9jOworCXVpbnQzMl90IGV4dG9mZnNldCwgZWxlbiwgb2Zmc2V0OworCWludCBpLCBudW07CisJdW5zaWduZWQgaW50IGR0X3R5cGU7CisKKwlpZiAobmZfcG9zID49IHNpemUpCisJCXJldHVybiAwOworCisJaWYgKG5mX3BvcyA9PSAwKQorCQluZl9wb3MgPSAodWRmX2V4dDBfb2Zmc2V0KGRpcikgPj4gMik7CisKKwlmaWJoLnNvZmZzZXQgPSBmaWJoLmVvZmZzZXQgPSAobmZfcG9zICYgKChkaXItPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkgPj4gMikpIDw8IDI7CisJaWYgKFVERl9JX0FMTE9DVFlQRShkaXIpID09IElDQlRBR19GTEFHX0FEX0lOX0lDQikKKwkJZmliaC5zYmggPSBmaWJoLmViaCA9IE5VTEw7CisJZWxzZSBpZiAoaW5vZGVfYm1hcChkaXIsIG5mX3BvcyA+PiAoZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gMiksCisJCSZibG9jLCAmZXh0b2Zmc2V0LCAmZWxvYywgJmVsZW4sICZvZmZzZXQsICZiaCkgPT0gKEVYVF9SRUNPUkRFRF9BTExPQ0FURUQgPj4gMzApKQorCXsKKwkJb2Zmc2V0ID4+PSBkaXItPmlfc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJCWJsb2NrID0gdWRmX2dldF9sYl9wYmxvY2soZGlyLT5pX3NiLCBlbG9jLCBvZmZzZXQpOworCQlpZiAoKCsrb2Zmc2V0IDw8IGRpci0+aV9zYi0+c19ibG9ja3NpemVfYml0cykgPCBlbGVuKQorCQl7CisJCQlpZiAoVURGX0lfQUxMT0NUWVBFKGRpcikgPT0gSUNCVEFHX0ZMQUdfQURfU0hPUlQpCisJCQkJZXh0b2Zmc2V0IC09IHNpemVvZihzaG9ydF9hZCk7CisJCQllbHNlIGlmIChVREZfSV9BTExPQ1RZUEUoZGlyKSA9PSBJQ0JUQUdfRkxBR19BRF9MT05HKQorCQkJCWV4dG9mZnNldCAtPSBzaXplb2YobG9uZ19hZCk7CisJCX0KKwkJZWxzZQorCQkJb2Zmc2V0ID0gMDsKKworCQlpZiAoIShmaWJoLnNiaCA9IGZpYmguZWJoID0gdWRmX3RyZWFkKGRpci0+aV9zYiwgYmxvY2spKSkKKwkJeworCQkJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQorCQlpZiAoIShvZmZzZXQgJiAoKDE2ID4+IChkaXItPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMgLSA5KSktMSkpKQorCQl7CisJCQlpID0gMTYgPj4gKGRpci0+aV9zYi0+c19ibG9ja3NpemVfYml0cyAtIDkpOworCQkJaWYgKGkrb2Zmc2V0ID4gKGVsZW4gPj4gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSkKKwkJCQlpID0gKGVsZW4gPj4gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKS1vZmZzZXQ7CisJCQlmb3IgKG51bT0wOyBpPjA7IGktLSkKKwkJCXsKKwkJCQlibG9jayA9IHVkZl9nZXRfbGJfcGJsb2NrKGRpci0+aV9zYiwgZWxvYywgb2Zmc2V0K2kpOworCQkJCXRtcCA9IHVkZl90Z2V0YmxrKGRpci0+aV9zYiwgYmxvY2spOworCQkJCWlmICh0bXAgJiYgIWJ1ZmZlcl91cHRvZGF0ZSh0bXApICYmICFidWZmZXJfbG9ja2VkKHRtcCkpCisJCQkJCWJoYVtudW0rK10gPSB0bXA7CisJCQkJZWxzZQorCQkJCQlicmVsc2UodG1wKTsKKwkJCX0KKwkJCWlmIChudW0pCisJCQl7CisJCQkJbGxfcndfYmxvY2soUkVBREEsIG51bSwgYmhhKTsKKwkJCQlmb3IgKGk9MDsgaTxudW07IGkrKykKKwkJCQkJYnJlbHNlKGJoYVtpXSk7CisJCQl9CisJCX0KKwl9CisJZWxzZQorCXsKKwkJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCXdoaWxlICggbmZfcG9zIDwgc2l6ZSApCisJeworCQlmaWxwLT5mX3BvcyA9IG5mX3BvcyArIDE7CisKKwkJZmkgPSB1ZGZfZmlsZWlkZW50X3JlYWQoZGlyLCAmbmZfcG9zLCAmZmliaCwgJmNmaSwgJmJsb2MsICZleHRvZmZzZXQsICZlbG9jLCAmZWxlbiwgJm9mZnNldCwgJmJoKTsKKworCQlpZiAoIWZpKQorCQl7CisJCQlpZiAoZmliaC5zYmggIT0gZmliaC5lYmgpCisJCQkJdWRmX3JlbGVhc2VfZGF0YShmaWJoLmViaCk7CisJCQl1ZGZfcmVsZWFzZV9kYXRhKGZpYmguc2JoKTsKKwkJCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlsaXUgPSBsZTE2X3RvX2NwdShjZmkubGVuZ3RoT2ZJbXBVc2UpOworCQlsZmkgPSBjZmkubGVuZ3RoRmlsZUlkZW50OworCisJCWlmIChmaWJoLnNiaCA9PSBmaWJoLmViaCkKKwkJCW5hbWVwdHIgPSBmaS0+ZmlsZUlkZW50ICsgbGl1OworCQllbHNlCisJCXsKKwkJCWludCBwb2Zmc2V0OwkvKiBVbnBhZGVkIGVuZGluZyBvZmZzZXQgKi8KKworCQkJcG9mZnNldCA9IGZpYmguc29mZnNldCArIHNpemVvZihzdHJ1Y3QgZmlsZUlkZW50RGVzYykgKyBsaXUgKyBsZmk7CisKKwkJCWlmIChwb2Zmc2V0ID49IGxmaSkKKwkJCQluYW1lcHRyID0gKGNoYXIgKikoZmliaC5lYmgtPmJfZGF0YSArIHBvZmZzZXQgLSBsZmkpOworCQkJZWxzZQorCQkJeworCQkJCW5hbWVwdHIgPSBmbmFtZTsKKwkJCQltZW1jcHkobmFtZXB0ciwgZmktPmZpbGVJZGVudCArIGxpdSwgbGZpIC0gcG9mZnNldCk7CisJCQkJbWVtY3B5KG5hbWVwdHIgKyBsZmkgLSBwb2Zmc2V0LCBmaWJoLmViaC0+Yl9kYXRhLCBwb2Zmc2V0KTsKKwkJCX0KKwkJfQorCisJCWlmICggKGNmaS5maWxlQ2hhcmFjdGVyaXN0aWNzICYgRklEX0ZJTEVfQ0hBUl9ERUxFVEVEKSAhPSAwICkKKwkJeworCQkJaWYgKCAhVURGX1FVRVJZX0ZMQUcoZGlyLT5pX3NiLCBVREZfRkxBR19VTkRFTEVURSkgKQorCQkJCWNvbnRpbnVlOworCQl9CisJCQorCQlpZiAoIChjZmkuZmlsZUNoYXJhY3RlcmlzdGljcyAmIEZJRF9GSUxFX0NIQVJfSElEREVOKSAhPSAwICkKKwkJeworCQkJaWYgKCAhVURGX1FVRVJZX0ZMQUcoZGlyLT5pX3NiLCBVREZfRkxBR19VTkhJREUpICkKKwkJCQljb250aW51ZTsKKwkJfQorCisJCWlmICggY2ZpLmZpbGVDaGFyYWN0ZXJpc3RpY3MgJiBGSURfRklMRV9DSEFSX1BBUkVOVCApCisJCXsKKwkJCWlibG9jayA9IHBhcmVudF9pbm8oZmlscC0+Zl9kZW50cnkpOworCQkJZmxlbiA9IDI7CisJCQltZW1jcHkoZm5hbWUsICIuLiIsIGZsZW4pOworCQkJZHRfdHlwZSA9IERUX0RJUjsKKwkJfQorCQllbHNlCisJCXsKKwkJCWtlcm5lbF9sYl9hZGRyIHRsb2MgPSBsZWxiX3RvX2NwdShjZmkuaWNiLmV4dExvY2F0aW9uKTsKKworCQkJaWJsb2NrID0gdWRmX2dldF9sYl9wYmxvY2soZGlyLT5pX3NiLCB0bG9jLCAwKTsKKwkJCWZsZW4gPSB1ZGZfZ2V0X2ZpbGVuYW1lKGRpci0+aV9zYiwgbmFtZXB0ciwgZm5hbWUsIGxmaSk7CisJCQlkdF90eXBlID0gRFRfVU5LTk9XTjsKKwkJfQorCisJCWlmIChmbGVuKQorCQl7CisJCQlpZiAoZmlsbGRpcihkaXJlbnQsIGZuYW1lLCBmbGVuLCBmaWxwLT5mX3BvcywgaWJsb2NrLCBkdF90eXBlKSA8IDApCisJCQl7CisJCQkJaWYgKGZpYmguc2JoICE9IGZpYmguZWJoKQorCQkJCQl1ZGZfcmVsZWFzZV9kYXRhKGZpYmguZWJoKTsKKwkJCQl1ZGZfcmVsZWFzZV9kYXRhKGZpYmguc2JoKTsKKwkJCQl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKwkgCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9IC8qIGVuZCB3aGlsZSAqLworCisJZmlscC0+Zl9wb3MgPSBuZl9wb3MgKyAxOworCisJaWYgKGZpYmguc2JoICE9IGZpYmguZWJoKQorCQl1ZGZfcmVsZWFzZV9kYXRhKGZpYmguZWJoKTsKKwl1ZGZfcmVsZWFzZV9kYXRhKGZpYmguc2JoKTsKKwl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMvdWRmL2RpcmVjdG9yeS5jIGIvZnMvdWRmL2RpcmVjdG9yeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNjFlY2MKLS0tIC9kZXYvbnVsbAorKysgYi9mcy91ZGYvZGlyZWN0b3J5LmMKQEAgLTAsMCArMSwzNDMgQEAKKy8qCisgKiBkaXJlY3RvcnkuYworICoKKyAqIFBVUlBPU0UKKyAqCURpcmVjdG9yeSByZWxhdGVkIGZ1bmN0aW9ucworICoKKyAqIENPTlRBQ1RTCisgKglFLW1haWwgcmVnYXJkaW5nIGFueSBwb3J0aW9uIG9mIHRoZSBMaW51eCBVREYgZmlsZSBzeXN0ZW0gc2hvdWxkIGJlCisgKglkaXJlY3RlZCB0byB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBtYWlsaW5nIGxpc3QgKHJ1biBieSBtYWpvcmRvbW8pOgorICoJCWxpbnV4X3VkZkBocGVzanJvLmZjLmhwLmNvbQorICoKKyAqIENPUFlSSUdIVAorICoJVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIChHUEwpLiBDb3BpZXMgb2YgdGhlIEdQTCBjYW4gYmUgb2J0YWluZWQgZnJvbToKKyAqCQlmdHA6Ly9wcmVwLmFpLm1pdC5lZHUvcHViL2dudS9HUEwKKyAqCUVhY2ggY29udHJpYnV0aW5nIGF1dGhvciByZXRhaW5zIGFsbCByaWdodHMgdG8gdGhlaXIgb3duIHdvcmsuCisgKi8KKworI2luY2x1ZGUgInVkZmRlY2wuaCIKKyNpbmNsdWRlICJ1ZGZfaS5oIgorCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorCisjaWYgMAorc3RhdGljIHVpbnQ4X3QgKgordWRmX2ZpbGVhZF9yZWFkKHN0cnVjdCBpbm9kZSAqZGlyLCB1aW50OF90ICp0bXBhZCwgdWludDhfdCBhZF9zaXplLAorCQlrZXJuZWxfbGJfYWRkciBmZV9sb2MsIGludCAqcG9zLCBpbnQgKm9mZnNldCwKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgsIGludCAqZXJyb3IpCit7CisJaW50IGxvZmZzZXQgPSAqb2Zmc2V0OworCWludCBibG9jazsKKwl1aW50OF90ICphZDsKKwlpbnQgcmVtYWluZGVyOworCisJKmVycm9yID0gMDsKKworCWFkID0gKHVpbnQ4X3QgKikoKmJoKS0+Yl9kYXRhICsgKm9mZnNldDsKKwkqb2Zmc2V0ICs9IGFkX3NpemU7CisKKwlpZiAoIWFkKQorCXsKKwkJdWRmX3JlbGVhc2VfZGF0YSgqYmgpOworCQkqZXJyb3IgPSAxOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoKm9mZnNldCA9PSBkaXItPmlfc2ItPnNfYmxvY2tzaXplKQorCXsKKwkJdWRmX3JlbGVhc2VfZGF0YSgqYmgpOworCQlibG9jayA9IHVkZl9nZXRfbGJfcGJsb2NrKGRpci0+aV9zYiwgZmVfbG9jLCArKypwb3MpOworCQlpZiAoIWJsb2NrKQorCQkJcmV0dXJuIE5VTEw7CisJCWlmICghKCpiaCA9IHVkZl90cmVhZChkaXItPmlfc2IsIGJsb2NrKSkpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisJZWxzZSBpZiAoKm9mZnNldCA+IGRpci0+aV9zYi0+c19ibG9ja3NpemUpCisJeworCQlhZCA9IHRtcGFkOworCisJCXJlbWFpbmRlciA9IGRpci0+aV9zYi0+c19ibG9ja3NpemUgLSBsb2Zmc2V0OworCQltZW1jcHkoKHVpbnQ4X3QgKilhZCwgKCpiaCktPmJfZGF0YSArIGxvZmZzZXQsIHJlbWFpbmRlcik7CisKKwkJdWRmX3JlbGVhc2VfZGF0YSgqYmgpOworCQlibG9jayA9IHVkZl9nZXRfbGJfcGJsb2NrKGRpci0+aV9zYiwgZmVfbG9jLCArKypwb3MpOworCQlpZiAoIWJsb2NrKQorCQkJcmV0dXJuIE5VTEw7CisJCWlmICghKCgqYmgpID0gdWRmX3RyZWFkKGRpci0+aV9zYiwgYmxvY2spKSkKKwkJCXJldHVybiBOVUxMOworCisJCW1lbWNweSgodWludDhfdCAqKWFkICsgcmVtYWluZGVyLCAoKmJoKS0+Yl9kYXRhLCBhZF9zaXplIC0gcmVtYWluZGVyKTsKKwkJKm9mZnNldCA9IGFkX3NpemUgLSByZW1haW5kZXI7CisJfQorCXJldHVybiBhZDsKK30KKyNlbmRpZgorCitzdHJ1Y3QgZmlsZUlkZW50RGVzYyAqCit1ZGZfZmlsZWlkZW50X3JlYWQoc3RydWN0IGlub2RlICpkaXIsIGxvZmZfdCAqbmZfcG9zLAorCXN0cnVjdCB1ZGZfZmlsZWlkZW50X2JoICpmaWJoLAorCXN0cnVjdCBmaWxlSWRlbnREZXNjICpjZmksCisJa2VybmVsX2xiX2FkZHIgKmJsb2MsIHVpbnQzMl90ICpleHRvZmZzZXQsIAorCWtlcm5lbF9sYl9hZGRyICplbG9jLCB1aW50MzJfdCAqZWxlbiwKKwl1aW50MzJfdCAqb2Zmc2V0LCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaCkKK3sKKwlzdHJ1Y3QgZmlsZUlkZW50RGVzYyAqZmk7CisJaW50IGksIG51bSwgYmxvY2s7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogdG1wLCAqIGJoYVsxNl07CisKKwlmaWJoLT5zb2Zmc2V0ID0gZmliaC0+ZW9mZnNldDsKKworCWlmIChVREZfSV9BTExPQ1RZUEUoZGlyKSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpCisJeworCQlmaSA9IHVkZl9nZXRfZmlsZWlkZW50KFVERl9JX0RBVEEoZGlyKSAtCisJCQkoVURGX0lfRUZFKGRpcikgPworCQkJCXNpemVvZihzdHJ1Y3QgZXh0ZW5kZWRGaWxlRW50cnkpIDoKKwkJCQlzaXplb2Yoc3RydWN0IGZpbGVFbnRyeSkpLAorCQkJZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSwgJihmaWJoLT5lb2Zmc2V0KSk7CisKKwkJaWYgKCFmaSkKKwkJCXJldHVybiBOVUxMOworCisJCSpuZl9wb3MgKz0gKChmaWJoLT5lb2Zmc2V0IC0gZmliaC0+c29mZnNldCkgPj4gMik7CisKKwkJbWVtY3B5KCh1aW50OF90ICopY2ZpLCAodWludDhfdCAqKWZpLCBzaXplb2Yoc3RydWN0IGZpbGVJZGVudERlc2MpKTsKKworCQlyZXR1cm4gZmk7CisJfQorCisJaWYgKGZpYmgtPmVvZmZzZXQgPT0gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkKKwl7CisJCWludCBsZXh0b2Zmc2V0ID0gKmV4dG9mZnNldDsKKworCQlpZiAodWRmX25leHRfYWV4dChkaXIsIGJsb2MsIGV4dG9mZnNldCwgZWxvYywgZWxlbiwgYmgsIDEpICE9CisJCQkoRVhUX1JFQ09SREVEX0FMTE9DQVRFRCA+PiAzMCkpCisJCXsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJYmxvY2sgPSB1ZGZfZ2V0X2xiX3BibG9jayhkaXItPmlfc2IsICplbG9jLCAqb2Zmc2V0KTsKKworCQkoKm9mZnNldCkgKys7CisKKwkJaWYgKCgqb2Zmc2V0IDw8IGRpci0+aV9zYi0+c19ibG9ja3NpemVfYml0cykgPj0gKmVsZW4pCisJCQkqb2Zmc2V0ID0gMDsKKwkJZWxzZQorCQkJKmV4dG9mZnNldCA9IGxleHRvZmZzZXQ7CisKKwkJdWRmX3JlbGVhc2VfZGF0YShmaWJoLT5zYmgpOworCQlpZiAoIShmaWJoLT5zYmggPSBmaWJoLT5lYmggPSB1ZGZfdHJlYWQoZGlyLT5pX3NiLCBibG9jaykpKQorCQkJcmV0dXJuIE5VTEw7CisJCWZpYmgtPnNvZmZzZXQgPSBmaWJoLT5lb2Zmc2V0ID0gMDsKKworCQlpZiAoISgqb2Zmc2V0ICYgKCgxNiA+PiAoZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gOSkpLTEpKSkKKwkJeworCQkJaSA9IDE2ID4+IChkaXItPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMgLSA5KTsKKwkJCWlmIChpKypvZmZzZXQgPiAoKmVsZW4gPj4gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSkKKwkJCQlpID0gKCplbGVuID4+IGRpci0+aV9zYi0+c19ibG9ja3NpemVfYml0cyktKm9mZnNldDsKKwkJCWZvciAobnVtPTA7IGk+MDsgaS0tKQorCQkJeworCQkJCWJsb2NrID0gdWRmX2dldF9sYl9wYmxvY2soZGlyLT5pX3NiLCAqZWxvYywgKm9mZnNldCtpKTsKKwkJCQl0bXAgPSB1ZGZfdGdldGJsayhkaXItPmlfc2IsIGJsb2NrKTsKKwkJCQlpZiAodG1wICYmICFidWZmZXJfdXB0b2RhdGUodG1wKSAmJiAhYnVmZmVyX2xvY2tlZCh0bXApKQorCQkJCQliaGFbbnVtKytdID0gdG1wOworCQkJCWVsc2UKKwkJCQkJYnJlbHNlKHRtcCk7CisJCQl9CisJCQlpZiAobnVtKQorCQkJeworCQkJCWxsX3J3X2Jsb2NrKFJFQURBLCBudW0sIGJoYSk7CisJCQkJZm9yIChpPTA7IGk8bnVtOyBpKyspCisJCQkJCWJyZWxzZShiaGFbaV0pOworCQkJfQorCQl9CisJfQorCWVsc2UgaWYgKGZpYmgtPnNiaCAhPSBmaWJoLT5lYmgpCisJeworCQl1ZGZfcmVsZWFzZV9kYXRhKGZpYmgtPnNiaCk7CisJCWZpYmgtPnNiaCA9IGZpYmgtPmViaDsKKwl9CisKKwlmaSA9IHVkZl9nZXRfZmlsZWlkZW50KGZpYmgtPnNiaC0+Yl9kYXRhLCBkaXItPmlfc2ItPnNfYmxvY2tzaXplLAorCQkmKGZpYmgtPmVvZmZzZXQpKTsKKworCWlmICghZmkpCisJCXJldHVybiBOVUxMOworCisJKm5mX3BvcyArPSAoKGZpYmgtPmVvZmZzZXQgLSBmaWJoLT5zb2Zmc2V0KSA+PiAyKTsKKworCWlmIChmaWJoLT5lb2Zmc2V0IDw9IGRpci0+aV9zYi0+c19ibG9ja3NpemUpCisJeworCQltZW1jcHkoKHVpbnQ4X3QgKiljZmksICh1aW50OF90ICopZmksIHNpemVvZihzdHJ1Y3QgZmlsZUlkZW50RGVzYykpOworCX0KKwllbHNlIGlmIChmaWJoLT5lb2Zmc2V0ID4gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSkKKwl7CisJCWludCBsZXh0b2Zmc2V0ID0gKmV4dG9mZnNldDsKKworCQlpZiAodWRmX25leHRfYWV4dChkaXIsIGJsb2MsIGV4dG9mZnNldCwgZWxvYywgZWxlbiwgYmgsIDEpICE9CisJCQkoRVhUX1JFQ09SREVEX0FMTE9DQVRFRCA+PiAzMCkpCisJCXsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJYmxvY2sgPSB1ZGZfZ2V0X2xiX3BibG9jayhkaXItPmlfc2IsICplbG9jLCAqb2Zmc2V0KTsKKworCQkoKm9mZnNldCkgKys7CisKKwkJaWYgKCgqb2Zmc2V0IDw8IGRpci0+aV9zYi0+c19ibG9ja3NpemVfYml0cykgPj0gKmVsZW4pCisJCQkqb2Zmc2V0ID0gMDsKKwkJZWxzZQorCQkJKmV4dG9mZnNldCA9IGxleHRvZmZzZXQ7CisKKwkJZmliaC0+c29mZnNldCAtPSBkaXItPmlfc2ItPnNfYmxvY2tzaXplOworCQlmaWJoLT5lb2Zmc2V0IC09IGRpci0+aV9zYi0+c19ibG9ja3NpemU7CisKKwkJaWYgKCEoZmliaC0+ZWJoID0gdWRmX3RyZWFkKGRpci0+aV9zYiwgYmxvY2spKSkKKwkJCXJldHVybiBOVUxMOworCisJCWlmIChzaXplb2Yoc3RydWN0IGZpbGVJZGVudERlc2MpID4gLSBmaWJoLT5zb2Zmc2V0KQorCQl7CisJCQlpbnQgZmlfbGVuOworCisJCQltZW1jcHkoKHVpbnQ4X3QgKiljZmksICh1aW50OF90ICopZmksIC0gZmliaC0+c29mZnNldCk7CisJCQltZW1jcHkoKHVpbnQ4X3QgKiljZmkgLSBmaWJoLT5zb2Zmc2V0LCBmaWJoLT5lYmgtPmJfZGF0YSwKKwkJCQlzaXplb2Yoc3RydWN0IGZpbGVJZGVudERlc2MpICsgZmliaC0+c29mZnNldCk7CisKKwkJCWZpX2xlbiA9IChzaXplb2Yoc3RydWN0IGZpbGVJZGVudERlc2MpICsgY2ZpLT5sZW5ndGhGaWxlSWRlbnQgKworCQkJCWxlMTZfdG9fY3B1KGNmaS0+bGVuZ3RoT2ZJbXBVc2UpICsgMykgJiB+MzsKKworCQkJKm5mX3BvcyArPSAoKGZpX2xlbiAtIChmaWJoLT5lb2Zmc2V0IC0gZmliaC0+c29mZnNldCkpID4+IDIpOworCQkJZmliaC0+ZW9mZnNldCA9IGZpYmgtPnNvZmZzZXQgKyBmaV9sZW47CisJCX0KKwkJZWxzZQorCQl7CisJCQltZW1jcHkoKHVpbnQ4X3QgKiljZmksICh1aW50OF90ICopZmksIHNpemVvZihzdHJ1Y3QgZmlsZUlkZW50RGVzYykpOworCQl9CisJfQorCXJldHVybiBmaTsKK30KKworc3RydWN0IGZpbGVJZGVudERlc2MgKiAKK3VkZl9nZXRfZmlsZWlkZW50KHZvaWQgKiBidWZmZXIsIGludCBidWZzaXplLCBpbnQgKiBvZmZzZXQpCit7CisJc3RydWN0IGZpbGVJZGVudERlc2MgKmZpOworCWludCBsZW5ndGhUaGlzSWRlbnQ7CisJdWludDhfdCAqIHB0cjsKKwlpbnQgcGFkbGVuOworCisJaWYgKCAoIWJ1ZmZlcikgfHwgKCFvZmZzZXQpICkgeworCQl1ZGZfZGVidWcoImludmFsaWRwYXJtc1xuLCBidWZmZXI9JXAsIG9mZnNldD0lcFxuIiwgYnVmZmVyLCBvZmZzZXQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwdHIgPSBidWZmZXI7CisKKwlpZiAoICgqb2Zmc2V0ID4gMCkgJiYgKCpvZmZzZXQgPCBidWZzaXplKSApIHsKKwkJcHRyICs9ICpvZmZzZXQ7CisJfQorCWZpPShzdHJ1Y3QgZmlsZUlkZW50RGVzYyAqKXB0cjsKKwlpZiAobGUxNl90b19jcHUoZmktPmRlc2NUYWcudGFnSWRlbnQpICE9IFRBR19JREVOVF9GSUQpCisJeworCQl1ZGZfZGVidWcoIjB4JXggIT0gVEFHX0lERU5UX0ZJRFxuIiwKKwkJCWxlMTZfdG9fY3B1KGZpLT5kZXNjVGFnLnRhZ0lkZW50KSk7CisJCXVkZl9kZWJ1Zygib2Zmc2V0OiAldSBzaXplb2Y6ICVsdSBidWZzaXplOiAldVxuIiwKKwkJCSpvZmZzZXQsICh1bnNpZ25lZCBsb25nKXNpemVvZihzdHJ1Y3QgZmlsZUlkZW50RGVzYyksIGJ1ZnNpemUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKCAoKm9mZnNldCArIHNpemVvZihzdHJ1Y3QgZmlsZUlkZW50RGVzYykpID4gYnVmc2l6ZSApCisJeworCQlsZW5ndGhUaGlzSWRlbnQgPSBzaXplb2Yoc3RydWN0IGZpbGVJZGVudERlc2MpOworCX0KKwllbHNlCisJCWxlbmd0aFRoaXNJZGVudCA9IHNpemVvZihzdHJ1Y3QgZmlsZUlkZW50RGVzYykgKworCQkJZmktPmxlbmd0aEZpbGVJZGVudCArIGxlMTZfdG9fY3B1KGZpLT5sZW5ndGhPZkltcFVzZSk7CisKKwkvKiB3ZSBuZWVkIHRvIGZpZ3VyZSBwYWRkaW5nLCB0b28hICovCisJcGFkbGVuID0gbGVuZ3RoVGhpc0lkZW50ICUgVURGX05BTUVfUEFEOworCWlmIChwYWRsZW4pCisJCWxlbmd0aFRoaXNJZGVudCArPSAoVURGX05BTUVfUEFEIC0gcGFkbGVuKTsKKwkqb2Zmc2V0ID0gKm9mZnNldCArIGxlbmd0aFRoaXNJZGVudDsKKworCXJldHVybiBmaTsKK30KKworI2lmIDAKK3N0YXRpYyBleHRlbnRfYWQgKgordWRmX2dldF9maWxlZXh0ZW50KHZvaWQgKiBidWZmZXIsIGludCBidWZzaXplLCBpbnQgKiBvZmZzZXQpCit7CisJZXh0ZW50X2FkICogZXh0OworCXN0cnVjdCBmaWxlRW50cnkgKmZlOworCXVpbnQ4X3QgKiBwdHI7CisKKwlpZiAoICghYnVmZmVyKSB8fCAoIW9mZnNldCkgKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJ1ZGY6IHVkZl9nZXRfZmlsZWV4dGVudCgpIGludmFsaWRwYXJtc1xuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWZlID0gKHN0cnVjdCBmaWxlRW50cnkgKilidWZmZXI7CisKKwlpZiAoIGxlMTZfdG9fY3B1KGZlLT5kZXNjVGFnLnRhZ0lkZW50KSAhPSBUQUdfSURFTlRfRkUgKQorCXsKKwkJdWRmX2RlYnVnKCIweCV4ICE9IFRBR19JREVOVF9GRVxuIiwKKwkJCWxlMTZfdG9fY3B1KGZlLT5kZXNjVGFnLnRhZ0lkZW50KSk7CisJCXJldHVybiBOVUxMOworCX0KKworCXB0cj0odWludDhfdCAqKShmZS0+ZXh0ZW5kZWRBdHRyKSArIGxlMzJfdG9fY3B1KGZlLT5sZW5ndGhFeHRlbmRlZEF0dHIpOworCisJaWYgKCAoKm9mZnNldCA+IDApICYmICgqb2Zmc2V0IDwgbGUzMl90b19jcHUoZmUtPmxlbmd0aEFsbG9jRGVzY3MpKSApCisJeworCQlwdHIgKz0gKm9mZnNldDsKKwl9CisKKwlleHQgPSAoZXh0ZW50X2FkICopcHRyOworCisJKm9mZnNldCA9ICpvZmZzZXQgKyBzaXplb2YoZXh0ZW50X2FkKTsKKwlyZXR1cm4gZXh0OworfQorI2VuZGlmCisKK3Nob3J0X2FkICoKK3VkZl9nZXRfZmlsZXNob3J0YWQodWludDhfdCAqcHRyLCBpbnQgbWF4b2Zmc2V0LCBpbnQgKm9mZnNldCwgaW50IGluYykKK3sKKwlzaG9ydF9hZCAqc2E7CisKKwlpZiAoICghcHRyKSB8fCAoIW9mZnNldCkgKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJ1ZGY6IHVkZl9nZXRfZmlsZXNob3J0YWQoKSBpbnZhbGlkcGFybXNcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoICgqb2Zmc2V0IDwgMCkgfHwgKCgqb2Zmc2V0ICsgc2l6ZW9mKHNob3J0X2FkKSkgPiBtYXhvZmZzZXQpICkKKwkJcmV0dXJuIE5VTEw7CisJZWxzZSBpZiAoKHNhID0gKHNob3J0X2FkICopcHRyKS0+ZXh0TGVuZ3RoID09IDApCisJCXJldHVybiBOVUxMOworCisJaWYgKGluYykKKwkJKm9mZnNldCArPSBzaXplb2Yoc2hvcnRfYWQpOworCXJldHVybiBzYTsKK30KKworbG9uZ19hZCAqCit1ZGZfZ2V0X2ZpbGVsb25nYWQodWludDhfdCAqcHRyLCBpbnQgbWF4b2Zmc2V0LCBpbnQgKiBvZmZzZXQsIGludCBpbmMpCit7CisJbG9uZ19hZCAqbGE7CisKKwlpZiAoICghcHRyKSB8fCAoIW9mZnNldCkgKSAKKwl7CisJCXByaW50ayhLRVJOX0VSUiAidWRmOiB1ZGZfZ2V0X2ZpbGVsb25nYWQoKSBpbnZhbGlkcGFybXNcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoICgqb2Zmc2V0IDwgMCkgfHwgKCgqb2Zmc2V0ICsgc2l6ZW9mKGxvbmdfYWQpKSA+IG1heG9mZnNldCkgKQorCQlyZXR1cm4gTlVMTDsKKwllbHNlIGlmICgobGEgPSAobG9uZ19hZCAqKXB0ciktPmV4dExlbmd0aCA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChpbmMpCisJCSpvZmZzZXQgKz0gc2l6ZW9mKGxvbmdfYWQpOworCXJldHVybiBsYTsKK30KZGlmZiAtLWdpdCBhL2ZzL3VkZi9lY21hXzE2Ny5oIGIvZnMvdWRmL2VjbWFfMTY3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgxZjJlYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3VkZi9lY21hXzE2Ny5oCkBAIC0wLDAgKzEsODY0IEBACisvKgorICogZWNtYV8xNjcuaAorICoKKyAqIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiBFQ01BLTE2NyAzcmQgZWRpdGlvbiAoSnVuZSAxOTk3KQorICogaHR0cDovL3d3dy5lY21hLmNoCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDIgIEJlbiBGZW5uZW1hIDxiZmVubmVtYUBmYWxjb24uY3NjLmNhbHBvbHkuZWR1PgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLAorICogICAgd2l0aG91dCBtb2RpZmljYXRpb24uCisgKiAyLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBQdWJsaWMgTGljZW5zZSAoIkdQTCIpLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisgKiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpZm5kZWYgX0VDTUFfMTY3X0gKKyNkZWZpbmUgX0VDTUFfMTY3X0ggMQorCisvKiBDaGFyYWN0ZXIgc2V0IHNwZWNpZmljYXRpb24gKEVDTUEgMTY3cjMgMS83LjIuMSkgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisJdWludDhfdAkJY2hhclNldFR5cGU7CisJdWludDhfdAkJY2hhclNldEluZm9bNjNdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgY2hhcnNwZWM7CisKKy8qIENoYXJhY3RlciBTZXQgVHlwZSAoRUNNQSAxNjdyMyAxLzcuMi4xLjEpICovCisjZGVmaW5lIENIQVJTUEVDX1RZUEVfQ1MwCQkweDAwCS8qICgxLzcuMi4yKSAqLworI2RlZmluZSBDSEFSU1BFQ19UWVBFX0NTMQkJMHgwMQkvKiAoMS83LjIuMykgKi8KKyNkZWZpbmUgQ0hBUlNQRUNfVFlQRV9DUzIJCTB4MDIJLyogKDEvNy4yLjQpICovCisjZGVmaW5lIENIQVJTUEVDX1RZUEVfQ1MzCQkweDAzCS8qICgxLzcuMi41KSAqLworI2RlZmluZSBDSEFSU1BFQ19UWVBFX0NTNAkJMHgwNAkvKiAoMS83LjIuNikgKi8KKyNkZWZpbmUgQ0hBUlNQRUNfVFlQRV9DUzUJCTB4MDUJLyogKDEvNy4yLjcpICovCisjZGVmaW5lIENIQVJTUEVDX1RZUEVfQ1M2CQkweDA2CS8qICgxLzcuMi44KSAqLworI2RlZmluZSBDSEFSU1BFQ19UWVBFX0NTNwkJMHgwNwkvKiAoMS83LjIuOSkgKi8KKyNkZWZpbmUgQ0hBUlNQRUNfVFlQRV9DUzgJCTB4MDgJLyogKDEvNy4yLjEwKSAqLworCit0eXBlZGVmIHVpbnQ4X3QJCWRzdHJpbmc7CisKKy8qIFRpbWVzdGFtcCAoRUNNQSAxNjdyMyAxLzcuMykgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisJX19sZTE2CQl0eXBlQW5kVGltZXpvbmU7CisJX19sZTE2CQl5ZWFyOworCXVpbnQ4X3QJCW1vbnRoOworCXVpbnQ4X3QJCWRheTsKKwl1aW50OF90CQlob3VyOworCXVpbnQ4X3QJCW1pbnV0ZTsKKwl1aW50OF90CQlzZWNvbmQ7CisJdWludDhfdAkJY2VudGlzZWNvbmRzOworCXVpbnQ4X3QJCWh1bmRyZWRzT2ZNaWNyb3NlY29uZHM7CisJdWludDhfdAkJbWljcm9zZWNvbmRzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgdGltZXN0YW1wOworCit0eXBlZGVmIHN0cnVjdAoreworCXVpbnQxNl90CXR5cGVBbmRUaW1lem9uZTsKKwlpbnQxNl90CQl5ZWFyOworCXVpbnQ4X3QJCW1vbnRoOworCXVpbnQ4X3QJCWRheTsKKwl1aW50OF90CQlob3VyOworCXVpbnQ4X3QJCW1pbnV0ZTsKKwl1aW50OF90CQlzZWNvbmQ7CisJdWludDhfdAkJY2VudGlzZWNvbmRzOworCXVpbnQ4X3QJCWh1bmRyZWRzT2ZNaWNyb3NlY29uZHM7CisJdWludDhfdAkJbWljcm9zZWNvbmRzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkga2VybmVsX3RpbWVzdGFtcDsKKworLyogVHlwZSBhbmQgVGltZSBab25lIChFQ01BIDE2N3IzIDEvNy4zLjEpICovCisjZGVmaW5lIFRJTUVTVEFNUF9UWVBFX01BU0sJCTB4RjAwMAorI2RlZmluZSBUSU1FU1RBTVBfVFlQRV9DVVQJCTB4MDAwMAorI2RlZmluZSBUSU1FU1RBTVBfVFlQRV9MT0NBTAkJMHgxMDAwCisjZGVmaW5lIFRJTUVTVEFNUF9UWVBFX0FHUkVFTUVOVAkweDIwMDAKKyNkZWZpbmUgVElNRVNUQU1QX1RJTUVaT05FX01BU0sJCTB4MEZGRgorCisvKiBFbnRpdHkgaWRlbnRpZmllciAoRUNNQSAxNjdyMyAxLzcuNCkgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisJdWludDhfdAkJZmxhZ3M7CisJdWludDhfdAkJaWRlbnRbMjNdOworCXVpbnQ4X3QJCWlkZW50U3VmZml4WzhdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgcmVnaWQ7CisKKy8qIEZsYWdzIChFQ01BIDE2N3IzIDEvNy40LjEpICovCisjZGVmaW5lIEVOVElUWUlEX0ZMQUdTX0RJUlRZCQkweDAwCisjZGVmaW5lIEVOVElUWUlEX0ZMQUdTX1BST1RFQ1RFRAkweDAxCisKKy8qIFZvbHVtZSBTdHJ1Y3R1cmUgRGVzY3JpcHRvciAoRUNNQSAxNjdyMyAyLzkuMSkgKi8KKyNkZWZpbmUgVlNEX1NURF9JRF9MRU4JCQk1CitzdHJ1Y3Qgdm9sU3RydWN0RGVzYworeworCXVpbnQ4X3QJCXN0cnVjdFR5cGU7CisJdWludDhfdAkJc3RkSWRlbnRbVlNEX1NURF9JRF9MRU5dOworCXVpbnQ4X3QJCXN0cnVjdFZlcnNpb247CisJdWludDhfdAkJc3RydWN0RGF0YVsyMDQxXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBTdGFuZGFyZCBJZGVudGlmaWVyIChFTUNBIDE2N3IyIDIvOS4xLjIpICovCisjZGVmaW5lIFZTRF9TVERfSURfTlNSMDIJCSJOU1IwMiIJLyogKDMvOS4xKSAqLworCisvKiBTdGFuZGFyZCBJZGVudGlmaWVyIChFQ01BIDE2N3IzIDIvOS4xLjIpICovCisjZGVmaW5lIFZTRF9TVERfSURfQkVBMDEJCSJCRUEwMSIJLyogKDIvOS4yKSAqLworI2RlZmluZSBWU0RfU1REX0lEX0JPT1QyCQkiQk9PVDIiCS8qICgyLzkuNCkgKi8KKyNkZWZpbmUgVlNEX1NURF9JRF9DRDAwMQkJIkNEMDAxIgkvKiAoRUNNQS0xMTkpICovCisjZGVmaW5lIFZTRF9TVERfSURfQ0RXMDIJCSJDRFcwMiIJLyogKEVDTUEtMTY4KSAqLworI2RlZmluZSBWU0RfU1REX0lEX05TUjAzCQkiTlNSMDMiCS8qICgzLzkuMSkgKi8KKyNkZWZpbmUgVlNEX1NURF9JRF9URUEwMQkJIlRFQTAxIgkvKiAoMi85LjMpICovCisKKy8qIEJlZ2lubmluZyBFeHRlbmRlZCBBcmVhIERlc2NyaXB0b3IgKEVDTUEgMTY3cjMgMi85LjIpICovCitzdHJ1Y3QgYmVnaW5uaW5nRXh0ZW5kZWRBcmVhRGVzYworeworCXVpbnQ4X3QJCXN0cnVjdFR5cGU7CisJdWludDhfdAkJc3RkSWRlbnRbVlNEX1NURF9JRF9MRU5dOworCXVpbnQ4X3QJCXN0cnVjdFZlcnNpb247CisJdWludDhfdAkJc3RydWN0RGF0YVsyMDQxXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBUZXJtaW5hdGluZyBFeHRlbmRlZCBBcmVhIERlc2NyaXB0b3IgKEVDTUEgMTY3cjMgMi85LjMpICovCitzdHJ1Y3QgdGVybWluYXRpbmdFeHRlbmRlZEFyZWFEZXNjCit7CisJdWludDhfdAkJc3RydWN0VHlwZTsKKwl1aW50OF90CQlzdGRJZGVudFtWU0RfU1REX0lEX0xFTl07CisJdWludDhfdAkJc3RydWN0VmVyc2lvbjsKKwl1aW50OF90CQlzdHJ1Y3REYXRhWzIwNDFdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIEJvb3QgRGVzY3JpcHRvciAoRUNNQSAxNjdyMyAyLzkuNCkgKi8KK3N0cnVjdCBib290RGVzYworeworCXVpbnQ4X3QJCXN0cnVjdFR5cGU7CisJdWludDhfdAkJc3RkSWRlbnRbVlNEX1NURF9JRF9MRU5dOworCXVpbnQ4X3QJCXN0cnVjdFZlcnNpb247CisJdWludDhfdAkJcmVzZXJ2ZWQxOworCXJlZ2lkCQlhcmNoVHlwZTsKKwlyZWdpZAkJYm9vdElkZW50OworCV9fbGUzMgkJYm9vdEV4dExvY2F0aW9uOworCV9fbGUzMgkJYm9vdEV4dExlbmd0aDsKKwlfX2xlNjQJCWxvYWRBZGRyZXNzOworCV9fbGU2NAkJc3RhcnRBZGRyZXNzOworCXRpbWVzdGFtcAlkZXNjQ3JlYXRpb25EYXRlQW5kVGltZTsKKwlfX2xlMTYJCWZsYWdzOworCXVpbnQ4X3QJCXJlc2VydmVkMlszMl07CisJdWludDhfdAkJYm9vdFVzZVsxOTA2XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBGbGFncyAoRUNNQSAxNjdyMyAyLzkuNC4xMikgKi8KKyNkZWZpbmUgQk9PVF9GTEFHU19FUkFTRQkJMHgwMQorCisvKiBFeHRlbnQgRGVzY3JpcHRvciAoRUNNQSAxNjdyMyAzLzcuMSkgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisJX19sZTMyCQlleHRMZW5ndGg7CisJX19sZTMyCQlleHRMb2NhdGlvbjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGV4dGVudF9hZDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKwl1aW50MzJfdAlleHRMZW5ndGg7CisJdWludDMyX3QJZXh0TG9jYXRpb247Cit9IGtlcm5lbF9leHRlbnRfYWQ7CisKKy8qIERlc2NyaXB0b3IgVGFnIChFQ01BIDE2N3IzIDMvNy4yKSAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKwlfX2xlMTYJCXRhZ0lkZW50OworCV9fbGUxNgkJZGVzY1ZlcnNpb247CisJdWludDhfdAkJdGFnQ2hlY2tzdW07CisJdWludDhfdAkJcmVzZXJ2ZWQ7CisJX19sZTE2CQl0YWdTZXJpYWxOdW07CisJX19sZTE2CQlkZXNjQ1JDOworCV9fbGUxNgkJZGVzY0NSQ0xlbmd0aDsKKwlfX2xlMzIJCXRhZ0xvY2F0aW9uOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgdGFnOworCisvKiBUYWcgSWRlbnRpZmllciAoRUNNQSAxNjdyMyAzLzcuMi4xKSAqLworI2RlZmluZSBUQUdfSURFTlRfUFZECQkJMHgwMDAxCisjZGVmaW5lIFRBR19JREVOVF9BVkRQCQkJMHgwMDAyCisjZGVmaW5lIFRBR19JREVOVF9WRFAJCQkweDAwMDMKKyNkZWZpbmUgVEFHX0lERU5UX0lVVkQJCQkweDAwMDQKKyNkZWZpbmUgVEFHX0lERU5UX1BECQkJMHgwMDA1CisjZGVmaW5lIFRBR19JREVOVF9MVkQJCQkweDAwMDYKKyNkZWZpbmUgVEFHX0lERU5UX1VTRAkJCTB4MDAwNworI2RlZmluZSBUQUdfSURFTlRfVEQJCQkweDAwMDgKKyNkZWZpbmUgVEFHX0lERU5UX0xWSUQJCQkweDAwMDkKKworLyogTlNSIERlc2NyaXB0b3IgKEVDTUEgMTY3cjMgMy85LjEpICovCitzdHJ1Y3QgTlNSRGVzYworeworCXVpbnQ4X3QJCXN0cnVjdFR5cGU7CisJdWludDhfdAkJc3RkSWRlbnRbVlNEX1NURF9JRF9MRU5dOworCXVpbnQ4X3QJCXN0cnVjdFZlcnNpb247CisJdWludDhfdAkJcmVzZXJ2ZWQ7CisJdWludDhfdAkJc3RydWN0RGF0YVsyMDQwXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCQorLyogUHJpbWFyeSBWb2x1bWUgRGVzY3JpcHRvciAoRUNNQSAxNjdyMyAzLzEwLjEpICovCitzdHJ1Y3QgcHJpbWFyeVZvbERlc2MKK3sKKwl0YWcJCWRlc2NUYWc7CisJX19sZTMyCQl2b2xEZXNjU2VxTnVtOworCV9fbGUzMgkJcHJpbWFyeVZvbERlc2NOdW07CisJZHN0cmluZwkJdm9sSWRlbnRbMzJdOworCV9fbGUxNgkJdm9sU2VxTnVtOworCV9fbGUxNgkJbWF4Vm9sU2VxTnVtOworCV9fbGUxNgkJaW50ZXJjaGFuZ2VMdmw7CisJX19sZTE2CQltYXhJbnRlcmNoYW5nZUx2bDsKKwlfX2xlMzIJCWNoYXJTZXRMaXN0OworCV9fbGUzMgkJbWF4Q2hhclNldExpc3Q7CisJZHN0cmluZwkJdm9sU2V0SWRlbnRbMTI4XTsKKwljaGFyc3BlYwlkZXNjQ2hhclNldDsKKwljaGFyc3BlYwlleHBsYW5hdG9yeUNoYXJTZXQ7CisJZXh0ZW50X2FkCXZvbEFic3RyYWN0OworCWV4dGVudF9hZAl2b2xDb3B5cmlnaHQ7CisJcmVnaWQJCWFwcElkZW50OworCXRpbWVzdGFtcAlyZWNvcmRpbmdEYXRlQW5kVGltZTsKKwlyZWdpZAkJaW1wSWRlbnQ7CisJdWludDhfdAkJaW1wVXNlWzY0XTsKKwlfX2xlMzIJCXByZWRlY2Vzc29yVm9sRGVzY1NlcUxvY2F0aW9uOworCV9fbGUxNgkJZmxhZ3M7CisJdWludDhfdAkJcmVzZXJ2ZWRbMjJdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIEZsYWdzIChFQ01BIDE2N3IzIDMvMTAuMS4yMSkgKi8KKyNkZWZpbmUgUFZEX0ZMQUdTX1ZTSURfQ09NTU9OCQkweDAwMDEKKworLyogQW5jaG9yIFZvbHVtZSBEZXNjcmlwdG9yIFBvaW50ZXIgKEVDTUEgMTY3cjMgMy8xMC4yKSAqLworc3RydWN0IGFuY2hvclZvbERlc2NQdHIKK3sKKwl0YWcJCWRlc2NUYWc7CisJZXh0ZW50X2FkCW1haW5Wb2xEZXNjU2VxRXh0OworCWV4dGVudF9hZAlyZXNlcnZlVm9sRGVzY1NlcUV4dDsKKwl1aW50OF90CSAJcmVzZXJ2ZWRbNDgwXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBWb2x1bWUgRGVzY3JpcHRvciBQb2ludGVyIChFQ01BIDE2N3IzIDMvMTAuMykgKi8KK3N0cnVjdCB2b2xEZXNjUHRyCit7CisJdGFnCQlkZXNjVGFnOworCV9fbGUzMgkJdm9sRGVzY1NlcU51bTsKKwlleHRlbnRfYWQJbmV4dFZvbERlc2NTZXFFeHQ7CisJdWludDhfdAkJcmVzZXJ2ZWRbNDg0XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBJbXBsZW1lbnRhdGlvbiBVc2UgVm9sdW1lIERlc2NyaXB0b3IgKEVDTUEgMTY3cjMgMy8xMC40KSAqLworc3RydWN0IGltcFVzZVZvbERlc2MKK3sKKwl0YWcJCWRlc2NUYWc7CisJX19sZTMyCQl2b2xEZXNjU2VxTnVtOworCXJlZ2lkCQlpbXBJZGVudDsKKwl1aW50OF90CQlpbXBVc2VbNDYwXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBQYXJ0aXRpb24gRGVzY3JpcHRvciAoRUNNQSAxNjdyMyAzLzEwLjUpICovCitzdHJ1Y3QgcGFydGl0aW9uRGVzYworeworCXRhZwkJZGVzY1RhZzsKKwlfX2xlMzIJCXZvbERlc2NTZXFOdW07CisJX19sZTE2CQlwYXJ0aXRpb25GbGFnczsKKwlfX2xlMTYJCXBhcnRpdGlvbk51bWJlcjsKKwlyZWdpZAkJcGFydGl0aW9uQ29udGVudHM7CisJdWludDhfdAkJcGFydGl0aW9uQ29udGVudHNVc2VbMTI4XTsKKwlfX2xlMzIJCWFjY2Vzc1R5cGU7CisJX19sZTMyCQlwYXJ0aXRpb25TdGFydGluZ0xvY2F0aW9uOworCV9fbGUzMgkJcGFydGl0aW9uTGVuZ3RoOworCXJlZ2lkCQlpbXBJZGVudDsKKwl1aW50OF90CQlpbXBVc2VbMTI4XTsKKwl1aW50OF90CQlyZXNlcnZlZFsxNTZdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFBhcnRpdGlvbiBGbGFncyAoRUNNQSAxNjdyMyAzLzEwLjUuMykgKi8KKyNkZWZpbmUgUERfUEFSVElUSU9OX0ZMQUdTX0FMTE9DCTB4MDAwMQorCisvKiBQYXJ0aXRpb24gQ29udGVudHMgKEVDTUEgMTY3cjIgMy8xMC41LjMpICovCisjZGVmaW5lIFBEX1BBUlRJVElPTl9DT05URU5UU19OU1IwMgkiK05TUjAyIgorCisvKiBQYXJ0aXRpb24gQ29udGVudHMgKEVDTUEgMTY3cjMgMy8xMC41LjUpICovCisjZGVmaW5lIFBEX1BBUlRJVElPTl9DT05URU5UU19GREMwMQkiK0ZEQzAxIgorI2RlZmluZSBQRF9QQVJUSVRJT05fQ09OVEVOVFNfQ0QwMDEJIitDRDAwMSIKKyNkZWZpbmUgUERfUEFSVElUSU9OX0NPTlRFTlRTX0NEVzAyCSIrQ0RXMDIiCisjZGVmaW5lIFBEX1BBUlRJVElPTl9DT05URU5UU19OU1IwMwkiK05TUjAzIgorCisvKiBBY2Nlc3MgVHlwZSAoRUNNQSAxNjdyMyAzLzEwLjUuNykgKi8KKyNkZWZpbmUgUERfQUNDRVNTX1RZUEVfTk9ORQkJMHgwMDAwMDAwMAorI2RlZmluZSBQRF9BQ0NFU1NfVFlQRV9SRUFEX09OTFkJMHgwMDAwMDAwMQorI2RlZmluZSBQRF9BQ0NFU1NfVFlQRV9XUklURV9PTkNFCTB4MDAwMDAwMDIKKyNkZWZpbmUgUERfQUNDRVNTX1RZUEVfUkVXUklUQUJMRQkweDAwMDAwMDAzCisjZGVmaW5lIFBEX0FDQ0VTU19UWVBFX09WRVJXUklUQUJMRQkweDAwMDAwMDA0CisKKy8qIExvZ2ljYWwgVm9sdW1lIERlc2NyaXB0b3IgKEVDTUEgMTY3cjMgMy8xMC42KSAqLworc3RydWN0IGxvZ2ljYWxWb2xEZXNjCit7CisJdGFnCQlkZXNjVGFnOworCV9fbGUzMgkJdm9sRGVzY1NlcU51bTsKKwljaGFyc3BlYwlkZXNjQ2hhclNldDsKKwlkc3RyaW5nCQlsb2dpY2FsVm9sSWRlbnRbMTI4XTsKKwlfX2xlMzIJCWxvZ2ljYWxCbG9ja1NpemU7CisJcmVnaWQJCWRvbWFpbklkZW50OworCXVpbnQ4X3QJCWxvZ2ljYWxWb2xDb250ZW50c1VzZVsxNl07CisJX19sZTMyCQltYXBUYWJsZUxlbmd0aDsKKwlfX2xlMzIJCW51bVBhcnRpdGlvbk1hcHM7CisJcmVnaWQJCWltcElkZW50OworCXVpbnQ4X3QJCWltcFVzZVsxMjhdOworCWV4dGVudF9hZAlpbnRlZ3JpdHlTZXFFeHQ7CisJdWludDhfdAkJcGFydGl0aW9uTWFwc1swXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBHZW5lcmljIFBhcnRpdGlvbiBNYXAgKEVDTUEgMTY3cjMgMy8xMC43LjEpICovCitzdHJ1Y3QgZ2VuZXJpY1BhcnRpdGlvbk1hcAoreworCXVpbnQ4X3QJCXBhcnRpdGlvbk1hcFR5cGU7CisJdWludDhfdAkJcGFydGl0aW9uTWFwTGVuZ3RoOworCXVpbnQ4X3QJCXBhcnRpdGlvbk1hcHBpbmdbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogUGFydGl0aW9uIE1hcCBUeXBlIChFQ01BIDE2N3IzIDMvMTAuNy4xLjEpICovCisjZGVmaW5lIEdQX1BBUlRJVElPTl9NQVBfVFlQRV9VTkRFRgkweDAwCisjZGVmaW5lIEdQX1BBUlRJSVRPTl9NQVBfVFlQRV8xCQkweDAxCisjZGVmaW5lIEdQX1BBUlRJVElPTl9NQVBfVFlQRV8yCQkweDAyCisKKy8qIFR5cGUgMSBQYXJ0aXRpb24gTWFwIChFQ01BIDE2N3IzIDMvMTAuNy4yKSAqLworc3RydWN0IGdlbmVyaWNQYXJ0aXRpb25NYXAxCit7CisJdWludDhfdAkJcGFydGl0aW9uTWFwVHlwZTsKKwl1aW50OF90CQlwYXJ0aXRpb25NYXBMZW5ndGg7CisJX19sZTE2CQl2b2xTZXFOdW07CisJX19sZTE2CQlwYXJ0aXRpb25OdW07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogVHlwZSAyIFBhcnRpdGlvbiBNYXAgKEVDTUEgMTY3cjMgMy8xMC43LjMpICovCitzdHJ1Y3QgZ2VuZXJpY1BhcnRpdGlvbk1hcDIKK3sKKwl1aW50OF90CQlwYXJ0aXRpb25NYXBUeXBlOworCXVpbnQ4X3QJCXBhcnRpdGlvbk1hcExlbmd0aDsgCisJdWludDhfdAkJcGFydGl0aW9uSWRlbnRbNjJdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFVuYWxsb2NhdGVkIFNwYWNlIERlc2NyaXB0b3IgKEVDTUEgMTY3cjMgMy8xMC44KSAqLworc3RydWN0IHVuYWxsb2NTcGFjZURlc2MKK3sKKwl0YWcJCWRlc2NUYWc7CisJX19sZTMyCQl2b2xEZXNjU2VxTnVtOworCV9fbGUzMgkJbnVtQWxsb2NEZXNjczsKKwlleHRlbnRfYWQJYWxsb2NEZXNjc1swXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBUZXJtaW5hdGluZyBEZXNjcmlwdG9yIChFQ01BIDE2N3IzIDMvMTAuOSkgKi8KK3N0cnVjdCB0ZXJtaW5hdGluZ0Rlc2MKK3sKKwl0YWcJCWRlc2NUYWc7CisJdWludDhfdAkJcmVzZXJ2ZWRbNDk2XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBMb2dpY2FsIFZvbHVtZSBJbnRlZ3JpdHkgRGVzY3JpcHRvciAoRUNNQSAxNjdyMyAzLzEwLjEwKSAqLworc3RydWN0IGxvZ2ljYWxWb2xJbnRlZ3JpdHlEZXNjCit7CisJdGFnCQlkZXNjVGFnOworCXRpbWVzdGFtcAlyZWNvcmRpbmdEYXRlQW5kVGltZTsKKwlfX2xlMzIJCWludGVncml0eVR5cGU7CisJZXh0ZW50X2FkCW5leHRJbnRlZ3JpdHlFeHQ7CisJdWludDhfdAkJbG9naWNhbFZvbENvbnRlbnRzVXNlWzMyXTsKKwlfX2xlMzIJCW51bU9mUGFydGl0aW9uczsKKwlfX2xlMzIJCWxlbmd0aE9mSW1wVXNlOworCV9fbGUzMgkJZnJlZVNwYWNlVGFibGVbMF07CisJX19sZTMyCQlzaXplVGFibGVbMF07CisJdWludDhfdAkJaW1wVXNlWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIEludGVncml0eSBUeXBlIChFQ01BIDE2N3IzIDMvMTAuMTAuMykgKi8KKyNkZWZpbmUgTFZJRF9JTlRFR1JJVFlfVFlQRV9PUEVOCTB4MDAwMDAwMDAKKyNkZWZpbmUgTFZJRF9JTlRFR1JJVFlfVFlQRV9DTE9TRQkweDAwMDAwMDAxCisKKy8qIFJlY29yZGVkIEFkZHJlc3MgKEVDTUEgMTY3cjMgNC83LjEpICovCit0eXBlZGVmIHN0cnVjdCAKK3sKKwlfX2xlMzIJCWxvZ2ljYWxCbG9ja051bTsKKwlfX2xlMTYJIAlwYXJ0aXRpb25SZWZlcmVuY2VOdW07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBsYl9hZGRyOworCisvKiAuLi4gYW5kIGl0cyBpbi1jb3JlIGFuYWxvZyAqLwordHlwZWRlZiBzdHJ1Y3QgCit7CisJdWludDMyX3QJCWxvZ2ljYWxCbG9ja051bTsKKwl1aW50MTZfdAkgCXBhcnRpdGlvblJlZmVyZW5jZU51bTsKK30ga2VybmVsX2xiX2FkZHI7CisKKy8qIFNob3J0IEFsbG9jYXRpb24gRGVzY3JpcHRvciAoRUNNQSAxNjdyMyA0LzE0LjE0LjEpICovCit0eXBlZGVmIHN0cnVjdAoreworICAgICAgICBfX2xlMzIJCWV4dExlbmd0aDsKKyAgICAgICAgX19sZTMyCQlleHRQb3NpdGlvbjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIHNob3J0X2FkOworCisvKiBMb25nIEFsbG9jYXRpb24gRGVzY3JpcHRvciAoRUNNQSAxNjdyMyA0LzE0LjE0LjIpICovCit0eXBlZGVmIHN0cnVjdAoreworCV9fbGUzMgkJZXh0TGVuZ3RoOworCWxiX2FkZHIJCWV4dExvY2F0aW9uOworCXVpbnQ4X3QJCWltcFVzZVs2XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGxvbmdfYWQ7CisKK3R5cGVkZWYgc3RydWN0Cit7CisJdWludDMyX3QJZXh0TGVuZ3RoOworCWtlcm5lbF9sYl9hZGRyCWV4dExvY2F0aW9uOworCXVpbnQ4X3QJCWltcFVzZVs2XTsKK30ga2VybmVsX2xvbmdfYWQ7CisKKy8qIEV4dGVuZGVkIEFsbG9jYXRpb24gRGVzY3JpcHRvciAoRUNNQSAxNjdyMyA0LzE0LjE0LjMpICovCit0eXBlZGVmIHN0cnVjdAoreworCV9fbGUzMgkJZXh0TGVuZ3RoOworCV9fbGUzMgkJcmVjb3JkZWRMZW5ndGg7CisJX19sZTMyCQlpbmZvcm1hdGlvbkxlbmd0aDsKKwlsYl9hZGRyCQlleHRMb2NhdGlvbjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGV4dF9hZDsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKwl1aW50MzJfdAlleHRMZW5ndGg7CisJdWludDMyX3QJcmVjb3JkZWRMZW5ndGg7CisJdWludDMyX3QJaW5mb3JtYXRpb25MZW5ndGg7CisJa2VybmVsX2xiX2FkZHIJZXh0TG9jYXRpb247Cit9IGtlcm5lbF9leHRfYWQ7CisKKy8qIERlc2NyaXB0b3IgVGFnIChFQ01BIDE2N3IzIDQvNy4yIC0gU2VlIDMvNy4yKSAqLworCisvKiBUYWcgSWRlbnRpZmllciAoRUNNQSAxNjdyMyA0LzcuMi4xKSAqLworI2RlZmluZSBUQUdfSURFTlRfRlNECQkJMHgwMTAwCisjZGVmaW5lIFRBR19JREVOVF9GSUQJCQkweDAxMDEKKyNkZWZpbmUgVEFHX0lERU5UX0FFRAkJCTB4MDEwMgorI2RlZmluZSBUQUdfSURFTlRfSUUJCQkweDAxMDMKKyNkZWZpbmUgVEFHX0lERU5UX1RFCQkJMHgwMTA0CisjZGVmaW5lIFRBR19JREVOVF9GRQkJCTB4MDEwNQorI2RlZmluZSBUQUdfSURFTlRfRUFIRAkJCTB4MDEwNgorI2RlZmluZSBUQUdfSURFTlRfVVNFCQkJMHgwMTA3CisjZGVmaW5lIFRBR19JREVOVF9TQkQJCQkweDAxMDgKKyNkZWZpbmUgVEFHX0lERU5UX1BJRQkJCTB4MDEwOQorI2RlZmluZSBUQUdfSURFTlRfRUZFCQkJMHgwMTBBCisKKy8qIEZpbGUgU2V0IERlc2NyaXB0b3IgKEVDTUEgMTY3cjMgNC8xNC4xKSAqLworc3RydWN0IGZpbGVTZXREZXNjCit7CisJdGFnCQlkZXNjVGFnOworCXRpbWVzdGFtcAlyZWNvcmRpbmdEYXRlQW5kVGltZTsKKwlfX2xlMTYJCWludGVyY2hhbmdlTHZsOworCV9fbGUxNgkJbWF4SW50ZXJjaGFuZ2VMdmw7CisJX19sZTMyCQljaGFyU2V0TGlzdDsKKwlfX2xlMzIJCW1heENoYXJTZXRMaXN0OworCV9fbGUzMgkJZmlsZVNldE51bTsKKwlfX2xlMzIJCWZpbGVTZXREZXNjTnVtOworCWNoYXJzcGVjCWxvZ2ljYWxWb2xJZGVudENoYXJTZXQ7CisJZHN0cmluZwkJbG9naWNhbFZvbElkZW50WzEyOF07CisJY2hhcnNwZWMJZmlsZVNldENoYXJTZXQ7CisJZHN0cmluZwkJZmlsZVNldElkZW50WzMyXTsKKwlkc3RyaW5nCQljb3B5cmlnaHRGaWxlSWRlbnRbMzJdOworCWRzdHJpbmcJCWFic3RyYWN0RmlsZUlkZW50WzMyXTsKKwlsb25nX2FkCQlyb290RGlyZWN0b3J5SUNCOworCXJlZ2lkCQlkb21haW5JZGVudDsKKwlsb25nX2FkCQluZXh0RXh0OworCWxvbmdfYWQJCXN0cmVhbURpcmVjdG9yeUlDQjsKKwl1aW50OF90CQlyZXNlcnZlZFszMl07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogUGFydGl0aW9uIEhlYWRlciBEZXNjcmlwdG9yIChFQ01BIDE2N3IzIDQvMTQuMykgKi8KK3N0cnVjdCBwYXJ0aXRpb25IZWFkZXJEZXNjCit7CisJc2hvcnRfYWQJdW5hbGxvY1NwYWNlVGFibGU7CisJc2hvcnRfYWQJdW5hbGxvY1NwYWNlQml0bWFwOworCXNob3J0X2FkCXBhcnRpdGlvbkludGVncml0eVRhYmxlOworCXNob3J0X2FkCWZyZWVkU3BhY2VUYWJsZTsKKwlzaG9ydF9hZAlmcmVlZFNwYWNlQml0bWFwOworCXVpbnQ4X3QJCXJlc2VydmVkWzg4XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBGaWxlIElkZW50aWZpZXIgRGVzY3JpcHRvciAoRUNNQSAxNjdyMyA0LzE0LjQpICovCitzdHJ1Y3QgZmlsZUlkZW50RGVzYworeworCXRhZwkJZGVzY1RhZzsKKwlfX2xlMTYJCWZpbGVWZXJzaW9uTnVtOworCXVpbnQ4X3QJCWZpbGVDaGFyYWN0ZXJpc3RpY3M7CisJdWludDhfdAkJbGVuZ3RoRmlsZUlkZW50OworCWxvbmdfYWQJCWljYjsKKwlfX2xlMTYJCWxlbmd0aE9mSW1wVXNlOworCXVpbnQ4X3QJCWltcFVzZVswXTsKKwl1aW50OF90CQlmaWxlSWRlbnRbMF07CisJdWludDhfdAkJcGFkZGluZ1swXTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBGaWxlIENoYXJhY3RlcmlzdGljcyAoRUNNQSAxNjdyMyA0LzE0LjQuMykgKi8KKyNkZWZpbmUgRklEX0ZJTEVfQ0hBUl9ISURERU4JCTB4MDEKKyNkZWZpbmUgRklEX0ZJTEVfQ0hBUl9ESVJFQ1RPUlkJCTB4MDIKKyNkZWZpbmUgRklEX0ZJTEVfQ0hBUl9ERUxFVEVECQkweDA0CisjZGVmaW5lIEZJRF9GSUxFX0NIQVJfUEFSRU5UCQkweDA4CisjZGVmaW5lIEZJRF9GSUxFX0NIQVJfTUVUQURBVEEJCTB4MTAKKworLyogQWxsb2NhdGlvbiBFeHQgRGVzY3JpcHRvciAoRUNNQSAxNjdyMyA0LzE0LjUpICovCitzdHJ1Y3QgYWxsb2NFeHREZXNjCit7CisJdGFnCQlkZXNjVGFnOworCV9fbGUzMgkJcHJldmlvdXNBbGxvY0V4dExvY2F0aW9uOworCV9fbGUzMgkJbGVuZ3RoQWxsb2NEZXNjczsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBJQ0IgVGFnIChFQ01BIDE2N3IzIDQvMTQuNikgKi8KK3R5cGVkZWYgc3RydWN0Cit7CisJX19sZTMyCQlwcmlvclJlY29yZGVkTnVtRGlyZWN0RW50cmllczsKKwlfX2xlMTYJCXN0cmF0ZWd5VHlwZTsKKwlfX2xlMTYJCXN0cmF0ZWd5UGFyYW1ldGVyOworCV9fbGUxNgkJbnVtRW50cmllczsKKwl1aW50OF90CQlyZXNlcnZlZDsKKwl1aW50OF90CQlmaWxlVHlwZTsKKwlsYl9hZGRyCQlwYXJlbnRJQ0JMb2NhdGlvbjsKKwlfX2xlMTYJCWZsYWdzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgaWNidGFnOworCisvKiBTdHJhdGVneSBUeXBlIChFQ01BIDE2N3IzIDQvMTQuNi4yKSAqLworI2RlZmluZSBJQ0JUQUdfU1RSQVRFR1lfVFlQRV9VTkRFRgkweDAwMDAKKyNkZWZpbmUgSUNCVEFHX1NUUkFURUdZX1RZUEVfMQkJMHgwMDAxCisjZGVmaW5lIElDQlRBR19TVFJBVEVHWV9UWVBFXzIJCTB4MDAwMgorI2RlZmluZSBJQ0JUQUdfU1RSQVRFR1lfVFlQRV8zCQkweDAwMDMKKyNkZWZpbmUgSUNCVEFHX1NUUkFURUdZX1RZUEVfNAkJMHgwMDA0CisKKy8qIEZpbGUgVHlwZSAoRUNNQSAxNjdyMyA0LzE0LjYuNikgKi8KKyNkZWZpbmUgSUNCVEFHX0ZJTEVfVFlQRV9VTkRFRgkJMHgwMAorI2RlZmluZSBJQ0JUQUdfRklMRV9UWVBFX1VTRQkJMHgwMQorI2RlZmluZSBJQ0JUQUdfRklMRV9UWVBFX1BJRQkJMHgwMgorI2RlZmluZSBJQ0JUQUdfRklMRV9UWVBFX0lFCQkweDAzCisjZGVmaW5lIElDQlRBR19GSUxFX1RZUEVfRElSRUNUT1JZCTB4MDQKKyNkZWZpbmUgSUNCVEFHX0ZJTEVfVFlQRV9SRUdVTEFSCTB4MDUKKyNkZWZpbmUgSUNCVEFHX0ZJTEVfVFlQRV9CTE9DSwkJMHgwNgorI2RlZmluZSBJQ0JUQUdfRklMRV9UWVBFX0NIQVIJCTB4MDcKKyNkZWZpbmUgSUNCVEFHX0ZJTEVfVFlQRV9FQQkJMHgwOAorI2RlZmluZSBJQ0JUQUdfRklMRV9UWVBFX0ZJRk8JCTB4MDkKKyNkZWZpbmUgSUNCVEFHX0ZJTEVfVFlQRV9TT0NLRVQJCTB4MEEKKyNkZWZpbmUgSUNCVEFHX0ZJTEVfVFlQRV9URQkJMHgwQgorI2RlZmluZSBJQ0JUQUdfRklMRV9UWVBFX1NZTUxJTksJMHgwQworI2RlZmluZSBJQ0JUQUdfRklMRV9UWVBFX1NUUkVBTURJUgkweDBECisKKy8qIEZsYWdzIChFQ01BIDE2N3IzIDQvMTQuNi44KSAqLworI2RlZmluZSBJQ0JUQUdfRkxBR19BRF9NQVNLCQkweDAwMDcKKyNkZWZpbmUgSUNCVEFHX0ZMQUdfQURfU0hPUlQJCTB4MDAwMAorI2RlZmluZSBJQ0JUQUdfRkxBR19BRF9MT05HCQkweDAwMDEKKyNkZWZpbmUgSUNCVEFHX0ZMQUdfQURfRVhURU5ERUQJCTB4MDAwMgorI2RlZmluZSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IJCTB4MDAwMworI2RlZmluZSBJQ0JUQUdfRkxBR19TT1JURUQJCTB4MDAwOAorI2RlZmluZSBJQ0JUQUdfRkxBR19OT05SRUxPQ0FUQUJMRQkweDAwMTAKKyNkZWZpbmUgSUNCVEFHX0ZMQUdfQVJDSElWRQkJMHgwMDIwCisjZGVmaW5lIElDQlRBR19GTEFHX1NFVFVJRAkJMHgwMDQwCisjZGVmaW5lIElDQlRBR19GTEFHX1NFVEdJRAkJMHgwMDgwCisjZGVmaW5lIElDQlRBR19GTEFHX1NUSUNLWQkJMHgwMTAwCisjZGVmaW5lIElDQlRBR19GTEFHX0NPTlRJR1VPVVMJCTB4MDIwMAorI2RlZmluZSBJQ0JUQUdfRkxBR19TWVNURU0JCTB4MDQwMAorI2RlZmluZSBJQ0JUQUdfRkxBR19UUkFOU0ZPUk1FRAkJMHgwODAwCisjZGVmaW5lIElDQlRBR19GTEFHX01VTFRJVkVSU0lPTlMJMHgxMDAwCisjZGVmaW5lIElDQlRBR19GTEFHX1NUUkVBTQkJMHgyMDAwCisKKy8qIEluZGlyZWN0IEVudHJ5IChFQ01BIDE2N3IzIDQvMTQuNykgKi8KK3N0cnVjdCBpbmRpcmVjdEVudHJ5Cit7CisJdGFnCQlkZXNjVGFnOworCWljYnRhZwkJaWNiVGFnOworCWxvbmdfYWQJCWluZGlyZWN0SUNCOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFRlcm1pbmFsIEVudHJ5IChFQ01BIDE2N3IzIDQvMTQuOCkgKi8KK3N0cnVjdCB0ZXJtaW5hbEVudHJ5Cit7CisJdGFnCQlkZXNjVGFnOworCWljYnRhZwkJaWNiVGFnOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIEZpbGUgRW50cnkgKEVDTUEgMTY3cjMgNC8xNC45KSAqLworc3RydWN0IGZpbGVFbnRyeQoreworCXRhZwkJZGVzY1RhZzsKKwlpY2J0YWcJCWljYlRhZzsKKwlfX2xlMzIJCXVpZDsKKwlfX2xlMzIJCWdpZDsKKwlfX2xlMzIJCXBlcm1pc3Npb25zOworCV9fbGUxNgkJZmlsZUxpbmtDb3VudDsKKwl1aW50OF90CQlyZWNvcmRGb3JtYXQ7CisJdWludDhfdAkJcmVjb3JkRGlzcGxheUF0dHI7CisJX19sZTMyCQlyZWNvcmRMZW5ndGg7CisJX19sZTY0CQlpbmZvcm1hdGlvbkxlbmd0aDsKKwlfX2xlNjQJCWxvZ2ljYWxCbG9ja3NSZWNvcmRlZDsKKwl0aW1lc3RhbXAJYWNjZXNzVGltZTsKKwl0aW1lc3RhbXAJbW9kaWZpY2F0aW9uVGltZTsKKwl0aW1lc3RhbXAJYXR0clRpbWU7CisJX19sZTMyCQljaGVja3BvaW50OworCWxvbmdfYWQJCWV4dGVuZGVkQXR0cklDQjsKKwlyZWdpZAkJaW1wSWRlbnQ7CisJX19sZTY0CQl1bmlxdWVJRDsKKwlfX2xlMzIJCWxlbmd0aEV4dGVuZGVkQXR0cjsKKwlfX2xlMzIJCWxlbmd0aEFsbG9jRGVzY3M7CisJdWludDhfdAkJZXh0ZW5kZWRBdHRyWzBdOworCXVpbnQ4X3QJCWFsbG9jRGVzY3NbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogUGVybWlzc2lvbnMgKEVDTUEgMTY3cjMgNC8xNC45LjUpICovCisjZGVmaW5lIEZFX1BFUk1fT19FWEVDCQkJMHgwMDAwMDAwMVUKKyNkZWZpbmUgRkVfUEVSTV9PX1dSSVRFCQkJMHgwMDAwMDAwMlUKKyNkZWZpbmUgRkVfUEVSTV9PX1JFQUQJCQkweDAwMDAwMDA0VQorI2RlZmluZSBGRV9QRVJNX09fQ0hBVFRSCQkweDAwMDAwMDA4VQorI2RlZmluZSBGRV9QRVJNX09fREVMRVRFCQkweDAwMDAwMDEwVQorI2RlZmluZSBGRV9QRVJNX0dfRVhFQwkJCTB4MDAwMDAwMjBVCisjZGVmaW5lIEZFX1BFUk1fR19XUklURQkJCTB4MDAwMDAwNDBVCisjZGVmaW5lIEZFX1BFUk1fR19SRUFECQkJMHgwMDAwMDA4MFUKKyNkZWZpbmUgRkVfUEVSTV9HX0NIQVRUUgkJMHgwMDAwMDEwMFUKKyNkZWZpbmUgRkVfUEVSTV9HX0RFTEVURQkJMHgwMDAwMDIwMFUKKyNkZWZpbmUgRkVfUEVSTV9VX0VYRUMJCQkweDAwMDAwNDAwVQorI2RlZmluZSBGRV9QRVJNX1VfV1JJVEUJCQkweDAwMDAwODAwVQorI2RlZmluZSBGRV9QRVJNX1VfUkVBRAkJCTB4MDAwMDEwMDBVCisjZGVmaW5lIEZFX1BFUk1fVV9DSEFUVFIJCTB4MDAwMDIwMDBVCisjZGVmaW5lIEZFX1BFUk1fVV9ERUxFVEUJCTB4MDAwMDQwMDBVCisKKy8qIFJlY29yZCBGb3JtYXQgKEVDTUEgMTY3cjMgNC8xNC45LjcpICovCisjZGVmaW5lIEZFX1JFQ09SRF9GTVRfVU5ERUYJCTB4MDAKKyNkZWZpbmUgRkVfUkVDT1JEX0ZNVF9GSVhFRF9QQUQJCTB4MDEKKyNkZWZpbmUgRkVfUkVDT1JEX0ZNVF9GSVhFRAkJMHgwMgorI2RlZmluZSBGRV9SRUNPUkRfRk1UX1ZBUklBQkxFOAkJMHgwMworI2RlZmluZSBGRV9SRUNPUkRfRk1UX1ZBUklBQkxFMTYJMHgwNAorI2RlZmluZSBGRV9SRUNPUkRfRk1UX1ZBUklBQkxFMTZfTVNCCTB4MDUKKyNkZWZpbmUgRkVfUkVDT1JEX0ZNVF9WQVJJQUJMRTMyCTB4MDYKKyNkZWZpbmUgRkVfUkVDT1JEX0ZNVF9QUklOVAkJMHgwNworI2RlZmluZSBGRV9SRUNPUkRfRk1UX0xGCQkweDA4CisjZGVmaW5lIEZFX1JFQ09SRF9GTVRfQ1IJCTB4MDkKKyNkZWZpbmUgRkVfUkVDT1JEX0ZNVF9DUkxGCQkweDBBCisjZGVmaW5lIEZFX1JFQ09SRF9GTVRfTEZDUgkJMHgwQgorCisvKiBSZWNvcmQgRGlzcGxheSBBdHRyaWJ1dGVzIChFQ01BIDE2N3IzIDQvMTQuOS44KSAqLworI2RlZmluZSBGRV9SRUNPUkRfRElTUExBWV9BVFRSX1VOREVGCTB4MDAKKyNkZWZpbmUgRkVfUkVDT1JEX0RJU1BMQVlfQVRUUl8xCTB4MDEKKyNkZWZpbmUgRkVfUkVDT1JEX0RJU1BMQVlfQVRUUl8yCTB4MDIKKyNkZWZpbmUgRkVfUkVDT1JEX0RJU1BMQVlfQVRUUl8zCTB4MDMKKworLyogRXh0ZW5kZWQgQXR0cmlidXRlIEhlYWRlciBEZXNjcmlwdG9yIChFQ01BIDE2N3IzIDQvMTQuMTAuMSkgKi8KK3N0cnVjdCBleHRlbmRlZEF0dHJIZWFkZXJEZXNjCit7CisJdGFnCQlkZXNjVGFnOworCV9fbGUzMgkJaW1wQXR0ckxvY2F0aW9uOworCV9fbGUzMgkJYXBwQXR0ckxvY2F0aW9uOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIEdlbmVyaWMgRm9ybWF0IChFQ01BIDE2N3IzIDQvMTQuMTAuMikgKi8KK3N0cnVjdCBnZW5lcmljRm9ybWF0Cit7CisJX19sZTMyCQlhdHRyVHlwZTsKKwl1aW50OF90CQlhdHRyU3VidHlwZTsKKwl1aW50OF90CQlyZXNlcnZlZFszXTsKKwlfX2xlMzIJCWF0dHJMZW5ndGg7CisJdWludDhfdAkJYXR0ckRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogQ2hhcmFjdGVyIFNldCBJbmZvcm1hdGlvbiAoRUNNQSAxNjdyMyA0LzE0LjEwLjMpICovCitzdHJ1Y3QgY2hhclNldEluZm8KK3sKKwlfX2xlMzIJCWF0dHJUeXBlOworCXVpbnQ4X3QJCWF0dHJTdWJ0eXBlOworCXVpbnQ4X3QJCXJlc2VydmVkWzNdOworCV9fbGUzMgkJYXR0ckxlbmd0aDsKKwlfX2xlMzIJCWVzY2FwZVNlcUxlbmd0aDsKKwl1aW50OF90CQljaGFyU2V0VHlwZTsKKwl1aW50OF90CQllc2NhcGVTZXFbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogQWx0ZXJuYXRlIFBlcm1pc3Npb25zIChFQ01BIDE2N3IzIDQvMTQuMTAuNCkgKi8KK3N0cnVjdCBhbHRQZXJtcworeworCV9fbGUzMgkJYXR0clR5cGU7CisJdWludDhfdAkJYXR0clN1YnR5cGU7CisJdWludDhfdAkJcmVzZXJ2ZWRbM107CisJX19sZTMyCQlhdHRyTGVuZ3RoOworCV9fbGUxNgkJb3duZXJJZGVudDsKKwlfX2xlMTYJCWdyb3VwSWRlbnQ7CisJX19sZTE2CQlwZXJtaXNzaW9uOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIEZpbGUgVGltZXMgRXh0ZW5kZWQgQXR0cmlidXRlIChFQ01BIDE2N3IzIDQvMTQuMTAuNSkgKi8KK3N0cnVjdCBmaWxlVGltZXNFeHRBdHRyCit7CisJX19sZTMyCQlhdHRyVHlwZTsKKwl1aW50OF90CQlhdHRyU3VidHlwZTsKKwl1aW50OF90CQlyZXNlcnZlZFszXTsKKwlfX2xlMzIJCWF0dHJMZW5ndGg7CisJX19sZTMyCQlkYXRhTGVuZ3RoOworCV9fbGUzMgkJZmlsZVRpbWVFeGlzdGVuY2U7CisJdWludDhfdAkJZmlsZVRpbWVzOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIEZpbGVUaW1lRXhpc3RlbmNlIChFQ01BIDE2N3IzIDQvMTQuMTAuNS42KSAqLworI2RlZmluZSBGVEVfQ1JFQVRJT04JCQkweDAwMDAwMDAxCisjZGVmaW5lIEZURV9ERUxFVElPTgkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgRlRFX0VGRkVDVElWRQkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgRlRFX0JBQ0tVUAkJCTB4MDAwMDAwMDIKKworLyogSW5mb3JtYXRpb24gVGltZXMgRXh0ZW5kZWQgQXR0cmlidXRlIChFQ01BIDE2N3IzIDQvMTQuMTAuNikgKi8KK3N0cnVjdCBpbmZvVGltZXNFeHRBdHRyCit7CisJX19sZTMyCQlhdHRyVHlwZTsKKwl1aW50OF90CQlhdHRyU3VidHlwZTsKKwl1aW50OF90CQlyZXNlcnZlZFszXTsKKwlfX2xlMzIJCWF0dHJMZW5ndGg7CisJX19sZTMyCQlkYXRhTGVuZ3RoOworCV9fbGUzMgkJaW5mb1RpbWVFeGlzdGVuY2U7CisJdWludDhfdAkJaW5mb1RpbWVzWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIERldmljZSBTcGVjaWZpY2F0aW9uIChFQ01BIDE2N3IzIDQvMTQuMTAuNykgKi8KK3N0cnVjdCBkZXZpY2VTcGVjCit7CisJX19sZTMyCQlhdHRyVHlwZTsKKwl1aW50OF90CQlhdHRyU3VidHlwZTsKKwl1aW50OF90CQlyZXNlcnZlZFszXTsKKwlfX2xlMzIJCWF0dHJMZW5ndGg7CisJX19sZTMyCQlpbXBVc2VMZW5ndGg7CisJX19sZTMyCQltYWpvckRldmljZUlkZW50OworCV9fbGUzMgkJbWlub3JEZXZpY2VJZGVudDsKKwl1aW50OF90CQlpbXBVc2VbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogSW1wbGVtZW50YXRpb24gVXNlIEV4dGVuZGVkIEF0dHIgKEVDTUEgMTY3cjMgNC8xNC4xMC44KSAqLworc3RydWN0IGltcFVzZUV4dEF0dHIKK3sKKwlfX2xlMzIJCWF0dHJUeXBlOworCXVpbnQ4X3QJCWF0dHJTdWJ0eXBlOworCXVpbnQ4X3QJCXJlc2VydmVkWzNdOworCV9fbGUzMgkJYXR0ckxlbmd0aDsKKwlfX2xlMzIJCWltcFVzZUxlbmd0aDsKKwlyZWdpZAkJaW1wSWRlbnQ7CisJdWludDhfdAkJaW1wVXNlWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIEFwcGxpY2F0aW9uIFVzZSBFeHRlbmRlZCBBdHRyaWJ1dGUgKEVDTUEgMTY3cjMgNC8xNC4xMC45KSAqLworc3RydWN0IGFwcFVzZUV4dEF0dHIKK3sKKwlfX2xlMzIJCWF0dHJUeXBlOworCXVpbnQ4X3QJCWF0dHJTdWJ0eXBlOworCXVpbnQ4X3QJCXJlc2VydmVkWzNdOworCV9fbGUzMgkJYXR0ckxlbmd0aDsKKwlfX2xlMzIJCWFwcFVzZUxlbmd0aDsKKwlyZWdpZAkJYXBwSWRlbnQ7CisJdWludDhfdAkJYXBwVXNlWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKyNkZWZpbmUgRVhUQVRUUl9DSEFSX1NFVAkJMQorI2RlZmluZSBFWFRBVFRSX0FMVF9QRVJNUwkJMworI2RlZmluZSBFWFRBVFRSX0ZJTEVfVElNRVMJCTUKKyNkZWZpbmUgRVhUQVRUUl9JTkZPX1RJTUVTCQk2CisjZGVmaW5lIEVYVEFUVFJfREVWX1NQRUMJCTEyCisjZGVmaW5lIEVYVEFUVFJfSU1QX1VTRQkJCTIwNDgKKyNkZWZpbmUgRVhUQVRUUl9BUFBfVVNFCQkJNjU1MzYKKworCisvKiBVbmFsbG9jYXRlZCBTcGFjZSBFbnRyeSAoRUNNQSAxNjdyMyA0LzE0LjExKSAqLworc3RydWN0IHVuYWxsb2NTcGFjZUVudHJ5Cit7CisJdGFnCQlkZXNjVGFnOworCWljYnRhZwkJaWNiVGFnOworCV9fbGUzMgkJbGVuZ3RoQWxsb2NEZXNjczsKKwl1aW50OF90CQlhbGxvY0Rlc2NzWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFNwYWNlIEJpdG1hcCBEZXNjcmlwdG9yIChFQ01BIDE2N3IzIDQvMTQuMTIpICovCitzdHJ1Y3Qgc3BhY2VCaXRtYXBEZXNjCit7CisJdGFnCQlkZXNjVGFnOworCV9fbGUzMgkJbnVtT2ZCaXRzOworCV9fbGUzMgkJbnVtT2ZCeXRlczsKKwl1aW50OF90CQliaXRtYXBbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogUGFydGl0aW9uIEludGVncml0eSBFbnRyeSAoRUNNQSAxNjdyMyA0LzE0LjEzKSAqLworc3RydWN0IHBhcnRpdGlvbkludGVncml0eUVudHJ5Cit7CisJdGFnCQlkZXNjVGFnOworCWljYnRhZwkJaWNiVGFnOworCXRpbWVzdGFtcAlyZWNvcmRpbmdEYXRlQW5kVGltZTsKKwl1aW50OF90CQlpbnRlZ3JpdHlUeXBlOworCXVpbnQ4X3QJCXJlc2VydmVkWzE3NV07CisJcmVnaWQJCWltcElkZW50OworCXVpbnQ4X3QJCWltcFVzZVsyNTZdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFNob3J0IEFsbG9jYXRpb24gRGVzY3JpcHRvciAoRUNNQSAxNjdyMyA0LzE0LjE0LjEpICovCisKKy8qIEV4dGVudCBMZW5ndGggKEVDTUEgMTY3cjMgNC8xNC4xNC4xLjEpICovCisjZGVmaW5lIEVYVF9SRUNPUkRFRF9BTExPQ0FURUQJCTB4MDAwMDAwMDAKKyNkZWZpbmUgRVhUX05PVF9SRUNPUkRFRF9BTExPQ0FURUQJMHg0MDAwMDAwMAorI2RlZmluZSBFWFRfTk9UX1JFQ09SREVEX05PVF9BTExPQ0FURUQJMHg4MDAwMDAwMAorI2RlZmluZSBFWFRfTkVYVF9FWFRFTlRfQUxMT0NERUNTCTB4QzAwMDAwMDAKKworLyogTG9uZyBBbGxvY2F0aW9uIERlc2NyaXB0b3IgKEVDTUEgMTY3cjMgNC8xNC4xNC4yKSAqLworCisvKiBFeHRlbmRlZCBBbGxvY2F0aW9uIERlc2NyaXB0b3IgKEVDTUEgMTY3cjMgNC8xNC4xNC4zKSAqLworCisvKiBMb2dpY2FsIFZvbHVtZSBIZWFkZXIgRGVzY3JpcHRvciAoRUNNQSAxNjdyMyA0LzE0LjE1KSAqLworc3RydWN0IGxvZ2ljYWxWb2xIZWFkZXJEZXNjCit7CisJX19sZTY0CQl1bmlxdWVJRDsKKwl1aW50OF90CQlyZXNlcnZlZFsyNF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogUGF0aCBDb21wb25lbnQgKEVDTUEgMTY3cjMgNC8xNC4xNi4xKSAqLworc3RydWN0IHBhdGhDb21wb25lbnQKK3sKKwl1aW50OF90CQljb21wb25lbnRUeXBlOworCXVpbnQ4X3QJCWxlbmd0aENvbXBvbmVudElkZW50OworCV9fbGUxNgkJY29tcG9uZW50RmlsZVZlcnNpb25OdW07CisJZHN0cmluZwkJY29tcG9uZW50SWRlbnRbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogRmlsZSBFbnRyeSAoRUNNQSAxNjdyMyA0LzE0LjE3KSAqLworc3RydWN0IGV4dGVuZGVkRmlsZUVudHJ5Cit7CisJdGFnCQlkZXNjVGFnOworCWljYnRhZwkJaWNiVGFnOworCV9fbGUzMgkJdWlkOworCV9fbGUzMgkJZ2lkOworCV9fbGUzMgkJcGVybWlzc2lvbnM7CisJX19sZTE2CQlmaWxlTGlua0NvdW50OworCXVpbnQ4X3QJCXJlY29yZEZvcm1hdDsKKwl1aW50OF90CQlyZWNvcmREaXNwbGF5QXR0cjsKKwlfX2xlMzIJCXJlY29yZExlbmd0aDsKKwlfX2xlNjQJCWluZm9ybWF0aW9uTGVuZ3RoOworCV9fbGU2NAkJb2JqZWN0U2l6ZTsKKwlfX2xlNjQJCWxvZ2ljYWxCbG9ja3NSZWNvcmRlZDsKKwl0aW1lc3RhbXAJYWNjZXNzVGltZTsKKwl0aW1lc3RhbXAJbW9kaWZpY2F0aW9uVGltZTsKKwl0aW1lc3RhbXAJY3JlYXRlVGltZTsKKwl0aW1lc3RhbXAJYXR0clRpbWU7CisJX19sZTMyCQljaGVja3BvaW50OworCV9fbGUzMgkJcmVzZXJ2ZWQ7CisJbG9uZ19hZAkJZXh0ZW5kZWRBdHRySUNCOworCWxvbmdfYWQJCXN0cmVhbURpcmVjdG9yeUlDQjsKKwlyZWdpZAkJaW1wSWRlbnQ7CisJX19sZTY0CQl1bmlxdWVJRDsKKwlfX2xlMzIJCWxlbmd0aEV4dGVuZGVkQXR0cjsKKwlfX2xlMzIJCWxlbmd0aEFsbG9jRGVzY3M7CisJdWludDhfdAkJZXh0ZW5kZWRBdHRyWzBdOworCXVpbnQ4X3QJCWFsbG9jRGVzY3NbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2VuZGlmIC8qIF9FQ01BXzE2N19IICovCmRpZmYgLS1naXQgYS9mcy91ZGYvZmlsZS5jIGIvZnMvdWRmL2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmFhNDE3Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvdWRmL2ZpbGUuYwpAQCAtMCwwICsxLDI3MCBAQAorLyoKKyAqIGZpbGUuYworICoKKyAqIFBVUlBPU0UKKyAqICBGaWxlIGhhbmRsaW5nIHJvdXRpbmVzIGZvciB0aGUgT1NUQS1VREYodG0pIGZpbGVzeXN0ZW0uCisgKgorICogQ09OVEFDVFMKKyAqICBFLW1haWwgcmVnYXJkaW5nIGFueSBwb3J0aW9uIG9mIHRoZSBMaW51eCBVREYgZmlsZSBzeXN0ZW0gc2hvdWxkIGJlCisgKiAgZGlyZWN0ZWQgdG8gdGhlIGRldmVsb3BtZW50IHRlYW0gbWFpbGluZyBsaXN0IChydW4gYnkgbWFqb3Jkb21vKToKKyAqICAgIGxpbnV4X3VkZkBocGVzanJvLmZjLmhwLmNvbQorICoKKyAqIENPUFlSSUdIVAorICogIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgKEdQTCkuIENvcGllcyBvZiB0aGUgR1BMIGNhbiBiZSBvYnRhaW5lZCBmcm9tOgorICogICAgZnRwOi8vcHJlcC5haS5taXQuZWR1L3B1Yi9nbnUvR1BMCisgKiAgRWFjaCBjb250cmlidXRpbmcgYXV0aG9yIHJldGFpbnMgYWxsIHJpZ2h0cyB0byB0aGVpciBvd24gd29yay4KKyAqCisgKiAgKEMpIDE5OTgtMTk5OSBEYXZlIEJveW50b24KKyAqICAoQykgMTk5OC0yMDA0IEJlbiBGZW5uZW1hCisgKiAgKEMpIDE5OTktMjAwMCBTdGVsaWFzIENvbXB1dGluZyBJbmMKKyAqCisgKiBISVNUT1JZCisgKgorICogIDEwLzAyLzk4IGRnYiAgQXR0ZW1wdCB0byBpbnRlZ3JhdGUgaW50byB1ZGYubworICogIDEwLzA3Lzk4ICAgICAgU3dpdGNoZWQgdG8gdXNpbmcgZ2VuZXJpY19yZWFkcGFnZSwgZXRjLiwgbGlrZSBpc29mcworICogICAgICAgICAgICAgICAgQW5kIGl0IHdvcmtzIQorICogIDEyLzA2Lzk4IGJsZiAgQWRkZWQgdWRmX2ZpbGVfcmVhZC4gdXNlcyBnZW5lcmljX2ZpbGVfcmVhZCBmb3IgYWxsIGNhc2VzIGJ1dAorICogICAgICAgICAgICAgICAgSUNCVEFHX0ZMQUdfQURfSU5fSUNCLgorICogIDA0LzA2Lzk5ICAgICAgNjQgYml0IGZpbGUgaGFuZGxpbmcgb24gMzIgYml0IHN5c3RlbXMgdGFrZW4gZnJvbSBleHQyIGZpbGUuYworICogIDA1LzEyLzk5ICAgICAgUHJlbGltaW5hcnkgZmlsZSB3cml0ZSBzdXBwb3J0CisgKi8KKworI2luY2x1ZGUgInVkZmRlY2wuaCIKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VkZl9mcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+IC8qIG1lbXNldCAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKworI2luY2x1ZGUgInVkZl9pLmgiCisjaW5jbHVkZSAidWRmX3NiLmgiCisKK3N0YXRpYyBpbnQgdWRmX2FkaW5pY2JfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICogcGFnZSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwljaGFyICprYWRkcjsKKworCWlmICghUGFnZUxvY2tlZChwYWdlKSkKKwkJUEFHRV9CVUcocGFnZSk7CisKKwlrYWRkciA9IGttYXAocGFnZSk7CisJbWVtc2V0KGthZGRyLCAwLCBQQUdFX0NBQ0hFX1NJWkUpOworCW1lbWNweShrYWRkciwgVURGX0lfREFUQShpbm9kZSkgKyBVREZfSV9MRU5FQVRUUihpbm9kZSksIGlub2RlLT5pX3NpemUpOworCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwlrdW5tYXAocGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdWRmX2FkaW5pY2Jfd3JpdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwljaGFyICprYWRkcjsKKworCWlmICghUGFnZUxvY2tlZChwYWdlKSkKKwkJUEFHRV9CVUcocGFnZSk7CisKKwlrYWRkciA9IGttYXAocGFnZSk7CisJbWVtY3B5KFVERl9JX0RBVEEoaW5vZGUpICsgVURGX0lfTEVORUFUVFIoaW5vZGUpLCBrYWRkciwgaW5vZGUtPmlfc2l6ZSk7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCWt1bm1hcChwYWdlKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1ZGZfYWRpbmljYl9wcmVwYXJlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCB0bykKK3sKKwlrbWFwKHBhZ2UpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVkZl9hZGluaWNiX2NvbW1pdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgdG8pCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJY2hhciAqa2FkZHIgPSBwYWdlX2FkZHJlc3MocGFnZSk7CisKKwltZW1jcHkoVURGX0lfREFUQShpbm9kZSkgKyBVREZfSV9MRU5FQVRUUihpbm9kZSkgKyBvZmZzZXQsCisJCWthZGRyICsgb2Zmc2V0LCB0byAtIG9mZnNldCk7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCWt1bm1hcChwYWdlKTsKKwkvKiBvbmx5IG9uZSBwYWdlIGhlcmUgKi8KKwlpZiAodG8gPiBpbm9kZS0+aV9zaXplKQorCQlpbm9kZS0+aV9zaXplID0gdG87CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgdWRmX2FkaW5pY2JfYW9wcyA9IHsKKwkucmVhZHBhZ2UJCT0gdWRmX2FkaW5pY2JfcmVhZHBhZ2UsCisJLndyaXRlcGFnZQkJPSB1ZGZfYWRpbmljYl93cml0ZXBhZ2UsCisJLnN5bmNfcGFnZQkJPSBibG9ja19zeW5jX3BhZ2UsCisJLnByZXBhcmVfd3JpdGUJCT0gdWRmX2FkaW5pY2JfcHJlcGFyZV93cml0ZSwKKwkuY29tbWl0X3dyaXRlCQk9IHVkZl9hZGluaWNiX2NvbW1pdF93cml0ZSwKK307CisKK3N0YXRpYyBzc2l6ZV90IHVkZl9maWxlX3dyaXRlKHN0cnVjdCBmaWxlICogZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKiBidWYsCisJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3NpemVfdCByZXR2YWw7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlOworCWludCBlcnIsIHBvczsKKworCWlmIChVREZfSV9BTExPQ1RZUEUoaW5vZGUpID09IElDQlRBR19GTEFHX0FEX0lOX0lDQikKKwl7CisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19BUFBFTkQpCisJCQlwb3MgPSBpbm9kZS0+aV9zaXplOworCQllbHNlCisJCQlwb3MgPSAqcHBvczsKKworCQlpZiAoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIDwgKHVkZl9maWxlX2VudHJ5X2FsbG9jX29mZnNldChpbm9kZSkgKworCQkJcG9zICsgY291bnQpKQorCQl7CisJCQl1ZGZfZXhwYW5kX2ZpbGVfYWRpbmljYihpbm9kZSwgcG9zICsgY291bnQsICZlcnIpOworCQkJaWYgKFVERl9JX0FMTE9DVFlQRShpbm9kZSkgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKQorCQkJeworCQkJCXVkZl9kZWJ1ZygidWRmX2V4cGFuZF9hZGluaWNiOiBlcnI9JWRcbiIsIGVycik7CisJCQkJcmV0dXJuIGVycjsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWlmIChwb3MgKyBjb3VudCA+IGlub2RlLT5pX3NpemUpCisJCQkJVURGX0lfTEVOQUxMT0MoaW5vZGUpID0gcG9zICsgY291bnQ7CisJCQllbHNlCisJCQkJVURGX0lfTEVOQUxMT0MoaW5vZGUpID0gaW5vZGUtPmlfc2l6ZTsKKwkJfQorCX0KKworCXJldHZhbCA9IGdlbmVyaWNfZmlsZV93cml0ZShmaWxlLCBidWYsIGNvdW50LCBwcG9zKTsKKworCWlmIChyZXR2YWwgPiAwKQorCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogdWRmX2lvY3RsCisgKgorICogUFVSUE9TRQorICoJSXNzdWUgYW4gaW9jdGwuCisgKgorICogREVTQ1JJUFRJT04KKyAqCU9wdGlvbmFsIC0gc3lzX2lvY3RsKCkgd2lsbCByZXR1cm4gLUVOT1RUWSBpZiB0aGlzIHJvdXRpbmUgaXMgbm90CisgKglhdmFpbGFibGUsIGFuZCB0aGUgaW9jdGwgY2Fubm90IGJlIGhhbmRsZWQgd2l0aG91dCBmaWxlc3lzdGVtIGhlbHAuCisgKgorICoJc3lzX2lvY3RsKCkgaGFuZGxlcyB0aGVzZSBpb2N0bHMgdGhhdCBhcHBseSBvbmx5IHRvIHJlZ3VsYXIgZmlsZXM6CisgKgkJRklCTUFQIFtyZXF1aXJlcyB1ZGZfYmxvY2tfbWFwKCldLCBGSUdFVEJTWiwgRklPTlJFQUQKKyAqCVRoZXNlIGlvY3RscyBhcmUgYWxzbyBoYW5kbGVkIGJ5IHN5c19pb2N0bCgpOgorICoJCUZJT0NMRVgsIEZJT05DTEVYLCBGSU9OQklPLCBGSU9BU1lOQworICoJQWxsIG90aGVyIGlvY3RscyBhcmUgcGFzc2VkIHRvIHRoZSBmaWxlc3lzdGVtLgorICoKKyAqCVJlZmVyIHRvIHN5c19pb2N0bCgpIGluIGZzL2lvY3RsLmMKKyAqCXN5c19pb2N0bCgpIC0+IC4KKyAqCisgKiBQUkUtQ09ORElUSU9OUworICoJaW5vZGUJCQlQb2ludGVyIHRvIGlub2RlIHRoYXQgaW9jdGwgd2FzIGlzc3VlZCBvbi4KKyAqCWZpbHAJCQlQb2ludGVyIHRvIGZpbGUgdGhhdCBpb2N0bCB3YXMgaXNzdWVkIG9uLgorICoJY21kCQkJVGhlIGlvY3RsIGNvbW1hbmQuCisgKglhcmcJCQlUaGUgaW9jdGwgYXJndW1lbnQgW2NhbiBiZSBpbnRlcnByZXRlZCBhcyBhCisgKgkJCQl1c2VyLXNwYWNlIHBvaW50ZXIgaWYgZGVzaXJlZF0uCisgKgorICogUE9TVC1DT05ESVRJT05TCisgKgk8cmV0dXJuPgkJU3VjY2VzcyAoPj0wKSBvciBhbiBlcnJvciBjb2RlICg8PTApIHRoYXQKKyAqCQkJCXN5c19pb2N0bCgpIHdpbGwgcmV0dXJuLgorICoKKyAqIEhJU1RPUlkKKyAqCUp1bHkgMSwgMTk5NyAtIEFuZHJldyBFLiBNaWxlc2tpCisgKglXcml0dGVuLCB0ZXN0ZWQsIGFuZCByZWxlYXNlZC4KKyAqLworaW50IHVkZl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgaW50IGNtZCwKKwl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgcmVzdWx0ID0gLUVJTlZBTDsKKworCWlmICggcGVybWlzc2lvbihpbm9kZSwgTUFZX1JFQUQsIE5VTEwpICE9IDAgKQorCXsKKwkJdWRmX2RlYnVnKCJubyBwZXJtaXNzaW9uIHRvIGFjY2VzcyBpbm9kZSAlbHVcbiIsCisJCQkJCQlpbm9kZS0+aV9pbm8pOworCQlyZXR1cm4gLUVQRVJNOworCX0KKworCWlmICggIWFyZyApCisJeworCQl1ZGZfZGVidWcoImludmFsaWQgYXJndW1lbnQgdG8gdWRmX2lvY3RsXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChjbWQpCisJeworCQljYXNlIFVERl9HRVRWT0xJREVOVDoKKwkJCXJldHVybiBjb3B5X3RvX3VzZXIoKGNoYXIgX191c2VyICopYXJnLAorCQkJCVVERl9TQl9WT0xJREVOVChpbm9kZS0+aV9zYiksIDMyKSA/IC1FRkFVTFQgOiAwOworCQljYXNlIFVERl9SRUxPQ0FURV9CTE9DS1M6CisJCXsKKwkJCWxvbmcgb2xkLCBuZXc7CisKKwkJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkgcmV0dXJuIC1FQUNDRVM7CisJCQlpZiAoZ2V0X3VzZXIob2xkLCAobG9uZyBfX3VzZXIgKilhcmcpKSByZXR1cm4gLUVGQVVMVDsKKwkJCWlmICgocmVzdWx0ID0gdWRmX3JlbG9jYXRlX2Jsb2Nrcyhpbm9kZS0+aV9zYiwKKwkJCQkJb2xkLCAmbmV3KSkgPT0gMCkKKwkJCQlyZXN1bHQgPSBwdXRfdXNlcihuZXcsIChsb25nIF9fdXNlciAqKWFyZyk7CisKKwkJCXJldHVybiByZXN1bHQ7CisJCX0KKwkJY2FzZSBVREZfR0VURUFTSVpFOgorCQkJcmVzdWx0ID0gcHV0X3VzZXIoVURGX0lfTEVORUFUVFIoaW5vZGUpLCAoaW50IF9fdXNlciAqKWFyZyk7CisJCQlicmVhazsKKworCQljYXNlIFVERl9HRVRFQUJMT0NLOgorCQkJcmVzdWx0ID0gY29weV90b191c2VyKChjaGFyIF9fdXNlciAqKWFyZywgVURGX0lfREFUQShpbm9kZSksCisJCQkJVURGX0lfTEVORUFUVFIoaW5vZGUpKSA/IC1FRkFVTFQgOiAwOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIHVkZl9yZWxlYXNlX2ZpbGUKKyAqCisgKiBQVVJQT1NFCisgKiAgQ2FsbGVkIHdoZW4gYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGZpbGUgYXJlIGNsb3NlZAorICoKKyAqIERFU0NSSVBUSU9OCisgKiAgRGlzY2FyZCBwcmVhbGxvY2VkIGJsb2NrcworICoKKyAqIEhJU1RPUlkKKyAqCisgKi8KK3N0YXRpYyBpbnQgdWRmX3JlbGVhc2VfZmlsZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxwKQoreworCWlmIChmaWxwLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwl7CisJCWxvY2tfa2VybmVsKCk7CisJCXVkZl9kaXNjYXJkX3ByZWFsbG9jKGlub2RlKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1ZGZfZmlsZV9vcGVyYXRpb25zID0geworCS5yZWFkCQkJPSBnZW5lcmljX2ZpbGVfcmVhZCwKKwkuaW9jdGwJCQk9IHVkZl9pb2N0bCwKKwkub3BlbgkJCT0gZ2VuZXJpY19maWxlX29wZW4sCisJLm1tYXAJCQk9IGdlbmVyaWNfZmlsZV9tbWFwLAorCS53cml0ZQkJCT0gdWRmX2ZpbGVfd3JpdGUsCisJLnJlbGVhc2UJCT0gdWRmX3JlbGVhc2VfZmlsZSwKKwkuZnN5bmMJCQk9IHVkZl9mc3luY19maWxlLAorCS5zZW5kZmlsZQkJPSBnZW5lcmljX2ZpbGVfc2VuZGZpbGUsCit9OworCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyB1ZGZfZmlsZV9pbm9kZV9vcGVyYXRpb25zID0geworCS50cnVuY2F0ZQkJPSB1ZGZfdHJ1bmNhdGUsCit9OwpkaWZmIC0tZ2l0IGEvZnMvdWRmL2ZzeW5jLmMgYi9mcy91ZGYvZnN5bmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGRlNmI4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvdWRmL2ZzeW5jLmMKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIGZzeW5jLmMKKyAqCisgKiBQVVJQT1NFCisgKiAgRnN5bmMgaGFuZGxpbmcgcm91dGluZXMgZm9yIHRoZSBPU1RBLVVERih0bSkgZmlsZXN5c3RlbS4KKyAqCisgKiBDT05UQUNUUworICogIEUtbWFpbCByZWdhcmRpbmcgYW55IHBvcnRpb24gb2YgdGhlIExpbnV4IFVERiBmaWxlIHN5c3RlbSBzaG91bGQgYmUKKyAqICBkaXJlY3RlZCB0byB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBtYWlsaW5nIGxpc3QgKHJ1biBieSBtYWpvcmRvbW8pOgorICogICAgICBsaW51eF91ZGZAaHBlc2pyby5mYy5ocC5jb20KKyAqCisgKiBDT1BZUklHSFQKKyAqICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIChHUEwpLiBDb3BpZXMgb2YgdGhlIEdQTCBjYW4gYmUgb2J0YWluZWQgZnJvbToKKyAqICAgICAgZnRwOi8vcHJlcC5haS5taXQuZWR1L3B1Yi9nbnUvR1BMCisgKiAgRWFjaCBjb250cmlidXRpbmcgYXV0aG9yIHJldGFpbnMgYWxsIHJpZ2h0cyB0byB0aGVpciBvd24gd29yay4KKyAqCisgKiAgKEMpIDE5OTktMjAwMSBCZW4gRmVubmVtYQorICogIChDKSAxOTk5LTIwMDAgU3RlbGlhcyBDb21wdXRpbmcgSW5jCisgKgorICogSElTVE9SWQorICoKKyAqICAwNS8yMi85OSBibGYgIENyZWF0ZWQuCisgKi8KKworI2luY2x1ZGUgInVkZmRlY2wuaCIKKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKworc3RhdGljIGludCB1ZGZfZnN5bmNfaW5vZGUoc3RydWN0IGlub2RlICosIGludCk7CisKKy8qCisgKglGaWxlIG1heSBiZSBOVUxMIHdoZW4gd2UgYXJlIGNhbGxlZC4gUGVyaGFwcyB3ZSBzaG91bGRuJ3QKKyAqCWV2ZW4gcGFzcyBmaWxlIHRvIGZzeW5jID8KKyAqLworCitpbnQgdWRmX2ZzeW5jX2ZpbGUoc3RydWN0IGZpbGUgKiBmaWxlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBkYXRhc3luYykKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXJldHVybiB1ZGZfZnN5bmNfaW5vZGUoaW5vZGUsIGRhdGFzeW5jKTsKK30KKworc3RhdGljIGludCB1ZGZfZnN5bmNfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGRhdGFzeW5jKQoreworCWludCBlcnI7CisKKwllcnIgPSBzeW5jX21hcHBpbmdfYnVmZmVycyhpbm9kZS0+aV9tYXBwaW5nKTsKKwlpZiAoIShpbm9kZS0+aV9zdGF0ZSAmIElfRElSVFkpKQorCQlyZXR1cm4gZXJyOworCWlmIChkYXRhc3luYyAmJiAhKGlub2RlLT5pX3N0YXRlICYgSV9ESVJUWV9EQVRBU1lOQykpCisJCXJldHVybiBlcnI7CisKKwllcnIgfD0gdWRmX3N5bmNfaW5vZGUgKGlub2RlKTsKKwlyZXR1cm4gZXJyID8gLUVJTyA6IDA7Cit9CmRpZmYgLS1naXQgYS9mcy91ZGYvaWFsbG9jLmMgYi9mcy91ZGYvaWFsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdlNWQ0MAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3VkZi9pYWxsb2MuYwpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIGlhbGxvYy5jCisgKgorICogUFVSUE9TRQorICoJSW5vZGUgYWxsb2NhdGlvbiBoYW5kbGluZyByb3V0aW5lcyBmb3IgdGhlIE9TVEEtVURGKHRtKSBmaWxlc3lzdGVtLgorICoKKyAqIENPTlRBQ1RTCisgKglFLW1haWwgcmVnYXJkaW5nIGFueSBwb3J0aW9uIG9mIHRoZSBMaW51eCBVREYgZmlsZSBzeXN0ZW0gc2hvdWxkIGJlCisgKglkaXJlY3RlZCB0byB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBtYWlsaW5nIGxpc3QgKHJ1biBieSBtYWpvcmRvbW8pOgorICoJCWxpbnV4X3VkZkBocGVzanJvLmZjLmhwLmNvbQorICoKKyAqIENPUFlSSUdIVAorICoJVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIChHUEwpLiBDb3BpZXMgb2YgdGhlIEdQTCBjYW4gYmUgb2J0YWluZWQgZnJvbToKKyAqCQlmdHA6Ly9wcmVwLmFpLm1pdC5lZHUvcHViL2dudS9HUEwKKyAqCUVhY2ggY29udHJpYnV0aW5nIGF1dGhvciByZXRhaW5zIGFsbCByaWdodHMgdG8gdGhlaXIgb3duIHdvcmsuCisgKgorICogIChDKSAxOTk4LTIwMDEgQmVuIEZlbm5lbWEKKyAqCisgKiBISVNUT1JZCisgKgorICogIDAyLzI0Lzk5IGJsZiAgQ3JlYXRlZC4KKyAqCisgKi8KKworI2luY2x1ZGUgInVkZmRlY2wuaCIKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CisjaW5jbHVkZSA8bGludXgvdWRmX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJ1ZGZfaS5oIgorI2luY2x1ZGUgInVkZl9zYi5oIgorCit2b2lkIHVkZl9mcmVlX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgdWRmX3NiX2luZm8gKnNiaSA9IFVERl9TQihzYik7CisKKwkvKgorCSAqIE5vdGU6IHdlIG11c3QgZnJlZSBhbnkgcXVvdGEgYmVmb3JlIGxvY2tpbmcgdGhlIHN1cGVyYmxvY2ssCisJICogYXMgd3JpdGluZyB0aGUgcXVvdGEgdG8gZGlzayBtYXkgbmVlZCB0aGUgbG9jayBhcyB3ZWxsLgorCSAqLworCURRVU9UX0ZSRUVfSU5PREUoaW5vZGUpOworCURRVU9UX0RST1AoaW5vZGUpOworCisJY2xlYXJfaW5vZGUoaW5vZGUpOworCisJZG93bigmc2JpLT5zX2FsbG9jX3NlbSk7CisJaWYgKHNiaS0+c19sdmlkYmgpIHsKKwkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCQlVREZfU0JfTFZJRElVKHNiKS0+bnVtRGlycyA9CisJCQkJY3B1X3RvX2xlMzIobGUzMl90b19jcHUoVURGX1NCX0xWSURJVShzYiktPm51bURpcnMpIC0gMSk7CisJCWVsc2UKKwkJCVVERl9TQl9MVklESVUoc2IpLT5udW1GaWxlcyA9CisJCQkJY3B1X3RvX2xlMzIobGUzMl90b19jcHUoVURGX1NCX0xWSURJVShzYiktPm51bUZpbGVzKSAtIDEpOworCQkKKwkJbWFya19idWZmZXJfZGlydHkoc2JpLT5zX2x2aWRiaCk7CisJfQorCXVwKCZzYmktPnNfYWxsb2Nfc2VtKTsKKworCXVkZl9mcmVlX2Jsb2NrcyhzYiwgTlVMTCwgVURGX0lfTE9DQVRJT04oaW5vZGUpLCAwLCAxKTsKK30KKworc3RydWN0IGlub2RlICogdWRmX25ld19pbm9kZSAoc3RydWN0IGlub2RlICpkaXIsIGludCBtb2RlLCBpbnQgKiBlcnIpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRpci0+aV9zYjsKKwlzdHJ1Y3QgdWRmX3NiX2luZm8gKnNiaSA9IFVERl9TQihzYik7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJaW50IGJsb2NrOworCXVpbnQzMl90IHN0YXJ0ID0gVURGX0lfTE9DQVRJT04oZGlyKS5sb2dpY2FsQmxvY2tOdW07CisKKwlpbm9kZSA9IG5ld19pbm9kZShzYik7CisKKwlpZiAoIWlub2RlKQorCXsKKwkJKmVyciA9IC1FTk9NRU07CisJCXJldHVybiBOVUxMOworCX0KKwkqZXJyID0gLUVOT1NQQzsKKworCWJsb2NrID0gdWRmX25ld19ibG9jayhkaXItPmlfc2IsIE5VTEwsIFVERl9JX0xPQ0FUSU9OKGRpcikucGFydGl0aW9uUmVmZXJlbmNlTnVtLAorCQlzdGFydCwgZXJyKTsKKwlpZiAoKmVycikKKwl7CisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlkb3duKCZzYmktPnNfYWxsb2Nfc2VtKTsKKwlVREZfSV9VTklRVUUoaW5vZGUpID0gMDsKKwlVREZfSV9MRU5FWFRFTlRTKGlub2RlKSA9IDA7CisJVURGX0lfTkVYVF9BTExPQ19CTE9DSyhpbm9kZSkgPSAwOworCVVERl9JX05FWFRfQUxMT0NfR09BTChpbm9kZSkgPSAwOworCVVERl9JX1NUUkFUNDA5Nihpbm9kZSkgPSAwOworCWlmIChVREZfU0JfTFZJREJIKHNiKSkKKwl7CisJCXN0cnVjdCBsb2dpY2FsVm9sSGVhZGVyRGVzYyAqbHZoZDsKKwkJdWludDY0X3QgdW5pcXVlSUQ7CisJCWx2aGQgPSAoc3RydWN0IGxvZ2ljYWxWb2xIZWFkZXJEZXNjICopKFVERl9TQl9MVklEKHNiKS0+bG9naWNhbFZvbENvbnRlbnRzVXNlKTsKKwkJaWYgKFNfSVNESVIobW9kZSkpCisJCQlVREZfU0JfTFZJRElVKHNiKS0+bnVtRGlycyA9CisJCQkJY3B1X3RvX2xlMzIobGUzMl90b19jcHUoVURGX1NCX0xWSURJVShzYiktPm51bURpcnMpICsgMSk7CisJCWVsc2UKKwkJCVVERl9TQl9MVklESVUoc2IpLT5udW1GaWxlcyA9CisJCQkJY3B1X3RvX2xlMzIobGUzMl90b19jcHUoVURGX1NCX0xWSURJVShzYiktPm51bUZpbGVzKSArIDEpOworCQlVREZfSV9VTklRVUUoaW5vZGUpID0gdW5pcXVlSUQgPSBsZTY0X3RvX2NwdShsdmhkLT51bmlxdWVJRCk7CisJCWlmICghKCsrdW5pcXVlSUQgJiAweDAwMDAwMDAwRkZGRkZGRkZVTCkpCisJCQl1bmlxdWVJRCArPSAxNjsKKwkJbHZoZC0+dW5pcXVlSUQgPSBjcHVfdG9fbGU2NCh1bmlxdWVJRCk7CisJCW1hcmtfYnVmZmVyX2RpcnR5KFVERl9TQl9MVklEQkgoc2IpKTsKKwl9CisJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisJaW5vZGUtPmlfdWlkID0gY3VycmVudC0+ZnN1aWQ7CisJaWYgKGRpci0+aV9tb2RlICYgU19JU0dJRCkKKwl7CisJCWlub2RlLT5pX2dpZCA9IGRpci0+aV9naWQ7CisJCWlmIChTX0lTRElSKG1vZGUpKQorCQkJbW9kZSB8PSBTX0lTR0lEOworCX0KKwllbHNlCisJCWlub2RlLT5pX2dpZCA9IGN1cnJlbnQtPmZzZ2lkOworCisJVURGX0lfTE9DQVRJT04oaW5vZGUpLmxvZ2ljYWxCbG9ja051bSA9IGJsb2NrOworCVVERl9JX0xPQ0FUSU9OKGlub2RlKS5wYXJ0aXRpb25SZWZlcmVuY2VOdW0gPSBVREZfSV9MT0NBVElPTihkaXIpLnBhcnRpdGlvblJlZmVyZW5jZU51bTsKKwlpbm9kZS0+aV9pbm8gPSB1ZGZfZ2V0X2xiX3BibG9jayhzYiwgVURGX0lfTE9DQVRJT04oaW5vZGUpLCAwKTsKKwlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9TSVpFOworCWlub2RlLT5pX2Jsb2NrcyA9IDA7CisJVURGX0lfTEVORUFUVFIoaW5vZGUpID0gMDsKKwlVREZfSV9MRU5BTExPQyhpbm9kZSkgPSAwOworCVVERl9JX1VTRShpbm9kZSkgPSAwOworCWlmIChVREZfUVVFUllfRkxBRyhpbm9kZS0+aV9zYiwgVURGX0ZMQUdfVVNFX0VYVEVOREVEX0ZFKSkKKwl7CisJCVVERl9JX0VGRShpbm9kZSkgPSAxOworCQlVREZfVVBEQVRFX1VERlJFVihpbm9kZS0+aV9zYiwgVURGX1ZFUlNfVVNFX0VYVEVOREVEX0ZFKTsKKwkJVURGX0lfREFUQShpbm9kZSkgPSBrbWFsbG9jKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZXh0ZW5kZWRGaWxlRW50cnkpLCBHRlBfS0VSTkVMKTsKKwkJbWVtc2V0KFVERl9JX0RBVEEoaW5vZGUpLCAweDAwLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IGV4dGVuZGVkRmlsZUVudHJ5KSk7CisJfQorCWVsc2UKKwl7CisJCVVERl9JX0VGRShpbm9kZSkgPSAwOworCQlVREZfSV9EQVRBKGlub2RlKSA9IGttYWxsb2MoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gc2l6ZW9mKHN0cnVjdCBmaWxlRW50cnkpLCBHRlBfS0VSTkVMKTsKKwkJbWVtc2V0KFVERl9JX0RBVEEoaW5vZGUpLCAweDAwLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IGZpbGVFbnRyeSkpOworCX0KKwlpZiAoVURGX1FVRVJZX0ZMQUcoaW5vZGUtPmlfc2IsIFVERl9GTEFHX1VTRV9BRF9JTl9JQ0IpKQorCQlVREZfSV9BTExPQ1RZUEUoaW5vZGUpID0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCOworCWVsc2UgaWYgKFVERl9RVUVSWV9GTEFHKGlub2RlLT5pX3NiLCBVREZfRkxBR19VU0VfU0hPUlRfQUQpKQorCQlVREZfSV9BTExPQ1RZUEUoaW5vZGUpID0gSUNCVEFHX0ZMQUdfQURfU0hPUlQ7CisJZWxzZQorCQlVREZfSV9BTExPQ1RZUEUoaW5vZGUpID0gSUNCVEFHX0ZMQUdfQURfTE9ORzsKKwlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfY3RpbWUgPQorCQlVREZfSV9DUlRJTUUoaW5vZGUpID0gY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKKwlpbnNlcnRfaW5vZGVfaGFzaChpbm9kZSk7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJdXAoJnNiaS0+c19hbGxvY19zZW0pOworCisJaWYgKERRVU9UX0FMTE9DX0lOT0RFKGlub2RlKSkKKwl7CisJCURRVU9UX0RST1AoaW5vZGUpOworCQlpbm9kZS0+aV9mbGFncyB8PSBTX05PUVVPVEE7CisJCWlub2RlLT5pX25saW5rID0gMDsKKwkJaXB1dChpbm9kZSk7CisJCSplcnIgPSAtRURRVU9UOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkqZXJyID0gMDsKKwlyZXR1cm4gaW5vZGU7Cit9CmRpZmYgLS1naXQgYS9mcy91ZGYvaW5vZGUuYyBiL2ZzL3VkZi9pbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MDZlMTEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy91ZGYvaW5vZGUuYwpAQCAtMCwwICsxLDIwMTAgQEAKKy8qCisgKiBpbm9kZS5jCisgKgorICogUFVSUE9TRQorICogIElub2RlIGhhbmRsaW5nIHJvdXRpbmVzIGZvciB0aGUgT1NUQS1VREYodG0pIGZpbGVzeXN0ZW0uCisgKgorICogQ09OVEFDVFMKKyAqICBFLW1haWwgcmVnYXJkaW5nIGFueSBwb3J0aW9uIG9mIHRoZSBMaW51eCBVREYgZmlsZSBzeXN0ZW0gc2hvdWxkIGJlCisgKiAgZGlyZWN0ZWQgdG8gdGhlIGRldmVsb3BtZW50IHRlYW0gbWFpbGluZyBsaXN0IChydW4gYnkgbWFqb3Jkb21vKToKKyAqICAgIGxpbnV4X3VkZkBocGVzanJvLmZjLmhwLmNvbQorICoKKyAqIENPUFlSSUdIVAorICogIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgKEdQTCkuIENvcGllcyBvZiB0aGUgR1BMIGNhbiBiZSBvYnRhaW5lZCBmcm9tOgorICogICAgZnRwOi8vcHJlcC5haS5taXQuZWR1L3B1Yi9nbnUvR1BMCisgKiAgRWFjaCBjb250cmlidXRpbmcgYXV0aG9yIHJldGFpbnMgYWxsIHJpZ2h0cyB0byB0aGVpciBvd24gd29yay4KKyAqCisgKiAgKEMpIDE5OTggRGF2ZSBCb3ludG9uCisgKiAgKEMpIDE5OTgtMjAwNCBCZW4gRmVubmVtYQorICogIChDKSAxOTk5LTIwMDAgU3RlbGlhcyBDb21wdXRpbmcgSW5jCisgKgorICogSElTVE9SWQorICoKKyAqICAxMC8wNC85OCBkZ2IgIEFkZGVkIHJ1ZGltZW50YXJ5IGRpcmVjdG9yeSBmdW5jdGlvbnMKKyAqICAxMC8wNy85OCAgICAgIEZ1bGx5IHdvcmtpbmcgdWRmX2Jsb2NrX21hcCEgSXQgd29ya3MhCisgKiAgMTEvMjUvOTggICAgICBibWFwIGFsdGVyZWQgdG8gYmV0dGVyIHN1cHBvcnQgZXh0ZW50cworICogIDEyLzA2Lzk4IGJsZiAgcGFydGl0aW9uIHN1cHBvcnQgaW4gdWRmX2lnZXQsIHVkZl9ibG9ja19tYXAgYW5kIHVkZl9yZWFkX2lub2RlCisgKiAgMTIvMTIvOTggICAgICByZXdyb3RlIHVkZl9ibG9ja19tYXAgdG8gaGFuZGxlIG5leHQgZXh0ZW50cyBhbmQgZGVzY3MgYWNyb3NzCisgKiAgICAgICAgICAgICAgICBibG9jayBib3VuZGFyaWVzICh3aGljaCBpcyBub3QgYWN0dWFsbHkgYWxsb3dlZCkKKyAqICAxMi8yMC85OCAgICAgIGFkZGVkIHN1cHBvcnQgZm9yIHN0cmF0ZWd5IDQwOTYKKyAqICAwMy8wNy85OSAgICAgIHJld3JvdGUgdWRmX2Jsb2NrX21hcCAoYWdhaW4pCisgKiAgICAgICAgICAgICAgICBOZXcgZnVuY3MsIGlub2RlX2JtYXAsIHVkZl9uZXh0X2FleHQKKyAqICAwNC8xOS85OSAgICAgIFN1cHBvcnQgZm9yIHdyaXRpbmcgZGV2aWNlIEVBJ3MgZm9yIG1ham9yL21pbm9yICMKKyAqLworCisjaW5jbHVkZSAidWRmZGVjbC5oIgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJ1ZGZfaS5oIgorI2luY2x1ZGUgInVkZl9zYi5oIgorCitNT0RVTEVfQVVUSE9SKCJCZW4gRmVubmVtYSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJVbml2ZXJzYWwgRGlzayBGb3JtYXQgRmlsZXN5c3RlbSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZGVmaW5lIEVYVEVOVF9NRVJHRV9TSVpFIDUKKworc3RhdGljIG1vZGVfdCB1ZGZfY29udmVydF9wZXJtaXNzaW9ucyhzdHJ1Y3QgZmlsZUVudHJ5ICopOworc3RhdGljIGludCB1ZGZfdXBkYXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqLCBpbnQpOworc3RhdGljIHZvaWQgdWRmX2ZpbGxfaW5vZGUoc3RydWN0IGlub2RlICosIHN0cnVjdCBidWZmZXJfaGVhZCAqKTsKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmlub2RlX2dldGJsayhzdHJ1Y3QgaW5vZGUgKiwgbG9uZywgaW50ICosCisJbG9uZyAqLCBpbnQgKik7CitzdGF0aWMgaW50OF90IHVkZl9pbnNlcnRfYWV4dChzdHJ1Y3QgaW5vZGUgKiwga2VybmVsX2xiX2FkZHIsIGludCwKKwlrZXJuZWxfbGJfYWRkciwgdWludDMyX3QsIHN0cnVjdCBidWZmZXJfaGVhZCAqKTsKK3N0YXRpYyB2b2lkIHVkZl9zcGxpdF9leHRlbnRzKHN0cnVjdCBpbm9kZSAqLCBpbnQgKiwgaW50LCBpbnQsCisJa2VybmVsX2xvbmdfYWQgW0VYVEVOVF9NRVJHRV9TSVpFXSwgaW50ICopOworc3RhdGljIHZvaWQgdWRmX3ByZWFsbG9jX2V4dGVudHMoc3RydWN0IGlub2RlICosIGludCwgaW50LAorCSBrZXJuZWxfbG9uZ19hZCBbRVhURU5UX01FUkdFX1NJWkVdLCBpbnQgKik7CitzdGF0aWMgdm9pZCB1ZGZfbWVyZ2VfZXh0ZW50cyhzdHJ1Y3QgaW5vZGUgKiwKKwkga2VybmVsX2xvbmdfYWQgW0VYVEVOVF9NRVJHRV9TSVpFXSwgaW50ICopOworc3RhdGljIHZvaWQgdWRmX3VwZGF0ZV9leHRlbnRzKHN0cnVjdCBpbm9kZSAqLAorCWtlcm5lbF9sb25nX2FkIFtFWFRFTlRfTUVSR0VfU0laRV0sIGludCwgaW50LAorCWtlcm5lbF9sYl9hZGRyLCB1aW50MzJfdCwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqKTsKK3N0YXRpYyBpbnQgdWRmX2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKiwgc2VjdG9yX3QsIHN0cnVjdCBidWZmZXJfaGVhZCAqLCBpbnQpOworCisvKgorICogdWRmX2RlbGV0ZV9pbm9kZQorICoKKyAqIFBVUlBPU0UKKyAqCUNsZWFuLXVwIGJlZm9yZSB0aGUgc3BlY2lmaWVkIGlub2RlIGlzIGRlc3Ryb3llZC4KKyAqCisgKiBERVNDUklQVElPTgorICoJVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIHRoZSBrZXJuZWwgZGVzdHJveXMgYW4gaW5vZGUgc3RydWN0dXJlCisgKglpZS4gd2hlbiBpcHV0KCkgZmluZHMgaV9jb3VudCA9PSAwLgorICoKKyAqIEhJU1RPUlkKKyAqCUp1bHkgMSwgMTk5NyAtIEFuZHJldyBFLiBNaWxlc2tpCisgKglXcml0dGVuLCB0ZXN0ZWQsIGFuZCByZWxlYXNlZC4KKyAqCisgKiAgQ2FsbGVkIGF0IHRoZSBsYXN0IGlwdXQoKSBpZiBpX25saW5rIGlzIHplcm8uCisgKi8KK3ZvaWQgdWRmX2RlbGV0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwlpZiAoaXNfYmFkX2lub2RlKGlub2RlKSkKKwkJZ290byBub19kZWxldGU7CisKKwlpbm9kZS0+aV9zaXplID0gMDsKKwl1ZGZfdHJ1bmNhdGUoaW5vZGUpOworCWxvY2tfa2VybmVsKCk7CisKKwl1ZGZfdXBkYXRlX2lub2RlKGlub2RlLCBJU19TWU5DKGlub2RlKSk7CisJdWRmX2ZyZWVfaW5vZGUoaW5vZGUpOworCisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybjsKK25vX2RlbGV0ZToKKwljbGVhcl9pbm9kZShpbm9kZSk7Cit9CisKK3ZvaWQgdWRmX2NsZWFyX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJaWYgKCEoaW5vZGUtPmlfc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCWxvY2tfa2VybmVsKCk7CisJCXVkZl9kaXNjYXJkX3ByZWFsbG9jKGlub2RlKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCX0KKworCWtmcmVlKFVERl9JX0RBVEEoaW5vZGUpKTsKKwlVREZfSV9EQVRBKGlub2RlKSA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgdWRmX3dyaXRlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpCit7CisJcmV0dXJuIGJsb2NrX3dyaXRlX2Z1bGxfcGFnZShwYWdlLCB1ZGZfZ2V0X2Jsb2NrLCB3YmMpOworfQorCitzdGF0aWMgaW50IHVkZl9yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJuIGJsb2NrX3JlYWRfZnVsbF9wYWdlKHBhZ2UsIHVkZl9nZXRfYmxvY2spOworfQorCitzdGF0aWMgaW50IHVkZl9wcmVwYXJlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCit7CisJcmV0dXJuIGJsb2NrX3ByZXBhcmVfd3JpdGUocGFnZSwgZnJvbSwgdG8sIHVkZl9nZXRfYmxvY2spOworfQorCitzdGF0aWMgc2VjdG9yX3QgdWRmX2JtYXAoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIHNlY3Rvcl90IGJsb2NrKQoreworCXJldHVybiBnZW5lcmljX2Jsb2NrX2JtYXAobWFwcGluZyxibG9jayx1ZGZfZ2V0X2Jsb2NrKTsKK30KKworc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB1ZGZfYW9wcyA9IHsKKwkucmVhZHBhZ2UJCT0gdWRmX3JlYWRwYWdlLAorCS53cml0ZXBhZ2UJCT0gdWRmX3dyaXRlcGFnZSwKKwkuc3luY19wYWdlCQk9IGJsb2NrX3N5bmNfcGFnZSwKKwkucHJlcGFyZV93cml0ZQkJPSB1ZGZfcHJlcGFyZV93cml0ZSwKKwkuY29tbWl0X3dyaXRlCQk9IGdlbmVyaWNfY29tbWl0X3dyaXRlLAorCS5ibWFwCQkJPSB1ZGZfYm1hcCwKK307CisKK3ZvaWQgdWRmX2V4cGFuZF9maWxlX2FkaW5pY2Ioc3RydWN0IGlub2RlICogaW5vZGUsIGludCBuZXdzaXplLCBpbnQgKiBlcnIpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJY2hhciAqa2FkZHI7CisJc3RydWN0IHdyaXRlYmFja19jb250cm9sIHVkZl93YmMgPSB7CisJCS5zeW5jX21vZGUgPSBXQl9TWU5DX05PTkUsCisJCS5ucl90b193cml0ZSA9IDEsCisJfTsKKworCS8qIGZyb20gbm93IG9uIHdlIGhhdmUgbm9ybWFsIGFkZHJlc3Nfc3BhY2UgbWV0aG9kcyAqLworCWlub2RlLT5pX2RhdGEuYV9vcHMgPSAmdWRmX2FvcHM7CisKKwlpZiAoIVVERl9JX0xFTkFMTE9DKGlub2RlKSkKKwl7CisJCWlmIChVREZfUVVFUllfRkxBRyhpbm9kZS0+aV9zYiwgVURGX0ZMQUdfVVNFX1NIT1JUX0FEKSkKKwkJCVVERl9JX0FMTE9DVFlQRShpbm9kZSkgPSBJQ0JUQUdfRkxBR19BRF9TSE9SVDsKKwkJZWxzZQorCQkJVURGX0lfQUxMT0NUWVBFKGlub2RlKSA9IElDQlRBR19GTEFHX0FEX0xPTkc7CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQlyZXR1cm47CisJfQorCisJcGFnZSA9IGdyYWJfY2FjaGVfcGFnZShpbm9kZS0+aV9tYXBwaW5nLCAwKTsKKwlpZiAoIVBhZ2VMb2NrZWQocGFnZSkpCisJCVBBR0VfQlVHKHBhZ2UpOworCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpKQorCXsKKwkJa2FkZHIgPSBrbWFwKHBhZ2UpOworCQltZW1zZXQoa2FkZHIgKyBVREZfSV9MRU5BTExPQyhpbm9kZSksIDB4MDAsCisJCQlQQUdFX0NBQ0hFX1NJWkUgLSBVREZfSV9MRU5BTExPQyhpbm9kZSkpOworCQltZW1jcHkoa2FkZHIsIFVERl9JX0RBVEEoaW5vZGUpICsgVURGX0lfTEVORUFUVFIoaW5vZGUpLAorCQkJVURGX0lfTEVOQUxMT0MoaW5vZGUpKTsKKwkJZmx1c2hfZGNhY2hlX3BhZ2UocGFnZSk7CisJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJa3VubWFwKHBhZ2UpOworCX0KKwltZW1zZXQoVURGX0lfREFUQShpbm9kZSkgKyBVREZfSV9MRU5FQVRUUihpbm9kZSksIDB4MDAsCisJCVVERl9JX0xFTkFMTE9DKGlub2RlKSk7CisJVURGX0lfTEVOQUxMT0MoaW5vZGUpID0gMDsKKwlpZiAoVURGX1FVRVJZX0ZMQUcoaW5vZGUtPmlfc2IsIFVERl9GTEFHX1VTRV9TSE9SVF9BRCkpCisJCVVERl9JX0FMTE9DVFlQRShpbm9kZSkgPSBJQ0JUQUdfRkxBR19BRF9TSE9SVDsKKwllbHNlCisJCVVERl9JX0FMTE9DVFlQRShpbm9kZSkgPSBJQ0JUQUdfRkxBR19BRF9MT05HOworCisJaW5vZGUtPmlfZGF0YS5hX29wcy0+d3JpdGVwYWdlKHBhZ2UsICZ1ZGZfd2JjKTsKKwlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKK30KKworc3RydWN0IGJ1ZmZlcl9oZWFkICogdWRmX2V4cGFuZF9kaXJfYWRpbmljYihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgKmJsb2NrLCBpbnQgKmVycikKK3sKKwlpbnQgbmV3YmxvY2s7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpzYmggPSBOVUxMLCAqZGJoID0gTlVMTDsKKwlrZXJuZWxfbGJfYWRkciBibG9jLCBlbG9jOworCXVpbnQzMl90IGVsZW4sIGV4dG9mZnNldDsKKwl1aW50OF90IGFsbG9jdHlwZTsKKworCXN0cnVjdCB1ZGZfZmlsZWlkZW50X2JoIHNmaWJoLCBkZmliaDsKKwlsb2ZmX3QgZl9wb3MgPSB1ZGZfZXh0MF9vZmZzZXQoaW5vZGUpID4+IDI7CisJaW50IHNpemUgPSAodWRmX2V4dDBfb2Zmc2V0KGlub2RlKSArIGlub2RlLT5pX3NpemUpID4+IDI7CisJc3RydWN0IGZpbGVJZGVudERlc2MgY2ZpLCAqc2ZpLCAqZGZpOworCisJaWYgKFVERl9RVUVSWV9GTEFHKGlub2RlLT5pX3NiLCBVREZfRkxBR19VU0VfU0hPUlRfQUQpKQorCQlhbGxvY3R5cGUgPSBJQ0JUQUdfRkxBR19BRF9TSE9SVDsKKwllbHNlCisJCWFsbG9jdHlwZSA9IElDQlRBR19GTEFHX0FEX0xPTkc7CisKKwlpZiAoIWlub2RlLT5pX3NpemUpCisJeworCQlVREZfSV9BTExPQ1RZUEUoaW5vZGUpID0gYWxsb2N0eXBlOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogYWxsb2MgYmxvY2ssIGFuZCBjb3B5IGRhdGEgdG8gaXQgKi8KKwkqYmxvY2sgPSB1ZGZfbmV3X2Jsb2NrKGlub2RlLT5pX3NiLCBpbm9kZSwKKwkJVURGX0lfTE9DQVRJT04oaW5vZGUpLnBhcnRpdGlvblJlZmVyZW5jZU51bSwKKwkJVURGX0lfTE9DQVRJT04oaW5vZGUpLmxvZ2ljYWxCbG9ja051bSwgZXJyKTsKKworCWlmICghKCpibG9jaykpCisJCXJldHVybiBOVUxMOworCW5ld2Jsb2NrID0gdWRmX2dldF9wYmxvY2soaW5vZGUtPmlfc2IsICpibG9jaywKKwkJVURGX0lfTE9DQVRJT04oaW5vZGUpLnBhcnRpdGlvblJlZmVyZW5jZU51bSwgMCk7CisJaWYgKCFuZXdibG9jaykKKwkJcmV0dXJuIE5VTEw7CisJZGJoID0gdWRmX3RnZXRibGsoaW5vZGUtPmlfc2IsIG5ld2Jsb2NrKTsKKwlpZiAoIWRiaCkKKwkJcmV0dXJuIE5VTEw7CisJbG9ja19idWZmZXIoZGJoKTsKKwltZW1zZXQoZGJoLT5iX2RhdGEsIDB4MDAsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CisJc2V0X2J1ZmZlcl91cHRvZGF0ZShkYmgpOworCXVubG9ja19idWZmZXIoZGJoKTsKKwltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShkYmgsIGlub2RlKTsKKworCXNmaWJoLnNvZmZzZXQgPSBzZmliaC5lb2Zmc2V0ID0gKGZfcG9zICYgKChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSA+PiAyKSkgPDwgMjsKKwlzYmggPSBzZmliaC5zYmggPSBzZmliaC5lYmggPSBOVUxMOworCWRmaWJoLnNvZmZzZXQgPSBkZmliaC5lb2Zmc2V0ID0gMDsKKwlkZmliaC5zYmggPSBkZmliaC5lYmggPSBkYmg7CisJd2hpbGUgKCAoZl9wb3MgPCBzaXplKSApCisJeworCQlVREZfSV9BTExPQ1RZUEUoaW5vZGUpID0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCOworCQlzZmkgPSB1ZGZfZmlsZWlkZW50X3JlYWQoaW5vZGUsICZmX3BvcywgJnNmaWJoLCAmY2ZpLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwkJaWYgKCFzZmkpCisJCXsKKwkJCXVkZl9yZWxlYXNlX2RhdGEoZGJoKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCVVERl9JX0FMTE9DVFlQRShpbm9kZSkgPSBhbGxvY3R5cGU7CisJCXNmaS0+ZGVzY1RhZy50YWdMb2NhdGlvbiA9IGNwdV90b19sZTMyKCpibG9jayk7CisJCWRmaWJoLnNvZmZzZXQgPSBkZmliaC5lb2Zmc2V0OworCQlkZmliaC5lb2Zmc2V0ICs9IChzZmliaC5lb2Zmc2V0IC0gc2ZpYmguc29mZnNldCk7CisJCWRmaSA9IChzdHJ1Y3QgZmlsZUlkZW50RGVzYyAqKShkYmgtPmJfZGF0YSArIGRmaWJoLnNvZmZzZXQpOworCQlpZiAodWRmX3dyaXRlX2ZpKGlub2RlLCBzZmksIGRmaSwgJmRmaWJoLCBzZmktPmltcFVzZSwKKwkJCXNmaS0+ZmlsZUlkZW50ICsgbGUxNl90b19jcHUoc2ZpLT5sZW5ndGhPZkltcFVzZSkpKQorCQl7CisJCQlVREZfSV9BTExPQ1RZUEUoaW5vZGUpID0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCOworCQkJdWRmX3JlbGVhc2VfZGF0YShkYmgpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisJbWFya19idWZmZXJfZGlydHlfaW5vZGUoZGJoLCBpbm9kZSk7CisKKwltZW1zZXQoVURGX0lfREFUQShpbm9kZSkgKyBVREZfSV9MRU5FQVRUUihpbm9kZSksIDAsIFVERl9JX0xFTkFMTE9DKGlub2RlKSk7CisJVURGX0lfTEVOQUxMT0MoaW5vZGUpID0gMDsKKwlibG9jID0gVURGX0lfTE9DQVRJT04oaW5vZGUpOworCWVsb2MubG9naWNhbEJsb2NrTnVtID0gKmJsb2NrOworCWVsb2MucGFydGl0aW9uUmVmZXJlbmNlTnVtID0gVURGX0lfTE9DQVRJT04oaW5vZGUpLnBhcnRpdGlvblJlZmVyZW5jZU51bTsKKwllbGVuID0gaW5vZGUtPmlfc2l6ZTsKKwlVREZfSV9MRU5FWFRFTlRTKGlub2RlKSA9IGVsZW47CisJZXh0b2Zmc2V0ID0gdWRmX2ZpbGVfZW50cnlfYWxsb2Nfb2Zmc2V0KGlub2RlKTsKKwl1ZGZfYWRkX2FleHQoaW5vZGUsICZibG9jLCAmZXh0b2Zmc2V0LCBlbG9jLCBlbGVuLCAmc2JoLCAwKTsKKwkvKiBVbmlxdWVJRCBzdHVmZiAqLworCisJdWRmX3JlbGVhc2VfZGF0YShzYmgpOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCXJldHVybiBkYmg7Cit9CisKK3N0YXRpYyBpbnQgdWRmX2dldF9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBibG9jaywgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpCit7CisJaW50IGVyciwgbmV3OworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJdW5zaWduZWQgbG9uZyBwaHlzOworCisJaWYgKCFjcmVhdGUpCisJeworCQlwaHlzID0gdWRmX2Jsb2NrX21hcChpbm9kZSwgYmxvY2spOworCQlpZiAocGh5cykKKwkJCW1hcF9iaChiaF9yZXN1bHQsIGlub2RlLT5pX3NiLCBwaHlzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZXJyID0gLUVJTzsKKwluZXcgPSAwOworCWJoID0gTlVMTDsKKworCWxvY2tfa2VybmVsKCk7CisKKwlpZiAoYmxvY2sgPCAwKQorCQlnb3RvIGFib3J0X25lZ2F0aXZlOworCisJaWYgKGJsb2NrID09IFVERl9JX05FWFRfQUxMT0NfQkxPQ0soaW5vZGUpICsgMSkKKwl7CisJCVVERl9JX05FWFRfQUxMT0NfQkxPQ0soaW5vZGUpICsrOworCQlVREZfSV9ORVhUX0FMTE9DX0dPQUwoaW5vZGUpICsrOworCX0KKworCWVyciA9IDA7CisKKwliaCA9IGlub2RlX2dldGJsayhpbm9kZSwgYmxvY2ssICZlcnIsICZwaHlzLCAmbmV3KTsKKwlpZiAoYmgpCisJCUJVRygpOworCWlmIChlcnIpCisJCWdvdG8gYWJvcnQ7CisJaWYgKCFwaHlzKQorCQlCVUcoKTsKKworCWlmIChuZXcpCisJCXNldF9idWZmZXJfbmV3KGJoX3Jlc3VsdCk7CisJbWFwX2JoKGJoX3Jlc3VsdCwgaW5vZGUtPmlfc2IsIHBoeXMpOworYWJvcnQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnI7CisKK2Fib3J0X25lZ2F0aXZlOgorCXVkZl93YXJuaW5nKGlub2RlLT5pX3NiLCAidWRmX2dldF9ibG9jayIsICJibG9jayA8IDAiKTsKKwlnb3RvIGFib3J0OworfQorCitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9oZWFkICoKK3VkZl9nZXRibGsoc3RydWN0IGlub2RlICppbm9kZSwgbG9uZyBibG9jaywgaW50IGNyZWF0ZSwgaW50ICplcnIpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkIGR1bW15OworCisJZHVtbXkuYl9zdGF0ZSA9IDA7CisJZHVtbXkuYl9ibG9ja25yID0gLTEwMDA7CisJKmVyciA9IHVkZl9nZXRfYmxvY2soaW5vZGUsIGJsb2NrLCAmZHVtbXksIGNyZWF0ZSk7CisJaWYgKCEqZXJyICYmIGJ1ZmZlcl9tYXBwZWQoJmR1bW15KSkKKwl7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJCWJoID0gc2JfZ2V0YmxrKGlub2RlLT5pX3NiLCBkdW1teS5iX2Jsb2NrbnIpOworCQlpZiAoYnVmZmVyX25ldygmZHVtbXkpKQorCQl7CisJCQlsb2NrX2J1ZmZlcihiaCk7CisJCQltZW1zZXQoYmgtPmJfZGF0YSwgMHgwMCwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKKwkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQkJdW5sb2NrX2J1ZmZlcihiaCk7CisJCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShiaCwgaW5vZGUpOworCQl9CisJCXJldHVybiBiaDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBpbm9kZV9nZXRibGsoc3RydWN0IGlub2RlICogaW5vZGUsIGxvbmcgYmxvY2ssCisJaW50ICplcnIsIGxvbmcgKnBoeXMsIGludCAqbmV3KQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqcGJoID0gTlVMTCwgKmNiaCA9IE5VTEwsICpuYmggPSBOVUxMLCAqcmVzdWx0ID0gTlVMTDsKKwlrZXJuZWxfbG9uZ19hZCBsYWFycltFWFRFTlRfTUVSR0VfU0laRV07CisJdWludDMyX3QgcGV4dG9mZnNldCA9IDAsIGNleHRvZmZzZXQgPSAwLCBuZXh0b2Zmc2V0ID0gMDsKKwlpbnQgY291bnQgPSAwLCBzdGFydG51bSA9IDAsIGVuZG51bSA9IDA7CisJdWludDMyX3QgZWxlbiA9IDA7CisJa2VybmVsX2xiX2FkZHIgZWxvYywgcGJsb2MsIGNibG9jLCBuYmxvYzsKKwlpbnQgYyA9IDE7CisJdWludDY0X3QgbGJjb3VudCA9IDAsIGJfb2ZmID0gMDsKKwl1aW50MzJfdCBuZXdibG9ja251bSwgbmV3YmxvY2ssIG9mZnNldCA9IDA7CisJaW50OF90IGV0eXBlOworCWludCBnb2FsID0gMCwgcGdvYWwgPSBVREZfSV9MT0NBVElPTihpbm9kZSkubG9naWNhbEJsb2NrTnVtOworCWNoYXIgbGFzdGJsb2NrID0gMDsKKworCXBleHRvZmZzZXQgPSBjZXh0b2Zmc2V0ID0gbmV4dG9mZnNldCA9IHVkZl9maWxlX2VudHJ5X2FsbG9jX29mZnNldChpbm9kZSk7CisJYl9vZmYgPSAodWludDY0X3QpYmxvY2sgPDwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJcGJsb2MgPSBjYmxvYyA9IG5ibG9jID0gVURGX0lfTE9DQVRJT04oaW5vZGUpOworCisJLyogZmluZCB0aGUgZXh0ZW50IHdoaWNoIGNvbnRhaW5zIHRoZSBibG9jayB3ZSBhcmUgbG9va2luZyBmb3IuCisgICAgICAgYWx0ZXJuYXRlIGJldHdlZW4gbGFhcnJbMF0gYW5kIGxhYXJyWzFdIGZvciBsb2NhdGlvbnMgb2YgdGhlCisgICAgICAgY3VycmVudCBleHRlbnQsIGFuZCB0aGUgcHJldmlvdXMgZXh0ZW50ICovCisJZG8KKwl7CisJCWlmIChwYmggIT0gY2JoKQorCQl7CisJCQl1ZGZfcmVsZWFzZV9kYXRhKHBiaCk7CisJCQlhdG9taWNfaW5jKCZjYmgtPmJfY291bnQpOworCQkJcGJoID0gY2JoOworCQl9CisJCWlmIChjYmggIT0gbmJoKQorCQl7CisJCQl1ZGZfcmVsZWFzZV9kYXRhKGNiaCk7CisJCQlhdG9taWNfaW5jKCZuYmgtPmJfY291bnQpOworCQkJY2JoID0gbmJoOworCQl9CisKKwkJbGJjb3VudCArPSBlbGVuOworCisJCXBibG9jID0gY2Jsb2M7CisJCWNibG9jID0gbmJsb2M7CisKKwkJcGV4dG9mZnNldCA9IGNleHRvZmZzZXQ7CisJCWNleHRvZmZzZXQgPSBuZXh0b2Zmc2V0OworCisJCWlmICgoZXR5cGUgPSB1ZGZfbmV4dF9hZXh0KGlub2RlLCAmbmJsb2MsICZuZXh0b2Zmc2V0LCAmZWxvYywgJmVsZW4sICZuYmgsIDEpKSA9PSAtMSkKKwkJCWJyZWFrOworCisJCWMgPSAhYzsKKworCQlsYWFycltjXS5leHRMZW5ndGggPSAoZXR5cGUgPDwgMzApIHwgZWxlbjsKKwkJbGFhcnJbY10uZXh0TG9jYXRpb24gPSBlbG9jOworCisJCWlmIChldHlwZSAhPSAoRVhUX05PVF9SRUNPUkRFRF9OT1RfQUxMT0NBVEVEID4+IDMwKSkKKwkJCXBnb2FsID0gZWxvYy5sb2dpY2FsQmxvY2tOdW0gKworCQkJCSgoZWxlbiArIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpID4+CisJCQkJaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCisJCWNvdW50ICsrOworCX0gd2hpbGUgKGxiY291bnQgKyBlbGVuIDw9IGJfb2ZmKTsKKworCWJfb2ZmIC09IGxiY291bnQ7CisJb2Zmc2V0ID0gYl9vZmYgPj4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHM7CisKKwkvKiBpZiB0aGUgZXh0ZW50IGlzIGFsbG9jYXRlZCBhbmQgcmVjb3JkZWQsIHJldHVybiB0aGUgYmxvY2sKKyAgICAgICBpZiB0aGUgZXh0ZW50IGlzIG5vdCBhIG11bHRpcGxlIG9mIHRoZSBibG9ja3NpemUsIHJvdW5kIHVwICovCisKKwlpZiAoZXR5cGUgPT0gKEVYVF9SRUNPUkRFRF9BTExPQ0FURUQgPj4gMzApKQorCXsKKwkJaWYgKGVsZW4gJiAoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkpCisJCXsKKwkJCWVsZW4gPSBFWFRfUkVDT1JERURfQUxMT0NBVEVEIHwKKwkJCQkoKGVsZW4gKyBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSAmCisJCQkJfihpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSk7CisJCQlldHlwZSA9IHVkZl93cml0ZV9hZXh0KGlub2RlLCBuYmxvYywgJmNleHRvZmZzZXQsIGVsb2MsIGVsZW4sIG5iaCwgMSk7CisJCX0KKwkJdWRmX3JlbGVhc2VfZGF0YShwYmgpOworCQl1ZGZfcmVsZWFzZV9kYXRhKGNiaCk7CisJCXVkZl9yZWxlYXNlX2RhdGEobmJoKTsKKwkJbmV3YmxvY2sgPSB1ZGZfZ2V0X2xiX3BibG9jayhpbm9kZS0+aV9zYiwgZWxvYywgb2Zmc2V0KTsKKwkJKnBoeXMgPSBuZXdibG9jazsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGV0eXBlID09IC0xKQorCXsKKwkJZW5kbnVtID0gc3RhcnRudW0gPSAoKGNvdW50ID4gMSkgPyAxIDogY291bnQpOworCQlpZiAobGFhcnJbY10uZXh0TGVuZ3RoICYgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKQorCQl7CisJCQlsYWFycltjXS5leHRMZW5ndGggPQorCQkJCShsYWFycltjXS5leHRMZW5ndGggJiBVREZfRVhURU5UX0ZMQUdfTUFTSykgfAorCQkJCSgoKGxhYXJyW2NdLmV4dExlbmd0aCAmIFVERl9FWFRFTlRfTEVOR1RIX01BU0spICsKKwkJCQkJaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkgJgorCQkJCX4oaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkpOworCQkJVURGX0lfTEVORVhURU5UUyhpbm9kZSkgPQorCQkJCShVREZfSV9MRU5FWFRFTlRTKGlub2RlKSArIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpICYKKwkJCQkJfihpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKTsKKwkJfQorCQljID0gIWM7CisJCWxhYXJyW2NdLmV4dExlbmd0aCA9IEVYVF9OT1RfUkVDT1JERURfTk9UX0FMTE9DQVRFRCB8CisJCQkoKG9mZnNldCArIDEpIDw8IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwkJbWVtc2V0KCZsYWFycltjXS5leHRMb2NhdGlvbiwgMHgwMCwgc2l6ZW9mKGtlcm5lbF9sYl9hZGRyKSk7CisJCWNvdW50ICsrOworCQllbmRudW0gKys7CisJCWxhc3RibG9jayA9IDE7CisJfQorCWVsc2UKKwkJZW5kbnVtID0gc3RhcnRudW0gPSAoKGNvdW50ID4gMikgPyAyIDogY291bnQpOworCisJLyogaWYgdGhlIGN1cnJlbnQgZXh0ZW50IGlzIGluIHBvc2l0aW9uIDAsIHN3YXAgaXQgd2l0aCB0aGUgcHJldmlvdXMgKi8KKwlpZiAoIWMgJiYgY291bnQgIT0gMSkKKwl7CisJCWxhYXJyWzJdID0gbGFhcnJbMF07CisJCWxhYXJyWzBdID0gbGFhcnJbMV07CisJCWxhYXJyWzFdID0gbGFhcnJbMl07CisJCWMgPSAxOworCX0KKworCS8qIGlmIHRoZSBjdXJyZW50IGJsb2NrIGlzIGxvY2F0ZWQgaW4gYSBleHRlbnQsIHJlYWQgdGhlIG5leHQgZXh0ZW50ICovCisJaWYgKGV0eXBlICE9IC0xKQorCXsKKwkJaWYgKChldHlwZSA9IHVkZl9uZXh0X2FleHQoaW5vZGUsICZuYmxvYywgJm5leHRvZmZzZXQsICZlbG9jLCAmZWxlbiwgJm5iaCwgMCkpICE9IC0xKQorCQl7CisJCQlsYWFycltjKzFdLmV4dExlbmd0aCA9IChldHlwZSA8PCAzMCkgfCBlbGVuOworCQkJbGFhcnJbYysxXS5leHRMb2NhdGlvbiA9IGVsb2M7CisJCQljb3VudCArKzsKKwkJCXN0YXJ0bnVtICsrOworCQkJZW5kbnVtICsrOworCQl9CisJCWVsc2UKKwkJCWxhc3RibG9jayA9IDE7CisJfQorCXVkZl9yZWxlYXNlX2RhdGEoY2JoKTsKKwl1ZGZfcmVsZWFzZV9kYXRhKG5iaCk7CisKKwkvKiBpZiB0aGUgY3VycmVudCBleHRlbnQgaXMgbm90IHJlY29yZGVkIGJ1dCBhbGxvY2F0ZWQsIGdldCB0aGUKKwkJYmxvY2sgaW4gdGhlIGV4dGVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSByZXF1ZXN0ZWQgYmxvY2sgKi8KKwlpZiAoKGxhYXJyW2NdLmV4dExlbmd0aCA+PiAzMCkgPT0gKEVYVF9OT1RfUkVDT1JERURfQUxMT0NBVEVEID4+IDMwKSkKKwkJbmV3YmxvY2tudW0gPSBsYWFycltjXS5leHRMb2NhdGlvbi5sb2dpY2FsQmxvY2tOdW0gKyBvZmZzZXQ7CisJZWxzZSAvKiBvdGhlcndpc2UsIGFsbG9jYXRlIGEgbmV3IGJsb2NrICovCisJeworCQlpZiAoVURGX0lfTkVYVF9BTExPQ19CTE9DSyhpbm9kZSkgPT0gYmxvY2spCisJCQlnb2FsID0gVURGX0lfTkVYVF9BTExPQ19HT0FMKGlub2RlKTsKKworCQlpZiAoIWdvYWwpCisJCXsKKwkJCWlmICghKGdvYWwgPSBwZ29hbCkpCisJCQkJZ29hbCA9IFVERl9JX0xPQ0FUSU9OKGlub2RlKS5sb2dpY2FsQmxvY2tOdW0gKyAxOworCQl9CisKKwkJaWYgKCEobmV3YmxvY2tudW0gPSB1ZGZfbmV3X2Jsb2NrKGlub2RlLT5pX3NiLCBpbm9kZSwKKwkJCVVERl9JX0xPQ0FUSU9OKGlub2RlKS5wYXJ0aXRpb25SZWZlcmVuY2VOdW0sIGdvYWwsIGVycikpKQorCQl7CisJCQl1ZGZfcmVsZWFzZV9kYXRhKHBiaCk7CisJCQkqZXJyID0gLUVOT1NQQzsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCVVERl9JX0xFTkVYVEVOVFMoaW5vZGUpICs9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwl9CisKKwkvKiBpZiB0aGUgZXh0ZW50IHRoZSByZXF1c3RlZCBibG9jayBpcyBsb2NhdGVkIGluIGNvbnRhaW5zIG11bHRpcGxlIGJsb2NrcywKKyAgICAgICBzcGxpdCB0aGUgZXh0ZW50IGludG8gYXQgbW9zdCB0aHJlZSBleHRlbnRzLiBibG9ja3MgcHJpb3IgdG8gcmVxdWVzdGVkCisgICAgICAgYmxvY2ssIHJlcXVlc3RlZCBibG9jaywgYW5kIGJsb2NrcyBhZnRlciByZXF1ZXN0ZWQgYmxvY2sgKi8KKwl1ZGZfc3BsaXRfZXh0ZW50cyhpbm9kZSwgJmMsIG9mZnNldCwgbmV3YmxvY2tudW0sIGxhYXJyLCAmZW5kbnVtKTsKKworI2lmZGVmIFVERl9QUkVBTExPQ0FURQorCS8qIHByZWFsbG9jYXRlIGJsb2NrcyAqLworCXVkZl9wcmVhbGxvY19leHRlbnRzKGlub2RlLCBjLCBsYXN0YmxvY2ssIGxhYXJyLCAmZW5kbnVtKTsKKyNlbmRpZgorCisJLyogbWVyZ2UgYW55IGNvbnRpbnVvdXMgYmxvY2tzIGluIGxhYXJyICovCisJdWRmX21lcmdlX2V4dGVudHMoaW5vZGUsIGxhYXJyLCAmZW5kbnVtKTsKKworCS8qIHdyaXRlIGJhY2sgdGhlIG5ldyBleHRlbnRzLCBpbnNlcnRpbmcgbmV3IGV4dGVudHMgaWYgdGhlIG5ldyBudW1iZXIKKyAgICAgICBvZiBleHRlbnRzIGlzIGdyZWF0ZXIgdGhhbiB0aGUgb2xkIG51bWJlciwgYW5kIGRlbGV0aW5nIGV4dGVudHMgaWYKKyAgICAgICB0aGUgbmV3IG51bWJlciBvZiBleHRlbnRzIGlzIGxlc3MgdGhhbiB0aGUgb2xkIG51bWJlciAqLworCXVkZl91cGRhdGVfZXh0ZW50cyhpbm9kZSwgbGFhcnIsIHN0YXJ0bnVtLCBlbmRudW0sIHBibG9jLCBwZXh0b2Zmc2V0LCAmcGJoKTsKKworCXVkZl9yZWxlYXNlX2RhdGEocGJoKTsKKworCWlmICghKG5ld2Jsb2NrID0gdWRmX2dldF9wYmxvY2soaW5vZGUtPmlfc2IsIG5ld2Jsb2NrbnVtLAorCQlVREZfSV9MT0NBVElPTihpbm9kZSkucGFydGl0aW9uUmVmZXJlbmNlTnVtLCAwKSkpCisJeworCQlyZXR1cm4gTlVMTDsKKwl9CisJKnBoeXMgPSBuZXdibG9jazsKKwkqZXJyID0gMDsKKwkqbmV3ID0gMTsKKwlVREZfSV9ORVhUX0FMTE9DX0JMT0NLKGlub2RlKSA9IGJsb2NrOworCVVERl9JX05FWFRfQUxMT0NfR09BTChpbm9kZSkgPSBuZXdibG9ja251bTsKKwlpbm9kZS0+aV9jdGltZSA9IGN1cnJlbnRfZnNfdGltZShpbm9kZS0+aV9zYik7CisKKwlpZiAoSVNfU1lOQyhpbm9kZSkpCisJCXVkZl9zeW5jX2lub2RlKGlub2RlKTsKKwllbHNlCisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIHVkZl9zcGxpdF9leHRlbnRzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCAqYywgaW50IG9mZnNldCwgaW50IG5ld2Jsb2NrbnVtLAorCWtlcm5lbF9sb25nX2FkIGxhYXJyW0VYVEVOVF9NRVJHRV9TSVpFXSwgaW50ICplbmRudW0pCit7CisJaWYgKChsYWFyclsqY10uZXh0TGVuZ3RoID4+IDMwKSA9PSAoRVhUX05PVF9SRUNPUkRFRF9BTExPQ0FURUQgPj4gMzApIHx8CisJCShsYWFyclsqY10uZXh0TGVuZ3RoID4+IDMwKSA9PSAoRVhUX05PVF9SRUNPUkRFRF9OT1RfQUxMT0NBVEVEID4+IDMwKSkKKwl7CisJCWludCBjdXJyID0gKmM7CisJCWludCBibGVuID0gKChsYWFycltjdXJyXS5leHRMZW5ndGggJiBVREZfRVhURU5UX0xFTkdUSF9NQVNLKSArCisJCQlpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSA+PiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0czsKKwkJaW50OF90IGV0eXBlID0gKGxhYXJyW2N1cnJdLmV4dExlbmd0aCA+PiAzMCk7CisKKwkJaWYgKGJsZW4gPT0gMSkKKwkJCTsKKwkJZWxzZSBpZiAoIW9mZnNldCB8fCBibGVuID09IG9mZnNldCArIDEpCisJCXsKKwkJCWxhYXJyW2N1cnIrMl0gPSBsYWFycltjdXJyKzFdOworCQkJbGFhcnJbY3VycisxXSA9IGxhYXJyW2N1cnJdOworCQl9CisJCWVsc2UKKwkJeworCQkJbGFhcnJbY3VyciszXSA9IGxhYXJyW2N1cnIrMV07CisJCQlsYWFycltjdXJyKzJdID0gbGFhcnJbY3VycisxXSA9IGxhYXJyW2N1cnJdOworCQl9CisKKwkJaWYgKG9mZnNldCkKKwkJeworCQkJaWYgKGV0eXBlID09IChFWFRfTk9UX1JFQ09SREVEX0FMTE9DQVRFRCA+PiAzMCkpCisJCQl7CisJCQkJdWRmX2ZyZWVfYmxvY2tzKGlub2RlLT5pX3NiLCBpbm9kZSwgbGFhcnJbY3Vycl0uZXh0TG9jYXRpb24sIDAsIG9mZnNldCk7CisJCQkJbGFhcnJbY3Vycl0uZXh0TGVuZ3RoID0gRVhUX05PVF9SRUNPUkRFRF9OT1RfQUxMT0NBVEVEIHwKKwkJCQkJKG9mZnNldCA8PCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyk7CisJCQkJbGFhcnJbY3Vycl0uZXh0TG9jYXRpb24ubG9naWNhbEJsb2NrTnVtID0gMDsKKwkJCQlsYWFycltjdXJyXS5leHRMb2NhdGlvbi5wYXJ0aXRpb25SZWZlcmVuY2VOdW0gPSAwOworCQkJfQorCQkJZWxzZQorCQkJCWxhYXJyW2N1cnJdLmV4dExlbmd0aCA9IChldHlwZSA8PCAzMCkgfAorCQkJCQkob2Zmc2V0IDw8IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwkJCWN1cnIgKys7CisJCQkoKmMpICsrOworCQkJKCplbmRudW0pICsrOworCQl9CisJCQorCQlsYWFycltjdXJyXS5leHRMb2NhdGlvbi5sb2dpY2FsQmxvY2tOdW0gPSBuZXdibG9ja251bTsKKwkJaWYgKGV0eXBlID09IChFWFRfTk9UX1JFQ09SREVEX05PVF9BTExPQ0FURUQgPj4gMzApKQorCQkJbGFhcnJbY3Vycl0uZXh0TG9jYXRpb24ucGFydGl0aW9uUmVmZXJlbmNlTnVtID0KKwkJCQlVREZfSV9MT0NBVElPTihpbm9kZSkucGFydGl0aW9uUmVmZXJlbmNlTnVtOworCQlsYWFycltjdXJyXS5leHRMZW5ndGggPSBFWFRfUkVDT1JERURfQUxMT0NBVEVEIHwKKwkJCWlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwkJY3VyciArKzsKKworCQlpZiAoYmxlbiAhPSBvZmZzZXQgKyAxKQorCQl7CisJCQlpZiAoZXR5cGUgPT0gKEVYVF9OT1RfUkVDT1JERURfQUxMT0NBVEVEID4+IDMwKSkKKwkJCQlsYWFycltjdXJyXS5leHRMb2NhdGlvbi5sb2dpY2FsQmxvY2tOdW0gKz0gKG9mZnNldCArIDEpOworCQkJbGFhcnJbY3Vycl0uZXh0TGVuZ3RoID0gKGV0eXBlIDw8IDMwKSB8CisJCQkJKChibGVuIC0gKG9mZnNldCArIDEpKSA8PCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyk7CisJCQljdXJyICsrOworCQkJKCplbmRudW0pICsrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCB1ZGZfcHJlYWxsb2NfZXh0ZW50cyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgYywgaW50IGxhc3RibG9jaywKKwkga2VybmVsX2xvbmdfYWQgbGFhcnJbRVhURU5UX01FUkdFX1NJWkVdLCBpbnQgKmVuZG51bSkKK3sKKwlpbnQgc3RhcnQsIGxlbmd0aCA9IDAsIGN1cnJsZW5ndGggPSAwLCBpOworCisJaWYgKCplbmRudW0gPj0gKGMrMSkpCisJeworCQlpZiAoIWxhc3RibG9jaykKKwkJCXJldHVybjsKKwkJZWxzZQorCQkJc3RhcnQgPSBjOworCX0KKwllbHNlCisJeworCQlpZiAoKGxhYXJyW2MrMV0uZXh0TGVuZ3RoID4+IDMwKSA9PSAoRVhUX05PVF9SRUNPUkRFRF9BTExPQ0FURUQgPj4gMzApKQorCQl7CisJCQlzdGFydCA9IGMrMTsKKwkJCWxlbmd0aCA9IGN1cnJsZW5ndGggPSAoKChsYWFycltjKzFdLmV4dExlbmd0aCAmIFVERl9FWFRFTlRfTEVOR1RIX01BU0spICsKKwkJCQlpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSA+PiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyk7CisJCX0KKwkJZWxzZQorCQkJc3RhcnQgPSBjOworCX0KKworCWZvciAoaT1zdGFydCsxOyBpPD0qZW5kbnVtOyBpKyspCisJeworCQlpZiAoaSA9PSAqZW5kbnVtKQorCQl7CisJCQlpZiAobGFzdGJsb2NrKQorCQkJCWxlbmd0aCArPSBVREZfREVGQVVMVF9QUkVBTExPQ19CTE9DS1M7CisJCX0KKwkJZWxzZSBpZiAoKGxhYXJyW2ldLmV4dExlbmd0aCA+PiAzMCkgPT0gKEVYVF9OT1RfUkVDT1JERURfTk9UX0FMTE9DQVRFRCA+PiAzMCkpCisJCQlsZW5ndGggKz0gKCgobGFhcnJbaV0uZXh0TGVuZ3RoICYgVURGX0VYVEVOVF9MRU5HVEhfTUFTSykgKworCQkJCWlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpID4+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCisJaWYgKGxlbmd0aCkKKwl7CisJCWludCBuZXh0ID0gbGFhcnJbc3RhcnRdLmV4dExvY2F0aW9uLmxvZ2ljYWxCbG9ja051bSArCisJCQkoKChsYWFycltzdGFydF0uZXh0TGVuZ3RoICYgVURGX0VYVEVOVF9MRU5HVEhfTUFTSykgKworCQkJaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkgPj4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCQlpbnQgbnVtYWxsb2MgPSB1ZGZfcHJlYWxsb2NfYmxvY2tzKGlub2RlLT5pX3NiLCBpbm9kZSwKKwkJCWxhYXJyW3N0YXJ0XS5leHRMb2NhdGlvbi5wYXJ0aXRpb25SZWZlcmVuY2VOdW0sCisJCQluZXh0LCAoVURGX0RFRkFVTFRfUFJFQUxMT0NfQkxPQ0tTID4gbGVuZ3RoID8gbGVuZ3RoIDoKKwkJCQlVREZfREVGQVVMVF9QUkVBTExPQ19CTE9DS1MpIC0gY3Vycmxlbmd0aCk7CisKKwkJaWYgKG51bWFsbG9jKQorCQl7CisJCQlpZiAoc3RhcnQgPT0gKGMrMSkpCisJCQkJbGFhcnJbc3RhcnRdLmV4dExlbmd0aCArPQorCQkJCQkobnVtYWxsb2MgPDwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCQkJZWxzZQorCQkJeworCQkJCW1lbW1vdmUoJmxhYXJyW2MrMl0sICZsYWFycltjKzFdLAorCQkJCQlzaXplb2YobG9uZ19hZCkgKiAoKmVuZG51bSAtIChjKzEpKSk7CisJCQkJKCplbmRudW0pICsrOworCQkJCWxhYXJyW2MrMV0uZXh0TG9jYXRpb24ubG9naWNhbEJsb2NrTnVtID0gbmV4dDsKKwkJCQlsYWFycltjKzFdLmV4dExvY2F0aW9uLnBhcnRpdGlvblJlZmVyZW5jZU51bSA9CisJCQkJCWxhYXJyW2NdLmV4dExvY2F0aW9uLnBhcnRpdGlvblJlZmVyZW5jZU51bTsKKwkJCQlsYWFycltjKzFdLmV4dExlbmd0aCA9IEVYVF9OT1RfUkVDT1JERURfQUxMT0NBVEVEIHwKKwkJCQkJKG51bWFsbG9jIDw8IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwkJCQlzdGFydCA9IGMrMTsKKwkJCX0KKworCQkJZm9yIChpPXN0YXJ0KzE7IG51bWFsbG9jICYmIGk8KmVuZG51bTsgaSsrKQorCQkJeworCQkJCWludCBlbGVuID0gKChsYWFycltpXS5leHRMZW5ndGggJiBVREZfRVhURU5UX0xFTkdUSF9NQVNLKSArCisJCQkJCWlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpID4+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCisJCQkJaWYgKGVsZW4gPiBudW1hbGxvYykKKwkJCQl7CisJCQkJCWxhYXJyW2ldLmV4dExlbmd0aCAtPQorCQkJCQkJKG51bWFsbG9jIDw8IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwkJCQkJbnVtYWxsb2MgPSAwOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQludW1hbGxvYyAtPSBlbGVuOworCQkJCQlpZiAoKmVuZG51bSA+IChpKzEpKQorCQkJCQkJbWVtbW92ZSgmbGFhcnJbaV0sICZsYWFycltpKzFdLCAKKwkJCQkJCQlzaXplb2YobG9uZ19hZCkgKiAoKmVuZG51bSAtIChpKzEpKSk7CisJCQkJCWkgLS07CisJCQkJCSgqZW5kbnVtKSAtLTsKKwkJCQl9CisJCQl9CisJCQlVREZfSV9MRU5FWFRFTlRTKGlub2RlKSArPSBudW1hbGxvYyA8PCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0czsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgdWRmX21lcmdlX2V4dGVudHMoc3RydWN0IGlub2RlICppbm9kZSwKKwkga2VybmVsX2xvbmdfYWQgbGFhcnJbRVhURU5UX01FUkdFX1NJWkVdLCBpbnQgKmVuZG51bSkKK3sKKwlpbnQgaTsKKworCWZvciAoaT0wOyBpPCgqZW5kbnVtLTEpOyBpKyspCisJeworCQlpZiAoKGxhYXJyW2ldLmV4dExlbmd0aCA+PiAzMCkgPT0gKGxhYXJyW2krMV0uZXh0TGVuZ3RoID4+IDMwKSkKKwkJeworCQkJaWYgKCgobGFhcnJbaV0uZXh0TGVuZ3RoID4+IDMwKSA9PSAoRVhUX05PVF9SRUNPUkRFRF9OT1RfQUxMT0NBVEVEID4+IDMwKSkgfHwKKwkJCQkoKGxhYXJyW2krMV0uZXh0TG9jYXRpb24ubG9naWNhbEJsb2NrTnVtIC0gbGFhcnJbaV0uZXh0TG9jYXRpb24ubG9naWNhbEJsb2NrTnVtKSA9PQorCQkJCSgoKGxhYXJyW2ldLmV4dExlbmd0aCAmIFVERl9FWFRFTlRfTEVOR1RIX01BU0spICsKKwkJCQlpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSA+PiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cykpKQorCQkJeworCQkJCWlmICgoKGxhYXJyW2ldLmV4dExlbmd0aCAmIFVERl9FWFRFTlRfTEVOR1RIX01BU0spICsKKwkJCQkJKGxhYXJyW2krMV0uZXh0TGVuZ3RoICYgVURGX0VYVEVOVF9MRU5HVEhfTUFTSykgKworCQkJCQlpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSAmIH5VREZfRVhURU5UX0xFTkdUSF9NQVNLKQorCQkJCXsKKwkJCQkJbGFhcnJbaSsxXS5leHRMZW5ndGggPSAobGFhcnJbaSsxXS5leHRMZW5ndGggLQorCQkJCQkJKGxhYXJyW2ldLmV4dExlbmd0aCAmIFVERl9FWFRFTlRfTEVOR1RIX01BU0spICsKKwkJCQkJCVVERl9FWFRFTlRfTEVOR1RIX01BU0spICYgfihpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUtMSk7CisJCQkJCWxhYXJyW2ldLmV4dExlbmd0aCA9IChsYWFycltpXS5leHRMZW5ndGggJiBVREZfRVhURU5UX0ZMQUdfTUFTSykgKworCQkJCQkJKFVERl9FWFRFTlRfTEVOR1RIX01BU0sgKyAxKSAtIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwkJCQkJbGFhcnJbaSsxXS5leHRMb2NhdGlvbi5sb2dpY2FsQmxvY2tOdW0gPQorCQkJCQkJbGFhcnJbaV0uZXh0TG9jYXRpb24ubG9naWNhbEJsb2NrTnVtICsKKwkJCQkJCSgobGFhcnJbaV0uZXh0TGVuZ3RoICYgVURGX0VYVEVOVF9MRU5HVEhfTUFTSykgPj4KKwkJCQkJCQlpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWxhYXJyW2ldLmV4dExlbmd0aCA9IGxhYXJyW2krMV0uZXh0TGVuZ3RoICsKKwkJCQkJCSgoKGxhYXJyW2ldLmV4dExlbmd0aCAmIFVERl9FWFRFTlRfTEVOR1RIX01BU0spICsKKwkJCQkJCWlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpICYgfihpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUtMSkpOworCQkJCQlpZiAoKmVuZG51bSA+IChpKzIpKQorCQkJCQkJbWVtbW92ZSgmbGFhcnJbaSsxXSwgJmxhYXJyW2krMl0sCisJCQkJCQkJc2l6ZW9mKGxvbmdfYWQpICogKCplbmRudW0gLSAoaSsyKSkpOworCQkJCQlpIC0tOworCQkJCQkoKmVuZG51bSkgLS07CisJCQkJfQorCQkJfQorCQl9CisJCWVsc2UgaWYgKCgobGFhcnJbaV0uZXh0TGVuZ3RoID4+IDMwKSA9PSAoRVhUX05PVF9SRUNPUkRFRF9BTExPQ0FURUQgPj4gMzApKSAmJgorCQkJKChsYWFycltpKzFdLmV4dExlbmd0aCA+PiAzMCkgPT0gKEVYVF9OT1RfUkVDT1JERURfTk9UX0FMTE9DQVRFRCA+PiAzMCkpKQorCQl7CisJCQl1ZGZfZnJlZV9ibG9ja3MoaW5vZGUtPmlfc2IsIGlub2RlLCBsYWFycltpXS5leHRMb2NhdGlvbiwgMCwKKwkJCQkoKGxhYXJyW2ldLmV4dExlbmd0aCAmIFVERl9FWFRFTlRfTEVOR1RIX01BU0spICsKKwkJCQlpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSA+PiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyk7CisJCQlsYWFycltpXS5leHRMb2NhdGlvbi5sb2dpY2FsQmxvY2tOdW0gPSAwOworCQkJbGFhcnJbaV0uZXh0TG9jYXRpb24ucGFydGl0aW9uUmVmZXJlbmNlTnVtID0gMDsKKworCQkJaWYgKCgobGFhcnJbaV0uZXh0TGVuZ3RoICYgVURGX0VYVEVOVF9MRU5HVEhfTUFTSykgKworCQkJCShsYWFycltpKzFdLmV4dExlbmd0aCAmIFVERl9FWFRFTlRfTEVOR1RIX01BU0spICsKKwkJCQlpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSAmIH5VREZfRVhURU5UX0xFTkdUSF9NQVNLKQorCQkJeworCQkJCWxhYXJyW2krMV0uZXh0TGVuZ3RoID0gKGxhYXJyW2krMV0uZXh0TGVuZ3RoIC0KKwkJCQkJKGxhYXJyW2ldLmV4dExlbmd0aCAmIFVERl9FWFRFTlRfTEVOR1RIX01BU0spICsKKwkJCQkJVURGX0VYVEVOVF9MRU5HVEhfTUFTSykgJiB+KGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZS0xKTsKKwkJCQlsYWFycltpXS5leHRMZW5ndGggPSAobGFhcnJbaV0uZXh0TGVuZ3RoICYgVURGX0VYVEVOVF9GTEFHX01BU0spICsKKwkJCQkJKFVERl9FWFRFTlRfTEVOR1RIX01BU0sgKyAxKSAtIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlsYWFycltpXS5leHRMZW5ndGggPSBsYWFycltpKzFdLmV4dExlbmd0aCArCisJCQkJCSgoKGxhYXJyW2ldLmV4dExlbmd0aCAmIFVERl9FWFRFTlRfTEVOR1RIX01BU0spICsKKwkJCQkJaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkgJiB+KGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZS0xKSk7CisJCQkJaWYgKCplbmRudW0gPiAoaSsyKSkKKwkJCQkJbWVtbW92ZSgmbGFhcnJbaSsxXSwgJmxhYXJyW2krMl0sCisJCQkJCQlzaXplb2YobG9uZ19hZCkgKiAoKmVuZG51bSAtIChpKzIpKSk7CisJCQkJaSAtLTsKKwkJCQkoKmVuZG51bSkgLS07CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoKGxhYXJyW2ldLmV4dExlbmd0aCA+PiAzMCkgPT0gKEVYVF9OT1RfUkVDT1JERURfQUxMT0NBVEVEID4+IDMwKSkKKwkJeworCQkJdWRmX2ZyZWVfYmxvY2tzKGlub2RlLT5pX3NiLCBpbm9kZSwgbGFhcnJbaV0uZXh0TG9jYXRpb24sIDAsCisJCQkJKChsYWFycltpXS5leHRMZW5ndGggJiBVREZfRVhURU5UX0xFTkdUSF9NQVNLKSArCisJCQkgICAgICAgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkgPj4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCQkJbGFhcnJbaV0uZXh0TG9jYXRpb24ubG9naWNhbEJsb2NrTnVtID0gMDsKKwkJCWxhYXJyW2ldLmV4dExvY2F0aW9uLnBhcnRpdGlvblJlZmVyZW5jZU51bSA9IDA7CisJCQlsYWFycltpXS5leHRMZW5ndGggPSAobGFhcnJbaV0uZXh0TGVuZ3RoICYgVURGX0VYVEVOVF9MRU5HVEhfTUFTSykgfAorCQkJCUVYVF9OT1RfUkVDT1JERURfTk9UX0FMTE9DQVRFRDsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgdWRmX3VwZGF0ZV9leHRlbnRzKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJa2VybmVsX2xvbmdfYWQgbGFhcnJbRVhURU5UX01FUkdFX1NJWkVdLCBpbnQgc3RhcnRudW0sIGludCBlbmRudW0sCisJa2VybmVsX2xiX2FkZHIgcGJsb2MsIHVpbnQzMl90IHBleHRvZmZzZXQsIHN0cnVjdCBidWZmZXJfaGVhZCAqKnBiaCkKK3sKKwlpbnQgc3RhcnQgPSAwLCBpOworCWtlcm5lbF9sYl9hZGRyIHRtcGxvYzsKKwl1aW50MzJfdCB0bXBsZW47CisKKwlpZiAoc3RhcnRudW0gPiBlbmRudW0pCisJeworCQlmb3IgKGk9MDsgaTwoc3RhcnRudW0tZW5kbnVtKTsgaSsrKQorCQl7CisJCQl1ZGZfZGVsZXRlX2FleHQoaW5vZGUsIHBibG9jLCBwZXh0b2Zmc2V0LCBsYWFycltpXS5leHRMb2NhdGlvbiwKKwkJCQlsYWFycltpXS5leHRMZW5ndGgsICpwYmgpOworCQl9CisJfQorCWVsc2UgaWYgKHN0YXJ0bnVtIDwgZW5kbnVtKQorCXsKKwkJZm9yIChpPTA7IGk8KGVuZG51bS1zdGFydG51bSk7IGkrKykKKwkJeworCQkJdWRmX2luc2VydF9hZXh0KGlub2RlLCBwYmxvYywgcGV4dG9mZnNldCwgbGFhcnJbaV0uZXh0TG9jYXRpb24sCisJCQkJbGFhcnJbaV0uZXh0TGVuZ3RoLCAqcGJoKTsKKwkJCXVkZl9uZXh0X2FleHQoaW5vZGUsICZwYmxvYywgJnBleHRvZmZzZXQsICZsYWFycltpXS5leHRMb2NhdGlvbiwKKwkJCQkmbGFhcnJbaV0uZXh0TGVuZ3RoLCBwYmgsIDEpOworCQkJc3RhcnQgKys7CisJCX0KKwl9CisKKwlmb3IgKGk9c3RhcnQ7IGk8ZW5kbnVtOyBpKyspCisJeworCQl1ZGZfbmV4dF9hZXh0KGlub2RlLCAmcGJsb2MsICZwZXh0b2Zmc2V0LCAmdG1wbG9jLCAmdG1wbGVuLCBwYmgsIDApOworCQl1ZGZfd3JpdGVfYWV4dChpbm9kZSwgcGJsb2MsICZwZXh0b2Zmc2V0LCBsYWFycltpXS5leHRMb2NhdGlvbiwKKwkJCWxhYXJyW2ldLmV4dExlbmd0aCwgKnBiaCwgMSk7CisJfQorfQorCitzdHJ1Y3QgYnVmZmVyX2hlYWQgKiB1ZGZfYnJlYWQoc3RydWN0IGlub2RlICogaW5vZGUsIGludCBibG9jaywKKwlpbnQgY3JlYXRlLCBpbnQgKiBlcnIpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmggPSBOVUxMOworCisJYmggPSB1ZGZfZ2V0YmxrKGlub2RlLCBibG9jaywgY3JlYXRlLCBlcnIpOworCWlmICghYmgpCisJCXJldHVybiBOVUxMOworCisJaWYgKGJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCXJldHVybiBiaDsKKwlsbF9yd19ibG9jayhSRUFELCAxLCAmYmgpOworCXdhaXRfb25fYnVmZmVyKGJoKTsKKwlpZiAoYnVmZmVyX3VwdG9kYXRlKGJoKSkKKwkJcmV0dXJuIGJoOworCWJyZWxzZShiaCk7CisJKmVyciA9IC1FSU87CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgdWRmX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCWludCBvZmZzZXQ7CisJaW50IGVycjsKKworCWlmICghKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0RJUihpbm9kZS0+aV9tb2RlKSB8fAorCQkJU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkpCisJCXJldHVybjsKKwlpZiAoSVNfQVBQRU5EKGlub2RlKSB8fCBJU19JTU1VVEFCTEUoaW5vZGUpKQorCQlyZXR1cm47CisKKwlsb2NrX2tlcm5lbCgpOworCWlmIChVREZfSV9BTExPQ1RZUEUoaW5vZGUpID09IElDQlRBR19GTEFHX0FEX0lOX0lDQikKKwl7CisJCWlmIChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgPCAodWRmX2ZpbGVfZW50cnlfYWxsb2Nfb2Zmc2V0KGlub2RlKSArCisJCQlpbm9kZS0+aV9zaXplKSkKKwkJeworCQkJdWRmX2V4cGFuZF9maWxlX2FkaW5pY2IoaW5vZGUsIGlub2RlLT5pX3NpemUsICZlcnIpOworCQkJaWYgKFVERl9JX0FMTE9DVFlQRShpbm9kZSkgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKQorCQkJeworCQkJCWlub2RlLT5pX3NpemUgPSBVREZfSV9MRU5BTExPQyhpbm9kZSk7CisJCQkJdW5sb2NrX2tlcm5lbCgpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWVsc2UKKwkJCQl1ZGZfdHJ1bmNhdGVfZXh0ZW50cyhpbm9kZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlvZmZzZXQgPSBpbm9kZS0+aV9zaXplICYgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpOworCQkJbWVtc2V0KFVERl9JX0RBVEEoaW5vZGUpICsgVURGX0lfTEVORUFUVFIoaW5vZGUpICsgb2Zmc2V0LCAweDAwLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSBvZmZzZXQgLSB1ZGZfZmlsZV9lbnRyeV9hbGxvY19vZmZzZXQoaW5vZGUpKTsKKwkJCVVERl9JX0xFTkFMTE9DKGlub2RlKSA9IGlub2RlLT5pX3NpemU7CisJCX0KKwl9CisJZWxzZQorCXsKKwkJYmxvY2tfdHJ1bmNhdGVfcGFnZShpbm9kZS0+aV9tYXBwaW5nLCBpbm9kZS0+aV9zaXplLCB1ZGZfZ2V0X2Jsb2NrKTsKKwkJdWRmX3RydW5jYXRlX2V4dGVudHMoaW5vZGUpOworCX0JCisKKwlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gY3VycmVudF9mc190aW1lKGlub2RlLT5pX3NiKTsKKwlpZiAoSVNfU1lOQyhpbm9kZSkpCisJCXVkZl9zeW5jX2lub2RlIChpbm9kZSk7CisJZWxzZQorCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwl1bmxvY2tfa2VybmVsKCk7Cit9CisKK3N0YXRpYyB2b2lkCitfX3VkZl9yZWFkX2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJc3RydWN0IGZpbGVFbnRyeSAqZmU7CisJdWludDE2X3QgaWRlbnQ7CisKKwkvKgorCSAqIFNldCBkZWZhdWx0cywgYnV0IHRoZSBpbm9kZSBpcyBzdGlsbCBpbmNvbXBsZXRlIQorCSAqIE5vdGU6IGdldF9uZXdfaW5vZGUoKSBzZXRzIHRoZSBmb2xsb3dpbmcgb24gYSBuZXcgaW5vZGU6CisJICogICAgICBpX3NiID0gc2IKKwkgKiAgICAgIGlfbm8gPSBpbm8KKwkgKiAgICAgIGlfZmxhZ3MgPSBzYi0+c19mbGFncworCSAqICAgICAgaV9zdGF0ZSA9IDAKKwkgKiBjbGVhbl9pbm9kZSgpOiB6ZXJvIGZpbGxzIGFuZCBzZXRzCisJICogICAgICBpX2NvdW50ID0gMQorCSAqICAgICAgaV9ubGluayA9IDEKKwkgKiAgICAgIGlfb3AgPSBOVUxMOworCSAqLworCWlub2RlLT5pX2Jsa3NpemUgPSBQQUdFX1NJWkU7CisKKwliaCA9IHVkZl9yZWFkX3B0YWdnZWQoaW5vZGUtPmlfc2IsIFVERl9JX0xPQ0FUSU9OKGlub2RlKSwgMCwgJmlkZW50KTsKKworCWlmICghYmgpCisJeworCQlwcmludGsoS0VSTl9FUlIgInVkZjogdWRmX3JlYWRfaW5vZGUoaW5vICVsZCkgZmFpbGVkICFiaFxuIiwKKwkJCWlub2RlLT5pX2lubyk7CisJCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpZGVudCAhPSBUQUdfSURFTlRfRkUgJiYgaWRlbnQgIT0gVEFHX0lERU5UX0VGRSAmJgorCQlpZGVudCAhPSBUQUdfSURFTlRfVVNFKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJ1ZGY6IHVkZl9yZWFkX2lub2RlKGlubyAlbGQpIGZhaWxlZCBpZGVudD0lZFxuIiwKKwkJCWlub2RlLT5pX2lubywgaWRlbnQpOworCQl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKwkJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCQlyZXR1cm47CisJfQorCisJZmUgPSAoc3RydWN0IGZpbGVFbnRyeSAqKWJoLT5iX2RhdGE7CisKKwlpZiAobGUxNl90b19jcHUoZmUtPmljYlRhZy5zdHJhdGVneVR5cGUpID09IDQwOTYpCisJeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmliaCA9IE5VTEwsICpuYmggPSBOVUxMOworCQlzdHJ1Y3QgaW5kaXJlY3RFbnRyeSAqaWU7CisKKwkJaWJoID0gdWRmX3JlYWRfcHRhZ2dlZChpbm9kZS0+aV9zYiwgVURGX0lfTE9DQVRJT04oaW5vZGUpLCAxLCAmaWRlbnQpOworCQlpZiAoaWRlbnQgPT0gVEFHX0lERU5UX0lFKQorCQl7CisJCQlpZiAoaWJoKQorCQkJeworCQkJCWtlcm5lbF9sYl9hZGRyIGxvYzsKKwkJCQlpZSA9IChzdHJ1Y3QgaW5kaXJlY3RFbnRyeSAqKWliaC0+Yl9kYXRhOworCQorCQkJCWxvYyA9IGxlbGJfdG9fY3B1KGllLT5pbmRpcmVjdElDQi5leHRMb2NhdGlvbik7CisJCisJCQkJaWYgKGllLT5pbmRpcmVjdElDQi5leHRMZW5ndGggJiYgCisJCQkJCShuYmggPSB1ZGZfcmVhZF9wdGFnZ2VkKGlub2RlLT5pX3NiLCBsb2MsIDAsICZpZGVudCkpKQorCQkJCXsKKwkJCQkJaWYgKGlkZW50ID09IFRBR19JREVOVF9GRSB8fAorCQkJCQkJaWRlbnQgPT0gVEFHX0lERU5UX0VGRSkKKwkJCQkJeworCQkJCQkJbWVtY3B5KCZVREZfSV9MT0NBVElPTihpbm9kZSksICZsb2MsIHNpemVvZihrZXJuZWxfbGJfYWRkcikpOworCQkJCQkJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisJCQkJCQl1ZGZfcmVsZWFzZV9kYXRhKGliaCk7CisJCQkJCQl1ZGZfcmVsZWFzZV9kYXRhKG5iaCk7CisJCQkJCQlfX3VkZl9yZWFkX2lub2RlKGlub2RlKTsKKwkJCQkJCXJldHVybjsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCXVkZl9yZWxlYXNlX2RhdGEobmJoKTsKKwkJCQkJCXVkZl9yZWxlYXNlX2RhdGEoaWJoKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJCXVkZl9yZWxlYXNlX2RhdGEoaWJoKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCQl1ZGZfcmVsZWFzZV9kYXRhKGliaCk7CisJfQorCWVsc2UgaWYgKGxlMTZfdG9fY3B1KGZlLT5pY2JUYWcuc3RyYXRlZ3lUeXBlKSAhPSA0KQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJ1ZGY6IHVuc3VwcG9ydGVkIHN0cmF0ZWd5IHR5cGU6ICVkXG4iLAorCQkJbGUxNl90b19jcHUoZmUtPmljYlRhZy5zdHJhdGVneVR5cGUpKTsKKwkJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisJCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwkJcmV0dXJuOworCX0KKwl1ZGZfZmlsbF9pbm9kZShpbm9kZSwgYmgpOworCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworfQorCitzdGF0aWMgdm9pZCB1ZGZfZmlsbF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXN0cnVjdCBmaWxlRW50cnkgKmZlOworCXN0cnVjdCBleHRlbmRlZEZpbGVFbnRyeSAqZWZlOworCXRpbWVfdCBjb252dGltZTsKKwlsb25nIGNvbnZ0aW1lX3VzZWM7CisJaW50IG9mZnNldDsKKworCWZlID0gKHN0cnVjdCBmaWxlRW50cnkgKiliaC0+Yl9kYXRhOworCWVmZSA9IChzdHJ1Y3QgZXh0ZW5kZWRGaWxlRW50cnkgKiliaC0+Yl9kYXRhOworCisJaWYgKGxlMTZfdG9fY3B1KGZlLT5pY2JUYWcuc3RyYXRlZ3lUeXBlKSA9PSA0KQorCQlVREZfSV9TVFJBVDQwOTYoaW5vZGUpID0gMDsKKwllbHNlIC8qIGlmIChsZTE2X3RvX2NwdShmZS0+aWNiVGFnLnN0cmF0ZWd5VHlwZSkgPT0gNDA5NikgKi8KKwkJVURGX0lfU1RSQVQ0MDk2KGlub2RlKSA9IDE7CisKKwlVREZfSV9BTExPQ1RZUEUoaW5vZGUpID0gbGUxNl90b19jcHUoZmUtPmljYlRhZy5mbGFncykgJiBJQ0JUQUdfRkxBR19BRF9NQVNLOworCVVERl9JX1VOSVFVRShpbm9kZSkgPSAwOworCVVERl9JX0xFTkVBVFRSKGlub2RlKSA9IDA7CisJVURGX0lfTEVORVhURU5UUyhpbm9kZSkgPSAwOworCVVERl9JX0xFTkFMTE9DKGlub2RlKSA9IDA7CisJVURGX0lfTkVYVF9BTExPQ19CTE9DSyhpbm9kZSkgPSAwOworCVVERl9JX05FWFRfQUxMT0NfR09BTChpbm9kZSkgPSAwOworCWlmIChsZTE2X3RvX2NwdShmZS0+ZGVzY1RhZy50YWdJZGVudCkgPT0gVEFHX0lERU5UX0VGRSkKKwl7CisJCVVERl9JX0VGRShpbm9kZSkgPSAxOworCQlVREZfSV9VU0UoaW5vZGUpID0gMDsKKwkJVURGX0lfREFUQShpbm9kZSkgPSBrbWFsbG9jKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZXh0ZW5kZWRGaWxlRW50cnkpLCBHRlBfS0VSTkVMKTsKKwkJbWVtY3B5KFVERl9JX0RBVEEoaW5vZGUpLCBiaC0+Yl9kYXRhICsgc2l6ZW9mKHN0cnVjdCBleHRlbmRlZEZpbGVFbnRyeSksIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZXh0ZW5kZWRGaWxlRW50cnkpKTsKKwl9CisJZWxzZSBpZiAobGUxNl90b19jcHUoZmUtPmRlc2NUYWcudGFnSWRlbnQpID09IFRBR19JREVOVF9GRSkKKwl7CisJCVVERl9JX0VGRShpbm9kZSkgPSAwOworCQlVREZfSV9VU0UoaW5vZGUpID0gMDsKKwkJVURGX0lfREFUQShpbm9kZSkgPSBrbWFsbG9jKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZmlsZUVudHJ5KSwgR0ZQX0tFUk5FTCk7CisJCW1lbWNweShVREZfSV9EQVRBKGlub2RlKSwgYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgZmlsZUVudHJ5KSwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gc2l6ZW9mKHN0cnVjdCBmaWxlRW50cnkpKTsKKwl9CisJZWxzZSBpZiAobGUxNl90b19jcHUoZmUtPmRlc2NUYWcudGFnSWRlbnQpID09IFRBR19JREVOVF9VU0UpCisJeworCQlVREZfSV9FRkUoaW5vZGUpID0gMDsKKwkJVURGX0lfVVNFKGlub2RlKSA9IDE7CisJCVVERl9JX0xFTkFMTE9DKGlub2RlKSA9CisJCQlsZTMyX3RvX2NwdSgKKwkJCQkoKHN0cnVjdCB1bmFsbG9jU3BhY2VFbnRyeSAqKWJoLT5iX2RhdGEpLT5sZW5ndGhBbGxvY0Rlc2NzKTsKKwkJVURGX0lfREFUQShpbm9kZSkgPSBrbWFsbG9jKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgdW5hbGxvY1NwYWNlRW50cnkpLCBHRlBfS0VSTkVMKTsKKwkJbWVtY3B5KFVERl9JX0RBVEEoaW5vZGUpLCBiaC0+Yl9kYXRhICsgc2l6ZW9mKHN0cnVjdCB1bmFsbG9jU3BhY2VFbnRyeSksIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgdW5hbGxvY1NwYWNlRW50cnkpKTsKKwkJcmV0dXJuOworCX0KKworCWlub2RlLT5pX3VpZCA9IGxlMzJfdG9fY3B1KGZlLT51aWQpOworCWlmICggaW5vZGUtPmlfdWlkID09IC0xICkgaW5vZGUtPmlfdWlkID0gVURGX1NCKGlub2RlLT5pX3NiKS0+c191aWQ7CisKKwlpbm9kZS0+aV9naWQgPSBsZTMyX3RvX2NwdShmZS0+Z2lkKTsKKwlpZiAoIGlub2RlLT5pX2dpZCA9PSAtMSApIGlub2RlLT5pX2dpZCA9IFVERl9TQihpbm9kZS0+aV9zYiktPnNfZ2lkOworCisJaW5vZGUtPmlfbmxpbmsgPSBsZTE2X3RvX2NwdShmZS0+ZmlsZUxpbmtDb3VudCk7CisJaWYgKCFpbm9kZS0+aV9ubGluaykKKwkJaW5vZGUtPmlfbmxpbmsgPSAxOworCQorCWlub2RlLT5pX3NpemUgPSBsZTY0X3RvX2NwdShmZS0+aW5mb3JtYXRpb25MZW5ndGgpOworCVVERl9JX0xFTkVYVEVOVFMoaW5vZGUpID0gaW5vZGUtPmlfc2l6ZTsKKworCWlub2RlLT5pX21vZGUgPSB1ZGZfY29udmVydF9wZXJtaXNzaW9ucyhmZSk7CisJaW5vZGUtPmlfbW9kZSAmPSB+VURGX1NCKGlub2RlLT5pX3NiKS0+c191bWFzazsKKworCWlmIChVREZfSV9FRkUoaW5vZGUpID09IDApCisJeworCQlpbm9kZS0+aV9ibG9ja3MgPSBsZTY0X3RvX2NwdShmZS0+bG9naWNhbEJsb2Nrc1JlY29yZGVkKSA8PAorCQkJKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gOSk7CisKKwkJaWYgKCB1ZGZfc3RhbXBfdG9fdGltZSgmY29udnRpbWUsICZjb252dGltZV91c2VjLAorCQkJbGV0c190b19jcHUoZmUtPmFjY2Vzc1RpbWUpKSApCisJCXsKKwkJCWlub2RlLT5pX2F0aW1lLnR2X3NlYyA9IGNvbnZ0aW1lOworCQkJaW5vZGUtPmlfYXRpbWUudHZfbnNlYyA9IGNvbnZ0aW1lX3VzZWMgKiAxMDAwOworCQl9CisJCWVsc2UKKwkJeworCQkJaW5vZGUtPmlfYXRpbWUgPSBVREZfU0JfUkVDT1JEVElNRShpbm9kZS0+aV9zYik7CisJCX0KKworCQlpZiAoIHVkZl9zdGFtcF90b190aW1lKCZjb252dGltZSwgJmNvbnZ0aW1lX3VzZWMsCisJCQlsZXRzX3RvX2NwdShmZS0+bW9kaWZpY2F0aW9uVGltZSkpICkKKwkJeworCQkJaW5vZGUtPmlfbXRpbWUudHZfc2VjID0gY29udnRpbWU7CisJCQlpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gY29udnRpbWVfdXNlYyAqIDEwMDA7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpbm9kZS0+aV9tdGltZSA9IFVERl9TQl9SRUNPUkRUSU1FKGlub2RlLT5pX3NiKTsKKwkJfQorCisJCWlmICggdWRmX3N0YW1wX3RvX3RpbWUoJmNvbnZ0aW1lLCAmY29udnRpbWVfdXNlYywKKwkJCWxldHNfdG9fY3B1KGZlLT5hdHRyVGltZSkpICkKKwkJeworCQkJaW5vZGUtPmlfY3RpbWUudHZfc2VjID0gY29udnRpbWU7CisJCQlpbm9kZS0+aV9jdGltZS50dl9uc2VjID0gY29udnRpbWVfdXNlYyAqIDEwMDA7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpbm9kZS0+aV9jdGltZSA9IFVERl9TQl9SRUNPUkRUSU1FKGlub2RlLT5pX3NiKTsKKwkJfQorCisJCVVERl9JX1VOSVFVRShpbm9kZSkgPSBsZTY0X3RvX2NwdShmZS0+dW5pcXVlSUQpOworCQlVREZfSV9MRU5FQVRUUihpbm9kZSkgPSBsZTMyX3RvX2NwdShmZS0+bGVuZ3RoRXh0ZW5kZWRBdHRyKTsKKwkJVURGX0lfTEVOQUxMT0MoaW5vZGUpID0gbGUzMl90b19jcHUoZmUtPmxlbmd0aEFsbG9jRGVzY3MpOworCQlvZmZzZXQgPSBzaXplb2Yoc3RydWN0IGZpbGVFbnRyeSkgKyBVREZfSV9MRU5FQVRUUihpbm9kZSk7CisJfQorCWVsc2UKKwl7CisJCWlub2RlLT5pX2Jsb2NrcyA9IGxlNjRfdG9fY3B1KGVmZS0+bG9naWNhbEJsb2Nrc1JlY29yZGVkKSA8PCAKKwkJCShpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyAtIDkpOworCisJCWlmICggdWRmX3N0YW1wX3RvX3RpbWUoJmNvbnZ0aW1lLCAmY29udnRpbWVfdXNlYywKKwkJCWxldHNfdG9fY3B1KGVmZS0+YWNjZXNzVGltZSkpICkKKwkJeworCQkJaW5vZGUtPmlfYXRpbWUudHZfc2VjID0gY29udnRpbWU7CisJCQlpbm9kZS0+aV9hdGltZS50dl9uc2VjID0gY29udnRpbWVfdXNlYyAqIDEwMDA7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpbm9kZS0+aV9hdGltZSA9IFVERl9TQl9SRUNPUkRUSU1FKGlub2RlLT5pX3NiKTsKKwkJfQorCisJCWlmICggdWRmX3N0YW1wX3RvX3RpbWUoJmNvbnZ0aW1lLCAmY29udnRpbWVfdXNlYywKKwkJCWxldHNfdG9fY3B1KGVmZS0+bW9kaWZpY2F0aW9uVGltZSkpICkKKwkJeworCQkJaW5vZGUtPmlfbXRpbWUudHZfc2VjID0gY29udnRpbWU7CisJCQlpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gY29udnRpbWVfdXNlYyAqIDEwMDA7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpbm9kZS0+aV9tdGltZSA9IFVERl9TQl9SRUNPUkRUSU1FKGlub2RlLT5pX3NiKTsKKwkJfQorCisJCWlmICggdWRmX3N0YW1wX3RvX3RpbWUoJmNvbnZ0aW1lLCAmY29udnRpbWVfdXNlYywKKwkJCWxldHNfdG9fY3B1KGVmZS0+Y3JlYXRlVGltZSkpICkKKwkJeworCQkJVURGX0lfQ1JUSU1FKGlub2RlKS50dl9zZWMgPSBjb252dGltZTsKKwkJCVVERl9JX0NSVElNRShpbm9kZSkudHZfbnNlYyA9IGNvbnZ0aW1lX3VzZWMgKiAxMDAwOworCQl9CisJCWVsc2UKKwkJeworCQkJVURGX0lfQ1JUSU1FKGlub2RlKSA9IFVERl9TQl9SRUNPUkRUSU1FKGlub2RlLT5pX3NiKTsKKwkJfQorCisJCWlmICggdWRmX3N0YW1wX3RvX3RpbWUoJmNvbnZ0aW1lLCAmY29udnRpbWVfdXNlYywKKwkJCWxldHNfdG9fY3B1KGVmZS0+YXR0clRpbWUpKSApCisJCXsKKwkJCWlub2RlLT5pX2N0aW1lLnR2X3NlYyA9IGNvbnZ0aW1lOworCQkJaW5vZGUtPmlfY3RpbWUudHZfbnNlYyA9IGNvbnZ0aW1lX3VzZWMgKiAxMDAwOworCQl9CisJCWVsc2UKKwkJeworCQkJaW5vZGUtPmlfY3RpbWUgPSBVREZfU0JfUkVDT1JEVElNRShpbm9kZS0+aV9zYik7CisJCX0KKworCQlVREZfSV9VTklRVUUoaW5vZGUpID0gbGU2NF90b19jcHUoZWZlLT51bmlxdWVJRCk7CisJCVVERl9JX0xFTkVBVFRSKGlub2RlKSA9IGxlMzJfdG9fY3B1KGVmZS0+bGVuZ3RoRXh0ZW5kZWRBdHRyKTsKKwkJVURGX0lfTEVOQUxMT0MoaW5vZGUpID0gbGUzMl90b19jcHUoZWZlLT5sZW5ndGhBbGxvY0Rlc2NzKTsKKwkJb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBleHRlbmRlZEZpbGVFbnRyeSkgKyBVREZfSV9MRU5FQVRUUihpbm9kZSk7CisJfQorCisJc3dpdGNoIChmZS0+aWNiVGFnLmZpbGVUeXBlKQorCXsKKwkJY2FzZSBJQ0JUQUdfRklMRV9UWVBFX0RJUkVDVE9SWToKKwkJeworCQkJaW5vZGUtPmlfb3AgPSAmdWRmX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCQkJaW5vZGUtPmlfZm9wID0gJnVkZl9kaXJfb3BlcmF0aW9uczsKKwkJCWlub2RlLT5pX21vZGUgfD0gU19JRkRJUjsKKwkJCWlub2RlLT5pX25saW5rICsrOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBJQ0JUQUdfRklMRV9UWVBFX1JFQUxUSU1FOgorCQljYXNlIElDQlRBR19GSUxFX1RZUEVfUkVHVUxBUjoKKwkJY2FzZSBJQ0JUQUdfRklMRV9UWVBFX1VOREVGOgorCQl7CisJCQlpZiAoVURGX0lfQUxMT0NUWVBFKGlub2RlKSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpCisJCQkJaW5vZGUtPmlfZGF0YS5hX29wcyA9ICZ1ZGZfYWRpbmljYl9hb3BzOworCQkJZWxzZQorCQkJCWlub2RlLT5pX2RhdGEuYV9vcHMgPSAmdWRmX2FvcHM7CisJCQlpbm9kZS0+aV9vcCA9ICZ1ZGZfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCQkJaW5vZGUtPmlfZm9wID0gJnVkZl9maWxlX29wZXJhdGlvbnM7CisJCQlpbm9kZS0+aV9tb2RlIHw9IFNfSUZSRUc7CisJCQlicmVhazsKKwkJfQorCQljYXNlIElDQlRBR19GSUxFX1RZUEVfQkxPQ0s6CisJCXsKKwkJCWlub2RlLT5pX21vZGUgfD0gU19JRkJMSzsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgSUNCVEFHX0ZJTEVfVFlQRV9DSEFSOgorCQl7CisJCQlpbm9kZS0+aV9tb2RlIHw9IFNfSUZDSFI7CisJCQlicmVhazsKKwkJfQorCQljYXNlIElDQlRBR19GSUxFX1RZUEVfRklGTzoKKwkJeworCQkJaW5pdF9zcGVjaWFsX2lub2RlKGlub2RlLCBpbm9kZS0+aV9tb2RlIHwgU19JRklGTywgMCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIElDQlRBR19GSUxFX1RZUEVfU09DS0VUOgorCQl7CisJCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUgfCBTX0lGU09DSywgMCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIElDQlRBR19GSUxFX1RZUEVfU1lNTElOSzoKKwkJeworCQkJaW5vZGUtPmlfZGF0YS5hX29wcyA9ICZ1ZGZfc3ltbGlua19hb3BzOworCQkJaW5vZGUtPmlfb3AgPSAmcGFnZV9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJCQlpbm9kZS0+aV9tb2RlID0gU19JRkxOS3xTX0lSV1hVR087CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OgorCQl7CisJCQlwcmludGsoS0VSTl9FUlIgInVkZjogdWRmX2ZpbGxfaW5vZGUoaW5vICVsZCkgZmFpbGVkIHVua25vd24gZmlsZSB0eXBlPSVkXG4iLAorCQkJCWlub2RlLT5pX2lubywgZmUtPmljYlRhZy5maWxlVHlwZSk7CisJCQltYWtlX2JhZF9pbm9kZShpbm9kZSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJaWYgKFNfSVNDSFIoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkKKwl7CisJCXN0cnVjdCBkZXZpY2VTcGVjICpkc2VhID0KKwkJCShzdHJ1Y3QgZGV2aWNlU3BlYyAqKQorCQkJCXVkZl9nZXRfZXh0ZW5kZWRhdHRyKGlub2RlLCAxMiwgMSk7CisKKwkJaWYgKGRzZWEpCisJCXsKKwkJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwgTUtERVYoCisJCQkJbGUzMl90b19jcHUoZHNlYS0+bWFqb3JEZXZpY2VJZGVudCksCisJCQkJbGUzMl90b19jcHUoZHNlYS0+bWlub3JEZXZpY2VJZGVudCkpKTsKKwkJCS8qIERldmVsb3BlciBJRCA/Pz8gKi8KKwkJfQorCQllbHNlCisJCXsKKwkJCW1ha2VfYmFkX2lub2RlKGlub2RlKTsKKwkJfQorCX0KK30KKworc3RhdGljIG1vZGVfdAordWRmX2NvbnZlcnRfcGVybWlzc2lvbnMoc3RydWN0IGZpbGVFbnRyeSAqZmUpCit7CisJbW9kZV90IG1vZGU7CisJdWludDMyX3QgcGVybWlzc2lvbnM7CisJdWludDMyX3QgZmxhZ3M7CisKKwlwZXJtaXNzaW9ucyA9IGxlMzJfdG9fY3B1KGZlLT5wZXJtaXNzaW9ucyk7CisJZmxhZ3MgPSBsZTE2X3RvX2NwdShmZS0+aWNiVGFnLmZsYWdzKTsKKworCW1vZGUgPQkoKCBwZXJtaXNzaW9ucyAgICAgICkgJiBTX0lSV1hPKSB8CisJCSgoIHBlcm1pc3Npb25zID4+IDIgKSAmIFNfSVJXWEcpIHwKKwkJKCggcGVybWlzc2lvbnMgPj4gNCApICYgU19JUldYVSkgfAorCQkoKCBmbGFncyAmIElDQlRBR19GTEFHX1NFVFVJRCkgPyBTX0lTVUlEIDogMCkgfAorCQkoKCBmbGFncyAmIElDQlRBR19GTEFHX1NFVEdJRCkgPyBTX0lTR0lEIDogMCkgfAorCQkoKCBmbGFncyAmIElDQlRBR19GTEFHX1NUSUNLWSkgPyBTX0lTVlRYIDogMCk7CisKKwlyZXR1cm4gbW9kZTsKK30KKworLyoKKyAqIHVkZl93cml0ZV9pbm9kZQorICoKKyAqIFBVUlBPU0UKKyAqCVdyaXRlIG91dCB0aGUgc3BlY2lmaWVkIGlub2RlLgorICoKKyAqIERFU0NSSVBUSU9OCisgKglUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW5ldmVyIGFuIGlub2RlIGlzIHN5bmNlZC4KKyAqCUN1cnJlbnRseSB0aGlzIHJvdXRpbmUgaXMganVzdCBhIHBsYWNlaG9sZGVyLgorICoKKyAqIEhJU1RPUlkKKyAqCUp1bHkgMSwgMTk5NyAtIEFuZHJldyBFLiBNaWxlc2tpCisgKglXcml0dGVuLCB0ZXN0ZWQsIGFuZCByZWxlYXNlZC4KKyAqLworCitpbnQgdWRmX3dyaXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBpbnQgc3luYykKK3sKKwlpbnQgcmV0OworCWxvY2tfa2VybmVsKCk7CisJcmV0ID0gdWRmX3VwZGF0ZV9pbm9kZShpbm9kZSwgc3luYyk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXQ7Cit9CisKK2ludCB1ZGZfc3luY19pbm9kZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwlyZXR1cm4gdWRmX3VwZGF0ZV9pbm9kZShpbm9kZSwgMSk7Cit9CisKK3N0YXRpYyBpbnQKK3VkZl91cGRhdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGRvX3N5bmMpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJc3RydWN0IGZpbGVFbnRyeSAqZmU7CisJc3RydWN0IGV4dGVuZGVkRmlsZUVudHJ5ICplZmU7CisJdWludDMyX3QgdWRmcGVybXM7CisJdWludDE2X3QgaWNiZmxhZ3M7CisJdWludDE2X3QgY3JjbGVuOworCWludCBpOworCWtlcm5lbF90aW1lc3RhbXAgY3B1X3RpbWU7CisJaW50IGVyciA9IDA7CisKKwliaCA9IHVkZl90cmVhZChpbm9kZS0+aV9zYiwKKwkJdWRmX2dldF9sYl9wYmxvY2soaW5vZGUtPmlfc2IsIFVERl9JX0xPQ0FUSU9OKGlub2RlKSwgMCkpOworCisJaWYgKCFiaCkKKwl7CisJCXVkZl9kZWJ1ZygiYnJlYWQgZmFpbHVyZVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCW1lbXNldChiaC0+Yl9kYXRhLCAweDAwLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOworCisJZmUgPSAoc3RydWN0IGZpbGVFbnRyeSAqKWJoLT5iX2RhdGE7CisJZWZlID0gKHN0cnVjdCBleHRlbmRlZEZpbGVFbnRyeSAqKWJoLT5iX2RhdGE7CisKKwlpZiAobGUxNl90b19jcHUoZmUtPmRlc2NUYWcudGFnSWRlbnQpID09IFRBR19JREVOVF9VU0UpCisJeworCQlzdHJ1Y3QgdW5hbGxvY1NwYWNlRW50cnkgKnVzZSA9CisJCQkoc3RydWN0IHVuYWxsb2NTcGFjZUVudHJ5ICopYmgtPmJfZGF0YTsKKworCQl1c2UtPmxlbmd0aEFsbG9jRGVzY3MgPSBjcHVfdG9fbGUzMihVREZfSV9MRU5BTExPQyhpbm9kZSkpOworCQltZW1jcHkoYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgdW5hbGxvY1NwYWNlRW50cnkpLCBVREZfSV9EQVRBKGlub2RlKSwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gc2l6ZW9mKHN0cnVjdCB1bmFsbG9jU3BhY2VFbnRyeSkpOworCQljcmNsZW4gPSBzaXplb2Yoc3RydWN0IHVuYWxsb2NTcGFjZUVudHJ5KSArIFVERl9JX0xFTkFMTE9DKGlub2RlKSAtCisJCQlzaXplb2YodGFnKTsKKwkJdXNlLT5kZXNjVGFnLnRhZ0xvY2F0aW9uID0gY3B1X3RvX2xlMzIoVURGX0lfTE9DQVRJT04oaW5vZGUpLmxvZ2ljYWxCbG9ja051bSk7CisJCXVzZS0+ZGVzY1RhZy5kZXNjQ1JDTGVuZ3RoID0gY3B1X3RvX2xlMTYoY3JjbGVuKTsKKwkJdXNlLT5kZXNjVGFnLmRlc2NDUkMgPSBjcHVfdG9fbGUxNih1ZGZfY3JjKChjaGFyICopdXNlICsgc2l6ZW9mKHRhZyksIGNyY2xlbiwgMCkpOworCisJCXVzZS0+ZGVzY1RhZy50YWdDaGVja3N1bSA9IDA7CisJCWZvciAoaT0wOyBpPDE2OyBpKyspCisJCQlpZiAoaSAhPSA0KQorCQkJCXVzZS0+ZGVzY1RhZy50YWdDaGVja3N1bSArPSAoKHVpbnQ4X3QgKikmKHVzZS0+ZGVzY1RhZykpW2ldOworCisJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwkJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKGlub2RlLT5pX3VpZCAhPSBVREZfU0IoaW5vZGUtPmlfc2IpLT5zX3VpZCkKKwkJZmUtPnVpZCA9IGNwdV90b19sZTMyKGlub2RlLT5pX3VpZCk7CisKKwlpZiAoaW5vZGUtPmlfZ2lkICE9IFVERl9TQihpbm9kZS0+aV9zYiktPnNfZ2lkKQorCQlmZS0+Z2lkID0gY3B1X3RvX2xlMzIoaW5vZGUtPmlfZ2lkKTsKKworCXVkZnBlcm1zID0JKChpbm9kZS0+aV9tb2RlICYgU19JUldYTykgICAgICkgfAorCQkJKChpbm9kZS0+aV9tb2RlICYgU19JUldYRykgPDwgMikgfAorCQkJKChpbm9kZS0+aV9tb2RlICYgU19JUldYVSkgPDwgNCk7CisKKwl1ZGZwZXJtcyB8PQkobGUzMl90b19jcHUoZmUtPnBlcm1pc3Npb25zKSAmCisJCQkoRkVfUEVSTV9PX0RFTEVURSB8IEZFX1BFUk1fT19DSEFUVFIgfAorCQkJIEZFX1BFUk1fR19ERUxFVEUgfCBGRV9QRVJNX0dfQ0hBVFRSIHwKKwkJCSBGRV9QRVJNX1VfREVMRVRFIHwgRkVfUEVSTV9VX0NIQVRUUikpOworCWZlLT5wZXJtaXNzaW9ucyA9IGNwdV90b19sZTMyKHVkZnBlcm1zKTsKKworCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQlmZS0+ZmlsZUxpbmtDb3VudCA9IGNwdV90b19sZTE2KGlub2RlLT5pX25saW5rIC0gMSk7CisJZWxzZQorCQlmZS0+ZmlsZUxpbmtDb3VudCA9IGNwdV90b19sZTE2KGlub2RlLT5pX25saW5rKTsKKworCWZlLT5pbmZvcm1hdGlvbkxlbmd0aCA9IGNwdV90b19sZTY0KGlub2RlLT5pX3NpemUpOworCisJaWYgKFNfSVNDSFIoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkKKwl7CisJCXJlZ2lkICplaWQ7CisJCXN0cnVjdCBkZXZpY2VTcGVjICpkc2VhID0KKwkJCShzdHJ1Y3QgZGV2aWNlU3BlYyAqKQorCQkJCXVkZl9nZXRfZXh0ZW5kZWRhdHRyKGlub2RlLCAxMiwgMSk7CisKKwkJaWYgKCFkc2VhKQorCQl7CisJCQlkc2VhID0gKHN0cnVjdCBkZXZpY2VTcGVjICopCisJCQkJdWRmX2FkZF9leHRlbmRlZGF0dHIoaW5vZGUsCisJCQkJCXNpemVvZihzdHJ1Y3QgZGV2aWNlU3BlYykgKworCQkJCQlzaXplb2YocmVnaWQpLCAxMiwgMHgzKTsKKwkJCWRzZWEtPmF0dHJUeXBlID0gY3B1X3RvX2xlMzIoMTIpOworCQkJZHNlYS0+YXR0clN1YnR5cGUgPSAxOworCQkJZHNlYS0+YXR0ckxlbmd0aCA9IGNwdV90b19sZTMyKHNpemVvZihzdHJ1Y3QgZGV2aWNlU3BlYykgKworCQkJCXNpemVvZihyZWdpZCkpOworCQkJZHNlYS0+aW1wVXNlTGVuZ3RoID0gY3B1X3RvX2xlMzIoc2l6ZW9mKHJlZ2lkKSk7CisJCX0KKwkJZWlkID0gKHJlZ2lkICopZHNlYS0+aW1wVXNlOworCQltZW1zZXQoZWlkLCAwLCBzaXplb2YocmVnaWQpKTsKKwkJc3RyY3B5KGVpZC0+aWRlbnQsIFVERl9JRF9ERVZFTE9QRVIpOworCQllaWQtPmlkZW50U3VmZml4WzBdID0gVURGX09TX0NMQVNTX1VOSVg7CisJCWVpZC0+aWRlbnRTdWZmaXhbMV0gPSBVREZfT1NfSURfTElOVVg7CisJCWRzZWEtPm1ham9yRGV2aWNlSWRlbnQgPSBjcHVfdG9fbGUzMihpbWFqb3IoaW5vZGUpKTsKKwkJZHNlYS0+bWlub3JEZXZpY2VJZGVudCA9IGNwdV90b19sZTMyKGltaW5vcihpbm9kZSkpOworCX0KKworCWlmIChVREZfSV9FRkUoaW5vZGUpID09IDApCisJeworCQltZW1jcHkoYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgZmlsZUVudHJ5KSwgVURGX0lfREFUQShpbm9kZSksIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZmlsZUVudHJ5KSk7CisJCWZlLT5sb2dpY2FsQmxvY2tzUmVjb3JkZWQgPSBjcHVfdG9fbGU2NCgKKwkJCShpbm9kZS0+aV9ibG9ja3MgKyAoMSA8PCAoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMgLSA5KSkgLSAxKSA+PgorCQkJKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gOSkpOworCisJCWlmICh1ZGZfdGltZV90b19zdGFtcCgmY3B1X3RpbWUsIGlub2RlLT5pX2F0aW1lKSkKKwkJCWZlLT5hY2Nlc3NUaW1lID0gY3B1X3RvX2xldHMoY3B1X3RpbWUpOworCQlpZiAodWRmX3RpbWVfdG9fc3RhbXAoJmNwdV90aW1lLCBpbm9kZS0+aV9tdGltZSkpCisJCQlmZS0+bW9kaWZpY2F0aW9uVGltZSA9IGNwdV90b19sZXRzKGNwdV90aW1lKTsKKwkJaWYgKHVkZl90aW1lX3RvX3N0YW1wKCZjcHVfdGltZSwgaW5vZGUtPmlfY3RpbWUpKQorCQkJZmUtPmF0dHJUaW1lID0gY3B1X3RvX2xldHMoY3B1X3RpbWUpOworCQltZW1zZXQoJihmZS0+aW1wSWRlbnQpLCAwLCBzaXplb2YocmVnaWQpKTsKKwkJc3RyY3B5KGZlLT5pbXBJZGVudC5pZGVudCwgVURGX0lEX0RFVkVMT1BFUik7CisJCWZlLT5pbXBJZGVudC5pZGVudFN1ZmZpeFswXSA9IFVERl9PU19DTEFTU19VTklYOworCQlmZS0+aW1wSWRlbnQuaWRlbnRTdWZmaXhbMV0gPSBVREZfT1NfSURfTElOVVg7CisJCWZlLT51bmlxdWVJRCA9IGNwdV90b19sZTY0KFVERl9JX1VOSVFVRShpbm9kZSkpOworCQlmZS0+bGVuZ3RoRXh0ZW5kZWRBdHRyID0gY3B1X3RvX2xlMzIoVURGX0lfTEVORUFUVFIoaW5vZGUpKTsKKwkJZmUtPmxlbmd0aEFsbG9jRGVzY3MgPSBjcHVfdG9fbGUzMihVREZfSV9MRU5BTExPQyhpbm9kZSkpOworCQlmZS0+ZGVzY1RhZy50YWdJZGVudCA9IGNwdV90b19sZTE2KFRBR19JREVOVF9GRSk7CisJCWNyY2xlbiA9IHNpemVvZihzdHJ1Y3QgZmlsZUVudHJ5KTsKKwl9CisJZWxzZQorCXsKKwkJbWVtY3B5KGJoLT5iX2RhdGEgKyBzaXplb2Yoc3RydWN0IGV4dGVuZGVkRmlsZUVudHJ5KSwgVURGX0lfREFUQShpbm9kZSksIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIHNpemVvZihzdHJ1Y3QgZXh0ZW5kZWRGaWxlRW50cnkpKTsKKwkJZWZlLT5vYmplY3RTaXplID0gY3B1X3RvX2xlNjQoaW5vZGUtPmlfc2l6ZSk7CisJCWVmZS0+bG9naWNhbEJsb2Nrc1JlY29yZGVkID0gY3B1X3RvX2xlNjQoCisJCQkoaW5vZGUtPmlfYmxvY2tzICsgKDEgPDwgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gOSkpIC0gMSkgPj4KKwkJCShpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyAtIDkpKTsKKworCQlpZiAoVURGX0lfQ1JUSU1FKGlub2RlKS50dl9zZWMgPiBpbm9kZS0+aV9hdGltZS50dl9zZWMgfHwKKwkJCShVREZfSV9DUlRJTUUoaW5vZGUpLnR2X3NlYyA9PSBpbm9kZS0+aV9hdGltZS50dl9zZWMgJiYKKwkJCSBVREZfSV9DUlRJTUUoaW5vZGUpLnR2X25zZWMgPiBpbm9kZS0+aV9hdGltZS50dl9uc2VjKSkKKwkJeworCQkJVURGX0lfQ1JUSU1FKGlub2RlKSA9IGlub2RlLT5pX2F0aW1lOworCQl9CisJCWlmIChVREZfSV9DUlRJTUUoaW5vZGUpLnR2X3NlYyA+IGlub2RlLT5pX210aW1lLnR2X3NlYyB8fAorCQkJKFVERl9JX0NSVElNRShpbm9kZSkudHZfc2VjID09IGlub2RlLT5pX210aW1lLnR2X3NlYyAmJgorCQkJIFVERl9JX0NSVElNRShpbm9kZSkudHZfbnNlYyA+IGlub2RlLT5pX210aW1lLnR2X25zZWMpKQorCQl7CisJCQlVREZfSV9DUlRJTUUoaW5vZGUpID0gaW5vZGUtPmlfbXRpbWU7CisJCX0KKwkJaWYgKFVERl9JX0NSVElNRShpbm9kZSkudHZfc2VjID4gaW5vZGUtPmlfY3RpbWUudHZfc2VjIHx8CisJCQkoVURGX0lfQ1JUSU1FKGlub2RlKS50dl9zZWMgPT0gaW5vZGUtPmlfY3RpbWUudHZfc2VjICYmCisJCQkgVURGX0lfQ1JUSU1FKGlub2RlKS50dl9uc2VjID4gaW5vZGUtPmlfY3RpbWUudHZfbnNlYykpCisJCXsKKwkJCVVERl9JX0NSVElNRShpbm9kZSkgPSBpbm9kZS0+aV9jdGltZTsKKwkJfQorCisJCWlmICh1ZGZfdGltZV90b19zdGFtcCgmY3B1X3RpbWUsIGlub2RlLT5pX2F0aW1lKSkKKwkJCWVmZS0+YWNjZXNzVGltZSA9IGNwdV90b19sZXRzKGNwdV90aW1lKTsKKwkJaWYgKHVkZl90aW1lX3RvX3N0YW1wKCZjcHVfdGltZSwgaW5vZGUtPmlfbXRpbWUpKQorCQkJZWZlLT5tb2RpZmljYXRpb25UaW1lID0gY3B1X3RvX2xldHMoY3B1X3RpbWUpOworCQlpZiAodWRmX3RpbWVfdG9fc3RhbXAoJmNwdV90aW1lLCBVREZfSV9DUlRJTUUoaW5vZGUpKSkKKwkJCWVmZS0+Y3JlYXRlVGltZSA9IGNwdV90b19sZXRzKGNwdV90aW1lKTsKKwkJaWYgKHVkZl90aW1lX3RvX3N0YW1wKCZjcHVfdGltZSwgaW5vZGUtPmlfY3RpbWUpKQorCQkJZWZlLT5hdHRyVGltZSA9IGNwdV90b19sZXRzKGNwdV90aW1lKTsKKworCQltZW1zZXQoJihlZmUtPmltcElkZW50KSwgMCwgc2l6ZW9mKHJlZ2lkKSk7CisJCXN0cmNweShlZmUtPmltcElkZW50LmlkZW50LCBVREZfSURfREVWRUxPUEVSKTsKKwkJZWZlLT5pbXBJZGVudC5pZGVudFN1ZmZpeFswXSA9IFVERl9PU19DTEFTU19VTklYOworCQllZmUtPmltcElkZW50LmlkZW50U3VmZml4WzFdID0gVURGX09TX0lEX0xJTlVYOworCQllZmUtPnVuaXF1ZUlEID0gY3B1X3RvX2xlNjQoVURGX0lfVU5JUVVFKGlub2RlKSk7CisJCWVmZS0+bGVuZ3RoRXh0ZW5kZWRBdHRyID0gY3B1X3RvX2xlMzIoVURGX0lfTEVORUFUVFIoaW5vZGUpKTsKKwkJZWZlLT5sZW5ndGhBbGxvY0Rlc2NzID0gY3B1X3RvX2xlMzIoVURGX0lfTEVOQUxMT0MoaW5vZGUpKTsKKwkJZWZlLT5kZXNjVGFnLnRhZ0lkZW50ID0gY3B1X3RvX2xlMTYoVEFHX0lERU5UX0VGRSk7CisJCWNyY2xlbiA9IHNpemVvZihzdHJ1Y3QgZXh0ZW5kZWRGaWxlRW50cnkpOworCX0KKwlpZiAoVURGX0lfU1RSQVQ0MDk2KGlub2RlKSkKKwl7CisJCWZlLT5pY2JUYWcuc3RyYXRlZ3lUeXBlID0gY3B1X3RvX2xlMTYoNDA5Nik7CisJCWZlLT5pY2JUYWcuc3RyYXRlZ3lQYXJhbWV0ZXIgPSBjcHVfdG9fbGUxNigxKTsKKwkJZmUtPmljYlRhZy5udW1FbnRyaWVzID0gY3B1X3RvX2xlMTYoMik7CisJfQorCWVsc2UKKwl7CisJCWZlLT5pY2JUYWcuc3RyYXRlZ3lUeXBlID0gY3B1X3RvX2xlMTYoNCk7CisJCWZlLT5pY2JUYWcubnVtRW50cmllcyA9IGNwdV90b19sZTE2KDEpOworCX0KKworCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQlmZS0+aWNiVGFnLmZpbGVUeXBlID0gSUNCVEFHX0ZJTEVfVFlQRV9ESVJFQ1RPUlk7CisJZWxzZSBpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKKwkJZmUtPmljYlRhZy5maWxlVHlwZSA9IElDQlRBR19GSUxFX1RZUEVfUkVHVUxBUjsKKwllbHNlIGlmIChTX0lTTE5LKGlub2RlLT5pX21vZGUpKQorCQlmZS0+aWNiVGFnLmZpbGVUeXBlID0gSUNCVEFHX0ZJTEVfVFlQRV9TWU1MSU5LOworCWVsc2UgaWYgKFNfSVNCTEsoaW5vZGUtPmlfbW9kZSkpCisJCWZlLT5pY2JUYWcuZmlsZVR5cGUgPSBJQ0JUQUdfRklMRV9UWVBFX0JMT0NLOworCWVsc2UgaWYgKFNfSVNDSFIoaW5vZGUtPmlfbW9kZSkpCisJCWZlLT5pY2JUYWcuZmlsZVR5cGUgPSBJQ0JUQUdfRklMRV9UWVBFX0NIQVI7CisJZWxzZSBpZiAoU19JU0ZJRk8oaW5vZGUtPmlfbW9kZSkpCisJCWZlLT5pY2JUYWcuZmlsZVR5cGUgPSBJQ0JUQUdfRklMRV9UWVBFX0ZJRk87CisJZWxzZSBpZiAoU19JU1NPQ0soaW5vZGUtPmlfbW9kZSkpCisJCWZlLT5pY2JUYWcuZmlsZVR5cGUgPSBJQ0JUQUdfRklMRV9UWVBFX1NPQ0tFVDsKKworCWljYmZsYWdzID0JVURGX0lfQUxMT0NUWVBFKGlub2RlKSB8CisJCQkoKGlub2RlLT5pX21vZGUgJiBTX0lTVUlEKSA/IElDQlRBR19GTEFHX1NFVFVJRCA6IDApIHwKKwkJCSgoaW5vZGUtPmlfbW9kZSAmIFNfSVNHSUQpID8gSUNCVEFHX0ZMQUdfU0VUR0lEIDogMCkgfAorCQkJKChpbm9kZS0+aV9tb2RlICYgU19JU1ZUWCkgPyBJQ0JUQUdfRkxBR19TVElDS1kgOiAwKSB8CisJCQkobGUxNl90b19jcHUoZmUtPmljYlRhZy5mbGFncykgJgorCQkJCX4oSUNCVEFHX0ZMQUdfQURfTUFTSyB8IElDQlRBR19GTEFHX1NFVFVJRCB8CisJCQkJSUNCVEFHX0ZMQUdfU0VUR0lEIHwgSUNCVEFHX0ZMQUdfU1RJQ0tZKSk7CisKKwlmZS0+aWNiVGFnLmZsYWdzID0gY3B1X3RvX2xlMTYoaWNiZmxhZ3MpOworCWlmIChVREZfU0JfVURGUkVWKGlub2RlLT5pX3NiKSA+PSAweDAyMDApCisJCWZlLT5kZXNjVGFnLmRlc2NWZXJzaW9uID0gY3B1X3RvX2xlMTYoMyk7CisJZWxzZQorCQlmZS0+ZGVzY1RhZy5kZXNjVmVyc2lvbiA9IGNwdV90b19sZTE2KDIpOworCWZlLT5kZXNjVGFnLnRhZ1NlcmlhbE51bSA9IGNwdV90b19sZTE2KFVERl9TQl9TRVJJQUxOVU0oaW5vZGUtPmlfc2IpKTsKKwlmZS0+ZGVzY1RhZy50YWdMb2NhdGlvbiA9IGNwdV90b19sZTMyKFVERl9JX0xPQ0FUSU9OKGlub2RlKS5sb2dpY2FsQmxvY2tOdW0pOworCWNyY2xlbiArPSBVREZfSV9MRU5FQVRUUihpbm9kZSkgKyBVREZfSV9MRU5BTExPQyhpbm9kZSkgLSBzaXplb2YodGFnKTsKKwlmZS0+ZGVzY1RhZy5kZXNjQ1JDTGVuZ3RoID0gY3B1X3RvX2xlMTYoY3JjbGVuKTsKKwlmZS0+ZGVzY1RhZy5kZXNjQ1JDID0gY3B1X3RvX2xlMTYodWRmX2NyYygoY2hhciAqKWZlICsgc2l6ZW9mKHRhZyksIGNyY2xlbiwgMCkpOworCisJZmUtPmRlc2NUYWcudGFnQ2hlY2tzdW0gPSAwOworCWZvciAoaT0wOyBpPDE2OyBpKyspCisJCWlmIChpICE9IDQpCisJCQlmZS0+ZGVzY1RhZy50YWdDaGVja3N1bSArPSAoKHVpbnQ4X3QgKikmKGZlLT5kZXNjVGFnKSlbaV07CisKKwkvKiB3cml0ZSB0aGUgZGF0YSBibG9ja3MgKi8KKwltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJaWYgKGRvX3N5bmMpCisJeworCQlzeW5jX2RpcnR5X2J1ZmZlcihiaCk7CisJCWlmIChidWZmZXJfcmVxKGJoKSAmJiAhYnVmZmVyX3VwdG9kYXRlKGJoKSkKKwkJeworCQkJcHJpbnRrKCJJTyBlcnJvciBzeW5jaW5nIHVkZiBpbm9kZSBbJXM6JTA4bHhdXG4iLAorCQkJCWlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8pOworCQkJZXJyID0gLUVJTzsKKwkJfQorCX0KKwl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKwlyZXR1cm4gZXJyOworfQorCitzdHJ1Y3QgaW5vZGUgKgordWRmX2lnZXQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwga2VybmVsX2xiX2FkZHIgaW5vKQoreworCXVuc2lnbmVkIGxvbmcgYmxvY2sgPSB1ZGZfZ2V0X2xiX3BibG9jayhzYiwgaW5vLCAwKTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gaWdldF9sb2NrZWQoc2IsIGJsb2NrKTsKKworCWlmICghaW5vZGUpCisJCXJldHVybiBOVUxMOworCisJaWYgKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpIHsKKwkJbWVtY3B5KCZVREZfSV9MT0NBVElPTihpbm9kZSksICZpbm8sIHNpemVvZihrZXJuZWxfbGJfYWRkcikpOworCQlfX3VkZl9yZWFkX2lub2RlKGlub2RlKTsKKwkJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CisJfQorCisJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpCisJCWdvdG8gb3V0X2lwdXQ7CisKKwlpZiAoaW5vLmxvZ2ljYWxCbG9ja051bSA+PSBVREZfU0JfUEFSVExFTihzYiwgaW5vLnBhcnRpdGlvblJlZmVyZW5jZU51bSkpIHsKKwkJdWRmX2RlYnVnKCJibG9jaz0lZCwgcGFydGl0aW9uPSVkIG91dCBvZiByYW5nZVxuIiwKKwkJCWluby5sb2dpY2FsQmxvY2tOdW0sIGluby5wYXJ0aXRpb25SZWZlcmVuY2VOdW0pOworCQltYWtlX2JhZF9pbm9kZShpbm9kZSk7CisJCWdvdG8gb3V0X2lwdXQ7CisJfQorCisJcmV0dXJuIGlub2RlOworCisgb3V0X2lwdXQ6CisJaXB1dChpbm9kZSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludDhfdCB1ZGZfYWRkX2FleHQoc3RydWN0IGlub2RlICppbm9kZSwga2VybmVsX2xiX2FkZHIgKmJsb2MsIGludCAqZXh0b2Zmc2V0LAorCWtlcm5lbF9sYl9hZGRyIGVsb2MsIHVpbnQzMl90IGVsZW4sIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJoLCBpbnQgaW5jKQoreworCWludCBhZHNpemU7CisJc2hvcnRfYWQgKnNhZCA9IE5VTEw7CisJbG9uZ19hZCAqbGFkID0gTlVMTDsKKwlzdHJ1Y3QgYWxsb2NFeHREZXNjICphZWQ7CisJaW50OF90IGV0eXBlOworCXVpbnQ4X3QgKnB0cjsKKworCWlmICghKmJoKQorCQlwdHIgPSBVREZfSV9EQVRBKGlub2RlKSArICpleHRvZmZzZXQgLSB1ZGZfZmlsZV9lbnRyeV9hbGxvY19vZmZzZXQoaW5vZGUpICsgVURGX0lfTEVORUFUVFIoaW5vZGUpOworCWVsc2UKKwkJcHRyID0gKCpiaCktPmJfZGF0YSArICpleHRvZmZzZXQ7CisKKwlpZiAoVURGX0lfQUxMT0NUWVBFKGlub2RlKSA9PSBJQ0JUQUdfRkxBR19BRF9TSE9SVCkKKwkJYWRzaXplID0gc2l6ZW9mKHNob3J0X2FkKTsKKwllbHNlIGlmIChVREZfSV9BTExPQ1RZUEUoaW5vZGUpID09IElDQlRBR19GTEFHX0FEX0xPTkcpCisJCWFkc2l6ZSA9IHNpemVvZihsb25nX2FkKTsKKwllbHNlCisJCXJldHVybiAtMTsKKworCWlmICgqZXh0b2Zmc2V0ICsgKDIgKiBhZHNpemUpID4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKQorCXsKKwkJY2hhciAqc3B0ciwgKmRwdHI7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqbmJoOworCQlpbnQgZXJyLCBsb2Zmc2V0OworCQlrZXJuZWxfbGJfYWRkciBvYmxvYyA9ICpibG9jOworCisJCWlmICghKGJsb2MtPmxvZ2ljYWxCbG9ja051bSA9IHVkZl9uZXdfYmxvY2soaW5vZGUtPmlfc2IsIE5VTEwsCisJCQlvYmxvYy5wYXJ0aXRpb25SZWZlcmVuY2VOdW0sIG9ibG9jLmxvZ2ljYWxCbG9ja051bSwgJmVycikpKQorCQl7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKCEobmJoID0gdWRmX3RnZXRibGsoaW5vZGUtPmlfc2IsIHVkZl9nZXRfbGJfcGJsb2NrKGlub2RlLT5pX3NiLAorCQkJKmJsb2MsIDApKSkpCisJCXsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlsb2NrX2J1ZmZlcihuYmgpOworCQltZW1zZXQobmJoLT5iX2RhdGEsIDB4MDAsIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CisJCXNldF9idWZmZXJfdXB0b2RhdGUobmJoKTsKKwkJdW5sb2NrX2J1ZmZlcihuYmgpOworCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShuYmgsIGlub2RlKTsKKworCQlhZWQgPSAoc3RydWN0IGFsbG9jRXh0RGVzYyAqKShuYmgtPmJfZGF0YSk7CisJCWlmICghVURGX1FVRVJZX0ZMQUcoaW5vZGUtPmlfc2IsIFVERl9GTEFHX1NUUklDVCkpCisJCQlhZWQtPnByZXZpb3VzQWxsb2NFeHRMb2NhdGlvbiA9IGNwdV90b19sZTMyKG9ibG9jLmxvZ2ljYWxCbG9ja051bSk7CisJCWlmICgqZXh0b2Zmc2V0ICsgYWRzaXplID4gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKQorCQl7CisJCQlsb2Zmc2V0ID0gKmV4dG9mZnNldDsKKwkJCWFlZC0+bGVuZ3RoQWxsb2NEZXNjcyA9IGNwdV90b19sZTMyKGFkc2l6ZSk7CisJCQlzcHRyID0gcHRyIC0gYWRzaXplOworCQkJZHB0ciA9IG5iaC0+Yl9kYXRhICsgc2l6ZW9mKHN0cnVjdCBhbGxvY0V4dERlc2MpOworCQkJbWVtY3B5KGRwdHIsIHNwdHIsIGFkc2l6ZSk7CisJCQkqZXh0b2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBhbGxvY0V4dERlc2MpICsgYWRzaXplOworCQl9CisJCWVsc2UKKwkJeworCQkJbG9mZnNldCA9ICpleHRvZmZzZXQgKyBhZHNpemU7CisJCQlhZWQtPmxlbmd0aEFsbG9jRGVzY3MgPSBjcHVfdG9fbGUzMigwKTsKKwkJCXNwdHIgPSBwdHI7CisJCQkqZXh0b2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBhbGxvY0V4dERlc2MpOworCisJCQlpZiAoKmJoKQorCQkJeworCQkJCWFlZCA9IChzdHJ1Y3QgYWxsb2NFeHREZXNjICopKCpiaCktPmJfZGF0YTsKKwkJCQlhZWQtPmxlbmd0aEFsbG9jRGVzY3MgPQorCQkJCQljcHVfdG9fbGUzMihsZTMyX3RvX2NwdShhZWQtPmxlbmd0aEFsbG9jRGVzY3MpICsgYWRzaXplKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlVREZfSV9MRU5BTExPQyhpbm9kZSkgKz0gYWRzaXplOworCQkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQkJfQorCQl9CisJCWlmIChVREZfU0JfVURGUkVWKGlub2RlLT5pX3NiKSA+PSAweDAyMDApCisJCQl1ZGZfbmV3X3RhZyhuYmgtPmJfZGF0YSwgVEFHX0lERU5UX0FFRCwgMywgMSwKKwkJCQlibG9jLT5sb2dpY2FsQmxvY2tOdW0sIHNpemVvZih0YWcpKTsKKwkJZWxzZQorCQkJdWRmX25ld190YWcobmJoLT5iX2RhdGEsIFRBR19JREVOVF9BRUQsIDIsIDEsCisJCQkJYmxvYy0+bG9naWNhbEJsb2NrTnVtLCBzaXplb2YodGFnKSk7CisJCXN3aXRjaCAoVURGX0lfQUxMT0NUWVBFKGlub2RlKSkKKwkJeworCQkJY2FzZSBJQ0JUQUdfRkxBR19BRF9TSE9SVDoKKwkJCXsKKwkJCQlzYWQgPSAoc2hvcnRfYWQgKilzcHRyOworCQkJCXNhZC0+ZXh0TGVuZ3RoID0gY3B1X3RvX2xlMzIoCisJCQkJCUVYVF9ORVhUX0VYVEVOVF9BTExPQ0RFQ1MgfAorCQkJCQlpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOworCQkJCXNhZC0+ZXh0UG9zaXRpb24gPSBjcHVfdG9fbGUzMihibG9jLT5sb2dpY2FsQmxvY2tOdW0pOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSBJQ0JUQUdfRkxBR19BRF9MT05HOgorCQkJeworCQkJCWxhZCA9IChsb25nX2FkICopc3B0cjsKKwkJCQlsYWQtPmV4dExlbmd0aCA9IGNwdV90b19sZTMyKAorCQkJCQlFWFRfTkVYVF9FWFRFTlRfQUxMT0NERUNTIHwKKwkJCQkJaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKKwkJCQlsYWQtPmV4dExvY2F0aW9uID0gY3B1X3RvX2xlbGIoKmJsb2MpOworCQkJCW1lbXNldChsYWQtPmltcFVzZSwgMHgwMCwgc2l6ZW9mKGxhZC0+aW1wVXNlKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKCpiaCkKKwkJeworCQkJaWYgKCFVREZfUVVFUllfRkxBRyhpbm9kZS0+aV9zYiwgVURGX0ZMQUdfU1RSSUNUKSB8fCBVREZfU0JfVURGUkVWKGlub2RlLT5pX3NiKSA+PSAweDAyMDEpCisJCQkJdWRmX3VwZGF0ZV90YWcoKCpiaCktPmJfZGF0YSwgbG9mZnNldCk7CisJCQllbHNlCisJCQkJdWRmX3VwZGF0ZV90YWcoKCpiaCktPmJfZGF0YSwgc2l6ZW9mKHN0cnVjdCBhbGxvY0V4dERlc2MpKTsKKwkJCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKCpiaCwgaW5vZGUpOworCQkJdWRmX3JlbGVhc2VfZGF0YSgqYmgpOworCQl9CisJCWVsc2UKKwkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQkqYmggPSBuYmg7CisJfQorCisJZXR5cGUgPSB1ZGZfd3JpdGVfYWV4dChpbm9kZSwgKmJsb2MsIGV4dG9mZnNldCwgZWxvYywgZWxlbiwgKmJoLCBpbmMpOworCisJaWYgKCEqYmgpCisJeworCQlVREZfSV9MRU5BTExPQyhpbm9kZSkgKz0gYWRzaXplOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwl9CisJZWxzZQorCXsKKwkJYWVkID0gKHN0cnVjdCBhbGxvY0V4dERlc2MgKikoKmJoKS0+Yl9kYXRhOworCQlhZWQtPmxlbmd0aEFsbG9jRGVzY3MgPQorCQkJY3B1X3RvX2xlMzIobGUzMl90b19jcHUoYWVkLT5sZW5ndGhBbGxvY0Rlc2NzKSArIGFkc2l6ZSk7CisJCWlmICghVURGX1FVRVJZX0ZMQUcoaW5vZGUtPmlfc2IsIFVERl9GTEFHX1NUUklDVCkgfHwgVURGX1NCX1VERlJFVihpbm9kZS0+aV9zYikgPj0gMHgwMjAxKQorCQkJdWRmX3VwZGF0ZV90YWcoKCpiaCktPmJfZGF0YSwgKmV4dG9mZnNldCArIChpbmMgPyAwIDogYWRzaXplKSk7CisJCWVsc2UKKwkJCXVkZl91cGRhdGVfdGFnKCgqYmgpLT5iX2RhdGEsIHNpemVvZihzdHJ1Y3QgYWxsb2NFeHREZXNjKSk7CisJCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKCpiaCwgaW5vZGUpOworCX0KKworCXJldHVybiBldHlwZTsKK30KKworaW50OF90IHVkZl93cml0ZV9hZXh0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGtlcm5lbF9sYl9hZGRyIGJsb2MsIGludCAqZXh0b2Zmc2V0LAorICAgIGtlcm5lbF9sYl9hZGRyIGVsb2MsIHVpbnQzMl90IGVsZW4sIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIGludCBpbmMpCit7CisJaW50IGFkc2l6ZTsKKwl1aW50OF90ICpwdHI7CisKKwlpZiAoIWJoKQorCQlwdHIgPSBVREZfSV9EQVRBKGlub2RlKSArICpleHRvZmZzZXQgLSB1ZGZfZmlsZV9lbnRyeV9hbGxvY19vZmZzZXQoaW5vZGUpICsgVURGX0lfTEVORUFUVFIoaW5vZGUpOworCWVsc2UKKwl7CisJCXB0ciA9IGJoLT5iX2RhdGEgKyAqZXh0b2Zmc2V0OworCQlhdG9taWNfaW5jKCZiaC0+Yl9jb3VudCk7CisJfQorCisJc3dpdGNoIChVREZfSV9BTExPQ1RZUEUoaW5vZGUpKQorCXsKKwkJY2FzZSBJQ0JUQUdfRkxBR19BRF9TSE9SVDoKKwkJeworCQkJc2hvcnRfYWQgKnNhZCA9IChzaG9ydF9hZCAqKXB0cjsKKwkJCXNhZC0+ZXh0TGVuZ3RoID0gY3B1X3RvX2xlMzIoZWxlbik7CisJCQlzYWQtPmV4dFBvc2l0aW9uID0gY3B1X3RvX2xlMzIoZWxvYy5sb2dpY2FsQmxvY2tOdW0pOworCQkJYWRzaXplID0gc2l6ZW9mKHNob3J0X2FkKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgSUNCVEFHX0ZMQUdfQURfTE9ORzoKKwkJeworCQkJbG9uZ19hZCAqbGFkID0gKGxvbmdfYWQgKilwdHI7CisJCQlsYWQtPmV4dExlbmd0aCA9IGNwdV90b19sZTMyKGVsZW4pOworCQkJbGFkLT5leHRMb2NhdGlvbiA9IGNwdV90b19sZWxiKGVsb2MpOworCQkJbWVtc2V0KGxhZC0+aW1wVXNlLCAweDAwLCBzaXplb2YobGFkLT5pbXBVc2UpKTsKKwkJCWFkc2l6ZSA9IHNpemVvZihsb25nX2FkKTsKKwkJCWJyZWFrOworCQl9CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGJoKQorCXsKKwkJaWYgKCFVREZfUVVFUllfRkxBRyhpbm9kZS0+aV9zYiwgVURGX0ZMQUdfU1RSSUNUKSB8fCBVREZfU0JfVURGUkVWKGlub2RlLT5pX3NiKSA+PSAweDAyMDEpCisJCXsKKwkJCXN0cnVjdCBhbGxvY0V4dERlc2MgKmFlZCA9IChzdHJ1Y3QgYWxsb2NFeHREZXNjICopKGJoKS0+Yl9kYXRhOworCQkJdWRmX3VwZGF0ZV90YWcoKGJoKS0+Yl9kYXRhLAorCQkJCWxlMzJfdG9fY3B1KGFlZC0+bGVuZ3RoQWxsb2NEZXNjcykgKyBzaXplb2Yoc3RydWN0IGFsbG9jRXh0RGVzYykpOworCQl9CisJCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKGJoLCBpbm9kZSk7CisJCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCX0KKwllbHNlCisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCisJaWYgKGluYykKKwkJKmV4dG9mZnNldCArPSBhZHNpemU7CisJcmV0dXJuIChlbGVuID4+IDMwKTsKK30KKworaW50OF90IHVkZl9uZXh0X2FleHQoc3RydWN0IGlub2RlICppbm9kZSwga2VybmVsX2xiX2FkZHIgKmJsb2MsIGludCAqZXh0b2Zmc2V0LAorCWtlcm5lbF9sYl9hZGRyICplbG9jLCB1aW50MzJfdCAqZWxlbiwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqYmgsIGludCBpbmMpCit7CisJaW50OF90IGV0eXBlOworCisJd2hpbGUgKChldHlwZSA9IHVkZl9jdXJyZW50X2FleHQoaW5vZGUsIGJsb2MsIGV4dG9mZnNldCwgZWxvYywgZWxlbiwgYmgsIGluYykpID09CisJCShFWFRfTkVYVF9FWFRFTlRfQUxMT0NERUNTID4+IDMwKSkKKwl7CisJCSpibG9jID0gKmVsb2M7CisJCSpleHRvZmZzZXQgPSBzaXplb2Yoc3RydWN0IGFsbG9jRXh0RGVzYyk7CisJCXVkZl9yZWxlYXNlX2RhdGEoKmJoKTsKKwkJaWYgKCEoKmJoID0gdWRmX3RyZWFkKGlub2RlLT5pX3NiLCB1ZGZfZ2V0X2xiX3BibG9jayhpbm9kZS0+aV9zYiwgKmJsb2MsIDApKSkpCisJCXsKKwkJCXVkZl9kZWJ1ZygicmVhZGluZyBibG9jayAlZCBmYWlsZWQhXG4iLAorCQkJCXVkZl9nZXRfbGJfcGJsb2NrKGlub2RlLT5pX3NiLCAqYmxvYywgMCkpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJcmV0dXJuIGV0eXBlOworfQorCitpbnQ4X3QgdWRmX2N1cnJlbnRfYWV4dChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBrZXJuZWxfbGJfYWRkciAqYmxvYywgaW50ICpleHRvZmZzZXQsCisJa2VybmVsX2xiX2FkZHIgKmVsb2MsIHVpbnQzMl90ICplbGVuLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipiaCwgaW50IGluYykKK3sKKwlpbnQgYWxlbjsKKwlpbnQ4X3QgZXR5cGU7CisJdWludDhfdCAqcHRyOworCisJaWYgKCEqYmgpCisJeworCQlpZiAoISgqZXh0b2Zmc2V0KSkKKwkJCSpleHRvZmZzZXQgPSB1ZGZfZmlsZV9lbnRyeV9hbGxvY19vZmZzZXQoaW5vZGUpOworCQlwdHIgPSBVREZfSV9EQVRBKGlub2RlKSArICpleHRvZmZzZXQgLSB1ZGZfZmlsZV9lbnRyeV9hbGxvY19vZmZzZXQoaW5vZGUpICsgVURGX0lfTEVORUFUVFIoaW5vZGUpOworCQlhbGVuID0gdWRmX2ZpbGVfZW50cnlfYWxsb2Nfb2Zmc2V0KGlub2RlKSArIFVERl9JX0xFTkFMTE9DKGlub2RlKTsKKwl9CisJZWxzZQorCXsKKwkJaWYgKCEoKmV4dG9mZnNldCkpCisJCQkqZXh0b2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBhbGxvY0V4dERlc2MpOworCQlwdHIgPSAoKmJoKS0+Yl9kYXRhICsgKmV4dG9mZnNldDsKKwkJYWxlbiA9IHNpemVvZihzdHJ1Y3QgYWxsb2NFeHREZXNjKSArIGxlMzJfdG9fY3B1KCgoc3RydWN0IGFsbG9jRXh0RGVzYyAqKSgqYmgpLT5iX2RhdGEpLT5sZW5ndGhBbGxvY0Rlc2NzKTsKKwl9CisKKwlzd2l0Y2ggKFVERl9JX0FMTE9DVFlQRShpbm9kZSkpCisJeworCQljYXNlIElDQlRBR19GTEFHX0FEX1NIT1JUOgorCQl7CisJCQlzaG9ydF9hZCAqc2FkOworCisJCQlpZiAoIShzYWQgPSB1ZGZfZ2V0X2ZpbGVzaG9ydGFkKHB0ciwgYWxlbiwgZXh0b2Zmc2V0LCBpbmMpKSkKKwkJCQlyZXR1cm4gLTE7CisKKwkJCWV0eXBlID0gbGUzMl90b19jcHUoc2FkLT5leHRMZW5ndGgpID4+IDMwOworCQkJZWxvYy0+bG9naWNhbEJsb2NrTnVtID0gbGUzMl90b19jcHUoc2FkLT5leHRQb3NpdGlvbik7CisJCQllbG9jLT5wYXJ0aXRpb25SZWZlcmVuY2VOdW0gPSBVREZfSV9MT0NBVElPTihpbm9kZSkucGFydGl0aW9uUmVmZXJlbmNlTnVtOworCQkJKmVsZW4gPSBsZTMyX3RvX2NwdShzYWQtPmV4dExlbmd0aCkgJiBVREZfRVhURU5UX0xFTkdUSF9NQVNLOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBJQ0JUQUdfRkxBR19BRF9MT05HOgorCQl7CisJCQlsb25nX2FkICpsYWQ7CisKKwkJCWlmICghKGxhZCA9IHVkZl9nZXRfZmlsZWxvbmdhZChwdHIsIGFsZW4sIGV4dG9mZnNldCwgaW5jKSkpCisJCQkJcmV0dXJuIC0xOworCisJCQlldHlwZSA9IGxlMzJfdG9fY3B1KGxhZC0+ZXh0TGVuZ3RoKSA+PiAzMDsKKwkJCSplbG9jID0gbGVsYl90b19jcHUobGFkLT5leHRMb2NhdGlvbik7CisJCQkqZWxlbiA9IGxlMzJfdG9fY3B1KGxhZC0+ZXh0TGVuZ3RoKSAmIFVERl9FWFRFTlRfTEVOR1RIX01BU0s7CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OgorCQl7CisJCQl1ZGZfZGVidWcoImFsbG9jX3R5cGUgPSAlZCB1bnN1cHBvcnRlZFxuIiwgVURGX0lfQUxMT0NUWVBFKGlub2RlKSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlyZXR1cm4gZXR5cGU7Cit9CisKK3N0YXRpYyBpbnQ4X3QKK3VkZl9pbnNlcnRfYWV4dChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBrZXJuZWxfbGJfYWRkciBibG9jLCBpbnQgZXh0b2Zmc2V0LAorCQlrZXJuZWxfbGJfYWRkciBuZWxvYywgdWludDMyX3QgbmVsZW4sIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJa2VybmVsX2xiX2FkZHIgb2Vsb2M7CisJdWludDMyX3Qgb2VsZW47CisJaW50OF90IGV0eXBlOworCisJaWYgKGJoKQorCQlhdG9taWNfaW5jKCZiaC0+Yl9jb3VudCk7CisKKwl3aGlsZSAoKGV0eXBlID0gdWRmX25leHRfYWV4dChpbm9kZSwgJmJsb2MsICZleHRvZmZzZXQsICZvZWxvYywgJm9lbGVuLCAmYmgsIDApKSAhPSAtMSkKKwl7CisJCXVkZl93cml0ZV9hZXh0KGlub2RlLCBibG9jLCAmZXh0b2Zmc2V0LCBuZWxvYywgbmVsZW4sIGJoLCAxKTsKKworCQluZWxvYyA9IG9lbG9jOworCQluZWxlbiA9IChldHlwZSA8PCAzMCkgfCBvZWxlbjsKKwl9CisJdWRmX2FkZF9hZXh0KGlub2RlLCAmYmxvYywgJmV4dG9mZnNldCwgbmVsb2MsIG5lbGVuLCAmYmgsIDEpOworCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCXJldHVybiAobmVsZW4gPj4gMzApOworfQorCitpbnQ4X3QgdWRmX2RlbGV0ZV9hZXh0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIGtlcm5lbF9sYl9hZGRyIG5ibG9jLCBpbnQgbmV4dG9mZnNldCwKKwlrZXJuZWxfbGJfYWRkciBlbG9jLCB1aW50MzJfdCBlbGVuLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKm5iaCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKm9iaDsKKwlrZXJuZWxfbGJfYWRkciBvYmxvYzsKKwlpbnQgb2V4dG9mZnNldCwgYWRzaXplOworCWludDhfdCBldHlwZTsKKwlzdHJ1Y3QgYWxsb2NFeHREZXNjICphZWQ7CisKKwlpZiAobmJoKQorCXsKKwkJYXRvbWljX2luYygmbmJoLT5iX2NvdW50KTsKKwkJYXRvbWljX2luYygmbmJoLT5iX2NvdW50KTsKKwl9CisKKwlpZiAoVURGX0lfQUxMT0NUWVBFKGlub2RlKSA9PSBJQ0JUQUdfRkxBR19BRF9TSE9SVCkKKwkJYWRzaXplID0gc2l6ZW9mKHNob3J0X2FkKTsKKwllbHNlIGlmIChVREZfSV9BTExPQ1RZUEUoaW5vZGUpID09IElDQlRBR19GTEFHX0FEX0xPTkcpCisJCWFkc2l6ZSA9IHNpemVvZihsb25nX2FkKTsKKwllbHNlCisJCWFkc2l6ZSA9IDA7CisKKwlvYmggPSBuYmg7CisJb2Jsb2MgPSBuYmxvYzsKKwlvZXh0b2Zmc2V0ID0gbmV4dG9mZnNldDsKKworCWlmICh1ZGZfbmV4dF9hZXh0KGlub2RlLCAmbmJsb2MsICZuZXh0b2Zmc2V0LCAmZWxvYywgJmVsZW4sICZuYmgsIDEpID09IC0xKQorCQlyZXR1cm4gLTE7CisKKwl3aGlsZSAoKGV0eXBlID0gdWRmX25leHRfYWV4dChpbm9kZSwgJm5ibG9jLCAmbmV4dG9mZnNldCwgJmVsb2MsICZlbGVuLCAmbmJoLCAxKSkgIT0gLTEpCisJeworCQl1ZGZfd3JpdGVfYWV4dChpbm9kZSwgb2Jsb2MsICZvZXh0b2Zmc2V0LCBlbG9jLCAoZXR5cGUgPDwgMzApIHwgZWxlbiwgb2JoLCAxKTsKKwkJaWYgKG9iaCAhPSBuYmgpCisJCXsKKwkJCW9ibG9jID0gbmJsb2M7CisJCQl1ZGZfcmVsZWFzZV9kYXRhKG9iaCk7CisJCQlhdG9taWNfaW5jKCZuYmgtPmJfY291bnQpOworCQkJb2JoID0gbmJoOworCQkJb2V4dG9mZnNldCA9IG5leHRvZmZzZXQgLSBhZHNpemU7CisJCX0KKwl9CisJbWVtc2V0KCZlbG9jLCAweDAwLCBzaXplb2Yoa2VybmVsX2xiX2FkZHIpKTsKKwllbGVuID0gMDsKKworCWlmIChuYmggIT0gb2JoKQorCXsKKwkJdWRmX2ZyZWVfYmxvY2tzKGlub2RlLT5pX3NiLCBpbm9kZSwgbmJsb2MsIDAsIDEpOworCQl1ZGZfd3JpdGVfYWV4dChpbm9kZSwgb2Jsb2MsICZvZXh0b2Zmc2V0LCBlbG9jLCBlbGVuLCBvYmgsIDEpOworCQl1ZGZfd3JpdGVfYWV4dChpbm9kZSwgb2Jsb2MsICZvZXh0b2Zmc2V0LCBlbG9jLCBlbGVuLCBvYmgsIDEpOworCQlpZiAoIW9iaCkKKwkJeworCQkJVURGX0lfTEVOQUxMT0MoaW5vZGUpIC09IChhZHNpemUgKiAyKTsKKwkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQl9CisJCWVsc2UKKwkJeworCQkJYWVkID0gKHN0cnVjdCBhbGxvY0V4dERlc2MgKikob2JoKS0+Yl9kYXRhOworCQkJYWVkLT5sZW5ndGhBbGxvY0Rlc2NzID0KKwkJCQljcHVfdG9fbGUzMihsZTMyX3RvX2NwdShhZWQtPmxlbmd0aEFsbG9jRGVzY3MpIC0gKDIqYWRzaXplKSk7CisJCQlpZiAoIVVERl9RVUVSWV9GTEFHKGlub2RlLT5pX3NiLCBVREZfRkxBR19TVFJJQ1QpIHx8IFVERl9TQl9VREZSRVYoaW5vZGUtPmlfc2IpID49IDB4MDIwMSkKKwkJCQl1ZGZfdXBkYXRlX3RhZygob2JoKS0+Yl9kYXRhLCBvZXh0b2Zmc2V0IC0gKDIqYWRzaXplKSk7CisJCQllbHNlCisJCQkJdWRmX3VwZGF0ZV90YWcoKG9iaCktPmJfZGF0YSwgc2l6ZW9mKHN0cnVjdCBhbGxvY0V4dERlc2MpKTsKKwkJCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKG9iaCwgaW5vZGUpOworCQl9CisJfQorCWVsc2UKKwl7CisJCXVkZl93cml0ZV9hZXh0KGlub2RlLCBvYmxvYywgJm9leHRvZmZzZXQsIGVsb2MsIGVsZW4sIG9iaCwgMSk7CisJCWlmICghb2JoKQorCQl7CisJCQlVREZfSV9MRU5BTExPQyhpbm9kZSkgLT0gYWRzaXplOworCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlhZWQgPSAoc3RydWN0IGFsbG9jRXh0RGVzYyAqKShvYmgpLT5iX2RhdGE7CisJCQlhZWQtPmxlbmd0aEFsbG9jRGVzY3MgPQorCQkJCWNwdV90b19sZTMyKGxlMzJfdG9fY3B1KGFlZC0+bGVuZ3RoQWxsb2NEZXNjcykgLSBhZHNpemUpOworCQkJaWYgKCFVREZfUVVFUllfRkxBRyhpbm9kZS0+aV9zYiwgVURGX0ZMQUdfU1RSSUNUKSB8fCBVREZfU0JfVURGUkVWKGlub2RlLT5pX3NiKSA+PSAweDAyMDEpCisJCQkJdWRmX3VwZGF0ZV90YWcoKG9iaCktPmJfZGF0YSwgb2V4dG9mZnNldCAtIGFkc2l6ZSk7CisJCQllbHNlCisJCQkJdWRmX3VwZGF0ZV90YWcoKG9iaCktPmJfZGF0YSwgc2l6ZW9mKHN0cnVjdCBhbGxvY0V4dERlc2MpKTsKKwkJCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKG9iaCwgaW5vZGUpOworCQl9CisJfQorCQorCXVkZl9yZWxlYXNlX2RhdGEobmJoKTsKKwl1ZGZfcmVsZWFzZV9kYXRhKG9iaCk7CisJcmV0dXJuIChlbGVuID4+IDMwKTsKK30KKworaW50OF90IGlub2RlX2JtYXAoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGJsb2NrLCBrZXJuZWxfbGJfYWRkciAqYmxvYywgdWludDMyX3QgKmV4dG9mZnNldCwKKwlrZXJuZWxfbGJfYWRkciAqZWxvYywgdWludDMyX3QgKmVsZW4sIHVpbnQzMl90ICpvZmZzZXQsIHN0cnVjdCBidWZmZXJfaGVhZCAqKmJoKQoreworCXVpbnQ2NF90IGxiY291bnQgPSAwLCBiY291bnQgPSAodWludDY0X3QpYmxvY2sgPDwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJaW50OF90IGV0eXBlOworCisJaWYgKGJsb2NrIDwgMCkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAidWRmOiBpbm9kZV9ibWFwOiBibG9jayA8IDBcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCWlmICghaW5vZGUpCisJeworCQlwcmludGsoS0VSTl9FUlIgInVkZjogaW5vZGVfYm1hcDogTlVMTCBpbm9kZVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkqZXh0b2Zmc2V0ID0gMDsKKwkqZWxlbiA9IDA7CisJKmJsb2MgPSBVREZfSV9MT0NBVElPTihpbm9kZSk7CisKKwlkbworCXsKKwkJaWYgKChldHlwZSA9IHVkZl9uZXh0X2FleHQoaW5vZGUsIGJsb2MsIGV4dG9mZnNldCwgZWxvYywgZWxlbiwgYmgsIDEpKSA9PSAtMSkKKwkJeworCQkJKm9mZnNldCA9IGJjb3VudCAtIGxiY291bnQ7CisJCQlVREZfSV9MRU5FWFRFTlRTKGlub2RlKSA9IGxiY291bnQ7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJbGJjb3VudCArPSAqZWxlbjsKKwl9IHdoaWxlIChsYmNvdW50IDw9IGJjb3VudCk7CisKKwkqb2Zmc2V0ID0gYmNvdW50ICsgKmVsZW4gLSBsYmNvdW50OworCisJcmV0dXJuIGV0eXBlOworfQorCitsb25nIHVkZl9ibG9ja19tYXAoc3RydWN0IGlub2RlICppbm9kZSwgbG9uZyBibG9jaykKK3sKKwlrZXJuZWxfbGJfYWRkciBlbG9jLCBibG9jOworCXVpbnQzMl90IG9mZnNldCwgZXh0b2Zmc2V0LCBlbGVuOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCWludCByZXQ7CisKKwlsb2NrX2tlcm5lbCgpOworCisJaWYgKGlub2RlX2JtYXAoaW5vZGUsIGJsb2NrLCAmYmxvYywgJmV4dG9mZnNldCwgJmVsb2MsICZlbGVuLCAmb2Zmc2V0LCAmYmgpID09IChFWFRfUkVDT1JERURfQUxMT0NBVEVEID4+IDMwKSkKKwkJcmV0ID0gdWRmX2dldF9sYl9wYmxvY2soaW5vZGUtPmlfc2IsIGVsb2MsIG9mZnNldCA+PiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyk7CisJZWxzZQorCQlyZXQgPSAwOworCisJdW5sb2NrX2tlcm5lbCgpOworCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCisJaWYgKFVERl9RVUVSWV9GTEFHKGlub2RlLT5pX3NiLCBVREZfRkxBR19WQVJDT05WKSkKKwkJcmV0dXJuIHVkZl9maXhlZF90b192YXJpYWJsZShyZXQpOworCWVsc2UKKwkJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2ZzL3VkZi9sb3dsZXZlbC5jIGIvZnMvdWRmL2xvd2xldmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRhNTA4NwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3VkZi9sb3dsZXZlbC5jCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBsb3dsZXZlbC5jCisgKgorICogUFVSUE9TRQorICogIExvdyBMZXZlbCBEZXZpY2UgUm91dGluZXMgZm9yIHRoZSBVREYgZmlsZXN5c3RlbQorICoKKyAqIENPTlRBQ1RTCisgKglFLW1haWwgcmVnYXJkaW5nIGFueSBwb3J0aW9uIG9mIHRoZSBMaW51eCBVREYgZmlsZSBzeXN0ZW0gc2hvdWxkIGJlCisgKglkaXJlY3RlZCB0byB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBtYWlsaW5nIGxpc3QgKHJ1biBieSBtYWpvcmRvbW8pOgorICoJCWxpbnV4X3VkZkBocGVzanJvLmZjLmhwLmNvbQorICoKKyAqIENPUFlSSUdIVAorICoJVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIChHUEwpLiBDb3BpZXMgb2YgdGhlIEdQTCBjYW4gYmUgb2J0YWluZWQgZnJvbToKKyAqCQlmdHA6Ly9wcmVwLmFpLm1pdC5lZHUvcHViL2dudS9HUEwKKyAqCUVhY2ggY29udHJpYnV0aW5nIGF1dGhvciByZXRhaW5zIGFsbCByaWdodHMgdG8gdGhlaXIgb3duIHdvcmsuCisgKgorICogIChDKSAxOTk5LTIwMDEgQmVuIEZlbm5lbWEKKyAqCisgKiBISVNUT1JZCisgKgorICogIDAzLzI2Lzk5IGJsZiAgQ3JlYXRlZC4KKyAqLworCisjaW5jbHVkZSAidWRmZGVjbC5oIgorCisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvY2Ryb20uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bGludXgvdWRmX2ZzLmg+CisjaW5jbHVkZSAidWRmX3NiLmgiCisKK3Vuc2lnbmVkIGludCAKK3VkZl9nZXRfbGFzdF9zZXNzaW9uKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IGNkcm9tX211bHRpc2Vzc2lvbiBtc19pbmZvOworCXVuc2lnbmVkIGludCB2b2xfZGVzY19zdGFydDsKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gc2ItPnNfYmRldjsKKwlpbnQgaTsKKworCXZvbF9kZXNjX3N0YXJ0PTA7CisJbXNfaW5mby5hZGRyX2Zvcm1hdD1DRFJPTV9MQkE7CisJaSA9IGlvY3RsX2J5X2JkZXYoYmRldiwgQ0RST01NVUxUSVNFU1NJT04sICh1bnNpZ25lZCBsb25nKSAmbXNfaW5mbyk7CisKKyNkZWZpbmUgV0VfT0JFWV9USEVfV1JJVFRFTl9TVEFOREFSRFMgMQorCisJaWYgKGkgPT0gMCkKKwl7CisJCXVkZl9kZWJ1ZygiWEEgZGlzazogJXMsIHZvbF9kZXNjX3N0YXJ0PSVkXG4iLAorCQkJKG1zX2luZm8ueGFfZmxhZyA/ICJ5ZXMiIDogIm5vIiksIG1zX2luZm8uYWRkci5sYmEpOworI2lmIFdFX09CRVlfVEhFX1dSSVRURU5fU1RBTkRBUkRTCisJCWlmIChtc19pbmZvLnhhX2ZsYWcpIC8qIG5lY2Vzc2FyeSBmb3IgYSB2YWxpZCBtc19pbmZvLmFkZHIgKi8KKyNlbmRpZgorCQkJdm9sX2Rlc2Nfc3RhcnQgPSBtc19pbmZvLmFkZHIubGJhOworCX0KKwllbHNlCisJeworCQl1ZGZfZGVidWcoIkNEUk9NTVVMVElTRVNTSU9OIG5vdCBzdXBwb3J0ZWQ6IHJjPSVkXG4iLCBpKTsKKwl9CisJcmV0dXJuIHZvbF9kZXNjX3N0YXJ0OworfQorCit1bnNpZ25lZCBsb25nCit1ZGZfZ2V0X2xhc3RfYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gc2ItPnNfYmRldjsKKwl1bnNpZ25lZCBsb25nIGxibG9jayA9IDA7CisKKwlpZiAoaW9jdGxfYnlfYmRldihiZGV2LCBDRFJPTV9MQVNUX1dSSVRURU4sICh1bnNpZ25lZCBsb25nKSAmbGJsb2NrKSkKKwkJbGJsb2NrID0gYmRldi0+YmRfaW5vZGUtPmlfc2l6ZSA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKKworCWlmIChsYmxvY2spCisJCXJldHVybiBsYmxvY2sgLSAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy91ZGYvbWlzYy5jIGIvZnMvdWRmL21pc2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDMyMWY5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvdWRmL21pc2MuYwpAQCAtMCwwICsxLDMxMyBAQAorLyoKKyAqIG1pc2MuYworICoKKyAqIFBVUlBPU0UKKyAqCU1pc2NlbGxhbmVvdXMgcm91dGluZXMgZm9yIHRoZSBPU1RBLVVERih0bSkgZmlsZXN5c3RlbS4KKyAqCisgKiBDT05UQUNUUworICoJRS1tYWlsIHJlZ2FyZGluZyBhbnkgcG9ydGlvbiBvZiB0aGUgTGludXggVURGIGZpbGUgc3lzdGVtIHNob3VsZCBiZQorICoJZGlyZWN0ZWQgdG8gdGhlIGRldmVsb3BtZW50IHRlYW0gbWFpbGluZyBsaXN0IChydW4gYnkgbWFqb3Jkb21vKToKKyAqCQlsaW51eF91ZGZAaHBlc2pyby5mYy5ocC5jb20KKyAqCisgKiBDT1BZUklHSFQKKyAqCVRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSAoR1BMKS4gQ29waWVzIG9mIHRoZSBHUEwgY2FuIGJlIG9idGFpbmVkIGZyb206CisgKgkJZnRwOi8vcHJlcC5haS5taXQuZWR1L3B1Yi9nbnUvR1BMCisgKglFYWNoIGNvbnRyaWJ1dGluZyBhdXRob3IgcmV0YWlucyBhbGwgcmlnaHRzIHRvIHRoZWlyIG93biB3b3JrLgorICoKKyAqICAoQykgMTk5OCBEYXZlIEJveW50b24KKyAqICAoQykgMTk5OC0yMDA0IEJlbiBGZW5uZW1hCisgKiAgKEMpIDE5OTktMjAwMCBTdGVsaWFzIENvbXB1dGluZyBJbmMKKyAqCisgKiBISVNUT1JZCisgKgorICogIDA0LzE5Lzk5IGJsZiAgcGFydGlhbCBzdXBwb3J0IGZvciByZWFkaW5nL3dyaXRpbmcgc3BlY2lmaWMgRUEncworICovCisKKyNpbmNsdWRlICJ1ZGZkZWNsLmgiCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3VkZl9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisKKyNpbmNsdWRlICJ1ZGZfaS5oIgorI2luY2x1ZGUgInVkZl9zYi5oIgorCitzdHJ1Y3QgYnVmZmVyX2hlYWQgKgordWRmX3RnZXRibGsoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGJsb2NrKQoreworCWlmIChVREZfUVVFUllfRkxBRyhzYiwgVURGX0ZMQUdfVkFSQ09OVikpCisJCXJldHVybiBzYl9nZXRibGsoc2IsIHVkZl9maXhlZF90b192YXJpYWJsZShibG9jaykpOworCWVsc2UKKwkJcmV0dXJuIHNiX2dldGJsayhzYiwgYmxvY2spOworfQorCitzdHJ1Y3QgYnVmZmVyX2hlYWQgKgordWRmX3RyZWFkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBibG9jaykKK3sKKwlpZiAoVURGX1FVRVJZX0ZMQUcoc2IsIFVERl9GTEFHX1ZBUkNPTlYpKQorCQlyZXR1cm4gc2JfYnJlYWQoc2IsIHVkZl9maXhlZF90b192YXJpYWJsZShibG9jaykpOworCWVsc2UKKwkJcmV0dXJuIHNiX2JyZWFkKHNiLCBibG9jayk7Cit9CisKK3N0cnVjdCBnZW5lcmljRm9ybWF0ICoKK3VkZl9hZGRfZXh0ZW5kZWRhdHRyKHN0cnVjdCBpbm9kZSAqIGlub2RlLCB1aW50MzJfdCBzaXplLCB1aW50MzJfdCB0eXBlLAorCXVpbnQ4X3QgbG9jKQoreworCXVpbnQ4X3QgKmVhID0gTlVMTCwgKmFkID0gTlVMTDsKKwlpbnQgb2Zmc2V0OworCXVpbnQxNl90IGNyY2xlbjsKKwlpbnQgaTsKKworCWVhID0gVURGX0lfREFUQShpbm9kZSk7CisJaWYgKFVERl9JX0xFTkVBVFRSKGlub2RlKSkKKwkJYWQgPSBVREZfSV9EQVRBKGlub2RlKSArIFVERl9JX0xFTkVBVFRSKGlub2RlKTsKKwllbHNlCisJeworCQlhZCA9IGVhOworCQlzaXplICs9IHNpemVvZihzdHJ1Y3QgZXh0ZW5kZWRBdHRySGVhZGVyRGVzYyk7CisJfQorCisJb2Zmc2V0ID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gdWRmX2ZpbGVfZW50cnlfYWxsb2Nfb2Zmc2V0KGlub2RlKSAtCisJCVVERl9JX0xFTkFMTE9DKGlub2RlKTsKKworCS8qIFRPRE8gLSBDaGVjayBmb3IgRnJlZUVBU3BhY2UgKi8KKworCWlmIChsb2MgJiAweDAxICYmIG9mZnNldCA+PSBzaXplKQorCXsKKwkJc3RydWN0IGV4dGVuZGVkQXR0ckhlYWRlckRlc2MgKmVhaGQ7CisJCWVhaGQgPSAoc3RydWN0IGV4dGVuZGVkQXR0ckhlYWRlckRlc2MgKillYTsKKworCQlpZiAoVURGX0lfTEVOQUxMT0MoaW5vZGUpKQorCQl7CisJCQltZW1tb3ZlKCZhZFtzaXplXSwgYWQsIFVERl9JX0xFTkFMTE9DKGlub2RlKSk7CisJCX0KKworCQlpZiAoVURGX0lfTEVORUFUVFIoaW5vZGUpKQorCQl7CisJCQkvKiBjaGVjayBjaGVja3N1bS9jcmMgKi8KKwkJCWlmIChsZTE2X3RvX2NwdShlYWhkLT5kZXNjVGFnLnRhZ0lkZW50KSAhPSBUQUdfSURFTlRfRUFIRCB8fAorCQkJCWxlMzJfdG9fY3B1KGVhaGQtPmRlc2NUYWcudGFnTG9jYXRpb24pICE9IFVERl9JX0xPQ0FUSU9OKGlub2RlKS5sb2dpY2FsQmxvY2tOdW0pCisJCQl7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlzaXplIC09IHNpemVvZihzdHJ1Y3QgZXh0ZW5kZWRBdHRySGVhZGVyRGVzYyk7CisJCQlVREZfSV9MRU5FQVRUUihpbm9kZSkgKz0gc2l6ZW9mKHN0cnVjdCBleHRlbmRlZEF0dHJIZWFkZXJEZXNjKTsKKwkJCWVhaGQtPmRlc2NUYWcudGFnSWRlbnQgPSBjcHVfdG9fbGUxNihUQUdfSURFTlRfRUFIRCk7CisJCQlpZiAoVURGX1NCX1VERlJFVihpbm9kZS0+aV9zYikgPj0gMHgwMjAwKQorCQkJCWVhaGQtPmRlc2NUYWcuZGVzY1ZlcnNpb24gPSBjcHVfdG9fbGUxNigzKTsKKwkJCWVsc2UKKwkJCQllYWhkLT5kZXNjVGFnLmRlc2NWZXJzaW9uID0gY3B1X3RvX2xlMTYoMik7CisJCQllYWhkLT5kZXNjVGFnLnRhZ1NlcmlhbE51bSA9IGNwdV90b19sZTE2KFVERl9TQl9TRVJJQUxOVU0oaW5vZGUtPmlfc2IpKTsKKwkJCWVhaGQtPmRlc2NUYWcudGFnTG9jYXRpb24gPSBjcHVfdG9fbGUzMihVREZfSV9MT0NBVElPTihpbm9kZSkubG9naWNhbEJsb2NrTnVtKTsKKwkJCWVhaGQtPmltcEF0dHJMb2NhdGlvbiA9IGNwdV90b19sZTMyKDB4RkZGRkZGRkYpOworCQkJZWFoZC0+YXBwQXR0ckxvY2F0aW9uID0gY3B1X3RvX2xlMzIoMHhGRkZGRkZGRik7CisJCX0KKworCQlvZmZzZXQgPSBVREZfSV9MRU5FQVRUUihpbm9kZSk7CisJCWlmICh0eXBlIDwgMjA0OCkKKwkJeworCQkJaWYgKGxlMzJfdG9fY3B1KGVhaGQtPmFwcEF0dHJMb2NhdGlvbikgPCBVREZfSV9MRU5FQVRUUihpbm9kZSkpCisJCQl7CisJCQkJdWludDMyX3QgYWFsID0gbGUzMl90b19jcHUoZWFoZC0+YXBwQXR0ckxvY2F0aW9uKTsKKwkJCQltZW1tb3ZlKCZlYVtvZmZzZXQgLSBhYWwgKyBzaXplXSwKKwkJCQkJJmVhW2FhbF0sIG9mZnNldCAtIGFhbCk7CisJCQkJb2Zmc2V0IC09IGFhbDsKKwkJCQllYWhkLT5hcHBBdHRyTG9jYXRpb24gPSBjcHVfdG9fbGUzMihhYWwgKyBzaXplKTsKKwkJCX0KKwkJCWlmIChsZTMyX3RvX2NwdShlYWhkLT5pbXBBdHRyTG9jYXRpb24pIDwgVURGX0lfTEVORUFUVFIoaW5vZGUpKQorCQkJeworCQkJCXVpbnQzMl90IGlhbCA9IGxlMzJfdG9fY3B1KGVhaGQtPmltcEF0dHJMb2NhdGlvbik7CisJCQkJbWVtbW92ZSgmZWFbb2Zmc2V0IC0gaWFsICsgc2l6ZV0sCisJCQkJCSZlYVtpYWxdLCBvZmZzZXQgLSBpYWwpOworCQkJCW9mZnNldCAtPSBpYWw7CisJCQkJZWFoZC0+aW1wQXR0ckxvY2F0aW9uID0gY3B1X3RvX2xlMzIoaWFsICsgc2l6ZSk7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAodHlwZSA8IDY1NTM2KQorCQl7CisJCQlpZiAobGUzMl90b19jcHUoZWFoZC0+YXBwQXR0ckxvY2F0aW9uKSA8IFVERl9JX0xFTkVBVFRSKGlub2RlKSkKKwkJCXsKKwkJCQl1aW50MzJfdCBhYWwgPSBsZTMyX3RvX2NwdShlYWhkLT5hcHBBdHRyTG9jYXRpb24pOworCQkJCW1lbW1vdmUoJmVhW29mZnNldCAtIGFhbCArIHNpemVdLAorCQkJCQkmZWFbYWFsXSwgb2Zmc2V0IC0gYWFsKTsKKwkJCQlvZmZzZXQgLT0gYWFsOworCQkJCWVhaGQtPmFwcEF0dHJMb2NhdGlvbiA9IGNwdV90b19sZTMyKGFhbCArIHNpemUpOworCQkJfQorCQl9CisJCS8qIHJld3JpdGUgQ1JDICsgY2hlY2tzdW0gb2YgZWFoZCAqLworCQljcmNsZW4gPSBzaXplb2Yoc3RydWN0IGV4dGVuZGVkQXR0ckhlYWRlckRlc2MpIC0gc2l6ZW9mKHRhZyk7CisJCWVhaGQtPmRlc2NUYWcuZGVzY0NSQ0xlbmd0aCA9IGNwdV90b19sZTE2KGNyY2xlbik7CisJCWVhaGQtPmRlc2NUYWcuZGVzY0NSQyA9IGNwdV90b19sZTE2KHVkZl9jcmMoKGNoYXIgKillYWhkICsgc2l6ZW9mKHRhZyksIGNyY2xlbiwgMCkpOworCQllYWhkLT5kZXNjVGFnLnRhZ0NoZWNrc3VtID0gMDsKKwkJZm9yIChpPTA7IGk8MTY7IGkrKykKKwkJCWlmIChpICE9IDQpCisJCQkJZWFoZC0+ZGVzY1RhZy50YWdDaGVja3N1bSArPSAoKHVpbnQ4X3QgKikmKGVhaGQtPmRlc2NUYWcpKVtpXTsKKwkJVURGX0lfTEVORUFUVFIoaW5vZGUpICs9IHNpemU7CisJCXJldHVybiAoc3RydWN0IGdlbmVyaWNGb3JtYXQgKikmZWFbb2Zmc2V0XTsKKwl9CisJaWYgKGxvYyAmIDB4MDIpCisJeworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGdlbmVyaWNGb3JtYXQgKgordWRmX2dldF9leHRlbmRlZGF0dHIoc3RydWN0IGlub2RlICppbm9kZSwgdWludDMyX3QgdHlwZSwgdWludDhfdCBzdWJ0eXBlKQoreworCXN0cnVjdCBnZW5lcmljRm9ybWF0ICpnYWY7CisJdWludDhfdCAqZWEgPSBOVUxMOworCXVpbnQzMl90IG9mZnNldDsKKworCWVhID0gVURGX0lfREFUQShpbm9kZSk7CisKKwlpZiAoVURGX0lfTEVORUFUVFIoaW5vZGUpKQorCXsKKwkJc3RydWN0IGV4dGVuZGVkQXR0ckhlYWRlckRlc2MgKmVhaGQ7CisJCWVhaGQgPSAoc3RydWN0IGV4dGVuZGVkQXR0ckhlYWRlckRlc2MgKillYTsKKworCQkvKiBjaGVjayBjaGVja3N1bS9jcmMgKi8KKwkJaWYgKGxlMTZfdG9fY3B1KGVhaGQtPmRlc2NUYWcudGFnSWRlbnQpICE9IFRBR19JREVOVF9FQUhEIHx8CisJCQlsZTMyX3RvX2NwdShlYWhkLT5kZXNjVGFnLnRhZ0xvY2F0aW9uKSAhPSBVREZfSV9MT0NBVElPTihpbm9kZSkubG9naWNhbEJsb2NrTnVtKQorCQl7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQorCQlpZiAodHlwZSA8IDIwNDgpCisJCQlvZmZzZXQgPSBzaXplb2Yoc3RydWN0IGV4dGVuZGVkQXR0ckhlYWRlckRlc2MpOworCQllbHNlIGlmICh0eXBlIDwgNjU1MzYpCisJCQlvZmZzZXQgPSBsZTMyX3RvX2NwdShlYWhkLT5pbXBBdHRyTG9jYXRpb24pOworCQllbHNlCisJCQlvZmZzZXQgPSBsZTMyX3RvX2NwdShlYWhkLT5hcHBBdHRyTG9jYXRpb24pOworCisJCXdoaWxlIChvZmZzZXQgPCBVREZfSV9MRU5FQVRUUihpbm9kZSkpCisJCXsKKwkJCWdhZiA9IChzdHJ1Y3QgZ2VuZXJpY0Zvcm1hdCAqKSZlYVtvZmZzZXRdOworCQkJaWYgKGxlMzJfdG9fY3B1KGdhZi0+YXR0clR5cGUpID09IHR5cGUgJiYgZ2FmLT5hdHRyU3VidHlwZSA9PSBzdWJ0eXBlKQorCQkJCXJldHVybiBnYWY7CisJCQllbHNlCisJCQkJb2Zmc2V0ICs9IGxlMzJfdG9fY3B1KGdhZi0+YXR0ckxlbmd0aCk7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiB1ZGZfcmVhZF90YWdnZWQKKyAqCisgKiBQVVJQT1NFCisgKglSZWFkIHRoZSBmaXJzdCBibG9jayBvZiBhIHRhZ2dlZCBkZXNjcmlwdG9yLgorICoKKyAqIEhJU1RPUlkKKyAqCUp1bHkgMSwgMTk5NyAtIEFuZHJldyBFLiBNaWxlc2tpCisgKglXcml0dGVuLCB0ZXN0ZWQsIGFuZCByZWxlYXNlZC4KKyAqLworc3RydWN0IGJ1ZmZlcl9oZWFkICoKK3VkZl9yZWFkX3RhZ2dlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1aW50MzJfdCBibG9jaywgdWludDMyX3QgbG9jYXRpb24sIHVpbnQxNl90ICppZGVudCkKK3sKKwl0YWcgKnRhZ19wOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCXJlZ2lzdGVyIHVpbnQ4X3QgY2hlY2tzdW07CisJcmVnaXN0ZXIgaW50IGk7CisKKwkvKiBSZWFkIHRoZSBibG9jayAqLworCWlmIChibG9jayA9PSAweEZGRkZGRkZGKQorCQlyZXR1cm4gTlVMTDsKKworCWJoID0gdWRmX3RyZWFkKHNiLCBibG9jayArIFVERl9TQl9TRVNTSU9OKHNiKSk7CisJaWYgKCFiaCkKKwl7CisJCXVkZl9kZWJ1ZygiYmxvY2s9JWQsIGxvY2F0aW9uPSVkOiByZWFkIGZhaWxlZFxuIiwgYmxvY2sgKyBVREZfU0JfU0VTU0lPTihzYiksIGxvY2F0aW9uKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJdGFnX3AgPSAodGFnICopKGJoLT5iX2RhdGEpOworCisJKmlkZW50ID0gbGUxNl90b19jcHUodGFnX3AtPnRhZ0lkZW50KTsKKworCWlmICggbG9jYXRpb24gIT0gbGUzMl90b19jcHUodGFnX3AtPnRhZ0xvY2F0aW9uKSApCisJeworCQl1ZGZfZGVidWcoImxvY2F0aW9uIG1pc21hdGNoIGJsb2NrICV1LCB0YWcgJXUgIT0gJXVcbiIsCisJCQlibG9jayArIFVERl9TQl9TRVNTSU9OKHNiKSwgbGUzMl90b19jcHUodGFnX3AtPnRhZ0xvY2F0aW9uKSwgbG9jYXRpb24pOworCQlnb3RvIGVycm9yX291dDsKKwl9CisJCisJLyogVmVyaWZ5IHRoZSB0YWcgY2hlY2tzdW0gKi8KKwljaGVja3N1bSA9IDBVOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCWNoZWNrc3VtICs9ICh1aW50OF90KShiaC0+Yl9kYXRhW2ldKTsKKwlmb3IgKGkgPSA1OyBpIDwgMTY7IGkrKykKKwkJY2hlY2tzdW0gKz0gKHVpbnQ4X3QpKGJoLT5iX2RhdGFbaV0pOworCWlmIChjaGVja3N1bSAhPSB0YWdfcC0+dGFnQ2hlY2tzdW0pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ1ZGY6IHRhZyBjaGVja3N1bSBmYWlsZWQgYmxvY2sgJWRcbiIsIGJsb2NrKTsKKwkJZ290byBlcnJvcl9vdXQ7CisJfQorCisJLyogVmVyaWZ5IHRoZSB0YWcgdmVyc2lvbiAqLworCWlmIChsZTE2X3RvX2NwdSh0YWdfcC0+ZGVzY1ZlcnNpb24pICE9IDB4MDAwMlUgJiYKKwkJbGUxNl90b19jcHUodGFnX3AtPmRlc2NWZXJzaW9uKSAhPSAweDAwMDNVKQorCXsKKwkJdWRmX2RlYnVnKCJ0YWcgdmVyc2lvbiAweCUwNHggIT0gMHgwMDAyIHx8IDB4MDAwMyBibG9jayAlZFxuIiwKKwkJCWxlMTZfdG9fY3B1KHRhZ19wLT5kZXNjVmVyc2lvbiksIGJsb2NrKTsKKwkJZ290byBlcnJvcl9vdXQ7CisJfQorCisJLyogVmVyaWZ5IHRoZSBkZXNjcmlwdG9yIENSQyAqLworCWlmIChsZTE2X3RvX2NwdSh0YWdfcC0+ZGVzY0NSQ0xlbmd0aCkgKyBzaXplb2YodGFnKSA+IHNiLT5zX2Jsb2Nrc2l6ZSB8fAorCQlsZTE2X3RvX2NwdSh0YWdfcC0+ZGVzY0NSQykgPT0gdWRmX2NyYyhiaC0+Yl9kYXRhICsgc2l6ZW9mKHRhZyksCisJCQlsZTE2X3RvX2NwdSh0YWdfcC0+ZGVzY0NSQ0xlbmd0aCksIDApKQorCXsKKwkJcmV0dXJuIGJoOworCX0KKwl1ZGZfZGVidWcoIkNyYyBmYWlsdXJlIGJsb2NrICVkOiBjcmMgPSAlZCwgY3JjbGVuID0gJWRcbiIsCisJCWJsb2NrICsgVURGX1NCX1NFU1NJT04oc2IpLCBsZTE2X3RvX2NwdSh0YWdfcC0+ZGVzY0NSQyksIGxlMTZfdG9fY3B1KHRhZ19wLT5kZXNjQ1JDTGVuZ3RoKSk7CisKK2Vycm9yX291dDoKKwlicmVsc2UoYmgpOworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgYnVmZmVyX2hlYWQgKgordWRmX3JlYWRfcHRhZ2dlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBrZXJuZWxfbGJfYWRkciBsb2MsIHVpbnQzMl90IG9mZnNldCwgdWludDE2X3QgKmlkZW50KQoreworCXJldHVybiB1ZGZfcmVhZF90YWdnZWQoc2IsIHVkZl9nZXRfbGJfcGJsb2NrKHNiLCBsb2MsIG9mZnNldCksCisJCWxvYy5sb2dpY2FsQmxvY2tOdW0gKyBvZmZzZXQsIGlkZW50KTsKK30KKwordm9pZCB1ZGZfcmVsZWFzZV9kYXRhKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJaWYgKGJoKQorCQlicmVsc2UoYmgpOworfQorCit2b2lkIHVkZl91cGRhdGVfdGFnKGNoYXIgKmRhdGEsIGludCBsZW5ndGgpCit7CisJdGFnICp0cHRyID0gKHRhZyAqKWRhdGE7CisJaW50IGk7CisKKwlsZW5ndGggLT0gc2l6ZW9mKHRhZyk7CisKKwl0cHRyLT50YWdDaGVja3N1bSA9IDA7CisJdHB0ci0+ZGVzY0NSQ0xlbmd0aCA9IGNwdV90b19sZTE2KGxlbmd0aCk7CisJdHB0ci0+ZGVzY0NSQyA9IGNwdV90b19sZTE2KHVkZl9jcmMoZGF0YSArIHNpemVvZih0YWcpLCBsZW5ndGgsIDApKTsKKworCWZvciAoaT0wOyBpPDE2OyBpKyspCisJCWlmIChpICE9IDQpCisJCQl0cHRyLT50YWdDaGVja3N1bSArPSAodWludDhfdCkoZGF0YVtpXSk7Cit9CisKK3ZvaWQgdWRmX25ld190YWcoY2hhciAqZGF0YSwgdWludDE2X3QgaWRlbnQsIHVpbnQxNl90IHZlcnNpb24sIHVpbnQxNl90IHNudW0sCisJdWludDMyX3QgbG9jLCBpbnQgbGVuZ3RoKQoreworCXRhZyAqdHB0ciA9ICh0YWcgKilkYXRhOworCXRwdHItPnRhZ0lkZW50ID0gY3B1X3RvX2xlMTYoaWRlbnQpOworCXRwdHItPmRlc2NWZXJzaW9uID0gY3B1X3RvX2xlMTYodmVyc2lvbik7CisJdHB0ci0+dGFnU2VyaWFsTnVtID0gY3B1X3RvX2xlMTYoc251bSk7CisJdHB0ci0+dGFnTG9jYXRpb24gPSBjcHVfdG9fbGUzMihsb2MpOworCXVkZl91cGRhdGVfdGFnKGRhdGEsIGxlbmd0aCk7Cit9CmRpZmYgLS1naXQgYS9mcy91ZGYvbmFtZWkuYyBiL2ZzL3VkZi9uYW1laS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNmRjNzEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy91ZGYvbmFtZWkuYwpAQCAtMCwwICsxLDEzMzQgQEAKKy8qCisgKiBuYW1laS5jCisgKgorICogUFVSUE9TRQorICogICAgICBJbm9kZSBuYW1lIGhhbmRsaW5nIHJvdXRpbmVzIGZvciB0aGUgT1NUQS1VREYodG0pIGZpbGVzeXN0ZW0uCisgKgorICogQ09OVEFDVFMKKyAqICAgICAgRS1tYWlsIHJlZ2FyZGluZyBhbnkgcG9ydGlvbiBvZiB0aGUgTGludXggVURGIGZpbGUgc3lzdGVtIHNob3VsZCBiZQorICogICAgICBkaXJlY3RlZCB0byB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBtYWlsaW5nIGxpc3QgKHJ1biBieSBtYWpvcmRvbW8pOgorICogICAgICAgICAgICAgIGxpbnV4X3VkZkBocGVzanJvLmZjLmhwLmNvbQorICoKKyAqIENPUFlSSUdIVAorICogICAgICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgICAgTGljZW5zZSAoR1BMKS4gQ29waWVzIG9mIHRoZSBHUEwgY2FuIGJlIG9idGFpbmVkIGZyb206CisgKiAgICAgICAgICAgICAgZnRwOi8vcHJlcC5haS5taXQuZWR1L3B1Yi9nbnUvR1BMCisgKiAgICAgIEVhY2ggY29udHJpYnV0aW5nIGF1dGhvciByZXRhaW5zIGFsbCByaWdodHMgdG8gdGhlaXIgb3duIHdvcmsuCisgKgorICogIChDKSAxOTk4LTIwMDQgQmVuIEZlbm5lbWEKKyAqICAoQykgMTk5OS0yMDAwIFN0ZWxpYXMgQ29tcHV0aW5nIEluYworICoKKyAqIEhJU1RPUlkKKyAqCisgKiAgMTIvMTIvOTggYmxmICBDcmVhdGVkLiBTcGxpdCBvdXQgdGhlIGxvb2t1cCBjb2RlIGZyb20gZGlyLmMKKyAqICAwNC8xOS85OSBibGYgIGxpbmssIG1rbm9kLCBzeW1saW5rIHN1cHBvcnQKKyAqLworCisjaW5jbHVkZSAidWRmZGVjbC5oIgorCisjaW5jbHVkZSAidWRmX2kuaCIKKyNpbmNsdWRlICJ1ZGZfc2IuaCIKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorCitzdGF0aWMgaW5saW5lIGludCB1ZGZfbWF0Y2goaW50IGxlbjEsIGNvbnN0IGNoYXIgKm5hbWUxLCBpbnQgbGVuMiwgY29uc3QgY2hhciAqbmFtZTIpCit7CisJaWYgKGxlbjEgIT0gbGVuMikKKwkJcmV0dXJuIDA7CisJcmV0dXJuICFtZW1jbXAobmFtZTEsIG5hbWUyLCBsZW4xKTsKK30KKworaW50IHVkZl93cml0ZV9maShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZUlkZW50RGVzYyAqY2ZpLAorCXN0cnVjdCBmaWxlSWRlbnREZXNjICpzZmksIHN0cnVjdCB1ZGZfZmlsZWlkZW50X2JoICpmaWJoLAorCXVpbnQ4X3QgKmltcHVzZSwgdWludDhfdCAqZmlsZWlkZW50KQoreworCXVpbnQxNl90IGNyY2xlbiA9IGZpYmgtPmVvZmZzZXQgLSBmaWJoLT5zb2Zmc2V0IC0gc2l6ZW9mKHRhZyk7CisJdWludDE2X3QgY3JjOworCXVpbnQ4X3QgY2hlY2tzdW0gPSAwOworCWludCBpOworCWludCBvZmZzZXQ7CisJdWludDE2X3QgbGl1ID0gbGUxNl90b19jcHUoY2ZpLT5sZW5ndGhPZkltcFVzZSk7CisJdWludDhfdCBsZmkgPSBjZmktPmxlbmd0aEZpbGVJZGVudDsKKwlpbnQgcGFkbGVuID0gZmliaC0+ZW9mZnNldCAtIGZpYmgtPnNvZmZzZXQgLSBsaXUgLSBsZmkgLQorCQlzaXplb2Yoc3RydWN0IGZpbGVJZGVudERlc2MpOworCWludCBhZGluaWNiID0gMDsKKworCWlmIChVREZfSV9BTExPQ1RZUEUoaW5vZGUpID09IElDQlRBR19GTEFHX0FEX0lOX0lDQikKKwkJYWRpbmljYiA9IDE7CisKKwlvZmZzZXQgPSBmaWJoLT5zb2Zmc2V0ICsgc2l6ZW9mKHN0cnVjdCBmaWxlSWRlbnREZXNjKTsKKworCWlmIChpbXB1c2UpCisJeworCQlpZiAoYWRpbmljYiB8fCAob2Zmc2V0ICsgbGl1IDwgMCkpCisJCQltZW1jcHkoKHVpbnQ4X3QgKilzZmktPmltcFVzZSwgaW1wdXNlLCBsaXUpOworCQllbHNlIGlmIChvZmZzZXQgPj0gMCkKKwkJCW1lbWNweShmaWJoLT5lYmgtPmJfZGF0YSArIG9mZnNldCwgaW1wdXNlLCBsaXUpOworCQllbHNlCisJCXsKKwkJCW1lbWNweSgodWludDhfdCAqKXNmaS0+aW1wVXNlLCBpbXB1c2UsIC1vZmZzZXQpOworCQkJbWVtY3B5KGZpYmgtPmViaC0+Yl9kYXRhLCBpbXB1c2UgLSBvZmZzZXQsIGxpdSArIG9mZnNldCk7CisJCX0KKwl9CisKKwlvZmZzZXQgKz0gbGl1OworCisJaWYgKGZpbGVpZGVudCkKKwl7CisJCWlmIChhZGluaWNiIHx8IChvZmZzZXQgKyBsZmkgPCAwKSkKKwkJCW1lbWNweSgodWludDhfdCAqKXNmaS0+ZmlsZUlkZW50ICsgbGl1LCBmaWxlaWRlbnQsIGxmaSk7CisJCWVsc2UgaWYgKG9mZnNldCA+PSAwKQorCQkJbWVtY3B5KGZpYmgtPmViaC0+Yl9kYXRhICsgb2Zmc2V0LCBmaWxlaWRlbnQsIGxmaSk7CisJCWVsc2UKKwkJeworCQkJbWVtY3B5KCh1aW50OF90ICopc2ZpLT5maWxlSWRlbnQgKyBsaXUsIGZpbGVpZGVudCwgLW9mZnNldCk7CisJCQltZW1jcHkoZmliaC0+ZWJoLT5iX2RhdGEsIGZpbGVpZGVudCAtIG9mZnNldCwgbGZpICsgb2Zmc2V0KTsKKwkJfQorCX0KKworCW9mZnNldCArPSBsZmk7CisKKwlpZiAoYWRpbmljYiB8fCAob2Zmc2V0ICsgcGFkbGVuIDwgMCkpCisJCW1lbXNldCgodWludDhfdCAqKXNmaS0+cGFkZGluZyArIGxpdSArIGxmaSwgMHgwMCwgcGFkbGVuKTsKKwllbHNlIGlmIChvZmZzZXQgPj0gMCkKKwkJbWVtc2V0KGZpYmgtPmViaC0+Yl9kYXRhICsgb2Zmc2V0LCAweDAwLCBwYWRsZW4pOworCWVsc2UKKwl7CisJCW1lbXNldCgodWludDhfdCAqKXNmaS0+cGFkZGluZyArIGxpdSArIGxmaSwgMHgwMCwgLW9mZnNldCk7CisJCW1lbXNldChmaWJoLT5lYmgtPmJfZGF0YSwgMHgwMCwgcGFkbGVuICsgb2Zmc2V0KTsKKwl9CisKKwljcmMgPSB1ZGZfY3JjKCh1aW50OF90ICopY2ZpICsgc2l6ZW9mKHRhZyksIHNpemVvZihzdHJ1Y3QgZmlsZUlkZW50RGVzYykgLQorCQlzaXplb2YodGFnKSwgMCk7CisKKwlpZiAoZmliaC0+c2JoID09IGZpYmgtPmViaCkKKwkJY3JjID0gdWRmX2NyYygodWludDhfdCAqKXNmaS0+aW1wVXNlLAorCQkJY3JjbGVuICsgc2l6ZW9mKHRhZykgLSBzaXplb2Yoc3RydWN0IGZpbGVJZGVudERlc2MpLCBjcmMpOworCWVsc2UgaWYgKHNpemVvZihzdHJ1Y3QgZmlsZUlkZW50RGVzYykgPj0gLWZpYmgtPnNvZmZzZXQpCisJCWNyYyA9IHVkZl9jcmMoZmliaC0+ZWJoLT5iX2RhdGEgKyBzaXplb2Yoc3RydWN0IGZpbGVJZGVudERlc2MpICsgZmliaC0+c29mZnNldCwKKwkJCWNyY2xlbiArIHNpemVvZih0YWcpIC0gc2l6ZW9mKHN0cnVjdCBmaWxlSWRlbnREZXNjKSwgY3JjKTsKKwllbHNlCisJeworCQljcmMgPSB1ZGZfY3JjKCh1aW50OF90ICopc2ZpLT5pbXBVc2UsCisJCQktZmliaC0+c29mZnNldCAtIHNpemVvZihzdHJ1Y3QgZmlsZUlkZW50RGVzYyksIGNyYyk7CisJCWNyYyA9IHVkZl9jcmMoZmliaC0+ZWJoLT5iX2RhdGEsIGZpYmgtPmVvZmZzZXQsIGNyYyk7CisJfQorCisJY2ZpLT5kZXNjVGFnLmRlc2NDUkMgPSBjcHVfdG9fbGUxNihjcmMpOworCWNmaS0+ZGVzY1RhZy5kZXNjQ1JDTGVuZ3RoID0gY3B1X3RvX2xlMTYoY3JjbGVuKTsKKworCWZvciAoaT0wOyBpPDE2OyBpKyspCisJCWlmIChpICE9IDQpCisJCQljaGVja3N1bSArPSAoKHVpbnQ4X3QgKikmY2ZpLT5kZXNjVGFnKVtpXTsKKworCWNmaS0+ZGVzY1RhZy50YWdDaGVja3N1bSA9IGNoZWNrc3VtOworCWlmIChhZGluaWNiIHx8IChzaXplb2Yoc3RydWN0IGZpbGVJZGVudERlc2MpIDw9IC1maWJoLT5zb2Zmc2V0KSkKKwkJbWVtY3B5KCh1aW50OF90ICopc2ZpLCAodWludDhfdCAqKWNmaSwgc2l6ZW9mKHN0cnVjdCBmaWxlSWRlbnREZXNjKSk7CisJZWxzZQorCXsKKwkJbWVtY3B5KCh1aW50OF90ICopc2ZpLCAodWludDhfdCAqKWNmaSwgLWZpYmgtPnNvZmZzZXQpOworCQltZW1jcHkoZmliaC0+ZWJoLT5iX2RhdGEsICh1aW50OF90ICopY2ZpIC0gZmliaC0+c29mZnNldCwKKwkJCXNpemVvZihzdHJ1Y3QgZmlsZUlkZW50RGVzYykgKyBmaWJoLT5zb2Zmc2V0KTsKKwl9CisKKwlpZiAoYWRpbmljYikKKwkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJZWxzZQorCXsKKwkJaWYgKGZpYmgtPnNiaCAhPSBmaWJoLT5lYmgpCisJCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShmaWJoLT5lYmgsIGlub2RlKTsKKwkJbWFya19idWZmZXJfZGlydHlfaW5vZGUoZmliaC0+c2JoLCBpbm9kZSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVJZGVudERlc2MgKgordWRmX2ZpbmRfZW50cnkoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwlzdHJ1Y3QgdWRmX2ZpbGVpZGVudF9iaCAqZmliaCwKKwlzdHJ1Y3QgZmlsZUlkZW50RGVzYyAqY2ZpKQoreworCXN0cnVjdCBmaWxlSWRlbnREZXNjICpmaT1OVUxMOworCWxvZmZfdCBmX3BvczsKKwlpbnQgYmxvY2ssIGZsZW47CisJY2hhciBmbmFtZVtVREZfTkFNRV9MRU5dOworCWNoYXIgKm5hbWVwdHI7CisJdWludDhfdCBsZmk7CisJdWludDE2X3QgbGl1OworCWxvZmZfdCBzaXplID0gKHVkZl9leHQwX29mZnNldChkaXIpICsgZGlyLT5pX3NpemUpID4+IDI7CisJa2VybmVsX2xiX2FkZHIgYmxvYywgZWxvYzsKKwl1aW50MzJfdCBleHRvZmZzZXQsIGVsZW4sIG9mZnNldDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKworCWlmICghZGlyKQorCQlyZXR1cm4gTlVMTDsKKworCWZfcG9zID0gKHVkZl9leHQwX29mZnNldChkaXIpID4+IDIpOworCisJZmliaC0+c29mZnNldCA9IGZpYmgtPmVvZmZzZXQgPSAoZl9wb3MgJiAoKGRpci0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSA+PiAyKSkgPDwgMjsKKwlpZiAoVURGX0lfQUxMT0NUWVBFKGRpcikgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKQorCQlmaWJoLT5zYmggPSBmaWJoLT5lYmggPSBOVUxMOworCWVsc2UgaWYgKGlub2RlX2JtYXAoZGlyLCBmX3BvcyA+PiAoZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gMiksCisJCSZibG9jLCAmZXh0b2Zmc2V0LCAmZWxvYywgJmVsZW4sICZvZmZzZXQsICZiaCkgPT0gKEVYVF9SRUNPUkRFRF9BTExPQ0FURUQgPj4gMzApKQorCXsKKwkJb2Zmc2V0ID4+PSBkaXItPmlfc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJCWJsb2NrID0gdWRmX2dldF9sYl9wYmxvY2soZGlyLT5pX3NiLCBlbG9jLCBvZmZzZXQpOworCQlpZiAoKCsrb2Zmc2V0IDw8IGRpci0+aV9zYi0+c19ibG9ja3NpemVfYml0cykgPCBlbGVuKQorCQl7CisJCQlpZiAoVURGX0lfQUxMT0NUWVBFKGRpcikgPT0gSUNCVEFHX0ZMQUdfQURfU0hPUlQpCisJCQkJZXh0b2Zmc2V0IC09IHNpemVvZihzaG9ydF9hZCk7CisJCQllbHNlIGlmIChVREZfSV9BTExPQ1RZUEUoZGlyKSA9PSBJQ0JUQUdfRkxBR19BRF9MT05HKQorCQkJCWV4dG9mZnNldCAtPSBzaXplb2YobG9uZ19hZCk7CisJCX0KKwkJZWxzZQorCQkJb2Zmc2V0ID0gMDsKKworCQlpZiAoIShmaWJoLT5zYmggPSBmaWJoLT5lYmggPSB1ZGZfdHJlYWQoZGlyLT5pX3NiLCBibG9jaykpKQorCQl7CisJCQl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCWVsc2UKKwl7CisJCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwl3aGlsZSAoIChmX3BvcyA8IHNpemUpICkKKwl7CisJCWZpID0gdWRmX2ZpbGVpZGVudF9yZWFkKGRpciwgJmZfcG9zLCBmaWJoLCBjZmksICZibG9jLCAmZXh0b2Zmc2V0LCAmZWxvYywgJmVsZW4sICZvZmZzZXQsICZiaCk7CisKKwkJaWYgKCFmaSkKKwkJeworCQkJaWYgKGZpYmgtPnNiaCAhPSBmaWJoLT5lYmgpCisJCQkJdWRmX3JlbGVhc2VfZGF0YShmaWJoLT5lYmgpOworCQkJdWRmX3JlbGVhc2VfZGF0YShmaWJoLT5zYmgpOworCQkJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCWxpdSA9IGxlMTZfdG9fY3B1KGNmaS0+bGVuZ3RoT2ZJbXBVc2UpOworCQlsZmkgPSBjZmktPmxlbmd0aEZpbGVJZGVudDsKKworCQlpZiAoZmliaC0+c2JoID09IGZpYmgtPmViaCkKKwkJeworCQkJbmFtZXB0ciA9IGZpLT5maWxlSWRlbnQgKyBsaXU7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpbnQgcG9mZnNldDsJLyogVW5wYWRlZCBlbmRpbmcgb2Zmc2V0ICovCisKKwkJCXBvZmZzZXQgPSBmaWJoLT5zb2Zmc2V0ICsgc2l6ZW9mKHN0cnVjdCBmaWxlSWRlbnREZXNjKSArIGxpdSArIGxmaTsKKworCQkJaWYgKHBvZmZzZXQgPj0gbGZpKQorCQkJCW5hbWVwdHIgPSAodWludDhfdCAqKShmaWJoLT5lYmgtPmJfZGF0YSArIHBvZmZzZXQgLSBsZmkpOworCQkJZWxzZQorCQkJeworCQkJCW5hbWVwdHIgPSBmbmFtZTsKKwkJCQltZW1jcHkobmFtZXB0ciwgZmktPmZpbGVJZGVudCArIGxpdSwgbGZpIC0gcG9mZnNldCk7CisJCQkJbWVtY3B5KG5hbWVwdHIgKyBsZmkgLSBwb2Zmc2V0LCBmaWJoLT5lYmgtPmJfZGF0YSwgcG9mZnNldCk7CisJCQl9CisJCX0KKworCQlpZiAoIChjZmktPmZpbGVDaGFyYWN0ZXJpc3RpY3MgJiBGSURfRklMRV9DSEFSX0RFTEVURUQpICE9IDAgKQorCQl7CisJCQlpZiAoICFVREZfUVVFUllfRkxBRyhkaXItPmlfc2IsIFVERl9GTEFHX1VOREVMRVRFKSApCisJCQkJY29udGludWU7CisJCX0KKwkgICAgCisJCWlmICggKGNmaS0+ZmlsZUNoYXJhY3RlcmlzdGljcyAmIEZJRF9GSUxFX0NIQVJfSElEREVOKSAhPSAwICkKKwkJeworCQkJaWYgKCAhVURGX1FVRVJZX0ZMQUcoZGlyLT5pX3NiLCBVREZfRkxBR19VTkhJREUpICkKKwkJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghbGZpKQorCQkJY29udGludWU7CisKKwkJaWYgKChmbGVuID0gdWRmX2dldF9maWxlbmFtZShkaXItPmlfc2IsIG5hbWVwdHIsIGZuYW1lLCBsZmkpKSkKKwkJeworCQkJaWYgKHVkZl9tYXRjaChmbGVuLCBmbmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLCBkZW50cnktPmRfbmFtZS5uYW1lKSkKKwkJCXsKKwkJCQl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKwkJCQlyZXR1cm4gZmk7CisJCQl9CisJCX0KKwl9CisJaWYgKGZpYmgtPnNiaCAhPSBmaWJoLT5lYmgpCisJCXVkZl9yZWxlYXNlX2RhdGEoZmliaC0+ZWJoKTsKKwl1ZGZfcmVsZWFzZV9kYXRhKGZpYmgtPnNiaCk7CisJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiB1ZGZfbG9va3VwCisgKgorICogUFVSUE9TRQorICoJTG9vay11cCB0aGUgaW5vZGUgZm9yIGEgZ2l2ZW4gbmFtZS4KKyAqCisgKiBERVNDUklQVElPTgorICoJUmVxdWlyZWQgLSBsb29rdXBfZGVudHJ5KCkgd2lsbCByZXR1cm4gLUVOT1RESVIgaWYgdGhpcyByb3V0aW5lIGlzIG5vdAorICoJYXZhaWxhYmxlIGZvciBhIGRpcmVjdG9yeS4gVGhlIGZpbGVzeXN0ZW0gaXMgdXNlbGVzcyBpZiB0aGlzIHJvdXRpbmUgaXMKKyAqCW5vdCBhdmFpbGFibGUgZm9yIGF0IGxlYXN0IHRoZSBmaWxlc3lzdGVtJ3Mgcm9vdCBkaXJlY3RvcnkuCisgKgorICoJVGhpcyByb3V0aW5lIGlzIHBhc3NlZCBhbiBpbmNvbXBsZXRlIGRlbnRyeSAtIGl0IG11c3QgYmUgY29tcGxldGVkIGJ5CisgKgljYWxsaW5nIGRfYWRkKGRlbnRyeSwgaW5vZGUpLiBJZiB0aGUgbmFtZSBkb2VzIG5vdCBleGlzdCwgdGhlbiB0aGUKKyAqCXNwZWNpZmllZCBpbm9kZSBtdXN0IGJlIHNldCB0byBudWxsLiBBbiBlcnJvciBzaG91bGQgb25seSBiZSByZXR1cm5lZAorICoJd2hlbiB0aGUgbG9va3VwIGZhaWxzIGZvciBhIHJlYXNvbiBvdGhlciB0aGFuIHRoZSBuYW1lIG5vdCBleGlzdGluZy4KKyAqCU5vdGUgdGhhdCB0aGUgZGlyZWN0b3J5IGlub2RlIHNlbWFwaG9yZSBpcyBoZWxkIGR1cmluZyB0aGUgY2FsbC4KKyAqCisgKglSZWZlciB0byBsb29rdXBfZGVudHJ5KCkgaW4gZnMvbmFtZWkuYworICoJbG9va3VwX2RlbnRyeSgpIC0+IGxvb2t1cCgpIC0+IHJlYWxfbG9va3VwKCkgLT4gLgorICoKKyAqIFBSRS1DT05ESVRJT05TCisgKglkaXIJCQlQb2ludGVyIHRvIGlub2RlIG9mIHBhcmVudCBkaXJlY3RvcnkuCisgKglkZW50cnkJCQlQb2ludGVyIHRvIGRlbnRyeSB0byBjb21wbGV0ZS4KKyAqCW5kCQkJUG9pbnRlciB0byBsb29rdXAgbmFtZWlkYXRhCisgKgorICogUE9TVC1DT05ESVRJT05TCisgKgk8cmV0dXJuPgkJWmVybyBvbiBzdWNjZXNzLgorICoKKyAqIEhJU1RPUlkKKyAqCUp1bHkgMSwgMTk5NyAtIEFuZHJldyBFLiBNaWxlc2tpCisgKglXcml0dGVuLCB0ZXN0ZWQsIGFuZCByZWxlYXNlZC4KKyAqLworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqCit1ZGZfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOworCXN0cnVjdCBmaWxlSWRlbnREZXNjIGNmaSwgKmZpOworCXN0cnVjdCB1ZGZfZmlsZWlkZW50X2JoIGZpYmg7CisKKwlpZiAoZGVudHJ5LT5kX25hbWUubGVuID4gVURGX05BTUVfTEVOLTIpCisJCXJldHVybiBFUlJfUFRSKC1FTkFNRVRPT0xPTkcpOworCisJbG9ja19rZXJuZWwoKTsKKyNpZmRlZiBVREZfUkVDT1ZFUlkKKwkvKiB0ZW1wb3Jhcnkgc2hvcnRoYW5kIGZvciBzcGVjaWZ5aW5nIGZpbGVzIGJ5IGlub2RlIG51bWJlciAqLworCWlmICghc3RybmNtcChkZW50cnktPmRfbmFtZS5uYW1lLCAiLkI9IiwgMykgKQorCXsKKwkJa2VybmVsX2xiX2FkZHIgbGIgPSB7IDAsIHNpbXBsZV9zdHJ0b3VsKGRlbnRyeS0+ZF9uYW1lLm5hbWUrMywgTlVMTCwgMCkgfTsKKwkJaW5vZGUgPSB1ZGZfaWdldChkaXItPmlfc2IsIGxiKTsKKwkJaWYgKCFpbm9kZSkKKwkJeworCQkJdW5sb2NrX2tlcm5lbCgpOworCQkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CisJCX0KKwl9CisJZWxzZQorI2VuZGlmIC8qIFVERl9SRUNPVkVSWSAqLworCisJaWYgKChmaSA9IHVkZl9maW5kX2VudHJ5KGRpciwgZGVudHJ5LCAmZmliaCwgJmNmaSkpKQorCXsKKwkJaWYgKGZpYmguc2JoICE9IGZpYmguZWJoKQorCQkJdWRmX3JlbGVhc2VfZGF0YShmaWJoLmViaCk7CisJCXVkZl9yZWxlYXNlX2RhdGEoZmliaC5zYmgpOworCisJCWlub2RlID0gdWRmX2lnZXQoZGlyLT5pX3NiLCBsZWxiX3RvX2NwdShjZmkuaWNiLmV4dExvY2F0aW9uKSk7CisJCWlmICggIWlub2RlICkKKwkJeworCQkJdW5sb2NrX2tlcm5lbCgpOworCQkJcmV0dXJuIEVSUl9QVFIoLUVBQ0NFUyk7CisJCX0KKwl9CisJdW5sb2NrX2tlcm5lbCgpOworCWRfYWRkKGRlbnRyeSwgaW5vZGUpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVJZGVudERlc2MgKgordWRmX2FkZF9lbnRyeShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LAorCXN0cnVjdCB1ZGZfZmlsZWlkZW50X2JoICpmaWJoLAorCXN0cnVjdCBmaWxlSWRlbnREZXNjICpjZmksIGludCAqZXJyKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2I7CisJc3RydWN0IGZpbGVJZGVudERlc2MgKmZpPU5VTEw7CisJY2hhciBuYW1lW1VERl9OQU1FX0xFTl0sIGZuYW1lW1VERl9OQU1FX0xFTl07CisJaW50IG5hbWVsZW47CisJbG9mZl90IGZfcG9zOworCWludCBmbGVuOworCWNoYXIgKm5hbWVwdHI7CisJbG9mZl90IHNpemUgPSAodWRmX2V4dDBfb2Zmc2V0KGRpcikgKyBkaXItPmlfc2l6ZSkgPj4gMjsKKwlpbnQgbmZpZGxlbjsKKwl1aW50OF90IGxmaTsKKwl1aW50MTZfdCBsaXU7CisJaW50IGJsb2NrOworCWtlcm5lbF9sYl9hZGRyIGJsb2MsIGVsb2M7CisJdWludDMyX3QgZXh0b2Zmc2V0LCBlbGVuLCBvZmZzZXQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisKKwlzYiA9IGRpci0+aV9zYjsKKworCWlmIChkZW50cnkpCisJeworCQlpZiAoIWRlbnRyeS0+ZF9uYW1lLmxlbikKKwkJeworCQkJKmVyciA9IC1FSU5WQUw7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCWlmICggIShuYW1lbGVuID0gdWRmX3B1dF9maWxlbmFtZShzYiwgZGVudHJ5LT5kX25hbWUubmFtZSwgbmFtZSwgZGVudHJ5LT5kX25hbWUubGVuKSkpCisJCXsKKwkJCSplcnIgPSAtRU5BTUVUT09MT05HOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisJZWxzZQorCQluYW1lbGVuID0gMDsKKworCW5maWRsZW4gPSAoc2l6ZW9mKHN0cnVjdCBmaWxlSWRlbnREZXNjKSArIG5hbWVsZW4gKyAzKSAmIH4zOworCisJZl9wb3MgPSAodWRmX2V4dDBfb2Zmc2V0KGRpcikgPj4gMik7CisKKwlmaWJoLT5zb2Zmc2V0ID0gZmliaC0+ZW9mZnNldCA9IChmX3BvcyAmICgoZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpID4+IDIpKSA8PCAyOworCWlmIChVREZfSV9BTExPQ1RZUEUoZGlyKSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpCisJCWZpYmgtPnNiaCA9IGZpYmgtPmViaCA9IE5VTEw7CisJZWxzZSBpZiAoaW5vZGVfYm1hcChkaXIsIGZfcG9zID4+IChkaXItPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMgLSAyKSwKKwkJJmJsb2MsICZleHRvZmZzZXQsICZlbG9jLCAmZWxlbiwgJm9mZnNldCwgJmJoKSA9PSAoRVhUX1JFQ09SREVEX0FMTE9DQVRFRCA+PiAzMCkpCisJeworCQlvZmZzZXQgPj49IGRpci0+aV9zYi0+c19ibG9ja3NpemVfYml0czsKKwkJYmxvY2sgPSB1ZGZfZ2V0X2xiX3BibG9jayhkaXItPmlfc2IsIGVsb2MsIG9mZnNldCk7CisJCWlmICgoKytvZmZzZXQgPDwgZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSA8IGVsZW4pCisJCXsKKwkJCWlmIChVREZfSV9BTExPQ1RZUEUoZGlyKSA9PSBJQ0JUQUdfRkxBR19BRF9TSE9SVCkKKwkJCQlleHRvZmZzZXQgLT0gc2l6ZW9mKHNob3J0X2FkKTsKKwkJCWVsc2UgaWYgKFVERl9JX0FMTE9DVFlQRShkaXIpID09IElDQlRBR19GTEFHX0FEX0xPTkcpCisJCQkJZXh0b2Zmc2V0IC09IHNpemVvZihsb25nX2FkKTsKKwkJfQorCQllbHNlCisJCQlvZmZzZXQgPSAwOworCisJCWlmICghKGZpYmgtPnNiaCA9IGZpYmgtPmViaCA9IHVkZl90cmVhZChkaXItPmlfc2IsIGJsb2NrKSkpCisJCXsKKwkJCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCQkJKmVyciA9IC1FSU87CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCWJsb2NrID0gVURGX0lfTE9DQVRJT04oZGlyKS5sb2dpY2FsQmxvY2tOdW07CisKKwl9CisJZWxzZQorCXsKKwkJYmxvY2sgPSB1ZGZfZ2V0X2xiX3BibG9jayhkaXItPmlfc2IsIFVERl9JX0xPQ0FUSU9OKGRpciksIDApOworCQlmaWJoLT5zYmggPSBmaWJoLT5lYmggPSBOVUxMOworCQlmaWJoLT5zb2Zmc2V0ID0gZmliaC0+ZW9mZnNldCA9IHNiLT5zX2Jsb2Nrc2l6ZTsKKwkJZ290byBhZGQ7CisJfQorCisJd2hpbGUgKCAoZl9wb3MgPCBzaXplKSApCisJeworCQlmaSA9IHVkZl9maWxlaWRlbnRfcmVhZChkaXIsICZmX3BvcywgZmliaCwgY2ZpLCAmYmxvYywgJmV4dG9mZnNldCwgJmVsb2MsICZlbGVuLCAmb2Zmc2V0LCAmYmgpOworCisJCWlmICghZmkpCisJCXsKKwkJCWlmIChmaWJoLT5zYmggIT0gZmliaC0+ZWJoKQorCQkJCXVkZl9yZWxlYXNlX2RhdGEoZmliaC0+ZWJoKTsKKwkJCXVkZl9yZWxlYXNlX2RhdGEoZmliaC0+c2JoKTsKKwkJCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCQkJKmVyciA9IC1FSU87CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCWxpdSA9IGxlMTZfdG9fY3B1KGNmaS0+bGVuZ3RoT2ZJbXBVc2UpOworCQlsZmkgPSBjZmktPmxlbmd0aEZpbGVJZGVudDsKKworCQlpZiAoZmliaC0+c2JoID09IGZpYmgtPmViaCkKKwkJCW5hbWVwdHIgPSBmaS0+ZmlsZUlkZW50ICsgbGl1OworCQllbHNlCisJCXsKKwkJCWludCBwb2Zmc2V0OwkvKiBVbnBhZGVkIGVuZGluZyBvZmZzZXQgKi8KKworCQkJcG9mZnNldCA9IGZpYmgtPnNvZmZzZXQgKyBzaXplb2Yoc3RydWN0IGZpbGVJZGVudERlc2MpICsgbGl1ICsgbGZpOworCisJCQlpZiAocG9mZnNldCA+PSBsZmkpCisJCQkJbmFtZXB0ciA9IChjaGFyICopKGZpYmgtPmViaC0+Yl9kYXRhICsgcG9mZnNldCAtIGxmaSk7CisJCQllbHNlCisJCQl7CisJCQkJbmFtZXB0ciA9IGZuYW1lOworCQkJCW1lbWNweShuYW1lcHRyLCBmaS0+ZmlsZUlkZW50ICsgbGl1LCBsZmkgLSBwb2Zmc2V0KTsKKwkJCQltZW1jcHkobmFtZXB0ciArIGxmaSAtIHBvZmZzZXQsIGZpYmgtPmViaC0+Yl9kYXRhLCBwb2Zmc2V0KTsKKwkJCX0KKwkJfQorCisJCWlmICggKGNmaS0+ZmlsZUNoYXJhY3RlcmlzdGljcyAmIEZJRF9GSUxFX0NIQVJfREVMRVRFRCkgIT0gMCApCisJCXsKKwkJCWlmICgoKHNpemVvZihzdHJ1Y3QgZmlsZUlkZW50RGVzYykgKyBsaXUgKyBsZmkgKyAzKSAmIH4zKSA9PSBuZmlkbGVuKQorCQkJeworCQkJCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCQkJCWNmaS0+ZGVzY1RhZy50YWdTZXJpYWxOdW0gPSBjcHVfdG9fbGUxNigxKTsKKwkJCQljZmktPmZpbGVWZXJzaW9uTnVtID0gY3B1X3RvX2xlMTYoMSk7CisJCQkJY2ZpLT5maWxlQ2hhcmFjdGVyaXN0aWNzID0gMDsKKwkJCQljZmktPmxlbmd0aEZpbGVJZGVudCA9IG5hbWVsZW47CisJCQkJY2ZpLT5sZW5ndGhPZkltcFVzZSA9IGNwdV90b19sZTE2KDApOworCQkJCWlmICghdWRmX3dyaXRlX2ZpKGRpciwgY2ZpLCBmaSwgZmliaCwgTlVMTCwgbmFtZSkpCisJCQkJCXJldHVybiBmaTsKKwkJCQllbHNlCisJCQkJeworCQkJCQkqZXJyID0gLUVJTzsKKwkJCQkJcmV0dXJuIE5VTEw7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKCFsZmkgfHwgIWRlbnRyeSkKKwkJCWNvbnRpbnVlOworCisJCWlmICgoZmxlbiA9IHVkZl9nZXRfZmlsZW5hbWUoZGlyLT5pX3NiLCBuYW1lcHRyLCBmbmFtZSwgbGZpKSkgJiYKKwkJCXVkZl9tYXRjaChmbGVuLCBmbmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLCBkZW50cnktPmRfbmFtZS5uYW1lKSkKKwkJeworCQkJaWYgKGZpYmgtPnNiaCAhPSBmaWJoLT5lYmgpCisJCQkJdWRmX3JlbGVhc2VfZGF0YShmaWJoLT5lYmgpOworCQkJdWRmX3JlbGVhc2VfZGF0YShmaWJoLT5zYmgpOworCQkJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisJCQkqZXJyID0gLUVFWElTVDsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCithZGQ6CisJZl9wb3MgKz0gbmZpZGxlbjsKKworCWlmIChVREZfSV9BTExPQ1RZUEUoZGlyKSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IgJiYKKwkJc2ItPnNfYmxvY2tzaXplIC0gZmliaC0+ZW9mZnNldCA8IG5maWRsZW4pCisJeworCQl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKwkJYmggPSBOVUxMOworCQlmaWJoLT5zb2Zmc2V0IC09IHVkZl9leHQwX29mZnNldChkaXIpOworCQlmaWJoLT5lb2Zmc2V0IC09IHVkZl9leHQwX29mZnNldChkaXIpOworCQlmX3BvcyAtPSAodWRmX2V4dDBfb2Zmc2V0KGRpcikgPj4gMik7CisJCWlmIChmaWJoLT5zYmggIT0gZmliaC0+ZWJoKQorCQkJdWRmX3JlbGVhc2VfZGF0YShmaWJoLT5lYmgpOworCQl1ZGZfcmVsZWFzZV9kYXRhKGZpYmgtPnNiaCk7CisJCWlmICghKGZpYmgtPnNiaCA9IGZpYmgtPmViaCA9IHVkZl9leHBhbmRfZGlyX2FkaW5pY2IoZGlyLCAmYmxvY2ssIGVycikpKQorCQkJcmV0dXJuIE5VTEw7CisJCWJsb2MgPSBVREZfSV9MT0NBVElPTihkaXIpOworCQllbG9jLmxvZ2ljYWxCbG9ja051bSA9IGJsb2NrOworCQllbG9jLnBhcnRpdGlvblJlZmVyZW5jZU51bSA9IFVERl9JX0xPQ0FUSU9OKGRpcikucGFydGl0aW9uUmVmZXJlbmNlTnVtOworCQllbGVuID0gZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwkJZXh0b2Zmc2V0ID0gdWRmX2ZpbGVfZW50cnlfYWxsb2Nfb2Zmc2V0KGRpcik7CisJCWlmIChVREZfSV9BTExPQ1RZUEUoZGlyKSA9PSBJQ0JUQUdfRkxBR19BRF9TSE9SVCkKKwkJCWV4dG9mZnNldCArPSBzaXplb2Yoc2hvcnRfYWQpOworCQllbHNlIGlmIChVREZfSV9BTExPQ1RZUEUoZGlyKSA9PSBJQ0JUQUdfRkxBR19BRF9MT05HKQorCQkJZXh0b2Zmc2V0ICs9IHNpemVvZihsb25nX2FkKTsKKwl9CisKKwlpZiAoc2ItPnNfYmxvY2tzaXplIC0gZmliaC0+ZW9mZnNldCA+PSBuZmlkbGVuKQorCXsKKwkJZmliaC0+c29mZnNldCA9IGZpYmgtPmVvZmZzZXQ7CisJCWZpYmgtPmVvZmZzZXQgKz0gbmZpZGxlbjsKKwkJaWYgKGZpYmgtPnNiaCAhPSBmaWJoLT5lYmgpCisJCXsKKwkJCXVkZl9yZWxlYXNlX2RhdGEoZmliaC0+c2JoKTsKKwkJCWZpYmgtPnNiaCA9IGZpYmgtPmViaDsKKwkJfQorCisJCWlmIChVREZfSV9BTExPQ1RZUEUoZGlyKSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpCisJCXsKKwkJCWJsb2NrID0gVURGX0lfTE9DQVRJT04oZGlyKS5sb2dpY2FsQmxvY2tOdW07CisJCQlmaSA9IChzdHJ1Y3QgZmlsZUlkZW50RGVzYyAqKShVREZfSV9EQVRBKGRpcikgKyBmaWJoLT5zb2Zmc2V0IC0gdWRmX2V4dDBfb2Zmc2V0KGRpcikgKyBVREZfSV9MRU5FQVRUUihkaXIpKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWJsb2NrID0gZWxvYy5sb2dpY2FsQmxvY2tOdW0gKyAoKGVsZW4gLSAxKSA+PgorCQkJCWRpci0+aV9zYi0+c19ibG9ja3NpemVfYml0cyk7CisJCQlmaSA9IChzdHJ1Y3QgZmlsZUlkZW50RGVzYyAqKShmaWJoLT5zYmgtPmJfZGF0YSArIGZpYmgtPnNvZmZzZXQpOworCQl9CisJfQorCWVsc2UKKwl7CisJCWZpYmgtPnNvZmZzZXQgPSBmaWJoLT5lb2Zmc2V0IC0gc2ItPnNfYmxvY2tzaXplOworCQlmaWJoLT5lb2Zmc2V0ICs9IG5maWRsZW4gLSBzYi0+c19ibG9ja3NpemU7CisJCWlmIChmaWJoLT5zYmggIT0gZmliaC0+ZWJoKQorCQl7CisJCQl1ZGZfcmVsZWFzZV9kYXRhKGZpYmgtPnNiaCk7CisJCQlmaWJoLT5zYmggPSBmaWJoLT5lYmg7CisJCX0KKworCQlibG9jayA9IGVsb2MubG9naWNhbEJsb2NrTnVtICsgKChlbGVuIC0gMSkgPj4KKwkJCWRpci0+aV9zYi0+c19ibG9ja3NpemVfYml0cyk7CisKKwkJaWYgKCEoZmliaC0+ZWJoID0gdWRmX2JyZWFkKGRpciwgZl9wb3MgPj4gKGRpci0+aV9zYi0+c19ibG9ja3NpemVfYml0cyAtIDIpLCAxLCBlcnIpKSkKKwkJeworCQkJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisJCQl1ZGZfcmVsZWFzZV9kYXRhKGZpYmgtPnNiaCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCWlmICghKGZpYmgtPnNvZmZzZXQpKQorCQl7CisJCQlpZiAodWRmX25leHRfYWV4dChkaXIsICZibG9jLCAmZXh0b2Zmc2V0LCAmZWxvYywgJmVsZW4sICZiaCwgMSkgPT0KKwkJCQkoRVhUX1JFQ09SREVEX0FMTE9DQVRFRCA+PiAzMCkpCisJCQl7CisJCQkJYmxvY2sgPSBlbG9jLmxvZ2ljYWxCbG9ja051bSArICgoZWxlbiAtIDEpID4+CisJCQkJCWRpci0+aV9zYi0+c19ibG9ja3NpemVfYml0cyk7CisJCQl9CisJCQllbHNlCisJCQkJYmxvY2sgKys7CisKKwkJCXVkZl9yZWxlYXNlX2RhdGEoZmliaC0+c2JoKTsKKwkJCWZpYmgtPnNiaCA9IGZpYmgtPmViaDsKKwkJCWZpID0gKHN0cnVjdCBmaWxlSWRlbnREZXNjICopKGZpYmgtPnNiaC0+Yl9kYXRhKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWZpID0gKHN0cnVjdCBmaWxlSWRlbnREZXNjICopCisJCQkJKGZpYmgtPnNiaC0+Yl9kYXRhICsgc2ItPnNfYmxvY2tzaXplICsgZmliaC0+c29mZnNldCk7CisJCX0KKwl9CisKKwltZW1zZXQoY2ZpLCAwLCBzaXplb2Yoc3RydWN0IGZpbGVJZGVudERlc2MpKTsKKwlpZiAoVURGX1NCX1VERlJFVihzYikgPj0gMHgwMjAwKQorCQl1ZGZfbmV3X3RhZygoY2hhciAqKWNmaSwgVEFHX0lERU5UX0ZJRCwgMywgMSwgYmxvY2ssIHNpemVvZih0YWcpKTsKKwllbHNlCisJCXVkZl9uZXdfdGFnKChjaGFyICopY2ZpLCBUQUdfSURFTlRfRklELCAyLCAxLCBibG9jaywgc2l6ZW9mKHRhZykpOworCWNmaS0+ZmlsZVZlcnNpb25OdW0gPSBjcHVfdG9fbGUxNigxKTsKKwljZmktPmxlbmd0aEZpbGVJZGVudCA9IG5hbWVsZW47CisJY2ZpLT5sZW5ndGhPZkltcFVzZSA9IGNwdV90b19sZTE2KDApOworCWlmICghdWRmX3dyaXRlX2ZpKGRpciwgY2ZpLCBmaSwgZmliaCwgTlVMTCwgbmFtZSkpCisJeworCQl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKwkJZGlyLT5pX3NpemUgKz0gbmZpZGxlbjsKKwkJaWYgKFVERl9JX0FMTE9DVFlQRShkaXIpID09IElDQlRBR19GTEFHX0FEX0lOX0lDQikKKwkJCVVERl9JX0xFTkFMTE9DKGRpcikgKz0gbmZpZGxlbjsKKwkJbWFya19pbm9kZV9kaXJ0eShkaXIpOworCQlyZXR1cm4gZmk7CisJfQorCWVsc2UKKwl7CisJCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCQlpZiAoZmliaC0+c2JoICE9IGZpYmgtPmViaCkKKwkJCXVkZl9yZWxlYXNlX2RhdGEoZmliaC0+ZWJoKTsKKwkJdWRmX3JlbGVhc2VfZGF0YShmaWJoLT5zYmgpOworCQkqZXJyID0gLUVJTzsKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IHVkZl9kZWxldGVfZW50cnkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGVJZGVudERlc2MgKmZpLAorCXN0cnVjdCB1ZGZfZmlsZWlkZW50X2JoICpmaWJoLCBzdHJ1Y3QgZmlsZUlkZW50RGVzYyAqY2ZpKQoreworCWNmaS0+ZmlsZUNoYXJhY3RlcmlzdGljcyB8PSBGSURfRklMRV9DSEFSX0RFTEVURUQ7CisJaWYgKFVERl9RVUVSWV9GTEFHKGlub2RlLT5pX3NiLCBVREZfRkxBR19TVFJJQ1QpKQorCQltZW1zZXQoJihjZmktPmljYiksIDB4MDAsIHNpemVvZihsb25nX2FkKSk7CisJcmV0dXJuIHVkZl93cml0ZV9maShpbm9kZSwgY2ZpLCBmaSwgZmliaCwgTlVMTCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgdWRmX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IHVkZl9maWxlaWRlbnRfYmggZmliaDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBmaWxlSWRlbnREZXNjIGNmaSwgKmZpOworCWludCBlcnI7CisKKwlsb2NrX2tlcm5lbCgpOworCWlub2RlID0gdWRmX25ld19pbm9kZShkaXIsIG1vZGUsICZlcnIpOworCWlmICghaW5vZGUpCisJeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKFVERl9JX0FMTE9DVFlQRShpbm9kZSkgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKQorCQlpbm9kZS0+aV9kYXRhLmFfb3BzID0gJnVkZl9hZGluaWNiX2FvcHM7CisJZWxzZQorCQlpbm9kZS0+aV9kYXRhLmFfb3BzID0gJnVkZl9hb3BzOworCWlub2RlLT5pX29wID0gJnVkZl9maWxlX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfZm9wID0gJnVkZl9maWxlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisKKwlpZiAoIShmaSA9IHVkZl9hZGRfZW50cnkoZGlyLCBkZW50cnksICZmaWJoLCAmY2ZpLCAmZXJyKSkpCisJeworCQlpbm9kZS0+aV9ubGluayAtLTsKKwkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCWlwdXQoaW5vZGUpOworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiBlcnI7CisJfQorCWNmaS5pY2IuZXh0TGVuZ3RoID0gY3B1X3RvX2xlMzIoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKKwljZmkuaWNiLmV4dExvY2F0aW9uID0gY3B1X3RvX2xlbGIoVURGX0lfTE9DQVRJT04oaW5vZGUpKTsKKwkqKF9fbGUzMiAqKSgoc3RydWN0IGFsbG9jRGVzY0ltcFVzZSAqKWNmaS5pY2IuaW1wVXNlKS0+aW1wVXNlID0KKwkJY3B1X3RvX2xlMzIoVURGX0lfVU5JUVVFKGlub2RlKSAmIDB4MDAwMDAwMDBGRkZGRkZGRlVMKTsKKwl1ZGZfd3JpdGVfZmkoZGlyLCAmY2ZpLCBmaSwgJmZpYmgsIE5VTEwsIE5VTEwpOworCWlmIChVREZfSV9BTExPQ1RZUEUoZGlyKSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpCisJeworCQltYXJrX2lub2RlX2RpcnR5KGRpcik7CisJfQorCWlmIChmaWJoLnNiaCAhPSBmaWJoLmViaCkKKwkJdWRmX3JlbGVhc2VfZGF0YShmaWJoLmViaCk7CisJdWRmX3JlbGVhc2VfZGF0YShmaWJoLnNiaCk7CisJdW5sb2NrX2tlcm5lbCgpOworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdWRmX21rbm9kKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgaW50IG1vZGUsIGRldl90IHJkZXYpCit7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJc3RydWN0IHVkZl9maWxlaWRlbnRfYmggZmliaDsKKwlzdHJ1Y3QgZmlsZUlkZW50RGVzYyBjZmksICpmaTsKKwlpbnQgZXJyOworCisJaWYgKCFvbGRfdmFsaWRfZGV2KHJkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWxvY2tfa2VybmVsKCk7CisJZXJyID0gLUVJTzsKKwlpbm9kZSA9IHVkZl9uZXdfaW5vZGUoZGlyLCBtb2RlLCAmZXJyKTsKKwlpZiAoIWlub2RlKQorCQlnb3RvIG91dDsKKworCWlub2RlLT5pX3VpZCA9IGN1cnJlbnQtPmZzdWlkOworCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgbW9kZSwgcmRldik7CisJaWYgKCEoZmkgPSB1ZGZfYWRkX2VudHJ5KGRpciwgZGVudHJ5LCAmZmliaCwgJmNmaSwgJmVycikpKQorCXsKKwkJaW5vZGUtPmlfbmxpbmsgLS07CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQlpcHV0KGlub2RlKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gZXJyOworCX0KKwljZmkuaWNiLmV4dExlbmd0aCA9IGNwdV90b19sZTMyKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CisJY2ZpLmljYi5leHRMb2NhdGlvbiA9IGNwdV90b19sZWxiKFVERl9JX0xPQ0FUSU9OKGlub2RlKSk7CisJKihfX2xlMzIgKikoKHN0cnVjdCBhbGxvY0Rlc2NJbXBVc2UgKiljZmkuaWNiLmltcFVzZSktPmltcFVzZSA9CisJCWNwdV90b19sZTMyKFVERl9JX1VOSVFVRShpbm9kZSkgJiAweDAwMDAwMDAwRkZGRkZGRkZVTCk7CisJdWRmX3dyaXRlX2ZpKGRpciwgJmNmaSwgZmksICZmaWJoLCBOVUxMLCBOVUxMKTsKKwlpZiAoVURGX0lfQUxMT0NUWVBFKGRpcikgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKQorCXsKKwkJbWFya19pbm9kZV9kaXJ0eShkaXIpOworCX0KKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKworCWlmIChmaWJoLnNiaCAhPSBmaWJoLmViaCkKKwkJdWRmX3JlbGVhc2VfZGF0YShmaWJoLmViaCk7CisJdWRmX3JlbGVhc2VfZGF0YShmaWJoLnNiaCk7CisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwllcnIgPSAwOworb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHVkZl9ta2RpcihzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnksIGludCBtb2RlKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCXN0cnVjdCB1ZGZfZmlsZWlkZW50X2JoIGZpYmg7CisJc3RydWN0IGZpbGVJZGVudERlc2MgY2ZpLCAqZmk7CisJaW50IGVycjsKKworCWxvY2tfa2VybmVsKCk7CisJZXJyID0gLUVNTElOSzsKKwlpZiAoZGlyLT5pX25saW5rID49ICgyNTY8PHNpemVvZihkaXItPmlfbmxpbmspKS0xKQorCQlnb3RvIG91dDsKKworCWVyciA9IC1FSU87CisJaW5vZGUgPSB1ZGZfbmV3X2lub2RlKGRpciwgU19JRkRJUiwgJmVycik7CisJaWYgKCFpbm9kZSkKKwkJZ290byBvdXQ7CisKKwlpbm9kZS0+aV9vcCA9ICZ1ZGZfZGlyX2lub2RlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfZm9wID0gJnVkZl9kaXJfb3BlcmF0aW9uczsKKwlpZiAoIShmaSA9IHVkZl9hZGRfZW50cnkoaW5vZGUsIE5VTEwsICZmaWJoLCAmY2ZpLCAmZXJyKSkpCisJeworCQlpbm9kZS0+aV9ubGluay0tOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJaXB1dChpbm9kZSk7CisJCWdvdG8gb3V0OworCX0KKwlpbm9kZS0+aV9ubGluayA9IDI7CisJY2ZpLmljYi5leHRMZW5ndGggPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOworCWNmaS5pY2IuZXh0TG9jYXRpb24gPSBjcHVfdG9fbGVsYihVREZfSV9MT0NBVElPTihkaXIpKTsKKwkqKF9fbGUzMiAqKSgoc3RydWN0IGFsbG9jRGVzY0ltcFVzZSAqKWNmaS5pY2IuaW1wVXNlKS0+aW1wVXNlID0KKwkJY3B1X3RvX2xlMzIoVURGX0lfVU5JUVVFKGRpcikgJiAweDAwMDAwMDAwRkZGRkZGRkZVTCk7CisJY2ZpLmZpbGVDaGFyYWN0ZXJpc3RpY3MgPSBGSURfRklMRV9DSEFSX0RJUkVDVE9SWSB8IEZJRF9GSUxFX0NIQVJfUEFSRU5UOworCXVkZl93cml0ZV9maShpbm9kZSwgJmNmaSwgZmksICZmaWJoLCBOVUxMLCBOVUxMKTsKKwl1ZGZfcmVsZWFzZV9kYXRhKGZpYmguc2JoKTsKKwlpbm9kZS0+aV9tb2RlID0gU19JRkRJUiB8IG1vZGU7CisJaWYgKGRpci0+aV9tb2RlICYgU19JU0dJRCkKKwkJaW5vZGUtPmlfbW9kZSB8PSBTX0lTR0lEOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCisJaWYgKCEoZmkgPSB1ZGZfYWRkX2VudHJ5KGRpciwgZGVudHJ5LCAmZmliaCwgJmNmaSwgJmVycikpKQorCXsKKwkJaW5vZGUtPmlfbmxpbmsgPSAwOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJaXB1dChpbm9kZSk7CisJCWdvdG8gb3V0OworCX0KKwljZmkuaWNiLmV4dExlbmd0aCA9IGNwdV90b19sZTMyKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CisJY2ZpLmljYi5leHRMb2NhdGlvbiA9IGNwdV90b19sZWxiKFVERl9JX0xPQ0FUSU9OKGlub2RlKSk7CisJKihfX2xlMzIgKikoKHN0cnVjdCBhbGxvY0Rlc2NJbXBVc2UgKiljZmkuaWNiLmltcFVzZSktPmltcFVzZSA9CisJCWNwdV90b19sZTMyKFVERl9JX1VOSVFVRShpbm9kZSkgJiAweDAwMDAwMDAwRkZGRkZGRkZVTCk7CisJY2ZpLmZpbGVDaGFyYWN0ZXJpc3RpY3MgfD0gRklEX0ZJTEVfQ0hBUl9ESVJFQ1RPUlk7CisJdWRmX3dyaXRlX2ZpKGRpciwgJmNmaSwgZmksICZmaWJoLCBOVUxMLCBOVUxMKTsKKwlkaXItPmlfbmxpbmsrKzsKKwltYXJrX2lub2RlX2RpcnR5KGRpcik7CisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKwlpZiAoZmliaC5zYmggIT0gZmliaC5lYmgpCisJCXVkZl9yZWxlYXNlX2RhdGEoZmliaC5lYmgpOworCXVkZl9yZWxlYXNlX2RhdGEoZmliaC5zYmgpOworCWVyciA9IDA7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZW1wdHlfZGlyKHN0cnVjdCBpbm9kZSAqZGlyKQoreworCXN0cnVjdCBmaWxlSWRlbnREZXNjICpmaSwgY2ZpOworCXN0cnVjdCB1ZGZfZmlsZWlkZW50X2JoIGZpYmg7CisJbG9mZl90IGZfcG9zOworCWxvZmZfdCBzaXplID0gKHVkZl9leHQwX29mZnNldChkaXIpICsgZGlyLT5pX3NpemUpID4+IDI7CisJaW50IGJsb2NrOworCWtlcm5lbF9sYl9hZGRyIGJsb2MsIGVsb2M7CisJdWludDMyX3QgZXh0b2Zmc2V0LCBlbGVuLCBvZmZzZXQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisKKwlmX3BvcyA9ICh1ZGZfZXh0MF9vZmZzZXQoZGlyKSA+PiAyKTsKKworCWZpYmguc29mZnNldCA9IGZpYmguZW9mZnNldCA9IChmX3BvcyAmICgoZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpID4+IDIpKSA8PCAyOworCisJaWYgKFVERl9JX0FMTE9DVFlQRShkaXIpID09IElDQlRBR19GTEFHX0FEX0lOX0lDQikKKwkJZmliaC5zYmggPSBmaWJoLmViaCA9IE5VTEw7CisJZWxzZSBpZiAoaW5vZGVfYm1hcChkaXIsIGZfcG9zID4+IChkaXItPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMgLSAyKSwKKwkJJmJsb2MsICZleHRvZmZzZXQsICZlbG9jLCAmZWxlbiwgJm9mZnNldCwgJmJoKSA9PSAoRVhUX1JFQ09SREVEX0FMTE9DQVRFRCA+PiAzMCkpCisJeworCQlvZmZzZXQgPj49IGRpci0+aV9zYi0+c19ibG9ja3NpemVfYml0czsKKwkJYmxvY2sgPSB1ZGZfZ2V0X2xiX3BibG9jayhkaXItPmlfc2IsIGVsb2MsIG9mZnNldCk7CisJCWlmICgoKytvZmZzZXQgPDwgZGlyLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSA8IGVsZW4pCisJCXsKKwkJCWlmIChVREZfSV9BTExPQ1RZUEUoZGlyKSA9PSBJQ0JUQUdfRkxBR19BRF9TSE9SVCkKKwkJCQlleHRvZmZzZXQgLT0gc2l6ZW9mKHNob3J0X2FkKTsKKwkJCWVsc2UgaWYgKFVERl9JX0FMTE9DVFlQRShkaXIpID09IElDQlRBR19GTEFHX0FEX0xPTkcpCisJCQkJZXh0b2Zmc2V0IC09IHNpemVvZihsb25nX2FkKTsKKwkJfQorCQllbHNlCisJCQlvZmZzZXQgPSAwOworCisJCWlmICghKGZpYmguc2JoID0gZmliaC5lYmggPSB1ZGZfdHJlYWQoZGlyLT5pX3NiLCBibG9jaykpKQorCQl7CisJCQl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWVsc2UKKwl7CisJCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCQlyZXR1cm4gMDsKKwl9CisKKworCXdoaWxlICggKGZfcG9zIDwgc2l6ZSkgKQorCXsKKwkJZmkgPSB1ZGZfZmlsZWlkZW50X3JlYWQoZGlyLCAmZl9wb3MsICZmaWJoLCAmY2ZpLCAmYmxvYywgJmV4dG9mZnNldCwgJmVsb2MsICZlbGVuLCAmb2Zmc2V0LCAmYmgpOworCisJCWlmICghZmkpCisJCXsKKwkJCWlmIChmaWJoLnNiaCAhPSBmaWJoLmViaCkKKwkJCQl1ZGZfcmVsZWFzZV9kYXRhKGZpYmguZWJoKTsKKwkJCXVkZl9yZWxlYXNlX2RhdGEoZmliaC5zYmgpOworCQkJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmIChjZmkubGVuZ3RoRmlsZUlkZW50ICYmIChjZmkuZmlsZUNoYXJhY3RlcmlzdGljcyAmIEZJRF9GSUxFX0NIQVJfREVMRVRFRCkgPT0gMCkKKwkJeworCQkJaWYgKGZpYmguc2JoICE9IGZpYmguZWJoKQorCQkJCXVkZl9yZWxlYXNlX2RhdGEoZmliaC5lYmgpOworCQkJdWRmX3JlbGVhc2VfZGF0YShmaWJoLnNiaCk7CisJCQl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWlmIChmaWJoLnNiaCAhPSBmaWJoLmViaCkKKwkJdWRmX3JlbGVhc2VfZGF0YShmaWJoLmViaCk7CisJdWRmX3JlbGVhc2VfZGF0YShmaWJoLnNiaCk7CisJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdWRmX3JtZGlyKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqIGRlbnRyeSkKK3sKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCB1ZGZfZmlsZWlkZW50X2JoIGZpYmg7CisJc3RydWN0IGZpbGVJZGVudERlc2MgKmZpLCBjZmk7CisJa2VybmVsX2xiX2FkZHIgdGxvYzsKKworCXJldHZhbCA9IC1FTk9FTlQ7CisJbG9ja19rZXJuZWwoKTsKKwlmaSA9IHVkZl9maW5kX2VudHJ5KGRpciwgZGVudHJ5LCAmZmliaCwgJmNmaSk7CisJaWYgKCFmaSkKKwkJZ290byBvdXQ7CisKKwlyZXR2YWwgPSAtRUlPOworCXRsb2MgPSBsZWxiX3RvX2NwdShjZmkuaWNiLmV4dExvY2F0aW9uKTsKKwlpZiAodWRmX2dldF9sYl9wYmxvY2soZGlyLT5pX3NiLCB0bG9jLCAwKSAhPSBpbm9kZS0+aV9pbm8pCisJCWdvdG8gZW5kX3JtZGlyOworCXJldHZhbCA9IC1FTk9URU1QVFk7CisJaWYgKCFlbXB0eV9kaXIoaW5vZGUpKQorCQlnb3RvIGVuZF9ybWRpcjsKKwlyZXR2YWwgPSB1ZGZfZGVsZXRlX2VudHJ5KGRpciwgZmksICZmaWJoLCAmY2ZpKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVuZF9ybWRpcjsKKwlpZiAoaW5vZGUtPmlfbmxpbmsgIT0gMikKKwkJdWRmX3dhcm5pbmcoaW5vZGUtPmlfc2IsICJ1ZGZfcm1kaXIiLAorCQkJImVtcHR5IGRpcmVjdG9yeSBoYXMgbmxpbmsgIT0gMiAoJWQpIiwKKwkJCWlub2RlLT5pX25saW5rKTsKKwlpbm9kZS0+aV9ubGluayA9IDA7CisJaW5vZGUtPmlfc2l6ZSA9IDA7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJZGlyLT5pX25saW5rIC0tOworCWlub2RlLT5pX2N0aW1lID0gZGlyLT5pX2N0aW1lID0gZGlyLT5pX210aW1lID0gY3VycmVudF9mc190aW1lKGRpci0+aV9zYik7CisJbWFya19pbm9kZV9kaXJ0eShkaXIpOworCitlbmRfcm1kaXI6CisJaWYgKGZpYmguc2JoICE9IGZpYmguZWJoKQorCQl1ZGZfcmVsZWFzZV9kYXRhKGZpYmguZWJoKTsKKwl1ZGZfcmVsZWFzZV9kYXRhKGZpYmguc2JoKTsKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCB1ZGZfdW5saW5rKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqIGRlbnRyeSkKK3sKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXN0cnVjdCB1ZGZfZmlsZWlkZW50X2JoIGZpYmg7CisJc3RydWN0IGZpbGVJZGVudERlc2MgKmZpOworCXN0cnVjdCBmaWxlSWRlbnREZXNjIGNmaTsKKwlrZXJuZWxfbGJfYWRkciB0bG9jOworCisJcmV0dmFsID0gLUVOT0VOVDsKKwlsb2NrX2tlcm5lbCgpOworCWZpID0gdWRmX2ZpbmRfZW50cnkoZGlyLCBkZW50cnksICZmaWJoLCAmY2ZpKTsKKwlpZiAoIWZpKQorCQlnb3RvIG91dDsKKworCXJldHZhbCA9IC1FSU87CisJdGxvYyA9IGxlbGJfdG9fY3B1KGNmaS5pY2IuZXh0TG9jYXRpb24pOworCWlmICh1ZGZfZ2V0X2xiX3BibG9jayhkaXItPmlfc2IsIHRsb2MsIDApICE9IGlub2RlLT5pX2lubykKKwkJZ290byBlbmRfdW5saW5rOworCisJaWYgKCFpbm9kZS0+aV9ubGluaykKKwl7CisJCXVkZl9kZWJ1ZygiRGVsZXRpbmcgbm9uZXhpc3RlbnQgZmlsZSAoJWx1KSwgJWRcbiIsCisJCQlpbm9kZS0+aV9pbm8sIGlub2RlLT5pX25saW5rKTsKKwkJaW5vZGUtPmlfbmxpbmsgPSAxOworCX0KKwlyZXR2YWwgPSB1ZGZfZGVsZXRlX2VudHJ5KGRpciwgZmksICZmaWJoLCAmY2ZpKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVuZF91bmxpbms7CisJZGlyLT5pX2N0aW1lID0gZGlyLT5pX210aW1lID0gY3VycmVudF9mc190aW1lKGRpci0+aV9zYik7CisJbWFya19pbm9kZV9kaXJ0eShkaXIpOworCWlub2RlLT5pX25saW5rLS07CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJaW5vZGUtPmlfY3RpbWUgPSBkaXItPmlfY3RpbWU7CisJcmV0dmFsID0gMDsKKworZW5kX3VubGluazoKKwlpZiAoZmliaC5zYmggIT0gZmliaC5lYmgpCisJCXVkZl9yZWxlYXNlX2RhdGEoZmliaC5lYmgpOworCXVkZl9yZWxlYXNlX2RhdGEoZmliaC5zYmgpOworb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHVkZl9zeW1saW5rKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgY29uc3QgY2hhciAqIHN5bW5hbWUpCit7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJc3RydWN0IHBhdGhDb21wb25lbnQgKnBjOworCWNoYXIgKmNvbXBzdGFydDsKKwlzdHJ1Y3QgdWRmX2ZpbGVpZGVudF9iaCBmaWJoOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCWludCBlb2Zmc2V0LCBlbGVuID0gMDsKKwlzdHJ1Y3QgZmlsZUlkZW50RGVzYyAqZmk7CisJc3RydWN0IGZpbGVJZGVudERlc2MgY2ZpOworCWNoYXIgKmVhOworCWludCBlcnI7CisJaW50IGJsb2NrOworCWNoYXIgbmFtZVtVREZfTkFNRV9MRU5dOworCWludCBuYW1lbGVuOworCisJbG9ja19rZXJuZWwoKTsKKwlpZiAoIShpbm9kZSA9IHVkZl9uZXdfaW5vZGUoZGlyLCBTX0lGTE5LLCAmZXJyKSkpCisJCWdvdG8gb3V0OworCisJaW5vZGUtPmlfbW9kZSA9IFNfSUZMTksgfCBTX0lSV1hVR087CisJaW5vZGUtPmlfZGF0YS5hX29wcyA9ICZ1ZGZfc3ltbGlua19hb3BzOworCWlub2RlLT5pX29wID0gJnBhZ2Vfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOworCisJaWYgKFVERl9JX0FMTE9DVFlQRShpbm9kZSkgIT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKQorCXsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJCWtlcm5lbF9sYl9hZGRyIGJsb2MsIGVsb2M7CisJCXVpbnQzMl90IGVsZW4sIGV4dG9mZnNldDsKKworCQlibG9jayA9IHVkZl9uZXdfYmxvY2soaW5vZGUtPmlfc2IsIGlub2RlLAorCQkJVURGX0lfTE9DQVRJT04oaW5vZGUpLnBhcnRpdGlvblJlZmVyZW5jZU51bSwKKwkJCVVERl9JX0xPQ0FUSU9OKGlub2RlKS5sb2dpY2FsQmxvY2tOdW0sICZlcnIpOworCQlpZiAoIWJsb2NrKQorCQkJZ290byBvdXRfbm9fZW50cnk7CisJCWJsb2MgPSBVREZfSV9MT0NBVElPTihpbm9kZSk7CisJCWVsb2MubG9naWNhbEJsb2NrTnVtID0gYmxvY2s7CisJCWVsb2MucGFydGl0aW9uUmVmZXJlbmNlTnVtID0gVURGX0lfTE9DQVRJT04oaW5vZGUpLnBhcnRpdGlvblJlZmVyZW5jZU51bTsKKwkJZWxlbiA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwkJVURGX0lfTEVORVhURU5UUyhpbm9kZSkgPSBlbGVuOworCQlleHRvZmZzZXQgPSB1ZGZfZmlsZV9lbnRyeV9hbGxvY19vZmZzZXQoaW5vZGUpOworCQl1ZGZfYWRkX2FleHQoaW5vZGUsICZibG9jLCAmZXh0b2Zmc2V0LCBlbG9jLCBlbGVuLCAmYmgsIDApOworCQl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKworCQlibG9jayA9IHVkZl9nZXRfcGJsb2NrKGlub2RlLT5pX3NiLCBibG9jaywKKwkJCVVERl9JX0xPQ0FUSU9OKGlub2RlKS5wYXJ0aXRpb25SZWZlcmVuY2VOdW0sIDApOworCQliaCA9IHVkZl90cmVhZChpbm9kZS0+aV9zYiwgYmxvY2spOworCQlsb2NrX2J1ZmZlcihiaCk7CisJCW1lbXNldChiaC0+Yl9kYXRhLCAweDAwLCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOworCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJdW5sb2NrX2J1ZmZlcihiaCk7CisJCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKGJoLCBpbm9kZSk7CisJCWVhID0gYmgtPmJfZGF0YSArIHVkZl9leHQwX29mZnNldChpbm9kZSk7CisJfQorCWVsc2UKKwkJZWEgPSBVREZfSV9EQVRBKGlub2RlKSArIFVERl9JX0xFTkVBVFRSKGlub2RlKTsKKworCWVvZmZzZXQgPSBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSB1ZGZfZXh0MF9vZmZzZXQoaW5vZGUpOworCXBjID0gKHN0cnVjdCBwYXRoQ29tcG9uZW50ICopZWE7CisKKwlpZiAoKnN5bW5hbWUgPT0gJy8nKQorCXsKKwkJZG8KKwkJeworCQkJc3ltbmFtZSsrOworCQl9IHdoaWxlICgqc3ltbmFtZSA9PSAnLycpOworCisJCXBjLT5jb21wb25lbnRUeXBlID0gMTsKKwkJcGMtPmxlbmd0aENvbXBvbmVudElkZW50ID0gMDsKKwkJcGMtPmNvbXBvbmVudEZpbGVWZXJzaW9uTnVtID0gMDsKKwkJcGMgKz0gc2l6ZW9mKHN0cnVjdCBwYXRoQ29tcG9uZW50KTsKKwkJZWxlbiArPSBzaXplb2Yoc3RydWN0IHBhdGhDb21wb25lbnQpOworCX0KKworCWVyciA9IC1FTkFNRVRPT0xPTkc7CisKKwl3aGlsZSAoKnN5bW5hbWUpCisJeworCQlpZiAoZWxlbiArIHNpemVvZihzdHJ1Y3QgcGF0aENvbXBvbmVudCkgPiBlb2Zmc2V0KQorCQkJZ290byBvdXRfbm9fZW50cnk7CisKKwkJcGMgPSAoc3RydWN0IHBhdGhDb21wb25lbnQgKikoZWEgKyBlbGVuKTsKKworCQljb21wc3RhcnQgPSAoY2hhciAqKXN5bW5hbWU7CisKKwkJZG8KKwkJeworCQkJc3ltbmFtZSsrOworCQl9IHdoaWxlICgqc3ltbmFtZSAmJiAqc3ltbmFtZSAhPSAnLycpOworCisJCXBjLT5jb21wb25lbnRUeXBlID0gNTsKKwkJcGMtPmxlbmd0aENvbXBvbmVudElkZW50ID0gMDsKKwkJcGMtPmNvbXBvbmVudEZpbGVWZXJzaW9uTnVtID0gMDsKKwkJaWYgKGNvbXBzdGFydFswXSA9PSAnLicpCisJCXsKKwkJCWlmICgoc3ltbmFtZS1jb21wc3RhcnQpID09IDEpCisJCQkJcGMtPmNvbXBvbmVudFR5cGUgPSA0OworCQkJZWxzZSBpZiAoKHN5bW5hbWUtY29tcHN0YXJ0KSA9PSAyICYmIGNvbXBzdGFydFsxXSA9PSAnLicpCisJCQkJcGMtPmNvbXBvbmVudFR5cGUgPSAzOworCQl9CisKKwkJaWYgKHBjLT5jb21wb25lbnRUeXBlID09IDUpCisJCXsKKwkJCWlmICggIShuYW1lbGVuID0gdWRmX3B1dF9maWxlbmFtZShpbm9kZS0+aV9zYiwgY29tcHN0YXJ0LCBuYW1lLCBzeW1uYW1lLWNvbXBzdGFydCkpKQorCQkJCWdvdG8gb3V0X25vX2VudHJ5OworCisJCQlpZiAoZWxlbiArIHNpemVvZihzdHJ1Y3QgcGF0aENvbXBvbmVudCkgKyBuYW1lbGVuID4gZW9mZnNldCkKKwkJCQlnb3RvIG91dF9ub19lbnRyeTsKKwkJCWVsc2UKKwkJCQlwYy0+bGVuZ3RoQ29tcG9uZW50SWRlbnQgPSBuYW1lbGVuOworCisJCQltZW1jcHkocGMtPmNvbXBvbmVudElkZW50LCBuYW1lLCBuYW1lbGVuKTsKKwkJfQorCisJCWVsZW4gKz0gc2l6ZW9mKHN0cnVjdCBwYXRoQ29tcG9uZW50KSArIHBjLT5sZW5ndGhDb21wb25lbnRJZGVudDsKKworCQlpZiAoKnN5bW5hbWUpCisJCXsKKwkJCWRvCisJCQl7CisJCQkJc3ltbmFtZSsrOworCQkJfSB3aGlsZSAoKnN5bW5hbWUgPT0gJy8nKTsKKwkJfQorCX0KKworCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCWlub2RlLT5pX3NpemUgPSBlbGVuOworCWlmIChVREZfSV9BTExPQ1RZUEUoaW5vZGUpID09IElDQlRBR19GTEFHX0FEX0lOX0lDQikKKwkJVURGX0lfTEVOQUxMT0MoaW5vZGUpID0gaW5vZGUtPmlfc2l6ZTsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKworCWlmICghKGZpID0gdWRmX2FkZF9lbnRyeShkaXIsIGRlbnRyeSwgJmZpYmgsICZjZmksICZlcnIpKSkKKwkJZ290byBvdXRfbm9fZW50cnk7CisJY2ZpLmljYi5leHRMZW5ndGggPSBjcHVfdG9fbGUzMihpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpOworCWNmaS5pY2IuZXh0TG9jYXRpb24gPSBjcHVfdG9fbGVsYihVREZfSV9MT0NBVElPTihpbm9kZSkpOworCWlmIChVREZfU0JfTFZJREJIKGlub2RlLT5pX3NiKSkKKwl7CisJCXN0cnVjdCBsb2dpY2FsVm9sSGVhZGVyRGVzYyAqbHZoZDsKKwkJdWludDY0X3QgdW5pcXVlSUQ7CisJCWx2aGQgPSAoc3RydWN0IGxvZ2ljYWxWb2xIZWFkZXJEZXNjICopKFVERl9TQl9MVklEKGlub2RlLT5pX3NiKS0+bG9naWNhbFZvbENvbnRlbnRzVXNlKTsKKwkJdW5pcXVlSUQgPSBsZTY0X3RvX2NwdShsdmhkLT51bmlxdWVJRCk7CisJCSooX19sZTMyICopKChzdHJ1Y3QgYWxsb2NEZXNjSW1wVXNlICopY2ZpLmljYi5pbXBVc2UpLT5pbXBVc2UgPQorCQkJY3B1X3RvX2xlMzIodW5pcXVlSUQgJiAweDAwMDAwMDAwRkZGRkZGRkZVTCk7CisJCWlmICghKCsrdW5pcXVlSUQgJiAweDAwMDAwMDAwRkZGRkZGRkZVTCkpCisJCQl1bmlxdWVJRCArPSAxNjsKKwkJbHZoZC0+dW5pcXVlSUQgPSBjcHVfdG9fbGU2NCh1bmlxdWVJRCk7CisJCW1hcmtfYnVmZmVyX2RpcnR5KFVERl9TQl9MVklEQkgoaW5vZGUtPmlfc2IpKTsKKwl9CisJdWRmX3dyaXRlX2ZpKGRpciwgJmNmaSwgZmksICZmaWJoLCBOVUxMLCBOVUxMKTsKKwlpZiAoVURGX0lfQUxMT0NUWVBFKGRpcikgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKQorCXsKKwkJbWFya19pbm9kZV9kaXJ0eShkaXIpOworCX0KKwlpZiAoZmliaC5zYmggIT0gZmliaC5lYmgpCisJCXVkZl9yZWxlYXNlX2RhdGEoZmliaC5lYmgpOworCXVkZl9yZWxlYXNlX2RhdGEoZmliaC5zYmgpOworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJZXJyID0gMDsKKworb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyOworCitvdXRfbm9fZW50cnk6CisJaW5vZGUtPmlfbmxpbmstLTsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwlpcHV0KGlub2RlKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIGludCB1ZGZfbGluayhzdHJ1Y3QgZGVudHJ5ICogb2xkX2RlbnRyeSwgc3RydWN0IGlub2RlICogZGlyLAorCSBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IG9sZF9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHVkZl9maWxlaWRlbnRfYmggZmliaDsKKwlzdHJ1Y3QgZmlsZUlkZW50RGVzYyBjZmksICpmaTsKKwlpbnQgZXJyOworCisJbG9ja19rZXJuZWwoKTsKKwlpZiAoaW5vZGUtPmlfbmxpbmsgPj0gKDI1Njw8c2l6ZW9mKGlub2RlLT5pX25saW5rKSktMSkKKwl7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIC1FTUxJTks7CisJfQorCisJaWYgKCEoZmkgPSB1ZGZfYWRkX2VudHJ5KGRpciwgZGVudHJ5LCAmZmliaCwgJmNmaSwgJmVycikpKQorCXsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gZXJyOworCX0KKwljZmkuaWNiLmV4dExlbmd0aCA9IGNwdV90b19sZTMyKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSk7CisJY2ZpLmljYi5leHRMb2NhdGlvbiA9IGNwdV90b19sZWxiKFVERl9JX0xPQ0FUSU9OKGlub2RlKSk7CisJaWYgKFVERl9TQl9MVklEQkgoaW5vZGUtPmlfc2IpKQorCXsKKwkJc3RydWN0IGxvZ2ljYWxWb2xIZWFkZXJEZXNjICpsdmhkOworCQl1aW50NjRfdCB1bmlxdWVJRDsKKwkJbHZoZCA9IChzdHJ1Y3QgbG9naWNhbFZvbEhlYWRlckRlc2MgKikoVURGX1NCX0xWSUQoaW5vZGUtPmlfc2IpLT5sb2dpY2FsVm9sQ29udGVudHNVc2UpOworCQl1bmlxdWVJRCA9IGxlNjRfdG9fY3B1KGx2aGQtPnVuaXF1ZUlEKTsKKwkJKihfX2xlMzIgKikoKHN0cnVjdCBhbGxvY0Rlc2NJbXBVc2UgKiljZmkuaWNiLmltcFVzZSktPmltcFVzZSA9CisJCQljcHVfdG9fbGUzMih1bmlxdWVJRCAmIDB4MDAwMDAwMDBGRkZGRkZGRlVMKTsKKwkJaWYgKCEoKyt1bmlxdWVJRCAmIDB4MDAwMDAwMDBGRkZGRkZGRlVMKSkKKwkJCXVuaXF1ZUlEICs9IDE2OworCQlsdmhkLT51bmlxdWVJRCA9IGNwdV90b19sZTY0KHVuaXF1ZUlEKTsKKwkJbWFya19idWZmZXJfZGlydHkoVURGX1NCX0xWSURCSChpbm9kZS0+aV9zYikpOworCX0KKwl1ZGZfd3JpdGVfZmkoZGlyLCAmY2ZpLCBmaSwgJmZpYmgsIE5VTEwsIE5VTEwpOworCWlmIChVREZfSV9BTExPQ1RZUEUoZGlyKSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpCisJeworCQltYXJrX2lub2RlX2RpcnR5KGRpcik7CisJfQorCWlmIChmaWJoLnNiaCAhPSBmaWJoLmViaCkKKwkJdWRmX3JlbGVhc2VfZGF0YShmaWJoLmViaCk7CisJdWRmX3JlbGVhc2VfZGF0YShmaWJoLnNiaCk7CisJaW5vZGUtPmlfbmxpbmsgKys7CisJaW5vZGUtPmlfY3RpbWUgPSBjdXJyZW50X2ZzX3RpbWUoaW5vZGUtPmlfc2IpOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCWF0b21pY19pbmMoJmlub2RlLT5pX2NvdW50KTsKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKworLyogQW55Ym9keSBjYW4gcmVuYW1lIGFueXRoaW5nIHdpdGggdGhpczogdGhlIHBlcm1pc3Npb24gY2hlY2tzIGFyZSBsZWZ0IHRvIHRoZQorICogaGlnaGVyLWxldmVsIHJvdXRpbmVzLgorICovCitzdGF0aWMgaW50IHVkZl9yZW5hbWUgKHN0cnVjdCBpbm9kZSAqIG9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKiBvbGRfZGVudHJ5LAorCXN0cnVjdCBpbm9kZSAqIG5ld19kaXIsIHN0cnVjdCBkZW50cnkgKiBuZXdfZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqIG9sZF9pbm9kZSA9IG9sZF9kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGlub2RlICogbmV3X2lub2RlID0gbmV3X2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgdWRmX2ZpbGVpZGVudF9iaCBvZmliaCwgbmZpYmg7CisJc3RydWN0IGZpbGVJZGVudERlc2MgKm9maSA9IE5VTEwsICpuZmkgPSBOVUxMLCAqZGlyX2ZpID0gTlVMTCwgb2NmaSwgbmNmaTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpcl9iaCA9IE5VTEw7CisJaW50IHJldHZhbCA9IC1FTk9FTlQ7CisJa2VybmVsX2xiX2FkZHIgdGxvYzsKKworCWxvY2tfa2VybmVsKCk7CisJaWYgKChvZmkgPSB1ZGZfZmluZF9lbnRyeShvbGRfZGlyLCBvbGRfZGVudHJ5LCAmb2ZpYmgsICZvY2ZpKSkpCisJeworCQlpZiAob2ZpYmguc2JoICE9IG9maWJoLmViaCkKKwkJCXVkZl9yZWxlYXNlX2RhdGEob2ZpYmguZWJoKTsKKwkJdWRmX3JlbGVhc2VfZGF0YShvZmliaC5zYmgpOworCX0KKwl0bG9jID0gbGVsYl90b19jcHUob2NmaS5pY2IuZXh0TG9jYXRpb24pOworCWlmICghb2ZpIHx8IHVkZl9nZXRfbGJfcGJsb2NrKG9sZF9kaXItPmlfc2IsIHRsb2MsIDApCisJCQkJCSE9IG9sZF9pbm9kZS0+aV9pbm8pCisJCWdvdG8gZW5kX3JlbmFtZTsKKworCW5maSA9IHVkZl9maW5kX2VudHJ5KG5ld19kaXIsIG5ld19kZW50cnksICZuZmliaCwgJm5jZmkpOworCWlmIChuZmkpCisJeworCQlpZiAoIW5ld19pbm9kZSkKKwkJeworCQkJaWYgKG5maWJoLnNiaCAhPSBuZmliaC5lYmgpCisJCQkJdWRmX3JlbGVhc2VfZGF0YShuZmliaC5lYmgpOworCQkJdWRmX3JlbGVhc2VfZGF0YShuZmliaC5zYmgpOworCQkJbmZpID0gTlVMTDsKKwkJfQorCX0KKwlpZiAoU19JU0RJUihvbGRfaW5vZGUtPmlfbW9kZSkpCisJeworCQl1aW50MzJfdCBvZmZzZXQgPSB1ZGZfZXh0MF9vZmZzZXQob2xkX2lub2RlKTsKKworCQlpZiAobmV3X2lub2RlKQorCQl7CisJCQlyZXR2YWwgPSAtRU5PVEVNUFRZOworCQkJaWYgKCFlbXB0eV9kaXIobmV3X2lub2RlKSkKKwkJCQlnb3RvIGVuZF9yZW5hbWU7CisJCX0KKwkJcmV0dmFsID0gLUVJTzsKKwkJaWYgKFVERl9JX0FMTE9DVFlQRShvbGRfaW5vZGUpID09IElDQlRBR19GTEFHX0FEX0lOX0lDQikKKwkJeworCQkJZGlyX2ZpID0gdWRmX2dldF9maWxlaWRlbnQoVURGX0lfREFUQShvbGRfaW5vZGUpIC0KKwkJCQkoVURGX0lfRUZFKG9sZF9pbm9kZSkgPworCQkJCQlzaXplb2Yoc3RydWN0IGV4dGVuZGVkRmlsZUVudHJ5KSA6CisJCQkJCXNpemVvZihzdHJ1Y3QgZmlsZUVudHJ5KSksCisJCQkJb2xkX2lub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSwgJm9mZnNldCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlkaXJfYmggPSB1ZGZfYnJlYWQob2xkX2lub2RlLCAwLCAwLCAmcmV0dmFsKTsKKwkJCWlmICghZGlyX2JoKQorCQkJCWdvdG8gZW5kX3JlbmFtZTsKKwkJCWRpcl9maSA9IHVkZl9nZXRfZmlsZWlkZW50KGRpcl9iaC0+Yl9kYXRhLCBvbGRfaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplLCAmb2Zmc2V0KTsKKwkJfQorCQlpZiAoIWRpcl9maSkKKwkJCWdvdG8gZW5kX3JlbmFtZTsKKwkJdGxvYyA9IGxlbGJfdG9fY3B1KGRpcl9maS0+aWNiLmV4dExvY2F0aW9uKTsKKwkJaWYgKHVkZl9nZXRfbGJfcGJsb2NrKG9sZF9pbm9kZS0+aV9zYiwgdGxvYywgMCkKKwkJCQkJIT0gb2xkX2Rpci0+aV9pbm8pCisJCQlnb3RvIGVuZF9yZW5hbWU7CisKKwkJcmV0dmFsID0gLUVNTElOSzsKKwkJaWYgKCFuZXdfaW5vZGUgJiYgbmV3X2Rpci0+aV9ubGluayA+PSAoMjU2PDxzaXplb2YobmV3X2Rpci0+aV9ubGluaykpLTEpCisJCQlnb3RvIGVuZF9yZW5hbWU7CisJfQorCWlmICghbmZpKQorCXsKKwkJbmZpID0gdWRmX2FkZF9lbnRyeShuZXdfZGlyLCBuZXdfZGVudHJ5LCAmbmZpYmgsICZuY2ZpLCAmcmV0dmFsKTsKKwkJaWYgKCFuZmkpCisJCQlnb3RvIGVuZF9yZW5hbWU7CisJfQorCisJLyoKKwkgKiBMaWtlIG1vc3Qgb3RoZXIgVW5peCBzeXN0ZW1zLCBzZXQgdGhlIGN0aW1lIGZvciBpbm9kZXMgb24gYQorCSAqIHJlbmFtZS4KKwkgKi8KKwlvbGRfaW5vZGUtPmlfY3RpbWUgPSBjdXJyZW50X2ZzX3RpbWUob2xkX2lub2RlLT5pX3NiKTsKKwltYXJrX2lub2RlX2RpcnR5KG9sZF9pbm9kZSk7CisKKwkvKgorCSAqIG9rLCB0aGF0J3MgaXQKKwkgKi8KKwluY2ZpLmZpbGVWZXJzaW9uTnVtID0gb2NmaS5maWxlVmVyc2lvbk51bTsKKwluY2ZpLmZpbGVDaGFyYWN0ZXJpc3RpY3MgPSBvY2ZpLmZpbGVDaGFyYWN0ZXJpc3RpY3M7CisJbWVtY3B5KCYobmNmaS5pY2IpLCAmKG9jZmkuaWNiKSwgc2l6ZW9mKGxvbmdfYWQpKTsKKwl1ZGZfd3JpdGVfZmkobmV3X2RpciwgJm5jZmksIG5maSwgJm5maWJoLCBOVUxMLCBOVUxMKTsKKworCS8qIFRoZSBvbGQgZmlkIG1heSBoYXZlIG1vdmVkIC0gZmluZCBpdCBhZ2FpbiAqLworCW9maSA9IHVkZl9maW5kX2VudHJ5KG9sZF9kaXIsIG9sZF9kZW50cnksICZvZmliaCwgJm9jZmkpOworCXVkZl9kZWxldGVfZW50cnkob2xkX2Rpciwgb2ZpLCAmb2ZpYmgsICZvY2ZpKTsKKworCWlmIChuZXdfaW5vZGUpCisJeworCQluZXdfaW5vZGUtPmlfbmxpbmstLTsKKwkJbmV3X2lub2RlLT5pX2N0aW1lID0gY3VycmVudF9mc190aW1lKG5ld19pbm9kZS0+aV9zYik7CisJCW1hcmtfaW5vZGVfZGlydHkobmV3X2lub2RlKTsKKwl9CisJb2xkX2Rpci0+aV9jdGltZSA9IG9sZF9kaXItPmlfbXRpbWUgPSBjdXJyZW50X2ZzX3RpbWUob2xkX2Rpci0+aV9zYik7CisJbWFya19pbm9kZV9kaXJ0eShvbGRfZGlyKTsKKworCWlmIChkaXJfZmkpCisJeworCQlkaXJfZmktPmljYi5leHRMb2NhdGlvbiA9IGNwdV90b19sZWxiKFVERl9JX0xPQ0FUSU9OKG5ld19kaXIpKTsKKwkJdWRmX3VwZGF0ZV90YWcoKGNoYXIgKilkaXJfZmksIChzaXplb2Yoc3RydWN0IGZpbGVJZGVudERlc2MpICsKKwkJCWxlMTZfdG9fY3B1KGRpcl9maS0+bGVuZ3RoT2ZJbXBVc2UpICsgMykgJiB+Myk7CisJCWlmIChVREZfSV9BTExPQ1RZUEUob2xkX2lub2RlKSA9PSBJQ0JUQUdfRkxBR19BRF9JTl9JQ0IpCisJCXsKKwkJCW1hcmtfaW5vZGVfZGlydHkob2xkX2lub2RlKTsKKwkJfQorCQllbHNlCisJCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShkaXJfYmgsIG9sZF9pbm9kZSk7CisJCW9sZF9kaXItPmlfbmxpbmsgLS07CisJCW1hcmtfaW5vZGVfZGlydHkob2xkX2Rpcik7CisJCWlmIChuZXdfaW5vZGUpCisJCXsKKwkJCW5ld19pbm9kZS0+aV9ubGluayAtLTsKKwkJCW1hcmtfaW5vZGVfZGlydHkobmV3X2lub2RlKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCW5ld19kaXItPmlfbmxpbmsgKys7CisJCQltYXJrX2lub2RlX2RpcnR5KG5ld19kaXIpOworCQl9CisJfQorCisJaWYgKG9maSkKKwl7CisJCWlmIChvZmliaC5zYmggIT0gb2ZpYmguZWJoKQorCQkJdWRmX3JlbGVhc2VfZGF0YShvZmliaC5lYmgpOworCQl1ZGZfcmVsZWFzZV9kYXRhKG9maWJoLnNiaCk7CisJfQorCisJcmV0dmFsID0gMDsKKworZW5kX3JlbmFtZToKKwl1ZGZfcmVsZWFzZV9kYXRhKGRpcl9iaCk7CisJaWYgKG5maSkKKwl7CisJCWlmIChuZmliaC5zYmggIT0gbmZpYmguZWJoKQorCQkJdWRmX3JlbGVhc2VfZGF0YShuZmliaC5lYmgpOworCQl1ZGZfcmVsZWFzZV9kYXRhKG5maWJoLnNiaCk7CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyB1ZGZfZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLmxvb2t1cAkJCQk9IHVkZl9sb29rdXAsCisJLmNyZWF0ZQkJCQk9IHVkZl9jcmVhdGUsCisJLmxpbmsJCQkJPSB1ZGZfbGluaywKKwkudW5saW5rCQkJCT0gdWRmX3VubGluaywKKwkuc3ltbGluawkJCT0gdWRmX3N5bWxpbmssCisJLm1rZGlyCQkJCT0gdWRmX21rZGlyLAorCS5ybWRpcgkJCQk9IHVkZl9ybWRpciwKKwkubWtub2QJCQkJPSB1ZGZfbWtub2QsCisJLnJlbmFtZQkJCQk9IHVkZl9yZW5hbWUsCit9OwpkaWZmIC0tZ2l0IGEvZnMvdWRmL29zdGFfdWRmLmggYi9mcy91ZGYvb3N0YV91ZGYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODJhYWU2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvdWRmL29zdGFfdWRmLmgKQEAgLTAsMCArMSwyOTYgQEAKKy8qCisgKiBvc3RhX3VkZi5oCisgKgorICogVGhpcyBmaWxlIGlzIGJhc2VkIG9uIE9TVEEgVURGKHRtKSAyLjUwIChBcHJpbCAzMCwgMjAwMykKKyAqIGh0dHA6Ly93d3cub3N0YS5vcmcKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNCAgQmVuIEZlbm5lbWEgPGJmZW5uZW1hQGZhbGNvbi5jc2MuY2FscG9seS5lZHU+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMsIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIsCisgKiAgICB3aXRob3V0IG1vZGlmaWNhdGlvbi4KKyAqIDIuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIFB1YmxpYyBMaWNlbnNlICgiR1BMIikuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiZWNtYV8xNjcuaCIKKworI2lmbmRlZiBfT1NUQV9VREZfSAorI2RlZmluZSBfT1NUQV9VREZfSCAxCisKKy8qIE9TVEEgQ1MwIENoYXJzcGVjIChVREYgMi41MCAyLjEuMikgKi8KKyNkZWZpbmUgVURGX0NIQVJfU0VUX1RZUEUJCTAKKyNkZWZpbmUgVURGX0NIQVJfU0VUX0lORk8JCSJPU1RBIENvbXByZXNzZWQgVW5pY29kZSIKKworLyogRW50aXR5IElkZW50aWZpZXIgKFVERiAyLjUwIDIuMS41KSAqLworLyogSWRlbnRpZmllcnMgKFVERiAyLjUwIDIuMS41LjIpICovCisjZGVmaW5lIFVERl9JRF9ERVZFTE9QRVIJCSIqTGludXggVURGRlMiCisjZGVmaW5lCVVERl9JRF9DT01QTElBTlQJCSIqT1NUQSBVREYgQ29tcGxpYW50IgorI2RlZmluZSBVREZfSURfTFZfSU5GTwkJCSIqVURGIExWIEluZm8iCisjZGVmaW5lIFVERl9JRF9GUkVFX0VBCQkJIipVREYgRnJlZUVBU3BhY2UiCisjZGVmaW5lIFVERl9JRF9GUkVFX0FQUF9FQQkJIipVREYgRnJlZUFwcEVBU3BhY2UiCisjZGVmaW5lIFVERl9JRF9EVkRfQ0dNUwkJCSIqVURGIERWRCBDR01TIEluZm8iCisjZGVmaW5lIFVERl9JRF9PUzJfRUEJCQkiKlVERiBPUy8yIEVBIgorI2RlZmluZSBVREZfSURfT1MyX0VBX0xFTkdUSAkJIipVREYgT1MvMiBFQUxlbmd0aCIKKyNkZWZpbmUgVURGX0lEX01BQ19WT0xVTUUJCSIqVURGIE1hYyBWb2x1bWVJbmZvIgorI2RlZmluZSBVREZfSURfTUFDX0ZJTkRFUgkJIipVREYgTWFjIEZpbmRlckluZm8iCisjZGVmaW5lIFVERl9JRF9NQUNfVU5JUVVFCQkiKlVERiBNYWMgVW5pcXVlSURUYWJsZSIKKyNkZWZpbmUgVURGX0lEX01BQ19SRVNPVVJDRQkJIipVREYgTWFjIFJlc291cmNlRm9yayIKKyNkZWZpbmUgVURGX0lEX1ZJUlRVQUwJCQkiKlVERiBWaXJ0dWFsIFBhcnRpdGlvbiIKKyNkZWZpbmUgVURGX0lEX1NQQVJBQkxFCQkJIipVREYgU3BhcmFibGUgUGFydGl0aW9uIgorI2RlZmluZSBVREZfSURfQUxMT0MJCQkiKlVERiBWaXJ0dWFsIEFsbG9jIFRibCIKKyNkZWZpbmUgVURGX0lEX1NQQVJJTkcJCQkiKlVERiBTcGFyaW5nIFRhYmxlIgorI2RlZmluZSBVREZfSURfTUVUQURBVEEJCQkiKlVERiBNZXRhZGF0YSBQYXJ0aXRpb24iCisKKy8qIElkZW50aWZpZXIgU3VmZml4IChVREYgMi41MCAyLjEuNS4zKSAqLworI2RlZmluZSBJU19ERl9IQVJEX1dSSVRFX1BST1RFQ1QJMHgwMQorI2RlZmluZSBJU19ERl9TT0ZUX1dSSVRFX1BST1RFQ1QJMHgwMgorCitzdHJ1Y3QgVURGSWRlbnRTdWZmaXgKK3sKKwlfX2xlMTYJCVVERlJldmlzaW9uOworCXVpbnQ4X3QJCU9TQ2xhc3M7CisJdWludDhfdAkJT1NJZGVudGlmaWVyOworCXVpbnQ4X3QJCXJlc2VydmVkWzRdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBpbXBJZGVudFN1ZmZpeAoreworCXVpbnQ4X3QJCU9TQ2xhc3M7CisJdWludDhfdAkJT1NJZGVudGlmaWVyOworCXVpbnQ4X3QJCXJlc2VydmVkWzZdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK3N0cnVjdCBhcHBJZGVudFN1ZmZpeAoreworCXVpbnQ4X3QJCWltcFVzZVs4XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBMb2dpY2FsIFZvbHVtZSBJbnRlZ3JpdHkgRGVzY3JpcHRvciAoVURGIDIuNTAgMi4yLjYpICovCisvKiBJbXBsZW1lbnRhdGlvbiBVc2UgKFVERiAyLjUwIDIuMi42LjQpICovCitzdHJ1Y3QgbG9naWNhbFZvbEludGVncml0eURlc2NJbXBVc2UKK3sKKwlyZWdpZAkJaW1wSWRlbnQ7CisJX19sZTMyCQludW1GaWxlczsKKwlfX2xlMzIJCW51bURpcnM7CisJX19sZTE2CQltaW5VREZSZWFkUmV2OworCV9fbGUxNgkJbWluVURGV3JpdGVSZXY7CisJX19sZTE2CQltYXhVREZXcml0ZVJldjsKKwl1aW50OF90CQlpbXBVc2VbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogSW1wbGVtZW50YXRpb24gVXNlIFZvbHVtZSBEZXNjcmlwdG9yIChVREYgMi41MCAyLjIuNykgKi8KKy8qIEltcGxlbWVudGF0aW9uIFVzZSAoVURGIDIuNTAgMi4yLjcuMikgKi8KK3N0cnVjdCBpbXBVc2VWb2xEZXNjSW1wVXNlCit7CisJY2hhcnNwZWMJTFZJQ2hhcnNldDsKKwlkc3RyaW5nCQlsb2dpY2FsVm9sSWRlbnRbMTI4XTsKKwlkc3RyaW5nCQlMVkluZm8xWzM2XTsKKwlkc3RyaW5nCQlMVkluZm8yWzM2XTsKKwlkc3RyaW5nCQlMVkluZm8zWzM2XTsKKwlyZWdpZAkJaW1wSWRlbnQ7CisJdWludDhfdAkJaW1wVXNlWzEyOF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RydWN0IHVkZlBhcnRpdGlvbk1hcDIKK3sKKwl1aW50OF90CQlwYXJ0aXRpb25NYXBUeXBlOworCXVpbnQ4X3QJCXBhcnRpdGlvbk1hcExlbmd0aDsKKwl1aW50OF90CQlyZXNlcnZlZDFbMl07CisJcmVnaWQJCXBhcnRJZGVudDsKKwlfX2xlMTYJCXZvbFNlcU51bTsKKwlfX2xlMTYJCXBhcnRpdGlvbk51bTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBWaXJ0dWFsIFBhcnRpdGlvbiBNYXAgKFVERiAyLjUwIDIuMi44KSAqLworc3RydWN0IHZpcnR1YWxQYXJ0aXRpb25NYXAKK3sKKwl1aW50OF90CQlwYXJ0aXRpb25NYXBUeXBlOworCXVpbnQ4X3QJCXBhcnRpdGlvbk1hcExlbmd0aDsKKwl1aW50OF90CQlyZXNlcnZlZDFbMl07CisJcmVnaWQJCXBhcnRJZGVudDsKKwlfX2xlMTYJCXZvbFNlcU51bTsKKwlfX2xlMTYJCXBhcnRpdGlvbk51bTsKKwl1aW50OF90CQlyZXNlcnZlZDJbMjRdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFNwYXJhYmxlIFBhcnRpdGlvbiBNYXAgKFVERiAyLjUwIDIuMi45KSAqLworc3RydWN0IHNwYXJhYmxlUGFydGl0aW9uTWFwCit7CisJdWludDhfdAkJcGFydGl0aW9uTWFwVHlwZTsKKwl1aW50OF90CQlwYXJ0aXRpb25NYXBMZW5ndGg7CisJdWludDhfdAkJcmVzZXJ2ZWQxWzJdOworCXJlZ2lkCQlwYXJ0SWRlbnQ7CisJX19sZTE2CQl2b2xTZXFOdW07CisJX19sZTE2CQlwYXJ0aXRpb25OdW07CisJX19sZTE2CQlwYWNrZXRMZW5ndGg7CisJdWludDhfdAkJbnVtU3BhcmluZ1RhYmxlczsKKwl1aW50OF90CQlyZXNlcnZlZDJbMV07CisJX19sZTMyCQlzaXplU3BhcmluZ1RhYmxlOworCV9fbGUzMgkJbG9jU3BhcmluZ1RhYmxlWzRdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIE1ldGFkYXRhIFBhcnRpdGlvbiBNYXAgKFVERiAyLjQuMCAyLjIuMTApICovCitzdHJ1Y3QgbWV0YWRhdGFQYXJ0aXRpb25NYXAKK3sKKwl1aW50OF90CQlwYXJ0aXRpb25NYXBUeXBlOworCXVpbnQ4X3QJCXBhcnRpdGlvbk1hcExlbmd0aDsKKwl1aW50OF90CQlyZXNlcnZlZDFbMl07CisJcmVnaWQJCXBhcnRJZGVudDsKKwlfX2xlMTYJCXZvbFNlcU51bTsKKwlfX2xlMTYJCXBhcnRpdGlvbk51bTsKKwlfX2xlMzIJCW1ldGFkYXRhRmlsZUxvYzsKKwlfX2xlMzIJCW1ldGFkYXRhTWlycm9yRmlsZUxvYzsKKwlfX2xlMzIJCW1ldGFkYXRhQml0bWFwRmlsZUxvYzsKKwlfX2xlMzIJCWFsbG9jVW5pdFNpemU7CisJX19sZTE2CQlhbGlnblVuaXRTaXplOworCXVpbnQ4X3QJCWZsYWdzOworCXVpbnQ4X3QJCXJlc2VydmVkMls1XTsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCisvKiBWaXJ0dWFsIEFsbG9jYXRpb24gVGFibGUgKFVERiAxLjUgMi4yLjEwKSAqLworc3RydWN0IHZpcnR1YWxBbGxvY2F0aW9uVGFibGUxNQoreworCV9fbGUzMgkJVmlydHVhbFNlY3RvclswXTsKKwlyZWdpZAkJdmF0SWRlbnQ7CisJX19sZTMyCQlwcmV2aW91c1ZBVElDQkxvYzsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOyAgCisKKyNkZWZpbmUgSUNCVEFHX0ZJTEVfVFlQRV9WQVQxNQkJMHgwMFUKKworLyogVmlydHVhbCBBbGxvY2F0aW9uIFRhYmxlIChVREYgMi41MCAyLjIuMTEpICovCitzdHJ1Y3QgdmlydHVhbEFsbG9jYXRpb25UYWJsZTIwCit7CisJX19sZTE2CQlsZW5ndGhIZWFkZXI7CisJX19sZTE2CQlsZW5ndGhJbXBVc2U7CisJZHN0cmluZwkJbG9naWNhbFZvbElkZW50WzEyOF07CisJX19sZTMyCQlwcmV2aW91c1ZBVElDQkxvYzsKKwlfX2xlMzIJCW51bUZpbGVzOworCV9fbGUzMgkJbnVtRGlyczsKKwlfX2xlMTYJCW1pblJlYWRSZXZpc2lvbjsKKwlfX2xlMTYJCW1pbldyaXRlUmV2aXNpb247CisJX19sZTE2CQltYXhXcml0ZVJldmlzaW9uOworCV9fbGUxNgkJcmVzZXJ2ZWQ7CisJdWludDhfdAkJaW1wVXNlWzBdOworCV9fbGUzMgkJdmF0RW50cnlbMF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBJQ0JUQUdfRklMRV9UWVBFX1ZBVDIwCQkweEY4VQorCisvKiBTcGFyaW5nIFRhYmxlIChVREYgMi41MCAyLjIuMTIpICovCitzdHJ1Y3Qgc3BhcmluZ0VudHJ5Cit7CisJX19sZTMyCQlvcmlnTG9jYXRpb247CisJX19sZTMyCQltYXBwZWRMb2NhdGlvbjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdHJ1Y3Qgc3BhcmluZ1RhYmxlCit7CisJdGFnIAkJZGVzY1RhZzsKKwlyZWdpZAkJc3BhcmluZ0lkZW50OworCV9fbGUxNgkJcmVhbGxvY2F0aW9uVGFibGVMZW47CisJX19sZTE2CQlyZXNlcnZlZDsKKwlfX2xlMzIJCXNlcXVlbmNlTnVtOworCXN0cnVjdCBzcGFyaW5nRW50cnkKKwkJCW1hcEVudHJ5WzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIE1ldGFkYXRhIEZpbGUgKGFuZCBNZXRhZGF0YSBNaXJyb3IgRmlsZSkgKFVERiAyLjUwIDIuMi4xMy4xKSAqLworI2RlZmluZSBJQ0JUQUdfRklMRV9UWVBFX01BSU4JCTB4RkEKKyNkZWZpbmUgSUNCVEFHX0ZJTEVfVFlQRV9NSVJST1IJCTB4RkIKKyNkZWZpbmUgSUNCVEFHX0ZJTEVfVFlQRV9CSVRNQVAJCTB4RkMKKworLyogc3RydWN0IGxvbmdfYWQgSUNCIC0gQURJbXBVc2UgKFVERiAyLjUwIDIuMi40LjMpICovCitzdHJ1Y3QgYWxsb2NEZXNjSW1wVXNlCit7CisJX19sZTE2CQlmbGFnczsKKwl1aW50OF90CQlpbXBVc2VbNF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworI2RlZmluZSBBRF9JVV9FWFRfRVJBU0VECQkweDAwMDEKKworLyogUmVhbC1UaW1lIEZpbGVzIChVREYgMi41MCA2LjExKSAqLworI2RlZmluZSBJQ0JUQUdfRklMRV9UWVBFX1JFQUxUSU1FCTB4RjlVCisKKy8qIEltcGxlbWVudGF0aW9uIFVzZSBFeHRlbmRlZCBBdHRyaWJ1dGUgKFVERiAyLjUwIDMuMy40LjUpICovCisvKiBGcmVlRUFTcGFjZSAoVURGIDIuNTAgMy4zLjQuNS4xLjEpICovCitzdHJ1Y3QgZnJlZUVhU3BhY2UKK3sKKwlfX2xlMTYJCWhlYWRlckNoZWNrc3VtOworCXVpbnQ4X3QJCWZyZWVFQVNwYWNlWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIERWRCBDb3B5cmlnaHQgTWFuYWdlbWVudCBJbmZvcm1hdGlvbiAoVURGIDIuNTAgMy4zLjQuNS4xLjIpICovCitzdHJ1Y3QgRFZEQ29weXJpZ2h0SW1wVXNlIAoreworCV9fbGUxNgkJaGVhZGVyQ2hlY2tzdW07CisJdWludDhfdAkJQ0dNU0luZm87CisJdWludDhfdAkJZGF0YVR5cGU7CisJdWludDhfdAkJcHJvdGVjdGlvblN5c3RlbUluZm9bNF07Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogQXBwbGljYXRpb24gVXNlIEV4dGVuZGVkIEF0dHJpYnV0ZSAoVURGIDIuNTAgMy4zLjQuNikgKi8KKy8qIEZyZWVBcHBFQVNwYWNlIChVREYgMi41MCAzLjMuNC42LjEpICovCitzdHJ1Y3QgZnJlZUFwcEVBU3BhY2UKK3sKKwlfX2xlMTYJCWhlYWRlckNoZWNrc3VtOworCXVpbnQ4X3QJCWZyZWVFQVNwYWNlWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKKy8qIFVERiBEZWZpbmVkIFN5c3RlbSBTdHJlYW0gKFVERiAyLjUwIDMuMy43KSAqLworI2RlZmluZSBVREZfSURfVU5JUVVFX0lECQkiKlVERiBVbmlxdWUgSUQgTWFwcGluZyBEYXRhIgorI2RlZmluZSBVREZfSURfTk9OX0FMTE9DCQkiKlVERiBOb24tQWxsb2NhdGFibGUgU3BhY2UiCisjZGVmaW5lIFVERl9JRF9QT1dFUl9DQUwJCSIqVURGIFBvd2VyIENhbCBUYWJsZSIKKyNkZWZpbmUgVURGX0lEX0JBQ0tVUAkJCSIqVURGIEJhY2t1cCIKKworLyogT3BlcmF0aW5nIFN5c3RlbSBJZGVudGlmaWVycyAoVURGIDIuNTAgNi4zKSAqLworI2RlZmluZSBVREZfT1NfQ0xBU1NfVU5ERUYJCTB4MDBVCisjZGVmaW5lIFVERl9PU19DTEFTU19ET1MJCTB4MDFVCisjZGVmaW5lIFVERl9PU19DTEFTU19PUzIJCTB4MDJVCisjZGVmaW5lIFVERl9PU19DTEFTU19NQUMJCTB4MDNVCisjZGVmaW5lIFVERl9PU19DTEFTU19VTklYCQkweDA0VQorI2RlZmluZSBVREZfT1NfQ0xBU1NfV0lOOVgJCTB4MDVVCisjZGVmaW5lIFVERl9PU19DTEFTU19XSU5OVAkJMHgwNlUKKyNkZWZpbmUgVURGX09TX0NMQVNTX09TNDAwCQkweDA3VQorI2RlZmluZSBVREZfT1NfQ0xBU1NfQkVPUwkJMHgwOFUKKyNkZWZpbmUgVURGX09TX0NMQVNTX1dJTkNFCQkweDA5VQorCisjZGVmaW5lIFVERl9PU19JRF9VTkRFRgkJCTB4MDBVCisjZGVmaW5lIFVERl9PU19JRF9ET1MJCQkweDAwVQorI2RlZmluZSBVREZfT1NfSURfT1MyCQkJMHgwMFUKKyNkZWZpbmUgVURGX09TX0lEX01BQwkJCTB4MDBVCisjZGVmaW5lIFVERl9PU19JRF9NQVhfT1NYCQkweDAxVQorI2RlZmluZSBVREZfT1NfSURfVU5JWAkJCTB4MDBVCisjZGVmaW5lIFVERl9PU19JRF9BSVgJCQkweDAxVQorI2RlZmluZSBVREZfT1NfSURfU09MQVJJUwkJMHgwMlUKKyNkZWZpbmUgVURGX09TX0lEX0hQVVgJCQkweDAzVQorI2RlZmluZSBVREZfT1NfSURfSVJJWAkJCTB4MDRVCisjZGVmaW5lIFVERl9PU19JRF9MSU5VWAkJCTB4MDVVCisjZGVmaW5lIFVERl9PU19JRF9NS0xJTlVYCQkweDA2VQorI2RlZmluZSBVREZfT1NfSURfRlJFRUJTRAkJMHgwN1UKKyNkZWZpbmUgVURGX09TX0lEX1dJTjlYCQkJMHgwMFUKKyNkZWZpbmUgVURGX09TX0lEX1dJTk5UCQkJMHgwMFUKKyNkZWZpbmUgVURGX09TX0lEX09TNDAwCQkJMHgwMFUKKyNkZWZpbmUgVURGX09TX0lEX0JFT1MJCQkweDAwVQorI2RlZmluZSBVREZfT1NfSURfV0lOQ0UJCQkweDAwVQorCisjZW5kaWYgLyogX09TVEFfVURGX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL3VkZi9wYXJ0aXRpb24uYyBiL2ZzL3VkZi9wYXJ0aXRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDM2ZjI2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvdWRmL3BhcnRpdGlvbi5jCkBAIC0wLDAgKzEsMjI2IEBACisvKgorICogcGFydGl0aW9uLmMKKyAqCisgKiBQVVJQT1NFCisgKiAgICAgIFBhcnRpdGlvbiBoYW5kbGluZyByb3V0aW5lcyBmb3IgdGhlIE9TVEEtVURGKHRtKSBmaWxlc3lzdGVtLgorICoKKyAqIENPTlRBQ1RTCisgKiAgICAgIEUtbWFpbCByZWdhcmRpbmcgYW55IHBvcnRpb24gb2YgdGhlIExpbnV4IFVERiBmaWxlIHN5c3RlbSBzaG91bGQgYmUKKyAqICAgICAgZGlyZWN0ZWQgdG8gdGhlIGRldmVsb3BtZW50IHRlYW0gbWFpbGluZyBsaXN0IChydW4gYnkgbWFqb3Jkb21vKToKKyAqICAgICAgICAgICAgICBsaW51eF91ZGZAaHBlc2pyby5mYy5ocC5jb20KKyAqCisgKiBDT1BZUklHSFQKKyAqICAgICAgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICAgIExpY2Vuc2UgKEdQTCkuIENvcGllcyBvZiB0aGUgR1BMIGNhbiBiZSBvYnRhaW5lZCBmcm9tOgorICogICAgICAgICAgICAgIGZ0cDovL3ByZXAuYWkubWl0LmVkdS9wdWIvZ251L0dQTAorICogICAgICBFYWNoIGNvbnRyaWJ1dGluZyBhdXRob3IgcmV0YWlucyBhbGwgcmlnaHRzIHRvIHRoZWlyIG93biB3b3JrLgorICoKKyAqICAoQykgMTk5OC0yMDAxIEJlbiBGZW5uZW1hCisgKgorICogSElTVE9SWQorICoKKyAqIDEyLzA2Lzk4IGJsZiAgQ3JlYXRlZCBmaWxlLiAKKyAqCisgKi8KKworI2luY2x1ZGUgInVkZmRlY2wuaCIKKyNpbmNsdWRlICJ1ZGZfc2IuaCIKKyNpbmNsdWRlICJ1ZGZfaS5oIgorCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC91ZGZfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKworaW5saW5lIHVpbnQzMl90IHVkZl9nZXRfcGJsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVpbnQzMl90IGJsb2NrLCB1aW50MTZfdCBwYXJ0aXRpb24sIHVpbnQzMl90IG9mZnNldCkKK3sKKwlpZiAocGFydGl0aW9uID49IFVERl9TQl9OVU1QQVJUUyhzYikpCisJeworCQl1ZGZfZGVidWcoImJsb2NrPSVkLCBwYXJ0aXRpb249JWQsIG9mZnNldD0lZDogaW52YWxpZCBwYXJ0aXRpb25cbiIsCisJCQlibG9jaywgcGFydGl0aW9uLCBvZmZzZXQpOworCQlyZXR1cm4gMHhGRkZGRkZGRjsKKwl9CisJaWYgKFVERl9TQl9QQVJURlVOQyhzYiwgcGFydGl0aW9uKSkKKwkJcmV0dXJuIFVERl9TQl9QQVJURlVOQyhzYiwgcGFydGl0aW9uKShzYiwgYmxvY2ssIHBhcnRpdGlvbiwgb2Zmc2V0KTsKKwllbHNlCisJCXJldHVybiBVREZfU0JfUEFSVFJPT1Qoc2IsIHBhcnRpdGlvbikgKyBibG9jayArIG9mZnNldDsKK30KKwordWludDMyX3QgdWRmX2dldF9wYmxvY2tfdmlydDE1KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHVpbnQzMl90IGJsb2NrLCB1aW50MTZfdCBwYXJ0aXRpb24sIHVpbnQzMl90IG9mZnNldCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwl1aW50MzJfdCBuZXdibG9jazsKKwl1aW50MzJfdCBpbmRleDsKKwl1aW50MzJfdCBsb2M7CisKKwlpbmRleCA9IChzYi0+c19ibG9ja3NpemUgLSBVREZfU0JfVFlQRVZJUlQoc2IscGFydGl0aW9uKS5zX3N0YXJ0X29mZnNldCkgLyBzaXplb2YodWludDMyX3QpOworCisJaWYgKGJsb2NrID4gVURGX1NCX1RZUEVWSVJUKHNiLHBhcnRpdGlvbikuc19udW1fZW50cmllcykKKwl7CisJCXVkZl9kZWJ1ZygiVHJ5aW5nIHRvIGFjY2VzcyBibG9jayBiZXlvbmQgZW5kIG9mIFZBVCAoJWQgbWF4ICVkKVxuIiwKKwkJCWJsb2NrLCBVREZfU0JfVFlQRVZJUlQoc2IscGFydGl0aW9uKS5zX251bV9lbnRyaWVzKTsKKwkJcmV0dXJuIDB4RkZGRkZGRkY7CisJfQorCisJaWYgKGJsb2NrID49IGluZGV4KQorCXsKKwkJYmxvY2sgLT0gaW5kZXg7CisJCW5ld2Jsb2NrID0gMSArIChibG9jayAvIChzYi0+c19ibG9ja3NpemUgLyBzaXplb2YodWludDMyX3QpKSk7CisJCWluZGV4ID0gYmxvY2sgJSAoc2ItPnNfYmxvY2tzaXplIC8gc2l6ZW9mKHVpbnQzMl90KSk7CisJfQorCWVsc2UKKwl7CisJCW5ld2Jsb2NrID0gMDsKKwkJaW5kZXggPSBVREZfU0JfVFlQRVZJUlQoc2IscGFydGl0aW9uKS5zX3N0YXJ0X29mZnNldCAvIHNpemVvZih1aW50MzJfdCkgKyBibG9jazsKKwl9CisKKwlsb2MgPSB1ZGZfYmxvY2tfbWFwKFVERl9TQl9WQVQoc2IpLCBuZXdibG9jayk7CisKKwlpZiAoIShiaCA9IHNiX2JyZWFkKHNiLCBsb2MpKSkKKwl7CisJCXVkZl9kZWJ1ZygiZ2V0X3BibG9jayhVREZfVklSVFVBTF9NQVA6JXAsJWQsJWQpIFZBVDogJWRbJWRdXG4iLAorCQkJc2IsIGJsb2NrLCBwYXJ0aXRpb24sIGxvYywgaW5kZXgpOworCQlyZXR1cm4gMHhGRkZGRkZGRjsKKwl9CisKKwlsb2MgPSBsZTMyX3RvX2NwdSgoKF9fbGUzMiAqKWJoLT5iX2RhdGEpW2luZGV4XSk7CisKKwl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKworCWlmIChVREZfSV9MT0NBVElPTihVREZfU0JfVkFUKHNiKSkucGFydGl0aW9uUmVmZXJlbmNlTnVtID09IHBhcnRpdGlvbikKKwl7CisJCXVkZl9kZWJ1ZygicmVjdXJzaXZlIGNhbGwgdG8gdWRmX2dldF9wYmxvY2shXG4iKTsKKwkJcmV0dXJuIDB4RkZGRkZGRkY7CisJfQorCisJcmV0dXJuIHVkZl9nZXRfcGJsb2NrKHNiLCBsb2MsIFVERl9JX0xPQ0FUSU9OKFVERl9TQl9WQVQoc2IpKS5wYXJ0aXRpb25SZWZlcmVuY2VOdW0sIG9mZnNldCk7Cit9CisKK2lubGluZSB1aW50MzJfdCB1ZGZfZ2V0X3BibG9ja192aXJ0MjAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdWludDMyX3QgYmxvY2ssIHVpbnQxNl90IHBhcnRpdGlvbiwgdWludDMyX3Qgb2Zmc2V0KQoreworCXJldHVybiB1ZGZfZ2V0X3BibG9ja192aXJ0MTUoc2IsIGJsb2NrLCBwYXJ0aXRpb24sIG9mZnNldCk7Cit9CisKK3VpbnQzMl90IHVkZl9nZXRfcGJsb2NrX3NwYXIxNShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1aW50MzJfdCBibG9jaywgdWludDE2X3QgcGFydGl0aW9uLCB1aW50MzJfdCBvZmZzZXQpCit7CisJaW50IGk7CisJc3RydWN0IHNwYXJpbmdUYWJsZSAqc3QgPSBOVUxMOworCXVpbnQzMl90IHBhY2tldCA9IChibG9jayArIG9mZnNldCkgJiB+KFVERl9TQl9UWVBFU1BBUihzYixwYXJ0aXRpb24pLnNfcGFja2V0X2xlbiAtIDEpOworCisJZm9yIChpPTA7IGk8NDsgaSsrKQorCXsKKwkJaWYgKFVERl9TQl9UWVBFU1BBUihzYixwYXJ0aXRpb24pLnNfc3Bhcl9tYXBbaV0gIT0gTlVMTCkKKwkJeworCQkJc3QgPSAoc3RydWN0IHNwYXJpbmdUYWJsZSAqKVVERl9TQl9UWVBFU1BBUihzYixwYXJ0aXRpb24pLnNfc3Bhcl9tYXBbaV0tPmJfZGF0YTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHN0KQorCXsKKwkJZm9yIChpPTA7IGk8bGUxNl90b19jcHUoc3QtPnJlYWxsb2NhdGlvblRhYmxlTGVuKTsgaSsrKQorCQl7CisJCQlpZiAobGUzMl90b19jcHUoc3QtPm1hcEVudHJ5W2ldLm9yaWdMb2NhdGlvbikgPj0gMHhGRkZGRkZGMCkKKwkJCQlicmVhazsKKwkJCWVsc2UgaWYgKGxlMzJfdG9fY3B1KHN0LT5tYXBFbnRyeVtpXS5vcmlnTG9jYXRpb24pID09IHBhY2tldCkKKwkJCXsKKwkJCQlyZXR1cm4gbGUzMl90b19jcHUoc3QtPm1hcEVudHJ5W2ldLm1hcHBlZExvY2F0aW9uKSArCisJCQkJCSgoYmxvY2sgKyBvZmZzZXQpICYgKFVERl9TQl9UWVBFU1BBUihzYixwYXJ0aXRpb24pLnNfcGFja2V0X2xlbiAtIDEpKTsKKwkJCX0KKwkJCWVsc2UgaWYgKGxlMzJfdG9fY3B1KHN0LT5tYXBFbnRyeVtpXS5vcmlnTG9jYXRpb24pID4gcGFja2V0KQorCQkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiBVREZfU0JfUEFSVFJPT1Qoc2IscGFydGl0aW9uKSArIGJsb2NrICsgb2Zmc2V0OworfQorCitpbnQgdWRmX3JlbG9jYXRlX2Jsb2NrcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBsb25nIG9sZF9ibG9jaywgbG9uZyAqbmV3X2Jsb2NrKQoreworCXN0cnVjdCB1ZGZfc3BhcmluZ19kYXRhICpzZGF0YTsKKwlzdHJ1Y3Qgc3BhcmluZ1RhYmxlICpzdCA9IE5VTEw7CisJc3RydWN0IHNwYXJpbmdFbnRyeSBtYXBFbnRyeTsKKwl1aW50MzJfdCBwYWNrZXQ7CisJaW50IGksIGosIGssIGw7CisKKwlmb3IgKGk9MDsgaTxVREZfU0JfTlVNUEFSVFMoc2IpOyBpKyspCisJeworCQlpZiAob2xkX2Jsb2NrID4gVURGX1NCX1BBUlRST09UKHNiLGkpICYmCisJCSAgICBvbGRfYmxvY2sgPCBVREZfU0JfUEFSVFJPT1Qoc2IsaSkgKyBVREZfU0JfUEFSVExFTihzYixpKSkKKwkJeworCQkJc2RhdGEgPSAmVURGX1NCX1RZUEVTUEFSKHNiLGkpOworCQkJcGFja2V0ID0gKG9sZF9ibG9jayAtIFVERl9TQl9QQVJUUk9PVChzYixpKSkgJiB+KHNkYXRhLT5zX3BhY2tldF9sZW4gLSAxKTsKKworCQkJZm9yIChqPTA7IGo8NDsgaisrKQorCQkJeworCQkJCWlmIChVREZfU0JfVFlQRVNQQVIoc2IsaSkuc19zcGFyX21hcFtqXSAhPSBOVUxMKQorCQkJCXsKKwkJCQkJc3QgPSAoc3RydWN0IHNwYXJpbmdUYWJsZSAqKXNkYXRhLT5zX3NwYXJfbWFwW2pdLT5iX2RhdGE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKworCQkJaWYgKCFzdCkKKwkJCQlyZXR1cm4gMTsKKworCQkJZm9yIChrPTA7IGs8bGUxNl90b19jcHUoc3QtPnJlYWxsb2NhdGlvblRhYmxlTGVuKTsgaysrKQorCQkJeworCQkJCWlmIChsZTMyX3RvX2NwdShzdC0+bWFwRW50cnlba10ub3JpZ0xvY2F0aW9uKSA9PSAweEZGRkZGRkZGKQorCQkJCXsKKwkJCQkJZm9yICg7IGo8NDsgaisrKQorCQkJCQl7CisJCQkJCQlpZiAoc2RhdGEtPnNfc3Bhcl9tYXBbal0pCisJCQkJCQl7CisJCQkJCQkJc3QgPSAoc3RydWN0IHNwYXJpbmdUYWJsZSAqKXNkYXRhLT5zX3NwYXJfbWFwW2pdLT5iX2RhdGE7CisJCQkJCQkJc3QtPm1hcEVudHJ5W2tdLm9yaWdMb2NhdGlvbiA9IGNwdV90b19sZTMyKHBhY2tldCk7CisJCQkJCQkJdWRmX3VwZGF0ZV90YWcoKGNoYXIgKilzdCwgc2l6ZW9mKHN0cnVjdCBzcGFyaW5nVGFibGUpICsgbGUxNl90b19jcHUoc3QtPnJlYWxsb2NhdGlvblRhYmxlTGVuKSAqIHNpemVvZihzdHJ1Y3Qgc3BhcmluZ0VudHJ5KSk7CisJCQkJCQkJbWFya19idWZmZXJfZGlydHkoc2RhdGEtPnNfc3Bhcl9tYXBbal0pOworCQkJCQkJfQorCQkJCQl9CisJCQkJCSpuZXdfYmxvY2sgPSBsZTMyX3RvX2NwdShzdC0+bWFwRW50cnlba10ubWFwcGVkTG9jYXRpb24pICsKKwkJCQkJCSgob2xkX2Jsb2NrIC0gVURGX1NCX1BBUlRST09UKHNiLGkpKSAmIChzZGF0YS0+c19wYWNrZXRfbGVuIC0gMSkpOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJZWxzZSBpZiAobGUzMl90b19jcHUoc3QtPm1hcEVudHJ5W2tdLm9yaWdMb2NhdGlvbikgPT0gcGFja2V0KQorCQkJCXsKKwkJCQkJKm5ld19ibG9jayA9IGxlMzJfdG9fY3B1KHN0LT5tYXBFbnRyeVtrXS5tYXBwZWRMb2NhdGlvbikgKworCQkJCQkJKChvbGRfYmxvY2sgLSBVREZfU0JfUEFSVFJPT1Qoc2IsaSkpICYgKHNkYXRhLT5zX3BhY2tldF9sZW4gLSAxKSk7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCQllbHNlIGlmIChsZTMyX3RvX2NwdShzdC0+bWFwRW50cnlba10ub3JpZ0xvY2F0aW9uKSA+IHBhY2tldCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlmb3IgKGw9azsgbDxsZTE2X3RvX2NwdShzdC0+cmVhbGxvY2F0aW9uVGFibGVMZW4pOyBsKyspCisJCQl7CisJCQkJaWYgKGxlMzJfdG9fY3B1KHN0LT5tYXBFbnRyeVtsXS5vcmlnTG9jYXRpb24pID09IDB4RkZGRkZGRkYpCisJCQkJeworCQkJCQlmb3IgKDsgajw0OyBqKyspCisJCQkJCXsKKwkJCQkJCWlmIChzZGF0YS0+c19zcGFyX21hcFtqXSkKKwkJCQkJCXsKKwkJCQkJCQlzdCA9IChzdHJ1Y3Qgc3BhcmluZ1RhYmxlICopc2RhdGEtPnNfc3Bhcl9tYXBbal0tPmJfZGF0YTsKKwkJCQkJCQltYXBFbnRyeSA9IHN0LT5tYXBFbnRyeVtsXTsKKwkJCQkJCQltYXBFbnRyeS5vcmlnTG9jYXRpb24gPSBjcHVfdG9fbGUzMihwYWNrZXQpOworCQkJCQkJCW1lbW1vdmUoJnN0LT5tYXBFbnRyeVtrKzFdLCAmc3QtPm1hcEVudHJ5W2tdLCAobC1rKSpzaXplb2Yoc3RydWN0IHNwYXJpbmdFbnRyeSkpOworCQkJCQkJCXN0LT5tYXBFbnRyeVtrXSA9IG1hcEVudHJ5OworCQkJCQkJCXVkZl91cGRhdGVfdGFnKChjaGFyICopc3QsIHNpemVvZihzdHJ1Y3Qgc3BhcmluZ1RhYmxlKSArIGxlMTZfdG9fY3B1KHN0LT5yZWFsbG9jYXRpb25UYWJsZUxlbikgKiBzaXplb2Yoc3RydWN0IHNwYXJpbmdFbnRyeSkpOworCQkJCQkJCW1hcmtfYnVmZmVyX2RpcnR5KHNkYXRhLT5zX3NwYXJfbWFwW2pdKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQkqbmV3X2Jsb2NrID0gbGUzMl90b19jcHUoc3QtPm1hcEVudHJ5W2tdLm1hcHBlZExvY2F0aW9uKSArCisJCQkJCQkoKG9sZF9ibG9jayAtIFVERl9TQl9QQVJUUk9PVChzYixpKSkgJiAoc2RhdGEtPnNfcGFja2V0X2xlbiAtIDEpKTsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJaWYgKGkgPT0gVURGX1NCX05VTVBBUlRTKHNiKSkKKwl7CisJCS8qIG91dHNpZGUgb2YgcGFydGl0aW9ucyAqLworCQkvKiBmb3Igbm93LCBmYWlsID0pICovCisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMvdWRmL3N1cGVyLmMgYi9mcy91ZGYvc3VwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWJkNGYyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvdWRmL3N1cGVyLmMKQEAgLTAsMCArMSwxOTM0IEBACisvKgorICogc3VwZXIuYworICoKKyAqIFBVUlBPU0UKKyAqICBTdXBlciBibG9jayByb3V0aW5lcyBmb3IgdGhlIE9TVEEtVURGKHRtKSBmaWxlc3lzdGVtLgorICoKKyAqIERFU0NSSVBUSU9OCisgKiAgT1NUQS1VREYodG0pID0gT3B0aWNhbCBTdG9yYWdlIFRlY2hub2xvZ3kgQXNzb2NpYXRpb24KKyAqICBVbml2ZXJzYWwgRGlzayBGb3JtYXQuCisgKgorICogIFRoaXMgY29kZSBpcyBiYXNlZCBvbiB2ZXJzaW9uIDIuMDAgb2YgdGhlIFVERiBzcGVjaWZpY2F0aW9uLAorICogIGFuZCByZXZpc2lvbiAzIG9mIHRoZSBFQ01BIDE2NyBzdGFuZGFyZCBbZXF1aXZhbGVudCB0byBJU08gMTMzNDZdLgorICogICAgaHR0cDovL3d3dy5vc3RhLm9yZy8KKyAqICAgIGh0dHA6Ly93d3cuZWNtYS5jaC8KKyAqICAgIGh0dHA6Ly93d3cuaXNvLm9yZy8KKyAqCisgKiBDT05UQUNUUworICogIEUtbWFpbCByZWdhcmRpbmcgYW55IHBvcnRpb24gb2YgdGhlIExpbnV4IFVERiBmaWxlIHN5c3RlbSBzaG91bGQgYmUKKyAqICBkaXJlY3RlZCB0byB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBtYWlsaW5nIGxpc3QgKHJ1biBieSBtYWpvcmRvbW8pOgorICoJICBsaW51eF91ZGZAaHBlc2pyby5mYy5ocC5jb20KKyAqCisgKiBDT1BZUklHSFQKKyAqICBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIChHUEwpLiBDb3BpZXMgb2YgdGhlIEdQTCBjYW4gYmUgb2J0YWluZWQgZnJvbToKKyAqICAgIGZ0cDovL3ByZXAuYWkubWl0LmVkdS9wdWIvZ251L0dQTAorICogIEVhY2ggY29udHJpYnV0aW5nIGF1dGhvciByZXRhaW5zIGFsbCByaWdodHMgdG8gdGhlaXIgb3duIHdvcmsuCisgKgorICogIChDKSAxOTk4IERhdmUgQm95bnRvbgorICogIChDKSAxOTk4LTIwMDQgQmVuIEZlbm5lbWEKKyAqICAoQykgMjAwMCBTdGVsaWFzIENvbXB1dGluZyBJbmMKKyAqCisgKiBISVNUT1JZCisgKgorICogIDA5LzI0Lzk4IGRnYiAgY2hhbmdlZCB0byBhbGxvdyBjb21waWxpbmcgb3V0c2lkZSBvZiBrZXJuZWwsIGFuZAorICogICAgICAgICAgICAgICAgYWRkZWQgc29tZSBkZWJ1Z2dpbmcuCisgKiAgMTAvMDEvOTggZGdiICB1cGRhdGVkIHRvIGFsbG93IChzb21lKSBwb3NzaWJpbGl0eSBvZiBjb21waWxpbmcgdy8yLjAuMzQKKyAqICAxMC8xNi85OCAgICAgIGF0dGVtcHRpbmcgc29tZSBtdWx0aS1zZXNzaW9uIHN1cHBvcnQKKyAqICAxMC8xNy85OCAgICAgIGFkZGVkIGZyZWVzcGFjZSBjb3VudCBmb3IgImRmIgorICogIDExLzExLzk4IGdyICAgYWRkZWQgbm92cnMgb3B0aW9uCisgKiAgMTEvMjYvOTggZGdiICBhZGRlZCBmaWxlc2V0LGFuY2hvciBtb3VudCBvcHRpb25zCisgKiAgMTIvMDYvOTggYmxmICByZWFsbHkgaG9zZWQgdGhpbmdzIHJveWFsbHkuIHZhdC9zcGFyaW5nIHN1cHBvcnQuIHNlcXVlbmNlZCB2b2wgZGVzY3MKKyAqICAgICAgICAgICAgICAgIHJld3JvdGUgb3B0aW9uIGhhbmRsaW5nIGJhc2VkIG9uIGlzb2ZzCisgKiAgMTIvMjAvOTggICAgICBmaW5kIHRoZSBmcmVlIHNwYWNlIGJpdG1hcCAoaWYgaXQgZXhpc3RzKQorICovCisKKyNpbmNsdWRlICJ1ZGZkZWNsLmgiICAgIAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jZHJvbS5oPgorI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaW5jbHVkZSA8bGludXgvdWRmX2ZzLmg+CisjaW5jbHVkZSAidWRmX3NiLmgiCisjaW5jbHVkZSAidWRmX2kuaCIKKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjZGVmaW5lIFZEU19QT1NfUFJJTUFSWV9WT0xfREVTQwkwCisjZGVmaW5lIFZEU19QT1NfVU5BTExPQ19TUEFDRV9ERVNDCTEKKyNkZWZpbmUgVkRTX1BPU19MT0dJQ0FMX1ZPTF9ERVNDCTIKKyNkZWZpbmUgVkRTX1BPU19QQVJUSVRJT05fREVTQwkJMworI2RlZmluZSBWRFNfUE9TX0lNUF9VU0VfVk9MX0RFU0MJNAorI2RlZmluZSBWRFNfUE9TX1ZPTF9ERVNDX1BUUgkJNQorI2RlZmluZSBWRFNfUE9TX1RFUk1JTkFUSU5HX0RFU0MJNgorI2RlZmluZSBWRFNfUE9TX0xFTkdUSAkJCTcKKworc3RhdGljIGNoYXIgZXJyb3JfYnVmWzEwMjRdOworCisvKiBUaGVzZSBhcmUgdGhlICJtZWF0IiAtIGV2ZXJ5dGhpbmcgZWxzZSBpcyBzdHVmZmluZyAqLworc3RhdGljIGludCB1ZGZfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdm9pZCAqLCBpbnQpOworc3RhdGljIHZvaWQgdWRmX3B1dF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CitzdGF0aWMgdm9pZCB1ZGZfd3JpdGVfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICopOworc3RhdGljIGludCB1ZGZfcmVtb3VudF9mcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50ICosIGNoYXIgKik7CitzdGF0aWMgaW50IHVkZl9jaGVja192YWxpZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50LCBpbnQpOworc3RhdGljIGludCB1ZGZfdnJzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCBzaWxlbnQpOworc3RhdGljIGludCB1ZGZfbG9hZF9wYXJ0aXRpb24oc3RydWN0IHN1cGVyX2Jsb2NrICosIGtlcm5lbF9sYl9hZGRyICopOworc3RhdGljIGludCB1ZGZfbG9hZF9sb2dpY2Fsdm9sKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiwga2VybmVsX2xiX2FkZHIgKik7CitzdGF0aWMgdm9pZCB1ZGZfbG9hZF9sb2dpY2Fsdm9saW50KHN0cnVjdCBzdXBlcl9ibG9jayAqLCBrZXJuZWxfZXh0ZW50X2FkKTsKK3N0YXRpYyB2b2lkIHVkZl9maW5kX2FuY2hvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKik7CitzdGF0aWMgaW50IHVkZl9maW5kX2ZpbGVzZXQoc3RydWN0IHN1cGVyX2Jsb2NrICosIGtlcm5lbF9sYl9hZGRyICosIGtlcm5lbF9sYl9hZGRyICopOworc3RhdGljIHZvaWQgdWRmX2xvYWRfcHZvbGRlc2Moc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBidWZmZXJfaGVhZCAqKTsKK3N0YXRpYyB2b2lkIHVkZl9sb2FkX2ZpbGVzZXQoc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBidWZmZXJfaGVhZCAqLCBrZXJuZWxfbGJfYWRkciAqKTsKK3N0YXRpYyB2b2lkIHVkZl9sb2FkX3BhcnRkZXNjKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKik7CitzdGF0aWMgdm9pZCB1ZGZfb3Blbl9sdmlkKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK3N0YXRpYyB2b2lkIHVkZl9jbG9zZV9sdmlkKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdWRmX2NvdW50X2ZyZWUoc3RydWN0IHN1cGVyX2Jsb2NrICopOworc3RhdGljIGludCB1ZGZfc3RhdGZzKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3Qga3N0YXRmcyAqKTsKKworLyogVURGIGZpbGVzeXN0ZW0gdHlwZSAqLworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqdWRmX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoreworCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIHVkZl9maWxsX3N1cGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHVkZl9mc3R5cGUgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQk9ICJ1ZGYiLAorCS5nZXRfc2IJCT0gdWRmX2dldF9zYiwKKwkua2lsbF9zYgk9IGtpbGxfYmxvY2tfc3VwZXIsCisJLmZzX2ZsYWdzCT0gRlNfUkVRVUlSRVNfREVWLAorfTsKKworc3RhdGljIGttZW1fY2FjaGVfdCAqIHVkZl9pbm9kZV9jYWNoZXA7CisKK3N0YXRpYyBzdHJ1Y3QgaW5vZGUgKnVkZl9hbGxvY19pbm9kZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXN0cnVjdCB1ZGZfaW5vZGVfaW5mbyAqZWk7CisJZWkgPSAoc3RydWN0IHVkZl9pbm9kZV9pbmZvICopa21lbV9jYWNoZV9hbGxvYyh1ZGZfaW5vZGVfY2FjaGVwLCBTTEFCX0tFUk5FTCk7CisJaWYgKCFlaSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuICZlaS0+dmZzX2lub2RlOworfQorCitzdGF0aWMgdm9pZCB1ZGZfZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWttZW1fY2FjaGVfZnJlZSh1ZGZfaW5vZGVfY2FjaGVwLCBVREZfSShpbm9kZSkpOworfQorCitzdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqIGZvbywga21lbV9jYWNoZV90ICogY2FjaGVwLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCB1ZGZfaW5vZGVfaW5mbyAqZWkgPSAoc3RydWN0IHVkZl9pbm9kZV9pbmZvICopIGZvbzsKKworCWlmICgoZmxhZ3MgJiAoU0xBQl9DVE9SX1ZFUklGWXxTTEFCX0NUT1JfQ09OU1RSVUNUT1IpKSA9PQorCSAgICBTTEFCX0NUT1JfQ09OU1RSVUNUT1IpCisJeworCQllaS0+aV9leHQuaV9kYXRhID0gTlVMTDsKKwkJaW5vZGVfaW5pdF9vbmNlKCZlaS0+dmZzX2lub2RlKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9pbm9kZWNhY2hlKHZvaWQpCit7CisJdWRmX2lub2RlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJ1ZGZfaW5vZGVfY2FjaGUiLAorCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgdWRmX2lub2RlX2luZm8pLAorCQkJCQkgICAgIDAsIFNMQUJfUkVDTEFJTV9BQ0NPVU5ULAorCQkJCQkgICAgIGluaXRfb25jZSwgTlVMTCk7CisJaWYgKHVkZl9pbm9kZV9jYWNoZXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfaW5vZGVjYWNoZSh2b2lkKQoreworCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3kodWRmX2lub2RlX2NhY2hlcCkpCisJCXByaW50ayhLRVJOX0lORk8gInVkZl9pbm9kZV9jYWNoZTogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOworfQorCisvKiBTdXBlcmJsb2NrIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyB1ZGZfc2Jfb3BzID0geworCS5hbGxvY19pbm9kZQkJPSB1ZGZfYWxsb2NfaW5vZGUsCisJLmRlc3Ryb3lfaW5vZGUJCT0gdWRmX2Rlc3Ryb3lfaW5vZGUsCisJLndyaXRlX2lub2RlCQk9IHVkZl93cml0ZV9pbm9kZSwKKwkuZGVsZXRlX2lub2RlCQk9IHVkZl9kZWxldGVfaW5vZGUsCisJLmNsZWFyX2lub2RlCQk9IHVkZl9jbGVhcl9pbm9kZSwKKwkucHV0X3N1cGVyCQk9IHVkZl9wdXRfc3VwZXIsCisJLndyaXRlX3N1cGVyCQk9IHVkZl93cml0ZV9zdXBlciwKKwkuc3RhdGZzCQkJPSB1ZGZfc3RhdGZzLAorCS5yZW1vdW50X2ZzCQk9IHVkZl9yZW1vdW50X2ZzLAorfTsKKworc3RydWN0IHVkZl9vcHRpb25zCit7CisJdW5zaWduZWQgY2hhciBub3ZyczsKKwl1bnNpZ25lZCBpbnQgYmxvY2tzaXplOworCXVuc2lnbmVkIGludCBzZXNzaW9uOworCXVuc2lnbmVkIGludCBsYXN0YmxvY2s7CisJdW5zaWduZWQgaW50IGFuY2hvcjsKKwl1bnNpZ25lZCBpbnQgdm9sdW1lOworCXVuc2lnbmVkIHNob3J0IHBhcnRpdGlvbjsKKwl1bnNpZ25lZCBpbnQgZmlsZXNldDsKKwl1bnNpZ25lZCBpbnQgcm9vdGRpcjsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJbW9kZV90IHVtYXNrOworCWdpZF90IGdpZDsKKwl1aWRfdCB1aWQ7CisJc3RydWN0IG5sc190YWJsZSAqbmxzX21hcDsKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfdWRmX2ZzKHZvaWQpCit7CisJaW50IGVycjsKKwllcnIgPSBpbml0X2lub2RlY2FjaGUoKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDE7CisJZXJyID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmdWRmX2ZzdHlwZSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJcmV0dXJuIDA7CitvdXQ6CisJZGVzdHJveV9pbm9kZWNhY2hlKCk7CitvdXQxOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X3VkZl9mcyh2b2lkKQoreworCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmdWRmX2ZzdHlwZSk7CisJZGVzdHJveV9pbm9kZWNhY2hlKCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfdWRmX2ZzKQorbW9kdWxlX2V4aXQoZXhpdF91ZGZfZnMpCisKKy8qCisgKiB1ZGZfcGFyc2Vfb3B0aW9ucworICoKKyAqIFBVUlBPU0UKKyAqCVBhcnNlIG1vdW50IG9wdGlvbnMuCisgKgorICogREVTQ1JJUFRJT04KKyAqCVRoZSBmb2xsb3dpbmcgbW91bnQgb3B0aW9ucyBhcmUgc3VwcG9ydGVkOgorICoKKyAqCWdpZD0JCVNldCB0aGUgZGVmYXVsdCBncm91cC4KKyAqCXVtYXNrPQkJU2V0IHRoZSBkZWZhdWx0IHVtYXNrLgorICoJdWlkPQkJU2V0IHRoZSBkZWZhdWx0IHVzZXIuCisgKglicz0JCVNldCB0aGUgYmxvY2sgc2l6ZS4KKyAqCXVuaGlkZQkJU2hvdyBvdGhlcndpc2UgaGlkZGVuIGZpbGVzLgorICoJdW5kZWxldGUJU2hvdyBkZWxldGVkIGZpbGVzIGluIGxpc3RzLgorICoJYWRpbmljYgkJRW1iZWQgZGF0YSBpbiB0aGUgaW5vZGUgKGRlZmF1bHQpCisgKglub2FkaW5pY2IJRG9uJ3QgZW1iZWQgZGF0YSBpbiB0aGUgaW5vZGUKKyAqCXNob3J0YWQJCVVzZSBzaG9ydCBhZCdzCisgKglsb25nYWQJCVVzZSBsb25nIGFkJ3MgKGRlZmF1bHQpCisgKglub3N0cmljdAlVbnNldCBzdHJpY3QgY29uZm9ybWFuY2UKKyAqCWlvY2hhcnNldD0JU2V0IHRoZSBOTFMgY2hhcmFjdGVyIHNldAorICoKKyAqCVRoZSByZW1haW5pbmcgYXJlIGZvciBkZWJ1Z2dpbmcgYW5kIGRpc2FzdGVyIHJlY292ZXJ5OgorICoKKyAqCW5vdnJzCQlTa2lwIHZvbHVtZSBzZXF1ZW5jZSByZWNvZ25pdGlvbiAKKyAqCisgKglUaGUgZm9sbG93aW5nIGV4cGVjdCBhIG9mZnNldCBmcm9tIDAuCisgKgorICoJc2Vzc2lvbj0JU2V0IHRoZSBDRFJPTSBzZXNzaW9uIChkZWZhdWx0PSBsYXN0IHNlc3Npb24pCisgKglhbmNob3I9CQlPdmVycmlkZSBzdGFuZGFyZCBhbmNob3IgbG9jYXRpb24uIChkZWZhdWx0PSAyNTYpCisgKgl2b2x1bWU9CQlPdmVycmlkZSB0aGUgVm9sdW1lRGVzYyBsb2NhdGlvbi4gKHVudXNlZCkKKyAqCXBhcnRpdGlvbj0JT3ZlcnJpZGUgdGhlIFBhcnRpdGlvbkRlc2MgbG9jYXRpb24uICh1bnVzZWQpCisgKglsYXN0YmxvY2s9CVNldCB0aGUgbGFzdCBibG9jayBvZiB0aGUgZmlsZXN5c3RlbS8KKyAqCisgKglUaGUgZm9sbG93aW5nIGV4cGVjdCBhIG9mZnNldCBmcm9tIHRoZSBwYXJ0aXRpb24gcm9vdC4KKyAqCisgKglmaWxlc2V0PQlPdmVycmlkZSB0aGUgZmlsZXNldCBibG9jayBsb2NhdGlvbi4gKHVudXNlZCkKKyAqCXJvb3RkaXI9CU92ZXJyaWRlIHRoZSByb290IGRpcmVjdG9yeSBsb2NhdGlvbi4gKHVudXNlZCkKKyAqCQlXQVJOSU5HOiBvdmVycmlkaW5nIHRoZSByb290ZGlyIHRvIGEgbm9uLWRpcmVjdG9yeSBtYXkKKyAqCQl5aWVsZCBoaWdobHkgdW5wcmVkaWN0YWJsZSByZXN1bHRzLgorICoKKyAqIFBSRS1DT05ESVRJT05TCisgKglvcHRpb25zCQlQb2ludGVyIHRvIG1vdW50IG9wdGlvbnMgc3RyaW5nLgorICoJdW9wdHMJCVBvaW50ZXIgdG8gbW91bnQgb3B0aW9ucyB2YXJpYWJsZS4KKyAqCisgKiBQT1NULUNPTkRJVElPTlMKKyAqCTxyZXR1cm4+CTEJTW91bnQgb3B0aW9ucyBwYXJzZWQgb2theS4KKyAqCTxyZXR1cm4+CTAJRXJyb3IgcGFyc2luZyBtb3VudCBvcHRpb25zLgorICoKKyAqIEhJU1RPUlkKKyAqCUp1bHkgMSwgMTk5NyAtIEFuZHJldyBFLiBNaWxlc2tpCisgKglXcml0dGVuLCB0ZXN0ZWQsIGFuZCByZWxlYXNlZC4KKyAqLworCitlbnVtIHsKKwlPcHRfbm92cnMsIE9wdF9ub3N0cmljdCwgT3B0X2JzLCBPcHRfdW5oaWRlLCBPcHRfdW5kZWxldGUsCisJT3B0X25vYWRpbmljYiwgT3B0X2FkaW5pY2IsIE9wdF9zaG9ydGFkLCBPcHRfbG9uZ2FkLAorCU9wdF9naWQsIE9wdF91aWQsIE9wdF91bWFzaywgT3B0X3Nlc3Npb24sIE9wdF9sYXN0YmxvY2ssCisJT3B0X2FuY2hvciwgT3B0X3ZvbHVtZSwgT3B0X3BhcnRpdGlvbiwgT3B0X2ZpbGVzZXQsCisJT3B0X3Jvb3RkaXIsIE9wdF91dGY4LCBPcHRfaW9jaGFyc2V0LAorCU9wdF9lcnIKK307CisKK3N0YXRpYyBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKKwl7T3B0X25vdnJzLCAibm92cnMifSwKKwl7T3B0X25vc3RyaWN0LCAibm9zdHJpY3QifSwKKwl7T3B0X2JzLCAiYnM9JXUifSwKKwl7T3B0X3VuaGlkZSwgInVuaGlkZSJ9LAorCXtPcHRfdW5kZWxldGUsICJ1bmRlbGV0ZSJ9LAorCXtPcHRfbm9hZGluaWNiLCAibm9hZGluaWNiIn0sCisJe09wdF9hZGluaWNiLCAiYWRpbmljYiJ9LAorCXtPcHRfc2hvcnRhZCwgInNob3J0YWQifSwKKwl7T3B0X2xvbmdhZCwgImxvbmdhZCJ9LAorCXtPcHRfZ2lkLCAiZ2lkPSV1In0sCisJe09wdF91aWQsICJ1aWQ9JXUifSwKKwl7T3B0X3VtYXNrLCAidW1hc2s9JW8ifSwKKwl7T3B0X3Nlc3Npb24sICJzZXNzaW9uPSV1In0sCisJe09wdF9sYXN0YmxvY2ssICJsYXN0YmxvY2s9JXUifSwKKwl7T3B0X2FuY2hvciwgImFuY2hvcj0ldSJ9LAorCXtPcHRfdm9sdW1lLCAidm9sdW1lPSV1In0sCisJe09wdF9wYXJ0aXRpb24sICJwYXJ0aXRpb249JXUifSwKKwl7T3B0X2ZpbGVzZXQsICJmaWxlc2V0PSV1In0sCisJe09wdF9yb290ZGlyLCAicm9vdGRpcj0ldSJ9LAorCXtPcHRfdXRmOCwgInV0ZjgifSwKKwl7T3B0X2lvY2hhcnNldCwgImlvY2hhcnNldD0lcyJ9LAorCXtPcHRfZXJyLCBOVUxMfQorfTsKKworc3RhdGljIGludAordWRmX3BhcnNlX29wdGlvbnMoY2hhciAqb3B0aW9ucywgc3RydWN0IHVkZl9vcHRpb25zICp1b3B0KQoreworCWNoYXIgKnA7CisJaW50IG9wdGlvbjsKKworCXVvcHQtPm5vdnJzID0gMDsKKwl1b3B0LT5ibG9ja3NpemUgPSAyMDQ4OworCXVvcHQtPnBhcnRpdGlvbiA9IDB4RkZGRjsKKwl1b3B0LT5zZXNzaW9uID0gMHhGRkZGRkZGRjsKKwl1b3B0LT5sYXN0YmxvY2sgPSAwOworCXVvcHQtPmFuY2hvciA9IDA7CisJdW9wdC0+dm9sdW1lID0gMHhGRkZGRkZGRjsKKwl1b3B0LT5yb290ZGlyID0gMHhGRkZGRkZGRjsKKwl1b3B0LT5maWxlc2V0ID0gMHhGRkZGRkZGRjsKKwl1b3B0LT5ubHNfbWFwID0gTlVMTDsKKworCWlmICghb3B0aW9ucykKKwkJcmV0dXJuIDE7CisKKwl3aGlsZSAoKHAgPSBzdHJzZXAoJm9wdGlvbnMsICIsIikpICE9IE5VTEwpCisJeworCQlzdWJzdHJpbmdfdCBhcmdzW01BWF9PUFRfQVJHU107CisJCWludCB0b2tlbjsKKwkJaWYgKCEqcCkKKwkJCWNvbnRpbnVlOworCisJCXRva2VuID0gbWF0Y2hfdG9rZW4ocCwgdG9rZW5zLCBhcmdzKTsKKwkJc3dpdGNoICh0b2tlbikKKwkJeworCQkJY2FzZSBPcHRfbm92cnM6CisJCQkJdW9wdC0+bm92cnMgPSAxOworCQkJY2FzZSBPcHRfYnM6CisJCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpCisJCQkJCXJldHVybiAwOworCQkJCXVvcHQtPmJsb2Nrc2l6ZSA9IG9wdGlvbjsKKwkJCQlicmVhazsKKwkJCWNhc2UgT3B0X3VuaGlkZToKKwkJCQl1b3B0LT5mbGFncyB8PSAoMSA8PCBVREZfRkxBR19VTkhJREUpOworCQkJCWJyZWFrOworCQkJY2FzZSBPcHRfdW5kZWxldGU6CisJCQkJdW9wdC0+ZmxhZ3MgfD0gKDEgPDwgVURGX0ZMQUdfVU5ERUxFVEUpOworCQkJCWJyZWFrOworCQkJY2FzZSBPcHRfbm9hZGluaWNiOgorCQkJCXVvcHQtPmZsYWdzICY9IH4oMSA8PCBVREZfRkxBR19VU0VfQURfSU5fSUNCKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgT3B0X2FkaW5pY2I6CisJCQkJdW9wdC0+ZmxhZ3MgfD0gKDEgPDwgVURGX0ZMQUdfVVNFX0FEX0lOX0lDQik7CisJCQkJYnJlYWs7CisJCQljYXNlIE9wdF9zaG9ydGFkOgorCQkJCXVvcHQtPmZsYWdzIHw9ICgxIDw8IFVERl9GTEFHX1VTRV9TSE9SVF9BRCk7CisJCQkJYnJlYWs7CisJCQljYXNlIE9wdF9sb25nYWQ6CisJCQkJdW9wdC0+ZmxhZ3MgJj0gfigxIDw8IFVERl9GTEFHX1VTRV9TSE9SVF9BRCk7CisJCQkJYnJlYWs7CisJCQljYXNlIE9wdF9naWQ6CisJCQkJaWYgKG1hdGNoX2ludChhcmdzLCAmb3B0aW9uKSkKKwkJCQkJcmV0dXJuIDA7CisJCQkJdW9wdC0+Z2lkID0gb3B0aW9uOworCQkJCWJyZWFrOworCQkJY2FzZSBPcHRfdWlkOgorCQkJCWlmIChtYXRjaF9pbnQoYXJncywgJm9wdGlvbikpCisJCQkJCXJldHVybiAwOworCQkJCXVvcHQtPnVpZCA9IG9wdGlvbjsKKwkJCQlicmVhazsKKwkJCWNhc2UgT3B0X3VtYXNrOgorCQkJCWlmIChtYXRjaF9vY3RhbChhcmdzLCAmb3B0aW9uKSkKKwkJCQkJcmV0dXJuIDA7CisJCQkJdW9wdC0+dW1hc2sgPSBvcHRpb247CisJCQkJYnJlYWs7CisJCQljYXNlIE9wdF9ub3N0cmljdDoKKwkJCQl1b3B0LT5mbGFncyAmPSB+KDEgPDwgVURGX0ZMQUdfU1RSSUNUKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgT3B0X3Nlc3Npb246CisJCQkJaWYgKG1hdGNoX2ludChhcmdzLCAmb3B0aW9uKSkKKwkJCQkJcmV0dXJuIDA7CisJCQkJdW9wdC0+c2Vzc2lvbiA9IG9wdGlvbjsKKwkJCQlicmVhazsKKwkJCWNhc2UgT3B0X2xhc3RibG9jazoKKwkJCQlpZiAobWF0Y2hfaW50KGFyZ3MsICZvcHRpb24pKQorCQkJCQlyZXR1cm4gMDsKKwkJCQl1b3B0LT5sYXN0YmxvY2sgPSBvcHRpb247CisJCQkJYnJlYWs7CisJCQljYXNlIE9wdF9hbmNob3I6CisJCQkJaWYgKG1hdGNoX2ludChhcmdzLCAmb3B0aW9uKSkKKwkJCQkJcmV0dXJuIDA7CisJCQkJdW9wdC0+YW5jaG9yID0gb3B0aW9uOworCQkJCWJyZWFrOworCQkJY2FzZSBPcHRfdm9sdW1lOgorCQkJCWlmIChtYXRjaF9pbnQoYXJncywgJm9wdGlvbikpCisJCQkJCXJldHVybiAwOworCQkJCXVvcHQtPnZvbHVtZSA9IG9wdGlvbjsKKwkJCQlicmVhazsKKwkJCWNhc2UgT3B0X3BhcnRpdGlvbjoKKwkJCQlpZiAobWF0Y2hfaW50KGFyZ3MsICZvcHRpb24pKQorCQkJCQlyZXR1cm4gMDsKKwkJCQl1b3B0LT5wYXJ0aXRpb24gPSBvcHRpb247CisJCQkJYnJlYWs7CisJCQljYXNlIE9wdF9maWxlc2V0OgorCQkJCWlmIChtYXRjaF9pbnQoYXJncywgJm9wdGlvbikpCisJCQkJCXJldHVybiAwOworCQkJCXVvcHQtPmZpbGVzZXQgPSBvcHRpb247CisJCQkJYnJlYWs7CisJCQljYXNlIE9wdF9yb290ZGlyOgorCQkJCWlmIChtYXRjaF9pbnQoYXJncywgJm9wdGlvbikpCisJCQkJCXJldHVybiAwOworCQkJCXVvcHQtPnJvb3RkaXIgPSBvcHRpb247CisJCQkJYnJlYWs7CisJCQljYXNlIE9wdF91dGY4OgorCQkJCXVvcHQtPmZsYWdzIHw9ICgxIDw8IFVERl9GTEFHX1VURjgpOworCQkJCWJyZWFrOworI2lmZGVmIENPTkZJR19VREZfTkxTCisJCQljYXNlIE9wdF9pb2NoYXJzZXQ6CisJCQkJdW9wdC0+bmxzX21hcCA9IGxvYWRfbmxzKGFyZ3NbMF0uZnJvbSk7CisJCQkJdW9wdC0+ZmxhZ3MgfD0gKDEgPDwgVURGX0ZMQUdfTkxTX01BUCk7CisJCQkJYnJlYWs7CisjZW5kaWYKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRrKEtFUk5fRVJSICJ1ZGY6IGJhZCBtb3VudCBvcHRpb24gXCIlc1wiICIKKwkJCQkJCSJvciBtaXNzaW5nIHZhbHVlXG4iLCBwKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAxOworfQorCit2b2lkCit1ZGZfd3JpdGVfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlsb2NrX2tlcm5lbCgpOworCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkKKwkJdWRmX29wZW5fbHZpZChzYik7CisJc2ItPnNfZGlydCA9IDA7CisJdW5sb2NrX2tlcm5lbCgpOworfQorCitzdGF0aWMgaW50Cit1ZGZfcmVtb3VudF9mcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKmZsYWdzLCBjaGFyICpvcHRpb25zKQoreworCXN0cnVjdCB1ZGZfb3B0aW9ucyB1b3B0OworCisJdW9wdC5mbGFncyA9IFVERl9TQihzYiktPnNfZmxhZ3MgOworCXVvcHQudWlkICAgPSBVREZfU0Ioc2IpLT5zX3VpZCA7CisJdW9wdC5naWQgICA9IFVERl9TQihzYiktPnNfZ2lkIDsKKwl1b3B0LnVtYXNrID0gVURGX1NCKHNiKS0+c191bWFzayA7CisKKwlpZiAoICF1ZGZfcGFyc2Vfb3B0aW9ucyhvcHRpb25zLCAmdW9wdCkgKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCVVERl9TQihzYiktPnNfZmxhZ3MgPSB1b3B0LmZsYWdzOworCVVERl9TQihzYiktPnNfdWlkICAgPSB1b3B0LnVpZDsKKwlVREZfU0Ioc2IpLT5zX2dpZCAgID0gdW9wdC5naWQ7CisJVURGX1NCKHNiKS0+c191bWFzayA9IHVvcHQudW1hc2s7CisKKwlpZiAoVURGX1NCX0xWSURCSChzYikpIHsKKwkJaW50IHdyaXRlX3JldiA9IGxlMTZfdG9fY3B1KFVERl9TQl9MVklESVUoc2IpLT5taW5VREZXcml0ZVJldik7CisJCWlmICh3cml0ZV9yZXYgPiBVREZfTUFYX1dSSVRFX1ZFUlNJT04pCisJCQkqZmxhZ3MgfD0gTVNfUkRPTkxZOworCX0KKworCWlmICgoKmZsYWdzICYgTVNfUkRPTkxZKSA9PSAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKQorCQlyZXR1cm4gMDsKKwlpZiAoKmZsYWdzICYgTVNfUkRPTkxZKQorCQl1ZGZfY2xvc2VfbHZpZChzYik7CisJZWxzZQorCQl1ZGZfb3Blbl9sdmlkKHNiKTsKKworCXJldHVybiAwOworfQorCisvKgorICogdWRmX3NldF9ibG9ja3NpemUKKyAqCisgKiBQVVJQT1NFCisgKglTZXQgdGhlIGJsb2NrIHNpemUgdG8gYmUgdXNlZCBpbiBhbGwgdHJhbnNmZXJzLgorICoKKyAqIERFU0NSSVBUSU9OCisgKglUbyBhbGxvdyByb29tIGZvciBhIERNQSB0cmFuc2ZlciwgaXQgaXMgYmVzdCB0byBndWVzcyBiaWcgd2hlbiB1bnN1cmUuCisgKglUaGlzIHJvdXRpbmUgcGlja3MgMjA0OCBieXRlcyBhcyB0aGUgYmxvY2tzaXplIHdoZW4gZ3Vlc3NpbmcuIFRoaXMKKyAqCXNob3VsZCBiZSBhZGVxdWF0ZSB1bnRpbCBkZXZpY2VzIHdpdGggbGFyZ2VyIGJsb2NrIHNpemVzIGJlY29tZSBjb21tb24uCisgKgorICoJTm90ZSB0aGF0IHRoZSBMaW51eCBrZXJuZWwgY2FuIGN1cnJlbnRseSBvbmx5IGRlYWwgd2l0aCBibG9ja3NpemVzIG9mCisgKgk1MTIsIDEwMjQsIDIwNDgsIDQwOTYsIGFuZCA4MTkyIGJ5dGVzLgorICoKKyAqIFBSRS1DT05ESVRJT05TCisgKglzYgkJCVBvaW50ZXIgdG8gX2xvY2tlZF8gc3VwZXJibG9jay4KKyAqCisgKiBQT1NULUNPTkRJVElPTlMKKyAqCXNiLT5zX2Jsb2Nrc2l6ZQkJQmxvY2tzaXplLgorICoJc2ItPnNfYmxvY2tzaXplX2JpdHMJbG9nMiBvZiBibG9ja3NpemUuCisgKgk8cmV0dXJuPgkwCUJsb2Nrc2l6ZSBpcyB2YWxpZC4KKyAqCTxyZXR1cm4+CTEJQmxvY2tzaXplIGlzIGludmFsaWQuCisgKgorICogSElTVE9SWQorICoJSnVseSAxLCAxOTk3IC0gQW5kcmV3IEUuIE1pbGVza2kKKyAqCVdyaXR0ZW4sIHRlc3RlZCwgYW5kIHJlbGVhc2VkLgorICovCitzdGF0aWMgIGludAordWRmX3NldF9ibG9ja3NpemUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGJzaXplKQoreworCWlmICghc2JfbWluX2Jsb2Nrc2l6ZShzYiwgYnNpemUpKSB7CisJCXVkZl9kZWJ1ZygiQmFkIGJsb2NrIHNpemUgKCVkKVxuIiwgYnNpemUpOworCQlwcmludGsoS0VSTl9FUlIgInVkZjogYmFkIGJsb2NrIHNpemUgKCVkKVxuIiwgYnNpemUpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIHNiLT5zX2Jsb2Nrc2l6ZTsKK30KKworc3RhdGljIGludAordWRmX3ZycyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgc2lsZW50KQoreworCXN0cnVjdCB2b2xTdHJ1Y3REZXNjICp2c2QgPSBOVUxMOworCWludCBzZWN0b3IgPSAzMjc2ODsKKwlpbnQgc2VjdG9yc2l6ZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwlpbnQgaXNvOTY2MD0wOworCWludCBuc3IwMj0wOworCWludCBuc3IwMz0wOworCisJLyogQmxvY2sgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNTEyICovCisJaWYgKHNiLT5zX2Jsb2Nrc2l6ZSAmIDUxMSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc2ItPnNfYmxvY2tzaXplIDwgc2l6ZW9mKHN0cnVjdCB2b2xTdHJ1Y3REZXNjKSkKKwkJc2VjdG9yc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgdm9sU3RydWN0RGVzYyk7CisJZWxzZQorCQlzZWN0b3JzaXplID0gc2ItPnNfYmxvY2tzaXplOworCisJc2VjdG9yICs9IChVREZfU0JfU0VTU0lPTihzYikgPDwgc2ItPnNfYmxvY2tzaXplX2JpdHMpOworCisJdWRmX2RlYnVnKCJTdGFydGluZyBhdCBzZWN0b3IgJXUgKCVsZCBieXRlIHNlY3RvcnMpXG4iLAorCQkoc2VjdG9yID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSwgc2ItPnNfYmxvY2tzaXplKTsKKwkvKiBQcm9jZXNzIHRoZSBzZXF1ZW5jZSAoaWYgYXBwbGljYWJsZSkgKi8KKwlmb3IgKDshbnNyMDIgJiYgIW5zcjAzOyBzZWN0b3IgKz0gc2VjdG9yc2l6ZSkKKwl7CisJCS8qIFJlYWQgYSBibG9jayAqLworCQliaCA9IHVkZl90cmVhZChzYiwgc2VjdG9yID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwkJaWYgKCFiaCkKKwkJCWJyZWFrOworCisJCS8qIExvb2sgZm9yIElTTyAgZGVzY3JpcHRvcnMgKi8KKwkJdnNkID0gKHN0cnVjdCB2b2xTdHJ1Y3REZXNjICopKGJoLT5iX2RhdGEgKworCQkJKHNlY3RvciAmIChzYi0+c19ibG9ja3NpemUgLSAxKSkpOworCisJCWlmICh2c2QtPnN0ZElkZW50WzBdID09IDApCisJCXsKKwkJCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCQkJYnJlYWs7CisJCX0KKwkJZWxzZSBpZiAoIXN0cm5jbXAodnNkLT5zdGRJZGVudCwgVlNEX1NURF9JRF9DRDAwMSwgVlNEX1NURF9JRF9MRU4pKQorCQl7CisJCQlpc285NjYwID0gc2VjdG9yOworCQkJc3dpdGNoICh2c2QtPnN0cnVjdFR5cGUpCisJCQl7CisJCQkJY2FzZSAwOiAKKwkJCQkJdWRmX2RlYnVnKCJJU085NjYwIEJvb3QgUmVjb3JkIGZvdW5kXG4iKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAxOiAKKwkJCQkJdWRmX2RlYnVnKCJJU085NjYwIFByaW1hcnkgVm9sdW1lIERlc2NyaXB0b3IgZm91bmRcbiIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDI6IAorCQkJCQl1ZGZfZGVidWcoIklTTzk2NjAgU3VwcGxlbWVudGFyeSBWb2x1bWUgRGVzY3JpcHRvciBmb3VuZFxuIik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMzogCisJCQkJCXVkZl9kZWJ1ZygiSVNPOTY2MCBWb2x1bWUgUGFydGl0aW9uIERlc2NyaXB0b3IgZm91bmRcbiIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDI1NTogCisJCQkJCXVkZl9kZWJ1ZygiSVNPOTY2MCBWb2x1bWUgRGVzY3JpcHRvciBTZXQgVGVybWluYXRvciBmb3VuZFxuIik7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6IAorCQkJCQl1ZGZfZGVidWcoIklTTzk2NjAgVlJTICgldSkgZm91bmRcbiIsIHZzZC0+c3RydWN0VHlwZSk7CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWVsc2UgaWYgKCFzdHJuY21wKHZzZC0+c3RkSWRlbnQsIFZTRF9TVERfSURfQkVBMDEsIFZTRF9TVERfSURfTEVOKSkKKwkJeworCQl9CisJCWVsc2UgaWYgKCFzdHJuY21wKHZzZC0+c3RkSWRlbnQsIFZTRF9TVERfSURfVEVBMDEsIFZTRF9TVERfSURfTEVOKSkKKwkJeworCQkJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisJCQlicmVhazsKKwkJfQorCQllbHNlIGlmICghc3RybmNtcCh2c2QtPnN0ZElkZW50LCBWU0RfU1REX0lEX05TUjAyLCBWU0RfU1REX0lEX0xFTikpCisJCXsKKwkJCW5zcjAyID0gc2VjdG9yOworCQl9CisJCWVsc2UgaWYgKCFzdHJuY21wKHZzZC0+c3RkSWRlbnQsIFZTRF9TVERfSURfTlNSMDMsIFZTRF9TVERfSURfTEVOKSkKKwkJeworCQkJbnNyMDMgPSBzZWN0b3I7CisJCX0KKwkJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisJfQorCisJaWYgKG5zcjAzKQorCQlyZXR1cm4gbnNyMDM7CisJZWxzZSBpZiAobnNyMDIpCisJCXJldHVybiBuc3IwMjsKKwllbHNlIGlmIChzZWN0b3IgLSAoVURGX1NCX1NFU1NJT04oc2IpIDw8IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKSA9PSAzMjc2OCkKKwkJcmV0dXJuIC0xOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB1ZGZfZmluZF9hbmNob3IKKyAqCisgKiBQVVJQT1NFCisgKglGaW5kIGFuIGFuY2hvciB2b2x1bWUgZGVzY3JpcHRvci4KKyAqCisgKiBQUkUtQ09ORElUSU9OUworICoJc2IJCQlQb2ludGVyIHRvIF9sb2NrZWRfIHN1cGVyYmxvY2suCisgKglsYXN0YmxvY2sJCUxhc3QgYmxvY2sgb24gbWVkaWEuCisgKgorICogUE9TVC1DT05ESVRJT05TCisgKgk8cmV0dXJuPgkJMSBpZiBub3QgZm91bmQsIDAgaWYgb2sKKyAqCisgKiBISVNUT1JZCisgKglKdWx5IDEsIDE5OTcgLSBBbmRyZXcgRS4gTWlsZXNraQorICoJV3JpdHRlbiwgdGVzdGVkLCBhbmQgcmVsZWFzZWQuCisgKi8KK3N0YXRpYyB2b2lkCit1ZGZfZmluZF9hbmNob3Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlpbnQgbGFzdGJsb2NrID0gVURGX1NCX0xBU1RCTE9DSyhzYik7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJdWludDE2X3QgaWRlbnQ7CisJdWludDMyX3QgbG9jYXRpb247CisJaW50IGk7CisKKwlpZiAobGFzdGJsb2NrKQorCXsKKwkJaW50IHZhcmxhc3RibG9jayA9IHVkZl92YXJpYWJsZV90b19maXhlZChsYXN0YmxvY2spOworCQlpbnQgbGFzdFtdID0gIHsgbGFzdGJsb2NrLCBsYXN0YmxvY2sgLSAyLAorCQkJCWxhc3RibG9jayAtIDE1MCwgbGFzdGJsb2NrIC0gMTUyLAorCQkJCXZhcmxhc3RibG9jaywgdmFybGFzdGJsb2NrIC0gMiwKKwkJCQl2YXJsYXN0YmxvY2sgLSAxNTAsIHZhcmxhc3RibG9jayAtIDE1MiB9OworCisJCWxhc3RibG9jayA9IDA7CisKKwkJLyogU2VhcmNoIGZvciBhbiBhbmNob3Igdm9sdW1lIGRlc2NyaXB0b3IgcG9pbnRlciAqLworCisJCS8qICBhY2NvcmRpbmcgdG8gc3BlYywgYW5jaG9yIGlzIGluIGVpdGhlcjoKKwkJICogICAgIGJsb2NrIDI1NgorCQkgKiAgICAgbGFzdGJsb2NrLTI1NgorCQkgKiAgICAgbGFzdGJsb2NrCisJCSAqICBob3dldmVyLCBpZiB0aGUgZGlzYyBpc24ndCBjbG9zZWQsIGl0IGNvdWxkIGJlIDUxMiAqLworCisJCWZvciAoaT0wOyAoIWxhc3RibG9jayAmJiBpPHNpemVvZihsYXN0KS9zaXplb2YoaW50KSk7IGkrKykKKwkJeworCQkJaWYgKGxhc3RbaV0gPCAwIHx8ICEoYmggPSBzYl9icmVhZChzYiwgbGFzdFtpXSkpKQorCQkJeworCQkJCWlkZW50ID0gbG9jYXRpb24gPSAwOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlkZW50ID0gbGUxNl90b19jcHUoKCh0YWcgKiliaC0+Yl9kYXRhKS0+dGFnSWRlbnQpOworCQkJCWxvY2F0aW9uID0gbGUzMl90b19jcHUoKCh0YWcgKiliaC0+Yl9kYXRhKS0+dGFnTG9jYXRpb24pOworCQkJCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCQkJfQorCQorCQkJaWYgKGlkZW50ID09IFRBR19JREVOVF9BVkRQKQorCQkJeworCQkJCWlmIChsb2NhdGlvbiA9PSBsYXN0W2ldIC0gVURGX1NCX1NFU1NJT04oc2IpKQorCQkJCXsKKwkJCQkJbGFzdGJsb2NrID0gVURGX1NCX0FOQ0hPUihzYilbMF0gPSBsYXN0W2ldIC0gVURGX1NCX1NFU1NJT04oc2IpOworCQkJCQlVREZfU0JfQU5DSE9SKHNiKVsxXSA9IGxhc3RbaV0gLSAyNTYgLSBVREZfU0JfU0VTU0lPTihzYik7CisJCQkJfQorCQkJCWVsc2UgaWYgKGxvY2F0aW9uID09IHVkZl92YXJpYWJsZV90b19maXhlZChsYXN0W2ldKSAtIFVERl9TQl9TRVNTSU9OKHNiKSkKKwkJCQl7CisJCQkJCVVERl9TRVRfRkxBRyhzYiwgVURGX0ZMQUdfVkFSQ09OVik7CisJCQkJCWxhc3RibG9jayA9IFVERl9TQl9BTkNIT1Ioc2IpWzBdID0gdWRmX3ZhcmlhYmxlX3RvX2ZpeGVkKGxhc3RbaV0pIC0gVURGX1NCX1NFU1NJT04oc2IpOworCQkJCQlVREZfU0JfQU5DSE9SKHNiKVsxXSA9IGxhc3RibG9jayAtIDI1NiAtIFVERl9TQl9TRVNTSU9OKHNiKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCQl1ZGZfZGVidWcoIkFuY2hvciBmb3VuZCBhdCBibG9jayAlZCwgbG9jYXRpb24gbWlzbWF0Y2ggJWQuXG4iLAorCQkJCQkJbGFzdFtpXSwgbG9jYXRpb24pOworCQkJfQorCQkJZWxzZSBpZiAoaWRlbnQgPT0gVEFHX0lERU5UX0ZFIHx8IGlkZW50ID09IFRBR19JREVOVF9FRkUpCisJCQl7CisJCQkJbGFzdGJsb2NrID0gbGFzdFtpXTsKKwkJCQlVREZfU0JfQU5DSE9SKHNiKVszXSA9IDUxMjsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlpZiAobGFzdFtpXSA8IDI1NiB8fCAhKGJoID0gc2JfYnJlYWQoc2IsIGxhc3RbaV0gLSAyNTYpKSkKKwkJCQl7CisJCQkJCWlkZW50ID0gbG9jYXRpb24gPSAwOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlpZGVudCA9IGxlMTZfdG9fY3B1KCgodGFnICopYmgtPmJfZGF0YSktPnRhZ0lkZW50KTsKKwkJCQkJbG9jYXRpb24gPSBsZTMyX3RvX2NwdSgoKHRhZyAqKWJoLT5iX2RhdGEpLT50YWdMb2NhdGlvbik7CisJCQkJCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCQkJCX0KKwkKKwkJCQlpZiAoaWRlbnQgPT0gVEFHX0lERU5UX0FWRFAgJiYKKwkJCQkJbG9jYXRpb24gPT0gbGFzdFtpXSAtIDI1NiAtIFVERl9TQl9TRVNTSU9OKHNiKSkKKwkJCQl7CisJCQkJCWxhc3RibG9jayA9IGxhc3RbaV07CisJCQkJCVVERl9TQl9BTkNIT1Ioc2IpWzFdID0gbGFzdFtpXSAtIDI1NjsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJaWYgKGxhc3RbaV0gPCAzMTIgKyBVREZfU0JfU0VTU0lPTihzYikgfHwgIShiaCA9IHNiX2JyZWFkKHNiLCBsYXN0W2ldIC0gMzEyIC0gVURGX1NCX1NFU1NJT04oc2IpKSkpCisJCQkJCXsKKwkJCQkJCWlkZW50ID0gbG9jYXRpb24gPSAwOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJeworCQkJCQkJaWRlbnQgPSBsZTE2X3RvX2NwdSgoKHRhZyAqKWJoLT5iX2RhdGEpLT50YWdJZGVudCk7CisJCQkJCQlsb2NhdGlvbiA9IGxlMzJfdG9fY3B1KCgodGFnICopYmgtPmJfZGF0YSktPnRhZ0xvY2F0aW9uKTsKKwkJCQkJCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCQkJCQl9CisJCisJCQkJCWlmIChpZGVudCA9PSBUQUdfSURFTlRfQVZEUCAmJgorCQkJCQkJbG9jYXRpb24gPT0gdWRmX3ZhcmlhYmxlX3RvX2ZpeGVkKGxhc3RbaV0pIC0gMjU2KQorCQkJCQl7CisJCQkJCQlVREZfU0VUX0ZMQUcoc2IsIFVERl9GTEFHX1ZBUkNPTlYpOworCQkJCQkJbGFzdGJsb2NrID0gdWRmX3ZhcmlhYmxlX3RvX2ZpeGVkKGxhc3RbaV0pOworCQkJCQkJVURGX1NCX0FOQ0hPUihzYilbMV0gPSBsYXN0YmxvY2sgLSAyNTY7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZiAoIWxhc3RibG9jaykKKwl7CisJCS8qIFdlIGhhdm4ndCBmb3VuZCB0aGUgbGFzdGJsb2NrLiBjaGVjayAzMTIgKi8KKwkJaWYgKChiaCA9IHNiX2JyZWFkKHNiLCAzMTIgKyBVREZfU0JfU0VTU0lPTihzYikpKSkKKwkJeworCQkJaWRlbnQgPSBsZTE2X3RvX2NwdSgoKHRhZyAqKWJoLT5iX2RhdGEpLT50YWdJZGVudCk7CisJCQlsb2NhdGlvbiA9IGxlMzJfdG9fY3B1KCgodGFnICopYmgtPmJfZGF0YSktPnRhZ0xvY2F0aW9uKTsKKwkJCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCisJCQlpZiAoaWRlbnQgPT0gVEFHX0lERU5UX0FWRFAgJiYgbG9jYXRpb24gPT0gMjU2KQorCQkJCVVERl9TRVRfRkxBRyhzYiwgVURGX0ZMQUdfVkFSQ09OVik7CisJCX0KKwl9CisKKwlmb3IgKGk9MDsgaTxzaXplb2YoVURGX1NCX0FOQ0hPUihzYikpL3NpemVvZihpbnQpOyBpKyspCisJeworCQlpZiAoVURGX1NCX0FOQ0hPUihzYilbaV0pCisJCXsKKwkJCWlmICghKGJoID0gdWRmX3JlYWRfdGFnZ2VkKHNiLAorCQkJCVVERl9TQl9BTkNIT1Ioc2IpW2ldLCBVREZfU0JfQU5DSE9SKHNiKVtpXSwgJmlkZW50KSkpCisJCQl7CisJCQkJVURGX1NCX0FOQ0hPUihzYilbaV0gPSAwOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCQkJCWlmICgoaWRlbnQgIT0gVEFHX0lERU5UX0FWRFApICYmIChpIHx8CisJCQkJCShpZGVudCAhPSBUQUdfSURFTlRfRkUgJiYgaWRlbnQgIT0gVEFHX0lERU5UX0VGRSkpKQorCQkJCXsKKwkJCQkJVURGX1NCX0FOQ0hPUihzYilbaV0gPSAwOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCVVERl9TQl9MQVNUQkxPQ0soc2IpID0gbGFzdGJsb2NrOworfQorCitzdGF0aWMgaW50IAordWRmX2ZpbmRfZmlsZXNldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBrZXJuZWxfbGJfYWRkciAqZmlsZXNldCwga2VybmVsX2xiX2FkZHIgKnJvb3QpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJbG9uZyBsYXN0YmxvY2s7CisJdWludDE2X3QgaWRlbnQ7CisKKwlpZiAoZmlsZXNldC0+bG9naWNhbEJsb2NrTnVtICE9IDB4RkZGRkZGRkYgfHwKKwkJZmlsZXNldC0+cGFydGl0aW9uUmVmZXJlbmNlTnVtICE9IDB4RkZGRikKKwl7CisJCWJoID0gdWRmX3JlYWRfcHRhZ2dlZChzYiwgKmZpbGVzZXQsIDAsICZpZGVudCk7CisKKwkJaWYgKCFiaCkKKwkJCXJldHVybiAxOworCQllbHNlIGlmIChpZGVudCAhPSBUQUdfSURFTlRfRlNEKQorCQl7CisJCQl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKwkJCXJldHVybiAxOworCQl9CisJCQkKKwl9CisKKwlpZiAoIWJoKSAvKiBTZWFyY2ggYmFja3dhcmRzIHRocm91Z2ggdGhlIHBhcnRpdGlvbnMgKi8KKwl7CisJCWtlcm5lbF9sYl9hZGRyIG5ld2ZpbGVzZXQ7CisKKwkJcmV0dXJuIDE7CisJCQorCQlmb3IgKG5ld2ZpbGVzZXQucGFydGl0aW9uUmVmZXJlbmNlTnVtPVVERl9TQl9OVU1QQVJUUyhzYiktMTsKKwkJCShuZXdmaWxlc2V0LnBhcnRpdGlvblJlZmVyZW5jZU51bSAhPSAweEZGRkYgJiYKKwkJCQlmaWxlc2V0LT5sb2dpY2FsQmxvY2tOdW0gPT0gMHhGRkZGRkZGRiAmJgorCQkJCWZpbGVzZXQtPnBhcnRpdGlvblJlZmVyZW5jZU51bSA9PSAweEZGRkYpOworCQkJbmV3ZmlsZXNldC5wYXJ0aXRpb25SZWZlcmVuY2VOdW0tLSkKKwkJeworCQkJbGFzdGJsb2NrID0gVURGX1NCX1BBUlRMRU4oc2IsIG5ld2ZpbGVzZXQucGFydGl0aW9uUmVmZXJlbmNlTnVtKTsKKwkJCW5ld2ZpbGVzZXQubG9naWNhbEJsb2NrTnVtID0gMDsKKworCQkJZG8KKwkJCXsKKwkJCQliaCA9IHVkZl9yZWFkX3B0YWdnZWQoc2IsIG5ld2ZpbGVzZXQsIDAsICZpZGVudCk7CisJCQkJaWYgKCFiaCkKKwkJCQl7CisJCQkJCW5ld2ZpbGVzZXQubG9naWNhbEJsb2NrTnVtICsrOworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlzd2l0Y2ggKGlkZW50KQorCQkJCXsKKwkJCQkJY2FzZSBUQUdfSURFTlRfU0JEOgorCQkJCQl7CisJCQkJCQlzdHJ1Y3Qgc3BhY2VCaXRtYXBEZXNjICpzcDsKKwkJCQkJCXNwID0gKHN0cnVjdCBzcGFjZUJpdG1hcERlc2MgKiliaC0+Yl9kYXRhOworCQkJCQkJbmV3ZmlsZXNldC5sb2dpY2FsQmxvY2tOdW0gKz0gMSArCisJCQkJCQkJKChsZTMyX3RvX2NwdShzcC0+bnVtT2ZCeXRlcykgKyBzaXplb2Yoc3RydWN0IHNwYWNlQml0bWFwRGVzYykgLSAxKQorCQkJCQkJCQk+PiBzYi0+c19ibG9ja3NpemVfYml0cyk7CisJCQkJCQl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWNhc2UgVEFHX0lERU5UX0ZTRDoKKwkJCQkJeworCQkJCQkJKmZpbGVzZXQgPSBuZXdmaWxlc2V0OworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJZGVmYXVsdDoKKwkJCQkJeworCQkJCQkJbmV3ZmlsZXNldC5sb2dpY2FsQmxvY2tOdW0gKys7CisJCQkJCQl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKwkJCQkJCWJoID0gTlVMTDsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJd2hpbGUgKG5ld2ZpbGVzZXQubG9naWNhbEJsb2NrTnVtIDwgbGFzdGJsb2NrICYmCisJCQkJZmlsZXNldC0+bG9naWNhbEJsb2NrTnVtID09IDB4RkZGRkZGRkYgJiYKKwkJCQlmaWxlc2V0LT5wYXJ0aXRpb25SZWZlcmVuY2VOdW0gPT0gMHhGRkZGKTsKKwkJfQorCX0KKworCWlmICgoZmlsZXNldC0+bG9naWNhbEJsb2NrTnVtICE9IDB4RkZGRkZGRkYgfHwKKwkJZmlsZXNldC0+cGFydGl0aW9uUmVmZXJlbmNlTnVtICE9IDB4RkZGRikgJiYgYmgpCisJeworCQl1ZGZfZGVidWcoIkZpbGVzZXQgYXQgYmxvY2s9JWQsIHBhcnRpdGlvbj0lZFxuIiwKKwkJCWZpbGVzZXQtPmxvZ2ljYWxCbG9ja051bSwgZmlsZXNldC0+cGFydGl0aW9uUmVmZXJlbmNlTnVtKTsKKworCQlVREZfU0JfUEFSVElUSU9OKHNiKSA9IGZpbGVzZXQtPnBhcnRpdGlvblJlZmVyZW5jZU51bTsKKwkJdWRmX2xvYWRfZmlsZXNldChzYiwgYmgsIHJvb3QpOworCQl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCAKK3VkZl9sb2FkX3B2b2xkZXNjKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJc3RydWN0IHByaW1hcnlWb2xEZXNjICpwdm9sZGVzYzsKKwl0aW1lX3QgcmVjb3JkaW5nOworCWxvbmcgcmVjb3JkaW5nX3VzZWM7CisJc3RydWN0IHVzdHIgaW5zdHI7CisJc3RydWN0IHVzdHIgb3V0c3RyOworCisJcHZvbGRlc2MgPSAoc3RydWN0IHByaW1hcnlWb2xEZXNjICopYmgtPmJfZGF0YTsKKworCWlmICggdWRmX3N0YW1wX3RvX3RpbWUoJnJlY29yZGluZywgJnJlY29yZGluZ191c2VjLAorCQlsZXRzX3RvX2NwdShwdm9sZGVzYy0+cmVjb3JkaW5nRGF0ZUFuZFRpbWUpKSApCisJeworCQlrZXJuZWxfdGltZXN0YW1wIHRzOworCQl0cyA9IGxldHNfdG9fY3B1KHB2b2xkZXNjLT5yZWNvcmRpbmdEYXRlQW5kVGltZSk7CisJCXVkZl9kZWJ1ZygicmVjb3JkaW5nIHRpbWUgJWxkLyVsZCwgJTA0dS8lMDJ1LyUwMnUgJTAydTolMDJ1ICgleClcbiIsCisJCQlyZWNvcmRpbmcsIHJlY29yZGluZ191c2VjLAorCQkJdHMueWVhciwgdHMubW9udGgsIHRzLmRheSwgdHMuaG91ciwgdHMubWludXRlLCB0cy50eXBlQW5kVGltZXpvbmUpOworCQlVREZfU0JfUkVDT1JEVElNRShzYikudHZfc2VjID0gcmVjb3JkaW5nOworCQlVREZfU0JfUkVDT1JEVElNRShzYikudHZfbnNlYyA9IHJlY29yZGluZ191c2VjICogMTAwMDsKKwl9CisKKwlpZiAoICF1ZGZfYnVpbGRfdXN0cigmaW5zdHIsIHB2b2xkZXNjLT52b2xJZGVudCwgMzIpICkKKwl7CisJCWlmICh1ZGZfQ1MwdG9VVEY4KCZvdXRzdHIsICZpbnN0cikpCisJCXsKKwkJCXN0cm5jcHkoIFVERl9TQl9WT0xJREVOVChzYiksIG91dHN0ci51X25hbWUsCisJCQkJb3V0c3RyLnVfbGVuID4gMzEgPyAzMSA6IG91dHN0ci51X2xlbik7CisJCQl1ZGZfZGVidWcoInZvbElkZW50W10gPSAnJXMnXG4iLCBVREZfU0JfVk9MSURFTlQoc2IpKTsKKwkJfQorCX0KKworCWlmICggIXVkZl9idWlsZF91c3RyKCZpbnN0ciwgcHZvbGRlc2MtPnZvbFNldElkZW50LCAxMjgpICkKKwl7CisJCWlmICh1ZGZfQ1MwdG9VVEY4KCZvdXRzdHIsICZpbnN0cikpCisJCQl1ZGZfZGVidWcoInZvbFNldElkZW50W10gPSAnJXMnXG4iLCBvdXRzdHIudV9uYW1lKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIAordWRmX2xvYWRfZmlsZXNldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBrZXJuZWxfbGJfYWRkciAqcm9vdCkKK3sKKwlzdHJ1Y3QgZmlsZVNldERlc2MgKmZzZXQ7CisKKwlmc2V0ID0gKHN0cnVjdCBmaWxlU2V0RGVzYyAqKWJoLT5iX2RhdGE7CisKKwkqcm9vdCA9IGxlbGJfdG9fY3B1KGZzZXQtPnJvb3REaXJlY3RvcnlJQ0IuZXh0TG9jYXRpb24pOworCisJVURGX1NCX1NFUklBTE5VTShzYikgPSBsZTE2X3RvX2NwdShmc2V0LT5kZXNjVGFnLnRhZ1NlcmlhbE51bSk7CisKKwl1ZGZfZGVidWcoIlJvb3RkaXIgYXQgYmxvY2s9JWQsIHBhcnRpdGlvbj0lZFxuIiwgCisJCXJvb3QtPmxvZ2ljYWxCbG9ja051bSwgcm9vdC0+cGFydGl0aW9uUmVmZXJlbmNlTnVtKTsKK30KKworc3RhdGljIHZvaWQgCit1ZGZfbG9hZF9wYXJ0ZGVzYyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQoreworCXN0cnVjdCBwYXJ0aXRpb25EZXNjICpwOworCWludCBpOworCisJcCA9IChzdHJ1Y3QgcGFydGl0aW9uRGVzYyAqKWJoLT5iX2RhdGE7CisKKwlmb3IgKGk9MDsgaTxVREZfU0JfTlVNUEFSVFMoc2IpOyBpKyspCisJeworCQl1ZGZfZGVidWcoIlNlYXJjaGluZyBtYXA6ICglZCA9PSAlZClcbiIsIAorCQkJVURGX1NCX1BBUlRNQVBTKHNiKVtpXS5zX3BhcnRpdGlvbl9udW0sIGxlMTZfdG9fY3B1KHAtPnBhcnRpdGlvbk51bWJlcikpOworCQlpZiAoVURGX1NCX1BBUlRNQVBTKHNiKVtpXS5zX3BhcnRpdGlvbl9udW0gPT0gbGUxNl90b19jcHUocC0+cGFydGl0aW9uTnVtYmVyKSkKKwkJeworCQkJVURGX1NCX1BBUlRMRU4oc2IsaSkgPSBsZTMyX3RvX2NwdShwLT5wYXJ0aXRpb25MZW5ndGgpOyAvKiBibG9ja3MgKi8KKwkJCVVERl9TQl9QQVJUUk9PVChzYixpKSA9IGxlMzJfdG9fY3B1KHAtPnBhcnRpdGlvblN0YXJ0aW5nTG9jYXRpb24pOworCQkJaWYgKGxlMzJfdG9fY3B1KHAtPmFjY2Vzc1R5cGUpID09IFBEX0FDQ0VTU19UWVBFX1JFQURfT05MWSkKKwkJCQlVREZfU0JfUEFSVEZMQUdTKHNiLGkpIHw9IFVERl9QQVJUX0ZMQUdfUkVBRF9PTkxZOworCQkJaWYgKGxlMzJfdG9fY3B1KHAtPmFjY2Vzc1R5cGUpID09IFBEX0FDQ0VTU19UWVBFX1dSSVRFX09OQ0UpCisJCQkJVURGX1NCX1BBUlRGTEFHUyhzYixpKSB8PSBVREZfUEFSVF9GTEFHX1dSSVRFX09OQ0U7CisJCQlpZiAobGUzMl90b19jcHUocC0+YWNjZXNzVHlwZSkgPT0gUERfQUNDRVNTX1RZUEVfUkVXUklUQUJMRSkKKwkJCQlVREZfU0JfUEFSVEZMQUdTKHNiLGkpIHw9IFVERl9QQVJUX0ZMQUdfUkVXUklUQUJMRTsKKwkJCWlmIChsZTMyX3RvX2NwdShwLT5hY2Nlc3NUeXBlKSA9PSBQRF9BQ0NFU1NfVFlQRV9PVkVSV1JJVEFCTEUpCisJCQkJVURGX1NCX1BBUlRGTEFHUyhzYixpKSB8PSBVREZfUEFSVF9GTEFHX09WRVJXUklUQUJMRTsKKworCQkJaWYgKCFzdHJjbXAocC0+cGFydGl0aW9uQ29udGVudHMuaWRlbnQsIFBEX1BBUlRJVElPTl9DT05URU5UU19OU1IwMikgfHwKKwkJCQkhc3RyY21wKHAtPnBhcnRpdGlvbkNvbnRlbnRzLmlkZW50LCBQRF9QQVJUSVRJT05fQ09OVEVOVFNfTlNSMDMpKQorCQkJeworCQkJCXN0cnVjdCBwYXJ0aXRpb25IZWFkZXJEZXNjICpwaGQ7CisKKwkJCQlwaGQgPSAoc3RydWN0IHBhcnRpdGlvbkhlYWRlckRlc2MgKikocC0+cGFydGl0aW9uQ29udGVudHNVc2UpOworCQkJCWlmIChwaGQtPnVuYWxsb2NTcGFjZVRhYmxlLmV4dExlbmd0aCkKKwkJCQl7CisJCQkJCWtlcm5lbF9sYl9hZGRyIGxvYyA9IHsgbGUzMl90b19jcHUocGhkLT51bmFsbG9jU3BhY2VUYWJsZS5leHRQb3NpdGlvbiksIGkgfTsKKworCQkJCQlVREZfU0JfUEFSVE1BUFMoc2IpW2ldLnNfdXNwYWNlLnNfdGFibGUgPQorCQkJCQkJdWRmX2lnZXQoc2IsIGxvYyk7CisJCQkJCVVERl9TQl9QQVJURkxBR1Moc2IsaSkgfD0gVURGX1BBUlRfRkxBR19VTkFMTE9DX1RBQkxFOworCQkJCQl1ZGZfZGVidWcoInVuYWxsb2NTcGFjZVRhYmxlIChwYXJ0ICVkKSBAICVsZFxuIiwKKwkJCQkJCWksIFVERl9TQl9QQVJUTUFQUyhzYilbaV0uc191c3BhY2Uuc190YWJsZS0+aV9pbm8pOworCQkJCX0KKwkJCQlpZiAocGhkLT51bmFsbG9jU3BhY2VCaXRtYXAuZXh0TGVuZ3RoKQorCQkJCXsKKwkJCQkJVURGX1NCX0FMTE9DX0JJVE1BUChzYiwgaSwgc191c3BhY2UpOworCQkJCQlpZiAoVURGX1NCX1BBUlRNQVBTKHNiKVtpXS5zX3VzcGFjZS5zX2JpdG1hcCAhPSBOVUxMKQorCQkJCQl7CisJCQkJCQlVREZfU0JfUEFSVE1BUFMoc2IpW2ldLnNfdXNwYWNlLnNfYml0bWFwLT5zX2V4dExlbmd0aCA9CisJCQkJCQkJbGUzMl90b19jcHUocGhkLT51bmFsbG9jU3BhY2VCaXRtYXAuZXh0TGVuZ3RoKTsKKwkJCQkJCVVERl9TQl9QQVJUTUFQUyhzYilbaV0uc191c3BhY2Uuc19iaXRtYXAtPnNfZXh0UG9zaXRpb24gPQorCQkJCQkJCWxlMzJfdG9fY3B1KHBoZC0+dW5hbGxvY1NwYWNlQml0bWFwLmV4dFBvc2l0aW9uKTsKKwkJCQkJCVVERl9TQl9QQVJURkxBR1Moc2IsaSkgfD0gVURGX1BBUlRfRkxBR19VTkFMTE9DX0JJVE1BUDsKKwkJCQkJCXVkZl9kZWJ1ZygidW5hbGxvY1NwYWNlQml0bWFwIChwYXJ0ICVkKSBAICVkXG4iLAorCQkJCQkJCWksIFVERl9TQl9QQVJUTUFQUyhzYilbaV0uc191c3BhY2Uuc19iaXRtYXAtPnNfZXh0UG9zaXRpb24pOworCQkJCQl9CisJCQkJfQorCQkJCWlmIChwaGQtPnBhcnRpdGlvbkludGVncml0eVRhYmxlLmV4dExlbmd0aCkKKwkJCQkJdWRmX2RlYnVnKCJwYXJ0aXRpb25JbnRlZ3JpdHlUYWJsZSAocGFydCAlZClcbiIsIGkpOworCQkJCWlmIChwaGQtPmZyZWVkU3BhY2VUYWJsZS5leHRMZW5ndGgpCisJCQkJeworCQkJCQlrZXJuZWxfbGJfYWRkciBsb2MgPSB7IGxlMzJfdG9fY3B1KHBoZC0+ZnJlZWRTcGFjZVRhYmxlLmV4dFBvc2l0aW9uKSwgaSB9OworCisJCQkJCVVERl9TQl9QQVJUTUFQUyhzYilbaV0uc19mc3BhY2Uuc190YWJsZSA9CisJCQkJCQl1ZGZfaWdldChzYiwgbG9jKTsKKwkJCQkJVURGX1NCX1BBUlRGTEFHUyhzYixpKSB8PSBVREZfUEFSVF9GTEFHX0ZSRUVEX1RBQkxFOworCQkJCQl1ZGZfZGVidWcoImZyZWVkU3BhY2VUYWJsZSAocGFydCAlZCkgQCAlbGRcbiIsCisJCQkJCQlpLCBVREZfU0JfUEFSVE1BUFMoc2IpW2ldLnNfZnNwYWNlLnNfdGFibGUtPmlfaW5vKTsKKwkJCQl9CisJCQkJaWYgKHBoZC0+ZnJlZWRTcGFjZUJpdG1hcC5leHRMZW5ndGgpCisJCQkJeworCQkJCQlVREZfU0JfQUxMT0NfQklUTUFQKHNiLCBpLCBzX2ZzcGFjZSk7CisJCQkJCWlmIChVREZfU0JfUEFSVE1BUFMoc2IpW2ldLnNfZnNwYWNlLnNfYml0bWFwICE9IE5VTEwpCisJCQkJCXsKKwkJCQkJCVVERl9TQl9QQVJUTUFQUyhzYilbaV0uc19mc3BhY2Uuc19iaXRtYXAtPnNfZXh0TGVuZ3RoID0KKwkJCQkJCQlsZTMyX3RvX2NwdShwaGQtPmZyZWVkU3BhY2VCaXRtYXAuZXh0TGVuZ3RoKTsKKwkJCQkJCVVERl9TQl9QQVJUTUFQUyhzYilbaV0uc19mc3BhY2Uuc19iaXRtYXAtPnNfZXh0UG9zaXRpb24gPQorCQkJCQkJCWxlMzJfdG9fY3B1KHBoZC0+ZnJlZWRTcGFjZUJpdG1hcC5leHRQb3NpdGlvbik7CisJCQkJCQlVREZfU0JfUEFSVEZMQUdTKHNiLGkpIHw9IFVERl9QQVJUX0ZMQUdfRlJFRURfQklUTUFQOworCQkJCQkJdWRmX2RlYnVnKCJmcmVlZFNwYWNlQml0bWFwIChwYXJ0ICVkKSBAICVkXG4iLAorCQkJCQkJCWksIFVERl9TQl9QQVJUTUFQUyhzYilbaV0uc19mc3BhY2Uuc19iaXRtYXAtPnNfZXh0UG9zaXRpb24pOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGkgPT0gVURGX1NCX05VTVBBUlRTKHNiKSkKKwl7CisJCXVkZl9kZWJ1ZygiUGFydGl0aW9uICglZCkgbm90IGZvdW5kIGluIHBhcnRpdGlvbiBtYXBcbiIsIGxlMTZfdG9fY3B1KHAtPnBhcnRpdGlvbk51bWJlcikpOworCX0KKwllbHNlCisJeworCQl1ZGZfZGVidWcoIlBhcnRpdGlvbiAoJWQ6JWQgdHlwZSAleCkgc3RhcnRzIGF0IHBoeXNpY2FsICVkLCBibG9jayBsZW5ndGggJWRcbiIsCisJCQlsZTE2X3RvX2NwdShwLT5wYXJ0aXRpb25OdW1iZXIpLCBpLCBVREZfU0JfUEFSVFRZUEUoc2IsaSksCisJCQlVREZfU0JfUEFSVFJPT1Qoc2IsaSksIFVERl9TQl9QQVJUTEVOKHNiLGkpKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgCit1ZGZfbG9hZF9sb2dpY2Fsdm9sKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBidWZmZXJfaGVhZCAqIGJoLCBrZXJuZWxfbGJfYWRkciAqZmlsZXNldCkKK3sKKwlzdHJ1Y3QgbG9naWNhbFZvbERlc2MgKmx2ZDsKKwlpbnQgaSwgaiwgb2Zmc2V0OworCXVpbnQ4X3QgdHlwZTsKKworCWx2ZCA9IChzdHJ1Y3QgbG9naWNhbFZvbERlc2MgKiliaC0+Yl9kYXRhOworCisJVURGX1NCX0FMTE9DX1BBUlRNQVBTKHNiLCBsZTMyX3RvX2NwdShsdmQtPm51bVBhcnRpdGlvbk1hcHMpKTsKKworCWZvciAoaT0wLG9mZnNldD0wOworCQkgaTxVREZfU0JfTlVNUEFSVFMoc2IpICYmIG9mZnNldDxsZTMyX3RvX2NwdShsdmQtPm1hcFRhYmxlTGVuZ3RoKTsKKwkJIGkrKyxvZmZzZXQrPSgoc3RydWN0IGdlbmVyaWNQYXJ0aXRpb25NYXAgKikmKGx2ZC0+cGFydGl0aW9uTWFwc1tvZmZzZXRdKSktPnBhcnRpdGlvbk1hcExlbmd0aCkKKwl7CisJCXR5cGUgPSAoKHN0cnVjdCBnZW5lcmljUGFydGl0aW9uTWFwICopJihsdmQtPnBhcnRpdGlvbk1hcHNbb2Zmc2V0XSkpLT5wYXJ0aXRpb25NYXBUeXBlOworCQlpZiAodHlwZSA9PSAxKQorCQl7CisJCQlzdHJ1Y3QgZ2VuZXJpY1BhcnRpdGlvbk1hcDEgKmdwbTEgPSAoc3RydWN0IGdlbmVyaWNQYXJ0aXRpb25NYXAxICopJihsdmQtPnBhcnRpdGlvbk1hcHNbb2Zmc2V0XSk7CisJCQlVREZfU0JfUEFSVFRZUEUoc2IsaSkgPSBVREZfVFlQRTFfTUFQMTU7CisJCQlVREZfU0JfUEFSVFZTTihzYixpKSA9IGxlMTZfdG9fY3B1KGdwbTEtPnZvbFNlcU51bSk7CisJCQlVREZfU0JfUEFSVE5VTShzYixpKSA9IGxlMTZfdG9fY3B1KGdwbTEtPnBhcnRpdGlvbk51bSk7CisJCQlVREZfU0JfUEFSVEZVTkMoc2IsaSkgPSBOVUxMOworCQl9CisJCWVsc2UgaWYgKHR5cGUgPT0gMikKKwkJeworCQkJc3RydWN0IHVkZlBhcnRpdGlvbk1hcDIgKnVwbTIgPSAoc3RydWN0IHVkZlBhcnRpdGlvbk1hcDIgKikmKGx2ZC0+cGFydGl0aW9uTWFwc1tvZmZzZXRdKTsKKwkJCWlmICghc3RybmNtcCh1cG0yLT5wYXJ0SWRlbnQuaWRlbnQsIFVERl9JRF9WSVJUVUFMLCBzdHJsZW4oVURGX0lEX1ZJUlRVQUwpKSkKKwkJCXsKKwkJCQlpZiAobGUxNl90b19jcHUoKChfX2xlMTYgKil1cG0yLT5wYXJ0SWRlbnQuaWRlbnRTdWZmaXgpWzBdKSA9PSAweDAxNTApCisJCQkJeworCQkJCQlVREZfU0JfUEFSVFRZUEUoc2IsaSkgPSBVREZfVklSVFVBTF9NQVAxNTsKKwkJCQkJVURGX1NCX1BBUlRGVU5DKHNiLGkpID0gdWRmX2dldF9wYmxvY2tfdmlydDE1OworCQkJCX0KKwkJCQllbHNlIGlmIChsZTE2X3RvX2NwdSgoKF9fbGUxNiAqKXVwbTItPnBhcnRJZGVudC5pZGVudFN1ZmZpeClbMF0pID09IDB4MDIwMCkKKwkJCQl7CisJCQkJCVVERl9TQl9QQVJUVFlQRShzYixpKSA9IFVERl9WSVJUVUFMX01BUDIwOworCQkJCQlVREZfU0JfUEFSVEZVTkMoc2IsaSkgPSB1ZGZfZ2V0X3BibG9ja192aXJ0MjA7CisJCQkJfQorCQkJfQorCQkJZWxzZSBpZiAoIXN0cm5jbXAodXBtMi0+cGFydElkZW50LmlkZW50LCBVREZfSURfU1BBUkFCTEUsIHN0cmxlbihVREZfSURfU1BBUkFCTEUpKSkKKwkJCXsKKwkJCQl1aW50MzJfdCBsb2M7CisJCQkJdWludDE2X3QgaWRlbnQ7CisJCQkJc3RydWN0IHNwYXJpbmdUYWJsZSAqc3Q7CisJCQkJc3RydWN0IHNwYXJhYmxlUGFydGl0aW9uTWFwICpzcG0gPSAoc3RydWN0IHNwYXJhYmxlUGFydGl0aW9uTWFwICopJihsdmQtPnBhcnRpdGlvbk1hcHNbb2Zmc2V0XSk7CisKKwkJCQlVREZfU0JfUEFSVFRZUEUoc2IsaSkgPSBVREZfU1BBUkFCTEVfTUFQMTU7CisJCQkJVURGX1NCX1RZUEVTUEFSKHNiLGkpLnNfcGFja2V0X2xlbiA9IGxlMTZfdG9fY3B1KHNwbS0+cGFja2V0TGVuZ3RoKTsKKwkJCQlmb3IgKGo9MDsgajxzcG0tPm51bVNwYXJpbmdUYWJsZXM7IGorKykKKwkJCQl7CisJCQkJCWxvYyA9IGxlMzJfdG9fY3B1KHNwbS0+bG9jU3BhcmluZ1RhYmxlW2pdKTsKKwkJCQkJVURGX1NCX1RZUEVTUEFSKHNiLGkpLnNfc3Bhcl9tYXBbal0gPQorCQkJCQkJdWRmX3JlYWRfdGFnZ2VkKHNiLCBsb2MsIGxvYywgJmlkZW50KTsKKwkJCQkJaWYgKFVERl9TQl9UWVBFU1BBUihzYixpKS5zX3NwYXJfbWFwW2pdICE9IE5VTEwpCisJCQkJCXsKKwkJCQkJCXN0ID0gKHN0cnVjdCBzcGFyaW5nVGFibGUgKilVREZfU0JfVFlQRVNQQVIoc2IsaSkuc19zcGFyX21hcFtqXS0+Yl9kYXRhOworCQkJCQkJaWYgKGlkZW50ICE9IDAgfHwKKwkJCQkJCQlzdHJuY21wKHN0LT5zcGFyaW5nSWRlbnQuaWRlbnQsIFVERl9JRF9TUEFSSU5HLCBzdHJsZW4oVURGX0lEX1NQQVJJTkcpKSkKKwkJCQkJCXsKKwkJCQkJCQl1ZGZfcmVsZWFzZV9kYXRhKFVERl9TQl9UWVBFU1BBUihzYixpKS5zX3NwYXJfbWFwW2pdKTsKKwkJCQkJCQlVREZfU0JfVFlQRVNQQVIoc2IsaSkuc19zcGFyX21hcFtqXSA9IE5VTEw7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJVURGX1NCX1BBUlRGVU5DKHNiLGkpID0gdWRmX2dldF9wYmxvY2tfc3BhcjE1OworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXVkZl9kZWJ1ZygiVW5rbm93biBpZGVudDogJXNcbiIsIHVwbTItPnBhcnRJZGVudC5pZGVudCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlVREZfU0JfUEFSVFZTTihzYixpKSA9IGxlMTZfdG9fY3B1KHVwbTItPnZvbFNlcU51bSk7CisJCQlVREZfU0JfUEFSVE5VTShzYixpKSA9IGxlMTZfdG9fY3B1KHVwbTItPnBhcnRpdGlvbk51bSk7CisJCX0KKwkJdWRmX2RlYnVnKCJQYXJ0aXRpb24gKCVkOiVkKSB0eXBlICVkIG9uIHZvbHVtZSAlZFxuIiwKKwkJCWksIFVERl9TQl9QQVJUTlVNKHNiLGkpLCB0eXBlLCBVREZfU0JfUEFSVFZTTihzYixpKSk7CisJfQorCisJaWYgKGZpbGVzZXQpCisJeworCQlsb25nX2FkICpsYSA9IChsb25nX2FkICopJihsdmQtPmxvZ2ljYWxWb2xDb250ZW50c1VzZVswXSk7CisKKwkJKmZpbGVzZXQgPSBsZWxiX3RvX2NwdShsYS0+ZXh0TG9jYXRpb24pOworCQl1ZGZfZGVidWcoIkZpbGVTZXQgZm91bmQgaW4gTG9naWNhbFZvbERlc2MgYXQgYmxvY2s9JWQsIHBhcnRpdGlvbj0lZFxuIiwKKwkJCWZpbGVzZXQtPmxvZ2ljYWxCbG9ja051bSwKKwkJCWZpbGVzZXQtPnBhcnRpdGlvblJlZmVyZW5jZU51bSk7CisJfQorCWlmIChsdmQtPmludGVncml0eVNlcUV4dC5leHRMZW5ndGgpCisJCXVkZl9sb2FkX2xvZ2ljYWx2b2xpbnQoc2IsIGxlZWFfdG9fY3B1KGx2ZC0+aW50ZWdyaXR5U2VxRXh0KSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB1ZGZfbG9hZF9sb2dpY2Fsdm9saW50CisgKgorICovCitzdGF0aWMgdm9pZAordWRmX2xvYWRfbG9naWNhbHZvbGludChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBrZXJuZWxfZXh0ZW50X2FkIGxvYykKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwl1aW50MTZfdCBpZGVudDsKKworCXdoaWxlIChsb2MuZXh0TGVuZ3RoID4gMCAmJgorCQkoYmggPSB1ZGZfcmVhZF90YWdnZWQoc2IsIGxvYy5leHRMb2NhdGlvbiwKKwkJCWxvYy5leHRMb2NhdGlvbiwgJmlkZW50KSkgJiYKKwkJaWRlbnQgPT0gVEFHX0lERU5UX0xWSUQpCisJeworCQlVREZfU0JfTFZJREJIKHNiKSA9IGJoOworCQkKKwkJaWYgKFVERl9TQl9MVklEKHNiKS0+bmV4dEludGVncml0eUV4dC5leHRMZW5ndGgpCisJCQl1ZGZfbG9hZF9sb2dpY2Fsdm9saW50KHNiLCBsZWVhX3RvX2NwdShVREZfU0JfTFZJRChzYiktPm5leHRJbnRlZ3JpdHlFeHQpKTsKKwkJCisJCWlmIChVREZfU0JfTFZJREJIKHNiKSAhPSBiaCkKKwkJCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCQlsb2MuZXh0TGVuZ3RoIC09IHNiLT5zX2Jsb2Nrc2l6ZTsKKwkJbG9jLmV4dExvY2F0aW9uICsrOworCX0KKwlpZiAoVURGX1NCX0xWSURCSChzYikgIT0gYmgpCisJCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworfQorCisvKgorICogdWRmX3Byb2Nlc3Nfc2VxdWVuY2UKKyAqCisgKiBQVVJQT1NFCisgKglQcm9jZXNzIGEgbWFpbi9yZXNlcnZlIHZvbHVtZSBkZXNjcmlwdG9yIHNlcXVlbmNlLgorICoKKyAqIFBSRS1DT05ESVRJT05TCisgKglzYgkJCVBvaW50ZXIgdG8gX2xvY2tlZF8gc3VwZXJibG9jay4KKyAqCWJsb2NrCQkJRmlyc3QgYmxvY2sgb2YgZmlyc3QgZXh0ZW50IG9mIHRoZSBzZXF1ZW5jZS4KKyAqCWxhc3RibG9jawkJTGFzdGJsb2NrIG9mIGZpcnN0IGV4dGVudCBvZiB0aGUgc2VxdWVuY2UuCisgKgorICogSElTVE9SWQorICoJSnVseSAxLCAxOTk3IC0gQW5kcmV3IEUuIE1pbGVza2kKKyAqCVdyaXR0ZW4sIHRlc3RlZCwgYW5kIHJlbGVhc2VkLgorICovCitzdGF0aWMgIGludAordWRmX3Byb2Nlc3Nfc2VxdWVuY2Uoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgbG9uZyBibG9jaywgbG9uZyBsYXN0YmxvY2ssIGtlcm5lbF9sYl9hZGRyICpmaWxlc2V0KQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCXN0cnVjdCB1ZGZfdmRzX3JlY29yZCB2ZHNbVkRTX1BPU19MRU5HVEhdOworCXN0cnVjdCBnZW5lcmljX2Rlc2MgKmdkOworCXN0cnVjdCB2b2xEZXNjUHRyICp2ZHA7CisJaW50IGRvbmU9MDsKKwlpbnQgaSxqOworCXVpbnQzMl90IHZkc247CisJdWludDE2X3QgaWRlbnQ7CisJbG9uZyBuZXh0X3MgPSAwLCBuZXh0X2UgPSAwOworCisJbWVtc2V0KHZkcywgMCwgc2l6ZW9mKHN0cnVjdCB1ZGZfdmRzX3JlY29yZCkgKiBWRFNfUE9TX0xFTkdUSCk7CisKKwkvKiBSZWFkIHRoZSBtYWluIGRlc2NyaXB0b3Igc2VxdWVuY2UgKi8KKwlmb3IgKDsoIWRvbmUgJiYgYmxvY2sgPD0gbGFzdGJsb2NrKTsgYmxvY2srKykKKwl7CisKKwkJYmggPSB1ZGZfcmVhZF90YWdnZWQoc2IsIGJsb2NrLCBibG9jaywgJmlkZW50KTsKKwkJaWYgKCFiaCkgCisJCQlicmVhazsKKworCQkvKiBQcm9jZXNzIGVhY2ggZGVzY3JpcHRvciAoSVNPIDEzMzQ2IDMvOC4zLTguNCkgKi8KKwkJZ2QgPSAoc3RydWN0IGdlbmVyaWNfZGVzYyAqKWJoLT5iX2RhdGE7CisJCXZkc24gPSBsZTMyX3RvX2NwdShnZC0+dm9sRGVzY1NlcU51bSk7CisJCXN3aXRjaCAoaWRlbnQpCisJCXsKKwkJCWNhc2UgVEFHX0lERU5UX1BWRDogLyogSVNPIDEzMzQ2IDMvMTAuMSAqLworCQkJCWlmICh2ZHNuID49IHZkc1tWRFNfUE9TX1BSSU1BUllfVk9MX0RFU0NdLnZvbERlc2NTZXFOdW0pCisJCQkJeworCQkJCQl2ZHNbVkRTX1BPU19QUklNQVJZX1ZPTF9ERVNDXS52b2xEZXNjU2VxTnVtID0gdmRzbjsKKwkJCQkJdmRzW1ZEU19QT1NfUFJJTUFSWV9WT0xfREVTQ10uYmxvY2sgPSBibG9jazsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFRBR19JREVOVF9WRFA6IC8qIElTTyAxMzM0NiAzLzEwLjMgKi8KKwkJCQlpZiAodmRzbiA+PSB2ZHNbVkRTX1BPU19WT0xfREVTQ19QVFJdLnZvbERlc2NTZXFOdW0pCisJCQkJeworCQkJCQl2ZHNbVkRTX1BPU19WT0xfREVTQ19QVFJdLnZvbERlc2NTZXFOdW0gPSB2ZHNuOworCQkJCQl2ZHNbVkRTX1BPU19WT0xfREVTQ19QVFJdLmJsb2NrID0gYmxvY2s7CisKKwkJCQkJdmRwID0gKHN0cnVjdCB2b2xEZXNjUHRyICopYmgtPmJfZGF0YTsKKwkJCQkJbmV4dF9zID0gbGUzMl90b19jcHUodmRwLT5uZXh0Vm9sRGVzY1NlcUV4dC5leHRMb2NhdGlvbik7CisJCQkJCW5leHRfZSA9IGxlMzJfdG9fY3B1KHZkcC0+bmV4dFZvbERlc2NTZXFFeHQuZXh0TGVuZ3RoKTsKKwkJCQkJbmV4dF9lID0gbmV4dF9lID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCQkJCQluZXh0X2UgKz0gbmV4dF9zOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgVEFHX0lERU5UX0lVVkQ6IC8qIElTTyAxMzM0NiAzLzEwLjQgKi8KKwkJCQlpZiAodmRzbiA+PSB2ZHNbVkRTX1BPU19JTVBfVVNFX1ZPTF9ERVNDXS52b2xEZXNjU2VxTnVtKQorCQkJCXsKKwkJCQkJdmRzW1ZEU19QT1NfSU1QX1VTRV9WT0xfREVTQ10udm9sRGVzY1NlcU51bSA9IHZkc247CisJCQkJCXZkc1tWRFNfUE9TX0lNUF9VU0VfVk9MX0RFU0NdLmJsb2NrID0gYmxvY2s7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBUQUdfSURFTlRfUEQ6IC8qIElTTyAxMzM0NiAzLzEwLjUgKi8KKwkJCQlpZiAoIXZkc1tWRFNfUE9TX1BBUlRJVElPTl9ERVNDXS5ibG9jaykKKwkJCQkJdmRzW1ZEU19QT1NfUEFSVElUSU9OX0RFU0NdLmJsb2NrID0gYmxvY2s7CisJCQkJYnJlYWs7CisJCQljYXNlIFRBR19JREVOVF9MVkQ6IC8qIElTTyAxMzM0NiAzLzEwLjYgKi8KKwkJCQlpZiAodmRzbiA+PSB2ZHNbVkRTX1BPU19MT0dJQ0FMX1ZPTF9ERVNDXS52b2xEZXNjU2VxTnVtKQorCQkJCXsKKwkJCQkJdmRzW1ZEU19QT1NfTE9HSUNBTF9WT0xfREVTQ10udm9sRGVzY1NlcU51bSA9IHZkc247CisJCQkJCXZkc1tWRFNfUE9TX0xPR0lDQUxfVk9MX0RFU0NdLmJsb2NrID0gYmxvY2s7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBUQUdfSURFTlRfVVNEOiAvKiBJU08gMTMzNDYgMy8xMC44ICovCisJCQkJaWYgKHZkc24gPj0gdmRzW1ZEU19QT1NfVU5BTExPQ19TUEFDRV9ERVNDXS52b2xEZXNjU2VxTnVtKQorCQkJCXsKKwkJCQkJdmRzW1ZEU19QT1NfVU5BTExPQ19TUEFDRV9ERVNDXS52b2xEZXNjU2VxTnVtID0gdmRzbjsKKwkJCQkJdmRzW1ZEU19QT1NfVU5BTExPQ19TUEFDRV9ERVNDXS5ibG9jayA9IGJsb2NrOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgVEFHX0lERU5UX1REOiAvKiBJU08gMTMzNDYgMy8xMC45ICovCisJCQkJdmRzW1ZEU19QT1NfVEVSTUlOQVRJTkdfREVTQ10uYmxvY2sgPSBibG9jazsKKwkJCQlpZiAobmV4dF9lKQorCQkJCXsKKwkJCQkJYmxvY2sgPSBuZXh0X3M7CisJCQkJCWxhc3RibG9jayA9IG5leHRfZTsKKwkJCQkJbmV4dF9zID0gbmV4dF9lID0gMDsKKwkJCQl9CisJCQkJZWxzZQorCQkJCQlkb25lID0gMTsKKwkJCQlicmVhazsKKwkJfQorCQl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKwl9CisJZm9yIChpPTA7IGk8VkRTX1BPU19MRU5HVEg7IGkrKykKKwl7CisJCWlmICh2ZHNbaV0uYmxvY2spCisJCXsKKwkJCWJoID0gdWRmX3JlYWRfdGFnZ2VkKHNiLCB2ZHNbaV0uYmxvY2ssIHZkc1tpXS5ibG9jaywgJmlkZW50KTsKKworCQkJaWYgKGkgPT0gVkRTX1BPU19QUklNQVJZX1ZPTF9ERVNDKQorCQkJCXVkZl9sb2FkX3B2b2xkZXNjKHNiLCBiaCk7CisJCQllbHNlIGlmIChpID09IFZEU19QT1NfTE9HSUNBTF9WT0xfREVTQykKKwkJCQl1ZGZfbG9hZF9sb2dpY2Fsdm9sKHNiLCBiaCwgZmlsZXNldCk7CisJCQllbHNlIGlmIChpID09IFZEU19QT1NfUEFSVElUSU9OX0RFU0MpCisJCQl7CisJCQkJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDIgPSBOVUxMOworCQkJCXVkZl9sb2FkX3BhcnRkZXNjKHNiLCBiaCk7CisJCQkJZm9yIChqPXZkc1tpXS5ibG9jaysxOyBqPHZkc1tWRFNfUE9TX1RFUk1JTkFUSU5HX0RFU0NdLmJsb2NrOyBqKyspCisJCQkJeworCQkJCQliaDIgPSB1ZGZfcmVhZF90YWdnZWQoc2IsIGosIGosICZpZGVudCk7CisJCQkJCWdkID0gKHN0cnVjdCBnZW5lcmljX2Rlc2MgKiliaDItPmJfZGF0YTsKKwkJCQkJaWYgKGlkZW50ID09IFRBR19JREVOVF9QRCkKKwkJCQkJCXVkZl9sb2FkX3BhcnRkZXNjKHNiLCBiaDIpOworCQkJCQl1ZGZfcmVsZWFzZV9kYXRhKGJoMik7CisJCQkJfQorCQkJfQorCQkJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHVkZl9jaGVja192YWxpZCgpCisgKi8KK3N0YXRpYyBpbnQKK3VkZl9jaGVja192YWxpZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgbm92cnMsIGludCBzaWxlbnQpCit7CisJbG9uZyBibG9jazsKKworCWlmIChub3ZycykKKwl7CisJCXVkZl9kZWJ1ZygiVmFsaWRpdHkgY2hlY2sgc2tpcHBlZCBiZWNhdXNlIG9mIG5vdnJzIG9wdGlvblxuIik7CisJCXJldHVybiAwOworCX0KKwkvKiBDaGVjayB0aGF0IGl0IGlzIE5TUjAyIGNvbXBsaWFudCAqLworCS8qIFByb2Nlc3MgYW55ICJDRC1ST00gVm9sdW1lIERlc2NyaXB0b3IgU2V0IiAoRUNNQSAxNjcgMi84LjMuMSkgKi8KKwllbHNlIGlmICgoYmxvY2sgPSB1ZGZfdnJzKHNiLCBzaWxlbnQpKSA9PSAtMSkKKwl7CisJCXVkZl9kZWJ1ZygiRmFpbGVkIHRvIHJlYWQgYnl0ZSAzMjc2OC4gQXNzdW1pbmcgb3BlbiBkaXNjLiBTa2lwcGluZyB2YWxpZGl0eSBjaGVja1xuIik7CisJCWlmICghVURGX1NCX0xBU1RCTE9DSyhzYikpCisJCQlVREZfU0JfTEFTVEJMT0NLKHNiKSA9IHVkZl9nZXRfbGFzdF9ibG9jayhzYik7CisJCXJldHVybiAwOworCX0KKwllbHNlIAorCQlyZXR1cm4gIWJsb2NrOworfQorCitzdGF0aWMgaW50Cit1ZGZfbG9hZF9wYXJ0aXRpb24oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwga2VybmVsX2xiX2FkZHIgKmZpbGVzZXQpCit7CisJc3RydWN0IGFuY2hvclZvbERlc2NQdHIgKmFuY2hvcjsKKwl1aW50MTZfdCBpZGVudDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCWxvbmcgbWFpbl9zLCBtYWluX2UsIHJlc2VydmVfcywgcmVzZXJ2ZV9lOworCWludCBpLCBqOworCisJaWYgKCFzYikKKwkJcmV0dXJuIDE7CisKKwlmb3IgKGk9MDsgaTxzaXplb2YoVURGX1NCX0FOQ0hPUihzYikpL3NpemVvZihpbnQpOyBpKyspCisJeworCQlpZiAoVURGX1NCX0FOQ0hPUihzYilbaV0gJiYgKGJoID0gdWRmX3JlYWRfdGFnZ2VkKHNiLAorCQkJVURGX1NCX0FOQ0hPUihzYilbaV0sIFVERl9TQl9BTkNIT1Ioc2IpW2ldLCAmaWRlbnQpKSkKKwkJeworCQkJYW5jaG9yID0gKHN0cnVjdCBhbmNob3JWb2xEZXNjUHRyICopYmgtPmJfZGF0YTsKKworCQkJLyogTG9jYXRlIHRoZSBtYWluIHNlcXVlbmNlICovCisJCQltYWluX3MgPSBsZTMyX3RvX2NwdSggYW5jaG9yLT5tYWluVm9sRGVzY1NlcUV4dC5leHRMb2NhdGlvbiApOworCQkJbWFpbl9lID0gbGUzMl90b19jcHUoIGFuY2hvci0+bWFpblZvbERlc2NTZXFFeHQuZXh0TGVuZ3RoICk7CisJCQltYWluX2UgPSBtYWluX2UgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJCQltYWluX2UgKz0gbWFpbl9zOworCQorCQkJLyogTG9jYXRlIHRoZSByZXNlcnZlIHNlcXVlbmNlICovCisJCQlyZXNlcnZlX3MgPSBsZTMyX3RvX2NwdShhbmNob3ItPnJlc2VydmVWb2xEZXNjU2VxRXh0LmV4dExvY2F0aW9uKTsKKwkJCXJlc2VydmVfZSA9IGxlMzJfdG9fY3B1KGFuY2hvci0+cmVzZXJ2ZVZvbERlc2NTZXFFeHQuZXh0TGVuZ3RoKTsKKwkJCXJlc2VydmVfZSA9IHJlc2VydmVfZSA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKKwkJCXJlc2VydmVfZSArPSByZXNlcnZlX3M7CisKKwkJCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCisJCQkvKiBQcm9jZXNzIHRoZSBtYWluICYgcmVzZXJ2ZSBzZXF1ZW5jZXMgKi8KKwkJCS8qIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nIHRoZSBQYXJ0aXRpb25EZXNjKHMpICovCisJCQlpZiAoISh1ZGZfcHJvY2Vzc19zZXF1ZW5jZShzYiwgbWFpbl9zLCBtYWluX2UsIGZpbGVzZXQpICYmCisJCQkJdWRmX3Byb2Nlc3Nfc2VxdWVuY2Uoc2IsIHJlc2VydmVfcywgcmVzZXJ2ZV9lLCBmaWxlc2V0KSkpCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoaSA9PSBzaXplb2YoVURGX1NCX0FOQ0hPUihzYikpL3NpemVvZihpbnQpKQorCXsKKwkJdWRmX2RlYnVnKCJObyBBbmNob3IgYmxvY2sgZm91bmRcbiIpOworCQlyZXR1cm4gMTsKKwl9CisJZWxzZQorCQl1ZGZfZGVidWcoIlVzaW5nIGFuY2hvciBpbiBibG9jayAlZFxuIiwgVURGX1NCX0FOQ0hPUihzYilbaV0pOworCisJZm9yIChpPTA7IGk8VURGX1NCX05VTVBBUlRTKHNiKTsgaSsrKQorCXsKKwkJc3dpdGNoIFVERl9TQl9QQVJUVFlQRShzYiwgaSkKKwkJeworCQkJY2FzZSBVREZfVklSVFVBTF9NQVAxNToKKwkJCWNhc2UgVURGX1ZJUlRVQUxfTUFQMjA6CisJCQl7CisJCQkJa2VybmVsX2xiX2FkZHIgaW5vOworCisJCQkJaWYgKCFVREZfU0JfTEFTVEJMT0NLKHNiKSkKKwkJCQl7CisJCQkJCVVERl9TQl9MQVNUQkxPQ0soc2IpID0gdWRmX2dldF9sYXN0X2Jsb2NrKHNiKTsKKwkJCQkJdWRmX2ZpbmRfYW5jaG9yKHNiKTsKKwkJCQl9CisKKwkJCQlpZiAoIVVERl9TQl9MQVNUQkxPQ0soc2IpKQorCQkJCXsKKwkJCQkJdWRmX2RlYnVnKCJVbmFibGUgdG8gZGV0ZXJtaW5lIExhc3RibG9jayAoRm9yIFZpcnR1YWwgUGFydGl0aW9uKVxuIik7CisJCQkJCXJldHVybiAxOworCQkJCX0KKworCQkJCWZvciAoaj0wOyBqPFVERl9TQl9OVU1QQVJUUyhzYik7IGorKykKKwkJCQl7CisJCQkJCWlmIChqICE9IGkgJiYKKwkJCQkJCVVERl9TQl9QQVJUVlNOKHNiLGkpID09IFVERl9TQl9QQVJUVlNOKHNiLGopICYmCisJCQkJCQlVREZfU0JfUEFSVE5VTShzYixpKSA9PSBVREZfU0JfUEFSVE5VTShzYixqKSkKKwkJCQkJeworCQkJCQkJaW5vLnBhcnRpdGlvblJlZmVyZW5jZU51bSA9IGo7CisJCQkJCQlpbm8ubG9naWNhbEJsb2NrTnVtID0gVURGX1NCX0xBU1RCTE9DSyhzYikgLQorCQkJCQkJCVVERl9TQl9QQVJUUk9PVChzYixqKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCisJCQkJaWYgKGogPT0gVURGX1NCX05VTVBBUlRTKHNiKSkKKwkJCQkJcmV0dXJuIDE7CisKKwkJCQlpZiAoIShVREZfU0JfVkFUKHNiKSA9IHVkZl9pZ2V0KHNiLCBpbm8pKSkKKwkJCQkJcmV0dXJuIDE7CisKKwkJCQlpZiAoVURGX1NCX1BBUlRUWVBFKHNiLGkpID09IFVERl9WSVJUVUFMX01BUDE1KQorCQkJCXsKKwkJCQkJVURGX1NCX1RZUEVWSVJUKHNiLGkpLnNfc3RhcnRfb2Zmc2V0ID0gdWRmX2V4dDBfb2Zmc2V0KFVERl9TQl9WQVQoc2IpKTsKKwkJCQkJVURGX1NCX1RZUEVWSVJUKHNiLGkpLnNfbnVtX2VudHJpZXMgPSAoVURGX1NCX1ZBVChzYiktPmlfc2l6ZSAtIDM2KSA+PiAyOworCQkJCX0KKwkJCQllbHNlIGlmIChVREZfU0JfUEFSVFRZUEUoc2IsaSkgPT0gVURGX1ZJUlRVQUxfTUFQMjApCisJCQkJeworCQkJCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwkJCQkJdWludDMyX3QgcG9zOworCisJCQkJCXBvcyA9IHVkZl9ibG9ja19tYXAoVURGX1NCX1ZBVChzYiksIDApOworCQkJCQliaCA9IHNiX2JyZWFkKHNiLCBwb3MpOworCQkJCQlVREZfU0JfVFlQRVZJUlQoc2IsaSkuc19zdGFydF9vZmZzZXQgPQorCQkJCQkJbGUxNl90b19jcHUoKChzdHJ1Y3QgdmlydHVhbEFsbG9jYXRpb25UYWJsZTIwICopYmgtPmJfZGF0YSArIHVkZl9leHQwX29mZnNldChVREZfU0JfVkFUKHNiKSkpLT5sZW5ndGhIZWFkZXIpICsKKwkJCQkJCQl1ZGZfZXh0MF9vZmZzZXQoVURGX1NCX1ZBVChzYikpOworCQkJCQlVREZfU0JfVFlQRVZJUlQoc2IsaSkuc19udW1fZW50cmllcyA9IChVREZfU0JfVkFUKHNiKS0+aV9zaXplIC0KKwkJCQkJCVVERl9TQl9UWVBFVklSVChzYixpKS5zX3N0YXJ0X29mZnNldCkgPj4gMjsKKwkJCQkJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisJCQkJfQorCQkJCVVERl9TQl9QQVJUUk9PVChzYixpKSA9IHVkZl9nZXRfcGJsb2NrKHNiLCAwLCBpLCAwKTsKKwkJCQlVREZfU0JfUEFSVExFTihzYixpKSA9IFVERl9TQl9QQVJUTEVOKHNiLGluby5wYXJ0aXRpb25SZWZlcmVuY2VOdW0pOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1ZGZfb3Blbl9sdmlkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJaWYgKFVERl9TQl9MVklEQkgoc2IpKQorCXsKKwkJaW50IGk7CisJCWtlcm5lbF90aW1lc3RhbXAgY3B1X3RpbWU7CisKKwkJVURGX1NCX0xWSURJVShzYiktPmltcElkZW50LmlkZW50U3VmZml4WzBdID0gVURGX09TX0NMQVNTX1VOSVg7CisJCVVERl9TQl9MVklESVUoc2IpLT5pbXBJZGVudC5pZGVudFN1ZmZpeFsxXSA9IFVERl9PU19JRF9MSU5VWDsKKwkJaWYgKHVkZl90aW1lX3RvX3N0YW1wKCZjcHVfdGltZSwgQ1VSUkVOVF9USU1FKSkKKwkJCVVERl9TQl9MVklEKHNiKS0+cmVjb3JkaW5nRGF0ZUFuZFRpbWUgPSBjcHVfdG9fbGV0cyhjcHVfdGltZSk7CisJCVVERl9TQl9MVklEKHNiKS0+aW50ZWdyaXR5VHlwZSA9IExWSURfSU5URUdSSVRZX1RZUEVfT1BFTjsKKworCQlVREZfU0JfTFZJRChzYiktPmRlc2NUYWcuZGVzY0NSQyA9CisJCQljcHVfdG9fbGUxNih1ZGZfY3JjKChjaGFyICopVURGX1NCX0xWSUQoc2IpICsgc2l6ZW9mKHRhZyksCisJCQlsZTE2X3RvX2NwdShVREZfU0JfTFZJRChzYiktPmRlc2NUYWcuZGVzY0NSQ0xlbmd0aCksIDApKTsKKworCQlVREZfU0JfTFZJRChzYiktPmRlc2NUYWcudGFnQ2hlY2tzdW0gPSAwOworCQlmb3IgKGk9MDsgaTwxNjsgaSsrKQorCQkJaWYgKGkgIT0gNCkKKwkJCQlVREZfU0JfTFZJRChzYiktPmRlc2NUYWcudGFnQ2hlY2tzdW0gKz0KKwkJCQkJKCh1aW50OF90ICopJihVREZfU0JfTFZJRChzYiktPmRlc2NUYWcpKVtpXTsKKworCQltYXJrX2J1ZmZlcl9kaXJ0eShVREZfU0JfTFZJREJIKHNiKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCB1ZGZfY2xvc2VfbHZpZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCWlmIChVREZfU0JfTFZJREJIKHNiKSAmJgorCQlVREZfU0JfTFZJRChzYiktPmludGVncml0eVR5cGUgPT0gTFZJRF9JTlRFR1JJVFlfVFlQRV9PUEVOKQorCXsKKwkJaW50IGk7CisJCWtlcm5lbF90aW1lc3RhbXAgY3B1X3RpbWU7CisKKwkJVURGX1NCX0xWSURJVShzYiktPmltcElkZW50LmlkZW50U3VmZml4WzBdID0gVURGX09TX0NMQVNTX1VOSVg7CisJCVVERl9TQl9MVklESVUoc2IpLT5pbXBJZGVudC5pZGVudFN1ZmZpeFsxXSA9IFVERl9PU19JRF9MSU5VWDsKKwkJaWYgKHVkZl90aW1lX3RvX3N0YW1wKCZjcHVfdGltZSwgQ1VSUkVOVF9USU1FKSkKKwkJCVVERl9TQl9MVklEKHNiKS0+cmVjb3JkaW5nRGF0ZUFuZFRpbWUgPSBjcHVfdG9fbGV0cyhjcHVfdGltZSk7CisJCWlmIChVREZfTUFYX1dSSVRFX1ZFUlNJT04gPiBsZTE2X3RvX2NwdShVREZfU0JfTFZJRElVKHNiKS0+bWF4VURGV3JpdGVSZXYpKQorCQkJVURGX1NCX0xWSURJVShzYiktPm1heFVERldyaXRlUmV2ID0gY3B1X3RvX2xlMTYoVURGX01BWF9XUklURV9WRVJTSU9OKTsKKwkJaWYgKFVERl9TQl9VREZSRVYoc2IpID4gbGUxNl90b19jcHUoVURGX1NCX0xWSURJVShzYiktPm1pblVERlJlYWRSZXYpKQorCQkJVURGX1NCX0xWSURJVShzYiktPm1pblVERlJlYWRSZXYgPSBjcHVfdG9fbGUxNihVREZfU0JfVURGUkVWKHNiKSk7CisJCWlmIChVREZfU0JfVURGUkVWKHNiKSA+IGxlMTZfdG9fY3B1KFVERl9TQl9MVklESVUoc2IpLT5taW5VREZXcml0ZVJldikpCisJCQlVREZfU0JfTFZJRElVKHNiKS0+bWluVURGV3JpdGVSZXYgPSBjcHVfdG9fbGUxNihVREZfU0JfVURGUkVWKHNiKSk7CisJCVVERl9TQl9MVklEKHNiKS0+aW50ZWdyaXR5VHlwZSA9IGNwdV90b19sZTMyKExWSURfSU5URUdSSVRZX1RZUEVfQ0xPU0UpOworCisJCVVERl9TQl9MVklEKHNiKS0+ZGVzY1RhZy5kZXNjQ1JDID0KKwkJCWNwdV90b19sZTE2KHVkZl9jcmMoKGNoYXIgKilVREZfU0JfTFZJRChzYikgKyBzaXplb2YodGFnKSwKKwkJCWxlMTZfdG9fY3B1KFVERl9TQl9MVklEKHNiKS0+ZGVzY1RhZy5kZXNjQ1JDTGVuZ3RoKSwgMCkpOworCisJCVVERl9TQl9MVklEKHNiKS0+ZGVzY1RhZy50YWdDaGVja3N1bSA9IDA7CisJCWZvciAoaT0wOyBpPDE2OyBpKyspCisJCQlpZiAoaSAhPSA0KQorCQkJCVVERl9TQl9MVklEKHNiKS0+ZGVzY1RhZy50YWdDaGVja3N1bSArPQorCQkJCQkoKHVpbnQ4X3QgKikmKFVERl9TQl9MVklEKHNiKS0+ZGVzY1RhZykpW2ldOworCisJCW1hcmtfYnVmZmVyX2RpcnR5KFVERl9TQl9MVklEQkgoc2IpKTsKKwl9Cit9CisKKy8qCisgKiB1ZGZfcmVhZF9zdXBlcgorICoKKyAqIFBVUlBPU0UKKyAqCUNvbXBsZXRlIHRoZSBzcGVjaWZpZWQgc3VwZXIgYmxvY2suCisgKgorICogUFJFLUNPTkRJVElPTlMKKyAqCXNiCQkJUG9pbnRlciB0byBzdXBlcmJsb2NrIHRvIGNvbXBsZXRlIC0gbmV2ZXIgTlVMTC4KKyAqCXNiLT5zX2RldgkJRGV2aWNlIHRvIHJlYWQgc3ViZXJibG9jayBmcm9tLgorICoJb3B0aW9ucwkJCVBvaW50ZXIgdG8gbW91bnQgb3B0aW9ucy4KKyAqCXNpbGVudAkJCVNpbGVudCBmbGFnLgorICoKKyAqIEhJU1RPUlkKKyAqCUp1bHkgMSwgMTk5NyAtIEFuZHJldyBFLiBNaWxlc2tpCisgKglXcml0dGVuLCB0ZXN0ZWQsIGFuZCByZWxlYXNlZC4KKyAqLworc3RhdGljIGludCB1ZGZfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpvcHRpb25zLCBpbnQgc2lsZW50KQoreworCWludCBpOworCXN0cnVjdCBpbm9kZSAqaW5vZGU9TlVMTDsKKwlzdHJ1Y3QgdWRmX29wdGlvbnMgdW9wdDsKKwlrZXJuZWxfbGJfYWRkciByb290ZGlyLCBmaWxlc2V0OworCXN0cnVjdCB1ZGZfc2JfaW5mbyAqc2JpOworCisJdW9wdC5mbGFncyA9ICgxIDw8IFVERl9GTEFHX1VTRV9BRF9JTl9JQ0IpIHwgKDEgPDwgVURGX0ZMQUdfU1RSSUNUKTsKKwl1b3B0LnVpZCA9IC0xOworCXVvcHQuZ2lkID0gLTE7CisJdW9wdC51bWFzayA9IDA7CisKKwlzYmkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdWRmX3NiX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNiaSkKKwkJcmV0dXJuIC1FTk9NRU07CisJc2ItPnNfZnNfaW5mbyA9IHNiaTsKKwltZW1zZXQoVURGX1NCKHNiKSwgMHgwMCwgc2l6ZW9mKHN0cnVjdCB1ZGZfc2JfaW5mbykpOworCisJaW5pdF9NVVRFWCgmc2JpLT5zX2FsbG9jX3NlbSk7CisKKwlpZiAoIXVkZl9wYXJzZV9vcHRpb25zKChjaGFyICopb3B0aW9ucywgJnVvcHQpKQorCQlnb3RvIGVycm9yX291dDsKKworCWlmICh1b3B0LmZsYWdzICYgKDEgPDwgVURGX0ZMQUdfVVRGOCkgJiYKKwkgICAgdW9wdC5mbGFncyAmICgxIDw8IFVERl9GTEFHX05MU19NQVApKQorCXsKKwkJdWRmX2Vycm9yKHNiLCAidWRmX3JlYWRfc3VwZXIiLAorCQkJInV0ZjggY2Fubm90IGJlIGNvbWJpbmVkIHdpdGggaW9jaGFyc2V0XG4iKTsKKwkJZ290byBlcnJvcl9vdXQ7CisJfQorI2lmZGVmIENPTkZJR19VREZfTkxTCisJaWYgKCh1b3B0LmZsYWdzICYgKDEgPDwgVURGX0ZMQUdfTkxTX01BUCkpICYmICF1b3B0Lm5sc19tYXApCisJeworCQl1b3B0Lm5sc19tYXAgPSBsb2FkX25sc19kZWZhdWx0KCk7CisJCWlmICghdW9wdC5ubHNfbWFwKQorCQkJdW9wdC5mbGFncyAmPSB+KDEgPDwgVURGX0ZMQUdfTkxTX01BUCk7CisJCWVsc2UKKwkJCXVkZl9kZWJ1ZygiVXNpbmcgZGVmYXVsdCBOTFMgbWFwXG4iKTsKKwl9CisjZW5kaWYKKwlpZiAoISh1b3B0LmZsYWdzICYgKDEgPDwgVURGX0ZMQUdfTkxTX01BUCkpKQorCQl1b3B0LmZsYWdzIHw9ICgxIDw8IFVERl9GTEFHX1VURjgpOworCisJZmlsZXNldC5sb2dpY2FsQmxvY2tOdW0gPSAweEZGRkZGRkZGOworCWZpbGVzZXQucGFydGl0aW9uUmVmZXJlbmNlTnVtID0gMHhGRkZGOworCisJVURGX1NCKHNiKS0+c19mbGFncyA9IHVvcHQuZmxhZ3M7CisJVURGX1NCKHNiKS0+c191aWQgPSB1b3B0LnVpZDsKKwlVREZfU0Ioc2IpLT5zX2dpZCA9IHVvcHQuZ2lkOworCVVERl9TQihzYiktPnNfdW1hc2sgPSB1b3B0LnVtYXNrOworCVVERl9TQihzYiktPnNfbmxzX21hcCA9IHVvcHQubmxzX21hcDsKKworCS8qIFNldCB0aGUgYmxvY2sgc2l6ZSBmb3IgYWxsIHRyYW5zZmVycyAqLworCWlmICghdWRmX3NldF9ibG9ja3NpemUoc2IsIHVvcHQuYmxvY2tzaXplKSkKKwkJZ290byBlcnJvcl9vdXQ7CisKKwlpZiAoIHVvcHQuc2Vzc2lvbiA9PSAweEZGRkZGRkZGICkKKwkJVURGX1NCX1NFU1NJT04oc2IpID0gdWRmX2dldF9sYXN0X3Nlc3Npb24oc2IpOworCWVsc2UKKwkJVURGX1NCX1NFU1NJT04oc2IpID0gdW9wdC5zZXNzaW9uOworCisJdWRmX2RlYnVnKCJNdWx0aS1zZXNzaW9uPSVkXG4iLCBVREZfU0JfU0VTU0lPTihzYikpOworCisJVURGX1NCX0xBU1RCTE9DSyhzYikgPSB1b3B0Lmxhc3RibG9jazsKKwlVREZfU0JfQU5DSE9SKHNiKVswXSA9IFVERl9TQl9BTkNIT1Ioc2IpWzFdID0gMDsKKwlVREZfU0JfQU5DSE9SKHNiKVsyXSA9IHVvcHQuYW5jaG9yOworCVVERl9TQl9BTkNIT1Ioc2IpWzNdID0gMjU2OworCisJaWYgKHVkZl9jaGVja192YWxpZChzYiwgdW9wdC5ub3Zycywgc2lsZW50KSkgLyogcmVhZCB2b2x1bWUgcmVjb2duaXRpb24gc2VxdWVuY2VzICovCisJeworCQlwcmludGsoIlVERi1mczogTm8gVlJTIGZvdW5kXG4iKTsKKyAJCWdvdG8gZXJyb3Jfb3V0OworCX0KKworCXVkZl9maW5kX2FuY2hvcihzYik7CisKKwkvKiBGaWxsIGluIHRoZSByZXN0IG9mIHRoZSBzdXBlcmJsb2NrICovCisJc2ItPnNfb3AgPSAmdWRmX3NiX29wczsKKwlzYi0+ZHFfb3AgPSBOVUxMOworCXNiLT5zX2RpcnQgPSAwOworCXNiLT5zX21hZ2ljID0gVURGX1NVUEVSX01BR0lDOworCXNiLT5zX3RpbWVfZ3JhbiA9IDEwMDA7CisKKwlpZiAodWRmX2xvYWRfcGFydGl0aW9uKHNiLCAmZmlsZXNldCkpCisJeworCQlwcmludGsoIlVERi1mczogTm8gcGFydGl0aW9uIGZvdW5kICgxKVxuIik7CisJCWdvdG8gZXJyb3Jfb3V0OworCX0KKworCXVkZl9kZWJ1ZygiTGFzdGJsb2NrPSVkXG4iLCBVREZfU0JfTEFTVEJMT0NLKHNiKSk7CisKKwlpZiAoIFVERl9TQl9MVklEQkgoc2IpICkKKwl7CisJCXVpbnQxNl90IG1pblVERlJlYWRSZXYgPSBsZTE2X3RvX2NwdShVREZfU0JfTFZJRElVKHNiKS0+bWluVURGUmVhZFJldik7CisJCXVpbnQxNl90IG1pblVERldyaXRlUmV2ID0gbGUxNl90b19jcHUoVURGX1NCX0xWSURJVShzYiktPm1pblVERldyaXRlUmV2KTsKKwkJLyogdWludDE2X3QgbWF4VURGV3JpdGVSZXYgPSBsZTE2X3RvX2NwdShVREZfU0JfTFZJRElVKHNiKS0+bWF4VURGV3JpdGVSZXYpOyAqLworCisJCWlmIChtaW5VREZSZWFkUmV2ID4gVURGX01BWF9SRUFEX1ZFUlNJT04pCisJCXsKKwkJCXByaW50aygiVURGLWZzOiBtaW5VREZSZWFkUmV2PSV4IChtYXggaXMgJXgpXG4iLAorCQkJCWxlMTZfdG9fY3B1KFVERl9TQl9MVklESVUoc2IpLT5taW5VREZSZWFkUmV2KSwKKwkJCQlVREZfTUFYX1JFQURfVkVSU0lPTik7CisJCQlnb3RvIGVycm9yX291dDsKKwkJfQorCQllbHNlIGlmIChtaW5VREZXcml0ZVJldiA+IFVERl9NQVhfV1JJVEVfVkVSU0lPTikKKwkJeworCQkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCQl9CisKKwkJVURGX1NCX1VERlJFVihzYikgPSBtaW5VREZXcml0ZVJldjsKKworCQlpZiAobWluVURGUmVhZFJldiA+PSBVREZfVkVSU19VU0VfRVhURU5ERURfRkUpCisJCQlVREZfU0VUX0ZMQUcoc2IsIFVERl9GTEFHX1VTRV9FWFRFTkRFRF9GRSk7CisJCWlmIChtaW5VREZSZWFkUmV2ID49IFVERl9WRVJTX1VTRV9TVFJFQU1TKQorCQkJVURGX1NFVF9GTEFHKHNiLCBVREZfRkxBR19VU0VfU1RSRUFNUyk7CisJfQorCisJaWYgKCAhVURGX1NCX05VTVBBUlRTKHNiKSApCisJeworCQlwcmludGsoIlVERi1mczogTm8gcGFydGl0aW9uIGZvdW5kICgyKVxuIik7CisJCWdvdG8gZXJyb3Jfb3V0OworCX0KKworCWlmICggdWRmX2ZpbmRfZmlsZXNldChzYiwgJmZpbGVzZXQsICZyb290ZGlyKSApCisJeworCQlwcmludGsoIlVERi1mczogTm8gZmlsZXNldCBmb3VuZFxuIik7CisJCWdvdG8gZXJyb3Jfb3V0OworCX0KKworCWlmICghc2lsZW50KQorCXsKKwkJa2VybmVsX3RpbWVzdGFtcCB0czsKKwkJdWRmX3RpbWVfdG9fc3RhbXAoJnRzLCBVREZfU0JfUkVDT1JEVElNRShzYikpOworCQl1ZGZfaW5mbygiVURGICVzICglcykgTW91bnRpbmcgdm9sdW1lICclcycsIHRpbWVzdGFtcCAlMDR1LyUwMnUvJTAydSAlMDJ1OiUwMnUgKCV4KVxuIiwKKwkJCVVERkZTX1ZFUlNJT04sIFVERkZTX0RBVEUsCisJCQlVREZfU0JfVk9MSURFTlQoc2IpLCB0cy55ZWFyLCB0cy5tb250aCwgdHMuZGF5LCB0cy5ob3VyLCB0cy5taW51dGUsCisJCQl0cy50eXBlQW5kVGltZXpvbmUpOworCX0KKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpCisJCXVkZl9vcGVuX2x2aWQoc2IpOworCisJLyogQXNzaWduIHRoZSByb290IGlub2RlICovCisJLyogYXNzaWduIGlub2RlcyBieSBwaHlzaWNhbCBibG9jayBudW1iZXIgKi8KKwkvKiBwZXJoYXBzIGl0J3Mgbm90IGV4dGVuc2libGUgZW5vdWdoLCBidXQgZm9yIG5vdyAuLi4gKi8KKwlpbm9kZSA9IHVkZl9pZ2V0KHNiLCByb290ZGlyKTsgCisJaWYgKCFpbm9kZSkKKwl7CisJCXByaW50aygiVURGLWZzOiBFcnJvciBpbiB1ZGZfaWdldCwgYmxvY2s9JWQsIHBhcnRpdGlvbj0lZFxuIiwKKwkJCXJvb3RkaXIubG9naWNhbEJsb2NrTnVtLCByb290ZGlyLnBhcnRpdGlvblJlZmVyZW5jZU51bSk7CisJCWdvdG8gZXJyb3Jfb3V0OworCX0KKworCS8qIEFsbG9jYXRlIGEgZGVudHJ5IGZvciB0aGUgcm9vdCBpbm9kZSAqLworCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3QoaW5vZGUpOworCWlmICghc2ItPnNfcm9vdCkKKwl7CisJCXByaW50aygiVURGLWZzOiBDb3VsZG4ndCBhbGxvY2F0ZSByb290IGRlbnRyeVxuIik7CisJCWlwdXQoaW5vZGUpOworCQlnb3RvIGVycm9yX291dDsKKwl9CisJc2ItPnNfbWF4Ynl0ZXMgPSBNQVhfTEZTX0ZJTEVTSVpFOworCXJldHVybiAwOworCitlcnJvcl9vdXQ6CisJaWYgKFVERl9TQl9WQVQoc2IpKQorCQlpcHV0KFVERl9TQl9WQVQoc2IpKTsKKwlpZiAoVURGX1NCX05VTVBBUlRTKHNiKSkKKwl7CisJCWlmIChVREZfU0JfUEFSVEZMQUdTKHNiLCBVREZfU0JfUEFSVElUSU9OKHNiKSkgJiBVREZfUEFSVF9GTEFHX1VOQUxMT0NfVEFCTEUpCisJCQlpcHV0KFVERl9TQl9QQVJUTUFQUyhzYilbVURGX1NCX1BBUlRJVElPTihzYildLnNfdXNwYWNlLnNfdGFibGUpOworCQlpZiAoVURGX1NCX1BBUlRGTEFHUyhzYiwgVURGX1NCX1BBUlRJVElPTihzYikpICYgVURGX1BBUlRfRkxBR19GUkVFRF9UQUJMRSkKKwkJCWlwdXQoVURGX1NCX1BBUlRNQVBTKHNiKVtVREZfU0JfUEFSVElUSU9OKHNiKV0uc19mc3BhY2Uuc190YWJsZSk7CisJCWlmIChVREZfU0JfUEFSVEZMQUdTKHNiLCBVREZfU0JfUEFSVElUSU9OKHNiKSkgJiBVREZfUEFSVF9GTEFHX1VOQUxMT0NfQklUTUFQKQorCQkJVURGX1NCX0ZSRUVfQklUTUFQKHNiLFVERl9TQl9QQVJUSVRJT04oc2IpLHNfdXNwYWNlKTsKKwkJaWYgKFVERl9TQl9QQVJURkxBR1Moc2IsIFVERl9TQl9QQVJUSVRJT04oc2IpKSAmIFVERl9QQVJUX0ZMQUdfRlJFRURfQklUTUFQKQorCQkJVURGX1NCX0ZSRUVfQklUTUFQKHNiLFVERl9TQl9QQVJUSVRJT04oc2IpLHNfZnNwYWNlKTsKKwkJaWYgKFVERl9TQl9QQVJUVFlQRShzYiwgVURGX1NCX1BBUlRJVElPTihzYikpID09IFVERl9TUEFSQUJMRV9NQVAxNSkKKwkJeworCQkJZm9yIChpPTA7IGk8NDsgaSsrKQorCQkJCXVkZl9yZWxlYXNlX2RhdGEoVURGX1NCX1RZUEVTUEFSKHNiLCBVREZfU0JfUEFSVElUSU9OKHNiKSkuc19zcGFyX21hcFtpXSk7CisJCX0KKwl9CisjaWZkZWYgQ09ORklHX1VERl9OTFMKKwlpZiAoVURGX1FVRVJZX0ZMQUcoc2IsIFVERl9GTEFHX05MU19NQVApKQorCQl1bmxvYWRfbmxzKFVERl9TQihzYiktPnNfbmxzX21hcCk7CisjZW5kaWYKKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpCisJCXVkZl9jbG9zZV9sdmlkKHNiKTsKKwl1ZGZfcmVsZWFzZV9kYXRhKFVERl9TQl9MVklEQkgoc2IpKTsKKwlVREZfU0JfRlJFRShzYik7CisJa2ZyZWUoc2JpKTsKKwlzYi0+c19mc19pbmZvID0gTlVMTDsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKwordm9pZCB1ZGZfZXJyb3Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgY29uc3QgY2hhciAqZnVuY3Rpb24sCisJY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCisJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKQorCXsKKwkJLyogbWFyayBzYiBlcnJvciAqLworCQlzYi0+c19kaXJ0ID0gMTsKKwl9CisJdmFfc3RhcnQoYXJncywgZm10KTsKKwl2c3ByaW50ZihlcnJvcl9idWYsIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCXByaW50ayAoS0VSTl9DUklUICJVREYtZnMgZXJyb3IgKGRldmljZSAlcyk6ICVzOiAlc1xuIiwKKwkJc2ItPnNfaWQsIGZ1bmN0aW9uLCBlcnJvcl9idWYpOworfQorCit2b2lkIHVkZl93YXJuaW5nKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKmZ1bmN0aW9uLAorCWNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKworCXZhX3N0YXJ0IChhcmdzLCBmbXQpOworCXZzcHJpbnRmKGVycm9yX2J1ZiwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiVURGLWZzIHdhcm5pbmcgKGRldmljZSAlcyk6ICVzOiAlc1xuIiwKKwkJc2ItPnNfaWQsIGZ1bmN0aW9uLCBlcnJvcl9idWYpOworfQorCisvKgorICogdWRmX3B1dF9zdXBlcgorICoKKyAqIFBVUlBPU0UKKyAqCVByZXBhcmUgZm9yIGRlc3RydWN0aW9uIG9mIHRoZSBzdXBlcmJsb2NrLgorICoKKyAqIERFU0NSSVBUSU9OCisgKglDYWxsZWQgYmVmb3JlIHRoZSBmaWxlc3lzdGVtIGlzIHVubW91bnRlZC4KKyAqCisgKiBISVNUT1JZCisgKglKdWx5IDEsIDE5OTcgLSBBbmRyZXcgRS4gTWlsZXNraQorICoJV3JpdHRlbiwgdGVzdGVkLCBhbmQgcmVsZWFzZWQuCisgKi8KK3N0YXRpYyB2b2lkCit1ZGZfcHV0X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJaW50IGk7CisKKwlpZiAoVURGX1NCX1ZBVChzYikpCisJCWlwdXQoVURGX1NCX1ZBVChzYikpOworCWlmIChVREZfU0JfTlVNUEFSVFMoc2IpKQorCXsKKwkJaWYgKFVERl9TQl9QQVJURkxBR1Moc2IsIFVERl9TQl9QQVJUSVRJT04oc2IpKSAmIFVERl9QQVJUX0ZMQUdfVU5BTExPQ19UQUJMRSkKKwkJCWlwdXQoVURGX1NCX1BBUlRNQVBTKHNiKVtVREZfU0JfUEFSVElUSU9OKHNiKV0uc191c3BhY2Uuc190YWJsZSk7CisJCWlmIChVREZfU0JfUEFSVEZMQUdTKHNiLCBVREZfU0JfUEFSVElUSU9OKHNiKSkgJiBVREZfUEFSVF9GTEFHX0ZSRUVEX1RBQkxFKQorCQkJaXB1dChVREZfU0JfUEFSVE1BUFMoc2IpW1VERl9TQl9QQVJUSVRJT04oc2IpXS5zX2ZzcGFjZS5zX3RhYmxlKTsKKwkJaWYgKFVERl9TQl9QQVJURkxBR1Moc2IsIFVERl9TQl9QQVJUSVRJT04oc2IpKSAmIFVERl9QQVJUX0ZMQUdfVU5BTExPQ19CSVRNQVApCisJCQlVREZfU0JfRlJFRV9CSVRNQVAoc2IsVURGX1NCX1BBUlRJVElPTihzYiksc191c3BhY2UpOworCQlpZiAoVURGX1NCX1BBUlRGTEFHUyhzYiwgVURGX1NCX1BBUlRJVElPTihzYikpICYgVURGX1BBUlRfRkxBR19GUkVFRF9CSVRNQVApCisJCQlVREZfU0JfRlJFRV9CSVRNQVAoc2IsVURGX1NCX1BBUlRJVElPTihzYiksc19mc3BhY2UpOworCQlpZiAoVURGX1NCX1BBUlRUWVBFKHNiLCBVREZfU0JfUEFSVElUSU9OKHNiKSkgPT0gVURGX1NQQVJBQkxFX01BUDE1KQorCQl7CisJCQlmb3IgKGk9MDsgaTw0OyBpKyspCisJCQkJdWRmX3JlbGVhc2VfZGF0YShVREZfU0JfVFlQRVNQQVIoc2IsIFVERl9TQl9QQVJUSVRJT04oc2IpKS5zX3NwYXJfbWFwW2ldKTsKKwkJfQorCX0KKyNpZmRlZiBDT05GSUdfVURGX05MUworCWlmIChVREZfUVVFUllfRkxBRyhzYiwgVURGX0ZMQUdfTkxTX01BUCkpCisJCXVubG9hZF9ubHMoVURGX1NCKHNiKS0+c19ubHNfbWFwKTsKKyNlbmRpZgorCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkKKwkJdWRmX2Nsb3NlX2x2aWQoc2IpOworCXVkZl9yZWxlYXNlX2RhdGEoVURGX1NCX0xWSURCSChzYikpOworCVVERl9TQl9GUkVFKHNiKTsKKwlrZnJlZShzYi0+c19mc19pbmZvKTsKKwlzYi0+c19mc19pbmZvID0gTlVMTDsKK30KKworLyoKKyAqIHVkZl9zdGF0X2ZzCisgKgorICogUFVSUE9TRQorICoJUmV0dXJuIGluZm8gYWJvdXQgdGhlIGZpbGVzeXN0ZW0uCisgKgorICogREVTQ1JJUFRJT04KKyAqCUNhbGxlZCBieSBzeXNfc3RhdGZzKCkKKyAqCisgKiBISVNUT1JZCisgKglKdWx5IDEsIDE5OTcgLSBBbmRyZXcgRS4gTWlsZXNraQorICoJV3JpdHRlbiwgdGVzdGVkLCBhbmQgcmVsZWFzZWQuCisgKi8KK3N0YXRpYyBpbnQKK3VkZl9zdGF0ZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK3sKKwlidWYtPmZfdHlwZSA9IFVERl9TVVBFUl9NQUdJQzsKKwlidWYtPmZfYnNpemUgPSBzYi0+c19ibG9ja3NpemU7CisJYnVmLT5mX2Jsb2NrcyA9IFVERl9TQl9QQVJUTEVOKHNiLCBVREZfU0JfUEFSVElUSU9OKHNiKSk7CisJYnVmLT5mX2JmcmVlID0gdWRmX2NvdW50X2ZyZWUoc2IpOworCWJ1Zi0+Zl9iYXZhaWwgPSBidWYtPmZfYmZyZWU7CisJYnVmLT5mX2ZpbGVzID0gKFVERl9TQl9MVklEQkgoc2IpID8KKwkJKGxlMzJfdG9fY3B1KFVERl9TQl9MVklESVUoc2IpLT5udW1GaWxlcykgKworCQlsZTMyX3RvX2NwdShVREZfU0JfTFZJRElVKHNiKS0+bnVtRGlycykpIDogMCkgKyBidWYtPmZfYmZyZWU7CisJYnVmLT5mX2ZmcmVlID0gYnVmLT5mX2JmcmVlOworCS8qIF9fa2VybmVsX2ZzaWRfdCBmX2ZzaWQgKi8KKwlidWYtPmZfbmFtZWxlbiA9IFVERl9OQU1FX0xFTi0yOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHVkZl9iaXRtYXBfbG9va3VwWzE2XSA9IHsKKwkwLCAxLCAxLCAyLCAxLCAyLCAyLCAzLCAxLCAyLCAyLCAzLCAyLCAzLCAzLCA0Cit9OworCitzdGF0aWMgdW5zaWduZWQgaW50Cit1ZGZfY291bnRfZnJlZV9iaXRtYXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IHVkZl9iaXRtYXAgKmJpdG1hcCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgYWNjdW0gPSAwOworCWludCBpbmRleDsKKwlpbnQgYmxvY2sgPSAwLCBuZXdibG9jazsKKwlrZXJuZWxfbGJfYWRkciBsb2M7CisJdWludDMyX3QgYnl0ZXM7CisJdWludDhfdCB2YWx1ZTsKKwl1aW50OF90ICpwdHI7CisJdWludDE2X3QgaWRlbnQ7CisJc3RydWN0IHNwYWNlQml0bWFwRGVzYyAqYm07CisKKwlsb2NrX2tlcm5lbCgpOworCisJbG9jLmxvZ2ljYWxCbG9ja051bSA9IGJpdG1hcC0+c19leHRQb3NpdGlvbjsKKwlsb2MucGFydGl0aW9uUmVmZXJlbmNlTnVtID0gVURGX1NCX1BBUlRJVElPTihzYik7CisJYmggPSB1ZGZfcmVhZF9wdGFnZ2VkKHNiLCBsb2MsIDAsICZpZGVudCk7CisKKwlpZiAoIWJoKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJ1ZGY6IHVkZl9jb3VudF9mcmVlIGZhaWxlZFxuIik7CisJCWdvdG8gb3V0OworCX0KKwllbHNlIGlmIChpZGVudCAhPSBUQUdfSURFTlRfU0JEKQorCXsKKwkJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisJCXByaW50ayhLRVJOX0VSUiAidWRmOiB1ZGZfY291bnRfZnJlZSBmYWlsZWRcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlibSA9IChzdHJ1Y3Qgc3BhY2VCaXRtYXBEZXNjICopYmgtPmJfZGF0YTsKKwlieXRlcyA9IGxlMzJfdG9fY3B1KGJtLT5udW1PZkJ5dGVzKTsKKwlpbmRleCA9IHNpemVvZihzdHJ1Y3Qgc3BhY2VCaXRtYXBEZXNjKTsgLyogb2Zmc2V0IGluIGZpcnN0IGJsb2NrIG9ubHkgKi8KKwlwdHIgPSAodWludDhfdCAqKWJoLT5iX2RhdGE7CisKKwl3aGlsZSAoIGJ5dGVzID4gMCApCisJeworCQl3aGlsZSAoKGJ5dGVzID4gMCkgJiYgKGluZGV4IDwgc2ItPnNfYmxvY2tzaXplKSkKKwkJeworCQkJdmFsdWUgPSBwdHJbaW5kZXhdOworCQkJYWNjdW0gKz0gdWRmX2JpdG1hcF9sb29rdXBbIHZhbHVlICYgMHgwZiBdOworCQkJYWNjdW0gKz0gdWRmX2JpdG1hcF9sb29rdXBbIHZhbHVlID4+IDQgXTsKKwkJCWluZGV4Kys7CisJCQlieXRlcy0tOworCQl9CisJCWlmICggYnl0ZXMgKQorCQl7CisJCQl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKwkJCW5ld2Jsb2NrID0gdWRmX2dldF9sYl9wYmxvY2soc2IsIGxvYywgKytibG9jayk7CisJCQliaCA9IHVkZl90cmVhZChzYiwgbmV3YmxvY2spOworCQkJaWYgKCFiaCkKKwkJCXsKKwkJCQl1ZGZfZGVidWcoInJlYWQgZmFpbGVkXG4iKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWluZGV4ID0gMDsKKwkJCXB0ciA9ICh1aW50OF90ICopYmgtPmJfZGF0YTsKKwkJfQorCX0KKwl1ZGZfcmVsZWFzZV9kYXRhKGJoKTsKKworb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKworCXJldHVybiBhY2N1bTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAordWRmX2NvdW50X2ZyZWVfdGFibGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGlub2RlICogdGFibGUpCit7CisJdW5zaWduZWQgaW50IGFjY3VtID0gMDsKKwl1aW50MzJfdCBleHRvZmZzZXQsIGVsZW47CisJa2VybmVsX2xiX2FkZHIgYmxvYywgZWxvYzsKKwlpbnQ4X3QgZXR5cGU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisKKwlsb2NrX2tlcm5lbCgpOworCisJYmxvYyA9IFVERl9JX0xPQ0FUSU9OKHRhYmxlKTsKKwlleHRvZmZzZXQgPSBzaXplb2Yoc3RydWN0IHVuYWxsb2NTcGFjZUVudHJ5KTsKKworCXdoaWxlICgoZXR5cGUgPSB1ZGZfbmV4dF9hZXh0KHRhYmxlLCAmYmxvYywgJmV4dG9mZnNldCwgJmVsb2MsICZlbGVuLCAmYmgsIDEpKSAhPSAtMSkKKwl7CisJCWFjY3VtICs9IChlbGVuID4+IHRhYmxlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwl9CisJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisKKwl1bmxvY2tfa2VybmVsKCk7CisKKwlyZXR1cm4gYWNjdW07Cit9CisJCitzdGF0aWMgdW5zaWduZWQgaW50Cit1ZGZfY291bnRfZnJlZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCXVuc2lnbmVkIGludCBhY2N1bSA9IDA7CisKKwlpZiAoVURGX1NCX0xWSURCSChzYikpCisJeworCQlpZiAobGUzMl90b19jcHUoVURGX1NCX0xWSUQoc2IpLT5udW1PZlBhcnRpdGlvbnMpID4gVURGX1NCX1BBUlRJVElPTihzYikpCisJCXsKKwkJCWFjY3VtID0gbGUzMl90b19jcHUoVURGX1NCX0xWSUQoc2IpLT5mcmVlU3BhY2VUYWJsZVtVREZfU0JfUEFSVElUSU9OKHNiKV0pOworCisJCQlpZiAoYWNjdW0gPT0gMHhGRkZGRkZGRikKKwkJCQlhY2N1bSA9IDA7CisJCX0KKwl9CisKKwlpZiAoYWNjdW0pCisJCXJldHVybiBhY2N1bTsKKworCWlmIChVREZfU0JfUEFSVEZMQUdTKHNiLFVERl9TQl9QQVJUSVRJT04oc2IpKSAmIFVERl9QQVJUX0ZMQUdfVU5BTExPQ19CSVRNQVApCisJeworCQlhY2N1bSArPSB1ZGZfY291bnRfZnJlZV9iaXRtYXAoc2IsCisJCQlVREZfU0JfUEFSVE1BUFMoc2IpW1VERl9TQl9QQVJUSVRJT04oc2IpXS5zX3VzcGFjZS5zX2JpdG1hcCk7CisJfQorCWlmIChVREZfU0JfUEFSVEZMQUdTKHNiLFVERl9TQl9QQVJUSVRJT04oc2IpKSAmIFVERl9QQVJUX0ZMQUdfRlJFRURfQklUTUFQKQorCXsKKwkJYWNjdW0gKz0gdWRmX2NvdW50X2ZyZWVfYml0bWFwKHNiLAorCQkJVURGX1NCX1BBUlRNQVBTKHNiKVtVREZfU0JfUEFSVElUSU9OKHNiKV0uc19mc3BhY2Uuc19iaXRtYXApOworCX0KKwlpZiAoYWNjdW0pCisJCXJldHVybiBhY2N1bTsKKworCWlmIChVREZfU0JfUEFSVEZMQUdTKHNiLFVERl9TQl9QQVJUSVRJT04oc2IpKSAmIFVERl9QQVJUX0ZMQUdfVU5BTExPQ19UQUJMRSkKKwl7CisJCWFjY3VtICs9IHVkZl9jb3VudF9mcmVlX3RhYmxlKHNiLAorCQkJVURGX1NCX1BBUlRNQVBTKHNiKVtVREZfU0JfUEFSVElUSU9OKHNiKV0uc191c3BhY2Uuc190YWJsZSk7CisJfQorCWlmIChVREZfU0JfUEFSVEZMQUdTKHNiLFVERl9TQl9QQVJUSVRJT04oc2IpKSAmIFVERl9QQVJUX0ZMQUdfRlJFRURfVEFCTEUpCisJeworCQlhY2N1bSArPSB1ZGZfY291bnRfZnJlZV90YWJsZShzYiwKKwkJCVVERl9TQl9QQVJUTUFQUyhzYilbVURGX1NCX1BBUlRJVElPTihzYildLnNfZnNwYWNlLnNfdGFibGUpOworCX0KKworCXJldHVybiBhY2N1bTsKK30KZGlmZiAtLWdpdCBhL2ZzL3VkZi9zeW1saW5rLmMgYi9mcy91ZGYvc3ltbGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZjMwNTEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy91ZGYvc3ltbGluay5jCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogc3ltbGluay5jCisgKgorICogUFVSUE9TRQorICoJU3ltbGluayBoYW5kbGluZyByb3V0aW5lcyBmb3IgdGhlIE9TVEEtVURGKHRtKSBmaWxlc3lzdGVtLgorICoKKyAqIENPTlRBQ1RTCisgKglFLW1haWwgcmVnYXJkaW5nIGFueSBwb3J0aW9uIG9mIHRoZSBMaW51eCBVREYgZmlsZSBzeXN0ZW0gc2hvdWxkIGJlCisgKglkaXJlY3RlZCB0byB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBtYWlsaW5nIGxpc3QgKHJ1biBieSBtYWpvcmRvbW8pOgorICoJCWxpbnV4X3VkZkBocGVzanJvLmZjLmhwLmNvbQorICoKKyAqIENPUFlSSUdIVAorICoJVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIChHUEwpLiBDb3BpZXMgb2YgdGhlIEdQTCBjYW4gYmUgb2J0YWluZWQgZnJvbToKKyAqCQlmdHA6Ly9wcmVwLmFpLm1pdC5lZHUvcHViL2dudS9HUEwKKyAqCUVhY2ggY29udHJpYnV0aW5nIGF1dGhvciByZXRhaW5zIGFsbCByaWdodHMgdG8gdGhlaXIgb3duIHdvcmsuCisgKgorICogIChDKSAxOTk4LTIwMDEgQmVuIEZlbm5lbWEKKyAqICAoQykgMTk5OSBTdGVsaWFzIENvbXB1dGluZyBJbmMgCisgKgorICogSElTVE9SWQorICoKKyAqICAwNC8xNi85OSBibGYgIENyZWF0ZWQuCisgKgorICovCisKKyNpbmNsdWRlICJ1ZGZkZWNsLmgiCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdWRmX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgInVkZl9pLmgiCisKK3N0YXRpYyB2b2lkIHVkZl9wY190b19jaGFyKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNoYXIgKmZyb20sIGludCBmcm9tbGVuLCBjaGFyICp0bykKK3sKKwlzdHJ1Y3QgcGF0aENvbXBvbmVudCAqcGM7CisJaW50IGVsZW4gPSAwOworCWNoYXIgKnAgPSB0bzsKKworCXdoaWxlIChlbGVuIDwgZnJvbWxlbikKKwl7CisJCXBjID0gKHN0cnVjdCBwYXRoQ29tcG9uZW50ICopKGZyb20gKyBlbGVuKTsKKwkJc3dpdGNoIChwYy0+Y29tcG9uZW50VHlwZSkKKwkJeworCQkJY2FzZSAxOgorCQkJCWlmIChwYy0+bGVuZ3RoQ29tcG9uZW50SWRlbnQgPT0gMCkKKwkJCQl7CisJCQkJCXAgPSB0bzsKKwkJCQkJKnArKyA9ICcvJzsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CisJCQkJbWVtY3B5KHAsICIuLi8iLCAzKTsKKwkJCQlwICs9IDM7CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6CisJCQkJbWVtY3B5KHAsICIuLyIsIDIpOworCQkJCXAgKz0gMjsKKwkJCQkvKiB0aGF0IHdvdWxkIGJlIC4gLSBqdXN0IGlnbm9yZSAqLworCQkJCWJyZWFrOworCQkJY2FzZSA1OgorCQkJCXAgKz0gdWRmX2dldF9maWxlbmFtZShzYiwgcGMtPmNvbXBvbmVudElkZW50LCBwLCBwYy0+bGVuZ3RoQ29tcG9uZW50SWRlbnQpOworCQkJCSpwKysgPSAnLyc7CisJCQkJYnJlYWs7CisJCX0KKwkJZWxlbiArPSBzaXplb2Yoc3RydWN0IHBhdGhDb21wb25lbnQpICsgcGMtPmxlbmd0aENvbXBvbmVudElkZW50OworCX0KKwlpZiAocCA+IHRvKzEpCisJCXBbLTFdID0gJ1wwJzsKKwllbHNlCisJCXBbMF0gPSAnXDAnOworfQorCitzdGF0aWMgaW50IHVkZl9zeW1saW5rX2ZpbGxlcihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHBhZ2UtPm1hcHBpbmctPmhvc3Q7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IE5VTEw7CisJY2hhciAqc3ltbGluazsKKwlpbnQgZXJyID0gLUVJTzsKKwljaGFyICpwID0ga21hcChwYWdlKTsKKworCWxvY2tfa2VybmVsKCk7CisJaWYgKFVERl9JX0FMTE9DVFlQRShpbm9kZSkgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCKQorCQlzeW1saW5rID0gVURGX0lfREFUQShpbm9kZSkgKyBVREZfSV9MRU5FQVRUUihpbm9kZSk7CisJZWxzZQorCXsKKwkJYmggPSBzYl9icmVhZChpbm9kZS0+aV9zYiwgdWRmX2Jsb2NrX21hcChpbm9kZSwgMCkpOworCisJCWlmICghYmgpCisJCQlnb3RvIG91dDsKKworCQlzeW1saW5rID0gYmgtPmJfZGF0YTsKKwl9CisKKwl1ZGZfcGNfdG9fY2hhcihpbm9kZS0+aV9zYiwgc3ltbGluaywgaW5vZGUtPmlfc2l6ZSwgcCk7CisJdWRmX3JlbGVhc2VfZGF0YShiaCk7CisKKwl1bmxvY2tfa2VybmVsKCk7CisJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOworCWt1bm1hcChwYWdlKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXR1cm4gMDsKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJU2V0UGFnZUVycm9yKHBhZ2UpOworCWt1bm1hcChwYWdlKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogc3ltbGlua3MgY2FuJ3QgZG8gbXVjaC4uLgorICovCitzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHVkZl9zeW1saW5rX2FvcHMgPSB7CisJLnJlYWRwYWdlCQk9IHVkZl9zeW1saW5rX2ZpbGxlciwKK307CmRpZmYgLS1naXQgYS9mcy91ZGYvdHJ1bmNhdGUuYyBiL2ZzL3VkZi90cnVuY2F0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYzhhNTUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy91ZGYvdHJ1bmNhdGUuYwpAQCAtMCwwICsxLDI4NCBAQAorLyoKKyAqIHRydW5jYXRlLmMKKyAqCisgKiBQVVJQT1NFCisgKglUcnVuY2F0ZSBoYW5kbGluZyByb3V0aW5lcyBmb3IgdGhlIE9TVEEtVURGKHRtKSBmaWxlc3lzdGVtLgorICoKKyAqIENPTlRBQ1RTCisgKglFLW1haWwgcmVnYXJkaW5nIGFueSBwb3J0aW9uIG9mIHRoZSBMaW51eCBVREYgZmlsZSBzeXN0ZW0gc2hvdWxkIGJlCisgKglkaXJlY3RlZCB0byB0aGUgZGV2ZWxvcG1lbnQgdGVhbSBtYWlsaW5nIGxpc3QgKHJ1biBieSBtYWpvcmRvbW8pOgorICoJCWxpbnV4X3VkZkBocGVzanJvLmZjLmhwLmNvbQorICoKKyAqIENPUFlSSUdIVAorICoJVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIChHUEwpLiBDb3BpZXMgb2YgdGhlIEdQTCBjYW4gYmUgb2J0YWluZWQgZnJvbToKKyAqCQlmdHA6Ly9wcmVwLmFpLm1pdC5lZHUvcHViL2dudS9HUEwKKyAqCUVhY2ggY29udHJpYnV0aW5nIGF1dGhvciByZXRhaW5zIGFsbCByaWdodHMgdG8gdGhlaXIgb3duIHdvcmsuCisgKgorICogIChDKSAxOTk5LTIwMDQgQmVuIEZlbm5lbWEKKyAqICAoQykgMTk5OSBTdGVsaWFzIENvbXB1dGluZyBJbmMKKyAqCisgKiBISVNUT1JZCisgKgorICogIDAyLzI0Lzk5IGJsZiAgQ3JlYXRlZC4KKyAqCisgKi8KKworI2luY2x1ZGUgInVkZmRlY2wuaCIKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvdWRmX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKworI2luY2x1ZGUgInVkZl9pLmgiCisjaW5jbHVkZSAidWRmX3NiLmgiCisKK3N0YXRpYyB2b2lkIGV4dGVudF90cnVuYyhzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwga2VybmVsX2xiX2FkZHIgYmxvYywgaW50IGV4dG9mZnNldCwKKwlrZXJuZWxfbGJfYWRkciBlbG9jLCBpbnQ4X3QgZXR5cGUsIHVpbnQzMl90IGVsZW4sIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIHVpbnQzMl90IG5lbGVuKQoreworCWtlcm5lbF9sYl9hZGRyIG5lbG9jID0geyAwLCAwIH07CisJaW50IGxhc3RfYmxvY2sgPSAoZWxlbiArIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpID4+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCWludCBmaXJzdF9ibG9jayA9IChuZWxlbiArIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpID4+IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCisJaWYgKG5lbGVuKQorCXsKKwkJaWYgKGV0eXBlID09IChFWFRfTk9UX1JFQ09SREVEX0FMTE9DQVRFRCA+PiAzMCkpCisJCXsKKwkJCXVkZl9mcmVlX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgaW5vZGUsIGVsb2MsIDAsIGxhc3RfYmxvY2spOworCQkJZXR5cGUgPSAoRVhUX05PVF9SRUNPUkRFRF9OT1RfQUxMT0NBVEVEID4+IDMwKTsKKwkJfQorCQllbHNlCisJCQluZWxvYyA9IGVsb2M7CisJCW5lbGVuID0gKGV0eXBlIDw8IDMwKSB8IG5lbGVuOworCX0KKworCWlmIChlbGVuICE9IG5lbGVuKQorCXsKKwkJdWRmX3dyaXRlX2FleHQoaW5vZGUsIGJsb2MsICZleHRvZmZzZXQsIG5lbG9jLCBuZWxlbiwgYmgsIDApOworCQlpZiAobGFzdF9ibG9jayAtIGZpcnN0X2Jsb2NrID4gMCkKKwkJeworCQkJaWYgKGV0eXBlID09IChFWFRfUkVDT1JERURfQUxMT0NBVEVEID4+IDMwKSkKKwkJCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKworCQkJaWYgKGV0eXBlICE9IChFWFRfTk9UX1JFQ09SREVEX05PVF9BTExPQ0FURUQgPj4gMzApKQorCQkJCXVkZl9mcmVlX2Jsb2Nrcyhpbm9kZS0+aV9zYiwgaW5vZGUsIGVsb2MsIGZpcnN0X2Jsb2NrLCBsYXN0X2Jsb2NrIC0gZmlyc3RfYmxvY2spOworCQl9CisJfQorfQorCit2b2lkIHVkZl9kaXNjYXJkX3ByZWFsbG9jKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCWtlcm5lbF9sYl9hZGRyIGJsb2MsIGVsb2M7CisJdWludDMyX3QgZXh0b2Zmc2V0ID0gMCwgZWxlbiwgbmVsZW47CisJdWludDY0X3QgbGJjb3VudCA9IDA7CisJaW50OF90IGV0eXBlID0gLTEsIG5ldHlwZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwlpbnQgYWRzaXplOworCisJaWYgKFVERl9JX0FMTE9DVFlQRShpbm9kZSkgPT0gSUNCVEFHX0ZMQUdfQURfSU5fSUNCIHx8CisJCWlub2RlLT5pX3NpemUgPT0gVURGX0lfTEVORVhURU5UUyhpbm9kZSkpCisJeworCQlyZXR1cm47CisJfQorCisJaWYgKFVERl9JX0FMTE9DVFlQRShpbm9kZSkgPT0gSUNCVEFHX0ZMQUdfQURfU0hPUlQpCisJCWFkc2l6ZSA9IHNpemVvZihzaG9ydF9hZCk7CisJZWxzZSBpZiAoVURGX0lfQUxMT0NUWVBFKGlub2RlKSA9PSBJQ0JUQUdfRkxBR19BRF9MT05HKQorCQlhZHNpemUgPSBzaXplb2YobG9uZ19hZCk7CisJZWxzZQorCQlhZHNpemUgPSAwOworCisJYmxvYyA9IFVERl9JX0xPQ0FUSU9OKGlub2RlKTsKKworCXdoaWxlICgobmV0eXBlID0gdWRmX25leHRfYWV4dChpbm9kZSwgJmJsb2MsICZleHRvZmZzZXQsICZlbG9jLCAmZWxlbiwgJmJoLCAxKSkgIT0gLTEpCisJeworCQlldHlwZSA9IG5ldHlwZTsKKwkJbGJjb3VudCArPSBlbGVuOworCQlpZiAobGJjb3VudCA+IGlub2RlLT5pX3NpemUgJiYgbGJjb3VudCAtIGlub2RlLT5pX3NpemUgPCBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUpCisJCXsKKwkJCW5lbGVuID0gZWxlbiAtIChsYmNvdW50IC0gaW5vZGUtPmlfc2l6ZSk7CisJCQlleHRlbnRfdHJ1bmMoaW5vZGUsIGJsb2MsIGV4dG9mZnNldC1hZHNpemUsIGVsb2MsIGV0eXBlLCBlbGVuLCBiaCwgbmVsZW4pOworCQkJbGJjb3VudCA9IGlub2RlLT5pX3NpemU7CisJCX0KKwl9CisJaWYgKGV0eXBlID09IChFWFRfTk9UX1JFQ09SREVEX0FMTE9DQVRFRCA+PiAzMCkpCisJeworCQlleHRvZmZzZXQgLT0gYWRzaXplOworCQlsYmNvdW50IC09IGVsZW47CisJCWV4dGVudF90cnVuYyhpbm9kZSwgYmxvYywgZXh0b2Zmc2V0LCBlbG9jLCBldHlwZSwgZWxlbiwgYmgsIDApOworCQlpZiAoIWJoKQorCQl7CisJCQlVREZfSV9MRU5BTExPQyhpbm9kZSkgPSBleHRvZmZzZXQgLSB1ZGZfZmlsZV9lbnRyeV9hbGxvY19vZmZzZXQoaW5vZGUpOworCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzdHJ1Y3QgYWxsb2NFeHREZXNjICphZWQgPSAoc3RydWN0IGFsbG9jRXh0RGVzYyAqKShiaC0+Yl9kYXRhKTsKKwkJCWFlZC0+bGVuZ3RoQWxsb2NEZXNjcyA9IGNwdV90b19sZTMyKGV4dG9mZnNldCAtIHNpemVvZihzdHJ1Y3QgYWxsb2NFeHREZXNjKSk7CisJCQlpZiAoIVVERl9RVUVSWV9GTEFHKGlub2RlLT5pX3NiLCBVREZfRkxBR19TVFJJQ1QpIHx8IFVERl9TQl9VREZSRVYoaW5vZGUtPmlfc2IpID49IDB4MDIwMSkKKwkJCQl1ZGZfdXBkYXRlX3RhZyhiaC0+Yl9kYXRhLCBleHRvZmZzZXQpOworCQkJZWxzZQorCQkJCXVkZl91cGRhdGVfdGFnKGJoLT5iX2RhdGEsIHNpemVvZihzdHJ1Y3QgYWxsb2NFeHREZXNjKSk7CisJCQltYXJrX2J1ZmZlcl9kaXJ0eV9pbm9kZShiaCwgaW5vZGUpOworCQl9CisJfQorCVVERl9JX0xFTkVYVEVOVFMoaW5vZGUpID0gbGJjb3VudDsKKworCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworfQorCit2b2lkIHVkZl90cnVuY2F0ZV9leHRlbnRzKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCWtlcm5lbF9sYl9hZGRyIGJsb2MsIGVsb2MsIG5lbG9jID0geyAwLCAwIH07CisJdWludDMyX3QgZXh0b2Zmc2V0LCBlbGVuLCBvZmZzZXQsIG5lbGVuID0gMCwgbGVsZW4gPSAwLCBsZW5hbGxvYzsKKwlpbnQ4X3QgZXR5cGU7CisJaW50IGZpcnN0X2Jsb2NrID0gaW5vZGUtPmlfc2l6ZSA+PiBpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0czsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gTlVMTDsKKwlpbnQgYWRzaXplOworCisJaWYgKFVERl9JX0FMTE9DVFlQRShpbm9kZSkgPT0gSUNCVEFHX0ZMQUdfQURfU0hPUlQpCisJCWFkc2l6ZSA9IHNpemVvZihzaG9ydF9hZCk7CisJZWxzZSBpZiAoVURGX0lfQUxMT0NUWVBFKGlub2RlKSA9PSBJQ0JUQUdfRkxBR19BRF9MT05HKQorCQlhZHNpemUgPSBzaXplb2YobG9uZ19hZCk7CisJZWxzZQorCQlhZHNpemUgPSAwOworCisJZXR5cGUgPSBpbm9kZV9ibWFwKGlub2RlLCBmaXJzdF9ibG9jaywgJmJsb2MsICZleHRvZmZzZXQsICZlbG9jLCAmZWxlbiwgJm9mZnNldCwgJmJoKTsKKwlvZmZzZXQgKz0gKGlub2RlLT5pX3NpemUgJiAoaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkpOworCWlmIChldHlwZSAhPSAtMSkKKwl7CisJCWV4dG9mZnNldCAtPSBhZHNpemU7CisJCWV4dGVudF90cnVuYyhpbm9kZSwgYmxvYywgZXh0b2Zmc2V0LCBlbG9jLCBldHlwZSwgZWxlbiwgYmgsIG9mZnNldCk7CisJCWV4dG9mZnNldCArPSBhZHNpemU7CisKKwkJaWYgKG9mZnNldCkKKwkJCWxlbmFsbG9jID0gZXh0b2Zmc2V0OworCQllbHNlCisJCQlsZW5hbGxvYyA9IGV4dG9mZnNldCAtIGFkc2l6ZTsKKworCQlpZiAoIWJoKQorCQkJbGVuYWxsb2MgLT0gdWRmX2ZpbGVfZW50cnlfYWxsb2Nfb2Zmc2V0KGlub2RlKTsKKwkJZWxzZQorCQkJbGVuYWxsb2MgLT0gc2l6ZW9mKHN0cnVjdCBhbGxvY0V4dERlc2MpOworCisJCXdoaWxlICgoZXR5cGUgPSB1ZGZfY3VycmVudF9hZXh0KGlub2RlLCAmYmxvYywgJmV4dG9mZnNldCwgJmVsb2MsICZlbGVuLCAmYmgsIDApKSAhPSAtMSkKKwkJeworCQkJaWYgKGV0eXBlID09IChFWFRfTkVYVF9FWFRFTlRfQUxMT0NERUNTID4+IDMwKSkKKwkJCXsKKwkJCQl1ZGZfd3JpdGVfYWV4dChpbm9kZSwgYmxvYywgJmV4dG9mZnNldCwgbmVsb2MsIG5lbGVuLCBiaCwgMCk7CisJCQkJZXh0b2Zmc2V0ID0gMDsKKwkJCQlpZiAobGVsZW4pCisJCQkJeworCQkJCQlpZiAoIWJoKQorCQkJCQkJQlVHKCk7CisJCQkJCWVsc2UKKwkJCQkJCW1lbXNldChiaC0+Yl9kYXRhLCAweDAwLCBzaXplb2Yoc3RydWN0IGFsbG9jRXh0RGVzYykpOworCQkJCQl1ZGZfZnJlZV9ibG9ja3MoaW5vZGUtPmlfc2IsIGlub2RlLCBibG9jLCAwLCBsZWxlbik7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCWlmICghYmgpCisJCQkJCXsKKwkJCQkJCVVERl9JX0xFTkFMTE9DKGlub2RlKSA9IGxlbmFsbG9jOworCQkJCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlzdHJ1Y3QgYWxsb2NFeHREZXNjICphZWQgPSAoc3RydWN0IGFsbG9jRXh0RGVzYyAqKShiaC0+Yl9kYXRhKTsKKwkJCQkJCWFlZC0+bGVuZ3RoQWxsb2NEZXNjcyA9IGNwdV90b19sZTMyKGxlbmFsbG9jKTsKKwkJCQkJCWlmICghVURGX1FVRVJZX0ZMQUcoaW5vZGUtPmlfc2IsIFVERl9GTEFHX1NUUklDVCkgfHwgVURGX1NCX1VERlJFVihpbm9kZS0+aV9zYikgPj0gMHgwMjAxKQorCQkJCQkJCXVkZl91cGRhdGVfdGFnKGJoLT5iX2RhdGEsIGxlbmFsbG9jICsKKwkJCQkJCQkJc2l6ZW9mKHN0cnVjdCBhbGxvY0V4dERlc2MpKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQl1ZGZfdXBkYXRlX3RhZyhiaC0+Yl9kYXRhLCBzaXplb2Yoc3RydWN0IGFsbG9jRXh0RGVzYykpOworCQkJCQkJbWFya19idWZmZXJfZGlydHlfaW5vZGUoYmgsIGlub2RlKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworCQkJCWV4dG9mZnNldCA9IHNpemVvZihzdHJ1Y3QgYWxsb2NFeHREZXNjKTsKKwkJCQlibG9jID0gZWxvYzsKKwkJCQliaCA9IHVkZl90cmVhZChpbm9kZS0+aV9zYiwgdWRmX2dldF9sYl9wYmxvY2soaW5vZGUtPmlfc2IsIGJsb2MsIDApKTsKKwkJCQlpZiAoZWxlbikKKwkJCQkJbGVsZW4gPSAoZWxlbiArIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpID4+CisJCQkJCQlpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0czsKKwkJCQllbHNlCisJCQkJCWxlbGVuID0gMTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlleHRlbnRfdHJ1bmMoaW5vZGUsIGJsb2MsIGV4dG9mZnNldCwgZWxvYywgZXR5cGUsIGVsZW4sIGJoLCAwKTsKKwkJCQlleHRvZmZzZXQgKz0gYWRzaXplOworCQkJfQorCQl9CisKKwkJaWYgKGxlbGVuKQorCQl7CisJCQlpZiAoIWJoKQorCQkJCUJVRygpOworCQkJZWxzZQorCQkJCW1lbXNldChiaC0+Yl9kYXRhLCAweDAwLCBzaXplb2Yoc3RydWN0IGFsbG9jRXh0RGVzYykpOworCQkJdWRmX2ZyZWVfYmxvY2tzKGlub2RlLT5pX3NiLCBpbm9kZSwgYmxvYywgMCwgbGVsZW4pOworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKCFiaCkKKwkJCXsKKwkJCQlVREZfSV9MRU5BTExPQyhpbm9kZSkgPSBsZW5hbGxvYzsKKwkJCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlzdHJ1Y3QgYWxsb2NFeHREZXNjICphZWQgPSAoc3RydWN0IGFsbG9jRXh0RGVzYyAqKShiaC0+Yl9kYXRhKTsKKwkJCQlhZWQtPmxlbmd0aEFsbG9jRGVzY3MgPSBjcHVfdG9fbGUzMihsZW5hbGxvYyk7CisJCQkJaWYgKCFVREZfUVVFUllfRkxBRyhpbm9kZS0+aV9zYiwgVURGX0ZMQUdfU1RSSUNUKSB8fCBVREZfU0JfVURGUkVWKGlub2RlLT5pX3NiKSA+PSAweDAyMDEpCisJCQkJCXVkZl91cGRhdGVfdGFnKGJoLT5iX2RhdGEsIGxlbmFsbG9jICsKKwkJCQkJCXNpemVvZihzdHJ1Y3QgYWxsb2NFeHREZXNjKSk7CisJCQkJZWxzZQorCQkJCQl1ZGZfdXBkYXRlX3RhZyhiaC0+Yl9kYXRhLCBzaXplb2Yoc3RydWN0IGFsbG9jRXh0RGVzYykpOworCQkJCW1hcmtfYnVmZmVyX2RpcnR5X2lub2RlKGJoLCBpbm9kZSk7CisJCQl9CisJCX0KKwl9CisJZWxzZSBpZiAoaW5vZGUtPmlfc2l6ZSkKKwl7CisJCWlmIChvZmZzZXQpCisJCXsKKwkJCWV4dG9mZnNldCAtPSBhZHNpemU7CisJCQlldHlwZSA9IHVkZl9uZXh0X2FleHQoaW5vZGUsICZibG9jLCAmZXh0b2Zmc2V0LCAmZWxvYywgJmVsZW4sICZiaCwgMSk7CisJCQlpZiAoZXR5cGUgPT0gKEVYVF9OT1RfUkVDT1JERURfTk9UX0FMTE9DQVRFRCA+PiAzMCkpCisJCQl7CisJCQkJZXh0b2Zmc2V0IC09IGFkc2l6ZTsKKwkJCQllbGVuID0gRVhUX05PVF9SRUNPUkRFRF9OT1RfQUxMT0NBVEVEIHwgKGVsZW4gKyBvZmZzZXQpOworCQkJCXVkZl93cml0ZV9hZXh0KGlub2RlLCBibG9jLCAmZXh0b2Zmc2V0LCBlbG9jLCBlbGVuLCBiaCwgMCk7CisJCQl9CisJCQllbHNlIGlmIChldHlwZSA9PSAoRVhUX05PVF9SRUNPUkRFRF9BTExPQ0FURUQgPj4gMzApKQorCQkJeworCQkJCWtlcm5lbF9sYl9hZGRyIG5lbG9jID0geyAwLCAwIH07CisJCQkJZXh0b2Zmc2V0IC09IGFkc2l6ZTsKKwkJCQluZWxlbiA9IEVYVF9OT1RfUkVDT1JERURfTk9UX0FMTE9DQVRFRCB8CisJCQkJCSgoZWxlbiArIG9mZnNldCArIGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpICYKKwkJCQkJfihpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSk7CisJCQkJdWRmX3dyaXRlX2FleHQoaW5vZGUsIGJsb2MsICZleHRvZmZzZXQsIG5lbG9jLCBuZWxlbiwgYmgsIDEpOworCQkJCXVkZl9hZGRfYWV4dChpbm9kZSwgJmJsb2MsICZleHRvZmZzZXQsIGVsb2MsIChldHlwZSA8PCAzMCkgfCBlbGVuLCAmYmgsIDEpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmIChlbGVuICYgKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZSAtIDEpKQorCQkJCXsKKwkJCQkJZXh0b2Zmc2V0IC09IGFkc2l6ZTsKKwkJCQkJZWxlbiA9IEVYVF9SRUNPUkRFRF9BTExPQ0FURUQgfAorCQkJCQkJKChlbGVuICsgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplIC0gMSkgJgorCQkJCQkJfihpbm9kZS0+aV9zYi0+c19ibG9ja3NpemUgLSAxKSk7CisJCQkJCXVkZl93cml0ZV9hZXh0KGlub2RlLCBibG9jLCAmZXh0b2Zmc2V0LCBlbG9jLCBlbGVuLCBiaCwgMSk7CisJCQkJfQorCQkJCW1lbXNldCgmZWxvYywgMHgwMCwgc2l6ZW9mKGtlcm5lbF9sYl9hZGRyKSk7CisJCQkJZWxlbiA9IEVYVF9OT1RfUkVDT1JERURfTk9UX0FMTE9DQVRFRCB8IG9mZnNldDsKKwkJCQl1ZGZfYWRkX2FleHQoaW5vZGUsICZibG9jLCAmZXh0b2Zmc2V0LCBlbG9jLCBlbGVuLCAmYmgsIDEpOworCQkJfQorCQl9CisJfQorCVVERl9JX0xFTkVYVEVOVFMoaW5vZGUpID0gaW5vZGUtPmlfc2l6ZTsKKworCXVkZl9yZWxlYXNlX2RhdGEoYmgpOworfQpkaWZmIC0tZ2l0IGEvZnMvdWRmL3VkZl9pLmggYi9mcy91ZGYvdWRmX2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2RiZTZmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvdWRmL3VkZl9pLmgKQEAgLTAsMCArMSwyNiBAQAorI2lmbmRlZiBfX0xJTlVYX1VERl9JX0gKKyNkZWZpbmUgX19MSU5VWF9VREZfSV9ICisKKyNpbmNsdWRlIDxsaW51eC91ZGZfZnNfaS5oPgorc3RhdGljIGlubGluZSBzdHJ1Y3QgdWRmX2lub2RlX2luZm8gKlVERl9JKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJcmV0dXJuIGxpc3RfZW50cnkoaW5vZGUsIHN0cnVjdCB1ZGZfaW5vZGVfaW5mbywgdmZzX2lub2RlKTsKK30KKworI2RlZmluZSBVREZfSV9MT0NBVElPTihYKQkoIFVERl9JKFgpLT5pX2xvY2F0aW9uICkKKyNkZWZpbmUgVURGX0lfTEVORUFUVFIoWCkJKCBVREZfSShYKS0+aV9sZW5FQXR0ciApCisjZGVmaW5lIFVERl9JX0xFTkFMTE9DKFgpCSggVURGX0koWCktPmlfbGVuQWxsb2MgKQorI2RlZmluZSBVREZfSV9MRU5FWFRFTlRTKFgpCSggVURGX0koWCktPmlfbGVuRXh0ZW50cyApCisjZGVmaW5lIFVERl9JX1VOSVFVRShYKQkJKCBVREZfSShYKS0+aV91bmlxdWUgKQorI2RlZmluZSBVREZfSV9BTExPQ1RZUEUoWCkJKCBVREZfSShYKS0+aV9hbGxvY190eXBlICkKKyNkZWZpbmUgVURGX0lfRUZFKFgpCQkoIFVERl9JKFgpLT5pX2VmZSApCisjZGVmaW5lIFVERl9JX1VTRShYKQkJKCBVREZfSShYKS0+aV91c2UgKQorI2RlZmluZSBVREZfSV9TVFJBVDQwOTYoWCkJKCBVREZfSShYKS0+aV9zdHJhdDQwOTYgKQorI2RlZmluZSBVREZfSV9ORVhUX0FMTE9DX0JMT0NLKFgpCSggVURGX0koWCktPmlfbmV4dF9hbGxvY19ibG9jayApCisjZGVmaW5lIFVERl9JX05FWFRfQUxMT0NfR09BTChYKQkoIFVERl9JKFgpLT5pX25leHRfYWxsb2NfZ29hbCApCisjZGVmaW5lIFVERl9JX0NSVElNRShYKQkJKCBVREZfSShYKS0+aV9jcnRpbWUgKQorI2RlZmluZSBVREZfSV9TQUQoWCkJCSggVURGX0koWCktPmlfZXh0Lmlfc2FkICkKKyNkZWZpbmUgVURGX0lfTEFEKFgpCQkoIFVERl9JKFgpLT5pX2V4dC5pX2xhZCApCisjZGVmaW5lIFVERl9JX0RBVEEoWCkJCSggVURGX0koWCktPmlfZXh0LmlfZGF0YSApCisKKyNlbmRpZiAvKiAhZGVmaW5lZChfTElOVVhfVURGX0lfSCkgKi8KZGlmZiAtLWdpdCBhL2ZzL3VkZi91ZGZfc2IuaCBiL2ZzL3VkZi91ZGZfc2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTU0OTIyCi0tLSAvZGV2L251bGwKKysrIGIvZnMvdWRmL3VkZl9zYi5oCkBAIC0wLDAgKzEsMTM5IEBACisjaWZuZGVmIF9fTElOVVhfVURGX1NCX0gKKyNkZWZpbmUgX19MSU5VWF9VREZfU0JfSAorCisvKiBTaW5jZSBVREYgMi4wMSBpcyBJU08gMTMzNDYgYmFzZWQuLi4gKi8KKyNkZWZpbmUgVURGX1NVUEVSX01BR0lDCQkJMHgxNTAxMzM0NgorCisjZGVmaW5lIFVERl9NQVhfUkVBRF9WRVJTSU9OCQkweDAyMDEKKyNkZWZpbmUgVURGX01BWF9XUklURV9WRVJTSU9OCQkweDAyMDEKKworI2RlZmluZSBVREZfRkxBR19VU0VfRVhURU5ERURfRkUJMAorI2RlZmluZSBVREZfVkVSU19VU0VfRVhURU5ERURfRkUJMHgwMjAwCisjZGVmaW5lIFVERl9GTEFHX1VTRV9TVFJFQU1TCQkxCisjZGVmaW5lIFVERl9WRVJTX1VTRV9TVFJFQU1TCQkweDAyMDAKKyNkZWZpbmUgVURGX0ZMQUdfVVNFX1NIT1JUX0FECQkyCisjZGVmaW5lIFVERl9GTEFHX1VTRV9BRF9JTl9JQ0IJCTMKKyNkZWZpbmUgVURGX0ZMQUdfVVNFX0ZJTEVfQ1RJTUVfRUEJNAorI2RlZmluZSBVREZfRkxBR19TVFJJQ1QJCQk1CisjZGVmaW5lIFVERl9GTEFHX1VOREVMRVRFCQk2CisjZGVmaW5lIFVERl9GTEFHX1VOSElERQkJCTcKKyNkZWZpbmUgVURGX0ZMQUdfVkFSQ09OVgkJOAorI2RlZmluZSBVREZfRkxBR19OTFNfTUFQCQk5CisjZGVmaW5lIFVERl9GTEFHX1VURjgJCQkxMAorCisjZGVmaW5lIFVERl9QQVJUX0ZMQUdfVU5BTExPQ19CSVRNQVAJMHgwMDAxCisjZGVmaW5lIFVERl9QQVJUX0ZMQUdfVU5BTExPQ19UQUJMRQkweDAwMDIKKyNkZWZpbmUgVURGX1BBUlRfRkxBR19GUkVFRF9CSVRNQVAJMHgwMDA0CisjZGVmaW5lIFVERl9QQVJUX0ZMQUdfRlJFRURfVEFCTEUJMHgwMDA4CisjZGVmaW5lIFVERl9QQVJUX0ZMQUdfUkVBRF9PTkxZCQkweDAwMTAKKyNkZWZpbmUgVURGX1BBUlRfRkxBR19XUklURV9PTkNFCTB4MDAyMAorI2RlZmluZSBVREZfUEFSVF9GTEFHX1JFV1JJVEFCTEUJMHgwMDQwCisjZGVmaW5lIFVERl9QQVJUX0ZMQUdfT1ZFUldSSVRBQkxFCTB4MDA4MAorCitzdGF0aWMgaW5saW5lIHN0cnVjdCB1ZGZfc2JfaW5mbyAqVURGX1NCKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJcmV0dXJuIHNiLT5zX2ZzX2luZm87Cit9CisKKyNkZWZpbmUgVURGX1NCX0ZSRUUoWClcCit7XAorCWlmIChVREZfU0IoWCkpXAorCXtcCisJCWlmIChVREZfU0JfUEFSVE1BUFMoWCkpXAorCQkJa2ZyZWUoVURGX1NCX1BBUlRNQVBTKFgpKTtcCisJCVVERl9TQl9QQVJUTUFQUyhYKSA9IE5VTEw7XAorCX1cCit9CisKKyNkZWZpbmUgVURGX1NCX0FMTE9DX1BBUlRNQVBTKFgsWSlcCit7XAorCVVERl9TQl9QQVJUTUFQUyhYKSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB1ZGZfcGFydF9tYXApICogWSwgR0ZQX0tFUk5FTCk7XAorCWlmIChVREZfU0JfUEFSVE1BUFMoWCkgIT0gTlVMTClcCisJe1wKKwkJVURGX1NCX05VTVBBUlRTKFgpID0gWTtcCisJCW1lbXNldChVREZfU0JfUEFSVE1BUFMoWCksIDB4MDAsIHNpemVvZihzdHJ1Y3QgdWRmX3BhcnRfbWFwKSAqIFkpO1wKKwl9XAorCWVsc2VcCisJe1wKKwkJVURGX1NCX05VTVBBUlRTKFgpID0gMDtcCisJCXVkZl9lcnJvcihYLCBfX0ZVTkNUSU9OX18sICJVbmFibGUgdG8gYWxsb2NhdGUgc3BhY2UgZm9yICVkIHBhcnRpdGlvbiBtYXBzIiwgWSk7XAorCX1cCit9CisKKyNkZWZpbmUgVURGX1NCX0FMTE9DX0JJVE1BUChYLFksWilcCit7XAorCWludCBucl9ncm91cHMgPSAoKFVERl9TQl9QQVJUTEVOKChYKSwoWSkpICsgKHNpemVvZihzdHJ1Y3Qgc3BhY2VCaXRtYXBEZXNjKSA8PCAzKSArXAorCQkoKFgpLT5zX2Jsb2Nrc2l6ZSAqIDgpIC0gMSkgLyAoKFgpLT5zX2Jsb2Nrc2l6ZSAqIDgpKTtcCisJaW50IHNpemUgPSBzaXplb2Yoc3RydWN0IHVkZl9iaXRtYXApICsgKHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKikgKiBucl9ncm91cHMpO1wKKwlpZiAoc2l6ZSA8PSBQQUdFX1NJWkUpXAorCQlVREZfU0JfUEFSVE1BUFMoWClbKFkpXS5aLnNfYml0bWFwID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTtcCisJZWxzZVwKKwkJVURGX1NCX1BBUlRNQVBTKFgpWyhZKV0uWi5zX2JpdG1hcCA9IHZtYWxsb2Moc2l6ZSk7XAorCWlmIChVREZfU0JfUEFSVE1BUFMoWClbKFkpXS5aLnNfYml0bWFwICE9IE5VTEwpXAorCXtcCisJCW1lbXNldChVREZfU0JfUEFSVE1BUFMoWClbKFkpXS5aLnNfYml0bWFwLCAweDAwLCBzaXplKTtcCisJCVVERl9TQl9QQVJUTUFQUyhYKVsoWSldLlouc19iaXRtYXAtPnNfYmxvY2tfYml0bWFwID1cCisJCQkoc3RydWN0IGJ1ZmZlcl9oZWFkICoqKShVREZfU0JfUEFSVE1BUFMoWClbKFkpXS5aLnNfYml0bWFwICsgMSk7XAorCQlVREZfU0JfUEFSVE1BUFMoWClbKFkpXS5aLnNfYml0bWFwLT5zX25yX2dyb3VwcyA9IG5yX2dyb3VwcztcCisJfVwKKwllbHNlXAorCXtcCisJCXVkZl9lcnJvcihYLCBfX0ZVTkNUSU9OX18sICJVbmFibGUgdG8gYWxsb2NhdGUgc3BhY2UgZm9yIGJpdG1hcCBhbmQgJWQgYnVmZmVyX2hlYWQgcG9pbnRlcnMiLCBucl9ncm91cHMpO1wKKwl9XAorfQorCisjZGVmaW5lIFVERl9TQl9GUkVFX0JJVE1BUChYLFksWilcCit7XAorCWludCBpO1wKKwlpbnQgbnJfZ3JvdXBzID0gVURGX1NCX0JJVE1BUF9OUl9HUk9VUFMoWCxZLFopO1wKKwlpbnQgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdWRmX2JpdG1hcCkgKyAoc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSAqIG5yX2dyb3Vwcyk7XAorCWZvciAoaT0wOyBpPG5yX2dyb3VwczsgaSsrKVwKKwl7XAorCQlpZiAoVURGX1NCX0JJVE1BUChYLFksWixpKSlcCisJCQl1ZGZfcmVsZWFzZV9kYXRhKFVERl9TQl9CSVRNQVAoWCxZLFosaSkpO1wKKwl9XAorCWlmIChzaXplIDw9IFBBR0VfU0laRSlcCisJCWtmcmVlKFVERl9TQl9QQVJUTUFQUyhYKVtZXS5aLnNfYml0bWFwKTtcCisJZWxzZVwKKwkJdmZyZWUoVURGX1NCX1BBUlRNQVBTKFgpW1ldLlouc19iaXRtYXApO1wKK30KKworI2RlZmluZSBVREZfUVVFUllfRkxBRyhYLFkpCQkJKCBVREZfU0IoWCktPnNfZmxhZ3MgJiAoIDEgPDwgKFkpICkgKQorI2RlZmluZSBVREZfU0VUX0ZMQUcoWCxZKQkJCSggVURGX1NCKFgpLT5zX2ZsYWdzIHw9ICggMSA8PCAoWSkgKSApCisjZGVmaW5lIFVERl9DTEVBUl9GTEFHKFgsWSkJCQkoIFVERl9TQihYKS0+c19mbGFncyAmPSB+KCAxIDw8IChZKSApICkKKworI2RlZmluZSBVREZfVVBEQVRFX1VERlJFVihYLFkpCQkJKCAoKFkpID4gVURGX1NCX1VERlJFVihYKSkgPyBVREZfU0JfVURGUkVWKFgpID0gKFkpIDogVURGX1NCX1VERlJFVihYKSApCisKKyNkZWZpbmUgVURGX1NCX1BBUlRNQVBTKFgpCQkJKCBVREZfU0IoWCktPnNfcGFydG1hcHMgKQorI2RlZmluZSBVREZfU0JfUEFSVFRZUEUoWCxZKQkJCSggVURGX1NCX1BBUlRNQVBTKFgpWyhZKV0uc19wYXJ0aXRpb25fdHlwZSApCisjZGVmaW5lIFVERl9TQl9QQVJUUk9PVChYLFkpCQkJKCBVREZfU0JfUEFSVE1BUFMoWClbKFkpXS5zX3BhcnRpdGlvbl9yb290ICkKKyNkZWZpbmUgVURGX1NCX1BBUlRMRU4oWCxZKQkJCSggVURGX1NCX1BBUlRNQVBTKFgpWyhZKV0uc19wYXJ0aXRpb25fbGVuICkKKyNkZWZpbmUgVURGX1NCX1BBUlRWU04oWCxZKQkJCSggVURGX1NCX1BBUlRNQVBTKFgpWyhZKV0uc192b2x1bWVzZXFudW0gKQorI2RlZmluZSBVREZfU0JfUEFSVE5VTShYLFkpCQkJKCBVREZfU0JfUEFSVE1BUFMoWClbKFkpXS5zX3BhcnRpdGlvbl9udW0gKQorI2RlZmluZSBVREZfU0JfVFlQRVNQQVIoWCxZKQkJCSggVURGX1NCX1BBUlRNQVBTKFgpWyhZKV0uc190eXBlX3NwZWNpZmljLnNfc3BhcmluZyApCisjZGVmaW5lIFVERl9TQl9UWVBFVklSVChYLFkpCQkJKCBVREZfU0JfUEFSVE1BUFMoWClbKFkpXS5zX3R5cGVfc3BlY2lmaWMuc192aXJ0dWFsICkKKyNkZWZpbmUgVURGX1NCX1BBUlRGVU5DKFgsWSkJCQkoIFVERl9TQl9QQVJUTUFQUyhYKVsoWSldLnNfcGFydGl0aW9uX2Z1bmMgKQorI2RlZmluZSBVREZfU0JfUEFSVEZMQUdTKFgsWSkJCQkoIFVERl9TQl9QQVJUTUFQUyhYKVsoWSldLnNfcGFydGl0aW9uX2ZsYWdzICkKKyNkZWZpbmUgVURGX1NCX0JJVE1BUChYLFksWixJKQkJCSggVURGX1NCX1BBUlRNQVBTKFgpWyhZKV0uWi5zX2JpdG1hcC0+c19ibG9ja19iaXRtYXBbSV0gKQorI2RlZmluZSBVREZfU0JfQklUTUFQX05SX0dST1VQUyhYLFksWikJCSggVURGX1NCX1BBUlRNQVBTKFgpWyhZKV0uWi5zX2JpdG1hcC0+c19ucl9ncm91cHMgKQorCisjZGVmaW5lIFVERl9TQl9WT0xJREVOVChYKQkJCSggVURGX1NCKFgpLT5zX3ZvbGlkZW50ICkKKyNkZWZpbmUgVURGX1NCX05VTVBBUlRTKFgpCQkJKCBVREZfU0IoWCktPnNfcGFydGl0aW9ucyApCisjZGVmaW5lIFVERl9TQl9QQVJUSVRJT04oWCkJCQkoIFVERl9TQihYKS0+c19wYXJ0aXRpb24gKQorI2RlZmluZSBVREZfU0JfU0VTU0lPTihYKQkJCSggVURGX1NCKFgpLT5zX3Nlc3Npb24gKQorI2RlZmluZSBVREZfU0JfQU5DSE9SKFgpCQkJKCBVREZfU0IoWCktPnNfYW5jaG9yICkKKyNkZWZpbmUgVURGX1NCX0xBU1RCTE9DSyhYKQkJCSggVURGX1NCKFgpLT5zX2xhc3RibG9jayApCisjZGVmaW5lIFVERl9TQl9MVklEQkgoWCkJCQkoIFVERl9TQihYKS0+c19sdmlkYmggKQorI2RlZmluZSBVREZfU0JfTFZJRChYKQkJCQkoIChzdHJ1Y3QgbG9naWNhbFZvbEludGVncml0eURlc2MgKilVREZfU0JfTFZJREJIKFgpLT5iX2RhdGEgKQorI2RlZmluZSBVREZfU0JfTFZJRElVKFgpCQkJKCAoc3RydWN0IGxvZ2ljYWxWb2xJbnRlZ3JpdHlEZXNjSW1wVXNlICopJihVREZfU0JfTFZJRChYKS0+aW1wVXNlW2xlMzJfdG9fY3B1KFVERl9TQl9MVklEKFgpLT5udW1PZlBhcnRpdGlvbnMpICogMiAqIHNpemVvZih1aW50MzJfdCkvc2l6ZW9mKHVpbnQ4X3QpXSkgKQorCisjZGVmaW5lIFVERl9TQl9VTUFTSyhYKQkJCQkoIFVERl9TQihYKS0+c191bWFzayApCisjZGVmaW5lIFVERl9TQl9HSUQoWCkJCQkJKCBVREZfU0IoWCktPnNfZ2lkICkKKyNkZWZpbmUgVURGX1NCX1VJRChYKQkJCQkoIFVERl9TQihYKS0+c191aWQgKQorI2RlZmluZSBVREZfU0JfUkVDT1JEVElNRShYKQkJCSggVURGX1NCKFgpLT5zX3JlY29yZHRpbWUgKQorI2RlZmluZSBVREZfU0JfU0VSSUFMTlVNKFgpCQkJKCBVREZfU0IoWCktPnNfc2VyaWFsbnVtICkKKyNkZWZpbmUgVURGX1NCX1VERlJFVihYKQkJCSggVURGX1NCKFgpLT5zX3VkZnJldiApCisjZGVmaW5lIFVERl9TQl9GTEFHUyhYKQkJCQkoIFVERl9TQihYKS0+c19mbGFncyApCisjZGVmaW5lIFVERl9TQl9WQVQoWCkJCQkJKCBVREZfU0IoWCktPnNfdmF0ICkKKworI2VuZGlmIC8qIF9fTElOVVhfVURGX1NCX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL3VkZi91ZGZkZWNsLmggYi9mcy91ZGYvdWRmZGVjbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNTgwMGUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy91ZGYvdWRmZGVjbC5oCkBAIC0wLDAgKzEsMTY3IEBACisjaWZuZGVmIF9fVURGX0RFQ0xfSAorI2RlZmluZSBfX1VERl9ERUNMX0gKKworI2luY2x1ZGUgPGxpbnV4L3VkZl9mcy5oPgorI2luY2x1ZGUgImVjbWFfMTY3LmgiCisjaW5jbHVkZSAib3N0YV91ZGYuaCIKKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC91ZGZfZnNfaS5oPgorI2luY2x1ZGUgPGxpbnV4L3VkZl9mc19zYi5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisKKyNpbmNsdWRlICJ1ZGZlbmQuaCIKKworI2RlZmluZSB1ZGZfZml4ZWRfdG9fdmFyaWFibGUoeCkgKCAoICggKHgpID4+IDUgKSAqIDM5ICkgKyAoICh4KSAmIDB4MDAwMDAwMUYgKSApCisjZGVmaW5lIHVkZl92YXJpYWJsZV90b19maXhlZCh4KSAoICggKCAoeCkgLyAzOSApIDw8IDUgKSArICggKHgpICUgMzkgKSApCisKKyNkZWZpbmUgVURGX0VYVEVOVF9MRU5HVEhfTUFTSwkweDNGRkZGRkZGCisjZGVmaW5lIFVERl9FWFRFTlRfRkxBR19NQVNLCTB4QzAwMDAwMDAKKworI2RlZmluZSBVREZfTkFNRV9QQUQJCTQKKyNkZWZpbmUgVURGX05BTUVfTEVOCQkyNTYKKyNkZWZpbmUgVURGX1BBVEhfTEVOCQkxMDIzCisKKyNkZWZpbmUgdWRmX2ZpbGVfZW50cnlfYWxsb2Nfb2Zmc2V0KGlub2RlKVwKKwkoVURGX0lfVVNFKGlub2RlKSA/XAorCQlzaXplb2Yoc3RydWN0IHVuYWxsb2NTcGFjZUVudHJ5KSA6XAorCQkoKFVERl9JX0VGRShpbm9kZSkgP1wKKwkJCXNpemVvZihzdHJ1Y3QgZXh0ZW5kZWRGaWxlRW50cnkpIDpcCisJCQlzaXplb2Yoc3RydWN0IGZpbGVFbnRyeSkpICsgVURGX0lfTEVORUFUVFIoaW5vZGUpKSkKKworI2RlZmluZSB1ZGZfZXh0MF9vZmZzZXQoaW5vZGUpXAorCShVREZfSV9BTExPQ1RZUEUoaW5vZGUpID09IElDQlRBR19GTEFHX0FEX0lOX0lDQiA/XAorCQl1ZGZfZmlsZV9lbnRyeV9hbGxvY19vZmZzZXQoaW5vZGUpIDogMCkKKworI2RlZmluZSB1ZGZfZ2V0X2xiX3BibG9jayhzYixsb2Msb2Zmc2V0KSB1ZGZfZ2V0X3BibG9jaygoc2IpLCAobG9jKS5sb2dpY2FsQmxvY2tOdW0sIChsb2MpLnBhcnRpdGlvblJlZmVyZW5jZU51bSwgKG9mZnNldCkpCisKK3N0cnVjdCBkZW50cnk7CitzdHJ1Y3QgaW5vZGU7CitzdHJ1Y3QgdGFza19zdHJ1Y3Q7CitzdHJ1Y3QgYnVmZmVyX2hlYWQ7CitzdHJ1Y3Qgc3VwZXJfYmxvY2s7CisKK2V4dGVybiBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyB1ZGZfZGlyX2lub2RlX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1ZGZfZGlyX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdWRmX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHVkZl9maWxlX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB1ZGZfYW9wczsKK2V4dGVybiBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIHVkZl9hZGluaWNiX2FvcHM7CitleHRlcm4gc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyB1ZGZfc3ltbGlua19hb3BzOworCitzdHJ1Y3QgdWRmX2ZpbGVpZGVudF9iaAoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqc2JoOworCXN0cnVjdCBidWZmZXJfaGVhZCAqZWJoOworCWludCBzb2Zmc2V0OworCWludCBlb2Zmc2V0OworfTsKKworc3RydWN0IHVkZl92ZHNfcmVjb3JkCit7CisJdWludDMyX3QgYmxvY2s7CisJdWludDMyX3Qgdm9sRGVzY1NlcU51bTsKK307CisKK3N0cnVjdCBnZW5lcmljX2Rlc2MKK3sKKwl0YWcJCWRlc2NUYWc7CisJX19sZTMyCQl2b2xEZXNjU2VxTnVtOworfTsKKworc3RydWN0IHVzdHIKK3sKKwl1aW50OF90IHVfY21wSUQ7CisJdWludDhfdCB1X25hbWVbVURGX05BTUVfTEVOLTJdOworCXVpbnQ4X3QgdV9sZW47Cit9OworCisvKiBzdXBlci5jICovCitleHRlcm4gdm9pZCB1ZGZfZXJyb3Ioc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pOworZXh0ZXJuIHZvaWQgdWRmX3dhcm5pbmcoc3RydWN0IHN1cGVyX2Jsb2NrICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCAuLi4pOworCisvKiBuYW1laS5jICovCitleHRlcm4gaW50IHVkZl93cml0ZV9maShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZUlkZW50RGVzYyAqLCBzdHJ1Y3QgZmlsZUlkZW50RGVzYyAqLCBzdHJ1Y3QgdWRmX2ZpbGVpZGVudF9iaCAqLCB1aW50OF90ICosIHVpbnQ4X3QgKik7CisKKy8qIGZpbGUuYyAqLworZXh0ZXJuIGludCB1ZGZfaW9jdGwoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CisKKy8qIGlub2RlLmMgKi8KK2V4dGVybiBzdHJ1Y3QgaW5vZGUgKnVkZl9pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqLCBrZXJuZWxfbGJfYWRkcik7CitleHRlcm4gaW50IHVkZl9zeW5jX2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiB2b2lkIHVkZl9leHBhbmRfZmlsZV9hZGluaWNiKHN0cnVjdCBpbm9kZSAqLCBpbnQsIGludCAqKTsKK2V4dGVybiBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiB1ZGZfZXhwYW5kX2Rpcl9hZGluaWNiKHN0cnVjdCBpbm9kZSAqLCBpbnQgKiwgaW50ICopOworZXh0ZXJuIHN0cnVjdCBidWZmZXJfaGVhZCAqIHVkZl9icmVhZChzdHJ1Y3QgaW5vZGUgKiwgaW50LCBpbnQsIGludCAqKTsKK2V4dGVybiB2b2lkIHVkZl90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gdm9pZCB1ZGZfcmVhZF9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gdm9pZCB1ZGZfZGVsZXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiB2b2lkIHVkZl9jbGVhcl9pbm9kZShzdHJ1Y3QgaW5vZGUgKik7CitleHRlcm4gaW50IHVkZl93cml0ZV9pbm9kZShzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKK2V4dGVybiBsb25nIHVkZl9ibG9ja19tYXAoc3RydWN0IGlub2RlICosIGxvbmcpOworZXh0ZXJuIGludDhfdCBpbm9kZV9ibWFwKHN0cnVjdCBpbm9kZSAqLCBpbnQsIGtlcm5lbF9sYl9hZGRyICosIHVpbnQzMl90ICosIGtlcm5lbF9sYl9hZGRyICosIHVpbnQzMl90ICosIHVpbnQzMl90ICosIHN0cnVjdCBidWZmZXJfaGVhZCAqKik7CitleHRlcm4gaW50OF90IHVkZl9hZGRfYWV4dChzdHJ1Y3QgaW5vZGUgKiwga2VybmVsX2xiX2FkZHIgKiwgaW50ICosIGtlcm5lbF9sYl9hZGRyLCB1aW50MzJfdCwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqLCBpbnQpOworZXh0ZXJuIGludDhfdCB1ZGZfd3JpdGVfYWV4dChzdHJ1Y3QgaW5vZGUgKiwga2VybmVsX2xiX2FkZHIsIGludCAqLCBrZXJuZWxfbGJfYWRkciwgdWludDMyX3QsIHN0cnVjdCBidWZmZXJfaGVhZCAqLCBpbnQpOworZXh0ZXJuIGludDhfdCB1ZGZfZGVsZXRlX2FleHQoc3RydWN0IGlub2RlICosIGtlcm5lbF9sYl9hZGRyLCBpbnQsIGtlcm5lbF9sYl9hZGRyLCB1aW50MzJfdCwgc3RydWN0IGJ1ZmZlcl9oZWFkICopOworZXh0ZXJuIGludDhfdCB1ZGZfbmV4dF9hZXh0KHN0cnVjdCBpbm9kZSAqLCBrZXJuZWxfbGJfYWRkciAqLCBpbnQgKiwga2VybmVsX2xiX2FkZHIgKiwgdWludDMyX3QgKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqLCBpbnQpOworZXh0ZXJuIGludDhfdCB1ZGZfY3VycmVudF9hZXh0KHN0cnVjdCBpbm9kZSAqLCBrZXJuZWxfbGJfYWRkciAqLCBpbnQgKiwga2VybmVsX2xiX2FkZHIgKiwgdWludDMyX3QgKiwgc3RydWN0IGJ1ZmZlcl9oZWFkICoqLCBpbnQpOworCisvKiBtaXNjLmMgKi8KK2V4dGVybiBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnVkZl90Z2V0YmxrKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbnQpOworZXh0ZXJuIHN0cnVjdCBidWZmZXJfaGVhZCAqdWRmX3RyZWFkKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbnQpOworZXh0ZXJuIHN0cnVjdCBnZW5lcmljRm9ybWF0ICp1ZGZfYWRkX2V4dGVuZGVkYXR0cihzdHJ1Y3QgaW5vZGUgKiwgdWludDMyX3QsIHVpbnQzMl90LCB1aW50OF90KTsKK2V4dGVybiBzdHJ1Y3QgZ2VuZXJpY0Zvcm1hdCAqdWRmX2dldF9leHRlbmRlZGF0dHIoc3RydWN0IGlub2RlICosIHVpbnQzMl90LCB1aW50OF90KTsKK2V4dGVybiBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnVkZl9yZWFkX3RhZ2dlZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdWludDMyX3QsIHVpbnQzMl90LCB1aW50MTZfdCAqKTsKK2V4dGVybiBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnVkZl9yZWFkX3B0YWdnZWQoc3RydWN0IHN1cGVyX2Jsb2NrICosIGtlcm5lbF9sYl9hZGRyLCB1aW50MzJfdCwgdWludDE2X3QgKik7CitleHRlcm4gdm9pZCB1ZGZfcmVsZWFzZV9kYXRhKHN0cnVjdCBidWZmZXJfaGVhZCAqKTsKK2V4dGVybiB2b2lkIHVkZl91cGRhdGVfdGFnKGNoYXIgKiwgaW50KTsKK2V4dGVybiB2b2lkIHVkZl9uZXdfdGFnKGNoYXIgKiwgdWludDE2X3QsIHVpbnQxNl90LCB1aW50MTZfdCwgdWludDMyX3QsIGludCk7CisKKy8qIGxvd2xldmVsLmMgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgdWRmX2dldF9sYXN0X3Nlc3Npb24oc3RydWN0IHN1cGVyX2Jsb2NrICopOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdWRmX2dldF9sYXN0X2Jsb2NrKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKKworLyogcGFydGl0aW9uLmMgKi8KK2V4dGVybiB1aW50MzJfdCB1ZGZfZ2V0X3BibG9jayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdWludDMyX3QsIHVpbnQxNl90LCB1aW50MzJfdCk7CitleHRlcm4gdWludDMyX3QgdWRmX2dldF9wYmxvY2tfdmlydDE1KHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1aW50MzJfdCwgdWludDE2X3QsIHVpbnQzMl90KTsKK2V4dGVybiB1aW50MzJfdCB1ZGZfZ2V0X3BibG9ja192aXJ0MjAoc3RydWN0IHN1cGVyX2Jsb2NrICosIHVpbnQzMl90LCB1aW50MTZfdCwgdWludDMyX3QpOworZXh0ZXJuIHVpbnQzMl90IHVkZl9nZXRfcGJsb2NrX3NwYXIxNShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdWludDMyX3QsIHVpbnQxNl90LCB1aW50MzJfdCk7CitleHRlcm4gaW50IHVkZl9yZWxvY2F0ZV9ibG9ja3Moc3RydWN0IHN1cGVyX2Jsb2NrICosIGxvbmcsIGxvbmcgKik7CisKKy8qIHVuaWNvZGUuYyAqLworZXh0ZXJuIGludCB1ZGZfZ2V0X2ZpbGVuYW1lKHN0cnVjdCBzdXBlcl9ibG9jayAqLCB1aW50OF90ICosIHVpbnQ4X3QgKiwgaW50KTsKK2V4dGVybiBpbnQgdWRmX3B1dF9maWxlbmFtZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgdWludDhfdCAqLCB1aW50OF90ICosIGludCk7CitleHRlcm4gaW50IHVkZl9idWlsZF91c3RyKHN0cnVjdCB1c3RyICosIGRzdHJpbmcgKiwgaW50KTsKK2V4dGVybiBpbnQgdWRmX0NTMHRvVVRGOChzdHJ1Y3QgdXN0ciAqLCBzdHJ1Y3QgdXN0ciAqKTsKKworLyogaWFsbG9jLmMgKi8KK2V4dGVybiB2b2lkIHVkZl9mcmVlX2lub2RlKHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiBzdHJ1Y3QgaW5vZGUgKiB1ZGZfbmV3X2lub2RlIChzdHJ1Y3QgaW5vZGUgKiwgaW50LCBpbnQgKik7CisKKy8qIHRydW5jYXRlLmMgKi8KK2V4dGVybiB2b2lkIHVkZl9kaXNjYXJkX3ByZWFsbG9jKHN0cnVjdCBpbm9kZSAqKTsKK2V4dGVybiB2b2lkIHVkZl90cnVuY2F0ZV9leHRlbnRzKHN0cnVjdCBpbm9kZSAqKTsKKworLyogYmFsbG9jLmMgKi8KK2V4dGVybiB2b2lkIHVkZl9mcmVlX2Jsb2NrcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IGlub2RlICosIGtlcm5lbF9sYl9hZGRyLCB1aW50MzJfdCwgdWludDMyX3QpOworZXh0ZXJuIGludCB1ZGZfcHJlYWxsb2NfYmxvY2tzKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgaW5vZGUgKiwgdWludDE2X3QsIHVpbnQzMl90LCB1aW50MzJfdCk7CitleHRlcm4gaW50IHVkZl9uZXdfYmxvY2soc3RydWN0IHN1cGVyX2Jsb2NrICosIHN0cnVjdCBpbm9kZSAqLCB1aW50MTZfdCwgdWludDMyX3QsIGludCAqKTsKKworLyogZnN5bmMuYyAqLworZXh0ZXJuIGludCB1ZGZfZnN5bmNfZmlsZShzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgZGVudHJ5ICosIGludCk7CisKKy8qIGRpcmVjdG9yeS5jICovCitleHRlcm4gc3RydWN0IGZpbGVJZGVudERlc2MgKiB1ZGZfZmlsZWlkZW50X3JlYWQoc3RydWN0IGlub2RlICosIGxvZmZfdCAqLCBzdHJ1Y3QgdWRmX2ZpbGVpZGVudF9iaCAqLCBzdHJ1Y3QgZmlsZUlkZW50RGVzYyAqLCBrZXJuZWxfbGJfYWRkciAqLCB1aW50MzJfdCAqLCBrZXJuZWxfbGJfYWRkciAqLCB1aW50MzJfdCAqLCB1aW50MzJfdCAqLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKiopOworZXh0ZXJuIHN0cnVjdCBmaWxlSWRlbnREZXNjICogdWRmX2dldF9maWxlaWRlbnQodm9pZCAqIGJ1ZmZlciwgaW50IGJ1ZnNpemUsIGludCAqIG9mZnNldCk7CitleHRlcm4gbG9uZ19hZCAqIHVkZl9nZXRfZmlsZWxvbmdhZCh1aW50OF90ICosIGludCwgaW50ICosIGludCk7CitleHRlcm4gc2hvcnRfYWQgKiB1ZGZfZ2V0X2ZpbGVzaG9ydGFkKHVpbnQ4X3QgKiwgaW50LCBpbnQgKiwgaW50KTsKKworLyogY3JjLmMgKi8KK2V4dGVybiB1aW50MTZfdCB1ZGZfY3JjKHVpbnQ4X3QgKiwgdWludDMyX3QsIHVpbnQxNl90KTsKKworLyogdWRmdGltZS5jICovCitleHRlcm4gdGltZV90ICp1ZGZfc3RhbXBfdG9fdGltZSh0aW1lX3QgKiwgbG9uZyAqLCBrZXJuZWxfdGltZXN0YW1wKTsKK2V4dGVybiBrZXJuZWxfdGltZXN0YW1wICp1ZGZfdGltZV90b19zdGFtcChrZXJuZWxfdGltZXN0YW1wICosIHN0cnVjdCB0aW1lc3BlYyk7CisKKyNlbmRpZiAvKiBfX1VERl9ERUNMX0ggKi8KZGlmZiAtLWdpdCBhL2ZzL3VkZi91ZGZlbmQuaCBiL2ZzL3VkZi91ZGZlbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2QzNzg4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvdWRmL3VkZmVuZC5oCkBAIC0wLDAgKzEsODEgQEAKKyNpZm5kZWYgX19VREZfRU5ESUFOX0gKKyNkZWZpbmUgX19VREZfRU5ESUFOX0gKKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworc3RhdGljIGlubGluZSBrZXJuZWxfbGJfYWRkciBsZWxiX3RvX2NwdShsYl9hZGRyIGluKQoreworCWtlcm5lbF9sYl9hZGRyIG91dDsKKwlvdXQubG9naWNhbEJsb2NrTnVtID0gbGUzMl90b19jcHUoaW4ubG9naWNhbEJsb2NrTnVtKTsKKwlvdXQucGFydGl0aW9uUmVmZXJlbmNlTnVtID0gbGUxNl90b19jcHUoaW4ucGFydGl0aW9uUmVmZXJlbmNlTnVtKTsKKwlyZXR1cm4gb3V0OworfQorCitzdGF0aWMgaW5saW5lIGxiX2FkZHIgY3B1X3RvX2xlbGIoa2VybmVsX2xiX2FkZHIgaW4pCit7CisJbGJfYWRkciBvdXQ7CisJb3V0LmxvZ2ljYWxCbG9ja051bSA9IGNwdV90b19sZTMyKGluLmxvZ2ljYWxCbG9ja051bSk7CisJb3V0LnBhcnRpdGlvblJlZmVyZW5jZU51bSA9IGNwdV90b19sZTE2KGluLnBhcnRpdGlvblJlZmVyZW5jZU51bSk7CisJcmV0dXJuIG91dDsKK30KKworc3RhdGljIGlubGluZSBrZXJuZWxfdGltZXN0YW1wIGxldHNfdG9fY3B1KHRpbWVzdGFtcCBpbikKK3sKKwlrZXJuZWxfdGltZXN0YW1wIG91dDsKKwltZW1jcHkoJm91dCwgJmluLCBzaXplb2YodGltZXN0YW1wKSk7CisJb3V0LnR5cGVBbmRUaW1lem9uZSA9IGxlMTZfdG9fY3B1KGluLnR5cGVBbmRUaW1lem9uZSk7CisJb3V0LnllYXIgPSBsZTE2X3RvX2NwdShpbi55ZWFyKTsKKwlyZXR1cm4gb3V0OworfQorCitzdGF0aWMgaW5saW5lIHNob3J0X2FkIGxlc2FfdG9fY3B1KHNob3J0X2FkIGluKQoreworCXNob3J0X2FkIG91dDsKKwlvdXQuZXh0TGVuZ3RoID0gbGUzMl90b19jcHUoaW4uZXh0TGVuZ3RoKTsKKwlvdXQuZXh0UG9zaXRpb24gPSBsZTMyX3RvX2NwdShpbi5leHRQb3NpdGlvbik7CisJcmV0dXJuIG91dDsKK30KKworc3RhdGljIGlubGluZSBzaG9ydF9hZCBjcHVfdG9fbGVzYShzaG9ydF9hZCBpbikKK3sKKwlzaG9ydF9hZCBvdXQ7CisJb3V0LmV4dExlbmd0aCA9IGNwdV90b19sZTMyKGluLmV4dExlbmd0aCk7CisJb3V0LmV4dFBvc2l0aW9uID0gY3B1X3RvX2xlMzIoaW4uZXh0UG9zaXRpb24pOworCXJldHVybiBvdXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUga2VybmVsX2xvbmdfYWQgbGVsYV90b19jcHUobG9uZ19hZCBpbikKK3sKKwlrZXJuZWxfbG9uZ19hZCBvdXQ7CisJb3V0LmV4dExlbmd0aCA9IGxlMzJfdG9fY3B1KGluLmV4dExlbmd0aCk7CisJb3V0LmV4dExvY2F0aW9uID0gbGVsYl90b19jcHUoaW4uZXh0TG9jYXRpb24pOworCXJldHVybiBvdXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZ19hZCBjcHVfdG9fbGVsYShrZXJuZWxfbG9uZ19hZCBpbikKK3sKKwlsb25nX2FkIG91dDsKKwlvdXQuZXh0TGVuZ3RoID0gY3B1X3RvX2xlMzIoaW4uZXh0TGVuZ3RoKTsKKwlvdXQuZXh0TG9jYXRpb24gPSBjcHVfdG9fbGVsYihpbi5leHRMb2NhdGlvbik7CisJcmV0dXJuIG91dDsKK30KKworc3RhdGljIGlubGluZSBrZXJuZWxfZXh0ZW50X2FkIGxlZWFfdG9fY3B1KGV4dGVudF9hZCBpbikKK3sKKwlrZXJuZWxfZXh0ZW50X2FkIG91dDsKKwlvdXQuZXh0TGVuZ3RoID0gbGUzMl90b19jcHUoaW4uZXh0TGVuZ3RoKTsKKwlvdXQuZXh0TG9jYXRpb24gPSBsZTMyX3RvX2NwdShpbi5leHRMb2NhdGlvbik7CisJcmV0dXJuIG91dDsKK30KKworc3RhdGljIGlubGluZSB0aW1lc3RhbXAgY3B1X3RvX2xldHMoa2VybmVsX3RpbWVzdGFtcCBpbikKK3sKKwl0aW1lc3RhbXAgb3V0OworCW1lbWNweSgmb3V0LCAmaW4sIHNpemVvZih0aW1lc3RhbXApKTsKKwlvdXQudHlwZUFuZFRpbWV6b25lID0gY3B1X3RvX2xlMTYoaW4udHlwZUFuZFRpbWV6b25lKTsKKwlvdXQueWVhciA9IGNwdV90b19sZTE2KGluLnllYXIpOworCXJldHVybiBvdXQ7Cit9CisKKyNlbmRpZiAvKiBfX1VERl9FTkRJQU5fSCAqLwpkaWZmIC0tZ2l0IGEvZnMvdWRmL3VkZnRpbWUuYyBiL2ZzL3VkZi91ZGZ0aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI2MzRiZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3VkZi91ZGZ0aW1lLmMKQEAgLTAsMCArMSwxNzQgQEAKKy8qIENvcHlyaWdodCAoQykgMTk5MywgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorICAgQ29udHJpYnV0ZWQgYnkgUGF1bCBFZ2dlcnQgKGVnZ2VydEB0d2luc3VuLmNvbSkuCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlCisgICBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LAorICAgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKgorICogZGdiIDEwLzAyLzk4OiByaXBwZWQgdGhpcyBmcm9tIGdsaWJjIHNvdXJjZSB0byBoZWxwIGNvbnZlcnQgdGltZXN0YW1wcyB0byB1bml4IHRpbWUgCisgKiAgICAgMTAvMDQvOTg6IGFkZGVkIG5ldyB0YWJsZS1iYXNlZCBsb29rdXAgYWZ0ZXIgc2VlaW5nIGhvdyB1Z2x5IHRoZSBnbnUgY29kZSBpcworICogYmxmIDA5LzI3Lzk5OiByaXBwZWQgb3V0IGFsbCB0aGUgb2xkIGNvZGUgYW5kIGluc2VydGVkIG5ldyB0YWJsZSBmcm9tCisgKgkJCQkJSm9obiBCcm9ja21leWVyICh3aXRob3V0IGxlYXAgc2Vjb25kIGNvcnJlY3Rpb25zKQorICoJCQkJIHJld3JvdGUgdWRmX3N0YW1wX3RvX3RpbWUgYW5kIGZpeGVkIHRpbWV6b25lIGFjY291bnRpbmcgaW4KKwkJCQkJdWRmX3RpbWVfdG9fc3RhbXAuCisgKi8KKworLyoKKyAqIFdlIGRvbid0IHRha2UgaW50byBhY2NvdW50IGxlYXAgc2Vjb25kcy4gVGhpcyBtYXkgYmUgY29ycmVjdCBvciBpbmNvcnJlY3QuCisgKiBGb3IgbW9yZSBOSVNUIGluZm9ybWF0aW9uIChlc3BlY2lhbGx5IGRlYWxpbmcgd2l0aCBsZWFwIHNlY29uZHMpLCBzZWU6CisgKiAgaHR0cDovL3d3dy5ib3VsZGVyLm5pc3QuZ292L3RpbWVmcmVxL3B1YnMvYnVsbGV0aW4vbGVhcHNlY29uZC5odG0KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlICJ1ZGZkZWNsLmgiCisKKyNkZWZpbmUgRVBPQ0hfWUVBUiAxOTcwCisKKyNpZm5kZWYgX19pc2xlYXAKKy8qIE5vbnplcm8gaWYgWUVBUiBpcyBhIGxlYXAgeWVhciAoZXZlcnkgNCB5ZWFycywKKyAgIGV4Y2VwdCBldmVyeSAxMDB0aCBpc24ndCwgYW5kIGV2ZXJ5IDQwMHRoIGlzKS4gICovCisjZGVmaW5lCV9faXNsZWFwKHllYXIpCVwKKyAgKCh5ZWFyKSAlIDQgPT0gMCAmJiAoKHllYXIpICUgMTAwICE9IDAgfHwgKHllYXIpICUgNDAwID09IDApKQorI2VuZGlmCisKKy8qIEhvdyBtYW55IGRheXMgY29tZSBiZWZvcmUgZWFjaCBtb250aCAoMC0xMikuICAqLworY29uc3QgdW5zaWduZWQgc2hvcnQgaW50IF9fbW9uX3lkYXlbMl1bMTNdID0KK3sKKwkvKiBOb3JtYWwgeWVhcnMuICAqLworCXsgMCwgMzEsIDU5LCA5MCwgMTIwLCAxNTEsIDE4MSwgMjEyLCAyNDMsIDI3MywgMzA0LCAzMzQsIDM2NSB9LAorCS8qIExlYXAgeWVhcnMuICAqLworCXsgMCwgMzEsIDYwLCA5MSwgMTIxLCAxNTIsIDE4MiwgMjEzLCAyNDQsIDI3NCwgMzA1LCAzMzUsIDM2NiB9Cit9OworCisjZGVmaW5lIE1BWF9ZRUFSX1NFQ09ORFMJNjkKKyNkZWZpbmUgU1BEIDB4MTUxODAgLyozNjAwKjI0Ki8KKyNkZWZpbmUgU1BZKHksbCxzKSAoU1BEICogKDM2NSp5K2wpK3MpCisKK3N0YXRpYyB0aW1lX3QgeWVhcl9zZWNvbmRzW01BWF9ZRUFSX1NFQ09ORFNdPSB7CisvKjE5NzAqLyBTUFkoIDAsIDAsMCksIFNQWSggMSwgMCwwKSwgU1BZKCAyLCAwLDApLCBTUFkoIDMsIDEsMCksIAorLyoxOTc0Ki8gU1BZKCA0LCAxLDApLCBTUFkoIDUsIDEsMCksIFNQWSggNiwgMSwwKSwgU1BZKCA3LCAyLDApLCAKKy8qMTk3OCovIFNQWSggOCwgMiwwKSwgU1BZKCA5LCAyLDApLCBTUFkoMTAsIDIsMCksIFNQWSgxMSwgMywwKSwgCisvKjE5ODIqLyBTUFkoMTIsIDMsMCksIFNQWSgxMywgMywwKSwgU1BZKDE0LCAzLDApLCBTUFkoMTUsIDQsMCksIAorLyoxOTg2Ki8gU1BZKDE2LCA0LDApLCBTUFkoMTcsIDQsMCksIFNQWSgxOCwgNCwwKSwgU1BZKDE5LCA1LDApLCAKKy8qMTk5MCovIFNQWSgyMCwgNSwwKSwgU1BZKDIxLCA1LDApLCBTUFkoMjIsIDUsMCksIFNQWSgyMywgNiwwKSwgCisvKjE5OTQqLyBTUFkoMjQsIDYsMCksIFNQWSgyNSwgNiwwKSwgU1BZKDI2LCA2LDApLCBTUFkoMjcsIDcsMCksIAorLyoxOTk4Ki8gU1BZKDI4LCA3LDApLCBTUFkoMjksIDcsMCksIFNQWSgzMCwgNywwKSwgU1BZKDMxLCA4LDApLCAKKy8qMjAwMiovIFNQWSgzMiwgOCwwKSwgU1BZKDMzLCA4LDApLCBTUFkoMzQsIDgsMCksIFNQWSgzNSwgOSwwKSwgCisvKjIwMDYqLyBTUFkoMzYsIDksMCksIFNQWSgzNywgOSwwKSwgU1BZKDM4LCA5LDApLCBTUFkoMzksMTAsMCksIAorLyoyMDEwKi8gU1BZKDQwLDEwLDApLCBTUFkoNDEsMTAsMCksIFNQWSg0MiwxMCwwKSwgU1BZKDQzLDExLDApLCAKKy8qMjAxNCovIFNQWSg0NCwxMSwwKSwgU1BZKDQ1LDExLDApLCBTUFkoNDYsMTEsMCksIFNQWSg0NywxMiwwKSwgCisvKjIwMTgqLyBTUFkoNDgsMTIsMCksIFNQWSg0OSwxMiwwKSwgU1BZKDUwLDEyLDApLCBTUFkoNTEsMTMsMCksIAorLyoyMDIyKi8gU1BZKDUyLDEzLDApLCBTUFkoNTMsMTMsMCksIFNQWSg1NCwxMywwKSwgU1BZKDU1LDE0LDApLCAKKy8qMjAyNiovIFNQWSg1NiwxNCwwKSwgU1BZKDU3LDE0LDApLCBTUFkoNTgsMTQsMCksIFNQWSg1OSwxNSwwKSwgCisvKjIwMzAqLyBTUFkoNjAsMTUsMCksIFNQWSg2MSwxNSwwKSwgU1BZKDYyLDE1LDApLCBTUFkoNjMsMTYsMCksIAorLyoyMDM0Ki8gU1BZKDY0LDE2LDApLCBTUFkoNjUsMTYsMCksIFNQWSg2NiwxNiwwKSwgU1BZKDY3LDE3LDApLCAKKy8qMjAzOCovIFNQWSg2OCwxNywwKQorfTsKKworZXh0ZXJuIHN0cnVjdCB0aW1lem9uZSBzeXNfdHo7CisKKyNkZWZpbmUgU0VDU19QRVJfSE9VUgkoNjAgKiA2MCkKKyNkZWZpbmUgU0VDU19QRVJfREFZCShTRUNTX1BFUl9IT1VSICogMjQpCisKK3RpbWVfdCAqCit1ZGZfc3RhbXBfdG9fdGltZSh0aW1lX3QgKmRlc3QsIGxvbmcgKmRlc3RfdXNlYywga2VybmVsX3RpbWVzdGFtcCBzcmMpCit7CisJaW50IHlkYXk7CisJdWludDhfdCB0eXBlID0gc3JjLnR5cGVBbmRUaW1lem9uZSA+PiAxMjsKKwlpbnQxNl90IG9mZnNldDsKKworCWlmICh0eXBlID09IDEpCisJeworCQlvZmZzZXQgPSBzcmMudHlwZUFuZFRpbWV6b25lIDw8IDQ7CisJCS8qIHNpZ24gZXh0ZW50IG9mZnNldCAqLworCQlvZmZzZXQgPSAob2Zmc2V0ID4+IDQpOworCQlpZiAob2Zmc2V0ID09IC0yMDQ3KSAvKiB1bnNwZWNpZmllZCBvZmZzZXQgKi8KKwkJCW9mZnNldCA9IDA7CisJfQorCWVsc2UKKwkJb2Zmc2V0ID0gMDsKKworCWlmICgoc3JjLnllYXIgPCBFUE9DSF9ZRUFSKSB8fAorCQkoc3JjLnllYXIgPiBFUE9DSF9ZRUFSK01BWF9ZRUFSX1NFQ09ORFMpKQorCXsKKwkJKmRlc3QgPSAtMTsKKwkJKmRlc3RfdXNlYyA9IC0xOworCQlyZXR1cm4gTlVMTDsKKwl9CisJKmRlc3QgPSB5ZWFyX3NlY29uZHNbc3JjLnllYXIgLSBFUE9DSF9ZRUFSXTsKKwkqZGVzdCAtPSBvZmZzZXQgKiA2MDsKKworCXlkYXkgPSAoKF9fbW9uX3lkYXlbX19pc2xlYXAgKHNyYy55ZWFyKV0KKwkJW3NyYy5tb250aC0xXSkgKyAoc3JjLmRheS0xKSk7CisJKmRlc3QgKz0gKCAoICh5ZGF5KiAyNCkgKyBzcmMuaG91ciApICogNjAgKyBzcmMubWludXRlICkgKiA2MCArIHNyYy5zZWNvbmQ7CisJKmRlc3RfdXNlYyA9IHNyYy5jZW50aXNlY29uZHMgKiAxMDAwMCArIHNyYy5odW5kcmVkc09mTWljcm9zZWNvbmRzICogMTAwICsgc3JjLm1pY3Jvc2Vjb25kczsKKwlyZXR1cm4gZGVzdDsKK30KKworCitrZXJuZWxfdGltZXN0YW1wICoKK3VkZl90aW1lX3RvX3N0YW1wKGtlcm5lbF90aW1lc3RhbXAgKmRlc3QsIHN0cnVjdCB0aW1lc3BlYyB0cykKK3sKKwlsb25nIGludCBkYXlzLCByZW0sIHk7CisJY29uc3QgdW5zaWduZWQgc2hvcnQgaW50ICppcDsKKwlpbnQxNl90IG9mZnNldDsKKworCW9mZnNldCA9IC1zeXNfdHoudHpfbWludXRlc3dlc3Q7CisKKwlpZiAoIWRlc3QpCisJCXJldHVybiBOVUxMOworCisJZGVzdC0+dHlwZUFuZFRpbWV6b25lID0gMHgxMDAwIHwgKG9mZnNldCAmIDB4MEZGRik7CisKKwl0cy50dl9zZWMgKz0gb2Zmc2V0ICogNjA7CisJZGF5cyA9IHRzLnR2X3NlYyAvIFNFQ1NfUEVSX0RBWTsKKwlyZW0gPSB0cy50dl9zZWMgJSBTRUNTX1BFUl9EQVk7CisJZGVzdC0+aG91ciA9IHJlbSAvIFNFQ1NfUEVSX0hPVVI7CisJcmVtICU9IFNFQ1NfUEVSX0hPVVI7CisJZGVzdC0+bWludXRlID0gcmVtIC8gNjA7CisJZGVzdC0+c2Vjb25kID0gcmVtICUgNjA7CisJeSA9IDE5NzA7CisKKyNkZWZpbmUgRElWKGEsYikgKChhKSAvIChiKSAtICgoYSkgJSAoYikgPCAwKSkKKyNkZWZpbmUgTEVBUFNfVEhSVV9FTkRfT0YoeSkgKERJViAoeSwgNCkgLSBESVYgKHksIDEwMCkgKyBESVYgKHksIDQwMCkpCisKKwl3aGlsZSAoZGF5cyA8IDAgfHwgZGF5cyA+PSAoX19pc2xlYXAoeSkgPyAzNjYgOiAzNjUpKQorCXsKKwkJbG9uZyBpbnQgeWcgPSB5ICsgZGF5cyAvIDM2NSAtIChkYXlzICUgMzY1IDwgMCk7CisKKwkJLyogQWRqdXN0IERBWVMgYW5kIFkgdG8gbWF0Y2ggdGhlIGd1ZXNzZWQgeWVhci4gICovCisJCWRheXMgLT0gKCh5ZyAtIHkpICogMzY1CisJCQkrIExFQVBTX1RIUlVfRU5EX09GICh5ZyAtIDEpCisJCQktIExFQVBTX1RIUlVfRU5EX09GICh5IC0gMSkpOworCQl5ID0geWc7CisJfQorCWRlc3QtPnllYXIgPSB5OworCWlwID0gX19tb25feWRheVtfX2lzbGVhcCh5KV07CisJZm9yICh5ID0gMTE7IGRheXMgPCAobG9uZyBpbnQpIGlwW3ldOyAtLXkpCisJCWNvbnRpbnVlOworCWRheXMgLT0gaXBbeV07CisJZGVzdC0+bW9udGggPSB5ICsgMTsKKwlkZXN0LT5kYXkgPSBkYXlzICsgMTsKKworCWRlc3QtPmNlbnRpc2Vjb25kcyA9IHRzLnR2X25zZWMgLyAxMDAwMDAwMDsKKwlkZXN0LT5odW5kcmVkc09mTWljcm9zZWNvbmRzID0gKHRzLnR2X25zZWMgLyAxMDAwIC0gZGVzdC0+Y2VudGlzZWNvbmRzICogMTAwMDApIC8gMTAwOworCWRlc3QtPm1pY3Jvc2Vjb25kcyA9ICh0cy50dl9uc2VjIC8gMTAwMCAtIGRlc3QtPmNlbnRpc2Vjb25kcyAqIDEwMDAwIC0KKwkJZGVzdC0+aHVuZHJlZHNPZk1pY3Jvc2Vjb25kcyAqIDEwMCk7CisJcmV0dXJuIGRlc3Q7Cit9CisKKy8qIEVPRiAqLwpkaWZmIC0tZ2l0IGEvZnMvdWRmL3VuaWNvZGUuYyBiL2ZzL3VkZi91bmljb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE4MGVmZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3VkZi91bmljb2RlLmMKQEAgLTAsMCArMSw1MTYgQEAKKy8qCisgKiB1bmljb2RlLmMKKyAqCisgKiBQVVJQT1NFCisgKglSb3V0aW5lcyBmb3IgY29udmVydGluZyBiZXR3ZWVuIFVURi04IGFuZCBPU1RBIENvbXByZXNzZWQgVW5pY29kZS4KKyAqICAgICAgQWxzbyBoYW5kbGVzIGZpbGVuYW1lIG1hbmdsaW5nCisgKgorICogREVTQ1JJUFRJT04KKyAqCU9TVEEgQ29tcHJlc3NlZCBVbmljb2RlIGlzIGV4cGxhaW5lZCBpbiB0aGUgT1NUQSBVREYgc3BlY2lmaWNhdGlvbi4KKyAqCQlodHRwOi8vd3d3Lm9zdGEub3JnLworICoJVVRGLTggaXMgZXhwbGFpbmVkIGluIHRoZSBJRVRGIFJGQyBYWFhYLgorICoJCWZ0cDovL2Z0cC5pbnRlcm5pYy5uZXQvcmZjL3JmY3h4eHgudHh0CisgKgorICogQ09OVEFDVFMKKyAqCUUtbWFpbCByZWdhcmRpbmcgYW55IHBvcnRpb24gb2YgdGhlIExpbnV4IFVERiBmaWxlIHN5c3RlbSBzaG91bGQgYmUKKyAqCWRpcmVjdGVkIHRvIHRoZSBkZXZlbG9wbWVudCB0ZWFtJ3MgbWFpbGluZyBsaXN0IChydW4gYnkgbWFqb3Jkb21vKToKKyAqCQlsaW51eF91ZGZAaHBlc2pyby5mYy5ocC5jb20KKyAqCisgKiBDT1BZUklHSFQKKyAqCVRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSAoR1BMKS4gQ29waWVzIG9mIHRoZSBHUEwgY2FuIGJlIG9idGFpbmVkIGZyb206CisgKgkJZnRwOi8vcHJlcC5haS5taXQuZWR1L3B1Yi9nbnUvR1BMCisgKglFYWNoIGNvbnRyaWJ1dGluZyBhdXRob3IgcmV0YWlucyBhbGwgcmlnaHRzIHRvIHRoZWlyIG93biB3b3JrLgorICovCisKKyNpbmNsdWRlICJ1ZGZkZWNsLmgiCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4JLyogZm9yIG1lbXNldCAqLworI2luY2x1ZGUgPGxpbnV4L25scy5oPgorI2luY2x1ZGUgPGxpbnV4L3VkZl9mcy5oPgorCisjaW5jbHVkZSAidWRmX3NiLmgiCisKK3N0YXRpYyBpbnQgdWRmX3RyYW5zbGF0ZV90b19saW51eCh1aW50OF90ICosIHVpbnQ4X3QgKiwgaW50LCB1aW50OF90ICosIGludCk7CisKK3N0YXRpYyBpbnQgdWRmX2NoYXJfdG9fdXN0cihzdHJ1Y3QgdXN0ciAqZGVzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3RybGVuKQoreworCWlmICggKCFkZXN0KSB8fCAoIXNyYykgfHwgKCFzdHJsZW4pIHx8IChzdHJsZW4gPiBVREZfTkFNRV9MRU4tMikgKQorCQlyZXR1cm4gMDsKKwltZW1zZXQoZGVzdCwgMCwgc2l6ZW9mKHN0cnVjdCB1c3RyKSk7CisJbWVtY3B5KGRlc3QtPnVfbmFtZSwgc3JjLCBzdHJsZW4pOworCWRlc3QtPnVfY21wSUQgPSAweDA4OworCWRlc3QtPnVfbGVuID0gc3RybGVuOworCXJldHVybiBzdHJsZW47Cit9CisKKy8qCisgKiB1ZGZfYnVpbGRfdXN0cgorICovCitpbnQgdWRmX2J1aWxkX3VzdHIoc3RydWN0IHVzdHIgKmRlc3QsIGRzdHJpbmcgKnB0ciwgaW50IHNpemUpCit7CisJaW50IHVzZXNpemU7CisKKwlpZiAoICghZGVzdCkgfHwgKCFwdHIpIHx8ICghc2l6ZSkgKQorCQlyZXR1cm4gLTE7CisKKwltZW1zZXQoZGVzdCwgMCwgc2l6ZW9mKHN0cnVjdCB1c3RyKSk7CisJdXNlc2l6ZT0gKHNpemUgPiBVREZfTkFNRV9MRU4pID8gVURGX05BTUVfTEVOIDogc2l6ZTsKKwlkZXN0LT51X2NtcElEPXB0clswXTsKKwlkZXN0LT51X2xlbj1wdHJbc2l6ZS0xXTsKKwltZW1jcHkoZGVzdC0+dV9uYW1lLCBwdHIrMSwgdXNlc2l6ZS0xKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHVkZl9idWlsZF91c3RyX2V4YWN0CisgKi8KK3N0YXRpYyBpbnQgdWRmX2J1aWxkX3VzdHJfZXhhY3Qoc3RydWN0IHVzdHIgKmRlc3QsIGRzdHJpbmcgKnB0ciwgaW50IGV4YWN0c2l6ZSkKK3sKKwlpZiAoICghZGVzdCkgfHwgKCFwdHIpIHx8ICghZXhhY3RzaXplKSApCisJCXJldHVybiAtMTsKKworCW1lbXNldChkZXN0LCAwLCBzaXplb2Yoc3RydWN0IHVzdHIpKTsKKwlkZXN0LT51X2NtcElEPXB0clswXTsKKwlkZXN0LT51X2xlbj1leGFjdHNpemUtMTsKKwltZW1jcHkoZGVzdC0+dV9uYW1lLCBwdHIrMSwgZXhhY3RzaXplLTEpOworCXJldHVybiAwOworfQorCisvKgorICogdWRmX29jdV90b191dGY4CisgKgorICogUFVSUE9TRQorICoJQ29udmVydCBPU1RBIENvbXByZXNzZWQgVW5pY29kZSB0byB0aGUgVVRGLTggZXF1aXZhbGVudC4KKyAqCisgKiBERVNDUklQVElPTgorICoJVGhpcyByb3V0aW5lIGlzIG9ubHkgY2FsbGVkIGJ5IHVkZl9maWxsZGlyKCkuCisgKgorICogUFJFLUNPTkRJVElPTlMKKyAqCXV0ZgkJCVBvaW50ZXIgdG8gVVRGLTggb3V0cHV0IGJ1ZmZlci4KKyAqCW9jdQkJCVBvaW50ZXIgdG8gT1NUQSBDb21wcmVzc2VkIFVuaWNvZGUgaW5wdXQgYnVmZmVyCisgKgkJCQlvZiBzaXplIFVERl9OQU1FX0xFTiBieXRlcy4KKyAqIAkJCQlib3RoIG9mIHR5cGUgInN0cnVjdCB1c3RyICoiCisgKgorICogUE9TVC1DT05ESVRJT05TCisgKgk8cmV0dXJuPgkJWmVybyBvbiBzdWNjZXNzLgorICoKKyAqIEhJU1RPUlkKKyAqCU5vdmVtYmVyIDEyLCAxOTk3IC0gQW5kcmV3IEUuIE1pbGVza2kKKyAqCVdyaXR0ZW4sIHRlc3RlZCwgYW5kIHJlbGVhc2VkLgorICovCitpbnQgdWRmX0NTMHRvVVRGOChzdHJ1Y3QgdXN0ciAqdXRmX28sIHN0cnVjdCB1c3RyICpvY3VfaSkKK3sKKwl1aW50OF90ICpvY3U7CisJdWludDMyX3QgYzsKKwl1aW50OF90IGNtcF9pZCwgb2N1X2xlbjsKKwlpbnQgaTsKKworCW9jdSA9IG9jdV9pLT51X25hbWU7CisKKwlvY3VfbGVuID0gb2N1X2ktPnVfbGVuOworCWNtcF9pZCA9IG9jdV9pLT51X2NtcElEOworCXV0Zl9vLT51X2xlbiA9IDA7CisKKwlpZiAob2N1X2xlbiA9PSAwKQorCXsKKwkJbWVtc2V0KHV0Zl9vLCAwLCBzaXplb2Yoc3RydWN0IHVzdHIpKTsKKwkJdXRmX28tPnVfY21wSUQgPSAwOworCQl1dGZfby0+dV9sZW4gPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKGNtcF9pZCAhPSA4KSAmJiAoY21wX2lkICE9IDE2KSkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAidWRmOiB1bmtub3duIGNvbXByZXNzaW9uIGNvZGUgKCVkKSBzdHJpPSVzXG4iLCBjbXBfaWQsIG9jdV9pLT51X25hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyAoaSA8IG9jdV9sZW4pICYmICh1dGZfby0+dV9sZW4gPD0gKFVERl9OQU1FX0xFTi0zKSkgOykKKwl7CisKKwkJLyogRXhwYW5kIE9TVEEgY29tcHJlc3NlZCBVbmljb2RlIHRvIFVuaWNvZGUgKi8KKwkJYyA9IG9jdVtpKytdOworCQlpZiAoY21wX2lkID09IDE2KQorCQkJYyA9IChjIDw8IDgpIHwgb2N1W2krK107CisKKwkJLyogQ29tcHJlc3MgVW5pY29kZSB0byBVVEYtOCAqLworCQlpZiAoYyA8IDB4ODBVKQorCQkJdXRmX28tPnVfbmFtZVt1dGZfby0+dV9sZW4rK10gPSAodWludDhfdCljOworCQllbHNlIGlmIChjIDwgMHg4MDBVKQorCQl7CisJCQl1dGZfby0+dV9uYW1lW3V0Zl9vLT51X2xlbisrXSA9ICh1aW50OF90KSgweGMwIHwgKGMgPj4gNikpOworCQkJdXRmX28tPnVfbmFtZVt1dGZfby0+dV9sZW4rK10gPSAodWludDhfdCkoMHg4MCB8IChjICYgMHgzZikpOworCQl9CisJCWVsc2UKKwkJeworCQkJdXRmX28tPnVfbmFtZVt1dGZfby0+dV9sZW4rK10gPSAodWludDhfdCkoMHhlMCB8IChjID4+IDEyKSk7CisJCQl1dGZfby0+dV9uYW1lW3V0Zl9vLT51X2xlbisrXSA9ICh1aW50OF90KSgweDgwIHwgKChjID4+IDYpICYgMHgzZikpOworCQkJdXRmX28tPnVfbmFtZVt1dGZfby0+dV9sZW4rK10gPSAodWludDhfdCkoMHg4MCB8IChjICYgMHgzZikpOworCQl9CisJfQorCXV0Zl9vLT51X2NtcElEPTg7CisKKwlyZXR1cm4gdXRmX28tPnVfbGVuOworfQorCisvKgorICoKKyAqIHVkZl91dGY4X3RvX29jdQorICoKKyAqIFBVUlBPU0UKKyAqCUNvbnZlcnQgVVRGLTggdG8gdGhlIE9TVEEgQ29tcHJlc3NlZCBVbmljb2RlIGVxdWl2YWxlbnQuCisgKgorICogREVTQ1JJUFRJT04KKyAqCVRoaXMgcm91dGluZSBpcyBvbmx5IGNhbGxlZCBieSB1ZGZfbG9va3VwKCkuCisgKgorICogUFJFLUNPTkRJVElPTlMKKyAqCW9jdQkJCVBvaW50ZXIgdG8gT1NUQSBDb21wcmVzc2VkIFVuaWNvZGUgb3V0cHV0CisgKgkJCQlidWZmZXIgb2Ygc2l6ZSBVREZfTkFNRV9MRU4gYnl0ZXMuCisgKgl1dGYJCQlQb2ludGVyIHRvIFVURi04IGlucHV0IGJ1ZmZlci4KKyAqCXV0Zl9sZW4JCQlMZW5ndGggb2YgVVRGLTggaW5wdXQgYnVmZmVyIGluIGJ5dGVzLgorICoKKyAqIFBPU1QtQ09ORElUSU9OUworICoJPHJldHVybj4JCVplcm8gb24gc3VjY2Vzcy4KKyAqCisgKiBISVNUT1JZCisgKglOb3ZlbWJlciAxMiwgMTk5NyAtIEFuZHJldyBFLiBNaWxlc2tpCisgKglXcml0dGVuLCB0ZXN0ZWQsIGFuZCByZWxlYXNlZC4KKyAqLworc3RhdGljIGludCB1ZGZfVVRGOHRvQ1MwKGRzdHJpbmcgKm9jdSwgc3RydWN0IHVzdHIgKnV0ZiwgaW50IGxlbmd0aCkKK3sKKwl1bnNpZ25lZCBjLCBpLCBtYXhfdmFsLCB1dGZfY2hhcjsKKwlpbnQgdXRmX2NudCwgdV9sZW47CisKKwltZW1zZXQob2N1LCAwLCBzaXplb2YoZHN0cmluZykgKiBsZW5ndGgpOworCW9jdVswXSA9IDg7CisJbWF4X3ZhbCA9IDB4ZmZVOworCit0cnlfYWdhaW46CisJdV9sZW4gPSAwVTsKKwl1dGZfY2hhciA9IDBVOworCXV0Zl9jbnQgPSAwVTsKKwlmb3IgKGkgPSAwVTsgaSA8IHV0Zi0+dV9sZW47IGkrKykKKwl7CisJCWMgPSAodWludDhfdCl1dGYtPnVfbmFtZVtpXTsKKworCQkvKiBDb21wbGV0ZSBhIG11bHRpLWJ5dGUgVVRGLTggY2hhcmFjdGVyICovCisJCWlmICh1dGZfY250KQorCQl7CisJCQl1dGZfY2hhciA9ICh1dGZfY2hhciA8PCA2KSB8IChjICYgMHgzZlUpOworCQkJaWYgKC0tdXRmX2NudCkKKwkJCQljb250aW51ZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIENoZWNrIGZvciBhIG11bHRpLWJ5dGUgVVRGLTggY2hhcmFjdGVyICovCisJCQlpZiAoYyAmIDB4ODBVKQorCQkJeworCQkJCS8qIFN0YXJ0IGEgbXVsdGktYnl0ZSBVVEYtOCBjaGFyYWN0ZXIgKi8KKwkJCQlpZiAoKGMgJiAweGUwVSkgPT0gMHhjMFUpCisJCQkJeworCQkJCQl1dGZfY2hhciA9IGMgJiAweDFmVTsKKwkJCQkJdXRmX2NudCA9IDE7CisJCQkJfQorCQkJCWVsc2UgaWYgKChjICYgMHhmMFUpID09IDB4ZTBVKQorCQkJCXsKKwkJCQkJdXRmX2NoYXIgPSBjICYgMHgwZlU7CisJCQkJCXV0Zl9jbnQgPSAyOworCQkJCX0KKwkJCQllbHNlIGlmICgoYyAmIDB4ZjhVKSA9PSAweGYwVSkKKwkJCQl7CisJCQkJCXV0Zl9jaGFyID0gYyAmIDB4MDdVOworCQkJCQl1dGZfY250ID0gMzsKKwkJCQl9CisJCQkJZWxzZSBpZiAoKGMgJiAweGZjVSkgPT0gMHhmOFUpCisJCQkJeworCQkJCQl1dGZfY2hhciA9IGMgJiAweDAzVTsKKwkJCQkJdXRmX2NudCA9IDQ7CisJCQkJfQorCQkJCWVsc2UgaWYgKChjICYgMHhmZVUpID09IDB4ZmNVKQorCQkJCXsKKwkJCQkJdXRmX2NoYXIgPSBjICYgMHgwMVU7CisJCQkJCXV0Zl9jbnQgPSA1OworCQkJCX0KKwkJCQllbHNlCisJCQkJCWdvdG8gZXJyb3Jfb3V0OworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlCisJCQkJLyogU2luZ2xlIGJ5dGUgVVRGLTggY2hhcmFjdGVyIChtb3N0IGNvbW1vbikgKi8KKwkJCQl1dGZfY2hhciA9IGM7CisJCX0KKworCQkvKiBDaG9vc2Ugbm8gY29tcHJlc3Npb24gaWYgbmVjZXNzYXJ5ICovCisJCWlmICh1dGZfY2hhciA+IG1heF92YWwpCisJCXsKKwkJCWlmICggMHhmZlUgPT0gbWF4X3ZhbCApCisJCQl7CisJCQkJbWF4X3ZhbCA9IDB4ZmZmZlU7CisJCQkJb2N1WzBdID0gKHVpbnQ4X3QpMHgxMFU7CisJCQkJZ290byB0cnlfYWdhaW47CisJCQl9CisJCQlnb3RvIGVycm9yX291dDsKKwkJfQorCisJCWlmIChtYXhfdmFsID09IDB4ZmZmZlUpCisJCXsKKwkJCW9jdVsrK3VfbGVuXSA9ICh1aW50OF90KSh1dGZfY2hhciA+PiA4KTsKKwkJfQorCQlvY3VbKyt1X2xlbl0gPSAodWludDhfdCkodXRmX2NoYXIgJiAweGZmVSk7CisJfQorCisKKwlpZiAodXRmX2NudCkKKwl7CitlcnJvcl9vdXQ6CisJCW9jdVsrK3VfbGVuXSA9ICc/JzsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInVkZjogYmFkIFVURi04IGNoYXJhY3RlclxuIik7CisJfQorCisJb2N1W2xlbmd0aCAtIDFdID0gKHVpbnQ4X3QpdV9sZW4gKyAxOworCXJldHVybiB1X2xlbiArIDE7Cit9CisKK3N0YXRpYyBpbnQgdWRmX0NTMHRvTkxTKHN0cnVjdCBubHNfdGFibGUgKm5scywgc3RydWN0IHVzdHIgKnV0Zl9vLCBzdHJ1Y3QgdXN0ciAqb2N1X2kpCit7CisJdWludDhfdCAqb2N1OworCXVpbnQzMl90IGM7CisJdWludDhfdCBjbXBfaWQsIG9jdV9sZW47CisJaW50IGk7CisKKwlvY3UgPSBvY3VfaS0+dV9uYW1lOworCisJb2N1X2xlbiA9IG9jdV9pLT51X2xlbjsKKwljbXBfaWQgPSBvY3VfaS0+dV9jbXBJRDsKKwl1dGZfby0+dV9sZW4gPSAwOworCisJaWYgKG9jdV9sZW4gPT0gMCkKKwl7CisJCW1lbXNldCh1dGZfbywgMCwgc2l6ZW9mKHN0cnVjdCB1c3RyKSk7CisJCXV0Zl9vLT51X2NtcElEID0gMDsKKwkJdXRmX28tPnVfbGVuID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKChjbXBfaWQgIT0gOCkgJiYgKGNtcF9pZCAhPSAxNikpCisJeworCQlwcmludGsoS0VSTl9FUlIgInVkZjogdW5rbm93biBjb21wcmVzc2lvbiBjb2RlICglZCkgc3RyaT0lc1xuIiwgY21wX2lkLCBvY3VfaS0+dV9uYW1lKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gMDsgKGkgPCBvY3VfbGVuKSAmJiAodXRmX28tPnVfbGVuIDw9IChVREZfTkFNRV9MRU4tMykpIDspCisJeworCQkvKiBFeHBhbmQgT1NUQSBjb21wcmVzc2VkIFVuaWNvZGUgdG8gVW5pY29kZSAqLworCQljID0gb2N1W2krK107CisJCWlmIChjbXBfaWQgPT0gMTYpCisJCQljID0gKGMgPDwgOCkgfCBvY3VbaSsrXTsKKworCQl1dGZfby0+dV9sZW4gKz0gbmxzLT51bmkyY2hhcihjLCAmdXRmX28tPnVfbmFtZVt1dGZfby0+dV9sZW5dLCAKKwkJCVVERl9OQU1FX0xFTiAtIHV0Zl9vLT51X2xlbik7CisJfQorCXV0Zl9vLT51X2NtcElEPTg7CisKKwlyZXR1cm4gdXRmX28tPnVfbGVuOworfQorCitzdGF0aWMgaW50IHVkZl9OTFN0b0NTMChzdHJ1Y3QgbmxzX3RhYmxlICpubHMsIGRzdHJpbmcgKm9jdSwgc3RydWN0IHVzdHIgKnVuaSwgaW50IGxlbmd0aCkKK3sKKwl1bnNpZ25lZCBsZW4sIGksIG1heF92YWw7CisJdWludDE2X3QgdW5pX2NoYXI7CisJaW50IHVfbGVuOworCisJbWVtc2V0KG9jdSwgMCwgc2l6ZW9mKGRzdHJpbmcpICogbGVuZ3RoKTsKKwlvY3VbMF0gPSA4OworCW1heF92YWwgPSAweGZmVTsKKwordHJ5X2FnYWluOgorCXVfbGVuID0gMFU7CisJZm9yIChpID0gMFU7IGkgPCB1bmktPnVfbGVuOyBpKyspCisJeworCQlsZW4gPSBubHMtPmNoYXIydW5pKCZ1bmktPnVfbmFtZVtpXSwgdW5pLT51X2xlbi1pLCAmdW5pX2NoYXIpOworCQlpZiAobGVuIDw9IDApCisJCQljb250aW51ZTsKKworCQlpZiAodW5pX2NoYXIgPiBtYXhfdmFsKQorCQl7CisJCQltYXhfdmFsID0gMHhmZmZmVTsKKwkJCW9jdVswXSA9ICh1aW50OF90KTB4MTBVOworCQkJZ290byB0cnlfYWdhaW47CisJCX0KKwkJCisJCWlmIChtYXhfdmFsID09IDB4ZmZmZlUpCisJCQlvY3VbKyt1X2xlbl0gPSAodWludDhfdCkodW5pX2NoYXIgPj4gOCk7CisJCW9jdVsrK3VfbGVuXSA9ICh1aW50OF90KSh1bmlfY2hhciAmIDB4ZmZVKTsKKwkJaSArPSBsZW4gLSAxOworCX0KKworCW9jdVtsZW5ndGggLSAxXSA9ICh1aW50OF90KXVfbGVuICsgMTsKKwlyZXR1cm4gdV9sZW4gKyAxOworfQorCitpbnQgdWRmX2dldF9maWxlbmFtZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB1aW50OF90ICpzbmFtZSwgdWludDhfdCAqZG5hbWUsIGludCBmbGVuKQoreworCXN0cnVjdCB1c3RyIGZpbGVuYW1lLCB1bmlmaWxlbmFtZTsKKwlpbnQgbGVuOworCisJaWYgKHVkZl9idWlsZF91c3RyX2V4YWN0KCZ1bmlmaWxlbmFtZSwgc25hbWUsIGZsZW4pKQorCXsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKFVERl9RVUVSWV9GTEFHKHNiLCBVREZfRkxBR19VVEY4KSkKKwl7CisJCWlmICghdWRmX0NTMHRvVVRGOCgmZmlsZW5hbWUsICZ1bmlmaWxlbmFtZSkgKQorCQl7CisJCQl1ZGZfZGVidWcoIkZhaWxlZCBpbiB1ZGZfZ2V0X2ZpbGVuYW1lOiBzbmFtZSA9ICVzXG4iLCBzbmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwllbHNlIGlmIChVREZfUVVFUllfRkxBRyhzYiwgVURGX0ZMQUdfTkxTX01BUCkpCisJeworCQlpZiAoIXVkZl9DUzB0b05MUyhVREZfU0Ioc2IpLT5zX25sc19tYXAsICZmaWxlbmFtZSwgJnVuaWZpbGVuYW1lKSApCisJCXsKKwkJCXVkZl9kZWJ1ZygiRmFpbGVkIGluIHVkZl9nZXRfZmlsZW5hbWU6IHNuYW1lID0gJXNcbiIsIHNuYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWVsc2UKKwkJcmV0dXJuIDA7CisKKwlpZiAoKGxlbiA9IHVkZl90cmFuc2xhdGVfdG9fbGludXgoZG5hbWUsIGZpbGVuYW1lLnVfbmFtZSwgZmlsZW5hbWUudV9sZW4sCisJCXVuaWZpbGVuYW1lLnVfbmFtZSwgdW5pZmlsZW5hbWUudV9sZW4pKSkKKwl7CisJCXJldHVybiBsZW47CisJfQorCXJldHVybiAwOworfQorCitpbnQgdWRmX3B1dF9maWxlbmFtZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCB1aW50OF90ICpzbmFtZSwgdWludDhfdCAqZG5hbWUsIGludCBmbGVuKQoreworCXN0cnVjdCB1c3RyIHVuaWZpbGVuYW1lOworCWludCBuYW1lbGVuOworCisJaWYgKCAhKHVkZl9jaGFyX3RvX3VzdHIoJnVuaWZpbGVuYW1lLCBzbmFtZSwgZmxlbikpICkKKwl7CisJCXJldHVybiAwOworCX0KKworCWlmIChVREZfUVVFUllfRkxBRyhzYiwgVURGX0ZMQUdfVVRGOCkpCisJeworCQlpZiAoICEobmFtZWxlbiA9IHVkZl9VVEY4dG9DUzAoZG5hbWUsICZ1bmlmaWxlbmFtZSwgVURGX05BTUVfTEVOKSkgKQorCQl7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwllbHNlIGlmIChVREZfUVVFUllfRkxBRyhzYiwgVURGX0ZMQUdfTkxTX01BUCkpCisJeworCQlpZiAoICEobmFtZWxlbiA9IHVkZl9OTFN0b0NTMChVREZfU0Ioc2IpLT5zX25sc19tYXAsIGRuYW1lLCAmdW5pZmlsZW5hbWUsIFVERl9OQU1FX0xFTikpICkKKwkJeworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJZWxzZQorCQlyZXR1cm4gMDsKKworCXJldHVybiBuYW1lbGVuOworfQorCisjZGVmaW5lIElMTEVHQUxfQ0hBUl9NQVJLCSdfJworI2RlZmluZSBFWFRfTUFSSwkJCScuJworI2RlZmluZSBDUkNfTUFSSwkJCScjJworI2RlZmluZSBFWFRfU0laRQkJCTUKKworc3RhdGljIGludCB1ZGZfdHJhbnNsYXRlX3RvX2xpbnV4KHVpbnQ4X3QgKm5ld05hbWUsIHVpbnQ4X3QgKnVkZk5hbWUsIGludCB1ZGZMZW4sIHVpbnQ4X3QgKmZpZE5hbWUsIGludCBmaWROYW1lTGVuKQoreworCWludCBpbmRleCwgbmV3SW5kZXggPSAwLCBuZWVkc0NSQyA9IDA7CQorCWludCBleHRJbmRleCA9IDAsIG5ld0V4dEluZGV4ID0gMCwgaGFzRXh0ID0gMDsKKwl1bnNpZ25lZCBzaG9ydCB2YWx1ZUNSQzsKKwl1aW50OF90IGN1cnI7CisJY29uc3QgdWludDhfdCBoZXhDaGFyW10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7CisKKwlpZiAodWRmTmFtZVswXSA9PSAnLicgJiYgKHVkZkxlbiA9PSAxIHx8CisJCSh1ZGZMZW4gPT0gMiAmJiB1ZGZOYW1lWzFdID09ICcuJykpKQorCXsKKwkJbmVlZHNDUkMgPSAxOworCQluZXdJbmRleCA9IHVkZkxlbjsKKwkJbWVtY3B5KG5ld05hbWUsIHVkZk5hbWUsIHVkZkxlbik7CisJfQorCWVsc2UKKwl7CQorCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB1ZGZMZW47IGluZGV4KyspCisJCXsKKwkJCWN1cnIgPSB1ZGZOYW1lW2luZGV4XTsKKwkJCWlmIChjdXJyID09ICcvJyB8fCBjdXJyID09IDApCisJCQl7CisJCQkJbmVlZHNDUkMgPSAxOworCQkJCWN1cnIgPSBJTExFR0FMX0NIQVJfTUFSSzsKKwkJCQl3aGlsZSAoaW5kZXgrMSA8IHVkZkxlbiAmJiAodWRmTmFtZVtpbmRleCsxXSA9PSAnLycgfHwKKwkJCQkJdWRmTmFtZVtpbmRleCsxXSA9PSAwKSkKKwkJCQkJaW5kZXgrKzsKKwkJCX0KKwkJCWlmIChjdXJyID09IEVYVF9NQVJLICYmICh1ZGZMZW4gLSBpbmRleCAtIDEpIDw9IEVYVF9TSVpFKQorCQkJeworCQkJCWlmICh1ZGZMZW4gPT0gaW5kZXggKyAxKQorCQkJCQloYXNFeHQgPSAwOworCQkJCWVsc2UKKwkJCQl7CisJCQkJCWhhc0V4dCA9IDE7CisJCQkJCWV4dEluZGV4ID0gaW5kZXg7CisJCQkJCW5ld0V4dEluZGV4ID0gbmV3SW5kZXg7CisJCQkJfQorCQkJfQorCQkJaWYgKG5ld0luZGV4IDwgMjU2KQorCQkJCW5ld05hbWVbbmV3SW5kZXgrK10gPSBjdXJyOworCQkJZWxzZQorCQkJCW5lZWRzQ1JDID0gMTsKKwkJfQorCX0KKwlpZiAobmVlZHNDUkMpCisJeworCQl1aW50OF90IGV4dFtFWFRfU0laRV07CisJCWludCBsb2NhbEV4dEluZGV4ID0gMDsKKworCQlpZiAoaGFzRXh0KQorCQl7CisJCQlpbnQgbWF4RmlsZW5hbWVMZW47CisJCQlmb3IoaW5kZXggPSAwOyBpbmRleDxFWFRfU0laRSAmJiBleHRJbmRleCArIGluZGV4ICsxIDwgdWRmTGVuOworCQkJCWluZGV4KysgKQorCQkJeworCQkJCWN1cnIgPSB1ZGZOYW1lW2V4dEluZGV4ICsgaW5kZXggKyAxXTsKKworCQkJCWlmIChjdXJyID09ICcvJyB8fCBjdXJyID09IDApCisJCQkJeworCQkJCQluZWVkc0NSQyA9IDE7CisJCQkJCWN1cnIgPSBJTExFR0FMX0NIQVJfTUFSSzsKKwkJCQkJd2hpbGUoZXh0SW5kZXggKyBpbmRleCArIDIgPCB1ZGZMZW4gJiYgKGluZGV4ICsgMSA8IEVYVF9TSVpFCisJCQkJCQkmJiAodWRmTmFtZVtleHRJbmRleCArIGluZGV4ICsgMl0gPT0gJy8nIHx8CisJCQkJCQkJdWRmTmFtZVtleHRJbmRleCArIGluZGV4ICsgMl0gPT0gMCkpKQorCQkJCQkJaW5kZXgrKzsKKwkJCQl9CisJCQkJZXh0W2xvY2FsRXh0SW5kZXgrK10gPSBjdXJyOworCQkJfQorCQkJbWF4RmlsZW5hbWVMZW4gPSAyNTAgLSBsb2NhbEV4dEluZGV4OworCQkJaWYgKG5ld0luZGV4ID4gbWF4RmlsZW5hbWVMZW4pCisJCQkJbmV3SW5kZXggPSBtYXhGaWxlbmFtZUxlbjsKKwkJCWVsc2UKKwkJCQluZXdJbmRleCA9IG5ld0V4dEluZGV4OworCQl9CisJCWVsc2UgaWYgKG5ld0luZGV4ID4gMjUwKQorCQkJbmV3SW5kZXggPSAyNTA7CisJCW5ld05hbWVbbmV3SW5kZXgrK10gPSBDUkNfTUFSSzsKKwkJdmFsdWVDUkMgPSB1ZGZfY3JjKGZpZE5hbWUsIGZpZE5hbWVMZW4sIDApOworCQluZXdOYW1lW25ld0luZGV4KytdID0gaGV4Q2hhclsodmFsdWVDUkMgJiAweGYwMDApID4+IDEyXTsKKwkJbmV3TmFtZVtuZXdJbmRleCsrXSA9IGhleENoYXJbKHZhbHVlQ1JDICYgMHgwZjAwKSA+PiA4XTsKKwkJbmV3TmFtZVtuZXdJbmRleCsrXSA9IGhleENoYXJbKHZhbHVlQ1JDICYgMHgwMGYwKSA+PiA0XTsKKwkJbmV3TmFtZVtuZXdJbmRleCsrXSA9IGhleENoYXJbKHZhbHVlQ1JDICYgMHgwMDBmKV07CisKKwkJaWYgKGhhc0V4dCkKKwkJeworCQkJbmV3TmFtZVtuZXdJbmRleCsrXSA9IEVYVF9NQVJLOworCQkJZm9yIChpbmRleCA9IDA7aW5kZXggPCBsb2NhbEV4dEluZGV4IDtpbmRleCsrICkKKwkJCQluZXdOYW1lW25ld0luZGV4KytdID0gZXh0W2luZGV4XTsKKwkJfQorCX0KKwlyZXR1cm4gbmV3SW5kZXg7Cit9CmRpZmYgLS1naXQgYS9mcy91ZnMvTWFrZWZpbGUgYi9mcy91ZnMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQzOTk4MAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3Vmcy9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCB1ZnMgZmlsZXN5c3RlbSByb3V0aW5lcy4KKyMKKworb2JqLSQoQ09ORklHX1VGU19GUykgKz0gdWZzLm8KKwordWZzLW9ianMgOj0gYmFsbG9jLm8gY3lsaW5kZXIubyBkaXIubyBmaWxlLm8gaWFsbG9jLm8gaW5vZGUubyBcCisJICAgIG5hbWVpLm8gc3VwZXIubyBzeW1saW5rLm8gdHJ1bmNhdGUubyB1dGlsLm8KZGlmZiAtLWdpdCBhL2ZzL3Vmcy9iYWxsb2MuYyBiL2ZzL3Vmcy9iYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTc2NDBjCi0tLSAvZGV2L251bGwKKysrIGIvZnMvdWZzL2JhbGxvYy5jCkBAIC0wLDAgKzEsODE4IEBACisvKgorICogIGxpbnV4L2ZzL3Vmcy9iYWxsb2MuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5OAorICogRGFuaWVsIFBpcmtsIDxkYW5pZWwucGlya2xAZW1haWwuY3o+CisgKiBDaGFybGVzIFVuaXZlcnNpdHksIEZhY3VsdHkgb2YgTWF0aGVtYXRpY3MgYW5kIFBoeXNpY3MKKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC91ZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKworI2luY2x1ZGUgInN3YWIuaCIKKyNpbmNsdWRlICJ1dGlsLmgiCisKKyN1bmRlZiBVRlNfQkFMTE9DX0RFQlVHCisKKyNpZmRlZiBVRlNfQkFMTE9DX0RFQlVHCisjZGVmaW5lIFVGU0QoeCkgcHJpbnRrKCIoJXMsICVkKSwgJXM6IiwgX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pOyBwcmludGsgeDsKKyNlbHNlCisjZGVmaW5lIFVGU0QoeCkKKyNlbmRpZgorCitzdGF0aWMgdW5zaWduZWQgdWZzX2FkZF9mcmFnbWVudHMgKHN0cnVjdCBpbm9kZSAqLCB1bnNpZ25lZCwgdW5zaWduZWQsIHVuc2lnbmVkLCBpbnQgKik7CitzdGF0aWMgdW5zaWduZWQgdWZzX2FsbG9jX2ZyYWdtZW50cyAoc3RydWN0IGlub2RlICosIHVuc2lnbmVkLCB1bnNpZ25lZCwgdW5zaWduZWQsIGludCAqKTsKK3N0YXRpYyB1bnNpZ25lZCB1ZnNfYWxsb2NjZ19ibG9jayAoc3RydWN0IGlub2RlICosIHN0cnVjdCB1ZnNfY2dfcHJpdmF0ZV9pbmZvICosIHVuc2lnbmVkLCBpbnQgKik7CitzdGF0aWMgdW5zaWduZWQgdWZzX2JpdG1hcF9zZWFyY2ggKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgdWZzX2NnX3ByaXZhdGVfaW5mbyAqLCB1bnNpZ25lZCwgdW5zaWduZWQpOworc3RhdGljIHVuc2lnbmVkIGNoYXIgdWZzX2ZyYWd0YWJsZV84ZnBiW10sIHVmc19mcmFndGFibGVfb3RoZXJbXTsKK3N0YXRpYyB2b2lkIHVmc19jbHVzdGVyYWNjdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IHVmc19jZ19wcml2YXRlX2luZm8gKiwgdW5zaWduZWQsIGludCk7CisKKy8qCisgKiBGcmVlICdjb3VudCcgZnJhZ21lbnRzIGZyb20gZnJhZ21lbnQgbnVtYmVyICdmcmFnbWVudCcKKyAqLwordm9pZCB1ZnNfZnJlZV9mcmFnbWVudHMgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCB1bnNpZ25lZCBmcmFnbWVudCwgdW5zaWduZWQgY291bnQpIHsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKKwlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGk7CisJc3RydWN0IHVmc19zdXBlcl9ibG9ja19maXJzdCAqIHVzYjE7CisJc3RydWN0IHVmc19jZ19wcml2YXRlX2luZm8gKiB1Y3BpOworCXN0cnVjdCB1ZnNfY3lsaW5kZXJfZ3JvdXAgKiB1Y2c7CisJdW5zaWduZWQgY2dubywgYml0LCBlbmRfYml0LCBiYmFzZSwgYmxrbWFwLCBpLCBibGtubywgY3lsbm87CisJCisJc2IgPSBpbm9kZS0+aV9zYjsKKwl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOworCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdChVU1BJX1VCSCk7CisJCisJVUZTRCgoIkVOVEVSLCBmcmFnbWVudCAldSwgY291bnQgJXVcbiIsIGZyYWdtZW50LCBjb3VudCkpCisJCisJaWYgKHVmc19mcmFnbnVtKGZyYWdtZW50KSArIGNvdW50ID4gdXNwaS0+c19mcGcpCisJCXVmc19lcnJvciAoc2IsICJ1ZnNfZnJlZV9mcmFnbWVudHMiLCAiaW50ZXJuYWwgZXJyb3IiKTsKKwkKKwlsb2NrX3N1cGVyKHNiKTsKKwkKKwljZ25vID0gdWZzX2R0b2coZnJhZ21lbnQpOworCWJpdCA9IHVmc19kdG9nZChmcmFnbWVudCk7CisJaWYgKGNnbm8gPj0gdXNwaS0+c19uY2cpIHsKKwkJdWZzX3BhbmljIChzYiwgInVmc19mcmVlX2ZyYWdtZW50cyIsICJmcmVlaW5nIGJsb2NrcyBhcmUgb3V0c2lkZSBkZXZpY2UiKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCQkKKwl1Y3BpID0gdWZzX2xvYWRfY3lsaW5kZXIgKHNiLCBjZ25vKTsKKwlpZiAoIXVjcGkpIAorCQlnb3RvIGZhaWxlZDsKKwl1Y2cgPSB1YmhfZ2V0X3VjZyAoVUNQSV9VQkgpOworCWlmICghdWZzX2NnX2Noa21hZ2ljKHNiLCB1Y2cpKSB7CisJCXVmc19wYW5pYyAoc2IsICJ1ZnNfZnJlZV9mcmFnbWVudHMiLCAiaW50ZXJuYWwgZXJyb3IsIGJhZCBtYWdpYyBudW1iZXIgb24gY2cgJXUiLCBjZ25vKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJZW5kX2JpdCA9IGJpdCArIGNvdW50OworCWJiYXNlID0gdWZzX2Jsa251bSAoYml0KTsKKwlibGttYXAgPSB1YmhfYmxrbWFwIChVQ1BJX1VCSCwgdWNwaS0+Y19mcmVlb2ZmLCBiYmFzZSk7CisJdWZzX2ZyYWdhY2N0IChzYiwgYmxrbWFwLCB1Y2ctPmNnX2Zyc3VtLCAtMSk7CisJZm9yIChpID0gYml0OyBpIDwgZW5kX2JpdDsgaSsrKSB7CisJCWlmICh1YmhfaXNjbHIgKFVDUElfVUJILCB1Y3BpLT5jX2ZyZWVvZmYsIGkpKQorCQkJdWJoX3NldGJpdCAoVUNQSV9VQkgsIHVjcGktPmNfZnJlZW9mZiwgaSk7CisJCWVsc2UgdWZzX2Vycm9yIChzYiwgInVmc19mcmVlX2ZyYWdtZW50cyIsCisJCQkiYml0IGFscmVhZHkgY2xlYXJlZCBmb3IgZnJhZ21lbnQgJXUiLCBpKTsKKwl9CisJCisJRFFVT1RfRlJFRV9CTE9DSyAoaW5vZGUsIGNvdW50KTsKKworCQorCWZzMzJfYWRkKHNiLCAmdWNnLT5jZ19jcy5jc19uZmZyZWUsIGNvdW50KTsKKwlmczMyX2FkZChzYiwgJnVzYjEtPmZzX2NzdG90YWwuY3NfbmZmcmVlLCBjb3VudCk7CisJZnMzMl9hZGQoc2IsICZVRlNfU0Ioc2IpLT5mc19jcyhjZ25vKS5jc19uZmZyZWUsIGNvdW50KTsKKwlibGttYXAgPSB1YmhfYmxrbWFwIChVQ1BJX1VCSCwgdWNwaS0+Y19mcmVlb2ZmLCBiYmFzZSk7CisJdWZzX2ZyYWdhY2N0KHNiLCBibGttYXAsIHVjZy0+Y2dfZnJzdW0sIDEpOworCisJLyoKKwkgKiBUcnlpbmcgdG8gcmVhc3NlbWJsZSBmcmVlIGZyYWdtZW50cyBpbnRvIGJsb2NrCisJICovCisJYmxrbm8gPSB1ZnNfZnJhZ3N0b2Jsa3MgKGJiYXNlKTsKKwlpZiAodWJoX2lzYmxvY2tzZXQoVUNQSV9VQkgsIHVjcGktPmNfZnJlZW9mZiwgYmxrbm8pKSB7CisJCWZzMzJfc3ViKHNiLCAmdWNnLT5jZ19jcy5jc19uZmZyZWUsIHVzcGktPnNfZnBiKTsKKwkJZnMzMl9zdWIoc2IsICZ1c2IxLT5mc19jc3RvdGFsLmNzX25mZnJlZSwgdXNwaS0+c19mcGIpOworCQlmczMyX3N1YihzYiwgJlVGU19TQihzYiktPmZzX2NzKGNnbm8pLmNzX25mZnJlZSwgdXNwaS0+c19mcGIpOworCQlpZiAoKFVGU19TQihzYiktPnNfZmxhZ3MgJiBVRlNfQ0dfTUFTSykgPT0gVUZTX0NHXzQ0QlNEKQorCQkJdWZzX2NsdXN0ZXJhY2N0IChzYiwgdWNwaSwgYmxrbm8sIDEpOworCQlmczMyX2FkZChzYiwgJnVjZy0+Y2dfY3MuY3NfbmJmcmVlLCAxKTsKKwkJZnMzMl9hZGQoc2IsICZ1c2IxLT5mc19jc3RvdGFsLmNzX25iZnJlZSwgMSk7CisJCWZzMzJfYWRkKHNiLCAmVUZTX1NCKHNiKS0+ZnNfY3MoY2dubykuY3NfbmJmcmVlLCAxKTsKKwkJY3lsbm8gPSB1ZnNfY2J0b2N5bG5vIChiYmFzZSk7CisJCWZzMTZfYWRkKHNiLCAmdWJoX2NnX2Jsa3ModWNwaSwgY3lsbm8sIHVmc19jYnRvcnBvcyhiYmFzZSkpLCAxKTsKKwkJZnMzMl9hZGQoc2IsICZ1YmhfY2dfYmxrdG90KHVjcGksIGN5bG5vKSwgMSk7CisJfQorCQorCXViaF9tYXJrX2J1ZmZlcl9kaXJ0eSAoVVNQSV9VQkgpOworCXViaF9tYXJrX2J1ZmZlcl9kaXJ0eSAoVUNQSV9VQkgpOworCWlmIChzYi0+c19mbGFncyAmIE1TX1NZTkNIUk9OT1VTKSB7CisJCXViaF93YWl0X29uX2J1ZmZlciAoVUNQSV9VQkgpOworCQl1YmhfbGxfcndfYmxvY2sgKFdSSVRFLCAxLCAoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqKikmdWNwaSk7CisJCXViaF93YWl0X29uX2J1ZmZlciAoVUNQSV9VQkgpOworCX0KKwlzYi0+c19kaXJ0ID0gMTsKKwkKKwl1bmxvY2tfc3VwZXIgKHNiKTsKKwlVRlNEKCgiRVhJVFxuIikpCisJcmV0dXJuOworCitmYWlsZWQ6CisJdW5sb2NrX3N1cGVyIChzYik7CisJVUZTRCgoIkVYSVQgKEZBSUxFRClcbiIpKQorCXJldHVybjsKK30KKworLyoKKyAqIEZyZWUgJ2NvdW50JyBmcmFnbWVudHMgZnJvbSBmcmFnbWVudCBudW1iZXIgJ2ZyYWdtZW50JyAoZnJlZSB3aG9sZSBibG9ja3MpCisgKi8KK3ZvaWQgdWZzX2ZyZWVfYmxvY2tzIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgdW5zaWduZWQgZnJhZ21lbnQsIHVuc2lnbmVkIGNvdW50KSB7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpOworCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfZmlyc3QgKiB1c2IxOworCXN0cnVjdCB1ZnNfY2dfcHJpdmF0ZV9pbmZvICogdWNwaTsKKwlzdHJ1Y3QgdWZzX2N5bGluZGVyX2dyb3VwICogdWNnOworCXVuc2lnbmVkIG92ZXJmbG93LCBjZ25vLCBiaXQsIGVuZF9iaXQsIGJsa25vLCBpLCBjeWxubzsKKwkKKwlzYiA9IGlub2RlLT5pX3NiOworCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CisJdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KFVTUElfVUJIKTsKKworCVVGU0QoKCJFTlRFUiwgZnJhZ21lbnQgJXUsIGNvdW50ICV1XG4iLCBmcmFnbWVudCwgY291bnQpKQorCQorCWlmICgoZnJhZ21lbnQgJiB1c3BpLT5zX2ZwYm1hc2spIHx8IChjb3VudCAmIHVzcGktPnNfZnBibWFzaykpIHsKKwkJdWZzX2Vycm9yIChzYiwgInVmc19mcmVlX2Jsb2NrcyIsICJpbnRlcm5hbCBlcnJvciwgIgorCQkJImZyYWdtZW50ICV1LCBjb3VudCAldVxuIiwgZnJhZ21lbnQsIGNvdW50KTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJbG9ja19zdXBlcihzYik7CisJCitkb19tb3JlOgorCW92ZXJmbG93ID0gMDsKKwljZ25vID0gdWZzX2R0b2cgKGZyYWdtZW50KTsKKwliaXQgPSB1ZnNfZHRvZ2QgKGZyYWdtZW50KTsKKwlpZiAoY2dubyA+PSB1c3BpLT5zX25jZykgeworCQl1ZnNfcGFuaWMgKHNiLCAidWZzX2ZyZWVfYmxvY2tzIiwgImZyZWVpbmcgYmxvY2tzIGFyZSBvdXRzaWRlIGRldmljZSIpOworCQlnb3RvIGZhaWxlZDsKKwl9CisJZW5kX2JpdCA9IGJpdCArIGNvdW50OworCWlmIChlbmRfYml0ID4gdXNwaS0+c19mcGcpIHsKKwkJb3ZlcmZsb3cgPSBiaXQgKyBjb3VudCAtIHVzcGktPnNfZnBnOworCQljb3VudCAtPSBvdmVyZmxvdzsKKwkJZW5kX2JpdCAtPSBvdmVyZmxvdzsKKwl9CisKKwl1Y3BpID0gdWZzX2xvYWRfY3lsaW5kZXIgKHNiLCBjZ25vKTsKKwlpZiAoIXVjcGkpIAorCQlnb3RvIGZhaWxlZDsKKwl1Y2cgPSB1YmhfZ2V0X3VjZyAoVUNQSV9VQkgpOworCWlmICghdWZzX2NnX2Noa21hZ2ljKHNiLCB1Y2cpKSB7CisJCXVmc19wYW5pYyAoc2IsICJ1ZnNfZnJlZV9ibG9ja3MiLCAiaW50ZXJuYWwgZXJyb3IsIGJhZCBtYWdpYyBudW1iZXIgb24gY2cgJXUiLCBjZ25vKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJZm9yIChpID0gYml0OyBpIDwgZW5kX2JpdDsgaSArPSB1c3BpLT5zX2ZwYikgeworCQlibGtubyA9IHVmc19mcmFnc3RvYmxrcyhpKTsKKwkJaWYgKHViaF9pc2Jsb2Nrc2V0KFVDUElfVUJILCB1Y3BpLT5jX2ZyZWVvZmYsIGJsa25vKSkgeworCQkJdWZzX2Vycm9yKHNiLCAidWZzX2ZyZWVfYmxvY2tzIiwgImZyZWVpbmcgZnJlZSBmcmFnbWVudCIpOworCQl9CisJCXViaF9zZXRibG9jayhVQ1BJX1VCSCwgdWNwaS0+Y19mcmVlb2ZmLCBibGtubyk7CisJCWlmICgoVUZTX1NCKHNiKS0+c19mbGFncyAmIFVGU19DR19NQVNLKSA9PSBVRlNfQ0dfNDRCU0QpCisJCQl1ZnNfY2x1c3RlcmFjY3QgKHNiLCB1Y3BpLCBibGtubywgMSk7CisJCURRVU9UX0ZSRUVfQkxPQ0soaW5vZGUsIHVzcGktPnNfZnBiKTsKKworCQlmczMyX2FkZChzYiwgJnVjZy0+Y2dfY3MuY3NfbmJmcmVlLCAxKTsKKwkJZnMzMl9hZGQoc2IsICZ1c2IxLT5mc19jc3RvdGFsLmNzX25iZnJlZSwgMSk7CisJCWZzMzJfYWRkKHNiLCAmVUZTX1NCKHNiKS0+ZnNfY3MoY2dubykuY3NfbmJmcmVlLCAxKTsKKwkJY3lsbm8gPSB1ZnNfY2J0b2N5bG5vKGkpOworCQlmczE2X2FkZChzYiwgJnViaF9jZ19ibGtzKHVjcGksIGN5bG5vLCB1ZnNfY2J0b3Jwb3MoaSkpLCAxKTsKKwkJZnMzMl9hZGQoc2IsICZ1YmhfY2dfYmxrdG90KHVjcGksIGN5bG5vKSwgMSk7CisJfQorCisJdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVU1BJX1VCSCk7CisJdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVQ1BJX1VCSCk7CisJaWYgKHNiLT5zX2ZsYWdzICYgTVNfU1lOQ0hST05PVVMpIHsKKwkJdWJoX3dhaXRfb25fYnVmZmVyIChVQ1BJX1VCSCk7CisJCXViaF9sbF9yd19ibG9jayAoV1JJVEUsIDEsIChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICoqKSZ1Y3BpKTsKKwkJdWJoX3dhaXRfb25fYnVmZmVyIChVQ1BJX1VCSCk7CisJfQorCisJaWYgKG92ZXJmbG93KSB7CisJCWZyYWdtZW50ICs9IGNvdW50OworCQljb3VudCA9IG92ZXJmbG93OworCQlnb3RvIGRvX21vcmU7CisJfQorCisJc2ItPnNfZGlydCA9IDE7CisJdW5sb2NrX3N1cGVyIChzYik7CisJVUZTRCgoIkVYSVRcbiIpKQorCXJldHVybjsKKworZmFpbGVkOgorCXVubG9ja19zdXBlciAoc2IpOworCVVGU0QoKCJFWElUIChGQUlMRUQpXG4iKSkKKwlyZXR1cm47Cit9CisKKworCisjZGVmaW5lIE5VTExJRllfRlJBR01FTlRTIFwKKwlmb3IgKGkgPSBvbGRjb3VudDsgaSA8IG5ld2NvdW50OyBpKyspIHsgXAorCQliaCA9IHNiX2dldGJsayhzYiwgcmVzdWx0ICsgaSk7IFwKKwkJbWVtc2V0IChiaC0+Yl9kYXRhLCAwLCBzYi0+c19ibG9ja3NpemUpOyBcCisJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOyBcCisJCW1hcmtfYnVmZmVyX2RpcnR5IChiaCk7IFwKKwkJaWYgKElTX1NZTkMoaW5vZGUpKSBcCisJCQlzeW5jX2RpcnR5X2J1ZmZlcihiaCk7IFwKKwkJYnJlbHNlIChiaCk7IFwKKwl9CisKK3Vuc2lnbmVkIHVmc19uZXdfZnJhZ21lbnRzIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgX19mczMyICogcCwgdW5zaWduZWQgZnJhZ21lbnQsCisJdW5zaWduZWQgZ29hbCwgdW5zaWduZWQgY291bnQsIGludCAqIGVyciApCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpOworCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfZmlyc3QgKiB1c2IxOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXVuc2lnbmVkIGNnbm8sIG9sZGNvdW50LCBuZXdjb3VudCwgdG1wLCByZXF1ZXN0LCBpLCByZXN1bHQ7CisJCisJVUZTRCgoIkVOVEVSLCBpbm8gJWx1LCBmcmFnbWVudCAldSwgZ29hbCAldSwgY291bnQgJXVcbiIsIGlub2RlLT5pX2lubywgZnJhZ21lbnQsIGdvYWwsIGNvdW50KSkKKwkKKwlzYiA9IGlub2RlLT5pX3NiOworCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CisJdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KFVTUElfVUJIKTsKKwkqZXJyID0gLUVOT1NQQzsKKworCWxvY2tfc3VwZXIgKHNiKTsKKwkKKwl0bXAgPSBmczMyX3RvX2NwdShzYiwgKnApOworCWlmIChjb3VudCArIHVmc19mcmFnbnVtKGZyYWdtZW50KSA+IHVzcGktPnNfZnBiKSB7CisJCXVmc193YXJuaW5nIChzYiwgInVmc19uZXdfZnJhZ21lbnRzIiwgImludGVybmFsIHdhcm5pbmciCisJCQkiIGZyYWdtZW50ICV1LCBjb3VudCAldSIsIGZyYWdtZW50LCBjb3VudCk7CisJCWNvdW50ID0gdXNwaS0+c19mcGIgLSB1ZnNfZnJhZ251bShmcmFnbWVudCk7IAorCX0KKwlvbGRjb3VudCA9IHVmc19mcmFnbnVtIChmcmFnbWVudCk7CisJbmV3Y291bnQgPSBvbGRjb3VudCArIGNvdW50OworCisJLyoKKwkgKiBTb21lYm9keSBlbHNlIGhhcyBqdXN0IGFsbG9jYXRlZCBvdXIgZnJhZ21lbnRzCisJICovCisJaWYgKG9sZGNvdW50KSB7CisJCWlmICghdG1wKSB7CisJCQl1ZnNfZXJyb3IgKHNiLCAidWZzX25ld19mcmFnbWVudHMiLCAiaW50ZXJuYWwgZXJyb3IsICIKKwkJCQkiZnJhZ21lbnQgJXUsIHRtcCAldVxuIiwgZnJhZ21lbnQsIHRtcCk7CisJCQl1bmxvY2tfc3VwZXIgKHNiKTsKKwkJCXJldHVybiAodW5zaWduZWQpLTE7CisJCX0KKwkJaWYgKGZyYWdtZW50IDwgVUZTX0koaW5vZGUpLT5pX2xhc3RmcmFnKSB7CisJCQlVRlNEKCgiRVhJVCAoQUxSRUFEWSBBTExPQ0FURUQpXG4iKSkKKwkJCXVubG9ja19zdXBlciAoc2IpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJZWxzZSB7CisJCWlmICh0bXApIHsKKwkJCVVGU0QoKCJFWElUIChBTFJFQURZIEFMTE9DQVRFRClcbiIpKQorCQkJdW5sb2NrX3N1cGVyKHNiKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyoKKwkgKiBUaGVyZSBpcyBub3QgZW5vdWdoIHNwYWNlIGZvciB1c2VyIG9uIHRoZSBkZXZpY2UKKwkgKi8KKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19SRVNPVVJDRSkgJiYgdWZzX2ZyZWVzcGFjZSh1c2IxLCBVRlNfTUlORlJFRSkgPD0gMCkgeworCQl1bmxvY2tfc3VwZXIgKHNiKTsKKwkJVUZTRCgoIkVYSVQgKEZBSUxFRClcbiIpKQorCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZ29hbCA+PSB1c3BpLT5zX3NpemUpIAorCQlnb2FsID0gMDsKKwlpZiAoZ29hbCA9PSAwKSAKKwkJY2dubyA9IHVmc19pbm90b2NnIChpbm9kZS0+aV9pbm8pOworCWVsc2UKKwkJY2dubyA9IHVmc19kdG9nIChnb2FsKTsKKwkgCisJLyoKKwkgKiBhbGxvY2F0ZSBuZXcgZnJhZ21lbnQKKwkgKi8KKwlpZiAob2xkY291bnQgPT0gMCkgeworCQlyZXN1bHQgPSB1ZnNfYWxsb2NfZnJhZ21lbnRzIChpbm9kZSwgY2dubywgZ29hbCwgY291bnQsIGVycik7CisJCWlmIChyZXN1bHQpIHsKKwkJCSpwID0gY3B1X3RvX2ZzMzIoc2IsIHJlc3VsdCk7CisJCQkqZXJyID0gMDsKKwkJCWlub2RlLT5pX2Jsb2NrcyArPSBjb3VudCA8PCB1c3BpLT5zX25zcGZzaGlmdDsKKwkJCVVGU19JKGlub2RlKS0+aV9sYXN0ZnJhZyA9IG1heF90KHUzMiwgVUZTX0koaW5vZGUpLT5pX2xhc3RmcmFnLCBmcmFnbWVudCArIGNvdW50KTsKKwkJCU5VTExJRllfRlJBR01FTlRTCisJCX0KKwkJdW5sb2NrX3N1cGVyKHNiKTsKKwkJVUZTRCgoIkVYSVQsIHJlc3VsdCAldVxuIiwgcmVzdWx0KSkKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKgorCSAqIHJlc2l6ZSBibG9jaworCSAqLworCXJlc3VsdCA9IHVmc19hZGRfZnJhZ21lbnRzIChpbm9kZSwgdG1wLCBvbGRjb3VudCwgbmV3Y291bnQsIGVycik7CisJaWYgKHJlc3VsdCkgeworCQkqZXJyID0gMDsKKwkJaW5vZGUtPmlfYmxvY2tzICs9IGNvdW50IDw8IHVzcGktPnNfbnNwZnNoaWZ0OworCQlVRlNfSShpbm9kZSktPmlfbGFzdGZyYWcgPSBtYXhfdCh1MzIsIFVGU19JKGlub2RlKS0+aV9sYXN0ZnJhZywgZnJhZ21lbnQgKyBjb3VudCk7CisJCU5VTExJRllfRlJBR01FTlRTCisJCXVubG9ja19zdXBlcihzYik7CisJCVVGU0QoKCJFWElULCByZXN1bHQgJXVcbiIsIHJlc3VsdCkpCisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoKKwkgKiBhbGxvY2F0ZSBuZXcgYmxvY2sgYW5kIG1vdmUgZGF0YQorCSAqLworCXN3aXRjaCAoZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX29wdGltKSkgeworCSAgICBjYXNlIFVGU19PUFRTUEFDRToKKwkJcmVxdWVzdCA9IG5ld2NvdW50OworCQlpZiAodXNwaS0+c19taW5mcmVlIDwgNSB8fCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY3N0b3RhbC5jc19uZmZyZWUpIAorCQkgICAgPiB1c3BpLT5zX2RzaXplICogdXNwaS0+c19taW5mcmVlIC8gKDIgKiAxMDApICkKKwkJCWJyZWFrOworCQl1c2IxLT5mc19vcHRpbSA9IGNwdV90b19mczMyKHNiLCBVRlNfT1BUVElNRSk7CisJCWJyZWFrOworCSAgICBkZWZhdWx0OgorCQl1c2IxLT5mc19vcHRpbSA9IGNwdV90b19mczMyKHNiLCBVRlNfT1BUVElNRSk7CisJCisJICAgIGNhc2UgVUZTX09QVFRJTUU6CisJCXJlcXVlc3QgPSB1c3BpLT5zX2ZwYjsKKwkJaWYgKGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jc3RvdGFsLmNzX25mZnJlZSkgPCB1c3BpLT5zX2RzaXplICoKKwkJICAgICh1c3BpLT5zX21pbmZyZWUgLSAyKSAvIDEwMCkKKwkJCWJyZWFrOworCQl1c2IxLT5mc19vcHRpbSA9IGNwdV90b19mczMyKHNiLCBVRlNfT1BUVElNRSk7CisJCWJyZWFrOworCX0KKwlyZXN1bHQgPSB1ZnNfYWxsb2NfZnJhZ21lbnRzIChpbm9kZSwgY2dubywgZ29hbCwgcmVxdWVzdCwgZXJyKTsKKwlpZiAocmVzdWx0KSB7CisJCWZvciAoaSA9IDA7IGkgPCBvbGRjb3VudDsgaSsrKSB7CisJCQliaCA9IHNiX2JyZWFkKHNiLCB0bXAgKyBpKTsKKwkJCWlmKGJoKQorCQkJeworCQkJCWNsZWFyX2J1ZmZlcl9kaXJ0eShiaCk7CisJCQkJYmgtPmJfYmxvY2tuciA9IHJlc3VsdCArIGk7CisJCQkJbWFya19idWZmZXJfZGlydHkgKGJoKTsKKwkJCQlpZiAoSVNfU1lOQyhpbm9kZSkpCisJCQkJCXN5bmNfZGlydHlfYnVmZmVyKGJoKTsKKwkJCQlicmVsc2UgKGJoKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlwcmludGsoS0VSTl9FUlIgInVmc19uZXdfZnJhZ21lbnRzOiBicmVhZCBmYWlsXG4iKTsKKwkJCQl1bmxvY2tfc3VwZXIoc2IpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJCSpwID0gY3B1X3RvX2ZzMzIoc2IsIHJlc3VsdCk7CisJCSplcnIgPSAwOworCQlpbm9kZS0+aV9ibG9ja3MgKz0gY291bnQgPDwgdXNwaS0+c19uc3Bmc2hpZnQ7CisJCVVGU19JKGlub2RlKS0+aV9sYXN0ZnJhZyA9IG1heF90KHUzMiwgVUZTX0koaW5vZGUpLT5pX2xhc3RmcmFnLCBmcmFnbWVudCArIGNvdW50KTsKKwkJTlVMTElGWV9GUkFHTUVOVFMKKwkJdW5sb2NrX3N1cGVyKHNiKTsKKwkJaWYgKG5ld2NvdW50IDwgcmVxdWVzdCkKKwkJCXVmc19mcmVlX2ZyYWdtZW50cyAoaW5vZGUsIHJlc3VsdCArIG5ld2NvdW50LCByZXF1ZXN0IC0gbmV3Y291bnQpOworCQl1ZnNfZnJlZV9mcmFnbWVudHMgKGlub2RlLCB0bXAsIG9sZGNvdW50KTsKKwkJVUZTRCgoIkVYSVQsIHJlc3VsdCAldVxuIiwgcmVzdWx0KSkKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwl1bmxvY2tfc3VwZXIoc2IpOworCVVGU0QoKCJFWElUIChGQUlMRUQpXG4iKSkKKwlyZXR1cm4gMDsKK30JCQorCitzdGF0aWMgdW5zaWduZWQKK3Vmc19hZGRfZnJhZ21lbnRzIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgdW5zaWduZWQgZnJhZ21lbnQsCisJCSAgIHVuc2lnbmVkIG9sZGNvdW50LCB1bnNpZ25lZCBuZXdjb3VudCwgaW50ICogZXJyKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiOworCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaTsKKwlzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX2ZpcnN0ICogdXNiMTsKKwlzdHJ1Y3QgdWZzX2NnX3ByaXZhdGVfaW5mbyAqIHVjcGk7CisJc3RydWN0IHVmc19jeWxpbmRlcl9ncm91cCAqIHVjZzsKKwl1bnNpZ25lZCBjZ25vLCBmcmFnbm8sIGZyYWdvZmYsIGNvdW50LCBmcmFnc2l6ZSwgaTsKKwkKKwlVRlNEKCgiRU5URVIsIGZyYWdtZW50ICV1LCBvbGRjb3VudCAldSwgbmV3Y291bnQgJXVcbiIsIGZyYWdtZW50LCBvbGRjb3VudCwgbmV3Y291bnQpKQorCQorCXNiID0gaW5vZGUtPmlfc2I7CisJdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKKwl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QgKFVTUElfVUJIKTsKKwljb3VudCA9IG5ld2NvdW50IC0gb2xkY291bnQ7CisJCisJY2dubyA9IHVmc19kdG9nKGZyYWdtZW50KTsKKwlpZiAoZnMzMl90b19jcHUoc2IsIFVGU19TQihzYiktPmZzX2NzKGNnbm8pLmNzX25mZnJlZSkgPCBjb3VudCkKKwkJcmV0dXJuIDA7CisJaWYgKCh1ZnNfZnJhZ251bSAoZnJhZ21lbnQpICsgbmV3Y291bnQpID4gdXNwaS0+c19mcGIpCisJCXJldHVybiAwOworCXVjcGkgPSB1ZnNfbG9hZF9jeWxpbmRlciAoc2IsIGNnbm8pOworCWlmICghdWNwaSkKKwkJcmV0dXJuIDA7CisJdWNnID0gdWJoX2dldF91Y2cgKFVDUElfVUJIKTsKKwlpZiAoIXVmc19jZ19jaGttYWdpYyhzYiwgdWNnKSkgeworCQl1ZnNfcGFuaWMgKHNiLCAidWZzX2FkZF9mcmFnbWVudHMiLAorCQkJImludGVybmFsIGVycm9yLCBiYWQgbWFnaWMgbnVtYmVyIG9uIGNnICV1IiwgY2dubyk7CisJCXJldHVybiAwOworCX0KKworCWZyYWdubyA9IHVmc19kdG9nZCAoZnJhZ21lbnQpOworCWZyYWdvZmYgPSB1ZnNfZnJhZ251bSAoZnJhZ25vKTsKKwlmb3IgKGkgPSBvbGRjb3VudDsgaSA8IG5ld2NvdW50OyBpKyspCisJCWlmICh1YmhfaXNjbHIgKFVDUElfVUJILCB1Y3BpLT5jX2ZyZWVvZmYsIGZyYWdubyArIGkpKQorCQkJcmV0dXJuIDA7CisJLyoKKwkgKiBCbG9jayBjYW4gYmUgZXh0ZW5kZWQKKwkgKi8KKwl1Y2ctPmNnX3RpbWUgPSBjcHVfdG9fZnMzMihzYiwgZ2V0X3NlY29uZHMoKSk7CisJZm9yIChpID0gbmV3Y291bnQ7IGkgPCAodXNwaS0+c19mcGIgLSBmcmFnb2ZmKTsgaSsrKQorCQlpZiAodWJoX2lzY2xyIChVQ1BJX1VCSCwgdWNwaS0+Y19mcmVlb2ZmLCBmcmFnbm8gKyBpKSkKKwkJCWJyZWFrOworCWZyYWdzaXplID0gaSAtIG9sZGNvdW50OworCWlmICghZnMzMl90b19jcHUoc2IsIHVjZy0+Y2dfZnJzdW1bZnJhZ3NpemVdKSkKKwkJdWZzX3BhbmljIChzYiwgInVmc19hZGRfZnJhZ21lbnRzIiwKKwkJCSJpbnRlcm5hbCBlcnJvciBvciBjb3JydXB0ZWQgYml0bWFwIG9uIGNnICV1IiwgY2dubyk7CisJZnMzMl9zdWIoc2IsICZ1Y2ctPmNnX2Zyc3VtW2ZyYWdzaXplXSwgMSk7CisJaWYgKGZyYWdzaXplICE9IGNvdW50KQorCQlmczMyX2FkZChzYiwgJnVjZy0+Y2dfZnJzdW1bZnJhZ3NpemUgLSBjb3VudF0sIDEpOworCWZvciAoaSA9IG9sZGNvdW50OyBpIDwgbmV3Y291bnQ7IGkrKykKKwkJdWJoX2NscmJpdCAoVUNQSV9VQkgsIHVjcGktPmNfZnJlZW9mZiwgZnJhZ25vICsgaSk7CisJaWYoRFFVT1RfQUxMT0NfQkxPQ0soaW5vZGUsIGNvdW50KSkgeworCQkqZXJyID0gLUVEUVVPVDsKKwkJcmV0dXJuIDA7CisJfQorCisJZnMzMl9zdWIoc2IsICZ1Y2ctPmNnX2NzLmNzX25mZnJlZSwgY291bnQpOworCWZzMzJfc3ViKHNiLCAmVUZTX1NCKHNiKS0+ZnNfY3MoY2dubykuY3NfbmZmcmVlLCBjb3VudCk7CisJZnMzMl9zdWIoc2IsICZ1c2IxLT5mc19jc3RvdGFsLmNzX25mZnJlZSwgY291bnQpOworCQorCXViaF9tYXJrX2J1ZmZlcl9kaXJ0eSAoVVNQSV9VQkgpOworCXViaF9tYXJrX2J1ZmZlcl9kaXJ0eSAoVUNQSV9VQkgpOworCWlmIChzYi0+c19mbGFncyAmIE1TX1NZTkNIUk9OT1VTKSB7CisJCXViaF93YWl0X29uX2J1ZmZlciAoVUNQSV9VQkgpOworCQl1YmhfbGxfcndfYmxvY2sgKFdSSVRFLCAxLCAoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqKikmdWNwaSk7CisJCXViaF93YWl0X29uX2J1ZmZlciAoVUNQSV9VQkgpOworCX0KKwlzYi0+c19kaXJ0ID0gMTsKKworCVVGU0QoKCJFWElULCBmcmFnbWVudCAldVxuIiwgZnJhZ21lbnQpKQorCQorCXJldHVybiBmcmFnbWVudDsKK30KKworI2RlZmluZSBVRlNfVEVTVF9GUkVFX1NQQUNFX0NHIFwKKwl1Y2cgPSAoc3RydWN0IHVmc19jeWxpbmRlcl9ncm91cCAqKSBVRlNfU0Ioc2IpLT5zX3VjZ1tjZ25vXS0+Yl9kYXRhOyBcCisJaWYgKGZzMzJfdG9fY3B1KHNiLCB1Y2ctPmNnX2NzLmNzX25iZnJlZSkpIFwKKwkJZ290byBjZ19mb3VuZDsgXAorCWZvciAoayA9IGNvdW50OyBrIDwgdXNwaS0+c19mcGI7IGsrKykgXAorCQlpZiAoZnMzMl90b19jcHUoc2IsIHVjZy0+Y2dfZnJzdW1ba10pKSBcCisJCQlnb3RvIGNnX2ZvdW5kOyAKKworc3RhdGljIHVuc2lnbmVkIHVmc19hbGxvY19mcmFnbWVudHMgKHN0cnVjdCBpbm9kZSAqIGlub2RlLCB1bnNpZ25lZCBjZ25vLAorCXVuc2lnbmVkIGdvYWwsIHVuc2lnbmVkIGNvdW50LCBpbnQgKiBlcnIpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpOworCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfZmlyc3QgKiB1c2IxOworCXN0cnVjdCB1ZnNfY2dfcHJpdmF0ZV9pbmZvICogdWNwaTsKKwlzdHJ1Y3QgdWZzX2N5bGluZGVyX2dyb3VwICogdWNnOworCXVuc2lnbmVkIG9sZGNnLCBpLCBqLCBrLCByZXN1bHQsIGFsbG9jc2l6ZTsKKwkKKwlVRlNEKCgiRU5URVIsIGlubyAlbHUsIGNnbm8gJXUsIGdvYWwgJXUsIGNvdW50ICV1XG4iLCBpbm9kZS0+aV9pbm8sIGNnbm8sIGdvYWwsIGNvdW50KSkKKworCXNiID0gaW5vZGUtPmlfc2I7CisJdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKKwl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QoVVNQSV9VQkgpOworCW9sZGNnID0gY2dubzsKKwkKKwkvKgorCSAqIDEuIHNlYXJjaGluZyBvbiBwcmVmZXJyZWQgY3lsaW5kZXIgZ3JvdXAKKwkgKi8KKwlVRlNfVEVTVF9GUkVFX1NQQUNFX0NHCisKKwkvKgorCSAqIDIuIHF1YWRyYXRpYyByZWhhc2gKKwkgKi8KKwlmb3IgKGogPSAxOyBqIDwgdXNwaS0+c19uY2c7IGogKj0gMikgeworCQljZ25vICs9IGo7CisJCWlmIChjZ25vID49IHVzcGktPnNfbmNnKSAKKwkJCWNnbm8gLT0gdXNwaS0+c19uY2c7CisJCVVGU19URVNUX0ZSRUVfU1BBQ0VfQ0cKKwl9CisKKwkvKgorCSAqIDMuIGJydXRlIGZvcmNlIHNlYXJjaAorCSAqIFdlIHN0YXJ0IGF0IGkgPSAyICggMCBpcyBjaGVja2VkIGF0IDEuc3RlcCwgMSBhdCAyLnN0ZXAgKQorCSAqLworCWNnbm8gPSAob2xkY2cgKyAxKSAlIHVzcGktPnNfbmNnOworCWZvciAoaiA9IDI7IGogPCB1c3BpLT5zX25jZzsgaisrKSB7CisJCWNnbm8rKzsKKwkJaWYgKGNnbm8gPj0gdXNwaS0+c19uY2cpCisJCQljZ25vID0gMDsKKwkJVUZTX1RFU1RfRlJFRV9TUEFDRV9DRworCX0KKwkKKwlVRlNEKCgiRVhJVCAoRkFJTEVEKVxuIikpCisJcmV0dXJuIDA7CisKK2NnX2ZvdW5kOgorCXVjcGkgPSB1ZnNfbG9hZF9jeWxpbmRlciAoc2IsIGNnbm8pOworCWlmICghdWNwaSkKKwkJcmV0dXJuIDA7CisJdWNnID0gdWJoX2dldF91Y2cgKFVDUElfVUJIKTsKKwlpZiAoIXVmc19jZ19jaGttYWdpYyhzYiwgdWNnKSkgCisJCXVmc19wYW5pYyAoc2IsICJ1ZnNfYWxsb2NfZnJhZ21lbnRzIiwKKwkJCSJpbnRlcm5hbCBlcnJvciwgYmFkIG1hZ2ljIG51bWJlciBvbiBjZyAldSIsIGNnbm8pOworCXVjZy0+Y2dfdGltZSA9IGNwdV90b19mczMyKHNiLCBnZXRfc2Vjb25kcygpKTsKKworCWlmIChjb3VudCA9PSB1c3BpLT5zX2ZwYikgeworCQlyZXN1bHQgPSB1ZnNfYWxsb2NjZ19ibG9jayAoaW5vZGUsIHVjcGksIGdvYWwsIGVycik7CisJCWlmIChyZXN1bHQgPT0gKHVuc2lnbmVkKS0xKQorCQkJcmV0dXJuIDA7CisJCWdvdG8gc3VjY2VkOworCX0KKworCWZvciAoYWxsb2NzaXplID0gY291bnQ7IGFsbG9jc2l6ZSA8IHVzcGktPnNfZnBiOyBhbGxvY3NpemUrKykKKwkJaWYgKGZzMzJfdG9fY3B1KHNiLCB1Y2ctPmNnX2Zyc3VtW2FsbG9jc2l6ZV0pICE9IDApCisJCQlicmVhazsKKwkKKwlpZiAoYWxsb2NzaXplID09IHVzcGktPnNfZnBiKSB7CisJCXJlc3VsdCA9IHVmc19hbGxvY2NnX2Jsb2NrIChpbm9kZSwgdWNwaSwgZ29hbCwgZXJyKTsKKwkJaWYgKHJlc3VsdCA9PSAodW5zaWduZWQpLTEpCisJCQlyZXR1cm4gMDsKKwkJZ29hbCA9IHVmc19kdG9nZCAocmVzdWx0KTsKKwkJZm9yIChpID0gY291bnQ7IGkgPCB1c3BpLT5zX2ZwYjsgaSsrKQorCQkJdWJoX3NldGJpdCAoVUNQSV9VQkgsIHVjcGktPmNfZnJlZW9mZiwgZ29hbCArIGkpOworCQlpID0gdXNwaS0+c19mcGIgLSBjb3VudDsKKwkJRFFVT1RfRlJFRV9CTE9DSyhpbm9kZSwgaSk7CisKKwkJZnMzMl9hZGQoc2IsICZ1Y2ctPmNnX2NzLmNzX25mZnJlZSwgaSk7CisJCWZzMzJfYWRkKHNiLCAmdXNiMS0+ZnNfY3N0b3RhbC5jc19uZmZyZWUsIGkpOworCQlmczMyX2FkZChzYiwgJlVGU19TQihzYiktPmZzX2NzKGNnbm8pLmNzX25mZnJlZSwgaSk7CisJCWZzMzJfYWRkKHNiLCAmdWNnLT5jZ19mcnN1bVtpXSwgMSk7CisJCWdvdG8gc3VjY2VkOworCX0KKworCXJlc3VsdCA9IHVmc19iaXRtYXBfc2VhcmNoIChzYiwgdWNwaSwgZ29hbCwgYWxsb2NzaXplKTsKKwlpZiAocmVzdWx0ID09ICh1bnNpZ25lZCktMSkKKwkJcmV0dXJuIDA7CisJaWYoRFFVT1RfQUxMT0NfQkxPQ0soaW5vZGUsIGNvdW50KSkgeworCQkqZXJyID0gLUVEUVVPVDsKKwkJcmV0dXJuIDA7CisJfQorCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQl1YmhfY2xyYml0IChVQ1BJX1VCSCwgdWNwaS0+Y19mcmVlb2ZmLCByZXN1bHQgKyBpKTsKKwkKKwlmczMyX3N1YihzYiwgJnVjZy0+Y2dfY3MuY3NfbmZmcmVlLCBjb3VudCk7CisJZnMzMl9zdWIoc2IsICZ1c2IxLT5mc19jc3RvdGFsLmNzX25mZnJlZSwgY291bnQpOworCWZzMzJfc3ViKHNiLCAmVUZTX1NCKHNiKS0+ZnNfY3MoY2dubykuY3NfbmZmcmVlLCBjb3VudCk7CisJZnMzMl9zdWIoc2IsICZ1Y2ctPmNnX2Zyc3VtW2FsbG9jc2l6ZV0sIDEpOworCisJaWYgKGNvdW50ICE9IGFsbG9jc2l6ZSkKKwkJZnMzMl9hZGQoc2IsICZ1Y2ctPmNnX2Zyc3VtW2FsbG9jc2l6ZSAtIGNvdW50XSwgMSk7CisKK3N1Y2NlZDoKKwl1YmhfbWFya19idWZmZXJfZGlydHkgKFVTUElfVUJIKTsKKwl1YmhfbWFya19idWZmZXJfZGlydHkgKFVDUElfVUJIKTsKKwlpZiAoc2ItPnNfZmxhZ3MgJiBNU19TWU5DSFJPTk9VUykgeworCQl1Ymhfd2FpdF9vbl9idWZmZXIgKFVDUElfVUJIKTsKKwkJdWJoX2xsX3J3X2Jsb2NrIChXUklURSwgMSwgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiopJnVjcGkpOworCQl1Ymhfd2FpdF9vbl9idWZmZXIgKFVDUElfVUJIKTsKKwl9CisJc2ItPnNfZGlydCA9IDE7CisKKwlyZXN1bHQgKz0gY2dubyAqIHVzcGktPnNfZnBnOworCVVGU0QoKCJFWElUMywgcmVzdWx0ICV1XG4iLCByZXN1bHQpKQorCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCB1ZnNfYWxsb2NjZ19ibG9jayAoc3RydWN0IGlub2RlICogaW5vZGUsCisJc3RydWN0IHVmc19jZ19wcml2YXRlX2luZm8gKiB1Y3BpLCB1bnNpZ25lZCBnb2FsLCBpbnQgKiBlcnIpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpOworCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfZmlyc3QgKiB1c2IxOworCXN0cnVjdCB1ZnNfY3lsaW5kZXJfZ3JvdXAgKiB1Y2c7CisJdW5zaWduZWQgcmVzdWx0LCBjeWxubywgYmxrbm87CisKKwlVRlNEKCgiRU5URVIsIGdvYWwgJXVcbiIsIGdvYWwpKQorCisJc2IgPSBpbm9kZS0+aV9zYjsKKwl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOworCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdChVU1BJX1VCSCk7CisJdWNnID0gdWJoX2dldF91Y2coVUNQSV9VQkgpOworCisJaWYgKGdvYWwgPT0gMCkgeworCQlnb2FsID0gdWNwaS0+Y19yb3RvcjsKKwkJZ290byBub3JvdDsKKwl9CisJZ29hbCA9IHVmc19ibGtudW0gKGdvYWwpOworCWdvYWwgPSB1ZnNfZHRvZ2QgKGdvYWwpOworCQorCS8qCisJICogSWYgdGhlIHJlcXVlc3RlZCBibG9jayBpcyBhdmFpbGFibGUsIHVzZSBpdC4KKwkgKi8KKwlpZiAodWJoX2lzYmxvY2tzZXQoVUNQSV9VQkgsIHVjcGktPmNfZnJlZW9mZiwgdWZzX2ZyYWdzdG9ibGtzKGdvYWwpKSkgeworCQlyZXN1bHQgPSBnb2FsOworCQlnb3RvIGdvdGl0OworCX0KKwkKK25vcm90OgkKKwlyZXN1bHQgPSB1ZnNfYml0bWFwX3NlYXJjaCAoc2IsIHVjcGksIGdvYWwsIHVzcGktPnNfZnBiKTsKKwlpZiAocmVzdWx0ID09ICh1bnNpZ25lZCktMSkKKwkJcmV0dXJuICh1bnNpZ25lZCktMTsKKwl1Y3BpLT5jX3JvdG9yID0gcmVzdWx0OworZ290aXQ6CisJYmxrbm8gPSB1ZnNfZnJhZ3N0b2Jsa3MocmVzdWx0KTsKKwl1YmhfY2xyYmxvY2sgKFVDUElfVUJILCB1Y3BpLT5jX2ZyZWVvZmYsIGJsa25vKTsKKwlpZiAoKFVGU19TQihzYiktPnNfZmxhZ3MgJiBVRlNfQ0dfTUFTSykgPT0gVUZTX0NHXzQ0QlNEKQorCQl1ZnNfY2x1c3RlcmFjY3QgKHNiLCB1Y3BpLCBibGtubywgLTEpOworCWlmKERRVU9UX0FMTE9DX0JMT0NLKGlub2RlLCB1c3BpLT5zX2ZwYikpIHsKKwkJKmVyciA9IC1FRFFVT1Q7CisJCXJldHVybiAodW5zaWduZWQpLTE7CisJfQorCisJZnMzMl9zdWIoc2IsICZ1Y2ctPmNnX2NzLmNzX25iZnJlZSwgMSk7CisJZnMzMl9zdWIoc2IsICZ1c2IxLT5mc19jc3RvdGFsLmNzX25iZnJlZSwgMSk7CisJZnMzMl9zdWIoc2IsICZVRlNfU0Ioc2IpLT5mc19jcyh1Y3BpLT5jX2NneCkuY3NfbmJmcmVlLCAxKTsKKwljeWxubyA9IHVmc19jYnRvY3lsbm8ocmVzdWx0KTsKKwlmczE2X3N1YihzYiwgJnViaF9jZ19ibGtzKHVjcGksIGN5bG5vLCB1ZnNfY2J0b3Jwb3MocmVzdWx0KSksIDEpOworCWZzMzJfc3ViKHNiLCAmdWJoX2NnX2Jsa3RvdCh1Y3BpLCBjeWxubyksIDEpOworCQorCVVGU0QoKCJFWElULCByZXN1bHQgJXVcbiIsIHJlc3VsdCkpCisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdW5zaWduZWQgdWZzX2JpdG1hcF9zZWFyY2ggKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLAorCXN0cnVjdCB1ZnNfY2dfcHJpdmF0ZV9pbmZvICogdWNwaSwgdW5zaWduZWQgZ29hbCwgdW5zaWduZWQgY291bnQpCit7CisJc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpOworCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfZmlyc3QgKiB1c2IxOworCXN0cnVjdCB1ZnNfY3lsaW5kZXJfZ3JvdXAgKiB1Y2c7CisJdW5zaWduZWQgc3RhcnQsIGxlbmd0aCwgbG9jYXRpb24sIHJlc3VsdDsKKwl1bnNpZ25lZCBwb3NzaXRpb24sIGZyYWdzaXplLCBibG9ja21hcCwgbWFzazsKKwkKKwlVRlNEKCgiRU5URVIsIGNnICV1LCBnb2FsICV1LCBjb3VudCAldVxuIiwgdWNwaS0+Y19jZ3gsIGdvYWwsIGNvdW50KSkKKworCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CisJdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0IChVU1BJX1VCSCk7CisJdWNnID0gdWJoX2dldF91Y2coVUNQSV9VQkgpOworCisJaWYgKGdvYWwpCisJCXN0YXJ0ID0gdWZzX2R0b2dkKGdvYWwpID4+IDM7CisJZWxzZQorCQlzdGFydCA9IHVjcGktPmNfZnJvdG9yID4+IDM7CisJCQorCWxlbmd0aCA9ICgodXNwaS0+c19mcGcgKyA3KSA+PiAzKSAtIHN0YXJ0OworCWxvY2F0aW9uID0gdWJoX3NjYW5jKFVDUElfVUJILCB1Y3BpLT5jX2ZyZWVvZmYgKyBzdGFydCwgbGVuZ3RoLAorCQkodXNwaS0+c19mcGIgPT0gOCkgPyB1ZnNfZnJhZ3RhYmxlXzhmcGIgOiB1ZnNfZnJhZ3RhYmxlX290aGVyLAorCQkxIDw8IChjb3VudCAtIDEgKyAodXNwaS0+c19mcGIgJiA3KSkpOyAKKwlpZiAobG9jYXRpb24gPT0gMCkgeworCQlsZW5ndGggPSBzdGFydCArIDE7CisJCWxvY2F0aW9uID0gdWJoX3NjYW5jKFVDUElfVUJILCB1Y3BpLT5jX2ZyZWVvZmYsIGxlbmd0aCwgCisJCQkodXNwaS0+c19mcGIgPT0gOCkgPyB1ZnNfZnJhZ3RhYmxlXzhmcGIgOiB1ZnNfZnJhZ3RhYmxlX290aGVyLAorCQkJMSA8PCAoY291bnQgLSAxICsgKHVzcGktPnNfZnBiICYgNykpKTsKKwkJaWYgKGxvY2F0aW9uID09IDApIHsKKwkJCXVmc19lcnJvciAoc2IsICJ1ZnNfYml0bWFwX3NlYXJjaCIsCisJCQkiYml0bWFwIGNvcnJ1cHRlZCBvbiBjZyAldSwgc3RhcnQgJXUsIGxlbmd0aCAldSwgY291bnQgJXUsIGZyZWVvZmYgJXVcbiIsCisJCQl1Y3BpLT5jX2NneCwgc3RhcnQsIGxlbmd0aCwgY291bnQsIHVjcGktPmNfZnJlZW9mZik7CisJCQlyZXR1cm4gKHVuc2lnbmVkKS0xOworCQl9CisJCXN0YXJ0ID0gMDsKKwl9CisJcmVzdWx0ID0gKHN0YXJ0ICsgbGVuZ3RoIC0gbG9jYXRpb24pIDw8IDM7CisJdWNwaS0+Y19mcm90b3IgPSByZXN1bHQ7CisKKwkvKgorCSAqIGZvdW5kIHRoZSBieXRlIGluIHRoZSBtYXAKKwkgKi8KKwlibG9ja21hcCA9IHViaF9ibGttYXAoVUNQSV9VQkgsIHVjcGktPmNfZnJlZW9mZiwgcmVzdWx0KTsKKwlmcmFnc2l6ZSA9IDA7CisJZm9yIChwb3NzaXRpb24gPSAwLCBtYXNrID0gMTsgcG9zc2l0aW9uIDwgODsgcG9zc2l0aW9uKyssIG1hc2sgPDw9IDEpIHsKKwkJaWYgKGJsb2NrbWFwICYgbWFzaykgeworCQkJaWYgKCEocG9zc2l0aW9uICYgdXNwaS0+c19mcGJtYXNrKSkKKwkJCQlmcmFnc2l6ZSA9IDE7CisJCQllbHNlIAorCQkJCWZyYWdzaXplKys7CisJCX0KKwkJZWxzZSB7CisJCQlpZiAoZnJhZ3NpemUgPT0gY291bnQpIHsKKwkJCQlyZXN1bHQgKz0gcG9zc2l0aW9uIC0gY291bnQ7CisJCQkJVUZTRCgoIkVYSVQsIHJlc3VsdCAldVxuIiwgcmVzdWx0KSkKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJZnJhZ3NpemUgPSAwOworCQl9CisJfQorCWlmIChmcmFnc2l6ZSA9PSBjb3VudCkgeworCQlyZXN1bHQgKz0gcG9zc2l0aW9uIC0gY291bnQ7CisJCVVGU0QoKCJFWElULCByZXN1bHQgJXVcbiIsIHJlc3VsdCkpCisJCXJldHVybiByZXN1bHQ7CisJfQorCXVmc19lcnJvciAoc2IsICJ1ZnNfYml0bWFwX3NlYXJjaCIsICJibG9jayBub3QgaW4gbWFwIG9uIGNnICV1XG4iLCB1Y3BpLT5jX2NneCk7CisJVUZTRCgoIkVYSVQgKEZBSUxFRClcbiIpKQorCXJldHVybiAodW5zaWduZWQpLTE7Cit9CisKK3N0YXRpYyB2b2lkIHVmc19jbHVzdGVyYWNjdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwlzdHJ1Y3QgdWZzX2NnX3ByaXZhdGVfaW5mbyAqIHVjcGksIHVuc2lnbmVkIGJsa25vLCBpbnQgY250KQoreworCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaTsKKwlpbnQgaSwgc3RhcnQsIGVuZCwgZm9ydywgYmFjazsKKwkKKwl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOworCWlmICh1c3BpLT5zX2NvbnRpZ3N1bXNpemUgPD0gMCkKKwkJcmV0dXJuOworCisJaWYgKGNudCA+IDApCisJCXViaF9zZXRiaXQoVUNQSV9VQkgsIHVjcGktPmNfY2x1c3Rlcm9mZiwgYmxrbm8pOworCWVsc2UKKwkJdWJoX2NscmJpdChVQ1BJX1VCSCwgdWNwaS0+Y19jbHVzdGVyb2ZmLCBibGtubyk7CisKKwkvKgorCSAqIEZpbmQgdGhlIHNpemUgb2YgdGhlIGNsdXN0ZXIgZ29pbmcgZm9yd2FyZC4KKwkgKi8KKwlzdGFydCA9IGJsa25vICsgMTsKKwllbmQgPSBzdGFydCArIHVzcGktPnNfY29udGlnc3Vtc2l6ZTsKKwlpZiAoIGVuZCA+PSB1Y3BpLT5jX25jbHVzdGVyYmxrcykKKwkJZW5kID0gdWNwaS0+Y19uY2x1c3RlcmJsa3M7CisJaSA9IHViaF9maW5kX25leHRfemVyb19iaXQgKFVDUElfVUJILCB1Y3BpLT5jX2NsdXN0ZXJvZmYsIGVuZCwgc3RhcnQpOworCWlmIChpID4gZW5kKQorCQlpID0gZW5kOworCWZvcncgPSBpIC0gc3RhcnQ7CisJCisJLyoKKwkgKiBGaW5kIHRoZSBzaXplIG9mIHRoZSBjbHVzdGVyIGdvaW5nIGJhY2t3YXJkLgorCSAqLworCXN0YXJ0ID0gYmxrbm8gLSAxOworCWVuZCA9IHN0YXJ0IC0gdXNwaS0+c19jb250aWdzdW1zaXplOworCWlmIChlbmQgPCAwICkgCisJCWVuZCA9IC0xOworCWkgPSB1YmhfZmluZF9sYXN0X3plcm9fYml0IChVQ1BJX1VCSCwgdWNwaS0+Y19jbHVzdGVyb2ZmLCBzdGFydCwgZW5kKTsKKwlpZiAoIGkgPCBlbmQpIAorCQlpID0gZW5kOworCWJhY2sgPSBzdGFydCAtIGk7CisJCisJLyoKKwkgKiBBY2NvdW50IGZvciBvbGQgY2x1c3RlciBhbmQgdGhlIHBvc3NpYmx5IG5ldyBmb3J3YXJkIGFuZAorCSAqIGJhY2sgY2x1c3RlcnMuCisJICovCisJaSA9IGJhY2sgKyBmb3J3ICsgMTsKKwlpZiAoaSA+IHVzcGktPnNfY29udGlnc3Vtc2l6ZSkKKwkJaSA9IHVzcGktPnNfY29udGlnc3Vtc2l6ZTsKKwlmczMyX2FkZChzYiwgKF9fZnMzMiopdWJoX2dldF9hZGRyKFVDUElfVUJILCB1Y3BpLT5jX2NsdXN0ZXJzdW1vZmYgKyAoaSA8PCAyKSksIGNudCk7CisJaWYgKGJhY2sgPiAwKQorCQlmczMyX3N1YihzYiwgKF9fZnMzMiopdWJoX2dldF9hZGRyKFVDUElfVUJILCB1Y3BpLT5jX2NsdXN0ZXJzdW1vZmYgKyAoYmFjayA8PCAyKSksIGNudCk7CisJaWYgKGZvcncgPiAwKQorCQlmczMyX3N1YihzYiwgKF9fZnMzMiopdWJoX2dldF9hZGRyKFVDUElfVUJILCB1Y3BpLT5jX2NsdXN0ZXJzdW1vZmYgKyAoZm9ydyA8PCAyKSksIGNudCk7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgdWZzX2ZyYWd0YWJsZV84ZnBiW10gPSB7CisJMHgwMCwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwNCwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMywgMHgwMiwgMHgwMywgMHgwNCwgMHgwOCwKKwkweDAxLCAweDAxLCAweDAxLCAweDAzLCAweDAxLCAweDAxLCAweDAzLCAweDA1LCAweDAyLCAweDAzLCAweDAzLCAweDAyLCAweDA0LCAweDA1LCAweDA4LCAweDEwLAorCTB4MDEsIDB4MDEsIDB4MDEsIDB4MDMsIDB4MDEsIDB4MDEsIDB4MDMsIDB4MDUsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDUsIDB4MDksCisJMHgwMiwgMHgwMywgMHgwMywgMHgwMiwgMHgwMywgMHgwMywgMHgwMiwgMHgwNiwgMHgwNCwgMHgwNSwgMHgwNSwgMHgwNiwgMHgwOCwgMHgwOSwgMHgxMCwgMHgyMCwKKwkweDAxLCAweDAxLCAweDAxLCAweDAzLCAweDAxLCAweDAxLCAweDAzLCAweDA1LCAweDAxLCAweDAxLCAweDAxLCAweDAzLCAweDAzLCAweDAzLCAweDA1LCAweDA5LAkKKwkweDAxLCAweDAxLCAweDAxLCAweDAzLCAweDAxLCAweDAxLCAweDAzLCAweDA1LCAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDA1LCAweDA1LCAweDA5LCAweDExLAorCTB4MDIsIDB4MDMsIDB4MDMsIDB4MDIsIDB4MDMsIDB4MDMsIDB4MDIsIDB4MDYsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDIsIDB4MDMsIDB4MDYsIDB4MEEsCisJMHgwNCwgMHgwNSwgMHgwNSwgMHgwNiwgMHgwNSwgMHgwNSwgMHgwNiwgMHgwNCwgMHgwOCwgMHgwOSwgMHgwOSwgMHgwQSwgMHgxMCwgMHgxMSwgMHgyMCwgMHg0MCwKKwkweDAxLCAweDAxLCAweDAxLCAweDAzLCAweDAxLCAweDAxLCAweDAzLCAweDA1LCAweDAxLCAweDAxLCAweDAxLCAweDAzLCAweDAzLCAweDAzLCAweDA1LCAweDA5LAorCTB4MDEsIDB4MDEsIDB4MDEsIDB4MDMsIDB4MDEsIDB4MDEsIDB4MDMsIDB4MDUsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDUsIDB4MDUsIDB4MDksIDB4MTEsCisJMHgwMSwgMHgwMSwgMHgwMSwgMHgwMywgMHgwMSwgMHgwMSwgMHgwMywgMHgwNSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMywgMHgwMywgMHgwMywgMHgwNSwgMHgwOSwKKwkweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDAzLCAweDA3LCAweDA1LCAweDA1LCAweDA1LCAweDA3LCAweDA5LCAweDA5LCAweDExLCAweDIxLAorCTB4MDIsIDB4MDMsIDB4MDMsIDB4MDIsIDB4MDMsIDB4MDMsIDB4MDIsIDB4MDYsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDIsIDB4MDMsIDB4MDYsIDB4MEEsCisJMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwNywgMHgwMiwgMHgwMywgMHgwMywgMHgwMiwgMHgwNiwgMHgwNywgMHgwQSwgMHgxMiwKKwkweDA0LCAweDA1LCAweDA1LCAweDA2LCAweDA1LCAweDA1LCAweDA2LCAweDA0LCAweDA1LCAweDA1LCAweDA1LCAweDA3LCAweDA2LCAweDA3LCAweDA0LCAweDBDLAorCTB4MDgsIDB4MDksIDB4MDksIDB4MEEsIDB4MDksIDB4MDksIDB4MEEsIDB4MEMsIDB4MTAsIDB4MTEsIDB4MTEsIDB4MTIsIDB4MjAsIDB4MjEsIDB4NDAsIDB4ODAsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB1ZnNfZnJhZ3RhYmxlX290aGVyW10gPSB7CisJMHgwMCwgMHgxNiwgMHgxNiwgMHgyQSwgMHgxNiwgMHgxNiwgMHgyNiwgMHg0RSwgMHgxNiwgMHgxNiwgMHgxNiwgMHgzRSwgMHgyQSwgMHgzRSwgMHg0RSwgMHg4QSwKKwkweDE2LCAweDE2LCAweDE2LCAweDNFLCAweDE2LCAweDE2LCAweDM2LCAweDVFLCAweDE2LCAweDE2LCAweDE2LCAweDNFLCAweDNFLCAweDNFLCAweDVFLCAweDlFLAorCTB4MTYsIDB4MTYsIDB4MTYsIDB4M0UsIDB4MTYsIDB4MTYsIDB4MzYsIDB4NUUsIDB4MTYsIDB4MTYsIDB4MTYsIDB4M0UsIDB4M0UsIDB4M0UsIDB4NUUsIDB4OUUsCisJMHgyQSwgMHgzRSwgMHgzRSwgMHgyQSwgMHgzRSwgMHgzRSwgMHgyRSwgMHg2RSwgMHgzRSwgMHgzRSwgMHgzRSwgMHgzRSwgMHgyQSwgMHgzRSwgMHg2RSwgMHhBQSwKKwkweDE2LCAweDE2LCAweDE2LCAweDNFLCAweDE2LCAweDE2LCAweDM2LCAweDVFLCAweDE2LCAweDE2LCAweDE2LCAweDNFLCAweDNFLCAweDNFLCAweDVFLCAweDlFLAorCTB4MTYsIDB4MTYsIDB4MTYsIDB4M0UsIDB4MTYsIDB4MTYsIDB4MzYsIDB4NUUsIDB4MTYsIDB4MTYsIDB4MTYsIDB4M0UsIDB4M0UsIDB4M0UsIDB4NUUsIDB4OUUsCisJMHgyNiwgMHgzNiwgMHgzNiwgMHgyRSwgMHgzNiwgMHgzNiwgMHgyNiwgMHg2RSwgMHgzNiwgMHgzNiwgMHgzNiwgMHgzRSwgMHgyRSwgMHgzRSwgMHg2RSwgMHhBRSwKKwkweDRFLCAweDVFLCAweDVFLCAweDZFLCAweDVFLCAweDVFLCAweDZFLCAweDRFLCAweDVFLCAweDVFLCAweDVFLCAweDdFLCAweDZFLCAweDdFLCAweDRFLCAweENFLAorCTB4MTYsIDB4MTYsIDB4MTYsIDB4M0UsIDB4MTYsIDB4MTYsIDB4MzYsIDB4NUUsIDB4MTYsIDB4MTYsIDB4MTYsIDB4M0UsIDB4M0UsIDB4M0UsIDB4NUUsIDB4OUUsCisJMHgxNiwgMHgxNiwgMHgxNiwgMHgzRSwgMHgxNiwgMHgxNiwgMHgzNiwgMHg1RSwgMHgxNiwgMHgxNiwgMHgxNiwgMHgzRSwgMHgzRSwgMHgzRSwgMHg1RSwgMHg5RSwKKwkweDE2LCAweDE2LCAweDE2LCAweDNFLCAweDE2LCAweDE2LCAweDM2LCAweDVFLCAweDE2LCAweDE2LCAweDE2LCAweDNFLCAweDNFLCAweDNFLCAweDVFLCAweDlFLAorCTB4M0UsIDB4M0UsIDB4M0UsIDB4M0UsIDB4M0UsIDB4M0UsIDB4M0UsIDB4N0UsIDB4M0UsIDB4M0UsIDB4M0UsIDB4M0UsIDB4M0UsIDB4M0UsIDB4N0UsIDB4QkUsCisJMHgyQSwgMHgzRSwgMHgzRSwgMHgyQSwgMHgzRSwgMHgzRSwgMHgyRSwgMHg2RSwgMHgzRSwgMHgzRSwgMHgzRSwgMHgzRSwgMHgyQSwgMHgzRSwgMHg2RSwgMHhBQSwKKwkweDNFLCAweDNFLCAweDNFLCAweDNFLCAweDNFLCAweDNFLCAweDNFLCAweDdFLAkweDNFLCAweDNFLCAweDNFLCAweDNFLCAweDNFLCAweDNFLCAweDdFLCAweEJFLAorCTB4NEUsIDB4NUUsIDB4NUUsIDB4NkUsIDB4NUUsIDB4NUUsIDB4NkUsIDB4NEUsIDB4NUUsIDB4NUUsIDB4NUUsIDB4N0UsIDB4NkUsIDB4N0UsIDB4NEUsIDB4Q0UsCisJMHg4QSwgMHg5RSwgMHg5RSwgMHhBQSwgMHg5RSwgMHg5RSwgMHhBRSwgMHhDRSwgMHg5RSwgMHg5RSwgMHg5RSwgMHhCRSwgMHhBQSwgMHhCRSwgMHhDRSwgMHg4QSwKK307CmRpZmYgLS1naXQgYS9mcy91ZnMvY3lsaW5kZXIuYyBiL2ZzL3Vmcy9jeWxpbmRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YWJiOGIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy91ZnMvY3lsaW5kZXIuYwpAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqICBsaW51eC9mcy91ZnMvY3lsaW5kZXIuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5OAorICogRGFuaWVsIFBpcmtsIDxkYW5pZWwucGlya2xAZW1haWwuY3o+CisgKiBDaGFybGVzIFVuaXZlcnNpdHksIEZhY3VsdHkgb2YgTWF0aGVtYXRpY3MgYW5kIFBoeXNpY3MKKyAqCisgKiAgZXh0MiAtIGlub2RlIChibG9jaykgYml0bWFwIGNhY2hpbmcgaW5zcGlyZWQKKyAqLworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC91ZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaW5jbHVkZSAic3dhYi5oIgorI2luY2x1ZGUgInV0aWwuaCIKKworI3VuZGVmIFVGU19DWUxJTkRFUl9ERUJVRworCisjaWZkZWYgVUZTX0NZTElOREVSX0RFQlVHCisjZGVmaW5lIFVGU0QoeCkgcHJpbnRrKCIoJXMsICVkKSwgJXM6IiwgX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pOyBwcmludGsgeDsKKyNlbHNlCisjZGVmaW5lIFVGU0QoeCkKKyNlbmRpZgorCisKKy8qCisgKiBSZWFkIGN5bGluZGVyIGdyb3VwIGludG8gY2FjaGUuIFRoZSBtZW1vcnkgc3BhY2UgZm9yIHVmc19jZ19wcml2YXRlX2luZm8KKyAqIHN0cnVjdHVyZSBpcyBhbHJlYWR5IGFsbG9jYXRlZCBkdXJpbmcgdWZzX3JlYWRfc3VwZXIuCisgKi8KK3N0YXRpYyB2b2lkIHVmc19yZWFkX2N5bGluZGVyIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwKKwl1bnNpZ25lZCBjZ25vLCB1bnNpZ25lZCBiaXRtYXBfbnIpCit7CisJc3RydWN0IHVmc19zYl9pbmZvICogc2JpID0gVUZTX1NCKHNiKTsKKwlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGk7CisJc3RydWN0IHVmc19jZ19wcml2YXRlX2luZm8gKiB1Y3BpOworCXN0cnVjdCB1ZnNfY3lsaW5kZXJfZ3JvdXAgKiB1Y2c7CisJdW5zaWduZWQgaSwgajsKKworCVVGU0QoKCJFTlRFUiwgY2dubyAldSwgYml0bWFwX25yICV1XG4iLCBjZ25vLCBiaXRtYXBfbnIpKQorCXVzcGkgPSBzYmktPnNfdXNwaTsKKwl1Y3BpID0gc2JpLT5zX3VjcGlbYml0bWFwX25yXTsKKwl1Y2cgPSAoc3RydWN0IHVmc19jeWxpbmRlcl9ncm91cCAqKXNiaS0+c191Y2dbY2dub10tPmJfZGF0YTsKKworCVVDUElfVUJILT5mcmFnbWVudCA9IHVmc19jZ2NtaW4oY2dubyk7CisJVUNQSV9VQkgtPmNvdW50ID0gdXNwaS0+c19jZ3NpemUgPj4gc2ItPnNfYmxvY2tzaXplX2JpdHM7CisJLyoKKwkgKiBXZSBoYXZlIGFscmVhZHkgdGhlIGZpcnN0IGZyYWdtZW50IG9mIGN5bGluZGVyIGdyb3VwIGJsb2NrIGluIGJ1ZmZlcgorCSAqLworCVVDUElfVUJILT5iaFswXSA9IHNiaS0+c191Y2dbY2dub107CisJZm9yIChpID0gMTsgaSA8IFVDUElfVUJILT5jb3VudDsgaSsrKQorCQlpZiAoIShVQ1BJX1VCSC0+YmhbaV0gPSBzYl9icmVhZChzYiwgVUNQSV9VQkgtPmZyYWdtZW50ICsgaSkpKQorCQkJZ290byBmYWlsZWQ7CisJc2JpLT5zX2Nnbm9bYml0bWFwX25yXSA9IGNnbm87CisJCQkKKwl1Y3BpLT5jX2NneAk9IGZzMzJfdG9fY3B1KHNiLCB1Y2ctPmNnX2NneCk7CisJdWNwaS0+Y19uY3lsCT0gZnMxNl90b19jcHUoc2IsIHVjZy0+Y2dfbmN5bCk7CisJdWNwaS0+Y19uaWJsawk9IGZzMTZfdG9fY3B1KHNiLCB1Y2ctPmNnX25pYmxrKTsKKwl1Y3BpLT5jX25kYmxrCT0gZnMzMl90b19jcHUoc2IsIHVjZy0+Y2dfbmRibGspOworCXVjcGktPmNfcm90b3IJPSBmczMyX3RvX2NwdShzYiwgdWNnLT5jZ19yb3Rvcik7CisJdWNwaS0+Y19mcm90b3IJPSBmczMyX3RvX2NwdShzYiwgdWNnLT5jZ19mcm90b3IpOworCXVjcGktPmNfaXJvdG9yCT0gZnMzMl90b19jcHUoc2IsIHVjZy0+Y2dfaXJvdG9yKTsKKwl1Y3BpLT5jX2J0b3RvZmYJPSBmczMyX3RvX2NwdShzYiwgdWNnLT5jZ19idG90b2ZmKTsKKwl1Y3BpLT5jX2JvZmYJPSBmczMyX3RvX2NwdShzYiwgdWNnLT5jZ19ib2ZmKTsKKwl1Y3BpLT5jX2l1c2Vkb2ZmID0gZnMzMl90b19jcHUoc2IsIHVjZy0+Y2dfaXVzZWRvZmYpOworCXVjcGktPmNfZnJlZW9mZgk9IGZzMzJfdG9fY3B1KHNiLCB1Y2ctPmNnX2ZyZWVvZmYpOworCXVjcGktPmNfbmV4dGZyZWVvZmYgPSBmczMyX3RvX2NwdShzYiwgdWNnLT5jZ19uZXh0ZnJlZW9mZik7CisJdWNwaS0+Y19jbHVzdGVyc3Vtb2ZmID0gZnMzMl90b19jcHUoc2IsIHVjZy0+Y2dfdS5jZ180NC5jZ19jbHVzdGVyc3Vtb2ZmKTsKKwl1Y3BpLT5jX2NsdXN0ZXJvZmYgPSBmczMyX3RvX2NwdShzYiwgdWNnLT5jZ191LmNnXzQ0LmNnX2NsdXN0ZXJvZmYpOworCXVjcGktPmNfbmNsdXN0ZXJibGtzID0gZnMzMl90b19jcHUoc2IsIHVjZy0+Y2dfdS5jZ180NC5jZ19uY2x1c3RlcmJsa3MpOworCVVGU0QoKCJFWElUXG4iKSkKKwlyZXR1cm47CQorCQorZmFpbGVkOgorCWZvciAoaiA9IDE7IGogPCBpOyBqKyspCisJCWJyZWxzZSAoc2JpLT5zX3VjZ1tqXSk7CisJc2JpLT5zX2Nnbm9bYml0bWFwX25yXSA9IFVGU19DR05PX0VNUFRZOworCXVmc19lcnJvciAoc2IsICJ1ZnNfcmVhZF9jeWxpbmRlciIsICJjYW4ndCByZWFkIGN5bGluZGVyIGdyb3VwIGJsb2NrICV1IiwgY2dubyk7Cit9CisKKy8qCisgKiBSZW1vdmUgY3lsaW5kZXIgZ3JvdXAgZnJvbSBjYWNoZSwgZG9lc24ndCByZWxlYXNlIG1lbW9yeQorICogYWxsb2NhdGVkIGZvciBjeWxpbmRlciBncm91cCAodGhpcyBpcyBkb25lIGF0IHVmc19wdXRfc3VwZXIgb25seSkuCisgKi8KK3ZvaWQgdWZzX3B1dF9jeWxpbmRlciAoc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIHVuc2lnbmVkIGJpdG1hcF9ucikKK3sKKwlzdHJ1Y3QgdWZzX3NiX2luZm8gKiBzYmkgPSBVRlNfU0Ioc2IpOworCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaTsgCisJc3RydWN0IHVmc19jZ19wcml2YXRlX2luZm8gKiB1Y3BpOworCXN0cnVjdCB1ZnNfY3lsaW5kZXJfZ3JvdXAgKiB1Y2c7CisJdW5zaWduZWQgaTsKKworCVVGU0QoKCJFTlRFUiwgYml0bWFwX25yICV1XG4iLCBiaXRtYXBfbnIpKQorCisJdXNwaSA9IHNiaS0+c191c3BpOworCWlmIChzYmktPnNfY2dub1tiaXRtYXBfbnJdID09IFVGU19DR05PX0VNUFRZKSB7CisJCVVGU0QoKCJFWElUXG4iKSkKKwkJcmV0dXJuOworCX0KKwl1Y3BpID0gc2JpLT5zX3VjcGlbYml0bWFwX25yXTsKKwl1Y2cgPSB1YmhfZ2V0X3VjZyhVQ1BJX1VCSCk7CisKKwlpZiAodXNwaS0+c19uY2cgPiBVRlNfTUFYX0dST1VQX0xPQURFRCAmJiBiaXRtYXBfbnIgPj0gc2JpLT5zX2NnX2xvYWRlZCkgeworCQl1ZnNfcGFuaWMgKHNiLCAidWZzX3B1dF9jeWxpbmRlciIsICJpbnRlcm5hbCBlcnJvciIpOworCQlyZXR1cm47CisJfQorCS8qCisJICogcm90b3IgaXMgbm90IHNvIGltcG9ydGFudCBkYXRhLCBzbyB3ZSBwdXQgaXQgdG8gZGlzayAKKwkgKiBhdCB0aGUgZW5kIG9mIHdvcmtpbmcgd2l0aCBjeWxpbmRlcgorCSAqLworCXVjZy0+Y2dfcm90b3IgPSBjcHVfdG9fZnMzMihzYiwgdWNwaS0+Y19yb3Rvcik7CisJdWNnLT5jZ19mcm90b3IgPSBjcHVfdG9fZnMzMihzYiwgdWNwaS0+Y19mcm90b3IpOworCXVjZy0+Y2dfaXJvdG9yID0gY3B1X3RvX2ZzMzIoc2IsIHVjcGktPmNfaXJvdG9yKTsKKwl1YmhfbWFya19idWZmZXJfZGlydHkgKFVDUElfVUJIKTsKKwlmb3IgKGkgPSAxOyBpIDwgVUNQSV9VQkgtPmNvdW50OyBpKyspIHsKKwkJYnJlbHNlIChVQ1BJX1VCSC0+YmhbaV0pOworCX0KKworCXNiaS0+c19jZ25vW2JpdG1hcF9ucl0gPSBVRlNfQ0dOT19FTVBUWTsKKwlVRlNEKCgiRVhJVFxuIikpCit9CisKKy8qCisgKiBGaW5kIGN5bGluZGVyIGdyb3VwIGluIGNhY2hlIGFuZCByZXR1cm4gaXQgYXMgcG9pbnRlci4KKyAqIElmIGN5bGluZGVyIGdyb3VwIGlzIG5vdCBpbiBjYWNoZSwgd2Ugd2lsbCBsb2FkIGl0IGZyb20gZGlzay4KKyAqCisgKiBUaGUgY2FjaGUgaXMgbWFuYWdlZCBieSBMUlUgYWxnb3JpdGhtLiAKKyAqLworc3RydWN0IHVmc19jZ19wcml2YXRlX2luZm8gKiB1ZnNfbG9hZF9jeWxpbmRlciAoCisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2IsIHVuc2lnbmVkIGNnbm8pCit7CisJc3RydWN0IHVmc19zYl9pbmZvICogc2JpID0gVUZTX1NCKHNiKTsKKwlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGk7CisJc3RydWN0IHVmc19jZ19wcml2YXRlX2luZm8gKiB1Y3BpOworCXVuc2lnbmVkIGNnLCBpLCBqOworCisJVUZTRCgoIkVOVEVSLCBjZ25vICV1XG4iLCBjZ25vKSkKKworCXVzcGkgPSBzYmktPnNfdXNwaTsKKwlpZiAoY2dubyA+PSB1c3BpLT5zX25jZykgeworCQl1ZnNfcGFuaWMgKHNiLCAidWZzX2xvYWRfY3lsaW5kZXIiLCAiaW50ZXJuYWwgZXJyb3IsIGhpZ2ggbnVtYmVyIG9mIGNnIik7CisJCXJldHVybiBOVUxMOworCX0KKwkvKgorCSAqIEN5bGluZGVyIGdyb3VwIG51bWJlciBjZyBpdCBpbiBjYWNoZSBhbmQgaXQgd2FzIGxhc3QgdXNlZAorCSAqLworCWlmIChzYmktPnNfY2dub1swXSA9PSBjZ25vKSB7CisJCVVGU0QoKCJFWElUXG4iKSkKKwkJcmV0dXJuIHNiaS0+c191Y3BpWzBdOworCX0KKwkvKgorCSAqIE51bWJlciBvZiBjeWxpbmRlciBncm91cHMgaXMgbm90IGhpZ2hlciB0aGFuIFVGU19NQVhfR1JPVVBfTE9BREVECisJICovCisJaWYgKHVzcGktPnNfbmNnIDw9IFVGU19NQVhfR1JPVVBfTE9BREVEKSB7CisJCWlmIChzYmktPnNfY2dub1tjZ25vXSAhPSBVRlNfQ0dOT19FTVBUWSkgeworCQkJaWYgKHNiaS0+c19jZ25vW2Nnbm9dICE9IGNnbm8pIHsKKwkJCQl1ZnNfcGFuaWMgKHNiLCAidWZzX2xvYWRfY3lsaW5kZXIiLCAiaW50ZXJuYWwgZXJyb3IsIHdyb25nIG51bWJlciBvZiBjZyBpbiBjYWNoZSIpOworCQkJCVVGU0QoKCJFWElUIChGQUlMRUQpXG4iKSkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCWVsc2UgeworCQkJCVVGU0QoKCJFWElUXG4iKSkKKwkJCQlyZXR1cm4gc2JpLT5zX3VjcGlbY2dub107CisJCQl9CisJCX0gZWxzZSB7CisJCQl1ZnNfcmVhZF9jeWxpbmRlciAoc2IsIGNnbm8sIGNnbm8pOworCQkJVUZTRCgoIkVYSVRcbiIpKQorCQkJcmV0dXJuIHNiaS0+c191Y3BpW2Nnbm9dOworCQl9CisJfQorCS8qCisJICogQ3lsaW5kZXIgZ3JvdXAgbnVtYmVyIGNnIGlzIGluIGNhY2hlIGJ1dCBpdCB3YXMgbm90IGxhc3QgdXNlZCwgCisJICogd2Ugd2lsbCBtb3ZlIHRvIHRoZSBmaXJzdCBwb3NpdGlvbgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBzYmktPnNfY2dfbG9hZGVkICYmIHNiaS0+c19jZ25vW2ldICE9IGNnbm87IGkrKyk7CisJaWYgKGkgPCBzYmktPnNfY2dfbG9hZGVkICYmIHNiaS0+c19jZ25vW2ldID09IGNnbm8pIHsKKwkJY2cgPSBzYmktPnNfY2dub1tpXTsKKwkJdWNwaSA9IHNiaS0+c191Y3BpW2ldOworCQlmb3IgKGogPSBpOyBqID4gMDsgai0tKSB7CisJCQlzYmktPnNfY2dub1tqXSA9IHNiaS0+c19jZ25vW2otMV07CisJCQlzYmktPnNfdWNwaVtqXSA9IHNiaS0+c191Y3BpW2otMV07CisJCX0KKwkJc2JpLT5zX2Nnbm9bMF0gPSBjZzsKKwkJc2JpLT5zX3VjcGlbMF0gPSB1Y3BpOworCS8qCisJICogQ3lsaW5kZXIgZ3JvdXAgbnVtYmVyIGNnIGlzIG5vdCBpbiBjYWNoZSwgd2Ugd2lsbCByZWFkIGl0IGZyb20gZGlzaworCSAqIGFuZCBwdXQgaXQgdG8gdGhlIGZpcnN0IHBvc2l0aW9uCisJICovCisJfSBlbHNlIHsKKwkJaWYgKHNiaS0+c19jZ19sb2FkZWQgPCBVRlNfTUFYX0dST1VQX0xPQURFRCkKKwkJCXNiaS0+c19jZ19sb2FkZWQrKzsKKwkJZWxzZQorCQkJdWZzX3B1dF9jeWxpbmRlciAoc2IsIFVGU19NQVhfR1JPVVBfTE9BREVELTEpOworCQl1Y3BpID0gc2JpLT5zX3VjcGlbc2JpLT5zX2NnX2xvYWRlZCAtIDFdOworCQlmb3IgKGogPSBzYmktPnNfY2dfbG9hZGVkIC0gMTsgaiA+IDA7IGotLSkgeworCQkJc2JpLT5zX2Nnbm9bal0gPSBzYmktPnNfY2dub1tqLTFdOworCQkJc2JpLT5zX3VjcGlbal0gPSBzYmktPnNfdWNwaVtqLTFdOworCQl9CisJCXNiaS0+c191Y3BpWzBdID0gdWNwaTsKKwkJdWZzX3JlYWRfY3lsaW5kZXIgKHNiLCBjZ25vLCAwKTsKKwl9CisJVUZTRCgoIkVYSVRcbiIpKQorCXJldHVybiBzYmktPnNfdWNwaVswXTsKK30KZGlmZiAtLWdpdCBhL2ZzL3Vmcy9kaXIuYyBiL2ZzL3Vmcy9kaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDkxNWZiCi0tLSAvZGV2L251bGwKKysrIGIvZnMvdWZzL2Rpci5jCkBAIC0wLDAgKzEsNjI3IEBACisvKgorICogIGxpbnV4L2ZzL3Vmcy91ZnNfZGlyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYKKyAqIEFkcmlhbiBSb2RyaWd1ZXogKGFkcmlhbkBmcmFua2xpbnMtdG93ZXIucnV0Z2Vycy5lZHUpCisgKiBMYWJvcmF0b3J5IGZvciBDb21wdXRlciBTY2llbmNlIFJlc2VhcmNoIENvbXB1dGluZyBGYWNpbGl0eQorICogUnV0Z2VycywgVGhlIFN0YXRlIFVuaXZlcnNpdHkgb2YgTmV3IEplcnNleQorICoKKyAqIHN3YWIgc3VwcG9ydCBieSBGcmFuY29pcy1SZW5lIFJpZGVhdSA8ZmFyZUB0dW5lcy5vcmc+IDE5OTcwNDA2CisgKgorICogNC40QlNEIChGcmVlQlNEKSBzdXBwb3J0IGFkZGVkIG9uIEZlYnJ1YXJ5IDFzdCAxOTk4IGJ5CisgKiBOaWVscyBLcmlzdGlhbiBCZWNoIEplbnNlbiA8bmtiakBpbWFnZS5kaz4gcGFydGlhbGx5IGJhc2VkCisgKiBvbiBjb2RlIGJ5IE1hcnRpbiB2b24gTG9ld2lzIDxtYXJ0aW5AbWlyYS5pc2RuLmNzLnR1LWJlcmxpbi5kZT4uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Vmc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorCisjaW5jbHVkZSAic3dhYi5oIgorI2luY2x1ZGUgInV0aWwuaCIKKworI3VuZGVmIFVGU19ESVJfREVCVUcKKworI2lmZGVmIFVGU19ESVJfREVCVUcKKyNkZWZpbmUgVUZTRCh4KSBwcmludGsoIiglcywgJWQpLCAlczogIiwgX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pOyBwcmludGsgeDsKKyNlbHNlCisjZGVmaW5lIFVGU0QoeCkKKyNlbmRpZgorCitzdGF0aWMgaW50Cit1ZnNfY2hlY2tfZGlyX2VudHJ5IChjb25zdCBjaGFyICosIHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqLAorCQkgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqLCB1bnNpZ25lZCBsb25nKTsKKworCisvKgorICogTk9URSEgdW5saWtlIHN0cm5jbXAsIHVmc19tYXRjaCByZXR1cm5zIDEgZm9yIHN1Y2Nlc3MsIDAgZm9yIGZhaWx1cmUuCisgKgorICogbGVuIDw9IFVGU19NQVhOQU1MRU4gYW5kIGRlICE9IE5VTEwgYXJlIGd1YXJhbnRlZWQgYnkgY2FsbGVyLgorICovCitzdGF0aWMgaW5saW5lIGludCB1ZnNfbWF0Y2goc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IGxlbiwKKwkJY29uc3QgY2hhciAqIGNvbnN0IG5hbWUsIHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICogZGUpCit7CisJaWYgKGxlbiAhPSB1ZnNfZ2V0X2RlX25hbWxlbihzYiwgZGUpKQorCQlyZXR1cm4gMDsKKwlpZiAoIWRlLT5kX2lubykKKwkJcmV0dXJuIDA7CisJcmV0dXJuICFtZW1jbXAobmFtZSwgZGUtPmRfbmFtZSwgbGVuKTsKK30KKworLyoKKyAqIFRoaXMgaXMgYmxhdGFudGx5IHN0b2xlbiBmcm9tIGV4dDJmcworICovCitzdGF0aWMgaW50Cit1ZnNfcmVhZGRpciAoc3RydWN0IGZpbGUgKiBmaWxwLCB2b2lkICogZGlyZW50LCBmaWxsZGlyX3QgZmlsbGRpcikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJaW50IGVycm9yID0gMDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCwgbGJsazsKKwlpbnQgaSwgc3RvcmVkOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXN0cnVjdCB1ZnNfZGlyX2VudHJ5ICogZGU7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJaW50IGRlX3JlY2xlbjsKKwl1bnNpZ25lZCBmbGFnczsKKwl1NjQgICAgIGJsaz0gMEw7CisKKwlsb2NrX2tlcm5lbCgpOworCisJc2IgPSBpbm9kZS0+aV9zYjsKKwlmbGFncyA9IFVGU19TQihzYiktPnNfZmxhZ3M7CisKKwlVRlNEKCgiRU5URVIsIGlubyAlbHUgIGZfcG9zICVsdVxuIiwgaW5vZGUtPmlfaW5vLCAodW5zaWduZWQgbG9uZykgZmlscC0+Zl9wb3MpKQorCisJc3RvcmVkID0gMDsKKwliaCA9IE5VTEw7CisJb2Zmc2V0ID0gZmlscC0+Zl9wb3MgJiAoc2ItPnNfYmxvY2tzaXplIC0gMSk7CisKKwl3aGlsZSAoIWVycm9yICYmICFzdG9yZWQgJiYgZmlscC0+Zl9wb3MgPCBpbm9kZS0+aV9zaXplKSB7CisJCWxibGsgPSAoZmlscC0+Zl9wb3MpID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCQlibGsgPSB1ZnNfZnJhZ19tYXAoaW5vZGUsIGxibGspOworCQlpZiAoIWJsayB8fCAhKGJoID0gc2JfYnJlYWQoc2IsIGJsaykpKSB7CisJCQkvKiBYWFggLSBlcnJvciAtIHNraXAgdG8gdGhlIG5leHQgYmxvY2sgKi8KKwkJCXByaW50aygidWZzX3JlYWRkaXI6ICIKKwkJCSAgICAgICAiZGlyIGlub2RlICVsdSBoYXMgYSBob2xlIGF0IG9mZnNldCAlbHVcbiIsCisJCQkgICAgICAgaW5vZGUtPmlfaW5vLCAodW5zaWduZWQgbG9uZyBpbnQpZmlscC0+Zl9wb3MpOworCQkJZmlscC0+Zl9wb3MgKz0gc2ItPnNfYmxvY2tzaXplIC0gb2Zmc2V0OworCQkJY29udGludWU7CisJCX0KKworcmV2YWxpZGF0ZToKKwkJLyogSWYgdGhlIGRpciBibG9jayBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvCisJCSAqIHJlYWRkaXIoMiksIHRoZW4gd2UgbWlnaHQgYmUgcG9pbnRpbmcgdG8gYW4gaW52YWxpZAorCQkgKiBkaXJlbnQgcmlnaHQgbm93LiAgU2NhbiBmcm9tIHRoZSBzdGFydCBvZiB0aGUgYmxvY2sKKwkJICogdG8gbWFrZSBzdXJlLiAqLworCQlpZiAoZmlscC0+Zl92ZXJzaW9uICE9IGlub2RlLT5pX3ZlcnNpb24pIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBzYi0+c19ibG9ja3NpemUgJiYgaSA8IG9mZnNldDsgKSB7CisJCQkJZGUgPSAoc3RydWN0IHVmc19kaXJfZW50cnkgKikoYmgtPmJfZGF0YSArIGkpOworCQkJCS8qIEl0J3MgdG9vIGV4cGVuc2l2ZSB0byBkbyBhIGZ1bGwKKwkJCQkgKiBkaXJlbnQgdGVzdCBlYWNoIHRpbWUgcm91bmQgdGhpcworCQkJCSAqIGxvb3AsIGJ1dCB3ZSBkbyBoYXZlIHRvIHRlc3QgYXQKKwkJCQkgKiBsZWFzdCB0aGF0IGl0IGlzIG5vbi16ZXJvLiAgQQorCQkJCSAqIGZhaWx1cmUgd2lsbCBiZSBkZXRlY3RlZCBpbiB0aGUKKwkJCQkgKiBkaXJlbnQgdGVzdCBiZWxvdy4gKi8KKwkJCQlkZV9yZWNsZW4gPSBmczE2X3RvX2NwdShzYiwgZGUtPmRfcmVjbGVuKTsKKwkJCQlpZiAoZGVfcmVjbGVuIDwgMSkKKwkJCQkJYnJlYWs7CisJCQkJaSArPSBkZV9yZWNsZW47CisJCQl9CisJCQlvZmZzZXQgPSBpOworCQkJZmlscC0+Zl9wb3MgPSAoZmlscC0+Zl9wb3MgJiB+KHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpKQorCQkJCXwgb2Zmc2V0OworCQkJZmlscC0+Zl92ZXJzaW9uID0gaW5vZGUtPmlfdmVyc2lvbjsKKwkJfQorCisJCXdoaWxlICghZXJyb3IgJiYgZmlscC0+Zl9wb3MgPCBpbm9kZS0+aV9zaXplCisJCSAgICAgICAmJiBvZmZzZXQgPCBzYi0+c19ibG9ja3NpemUpIHsKKwkJCWRlID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopIChiaC0+Yl9kYXRhICsgb2Zmc2V0KTsKKwkJCS8qIFhYWCAtIHB1dCBpbiBhIHJlYWwgdWZzX2NoZWNrX2Rpcl9lbnRyeSgpICovCisJCQlpZiAoKGRlLT5kX3JlY2xlbiA9PSAwKSB8fCAodWZzX2dldF9kZV9uYW1sZW4oc2IsIGRlKSA9PSAwKSkgeworCQkJCWZpbHAtPmZfcG9zID0gKGZpbHAtPmZfcG9zICYKKwkJCQkgICAgICAgICAgICAgIChzYi0+c19ibG9ja3NpemUgLSAxKSkgKworCQkJCSAgICAgICAgICAgICAgIHNiLT5zX2Jsb2Nrc2l6ZTsKKwkJCQlicmVsc2UoYmgpOworCQkJCXVubG9ja19rZXJuZWwoKTsKKwkJCQlyZXR1cm4gc3RvcmVkOworCQkJfQorCQkJaWYgKCF1ZnNfY2hlY2tfZGlyX2VudHJ5ICgidWZzX3JlYWRkaXIiLCBpbm9kZSwgZGUsCisJCQkJCQkgICBiaCwgb2Zmc2V0KSkgeworCQkJCS8qIE9uIGVycm9yLCBza2lwIHRoZSBmX3BvcyB0byB0aGUKKwkJCQkgICBuZXh0IGJsb2NrLiAqLworCQkJCWZpbHAtPmZfcG9zID0gKGZpbHAtPmZfcG9zIHwKKwkJCQkgICAgICAgICAgICAgIChzYi0+c19ibG9ja3NpemUgLSAxKSkgKworCQkJCQkgICAgICAgMTsKKwkJCQlicmVsc2UgKGJoKTsKKwkJCQl1bmxvY2tfa2VybmVsKCk7CisJCQkJcmV0dXJuIHN0b3JlZDsKKwkJCX0KKwkJCW9mZnNldCArPSBmczE2X3RvX2NwdShzYiwgZGUtPmRfcmVjbGVuKTsKKwkJCWlmIChkZS0+ZF9pbm8pIHsKKwkJCQkvKiBXZSBtaWdodCBibG9jayBpbiB0aGUgbmV4dCBzZWN0aW9uCisJCQkJICogaWYgdGhlIGRhdGEgZGVzdGluYXRpb24gaXMKKwkJCQkgKiBjdXJyZW50bHkgc3dhcHBlZCBvdXQuICBTbywgdXNlIGEKKwkJCQkgKiB2ZXJzaW9uIHN0YW1wIHRvIGRldGVjdCB3aGV0aGVyIG9yCisJCQkJICogbm90IHRoZSBkaXJlY3RvcnkgaGFzIGJlZW4gbW9kaWZpZWQKKwkJCQkgKiBkdXJpbmcgdGhlIGNvcHkgb3BlcmF0aW9uLiAqLworCQkJCXVuc2lnbmVkIGxvbmcgdmVyc2lvbiA9IGZpbHAtPmZfdmVyc2lvbjsKKwkJCQl1bnNpZ25lZCBjaGFyIGRfdHlwZSA9IERUX1VOS05PV047CisKKwkJCQlVRlNEKCgiZmlsbGRpciglcywldSlcbiIsIGRlLT5kX25hbWUsCisJCQkJCQkJZnMzMl90b19jcHUoc2IsIGRlLT5kX2lubykpKQorCQkJCVVGU0QoKCJuYW1sZW4gJXVcbiIsIHVmc19nZXRfZGVfbmFtbGVuKHNiLCBkZSkpKQorCisJCQkJaWYgKChmbGFncyAmIFVGU19ERV9NQVNLKSA9PSBVRlNfREVfNDRCU0QpCisJCQkJCWRfdHlwZSA9IGRlLT5kX3UuZF80NC5kX3R5cGU7CisJCQkJZXJyb3IgPSBmaWxsZGlyKGRpcmVudCwgZGUtPmRfbmFtZSwKKwkJCQkJCXVmc19nZXRfZGVfbmFtbGVuKHNiLCBkZSksIGZpbHAtPmZfcG9zLAorCQkJCQkJZnMzMl90b19jcHUoc2IsIGRlLT5kX2lubyksIGRfdHlwZSk7CisJCQkJaWYgKGVycm9yKQorCQkJCQlicmVhazsKKwkJCQlpZiAodmVyc2lvbiAhPSBmaWxwLT5mX3ZlcnNpb24pCisJCQkJCWdvdG8gcmV2YWxpZGF0ZTsKKwkJCQlzdG9yZWQgKys7CisJCQl9CisJCQlmaWxwLT5mX3BvcyArPSBmczE2X3RvX2NwdShzYiwgZGUtPmRfcmVjbGVuKTsKKwkJfQorCQlvZmZzZXQgPSAwOworCQlicmVsc2UgKGJoKTsKKwl9CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCisvKgorICogZGVmaW5lIGhvdyBmYXIgYWhlYWQgdG8gcmVhZCBkaXJlY3RvcmllcyB3aGlsZSBzZWFyY2hpbmcgdGhlbS4KKyAqLworI2RlZmluZSBOQU1FSV9SQV9DSFVOS1MgIDIKKyNkZWZpbmUgTkFNRUlfUkFfQkxPQ0tTICA0CisjZGVmaW5lIE5BTUVJX1JBX1NJWkUgICAgICAgIChOQU1FSV9SQV9DSFVOS1MgKiBOQU1FSV9SQV9CTE9DS1MpCisjZGVmaW5lIE5BTUVJX1JBX0lOREVYKGMsYikgICgoKGMpICogTkFNRUlfUkFfQkxPQ0tTKSArIChiKSkKKworLyoKKyAqCXVmc19maW5kX2VudHJ5KCkKKyAqCisgKiBmaW5kcyBhbiBlbnRyeSBpbiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSB3aXRoIHRoZSB3YW50ZWQgbmFtZS4gSXQKKyAqIHJldHVybnMgdGhlIGNhY2hlIGJ1ZmZlciBpbiB3aGljaCB0aGUgZW50cnkgd2FzIGZvdW5kLCBhbmQgdGhlIGVudHJ5CisgKiBpdHNlbGYgKGFzIGEgcGFyYW1ldGVyIC0gcmVzX2JoKS4gSXQgZG9lcyBOT1QgcmVhZCB0aGUgaW5vZGUgb2YgdGhlCisgKiBlbnRyeSAtIHlvdSdsbCBoYXZlIHRvIGRvIHRoYXQgeW91cnNlbGYgaWYgeW91IHdhbnQgdG8uCisgKi8KK3N0cnVjdCB1ZnNfZGlyX2VudHJ5ICogdWZzX2ZpbmRfZW50cnkgKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiogcmVzX2JoKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoX3VzZVtOQU1FSV9SQV9TSVpFXTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaF9yZWFkW05BTUVJX1JBX1NJWkVdOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCWludCBibG9jaywgdG9yZWFkLCBpLCBlcnI7CisJc3RydWN0IGlub2RlICpkaXIgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlOworCWNvbnN0IGNoYXIgKm5hbWUgPSBkZW50cnktPmRfbmFtZS5uYW1lOworCWludCBuYW1lbGVuID0gZGVudHJ5LT5kX25hbWUubGVuOworCisJVUZTRCgoIkVOVEVSLCBkaXJfaW5vICVsdSwgbmFtZSAlcywgbmFtbGVuICV1XG4iLCBkaXItPmlfaW5vLCBuYW1lLCBuYW1lbGVuKSkKKwkKKwkqcmVzX2JoID0gTlVMTDsKKwkKKwlzYiA9IGRpci0+aV9zYjsKKwkKKwlpZiAobmFtZWxlbiA+IFVGU19NQVhOQU1MRU4pCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0IChiaF91c2UsIDAsIHNpemVvZiAoYmhfdXNlKSk7CisJdG9yZWFkID0gMDsKKwlmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCBOQU1FSV9SQV9TSVpFOyArK2Jsb2NrKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCisJCWlmICgoYmxvY2sgPDwgc2ItPnNfYmxvY2tzaXplX2JpdHMpID49IGRpci0+aV9zaXplKQorCQkJYnJlYWs7CisJCWJoID0gdWZzX2dldGZyYWcgKGRpciwgYmxvY2ssIDAsICZlcnIpOworCQliaF91c2VbYmxvY2tdID0gYmg7CisJCWlmIChiaCAmJiAhYnVmZmVyX3VwdG9kYXRlKGJoKSkKKwkJCWJoX3JlYWRbdG9yZWFkKytdID0gYmg7CisJfQorCisJZm9yIChibG9jayA9IDAsIG9mZnNldCA9IDA7IG9mZnNldCA8IGRpci0+aV9zaXplOyBibG9jaysrKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCQlzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqIGRlOworCQljaGFyICogZGxpbWl0OworCisJCWlmICgoYmxvY2sgJSBOQU1FSV9SQV9CTE9DS1MpID09IDAgJiYgdG9yZWFkKSB7CisJCQlsbF9yd19ibG9jayAoUkVBRCwgdG9yZWFkLCBiaF9yZWFkKTsKKwkJCXRvcmVhZCA9IDA7CisJCX0KKwkJYmggPSBiaF91c2VbYmxvY2sgJSBOQU1FSV9SQV9TSVpFXTsKKwkJaWYgKCFiaCkgeworCQkJdWZzX2Vycm9yIChzYiwgInVmc19maW5kX2VudHJ5IiwgCisJCQkJImRpcmVjdG9yeSAjJWx1IGNvbnRhaW5zIGEgaG9sZSBhdCBvZmZzZXQgJWx1IiwKKwkJCQlkaXItPmlfaW5vLCBvZmZzZXQpOworCQkJb2Zmc2V0ICs9IHNiLT5zX2Jsb2Nrc2l6ZTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXdhaXRfb25fYnVmZmVyIChiaCk7CisJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQkJLyoKKwkJCSAqIHJlYWQgZXJyb3I6IGFsbCBiZXRzIGFyZSBvZmYKKwkJCSAqLworCQkJYnJlYWs7CisJCX0KKworCQlkZSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKSBiaC0+Yl9kYXRhOworCQlkbGltaXQgPSBiaC0+Yl9kYXRhICsgc2ItPnNfYmxvY2tzaXplOworCQl3aGlsZSAoKGNoYXIgKikgZGUgPCBkbGltaXQgJiYgb2Zmc2V0IDwgZGlyLT5pX3NpemUpIHsKKwkJCS8qIHRoaXMgY29kZSBpcyBleGVjdXRlZCBxdWFkcmF0aWNhbGx5IG9mdGVuICovCisJCQkvKiBkbyBtaW5pbWFsIGNoZWNraW5nIGJ5IGhhbmQgKi8KKwkJCWludCBkZV9sZW47CisKKwkJCWlmICgoY2hhciAqKSBkZSArIG5hbWVsZW4gPD0gZGxpbWl0ICYmCisJCQkgICAgdWZzX21hdGNoKHNiLCBuYW1lbGVuLCBuYW1lLCBkZSkpIHsKKwkJCQkvKiBmb3VuZCBhIG1hdGNoIC0KKwkJCQlqdXN0IHRvIGJlIHN1cmUsIGRvIGEgZnVsbCBjaGVjayAqLworCQkJCWlmICghdWZzX2NoZWNrX2Rpcl9lbnRyeSgidWZzX2ZpbmRfZW50cnkiLAorCQkJCSAgICBkaXIsIGRlLCBiaCwgb2Zmc2V0KSkKKwkJCQkJZ290byBmYWlsZWQ7CisJCQkJZm9yIChpID0gMDsgaSA8IE5BTUVJX1JBX1NJWkU7ICsraSkgeworCQkJCQlpZiAoYmhfdXNlW2ldICE9IGJoKQorCQkJCQkJYnJlbHNlIChiaF91c2VbaV0pOworCQkJCX0KKwkJCQkqcmVzX2JoID0gYmg7CisJCQkJcmV0dXJuIGRlOworCQkJfQorICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJldmVudCBsb29waW5nIG9uIGEgYmFkIGJsb2NrICovCisJCQlkZV9sZW4gPSBmczE2X3RvX2NwdShzYiwgZGUtPmRfcmVjbGVuKTsKKwkJCWlmIChkZV9sZW4gPD0gMCkKKwkJCQlnb3RvIGZhaWxlZDsKKwkJCW9mZnNldCArPSBkZV9sZW47CisJCQlkZSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKSAoKGNoYXIgKikgZGUgKyBkZV9sZW4pOworCQl9CisKKwkJYnJlbHNlIChiaCk7CisJCWlmICgoKGJsb2NrICsgTkFNRUlfUkFfU0laRSkgPDwgc2ItPnNfYmxvY2tzaXplX2JpdHMgKSA+PQorCQkgICAgZGlyLT5pX3NpemUpCisJCQliaCA9IE5VTEw7CisJCWVsc2UKKwkJCWJoID0gdWZzX2dldGZyYWcgKGRpciwgYmxvY2sgKyBOQU1FSV9SQV9TSVpFLCAwLCAmZXJyKTsKKwkJYmhfdXNlW2Jsb2NrICUgTkFNRUlfUkFfU0laRV0gPSBiaDsKKwkJaWYgKGJoICYmICFidWZmZXJfdXB0b2RhdGUoYmgpKQorCQkJYmhfcmVhZFt0b3JlYWQrK10gPSBiaDsKKwl9CisKK2ZhaWxlZDoKKwlmb3IgKGkgPSAwOyBpIDwgTkFNRUlfUkFfU0laRTsgKytpKSBicmVsc2UgKGJoX3VzZVtpXSk7CisJVUZTRCgoIkVYSVRcbiIpKQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50Cit1ZnNfY2hlY2tfZGlyX2VudHJ5IChjb25zdCBjaGFyICpmdW5jdGlvbiwgc3RydWN0IGlub2RlICpkaXIsCisJCSAgICAgc3RydWN0IHVmc19kaXJfZW50cnkgKmRlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBkaXItPmlfc2I7CisJY29uc3QgY2hhciAqZXJyb3JfbXNnID0gTlVMTDsKKwlpbnQgcmxlbiA9IGZzMTZfdG9fY3B1KHNiLCBkZS0+ZF9yZWNsZW4pOworCisJaWYgKHJsZW4gPCBVRlNfRElSX1JFQ19MRU4oMSkpCisJCWVycm9yX21zZyA9ICJyZWNsZW4gaXMgc21hbGxlciB0aGFuIG1pbmltYWwiOworCWVsc2UgaWYgKHJsZW4gJSA0ICE9IDApCisJCWVycm9yX21zZyA9ICJyZWNsZW4gJSA0ICE9IDAiOworCWVsc2UgaWYgKHJsZW4gPCBVRlNfRElSX1JFQ19MRU4odWZzX2dldF9kZV9uYW1sZW4oc2IsIGRlKSkpCisJCWVycm9yX21zZyA9ICJyZWNsZW4gaXMgdG9vIHNtYWxsIGZvciBuYW1sZW4iOworCWVsc2UgaWYgKCgoY2hhciAqKSBkZSAtIGJoLT5iX2RhdGEpICsgcmxlbiA+IGRpci0+aV9zYi0+c19ibG9ja3NpemUpCisJCWVycm9yX21zZyA9ICJkaXJlY3RvcnkgZW50cnkgYWNyb3NzIGJsb2NrcyI7CisJZWxzZSBpZiAoZnMzMl90b19jcHUoc2IsIGRlLT5kX2lubykgPiAoVUZTX1NCKHNiKS0+c191c3BpLT5zX2lwZyAqCisJCQkJICAgICAgVUZTX1NCKHNiKS0+c191c3BpLT5zX25jZykpCisJCWVycm9yX21zZyA9ICJpbm9kZSBvdXQgb2YgYm91bmRzIjsKKworCWlmIChlcnJvcl9tc2cgIT0gTlVMTCkKKwkJdWZzX2Vycm9yIChzYiwgZnVuY3Rpb24sICJiYWQgZW50cnkgaW4gZGlyZWN0b3J5ICMlbHUsIHNpemUgJUx1OiAlcyAtICIKKwkJCSAgICAib2Zmc2V0PSVsdSwgaW5vZGU9JWx1LCByZWNsZW49JWQsIG5hbWxlbj0lZCIsCisJCQkgICAgZGlyLT5pX2lubywgZGlyLT5pX3NpemUsIGVycm9yX21zZywgb2Zmc2V0LAorCQkJICAgICh1bnNpZ25lZCBsb25nKWZzMzJfdG9fY3B1KHNiLCBkZS0+ZF9pbm8pLAorCQkJICAgIHJsZW4sIHVmc19nZXRfZGVfbmFtbGVuKHNiLCBkZSkpOworCQorCXJldHVybiAoZXJyb3JfbXNnID09IE5VTEwgPyAxIDogMCk7Cit9CisKK3N0cnVjdCB1ZnNfZGlyX2VudHJ5ICp1ZnNfZG90ZG90KHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKipwKQoreworCWludCBlcnI7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCA9IHVmc19icmVhZCAoZGlyLCAwLCAwLCAmZXJyKTsKKwlzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqcmVzID0gTlVMTDsKKworCWlmIChiaCkgeworCQlyZXMgPSAoc3RydWN0IHVmc19kaXJfZW50cnkgKikgYmgtPmJfZGF0YTsKKwkJcmVzID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopKChjaGFyICopcmVzICsKKwkJCWZzMTZfdG9fY3B1KGRpci0+aV9zYiwgcmVzLT5kX3JlY2xlbikpOworCX0KKwkqcCA9IGJoOworCXJldHVybiByZXM7Cit9Citpbm9fdCB1ZnNfaW5vZGVfYnlfbmFtZShzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpbm9fdCByZXMgPSAwOworCXN0cnVjdCB1ZnNfZGlyX2VudHJ5ICogZGU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCWRlID0gdWZzX2ZpbmRfZW50cnkgKGRlbnRyeSwgJmJoKTsKKwlpZiAoZGUpIHsKKwkJcmVzID0gZnMzMl90b19jcHUoZGlyLT5pX3NiLCBkZS0+ZF9pbm8pOworCQlicmVsc2UoYmgpOworCX0KKwlyZXR1cm4gcmVzOworfQorCit2b2lkIHVmc19zZXRfbGluayhzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IHVmc19kaXJfZW50cnkgKmRlLAorCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWRpci0+aV92ZXJzaW9uKys7CisJZGUtPmRfaW5vID0gY3B1X3RvX2ZzMzIoZGlyLT5pX3NiLCBpbm9kZS0+aV9pbm8pOworCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwlpZiAoSVNfRElSU1lOQyhkaXIpKQorCQlzeW5jX2RpcnR5X2J1ZmZlcihiaCk7CisJYnJlbHNlIChiaCk7Cit9CisKKy8qCisgKgl1ZnNfYWRkX2VudHJ5KCkKKyAqCisgKiBhZGRzIGEgZmlsZSBlbnRyeSB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeSwgdXNpbmcgdGhlIHNhbWUKKyAqIHNlbWFudGljcyBhcyB1ZnNfZmluZF9lbnRyeSgpLiBJdCByZXR1cm5zIE5VTEwgaWYgaXQgZmFpbGVkLgorICovCitpbnQgdWZzX2FkZF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKKwlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGk7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJdW5zaWduZWQgZnJhZ29mZjsKKwl1bnNpZ25lZCBzaG9ydCByZWNfbGVuOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXN0cnVjdCB1ZnNfZGlyX2VudHJ5ICogZGUsICogZGUxOworCXN0cnVjdCBpbm9kZSAqZGlyID0gZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZTsKKwljb25zdCBjaGFyICpuYW1lID0gZGVudHJ5LT5kX25hbWUubmFtZTsKKwlpbnQgbmFtZWxlbiA9IGRlbnRyeS0+ZF9uYW1lLmxlbjsKKwlpbnQgZXJyOworCisJVUZTRCgoIkVOVEVSLCBuYW1lICVzLCBuYW1lbGVuICV1XG4iLCBuYW1lLCBuYW1lbGVuKSkKKwkKKwlzYiA9IGRpci0+aV9zYjsKKwl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOworCisJaWYgKCFuYW1lbGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwliaCA9IHVmc19icmVhZCAoZGlyLCAwLCAwLCAmZXJyKTsKKwlpZiAoIWJoKQorCQlyZXR1cm4gZXJyOworCXJlY19sZW4gPSBVRlNfRElSX1JFQ19MRU4obmFtZWxlbik7CisJb2Zmc2V0ID0gMDsKKwlkZSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKSBiaC0+Yl9kYXRhOworCXdoaWxlICgxKSB7CisJCWlmICgoY2hhciAqKWRlID49IFVGU19TRUNUT1JfU0laRSArIGJoLT5iX2RhdGEpIHsKKwkJCWZyYWdvZmYgPSBvZmZzZXQgJiB+dXNwaS0+c19mbWFzazsKKwkJCWlmIChmcmFnb2ZmICE9IDAgJiYgZnJhZ29mZiAhPSBVRlNfU0VDVE9SX1NJWkUpCisJCQkJdWZzX2Vycm9yIChzYiwgInVmc19hZGRfZW50cnkiLCAiaW50ZXJuYWwgZXJyb3IiCisJCQkJCSIgZnJhZ29mZiAldSIsIGZyYWdvZmYpOworCQkJaWYgKCFmcmFnb2ZmKSB7CisJCQkJYnJlbHNlIChiaCk7CisJCQkJYmggPSB1ZnNfYnJlYWQgKGRpciwgb2Zmc2V0ID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzLCAxLCAmZXJyKTsKKwkJCQlpZiAoIWJoKQorCQkJCQlyZXR1cm4gZXJyOworCQkJfQorCQkJaWYgKGRpci0+aV9zaXplIDw9IG9mZnNldCkgeworCQkJCWlmIChkaXItPmlfc2l6ZSA9PSAwKSB7CisJCQkJCWJyZWxzZShiaCk7CisJCQkJCXJldHVybiAtRU5PRU5UOworCQkJCX0KKwkJCQlkZSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKSAoYmgtPmJfZGF0YSArIGZyYWdvZmYpOworCQkJCWRlLT5kX2lubyA9IDA7CisJCQkJZGUtPmRfcmVjbGVuID0gY3B1X3RvX2ZzMTYoc2IsIFVGU19TRUNUT1JfU0laRSk7CisJCQkJdWZzX3NldF9kZV9uYW1sZW4oc2IsIGRlLCAwKTsKKwkJCQlkaXItPmlfc2l6ZSA9IG9mZnNldCArIFVGU19TRUNUT1JfU0laRTsKKwkJCQltYXJrX2lub2RlX2RpcnR5KGRpcik7CisJCQl9IGVsc2UgeworCQkJCWRlID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopIGJoLT5iX2RhdGE7CisJCQl9CisJCX0KKwkJaWYgKCF1ZnNfY2hlY2tfZGlyX2VudHJ5ICgidWZzX2FkZF9lbnRyeSIsIGRpciwgZGUsIGJoLCBvZmZzZXQpKSB7CisJCQlicmVsc2UgKGJoKTsKKwkJCXJldHVybiAtRU5PRU5UOworCQl9CisJCWlmICh1ZnNfbWF0Y2goc2IsIG5hbWVsZW4sIG5hbWUsIGRlKSkgeworCQkJYnJlbHNlIChiaCk7CisJCQlyZXR1cm4gLUVFWElTVDsKKwkJfQorCQlpZiAoZGUtPmRfaW5vID09IDAgJiYgZnMxNl90b19jcHUoc2IsIGRlLT5kX3JlY2xlbikgPj0gcmVjX2xlbikKKwkJCWJyZWFrOworCQkJCisJCWlmIChmczE2X3RvX2NwdShzYiwgZGUtPmRfcmVjbGVuKSA+PQorCQkgICAgIFVGU19ESVJfUkVDX0xFTih1ZnNfZ2V0X2RlX25hbWxlbihzYiwgZGUpKSArIHJlY19sZW4pCisJCQlicmVhazsKKwkJb2Zmc2V0ICs9IGZzMTZfdG9fY3B1KHNiLCBkZS0+ZF9yZWNsZW4pOworCQlkZSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKSAoKGNoYXIgKikgZGUgKyBmczE2X3RvX2NwdShzYiwgZGUtPmRfcmVjbGVuKSk7CisJfQorCisJaWYgKGRlLT5kX2lubykgeworCQlkZTEgPSAoc3RydWN0IHVmc19kaXJfZW50cnkgKikgKChjaGFyICopIGRlICsKKwkJCVVGU19ESVJfUkVDX0xFTih1ZnNfZ2V0X2RlX25hbWxlbihzYiwgZGUpKSk7CisJCWRlMS0+ZF9yZWNsZW4gPQorCQkJY3B1X3RvX2ZzMTYoc2IsIGZzMTZfdG9fY3B1KHNiLCBkZS0+ZF9yZWNsZW4pIC0KKwkJCQlVRlNfRElSX1JFQ19MRU4odWZzX2dldF9kZV9uYW1sZW4oc2IsIGRlKSkpOworCQlkZS0+ZF9yZWNsZW4gPQorCQkJY3B1X3RvX2ZzMTYoc2IsIFVGU19ESVJfUkVDX0xFTih1ZnNfZ2V0X2RlX25hbWxlbihzYiwgZGUpKSk7CisJCWRlID0gZGUxOworCX0KKwlkZS0+ZF9pbm8gPSAwOworCXVmc19zZXRfZGVfbmFtbGVuKHNiLCBkZSwgbmFtZWxlbik7CisJbWVtY3B5IChkZS0+ZF9uYW1lLCBuYW1lLCBuYW1lbGVuICsgMSk7CisJZGUtPmRfaW5vID0gY3B1X3RvX2ZzMzIoc2IsIGlub2RlLT5pX2lubyk7CisJdWZzX3NldF9kZV90eXBlKHNiLCBkZSwgaW5vZGUtPmlfbW9kZSk7CisJbWFya19idWZmZXJfZGlydHkoYmgpOworCWlmIChJU19ESVJTWU5DKGRpcikpCisJCXN5bmNfZGlydHlfYnVmZmVyKGJoKTsKKwlicmVsc2UgKGJoKTsKKwlkaXItPmlfbXRpbWUgPSBkaXItPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCWRpci0+aV92ZXJzaW9uKys7CisJbWFya19pbm9kZV9kaXJ0eShkaXIpOworCisJVUZTRCgoIkVYSVRcbiIpKQorCXJldHVybiAwOworfQorCisvKgorICogdWZzX2RlbGV0ZV9lbnRyeSBkZWxldGVzIGEgZGlyZWN0b3J5IGVudHJ5IGJ5IG1lcmdpbmcgaXQgd2l0aCB0aGUKKyAqIHByZXZpb3VzIGVudHJ5LgorICovCitpbnQgdWZzX2RlbGV0ZV9lbnRyeSAoc3RydWN0IGlub2RlICogaW5vZGUsIHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICogZGlyLAorCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoICkKKwkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKKwlzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqIGRlLCAqIHBkZTsKKwl1bnNpZ25lZCBpOworCQorCVVGU0QoKCJFTlRFUlxuIikpCisKKwlzYiA9IGlub2RlLT5pX3NiOworCWkgPSAwOworCXBkZSA9IE5VTEw7CisJZGUgPSAoc3RydWN0IHVmc19kaXJfZW50cnkgKikgYmgtPmJfZGF0YTsKKwkKKwlVRlNEKCgiaW5vICV1LCByZWNsZW4gJXUsIG5hbWxlbiAldSwgbmFtZSAlc1xuIiwKKwkJZnMzMl90b19jcHUoc2IsIGRlLT5kX2lubyksCisJCWZzMTZ0b19jcHUoc2IsIGRlLT5kX3JlY2xlbiksCisJCXVmc19nZXRfZGVfbmFtbGVuKHNiLCBkZSksIGRlLT5kX25hbWUpKQorCisJd2hpbGUgKGkgPCBiaC0+Yl9zaXplKSB7CisJCWlmICghdWZzX2NoZWNrX2Rpcl9lbnRyeSAoInVmc19kZWxldGVfZW50cnkiLCBpbm9kZSwgZGUsIGJoLCBpKSkgeworCQkJYnJlbHNlKGJoKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCWlmIChkZSA9PSBkaXIpICB7CisJCQlpZiAocGRlKQorCQkJCWZzMTZfYWRkKHNiLCAmcGRlLT5kX3JlY2xlbiwKKwkJCQkJZnMxNl90b19jcHUoc2IsIGRpci0+ZF9yZWNsZW4pKTsKKwkJCWRpci0+ZF9pbm8gPSAwOworCQkJaW5vZGUtPmlfdmVyc2lvbisrOworCQkJaW5vZGUtPmlfY3RpbWUgPSBpbm9kZS0+aV9tdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwkJCWlmIChJU19ESVJTWU5DKGlub2RlKSkKKwkJCQlzeW5jX2RpcnR5X2J1ZmZlcihiaCk7CisJCQlicmVsc2UoYmgpOworCQkJVUZTRCgoIkVYSVRcbiIpKQorCQkJcmV0dXJuIDA7CisJCX0KKwkJaSArPSBmczE2X3RvX2NwdShzYiwgZGUtPmRfcmVjbGVuKTsKKwkJaWYgKGkgPT0gVUZTX1NFQ1RPUl9TSVpFKSBwZGUgPSBOVUxMOworCQllbHNlIHBkZSA9IGRlOworCQlkZSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKQorCQkgICAgKChjaGFyICopIGRlICsgZnMxNl90b19jcHUoc2IsIGRlLT5kX3JlY2xlbikpOworCQlpZiAoaSA9PSBVRlNfU0VDVE9SX1NJWkUgJiYgZGUtPmRfcmVjbGVuID09IDApCisJCQlicmVhazsKKwl9CisJVUZTRCgoIkVYSVRcbiIpKQorCWJyZWxzZShiaCk7CisJcmV0dXJuIC1FTk9FTlQ7Cit9CisKK2ludCB1ZnNfbWFrZV9lbXB0eShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGlub2RlICpkaXIpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2IgPSBkaXItPmlfc2I7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogZGlyX2Jsb2NrOworCXN0cnVjdCB1ZnNfZGlyX2VudHJ5ICogZGU7CisJaW50IGVycjsKKworCWRpcl9ibG9jayA9IHVmc19icmVhZCAoaW5vZGUsIDAsIDEsICZlcnIpOworCWlmICghZGlyX2Jsb2NrKQorCQlyZXR1cm4gZXJyOworCisJaW5vZGUtPmlfYmxvY2tzID0gc2ItPnNfYmxvY2tzaXplIC8gVUZTX1NFQ1RPUl9TSVpFOworCWRlID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopIGRpcl9ibG9jay0+Yl9kYXRhOworCWRlLT5kX2lubyA9IGNwdV90b19mczMyKHNiLCBpbm9kZS0+aV9pbm8pOworCXVmc19zZXRfZGVfdHlwZShzYiwgZGUsIGlub2RlLT5pX21vZGUpOworCXVmc19zZXRfZGVfbmFtbGVuKHNiLCBkZSwgMSk7CisJZGUtPmRfcmVjbGVuID0gY3B1X3RvX2ZzMTYoc2IsIFVGU19ESVJfUkVDX0xFTigxKSk7CisJc3RyY3B5IChkZS0+ZF9uYW1lLCAiLiIpOworCWRlID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopCisJCSgoY2hhciAqKWRlICsgZnMxNl90b19jcHUoc2IsIGRlLT5kX3JlY2xlbikpOworCWRlLT5kX2lubyA9IGNwdV90b19mczMyKHNiLCBkaXItPmlfaW5vKTsKKwl1ZnNfc2V0X2RlX3R5cGUoc2IsIGRlLCBkaXItPmlfbW9kZSk7CisJZGUtPmRfcmVjbGVuID0gY3B1X3RvX2ZzMTYoc2IsIFVGU19TRUNUT1JfU0laRSAtIFVGU19ESVJfUkVDX0xFTigxKSk7CisJdWZzX3NldF9kZV9uYW1sZW4oc2IsIGRlLCAyKTsKKwlzdHJjcHkgKGRlLT5kX25hbWUsICIuLiIpOworCW1hcmtfYnVmZmVyX2RpcnR5KGRpcl9ibG9jayk7CisJYnJlbHNlIChkaXJfYmxvY2spOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCXJldHVybiAwOworfQorCisvKgorICogcm91dGluZSB0byBjaGVjayB0aGF0IHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IGlzIGVtcHR5IChmb3Igcm1kaXIpCisgKi8KK2ludCB1ZnNfZW1wdHlfZGlyIChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqIGRlLCAqIGRlMTsKKwlpbnQgZXJyOworCQorCXNiID0gaW5vZGUtPmlfc2I7CisKKwlpZiAoaW5vZGUtPmlfc2l6ZSA8IFVGU19ESVJfUkVDX0xFTigxKSArIFVGU19ESVJfUkVDX0xFTigyKSB8fAorCSAgICAhKGJoID0gdWZzX2JyZWFkIChpbm9kZSwgMCwgMCwgJmVycikpKSB7CisJICAgIAl1ZnNfd2FybmluZyAoaW5vZGUtPmlfc2IsICJlbXB0eV9kaXIiLAorCQkJICAgICAgImJhZCBkaXJlY3RvcnkgKGRpciAjJWx1KSAtIG5vIGRhdGEgYmxvY2siLAorCQkJICAgICAgaW5vZGUtPmlfaW5vKTsKKwkJcmV0dXJuIDE7CisJfQorCWRlID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopIGJoLT5iX2RhdGE7CisJZGUxID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopCisJCSgoY2hhciAqKWRlICsgZnMxNl90b19jcHUoc2IsIGRlLT5kX3JlY2xlbikpOworCWlmIChmczMyX3RvX2NwdShzYiwgZGUtPmRfaW5vKSAhPSBpbm9kZS0+aV9pbm8gfHwgZGUxLT5kX2lubyA9PSAwIHx8CisJICAgICBzdHJjbXAgKCIuIiwgZGUtPmRfbmFtZSkgfHwgc3RyY21wICgiLi4iLCBkZTEtPmRfbmFtZSkpIHsKKwkgICAgCXVmc193YXJuaW5nIChpbm9kZS0+aV9zYiwgImVtcHR5X2RpciIsCisJCQkgICAgICAiYmFkIGRpcmVjdG9yeSAoZGlyICMlbHUpIC0gbm8gYC4nIG9yIGAuLiciLAorCQkJICAgICAgaW5vZGUtPmlfaW5vKTsKKwkJcmV0dXJuIDE7CisJfQorCW9mZnNldCA9IGZzMTZfdG9fY3B1KHNiLCBkZS0+ZF9yZWNsZW4pICsgZnMxNl90b19jcHUoc2IsIGRlMS0+ZF9yZWNsZW4pOworCWRlID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopCisJCSgoY2hhciAqKWRlMSArIGZzMTZfdG9fY3B1KHNiLCBkZTEtPmRfcmVjbGVuKSk7CisJd2hpbGUgKG9mZnNldCA8IGlub2RlLT5pX3NpemUgKSB7CisJCWlmICghYmggfHwgKHZvaWQgKikgZGUgPj0gKHZvaWQgKikgKGJoLT5iX2RhdGEgKyBzYi0+c19ibG9ja3NpemUpKSB7CisJCQlicmVsc2UgKGJoKTsKKwkJCWJoID0gdWZzX2JyZWFkIChpbm9kZSwgb2Zmc2V0ID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzLCAxLCAmZXJyKTsKKwkgCQlpZiAoIWJoKSB7CisJCQkJdWZzX2Vycm9yIChzYiwgImVtcHR5X2RpciIsCisJCQkJCSAgICAiZGlyZWN0b3J5ICMlbHUgY29udGFpbnMgYSBob2xlIGF0IG9mZnNldCAlbHUiLAorCQkJCQkgICAgaW5vZGUtPmlfaW5vLCBvZmZzZXQpOworCQkJCW9mZnNldCArPSBzYi0+c19ibG9ja3NpemU7CisJCQkJY29udGludWU7CisJCQl9CisJCQlkZSA9IChzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqKSBiaC0+Yl9kYXRhOworCQl9CisJCWlmICghdWZzX2NoZWNrX2Rpcl9lbnRyeSAoImVtcHR5X2RpciIsIGlub2RlLCBkZSwgYmgsIG9mZnNldCkpIHsKKwkJCWJyZWxzZSAoYmgpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKGRlLT5kX2lubykgeworCQkJYnJlbHNlIChiaCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlvZmZzZXQgKz0gZnMxNl90b19jcHUoc2IsIGRlLT5kX3JlY2xlbik7CisJCWRlID0gKHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICopCisJCQkoKGNoYXIgKilkZSArIGZzMTZfdG9fY3B1KHNiLCBkZS0+ZF9yZWNsZW4pKTsKKwl9CisJYnJlbHNlIChiaCk7CisJcmV0dXJuIDE7Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgdWZzX2Rpcl9vcGVyYXRpb25zID0geworCS5yZWFkCQk9IGdlbmVyaWNfcmVhZF9kaXIsCisJLnJlYWRkaXIJPSB1ZnNfcmVhZGRpciwKKwkuZnN5bmMJCT0gZmlsZV9mc3luYywKK307CmRpZmYgLS1naXQgYS9mcy91ZnMvZmlsZS5jIGIvZnMvdWZzL2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDY5ZDdmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvdWZzL2ZpbGUuYwpAQCAtMCwwICsxLDU1IEBACisvKgorICogIGxpbnV4L2ZzL3Vmcy9maWxlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgKKyAqIERhbmllbCBQaXJrbCA8ZGFuaWVsLnBpcmtsQGVtYWlsLmN6PgorICogQ2hhcmxlcyBVbml2ZXJzaXR5LCBGYWN1bHR5IG9mIE1hdGhlbWF0aWNzIGFuZCBQaHlzaWNzCisgKgorICogIGZyb20KKyAqCisgKiAgbGludXgvZnMvZXh0Mi9maWxlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUKKyAqIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKKyAqIExhYm9yYXRvaXJlIE1BU0kgLSBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogIGZyb20KKyAqCisgKiAgbGludXgvZnMvbWluaXgvZmlsZS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgZXh0MiBmcyByZWd1bGFyIGZpbGUgaGFuZGxpbmcgcHJpbWl0aXZlcworICovCisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC91ZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKworLyoKKyAqIFdlIGhhdmUgbW9zdGx5IE5VTEwncyBoZXJlOiB0aGUgY3VycmVudCBkZWZhdWx0cyBhcmUgb2sgZm9yCisgKiB0aGUgdWZzIGZpbGVzeXN0ZW0uCisgKi8KKyAKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgdWZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCisJLnJlYWQJCT0gZ2VuZXJpY19maWxlX3JlYWQsCisJLndyaXRlCQk9IGdlbmVyaWNfZmlsZV93cml0ZSwKKwkubW1hcAkJPSBnZW5lcmljX2ZpbGVfbW1hcCwKKwkub3BlbiAgICAgICAgICAgPSBnZW5lcmljX2ZpbGVfb3BlbiwKKwkuc2VuZGZpbGUJPSBnZW5lcmljX2ZpbGVfc2VuZGZpbGUsCit9OworCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyB1ZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zID0geworCS50cnVuY2F0ZQk9IHVmc190cnVuY2F0ZSwKK307CmRpZmYgLS1naXQgYS9mcy91ZnMvaWFsbG9jLmMgYi9mcy91ZnMvaWFsbG9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFhNmIxNQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3Vmcy9pYWxsb2MuYwpAQCAtMCwwICsxLDMwMiBAQAorLyoKKyAqICBsaW51eC9mcy91ZnMvaWFsbG9jLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTgKKyAqIERhbmllbCBQaXJrbCA8ZGFuaWVsLnBpcmtsQGVtYWlsLmN6PgorICogQ2hhcmxlcyBVbml2ZXJzaXR5LCBGYWN1bHR5IG9mIE1hdGhlbWF0aWNzIGFuZCBQaHlzaWNzCisgKgorICogIGZyb20KKyAqCisgKiAgbGludXgvZnMvZXh0Mi9pYWxsb2MuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NQorICogUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQorICogTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqCisgKiAgQlNEIHVmcy1pbnNwaXJlZCBpbm9kZSBhbmQgZGlyZWN0b3J5IGFsbG9jYXRpb24gYnkgCisgKiAgU3RlcGhlbiBUd2VlZGllIChzY3RAZGNzLmVkLmFjLnVrKSwgMTk5MworICogIEJpZy1lbmRpYW4gdG8gbGl0dGxlLWVuZGlhbiBieXRlLXN3YXBwaW5nL2JpdG1hcHMgYnkKKyAqICAgICAgICBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXAucnV0Z2Vycy5lZHUpLCAxOTk1CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdWZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9xdW90YW9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpbmNsdWRlICJzd2FiLmgiCisjaW5jbHVkZSAidXRpbC5oIgorCisjdW5kZWYgVUZTX0lBTExPQ19ERUJVRworCisjaWZkZWYgVUZTX0lBTExPQ19ERUJVRworI2RlZmluZSBVRlNEKHgpIHByaW50aygiKCVzLCAlZCksICVzOiAiLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fRlVOQ1RJT05fXyk7IHByaW50ayB4OworI2Vsc2UKKyNkZWZpbmUgVUZTRCh4KQorI2VuZGlmCisKKy8qCisgKiBOT1RFISBXaGVuIHdlIGdldCB0aGUgaW5vZGUsIHdlJ3JlIHRoZSBvbmx5IHBlb3BsZQorICogdGhhdCBoYXZlIGFjY2VzcyB0byBpdCwgYW5kIGFzIHN1Y2ggdGhlcmUgYXJlIG5vCisgKiByYWNlIGNvbmRpdGlvbnMgd2UgaGF2ZSB0byB3b3JyeSBhYm91dC4gVGhlIGlub2RlCisgKiBpcyBub3Qgb24gdGhlIGhhc2gtbGlzdHMsIGFuZCBpdCBjYW5ub3QgYmUgcmVhY2hlZAorICogdGhyb3VnaCB0aGUgZmlsZXN5c3RlbSBiZWNhdXNlIHRoZSBkaXJlY3RvcnkgZW50cnkKKyAqIGhhcyBiZWVuIGRlbGV0ZWQgZWFybGllci4KKyAqCisgKiBIT1dFVkVSOiB3ZSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHdlIGdldCBubyBhbGlhc2VzLAorICogd2hpY2ggbWVhbnMgdGhhdCB3ZSBoYXZlIHRvIGNhbGwgImNsZWFyX2lub2RlKCkiCisgKiBfYmVmb3JlXyB3ZSBtYXJrIHRoZSBpbm9kZSBub3QgaW4gdXNlIGluIHRoZSBpbm9kZQorICogYml0bWFwcy4gT3RoZXJ3aXNlIGEgbmV3bHkgY3JlYXRlZCBmaWxlIG1pZ2h0IHVzZQorICogdGhlIHNhbWUgaW5vZGUgbnVtYmVyIChub3QgYWN0dWFsbHkgdGhlIHNhbWUgcG9pbnRlcgorICogdGhvdWdoKSwgYW5kIHRoZW4gd2UnZCBoYXZlIHR3byBpbm9kZXMgc2hhcmluZyB0aGUKKyAqIHNhbWUgaW5vZGUgbnVtYmVyIGFuZCBzcGFjZSBvbiB0aGUgaGFyZGRpc2suCisgKi8KK3ZvaWQgdWZzX2ZyZWVfaW5vZGUgKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiOworCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaTsKKwlzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX2ZpcnN0ICogdXNiMTsKKwlzdHJ1Y3QgdWZzX2NnX3ByaXZhdGVfaW5mbyAqIHVjcGk7CisJc3RydWN0IHVmc19jeWxpbmRlcl9ncm91cCAqIHVjZzsKKwlpbnQgaXNfZGlyZWN0b3J5OworCXVuc2lnbmVkIGlubywgY2csIGJpdDsKKwkKKwlVRlNEKCgiRU5URVIsIGlubyAlbHVcbiIsIGlub2RlLT5pX2lubykpCisKKwlzYiA9IGlub2RlLT5pX3NiOworCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CisJdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KFVTUElfVUJIKTsKKwkKKwlpbm8gPSBpbm9kZS0+aV9pbm87CisKKwlsb2NrX3N1cGVyIChzYik7CisKKwlpZiAoISgoaW5vID4gMSkgJiYgKGlubyA8ICh1c3BpLT5zX25jZyAqIHVzcGktPnNfaXBnICkpKSkgeworCQl1ZnNfd2FybmluZyhzYiwgInVmc19mcmVlX2lub2RlIiwgInJlc2VydmVkIGlub2RlIG9yIG5vbmV4aXN0ZW50IGlub2RlICV1XG4iLCBpbm8pOworCQl1bmxvY2tfc3VwZXIgKHNiKTsKKwkJcmV0dXJuOworCX0KKwkKKwljZyA9IHVmc19pbm90b2NnIChpbm8pOworCWJpdCA9IHVmc19pbm90b2Nnb2ZmIChpbm8pOworCXVjcGkgPSB1ZnNfbG9hZF9jeWxpbmRlciAoc2IsIGNnKTsKKwlpZiAoIXVjcGkpIHsKKwkJdW5sb2NrX3N1cGVyIChzYik7CisJCXJldHVybjsKKwl9CisJdWNnID0gdWJoX2dldF91Y2coVUNQSV9VQkgpOworCWlmICghdWZzX2NnX2Noa21hZ2ljKHNiLCB1Y2cpKQorCQl1ZnNfcGFuaWMgKHNiLCAidWZzX2ZyZWVfZnJhZ21lbnRzIiwgImludGVybmFsIGVycm9yLCBiYWQgY2cgbWFnaWMgbnVtYmVyIik7CisKKwl1Y2ctPmNnX3RpbWUgPSBjcHVfdG9fZnMzMihzYiwgZ2V0X3NlY29uZHMoKSk7CisKKwlpc19kaXJlY3RvcnkgPSBTX0lTRElSKGlub2RlLT5pX21vZGUpOworCisJRFFVT1RfRlJFRV9JTk9ERShpbm9kZSk7CisJRFFVT1RfRFJPUChpbm9kZSk7CisKKwljbGVhcl9pbm9kZSAoaW5vZGUpOworCisJaWYgKHViaF9pc2NsciAoVUNQSV9VQkgsIHVjcGktPmNfaXVzZWRvZmYsIGJpdCkpCisJCXVmc19lcnJvcihzYiwgInVmc19mcmVlX2lub2RlIiwgImJpdCBhbHJlYWR5IGNsZWFyZWQgZm9yIGlub2RlICV1IiwgaW5vKTsKKwllbHNlIHsKKwkJdWJoX2NscmJpdCAoVUNQSV9VQkgsIHVjcGktPmNfaXVzZWRvZmYsIGJpdCk7CisJCWlmIChpbm8gPCB1Y3BpLT5jX2lyb3RvcikKKwkJCXVjcGktPmNfaXJvdG9yID0gaW5vOworCQlmczMyX2FkZChzYiwgJnVjZy0+Y2dfY3MuY3NfbmlmcmVlLCAxKTsKKwkJZnMzMl9hZGQoc2IsICZ1c2IxLT5mc19jc3RvdGFsLmNzX25pZnJlZSwgMSk7CisJCWZzMzJfYWRkKHNiLCAmVUZTX1NCKHNiKS0+ZnNfY3MoY2cpLmNzX25pZnJlZSwgMSk7CisKKwkJaWYgKGlzX2RpcmVjdG9yeSkgeworCQkJZnMzMl9zdWIoc2IsICZ1Y2ctPmNnX2NzLmNzX25kaXIsIDEpOworCQkJZnMzMl9zdWIoc2IsICZ1c2IxLT5mc19jc3RvdGFsLmNzX25kaXIsIDEpOworCQkJZnMzMl9zdWIoc2IsICZVRlNfU0Ioc2IpLT5mc19jcyhjZykuY3NfbmRpciwgMSk7CisJCX0KKwl9CisKKwl1YmhfbWFya19idWZmZXJfZGlydHkgKFVTUElfVUJIKTsKKwl1YmhfbWFya19idWZmZXJfZGlydHkgKFVDUElfVUJIKTsKKwlpZiAoc2ItPnNfZmxhZ3MgJiBNU19TWU5DSFJPTk9VUykgeworCQl1Ymhfd2FpdF9vbl9idWZmZXIgKFVDUElfVUJIKTsKKwkJdWJoX2xsX3J3X2Jsb2NrIChXUklURSwgMSwgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiopICZ1Y3BpKTsKKwkJdWJoX3dhaXRfb25fYnVmZmVyIChVQ1BJX1VCSCk7CisJfQorCQorCXNiLT5zX2RpcnQgPSAxOworCXVubG9ja19zdXBlciAoc2IpOworCVVGU0QoKCJFWElUXG4iKSkKK30KKworLyoKKyAqIFRoZXJlIGFyZSB0d28gcG9saWNpZXMgZm9yIGFsbG9jYXRpbmcgYW4gaW5vZGUuICBJZiB0aGUgbmV3IGlub2RlIGlzCisgKiBhIGRpcmVjdG9yeSwgdGhlbiBhIGZvcndhcmQgc2VhcmNoIGlzIG1hZGUgZm9yIGEgYmxvY2sgZ3JvdXAgd2l0aCBib3RoCisgKiBmcmVlIHNwYWNlIGFuZCBhIGxvdyBkaXJlY3RvcnktdG8taW5vZGUgcmF0aW87IGlmIHRoYXQgZmFpbHMsIHRoZW4gb2YKKyAqIHRoZSBncm91cHMgd2l0aCBhYm92ZS1hdmVyYWdlIGZyZWUgc3BhY2UsIHRoYXQgZ3JvdXAgd2l0aCB0aGUgZmV3ZXN0CisgKiBkaXJlY3RvcmllcyBhbHJlYWR5IGlzIGNob3Nlbi4KKyAqCisgKiBGb3Igb3RoZXIgaW5vZGVzLCBzZWFyY2ggZm9yd2FyZCBmcm9tIHRoZSBwYXJlbnQgZGlyZWN0b3J5J3MgYmxvY2sKKyAqIGdyb3VwIHRvIGZpbmQgYSBmcmVlIGlub2RlLgorICovCitzdHJ1Y3QgaW5vZGUgKiB1ZnNfbmV3X2lub2RlKHN0cnVjdCBpbm9kZSAqIGRpciwgaW50IG1vZGUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJc3RydWN0IHVmc19zYl9pbmZvICogc2JpOworCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaTsKKwlzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX2ZpcnN0ICogdXNiMTsKKwlzdHJ1Y3QgdWZzX2NnX3ByaXZhdGVfaW5mbyAqIHVjcGk7CisJc3RydWN0IHVmc19jeWxpbmRlcl9ncm91cCAqIHVjZzsKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZTsKKwl1bnNpZ25lZCBjZywgYml0LCBpLCBqLCBzdGFydDsKKwlzdHJ1Y3QgdWZzX2lub2RlX2luZm8gKnVmc2k7CisKKwlVRlNEKCgiRU5URVJcbiIpKQorCQorCS8qIENhbm5vdCBjcmVhdGUgZmlsZXMgaW4gYSBkZWxldGVkIGRpcmVjdG9yeSAqLworCWlmICghZGlyIHx8ICFkaXItPmlfbmxpbmspCisJCXJldHVybiBFUlJfUFRSKC1FUEVSTSk7CisJc2IgPSBkaXItPmlfc2I7CisJaW5vZGUgPSBuZXdfaW5vZGUoc2IpOworCWlmICghaW5vZGUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCXVmc2kgPSBVRlNfSShpbm9kZSk7CisJc2JpID0gVUZTX1NCKHNiKTsKKwl1c3BpID0gc2JpLT5zX3VzcGk7CisJdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KFVTUElfVUJIKTsKKworCWxvY2tfc3VwZXIgKHNiKTsKKworCS8qCisJICogVHJ5IHRvIHBsYWNlIHRoZSBpbm9kZSBpbiBpdHMgcGFyZW50IGRpcmVjdG9yeQorCSAqLworCWkgPSB1ZnNfaW5vdG9jZyhkaXItPmlfaW5vKTsKKwlpZiAoc2JpLT5mc19jcyhpKS5jc19uaWZyZWUpIHsKKwkJY2cgPSBpOworCQlnb3RvIGNnX2ZvdW5kOworCX0KKworCS8qCisJICogVXNlIGEgcXVhZHJhdGljIGhhc2ggdG8gZmluZCBhIGdyb3VwIHdpdGggYSBmcmVlIGlub2RlCisJICovCisJZm9yICggaiA9IDE7IGogPCB1c3BpLT5zX25jZzsgaiA8PD0gMSApIHsKKwkJaSArPSBqOworCQlpZiAoaSA+PSB1c3BpLT5zX25jZykKKwkJCWkgLT0gdXNwaS0+c19uY2c7CisJCWlmIChzYmktPmZzX2NzKGkpLmNzX25pZnJlZSkgeworCQkJY2cgPSBpOworCQkJZ290byBjZ19mb3VuZDsKKwkJfQorCX0KKworCS8qCisJICogVGhhdCBmYWlsZWQ6IHRyeSBsaW5lYXIgc2VhcmNoIGZvciBhIGZyZWUgaW5vZGUKKwkgKi8KKwlpID0gdWZzX2lub3RvY2coZGlyLT5pX2lubykgKyAxOworCWZvciAoaiA9IDI7IGogPCB1c3BpLT5zX25jZzsgaisrKSB7CisJCWkrKzsKKwkJaWYgKGkgPj0gdXNwaS0+c19uY2cpCisJCQlpID0gMDsKKwkJaWYgKHNiaS0+ZnNfY3MoaSkuY3NfbmlmcmVlKSB7CisJCQljZyA9IGk7CisJCQlnb3RvIGNnX2ZvdW5kOworCQl9CisJfQorCQorCWdvdG8gZmFpbGVkOworCitjZ19mb3VuZDoKKwl1Y3BpID0gdWZzX2xvYWRfY3lsaW5kZXIgKHNiLCBjZyk7CisJaWYgKCF1Y3BpKQorCQlnb3RvIGZhaWxlZDsKKwl1Y2cgPSB1YmhfZ2V0X3VjZyhVQ1BJX1VCSCk7CisJaWYgKCF1ZnNfY2dfY2hrbWFnaWMoc2IsIHVjZykpIAorCQl1ZnNfcGFuaWMgKHNiLCAidWZzX25ld19pbm9kZSIsICJpbnRlcm5hbCBlcnJvciwgYmFkIGNnIG1hZ2ljIG51bWJlciIpOworCisJc3RhcnQgPSB1Y3BpLT5jX2lyb3RvcjsKKwliaXQgPSB1YmhfZmluZF9uZXh0X3plcm9fYml0IChVQ1BJX1VCSCwgdWNwaS0+Y19pdXNlZG9mZiwgdXNwaS0+c19pcGcsIHN0YXJ0KTsKKwlpZiAoIShiaXQgPCB1c3BpLT5zX2lwZykpIHsKKwkJYml0ID0gdWJoX2ZpbmRfZmlyc3RfemVyb19iaXQgKFVDUElfVUJILCB1Y3BpLT5jX2l1c2Vkb2ZmLCBzdGFydCk7CisJCWlmICghKGJpdCA8IHN0YXJ0KSkgeworCQkJdWZzX2Vycm9yIChzYiwgInVmc19uZXdfaW5vZGUiLAorCQkJICAgICJjeWxpbmRlciBncm91cCAldSBjb3JydXB0ZWQgLSBlcnJvciBpbiBpbm9kZSBiaXRtYXBcbiIsIGNnKTsKKwkJCWdvdG8gZmFpbGVkOworCQl9CisJfQorCVVGU0QoKCJzdGFydCA9ICV1LCBiaXQgPSAldSwgaXBnID0gJXVcbiIsIHN0YXJ0LCBiaXQsIHVzcGktPnNfaXBnKSkKKwlpZiAodWJoX2lzY2xyIChVQ1BJX1VCSCwgdWNwaS0+Y19pdXNlZG9mZiwgYml0KSkKKwkJdWJoX3NldGJpdCAoVUNQSV9VQkgsIHVjcGktPmNfaXVzZWRvZmYsIGJpdCk7CisJZWxzZSB7CisJCXVmc19wYW5pYyAoc2IsICJ1ZnNfbmV3X2lub2RlIiwgImludGVybmFsIGVycm9yIik7CisJCWdvdG8gZmFpbGVkOworCX0KKwkKKwlmczMyX3N1YihzYiwgJnVjZy0+Y2dfY3MuY3NfbmlmcmVlLCAxKTsKKwlmczMyX3N1YihzYiwgJnVzYjEtPmZzX2NzdG90YWwuY3NfbmlmcmVlLCAxKTsKKwlmczMyX3N1YihzYiwgJnNiaS0+ZnNfY3MoY2cpLmNzX25pZnJlZSwgMSk7CisJCisJaWYgKFNfSVNESVIobW9kZSkpIHsKKwkJZnMzMl9hZGQoc2IsICZ1Y2ctPmNnX2NzLmNzX25kaXIsIDEpOworCQlmczMyX2FkZChzYiwgJnVzYjEtPmZzX2NzdG90YWwuY3NfbmRpciwgMSk7CisJCWZzMzJfYWRkKHNiLCAmc2JpLT5mc19jcyhjZykuY3NfbmRpciwgMSk7CisJfQorCisJdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVU1BJX1VCSCk7CisJdWJoX21hcmtfYnVmZmVyX2RpcnR5IChVQ1BJX1VCSCk7CisJaWYgKHNiLT5zX2ZsYWdzICYgTVNfU1lOQ0hST05PVVMpIHsKKwkJdWJoX3dhaXRfb25fYnVmZmVyIChVQ1BJX1VCSCk7CisJCXViaF9sbF9yd19ibG9jayAoV1JJVEUsIDEsIChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICoqKSAmdWNwaSk7CisJCXViaF93YWl0X29uX2J1ZmZlciAoVUNQSV9VQkgpOworCX0KKwlzYi0+c19kaXJ0ID0gMTsKKworCWlub2RlLT5pX21vZGUgPSBtb2RlOworCWlub2RlLT5pX3VpZCA9IGN1cnJlbnQtPmZzdWlkOworCWlmIChkaXItPmlfbW9kZSAmIFNfSVNHSUQpIHsKKwkJaW5vZGUtPmlfZ2lkID0gZGlyLT5pX2dpZDsKKwkJaWYgKFNfSVNESVIobW9kZSkpCisJCQlpbm9kZS0+aV9tb2RlIHw9IFNfSVNHSUQ7CisJfSBlbHNlCisJCWlub2RlLT5pX2dpZCA9IGN1cnJlbnQtPmZzZ2lkOworCisJaW5vZGUtPmlfaW5vID0gY2cgKiB1c3BpLT5zX2lwZyArIGJpdDsKKwlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9TSVpFOwkvKiBUaGlzIGlzIHRoZSBvcHRpbWFsIElPIHNpemUgKGZvciBzdGF0KSwgbm90IHRoZSBmcyBibG9jayBzaXplICovCisJaW5vZGUtPmlfYmxvY2tzID0gMDsKKwlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCXVmc2ktPmlfZmxhZ3MgPSBVRlNfSShkaXIpLT5pX2ZsYWdzOworCXVmc2ktPmlfbGFzdGZyYWcgPSAwOworCXVmc2ktPmlfZ2VuID0gMDsKKwl1ZnNpLT5pX3NoYWRvdyA9IDA7CisJdWZzaS0+aV9vc3luYyA9IDA7CisJdWZzaS0+aV9vZWZ0ZmxhZyA9IDA7CisJbWVtc2V0KCZ1ZnNpLT5pX3UxLCAwLCBzaXplb2YodWZzaS0+aV91MSkpOworCisJaW5zZXJ0X2lub2RlX2hhc2goaW5vZGUpOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCisJdW5sb2NrX3N1cGVyIChzYik7CisKKwlpZiAoRFFVT1RfQUxMT0NfSU5PREUoaW5vZGUpKSB7CisJCURRVU9UX0RST1AoaW5vZGUpOworCQlpbm9kZS0+aV9mbGFncyB8PSBTX05PUVVPVEE7CisJCWlub2RlLT5pX25saW5rID0gMDsKKwkJaXB1dChpbm9kZSk7CisJCXJldHVybiBFUlJfUFRSKC1FRFFVT1QpOworCX0KKworCVVGU0QoKCJhbGxvY2F0aW5nIGlub2RlICVsdVxuIiwgaW5vZGUtPmlfaW5vKSkKKwlVRlNEKCgiRVhJVFxuIikpCisJcmV0dXJuIGlub2RlOworCitmYWlsZWQ6CisJdW5sb2NrX3N1cGVyIChzYik7CisJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCWlwdXQgKGlub2RlKTsKKwlVRlNEKCgiRVhJVCAoRkFJTEVEKVxuIikpCisJcmV0dXJuIEVSUl9QVFIoLUVOT1NQQyk7Cit9CmRpZmYgLS1naXQgYS9mcy91ZnMvaW5vZGUuYyBiL2ZzL3Vmcy9pbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxODYyN2MKLS0tIC9kZXYvbnVsbAorKysgYi9mcy91ZnMvaW5vZGUuYwpAQCAtMCwwICsxLDgxNiBAQAorLyoKKyAqICBsaW51eC9mcy91ZnMvaW5vZGUuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5OAorICogRGFuaWVsIFBpcmtsIDxkYW5pZWwucGlya2xAZW1haWwuY3o+CisgKiBDaGFybGVzIFVuaXZlcnNpdHksIEZhY3VsdHkgb2YgTWF0aGVtYXRpY3MgYW5kIFBoeXNpY3MKKyAqCisgKiAgZnJvbQorICoKKyAqICBsaW51eC9mcy9leHQyL2lub2RlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUKKyAqIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKKyAqIExhYm9yYXRvaXJlIE1BU0kgLSBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogIGZyb20KKyAqCisgKiAgbGludXgvZnMvbWluaXgvaW5vZGUuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKgorICogIEdvYWwtZGlyZWN0ZWQgYmxvY2sgYWxsb2NhdGlvbiBieSBTdGVwaGVuIFR3ZWVkaWUgKHNjdEBkY3MuZWQuYWMudWspLCAxOTkzCisgKiAgQmlnLWVuZGlhbiB0byBsaXR0bGUtZW5kaWFuIGJ5dGUtc3dhcHBpbmcvYml0bWFwcyBieQorICogICAgICAgIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSksIDE5OTUKKyAqLworCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdWZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKworI2luY2x1ZGUgInN3YWIuaCIKKyNpbmNsdWRlICJ1dGlsLmgiCisKKyN1bmRlZiBVRlNfSU5PREVfREVCVUcKKyN1bmRlZiBVRlNfSU5PREVfREVCVUdfTU9SRQorCisjaWZkZWYgVUZTX0lOT0RFX0RFQlVHCisjZGVmaW5lIFVGU0QoeCkgcHJpbnRrKCIoJXMsICVkKSwgJXM6ICIsIF9fRklMRV9fLCBfX0xJTkVfXywgX19GVU5DVElPTl9fKTsgcHJpbnRrIHg7CisjZWxzZQorI2RlZmluZSBVRlNEKHgpCisjZW5kaWYKKworc3RhdGljIGludCB1ZnNfYmxvY2tfdG9fcGF0aChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBpX2Jsb2NrLCBzZWN0b3JfdCBvZmZzZXRzWzRdKQoreworCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICp1c3BpID0gVUZTX1NCKGlub2RlLT5pX3NiKS0+c191c3BpOworCWludCBwdHJzID0gdXNwaS0+c19hcGI7CisJaW50IHB0cnNfYml0cyA9IHVzcGktPnNfYXBic2hpZnQ7CisJY29uc3QgbG9uZyBkaXJlY3RfYmxvY2tzID0gVUZTX05EQUREUiwKKwkJaW5kaXJlY3RfYmxvY2tzID0gcHRycywKKwkJZG91YmxlX2Jsb2NrcyA9ICgxIDw8IChwdHJzX2JpdHMgKiAyKSk7CisJaW50IG4gPSAwOworCisKKwlVRlNEKCgicHRycz11c3BpLT5zX2FwYiA9ICVkLGRvdWJsZV9ibG9ja3M9JWQgXG4iLHB0cnMsZG91YmxlX2Jsb2NrcykpOworCWlmIChpX2Jsb2NrIDwgMCkgeworCQl1ZnNfd2FybmluZyhpbm9kZS0+aV9zYiwgInVmc19ibG9ja190b19wYXRoIiwgImJsb2NrIDwgMCIpOworCX0gZWxzZSBpZiAoaV9ibG9jayA8IGRpcmVjdF9ibG9ja3MpIHsKKwkJb2Zmc2V0c1tuKytdID0gaV9ibG9jazsKKwl9IGVsc2UgaWYgKChpX2Jsb2NrIC09IGRpcmVjdF9ibG9ja3MpIDwgaW5kaXJlY3RfYmxvY2tzKSB7CisJCW9mZnNldHNbbisrXSA9IFVGU19JTkRfQkxPQ0s7CisJCW9mZnNldHNbbisrXSA9IGlfYmxvY2s7CisJfSBlbHNlIGlmICgoaV9ibG9jayAtPSBpbmRpcmVjdF9ibG9ja3MpIDwgZG91YmxlX2Jsb2NrcykgeworCQlvZmZzZXRzW24rK10gPSBVRlNfRElORF9CTE9DSzsKKwkJb2Zmc2V0c1tuKytdID0gaV9ibG9jayA+PiBwdHJzX2JpdHM7CisJCW9mZnNldHNbbisrXSA9IGlfYmxvY2sgJiAocHRycyAtIDEpOworCX0gZWxzZSBpZiAoKChpX2Jsb2NrIC09IGRvdWJsZV9ibG9ja3MpID4+IChwdHJzX2JpdHMgKiAyKSkgPCBwdHJzKSB7CisJCW9mZnNldHNbbisrXSA9IFVGU19USU5EX0JMT0NLOworCQlvZmZzZXRzW24rK10gPSBpX2Jsb2NrID4+IChwdHJzX2JpdHMgKiAyKTsKKwkJb2Zmc2V0c1tuKytdID0gKGlfYmxvY2sgPj4gcHRyc19iaXRzKSAmIChwdHJzIC0gMSk7CisJCW9mZnNldHNbbisrXSA9IGlfYmxvY2sgJiAocHRycyAtIDEpOworCX0gZWxzZSB7CisJCXVmc193YXJuaW5nKGlub2RlLT5pX3NiLCAidWZzX2Jsb2NrX3RvX3BhdGgiLCAiYmxvY2sgPiBiaWciKTsKKwl9CisJcmV0dXJuIG47Cit9CisKKy8qCisgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgZnJhZ21lbnQgZnJvbQorICogdGhlIGJlZ2luaW5nIG9mIHRoZSBmaWxlc3lzdGVtLgorICovCisKK3U2NCAgdWZzX2ZyYWdfbWFwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGZyYWcpCit7CisJc3RydWN0IHVmc19pbm9kZV9pbmZvICp1ZnNpID0gVUZTX0koaW5vZGUpOworCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKKwl1NjQgbWFzayA9ICh1NjQpIHVzcGktPnNfYXBibWFzaz4+dXNwaS0+c19mcGJzaGlmdDsKKwlpbnQgc2hpZnQgPSB1c3BpLT5zX2FwYnNoaWZ0LXVzcGktPnNfZnBic2hpZnQ7CisJc2VjdG9yX3Qgb2Zmc2V0c1s0XSwgKnA7CisJaW50IGRlcHRoID0gdWZzX2Jsb2NrX3RvX3BhdGgoaW5vZGUsIGZyYWcgPj4gdXNwaS0+c19mcGJzaGlmdCwgb2Zmc2V0cyk7CisJdTY0ICByZXQgPSAwTDsKKwlfX2ZzMzIgYmxvY2s7CisJX19mczY0IHUyX2Jsb2NrID0gMEw7CisJdW5zaWduZWQgZmxhZ3MgPSBVRlNfU0Ioc2IpLT5zX2ZsYWdzOworCXU2NCB0ZW1wID0gMEw7CisKKwlVRlNEKCgiOiBmcmFnID0gJWx1ICBkZXB0aCA9ICVkXG4iLGZyYWcsZGVwdGgpKTsKKwlVRlNEKCgiOiB1c3BpLT5zX2ZwYnNoaWZ0ID0gJWQgLHVzcGktPnNfYXBibWFzayA9ICV4LCBtYXNrPSVsbHhcbiIsdXNwaS0+c19mcGJzaGlmdCx1c3BpLT5zX2FwYm1hc2ssbWFzaykpOworCisJaWYgKGRlcHRoID09IDApCisJCXJldHVybiAwOworCisJcCA9IG9mZnNldHM7CisKKwlsb2NrX2tlcm5lbCgpOworCWlmICgoZmxhZ3MgJiBVRlNfVFlQRV9NQVNLKSA9PSBVRlNfVFlQRV9VRlMyKQorCQlnb3RvIHVmczI7CisKKwlibG9jayA9IHVmc2ktPmlfdTEuaV9kYXRhWypwKytdOworCWlmICghYmxvY2spCisJCWdvdG8gb3V0OworCXdoaWxlICgtLWRlcHRoKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJCXNlY3Rvcl90IG4gPSAqcCsrOworCisJCWJoID0gc2JfYnJlYWQoc2IsIHVzcGktPnNfc2JiYXNlICsgZnMzMl90b19jcHUoc2IsIGJsb2NrKSsobj4+c2hpZnQpKTsKKwkJaWYgKCFiaCkKKwkJCWdvdG8gb3V0OworCQlibG9jayA9ICgoX19mczMyICopIGJoLT5iX2RhdGEpW24gJiBtYXNrXTsKKwkJYnJlbHNlIChiaCk7CisJCWlmICghYmxvY2spCisJCQlnb3RvIG91dDsKKwl9CisJcmV0ID0gKHU2NCkgKHVzcGktPnNfc2JiYXNlICsgZnMzMl90b19jcHUoc2IsIGJsb2NrKSArIChmcmFnICYgdXNwaS0+c19mcGJtYXNrKSk7CisJZ290byBvdXQ7Cit1ZnMyOgorCXUyX2Jsb2NrID0gdWZzaS0+aV91MS51Ml9pX2RhdGFbKnArK107CisJaWYgKCF1Ml9ibG9jaykKKwkJZ290byBvdXQ7CisKKworCXdoaWxlICgtLWRlcHRoKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJCXNlY3Rvcl90IG4gPSAqcCsrOworCisKKwkJdGVtcCA9ICh1NjQpKHVzcGktPnNfc2JiYXNlKSArIGZzNjRfdG9fY3B1KHNiLCB1Ml9ibG9jayk7CisJCWJoID0gc2JfYnJlYWQoc2IsIHRlbXAgKyh1NjQpIChuPj5zaGlmdCkpOworCQlpZiAoIWJoKQorCQkJZ290byBvdXQ7CisJCXUyX2Jsb2NrID0gKChfX2ZzNjQgKiliaC0+Yl9kYXRhKVtuICYgbWFza107CisJCWJyZWxzZShiaCk7CisJCWlmICghdTJfYmxvY2spCisJCQlnb3RvIG91dDsKKwl9CisJdGVtcCA9ICh1NjQpdXNwaS0+c19zYmJhc2UgKyBmczY0X3RvX2NwdShzYiwgdTJfYmxvY2spOworCXJldCA9IHRlbXAgKyAodTY0KSAoZnJhZyAmIHVzcGktPnNfZnBibWFzayk7CisKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqIHVmc19pbm9kZV9nZXRmcmFnIChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCXVuc2lnbmVkIGludCBmcmFnbWVudCwgdW5zaWduZWQgaW50IG5ld19mcmFnbWVudCwKKwl1bnNpZ25lZCBpbnQgcmVxdWlyZWQsIGludCAqZXJyLCBpbnQgbWV0YWRhdGEsIGxvbmcgKnBoeXMsIGludCAqbmV3KQoreworCXN0cnVjdCB1ZnNfaW5vZGVfaW5mbyAqdWZzaSA9IFVGU19JKGlub2RlKTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKKwlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogcmVzdWx0OworCXVuc2lnbmVkIGJsb2NrLCBibG9ja29mZiwgbGFzdGZyYWcsIGxhc3RibG9jaywgbGFzdGJsb2Nrb2ZmOworCXVuc2lnbmVkIHRtcCwgZ29hbDsKKwlfX2ZzMzIgKiBwLCAqIHAyOworCXVuc2lnbmVkIGZsYWdzID0gMDsKKworCVVGU0QoKCJFTlRFUiwgaW5vICVsdSwgZnJhZ21lbnQgJXUsIG5ld19mcmFnbWVudCAldSwgcmVxdWlyZWQgJXVcbiIsCisJCWlub2RlLT5pX2lubywgZnJhZ21lbnQsIG5ld19mcmFnbWVudCwgcmVxdWlyZWQpKSAgICAgICAgIAorCisJc2IgPSBpbm9kZS0+aV9zYjsKKwl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOworCisJZmxhZ3MgPSBVRlNfU0Ioc2IpLT5zX2ZsYWdzOworICAgICAgICAvKiBUT0RPIDogdG8gYmUgZG9uZSBmb3Igd3JpdGUgc3VwcG9ydAorICAgICAgICBpZiAoIChmbGFncyAmIFVGU19UWVBFX01BU0spID09IFVGU19UWVBFX1VGUzIpCisgICAgICAgICAgICAgZ290byB1ZnMyOworICAgICAgICAgKi8KKworCWJsb2NrID0gdWZzX2ZyYWdzdG9ibGtzIChmcmFnbWVudCk7CisJYmxvY2tvZmYgPSB1ZnNfZnJhZ251bSAoZnJhZ21lbnQpOworCXAgPSB1ZnNpLT5pX3UxLmlfZGF0YSArIGJsb2NrOworCWdvYWwgPSAwOworCityZXBlYXQ6CisJdG1wID0gZnMzMl90b19jcHUoc2IsICpwKTsKKwlsYXN0ZnJhZyA9IHVmc2ktPmlfbGFzdGZyYWc7CisJaWYgKHRtcCAmJiBmcmFnbWVudCA8IGxhc3RmcmFnKSB7CisJCWlmIChtZXRhZGF0YSkgeworCQkJcmVzdWx0ID0gc2JfZ2V0YmxrKHNiLCB1c3BpLT5zX3NiYmFzZSArIHRtcCArIGJsb2Nrb2ZmKTsKKwkJCWlmICh0bXAgPT0gZnMzMl90b19jcHUoc2IsICpwKSkgeworCQkJCVVGU0QoKCJFWElULCByZXN1bHQgJXVcbiIsIHRtcCArIGJsb2Nrb2ZmKSkKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJYnJlbHNlIChyZXN1bHQpOworCQkJZ290byByZXBlYXQ7CisJCX0gZWxzZSB7CisJCQkqcGh5cyA9IHRtcDsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJbGFzdGJsb2NrID0gdWZzX2ZyYWdzdG9ibGtzIChsYXN0ZnJhZyk7CisJbGFzdGJsb2Nrb2ZmID0gdWZzX2ZyYWdudW0gKGxhc3RmcmFnKTsKKwkvKgorCSAqIFdlIHdpbGwgZXh0ZW5kIGZpbGUgaW50byBuZXcgYmxvY2sgYmV5b25kIGxhc3QgYWxsb2NhdGVkIGJsb2NrCisJICovCisJaWYgKGxhc3RibG9jayA8IGJsb2NrKSB7CisJCS8qCisJCSAqIFdlIG11c3QgcmVhbGxvY2F0ZSBsYXN0IGFsbG9jYXRlZCBibG9jaworCQkgKi8KKwkJaWYgKGxhc3RibG9ja29mZikgeworCQkJcDIgPSB1ZnNpLT5pX3UxLmlfZGF0YSArIGxhc3RibG9jazsKKwkJCXRtcCA9IHVmc19uZXdfZnJhZ21lbnRzIChpbm9kZSwgcDIsIGxhc3RmcmFnLCAKKwkJCQlmczMyX3RvX2NwdShzYiwgKnAyKSwgdXNwaS0+c19mcGIgLSBsYXN0YmxvY2tvZmYsIGVycik7CisJCQlpZiAoIXRtcCkgeworCQkJCWlmIChsYXN0ZnJhZyAhPSB1ZnNpLT5pX2xhc3RmcmFnKQorCQkJCQlnb3RvIHJlcGVhdDsKKwkJCQllbHNlCisJCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJbGFzdGZyYWcgPSB1ZnNpLT5pX2xhc3RmcmFnOworCQkJCisJCX0KKwkJZ29hbCA9IGZzMzJfdG9fY3B1KHNiLCB1ZnNpLT5pX3UxLmlfZGF0YVtsYXN0YmxvY2tdKSArIHVzcGktPnNfZnBiOworCQl0bXAgPSB1ZnNfbmV3X2ZyYWdtZW50cyAoaW5vZGUsIHAsIGZyYWdtZW50IC0gYmxvY2tvZmYsIAorCQkJZ29hbCwgcmVxdWlyZWQgKyBibG9ja29mZiwgZXJyKTsKKwl9CisJLyoKKwkgKiBXZSB3aWxsIGV4dGVuZCBsYXN0IGFsbG9jYXRlZCBibG9jaworCSAqLworCWVsc2UgaWYgKGxhc3RibG9jayA9PSBibG9jaykgeworCQl0bXAgPSB1ZnNfbmV3X2ZyYWdtZW50cyAoaW5vZGUsIHAsIGZyYWdtZW50IC0gKGJsb2Nrb2ZmIC0gbGFzdGJsb2Nrb2ZmKSwKKwkJCWZzMzJfdG9fY3B1KHNiLCAqcCksIHJlcXVpcmVkICsgIChibG9ja29mZiAtIGxhc3RibG9ja29mZiksIGVycik7CisJfQorCS8qCisJICogV2Ugd2lsbCBhbGxvY2F0ZSBuZXcgYmxvY2sgYmVmb3JlIGxhc3QgYWxsb2NhdGVkIGJsb2NrCisJICovCisJZWxzZSAvKiAobGFzdGJsb2NrID4gYmxvY2spICovIHsKKwkJaWYgKGxhc3RibG9jayAmJiAodG1wID0gZnMzMl90b19jcHUoc2IsIHVmc2ktPmlfdTEuaV9kYXRhW2xhc3RibG9jay0xXSkpKQorCQkJZ29hbCA9IHRtcCArIHVzcGktPnNfZnBiOworCQl0bXAgPSB1ZnNfbmV3X2ZyYWdtZW50cyAoaW5vZGUsIHAsIGZyYWdtZW50IC0gYmxvY2tvZmYsIAorCQkJZ29hbCwgdXNwaS0+c19mcGIsIGVycik7CisJfQorCWlmICghdG1wKSB7CisJCWlmICgoIWJsb2Nrb2ZmICYmICpwKSB8fCAKKwkJICAgIChibG9ja29mZiAmJiBsYXN0ZnJhZyAhPSB1ZnNpLT5pX2xhc3RmcmFnKSkKKwkJCWdvdG8gcmVwZWF0OworCQkqZXJyID0gLUVOT1NQQzsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogVGhlIG51bGxpZmljYXRpb24gb2YgZnJhbWdlbnRzIGRvbmUgaW4gdWZzL2JhbGxvYy5jIGlzCisJICogc29tZXRoaW5nIEkgZG9uJ3QgaGF2ZSB0aGUgc3RvbWFjaGUgdG8gbW92ZSBpbnRvIGhlcmUgcmlnaHQKKwkgKiBub3cuIC1EYXZlTQorCSAqLworCWlmIChtZXRhZGF0YSkgeworCQlyZXN1bHQgPSBzYl9nZXRibGsoaW5vZGUtPmlfc2IsIHRtcCArIGJsb2Nrb2ZmKTsKKwl9IGVsc2UgeworCQkqcGh5cyA9IHRtcDsKKwkJcmVzdWx0ID0gTlVMTDsKKwkJKmVyciA9IDA7CisJCSpuZXcgPSAxOworCX0KKworCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlpZiAoSVNfU1lOQyhpbm9kZSkpCisJCXVmc19zeW5jX2lub2RlIChpbm9kZSk7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJVUZTRCgoIkVYSVQsIHJlc3VsdCAldVxuIiwgdG1wICsgYmxvY2tvZmYpKQorCXJldHVybiByZXN1bHQ7CisKKyAgICAgLyogVGhpcyBwYXJ0IDogVG8gYmUgaW1wbGVtZW50ZWQgLi4uLgorICAgICAgICBSZXF1aXJlZCBvbmx5IGZvciB3cml0aW5nLCBub3QgcmVxdWlyZWQgZm9yIFJFQUQtT05MWS4KK3VmczI6CisKKwl1Ml9ibG9jayA9IHVmc19mcmFnc3RvYmxrcyhmcmFnbWVudCk7CisJdTJfYmxvY2tvZmYgPSB1ZnNfZnJhZ251bShmcmFnbWVudCk7CisJcCA9IHVmc2ktPmlfdTEudTJfaV9kYXRhICsgYmxvY2s7CisJZ29hbCA9IDA7CisKK3JlcGVhdDI6CisJdG1wID0gZnMzMl90b19jcHUoc2IsICpwKTsKKwlsYXN0ZnJhZyA9IHVmc2ktPmlfbGFzdGZyYWc7CisKKyAgICAgKi8KK30KKworc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqIHVmc19ibG9ja19nZXRmcmFnIChzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCXN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIHVuc2lnbmVkIGludCBmcmFnbWVudCwgdW5zaWduZWQgaW50IG5ld19mcmFnbWVudCwgCisJdW5zaWduZWQgaW50IGJsb2Nrc2l6ZSwgaW50ICogZXJyLCBpbnQgbWV0YWRhdGEsIGxvbmcgKnBoeXMsIGludCAqbmV3KQoreworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiOworCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiByZXN1bHQ7CisJdW5zaWduZWQgdG1wLCBnb2FsLCBibG9jaywgYmxvY2tvZmY7CisJX19mczMyICogcDsKKworCXNiID0gaW5vZGUtPmlfc2I7CisJdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKKwlibG9jayA9IHVmc19mcmFnc3RvYmxrcyAoZnJhZ21lbnQpOworCWJsb2Nrb2ZmID0gdWZzX2ZyYWdudW0gKGZyYWdtZW50KTsKKworCVVGU0QoKCJFTlRFUiwgaW5vICVsdSwgZnJhZ21lbnQgJXUsIG5ld19mcmFnbWVudCAldVxuIiwgaW5vZGUtPmlfaW5vLCBmcmFnbWVudCwgbmV3X2ZyYWdtZW50KSkJCisKKwlyZXN1bHQgPSBOVUxMOworCWlmICghYmgpCisJCWdvdG8gb3V0OworCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkgeworCQlsbF9yd19ibG9jayAoUkVBRCwgMSwgJmJoKTsKKwkJd2FpdF9vbl9idWZmZXIgKGJoKTsKKwkJaWYgKCFidWZmZXJfdXB0b2RhdGUoYmgpKQorCQkJZ290byBvdXQ7CisJfQorCisJcCA9IChfX2ZzMzIgKikgYmgtPmJfZGF0YSArIGJsb2NrOworcmVwZWF0OgorCXRtcCA9IGZzMzJfdG9fY3B1KHNiLCAqcCk7CisJaWYgKHRtcCkgeworCQlpZiAobWV0YWRhdGEpIHsKKwkJCXJlc3VsdCA9IHNiX2dldGJsayhzYiwgdXNwaS0+c19zYmJhc2UgKyB0bXAgKyBibG9ja29mZik7CisJCQlpZiAodG1wID09IGZzMzJfdG9fY3B1KHNiLCAqcCkpCisJCQkJZ290byBvdXQ7CisJCQlicmVsc2UgKHJlc3VsdCk7CisJCQlnb3RvIHJlcGVhdDsKKwkJfSBlbHNlIHsKKwkJCSpwaHlzID0gdG1wOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAoYmxvY2sgJiYgKHRtcCA9IGZzMzJfdG9fY3B1KHNiLCAoKF9fZnMzMiopYmgtPmJfZGF0YSlbYmxvY2stMV0pICsgdXNwaS0+c19mcGIpKQorCQlnb2FsID0gdG1wICsgdXNwaS0+c19mcGI7CisJZWxzZQorCQlnb2FsID0gYmgtPmJfYmxvY2tuciArIHVzcGktPnNfZnBiOworCXRtcCA9IHVmc19uZXdfZnJhZ21lbnRzIChpbm9kZSwgcCwgdWZzX2Jsa251bShuZXdfZnJhZ21lbnQpLCBnb2FsLCB1c3BpLT5zX2ZwYiwgZXJyKTsKKwlpZiAoIXRtcCkgeworCQlpZiAoZnMzMl90b19jcHUoc2IsICpwKSkKKwkJCWdvdG8gcmVwZWF0OworCQlnb3RvIG91dDsKKwl9CQkKKworCS8qIFRoZSBudWxsaWZpY2F0aW9uIG9mIGZyYW1nZW50cyBkb25lIGluIHVmcy9iYWxsb2MuYyBpcworCSAqIHNvbWV0aGluZyBJIGRvbid0IGhhdmUgdGhlIHN0b21hY2hlIHRvIG1vdmUgaW50byBoZXJlIHJpZ2h0CisJICogbm93LiAtRGF2ZU0KKwkgKi8KKwlpZiAobWV0YWRhdGEpIHsKKwkJcmVzdWx0ID0gc2JfZ2V0YmxrKHNiLCB0bXAgKyBibG9ja29mZik7CisJfSBlbHNlIHsKKwkJKnBoeXMgPSB0bXA7CisJCSpuZXcgPSAxOworCX0KKworCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwlpZiAoSVNfU1lOQyhpbm9kZSkpCisJCXN5bmNfZGlydHlfYnVmZmVyKGJoKTsKKwlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CitvdXQ6CisJYnJlbHNlIChiaCk7CisJVUZTRCgoIkVYSVQsIHJlc3VsdCAldVxuIiwgdG1wICsgYmxvY2tvZmYpKQorCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIGJsb2NrIHdoaWNoIGNvbnRhaW5zIHRoZSBmcmFnbWVudC4KKyAqLworCitzdGF0aWMgaW50IHVmc19nZXRmcmFnX2Jsb2NrIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBmcmFnbWVudCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2IgPSBpbm9kZS0+aV9zYjsKKwlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJaW50IHJldCwgZXJyLCBuZXc7CisJdW5zaWduZWQgbG9uZyBwdHIscGh5czsKKwl1NjQgcGh5czY0ID0gMDsKKwkKKwlpZiAoIWNyZWF0ZSkgeworCQlwaHlzNjQgPSB1ZnNfZnJhZ19tYXAoaW5vZGUsIGZyYWdtZW50KTsKKwkJVUZTRCgoInBoeXM2NCA9ICVsdSBcbiIscGh5czY0KSk7CisJCWlmIChwaHlzNjQpCisJCQltYXBfYmgoYmhfcmVzdWx0LCBzYiwgcGh5czY0KTsKKwkJcmV0dXJuIDA7CisJfQorCisgICAgICAgIC8qIFRoaXMgY29kZSBlbnRlcmVkIG9ubHkgd2hpbGUgd3JpdGluZyAuLi4uPyAqLworCisJZXJyID0gLUVJTzsKKwluZXcgPSAwOworCXJldCA9IDA7CisJYmggPSBOVUxMOworCisJbG9ja19rZXJuZWwoKTsKKworCVVGU0QoKCJFTlRFUiwgaW5vICVsdSwgZnJhZ21lbnQgJXVcbiIsIGlub2RlLT5pX2lubywgZnJhZ21lbnQpKQorCWlmIChmcmFnbWVudCA8IDApCisJCWdvdG8gYWJvcnRfbmVnYXRpdmU7CisJaWYgKGZyYWdtZW50ID4KKwkgICAgKChVRlNfTkRBRERSICsgdXNwaS0+c19hcGIgKyB1c3BpLT5zXzJhcGIgKyB1c3BpLT5zXzNhcGIpCisJICAgICA8PCB1c3BpLT5zX2ZwYnNoaWZ0KSkKKwkJZ290byBhYm9ydF90b29fYmlnOworCisJZXJyID0gMDsKKwlwdHIgPSBmcmFnbWVudDsKKwkgIAorCS8qCisJICogb2ssIHRoZXNlIG1hY3JvcyBjbGVhbiB0aGUgbG9naWMgdXAgYSBiaXQgYW5kIG1ha2UKKwkgKiBpdCBtdWNoIG1vcmUgcmVhZGFibGU6CisJICovCisjZGVmaW5lIEdFVF9JTk9ERV9EQVRBQkxPQ0soeCkgXAorCQl1ZnNfaW5vZGVfZ2V0ZnJhZyhpbm9kZSwgeCwgZnJhZ21lbnQsIDEsICZlcnIsIDAsICZwaHlzLCAmbmV3KQorI2RlZmluZSBHRVRfSU5PREVfUFRSKHgpIFwKKwkJdWZzX2lub2RlX2dldGZyYWcoaW5vZGUsIHgsIGZyYWdtZW50LCB1c3BpLT5zX2ZwYiwgJmVyciwgMSwgTlVMTCwgTlVMTCkKKyNkZWZpbmUgR0VUX0lORElSRUNUX0RBVEFCTE9DSyh4KSBcCisJCXVmc19ibG9ja19nZXRmcmFnKGlub2RlLCBiaCwgeCwgZnJhZ21lbnQsIHNiLT5zX2Jsb2Nrc2l6ZSwgXAorCQkJCSAgJmVyciwgMCwgJnBoeXMsICZuZXcpOworI2RlZmluZSBHRVRfSU5ESVJFQ1RfUFRSKHgpIFwKKwkJdWZzX2Jsb2NrX2dldGZyYWcoaW5vZGUsIGJoLCB4LCBmcmFnbWVudCwgc2ItPnNfYmxvY2tzaXplLCBcCisJCQkJICAmZXJyLCAxLCBOVUxMLCBOVUxMKTsKKworCWlmIChwdHIgPCBVRlNfTkRJUl9GUkFHTUVOVCkgeworCQliaCA9IEdFVF9JTk9ERV9EQVRBQkxPQ0socHRyKTsKKwkJZ290byBvdXQ7CisJfQorCXB0ciAtPSBVRlNfTkRJUl9GUkFHTUVOVDsKKwlpZiAocHRyIDwgKDEgPDwgKHVzcGktPnNfYXBic2hpZnQgKyB1c3BpLT5zX2ZwYnNoaWZ0KSkpIHsKKwkJYmggPSBHRVRfSU5PREVfUFRSKFVGU19JTkRfRlJBR01FTlQgKyAocHRyID4+IHVzcGktPnNfYXBic2hpZnQpKTsKKwkJZ290byBnZXRfaW5kaXJlY3Q7CisJfQorCXB0ciAtPSAxIDw8ICh1c3BpLT5zX2FwYnNoaWZ0ICsgdXNwaS0+c19mcGJzaGlmdCk7CisJaWYgKHB0ciA8ICgxIDw8ICh1c3BpLT5zXzJhcGJzaGlmdCArIHVzcGktPnNfZnBic2hpZnQpKSkgeworCQliaCA9IEdFVF9JTk9ERV9QVFIoVUZTX0RJTkRfRlJBR01FTlQgKyAocHRyID4+IHVzcGktPnNfMmFwYnNoaWZ0KSk7CisJCWdvdG8gZ2V0X2RvdWJsZTsKKwl9CisJcHRyIC09IDEgPDwgKHVzcGktPnNfMmFwYnNoaWZ0ICsgdXNwaS0+c19mcGJzaGlmdCk7CisJYmggPSBHRVRfSU5PREVfUFRSKFVGU19USU5EX0ZSQUdNRU5UICsgKHB0ciA+PiB1c3BpLT5zXzNhcGJzaGlmdCkpOworCWJoID0gR0VUX0lORElSRUNUX1BUUigocHRyID4+IHVzcGktPnNfMmFwYnNoaWZ0KSAmIHVzcGktPnNfYXBibWFzayk7CitnZXRfZG91YmxlOgorCWJoID0gR0VUX0lORElSRUNUX1BUUigocHRyID4+IHVzcGktPnNfYXBic2hpZnQpICYgdXNwaS0+c19hcGJtYXNrKTsKK2dldF9pbmRpcmVjdDoKKwliaCA9IEdFVF9JTkRJUkVDVF9EQVRBQkxPQ0socHRyICYgdXNwaS0+c19hcGJtYXNrKTsKKworI3VuZGVmIEdFVF9JTk9ERV9EQVRBQkxPQ0sKKyN1bmRlZiBHRVRfSU5PREVfUFRSCisjdW5kZWYgR0VUX0lORElSRUNUX0RBVEFCTE9DSworI3VuZGVmIEdFVF9JTkRJUkVDVF9QVFIKKworb3V0OgorCWlmIChlcnIpCisJCWdvdG8gYWJvcnQ7CisJaWYgKG5ldykKKwkJc2V0X2J1ZmZlcl9uZXcoYmhfcmVzdWx0KTsKKwltYXBfYmgoYmhfcmVzdWx0LCBzYiwgcGh5cyk7CithYm9ydDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycjsKKworYWJvcnRfbmVnYXRpdmU6CisJdWZzX3dhcm5pbmcoc2IsICJ1ZnNfZ2V0X2Jsb2NrIiwgImJsb2NrIDwgMCIpOworCWdvdG8gYWJvcnQ7CisKK2Fib3J0X3Rvb19iaWc6CisJdWZzX3dhcm5pbmcoc2IsICJ1ZnNfZ2V0X2Jsb2NrIiwgImJsb2NrID4gYmlnIik7CisJZ290byBhYm9ydDsKK30KKworc3RydWN0IGJ1ZmZlcl9oZWFkICp1ZnNfZ2V0ZnJhZyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBpbnQgZnJhZ21lbnQsCisJCQkJaW50IGNyZWF0ZSwgaW50ICplcnIpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkIGR1bW15OworCWludCBlcnJvcjsKKworCWR1bW15LmJfc3RhdGUgPSAwOworCWR1bW15LmJfYmxvY2tuciA9IC0xMDAwOworCWVycm9yID0gdWZzX2dldGZyYWdfYmxvY2soaW5vZGUsIGZyYWdtZW50LCAmZHVtbXksIGNyZWF0ZSk7CisJKmVyciA9IGVycm9yOworCWlmICghZXJyb3IgJiYgYnVmZmVyX21hcHBlZCgmZHVtbXkpKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJCWJoID0gc2JfZ2V0YmxrKGlub2RlLT5pX3NiLCBkdW1teS5iX2Jsb2NrbnIpOworCQlpZiAoYnVmZmVyX25ldygmZHVtbXkpKSB7CisJCQltZW1zZXQoYmgtPmJfZGF0YSwgMCwgaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplKTsKKwkJCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOworCQkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQl9CisJCXJldHVybiBiaDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBidWZmZXJfaGVhZCAqIHVmc19icmVhZCAoc3RydWN0IGlub2RlICogaW5vZGUsIHVuc2lnbmVkIGZyYWdtZW50LAorCWludCBjcmVhdGUsIGludCAqIGVycikKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKworCVVGU0QoKCJFTlRFUiwgaW5vICVsdSwgZnJhZ21lbnQgJXVcbiIsIGlub2RlLT5pX2lubywgZnJhZ21lbnQpKQorCWJoID0gdWZzX2dldGZyYWcgKGlub2RlLCBmcmFnbWVudCwgY3JlYXRlLCBlcnIpOworCWlmICghYmggfHwgYnVmZmVyX3VwdG9kYXRlKGJoKSkgCQkKKwkJcmV0dXJuIGJoOworCWxsX3J3X2Jsb2NrIChSRUFELCAxLCAmYmgpOworCXdhaXRfb25fYnVmZmVyIChiaCk7CisJaWYgKGJ1ZmZlcl91cHRvZGF0ZShiaCkpCisJCXJldHVybiBiaDsKKwlicmVsc2UgKGJoKTsKKwkqZXJyID0gLUVJTzsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCB1ZnNfd3JpdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlyZXR1cm4gYmxvY2tfd3JpdGVfZnVsbF9wYWdlKHBhZ2UsdWZzX2dldGZyYWdfYmxvY2ssd2JjKTsKK30KK3N0YXRpYyBpbnQgdWZzX3JlYWRwYWdlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlyZXR1cm4gYmxvY2tfcmVhZF9mdWxsX3BhZ2UocGFnZSx1ZnNfZ2V0ZnJhZ19ibG9jayk7Cit9CitzdGF0aWMgaW50IHVmc19wcmVwYXJlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pCit7CisJcmV0dXJuIGJsb2NrX3ByZXBhcmVfd3JpdGUocGFnZSxmcm9tLHRvLHVmc19nZXRmcmFnX2Jsb2NrKTsKK30KK3N0YXRpYyBzZWN0b3JfdCB1ZnNfYm1hcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgc2VjdG9yX3QgYmxvY2spCit7CisJcmV0dXJuIGdlbmVyaWNfYmxvY2tfYm1hcChtYXBwaW5nLGJsb2NrLHVmc19nZXRmcmFnX2Jsb2NrKTsKK30KK3N0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgdWZzX2FvcHMgPSB7CisJLnJlYWRwYWdlID0gdWZzX3JlYWRwYWdlLAorCS53cml0ZXBhZ2UgPSB1ZnNfd3JpdGVwYWdlLAorCS5zeW5jX3BhZ2UgPSBibG9ja19zeW5jX3BhZ2UsCisJLnByZXBhcmVfd3JpdGUgPSB1ZnNfcHJlcGFyZV93cml0ZSwKKwkuY29tbWl0X3dyaXRlID0gZ2VuZXJpY19jb21taXRfd3JpdGUsCisJLmJtYXAgPSB1ZnNfYm1hcAorfTsKKwordm9pZCB1ZnNfcmVhZF9pbm9kZSAoc3RydWN0IGlub2RlICogaW5vZGUpCit7CisJc3RydWN0IHVmc19pbm9kZV9pbmZvICp1ZnNpID0gVUZTX0koaW5vZGUpOworCXN0cnVjdCBzdXBlcl9ibG9jayAqIHNiOworCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaTsKKwlzdHJ1Y3QgdWZzX2lub2RlICogdWZzX2lub2RlOwkKKwlzdHJ1Y3QgdWZzMl9pbm9kZSAqdWZzMl9pbm9kZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwltb2RlX3QgbW9kZTsKKwl1bnNpZ25lZCBpOworCXVuc2lnbmVkIGZsYWdzOworCQorCVVGU0QoKCJFTlRFUiwgaW5vICVsdVxuIiwgaW5vZGUtPmlfaW5vKSkKKwkKKwlzYiA9IGlub2RlLT5pX3NiOworCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CisJZmxhZ3MgPSBVRlNfU0Ioc2IpLT5zX2ZsYWdzOworCisJaWYgKGlub2RlLT5pX2lubyA8IFVGU19ST09USU5PIHx8IAorCSAgICBpbm9kZS0+aV9pbm8gPiAodXNwaS0+c19uY2cgKiB1c3BpLT5zX2lwZykpIHsKKwkJdWZzX3dhcm5pbmcgKHNiLCAidWZzX3JlYWRfaW5vZGUiLCAiYmFkIGlub2RlIG51bWJlciAoJWx1KVxuIiwgaW5vZGUtPmlfaW5vKTsKKwkJZ290byBiYWRfaW5vZGU7CisJfQorCQorCWJoID0gc2JfYnJlYWQoc2IsIHVzcGktPnNfc2JiYXNlICsgdWZzX2lub3RvZnNiYShpbm9kZS0+aV9pbm8pKTsKKwlpZiAoIWJoKSB7CisJCXVmc193YXJuaW5nIChzYiwgInVmc19yZWFkX2lub2RlIiwgInVuYWJsZSB0byByZWFkIGlub2RlICVsdVxuIiwgaW5vZGUtPmlfaW5vKTsKKwkJZ290byBiYWRfaW5vZGU7CisJfQorCWlmICgoZmxhZ3MgJiBVRlNfVFlQRV9NQVNLKSA9PSBVRlNfVFlQRV9VRlMyKQorCQlnb3RvIHVmczJfaW5vZGU7CisKKwl1ZnNfaW5vZGUgPSAoc3RydWN0IHVmc19pbm9kZSAqKSAoYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgdWZzX2lub2RlKSAqIHVmc19pbm90b2ZzYm8oaW5vZGUtPmlfaW5vKSk7CisKKwkvKgorCSAqIENvcHkgZGF0YSB0byB0aGUgaW4tY29yZSBpbm9kZS4KKwkgKi8KKwlpbm9kZS0+aV9tb2RlID0gbW9kZSA9IGZzMTZfdG9fY3B1KHNiLCB1ZnNfaW5vZGUtPnVpX21vZGUpOworCWlub2RlLT5pX25saW5rID0gZnMxNl90b19jcHUoc2IsIHVmc19pbm9kZS0+dWlfbmxpbmspOworCWlmIChpbm9kZS0+aV9ubGluayA9PSAwKQorCQl1ZnNfZXJyb3IgKHNiLCAidWZzX3JlYWRfaW5vZGUiLCAiaW5vZGUgJWx1IGhhcyB6ZXJvIG5saW5rXG4iLCBpbm9kZS0+aV9pbm8pOworCQorCS8qCisJICogTGludXggbm93IGhhcyAzMi1iaXQgdWlkIGFuZCBnaWQsIHNvIHdlIGNhbiBzdXBwb3J0IEVGVC4KKwkgKi8KKwlpbm9kZS0+aV91aWQgPSB1ZnNfZ2V0X2lub2RlX3VpZChzYiwgdWZzX2lub2RlKTsKKwlpbm9kZS0+aV9naWQgPSB1ZnNfZ2V0X2lub2RlX2dpZChzYiwgdWZzX2lub2RlKTsKKworCWlub2RlLT5pX3NpemUgPSBmczY0X3RvX2NwdShzYiwgdWZzX2lub2RlLT51aV9zaXplKTsKKwlpbm9kZS0+aV9hdGltZS50dl9zZWMgPSBmczMyX3RvX2NwdShzYiwgdWZzX2lub2RlLT51aV9hdGltZS50dl9zZWMpOworCWlub2RlLT5pX2N0aW1lLnR2X3NlYyA9IGZzMzJfdG9fY3B1KHNiLCB1ZnNfaW5vZGUtPnVpX2N0aW1lLnR2X3NlYyk7CisJaW5vZGUtPmlfbXRpbWUudHZfc2VjID0gZnMzMl90b19jcHUoc2IsIHVmc19pbm9kZS0+dWlfbXRpbWUudHZfc2VjKTsKKwlpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gMDsKKwlpbm9kZS0+aV9hdGltZS50dl9uc2VjID0gMDsKKwlpbm9kZS0+aV9jdGltZS50dl9uc2VjID0gMDsKKwlpbm9kZS0+aV9ibG9ja3MgPSBmczMyX3RvX2NwdShzYiwgdWZzX2lub2RlLT51aV9ibG9ja3MpOworCWlub2RlLT5pX2Jsa3NpemUgPSBQQUdFX1NJWkU7ICAgLyogVGhpcyBpcyB0aGUgb3B0aW1hbCBJTyBzaXplIChmb3Igc3RhdCkgKi8KKwlpbm9kZS0+aV92ZXJzaW9uKys7CisJdWZzaS0+aV9mbGFncyA9IGZzMzJfdG9fY3B1KHNiLCB1ZnNfaW5vZGUtPnVpX2ZsYWdzKTsKKwl1ZnNpLT5pX2dlbiA9IGZzMzJfdG9fY3B1KHNiLCB1ZnNfaW5vZGUtPnVpX2dlbik7CisJdWZzaS0+aV9zaGFkb3cgPSBmczMyX3RvX2NwdShzYiwgdWZzX2lub2RlLT51aV91My51aV9zdW4udWlfc2hhZG93KTsKKwl1ZnNpLT5pX29lZnRmbGFnID0gZnMzMl90b19jcHUoc2IsIHVmc19pbm9kZS0+dWlfdTMudWlfc3VuLnVpX29lZnRmbGFnKTsKKwl1ZnNpLT5pX2xhc3RmcmFnID0gKGlub2RlLT5pX3NpemUgKyB1c3BpLT5zX2ZzaXplIC0gMSkgPj4gdXNwaS0+c19mc2hpZnQ7CisJCisJaWYgKFNfSVNDSFIobW9kZSkgfHwgU19JU0JMSyhtb2RlKSB8fCBpbm9kZS0+aV9ibG9ja3MpIHsKKwkJZm9yIChpID0gMDsgaSA8IChVRlNfTkRBRERSICsgVUZTX05JTkRJUik7IGkrKykKKwkJCXVmc2ktPmlfdTEuaV9kYXRhW2ldID0gdWZzX2lub2RlLT51aV91Mi51aV9hZGRyLnVpX2RiW2ldOworCX0KKwllbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IChVRlNfTkRBRERSICsgVUZTX05JTkRJUikgKiA0OyBpKyspCisJCQl1ZnNpLT5pX3UxLmlfc3ltbGlua1tpXSA9IHVmc19pbm9kZS0+dWlfdTIudWlfc3ltbGlua1tpXTsKKwl9CisJdWZzaS0+aV9vc3luYyA9IDA7CisKKwlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgeworCQlpbm9kZS0+aV9vcCA9ICZ1ZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9mb3AgPSAmdWZzX2ZpbGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmdWZzX2FvcHM7CisJfSBlbHNlIGlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCWlub2RlLT5pX29wID0gJnVmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJnVmc19kaXJfb3BlcmF0aW9uczsKKwl9IGVsc2UgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaWYgKCFpbm9kZS0+aV9ibG9ja3MpCisJCQlpbm9kZS0+aV9vcCA9ICZ1ZnNfZmFzdF9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJCWVsc2UgeworCQkJaW5vZGUtPmlfb3AgPSAmcGFnZV9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZ1ZnNfYW9wczsKKwkJfQorCX0gZWxzZQorCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIGlub2RlLT5pX21vZGUsCisJCQl1ZnNfZ2V0X2lub2RlX2RldihzYiwgdWZzaSkpOworCisJYnJlbHNlIChiaCk7CisKKwlVRlNEKCgiRVhJVFxuIikpCisJcmV0dXJuOworCitiYWRfaW5vZGU6CisJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOworCXJldHVybjsKKwordWZzMl9pbm9kZSA6CisJVUZTRCgoIlJlYWRpbmcgdWZzMiBpbm9kZSwgaW5vICVsdVxuIiwgaW5vZGUtPmlfaW5vKSkKKworCXVmczJfaW5vZGUgPSAoc3RydWN0IHVmczJfaW5vZGUgKikoYmgtPmJfZGF0YSArIHNpemVvZihzdHJ1Y3QgdWZzMl9pbm9kZSkgKiB1ZnNfaW5vdG9mc2JvKGlub2RlLT5pX2lubykpOworCisJLyoKKwkgKiBDb3B5IGRhdGEgdG8gdGhlIGluLWNvcmUgaW5vZGUuCisJICovCisJaW5vZGUtPmlfbW9kZSA9IG1vZGUgPSBmczE2X3RvX2NwdShzYiwgdWZzMl9pbm9kZS0+dWlfbW9kZSk7CisJaW5vZGUtPmlfbmxpbmsgPSBmczE2X3RvX2NwdShzYiwgdWZzMl9pbm9kZS0+dWlfbmxpbmspOworCWlmIChpbm9kZS0+aV9ubGluayA9PSAwKQorCQl1ZnNfZXJyb3IgKHNiLCAidWZzX3JlYWRfaW5vZGUiLCAiaW5vZGUgJWx1IGhhcyB6ZXJvIG5saW5rXG4iLCBpbm9kZS0+aV9pbm8pOworCisgICAgICAgIC8qCisgICAgICAgICAqIExpbnV4IG5vdyBoYXMgMzItYml0IHVpZCBhbmQgZ2lkLCBzbyB3ZSBjYW4gc3VwcG9ydCBFRlQuCisgICAgICAgICAqLworCWlub2RlLT5pX3VpZCA9IGZzMzJfdG9fY3B1KHNiLCB1ZnMyX2lub2RlLT51aV91aWQpOworCWlub2RlLT5pX2dpZCA9IGZzMzJfdG9fY3B1KHNiLCB1ZnMyX2lub2RlLT51aV9naWQpOworCisJaW5vZGUtPmlfc2l6ZSA9IGZzNjRfdG9fY3B1KHNiLCB1ZnMyX2lub2RlLT51aV9zaXplKTsKKwlpbm9kZS0+aV9hdGltZS50dl9zZWMgPSBmczMyX3RvX2NwdShzYiwgdWZzMl9pbm9kZS0+dWlfYXRpbWUudHZfc2VjKTsKKwlpbm9kZS0+aV9jdGltZS50dl9zZWMgPSBmczMyX3RvX2NwdShzYiwgdWZzMl9pbm9kZS0+dWlfY3RpbWUudHZfc2VjKTsKKwlpbm9kZS0+aV9tdGltZS50dl9zZWMgPSBmczMyX3RvX2NwdShzYiwgdWZzMl9pbm9kZS0+dWlfbXRpbWUudHZfc2VjKTsKKwlpbm9kZS0+aV9tdGltZS50dl9uc2VjID0gMDsKKwlpbm9kZS0+aV9hdGltZS50dl9uc2VjID0gMDsKKwlpbm9kZS0+aV9jdGltZS50dl9uc2VjID0gMDsKKwlpbm9kZS0+aV9ibG9ja3MgPSBmczY0X3RvX2NwdShzYiwgdWZzMl9pbm9kZS0+dWlfYmxvY2tzKTsKKwlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9TSVpFOyAvKlRoaXMgaXMgdGhlIG9wdGltYWwgSU8gc2l6ZShmb3Igc3RhdCkqLworCisJaW5vZGUtPmlfdmVyc2lvbisrOworCXVmc2ktPmlfZmxhZ3MgPSBmczMyX3RvX2NwdShzYiwgdWZzMl9pbm9kZS0+dWlfZmxhZ3MpOworCXVmc2ktPmlfZ2VuID0gZnMzMl90b19jcHUoc2IsIHVmczJfaW5vZGUtPnVpX2dlbik7CisJLyoKKwl1ZnNpLT5pX3NoYWRvdyA9IGZzMzJfdG9fY3B1KHNiLCB1ZnNfaW5vZGUtPnVpX3UzLnVpX3N1bi51aV9zaGFkb3cpOworCXVmc2ktPmlfb2VmdGZsYWcgPSBmczMyX3RvX2NwdShzYiwgdWZzX2lub2RlLT51aV91My51aV9zdW4udWlfb2VmdGZsYWcpOworCSovCisJdWZzaS0+aV9sYXN0ZnJhZz0gKGlub2RlLT5pX3NpemUgKyB1c3BpLT5zX2ZzaXplLSAxKSA+PiB1c3BpLT5zX2ZzaGlmdDsKKworCWlmIChTX0lTQ0hSKG1vZGUpIHx8IFNfSVNCTEsobW9kZSkgfHwgaW5vZGUtPmlfYmxvY2tzKSB7CisJCWZvciAoaSA9IDA7IGkgPCAoVUZTX05EQUREUiArIFVGU19OSU5ESVIpOyBpKyspCisJCQl1ZnNpLT5pX3UxLnUyX2lfZGF0YVtpXSA9CisJCQkJdWZzMl9pbm9kZS0+dWlfdTIudWlfYWRkci51aV9kYltpXTsKKwl9CisJZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCAoVUZTX05EQUREUiArIFVGU19OSU5ESVIpICogNDsgaSsrKQorCQkJdWZzaS0+aV91MS5pX3N5bWxpbmtbaV0gPSB1ZnMyX2lub2RlLT51aV91Mi51aV9zeW1saW5rW2ldOworCX0KKwl1ZnNpLT5pX29zeW5jID0gMDsKKworCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKSB7CisJCWlub2RlLT5pX29wID0gJnVmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX2ZvcCA9ICZ1ZnNfZmlsZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZ1ZnNfYW9wczsKKwl9IGVsc2UgaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaW5vZGUtPmlfb3AgPSAmdWZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9mb3AgPSAmdWZzX2Rpcl9vcGVyYXRpb25zOworCX0gZWxzZSBpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkgeworCQlpZiAoIWlub2RlLT5pX2Jsb2NrcykKKwkJCWlub2RlLT5pX29wID0gJnVmc19mYXN0X3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJZWxzZSB7CisJCQlpbm9kZS0+aV9vcCA9ICZwYWdlX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJnVmc19hb3BzOworCQl9CisJfSBlbHNlICAgLyogVE9ETyAgOiBoZXJlIC4uLiovCisJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwKKwkJCXVmc19nZXRfaW5vZGVfZGV2KHNiLCB1ZnNpKSk7CisKKwlicmVsc2UoYmgpOworCisJVUZTRCgoIkVYSVRcbiIpKQorCXJldHVybjsKK30KKworc3RhdGljIGludCB1ZnNfdXBkYXRlX2lub2RlKHN0cnVjdCBpbm9kZSAqIGlub2RlLCBpbnQgZG9fc3luYykKK3sKKwlzdHJ1Y3QgdWZzX2lub2RlX2luZm8gKnVmc2kgPSBVRlNfSShpbm9kZSk7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCXN0cnVjdCB1ZnNfaW5vZGUgKiB1ZnNfaW5vZGU7CisJdW5zaWduZWQgaTsKKwl1bnNpZ25lZCBmbGFnczsKKworCVVGU0QoKCJFTlRFUiwgaW5vICVsdVxuIiwgaW5vZGUtPmlfaW5vKSkKKworCXNiID0gaW5vZGUtPmlfc2I7CisJdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKKwlmbGFncyA9IFVGU19TQihzYiktPnNfZmxhZ3M7CisKKwlpZiAoaW5vZGUtPmlfaW5vIDwgVUZTX1JPT1RJTk8gfHwgCisJICAgIGlub2RlLT5pX2lubyA+ICh1c3BpLT5zX25jZyAqIHVzcGktPnNfaXBnKSkgeworCQl1ZnNfd2FybmluZyAoc2IsICJ1ZnNfcmVhZF9pbm9kZSIsICJiYWQgaW5vZGUgbnVtYmVyICglbHUpXG4iLCBpbm9kZS0+aV9pbm8pOworCQlyZXR1cm4gLTE7CisJfQorCisJYmggPSBzYl9icmVhZChzYiwgdWZzX2lub3RvZnNiYShpbm9kZS0+aV9pbm8pKTsKKwlpZiAoIWJoKSB7CisJCXVmc193YXJuaW5nIChzYiwgInVmc19yZWFkX2lub2RlIiwgInVuYWJsZSB0byByZWFkIGlub2RlICVsdVxuIiwgaW5vZGUtPmlfaW5vKTsKKwkJcmV0dXJuIC0xOworCX0KKwl1ZnNfaW5vZGUgPSAoc3RydWN0IHVmc19pbm9kZSAqKSAoYmgtPmJfZGF0YSArIHVmc19pbm90b2ZzYm8oaW5vZGUtPmlfaW5vKSAqIHNpemVvZihzdHJ1Y3QgdWZzX2lub2RlKSk7CisKKwl1ZnNfaW5vZGUtPnVpX21vZGUgPSBjcHVfdG9fZnMxNihzYiwgaW5vZGUtPmlfbW9kZSk7CisJdWZzX2lub2RlLT51aV9ubGluayA9IGNwdV90b19mczE2KHNiLCBpbm9kZS0+aV9ubGluayk7CisKKwl1ZnNfc2V0X2lub2RlX3VpZChzYiwgdWZzX2lub2RlLCBpbm9kZS0+aV91aWQpOworCXVmc19zZXRfaW5vZGVfZ2lkKHNiLCB1ZnNfaW5vZGUsIGlub2RlLT5pX2dpZCk7CisJCQorCXVmc19pbm9kZS0+dWlfc2l6ZSA9IGNwdV90b19mczY0KHNiLCBpbm9kZS0+aV9zaXplKTsKKwl1ZnNfaW5vZGUtPnVpX2F0aW1lLnR2X3NlYyA9IGNwdV90b19mczMyKHNiLCBpbm9kZS0+aV9hdGltZS50dl9zZWMpOworCXVmc19pbm9kZS0+dWlfYXRpbWUudHZfdXNlYyA9IDA7CisJdWZzX2lub2RlLT51aV9jdGltZS50dl9zZWMgPSBjcHVfdG9fZnMzMihzYiwgaW5vZGUtPmlfY3RpbWUudHZfc2VjKTsKKwl1ZnNfaW5vZGUtPnVpX2N0aW1lLnR2X3VzZWMgPSAwOworCXVmc19pbm9kZS0+dWlfbXRpbWUudHZfc2VjID0gY3B1X3RvX2ZzMzIoc2IsIGlub2RlLT5pX210aW1lLnR2X3NlYyk7CisJdWZzX2lub2RlLT51aV9tdGltZS50dl91c2VjID0gMDsKKwl1ZnNfaW5vZGUtPnVpX2Jsb2NrcyA9IGNwdV90b19mczMyKHNiLCBpbm9kZS0+aV9ibG9ja3MpOworCXVmc19pbm9kZS0+dWlfZmxhZ3MgPSBjcHVfdG9fZnMzMihzYiwgdWZzaS0+aV9mbGFncyk7CisJdWZzX2lub2RlLT51aV9nZW4gPSBjcHVfdG9fZnMzMihzYiwgdWZzaS0+aV9nZW4pOworCisJaWYgKChmbGFncyAmIFVGU19VSURfTUFTSykgPT0gVUZTX1VJRF9FRlQpIHsKKwkJdWZzX2lub2RlLT51aV91My51aV9zdW4udWlfc2hhZG93ID0gY3B1X3RvX2ZzMzIoc2IsIHVmc2ktPmlfc2hhZG93KTsKKwkJdWZzX2lub2RlLT51aV91My51aV9zdW4udWlfb2VmdGZsYWcgPSBjcHVfdG9fZnMzMihzYiwgdWZzaS0+aV9vZWZ0ZmxhZyk7CisJfQorCisJaWYgKFNfSVNDSFIoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0JMSyhpbm9kZS0+aV9tb2RlKSkgeworCQkvKiB1ZnNfaW5vZGUtPnVpX3UyLnVpX2FkZHIudWlfZGJbMF0gPSBjcHVfdG9fZnMzMihzYiwgaW5vZGUtPmlfcmRldik7ICovCisJCXVmc19pbm9kZS0+dWlfdTIudWlfYWRkci51aV9kYlswXSA9IHVmc2ktPmlfdTEuaV9kYXRhWzBdOworCX0gZWxzZSBpZiAoaW5vZGUtPmlfYmxvY2tzKSB7CisJCWZvciAoaSA9IDA7IGkgPCAoVUZTX05EQUREUiArIFVGU19OSU5ESVIpOyBpKyspCisJCQl1ZnNfaW5vZGUtPnVpX3UyLnVpX2FkZHIudWlfZGJbaV0gPSB1ZnNpLT5pX3UxLmlfZGF0YVtpXTsKKwl9CisJZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCAoVUZTX05EQUREUiArIFVGU19OSU5ESVIpICogNDsgaSsrKQorCQkJdWZzX2lub2RlLT51aV91Mi51aV9zeW1saW5rW2ldID0gdWZzaS0+aV91MS5pX3N5bWxpbmtbaV07CisJfQorCisJaWYgKCFpbm9kZS0+aV9ubGluaykKKwkJbWVtc2V0ICh1ZnNfaW5vZGUsIDAsIHNpemVvZihzdHJ1Y3QgdWZzX2lub2RlKSk7CisJCQorCW1hcmtfYnVmZmVyX2RpcnR5KGJoKTsKKwlpZiAoZG9fc3luYykKKwkJc3luY19kaXJ0eV9idWZmZXIoYmgpOworCWJyZWxzZSAoYmgpOworCQorCVVGU0QoKCJFWElUXG4iKSkKKwlyZXR1cm4gMDsKK30KKworaW50IHVmc193cml0ZV9pbm9kZSAoc3RydWN0IGlub2RlICogaW5vZGUsIGludCB3YWl0KQoreworCWludCByZXQ7CisJbG9ja19rZXJuZWwoKTsKKwlyZXQgPSB1ZnNfdXBkYXRlX2lub2RlIChpbm9kZSwgd2FpdCk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXQ7Cit9CisKK2ludCB1ZnNfc3luY19pbm9kZSAoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gdWZzX3VwZGF0ZV9pbm9kZSAoaW5vZGUsIDEpOworfQorCit2b2lkIHVmc19kZWxldGVfaW5vZGUgKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCS8qVUZTX0koaW5vZGUpLT5pX2R0aW1lID0gQ1VSUkVOVF9USU1FOyovCisJbG9ja19rZXJuZWwoKTsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwl1ZnNfdXBkYXRlX2lub2RlKGlub2RlLCBJU19TWU5DKGlub2RlKSk7CisJaW5vZGUtPmlfc2l6ZSA9IDA7CisJaWYgKGlub2RlLT5pX2Jsb2NrcykKKwkJdWZzX3RydW5jYXRlIChpbm9kZSk7CisJdWZzX2ZyZWVfaW5vZGUgKGlub2RlKTsKKwl1bmxvY2tfa2VybmVsKCk7Cit9CmRpZmYgLS1naXQgYS9mcy91ZnMvbmFtZWkuYyBiL2ZzL3Vmcy9uYW1laS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NThjZGUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy91ZnMvbmFtZWkuYwpAQCAtMCwwICsxLDM3NSBAQAorLyoKKyAqIGxpbnV4L2ZzL3Vmcy9uYW1laS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4CisgKiBEYW5pZWwgUGlya2wgPGRhbmllbC5waXJrbEBlbWFpbC5jej4KKyAqIENoYXJsZXMgVW5pdmVyc2l0eSwgRmFjdWx0eSBvZiBNYXRoZW1hdGljcyBhbmQgUGh5c2ljcworICoKKyAqICBmcm9tCisgKgorICogIGxpbnV4L2ZzL2V4dDIvbmFtZWkuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MiwgMTk5MywgMTk5NCwgMTk5NQorICogUmVteSBDYXJkIChjYXJkQG1hc2kuaWJwLmZyKQorICogTGFib3JhdG9pcmUgTUFTSSAtIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqIFVuaXZlcnNpdGUgUGllcnJlIGV0IE1hcmllIEN1cmllIChQYXJpcyBWSSkKKyAqCisgKiAgZnJvbQorICoKKyAqICBsaW51eC9mcy9taW5peC9uYW1laS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqCisgKiAgQmlnLWVuZGlhbiB0byBsaXR0bGUtZW5kaWFuIGJ5dGUtc3dhcHBpbmcvYml0bWFwcyBieQorICogICAgICAgIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSksIDE5OTUKKyAqLworCisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdWZzX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgInN3YWIuaCIJLyogd2lsbCBnbyBhd2F5IC0gc2VlIGNvbW1lbnQgaW4gbWtub2QoKSAqLworI2luY2x1ZGUgInV0aWwuaCIKKworLyoKKyN1bmRlZiBVRlNfTkFNRUlfREVCVUcKKyovCisjZGVmaW5lIFVGU19OQU1FSV9ERUJVRworCisjaWZkZWYgVUZTX05BTUVJX0RFQlVHCisjZGVmaW5lIFVGU0QoeCkgcHJpbnRrKCIoJXMsICVkKSwgJXM6ICIsIF9fRklMRV9fLCBfX0xJTkVfXywgX19GVU5DVElPTl9fKTsgcHJpbnRrIHg7CisjZWxzZQorI2RlZmluZSBVRlNEKHgpCisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkIHVmc19pbmNfY291bnQoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpbm9kZS0+aV9ubGluaysrOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdWZzX2RlY19jb3VudChzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlub2RlLT5pX25saW5rLS07CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHVmc19hZGRfbm9uZGlyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpbnQgZXJyID0gdWZzX2FkZF9saW5rKGRlbnRyeSwgaW5vZGUpOworCWlmICghZXJyKSB7CisJCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CisJCXJldHVybiAwOworCX0KKwl1ZnNfZGVjX2NvdW50KGlub2RlKTsKKwlpcHV0KGlub2RlKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqdWZzX2xvb2t1cChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBOVUxMOworCWlub190IGlubzsKKwkKKwlpZiAoZGVudHJ5LT5kX25hbWUubGVuID4gVUZTX01BWE5BTUxFTikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7CisKKwlsb2NrX2tlcm5lbCgpOworCWlubyA9IHVmc19pbm9kZV9ieV9uYW1lKGRpciwgZGVudHJ5KTsKKwlpZiAoaW5vKSB7CisJCWlub2RlID0gaWdldChkaXItPmlfc2IsIGlubyk7CisJCWlmICghaW5vZGUpIHsKKwkJCXVubG9ja19rZXJuZWwoKTsKKwkJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworCQl9CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlkX2FkZChkZW50cnksIGlub2RlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIEJ5IHRoZSB0aW1lIHRoaXMgaXMgY2FsbGVkLCB3ZSBhbHJlYWR5IGhhdmUgY3JlYXRlZAorICogdGhlIGRpcmVjdG9yeSBjYWNoZSBlbnRyeSBmb3IgdGhlIG5ldyBmaWxlLCBidXQgaXQKKyAqIGlzIHNvIGZhciBuZWdhdGl2ZSAtIGl0IGhhcyBubyBpbm9kZS4KKyAqCisgKiBJZiB0aGUgY3JlYXRlIHN1Y2NlZWRzLCB3ZSBmaWxsIGluIHRoZSBpbm9kZSBpbmZvcm1hdGlvbgorICogd2l0aCBkX2luc3RhbnRpYXRlKCkuIAorICovCitzdGF0aWMgaW50IHVmc19jcmVhdGUgKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgaW50IG1vZGUsCisJCXN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXN0cnVjdCBpbm9kZSAqIGlub2RlID0gdWZzX25ld19pbm9kZShkaXIsIG1vZGUpOworCWludCBlcnIgPSBQVFJfRVJSKGlub2RlKTsKKwlpZiAoIUlTX0VSUihpbm9kZSkpIHsKKwkJaW5vZGUtPmlfb3AgPSAmdWZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJnVmc19maWxlX29wZXJhdGlvbnM7CisJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJnVmc19hb3BzOworCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJbG9ja19rZXJuZWwoKTsKKwkJZXJyID0gdWZzX2FkZF9ub25kaXIoZGVudHJ5LCBpbm9kZSk7CisJCXVubG9ja19rZXJuZWwoKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB1ZnNfbWtub2QgKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBpbnQgbW9kZSwgZGV2X3QgcmRldikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCWludCBlcnI7CisKKwlpZiAoIW9sZF92YWxpZF9kZXYocmRldikpCisJCXJldHVybiAtRUlOVkFMOworCWlub2RlID0gdWZzX25ld19pbm9kZShkaXIsIG1vZGUpOworCWVyciA9IFBUUl9FUlIoaW5vZGUpOworCWlmICghSVNfRVJSKGlub2RlKSkgeworCQlpbml0X3NwZWNpYWxfaW5vZGUoaW5vZGUsIG1vZGUsIHJkZXYpOworCQkvKiBOT1RFOiB0aGF0J2xsIGdvIHdoZW4gd2UgZ2V0IHdpZGUgZGV2X3QgKi8KKwkJdWZzX3NldF9pbm9kZV9kZXYoaW5vZGUtPmlfc2IsIFVGU19JKGlub2RlKSwgcmRldik7CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCQlsb2NrX2tlcm5lbCgpOworCQllcnIgPSB1ZnNfYWRkX25vbmRpcihkZW50cnksIGlub2RlKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHVmc19zeW1saW5rIChzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKiBkZW50cnksCisJY29uc3QgY2hhciAqIHN5bW5hbWUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2IgPSBkaXItPmlfc2I7CisJaW50IGVyciA9IC1FTkFNRVRPT0xPTkc7CisJdW5zaWduZWQgbCA9IHN0cmxlbihzeW1uYW1lKSsxOworCXN0cnVjdCBpbm9kZSAqIGlub2RlOworCisJaWYgKGwgPiBzYi0+c19ibG9ja3NpemUpCisJCWdvdG8gb3V0OworCisJbG9ja19rZXJuZWwoKTsKKwlpbm9kZSA9IHVmc19uZXdfaW5vZGUoZGlyLCBTX0lGTE5LIHwgU19JUldYVUdPKTsKKwllcnIgPSBQVFJfRVJSKGlub2RlKTsKKwlpZiAoSVNfRVJSKGlub2RlKSkKKwkJZ290byBvdXQ7CisKKwlpZiAobCA+IFVGU19TQihzYiktPnNfdXNwaS0+c19tYXhzeW1saW5rbGVuKSB7CisJCS8qIHNsb3cgc3ltbGluayAqLworCQlpbm9kZS0+aV9vcCA9ICZwYWdlX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmdWZzX2FvcHM7CisJCWVyciA9IHBhZ2Vfc3ltbGluayhpbm9kZSwgc3ltbmFtZSwgbCk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dF9mYWlsOworCX0gZWxzZSB7CisJCS8qIGZhc3Qgc3ltbGluayAqLworCQlpbm9kZS0+aV9vcCA9ICZ1ZnNfZmFzdF9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisJCW1lbWNweSgoY2hhciopJlVGU19JKGlub2RlKS0+aV91MS5pX2RhdGEsc3ltbmFtZSxsKTsKKwkJaW5vZGUtPmlfc2l6ZSA9IGwtMTsKKwl9CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisKKwllcnIgPSB1ZnNfYWRkX25vbmRpcihkZW50cnksIGlub2RlKTsKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycjsKKworb3V0X2ZhaWw6CisJdWZzX2RlY19jb3VudChpbm9kZSk7CisJaXB1dChpbm9kZSk7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyBpbnQgdWZzX2xpbmsgKHN0cnVjdCBkZW50cnkgKiBvbGRfZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKiBkaXIsCisJc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBvbGRfZGVudHJ5LT5kX2lub2RlOworCWludCBlcnJvcjsKKworCWxvY2tfa2VybmVsKCk7CisJaWYgKGlub2RlLT5pX25saW5rID49IFVGU19MSU5LX01BWCkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRU1MSU5LOworCX0KKworCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwl1ZnNfaW5jX2NvdW50KGlub2RlKTsKKwlhdG9taWNfaW5jKCZpbm9kZS0+aV9jb3VudCk7CisKKwllcnJvciA9IHVmc19hZGRfbm9uZGlyKGRlbnRyeSwgaW5vZGUpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgdWZzX21rZGlyKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqIGRlbnRyeSwgaW50IG1vZGUpCit7CisJc3RydWN0IGlub2RlICogaW5vZGU7CisJaW50IGVyciA9IC1FTUxJTks7CisKKwlpZiAoZGlyLT5pX25saW5rID49IFVGU19MSU5LX01BWCkKKwkJZ290byBvdXQ7CisKKwlsb2NrX2tlcm5lbCgpOworCXVmc19pbmNfY291bnQoZGlyKTsKKworCWlub2RlID0gdWZzX25ld19pbm9kZShkaXIsIFNfSUZESVJ8bW9kZSk7CisJZXJyID0gUFRSX0VSUihpbm9kZSk7CisJaWYgKElTX0VSUihpbm9kZSkpCisJCWdvdG8gb3V0X2RpcjsKKworCWlub2RlLT5pX29wID0gJnVmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9mb3AgPSAmdWZzX2Rpcl9vcGVyYXRpb25zOworCisJdWZzX2luY19jb3VudChpbm9kZSk7CisKKwllcnIgPSB1ZnNfbWFrZV9lbXB0eShpbm9kZSwgZGlyKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mYWlsOworCisJZXJyID0gdWZzX2FkZF9saW5rKGRlbnRyeSwgaW5vZGUpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2ZhaWw7CisJdW5sb2NrX2tlcm5lbCgpOworCisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKK291dDoKKwlyZXR1cm4gZXJyOworCitvdXRfZmFpbDoKKwl1ZnNfZGVjX2NvdW50KGlub2RlKTsKKwl1ZnNfZGVjX2NvdW50KGlub2RlKTsKKwlpcHV0IChpbm9kZSk7CitvdXRfZGlyOgorCXVmc19kZWNfY291bnQoZGlyKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyBpbnQgdWZzX3VubGluayhzdHJ1Y3QgaW5vZGUgKiBkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgaW5vZGUgKiBpbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBiaDsKKwlzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqIGRlOworCWludCBlcnIgPSAtRU5PRU5UOworCisJbG9ja19rZXJuZWwoKTsKKwlkZSA9IHVmc19maW5kX2VudHJ5IChkZW50cnksICZiaCk7CisJaWYgKCFkZSkKKwkJZ290byBvdXQ7CisKKwllcnIgPSB1ZnNfZGVsZXRlX2VudHJ5IChkaXIsIGRlLCBiaCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlpbm9kZS0+aV9jdGltZSA9IGRpci0+aV9jdGltZTsKKwl1ZnNfZGVjX2NvdW50KGlub2RlKTsKKwllcnIgPSAwOworb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHVmc19ybWRpciAoc3RydWN0IGlub2RlICogZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGlub2RlICogaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJaW50IGVycj0gLUVOT1RFTVBUWTsKKworCWxvY2tfa2VybmVsKCk7CisJaWYgKHVmc19lbXB0eV9kaXIgKGlub2RlKSkgeworCQllcnIgPSB1ZnNfdW5saW5rKGRpciwgZGVudHJ5KTsKKwkJaWYgKCFlcnIpIHsKKwkJCWlub2RlLT5pX3NpemUgPSAwOworCQkJdWZzX2RlY19jb3VudChpbm9kZSk7CisJCQl1ZnNfZGVjX2NvdW50KGRpcik7CisJCX0KKwl9CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdWZzX3JlbmFtZSAoc3RydWN0IGlub2RlICogb2xkX2Rpciwgc3RydWN0IGRlbnRyeSAqIG9sZF9kZW50cnksCisJc3RydWN0IGlub2RlICogbmV3X2RpciwJc3RydWN0IGRlbnRyeSAqIG5ld19kZW50cnkgKQoreworCXN0cnVjdCBpbm9kZSAqb2xkX2lub2RlID0gb2xkX2RlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKm5ld19pbm9kZSA9IG5ld19kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaXJfYmggPSBOVUxMOworCXN0cnVjdCB1ZnNfZGlyX2VudHJ5ICpkaXJfZGUgPSBOVUxMOworCXN0cnVjdCBidWZmZXJfaGVhZCAqb2xkX2JoOworCXN0cnVjdCB1ZnNfZGlyX2VudHJ5ICpvbGRfZGU7CisJaW50IGVyciA9IC1FTk9FTlQ7CisKKwlsb2NrX2tlcm5lbCgpOworCW9sZF9kZSA9IHVmc19maW5kX2VudHJ5IChvbGRfZGVudHJ5LCAmb2xkX2JoKTsKKwlpZiAoIW9sZF9kZSkKKwkJZ290byBvdXQ7CisKKwlpZiAoU19JU0RJUihvbGRfaW5vZGUtPmlfbW9kZSkpIHsKKwkJZXJyID0gLUVJTzsKKwkJZGlyX2RlID0gdWZzX2RvdGRvdChvbGRfaW5vZGUsICZkaXJfYmgpOworCQlpZiAoIWRpcl9kZSkKKwkJCWdvdG8gb3V0X29sZDsKKwl9CisKKwlpZiAobmV3X2lub2RlKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZCAqbmV3X2JoOworCQlzdHJ1Y3QgdWZzX2Rpcl9lbnRyeSAqbmV3X2RlOworCisJCWVyciA9IC1FTk9URU1QVFk7CisJCWlmIChkaXJfZGUgJiYgIXVmc19lbXB0eV9kaXIgKG5ld19pbm9kZSkpCisJCQlnb3RvIG91dF9kaXI7CisJCWVyciA9IC1FTk9FTlQ7CisJCW5ld19kZSA9IHVmc19maW5kX2VudHJ5IChuZXdfZGVudHJ5LCAmbmV3X2JoKTsKKwkJaWYgKCFuZXdfZGUpCisJCQlnb3RvIG91dF9kaXI7CisJCXVmc19pbmNfY291bnQob2xkX2lub2RlKTsKKwkJdWZzX3NldF9saW5rKG5ld19kaXIsIG5ld19kZSwgbmV3X2JoLCBvbGRfaW5vZGUpOworCQluZXdfaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCQlpZiAoZGlyX2RlKQorCQkJbmV3X2lub2RlLT5pX25saW5rLS07CisJCXVmc19kZWNfY291bnQobmV3X2lub2RlKTsKKwl9IGVsc2UgeworCQlpZiAoZGlyX2RlKSB7CisJCQllcnIgPSAtRU1MSU5LOworCQkJaWYgKG5ld19kaXItPmlfbmxpbmsgPj0gVUZTX0xJTktfTUFYKQorCQkJCWdvdG8gb3V0X2RpcjsKKwkJfQorCQl1ZnNfaW5jX2NvdW50KG9sZF9pbm9kZSk7CisJCWVyciA9IHVmc19hZGRfbGluayhuZXdfZGVudHJ5LCBvbGRfaW5vZGUpOworCQlpZiAoZXJyKSB7CisJCQl1ZnNfZGVjX2NvdW50KG9sZF9pbm9kZSk7CisJCQlnb3RvIG91dF9kaXI7CisJCX0KKwkJaWYgKGRpcl9kZSkKKwkJCXVmc19pbmNfY291bnQobmV3X2Rpcik7CisJfQorCisJdWZzX2RlbGV0ZV9lbnRyeSAob2xkX2Rpciwgb2xkX2RlLCBvbGRfYmgpOworCisJdWZzX2RlY19jb3VudChvbGRfaW5vZGUpOworCisJaWYgKGRpcl9kZSkgeworCQl1ZnNfc2V0X2xpbmsob2xkX2lub2RlLCBkaXJfZGUsIGRpcl9iaCwgbmV3X2Rpcik7CisJCXVmc19kZWNfY291bnQob2xkX2Rpcik7CisJfQorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKKworb3V0X2RpcjoKKwlpZiAoZGlyX2RlKQorCQlicmVsc2UoZGlyX2JoKTsKK291dF9vbGQ6CisJYnJlbHNlIChvbGRfYmgpOworb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyOworfQorCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyB1ZnNfZGlyX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLmNyZWF0ZQkJPSB1ZnNfY3JlYXRlLAorCS5sb29rdXAJCT0gdWZzX2xvb2t1cCwKKwkubGluawkJPSB1ZnNfbGluaywKKwkudW5saW5rCQk9IHVmc191bmxpbmssCisJLnN5bWxpbmsJPSB1ZnNfc3ltbGluaywKKwkubWtkaXIJCT0gdWZzX21rZGlyLAorCS5ybWRpcgkJPSB1ZnNfcm1kaXIsCisJLm1rbm9kCQk9IHVmc19ta25vZCwKKwkucmVuYW1lCQk9IHVmc19yZW5hbWUsCit9OwpkaWZmIC0tZ2l0IGEvZnMvdWZzL3N1cGVyLmMgYi9mcy91ZnMvc3VwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDM2ZDY5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvdWZzL3N1cGVyLmMKQEAgLTAsMCArMSwxMzQ3IEBACisvKgorICogIGxpbnV4L2ZzL3Vmcy9zdXBlci5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4CisgKiBEYW5pZWwgUGlya2wgPGRhbmllbC5waXJrbEBlbWFpbC5jej4KKyAqIENoYXJsZXMgVW5pdmVyc2l0eSwgRmFjdWx0eSBvZiBNYXRoZW1hdGljcyBhbmQgUGh5c2ljcworICovCisKKy8qIERlcml2ZWQgZnJvbQorICoKKyAqICBsaW51eC9mcy9leHQyL3N1cGVyLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUKKyAqIFJlbXkgQ2FyZCAoY2FyZEBtYXNpLmlicC5mcikKKyAqIExhYm9yYXRvaXJlIE1BU0kgLSBJbnN0aXR1dCBCbGFpc2UgUGFzY2FsCisgKiBVbml2ZXJzaXRlIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpCisgKgorICogIGZyb20KKyAqCisgKiAgbGludXgvZnMvbWluaXgvaW5vZGUuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKgorICogIEJpZy1lbmRpYW4gdG8gbGl0dGxlLWVuZGlhbiBieXRlLXN3YXBwaW5nL2JpdG1hcHMgYnkKKyAqICAgICAgICBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQGNhaXAucnV0Z2Vycy5lZHUpLCAxOTk1CisgKi8KKyAKKy8qCisgKiBJbnNwaXJlZCBieQorICoKKyAqICBsaW51eC9mcy91ZnMvc3VwZXIuYworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NgorICogQWRyaWFuIFJvZHJpZ3VleiAoYWRyaWFuQGZyYW5rbGlucy10b3dlci5ydXRnZXJzLmVkdSkKKyAqIExhYm9yYXRvcnkgZm9yIENvbXB1dGVyIFNjaWVuY2UgUmVzZWFyY2ggQ29tcHV0aW5nIEZhY2lsaXR5CisgKiBSdXRnZXJzLCBUaGUgU3RhdGUgVW5pdmVyc2l0eSBvZiBOZXcgSmVyc2V5CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2ICBFZGRpZSBDLiBEb3N0ICAoZWNkQHNreW5ldC5iZSkKKyAqCisgKiBLZXJuZWwgbW9kdWxlIHN1cHBvcnQgYWRkZWQgb24gOTYvMDQvMjYgYnkKKyAqIFN0ZWZhbiBSZWluYXVlciA8c3RlcGFuQGhvbWUuY3VsdHVyZS5taXB0LnJ1PgorICoKKyAqIE1vZHVsZSB1c2FnZSBjb3VudHMgYWRkZWQgb24gOTYvMDQvMjkgYnkKKyAqIEdlcnRqYW4gdmFuIFdpbmdlcmRlIDxnZXJ0amFuQGNzLnZ1Lm5sPgorICoKKyAqIENsZWFuIHN3YWIgc3VwcG9ydCBvbiAxOTk3MDQwNiBieQorICogRnJhbmNvaXMtUmVuZSBSaWRlYXUgPGZhcmVAdHVuZXMub3JnPgorICoKKyAqIDQuNEJTRCAoRnJlZUJTRCkgc3VwcG9ydCBhZGRlZCBvbiBGZWJydWFyeSAxc3QgMTk5OCBieQorICogTmllbHMgS3Jpc3RpYW4gQmVjaCBKZW5zZW4gPG5rYmpAaW1hZ2UuZGs+IHBhcnRpYWxseSBiYXNlZAorICogb24gY29kZSBieSBNYXJ0aW4gdm9uIExvZXdpcyA8bWFydGluQG1pcmEuaXNkbi5jcy50dS1iZXJsaW4uZGU+LgorICoKKyAqIE5lWFRzdGVwIHN1cHBvcnQgYWRkZWQgb24gRmVicnVhcnkgNXRoIDE5OTggYnkKKyAqIE5pZWxzIEtyaXN0aWFuIEJlY2ggSmVuc2VuIDxua2JqQGltYWdlLmRrPi4KKyAqCisgKiB3cml0ZSBzdXBwb3J0IERhbmllbCBQaXJrbCA8ZGFuaWVsLnBpcmtsQGVtYWlsLmN6PiAxOTk4CisgKiAKKyAqIEhQL1VYIGhmcyBmaWxlc3lzdGVtIHN1cHBvcnQgYWRkZWQgYnkKKyAqIE1hcnRpbiBLLiBQZXRlcnNlbiA8bWtwQG1rcC5uZXQ+LCBBdWd1c3QgMTk5OQorICoKKyAqIFVGUzIgKG9mIEZyZWVCU0QgNS54KSBzdXBwb3J0IGFkZGVkIGJ5CisgKiBOaXJhaiBLdW1hciA8bmlyYWoxN0BpaXRib21iYXkub3JnPiwgSmFuIDIwMDQKKyAqCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Vmc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJzZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvdmZzLmg+CisKKyNpbmNsdWRlICJzd2FiLmgiCisjaW5jbHVkZSAidXRpbC5oIgorCisjdW5kZWYgVUZTX1NVUEVSX0RFQlVHCisjdW5kZWYgVUZTX1NVUEVSX0RFQlVHX01PUkUKKworCisjdW5kZWYgVUZTX1NVUEVSX0RFQlVHX01PUkUKKyNpZmRlZiBVRlNfU1VQRVJfREVCVUcKKyNkZWZpbmUgVUZTRCh4KSBwcmludGsoIiglcywgJWQpLCAlczogIiwgX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pOyBwcmludGsgeDsKKyNlbHNlCisjZGVmaW5lIFVGU0QoeCkKKyNlbmRpZgorCisjaWZkZWYgVUZTX1NVUEVSX0RFQlVHX01PUkUKKy8qCisgKiBQcmludCBjb250ZW50cyBvZiB1ZnNfc3VwZXJfYmxvY2ssIHVzZWZ1bCBmb3IgZGVidWdnaW5nCisgKi8KK3ZvaWQgdWZzX3ByaW50X3N1cGVyX3N0dWZmKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJc3RydWN0IHVmc19zdXBlcl9ibG9ja19maXJzdCAqIHVzYjEsCisJc3RydWN0IHVmc19zdXBlcl9ibG9ja19zZWNvbmQgKiB1c2IyLCAKKwlzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX3RoaXJkICogdXNiMykKK3sKKwlwcmludGsoInVmc19wcmludF9zdXBlcl9zdHVmZlxuIik7CisJcHJpbnRrKCJzaXplIG9mIHVzYjogICAgICV1XG4iLCBzaXplb2Yoc3RydWN0IHVmc19zdXBlcl9ibG9jaykpOworCXByaW50aygiICBtYWdpYzogICAgICAgICAweCV4XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMy0+ZnNfbWFnaWMpKTsKKwlwcmludGsoIiAgc2Jsa25vOiAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19zYmxrbm8pKTsKKwlwcmludGsoIiAgY2Jsa25vOiAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jYmxrbm8pKTsKKwlwcmludGsoIiAgaWJsa25vOiAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19pYmxrbm8pKTsKKwlwcmludGsoIiAgZGJsa25vOiAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19kYmxrbm8pKTsKKwlwcmludGsoIiAgY2dvZmZzZXQ6ICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jZ29mZnNldCkpOworCXByaW50aygiICB+Y2dtYXNrOiAgICAgICAweCV4XG4iLCB+ZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2NnbWFzaykpOworCXByaW50aygiICBzaXplOiAgICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX3NpemUpKTsKKwlwcmludGsoIiAgZHNpemU6ICAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19kc2l6ZSkpOworCXByaW50aygiICBuY2c6ICAgICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX25jZykpOworCXByaW50aygiICBic2l6ZTogICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2JzaXplKSk7CisJcHJpbnRrKCIgIGZzaXplOiAgICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZnNpemUpKTsKKwlwcmludGsoIiAgZnJhZzogICAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19mcmFnKSk7CisJcHJpbnRrKCIgIGZyYWdzaGlmdDogICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZnJhZ3NoaWZ0KSk7CisJcHJpbnRrKCIgIH5mbWFzazogICAgICAgICV1XG4iLCB+ZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2ZtYXNrKSk7CisJcHJpbnRrKCIgIGZzaGlmdDogICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZnNoaWZ0KSk7CisJcHJpbnRrKCIgIHNic2l6ZTogICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfc2JzaXplKSk7CisJcHJpbnRrKCIgIHNwYzogICAgICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfc3BjKSk7CisJcHJpbnRrKCIgIGNwZzogICAgICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY3BnKSk7CisJcHJpbnRrKCIgIGlwZzogICAgICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfaXBnKSk7CisJcHJpbnRrKCIgIGZwZzogICAgICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZnBnKSk7CisJcHJpbnRrKCIgIGNzYWRkcjogICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY3NhZGRyKSk7CisJcHJpbnRrKCIgIGNzc2l6ZTogICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY3NzaXplKSk7CisJcHJpbnRrKCIgIGNnc2l6ZTogICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY2dzaXplKSk7CisJcHJpbnRrKCIgIGZzdG9kYjogICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZnNidG9kYikpOworCXByaW50aygiICBjb250aWdzdW1zaXplOiAlZFxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjMtPmZzX3UyLmZzXzQ0LmZzX2NvbnRpZ3N1bXNpemUpKTsKKwlwcmludGsoIiAgcG9zdGJsZm9ybWF0OiAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IzLT5mc19wb3N0Ymxmb3JtYXQpKTsKKwlwcmludGsoIiAgbnJwb3M6ICAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IzLT5mc19ucnBvcykpOworCXByaW50aygiICBuZGlyICAgICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2NzdG90YWwuY3NfbmRpcikpOworCXByaW50aygiICBuaWZyZWUgICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2NzdG90YWwuY3NfbmlmcmVlKSk7CisJcHJpbnRrKCIgIG5iZnJlZSAgICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY3N0b3RhbC5jc19uYmZyZWUpKTsKKwlwcmludGsoIiAgbmZmcmVlICAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jc3RvdGFsLmNzX25mZnJlZSkpOworCXByaW50aygiXG4iKTsKK30KKworLyoKKyAqIFByaW50IGNvbnRlbnRzIG9mIHVmczIgdWZzX3N1cGVyX2Jsb2NrLCB1c2VmdWwgZm9yIGRlYnVnZ2luZworICovCit2b2lkIHVmczJfcHJpbnRfc3VwZXJfc3R1ZmYoCisgICAgIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisgICAgICBzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrICp1c2IpCit7CisJcHJpbnRrKCJ1ZnNfcHJpbnRfc3VwZXJfc3R1ZmZcbiIpOworCXByaW50aygic2l6ZSBvZiB1c2I6ICAgICAldVxuIiwgc2l6ZW9mKHN0cnVjdCB1ZnNfc3VwZXJfYmxvY2spKTsKKwlwcmludGsoIiAgbWFnaWM6ICAgICAgICAgMHgleFxuIiwgZnMzMl90b19jcHUoc2IsIHVzYi0+ZnNfbWFnaWMpKTsKKwlwcmludGsoIiAgZnNfc2l6ZTogICAldVxuIixmczY0X3RvX2NwdShzYiwgdXNiLT5mc191MTEuZnNfdTIuZnNfc2l6ZSkpOworCXByaW50aygiICBmc19kc2l6ZTogICV1XG4iLGZzNjRfdG9fY3B1KHNiLCB1c2ItPmZzX3UxMS5mc191Mi5mc19kc2l6ZSkpOworCXByaW50aygiICBic2l6ZTogICAgICAgICAldVxuIiwgZnMzMl90b19jcHUodXNiLCB1c2ItPmZzX2JzaXplKSk7CisJcHJpbnRrKCIgIGZzaXplOiAgICAgICAgICV1XG4iLCBmczMyX3RvX2NwdSh1c2IsIHVzYi0+ZnNfZnNpemUpKTsKKwlwcmludGsoIiAgZnNfdm9sbmFtZTogICVzXG4iLCB1c2ItPmZzX3UxMS5mc191Mi5mc192b2xuYW1lKTsKKwlwcmludGsoIiAgZnNfZnNtbnQ6ICAlc1xuIiwgdXNiLT5mc191MTEuZnNfdTIuZnNfZnNtbnQpOworCXByaW50aygiICBmc19zYmxvY2tsb2M6ICV1XG4iLGZzNjRfdG9fY3B1KHNiLAorCQkJdXNiLT5mc191MTEuZnNfdTIuZnNfc2Jsb2NrbG9jKSk7CisJcHJpbnRrKCIgIGNzX25kaXIoTm8gb2YgZGlycyk6ICAldVxuIixmczY0X3RvX2NwdShzYiwKKwkJCXVzYi0+ZnNfdTExLmZzX3UyLmZzX2NzdG90YWwuY3NfbmRpcikpOworCXByaW50aygiICBjc19uYmZyZWUoTm8gb2YgZnJlZSBibG9ja3MpOiAgJXVcbiIsZnM2NF90b19jcHUoc2IsCisJCQl1c2ItPmZzX3UxMS5mc191Mi5mc19jc3RvdGFsLmNzX25iZnJlZSkpOworCXByaW50aygiXG4iKTsKK30KKworLyoKKyAqIFByaW50IGNvbnRlbnRzIG9mIHVmc19jeWxpbmRlcl9ncm91cCwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcKKyAqLwordm9pZCB1ZnNfcHJpbnRfY3lsaW5kZXJfc3R1ZmYoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IHVmc19jeWxpbmRlcl9ncm91cCAqY2cpCit7CisJcHJpbnRrKCJcbnVmc19wcmludF9jeWxpbmRlcl9zdHVmZlxuIik7CisJcHJpbnRrKCJzaXplIG9mIHVjZzogJXVcbiIsIHNpemVvZihzdHJ1Y3QgdWZzX2N5bGluZGVyX2dyb3VwKSk7CisJcHJpbnRrKCIgIG1hZ2ljOiAgICAgICAgJXhcbiIsIGZzMzJfdG9fY3B1KHNiLCBjZy0+Y2dfbWFnaWMpKTsKKwlwcmludGsoIiAgdGltZTogICAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIGNnLT5jZ190aW1lKSk7CisJcHJpbnRrKCIgIGNneDogICAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCBjZy0+Y2dfY2d4KSk7CisJcHJpbnRrKCIgIG5jeWw6ICAgICAgICAgJXVcbiIsIGZzMTZfdG9fY3B1KHNiLCBjZy0+Y2dfbmN5bCkpOworCXByaW50aygiICBuaWJsazogICAgICAgICV1XG4iLCBmczE2X3RvX2NwdShzYiwgY2ctPmNnX25pYmxrKSk7CisJcHJpbnRrKCIgIG5kYmxrOiAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCBjZy0+Y2dfbmRibGspKTsKKwlwcmludGsoIiAgY3NfbmRpcjogICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIGNnLT5jZ19jcy5jc19uZGlyKSk7CisJcHJpbnRrKCIgIGNzX25iZnJlZTogICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCBjZy0+Y2dfY3MuY3NfbmJmcmVlKSk7CisJcHJpbnRrKCIgIGNzX25pZnJlZTogICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCBjZy0+Y2dfY3MuY3NfbmlmcmVlKSk7CisJcHJpbnRrKCIgIGNzX25mZnJlZTogICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCBjZy0+Y2dfY3MuY3NfbmZmcmVlKSk7CisJcHJpbnRrKCIgIHJvdG9yOiAgICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCBjZy0+Y2dfcm90b3IpKTsKKwlwcmludGsoIiAgZnJvdG9yOiAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIGNnLT5jZ19mcm90b3IpKTsKKwlwcmludGsoIiAgaXJvdG9yOiAgICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIGNnLT5jZ19pcm90b3IpKTsKKwlwcmludGsoIiAgZnJzdW06ICAgICAgICAldSwgJXUsICV1LCAldSwgJXUsICV1LCAldSwgJXVcbiIsCisJICAgIGZzMzJfdG9fY3B1KHNiLCBjZy0+Y2dfZnJzdW1bMF0pLCBmczMyX3RvX2NwdShzYiwgY2ctPmNnX2Zyc3VtWzFdKSwKKwkgICAgZnMzMl90b19jcHUoc2IsIGNnLT5jZ19mcnN1bVsyXSksIGZzMzJfdG9fY3B1KHNiLCBjZy0+Y2dfZnJzdW1bM10pLAorCSAgICBmczMyX3RvX2NwdShzYiwgY2ctPmNnX2Zyc3VtWzRdKSwgZnMzMl90b19jcHUoc2IsIGNnLT5jZ19mcnN1bVs1XSksCisJICAgIGZzMzJfdG9fY3B1KHNiLCBjZy0+Y2dfZnJzdW1bNl0pLCBmczMyX3RvX2NwdShzYiwgY2ctPmNnX2Zyc3VtWzddKSk7CisJcHJpbnRrKCIgIGJ0b3RvZmY6ICAgICAgJXVcbiIsIGZzMzJfdG9fY3B1KHNiLCBjZy0+Y2dfYnRvdG9mZikpOworCXByaW50aygiICBib2ZmOiAgICAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgY2ctPmNnX2JvZmYpKTsKKwlwcmludGsoIiAgaXVzZW9mZjogICAgICAldVxuIiwgZnMzMl90b19jcHUoc2IsIGNnLT5jZ19pdXNlZG9mZikpOworCXByaW50aygiICBmcmVlb2ZmOiAgICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgY2ctPmNnX2ZyZWVvZmYpKTsKKwlwcmludGsoIiAgbmV4dGZyZWVvZmY6ICAldVxuIiwgZnMzMl90b19jcHUoc2IsIGNnLT5jZ19uZXh0ZnJlZW9mZikpOworCXByaW50aygiICBjbHVzdGVyc3Vtb2ZmICV1XG4iLCBmczMyX3RvX2NwdShzYiwgY2ctPmNnX3UuY2dfNDQuY2dfY2x1c3RlcnN1bW9mZikpOworCXByaW50aygiICBjbHVzdGVyb2ZmICAgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgY2ctPmNnX3UuY2dfNDQuY2dfY2x1c3Rlcm9mZikpOworCXByaW50aygiICBuY2x1c3RlcmJsa3MgICV1XG4iLCBmczMyX3RvX2NwdShzYiwgY2ctPmNnX3UuY2dfNDQuY2dfbmNsdXN0ZXJibGtzKSk7CisJcHJpbnRrKCJcbiIpOworfQorI2VuZGlmIC8qIFVGU19TVVBFUl9ERUJVR19NT1JFICovCisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyB1ZnNfc3VwZXJfb3BzOworCitzdGF0aWMgY2hhciBlcnJvcl9idWZbMTAyNF07CisKK3ZvaWQgdWZzX2Vycm9yIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgY29uc3QgY2hhciAqIGZ1bmN0aW9uLAorCWNvbnN0IGNoYXIgKiBmbXQsIC4uLikKK3sKKwlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGk7CisJc3RydWN0IHVmc19zdXBlcl9ibG9ja19maXJzdCAqIHVzYjE7CisJdmFfbGlzdCBhcmdzOworCisJdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKKwl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QoVVNQSV9VQkgpOworCQorCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQl1c2IxLT5mc19jbGVhbiA9IFVGU19GU0JBRDsKKwkJdWJoX21hcmtfYnVmZmVyX2RpcnR5KFVTUElfVUJIKTsKKwkJc2ItPnNfZGlydCA9IDE7CisJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKKwl9CisJdmFfc3RhcnQgKGFyZ3MsIGZtdCk7CisJdnNwcmludGYgKGVycm9yX2J1ZiwgZm10LCBhcmdzKTsKKwl2YV9lbmQgKGFyZ3MpOworCXN3aXRjaCAoVUZTX1NCKHNiKS0+c19tb3VudF9vcHQgJiBVRlNfTU9VTlRfT05FUlJPUikgeworCWNhc2UgVUZTX01PVU5UX09ORVJST1JfUEFOSUM6CisJCXBhbmljICgiVUZTLWZzIHBhbmljIChkZXZpY2UgJXMpOiAlczogJXNcbiIsIAorCQkJc2ItPnNfaWQsIGZ1bmN0aW9uLCBlcnJvcl9idWYpOworCisJY2FzZSBVRlNfTU9VTlRfT05FUlJPUl9MT0NLOgorCWNhc2UgVUZTX01PVU5UX09ORVJST1JfVU1PVU5UOgorCWNhc2UgVUZTX01PVU5UX09ORVJST1JfUkVQQUlSOgorCQlwcmludGsgKEtFUk5fQ1JJVCAiVUZTLWZzIGVycm9yIChkZXZpY2UgJXMpOiAlczogJXNcbiIsCisJCQlzYi0+c19pZCwgZnVuY3Rpb24sIGVycm9yX2J1Zik7CisJfQkJCit9CisKK3ZvaWQgdWZzX3BhbmljIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgY29uc3QgY2hhciAqIGZ1bmN0aW9uLAorCWNvbnN0IGNoYXIgKiBmbXQsIC4uLikKK3sKKwlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGk7CisJc3RydWN0IHVmc19zdXBlcl9ibG9ja19maXJzdCAqIHVzYjE7CisJdmFfbGlzdCBhcmdzOworCQorCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CisJdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0KFVTUElfVUJIKTsKKwkKKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJdXNiMS0+ZnNfY2xlYW4gPSBVRlNfRlNCQUQ7CisJCXViaF9tYXJrX2J1ZmZlcl9kaXJ0eShVU1BJX1VCSCk7CisJCXNiLT5zX2RpcnQgPSAxOworCX0KKwl2YV9zdGFydCAoYXJncywgZm10KTsKKwl2c3ByaW50ZiAoZXJyb3JfYnVmLCBmbXQsIGFyZ3MpOworCXZhX2VuZCAoYXJncyk7CisJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCXByaW50ayAoS0VSTl9DUklUICJVRlMtZnMgcGFuaWMgKGRldmljZSAlcyk6ICVzOiAlc1xuIiwKKwkJc2ItPnNfaWQsIGZ1bmN0aW9uLCBlcnJvcl9idWYpOworfQorCit2b2lkIHVmc193YXJuaW5nIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYiwgY29uc3QgY2hhciAqIGZ1bmN0aW9uLAorCWNvbnN0IGNoYXIgKiBmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisKKwl2YV9zdGFydCAoYXJncywgZm10KTsKKwl2c3ByaW50ZiAoZXJyb3JfYnVmLCBmbXQsIGFyZ3MpOworCXZhX2VuZCAoYXJncyk7CisJcHJpbnRrIChLRVJOX1dBUk5JTkcgIlVGUy1mcyB3YXJuaW5nIChkZXZpY2UgJXMpOiAlczogJXNcbiIsCisJCXNiLT5zX2lkLCBmdW5jdGlvbiwgZXJyb3JfYnVmKTsKK30KKworZW51bSB7CisJT3B0X3R5cGVfb2xkLCBPcHRfdHlwZV9zdW54ODYsIE9wdF90eXBlX3N1biwgT3B0X3R5cGVfNDRic2QsCisJT3B0X3R5cGVfdWZzMiwgT3B0X3R5cGVfaHAsIE9wdF90eXBlX25leHRzdGVwY2QsIE9wdF90eXBlX25leHRzdGVwLAorCU9wdF90eXBlX29wZW5zdGVwLCBPcHRfb25lcnJvcl9wYW5pYywgT3B0X29uZXJyb3JfbG9jaywKKwlPcHRfb25lcnJvcl91bW91bnQsIE9wdF9vbmVycm9yX3JlcGFpciwgT3B0X2VycgorfTsKKworc3RhdGljIG1hdGNoX3RhYmxlX3QgdG9rZW5zID0geworCXtPcHRfdHlwZV9vbGQsICJ1ZnN0eXBlPW9sZCJ9LAorCXtPcHRfdHlwZV9zdW54ODYsICJ1ZnN0eXBlPXN1bng4NiJ9LAorCXtPcHRfdHlwZV9zdW4sICJ1ZnN0eXBlPXN1biJ9LAorCXtPcHRfdHlwZV80NGJzZCwgInVmc3R5cGU9NDRic2QifSwKKwl7T3B0X3R5cGVfdWZzMiwgInVmc3R5cGU9dWZzMiJ9LAorCXtPcHRfdHlwZV91ZnMyLCAidWZzdHlwZT01eGJzZCJ9LAorCXtPcHRfdHlwZV9ocCwgInVmc3R5cGU9aHAifSwKKwl7T3B0X3R5cGVfbmV4dHN0ZXBjZCwgInVmc3R5cGU9bmV4dHN0ZXAtY2QifSwKKwl7T3B0X3R5cGVfbmV4dHN0ZXAsICJ1ZnN0eXBlPW5leHRzdGVwIn0sCisJe09wdF90eXBlX29wZW5zdGVwLCAidWZzdHlwZT1vcGVuc3RlcCJ9LAorCXtPcHRfb25lcnJvcl9wYW5pYywgIm9uZXJyb3I9cGFuaWMifSwKKwl7T3B0X29uZXJyb3JfbG9jaywgIm9uZXJyb3I9bG9jayJ9LAorCXtPcHRfb25lcnJvcl91bW91bnQsICJvbmVycm9yPXVtb3VudCJ9LAorCXtPcHRfb25lcnJvcl9yZXBhaXIsICJvbmVycm9yPXJlcGFpciJ9LAorCXtPcHRfZXJyLCBOVUxMfQorfTsKKworc3RhdGljIGludCB1ZnNfcGFyc2Vfb3B0aW9ucyAoY2hhciAqIG9wdGlvbnMsIHVuc2lnbmVkICogbW91bnRfb3B0aW9ucykKK3sKKwljaGFyICogcDsKKwkKKwlVRlNEKCgiRU5URVJcbiIpKQorCQorCWlmICghb3B0aW9ucykKKwkJcmV0dXJuIDE7CisKKwl3aGlsZSAoKHAgPSBzdHJzZXAoJm9wdGlvbnMsICIsIikpICE9IE5VTEwpIHsKKwkJc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOworCQlpbnQgdG9rZW47CisJCWlmICghKnApCisJCQljb250aW51ZTsKKworCQl0b2tlbiA9IG1hdGNoX3Rva2VuKHAsIHRva2VucywgYXJncyk7CisJCXN3aXRjaCAodG9rZW4pIHsKKwkJY2FzZSBPcHRfdHlwZV9vbGQ6CisJCQl1ZnNfY2xlYXJfb3B0ICgqbW91bnRfb3B0aW9ucywgVUZTVFlQRSk7CisJCQl1ZnNfc2V0X29wdCAoKm1vdW50X29wdGlvbnMsIFVGU1RZUEVfT0xEKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF90eXBlX3N1bng4NjoKKwkJCXVmc19jbGVhcl9vcHQgKCptb3VudF9vcHRpb25zLCBVRlNUWVBFKTsKKwkJCXVmc19zZXRfb3B0ICgqbW91bnRfb3B0aW9ucywgVUZTVFlQRV9TVU54ODYpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3R5cGVfc3VuOgorCQkJdWZzX2NsZWFyX29wdCAoKm1vdW50X29wdGlvbnMsIFVGU1RZUEUpOworCQkJdWZzX3NldF9vcHQgKCptb3VudF9vcHRpb25zLCBVRlNUWVBFX1NVTik7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfdHlwZV80NGJzZDoKKwkJCXVmc19jbGVhcl9vcHQgKCptb3VudF9vcHRpb25zLCBVRlNUWVBFKTsKKwkJCXVmc19zZXRfb3B0ICgqbW91bnRfb3B0aW9ucywgVUZTVFlQRV80NEJTRCk7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfdHlwZV91ZnMyOgorCQkJdWZzX2NsZWFyX29wdCgqbW91bnRfb3B0aW9ucywgVUZTVFlQRSk7CisJCQl1ZnNfc2V0X29wdCgqbW91bnRfb3B0aW9ucywgVUZTVFlQRV9VRlMyKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF90eXBlX2hwOgorCQkJdWZzX2NsZWFyX29wdCAoKm1vdW50X29wdGlvbnMsIFVGU1RZUEUpOworCQkJdWZzX3NldF9vcHQgKCptb3VudF9vcHRpb25zLCBVRlNUWVBFX0hQKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF90eXBlX25leHRzdGVwY2Q6CisJCQl1ZnNfY2xlYXJfb3B0ICgqbW91bnRfb3B0aW9ucywgVUZTVFlQRSk7CisJCQl1ZnNfc2V0X29wdCAoKm1vdW50X29wdGlvbnMsIFVGU1RZUEVfTkVYVFNURVBfQ0QpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3R5cGVfbmV4dHN0ZXA6CisJCQl1ZnNfY2xlYXJfb3B0ICgqbW91bnRfb3B0aW9ucywgVUZTVFlQRSk7CisJCQl1ZnNfc2V0X29wdCAoKm1vdW50X29wdGlvbnMsIFVGU1RZUEVfTkVYVFNURVApOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X3R5cGVfb3BlbnN0ZXA6CisJCQl1ZnNfY2xlYXJfb3B0ICgqbW91bnRfb3B0aW9ucywgVUZTVFlQRSk7CisJCQl1ZnNfc2V0X29wdCAoKm1vdW50X29wdGlvbnMsIFVGU1RZUEVfT1BFTlNURVApOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X29uZXJyb3JfcGFuaWM6CisJCQl1ZnNfY2xlYXJfb3B0ICgqbW91bnRfb3B0aW9ucywgT05FUlJPUik7CisJCQl1ZnNfc2V0X29wdCAoKm1vdW50X29wdGlvbnMsIE9ORVJST1JfUEFOSUMpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X29uZXJyb3JfbG9jazoKKwkJCXVmc19jbGVhcl9vcHQgKCptb3VudF9vcHRpb25zLCBPTkVSUk9SKTsKKwkJCXVmc19zZXRfb3B0ICgqbW91bnRfb3B0aW9ucywgT05FUlJPUl9MT0NLKTsKKwkJCWJyZWFrOworCQljYXNlIE9wdF9vbmVycm9yX3Vtb3VudDoKKwkJCXVmc19jbGVhcl9vcHQgKCptb3VudF9vcHRpb25zLCBPTkVSUk9SKTsKKwkJCXVmc19zZXRfb3B0ICgqbW91bnRfb3B0aW9ucywgT05FUlJPUl9VTU9VTlQpOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X29uZXJyb3JfcmVwYWlyOgorCQkJcHJpbnRrKCJVRlMtZnM6IFVuYWJsZSB0byBkbyByZXBhaXIgb24gZXJyb3IsICIKKwkJCQkid2lsbCBsb2NrIGxvY2sgaW5zdGVhZFxuIik7CisJCQl1ZnNfY2xlYXJfb3B0ICgqbW91bnRfb3B0aW9ucywgT05FUlJPUik7CisJCQl1ZnNfc2V0X29wdCAoKm1vdW50X29wdGlvbnMsIE9ORVJST1JfUkVQQUlSKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKCJVRlMtZnM6IEludmFsaWQgb3B0aW9uOiBcIiVzXCIgIgorCQkJCQkib3IgbWlzc2luZyB2YWx1ZVxuIiwgcCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFJlYWQgb24tZGlzayBzdHJ1Y3R1cmVzIGFzc29jaWF0ZWQgd2l0aCBjeWxpbmRlciBncm91cHMKKyAqLworc3RhdGljIGludCB1ZnNfcmVhZF9jeWxpbmRlcl9zdHJ1Y3R1cmVzIChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKSB7CisJc3RydWN0IHVmc19zYl9pbmZvICogc2JpID0gVUZTX1NCKHNiKTsKKwlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGk7CisJc3RydWN0IHVmc19zdXBlcl9ibG9jayAqdXNiOworCXN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiB1Ymg7CisJdW5zaWduZWQgY2hhciAqIGJhc2UsICogc3BhY2U7CisJdW5zaWduZWQgc2l6ZSwgYmxrcywgaTsKKwl1bnNpZ25lZCBmbGFncyA9IDA7CisJCisJVUZTRCgoIkVOVEVSXG4iKSkKKwkKKwl1c3BpID0gc2JpLT5zX3VzcGk7CisKKwl1c2IgID0gKHN0cnVjdCB1ZnNfc3VwZXJfYmxvY2sgKikKKwkJKChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICopdXNwaSktPmJoWzBdLT5iX2RhdGE7CisKKyAgICAgICAgZmxhZ3MgPSBVRlNfU0Ioc2IpLT5zX2ZsYWdzOworCQorCS8qCisJICogUmVhZCBjcyBzdHJ1Y3R1cmVzIGZyb20gKHVzdWFsbHkpIGZpcnN0IGRhdGEgYmxvY2sKKwkgKiBvbiB0aGUgZGV2aWNlLiAKKwkgKi8KKwlzaXplID0gdXNwaS0+c19jc3NpemU7CisJYmxrcyA9IChzaXplICsgdXNwaS0+c19mc2l6ZSAtIDEpID4+IHVzcGktPnNfZnNoaWZ0OworCWJhc2UgPSBzcGFjZSA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFiYXNlKQorCQlnb3RvIGZhaWxlZDsgCisJZm9yIChpID0gMDsgaSA8IGJsa3M7IGkgKz0gdXNwaS0+c19mcGIpIHsKKwkJc2l6ZSA9IHVzcGktPnNfYnNpemU7CisJCWlmIChpICsgdXNwaS0+c19mcGIgPiBibGtzKQorCQkJc2l6ZSA9IChibGtzIC0gaSkgKiB1c3BpLT5zX2ZzaXplOworCisJCWlmICgoZmxhZ3MgJiBVRlNfVFlQRV9NQVNLKSA9PSBVRlNfVFlQRV9VRlMyKSB7CisJCQl1YmggPSB1YmhfYnJlYWQoc2IsCisJCQkJZnM2NF90b19jcHUoc2IsIHVzYi0+ZnNfdTExLmZzX3UyLmZzX2NzYWRkcikgKyBpLCBzaXplKTsKKwkJCWlmICghdWJoKQorCQkJCWdvdG8gZmFpbGVkOworCQkJdWJoX3ViaGNweW1lbSAoc3BhY2UsIHViaCwgc2l6ZSk7CisJCQlzYmktPnNfY3NwW3Vmc19mcmFnc3RvYmxrcyhpKV09KHN0cnVjdCB1ZnNfY3N1bSAqKXNwYWNlOworCQl9CisJCWVsc2UgeworCQkJdWJoID0gdWJoX2JyZWFkKHNiLCB1c3BpLT5zX2NzYWRkciArIGksIHNpemUpOworCQkJaWYgKCF1YmgpCisJCQkJZ290byBmYWlsZWQ7CisJCQl1YmhfdWJoY3B5bWVtKHNwYWNlLCB1YmgsIHNpemUpOworCQkJc2JpLT5zX2NzcFt1ZnNfZnJhZ3N0b2Jsa3MoaSldPShzdHJ1Y3QgdWZzX2NzdW0gKilzcGFjZTsKKwkJfQorCQlzcGFjZSArPSBzaXplOworCQl1YmhfYnJlbHNlICh1YmgpOworCQl1YmggPSBOVUxMOworCX0KKworCS8qCisJICogUmVhZCBjeWxpbmRlciBncm91cCAod2UgcmVhZCBvbmx5IGZpcnN0IGZyYWdtZW50IGZyb20gYmxvY2sKKwkgKiBhdCB0aGlzIHRpbWUpIGFuZCBwcmVwYXJlIGludGVybmFsIGRhdGEgc3RydWN0dXJlcyBmb3IgY2cgY2FjaGluZy4KKwkgKi8KKwlpZiAoIShzYmktPnNfdWNnID0ga21hbGxvYyAoc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSAqIHVzcGktPnNfbmNnLCBHRlBfS0VSTkVMKSkpCisJCWdvdG8gZmFpbGVkOworCWZvciAoaSA9IDA7IGkgPCB1c3BpLT5zX25jZzsgaSsrKSAKKwkJc2JpLT5zX3VjZ1tpXSA9IE5VTEw7CisJZm9yIChpID0gMDsgaSA8IFVGU19NQVhfR1JPVVBfTE9BREVEOyBpKyspIHsKKwkJc2JpLT5zX3VjcGlbaV0gPSBOVUxMOworCQlzYmktPnNfY2dub1tpXSA9IFVGU19DR05PX0VNUFRZOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgdXNwaS0+c19uY2c7IGkrKykgeworCQlVRlNEKCgicmVhZCBjZyAldVxuIiwgaSkpCisJCWlmICghKHNiaS0+c191Y2dbaV0gPSBzYl9icmVhZChzYiwgdWZzX2NnY21pbihpKSkpKQorCQkJZ290byBmYWlsZWQ7CisJCWlmICghdWZzX2NnX2Noa21hZ2ljIChzYiwgKHN0cnVjdCB1ZnNfY3lsaW5kZXJfZ3JvdXAgKikgc2JpLT5zX3VjZ1tpXS0+Yl9kYXRhKSkKKwkJCWdvdG8gZmFpbGVkOworI2lmZGVmIFVGU19TVVBFUl9ERUJVR19NT1JFCisJCXVmc19wcmludF9jeWxpbmRlcl9zdHVmZihzYiwgKHN0cnVjdCB1ZnNfY3lsaW5kZXJfZ3JvdXAgKikgc2JpLT5zX3VjZ1tpXS0+Yl9kYXRhKTsKKyNlbmRpZgorCX0KKwlmb3IgKGkgPSAwOyBpIDwgVUZTX01BWF9HUk9VUF9MT0FERUQ7IGkrKykgeworCQlpZiAoIShzYmktPnNfdWNwaVtpXSA9IGttYWxsb2MgKHNpemVvZihzdHJ1Y3QgdWZzX2NnX3ByaXZhdGVfaW5mbyksIEdGUF9LRVJORUwpKSkKKwkJCWdvdG8gZmFpbGVkOworCQlzYmktPnNfY2dub1tpXSA9IFVGU19DR05PX0VNUFRZOworCX0KKwlzYmktPnNfY2dfbG9hZGVkID0gMDsKKwlVRlNEKCgiRVhJVFxuIikpCisJcmV0dXJuIDE7CisKK2ZhaWxlZDoKKwlpZiAoYmFzZSkga2ZyZWUgKGJhc2UpOworCWlmIChzYmktPnNfdWNnKSB7CisJCWZvciAoaSA9IDA7IGkgPCB1c3BpLT5zX25jZzsgaSsrKQorCQkJaWYgKHNiaS0+c191Y2dbaV0pIGJyZWxzZSAoc2JpLT5zX3VjZ1tpXSk7CisJCWtmcmVlIChzYmktPnNfdWNnKTsKKwkJZm9yIChpID0gMDsgaSA8IFVGU19NQVhfR1JPVVBfTE9BREVEOyBpKyspCisJCQlpZiAoc2JpLT5zX3VjcGlbaV0pIGtmcmVlIChzYmktPnNfdWNwaVtpXSk7CisJfQorCVVGU0QoKCJFWElUIChGQUlMRUQpXG4iKSkKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFB1dCBvbi1kaXNrIHN0cnVjdHVyZXMgYXNzb2NpYXRlZCB3aXRoIGN5bGluZGVyIGdyb3VwcyBhbmQgCisgKiB3cml0ZSB0aGVtIGJhY2sgdG8gZGlzaworICovCitzdGF0aWMgdm9pZCB1ZnNfcHV0X2N5bGluZGVyX3N0cnVjdHVyZXMgKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpIHsKKwlzdHJ1Y3QgdWZzX3NiX2luZm8gKiBzYmkgPSBVRlNfU0Ioc2IpOworCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaTsKKwlzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICogdWJoOworCXVuc2lnbmVkIGNoYXIgKiBiYXNlLCAqIHNwYWNlOworCXVuc2lnbmVkIGJsa3MsIHNpemUsIGk7CisJCisJVUZTRCgoIkVOVEVSXG4iKSkKKwkKKwl1c3BpID0gc2JpLT5zX3VzcGk7CisKKwlzaXplID0gdXNwaS0+c19jc3NpemU7CisJYmxrcyA9IChzaXplICsgdXNwaS0+c19mc2l6ZSAtIDEpID4+IHVzcGktPnNfZnNoaWZ0OworCWJhc2UgPSBzcGFjZSA9IChjaGFyKikgc2JpLT5zX2NzcFswXTsKKwlmb3IgKGkgPSAwOyBpIDwgYmxrczsgaSArPSB1c3BpLT5zX2ZwYikgeworCQlzaXplID0gdXNwaS0+c19ic2l6ZTsKKwkJaWYgKGkgKyB1c3BpLT5zX2ZwYiA+IGJsa3MpCisJCQlzaXplID0gKGJsa3MgLSBpKSAqIHVzcGktPnNfZnNpemU7CisJCXViaCA9IHViaF9icmVhZChzYiwgdXNwaS0+c19jc2FkZHIgKyBpLCBzaXplKTsKKwkJdWJoX21lbWNweXViaCAodWJoLCBzcGFjZSwgc2l6ZSk7CisJCXNwYWNlICs9IHNpemU7CisJCXViaF9tYXJrX2J1ZmZlcl91cHRvZGF0ZSAodWJoLCAxKTsKKwkJdWJoX21hcmtfYnVmZmVyX2RpcnR5ICh1YmgpOworCQl1YmhfYnJlbHNlICh1YmgpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgc2JpLT5zX2NnX2xvYWRlZDsgaSsrKSB7CisJCXVmc19wdXRfY3lsaW5kZXIgKHNiLCBpKTsKKwkJa2ZyZWUgKHNiaS0+c191Y3BpW2ldKTsKKwl9CisJZm9yICg7IGkgPCBVRlNfTUFYX0dST1VQX0xPQURFRDsgaSsrKSAKKwkJa2ZyZWUgKHNiaS0+c191Y3BpW2ldKTsKKwlmb3IgKGkgPSAwOyBpIDwgdXNwaS0+c19uY2c7IGkrKykgCisJCWJyZWxzZSAoc2JpLT5zX3VjZ1tpXSk7CisJa2ZyZWUgKHNiaS0+c191Y2cpOworCWtmcmVlIChiYXNlKTsKKwlVRlNEKCgiRVhJVFxuIikpCit9CisKK3N0YXRpYyBpbnQgdWZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdHJ1Y3QgdWZzX3NiX2luZm8gKiBzYmk7CisJc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpOworCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfZmlyc3QgKiB1c2IxOworCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfc2Vjb25kICogdXNiMjsKKwlzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX3RoaXJkICogdXNiMzsKKwlzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrICp1c2I7CisJc3RydWN0IHVmc19idWZmZXJfaGVhZCAqIHViaDsJCisJc3RydWN0IGlub2RlICppbm9kZTsKKwl1bnNpZ25lZCBibG9ja19zaXplLCBzdXBlcl9ibG9ja19zaXplOworCXVuc2lnbmVkIGZsYWdzOworCisJdXNwaSA9IE5VTEw7CisJdWJoID0gTlVMTDsKKwlmbGFncyA9IDA7CisJCisJVUZTRCgoIkVOVEVSXG4iKSkKKwkJCisJc2JpID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHVmc19zYl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYmkpCisJCWdvdG8gZmFpbGVkX25vbWVtOworCXNiLT5zX2ZzX2luZm8gPSBzYmk7CisJbWVtc2V0KHNiaSwgMCwgc2l6ZW9mKHN0cnVjdCB1ZnNfc2JfaW5mbykpOworCisJVUZTRCgoImZsYWcgJXVcbiIsIChpbnQpKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkpCisJCisjaWZuZGVmIENPTkZJR19VRlNfRlNfV1JJVEUKKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJcHJpbnRrKCJ1ZnMgd2FzIGNvbXBpbGVkIHdpdGggcmVhZC1vbmx5IHN1cHBvcnQsICIKKwkJImNhbid0IGJlIG1vdW50ZWQgYXMgcmVhZC13cml0ZVxuIik7CisJCWdvdG8gZmFpbGVkOworCX0KKyNlbmRpZgorCS8qCisJICogU2V0IGRlZmF1bHQgbW91bnQgb3B0aW9ucworCSAqIFBhcnNlIG1vdW50IG9wdGlvbnMKKwkgKi8KKwlzYmktPnNfbW91bnRfb3B0ID0gMDsKKwl1ZnNfc2V0X29wdCAoc2JpLT5zX21vdW50X29wdCwgT05FUlJPUl9MT0NLKTsKKwlpZiAoIXVmc19wYXJzZV9vcHRpb25zICgoY2hhciAqKSBkYXRhLCAmc2JpLT5zX21vdW50X29wdCkpIHsKKwkJcHJpbnRrKCJ3cm9uZyBtb3VudCBvcHRpb25zXG4iKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCWlmICghKHNiaS0+c19tb3VudF9vcHQgJiBVRlNfTU9VTlRfVUZTVFlQRSkpIHsKKwkJaWYgKCFzaWxlbnQpCisJCQlwcmludGsoIllvdSBkaWRuJ3Qgc3BlY2lmeSB0aGUgdHlwZSBvZiB5b3VyIHVmcyBmaWxlc3lzdGVtXG5cbiIKKwkJCSJtb3VudCAtdCB1ZnMgLW8gdWZzdHlwZT0iCisJCQkic3VufHN1bng4Nnw0NGJzZHx1ZnMyfDV4YnNkfG9sZHxocHxuZXh0c3RlcHxuZXR4c3RlcC1jZHxvcGVuc3RlcCAuLi5cblxuIgorCQkJIj4+PldBUk5JTkc8PDwgV3JvbmcgdWZzdHlwZSBtYXkgY29ycnVwdCB5b3VyIGZpbGVzeXN0ZW0sICIKKwkJCSJkZWZhdWx0IGlzIHVmc3R5cGU9b2xkXG4iKTsKKwkJdWZzX3NldF9vcHQgKHNiaS0+c19tb3VudF9vcHQsIFVGU1RZUEVfT0xEKTsKKwl9CisKKwlzYmktPnNfdXNwaSA9IHVzcGkgPQorCQlrbWFsbG9jIChzaXplb2Yoc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXVzcGkpCisJCWdvdG8gZmFpbGVkOworCisJLyogS2VlcCAyR2lnIGZpbGUgbGltaXQuIFNvbWUgVUZTIHZhcmlhbnRzIG5lZWQgdG8gb3ZlcnJpZGUgCisJICAgdGhpcyBidXQgYXMgSSBkb24ndCBrbm93IHdoaWNoIEknbGwgbGV0IHRob3NlIGluIHRoZSBrbm93IGxvb3NlbgorCSAgIHRoZSBydWxlcyAqLworCSAgIAorCXN3aXRjaCAoc2JpLT5zX21vdW50X29wdCAmIFVGU19NT1VOVF9VRlNUWVBFKSB7CisJY2FzZSBVRlNfTU9VTlRfVUZTVFlQRV80NEJTRDoKKwkJVUZTRCgoInVmc3R5cGU9NDRic2RcbiIpKQorCQl1c3BpLT5zX2ZzaXplID0gYmxvY2tfc2l6ZSA9IDUxMjsKKwkJdXNwaS0+c19mbWFzayA9IH4oNTEyIC0gMSk7CisJCXVzcGktPnNfZnNoaWZ0ID0gOTsKKwkJdXNwaS0+c19zYnNpemUgPSBzdXBlcl9ibG9ja19zaXplID0gMTUzNjsKKwkJdXNwaS0+c19zYmJhc2UgPSAwOworCQlmbGFncyB8PSBVRlNfREVfNDRCU0QgfCBVRlNfVUlEXzQ0QlNEIHwgVUZTX1NUXzQ0QlNEIHwgVUZTX0NHXzQ0QlNEOworCQlicmVhazsKKwljYXNlIFVGU19NT1VOVF9VRlNUWVBFX1VGUzI6CisJCVVGU0QoKCJ1ZnN0eXBlPXVmczJcbiIpKQorCQl1c3BpLT5zX2ZzaXplID0gYmxvY2tfc2l6ZSA9IDUxMjsKKwkJdXNwaS0+c19mbWFzayA9IH4oNTEyIC0gMSk7CisJCXVzcGktPnNfZnNoaWZ0ID0gOTsKKwkJdXNwaS0+c19zYnNpemUgPSBzdXBlcl9ibG9ja19zaXplID0gMTUzNjsKKwkJdXNwaS0+c19zYmJhc2UgPSAgMDsKKwkJZmxhZ3MgfD0gVUZTX1RZUEVfVUZTMiB8IFVGU19ERV80NEJTRCB8IFVGU19VSURfNDRCU0QgfCBVRlNfU1RfNDRCU0QgfCBVRlNfQ0dfNDRCU0Q7CisJCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAidWZzdHlwZT11ZnMyIGlzIHN1cHBvcnRlZCByZWFkLW9ubHlcbiIpOworCQkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworIAkJfQorCQlicmVhazsKKwkJCisJY2FzZSBVRlNfTU9VTlRfVUZTVFlQRV9TVU46CisJCVVGU0QoKCJ1ZnN0eXBlPXN1blxuIikpCisJCXVzcGktPnNfZnNpemUgPSBibG9ja19zaXplID0gMTAyNDsKKwkJdXNwaS0+c19mbWFzayA9IH4oMTAyNCAtIDEpOworCQl1c3BpLT5zX2ZzaGlmdCA9IDEwOworCQl1c3BpLT5zX3Nic2l6ZSA9IHN1cGVyX2Jsb2NrX3NpemUgPSAyMDQ4OworCQl1c3BpLT5zX3NiYmFzZSA9IDA7CisJCXVzcGktPnNfbWF4c3ltbGlua2xlbiA9IDU2OworCQlmbGFncyB8PSBVRlNfREVfT0xEIHwgVUZTX1VJRF9FRlQgfCBVRlNfU1RfU1VOIHwgVUZTX0NHX1NVTjsKKwkJYnJlYWs7CisKKwljYXNlIFVGU19NT1VOVF9VRlNUWVBFX1NVTng4NjoKKwkJVUZTRCgoInVmc3R5cGU9c3VueDg2XG4iKSkKKwkJdXNwaS0+c19mc2l6ZSA9IGJsb2NrX3NpemUgPSAxMDI0OworCQl1c3BpLT5zX2ZtYXNrID0gfigxMDI0IC0gMSk7CisJCXVzcGktPnNfZnNoaWZ0ID0gMTA7CisJCXVzcGktPnNfc2JzaXplID0gc3VwZXJfYmxvY2tfc2l6ZSA9IDIwNDg7CisJCXVzcGktPnNfc2JiYXNlID0gMDsKKwkJdXNwaS0+c19tYXhzeW1saW5rbGVuID0gNTY7CisJCWZsYWdzIHw9IFVGU19ERV9PTEQgfCBVRlNfVUlEX0VGVCB8IFVGU19TVF9TVU54ODYgfCBVRlNfQ0dfU1VOOworCQlicmVhazsKKworCWNhc2UgVUZTX01PVU5UX1VGU1RZUEVfT0xEOgorCQlVRlNEKCgidWZzdHlwZT1vbGRcbiIpKQorCQl1c3BpLT5zX2ZzaXplID0gYmxvY2tfc2l6ZSA9IDEwMjQ7CisJCXVzcGktPnNfZm1hc2sgPSB+KDEwMjQgLSAxKTsKKwkJdXNwaS0+c19mc2hpZnQgPSAxMDsKKwkJdXNwaS0+c19zYnNpemUgPSBzdXBlcl9ibG9ja19zaXplID0gMjA0ODsKKwkJdXNwaS0+c19zYmJhc2UgPSAwOworCQlmbGFncyB8PSBVRlNfREVfT0xEIHwgVUZTX1VJRF9PTEQgfCBVRlNfU1RfT0xEIHwgVUZTX0NHX09MRDsKKwkJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCQlpZiAoIXNpbGVudCkKKwkJCQlwcmludGsoS0VSTl9JTkZPICJ1ZnN0eXBlPW9sZCBpcyBzdXBwb3J0ZWQgcmVhZC1vbmx5XG4iKTsKKwkJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKKwkJfQorCQlicmVhazsKKwkKKwljYXNlIFVGU19NT1VOVF9VRlNUWVBFX05FWFRTVEVQOgorCQlVRlNEKCgidWZzdHlwZT1uZXh0c3RlcFxuIikpCisJCXVzcGktPnNfZnNpemUgPSBibG9ja19zaXplID0gMTAyNDsKKwkJdXNwaS0+c19mbWFzayA9IH4oMTAyNCAtIDEpOworCQl1c3BpLT5zX2ZzaGlmdCA9IDEwOworCQl1c3BpLT5zX3Nic2l6ZSA9IHN1cGVyX2Jsb2NrX3NpemUgPSAyMDQ4OworCQl1c3BpLT5zX3NiYmFzZSA9IDA7CisJCWZsYWdzIHw9IFVGU19ERV9PTEQgfCBVRlNfVUlEX09MRCB8IFVGU19TVF9PTEQgfCBVRlNfQ0dfT0xEOworCQlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJCWlmICghc2lsZW50KQorCQkJCXByaW50ayhLRVJOX0lORk8gInVmc3R5cGU9bmV4dHN0ZXAgaXMgc3VwcG9ydGVkIHJlYWQtb25seVxuIik7CisJCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CisJCX0KKwkJYnJlYWs7CisJCisJY2FzZSBVRlNfTU9VTlRfVUZTVFlQRV9ORVhUU1RFUF9DRDoKKwkJVUZTRCgoInVmc3R5cGU9bmV4dHN0ZXAtY2RcbiIpKQorCQl1c3BpLT5zX2ZzaXplID0gYmxvY2tfc2l6ZSA9IDIwNDg7CisJCXVzcGktPnNfZm1hc2sgPSB+KDIwNDggLSAxKTsKKwkJdXNwaS0+c19mc2hpZnQgPSAxMTsKKwkJdXNwaS0+c19zYnNpemUgPSBzdXBlcl9ibG9ja19zaXplID0gMjA0ODsKKwkJdXNwaS0+c19zYmJhc2UgPSAwOworCQlmbGFncyB8PSBVRlNfREVfT0xEIHwgVUZTX1VJRF9PTEQgfCBVRlNfU1RfT0xEIHwgVUZTX0NHX09MRDsKKwkJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCQlpZiAoIXNpbGVudCkKKwkJCQlwcmludGsoS0VSTl9JTkZPICJ1ZnN0eXBlPW5leHRzdGVwLWNkIGlzIHN1cHBvcnRlZCByZWFkLW9ubHlcbiIpOworCQkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCQl9CisJCWJyZWFrOworCQorCWNhc2UgVUZTX01PVU5UX1VGU1RZUEVfT1BFTlNURVA6CisJCVVGU0QoKCJ1ZnN0eXBlPW9wZW5zdGVwXG4iKSkKKwkJdXNwaS0+c19mc2l6ZSA9IGJsb2NrX3NpemUgPSAxMDI0OworCQl1c3BpLT5zX2ZtYXNrID0gfigxMDI0IC0gMSk7CisJCXVzcGktPnNfZnNoaWZ0ID0gMTA7CisJCXVzcGktPnNfc2JzaXplID0gc3VwZXJfYmxvY2tfc2l6ZSA9IDIwNDg7CisJCXVzcGktPnNfc2JiYXNlID0gMDsKKwkJZmxhZ3MgfD0gVUZTX0RFXzQ0QlNEIHwgVUZTX1VJRF80NEJTRCB8IFVGU19TVF80NEJTRCB8IFVGU19DR180NEJTRDsKKwkJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCQlpZiAoIXNpbGVudCkKKwkJCQlwcmludGsoS0VSTl9JTkZPICJ1ZnN0eXBlPW9wZW5zdGVwIGlzIHN1cHBvcnRlZCByZWFkLW9ubHlcbiIpOworCQkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCQl9CisJCWJyZWFrOworCQorCWNhc2UgVUZTX01PVU5UX1VGU1RZUEVfSFA6CisJCVVGU0QoKCJ1ZnN0eXBlPWhwXG4iKSkKKwkJdXNwaS0+c19mc2l6ZSA9IGJsb2NrX3NpemUgPSAxMDI0OworCQl1c3BpLT5zX2ZtYXNrID0gfigxMDI0IC0gMSk7CisJCXVzcGktPnNfZnNoaWZ0ID0gMTA7CisJCXVzcGktPnNfc2JzaXplID0gc3VwZXJfYmxvY2tfc2l6ZSA9IDIwNDg7CisJCXVzcGktPnNfc2JiYXNlID0gMDsKKwkJZmxhZ3MgfD0gVUZTX0RFX09MRCB8IFVGU19VSURfT0xEIHwgVUZTX1NUX09MRCB8IFVGU19DR19PTEQ7CisJCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkgeworCQkJaWYgKCFzaWxlbnQpCisJCQkJcHJpbnRrKEtFUk5fSU5GTyAidWZzdHlwZT1ocCBpcyBzdXBwb3J0ZWQgcmVhZC1vbmx5XG4iKTsKKwkJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKKyAJCX0KKyAJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmICghc2lsZW50KQorCQkJcHJpbnRrKCJ1bmtub3duIHVmc3R5cGVcbiIpOworCQlnb3RvIGZhaWxlZDsKKwl9CisJCithZ2FpbjoJCisJaWYgKCFzYl9zZXRfYmxvY2tzaXplKHNiLCBibG9ja19zaXplKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlVGUzogZmFpbGVkIHRvIHNldCBibG9ja3NpemVcbiIpOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwkvKgorCSAqIHJlYWQgdWZzIHN1cGVyIGJsb2NrIGZyb20gZGV2aWNlCisJICovCisJaWYgKCAoZmxhZ3MgJiBVRlNfVFlQRV9NQVNLKSA9PSBVRlNfVFlQRV9VRlMyKSB7CisJCXViaCA9IHViaF9icmVhZF91c3BpKHVzcGksIHNiLCB1c3BpLT5zX3NiYmFzZSArIFNCTE9DS19VRlMyL2Jsb2NrX3NpemUsIHN1cGVyX2Jsb2NrX3NpemUpOworCX0KKwllbHNlIHsKKwkJdWJoID0gdWJoX2JyZWFkX3VzcGkodXNwaSwgc2IsIHVzcGktPnNfc2JiYXNlICsgVUZTX1NCTE9DSy9ibG9ja19zaXplLCBzdXBlcl9ibG9ja19zaXplKTsKKwl9CisJaWYgKCF1YmgpIAorICAgICAgICAgICAgZ290byBmYWlsZWQ7CisKKwkKKwl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QoVVNQSV9VQkgpOworCXVzYjIgPSB1YmhfZ2V0X3VzYl9zZWNvbmQoVVNQSV9VQkgpOworCXVzYjMgPSB1YmhfZ2V0X3VzYl90aGlyZChVU1BJX1VCSCk7CisJdXNiICA9IChzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrICopCisJCSgoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqKXVzcGkpLT5iaFswXS0+Yl9kYXRhIDsKKworCS8qCisJICogQ2hlY2sgdWZzIG1hZ2ljIG51bWJlcgorCSAqLworCXNiaS0+c19ieXRlc2V4ID0gQllURVNFWF9MRTsKKwlzd2l0Y2ggKCh1c3BpLT5mc19tYWdpYyA9IGZzMzJfdG9fY3B1KHNiLCB1c2IzLT5mc19tYWdpYykpKSB7CisJCWNhc2UgVUZTX01BR0lDOgorCQljYXNlIFVGUzJfTUFHSUM6CisJCWNhc2UgVUZTX01BR0lDX0xGTjoKKwkgICAgICAgIGNhc2UgVUZTX01BR0lDX0ZFQToKKwkgICAgICAgIGNhc2UgVUZTX01BR0lDXzRHQjoKKwkJCWdvdG8gbWFnaWNfZm91bmQ7CisJfQorCXNiaS0+c19ieXRlc2V4ID0gQllURVNFWF9CRTsKKwlzd2l0Y2ggKCh1c3BpLT5mc19tYWdpYyA9IGZzMzJfdG9fY3B1KHNiLCB1c2IzLT5mc19tYWdpYykpKSB7CisJCWNhc2UgVUZTX01BR0lDOgorCQljYXNlIFVGUzJfTUFHSUM6CisJCWNhc2UgVUZTX01BR0lDX0xGTjoKKwkgICAgICAgIGNhc2UgVUZTX01BR0lDX0ZFQToKKwkgICAgICAgIGNhc2UgVUZTX01BR0lDXzRHQjoKKwkJCWdvdG8gbWFnaWNfZm91bmQ7CisJfQorCisJaWYgKCgoKHNiaS0+c19tb3VudF9vcHQgJiBVRlNfTU9VTlRfVUZTVFlQRSkgPT0gVUZTX01PVU5UX1VGU1RZUEVfTkVYVFNURVApIAorCSAgfHwgKChzYmktPnNfbW91bnRfb3B0ICYgVUZTX01PVU5UX1VGU1RZUEUpID09IFVGU19NT1VOVF9VRlNUWVBFX05FWFRTVEVQX0NEKSAKKwkgIHx8ICgoc2JpLT5zX21vdW50X29wdCAmIFVGU19NT1VOVF9VRlNUWVBFKSA9PSBVRlNfTU9VTlRfVUZTVFlQRV9PUEVOU1RFUCkpIAorCSAgJiYgdXNwaS0+c19zYmJhc2UgPCAyNTYpIHsKKwkJdWJoX2JyZWxzZV91c3BpKHVzcGkpOworCQl1YmggPSBOVUxMOworCQl1c3BpLT5zX3NiYmFzZSArPSA4OworCQlnb3RvIGFnYWluOworCX0KKwlpZiAoIXNpbGVudCkKKwkJcHJpbnRrKCJ1ZnNfcmVhZF9zdXBlcjogYmFkIG1hZ2ljIG51bWJlclxuIik7CisJZ290byBmYWlsZWQ7CisKK21hZ2ljX2ZvdW5kOgorCS8qCisJICogQ2hlY2sgYmxvY2sgYW5kIGZyYWdtZW50IHNpemVzCisJICovCisJdXNwaS0+c19ic2l6ZSA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19ic2l6ZSk7CisJdXNwaS0+c19mc2l6ZSA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19mc2l6ZSk7CisJdXNwaS0+c19zYnNpemUgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfc2JzaXplKTsKKwl1c3BpLT5zX2ZtYXNrID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2ZtYXNrKTsKKwl1c3BpLT5zX2ZzaGlmdCA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19mc2hpZnQpOworCisJaWYgKHVzcGktPnNfZnNpemUgJiAodXNwaS0+c19mc2l6ZSAtIDEpKSB7CisJCXByaW50ayhLRVJOX0VSUiAidWZzX3JlYWRfc3VwZXI6IGZyYWdtZW50IHNpemUgJXUgaXMgbm90IGEgcG93ZXIgb2YgMlxuIiwKKwkJCXVzcGktPnNfZnNpemUpOworCQkJZ290byBmYWlsZWQ7CisJfQorCWlmICh1c3BpLT5zX2ZzaXplIDwgNTEyKSB7CisJCXByaW50ayhLRVJOX0VSUiAidWZzX3JlYWRfc3VwZXI6IGZyYWdtZW50IHNpemUgJXUgaXMgdG9vIHNtYWxsXG4iLAorCQkJdXNwaS0+c19mc2l6ZSk7CisJCWdvdG8gZmFpbGVkOworCX0KKwlpZiAodXNwaS0+c19mc2l6ZSA+IDQwOTYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ1ZnNfcmVhZF9zdXBlcjogZnJhZ21lbnQgc2l6ZSAldSBpcyB0b28gbGFyZ2VcbiIsCisJCQl1c3BpLT5zX2ZzaXplKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCWlmICh1c3BpLT5zX2JzaXplICYgKHVzcGktPnNfYnNpemUgLSAxKSkgeworCQlwcmludGsoS0VSTl9FUlIgInVmc19yZWFkX3N1cGVyOiBibG9jayBzaXplICV1IGlzIG5vdCBhIHBvd2VyIG9mIDJcbiIsCisJCQl1c3BpLT5zX2JzaXplKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCWlmICh1c3BpLT5zX2JzaXplIDwgNDA5NikgeworCQlwcmludGsoS0VSTl9FUlIgInVmc19yZWFkX3N1cGVyOiBibG9jayBzaXplICV1IGlzIHRvbyBzbWFsbFxuIiwKKwkJCXVzcGktPnNfYnNpemUpOworCQlnb3RvIGZhaWxlZDsKKwl9CisJaWYgKHVzcGktPnNfYnNpemUgLyB1c3BpLT5zX2ZzaXplID4gOCkgeworCQlwcmludGsoS0VSTl9FUlIgInVmc19yZWFkX3N1cGVyOiB0b28gbWFueSBmcmFnbWVudHMgcGVyIGJsb2NrICgldSlcbiIsCisJCQl1c3BpLT5zX2JzaXplIC8gdXNwaS0+c19mc2l6ZSk7CisJCWdvdG8gZmFpbGVkOworCX0KKwlpZiAodXNwaS0+c19mc2l6ZSAhPSBibG9ja19zaXplIHx8IHVzcGktPnNfc2JzaXplICE9IHN1cGVyX2Jsb2NrX3NpemUpIHsKKwkJdWJoX2JyZWxzZV91c3BpKHVzcGkpOworCQl1YmggPSBOVUxMOworCQlibG9ja19zaXplID0gdXNwaS0+c19mc2l6ZTsKKwkJc3VwZXJfYmxvY2tfc2l6ZSA9IHVzcGktPnNfc2JzaXplOworCQlVRlNEKCgiYW5vdGhlciB2YWx1ZSBvZiBibG9ja19zaXplIG9yIHN1cGVyX2Jsb2NrX3NpemUgJXUsICV1XG4iLCBibG9ja19zaXplLCBzdXBlcl9ibG9ja19zaXplKSkKKwkJZ290byBhZ2FpbjsKKwl9CisKKyNpZmRlZiBVRlNfU1VQRVJfREVCVUdfTU9SRQorICAgICAgICBpZiAoKGZsYWdzICYgVUZTX1RZUEVfTUFTSykgPT0gVUZTX1RZUEVfVUZTMikKKwkJdWZzMl9wcmludF9zdXBlcl9zdHVmZihzYix1c2IpOworICAgICAgICBlbHNlCisJCXVmc19wcmludF9zdXBlcl9zdHVmZihzYiwgdXNiMSwgdXNiMiwgdXNiMyk7CisjZW5kaWYKKworCS8qCisJICogQ2hlY2ssIGlmIGZpbGUgc3lzdGVtIHdhcyBjb3JyZWN0bHkgdW5tb3VudGVkLgorCSAqIElmIG5vdCwgbWFrZSBpdCByZWFkIG9ubHkuCisJICovCisJaWYgKCgoZmxhZ3MgJiBVRlNfU1RfTUFTSykgPT0gVUZTX1NUXzQ0QlNEKSB8fAorCSAgKChmbGFncyAmIFVGU19TVF9NQVNLKSA9PSBVRlNfU1RfT0xEKSB8fAorCSAgKCgoZmxhZ3MgJiBVRlNfU1RfTUFTSykgPT0gVUZTX1NUX1NVTiB8fCAKKwkgIChmbGFncyAmIFVGU19TVF9NQVNLKSA9PSBVRlNfU1RfU1VOeDg2KSAmJiAKKwkgICh1ZnNfZ2V0X2ZzX3N0YXRlKHNiLCB1c2IxLCB1c2IzKSA9PSAoVUZTX0ZTT0sgLSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfdGltZSkpKSkpIHsKKwkJc3dpdGNoKHVzYjEtPmZzX2NsZWFuKSB7CisJCWNhc2UgVUZTX0ZTQ0xFQU46CisJCQlVRlNEKCgiZnMgaXMgY2xlYW5cbiIpKQorCQkJYnJlYWs7CisJCWNhc2UgVUZTX0ZTU1RBQkxFOgorCQkJVUZTRCgoImZzIGlzIHN0YWJsZVxuIikpCisJCQlicmVhazsKKwkJY2FzZSBVRlNfRlNPU0YxOgorCQkJVUZTRCgoImZzIGlzIERFQyBPU0YvMVxuIikpCisJCQlicmVhazsKKwkJY2FzZSBVRlNfRlNBQ1RJVkU6CisJCQlwcmludGsoInVmc19yZWFkX3N1cGVyOiBmcyBpcyBhY3RpdmVcbiIpOworCQkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCQkJYnJlYWs7CisJCWNhc2UgVUZTX0ZTQkFEOgorCQkJcHJpbnRrKCJ1ZnNfcmVhZF9zdXBlcjogZnMgaXMgYmFkXG4iKTsKKwkJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKCJ1ZnNfcmVhZF9zdXBlcjogY2FuJ3QgZ3JvayBmc19jbGVhbiAweCV4XG4iLCB1c2IxLT5mc19jbGVhbik7CisJCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CisJCQlicmVhazsKKwkJfQorCX0KKwllbHNlIHsKKwkJcHJpbnRrKCJ1ZnNfcmVhZF9zdXBlcjogZnMgbmVlZHMgZnNja1xuIik7CisJCXNiLT5zX2ZsYWdzIHw9IE1TX1JET05MWTsKKwl9CisKKwkvKgorCSAqIFJlYWQgdWZzX3N1cGVyX2Jsb2NrIGludG8gaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmVzCisJICovCisJc2ItPnNfb3AgPSAmdWZzX3N1cGVyX29wczsKKwlzYi0+ZHFfb3AgPSBOVUxMOyAvKioqLworCXNiLT5zX21hZ2ljID0gZnMzMl90b19jcHUoc2IsIHVzYjMtPmZzX21hZ2ljKTsKKworCXVzcGktPnNfc2Jsa25vID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX3NibGtubyk7CisJdXNwaS0+c19jYmxrbm8gPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY2Jsa25vKTsKKwl1c3BpLT5zX2libGtubyA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19pYmxrbm8pOworCXVzcGktPnNfZGJsa25vID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2RibGtubyk7CisJdXNwaS0+c19jZ29mZnNldCA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jZ29mZnNldCk7CisJdXNwaS0+c19jZ21hc2sgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY2dtYXNrKTsKKworCWlmICgoZmxhZ3MgJiBVRlNfVFlQRV9NQVNLKSA9PSBVRlNfVFlQRV9VRlMyKSB7CisJCXVzcGktPnNfdTJfc2l6ZSAgPSBmczY0X3RvX2NwdShzYiwgdXNiLT5mc191MTEuZnNfdTIuZnNfc2l6ZSk7CisJCXVzcGktPnNfdTJfZHNpemUgPSBmczY0X3RvX2NwdShzYiwgdXNiLT5mc191MTEuZnNfdTIuZnNfZHNpemUpOworCX0KKwllbHNlIHsKKwkJdXNwaS0+c19zaXplICA9ICBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfc2l6ZSk7CisJCXVzcGktPnNfZHNpemUgPSAgZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2RzaXplKTsKKwl9CisKKwl1c3BpLT5zX25jZyA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19uY2cpOworCS8qIHNfYnNpemUgYWxyZWFkeSBzZXQgKi8KKwkvKiBzX2ZzaXplIGFscmVhZHkgc2V0ICovCisJdXNwaS0+c19mcGIgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZnJhZyk7CisJdXNwaS0+c19taW5mcmVlID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX21pbmZyZWUpOworCXVzcGktPnNfYm1hc2sgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfYm1hc2spOworCXVzcGktPnNfZm1hc2sgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZm1hc2spOworCXVzcGktPnNfYnNoaWZ0ID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2JzaGlmdCk7CisJdXNwaS0+c19mc2hpZnQgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfZnNoaWZ0KTsKKwlVRlNEKCgidXNwaS0+c19ic2hpZnQgPSAlZCx1c3BpLT5zX2ZzaGlmdCA9ICVkIiwgdXNwaS0+c19ic2hpZnQsCisJCXVzcGktPnNfZnNoaWZ0KSk7CisJdXNwaS0+c19mcGJzaGlmdCA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19mcmFnc2hpZnQpOworCXVzcGktPnNfZnNidG9kYiA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19mc2J0b2RiKTsKKwkvKiBzX3Nic2l6ZSBhbHJlYWR5IHNldCAqLworCXVzcGktPnNfY3NtYXNrID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2NzbWFzayk7CisJdXNwaS0+c19jc3NoaWZ0ID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2Nzc2hpZnQpOworCXVzcGktPnNfbmluZGlyID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX25pbmRpcik7CisJdXNwaS0+c19pbm9wYiA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19pbm9wYik7CisJdXNwaS0+c19uc3BmID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX25zcGYpOworCXVzcGktPnNfbnBzZWN0ID0gdWZzX2dldF9mc19ucHNlY3Qoc2IsIHVzYjEsIHVzYjMpOworCXVzcGktPnNfaW50ZXJsZWF2ZSA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19pbnRlcmxlYXZlKTsKKwl1c3BpLT5zX3RyYWNrc2tldyA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc190cmFja3NrZXcpOworCXVzcGktPnNfY3NhZGRyID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX2NzYWRkcik7CisJdXNwaS0+c19jc3NpemUgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfY3NzaXplKTsKKwl1c3BpLT5zX2Nnc2l6ZSA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jZ3NpemUpOworCXVzcGktPnNfbnRyYWsgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfbnRyYWspOworCXVzcGktPnNfbnNlY3QgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfbnNlY3QpOworCXVzcGktPnNfc3BjID0gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX3NwYyk7CisJdXNwaS0+c19pcGcgPSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfaXBnKTsKKwl1c3BpLT5zX2ZwZyA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19mcGcpOworCXVzcGktPnNfY3BjID0gZnMzMl90b19jcHUoc2IsIHVzYjItPmZzX2NwYyk7CisJdXNwaS0+c19jb250aWdzdW1zaXplID0gZnMzMl90b19jcHUoc2IsIHVzYjMtPmZzX3UyLmZzXzQ0LmZzX2NvbnRpZ3N1bXNpemUpOworCXVzcGktPnNfcWJtYXNrID0gdWZzX2dldF9mc19xYm1hc2soc2IsIHVzYjMpOworCXVzcGktPnNfcWZtYXNrID0gdWZzX2dldF9mc19xZm1hc2soc2IsIHVzYjMpOworCXVzcGktPnNfcG9zdGJsZm9ybWF0ID0gZnMzMl90b19jcHUoc2IsIHVzYjMtPmZzX3Bvc3RibGZvcm1hdCk7CisJdXNwaS0+c19ucnBvcyA9IGZzMzJfdG9fY3B1KHNiLCB1c2IzLT5mc19ucnBvcyk7CisJdXNwaS0+c19wb3N0YmxvZmYgPSBmczMyX3RvX2NwdShzYiwgdXNiMy0+ZnNfcG9zdGJsb2ZmKTsKKwl1c3BpLT5zX3JvdGJsb2ZmID0gZnMzMl90b19jcHUoc2IsIHVzYjMtPmZzX3JvdGJsb2ZmKTsKKworCS8qCisJICogQ29tcHV0ZSBhbm90aGVyIGZyZXF1ZW50bHkgdXNlZCB2YWx1ZXMKKwkgKi8KKwl1c3BpLT5zX2ZwYm1hc2sgPSB1c3BpLT5zX2ZwYiAtIDE7CisJaWYgKChmbGFncyAmIFVGU19UWVBFX01BU0spID09IFVGU19UWVBFX1VGUzIpIHsKKwkJdXNwaS0+c19hcGJzaGlmdCA9IHVzcGktPnNfYnNoaWZ0IC0gMzsKKwl9CisJZWxzZSB7CisJCXVzcGktPnNfYXBic2hpZnQgPSB1c3BpLT5zX2JzaGlmdCAtIDI7CisJfQorCXVzcGktPnNfMmFwYnNoaWZ0ID0gdXNwaS0+c19hcGJzaGlmdCAqIDI7CisJdXNwaS0+c18zYXBic2hpZnQgPSB1c3BpLT5zX2FwYnNoaWZ0ICogMzsKKwl1c3BpLT5zX2FwYiA9IDEgPDwgdXNwaS0+c19hcGJzaGlmdDsKKwl1c3BpLT5zXzJhcGIgPSAxIDw8IHVzcGktPnNfMmFwYnNoaWZ0OworCXVzcGktPnNfM2FwYiA9IDEgPDwgdXNwaS0+c18zYXBic2hpZnQ7CisJdXNwaS0+c19hcGJtYXNrID0gdXNwaS0+c19hcGIgLSAxOworCXVzcGktPnNfbnNwZnNoaWZ0ID0gdXNwaS0+c19mc2hpZnQgLSBVRlNfU0VDVE9SX0JJVFM7CisJdXNwaS0+c19uc3BiID0gdXNwaS0+c19uc3BmIDw8IHVzcGktPnNfZnBic2hpZnQ7CisJdXNwaS0+c19pbm9wZiA9IHVzcGktPnNfaW5vcGIgPj4gdXNwaS0+c19mcGJzaGlmdDsKKwl1c3BpLT5zX2JwZiA9IHVzcGktPnNfZnNpemUgPDwgMzsKKwl1c3BpLT5zX2JwZnNoaWZ0ID0gdXNwaS0+c19mc2hpZnQgKyAzOworCXVzcGktPnNfYnBmbWFzayA9IHVzcGktPnNfYnBmIC0gMTsKKwlpZiAoKHNiaS0+c19tb3VudF9vcHQgJiBVRlNfTU9VTlRfVUZTVFlQRSkgPT0KKwkgICAgVUZTX01PVU5UX1VGU1RZUEVfNDRCU0QpCisJCXVzcGktPnNfbWF4c3ltbGlua2xlbiA9CisJCSAgICBmczMyX3RvX2NwdShzYiwgdXNiMy0+ZnNfdTIuZnNfNDQuZnNfbWF4c3ltbGlua2xlbik7CisJCisJc2JpLT5zX2ZsYWdzID0gZmxhZ3M7CisKKwlpbm9kZSA9IGlnZXQoc2IsIFVGU19ST09USU5PKTsKKwlpZiAoIWlub2RlIHx8IGlzX2JhZF9pbm9kZShpbm9kZSkpCisJCWdvdG8gZmFpbGVkOworCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3QoaW5vZGUpOworCWlmICghc2ItPnNfcm9vdCkKKwkJZ290byBkYWxsb2NfZmFpbGVkOworCisKKwkvKgorCSAqIFJlYWQgY3lsaW5kZXIgZ3JvdXAgc3RydWN0dXJlcworCSAqLworCWlmICghKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkKKwkJaWYgKCF1ZnNfcmVhZF9jeWxpbmRlcl9zdHJ1Y3R1cmVzKHNiKSkKKwkJCWdvdG8gZmFpbGVkOworCisJVUZTRCgoIkVYSVRcbiIpKQorCXJldHVybiAwOworCitkYWxsb2NfZmFpbGVkOgorCWlwdXQoaW5vZGUpOworZmFpbGVkOgorCWlmICh1YmgpIHViaF9icmVsc2VfdXNwaSAodXNwaSk7CisJaWYgKHVzcGkpIGtmcmVlICh1c3BpKTsKKwlpZiAoc2JpKSBrZnJlZShzYmkpOworCXNiLT5zX2ZzX2luZm8gPSBOVUxMOworCVVGU0QoKCJFWElUIChGQUlMRUQpXG4iKSkKKwlyZXR1cm4gLUVJTlZBTDsKKworZmFpbGVkX25vbWVtOgorCVVGU0QoKCJFWElUIChOT01FTSlcbiIpKQorCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9pZCB1ZnNfd3JpdGVfc3VwZXIgKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpIHsKKwlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGk7CisJc3RydWN0IHVmc19zdXBlcl9ibG9ja19maXJzdCAqIHVzYjE7CisJc3RydWN0IHVmc19zdXBlcl9ibG9ja190aGlyZCAqIHVzYjM7CisJdW5zaWduZWQgZmxhZ3M7CisKKwlsb2NrX2tlcm5lbCgpOworCisJVUZTRCgoIkVOVEVSXG4iKSkKKwlmbGFncyA9IFVGU19TQihzYiktPnNfZmxhZ3M7CisJdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKKwl1c2IxID0gdWJoX2dldF91c2JfZmlyc3QoVVNQSV9VQkgpOworCXVzYjMgPSB1YmhfZ2V0X3VzYl90aGlyZChVU1BJX1VCSCk7CisKKwlpZiAoIShzYi0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJdXNiMS0+ZnNfdGltZSA9IGNwdV90b19mczMyKHNiLCBnZXRfc2Vjb25kcygpKTsKKwkJaWYgKChmbGFncyAmIFVGU19TVF9NQVNLKSA9PSBVRlNfU1RfU1VOIAorCQkgIHx8IChmbGFncyAmIFVGU19TVF9NQVNLKSA9PSBVRlNfU1RfU1VOeDg2KQorCQkJdWZzX3NldF9mc19zdGF0ZShzYiwgdXNiMSwgdXNiMywKKwkJCQkJVUZTX0ZTT0sgLSBmczMyX3RvX2NwdShzYiwgdXNiMS0+ZnNfdGltZSkpOworCQl1YmhfbWFya19idWZmZXJfZGlydHkgKFVTUElfVUJIKTsKKwl9CisJc2ItPnNfZGlydCA9IDA7CisJVUZTRCgoIkVYSVRcbiIpKQorCXVubG9ja19rZXJuZWwoKTsKK30KKworc3RhdGljIHZvaWQgdWZzX3B1dF9zdXBlciAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgdWZzX3NiX2luZm8gKiBzYmkgPSBVRlNfU0Ioc2IpOworCQkKKwlVRlNEKCgiRU5URVJcbiIpKQorCisJaWYgKCEoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKQorCQl1ZnNfcHV0X2N5bGluZGVyX3N0cnVjdHVyZXMgKHNiKTsKKwkKKwl1YmhfYnJlbHNlX3VzcGkgKHNiaS0+c191c3BpKTsKKwlrZnJlZSAoc2JpLT5zX3VzcGkpOworCWtmcmVlIChzYmkpOworCXNiLT5zX2ZzX2luZm8gPSBOVUxMOworCXJldHVybjsKK30KKworCitzdGF0aWMgaW50IHVmc19yZW1vdW50IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgKm1vdW50X2ZsYWdzLCBjaGFyICpkYXRhKQoreworCXN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaTsKKwlzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX2ZpcnN0ICogdXNiMTsKKwlzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX3RoaXJkICogdXNiMzsKKwl1bnNpZ25lZCBuZXdfbW91bnRfb3B0LCB1ZnN0eXBlOworCXVuc2lnbmVkIGZsYWdzOworCQorCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CisJZmxhZ3MgPSBVRlNfU0Ioc2IpLT5zX2ZsYWdzOworCXVzYjEgPSB1YmhfZ2V0X3VzYl9maXJzdChVU1BJX1VCSCk7CisJdXNiMyA9IHViaF9nZXRfdXNiX3RoaXJkKFVTUElfVUJIKTsKKwkKKwkvKgorCSAqIEFsbG93IHRoZSAiY2hlY2siIG9wdGlvbiB0byBiZSBwYXNzZWQgYXMgYSByZW1vdW50IG9wdGlvbi4KKwkgKiBJdCBpcyBub3QgcG9zc2libGUgdG8gY2hhbmdlIHVmc3R5cGUgb3B0aW9uIGR1cmluZyByZW1vdW50CisJICovCisJdWZzdHlwZSA9IFVGU19TQihzYiktPnNfbW91bnRfb3B0ICYgVUZTX01PVU5UX1VGU1RZUEU7CisJbmV3X21vdW50X29wdCA9IDA7CisJdWZzX3NldF9vcHQgKG5ld19tb3VudF9vcHQsIE9ORVJST1JfTE9DSyk7CisJaWYgKCF1ZnNfcGFyc2Vfb3B0aW9ucyAoZGF0YSwgJm5ld19tb3VudF9vcHQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIShuZXdfbW91bnRfb3B0ICYgVUZTX01PVU5UX1VGU1RZUEUpKSB7CisJCW5ld19tb3VudF9vcHQgfD0gdWZzdHlwZTsKKwl9CisJZWxzZSBpZiAoKG5ld19tb3VudF9vcHQgJiBVRlNfTU9VTlRfVUZTVFlQRSkgIT0gdWZzdHlwZSkgeworCQlwcmludGsoInVmc3R5cGUgY2FuJ3QgYmUgY2hhbmdlZCBkdXJpbmcgcmVtb3VudFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICgoKm1vdW50X2ZsYWdzICYgTVNfUkRPTkxZKSA9PSAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7CisJCVVGU19TQihzYiktPnNfbW91bnRfb3B0ID0gbmV3X21vdW50X29wdDsKKwkJcmV0dXJuIDA7CisJfQorCQorCS8qCisJICogZnMgd2FzIG1vdXRlZCBhcyBydywgcmVtb3VudGluZyBybworCSAqLworCWlmICgqbW91bnRfZmxhZ3MgJiBNU19SRE9OTFkpIHsKKwkJdWZzX3B1dF9jeWxpbmRlcl9zdHJ1Y3R1cmVzKHNiKTsKKwkJdXNiMS0+ZnNfdGltZSA9IGNwdV90b19mczMyKHNiLCBnZXRfc2Vjb25kcygpKTsKKwkJaWYgKChmbGFncyAmIFVGU19TVF9NQVNLKSA9PSBVRlNfU1RfU1VOCisJCSAgfHwgKGZsYWdzICYgVUZTX1NUX01BU0spID09IFVGU19TVF9TVU54ODYpIAorCQkJdWZzX3NldF9mc19zdGF0ZShzYiwgdXNiMSwgdXNiMywKKwkJCQlVRlNfRlNPSyAtIGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc190aW1lKSk7CisJCXViaF9tYXJrX2J1ZmZlcl9kaXJ0eSAoVVNQSV9VQkgpOworCQlzYi0+c19kaXJ0ID0gMDsKKwkJc2ItPnNfZmxhZ3MgfD0gTVNfUkRPTkxZOworCX0KKwkvKgorCSAqIGZzIHdhcyBtb3VudGVkIGFzIHJvLCByZW1vdW50aW5nIHJ3CisJICovCisJZWxzZSB7CisjaWZuZGVmIENPTkZJR19VRlNfRlNfV1JJVEUKKwkJcHJpbnRrKCJ1ZnMgd2FzIGNvbXBpbGVkIHdpdGggcmVhZC1vbmx5IHN1cHBvcnQsICIKKwkJImNhbid0IGJlIG1vdW50ZWQgYXMgcmVhZC13cml0ZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworI2Vsc2UKKwkJaWYgKHVmc3R5cGUgIT0gVUZTX01PVU5UX1VGU1RZUEVfU1VOICYmIAorCQkgICAgdWZzdHlwZSAhPSBVRlNfTU9VTlRfVUZTVFlQRV80NEJTRCAmJgorCQkgICAgdWZzdHlwZSAhPSBVRlNfTU9VTlRfVUZTVFlQRV9TVU54ODYpIHsKKwkJCXByaW50aygidGhpcyB1ZnN0eXBlIGlzIHJlYWQtb25seSBzdXBwb3J0ZWRcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKCF1ZnNfcmVhZF9jeWxpbmRlcl9zdHJ1Y3R1cmVzIChzYikpIHsKKwkJCXByaW50aygiZmFpbGVkIGR1cmluZyByZW1vdW50aW5nXG4iKTsKKwkJCXJldHVybiAtRVBFUk07CisJCX0KKwkJc2ItPnNfZmxhZ3MgJj0gfk1TX1JET05MWTsKKyNlbmRpZgorCX0KKwlVRlNfU0Ioc2IpLT5zX21vdW50X29wdCA9IG5ld19tb3VudF9vcHQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdWZzX3N0YXRmcyAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGtzdGF0ZnMgKmJ1ZikKK3sKKwlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGk7CisJc3RydWN0IHVmc19zdXBlcl9ibG9ja19maXJzdCAqIHVzYjE7CisJc3RydWN0IHVmc19zdXBlcl9ibG9jayAqIHVzYjsKKwl1bnNpZ25lZCAgZmxhZ3MgPSAwOworCisJbG9ja19rZXJuZWwoKTsKKworCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CisJdXNiMSA9IHViaF9nZXRfdXNiX2ZpcnN0IChVU1BJX1VCSCk7CisJdXNiICA9IChzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrICopCisJCSgoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqKXVzcGkpLT5iaFswXS0+Yl9kYXRhIDsKKwkKKwlmbGFncyA9IFVGU19TQihzYiktPnNfZmxhZ3M7CisJaWYgKChmbGFncyAmIFVGU19UWVBFX01BU0spID09IFVGU19UWVBFX1VGUzIpIHsKKwkJYnVmLT5mX3R5cGUgPSBVRlMyX01BR0lDOworCQlidWYtPmZfYmxvY2tzID0gZnM2NF90b19jcHUoc2IsIHVzYi0+ZnNfdTExLmZzX3UyLmZzX2RzaXplKTsKKwkJYnVmLT5mX2JmcmVlID0gdWZzX2Jsa3N0b2ZyYWdzKGZzNjRfdG9fY3B1KHNiLCB1c2ItPmZzX3UxMS5mc191Mi5mc19jc3RvdGFsLmNzX25iZnJlZSkpICsKKwkJCWZzNjRfdG9fY3B1KHNiLCB1c2ItPmZzX3UxMS5mc191Mi5mc19jc3RvdGFsLmNzX25mZnJlZSk7CisJCWJ1Zi0+Zl9mZnJlZSA9IGZzNjRfdG9fY3B1KHNiLAorICAgICAgICAJCXVzYi0+ZnNfdTExLmZzX3UyLmZzX2NzdG90YWwuY3NfbmlmcmVlKTsKKwl9CisJZWxzZSB7CisJCWJ1Zi0+Zl90eXBlID0gVUZTX01BR0lDOworCQlidWYtPmZfYmxvY2tzID0gdXNwaS0+c19kc2l6ZTsKKwkJYnVmLT5mX2JmcmVlID0gdWZzX2Jsa3N0b2ZyYWdzKGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jc3RvdGFsLmNzX25iZnJlZSkpICsKKwkJCWZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jc3RvdGFsLmNzX25mZnJlZSk7CisJCWJ1Zi0+Zl9mZnJlZSA9IGZzMzJfdG9fY3B1KHNiLCB1c2IxLT5mc19jc3RvdGFsLmNzX25pZnJlZSk7CisJfQorCWJ1Zi0+Zl9ic2l6ZSA9IHNiLT5zX2Jsb2Nrc2l6ZTsKKwlidWYtPmZfYmF2YWlsID0gKGJ1Zi0+Zl9iZnJlZSA+ICgoKGxvbmcpYnVmLT5mX2Jsb2NrcyAvIDEwMCkgKiB1c3BpLT5zX21pbmZyZWUpKQorCQk/IChidWYtPmZfYmZyZWUgLSAoKChsb25nKWJ1Zi0+Zl9ibG9ja3MgLyAxMDApICogdXNwaS0+c19taW5mcmVlKSkgOiAwOworCWJ1Zi0+Zl9maWxlcyA9IHVzcGktPnNfbmNnICogdXNwaS0+c19pcGc7CisJYnVmLT5mX25hbWVsZW4gPSBVRlNfTUFYTkFNTEVOOworCisJdW5sb2NrX2tlcm5lbCgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBrbWVtX2NhY2hlX3QgKiB1ZnNfaW5vZGVfY2FjaGVwOworCitzdGF0aWMgc3RydWN0IGlub2RlICp1ZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgdWZzX2lub2RlX2luZm8gKmVpOworCWVpID0gKHN0cnVjdCB1ZnNfaW5vZGVfaW5mbyAqKWttZW1fY2FjaGVfYWxsb2ModWZzX2lub2RlX2NhY2hlcCwgU0xBQl9LRVJORUwpOworCWlmICghZWkpCisJCXJldHVybiBOVUxMOworCWVpLT52ZnNfaW5vZGUuaV92ZXJzaW9uID0gMTsKKwlyZXR1cm4gJmVpLT52ZnNfaW5vZGU7Cit9CisKK3N0YXRpYyB2b2lkIHVmc19kZXN0cm95X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJa21lbV9jYWNoZV9mcmVlKHVmc19pbm9kZV9jYWNoZXAsIFVGU19JKGlub2RlKSk7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICogZm9vLCBrbWVtX2NhY2hlX3QgKiBjYWNoZXAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IHVmc19pbm9kZV9pbmZvICplaSA9IChzdHJ1Y3QgdWZzX2lub2RlX2luZm8gKikgZm9vOworCisJaWYgKChmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CisJICAgIFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikKKwkJaW5vZGVfaW5pdF9vbmNlKCZlaS0+dmZzX2lub2RlKTsKK30KKyAKK3N0YXRpYyBpbnQgaW5pdF9pbm9kZWNhY2hlKHZvaWQpCit7CisJdWZzX2lub2RlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJ1ZnNfaW5vZGVfY2FjaGUiLAorCQkJCQkgICAgIHNpemVvZihzdHJ1Y3QgdWZzX2lub2RlX2luZm8pLAorCQkJCQkgICAgIDAsIFNMQUJfUkVDTEFJTV9BQ0NPVU5ULAorCQkJCQkgICAgIGluaXRfb25jZSwgTlVMTCk7CisJaWYgKHVmc19pbm9kZV9jYWNoZXAgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfaW5vZGVjYWNoZSh2b2lkKQoreworCWlmIChrbWVtX2NhY2hlX2Rlc3Ryb3kodWZzX2lub2RlX2NhY2hlcCkpCisJCXByaW50ayhLRVJOX0lORk8gInVmc19pbm9kZV9jYWNoZTogbm90IGFsbCBzdHJ1Y3R1cmVzIHdlcmUgZnJlZWRcbiIpOworfQorCisjaWZkZWYgQ09ORklHX1FVT1RBCitzdGF0aWMgc3NpemVfdCB1ZnNfcXVvdGFfcmVhZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgaW50LCBjaGFyICosc2l6ZV90LCBsb2ZmX3QpOworc3RhdGljIHNzaXplX3QgdWZzX3F1b3RhX3dyaXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgc2l6ZV90LCBsb2ZmX3QpOworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qgc3VwZXJfb3BlcmF0aW9ucyB1ZnNfc3VwZXJfb3BzID0geworCS5hbGxvY19pbm9kZQk9IHVmc19hbGxvY19pbm9kZSwKKwkuZGVzdHJveV9pbm9kZQk9IHVmc19kZXN0cm95X2lub2RlLAorCS5yZWFkX2lub2RlCT0gdWZzX3JlYWRfaW5vZGUsCisJLndyaXRlX2lub2RlCT0gdWZzX3dyaXRlX2lub2RlLAorCS5kZWxldGVfaW5vZGUJPSB1ZnNfZGVsZXRlX2lub2RlLAorCS5wdXRfc3VwZXIJPSB1ZnNfcHV0X3N1cGVyLAorCS53cml0ZV9zdXBlcgk9IHVmc193cml0ZV9zdXBlciwKKwkuc3RhdGZzCQk9IHVmc19zdGF0ZnMsCisJLnJlbW91bnRfZnMJPSB1ZnNfcmVtb3VudCwKKyNpZmRlZiBDT05GSUdfUVVPVEEKKwkucXVvdGFfcmVhZAk9IHVmc19xdW90YV9yZWFkLAorCS5xdW90YV93cml0ZQk9IHVmc19xdW90YV93cml0ZSwKKyNlbmRpZgorfTsKKworI2lmZGVmIENPTkZJR19RVU9UQQorCisvKiBSZWFkIGRhdGEgZnJvbSBxdW90YWZpbGUgLSBhdm9pZCBwYWdlY2FjaGUgYW5kIHN1Y2ggYmVjYXVzZSB3ZSBjYW5ub3QgYWZmb3JkCisgKiBhY3F1aXJpbmcgdGhlIGxvY2tzLi4uIEFzIHF1b3RhIGZpbGVzIGFyZSBuZXZlciB0cnVuY2F0ZWQgYW5kIHF1b3RhIGNvZGUKKyAqIGl0c2VsZiBzZXJpYWxpemVzIHRoZSBvcGVyYXRpb25zIChhbmQgbm9vbmUgZWxzZSBzaG91bGQgdG91Y2ggdGhlIGZpbGVzKQorICogd2UgZG9uJ3QgaGF2ZSB0byBiZSBhZnJhaWQgb2YgcmFjZXMgKi8KK3N0YXRpYyBzc2l6ZV90IHVmc19xdW90YV9yZWFkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCB0eXBlLCBjaGFyICpkYXRhLAorCQkJICAgICAgIHNpemVfdCBsZW4sIGxvZmZfdCBvZmYpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHNiX2Rxb3B0KHNiKS0+ZmlsZXNbdHlwZV07CisJc2VjdG9yX3QgYmxrID0gb2ZmID4+IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOworCWludCBlcnIgPSAwOworCWludCBvZmZzZXQgPSBvZmYgJiAoc2ItPnNfYmxvY2tzaXplIC0gMSk7CisJaW50IHRvY29weTsKKwlzaXplX3QgdG9yZWFkOworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CisJbG9mZl90IGlfc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKworCWlmIChvZmYgPiBpX3NpemUpCisJCXJldHVybiAwOworCWlmIChvZmYrbGVuID4gaV9zaXplKQorCQlsZW4gPSBpX3NpemUtb2ZmOworCXRvcmVhZCA9IGxlbjsKKwl3aGlsZSAodG9yZWFkID4gMCkgeworCQl0b2NvcHkgPSBzYi0+c19ibG9ja3NpemUgLSBvZmZzZXQgPCB0b3JlYWQgPworCQkJCXNiLT5zX2Jsb2Nrc2l6ZSAtIG9mZnNldCA6IHRvcmVhZDsKKworCQliaCA9IHVmc19icmVhZChpbm9kZSwgYmxrLCAwLCAmZXJyKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCWlmICghYmgpCS8qIEEgaG9sZT8gKi8KKwkJCW1lbXNldChkYXRhLCAwLCB0b2NvcHkpOworCQllbHNlIHsKKwkJCW1lbWNweShkYXRhLCBiaC0+Yl9kYXRhK29mZnNldCwgdG9jb3B5KTsKKwkJCWJyZWxzZShiaCk7CisJCX0KKwkJb2Zmc2V0ID0gMDsKKwkJdG9yZWFkIC09IHRvY29weTsKKwkJZGF0YSArPSB0b2NvcHk7CisJCWJsaysrOworCX0KKwlyZXR1cm4gbGVuOworfQorCisvKiBXcml0ZSB0byBxdW90YWZpbGUgKi8KK3N0YXRpYyBzc2l6ZV90IHVmc19xdW90YV93cml0ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgdHlwZSwKKwkJCQljb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuLCBsb2ZmX3Qgb2ZmKQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBzYl9kcW9wdChzYiktPmZpbGVzW3R5cGVdOworCXNlY3Rvcl90IGJsayA9IG9mZiA+PiBzYi0+c19ibG9ja3NpemVfYml0czsKKwlpbnQgZXJyID0gMDsKKwlpbnQgb2Zmc2V0ID0gb2ZmICYgKHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpOworCWludCB0b2NvcHk7CisJc2l6ZV90IHRvd3JpdGUgPSBsZW47CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCWRvd24oJmlub2RlLT5pX3NlbSk7CisJd2hpbGUgKHRvd3JpdGUgPiAwKSB7CisJCXRvY29weSA9IHNiLT5zX2Jsb2Nrc2l6ZSAtIG9mZnNldCA8IHRvd3JpdGUgPworCQkJCXNiLT5zX2Jsb2Nrc2l6ZSAtIG9mZnNldCA6IHRvd3JpdGU7CisKKwkJYmggPSB1ZnNfYnJlYWQoaW5vZGUsIGJsaywgMSwgJmVycik7CisJCWlmICghYmgpCisJCQlnb3RvIG91dDsKKwkJbG9ja19idWZmZXIoYmgpOworCQltZW1jcHkoYmgtPmJfZGF0YStvZmZzZXQsIGRhdGEsIHRvY29weSk7CisJCWZsdXNoX2RjYWNoZV9wYWdlKGJoLT5iX3BhZ2UpOworCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJYnJlbHNlKGJoKTsKKwkJb2Zmc2V0ID0gMDsKKwkJdG93cml0ZSAtPSB0b2NvcHk7CisJCWRhdGEgKz0gdG9jb3B5OworCQlibGsrKzsKKwl9CitvdXQ6CisJaWYgKGxlbiA9PSB0b3dyaXRlKQorCQlyZXR1cm4gZXJyOworCWlmIChpbm9kZS0+aV9zaXplIDwgb2ZmK2xlbi10b3dyaXRlKQorCQlpX3NpemVfd3JpdGUoaW5vZGUsIG9mZitsZW4tdG93cml0ZSk7CisJaW5vZGUtPmlfdmVyc2lvbisrOworCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCXVwKCZpbm9kZS0+aV9zZW0pOworCXJldHVybiBsZW4gLSB0b3dyaXRlOworfQorCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqdWZzX2dldF9zYihzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqZnNfdHlwZSwKKwlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLCB2b2lkICpkYXRhKQoreworCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIHVmc19maWxsX3N1cGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHVmc19mc190eXBlID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAidWZzIiwKKwkuZ2V0X3NiCQk9IHVmc19nZXRfc2IsCisJLmtpbGxfc2IJPSBraWxsX2Jsb2NrX3N1cGVyLAorCS5mc19mbGFncwk9IEZTX1JFUVVJUkVTX0RFViwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfdWZzX2ZzKHZvaWQpCit7CisJaW50IGVyciA9IGluaXRfaW5vZGVjYWNoZSgpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MTsKKwllcnIgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZ1ZnNfZnNfdHlwZSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisJcmV0dXJuIDA7CitvdXQ6CisJZGVzdHJveV9pbm9kZWNhY2hlKCk7CitvdXQxOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X3Vmc19mcyh2b2lkKQoreworCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmdWZzX2ZzX3R5cGUpOworCWRlc3Ryb3lfaW5vZGVjYWNoZSgpOworfQorCittb2R1bGVfaW5pdChpbml0X3Vmc19mcykKK21vZHVsZV9leGl0KGV4aXRfdWZzX2ZzKQorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZnMvdWZzL3N3YWIuaCBiL2ZzL3Vmcy9zd2FiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY4M2QyYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3Vmcy9zd2FiLmgKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiAgbGludXgvZnMvdWZzL3N3YWIuaAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NywgMTk5OCBGcmFuY29pcy1SZW5lIFJpZGVhdSA8ZmFyZUB0dW5lcy5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDE5OTggSmFrdWIgSmVsaW5layA8ampAdWx0cmEubGludXguY3o+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcgPGhjaEBpbmZyYWRlYWQub3JnPgorICovCisKKyNpZm5kZWYgX1VGU19TV0FCX0gKKyNkZWZpbmUgX1VGU19TV0FCX0gKKworLyoKKyAqIE5vdGVzOgorICogICAgSEVSRSBXRSBBU1NVTUUgRUlUSEVSIEJJRyBPUiBMSVRUTEUgRU5ESUFOIFVGU2VzCisgKiAgICBpbiBjYXNlIHRoZXJlIGFyZSB1ZnMgaW1wbGVtZW50YXRpb25zIHRoYXQgaGF2ZSBzdHJhbmdlIGJ5dGVzZXhlcywKKyAqICAgIHlvdSdsbCBuZWVkIHRvIG1vZGlmeSBjb2RlIGhlcmUgYXMgd2VsbCBhcyBpbiB1ZnNfc3VwZXIuYyBhbmQgdWZzX2ZzLmgKKyAqICAgIHRvIHN1cHBvcnQgdGhlbS4KKyAqLworCitlbnVtIHsKKwlCWVRFU0VYX0xFLAorCUJZVEVTRVhfQkUKK307CisKK3N0YXRpYyBpbmxpbmUgdTY0CitmczY0X3RvX2NwdShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCwgX19mczY0IG4pCit7CisJaWYgKFVGU19TQihzYnApLT5zX2J5dGVzZXggPT0gQllURVNFWF9MRSkKKwkJcmV0dXJuIGxlNjRfdG9fY3B1KChfX2ZvcmNlIF9fbGU2NCluKTsKKwllbHNlCisJCXJldHVybiBiZTY0X3RvX2NwdSgoX19mb3JjZSBfX2JlNjQpbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19mczY0CitjcHVfdG9fZnM2NChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCwgdTY0IG4pCit7CisJaWYgKFVGU19TQihzYnApLT5zX2J5dGVzZXggPT0gQllURVNFWF9MRSkKKwkJcmV0dXJuIChfX2ZvcmNlIF9fZnM2NCljcHVfdG9fbGU2NChuKTsKKwllbHNlCisJCXJldHVybiAoX19mb3JjZSBfX2ZzNjQpY3B1X3RvX2JlNjQobik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB1MzIKK2ZzNjRfYWRkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2JwLCB1MzIgKm4sIGludCBkKQoreworCWlmIChVRlNfU0Ioc2JwKS0+c19ieXRlc2V4ID09IEJZVEVTRVhfTEUpCisJCXJldHVybiAqbiA9IGNwdV90b19sZTY0KGxlNjRfdG9fY3B1KCpuKStkKTsKKwllbHNlCisJCXJldHVybiAqbiA9IGNwdV90b19iZTY0KGJlNjRfdG9fY3B1KCpuKStkKTsKK30KKworc3RhdGljIF9faW5saW5lIHUzMgorZnM2NF9zdWIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIHUzMiAqbiwgaW50IGQpCit7CisJaWYgKFVGU19TQihzYnApLT5zX2J5dGVzZXggPT0gQllURVNFWF9MRSkKKwkJcmV0dXJuICpuID0gY3B1X3RvX2xlNjQobGU2NF90b19jcHUoKm4pLWQpOworCWVsc2UKKwkJcmV0dXJuICpuID0gY3B1X3RvX2JlNjQoYmU2NF90b19jcHUoKm4pLWQpOworfQorCitzdGF0aWMgX19pbmxpbmUgdTMyCitmczMyX3RvX2NwdShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCwgX19mczMyIG4pCit7CisJaWYgKFVGU19TQihzYnApLT5zX2J5dGVzZXggPT0gQllURVNFWF9MRSkKKwkJcmV0dXJuIGxlMzJfdG9fY3B1KChfX2ZvcmNlIF9fbGUzMiluKTsKKwllbHNlCisJCXJldHVybiBiZTMyX3RvX2NwdSgoX19mb3JjZSBfX2JlMzIpbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19mczMyCitjcHVfdG9fZnMzMihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCwgdTMyIG4pCit7CisJaWYgKFVGU19TQihzYnApLT5zX2J5dGVzZXggPT0gQllURVNFWF9MRSkKKwkJcmV0dXJuIChfX2ZvcmNlIF9fZnMzMiljcHVfdG9fbGUzMihuKTsKKwllbHNlCisJCXJldHVybiAoX19mb3JjZSBfX2ZzMzIpY3B1X3RvX2JlMzIobik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZnMzMl9hZGQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIF9fZnMzMiAqbiwgaW50IGQpCit7CisJaWYgKFVGU19TQihzYnApLT5zX2J5dGVzZXggPT0gQllURVNFWF9MRSkKKwkJKihfX2xlMzIgKiluID0gY3B1X3RvX2xlMzIobGUzMl90b19jcHUoKihfX2xlMzIgKiluKStkKTsKKwllbHNlCisJCSooX19iZTMyICopbiA9IGNwdV90b19iZTMyKGJlMzJfdG9fY3B1KCooX19iZTMyICopbikrZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZnMzMl9zdWIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIF9fZnMzMiAqbiwgaW50IGQpCit7CisJaWYgKFVGU19TQihzYnApLT5zX2J5dGVzZXggPT0gQllURVNFWF9MRSkKKwkJKihfX2xlMzIgKiluID0gY3B1X3RvX2xlMzIobGUzMl90b19jcHUoKihfX2xlMzIgKiluKS1kKTsKKwllbHNlCisJCSooX19iZTMyICopbiA9IGNwdV90b19iZTMyKGJlMzJfdG9fY3B1KCooX19iZTMyICopbiktZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2CitmczE2X3RvX2NwdShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCwgX19mczE2IG4pCit7CisJaWYgKFVGU19TQihzYnApLT5zX2J5dGVzZXggPT0gQllURVNFWF9MRSkKKwkJcmV0dXJuIGxlMTZfdG9fY3B1KChfX2ZvcmNlIF9fbGUxNiluKTsKKwllbHNlCisJCXJldHVybiBiZTE2X3RvX2NwdSgoX19mb3JjZSBfX2JlMTYpbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgX19mczE2CitjcHVfdG9fZnMxNihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNicCwgdTE2IG4pCit7CisJaWYgKFVGU19TQihzYnApLT5zX2J5dGVzZXggPT0gQllURVNFWF9MRSkKKwkJcmV0dXJuIChfX2ZvcmNlIF9fZnMxNiljcHVfdG9fbGUxNihuKTsKKwllbHNlCisJCXJldHVybiAoX19mb3JjZSBfX2ZzMTYpY3B1X3RvX2JlMTYobik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZnMxNl9hZGQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIF9fZnMxNiAqbiwgaW50IGQpCit7CisJaWYgKFVGU19TQihzYnApLT5zX2J5dGVzZXggPT0gQllURVNFWF9MRSkKKwkJKihfX2xlMTYgKiluID0gY3B1X3RvX2xlMTYobGUxNl90b19jcHUoKihfX2xlMTYgKiluKStkKTsKKwllbHNlCisJCSooX19iZTE2ICopbiA9IGNwdV90b19iZTE2KGJlMTZfdG9fY3B1KCooX19iZTE2ICopbikrZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorZnMxNl9zdWIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYnAsIF9fZnMxNiAqbiwgaW50IGQpCit7CisJaWYgKFVGU19TQihzYnApLT5zX2J5dGVzZXggPT0gQllURVNFWF9MRSkKKwkJKihfX2xlMTYgKiluID0gY3B1X3RvX2xlMTYobGUxNl90b19jcHUoKihfX2xlMTYgKiluKS1kKTsKKwllbHNlCisJCSooX19iZTE2ICopbiA9IGNwdV90b19iZTE2KGJlMTZfdG9fY3B1KCooX19iZTE2ICopbiktZCk7Cit9CisKKyNlbmRpZiAvKiBfVUZTX1NXQUJfSCAqLwpkaWZmIC0tZ2l0IGEvZnMvdWZzL3N5bWxpbmsuYyBiL2ZzL3Vmcy9zeW1saW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBlNDkxNAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3Vmcy9zeW1saW5rLmMKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqICBsaW51eC9mcy91ZnMvc3ltbGluay5jCisgKgorICogT25seSBmYXN0IHN5bWxpbmtzIGxlZnQgaGVyZSAtIHRoZSByZXN0IGlzIGRvbmUgYnkgZ2VuZXJpYyBjb2RlLiBBViwgMTk5OQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OAorICogRGFuaWVsIFBpcmtsIDxkYW5pZWwucGlya2xAZW1haS5jej4KKyAqIENoYXJsZXMgVW5pdmVyc2l0eSwgRmFjdWx0eSBvZiBNYXRoZW1hdGljcyBhbmQgUGh5c2ljcworICoKKyAqICBmcm9tCisgKgorICogIGxpbnV4L2ZzL2V4dDIvc3ltbGluay5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1CisgKiBSZW15IENhcmQgKGNhcmRAbWFzaS5pYnAuZnIpCisgKiBMYWJvcmF0b2lyZSBNQVNJIC0gSW5zdGl0dXQgQmxhaXNlIFBhc2NhbAorICogVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICoKKyAqICBmcm9tCisgKgorICogIGxpbnV4L2ZzL21pbml4L3N5bWxpbmsuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKgorICogIGV4dDIgc3ltbGluayBoYW5kbGluZyBjb2RlCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC91ZnNfZnMuaD4KKworc3RhdGljIGludCB1ZnNfZm9sbG93X2xpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3QgdWZzX2lub2RlX2luZm8gKnAgPSBVRlNfSShkZW50cnktPmRfaW5vZGUpOworCW5kX3NldF9saW5rKG5kLCAoY2hhciopcC0+aV91MS5pX3N5bWxpbmspOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyB1ZnNfZmFzdF9zeW1saW5rX2lub2RlX29wZXJhdGlvbnMgPSB7CisJLnJlYWRsaW5rCT0gZ2VuZXJpY19yZWFkbGluaywKKwkuZm9sbG93X2xpbmsJPSB1ZnNfZm9sbG93X2xpbmssCit9OwpkaWZmIC0tZ2l0IGEvZnMvdWZzL3RydW5jYXRlLmMgYi9mcy91ZnMvdHJ1bmNhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzEyYmY4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvdWZzL3RydW5jYXRlLmMKQEAgLTAsMCArMSw0NzcgQEAKKy8qCisgKiAgbGludXgvZnMvdWZzL3RydW5jYXRlLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgKKyAqIERhbmllbCBQaXJrbCA8ZGFuaWVsLnBpcmtsQGVtYWlsLmN6PgorICogQ2hhcmxlcyBVbml2ZXJzaXR5LCBGYWN1bHR5IG9mIE1hdGhlbWF0aWNzIGFuZCBQaHlzaWNzCisgKgorICogIGZyb20KKyAqCisgKiAgbGludXgvZnMvZXh0Mi90cnVuY2F0ZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1CisgKiBSZW15IENhcmQgKGNhcmRAbWFzaS5pYnAuZnIpCisgKiBMYWJvcmF0b2lyZSBNQVNJIC0gSW5zdGl0dXQgQmxhaXNlIFBhc2NhbAorICogVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICoKKyAqICBmcm9tCisgKgorICogIGxpbnV4L2ZzL21pbml4L3RydW5jYXRlLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICBCaWctZW5kaWFuIHRvIGxpdHRsZS1lbmRpYW4gYnl0ZS1zd2FwcGluZy9iaXRtYXBzIGJ5CisgKiAgICAgICAgRGF2aWQgUy4gTWlsbGVyIChkYXZlbUBjYWlwLnJ1dGdlcnMuZWR1KSwgMTk5NQorICovCisKKy8qCisgKiBSZWFsIHJhbmRvbSBudW1iZXJzIGZvciBzZWN1cmUgcm0gYWRkZWQgOTQvMDIvMTgKKyAqIElkZWEgZnJvbSBQaWVycmUgZGVsIFBlcnVnaWEgPGRlbHBlcnVnQGdsYS5lY29sZWRvYy5pYnAuZnI+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC91ZnNfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKKyNpbmNsdWRlICJzd2FiLmgiCisjaW5jbHVkZSAidXRpbC5oIgorCisjdW5kZWYgVUZTX1RSVU5DQVRFX0RFQlVHCisKKyNpZmRlZiBVRlNfVFJVTkNBVEVfREVCVUcKKyNkZWZpbmUgVUZTRCh4KSBwcmludGsoIiglcywgJWQpLCAlczogIiwgX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pOyBwcmludGsgeDsKKyNlbHNlCisjZGVmaW5lIFVGU0QoeCkKKyNlbmRpZgorIAorLyoKKyAqIFNlY3VyZSBkZWxldGlvbiBjdXJyZW50bHkgZG9lc24ndCB3b3JrLiBJdCBpbnRlcmFjdHMgdmVyeSBiYWRseQorICogd2l0aCBidWZmZXJzIHNoYXJlZCB3aXRoIG1lbW9yeSBtYXBwaW5ncywgYW5kIGZvciB0aGF0IHJlYXNvbgorICogY2FuJ3QgYmUgZG9uZSBpbiB0aGUgdHJ1bmNhdGUoKSByb3V0aW5lcy4gSXQgc2hvdWxkIGluc3RlYWQgYmUKKyAqIGRvbmUgc2VwYXJhdGVseSBpbiAicmVsZWFzZSgpIiBiZWZvcmUgY2FsbGluZyB0aGUgdHJ1bmNhdGUgcm91dGluZXMKKyAqIHRoYXQgd2lsbCByZWxlYXNlIHRoZSBhY3R1YWwgZmlsZSBibG9ja3MuCisgKgorICoJCUxpbnVzCisgKi8KKworI2RlZmluZSBESVJFQ1RfQkxPQ0sgKChpbm9kZS0+aV9zaXplICsgdXNwaS0+c19ic2l6ZSAtIDEpID4+IHVzcGktPnNfYnNoaWZ0KQorI2RlZmluZSBESVJFQ1RfRlJBR01FTlQgKChpbm9kZS0+aV9zaXplICsgdXNwaS0+c19mc2l6ZSAtIDEpID4+IHVzcGktPnNfZnNoaWZ0KQorCisjZGVmaW5lIERBVEFfQlVGRkVSX1VTRUQoYmgpIFwKKwkoYXRvbWljX3JlYWQoJmJoLT5iX2NvdW50KT4xIHx8IGJ1ZmZlcl9sb2NrZWQoYmgpKQorCitzdGF0aWMgaW50IHVmc190cnVuY19kaXJlY3QgKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCXN0cnVjdCB1ZnNfaW5vZGVfaW5mbyAqdWZzaSA9IFVGU19JKGlub2RlKTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKKwlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJX19mczMyICogcDsKKwl1bnNpZ25lZCBmcmFnMSwgZnJhZzIsIGZyYWczLCBmcmFnNCwgYmxvY2sxLCBibG9jazI7CisJdW5zaWduZWQgZnJhZ190b19mcmVlLCBmcmVlX2NvdW50OworCXVuc2lnbmVkIGksIGosIHRtcDsKKwlpbnQgcmV0cnk7CisJCisJVUZTRCgoIkVOVEVSXG4iKSkKKworCXNiID0gaW5vZGUtPmlfc2I7CisJdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKKwkKKwlmcmFnX3RvX2ZyZWUgPSAwOworCWZyZWVfY291bnQgPSAwOworCXJldHJ5ID0gMDsKKwkKKwlmcmFnMSA9IERJUkVDVF9GUkFHTUVOVDsKKwlmcmFnNCA9IG1pbl90KHUzMiwgVUZTX05ESVJfRlJBR01FTlQsIHVmc2ktPmlfbGFzdGZyYWcpOworCWZyYWcyID0gKChmcmFnMSAmIHVzcGktPnNfZnBibWFzaykgPyAoKGZyYWcxIHwgdXNwaS0+c19mcGJtYXNrKSArIDEpIDogZnJhZzEpOworCWZyYWczID0gZnJhZzQgJiB+dXNwaS0+c19mcGJtYXNrOworCWJsb2NrMSA9IGJsb2NrMiA9IDA7CisJaWYgKGZyYWcyID4gZnJhZzMpIHsKKwkJZnJhZzIgPSBmcmFnNDsKKwkJZnJhZzMgPSBmcmFnNCA9IDA7CisJfQorCWVsc2UgaWYgKGZyYWcyIDwgZnJhZzMpIHsKKwkJYmxvY2sxID0gdWZzX2ZyYWdzdG9ibGtzIChmcmFnMik7CisJCWJsb2NrMiA9IHVmc19mcmFnc3RvYmxrcyAoZnJhZzMpOworCX0KKworCVVGU0QoKCJmcmFnMSAldSwgZnJhZzIgJXUsIGJsb2NrMSAldSwgYmxvY2syICV1LCBmcmFnMyAldSwgZnJhZzQgJXVcbiIsIGZyYWcxLCBmcmFnMiwgYmxvY2sxLCBibG9jazIsIGZyYWczLCBmcmFnNCkpCisKKwlpZiAoZnJhZzEgPj0gZnJhZzIpCisJCWdvdG8gbmV4dDE7CQkKKworCS8qCisJICogRnJlZSBmaXJzdCBmcmVlIGZyYWdtZW50cworCSAqLworCXAgPSB1ZnNpLT5pX3UxLmlfZGF0YSArIHVmc19mcmFnc3RvYmxrcyAoZnJhZzEpOworCXRtcCA9IGZzMzJfdG9fY3B1KHNiLCAqcCk7CisJaWYgKCF0bXAgKQorCQl1ZnNfcGFuaWMgKHNiLCAidWZzX3RydW5jX2RpcmVjdCIsICJpbnRlcm5hbCBlcnJvciIpOworCWZyYWcxID0gdWZzX2ZyYWdudW0gKGZyYWcxKTsKKwlmcmFnMiA9IHVmc19mcmFnbnVtIChmcmFnMik7CisJZm9yIChqID0gZnJhZzE7IGogPCBmcmFnMjsgaisrKSB7CisJCWJoID0gc2JfZmluZF9nZXRfYmxvY2sgKHNiLCB0bXAgKyBqKTsKKwkJaWYgKChiaCAmJiBEQVRBX0JVRkZFUl9VU0VEKGJoKSkgfHwgdG1wICE9IGZzMzJfdG9fY3B1KHNiLCAqcCkpIHsKKwkJCXJldHJ5ID0gMTsKKwkJCWJyZWxzZSAoYmgpOworCQkJZ290byBuZXh0MTsKKwkJfQorCQliZm9yZ2V0IChiaCk7CisJfQorCWlub2RlLT5pX2Jsb2NrcyAtPSAoZnJhZzItZnJhZzEpIDw8IHVzcGktPnNfbnNwZnNoaWZ0OworCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworCXVmc19mcmVlX2ZyYWdtZW50cyAoaW5vZGUsIHRtcCArIGZyYWcxLCBmcmFnMiAtIGZyYWcxKTsKKwlmcmFnX3RvX2ZyZWUgPSB0bXAgKyBmcmFnMTsKKworbmV4dDE6CisJLyoKKwkgKiBGcmVlIHdob2xlIGJsb2NrcworCSAqLworCWZvciAoaSA9IGJsb2NrMSA7IGkgPCBibG9jazI7IGkrKykgeworCQlwID0gdWZzaS0+aV91MS5pX2RhdGEgKyBpOworCQl0bXAgPSBmczMyX3RvX2NwdShzYiwgKnApOworCQlpZiAoIXRtcCkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGogPSAwOyBqIDwgdXNwaS0+c19mcGI7IGorKykgeworCQkJYmggPSBzYl9maW5kX2dldF9ibG9jayhzYiwgdG1wICsgaik7CisJCQlpZiAoKGJoICYmIERBVEFfQlVGRkVSX1VTRUQoYmgpKSB8fCB0bXAgIT0gZnMzMl90b19jcHUoc2IsICpwKSkgeworCQkJCXJldHJ5ID0gMTsKKwkJCQlicmVsc2UgKGJoKTsKKwkJCQlnb3RvIG5leHQyOworCQkJfQorCQkJYmZvcmdldCAoYmgpOworCQl9CisJCSpwID0gMDsKKwkJaW5vZGUtPmlfYmxvY2tzIC09IHVzcGktPnNfbnNwYjsKKwkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCWlmIChmcmVlX2NvdW50ID09IDApIHsKKwkJCWZyYWdfdG9fZnJlZSA9IHRtcDsKKwkJCWZyZWVfY291bnQgPSB1c3BpLT5zX2ZwYjsKKwkJfSBlbHNlIGlmIChmcmVlX2NvdW50ID4gMCAmJiBmcmFnX3RvX2ZyZWUgPT0gdG1wIC0gZnJlZV9jb3VudCkKKwkJCWZyZWVfY291bnQgKz0gdXNwaS0+c19mcGI7CisJCWVsc2UgeworCQkJdWZzX2ZyZWVfYmxvY2tzIChpbm9kZSwgZnJhZ190b19mcmVlLCBmcmVlX2NvdW50KTsKKwkJCWZyYWdfdG9fZnJlZSA9IHRtcDsKKwkJCWZyZWVfY291bnQgPSB1c3BpLT5zX2ZwYjsKKwkJfQorbmV4dDI6OworCX0KKwkKKwlpZiAoZnJlZV9jb3VudCA+IDApCisJCXVmc19mcmVlX2Jsb2NrcyAoaW5vZGUsIGZyYWdfdG9fZnJlZSwgZnJlZV9jb3VudCk7CisKKwlpZiAoZnJhZzMgPj0gZnJhZzQpCisJCWdvdG8gbmV4dDM7CisKKwkvKgorCSAqIEZyZWUgbGFzdCBmcmVlIGZyYWdtZW50cworCSAqLworCXAgPSB1ZnNpLT5pX3UxLmlfZGF0YSArIHVmc19mcmFnc3RvYmxrcyAoZnJhZzMpOworCXRtcCA9IGZzMzJfdG9fY3B1KHNiLCAqcCk7CisJaWYgKCF0bXAgKQorCQl1ZnNfcGFuaWMoc2IsICJ1ZnNfdHJ1bmNhdGVfZGlyZWN0IiwgImludGVybmFsIGVycm9yIik7CisJZnJhZzQgPSB1ZnNfZnJhZ251bSAoZnJhZzQpOworCWZvciAoaiA9IDA7IGogPCBmcmFnNDsgaisrKSB7CisJCWJoID0gc2JfZmluZF9nZXRfYmxvY2sgKHNiLCB0bXAgKyBqKTsKKwkJaWYgKChiaCAmJiBEQVRBX0JVRkZFUl9VU0VEKGJoKSkgfHwgdG1wICE9IGZzMzJfdG9fY3B1KHNiLCAqcCkpIHsKKwkJCXJldHJ5ID0gMTsKKwkJCWJyZWxzZSAoYmgpOworCQkJZ290byBuZXh0MTsKKwkJfQorCQliZm9yZ2V0IChiaCk7CisJfQorCSpwID0gMDsKKwlpbm9kZS0+aV9ibG9ja3MgLT0gZnJhZzQgPDwgdXNwaS0+c19uc3Bmc2hpZnQ7CisJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJdWZzX2ZyZWVfZnJhZ21lbnRzIChpbm9kZSwgdG1wLCBmcmFnNCk7CisgbmV4dDM6CisKKwlVRlNEKCgiRVhJVFxuIikpCisJcmV0dXJuIHJldHJ5OworfQorCisKK3N0YXRpYyBpbnQgdWZzX3RydW5jX2luZGlyZWN0IChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgdW5zaWduZWQgb2Zmc2V0LCBfX2ZzMzIgKnApCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpOworCXN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiBpbmRfdWJoOworCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOworCV9fZnMzMiAqIGluZDsKKwl1bnNpZ25lZCBpbmRpcmVjdF9ibG9jaywgaSwgaiwgdG1wOworCXVuc2lnbmVkIGZyYWdfdG9fZnJlZSwgZnJlZV9jb3VudDsKKwlpbnQgcmV0cnk7CisKKwlVRlNEKCgiRU5URVJcbiIpKQorCQkKKwlzYiA9IGlub2RlLT5pX3NiOworCXVzcGkgPSBVRlNfU0Ioc2IpLT5zX3VzcGk7CisKKwlmcmFnX3RvX2ZyZWUgPSAwOworCWZyZWVfY291bnQgPSAwOworCXJldHJ5ID0gMDsKKwkKKwl0bXAgPSBmczMyX3RvX2NwdShzYiwgKnApOworCWlmICghdG1wKQorCQlyZXR1cm4gMDsKKwlpbmRfdWJoID0gdWJoX2JyZWFkKHNiLCB0bXAsIHVzcGktPnNfYnNpemUpOworCWlmICh0bXAgIT0gZnMzMl90b19jcHUoc2IsICpwKSkgeworCQl1YmhfYnJlbHNlIChpbmRfdWJoKTsKKwkJcmV0dXJuIDE7CisJfQorCWlmICghaW5kX3ViaCkgeworCQkqcCA9IDA7CisJCXJldHVybiAwOworCX0KKworCWluZGlyZWN0X2Jsb2NrID0gKERJUkVDVF9CTE9DSyA+IG9mZnNldCkgPyAoRElSRUNUX0JMT0NLIC0gb2Zmc2V0KSA6IDA7CisJZm9yIChpID0gaW5kaXJlY3RfYmxvY2s7IGkgPCB1c3BpLT5zX2FwYjsgaSsrKSB7CisJCWluZCA9IHViaF9nZXRfYWRkcjMyIChpbmRfdWJoLCBpKTsKKwkJdG1wID0gZnMzMl90b19jcHUoc2IsICppbmQpOworCQlpZiAoIXRtcCkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGogPSAwOyBqIDwgdXNwaS0+c19mcGI7IGorKykgeworCQkJYmggPSBzYl9maW5kX2dldF9ibG9jayhzYiwgdG1wICsgaik7CisJCQlpZiAoKGJoICYmIERBVEFfQlVGRkVSX1VTRUQoYmgpKSB8fCB0bXAgIT0gZnMzMl90b19jcHUoc2IsICppbmQpKSB7CisJCQkJcmV0cnkgPSAxOworCQkJCWJyZWxzZSAoYmgpOworCQkJCWdvdG8gbmV4dDsKKwkJCX0KKwkJCWJmb3JnZXQgKGJoKTsKKwkJfQkKKwkJKmluZCA9IDA7CisJCXViaF9tYXJrX2J1ZmZlcl9kaXJ0eShpbmRfdWJoKTsKKwkJaWYgKGZyZWVfY291bnQgPT0gMCkgeworCQkJZnJhZ190b19mcmVlID0gdG1wOworCQkJZnJlZV9jb3VudCA9IHVzcGktPnNfZnBiOworCQl9IGVsc2UgaWYgKGZyZWVfY291bnQgPiAwICYmIGZyYWdfdG9fZnJlZSA9PSB0bXAgLSBmcmVlX2NvdW50KQorCQkJZnJlZV9jb3VudCArPSB1c3BpLT5zX2ZwYjsKKwkJZWxzZSB7CisJCQl1ZnNfZnJlZV9ibG9ja3MgKGlub2RlLCBmcmFnX3RvX2ZyZWUsIGZyZWVfY291bnQpOworCQkJZnJhZ190b19mcmVlID0gdG1wOworCQkJZnJlZV9jb3VudCA9IHVzcGktPnNfZnBiOworCQl9CisJCWlub2RlLT5pX2Jsb2NrcyAtPSB1c3BpLT5zX25zcGI7CisJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOworbmV4dDo7CisJfQorCisJaWYgKGZyZWVfY291bnQgPiAwKSB7CisJCXVmc19mcmVlX2Jsb2NrcyAoaW5vZGUsIGZyYWdfdG9fZnJlZSwgZnJlZV9jb3VudCk7CisJfQorCWZvciAoaSA9IDA7IGkgPCB1c3BpLT5zX2FwYjsgaSsrKQorCQlpZiAoKnViaF9nZXRfYWRkcjMyKGluZF91YmgsaSkpCisJCQlicmVhazsKKwlpZiAoaSA+PSB1c3BpLT5zX2FwYikgeworCQlpZiAodWJoX21heF9iY291bnQoaW5kX3ViaCkgIT0gMSkgeworCQkJcmV0cnkgPSAxOworCQl9CisJCWVsc2UgeworCQkJdG1wID0gZnMzMl90b19jcHUoc2IsICpwKTsKKwkJCSpwID0gMDsKKwkJCWlub2RlLT5pX2Jsb2NrcyAtPSB1c3BpLT5zX25zcGI7CisJCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJCXVmc19mcmVlX2Jsb2NrcyAoaW5vZGUsIHRtcCwgdXNwaS0+c19mcGIpOworCQkJdWJoX2Jmb3JnZXQoaW5kX3ViaCk7CisJCQlpbmRfdWJoID0gTlVMTDsKKwkJfQorCX0KKwlpZiAoSVNfU1lOQyhpbm9kZSkgJiYgaW5kX3ViaCAmJiB1YmhfYnVmZmVyX2RpcnR5KGluZF91YmgpKSB7CisJCXViaF93YWl0X29uX2J1ZmZlciAoaW5kX3ViaCk7CisJCXViaF9sbF9yd19ibG9jayAoV1JJVEUsIDEsICZpbmRfdWJoKTsKKwkJdWJoX3dhaXRfb25fYnVmZmVyIChpbmRfdWJoKTsKKwl9CisJdWJoX2JyZWxzZSAoaW5kX3ViaCk7CisJCisJVUZTRCgoIkVYSVRcbiIpKQorCQorCXJldHVybiByZXRyeTsKK30KKworc3RhdGljIGludCB1ZnNfdHJ1bmNfZGluZGlyZWN0IChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBvZmZzZXQsIF9fZnMzMiAqcCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKKwlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGk7CisJc3RydWN0IHVmc19idWZmZXJfaGVhZCAqIGRpbmRfYmg7CisJdW5zaWduZWQgaSwgdG1wLCBkaW5kaXJlY3RfYmxvY2s7CisJX19mczMyICogZGluZDsKKwlpbnQgcmV0cnkgPSAwOworCQorCVVGU0QoKCJFTlRFUlxuIikpCisJCisJc2IgPSBpbm9kZS0+aV9zYjsKKwl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOworCisJZGluZGlyZWN0X2Jsb2NrID0gKERJUkVDVF9CTE9DSyA+IG9mZnNldCkgCisJCT8gKChESVJFQ1RfQkxPQ0sgLSBvZmZzZXQpID4+IHVzcGktPnNfYXBic2hpZnQpIDogMDsKKwlyZXRyeSA9IDA7CisJCisJdG1wID0gZnMzMl90b19jcHUoc2IsICpwKTsKKwlpZiAoIXRtcCkKKwkJcmV0dXJuIDA7CisJZGluZF9iaCA9IHViaF9icmVhZChzYiwgdG1wLCB1c3BpLT5zX2JzaXplKTsKKwlpZiAodG1wICE9IGZzMzJfdG9fY3B1KHNiLCAqcCkpIHsKKwkJdWJoX2JyZWxzZSAoZGluZF9iaCk7CisJCXJldHVybiAxOworCX0KKwlpZiAoIWRpbmRfYmgpIHsKKwkJKnAgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwlmb3IgKGkgPSBkaW5kaXJlY3RfYmxvY2sgOyBpIDwgdXNwaS0+c19hcGIgOyBpKyspIHsKKwkJZGluZCA9IHViaF9nZXRfYWRkcjMyIChkaW5kX2JoLCBpKTsKKwkJdG1wID0gZnMzMl90b19jcHUoc2IsICpkaW5kKTsKKwkJaWYgKCF0bXApCisJCQljb250aW51ZTsKKwkJcmV0cnkgfD0gdWZzX3RydW5jX2luZGlyZWN0IChpbm9kZSwgb2Zmc2V0ICsgKGkgPDwgdXNwaS0+c19hcGJzaGlmdCksIGRpbmQpOworCQl1YmhfbWFya19idWZmZXJfZGlydHkoZGluZF9iaCk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHVzcGktPnNfYXBiOyBpKyspCisJCWlmICgqdWJoX2dldF9hZGRyMzIgKGRpbmRfYmgsIGkpKQorCQkJYnJlYWs7CisJaWYgKGkgPj0gdXNwaS0+c19hcGIpIHsKKwkJaWYgKHViaF9tYXhfYmNvdW50KGRpbmRfYmgpICE9IDEpCisJCQlyZXRyeSA9IDE7CisJCWVsc2UgeworCQkJdG1wID0gZnMzMl90b19jcHUoc2IsICpwKTsKKwkJCSpwID0gMDsKKwkJCWlub2RlLT5pX2Jsb2NrcyAtPSB1c3BpLT5zX25zcGI7CisJCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJCXVmc19mcmVlX2Jsb2NrcyAoaW5vZGUsIHRtcCwgdXNwaS0+c19mcGIpOworCQkJdWJoX2Jmb3JnZXQoZGluZF9iaCk7CisJCQlkaW5kX2JoID0gTlVMTDsKKwkJfQorCX0KKwlpZiAoSVNfU1lOQyhpbm9kZSkgJiYgZGluZF9iaCAmJiB1YmhfYnVmZmVyX2RpcnR5KGRpbmRfYmgpKSB7CisJCXViaF93YWl0X29uX2J1ZmZlciAoZGluZF9iaCk7CisJCXViaF9sbF9yd19ibG9jayAoV1JJVEUsIDEsICZkaW5kX2JoKTsKKwkJdWJoX3dhaXRfb25fYnVmZmVyIChkaW5kX2JoKTsKKwl9CisJdWJoX2JyZWxzZSAoZGluZF9iaCk7CisJCisJVUZTRCgoIkVYSVRcbiIpKQorCQorCXJldHVybiByZXRyeTsKK30KKworc3RhdGljIGludCB1ZnNfdHJ1bmNfdGluZGlyZWN0IChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSkKK3sKKwlzdHJ1Y3QgdWZzX2lub2RlX2luZm8gKnVmc2kgPSBVRlNfSShpbm9kZSk7CisJc3RydWN0IHN1cGVyX2Jsb2NrICogc2I7CisJc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpOworCXN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiB0aW5kX2JoOworCXVuc2lnbmVkIHRpbmRpcmVjdF9ibG9jaywgdG1wLCBpOworCV9fZnMzMiAqIHRpbmQsICogcDsKKwlpbnQgcmV0cnk7CisJCisJVUZTRCgoIkVOVEVSXG4iKSkKKworCXNiID0gaW5vZGUtPmlfc2I7CisJdXNwaSA9IFVGU19TQihzYiktPnNfdXNwaTsKKwlyZXRyeSA9IDA7CisJCisJdGluZGlyZWN0X2Jsb2NrID0gKERJUkVDVF9CTE9DSyA+IChVRlNfTkRBRERSICsgdXNwaS0+c19hcGIgKyB1c3BpLT5zXzJhcGIpKQorCQk/ICgoRElSRUNUX0JMT0NLIC0gVUZTX05EQUREUiAtIHVzcGktPnNfYXBiIC0gdXNwaS0+c18yYXBiKSA+PiB1c3BpLT5zXzJhcGJzaGlmdCkgOiAwOworCXAgPSB1ZnNpLT5pX3UxLmlfZGF0YSArIFVGU19USU5EX0JMT0NLOworCWlmICghKHRtcCA9IGZzMzJfdG9fY3B1KHNiLCAqcCkpKQorCQlyZXR1cm4gMDsKKwl0aW5kX2JoID0gdWJoX2JyZWFkIChzYiwgdG1wLCB1c3BpLT5zX2JzaXplKTsKKwlpZiAodG1wICE9IGZzMzJfdG9fY3B1KHNiLCAqcCkpIHsKKwkJdWJoX2JyZWxzZSAodGluZF9iaCk7CisJCXJldHVybiAxOworCX0KKwlpZiAoIXRpbmRfYmgpIHsKKwkJKnAgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwlmb3IgKGkgPSB0aW5kaXJlY3RfYmxvY2sgOyBpIDwgdXNwaS0+c19hcGIgOyBpKyspIHsKKwkJdGluZCA9IHViaF9nZXRfYWRkcjMyICh0aW5kX2JoLCBpKTsKKwkJcmV0cnkgfD0gdWZzX3RydW5jX2RpbmRpcmVjdChpbm9kZSwgVUZTX05EQUREUiArIAorCQkJdXNwaS0+c19hcGIgKyAoKGkgKyAxKSA8PCB1c3BpLT5zXzJhcGJzaGlmdCksIHRpbmQpOworCQl1YmhfbWFya19idWZmZXJfZGlydHkodGluZF9iaCk7CisJfQorCWZvciAoaSA9IDA7IGkgPCB1c3BpLT5zX2FwYjsgaSsrKQorCQlpZiAoKnViaF9nZXRfYWRkcjMyICh0aW5kX2JoLCBpKSkKKwkJCWJyZWFrOworCWlmIChpID49IHVzcGktPnNfYXBiKSB7CisJCWlmICh1YmhfbWF4X2Jjb3VudCh0aW5kX2JoKSAhPSAxKQorCQkJcmV0cnkgPSAxOworCQllbHNlIHsKKwkJCXRtcCA9IGZzMzJfdG9fY3B1KHNiLCAqcCk7CisJCQkqcCA9IDA7CisJCQlpbm9kZS0+aV9ibG9ja3MgLT0gdXNwaS0+c19uc3BiOworCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCQl1ZnNfZnJlZV9ibG9ja3MgKGlub2RlLCB0bXAsIHVzcGktPnNfZnBiKTsKKwkJCXViaF9iZm9yZ2V0KHRpbmRfYmgpOworCQkJdGluZF9iaCA9IE5VTEw7CisJCX0KKwl9CisJaWYgKElTX1NZTkMoaW5vZGUpICYmIHRpbmRfYmggJiYgdWJoX2J1ZmZlcl9kaXJ0eSh0aW5kX2JoKSkgeworCQl1Ymhfd2FpdF9vbl9idWZmZXIgKHRpbmRfYmgpOworCQl1YmhfbGxfcndfYmxvY2sgKFdSSVRFLCAxLCAmdGluZF9iaCk7CisJCXViaF93YWl0X29uX2J1ZmZlciAodGluZF9iaCk7CisJfQorCXViaF9icmVsc2UgKHRpbmRfYmgpOworCQorCVVGU0QoKCJFWElUXG4iKSkKKwlyZXR1cm4gcmV0cnk7Cit9CisJCQordm9pZCB1ZnNfdHJ1bmNhdGUgKHN0cnVjdCBpbm9kZSAqIGlub2RlKQoreworCXN0cnVjdCB1ZnNfaW5vZGVfaW5mbyAqdWZzaSA9IFVGU19JKGlub2RlKTsKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiBzYjsKKwlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICogYmg7CisJdW5zaWduZWQgb2Zmc2V0OworCWludCBlcnIsIHJldHJ5OworCQorCVVGU0QoKCJFTlRFUlxuIikpCisJc2IgPSBpbm9kZS0+aV9zYjsKKwl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOworCisJaWYgKCEoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSB8fCBTX0lTRElSKGlub2RlLT5pX21vZGUpIHx8IFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpKQorCQlyZXR1cm47CisJaWYgKElTX0FQUEVORChpbm9kZSkgfHwgSVNfSU1NVVRBQkxFKGlub2RlKSkKKwkJcmV0dXJuOworCWxvY2tfa2VybmVsKCk7CisJd2hpbGUgKDEpIHsKKwkJcmV0cnkgPSB1ZnNfdHJ1bmNfZGlyZWN0KGlub2RlKTsKKwkJcmV0cnkgfD0gdWZzX3RydW5jX2luZGlyZWN0IChpbm9kZSwgVUZTX0lORF9CTE9DSywKKwkJCShfX2ZzMzIgKikgJnVmc2ktPmlfdTEuaV9kYXRhW1VGU19JTkRfQkxPQ0tdKTsKKwkJcmV0cnkgfD0gdWZzX3RydW5jX2RpbmRpcmVjdCAoaW5vZGUsIFVGU19JTkRfQkxPQ0sgKyB1c3BpLT5zX2FwYiwKKwkJCShfX2ZzMzIgKikgJnVmc2ktPmlfdTEuaV9kYXRhW1VGU19ESU5EX0JMT0NLXSk7CisJCXJldHJ5IHw9IHVmc190cnVuY190aW5kaXJlY3QgKGlub2RlKTsKKwkJaWYgKCFyZXRyeSkKKwkJCWJyZWFrOworCQlpZiAoSVNfU1lOQyhpbm9kZSkgJiYgKGlub2RlLT5pX3N0YXRlICYgSV9ESVJUWSkpCisJCQl1ZnNfc3luY19pbm9kZSAoaW5vZGUpOworCQlibGtfcnVuX2FkZHJlc3Nfc3BhY2UoaW5vZGUtPmlfbWFwcGluZyk7CisJCXlpZWxkKCk7CisJfQorCW9mZnNldCA9IGlub2RlLT5pX3NpemUgJiB1c3BpLT5zX2ZzaGlmdDsKKwlpZiAob2Zmc2V0KSB7CisJCWJoID0gdWZzX2JyZWFkIChpbm9kZSwgaW5vZGUtPmlfc2l6ZSA+PiB1c3BpLT5zX2ZzaGlmdCwgMCwgJmVycik7CisJCWlmIChiaCkgeworCQkJbWVtc2V0IChiaC0+Yl9kYXRhICsgb2Zmc2V0LCAwLCB1c3BpLT5zX2ZzaXplIC0gb2Zmc2V0KTsKKwkJCW1hcmtfYnVmZmVyX2RpcnR5IChiaCk7CisJCQlicmVsc2UgKGJoKTsKKwkJfQorCX0KKwlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwl1ZnNpLT5pX2xhc3RmcmFnID0gRElSRUNUX0ZSQUdNRU5UOworCXVubG9ja19rZXJuZWwoKTsKKwltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwlVRlNEKCgiRVhJVFxuIikpCit9CmRpZmYgLS1naXQgYS9mcy91ZnMvdXRpbC5jIGIvZnMvdWZzL3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWFjYzhmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvdWZzL3V0aWwuYwpAQCAtMCwwICsxLDI1NyBAQAorLyoKKyAqICBsaW51eC9mcy91ZnMvdXRpbC5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4CisgKiBEYW5pZWwgUGlya2wgPGRhbmllbC5waXJrbEBlbWFpbC5jej4KKyAqIENoYXJsZXMgVW5pdmVyc2l0eSwgRmFjdWx0eSBvZiBNYXRoZW1hdGljcyBhbmQgUGh5c2ljcworICovCisgCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3Vmc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisKKyNpbmNsdWRlICJzd2FiLmgiCisjaW5jbHVkZSAidXRpbC5oIgorCisjdW5kZWYgVUZTX1VUSUxTX0RFQlVHCisKKyNpZmRlZiBVRlNfVVRJTFNfREVCVUcKKyNkZWZpbmUgVUZTRCh4KSBwcmludGsoIiglcywgJWQpLCAlczogIiwgX19GSUxFX18sIF9fTElORV9fLCBfX0ZVTkNUSU9OX18pOyBwcmludGsgeDsKKyNlbHNlCisjZGVmaW5lIFVGU0QoeCkKKyNlbmRpZgorCisKK3N0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiBfdWJoX2JyZWFkXyAoc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpLAorCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHU2NCBmcmFnbWVudCwgdTY0IHNpemUpCit7CisJc3RydWN0IHVmc19idWZmZXJfaGVhZCAqIHViaDsKKwl1bnNpZ25lZCBpLCBqIDsKKwl1NjQgIGNvdW50ID0gMDsKKwlpZiAoc2l6ZSAmIH51c3BpLT5zX2ZtYXNrKQorCQlyZXR1cm4gTlVMTDsKKwljb3VudCA9IHNpemUgPj4gdXNwaS0+c19mc2hpZnQ7CisJaWYgKGNvdW50ID4gVUZTX01BWEZSQUcpCisJCXJldHVybiBOVUxMOworCXViaCA9IChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICopCisJCWttYWxsb2MgKHNpemVvZiAoc3RydWN0IHVmc19idWZmZXJfaGVhZCksIEdGUF9LRVJORUwpOworCWlmICghdWJoKQorCQlyZXR1cm4gTlVMTDsKKwl1YmgtPmZyYWdtZW50ID0gZnJhZ21lbnQ7CisJdWJoLT5jb3VudCA9IGNvdW50OworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQlpZiAoISh1YmgtPmJoW2ldID0gc2JfYnJlYWQoc2IsIGZyYWdtZW50ICsgaSkpKQorCQkJZ290byBmYWlsZWQ7CisJZm9yICg7IGkgPCBVRlNfTUFYRlJBRzsgaSsrKQorCQl1YmgtPmJoW2ldID0gTlVMTDsKKwlyZXR1cm4gdWJoOworZmFpbGVkOgorCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCisJCWJyZWxzZSAodWJoLT5iaFtqXSk7CisJa2ZyZWUodWJoKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IHVmc19idWZmZXJfaGVhZCAqIHViaF9icmVhZF91c3BpIChzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGksCisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdTY0IGZyYWdtZW50LCB1NjQgc2l6ZSkKK3sKKwl1bnNpZ25lZCBpLCBqOworCXU2NCBjb3VudCA9IDA7CisJaWYgKHNpemUgJiB+dXNwaS0+c19mbWFzaykKKwkJcmV0dXJuIE5VTEw7CisJY291bnQgPSBzaXplID4+IHVzcGktPnNfZnNoaWZ0OworCWlmIChjb3VudCA8PSAwIHx8IGNvdW50ID4gVUZTX01BWEZSQUcpCisJCXJldHVybiBOVUxMOworCVVTUElfVUJILT5mcmFnbWVudCA9IGZyYWdtZW50OworCVVTUElfVUJILT5jb3VudCA9IGNvdW50OworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQlpZiAoIShVU1BJX1VCSC0+YmhbaV0gPSBzYl9icmVhZChzYiwgZnJhZ21lbnQgKyBpKSkpCisJCQlnb3RvIGZhaWxlZDsKKwlmb3IgKDsgaSA8IFVGU19NQVhGUkFHOyBpKyspCisJCVVTUElfVUJILT5iaFtpXSA9IE5VTEw7CisJcmV0dXJuIFVTUElfVUJIOworZmFpbGVkOgorCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCisJCWJyZWxzZSAoVVNQSV9VQkgtPmJoW2pdKTsKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCB1YmhfYnJlbHNlIChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICogdWJoKQoreworCXVuc2lnbmVkIGk7CisJaWYgKCF1YmgpCisJCXJldHVybjsKKwlmb3IgKGkgPSAwOyBpIDwgdWJoLT5jb3VudDsgaSsrKQorCQlicmVsc2UgKHViaC0+YmhbaV0pOworCWtmcmVlICh1YmgpOworfQorCit2b2lkIHViaF9icmVsc2VfdXNwaSAoc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpKQoreworCXVuc2lnbmVkIGk7CisJaWYgKCFVU1BJX1VCSCkKKwkJcmV0dXJuOworCWZvciAoIGkgPSAwOyBpIDwgVVNQSV9VQkgtPmNvdW50OyBpKysgKSB7CisJCWJyZWxzZSAoVVNQSV9VQkgtPmJoW2ldKTsKKwkJVVNQSV9VQkgtPmJoW2ldID0gTlVMTDsKKwl9Cit9CisKK3ZvaWQgdWJoX21hcmtfYnVmZmVyX2RpcnR5IChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICogdWJoKQoreworCXVuc2lnbmVkIGk7CisJaWYgKCF1YmgpCisJCXJldHVybjsKKwlmb3IgKCBpID0gMDsgaSA8IHViaC0+Y291bnQ7IGkrKyApCisJCW1hcmtfYnVmZmVyX2RpcnR5ICh1YmgtPmJoW2ldKTsKK30KKwordm9pZCB1YmhfbWFya19idWZmZXJfdXB0b2RhdGUgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiB1YmgsIGludCBmbGFnKQoreworCXVuc2lnbmVkIGk7CisJaWYgKCF1YmgpCisJCXJldHVybjsKKwlpZiAoZmxhZykgeworCQlmb3IgKCBpID0gMDsgaSA8IHViaC0+Y291bnQ7IGkrKyApCisJCQlzZXRfYnVmZmVyX3VwdG9kYXRlICh1YmgtPmJoW2ldKTsKKwl9IGVsc2UgeworCQlmb3IgKCBpID0gMDsgaSA8IHViaC0+Y291bnQ7IGkrKyApCisJCQljbGVhcl9idWZmZXJfdXB0b2RhdGUgKHViaC0+YmhbaV0pOworCX0KK30KKwordm9pZCB1YmhfbGxfcndfYmxvY2sgKGludCBydywgdW5zaWduZWQgbnIsIHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiB1YmhbXSkKK3sKKwl1bnNpZ25lZCBpOworCWlmICghdWJoKQorCQlyZXR1cm47CisJZm9yICggaSA9IDA7IGkgPCBucjsgaSsrICkKKwkJbGxfcndfYmxvY2sgKHJ3LCB1YmhbaV0tPmNvdW50LCB1YmhbaV0tPmJoKTsKK30KKwordm9pZCB1Ymhfd2FpdF9vbl9idWZmZXIgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiB1YmgpCit7CisJdW5zaWduZWQgaTsKKwlpZiAoIXViaCkKKwkJcmV0dXJuOworCWZvciAoIGkgPSAwOyBpIDwgdWJoLT5jb3VudDsgaSsrICkKKwkJd2FpdF9vbl9idWZmZXIgKHViaC0+YmhbaV0pOworfQorCit1bnNpZ25lZCB1YmhfbWF4X2Jjb3VudCAoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqIHViaCkKK3sKKwl1bnNpZ25lZCBpOworCXVuc2lnbmVkIG1heCA9IDA7CisJaWYgKCF1YmgpCisJCXJldHVybiAwOworCWZvciAoIGkgPSAwOyBpIDwgdWJoLT5jb3VudDsgaSsrICkgCisJCWlmICggYXRvbWljX3JlYWQoJnViaC0+YmhbaV0tPmJfY291bnQpID4gbWF4ICkKKwkJCW1heCA9IGF0b21pY19yZWFkKCZ1YmgtPmJoW2ldLT5iX2NvdW50KTsKKwlyZXR1cm4gbWF4OworfQorCit2b2lkIHViaF9iZm9yZ2V0IChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICogdWJoKQoreworCXVuc2lnbmVkIGk7CisJaWYgKCF1YmgpIAorCQlyZXR1cm47CisJZm9yICggaSA9IDA7IGkgPCB1YmgtPmNvdW50OyBpKysgKSBpZiAoIHViaC0+YmhbaV0gKSAKKwkJYmZvcmdldCAodWJoLT5iaFtpXSk7Cit9CisgCitpbnQgdWJoX2J1ZmZlcl9kaXJ0eSAoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqIHViaCkKK3sKKwl1bnNpZ25lZCBpOworCXVuc2lnbmVkIHJlc3VsdCA9IDA7CisJaWYgKCF1YmgpCisJCXJldHVybiAwOworCWZvciAoIGkgPSAwOyBpIDwgdWJoLT5jb3VudDsgaSsrICkKKwkJcmVzdWx0IHw9IGJ1ZmZlcl9kaXJ0eSh1YmgtPmJoW2ldKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCit2b2lkIF91YmhfdWJoY3B5bWVtXyhzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGksIAorCXVuc2lnbmVkIGNoYXIgKiBtZW0sIHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiB1YmgsIHVuc2lnbmVkIHNpemUpCit7CisJdW5zaWduZWQgbGVuLCBiaG5vOworCWlmIChzaXplID4gKHViaC0+Y291bnQgPDwgdXNwaS0+c19mc2hpZnQpKQorCQlzaXplID0gdWJoLT5jb3VudCA8PCB1c3BpLT5zX2ZzaGlmdDsKKwliaG5vID0gMDsKKwl3aGlsZSAoc2l6ZSkgeworCQlsZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHNpemUsIHVzcGktPnNfZnNpemUpOworCQltZW1jcHkgKG1lbSwgdWJoLT5iaFtiaG5vXS0+Yl9kYXRhLCBsZW4pOworCQltZW0gKz0gdXNwaS0+c19mc2l6ZTsKKwkJc2l6ZSAtPSBsZW47CisJCWJobm8rKzsKKwl9Cit9CisKK3ZvaWQgX3ViaF9tZW1jcHl1YmhfKHN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICogdXNwaSwgCisJc3RydWN0IHVmc19idWZmZXJfaGVhZCAqIHViaCwgdW5zaWduZWQgY2hhciAqIG1lbSwgdW5zaWduZWQgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsZW4sIGJobm87CisJaWYgKHNpemUgPiAodWJoLT5jb3VudCA8PCB1c3BpLT5zX2ZzaGlmdCkpCisJCXNpemUgPSB1YmgtPmNvdW50IDw8IHVzcGktPnNfZnNoaWZ0OworCWJobm8gPSAwOworCXdoaWxlIChzaXplKSB7CisJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgc2l6ZSwgdXNwaS0+c19mc2l6ZSk7CisJCW1lbWNweSAodWJoLT5iaFtiaG5vXS0+Yl9kYXRhLCBtZW0sIGxlbik7CisJCW1lbSArPSB1c3BpLT5zX2ZzaXplOworCQlzaXplIC09IGxlbjsKKwkJYmhubysrOworCX0KK30KKworZGV2X3QKK3Vmc19nZXRfaW5vZGVfZGV2KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCB1ZnNfaW5vZGVfaW5mbyAqdWZzaSkKK3sKKwlfX2ZzMzIgZnMzMjsKKwlkZXZfdCBkZXY7CisKKwlpZiAoKFVGU19TQihzYiktPnNfZmxhZ3MgJiBVRlNfU1RfTUFTSykgPT0gVUZTX1NUX1NVTng4NikKKwkJZnMzMiA9IHVmc2ktPmlfdTEuaV9kYXRhWzFdOworCWVsc2UKKwkJZnMzMiA9IHVmc2ktPmlfdTEuaV9kYXRhWzBdOworCWZzMzIgPSBmczMyX3RvX2NwdShzYiwgZnMzMik7CisJc3dpdGNoIChVRlNfU0Ioc2IpLT5zX2ZsYWdzICYgVUZTX1NUX01BU0spIHsKKwljYXNlIFVGU19TVF9TVU54ODY6CisJY2FzZSBVRlNfU1RfU1VOOgorCQlpZiAoKGZzMzIgJiAweGZmZmYwMDAwKSA9PSAwIHx8CisJCSAgICAoZnMzMiAmIDB4ZmZmZjAwMDApID09IDB4ZmZmZjAwMDApCisJCQlkZXYgPSBvbGRfZGVjb2RlX2RldihmczMyICYgMHg3ZmZmKTsKKwkJZWxzZQorCQkJZGV2ID0gTUtERVYoc3lzdl9tYWpvcihmczMyKSwgc3lzdl9taW5vcihmczMyKSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2ID0gb2xkX2RlY29kZV9kZXYoZnMzMik7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gZGV2OworfQorCit2b2lkCit1ZnNfc2V0X2lub2RlX2RldihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgdWZzX2lub2RlX2luZm8gKnVmc2ksIGRldl90IGRldikKK3sKKwlfX2ZzMzIgZnMzMjsKKworCXN3aXRjaCAoVUZTX1NCKHNiKS0+c19mbGFncyAmIFVGU19TVF9NQVNLKSB7CisJY2FzZSBVRlNfU1RfU1VOeDg2OgorCWNhc2UgVUZTX1NUX1NVTjoKKwkJZnMzMiA9IHN5c3ZfZW5jb2RlX2RldihkZXYpOworCQlpZiAoKGZzMzIgJiAweGZmZmY4MDAwKSA9PSAwKSB7CisJCQlmczMyID0gb2xkX2VuY29kZV9kZXYoZGV2KTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWZzMzIgPSBvbGRfZW5jb2RlX2RldihkZXYpOworCQlicmVhazsKKwl9CisJZnMzMiA9IGNwdV90b19mczMyKHNiLCBmczMyKTsKKwlpZiAoKFVGU19TQihzYiktPnNfZmxhZ3MgJiBVRlNfU1RfTUFTSykgPT0gVUZTX1NUX1NVTng4NikKKwkJdWZzaS0+aV91MS5pX2RhdGFbMV0gPSBmczMyOworCWVsc2UKKwkJdWZzaS0+aV91MS5pX2RhdGFbMF0gPSBmczMyOworfQpkaWZmIC0tZ2l0IGEvZnMvdWZzL3V0aWwuaCBiL2ZzL3Vmcy91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI2NDAwNwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3Vmcy91dGlsLmgKQEAgLTAsMCArMSw1MjYgQEAKKy8qCisgKiAgbGludXgvZnMvdWZzL3V0aWwuaAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OCAKKyAqIERhbmllbCBQaXJrbCA8ZGFuaWVsLnBpcmtsQGVtYWlsLmN6PgorICogQ2hhcmxlcyBVbml2ZXJzaXR5LCBGYWN1bHR5IG9mIE1hdGhlbWF0aWNzIGFuZCBQaHlzaWNzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlICJzd2FiLmgiCisKKworLyoKKyAqIHNvbWUgdXNlZnVsIG1hY3JvcworICovCisjZGVmaW5lIGluX3JhbmdlKGIsZmlyc3QsbGVuKQkoKGIpPj0oZmlyc3QpJiYoYik8KGZpcnN0KSsobGVuKSkKKworLyoKKyAqIG1hY3JvcyB1c2VkIGZvciByZXR5cGluZworICovCisjZGVmaW5lIFVDUElfVUJIICgoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqKXVjcGkpCisjZGVmaW5lIFVTUElfVUJIICgoc3RydWN0IHVmc19idWZmZXJfaGVhZCAqKXVzcGkpCisKKworCisvKgorICogbWFjcm9zIHVzZWQgZm9yIGFjY2Vzc2luZyBzdHJ1Y3R1cmVzCisgKi8KK3N0YXRpYyBpbmxpbmUgczMyCit1ZnNfZ2V0X2ZzX3N0YXRlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfZmlyc3QgKnVzYjEsCisJCSBzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX3RoaXJkICp1c2IzKQoreworCXN3aXRjaCAoVUZTX1NCKHNiKS0+c19mbGFncyAmIFVGU19TVF9NQVNLKSB7CisJY2FzZSBVRlNfU1RfU1VOOgorCQlyZXR1cm4gZnMzMl90b19jcHUoc2IsIHVzYjMtPmZzX3UyLmZzX3N1bi5mc19zdGF0ZSk7CisJY2FzZSBVRlNfU1RfU1VOeDg2OgorCQlyZXR1cm4gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX3UxLmZzX3N1bng4Ni5mc19zdGF0ZSk7CisJY2FzZSBVRlNfU1RfNDRCU0Q6CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZzMzJfdG9fY3B1KHNiLCB1c2IzLT5mc191Mi5mc180NC5mc19zdGF0ZSk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3Vmc19zZXRfZnNfc3RhdGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IHVmc19zdXBlcl9ibG9ja19maXJzdCAqdXNiMSwKKwkJIHN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfdGhpcmQgKnVzYjMsIHMzMiB2YWx1ZSkKK3sKKwlzd2l0Y2ggKFVGU19TQihzYiktPnNfZmxhZ3MgJiBVRlNfU1RfTUFTSykgeworCWNhc2UgVUZTX1NUX1NVTjoKKwkJdXNiMy0+ZnNfdTIuZnNfc3VuLmZzX3N0YXRlID0gY3B1X3RvX2ZzMzIoc2IsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBVRlNfU1RfU1VOeDg2OgorCQl1c2IxLT5mc191MS5mc19zdW54ODYuZnNfc3RhdGUgPSBjcHVfdG9fZnMzMihzYiwgdmFsdWUpOworCQlicmVhazsKKwljYXNlIFVGU19TVF80NEJTRDoKKwkJdXNiMy0+ZnNfdTIuZnNfNDQuZnNfc3RhdGUgPSBjcHVfdG9fZnMzMihzYiwgdmFsdWUpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyCit1ZnNfZ2V0X2ZzX25wc2VjdChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX2ZpcnN0ICp1c2IxLAorCQkgIHN0cnVjdCB1ZnNfc3VwZXJfYmxvY2tfdGhpcmQgKnVzYjMpCit7CisJaWYgKChVRlNfU0Ioc2IpLT5zX2ZsYWdzICYgVUZTX1NUX01BU0spID09IFVGU19TVF9TVU54ODYpCisJCXJldHVybiBmczMyX3RvX2NwdShzYiwgdXNiMy0+ZnNfdTIuZnNfc3VueDg2LmZzX25wc2VjdCk7CisJZWxzZQorCQlyZXR1cm4gZnMzMl90b19jcHUoc2IsIHVzYjEtPmZzX3UxLmZzX3N1bi5mc19ucHNlY3QpOworfQorCitzdGF0aWMgaW5saW5lIHU2NAordWZzX2dldF9mc19xYm1hc2soc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IHVmc19zdXBlcl9ibG9ja190aGlyZCAqdXNiMykKK3sKKwlfX2ZzNjQgdG1wOworCisJc3dpdGNoIChVRlNfU0Ioc2IpLT5zX2ZsYWdzICYgVUZTX1NUX01BU0spIHsKKwljYXNlIFVGU19TVF9TVU46CisJCSgoX19mczMyICopJnRtcClbMF0gPSB1c2IzLT5mc191Mi5mc19zdW4uZnNfcWJtYXNrWzBdOworCQkoKF9fZnMzMiAqKSZ0bXApWzFdID0gdXNiMy0+ZnNfdTIuZnNfc3VuLmZzX3FibWFza1sxXTsKKwkJYnJlYWs7CisJY2FzZSBVRlNfU1RfU1VOeDg2OgorCQkoKF9fZnMzMiAqKSZ0bXApWzBdID0gdXNiMy0+ZnNfdTIuZnNfc3VueDg2LmZzX3FibWFza1swXTsKKwkJKChfX2ZzMzIgKikmdG1wKVsxXSA9IHVzYjMtPmZzX3UyLmZzX3N1bng4Ni5mc19xYm1hc2tbMV07CisJCWJyZWFrOworCWNhc2UgVUZTX1NUXzQ0QlNEOgorCQkoKF9fZnMzMiAqKSZ0bXApWzBdID0gdXNiMy0+ZnNfdTIuZnNfNDQuZnNfcWJtYXNrWzBdOworCQkoKF9fZnMzMiAqKSZ0bXApWzFdID0gdXNiMy0+ZnNfdTIuZnNfNDQuZnNfcWJtYXNrWzFdOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZnM2NF90b19jcHUoc2IsIHRtcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTY0Cit1ZnNfZ2V0X2ZzX3FmbWFzayhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX3RoaXJkICp1c2IzKQoreworCV9fZnM2NCB0bXA7CisKKwlzd2l0Y2ggKFVGU19TQihzYiktPnNfZmxhZ3MgJiBVRlNfU1RfTUFTSykgeworCWNhc2UgVUZTX1NUX1NVTjoKKwkJKChfX2ZzMzIgKikmdG1wKVswXSA9IHVzYjMtPmZzX3UyLmZzX3N1bi5mc19xZm1hc2tbMF07CisJCSgoX19mczMyICopJnRtcClbMV0gPSB1c2IzLT5mc191Mi5mc19zdW4uZnNfcWZtYXNrWzFdOworCQlicmVhazsKKwljYXNlIFVGU19TVF9TVU54ODY6CisJCSgoX19mczMyICopJnRtcClbMF0gPSB1c2IzLT5mc191Mi5mc19zdW54ODYuZnNfcWZtYXNrWzBdOworCQkoKF9fZnMzMiAqKSZ0bXApWzFdID0gdXNiMy0+ZnNfdTIuZnNfc3VueDg2LmZzX3FmbWFza1sxXTsKKwkJYnJlYWs7CisJY2FzZSBVRlNfU1RfNDRCU0Q6CisJCSgoX19mczMyICopJnRtcClbMF0gPSB1c2IzLT5mc191Mi5mc180NC5mc19xZm1hc2tbMF07CisJCSgoX19mczMyICopJnRtcClbMV0gPSB1c2IzLT5mc191Mi5mc180NC5mc19xZm1hc2tbMV07CisJCWJyZWFrOworCX0KKworCXJldHVybiBmczY0X3RvX2NwdShzYiwgdG1wKTsKK30KKworc3RhdGljIGlubGluZSB1MTYKK3Vmc19nZXRfZGVfbmFtbGVuKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICpkZSkKK3sKKwlpZiAoKFVGU19TQihzYiktPnNfZmxhZ3MgJiBVRlNfREVfTUFTSykgPT0gVUZTX0RFX09MRCkKKwkJcmV0dXJuIGZzMTZfdG9fY3B1KHNiLCBkZS0+ZF91LmRfbmFtbGVuKTsKKwllbHNlCisJCXJldHVybiBkZS0+ZF91LmRfNDQuZF9uYW1sZW47IC8qIFhYWCB0aGlzIHNlZW1zIHdyb25nICovCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAordWZzX3NldF9kZV9uYW1sZW4oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IHVmc19kaXJfZW50cnkgKmRlLCB1MTYgdmFsdWUpCit7CisJaWYgKChVRlNfU0Ioc2IpLT5zX2ZsYWdzICYgVUZTX0RFX01BU0spID09IFVGU19ERV9PTEQpCisJCWRlLT5kX3UuZF9uYW1sZW4gPSBjcHVfdG9fZnMxNihzYiwgdmFsdWUpOworCWVsc2UKKwkJZGUtPmRfdS5kXzQ0LmRfbmFtbGVuID0gdmFsdWU7IC8qIFhYWCB0aGlzIHNlZW1zIHdyb25nICovCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAordWZzX3NldF9kZV90eXBlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCB1ZnNfZGlyX2VudHJ5ICpkZSwgaW50IG1vZGUpCit7CisJaWYgKChVRlNfU0Ioc2IpLT5zX2ZsYWdzICYgVUZTX0RFX01BU0spICE9IFVGU19ERV80NEJTRCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBUT0RPIHR1cm4gdGhpcyBpbnRvIGEgdGFibGUgbG9va3VwCisJICovCisJc3dpdGNoIChtb2RlICYgU19JRk1UKSB7CisJY2FzZSBTX0lGU09DSzoKKwkJZGUtPmRfdS5kXzQ0LmRfdHlwZSA9IERUX1NPQ0s7CisJCWJyZWFrOworCWNhc2UgU19JRkxOSzoKKwkJZGUtPmRfdS5kXzQ0LmRfdHlwZSA9IERUX0xOSzsKKwkJYnJlYWs7CisJY2FzZSBTX0lGUkVHOgorCQlkZS0+ZF91LmRfNDQuZF90eXBlID0gRFRfUkVHOworCQlicmVhazsKKwljYXNlIFNfSUZCTEs6CisJCWRlLT5kX3UuZF80NC5kX3R5cGUgPSBEVF9CTEs7CisJCWJyZWFrOworCWNhc2UgU19JRkRJUjoKKwkJZGUtPmRfdS5kXzQ0LmRfdHlwZSA9IERUX0RJUjsKKwkJYnJlYWs7CisJY2FzZSBTX0lGQ0hSOgorCQlkZS0+ZF91LmRfNDQuZF90eXBlID0gRFRfQ0hSOworCQlicmVhazsKKwljYXNlIFNfSUZJRk86CisJCWRlLT5kX3UuZF80NC5kX3R5cGUgPSBEVF9GSUZPOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZS0+ZF91LmRfNDQuZF90eXBlID0gRFRfVU5LTk9XTjsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyCit1ZnNfZ2V0X2lub2RlX3VpZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgdWZzX2lub2RlICppbm9kZSkKK3sKKwlzd2l0Y2ggKFVGU19TQihzYiktPnNfZmxhZ3MgJiBVRlNfVUlEX01BU0spIHsKKwljYXNlIFVGU19VSURfRUZUOgorCQlyZXR1cm4gZnMzMl90b19jcHUoc2IsIGlub2RlLT51aV91My51aV9zdW4udWlfdWlkKTsKKwljYXNlIFVGU19VSURfNDRCU0Q6CisJCXJldHVybiBmczMyX3RvX2NwdShzYiwgaW5vZGUtPnVpX3UzLnVpXzQ0LnVpX3VpZCk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZzMTZfdG9fY3B1KHNiLCBpbm9kZS0+dWlfdTEub2xkaWRzLnVpX3N1aWQpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkCit1ZnNfc2V0X2lub2RlX3VpZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgdWZzX2lub2RlICppbm9kZSwgdTMyIHZhbHVlKQoreworCXN3aXRjaCAoVUZTX1NCKHNiKS0+c19mbGFncyAmIFVGU19VSURfTUFTSykgeworCWNhc2UgVUZTX1VJRF9FRlQ6CisJCWlub2RlLT51aV91My51aV9zdW4udWlfdWlkID0gY3B1X3RvX2ZzMzIoc2IsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBVRlNfVUlEXzQ0QlNEOgorCQlpbm9kZS0+dWlfdTMudWlfNDQudWlfdWlkID0gY3B1X3RvX2ZzMzIoc2IsIHZhbHVlKTsKKwkJYnJlYWs7CisJfQorCWlub2RlLT51aV91MS5vbGRpZHMudWlfc3VpZCA9IGNwdV90b19mczE2KHNiLCB2YWx1ZSk7IAorfQorCitzdGF0aWMgaW5saW5lIHUzMgordWZzX2dldF9pbm9kZV9naWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IHVmc19pbm9kZSAqaW5vZGUpCit7CisJc3dpdGNoIChVRlNfU0Ioc2IpLT5zX2ZsYWdzICYgVUZTX1VJRF9NQVNLKSB7CisJY2FzZSBVRlNfVUlEX0VGVDoKKwkJcmV0dXJuIGZzMzJfdG9fY3B1KHNiLCBpbm9kZS0+dWlfdTMudWlfc3VuLnVpX2dpZCk7CisJY2FzZSBVRlNfVUlEXzQ0QlNEOgorCQlyZXR1cm4gZnMzMl90b19jcHUoc2IsIGlub2RlLT51aV91My51aV80NC51aV9naWQpOworCWRlZmF1bHQ6CisJCXJldHVybiBmczE2X3RvX2NwdShzYiwgaW5vZGUtPnVpX3UxLm9sZGlkcy51aV9zZ2lkKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAordWZzX3NldF9pbm9kZV9naWQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IHVmc19pbm9kZSAqaW5vZGUsIHUzMiB2YWx1ZSkKK3sKKwlzd2l0Y2ggKFVGU19TQihzYiktPnNfZmxhZ3MgJiBVRlNfVUlEX01BU0spIHsKKwljYXNlIFVGU19VSURfRUZUOgorCQlpbm9kZS0+dWlfdTMudWlfc3VuLnVpX2dpZCA9IGNwdV90b19mczMyKHNiLCB2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgVUZTX1VJRF80NEJTRDoKKwkJaW5vZGUtPnVpX3UzLnVpXzQ0LnVpX2dpZCA9IGNwdV90b19mczMyKHNiLCB2YWx1ZSk7CisJCWJyZWFrOworCX0KKwlpbm9kZS0+dWlfdTEub2xkaWRzLnVpX3NnaWQgPSAgY3B1X3RvX2ZzMTYoc2IsIHZhbHVlKTsKK30KKworZXh0ZXJuIGRldl90IHVmc19nZXRfaW5vZGVfZGV2KHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgdWZzX2lub2RlX2luZm8gKik7CitleHRlcm4gdm9pZCB1ZnNfc2V0X2lub2RlX2RldihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgc3RydWN0IHVmc19pbm9kZV9pbmZvICosIGRldl90KTsKKworLyoKKyAqIFRoZXNlIGZ1bmN0aW9ucyBtYW5pcHVsYXRlIHVmcyBidWZmZXJzCisgKi8KKyNkZWZpbmUgdWJoX2JyZWFkKHNiLGZyYWdtZW50LHNpemUpIF91YmhfYnJlYWRfKHVzcGksc2IsZnJhZ21lbnQsc2l6ZSkgIAorZXh0ZXJuIHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiBfdWJoX2JyZWFkXyhzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdTY0ICwgdTY0KTsKK2V4dGVybiBzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICogdWJoX2JyZWFkX3VzcGkoc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiwgc3RydWN0IHN1cGVyX2Jsb2NrICosIHU2NCwgdTY0KTsKK2V4dGVybiB2b2lkIHViaF9icmVsc2UgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKik7CitleHRlcm4gdm9pZCB1YmhfYnJlbHNlX3VzcGkgKHN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICopOworZXh0ZXJuIHZvaWQgdWJoX21hcmtfYnVmZmVyX2RpcnR5IChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICopOworZXh0ZXJuIHZvaWQgdWJoX21hcmtfYnVmZmVyX3VwdG9kYXRlIChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICosIGludCk7CitleHRlcm4gdm9pZCB1YmhfbGxfcndfYmxvY2sgKGludCwgdW5zaWduZWQsIHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiopOworZXh0ZXJuIHZvaWQgdWJoX3dhaXRfb25fYnVmZmVyIChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICopOworZXh0ZXJuIHVuc2lnbmVkIHViaF9tYXhfYmNvdW50IChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICopOworZXh0ZXJuIHZvaWQgdWJoX2Jmb3JnZXQgKHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKik7CitleHRlcm4gaW50ICB1YmhfYnVmZmVyX2RpcnR5IChzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICopOworI2RlZmluZSB1YmhfdWJoY3B5bWVtKG1lbSx1Ymgsc2l6ZSkgX3ViaF91YmhjcHltZW1fKHVzcGksbWVtLHViaCxzaXplKQorZXh0ZXJuIHZvaWQgX3ViaF91YmhjcHltZW1fKHN0cnVjdCB1ZnNfc2JfcHJpdmF0ZV9pbmZvICosIHVuc2lnbmVkIGNoYXIgKiwgc3RydWN0IHVmc19idWZmZXJfaGVhZCAqLCB1bnNpZ25lZCk7CisjZGVmaW5lIHViaF9tZW1jcHl1YmgodWJoLG1lbSxzaXplKSBfdWJoX21lbWNweXViaF8odXNwaSx1YmgsbWVtLHNpemUpCitleHRlcm4gdm9pZCBfdWJoX21lbWNweXViaF8oc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiwgc3RydWN0IHVmc19idWZmZXJfaGVhZCAqLCB1bnNpZ25lZCBjaGFyICosIHVuc2lnbmVkKTsKKworCisKKy8qCisgKiBtYWNyb3MgdG8gZ2V0IGltcG9ydGFudCBzdHJ1Y3R1cmVzIGZyb20gdWZzX2J1ZmZlcl9oZWFkCisgKi8KKyNkZWZpbmUgdWJoX2dldF91c2JfZmlyc3QodWJoKSBcCisJKChzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX2ZpcnN0ICopKCh1YmgpLT5iaFswXS0+Yl9kYXRhKSkKKworI2RlZmluZSB1YmhfZ2V0X3VzYl9zZWNvbmQodWJoKSBcCisJKChzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX3NlY29uZCAqKSh1YmgpLT4gXAorCWJoW1VGU19TRUNUT1JfU0laRSA+PiB1c3BpLT5zX2ZzaGlmdF0tPmJfZGF0YSArIChVRlNfU0VDVE9SX1NJWkUgJiB+dXNwaS0+c19mbWFzaykpCisKKyNkZWZpbmUgdWJoX2dldF91c2JfdGhpcmQodWJoKSBcCisJKChzdHJ1Y3QgdWZzX3N1cGVyX2Jsb2NrX3RoaXJkICopKCh1YmgpLT4gXAorCWJoW1VGU19TRUNUT1JfU0laRSoyID4+IHVzcGktPnNfZnNoaWZ0XS0+Yl9kYXRhICsgKFVGU19TRUNUT1JfU0laRSoyICYgfnVzcGktPnNfZm1hc2spKSkKKworI2RlZmluZSB1YmhfZ2V0X3VjZyh1YmgpIFwKKwkoKHN0cnVjdCB1ZnNfY3lsaW5kZXJfZ3JvdXAgKikoKHViaCktPmJoWzBdLT5iX2RhdGEpKQorCisKKy8qCisgKiBFeHRyYWN0IGJ5dGUgZnJvbSB1ZnNfYnVmZmVyX2hlYWQKKyAqIEV4dHJhY3QgdGhlIGJpdHMgZm9yIGEgYmxvY2sgZnJvbSBhIG1hcCBpbnNpZGUgdWZzX2J1ZmZlcl9oZWFkCisgKi8KKyNkZWZpbmUgdWJoX2dldF9hZGRyOCh1YmgsYmVnaW4pIFwKKwkoKHU4KikodWJoKS0+YmhbKGJlZ2luKSA+PiB1c3BpLT5zX2ZzaGlmdF0tPmJfZGF0YSArIFwKKwkoKGJlZ2luKSAmIH51c3BpLT5zX2ZtYXNrKSkKKworI2RlZmluZSB1YmhfZ2V0X2FkZHIxNih1YmgsYmVnaW4pIFwKKwkoKChfX2ZzMTYqKSgodWJoKS0+YmhbKGJlZ2luKSA+PiAodXNwaS0+c19mc2hpZnQtMSldLT5iX2RhdGEpKSArIFwKKwkoKGJlZ2luKSAmICh1c3BpLT5mc2l6ZT4+MSkgLSAxKSkpCisKKyNkZWZpbmUgdWJoX2dldF9hZGRyMzIodWJoLGJlZ2luKSBcCisJKCgoX19mczMyKikoKHViaCktPmJoWyhiZWdpbikgPj4gKHVzcGktPnNfZnNoaWZ0LTIpXS0+Yl9kYXRhKSkgKyBcCisJKChiZWdpbikgJiAoKHVzcGktPnNfZnNpemU+PjIpIC0gMSkpKQorCisjZGVmaW5lIHViaF9nZXRfYWRkciB1YmhfZ2V0X2FkZHI4CisKKyNkZWZpbmUgdWJoX2Jsa21hcCh1YmgsYmVnaW4sYml0KSBcCisJKCgqdWJoX2dldF9hZGRyKHViaCwgKGJlZ2luKSArICgoYml0KSA+PiAzKSkgPj4gKChiaXQpICYgNykpICYgKDB4ZmYgPj4gKFVGU19NQVhGUkFHIC0gdXNwaS0+c19mcGIpKSkKKworCisvKgorICogTWFjcm9zIGZvciBhY2Nlc3MgdG8gc3VwZXJibG9jayBhcnJheSBzdHJ1Y3R1cmVzCisgKi8KKyNkZWZpbmUgdWJoX3Bvc3RibCh1YmgsY3lsbm8saSkgXAorCSgodXNwaS0+c19wb3N0Ymxmb3JtYXQgIT0gVUZTX0RZTkFNSUNQT1NUQkxGTVQpIFwKKwk/ICgqKF9fczE2KikodWJoX2dldF9hZGRyKHViaCwgXAorCSh1bnNpZ25lZCkoJigoc3RydWN0IHVmc19zdXBlcl9ibG9jayAqKTApLT5mc19vcG9zdGJsKSBcCisJKyAoKChjeWxubykgKiAxNiArIChpKSkgPDwgMSkgKSApKSBcCisJOiAoKihfX3MxNiopKHViaF9nZXRfYWRkcih1YmgsIFwKKwl1c3BpLT5zX3Bvc3RibG9mZiArICgoKGN5bG5vKSAqIHVzcGktPnNfbnJwb3MgKyAoaSkpIDw8IDEpICkpKSkKKworI2RlZmluZSB1Ymhfcm90YmwodWJoLGkpIFwKKwkoKHVzcGktPnNfcG9zdGJsZm9ybWF0ICE9IFVGU19EWU5BTUlDUE9TVEJMRk1UKSBcCisJPyAoKihfX3U4KikodWJoX2dldF9hZGRyKHViaCwgXAorCSh1bnNpZ25lZCkoJigoc3RydWN0IHVmc19zdXBlcl9ibG9jayAqKTApLT5mc19zcGFjZSkgKyAoaSkpKSkgXAorCTogKCooX191OCopKHViaF9nZXRfYWRkcih1YmgsIHVzcGktPnNfcm90YmxvZmYgKyAoaSkpKSkpCisKKy8qCisgKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgZnJhZ3MgZ2l2ZW4gYQorICogcGVyY2VudGFnZSB0byBob2xkIGluIHJlc2VydmUuCisgKi8KKyNkZWZpbmUgdWZzX2ZyZWVzcGFjZSh1c2IsIHBlcmNlbnRyZXNlcnZlZCkgXAorCSh1ZnNfYmxrc3RvZnJhZ3MoZnMzMl90b19jcHUoc2IsICh1c2IpLT5mc19jc3RvdGFsLmNzX25iZnJlZSkpICsgXAorCWZzMzJfdG9fY3B1KHNiLCAodXNiKS0+ZnNfY3N0b3RhbC5jc19uZmZyZWUpIC0gKHVzcGktPnNfZHNpemUgKiAocGVyY2VudHJlc2VydmVkKSAvIDEwMCkpCisKKy8qCisgKiBNYWNyb3MgdG8gYWNjZXNzIGN5bGluZGVyIGdyb3VwIGFycmF5IHN0cnVjdHVyZXMKKyAqLworI2RlZmluZSB1YmhfY2dfYmxrdG90KHVjcGksY3lsbm8pIFwKKwkoKigoX19mczMyKil1YmhfZ2V0X2FkZHIoVUNQSV9VQkgsICh1Y3BpKS0+Y19idG90b2ZmICsgKChjeWxubykgPDwgMikpKSkKKworI2RlZmluZSB1YmhfY2dfYmxrcyh1Y3BpLGN5bG5vLHJwb3MpIFwKKwkoKigoX19mczE2Kil1YmhfZ2V0X2FkZHIoVUNQSV9VQkgsIFwKKwkodWNwaSktPmNfYm9mZiArICgoKGN5bG5vKSAqIHVzcGktPnNfbnJwb3MgKyAocnBvcykpIDw8IDEgKSkpKQorCisvKgorICogQml0bWFwIG9wZXJhdGlvbnMKKyAqIFRoZXNlIGZ1bmN0aW9ucyB3b3JrIGxpa2UgY2xhc3NpY2FsIGJpdG1hcCBvcGVyYXRpb25zLgorICogVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB3ZSBkb24ndCBoYXZlIHRoZSB3aG9sZSBiaXRtYXAKKyAqIGluIG9uZSBjb250aWd1b3VzIGNodW5rIG9mIG1lbW9yeSwgYnV0IGluIHNldmVyYWwgYnVmZmVycy4KKyAqIFRoZSBwYXJhbWV0ZXJzIG9mIGVhY2ggZnVuY3Rpb24gYXJlIHN1cGVyX2Jsb2NrLCB1ZnNfYnVmZmVyX2hlYWQgYW5kCisgKiBwb3NpdGlvbiBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBiaXRtYXAuCisgKi8KKyNkZWZpbmUgdWJoX3NldGJpdCh1YmgsYmVnaW4sYml0KSBcCisJKCp1YmhfZ2V0X2FkZHIodWJoLCAoYmVnaW4pICsgKChiaXQpID4+IDMpKSB8PSAoMSA8PCAoKGJpdCkgJiA3KSkpCisKKyNkZWZpbmUgdWJoX2NscmJpdCh1YmgsYmVnaW4sYml0KSBcCisJKCp1YmhfZ2V0X2FkZHIgKHViaCwgKGJlZ2luKSArICgoYml0KSA+PiAzKSkgJj0gfigxIDw8ICgoYml0KSAmIDcpKSkKKworI2RlZmluZSB1YmhfaXNzZXQodWJoLGJlZ2luLGJpdCkgXAorCSgqdWJoX2dldF9hZGRyICh1YmgsIChiZWdpbikgKyAoKGJpdCkgPj4gMykpICYgKDEgPDwgKChiaXQpICYgNykpKQorCisjZGVmaW5lIHViaF9pc2Nscih1YmgsYmVnaW4sYml0KSAoIXViaF9pc3NldCh1YmgsYmVnaW4sYml0KSkKKworI2RlZmluZSB1YmhfZmluZF9maXJzdF96ZXJvX2JpdCh1YmgsYmVnaW4sc2l6ZSkgX3ViaF9maW5kX25leHRfemVyb19iaXRfKHVzcGksdWJoLGJlZ2luLHNpemUsMCkKKworI2RlZmluZSB1YmhfZmluZF9uZXh0X3plcm9fYml0KHViaCxiZWdpbixzaXplLG9mZnNldCkgX3ViaF9maW5kX25leHRfemVyb19iaXRfKHVzcGksdWJoLGJlZ2luLHNpemUsb2Zmc2V0KQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBfdWJoX2ZpbmRfbmV4dF96ZXJvX2JpdF8oCisJc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpLCBzdHJ1Y3QgdWZzX2J1ZmZlcl9oZWFkICogdWJoLAorCXVuc2lnbmVkIGJlZ2luLCB1bnNpZ25lZCBzaXplLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJdW5zaWduZWQgYmFzZSwgY291bnQsIHBvczsKKworCXNpemUgLT0gb2Zmc2V0OworCWJlZ2luIDw8PSAzOworCW9mZnNldCArPSBiZWdpbjsKKwliYXNlID0gb2Zmc2V0ID4+IHVzcGktPnNfYnBmc2hpZnQ7CisJb2Zmc2V0ICY9IHVzcGktPnNfYnBmbWFzazsKKwlmb3IgKDs7KSB7CisJCWNvdW50ID0gbWluX3QodW5zaWduZWQgaW50LCBzaXplICsgb2Zmc2V0LCB1c3BpLT5zX2JwZik7CisJCXNpemUgLT0gY291bnQgLSBvZmZzZXQ7CisJCXBvcyA9IGV4dDJfZmluZF9uZXh0X3plcm9fYml0ICh1YmgtPmJoW2Jhc2VdLT5iX2RhdGEsIGNvdW50LCBvZmZzZXQpOworCQlpZiAocG9zIDwgY291bnQgfHwgIXNpemUpCisJCQlicmVhazsKKwkJYmFzZSsrOworCQlvZmZzZXQgPSAwOworCX0KKwlyZXR1cm4gKGJhc2UgPDwgdXNwaS0+c19icGZzaGlmdCkgKyBwb3MgLSBiZWdpbjsKK30gCQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGZpbmRfbGFzdF96ZXJvX2JpdCAodW5zaWduZWQgY2hhciAqIGJpdG1hcCwKKwl1bnNpZ25lZCBzaXplLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJdW5zaWduZWQgYml0LCBpOworCXVuc2lnbmVkIGNoYXIgKiBtYXBwOworCXVuc2lnbmVkIGNoYXIgbWFwOworCisJbWFwcCA9IGJpdG1hcCArIChzaXplID4+IDMpOworCW1hcCA9ICptYXBwLS07CisJYml0ID0gMSA8PCAoc2l6ZSAmIDcpOworCWZvciAoaSA9IHNpemU7IGkgPiBvZmZzZXQ7IGktLSkgeworCQlpZiAoKG1hcCAmIGJpdCkgPT0gMCkKKwkJCWJyZWFrOworCQlpZiAoKGkgJiA3KSAhPSAwKSB7CisJCQliaXQgPj49IDE7CisJCX0gZWxzZSB7CisJCQltYXAgPSAqbWFwcC0tOworCQkJYml0ID0gMSA8PCA3OworCQl9CisJfQorCXJldHVybiBpOworfQorCisjZGVmaW5lIHViaF9maW5kX2xhc3RfemVyb19iaXQodWJoLGJlZ2luLHNpemUsb2Zmc2V0KSBfdWJoX2ZpbmRfbGFzdF96ZXJvX2JpdF8odXNwaSx1YmgsYmVnaW4sc2l6ZSxvZmZzZXQpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIF91YmhfZmluZF9sYXN0X3plcm9fYml0XygKKwlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGksIHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiB1YmgsCisJdW5zaWduZWQgYmVnaW4sIHVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBlbmQpCit7CisJdW5zaWduZWQgYmFzZSwgY291bnQsIHBvcywgc2l6ZTsKKworCXNpemUgPSBzdGFydCAtIGVuZDsKKwliZWdpbiA8PD0gMzsKKwlzdGFydCArPSBiZWdpbjsKKwliYXNlID0gc3RhcnQgPj4gdXNwaS0+c19icGZzaGlmdDsKKwlzdGFydCAmPSB1c3BpLT5zX2JwZm1hc2s7CisJZm9yICg7OykgeworCQljb3VudCA9IG1pbl90KHVuc2lnbmVkIGludCwKKwkJCSAgICBzaXplICsgKHVzcGktPnNfYnBmIC0gc3RhcnQpLCB1c3BpLT5zX2JwZikKKwkJCS0gKHVzcGktPnNfYnBmIC0gc3RhcnQpOworCQlzaXplIC09IGNvdW50OworCQlwb3MgPSBmaW5kX2xhc3RfemVyb19iaXQgKHViaC0+YmhbYmFzZV0tPmJfZGF0YSwKKwkJCXN0YXJ0LCBzdGFydCAtIGNvdW50KTsKKwkJaWYgKHBvcyA+IHN0YXJ0IC0gY291bnQgfHwgIXNpemUpCisJCQlicmVhazsKKwkJYmFzZS0tOworCQlzdGFydCA9IHVzcGktPnNfYnBmOworCX0KKwlyZXR1cm4gKGJhc2UgPDwgdXNwaS0+c19icGZzaGlmdCkgKyBwb3MgLSBiZWdpbjsKK30gCQorCisjZGVmaW5lIHViaF9pc2Jsb2NrY2xlYXIodWJoLGJlZ2luLGJsb2NrKSAoIV91YmhfaXNibG9ja3NldF8odXNwaSx1YmgsYmVnaW4sYmxvY2spKQorCisjZGVmaW5lIHViaF9pc2Jsb2Nrc2V0KHViaCxiZWdpbixibG9jaykgX3ViaF9pc2Jsb2Nrc2V0Xyh1c3BpLHViaCxiZWdpbixibG9jaykKK3N0YXRpYyBpbmxpbmUgaW50IF91YmhfaXNibG9ja3NldF8oc3RydWN0IHVmc19zYl9wcml2YXRlX2luZm8gKiB1c3BpLAorCXN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiB1YmgsIHVuc2lnbmVkIGJlZ2luLCB1bnNpZ25lZCBibG9jaykKK3sKKwlzd2l0Y2ggKHVzcGktPnNfZnBiKSB7CisJY2FzZSA4OgorCSAgICAJcmV0dXJuICgqdWJoX2dldF9hZGRyICh1YmgsIGJlZ2luICsgYmxvY2spID09IDB4ZmYpOworCWNhc2UgNDoKKwkJcmV0dXJuICgqdWJoX2dldF9hZGRyICh1YmgsIGJlZ2luICsgKGJsb2NrID4+IDEpKSA9PSAoMHgwZiA8PCAoKGJsb2NrICYgMHgwMSkgPDwgMikpKTsKKwljYXNlIDI6CisJCXJldHVybiAoKnViaF9nZXRfYWRkciAodWJoLCBiZWdpbiArIChibG9jayA+PiAyKSkgPT0gKDB4MDMgPDwgKChibG9jayAmIDB4MDMpIDw8IDEpKSk7CisJY2FzZSAxOgorCQlyZXR1cm4gKCp1YmhfZ2V0X2FkZHIgKHViaCwgYmVnaW4gKyAoYmxvY2sgPj4gMykpID09ICgweDAxIDw8IChibG9jayAmIDB4MDcpKSk7CisJfQorCXJldHVybiAwOwkKK30KKworI2RlZmluZSB1YmhfY2xyYmxvY2sodWJoLGJlZ2luLGJsb2NrKSBfdWJoX2NscmJsb2NrXyh1c3BpLHViaCxiZWdpbixibG9jaykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfdWJoX2NscmJsb2NrXyhzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGksCisJc3RydWN0IHVmc19idWZmZXJfaGVhZCAqIHViaCwgdW5zaWduZWQgYmVnaW4sIHVuc2lnbmVkIGJsb2NrKQoreworCXN3aXRjaCAodXNwaS0+c19mcGIpIHsKKwljYXNlIDg6CisJICAgIAkqdWJoX2dldF9hZGRyICh1YmgsIGJlZ2luICsgYmxvY2spID0gMHgwMDsKKwkgICAgCXJldHVybjsgCisJY2FzZSA0OgorCQkqdWJoX2dldF9hZGRyICh1YmgsIGJlZ2luICsgKGJsb2NrID4+IDEpKSAmPSB+KDB4MGYgPDwgKChibG9jayAmIDB4MDEpIDw8IDIpKTsKKwkJcmV0dXJuOworCWNhc2UgMjoKKwkJKnViaF9nZXRfYWRkciAodWJoLCBiZWdpbiArIChibG9jayA+PiAyKSkgJj0gfigweDAzIDw8ICgoYmxvY2sgJiAweDAzKSA8PCAxKSk7CisJCXJldHVybjsKKwljYXNlIDE6CisJCSp1YmhfZ2V0X2FkZHIgKHViaCwgYmVnaW4gKyAoYmxvY2sgPj4gMykpICY9IH4oMHgwMSA8PCAoKGJsb2NrICYgMHgwNykpKTsKKwkJcmV0dXJuOworCX0KK30KKworI2RlZmluZSB1Ymhfc2V0YmxvY2sodWJoLGJlZ2luLGJsb2NrKSBfdWJoX3NldGJsb2NrXyh1c3BpLHViaCxiZWdpbixibG9jaykKK3N0YXRpYyBpbmxpbmUgdm9pZCBfdWJoX3NldGJsb2NrXyhzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGksCisJc3RydWN0IHVmc19idWZmZXJfaGVhZCAqIHViaCwgdW5zaWduZWQgYmVnaW4sIHVuc2lnbmVkIGJsb2NrKQoreworCXN3aXRjaCAodXNwaS0+c19mcGIpIHsKKwljYXNlIDg6CisJICAgIAkqdWJoX2dldF9hZGRyKHViaCwgYmVnaW4gKyBibG9jaykgPSAweGZmOworCSAgICAJcmV0dXJuOworCWNhc2UgNDoKKwkJKnViaF9nZXRfYWRkcih1YmgsIGJlZ2luICsgKGJsb2NrID4+IDEpKSB8PSAoMHgwZiA8PCAoKGJsb2NrICYgMHgwMSkgPDwgMikpOworCQlyZXR1cm47CisJY2FzZSAyOgorCQkqdWJoX2dldF9hZGRyKHViaCwgYmVnaW4gKyAoYmxvY2sgPj4gMikpIHw9ICgweDAzIDw8ICgoYmxvY2sgJiAweDAzKSA8PCAxKSk7CisJCXJldHVybjsKKwljYXNlIDE6CisJCSp1YmhfZ2V0X2FkZHIodWJoLCBiZWdpbiArIChibG9jayA+PiAzKSkgfD0gKDB4MDEgPDwgKChibG9jayAmIDB4MDcpKSk7CisJCXJldHVybjsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1ZnNfZnJhZ2FjY3QgKHN0cnVjdCBzdXBlcl9ibG9jayAqIHNiLCB1bnNpZ25lZCBibG9ja21hcCwKKwlfX2ZzMzIgKiBmcmFnbGlzdCwgaW50IGNudCkKK3sKKwlzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGk7CisJdW5zaWduZWQgZnJhZ3NpemUsIHBvczsKKwkKKwl1c3BpID0gVUZTX1NCKHNiKS0+c191c3BpOworCQorCWZyYWdzaXplID0gMDsKKwlmb3IgKHBvcyA9IDA7IHBvcyA8IHVzcGktPnNfZnBiOyBwb3MrKykgeworCQlpZiAoYmxvY2ttYXAgJiAoMSA8PCBwb3MpKSB7CisJCQlmcmFnc2l6ZSsrOworCQl9CisJCWVsc2UgaWYgKGZyYWdzaXplID4gMCkgeworCQkJZnMzMl9hZGQoc2IsICZmcmFnbGlzdFtmcmFnc2l6ZV0sIGNudCk7CisJCQlmcmFnc2l6ZSA9IDA7CisJCX0KKwl9CisJaWYgKGZyYWdzaXplID4gMCAmJiBmcmFnc2l6ZSA8IHVzcGktPnNfZnBiKQorCQlmczMyX2FkZChzYiwgJmZyYWdsaXN0W2ZyYWdzaXplXSwgY250KTsKK30KKworI2RlZmluZSB1Ymhfc2NhbmModWJoLGJlZ2luLHNpemUsdGFibGUsbWFzaykgX3ViaF9zY2FuY18odXNwaSx1YmgsYmVnaW4sc2l6ZSx0YWJsZSxtYXNrKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBfdWJoX3NjYW5jXyhzdHJ1Y3QgdWZzX3NiX3ByaXZhdGVfaW5mbyAqIHVzcGksIHN0cnVjdCB1ZnNfYnVmZmVyX2hlYWQgKiB1YmgsIAorCXVuc2lnbmVkIGJlZ2luLCB1bnNpZ25lZCBzaXplLCB1bnNpZ25lZCBjaGFyICogdGFibGUsIHVuc2lnbmVkIGNoYXIgbWFzaykKK3sKKwl1bnNpZ25lZCByZXN0LCBvZmZzZXQ7CisJdW5zaWduZWQgY2hhciAqIGNwOworCQorCisJb2Zmc2V0ID0gYmVnaW4gJiB+dXNwaS0+c19mbWFzazsKKwliZWdpbiA+Pj0gdXNwaS0+c19mc2hpZnQ7CisJZm9yICg7OykgeworCQlpZiAoKG9mZnNldCArIHNpemUpIDwgdXNwaS0+c19mc2l6ZSkKKwkJCXJlc3QgPSBzaXplOworCQllbHNlCisJCQlyZXN0ID0gdXNwaS0+c19mc2l6ZSAtIG9mZnNldDsKKwkJc2l6ZSAtPSByZXN0OworCQljcCA9IHViaC0+YmhbYmVnaW5dLT5iX2RhdGEgKyBvZmZzZXQ7CisJCXdoaWxlICgodGFibGVbKmNwKytdICYgbWFzaykgPT0gMCAmJiAtLXJlc3QpOworCQlpZiAocmVzdCB8fCAhc2l6ZSkKKwkJCWJyZWFrOworCQliZWdpbisrOworCQlvZmZzZXQgPSAwOworCX0KKwlyZXR1cm4gKHNpemUgKyByZXN0KTsKK30KZGlmZiAtLWdpdCBhL2ZzL3Vtc2Rvcy9ub3RlcyBiL2ZzL3Vtc2Rvcy9ub3RlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzQ3ZDFmCi0tLSAvZGV2L251bGwKKysrIGIvZnMvdW1zZG9zL25vdGVzCkBAIC0wLDAgKzEsMTcgQEAKK1RoaXMgZmlsZSBjb250YWluIGlkZWEgYW5kIHRoaW5ncyBJIGRvbid0IHdhbnQgdG8gZm9yZ2V0CisKK1Bvc3NpYmxlIGJ1ZyBpbiBmcy9yZWFkX3dyaXRlLmMKK0Z1bmN0aW9uIHN5c19yZWFkZGlyKCkKKworCVRoZXJlIGlzIGEgY2FsbCB0aGUgdmVyaWZ5X2FyZWEgdGhhdCBkb2VzIG5vdCB0YWtlIGluIGFjY291bnQKKwl0aGUgY291bnQgcGFyYW1ldGVyLiBJIGd1ZXNzIGl0IHNob3VsZCByZWFkCisKKwllcnJvciA9IHZlcmlmeV9hcmVhKFZFUklGWV9XUklURSwgZGlyZW50LCBjb3VudCpzaXplb2YgKCpkaXJlbnQpKTsKKworCWluc3RlYWQgb2YKKworCWVycm9yID0gdmVyaWZ5X2FyZWEoVkVSSUZZX1dSSVRFLCBkaXJlbnQsIHNpemVvZiAoKmRpcmVudCkpOworCisJT2YgY291cnNlLCBub3cgLCBjb3VudCBpcyBhbHdheXMgMQorCisKZGlmZiAtLWdpdCBhL2ZzL3ZmYXQvTWFrZWZpbGUgYi9mcy92ZmF0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZjI3OTgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy92ZmF0L01ha2VmaWxlCkBAIC0wLDAgKzEsNyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IHZmYXQtZmlsZXN5c3RlbSByb3V0aW5lcy4KKyMKKworb2JqLSQoQ09ORklHX1ZGQVRfRlMpICs9IHZmYXQubworCit2ZmF0LXkgOj0gbmFtZWkubwpkaWZmIC0tZ2l0IGEvZnMvdmZhdC9uYW1laS5jIGIvZnMvdmZhdC9uYW1laS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNmY2YjUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy92ZmF0L25hbWVpLmMKQEAgLTAsMCArMSwxMDgyIEBACisvKgorICogIGxpbnV4L2ZzL3ZmYXQvbmFtZWkuYworICoKKyAqICBXcml0dGVuIDE5OTIsMTk5MyBieSBXZXJuZXIgQWxtZXNiZXJnZXIKKyAqCisgKiAgV2luZG93czk1L1dpbmRvd3MgTlQgY29tcGF0aWJsZSBleHRlbmRlZCBNU0RPUyBmaWxlc3lzdGVtCisgKiAgICBieSBHb3Jkb24gQ2hhZmZlZSBDb3B5cmlnaHQgKEMpIDE5OTUuICBTZW5kIGJ1ZyByZXBvcnRzIGZvciB0aGUKKyAqICAgIFZGQVQgZmlsZXN5c3RlbSB0byA8Y2hhZmZlZUBjcy5iZXJrZWxleS5lZHU+LiAgU3BlY2lmeQorICogICAgd2hhdCBmaWxlIG9wZXJhdGlvbiBjYXVzZWQgeW91IHRyb3VibGUgYW5kIGlmIHlvdSBjYW4gZHVwbGljYXRlCisgKiAgICB0aGUgcHJvYmxlbSwgc2VuZCBhIHNjcmlwdCB0aGF0IGRlbW9uc3RyYXRlcyBpdC4KKyAqCisgKiAgU2hvcnQgbmFtZSB0cmFuc2xhdGlvbiAxOTk5LCAyMDAxIGJ5IFdvbGZyYW0gUGllbmtvc3MgPHdwQGJzemguZGU+CisgKgorICogIFN1cHBvcnQgTXVsdGlieXRlIGNoYXJhY3RlcnMgYW5kIGNsZWFudXAgYnkKKyAqCQkJCU9HQVdBIEhpcm9mdW1pIDxoaXJvZnVtaUBtYWlsLnBhcmtuZXQuY28uanA+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L21zZG9zX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisKK3N0YXRpYyBpbnQgdmZhdF9yZXZhbGlkYXRlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJaW50IHJldCA9IDE7CisKKwlpZiAoIWRlbnRyeS0+ZF9pbm9kZSAmJgorCSAgICBuZCAmJiAhKG5kLT5mbGFncyAmIExPT0tVUF9DT05USU5VRSkgJiYgKG5kLT5mbGFncyAmIExPT0tVUF9DUkVBVEUpKQorCQkvKgorCQkgKiBuZWdhdGl2ZSBkZW50cnkgaXMgZHJvcHBlZCwgaW4gb3JkZXIgdG8gbWFrZSBzdXJlCisJCSAqIHRvIHVzZSB0aGUgbmFtZSB3aGljaCBhIHVzZXIgZGVzaXJlcyBpZiB0aGlzIGlzCisJCSAqIGNyZWF0ZSBwYXRoLgorCQkgKi8KKwkJcmV0ID0gMDsKKwllbHNlIHsKKwkJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7CisJCWlmIChkZW50cnktPmRfdGltZSAhPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlLT5pX3ZlcnNpb24pCisJCQlyZXQgPSAwOworCQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiByZXR1cm5zIHRoZSBsZW5ndGggb2YgYSBzdHJ1Y3QgcXN0ciwgaWdub3JpbmcgdHJhaWxpbmcgZG90cyAqLworc3RhdGljIHVuc2lnbmVkIGludCB2ZmF0X3N0cmlwdGFpbF9sZW4oc3RydWN0IHFzdHIgKnFzdHIpCit7CisJdW5zaWduZWQgaW50IGxlbiA9IHFzdHItPmxlbjsKKworCXdoaWxlIChsZW4gJiYgcXN0ci0+bmFtZVtsZW4gLSAxXSA9PSAnLicpCisJCWxlbi0tOworCXJldHVybiBsZW47Cit9CisKKy8qCisgKiBDb21wdXRlIHRoZSBoYXNoIGZvciB0aGUgdmZhdCBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRlbnRyeS4KKyAqIE5vdGU6IGlmIHRoZSBuYW1lIGlzIGludmFsaWQsIHdlIGxlYXZlIHRoZSBoYXNoIGNvZGUgdW5jaGFuZ2VkIHNvCisgKiB0aGF0IHRoZSBleGlzdGluZyBkZW50cnkgY2FuIGJlIHVzZWQuIFRoZSB2ZmF0IGZzIHJvdXRpbmVzIHdpbGwKKyAqIHJldHVybiBFTk9FTlQgb3IgRUlOVkFMIGFzIGFwcHJvcHJpYXRlLgorICovCitzdGF0aWMgaW50IHZmYXRfaGFzaChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBxc3RyICpxc3RyKQoreworCXFzdHItPmhhc2ggPSBmdWxsX25hbWVfaGFzaChxc3RyLT5uYW1lLCB2ZmF0X3N0cmlwdGFpbF9sZW4ocXN0cikpOworCXJldHVybiAwOworfQorCisvKgorICogQ29tcHV0ZSB0aGUgaGFzaCBmb3IgdGhlIHZmYXQgbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBkZW50cnkuCisgKiBOb3RlOiBpZiB0aGUgbmFtZSBpcyBpbnZhbGlkLCB3ZSBsZWF2ZSB0aGUgaGFzaCBjb2RlIHVuY2hhbmdlZCBzbworICogdGhhdCB0aGUgZXhpc3RpbmcgZGVudHJ5IGNhbiBiZSB1c2VkLiBUaGUgdmZhdCBmcyByb3V0aW5lcyB3aWxsCisgKiByZXR1cm4gRU5PRU5UIG9yIEVJTlZBTCBhcyBhcHByb3ByaWF0ZS4KKyAqLworc3RhdGljIGludCB2ZmF0X2hhc2hpKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHFzdHIgKnFzdHIpCit7CisJc3RydWN0IG5sc190YWJsZSAqdCA9IE1TRE9TX1NCKGRlbnRyeS0+ZF9pbm9kZS0+aV9zYiktPm5sc19pbzsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lOworCXVuc2lnbmVkIGludCBsZW47CisJdW5zaWduZWQgbG9uZyBoYXNoOworCisJbmFtZSA9IHFzdHItPm5hbWU7CisJbGVuID0gdmZhdF9zdHJpcHRhaWxfbGVuKHFzdHIpOworCisJaGFzaCA9IGluaXRfbmFtZV9oYXNoKCk7CisJd2hpbGUgKGxlbi0tKQorCQloYXNoID0gcGFydGlhbF9uYW1lX2hhc2gobmxzX3RvbG93ZXIodCwgKm5hbWUrKyksIGhhc2gpOworCXFzdHItPmhhc2ggPSBlbmRfbmFtZV9oYXNoKGhhc2gpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDYXNlIGluc2Vuc2l0aXZlIGNvbXBhcmUgb2YgdHdvIHZmYXQgbmFtZXMuCisgKi8KK3N0YXRpYyBpbnQgdmZhdF9jbXBpKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHFzdHIgKmEsIHN0cnVjdCBxc3RyICpiKQoreworCXN0cnVjdCBubHNfdGFibGUgKnQgPSBNU0RPU19TQihkZW50cnktPmRfaW5vZGUtPmlfc2IpLT5ubHNfaW87CisJdW5zaWduZWQgaW50IGFsZW4sIGJsZW47CisKKwkvKiBBIGZpbGVuYW1lIGNhbm5vdCBlbmQgaW4gJy4nIG9yIHdlIHRyZWF0IGl0IGxpa2UgaXQgaGFzIG5vbmUgKi8KKwlhbGVuID0gdmZhdF9zdHJpcHRhaWxfbGVuKGEpOworCWJsZW4gPSB2ZmF0X3N0cmlwdGFpbF9sZW4oYik7CisJaWYgKGFsZW4gPT0gYmxlbikgeworCQlpZiAobmxzX3N0cm5pY21wKHQsIGEtPm5hbWUsIGItPm5hbWUsIGFsZW4pID09IDApCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBDYXNlIHNlbnNpdGl2ZSBjb21wYXJlIG9mIHR3byB2ZmF0IG5hbWVzLgorICovCitzdGF0aWMgaW50IHZmYXRfY21wKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IHFzdHIgKmEsIHN0cnVjdCBxc3RyICpiKQoreworCXVuc2lnbmVkIGludCBhbGVuLCBibGVuOworCisJLyogQSBmaWxlbmFtZSBjYW5ub3QgZW5kIGluICcuJyBvciB3ZSB0cmVhdCBpdCBsaWtlIGl0IGhhcyBub25lICovCisJYWxlbiA9IHZmYXRfc3RyaXB0YWlsX2xlbihhKTsKKwlibGVuID0gdmZhdF9zdHJpcHRhaWxfbGVuKGIpOworCWlmIChhbGVuID09IGJsZW4pIHsKKwkJaWYgKHN0cm5jbXAoYS0+bmFtZSwgYi0+bmFtZSwgYWxlbikgPT0gMCkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyB2ZmF0X2RlbnRyeV9vcHNbNF0gPSB7CisJeworCQkuZF9oYXNoCQk9IHZmYXRfaGFzaGksCisJCS5kX2NvbXBhcmUJPSB2ZmF0X2NtcGksCisJfSwKKwl7CisJCS5kX3JldmFsaWRhdGUJPSB2ZmF0X3JldmFsaWRhdGUsCisJCS5kX2hhc2gJCT0gdmZhdF9oYXNoaSwKKwkJLmRfY29tcGFyZQk9IHZmYXRfY21waSwKKwl9LAorCXsKKwkJLmRfaGFzaAkJPSB2ZmF0X2hhc2gsCisJCS5kX2NvbXBhcmUJPSB2ZmF0X2NtcCwKKwl9LAorCXsKKwkJLmRfcmV2YWxpZGF0ZQk9IHZmYXRfcmV2YWxpZGF0ZSwKKwkJLmRfaGFzaAkJPSB2ZmF0X2hhc2gsCisJCS5kX2NvbXBhcmUJPSB2ZmF0X2NtcCwKKwl9Cit9OworCisvKiBDaGFyYWN0ZXJzIHRoYXQgYXJlIHVuZGVzaXJhYmxlIGluIGFuIE1TLURPUyBmaWxlIG5hbWUgKi8KKworc3RhdGljIGlubGluZSB3Y2hhcl90IHZmYXRfYmFkX2NoYXIod2NoYXJfdCB3KQoreworCXJldHVybiAodyA8IDB4MDAyMCkKKwkgICAgfHwgKHcgPT0gJyonKSB8fCAodyA9PSAnPycpIHx8ICh3ID09ICc8JykgfHwgKHcgPT0gJz4nKQorCSAgICB8fCAodyA9PSAnfCcpIHx8ICh3ID09ICciJykgfHwgKHcgPT0gJzonKSB8fCAodyA9PSAnLycpCisJICAgIHx8ICh3ID09ICdcXCcpOworfQorCitzdGF0aWMgaW5saW5lIHdjaGFyX3QgdmZhdF9yZXBsYWNlX2NoYXIod2NoYXJfdCB3KQoreworCXJldHVybiAodyA9PSAnWycpIHx8ICh3ID09ICddJykgfHwgKHcgPT0gJzsnKSB8fCAodyA9PSAnLCcpCisJICAgIHx8ICh3ID09ICcrJykgfHwgKHcgPT0gJz0nKTsKK30KKworc3RhdGljIHdjaGFyX3QgdmZhdF9za2lwX2NoYXIod2NoYXJfdCB3KQoreworCXJldHVybiAodyA9PSAnLicpIHx8ICh3ID09ICcgJyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHZmYXRfaXNfdXNlZF9iYWRjaGFycyhjb25zdCB3Y2hhcl90ICpzLCBpbnQgbGVuKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQlpZiAodmZhdF9iYWRfY2hhcihzW2ldKSkKKwkJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZmYXRfdmFsaWRfbG9uZ25hbWUoY29uc3QgdW5zaWduZWQgY2hhciAqbmFtZSwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlpZiAobmFtZVtsZW4gLSAxXSA9PSAnICcpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChsZW4gPj0gMjU2KQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKworCS8qIE1TLURPUyAiZGV2aWNlIHNwZWNpYWwgZmlsZXMiICovCisJaWYgKGxlbiA9PSAzIHx8IChsZW4gPiAzICYmIG5hbWVbM10gPT0gJy4nKSkgewkvKiBiYXNlbmFtZSA9PSAzICovCisJCWlmICghc3RybmljbXAobmFtZSwgImF1eCIsIDMpIHx8CisJCSAgICAhc3RybmljbXAobmFtZSwgImNvbiIsIDMpIHx8CisJCSAgICAhc3RybmljbXAobmFtZSwgIm51bCIsIDMpIHx8CisJCSAgICAhc3RybmljbXAobmFtZSwgInBybiIsIDMpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChsZW4gPT0gNCB8fCAobGVuID4gNCAmJiBuYW1lWzRdID09ICcuJykpIHsJLyogYmFzZW5hbWUgPT0gNCAqLworCQkvKiAiY29tMSIsICJjb20yIiwgLi4uICovCisJCWlmICgnMScgPD0gbmFtZVszXSAmJiBuYW1lWzNdIDw9ICc5JykgeworCQkJaWYgKCFzdHJuaWNtcChuYW1lLCAiY29tIiwgMykgfHwKKwkJCSAgICAhc3RybmljbXAobmFtZSwgImxwdCIsIDMpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmZhdF9maW5kX2Zvcm0oc3RydWN0IGlub2RlICpkaXIsIHVuc2lnbmVkIGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGZhdF9zbG90X2luZm8gc2luZm87CisJaW50IGVyciA9IGZhdF9zY2FuKGRpciwgbmFtZSwgJnNpbmZvKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gLUVOT0VOVDsKKwlicmVsc2Uoc2luZm8uYmgpOworCXJldHVybiAwOworfQorCisvKgorICogMSkgVmFsaWQgY2hhcmFjdGVycyBmb3IgdGhlIDguMyBmb3JtYXQgYWxpYXMgYXJlIGFueSBjb21iaW5hdGlvbiBvZgorICogbGV0dGVycywgdXBwZXJjYXNlIGFscGhhYmV0cywgZGlnaXRzLCBhbnkgb2YgdGhlCisgKiBmb2xsb3dpbmcgc3BlY2lhbCBjaGFyYWN0ZXJzOgorICogICAgICQgJSAnIGAgLSBAIHsgfSB+ICEgIyAoICkgJiBfIF4KKyAqIEluIHRoaXMgY2FzZSBMb25nZmlsZW5hbWUgaXMgbm90IHN0b3JlZCBpbiBkaXNrLgorICoKKyAqIFdpbk5UJ3MgRXh0ZW5zaW9uOgorICogRmlsZSBuYW1lIGFuZCBleHRlbnNpb24gbmFtZSBpcyBjb250YWluIHVwcGVyY2FzZS9sb3dlcmNhc2UKKyAqIG9ubHkuIEFuZCBpdCBpcyBleHByZXNzZWQgYnkgQ0FTRV9MT1dFUl9CQVNFIGFuZCBDQVNFX0xPV0VSX0VYVC4KKyAqCisgKiAyKSBGaWxlIG5hbWUgaXMgOC4zIGZvcm1hdCwgYnV0IGl0IGNvbnRhaW4gdGhlIHVwcGVyY2FzZSBhbmQKKyAqIGxvd2VyY2FzZSBjaGFyLCBtdWxpdGkgYnl0ZXMgY2hhciwgZXRjLiBJbiB0aGlzIGNhc2UgbnVtdGFpbCBpcyBub3QKKyAqIGFkZGVkLCBidXQgTG9uZ2ZpbGVuYW1lIGlzIHN0b3JlZC4KKyAqCisgKiAzKSBXaGVuIHRoZSBvbmUgZXhjZXB0IGZvciB0aGUgYWJvdmUsIG9yIHRoZSBmb2xsb3dpbmcgc3BlY2lhbAorICogY2hhcmFjdGVyIGFyZSBjb250YWluZWQ6CisgKiAgICAgICAgLiAgIFsgXSA7ICwgKyA9CisgKiBudW10YWlsIGlzIGFkZGVkLCBhbmQgTG9uZ2ZpbGVuYW1lIG11c3QgYmUgc3RvcmVkIGluIGRpc2sgLgorICovCitzdHJ1Y3Qgc2hvcnRuYW1lX2luZm8geworCXVuc2lnbmVkIGNoYXIgbG93ZXI6MSwKKwkJICAgICAgdXBwZXI6MSwKKwkJICAgICAgdmFsaWQ6MTsKK307CisjZGVmaW5lIElOSVRfU0hPUlROQU1FX0lORk8oeCkJZG8gewkJXAorCSh4KS0+bG93ZXIgPSAxOwkJCQlcCisJKHgpLT51cHBlciA9IDE7CQkJCVwKKwkoeCktPnZhbGlkID0gMTsJCQkJXAorfSB3aGlsZSAoMCkKKworc3RhdGljIGlubGluZSBpbnQgdG9fc2hvcnRuYW1lX2NoYXIoc3RydWN0IG5sc190YWJsZSAqbmxzLAorCQkJCSAgICB1bnNpZ25lZCBjaGFyICpidWYsIGludCBidWZfc2l6ZSwKKwkJCQkgICAgd2NoYXJfdCAqc3JjLCBzdHJ1Y3Qgc2hvcnRuYW1lX2luZm8gKmluZm8pCit7CisJaW50IGxlbjsKKworCWlmICh2ZmF0X3NraXBfY2hhcigqc3JjKSkgeworCQlpbmZvLT52YWxpZCA9IDA7CisJCXJldHVybiAwOworCX0KKwlpZiAodmZhdF9yZXBsYWNlX2NoYXIoKnNyYykpIHsKKwkJaW5mby0+dmFsaWQgPSAwOworCQlidWZbMF0gPSAnXyc7CisJCXJldHVybiAxOworCX0KKworCWxlbiA9IG5scy0+dW5pMmNoYXIoKnNyYywgYnVmLCBidWZfc2l6ZSk7CisJaWYgKGxlbiA8PSAwKSB7CisJCWluZm8tPnZhbGlkID0gMDsKKwkJYnVmWzBdID0gJ18nOworCQlsZW4gPSAxOworCX0gZWxzZSBpZiAobGVuID09IDEpIHsKKwkJdW5zaWduZWQgY2hhciBwcmV2ID0gYnVmWzBdOworCisJCWlmIChidWZbMF0gPj0gMHg3RikgeworCQkJaW5mby0+bG93ZXIgPSAwOworCQkJaW5mby0+dXBwZXIgPSAwOworCQl9CisKKwkJYnVmWzBdID0gbmxzX3RvdXBwZXIobmxzLCBidWZbMF0pOworCQlpZiAoaXNhbHBoYShidWZbMF0pKSB7CisJCQlpZiAoYnVmWzBdID09IHByZXYpCisJCQkJaW5mby0+bG93ZXIgPSAwOworCQkJZWxzZQorCQkJCWluZm8tPnVwcGVyID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCWluZm8tPmxvd2VyID0gMDsKKwkJaW5mby0+dXBwZXIgPSAwOworCX0KKworCXJldHVybiBsZW47Cit9CisKKy8qCisgKiBHaXZlbiBhIHZhbGlkIGxvbmduYW1lLCBjcmVhdGUgYSB1bmlxdWUgc2hvcnRuYW1lLiAgTWFrZSBzdXJlIHRoZQorICogc2hvcnRuYW1lIGRvZXMgbm90IGV4aXN0CisgKiBSZXR1cm5zIG5lZ2F0aXZlIG51bWJlciBvbiBlcnJvciwgMCBmb3IgYSBub3JtYWwKKyAqIHJldHVybiwgYW5kIDEgZm9yIHZhbGlkIHNob3J0bmFtZQorICovCitzdGF0aWMgaW50IHZmYXRfY3JlYXRlX3Nob3J0bmFtZShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IG5sc190YWJsZSAqbmxzLAorCQkJCSB3Y2hhcl90ICp1bmFtZSwgaW50IHVsZW4sCisJCQkJIHVuc2lnbmVkIGNoYXIgKm5hbWVfcmVzLCB1bnNpZ25lZCBjaGFyICpsY2FzZSkKK3sKKwlzdHJ1Y3QgZmF0X21vdW50X29wdGlvbnMgKm9wdHMgPSAmTVNET1NfU0IoZGlyLT5pX3NiKS0+b3B0aW9uczsKKwl3Y2hhcl90ICppcCwgKmV4dF9zdGFydCwgKmVuZCwgKm5hbWVfc3RhcnQ7CisJdW5zaWduZWQgY2hhciBiYXNlWzldLCBleHRbNF0sIGJ1Zls4XSwgKnA7CisJdW5zaWduZWQgY2hhciBjaGFyYnVmW05MU19NQVhfQ0hBUlNFVF9TSVpFXTsKKwlpbnQgY2hsLCBjaGk7CisJaW50IHN6ID0gMCwgZXh0bGVuLCBiYXNlbGVuLCBpLCBudW10YWlsX2Jhc2VsZW4sIG51bXRhaWwyX2Jhc2VsZW47CisJaW50IGlzX3Nob3J0bmFtZTsKKwlzdHJ1Y3Qgc2hvcnRuYW1lX2luZm8gYmFzZV9pbmZvLCBleHRfaW5mbzsKKworCWlzX3Nob3J0bmFtZSA9IDE7CisJSU5JVF9TSE9SVE5BTUVfSU5GTygmYmFzZV9pbmZvKTsKKwlJTklUX1NIT1JUTkFNRV9JTkZPKCZleHRfaW5mbyk7CisKKwkvKiBOb3csIHdlIG5lZWQgdG8gY3JlYXRlIGEgc2hvcnRuYW1lIGZyb20gdGhlIGxvbmcgbmFtZSAqLworCWV4dF9zdGFydCA9IGVuZCA9ICZ1bmFtZVt1bGVuXTsKKwl3aGlsZSAoLS1leHRfc3RhcnQgPj0gdW5hbWUpIHsKKwkJaWYgKCpleHRfc3RhcnQgPT0gMHgwMDJFKSB7CS8qIGlzIGAuJyAqLworCQkJaWYgKGV4dF9zdGFydCA9PSBlbmQgLSAxKSB7CisJCQkJc3ogPSB1bGVuOworCQkJCWV4dF9zdGFydCA9IE5VTEw7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChleHRfc3RhcnQgPT0gdW5hbWUgLSAxKSB7CisJCXN6ID0gdWxlbjsKKwkJZXh0X3N0YXJ0ID0gTlVMTDsKKwl9IGVsc2UgaWYgKGV4dF9zdGFydCkgeworCQkvKgorCQkgKiBOYW1lcyB3aGljaCBzdGFydCB3aXRoIGEgZG90IGNvdWxkIGJlIGp1c3QKKwkJICogYW4gZXh0ZW5zaW9uIGVnLiAiLi4udGVzdCIuICBJbiB0aGlzIGNhc2UgV2luOTUKKwkJICogdXNlcyB0aGUgZXh0ZW5zaW9uIGFzIHRoZSBuYW1lIGFuZCBzZXRzIG5vIGV4dGVuc2lvbi4KKwkJICovCisJCW5hbWVfc3RhcnQgPSAmdW5hbWVbMF07CisJCXdoaWxlIChuYW1lX3N0YXJ0IDwgZXh0X3N0YXJ0KSB7CisJCQlpZiAoIXZmYXRfc2tpcF9jaGFyKCpuYW1lX3N0YXJ0KSkKKwkJCQlicmVhazsKKwkJCW5hbWVfc3RhcnQrKzsKKwkJfQorCQlpZiAobmFtZV9zdGFydCAhPSBleHRfc3RhcnQpIHsKKwkJCXN6ID0gZXh0X3N0YXJ0IC0gdW5hbWU7CisJCQlleHRfc3RhcnQrKzsKKwkJfSBlbHNlIHsKKwkJCXN6ID0gdWxlbjsKKwkJCWV4dF9zdGFydCA9IE5VTEw7CisJCX0KKwl9CisKKwludW10YWlsX2Jhc2VsZW4gPSA2OworCW51bXRhaWwyX2Jhc2VsZW4gPSAyOworCWZvciAoYmFzZWxlbiA9IGkgPSAwLCBwID0gYmFzZSwgaXAgPSB1bmFtZTsgaSA8IHN6OyBpKyssIGlwKyspIHsKKwkJY2hsID0gdG9fc2hvcnRuYW1lX2NoYXIobmxzLCBjaGFyYnVmLCBzaXplb2YoY2hhcmJ1ZiksCisJCQkJCWlwLCAmYmFzZV9pbmZvKTsKKwkJaWYgKGNobCA9PSAwKQorCQkJY29udGludWU7CisKKwkJaWYgKGJhc2VsZW4gPCAyICYmIChiYXNlbGVuICsgY2hsKSA+IDIpCisJCQludW10YWlsMl9iYXNlbGVuID0gYmFzZWxlbjsKKwkJaWYgKGJhc2VsZW4gPCA2ICYmIChiYXNlbGVuICsgY2hsKSA+IDYpCisJCQludW10YWlsX2Jhc2VsZW4gPSBiYXNlbGVuOworCQlmb3IgKGNoaSA9IDA7IGNoaSA8IGNobDsgY2hpKyspIHsKKwkJCSpwKysgPSBjaGFyYnVmW2NoaV07CisJCQliYXNlbGVuKys7CisJCQlpZiAoYmFzZWxlbiA+PSA4KQorCQkJCWJyZWFrOworCQl9CisJCWlmIChiYXNlbGVuID49IDgpIHsKKwkJCWlmICgoY2hpIDwgY2hsIC0gMSkgfHwgKGlwICsgMSkgLSB1bmFtZSA8IHN6KQorCQkJCWlzX3Nob3J0bmFtZSA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoYmFzZWxlbiA9PSAwKSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWV4dGxlbiA9IDA7CisJaWYgKGV4dF9zdGFydCkgeworCQlmb3IgKHAgPSBleHQsIGlwID0gZXh0X3N0YXJ0OyBleHRsZW4gPCAzICYmIGlwIDwgZW5kOyBpcCsrKSB7CisJCQljaGwgPSB0b19zaG9ydG5hbWVfY2hhcihubHMsIGNoYXJidWYsIHNpemVvZihjaGFyYnVmKSwKKwkJCQkJCWlwLCAmZXh0X2luZm8pOworCQkJaWYgKGNobCA9PSAwKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoKGV4dGxlbiArIGNobCkgPiAzKSB7CisJCQkJaXNfc2hvcnRuYW1lID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWZvciAoY2hpID0gMDsgY2hpIDwgY2hsOyBjaGkrKykgeworCQkJCSpwKysgPSBjaGFyYnVmW2NoaV07CisJCQkJZXh0bGVuKys7CisJCQl9CisJCQlpZiAoZXh0bGVuID49IDMpIHsKKwkJCQlpZiAoaXAgKyAxICE9IGVuZCkKKwkJCQkJaXNfc2hvcnRuYW1lID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlleHRbZXh0bGVuXSA9ICdcMCc7CisJYmFzZVtiYXNlbGVuXSA9ICdcMCc7CisKKwkvKiBZZXMsIGl0IGNhbiBoYXBwZW4uICIuXHhlNSIgd291bGQgZG8gaXQuICovCisJaWYgKGJhc2VbMF0gPT0gREVMRVRFRF9GTEFHKQorCQliYXNlWzBdID0gMHgwNTsKKworCS8qIE9LLCBhdCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCBiYXNlIGlzIG5vdCBsb25nZXIgdGhhbiA4IHN5bWJvbHMsCisJICogZXh0IGlzIG5vdCBsb25nZXIgdGhhbiAzLCBiYXNlIGlzIG5vbmVtcHR5LCBib3RoIGRvbid0IGNvbnRhaW4KKwkgKiBhbnkgYmFkIHN5bWJvbHMgKGxvd2VyY2FzZSB0cmFuc2Zvcm1lZCB0byB1cHBlcmNhc2UpLgorCSAqLworCisJbWVtc2V0KG5hbWVfcmVzLCAnICcsIE1TRE9TX05BTUUpOworCW1lbWNweShuYW1lX3JlcywgYmFzZSwgYmFzZWxlbik7CisJbWVtY3B5KG5hbWVfcmVzICsgOCwgZXh0LCBleHRsZW4pOworCSpsY2FzZSA9IDA7CisJaWYgKGlzX3Nob3J0bmFtZSAmJiBiYXNlX2luZm8udmFsaWQgJiYgZXh0X2luZm8udmFsaWQpIHsKKwkJaWYgKHZmYXRfZmluZF9mb3JtKGRpciwgbmFtZV9yZXMpID09IDApCisJCQlyZXR1cm4gLUVFWElTVDsKKworCQlpZiAob3B0cy0+c2hvcnRuYW1lICYgVkZBVF9TRk5fQ1JFQVRFX1dJTjk1KSB7CisJCQlyZXR1cm4gKGJhc2VfaW5mby51cHBlciAmJiBleHRfaW5mby51cHBlcik7CisJCX0gZWxzZSBpZiAob3B0cy0+c2hvcnRuYW1lICYgVkZBVF9TRk5fQ1JFQVRFX1dJTk5UKSB7CisJCQlpZiAoKGJhc2VfaW5mby51cHBlciB8fCBiYXNlX2luZm8ubG93ZXIpICYmCisJCQkgICAgKGV4dF9pbmZvLnVwcGVyIHx8IGV4dF9pbmZvLmxvd2VyKSkgeworCQkJCWlmICghYmFzZV9pbmZvLnVwcGVyICYmIGJhc2VfaW5mby5sb3dlcikKKwkJCQkJKmxjYXNlIHw9IENBU0VfTE9XRVJfQkFTRTsKKwkJCQlpZiAoIWV4dF9pbmZvLnVwcGVyICYmIGV4dF9pbmZvLmxvd2VyKQorCQkJCQkqbGNhc2UgfD0gQ0FTRV9MT1dFUl9FWFQ7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCUJVRygpOworCQl9CisJfQorCisJaWYgKG9wdHMtPm51bXRhaWwgPT0gMCkKKwkJaWYgKHZmYXRfZmluZF9mb3JtKGRpciwgbmFtZV9yZXMpIDwgMCkKKwkJCXJldHVybiAwOworCisJLyoKKwkgKiBUcnkgdG8gZmluZCBhIHVuaXF1ZSBleHRlbnNpb24uICBUaGlzIHVzZWQgdG8KKwkgKiBpdGVyYXRlIHRocm91Z2ggYWxsIHBvc3NpYmlsaXRpZXMgc2VxdWVudGlhbGx5LAorCSAqIGJ1dCB0aGF0IGdhdmUgZXh0cmVtZWx5IGJhZCBwZXJmb3JtYW5jZS4gIFdpbmRvd3MKKwkgKiBvbmx5IHRyaWVzIGEgZmV3IGNhc2VzIGJlZm9yZSB1c2luZyByYW5kb20KKwkgKiB2YWx1ZXMgZm9yIHBhcnQgb2YgdGhlIGJhc2UuCisJICovCisKKwlpZiAoYmFzZWxlbiA+IDYpIHsKKwkJYmFzZWxlbiA9IG51bXRhaWxfYmFzZWxlbjsKKwkJbmFtZV9yZXNbN10gPSAnICc7CisJfQorCW5hbWVfcmVzW2Jhc2VsZW5dID0gJ34nOworCWZvciAoaSA9IDE7IGkgPCAxMDsgaSsrKSB7CisJCW5hbWVfcmVzW2Jhc2VsZW4gKyAxXSA9IGkgKyAnMCc7CisJCWlmICh2ZmF0X2ZpbmRfZm9ybShkaXIsIG5hbWVfcmVzKSA8IDApCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpID0gamlmZmllcyAmIDB4ZmZmZjsKKwlzeiA9IChqaWZmaWVzID4+IDE2KSAmIDB4NzsKKwlpZiAoYmFzZWxlbiA+IDIpIHsKKwkJYmFzZWxlbiA9IG51bXRhaWwyX2Jhc2VsZW47CisJCW5hbWVfcmVzWzddID0gJyAnOworCX0KKwluYW1lX3Jlc1tiYXNlbGVuICsgNF0gPSAnfic7CisJbmFtZV9yZXNbYmFzZWxlbiArIDVdID0gJzEnICsgc3o7CisJd2hpbGUgKDEpIHsKKwkJc3ByaW50ZihidWYsICIlMDRYIiwgaSk7CisJCW1lbWNweSgmbmFtZV9yZXNbYmFzZWxlbl0sIGJ1ZiwgNCk7CisJCWlmICh2ZmF0X2ZpbmRfZm9ybShkaXIsIG5hbWVfcmVzKSA8IDApCisJCQlicmVhazsKKwkJaSAtPSAxMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFRyYW5zbGF0ZSBhIHN0cmluZywgaW5jbHVkaW5nIGNvZGVkIHNlcXVlbmNlcyBpbnRvIFVuaWNvZGUgKi8KK3N0YXRpYyBpbnQKK3hsYXRlX3RvX3VuaShjb25zdCB1bnNpZ25lZCBjaGFyICpuYW1lLCBpbnQgbGVuLCB1bnNpZ25lZCBjaGFyICpvdXRuYW1lLAorCSAgICAgaW50ICpsb25nbGVuLCBpbnQgKm91dGxlbiwgaW50IGVzY2FwZSwgaW50IHV0ZjgsCisJICAgICBzdHJ1Y3QgbmxzX3RhYmxlICpubHMpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqaXA7CisJdW5zaWduZWQgY2hhciBuYzsKKwl1bnNpZ25lZCBjaGFyICpvcDsKKwl1bnNpZ25lZCBpbnQgZWM7CisJaW50IGksIGssIGZpbGw7CisJaW50IGNoYXJsZW47CisKKwlpZiAodXRmOCkgeworCQlpbnQgbmFtZV9sZW4gPSBzdHJsZW4obmFtZSk7CisKKwkJKm91dGxlbiA9IHV0ZjhfbWJzdG93Y3MoKHdjaGFyX3QgKilvdXRuYW1lLCBuYW1lLCBQQUdFX1NJWkUpOworCisJCS8qCisJCSAqIFdlIHN0cmlwcGVkICcuJ3MgYmVmb3JlIGFuZCBzZXQgbGVuIGFwcHJvcHJpYXRlbHksCisJCSAqIGJ1dCB1dGY4X21ic3Rvd2NzIGRvZXNuJ3QgY2FyZSBhYm91dCBsZW4KKwkJICovCisJCSpvdXRsZW4gLT0gKG5hbWVfbGVuIC0gbGVuKTsKKworCQlvcCA9ICZvdXRuYW1lWypvdXRsZW4gKiBzaXplb2Yod2NoYXJfdCldOworCX0gZWxzZSB7CisJCWlmIChubHMpIHsKKwkJCWZvciAoaSA9IDAsIGlwID0gbmFtZSwgb3AgPSBvdXRuYW1lLCAqb3V0bGVuID0gMDsKKwkJCSAgICAgaSA8IGxlbiAmJiAqb3V0bGVuIDw9IDI2MDsKKwkJCSAgICAgKm91dGxlbiArPSAxKQorCQkJeworCQkJCWlmIChlc2NhcGUgJiYgKCppcCA9PSAnOicpKSB7CisJCQkJCWlmIChpID4gbGVuIC0gNSkKKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQllYyA9IDA7CisJCQkJCWZvciAoayA9IDE7IGsgPCA1OyBrKyspIHsKKwkJCQkJCW5jID0gaXBba107CisJCQkJCQllYyA8PD0gNDsKKwkJCQkJCWlmIChuYyA+PSAnMCcgJiYgbmMgPD0gJzknKSB7CisJCQkJCQkJZWMgfD0gbmMgLSAnMCc7CisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisJCQkJCQlpZiAobmMgPj0gJ2EnICYmIG5jIDw9ICdmJykgeworCQkJCQkJCWVjIHw9IG5jIC0gKCdhJyAtIDEwKTsKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX0KKwkJCQkJCWlmIChuYyA+PSAnQScgJiYgbmMgPD0gJ0YnKSB7CisJCQkJCQkJZWMgfD0gbmMgLSAoJ0EnIC0gMTApOworCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJfQorCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJCX0KKwkJCQkJKm9wKysgPSBlYyAmIDB4RkY7CisJCQkJCSpvcCsrID0gZWMgPj4gODsKKwkJCQkJaXAgKz0gNTsKKwkJCQkJaSArPSA1OworCQkJCX0gZWxzZSB7CisJCQkJCWlmICgoY2hhcmxlbiA9IG5scy0+Y2hhcjJ1bmkoaXAsIGxlbiAtIGksICh3Y2hhcl90ICopb3ApKSA8IDApCisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkJaXAgKz0gY2hhcmxlbjsKKwkJCQkJaSArPSBjaGFybGVuOworCQkJCQlvcCArPSAyOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWZvciAoaSA9IDAsIGlwID0gbmFtZSwgb3AgPSBvdXRuYW1lLCAqb3V0bGVuID0gMDsKKwkJCSAgICAgaSA8IGxlbiAmJiAqb3V0bGVuIDw9IDI2MDsKKwkJCSAgICAgaSsrLCAqb3V0bGVuICs9IDEpCisJCQl7CisJCQkJKm9wKysgPSAqaXArKzsKKwkJCQkqb3ArKyA9IDA7CisJCQl9CisJCX0KKwl9CisJaWYgKCpvdXRsZW4gPiAyNjApCisJCXJldHVybiAtRU5BTUVUT09MT05HOworCisJKmxvbmdsZW4gPSAqb3V0bGVuOworCWlmICgqb3V0bGVuICUgMTMpIHsKKwkJKm9wKysgPSAwOworCQkqb3ArKyA9IDA7CisJCSpvdXRsZW4gKz0gMTsKKwkJaWYgKCpvdXRsZW4gJSAxMykgeworCQkJZmlsbCA9IDEzIC0gKCpvdXRsZW4gJSAxMyk7CisJCQlmb3IgKGkgPSAwOyBpIDwgZmlsbDsgaSsrKSB7CisJCQkJKm9wKysgPSAweGZmOworCQkJCSpvcCsrID0gMHhmZjsKKwkJCX0KKwkJCSpvdXRsZW4gKz0gZmlsbDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZmYXRfYnVpbGRfc2xvdHMoc3RydWN0IGlub2RlICpkaXIsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5hbWUsCisJCQkgICAgaW50IGxlbiwgaW50IGlzX2RpciwgaW50IGNsdXN0ZXIsCisJCQkgICAgc3RydWN0IHRpbWVzcGVjICp0cywKKwkJCSAgICBzdHJ1Y3QgbXNkb3NfZGlyX3Nsb3QgKnNsb3RzLCBpbnQgKm5yX3Nsb3RzKQoreworCXN0cnVjdCBtc2Rvc19zYl9pbmZvICpzYmkgPSBNU0RPU19TQihkaXItPmlfc2IpOworCXN0cnVjdCBmYXRfbW91bnRfb3B0aW9ucyAqb3B0cyA9ICZzYmktPm9wdGlvbnM7CisJc3RydWN0IG1zZG9zX2Rpcl9zbG90ICpwczsKKwlzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5ICpkZTsKKwl1bnNpZ25lZCBsb25nIHBhZ2U7CisJdW5zaWduZWQgY2hhciBja3N1bSwgbGNhc2U7CisJdW5zaWduZWQgY2hhciBtc2Rvc19uYW1lW01TRE9TX05BTUVdOworCXdjaGFyX3QgKnVuYW1lOworCV9fbGUxNiB0aW1lLCBkYXRlOworCWludCBlcnIsIHVsZW4sIHVzaXplLCBpOworCWxvZmZfdCBvZmZzZXQ7CisKKwkqbnJfc2xvdHMgPSAwOworCWVyciA9IHZmYXRfdmFsaWRfbG9uZ25hbWUobmFtZSwgbGVuKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcGFnZSA9IF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIXBhZ2UpCisJCXJldHVybiAtRU5PTUVNOworCisJdW5hbWUgPSAod2NoYXJfdCAqKXBhZ2U7CisJZXJyID0geGxhdGVfdG9fdW5pKG5hbWUsIGxlbiwgKHVuc2lnbmVkIGNoYXIgKil1bmFtZSwgJnVsZW4sICZ1c2l6ZSwKKwkJCSAgIG9wdHMtPnVuaWNvZGVfeGxhdGUsIG9wdHMtPnV0ZjgsIHNiaS0+bmxzX2lvKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mcmVlOworCisJZXJyID0gdmZhdF9pc191c2VkX2JhZGNoYXJzKHVuYW1lLCB1bGVuKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mcmVlOworCisJZXJyID0gdmZhdF9jcmVhdGVfc2hvcnRuYW1lKGRpciwgc2JpLT5ubHNfZGlzaywgdW5hbWUsIHVsZW4sCisJCQkJICAgIG1zZG9zX25hbWUsICZsY2FzZSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisJZWxzZSBpZiAoZXJyID09IDEpIHsKKwkJZGUgPSAoc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSAqKXNsb3RzOworCQllcnIgPSAwOworCQlnb3RvIHNob3J0bmFtZTsKKwl9CisKKwkvKiBidWlsZCB0aGUgZW50cnkgb2YgbG9uZyBmaWxlIG5hbWUgKi8KKwlmb3IgKGNrc3VtID0gaSA9IDA7IGkgPCAxMTsgaSsrKQorCQlja3N1bSA9ICgoKGNrc3VtJjEpPDw3KXwoKGNrc3VtJjB4ZmUpPj4xKSkgKyBtc2Rvc19uYW1lW2ldOworCisJKm5yX3Nsb3RzID0gdXNpemUgLyAxMzsKKwlmb3IgKHBzID0gc2xvdHMsIGkgPSAqbnJfc2xvdHM7IGkgPiAwOyBpLS0sIHBzKyspIHsKKwkJcHMtPmlkID0gaTsKKwkJcHMtPmF0dHIgPSBBVFRSX0VYVDsKKwkJcHMtPnJlc2VydmVkID0gMDsKKwkJcHMtPmFsaWFzX2NoZWNrc3VtID0gY2tzdW07CisJCXBzLT5zdGFydCA9IDA7CisJCW9mZnNldCA9IChpIC0gMSkgKiAxMzsKKwkJZmF0d2NoYXJfdG8xNihwcy0+bmFtZTBfNCwgdW5hbWUgKyBvZmZzZXQsIDUpOworCQlmYXR3Y2hhcl90bzE2KHBzLT5uYW1lNV8xMCwgdW5hbWUgKyBvZmZzZXQgKyA1LCA2KTsKKwkJZmF0d2NoYXJfdG8xNihwcy0+bmFtZTExXzEyLCB1bmFtZSArIG9mZnNldCArIDExLCAyKTsKKwl9CisJc2xvdHNbMF0uaWQgfD0gMHg0MDsKKwlkZSA9IChzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5ICopcHM7CisKK3Nob3J0bmFtZToKKwkvKiBidWlsZCB0aGUgZW50cnkgb2YgOC4zIGFsaWFzIG5hbWUgKi8KKwkoKm5yX3Nsb3RzKSsrOworCW1lbWNweShkZS0+bmFtZSwgbXNkb3NfbmFtZSwgTVNET1NfTkFNRSk7CisJZGUtPmF0dHIgPSBpc19kaXIgPyBBVFRSX0RJUiA6IEFUVFJfQVJDSDsKKwlkZS0+bGNhc2UgPSBsY2FzZTsKKwlmYXRfZGF0ZV91bml4MmRvcyh0cy0+dHZfc2VjLCAmdGltZSwgJmRhdGUpOworCWRlLT50aW1lID0gZGUtPmN0aW1lID0gdGltZTsKKwlkZS0+ZGF0ZSA9IGRlLT5jZGF0ZSA9IGRlLT5hZGF0ZSA9IGRhdGU7CisJZGUtPmN0aW1lX2NzID0gMDsKKwlkZS0+c3RhcnQgPSBjcHVfdG9fbGUxNihjbHVzdGVyKTsKKwlkZS0+c3RhcnRoaSA9IGNwdV90b19sZTE2KGNsdXN0ZXIgPj4gMTYpOworCWRlLT5zaXplID0gMDsKK291dF9mcmVlOgorCWZyZWVfcGFnZShwYWdlKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHZmYXRfYWRkX2VudHJ5KHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgcXN0ciAqcW5hbWUsIGludCBpc19kaXIsCisJCQkgIGludCBjbHVzdGVyLCBzdHJ1Y3QgdGltZXNwZWMgKnRzLAorCQkJICBzdHJ1Y3QgZmF0X3Nsb3RfaW5mbyAqc2luZm8pCit7CisJc3RydWN0IG1zZG9zX2Rpcl9zbG90ICpzbG90czsKKwl1bnNpZ25lZCBpbnQgbGVuOworCWludCBlcnIsIG5yX3Nsb3RzOworCisJbGVuID0gdmZhdF9zdHJpcHRhaWxfbGVuKHFuYW1lKTsKKwlpZiAobGVuID09IDApCisJCXJldHVybiAtRU5PRU5UOworCisJc2xvdHMgPSBrbWFsbG9jKHNpemVvZigqc2xvdHMpICogTVNET1NfU0xPVFMsIEdGUF9LRVJORUwpOworCWlmIChzbG90cyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVyciA9IHZmYXRfYnVpbGRfc2xvdHMoZGlyLCBxbmFtZS0+bmFtZSwgbGVuLCBpc19kaXIsIGNsdXN0ZXIsIHRzLAorCQkJICAgICAgIHNsb3RzLCAmbnJfc2xvdHMpOworCWlmIChlcnIpCisJCWdvdG8gY2xlYW51cDsKKworCWVyciA9IGZhdF9hZGRfZW50cmllcyhkaXIsIHNsb3RzLCBucl9zbG90cywgc2luZm8pOworCWlmIChlcnIpCisJCWdvdG8gY2xlYW51cDsKKworCS8qIHVwZGF0ZSB0aW1lc3RhbXAgKi8KKwlkaXItPmlfY3RpbWUgPSBkaXItPmlfbXRpbWUgPSBkaXItPmlfYXRpbWUgPSAqdHM7CisJaWYgKElTX0RJUlNZTkMoZGlyKSkKKwkJKHZvaWQpZmF0X3N5bmNfaW5vZGUoZGlyKTsKKwllbHNlCisJCW1hcmtfaW5vZGVfZGlydHkoZGlyKTsKK2NsZWFudXA6CisJa2ZyZWUoc2xvdHMpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdmZhdF9maW5kKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgcXN0ciAqcW5hbWUsCisJCSAgICAgc3RydWN0IGZhdF9zbG90X2luZm8gKnNpbmZvKQoreworCXVuc2lnbmVkIGludCBsZW4gPSB2ZmF0X3N0cmlwdGFpbF9sZW4ocW5hbWUpOworCWlmIChsZW4gPT0gMCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJcmV0dXJuIGZhdF9zZWFyY2hfbG9uZyhkaXIsIHFuYW1lLT5uYW1lLCBsZW4sIHNpbmZvKTsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKnZmYXRfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCisJCQkJICBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gZGlyLT5pX3NiOworCXN0cnVjdCBmYXRfc2xvdF9pbmZvIHNpbmZvOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBOVUxMOworCXN0cnVjdCBkZW50cnkgKmFsaWFzOworCWludCBlcnIsIHRhYmxlOworCisJbG9ja19rZXJuZWwoKTsKKwl0YWJsZSA9IChNU0RPU19TQihzYiktPm9wdGlvbnMubmFtZV9jaGVjayA9PSAncycpID8gMiA6IDA7CisJZGVudHJ5LT5kX29wID0gJnZmYXRfZGVudHJ5X29wc1t0YWJsZV07CisKKwllcnIgPSB2ZmF0X2ZpbmQoZGlyLCAmZGVudHJ5LT5kX25hbWUsICZzaW5mbyk7CisJaWYgKGVycikgeworCQl0YWJsZSsrOworCQlnb3RvIGVycm9yOworCX0KKwlpbm9kZSA9IGZhdF9idWlsZF9pbm9kZShzYiwgc2luZm8uZGUsIHNpbmZvLmlfcG9zKTsKKwlicmVsc2Uoc2luZm8uYmgpOworCWlmIChJU19FUlIoaW5vZGUpKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIEVSUl9QVFIoUFRSX0VSUihpbm9kZSkpOworCX0KKwlhbGlhcyA9IGRfZmluZF9hbGlhcyhpbm9kZSk7CisJaWYgKGFsaWFzKSB7CisJCWlmIChkX2ludmFsaWRhdGUoYWxpYXMpID09IDApCisJCQlkcHV0KGFsaWFzKTsKKwkJZWxzZSB7CisJCQlpcHV0KGlub2RlKTsKKwkJCXVubG9ja19rZXJuZWwoKTsKKwkJCXJldHVybiBhbGlhczsKKwkJfQorCisJfQorZXJyb3I6CisJdW5sb2NrX2tlcm5lbCgpOworCWRlbnRyeS0+ZF9vcCA9ICZ2ZmF0X2RlbnRyeV9vcHNbdGFibGVdOworCWRlbnRyeS0+ZF90aW1lID0gZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZS0+aV92ZXJzaW9uOworCWRlbnRyeSA9IGRfc3BsaWNlX2FsaWFzKGlub2RlLCBkZW50cnkpOworCWlmIChkZW50cnkpIHsKKwkJZGVudHJ5LT5kX29wID0gJnZmYXRfZGVudHJ5X29wc1t0YWJsZV07CisJCWRlbnRyeS0+ZF90aW1lID0gZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZS0+aV92ZXJzaW9uOworCX0KKwlyZXR1cm4gZGVudHJ5OworfQorCitzdGF0aWMgaW50IHZmYXRfY3JlYXRlKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGludCBtb2RlLAorCQkgICAgICAgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRpci0+aV9zYjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBmYXRfc2xvdF9pbmZvIHNpbmZvOworCXN0cnVjdCB0aW1lc3BlYyB0czsKKwlpbnQgZXJyOworCisJbG9ja19rZXJuZWwoKTsKKworCXRzID0gQ1VSUkVOVF9USU1FX1NFQzsKKwllcnIgPSB2ZmF0X2FkZF9lbnRyeShkaXIsICZkZW50cnktPmRfbmFtZSwgMCwgMCwgJnRzLCAmc2luZm8pOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWRpci0+aV92ZXJzaW9uKys7CisKKwlpbm9kZSA9IGZhdF9idWlsZF9pbm9kZShzYiwgc2luZm8uZGUsIHNpbmZvLmlfcG9zKTsKKwlicmVsc2Uoc2luZm8uYmgpOworCWlmIChJU19FUlIoaW5vZGUpKSB7CisJCWVyciA9IFBUUl9FUlIoaW5vZGUpOworCQlnb3RvIG91dDsKKwl9CisJaW5vZGUtPmlfdmVyc2lvbisrOworCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IHRzOworCS8qIHRpbWVzdGFtcCBpcyBhbHJlYWR5IHdyaXR0ZW4sIHNvIG1hcmtfaW5vZGVfZGlydHkoKSBpcyB1bm5lZWRlZC4gKi8KKworCWRlbnRyeS0+ZF90aW1lID0gZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZS0+aV92ZXJzaW9uOworCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdmZhdF9ybWRpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJc3RydWN0IGZhdF9zbG90X2luZm8gc2luZm87CisJaW50IGVycjsKKworCWxvY2tfa2VybmVsKCk7CisKKwllcnIgPSBmYXRfZGlyX2VtcHR5KGlub2RlKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwllcnIgPSB2ZmF0X2ZpbmQoZGlyLCAmZGVudHJ5LT5kX25hbWUsICZzaW5mbyk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwllcnIgPSBmYXRfcmVtb3ZlX2VudHJpZXMoZGlyLCAmc2luZm8pOwkvKiBhbmQgcmVsZWFzZXMgYmggKi8KKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwlkaXItPmlfbmxpbmstLTsKKworCWlub2RlLT5pX25saW5rID0gMDsKKwlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2F0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlmYXRfZGV0YWNoKGlub2RlKTsKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHZmYXRfdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgZmF0X3Nsb3RfaW5mbyBzaW5mbzsKKwlpbnQgZXJyOworCisJbG9ja19rZXJuZWwoKTsKKworCWVyciA9IHZmYXRfZmluZChkaXIsICZkZW50cnktPmRfbmFtZSwgJnNpbmZvKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWVyciA9IGZhdF9yZW1vdmVfZW50cmllcyhkaXIsICZzaW5mbyk7CS8qIGFuZCByZWxlYXNlcyBiaCAqLworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCWlub2RlLT5pX25saW5rID0gMDsKKwlpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2F0aW1lID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlmYXRfZGV0YWNoKGlub2RlKTsKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHZmYXRfbWtkaXIoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgaW50IG1vZGUpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRpci0+aV9zYjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBmYXRfc2xvdF9pbmZvIHNpbmZvOworCXN0cnVjdCB0aW1lc3BlYyB0czsKKwlpbnQgZXJyLCBjbHVzdGVyOworCisJbG9ja19rZXJuZWwoKTsKKworCXRzID0gQ1VSUkVOVF9USU1FX1NFQzsKKwljbHVzdGVyID0gZmF0X2FsbG9jX25ld19kaXIoZGlyLCAmdHMpOworCWlmIChjbHVzdGVyIDwgMCkgeworCQllcnIgPSBjbHVzdGVyOworCQlnb3RvIG91dDsKKwl9CisJZXJyID0gdmZhdF9hZGRfZW50cnkoZGlyLCAmZGVudHJ5LT5kX25hbWUsIDEsIGNsdXN0ZXIsICZ0cywgJnNpbmZvKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mcmVlOworCWRpci0+aV92ZXJzaW9uKys7CisJZGlyLT5pX25saW5rKys7CisKKwlpbm9kZSA9IGZhdF9idWlsZF9pbm9kZShzYiwgc2luZm8uZGUsIHNpbmZvLmlfcG9zKTsKKwlicmVsc2Uoc2luZm8uYmgpOworCWlmIChJU19FUlIoaW5vZGUpKSB7CisJCWVyciA9IFBUUl9FUlIoaW5vZGUpOworCQkvKiB0aGUgZGlyZWN0b3J5IHdhcyBjb21wbGV0ZWQsIGp1c3QgcmV0dXJuIGEgZXJyb3IgKi8KKwkJZ290byBvdXQ7CisJfQorCWlub2RlLT5pX3ZlcnNpb24rKzsKKwlpbm9kZS0+aV9ubGluayA9IDI7CisJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX2N0aW1lID0gdHM7CisJLyogdGltZXN0YW1wIGlzIGFscmVhZHkgd3JpdHRlbiwgc28gbWFya19pbm9kZV9kaXJ0eSgpIGlzIHVubmVlZGVkLiAqLworCisJZGVudHJ5LT5kX3RpbWUgPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlLT5pX3ZlcnNpb247CisJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKKworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKKworb3V0X2ZyZWU6CisJZmF0X2ZyZWVfY2x1c3RlcnMoZGlyLCBjbHVzdGVyKTsKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB2ZmF0X3JlbmFtZShzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsIHN0cnVjdCBkZW50cnkgKm9sZF9kZW50cnksCisJCSAgICAgICBzdHJ1Y3QgaW5vZGUgKm5ld19kaXIsIHN0cnVjdCBkZW50cnkgKm5ld19kZW50cnkpCit7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpkb3Rkb3RfYmg7CisJc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSAqZG90ZG90X2RlOworCWxvZmZfdCBkb3Rkb3RfaV9wb3M7CisJc3RydWN0IGlub2RlICpvbGRfaW5vZGUsICpuZXdfaW5vZGU7CisJc3RydWN0IGZhdF9zbG90X2luZm8gb2xkX3NpbmZvLCBzaW5mbzsKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7CisJaW50IGVyciwgaXNfZGlyLCB1cGRhdGVfZG90ZG90LCBjb3JydXB0ID0gMDsKKworCW9sZF9zaW5mby5iaCA9IHNpbmZvLmJoID0gZG90ZG90X2JoID0gTlVMTDsKKwlvbGRfaW5vZGUgPSBvbGRfZGVudHJ5LT5kX2lub2RlOworCW5ld19pbm9kZSA9IG5ld19kZW50cnktPmRfaW5vZGU7CisJbG9ja19rZXJuZWwoKTsKKwllcnIgPSB2ZmF0X2ZpbmQob2xkX2RpciwgJm9sZF9kZW50cnktPmRfbmFtZSwgJm9sZF9zaW5mbyk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlpc19kaXIgPSBTX0lTRElSKG9sZF9pbm9kZS0+aV9tb2RlKTsKKwl1cGRhdGVfZG90ZG90ID0gKGlzX2RpciAmJiBvbGRfZGlyICE9IG5ld19kaXIpOworCWlmICh1cGRhdGVfZG90ZG90KSB7CisJCWlmIChmYXRfZ2V0X2RvdGRvdF9lbnRyeShvbGRfaW5vZGUsICZkb3Rkb3RfYmgsICZkb3Rkb3RfZGUsCisJCQkJCSAmZG90ZG90X2lfcG9zKSA8IDApIHsKKwkJCWVyciA9IC1FSU87CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCXRzID0gQ1VSUkVOVF9USU1FX1NFQzsKKwlpZiAobmV3X2lub2RlKSB7CisJCWVyciA9IHZmYXRfZmluZChuZXdfZGlyLCAmbmV3X2RlbnRyeS0+ZF9uYW1lLCAmc2luZm8pOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJCWlmIChNU0RPU19JKG5ld19pbm9kZSktPmlfcG9zICE9IHNpbmZvLmlfcG9zKSB7CisJCQkvKiBXVEY/Pz8gQ3J5IGFuZCBmYWlsLiAqLworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAidmZhdF9yZW5hbWU6IGZzIGNvcnJ1cHRlZFxuIik7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChpc19kaXIpIHsKKwkJCWVyciA9IGZhdF9kaXJfZW1wdHkobmV3X2lub2RlKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBvdXQ7CisJCX0KKwkJZmF0X2RldGFjaChuZXdfaW5vZGUpOworCX0gZWxzZSB7CisJCWVyciA9IHZmYXRfYWRkX2VudHJ5KG5ld19kaXIsICZuZXdfZGVudHJ5LT5kX25hbWUsIGlzX2RpciwgMCwKKwkJCQkgICAgICZ0cywgJnNpbmZvKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCX0KKwluZXdfZGlyLT5pX3ZlcnNpb24rKzsKKworCWZhdF9kZXRhY2gob2xkX2lub2RlKTsKKwlmYXRfYXR0YWNoKG9sZF9pbm9kZSwgc2luZm8uaV9wb3MpOworCWlmIChJU19ESVJTWU5DKG5ld19kaXIpKSB7CisJCWVyciA9IGZhdF9zeW5jX2lub2RlKG9sZF9pbm9kZSk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycm9yX2lub2RlOworCX0gZWxzZQorCQltYXJrX2lub2RlX2RpcnR5KG9sZF9pbm9kZSk7CisKKwlpZiAodXBkYXRlX2RvdGRvdCkgeworCQlpbnQgc3RhcnQgPSBNU0RPU19JKG5ld19kaXIpLT5pX2xvZ3N0YXJ0OworCQlkb3Rkb3RfZGUtPnN0YXJ0ID0gY3B1X3RvX2xlMTYoc3RhcnQpOworCQlkb3Rkb3RfZGUtPnN0YXJ0aGkgPSBjcHVfdG9fbGUxNihzdGFydCA+PiAxNik7CisJCW1hcmtfYnVmZmVyX2RpcnR5KGRvdGRvdF9iaCk7CisJCWlmIChJU19ESVJTWU5DKG5ld19kaXIpKSB7CisJCQllcnIgPSBzeW5jX2RpcnR5X2J1ZmZlcihkb3Rkb3RfYmgpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIGVycm9yX2RvdGRvdDsKKwkJfQorCQlvbGRfZGlyLT5pX25saW5rLS07CisJCWlmICghbmV3X2lub2RlKQorIAkJCW5ld19kaXItPmlfbmxpbmsrKzsKKwl9CisKKwllcnIgPSBmYXRfcmVtb3ZlX2VudHJpZXMob2xkX2RpciwgJm9sZF9zaW5mbyk7CS8qIGFuZCByZWxlYXNlcyBiaCAqLworCW9sZF9zaW5mby5iaCA9IE5VTEw7CisJaWYgKGVycikKKwkJZ290byBlcnJvcl9kb3Rkb3Q7CisJb2xkX2Rpci0+aV92ZXJzaW9uKys7CisJb2xkX2Rpci0+aV9jdGltZSA9IG9sZF9kaXItPmlfbXRpbWUgPSB0czsKKwlpZiAoSVNfRElSU1lOQyhvbGRfZGlyKSkKKwkJKHZvaWQpZmF0X3N5bmNfaW5vZGUob2xkX2Rpcik7CisJZWxzZQorCQltYXJrX2lub2RlX2RpcnR5KG9sZF9kaXIpOworCisJaWYgKG5ld19pbm9kZSkgeworCQlpZiAoaXNfZGlyKQorCQkJbmV3X2lub2RlLT5pX25saW5rIC09IDI7CisJCWVsc2UKKwkJCW5ld19pbm9kZS0+aV9ubGluay0tOworCQluZXdfaW5vZGUtPmlfY3RpbWUgPSB0czsKKwl9CitvdXQ6CisJYnJlbHNlKHNpbmZvLmJoKTsKKwlicmVsc2UoZG90ZG90X2JoKTsKKwlicmVsc2Uob2xkX3NpbmZvLmJoKTsKKwl1bmxvY2tfa2VybmVsKCk7CisKKwlyZXR1cm4gZXJyOworCitlcnJvcl9kb3Rkb3Q6CisJLyogZGF0YSBjbHVzdGVyIGlzIHNoYXJlZCwgc2VyaW91cyBjb3JydXB0aW9uICovCisJY29ycnVwdCA9IDE7CisKKwlpZiAodXBkYXRlX2RvdGRvdCkgeworCQlpbnQgc3RhcnQgPSBNU0RPU19JKG9sZF9kaXIpLT5pX2xvZ3N0YXJ0OworCQlkb3Rkb3RfZGUtPnN0YXJ0ID0gY3B1X3RvX2xlMTYoc3RhcnQpOworCQlkb3Rkb3RfZGUtPnN0YXJ0aGkgPSBjcHVfdG9fbGUxNihzdGFydCA+PiAxNik7CisJCW1hcmtfYnVmZmVyX2RpcnR5KGRvdGRvdF9iaCk7CisJCWNvcnJ1cHQgfD0gc3luY19kaXJ0eV9idWZmZXIoZG90ZG90X2JoKTsKKwl9CitlcnJvcl9pbm9kZToKKwlmYXRfZGV0YWNoKG9sZF9pbm9kZSk7CisJZmF0X2F0dGFjaChvbGRfaW5vZGUsIG9sZF9zaW5mby5pX3Bvcyk7CisJaWYgKG5ld19pbm9kZSkgeworCQlmYXRfYXR0YWNoKG5ld19pbm9kZSwgc2luZm8uaV9wb3MpOworCQlpZiAoY29ycnVwdCkKKwkJCWNvcnJ1cHQgfD0gZmF0X3N5bmNfaW5vZGUobmV3X2lub2RlKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBJZiBuZXcgZW50cnkgd2FzIG5vdCBzaGFyaW5nIHRoZSBkYXRhIGNsdXN0ZXIsIGl0CisJCSAqIHNob3VsZG4ndCBiZSBzZXJpb3VzIGNvcnJ1cHRpb24uCisJCSAqLworCQlpbnQgZXJyMiA9IGZhdF9yZW1vdmVfZW50cmllcyhuZXdfZGlyLCAmc2luZm8pOworCQlpZiAoY29ycnVwdCkKKwkJCWNvcnJ1cHQgfD0gZXJyMjsKKwkJc2luZm8uYmggPSBOVUxMOworCX0KKwlpZiAoY29ycnVwdCA8IDApIHsKKwkJZmF0X2ZzX3BhbmljKG5ld19kaXItPmlfc2IsCisJCQkgICAgICIlczogRmlsZXN5c3RlbSBjb3JydXB0ZWQgKGlfcG9zICVsbGQpIiwKKwkJCSAgICAgX19GVU5DVElPTl9fLCBzaW5mby5pX3Bvcyk7CisJfQorCWdvdG8gb3V0OworfQorCitzdGF0aWMgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdmZhdF9kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkuY3JlYXRlCQk9IHZmYXRfY3JlYXRlLAorCS5sb29rdXAJCT0gdmZhdF9sb29rdXAsCisJLnVubGluawkJPSB2ZmF0X3VubGluaywKKwkubWtkaXIJCT0gdmZhdF9ta2RpciwKKwkucm1kaXIJCT0gdmZhdF9ybWRpciwKKwkucmVuYW1lCQk9IHZmYXRfcmVuYW1lLAorCS5zZXRhdHRyCT0gZmF0X25vdGlmeV9jaGFuZ2UsCit9OworCitzdGF0aWMgaW50IHZmYXRfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQoreworCWludCByZXM7CisKKwlyZXMgPSBmYXRfZmlsbF9zdXBlcihzYiwgZGF0YSwgc2lsZW50LCAmdmZhdF9kaXJfaW5vZGVfb3BlcmF0aW9ucywgMSk7CisJaWYgKHJlcykKKwkJcmV0dXJuIHJlczsKKworCWlmIChNU0RPU19TQihzYiktPm9wdGlvbnMubmFtZV9jaGVjayAhPSAncycpCisJCXNiLT5zX3Jvb3QtPmRfb3AgPSAmdmZhdF9kZW50cnlfb3BzWzBdOworCWVsc2UKKwkJc2ItPnNfcm9vdC0+ZF9vcCA9ICZ2ZmF0X2RlbnRyeV9vcHNbMl07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzdXBlcl9ibG9jayAqdmZhdF9nZXRfc2Ioc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCQkJICAgICAgIGludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsCisJCQkJICAgICAgIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIGdldF9zYl9iZGV2KGZzX3R5cGUsIGZsYWdzLCBkZXZfbmFtZSwgZGF0YSwgdmZhdF9maWxsX3N1cGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHZmYXRfZnNfdHlwZSA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLm5hbWUJCT0gInZmYXQiLAorCS5nZXRfc2IJCT0gdmZhdF9nZXRfc2IsCisJLmtpbGxfc2IJPSBraWxsX2Jsb2NrX3N1cGVyLAorCS5mc19mbGFncwk9IEZTX1JFUVVJUkVTX0RFViwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfdmZhdF9mcyh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9maWxlc3lzdGVtKCZ2ZmF0X2ZzX3R5cGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF92ZmF0X2ZzKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZ2ZmF0X2ZzX3R5cGUpOworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlZGQVQgZmlsZXN5c3RlbSBzdXBwb3J0Iik7CitNT0RVTEVfQVVUSE9SKCJHb3Jkb24gQ2hhZmZlZSIpOworCittb2R1bGVfaW5pdChpbml0X3ZmYXRfZnMpCittb2R1bGVfZXhpdChleGl0X3ZmYXRfZnMpCmRpZmYgLS1naXQgYS9mcy94YXR0ci5jIGIvZnMveGF0dHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2RlZTcwCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGF0dHIuYwpAQCAtMCwwICsxLDQ4MCBAQAorLyoKKyAgRmlsZTogZnMveGF0dHIuYworCisgIEV4dGVuZGVkIGF0dHJpYnV0ZSBoYW5kbGluZy4KKworICBDb3B5cmlnaHQgKEMpIDIwMDEgYnkgQW5kcmVhcyBHcnVlbmJhY2hlciA8YS5ncnVlbmJhY2hlckBjb21wdXRlci5vcmc+CisgIENvcHlyaWdodCAoQykgMjAwMSBTR0kgLSBTaWxpY29uIEdyYXBoaWNzLCBJbmMgPGxpbnV4LXhmc0Bvc3Muc2dpLmNvbT4KKyAgQ29weXJpZ2h0IChjKSAyMDA0IFJlZCBIYXQsIEluYy4sIEphbWVzIE1vcnJpcyA8am1vcnJpc0ByZWRoYXQuY29tPgorICovCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgveGF0dHIuaD4KKyNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisvKgorICogRXh0ZW5kZWQgYXR0cmlidXRlIFNFVCBvcGVyYXRpb25zCisgKi8KK3N0YXRpYyBsb25nCitzZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkLCBjaGFyIF9fdXNlciAqbmFtZSwgdm9pZCBfX3VzZXIgKnZhbHVlLAorCSBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCWludCBlcnJvcjsKKwl2b2lkICprdmFsdWUgPSBOVUxMOworCWNoYXIga25hbWVbWEFUVFJfTkFNRV9NQVggKyAxXTsKKworCWlmIChmbGFncyAmIH4oWEFUVFJfQ1JFQVRFfFhBVFRSX1JFUExBQ0UpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVycm9yID0gc3RybmNweV9mcm9tX3VzZXIoa25hbWUsIG5hbWUsIHNpemVvZihrbmFtZSkpOworCWlmIChlcnJvciA9PSAwIHx8IGVycm9yID09IHNpemVvZihrbmFtZSkpCisJCWVycm9yID0gLUVSQU5HRTsKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CisKKwlpZiAoc2l6ZSkgeworCQlpZiAoc2l6ZSA+IFhBVFRSX1NJWkVfTUFYKQorCQkJcmV0dXJuIC1FMkJJRzsKKwkJa3ZhbHVlID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFrdmFsdWUpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGt2YWx1ZSwgdmFsdWUsIHNpemUpKSB7CisJCQlrZnJlZShrdmFsdWUpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9CisKKwllcnJvciA9IC1FT1BOT1RTVVBQOworCWlmIChkLT5kX2lub2RlLT5pX29wICYmIGQtPmRfaW5vZGUtPmlfb3AtPnNldHhhdHRyKSB7CisJCWRvd24oJmQtPmRfaW5vZGUtPmlfc2VtKTsKKwkJZXJyb3IgPSBzZWN1cml0eV9pbm9kZV9zZXR4YXR0cihkLCBrbmFtZSwga3ZhbHVlLCBzaXplLCBmbGFncyk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gb3V0OworCQllcnJvciA9IGQtPmRfaW5vZGUtPmlfb3AtPnNldHhhdHRyKGQsIGtuYW1lLCBrdmFsdWUsIHNpemUsIGZsYWdzKTsKKwkJaWYgKCFlcnJvcikKKwkJCXNlY3VyaXR5X2lub2RlX3Bvc3Rfc2V0eGF0dHIoZCwga25hbWUsIGt2YWx1ZSwgc2l6ZSwgZmxhZ3MpOworb3V0OgorCQl1cCgmZC0+ZF9pbm9kZS0+aV9zZW0pOworCX0KKwlpZiAoa3ZhbHVlKQorCQlrZnJlZShrdmFsdWUpOworCXJldHVybiBlcnJvcjsKK30KKworYXNtbGlua2FnZSBsb25nCitzeXNfc2V0eGF0dHIoY2hhciBfX3VzZXIgKnBhdGgsIGNoYXIgX191c2VyICpuYW1lLCB2b2lkIF9fdXNlciAqdmFsdWUsCisJICAgICBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCXN0cnVjdCBuYW1laWRhdGEgbmQ7CisJaW50IGVycm9yOworCisJZXJyb3IgPSB1c2VyX3BhdGhfd2FsayhwYXRoLCAmbmQpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCWVycm9yID0gc2V0eGF0dHIobmQuZGVudHJ5LCBuYW1lLCB2YWx1ZSwgc2l6ZSwgZmxhZ3MpOworCXBhdGhfcmVsZWFzZSgmbmQpOworCXJldHVybiBlcnJvcjsKK30KKworYXNtbGlua2FnZSBsb25nCitzeXNfbHNldHhhdHRyKGNoYXIgX191c2VyICpwYXRoLCBjaGFyIF9fdXNlciAqbmFtZSwgdm9pZCBfX3VzZXIgKnZhbHVlLAorCSAgICAgIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IHVzZXJfcGF0aF93YWxrX2xpbmsocGF0aCwgJm5kKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwllcnJvciA9IHNldHhhdHRyKG5kLmRlbnRyeSwgbmFtZSwgdmFsdWUsIHNpemUsIGZsYWdzKTsKKwlwYXRoX3JlbGVhc2UoJm5kKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2FzbWxpbmthZ2UgbG9uZworc3lzX2ZzZXR4YXR0cihpbnQgZmQsIGNoYXIgX191c2VyICpuYW1lLCB2b2lkIF9fdXNlciAqdmFsdWUsCisJICAgICAgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgZmlsZSAqZjsKKwlpbnQgZXJyb3IgPSAtRUJBREY7CisKKwlmID0gZmdldChmZCk7CisJaWYgKCFmKQorCQlyZXR1cm4gZXJyb3I7CisJZXJyb3IgPSBzZXR4YXR0cihmLT5mX2RlbnRyeSwgbmFtZSwgdmFsdWUsIHNpemUsIGZsYWdzKTsKKwlmcHV0KGYpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIEV4dGVuZGVkIGF0dHJpYnV0ZSBHRVQgb3BlcmF0aW9ucworICovCitzdGF0aWMgc3NpemVfdAorZ2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqZCwgY2hhciBfX3VzZXIgKm5hbWUsIHZvaWQgX191c2VyICp2YWx1ZSwgc2l6ZV90IHNpemUpCit7CisJc3NpemVfdCBlcnJvcjsKKwl2b2lkICprdmFsdWUgPSBOVUxMOworCWNoYXIga25hbWVbWEFUVFJfTkFNRV9NQVggKyAxXTsKKworCWVycm9yID0gc3RybmNweV9mcm9tX3VzZXIoa25hbWUsIG5hbWUsIHNpemVvZihrbmFtZSkpOworCWlmIChlcnJvciA9PSAwIHx8IGVycm9yID09IHNpemVvZihrbmFtZSkpCisJCWVycm9yID0gLUVSQU5HRTsKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CisKKwlpZiAoc2l6ZSkgeworCQlpZiAoc2l6ZSA+IFhBVFRSX1NJWkVfTUFYKQorCQkJc2l6ZSA9IFhBVFRSX1NJWkVfTUFYOworCQlrdmFsdWUgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIWt2YWx1ZSkKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKworCWVycm9yID0gLUVPUE5PVFNVUFA7CisJaWYgKGQtPmRfaW5vZGUtPmlfb3AgJiYgZC0+ZF9pbm9kZS0+aV9vcC0+Z2V0eGF0dHIpIHsKKwkJZXJyb3IgPSBzZWN1cml0eV9pbm9kZV9nZXR4YXR0cihkLCBrbmFtZSk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gb3V0OworCQllcnJvciA9IGQtPmRfaW5vZGUtPmlfb3AtPmdldHhhdHRyKGQsIGtuYW1lLCBrdmFsdWUsIHNpemUpOworCQlpZiAoZXJyb3IgPiAwKSB7CisJCQlpZiAoc2l6ZSAmJiBjb3B5X3RvX3VzZXIodmFsdWUsIGt2YWx1ZSwgZXJyb3IpKQorCQkJCWVycm9yID0gLUVGQVVMVDsKKwkJfSBlbHNlIGlmIChlcnJvciA9PSAtRVJBTkdFICYmIHNpemUgPj0gWEFUVFJfU0laRV9NQVgpIHsKKwkJCS8qIFRoZSBmaWxlIHN5c3RlbSB0cmllZCB0byByZXR1cm5lZCBhIHZhbHVlIGJpZ2dlcgorCQkJICAgdGhhbiBYQVRUUl9TSVpFX01BWCBieXRlcy4gTm90IHBvc3NpYmxlLiAqLworCQkJZXJyb3IgPSAtRTJCSUc7CisJCX0KKwl9CitvdXQ6CisJaWYgKGt2YWx1ZSkKKwkJa2ZyZWUoa3ZhbHVlKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2FzbWxpbmthZ2Ugc3NpemVfdAorc3lzX2dldHhhdHRyKGNoYXIgX191c2VyICpwYXRoLCBjaGFyIF9fdXNlciAqbmFtZSwgdm9pZCBfX3VzZXIgKnZhbHVlLAorCSAgICAgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlzc2l6ZV90IGVycm9yOworCisJZXJyb3IgPSB1c2VyX3BhdGhfd2FsayhwYXRoLCAmbmQpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCWVycm9yID0gZ2V0eGF0dHIobmQuZGVudHJ5LCBuYW1lLCB2YWx1ZSwgc2l6ZSk7CisJcGF0aF9yZWxlYXNlKCZuZCk7CisJcmV0dXJuIGVycm9yOworfQorCithc21saW5rYWdlIHNzaXplX3QKK3N5c19sZ2V0eGF0dHIoY2hhciBfX3VzZXIgKnBhdGgsIGNoYXIgX191c2VyICpuYW1lLCB2b2lkIF9fdXNlciAqdmFsdWUsCisJICAgICAgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlzc2l6ZV90IGVycm9yOworCisJZXJyb3IgPSB1c2VyX3BhdGhfd2Fsa19saW5rKHBhdGgsICZuZCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJZXJyb3IgPSBnZXR4YXR0cihuZC5kZW50cnksIG5hbWUsIHZhbHVlLCBzaXplKTsKKwlwYXRoX3JlbGVhc2UoJm5kKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2FzbWxpbmthZ2Ugc3NpemVfdAorc3lzX2ZnZXR4YXR0cihpbnQgZmQsIGNoYXIgX191c2VyICpuYW1lLCB2b2lkIF9fdXNlciAqdmFsdWUsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBmaWxlICpmOworCXNzaXplX3QgZXJyb3IgPSAtRUJBREY7CisKKwlmID0gZmdldChmZCk7CisJaWYgKCFmKQorCQlyZXR1cm4gZXJyb3I7CisJZXJyb3IgPSBnZXR4YXR0cihmLT5mX2RlbnRyeSwgbmFtZSwgdmFsdWUsIHNpemUpOworCWZwdXQoZik7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogRXh0ZW5kZWQgYXR0cmlidXRlIExJU1Qgb3BlcmF0aW9ucworICovCitzdGF0aWMgc3NpemVfdAorbGlzdHhhdHRyKHN0cnVjdCBkZW50cnkgKmQsIGNoYXIgX191c2VyICpsaXN0LCBzaXplX3Qgc2l6ZSkKK3sKKwlzc2l6ZV90IGVycm9yOworCWNoYXIgKmtsaXN0ID0gTlVMTDsKKworCWlmIChzaXplKSB7CisJCWlmIChzaXplID4gWEFUVFJfTElTVF9NQVgpCisJCQlzaXplID0gWEFUVFJfTElTVF9NQVg7CisJCWtsaXN0ID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFrbGlzdCkKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKworCWVycm9yID0gLUVPUE5PVFNVUFA7CisJaWYgKGQtPmRfaW5vZGUtPmlfb3AgJiYgZC0+ZF9pbm9kZS0+aV9vcC0+bGlzdHhhdHRyKSB7CisJCWVycm9yID0gc2VjdXJpdHlfaW5vZGVfbGlzdHhhdHRyKGQpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dDsKKwkJZXJyb3IgPSBkLT5kX2lub2RlLT5pX29wLT5saXN0eGF0dHIoZCwga2xpc3QsIHNpemUpOworCQlpZiAoZXJyb3IgPiAwKSB7CisJCQlpZiAoc2l6ZSAmJiBjb3B5X3RvX3VzZXIobGlzdCwga2xpc3QsIGVycm9yKSkKKwkJCQllcnJvciA9IC1FRkFVTFQ7CisJCX0gZWxzZSBpZiAoZXJyb3IgPT0gLUVSQU5HRSAmJiBzaXplID49IFhBVFRSX0xJU1RfTUFYKSB7CisJCQkvKiBUaGUgZmlsZSBzeXN0ZW0gdHJpZWQgdG8gcmV0dXJuZWQgYSBsaXN0IGJpZ2dlcgorCQkJICAgdGhhbiBYQVRUUl9MSVNUX01BWCBieXRlcy4gTm90IHBvc3NpYmxlLiAqLworCQkJZXJyb3IgPSAtRTJCSUc7CisJCX0KKwl9CitvdXQ6CisJaWYgKGtsaXN0KQorCQlrZnJlZShrbGlzdCk7CisJcmV0dXJuIGVycm9yOworfQorCithc21saW5rYWdlIHNzaXplX3QKK3N5c19saXN0eGF0dHIoY2hhciBfX3VzZXIgKnBhdGgsIGNoYXIgX191c2VyICpsaXN0LCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCXNzaXplX3QgZXJyb3I7CisKKwllcnJvciA9IHVzZXJfcGF0aF93YWxrKHBhdGgsICZuZCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJZXJyb3IgPSBsaXN0eGF0dHIobmQuZGVudHJ5LCBsaXN0LCBzaXplKTsKKwlwYXRoX3JlbGVhc2UoJm5kKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2FzbWxpbmthZ2Ugc3NpemVfdAorc3lzX2xsaXN0eGF0dHIoY2hhciBfX3VzZXIgKnBhdGgsIGNoYXIgX191c2VyICpsaXN0LCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCXNzaXplX3QgZXJyb3I7CisKKwllcnJvciA9IHVzZXJfcGF0aF93YWxrX2xpbmsocGF0aCwgJm5kKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwllcnJvciA9IGxpc3R4YXR0cihuZC5kZW50cnksIGxpc3QsIHNpemUpOworCXBhdGhfcmVsZWFzZSgmbmQpOworCXJldHVybiBlcnJvcjsKK30KKworYXNtbGlua2FnZSBzc2l6ZV90CitzeXNfZmxpc3R4YXR0cihpbnQgZmQsIGNoYXIgX191c2VyICpsaXN0LCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgZmlsZSAqZjsKKwlzc2l6ZV90IGVycm9yID0gLUVCQURGOworCisJZiA9IGZnZXQoZmQpOworCWlmICghZikKKwkJcmV0dXJuIGVycm9yOworCWVycm9yID0gbGlzdHhhdHRyKGYtPmZfZGVudHJ5LCBsaXN0LCBzaXplKTsKKwlmcHV0KGYpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIEV4dGVuZGVkIGF0dHJpYnV0ZSBSRU1PVkUgb3BlcmF0aW9ucworICovCitzdGF0aWMgbG9uZworcmVtb3ZleGF0dHIoc3RydWN0IGRlbnRyeSAqZCwgY2hhciBfX3VzZXIgKm5hbWUpCit7CisJaW50IGVycm9yOworCWNoYXIga25hbWVbWEFUVFJfTkFNRV9NQVggKyAxXTsKKworCWVycm9yID0gc3RybmNweV9mcm9tX3VzZXIoa25hbWUsIG5hbWUsIHNpemVvZihrbmFtZSkpOworCWlmIChlcnJvciA9PSAwIHx8IGVycm9yID09IHNpemVvZihrbmFtZSkpCisJCWVycm9yID0gLUVSQU5HRTsKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CisKKwllcnJvciA9IC1FT1BOT1RTVVBQOworCWlmIChkLT5kX2lub2RlLT5pX29wICYmIGQtPmRfaW5vZGUtPmlfb3AtPnJlbW92ZXhhdHRyKSB7CisJCWVycm9yID0gc2VjdXJpdHlfaW5vZGVfcmVtb3ZleGF0dHIoZCwga25hbWUpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dDsKKwkJZG93bigmZC0+ZF9pbm9kZS0+aV9zZW0pOworCQllcnJvciA9IGQtPmRfaW5vZGUtPmlfb3AtPnJlbW92ZXhhdHRyKGQsIGtuYW1lKTsKKwkJdXAoJmQtPmRfaW5vZGUtPmlfc2VtKTsKKwl9CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCithc21saW5rYWdlIGxvbmcKK3N5c19yZW1vdmV4YXR0cihjaGFyIF9fdXNlciAqcGF0aCwgY2hhciBfX3VzZXIgKm5hbWUpCit7CisJc3RydWN0IG5hbWVpZGF0YSBuZDsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IHVzZXJfcGF0aF93YWxrKHBhdGgsICZuZCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJZXJyb3IgPSByZW1vdmV4YXR0cihuZC5kZW50cnksIG5hbWUpOworCXBhdGhfcmVsZWFzZSgmbmQpOworCXJldHVybiBlcnJvcjsKK30KKworYXNtbGlua2FnZSBsb25nCitzeXNfbHJlbW92ZXhhdHRyKGNoYXIgX191c2VyICpwYXRoLCBjaGFyIF9fdXNlciAqbmFtZSkKK3sKKwlzdHJ1Y3QgbmFtZWlkYXRhIG5kOworCWludCBlcnJvcjsKKworCWVycm9yID0gdXNlcl9wYXRoX3dhbGtfbGluayhwYXRoLCAmbmQpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCWVycm9yID0gcmVtb3ZleGF0dHIobmQuZGVudHJ5LCBuYW1lKTsKKwlwYXRoX3JlbGVhc2UoJm5kKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2FzbWxpbmthZ2UgbG9uZworc3lzX2ZyZW1vdmV4YXR0cihpbnQgZmQsIGNoYXIgX191c2VyICpuYW1lKQoreworCXN0cnVjdCBmaWxlICpmOworCWludCBlcnJvciA9IC1FQkFERjsKKworCWYgPSBmZ2V0KGZkKTsKKwlpZiAoIWYpCisJCXJldHVybiBlcnJvcjsKKwllcnJvciA9IHJlbW92ZXhhdHRyKGYtPmZfZGVudHJ5LCBuYW1lKTsKKwlmcHV0KGYpOworCXJldHVybiBlcnJvcjsKK30KKworCitzdGF0aWMgY29uc3QgY2hhciAqCitzdHJjbXBfcHJlZml4KGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKmFfcHJlZml4KQoreworCXdoaWxlICgqYV9wcmVmaXggJiYgKmEgPT0gKmFfcHJlZml4KSB7CisJCWErKzsKKwkJYV9wcmVmaXgrKzsKKwl9CisJcmV0dXJuICphX3ByZWZpeCA/IE5VTEwgOiBhOworfQorCisvKgorICogSW4gb3JkZXIgdG8gaW1wbGVtZW50IGRpZmZlcmVudCBzZXRzIG9mIHhhdHRyIG9wZXJhdGlvbnMgZm9yIGVhY2ggeGF0dHIKKyAqIHByZWZpeCB3aXRoIHRoZSBnZW5lcmljIHhhdHRyIEFQSSwgYSBmaWxlc3lzdGVtIHNob3VsZCBjcmVhdGUgYQorICogbnVsbC10ZXJtaW5hdGVkIGFycmF5IG9mIHN0cnVjdCB4YXR0cl9oYW5kbGVyIChvbmUgZm9yIGVhY2ggcHJlZml4KSBhbmQKKyAqIGhhbmcgYSBwb2ludGVyIHRvIGl0IG9mZiBvZiB0aGUgc194YXR0ciBmaWVsZCBvZiB0aGUgc3VwZXJibG9jay4KKyAqCisgKiBUaGUgZ2VuZXJpY19mb294YXR0cigpIGZ1bmN0aW9ucyB3aWxsIHVzZSB0aGlzIGxpc3QgdG8gZGlzcGF0Y2ggeGF0dHIKKyAqIG9wZXJhdGlvbnMgdG8gdGhlIGNvcnJlY3QgeGF0dHJfaGFuZGxlci4KKyAqLworI2RlZmluZSBmb3JfZWFjaF94YXR0cl9oYW5kbGVyKGhhbmRsZXJzLCBoYW5kbGVyKQkJXAorCQlmb3IgKChoYW5kbGVyKSA9ICooaGFuZGxlcnMpKys7CQkJXAorCQkJKGhhbmRsZXIpICE9IE5VTEw7CQkJXAorCQkJKGhhbmRsZXIpID0gKihoYW5kbGVycykrKykKKworLyoKKyAqIEZpbmQgdGhlIHhhdHRyX2hhbmRsZXIgd2l0aCB0aGUgbWF0Y2hpbmcgcHJlZml4LgorICovCitzdGF0aWMgc3RydWN0IHhhdHRyX2hhbmRsZXIgKgoreGF0dHJfcmVzb2x2ZV9uYW1lKHN0cnVjdCB4YXR0cl9oYW5kbGVyICoqaGFuZGxlcnMsIGNvbnN0IGNoYXIgKipuYW1lKQoreworCXN0cnVjdCB4YXR0cl9oYW5kbGVyICpoYW5kbGVyOworCisJaWYgKCEqbmFtZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3JfZWFjaF94YXR0cl9oYW5kbGVyKGhhbmRsZXJzLCBoYW5kbGVyKSB7CisJCWNvbnN0IGNoYXIgKm4gPSBzdHJjbXBfcHJlZml4KCpuYW1lLCBoYW5kbGVyLT5wcmVmaXgpOworCQlpZiAobikgeworCQkJKm5hbWUgPSBuOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGhhbmRsZXI7Cit9CisKKy8qCisgKiBGaW5kIHRoZSBoYW5kbGVyIGZvciB0aGUgcHJlZml4IGFuZCBkaXNwYXRjaCBpdHMgZ2V0KCkgb3BlcmF0aW9uLgorICovCitzc2l6ZV90CitnZW5lcmljX2dldHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqaGFuZGxlcjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCisJaGFuZGxlciA9IHhhdHRyX3Jlc29sdmVfbmFtZShpbm9kZS0+aV9zYi0+c194YXR0ciwgJm5hbWUpOworCWlmICghaGFuZGxlcikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCXJldHVybiBoYW5kbGVyLT5nZXQoaW5vZGUsIG5hbWUsIGJ1ZmZlciwgc2l6ZSk7Cit9CisKKy8qCisgKiBDb21iaW5lIHRoZSByZXN1bHRzIG9mIHRoZSBsaXN0KCkgb3BlcmF0aW9uIGZyb20gZXZlcnkgeGF0dHJfaGFuZGxlciBpbiB0aGUKKyAqIGxpc3QuCisgKi8KK3NzaXplX3QKK2dlbmVyaWNfbGlzdHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmZmVyX3NpemUpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwlzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqaGFuZGxlciwgKipoYW5kbGVycyA9IGlub2RlLT5pX3NiLT5zX3hhdHRyOworCXVuc2lnbmVkIGludCBzaXplID0gMDsKKworCWlmICghYnVmZmVyKSB7CisJCWZvcl9lYWNoX3hhdHRyX2hhbmRsZXIoaGFuZGxlcnMsIGhhbmRsZXIpCisJCQlzaXplICs9IGhhbmRsZXItPmxpc3QoaW5vZGUsIE5VTEwsIDAsIE5VTEwsIDApOworCX0gZWxzZSB7CisJCWNoYXIgKmJ1ZiA9IGJ1ZmZlcjsKKworCQlmb3JfZWFjaF94YXR0cl9oYW5kbGVyKGhhbmRsZXJzLCBoYW5kbGVyKSB7CisJCQlzaXplID0gaGFuZGxlci0+bGlzdChpbm9kZSwgYnVmLCBidWZmZXJfc2l6ZSwgTlVMTCwgMCk7CisJCQlpZiAoc2l6ZSA+IGJ1ZmZlcl9zaXplKQorCQkJCXJldHVybiAtRVJBTkdFOworCQkJYnVmICs9IHNpemU7CisJCQlidWZmZXJfc2l6ZSAtPSBzaXplOworCQl9CisJCXNpemUgPSBidWYgLSBidWZmZXI7CisJfQorCXJldHVybiBzaXplOworfQorCisvKgorICogRmluZCB0aGUgaGFuZGxlciBmb3IgdGhlIHByZWZpeCBhbmQgZGlzcGF0Y2ggaXRzIHNldCgpIG9wZXJhdGlvbi4KKyAqLworaW50CitnZW5lcmljX3NldHhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHhhdHRyX2hhbmRsZXIgKmhhbmRsZXI7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKworCWlmIChzaXplID09IDApCisJCXZhbHVlID0gIiI7ICAvKiBlbXB0eSBFQSwgZG8gbm90IHJlbW92ZSAqLworCWhhbmRsZXIgPSB4YXR0cl9yZXNvbHZlX25hbWUoaW5vZGUtPmlfc2ItPnNfeGF0dHIsICZuYW1lKTsKKwlpZiAoIWhhbmRsZXIpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwlyZXR1cm4gaGFuZGxlci0+c2V0KGlub2RlLCBuYW1lLCB2YWx1ZSwgc2l6ZSwgZmxhZ3MpOworfQorCisvKgorICogRmluZCB0aGUgaGFuZGxlciBmb3IgdGhlIHByZWZpeCBhbmQgZGlzcGF0Y2ggaXRzIHNldCgpIG9wZXJhdGlvbiB0byByZW1vdmUKKyAqIGFueSBhc3NvY2lhdGVkIGV4dGVuZGVkIGF0dHJpYnV0ZS4KKyAqLworaW50CitnZW5lcmljX3JlbW92ZXhhdHRyKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqaGFuZGxlcjsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCisJaGFuZGxlciA9IHhhdHRyX3Jlc29sdmVfbmFtZShpbm9kZS0+aV9zYi0+c194YXR0ciwgJm5hbWUpOworCWlmICghaGFuZGxlcikKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCXJldHVybiBoYW5kbGVyLT5zZXQoaW5vZGUsIG5hbWUsIE5VTEwsIDAsIFhBVFRSX1JFUExBQ0UpOworfQorCitFWFBPUlRfU1lNQk9MKGdlbmVyaWNfZ2V0eGF0dHIpOworRVhQT1JUX1NZTUJPTChnZW5lcmljX2xpc3R4YXR0cik7CitFWFBPUlRfU1lNQk9MKGdlbmVyaWNfc2V0eGF0dHIpOworRVhQT1JUX1NZTUJPTChnZW5lcmljX3JlbW92ZXhhdHRyKTsKZGlmZiAtLWdpdCBhL2ZzL3hhdHRyX2FjbC5jIGIvZnMveGF0dHJfYWNsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg5YTI1NQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hhdHRyX2FjbC5jCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBsaW51eC9mcy94YXR0cl9hY2wuYworICoKKyAqIEFsbW9zdCBhbGwgZnJvbSBsaW51eC9mcy9leHQyL2FjbC5jOgorICogQ29weXJpZ2h0IChDKSAyMDAxIGJ5IEFuZHJlYXMgR3J1ZW5iYWNoZXIsIDxhLmdydWVuYmFjaGVyQGNvbXB1dGVyLm9yZz4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2xfeGF0dHIuaD4KKworCisvKgorICogQ29udmVydCBmcm9tIGV4dGVuZGVkIGF0dHJpYnV0ZSB0byBpbi1tZW1vcnkgcmVwcmVzZW50YXRpb24uCisgKi8KK3N0cnVjdCBwb3NpeF9hY2wgKgorcG9zaXhfYWNsX2Zyb21feGF0dHIoY29uc3Qgdm9pZCAqdmFsdWUsIHNpemVfdCBzaXplKQoreworCXBvc2l4X2FjbF94YXR0cl9oZWFkZXIgKmhlYWRlciA9IChwb3NpeF9hY2xfeGF0dHJfaGVhZGVyICopdmFsdWU7CisJcG9zaXhfYWNsX3hhdHRyX2VudHJ5ICplbnRyeSA9IChwb3NpeF9hY2xfeGF0dHJfZW50cnkgKikoaGVhZGVyKzEpLCAqZW5kOworCWludCBjb3VudDsKKwlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CisJc3RydWN0IHBvc2l4X2FjbF9lbnRyeSAqYWNsX2U7CisKKwlpZiAoIXZhbHVlKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoc2l6ZSA8IHNpemVvZihwb3NpeF9hY2xfeGF0dHJfaGVhZGVyKSkKKwkJIHJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCWlmIChoZWFkZXItPmFfdmVyc2lvbiAhPSBjcHVfdG9fbGUzMihQT1NJWF9BQ0xfWEFUVFJfVkVSU0lPTikpCisJCXJldHVybiBFUlJfUFRSKC1FT1BOT1RTVVBQKTsKKworCWNvdW50ID0gcG9zaXhfYWNsX3hhdHRyX2NvdW50KHNpemUpOworCWlmIChjb3VudCA8IDApCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCWlmIChjb3VudCA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKwkKKwlhY2wgPSBwb3NpeF9hY2xfYWxsb2MoY291bnQsIEdGUF9LRVJORUwpOworCWlmICghYWNsKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwlhY2xfZSA9IGFjbC0+YV9lbnRyaWVzOworCQorCWZvciAoZW5kID0gZW50cnkgKyBjb3VudDsgZW50cnkgIT0gZW5kOyBhY2xfZSsrLCBlbnRyeSsrKSB7CisJCWFjbF9lLT5lX3RhZyAgPSBsZTE2X3RvX2NwdShlbnRyeS0+ZV90YWcpOworCQlhY2xfZS0+ZV9wZXJtID0gbGUxNl90b19jcHUoZW50cnktPmVfcGVybSk7CisKKwkJc3dpdGNoKGFjbF9lLT5lX3RhZykgeworCQkJY2FzZSBBQ0xfVVNFUl9PQko6CisJCQljYXNlIEFDTF9HUk9VUF9PQko6CisJCQljYXNlIEFDTF9NQVNLOgorCQkJY2FzZSBBQ0xfT1RIRVI6CisJCQkJYWNsX2UtPmVfaWQgPSBBQ0xfVU5ERUZJTkVEX0lEOworCQkJCWJyZWFrOworCisJCQljYXNlIEFDTF9VU0VSOgorCQkJY2FzZSBBQ0xfR1JPVVA6CisJCQkJYWNsX2UtPmVfaWQgPSBsZTMyX3RvX2NwdShlbnRyeS0+ZV9pZCk7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJZ290byBmYWlsOworCQl9CisJfQorCXJldHVybiBhY2w7CisKK2ZhaWw6CisJcG9zaXhfYWNsX3JlbGVhc2UoYWNsKTsKKwlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKK30KK0VYUE9SVF9TWU1CT0wgKHBvc2l4X2FjbF9mcm9tX3hhdHRyKTsKKworLyoKKyAqIENvbnZlcnQgZnJvbSBpbi1tZW1vcnkgdG8gZXh0ZW5kZWQgYXR0cmlidXRlIHJlcHJlc2VudGF0aW9uLgorICovCitpbnQKK3Bvc2l4X2FjbF90b194YXR0cihjb25zdCBzdHJ1Y3QgcG9zaXhfYWNsICphY2wsIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCit7CisJcG9zaXhfYWNsX3hhdHRyX2hlYWRlciAqZXh0X2FjbCA9IChwb3NpeF9hY2xfeGF0dHJfaGVhZGVyICopYnVmZmVyOworCXBvc2l4X2FjbF94YXR0cl9lbnRyeSAqZXh0X2VudHJ5ID0gZXh0X2FjbC0+YV9lbnRyaWVzOworCWludCByZWFsX3NpemUsIG47CisKKwlyZWFsX3NpemUgPSBwb3NpeF9hY2xfeGF0dHJfc2l6ZShhY2wtPmFfY291bnQpOworCWlmICghYnVmZmVyKQorCQlyZXR1cm4gcmVhbF9zaXplOworCWlmIChyZWFsX3NpemUgPiBzaXplKQorCQlyZXR1cm4gLUVSQU5HRTsKKwkKKwlleHRfYWNsLT5hX3ZlcnNpb24gPSBjcHVfdG9fbGUzMihQT1NJWF9BQ0xfWEFUVFJfVkVSU0lPTik7CisKKwlmb3IgKG49MDsgbiA8IGFjbC0+YV9jb3VudDsgbisrLCBleHRfZW50cnkrKykgeworCQlleHRfZW50cnktPmVfdGFnICA9IGNwdV90b19sZTE2KGFjbC0+YV9lbnRyaWVzW25dLmVfdGFnKTsKKwkJZXh0X2VudHJ5LT5lX3Blcm0gPSBjcHVfdG9fbGUxNihhY2wtPmFfZW50cmllc1tuXS5lX3Blcm0pOworCQlleHRfZW50cnktPmVfaWQgICA9IGNwdV90b19sZTMyKGFjbC0+YV9lbnRyaWVzW25dLmVfaWQpOworCX0KKwlyZXR1cm4gcmVhbF9zaXplOworfQorRVhQT1JUX1NZTUJPTCAocG9zaXhfYWNsX3RvX3hhdHRyKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9LY29uZmlnIGIvZnMveGZzL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkyMzA2ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9LY29uZmlnCkBAIC0wLDAgKzEsODUgQEAKK21lbnUgIlhGUyBzdXBwb3J0IgorCitjb25maWcgWEZTX0ZTCisJdHJpc3RhdGUgIlhGUyBmaWxlc3lzdGVtIHN1cHBvcnQiCisJc2VsZWN0IEVYUE9SVEZTIGlmIE5GU0QhPW4KKwloZWxwCisJICBYRlMgaXMgYSBoaWdoIHBlcmZvcm1hbmNlIGpvdXJuYWxpbmcgZmlsZXN5c3RlbSB3aGljaCBvcmlnaW5hdGVkCisJICBvbiB0aGUgU0dJIElSSVggcGxhdGZvcm0uICBJdCBpcyBjb21wbGV0ZWx5IG11bHRpLXRocmVhZGVkLCBjYW4KKwkgIHN1cHBvcnQgbGFyZ2UgZmlsZXMgYW5kIGxhcmdlIGZpbGVzeXN0ZW1zLCBleHRlbmRlZCBhdHRyaWJ1dGVzLAorCSAgdmFyaWFibGUgYmxvY2sgc2l6ZXMsIGlzIGV4dGVudCBiYXNlZCwgYW5kIG1ha2VzIGV4dGVuc2l2ZSB1c2Ugb2YKKwkgIEJ0cmVlcyAoZGlyZWN0b3JpZXMsIGV4dGVudHMsIGZyZWUgc3BhY2UpIHRvIGFpZCBib3RoIHBlcmZvcm1hbmNlCisJICBhbmQgc2NhbGFiaWxpdHkuCisKKwkgIFJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uIGF0IDxodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMveGZzLz4KKwkgIGZvciBjb21wbGV0ZSBkZXRhaWxzLiAgVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBvbi1kaXNrIGNvbXBhdGlibGUKKwkgIHdpdGggdGhlIElSSVggdmVyc2lvbiBvZiBYRlMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBmaWxlIHN5c3RlbSBzdXBwb3J0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB4ZnMuICBCZSBhd2FyZSwgaG93ZXZlciwgdGhhdCBpZiB0aGUgZmlsZQorCSAgc3lzdGVtIG9mIHlvdXIgcm9vdCBwYXJ0aXRpb24gaXMgY29tcGlsZWQgYXMgYSBtb2R1bGUsIHlvdSdsbCBuZWVkCisJICB0byB1c2UgYW4gaW5pdGlhbCByYW1kaXNrIChpbml0cmQpIHRvIGJvb3QuCisKK2NvbmZpZyBYRlNfRVhQT1JUCisJYm9vbAorCWRlZmF1bHQgeSBpZiBYRlNfRlMgJiYgRVhQT1JURlMKKworY29uZmlnIFhGU19SVAorCWJvb2wgIlJlYWx0aW1lIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBYRlNfRlMgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUgeW91IHdpbGwgYmUgYWJsZSB0byBtb3VudCBhbmQgdXNlIFhGUyBmaWxlc3lzdGVtcworCSAgd2hpY2ggY29udGFpbiBhIHJlYWx0aW1lIHN1YnZvbHVtZS4gVGhlIHJlYWx0aW1lIHN1YnZvbHVtZSBpcyBhCisJICBzZXBhcmF0ZSBhcmVhIG9mIGRpc2sgc3BhY2Ugd2hlcmUgb25seSBmaWxlIGRhdGEgaXMgc3RvcmVkLiBUaGUKKwkgIHJlYWx0aW1lIHN1YnZvbHVtZSBpcyBkZXNpZ25lZCB0byBwcm92aWRlIHZlcnkgZGV0ZXJtaW5pc3RpYworCSAgZGF0YSByYXRlcyBzdWl0YWJsZSBmb3IgbWVkaWEgc3RyZWFtaW5nIGFwcGxpY2F0aW9ucy4KKworCSAgU2VlIHRoZSB4ZnMgbWFuIHBhZ2UgaW4gc2VjdGlvbiA1IGZvciBhIGJpdCBtb3JlIGluZm9ybWF0aW9uLgorCisJICBUaGlzIGZlYXR1cmUgaXMgdW5zdXBwb3J0ZWQgYXQgdGhpcyB0aW1lLCBpcyBub3QgeWV0IGZ1bGx5CisJICBmdW5jdGlvbmFsLCBhbmQgbWF5IGNhdXNlIHNlcmlvdXMgcHJvYmxlbXMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBYRlNfUVVPVEEKKwlib29sICJRdW90YSBzdXBwb3J0IgorCWRlcGVuZHMgb24gWEZTX0ZTCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGJlIGFibGUgdG8gc2V0IGxpbWl0cyBmb3IgZGlzayB1c2FnZSBvbgorCSAgYSBwZXIgdXNlciBhbmQvb3IgYSBwZXIgZ3JvdXAgYmFzaXMgdW5kZXIgWEZTLiAgWEZTIGNvbnNpZGVycyBxdW90YQorCSAgaW5mb3JtYXRpb24gYXMgZmlsZXN5c3RlbSBtZXRhZGF0YSBhbmQgdXNlcyBqb3VybmFsaW5nIHRvIHByb3ZpZGUgYQorCSAgaGlnaGVyIGxldmVsIGd1YXJhbnRlZSBvZiBjb25zaXN0ZW5jeS4gIFRoZSBvbi1kaXNrIGRhdGEgZm9ybWF0IGZvcgorCSAgcXVvdGEgaXMgYWxzbyBjb21wYXRpYmxlIHdpdGggdGhlIElSSVggdmVyc2lvbiBvZiBYRlMsIGFsbG93aW5nIGEKKwkgIGZpbGVzeXN0ZW0gdG8gYmUgbWlncmF0ZWQgYmV0d2VlbiBMaW51eCBhbmQgSVJJWCB3aXRob3V0IGFueSBuZWVkCisJICBmb3IgY29udmVyc2lvbi4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4gIE1vcmUgY29tcHJlaGVuc2l2ZSBkb2N1bWVudGF0aW9uIGNhbiBiZSBmb3VuZCBpbgorCSAgUkVBRE1FLnF1b3RhIGluIHRoZSB4ZnNwcm9ncyBwYWNrYWdlLiAgWEZTIHF1b3RhIGNhbiBiZSB1c2VkIGVpdGhlcgorCSAgd2l0aCBvciB3aXRob3V0IHRoZSBnZW5lcmljIHF1b3RhIHN1cHBvcnQgZW5hYmxlZCAoQ09ORklHX1FVT1RBKSAtCisJICB0aGV5IGFyZSBjb21wbGV0ZWx5IGluZGVwZW5kZW50IHN1YnN5c3RlbXMuCisKK2NvbmZpZyBYRlNfU0VDVVJJVFkKKwlib29sICJTZWN1cml0eSBMYWJlbCBzdXBwb3J0IgorCWRlcGVuZHMgb24gWEZTX0ZTCisJaGVscAorCSAgU2VjdXJpdHkgbGFiZWxzIHN1cHBvcnQgYWx0ZXJuYXRpdmUgYWNjZXNzIGNvbnRyb2wgbW9kZWxzCisJICBpbXBsZW1lbnRlZCBieSBzZWN1cml0eSBtb2R1bGVzIGxpa2UgU0VMaW51eC4gIFRoaXMgb3B0aW9uCisJICBlbmFibGVzIGFuIGV4dGVuZGVkIGF0dHJpYnV0ZSBuYW1lc3BhY2UgZm9yIGlub2RlIHNlY3VyaXR5CisJICBsYWJlbHMgaW4gdGhlIFhGUyBmaWxlc3lzdGVtLgorCisJICBJZiB5b3UgYXJlIG5vdCB1c2luZyBhIHNlY3VyaXR5IG1vZHVsZSB0aGF0IHJlcXVpcmVzIHVzaW5nCisJICBleHRlbmRlZCBhdHRyaWJ1dGVzIGZvciBpbm9kZSBzZWN1cml0eSBsYWJlbHMsIHNheSBOLgorCitjb25maWcgWEZTX1BPU0lYX0FDTAorCWJvb2wgIlBPU0lYIEFDTCBzdXBwb3J0IgorCWRlcGVuZHMgb24gWEZTX0ZTCisJaGVscAorCSAgUE9TSVggQWNjZXNzIENvbnRyb2wgTGlzdHMgKEFDTHMpIHN1cHBvcnQgcGVybWlzc2lvbnMgZm9yIHVzZXJzIGFuZAorCSAgZ3JvdXBzIGJleW9uZCB0aGUgb3duZXIvZ3JvdXAvd29ybGQgc2NoZW1lLgorCisJICBUbyBsZWFybiBtb3JlIGFib3V0IEFjY2VzcyBDb250cm9sIExpc3RzLCB2aXNpdCB0aGUgUE9TSVggQUNMcyBmb3IKKwkgIExpbnV4IHdlYnNpdGUgPGh0dHA6Ly9hY2wuYmVzdGJpdHMuYXQvPi4KKworCSAgSWYgeW91IGRvbid0IGtub3cgd2hhdCBBY2Nlc3MgQ29udHJvbCBMaXN0cyBhcmUsIHNheSBOLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9mcy94ZnMvTWFrZWZpbGUgYi9mcy94ZnMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU0ZTRhMQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9NYWtlZmlsZQpAQCAtMCwwICsxLDE1MCBAQAorIworIyBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorIyB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworIyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyMKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyMgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisjCisjIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworIyBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyMgb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorIyBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisjIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyMgb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisjIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyMKKyMgQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyMgTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyMKKyMgaHR0cDovL3d3dy5zZ2kuY29tCisjCisjIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorIworIyBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisjCisKK0VYVFJBX0NGTEFHUyArPQkgLUlmcy94ZnMgLUlmcy94ZnMvbGludXgtMi42IC1mdW5zaWduZWQtY2hhcgorCitpZmVxICgkKENPTkZJR19YRlNfREVCVUcpLHkpCisJRVhUUkFfQ0ZMQUdTICs9IC1nIC1EU1RBVElDPSIiIC1EREVCVUcKKwlFWFRSQV9DRkxBR1MgKz0gLURQQUdFQlVGX0xPQ0tfVFJBQ0tJTkcKK2VuZGlmCitpZmVxICgkKENPTkZJR19YRlNfVFJBQ0UpLHkpCisJRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX0FMTE9DX1RSQUNFCisJRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX0FUVFJfVFJBQ0UKKwlFWFRSQV9DRkxBR1MgKz0gLURYRlNfQkxJX1RSQUNFCisJRVhUUkFfQ0ZMQUdTICs9IC1EWEZTX0JNQVBfVFJBQ0UKKwlFWFRSQV9DRkxBR1MgKz0gLURYRlNfQk1CVF9UUkFDRQorCUVYVFJBX0NGTEFHUyArPSAtRFhGU19ESVJfVFJBQ0UKKwlFWFRSQV9DRkxBR1MgKz0gLURYRlNfRElSMl9UUkFDRQorCUVYVFJBX0NGTEFHUyArPSAtRFhGU19EUVVPVF9UUkFDRQorCUVYVFJBX0NGTEFHUyArPSAtRFhGU19JTE9DS19UUkFDRQorCUVYVFJBX0NGTEFHUyArPSAtRFhGU19MT0dfVFJBQ0UKKwlFWFRSQV9DRkxBR1MgKz0gLURYRlNfUldfVFJBQ0UKKwlFWFRSQV9DRkxBR1MgKz0gLURQQUdFQlVGX1RSQUNFCisJIyBFWFRSQV9DRkxBR1MgKz0gLURYRlNfVk5PREVfVFJBQ0UKK2VuZGlmCisKK29iai0kKENPTkZJR19YRlNfRlMpCQkrPSB4ZnMubworCit4ZnMtJChDT05GSUdfWEZTX1FVT1RBKQkJKz0gJChhZGRwcmVmaXggcXVvdGEvLCBcCisJCQkJICAgeGZzX2RxdW90Lm8gXAorCQkJCSAgIHhmc19kcXVvdF9pdGVtLm8gXAorCQkJCSAgIHhmc190cmFuc19kcXVvdC5vIFwKKwkJCQkgICB4ZnNfcW1fc3lzY2FsbHMubyBcCisJCQkJICAgeGZzX3FtX2Jodi5vIFwKKwkJCQkgICB4ZnNfcW0ubykKK2lmZXEgKCQoQ09ORklHX1hGU19RVU9UQSkseSkKK3hmcy0kKENPTkZJR19QUk9DX0ZTKQkJKz0gcXVvdGEveGZzX3FtX3N0YXRzLm8KK2VuZGlmCisKK3hmcy0kKENPTkZJR19YRlNfUlQpCQkrPSB4ZnNfcnRhbGxvYy5vCit4ZnMtJChDT05GSUdfWEZTX1BPU0lYX0FDTCkJKz0geGZzX2FjbC5vCit4ZnMtJChDT05GSUdfUFJPQ19GUykJCSs9IGxpbnV4LTIuNi94ZnNfc3RhdHMubworeGZzLSQoQ09ORklHX1NZU0NUTCkJCSs9IGxpbnV4LTIuNi94ZnNfc3lzY3RsLm8KK3hmcy0kKENPTkZJR19DT01QQVQpCQkrPSBsaW51eC0yLjYveGZzX2lvY3RsMzIubworeGZzLSQoQ09ORklHX1hGU19FWFBPUlQpCSs9IGxpbnV4LTIuNi94ZnNfZXhwb3J0Lm8KKworCit4ZnMteQkJCQkrPSB4ZnNfYWxsb2MubyBcCisJCQkJICAgeGZzX2FsbG9jX2J0cmVlLm8gXAorCQkJCSAgIHhmc19hdHRyLm8gXAorCQkJCSAgIHhmc19hdHRyX2xlYWYubyBcCisJCQkJICAgeGZzX2JlaGF2aW9yLm8gXAorCQkJCSAgIHhmc19iaXQubyBcCisJCQkJICAgeGZzX2JtYXAubyBcCisJCQkJICAgeGZzX2JtYXBfYnRyZWUubyBcCisJCQkJICAgeGZzX2J0cmVlLm8gXAorCQkJCSAgIHhmc19idWZfaXRlbS5vIFwKKwkJCQkgICB4ZnNfZGFfYnRyZWUubyBcCisJCQkJICAgeGZzX2Rpci5vIFwKKwkJCQkgICB4ZnNfZGlyMi5vIFwKKwkJCQkgICB4ZnNfZGlyMl9ibG9jay5vIFwKKwkJCQkgICB4ZnNfZGlyMl9kYXRhLm8gXAorCQkJCSAgIHhmc19kaXIyX2xlYWYubyBcCisJCQkJICAgeGZzX2RpcjJfbm9kZS5vIFwKKwkJCQkgICB4ZnNfZGlyMl9zZi5vIFwKKwkJCQkgICB4ZnNfZGlyX2xlYWYubyBcCisJCQkJICAgeGZzX2Vycm9yLm8gXAorCQkJCSAgIHhmc19leHRmcmVlX2l0ZW0ubyBcCisJCQkJICAgeGZzX2Zzb3BzLm8gXAorCQkJCSAgIHhmc19pYWxsb2MubyBcCisJCQkJICAgeGZzX2lhbGxvY19idHJlZS5vIFwKKwkJCQkgICB4ZnNfaWdldC5vIFwKKwkJCQkgICB4ZnNfaW5vZGUubyBcCisJCQkJICAgeGZzX2lub2RlX2l0ZW0ubyBcCisJCQkJICAgeGZzX2lvY29yZS5vIFwKKwkJCQkgICB4ZnNfaW9tYXAubyBcCisJCQkJICAgeGZzX2l0YWJsZS5vIFwKKwkJCQkgICB4ZnNfZGZyYWcubyBcCisJCQkJICAgeGZzX2xvZy5vIFwKKwkJCQkgICB4ZnNfbG9nX3JlY292ZXIubyBcCisJCQkJICAgeGZzX21hY3Jvcy5vIFwKKwkJCQkgICB4ZnNfbW91bnQubyBcCisJCQkJICAgeGZzX3JlbmFtZS5vIFwKKwkJCQkgICB4ZnNfdHJhbnMubyBcCisJCQkJICAgeGZzX3RyYW5zX2FpbC5vIFwKKwkJCQkgICB4ZnNfdHJhbnNfYnVmLm8gXAorCQkJCSAgIHhmc190cmFuc19leHRmcmVlLm8gXAorCQkJCSAgIHhmc190cmFuc19pbm9kZS5vIFwKKwkJCQkgICB4ZnNfdHJhbnNfaXRlbS5vIFwKKwkJCQkgICB4ZnNfdXRpbHMubyBcCisJCQkJICAgeGZzX3Zmc29wcy5vIFwKKwkJCQkgICB4ZnNfdm5vZGVvcHMubyBcCisJCQkJICAgeGZzX3J3Lm8gXAorCQkJCSAgIHhmc19kbW9wcy5vIFwKKwkJCQkgICB4ZnNfcW1vcHMubworCit4ZnMtJChDT05GSUdfWEZTX1RSQUNFKQkJKz0geGZzX2RpcjJfdHJhY2UubworCisjIE9iamVjdHMgaW4gbGludXgtMi42LworeGZzLXkJCQkJKz0gJChhZGRwcmVmaXggbGludXgtMi42LywgXAorCQkJCSAgIGttZW0ubyBcCisJCQkJICAgeGZzX2FvcHMubyBcCisJCQkJICAgeGZzX2J1Zi5vIFwKKwkJCQkgICB4ZnNfZmlsZS5vIFwKKwkJCQkgICB4ZnNfZnNfc3Vici5vIFwKKwkJCQkgICB4ZnNfZ2xvYmFscy5vIFwKKwkJCQkgICB4ZnNfaW9jdGwubyBcCisJCQkJICAgeGZzX2lvcHMubyBcCisJCQkJICAgeGZzX2xydy5vIFwKKwkJCQkgICB4ZnNfc3VwZXIubyBcCisJCQkJICAgeGZzX3Zmcy5vIFwKKwkJCQkgICB4ZnNfdm5vZGUubykKKworIyBPYmplY3RzIGluIHN1cHBvcnQvCit4ZnMteQkJCQkrPSAkKGFkZHByZWZpeCBzdXBwb3J0LywgXAorCQkJCSAgIGRlYnVnLm8gXAorCQkJCSAgIG1vdmUubyBcCisJCQkJICAgcXNvcnQubyBcCisJCQkJICAgdXVpZC5vKQorCit4ZnMtJChDT05GSUdfWEZTX1RSQUNFKQkJKz0gc3VwcG9ydC9rdHJhY2UubworCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L2ttZW0uYyBiL2ZzL3hmcy9saW51eC0yLjYva21lbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NGVhOGMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvbGludXgtMi42L2ttZW0uYwpAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKworI2luY2x1ZGUgInRpbWUuaCIKKyNpbmNsdWRlICJrbWVtLmgiCisKKyNkZWZpbmUgTUFYX1ZNQUxMT0NTCTYKKyNkZWZpbmUgTUFYX1NMQUJfU0laRQkweDIwMDAwCisKKwordm9pZCAqCitrbWVtX2FsbG9jKHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCit7CisJaW50CXJldHJpZXMgPSAwOworCWludAlsZmxhZ3MgPSBrbWVtX2ZsYWdzX2NvbnZlcnQoZmxhZ3MpOworCXZvaWQJKnB0cjsKKworCWRvIHsKKwkJaWYgKHNpemUgPCBNQVhfU0xBQl9TSVpFIHx8IHJldHJpZXMgPiBNQVhfVk1BTExPQ1MpCisJCQlwdHIgPSBrbWFsbG9jKHNpemUsIGxmbGFncyk7CisJCWVsc2UKKwkJCXB0ciA9IF9fdm1hbGxvYyhzaXplLCBsZmxhZ3MsIFBBR0VfS0VSTkVMKTsKKwkJaWYgKHB0ciB8fCAoZmxhZ3MgJiAoS01fTUFZRkFJTHxLTV9OT1NMRUVQKSkpCisJCQlyZXR1cm4gcHRyOworCQlpZiAoISgrK3JldHJpZXMgJSAxMDApKQorCQkJcHJpbnRrKEtFUk5fRVJSICJYRlM6IHBvc3NpYmxlIG1lbW9yeSBhbGxvY2F0aW9uICIKKwkJCQkJImRlYWRsb2NrIGluICVzIChtb2RlOjB4JXgpXG4iLAorCQkJCQlfX0ZVTkNUSU9OX18sIGxmbGFncyk7CisJCWJsa19jb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzUwKTsKKwl9IHdoaWxlICgxKTsKK30KKwordm9pZCAqCitrbWVtX3phbGxvYyhzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoreworCXZvaWQJKnB0cjsKKworCXB0ciA9IGttZW1fYWxsb2Moc2l6ZSwgZmxhZ3MpOworCWlmIChwdHIpCisJCW1lbXNldCgoY2hhciAqKXB0ciwgMCwgKGludClzaXplKTsKKwlyZXR1cm4gcHRyOworfQorCit2b2lkCitrbWVtX2ZyZWUodm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSkKK3sKKwlpZiAoKCh1bnNpZ25lZCBsb25nKXB0ciA8IFZNQUxMT0NfU1RBUlQpIHx8CisJICAgICgodW5zaWduZWQgbG9uZylwdHIgPj0gVk1BTExPQ19FTkQpKSB7CisJCWtmcmVlKHB0cik7CisJfSBlbHNlIHsKKwkJdmZyZWUocHRyKTsKKwl9Cit9CisKK3ZvaWQgKgora21lbV9yZWFsbG9jKHZvaWQgKnB0ciwgc2l6ZV90IG5ld3NpemUsIHNpemVfdCBvbGRzaXplLCBpbnQgZmxhZ3MpCit7CisJdm9pZAkqbmV3OworCisJbmV3ID0ga21lbV9hbGxvYyhuZXdzaXplLCBmbGFncyk7CisJaWYgKHB0cikgeworCQlpZiAobmV3KQorCQkJbWVtY3B5KG5ldywgcHRyLAorCQkJCSgob2xkc2l6ZSA8IG5ld3NpemUpID8gb2xkc2l6ZSA6IG5ld3NpemUpKTsKKwkJa21lbV9mcmVlKHB0ciwgb2xkc2l6ZSk7CisJfQorCXJldHVybiBuZXc7Cit9CisKK3ZvaWQgKgora21lbV96b25lX2FsbG9jKGttZW1fem9uZV90ICp6b25lLCBpbnQgZmxhZ3MpCit7CisJaW50CXJldHJpZXMgPSAwOworCWludAlsZmxhZ3MgPSBrbWVtX2ZsYWdzX2NvbnZlcnQoZmxhZ3MpOworCXZvaWQJKnB0cjsKKworCWRvIHsKKwkJcHRyID0ga21lbV9jYWNoZV9hbGxvYyh6b25lLCBsZmxhZ3MpOworCQlpZiAocHRyIHx8IChmbGFncyAmIChLTV9NQVlGQUlMfEtNX05PU0xFRVApKSkKKwkJCXJldHVybiBwdHI7CisJCWlmICghKCsrcmV0cmllcyAlIDEwMCkpCisJCQlwcmludGsoS0VSTl9FUlIgIlhGUzogcG9zc2libGUgbWVtb3J5IGFsbG9jYXRpb24gIgorCQkJCQkiZGVhZGxvY2sgaW4gJXMgKG1vZGU6MHgleClcbiIsCisJCQkJCV9fRlVOQ1RJT05fXywgbGZsYWdzKTsKKwkJYmxrX2Nvbmdlc3Rpb25fd2FpdChXUklURSwgSFovNTApOworCX0gd2hpbGUgKDEpOworfQorCit2b2lkICoKK2ttZW1fem9uZV96YWxsb2Moa21lbV96b25lX3QgKnpvbmUsIGludCBmbGFncykKK3sKKwl2b2lkCSpwdHI7CisKKwlwdHIgPSBrbWVtX3pvbmVfYWxsb2Moem9uZSwgZmxhZ3MpOworCWlmIChwdHIpCisJCW1lbXNldCgoY2hhciAqKXB0ciwgMCwga21lbV9jYWNoZV9zaXplKHpvbmUpKTsKKwlyZXR1cm4gcHRyOworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi9rbWVtLmggYi9mcy94ZnMvbGludXgtMi42L2ttZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzk3YjY2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL2xpbnV4LTIuNi9rbWVtLmgKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX1NVUFBPUlRfS01FTV9IX18KKyNkZWZpbmUgX19YRlNfU1VQUE9SVF9LTUVNX0hfXworCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKworLyoKKyAqIG1lbW9yeSBtYW5hZ2VtZW50IHJvdXRpbmVzCisgKi8KKyNkZWZpbmUgS01fU0xFRVAJMHgwMDAxCisjZGVmaW5lIEtNX05PU0xFRVAJMHgwMDAyCisjZGVmaW5lIEtNX05PRlMJCTB4MDAwNAorI2RlZmluZSBLTV9NQVlGQUlMCTB4MDAwOAorCisjZGVmaW5lCWttZW1fem9uZQlrbWVtX2NhY2hlX3MKKyNkZWZpbmUga21lbV96b25lX3QJa21lbV9jYWNoZV90CisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB4ZnNfcGZsYWdzX3Q7CisKKyNkZWZpbmUgUEZMQUdTX1RFU1RfTk9JTygpICAgICAgICAgICAgICAoY3VycmVudC0+ZmxhZ3MgJiBQRl9OT0lPKQorI2RlZmluZSBQRkxBR1NfVEVTVF9GU1RSQU5TKCkgICAgICAgICAgIChjdXJyZW50LT5mbGFncyAmIFBGX0ZTVFJBTlMpCisKKyNkZWZpbmUgUEZMQUdTX1NFVF9OT0lPKCkgZG8gewkJXAorCWN1cnJlbnQtPmZsYWdzIHw9IFBGX05PSU87CVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgUEZMQUdTX0NMRUFSX05PSU8oKSBkbyB7CVwKKwljdXJyZW50LT5mbGFncyAmPSB+UEZfTk9JTzsJXAorfSB3aGlsZSAoMCkKKworLyogdGhlc2UgY291bGQgYmUgbmVzdGVkLCBzbyB3ZSBzYXZlIHN0YXRlICovCisjZGVmaW5lIFBGTEFHU19TRVRfRlNUUkFOUyhTVEFURVApIGRvIHsJXAorCSooU1RBVEVQKSA9IGN1cnJlbnQtPmZsYWdzOwlcCisJY3VycmVudC0+ZmxhZ3MgfD0gUEZfRlNUUkFOUzsJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBQRkxBR1NfQ0xFQVJfRlNUUkFOUyhTVEFURVApIGRvIHsgXAorCSooU1RBVEVQKSA9IGN1cnJlbnQtPmZsYWdzOwlcCisJY3VycmVudC0+ZmxhZ3MgJj0gflBGX0ZTVFJBTlM7CVwKK30gd2hpbGUgKDApCisKKy8qIFJlc3RvcmUgdGhlIFBGX0ZTVFJBTlMgc3RhdGUgdG8gd2hhdCB3YXMgc2F2ZWQgaW4gU1RBVEVQICovCisjZGVmaW5lIFBGTEFHU19SRVNUT1JFX0ZTVFJBTlMoU1RBVEVQKSBkbyB7ICAgICAJCVwKKwljdXJyZW50LT5mbGFncyA9ICgoY3VycmVudC0+ZmxhZ3MgJiB+UEZfRlNUUkFOUykgfAlcCisJCQkgICgqKFNUQVRFUCkgJiBQRl9GU1RSQU5TKSk7CQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFBGTEFHU19EVVAoT1NUQVRFUCwgTlNUQVRFUCkgZG8geyBcCisJKihOU1RBVEVQKSA9ICooT1NUQVRFUCk7CVwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBpbnQga21lbV9mbGFnc19jb252ZXJ0KGludCBmbGFncykKK3sKKwlpbnQJbGZsYWdzID0gX19HRlBfTk9XQVJOOwkvKiB3ZSdsbCByZXBvcnQgcHJvYmxlbXMsIGlmIG5lZWQgYmUgKi8KKworI2lmZGVmIERFQlVHCisJaWYgKHVubGlrZWx5KGZsYWdzICYgfihLTV9TTEVFUHxLTV9OT1NMRUVQfEtNX05PRlN8S01fTUFZRkFJTCkpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICJYRlM6IG1lbW9yeSBhbGxvY2F0aW9uIHdpdGggd3JvbmcgZmxhZ3MgKCV4KVxuIiwgZmxhZ3MpOworCQlCVUcoKTsKKwl9CisjZW5kaWYKKworCWlmIChmbGFncyAmIEtNX05PU0xFRVApIHsKKwkJbGZsYWdzIHw9IEdGUF9BVE9NSUM7CisJfSBlbHNlIHsKKwkJbGZsYWdzIHw9IEdGUF9LRVJORUw7CisKKwkJLyogYXZvaWQgcmVjdXNpdmUgY2FsbGJhY2tzIHRvIGZpbGVzeXN0ZW0gZHVyaW5nIHRyYW5zYWN0aW9ucyAqLworCQlpZiAoUEZMQUdTX1RFU1RfRlNUUkFOUygpIHx8IChmbGFncyAmIEtNX05PRlMpKQorCQkJbGZsYWdzICY9IH5fX0dGUF9GUzsKKwl9CisgICAgICAgIAorICAgICAgICByZXR1cm4gbGZsYWdzOworfQorCitzdGF0aWMgX19pbmxpbmUga21lbV96b25lX3QgKgora21lbV96b25lX2luaXQoaW50IHNpemUsIGNoYXIgKnpvbmVfbmFtZSkKK3sKKwlyZXR1cm4ga21lbV9jYWNoZV9jcmVhdGUoem9uZV9uYW1lLCBzaXplLCAwLCAwLCBOVUxMLCBOVUxMKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2ttZW1fem9uZV9mcmVlKGttZW1fem9uZV90ICp6b25lLCB2b2lkICpwdHIpCit7CisJa21lbV9jYWNoZV9mcmVlKHpvbmUsIHB0cik7Cit9CisKK3N0YXRpYyBfX2lubGluZSB2b2lkCitrbWVtX3pvbmVfZGVzdHJveShrbWVtX3pvbmVfdCAqem9uZSkKK3sKKwlpZiAoem9uZSAmJiBrbWVtX2NhY2hlX2Rlc3Ryb3koem9uZSkpCisJCUJVRygpOworfQorCitleHRlcm4gdm9pZAkgICAgKmttZW1fem9uZV96YWxsb2Moa21lbV96b25lX3QgKiwgaW50KTsKK2V4dGVybiB2b2lkCSAgICAqa21lbV96b25lX2FsbG9jKGttZW1fem9uZV90ICosIGludCk7CisKK2V4dGVybiB2b2lkCSAgICAqa21lbV9hbGxvYyhzaXplX3QsIGludCk7CitleHRlcm4gdm9pZAkgICAgKmttZW1fcmVhbGxvYyh2b2lkICosIHNpemVfdCwgc2l6ZV90LCBpbnQpOworZXh0ZXJuIHZvaWQJICAgICprbWVtX3phbGxvYyhzaXplX3QsIGludCk7CitleHRlcm4gdm9pZCAgICAgICAgIGttZW1fZnJlZSh2b2lkICosIHNpemVfdCk7CisKK3R5cGVkZWYgc3RydWN0IHNocmlua2VyICprbWVtX3NoYWtlcl90OwordHlwZWRlZiBpbnQgKCprbWVtX3NoYWtlX2Z1bmNfdCkoaW50LCB1bnNpZ25lZCBpbnQpOworCitzdGF0aWMgX19pbmxpbmUga21lbV9zaGFrZXJfdAora21lbV9zaGFrZV9yZWdpc3RlcihrbWVtX3NoYWtlX2Z1bmNfdCBzZnVuYykKK3sKKwlyZXR1cm4gc2V0X3Nocmlua2VyKERFRkFVTFRfU0VFS1MsIHNmdW5jKTsKK30KKworc3RhdGljIF9faW5saW5lIHZvaWQKK2ttZW1fc2hha2VfZGVyZWdpc3RlcihrbWVtX3NoYWtlcl90IHNocmlua2VyKQoreworCXJlbW92ZV9zaHJpbmtlcihzaHJpbmtlcik7Cit9CisKK3N0YXRpYyBfX2lubGluZSBpbnQKK2ttZW1fc2hha2VfYWxsb3codW5zaWduZWQgaW50IGdmcF9tYXNrKQoreworCXJldHVybiAoZ2ZwX21hc2sgJiBfX0dGUF9XQUlUKTsKK30KKworI2VuZGlmIC8qIF9fWEZTX1NVUFBPUlRfS01FTV9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYvbXJsb2NrLmggYi9mcy94ZnMvbGludXgtMi42L21ybG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYzExYTAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvbGludXgtMi42L21ybG9jay5oCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19TVVBQT1JUX01STE9DS19IX18KKyNkZWZpbmUgX19YRlNfU1VQUE9SVF9NUkxPQ0tfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgorCitlbnVtIHsgTVJfTk9ORSwgTVJfQUNDRVNTLCBNUl9VUERBVEUgfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXN0cnVjdCByd19zZW1hcGhvcmUJbXJfbG9jazsKKwlpbnQJCQltcl93cml0ZXI7Cit9IG1ybG9ja190OworCisjZGVmaW5lIG1yaW5pdChtcnAsIG5hbWUpCVwKKwkoIChtcnApLT5tcl93cml0ZXIgPSAwLCBpbml0X3J3c2VtKCYobXJwKS0+bXJfbG9jaykgKQorI2RlZmluZSBtcmxvY2tfaW5pdChtcnAsIHQsbixzKQltcmluaXQobXJwLCBuKQorI2RlZmluZSBtcmZyZWUobXJwKQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBtcmFjY2VzcyhtcnApCQltcmFjY2Vzc2YobXJwLCAwKQorI2RlZmluZSBtcnVwZGF0ZShtcnApCQltcnVwZGF0ZWYobXJwLCAwKQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXJhY2Nlc3NmKG1ybG9ja190ICptcnAsIGludCBmbGFncykKK3sKKwlkb3duX3JlYWQoJm1ycC0+bXJfbG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtcnVwZGF0ZWYobXJsb2NrX3QgKm1ycCwgaW50IGZsYWdzKQoreworCWRvd25fd3JpdGUoJm1ycC0+bXJfbG9jayk7CisJbXJwLT5tcl93cml0ZXIgPSAxOworfQorCitzdGF0aWMgaW5saW5lIGludCBtcnRyeWFjY2VzcyhtcmxvY2tfdCAqbXJwKQoreworCXJldHVybiBkb3duX3JlYWRfdHJ5bG9jaygmbXJwLT5tcl9sb2NrKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgbXJ0cnl1cGRhdGUobXJsb2NrX3QgKm1ycCkKK3sKKwlpZiAoIWRvd25fd3JpdGVfdHJ5bG9jaygmbXJwLT5tcl9sb2NrKSkKKwkJcmV0dXJuIDA7CisJbXJwLT5tcl93cml0ZXIgPSAxOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXJ1bmxvY2sobXJsb2NrX3QgKm1ycCkKK3sKKwlpZiAobXJwLT5tcl93cml0ZXIpIHsKKwkJbXJwLT5tcl93cml0ZXIgPSAwOworCQl1cF93cml0ZSgmbXJwLT5tcl9sb2NrKTsKKwl9IGVsc2UgeworCQl1cF9yZWFkKCZtcnAtPm1yX2xvY2spOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIG1yZGVtb3RlKG1ybG9ja190ICptcnApCit7CisJbXJwLT5tcl93cml0ZXIgPSAwOworCWRvd25ncmFkZV93cml0ZSgmbXJwLT5tcl9sb2NrKTsKK30KKworI2lmZGVmIERFQlVHCisvKgorICogRGVidWctb25seSByb3V0aW5lLCB3aXRob3V0IHNvbWUgcGxhdGZvcm0tc3BlY2lmaWMgYXNtIGNvZGUsIHdlIGNhbgorICogbm93IG9ubHkgYW5zd2VyIHJlcXVlc3RzIHJlZ2FyZGluZyB3aGV0aGVyIHdlIGhvbGQgdGhlIGxvY2sgZm9yIHdyaXRlCisgKiAocmVhZGVyIHN0YXRlIGlzIG91dHNpZGUgb3VyIHZpc2liaWxpdHksIHdlIG9ubHkgdHJhY2sgd3JpdGVyIHN0YXRlKS4KKyAqIE5vdGU6IG1lYW5zICFpc21ybG9ja2VkIHdvdWxkIGdpdmUgZmFsc2UgcG9zaXRpdmllcywgc28gZG9uJ3QgZG8gdGhhdC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgaXNtcmxvY2tlZChtcmxvY2tfdCAqbXJwLCBpbnQgdHlwZSkKK3sKKwlpZiAobXJwICYmIHR5cGUgPT0gTVJfVVBEQVRFKQorCQlyZXR1cm4gbXJwLT5tcl93cml0ZXI7CisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fWEZTX1NVUFBPUlRfTVJMT0NLX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi9tdXRleC5oIGIvZnMveGZzL2xpbnV4LTIuNi9tdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMjk2YmIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvbGludXgtMi42L211dGV4LmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfU1VQUE9SVF9NVVRFWF9IX18KKyNkZWZpbmUgX19YRlNfU1VQUE9SVF9NVVRFWF9IX18KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorCisvKgorICogTWFwIHRoZSBtdXRleCdlcyBmcm9tIElSSVggdG8gTGludXggc2VtYXBob3Jlcy4KKyAqCisgKiBEZXN0cm95IGp1c3Qgc2ltcGx5IGluaXRpYWxpemVzIHRvIC05OSB3aGljaCBzaG91bGQgYmxvY2sgYWxsIG90aGVyCisgKiBjYWxsZXJzLgorICovCisjZGVmaW5lIE1VVEVYX0RFRkFVTFQJCTB4MAordHlwZWRlZiBzdHJ1Y3Qgc2VtYXBob3JlCW11dGV4X3Q7CisKKyNkZWZpbmUgbXV0ZXhfaW5pdChsb2NrLCB0eXBlLCBuYW1lKQkJc2VtYV9pbml0KGxvY2ssIDEpCisjZGVmaW5lIG11dGV4X2Rlc3Ryb3kobG9jaykJCQlzZW1hX2luaXQobG9jaywgLTk5KQorI2RlZmluZSBtdXRleF9sb2NrKGxvY2ssIG51bSkJCQlkb3duKGxvY2spCisjZGVmaW5lIG11dGV4X3RyeWxvY2sobG9jaykJCQkoZG93bl90cnlsb2NrKGxvY2spID8gMCA6IDEpCisjZGVmaW5lIG11dGV4X3VubG9jayhsb2NrKQkJCXVwKGxvY2spCisKKyNlbmRpZiAvKiBfX1hGU19TVVBQT1JUX01VVEVYX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi9zZW1hLmggYi9mcy94ZnMvbGludXgtMi42L3NlbWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGI2N2I0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL2xpbnV4LTIuNi9zZW1hLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfU1VQUE9SVF9TRU1BX0hfXworI2RlZmluZSBfX1hGU19TVVBQT1JUX1NFTUFfSF9fCisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisKKy8qCisgKiBzZW1hX3Qgc3RydWN0dXJlIGp1c3QgbWFwcyB0byBzdHJ1Y3Qgc2VtYXBob3JlIGluIExpbnV4IGtlcm5lbC4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBzZW1hcGhvcmUgc2VtYV90OworCisjZGVmaW5lIGluaXRfc2VtYShzcCwgdmFsLCBjLCBkKQlzZW1hX2luaXQoc3AsIHZhbCkKKyNkZWZpbmUgaW5pdHNlbWEoc3AsIHZhbCkJCXNlbWFfaW5pdChzcCwgdmFsKQorI2RlZmluZSBpbml0bnNlbWEoc3AsIHZhbCwgbmFtZSkJc2VtYV9pbml0KHNwLCB2YWwpCisjZGVmaW5lIHBzZW1hKHNwLCBiKQkJCWRvd24oc3ApCisjZGVmaW5lIHZzZW1hKHNwKQkJCXVwKHNwKQorI2RlZmluZSB2YWx1c2VtYShzcCkJCQkoYXRvbWljX3JlYWQoJihzcCktPmNvdW50KSkKKyNkZWZpbmUgZnJlZXNlbWEoc2VtYSkKKworLyoKKyAqIE1hcCBjcHNlbWEgKHRyeSB0byBnZXQgdGhlIHNlbWEpIHRvIGRvd25fdHJ5bG9jay4gV2UgbmVlZCB0byBzd2l0Y2gKKyAqIHRoZSByZXR1cm4gdmFsdWVzIHNpbmNlIGNwc2VtYSByZXR1cm5zIDEgKGFjcXVpcmVkKSAwIChmYWlsZWQpIGFuZAorICogZG93bl90cnlsb2NrIHJldHVybnMgdGhlIHJldmVyc2UgMCAoYWNxdWlyZWQpIDEgKGZhaWxlZCkuCisgKi8KKworI2RlZmluZSBjcHNlbWEoc3ApCQkJKGRvd25fdHJ5bG9jayhzcCkgPyAwIDogMSkKKworLyoKKyAqIERpZG4ndCBkbyBjdnNlbWEoc3ApLiBOb3Qgc3VyZSBob3cgdG8gbWFwIHRoaXMgdG8gdXAvZG93bi8uLi4KKyAqIEl0IGRvZXMgYSB2c2VtYSBpZiB0aGUgdmFsdWVzIGlzIDwgMCBvdGhlciB3aXNlIG5vdGhpbmcuCisgKi8KKworI2VuZGlmIC8qIF9fWEZTX1NVUFBPUlRfU0VNQV9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYvc3Bpbi5oIGIvZnMveGZzL2xpbnV4LTIuNi9zcGluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNmNjBhMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9saW51eC0yLjYvc3Bpbi5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX1NVUFBPUlRfU1BJTl9IX18KKyNkZWZpbmUgX19YRlNfU1VQUE9SVF9TUElOX0hfXworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4JLyogcHJlZW1wdCBuZWVkcyB0aGlzICovCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworLyoKKyAqIE1hcCBsb2NrX3QgZnJvbSBJUklYIHRvIExpbnV4IHNwaW5sb2Nrcy4KKyAqCisgKiBXZSBkbyBub3QgbWFrZSB1c2Ugb2YgbG9ja190IGZyb20gaW50ZXJydXB0IGNvbnRleHQsIHNvIHdlIGRvIG5vdAorICogaGF2ZSB0byB3b3JyeSBhYm91dCBkaXNhYmxpbmcgaW50ZXJydXB0cyBhdCBhbGwgKHVubGlrZSBJUklYKS4KKyAqLworCit0eXBlZGVmIHNwaW5sb2NrX3QgbG9ja190OworCisjZGVmaW5lIFNQTERFQ0wocykJCQl1bnNpZ25lZCBsb25nIHMKKworI2RlZmluZSBzcGlubG9ja19pbml0KGxvY2ssIG5hbWUpCXNwaW5fbG9ja19pbml0KGxvY2spCisjZGVmaW5lCXNwaW5sb2NrX2Rlc3Ryb3kobG9jaykKKyNkZWZpbmUgbXV0ZXhfc3BpbmxvY2sobG9jaykJCSh7IHNwaW5fbG9jayhsb2NrKTsgMDsgfSkKKyNkZWZpbmUgbXV0ZXhfc3BpbnVubG9jayhsb2NrLCBzKQlkbyB7IHNwaW5fdW5sb2NrKGxvY2spOyAodm9pZClzOyB9IHdoaWxlICgwKQorI2RlZmluZSBuZXN0ZWRfc3BpbmxvY2sobG9jaykJCXNwaW5fbG9jayhsb2NrKQorI2RlZmluZSBuZXN0ZWRfc3BpbnVubG9jayhsb2NrKQkJc3Bpbl91bmxvY2sobG9jaykKKworI2VuZGlmIC8qIF9fWEZTX1NVUFBPUlRfU1BJTl9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYvc3YuaCBiL2ZzL3hmcy9saW51eC0yLjYvc3YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjFkMzE2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL2xpbnV4LTIuNi9zdi5oCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX1NVUFBPUlRfU1ZfSF9fCisjZGVmaW5lIF9fWEZTX1NVUFBPUlRfU1ZfSF9fCisKKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisvKgorICogU3luY2hyb25pc2F0aW9uIHZhcmlhYmxlcy4KKyAqCisgKiAoUGFyYW1ldGVycyAicHJpIiwgInN2ZiIgYW5kICJydHMiIGFyZSBub3QgaW1wbGVtZW50ZWQpCisgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc3ZfcyB7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdGVyczsKK30gc3ZfdDsKKworI2RlZmluZSBTVl9GSUZPCQkweDAJCS8qIHN2X3QgaXMgRklGTyB0eXBlICovCisjZGVmaW5lIFNWX0xJRk8JCTB4MgkJLyogc3ZfdCBpcyBMSUZPIHR5cGUgKi8KKyNkZWZpbmUgU1ZfUFJJTwkJMHg0CQkvKiBzdl90IGlzIFBSSU8gdHlwZSAqLworI2RlZmluZSBTVl9LRVlFRAkweDYJCS8qIHN2X3QgaXMgS0VZRUQgdHlwZSAqLworI2RlZmluZSBTVl9ERUZBVUxUICAgICAgU1ZfRklGTworCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfc3Zfd2FpdChzdl90ICpzdiwgc3BpbmxvY2tfdCAqbG9jaywgaW50IHN0YXRlLAorCQkJICAgICB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwlhZGRfd2FpdF9xdWV1ZV9leGNsdXNpdmUoJnN2LT53YWl0ZXJzLCAmd2FpdCk7CisJX19zZXRfY3VycmVudF9zdGF0ZShzdGF0ZSk7CisJc3Bpbl91bmxvY2sobG9jayk7CisKKwlzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOworCisJcmVtb3ZlX3dhaXRfcXVldWUoJnN2LT53YWl0ZXJzLCAmd2FpdCk7Cit9CisKKyNkZWZpbmUgaW5pdF9zdihzdix0eXBlLG5hbWUsZmxhZykgXAorCWluaXRfd2FpdHF1ZXVlX2hlYWQoJihzdiktPndhaXRlcnMpCisjZGVmaW5lIHN2X2luaXQoc3YsZmxhZyxuYW1lKSBcCisJaW5pdF93YWl0cXVldWVfaGVhZCgmKHN2KS0+d2FpdGVycykKKyNkZWZpbmUgc3ZfZGVzdHJveShzdikgXAorCS8qTk9USElORyovCisjZGVmaW5lIHN2X3dhaXQoc3YsIHByaSwgbG9jaywgcykgXAorCV9zdl93YWl0KHN2LCBsb2NrLCBUQVNLX1VOSU5URVJSVVBUSUJMRSwgTUFYX1NDSEVEVUxFX1RJTUVPVVQpCisjZGVmaW5lIHN2X3dhaXRfc2lnKHN2LCBwcmksIGxvY2ssIHMpICAgXAorCV9zdl93YWl0KHN2LCBsb2NrLCBUQVNLX0lOVEVSUlVQVElCTEUsIE1BWF9TQ0hFRFVMRV9USU1FT1VUKQorI2RlZmluZSBzdl90aW1lZHdhaXQoc3YsIHByaSwgbG9jaywgcywgc3ZmLCB0cywgcnRzKSBcCisJX3N2X3dhaXQoc3YsIGxvY2ssIFRBU0tfVU5JTlRFUlJVUFRJQkxFLCB0aW1lc3BlY190b19qaWZmaWVzKHRzKSkKKyNkZWZpbmUgc3ZfdGltZWR3YWl0X3NpZyhzdiwgcHJpLCBsb2NrLCBzLCBzdmYsIHRzLCBydHMpIFwKKwlfc3Zfd2FpdChzdiwgbG9jaywgVEFTS19JTlRFUlJVUFRJQkxFLCB0aW1lc3BlY190b19qaWZmaWVzKHRzKSkKKyNkZWZpbmUgc3Zfc2lnbmFsKHN2KSBcCisJd2FrZV91cCgmKHN2KS0+d2FpdGVycykKKyNkZWZpbmUgc3ZfYnJvYWRjYXN0KHN2KSBcCisJd2FrZV91cF9hbGwoJihzdiktPndhaXRlcnMpCisKKyNlbmRpZiAvKiBfX1hGU19TVVBQT1JUX1NWX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi90aW1lLmggYi9mcy94ZnMvbGludXgtMi42L3RpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzZmZDBmCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL2xpbnV4LTIuNi90aW1lLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfU1VQUE9SVF9USU1FX0hfXworI2RlZmluZSBfX1hGU19TVVBQT1JUX1RJTUVfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKwordHlwZWRlZiBzdHJ1Y3QgdGltZXNwZWMgdGltZXNwZWNfdDsKKworc3RhdGljIGlubGluZSB2b2lkIGRlbGF5KGxvbmcgdGlja3MpCit7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCXNjaGVkdWxlX3RpbWVvdXQodGlja3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbmFub3RpbWUoc3RydWN0IHRpbWVzcGVjICp0dnApCit7CisJKnR2cCA9IENVUlJFTlRfVElNRTsKK30KKworI2VuZGlmIC8qIF9fWEZTX1NVUFBPUlRfVElNRV9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2FvcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmE4NDc1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYW9wcy5jCkBAIC0wLDAgKzEsMTI3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4JIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19hbGxvYy5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorI2luY2x1ZGUgInhmc19ydy5oIgorI2luY2x1ZGUgInhmc19pb21hcC5oIgorI2luY2x1ZGUgPGxpbnV4L21wYWdlLmg+CisjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CisKK1NUQVRJQyB2b2lkIHhmc19jb3VudF9wYWdlX3N0YXRlKHN0cnVjdCBwYWdlICosIGludCAqLCBpbnQgKiwgaW50ICopOworU1RBVElDIHZvaWQgeGZzX2NvbnZlcnRfcGFnZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IHBhZ2UgKiwgeGZzX2lvbWFwX3QgKiwKKwkJc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMsIHZvaWQgKiwgaW50LCBpbnQpOworCisjaWYgZGVmaW5lZChYRlNfUldfVFJBQ0UpCit2b2lkCit4ZnNfcGFnZV90cmFjZSgKKwlpbnQJCXRhZywKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlLAorCXN0cnVjdCBwYWdlCSpwYWdlLAorCWludAkJbWFzaykKK3sKKwl4ZnNfaW5vZGVfdAkqaXA7CisJYmh2X2Rlc2NfdAkqYmRwOworCXZub2RlX3QJCSp2cCA9IExJTlZGU19HRVRfVlAoaW5vZGUpOworCWxvZmZfdAkJaXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CisJbG9mZl90CQlvZmZzZXQgPSAobG9mZl90KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisJaW50CQlkZWxhbGxvYyA9IC0xLCB1bm1hcHBlZCA9IC0xLCB1bndyaXR0ZW4gPSAtMTsKKworCWlmIChwYWdlX2hhc19idWZmZXJzKHBhZ2UpKQorCQl4ZnNfY291bnRfcGFnZV9zdGF0ZShwYWdlLCAmZGVsYWxsb2MsICZ1bm1hcHBlZCwgJnVud3JpdHRlbik7CisKKwliZHAgPSB2bl9iaHZfbG9va3VwKFZOX0JIVl9IRUFEKHZwKSwgJnhmc192bm9kZW9wcyk7CisJaXAgPSBYRlNfQkhWVE9JKGJkcCk7CisJaWYgKCFpcC0+aV9yd3RyYWNlKQorCQlyZXR1cm47CisKKwlrdHJhY2VfZW50ZXIoaXAtPmlfcnd0cmFjZSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpdGFnKSwKKwkJKHZvaWQgKilpcCwKKwkJKHZvaWQgKilpbm9kZSwKKwkJKHZvaWQgKilwYWdlLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZyltYXNrKSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKChpcC0+aV9kLmRpX3NpemUgPj4gMzIpICYgMHhmZmZmZmZmZikpLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoaXAtPmlfZC5kaV9zaXplICYgMHhmZmZmZmZmZikpLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoKGlzaXplID4+IDMyKSAmIDB4ZmZmZmZmZmYpKSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKGlzaXplICYgMHhmZmZmZmZmZikpLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoKG9mZnNldCA+PiAzMikgJiAweGZmZmZmZmZmKSksCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKShvZmZzZXQgJiAweGZmZmZmZmZmKSksCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKWRlbGFsbG9jKSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpdW5tYXBwZWQpLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZyl1bndyaXR0ZW4pLAorCQkodm9pZCAqKU5VTEwsCisJCSh2b2lkICopTlVMTCk7Cit9CisjZWxzZQorI2RlZmluZSB4ZnNfcGFnZV90cmFjZSh0YWcsIGlub2RlLCBwYWdlLCBtYXNrKQorI2VuZGlmCisKK3ZvaWQKK2xpbnZmc191bndyaXR0ZW5fZG9uZSgKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoLAorCWludAkJCXVwdG9kYXRlKQoreworCXhmc19idWZfdAkJKnBiID0gKHhmc19idWZfdCAqKWJoLT5iX3ByaXZhdGU7CisKKwlBU1NFUlQoYnVmZmVyX3Vud3JpdHRlbihiaCkpOworCWJoLT5iX2VuZF9pbyA9IE5VTEw7CisJY2xlYXJfYnVmZmVyX3Vud3JpdHRlbihiaCk7CisJaWYgKCF1cHRvZGF0ZSkKKwkJcGFnZWJ1Zl9pb2Vycm9yKHBiLCBFSU8pOworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZwYi0+cGJfaW9fcmVtYWluaW5nKSA9PSAxKSB7CisJCXBhZ2VidWZfaW9kb25lKHBiLCAxLCAxKTsKKwl9CisJZW5kX2J1ZmZlcl9hc3luY193cml0ZShiaCwgdXB0b2RhdGUpOworfQorCisvKgorICogSXNzdWUgdHJhbnNhY3Rpb25zIHRvIGNvbnZlcnQgYSBidWZmZXIgcmFuZ2UgZnJvbSB1bndyaXR0ZW4KKyAqIHRvIHdyaXR0ZW4gZXh0ZW50cyAoYnVmZmVyZWQgSU8pLgorICovCitTVEFUSUMgdm9pZAorbGludmZzX3Vud3JpdHRlbl9jb252ZXJ0KAorCXhmc19idWZfdAkqYnApCit7CisJdm5vZGVfdAkJKnZwID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHZub2RlX3QgKik7CisJaW50CQllcnJvcjsKKworCUJVR19PTihhdG9taWNfcmVhZCgmYnAtPnBiX2hvbGQpIDwgMSk7CisJVk9QX0JNQVAodnAsIFhGU19CVUZfT0ZGU0VUKGJwKSwgWEZTX0JVRl9TSVpFKGJwKSwKKwkJCUJNQVBJX1VOV1JJVFRFTiwgTlVMTCwgTlVMTCwgZXJyb3IpOworCVhGU19CVUZfU0VUX0ZTUFJJVkFURShicCwgTlVMTCk7CisJWEZTX0JVRl9DTFJfSU9ET05FX0ZVTkMoYnApOworCVhGU19CVUZfVU5EQVRBSU8oYnApOworCWlwdXQoTElOVkZTX0dFVF9JUCh2cCkpOworCXBhZ2VidWZfaW9kb25lKGJwLCAwLCAwKTsKK30KKworLyoKKyAqIElzc3VlIHRyYW5zYWN0aW9ucyB0byBjb252ZXJ0IGEgYnVmZmVyIHJhbmdlIGZyb20gdW53cml0dGVuCisgKiB0byB3cml0dGVuIGV4dGVudHMgKGRpcmVjdCBJTykuCisgKi8KK1NUQVRJQyB2b2lkCitsaW52ZnNfdW53cml0dGVuX2NvbnZlcnRfZGlyZWN0KAorCXN0cnVjdCBpbm9kZQkqaW5vZGUsCisJbG9mZl90CQlvZmZzZXQsCisJc3NpemVfdAkJc2l6ZSwKKwl2b2lkCQkqcHJpdmF0ZSkKK3sKKwlBU1NFUlQoIXByaXZhdGUgfHwgaW5vZGUgPT0gKHN0cnVjdCBpbm9kZSAqKXByaXZhdGUpOworCisJLyogcHJpdmF0ZSBpbmRpY2F0ZXMgYW4gdW53cml0dGVuIGV4dGVudCBsYXkgYmVuZWF0aCB0aGlzIElPICovCisJaWYgKHByaXZhdGUgJiYgc2l6ZSA+IDApIHsKKwkJdm5vZGVfdAkqdnAgPSBMSU5WRlNfR0VUX1ZQKGlub2RlKTsKKwkJaW50CWVycm9yOworCisJCVZPUF9CTUFQKHZwLCBvZmZzZXQsIHNpemUsIEJNQVBJX1VOV1JJVFRFTiwgTlVMTCwgTlVMTCwgZXJyb3IpOworCX0KK30KKworU1RBVElDIGludAoreGZzX21hcF9ibG9ja3MoCisJc3RydWN0IGlub2RlCQkqaW5vZGUsCisJbG9mZl90CQkJb2Zmc2V0LAorCXNzaXplX3QJCQljb3VudCwKKwl4ZnNfaW9tYXBfdAkJKm1hcHAsCisJaW50CQkJZmxhZ3MpCit7CisJdm5vZGVfdAkJCSp2cCA9IExJTlZGU19HRVRfVlAoaW5vZGUpOworCWludAkJCWVycm9yLCBubWFwcyA9IDE7CisKKwlWT1BfQk1BUCh2cCwgb2Zmc2V0LCBjb3VudCwgZmxhZ3MsIG1hcHAsICZubWFwcywgZXJyb3IpOworCWlmICghZXJyb3IgJiYgKGZsYWdzICYgKEJNQVBJX1dSSVRFfEJNQVBJX0FMTE9DQVRFKSkpCisJCVZNT0RJRlkodnApOworCXJldHVybiAtZXJyb3I7Cit9CisKKy8qCisgKiBGaW5kcyB0aGUgY29ycmVzcG9uZGluZyBtYXBwaW5nIGluIGJsb2NrIEBtYXAgYXJyYXkgb2YgdGhlCisgKiBnaXZlbiBAb2Zmc2V0IHdpdGhpbiBhIEBwYWdlLgorICovCitTVEFUSUMgeGZzX2lvbWFwX3QgKgoreGZzX29mZnNldF90b19tYXAoCisJc3RydWN0IHBhZ2UJCSpwYWdlLAorCXhmc19pb21hcF90CQkqaW9tYXBwLAorCXVuc2lnbmVkIGxvbmcJCW9mZnNldCkKK3sKKwlsb2ZmX3QJCQlmdWxsX29mZnNldDsJLyogb2Zmc2V0IGZyb20gc3RhcnQgb2YgZmlsZSAqLworCisJQVNTRVJUKG9mZnNldCA8IFBBR0VfQ0FDSEVfU0laRSk7CisKKwlmdWxsX29mZnNldCA9IHBhZ2UtPmluZGV4OwkJLyogTkI6IHVzaW5nIDY0Yml0IG51bWJlciAqLworCWZ1bGxfb2Zmc2V0IDw8PSBQQUdFX0NBQ0hFX1NISUZUOwkvKiBvZmZzZXQgZnJvbSBmaWxlIHN0YXJ0ICovCisJZnVsbF9vZmZzZXQgKz0gb2Zmc2V0OwkJCS8qIG9mZnNldCBmcm9tIHBhZ2Ugc3RhcnQgKi8KKworCWlmIChmdWxsX29mZnNldCA8IGlvbWFwcC0+aW9tYXBfb2Zmc2V0KQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoaW9tYXBwLT5pb21hcF9vZmZzZXQgKyAoaW9tYXBwLT5pb21hcF9ic2l6ZSAtMSkgPj0gZnVsbF9vZmZzZXQpCisJCXJldHVybiBpb21hcHA7CisJcmV0dXJuIE5VTEw7Cit9CisKK1NUQVRJQyB2b2lkCit4ZnNfbWFwX2F0X29mZnNldCgKKwlzdHJ1Y3QgcGFnZQkJKnBhZ2UsCisJc3RydWN0IGJ1ZmZlcl9oZWFkCSpiaCwKKwl1bnNpZ25lZCBsb25nCQlvZmZzZXQsCisJaW50CQkJYmxvY2tfYml0cywKKwl4ZnNfaW9tYXBfdAkJKmlvbWFwcCkKK3sKKwl4ZnNfZGFkZHJfdAkJYm47CisJbG9mZl90CQkJZGVsdGE7CisJaW50CQkJc2VjdG9yX3NoaWZ0OworCisJQVNTRVJUKCEoaW9tYXBwLT5pb21hcF9mbGFncyAmIElPTUFQX0hPTEUpKTsKKwlBU1NFUlQoIShpb21hcHAtPmlvbWFwX2ZsYWdzICYgSU9NQVBfREVMQVkpKTsKKwlBU1NFUlQoaW9tYXBwLT5pb21hcF9ibiAhPSBJT01BUF9EQUREUl9OVUxMKTsKKworCWRlbHRhID0gcGFnZS0+aW5kZXg7CisJZGVsdGEgPDw9IFBBR0VfQ0FDSEVfU0hJRlQ7CisJZGVsdGEgKz0gb2Zmc2V0OworCWRlbHRhIC09IGlvbWFwcC0+aW9tYXBfb2Zmc2V0OworCWRlbHRhID4+PSBibG9ja19iaXRzOworCisJc2VjdG9yX3NoaWZ0ID0gYmxvY2tfYml0cyAtIEJCU0hJRlQ7CisJYm4gPSBpb21hcHAtPmlvbWFwX2JuID4+IHNlY3Rvcl9zaGlmdDsKKwlibiArPSBkZWx0YTsKKwlCVUdfT04oIWJuICYmICEoaW9tYXBwLT5pb21hcF9mbGFncyAmIElPTUFQX1JFQUxUSU1FKSk7CisJQVNTRVJUKChibiA8PCBzZWN0b3Jfc2hpZnQpID49IGlvbWFwcC0+aW9tYXBfYm4pOworCisJbG9ja19idWZmZXIoYmgpOworCWJoLT5iX2Jsb2NrbnIgPSBibjsKKwliaC0+Yl9iZGV2ID0gaW9tYXBwLT5pb21hcF90YXJnZXQtPnBicl9iZGV2OworCXNldF9idWZmZXJfbWFwcGVkKGJoKTsKKwljbGVhcl9idWZmZXJfZGVsYXkoYmgpOworfQorCisvKgorICogTG9vayBmb3IgYSBwYWdlIGF0IGluZGV4IHdoaWNoIGlzIHVubG9ja2VkIGFuZCBjb250YWlucyBvdXIKKyAqIHVud3JpdHRlbiBleHRlbnQgZmxhZ2dlZCBidWZmZXJzIGF0IGl0cyBoZWFkLiAgUmV0dXJucyBwYWdlCisgKiBsb2NrZWQgYW5kIHdpdGggYW4gZXh0cmEgcmVmZXJlbmNlIGNvdW50LCBhbmQgbGVuZ3RoIG9mIHRoZQorICogdW53cml0dGVuIGV4dGVudCBjb21wb25lbnQgb24gdGhpcyBwYWdlIHRoYXQgd2UgY2FuIHdyaXRlLAorICogaW4gdW5pdHMgb2YgZmlsZXN5c3RlbSBibG9ja3MuCisgKi8KK1NUQVRJQyBzdHJ1Y3QgcGFnZSAqCit4ZnNfcHJvYmVfdW53cml0dGVuX3BhZ2UoCisJc3RydWN0IGFkZHJlc3Nfc3BhY2UJKm1hcHBpbmcsCisJcGdvZmZfdAkJCWluZGV4LAorCXhmc19pb21hcF90CQkqaW9tYXBwLAorCXhmc19idWZfdAkJKnBiLAorCXVuc2lnbmVkIGxvbmcJCW1heF9vZmZzZXQsCisJdW5zaWduZWQgbG9uZwkJKmZzYnMsCisJdW5zaWduZWQgaW50ICAgICAgICAgICAgYmJpdHMpCit7CisJc3RydWN0IHBhZ2UJCSpwYWdlOworCisJcGFnZSA9IGZpbmRfdHJ5bG9ja19wYWdlKG1hcHBpbmcsIGluZGV4KTsKKwlpZiAoIXBhZ2UpCisJCXJldHVybiBOVUxMOworCWlmIChQYWdlV3JpdGViYWNrKHBhZ2UpKQorCQlnb3RvIG91dDsKKworCWlmIChwYWdlLT5tYXBwaW5nICYmIHBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpIHsKKwkJc3RydWN0IGJ1ZmZlcl9oZWFkCSpiaCwgKmhlYWQ7CisJCXVuc2lnbmVkIGxvbmcJCXBfb2Zmc2V0ID0gMDsKKworCQkqZnNicyA9IDA7CisJCWJoID0gaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwkJZG8geworCQkJaWYgKCFidWZmZXJfdW53cml0dGVuKGJoKSB8fCAhYnVmZmVyX3VwdG9kYXRlKGJoKSkKKwkJCQlicmVhazsKKwkJCWlmICgheGZzX29mZnNldF90b19tYXAocGFnZSwgaW9tYXBwLCBwX29mZnNldCkpCisJCQkJYnJlYWs7CisJCQlpZiAocF9vZmZzZXQgPj0gbWF4X29mZnNldCkKKwkJCQlicmVhazsKKwkJCXhmc19tYXBfYXRfb2Zmc2V0KHBhZ2UsIGJoLCBwX29mZnNldCwgYmJpdHMsIGlvbWFwcCk7CisJCQlzZXRfYnVmZmVyX3Vud3JpdHRlbl9pbyhiaCk7CisJCQliaC0+Yl9wcml2YXRlID0gcGI7CisJCQlwX29mZnNldCArPSBiaC0+Yl9zaXplOworCQkJKCpmc2JzKSsrOworCQl9IHdoaWxlICgoYmggPSBiaC0+Yl90aGlzX3BhZ2UpICE9IGhlYWQpOworCisJCWlmIChwX29mZnNldCkKKwkJCXJldHVybiBwYWdlOworCX0KKworb3V0OgorCXVubG9ja19wYWdlKHBhZ2UpOworCXJldHVybiBOVUxMOworfQorCisvKgorICogTG9vayBmb3IgYSBwYWdlIGF0IGluZGV4IHdoaWNoIGlzIHVubG9ja2VkIGFuZCBub3QgbWFwcGVkCisgKiB5ZXQgLSBjbHVzdGVyaW5nIGZvciBtbWFwIHdyaXRlIGNhc2UuCisgKi8KK1NUQVRJQyB1bnNpZ25lZCBpbnQKK3hmc19wcm9iZV91bm1hcHBlZF9wYWdlKAorCXN0cnVjdCBhZGRyZXNzX3NwYWNlCSptYXBwaW5nLAorCXBnb2ZmX3QJCQlpbmRleCwKKwl1bnNpZ25lZCBpbnQJCXBnX29mZnNldCkKK3sKKwlzdHJ1Y3QgcGFnZQkJKnBhZ2U7CisJaW50CQkJcmV0ID0gMDsKKworCXBhZ2UgPSBmaW5kX3RyeWxvY2tfcGFnZShtYXBwaW5nLCBpbmRleCk7CisJaWYgKCFwYWdlKQorCQlyZXR1cm4gMDsKKwlpZiAoUGFnZVdyaXRlYmFjayhwYWdlKSkKKwkJZ290byBvdXQ7CisKKwlpZiAocGFnZS0+bWFwcGluZyAmJiBQYWdlRGlydHkocGFnZSkpIHsKKwkJaWYgKHBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpIHsKKwkJCXN0cnVjdCBidWZmZXJfaGVhZAkqYmgsICpoZWFkOworCisJCQliaCA9IGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJCQlkbyB7CisJCQkJaWYgKGJ1ZmZlcl9tYXBwZWQoYmgpIHx8ICFidWZmZXJfdXB0b2RhdGUoYmgpKQorCQkJCQlicmVhazsKKwkJCQlyZXQgKz0gYmgtPmJfc2l6ZTsKKwkJCQlpZiAocmV0ID49IHBnX29mZnNldCkKKwkJCQkJYnJlYWs7CisJCQl9IHdoaWxlICgoYmggPSBiaC0+Yl90aGlzX3BhZ2UpICE9IGhlYWQpOworCQl9IGVsc2UKKwkJCXJldCA9IFBBR0VfQ0FDSEVfU0laRTsKKwl9CisKK291dDoKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXR1cm4gcmV0OworfQorCitTVEFUSUMgdW5zaWduZWQgaW50Cit4ZnNfcHJvYmVfdW5tYXBwZWRfY2x1c3RlcigKKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZSwKKwlzdHJ1Y3QgcGFnZQkJKnN0YXJ0cGFnZSwKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoLAorCXN0cnVjdCBidWZmZXJfaGVhZAkqaGVhZCkKK3sKKwlwZ29mZl90CQkJdGluZGV4LCB0bGFzdCwgdGxvZmY7CisJdW5zaWduZWQgaW50CQlwZ19vZmZzZXQsIGxlbiwgdG90YWwgPSAwOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlCSptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKKworCS8qIEZpcnN0IHN1bSBmb3J3YXJkcyBpbiB0aGlzIHBhZ2UgKi8KKwlkbyB7CisJCWlmIChidWZmZXJfbWFwcGVkKGJoKSkKKwkJCWJyZWFrOworCQl0b3RhbCArPSBiaC0+Yl9zaXplOworCX0gd2hpbGUgKChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CisKKwkvKiBJZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHBhZ2UsIHN1bSBmb3J3YXJkcyBpbgorCSAqIGZvbGxvd2luZyBwYWdlcy4KKwkgKi8KKwlpZiAoYmggPT0gaGVhZCkgeworCQl0bGFzdCA9IGlfc2l6ZV9yZWFkKGlub2RlKSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCQkvKiBQcnVuZSB0aGlzIGJhY2sgdG8gYXZvaWQgcGF0aG9sb2dpY2FsIGJlaGF2aW9yICovCisJCXRsb2ZmID0gbWluKHRsYXN0LCBzdGFydHBhZ2UtPmluZGV4ICsgNjQpOworCQlmb3IgKHRpbmRleCA9IHN0YXJ0cGFnZS0+aW5kZXggKyAxOyB0aW5kZXggPCB0bG9mZjsgdGluZGV4KyspIHsKKwkJCWxlbiA9IHhmc19wcm9iZV91bm1hcHBlZF9wYWdlKG1hcHBpbmcsIHRpbmRleCwKKwkJCQkJCQlQQUdFX0NBQ0hFX1NJWkUpOworCQkJaWYgKCFsZW4pCisJCQkJcmV0dXJuIHRvdGFsOworCQkJdG90YWwgKz0gbGVuOworCQl9CisJCWlmICh0aW5kZXggPT0gdGxhc3QgJiYKKwkJICAgIChwZ19vZmZzZXQgPSBpX3NpemVfcmVhZChpbm9kZSkgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSkpKSB7CisJCQl0b3RhbCArPSB4ZnNfcHJvYmVfdW5tYXBwZWRfcGFnZShtYXBwaW5nLAorCQkJCQkJCXRpbmRleCwgcGdfb2Zmc2V0KTsKKwkJfQorCX0KKwlyZXR1cm4gdG90YWw7Cit9CisKKy8qCisgKiBQcm9iZSBmb3IgYSBnaXZlbiBwYWdlIChpbmRleCkgaW4gdGhlIGlub2RlIGFuZCB0ZXN0IGlmIGl0IGlzIGRlbGF5ZWQKKyAqIGFuZCB3aXRob3V0IHVud3JpdHRlbiBidWZmZXJzLiAgUmV0dXJucyBwYWdlIGxvY2tlZCBhbmQgd2l0aCBhbiBleHRyYQorICogcmVmZXJlbmNlIGNvdW50LgorICovCitTVEFUSUMgc3RydWN0IHBhZ2UgKgoreGZzX3Byb2JlX2RlbGFsbG9jX3BhZ2UoCisJc3RydWN0IGlub2RlCQkqaW5vZGUsCisJcGdvZmZfdAkJCWluZGV4KQoreworCXN0cnVjdCBwYWdlCQkqcGFnZTsKKworCXBhZ2UgPSBmaW5kX3RyeWxvY2tfcGFnZShpbm9kZS0+aV9tYXBwaW5nLCBpbmRleCk7CisJaWYgKCFwYWdlKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoUGFnZVdyaXRlYmFjayhwYWdlKSkKKwkJZ290byBvdXQ7CisKKwlpZiAocGFnZS0+bWFwcGluZyAmJiBwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSB7CisJCXN0cnVjdCBidWZmZXJfaGVhZAkqYmgsICpoZWFkOworCQlpbnQJCQlhY2NlcHRhYmxlID0gMDsKKworCQliaCA9IGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJCWRvIHsKKwkJCWlmIChidWZmZXJfdW53cml0dGVuKGJoKSkgeworCQkJCWFjY2VwdGFibGUgPSAwOworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmIChidWZmZXJfZGVsYXkoYmgpKSB7CisJCQkJYWNjZXB0YWJsZSA9IDE7CisJCQl9CisJCX0gd2hpbGUgKChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CisKKwkJaWYgKGFjY2VwdGFibGUpCisJCQlyZXR1cm4gcGFnZTsKKwl9CisKK291dDoKKwl1bmxvY2tfcGFnZShwYWdlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworU1RBVElDIGludAoreGZzX21hcF91bndyaXR0ZW4oCisJc3RydWN0IGlub2RlCQkqaW5vZGUsCisJc3RydWN0IHBhZ2UJCSpzdGFydF9wYWdlLAorCXN0cnVjdCBidWZmZXJfaGVhZAkqaGVhZCwKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmN1cnIsCisJdW5zaWduZWQgbG9uZwkJcF9vZmZzZXQsCisJaW50CQkJYmxvY2tfYml0cywKKwl4ZnNfaW9tYXBfdAkJKmlvbWFwcCwKKwlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYywKKwlpbnQJCQlzdGFydGlvLAorCWludAkJCWFsbF9iaCkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoID0gY3VycjsKKwl4ZnNfaW9tYXBfdAkJKnRtcDsKKwl4ZnNfYnVmX3QJCSpwYjsKKwlsb2ZmX3QJCQlvZmZzZXQsIHNpemU7CisJdW5zaWduZWQgbG9uZwkJbmJsb2NrcyA9IDA7CisKKwlvZmZzZXQgPSBzdGFydF9wYWdlLT5pbmRleDsKKwlvZmZzZXQgPDw9IFBBR0VfQ0FDSEVfU0hJRlQ7CisJb2Zmc2V0ICs9IHBfb2Zmc2V0OworCisJLyogZ2V0IGFuICJlbXB0eSIgcGFnZWJ1ZiB0byBtYW5hZ2UgSU8gY29tcGxldGlvbgorCSAqIFByb3BlciB2YWx1ZXMgd2lsbCBiZSBzZXQgYmVmb3JlIHJldHVybmluZyAqLworCXBiID0gcGFnZWJ1Zl9sb29rdXAoaW9tYXBwLT5pb21hcF90YXJnZXQsIDAsIDAsIDApOworCWlmICghcGIpCisJCXJldHVybiAtRUFHQUlOOworCisJLyogVGFrZSBhIHJlZmVyZW5jZSB0byB0aGUgaW5vZGUgdG8gcHJldmVudCBpdCBmcm9tCisJICogYmVpbmcgcmVjbGFpbWVkIHdoaWxlIHdlIGhhdmUgb3V0c3RhbmRpbmcgdW53cml0dGVuCisJICogZXh0ZW50IElPIG9uIGl0LgorCSAqLworCWlmICgoaWdyYWIoaW5vZGUpKSAhPSBpbm9kZSkgeworCQlwYWdlYnVmX2ZyZWUocGIpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwkvKiBTZXQgdGhlIGNvdW50IHRvIDEgaW5pdGlhbGx5LCB0aGlzIHdpbGwgc3RvcCBhbiBJL08KKwkgKiBjb21wbGV0aW9uIGNhbGxvdXQgd2hpY2ggaGFwcGVucyBiZWZvcmUgd2UgaGF2ZSBzdGFydGVkCisJICogYWxsIHRoZSBJL08gZnJvbSBjYWxsaW5nIHBhZ2VidWZfaW9kb25lIHRvbyBlYXJseS4KKwkgKi8KKwlhdG9taWNfc2V0KCZwYi0+cGJfaW9fcmVtYWluaW5nLCAxKTsKKworCS8qIEZpcnN0IG1hcCBmb3J3YXJkcyBpbiB0aGUgcGFnZSBjb25zZWN1dGl2ZSBidWZmZXJzCisJICogY292ZXJpbmcgdGhpcyB1bndyaXR0ZW4gZXh0ZW50CisJICovCisJZG8geworCQlpZiAoIWJ1ZmZlcl91bndyaXR0ZW4oYmgpKQorCQkJYnJlYWs7CisJCXRtcCA9IHhmc19vZmZzZXRfdG9fbWFwKHN0YXJ0X3BhZ2UsIGlvbWFwcCwgcF9vZmZzZXQpOworCQlpZiAoIXRtcCkKKwkJCWJyZWFrOworCQl4ZnNfbWFwX2F0X29mZnNldChzdGFydF9wYWdlLCBiaCwgcF9vZmZzZXQsIGJsb2NrX2JpdHMsIGlvbWFwcCk7CisJCXNldF9idWZmZXJfdW53cml0dGVuX2lvKGJoKTsKKwkJYmgtPmJfcHJpdmF0ZSA9IHBiOworCQlwX29mZnNldCArPSBiaC0+Yl9zaXplOworCQluYmxvY2tzKys7CisJfSB3aGlsZSAoKGJoID0gYmgtPmJfdGhpc19wYWdlKSAhPSBoZWFkKTsKKworCWF0b21pY19hZGQobmJsb2NrcywgJnBiLT5wYl9pb19yZW1haW5pbmcpOworCisJLyogSWYgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBwYWdlLCBtYXAgZm9yd2FyZHMgaW4gYW55CisJICogZm9sbG93aW5nIHBhZ2VzIHdoaWNoIGFyZSBhbHNvIGNvdmVyZWQgYnkgdGhpcyBleHRlbnQuCisJICovCisJaWYgKGJoID09IGhlYWQpIHsKKwkJc3RydWN0IGFkZHJlc3Nfc3BhY2UJKm1hcHBpbmcgPSBpbm9kZS0+aV9tYXBwaW5nOworCQlwZ29mZl90CQkJdGluZGV4LCB0bG9mZiwgdGxhc3Q7CisJCXVuc2lnbmVkIGxvbmcJCWJzOworCQl1bnNpZ25lZCBpbnQJCXBnX29mZnNldCwgYmJpdHMgPSBpbm9kZS0+aV9ibGtiaXRzOworCQlzdHJ1Y3QgcGFnZQkJKnBhZ2U7CisKKwkJdGxhc3QgPSBpX3NpemVfcmVhZChpbm9kZSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwkJdGxvZmYgPSAoaW9tYXBwLT5pb21hcF9vZmZzZXQgKyBpb21hcHAtPmlvbWFwX2JzaXplKSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCQl0bG9mZiA9IG1pbih0bGFzdCwgdGxvZmYpOworCQlmb3IgKHRpbmRleCA9IHN0YXJ0X3BhZ2UtPmluZGV4ICsgMTsgdGluZGV4IDwgdGxvZmY7IHRpbmRleCsrKSB7CisJCQlwYWdlID0geGZzX3Byb2JlX3Vud3JpdHRlbl9wYWdlKG1hcHBpbmcsCisJCQkJCQl0aW5kZXgsIGlvbWFwcCwgcGIsCisJCQkJCQlQQUdFX0NBQ0hFX1NJWkUsICZicywgYmJpdHMpOworCQkJaWYgKCFwYWdlKQorCQkJCWJyZWFrOworCQkJbmJsb2NrcyArPSBiczsKKwkJCWF0b21pY19hZGQoYnMsICZwYi0+cGJfaW9fcmVtYWluaW5nKTsKKwkJCXhmc19jb252ZXJ0X3BhZ2UoaW5vZGUsIHBhZ2UsIGlvbWFwcCwgd2JjLCBwYiwKKwkJCQkJCQlzdGFydGlvLCBhbGxfYmgpOworCQkJLyogc3RvcCBpZiBjb252ZXJ0aW5nIHRoZSBuZXh0IHBhZ2UgbWlnaHQgYWRkCisJCQkgKiBlbm91Z2ggYmxvY2tzIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgYnl0ZQorCQkJICogY291bnQgd29uJ3QgZml0IGluIG91ciB1bG9uZyBwYWdlIGJ1ZiBsZW5ndGggKi8KKwkJCWlmIChuYmxvY2tzID49ICgoVUxPTkdfTUFYIC0gUEFHRV9TSVpFKSA+PiBibG9ja19iaXRzKSkKKwkJCQlnb3RvIGVub3VnaDsKKwkJfQorCisJCWlmICh0aW5kZXggPT0gdGxhc3QgJiYKKwkJICAgIChwZ19vZmZzZXQgPSAoaV9zaXplX3JlYWQoaW5vZGUpICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKSkpIHsKKwkJCXBhZ2UgPSB4ZnNfcHJvYmVfdW53cml0dGVuX3BhZ2UobWFwcGluZywKKwkJCQkJCQl0aW5kZXgsIGlvbWFwcCwgcGIsCisJCQkJCQkJcGdfb2Zmc2V0LCAmYnMsIGJiaXRzKTsKKwkJCWlmIChwYWdlKSB7CisJCQkJbmJsb2NrcyArPSBiczsKKwkJCQlhdG9taWNfYWRkKGJzLCAmcGItPnBiX2lvX3JlbWFpbmluZyk7CisJCQkJeGZzX2NvbnZlcnRfcGFnZShpbm9kZSwgcGFnZSwgaW9tYXBwLCB3YmMsIHBiLAorCQkJCQkJCXN0YXJ0aW8sIGFsbF9iaCk7CisJCQkJaWYgKG5ibG9ja3MgPj0gKChVTE9OR19NQVggLSBQQUdFX1NJWkUpID4+IGJsb2NrX2JpdHMpKQorCQkJCQlnb3RvIGVub3VnaDsKKwkJCX0KKwkJfQorCX0KKworZW5vdWdoOgorCXNpemUgPSBuYmxvY2tzOwkJLyogTkI6IHVzaW5nIDY0Yml0IG51bWJlciBoZXJlICovCisJc2l6ZSA8PD0gYmxvY2tfYml0czsJLyogY29udmVydCBmc2IncyB0byBieXRlIHJhbmdlICovCisKKwlYRlNfQlVGX0RBVEFJTyhwYik7CisJWEZTX0JVRl9BU1lOQyhwYik7CisJWEZTX0JVRl9TRVRfU0laRShwYiwgc2l6ZSk7CisJWEZTX0JVRl9TRVRfQ09VTlQocGIsIHNpemUpOworCVhGU19CVUZfU0VUX09GRlNFVChwYiwgb2Zmc2V0KTsKKwlYRlNfQlVGX1NFVF9GU1BSSVZBVEUocGIsIExJTlZGU19HRVRfVlAoaW5vZGUpKTsKKwlYRlNfQlVGX1NFVF9JT0RPTkVfRlVOQyhwYiwgbGludmZzX3Vud3JpdHRlbl9jb252ZXJ0KTsKKworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZwYi0+cGJfaW9fcmVtYWluaW5nKSA9PSAxKSB7CisJCXBhZ2VidWZfaW9kb25lKHBiLCAxLCAxKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworU1RBVElDIHZvaWQKK3hmc19zdWJtaXRfcGFnZSgKKwlzdHJ1Y3QgcGFnZQkJKnBhZ2UsCisJc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMsCisJc3RydWN0IGJ1ZmZlcl9oZWFkCSpiaF9hcnJbXSwKKwlpbnQJCQliaF9jb3VudCwKKwlpbnQJCQlwcm9iZWRfcGFnZSwKKwlpbnQJCQljbGVhcl9kaXJ0eSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2hlYWQJKmJoOworCWludAkJCWk7CisKKwlCVUdfT04oUGFnZVdyaXRlYmFjayhwYWdlKSk7CisJc2V0X3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCWlmIChjbGVhcl9kaXJ0eSkKKwkJY2xlYXJfcGFnZV9kaXJ0eShwYWdlKTsKKwl1bmxvY2tfcGFnZShwYWdlKTsKKworCWlmIChiaF9jb3VudCkgeworCQlmb3IgKGkgPSAwOyBpIDwgYmhfY291bnQ7IGkrKykgeworCQkJYmggPSBiaF9hcnJbaV07CisJCQltYXJrX2J1ZmZlcl9hc3luY193cml0ZShiaCk7CisJCQlpZiAoYnVmZmVyX3Vud3JpdHRlbihiaCkpCisJCQkJc2V0X2J1ZmZlcl91bndyaXR0ZW5faW8oYmgpOworCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CisJCQljbGVhcl9idWZmZXJfZGlydHkoYmgpOworCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IGJoX2NvdW50OyBpKyspCisJCQlzdWJtaXRfYmgoV1JJVEUsIGJoX2FycltpXSk7CisKKwkJaWYgKHByb2JlZF9wYWdlICYmIGNsZWFyX2RpcnR5KQorCQkJd2JjLT5ucl90b193cml0ZS0tOwkvKiBXcm90ZSBhbiAiZXh0cmEiIHBhZ2UgKi8KKwl9IGVsc2UgeworCQllbmRfcGFnZV93cml0ZWJhY2socGFnZSk7CisJCXdiYy0+cGFnZXNfc2tpcHBlZCsrOwkvKiBXZSBkaWRuJ3Qgd3JpdGUgdGhpcyBwYWdlICovCisJfQorfQorCisvKgorICogQWxsb2NhdGUgJiBtYXAgYnVmZmVycyBmb3IgcGFnZSBnaXZlbiB0aGUgZXh0ZW50IG1hcC4gV3JpdGUgaXQgb3V0LgorICogZXhjZXB0IGZvciB0aGUgb3JpZ2luYWwgcGFnZSBvZiBhIHdyaXRlcGFnZSwgdGhpcyBpcyBjYWxsZWQgb24KKyAqIGRlbGFsbG9jL3Vud3JpdHRlbiBwYWdlcyBvbmx5LCBmb3IgdGhlIG9yaWdpbmFsIHBhZ2UgaXQgaXMgcG9zc2libGUKKyAqIHRoYXQgdGhlIHBhZ2UgaGFzIG5vIG1hcHBpbmcgYXQgYWxsLgorICovCitTVEFUSUMgdm9pZAoreGZzX2NvbnZlcnRfcGFnZSgKKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZSwKKwlzdHJ1Y3QgcGFnZQkJKnBhZ2UsCisJeGZzX2lvbWFwX3QJCSppb21hcHAsCisJc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMsCisJdm9pZAkJCSpwcml2YXRlLAorCWludAkJCXN0YXJ0aW8sCisJaW50CQkJYWxsX2JoKQoreworCXN0cnVjdCBidWZmZXJfaGVhZAkqYmhfYXJyW01BWF9CVUZfUEVSX1BBR0VdLCAqYmgsICpoZWFkOworCXhmc19pb21hcF90CQkqbXAgPSBpb21hcHAsICp0bXA7CisJdW5zaWduZWQgbG9uZwkJZW5kLCBvZmZzZXQ7CisJcGdvZmZfdAkJCWVuZF9pbmRleDsKKwlpbnQJCQlpID0gMCwgaW5kZXggPSAwOworCWludAkJCWJiaXRzID0gaW5vZGUtPmlfYmxrYml0czsKKworCWVuZF9pbmRleCA9IGlfc2l6ZV9yZWFkKGlub2RlKSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCWlmIChwYWdlLT5pbmRleCA8IGVuZF9pbmRleCkgeworCQllbmQgPSBQQUdFX0NBQ0hFX1NJWkU7CisJfSBlbHNlIHsKKwkJZW5kID0gaV9zaXplX3JlYWQoaW5vZGUpICYgKFBBR0VfQ0FDSEVfU0laRS0xKTsKKwl9CisJYmggPSBoZWFkID0gcGFnZV9idWZmZXJzKHBhZ2UpOworCWRvIHsKKwkJb2Zmc2V0ID0gaSA8PCBiYml0czsKKwkJaWYgKG9mZnNldCA+PSBlbmQpCisJCQlicmVhazsKKwkJaWYgKCEoUGFnZVVwdG9kYXRlKHBhZ2UpIHx8IGJ1ZmZlcl91cHRvZGF0ZShiaCkpKQorCQkJY29udGludWU7CisJCWlmIChidWZmZXJfbWFwcGVkKGJoKSAmJiBhbGxfYmggJiYKKwkJICAgICEoYnVmZmVyX3Vud3JpdHRlbihiaCkgfHwgYnVmZmVyX2RlbGF5KGJoKSkpIHsKKwkJCWlmIChzdGFydGlvKSB7CisJCQkJbG9ja19idWZmZXIoYmgpOworCQkJCWJoX2FycltpbmRleCsrXSA9IGJoOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJdG1wID0geGZzX29mZnNldF90b19tYXAocGFnZSwgbXAsIG9mZnNldCk7CisJCWlmICghdG1wKQorCQkJY29udGludWU7CisJCUFTU0VSVCghKHRtcC0+aW9tYXBfZmxhZ3MgJiBJT01BUF9IT0xFKSk7CisJCUFTU0VSVCghKHRtcC0+aW9tYXBfZmxhZ3MgJiBJT01BUF9ERUxBWSkpOworCisJCS8qIElmIHRoaXMgaXMgYSBuZXcgdW53cml0dGVuIGV4dGVudCBidWZmZXIgKGkuZS4gb25lCisJCSAqIHRoYXQgd2UgaGF2ZW4ndCBwYXNzZWQgaW4gcHJpdmF0ZSBkYXRhIGZvciwgd2UgbXVzdAorCQkgKiBub3cgbWFwIHRoaXMgYnVmZmVyIHRvby4KKwkJICovCisJCWlmIChidWZmZXJfdW53cml0dGVuKGJoKSAmJiAhYmgtPmJfZW5kX2lvKSB7CisJCQlBU1NFUlQodG1wLT5pb21hcF9mbGFncyAmIElPTUFQX1VOV1JJVFRFTik7CisJCQl4ZnNfbWFwX3Vud3JpdHRlbihpbm9kZSwgcGFnZSwgaGVhZCwgYmgsIG9mZnNldCwKKwkJCQkJYmJpdHMsIHRtcCwgd2JjLCBzdGFydGlvLCBhbGxfYmgpOworCQl9IGVsc2UgaWYgKCEgKGJ1ZmZlcl91bndyaXR0ZW4oYmgpICYmIGJ1ZmZlcl9sb2NrZWQoYmgpKSkgeworCQkJeGZzX21hcF9hdF9vZmZzZXQocGFnZSwgYmgsIG9mZnNldCwgYmJpdHMsIHRtcCk7CisJCQlpZiAoYnVmZmVyX3Vud3JpdHRlbihiaCkpIHsKKwkJCQlzZXRfYnVmZmVyX3Vud3JpdHRlbl9pbyhiaCk7CisJCQkJYmgtPmJfcHJpdmF0ZSA9IHByaXZhdGU7CisJCQkJQVNTRVJUKHByaXZhdGUpOworCQkJfQorCQl9CisJCWlmIChzdGFydGlvKSB7CisJCQliaF9hcnJbaW5kZXgrK10gPSBiaDsKKwkJfSBlbHNlIHsKKwkJCXNldF9idWZmZXJfZGlydHkoYmgpOworCQkJdW5sb2NrX2J1ZmZlcihiaCk7CisJCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCX0KKwl9IHdoaWxlIChpKyssIChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCk7CisKKwlpZiAoc3RhcnRpbykgeworCQl4ZnNfc3VibWl0X3BhZ2UocGFnZSwgd2JjLCBiaF9hcnIsIGluZGV4LCAxLCBpbmRleCA9PSBpKTsKKwl9IGVsc2UgeworCQl1bmxvY2tfcGFnZShwYWdlKTsKKwl9Cit9CisKKy8qCisgKiBDb252ZXJ0ICYgd3JpdGUgb3V0IGEgY2x1c3RlciBvZiBwYWdlcyBpbiB0aGUgc2FtZSBleHRlbnQgYXMgZGVmaW5lZAorICogYnkgbXAgYW5kIGZvbGxvd2luZyB0aGUgc3RhcnQgcGFnZS4KKyAqLworU1RBVElDIHZvaWQKK3hmc19jbHVzdGVyX3dyaXRlKAorCXN0cnVjdCBpbm9kZQkJKmlub2RlLAorCXBnb2ZmX3QJCQl0aW5kZXgsCisJeGZzX2lvbWFwX3QJCSppb21hcHAsCisJc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMsCisJaW50CQkJc3RhcnRpbywKKwlpbnQJCQlhbGxfYmgsCisJcGdvZmZfdAkJCXRsYXN0KQoreworCXN0cnVjdCBwYWdlCQkqcGFnZTsKKworCWZvciAoOyB0aW5kZXggPD0gdGxhc3Q7IHRpbmRleCsrKSB7CisJCXBhZ2UgPSB4ZnNfcHJvYmVfZGVsYWxsb2NfcGFnZShpbm9kZSwgdGluZGV4KTsKKwkJaWYgKCFwYWdlKQorCQkJYnJlYWs7CisJCXhmc19jb252ZXJ0X3BhZ2UoaW5vZGUsIHBhZ2UsIGlvbWFwcCwgd2JjLCBOVUxMLAorCQkJCXN0YXJ0aW8sIGFsbF9iaCk7CisJfQorfQorCisvKgorICogQ2FsbGluZyB0aGlzIHdpdGhvdXQgc3RhcnRpbyBzZXQgbWVhbnMgd2UgYXJlIGJlaW5nIGFza2VkIHRvIG1ha2UgYSBkaXJ0eQorICogcGFnZSByZWFkeSBmb3IgZnJlZWluZyBpdCdzIGJ1ZmZlcnMuICBXaGVuIGNhbGxlZCB3aXRoIHN0YXJ0aW8gc2V0IHRoZW4KKyAqIHdlIGFyZSBjb21pbmcgZnJvbSB3cml0ZXBhZ2UuCisgKgorICogV2hlbiBjYWxsZWQgd2l0aCBzdGFydGlvIHNldCBpdCBpcyBpbXBvcnRhbnQgdGhhdCB3ZSB3cml0ZSB0aGUgV0hPTEUKKyAqIHBhZ2UgaWYgcG9zc2libGUuCisgKiBUaGUgYmgtPmJfc3RhdGUncyBjYW5ub3Qga25vdyBpZiBhbnkgb2YgdGhlIGJsb2NrcyBvciB3aGljaCBibG9jayBmb3IKKyAqIHRoYXQgbWF0dGVyIGFyZSBkaXJ0eSBkdWUgdG8gbW1hcCB3cml0ZXMsIGFuZCB0aGVyZWZvcmUgYmggdXB0b2RhdGUgaXMKKyAqIG9ubHkgdmFpbGQgaWYgdGhlIHBhZ2UgaXRzZWxmIGlzbid0IGNvbXBsZXRlbHkgdXB0b2RhdGUuICBTb21lIGxheWVycworICogbWF5IGNsZWFyIHRoZSBwYWdlIGRpcnR5IGZsYWcgcHJpb3IgdG8gY2FsbGluZyB3cml0ZSBwYWdlLCB1bmRlciB0aGUKKyAqIGFzc3VtcHRpb24gdGhlIGVudGlyZSBwYWdlIHdpbGwgYmUgd3JpdHRlbiBvdXQ7IGJ5IG5vdCB3cml0aW5nIG91dCB0aGUKKyAqIHdob2xlIHBhZ2UgdGhlIHBhZ2UgY2FuIGJlIHJldXNlZCBiZWZvcmUgYWxsIHZhbGlkIGRpcnR5IGRhdGEgaXMKKyAqIHdyaXR0ZW4gb3V0LiAgTm90ZTogaW4gdGhlIGNhc2Ugb2YgYSBwYWdlIHRoYXQgaGFzIGJlZW4gZGlydHknZCBieQorICogbWFwd3JpdGUgYW5kIGJ1dCBwYXJ0aWFsbHkgc2V0dXAgYnkgYmxvY2tfcHJlcGFyZV93cml0ZSB0aGUKKyAqIGJoLT5iX3N0YXRlcydzIHdpbGwgbm90IGFncmVlIGFuZCBvbmx5IG9uZXMgc2V0dXAgYnkgQlBXL0JDVyB3aWxsIGhhdmUKKyAqIHZhbGlkIHN0YXRlLCB0aHVzIHRoZSB3aG9sZSBwYWdlIG11c3QgYmUgd3JpdHRlbiBvdXQgdGhpbmcuCisgKi8KKworU1RBVElDIGludAoreGZzX3BhZ2Vfc3RhdGVfY29udmVydCgKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlLAorCXN0cnVjdCBwYWdlCSpwYWdlLAorCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjLAorCWludAkJc3RhcnRpbywKKwlpbnQJCXVubWFwcGVkKSAvKiBhbHNvIGltcGxpZXMgcGFnZSB1cHRvZGF0ZSAqLworeworCXN0cnVjdCBidWZmZXJfaGVhZAkqYmhfYXJyW01BWF9CVUZfUEVSX1BBR0VdLCAqYmgsICpoZWFkOworCXhmc19pb21hcF90CQkqaW9tcCwgaW9tYXA7CisJbG9mZl90CQkJb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgICAgICAgICAgIHBfb2Zmc2V0ID0gMDsKKwlfX3VpbnQ2NF90ICAgICAgICAgICAgICBlbmRfb2Zmc2V0OworCXBnb2ZmX3QgICAgICAgICAgICAgICAgIGVuZF9pbmRleCwgbGFzdF9pbmRleCwgdGxhc3Q7CisJaW50CQkJbGVuLCBlcnIsIGksIGNudCA9IDAsIHVwdG9kYXRlID0gMTsKKwlpbnQJCQlmbGFncyA9IHN0YXJ0aW8gPyAwIDogQk1BUElfVFJZTE9DSzsKKwlpbnQJCQlwYWdlX2RpcnR5LCBkZWxhbGxvYyA9IDA7CisKKwkvKiBJcyB0aGlzIHBhZ2UgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGZpbGU/ICovCisJb2Zmc2V0ID0gaV9zaXplX3JlYWQoaW5vZGUpOworCWVuZF9pbmRleCA9IG9mZnNldCA+PiBQQUdFX0NBQ0hFX1NISUZUOworCWxhc3RfaW5kZXggPSAob2Zmc2V0IC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlpZiAocGFnZS0+aW5kZXggPj0gZW5kX2luZGV4KSB7CisJCWlmICgocGFnZS0+aW5kZXggPj0gZW5kX2luZGV4ICsgMSkgfHwKKwkJICAgICEoaV9zaXplX3JlYWQoaW5vZGUpICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKSkgeworCQkJZXJyID0gLUVJTzsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKwl9CisKKwlvZmZzZXQgPSAobG9mZl90KXBhZ2UtPmluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQ7CisJZW5kX29mZnNldCA9IG1pbl90KHVuc2lnbmVkIGxvbmcgbG9uZywKKwkJCW9mZnNldCArIFBBR0VfQ0FDSEVfU0laRSwgaV9zaXplX3JlYWQoaW5vZGUpKTsKKworCWJoID0gaGVhZCA9IHBhZ2VfYnVmZmVycyhwYWdlKTsKKwlpb21wID0gTlVMTDsKKworCS8qCisJICogcGFnZV9kaXJ0eSBpcyBpbml0aWFsbHkgYSBjb3VudCBvZiBidWZmZXJzIG9uIHRoZSBwYWdlIGFuZAorCSAqIGlzIGRlY3JlbWVtdGVkIGFzIHdlIG1vdmUgZWFjaCBpbnRvIGEgY2xlYW5hYmxlIHN0YXRlLgorCSAqLworCWxlbiA9IGJoLT5iX3NpemU7CisJcGFnZV9kaXJ0eSA9IFBBR0VfQ0FDSEVfU0laRSAvIGxlbjsKKworCWRvIHsKKwkJaWYgKG9mZnNldCA+PSBlbmRfb2Zmc2V0KQorCQkJYnJlYWs7CisJCWlmICghYnVmZmVyX3VwdG9kYXRlKGJoKSkKKwkJCXVwdG9kYXRlID0gMDsKKwkJaWYgKCEoUGFnZVVwdG9kYXRlKHBhZ2UpIHx8IGJ1ZmZlcl91cHRvZGF0ZShiaCkpICYmICFzdGFydGlvKQorCQkJY29udGludWU7CisKKwkJaWYgKGlvbXApIHsKKwkJCWlvbXAgPSB4ZnNfb2Zmc2V0X3RvX21hcChwYWdlLCAmaW9tYXAsIHBfb2Zmc2V0KTsKKwkJfQorCisJCS8qCisJCSAqIEZpcnN0IGNhc2UsIG1hcCBhbiB1bndyaXR0ZW4gZXh0ZW50IGFuZCBwcmVwYXJlIGZvcgorCQkgKiBleHRlbnQgc3RhdGUgY29udmVyc2lvbiB0cmFuc2FjdGlvbiBvbiBjb21wbGV0aW9uLgorCQkgKi8KKwkJaWYgKGJ1ZmZlcl91bndyaXR0ZW4oYmgpKSB7CisJCQlpZiAoIXN0YXJ0aW8pCisJCQkJY29udGludWU7CisJCQlpZiAoIWlvbXApIHsKKwkJCQllcnIgPSB4ZnNfbWFwX2Jsb2Nrcyhpbm9kZSwgb2Zmc2V0LCBsZW4sICZpb21hcCwKKwkJCQkJCUJNQVBJX1JFQUR8Qk1BUElfSUdOU1RBVEUpOworCQkJCWlmIChlcnIpIHsKKwkJCQkJZ290byBlcnJvcjsKKwkJCQl9CisJCQkJaW9tcCA9IHhmc19vZmZzZXRfdG9fbWFwKHBhZ2UsICZpb21hcCwKKwkJCQkJCQkJcF9vZmZzZXQpOworCQkJfQorCQkJaWYgKGlvbXApIHsKKwkJCQlpZiAoIWJoLT5iX2VuZF9pbykgeworCQkJCQllcnIgPSB4ZnNfbWFwX3Vud3JpdHRlbihpbm9kZSwgcGFnZSwKKwkJCQkJCQloZWFkLCBiaCwgcF9vZmZzZXQsCisJCQkJCQkJaW5vZGUtPmlfYmxrYml0cywgaW9tcCwKKwkJCQkJCQl3YmMsIHN0YXJ0aW8sIHVubWFwcGVkKTsKKwkJCQkJaWYgKGVycikgeworCQkJCQkJZ290byBlcnJvcjsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXNldF9iaXQoQkhfTG9jaywgJmJoLT5iX3N0YXRlKTsKKwkJCQl9CisJCQkJQlVHX09OKCFidWZmZXJfbG9ja2VkKGJoKSk7CisJCQkJYmhfYXJyW2NudCsrXSA9IGJoOworCQkJCXBhZ2VfZGlydHktLTsKKwkJCX0KKwkJLyoKKwkJICogU2Vjb25kIGNhc2UsIGFsbG9jYXRlIHNwYWNlIGZvciBhIGRlbGFsbG9jIGJ1ZmZlci4KKwkJICogV2UgY2FuIHJldHVybiBFQUdBSU4gaGVyZSBpbiB0aGUgcmVsZWFzZSBwYWdlIGNhc2UuCisJCSAqLworCQl9IGVsc2UgaWYgKGJ1ZmZlcl9kZWxheShiaCkpIHsKKwkJCWlmICghaW9tcCkgeworCQkJCWRlbGFsbG9jID0gMTsKKwkJCQllcnIgPSB4ZnNfbWFwX2Jsb2Nrcyhpbm9kZSwgb2Zmc2V0LCBsZW4sICZpb21hcCwKKwkJCQkJCUJNQVBJX0FMTE9DQVRFIHwgZmxhZ3MpOworCQkJCWlmIChlcnIpIHsKKwkJCQkJZ290byBlcnJvcjsKKwkJCQl9CisJCQkJaW9tcCA9IHhmc19vZmZzZXRfdG9fbWFwKHBhZ2UsICZpb21hcCwKKwkJCQkJCQkJcF9vZmZzZXQpOworCQkJfQorCQkJaWYgKGlvbXApIHsKKwkJCQl4ZnNfbWFwX2F0X29mZnNldChwYWdlLCBiaCwgcF9vZmZzZXQsCisJCQkJCQlpbm9kZS0+aV9ibGtiaXRzLCBpb21wKTsKKwkJCQlpZiAoc3RhcnRpbykgeworCQkJCQliaF9hcnJbY250KytdID0gYmg7CisJCQkJfSBlbHNlIHsKKwkJCQkJc2V0X2J1ZmZlcl9kaXJ0eShiaCk7CisJCQkJCXVubG9ja19idWZmZXIoYmgpOworCQkJCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJCQkJfQorCQkJCXBhZ2VfZGlydHktLTsKKwkJCX0KKwkJfSBlbHNlIGlmICgoYnVmZmVyX3VwdG9kYXRlKGJoKSB8fCBQYWdlVXB0b2RhdGUocGFnZSkpICYmCisJCQkgICAodW5tYXBwZWQgfHwgc3RhcnRpbykpIHsKKworCQkJaWYgKCFidWZmZXJfbWFwcGVkKGJoKSkgeworCQkJCWludAlzaXplOworCisJCQkJLyoKKwkJCQkgKiBHZXR0aW5nIGhlcmUgaW1wbGllcyBhbiB1bm1hcHBlZCBidWZmZXIKKwkJCQkgKiB3YXMgZm91bmQsIGFuZCB3ZSBhcmUgaW4gYSBwYXRoIHdoZXJlIHdlCisJCQkJICogbmVlZCB0byB3cml0ZSB0aGUgd2hvbGUgcGFnZSBvdXQuCisJCQkJICovCisJCQkJaWYgKCFpb21wKSB7CisJCQkJCXNpemUgPSB4ZnNfcHJvYmVfdW5tYXBwZWRfY2x1c3RlcigKKwkJCQkJCQlpbm9kZSwgcGFnZSwgYmgsIGhlYWQpOworCQkJCQllcnIgPSB4ZnNfbWFwX2Jsb2Nrcyhpbm9kZSwgb2Zmc2V0LAorCQkJCQkJCXNpemUsICZpb21hcCwKKwkJCQkJCQlCTUFQSV9XUklURXxCTUFQSV9NTUFQKTsKKwkJCQkJaWYgKGVycikgeworCQkJCQkJZ290byBlcnJvcjsKKwkJCQkJfQorCQkJCQlpb21wID0geGZzX29mZnNldF90b19tYXAocGFnZSwgJmlvbWFwLAorCQkJCQkJCQkgICAgIHBfb2Zmc2V0KTsKKwkJCQl9CisJCQkJaWYgKGlvbXApIHsKKwkJCQkJeGZzX21hcF9hdF9vZmZzZXQocGFnZSwKKwkJCQkJCQliaCwgcF9vZmZzZXQsCisJCQkJCQkJaW5vZGUtPmlfYmxrYml0cywgaW9tcCk7CisJCQkJCWlmIChzdGFydGlvKSB7CisJCQkJCQliaF9hcnJbY250KytdID0gYmg7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlzZXRfYnVmZmVyX2RpcnR5KGJoKTsKKwkJCQkJCXVubG9ja19idWZmZXIoYmgpOworCQkJCQkJbWFya19idWZmZXJfZGlydHkoYmgpOworCQkJCQl9CisJCQkJCXBhZ2VfZGlydHktLTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKHN0YXJ0aW8pIHsKKwkJCQlpZiAoYnVmZmVyX3VwdG9kYXRlKGJoKSAmJgorCQkJCSAgICAhdGVzdF9hbmRfc2V0X2JpdChCSF9Mb2NrLCAmYmgtPmJfc3RhdGUpKSB7CisJCQkJCWJoX2FycltjbnQrK10gPSBiaDsKKwkJCQkJcGFnZV9kaXJ0eS0tOworCQkJCX0KKwkJCX0KKwkJfQorCX0gd2hpbGUgKG9mZnNldCArPSBsZW4sIHBfb2Zmc2V0ICs9IGxlbiwKKwkJKChiaCA9IGJoLT5iX3RoaXNfcGFnZSkgIT0gaGVhZCkpOworCisJaWYgKHVwdG9kYXRlICYmIGJoID09IGhlYWQpCisJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKworCWlmIChzdGFydGlvKQorCQl4ZnNfc3VibWl0X3BhZ2UocGFnZSwgd2JjLCBiaF9hcnIsIGNudCwgMCwgMSk7CisKKwlpZiAoaW9tcCkgeworCQl0bGFzdCA9IChpb21wLT5pb21hcF9vZmZzZXQgKyBpb21wLT5pb21hcF9ic2l6ZSAtIDEpID4+CisJCQkJCVBBR0VfQ0FDSEVfU0hJRlQ7CisJCWlmIChkZWxhbGxvYyAmJiAodGxhc3QgPiBsYXN0X2luZGV4KSkKKwkJCXRsYXN0ID0gbGFzdF9pbmRleDsKKwkJeGZzX2NsdXN0ZXJfd3JpdGUoaW5vZGUsIHBhZ2UtPmluZGV4ICsgMSwgaW9tcCwgd2JjLAorCQkJCQlzdGFydGlvLCB1bm1hcHBlZCwgdGxhc3QpOworCX0KKworCXJldHVybiBwYWdlX2RpcnR5OworCitlcnJvcjoKKwlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIHsKKwkJdW5sb2NrX2J1ZmZlcihiaF9hcnJbaV0pOworCX0KKworCS8qCisJICogSWYgaXQncyBkZWxhbGxvYyBhbmQgd2UgaGF2ZSBub3doZXJlIHRvIHB1dCBpdCwKKwkgKiB0aHJvdyBpdCBhd2F5LCB1bmxlc3MgdGhlIGxvd2VyIGxheWVycyB0b2xkCisJICogdXMgdG8gdHJ5IGFnYWluLgorCSAqLworCWlmIChlcnIgIT0gLUVBR0FJTikgeworCQlpZiAoIXVubWFwcGVkKSB7CisJCQlibG9ja19pbnZhbGlkYXRlcGFnZShwYWdlLCAwKTsKKwkJfQorCQlDbGVhclBhZ2VVcHRvZGF0ZShwYWdlKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworU1RBVElDIGludAorX19saW52ZnNfZ2V0X2Jsb2NrKAorCXN0cnVjdCBpbm9kZQkJKmlub2RlLAorCXNlY3Rvcl90CQlpYmxvY2ssCisJdW5zaWduZWQgbG9uZwkJYmxvY2tzLAorCXN0cnVjdCBidWZmZXJfaGVhZAkqYmhfcmVzdWx0LAorCWludAkJCWNyZWF0ZSwKKwlpbnQJCQlkaXJlY3QsCisJYm1hcGlfZmxhZ3NfdAkJZmxhZ3MpCit7CisJdm5vZGVfdAkJCSp2cCA9IExJTlZGU19HRVRfVlAoaW5vZGUpOworCXhmc19pb21hcF90CQlpb21hcDsKKwlpbnQJCQlyZXRwYmJtID0gMTsKKwlpbnQJCQllcnJvcjsKKwlzc2l6ZV90CQkJc2l6ZTsKKwlsb2ZmX3QJCQlvZmZzZXQgPSAobG9mZl90KWlibG9jayA8PCBpbm9kZS0+aV9ibGtiaXRzOworCisJaWYgKGJsb2NrcykKKwkJc2l6ZSA9IGJsb2NrcyA8PCBpbm9kZS0+aV9ibGtiaXRzOworCWVsc2UKKwkJc2l6ZSA9IDEgPDwgaW5vZGUtPmlfYmxrYml0czsKKworCVZPUF9CTUFQKHZwLCBvZmZzZXQsIHNpemUsCisJCWNyZWF0ZSA/IGZsYWdzIDogQk1BUElfUkVBRCwgJmlvbWFwLCAmcmV0cGJibSwgZXJyb3IpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIC1lcnJvcjsKKworCWlmIChyZXRwYmJtID09IDApCisJCXJldHVybiAwOworCisJaWYgKGlvbWFwLmlvbWFwX2JuICE9IElPTUFQX0RBRERSX05VTEwpIHsKKwkJeGZzX2RhZGRyX3QJCWJuOworCQlsb2ZmX3QJCQlkZWx0YTsKKworCQkvKiBGb3IgdW53cml0dGVuIGV4dGVudHMgZG8gbm90IHJlcG9ydCBhIGRpc2sgYWRkcmVzcyBvbgorCQkgKiB0aGUgcmVhZCBjYXNlICh0cmVhdCBhcyBpZiB3ZSdyZSByZWFkaW5nIGludG8gYSBob2xlKS4KKwkJICovCisJCWlmIChjcmVhdGUgfHwgIShpb21hcC5pb21hcF9mbGFncyAmIElPTUFQX1VOV1JJVFRFTikpIHsKKwkJCWRlbHRhID0gb2Zmc2V0IC0gaW9tYXAuaW9tYXBfb2Zmc2V0OworCQkJZGVsdGEgPj49IGlub2RlLT5pX2Jsa2JpdHM7CisKKwkJCWJuID0gaW9tYXAuaW9tYXBfYm4gPj4gKGlub2RlLT5pX2Jsa2JpdHMgLSBCQlNISUZUKTsKKwkJCWJuICs9IGRlbHRhOworCQkJQlVHX09OKCFibiAmJiAhKGlvbWFwLmlvbWFwX2ZsYWdzICYgSU9NQVBfUkVBTFRJTUUpKTsKKwkJCWJoX3Jlc3VsdC0+Yl9ibG9ja25yID0gYm47CisJCQlzZXRfYnVmZmVyX21hcHBlZChiaF9yZXN1bHQpOworCQl9CisJCWlmIChjcmVhdGUgJiYgKGlvbWFwLmlvbWFwX2ZsYWdzICYgSU9NQVBfVU5XUklUVEVOKSkgeworCQkJaWYgKGRpcmVjdCkKKwkJCQliaF9yZXN1bHQtPmJfcHJpdmF0ZSA9IGlub2RlOworCQkJc2V0X2J1ZmZlcl91bndyaXR0ZW4oYmhfcmVzdWx0KTsKKwkJCXNldF9idWZmZXJfZGVsYXkoYmhfcmVzdWx0KTsKKwkJfQorCX0KKworCS8qIElmIHRoaXMgaXMgYSByZWFsdGltZSBmaWxlLCBkYXRhIG1pZ2h0IGJlIG9uIGEgbmV3IGRldmljZSAqLworCWJoX3Jlc3VsdC0+Yl9iZGV2ID0gaW9tYXAuaW9tYXBfdGFyZ2V0LT5wYnJfYmRldjsKKworCS8qIElmIHdlIHByZXZpb3VzbHkgYWxsb2NhdGVkIGEgYmxvY2sgb3V0IGJleW9uZCBlb2YgYW5kCisJICogd2UgYXJlIG5vdyBjb21pbmcgYmFjayB0byB1c2UgaXQgdGhlbiB3ZSB3aWxsIG5lZWQgdG8KKwkgKiBmbGFnIGl0IGFzIG5ldyBldmVuIGlmIGl0IGhhcyBhIGRpc2sgYWRkcmVzcy4KKwkgKi8KKwlpZiAoY3JlYXRlICYmCisJICAgICgoIWJ1ZmZlcl9tYXBwZWQoYmhfcmVzdWx0KSAmJiAhYnVmZmVyX3VwdG9kYXRlKGJoX3Jlc3VsdCkpIHx8CisJICAgICAob2Zmc2V0ID49IGlfc2l6ZV9yZWFkKGlub2RlKSkgfHwgKGlvbWFwLmlvbWFwX2ZsYWdzICYgSU9NQVBfTkVXKSkpIHsKKwkJc2V0X2J1ZmZlcl9uZXcoYmhfcmVzdWx0KTsKKwl9CisKKwlpZiAoaW9tYXAuaW9tYXBfZmxhZ3MgJiBJT01BUF9ERUxBWSkgeworCQlCVUdfT04oZGlyZWN0KTsKKwkJaWYgKGNyZWF0ZSkgeworCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaF9yZXN1bHQpOworCQkJc2V0X2J1ZmZlcl9tYXBwZWQoYmhfcmVzdWx0KTsKKwkJCXNldF9idWZmZXJfZGVsYXkoYmhfcmVzdWx0KTsKKwkJfQorCX0KKworCWlmIChibG9ja3MpIHsKKwkJYmhfcmVzdWx0LT5iX3NpemUgPSAoc3NpemVfdCltaW4oCisJCQkobG9mZl90KShpb21hcC5pb21hcF9ic2l6ZSAtIGlvbWFwLmlvbWFwX2RlbHRhKSwKKwkJCShsb2ZmX3QpKGJsb2NrcyA8PCBpbm9kZS0+aV9ibGtiaXRzKSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludAorbGludmZzX2dldF9ibG9jaygKKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZSwKKwlzZWN0b3JfdAkJaWJsb2NrLAorCXN0cnVjdCBidWZmZXJfaGVhZAkqYmhfcmVzdWx0LAorCWludAkJCWNyZWF0ZSkKK3sKKwlyZXR1cm4gX19saW52ZnNfZ2V0X2Jsb2NrKGlub2RlLCBpYmxvY2ssIDAsIGJoX3Jlc3VsdCwKKwkJCQkJY3JlYXRlLCAwLCBCTUFQSV9XUklURSk7Cit9CisKK1NUQVRJQyBpbnQKK2xpbnZmc19nZXRfYmxvY2tzX2RpcmVjdCgKKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZSwKKwlzZWN0b3JfdAkJaWJsb2NrLAorCXVuc2lnbmVkIGxvbmcJCW1heF9ibG9ja3MsCisJc3RydWN0IGJ1ZmZlcl9oZWFkCSpiaF9yZXN1bHQsCisJaW50CQkJY3JlYXRlKQoreworCXJldHVybiBfX2xpbnZmc19nZXRfYmxvY2soaW5vZGUsIGlibG9jaywgbWF4X2Jsb2NrcywgYmhfcmVzdWx0LAorCQkJCQljcmVhdGUsIDEsIEJNQVBJX1dSSVRFfEJNQVBJX0RJUkVDVCk7Cit9CisKK1NUQVRJQyBzc2l6ZV90CitsaW52ZnNfZGlyZWN0X0lPKAorCWludAkJCXJ3LAorCXN0cnVjdCBraW9jYgkJKmlvY2IsCisJY29uc3Qgc3RydWN0IGlvdmVjCSppb3YsCisJbG9mZl90CQkJb2Zmc2V0LAorCXVuc2lnbmVkIGxvbmcJCW5yX3NlZ3MpCit7CisJc3RydWN0IGZpbGUJKmZpbGUgPSBpb2NiLT5raV9maWxwOworCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CisJdm5vZGVfdAkJKnZwID0gTElOVkZTX0dFVF9WUChpbm9kZSk7CisJeGZzX2lvbWFwX3QJaW9tYXA7CisJaW50CQltYXBzID0gMTsKKwlpbnQJCWVycm9yOworCisJVk9QX0JNQVAodnAsIG9mZnNldCwgMCwgQk1BUElfREVWSUNFLCAmaW9tYXAsICZtYXBzLCBlcnJvcik7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gLWVycm9yOworCisJcmV0dXJuIGJsb2NrZGV2X2RpcmVjdF9JT19vd25fbG9ja2luZyhydywgaW9jYiwgaW5vZGUsCisJCWlvbWFwLmlvbWFwX3RhcmdldC0+cGJyX2JkZXYsCisJCWlvdiwgb2Zmc2V0LCBucl9zZWdzLAorCQlsaW52ZnNfZ2V0X2Jsb2Nrc19kaXJlY3QsCisJCWxpbnZmc191bndyaXR0ZW5fY29udmVydF9kaXJlY3QpOworfQorCisKK1NUQVRJQyBzZWN0b3JfdAorbGludmZzX2JtYXAoCisJc3RydWN0IGFkZHJlc3Nfc3BhY2UJKm1hcHBpbmcsCisJc2VjdG9yX3QJCWJsb2NrKQoreworCXN0cnVjdCBpbm9kZQkJKmlub2RlID0gKHN0cnVjdCBpbm9kZSAqKW1hcHBpbmctPmhvc3Q7CisJdm5vZGVfdAkJCSp2cCA9IExJTlZGU19HRVRfVlAoaW5vZGUpOworCWludAkJCWVycm9yOworCisJdm5fdHJhY2VfZW50cnkodnAsICJsaW52ZnNfYm1hcCIsIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKworCVZPUF9SV0xPQ0sodnAsIFZSV0xPQ0tfUkVBRCk7CisJVk9QX0ZMVVNIX1BBR0VTKHZwLCAoeGZzX29mZl90KTAsIC0xLCAwLCBGSV9SRU1BUEYsIGVycm9yKTsKKwlWT1BfUldVTkxPQ0sodnAsIFZSV0xPQ0tfUkVBRCk7CisJcmV0dXJuIGdlbmVyaWNfYmxvY2tfYm1hcChtYXBwaW5nLCBibG9jaywgbGludmZzX2dldF9ibG9jayk7Cit9CisKK1NUQVRJQyBpbnQKK2xpbnZmc19yZWFkcGFnZSgKKwlzdHJ1Y3QgZmlsZQkJKnVudXNlZCwKKwlzdHJ1Y3QgcGFnZQkJKnBhZ2UpCit7CisJcmV0dXJuIG1wYWdlX3JlYWRwYWdlKHBhZ2UsIGxpbnZmc19nZXRfYmxvY2spOworfQorCitTVEFUSUMgaW50CitsaW52ZnNfcmVhZHBhZ2VzKAorCXN0cnVjdCBmaWxlCQkqdW51c2VkLAorCXN0cnVjdCBhZGRyZXNzX3NwYWNlCSptYXBwaW5nLAorCXN0cnVjdCBsaXN0X2hlYWQJKnBhZ2VzLAorCXVuc2lnbmVkCQlucl9wYWdlcykKK3sKKwlyZXR1cm4gbXBhZ2VfcmVhZHBhZ2VzKG1hcHBpbmcsIHBhZ2VzLCBucl9wYWdlcywgbGludmZzX2dldF9ibG9jayk7Cit9CisKK1NUQVRJQyB2b2lkCit4ZnNfY291bnRfcGFnZV9zdGF0ZSgKKwlzdHJ1Y3QgcGFnZQkJKnBhZ2UsCisJaW50CQkJKmRlbGFsbG9jLAorCWludAkJCSp1bm1hcHBlZCwKKwlpbnQJCQkqdW53cml0dGVuKQoreworCXN0cnVjdCBidWZmZXJfaGVhZAkqYmgsICpoZWFkOworCisJKmRlbGFsbG9jID0gKnVubWFwcGVkID0gKnVud3JpdHRlbiA9IDA7CisKKwliaCA9IGhlYWQgPSBwYWdlX2J1ZmZlcnMocGFnZSk7CisJZG8geworCQlpZiAoYnVmZmVyX3VwdG9kYXRlKGJoKSAmJiAhYnVmZmVyX21hcHBlZChiaCkpCisJCQkoKnVubWFwcGVkKSA9IDE7CisJCWVsc2UgaWYgKGJ1ZmZlcl91bndyaXR0ZW4oYmgpICYmICFidWZmZXJfZGVsYXkoYmgpKQorCQkJY2xlYXJfYnVmZmVyX3Vud3JpdHRlbihiaCk7CisJCWVsc2UgaWYgKGJ1ZmZlcl91bndyaXR0ZW4oYmgpKQorCQkJKCp1bndyaXR0ZW4pID0gMTsKKwkJZWxzZSBpZiAoYnVmZmVyX2RlbGF5KGJoKSkKKwkJCSgqZGVsYWxsb2MpID0gMTsKKwl9IHdoaWxlICgoYmggPSBiaC0+Yl90aGlzX3BhZ2UpICE9IGhlYWQpOworfQorCisKKy8qCisgKiB3cml0ZXBhZ2U6IENhbGxlZCBmcm9tIG9uZSBvZiB0d28gcGxhY2VzOgorICoKKyAqIDEuIHdlIGFyZSBmbHVzaGluZyBhIGRlbGFsbG9jIGJ1ZmZlciBoZWFkLgorICoKKyAqIDIuIHdlIGFyZSB3cml0aW5nIG91dCBhIGRpcnR5IHBhZ2UuIFR5cGljYWxseSB0aGUgcGFnZSBkaXJ0eQorICogICAgc3RhdGUgaXMgY2xlYXJlZCBiZWZvcmUgd2UgZ2V0IGhlcmUuIEluIHRoaXMgY2FzZSBpcyBpdAorICogICAgY29uY2VpdmFibGUgd2UgaGF2ZSBubyBidWZmZXIgaGVhZHMuCisgKgorICogRm9yIGRlbGFsbG9jIHNwYWNlIG9uIHRoZSBwYWdlIHdlIG5lZWQgdG8gYWxsb2NhdGUgc3BhY2UgYW5kCisgKiBmbHVzaCBpdC4gRm9yIHVubWFwcGVkIGJ1ZmZlciBoZWFkcyBvbiB0aGUgcGFnZSB3ZSBzaG91bGQKKyAqIGFsbG9jYXRlIHNwYWNlIGlmIHRoZSBwYWdlIGlzIHVwdG9kYXRlLiBGb3IgYW55IG90aGVyIGRpcnR5CisgKiBidWZmZXIgaGVhZHMgb24gdGhlIHBhZ2Ugd2Ugc2hvdWxkIGZsdXNoIHRoZW0uCisgKgorICogSWYgd2UgZGV0ZWN0IHRoYXQgYSB0cmFuc2FjdGlvbiB3b3VsZCBiZSByZXF1aXJlZCB0byBmbHVzaAorICogdGhlIHBhZ2UsIHdlIGhhdmUgdG8gY2hlY2sgdGhlIHByb2Nlc3MgZmxhZ3MgZmlyc3QsIGlmIHdlCisgKiBhcmUgYWxyZWFkeSBpbiBhIHRyYW5zYWN0aW9uIG9yIGRpc2sgSS9PIGR1cmluZyBhbGxvY2F0aW9ucworICogaXMgb2ZmLCB3ZSBuZWVkIHRvIGZhaWwgdGhlIHdyaXRlcGFnZSBhbmQgcmVkaXJ0eSB0aGUgcGFnZS4KKyAqLworCitTVEFUSUMgaW50CitsaW52ZnNfd3JpdGVwYWdlKAorCXN0cnVjdCBwYWdlCQkqcGFnZSwKKwlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKK3sKKwlpbnQJCQllcnJvcjsKKwlpbnQJCQluZWVkX3RyYW5zOworCWludAkJCWRlbGFsbG9jLCB1bm1hcHBlZCwgdW53cml0dGVuOworCXN0cnVjdCBpbm9kZQkJKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKworCXhmc19wYWdlX3RyYWNlKFhGU19XUklURVBBR0VfRU5URVIsIGlub2RlLCBwYWdlLCAwKTsKKworCS8qCisJICogV2UgbmVlZCBhIHRyYW5zYWN0aW9uIGlmOgorCSAqICAxLiBUaGVyZSBhcmUgZGVsYWxsb2MgYnVmZmVycyBvbiB0aGUgcGFnZQorCSAqICAyLiBUaGUgcGFnZSBpcyB1cHRvZGF0ZSBhbmQgd2UgaGF2ZSB1bm1hcHBlZCBidWZmZXJzCisJICogIDMuIFRoZSBwYWdlIGlzIHVwdG9kYXRlIGFuZCB3ZSBoYXZlIG5vIGJ1ZmZlcnMKKwkgKiAgNC4gVGhlcmUgYXJlIHVud3JpdHRlbiBidWZmZXJzIG9uIHRoZSBwYWdlCisJICovCisKKwlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpIHsKKwkJdW5tYXBwZWQgPSAxOworCQluZWVkX3RyYW5zID0gMTsKKwl9IGVsc2UgeworCQl4ZnNfY291bnRfcGFnZV9zdGF0ZShwYWdlLCAmZGVsYWxsb2MsICZ1bm1hcHBlZCwgJnVud3JpdHRlbik7CisJCWlmICghUGFnZVVwdG9kYXRlKHBhZ2UpKQorCQkJdW5tYXBwZWQgPSAwOworCQluZWVkX3RyYW5zID0gZGVsYWxsb2MgKyB1bm1hcHBlZCArIHVud3JpdHRlbjsKKwl9CisKKwkvKgorCSAqIElmIHdlIG5lZWQgYSB0cmFuc2FjdGlvbiBhbmQgdGhlIHByb2Nlc3MgZmxhZ3Mgc2F5CisJICogd2UgYXJlIGFscmVhZHkgaW4gYSB0cmFuc2FjdGlvbiwgb3Igbm8gSU8gaXMgYWxsb3dlZAorCSAqIHRoZW4gbWFyayB0aGUgcGFnZSBkaXJ0eSBhZ2FpbiBhbmQgbGVhdmUgdGhlIHBhZ2UKKwkgKiBhcyBpcy4KKwkgKi8KKwlpZiAoUEZMQUdTX1RFU1RfRlNUUkFOUygpICYmIG5lZWRfdHJhbnMpCisJCWdvdG8gb3V0X2ZhaWw7CisKKwkvKgorCSAqIERlbGF5IGhvb2tpbmcgdXAgYnVmZmVyIGhlYWRzIHVudGlsIHdlIGhhdmUKKwkgKiBtYWRlIG91ciBnby9uby1nbyBkZWNpc2lvbi4KKwkgKi8KKwlpZiAoIXBhZ2VfaGFzX2J1ZmZlcnMocGFnZSkpCisJCWNyZWF0ZV9lbXB0eV9idWZmZXJzKHBhZ2UsIDEgPDwgaW5vZGUtPmlfYmxrYml0cywgMCk7CisKKwkvKgorCSAqIENvbnZlcnQgZGVsYXllZCBhbGxvY2F0ZSwgdW53cml0dGVuIG9yIHVubWFwcGVkIHNwYWNlCisJICogdG8gcmVhbCBzcGFjZSBhbmQgZmx1c2ggb3V0IHRvIGRpc2suCisJICovCisJZXJyb3IgPSB4ZnNfcGFnZV9zdGF0ZV9jb252ZXJ0KGlub2RlLCBwYWdlLCB3YmMsIDEsIHVubWFwcGVkKTsKKwlpZiAoZXJyb3IgPT0gLUVBR0FJTikKKwkJZ290byBvdXRfZmFpbDsKKwlpZiAodW5saWtlbHkoZXJyb3IgPCAwKSkKKwkJZ290byBvdXRfdW5sb2NrOworCisJcmV0dXJuIDA7CisKK291dF9mYWlsOgorCXJlZGlydHlfcGFnZV9mb3Jfd3JpdGVwYWdlKHdiYywgcGFnZSk7CisJdW5sb2NrX3BhZ2UocGFnZSk7CisJcmV0dXJuIDA7CitvdXRfdW5sb2NrOgorCXVubG9ja19wYWdlKHBhZ2UpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIENhbGxlZCB0byBtb3ZlIGEgcGFnZSBpbnRvIGNsZWFuYWJsZSBzdGF0ZSAtIGFuZCBmcm9tIHRoZXJlCisgKiB0byBiZSByZWxlYXNlZC4gUG9zc2libHkgdGhlIHBhZ2UgaXMgYWxyZWFkeSBjbGVhbi4gV2UgYWx3YXlzCisgKiBoYXZlIGJ1ZmZlciBoZWFkcyBpbiB0aGlzIGNhbGwuCisgKgorICogUmV0dXJucyAwIGlmIHRoZSBwYWdlIGlzIG9rIHRvIHJlbGVhc2UsIDEgb3RoZXJ3aXNlLgorICoKKyAqIFBvc3NpYmxlIHNjZW5hcmlvcyBhcmU6CisgKgorICogMS4gV2UgYXJlIGJlaW5nIGNhbGxlZCB0byByZWxlYXNlIGEgcGFnZSB3aGljaCBoYXMgYmVlbiB3cml0dGVuCisgKiAgICB0byB2aWEgcmVndWxhciBJL08uIGJ1ZmZlciBoZWFkcyB3aWxsIGJlIGRpcnR5IGFuZCBwb3NzaWJseQorICogICAgZGVsYWxsb2MuIElmIG5vIGRlbGFsbG9jIGJ1ZmZlciBoZWFkcyBpbiB0aGlzIGNhc2UgdGhlbiB3ZQorICogICAgY2FuIGp1c3QgcmV0dXJuIHplcm8uCisgKgorICogMi4gV2UgYXJlIGNhbGxlZCB0byByZWxlYXNlIGEgcGFnZSB3aGljaCBoYXMgYmVlbiB3cml0dGVuIHZpYQorICogICAgbW1hcCwgYWxsIHdlIG5lZWQgdG8gZG8gaXMgZW5zdXJlIHRoZXJlIGlzIG5vIGRlbGFsbG9jCisgKiAgICBzdGF0ZSBpbiB0aGUgYnVmZmVyIGhlYWRzLCBpZiBub3Qgd2UgY2FuIGxldCB0aGUgY2FsbGVyCisgKiAgICBmcmVlIHRoZW0gYW5kIHdlIHNob3VsZCBjb21lIGJhY2sgbGF0ZXIgdmlhIHdyaXRlcGFnZS4KKyAqLworU1RBVElDIGludAorbGludmZzX3JlbGVhc2VfcGFnZSgKKwlzdHJ1Y3QgcGFnZQkJKnBhZ2UsCisJaW50CQkJZ2ZwX21hc2spCit7CisJc3RydWN0IGlub2RlCQkqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCWludAkJCWRpcnR5LCBkZWxhbGxvYywgdW5tYXBwZWQsIHVud3JpdHRlbjsKKwlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgd2JjID0geworCQkuc3luY19tb2RlID0gV0JfU1lOQ19BTEwsCisJCS5ucl90b193cml0ZSA9IDEsCisJfTsKKworCXhmc19wYWdlX3RyYWNlKFhGU19SRUxFQVNFUEFHRV9FTlRFUiwgaW5vZGUsIHBhZ2UsIGdmcF9tYXNrKTsKKworCXhmc19jb3VudF9wYWdlX3N0YXRlKHBhZ2UsICZkZWxhbGxvYywgJnVubWFwcGVkLCAmdW53cml0dGVuKTsKKwlpZiAoIWRlbGFsbG9jICYmICF1bndyaXR0ZW4pCisJCWdvdG8gZnJlZV9idWZmZXJzOworCisJaWYgKCEoZ2ZwX21hc2sgJiBfX0dGUF9GUykpCisJCXJldHVybiAwOworCisJLyogSWYgd2UgYXJlIGFscmVhZHkgaW5zaWRlIGEgdHJhbnNhY3Rpb24gb3IgdGhlIHRocmVhZCBjYW5ub3QKKwkgKiBkbyBJL08sIHdlIGNhbm5vdCByZWxlYXNlIHRoaXMgcGFnZS4KKwkgKi8KKwlpZiAoUEZMQUdTX1RFU1RfRlNUUkFOUygpKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogQ29udmVydCBkZWxhbGxvYyBzcGFjZSB0byByZWFsIHNwYWNlLCBkbyBub3QgZmx1c2ggdGhlCisJICogZGF0YSBvdXQgdG8gZGlzaywgdGhhdCB3aWxsIGJlIGRvbmUgYnkgdGhlIGNhbGxlci4KKwkgKiBOZXZlciBuZWVkIHRvIGFsbG9jYXRlIHNwYWNlIGhlcmUgLSB3ZSB3aWxsIGFsd2F5cworCSAqIGNvbWUgYmFjayB0byB3cml0ZXBhZ2UgaW4gdGhhdCBjYXNlLgorCSAqLworCWRpcnR5ID0geGZzX3BhZ2Vfc3RhdGVfY29udmVydChpbm9kZSwgcGFnZSwgJndiYywgMCwgMCk7CisJaWYgKGRpcnR5ID09IDAgJiYgIXVud3JpdHRlbikKKwkJZ290byBmcmVlX2J1ZmZlcnM7CisJcmV0dXJuIDA7CisKK2ZyZWVfYnVmZmVyczoKKwlyZXR1cm4gdHJ5X3RvX2ZyZWVfYnVmZmVycyhwYWdlKTsKK30KKworU1RBVElDIGludAorbGludmZzX3ByZXBhcmVfd3JpdGUoCisJc3RydWN0IGZpbGUJCSpmaWxlLAorCXN0cnVjdCBwYWdlCQkqcGFnZSwKKwl1bnNpZ25lZCBpbnQJCWZyb20sCisJdW5zaWduZWQgaW50CQl0bykKK3sKKwlyZXR1cm4gYmxvY2tfcHJlcGFyZV93cml0ZShwYWdlLCBmcm9tLCB0bywgbGludmZzX2dldF9ibG9jayk7Cit9CisKK3N0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgbGludmZzX2FvcHMgPSB7CisJLnJlYWRwYWdlCQk9IGxpbnZmc19yZWFkcGFnZSwKKwkucmVhZHBhZ2VzCQk9IGxpbnZmc19yZWFkcGFnZXMsCisJLndyaXRlcGFnZQkJPSBsaW52ZnNfd3JpdGVwYWdlLAorCS5zeW5jX3BhZ2UJCT0gYmxvY2tfc3luY19wYWdlLAorCS5yZWxlYXNlcGFnZQkJPSBsaW52ZnNfcmVsZWFzZV9wYWdlLAorCS5wcmVwYXJlX3dyaXRlCQk9IGxpbnZmc19wcmVwYXJlX3dyaXRlLAorCS5jb21taXRfd3JpdGUJCT0gZ2VuZXJpY19jb21taXRfd3JpdGUsCisJLmJtYXAJCQk9IGxpbnZmc19ibWFwLAorCS5kaXJlY3RfSU8JCT0gbGludmZzX2RpcmVjdF9JTywKK307CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZTBlYjYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19idWYuYwpAQCAtMCwwICsxLDE5ODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKy8qCisgKglUaGUgeGZzX2J1Zi5jIGNvZGUgcHJvdmlkZXMgYW4gYWJzdHJhY3QgYnVmZmVyIGNhY2hlIG1vZGVsIG9uIHRvcAorICoJb2YgdGhlIExpbnV4IHBhZ2UgY2FjaGUuICBDYWNoZWQgbWV0YWRhdGEgYmxvY2tzIGZvciBhIGZpbGUgc3lzdGVtCisgKglhcmUgaGFzaGVkIHRvIHRoZSBpbm9kZSBmb3IgdGhlIGJsb2NrIGRldmljZS4gIHhmc19idWYuYyBhc3NlbWJsZXMKKyAqCWJ1ZmZlcnMgKHhmc19idWZfdCkgb24gZGVtYW5kIHRvIGFnZ3JlZ2F0ZSBzdWNoIGNhY2hlZCBwYWdlcyBmb3IgSS9PLgorICoKKyAqICAgICAgV3JpdHRlbiBieSBTdGV2ZSBMb3JkLCBKaW0gTW9zdGVrLCBSdXNzZWxsIENhdHRlbGFuCisgKgkJICAgIGFuZCBSYWphZ29wYWwgQW5hbnRoYW5hcmF5YW5hbiAoImFuYW50aCIpIGF0IFNHSS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXNoLmg+CisKKyNpbmNsdWRlICJ4ZnNfbGludXguaCIKKworLyoKKyAqIEZpbGUgd2lkZSBnbG9iYWxzCisgKi8KKworU1RBVElDIGttZW1fY2FjaGVfdCAqcGFnZWJ1Zl9jYWNoZTsKK1NUQVRJQyBrbWVtX3NoYWtlcl90IHBhZ2VidWZfc2hha2U7CitTVEFUSUMgaW50IHBhZ2VidWZfZGFlbW9uX3dha2V1cChpbnQsIHVuc2lnbmVkIGludCk7CitTVEFUSUMgdm9pZCBwYWdlYnVmX2RlbHdyaV9xdWV1ZSh4ZnNfYnVmX3QgKiwgaW50KTsKK1NUQVRJQyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqcGFnZWJ1Zl9sb2dpb193b3JrcXVldWU7CitTVEFUSUMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnBhZ2VidWZfZGF0YWlvX3dvcmtxdWV1ZTsKKworLyoKKyAqIFBhZ2VidWYgZGVidWdnaW5nCisgKi8KKworI2lmZGVmIFBBR0VCVUZfVFJBQ0UKK3ZvaWQKK3BhZ2VidWZfdHJhY2UoCisJeGZzX2J1Zl90CSpwYiwKKwljaGFyCQkqaWQsCisJdm9pZAkJKmRhdGEsCisJdm9pZAkJKnJhKQoreworCWt0cmFjZV9lbnRlcihwYWdlYnVmX3RyYWNlX2J1ZiwKKwkJcGIsIGlkLAorCQkodm9pZCAqKSh1bnNpZ25lZCBsb25nKXBiLT5wYl9mbGFncywKKwkJKHZvaWQgKikodW5zaWduZWQgbG9uZylwYi0+cGJfaG9sZC5jb3VudGVyLAorCQkodm9pZCAqKSh1bnNpZ25lZCBsb25nKXBiLT5wYl9zZW1hLmNvdW50LmNvdW50ZXIsCisJCSh2b2lkICopY3VycmVudCwKKwkJZGF0YSwgcmEsCisJCSh2b2lkICopKHVuc2lnbmVkIGxvbmcpKChwYi0+cGJfZmlsZV9vZmZzZXQ+PjMyKSAmIDB4ZmZmZmZmZmYpLAorCQkodm9pZCAqKSh1bnNpZ25lZCBsb25nKShwYi0+cGJfZmlsZV9vZmZzZXQgJiAweGZmZmZmZmZmKSwKKwkJKHZvaWQgKikodW5zaWduZWQgbG9uZylwYi0+cGJfYnVmZmVyX2xlbmd0aCwKKwkJTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CitrdHJhY2VfdCAqcGFnZWJ1Zl90cmFjZV9idWY7CisjZGVmaW5lIFBBR0VCVUZfVFJBQ0VfU0laRQk0MDk2CisjZGVmaW5lIFBCX1RSQUNFKHBiLCBpZCwgZGF0YSkJXAorCXBhZ2VidWZfdHJhY2UocGIsIGlkLCAodm9pZCAqKWRhdGEsICh2b2lkICopX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKQorI2Vsc2UKKyNkZWZpbmUgUEJfVFJBQ0UocGIsIGlkLCBkYXRhKQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2lmZGVmIFBBR0VCVUZfTE9DS19UUkFDS0lORworIyBkZWZpbmUgUEJfU0VUX09XTkVSKHBiKQkoKHBiKS0+cGJfbGFzdF9ob2xkZXIgPSBjdXJyZW50LT5waWQpCisjIGRlZmluZSBQQl9DTEVBUl9PV05FUihwYikJKChwYiktPnBiX2xhc3RfaG9sZGVyID0gLTEpCisjIGRlZmluZSBQQl9HRVRfT1dORVIocGIpCSgocGIpLT5wYl9sYXN0X2hvbGRlcikKKyNlbHNlCisjIGRlZmluZSBQQl9TRVRfT1dORVIocGIpCWRvIHsgfSB3aGlsZSAoMCkKKyMgZGVmaW5lIFBCX0NMRUFSX09XTkVSKHBiKQlkbyB7IH0gd2hpbGUgKDApCisjIGRlZmluZSBQQl9HRVRfT1dORVIocGIpCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisvKgorICogUGFnZWJ1ZiBhbGxvY2F0aW9uIC8gZnJlZWluZy4KKyAqLworCisjZGVmaW5lIHBiX3RvX2dmcChmbGFncykgXAorCSgoKChmbGFncykgJiBQQkZfUkVBRF9BSEVBRCkgPyBfX0dGUF9OT1JFVFJZIDogXAorCSAgKChmbGFncykgJiBQQkZfRE9OVF9CTE9DSykgPyBHRlBfTk9GUyA6IEdGUF9LRVJORUwpIHwgX19HRlBfTk9XQVJOKQorCisjZGVmaW5lIHBiX3RvX2ttKGZsYWdzKSBcCisJICgoKGZsYWdzKSAmIFBCRl9ET05UX0JMT0NLKSA/IEtNX05PRlMgOiBLTV9TTEVFUCkKKworCisjZGVmaW5lIHBhZ2VidWZfYWxsb2NhdGUoZmxhZ3MpIFwKKwlrbWVtX3pvbmVfYWxsb2MocGFnZWJ1Zl9jYWNoZSwgcGJfdG9fa20oZmxhZ3MpKQorI2RlZmluZSBwYWdlYnVmX2RlYWxsb2NhdGUocGIpIFwKKwlrbWVtX3pvbmVfZnJlZShwYWdlYnVmX2NhY2hlLCAocGIpKTsKKworLyoKKyAqIFBhZ2UgUmVnaW9uIGludGVyZmFjZXMuCisgKgorICogRm9yIHBhZ2VzIGluIGZpbGVzeXN0ZW1zIHdoZXJlIHRoZSBibG9ja3NpemUgaXMgc21hbGxlciB0aGFuIHRoZQorICogcGFnZXNpemUsIHdlIHVzZSB0aGUgcGFnZS0+cHJpdmF0ZSBmaWVsZCAobG9uZykgdG8gaG9sZCBhIGJpdG1hcAorICogb2YgdXB0b2RhdGUgcmVnaW9ucyB3aXRoaW4gdGhlIHBhZ2UuCisgKgorICogRWFjaCBzdWNoIHJlZ2lvbiBpcyAiYnl0ZXMgcGVyIHBhZ2UgLyBiaXRzIHBlciBsb25nIiBieXRlcyBsb25nLgorICoKKyAqIE5CUFBSID09IG51bWJlci1vZi1ieXRlcy1wZXItcGFnZS1yZWdpb24KKyAqIEJUT1BSID09IGJ5dGVzLXRvLXBhZ2UtcmVnaW9uIChyb3VuZGVkIHVwKQorICogQlRPUFJUID09IGJ5dGVzLXRvLXBhZ2UtcmVnaW9uLXRydW5jYXRlZCAocm91bmRlZCBkb3duKQorICovCisjaWYgKEJJVFNfUEVSX0xPTkcgPT0gMzIpCisjZGVmaW5lIFBSU0hJRlQJCShQQUdFX0NBQ0hFX1NISUZUIC0gNSkJLyogKDMyID09IDE8PDUpICovCisjZWxpZiAoQklUU19QRVJfTE9ORyA9PSA2NCkKKyNkZWZpbmUgUFJTSElGVAkJKFBBR0VfQ0FDSEVfU0hJRlQgLSA2KQkvKiAoNjQgPT0gMTw8NikgKi8KKyNlbHNlCisjZXJyb3IgQklUU19QRVJfTE9ORyBtdXN0IGJlIDMyIG9yIDY0CisjZW5kaWYKKyNkZWZpbmUgTkJQUFIJCShQQUdFX0NBQ0hFX1NJWkUvQklUU19QRVJfTE9ORykKKyNkZWZpbmUgQlRPUFIoYikJKCgodW5zaWduZWQgaW50KShiKSArIChOQlBQUiAtIDEpKSA+PiBQUlNISUZUKQorI2RlZmluZSBCVE9QUlQoYikJKCgodW5zaWduZWQgaW50KShiKSA+PiBQUlNISUZUKSkKKworU1RBVElDIHVuc2lnbmVkIGxvbmcKK3BhZ2VfcmVnaW9uX21hc2soCisJc2l6ZV90CQlvZmZzZXQsCisJc2l6ZV90CQlsZW5ndGgpCit7CisJdW5zaWduZWQgbG9uZwltYXNrOworCWludAkJZmlyc3QsIGZpbmFsOworCisJZmlyc3QgPSBCVE9QUihvZmZzZXQpOworCWZpbmFsID0gQlRPUFJUKG9mZnNldCArIGxlbmd0aCAtIDEpOworCWZpcnN0ID0gbWluKGZpcnN0LCBmaW5hbCk7CisKKwltYXNrID0gfjBVTDsKKwltYXNrIDw8PSBCSVRTX1BFUl9MT05HIC0gKGZpbmFsIC0gZmlyc3QpOworCW1hc2sgPj49IEJJVFNfUEVSX0xPTkcgLSAoZmluYWwpOworCisJQVNTRVJUKG9mZnNldCArIGxlbmd0aCA8PSBQQUdFX0NBQ0hFX1NJWkUpOworCUFTU0VSVCgoZmluYWwgLSBmaXJzdCkgPCBCSVRTX1BFUl9MT05HICYmIChmaW5hbCAtIGZpcnN0KSA+PSAwKTsKKworCXJldHVybiBtYXNrOworfQorCitTVEFUSUMgaW5saW5lIHZvaWQKK3NldF9wYWdlX3JlZ2lvbigKKwlzdHJ1Y3QgcGFnZQkqcGFnZSwKKwlzaXplX3QJCW9mZnNldCwKKwlzaXplX3QJCWxlbmd0aCkKK3sKKwlwYWdlLT5wcml2YXRlIHw9IHBhZ2VfcmVnaW9uX21hc2sob2Zmc2V0LCBsZW5ndGgpOworCWlmIChwYWdlLT5wcml2YXRlID09IH4wVUwpCisJCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKK30KKworU1RBVElDIGlubGluZSBpbnQKK3Rlc3RfcGFnZV9yZWdpb24oCisJc3RydWN0IHBhZ2UJKnBhZ2UsCisJc2l6ZV90CQlvZmZzZXQsCisJc2l6ZV90CQlsZW5ndGgpCit7CisJdW5zaWduZWQgbG9uZwltYXNrID0gcGFnZV9yZWdpb25fbWFzayhvZmZzZXQsIGxlbmd0aCk7CisKKwlyZXR1cm4gKG1hc2sgJiYgKHBhZ2UtPnByaXZhdGUgJiBtYXNrKSA9PSBtYXNrKTsKK30KKworLyoKKyAqIE1hcHBpbmcgb2YgbXVsdGktcGFnZSBidWZmZXJzIGludG8gY29udGlndW91cyB2aXJ0dWFsIHNwYWNlCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgYV9saXN0IHsKKwl2b2lkCQkqdm1fYWRkcjsKKwlzdHJ1Y3QgYV9saXN0CSpuZXh0OworfSBhX2xpc3RfdDsKKworU1RBVElDIGFfbGlzdF90CQkqYXNfZnJlZV9oZWFkOworU1RBVElDIGludAkJYXNfbGlzdF9sZW47CitTVEFUSUMgREVGSU5FX1NQSU5MT0NLKGFzX2xvY2spOworCisvKgorICogVHJ5IHRvIGJhdGNoIHZ1bm1hcHMgYmVjYXVzZSB0aGV5IGFyZSBjb3N0bHkuCisgKi8KK1NUQVRJQyB2b2lkCitmcmVlX2FkZHJlc3MoCisJdm9pZAkJKmFkZHIpCit7CisJYV9saXN0X3QJKmFlbnRyeTsKKworCWFlbnRyeSA9IGttYWxsb2Moc2l6ZW9mKGFfbGlzdF90KSwgR0ZQX0FUT01JQyAmIH5fX0dGUF9ISUdIKTsKKwlpZiAobGlrZWx5KGFlbnRyeSkpIHsKKwkJc3Bpbl9sb2NrKCZhc19sb2NrKTsKKwkJYWVudHJ5LT5uZXh0ID0gYXNfZnJlZV9oZWFkOworCQlhZW50cnktPnZtX2FkZHIgPSBhZGRyOworCQlhc19mcmVlX2hlYWQgPSBhZW50cnk7CisJCWFzX2xpc3RfbGVuKys7CisJCXNwaW5fdW5sb2NrKCZhc19sb2NrKTsKKwl9IGVsc2UgeworCQl2dW5tYXAoYWRkcik7CisJfQorfQorCitTVEFUSUMgdm9pZAorcHVyZ2VfYWRkcmVzc2VzKHZvaWQpCit7CisJYV9saXN0X3QJKmFlbnRyeSwgKm9sZDsKKworCWlmIChhc19mcmVlX2hlYWQgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrKCZhc19sb2NrKTsKKwlhZW50cnkgPSBhc19mcmVlX2hlYWQ7CisJYXNfZnJlZV9oZWFkID0gTlVMTDsKKwlhc19saXN0X2xlbiA9IDA7CisJc3Bpbl91bmxvY2soJmFzX2xvY2spOworCisJd2hpbGUgKChvbGQgPSBhZW50cnkpICE9IE5VTEwpIHsKKwkJdnVubWFwKGFlbnRyeS0+dm1fYWRkcik7CisJCWFlbnRyeSA9IGFlbnRyeS0+bmV4dDsKKwkJa2ZyZWUob2xkKTsKKwl9Cit9CisKKy8qCisgKglJbnRlcm5hbCBwYWdlYnVmIG9iamVjdCBtYW5pcHVsYXRpb24KKyAqLworCitTVEFUSUMgdm9pZAorX3BhZ2VidWZfaW5pdGlhbGl6ZSgKKwl4ZnNfYnVmX3QJCSpwYiwKKwl4ZnNfYnVmdGFyZ190CQkqdGFyZ2V0LAorCWxvZmZfdAkJCXJhbmdlX2Jhc2UsCisJc2l6ZV90CQkJcmFuZ2VfbGVuZ3RoLAorCXBhZ2VfYnVmX2ZsYWdzX3QJZmxhZ3MpCit7CisJLyoKKwkgKiBXZSBkb24ndCB3YW50IGNlcnRhaW4gZmxhZ3MgdG8gYXBwZWFyIGluIHBiLT5wYl9mbGFncy4KKwkgKi8KKwlmbGFncyAmPSB+KFBCRl9MT0NLfFBCRl9NQVBQRUR8UEJGX0RPTlRfQkxPQ0t8UEJGX1JFQURfQUhFQUQpOworCisJbWVtc2V0KHBiLCAwLCBzaXplb2YoeGZzX2J1Zl90KSk7CisJYXRvbWljX3NldCgmcGItPnBiX2hvbGQsIDEpOworCWluaXRfTVVURVhfTE9DS0VEKCZwYi0+cGJfaW9kb25lc2VtYSk7CisJSU5JVF9MSVNUX0hFQUQoJnBiLT5wYl9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmcGItPnBiX2hhc2hfbGlzdCk7CisJaW5pdF9NVVRFWF9MT0NLRUQoJnBiLT5wYl9zZW1hKTsgLyogaGVsZCwgbm8gd2FpdGVycyAqLworCVBCX1NFVF9PV05FUihwYik7CisJcGItPnBiX3RhcmdldCA9IHRhcmdldDsKKwlwYi0+cGJfZmlsZV9vZmZzZXQgPSByYW5nZV9iYXNlOworCS8qCisJICogU2V0IGJ1ZmZlcl9sZW5ndGggYW5kIGNvdW50X2Rlc2lyZWQgdG8gdGhlIHNhbWUgdmFsdWUgaW5pdGlhbGx5LgorCSAqIEkvTyByb3V0aW5lcyBzaG91bGQgdXNlIGNvdW50X2Rlc2lyZWQsIHdoaWNoIHdpbGwgYmUgdGhlIHNhbWUgaW4KKwkgKiBtb3N0IGNhc2VzIGJ1dCBtYXkgYmUgcmVzZXQgKGUuZy4gWEZTIHJlY292ZXJ5KS4KKwkgKi8KKwlwYi0+cGJfYnVmZmVyX2xlbmd0aCA9IHBiLT5wYl9jb3VudF9kZXNpcmVkID0gcmFuZ2VfbGVuZ3RoOworCXBiLT5wYl9mbGFncyA9IGZsYWdzIHwgUEJGX05PTkU7CisJcGItPnBiX2JuID0gWEZTX0JVRl9EQUREUl9OVUxMOworCWF0b21pY19zZXQoJnBiLT5wYl9waW5fY291bnQsIDApOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBiLT5wYl93YWl0ZXJzKTsKKworCVhGU19TVEFUU19JTkMocGJfY3JlYXRlKTsKKwlQQl9UUkFDRShwYiwgImluaXRpYWxpemUiLCB0YXJnZXQpOworfQorCisvKgorICogQWxsb2NhdGUgYSBwYWdlIGFycmF5IGNhcGFibGUgb2YgaG9sZGluZyBhIHNwZWNpZmllZCBudW1iZXIKKyAqIG9mIHBhZ2VzLCBhbmQgcG9pbnQgdGhlIHBhZ2UgYnVmIGF0IGl0LgorICovCitTVEFUSUMgaW50CitfcGFnZWJ1Zl9nZXRfcGFnZXMoCisJeGZzX2J1Zl90CQkqcGIsCisJaW50CQkJcGFnZV9jb3VudCwKKwlwYWdlX2J1Zl9mbGFnc190CWZsYWdzKQoreworCS8qIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYSBwYWdlIGxpc3QgKi8KKwlpZiAocGItPnBiX3BhZ2VzID09IE5VTEwpIHsKKwkJcGItPnBiX29mZnNldCA9IHBhZ2VfYnVmX3BvZmYocGItPnBiX2ZpbGVfb2Zmc2V0KTsKKwkJcGItPnBiX3BhZ2VfY291bnQgPSBwYWdlX2NvdW50OworCQlpZiAocGFnZV9jb3VudCA8PSBQQl9QQUdFUykgeworCQkJcGItPnBiX3BhZ2VzID0gcGItPnBiX3BhZ2VfYXJyYXk7CisJCX0gZWxzZSB7CisJCQlwYi0+cGJfcGFnZXMgPSBrbWVtX2FsbG9jKHNpemVvZihzdHJ1Y3QgcGFnZSAqKSAqCisJCQkJCXBhZ2VfY291bnQsIHBiX3RvX2ttKGZsYWdzKSk7CisJCQlpZiAocGItPnBiX3BhZ2VzID09IE5VTEwpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJbWVtc2V0KHBiLT5wYl9wYWdlcywgMCwgc2l6ZW9mKHN0cnVjdCBwYWdlICopICogcGFnZV9jb3VudCk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICoJRnJlZXMgcGJfcGFnZXMgaWYgaXQgd2FzIG1hbGxvY2VkLgorICovCitTVEFUSUMgdm9pZAorX3BhZ2VidWZfZnJlZV9wYWdlcygKKwl4ZnNfYnVmX3QJKmJwKQoreworCWlmIChicC0+cGJfcGFnZXMgIT0gYnAtPnBiX3BhZ2VfYXJyYXkpIHsKKwkJa21lbV9mcmVlKGJwLT5wYl9wYWdlcywKKwkJCSAgYnAtPnBiX3BhZ2VfY291bnQgKiBzaXplb2Yoc3RydWN0IHBhZ2UgKikpOworCX0KK30KKworLyoKKyAqCVJlbGVhc2VzIHRoZSBzcGVjaWZpZWQgYnVmZmVyLgorICoKKyAqIAlUaGUgbW9kaWZpY2F0aW9uIHN0YXRlIG9mIGFueSBhc3NvY2lhdGVkIHBhZ2VzIGlzIGxlZnQgdW5jaGFuZ2VkLgorICogCVRoZSBidWZmZXIgbW9zdCBub3QgYmUgb24gYW55IGhhc2ggLSB1c2UgcGFnZWJ1Zl9yZWxlIGluc3RlYWQgZm9yCisgKiAJaGFzaGVkIGFuZCByZWZjb3VudGVkIGJ1ZmZlcnMKKyAqLwordm9pZAorcGFnZWJ1Zl9mcmVlKAorCXhmc19idWZfdAkJKmJwKQoreworCVBCX1RSQUNFKGJwLCAiZnJlZSIsIDApOworCisJQVNTRVJUKGxpc3RfZW1wdHkoJmJwLT5wYl9oYXNoX2xpc3QpKTsKKworCWlmIChicC0+cGJfZmxhZ3MgJiBfUEJGX1BBR0VfQ0FDSEUpIHsKKwkJdWludAkJaTsKKworCQlpZiAoKGJwLT5wYl9mbGFncyAmIFBCRl9NQVBQRUQpICYmIChicC0+cGJfcGFnZV9jb3VudCA+IDEpKQorCQkJZnJlZV9hZGRyZXNzKGJwLT5wYl9hZGRyIC0gYnAtPnBiX29mZnNldCk7CisKKwkJZm9yIChpID0gMDsgaSA8IGJwLT5wYl9wYWdlX2NvdW50OyBpKyspCisJCQlwYWdlX2NhY2hlX3JlbGVhc2UoYnAtPnBiX3BhZ2VzW2ldKTsKKwkJX3BhZ2VidWZfZnJlZV9wYWdlcyhicCk7CisJfSBlbHNlIGlmIChicC0+cGJfZmxhZ3MgJiBfUEJGX0tNRU1fQUxMT0MpIHsKKwkJIC8qCisJCSAgKiBYWFgoaGNoKTogYnAtPnBiX2NvdW50X2Rlc2lyZWQgbWlnaHQgYmUgaW5jb3JyZWN0IChzZWUKKwkJICAqIHBhZ2VidWZfYXNzb2NpYXRlX21lbW9yeSBmb3IgZGV0YWlscyksIGJ1dCBmb3J0dW5hdGVseQorCQkgICogdGhlIExpbnV4IHZlcnNpb24gb2Yga21lbV9mcmVlIGlnbm9yZXMgdGhlIGxlbiBhcmd1bWVudC4uCisJCSAgKi8KKwkJa21lbV9mcmVlKGJwLT5wYl9hZGRyLCBicC0+cGJfY291bnRfZGVzaXJlZCk7CisJCV9wYWdlYnVmX2ZyZWVfcGFnZXMoYnApOworCX0KKworCXBhZ2VidWZfZGVhbGxvY2F0ZShicCk7Cit9CisKKy8qCisgKglGaW5kcyBhbGwgcGFnZXMgZm9yIGJ1ZmZlciBpbiBxdWVzdGlvbiBhbmQgYnVpbGRzIGl0J3MgcGFnZSBsaXN0LgorICovCitTVEFUSUMgaW50CitfcGFnZWJ1Zl9sb29rdXBfcGFnZXMoCisJeGZzX2J1Zl90CQkqYnAsCisJdWludAkJCWZsYWdzKQoreworCXN0cnVjdCBhZGRyZXNzX3NwYWNlCSptYXBwaW5nID0gYnAtPnBiX3RhcmdldC0+cGJyX21hcHBpbmc7CisJc2l6ZV90CQkJYmxvY2tzaXplID0gYnAtPnBiX3RhcmdldC0+cGJyX2JzaXplOworCXNpemVfdAkJCXNpemUgPSBicC0+cGJfY291bnRfZGVzaXJlZDsKKwlzaXplX3QJCQluYnl0ZXMsIG9mZnNldDsKKwlpbnQJCQlnZnBfbWFzayA9IHBiX3RvX2dmcChmbGFncyk7CisJdW5zaWduZWQgc2hvcnQJCXBhZ2VfY291bnQsIGk7CisJcGdvZmZfdAkJCWZpcnN0OworCWxvZmZfdAkJCWVuZDsKKwlpbnQJCQllcnJvcjsKKworCWVuZCA9IGJwLT5wYl9maWxlX29mZnNldCArIGJwLT5wYl9idWZmZXJfbGVuZ3RoOworCXBhZ2VfY291bnQgPSBwYWdlX2J1Zl9idG9jKGVuZCkgLSBwYWdlX2J1Zl9idG9jdChicC0+cGJfZmlsZV9vZmZzZXQpOworCisJZXJyb3IgPSBfcGFnZWJ1Zl9nZXRfcGFnZXMoYnAsIHBhZ2VfY291bnQsIGZsYWdzKTsKKwlpZiAodW5saWtlbHkoZXJyb3IpKQorCQlyZXR1cm4gZXJyb3I7CisJYnAtPnBiX2ZsYWdzIHw9IF9QQkZfUEFHRV9DQUNIRTsKKworCW9mZnNldCA9IGJwLT5wYl9vZmZzZXQ7CisJZmlyc3QgPSBicC0+cGJfZmlsZV9vZmZzZXQgPj4gUEFHRV9DQUNIRV9TSElGVDsKKworCWZvciAoaSA9IDA7IGkgPCBicC0+cGJfcGFnZV9jb3VudDsgaSsrKSB7CisJCXN0cnVjdCBwYWdlCSpwYWdlOworCQl1aW50CQlyZXRyaWVzID0gMDsKKworCSAgICAgIHJldHJ5OgorCQlwYWdlID0gZmluZF9vcl9jcmVhdGVfcGFnZShtYXBwaW5nLCBmaXJzdCArIGksIGdmcF9tYXNrKTsKKwkJaWYgKHVubGlrZWx5KHBhZ2UgPT0gTlVMTCkpIHsKKwkJCWlmIChmbGFncyAmIFBCRl9SRUFEX0FIRUFEKSB7CisJCQkJYnAtPnBiX3BhZ2VfY291bnQgPSBpOworCQkJCWZvciAoaSA9IDA7IGkgPCBicC0+cGJfcGFnZV9jb3VudDsgaSsrKQorCQkJCQl1bmxvY2tfcGFnZShicC0+cGJfcGFnZXNbaV0pOworCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCisJCQkvKgorCQkJICogVGhpcyBjb3VsZCBkZWFkbG9jay4KKwkJCSAqCisJCQkgKiBCdXQgdW50aWwgYWxsIHRoZSBYRlMgbG93bGV2ZWwgY29kZSBpcyByZXZhbXBlZCB0bworCQkJICogaGFuZGxlIGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWx1cmVzIHdlIGNhbid0IGRvIG11Y2guCisJCQkgKi8KKwkJCWlmICghKCsrcmV0cmllcyAlIDEwMCkpCisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCSJYRlM6IHBvc3NpYmxlIG1lbW9yeSBhbGxvY2F0aW9uICIKKwkJCQkJImRlYWRsb2NrIGluICVzIChtb2RlOjB4JXgpXG4iLAorCQkJCQlfX0ZVTkNUSU9OX18sIGdmcF9tYXNrKTsKKworCQkJWEZTX1NUQVRTX0lOQyhwYl9wYWdlX3JldHJpZXMpOworCQkJcGFnZWJ1Zl9kYWVtb25fd2FrZXVwKDAsIGdmcF9tYXNrKTsKKwkJCWJsa19jb25nZXN0aW9uX3dhaXQoV1JJVEUsIEhaLzUwKTsKKwkJCWdvdG8gcmV0cnk7CisJCX0KKworCQlYRlNfU1RBVFNfSU5DKHBiX3BhZ2VfZm91bmQpOworCisJCW5ieXRlcyA9IG1pbl90KHNpemVfdCwgc2l6ZSwgUEFHRV9DQUNIRV9TSVpFIC0gb2Zmc2V0KTsKKwkJc2l6ZSAtPSBuYnl0ZXM7CisKKwkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJCXBhZ2VfY291bnQtLTsKKwkJCWlmIChibG9ja3NpemUgPj0gUEFHRV9DQUNIRV9TSVpFKSB7CisJCQkJaWYgKGZsYWdzICYgUEJGX1JFQUQpCisJCQkJCWJwLT5wYl9sb2NrZWQgPSAxOworCQkJfSBlbHNlIGlmICghUGFnZVByaXZhdGUocGFnZSkpIHsKKwkJCQlpZiAodGVzdF9wYWdlX3JlZ2lvbihwYWdlLCBvZmZzZXQsIG5ieXRlcykpCisJCQkJCXBhZ2VfY291bnQrKzsKKwkJCX0KKwkJfQorCisJCWJwLT5wYl9wYWdlc1tpXSA9IHBhZ2U7CisJCW9mZnNldCA9IDA7CisJfQorCisJaWYgKCFicC0+cGJfbG9ja2VkKSB7CisJCWZvciAoaSA9IDA7IGkgPCBicC0+cGJfcGFnZV9jb3VudDsgaSsrKQorCQkJdW5sb2NrX3BhZ2UoYnAtPnBiX3BhZ2VzW2ldKTsKKwl9CisKKwlpZiAocGFnZV9jb3VudCkgeworCQkvKiBpZiB3ZSBoYXZlIGFueSB1cHRvZGF0ZSBwYWdlcywgbWFyayB0aGF0IGluIHRoZSBidWZmZXIgKi8KKwkJYnAtPnBiX2ZsYWdzICY9IH5QQkZfTk9ORTsKKworCQkvKiBpZiBzb21lIHBhZ2VzIGFyZW4ndCB1cHRvZGF0ZSwgbWFyayB0aGF0IGluIHRoZSBidWZmZXIgKi8KKwkJaWYgKHBhZ2VfY291bnQgIT0gYnAtPnBiX3BhZ2VfY291bnQpCisJCQlicC0+cGJfZmxhZ3MgfD0gUEJGX1BBUlRJQUw7CisJfQorCisJUEJfVFJBQ0UoYnAsICJsb29rdXBfcGFnZXMiLCAobG9uZylwYWdlX2NvdW50KTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKglNYXAgYnVmZmVyIGludG8ga2VybmVsIGFkZHJlc3Mtc3BhY2UgaWYgbmVzc2VjYXJ5LgorICovCitTVEFUSUMgaW50CitfcGFnZWJ1Zl9tYXBfcGFnZXMoCisJeGZzX2J1Zl90CQkqYnAsCisJdWludAkJCWZsYWdzKQoreworCS8qIEEgc2luZ2xlIHBhZ2UgYnVmZmVyIGlzIGFsd2F5cyBtYXBwYWJsZSAqLworCWlmIChicC0+cGJfcGFnZV9jb3VudCA9PSAxKSB7CisJCWJwLT5wYl9hZGRyID0gcGFnZV9hZGRyZXNzKGJwLT5wYl9wYWdlc1swXSkgKyBicC0+cGJfb2Zmc2V0OworCQlicC0+cGJfZmxhZ3MgfD0gUEJGX01BUFBFRDsKKwl9IGVsc2UgaWYgKGZsYWdzICYgUEJGX01BUFBFRCkgeworCQlpZiAoYXNfbGlzdF9sZW4gPiA2NCkKKwkJCXB1cmdlX2FkZHJlc3NlcygpOworCQlicC0+cGJfYWRkciA9IHZtYXAoYnAtPnBiX3BhZ2VzLCBicC0+cGJfcGFnZV9jb3VudCwKKwkJCQlWTV9NQVAsIFBBR0VfS0VSTkVMKTsKKwkJaWYgKHVubGlrZWx5KGJwLT5wYl9hZGRyID09IE5VTEwpKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWJwLT5wYl9hZGRyICs9IGJwLT5wYl9vZmZzZXQ7CisJCWJwLT5wYl9mbGFncyB8PSBQQkZfTUFQUEVEOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICoJRmluZGluZyBhbmQgUmVhZGluZyBCdWZmZXJzCisgKi8KKworLyoKKyAqCV9wYWdlYnVmX2ZpbmQKKyAqCisgKglMb29rcyB1cCwgYW5kIGNyZWF0ZXMgaWYgYWJzZW50LCBhIGxvY2thYmxlIGJ1ZmZlciBmb3IKKyAqCWEgZ2l2ZW4gcmFuZ2Ugb2YgYW4gaW5vZGUuICBUaGUgYnVmZmVyIGlzIHJldHVybmVkCisgKglsb2NrZWQuCSBJZiBvdGhlciBvdmVybGFwcGluZyBidWZmZXJzIGV4aXN0LCB0aGV5IGFyZQorICoJcmVsZWFzZWQgYmVmb3JlIHRoZSBuZXcgYnVmZmVyIGlzIGNyZWF0ZWQgYW5kIGxvY2tlZCwKKyAqCXdoaWNoIG1heSBpbXBseSB0aGF0IHRoaXMgY2FsbCB3aWxsIGJsb2NrIHVudGlsIHRob3NlIGJ1ZmZlcnMKKyAqCWFyZSB1bmxvY2tlZC4gIE5vIEkvTyBpcyBpbXBsaWVkIGJ5IHRoaXMgY2FsbC4KKyAqLworeGZzX2J1Zl90ICoKK19wYWdlYnVmX2ZpbmQoCisJeGZzX2J1ZnRhcmdfdAkJKmJ0cCwJLyogYmxvY2sgZGV2aWNlIHRhcmdldAkJKi8KKwlsb2ZmX3QJCQlpb2ZmLAkvKiBzdGFydGluZyBvZmZzZXQgb2YgcmFuZ2UJKi8KKwlzaXplX3QJCQlpc2l6ZSwJLyogbGVuZ3RoIG9mIHJhbmdlCQkqLworCXBhZ2VfYnVmX2ZsYWdzX3QJZmxhZ3MsCS8qIFBCRl9UUllMT0NLCQkJKi8KKwl4ZnNfYnVmX3QJCSpuZXdfcGIpLyogbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlcgkqLworeworCWxvZmZfdAkJCXJhbmdlX2Jhc2U7CisJc2l6ZV90CQkJcmFuZ2VfbGVuZ3RoOworCXhmc19idWZoYXNoX3QJCSpoYXNoOworCXhmc19idWZfdAkJKnBiLCAqbjsKKworCXJhbmdlX2Jhc2UgPSAoaW9mZiA8PCBCQlNISUZUKTsKKwlyYW5nZV9sZW5ndGggPSAoaXNpemUgPDwgQkJTSElGVCk7CisKKwkvKiBDaGVjayBmb3IgSU9zIHNtYWxsZXIgdGhhbiB0aGUgc2VjdG9yIHNpemUgLyBub3Qgc2VjdG9yIGFsaWduZWQgKi8KKwlBU1NFUlQoIShyYW5nZV9sZW5ndGggPCAoMSA8PCBidHAtPnBicl9zc2hpZnQpKSk7CisJQVNTRVJUKCEocmFuZ2VfYmFzZSAmIChsb2ZmX3QpYnRwLT5wYnJfc21hc2spKTsKKworCWhhc2ggPSAmYnRwLT5idF9oYXNoW2hhc2hfbG9uZygodW5zaWduZWQgbG9uZylpb2ZmLCBidHAtPmJ0X2hhc2hzaGlmdCldOworCisJc3Bpbl9sb2NrKCZoYXNoLT5iaF9sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYiwgbiwgJmhhc2gtPmJoX2xpc3QsIHBiX2hhc2hfbGlzdCkgeworCQlBU1NFUlQoYnRwID09IHBiLT5wYl90YXJnZXQpOworCQlpZiAocGItPnBiX2ZpbGVfb2Zmc2V0ID09IHJhbmdlX2Jhc2UgJiYKKwkJICAgIHBiLT5wYl9idWZmZXJfbGVuZ3RoID09IHJhbmdlX2xlbmd0aCkgeworCQkJLyoKKwkJCSAqIElmIHdlIGxvb2sgYXQgc29tZXRoaW5nIGJyaW5nIGl0IHRvIHRoZQorCQkJICogZnJvbnQgb2YgdGhlIGxpc3QgZm9yIG5leHQgdGltZS4KKwkJCSAqLworCQkJYXRvbWljX2luYygmcGItPnBiX2hvbGQpOworCQkJbGlzdF9tb3ZlKCZwYi0+cGJfaGFzaF9saXN0LCAmaGFzaC0+YmhfbGlzdCk7CisJCQlnb3RvIGZvdW5kOworCQl9CisJfQorCisJLyogTm8gbWF0Y2ggZm91bmQgKi8KKwlpZiAobmV3X3BiKSB7CisJCV9wYWdlYnVmX2luaXRpYWxpemUobmV3X3BiLCBidHAsIHJhbmdlX2Jhc2UsCisJCQkJcmFuZ2VfbGVuZ3RoLCBmbGFncyk7CisJCW5ld19wYi0+cGJfaGFzaCA9IGhhc2g7CisJCWxpc3RfYWRkKCZuZXdfcGItPnBiX2hhc2hfbGlzdCwgJmhhc2gtPmJoX2xpc3QpOworCX0gZWxzZSB7CisJCVhGU19TVEFUU19JTkMocGJfbWlzc19sb2NrZWQpOworCX0KKworCXNwaW5fdW5sb2NrKCZoYXNoLT5iaF9sb2NrKTsKKwlyZXR1cm4gbmV3X3BiOworCitmb3VuZDoKKwlzcGluX3VubG9jaygmaGFzaC0+YmhfbG9jayk7CisKKwkvKiBBdHRlbXB0IHRvIGdldCB0aGUgc2VtYXBob3JlIHdpdGhvdXQgc2xlZXBpbmcsCisJICogaWYgdGhpcyBkb2VzIG5vdCB3b3JrIHRoZW4gd2UgbmVlZCB0byBkcm9wIHRoZQorCSAqIHNwaW5sb2NrIGFuZCBkbyBhIGhhcmQgYXR0ZW1wdCBvbiB0aGUgc2VtYXBob3JlLgorCSAqLworCWlmIChkb3duX3RyeWxvY2soJnBiLT5wYl9zZW1hKSkgeworCQlpZiAoIShmbGFncyAmIFBCRl9UUllMT0NLKSkgeworCQkJLyogd2FpdCBmb3IgYnVmZmVyIG93bmVyc2hpcCAqLworCQkJUEJfVFJBQ0UocGIsICJnZXRfbG9jayIsIDApOworCQkJcGFnZWJ1Zl9sb2NrKHBiKTsKKwkJCVhGU19TVEFUU19JTkMocGJfZ2V0X2xvY2tlZF93YWl0ZWQpOworCQl9IGVsc2UgeworCQkJLyogV2UgYXNrZWQgZm9yIGEgdHJ5bG9jayBhbmQgZmFpbGVkLCBubyBuZWVkCisJCQkgKiB0byBsb29rIGF0IGZpbGUgb2Zmc2V0IGFuZCBsZW5ndGggaGVyZSwgd2UKKwkJCSAqIGtub3cgdGhhdCB0aGlzIHBhZ2VidWYgYXQgbGVhc3Qgb3ZlcmxhcHMgb3VyCisJCQkgKiBwYWdlYnVmIGFuZCBpcyBsb2NrZWQsIHRoZXJlZm9yZSBvdXIgYnVmZmVyCisJCQkgKiBlaXRoZXIgZG9lcyBub3QgZXhpc3QsIG9yIGlzIHRoaXMgYnVmZmVyCisJCQkgKi8KKworCQkJcGFnZWJ1Zl9yZWxlKHBiKTsKKwkJCVhGU19TVEFUU19JTkMocGJfYnVzeV9sb2NrZWQpOworCQkJcmV0dXJuIChOVUxMKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIHRyeWxvY2sgd29ya2VkICovCisJCVBCX1NFVF9PV05FUihwYik7CisJfQorCisJaWYgKHBiLT5wYl9mbGFncyAmIFBCRl9TVEFMRSkKKwkJcGItPnBiX2ZsYWdzICY9IFBCRl9NQVBQRUQ7CisJUEJfVFJBQ0UocGIsICJnb3RfbG9jayIsIDApOworCVhGU19TVEFUU19JTkMocGJfZ2V0X2xvY2tlZCk7CisJcmV0dXJuIChwYik7Cit9CisKKy8qCisgKgl4ZnNfYnVmX2dldF9mbGFncyBhc3NlbWJsZXMgYSBidWZmZXIgY292ZXJpbmcgdGhlIHNwZWNpZmllZCByYW5nZS4KKyAqCisgKglTdG9yYWdlIGluIG1lbW9yeSBmb3IgYWxsIHBvcnRpb25zIG9mIHRoZSBidWZmZXIgd2lsbCBiZSBhbGxvY2F0ZWQsCisgKglhbHRob3VnaCBiYWNraW5nIHN0b3JhZ2UgbWF5IG5vdCBiZS4KKyAqLworeGZzX2J1Zl90ICoKK3hmc19idWZfZ2V0X2ZsYWdzKAkJCS8qIGFsbG9jYXRlIGEgYnVmZmVyCQkqLworCXhmc19idWZ0YXJnX3QJCSp0YXJnZXQsLyogdGFyZ2V0IGZvciBidWZmZXIJCSovCisJbG9mZl90CQkJaW9mZiwJLyogc3RhcnRpbmcgb2Zmc2V0IG9mIHJhbmdlCSovCisJc2l6ZV90CQkJaXNpemUsCS8qIGxlbmd0aCBvZiByYW5nZQkJKi8KKwlwYWdlX2J1Zl9mbGFnc190CWZsYWdzKQkvKiBQQkZfVFJZTE9DSwkJCSovCit7CisJeGZzX2J1Zl90CQkqcGIsICpuZXdfcGI7CisJaW50CQkJZXJyb3IgPSAwLCBpOworCisJbmV3X3BiID0gcGFnZWJ1Zl9hbGxvY2F0ZShmbGFncyk7CisJaWYgKHVubGlrZWx5KCFuZXdfcGIpKQorCQlyZXR1cm4gTlVMTDsKKworCXBiID0gX3BhZ2VidWZfZmluZCh0YXJnZXQsIGlvZmYsIGlzaXplLCBmbGFncywgbmV3X3BiKTsKKwlpZiAocGIgPT0gbmV3X3BiKSB7CisJCWVycm9yID0gX3BhZ2VidWZfbG9va3VwX3BhZ2VzKHBiLCBmbGFncyk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gbm9fYnVmZmVyOworCX0gZWxzZSB7CisJCXBhZ2VidWZfZGVhbGxvY2F0ZShuZXdfcGIpOworCQlpZiAodW5saWtlbHkocGIgPT0gTlVMTCkpCisJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgcGItPnBiX3BhZ2VfY291bnQ7IGkrKykKKwkJbWFya19wYWdlX2FjY2Vzc2VkKHBiLT5wYl9wYWdlc1tpXSk7CisKKwlpZiAoIShwYi0+cGJfZmxhZ3MgJiBQQkZfTUFQUEVEKSkgeworCQllcnJvciA9IF9wYWdlYnVmX21hcF9wYWdlcyhwYiwgZmxhZ3MpOworCQlpZiAodW5saWtlbHkoZXJyb3IpKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogZmFpbGVkIHRvIG1hcCBwYWdlc1xuIiwKKwkJCQkJX19GVU5DVElPTl9fKTsKKwkJCWdvdG8gbm9fYnVmZmVyOworCQl9CisJfQorCisJWEZTX1NUQVRTX0lOQyhwYl9nZXQpOworCisJLyoKKwkgKiBBbHdheXMgZmlsbCBpbiB0aGUgYmxvY2sgbnVtYmVyIG5vdywgdGhlIG1hcHBlZCBjYXNlcyBjYW4gZG8KKwkgKiB0aGVpciBvd24gb3ZlcmxheSBvZiB0aGlzIGxhdGVyLgorCSAqLworCXBiLT5wYl9ibiA9IGlvZmY7CisJcGItPnBiX2NvdW50X2Rlc2lyZWQgPSBwYi0+cGJfYnVmZmVyX2xlbmd0aDsKKworCVBCX1RSQUNFKHBiLCAiZ2V0IiwgKHVuc2lnbmVkIGxvbmcpZmxhZ3MpOworCXJldHVybiBwYjsKKworIG5vX2J1ZmZlcjoKKwlpZiAoZmxhZ3MgJiAoUEJGX0xPQ0sgfCBQQkZfVFJZTE9DSykpCisJCXBhZ2VidWZfdW5sb2NrKHBiKTsKKwlwYWdlYnVmX3JlbGUocGIpOworCXJldHVybiBOVUxMOworfQorCit4ZnNfYnVmX3QgKgoreGZzX2J1Zl9yZWFkX2ZsYWdzKAorCXhmc19idWZ0YXJnX3QJCSp0YXJnZXQsCisJbG9mZl90CQkJaW9mZiwKKwlzaXplX3QJCQlpc2l6ZSwKKwlwYWdlX2J1Zl9mbGFnc190CWZsYWdzKQoreworCXhmc19idWZfdAkJKnBiOworCisJZmxhZ3MgfD0gUEJGX1JFQUQ7CisKKwlwYiA9IHhmc19idWZfZ2V0X2ZsYWdzKHRhcmdldCwgaW9mZiwgaXNpemUsIGZsYWdzKTsKKwlpZiAocGIpIHsKKwkJaWYgKFBCRl9OT1RfRE9ORShwYikpIHsKKwkJCVBCX1RSQUNFKHBiLCAicmVhZCIsICh1bnNpZ25lZCBsb25nKWZsYWdzKTsKKwkJCVhGU19TVEFUU19JTkMocGJfZ2V0X3JlYWQpOworCQkJcGFnZWJ1Zl9pb3N0YXJ0KHBiLCBmbGFncyk7CisJCX0gZWxzZSBpZiAoZmxhZ3MgJiBQQkZfQVNZTkMpIHsKKwkJCVBCX1RSQUNFKHBiLCAicmVhZF9hc3luYyIsICh1bnNpZ25lZCBsb25nKWZsYWdzKTsKKwkJCS8qCisJCQkgKiBSZWFkIGFoZWFkIGNhbGwgd2hpY2ggaXMgYWxyZWFkeSBzYXRpc2ZpZWQsCisJCQkgKiBkcm9wIHRoZSBidWZmZXIKKwkJCSAqLworCQkJZ290byBub19idWZmZXI7CisJCX0gZWxzZSB7CisJCQlQQl9UUkFDRShwYiwgInJlYWRfZG9uZSIsICh1bnNpZ25lZCBsb25nKWZsYWdzKTsKKwkJCS8qIFdlIGRvIG5vdCB3YW50IHJlYWQgaW4gdGhlIGZsYWdzICovCisJCQlwYi0+cGJfZmxhZ3MgJj0gflBCRl9SRUFEOworCQl9CisJfQorCisJcmV0dXJuIHBiOworCisgbm9fYnVmZmVyOgorCWlmIChmbGFncyAmIChQQkZfTE9DSyB8IFBCRl9UUllMT0NLKSkKKwkJcGFnZWJ1Zl91bmxvY2socGIpOworCXBhZ2VidWZfcmVsZShwYik7CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBDcmVhdGUgYSBza2VsZXRhbCBwYWdlYnVmIChubyBwYWdlcyBhc3NvY2lhdGVkIHdpdGggaXQpLgorICovCit4ZnNfYnVmX3QgKgorcGFnZWJ1Zl9sb29rdXAoCisJeGZzX2J1ZnRhcmdfdAkJKnRhcmdldCwKKwlsb2ZmX3QJCQlpb2ZmLAorCXNpemVfdAkJCWlzaXplLAorCXBhZ2VfYnVmX2ZsYWdzX3QJZmxhZ3MpCit7CisJeGZzX2J1Zl90CQkqcGI7CisKKwlwYiA9IHBhZ2VidWZfYWxsb2NhdGUoZmxhZ3MpOworCWlmIChwYikgeworCQlfcGFnZWJ1Zl9pbml0aWFsaXplKHBiLCB0YXJnZXQsIGlvZmYsIGlzaXplLCBmbGFncyk7CisJfQorCXJldHVybiBwYjsKK30KKworLyoKKyAqIElmIHdlIGFyZSBub3QgbG93IG9uIG1lbW9yeSB0aGVuIGRvIHRoZSByZWFkYWhlYWQgaW4gYSBkZWFkbG9jaworICogc2FmZSBtYW5uZXIuCisgKi8KK3ZvaWQKK3BhZ2VidWZfcmVhZGFoZWFkKAorCXhmc19idWZ0YXJnX3QJCSp0YXJnZXQsCisJbG9mZl90CQkJaW9mZiwKKwlzaXplX3QJCQlpc2l6ZSwKKwlwYWdlX2J1Zl9mbGFnc190CWZsYWdzKQoreworCXN0cnVjdCBiYWNraW5nX2Rldl9pbmZvICpiZGk7CisKKwliZGkgPSB0YXJnZXQtPnBicl9tYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvOworCWlmIChiZGlfcmVhZF9jb25nZXN0ZWQoYmRpKSkKKwkJcmV0dXJuOworCisJZmxhZ3MgfD0gKFBCRl9UUllMT0NLfFBCRl9BU1lOQ3xQQkZfUkVBRF9BSEVBRCk7CisJeGZzX2J1Zl9yZWFkX2ZsYWdzKHRhcmdldCwgaW9mZiwgaXNpemUsIGZsYWdzKTsKK30KKworeGZzX2J1Zl90ICoKK3BhZ2VidWZfZ2V0X2VtcHR5KAorCXNpemVfdAkJCWxlbiwKKwl4ZnNfYnVmdGFyZ190CQkqdGFyZ2V0KQoreworCXhmc19idWZfdAkJKnBiOworCisJcGIgPSBwYWdlYnVmX2FsbG9jYXRlKDApOworCWlmIChwYikKKwkJX3BhZ2VidWZfaW5pdGlhbGl6ZShwYiwgdGFyZ2V0LCAwLCBsZW4sIDApOworCXJldHVybiBwYjsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqCittZW1fdG9fcGFnZSgKKwl2b2lkCQkJKmFkZHIpCit7CisJaWYgKCgodW5zaWduZWQgbG9uZylhZGRyIDwgVk1BTExPQ19TVEFSVCkgfHwKKwkgICAgKCh1bnNpZ25lZCBsb25nKWFkZHIgPj0gVk1BTExPQ19FTkQpKSB7CisJCXJldHVybiB2aXJ0X3RvX3BhZ2UoYWRkcik7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHZtYWxsb2NfdG9fcGFnZShhZGRyKTsKKwl9Cit9CisKK2ludAorcGFnZWJ1Zl9hc3NvY2lhdGVfbWVtb3J5KAorCXhmc19idWZfdAkJKnBiLAorCXZvaWQJCQkqbWVtLAorCXNpemVfdAkJCWxlbikKK3sKKwlpbnQJCQlydmFsOworCWludAkJCWkgPSAwOworCXNpemVfdAkJCXB0cjsKKwlzaXplX3QJCQllbmQsIGVuZF9jdXI7CisJb2ZmX3QJCQlvZmZzZXQ7CisJaW50CQkJcGFnZV9jb3VudDsKKworCXBhZ2VfY291bnQgPSBQQUdFX0NBQ0hFX0FMSUdOKGxlbikgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwlvZmZzZXQgPSAob2ZmX3QpIG1lbSAtICgob2ZmX3QpbWVtICYgUEFHRV9DQUNIRV9NQVNLKTsKKwlpZiAob2Zmc2V0ICYmIChsZW4gPiBQQUdFX0NBQ0hFX1NJWkUpKQorCQlwYWdlX2NvdW50Kys7CisKKwkvKiBGcmVlIGFueSBwcmV2aW91cyBzZXQgb2YgcGFnZSBwb2ludGVycyAqLworCWlmIChwYi0+cGJfcGFnZXMpCisJCV9wYWdlYnVmX2ZyZWVfcGFnZXMocGIpOworCisJcGItPnBiX3BhZ2VzID0gTlVMTDsKKwlwYi0+cGJfYWRkciA9IG1lbTsKKworCXJ2YWwgPSBfcGFnZWJ1Zl9nZXRfcGFnZXMocGIsIHBhZ2VfY291bnQsIDApOworCWlmIChydmFsKQorCQlyZXR1cm4gcnZhbDsKKworCXBiLT5wYl9vZmZzZXQgPSBvZmZzZXQ7CisJcHRyID0gKHNpemVfdCkgbWVtICYgUEFHRV9DQUNIRV9NQVNLOworCWVuZCA9IFBBR0VfQ0FDSEVfQUxJR04oKHNpemVfdCkgbWVtICsgbGVuKTsKKwllbmRfY3VyID0gZW5kOworCS8qIHNldCB1cCBmaXJzdCBwYWdlICovCisJcGItPnBiX3BhZ2VzWzBdID0gbWVtX3RvX3BhZ2UobWVtKTsKKworCXB0ciArPSBQQUdFX0NBQ0hFX1NJWkU7CisJcGItPnBiX3BhZ2VfY291bnQgPSArK2k7CisJd2hpbGUgKHB0ciA8IGVuZCkgeworCQlwYi0+cGJfcGFnZXNbaV0gPSBtZW1fdG9fcGFnZSgodm9pZCAqKXB0cik7CisJCXBiLT5wYl9wYWdlX2NvdW50ID0gKytpOworCQlwdHIgKz0gUEFHRV9DQUNIRV9TSVpFOworCX0KKwlwYi0+cGJfbG9ja2VkID0gMDsKKworCXBiLT5wYl9jb3VudF9kZXNpcmVkID0gcGItPnBiX2J1ZmZlcl9sZW5ndGggPSBsZW47CisJcGItPnBiX2ZsYWdzIHw9IFBCRl9NQVBQRUQ7CisKKwlyZXR1cm4gMDsKK30KKworeGZzX2J1Zl90ICoKK3BhZ2VidWZfZ2V0X25vX2RhZGRyKAorCXNpemVfdAkJCWxlbiwKKwl4ZnNfYnVmdGFyZ190CQkqdGFyZ2V0KQoreworCXNpemVfdAkJCW1hbGxvY19sZW4gPSBsZW47CisJeGZzX2J1Zl90CQkqYnA7CisJdm9pZAkJCSpkYXRhOworCWludAkJCWVycm9yOworCisJYnAgPSBwYWdlYnVmX2FsbG9jYXRlKDApOworCWlmICh1bmxpa2VseShicCA9PSBOVUxMKSkKKwkJZ290byBmYWlsOworCV9wYWdlYnVmX2luaXRpYWxpemUoYnAsIHRhcmdldCwgMCwgbGVuLCBQQkZfRk9SQ0VJTyk7CisKKyB0cnlfYWdhaW46CisJZGF0YSA9IGttZW1fYWxsb2MobWFsbG9jX2xlbiwgS01fU0xFRVAgfCBLTV9NQVlGQUlMKTsKKwlpZiAodW5saWtlbHkoZGF0YSA9PSBOVUxMKSkKKwkJZ290byBmYWlsX2ZyZWVfYnVmOworCisJLyogY2hlY2sgd2hldGhlciBhbGlnbm1lbnQgbWF0Y2hlcy4uICovCisJaWYgKChfX3BzdW5zaWduZWRfdClkYXRhICE9CisJICAgICgoX19wc3Vuc2lnbmVkX3QpZGF0YSAmIH50YXJnZXQtPnBicl9zbWFzaykpIHsKKwkJLyogLi4gZWxzZSBkb3VibGUgdGhlIHNpemUgYW5kIHRyeSBhZ2FpbiAqLworCQlrbWVtX2ZyZWUoZGF0YSwgbWFsbG9jX2xlbik7CisJCW1hbGxvY19sZW4gPDw9IDE7CisJCWdvdG8gdHJ5X2FnYWluOworCX0KKworCWVycm9yID0gcGFnZWJ1Zl9hc3NvY2lhdGVfbWVtb3J5KGJwLCBkYXRhLCBsZW4pOworCWlmIChlcnJvcikKKwkJZ290byBmYWlsX2ZyZWVfbWVtOworCWJwLT5wYl9mbGFncyB8PSBfUEJGX0tNRU1fQUxMT0M7CisKKwlwYWdlYnVmX3VubG9jayhicCk7CisKKwlQQl9UUkFDRShicCwgIm5vX2RhZGRyIiwgZGF0YSk7CisJcmV0dXJuIGJwOworIGZhaWxfZnJlZV9tZW06CisJa21lbV9mcmVlKGRhdGEsIG1hbGxvY19sZW4pOworIGZhaWxfZnJlZV9idWY6CisJcGFnZWJ1Zl9mcmVlKGJwKTsKKyBmYWlsOgorCXJldHVybiBOVUxMOworfQorCisvKgorICoJcGFnZWJ1Zl9ob2xkCisgKgorICoJSW5jcmVtZW50IHJlZmVyZW5jZSBjb3VudCBvbiBidWZmZXIsIHRvIGhvbGQgdGhlIGJ1ZmZlciBjb25jdXJyZW50bHkKKyAqCXdpdGggYW5vdGhlciB0aHJlYWQgd2hpY2ggbWF5IHJlbGVhc2UgKGZyZWUpIHRoZSBidWZmZXIgYXN5bmNocm9ub3VzbHkuCisgKgorICoJTXVzdCBob2xkIHRoZSBidWZmZXIgYWxyZWFkeSB0byBjYWxsIHRoaXMgZnVuY3Rpb24uCisgKi8KK3ZvaWQKK3BhZ2VidWZfaG9sZCgKKwl4ZnNfYnVmX3QJCSpwYikKK3sKKwlhdG9taWNfaW5jKCZwYi0+cGJfaG9sZCk7CisJUEJfVFJBQ0UocGIsICJob2xkIiwgMCk7Cit9CisKKy8qCisgKglwYWdlYnVmX3JlbGUKKyAqCisgKglwYWdlYnVmX3JlbGUgcmVsZWFzZXMgYSBob2xkIG9uIHRoZSBzcGVjaWZpZWQgYnVmZmVyLiAgSWYgdGhlCisgKgl0aGUgaG9sZCBjb3VudCBpcyAxLCBwYWdlYnVmX3JlbGUgY2FsbHMgcGFnZWJ1Zl9mcmVlLgorICovCit2b2lkCitwYWdlYnVmX3JlbGUoCisJeGZzX2J1Zl90CQkqcGIpCit7CisJeGZzX2J1Zmhhc2hfdAkJKmhhc2ggPSBwYi0+cGJfaGFzaDsKKworCVBCX1RSQUNFKHBiLCAicmVsZSIsIHBiLT5wYl9yZWxzZSk7CisKKwkvKgorCSAqIHBhZ2VidWZfbG9va3VwIGJ1ZmZlcnMgYXJlIG5vdCBoYXNoZWQsIG5vdCBkZWxheWVkIHdyaXRlLAorCSAqIGFuZCBkb24ndCBoYXZlIHRoZWlyIG93biByZWxlYXNlIHJvdXRpbmVzLiAgU3BlY2lhbCBjYXNlLgorCSAqLworCWlmICh1bmxpa2VseSghaGFzaCkpIHsKKwkJQVNTRVJUKCFwYi0+cGJfcmVsc2UpOworCQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcGItPnBiX2hvbGQpKQorCQkJeGZzX2J1Zl9mcmVlKHBiKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChhdG9taWNfZGVjX2FuZF9sb2NrKCZwYi0+cGJfaG9sZCwgJmhhc2gtPmJoX2xvY2spKSB7CisJCWludAkJZG9fZnJlZSA9IDE7CisKKwkJaWYgKHBiLT5wYl9yZWxzZSkgeworCQkJYXRvbWljX2luYygmcGItPnBiX2hvbGQpOworCQkJc3Bpbl91bmxvY2soJmhhc2gtPmJoX2xvY2spOworCQkJKCoocGItPnBiX3JlbHNlKSkgKHBiKTsKKwkJCXNwaW5fbG9jaygmaGFzaC0+YmhfbG9jayk7CisJCQlkb19mcmVlID0gMDsKKwkJfQorCisJCWlmIChwYi0+cGJfZmxhZ3MgJiBQQkZfREVMV1JJKSB7CisJCQlwYi0+cGJfZmxhZ3MgfD0gUEJGX0FTWU5DOworCQkJYXRvbWljX2luYygmcGItPnBiX2hvbGQpOworCQkJcGFnZWJ1Zl9kZWx3cmlfcXVldWUocGIsIDApOworCQkJZG9fZnJlZSA9IDA7CisJCX0gZWxzZSBpZiAocGItPnBiX2ZsYWdzICYgUEJGX0ZTX01BTkFHRUQpIHsKKwkJCWRvX2ZyZWUgPSAwOworCQl9CisKKwkJaWYgKGRvX2ZyZWUpIHsKKwkJCWxpc3RfZGVsX2luaXQoJnBiLT5wYl9oYXNoX2xpc3QpOworCQkJc3Bpbl91bmxvY2soJmhhc2gtPmJoX2xvY2spOworCQkJcGFnZWJ1Zl9mcmVlKHBiKTsKKwkJfSBlbHNlIHsKKwkJCXNwaW5fdW5sb2NrKCZoYXNoLT5iaF9sb2NrKTsKKwkJfQorCX0KK30KKworCisvKgorICoJTXV0dWFsIGV4Y2x1c2lvbiBvbiBidWZmZXJzLiAgTG9ja2luZyBtb2RlbDoKKyAqCisgKglCdWZmZXJzIGFzc29jaWF0ZWQgd2l0aCBpbm9kZXMgZm9yIHdoaWNoIGJ1ZmZlciBsb2NraW5nCisgKglpcyBub3QgZW5hYmxlZCBhcmUgbm90IHByb3RlY3RlZCBieSBzZW1hcGhvcmVzLCBhbmQgYXJlCisgKglhc3N1bWVkIHRvIGJlIGV4Y2x1c2l2ZWx5IG93bmVkIGJ5IHRoZSBjYWxsZXIuICBUaGVyZSBpcyBhCisgKglzcGlubG9jayBpbiB0aGUgYnVmZmVyLCB1c2VkIGJ5IHRoZSBjYWxsZXIgd2hlbiBjb25jdXJyZW50CisgKglhY2Nlc3MgaXMgcG9zc2libGUuCisgKi8KKworLyoKKyAqCXBhZ2VidWZfY29uZF9sb2NrCisgKgorICoJcGFnZWJ1Zl9jb25kX2xvY2sgbG9ja3MgYSBidWZmZXIgb2JqZWN0LCBpZiBpdCBpcyBub3QgYWxyZWFkeSBsb2NrZWQuCisgKglOb3RlIHRoYXQgdGhpcyBpbiBubyB3YXkKKyAqCWxvY2tzIHRoZSB1bmRlcmx5aW5nIHBhZ2VzLCBzbyBpdCBpcyBvbmx5IHVzZWZ1bCBmb3Igc3luY2hyb25pemluZworICoJY29uY3VycmVudCB1c2Ugb2YgcGFnZSBidWZmZXIgb2JqZWN0cywgbm90IGZvciBzeW5jaHJvbml6aW5nIGluZGVwZW5kZW50CisgKglhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgcGFnZXMuCisgKi8KK2ludAorcGFnZWJ1Zl9jb25kX2xvY2soCQkJLyogbG9jayBidWZmZXIsIGlmIG5vdCBsb2NrZWQJKi8KKwkJCQkJLyogcmV0dXJucyAtRUJVU1kgaWYgbG9ja2VkKQkqLworCXhmc19idWZfdAkJKnBiKQoreworCWludAkJCWxvY2tlZDsKKworCWxvY2tlZCA9IGRvd25fdHJ5bG9jaygmcGItPnBiX3NlbWEpID09IDA7CisJaWYgKGxvY2tlZCkgeworCQlQQl9TRVRfT1dORVIocGIpOworCX0KKwlQQl9UUkFDRShwYiwgImNvbmRfbG9jayIsIChsb25nKWxvY2tlZCk7CisJcmV0dXJuKGxvY2tlZCA/IDAgOiAtRUJVU1kpOworfQorCisjaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChYRlNfQkxJX1RSQUNFKQorLyoKKyAqCXBhZ2VidWZfbG9ja192YWx1ZQorICoKKyAqCVJldHVybiBsb2NrIHZhbHVlIGZvciBhIHBhZ2VidWYKKyAqLworaW50CitwYWdlYnVmX2xvY2tfdmFsdWUoCisJeGZzX2J1Zl90CQkqcGIpCit7CisJcmV0dXJuKGF0b21pY19yZWFkKCZwYi0+cGJfc2VtYS5jb3VudCkpOworfQorI2VuZGlmCisKKy8qCisgKglwYWdlYnVmX2xvY2sKKyAqCisgKglwYWdlYnVmX2xvY2sgbG9ja3MgYSBidWZmZXIgb2JqZWN0LiAgTm90ZSB0aGF0IHRoaXMgaW4gbm8gd2F5CisgKglsb2NrcyB0aGUgdW5kZXJseWluZyBwYWdlcywgc28gaXQgaXMgb25seSB1c2VmdWwgZm9yIHN5bmNocm9uaXppbmcKKyAqCWNvbmN1cnJlbnQgdXNlIG9mIHBhZ2UgYnVmZmVyIG9iamVjdHMsIG5vdCBmb3Igc3luY2hyb25pemluZyBpbmRlcGVuZGVudAorICoJYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIHBhZ2VzLgorICovCitpbnQKK3BhZ2VidWZfbG9jaygKKwl4ZnNfYnVmX3QJCSpwYikKK3sKKwlQQl9UUkFDRShwYiwgImxvY2siLCAwKTsKKwlpZiAoYXRvbWljX3JlYWQoJnBiLT5wYl9pb19yZW1haW5pbmcpKQorCQlibGtfcnVuX2FkZHJlc3Nfc3BhY2UocGItPnBiX3RhcmdldC0+cGJyX21hcHBpbmcpOworCWRvd24oJnBiLT5wYl9zZW1hKTsKKwlQQl9TRVRfT1dORVIocGIpOworCVBCX1RSQUNFKHBiLCAibG9ja2VkIiwgMCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglwYWdlYnVmX3VubG9jaworICoKKyAqCXBhZ2VidWZfdW5sb2NrIHJlbGVhc2VzIHRoZSBsb2NrIG9uIHRoZSBidWZmZXIgb2JqZWN0IGNyZWF0ZWQgYnkKKyAqCXBhZ2VidWZfbG9jayBvciBwYWdlYnVmX2NvbmRfbG9jayAobm90IGFueQorICoJcGlubmluZyBvZiB1bmRlcmx5aW5nIHBhZ2VzIGNyZWF0ZWQgYnkgcGFnZWJ1Zl9waW4pLgorICovCit2b2lkCitwYWdlYnVmX3VubG9jaygJCQkJLyogdW5sb2NrIGJ1ZmZlcgkJKi8KKwl4ZnNfYnVmX3QJCSpwYikJLyogYnVmZmVyIHRvIHVubG9jawkJKi8KK3sKKwlQQl9DTEVBUl9PV05FUihwYik7CisJdXAoJnBiLT5wYl9zZW1hKTsKKwlQQl9UUkFDRShwYiwgInVubG9jayIsIDApOworfQorCisKKy8qCisgKglQaW5uaW5nIEJ1ZmZlciBTdG9yYWdlIGluIE1lbW9yeQorICovCisKKy8qCisgKglwYWdlYnVmX3BpbgorICoKKyAqCXBhZ2VidWZfcGluIGxvY2tzIGFsbCBvZiB0aGUgbWVtb3J5IHJlcHJlc2VudGVkIGJ5IGEgYnVmZmVyIGluCisgKgltZW1vcnkuICBNdWx0aXBsZSBjYWxscyB0byBwYWdlYnVmX3BpbiBhbmQgcGFnZWJ1Zl91bnBpbiwgZm9yCisgKgl0aGUgc2FtZSBvciBkaWZmZXJlbnQgYnVmZmVycyBhZmZlY3RpbmcgYSBnaXZlbiBwYWdlLCB3aWxsCisgKglwcm9wZXJseSBjb3VudCB0aGUgbnVtYmVyIG9mIG91dHN0YW5kaW5nICJwaW4iIHJlcXVlc3RzLiAgVGhlCisgKglidWZmZXIgbWF5IGJlIHJlbGVhc2VkIGFmdGVyIHRoZSBwYWdlYnVmX3BpbiBhbmQgYSBkaWZmZXJlbnQKKyAqCWJ1ZmZlciB1c2VkIHdoZW4gY2FsbGluZyBwYWdlYnVmX3VucGluLCBpZiBkZXNpcmVkLgorICoJcGFnZWJ1Zl9waW4gc2hvdWxkIGJlIHVzZWQgYnkgdGhlIGZpbGUgc3lzdGVtIHdoZW4gaXQgd2FudHMgYmUKKyAqCWFzc3VyZWQgdGhhdCBubyBhdHRlbXB0IHdpbGwgYmUgbWFkZSB0byBmb3JjZSB0aGUgYWZmZWN0ZWQKKyAqCW1lbW9yeSB0byBkaXNrLgkgSXQgZG9lcyBub3QgYXNzdXJlIHRoYXQgYSBnaXZlbiBsb2dpY2FsIHBhZ2UKKyAqCXdpbGwgbm90IGJlIG1vdmVkIHRvIGEgZGlmZmVyZW50IHBoeXNpY2FsIHBhZ2UuCisgKi8KK3ZvaWQKK3BhZ2VidWZfcGluKAorCXhmc19idWZfdAkJKnBiKQoreworCWF0b21pY19pbmMoJnBiLT5wYl9waW5fY291bnQpOworCVBCX1RSQUNFKHBiLCAicGluIiwgKGxvbmcpcGItPnBiX3Bpbl9jb3VudC5jb3VudGVyKTsKK30KKworLyoKKyAqCXBhZ2VidWZfdW5waW4KKyAqCisgKglwYWdlYnVmX3VucGluIHJldmVyc2VzIHRoZSBsb2NraW5nIG9mIG1lbW9yeSBwZXJmb3JtZWQgYnkKKyAqCXBhZ2VidWZfcGluLiAgTm90ZSB0aGF0IGJvdGggZnVuY3Rpb25zIGFmZmVjdGVkIHRoZSBsb2dpY2FsCisgKglwYWdlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGJ1ZmZlciwgbm90IHRoZSBidWZmZXIgaXRzZWxmLgorICovCit2b2lkCitwYWdlYnVmX3VucGluKAorCXhmc19idWZfdAkJKnBiKQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZwYi0+cGJfcGluX2NvdW50KSkgeworCQl3YWtlX3VwX2FsbCgmcGItPnBiX3dhaXRlcnMpOworCX0KKwlQQl9UUkFDRShwYiwgInVucGluIiwgKGxvbmcpcGItPnBiX3Bpbl9jb3VudC5jb3VudGVyKTsKK30KKworaW50CitwYWdlYnVmX2lzcGluKAorCXhmc19idWZfdAkJKnBiKQoreworCXJldHVybiBhdG9taWNfcmVhZCgmcGItPnBiX3Bpbl9jb3VudCk7Cit9CisKKy8qCisgKglwYWdlYnVmX3dhaXRfdW5waW4KKyAqCisgKglwYWdlYnVmX3dhaXRfdW5waW4gd2FpdHMgdW50aWwgYWxsIG9mIHRoZSBtZW1vcnkgYXNzb2NpYXRlZAorICoJd2l0aCB0aGUgYnVmZmVyIGlzIG5vdCBsb25nZXIgbG9ja2VkIGluIG1lbW9yeS4gIEl0IHJldHVybnMKKyAqCWltbWVkaWF0ZWx5IGlmIG5vbmUgb2YgdGhlIGFmZmVjdGVkIHBhZ2VzIGFyZSBsb2NrZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorX3BhZ2VidWZfd2FpdF91bnBpbigKKwl4ZnNfYnVmX3QJCSpwYikKK3sKKwlERUNMQVJFX1dBSVRRVUVVRQkod2FpdCwgY3VycmVudCk7CisKKwlpZiAoYXRvbWljX3JlYWQoJnBiLT5wYl9waW5fY291bnQpID09IDApCisJCXJldHVybjsKKworCWFkZF93YWl0X3F1ZXVlKCZwYi0+cGJfd2FpdGVycywgJndhaXQpOworCWZvciAoOzspIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlpZiAoYXRvbWljX3JlYWQoJnBiLT5wYl9waW5fY291bnQpID09IDApCisJCQlicmVhazsKKwkJaWYgKGF0b21pY19yZWFkKCZwYi0+cGJfaW9fcmVtYWluaW5nKSkKKwkJCWJsa19ydW5fYWRkcmVzc19zcGFjZShwYi0+cGJfdGFyZ2V0LT5wYnJfbWFwcGluZyk7CisJCXNjaGVkdWxlKCk7CisJfQorCXJlbW92ZV93YWl0X3F1ZXVlKCZwYi0+cGJfd2FpdGVycywgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Cit9CisKKy8qCisgKglCdWZmZXIgVXRpbGl0eSBSb3V0aW5lcworICovCisKKy8qCisgKglwYWdlYnVmX2lvZG9uZQorICoKKyAqCXBhZ2VidWZfaW9kb25lIG1hcmtzIGEgYnVmZmVyIGZvciB3aGljaCBJL08gaXMgaW4gcHJvZ3Jlc3MKKyAqCWRvbmUgd2l0aCByZXNwZWN0IHRvIHRoYXQgSS9PLglUaGUgcGJfaW9kb25lIHJvdXRpbmUsIGlmCisgKglwcmVzZW50LCB3aWxsIGJlIGNhbGxlZCBhcyBhIHNpZGUtZWZmZWN0LgorICovCitTVEFUSUMgdm9pZAorcGFnZWJ1Zl9pb2RvbmVfd29yaygKKwl2b2lkCQkJKnYpCit7CisJeGZzX2J1Zl90CQkqYnAgPSAoeGZzX2J1Zl90ICopdjsKKworCWlmIChicC0+cGJfaW9kb25lKQorCQkoKihicC0+cGJfaW9kb25lKSkoYnApOworCWVsc2UgaWYgKGJwLT5wYl9mbGFncyAmIFBCRl9BU1lOQykKKwkJeGZzX2J1Zl9yZWxzZShicCk7Cit9CisKK3ZvaWQKK3BhZ2VidWZfaW9kb25lKAorCXhmc19idWZfdAkJKnBiLAorCWludAkJCWRhdGFpbywKKwlpbnQJCQlzY2hlZHVsZSkKK3sKKwlwYi0+cGJfZmxhZ3MgJj0gfihQQkZfUkVBRCB8IFBCRl9XUklURSk7CisJaWYgKHBiLT5wYl9lcnJvciA9PSAwKSB7CisJCXBiLT5wYl9mbGFncyAmPSB+KFBCRl9QQVJUSUFMIHwgUEJGX05PTkUpOworCX0KKworCVBCX1RSQUNFKHBiLCAiaW9kb25lIiwgcGItPnBiX2lvZG9uZSk7CisKKwlpZiAoKHBiLT5wYl9pb2RvbmUpIHx8IChwYi0+cGJfZmxhZ3MgJiBQQkZfQVNZTkMpKSB7CisJCWlmIChzY2hlZHVsZSkgeworCQkJSU5JVF9XT1JLKCZwYi0+cGJfaW9kb25lX3dvcmssIHBhZ2VidWZfaW9kb25lX3dvcmssIHBiKTsKKwkJCXF1ZXVlX3dvcmsoZGF0YWlvID8gcGFnZWJ1Zl9kYXRhaW9fd29ya3F1ZXVlIDoKKwkJCQlwYWdlYnVmX2xvZ2lvX3dvcmtxdWV1ZSwgJnBiLT5wYl9pb2RvbmVfd29yayk7CisJCX0gZWxzZSB7CisJCQlwYWdlYnVmX2lvZG9uZV93b3JrKHBiKTsKKwkJfQorCX0gZWxzZSB7CisJCXVwKCZwYi0+cGJfaW9kb25lc2VtYSk7CisJfQorfQorCisvKgorICoJcGFnZWJ1Zl9pb2Vycm9yCisgKgorICoJcGFnZWJ1Zl9pb2Vycm9yIHNldHMgdGhlIGVycm9yIGNvZGUgZm9yIGEgYnVmZmVyLgorICovCit2b2lkCitwYWdlYnVmX2lvZXJyb3IoCQkJLyogbWFyay9jbGVhciBidWZmZXIgZXJyb3IgZmxhZyAqLworCXhmc19idWZfdAkJKnBiLAkvKiBidWZmZXIgdG8gbWFyawkJKi8KKwlpbnQJCQllcnJvcikJLyogZXJyb3IgdG8gc3RvcmUgKDAgaWYgbm9uZSkJKi8KK3sKKwlBU1NFUlQoZXJyb3IgPj0gMCAmJiBlcnJvciA8PSAweGZmZmYpOworCXBiLT5wYl9lcnJvciA9ICh1bnNpZ25lZCBzaG9ydCllcnJvcjsKKwlQQl9UUkFDRShwYiwgImlvZXJyb3IiLCAodW5zaWduZWQgbG9uZyllcnJvcik7Cit9CisKKy8qCisgKglwYWdlYnVmX2lvc3RhcnQKKyAqCisgKglwYWdlYnVmX2lvc3RhcnQgaW5pdGlhdGVzIEkvTyBvbiBhIGJ1ZmZlciwgYmFzZWQgb24gdGhlIGZsYWdzIHN1cHBsaWVkLgorICoJSWYgbmVjZXNzYXJ5LCBpdCB3aWxsIGFycmFuZ2UgZm9yIGFueSBkaXNrIHNwYWNlIGFsbG9jYXRpb24gcmVxdWlyZWQsCisgKglhbmQgaXQgd2lsbCBicmVhayB1cCB0aGUgcmVxdWVzdCBpZiB0aGUgYmxvY2sgbWFwcGluZ3MgcmVxdWlyZSBpdC4KKyAqCVRoZSBwYl9pb2RvbmUgcm91dGluZSBpbiB0aGUgYnVmZmVyIHN1cHBsaWVkIHdpbGwgb25seSBiZSBjYWxsZWQKKyAqCXdoZW4gYWxsIG9mIHRoZSBzdWJzaWRpYXJ5IEkvTyByZXF1ZXN0cywgaWYgYW55LCBoYXZlIGJlZW4gY29tcGxldGVkLgorICoJcGFnZWJ1Zl9pb3N0YXJ0IGNhbGxzIHRoZSBwYWdlYnVmX2lvaW5pdGlhdGUgcm91dGluZSBvcgorICoJcGFnZWJ1Zl9pb3JlcXVlc3QsIGlmIHRoZSBmb3JtZXIgcm91dGluZSBpcyBub3QgZGVmaW5lZCwgdG8gc3RhcnQKKyAqCXRoZSBJL08gb24gYSBnaXZlbiBsb3ctbGV2ZWwgcmVxdWVzdC4KKyAqLworaW50CitwYWdlYnVmX2lvc3RhcnQoCQkJLyogc3RhcnQgSS9PIG9uIGEgYnVmZmVyCSAgKi8KKwl4ZnNfYnVmX3QJCSpwYiwJLyogYnVmZmVyIHRvIHN0YXJ0CQkgICovCisJcGFnZV9idWZfZmxhZ3NfdAlmbGFncykJLyogUEJGX0xPQ0ssIFBCRl9BU1lOQywgUEJGX1JFQUQsICovCisJCQkJCS8qIFBCRl9XUklURSwgUEJGX0RFTFdSSSwJICAqLworCQkJCQkvKiBQQkZfRE9OVF9CTE9DSwkJICAqLworeworCWludAkJCXN0YXR1cyA9IDA7CisKKwlQQl9UUkFDRShwYiwgImlvc3RhcnQiLCAodW5zaWduZWQgbG9uZylmbGFncyk7CisKKwlpZiAoZmxhZ3MgJiBQQkZfREVMV1JJKSB7CisJCXBiLT5wYl9mbGFncyAmPSB+KFBCRl9SRUFEIHwgUEJGX1dSSVRFIHwgUEJGX0FTWU5DKTsKKwkJcGItPnBiX2ZsYWdzIHw9IGZsYWdzICYgKFBCRl9ERUxXUkkgfCBQQkZfQVNZTkMpOworCQlwYWdlYnVmX2RlbHdyaV9xdWV1ZShwYiwgMSk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJcGItPnBiX2ZsYWdzICY9IH4oUEJGX1JFQUQgfCBQQkZfV1JJVEUgfCBQQkZfQVNZTkMgfCBQQkZfREVMV1JJIHwgXAorCQkJUEJGX1JFQURfQUhFQUQgfCBfUEJGX1JVTl9RVUVVRVMpOworCXBiLT5wYl9mbGFncyB8PSBmbGFncyAmIChQQkZfUkVBRCB8IFBCRl9XUklURSB8IFBCRl9BU1lOQyB8IFwKKwkJCVBCRl9SRUFEX0FIRUFEIHwgX1BCRl9SVU5fUVVFVUVTKTsKKworCUJVR19PTihwYi0+cGJfYm4gPT0gWEZTX0JVRl9EQUREUl9OVUxMKTsKKworCS8qIEZvciB3cml0ZXMgYWxsb3cgYW4gYWx0ZXJuYXRlIHN0cmF0ZWd5IHJvdXRpbmUgdG8gcHJlY2VkZQorCSAqIHRoZSBhY3R1YWwgSS9PIHJlcXVlc3QgKHdoaWNoIG1heSBub3QgYmUgaXNzdWVkIGF0IGFsbCBpbgorCSAqIGEgc2h1dGRvd24gc2l0dWF0aW9uLCBmb3IgZXhhbXBsZSkuCisJICovCisJc3RhdHVzID0gKGZsYWdzICYgUEJGX1dSSVRFKSA/CisJCXBhZ2VidWZfaW9zdHJhdGVneShwYikgOiBwYWdlYnVmX2lvcmVxdWVzdChwYik7CisKKwkvKiBXYWl0IGZvciBJL08gaWYgd2UgYXJlIG5vdCBhbiBhc3luYyByZXF1ZXN0LgorCSAqIE5vdGU6IGFzeW5jIEkvTyByZXF1ZXN0IGNvbXBsZXRpb24gd2lsbCByZWxlYXNlIHRoZSBidWZmZXIsCisJICogYW5kIHRoYXQgY2FuIGFscmVhZHkgYmUgZG9uZSBieSB0aGlzIHBvaW50LiAgU28gdXNpbmcgdGhlCisJICogYnVmZmVyIHBvaW50ZXIgZnJvbSBoZXJlIG9uLCBhZnRlciBhc3luYyBJL08sIGlzIGludmFsaWQuCisJICovCisJaWYgKCFzdGF0dXMgJiYgIShmbGFncyAmIFBCRl9BU1lOQykpCisJCXN0YXR1cyA9IHBhZ2VidWZfaW93YWl0KHBiKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qCisgKiBIZWxwZXIgcm91dGluZSBmb3IgcGFnZWJ1Zl9pb3JlcXVlc3QKKyAqLworCitTVEFUSUMgX19pbmxpbmVfXyBpbnQKK19wYWdlYnVmX2lvbG9ja2VkKAorCXhmc19idWZfdAkJKnBiKQoreworCUFTU0VSVChwYi0+cGJfZmxhZ3MgJiAoUEJGX1JFQUR8UEJGX1dSSVRFKSk7CisJaWYgKHBiLT5wYl9mbGFncyAmIFBCRl9SRUFEKQorCQlyZXR1cm4gcGItPnBiX2xvY2tlZDsKKwlyZXR1cm4gMDsKK30KKworU1RBVElDIF9faW5saW5lX18gdm9pZAorX3BhZ2VidWZfaW9kb25lKAorCXhmc19idWZfdAkJKnBiLAorCWludAkJCXNjaGVkdWxlKQoreworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZwYi0+cGJfaW9fcmVtYWluaW5nKSA9PSAxKSB7CisJCXBiLT5wYl9sb2NrZWQgPSAwOworCQlwYWdlYnVmX2lvZG9uZShwYiwgKHBiLT5wYl9mbGFncyAmIFBCRl9GU19EQVRBSU9EKSwgc2NoZWR1bGUpOworCX0KK30KKworU1RBVElDIGludAorYmlvX2VuZF9pb19wYWdlYnVmKAorCXN0cnVjdCBiaW8JCSpiaW8sCisJdW5zaWduZWQgaW50CQlieXRlc19kb25lLAorCWludAkJCWVycm9yKQoreworCXhmc19idWZfdAkJKnBiID0gKHhmc19idWZfdCAqKWJpby0+YmlfcHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQJCWksIGJsb2Nrc2l6ZSA9IHBiLT5wYl90YXJnZXQtPnBicl9ic2l6ZTsKKwlzdHJ1Y3QgYmlvX3ZlYwkJKmJ2ZWMgPSBiaW8tPmJpX2lvX3ZlYzsKKworCWlmIChiaW8tPmJpX3NpemUpCisJCXJldHVybiAxOworCisJaWYgKCF0ZXN0X2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKSkKKwkJcGItPnBiX2Vycm9yID0gRUlPOworCisJZm9yIChpID0gMDsgaSA8IGJpby0+YmlfdmNudDsgaSsrLCBidmVjKyspIHsKKwkJc3RydWN0IHBhZ2UJKnBhZ2UgPSBidmVjLT5idl9wYWdlOworCisJCWlmIChwYi0+cGJfZXJyb3IpIHsKKwkJCVNldFBhZ2VFcnJvcihwYWdlKTsKKwkJfSBlbHNlIGlmIChibG9ja3NpemUgPT0gUEFHRV9DQUNIRV9TSVpFKSB7CisJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJCX0gZWxzZSBpZiAoIVBhZ2VQcml2YXRlKHBhZ2UpICYmCisJCQkJKHBiLT5wYl9mbGFncyAmIF9QQkZfUEFHRV9DQUNIRSkpIHsKKwkJCXNldF9wYWdlX3JlZ2lvbihwYWdlLCBidmVjLT5idl9vZmZzZXQsIGJ2ZWMtPmJ2X2xlbik7CisJCX0KKworCQlpZiAoX3BhZ2VidWZfaW9sb2NrZWQocGIpKSB7CisJCQl1bmxvY2tfcGFnZShwYWdlKTsKKwkJfQorCX0KKworCV9wYWdlYnVmX2lvZG9uZShwYiwgMSk7CisJYmlvX3B1dChiaW8pOworCXJldHVybiAwOworfQorCitTVEFUSUMgdm9pZAorX3BhZ2VidWZfaW9hcHBseSgKKwl4ZnNfYnVmX3QJCSpwYikKK3sKKwlpbnQJCQlpLCBydywgbWFwX2ksIHRvdGFsX25yX3BhZ2VzLCBucl9wYWdlczsKKwlzdHJ1Y3QgYmlvCQkqYmlvOworCWludAkJCW9mZnNldCA9IHBiLT5wYl9vZmZzZXQ7CisJaW50CQkJc2l6ZSA9IHBiLT5wYl9jb3VudF9kZXNpcmVkOworCXNlY3Rvcl90CQlzZWN0b3IgPSBwYi0+cGJfYm47CisJdW5zaWduZWQgaW50CQlibG9ja3NpemUgPSBwYi0+cGJfdGFyZ2V0LT5wYnJfYnNpemU7CisJaW50CQkJbG9ja2luZyA9IF9wYWdlYnVmX2lvbG9ja2VkKHBiKTsKKworCXRvdGFsX25yX3BhZ2VzID0gcGItPnBiX3BhZ2VfY291bnQ7CisJbWFwX2kgPSAwOworCisJaWYgKHBiLT5wYl9mbGFncyAmIF9QQkZfUlVOX1FVRVVFUykgeworCQlwYi0+cGJfZmxhZ3MgJj0gfl9QQkZfUlVOX1FVRVVFUzsKKwkJcncgPSAocGItPnBiX2ZsYWdzICYgUEJGX1JFQUQpID8gUkVBRF9TWU5DIDogV1JJVEVfU1lOQzsKKwl9IGVsc2UgeworCQlydyA9IChwYi0+cGJfZmxhZ3MgJiBQQkZfUkVBRCkgPyBSRUFEIDogV1JJVEU7CisJfQorCisJLyogU3BlY2lhbCBjb2RlIHBhdGggZm9yIHJlYWRpbmcgYSBzdWIgcGFnZSBzaXplIHBhZ2VidWYgaW4gLS0KKwkgKiB3ZSBwb3B1bGF0ZSB1cCB0aGUgd2hvbGUgcGFnZSwgYW5kIGhlbmNlIHRoZSBvdGhlciBtZXRhZGF0YQorCSAqIGluIHRoZSBzYW1lIHBhZ2UuICBUaGlzIG9wdGltaXphdGlvbiBpcyBvbmx5IHZhbGlkIHdoZW4gdGhlCisJICogZmlsZXN5c3RlbSBibG9jayBzaXplIGFuZCB0aGUgcGFnZSBzaXplIGFyZSBlcXVhbC4KKwkgKi8KKwlpZiAoKHBiLT5wYl9idWZmZXJfbGVuZ3RoIDwgUEFHRV9DQUNIRV9TSVpFKSAmJgorCSAgICAocGItPnBiX2ZsYWdzICYgUEJGX1JFQUQpICYmIGxvY2tpbmcgJiYKKwkgICAgKGJsb2Nrc2l6ZSA9PSBQQUdFX0NBQ0hFX1NJWkUpKSB7CisJCWJpbyA9IGJpb19hbGxvYyhHRlBfTk9JTywgMSk7CisKKwkJYmlvLT5iaV9iZGV2ID0gcGItPnBiX3RhcmdldC0+cGJyX2JkZXY7CisJCWJpby0+Ymlfc2VjdG9yID0gc2VjdG9yIC0gKG9mZnNldCA+PiBCQlNISUZUKTsKKwkJYmlvLT5iaV9lbmRfaW8gPSBiaW9fZW5kX2lvX3BhZ2VidWY7CisJCWJpby0+YmlfcHJpdmF0ZSA9IHBiOworCisJCWJpb19hZGRfcGFnZShiaW8sIHBiLT5wYl9wYWdlc1swXSwgUEFHRV9DQUNIRV9TSVpFLCAwKTsKKwkJc2l6ZSA9IDA7CisKKwkJYXRvbWljX2luYygmcGItPnBiX2lvX3JlbWFpbmluZyk7CisKKwkJZ290byBzdWJtaXRfaW87CisJfQorCisJLyogTG9jayBkb3duIHRoZSBwYWdlcyB3aGljaCB3ZSBuZWVkIHRvIGZvciB0aGUgcmVxdWVzdCAqLworCWlmIChsb2NraW5nICYmIChwYi0+cGJfZmxhZ3MgJiBQQkZfV1JJVEUpICYmIChwYi0+cGJfbG9ja2VkID09IDApKSB7CisJCWZvciAoaSA9IDA7IHNpemU7IGkrKykgeworCQkJaW50CQluYnl0ZXMgPSBQQUdFX0NBQ0hFX1NJWkUgLSBvZmZzZXQ7CisJCQlzdHJ1Y3QgcGFnZQkqcGFnZSA9IHBiLT5wYl9wYWdlc1tpXTsKKworCQkJaWYgKG5ieXRlcyA+IHNpemUpCisJCQkJbmJ5dGVzID0gc2l6ZTsKKworCQkJbG9ja19wYWdlKHBhZ2UpOworCisJCQlzaXplIC09IG5ieXRlczsKKwkJCW9mZnNldCA9IDA7CisJCX0KKwkJb2Zmc2V0ID0gcGItPnBiX29mZnNldDsKKwkJc2l6ZSA9IHBiLT5wYl9jb3VudF9kZXNpcmVkOworCX0KKworbmV4dF9jaHVuazoKKwlhdG9taWNfaW5jKCZwYi0+cGJfaW9fcmVtYWluaW5nKTsKKwlucl9wYWdlcyA9IEJJT19NQVhfU0VDVE9SUyA+PiAoUEFHRV9TSElGVCAtIEJCU0hJRlQpOworCWlmIChucl9wYWdlcyA+IHRvdGFsX25yX3BhZ2VzKQorCQlucl9wYWdlcyA9IHRvdGFsX25yX3BhZ2VzOworCisJYmlvID0gYmlvX2FsbG9jKEdGUF9OT0lPLCBucl9wYWdlcyk7CisJYmlvLT5iaV9iZGV2ID0gcGItPnBiX3RhcmdldC0+cGJyX2JkZXY7CisJYmlvLT5iaV9zZWN0b3IgPSBzZWN0b3I7CisJYmlvLT5iaV9lbmRfaW8gPSBiaW9fZW5kX2lvX3BhZ2VidWY7CisJYmlvLT5iaV9wcml2YXRlID0gcGI7CisKKwlmb3IgKDsgc2l6ZSAmJiBucl9wYWdlczsgbnJfcGFnZXMtLSwgbWFwX2krKykgeworCQlpbnQJbmJ5dGVzID0gUEFHRV9DQUNIRV9TSVpFIC0gb2Zmc2V0OworCisJCWlmIChuYnl0ZXMgPiBzaXplKQorCQkJbmJ5dGVzID0gc2l6ZTsKKworCQlpZiAoYmlvX2FkZF9wYWdlKGJpbywgcGItPnBiX3BhZ2VzW21hcF9pXSwKKwkJCQkJbmJ5dGVzLCBvZmZzZXQpIDwgbmJ5dGVzKQorCQkJYnJlYWs7CisKKwkJb2Zmc2V0ID0gMDsKKwkJc2VjdG9yICs9IG5ieXRlcyA+PiBCQlNISUZUOworCQlzaXplIC09IG5ieXRlczsKKwkJdG90YWxfbnJfcGFnZXMtLTsKKwl9CisKK3N1Ym1pdF9pbzoKKwlpZiAobGlrZWx5KGJpby0+Ymlfc2l6ZSkpIHsKKwkJc3VibWl0X2JpbyhydywgYmlvKTsKKwkJaWYgKHNpemUpCisJCQlnb3RvIG5leHRfY2h1bms7CisJfSBlbHNlIHsKKwkJYmlvX3B1dChiaW8pOworCQlwYWdlYnVmX2lvZXJyb3IocGIsIEVJTyk7CisJfQorfQorCisvKgorICoJcGFnZWJ1Zl9pb3JlcXVlc3QgLS0gdGhlIGNvcmUgSS9PIHJlcXVlc3Qgcm91dGluZS4KKyAqLworaW50CitwYWdlYnVmX2lvcmVxdWVzdCgJCQkvKiBzdGFydCByZWFsIEkvTwkJKi8KKwl4ZnNfYnVmX3QJCSpwYikJLyogYnVmZmVyIHRvIGNvbnZleSB0byBkZXZpY2UJKi8KK3sKKwlQQl9UUkFDRShwYiwgImlvcmVxdWVzdCIsIDApOworCisJaWYgKHBiLT5wYl9mbGFncyAmIFBCRl9ERUxXUkkpIHsKKwkJcGFnZWJ1Zl9kZWx3cmlfcXVldWUocGIsIDEpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocGItPnBiX2ZsYWdzICYgUEJGX1dSSVRFKSB7CisJCV9wYWdlYnVmX3dhaXRfdW5waW4ocGIpOworCX0KKworCXBhZ2VidWZfaG9sZChwYik7CisKKwkvKiBTZXQgdGhlIGNvdW50IHRvIDEgaW5pdGlhbGx5LCB0aGlzIHdpbGwgc3RvcCBhbiBJL08KKwkgKiBjb21wbGV0aW9uIGNhbGxvdXQgd2hpY2ggaGFwcGVucyBiZWZvcmUgd2UgaGF2ZSBzdGFydGVkCisJICogYWxsIHRoZSBJL08gZnJvbSBjYWxsaW5nIHBhZ2VidWZfaW9kb25lIHRvbyBlYXJseS4KKwkgKi8KKwlhdG9taWNfc2V0KCZwYi0+cGJfaW9fcmVtYWluaW5nLCAxKTsKKwlfcGFnZWJ1Zl9pb2FwcGx5KHBiKTsKKwlfcGFnZWJ1Zl9pb2RvbmUocGIsIDApOworCisJcGFnZWJ1Zl9yZWxlKHBiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCXBhZ2VidWZfaW93YWl0CisgKgorICoJcGFnZWJ1Zl9pb3dhaXQgd2FpdHMgZm9yIEkvTyB0byBjb21wbGV0ZSBvbiB0aGUgYnVmZmVyIHN1cHBsaWVkLgorICoJSXQgcmV0dXJucyBpbW1lZGlhdGVseSBpZiBubyBJL08gaXMgcGVuZGluZy4gIEluIGFueSBjYXNlLCBpdCByZXR1cm5zCisgKgl0aGUgZXJyb3IgY29kZSwgaWYgYW55LCBvciAwIGlmIHRoZXJlIGlzIG5vIGVycm9yLgorICovCitpbnQKK3BhZ2VidWZfaW93YWl0KAorCXhmc19idWZfdAkJKnBiKQoreworCVBCX1RSQUNFKHBiLCAiaW93YWl0IiwgMCk7CisJaWYgKGF0b21pY19yZWFkKCZwYi0+cGJfaW9fcmVtYWluaW5nKSkKKwkJYmxrX3J1bl9hZGRyZXNzX3NwYWNlKHBiLT5wYl90YXJnZXQtPnBicl9tYXBwaW5nKTsKKwlkb3duKCZwYi0+cGJfaW9kb25lc2VtYSk7CisJUEJfVFJBQ0UocGIsICJpb3dhaXRlZCIsIChsb25nKXBiLT5wYl9lcnJvcik7CisJcmV0dXJuIHBiLT5wYl9lcnJvcjsKK30KKworY2FkZHJfdAorcGFnZWJ1Zl9vZmZzZXQoCisJeGZzX2J1Zl90CQkqcGIsCisJc2l6ZV90CQkJb2Zmc2V0KQoreworCXN0cnVjdCBwYWdlCQkqcGFnZTsKKworCW9mZnNldCArPSBwYi0+cGJfb2Zmc2V0OworCisJcGFnZSA9IHBiLT5wYl9wYWdlc1tvZmZzZXQgPj4gUEFHRV9DQUNIRV9TSElGVF07CisJcmV0dXJuIChjYWRkcl90KSBwYWdlX2FkZHJlc3MocGFnZSkgKyAob2Zmc2V0ICYgKFBBR0VfQ0FDSEVfU0laRSAtIDEpKTsKK30KKworLyoKKyAqCXBhZ2VidWZfaW9tb3ZlCisgKgorICoJTW92ZSBkYXRhIGludG8gb3Igb3V0IG9mIGEgYnVmZmVyLgorICovCit2b2lkCitwYWdlYnVmX2lvbW92ZSgKKwl4ZnNfYnVmX3QJCSpwYiwJLyogYnVmZmVyIHRvIHByb2Nlc3MJCSovCisJc2l6ZV90CQkJYm9mZiwJLyogc3RhcnRpbmcgYnVmZmVyIG9mZnNldAkqLworCXNpemVfdAkJCWJzaXplLAkvKiBsZW5ndGggdG8gY29weQkJKi8KKwljYWRkcl90CQkJZGF0YSwJLyogZGF0YSBhZGRyZXNzCQkJKi8KKwlwYWdlX2J1Zl9yd190CQltb2RlKQkvKiByZWFkL3dyaXRlIGZsYWcJCSovCit7CisJc2l6ZV90CQkJYmVuZCwgY3BvZmYsIGNzaXplOworCXN0cnVjdCBwYWdlCQkqcGFnZTsKKworCWJlbmQgPSBib2ZmICsgYnNpemU7CisJd2hpbGUgKGJvZmYgPCBiZW5kKSB7CisJCXBhZ2UgPSBwYi0+cGJfcGFnZXNbcGFnZV9idWZfYnRvY3QoYm9mZiArIHBiLT5wYl9vZmZzZXQpXTsKKwkJY3BvZmYgPSBwYWdlX2J1Zl9wb2ZmKGJvZmYgKyBwYi0+cGJfb2Zmc2V0KTsKKwkJY3NpemUgPSBtaW5fdChzaXplX3QsCisJCQkgICAgICBQQUdFX0NBQ0hFX1NJWkUtY3BvZmYsIHBiLT5wYl9jb3VudF9kZXNpcmVkLWJvZmYpOworCisJCUFTU0VSVCgoKGNzaXplICsgY3BvZmYpIDw9IFBBR0VfQ0FDSEVfU0laRSkpOworCisJCXN3aXRjaCAobW9kZSkgeworCQljYXNlIFBCUldfWkVSTzoKKwkJCW1lbXNldChwYWdlX2FkZHJlc3MocGFnZSkgKyBjcG9mZiwgMCwgY3NpemUpOworCQkJYnJlYWs7CisJCWNhc2UgUEJSV19SRUFEOgorCQkJbWVtY3B5KGRhdGEsIHBhZ2VfYWRkcmVzcyhwYWdlKSArIGNwb2ZmLCBjc2l6ZSk7CisJCQlicmVhazsKKwkJY2FzZSBQQlJXX1dSSVRFOgorCQkJbWVtY3B5KHBhZ2VfYWRkcmVzcyhwYWdlKSArIGNwb2ZmLCBkYXRhLCBjc2l6ZSk7CisJCX0KKworCQlib2ZmICs9IGNzaXplOworCQlkYXRhICs9IGNzaXplOworCX0KK30KKworLyoKKyAqCUhhbmRsaW5nIG9mIGJ1ZnRhcmdzLgorICovCisKKy8qCisgKiBXYWl0IGZvciBhbnkgYnVmcyB3aXRoIGNhbGxiYWNrcyB0aGF0IGhhdmUgYmVlbiBzdWJtaXR0ZWQgYnV0CisgKiBoYXZlIG5vdCB5ZXQgcmV0dXJuZWQuLi4gd2FsayB0aGUgaGFzaCBsaXN0IGZvciB0aGUgdGFyZ2V0LgorICovCit2b2lkCit4ZnNfd2FpdF9idWZ0YXJnKAorCXhmc19idWZ0YXJnX3QJKmJ0cCkKK3sKKwl4ZnNfYnVmX3QJKmJwLCAqbjsKKwl4ZnNfYnVmaGFzaF90CSpoYXNoOworCXVpbnQJCWk7CisKKwlmb3IgKGkgPSAwOyBpIDwgKDEgPDwgYnRwLT5idF9oYXNoc2hpZnQpOyBpKyspIHsKKwkJaGFzaCA9ICZidHAtPmJ0X2hhc2hbaV07CithZ2FpbjoKKwkJc3Bpbl9sb2NrKCZoYXNoLT5iaF9sb2NrKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJwLCBuLCAmaGFzaC0+YmhfbGlzdCwgcGJfaGFzaF9saXN0KSB7CisJCQlBU1NFUlQoYnRwID09IGJwLT5wYl90YXJnZXQpOworCQkJaWYgKCEoYnAtPnBiX2ZsYWdzICYgUEJGX0ZTX01BTkFHRUQpKSB7CisJCQkJc3Bpbl91bmxvY2soJmhhc2gtPmJoX2xvY2spOworCQkJCWRlbGF5KDEwMCk7CisJCQkJZ290byBhZ2FpbjsKKwkJCX0KKwkJfQorCQlzcGluX3VubG9jaygmaGFzaC0+YmhfbG9jayk7CisJfQorfQorCisvKgorICogQWxsb2NhdGUgYnVmZmVyIGhhc2ggdGFibGUgZm9yIGEgZ2l2ZW4gdGFyZ2V0LgorICogRm9yIGRldmljZXMgY29udGFpbmluZyBtZXRhZGF0YSAoaS5lLiBub3QgdGhlIGxvZy9yZWFsdGltZSBkZXZpY2VzKQorICogd2UgbmVlZCB0byBhbGxvY2F0ZSBhIG11Y2ggbGFyZ2VyIGhhc2ggdGFibGUuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYWxsb2NfYnVmaGFzaCgKKwl4ZnNfYnVmdGFyZ190CQkqYnRwLAorCWludAkJCWV4dGVybmFsKQoreworCXVuc2lnbmVkIGludAkJaTsKKworCWJ0cC0+YnRfaGFzaHNoaWZ0ID0gZXh0ZXJuYWwgPyAzIDogODsJLyogOCBvciAyNTYgYnVja2V0cyAqLworCWJ0cC0+YnRfaGFzaG1hc2sgPSAoMSA8PCBidHAtPmJ0X2hhc2hzaGlmdCkgLSAxOworCWJ0cC0+YnRfaGFzaCA9IGttZW1femFsbG9jKCgxIDw8IGJ0cC0+YnRfaGFzaHNoaWZ0KSAqCisJCQkJCXNpemVvZih4ZnNfYnVmaGFzaF90KSwgS01fU0xFRVApOworCWZvciAoaSA9IDA7IGkgPCAoMSA8PCBidHAtPmJ0X2hhc2hzaGlmdCk7IGkrKykgeworCQlzcGluX2xvY2tfaW5pdCgmYnRwLT5idF9oYXNoW2ldLmJoX2xvY2spOworCQlJTklUX0xJU1RfSEVBRCgmYnRwLT5idF9oYXNoW2ldLmJoX2xpc3QpOworCX0KK30KKworU1RBVElDIHZvaWQKK3hmc19mcmVlX2J1Zmhhc2goCisJeGZzX2J1ZnRhcmdfdAkJKmJ0cCkKK3sKKwlrbWVtX2ZyZWUoYnRwLT5idF9oYXNoLAorCQkJKDEgPDwgYnRwLT5idF9oYXNoc2hpZnQpICogc2l6ZW9mKHhmc19idWZoYXNoX3QpKTsKKwlidHAtPmJ0X2hhc2ggPSBOVUxMOworfQorCit2b2lkCit4ZnNfZnJlZV9idWZ0YXJnKAorCXhmc19idWZ0YXJnX3QJCSpidHAsCisJaW50CQkJZXh0ZXJuYWwpCit7CisJeGZzX2ZsdXNoX2J1ZnRhcmcoYnRwLCAxKTsKKwlpZiAoZXh0ZXJuYWwpCisJCXhmc19ibGtkZXZfcHV0KGJ0cC0+cGJyX2JkZXYpOworCXhmc19mcmVlX2J1Zmhhc2goYnRwKTsKKwlpcHV0KGJ0cC0+cGJyX21hcHBpbmctPmhvc3QpOworCWttZW1fZnJlZShidHAsIHNpemVvZigqYnRwKSk7Cit9CisKK3ZvaWQKK3hmc19pbmNvcmVfcmVsc2UoCisJeGZzX2J1ZnRhcmdfdAkJKmJ0cCwKKwlpbnQJCQlkZWx3cmlfb25seSwKKwlpbnQJCQl3YWl0KQoreworCWludmFsaWRhdGVfYmRldihidHAtPnBicl9iZGV2LCAxKTsKKwl0cnVuY2F0ZV9pbm9kZV9wYWdlcyhidHAtPnBicl9tYXBwaW5nLCAwTEwpOworfQorCitTVEFUSUMgaW50Cit4ZnNfc2V0c2l6ZV9idWZ0YXJnX2ZsYWdzKAorCXhmc19idWZ0YXJnX3QJCSpidHAsCisJdW5zaWduZWQgaW50CQlibG9ja3NpemUsCisJdW5zaWduZWQgaW50CQlzZWN0b3JzaXplLAorCWludAkJCXZlcmJvc2UpCit7CisJYnRwLT5wYnJfYnNpemUgPSBibG9ja3NpemU7CisJYnRwLT5wYnJfc3NoaWZ0ID0gZmZzKHNlY3RvcnNpemUpIC0gMTsKKwlidHAtPnBicl9zbWFzayA9IHNlY3RvcnNpemUgLSAxOworCisJaWYgKHNldF9ibG9ja3NpemUoYnRwLT5wYnJfYmRldiwgc2VjdG9yc2l6ZSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJIlhGUzogQ2Fubm90IHNldF9ibG9ja3NpemUgdG8gJXUgb24gZGV2aWNlICVzXG4iLAorCQkJc2VjdG9yc2l6ZSwgWEZTX0JVRlRBUkdfTkFNRShidHApKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisKKwlpZiAodmVyYm9zZSAmJgorCSAgICAoUEFHRV9DQUNIRV9TSVpFIC8gQklUU19QRVJfTE9ORykgPiBzZWN0b3JzaXplKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSJYRlM6ICV1IGJ5dGUgc2VjdG9ycyBpbiB1c2Ugb24gZGV2aWNlICVzLiAgIgorCQkJIlRoaXMgaXMgc3Vib3B0aW1hbDsgJXUgb3IgZ3JlYXRlciBpcyBpZGVhbC5cbiIsCisJCQlzZWN0b3JzaXplLCBYRlNfQlVGVEFSR19OQU1FKGJ0cCksCisJCQkodW5zaWduZWQgaW50KVBBR0VfQ0FDSEVfU0laRSAvIEJJVFNfUEVSX0xPTkcpOworCX0KKworCXJldHVybiAwOworfQorCisvKgorKiBXaGVuIGFsbG9jYXRpbmcgdGhlIGluaXRpYWwgYnVmZmVyIHRhcmdldCB3ZSBoYXZlIG5vdCB5ZXQKKyogcmVhZCBpbiB0aGUgc3VwZXJibG9jaywgc28gZG9uJ3Qga25vdyB3aGF0IHNpemVkIHNlY3RvcnMKKyogYXJlIGJlaW5nIHVzZWQgaXMgYXQgdGhpcyBlYXJseSBzdGFnZS4gIFBsYXkgc2FmZS4KKyovCitTVEFUSUMgaW50Cit4ZnNfc2V0c2l6ZV9idWZ0YXJnX2Vhcmx5KAorCXhmc19idWZ0YXJnX3QJCSpidHAsCisJc3RydWN0IGJsb2NrX2RldmljZQkqYmRldikKK3sKKwlyZXR1cm4geGZzX3NldHNpemVfYnVmdGFyZ19mbGFncyhidHAsCisJCQlQQUdFX0NBQ0hFX1NJWkUsIGJkZXZfaGFyZHNlY3Rfc2l6ZShiZGV2KSwgMCk7Cit9CisKK2ludAoreGZzX3NldHNpemVfYnVmdGFyZygKKwl4ZnNfYnVmdGFyZ190CQkqYnRwLAorCXVuc2lnbmVkIGludAkJYmxvY2tzaXplLAorCXVuc2lnbmVkIGludAkJc2VjdG9yc2l6ZSkKK3sKKwlyZXR1cm4geGZzX3NldHNpemVfYnVmdGFyZ19mbGFncyhidHAsIGJsb2Nrc2l6ZSwgc2VjdG9yc2l6ZSwgMSk7Cit9CisKK1NUQVRJQyBpbnQKK3hmc19tYXBwaW5nX2J1ZnRhcmcoCisJeGZzX2J1ZnRhcmdfdAkJKmJ0cCwKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlCSpiZGV2KQoreworCXN0cnVjdCBiYWNraW5nX2Rldl9pbmZvCSpiZGk7CisJc3RydWN0IGlub2RlCQkqaW5vZGU7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UJKm1hcHBpbmc7CisJc3RhdGljIHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgbWFwcGluZ19hb3BzID0geworCQkuc3luY19wYWdlID0gYmxvY2tfc3luY19wYWdlLAorCX07CisKKwlpbm9kZSA9IG5ld19pbm9kZShiZGV2LT5iZF9pbm9kZS0+aV9zYik7CisJaWYgKCFpbm9kZSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkiWEZTOiBDYW5ub3QgYWxsb2NhdGUgbWFwcGluZyBpbm9kZSBmb3IgZGV2aWNlICVzXG4iLAorCQkJWEZTX0JVRlRBUkdfTkFNRShidHApKTsKKwkJcmV0dXJuIEVOT01FTTsKKwl9CisJaW5vZGUtPmlfbW9kZSA9IFNfSUZCTEs7CisJaW5vZGUtPmlfYmRldiA9IGJkZXY7CisJaW5vZGUtPmlfcmRldiA9IGJkZXYtPmJkX2RldjsKKwliZGkgPSBibGtfZ2V0X2JhY2tpbmdfZGV2X2luZm8oYmRldik7CisJaWYgKCFiZGkpCisJCWJkaSA9ICZkZWZhdWx0X2JhY2tpbmdfZGV2X2luZm87CisJbWFwcGluZyA9ICZpbm9kZS0+aV9kYXRhOworCW1hcHBpbmctPmFfb3BzID0gJm1hcHBpbmdfYW9wczsKKwltYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvID0gYmRpOworCW1hcHBpbmdfc2V0X2dmcF9tYXNrKG1hcHBpbmcsIEdGUF9OT0ZTKTsKKwlidHAtPnBicl9tYXBwaW5nID0gbWFwcGluZzsKKwlyZXR1cm4gMDsKK30KKworeGZzX2J1ZnRhcmdfdCAqCit4ZnNfYWxsb2NfYnVmdGFyZygKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlCSpiZGV2LAorCWludAkJCWV4dGVybmFsKQoreworCXhmc19idWZ0YXJnX3QJCSpidHA7CisKKwlidHAgPSBrbWVtX3phbGxvYyhzaXplb2YoKmJ0cCksIEtNX1NMRUVQKTsKKworCWJ0cC0+cGJyX2RldiA9ICBiZGV2LT5iZF9kZXY7CisJYnRwLT5wYnJfYmRldiA9IGJkZXY7CisJaWYgKHhmc19zZXRzaXplX2J1ZnRhcmdfZWFybHkoYnRwLCBiZGV2KSkKKwkJZ290byBlcnJvcjsKKwlpZiAoeGZzX21hcHBpbmdfYnVmdGFyZyhidHAsIGJkZXYpKQorCQlnb3RvIGVycm9yOworCXhmc19hbGxvY19idWZoYXNoKGJ0cCwgZXh0ZXJuYWwpOworCXJldHVybiBidHA7CisKK2Vycm9yOgorCWttZW1fZnJlZShidHAsIHNpemVvZigqYnRwKSk7CisJcmV0dXJuIE5VTEw7Cit9CisKKworLyoKKyAqIFBhZ2VidWYgZGVsYXllZCB3cml0ZSBidWZmZXIgaGFuZGxpbmcKKyAqLworCitTVEFUSUMgTElTVF9IRUFEKHBiZF9kZWx3cml0ZV9xdWV1ZSk7CitTVEFUSUMgREVGSU5FX1NQSU5MT0NLKHBiZF9kZWx3cml0ZV9sb2NrKTsKKworU1RBVElDIHZvaWQKK3BhZ2VidWZfZGVsd3JpX3F1ZXVlKAorCXhmc19idWZfdAkJKnBiLAorCWludAkJCXVubG9jaykKK3sKKwlQQl9UUkFDRShwYiwgImRlbHdyaV9xIiwgKGxvbmcpdW5sb2NrKTsKKwlBU1NFUlQocGItPnBiX2ZsYWdzICYgUEJGX0RFTFdSSSk7CisKKwlzcGluX2xvY2soJnBiZF9kZWx3cml0ZV9sb2NrKTsKKwkvKiBJZiBhbHJlYWR5IGluIHRoZSBxdWV1ZSwgZGVxdWV1ZSBhbmQgcGxhY2UgYXQgdGFpbCAqLworCWlmICghbGlzdF9lbXB0eSgmcGItPnBiX2xpc3QpKSB7CisJCWlmICh1bmxvY2spIHsKKwkJCWF0b21pY19kZWMoJnBiLT5wYl9ob2xkKTsKKwkJfQorCQlsaXN0X2RlbCgmcGItPnBiX2xpc3QpOworCX0KKworCWxpc3RfYWRkX3RhaWwoJnBiLT5wYl9saXN0LCAmcGJkX2RlbHdyaXRlX3F1ZXVlKTsKKwlwYi0+cGJfcXVldWV0aW1lID0gamlmZmllczsKKwlzcGluX3VubG9jaygmcGJkX2RlbHdyaXRlX2xvY2spOworCisJaWYgKHVubG9jaykKKwkJcGFnZWJ1Zl91bmxvY2socGIpOworfQorCit2b2lkCitwYWdlYnVmX2RlbHdyaV9kZXF1ZXVlKAorCXhmc19idWZfdAkJKnBiKQoreworCWludAkJCWRlcXVldWVkID0gMDsKKworCXNwaW5fbG9jaygmcGJkX2RlbHdyaXRlX2xvY2spOworCWlmICgocGItPnBiX2ZsYWdzICYgUEJGX0RFTFdSSSkgJiYgIWxpc3RfZW1wdHkoJnBiLT5wYl9saXN0KSkgeworCQlsaXN0X2RlbF9pbml0KCZwYi0+cGJfbGlzdCk7CisJCWRlcXVldWVkID0gMTsKKwl9CisJcGItPnBiX2ZsYWdzICY9IH5QQkZfREVMV1JJOworCXNwaW5fdW5sb2NrKCZwYmRfZGVsd3JpdGVfbG9jayk7CisKKwlpZiAoZGVxdWV1ZWQpCisJCXBhZ2VidWZfcmVsZShwYik7CisKKwlQQl9UUkFDRShwYiwgImRlbHdyaV9kcSIsIChsb25nKWRlcXVldWVkKTsKK30KKworU1RBVElDIHZvaWQKK3BhZ2VidWZfcnVuYWxsX3F1ZXVlcygKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdAkqcXVldWUpCit7CisJZmx1c2hfd29ya3F1ZXVlKHF1ZXVlKTsKK30KKworLyogRGVmaW5lcyBmb3IgcGFnZWJ1ZiBkYWVtb24gKi8KK1NUQVRJQyBERUNMQVJFX0NPTVBMRVRJT04ocGFnZWJ1Zl9kYWVtb25fZG9uZSk7CitTVEFUSUMgc3RydWN0IHRhc2tfc3RydWN0ICpwYWdlYnVmX2RhZW1vbl90YXNrOworU1RBVElDIGludCBwYWdlYnVmX2RhZW1vbl9hY3RpdmU7CitTVEFUSUMgaW50IGZvcmNlX2ZsdXNoOworCisKK1NUQVRJQyBpbnQKK3BhZ2VidWZfZGFlbW9uX3dha2V1cCgKKwlpbnQJCQlwcmlvcml0eSwKKwl1bnNpZ25lZCBpbnQJCW1hc2spCit7CisJZm9yY2VfZmx1c2ggPSAxOworCWJhcnJpZXIoKTsKKwl3YWtlX3VwX3Byb2Nlc3MocGFnZWJ1Zl9kYWVtb25fdGFzayk7CisJcmV0dXJuIDA7Cit9CisKK1NUQVRJQyBpbnQKK3BhZ2VidWZfZGFlbW9uKAorCXZvaWQJCQkqZGF0YSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkCXRtcDsKKwl1bnNpZ25lZCBsb25nCQlhZ2U7CisJeGZzX2J1ZnRhcmdfdAkJKnRhcmdldDsKKwl4ZnNfYnVmX3QJCSpwYiwgKm47CisKKwkvKiAgU2V0IHVwIHRoZSB0aHJlYWQgICovCisJZGFlbW9uaXplKCJ4ZnNidWZkIik7CisJY3VycmVudC0+ZmxhZ3MgfD0gUEZfTUVNQUxMT0M7CisKKwlwYWdlYnVmX2RhZW1vbl90YXNrID0gY3VycmVudDsKKwlwYWdlYnVmX2RhZW1vbl9hY3RpdmUgPSAxOworCWJhcnJpZXIoKTsKKworCUlOSVRfTElTVF9IRUFEKCZ0bXApOworCWRvIHsKKwkJdHJ5X3RvX2ZyZWV6ZShQRl9GUkVFWkUpOworCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoKHhmc19idWZfdGltZXJfY2VudGlzZWNzICogSFopIC8gMTAwKTsKKworCQlhZ2UgPSAoeGZzX2J1Zl9hZ2VfY2VudGlzZWNzICogSFopIC8gMTAwOworCQlzcGluX2xvY2soJnBiZF9kZWx3cml0ZV9sb2NrKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBiLCBuLCAmcGJkX2RlbHdyaXRlX3F1ZXVlLCBwYl9saXN0KSB7CisJCQlQQl9UUkFDRShwYiwgIndhbGtxMSIsIChsb25nKXBhZ2VidWZfaXNwaW4ocGIpKTsKKwkJCUFTU0VSVChwYi0+cGJfZmxhZ3MgJiBQQkZfREVMV1JJKTsKKworCQkJaWYgKCFwYWdlYnVmX2lzcGluKHBiKSAmJiAhcGFnZWJ1Zl9jb25kX2xvY2socGIpKSB7CisJCQkJaWYgKCFmb3JjZV9mbHVzaCAmJgorCQkJCSAgICB0aW1lX2JlZm9yZShqaWZmaWVzLAorCQkJCQkJcGItPnBiX3F1ZXVldGltZSArIGFnZSkpIHsKKwkJCQkJcGFnZWJ1Zl91bmxvY2socGIpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlwYi0+cGJfZmxhZ3MgJj0gflBCRl9ERUxXUkk7CisJCQkJcGItPnBiX2ZsYWdzIHw9IFBCRl9XUklURTsKKwkJCQlsaXN0X21vdmUoJnBiLT5wYl9saXN0LCAmdG1wKTsKKwkJCX0KKwkJfQorCQlzcGluX3VubG9jaygmcGJkX2RlbHdyaXRlX2xvY2spOworCisJCXdoaWxlICghbGlzdF9lbXB0eSgmdG1wKSkgeworCQkJcGIgPSBsaXN0X2VudHJ5KHRtcC5uZXh0LCB4ZnNfYnVmX3QsIHBiX2xpc3QpOworCQkJdGFyZ2V0ID0gcGItPnBiX3RhcmdldDsKKworCQkJbGlzdF9kZWxfaW5pdCgmcGItPnBiX2xpc3QpOworCQkJcGFnZWJ1Zl9pb3N0cmF0ZWd5KHBiKTsKKworCQkJYmxrX3J1bl9hZGRyZXNzX3NwYWNlKHRhcmdldC0+cGJyX21hcHBpbmcpOworCQl9CisKKwkJaWYgKGFzX2xpc3RfbGVuID4gMCkKKwkJCXB1cmdlX2FkZHJlc3NlcygpOworCisJCWZvcmNlX2ZsdXNoID0gMDsKKwl9IHdoaWxlIChwYWdlYnVmX2RhZW1vbl9hY3RpdmUpOworCisJY29tcGxldGVfYW5kX2V4aXQoJnBhZ2VidWZfZGFlbW9uX2RvbmUsIDApOworfQorCisvKgorICogR28gdGhyb3VnaCBhbGwgaW5jb3JlIGJ1ZmZlcnMsIGFuZCByZWxlYXNlIGJ1ZmZlcnMgaWYgdGhleSBiZWxvbmcgdG8KKyAqIHRoZSBnaXZlbiBkZXZpY2UuIFRoaXMgaXMgdXNlZCBpbiBmaWxlc3lzdGVtIGVycm9yIGhhbmRsaW5nIHRvCisgKiBwcmVzZXJ2ZSB0aGUgY29uc2lzdGVuY3kgb2YgaXRzIG1ldGFkYXRhLgorICovCitpbnQKK3hmc19mbHVzaF9idWZ0YXJnKAorCXhmc19idWZ0YXJnX3QJCSp0YXJnZXQsCisJaW50CQkJd2FpdCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkCXRtcDsKKwl4ZnNfYnVmX3QJCSpwYiwgKm47CisJaW50CQkJcGluY291bnQgPSAwOworCisJcGFnZWJ1Zl9ydW5hbGxfcXVldWVzKHBhZ2VidWZfZGF0YWlvX3dvcmtxdWV1ZSk7CisJcGFnZWJ1Zl9ydW5hbGxfcXVldWVzKHBhZ2VidWZfbG9naW9fd29ya3F1ZXVlKTsKKworCUlOSVRfTElTVF9IRUFEKCZ0bXApOworCXNwaW5fbG9jaygmcGJkX2RlbHdyaXRlX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYiwgbiwgJnBiZF9kZWx3cml0ZV9xdWV1ZSwgcGJfbGlzdCkgeworCisJCWlmIChwYi0+cGJfdGFyZ2V0ICE9IHRhcmdldCkKKwkJCWNvbnRpbnVlOworCisJCUFTU0VSVChwYi0+cGJfZmxhZ3MgJiBQQkZfREVMV1JJKTsKKwkJUEJfVFJBQ0UocGIsICJ3YWxrcTIiLCAobG9uZylwYWdlYnVmX2lzcGluKHBiKSk7CisJCWlmIChwYWdlYnVmX2lzcGluKHBiKSkgeworCQkJcGluY291bnQrKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcGItPnBiX2ZsYWdzICY9IH5QQkZfREVMV1JJOworCQlwYi0+cGJfZmxhZ3MgfD0gUEJGX1dSSVRFOworCQlsaXN0X21vdmUoJnBiLT5wYl9saXN0LCAmdG1wKTsKKwl9CisJc3Bpbl91bmxvY2soJnBiZF9kZWx3cml0ZV9sb2NrKTsKKworCS8qCisJICogRHJvcHBlZCB0aGUgZGVsYXllZCB3cml0ZSBsaXN0IGxvY2ssIG5vdyB3YWxrIHRoZSB0ZW1wb3JhcnkgbGlzdAorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYiwgbiwgJnRtcCwgcGJfbGlzdCkgeworCQlpZiAod2FpdCkKKwkJCXBiLT5wYl9mbGFncyAmPSB+UEJGX0FTWU5DOworCQllbHNlCisJCQlsaXN0X2RlbF9pbml0KCZwYi0+cGJfbGlzdCk7CisKKwkJcGFnZWJ1Zl9sb2NrKHBiKTsKKwkJcGFnZWJ1Zl9pb3N0cmF0ZWd5KHBiKTsKKwl9CisKKwkvKgorCSAqIFJlbWFpbmluZyBsaXN0IGl0ZW1zIG11c3QgYmUgZmx1c2hlZCBiZWZvcmUgcmV0dXJuaW5nCisJICovCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZ0bXApKSB7CisJCXBiID0gbGlzdF9lbnRyeSh0bXAubmV4dCwgeGZzX2J1Zl90LCBwYl9saXN0KTsKKworCQlsaXN0X2RlbF9pbml0KCZwYi0+cGJfbGlzdCk7CisJCXhmc19pb3dhaXQocGIpOworCQl4ZnNfYnVmX3JlbHNlKHBiKTsKKwl9CisKKwlpZiAod2FpdCkKKwkJYmxrX3J1bl9hZGRyZXNzX3NwYWNlKHRhcmdldC0+cGJyX21hcHBpbmcpOworCisJcmV0dXJuIHBpbmNvdW50OworfQorCitTVEFUSUMgaW50CitwYWdlYnVmX2RhZW1vbl9zdGFydCh2b2lkKQoreworCWludAkJcnZhbDsKKworCXBhZ2VidWZfbG9naW9fd29ya3F1ZXVlID0gY3JlYXRlX3dvcmtxdWV1ZSgieGZzbG9nZCIpOworCWlmICghcGFnZWJ1Zl9sb2dpb193b3JrcXVldWUpCisJCXJldHVybiAtRU5PTUVNOworCisJcGFnZWJ1Zl9kYXRhaW9fd29ya3F1ZXVlID0gY3JlYXRlX3dvcmtxdWV1ZSgieGZzZGF0YWQiKTsKKwlpZiAoIXBhZ2VidWZfZGF0YWlvX3dvcmtxdWV1ZSkgeworCQlkZXN0cm95X3dvcmtxdWV1ZShwYWdlYnVmX2xvZ2lvX3dvcmtxdWV1ZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJ2YWwgPSBrZXJuZWxfdGhyZWFkKHBhZ2VidWZfZGFlbW9uLCBOVUxMLCBDTE9ORV9GU3xDTE9ORV9GSUxFUyk7CisJaWYgKHJ2YWwgPCAwKSB7CisJCWRlc3Ryb3lfd29ya3F1ZXVlKHBhZ2VidWZfbG9naW9fd29ya3F1ZXVlKTsKKwkJZGVzdHJveV93b3JrcXVldWUocGFnZWJ1Zl9kYXRhaW9fd29ya3F1ZXVlKTsKKwl9CisKKwlyZXR1cm4gcnZhbDsKK30KKworLyoKKyAqIHBhZ2VidWZfZGFlbW9uX3N0b3AKKyAqCisgKiBOb3RlOiBkbyBub3QgbWFyayBhcyBfX2V4aXQsIGl0IGlzIGNhbGxlZCBmcm9tIHBhZ2VidWZfdGVybWluYXRlLgorICovCitTVEFUSUMgdm9pZAorcGFnZWJ1Zl9kYWVtb25fc3RvcCh2b2lkKQoreworCXBhZ2VidWZfZGFlbW9uX2FjdGl2ZSA9IDA7CisJYmFycmllcigpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJnBhZ2VidWZfZGFlbW9uX2RvbmUpOworCisJZGVzdHJveV93b3JrcXVldWUocGFnZWJ1Zl9sb2dpb193b3JrcXVldWUpOworCWRlc3Ryb3lfd29ya3F1ZXVlKHBhZ2VidWZfZGF0YWlvX3dvcmtxdWV1ZSk7Cit9CisKKy8qCisgKglJbml0aWFsaXphdGlvbiBhbmQgVGVybWluYXRpb24KKyAqLworCitpbnQgX19pbml0CitwYWdlYnVmX2luaXQodm9pZCkKK3sKKwlwYWdlYnVmX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoInhmc19idWZfdCIsIHNpemVvZih4ZnNfYnVmX3QpLCAwLAorCQkJU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMLCBOVUxMKTsKKwlpZiAocGFnZWJ1Zl9jYWNoZSA9PSBOVUxMKSB7CisJCXByaW50aygiWEZTOiBjb3VsZG4ndCBpbml0IHhmc19idWZfdCBjYWNoZVxuIik7CisJCXBhZ2VidWZfdGVybWluYXRlKCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworI2lmZGVmIFBBR0VCVUZfVFJBQ0UKKwlwYWdlYnVmX3RyYWNlX2J1ZiA9IGt0cmFjZV9hbGxvYyhQQUdFQlVGX1RSQUNFX1NJWkUsIEtNX1NMRUVQKTsKKyNlbmRpZgorCisJcGFnZWJ1Zl9kYWVtb25fc3RhcnQoKTsKKworCXBhZ2VidWZfc2hha2UgPSBrbWVtX3NoYWtlX3JlZ2lzdGVyKHBhZ2VidWZfZGFlbW9uX3dha2V1cCk7CisJaWYgKHBhZ2VidWZfc2hha2UgPT0gTlVMTCkgeworCQlwYWdlYnVmX3Rlcm1pbmF0ZSgpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICoJcGFnZWJ1Zl90ZXJtaW5hdGUuCisgKgorICoJTm90ZTogZG8gbm90IG1hcmsgYXMgX19leGl0LCB0aGlzIGlzIGFsc28gY2FsbGVkIGZyb20gdGhlIF9faW5pdCBjb2RlLgorICovCit2b2lkCitwYWdlYnVmX3Rlcm1pbmF0ZSh2b2lkKQoreworCXBhZ2VidWZfZGFlbW9uX3N0b3AoKTsKKworI2lmZGVmIFBBR0VCVUZfVFJBQ0UKKwlrdHJhY2VfZnJlZShwYWdlYnVmX3RyYWNlX2J1Zik7CisjZW5kaWYKKworCWttZW1fem9uZV9kZXN0cm95KHBhZ2VidWZfY2FjaGUpOworCWttZW1fc2hha2VfZGVyZWdpc3RlcihwYWdlYnVmX3NoYWtlKTsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYnVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRkZWVkOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2J1Zi5oCkBAIC0wLDAgKzEsNTkxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisvKgorICogV3JpdHRlbiBieSBTdGV2ZSBMb3JkLCBKaW0gTW9zdGVrLCBSdXNzZWxsIENhdHRlbGFuIGF0IFNHSQorICovCisKKyNpZm5kZWYgX19YRlNfQlVGX0hfXworI2RlZmluZSBfX1hGU19CVUZfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KKworLyoKKyAqCUJhc2UgdHlwZXMKKyAqLworCisjZGVmaW5lIFhGU19CVUZfREFERFJfTlVMTCAoKHhmc19kYWRkcl90KSAoLTFMTCkpCisKKyNkZWZpbmUgcGFnZV9idWZfY3RvYihwcCkJKChwcCkgKiBQQUdFX0NBQ0hFX1NJWkUpCisjZGVmaW5lIHBhZ2VfYnVmX2J0b2MoZGQpCSgoKGRkKSArIFBBR0VfQ0FDSEVfU0laRSAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQpCisjZGVmaW5lIHBhZ2VfYnVmX2J0b2N0KGRkKQkoKGRkKSA+PiBQQUdFX0NBQ0hFX1NISUZUKQorI2RlZmluZSBwYWdlX2J1Zl9wb2ZmKGFhKQkoKGFhKSAmIH5QQUdFX0NBQ0hFX01BU0spCisKK3R5cGVkZWYgZW51bSBwYWdlX2J1Zl9yd19lIHsKKwlQQlJXX1JFQUQgPSAxLAkJCS8qIHRyYW5zZmVyIGludG8gdGFyZ2V0IG1lbW9yeSAqLworCVBCUldfV1JJVEUgPSAyLAkJCS8qIHRyYW5zZmVyIGZyb20gdGFyZ2V0IG1lbW9yeSAqLworCVBCUldfWkVSTyA9IDMJCQkvKiBaZXJvIHRhcmdldCBtZW1vcnkgKi8KK30gcGFnZV9idWZfcndfdDsKKworCit0eXBlZGVmIGVudW0gcGFnZV9idWZfZmxhZ3NfZSB7CQkvKiBwYl9mbGFncyB2YWx1ZXMgKi8KKwlQQkZfUkVBRCA9ICgxIDw8IDApLAkvKiBidWZmZXIgaW50ZW5kZWQgZm9yIHJlYWRpbmcgZnJvbSBkZXZpY2UgKi8KKwlQQkZfV1JJVEUgPSAoMSA8PCAxKSwJLyogYnVmZmVyIGludGVuZGVkIGZvciB3cml0aW5nIHRvIGRldmljZSAgICovCisJUEJGX01BUFBFRCA9ICgxIDw8IDIpLCAgLyogYnVmZmVyIG1hcHBlZCAocGJfYWRkciB2YWxpZCkgICAgICAgICAgICovCisJUEJGX1BBUlRJQUwgPSAoMSA8PCAzKSwgLyogYnVmZmVyIHBhcnRpYWxseSByZWFkICAgICAgICAgICAgICAgICAgICovCisJUEJGX0FTWU5DID0gKDEgPDwgNCksICAgLyogaW5pdGlhdG9yIHdpbGwgbm90IHdhaXQgZm9yIGNvbXBsZXRpb24gICovCisJUEJGX05PTkUgPSAoMSA8PCA1KSwgICAgLyogYnVmZmVyIG5vdCByZWFkIGF0IGFsbCAgICAgICAgICAgICAgICAgICovCisJUEJGX0RFTFdSSSA9ICgxIDw8IDYpLCAgLyogYnVmZmVyIGhhcyBkaXJ0eSBwYWdlcyAgICAgICAgICAgICAgICAgICovCisJUEJGX1NUQUxFID0gKDEgPDwgNyksCS8qIGJ1ZmZlciBoYXMgYmVlbiBzdGFsZWQsIGRvIG5vdCBmaW5kIGl0ICAqLworCVBCRl9GU19NQU5BR0VEID0gKDEgPDwgOCksICAvKiBmaWxlc3lzdGVtIGNvbnRyb2xzIGZyZWVpbmcgbWVtb3J5ICAqLworCVBCRl9GU19EQVRBSU9EID0gKDEgPDwgOSksICAvKiBzY2hlZHVsZSBJTyBjb21wbGV0aW9uIG9uIGZzIGRhdGFkICAqLworCVBCRl9GT1JDRUlPID0gKDEgPDwgMTApLCAgICAvKiBpZ25vcmUgYW55IGNhY2hlIHN0YXRlCQkgICAqLworCVBCRl9GTFVTSCA9ICgxIDw8IDExKSwJICAgIC8qIGZsdXNoIGRpc2sgd3JpdGUgY2FjaGUJCSAgICovCisJUEJGX1JFQURfQUhFQUQgPSAoMSA8PCAxMiksIC8qIGFzeW5jaHJvbm91cyByZWFkLWFoZWFkCQkgICAqLworCisJLyogZmxhZ3MgdXNlZCBvbmx5IGFzIGFyZ3VtZW50cyB0byBhY2Nlc3Mgcm91dGluZXMgKi8KKwlQQkZfTE9DSyA9ICgxIDw8IDE0KSwgICAgICAgLyogbG9jayByZXF1ZXN0ZWQJCQkgICAqLworCVBCRl9UUllMT0NLID0gKDEgPDwgMTUpLCAgICAvKiBsb2NrIHJlcXVlc3RlZCwgYnV0IGRvIG5vdCB3YWl0CSAgICovCisJUEJGX0RPTlRfQkxPQ0sgPSAoMSA8PCAxNiksIC8qIGRvIG5vdCBibG9jayBpbiBjdXJyZW50IHRocmVhZAkgICAqLworCisJLyogZmxhZ3MgdXNlZCBvbmx5IGludGVybmFsbHkgKi8KKwlfUEJGX1BBR0VfQ0FDSEUgPSAoMSA8PCAxNyksLyogYmFja2VkIGJ5IHBhZ2VjYWNoZQkJICAgKi8KKwlfUEJGX0tNRU1fQUxMT0MgPSAoMSA8PCAxOCksLyogYmFja2VkIGJ5IGttZW1fYWxsb2MoKQkJICAgKi8KKwlfUEJGX1JVTl9RVUVVRVMgPSAoMSA8PCAxOSksLyogcnVuIGJsb2NrIGRldmljZSB0YXNrIHF1ZXVlCSAgICovCit9IHBhZ2VfYnVmX2ZsYWdzX3Q7CisKKyNkZWZpbmUgUEJGX1VQREFURSAoUEJGX1JFQUQgfCBQQkZfV1JJVEUpCisjZGVmaW5lIFBCRl9OT1RfRE9ORShwYikgKCgocGIpLT5wYl9mbGFncyAmIChQQkZfUEFSVElBTHxQQkZfTk9ORSkpICE9IDApCisjZGVmaW5lIFBCRl9ET05FKHBiKSAoKChwYiktPnBiX2ZsYWdzICYgKFBCRl9QQVJUSUFMfFBCRl9OT05FKSkgPT0gMCkKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2J1Zmhhc2ggeworCXN0cnVjdCBsaXN0X2hlYWQJYmhfbGlzdDsKKwlzcGlubG9ja190CQliaF9sb2NrOworfSB4ZnNfYnVmaGFzaF90OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfYnVmdGFyZyB7CisJZGV2X3QJCQlwYnJfZGV2OworCXN0cnVjdCBibG9ja19kZXZpY2UJKnBicl9iZGV2OworCXN0cnVjdCBhZGRyZXNzX3NwYWNlCSpwYnJfbWFwcGluZzsKKwl1bnNpZ25lZCBpbnQJCXBicl9ic2l6ZTsKKwl1bnNpZ25lZCBpbnQJCXBicl9zc2hpZnQ7CisJc2l6ZV90CQkJcGJyX3NtYXNrOworCisJLyogcGVyLWRldmljZSBidWZmZXIgaGFzaCB0YWJsZSAqLworCXVpbnQJCQlidF9oYXNobWFzazsKKwl1aW50CQkJYnRfaGFzaHNoaWZ0OworCXhmc19idWZoYXNoX3QJCSpidF9oYXNoOworfSB4ZnNfYnVmdGFyZ190OworCisvKgorICoJeGZzX2J1Zl90OiAgQnVmZmVyIHN0cnVjdHVyZSBmb3IgcGFnZSBjYWNoZS1iYXNlZCBidWZmZXJzCisgKgorICogVGhpcyBidWZmZXIgc3RydWN0dXJlIGlzIHVzZWQgYnkgdGhlIHBhZ2UgY2FjaGUgYnVmZmVyIG1hbmFnZW1lbnQgcm91dGluZXMKKyAqIHRvIHJlZmVyIHRvIGFuIGFzc2VtYmx5IG9mIHBhZ2VzIGZvcm1pbmcgYSBsb2dpY2FsIGJ1ZmZlci4gIFRoZSBhY3R1YWwgSS9PCisgKiBpcyBwZXJmb3JtZWQgd2l0aCBidWZmZXJfaGVhZCBzdHJ1Y3R1cmVzLCBhcyByZXF1aXJlZCBieSBkcml2ZXJzLgorICogCisgKiBUaGUgYnVmZmVyIHN0cnVjdHVyZSBpcyB1c2VkIG9uIHRlbXBvcmFyeSBiYXNpcyBvbmx5LCBhbmQgZGlzY2FyZGVkIHdoZW4KKyAqIHJlbGVhc2VkLiAgVGhlIHJlYWwgZGF0YSBzdG9yYWdlIGlzIHJlY29yZGVkIGluIHRoZSBwYWdlIGNhY2hlLiAgTWV0YWRhdGEgaXMKKyAqIGhhc2hlZCB0byB0aGUgYmxvY2sgZGV2aWNlIG9uIHdoaWNoIHRoZSBmaWxlIHN5c3RlbSByZXNpZGVzLgorICovCisKK3N0cnVjdCB4ZnNfYnVmOworCisvKiBjYWxsLWJhY2sgZnVuY3Rpb24gb24gSS9PIGNvbXBsZXRpb24gKi8KK3R5cGVkZWYgdm9pZCAoKnBhZ2VfYnVmX2lvZG9uZV90KShzdHJ1Y3QgeGZzX2J1ZiAqKTsKKy8qIGNhbGwtYmFjayBmdW5jdGlvbiBvbiBJL08gY29tcGxldGlvbiAqLwordHlwZWRlZiB2b2lkICgqcGFnZV9idWZfcmVsc2VfdCkoc3RydWN0IHhmc19idWYgKik7CisvKiBwcmUtd3JpdGUgZnVuY3Rpb24gKi8KK3R5cGVkZWYgaW50ICgqcGFnZV9idWZfYmRzdHJhdF90KShzdHJ1Y3QgeGZzX2J1ZiAqKTsKKworI2RlZmluZSBQQl9QQUdFUwkyCisKK3R5cGVkZWYgc3RydWN0IHhmc19idWYgeworCXN0cnVjdCBzZW1hcGhvcmUJcGJfc2VtYTsJLyogc2VtYXBob3JlIGZvciBsb2NrYWJsZXMgICovCisJdW5zaWduZWQgbG9uZwkJcGJfcXVldWV0aW1lOwkvKiB0aW1lIGJ1ZmZlciB3YXMgcXVldWVkICAgKi8KKwlhdG9taWNfdAkJcGJfcGluX2NvdW50OwkvKiBwaW4gY291bnQJCSAgICAqLworCXdhaXRfcXVldWVfaGVhZF90CXBiX3dhaXRlcnM7CS8qIHVucGluIHdhaXRlcnMJICAgICovCisJc3RydWN0IGxpc3RfaGVhZAlwYl9saXN0OworCXBhZ2VfYnVmX2ZsYWdzX3QJcGJfZmxhZ3M7CS8qIHN0YXR1cyBmbGFncyAqLworCXN0cnVjdCBsaXN0X2hlYWQJcGJfaGFzaF9saXN0OwkvKiBoYXNoIHRhYmxlIGxpc3QgKi8KKwl4ZnNfYnVmaGFzaF90CQkqcGJfaGFzaDsJLyogaGFzaCB0YWJsZSBsaXN0IHN0YXJ0ICovCisJeGZzX2J1ZnRhcmdfdAkJKnBiX3RhcmdldDsJLyogYnVmZmVyIHRhcmdldCAoZGV2aWNlKSAqLworCWF0b21pY190CQlwYl9ob2xkOwkvKiByZWZlcmVuY2UgY291bnQgKi8KKwl4ZnNfZGFkZHJfdAkJcGJfYm47CQkvKiBibG9jayBudW1iZXIgZm9yIEkvTyAqLworCWxvZmZfdAkJCXBiX2ZpbGVfb2Zmc2V0OwkvKiBvZmZzZXQgaW4gZmlsZSAqLworCXNpemVfdAkJCXBiX2J1ZmZlcl9sZW5ndGg7IC8qIHNpemUgb2YgYnVmZmVyIGluIGJ5dGVzICovCisJc2l6ZV90CQkJcGJfY291bnRfZGVzaXJlZDsgLyogZGVzaXJlZCB0cmFuc2ZlciBzaXplICovCisJdm9pZAkJCSpwYl9hZGRyOwkvKiB2aXJ0dWFsIGFkZHJlc3Mgb2YgYnVmZmVyICovCisJc3RydWN0IHdvcmtfc3RydWN0CXBiX2lvZG9uZV93b3JrOworCWF0b21pY190CQlwYl9pb19yZW1haW5pbmc7LyogI291dHN0YW5kaW5nIEkvTyByZXF1ZXN0cyAqLworCXBhZ2VfYnVmX2lvZG9uZV90CXBiX2lvZG9uZTsJLyogSS9PIGNvbXBsZXRpb24gZnVuY3Rpb24gKi8KKwlwYWdlX2J1Zl9yZWxzZV90CXBiX3JlbHNlOwkvKiByZWxlYXNpbmcgZnVuY3Rpb24gKi8KKwlwYWdlX2J1Zl9iZHN0cmF0X3QJcGJfc3RyYXQ7CS8qIHByZS13cml0ZSBmdW5jdGlvbiAqLworCXN0cnVjdCBzZW1hcGhvcmUJcGJfaW9kb25lc2VtYTsJLyogU2VtYXBob3JlIGZvciBJL08gd2FpdGVycyAqLworCXZvaWQJCQkqcGJfZnNwcml2OworCXZvaWQJCQkqcGJfZnNwcml2MjsKKwl2b2lkCQkJKnBiX2ZzcHJpdjM7CisJdW5zaWduZWQgc2hvcnQJCXBiX2Vycm9yOwkvKiBlcnJvciBjb2RlIG9uIEkvTyAqLworIAl1bnNpZ25lZCBzaG9ydAkJcGJfbG9ja2VkOwkvKiBwYWdlIGFycmF5IGlzIGxvY2tlZCAqLworIAl1bnNpZ25lZCBpbnQJCXBiX3BhZ2VfY291bnQ7CS8qIHNpemUgb2YgcGFnZSBhcnJheSAqLworCXVuc2lnbmVkIGludAkJcGJfb2Zmc2V0OwkvKiBwYWdlIG9mZnNldCBpbiBmaXJzdCBwYWdlICovCisJc3RydWN0IHBhZ2UJCSoqcGJfcGFnZXM7CS8qIGFycmF5IG9mIHBhZ2UgcG9pbnRlcnMgKi8KKwlzdHJ1Y3QgcGFnZQkJKnBiX3BhZ2VfYXJyYXlbUEJfUEFHRVNdOyAvKiBpbmxpbmUgcGFnZXMgKi8KKyNpZmRlZiBQQUdFQlVGX0xPQ0tfVFJBQ0tJTkcKKwlpbnQJCQlwYl9sYXN0X2hvbGRlcjsKKyNlbmRpZgorfSB4ZnNfYnVmX3Q7CisKKworLyogRmluZGluZyBhbmQgUmVhZGluZyBCdWZmZXJzICovCisKK2V4dGVybiB4ZnNfYnVmX3QgKl9wYWdlYnVmX2ZpbmQoCS8qIGZpbmQgYnVmZmVyIGZvciBibG9jayBpZgkqLworCQkJCQkvKiB0aGUgYmxvY2sgaXMgaW4gbWVtb3J5CSovCisJCXhmc19idWZ0YXJnX3QgKiwJLyogaW5vZGUgZm9yIGJsb2NrCQkqLworCQlsb2ZmX3QsCQkJLyogc3RhcnRpbmcgb2Zmc2V0IG9mIHJhbmdlCSovCisJCXNpemVfdCwJCQkvKiBsZW5ndGggb2YgcmFuZ2UJCSovCisJCXBhZ2VfYnVmX2ZsYWdzX3QsCS8qIFBCRl9MT0NLCQkJKi8KKwkgICAgICAgIHhmc19idWZfdCAqKTsJCS8qIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIJKi8KKworI2RlZmluZSB4ZnNfaW5jb3JlKGJ1ZnRhcmcsYmxrbm8sbGVuLGxvY2tpdCkgXAorCV9wYWdlYnVmX2ZpbmQoYnVmdGFyZywgYmxrbm8gLGxlbiwgbG9ja2l0LCBOVUxMKQorCitleHRlcm4geGZzX2J1Zl90ICp4ZnNfYnVmX2dldF9mbGFncygJLyogYWxsb2NhdGUgYSBidWZmZXIJCSovCisJCXhmc19idWZ0YXJnX3QgKiwJLyogaW5vZGUgZm9yIGJ1ZmZlcgkJKi8KKwkJbG9mZl90LAkJCS8qIHN0YXJ0aW5nIG9mZnNldCBvZiByYW5nZSAgICAgKi8KKwkJc2l6ZV90LAkJCS8qIGxlbmd0aCBvZiByYW5nZSAgICAgICAgICAgICAgKi8KKwkJcGFnZV9idWZfZmxhZ3NfdCk7CS8qIFBCRl9MT0NLLCBQQkZfUkVBRCwJCSovCisJCQkJCS8qIFBCRl9BU1lOQwkJCSovCisKKyNkZWZpbmUgeGZzX2J1Zl9nZXQodGFyZ2V0LCBibGtubywgbGVuLCBmbGFncykgXAorCXhmc19idWZfZ2V0X2ZsYWdzKCh0YXJnZXQpLCAoYmxrbm8pLCAobGVuKSwgUEJGX0xPQ0sgfCBQQkZfTUFQUEVEKQorCitleHRlcm4geGZzX2J1Zl90ICp4ZnNfYnVmX3JlYWRfZmxhZ3MoCS8qIGFsbG9jYXRlIGFuZCByZWFkIGEgYnVmZmVyCSovCisJCXhmc19idWZ0YXJnX3QgKiwJLyogaW5vZGUgZm9yIGJ1ZmZlcgkJKi8KKwkJbG9mZl90LAkJCS8qIHN0YXJ0aW5nIG9mZnNldCBvZiByYW5nZQkqLworCQlzaXplX3QsCQkJLyogbGVuZ3RoIG9mIHJhbmdlCQkqLworCQlwYWdlX2J1Zl9mbGFnc190KTsJLyogUEJGX0xPQ0ssIFBCRl9BU1lOQwkJKi8KKworI2RlZmluZSB4ZnNfYnVmX3JlYWQodGFyZ2V0LCBibGtubywgbGVuLCBmbGFncykgXAorCXhmc19idWZfcmVhZF9mbGFncygodGFyZ2V0KSwgKGJsa25vKSwgKGxlbiksIFBCRl9MT0NLIHwgUEJGX01BUFBFRCkKKworZXh0ZXJuIHhmc19idWZfdCAqcGFnZWJ1Zl9sb29rdXAoCisJCXhmc19idWZ0YXJnX3QgKiwKKwkJbG9mZl90LAkJCS8qIHN0YXJ0aW5nIG9mZnNldCBvZiByYW5nZQkqLworCQlzaXplX3QsCQkJLyogbGVuZ3RoIG9mIHJhbmdlCQkqLworCQlwYWdlX2J1Zl9mbGFnc190KTsJLyogUEJGX1JFQUQsIFBCRl9XUklURSwJCSovCisJCQkJCS8qIFBCRl9GT1JDRUlPLCAJCSovCisKK2V4dGVybiB4ZnNfYnVmX3QgKnBhZ2VidWZfZ2V0X2VtcHR5KAkvKiBhbGxvY2F0ZSBwYWdlYnVmIHN0cnVjdCB3aXRoCSovCisJCQkJCS8qICBubyBtZW1vcnkgb3IgZGlzayBhZGRyZXNzCSovCisJCXNpemVfdCBsZW4sCisJCXhmc19idWZ0YXJnX3QgKik7CS8qIG1vdW50IHBvaW50ICJmYWtlIiBpbm9kZQkqLworCitleHRlcm4geGZzX2J1Zl90ICpwYWdlYnVmX2dldF9ub19kYWRkcigvKiBhbGxvY2F0ZSBwYWdlYnVmIHN0cnVjdAkqLworCQkJCQkvKiB3aXRob3V0IGRpc2sgYWRkcmVzcwkJKi8KKwkJc2l6ZV90IGxlbiwKKwkJeGZzX2J1ZnRhcmdfdCAqKTsJLyogbW91bnQgcG9pbnQgImZha2UiIGlub2RlCSovCisKK2V4dGVybiBpbnQgcGFnZWJ1Zl9hc3NvY2lhdGVfbWVtb3J5KAorCQl4ZnNfYnVmX3QgKiwKKwkJdm9pZCAqLAorCQlzaXplX3QpOworCitleHRlcm4gdm9pZCBwYWdlYnVmX2hvbGQoCQkvKiBpbmNyZW1lbnQgcmVmZXJlbmNlIGNvdW50CSovCisJCXhmc19idWZfdCAqKTsJCS8qIGJ1ZmZlciB0byBob2xkCQkqLworCitleHRlcm4gdm9pZCBwYWdlYnVmX3JlYWRhaGVhZCgJCS8qIHJlYWQgYWhlYWQgaW50byBjYWNoZQkqLworCQl4ZnNfYnVmdGFyZ190ICAqLAkvKiB0YXJnZXQgZm9yIGJ1ZmZlciAob3IgTlVMTCkJKi8KKwkJbG9mZl90LAkJCS8qIHN0YXJ0aW5nIG9mZnNldCBvZiByYW5nZSAgICAgKi8KKwkJc2l6ZV90LAkJCS8qIGxlbmd0aCBvZiByYW5nZSAgICAgICAgICAgICAgKi8KKwkJcGFnZV9idWZfZmxhZ3NfdCk7CS8qIGFkZGl0aW9uYWwgcmVhZCBmbGFncwkqLworCisvKiBSZWxlYXNpbmcgQnVmZmVycyAqLworCitleHRlcm4gdm9pZCBwYWdlYnVmX2ZyZWUoCQkvKiBkZWFsbG9jYXRlIGEgYnVmZmVyCQkqLworCQl4ZnNfYnVmX3QgKik7CQkvKiBidWZmZXIgdG8gZGVhbGxvY2F0ZQkJKi8KKworZXh0ZXJuIHZvaWQgcGFnZWJ1Zl9yZWxlKAkJLyogcmVsZWFzZSBob2xkIG9uIGEgYnVmZmVyCSovCisJCXhmc19idWZfdCAqKTsJCS8qIGJ1ZmZlciB0byByZWxlYXNlCQkqLworCisvKiBMb2NraW5nIGFuZCBVbmxvY2tpbmcgQnVmZmVycyAqLworCitleHRlcm4gaW50IHBhZ2VidWZfY29uZF9sb2NrKAkJLyogbG9jayBidWZmZXIsIGlmIG5vdCBsb2NrZWQJKi8KKwkJCQkJLyogKHJldHVybnMgLUVCVVNZIGlmIGxvY2tlZCkJKi8KKwkJeGZzX2J1Zl90ICopOwkJLyogYnVmZmVyIHRvIGxvY2sJCSovCisKK2V4dGVybiBpbnQgcGFnZWJ1Zl9sb2NrX3ZhbHVlKAkJLyogcmV0dXJuIGNvdW50IG9uIGxvY2sJCSovCisJCXhmc19idWZfdCAqKTsgICAgICAgICAgLyogYnVmZmVyIHRvIGNoZWNrICAgICAgICAgICAgICAqLworCitleHRlcm4gaW50IHBhZ2VidWZfbG9jaygJCS8qIGxvY2sgYnVmZmVyICAgICAgICAgICAgICAgICAgKi8KKwkJeGZzX2J1Zl90ICopOyAgICAgICAgICAvKiBidWZmZXIgdG8gbG9jayAgICAgICAgICAgICAgICovCisKK2V4dGVybiB2b2lkIHBhZ2VidWZfdW5sb2NrKAkJLyogdW5sb2NrIGJ1ZmZlcgkJKi8KKwkJeGZzX2J1Zl90ICopOwkJLyogYnVmZmVyIHRvIHVubG9jawkJKi8KKworLyogQnVmZmVyIFJlYWQgYW5kIFdyaXRlIFJvdXRpbmVzICovCisKK2V4dGVybiB2b2lkIHBhZ2VidWZfaW9kb25lKAkJLyogbWFyayBidWZmZXIgSS9PIGNvbXBsZXRlCSovCisJCXhmc19idWZfdCAqLAkJLyogYnVmZmVyIHRvIG1hcmsJCSovCisJCWludCwJCQkvKiB1c2UgZGF0YS9sb2cgaGVscGVyIHRocmVhZC4JKi8KKwkJaW50KTsJCQkvKiBydW4gY29tcGxldGlvbiBsb2NhbGx5LCBvciBpbgorCQkJCQkgKiBhIGhlbHBlciB0aHJlYWQuCQkqLworCitleHRlcm4gdm9pZCBwYWdlYnVmX2lvZXJyb3IoCQkvKiBtYXJrIGJ1ZmZlciBpbiBlcnJvcgkob3Igbm90KSAqLworCQl4ZnNfYnVmX3QgKiwJCS8qIGJ1ZmZlciB0byBtYXJrCQkqLworCQlpbnQpOwkJCS8qIGVycm9yIHRvIHN0b3JlICgwIGlmIG5vbmUpCSovCisKK2V4dGVybiBpbnQgcGFnZWJ1Zl9pb3N0YXJ0KAkJLyogc3RhcnQgSS9PIG9uIGEgYnVmZmVyCSovCisJCXhmc19idWZfdCAqLAkJLyogYnVmZmVyIHRvIHN0YXJ0CQkqLworCQlwYWdlX2J1Zl9mbGFnc190KTsJLyogUEJGX0xPQ0ssIFBCRl9BU1lOQywJCSovCisJCQkJCS8qIFBCRl9SRUFELCBQQkZfV1JJVEUsCQkqLworCQkJCQkvKiBQQkZfREVMV1JJCQkJKi8KKworZXh0ZXJuIGludCBwYWdlYnVmX2lvcmVxdWVzdCgJCS8qIHN0YXJ0IHJlYWwgSS9PCQkqLworCQl4ZnNfYnVmX3QgKik7CQkvKiBidWZmZXIgdG8gY29udmV5IHRvIGRldmljZQkqLworCitleHRlcm4gaW50IHBhZ2VidWZfaW93YWl0KAkJLyogd2FpdCBmb3IgYnVmZmVyIEkvTyBkb25lCSovCisJCXhmc19idWZfdCAqKTsJCS8qIGJ1ZmZlciB0byB3YWl0IG9uCQkqLworCitleHRlcm4gdm9pZCBwYWdlYnVmX2lvbW92ZSgJCS8qIG1vdmUgZGF0YSBpbi9vdXQgb2YgcGFnZWJ1ZgkqLworCQl4ZnNfYnVmX3QgKiwJCS8qIGJ1ZmZlciB0byBtYW5pcHVsYXRlCQkqLworCQlzaXplX3QsCQkJLyogc3RhcnRpbmcgYnVmZmVyIG9mZnNldAkqLworCQlzaXplX3QsCQkJLyogbGVuZ3RoIGluIGJ1ZmZlcgkJKi8KKwkJY2FkZHJfdCwJCS8qIGRhdGEgcG9pbnRlcgkJCSovCisJCXBhZ2VfYnVmX3J3X3QpOwkJLyogZGlyZWN0aW9uCQkJKi8KKworc3RhdGljIGlubGluZSBpbnQgcGFnZWJ1Zl9pb3N0cmF0ZWd5KHhmc19idWZfdCAqcGIpCit7CisJcmV0dXJuIHBiLT5wYl9zdHJhdCA/IHBiLT5wYl9zdHJhdChwYikgOiBwYWdlYnVmX2lvcmVxdWVzdChwYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHBhZ2VidWZfZ2V0ZXJyb3IoeGZzX2J1Zl90ICpwYikKK3sKKwlyZXR1cm4gcGIgPyBwYi0+cGJfZXJyb3IgOiBFTk9NRU07Cit9CisKKy8qIEJ1ZmZlciBVdGlsaXR5IFJvdXRpbmVzICovCisKK2V4dGVybiBjYWRkcl90IHBhZ2VidWZfb2Zmc2V0KAkJLyogcG9pbnRlciBhdCBvZmZzZXQgaW4gYnVmZmVyCSovCisJCXhmc19idWZfdCAqLAkJLyogYnVmZmVyIHRvIG9mZnNldCBpbnRvCSovCisJCXNpemVfdCk7CQkvKiBvZmZzZXQJCQkqLworCisvKiBQaW5uaW5nIEJ1ZmZlciBTdG9yYWdlIGluIE1lbW9yeSAqLworCitleHRlcm4gdm9pZCBwYWdlYnVmX3BpbigJCS8qIHBpbiBidWZmZXIgaW4gbWVtb3J5CQkqLworCQl4ZnNfYnVmX3QgKik7CQkvKiBidWZmZXIgdG8gcGluCQkqLworCitleHRlcm4gdm9pZCBwYWdlYnVmX3VucGluKAkJLyogdW5waW4gYnVmZmVyZWQgZGF0YQkJKi8KKwkJeGZzX2J1Zl90ICopOwkJLyogYnVmZmVyIHRvIHVucGluCQkqLworCitleHRlcm4gaW50IHBhZ2VidWZfaXNwaW4oCQkvKiBjaGVjayBpZiBidWZmZXIgaXMgcGlubmVkCSovCisJCXhmc19idWZfdCAqKTsJCS8qIGJ1ZmZlciB0byBjaGVjawkJKi8KKworLyogRGVsYXllZCBXcml0ZSBCdWZmZXIgUm91dGluZXMgKi8KKworZXh0ZXJuIHZvaWQgcGFnZWJ1Zl9kZWx3cmlfZGVxdWV1ZSh4ZnNfYnVmX3QgKik7CisKKy8qIEJ1ZmZlciBEYWVtb24gU2V0dXAgUm91dGluZXMgKi8KKworZXh0ZXJuIGludCBwYWdlYnVmX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBwYWdlYnVmX3Rlcm1pbmF0ZSh2b2lkKTsKKworCisjaWZkZWYgUEFHRUJVRl9UUkFDRQorZXh0ZXJuIGt0cmFjZV90ICpwYWdlYnVmX3RyYWNlX2J1ZjsKK2V4dGVybiB2b2lkIHBhZ2VidWZfdHJhY2UoCisJCXhmc19idWZfdCAqLAkJLyogYnVmZmVyIGJlaW5nIHRyYWNlZAkJKi8KKwkJY2hhciAqLAkJCS8qIGRlc2NyaXB0aW9uIG9mIG9wZXJhdGlvbgkqLworCQl2b2lkICosCQkJLyogYXJiaXRyYXJ5IGRpYWdub3N0aWMgdmFsdWUJKi8KKwkJdm9pZCAqKTsJCS8qIHJldHVybiBhZGRyZXNzCQkqLworI2Vsc2UKKyMgZGVmaW5lIHBhZ2VidWZfdHJhY2UocGIsIGlkLCBwdHIsIHJhKQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZSBwYWdlYnVmX3RhcmdldF9uYW1lKHRhcmdldCkJXAorCSh7IGNoYXIgX19iW0JERVZOQU1FX1NJWkVdOyBiZGV2bmFtZSgodGFyZ2V0KS0+cGJyX2JkZXYsIF9fYik7IF9fYjsgfSkKKworCisKKworCisvKiBUaGVzZSBhcmUganVzdCBmb3IgeGZzX3N5bmNzdWIuLi4gaXQgc2V0cyBhbiBpbnRlcm5hbCB2YXJpYWJsZQorICogdGhlbiBwYXNzZXMgaXQgdG8gVk9QX0ZMVVNIX1BBR0VTIG9yIGFkZHMgdGhlIGZsYWdzIHRvIGEgbmV3bHkgZ290dGVuIGJ1Zl90CisgKi8KKyNkZWZpbmUgWEZTX0JfQVNZTkMJCVBCRl9BU1lOQworI2RlZmluZSBYRlNfQl9ERUxXUkkJCVBCRl9ERUxXUkkKKyNkZWZpbmUgWEZTX0JfUkVBRAkJUEJGX1JFQUQKKyNkZWZpbmUgWEZTX0JfV1JJVEUJCVBCRl9XUklURQorI2RlZmluZSBYRlNfQl9TVEFMRQkJUEJGX1NUQUxFCisKKyNkZWZpbmUgWEZTX0JVRl9UUllMT0NLCQlQQkZfVFJZTE9DSworI2RlZmluZSBYRlNfSU5DT1JFX1RSWUxPQ0sJUEJGX1RSWUxPQ0sKKyNkZWZpbmUgWEZTX0JVRl9MT0NLCQlQQkZfTE9DSworI2RlZmluZSBYRlNfQlVGX01BUFBFRAkJUEJGX01BUFBFRAorCisjZGVmaW5lIEJVRl9CVVNZCQlQQkZfRE9OVF9CTE9DSworCisjZGVmaW5lIFhGU19CVUZfQkZMQUdTKHgpCSgoeCktPnBiX2ZsYWdzKQorI2RlZmluZSBYRlNfQlVGX1pFUk9GTEFHUyh4KQlcCisJKCh4KS0+cGJfZmxhZ3MgJj0gfihQQkZfUkVBRHxQQkZfV1JJVEV8UEJGX0FTWU5DfFBCRl9ERUxXUkkpKQorCisjZGVmaW5lIFhGU19CVUZfU1RBTEUoeCkJKCh4KS0+cGJfZmxhZ3MgfD0gWEZTX0JfU1RBTEUpCisjZGVmaW5lIFhGU19CVUZfVU5TVEFMRSh4KQkoKHgpLT5wYl9mbGFncyAmPSB+WEZTX0JfU1RBTEUpCisjZGVmaW5lIFhGU19CVUZfSVNTVEFMRSh4KQkoKHgpLT5wYl9mbGFncyAmIFhGU19CX1NUQUxFKQorI2RlZmluZSBYRlNfQlVGX1NVUEVSX1NUQUxFKHgpCWRvIHsJCQkJXAorCQkJCQlYRlNfQlVGX1NUQUxFKHgpOwlcCisJCQkJCXBhZ2VidWZfZGVsd3JpX2RlcXVldWUoeCk7CVwKKwkJCQkJWEZTX0JVRl9ET05FKHgpOwlcCisJCQkJfSB3aGlsZSAoMCkKKworI2RlZmluZSBYRlNfQlVGX01BTkFHRQkJUEJGX0ZTX01BTkFHRUQKKyNkZWZpbmUgWEZTX0JVRl9VTk1BTkFHRSh4KQkoKHgpLT5wYl9mbGFncyAmPSB+UEJGX0ZTX01BTkFHRUQpCisKKyNkZWZpbmUgWEZTX0JVRl9ERUxBWVdSSVRFKHgpCSAoKHgpLT5wYl9mbGFncyB8PSBQQkZfREVMV1JJKQorI2RlZmluZSBYRlNfQlVGX1VOREVMQVlXUklURSh4KQkgcGFnZWJ1Zl9kZWx3cmlfZGVxdWV1ZSh4KQorI2RlZmluZSBYRlNfQlVGX0lTREVMQVlXUklURSh4KQkgKCh4KS0+cGJfZmxhZ3MgJiBQQkZfREVMV1JJKQorCisjZGVmaW5lIFhGU19CVUZfRVJST1IoeCxubykJIHBhZ2VidWZfaW9lcnJvcih4LG5vKQorI2RlZmluZSBYRlNfQlVGX0dFVEVSUk9SKHgpCSBwYWdlYnVmX2dldGVycm9yKHgpCisjZGVmaW5lIFhGU19CVUZfSVNFUlJPUih4KQkgKHBhZ2VidWZfZ2V0ZXJyb3IoeCk/MTowKQorCisjZGVmaW5lIFhGU19CVUZfRE9ORSh4KQkJICgoeCktPnBiX2ZsYWdzICY9IH4oUEJGX1BBUlRJQUx8UEJGX05PTkUpKQorI2RlZmluZSBYRlNfQlVGX1VORE9ORSh4KQkgKCh4KS0+cGJfZmxhZ3MgfD0gUEJGX1BBUlRJQUx8UEJGX05PTkUpCisjZGVmaW5lIFhGU19CVUZfSVNET05FKHgpCSAoIShQQkZfTk9UX0RPTkUoeCkpKQorCisjZGVmaW5lIFhGU19CVUZfQlVTWSh4KQkJICgoeCktPnBiX2ZsYWdzIHw9IFBCRl9GT1JDRUlPKQorI2RlZmluZSBYRlNfQlVGX1VOQlVTWSh4KQkgKCh4KS0+cGJfZmxhZ3MgJj0gflBCRl9GT1JDRUlPKQorI2RlZmluZSBYRlNfQlVGX0lTQlVTWSh4KQkgKDEpCisKKyNkZWZpbmUgWEZTX0JVRl9BU1lOQyh4KQkgKCh4KS0+cGJfZmxhZ3MgfD0gUEJGX0FTWU5DKQorI2RlZmluZSBYRlNfQlVGX1VOQVNZTkMoeCkJICgoeCktPnBiX2ZsYWdzICY9IH5QQkZfQVNZTkMpCisjZGVmaW5lIFhGU19CVUZfSVNBU1lOQyh4KQkgKCh4KS0+cGJfZmxhZ3MgJiBQQkZfQVNZTkMpCisKKyNkZWZpbmUgWEZTX0JVRl9GTFVTSCh4KQkgKCh4KS0+cGJfZmxhZ3MgfD0gUEJGX0ZMVVNIKQorI2RlZmluZSBYRlNfQlVGX1VORkxVU0goeCkJICgoeCktPnBiX2ZsYWdzICY9IH5QQkZfRkxVU0gpCisjZGVmaW5lIFhGU19CVUZfSVNGTFVTSCh4KQkgKCh4KS0+cGJfZmxhZ3MgJiBQQkZfRkxVU0gpCisKKyNkZWZpbmUgWEZTX0JVRl9TSFVUKHgpCQkgcHJpbnRrKCJYRlNfQlVGX1NIVVQgbm90IGltcGxlbWVudGVkIHlldFxuIikKKyNkZWZpbmUgWEZTX0JVRl9VTlNIVVQoeCkJIHByaW50aygiWEZTX0JVRl9VTlNIVVQgbm90IGltcGxlbWVudGVkIHlldFxuIikKKyNkZWZpbmUgWEZTX0JVRl9JU1NIVVQoeCkJICgwKQorCisjZGVmaW5lIFhGU19CVUZfSE9MRCh4KQkJcGFnZWJ1Zl9ob2xkKHgpCisjZGVmaW5lIFhGU19CVUZfUkVBRCh4KQkJKCh4KS0+cGJfZmxhZ3MgfD0gUEJGX1JFQUQpCisjZGVmaW5lIFhGU19CVUZfVU5SRUFEKHgpCSgoeCktPnBiX2ZsYWdzICY9IH5QQkZfUkVBRCkKKyNkZWZpbmUgWEZTX0JVRl9JU1JFQUQoeCkJKCh4KS0+cGJfZmxhZ3MgJiBQQkZfUkVBRCkKKworI2RlZmluZSBYRlNfQlVGX1dSSVRFKHgpCSgoeCktPnBiX2ZsYWdzIHw9IFBCRl9XUklURSkKKyNkZWZpbmUgWEZTX0JVRl9VTldSSVRFKHgpCSgoeCktPnBiX2ZsYWdzICY9IH5QQkZfV1JJVEUpCisjZGVmaW5lIFhGU19CVUZfSVNXUklURSh4KQkoKHgpLT5wYl9mbGFncyAmIFBCRl9XUklURSkKKworI2RlZmluZSBYRlNfQlVGX0lTVU5JTklUSUFMKHgpCSAoMCkKKyNkZWZpbmUgWEZTX0JVRl9VTlVOSU5JVElBTCh4KQkgKDApCisKKyNkZWZpbmUgWEZTX0JVRl9CUF9JU01BUFBFRChicCkJIDEKKworI2RlZmluZSBYRlNfQlVGX0RBVEFJTyh4KQkoKHgpLT5wYl9mbGFncyB8PSBQQkZfRlNfREFUQUlPRCkKKyNkZWZpbmUgWEZTX0JVRl9VTkRBVEFJTyh4KQkoKHgpLT5wYl9mbGFncyAmPSB+UEJGX0ZTX0RBVEFJT0QpCisKKyNkZWZpbmUgWEZTX0JVRl9JT0RPTkVfRlVOQyhidWYpCShidWYpLT5wYl9pb2RvbmUKKyNkZWZpbmUgWEZTX0JVRl9TRVRfSU9ET05FX0ZVTkMoYnVmLCBmdW5jKQlcCisJCQkoYnVmKS0+cGJfaW9kb25lID0gKGZ1bmMpCisjZGVmaW5lIFhGU19CVUZfQ0xSX0lPRE9ORV9GVU5DKGJ1ZikJCVwKKwkJCShidWYpLT5wYl9pb2RvbmUgPSBOVUxMCisjZGVmaW5lIFhGU19CVUZfU0VUX0JEU1RSQVRfRlVOQyhidWYsIGZ1bmMpCVwKKwkJCShidWYpLT5wYl9zdHJhdCA9IChmdW5jKQorI2RlZmluZSBYRlNfQlVGX0NMUl9CRFNUUkFUX0ZVTkMoYnVmKQkJXAorCQkJKGJ1ZiktPnBiX3N0cmF0ID0gTlVMTAorCisjZGVmaW5lIFhGU19CVUZfRlNQUklWQVRFKGJ1ZiwgdHlwZSkJCVwKKwkJCSgodHlwZSkoYnVmKS0+cGJfZnNwcml2KQorI2RlZmluZSBYRlNfQlVGX1NFVF9GU1BSSVZBVEUoYnVmLCB2YWx1ZSkJXAorCQkJKGJ1ZiktPnBiX2ZzcHJpdiA9ICh2b2lkICopKHZhbHVlKQorI2RlZmluZSBYRlNfQlVGX0ZTUFJJVkFURTIoYnVmLCB0eXBlKQkJXAorCQkJKCh0eXBlKShidWYpLT5wYl9mc3ByaXYyKQorI2RlZmluZSBYRlNfQlVGX1NFVF9GU1BSSVZBVEUyKGJ1ZiwgdmFsdWUpCVwKKwkJCShidWYpLT5wYl9mc3ByaXYyID0gKHZvaWQgKikodmFsdWUpCisjZGVmaW5lIFhGU19CVUZfRlNQUklWQVRFMyhidWYsIHR5cGUpCQlcCisJCQkoKHR5cGUpKGJ1ZiktPnBiX2ZzcHJpdjMpCisjZGVmaW5lIFhGU19CVUZfU0VUX0ZTUFJJVkFURTMoYnVmLCB2YWx1ZSkJXAorCQkJKGJ1ZiktPnBiX2ZzcHJpdjMgID0gKHZvaWQgKikodmFsdWUpCisjZGVmaW5lIFhGU19CVUZfU0VUX1NUQVJUKGJ1ZikKKworI2RlZmluZSBYRlNfQlVGX1NFVF9CUkVMU0VfRlVOQyhidWYsIHZhbHVlKSBcCisJCQkoYnVmKS0+cGJfcmVsc2UgPSAodmFsdWUpCisKKyNkZWZpbmUgWEZTX0JVRl9QVFIoYnApCQkoeGZzX2NhZGRyX3QpKChicCktPnBiX2FkZHIpCisKK2V4dGVybiBpbmxpbmUgeGZzX2NhZGRyX3QgeGZzX2J1Zl9vZmZzZXQoeGZzX2J1Zl90ICpicCwgc2l6ZV90IG9mZnNldCkKK3sKKwlpZiAoYnAtPnBiX2ZsYWdzICYgUEJGX01BUFBFRCkKKwkJcmV0dXJuIFhGU19CVUZfUFRSKGJwKSArIG9mZnNldDsKKwlyZXR1cm4gKHhmc19jYWRkcl90KSBwYWdlYnVmX29mZnNldChicCwgb2Zmc2V0KTsKK30KKworI2RlZmluZSBYRlNfQlVGX1NFVF9QVFIoYnAsIHZhbCwgY291bnQpCQlcCisJCQkJcGFnZWJ1Zl9hc3NvY2lhdGVfbWVtb3J5KGJwLCB2YWwsIGNvdW50KQorI2RlZmluZSBYRlNfQlVGX0FERFIoYnApCSgoYnApLT5wYl9ibikKKyNkZWZpbmUgWEZTX0JVRl9TRVRfQUREUihicCwgYmxrKQkJXAorCQkJKChicCktPnBiX2JuID0gKHhmc19kYWRkcl90KShibGspKQorI2RlZmluZSBYRlNfQlVGX09GRlNFVChicCkJKChicCktPnBiX2ZpbGVfb2Zmc2V0KQorI2RlZmluZSBYRlNfQlVGX1NFVF9PRkZTRVQoYnAsIG9mZikJCVwKKwkJCSgoYnApLT5wYl9maWxlX29mZnNldCA9IChvZmYpKQorI2RlZmluZSBYRlNfQlVGX0NPVU5UKGJwKQkoKGJwKS0+cGJfY291bnRfZGVzaXJlZCkKKyNkZWZpbmUgWEZTX0JVRl9TRVRfQ09VTlQoYnAsIGNudCkJCVwKKwkJCSgoYnApLT5wYl9jb3VudF9kZXNpcmVkID0gKGNudCkpCisjZGVmaW5lIFhGU19CVUZfU0laRShicCkJKChicCktPnBiX2J1ZmZlcl9sZW5ndGgpCisjZGVmaW5lIFhGU19CVUZfU0VUX1NJWkUoYnAsIGNudCkJCVwKKwkJCSgoYnApLT5wYl9idWZmZXJfbGVuZ3RoID0gKGNudCkpCisjZGVmaW5lIFhGU19CVUZfU0VUX1ZUWVBFX1JFRihicCwgdHlwZSwgcmVmKQorI2RlZmluZSBYRlNfQlVGX1NFVF9WVFlQRShicCwgdHlwZSkKKyNkZWZpbmUgWEZTX0JVRl9TRVRfUkVGKGJwLCByZWYpCisKKyNkZWZpbmUgWEZTX0JVRl9JU1BJTk5FRChicCkJcGFnZWJ1Zl9pc3BpbihicCkKKworI2RlZmluZSBYRlNfQlVGX1ZBTFVTRU1BKGJwKQlwYWdlYnVmX2xvY2tfdmFsdWUoYnApCisjZGVmaW5lIFhGU19CVUZfQ1BTRU1BKGJwKQkocGFnZWJ1Zl9jb25kX2xvY2soYnApID09IDApCisjZGVmaW5lIFhGU19CVUZfVlNFTUEoYnApCXBhZ2VidWZfdW5sb2NrKGJwKQorI2RlZmluZSBYRlNfQlVGX1BTRU1BKGJwLHgpCXBhZ2VidWZfbG9jayhicCkKKyNkZWZpbmUgWEZTX0JVRl9WX0lPRE9ORVNFTUEoYnApIHVwKCZicC0+cGJfaW9kb25lc2VtYSk7CisKKy8qIHNldHVwIHRoZSBidWZmZXIgdGFyZ2V0IGZyb20gYSBidWZ0YXJnIHN0cnVjdHVyZSAqLworI2RlZmluZSBYRlNfQlVGX1NFVF9UQVJHRVQoYnAsIHRhcmdldCkJXAorCQkoYnApLT5wYl90YXJnZXQgPSAodGFyZ2V0KQorI2RlZmluZSBYRlNfQlVGX1RBUkdFVChicCkJKChicCktPnBiX3RhcmdldCkKKyNkZWZpbmUgWEZTX0JVRlRBUkdfTkFNRSh0YXJnZXQpCVwKKwkJcGFnZWJ1Zl90YXJnZXRfbmFtZSh0YXJnZXQpCisKKyNkZWZpbmUgWEZTX0JVRl9TRVRfVlRZUEVfUkVGKGJwLCB0eXBlLCByZWYpCisjZGVmaW5lIFhGU19CVUZfU0VUX1ZUWVBFKGJwLCB0eXBlKQorI2RlZmluZSBYRlNfQlVGX1NFVF9SRUYoYnAsIHJlZikKKworc3RhdGljIGlubGluZSBpbnQJeGZzX2Jhd3JpdGUodm9pZCAqbXAsIHhmc19idWZfdCAqYnApCit7CisJYnAtPnBiX2ZzcHJpdjMgPSBtcDsKKwlicC0+cGJfc3RyYXQgPSB4ZnNfYmRzdHJhdF9jYjsKKwlwYWdlYnVmX2RlbHdyaV9kZXF1ZXVlKGJwKTsKKwlyZXR1cm4gcGFnZWJ1Zl9pb3N0YXJ0KGJwLCBQQkZfV1JJVEUgfCBQQkZfQVNZTkMgfCBfUEJGX1JVTl9RVUVVRVMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQJeGZzX2J1Zl9yZWxzZSh4ZnNfYnVmX3QgKmJwKQoreworCWlmICghYnAtPnBiX3JlbHNlKQorCQlwYWdlYnVmX3VubG9jayhicCk7CisJcGFnZWJ1Zl9yZWxlKGJwKTsKK30KKworI2RlZmluZSB4ZnNfYnBpbihicCkJCXBhZ2VidWZfcGluKGJwKQorI2RlZmluZSB4ZnNfYnVucGluKGJwKQkJcGFnZWJ1Zl91bnBpbihicCkKKworI2RlZmluZSB4ZnNfYnVmdHJhY2UoaWQsIGJwKQlcCisJICAgIHBhZ2VidWZfdHJhY2UoYnAsIGlkLCBOVUxMLCAodm9pZCAqKV9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSkKKworI2RlZmluZSB4ZnNfYmlvZG9uZShwYikJCSAgICBcCisJICAgIHBhZ2VidWZfaW9kb25lKHBiLCAocGItPnBiX2ZsYWdzICYgUEJGX0ZTX0RBVEFJT0QpLCAwKQorCisjZGVmaW5lIHhmc19iaW9tb3ZlKHBiLCBvZmYsIGxlbiwgZGF0YSwgcncpIFwKKwkgICAgcGFnZWJ1Zl9pb21vdmUoKHBiKSwgKG9mZiksIChsZW4pLCAoZGF0YSksIFwKKwkJKChydykgPT0gWEZTX0JfV1JJVEUpID8gUEJSV19XUklURSA6IFBCUldfUkVBRCkKKworI2RlZmluZSB4ZnNfYmlvemVybyhwYiwgb2ZmLCBsZW4pIFwKKwkgICAgcGFnZWJ1Zl9pb21vdmUoKHBiKSwgKG9mZiksIChsZW4pLCBOVUxMLCBQQlJXX1pFUk8pCisKKworc3RhdGljIGlubGluZSBpbnQJWEZTX2J3cml0ZSh4ZnNfYnVmX3QgKnBiKQoreworCWludAlpb3dhaXQgPSAocGItPnBiX2ZsYWdzICYgUEJGX0FTWU5DKSA9PSAwOworCWludAllcnJvciA9IDA7CisKKwlpZiAoIWlvd2FpdCkKKwkJcGItPnBiX2ZsYWdzIHw9IF9QQkZfUlVOX1FVRVVFUzsKKworCXBhZ2VidWZfZGVsd3JpX2RlcXVldWUocGIpOworCXBhZ2VidWZfaW9zdHJhdGVneShwYik7CisJaWYgKGlvd2FpdCkgeworCQllcnJvciA9IHBhZ2VidWZfaW93YWl0KHBiKTsKKwkJeGZzX2J1Zl9yZWxzZShwYik7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworI2RlZmluZSBYRlNfYmR3cml0ZShwYikJCSAgICAgXAorCSAgICBwYWdlYnVmX2lvc3RhcnQocGIsIFBCRl9ERUxXUkkgfCBQQkZfQVNZTkMpCisKK3N0YXRpYyBpbmxpbmUgaW50IHhmc19iZHdyaXRlKHZvaWQgKm1wLCB4ZnNfYnVmX3QgKmJwKQoreworCWJwLT5wYl9zdHJhdCA9IHhmc19iZHN0cmF0X2NiOworCWJwLT5wYl9mc3ByaXYzID0gbXA7CisKKwlyZXR1cm4gcGFnZWJ1Zl9pb3N0YXJ0KGJwLCBQQkZfREVMV1JJIHwgUEJGX0FTWU5DKTsKK30KKworI2RlZmluZSBYRlNfYmRzdHJhdChicCkgcGFnZWJ1Zl9pb3JlcXVlc3QoYnApCisKKyNkZWZpbmUgeGZzX2lvd2FpdChwYikJcGFnZWJ1Zl9pb3dhaXQocGIpCisKKyNkZWZpbmUgeGZzX2JhcmVhZCh0YXJnZXQsIHJhYmxrbm8sIHJhbGVuKSAgXAorCXBhZ2VidWZfcmVhZGFoZWFkKCh0YXJnZXQpLCAocmFibGtubyksIChyYWxlbiksIFBCRl9ET05UX0JMT0NLKQorCisjZGVmaW5lIHhmc19idWZfZ2V0X2VtcHR5KGxlbiwgdGFyZ2V0KQlwYWdlYnVmX2dldF9lbXB0eSgobGVuKSwgKHRhcmdldCkpCisjZGVmaW5lIHhmc19idWZfZ2V0X25vYWRkcihsZW4sIHRhcmdldCkJcGFnZWJ1Zl9nZXRfbm9fZGFkZHIoKGxlbiksICh0YXJnZXQpKQorI2RlZmluZSB4ZnNfYnVmX2ZyZWUoYnApCQlwYWdlYnVmX2ZyZWUoYnApCisKKworLyoKKyAqCUhhbmRsaW5nIG9mIGJ1ZnRhcmdzLgorICovCisKK2V4dGVybiB4ZnNfYnVmdGFyZ190ICp4ZnNfYWxsb2NfYnVmdGFyZyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICosIGludCk7CitleHRlcm4gdm9pZCB4ZnNfZnJlZV9idWZ0YXJnKHhmc19idWZ0YXJnX3QgKiwgaW50KTsKK2V4dGVybiB2b2lkIHhmc193YWl0X2J1ZnRhcmcoeGZzX2J1ZnRhcmdfdCAqKTsKK2V4dGVybiBpbnQgeGZzX3NldHNpemVfYnVmdGFyZyh4ZnNfYnVmdGFyZ190ICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50KTsKK2V4dGVybiB2b2lkIHhmc19pbmNvcmVfcmVsc2UoeGZzX2J1ZnRhcmdfdCAqLCBpbnQsIGludCk7CitleHRlcm4gaW50IHhmc19mbHVzaF9idWZ0YXJnKHhmc19idWZ0YXJnX3QgKiwgaW50KTsKKworI2RlZmluZSB4ZnNfZ2V0c2l6ZV9idWZ0YXJnKGJ1ZnRhcmcpIFwKKwlibG9ja19zaXplKChidWZ0YXJnKS0+cGJyX2JkZXYpCisjZGVmaW5lIHhmc19yZWFkb25seV9idWZ0YXJnKGJ1ZnRhcmcpIFwKKwliZGV2X3JlYWRfb25seSgoYnVmdGFyZyktPnBicl9iZGV2KQorI2RlZmluZSB4ZnNfYmludmFsKGJ1ZnRhcmcpIFwKKwl4ZnNfZmx1c2hfYnVmdGFyZyhidWZ0YXJnLCAxKQorI2RlZmluZSBYRlNfYmZsdXNoKGJ1ZnRhcmcpIFwKKwl4ZnNfZmx1c2hfYnVmdGFyZyhidWZ0YXJnLCAxKQorCisjZW5kaWYJLyogX19YRlNfQlVGX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfY3JlZC5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfY3JlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYzQ1ODQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19jcmVkLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfQ1JFRF9IX18KKyNkZWZpbmUgX19YRlNfQ1JFRF9IX18KKworLyoKKyAqIENyZWRlbnRpYWxzCisgKi8KK3R5cGVkZWYgc3RydWN0IGNyZWQgeworCS8qIEVNUFRZICovCit9IGNyZWRfdDsKKworZXh0ZXJuIHN0cnVjdCBjcmVkICpzeXNfY3JlZDsKKworLyogdGhpcyBpcyBhIGhhY2suLiAoYXNzdW1zIHN5c19jcmVkIGlzIHRoZSBvbmx5IGNyZWRfdCBpbiB0aGUgc3lzdGVtKSAqLworc3RhdGljIF9faW5saW5lIGludCBjYXBhYmxlX2NyZWQoY3JlZF90ICpjciwgaW50IGNpZCkKK3sKKwlyZXR1cm4gKGNyID09IHN5c19jcmVkKSA/IDEgOiBjYXBhYmxlKGNpZCk7Cit9CisKKyNlbmRpZiAgLyogX19YRlNfQ1JFRF9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2V4cG9ydC5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZXhwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM3MmExYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2V4cG9ydC5jCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfZXhwb3J0LmgiCisKKy8qCisgKiBYRlMgZW5jb2RlIGFuZCBkZWNvZGVzIHRoZSBmaWxlaWQgcG9ydGlvbiBvZiBORlMgZmlsZWhhbmRsZXMKKyAqIGl0c2VsZiBpbnN0ZWFkIG9mIGxldHRpbmcgdGhlIGdlbmVyaWMgTkZTIGNvZGUgZG8gaXQuICBUaGlzCisgKiBhbGxvd3MgZmlsZXN5c3RlbXMgd2l0aCA2NCBiaXQgaW5vZGUgbnVtYmVycyB0byBiZSBleHBvcnRlZC4KKyAqCisgKiBOb3RlIHRoYXQgYSBzaWRlIGVmZmVjdCBpcyB0aGF0IHhmc192Z2V0KCkgd29uJ3QgYmUgcGFzc2VkIGEKKyAqIHplcm8gaW5vZGUvZ2VuZXJhdGlvbiBwYWlyIHVuZGVyIG5vcm1hbCBjaXJjdW1zdGFuY2VzLiAgQXMKKyAqIGhvd2V2ZXIgYSBtYWxpY2lvdXMgY2xpZW50IGNvdWxkIHNlbmQgdXMgc3VjaCBkYXRhLCB0aGUgY2hlY2sKKyAqIHJlbWFpbnMgaW4gdGhhdCBjb2RlLgorICovCisKKworU1RBVElDIHN0cnVjdCBkZW50cnkgKgorbGludmZzX2RlY29kZV9maCgKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sJKnNiLAorCV9fdTMyCQkJKmZoLAorCWludAkJCWZoX2xlbiwKKwlpbnQJCQlmaWxlaWRfdHlwZSwKKwlpbnQgKCphY2NlcHRhYmxlKSgKKwkJdm9pZAkJKmNvbnRleHQsCisJCXN0cnVjdCBkZW50cnkJKmRlKSwKKwl2b2lkCQkJKmNvbnRleHQpCit7CisJeGZzX2ZpZDJfdAkJaWZpZDsKKwl4ZnNfZmlkMl90CQlwZmlkOworCXZvaWQJCQkqcGFyZW50ID0gTlVMTDsKKwlpbnQJCQlpczY0ID0gMDsKKwlfX3UzMgkJCSpwID0gZmg7CisKKyNpZiBYRlNfQklHX0lOVU1TCisJaXM2NCA9IChmaWxlaWRfdHlwZSAmIFhGU19GSUxFSURfVFlQRV82NEZMQUcpOworCWZpbGVpZF90eXBlICY9IH5YRlNfRklMRUlEX1RZUEVfNjRGTEFHOworI2VuZGlmCisKKwkvKgorCSAqIE5vdGUgdGhhdCB3ZSBvbmx5IGFjY2VwdCBmaWxlaWRzIHdoaWNoIGFyZSBsb25nIGVub3VnaAorCSAqIHJhdGhlciB0aGFuIGFsbG93IHRoZSBwYXJlbnQgZ2VuZXJhdGlvbiBudW1iZXIgdG8gZGVmYXVsdAorCSAqIHRvIHplcm8uICBYRlMgY29uc2lkZXJzIHplcm8gYSB2YWxpZCBnZW5lcmF0aW9uIG51bWJlciBub3QKKwkgKiBhbiBpbnZhbGlkL3dpbGRjYXJkIHZhbHVlLiAgVGhlcmUncyBsaXR0bGUgcG9pbnQgcHJpbnRrJ2luZworCSAqIGEgd2FybmluZyBoZXJlIGFzIHdlIGRvbid0IGhhdmUgdGhlIGNsaWVudCBpbmZvcm1hdGlvbgorCSAqIHdoaWNoIHdvdWxkIG1ha2Ugc3VjaCBhIHdhcm5pbmcgdXNlZnVsLgorCSAqLworCWlmIChmaWxlaWRfdHlwZSA+IDIgfHwKKwkgICAgZmhfbGVuIDwgeGZzX2ZpbGVpZF9sZW5ndGgoKGZpbGVpZF90eXBlID09IDIpLCBpczY0KSkKKwkJcmV0dXJuIE5VTEw7CisKKwlwID0geGZzX2ZpbGVpZF9kZWNvZGVfZmlkMihwLCAmaWZpZCwgaXM2NCk7CisKKwlpZiAoZmlsZWlkX3R5cGUgPT0gMikgeworCQlwID0geGZzX2ZpbGVpZF9kZWNvZGVfZmlkMihwLCAmcGZpZCwgaXM2NCk7CisJCXBhcmVudCA9ICZwZmlkOworCX0KKwkKKwlmaCA9IChfX3UzMiAqKSZpZmlkOworCXJldHVybiBmaW5kX2V4cG9ydGVkX2RlbnRyeShzYiwgZmgsIHBhcmVudCwgYWNjZXB0YWJsZSwgY29udGV4dCk7Cit9CisKKworU1RBVElDIGludAorbGludmZzX2VuY29kZV9maCgKKwlzdHJ1Y3QgZGVudHJ5CQkqZGVudHJ5LAorCV9fdTMyCQkJKmZoLAorCWludAkJCSptYXhfbGVuLAorCWludAkJCWNvbm5lY3RhYmxlKQoreworCXN0cnVjdCBpbm9kZQkJKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCWludAkJCXR5cGUgPSAxOworCV9fdTMyCQkJKnAgPSBmaDsKKwlpbnQJCQlsZW47CisJaW50CQkJaXM2NCA9IDA7CisjaWYgWEZTX0JJR19JTlVNUworCXZmc190CQkJKnZmcyA9IExJTlZGU19HRVRfVkZTKGlub2RlLT5pX3NiKTsKKwl4ZnNfbW91bnRfdAkJKm1wID0gWEZTX1ZGU1RPTSh2ZnMpOworCQorCWlmICghKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UXzMyQklUSU5PT1BUKSkgeworCQkvKiBmaWxlc3lzdGVtIG1heSBjb250YWluIDY0Yml0IGlub2RlIG51bWJlcnMgKi8KKwkJaXM2NCA9IFhGU19GSUxFSURfVFlQRV82NEZMQUc7CisJfQorI2VuZGlmCisKKwkvKiBEaXJlY3RvcmllcyBkb24ndCBuZWVkIHRoZWlyIHBhcmVudCBlbmNvZGVkLCB0aGV5IGhhdmUgIi4uIiAqLworCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCSAgICBjb25uZWN0YWJsZSA9IDA7CisKKwkvKgorCSAqIE9ubHkgZW5jb2RlIGlmIHRoZXJlIGlzIGVub3VnaCBzcGFjZSBnaXZlbi4gIEluIHByYWN0aWNlCisJICogdGhpcyBtZWFucyB3ZSBjYW4ndCBleHBvcnQgYSBmaWxlc3lzdGVtIHdpdGggNjRiaXQgaW5vZGVzCisJICogb3ZlciBORlN2MiB3aXRoIHRoZSBzdWJ0cmVlX2NoZWNrIGV4cG9ydCBvcHRpb247IHRoZSBvdGhlcgorCSAqIHNldmVuIGNvbWJpbmF0aW9ucyB3b3JrLiAgVGhlIHJlYWwgYW5zd2VyIGlzICJkb24ndCB1c2UgdjIiLgorCSAqLworCWxlbiA9IHhmc19maWxlaWRfbGVuZ3RoKGNvbm5lY3RhYmxlLCBpczY0KTsKKwlpZiAoKm1heF9sZW4gPCBsZW4pCisJCXJldHVybiAyNTU7CisJKm1heF9sZW4gPSBsZW47CisKKwlwID0geGZzX2ZpbGVpZF9lbmNvZGVfaW5vZGUocCwgaW5vZGUsIGlzNjQpOworCWlmIChjb25uZWN0YWJsZSkgeworCQlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKKwkJcCA9IHhmc19maWxlaWRfZW5jb2RlX2lub2RlKHAsIGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGUsIGlzNjQpOworCQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOworCQl0eXBlID0gMjsKKwl9CisJQlVHX09OKChwIC0gZmgpICE9IGxlbik7CisJcmV0dXJuIHR5cGUgfCBpczY0OworfQorCitTVEFUSUMgc3RydWN0IGRlbnRyeSAqCitsaW52ZnNfZ2V0X2RlbnRyeSgKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sJKnNiLAorCXZvaWQJCQkqZGF0YSkKK3sKKwl2bm9kZV90CQkJKnZwOworCXN0cnVjdCBpbm9kZQkJKmlub2RlOworCXN0cnVjdCBkZW50cnkJCSpyZXN1bHQ7CisJdmZzX3QJCQkqdmZzcCA9IExJTlZGU19HRVRfVkZTKHNiKTsKKwlpbnQJCQllcnJvcjsKKworCVZGU19WR0VUKHZmc3AsICZ2cCwgKGZpZF90ICopZGF0YSwgZXJyb3IpOworCWlmIChlcnJvciB8fCB2cCA9PSBOVUxMKQorCQlyZXR1cm4gRVJSX1BUUigtRVNUQUxFKSA7CisKKwlpbm9kZSA9IExJTlZGU19HRVRfSVAodnApOworCXJlc3VsdCA9IGRfYWxsb2NfYW5vbihpbm9kZSk7CisgICAgICAgIGlmICghcmVzdWx0KSB7CisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisJcmV0dXJuIHJlc3VsdDsKK30KKworU1RBVElDIHN0cnVjdCBkZW50cnkgKgorbGludmZzX2dldF9wYXJlbnQoCisJc3RydWN0IGRlbnRyeQkJKmNoaWxkKQoreworCWludAkJCWVycm9yOworCXZub2RlX3QJCQkqdnAsICpjdnA7CisJc3RydWN0IGRlbnRyeQkJKnBhcmVudDsKKwlzdHJ1Y3QgZGVudHJ5CQlkb3Rkb3Q7CisKKwlkb3Rkb3QuZF9uYW1lLm5hbWUgPSAiLi4iOworCWRvdGRvdC5kX25hbWUubGVuID0gMjsKKwlkb3Rkb3QuZF9pbm9kZSA9IE5VTEw7CisKKwljdnAgPSBOVUxMOworCXZwID0gTElOVkZTX0dFVF9WUChjaGlsZC0+ZF9pbm9kZSk7CisJVk9QX0xPT0tVUCh2cCwgJmRvdGRvdCwgJmN2cCwgMCwgTlVMTCwgTlVMTCwgZXJyb3IpOworCWlmICh1bmxpa2VseShlcnJvcikpCisJCXJldHVybiBFUlJfUFRSKC1lcnJvcik7CisKKwlwYXJlbnQgPSBkX2FsbG9jX2Fub24oTElOVkZTX0dFVF9JUChjdnApKTsKKwlpZiAodW5saWtlbHkoIXBhcmVudCkpIHsKKwkJVk5fUkVMRShjdnApOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisJcmV0dXJuIHBhcmVudDsKK30KKworc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIGxpbnZmc19leHBvcnRfb3BzID0geworCS5kZWNvZGVfZmgJCT0gbGludmZzX2RlY29kZV9maCwKKwkuZW5jb2RlX2ZoCQk9IGxpbnZmc19lbmNvZGVfZmgsCisJLmdldF9wYXJlbnQJCT0gbGludmZzX2dldF9wYXJlbnQsCisJLmdldF9kZW50cnkJCT0gbGludmZzX2dldF9kZW50cnksCit9OwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfZXhwb3J0LmggYi9mcy94ZnMvbGludXgtMi42L3hmc19leHBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGIyYWJhCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZXhwb3J0LmgKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19FWFBPUlRfSF9fCisjZGVmaW5lIF9fWEZTX0VYUE9SVF9IX18KKworLyoKKyAqIENvbW1vbiBkZWZpbmVzIGZvciBjb2RlIHJlbGF0ZWQgdG8gZXhwb3J0aW5nIFhGUyBmaWxlc3lzdGVtcyBvdmVyIE5GUy4KKyAqCisgKiBUaGUgTkZTIGZpbGVpZCBnb2VzIG91dCBvbiB0aGUgd2lyZSBhcyBhbiBhcnJheSBvZgorICogMzJiaXQgdW5zaWduZWQgaW50cyBpbiBob3N0IG9yZGVyLiAgVGhlcmUgYXJlIDUgcG9zc2libGUKKyAqIGZvcm1hdHMuCisgKgorICogKDEpCWZpbGVpZF90eXBlPTB4MDAKKyAqCShubyBmaWxlaWQgZGF0YTsgaGFuZGxlZCBieSB0aGUgZ2VuZXJpYyBjb2RlKQorICoKKyAqICgyKQlmaWxlaWRfdHlwZT0weDAxCisgKglpbm9kZS1udW0KKyAqCWdlbmVyYXRpb24KKyAqCisgKiAoMykJZmlsZWlkX3R5cGU9MHgwMgorICoJaW5vZGUtbnVtCisgKglnZW5lcmF0aW9uCisgKglwYXJlbnQtaW5vZGUtbnVtCisgKglwYXJlbnQtZ2VuZXJhdGlvbgorICoKKyAqICg0KQlmaWxlaWRfdHlwZT0weDgxCisgKglpbm9kZS1udW0tbG8zMgorICoJaW5vZGUtbnVtLWhpMzIKKyAqCWdlbmVyYXRpb24KKyAqCisgKiAoNSkJZmlsZWlkX3R5cGU9MHg4MgorICoJaW5vZGUtbnVtLWxvMzIKKyAqCWlub2RlLW51bS1oaTMyCisgKglnZW5lcmF0aW9uCisgKglwYXJlbnQtaW5vZGUtbnVtLWxvMzIKKyAqCXBhcmVudC1pbm9kZS1udW0taGkzMgorICoJcGFyZW50LWdlbmVyYXRpb24KKyAqCisgKiBOb3RlLCB0aGUgTkZTIGZpbGVoYW5kbGUgYWxzbyBpbmNsdWRlcyBhbiBmc2lkIHBvcnRpb24gd2hpY2gKKyAqIG1heSBoYXZlIGFuIGlub2RlIG51bWJlciBpbiBpdC4gIFRoYXQgbnVtYmVyIGlzIGhhcmRjb2RlZCB0bworICogMzJiaXRzIGFuZCB0aGVyZSBpcyBubyB3YXkgZm9yIFhGUyB0byBpbnRlcmNlcHQgaXQuICBJbgorICogcHJhY3RpY2UgdGhpcyBtZWFucyB3aGVuIGV4cG9ydGluZyBhbiBYRlMgZmlsZXN5dGVtIHdpdGggNjRiaXQKKyAqIGlub2RlcyB5b3Ugc2hvdWxkIGVpdGhlciBleHBvcnQgdGhlIG1vdW50cG9pbnQgKHJhdGhlciB0aGFuCisgKiBhIHN1YmRpcmVjdG9yeSkgb3IgdXNlIHRoZSAiZnNpZCIgZXhwb3J0IG9wdGlvbi4KKyAqLworCisvKiBUaGlzIGZsYWcgZ29lcyBvbiB0aGUgd2lyZS4gIERvbid0IHBsYXkgd2l0aCBpdC4gKi8KKyNkZWZpbmUgWEZTX0ZJTEVJRF9UWVBFXzY0RkxBRwkweDgwCS8qIE5GUyBmaWxlaWQgaGFzIDY0Yml0IGlub2RlcyAqLworCisvKiBDYWxjdWxhdGUgdGhlIGxlbmd0aCBpbiB1MzIgdW5pdHMgb2YgdGhlIGZpbGVpZCBkYXRhICovCitzdGF0aWMgaW5saW5lIGludAoreGZzX2ZpbGVpZF9sZW5ndGgoaW50IGhhc3BhcmVudCwgaW50IGlzNjQpCit7CisJcmV0dXJuIGhhc3BhcmVudCA/IChpczY0ID8gNiA6IDQpIDogKGlzNjQgPyAzIDogMik7Cit9CisKKy8qCisgKiBEZWNvZGUgZW5jb2RlZCBpbm9kZSBpbmZvcm1hdGlvbiAoZWl0aGVyIGZvciB0aGUgaW5vZGUgaXRzZWxmCisgKiBvciB0aGUgcGFyZW50KSBpbnRvIGFuIHhmc19maWQyX3Qgc3RydWN0dXJlLiAgQWR2YW5jZXMgYW5kCisgKiByZXR1cm5zIHRoZSBuZXcgZGF0YSBwb2ludGVyCisgKi8KK3N0YXRpYyBpbmxpbmUgX191MzIgKgoreGZzX2ZpbGVpZF9kZWNvZGVfZmlkMihfX3UzMiAqcCwgeGZzX2ZpZDJfdCAqZmlkLCBpbnQgaXM2NCkKK3sKKwlmaWQtPmZpZF9sZW4gPSBzaXplb2YoeGZzX2ZpZDJfdCkgLSBzaXplb2YoZmlkLT5maWRfbGVuKTsKKwlmaWQtPmZpZF9wYWQgPSAwOworCWZpZC0+ZmlkX2lubyA9ICpwKys7CisjaWYgWEZTX0JJR19JTlVNUworCWlmIChpczY0KQorCQlmaWQtPmZpZF9pbm8gfD0gKCgoX191NjQpKCpwKyspKSA8PCAzMik7CisjZW5kaWYKKwlmaWQtPmZpZF9nZW4gPSAqcCsrOworCXJldHVybiBwOworfQorCisvKgorICogRW5jb2RlIGlub2RlIGluZm9ybWF0aW9uIChlaXRoZXIgZm9yIHRoZSBpbm9kZSBpdHNlbGYgb3IgdGhlCisgKiBwYXJlbnQpIGludG8gYSBmaWxlaWQgYnVmZmVyLiAgQWR2YW5jZXMgYW5kIHJldHVybnMgdGhlIG5ldworICogZGF0YSBwb2ludGVyLgorICovCitzdGF0aWMgaW5saW5lIF9fdTMyICoKK3hmc19maWxlaWRfZW5jb2RlX2lub2RlKF9fdTMyICpwLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgaXM2NCkKK3sKKwkqcCsrID0gKF9fdTMyKWlub2RlLT5pX2lubzsKKyNpZiBYRlNfQklHX0lOVU1TCisJaWYgKGlzNjQpCisJCSpwKysgPSAoX191MzIpKGlub2RlLT5pX2lubyA+PiAzMik7CisjZW5kaWYKKwkqcCsrID0gaW5vZGUtPmlfZ2VuZXJhdGlvbjsKKwlyZXR1cm4gcDsKK30KKworI2VuZGlmCS8qIF9fWEZTX0VYUE9SVF9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZpbGUuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZpbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjA1N2E0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZmlsZS5jCkBAIC0wLDAgKzEsNTczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisjaW5jbHVkZSAieGZzX3J3LmgiCisjaW5jbHVkZSAieGZzX2lvY3RsMzIuaCIKKworI2luY2x1ZGUgPGxpbnV4L2RjYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisKK3N0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgbGludmZzX2ZpbGVfdm1fb3BzOworCisKK1NUQVRJQyBpbmxpbmUgc3NpemVfdAorX19saW52ZnNfcmVhZCgKKwlzdHJ1Y3Qga2lvY2IJCSppb2NiLAorCWNoYXIJCQlfX3VzZXIgKmJ1ZiwKKwlpbnQJCQlpb2ZsYWdzLAorCXNpemVfdAkJCWNvdW50LAorCWxvZmZfdAkJCXBvcykKK3sKKwlzdHJ1Y3QgaW92ZWMJCWlvdiA9IHtidWYsIGNvdW50fTsKKwlzdHJ1Y3QgZmlsZQkJKmZpbGUgPSBpb2NiLT5raV9maWxwOworCXZub2RlX3QJCQkqdnAgPSBMSU5WRlNfR0VUX1ZQKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlzc2l6ZV90CQkJcnZhbDsKKworCUJVR19PTihpb2NiLT5raV9wb3MgIT0gcG9zKTsKKworCWlmICh1bmxpa2VseShmaWxlLT5mX2ZsYWdzICYgT19ESVJFQ1QpKQorCQlpb2ZsYWdzIHw9IElPX0lTRElSRUNUOworCVZPUF9SRUFEKHZwLCBpb2NiLCAmaW92LCAxLCAmaW9jYi0+a2lfcG9zLCBpb2ZsYWdzLCBOVUxMLCBydmFsKTsKKwlyZXR1cm4gcnZhbDsKK30KKworCitTVEFUSUMgc3NpemVfdAorbGludmZzX2Fpb19yZWFkKAorCXN0cnVjdCBraW9jYgkJKmlvY2IsCisJY2hhcgkJCV9fdXNlciAqYnVmLAorCXNpemVfdAkJCWNvdW50LAorCWxvZmZfdAkJCXBvcykKK3sKKwlyZXR1cm4gX19saW52ZnNfcmVhZChpb2NiLCBidWYsIElPX0lTQUlPLCBjb3VudCwgcG9zKTsKK30KKworU1RBVElDIHNzaXplX3QKK2xpbnZmc19haW9fcmVhZF9pbnZpcygKKwlzdHJ1Y3Qga2lvY2IJCSppb2NiLAorCWNoYXIJCQlfX3VzZXIgKmJ1ZiwKKwlzaXplX3QJCQljb3VudCwKKwlsb2ZmX3QJCQlwb3MpCit7CisJcmV0dXJuIF9fbGludmZzX3JlYWQoaW9jYiwgYnVmLCBJT19JU0FJT3xJT19JTlZJUywgY291bnQsIHBvcyk7Cit9CisKKworU1RBVElDIGlubGluZSBzc2l6ZV90CitfX2xpbnZmc193cml0ZSgKKwlzdHJ1Y3Qga2lvY2IJKmlvY2IsCisJY29uc3QgY2hhcglfX3VzZXIgKmJ1ZiwKKwlpbnQJCWlvZmxhZ3MsCisJc2l6ZV90CQljb3VudCwKKwlsb2ZmX3QJCXBvcykKK3sKKwlzdHJ1Y3QgaW92ZWMJaW92ID0geyh2b2lkIF9fdXNlciAqKWJ1ZiwgY291bnR9OworCXN0cnVjdCBmaWxlCSpmaWxlID0gaW9jYi0+a2lfZmlscDsKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OworCXZub2RlX3QJCSp2cCA9IExJTlZGU19HRVRfVlAoaW5vZGUpOworCXNzaXplX3QJCXJ2YWw7CisKKwlCVUdfT04oaW9jYi0+a2lfcG9zICE9IHBvcyk7CisJaWYgKHVubGlrZWx5KGZpbGUtPmZfZmxhZ3MgJiBPX0RJUkVDVCkpCisJCWlvZmxhZ3MgfD0gSU9fSVNESVJFQ1Q7CisKKwlWT1BfV1JJVEUodnAsIGlvY2IsICZpb3YsIDEsICZpb2NiLT5raV9wb3MsIGlvZmxhZ3MsIE5VTEwsIHJ2YWwpOworCXJldHVybiBydmFsOworfQorCisKK1NUQVRJQyBzc2l6ZV90CitsaW52ZnNfYWlvX3dyaXRlKAorCXN0cnVjdCBraW9jYgkJKmlvY2IsCisJY29uc3QgY2hhcgkJX191c2VyICpidWYsCisJc2l6ZV90CQkJY291bnQsCisJbG9mZl90CQkJcG9zKQoreworCXJldHVybiBfX2xpbnZmc193cml0ZShpb2NiLCBidWYsIElPX0lTQUlPLCBjb3VudCwgcG9zKTsKK30KKworU1RBVElDIHNzaXplX3QKK2xpbnZmc19haW9fd3JpdGVfaW52aXMoCisJc3RydWN0IGtpb2NiCQkqaW9jYiwKKwljb25zdCBjaGFyCQlfX3VzZXIgKmJ1ZiwKKwlzaXplX3QJCQljb3VudCwKKwlsb2ZmX3QJCQlwb3MpCit7CisJcmV0dXJuIF9fbGludmZzX3dyaXRlKGlvY2IsIGJ1ZiwgSU9fSVNBSU98SU9fSU5WSVMsIGNvdW50LCBwb3MpOworfQorCisKK1NUQVRJQyBpbmxpbmUgc3NpemVfdAorX19saW52ZnNfcmVhZHYoCisJc3RydWN0IGZpbGUJCSpmaWxlLAorCWNvbnN0IHN0cnVjdCBpb3ZlYyAJKmlvdiwKKwlpbnQJCQlpb2ZsYWdzLAorCXVuc2lnbmVkIGxvbmcJCW5yX3NlZ3MsCisJbG9mZl90CQkJKnBwb3MpCit7CisJc3RydWN0IGlub2RlCSppbm9kZSA9IGZpbGUtPmZfbWFwcGluZy0+aG9zdDsKKwl2bm9kZV90CQkqdnAgPSBMSU5WRlNfR0VUX1ZQKGlub2RlKTsKKwlzdHJ1Y3QJCWtpb2NiIGtpb2NiOworCXNzaXplX3QJCXJ2YWw7CisKKwlpbml0X3N5bmNfa2lvY2IoJmtpb2NiLCBmaWxlKTsKKwlraW9jYi5raV9wb3MgPSAqcHBvczsKKworCWlmICh1bmxpa2VseShmaWxlLT5mX2ZsYWdzICYgT19ESVJFQ1QpKQorCQlpb2ZsYWdzIHw9IElPX0lTRElSRUNUOworCVZPUF9SRUFEKHZwLCAma2lvY2IsIGlvdiwgbnJfc2VncywgJmtpb2NiLmtpX3BvcywgaW9mbGFncywgTlVMTCwgcnZhbCk7CisKKwkqcHBvcyA9IGtpb2NiLmtpX3BvczsKKwlyZXR1cm4gcnZhbDsKK30KKworU1RBVElDIHNzaXplX3QKK2xpbnZmc19yZWFkdigKKwlzdHJ1Y3QgZmlsZQkJKmZpbGUsCisJY29uc3Qgc3RydWN0IGlvdmVjIAkqaW92LAorCXVuc2lnbmVkIGxvbmcJCW5yX3NlZ3MsCisJbG9mZl90CQkJKnBwb3MpCit7CisJcmV0dXJuIF9fbGludmZzX3JlYWR2KGZpbGUsIGlvdiwgMCwgbnJfc2VncywgcHBvcyk7Cit9CisKK1NUQVRJQyBzc2l6ZV90CitsaW52ZnNfcmVhZHZfaW52aXMoCisJc3RydWN0IGZpbGUJCSpmaWxlLAorCWNvbnN0IHN0cnVjdCBpb3ZlYyAJKmlvdiwKKwl1bnNpZ25lZCBsb25nCQlucl9zZWdzLAorCWxvZmZfdAkJCSpwcG9zKQoreworCXJldHVybiBfX2xpbnZmc19yZWFkdihmaWxlLCBpb3YsIElPX0lOVklTLCBucl9zZWdzLCBwcG9zKTsKK30KKworCitTVEFUSUMgaW5saW5lIHNzaXplX3QKK19fbGludmZzX3dyaXRldigKKwlzdHJ1Y3QgZmlsZQkJKmZpbGUsCisJY29uc3Qgc3RydWN0IGlvdmVjIAkqaW92LAorCWludAkJCWlvZmxhZ3MsCisJdW5zaWduZWQgbG9uZwkJbnJfc2VncywKKwlsb2ZmX3QJCQkqcHBvcykKK3sKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OworCXZub2RlX3QJCSp2cCA9IExJTlZGU19HRVRfVlAoaW5vZGUpOworCXN0cnVjdAkJa2lvY2Iga2lvY2I7CisJc3NpemVfdAkJcnZhbDsKKworCWluaXRfc3luY19raW9jYigma2lvY2IsIGZpbGUpOworCWtpb2NiLmtpX3BvcyA9ICpwcG9zOworCWlmICh1bmxpa2VseShmaWxlLT5mX2ZsYWdzICYgT19ESVJFQ1QpKQorCQlpb2ZsYWdzIHw9IElPX0lTRElSRUNUOworCisJVk9QX1dSSVRFKHZwLCAma2lvY2IsIGlvdiwgbnJfc2VncywgJmtpb2NiLmtpX3BvcywgaW9mbGFncywgTlVMTCwgcnZhbCk7CisKKwkqcHBvcyA9IGtpb2NiLmtpX3BvczsKKwlyZXR1cm4gcnZhbDsKK30KKworCitTVEFUSUMgc3NpemVfdAorbGludmZzX3dyaXRldigKKwlzdHJ1Y3QgZmlsZQkJKmZpbGUsCisJY29uc3Qgc3RydWN0IGlvdmVjIAkqaW92LAorCXVuc2lnbmVkIGxvbmcJCW5yX3NlZ3MsCisJbG9mZl90CQkJKnBwb3MpCit7CisJcmV0dXJuIF9fbGludmZzX3dyaXRldihmaWxlLCBpb3YsIDAsIG5yX3NlZ3MsIHBwb3MpOworfQorCitTVEFUSUMgc3NpemVfdAorbGludmZzX3dyaXRldl9pbnZpcygKKwlzdHJ1Y3QgZmlsZQkJKmZpbGUsCisJY29uc3Qgc3RydWN0IGlvdmVjIAkqaW92LAorCXVuc2lnbmVkIGxvbmcJCW5yX3NlZ3MsCisJbG9mZl90CQkJKnBwb3MpCit7CisJcmV0dXJuIF9fbGludmZzX3dyaXRldihmaWxlLCBpb3YsIElPX0lOVklTLCBucl9zZWdzLCBwcG9zKTsKK30KKworU1RBVElDIHNzaXplX3QKK2xpbnZmc19zZW5kZmlsZSgKKwlzdHJ1Y3QgZmlsZQkJKmZpbHAsCisJbG9mZl90CQkJKnBwb3MsCisJc2l6ZV90CQkJY291bnQsCisJcmVhZF9hY3Rvcl90CQlhY3RvciwKKwl2b2lkCQkJKnRhcmdldCkKK3sKKwl2bm9kZV90CQkJKnZwID0gTElOVkZTX0dFVF9WUChmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJc3NpemVfdAkJCXJ2YWw7CisKKwlWT1BfU0VOREZJTEUodnAsIGZpbHAsIHBwb3MsIDAsIGNvdW50LCBhY3RvciwgdGFyZ2V0LCBOVUxMLCBydmFsKTsKKwlyZXR1cm4gcnZhbDsKK30KKworCitTVEFUSUMgaW50CitsaW52ZnNfb3BlbigKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlLAorCXN0cnVjdCBmaWxlCSpmaWxwKQoreworCXZub2RlX3QJCSp2cCA9IExJTlZGU19HRVRfVlAoaW5vZGUpOworCWludAkJZXJyb3I7CisKKwlpZiAoIShmaWxwLT5mX2ZsYWdzICYgT19MQVJHRUZJTEUpICYmIGlfc2l6ZV9yZWFkKGlub2RlKSA+IE1BWF9OT05fTEZTKQorCQlyZXR1cm4gLUVGQklHOworCisJQVNTRVJUKHZwKTsKKwlWT1BfT1BFTih2cCwgTlVMTCwgZXJyb3IpOworCXJldHVybiAtZXJyb3I7Cit9CisKKworU1RBVElDIGludAorbGludmZzX3JlbGVhc2UoCisJc3RydWN0IGlub2RlCSppbm9kZSwKKwlzdHJ1Y3QgZmlsZQkqZmlscCkKK3sKKwl2bm9kZV90CQkqdnAgPSBMSU5WRlNfR0VUX1ZQKGlub2RlKTsKKwlpbnQJCWVycm9yID0gMDsKKworCWlmICh2cCkKKwkJVk9QX1JFTEVBU0UodnAsIGVycm9yKTsKKwlyZXR1cm4gLWVycm9yOworfQorCisKK1NUQVRJQyBpbnQKK2xpbnZmc19mc3luYygKKwlzdHJ1Y3QgZmlsZQkqZmlscCwKKwlzdHJ1Y3QgZGVudHJ5CSpkZW50cnksCisJaW50CQlkYXRhc3luYykKK3sKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXZub2RlX3QJCSp2cCA9IExJTlZGU19HRVRfVlAoaW5vZGUpOworCWludAkJZXJyb3I7CisJaW50CQlmbGFncyA9IEZTWU5DX1dBSVQ7CisKKwlpZiAoZGF0YXN5bmMpCisJCWZsYWdzIHw9IEZTWU5DX0RBVEE7CisKKwlBU1NFUlQodnApOworCVZPUF9GU1lOQyh2cCwgZmxhZ3MsIE5VTEwsICh4ZnNfb2ZmX3QpMCwgKHhmc19vZmZfdCktMSwgZXJyb3IpOworCXJldHVybiAtZXJyb3I7Cit9CisKKy8qCisgKiBsaW52ZnNfcmVhZGRpciBtYXBzIHRvIFZPUF9SRUFERElSKCkuCisgKiBXZSBuZWVkIHRvIGJ1aWxkIGEgdWlvLCBjcmVkLCAuLi4KKyAqLworCisjZGVmaW5lIG5leHRkcChkcCkgICAgICAoKHN0cnVjdCB4ZnNfZGlyZW50ICopKChjaGFyICopKGRwKSArIChkcCktPmRfcmVjbGVuKSkKKworU1RBVElDIGludAorbGludmZzX3JlYWRkaXIoCisJc3RydWN0IGZpbGUJKmZpbHAsCisJdm9pZAkJKmRpcmVudCwKKwlmaWxsZGlyX3QJZmlsbGRpcikKK3sKKwlpbnQJCWVycm9yID0gMDsKKwl2bm9kZV90CQkqdnA7CisJdWlvX3QJCXVpbzsKKwlpb3ZlY190CQlpb3Y7CisJaW50CQllb2YgPSAwOworCWNhZGRyX3QJCXJlYWRfYnVmOworCWludAkJbmFtZWxlbiwgc2l6ZSA9IDA7CisJc2l6ZV90CQlybGVuID0gUEFHRV9DQUNIRV9TSVpFOworCXhmc19vZmZfdAlzdGFydF9vZmZzZXQsIGN1cnJfb2Zmc2V0OworCXhmc19kaXJlbnRfdAkqZGJwID0gTlVMTDsKKworCXZwID0gTElOVkZTX0dFVF9WUChmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJQVNTRVJUKHZwKTsKKworCS8qIFRyeSBmYWlybHkgaGFyZCB0byBnZXQgbWVtb3J5ICovCisJZG8geworCQlpZiAoKHJlYWRfYnVmID0gKGNhZGRyX3Qpa21hbGxvYyhybGVuLCBHRlBfS0VSTkVMKSkpCisJCQlicmVhazsKKwkJcmxlbiA+Pj0gMTsKKwl9IHdoaWxlIChybGVuID49IDEwMjQpOworCisJaWYgKHJlYWRfYnVmID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJdWlvLnVpb19pb3YgPSAmaW92OworCXVpby51aW9fc2VnZmxnID0gVUlPX1NZU1NQQUNFOworCWN1cnJfb2Zmc2V0ID0gZmlscC0+Zl9wb3M7CisJaWYgKGZpbHAtPmZfcG9zICE9IDB4N2ZmZmZmZmYpCisJCXVpby51aW9fb2Zmc2V0ID0gZmlscC0+Zl9wb3M7CisJZWxzZQorCQl1aW8udWlvX29mZnNldCA9IDB4ZmZmZmZmZmY7CisKKwl3aGlsZSAoIWVvZikgeworCQl1aW8udWlvX3Jlc2lkID0gaW92Lmlvdl9sZW4gPSBybGVuOworCQlpb3YuaW92X2Jhc2UgPSByZWFkX2J1ZjsKKwkJdWlvLnVpb19pb3ZjbnQgPSAxOworCisJCXN0YXJ0X29mZnNldCA9IHVpby51aW9fb2Zmc2V0OworCisJCVZPUF9SRUFERElSKHZwLCAmdWlvLCBOVUxMLCAmZW9mLCBlcnJvcik7CisJCWlmICgodWlvLnVpb19vZmZzZXQgPT0gc3RhcnRfb2Zmc2V0KSB8fCBlcnJvcikgeworCQkJc2l6ZSA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCXNpemUgPSBybGVuIC0gdWlvLnVpb19yZXNpZDsKKwkJZGJwID0gKHhmc19kaXJlbnRfdCAqKXJlYWRfYnVmOworCQl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJCW5hbWVsZW4gPSBzdHJsZW4oZGJwLT5kX25hbWUpOworCisJCQlpZiAoZmlsbGRpcihkaXJlbnQsIGRicC0+ZF9uYW1lLCBuYW1lbGVuLAorCQkJCQkobG9mZl90KSBjdXJyX29mZnNldCAmIDB4N2ZmZmZmZmYsCisJCQkJCShpbm9fdCkgZGJwLT5kX2lubywKKwkJCQkJRFRfVU5LTk9XTikpIHsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisJCQlzaXplIC09IGRicC0+ZF9yZWNsZW47CisJCQljdXJyX29mZnNldCA9IChsb2ZmX3QpZGJwLT5kX29mZiAvKiAmIDB4N2ZmZmZmZmYgKi87CisJCQlkYnAgPSBuZXh0ZHAoZGJwKTsKKwkJfQorCX0KK2RvbmU6CisJaWYgKCFlcnJvcikgeworCQlpZiAoc2l6ZSA9PSAwKQorCQkJZmlscC0+Zl9wb3MgPSB1aW8udWlvX29mZnNldCAmIDB4N2ZmZmZmZmY7CisJCWVsc2UgaWYgKGRicCkKKwkJCWZpbHAtPmZfcG9zID0gY3Vycl9vZmZzZXQ7CisJfQorCisJa2ZyZWUocmVhZF9idWYpOworCXJldHVybiAtZXJyb3I7Cit9CisKKworU1RBVElDIGludAorbGludmZzX2ZpbGVfbW1hcCgKKwlzdHJ1Y3QgZmlsZQkqZmlscCwKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgaW5vZGUJKmlwID0gZmlscC0+Zl9kZW50cnktPmRfaW5vZGU7CisJdm5vZGVfdAkJKnZwID0gTElOVkZTX0dFVF9WUChpcCk7CisJdmF0dHJfdAkJdmEgPSB7IC52YV9tYXNrID0gWEZTX0FUX1VQREFUSU1FIH07CisJaW50CQllcnJvcjsKKworCWlmICh2cC0+dl92ZnNwLT52ZnNfZmxhZyAmIFZGU19ETUkpIHsKKwkJeGZzX21vdW50X3QJKm1wID0gWEZTX1ZGU1RPTSh2cC0+dl92ZnNwKTsKKworCQllcnJvciA9IC1YRlNfU0VORF9NTUFQKG1wLCB2bWEsIDApOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJfQorCisJdm1hLT52bV9vcHMgPSAmbGludmZzX2ZpbGVfdm1fb3BzOworCisJVk9QX1NFVEFUVFIodnAsICZ2YSwgWEZTX0FUX1VQREFUSU1FLCBOVUxMLCBlcnJvcik7CisJaWYgKCFlcnJvcikKKwkJdm5fcmV2YWxpZGF0ZSh2cCk7CS8qIHVwZGF0ZSBMaW51eCBpbm9kZSBmbGFncyAqLworCXJldHVybiAwOworfQorCisKK1NUQVRJQyBsb25nCitsaW52ZnNfaW9jdGwoCisJc3RydWN0IGZpbGUJKmZpbHAsCisJdW5zaWduZWQgaW50CWNtZCwKKwl1bnNpZ25lZCBsb25nCWFyZykKK3sKKwlpbnQJCWVycm9yOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwl2bm9kZV90CQkqdnAgPSBMSU5WRlNfR0VUX1ZQKGlub2RlKTsKKworCVZPUF9JT0NUTCh2cCwgaW5vZGUsIGZpbHAsIDAsIGNtZCwgKHZvaWQgX191c2VyICopYXJnLCBlcnJvcik7CisJVk1PRElGWSh2cCk7CisKKwkvKiBOT1RFOiAgc29tZSBvZiB0aGUgaW9jdGwncyByZXR1cm4gcG9zaXRpdmUgIydzIGFzIGEKKwkgKgkgIGJ5dGUgY291bnQgaW5kaWNhdGluZyBzdWNjZXNzLCBzdWNoIGFzCisJICoJICByZWFkbGlua19ieV9oYW5kbGUuICBTbyB3ZSBkb24ndCAic2lnbiBmbGlwIgorCSAqCSAgbGlrZSBtb3N0IG90aGVyIHJvdXRpbmVzLiAgVGhpcyBtZWFucyB0cnVlCisJICoJICBlcnJvcnMgbmVlZCB0byBiZSByZXR1cm5lZCBhcyBhIG5lZ2F0aXZlIHZhbHVlLgorCSAqLworCXJldHVybiBlcnJvcjsKK30KKworU1RBVElDIGxvbmcKK2xpbnZmc19pb2N0bF9pbnZpcygKKwlzdHJ1Y3QgZmlsZQkqZmlscCwKKwl1bnNpZ25lZCBpbnQJY21kLAorCXVuc2lnbmVkIGxvbmcJYXJnKQoreworCWludAkJZXJyb3I7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfZGVudHJ5LT5kX2lub2RlOworCXZub2RlX3QJCSp2cCA9IExJTlZGU19HRVRfVlAoaW5vZGUpOworCisJQVNTRVJUKHZwKTsKKwlWT1BfSU9DVEwodnAsIGlub2RlLCBmaWxwLCBJT19JTlZJUywgY21kLCAodm9pZCBfX3VzZXIgKilhcmcsIGVycm9yKTsKKwlWTU9ESUZZKHZwKTsKKworCS8qIE5PVEU6ICBzb21lIG9mIHRoZSBpb2N0bCdzIHJldHVybiBwb3NpdGl2ZSAjJ3MgYXMgYQorCSAqCSAgYnl0ZSBjb3VudCBpbmRpY2F0aW5nIHN1Y2Nlc3MsIHN1Y2ggYXMKKwkgKgkgIHJlYWRsaW5rX2J5X2hhbmRsZS4gIFNvIHdlIGRvbid0ICJzaWduIGZsaXAiCisJICoJICBsaWtlIG1vc3Qgb3RoZXIgcm91dGluZXMuICBUaGlzIG1lYW5zIHRydWUKKwkgKgkgIGVycm9ycyBuZWVkIHRvIGJlIHJldHVybmVkIGFzIGEgbmVnYXRpdmUgdmFsdWUuCisJICovCisJcmV0dXJuIGVycm9yOworfQorCisjaWZkZWYgSEFWRV9WTU9QX01QUk9URUNUCitTVEFUSUMgaW50CitsaW52ZnNfbXByb3RlY3QoCisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJdW5zaWduZWQgaW50CW5ld2ZsYWdzKQoreworCXZub2RlX3QJCSp2cCA9IExJTlZGU19HRVRfVlAodm1hLT52bV9maWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJaW50CQllcnJvciA9IDA7CisKKwlpZiAodnAtPnZfdmZzcC0+dmZzX2ZsYWcgJiBWRlNfRE1JKSB7CisJCWlmICgodm1hLT52bV9mbGFncyAmIFZNX01BWVNIQVJFKSAmJgorCQkgICAgKG5ld2ZsYWdzICYgVk1fV1JJVEUpICYmICEodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSkgeworCQkJeGZzX21vdW50X3QJKm1wID0gWEZTX1ZGU1RPTSh2cC0+dl92ZnNwKTsKKworCQkJZXJyb3IgPSBYRlNfU0VORF9NTUFQKG1wLCB2bWEsIFZNX1dSSVRFKTsKKwkJICAgIH0KKwl9CisJcmV0dXJuIGVycm9yOworfQorI2VuZGlmIC8qIEhBVkVfVk1PUF9NUFJPVEVDVCAqLworCisjaWZkZWYgSEFWRV9GT1BfT1BFTl9FWEVDCisvKiBJZiB0aGUgdXNlciBpcyBhdHRlbXB0aW5nIHRvIGV4ZWN1dGUgYSBmaWxlIHRoYXQgaXMgb2ZmbGluZSB0aGVuCisgKiB3ZSBoYXZlIHRvIHRyaWdnZXIgYSBETUFQSSBSRUFEIGV2ZW50IGJlZm9yZSB0aGUgZmlsZSBpcyBtYXJrZWQgYXMgYnVzeQorICogb3RoZXJ3aXNlIHRoZSBpbnZpc2libGUgSS9PIHdpbGwgbm90IGJlIGFibGUgdG8gd3JpdGUgdG8gdGhlIGZpbGUgdG8gYnJpbmcKKyAqIGl0IGJhY2sgb25saW5lLgorICovCitTVEFUSUMgaW50CitsaW52ZnNfb3Blbl9leGVjKAorCXN0cnVjdCBpbm9kZQkqaW5vZGUpCit7CisJdm5vZGVfdAkJKnZwID0gTElOVkZTX0dFVF9WUChpbm9kZSk7CisJeGZzX21vdW50X3QJKm1wID0gWEZTX1ZGU1RPTSh2cC0+dl92ZnNwKTsKKwlpbnQJCWVycm9yID0gMDsKKwliaHZfZGVzY190CSpiZHA7CisJeGZzX2lub2RlX3QJKmlwOworCisJaWYgKHZwLT52X3Zmc3AtPnZmc19mbGFnICYgVkZTX0RNSSkgeworCQliZHAgPSB2bl9iaHZfbG9va3VwKFZOX0JIVl9IRUFEKHZwKSwgJnhmc192bm9kZW9wcyk7CisJCWlmICghYmRwKSB7CisJCQllcnJvciA9IC1FSU5WQUw7CisJCQlnb3RvIG9wZW5fZXhlY19vdXQ7CisJCX0KKwkJaXAgPSBYRlNfQkhWVE9JKGJkcCk7CisJCWlmIChETV9FVkVOVF9FTkFCTEVEKHZwLT52X3Zmc3AsIGlwLCBETV9FVkVOVF9SRUFEKSkgeworCQkJZXJyb3IgPSAtWEZTX1NFTkRfREFUQShtcCwgRE1fRVZFTlRfUkVBRCwgdnAsCisJCQkJCSAgICAgICAwLCAwLCAwLCBOVUxMKTsKKwkJfQorCX0KK29wZW5fZXhlY19vdXQ6CisJcmV0dXJuIGVycm9yOworfQorI2VuZGlmIC8qIEhBVkVfRk9QX09QRU5fRVhFQyAqLworCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxpbnZmc19maWxlX29wZXJhdGlvbnMgPSB7CisJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAorCS5yZWFkCQk9IGRvX3N5bmNfcmVhZCwKKwkud3JpdGUJCT0gZG9fc3luY193cml0ZSwKKwkucmVhZHYJCT0gbGludmZzX3JlYWR2LAorCS53cml0ZXYJCT0gbGludmZzX3dyaXRldiwKKwkuYWlvX3JlYWQJPSBsaW52ZnNfYWlvX3JlYWQsCisJLmFpb193cml0ZQk9IGxpbnZmc19haW9fd3JpdGUsCisJLnNlbmRmaWxlCT0gbGludmZzX3NlbmRmaWxlLAorCS51bmxvY2tlZF9pb2N0bAk9IGxpbnZmc19pb2N0bCwKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bCAgID0geGZzX2NvbXBhdF9pb2N0bCwKKyNlbmRpZgorCS5tbWFwCQk9IGxpbnZmc19maWxlX21tYXAsCisJLm9wZW4JCT0gbGludmZzX29wZW4sCisJLnJlbGVhc2UJPSBsaW52ZnNfcmVsZWFzZSwKKwkuZnN5bmMJCT0gbGludmZzX2ZzeW5jLAorI2lmZGVmIEhBVkVfRk9QX09QRU5fRVhFQworCS5vcGVuX2V4ZWMJPSBsaW52ZnNfb3Blbl9leGVjLAorI2VuZGlmCit9OworCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxpbnZmc19pbnZpc19maWxlX29wZXJhdGlvbnMgPSB7CisJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAorCS5yZWFkCQk9IGRvX3N5bmNfcmVhZCwKKwkud3JpdGUJCT0gZG9fc3luY193cml0ZSwKKwkucmVhZHYJCT0gbGludmZzX3JlYWR2X2ludmlzLAorCS53cml0ZXYJCT0gbGludmZzX3dyaXRldl9pbnZpcywKKwkuYWlvX3JlYWQJPSBsaW52ZnNfYWlvX3JlYWRfaW52aXMsCisJLmFpb193cml0ZQk9IGxpbnZmc19haW9fd3JpdGVfaW52aXMsCisJLnNlbmRmaWxlCT0gbGludmZzX3NlbmRmaWxlLAorCS51bmxvY2tlZF9pb2N0bAk9IGxpbnZmc19pb2N0bF9pbnZpcywKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisJLmNvbXBhdF9pb2N0bCAgID0geGZzX2NvbXBhdF9pbnZpc19pb2N0bCwKKyNlbmRpZgorCS5tbWFwCQk9IGxpbnZmc19maWxlX21tYXAsCisJLm9wZW4JCT0gbGludmZzX29wZW4sCisJLnJlbGVhc2UJPSBsaW52ZnNfcmVsZWFzZSwKKwkuZnN5bmMJCT0gbGludmZzX2ZzeW5jLAorfTsKKworCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxpbnZmc19kaXJfb3BlcmF0aW9ucyA9IHsKKwkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAorCS5yZWFkZGlyCT0gbGludmZzX3JlYWRkaXIsCisJLnVubG9ja2VkX2lvY3RsCT0gbGludmZzX2lvY3RsLAorCS5mc3luYwkJPSBsaW52ZnNfZnN5bmMsCit9OworCitzdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGxpbnZmc19maWxlX3ZtX29wcyA9IHsKKwkubm9wYWdlCQk9IGZpbGVtYXBfbm9wYWdlLAorCS5wb3B1bGF0ZQk9IGZpbGVtYXBfcG9wdWxhdGUsCisjaWZkZWYgSEFWRV9WTU9QX01QUk9URUNUCisJLm1wcm90ZWN0CT0gbGludmZzX21wcm90ZWN0LAorI2VuZGlmCit9OwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfZnNfc3Vici5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZnNfc3Vici5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZWJkMzAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19mc19zdWJyLmMKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKworLyoKKyAqIFN0dWIgZm9yIG5vLW9wIHZub2RlIG9wZXJhdGlvbnMgdGhhdCByZXR1cm4gZXJyb3Igc3RhdHVzLgorICovCitpbnQKK2ZzX25vZXJyKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBPcGVyYXRpb24gdW5zdXBwb3J0ZWQgdW5kZXIgdGhpcyBmaWxlIHN5c3RlbS4KKyAqLworaW50Citmc19ub3N5cyh2b2lkKQoreworCXJldHVybiBFTk9TWVM7Cit9CisKKy8qCisgKiBTdHViIGZvciBpbmFjdGl2ZSwgc3RyYXRlZ3ksIGFuZCByZWFkL3dyaXRlIGxvY2svdW5sb2NrLiAgRG9lcyBub3RoaW5nLgorICovCisvKiBBUkdTVVNFRCAqLwordm9pZAorZnNfbm92YWwodm9pZCkKK3sKK30KKworLyoKKyAqIHZub2RlIHBjYWNoZSBsYXllciBmb3Igdm5vZGVfdG9zc3BhZ2VzLgorICogJ2xhc3QnIHBhcmFtZXRlciB1bnVzZWQgYnV0IGxlZnQgaW4gZm9yIElSSVggY29tcGF0aWJpbGl0eQorICovCit2b2lkCitmc190b3NzcGFnZXMoCisJYmh2X2Rlc2NfdAkqYmRwLAorCXhmc19vZmZfdAlmaXJzdCwKKwl4ZnNfb2ZmX3QJbGFzdCwKKwlpbnQJCWZpb3B0KQoreworCXZub2RlX3QJCSp2cCA9IEJIVl9UT19WTk9ERShiZHApOworCXN0cnVjdCBpbm9kZQkqaXAgPSBMSU5WRlNfR0VUX0lQKHZwKTsKKworCWlmIChWTl9DQUNIRUQodnApKQorCQl0cnVuY2F0ZV9pbm9kZV9wYWdlcyhpcC0+aV9tYXBwaW5nLCBmaXJzdCk7Cit9CisKKworLyoKKyAqIHZub2RlIHBjYWNoZSBsYXllciBmb3Igdm5vZGVfZmx1c2hpbnZhbF9wYWdlcy4KKyAqICdsYXN0JyBwYXJhbWV0ZXIgdW51c2VkIGJ1dCBsZWZ0IGluIGZvciBJUklYIGNvbXBhdGliaWxpdHkKKyAqLwordm9pZAorZnNfZmx1c2hpbnZhbF9wYWdlcygKKwliaHZfZGVzY190CSpiZHAsCisJeGZzX29mZl90CWZpcnN0LAorCXhmc19vZmZfdAlsYXN0LAorCWludAkJZmlvcHQpCit7CisJdm5vZGVfdAkJKnZwID0gQkhWX1RPX1ZOT0RFKGJkcCk7CisJc3RydWN0IGlub2RlCSppcCA9IExJTlZGU19HRVRfSVAodnApOworCisJaWYgKFZOX0NBQ0hFRCh2cCkpIHsKKwkJZmlsZW1hcF9mZGF0YXdyaXRlKGlwLT5pX21hcHBpbmcpOworCQlmaWxlbWFwX2ZkYXRhd2FpdChpcC0+aV9tYXBwaW5nKTsKKworCQl0cnVuY2F0ZV9pbm9kZV9wYWdlcyhpcC0+aV9tYXBwaW5nLCBmaXJzdCk7CisJfQorfQorCisvKgorICogdm5vZGUgcGNhY2hlIGxheWVyIGZvciB2bm9kZV9mbHVzaF9wYWdlcy4KKyAqICdsYXN0JyBwYXJhbWV0ZXIgdW51c2VkIGJ1dCBsZWZ0IGluIGZvciBJUklYIGNvbXBhdGliaWxpdHkKKyAqLworaW50Citmc19mbHVzaF9wYWdlcygKKwliaHZfZGVzY190CSpiZHAsCisJeGZzX29mZl90CWZpcnN0LAorCXhmc19vZmZfdAlsYXN0LAorCXVpbnQ2NF90CWZsYWdzLAorCWludAkJZmlvcHQpCit7CisJdm5vZGVfdAkJKnZwID0gQkhWX1RPX1ZOT0RFKGJkcCk7CisJc3RydWN0IGlub2RlCSppcCA9IExJTlZGU19HRVRfSVAodnApOworCisJaWYgKFZOX0NBQ0hFRCh2cCkpIHsKKwkJZmlsZW1hcF9mZGF0YXdyaXRlKGlwLT5pX21hcHBpbmcpOworCQlmaWxlbWFwX2ZkYXRhd2FpdChpcC0+aV9tYXBwaW5nKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZzX3N1YnIuaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2ZzX3N1YnIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGI5ZGRiCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZnNfc3Vici5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDIgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZglfX1hGU19TVUJSX0hfXworI2RlZmluZSBfX1hGU19TVUJSX0hfXworCisvKgorICogVXRpbGl0aWVzIHNoYXJlZCBhbW9uZyBmaWxlIHN5c3RlbSBpbXBsZW1lbnRhdGlvbnMuCisgKi8KKworc3RydWN0IGNyZWQ7CisKK2V4dGVybiBpbnQJZnNfbm9lcnIodm9pZCk7CitleHRlcm4gaW50CWZzX25vc3lzKHZvaWQpOworZXh0ZXJuIHZvaWQJZnNfbm92YWwodm9pZCk7CitleHRlcm4gdm9pZAlmc190b3NzcGFnZXMoYmh2X2Rlc2NfdCAqLCB4ZnNfb2ZmX3QsIHhmc19vZmZfdCwgaW50KTsKK2V4dGVybiB2b2lkCWZzX2ZsdXNoaW52YWxfcGFnZXMoYmh2X2Rlc2NfdCAqLCB4ZnNfb2ZmX3QsIHhmc19vZmZfdCwgaW50KTsKK2V4dGVybiBpbnQJZnNfZmx1c2hfcGFnZXMoYmh2X2Rlc2NfdCAqLCB4ZnNfb2ZmX3QsIHhmc19vZmZfdCwgdWludDY0X3QsIGludCk7CisKKyNlbmRpZgkvKiBfX1hGU19GU19TVUJSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfZ2xvYmFscy5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZ2xvYmFscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZGE1YjQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19nbG9iYWxzLmMKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBnbG9iYWxzIG5lZWRlZCBieSBYRlMgdGhhdCB3ZXJlIG5vcm1hbGx5IGRlZmluZWQKKyAqIHNvbWV3aGVyZSBlbHNlIGluIElSSVguCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorI2luY2x1ZGUgInhmc19jcmVkLmgiCisjaW5jbHVkZSAieGZzX3N5c2N0bC5oIgorCisvKgorICogU3lzdGVtIG1lbW9yeSBzaXplIC0gdXNlZCB0byBzY2FsZSBjZXJ0YWluIGRhdGEgc3RydWN0dXJlcyBpbiBYRlMuCisgKi8KK3Vuc2lnbmVkIGxvbmcgeGZzX3BoeXNtZW07CisKKy8qCisgKiBUdW5hYmxlIFhGUyBwYXJhbWV0ZXJzLiAgeGZzX3BhcmFtcyBpcyByZXF1aXJlZCBldmVuIHdoZW4gQ09ORklHX1NZU0NUTD1uLAorICogb3RoZXIgWEZTIGNvZGUgdXNlcyB0aGVzZSB2YWx1ZXMuICBUaW1lcyBhcmUgbWVhc3VyZWQgaW4gY2VudGlzZWNzIChpLmUuCisgKiAxMDB0aHMgb2YgYSBzZWNvbmQpLgorICovCit4ZnNfcGFyYW1fdCB4ZnNfcGFyYW1zID0geworCQkJICAvKglNSU4JCURGTFQJCU1BWAkqLworCS5yZXN0cmljdF9jaG93bgk9IHsJMCwJCTEsCQkxCX0sCisJLnNnaWRfaW5oZXJpdAk9IHsJMCwJCTAsCQkxCX0sCisJLnN5bWxpbmtfbW9kZQk9IHsJMCwJCTAsCQkxCX0sCisJLnBhbmljX21hc2sJPSB7CTAsCQkwLAkJMTI3CX0sCisJLmVycm9yX2xldmVsCT0gewkwLAkJMywJCTExCX0sCisJLnN5bmNkX3RpbWVyCT0gewkxKjEwMCwJCTMwKjEwMCwJCTcyMDAqMTAwfSwKKwkuc3RhdHNfY2xlYXIJPSB7CTAsCQkwLAkJMQl9LAorCS5pbmhlcml0X3N5bmMJPSB7CTAsCQkxLAkJMQl9LAorCS5pbmhlcml0X25vZHVtcAk9IHsJMCwJCTEsCQkxCX0sCisJLmluaGVyaXRfbm9hdGltID0gewkwLAkJMSwJCTEJfSwKKwkueGZzX2J1Zl90aW1lcgk9IHsJMTAwLzIsCQkxKjEwMCwJCTMwKjEwMAl9LAorCS54ZnNfYnVmX2FnZQk9IHsJMSoxMDAsCQkxNSoxMDAsCQk3MjAwKjEwMH0sCisJLmluaGVyaXRfbm9zeW0JPSB7CTAsCQkwLAkJMQl9LAorCS5yb3RvcnN0ZXAJPSB7CTEsCQkxLAkJMjU1CX0sCit9OworCisvKgorICogR2xvYmFsIHN5c3RlbSBjcmVkZW50aWFsIHN0cnVjdHVyZS4KKyAqLworY3JlZF90IHN5c19jcmVkX3ZhbCwgKnN5c19jcmVkID0gJnN5c19jcmVkX3ZhbDsKKwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfZ2xvYmFscy5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfZ2xvYmFscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MWUyZjMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19nbG9iYWxzLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfR0xPQkFMU19IX18KKyNkZWZpbmUgX19YRlNfR0xPQkFMU19IX18KKworLyoKKyAqIFRoaXMgZmlsZSBkZWNsYXJlcyBnbG9iYWxzIG5lZWRlZCBieSBYRlMgdGhhdCB3ZXJlIG5vcm1hbGx5IGRlZmluZWQKKyAqIHNvbWV3aGVyZSBlbHNlIGluIElSSVguCisgKi8KKworZXh0ZXJuIHVpbnQ2NF90CXhmc19wYW5pY19tYXNrOwkJLyogc2V0IHRvIGNhdXNlIG1vcmUgcGFuaWNzICovCitleHRlcm4gdW5zaWduZWQgbG9uZyB4ZnNfcGh5c21lbTsKK2V4dGVybiBzdHJ1Y3QgY3JlZCAqc3lzX2NyZWQ7CisKKyNlbmRpZgkvKiBfX1hGU19HTE9CQUxTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk4MDllZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsLmMKQEAgLTAsMCArMSwxMzM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisKKyNpbmNsdWRlICJ4ZnNfZnMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2JtYXAuaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCisjaW5jbHVkZSAieGZzX3J0YWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKKyNpbmNsdWRlICJ4ZnNfaXRhYmxlLmgiCisjaW5jbHVkZSAieGZzX3J3LmgiCisjaW5jbHVkZSAieGZzX2FjbC5oIgorI2luY2x1ZGUgInhmc19jYXAuaCIKKyNpbmNsdWRlICJ4ZnNfbWFjLmgiCisjaW5jbHVkZSAieGZzX2F0dHIuaCIKKyNpbmNsdWRlICJ4ZnNfYnVmX2l0ZW0uaCIKKyNpbmNsdWRlICJ4ZnNfdXRpbHMuaCIKKyNpbmNsdWRlICJ4ZnNfZGZyYWcuaCIKKyNpbmNsdWRlICJ4ZnNfZnNvcHMuaCIKKworI2luY2x1ZGUgPGxpbnV4L2RjYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisKKy8qCisgKiB4ZnNfZmluZF9oYW5kbGUgbWFwcyBmcm9tIHVzZXJzcGFjZSB4ZnNfZnNvcF9oYW5kbGVyZXEgc3RydWN0dXJlIHRvCisgKiBhIGZpbGUgb3IgZnMgaGFuZGxlLgorICoKKyAqIFhGU19JT0NfUEFUSF9UT19GU0hBTkRMRQorICogICAgcmV0dXJucyBmcyBoYW5kbGUgZm9yIGEgbW91bnQgcG9pbnQgb3IgcGF0aCB3aXRoaW4gdGhhdCBtb3VudCBwb2ludAorICogWEZTX0lPQ19GRF9UT19IQU5ETEUKKyAqICAgIHJldHVybnMgZnVsbCBoYW5kbGUgZm9yIGEgRkQgb3BlbmVkIGluIHVzZXIgc3BhY2UKKyAqIFhGU19JT0NfUEFUSF9UT19IQU5ETEUKKyAqICAgIHJldHVybnMgZnVsbCBoYW5kbGUgZm9yIGEgcGF0aAorICovCitTVEFUSUMgaW50Cit4ZnNfZmluZF9oYW5kbGUoCisJdW5zaWduZWQgaW50CQljbWQsCisJdm9pZAkJCV9fdXNlciAqYXJnKQoreworCWludAkJCWhzaXplOworCXhmc19oYW5kbGVfdAkJaGFuZGxlOworCXhmc19mc29wX2hhbmRsZXJlcV90CWhyZXE7CisJc3RydWN0IGlub2RlCQkqaW5vZGU7CisJc3RydWN0IHZub2RlCQkqdnA7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmhyZXEsIGFyZywgc2l6ZW9mKGhyZXEpKSkKKwkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKKworCW1lbXNldCgoY2hhciAqKSZoYW5kbGUsIDAsIHNpemVvZihoYW5kbGUpKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBYRlNfSU9DX1BBVEhfVE9fRlNIQU5ETEU6CisJY2FzZSBYRlNfSU9DX1BBVEhfVE9fSEFORExFOiB7CisJCXN0cnVjdCBuYW1laWRhdGEJbmQ7CisJCWludAkJCWVycm9yOworCisJCWVycm9yID0gdXNlcl9wYXRoX3dhbGtfbGluaygoY29uc3QgY2hhciBfX3VzZXIgKilocmVxLnBhdGgsICZuZCk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKworCQlBU1NFUlQobmQuZGVudHJ5KTsKKwkJQVNTRVJUKG5kLmRlbnRyeS0+ZF9pbm9kZSk7CisJCWlub2RlID0gaWdyYWIobmQuZGVudHJ5LT5kX2lub2RlKTsKKwkJcGF0aF9yZWxlYXNlKCZuZCk7CisJCWJyZWFrOworCX0KKworCWNhc2UgWEZTX0lPQ19GRF9UT19IQU5ETEU6IHsKKwkJc3RydWN0IGZpbGUJKmZpbGU7CisKKwkJZmlsZSA9IGZnZXQoaHJlcS5mZCk7CisJCWlmICghZmlsZSkKKwkJICAgIHJldHVybiAtRUJBREY7CisKKwkJQVNTRVJUKGZpbGUtPmZfZGVudHJ5KTsKKwkJQVNTRVJUKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwkJaW5vZGUgPSBpZ3JhYihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJCWZwdXQoZmlsZSk7CisJCWJyZWFrOworCX0KKworCWRlZmF1bHQ6CisJCUFTU0VSVCgwKTsKKwkJcmV0dXJuIC1YRlNfRVJST1IoRUlOVkFMKTsKKwl9CisKKwlpZiAoaW5vZGUtPmlfc2ItPnNfbWFnaWMgIT0gWEZTX1NCX01BR0lDKSB7CisJCS8qIHdlJ3JlIG5vdCBpbiBYRlMgYW55bW9yZSwgVG90byAqLworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIC1YRlNfRVJST1IoRUlOVkFMKTsKKwl9CisKKwkvKiB3ZSBuZWVkIHRoZSB2bm9kZSAqLworCXZwID0gTElOVkZTX0dFVF9WUChpbm9kZSk7CisJaWYgKHZwLT52X3R5cGUgIT0gVlJFRyAmJiB2cC0+dl90eXBlICE9IFZESVIgJiYgdnAtPnZfdHlwZSAhPSBWTE5LKSB7CisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gLVhGU19FUlJPUihFQkFERik7CisJfQorCisJLyogbm93IHdlIGNhbiBncmFiIHRoZSBmc2lkICovCisJbWVtY3B5KCZoYW5kbGUuaGFfZnNpZCwgdnAtPnZfdmZzcC0+dmZzX2FsdGZzaWQsIHNpemVvZih4ZnNfZnNpZF90KSk7CisJaHNpemUgPSBzaXplb2YoeGZzX2ZzaWRfdCk7CisKKwlpZiAoY21kICE9IFhGU19JT0NfUEFUSF9UT19GU0hBTkRMRSkgeworCQl4ZnNfaW5vZGVfdAkqaXA7CisJCWJodl9kZXNjX3QJKmJodjsKKwkJaW50CQlsb2NrX21vZGU7CisKKwkJLyogbmVlZCB0byBnZXQgYWNjZXNzIHRvIHRoZSB4ZnNfaW5vZGUgdG8gcmVhZCB0aGUgZ2VuZXJhdGlvbiAqLworCQliaHYgPSB2bl9iaHZfbG9va3VwX3VubG9ja2VkKFZOX0JIVl9IRUFEKHZwKSwgJnhmc192bm9kZW9wcyk7CisJCUFTU0VSVChiaHYpOworCQlpcCA9IFhGU19CSFZUT0koYmh2KTsKKwkJQVNTRVJUKGlwKTsKKwkJbG9ja19tb2RlID0geGZzX2lsb2NrX21hcF9zaGFyZWQoaXApOworCisJCS8qIGZpbGwgaW4gZmlkIHNlY3Rpb24gb2YgaGFuZGxlIGZyb20gaW5vZGUgKi8KKwkJaGFuZGxlLmhhX2ZpZC54ZnNfZmlkX2xlbiA9IHNpemVvZih4ZnNfZmlkX3QpIC0KKwkJCQkJICAgIHNpemVvZihoYW5kbGUuaGFfZmlkLnhmc19maWRfbGVuKTsKKwkJaGFuZGxlLmhhX2ZpZC54ZnNfZmlkX3BhZCA9IDA7CisJCWhhbmRsZS5oYV9maWQueGZzX2ZpZF9nZW4gPSBpcC0+aV9kLmRpX2dlbjsKKwkJaGFuZGxlLmhhX2ZpZC54ZnNfZmlkX2lubyA9IGlwLT5pX2lubzsKKworCQl4ZnNfaXVubG9ja19tYXBfc2hhcmVkKGlwLCBsb2NrX21vZGUpOworCisJCWhzaXplID0gWEZTX0hTSVpFKGhhbmRsZSk7CisJfQorCisJLyogbm93IGNvcHkgb3VyIGhhbmRsZSBpbnRvIHRoZSB1c2VyIGJ1ZmZlciAmIHdyaXRlIG91dCB0aGUgc2l6ZSAqLworCWlmIChjb3B5X3RvX3VzZXIoaHJlcS5vaGFuZGxlLCAmaGFuZGxlLCBoc2l6ZSkgfHwKKwkgICAgY29weV90b191c2VyKGhyZXEub2hhbmRsZW4sICZoc2l6ZSwgc2l6ZW9mKF9fczMyKSkpIHsKKwkJaXB1dChpbm9kZSk7CisJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CisJfQorCisJaXB1dChpbm9kZSk7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIENvbnZlcnQgdXNlcnNwYWNlIGhhbmRsZSBkYXRhIGludG8gdm5vZGUgKGFuZCBpbm9kZSkuCisgKiBXZSBbYWJddXNlIHRoZSBmYWN0IHRoYXQgYWxsIHRoZSBmc29wX2hhbmRsZXJlcSBpb2N0bCBjYWxscworICogaGF2ZSBhIGRhdGEgc3RydWN0dXJlIGFyZ3VtZW50IHdob3NlIGZpcnN0IGNvbXBvbmVudCBpcyBhbHdheXMKKyAqIGEgeGZzX2Zzb3BfaGFuZGxlcmVxX3QsIHNvIHdlIGNhbiBjYXN0IHRvIGFuZCBmcm9tIHRoaXMgdHlwZS4KKyAqIFRoaXMgYWxsb3dzIHVzIHRvIG9wdGltaXNlIHRoZSBjb3B5X2Zyb21fdXNlciBjYWxscyBhbmQgZ2l2ZXMKKyAqIGEgaGFuZHksIHNoYXJlZCByb3V0aW5lLgorICoKKyAqIElmIG5vIGVycm9yLCBjYWxsZXIgbXVzdCBhbHdheXMgVk5fUkVMRSB0aGUgcmV0dXJuZWQgdnAuCisgKi8KK1NUQVRJQyBpbnQKK3hmc192Z2V0X2Zzb3BfaGFuZGxlcmVxKAorCXhmc19tb3VudF90CQkqbXAsCisJc3RydWN0IGlub2RlCQkqcGFyaW5vZGUsCS8qIHBhcmVudCBpbm9kZSBwb2ludGVyICAgICovCisJeGZzX2Zzb3BfaGFuZGxlcmVxX3QJKmhyZXEsCisJdm5vZGVfdAkJCSoqdnAsCisJc3RydWN0IGlub2RlCQkqKmlub2RlKQoreworCXZvaWQJCQlfX3VzZXIgKmhhbnA7CisJc2l6ZV90CQkJaGxlbjsKKwl4ZnNfZmlkX3QJCSp4ZmlkOworCXhmc19oYW5kbGVfdAkJKmhhbmRsZXA7CisJeGZzX2hhbmRsZV90CQloYW5kbGU7CisJeGZzX2lub2RlX3QJCSppcDsKKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZXA7CisJdm5vZGVfdAkJCSp2cHA7CisJeGZzX2lub190CQlpbm87CisJX191MzIJCQlpZ2VuOworCWludAkJCWVycm9yOworCisJLyoKKwkgKiBPbmx5IGFsbG93IGhhbmRsZSBvcGVucyB1bmRlciBhIGRpcmVjdG9yeS4KKwkgKi8KKwlpZiAoIVNfSVNESVIocGFyaW5vZGUtPmlfbW9kZSkpCisJCXJldHVybiBYRlNfRVJST1IoRU5PVERJUik7CisKKwloYW5wID0gaHJlcS0+aWhhbmRsZTsKKwlobGVuID0gaHJlcS0+aWhhbmRsZW47CisJaGFuZGxlcCA9ICZoYW5kbGU7CisKKwlpZiAoaGxlbiA8IHNpemVvZihoYW5kbGVwLT5oYV9mc2lkKSB8fCBobGVuID4gc2l6ZW9mKCpoYW5kbGVwKSkKKwkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCWlmIChjb3B5X2Zyb21fdXNlcihoYW5kbGVwLCBoYW5wLCBobGVuKSkKKwkJcmV0dXJuIFhGU19FUlJPUihFRkFVTFQpOworCWlmIChobGVuIDwgc2l6ZW9mKCpoYW5kbGVwKSkKKwkJbWVtc2V0KCgoY2hhciAqKWhhbmRsZXApICsgaGxlbiwgMCwgc2l6ZW9mKCpoYW5kbGVwKSAtIGhsZW4pOworCWlmIChobGVuID4gc2l6ZW9mKGhhbmRsZXAtPmhhX2ZzaWQpKSB7CisJCWlmIChoYW5kbGVwLT5oYV9maWQueGZzX2ZpZF9sZW4gIT0KKwkJCQkoaGxlbiAtIHNpemVvZihoYW5kbGVwLT5oYV9mc2lkKQorCQkJCQktIHNpemVvZihoYW5kbGVwLT5oYV9maWQueGZzX2ZpZF9sZW4pKQorCQkgICAgfHwgaGFuZGxlcC0+aGFfZmlkLnhmc19maWRfcGFkKQorCQkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCX0KKworCS8qCisJICogQ3JhY2sgdGhlIGhhbmRsZSwgb2J0YWluIHRoZSBpbm9kZSAjICYgZ2VuZXJhdGlvbiAjCisJICovCisJeGZpZCA9IChzdHJ1Y3QgeGZzX2ZpZCAqKSZoYW5kbGVwLT5oYV9maWQ7CisJaWYgKHhmaWQtPnhmc19maWRfbGVuID09IHNpemVvZigqeGZpZCkgLSBzaXplb2YoeGZpZC0+eGZzX2ZpZF9sZW4pKSB7CisJCWlubyAgPSB4ZmlkLT54ZnNfZmlkX2lubzsKKwkJaWdlbiA9IHhmaWQtPnhmc19maWRfZ2VuOworCX0gZWxzZSB7CisJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKwl9CisKKwkvKgorCSAqIEdldCB0aGUgWEZTIGlub2RlLCBidWlsZGluZyBhIHZub2RlIHRvIGdvIHdpdGggaXQuCisJICovCisJZXJyb3IgPSB4ZnNfaWdldChtcCwgTlVMTCwgaW5vLCAwLCBYRlNfSUxPQ0tfU0hBUkVELCAmaXAsIDApOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCWlmIChpcCA9PSBOVUxMKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJaWYgKGlwLT5pX2QuZGlfbW9kZSA9PSAwIHx8IGlwLT5pX2QuZGlfZ2VuICE9IGlnZW4pIHsKKwkJeGZzX2lwdXRfbmV3KGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFTk9FTlQpOworCX0KKworCXZwcCA9IFhGU19JVE9WKGlwKTsKKwlpbm9kZXAgPSBMSU5WRlNfR0VUX0lQKHZwcCk7CisJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOworCisJKnZwID0gdnBwOworCSppbm9kZSA9IGlub2RlcDsKKwlyZXR1cm4gMDsKK30KKworU1RBVElDIGludAoreGZzX29wZW5fYnlfaGFuZGxlKAorCXhmc19tb3VudF90CQkqbXAsCisJdm9pZAkJCV9fdXNlciAqYXJnLAorCXN0cnVjdCBmaWxlCQkqcGFyZmlscCwKKwlzdHJ1Y3QgaW5vZGUJCSpwYXJpbm9kZSkKK3sKKwlpbnQJCQllcnJvcjsKKwlpbnQJCQluZXdfZmQ7CisJaW50CQkJcGVybWZsYWc7CisJc3RydWN0IGZpbGUJCSpmaWxwOworCXN0cnVjdCBpbm9kZQkJKmlub2RlOworCXN0cnVjdCBkZW50cnkJCSpkZW50cnk7CisJdm5vZGVfdAkJCSp2cDsKKwl4ZnNfZnNvcF9oYW5kbGVyZXFfdAlocmVxOworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLVhGU19FUlJPUihFUEVSTSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZocmVxLCBhcmcsIHNpemVvZih4ZnNfZnNvcF9oYW5kbGVyZXFfdCkpKQorCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCisJZXJyb3IgPSB4ZnNfdmdldF9mc29wX2hhbmRsZXJlcShtcCwgcGFyaW5vZGUsICZocmVxLCAmdnAsICZpbm9kZSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gLWVycm9yOworCisJLyogUmVzdHJpY3QgeGZzX29wZW5fYnlfaGFuZGxlIHRvIGRpcmVjdG9yaWVzICYgcmVndWxhciBmaWxlcy4gKi8KKwlpZiAoIShTX0lTUkVHKGlub2RlLT5pX21vZGUpIHx8IFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpKSB7CisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gLVhGU19FUlJPUihFSU5WQUwpOworCX0KKworI2lmIEJJVFNfUEVSX0xPTkcgIT0gMzIKKwlocmVxLm9mbGFncyB8PSBPX0xBUkdFRklMRTsKKyNlbmRpZgorCS8qIFB1dCBvcGVuIHBlcm1pc3Npb24gaW4gbmFtZWkgZm9ybWF0LiAqLworCXBlcm1mbGFnID0gaHJlcS5vZmxhZ3M7CisJaWYgKChwZXJtZmxhZysxKSAmIE9fQUNDTU9ERSkKKwkJcGVybWZsYWcrKzsKKwlpZiAocGVybWZsYWcgJiBPX1RSVU5DKQorCQlwZXJtZmxhZyB8PSAyOworCisJaWYgKCghKHBlcm1mbGFnICYgT19BUFBFTkQpIHx8IChwZXJtZmxhZyAmIE9fVFJVTkMpKSAmJgorCSAgICAocGVybWZsYWcgJiBGTU9ERV9XUklURSkgJiYgSVNfQVBQRU5EKGlub2RlKSkgeworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIC1YRlNfRVJST1IoRVBFUk0pOworCX0KKworCWlmICgocGVybWZsYWcgJiBGTU9ERV9XUklURSkgJiYgSVNfSU1NVVRBQkxFKGlub2RlKSkgeworCQlpcHV0KGlub2RlKTsKKwkJcmV0dXJuIC1YRlNfRVJST1IoRUFDQ0VTKTsKKwl9CisKKwkvKiBDYW4ndCB3cml0ZSBkaXJlY3Rvcmllcy4gKi8KKwlpZiAoIFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgKHBlcm1mbGFnICYgRk1PREVfV1JJVEUpKSB7CisJCWlwdXQoaW5vZGUpOworCQlyZXR1cm4gLVhGU19FUlJPUihFSVNESVIpOworCX0KKworCWlmICgobmV3X2ZkID0gZ2V0X3VudXNlZF9mZCgpKSA8IDApIHsKKwkJaXB1dChpbm9kZSk7CisJCXJldHVybiBuZXdfZmQ7CisJfQorCisJZGVudHJ5ID0gZF9hbGxvY19hbm9uKGlub2RlKTsKKwlpZiAoZGVudHJ5ID09IE5VTEwpIHsKKwkJaXB1dChpbm9kZSk7CisJCXB1dF91bnVzZWRfZmQobmV3X2ZkKTsKKwkJcmV0dXJuIC1YRlNfRVJST1IoRU5PTUVNKTsKKwl9CisKKwkvKiBFbnN1cmUgdW1vdW50IHJldHVybnMgRUJVU1kgb24gdW1vdW50cyB3aGlsZSB0aGlzIGZpbGUgaXMgb3Blbi4gKi8KKwltbnRnZXQocGFyZmlscC0+Zl92ZnNtbnQpOworCisJLyogQ3JlYXRlIGZpbGUgcG9pbnRlci4gKi8KKwlmaWxwID0gZGVudHJ5X29wZW4oZGVudHJ5LCBwYXJmaWxwLT5mX3Zmc21udCwgaHJlcS5vZmxhZ3MpOworCWlmIChJU19FUlIoZmlscCkpIHsKKwkJcHV0X3VudXNlZF9mZChuZXdfZmQpOworCQlyZXR1cm4gLVhGU19FUlJPUigtUFRSX0VSUihmaWxwKSk7CisJfQorCWlmIChpbm9kZS0+aV9tb2RlICYgU19JRlJFRykKKwkJZmlscC0+Zl9vcCA9ICZsaW52ZnNfaW52aXNfZmlsZV9vcGVyYXRpb25zOworCisJZmRfaW5zdGFsbChuZXdfZmQsIGZpbHApOworCXJldHVybiBuZXdfZmQ7Cit9CisKK1NUQVRJQyBpbnQKK3hmc19yZWFkbGlua19ieV9oYW5kbGUoCisJeGZzX21vdW50X3QJCSptcCwKKwl2b2lkCQkJX191c2VyICphcmcsCisJc3RydWN0IGZpbGUJCSpwYXJmaWxwLAorCXN0cnVjdCBpbm9kZQkJKnBhcmlub2RlKQoreworCWludAkJCWVycm9yOworCXN0cnVjdCBpb3ZlYwkJYWlvdjsKKwlzdHJ1Y3QgdWlvCQlhdWlvOworCXN0cnVjdCBpbm9kZQkJKmlub2RlOworCXhmc19mc29wX2hhbmRsZXJlcV90CWhyZXE7CisJdm5vZGVfdAkJCSp2cDsKKwlfX3UzMgkJCW9sZW47CisKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtWEZTX0VSUk9SKEVQRVJNKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoJmhyZXEsIGFyZywgc2l6ZW9mKHhmc19mc29wX2hhbmRsZXJlcV90KSkpCisJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CisKKwllcnJvciA9IHhmc192Z2V0X2Zzb3BfaGFuZGxlcmVxKG1wLCBwYXJpbm9kZSwgJmhyZXEsICZ2cCwgJmlub2RlKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiAtZXJyb3I7CisKKwkvKiBSZXN0cmljdCB0aGlzIGhhbmRsZSBvcGVyYXRpb24gdG8gc3ltbGlua3Mgb25seS4gKi8KKwlpZiAodnAtPnZfdHlwZSAhPSBWTE5LKSB7CisJCVZOX1JFTEUodnApOworCQlyZXR1cm4gLVhGU19FUlJPUihFSU5WQUwpOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcigmb2xlbiwgaHJlcS5vaGFuZGxlbiwgc2l6ZW9mKF9fdTMyKSkpIHsKKwkJVk5fUkVMRSh2cCk7CisJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CisJfQorCWFpb3YuaW92X2xlbgk9IG9sZW47CisJYWlvdi5pb3ZfYmFzZQk9IGhyZXEub2hhbmRsZTsKKworCWF1aW8udWlvX2lvdgk9ICZhaW92OworCWF1aW8udWlvX2lvdmNudAk9IDE7CisJYXVpby51aW9fb2Zmc2V0CT0gMDsKKwlhdWlvLnVpb19zZWdmbGcJPSBVSU9fVVNFUlNQQUNFOworCWF1aW8udWlvX3Jlc2lkCT0gb2xlbjsKKworCVZPUF9SRUFETElOSyh2cCwgJmF1aW8sIElPX0lOVklTLCBOVUxMLCBlcnJvcik7CisKKwlWTl9SRUxFKHZwKTsKKwlyZXR1cm4gKG9sZW4gLSBhdWlvLnVpb19yZXNpZCk7Cit9CisKK1NUQVRJQyBpbnQKK3hmc19mc3NldGRtX2J5X2hhbmRsZSgKKwl4ZnNfbW91bnRfdAkJKm1wLAorCXZvaWQJCQlfX3VzZXIgKmFyZywKKwlzdHJ1Y3QgZmlsZQkJKnBhcmZpbHAsCisJc3RydWN0IGlub2RlCQkqcGFyaW5vZGUpCit7CisJaW50CQkJZXJyb3I7CisJc3RydWN0IGZzZG1pZGF0YQlmc2Q7CisJeGZzX2Zzb3Bfc2V0ZG1faGFuZGxlcmVxX3QgZG1ocmVxOworCXN0cnVjdCBpbm9kZQkJKmlub2RlOworCWJodl9kZXNjX3QJCSpiZHA7CisJdm5vZGVfdAkJCSp2cDsKKworCWlmICghY2FwYWJsZShDQVBfTUtOT0QpKQorCQlyZXR1cm4gLVhGU19FUlJPUihFUEVSTSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZkbWhyZXEsIGFyZywgc2l6ZW9mKHhmc19mc29wX3NldGRtX2hhbmRsZXJlcV90KSkpCisJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CisKKwllcnJvciA9IHhmc192Z2V0X2Zzb3BfaGFuZGxlcmVxKG1wLCBwYXJpbm9kZSwgJmRtaHJlcS5ocmVxLCAmdnAsICZpbm9kZSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gLWVycm9yOworCisJaWYgKElTX0lNTVVUQUJMRShpbm9kZSkgfHwgSVNfQVBQRU5EKGlub2RlKSkgeworCQlWTl9SRUxFKHZwKTsKKwkJcmV0dXJuIC1YRlNfRVJST1IoRVBFUk0pOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcigmZnNkLCBkbWhyZXEuZGF0YSwgc2l6ZW9mKGZzZCkpKSB7CisJCVZOX1JFTEUodnApOworCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCX0KKworCWJkcCA9IGJodl9iYXNlX3VubG9ja2VkKFZOX0JIVl9IRUFEKHZwKSk7CisJZXJyb3IgPSB4ZnNfc2V0X2RtYXR0cnMoYmRwLCBmc2QuZnNkX2RtZXZtYXNrLCBmc2QuZnNkX2Rtc3RhdGUsIE5VTEwpOworCisJVk5fUkVMRSh2cCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gLWVycm9yOworCXJldHVybiAwOworfQorCitTVEFUSUMgaW50Cit4ZnNfYXR0cmxpc3RfYnlfaGFuZGxlKAorCXhmc19tb3VudF90CQkqbXAsCisJdm9pZAkJCV9fdXNlciAqYXJnLAorCXN0cnVjdCBmaWxlCQkqcGFyZmlscCwKKwlzdHJ1Y3QgaW5vZGUJCSpwYXJpbm9kZSkKK3sKKwlpbnQJCQllcnJvcjsKKwlhdHRybGlzdF9jdXJzb3Jfa2Vybl90CSpjdXJzb3I7CisJeGZzX2Zzb3BfYXR0cmxpc3RfaGFuZGxlcmVxX3QgYWxfaHJlcTsKKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZTsKKwl2bm9kZV90CQkJKnZwOworCWNoYXIJCQkqa2J1ZjsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1YRlNfRVJST1IoRVBFUk0pOworCWlmIChjb3B5X2Zyb21fdXNlcigmYWxfaHJlcSwgYXJnLCBzaXplb2YoeGZzX2Zzb3BfYXR0cmxpc3RfaGFuZGxlcmVxX3QpKSkKKwkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKKwlpZiAoYWxfaHJlcS5idWZsZW4gPiBYQVRUUl9MSVNUX01BWCkKKwkJcmV0dXJuIC1YRlNfRVJST1IoRUlOVkFMKTsKKworCWVycm9yID0geGZzX3ZnZXRfZnNvcF9oYW5kbGVyZXEobXAsIHBhcmlub2RlLCAmYWxfaHJlcS5ocmVxLAorCQkJJnZwLCAmaW5vZGUpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisKKwlrYnVmID0ga21hbGxvYyhhbF9ocmVxLmJ1ZmxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFrYnVmKQorCQlnb3RvIG91dF92bl9yZWxlOworCisJY3Vyc29yID0gKGF0dHJsaXN0X2N1cnNvcl9rZXJuX3QgKikmYWxfaHJlcS5wb3M7CisJVk9QX0FUVFJfTElTVCh2cCwga2J1ZiwgYWxfaHJlcS5idWZsZW4sIGFsX2hyZXEuZmxhZ3MsCisJCQljdXJzb3IsIE5VTEwsIGVycm9yKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0X2tmcmVlOworCisJaWYgKGNvcHlfdG9fdXNlcihhbF9ocmVxLmJ1ZmZlciwga2J1ZiwgYWxfaHJlcS5idWZsZW4pKQorCQllcnJvciA9IC1FRkFVTFQ7CisKKyBvdXRfa2ZyZWU6CisJa2ZyZWUoa2J1Zik7Cisgb3V0X3ZuX3JlbGU6CisJVk5fUkVMRSh2cCk7Cisgb3V0OgorCXJldHVybiAtZXJyb3I7Cit9CisKK1NUQVRJQyBpbnQKK3hmc19hdHRybXVsdGlfYXR0cl9nZXQoCisJc3RydWN0IHZub2RlCQkqdnAsCisJY2hhcgkJCSpuYW1lLAorCWNoYXIJCQlfX3VzZXIgKnVidWYsCisJX191aW50MzJfdAkJKmxlbiwKKwlfX3VpbnQzMl90CQlmbGFncykKK3sKKwljaGFyCQkJKmtidWY7CisJaW50CQkJZXJyb3IgPSBFRkFVTFQ7CisJCisJaWYgKCpsZW4gPiBYQVRUUl9TSVpFX01BWCkKKwkJcmV0dXJuIEVJTlZBTDsKKwlrYnVmID0ga21hbGxvYygqbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWtidWYpCisJCXJldHVybiBFTk9NRU07CisKKwlWT1BfQVRUUl9HRVQodnAsIG5hbWUsIGtidWYsIGxlbiwgZmxhZ3MsIE5VTEwsIGVycm9yKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0X2tmcmVlOworCisJaWYgKGNvcHlfdG9fdXNlcih1YnVmLCBrYnVmLCAqbGVuKSkKKwkJZXJyb3IgPSBFRkFVTFQ7CisKKyBvdXRfa2ZyZWU6CisJa2ZyZWUoa2J1Zik7CisJcmV0dXJuIGVycm9yOworfQorCitTVEFUSUMgaW50Cit4ZnNfYXR0cm11bHRpX2F0dHJfc2V0KAorCXN0cnVjdCB2bm9kZQkJKnZwLAorCWNoYXIJCQkqbmFtZSwKKwljb25zdCBjaGFyCQlfX3VzZXIgKnVidWYsCisJX191aW50MzJfdAkJbGVuLAorCV9fdWludDMyX3QJCWZsYWdzKQoreworCWNoYXIJCQkqa2J1ZjsKKwlpbnQJCQllcnJvciA9IEVGQVVMVDsKKworCWlmIChJU19JTU1VVEFCTEUoJnZwLT52X2lub2RlKSB8fCBJU19BUFBFTkQoJnZwLT52X2lub2RlKSkKKwkJcmV0dXJuIEVQRVJNOworCWlmIChsZW4gPiBYQVRUUl9TSVpFX01BWCkKKwkJcmV0dXJuIEVJTlZBTDsKKworCWtidWYgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFrYnVmKQorCQlyZXR1cm4gRU5PTUVNOworCisJaWYgKGNvcHlfZnJvbV91c2VyKGtidWYsIHVidWYsIGxlbikpCisJCWdvdG8gb3V0X2tmcmVlOworCQkJCisJVk9QX0FUVFJfU0VUKHZwLCBuYW1lLCBrYnVmLCBsZW4sIGZsYWdzLCBOVUxMLCBlcnJvcik7CisKKyBvdXRfa2ZyZWU6CisJa2ZyZWUoa2J1Zik7CisJcmV0dXJuIGVycm9yOworfQorCitTVEFUSUMgaW50Cit4ZnNfYXR0cm11bHRpX2F0dHJfcmVtb3ZlKAorCXN0cnVjdCB2bm9kZQkJKnZwLAorCWNoYXIJCQkqbmFtZSwKKwlfX3VpbnQzMl90CQlmbGFncykKK3sKKwlpbnQJCQllcnJvcjsKKworCWlmIChJU19JTU1VVEFCTEUoJnZwLT52X2lub2RlKSB8fCBJU19BUFBFTkQoJnZwLT52X2lub2RlKSkKKwkJcmV0dXJuIEVQRVJNOworCisJVk9QX0FUVFJfUkVNT1ZFKHZwLCBuYW1lLCBmbGFncywgTlVMTCwgZXJyb3IpOworCXJldHVybiBlcnJvcjsKK30KKworU1RBVElDIGludAoreGZzX2F0dHJtdWx0aV9ieV9oYW5kbGUoCisJeGZzX21vdW50X3QJCSptcCwKKwl2b2lkCQkJX191c2VyICphcmcsCisJc3RydWN0IGZpbGUJCSpwYXJmaWxwLAorCXN0cnVjdCBpbm9kZQkJKnBhcmlub2RlKQoreworCWludAkJCWVycm9yOworCXhmc19hdHRyX211bHRpb3BfdAkqb3BzOworCXhmc19mc29wX2F0dHJtdWx0aV9oYW5kbGVyZXFfdCBhbV9ocmVxOworCXN0cnVjdCBpbm9kZQkJKmlub2RlOworCXZub2RlX3QJCQkqdnA7CisJdW5zaWduZWQgaW50CQlpLCBzaXplOworCWNoYXIJCQkqYXR0cl9uYW1lOworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gLVhGU19FUlJPUihFUEVSTSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZhbV9ocmVxLCBhcmcsIHNpemVvZih4ZnNfZnNvcF9hdHRybXVsdGlfaGFuZGxlcmVxX3QpKSkKKwkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKKworCWVycm9yID0geGZzX3ZnZXRfZnNvcF9oYW5kbGVyZXEobXAsIHBhcmlub2RlLCAmYW1faHJlcS5ocmVxLCAmdnAsICZpbm9kZSk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKworCWVycm9yID0gRTJCSUc7CisJc2l6ZSA9IGFtX2hyZXEub3Bjb3VudCAqIHNpemVvZihhdHRyX211bHRpb3BfdCk7CisJaWYgKCFzaXplIHx8IHNpemUgPiAxNiAqIFBBR0VfU0laRSkKKwkJZ290byBvdXRfdm5fcmVsZTsKKworCWVycm9yID0gRU5PTUVNOworCW9wcyA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvcHMpCisJCWdvdG8gb3V0X3ZuX3JlbGU7CisKKwllcnJvciA9IEVGQVVMVDsKKwlpZiAoY29weV9mcm9tX3VzZXIob3BzLCBhbV9ocmVxLm9wcywgc2l6ZSkpCisJCWdvdG8gb3V0X2tmcmVlX29wczsKKworCWF0dHJfbmFtZSA9IGttYWxsb2MoTUFYTkFNRUxFTiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhdHRyX25hbWUpCisJCWdvdG8gb3V0X2tmcmVlX29wczsKKworCisJZXJyb3IgPSAwOworCWZvciAoaSA9IDA7IGkgPCBhbV9ocmVxLm9wY291bnQ7IGkrKykgeworCQlvcHNbaV0uYW1fZXJyb3IgPSBzdHJuY3B5X2Zyb21fdXNlcihhdHRyX25hbWUsCisJCQkJb3BzW2ldLmFtX2F0dHJuYW1lLCBNQVhOQU1FTEVOKTsKKwkJaWYgKG9wc1tpXS5hbV9lcnJvciA9PSAwIHx8IG9wc1tpXS5hbV9lcnJvciA9PSBNQVhOQU1FTEVOKQorCQkJZXJyb3IgPSAtRVJBTkdFOworCQlpZiAob3BzW2ldLmFtX2Vycm9yIDwgMCkKKwkJCWJyZWFrOworCisJCXN3aXRjaCAob3BzW2ldLmFtX29wY29kZSkgeworCQljYXNlIEFUVFJfT1BfR0VUOgorCQkJb3BzW2ldLmFtX2Vycm9yID0geGZzX2F0dHJtdWx0aV9hdHRyX2dldCh2cCwKKwkJCQkJYXR0cl9uYW1lLCBvcHNbaV0uYW1fYXR0cnZhbHVlLAorCQkJCQkmb3BzW2ldLmFtX2xlbmd0aCwgb3BzW2ldLmFtX2ZsYWdzKTsKKwkJCWJyZWFrOworCQljYXNlIEFUVFJfT1BfU0VUOgorCQkJb3BzW2ldLmFtX2Vycm9yID0geGZzX2F0dHJtdWx0aV9hdHRyX3NldCh2cCwKKwkJCQkJYXR0cl9uYW1lLCBvcHNbaV0uYW1fYXR0cnZhbHVlLAorCQkJCQlvcHNbaV0uYW1fbGVuZ3RoLCBvcHNbaV0uYW1fZmxhZ3MpOworCQkJYnJlYWs7CisJCWNhc2UgQVRUUl9PUF9SRU1PVkU6CisJCQlvcHNbaV0uYW1fZXJyb3IgPSB4ZnNfYXR0cm11bHRpX2F0dHJfcmVtb3ZlKHZwLAorCQkJCQlhdHRyX25hbWUsIG9wc1tpXS5hbV9mbGFncyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCW9wc1tpXS5hbV9lcnJvciA9IEVJTlZBTDsKKwkJfQorCX0KKworCWlmIChjb3B5X3RvX3VzZXIoYW1faHJlcS5vcHMsIG9wcywgc2l6ZSkpCisJCWVycm9yID0gWEZTX0VSUk9SKEVGQVVMVCk7CisKKwlrZnJlZShhdHRyX25hbWUpOworIG91dF9rZnJlZV9vcHM6CisJa2ZyZWUob3BzKTsKKyBvdXRfdm5fcmVsZToKKwlWTl9SRUxFKHZwKTsKKyBvdXQ6CisJcmV0dXJuIC1lcnJvcjsKK30KKworLyogcHJvdG90eXBlcyBmb3IgYSBmZXcgb2YgdGhlIHN0YWNrLWh1bmdyeSBjYXNlcyB0aGF0IGhhdmUKKyAqIHRoZWlyIG93biBmdW5jdGlvbnMuICBGdW5jdGlvbnMgYXJlIGRlZmluZWQgYWZ0ZXIgdGhlaXIgdXNlCisgKiBzbyBnY2MgZG9lc24ndCBnZXQgZmFuY3kgYW5kIGlubGluZSB0aGVtIHdpdGggLTAzICovCisKK1NUQVRJQyBpbnQKK3hmc19pb2Nfc3BhY2UoCisJYmh2X2Rlc2NfdAkJKmJkcCwKKwl2bm9kZV90CQkJKnZwLAorCXN0cnVjdCBmaWxlCQkqZmlscCwKKwlpbnQJCQlmbGFncywKKwl1bnNpZ25lZCBpbnQJCWNtZCwKKwl2b2lkCQkJX191c2VyICphcmcpOworCitTVEFUSUMgaW50Cit4ZnNfaW9jX2J1bGtzdGF0KAorCXhmc19tb3VudF90CQkqbXAsCisJdW5zaWduZWQgaW50CQljbWQsCisJdm9pZAkJCV9fdXNlciAqYXJnKTsKKworU1RBVElDIGludAoreGZzX2lvY19mc2dlb21ldHJ5X3YxKAorCXhmc19tb3VudF90CQkqbXAsCisJdm9pZAkJCV9fdXNlciAqYXJnKTsKKworU1RBVElDIGludAoreGZzX2lvY19mc2dlb21ldHJ5KAorCXhmc19tb3VudF90CQkqbXAsCisJdm9pZAkJCV9fdXNlciAqYXJnKTsKKworU1RBVElDIGludAoreGZzX2lvY194YXR0cigKKwl2bm9kZV90CQkJKnZwLAorCXhmc19pbm9kZV90CQkqaXAsCisJc3RydWN0IGZpbGUJCSpmaWxwLAorCXVuc2lnbmVkIGludAkJY21kLAorCXZvaWQJCQlfX3VzZXIgKmFyZyk7CisKK1NUQVRJQyBpbnQKK3hmc19pb2NfZ2V0Ym1hcCgKKwliaHZfZGVzY190CQkqYmRwLAorCXN0cnVjdCBmaWxlCQkqZmlscCwKKwlpbnQJCQlmbGFncywKKwl1bnNpZ25lZCBpbnQJCWNtZCwKKwl2b2lkCQkJX191c2VyICphcmcpOworCitTVEFUSUMgaW50Cit4ZnNfaW9jX2dldGJtYXB4KAorCWJodl9kZXNjX3QJCSpiZHAsCisJdm9pZAkJCV9fdXNlciAqYXJnKTsKKworaW50Cit4ZnNfaW9jdGwoCisJYmh2X2Rlc2NfdAkJKmJkcCwKKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZSwKKwlzdHJ1Y3QgZmlsZQkJKmZpbHAsCisJaW50CQkJaW9mbGFncywKKwl1bnNpZ25lZCBpbnQJCWNtZCwKKwl2b2lkCQkJX191c2VyICphcmcpCit7CisJaW50CQkJZXJyb3I7CisJdm5vZGVfdAkJCSp2cDsKKwl4ZnNfaW5vZGVfdAkJKmlwOworCXhmc19tb3VudF90CQkqbXA7CisKKwl2cCA9IExJTlZGU19HRVRfVlAoaW5vZGUpOworCisJdm5fdHJhY2VfZW50cnkodnAsICJ4ZnNfaW9jdGwiLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisKKwlpcCA9IFhGU19CSFZUT0koYmRwKTsKKwltcCA9IGlwLT5pX21vdW50OworCisJc3dpdGNoIChjbWQpIHsKKworCWNhc2UgWEZTX0lPQ19BTExPQ1NQOgorCWNhc2UgWEZTX0lPQ19GUkVFU1A6CisJY2FzZSBYRlNfSU9DX1JFU1ZTUDoKKwljYXNlIFhGU19JT0NfVU5SRVNWU1A6CisJY2FzZSBYRlNfSU9DX0FMTE9DU1A2NDoKKwljYXNlIFhGU19JT0NfRlJFRVNQNjQ6CisJY2FzZSBYRlNfSU9DX1JFU1ZTUDY0OgorCWNhc2UgWEZTX0lPQ19VTlJFU1ZTUDY0OgorCQkvKgorCQkgKiBPbmx5IGFsbG93IHRoZSBzeXMgYWRtaW4gdG8gcmVzZXJ2ZSBzcGFjZSB1bmxlc3MKKwkJICogdW53cml0dGVuIGV4dGVudHMgYXJlIGVuYWJsZWQuCisJCSAqLworCQlpZiAoIVhGU19TQl9WRVJTSU9OX0hBU0VYVEZMR0JJVCgmbXAtPm1fc2IpICYmCisJCSAgICAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJcmV0dXJuIHhmc19pb2Nfc3BhY2UoYmRwLCB2cCwgZmlscCwgaW9mbGFncywgY21kLCBhcmcpOworCisJY2FzZSBYRlNfSU9DX0RJT0lORk86IHsKKwkJc3RydWN0IGRpb2F0dHIJZGE7CisJCXhmc19idWZ0YXJnX3QJKnRhcmdldCA9CisJCQkoaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUkVBTFRJTUUpID8KKwkJCW1wLT5tX3J0ZGV2X3RhcmdwIDogbXAtPm1fZGRldl90YXJncDsKKworCQlkYS5kX21lbSA9IGRhLmRfbWluaW9zeiA9IDEgPDwgdGFyZ2V0LT5wYnJfc3NoaWZ0OworCQkvKiBUaGUgc2l6ZSBkaW8gd2lsbCBkbyBpbiBvbmUgZ28gKi8KKwkJZGEuZF9tYXhpb3N6ID0gNjQgKiBQQUdFX0NBQ0hFX1NJWkU7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZkYSwgc2l6ZW9mKGRhKSkpCisJCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFhGU19JT0NfRlNCVUxLU1RBVF9TSU5HTEU6CisJY2FzZSBYRlNfSU9DX0ZTQlVMS1NUQVQ6CisJY2FzZSBYRlNfSU9DX0ZTSU5VTUJFUlM6CisJCXJldHVybiB4ZnNfaW9jX2J1bGtzdGF0KG1wLCBjbWQsIGFyZyk7CisKKwljYXNlIFhGU19JT0NfRlNHRU9NRVRSWV9WMToKKwkJcmV0dXJuIHhmc19pb2NfZnNnZW9tZXRyeV92MShtcCwgYXJnKTsKKworCWNhc2UgWEZTX0lPQ19GU0dFT01FVFJZOgorCQlyZXR1cm4geGZzX2lvY19mc2dlb21ldHJ5KG1wLCBhcmcpOworCisJY2FzZSBYRlNfSU9DX0dFVFZFUlNJT046CisJY2FzZSBYRlNfSU9DX0dFVFhGTEFHUzoKKwljYXNlIFhGU19JT0NfU0VUWEZMQUdTOgorCWNhc2UgWEZTX0lPQ19GU0dFVFhBVFRSOgorCWNhc2UgWEZTX0lPQ19GU1NFVFhBVFRSOgorCWNhc2UgWEZTX0lPQ19GU0dFVFhBVFRSQToKKwkJcmV0dXJuIHhmc19pb2NfeGF0dHIodnAsIGlwLCBmaWxwLCBjbWQsIGFyZyk7CisKKwljYXNlIFhGU19JT0NfRlNTRVRETTogeworCQlzdHJ1Y3QgZnNkbWlkYXRhCWRtaTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmRtaSwgYXJnLCBzaXplb2YoZG1pKSkpCisJCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCisJCWVycm9yID0geGZzX3NldF9kbWF0dHJzKGJkcCwgZG1pLmZzZF9kbWV2bWFzaywgZG1pLmZzZF9kbXN0YXRlLAorCQkJCQkJCU5VTEwpOworCQlyZXR1cm4gLWVycm9yOworCX0KKworCWNhc2UgWEZTX0lPQ19HRVRCTUFQOgorCWNhc2UgWEZTX0lPQ19HRVRCTUFQQToKKwkJcmV0dXJuIHhmc19pb2NfZ2V0Ym1hcChiZHAsIGZpbHAsIGlvZmxhZ3MsIGNtZCwgYXJnKTsKKworCWNhc2UgWEZTX0lPQ19HRVRCTUFQWDoKKwkJcmV0dXJuIHhmc19pb2NfZ2V0Ym1hcHgoYmRwLCBhcmcpOworCisJY2FzZSBYRlNfSU9DX0ZEX1RPX0hBTkRMRToKKwljYXNlIFhGU19JT0NfUEFUSF9UT19IQU5ETEU6CisJY2FzZSBYRlNfSU9DX1BBVEhfVE9fRlNIQU5ETEU6CisJCXJldHVybiB4ZnNfZmluZF9oYW5kbGUoY21kLCBhcmcpOworCisJY2FzZSBYRlNfSU9DX09QRU5fQllfSEFORExFOgorCQlyZXR1cm4geGZzX29wZW5fYnlfaGFuZGxlKG1wLCBhcmcsIGZpbHAsIGlub2RlKTsKKworCWNhc2UgWEZTX0lPQ19GU1NFVERNX0JZX0hBTkRMRToKKwkJcmV0dXJuIHhmc19mc3NldGRtX2J5X2hhbmRsZShtcCwgYXJnLCBmaWxwLCBpbm9kZSk7CisKKwljYXNlIFhGU19JT0NfUkVBRExJTktfQllfSEFORExFOgorCQlyZXR1cm4geGZzX3JlYWRsaW5rX2J5X2hhbmRsZShtcCwgYXJnLCBmaWxwLCBpbm9kZSk7CisKKwljYXNlIFhGU19JT0NfQVRUUkxJU1RfQllfSEFORExFOgorCQlyZXR1cm4geGZzX2F0dHJsaXN0X2J5X2hhbmRsZShtcCwgYXJnLCBmaWxwLCBpbm9kZSk7CisKKwljYXNlIFhGU19JT0NfQVRUUk1VTFRJX0JZX0hBTkRMRToKKwkJcmV0dXJuIHhmc19hdHRybXVsdGlfYnlfaGFuZGxlKG1wLCBhcmcsIGZpbHAsIGlub2RlKTsKKworCWNhc2UgWEZTX0lPQ19TV0FQRVhUOiB7CisJCWVycm9yID0geGZzX3N3YXBleHQoKHN0cnVjdCB4ZnNfc3dhcGV4dCBfX3VzZXIgKilhcmcpOworCQlyZXR1cm4gLWVycm9yOworCX0KKworCWNhc2UgWEZTX0lPQ19GU0NPVU5UUzogeworCQl4ZnNfZnNvcF9jb3VudHNfdCBvdXQ7CisKKwkJZXJyb3IgPSB4ZnNfZnNfY291bnRzKG1wLCAmb3V0KTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIC1lcnJvcjsKKworCQlpZiAoY29weV90b191c2VyKGFyZywgJm91dCwgc2l6ZW9mKG91dCkpKQorCQkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBYRlNfSU9DX1NFVF9SRVNCTEtTOiB7CisJCXhmc19mc29wX3Jlc2Jsa3NfdCBpbm91dDsKKwkJX191aW50NjRfdAkgICBpbjsKKworCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmaW5vdXQsIGFyZywgc2l6ZW9mKGlub3V0KSkpCisJCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCisJCS8qIGlucHV0IHBhcmFtZXRlciBpcyBwYXNzZWQgaW4gcmVzYmxrcyBmaWVsZCBvZiBzdHJ1Y3R1cmUgKi8KKwkJaW4gPSBpbm91dC5yZXNibGtzOworCQllcnJvciA9IHhmc19yZXNlcnZlX2Jsb2NrcyhtcCwgJmluLCAmaW5vdXQpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gLWVycm9yOworCisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmaW5vdXQsIHNpemVvZihpbm91dCkpKQorCQkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBYRlNfSU9DX0dFVF9SRVNCTEtTOiB7CisJCXhmc19mc29wX3Jlc2Jsa3NfdCBvdXQ7CisKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQllcnJvciA9IHhmc19yZXNlcnZlX2Jsb2NrcyhtcCwgTlVMTCwgJm91dCk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiAtZXJyb3I7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZvdXQsIHNpemVvZihvdXQpKSkKKwkJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CisKKwkJcmV0dXJuIDA7CisJfQorCisJY2FzZSBYRlNfSU9DX0ZTR1JPV0ZTREFUQTogeworCQl4ZnNfZ3Jvd2ZzX2RhdGFfdCBpbjsKKworCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmaW4sIGFyZywgc2l6ZW9mKGluKSkpCisJCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCisJCWVycm9yID0geGZzX2dyb3dmc19kYXRhKG1wLCAmaW4pOworCQlyZXR1cm4gLWVycm9yOworCX0KKworCWNhc2UgWEZTX0lPQ19GU0dST1dGU0xPRzogeworCQl4ZnNfZ3Jvd2ZzX2xvZ190IGluOworCisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZpbiwgYXJnLCBzaXplb2YoaW4pKSkKKwkJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CisKKwkJZXJyb3IgPSB4ZnNfZ3Jvd2ZzX2xvZyhtcCwgJmluKTsKKwkJcmV0dXJuIC1lcnJvcjsKKwl9CisKKwljYXNlIFhGU19JT0NfRlNHUk9XRlNSVDogeworCQl4ZnNfZ3Jvd2ZzX3J0X3QgaW47CisKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmluLCBhcmcsIHNpemVvZihpbikpKQorCQkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKKworCQllcnJvciA9IHhmc19ncm93ZnNfcnQobXAsICZpbik7CisJCXJldHVybiAtZXJyb3I7CisJfQorCisJY2FzZSBYRlNfSU9DX0ZSRUVaRToKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQlpZiAoaW5vZGUtPmlfc2ItPnNfZnJvemVuID09IFNCX1VORlJPWkVOKQorCQkJZnJlZXplX2JkZXYoaW5vZGUtPmlfc2ItPnNfYmRldik7CisJCXJldHVybiAwOworCisJY2FzZSBYRlNfSU9DX1RIQVc6CisJCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRVBFUk07CisJCWlmIChpbm9kZS0+aV9zYi0+c19mcm96ZW4gIT0gU0JfVU5GUk9aRU4pCisJCQl0aGF3X2JkZXYoaW5vZGUtPmlfc2ItPnNfYmRldiwgaW5vZGUtPmlfc2IpOworCQlyZXR1cm4gMDsKKworCWNhc2UgWEZTX0lPQ19HT0lOR0RPV046IHsKKwkJX191aW50MzJfdCBpbjsKKworCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCWlmIChnZXRfdXNlcihpbiwgKF9fdWludDMyX3QgX191c2VyICopYXJnKSkKKwkJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CisKKwkJZXJyb3IgPSB4ZnNfZnNfZ29pbmdkb3duKG1wLCBpbik7CisJCXJldHVybiAtZXJyb3I7CisJfQorCisJY2FzZSBYRlNfSU9DX0VSUk9SX0lOSkVDVElPTjogeworCQl4ZnNfZXJyb3JfaW5qZWN0aW9uX3QgaW47CisKKwkJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmluLCBhcmcsIHNpemVvZihpbikpKQorCQkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKKworCQllcnJvciA9IHhmc19lcnJvcnRhZ19hZGQoaW4uZXJydGFnLCBtcCk7CisJCXJldHVybiAtZXJyb3I7CisJfQorCisJY2FzZSBYRlNfSU9DX0VSUk9SX0NMRUFSQUxMOgorCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCWVycm9yID0geGZzX2Vycm9ydGFnX2NsZWFyYWxsKG1wKTsKKwkJcmV0dXJuIC1lcnJvcjsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PVFRZOworCX0KK30KKworU1RBVElDIGludAoreGZzX2lvY19zcGFjZSgKKwliaHZfZGVzY190CQkqYmRwLAorCXZub2RlX3QJCQkqdnAsCisJc3RydWN0IGZpbGUJCSpmaWxwLAorCWludAkJCWlvZmxhZ3MsCisJdW5zaWduZWQgaW50CQljbWQsCisJdm9pZAkJCV9fdXNlciAqYXJnKQoreworCXhmc19mbG9jazY0X3QJCWJmOworCWludAkJCWF0dHJfZmxhZ3MgPSAwOworCWludAkJCWVycm9yOworCisJaWYgKHZwLT52X2lub2RlLmlfZmxhZ3MgJiAoU19JTU1VVEFCTEV8U19BUFBFTkQpKQorCQlyZXR1cm4gLVhGU19FUlJPUihFUEVSTSk7CisKKwlpZiAoIShmaWxwLT5mX2ZsYWdzICYgRk1PREVfV1JJVEUpKQorCQlyZXR1cm4gLVhGU19FUlJPUihFQkFERik7CisKKwlpZiAodnAtPnZfdHlwZSAhPSBWUkVHKQorCQlyZXR1cm4gLVhGU19FUlJPUihFSU5WQUwpOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZiZiwgYXJnLCBzaXplb2YoYmYpKSkKKwkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKKworCWlmIChmaWxwLT5mX2ZsYWdzICYgKE9fTkRFTEFZfE9fTk9OQkxPQ0spKQorCQlhdHRyX2ZsYWdzIHw9IEFUVFJfTk9OQkxPQ0s7CisJaWYgKGlvZmxhZ3MgJiBJT19JTlZJUykKKwkJYXR0cl9mbGFncyB8PSBBVFRSX0RNSTsKKworCWVycm9yID0geGZzX2NoYW5nZV9maWxlX3NwYWNlKGJkcCwgY21kLCAmYmYsIGZpbHAtPmZfcG9zLAorCQkJCQkgICAgICBOVUxMLCBhdHRyX2ZsYWdzKTsKKwlyZXR1cm4gLWVycm9yOworfQorCitTVEFUSUMgaW50Cit4ZnNfaW9jX2J1bGtzdGF0KAorCXhmc19tb3VudF90CQkqbXAsCisJdW5zaWduZWQgaW50CQljbWQsCisJdm9pZAkJCV9fdXNlciAqYXJnKQoreworCXhmc19mc29wX2J1bGtyZXFfdAlidWxrcmVxOworCWludAkJCWNvdW50OwkvKiAjIG9mIHJlY29yZHMgcmV0dXJuZWQgKi8KKwl4ZnNfaW5vX3QJCWlubGFzdDsJLyogbGFzdCBpbm9kZSBudW1iZXIgKi8KKwlpbnQJCQlkb25lOworCWludAkJCWVycm9yOworCisJLyogZG9uZSA9IDEgaWYgdGhlcmUgYXJlIG1vcmUgc3RhdHMgdG8gZ2V0IGFuZCBpZiBidWxrc3RhdCAqLworCS8qIHNob3VsZCBiZSBjYWxsZWQgYWdhaW4gKHVudXNlZCBoZXJlLCBidXQgdXNlZCBpbiBkbWFwaSkgKi8KKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKKwkJcmV0dXJuIC1YRlNfRVJST1IoRUlPKTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmYnVsa3JlcSwgYXJnLCBzaXplb2YoeGZzX2Zzb3BfYnVsa3JlcV90KSkpCisJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmlubGFzdCwgYnVsa3JlcS5sYXN0aXAsIHNpemVvZihfX3M2NCkpKQorCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCisJaWYgKChjb3VudCA9IGJ1bGtyZXEuaWNvdW50KSA8PSAwKQorCQlyZXR1cm4gLVhGU19FUlJPUihFSU5WQUwpOworCisJaWYgKGNtZCA9PSBYRlNfSU9DX0ZTSU5VTUJFUlMpCisJCWVycm9yID0geGZzX2ludW1iZXJzKG1wLCAmaW5sYXN0LCAmY291bnQsCisJCQkJCQlidWxrcmVxLnVidWZmZXIpOworCWVsc2UgaWYgKGNtZCA9PSBYRlNfSU9DX0ZTQlVMS1NUQVRfU0lOR0xFKQorCQllcnJvciA9IHhmc19idWxrc3RhdF9zaW5nbGUobXAsICZpbmxhc3QsCisJCQkJCQlidWxrcmVxLnVidWZmZXIsICZkb25lKTsKKwllbHNlIHsJLyogWEZTX0lPQ19GU0JVTEtTVEFUICovCisJCWlmIChjb3VudCA9PSAxICYmIGlubGFzdCAhPSAwKSB7CisJCQlpbmxhc3QrKzsKKwkJCWVycm9yID0geGZzX2J1bGtzdGF0X3NpbmdsZShtcCwgJmlubGFzdCwKKwkJCQkJYnVsa3JlcS51YnVmZmVyLCAmZG9uZSk7CisJCX0gZWxzZSB7CisJCQllcnJvciA9IHhmc19idWxrc3RhdChtcCwgJmlubGFzdCwgJmNvdW50LAorCQkJCShidWxrc3RhdF9vbmVfcGYpeGZzX2J1bGtzdGF0X29uZSwgTlVMTCwKKwkJCQlzaXplb2YoeGZzX2JzdGF0X3QpLCBidWxrcmVxLnVidWZmZXIsCisJCQkJQlVMS1NUQVRfRkdfUVVJQ0ssICZkb25lKTsKKwkJfQorCX0KKworCWlmIChlcnJvcikKKwkJcmV0dXJuIC1lcnJvcjsKKworCWlmIChidWxrcmVxLm9jb3VudCAhPSBOVUxMKSB7CisJCWlmIChjb3B5X3RvX3VzZXIoYnVsa3JlcS5sYXN0aXAsICZpbmxhc3QsCisJCQkJCQlzaXplb2YoeGZzX2lub190KSkpCisJCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCisJCWlmIChjb3B5X3RvX3VzZXIoYnVsa3JlcS5vY291bnQsICZjb3VudCwgc2l6ZW9mKGNvdW50KSkpCisJCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCX0KKworCXJldHVybiAwOworfQorCitTVEFUSUMgaW50Cit4ZnNfaW9jX2ZzZ2VvbWV0cnlfdjEoCisJeGZzX21vdW50X3QJCSptcCwKKwl2b2lkCQkJX191c2VyICphcmcpCit7CisJeGZzX2Zzb3BfZ2VvbV92MV90CWZzZ2VvOworCWludAkJCWVycm9yOworCisJZXJyb3IgPSB4ZnNfZnNfZ2VvbWV0cnkobXAsICh4ZnNfZnNvcF9nZW9tX3QgKikmZnNnZW8sIDMpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIC1lcnJvcjsKKworCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmZnNnZW8sIHNpemVvZihmc2dlbykpKQorCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCXJldHVybiAwOworfQorCitTVEFUSUMgaW50Cit4ZnNfaW9jX2ZzZ2VvbWV0cnkoCisJeGZzX21vdW50X3QJCSptcCwKKwl2b2lkCQkJX191c2VyICphcmcpCit7CisJeGZzX2Zzb3BfZ2VvbV90CQlmc2dlbzsKKwlpbnQJCQllcnJvcjsKKworCWVycm9yID0geGZzX2ZzX2dlb21ldHJ5KG1wLCAmZnNnZW8sIDQpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIC1lcnJvcjsKKworCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmZnNnZW8sIHNpemVvZihmc2dlbykpKQorCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCXJldHVybiAwOworfQorCisvKgorICogTGludXggZXh0ZW5kZWQgaW5vZGUgZmxhZ3MgaW50ZXJmYWNlLgorICovCisjZGVmaW5lIExJTlVYX1hGTEFHX1NZTkMJMHgwMDAwMDAwOCAvKiBTeW5jaHJvbm91cyB1cGRhdGVzICovCisjZGVmaW5lIExJTlVYX1hGTEFHX0lNTVVUQUJMRQkweDAwMDAwMDEwIC8qIEltbXV0YWJsZSBmaWxlICovCisjZGVmaW5lIExJTlVYX1hGTEFHX0FQUEVORAkweDAwMDAwMDIwIC8qIHdyaXRlcyB0byBmaWxlIG1heSBvbmx5IGFwcGVuZCAqLworI2RlZmluZSBMSU5VWF9YRkxBR19OT0RVTVAJMHgwMDAwMDA0MCAvKiBkbyBub3QgZHVtcCBmaWxlICovCisjZGVmaW5lIExJTlVYX1hGTEFHX05PQVRJTUUJMHgwMDAwMDA4MCAvKiBkbyBub3QgdXBkYXRlIGF0aW1lICovCisKK1NUQVRJQyB1bnNpZ25lZCBpbnQKK3hmc19tZXJnZV9pb2NfeGZsYWdzKAorCXVuc2lnbmVkIGludAlmbGFncywKKwl1bnNpZ25lZCBpbnQJc3RhcnQpCit7CisJdW5zaWduZWQgaW50CXhmbGFncyA9IHN0YXJ0OworCisJaWYgKGZsYWdzICYgTElOVVhfWEZMQUdfSU1NVVRBQkxFKQorCQl4ZmxhZ3MgfD0gWEZTX1hGTEFHX0lNTVVUQUJMRTsKKwllbHNlCisJCXhmbGFncyAmPSB+WEZTX1hGTEFHX0lNTVVUQUJMRTsKKwlpZiAoZmxhZ3MgJiBMSU5VWF9YRkxBR19BUFBFTkQpCisJCXhmbGFncyB8PSBYRlNfWEZMQUdfQVBQRU5EOworCWVsc2UKKwkJeGZsYWdzICY9IH5YRlNfWEZMQUdfQVBQRU5EOworCWlmIChmbGFncyAmIExJTlVYX1hGTEFHX1NZTkMpCisJCXhmbGFncyB8PSBYRlNfWEZMQUdfU1lOQzsKKwllbHNlCisJCXhmbGFncyAmPSB+WEZTX1hGTEFHX1NZTkM7CisJaWYgKGZsYWdzICYgTElOVVhfWEZMQUdfTk9BVElNRSkKKwkJeGZsYWdzIHw9IFhGU19YRkxBR19OT0FUSU1FOworCWVsc2UKKwkJeGZsYWdzICY9IH5YRlNfWEZMQUdfTk9BVElNRTsKKwlpZiAoZmxhZ3MgJiBMSU5VWF9YRkxBR19OT0RVTVApCisJCXhmbGFncyB8PSBYRlNfWEZMQUdfTk9EVU1QOworCWVsc2UKKwkJeGZsYWdzICY9IH5YRlNfWEZMQUdfTk9EVU1QOworCisJcmV0dXJuIHhmbGFnczsKK30KKworU1RBVElDIHVuc2lnbmVkIGludAoreGZzX2RpMmx4ZmxhZ3MoCisJX191aW50MTZfdAlkaV9mbGFncykKK3sKKwl1bnNpZ25lZCBpbnQJZmxhZ3MgPSAwOworCisJaWYgKGRpX2ZsYWdzICYgWEZTX0RJRkxBR19JTU1VVEFCTEUpCisJCWZsYWdzIHw9IExJTlVYX1hGTEFHX0lNTVVUQUJMRTsKKwlpZiAoZGlfZmxhZ3MgJiBYRlNfRElGTEFHX0FQUEVORCkKKwkJZmxhZ3MgfD0gTElOVVhfWEZMQUdfQVBQRU5EOworCWlmIChkaV9mbGFncyAmIFhGU19ESUZMQUdfU1lOQykKKwkJZmxhZ3MgfD0gTElOVVhfWEZMQUdfU1lOQzsKKwlpZiAoZGlfZmxhZ3MgJiBYRlNfRElGTEFHX05PQVRJTUUpCisJCWZsYWdzIHw9IExJTlVYX1hGTEFHX05PQVRJTUU7CisJaWYgKGRpX2ZsYWdzICYgWEZTX0RJRkxBR19OT0RVTVApCisJCWZsYWdzIHw9IExJTlVYX1hGTEFHX05PRFVNUDsKKwlyZXR1cm4gZmxhZ3M7Cit9CisKK1NUQVRJQyBpbnQKK3hmc19pb2NfeGF0dHIoCisJdm5vZGVfdAkJCSp2cCwKKwl4ZnNfaW5vZGVfdAkJKmlwLAorCXN0cnVjdCBmaWxlCQkqZmlscCwKKwl1bnNpZ25lZCBpbnQJCWNtZCwKKwl2b2lkCQkJX191c2VyICphcmcpCit7CisJc3RydWN0IGZzeGF0dHIJCWZhOworCXZhdHRyX3QJCQl2YTsKKwlpbnQJCQllcnJvcjsKKwlpbnQJCQlhdHRyX2ZsYWdzOworCXVuc2lnbmVkIGludAkJZmxhZ3M7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgWEZTX0lPQ19GU0dFVFhBVFRSOiB7CisJCXZhLnZhX21hc2sgPSBYRlNfQVRfWEZMQUdTfFhGU19BVF9FWFRTSVpFfFhGU19BVF9ORVhURU5UUzsKKwkJVk9QX0dFVEFUVFIodnAsICZ2YSwgMCwgTlVMTCwgZXJyb3IpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gLWVycm9yOworCisJCWZhLmZzeF94ZmxhZ3MJPSB2YS52YV94ZmxhZ3M7CisJCWZhLmZzeF9leHRzaXplCT0gdmEudmFfZXh0c2l6ZTsKKwkJZmEuZnN4X25leHRlbnRzID0gdmEudmFfbmV4dGVudHM7CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZmYSwgc2l6ZW9mKGZhKSkpCisJCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFhGU19JT0NfRlNTRVRYQVRUUjogeworCQlpZiAoY29weV9mcm9tX3VzZXIoJmZhLCBhcmcsIHNpemVvZihmYSkpKQorCQkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKKworCQlhdHRyX2ZsYWdzID0gMDsKKwkJaWYgKGZpbHAtPmZfZmxhZ3MgJiAoT19OREVMQVl8T19OT05CTE9DSykpCisJCQlhdHRyX2ZsYWdzIHw9IEFUVFJfTk9OQkxPQ0s7CisKKwkJdmEudmFfbWFzayA9IFhGU19BVF9YRkxBR1MgfCBYRlNfQVRfRVhUU0laRTsKKwkJdmEudmFfeGZsYWdzICA9IGZhLmZzeF94ZmxhZ3M7CisJCXZhLnZhX2V4dHNpemUgPSBmYS5mc3hfZXh0c2l6ZTsKKworCQlWT1BfU0VUQVRUUih2cCwgJnZhLCBhdHRyX2ZsYWdzLCBOVUxMLCBlcnJvcik7CisJCWlmICghZXJyb3IpCisJCQl2bl9yZXZhbGlkYXRlKHZwKTsJLyogdXBkYXRlIExpbnV4IGlub2RlIGZsYWdzICovCisJCXJldHVybiAtZXJyb3I7CisJfQorCisJY2FzZSBYRlNfSU9DX0ZTR0VUWEFUVFJBOiB7CisJCXZhLnZhX21hc2sgPSBYRlNfQVRfWEZMQUdTfFhGU19BVF9FWFRTSVpFfFhGU19BVF9BTkVYVEVOVFM7CisJCVZPUF9HRVRBVFRSKHZwLCAmdmEsIDAsIE5VTEwsIGVycm9yKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIC1lcnJvcjsKKworCQlmYS5mc3hfeGZsYWdzCT0gdmEudmFfeGZsYWdzOworCQlmYS5mc3hfZXh0c2l6ZQk9IHZhLnZhX2V4dHNpemU7CisJCWZhLmZzeF9uZXh0ZW50cyA9IHZhLnZhX2FuZXh0ZW50czsKKworCQlpZiAoY29weV90b191c2VyKGFyZywgJmZhLCBzaXplb2YoZmEpKSkKKwkJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CisJCXJldHVybiAwOworCX0KKworCWNhc2UgWEZTX0lPQ19HRVRYRkxBR1M6IHsKKwkJZmxhZ3MgPSB4ZnNfZGkybHhmbGFncyhpcC0+aV9kLmRpX2ZsYWdzKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZmbGFncywgc2l6ZW9mKGZsYWdzKSkpCisJCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCQlyZXR1cm4gMDsKKwl9CisKKwljYXNlIFhGU19JT0NfU0VUWEZMQUdTOiB7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmZmxhZ3MsIGFyZywgc2l6ZW9mKGZsYWdzKSkpCisJCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCisJCWlmIChmbGFncyAmIH4oTElOVVhfWEZMQUdfSU1NVVRBQkxFIHwgTElOVVhfWEZMQUdfQVBQRU5EIHwgXAorCQkJICAgICAgTElOVVhfWEZMQUdfTk9BVElNRSB8IExJTlVYX1hGTEFHX05PRFVNUCB8IFwKKwkJCSAgICAgIExJTlVYX1hGTEFHX1NZTkMpKQorCQkJcmV0dXJuIC1YRlNfRVJST1IoRU9QTk9UU1VQUCk7CisKKwkJYXR0cl9mbGFncyA9IDA7CisJCWlmIChmaWxwLT5mX2ZsYWdzICYgKE9fTkRFTEFZfE9fTk9OQkxPQ0spKQorCQkJYXR0cl9mbGFncyB8PSBBVFRSX05PTkJMT0NLOworCisJCXZhLnZhX21hc2sgPSBYRlNfQVRfWEZMQUdTOworCQl2YS52YV94ZmxhZ3MgPSB4ZnNfbWVyZ2VfaW9jX3hmbGFncyhmbGFncywKKwkJCQl4ZnNfaXAyeGZsYWdzKGlwKSk7CisKKwkJVk9QX1NFVEFUVFIodnAsICZ2YSwgYXR0cl9mbGFncywgTlVMTCwgZXJyb3IpOworCQlpZiAoIWVycm9yKQorCQkJdm5fcmV2YWxpZGF0ZSh2cCk7CS8qIHVwZGF0ZSBMaW51eCBpbm9kZSBmbGFncyAqLworCQlyZXR1cm4gLWVycm9yOworCX0KKworCWNhc2UgWEZTX0lPQ19HRVRWRVJTSU9OOiB7CisJCWZsYWdzID0gTElOVkZTX0dFVF9JUCh2cCktPmlfZ2VuZXJhdGlvbjsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZmbGFncywgc2l6ZW9mKGZsYWdzKSkpCisJCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1RUWTsKKwl9Cit9CisKK1NUQVRJQyBpbnQKK3hmc19pb2NfZ2V0Ym1hcCgKKwliaHZfZGVzY190CQkqYmRwLAorCXN0cnVjdCBmaWxlCQkqZmlscCwKKwlpbnQJCQlpb2ZsYWdzLAorCXVuc2lnbmVkIGludAkJY21kLAorCXZvaWQJCQlfX3VzZXIgKmFyZykKK3sKKwlzdHJ1Y3QgZ2V0Ym1hcAkJYm07CisJaW50CQkJaWZsYWdzOworCWludAkJCWVycm9yOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZibSwgYXJnLCBzaXplb2YoYm0pKSkKKwkJcmV0dXJuIC1YRlNfRVJST1IoRUZBVUxUKTsKKworCWlmIChibS5ibXZfY291bnQgPCAyKQorCQlyZXR1cm4gLVhGU19FUlJPUihFSU5WQUwpOworCisJaWZsYWdzID0gKGNtZCA9PSBYRlNfSU9DX0dFVEJNQVBBID8gQk1WX0lGX0FUVFJGT1JLIDogMCk7CisJaWYgKGlvZmxhZ3MgJiBJT19JTlZJUykKKwkJaWZsYWdzIHw9IEJNVl9JRl9OT19ETUFQSV9SRUFEOworCisJZXJyb3IgPSB4ZnNfZ2V0Ym1hcChiZHAsICZibSwgKHN0cnVjdCBnZXRibWFwIF9fdXNlciAqKWFyZysxLCBpZmxhZ3MpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIC1lcnJvcjsKKworCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmYm0sIHNpemVvZihibSkpKQorCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCXJldHVybiAwOworfQorCitTVEFUSUMgaW50Cit4ZnNfaW9jX2dldGJtYXB4KAorCWJodl9kZXNjX3QJCSpiZHAsCisJdm9pZAkJCV9fdXNlciAqYXJnKQoreworCXN0cnVjdCBnZXRibWFweAkJYm14OworCXN0cnVjdCBnZXRibWFwCQlibTsKKwlpbnQJCQlpZmxhZ3M7CisJaW50CQkJZXJyb3I7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmJteCwgYXJnLCBzaXplb2YoYm14KSkpCisJCXJldHVybiAtWEZTX0VSUk9SKEVGQVVMVCk7CisKKwlpZiAoYm14LmJtdl9jb3VudCA8IDIpCisJCXJldHVybiAtWEZTX0VSUk9SKEVJTlZBTCk7CisKKwkvKgorCSAqIE1hcCBpbnB1dCBnZXRibWFweCBzdHJ1Y3R1cmUgdG8gYSBnZXRibWFwCisJICogc3RydWN0dXJlIGZvciB4ZnNfZ2V0Ym1hcC4KKwkgKi8KKwlHRVRCTUFQX0NPTlZFUlQoYm14LCBibSk7CisKKwlpZmxhZ3MgPSBibXguYm12X2lmbGFnczsKKworCWlmIChpZmxhZ3MgJiAofkJNVl9JRl9WQUxJRCkpCisJCXJldHVybiAtWEZTX0VSUk9SKEVJTlZBTCk7CisKKwlpZmxhZ3MgfD0gQk1WX0lGX0VYVEVOREVEOworCisJZXJyb3IgPSB4ZnNfZ2V0Ym1hcChiZHAsICZibSwgKHN0cnVjdCBnZXRibWFweCBfX3VzZXIgKilhcmcrMSwgaWZsYWdzKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiAtZXJyb3I7CisKKwlHRVRCTUFQX0NPTlZFUlQoYm0sIGJteCk7CisKKwlpZiAoY29weV90b191c2VyKGFyZywgJmJteCwgc2l6ZW9mKGJteCkpKQorCQlyZXR1cm4gLVhGU19FUlJPUihFRkFVTFQpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bDMyLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb2N0bDMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ExMmM4MwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsMzIuYwpAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bDMyLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgInhmcy5oIgorI2luY2x1ZGUgInhmc190eXBlcy5oIgorI2luY2x1ZGUgInhmc19mcy5oIgorI2luY2x1ZGUgInhmc192ZnMuaCIKKyNpbmNsdWRlICJ4ZnNfdm5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfZGZyYWcuaCIKKworI2lmIGRlZmluZWQoQ09ORklHX0lBNjQpIHx8IGRlZmluZWQoQ09ORklHX1g4Nl82NCkKKyNkZWZpbmUgQlJPS0VOX1g4Nl9BTElHTk1FTlQKKyNlbHNlCisKK3R5cGVkZWYgc3RydWN0IHhmc19mc29wX2J1bGtyZXEzMiB7CisJY29tcGF0X3VwdHJfdAlsYXN0aXA7CQkvKiBsYXN0IGlub2RlICMgcG9pbnRlcgkJKi8KKwlfX3MzMgkJaWNvdW50OwkJLyogY291bnQgb2YgZW50cmllcyBpbiBidWZmZXIJKi8KKwljb21wYXRfdXB0cl90CXVidWZmZXI7CS8qIHVzZXIgYnVmZmVyIGZvciBpbm9kZSBkZXNjLgkqLworCV9fczMyCQlvY291bnQ7CQkvKiBvdXRwdXQgY291bnQgcG9pbnRlcgkJKi8KK30geGZzX2Zzb3BfYnVsa3JlcTMyX3Q7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCit4ZnNfaW9jdGwzMl9idWxrc3RhdCh1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl4ZnNfZnNvcF9idWxrcmVxMzJfdAlfX3VzZXIgKnAzMiA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwl4ZnNfZnNvcF9idWxrcmVxX3QJX191c2VyICpwID0gY29tcGF0X2FsbG9jX3VzZXJfc3BhY2Uoc2l6ZW9mKCpwKSk7CisJdTMyCQkJYWRkcjsKKworCWlmIChnZXRfdXNlcihhZGRyLCAmcDMyLT5sYXN0aXApIHx8CisJICAgIHB1dF91c2VyKGNvbXBhdF9wdHIoYWRkciksICZwLT5sYXN0aXApIHx8CisJICAgIGNvcHlfaW5fdXNlcigmcC0+aWNvdW50LCAmcDMyLT5pY291bnQsIHNpemVvZihzMzIpKSB8fAorCSAgICBnZXRfdXNlcihhZGRyLCAmcDMyLT51YnVmZmVyKSB8fAorCSAgICBwdXRfdXNlcihjb21wYXRfcHRyKGFkZHIpLCAmcC0+dWJ1ZmZlcikgfHwKKwkgICAgZ2V0X3VzZXIoYWRkciwgJnAzMi0+b2NvdW50KSB8fAorCSAgICBwdXRfdXNlcihjb21wYXRfcHRyKGFkZHIpLCAmcC0+b2NvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpcDsKK30KKyNlbmRpZgorCitzdGF0aWMgbG9uZworX194ZnNfY29tcGF0X2lvY3RsKGludCBtb2RlLCBzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQJCWVycm9yOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwl2bm9kZV90CQkqdnAgPSBMSU5WRlNfR0VUX1ZQKGlub2RlKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBYRlNfSU9DX0RJT0lORk86CisJY2FzZSBYRlNfSU9DX0ZTR0VPTUVUUllfVjE6CisJY2FzZSBYRlNfSU9DX0ZTR0VPTUVUUlk6CisJY2FzZSBYRlNfSU9DX0dFVFZFUlNJT046CisJY2FzZSBYRlNfSU9DX0dFVFhGTEFHUzoKKwljYXNlIFhGU19JT0NfU0VUWEZMQUdTOgorCWNhc2UgWEZTX0lPQ19GU0dFVFhBVFRSOgorCWNhc2UgWEZTX0lPQ19GU1NFVFhBVFRSOgorCWNhc2UgWEZTX0lPQ19GU0dFVFhBVFRSQToKKwljYXNlIFhGU19JT0NfRlNTRVRETToKKwljYXNlIFhGU19JT0NfR0VUQk1BUDoKKwljYXNlIFhGU19JT0NfR0VUQk1BUEE6CisJY2FzZSBYRlNfSU9DX0dFVEJNQVBYOgorLyogbm90IGhhbmRsZWQKKwljYXNlIFhGU19JT0NfRkRfVE9fSEFORExFOgorCWNhc2UgWEZTX0lPQ19QQVRIX1RPX0hBTkRMRToKKwljYXNlIFhGU19JT0NfUEFUSF9UT19IQU5ETEU6CisJY2FzZSBYRlNfSU9DX1BBVEhfVE9fRlNIQU5ETEU6CisJY2FzZSBYRlNfSU9DX09QRU5fQllfSEFORExFOgorCWNhc2UgWEZTX0lPQ19GU1NFVERNX0JZX0hBTkRMRToKKwljYXNlIFhGU19JT0NfUkVBRExJTktfQllfSEFORExFOgorCWNhc2UgWEZTX0lPQ19BVFRSTElTVF9CWV9IQU5ETEU6CisJY2FzZSBYRlNfSU9DX0FUVFJNVUxUSV9CWV9IQU5ETEU6CisqLworCWNhc2UgWEZTX0lPQ19GU0NPVU5UUzoKKwljYXNlIFhGU19JT0NfU0VUX1JFU0JMS1M6CisJY2FzZSBYRlNfSU9DX0dFVF9SRVNCTEtTOgorCWNhc2UgWEZTX0lPQ19GU0dST1dGU0RBVEE6CisJY2FzZSBYRlNfSU9DX0ZTR1JPV0ZTTE9HOgorCWNhc2UgWEZTX0lPQ19GU0dST1dGU1JUOgorCWNhc2UgWEZTX0lPQ19GUkVFWkU6CisJY2FzZSBYRlNfSU9DX1RIQVc6CisJY2FzZSBYRlNfSU9DX0dPSU5HRE9XTjoKKwljYXNlIFhGU19JT0NfRVJST1JfSU5KRUNUSU9OOgorCWNhc2UgWEZTX0lPQ19FUlJPUl9DTEVBUkFMTDoKKwkJYnJlYWs7CisKKyNpZm5kZWYgQlJPS0VOX1g4Nl9BTElHTk1FTlQKKwkvKiB4ZnNfZmxvY2tfdCBhbmQgeGZzX2JzdGF0X3QgaGF2ZSB3cm9uZyB1MzIgdnMgdTY0IGFsaWdubWVudCAqLworCWNhc2UgWEZTX0lPQ19BTExPQ1NQOgorCWNhc2UgWEZTX0lPQ19GUkVFU1A6CisJY2FzZSBYRlNfSU9DX1JFU1ZTUDoKKwljYXNlIFhGU19JT0NfVU5SRVNWU1A6CisJY2FzZSBYRlNfSU9DX0FMTE9DU1A2NDoKKwljYXNlIFhGU19JT0NfRlJFRVNQNjQ6CisJY2FzZSBYRlNfSU9DX1JFU1ZTUDY0OgorCWNhc2UgWEZTX0lPQ19VTlJFU1ZTUDY0OgorCWNhc2UgWEZTX0lPQ19TV0FQRVhUOgorCQlicmVhazsKKworCWNhc2UgWEZTX0lPQ19GU0JVTEtTVEFUX1NJTkdMRToKKwljYXNlIFhGU19JT0NfRlNCVUxLU1RBVDoKKwljYXNlIFhGU19JT0NfRlNJTlVNQkVSUzoKKwkJYXJnID0geGZzX2lvY3RsMzJfYnVsa3N0YXQoYXJnKTsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0lPQ1RMQ01EOworCX0KKworCVZPUF9JT0NUTCh2cCwgaW5vZGUsIGYsIG1vZGUsIGNtZCwgKHZvaWQgX191c2VyICopYXJnLCBlcnJvcik7CisJVk1PRElGWSh2cCk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2xvbmcgeGZzX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZiwgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlyZXR1cm4gX194ZnNfY29tcGF0X2lvY3RsKDAsIGYsIGNtZCwgYXJnKTsKK30KKworbG9uZyB4ZnNfY29tcGF0X2ludmlzX2lvY3RsKHN0cnVjdCBmaWxlICpmLCB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiBfX3hmc19jb21wYXRfaW9jdGwoSU9fSU5WSVMsIGYsIGNtZCwgYXJnKTsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsMzIuaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvY3RsMzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzlmNjlhCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9jdGwzMi5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCitsb25nIHhmc19jb21wYXRfaW9jdGwoc3RydWN0IGZpbGUgKmYsIHVuc2lnbmVkIGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworbG9uZyB4ZnNfY29tcGF0X2ludmlzX2lvY3RsKHN0cnVjdCBmaWxlICpmLCB1bnNpZ25lZCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvcHMuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX2lvcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDdlOTkzCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9wcy5jCkBAIC0wLDAgKzEsNjgwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisjaW5jbHVkZSAieGZzX2ZzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2FnLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX3F1b3RhLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvYy5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19ibWFwLmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgorI2luY2x1ZGUgInhmc19ydGFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisjaW5jbHVkZSAieGZzX2l0YWJsZS5oIgorI2luY2x1ZGUgInhmc19ydy5oIgorI2luY2x1ZGUgInhmc19hY2wuaCIKKyNpbmNsdWRlICJ4ZnNfY2FwLmgiCisjaW5jbHVkZSAieGZzX21hYy5oIgorI2luY2x1ZGUgInhmc19hdHRyLmgiCisjaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCisjaW5jbHVkZSAieGZzX3V0aWxzLmgiCisKKyNpbmNsdWRlIDxsaW51eC94YXR0ci5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisKKworLyoKKyAqIFB1bGwgdGhlIGxpbmsgY291bnQgYW5kIHNpemUgdXAgZnJvbSB0aGUgeGZzIGlub2RlIHRvIHRoZSBsaW51eCBpbm9kZQorICovCitTVEFUSUMgdm9pZAordmFsaWRhdGVfZmllbGRzKAorCXN0cnVjdCBpbm9kZQkqaXApCit7CisJdm5vZGVfdAkJKnZwID0gTElOVkZTX0dFVF9WUChpcCk7CisJdmF0dHJfdAkJdmE7CisJaW50CQllcnJvcjsKKworCXZhLnZhX21hc2sgPSBYRlNfQVRfTkxJTkt8WEZTX0FUX1NJWkV8WEZTX0FUX05CTE9DS1M7CisJVk9QX0dFVEFUVFIodnAsICZ2YSwgQVRUUl9MQVpZLCBOVUxMLCBlcnJvcik7CisJaWYgKGxpa2VseSghZXJyb3IpKSB7CisJCWlwLT5pX25saW5rID0gdmEudmFfbmxpbms7CisJCWlwLT5pX2Jsb2NrcyA9IHZhLnZhX25ibG9ja3M7CisKKwkJLyogd2UncmUgdW5kZXIgaV9zZW0gc28gaV9zaXplIGNhbid0IGNoYW5nZSB1bmRlciB1cyAqLworCQlpZiAoaV9zaXplX3JlYWQoaXApICE9IHZhLnZhX3NpemUpCisJCQlpX3NpemVfd3JpdGUoaXAsIHZhLnZhX3NpemUpOworCX0KK30KKworLyoKKyAqIERldGVybWluZSB3aGV0aGVyIGEgcHJvY2VzcyBoYXMgYSB2YWxpZCBmc19zdHJ1Y3QgKGtlcm5lbCBkYWVtb25zCisgKiBsaWtlIGtuZnNkIGRvbid0IGhhdmUgYW4gZnNfc3RydWN0KS4KKyAqCisgKiBYWFgoaGNoKTogIG5mc2QgaXMgYnJva2VuLCBiZXR0ZXIgZml4IGl0IGluc3RlYWQuCisgKi8KK1NUQVRJQyBpbmxpbmUgaW50CitoYXNfZnNfc3RydWN0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlyZXR1cm4gKHRhc2stPmZzICE9IGluaXRfdGFzay5mcyk7Cit9CisKK1NUQVRJQyBpbnQKK2xpbnZmc19ta25vZCgKKwlzdHJ1Y3QgaW5vZGUJKmRpciwKKwlzdHJ1Y3QgZGVudHJ5CSpkZW50cnksCisJaW50CQltb2RlLAorCWRldl90CQlyZGV2KQoreworCXN0cnVjdCBpbm9kZQkqaXA7CisJdmF0dHJfdAkJdmE7CisJdm5vZGVfdAkJKnZwID0gTlVMTCwgKmR2cCA9IExJTlZGU19HRVRfVlAoZGlyKTsKKwl4ZnNfYWNsX3QJKmRlZmF1bHRfYWNsID0gTlVMTDsKKwlhdHRyZXhpc3RzX3QJdGVzdF9kZWZhdWx0X2FjbCA9IF9BQ0xfREVGQVVMVF9FWElTVFM7CisJaW50CQllcnJvcjsKKworCS8qCisJICogSXJpeCB1c2VzIE1pc3NlZCdlbSdWIHNwbGl0LCBidXQgZG9lc24ndCB3YW50IHRvIHNlZQorCSAqIHRoZSB1cHBlciA1IGJpdHMgb2YgKDE0Yml0KSBtYWpvci4KKwkgKi8KKwlpZiAoIXN5c3ZfdmFsaWRfZGV2KHJkZXYpIHx8IE1BSk9SKHJkZXYpICYgfjB4MWZmKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh0ZXN0X2RlZmF1bHRfYWNsICYmIHRlc3RfZGVmYXVsdF9hY2woZHZwKSkgeworCQlpZiAoIV9BQ0xfQUxMT0MoZGVmYXVsdF9hY2wpKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWlmICghX0FDTF9HRVRfREVGQVVMVChkdnAsIGRlZmF1bHRfYWNsKSkgeworCQkJX0FDTF9GUkVFKGRlZmF1bHRfYWNsKTsKKwkJCWRlZmF1bHRfYWNsID0gTlVMTDsKKwkJfQorCX0KKworCWlmIChJU19QT1NJWEFDTChkaXIpICYmICFkZWZhdWx0X2FjbCAmJiBoYXNfZnNfc3RydWN0KGN1cnJlbnQpKQorCQltb2RlICY9IH5jdXJyZW50LT5mcy0+dW1hc2s7CisKKwltZW1zZXQoJnZhLCAwLCBzaXplb2YodmEpKTsKKwl2YS52YV9tYXNrID0gWEZTX0FUX1RZUEV8WEZTX0FUX01PREU7CisJdmEudmFfdHlwZSA9IElGVE9WVChtb2RlKTsKKwl2YS52YV9tb2RlID0gbW9kZTsKKworCXN3aXRjaCAobW9kZSAmIFNfSUZNVCkgeworCWNhc2UgU19JRkNIUjogY2FzZSBTX0lGQkxLOiBjYXNlIFNfSUZJRk86IGNhc2UgU19JRlNPQ0s6CisJCXZhLnZhX3JkZXYgPSBzeXN2X2VuY29kZV9kZXYocmRldik7CisJCXZhLnZhX21hc2sgfD0gWEZTX0FUX1JERVY7CisJCS8qRkFMTFRIUk9VR0gqLworCWNhc2UgU19JRlJFRzoKKwkJVk9QX0NSRUFURShkdnAsIGRlbnRyeSwgJnZhLCAmdnAsIE5VTEwsIGVycm9yKTsKKwkJYnJlYWs7CisJY2FzZSBTX0lGRElSOgorCQlWT1BfTUtESVIoZHZwLCBkZW50cnksICZ2YSwgJnZwLCBOVUxMLCBlcnJvcik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVycm9yID0gRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlpZiAoZGVmYXVsdF9hY2wpIHsKKwkJaWYgKCFlcnJvcikgeworCQkJZXJyb3IgPSBfQUNMX0lOSEVSSVQodnAsICZ2YSwgZGVmYXVsdF9hY2wpOworCQkJaWYgKCFlcnJvcikgeworCQkJCVZNT0RJRlkodnApOworCQkJfSBlbHNlIHsKKwkJCQlzdHJ1Y3QgZGVudHJ5CXRlYXJkb3duID0ge307CisJCQkJaW50CQllcnIyOworCisJCQkJLyogT2gsIHRoZSBob3Jyb3IuCisJCQkJICogSWYgd2UgY2FuJ3QgYWRkIHRoZSBBQ0wgd2UgbXVzdCBiYWNrIG91dC4KKwkJCQkgKiBFTk9TUEMgY2FuIGhpdCBoZXJlLCBhbW9uZyBvdGhlciB0aGluZ3MuCisJCQkJICovCisJCQkJdGVhcmRvd24uZF9pbm9kZSA9IGlwID0gTElOVkZTX0dFVF9JUCh2cCk7CisJCQkJdGVhcmRvd24uZF9uYW1lID0gZGVudHJ5LT5kX25hbWU7CisKKwkJCQl2bl9tYXJrX2JhZCh2cCk7CisJCQkJCisJCQkJaWYgKFNfSVNESVIobW9kZSkpCisJCQkJCVZPUF9STURJUihkdnAsICZ0ZWFyZG93biwgTlVMTCwgZXJyMik7CisJCQkJZWxzZQorCQkJCQlWT1BfUkVNT1ZFKGR2cCwgJnRlYXJkb3duLCBOVUxMLCBlcnIyKTsKKwkJCQlWTl9SRUxFKHZwKTsKKwkJCX0KKwkJfQorCQlfQUNMX0ZSRUUoZGVmYXVsdF9hY2wpOworCX0KKworCWlmICghZXJyb3IpIHsKKwkJQVNTRVJUKHZwKTsKKwkJaXAgPSBMSU5WRlNfR0VUX0lQKHZwKTsKKworCQlpZiAoU19JU0NIUihtb2RlKSB8fCBTX0lTQkxLKG1vZGUpKQorCQkJaXAtPmlfcmRldiA9IHJkZXY7CisJCWVsc2UgaWYgKFNfSVNESVIobW9kZSkpCisJCQl2YWxpZGF0ZV9maWVsZHMoaXApOworCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaXApOworCQl2YWxpZGF0ZV9maWVsZHMoZGlyKTsKKwl9CisJcmV0dXJuIC1lcnJvcjsKK30KKworU1RBVElDIGludAorbGludmZzX2NyZWF0ZSgKKwlzdHJ1Y3QgaW5vZGUJKmRpciwKKwlzdHJ1Y3QgZGVudHJ5CSpkZW50cnksCisJaW50CQltb2RlLAorCXN0cnVjdCBuYW1laWRhdGEgKm5kKQoreworCXJldHVybiBsaW52ZnNfbWtub2QoZGlyLCBkZW50cnksIG1vZGUsIDApOworfQorCitTVEFUSUMgaW50CitsaW52ZnNfbWtkaXIoCisJc3RydWN0IGlub2RlCSpkaXIsCisJc3RydWN0IGRlbnRyeQkqZGVudHJ5LAorCWludAkJbW9kZSkKK3sKKwlyZXR1cm4gbGludmZzX21rbm9kKGRpciwgZGVudHJ5LCBtb2RlfFNfSUZESVIsIDApOworfQorCitTVEFUSUMgc3RydWN0IGRlbnRyeSAqCitsaW52ZnNfbG9va3VwKAorCXN0cnVjdCBpbm9kZQkqZGlyLAorCXN0cnVjdCBkZW50cnkJKmRlbnRyeSwKKwlzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKK3sKKwlzdHJ1Y3Qgdm5vZGUJKnZwID0gTElOVkZTX0dFVF9WUChkaXIpLCAqY3ZwOworCWludAkJZXJyb3I7CisKKwlpZiAoZGVudHJ5LT5kX25hbWUubGVuID49IE1BWE5BTUVMRU4pCisJCXJldHVybiBFUlJfUFRSKC1FTkFNRVRPT0xPTkcpOworCisJVk9QX0xPT0tVUCh2cCwgZGVudHJ5LCAmY3ZwLCAwLCBOVUxMLCBOVUxMLCBlcnJvcik7CisJaWYgKGVycm9yKSB7CisJCWlmICh1bmxpa2VseShlcnJvciAhPSBFTk9FTlQpKQorCQkJcmV0dXJuIEVSUl9QVFIoLWVycm9yKTsKKwkJZF9hZGQoZGVudHJ5LCBOVUxMKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcmV0dXJuIGRfc3BsaWNlX2FsaWFzKExJTlZGU19HRVRfSVAoY3ZwKSwgZGVudHJ5KTsKK30KKworU1RBVElDIGludAorbGludmZzX2xpbmsoCisJc3RydWN0IGRlbnRyeQkqb2xkX2RlbnRyeSwKKwlzdHJ1Y3QgaW5vZGUJKmRpciwKKwlzdHJ1Y3QgZGVudHJ5CSpkZW50cnkpCit7CisJc3RydWN0IGlub2RlCSppcDsJLyogaW5vZGUgb2YgZ3V5IGJlaW5nIGxpbmtlZCB0byAqLworCXZub2RlX3QJCSp0ZHZwOwkvKiB0YXJnZXQgZGlyZWN0b3J5IGZvciBuZXcgbmFtZS9saW5rICovCisJdm5vZGVfdAkJKnZwOwkvKiB2cCBvZiBuYW1lIGJlaW5nIGxpbmtlZCAqLworCWludAkJZXJyb3I7CisKKwlpcCA9IG9sZF9kZW50cnktPmRfaW5vZGU7CS8qIGlub2RlIGJlaW5nIGxpbmtlZCB0byAqLworCWlmIChTX0lTRElSKGlwLT5pX21vZGUpKQorCQlyZXR1cm4gLUVQRVJNOworCisJdGR2cCA9IExJTlZGU19HRVRfVlAoZGlyKTsKKwl2cCA9IExJTlZGU19HRVRfVlAoaXApOworCisJVk9QX0xJTksodGR2cCwgdnAsIGRlbnRyeSwgTlVMTCwgZXJyb3IpOworCWlmICghZXJyb3IpIHsKKwkJVk1PRElGWSh0ZHZwKTsKKwkJVk5fSE9MRCh2cCk7CisJCXZhbGlkYXRlX2ZpZWxkcyhpcCk7CisJCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpcCk7CisJfQorCXJldHVybiAtZXJyb3I7Cit9CisKK1NUQVRJQyBpbnQKK2xpbnZmc191bmxpbmsoCisJc3RydWN0IGlub2RlCSpkaXIsCisJc3RydWN0IGRlbnRyeQkqZGVudHJ5KQoreworCXN0cnVjdCBpbm9kZQkqaW5vZGU7CisJdm5vZGVfdAkJKmR2cDsJLyogZGlyZWN0b3J5IGNvbnRhaW5pbmcgbmFtZSB0byByZW1vdmUgKi8KKwlpbnQJCWVycm9yOworCisJaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJZHZwID0gTElOVkZTX0dFVF9WUChkaXIpOworCisJVk9QX1JFTU9WRShkdnAsIGRlbnRyeSwgTlVMTCwgZXJyb3IpOworCWlmICghZXJyb3IpIHsKKwkJdmFsaWRhdGVfZmllbGRzKGRpcik7CS8qIEZvciBzaXplIG9ubHkgKi8KKwkJdmFsaWRhdGVfZmllbGRzKGlub2RlKTsKKwl9CisKKwlyZXR1cm4gLWVycm9yOworfQorCitTVEFUSUMgaW50CitsaW52ZnNfc3ltbGluaygKKwlzdHJ1Y3QgaW5vZGUJKmRpciwKKwlzdHJ1Y3QgZGVudHJ5CSpkZW50cnksCisJY29uc3QgY2hhcgkqc3ltbmFtZSkKK3sKKwlzdHJ1Y3QgaW5vZGUJKmlwOworCXZhdHRyX3QJCXZhOworCXZub2RlX3QJCSpkdnA7CS8qIGRpcmVjdG9yeSBjb250YWluaW5nIG5hbWUgb2Ygc3ltbGluayAqLworCXZub2RlX3QJCSpjdnA7CS8qIHVzZWQgdG8gbG9va3VwIHN5bWxpbmsgdG8gcHV0IGluIGRlbnRyeSAqLworCWludAkJZXJyb3I7CisKKwlkdnAgPSBMSU5WRlNfR0VUX1ZQKGRpcik7CisJY3ZwID0gTlVMTDsKKworCW1lbXNldCgmdmEsIDAsIHNpemVvZih2YSkpOworCXZhLnZhX3R5cGUgPSBWTE5LOworCXZhLnZhX21vZGUgPSBpcml4X3N5bWxpbmtfbW9kZSA/IDA3NzcgJiB+Y3VycmVudC0+ZnMtPnVtYXNrIDogU19JUldYVUdPOworCXZhLnZhX21hc2sgPSBYRlNfQVRfVFlQRXxYRlNfQVRfTU9ERTsKKworCWVycm9yID0gMDsKKwlWT1BfU1lNTElOSyhkdnAsIGRlbnRyeSwgJnZhLCAoY2hhciAqKXN5bW5hbWUsICZjdnAsIE5VTEwsIGVycm9yKTsKKwlpZiAoIWVycm9yICYmIGN2cCkgeworCQlBU1NFUlQoY3ZwLT52X3R5cGUgPT0gVkxOSyk7CisJCWlwID0gTElOVkZTX0dFVF9JUChjdnApOworCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaXApOworCQl2YWxpZGF0ZV9maWVsZHMoZGlyKTsKKwkJdmFsaWRhdGVfZmllbGRzKGlwKTsgLyogc2l6ZSBuZWVkcyB1cGRhdGUgKi8KKwl9CisJcmV0dXJuIC1lcnJvcjsKK30KKworU1RBVElDIGludAorbGludmZzX3JtZGlyKAorCXN0cnVjdCBpbm9kZQkqZGlyLAorCXN0cnVjdCBkZW50cnkJKmRlbnRyeSkKK3sKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gZGVudHJ5LT5kX2lub2RlOworCXZub2RlX3QJCSpkdnAgPSBMSU5WRlNfR0VUX1ZQKGRpcik7CisJaW50CQllcnJvcjsKKworCVZPUF9STURJUihkdnAsIGRlbnRyeSwgTlVMTCwgZXJyb3IpOworCWlmICghZXJyb3IpIHsKKwkJdmFsaWRhdGVfZmllbGRzKGlub2RlKTsKKwkJdmFsaWRhdGVfZmllbGRzKGRpcik7CisJfQorCXJldHVybiAtZXJyb3I7Cit9CisKK1NUQVRJQyBpbnQKK2xpbnZmc19yZW5hbWUoCisJc3RydWN0IGlub2RlCSpvZGlyLAorCXN0cnVjdCBkZW50cnkJKm9kZW50cnksCisJc3RydWN0IGlub2RlCSpuZGlyLAorCXN0cnVjdCBkZW50cnkJKm5kZW50cnkpCit7CisJc3RydWN0IGlub2RlCSpuZXdfaW5vZGUgPSBuZGVudHJ5LT5kX2lub2RlOworCXZub2RlX3QJCSpmdnA7CS8qIGZyb20gZGlyZWN0b3J5ICovCisJdm5vZGVfdAkJKnR2cDsJLyogdGFyZ2V0IGRpcmVjdG9yeSAqLworCWludAkJZXJyb3I7CisKKwlmdnAgPSBMSU5WRlNfR0VUX1ZQKG9kaXIpOworCXR2cCA9IExJTlZGU19HRVRfVlAobmRpcik7CisKKwlWT1BfUkVOQU1FKGZ2cCwgb2RlbnRyeSwgdHZwLCBuZGVudHJ5LCBOVUxMLCBlcnJvcik7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gLWVycm9yOworCisJaWYgKG5ld19pbm9kZSkKKwkJdmFsaWRhdGVfZmllbGRzKG5ld19pbm9kZSk7CisKKwl2YWxpZGF0ZV9maWVsZHMob2Rpcik7CisJaWYgKG5kaXIgIT0gb2RpcikKKwkJdmFsaWRhdGVfZmllbGRzKG5kaXIpOworCXJldHVybiAwOworfQorCisvKgorICogY2FyZWZ1bCBoZXJlIC0gdGhpcyBmdW5jdGlvbiBjYW4gZ2V0IGNhbGxlZCByZWN1cnNpdmVseSwgc28KKyAqIHdlIG5lZWQgdG8gYmUgdmVyeSBjYXJlZnVsIGFib3V0IGhvdyBtdWNoIHN0YWNrIHdlIHVzZS4KKyAqIHVpbyBpcyBrbWFsbG9jZWQgZm9yIHRoaXMgcmVhc29uLi4uCisgKi8KK1NUQVRJQyBpbnQKK2xpbnZmc19mb2xsb3dfbGluaygKKwlzdHJ1Y3QgZGVudHJ5CQkqZGVudHJ5LAorCXN0cnVjdCBuYW1laWRhdGEJKm5kKQoreworCXZub2RlX3QJCQkqdnA7CisJdWlvX3QJCQkqdWlvOworCWlvdmVjX3QJCQlpb3Y7CisJaW50CQkJZXJyb3I7CisJY2hhcgkJCSpsaW5rOworCisJQVNTRVJUKGRlbnRyeSk7CisJQVNTRVJUKG5kKTsKKworCWxpbmsgPSAoY2hhciAqKWttYWxsb2MoTUFYTkFNRUxFTisxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxpbmspIHsKKwkJbmRfc2V0X2xpbmsobmQsIEVSUl9QVFIoLUVOT01FTSkpOworCQlyZXR1cm4gMDsKKwl9CisKKwl1aW8gPSAodWlvX3QgKilrbWFsbG9jKHNpemVvZih1aW9fdCksIEdGUF9LRVJORUwpOworCWlmICghdWlvKSB7CisJCWtmcmVlKGxpbmspOworCQluZF9zZXRfbGluayhuZCwgRVJSX1BUUigtRU5PTUVNKSk7CisJCXJldHVybiAwOworCX0KKworCXZwID0gTElOVkZTX0dFVF9WUChkZW50cnktPmRfaW5vZGUpOworCisJaW92Lmlvdl9iYXNlID0gbGluazsKKwlpb3YuaW92X2xlbiA9IE1BWE5BTUVMRU47CisKKwl1aW8tPnVpb19pb3YgPSAmaW92OworCXVpby0+dWlvX29mZnNldCA9IDA7CisJdWlvLT51aW9fc2VnZmxnID0gVUlPX1NZU1NQQUNFOworCXVpby0+dWlvX3Jlc2lkID0gTUFYTkFNRUxFTjsKKwl1aW8tPnVpb19pb3ZjbnQgPSAxOworCisJVk9QX1JFQURMSU5LKHZwLCB1aW8sIDAsIE5VTEwsIGVycm9yKTsKKwlpZiAoZXJyb3IpIHsKKwkJa2ZyZWUobGluayk7CisJCWxpbmsgPSBFUlJfUFRSKC1lcnJvcik7CisJfSBlbHNlIHsKKwkJbGlua1tNQVhOQU1FTEVOIC0gdWlvLT51aW9fcmVzaWRdID0gJ1wwJzsKKwl9CisJa2ZyZWUodWlvKTsKKworCW5kX3NldF9saW5rKG5kLCBsaW5rKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbGludmZzX3B1dF9saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJY2hhciAqcyA9IG5kX2dldF9saW5rKG5kKTsKKwlpZiAoIUlTX0VSUihzKSkKKwkJa2ZyZWUocyk7Cit9CisKKyNpZmRlZiBDT05GSUdfWEZTX1BPU0lYX0FDTAorU1RBVElDIGludAorbGludmZzX3Blcm1pc3Npb24oCisJc3RydWN0IGlub2RlCSppbm9kZSwKKwlpbnQJCW1vZGUsCisJc3RydWN0IG5hbWVpZGF0YSAqbmQpCit7CisJdm5vZGVfdAkJKnZwID0gTElOVkZTX0dFVF9WUChpbm9kZSk7CisJaW50CQllcnJvcjsKKworCW1vZGUgPDw9IDY7CQkvKiBjb252ZXJ0IGZyb20gbGludXggdG8gdm5vZGUgYWNjZXNzIGJpdHMgKi8KKwlWT1BfQUNDRVNTKHZwLCBtb2RlLCBOVUxMLCBlcnJvcik7CisJcmV0dXJuIC1lcnJvcjsKK30KKyNlbHNlCisjZGVmaW5lIGxpbnZmc19wZXJtaXNzaW9uIE5VTEwKKyNlbmRpZgorCitTVEFUSUMgaW50CitsaW52ZnNfZ2V0YXR0cigKKwlzdHJ1Y3QgdmZzbW91bnQJKm1udCwKKwlzdHJ1Y3QgZGVudHJ5CSpkZW50cnksCisJc3RydWN0IGtzdGF0CSpzdGF0KQoreworCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBkZW50cnktPmRfaW5vZGU7CisJdm5vZGVfdAkJKnZwID0gTElOVkZTX0dFVF9WUChpbm9kZSk7CisJaW50CQllcnJvciA9IDA7CisKKwlpZiAodW5saWtlbHkodnAtPnZfZmxhZyAmIFZNT0RJRklFRCkpCisJCWVycm9yID0gdm5fcmV2YWxpZGF0ZSh2cCk7CisJaWYgKCFlcnJvcikKKwkJZ2VuZXJpY19maWxsYXR0cihpbm9kZSwgc3RhdCk7CisJcmV0dXJuIDA7Cit9CisKK1NUQVRJQyBpbnQKK2xpbnZmc19zZXRhdHRyKAorCXN0cnVjdCBkZW50cnkJKmRlbnRyeSwKKwlzdHJ1Y3QgaWF0dHIJKmF0dHIpCit7CisJc3RydWN0IGlub2RlCSppbm9kZSA9IGRlbnRyeS0+ZF9pbm9kZTsKKwl1bnNpZ25lZCBpbnQJaWFfdmFsaWQgPSBhdHRyLT5pYV92YWxpZDsKKwl2bm9kZV90CQkqdnAgPSBMSU5WRlNfR0VUX1ZQKGlub2RlKTsKKwl2YXR0cl90CQl2YXR0cjsKKwlpbnQJCWZsYWdzID0gMDsKKwlpbnQJCWVycm9yOworCisJbWVtc2V0KCZ2YXR0ciwgMCwgc2l6ZW9mKHZhdHRyX3QpKTsKKwlpZiAoaWFfdmFsaWQgJiBBVFRSX1VJRCkgeworCQl2YXR0ci52YV9tYXNrIHw9IFhGU19BVF9VSUQ7CisJCXZhdHRyLnZhX3VpZCA9IGF0dHItPmlhX3VpZDsKKwl9CisJaWYgKGlhX3ZhbGlkICYgQVRUUl9HSUQpIHsKKwkJdmF0dHIudmFfbWFzayB8PSBYRlNfQVRfR0lEOworCQl2YXR0ci52YV9naWQgPSBhdHRyLT5pYV9naWQ7CisJfQorCWlmIChpYV92YWxpZCAmIEFUVFJfU0laRSkgeworCQl2YXR0ci52YV9tYXNrIHw9IFhGU19BVF9TSVpFOworCQl2YXR0ci52YV9zaXplID0gYXR0ci0+aWFfc2l6ZTsKKwl9CisJaWYgKGlhX3ZhbGlkICYgQVRUUl9BVElNRSkgeworCQl2YXR0ci52YV9tYXNrIHw9IFhGU19BVF9BVElNRTsKKwkJdmF0dHIudmFfYXRpbWUgPSBhdHRyLT5pYV9hdGltZTsKKwl9CisJaWYgKGlhX3ZhbGlkICYgQVRUUl9NVElNRSkgeworCQl2YXR0ci52YV9tYXNrIHw9IFhGU19BVF9NVElNRTsKKwkJdmF0dHIudmFfbXRpbWUgPSBhdHRyLT5pYV9tdGltZTsKKwl9CisJaWYgKGlhX3ZhbGlkICYgQVRUUl9DVElNRSkgeworCQl2YXR0ci52YV9tYXNrIHw9IFhGU19BVF9DVElNRTsKKwkJdmF0dHIudmFfY3RpbWUgPSBhdHRyLT5pYV9jdGltZTsKKwl9CisJaWYgKGlhX3ZhbGlkICYgQVRUUl9NT0RFKSB7CisJCXZhdHRyLnZhX21hc2sgfD0gWEZTX0FUX01PREU7CisJCXZhdHRyLnZhX21vZGUgPSBhdHRyLT5pYV9tb2RlOworCQlpZiAoIWluX2dyb3VwX3AoaW5vZGUtPmlfZ2lkKSAmJiAhY2FwYWJsZShDQVBfRlNFVElEKSkKKwkJCWlub2RlLT5pX21vZGUgJj0gflNfSVNHSUQ7CisJfQorCisJaWYgKGlhX3ZhbGlkICYgKEFUVFJfTVRJTUVfU0VUIHwgQVRUUl9BVElNRV9TRVQpKQorCQlmbGFncyB8PSBBVFRSX1VUSU1FOworI2lmZGVmIEFUVFJfTk9fQkxPQ0sKKwlpZiAoKGlhX3ZhbGlkICYgQVRUUl9OT19CTE9DSykpCisJCWZsYWdzIHw9IEFUVFJfTk9OQkxPQ0s7CisjZW5kaWYKKworCVZPUF9TRVRBVFRSKHZwLCAmdmF0dHIsIGZsYWdzLCBOVUxMLCBlcnJvcik7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gLWVycm9yOworCXZuX3JldmFsaWRhdGUodnApOworCXJldHVybiBlcnJvcjsKK30KKworU1RBVElDIHZvaWQKK2xpbnZmc190cnVuY2F0ZSgKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlKQoreworCWJsb2NrX3RydW5jYXRlX3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgaW5vZGUtPmlfc2l6ZSwgbGludmZzX2dldF9ibG9jayk7Cit9CisKK1NUQVRJQyBpbnQKK2xpbnZmc19zZXR4YXR0cigKKwlzdHJ1Y3QgZGVudHJ5CSpkZW50cnksCisJY29uc3QgY2hhcgkqbmFtZSwKKwljb25zdCB2b2lkCSpkYXRhLAorCXNpemVfdAkJc2l6ZSwKKwlpbnQJCWZsYWdzKQoreworCXZub2RlX3QJCSp2cCA9IExJTlZGU19HRVRfVlAoZGVudHJ5LT5kX2lub2RlKTsKKwljaGFyCQkqYXR0ciA9IChjaGFyICopbmFtZTsKKwlhdHRybmFtZXNfdAkqbmFtZXNwOworCWludAkJeGZsYWdzID0gMDsKKwlpbnQJCWVycm9yOworCisJbmFtZXNwID0gYXR0cl9sb29rdXBfbmFtZXNwYWNlKGF0dHIsIGF0dHJfbmFtZXNwYWNlcywgQVRUUl9OQU1FQ09VTlQpOworCWlmICghbmFtZXNwKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJYXR0ciArPSBuYW1lc3AtPmF0dHJfbmFtZWxlbjsKKwllcnJvciA9IG5hbWVzcC0+YXR0cl9jYXBhYmxlKHZwLCBOVUxMKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCS8qIENvbnZlcnQgTGludXggc3lzY2FsbCB0byBYRlMgaW50ZXJuYWwgQVRUUiBmbGFncyAqLworCWlmIChmbGFncyAmIFhBVFRSX0NSRUFURSkKKwkJeGZsYWdzIHw9IEFUVFJfQ1JFQVRFOworCWlmIChmbGFncyAmIFhBVFRSX1JFUExBQ0UpCisJCXhmbGFncyB8PSBBVFRSX1JFUExBQ0U7CisJeGZsYWdzIHw9IG5hbWVzcC0+YXR0cl9mbGFnOworCXJldHVybiBuYW1lc3AtPmF0dHJfc2V0KHZwLCBhdHRyLCAodm9pZCAqKWRhdGEsIHNpemUsIHhmbGFncyk7Cit9CisKK1NUQVRJQyBzc2l6ZV90CitsaW52ZnNfZ2V0eGF0dHIoCisJc3RydWN0IGRlbnRyeQkqZGVudHJ5LAorCWNvbnN0IGNoYXIJKm5hbWUsCisJdm9pZAkJKmRhdGEsCisJc2l6ZV90CQlzaXplKQoreworCXZub2RlX3QJCSp2cCA9IExJTlZGU19HRVRfVlAoZGVudHJ5LT5kX2lub2RlKTsKKwljaGFyCQkqYXR0ciA9IChjaGFyICopbmFtZTsKKwlhdHRybmFtZXNfdAkqbmFtZXNwOworCWludAkJeGZsYWdzID0gMDsKKwlzc2l6ZV90CQllcnJvcjsKKworCW5hbWVzcCA9IGF0dHJfbG9va3VwX25hbWVzcGFjZShhdHRyLCBhdHRyX25hbWVzcGFjZXMsIEFUVFJfTkFNRUNPVU5UKTsKKwlpZiAoIW5hbWVzcCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCWF0dHIgKz0gbmFtZXNwLT5hdHRyX25hbWVsZW47CisJZXJyb3IgPSBuYW1lc3AtPmF0dHJfY2FwYWJsZSh2cCwgTlVMTCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwkvKiBDb252ZXJ0IExpbnV4IHN5c2NhbGwgdG8gWEZTIGludGVybmFsIEFUVFIgZmxhZ3MgKi8KKwlpZiAoIXNpemUpIHsKKwkJeGZsYWdzIHw9IEFUVFJfS0VSTk9WQUw7CisJCWRhdGEgPSBOVUxMOworCX0KKwl4ZmxhZ3MgfD0gbmFtZXNwLT5hdHRyX2ZsYWc7CisJcmV0dXJuIG5hbWVzcC0+YXR0cl9nZXQodnAsIGF0dHIsICh2b2lkICopZGF0YSwgc2l6ZSwgeGZsYWdzKTsKK30KKworU1RBVElDIHNzaXplX3QKK2xpbnZmc19saXN0eGF0dHIoCisJc3RydWN0IGRlbnRyeQkJKmRlbnRyeSwKKwljaGFyCQkJKmRhdGEsCisJc2l6ZV90CQkJc2l6ZSkKK3sKKwl2bm9kZV90CQkJKnZwID0gTElOVkZTX0dFVF9WUChkZW50cnktPmRfaW5vZGUpOworCWludAkJCWVycm9yLCB4ZmxhZ3MgPSBBVFRSX0tFUk5BTUVMUzsKKwlzc2l6ZV90CQkJcmVzdWx0OworCisJaWYgKCFzaXplKQorCQl4ZmxhZ3MgfD0gQVRUUl9LRVJOT1ZBTDsKKwl4ZmxhZ3MgfD0gY2FwYWJsZShDQVBfU1lTX0FETUlOKSA/IEFUVFJfS0VSTkZVTExTIDogQVRUUl9LRVJOT1JNQUxTOworCisJZXJyb3IgPSBhdHRyX2dlbmVyaWNfbGlzdCh2cCwgZGF0YSwgc2l6ZSwgeGZsYWdzLCAmcmVzdWx0KTsKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CisJcmV0dXJuIHJlc3VsdDsKK30KKworU1RBVElDIGludAorbGludmZzX3JlbW92ZXhhdHRyKAorCXN0cnVjdCBkZW50cnkJKmRlbnRyeSwKKwljb25zdCBjaGFyCSpuYW1lKQoreworCXZub2RlX3QJCSp2cCA9IExJTlZGU19HRVRfVlAoZGVudHJ5LT5kX2lub2RlKTsKKwljaGFyCQkqYXR0ciA9IChjaGFyICopbmFtZTsKKwlhdHRybmFtZXNfdAkqbmFtZXNwOworCWludAkJeGZsYWdzID0gMDsKKwlpbnQJCWVycm9yOworCisJbmFtZXNwID0gYXR0cl9sb29rdXBfbmFtZXNwYWNlKGF0dHIsIGF0dHJfbmFtZXNwYWNlcywgQVRUUl9OQU1FQ09VTlQpOworCWlmICghbmFtZXNwKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJYXR0ciArPSBuYW1lc3AtPmF0dHJfbmFtZWxlbjsKKwllcnJvciA9IG5hbWVzcC0+YXR0cl9jYXBhYmxlKHZwLCBOVUxMKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwl4ZmxhZ3MgfD0gbmFtZXNwLT5hdHRyX2ZsYWc7CisJcmV0dXJuIG5hbWVzcC0+YXR0cl9yZW1vdmUodnAsIGF0dHIsIHhmbGFncyk7Cit9CisKKworc3RydWN0IGlub2RlX29wZXJhdGlvbnMgbGludmZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkucGVybWlzc2lvbgkJPSBsaW52ZnNfcGVybWlzc2lvbiwKKwkudHJ1bmNhdGUJCT0gbGludmZzX3RydW5jYXRlLAorCS5nZXRhdHRyCQk9IGxpbnZmc19nZXRhdHRyLAorCS5zZXRhdHRyCQk9IGxpbnZmc19zZXRhdHRyLAorCS5zZXR4YXR0cgkJPSBsaW52ZnNfc2V0eGF0dHIsCisJLmdldHhhdHRyCQk9IGxpbnZmc19nZXR4YXR0ciwKKwkubGlzdHhhdHRyCQk9IGxpbnZmc19saXN0eGF0dHIsCisJLnJlbW92ZXhhdHRyCQk9IGxpbnZmc19yZW1vdmV4YXR0ciwKK307CisKK3N0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGxpbnZmc19kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkuY3JlYXRlCQkJPSBsaW52ZnNfY3JlYXRlLAorCS5sb29rdXAJCQk9IGxpbnZmc19sb29rdXAsCisJLmxpbmsJCQk9IGxpbnZmc19saW5rLAorCS51bmxpbmsJCQk9IGxpbnZmc191bmxpbmssCisJLnN5bWxpbmsJCT0gbGludmZzX3N5bWxpbmssCisJLm1rZGlyCQkJPSBsaW52ZnNfbWtkaXIsCisJLnJtZGlyCQkJPSBsaW52ZnNfcm1kaXIsCisJLm1rbm9kCQkJPSBsaW52ZnNfbWtub2QsCisJLnJlbmFtZQkJCT0gbGludmZzX3JlbmFtZSwKKwkucGVybWlzc2lvbgkJPSBsaW52ZnNfcGVybWlzc2lvbiwKKwkuZ2V0YXR0cgkJPSBsaW52ZnNfZ2V0YXR0ciwKKwkuc2V0YXR0cgkJPSBsaW52ZnNfc2V0YXR0ciwKKwkuc2V0eGF0dHIJCT0gbGludmZzX3NldHhhdHRyLAorCS5nZXR4YXR0cgkJPSBsaW52ZnNfZ2V0eGF0dHIsCisJLmxpc3R4YXR0cgkJPSBsaW52ZnNfbGlzdHhhdHRyLAorCS5yZW1vdmV4YXR0cgkJPSBsaW52ZnNfcmVtb3ZleGF0dHIsCit9OworCitzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBsaW52ZnNfc3ltbGlua19pbm9kZV9vcGVyYXRpb25zID0geworCS5yZWFkbGluawkJPSBnZW5lcmljX3JlYWRsaW5rLAorCS5mb2xsb3dfbGluawkJPSBsaW52ZnNfZm9sbG93X2xpbmssCisJLnB1dF9saW5rCQk9IGxpbnZmc19wdXRfbGluaywKKwkucGVybWlzc2lvbgkJPSBsaW52ZnNfcGVybWlzc2lvbiwKKwkuZ2V0YXR0cgkJPSBsaW52ZnNfZ2V0YXR0ciwKKwkuc2V0YXR0cgkJPSBsaW52ZnNfc2V0YXR0ciwKKwkuc2V0eGF0dHIJCT0gbGludmZzX3NldHhhdHRyLAorCS5nZXR4YXR0cgkJPSBsaW52ZnNfZ2V0eGF0dHIsCisJLmxpc3R4YXR0cgkJPSBsaW52ZnNfbGlzdHhhdHRyLAorCS5yZW1vdmV4YXR0cgkJPSBsaW52ZnNfcmVtb3ZleGF0dHIsCit9OwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9wcy5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfaW9wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNjlhNjIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19pb3BzLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfSU9QU19IX18KKyNkZWZpbmUgX19YRlNfSU9QU19IX18KKworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGxpbnZmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGlub2RlX29wZXJhdGlvbnMgbGludmZzX2Rpcl9pbm9kZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGxpbnZmc19zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7CisKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxpbnZmc19maWxlX29wZXJhdGlvbnM7CitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBsaW52ZnNfaW52aXNfZmlsZV9vcGVyYXRpb25zOworZXh0ZXJuIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbGludmZzX2Rpcl9vcGVyYXRpb25zOworCitleHRlcm4gc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBsaW52ZnNfYW9wczsKKworZXh0ZXJuIGludCBsaW52ZnNfZ2V0X2Jsb2NrKHN0cnVjdCBpbm9kZSAqLCBzZWN0b3JfdCwgc3RydWN0IGJ1ZmZlcl9oZWFkICosIGludCk7CitleHRlcm4gdm9pZCBsaW52ZnNfdW53cml0dGVuX2RvbmUoc3RydWN0IGJ1ZmZlcl9oZWFkICosIGludCk7CisKK2V4dGVybiBpbnQgeGZzX2lvY3RsKHN0cnVjdCBiaHZfZGVzYyAqLCBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCwgdW5zaWduZWQgaW50LCB2b2lkIF9fdXNlciAqKTsKKworI2VuZGlmIC8qIF9fWEZTX0lPUFNfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19saW51eC5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfbGludXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWJiNDEwCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfbGludXguaApAQCAtMCwwICsxLDM3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfTElOVVhfXworI2RlZmluZSBfX1hGU19MSU5VWF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisvKgorICogU29tZSB0eXBlcyBhcmUgY29uZGl0aW9uYWwgZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQgc3lzdGVtLgorICogWEZTX0JJR19CTEtOT1MgbmVlZHMgYmxvY2sgbGF5ZXIgZGlzayBhZGRyZXNzZXMgdG8gYmUgNjQgYml0cy4KKyAqIFhGU19CSUdfSU5VTVMgbmVlZHMgdGhlIFZGUyBpbm9kZSBudW1iZXIgdG8gYmUgNjQgYml0cywgYXMgd2VsbAorICogYXMgcmVxdWlyaW5nIFhGU19CSUdfQkxLTk9TIHRvIGJlIHNldC4KKyAqLworI2lmIGRlZmluZWQoQ09ORklHX0xCRCkgfHwgKEJJVFNfUEVSX0xPTkcgPT0gNjQpCisjIGRlZmluZSBYRlNfQklHX0JMS05PUwkxCisjIGlmIEJJVFNfUEVSX0xPTkcgPT0gNjQKKyMgIGRlZmluZSBYRlNfQklHX0lOVU1TCTEKKyMgZWxzZQorIyAgZGVmaW5lIFhGU19CSUdfSU5VTVMJMAorIyBlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIFhGU19CSUdfQkxLTk9TCTAKKyMgZGVmaW5lIFhGU19CSUdfSU5VTVMJMAorI2VuZGlmCisKKyNpbmNsdWRlIDx4ZnNfdHlwZXMuaD4KKyNpbmNsdWRlIDx4ZnNfYXJjaC5oPgorCisjaW5jbHVkZSA8a21lbS5oPgorI2luY2x1ZGUgPG1ybG9jay5oPgorI2luY2x1ZGUgPHNwaW4uaD4KKyNpbmNsdWRlIDxzdi5oPgorI2luY2x1ZGUgPG11dGV4Lmg+CisjaW5jbHVkZSA8c2VtYS5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgPHN1cHBvcnQvcXNvcnQuaD4KKyNpbmNsdWRlIDxzdXBwb3J0L2t0cmFjZS5oPgorI2luY2x1ZGUgPHN1cHBvcnQvZGVidWcuaD4KKyNpbmNsdWRlIDxzdXBwb3J0L21vdmUuaD4KKyNpbmNsdWRlIDxzdXBwb3J0L3V1aWQuaD4KKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3Zmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3NvcnQuaD4KKworI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisjaW5jbHVkZSA8YXNtL3BhcmFtLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCisjaW5jbHVkZSA8eGZzX2JlaGF2aW9yLmg+CisjaW5jbHVkZSA8eGZzX3Zmcy5oPgorI2luY2x1ZGUgPHhmc19jcmVkLmg+CisjaW5jbHVkZSA8eGZzX3Zub2RlLmg+CisjaW5jbHVkZSA8eGZzX3N0YXRzLmg+CisjaW5jbHVkZSA8eGZzX3N5c2N0bC5oPgorI2luY2x1ZGUgPHhmc19pb3BzLmg+CisjaW5jbHVkZSA8eGZzX3N1cGVyLmg+CisjaW5jbHVkZSA8eGZzX2dsb2JhbHMuaD4KKyNpbmNsdWRlIDx4ZnNfZnNfc3Vici5oPgorI2luY2x1ZGUgPHhmc19scncuaD4KKyNpbmNsdWRlIDx4ZnNfYnVmLmg+CisKKy8qCisgKiBGZWF0dXJlIG1hY3JvcyAoZGlzYWJsZS9lbmFibGUpCisgKi8KKyN1bmRlZiAgSEFWRV9SRUZDQUNIRQkvKiByZWZlcmVuY2UgY2FjaGUgbm90IG5lZWRlZCBmb3IgTkZTIGluIDIuNiAqLworI2RlZmluZSBIQVZFX1NFTkRGSUxFCS8qIHNlbmRmaWxlKDIpIGV4aXN0cyBpbiAyLjYsIGJ1dCBub3QgaW4gMi40ICovCisKKy8qCisgKiBTdGF0ZSBmbGFnIGZvciB1bndyaXR0ZW4gZXh0ZW50IGJ1ZmZlcnMuCisgKgorICogV2UgbmVlZCB0byBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlc2UgYW5kIGRlbGF5ZWQKKyAqIGFsbG9jYXRlIGJ1ZmZlcnMgd2l0aGluIFhGUy4gIFRoZSBnZW5lcmljIElPIHBhdGggY29kZSBkb2VzCisgKiBub3QgbmVlZCB0byBkaXN0aW5ndWlzaCAtIHdlIHVzZSB0aGUgQkhfRGVsYXkgZmxhZyBmb3IgYm90aAorICogZGVsYWxsb2MgYW5kIHRoZXNlIG9uZGlzay11bmluaXRpYWxpc2VkIGJ1ZmZlcnMuCisgKi8KK0JVRkZFUl9GTlMoUHJpdmF0ZVN0YXJ0LCB1bndyaXR0ZW4pOworc3RhdGljIGlubGluZSB2b2lkIHNldF9idWZmZXJfdW53cml0dGVuX2lvKHN0cnVjdCBidWZmZXJfaGVhZCAqYmgpCit7CisJYmgtPmJfZW5kX2lvID0gbGludmZzX3Vud3JpdHRlbl9kb25lOworfQorCisjZGVmaW5lIHJlc3RyaWN0ZWRfY2hvd24JeGZzX3BhcmFtcy5yZXN0cmljdF9jaG93bi52YWwKKyNkZWZpbmUgaXJpeF9zZ2lkX2luaGVyaXQJeGZzX3BhcmFtcy5zZ2lkX2luaGVyaXQudmFsCisjZGVmaW5lIGlyaXhfc3ltbGlua19tb2RlCXhmc19wYXJhbXMuc3ltbGlua19tb2RlLnZhbAorI2RlZmluZSB4ZnNfcGFuaWNfbWFzawkJeGZzX3BhcmFtcy5wYW5pY19tYXNrLnZhbAorI2RlZmluZSB4ZnNfZXJyb3JfbGV2ZWwJCXhmc19wYXJhbXMuZXJyb3JfbGV2ZWwudmFsCisjZGVmaW5lIHhmc19zeW5jZF9jZW50aXNlY3MJeGZzX3BhcmFtcy5zeW5jZF90aW1lci52YWwKKyNkZWZpbmUgeGZzX3N0YXRzX2NsZWFyCQl4ZnNfcGFyYW1zLnN0YXRzX2NsZWFyLnZhbAorI2RlZmluZSB4ZnNfaW5oZXJpdF9zeW5jCXhmc19wYXJhbXMuaW5oZXJpdF9zeW5jLnZhbAorI2RlZmluZSB4ZnNfaW5oZXJpdF9ub2R1bXAJeGZzX3BhcmFtcy5pbmhlcml0X25vZHVtcC52YWwKKyNkZWZpbmUgeGZzX2luaGVyaXRfbm9hdGltZQl4ZnNfcGFyYW1zLmluaGVyaXRfbm9hdGltLnZhbAorI2RlZmluZSB4ZnNfYnVmX3RpbWVyX2NlbnRpc2Vjcwl4ZnNfcGFyYW1zLnhmc19idWZfdGltZXIudmFsCisjZGVmaW5lIHhmc19idWZfYWdlX2NlbnRpc2Vjcwl4ZnNfcGFyYW1zLnhmc19idWZfYWdlLnZhbAorI2RlZmluZSB4ZnNfaW5oZXJpdF9ub3N5bWxpbmtzCXhmc19wYXJhbXMuaW5oZXJpdF9ub3N5bS52YWwKKyNkZWZpbmUgeGZzX3JvdG9yc3RlcAkJeGZzX3BhcmFtcy5yb3RvcnN0ZXAudmFsCisKKyNpZm5kZWYgX19zbXBfcHJvY2Vzc29yX2lkCisjZGVmaW5lIF9fc21wX3Byb2Nlc3Nvcl9pZCgpCXNtcF9wcm9jZXNzb3JfaWQoKQorI2VuZGlmCisjZGVmaW5lIGN1cnJlbnRfY3B1KCkJCV9fc21wX3Byb2Nlc3Nvcl9pZCgpCisjZGVmaW5lIGN1cnJlbnRfcGlkKCkJCShjdXJyZW50LT5waWQpCisjZGVmaW5lIGN1cnJlbnRfZnN1aWQoY3JlZCkJKGN1cnJlbnQtPmZzdWlkKQorI2RlZmluZSBjdXJyZW50X2ZzZ2lkKGNyZWQpCShjdXJyZW50LT5mc2dpZCkKKworI2RlZmluZSBOQlBQCQlQQUdFX1NJWkUKKyNkZWZpbmUgRFBQU0hGVAkJKFBBR0VfU0hJRlQgLSA5KQorI2RlZmluZSBORFBQCQkoMSA8PCAoUEFHRV9TSElGVCAtIDkpKQorI2RlZmluZSBkdG9wKEREKQkoKChERCkgKyBORFBQIC0gMSkgPj4gRFBQU0hGVCkKKyNkZWZpbmUgZHRvcHQoREQpCSgoREQpID4+IERQUFNIRlQpCisjZGVmaW5lIGRwb2ZmKEREKQkoKEREKSAmIChORFBQLTEpKQorCisjZGVmaW5lIE5CQlkJCTgJCS8qIG51bWJlciBvZiBiaXRzIHBlciBieXRlICovCisjZGVmaW5lCU5CUEMJCVBBR0VfU0laRQkvKiBOdW1iZXIgb2YgYnl0ZXMgcGVyIGNsaWNrICovCisjZGVmaW5lCUJQQ1NISUZUCVBBR0VfU0hJRlQJLyogTE9HMihOQlBDKSBpZiBleGFjdCAqLworCisvKgorICogU2l6ZSBvZiBibG9jayBkZXZpY2UgaS9vIGlzIHBhcmFtZXRlcml6ZWQgaGVyZS4KKyAqIEN1cnJlbnRseSB0aGUgc3lzdGVtIHN1cHBvcnRzIHBhZ2Utc2l6ZWQgaS9vLgorICovCisjZGVmaW5lCUJMS0RFVl9JT1NISUZUCQlCUENTSElGVAorI2RlZmluZQlCTEtERVZfSU9TSVpFCQkoMTw8QkxLREVWX0lPU0hJRlQpCisvKiBudW1iZXIgb2YgQkIncyBwZXIgYmxvY2sgZGV2aWNlIGJsb2NrICovCisjZGVmaW5lCUJMS0RFVl9CQgkJQlRPQkIoQkxLREVWX0lPU0laRSkKKworLyogYnl0ZXMgdG8gY2xpY2tzICovCisjZGVmaW5lCWJ0b2MoeCkJCSgoKF9fcHN1bnNpZ25lZF90KSh4KSsoTkJQQy0xKSk+PkJQQ1NISUZUKQorI2RlZmluZQlidG9jdCh4KQkoKF9fcHN1bnNpZ25lZF90KSh4KT4+QlBDU0hJRlQpCisjZGVmaW5lCWJ0b2M2NCh4KQkoKChfX3VpbnQ2NF90KSh4KSsoTkJQQy0xKSk+PkJQQ1NISUZUKQorI2RlZmluZQlidG9jdDY0KHgpCSgoX191aW50NjRfdCkoeCk+PkJQQ1NISUZUKQorI2RlZmluZQlpb19idG9jKHgpCSgoKF9fcHN1bnNpZ25lZF90KSh4KSsoSU9fTkJQQy0xKSk+PklPX0JQQ1NISUZUKQorI2RlZmluZQlpb19idG9jdCh4KQkoKF9fcHN1bnNpZ25lZF90KSh4KT4+SU9fQlBDU0hJRlQpCisKKy8qIG9mZl90IGJ5dGVzIHRvIGNsaWNrcyAqLworI2RlZmluZSBvZmZ0b2MoeCkgICAgICAgKCgoX191aW50NjRfdCkoeCkrKE5CUEMtMSkpPj5CUENTSElGVCkKKyNkZWZpbmUgb2ZmdG9jdCh4KSAgICAgICgoeGZzX29mZl90KSh4KT4+QlBDU0hJRlQpCisKKy8qIGNsaWNrcyB0byBvZmZfdCBieXRlcyAqLworI2RlZmluZQljdG9vZmYoeCkJKCh4ZnNfb2ZmX3QpKHgpPDxCUENTSElGVCkKKworLyogY2xpY2tzIHRvIGJ5dGVzICovCisjZGVmaW5lCWN0b2IoeCkJCSgoX19wc3Vuc2lnbmVkX3QpKHgpPDxCUENTSElGVCkKKyNkZWZpbmUgYnRvY3QoeCkgICAgICAgICgoX19wc3Vuc2lnbmVkX3QpKHgpPj5CUENTSElGVCkKKyNkZWZpbmUJY3RvYjY0KHgpCSgoX191aW50NjRfdCkoeCk8PEJQQ1NISUZUKQorI2RlZmluZQlpb19jdG9iKHgpCSgoX19wc3Vuc2lnbmVkX3QpKHgpPDxJT19CUENTSElGVCkKKworLyogYnl0ZXMgdG8gY2xpY2tzICovCisjZGVmaW5lIGJ0b2MoeCkgICAgICAgICAoKChfX3BzdW5zaWduZWRfdCkoeCkrKE5CUEMtMSkpPj5CUENTSElGVCkKKworI2lmbmRlZiBDRUxMX0NBUEFCTEUKKyNkZWZpbmUgRlNDX05PVElGWV9OQU1FX0NIQU5HRUQodnApCisjZW5kaWYKKworI2lmbmRlZiBFTk9BVFRSCisjZGVmaW5lIEVOT0FUVFIJCUVOT0RBVEEJCS8qIEF0dHJpYnV0ZSBub3QgZm91bmQgKi8KKyNlbmRpZgorCisvKiBOb3RlOiBFV1JPTkdGUyBuZXZlciB2aXNpYmxlIG91dHNpZGUgdGhlIGtlcm5lbCAqLworI2RlZmluZQlFV1JPTkdGUwlFSU5WQUwJCS8qIE1vdW50IHdpdGggd3JvbmcgZmlsZXN5c3RlbSB0eXBlICovCisKKy8qCisgKiBYWFggRUZTQ09SUlVQVEVEIG5lZWRzIGEgcmVhbCB2YWx1ZSBpbiBlcnJuby5oLiBhc20taTM4Ni9lcnJuby5oIHdvbid0CisgKiAgICAgcmV0dXJuIGNvZGVzIG91dCBvZiBpdHMga25vd24gcmFuZ2UgaW4gZXJybm8uCisgKiBYWFggQWxzbyBub3RlOiBuZWVkcyB0byBiZSA8IDEwMDAgYW5kIGZhaXJseSB1bmlxdWUgb24gTGludXggKG11c3RuJ3QKKyAqICAgICBjb25mbGljdCB3aXRoIGFueSBjb2RlIHdlIHVzZSBhbHJlYWR5IG9yIGFueSBjb2RlIGEgZHJpdmVyIG1heSB1c2UpCisgKiBYWFggU29tZSBvcHRpb25zIChjdXJyZW50bHkgd2UgZG8gIzIpOgorICoJMS8gTmV3IGVycm9yIGNvZGUgWyJGaWxlc3lzdGVtIGlzIGNvcnJ1cHRlZCIsIF9hZnRlcl8gZ2xpYmMgdXBkYXRlZF0KKyAqCTIvIDk5MCBbIlVua25vd24gZXJyb3IgOTkwIl0KKyAqCTMvIEVVQ0xFQU4gWyJTdHJ1Y3R1cmUgbmVlZHMgY2xlYW5pbmciXQorICoJNC8gQ29udmVydCBFRlNDT1JSVVBURUQgdG8gRUlPIFtqdXN0IHByaW9yIHRvIHJldHVybiBpbnRvIHVzZXJzcGFjZV0KKyAqLworI2RlZmluZSBFRlNDT1JSVVBURUQgICAgOTkwCQkvKiBGaWxlc3lzdGVtIGlzIGNvcnJ1cHRlZCAqLworCisjZGVmaW5lIFNZTkNIUk9OSVpFKCkJYmFycmllcigpCisjZGVmaW5lIF9fcmV0dXJuX2FkZHJlc3MgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApCisKKy8qCisgKiBJUklYIChCU0QpIHF1b3RhY3RsIG1ha2VzIHVzZSBvZiBzZXBhcmF0ZSBjb21tYW5kcyBmb3IgdXNlci9ncm91cCwKKyAqIHdoZXJlYXMgb24gTGludXggdGhlIHN5c2NhbGwgZW5jb2RlcyB0aGlzIGluZm9ybWF0aW9uIGludG8gdGhlIGNtZAorICogZmllbGQgKHNlZSB0aGUgUUNNRCBtYWNybyBpbiBxdW90YS5oKS4gIFRoZXNlIG1hY3JvcyBoZWxwIGtlZXAgdGhlCisgKiBjb2RlIHBvcnRhYmxlIC0gdGhleSBhcmUgbm90IHZpc2libGUgZnJvbSB0aGUgc3lzY2FsbCBpbnRlcmZhY2UuCisgKi8KKyNkZWZpbmUgUV9YU0VUR1FMSU0JWFFNX0NNRCgweDgpCS8qIHNldCBncm91cHMgZGlzayBsaW1pdHMgKi8KKyNkZWZpbmUgUV9YR0VUR1FVT1RBCVhRTV9DTUQoMHg5KQkvKiBnZXQgZ3JvdXBzIGRpc2sgbGltaXRzICovCisKKy8qIElSSVggdXNlcyBhIGR5bmFtaWMgc2l6aW5nIGFsZ29yaXRobSAobmRxdW90ID0gMjAwICsgbnVtcHJvY3MqMikgKi8KKy8qIHdlIG1heSB3ZWxsIG5lZWQgdG8gZmluZS10dW5lIHRoaXMgaWYgaXQgZXZlciBiZWNvbWVzIGFuIGlzc3VlLiAgKi8KKyNkZWZpbmUgRFFVT1RfTUFYX0hFVVJJU1RJQwkxMDI0CS8qIE5SX0RRVU9UUyAqLworI2RlZmluZSBuZHF1b3QJCQlEUVVPVF9NQVhfSEVVUklTVElDCisKKy8qIElSSVggdXNlcyB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBuYW1lIGNhY2hlIHRvIGd1ZXNzIGEgZ29vZCB2YWx1ZSAqLworLyogLSB0aGlzIGlzbid0IHRoZSBzYW1lIGJ1dCBpcyBhIGdvb2QgZW5vdWdoIHN0YXJ0aW5nIHBvaW50IGZvciBub3cuICovCisjZGVmaW5lIERRVU9UX0hBU0hfSEVVUklTVElDCWZpbGVzX3N0YXQubnJfZmlsZXMKKworLyogSVJJWCBpbm9kZXMgbWFpbnRhaW4gdGhlIHByb2plY3QgSUQgYWxzbywgemVybyB0aGlzIGZpZWxkIG9uIExpbnV4ICovCisjZGVmaW5lIERFRkFVTFRfUFJPSklECTAKKyNkZWZpbmUgZGZsdHByaWQJREVGQVVMVF9QUk9KSUQKKworI2RlZmluZSBNQVhQQVRITEVOCTEwMjQKKworI2RlZmluZSBNSU4oYSxiKQkobWluKGEsYikpCisjZGVmaW5lIE1BWChhLGIpCShtYXgoYSxiKSkKKyNkZWZpbmUgaG93bWFueSh4LCB5KQkoKCh4KSsoKHkpLTEpKS8oeSkpCisjZGVmaW5lIHJvdW5kdXAoeCwgeSkJKCgoKHgpKygoeSktMSkpLyh5KSkqKHkpKQorCisjZGVmaW5lIHhmc19zdGFja190cmFjZSgpCWR1bXBfc3RhY2soKQorCisjZGVmaW5lIHhmc19pdHJ1bmNhdGVfZGF0YShpcCwgb2ZmKQlcCisJKC12bXRydW5jYXRlKExJTlZGU19HRVRfSVAoWEZTX0lUT1YoaXApKSwgKG9mZikpKQorCisKKy8qIE1vdmUgdGhlIGtlcm5lbCBkb19kaXYgZGVmaW5pdGlvbiBvZmYgdG8gb25lIHNpZGUgKi8KKworI2lmIGRlZmluZWQgX19pMzg2X18KKy8qIEZvciBpYTMyIHdlIG5lZWQgdG8gcHVsbCBzb21lIHRyaWNrcyB0byBnZXQgcGFzdCB2YXJpb3VzIHZlcnNpb25zCisgKiBvZiB0aGUgY29tcGlsZXIgd2hpY2ggZG8gbm90IGxpa2UgdXMgdXNpbmcgZG9fZGl2IGluIHRoZSBtaWRkbGUKKyAqIG9mIGxhcmdlIGZ1bmN0aW9ucy4KKyAqLworc3RhdGljIGlubGluZSBfX3UzMiB4ZnNfZG9fZGl2KHZvaWQgKmEsIF9fdTMyIGIsIGludCBuKQoreworCV9fdTMyCW1vZDsKKworCXN3aXRjaCAobikgeworCQljYXNlIDQ6CisJCQltb2QgPSAqKF9fdTMyICopYSAlIGI7CisJCQkqKF9fdTMyICopYSA9ICooX191MzIgKilhIC8gYjsKKwkJCXJldHVybiBtb2Q7CisJCWNhc2UgODoKKwkJCXsKKwkJCXVuc2lnbmVkIGxvbmcgX191cHBlciwgX19sb3csIF9faGlnaCwgX19tb2Q7CisJCQlfX3U2NAljID0gKihfX3U2NCAqKWE7CisJCQlfX3VwcGVyID0gX19oaWdoID0gYyA+PiAzMjsKKwkJCV9fbG93ID0gYzsKKwkJCWlmIChfX2hpZ2gpIHsKKwkJCQlfX3VwcGVyID0gX19oaWdoICUgKGIpOworCQkJCV9faGlnaCA9IF9faGlnaCAvIChiKTsKKwkJCX0KKwkJCWFzbSgiZGl2bCAlMiI6Ij1hIiAoX19sb3cpLCAiPWQiIChfX21vZCk6InJtIiAoYiksICIwIiAoX19sb3cpLCAiMSIgKF9fdXBwZXIpKTsKKwkJCWFzbSgiIjoiPUEiIChjKToiYSIgKF9fbG93KSwiZCIgKF9faGlnaCkpOworCQkJKihfX3U2NCAqKWEgPSBjOworCQkJcmV0dXJuIF9fbW9kOworCQkJfQorCX0KKworCS8qIE5PVFJFQUNIRUQgKi8KKwlyZXR1cm4gMDsKK30KKworLyogU2lkZSBlZmZlY3QgZnJlZSA2NCBiaXQgbW9kIG9wZXJhdGlvbiAqLworc3RhdGljIGlubGluZSBfX3UzMiB4ZnNfZG9fbW9kKHZvaWQgKmEsIF9fdTMyIGIsIGludCBuKQoreworCXN3aXRjaCAobikgeworCQljYXNlIDQ6CisJCQlyZXR1cm4gKihfX3UzMiAqKWEgJSBiOworCQljYXNlIDg6CisJCQl7CisJCQl1bnNpZ25lZCBsb25nIF9fdXBwZXIsIF9fbG93LCBfX2hpZ2gsIF9fbW9kOworCQkJX191NjQJYyA9ICooX191NjQgKilhOworCQkJX191cHBlciA9IF9faGlnaCA9IGMgPj4gMzI7CisJCQlfX2xvdyA9IGM7CisJCQlpZiAoX19oaWdoKSB7CisJCQkJX191cHBlciA9IF9faGlnaCAlIChiKTsKKwkJCQlfX2hpZ2ggPSBfX2hpZ2ggLyAoYik7CisJCQl9CisJCQlhc20oImRpdmwgJTIiOiI9YSIgKF9fbG93KSwgIj1kIiAoX19tb2QpOiJybSIgKGIpLCAiMCIgKF9fbG93KSwgIjEiIChfX3VwcGVyKSk7CisJCQlhc20oIiI6Ij1BIiAoYyk6ImEiIChfX2xvdyksImQiIChfX2hpZ2gpKTsKKwkJCXJldHVybiBfX21vZDsKKwkJCX0KKwl9CisKKwkvKiBOT1RSRUFDSEVEICovCisJcmV0dXJuIDA7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBfX3UzMiB4ZnNfZG9fZGl2KHZvaWQgKmEsIF9fdTMyIGIsIGludCBuKQoreworCV9fdTMyCW1vZDsKKworCXN3aXRjaCAobikgeworCQljYXNlIDQ6CisJCQltb2QgPSAqKF9fdTMyICopYSAlIGI7CisJCQkqKF9fdTMyICopYSA9ICooX191MzIgKilhIC8gYjsKKwkJCXJldHVybiBtb2Q7CisJCWNhc2UgODoKKwkJCW1vZCA9IGRvX2RpdigqKF9fdTY0ICopYSwgYik7CisJCQlyZXR1cm4gbW9kOworCX0KKworCS8qIE5PVFJFQUNIRUQgKi8KKwlyZXR1cm4gMDsKK30KKworLyogU2lkZSBlZmZlY3QgZnJlZSA2NCBiaXQgbW9kIG9wZXJhdGlvbiAqLworc3RhdGljIGlubGluZSBfX3UzMiB4ZnNfZG9fbW9kKHZvaWQgKmEsIF9fdTMyIGIsIGludCBuKQoreworCXN3aXRjaCAobikgeworCQljYXNlIDQ6CisJCQlyZXR1cm4gKihfX3UzMiAqKWEgJSBiOworCQljYXNlIDg6CisJCQl7CisJCQlfX3U2NAljID0gKihfX3U2NCAqKWE7CisJCQlyZXR1cm4gZG9fZGl2KGMsIGIpOworCQkJfQorCX0KKworCS8qIE5PVFJFQUNIRUQgKi8KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisjdW5kZWYgZG9fZGl2CisjZGVmaW5lIGRvX2RpdihhLCBiKQl4ZnNfZG9fZGl2KCYoYSksIChiKSwgc2l6ZW9mKGEpKQorI2RlZmluZSBkb19tb2QoYSwgYikJeGZzX2RvX21vZCgmKGEpLCAoYiksIHNpemVvZihhKSkKKworc3RhdGljIGlubGluZSBfX3VpbnQ2NF90IHJvdW5kdXBfNjQoX191aW50NjRfdCB4LCBfX3VpbnQzMl90IHkpCit7CisJeCArPSB5IC0gMTsKKwlkb19kaXYoeCwgeSk7CisJcmV0dXJuKHggKiB5KTsKK30KKworI2RlZmluZSBxc29ydChhLCBuLCBzLCBjbXApIHNvcnQoYSwgbiwgcywgY21wLCBOVUxMKQorCisjZW5kaWYgLyogX19YRlNfTElOVVhfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfbHJ3LmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19scncuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjE0NWZkCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfbHJ3LmMKQEAgLTAsMCArMSwxMDgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworLyoKKyAqICBmcy94ZnMvbGludXgveGZzX2xydy5jIChMaW51eCBSZWFkIFdyaXRlIHN0dWZmKQorICoKKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisKKyNpbmNsdWRlICJ4ZnNfZnMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfcXVvdGEuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2JtYXAuaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCisjaW5jbHVkZSAieGZzX3J0YWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKKyNpbmNsdWRlICJ4ZnNfaXRhYmxlLmgiCisjaW5jbHVkZSAieGZzX3J3LmgiCisjaW5jbHVkZSAieGZzX2FjbC5oIgorI2luY2x1ZGUgInhmc19jYXAuaCIKKyNpbmNsdWRlICJ4ZnNfbWFjLmgiCisjaW5jbHVkZSAieGZzX2F0dHIuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgorI2luY2x1ZGUgInhmc19idWZfaXRlbS5oIgorI2luY2x1ZGUgInhmc191dGlscy5oIgorI2luY2x1ZGUgInhmc19pb21hcC5oIgorCisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgorCisKKyNpZiBkZWZpbmVkKFhGU19SV19UUkFDRSkKK3ZvaWQKK3hmc19yd19lbnRlcl90cmFjZSgKKwlpbnQJCQl0YWcsCisJeGZzX2lvY29yZV90CQkqaW8sCisJdm9pZAkJCSpkYXRhLAorCXNpemVfdAkJCXNlZ3MsCisJbG9mZl90CQkJb2Zmc2V0LAorCWludAkJCWlvZmxhZ3MpCit7CisJeGZzX2lub2RlX3QJKmlwID0gWEZTX0lPX0lOT0RFKGlvKTsKKworCWlmIChpcC0+aV9yd3RyYWNlID09IE5VTEwpCisJCXJldHVybjsKKwlrdHJhY2VfZW50ZXIoaXAtPmlfcnd0cmFjZSwKKwkJKHZvaWQgKikodW5zaWduZWQgbG9uZyl0YWcsCisJCSh2b2lkICopaXAsCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKSgoaXAtPmlfZC5kaV9zaXplID4+IDMyKSAmIDB4ZmZmZmZmZmYpKSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKGlwLT5pX2QuZGlfc2l6ZSAmIDB4ZmZmZmZmZmYpKSwKKwkJKHZvaWQgKilkYXRhLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZylzZWdzKSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKChvZmZzZXQgPj4gMzIpICYgMHhmZmZmZmZmZikpLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykob2Zmc2V0ICYgMHhmZmZmZmZmZikpLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZylpb2ZsYWdzKSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKChpby0+aW9fbmV3X3NpemUgPj4gMzIpICYgMHhmZmZmZmZmZikpLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoaW8tPmlvX25ld19zaXplICYgMHhmZmZmZmZmZikpLAorCQkodm9pZCAqKU5VTEwsCisJCSh2b2lkICopTlVMTCwKKwkJKHZvaWQgKilOVUxMLAorCQkodm9pZCAqKU5VTEwsCisJCSh2b2lkICopTlVMTCk7Cit9CisKK3ZvaWQKK3hmc19pbnZhbF9jYWNoZWRfdHJhY2UoCisJeGZzX2lvY29yZV90CSppbywKKwl4ZnNfb2ZmX3QJb2Zmc2V0LAorCXhmc19vZmZfdAlsZW4sCisJeGZzX29mZl90CWZpcnN0LAorCXhmc19vZmZfdAlsYXN0KQoreworCXhmc19pbm9kZV90CSppcCA9IFhGU19JT19JTk9ERShpbyk7CisKKwlpZiAoaXAtPmlfcnd0cmFjZSA9PSBOVUxMKQorCQlyZXR1cm47CisJa3RyYWNlX2VudGVyKGlwLT5pX3J3dHJhY2UsCisJCSh2b2lkICopKF9fcHNpbnRfdClYRlNfSU5WQUxfQ0FDSEVELAorCQkodm9pZCAqKWlwLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoKG9mZnNldCA+PiAzMikgJiAweGZmZmZmZmZmKSksCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKShvZmZzZXQgJiAweGZmZmZmZmZmKSksCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKSgobGVuID4+IDMyKSAmIDB4ZmZmZmZmZmYpKSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKGxlbiAmIDB4ZmZmZmZmZmYpKSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKChmaXJzdCA+PiAzMikgJiAweGZmZmZmZmZmKSksCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKShmaXJzdCAmIDB4ZmZmZmZmZmYpKSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKChsYXN0ID4+IDMyKSAmIDB4ZmZmZmZmZmYpKSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKGxhc3QgJiAweGZmZmZmZmZmKSksCisJCSh2b2lkICopTlVMTCwKKwkJKHZvaWQgKilOVUxMLAorCQkodm9pZCAqKU5VTEwsCisJCSh2b2lkICopTlVMTCwKKwkJKHZvaWQgKilOVUxMLAorCQkodm9pZCAqKU5VTEwpOworfQorI2VuZGlmCisKKy8qCisgKgl4ZnNfaW96ZXJvCisgKgorICoJeGZzX2lvemVybyBjbGVhcnMgdGhlIHNwZWNpZmllZCByYW5nZSBvZiBidWZmZXIgc3VwcGxpZWQsCisgKglhbmQgbWFya3MgYWxsIHRoZSBhZmZlY3RlZCBibG9ja3MgYXMgdmFsaWQgYW5kIG1vZGlmaWVkLiAgSWYKKyAqCWFuIGFmZmVjdGVkIGJsb2NrIGlzIG5vdCBhbGxvY2F0ZWQsIGl0IHdpbGwgYmUgYWxsb2NhdGVkLiAgSWYKKyAqCWFuIGFmZmVjdGVkIGJsb2NrIGlzIG5vdCBjb21wbGV0ZWx5IG92ZXJ3cml0dGVuLCBhbmQgaXMgbm90CisgKgl2YWxpZCBiZWZvcmUgdGhlIG9wZXJhdGlvbiwgaXQgd2lsbCBiZSByZWFkIGZyb20gZGlzayBiZWZvcmUKKyAqCWJlaW5nIHBhcnRpYWxseSB6ZXJvZWQuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19pb3plcm8oCisJc3RydWN0IGlub2RlCQkqaXAsCS8qIGlub2RlCQkJKi8KKwlsb2ZmX3QJCQlwb3MsCS8qIG9mZnNldCBpbiBmaWxlCQkqLworCXNpemVfdAkJCWNvdW50LAkvKiBzaXplIG9mIGRhdGEgdG8gemVybwkJKi8KKwlsb2ZmX3QJCQllbmRfc2l6ZSkJLyogbWF4IGZpbGUgc2l6ZSB0byBzZXQgKi8KK3sKKwl1bnNpZ25lZAkJYnl0ZXM7CisJc3RydWN0IHBhZ2UJCSpwYWdlOworCXN0cnVjdCBhZGRyZXNzX3NwYWNlCSptYXBwaW5nOworCWNoYXIJCQkqa2FkZHI7CisJaW50CQkJc3RhdHVzOworCisJbWFwcGluZyA9IGlwLT5pX21hcHBpbmc7CisJZG8geworCQl1bnNpZ25lZCBsb25nIGluZGV4LCBvZmZzZXQ7CisKKwkJb2Zmc2V0ID0gKHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLTEpKTsgLyogV2l0aGluIHBhZ2UgKi8KKwkJaW5kZXggPSBwb3MgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwkJYnl0ZXMgPSBQQUdFX0NBQ0hFX1NJWkUgLSBvZmZzZXQ7CisJCWlmIChieXRlcyA+IGNvdW50KQorCQkJYnl0ZXMgPSBjb3VudDsKKworCQlzdGF0dXMgPSAtRU5PTUVNOworCQlwYWdlID0gZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsIGluZGV4KTsKKwkJaWYgKCFwYWdlKQorCQkJYnJlYWs7CisKKwkJa2FkZHIgPSBrbWFwKHBhZ2UpOworCQlzdGF0dXMgPSBtYXBwaW5nLT5hX29wcy0+cHJlcGFyZV93cml0ZShOVUxMLCBwYWdlLCBvZmZzZXQsCisJCQkJCQkJb2Zmc2V0ICsgYnl0ZXMpOworCQlpZiAoc3RhdHVzKSB7CisJCQlnb3RvIHVubG9jazsKKwkJfQorCisJCW1lbXNldCgodm9pZCAqKSAoa2FkZHIgKyBvZmZzZXQpLCAwLCBieXRlcyk7CisJCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCQlzdGF0dXMgPSBtYXBwaW5nLT5hX29wcy0+Y29tbWl0X3dyaXRlKE5VTEwsIHBhZ2UsIG9mZnNldCwKKwkJCQkJCQlvZmZzZXQgKyBieXRlcyk7CisJCWlmICghc3RhdHVzKSB7CisJCQlwb3MgKz0gYnl0ZXM7CisJCQljb3VudCAtPSBieXRlczsKKwkJCWlmIChwb3MgPiBpX3NpemVfcmVhZChpcCkpCisJCQkJaV9zaXplX3dyaXRlKGlwLCBwb3MgPCBlbmRfc2l6ZSA/IHBvcyA6IGVuZF9zaXplKTsKKwkJfQorCit1bmxvY2s6CisJCWt1bm1hcChwYWdlKTsKKwkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJaWYgKHN0YXR1cykKKwkJCWJyZWFrOworCX0gd2hpbGUgKGNvdW50KTsKKworCXJldHVybiAoLXN0YXR1cyk7Cit9CisKKy8qCisgKiB4ZnNfaW52YWxfY2FjaGVkX3BhZ2VzCisgKiAKKyAqIFRoaXMgcm91dGluZSBpcyByZXNwb25zaWJsZSBmb3Iga2VlcGluZyBkaXJlY3QgSS9PIGFuZCBidWZmZXJlZCBJL08KKyAqIHNvbWV3aGF0IGNvaGVyZW50LiAgRnJvbSBoZXJlIHdlIG1ha2Ugc3VyZSB0aGF0IHdlJ3JlIGF0IGxlYXN0CisgKiB0ZW1wb3JhcmlseSBob2xkaW5nIHRoZSBpbm9kZSBJL08gbG9jayBleGNsdXNpdmVseSBhbmQgdGhlbiBjYWxsCisgKiB0aGUgcGFnZSBjYWNoZSB0byBmbHVzaCBhbmQgaW52YWxpZGF0ZSBhbnkgY2FjaGVkIHBhZ2VzLiAgSWYgdGhlcmUKKyAqIGFyZSBubyBjYWNoZWQgcGFnZXMgdGhpcyByb3V0aW5lIHdpbGwgYmUgdmVyeSBxdWljay4KKyAqLwordm9pZAoreGZzX2ludmFsX2NhY2hlZF9wYWdlcygKKwl2bm9kZV90CQkqdnAsCisJeGZzX2lvY29yZV90CSppbywKKwl4ZnNfb2ZmX3QJb2Zmc2V0LAorCWludAkJd3JpdGUsCisJaW50CQlyZWxvY2spCit7CisJaWYgKFZOX0NBQ0hFRCh2cCkpIHsKKwkJeGZzX2ludmFsX2NhY2hlZF90cmFjZShpbywgb2Zmc2V0LCAtMSwgY3Rvb2ZmKG9mZnRvY3Qob2Zmc2V0KSksIC0xKTsKKwkJVk9QX0ZMVVNISU5WQUxfUEFHRVModnAsIGN0b29mZihvZmZ0b2N0KG9mZnNldCkpLCAtMSwgRklfUkVNQVBGX0xPQ0tFRCk7CisJfQorCit9CisKK3NzaXplX3QJCQkvKiBieXRlcyByZWFkLCBvciAoLSkgIGVycm9yICovCit4ZnNfcmVhZCgKKwliaHZfZGVzY190CQkqYmRwLAorCXN0cnVjdCBraW9jYgkJKmlvY2IsCisJY29uc3Qgc3RydWN0IGlvdmVjCSppb3ZwLAorCXVuc2lnbmVkIGludAkJc2VncywKKwlsb2ZmX3QJCQkqb2Zmc2V0LAorCWludAkJCWlvZmxhZ3MsCisJY3JlZF90CQkJKmNyZWRwKQoreworCXN0cnVjdCBmaWxlCQkqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CisJc3RydWN0IGlub2RlCQkqaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CisJc2l6ZV90CQkJc2l6ZSA9IDA7CisJc3NpemVfdAkJCXJldDsKKwl4ZnNfZnNpemVfdAkJbjsKKwl4ZnNfaW5vZGVfdAkJKmlwOworCXhmc19tb3VudF90CQkqbXA7CisJdm5vZGVfdAkJCSp2cDsKKwl1bnNpZ25lZCBsb25nCQlzZWc7CisKKwlpcCA9IFhGU19CSFZUT0koYmRwKTsKKwl2cCA9IEJIVl9UT19WTk9ERShiZHApOworCW1wID0gaXAtPmlfbW91bnQ7CisKKwlYRlNfU1RBVFNfSU5DKHhzX3JlYWRfY2FsbHMpOworCisJLyogU1RBUlQgY29weSAmIHdhc3RlIGZyb20gZmlsZW1hcC5jICovCisJZm9yIChzZWcgPSAwOyBzZWcgPCBzZWdzOyBzZWcrKykgeworCQljb25zdCBzdHJ1Y3QgaW92ZWMgKml2ID0gJmlvdnBbc2VnXTsKKworCQkvKgorCQkgKiBJZiBhbnkgc2VnbWVudCBoYXMgYSBuZWdhdGl2ZSBsZW5ndGgsIG9yIHRoZSBjdW11bGF0aXZlCisJCSAqIGxlbmd0aCBldmVyIHdyYXBzIG5lZ2F0aXZlIHRoZW4gcmV0dXJuIC1FSU5WQUwuCisJCSAqLworCQlzaXplICs9IGl2LT5pb3ZfbGVuOworCQlpZiAodW5saWtlbHkoKHNzaXplX3QpKHNpemV8aXYtPmlvdl9sZW4pIDwgMCkpCisJCQlyZXR1cm4gWEZTX0VSUk9SKC1FSU5WQUwpOworCX0KKwkvKiBFTkQgY29weSAmIHdhc3RlIGZyb20gZmlsZW1hcC5jICovCisKKwlpZiAodW5saWtlbHkoaW9mbGFncyAmIElPX0lTRElSRUNUKSkgeworCQl4ZnNfYnVmdGFyZ190CSp0YXJnZXQgPQorCQkJKGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FKSA/CisJCQkJbXAtPm1fcnRkZXZfdGFyZ3AgOiBtcC0+bV9kZGV2X3RhcmdwOworCQlpZiAoKCpvZmZzZXQgJiB0YXJnZXQtPnBicl9zbWFzaykgfHwKKwkJICAgIChzaXplICYgdGFyZ2V0LT5wYnJfc21hc2spKSB7CisJCQlpZiAoKm9mZnNldCA9PSBpcC0+aV9kLmRpX3NpemUpIHsKKwkJCQlyZXR1cm4gKDApOworCQkJfQorCQkJcmV0dXJuIC1YRlNfRVJST1IoRUlOVkFMKTsKKwkJfQorCX0KKworCW4gPSBYRlNfTUFYSU9GRlNFVChtcCkgLSAqb2Zmc2V0OworCWlmICgobiA8PSAwKSB8fCAoc2l6ZSA9PSAwKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAobiA8IHNpemUpCisJCXNpemUgPSBuOworCisJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKSB7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmICh1bmxpa2VseShpb2ZsYWdzICYgSU9fSVNESVJFQ1QpKQorCQlkb3duKCZpbm9kZS0+aV9zZW0pOworCXhmc19pbG9jayhpcCwgWEZTX0lPTE9DS19TSEFSRUQpOworCisJaWYgKERNX0VWRU5UX0VOQUJMRUQodnAtPnZfdmZzcCwgaXAsIERNX0VWRU5UX1JFQUQpICYmCisJICAgICEoaW9mbGFncyAmIElPX0lOVklTKSkgeworCQl2cndsb2NrX3QgbG9ja3R5cGUgPSBWUldMT0NLX1JFQUQ7CisKKwkJcmV0ID0gLVhGU19TRU5EX0RBVEEobXAsIERNX0VWRU5UX1JFQUQsCisJCQkJCUJIVl9UT19WTk9ERShiZHApLCAqb2Zmc2V0LCBzaXplLAorCQkJCQlGSUxQX0RFTEFZX0ZMQUcoZmlsZSksICZsb2NrdHlwZSk7CisJCWlmIChyZXQpIHsKKwkJCXhmc19pdW5sb2NrKGlwLCBYRlNfSU9MT0NLX1NIQVJFRCk7CisJCQlnb3RvIHVubG9ja19pc2VtOworCQl9CisJfQorCisJeGZzX3J3X2VudGVyX3RyYWNlKFhGU19SRUFEX0VOVEVSLCAmaXAtPmlfaW9jb3JlLAorCQkJCSh2b2lkICopaW92cCwgc2VncywgKm9mZnNldCwgaW9mbGFncyk7CisJcmV0ID0gX19nZW5lcmljX2ZpbGVfYWlvX3JlYWQoaW9jYiwgaW92cCwgc2Vncywgb2Zmc2V0KTsKKwlpZiAocmV0ID09IC1FSU9DQlFVRVVFRCAmJiAhKGlvZmxhZ3MgJiBJT19JU0FJTykpCisJCXJldCA9IHdhaXRfb25fc3luY19raW9jYihpb2NiKTsKKwlpZiAocmV0ID4gMCkKKwkJWEZTX1NUQVRTX0FERCh4c19yZWFkX2J5dGVzLCByZXQpOworCisJeGZzX2l1bmxvY2soaXAsIFhGU19JT0xPQ0tfU0hBUkVEKTsKKworCWlmIChsaWtlbHkoIShpb2ZsYWdzICYgSU9fSU5WSVMpKSkKKwkJeGZzX2ljaGd0aW1lKGlwLCBYRlNfSUNIR1RJTUVfQUNDKTsKKwordW5sb2NrX2lzZW06CisJaWYgKHVubGlrZWx5KGlvZmxhZ3MgJiBJT19JU0RJUkVDVCkpCisJCXVwKCZpbm9kZS0+aV9zZW0pOworCXJldHVybiByZXQ7Cit9CisKK3NzaXplX3QKK3hmc19zZW5kZmlsZSgKKwliaHZfZGVzY190CQkqYmRwLAorCXN0cnVjdCBmaWxlCQkqZmlscCwKKwlsb2ZmX3QJCQkqb2Zmc2V0LAorCWludAkJCWlvZmxhZ3MsCisJc2l6ZV90CQkJY291bnQsCisJcmVhZF9hY3Rvcl90CQlhY3RvciwKKwl2b2lkCQkJKnRhcmdldCwKKwljcmVkX3QJCQkqY3JlZHApCit7CisJc3NpemVfdAkJCXJldDsKKwl4ZnNfZnNpemVfdAkJbjsKKwl4ZnNfaW5vZGVfdAkJKmlwOworCXhmc19tb3VudF90CQkqbXA7CisJdm5vZGVfdAkJCSp2cDsKKworCWlwID0gWEZTX0JIVlRPSShiZHApOworCXZwID0gQkhWX1RPX1ZOT0RFKGJkcCk7CisJbXAgPSBpcC0+aV9tb3VudDsKKworCVhGU19TVEFUU19JTkMoeHNfcmVhZF9jYWxscyk7CisKKwluID0gWEZTX01BWElPRkZTRVQobXApIC0gKm9mZnNldDsKKwlpZiAoKG4gPD0gMCkgfHwgKGNvdW50ID09IDApKQorCQlyZXR1cm4gMDsKKworCWlmIChuIDwgY291bnQpCisJCWNvdW50ID0gbjsKKworCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKGlwLT5pX21vdW50KSkKKwkJcmV0dXJuIC1FSU87CisKKwl4ZnNfaWxvY2soaXAsIFhGU19JT0xPQ0tfU0hBUkVEKTsKKworCWlmIChETV9FVkVOVF9FTkFCTEVEKHZwLT52X3Zmc3AsIGlwLCBETV9FVkVOVF9SRUFEKSAmJgorCSAgICAoIShpb2ZsYWdzICYgSU9fSU5WSVMpKSkgeworCQl2cndsb2NrX3QgbG9ja3R5cGUgPSBWUldMT0NLX1JFQUQ7CisJCWludCBlcnJvcjsKKworCQllcnJvciA9IFhGU19TRU5EX0RBVEEobXAsIERNX0VWRU5UX1JFQUQsIEJIVl9UT19WTk9ERShiZHApLCAqb2Zmc2V0LCBjb3VudCwKKwkJCQkgICAgICBGSUxQX0RFTEFZX0ZMQUcoZmlscCksICZsb2NrdHlwZSk7CisJCWlmIChlcnJvcikgeworCQkJeGZzX2l1bmxvY2soaXAsIFhGU19JT0xPQ0tfU0hBUkVEKTsKKwkJCXJldHVybiAtZXJyb3I7CisJCX0KKwl9CisJeGZzX3J3X2VudGVyX3RyYWNlKFhGU19TRU5ERklMRV9FTlRFUiwgJmlwLT5pX2lvY29yZSwKKwkJICAgKHZvaWQgKikodW5zaWduZWQgbG9uZyl0YXJnZXQsIGNvdW50LCAqb2Zmc2V0LCBpb2ZsYWdzKTsKKwlyZXQgPSBnZW5lcmljX2ZpbGVfc2VuZGZpbGUoZmlscCwgb2Zmc2V0LCBjb3VudCwgYWN0b3IsIHRhcmdldCk7CisKKwl4ZnNfaXVubG9jayhpcCwgWEZTX0lPTE9DS19TSEFSRUQpOworCisJaWYgKHJldCA+IDApCisJCVhGU19TVEFUU19BREQoeHNfcmVhZF9ieXRlcywgcmV0KTsKKworCWlmIChsaWtlbHkoIShpb2ZsYWdzICYgSU9fSU5WSVMpKSkKKwkJeGZzX2ljaGd0aW1lKGlwLCBYRlNfSUNIR1RJTUVfQUNDKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGhhbmRsZSB6ZXJvaW5nIGFueSBzcGFjZSBpbiB0aGUgbGFzdAorICogYmxvY2sgb2YgdGhlIGZpbGUgdGhhdCBpcyBiZXlvbmQgdGhlIEVPRi4gIFdlIGRvIHRoaXMgc2luY2UgdGhlCisgKiBzaXplIGlzIGJlaW5nIGluY3JlYXNlZCB3aXRob3V0IHdyaXRpbmcgYW55dGhpbmcgdG8gdGhhdCBibG9jaworICogYW5kIHdlIGRvbid0IHdhbnQgYW55b25lIHRvIHJlYWQgdGhlIGdhcmJhZ2Ugb24gdGhlIGRpc2suCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKHBvc2l0aXZlKSAqLworeGZzX3plcm9fbGFzdF9ibG9jaygKKwlzdHJ1Y3QgaW5vZGUJKmlwLAorCXhmc19pb2NvcmVfdAkqaW8sCisJeGZzX29mZl90CW9mZnNldCwKKwl4ZnNfZnNpemVfdAlpc2l6ZSwKKwl4ZnNfZnNpemVfdAllbmRfc2l6ZSkKK3sKKwl4ZnNfZmlsZW9mZl90CWxhc3RfZnNiOworCXhmc19tb3VudF90CSptcDsKKwlpbnQJCW5pbWFwczsKKwlpbnQJCXplcm9fb2Zmc2V0OworCWludAkJemVyb19sZW47CisJaW50CQlpc2l6ZV9mc2Jfb2Zmc2V0OworCWludAkJZXJyb3IgPSAwOworCXhmc19ibWJ0X2lyZWNfdAlpbWFwOworCWxvZmZfdAkJbG9mZjsKKwlzaXplX3QJCWxzaXplOworCisJQVNTRVJUKGlzbXJsb2NrZWQoaW8tPmlvX2xvY2ssIE1SX1VQREFURSkgIT0gMCk7CisJQVNTRVJUKG9mZnNldCA+IGlzaXplKTsKKworCW1wID0gaW8tPmlvX21vdW50OworCisJaXNpemVfZnNiX29mZnNldCA9IFhGU19CX0ZTQl9PRkZTRVQobXAsIGlzaXplKTsKKwlpZiAoaXNpemVfZnNiX29mZnNldCA9PSAwKSB7CisJCS8qCisJCSAqIFRoZXJlIGFyZSBubyBleHRyYSBieXRlcyBpbiB0aGUgbGFzdCBibG9jayBvbiBkaXNrIHRvCisJCSAqIHplcm8sIHNvIHJldHVybi4KKwkJICovCisJCXJldHVybiAwOworCX0KKworCWxhc3RfZnNiID0gWEZTX0JfVE9fRlNCVChtcCwgaXNpemUpOworCW5pbWFwcyA9IDE7CisJZXJyb3IgPSBYRlNfQk1BUEkobXAsIE5VTEwsIGlvLCBsYXN0X2ZzYiwgMSwgMCwgTlVMTCwgMCwgJmltYXAsCisJCQkgICZuaW1hcHMsIE5VTEwpOworCWlmIChlcnJvcikgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCUFTU0VSVChuaW1hcHMgPiAwKTsKKwkvKgorCSAqIElmIHRoZSBibG9jayB1bmRlcmx5aW5nIGlzaXplIGlzIGp1c3QgYSBob2xlLCB0aGVuIHRoZXJlCisJICogaXMgbm90aGluZyB0byB6ZXJvLgorCSAqLworCWlmIChpbWFwLmJyX3N0YXJ0YmxvY2sgPT0gSE9MRVNUQVJUQkxPQ0spIHsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogWmVybyB0aGUgcGFydCBvZiB0aGUgbGFzdCBibG9jayBiZXlvbmQgdGhlIEVPRiwgYW5kIHdyaXRlIGl0CisJICogb3V0IHN5bmMuICBXZSBuZWVkIHRvIGRyb3AgdGhlIGlsb2NrIHdoaWxlIHdlIGRvIHRoaXMgc28gd2UKKwkgKiBkb24ndCBkZWFkbG9jayB3aGVuIHRoZSBidWZmZXIgY2FjaGUgY2FsbHMgYmFjayB0byB1cy4KKwkgKi8KKwlYRlNfSVVOTE9DSyhtcCwgaW8sIFhGU19JTE9DS19FWENMfCBYRlNfRVhUU0laRV9SRCk7CisJbG9mZiA9IFhGU19GU0JfVE9fQihtcCwgbGFzdF9mc2IpOworCWxzaXplID0gWEZTX0ZTQl9UT19CKG1wLCAxKTsKKworCXplcm9fb2Zmc2V0ID0gaXNpemVfZnNiX29mZnNldDsKKwl6ZXJvX2xlbiA9IG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSAtIGlzaXplX2ZzYl9vZmZzZXQ7CisKKwllcnJvciA9IHhmc19pb3plcm8oaXAsIGxvZmYgKyB6ZXJvX29mZnNldCwgemVyb19sZW4sIGVuZF9zaXplKTsKKworCVhGU19JTE9DSyhtcCwgaW8sIFhGU19JTE9DS19FWENMfFhGU19FWFRTSVpFX1JEKTsKKwlBU1NFUlQoZXJyb3IgPj0gMCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogWmVybyBhbnkgb24gZGlzayBzcGFjZSBiZXR3ZWVuIHRoZSBjdXJyZW50IEVPRiBhbmQgdGhlIG5ldywKKyAqIGxhcmdlciBFT0YuICBUaGlzIGhhbmRsZXMgdGhlIG5vcm1hbCBjYXNlIG9mIHplcm9pbmcgdGhlIHJlbWFpbmRlcgorICogb2YgdGhlIGxhc3QgYmxvY2sgaW4gdGhlIGZpbGUgYW5kIHRoZSB1bnVzdWFsIGNhc2Ugb2YgemVyb2luZyBibG9ja3MKKyAqIG91dCBiZXlvbmQgdGhlIHNpemUgb2YgdGhlIGZpbGUuICBUaGlzIHNlY29uZCBjYXNlIG9ubHkgaGFwcGVucworICogd2l0aCBmaXhlZCBzaXplIGV4dGVudHMgYW5kIHdoZW4gdGhlIHN5c3RlbSBjcmFzaGVzIGJlZm9yZSB0aGUgaW5vZGUKKyAqIHNpemUgd2FzIHVwZGF0ZWQgYnV0IGFmdGVyIGJsb2NrcyB3ZXJlIGFsbG9jYXRlZC4gIElmIGZpbGwgaXMgc2V0LAorICogdGhlbiBhbnkgaG9sZXMgaW4gdGhlIHJhbmdlIGFyZSBmaWxsZWQgYW5kIHplcm9lZC4gIElmIG5vdCwgdGhlIGhvbGVzCisgKiBhcmUgbGVmdCBhbG9uZSBhcyBob2xlcy4KKyAqLworCitpbnQJCQkJCS8qIGVycm9yIChwb3NpdGl2ZSkgKi8KK3hmc196ZXJvX2VvZigKKwl2bm9kZV90CQkqdnAsCisJeGZzX2lvY29yZV90CSppbywKKwl4ZnNfb2ZmX3QJb2Zmc2V0LAkJLyogc3RhcnRpbmcgSS9PIG9mZnNldCAqLworCXhmc19mc2l6ZV90CWlzaXplLAkJLyogY3VycmVudCBpbm9kZSBzaXplICovCisJeGZzX2ZzaXplX3QJZW5kX3NpemUpCS8qIHRlcm1pbmFsIGlub2RlIHNpemUgKi8KK3sKKwlzdHJ1Y3QgaW5vZGUJKmlwID0gTElOVkZTX0dFVF9JUCh2cCk7CisJeGZzX2ZpbGVvZmZfdAlzdGFydF96ZXJvX2ZzYjsKKwl4ZnNfZmlsZW9mZl90CWVuZF96ZXJvX2ZzYjsKKwl4ZnNfZmlsZW9mZl90CXByZXZfemVyb19mc2I7CisJeGZzX2ZpbGVvZmZfdAl6ZXJvX2NvdW50X2ZzYjsKKwl4ZnNfZmlsZW9mZl90CWxhc3RfZnNiOworCXhmc19leHRsZW5fdAlidWZfbGVuX2ZzYjsKKwl4ZnNfZXh0bGVuX3QJcHJldl96ZXJvX2NvdW50OworCXhmc19tb3VudF90CSptcDsKKwlpbnQJCW5pbWFwczsKKwlpbnQJCWVycm9yID0gMDsKKwl4ZnNfYm1idF9pcmVjX3QJaW1hcDsKKwlsb2ZmX3QJCWxvZmY7CisJc2l6ZV90CQlsc2l6ZTsKKworCUFTU0VSVChpc21ybG9ja2VkKGlvLT5pb19sb2NrLCBNUl9VUERBVEUpKTsKKwlBU1NFUlQoaXNtcmxvY2tlZChpby0+aW9faW9sb2NrLCBNUl9VUERBVEUpKTsKKworCW1wID0gaW8tPmlvX21vdW50OworCisJLyoKKwkgKiBGaXJzdCBoYW5kbGUgemVyb2luZyB0aGUgYmxvY2sgb24gd2hpY2ggaXNpemUgcmVzaWRlcy4KKwkgKiBXZSBvbmx5IHplcm8gYSBwYXJ0IG9mIHRoYXQgYmxvY2sgc28gaXQgaXMgaGFuZGxlZCBzcGVjaWFsbHkuCisJICovCisJZXJyb3IgPSB4ZnNfemVyb19sYXN0X2Jsb2NrKGlwLCBpbywgb2Zmc2V0LCBpc2l6ZSwgZW5kX3NpemUpOworCWlmIChlcnJvcikgeworCQlBU1NFUlQoaXNtcmxvY2tlZChpby0+aW9fbG9jaywgTVJfVVBEQVRFKSk7CisJCUFTU0VSVChpc21ybG9ja2VkKGlvLT5pb19pb2xvY2ssIE1SX1VQREFURSkpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJLyoKKwkgKiBDYWxjdWxhdGUgdGhlIHJhbmdlIGJldHdlZW4gdGhlIG5ldyBzaXplIGFuZCB0aGUgb2xkCisJICogd2hlcmUgYmxvY2tzIG5lZWRpbmcgdG8gYmUgemVyb2VkIG1heSBleGlzdC4gIFRvIGdldCB0aGUKKwkgKiBibG9jayB3aGVyZSB0aGUgbGFzdCBieXRlIGluIHRoZSBmaWxlIGN1cnJlbnRseSByZXNpZGVzLAorCSAqIHdlIG5lZWQgdG8gc3VidHJhY3Qgb25lIGZyb20gdGhlIHNpemUgYW5kIHRydW5jYXRlIGJhY2sKKwkgKiB0byBhIGJsb2NrIGJvdW5kYXJ5LiAgV2Ugc3VidHJhY3QgMSBpbiBjYXNlIHRoZSBzaXplIGlzCisJICogZXhhY3RseSBvbiBhIGJsb2NrIGJvdW5kYXJ5LgorCSAqLworCWxhc3RfZnNiID0gaXNpemUgPyBYRlNfQl9UT19GU0JUKG1wLCBpc2l6ZSAtIDEpIDogKHhmc19maWxlb2ZmX3QpLTE7CisJc3RhcnRfemVyb19mc2IgPSBYRlNfQl9UT19GU0IobXAsICh4ZnNfdWZzaXplX3QpaXNpemUpOworCWVuZF96ZXJvX2ZzYiA9IFhGU19CX1RPX0ZTQlQobXAsIG9mZnNldCAtIDEpOworCUFTU0VSVCgoeGZzX3NmaWxvZmZfdClsYXN0X2ZzYiA8ICh4ZnNfc2ZpbG9mZl90KXN0YXJ0X3plcm9fZnNiKTsKKwlpZiAobGFzdF9mc2IgPT0gZW5kX3plcm9fZnNiKSB7CisJCS8qCisJCSAqIFRoZSBzaXplIHdhcyBvbmx5IGluY3JlbWVudGVkIG9uIGl0cyBsYXN0IGJsb2NrLgorCQkgKiBXZSB0b29rIGNhcmUgb2YgdGhhdCBhYm92ZSwgc28ganVzdCByZXR1cm4uCisJCSAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlBU1NFUlQoc3RhcnRfemVyb19mc2IgPD0gZW5kX3plcm9fZnNiKTsKKwlwcmV2X3plcm9fZnNiID0gTlVMTEZJTEVPRkY7CisJcHJldl96ZXJvX2NvdW50ID0gMDsKKwl3aGlsZSAoc3RhcnRfemVyb19mc2IgPD0gZW5kX3plcm9fZnNiKSB7CisJCW5pbWFwcyA9IDE7CisJCXplcm9fY291bnRfZnNiID0gZW5kX3plcm9fZnNiIC0gc3RhcnRfemVyb19mc2IgKyAxOworCQllcnJvciA9IFhGU19CTUFQSShtcCwgTlVMTCwgaW8sIHN0YXJ0X3plcm9fZnNiLCB6ZXJvX2NvdW50X2ZzYiwKKwkJCQkgIDAsIE5VTEwsIDAsICZpbWFwLCAmbmltYXBzLCBOVUxMKTsKKwkJaWYgKGVycm9yKSB7CisJCQlBU1NFUlQoaXNtcmxvY2tlZChpby0+aW9fbG9jaywgTVJfVVBEQVRFKSk7CisJCQlBU1NFUlQoaXNtcmxvY2tlZChpby0+aW9faW9sb2NrLCBNUl9VUERBVEUpKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQlBU1NFUlQobmltYXBzID4gMCk7CisKKwkJaWYgKGltYXAuYnJfc3RhdGUgPT0gWEZTX0VYVF9VTldSSVRURU4gfHwKKwkJICAgIGltYXAuYnJfc3RhcnRibG9jayA9PSBIT0xFU1RBUlRCTE9DSykgeworCQkJLyoKKwkJCSAqIFRoaXMgbG9vcCBoYW5kbGVzIGluaXRpYWxpemluZyBwYWdlcyB0aGF0IHdlcmUKKwkJCSAqIHBhcnRpYWxseSBpbml0aWFsaXplZCBieSB0aGUgY29kZSBiZWxvdyB0aGlzCisJCQkgKiBsb29wLiBJdCBiYXNpY2FsbHkgemVyb2VzIHRoZSBwYXJ0IG9mIHRoZSBwYWdlCisJCQkgKiB0aGF0IHNpdHMgb24gYSBob2xlIGFuZCBzZXRzIHRoZSBwYWdlIGFzIFBfSE9MRQorCQkJICogYW5kIGNhbGxzIHJlbWFwZiBpZiBpdCBpcyBhIG1hcHBlZCBmaWxlLgorCQkJICovCisJCQlwcmV2X3plcm9fZnNiID0gTlVMTEZJTEVPRkY7CisJCQlwcmV2X3plcm9fY291bnQgPSAwOworCQkJc3RhcnRfemVyb19mc2IgPSBpbWFwLmJyX3N0YXJ0b2ZmICsKKwkJCQkJIGltYXAuYnJfYmxvY2tjb3VudDsKKwkJCUFTU0VSVChzdGFydF96ZXJvX2ZzYiA8PSAoZW5kX3plcm9fZnNiICsgMSkpOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBUaGVyZSBhcmUgYmxvY2tzIGluIHRoZSByYW5nZSByZXF1ZXN0ZWQuCisJCSAqIFplcm8gdGhlbSBhIHNpbmdsZSB3cml0ZSBhdCBhIHRpbWUuICBXZSBhY3R1YWxseQorCQkgKiBkb24ndCB6ZXJvIHRoZSBlbnRpcmUgcmFuZ2UgcmV0dXJuZWQgaWYgaXQgaXMKKwkJICogdG9vIGJpZyBhbmQgc2ltcGx5IGxvb3AgYXJvdW5kIHRvIGdldCB0aGUgcmVzdC4KKwkJICogVGhhdCBpcyBub3QgdGhlIG1vc3QgZWZmaWNpZW50IHRoaW5nIHRvIGRvLCBidXQgaXQKKwkJICogaXMgc2ltcGxlIGFuZCB0aGlzIHBhdGggc2hvdWxkIG5vdCBiZSBleGVyY2lzZWQgb2Z0ZW4uCisJCSAqLworCQlidWZfbGVuX2ZzYiA9IFhGU19GSUxCTEtTX01JTihpbWFwLmJyX2Jsb2NrY291bnQsCisJCQkJCSAgICAgIG1wLT5tX3dyaXRlaW9fYmxvY2tzIDw8IDgpOworCQkvKgorCQkgKiBEcm9wIHRoZSBpbm9kZSBsb2NrIHdoaWxlIHdlJ3JlIGRvaW5nIHRoZSBJL08uCisJCSAqIFdlJ2xsIHN0aWxsIGhhdmUgdGhlIGlvbG9jayB0byBwcm90ZWN0IHVzLgorCQkgKi8KKwkJWEZTX0lVTkxPQ0sobXAsIGlvLCBYRlNfSUxPQ0tfRVhDTHxYRlNfRVhUU0laRV9SRCk7CisKKwkJbG9mZiA9IFhGU19GU0JfVE9fQihtcCwgc3RhcnRfemVyb19mc2IpOworCQlsc2l6ZSA9IFhGU19GU0JfVE9fQihtcCwgYnVmX2xlbl9mc2IpOworCisJCWVycm9yID0geGZzX2lvemVybyhpcCwgbG9mZiwgbHNpemUsIGVuZF9zaXplKTsKKworCQlpZiAoZXJyb3IpIHsKKwkJCWdvdG8gb3V0X2xvY2s7CisJCX0KKworCQlwcmV2X3plcm9fZnNiID0gc3RhcnRfemVyb19mc2I7CisJCXByZXZfemVyb19jb3VudCA9IGJ1Zl9sZW5fZnNiOworCQlzdGFydF96ZXJvX2ZzYiA9IGltYXAuYnJfc3RhcnRvZmYgKyBidWZfbGVuX2ZzYjsKKwkJQVNTRVJUKHN0YXJ0X3plcm9fZnNiIDw9IChlbmRfemVyb19mc2IgKyAxKSk7CisKKwkJWEZTX0lMT0NLKG1wLCBpbywgWEZTX0lMT0NLX0VYQ0x8WEZTX0VYVFNJWkVfUkQpOworCX0KKworCXJldHVybiAwOworCitvdXRfbG9jazoKKworCVhGU19JTE9DSyhtcCwgaW8sIFhGU19JTE9DS19FWENMfFhGU19FWFRTSVpFX1JEKTsKKwlBU1NFUlQoZXJyb3IgPj0gMCk7CisJcmV0dXJuIGVycm9yOworfQorCitzc2l6ZV90CQkJCS8qIGJ5dGVzIHdyaXR0ZW4sIG9yICgtKSBlcnJvciAqLworeGZzX3dyaXRlKAorCWJodl9kZXNjX3QJCSpiZHAsCisJc3RydWN0IGtpb2NiCQkqaW9jYiwKKwljb25zdCBzdHJ1Y3QgaW92ZWMJKmlvdnAsCisJdW5zaWduZWQgaW50CQluc2VncywKKwlsb2ZmX3QJCQkqb2Zmc2V0LAorCWludAkJCWlvZmxhZ3MsCisJY3JlZF90CQkJKmNyZWRwKQoreworCXN0cnVjdCBmaWxlCQkqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UJKm1hcHBpbmcgPSBmaWxlLT5mX21hcHBpbmc7CisJc3RydWN0IGlub2RlCQkqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OworCXVuc2lnbmVkIGxvbmcJCXNlZ3MgPSBuc2VnczsKKwl4ZnNfaW5vZGVfdAkJKnhpcDsKKwl4ZnNfbW91bnRfdAkJKm1wOworCXNzaXplX3QJCQlyZXQgPSAwLCBlcnJvciA9IDA7CisJeGZzX2ZzaXplX3QJCWlzaXplLCBuZXdfc2l6ZTsKKwl4ZnNfaW9jb3JlX3QJCSppbzsKKwl2bm9kZV90CQkJKnZwOworCXVuc2lnbmVkIGxvbmcJCXNlZzsKKwlpbnQJCQlpb2xvY2s7CisJaW50CQkJZXZlbnRzZW50ID0gMDsKKwl2cndsb2NrX3QJCWxvY2t0eXBlOworCXNpemVfdAkJCW9jb3VudCA9IDAsIGNvdW50OworCWxvZmZfdAkJCXBvczsKKwlpbnQJCQluZWVkX2lzZW0gPSAxLCBuZWVkX2ZsdXNoID0gMDsKKworCVhGU19TVEFUU19JTkMoeHNfd3JpdGVfY2FsbHMpOworCisJdnAgPSBCSFZfVE9fVk5PREUoYmRwKTsKKwl4aXAgPSBYRlNfQkhWVE9JKGJkcCk7CisKKwlmb3IgKHNlZyA9IDA7IHNlZyA8IHNlZ3M7IHNlZysrKSB7CisJCWNvbnN0IHN0cnVjdCBpb3ZlYyAqaXYgPSAmaW92cFtzZWddOworCisJCS8qCisJCSAqIElmIGFueSBzZWdtZW50IGhhcyBhIG5lZ2F0aXZlIGxlbmd0aCwgb3IgdGhlIGN1bXVsYXRpdmUKKwkJICogbGVuZ3RoIGV2ZXIgd3JhcHMgbmVnYXRpdmUgdGhlbiByZXR1cm4gLUVJTlZBTC4KKwkJICovCisJCW9jb3VudCArPSBpdi0+aW92X2xlbjsKKwkJaWYgKHVubGlrZWx5KChzc2l6ZV90KShvY291bnR8aXYtPmlvdl9sZW4pIDwgMCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGFjY2Vzc19vayhWRVJJRllfUkVBRCwgaXYtPmlvdl9iYXNlLCBpdi0+aW92X2xlbikpCisJCQljb250aW51ZTsKKwkJaWYgKHNlZyA9PSAwKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXNlZ3MgPSBzZWc7CisJCW9jb3VudCAtPSBpdi0+aW92X2xlbjsgIC8qIFRoaXMgc2VnbWVudCBpcyBubyBnb29kICovCisJCWJyZWFrOworCX0KKworCWNvdW50ID0gb2NvdW50OworCXBvcyA9ICpvZmZzZXQ7CisKKwlpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpbyA9ICZ4aXAtPmlfaW9jb3JlOworCW1wID0gaW8tPmlvX21vdW50OworCisJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQorCQlyZXR1cm4gLUVJTzsKKworCWZzX2NoZWNrX2Zyb3plbih2cC0+dl92ZnNwLCBTQl9GUkVFWkVfV1JJVEUpOworCisJaWYgKGlvZmxhZ3MgJiBJT19JU0RJUkVDVCkgeworCQl4ZnNfYnVmdGFyZ190CSp0YXJnZXQgPQorCQkJKHhpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19SRUFMVElNRSkgPworCQkJCW1wLT5tX3J0ZGV2X3RhcmdwIDogbXAtPm1fZGRldl90YXJncDsKKworCQlpZiAoKHBvcyAmIHRhcmdldC0+cGJyX3NtYXNrKSB8fCAoY291bnQgJiB0YXJnZXQtPnBicl9zbWFzaykpCisJCQlyZXR1cm4gWEZTX0VSUk9SKC1FSU5WQUwpOworCisJCWlmICghVk5fQ0FDSEVEKHZwKSAmJiBwb3MgPCBpX3NpemVfcmVhZChpbm9kZSkpCisJCQluZWVkX2lzZW0gPSAwOworCisJCWlmIChWTl9DQUNIRUQodnApKQorCQkJbmVlZF9mbHVzaCA9IDE7CisJfQorCityZWxvY2s6CisJaWYgKG5lZWRfaXNlbSkgeworCQlpb2xvY2sgPSBYRlNfSU9MT0NLX0VYQ0w7CisJCWxvY2t0eXBlID0gVlJXTE9DS19XUklURTsKKworCQlkb3duKCZpbm9kZS0+aV9zZW0pOworCX0gZWxzZSB7CisJCWlvbG9jayA9IFhGU19JT0xPQ0tfU0hBUkVEOworCQlsb2NrdHlwZSA9IFZSV0xPQ0tfV1JJVEVfRElSRUNUOworCX0KKworCXhmc19pbG9jayh4aXAsIFhGU19JTE9DS19FWENMfGlvbG9jayk7CisKKwlpc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKworCWlmIChmaWxlLT5mX2ZsYWdzICYgT19BUFBFTkQpCisJCSpvZmZzZXQgPSBpc2l6ZTsKKworc3RhcnQ6CisJZXJyb3IgPSAtZ2VuZXJpY193cml0ZV9jaGVja3MoZmlsZSwgJnBvcywgJmNvdW50LAorCQkJCQlTX0lTQkxLKGlub2RlLT5pX21vZGUpKTsKKwlpZiAoZXJyb3IpIHsKKwkJeGZzX2l1bmxvY2soeGlwLCBYRlNfSUxPQ0tfRVhDTHxpb2xvY2spOworCQlnb3RvIG91dF91bmxvY2tfaXNlbTsKKwl9CisKKwluZXdfc2l6ZSA9IHBvcyArIGNvdW50OworCWlmIChuZXdfc2l6ZSA+IGlzaXplKQorCQlpby0+aW9fbmV3X3NpemUgPSBuZXdfc2l6ZTsKKworCWlmICgoRE1fRVZFTlRfRU5BQkxFRCh2cC0+dl92ZnNwLCB4aXAsIERNX0VWRU5UX1dSSVRFKSAmJgorCSAgICAhKGlvZmxhZ3MgJiBJT19JTlZJUykgJiYgIWV2ZW50c2VudCkpIHsKKwkJbG9mZl90CQlzYXZlZHNpemUgPSBwb3M7CisJCWludAkJZG1mbGFncyA9IEZJTFBfREVMQVlfRkxBRyhmaWxlKTsKKworCQlpZiAobmVlZF9pc2VtKQorCQkJZG1mbGFncyB8PSBETV9GTEFHU19JU0VNOworCisJCXhmc19pdW5sb2NrKHhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQllcnJvciA9IFhGU19TRU5EX0RBVEEoeGlwLT5pX21vdW50LCBETV9FVkVOVF9XUklURSwgdnAsCisJCQkJICAgICAgcG9zLCBjb3VudCwKKwkJCQkgICAgICBkbWZsYWdzLCAmbG9ja3R5cGUpOworCQlpZiAoZXJyb3IpIHsKKwkJCXhmc19pdW5sb2NrKHhpcCwgaW9sb2NrKTsKKwkJCWdvdG8gb3V0X3VubG9ja19pc2VtOworCQl9CisJCXhmc19pbG9jayh4aXAsIFhGU19JTE9DS19FWENMKTsKKwkJZXZlbnRzZW50ID0gMTsKKworCQkvKgorCQkgKiBUaGUgaW9sb2NrIHdhcyBkcm9wcGVkIGFuZCByZWFxdWlyZWQgaW4gWEZTX1NFTkRfREFUQQorCQkgKiBzbyB3ZSBoYXZlIHRvIHJlY2hlY2sgdGhlIHNpemUgd2hlbiBhcHBlbmRpbmcuCisJCSAqIFdlIHdpbGwgb25seSAiZ290byBzdGFydDsiIG9uY2UsIHNpbmNlIGhhdmluZyBzZW50IHRoZQorCQkgKiBldmVudCBwcmV2ZW50cyBhbm90aGVyIGNhbGwgdG8gWEZTX1NFTkRfREFUQSwgd2hpY2ggaXMKKwkJICogd2hhdCBhbGxvd3MgdGhlIHNpemUgdG8gY2hhbmdlIGluIHRoZSBmaXJzdCBwbGFjZS4KKwkJICovCisJCWlmICgoZmlsZS0+Zl9mbGFncyAmIE9fQVBQRU5EKSAmJiBzYXZlZHNpemUgIT0gaXNpemUpIHsKKwkJCXBvcyA9IGlzaXplID0geGlwLT5pX2QuZGlfc2l6ZTsKKwkJCWdvdG8gc3RhcnQ7CisJCX0KKwl9CisKKwkvKgorCSAqIE9uIExpbnV4LCBnZW5lcmljX2ZpbGVfd3JpdGUgdXBkYXRlcyB0aGUgdGltZXMgZXZlbiBpZgorCSAqIG5vIGRhdGEgaXMgY29waWVkIGluIHNvIGxvbmcgYXMgdGhlIHdyaXRlIGhhZCBhIHNpemUuCisJICoKKwkgKiBXZSBtdXN0IHVwZGF0ZSB4ZnMnIHRpbWVzIHNpbmNlIHJldmFsaWRhdGUgd2lsbCBvdmVyY29weSB4ZnMuCisJICovCisJaWYgKCEoaW9mbGFncyAmIElPX0lOVklTKSkgeworCQl4ZnNfaWNoZ3RpbWUoeGlwLCBYRlNfSUNIR1RJTUVfTU9EIHwgWEZTX0lDSEdUSU1FX0NIRyk7CisJCWlub2RlX3VwZGF0ZV90aW1lKGlub2RlLCAxKTsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBvZmZzZXQgaXMgYmV5b25kIHRoZSBzaXplIG9mIHRoZSBmaWxlLCB3ZSBoYXZlIGEgY291cGxlCisJICogb2YgdGhpbmdzIHRvIGRvLiBGaXJzdCwgaWYgdGhlcmUgaXMgYWxyZWFkeSBzcGFjZSBhbGxvY2F0ZWQKKwkgKiB3ZSBuZWVkIHRvIGVpdGhlciBjcmVhdGUgaG9sZXMgb3IgemVybyB0aGUgZGlzayBvciAuLi4KKwkgKgorCSAqIElmIHRoZXJlIGlzIGEgcGFnZSB3aGVyZSB0aGUgcHJldmlvdXMgc2l6ZSBsYW5kcywgd2UgbmVlZAorCSAqIHRvIHplcm8gaXQgb3V0IHVwIHRvIHRoZSBuZXcgc2l6ZS4KKwkgKi8KKworCWlmIChwb3MgPiBpc2l6ZSkgeworCQllcnJvciA9IHhmc196ZXJvX2VvZihCSFZfVE9fVk5PREUoYmRwKSwgaW8sIHBvcywKKwkJCQkJaXNpemUsIHBvcyArIGNvdW50KTsKKwkJaWYgKGVycm9yKSB7CisJCQl4ZnNfaXVubG9jayh4aXAsIFhGU19JTE9DS19FWENMfGlvbG9jayk7CisJCQlnb3RvIG91dF91bmxvY2tfaXNlbTsKKwkJfQorCX0KKwl4ZnNfaXVubG9jayh4aXAsIFhGU19JTE9DS19FWENMKTsKKworCS8qCisJICogSWYgd2UncmUgd3JpdGluZyB0aGUgZmlsZSB0aGVuIG1ha2Ugc3VyZSB0byBjbGVhciB0aGUKKwkgKiBzZXR1aWQgYW5kIHNldGdpZCBiaXRzIGlmIHRoZSBwcm9jZXNzIGlzIG5vdCBiZWluZyBydW4KKwkgKiBieSByb290LiAgVGhpcyBrZWVwcyBwZW9wbGUgZnJvbSBtb2RpZnlpbmcgc2V0dWlkIGFuZAorCSAqIHNldGdpZCBiaW5hcmllcy4KKwkgKi8KKworCWlmICgoKHhpcC0+aV9kLmRpX21vZGUgJiBTX0lTVUlEKSB8fAorCSAgICAoKHhpcC0+aV9kLmRpX21vZGUgJiAoU19JU0dJRCB8IFNfSVhHUlApKSA9PQorCQkoU19JU0dJRCB8IFNfSVhHUlApKSkgJiYKKwkgICAgICFjYXBhYmxlKENBUF9GU0VUSUQpKSB7CisJCWVycm9yID0geGZzX3dyaXRlX2NsZWFyX3NldHVpZCh4aXApOworCQlpZiAobGlrZWx5KCFlcnJvcikpCisJCQllcnJvciA9IC1yZW1vdmVfc3VpZChmaWxlLT5mX2RlbnRyeSk7CisJCWlmICh1bmxpa2VseShlcnJvcikpIHsKKwkJCXhmc19pdW5sb2NrKHhpcCwgaW9sb2NrKTsKKwkJCWdvdG8gb3V0X3VubG9ja19pc2VtOworCQl9CisJfQorCityZXRyeToKKwkvKiBXZSBjYW4gd3JpdGUgYmFjayB0aGlzIHF1ZXVlIGluIHBhZ2UgcmVjbGFpbSAqLworCWN1cnJlbnQtPmJhY2tpbmdfZGV2X2luZm8gPSBtYXBwaW5nLT5iYWNraW5nX2Rldl9pbmZvOworCisJaWYgKChpb2ZsYWdzICYgSU9fSVNESVJFQ1QpKSB7CisJCWlmIChuZWVkX2ZsdXNoKSB7CisJCQl4ZnNfaW52YWxfY2FjaGVkX3RyYWNlKGlvLCBwb3MsIC0xLAorCQkJCQljdG9vZmYob2ZmdG9jdChwb3MpKSwgLTEpOworCQkJVk9QX0ZMVVNISU5WQUxfUEFHRVModnAsIGN0b29mZihvZmZ0b2N0KHBvcykpLAorCQkJCQktMSwgRklfUkVNQVBGX0xPQ0tFRCk7CisJCX0KKworCQlpZiAobmVlZF9pc2VtKSB7CisJCQkvKiBkZW1vdGUgdGhlIGxvY2sgbm93IHRoZSBjYWNoZWQgcGFnZXMgYXJlIGdvbmUgKi8KKwkJCVhGU19JTE9DS19ERU1PVEUobXAsIGlvLCBYRlNfSU9MT0NLX0VYQ0wpOworCQkJdXAoJmlub2RlLT5pX3NlbSk7CisKKwkJCWlvbG9jayA9IFhGU19JT0xPQ0tfU0hBUkVEOworCQkJbG9ja3R5cGUgPSBWUldMT0NLX1dSSVRFX0RJUkVDVDsKKwkJCW5lZWRfaXNlbSA9IDA7CisJCX0KKworIAkJeGZzX3J3X2VudGVyX3RyYWNlKFhGU19ESU9XUl9FTlRFUiwgaW8sICh2b2lkICopaW92cCwgc2VncywKKwkJCQkqb2Zmc2V0LCBpb2ZsYWdzKTsKKwkJcmV0ID0gZ2VuZXJpY19maWxlX2RpcmVjdF93cml0ZShpb2NiLCBpb3ZwLAorCQkJCSZzZWdzLCBwb3MsIG9mZnNldCwgY291bnQsIG9jb3VudCk7CisKKwkJLyoKKwkJICogZGlyZWN0LWlvIHdyaXRlIHRvIGEgaG9sZTogZmFsbCB0aHJvdWdoIHRvIGJ1ZmZlcmVkIEkvTworCQkgKiBmb3IgY29tcGxldGluZyB0aGUgcmVzdCBvZiB0aGUgcmVxdWVzdC4KKwkJICovCisJCWlmIChyZXQgPj0gMCAmJiByZXQgIT0gY291bnQpIHsKKwkJCVhGU19TVEFUU19BREQoeHNfd3JpdGVfYnl0ZXMsIHJldCk7CisKKwkJCXBvcyArPSByZXQ7CisJCQljb3VudCAtPSByZXQ7CisKKwkJCW5lZWRfaXNlbSA9IDE7CisJCQlpb2ZsYWdzICY9IH5JT19JU0RJUkVDVDsKKwkJCXhmc19pdW5sb2NrKHhpcCwgaW9sb2NrKTsKKwkJCWdvdG8gcmVsb2NrOworCQl9CisJfSBlbHNlIHsKKwkJeGZzX3J3X2VudGVyX3RyYWNlKFhGU19XUklURV9FTlRFUiwgaW8sICh2b2lkICopaW92cCwgc2VncywKKwkJCQkqb2Zmc2V0LCBpb2ZsYWdzKTsKKwkJcmV0ID0gZ2VuZXJpY19maWxlX2J1ZmZlcmVkX3dyaXRlKGlvY2IsIGlvdnAsIHNlZ3MsCisJCQkJcG9zLCBvZmZzZXQsIGNvdW50LCByZXQpOworCX0KKworCWN1cnJlbnQtPmJhY2tpbmdfZGV2X2luZm8gPSBOVUxMOworCisJaWYgKHJldCA9PSAtRUlPQ0JRVUVVRUQgJiYgIShpb2ZsYWdzICYgSU9fSVNBSU8pKQorCQlyZXQgPSB3YWl0X29uX3N5bmNfa2lvY2IoaW9jYik7CisKKwlpZiAoKHJldCA9PSAtRU5PU1BDKSAmJgorCSAgICBETV9FVkVOVF9FTkFCTEVEKHZwLT52X3Zmc3AsIHhpcCwgRE1fRVZFTlRfTk9TUEFDRSkgJiYKKwkgICAgIShpb2ZsYWdzICYgSU9fSU5WSVMpKSB7CisKKwkJeGZzX3J3dW5sb2NrKGJkcCwgbG9ja3R5cGUpOworCQllcnJvciA9IFhGU19TRU5EX05BTUVTUCh4aXAtPmlfbW91bnQsIERNX0VWRU5UX05PU1BBQ0UsIHZwLAorCQkJCURNX1JJR0hUX05VTEwsIHZwLCBETV9SSUdIVF9OVUxMLCBOVUxMLCBOVUxMLAorCQkJCTAsIDAsIDApOyAvKiBEZWxheSBmbGFnIGludGVudGlvbmFsbHkgIHVudXNlZCAqLworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dF91bmxvY2tfaXNlbTsKKwkJeGZzX3J3bG9jayhiZHAsIGxvY2t0eXBlKTsKKwkJcG9zID0geGlwLT5pX2QuZGlfc2l6ZTsKKwkJcmV0ID0gMDsKKwkJZ290byByZXRyeTsKKwl9CisKKwlpZiAoKm9mZnNldCA+IHhpcC0+aV9kLmRpX3NpemUpIHsKKwkJeGZzX2lsb2NrKHhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQlpZiAoKm9mZnNldCA+IHhpcC0+aV9kLmRpX3NpemUpIHsKKwkJCXhpcC0+aV9kLmRpX3NpemUgPSAqb2Zmc2V0OworCQkJaV9zaXplX3dyaXRlKGlub2RlLCAqb2Zmc2V0KTsKKwkJCXhpcC0+aV91cGRhdGVfY29yZSA9IDE7CisJCQl4aXAtPmlfdXBkYXRlX3NpemUgPSAxOworCQl9CisJCXhmc19pdW5sb2NrKHhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCX0KKworCWVycm9yID0gLXJldDsKKwlpZiAocmV0IDw9IDApCisJCWdvdG8gb3V0X3VubG9ja19pbnRlcm5hbDsKKworCVhGU19TVEFUU19BREQoeHNfd3JpdGVfYnl0ZXMsIHJldCk7CisKKwkvKiBIYW5kbGUgdmFyaW91cyBTWU5DLXR5cGUgd3JpdGVzICovCisJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19TWU5DKSB8fCBJU19TWU5DKGlub2RlKSkgeworCQkvKgorCQkgKiBJZiB3ZSdyZSB0cmVhdGluZyB0aGlzIGFzIE9fRFNZTkMgYW5kIHdlIGhhdmUgbm90IHVwZGF0ZWQgdGhlCisJCSAqIHNpemUsIGZvcmNlIHRoZSBsb2cuCisJCSAqLworCQlpZiAoIShtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9PU1lOQ0lTT1NZTkMpICYmCisJCSAgICAhKHhpcC0+aV91cGRhdGVfc2l6ZSkpIHsKKwkJCXhmc19pbm9kZV9sb2dfaXRlbV90CSppaXAgPSB4aXAtPmlfaXRlbXA7CisKKwkJCS8qCisJCQkgKiBJZiBhbiBhbGxvY2F0aW9uIHRyYW5zYWN0aW9uIG9jY3VycmVkCisJCQkgKiB3aXRob3V0IGV4dGVuZGluZyB0aGUgc2l6ZSwgdGhlbiB3ZSBoYXZlIHRvIGZvcmNlCisJCQkgKiB0aGUgbG9nIHVwIHRoZSBwcm9wZXIgcG9pbnQgdG8gZW5zdXJlIHRoYXQgdGhlCisJCQkgKiBhbGxvY2F0aW9uIGlzIHBlcm1hbmVudC4gIFdlIGNhbid0IGNvdW50IG9uCisJCQkgKiB0aGUgZmFjdCB0aGF0IGJ1ZmZlcmVkIHdyaXRlcyBsb2NrIG91dCBkaXJlY3QgSS9PCisJCQkgKiB3cml0ZXMgLSB0aGUgZGlyZWN0IEkvTyB3cml0ZSBjb3VsZCBoYXZlIGV4dGVuZGVkCisJCQkgKiB0aGUgc2l6ZSBub250cmFuc2FjdGlvbmFsbHksIHRoZW4gZmluaXNoZWQgYmVmb3JlCisJCQkgKiB3ZSBzdGFydGVkLiAgeGZzX3dyaXRlX2ZpbGUgd2lsbCB0aGluayB0aGF0IHRoZSBmaWxlCisJCQkgKiBkaWRuJ3QgZ3JvdyBidXQgdGhlIHVwZGF0ZSBpc24ndCBzYWZlIHVubGVzcyB0aGUKKwkJCSAqIHNpemUgY2hhbmdlIGlzIGxvZ2dlZC4KKwkJCSAqCisJCQkgKiBGb3JjZSB0aGUgbG9nIGlmIHdlJ3ZlIGNvbW1pdHRlZCBhIHRyYW5zYWN0aW9uCisJCQkgKiBhZ2FpbnN0IHRoZSBpbm9kZSBvciBpZiBzb21lb25lIGVsc2UgaGFzIGFuZAorCQkJICogdGhlIGNvbW1pdCByZWNvcmQgaGFzbid0IGdvbmUgdG8gZGlzayAoZS5nLgorCQkJICogdGhlIGlub2RlIGlzIHBpbm5lZCkuICBUaGlzIGd1YXJhbnRlZXMgdGhhdAorCQkJICogYWxsIGNoYW5nZXMgYWZmZWN0aW5nIHRoZSBpbm9kZSBhcmUgcGVybWFuZW50CisJCQkgKiB3aGVuIHdlIHJldHVybi4KKwkJCSAqLworCQkJaWYgKGlpcCAmJiBpaXAtPmlsaV9sYXN0X2xzbikgeworCQkJCXhmc19sb2dfZm9yY2UobXAsIGlpcC0+aWxpX2xhc3RfbHNuLAorCQkJCQkJWEZTX0xPR19GT1JDRSB8IFhGU19MT0dfU1lOQyk7CisJCQl9IGVsc2UgaWYgKHhmc19pcGluY291bnQoeGlwKSA+IDApIHsKKwkJCQl4ZnNfbG9nX2ZvcmNlKG1wLCAoeGZzX2xzbl90KTAsCisJCQkJCQlYRlNfTE9HX0ZPUkNFIHwgWEZTX0xPR19TWU5DKTsKKwkJCX0KKworCQl9IGVsc2UgeworCQkJeGZzX3RyYW5zX3QJKnRwOworCisJCQkvKgorCQkJICogT19TWU5DIG9yIE9fRFNZTkMgX3dpdGhfIGEgc2l6ZSB1cGRhdGUgYXJlIGhhbmRsZWQKKwkJCSAqIHRoZSBzYW1lIHdheS4KKwkJCSAqCisJCQkgKiBJZiB0aGUgd3JpdGUgd2FzIHN5bmNocm9ub3VzIHRoZW4gd2UgbmVlZCB0byBtYWtlCisJCQkgKiBzdXJlIHRoYXQgdGhlIGlub2RlIG1vZGlmaWNhdGlvbiB0aW1lIGlzIHBlcm1hbmVudC4KKwkJCSAqIFdlJ2xsIGhhdmUgdXBkYXRlZCB0aGUgdGltZXN0YW1wIGFib3ZlLCBzbyBoZXJlCisJCQkgKiB3ZSB1c2UgYSBzeW5jaHJvbm91cyB0cmFuc2FjdGlvbiB0byBsb2cgdGhlIGlub2RlLgorCQkJICogSXQncyBub3QgZmFzdCwgYnV0IGl0J3MgbmVjZXNzYXJ5LgorCQkJICoKKwkJCSAqIElmIHRoaXMgYSBkc3luYyB3cml0ZSBhbmQgdGhlIHNpemUgZ290IGNoYW5nZWQKKwkJCSAqIG5vbi10cmFuc2FjdGlvbmFsbHksIHRoZW4gd2UgbmVlZCB0byBlbnN1cmUgdGhhdAorCQkJICogdGhlIHNpemUgY2hhbmdlIGdldHMgbG9nZ2VkIGluIGEgc3luY2hyb25vdXMKKwkJCSAqIHRyYW5zYWN0aW9uLgorCQkJICovCisKKwkJCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfV1JJVEVfU1lOQyk7CisJCQlpZiAoKGVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsCisJCQkJCQkgICAgICBYRlNfU1dSSVRFX0xPR19SRVMobXApLAorCQkJCQkJICAgICAgMCwgMCwgMCkpKSB7CisJCQkJLyogVHJhbnNhY3Rpb24gcmVzZXJ2ZSBmYWlsZWQgKi8KKwkJCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCAwKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogVHJhbnNhY3Rpb24gcmVzZXJ2ZSBzdWNjZXNzZnVsICovCisJCQkJeGZzX2lsb2NrKHhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQkJCXhmc190cmFuc19pam9pbih0cCwgeGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCQkJeGZzX3RyYW5zX2lob2xkKHRwLCB4aXApOworCQkJCXhmc190cmFuc19sb2dfaW5vZGUodHAsIHhpcCwgWEZTX0lMT0dfQ09SRSk7CisJCQkJeGZzX3RyYW5zX3NldF9zeW5jKHRwKTsKKwkJCQllcnJvciA9IHhmc190cmFuc19jb21taXQodHAsIDAsIE5VTEwpOworCQkJCXhmc19pdW5sb2NrKHhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQkJfQorCQkJaWYgKGVycm9yKQorCQkJCWdvdG8gb3V0X3VubG9ja19pbnRlcm5hbDsKKwkJfQorCQorCQl4ZnNfcnd1bmxvY2soYmRwLCBsb2NrdHlwZSk7CisJCWlmIChuZWVkX2lzZW0pCisJCQl1cCgmaW5vZGUtPmlfc2VtKTsKKworCQllcnJvciA9IHN5bmNfcGFnZV9yYW5nZShpbm9kZSwgbWFwcGluZywgcG9zLCByZXQpOworCQlpZiAoIWVycm9yKQorCQkJZXJyb3IgPSByZXQ7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKyBvdXRfdW5sb2NrX2ludGVybmFsOgorCXhmc19yd3VubG9jayhiZHAsIGxvY2t0eXBlKTsKKyBvdXRfdW5sb2NrX2lzZW06CisJaWYgKG5lZWRfaXNlbSkKKwkJdXAoJmlub2RlLT5pX3NlbSk7CisJcmV0dXJuIC1lcnJvcjsKK30KKworLyoKKyAqIEFsbCB4ZnMgbWV0YWRhdGEgYnVmZmVycyBleGNlcHQgbG9nIHN0YXRlIG1hY2hpbmUgYnVmZmVycworICogZ2V0IHRoaXMgYXR0YWNoZWQgYXMgdGhlaXIgYl9iZHN0cmF0IGNhbGxiYWNrIGZ1bmN0aW9uLgorICogVGhpcyBpcyBzbyB0aGF0IHdlIGNhbiBjYXRjaCBhIGJ1ZmZlcgorICogYWZ0ZXIgcHJlbWF0dXJlbHkgdW5waW5uaW5nIGl0IHRvIGZvcmNpYmx5IHNodXRkb3duIHRoZSBmaWxlc3lzdGVtLgorICovCitpbnQKK3hmc19iZHN0cmF0X2NiKHN0cnVjdCB4ZnNfYnVmICpicCkKK3sKKwl4ZnNfbW91bnRfdAkqbXA7CisKKwltcCA9IFhGU19CVUZfRlNQUklWQVRFMyhicCwgeGZzX21vdW50X3QgKik7CisJaWYgKCFYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkgeworCQlwYWdlYnVmX2lvcmVxdWVzdChicCk7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCXhmc19idWZ0cmFjZSgiWEZTX19CRFNUUkFUIElPRVJST1IiLCBicCk7CisJCS8qCisJCSAqIE1ldGFkYXRhIHdyaXRlIHRoYXQgZGlkbid0IGdldCBsb2dnZWQgYnV0CisJCSAqIHdyaXR0ZW4gZGVsYXllZCBhbnl3YXkuIFRoZXNlIGFyZW4ndCBhc3NvY2lhdGVkCisJCSAqIHdpdGggYSB0cmFuc2FjdGlvbiwgYW5kIGNhbiBiZSBpZ25vcmVkLgorCQkgKi8KKwkJaWYgKFhGU19CVUZfSU9ET05FX0ZVTkMoYnApID09IE5VTEwgJiYKKwkJICAgIChYRlNfQlVGX0lTUkVBRChicCkpID09IDApCisJCQlyZXR1cm4gKHhmc19iaW9lcnJvcl9yZWxzZShicCkpOworCQllbHNlCisJCQlyZXR1cm4gKHhmc19iaW9lcnJvcihicCkpOworCX0KK30KKworCitpbnQKK3hmc19ibWFwKGJodl9kZXNjX3QJKmJkcCwKKwl4ZnNfb2ZmX3QJb2Zmc2V0LAorCXNzaXplX3QJCWNvdW50LAorCWludAkJZmxhZ3MsCisJeGZzX2lvbWFwX3QJKmlvbWFwcCwKKwlpbnQJCSpuaW9tYXBzKQoreworCXhmc19pbm9kZV90CSppcCA9IFhGU19CSFZUT0koYmRwKTsKKwl4ZnNfaW9jb3JlX3QJKmlvID0gJmlwLT5pX2lvY29yZTsKKworCUFTU0VSVCgoaXAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSA9PSBTX0lGUkVHKTsKKwlBU1NFUlQoKChpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19SRUFMVElNRSkgIT0gMCkgPT0KKwkgICAgICAgKChpcC0+aV9pb2NvcmUuaW9fZmxhZ3MgJiBYRlNfSU9DT1JFX1JUKSAhPSAwKSk7CisKKwlyZXR1cm4geGZzX2lvbWFwKGlvLCBvZmZzZXQsIGNvdW50LCBmbGFncywgaW9tYXBwLCBuaW9tYXBzKTsKK30KKworLyoKKyAqIFdyYXBwZXIgYXJvdW5kIGJkc3RyYXQgc28gdGhhdCB3ZSBjYW4gc3RvcCBkYXRhCisgKiBmcm9tIGdvaW5nIHRvIGRpc2sgaW4gY2FzZSB3ZSBhcmUgc2h1dHRpbmcgZG93biB0aGUgZmlsZXN5c3RlbS4KKyAqIFR5cGljYWxseSB1c2VyIGRhdGEgZ29lcyB0aHJ1IHRoaXMgcGF0aDsgb25lIG9mIHRoZSBleGNlcHRpb25zCisgKiBpcyB0aGUgc3VwZXJibG9jay4KKyAqLworaW50Cit4ZnNiZHN0cmF0KAorCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAorCXN0cnVjdCB4ZnNfYnVmCQkqYnApCit7CisJQVNTRVJUKG1wKTsKKwlpZiAoIVhGU19GT1JDRURfU0hVVERPV04obXApKSB7CisJCS8qIEdyaW8gcmVkaXJlY3Rpb24gd291bGQgZ28gaGVyZQorCQkgKiBpZiAoWEZTX0JVRl9JU19HUklPKGJwKSkgeworCQkgKi8KKworCQlwYWdlYnVmX2lvcmVxdWVzdChicCk7CisJCXJldHVybiAwOworCX0KKworCXhmc19idWZ0cmFjZSgiWEZTQkRTVFJBVCBJT0VSUk9SIiwgYnApOworCXJldHVybiAoeGZzX2Jpb2Vycm9yX3JlbHNlKGJwKSk7Cit9CisKKy8qCisgKiBJZiB0aGUgdW5kZXJseWluZyAoZGF0YS9sb2cvcnQpIGRldmljZSBpcyByZWFkb25seSwgdGhlcmUgYXJlIHNvbWUKKyAqIG9wZXJhdGlvbnMgdGhhdCBjYW5ub3QgcHJvY2VlZC4KKyAqLworaW50Cit4ZnNfZGV2X2lzX3JlYWRfb25seSgKKwl4ZnNfbW91bnRfdAkJKm1wLAorCWNoYXIJCQkqbWVzc2FnZSkKK3sKKwlpZiAoeGZzX3JlYWRvbmx5X2J1ZnRhcmcobXAtPm1fZGRldl90YXJncCkgfHwKKwkgICAgeGZzX3JlYWRvbmx5X2J1ZnRhcmcobXAtPm1fbG9nZGV2X3RhcmdwKSB8fAorCSAgICAobXAtPm1fcnRkZXZfdGFyZ3AgJiYgeGZzX3JlYWRvbmx5X2J1ZnRhcmcobXAtPm1fcnRkZXZfdGFyZ3ApKSkgeworCQljbW5fZXJyKENFX05PVEUsCisJCQkiWEZTOiAlcyByZXF1aXJlZCBvbiByZWFkLW9ubHkgZGV2aWNlLiIsIG1lc3NhZ2UpOworCQljbW5fZXJyKENFX05PVEUsCisJCQkiWEZTOiB3cml0ZSBhY2Nlc3MgdW5hdmFpbGFibGUsIGNhbm5vdCBwcm9jZWVkLiIpOworCQlyZXR1cm4gRVJPRlM7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfbHJ3LmggYi9mcy94ZnMvbGludXgtMi42L3hmc19scncuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzIzZTM1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfbHJ3LmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX0xSV19IX18KKyNkZWZpbmUgX19YRlNfTFJXX0hfXworCitzdHJ1Y3Qgdm5vZGU7CitzdHJ1Y3QgYmh2X2Rlc2M7CitzdHJ1Y3QgeGZzX21vdW50Oworc3RydWN0IHhmc19pb2NvcmU7CitzdHJ1Y3QgeGZzX2lub2RlOworc3RydWN0IHhmc19ibWJ0X2lyZWM7CitzdHJ1Y3QgeGZzX2J1ZjsKK3N0cnVjdCB4ZnNfaW9tYXA7CisKKyNpZiBkZWZpbmVkKFhGU19SV19UUkFDRSkKKy8qCisgKiBEZWZpbmVzIGZvciB0aGUgdHJhY2UgbWVjaGFuaXNtcyBpbiB4ZnNfbHJ3LmMuCisgKi8KKyNkZWZpbmUJWEZTX1JXX0tUUkFDRV9TSVpFCTEyOAorCisjZGVmaW5lCVhGU19SRUFEX0VOVEVSCQkxCisjZGVmaW5lCVhGU19XUklURV9FTlRFUgkJMgorI2RlZmluZSBYRlNfSU9NQVBfUkVBRF9FTlRFUgkzCisjZGVmaW5lCVhGU19JT01BUF9XUklURV9FTlRFUgk0CisjZGVmaW5lCVhGU19JT01BUF9SRUFEX01BUAk1CisjZGVmaW5lCVhGU19JT01BUF9XUklURV9NQVAJNgorI2RlZmluZQlYRlNfSU9NQVBfV1JJVEVfTk9TUEFDRQk3CisjZGVmaW5lCVhGU19JVFJVTkNfU1RBUlQJOAorI2RlZmluZQlYRlNfSVRSVU5DX0ZJTklTSDEJOQorI2RlZmluZQlYRlNfSVRSVU5DX0ZJTklTSDIJMTAKKyNkZWZpbmUJWEZTX0NUUlVOQzEJCTExCisjZGVmaW5lCVhGU19DVFJVTkMyCQkxMgorI2RlZmluZQlYRlNfQ1RSVU5DMwkJMTMKKyNkZWZpbmUJWEZTX0NUUlVOQzQJCTE0CisjZGVmaW5lCVhGU19DVFJVTkM1CQkxNQorI2RlZmluZQlYRlNfQ1RSVU5DNgkJMTYKKyNkZWZpbmUJWEZTX0JVTk1BUEkJCTE3CisjZGVmaW5lCVhGU19JTlZBTF9DQUNIRUQJMTgKKyNkZWZpbmUJWEZTX0RJT1JEX0VOVEVSCQkxOQorI2RlZmluZQlYRlNfRElPV1JfRU5URVIJCTIwCisjZGVmaW5lCVhGU19TRU5ERklMRV9FTlRFUgkyMQorI2RlZmluZQlYRlNfV1JJVEVQQUdFX0VOVEVSCTIyCisjZGVmaW5lCVhGU19SRUxFQVNFUEFHRV9FTlRFUgkyMworI2RlZmluZQlYRlNfSU9NQVBfQUxMT0NfRU5URVIJMjQKKyNkZWZpbmUJWEZTX0lPTUFQX0FMTE9DX01BUAkyNQorI2RlZmluZQlYRlNfSU9NQVBfVU5XUklUVEVOCTI2CitleHRlcm4gdm9pZCB4ZnNfcndfZW50ZXJfdHJhY2UoaW50LCBzdHJ1Y3QgeGZzX2lvY29yZSAqLAorCQkJCXZvaWQgKiwgc2l6ZV90LCBsb2ZmX3QsIGludCk7CitleHRlcm4gdm9pZCB4ZnNfaW52YWxfY2FjaGVkX3RyYWNlKHN0cnVjdCB4ZnNfaW9jb3JlICosCisJCQkJeGZzX29mZl90LCB4ZnNfb2ZmX3QsIHhmc19vZmZfdCwgeGZzX29mZl90KTsKKyNlbHNlCisjZGVmaW5lIHhmc19yd19lbnRlcl90cmFjZSh0YWcsIGlvLCBkYXRhLCBzaXplLCBvZmZzZXQsIGlvZmxhZ3MpCisjZGVmaW5lIHhmc19pbnZhbF9jYWNoZWRfdHJhY2UoaW8sIG9mZnNldCwgbGVuLCBmaXJzdCwgbGFzdCkKKyNlbmRpZgorCisvKgorICogTWF4aW11bSBjb3VudCBvZiBibWFwcyB1c2VkIGJ5IHJlYWQgYW5kIHdyaXRlIHBhdGhzLgorICovCisjZGVmaW5lCVhGU19NQVhfUldfTkJNQVBTCTQKKworZXh0ZXJuIGludCB4ZnNfYm1hcChzdHJ1Y3QgYmh2X2Rlc2MgKiwgeGZzX29mZl90LCBzc2l6ZV90LCBpbnQsCisJCQlzdHJ1Y3QgeGZzX2lvbWFwICosIGludCAqKTsKK2V4dGVybiBpbnQgeGZzYmRzdHJhdChzdHJ1Y3QgeGZzX21vdW50ICosIHN0cnVjdCB4ZnNfYnVmICopOworZXh0ZXJuIGludCB4ZnNfYmRzdHJhdF9jYihzdHJ1Y3QgeGZzX2J1ZiAqKTsKKworZXh0ZXJuIGludCB4ZnNfemVyb19lb2Yoc3RydWN0IHZub2RlICosIHN0cnVjdCB4ZnNfaW9jb3JlICosIHhmc19vZmZfdCwKKwkJCQl4ZnNfZnNpemVfdCwgeGZzX2ZzaXplX3QpOworZXh0ZXJuIHZvaWQgeGZzX2ludmFsX2NhY2hlZF9wYWdlcyhzdHJ1Y3Qgdm5vZGUJKiwgc3RydWN0IHhmc19pb2NvcmUgKiwKKwkJCQl4ZnNfb2ZmX3QsIGludCwgaW50KTsKK2V4dGVybiBzc2l6ZV90IHhmc19yZWFkKHN0cnVjdCBiaHZfZGVzYyAqLCBzdHJ1Y3Qga2lvY2IgKiwKKwkJCQljb25zdCBzdHJ1Y3QgaW92ZWMgKiwgdW5zaWduZWQgaW50LAorCQkJCWxvZmZfdCAqLCBpbnQsIHN0cnVjdCBjcmVkICopOworZXh0ZXJuIHNzaXplX3QgeGZzX3dyaXRlKHN0cnVjdCBiaHZfZGVzYyAqLCBzdHJ1Y3Qga2lvY2IgKiwKKwkJCQljb25zdCBzdHJ1Y3QgaW92ZWMgKiwgdW5zaWduZWQgaW50LAorCQkJCWxvZmZfdCAqLCBpbnQsIHN0cnVjdCBjcmVkICopOworZXh0ZXJuIHNzaXplX3QgeGZzX3NlbmRmaWxlKHN0cnVjdCBiaHZfZGVzYyAqLCBzdHJ1Y3QgZmlsZSAqLAorCQkJCWxvZmZfdCAqLCBpbnQsIHNpemVfdCwgcmVhZF9hY3Rvcl90LAorCQkJCXZvaWQgKiwgc3RydWN0IGNyZWQgKik7CisKK2V4dGVybiBpbnQgeGZzX2Rldl9pc19yZWFkX29ubHkoc3RydWN0IHhmc19tb3VudCAqLCBjaGFyICopOworCisjZGVmaW5lIFhGU19GU0JfVE9fREJfSU8oaW8sZnNiKSBcCisJCSgoKGlvKS0+aW9fZmxhZ3MgJiBYRlNfSU9DT1JFX1JUKSA/IFwKKwkJIFhGU19GU0JfVE9fQkIoKGlvKS0+aW9fbW91bnQsIChmc2IpKSA6IFwKKwkJIFhGU19GU0JfVE9fREFERFIoKGlvKS0+aW9fbW91bnQsIChmc2IpKSkKKworI2VuZGlmCS8qIF9fWEZTX0xSV19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N0YXRzLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc19zdGF0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZjVkZGIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19zdGF0cy5jCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorCitERUZJTkVfUEVSX0NQVShzdHJ1Y3QgeGZzc3RhdHMsIHhmc3N0YXRzKTsKKworU1RBVElDIGludAoreGZzX3JlYWRfeGZzc3RhdHMoCisJY2hhcgkJKmJ1ZmZlciwKKwljaGFyCQkqKnN0YXJ0LAorCW9mZl90CQlvZmZzZXQsCisJaW50CQljb3VudCwKKwlpbnQJCSplb2YsCisJdm9pZAkJKmRhdGEpCit7CisJaW50CQljLCBpLCBqLCBsZW4sIHZhbDsKKwlfX3VpbnQ2NF90CXhzX3hzdHJhdF9ieXRlcyA9IDA7CisJX191aW50NjRfdAl4c193cml0ZV9ieXRlcyA9IDA7CisJX191aW50NjRfdAl4c19yZWFkX2J5dGVzID0gMDsKKworCXN0YXRpYyBzdHJ1Y3QgeHN0YXRzX2VudHJ5IHsKKwkJY2hhcgkqZGVzYzsKKwkJaW50CWVuZHBvaW50OworCX0geHN0YXRzW10gPSB7CisJCXsgImV4dGVudF9hbGxvYyIsCVhGU1NUQVRfRU5EX0VYVEVOVF9BTExPQwl9LAorCQl7ICJhYnQiLAkJWEZTU1RBVF9FTkRfQUxMT0NfQlRSRUUJCX0sCisJCXsgImJsa19tYXAiLAkJWEZTU1RBVF9FTkRfQkxPQ0tfTUFQUElORwl9LAorCQl7ICJibWJ0IiwJCVhGU1NUQVRfRU5EX0JMT0NLX01BUF9CVFJFRQl9LAorCQl7ICJkaXIiLAkJWEZTU1RBVF9FTkRfRElSRUNUT1JZX09QUwl9LAorCQl7ICJ0cmFucyIsCQlYRlNTVEFUX0VORF9UUkFOU0FDVElPTlMJfSwKKwkJeyAiaWciLAkJCVhGU1NUQVRfRU5EX0lOT0RFX09QUwkJfSwKKwkJeyAibG9nIiwJCVhGU1NUQVRfRU5EX0xPR19PUFMJCX0sCisJCXsgInB1c2hfYWlsIiwJCVhGU1NUQVRfRU5EX1RBSUxfUFVTSElORwl9LAorCQl7ICJ4c3RyYXQiLAkJWEZTU1RBVF9FTkRfV1JJVEVfQ09OVkVSVAl9LAorCQl7ICJydyIsCQkJWEZTU1RBVF9FTkRfUkVBRF9XUklURV9PUFMJfSwKKwkJeyAiYXR0ciIsCQlYRlNTVEFUX0VORF9BVFRSSUJVVEVfT1BTCX0sCisJCXsgImljbHVzdGVyIiwJCVhGU1NUQVRfRU5EX0lOT0RFX0NMVVNURVIJfSwKKwkJeyAidm5vZGVzIiwJCVhGU1NUQVRfRU5EX1ZOT0RFX09QUwkJfSwKKwkJeyAiYnVmIiwJCVhGU1NUQVRfRU5EX0JVRgkJCX0sCisJfTsKKworCS8qIExvb3Agb3ZlciBhbGwgc3RhdHMgZ3JvdXBzICovCisJZm9yIChpPWo9bGVuID0gMDsgaSA8IHNpemVvZih4c3RhdHMpL3NpemVvZihzdHJ1Y3QgeHN0YXRzX2VudHJ5KTsgaSsrKSB7CisJCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgeHN0YXRzW2ldLmRlc2MpOworCQkvKiBpbm5lciBsb29wIGRvZXMgZWFjaCBncm91cCAqLworCQl3aGlsZSAoaiA8IHhzdGF0c1tpXS5lbmRwb2ludCkgeworCQkJdmFsID0gMDsKKwkJCS8qIHN1bSBvdmVyIGFsbCBjcHVzICovCisJCQlmb3IgKGMgPSAwOyBjIDwgTlJfQ1BVUzsgYysrKSB7CisJCQkJaWYgKCFjcHVfcG9zc2libGUoYykpIGNvbnRpbnVlOworCQkJCXZhbCArPSAqKCgoX191MzIqKSZwZXJfY3B1KHhmc3N0YXRzLCBjKSArIGopKTsKKwkJCX0KKwkJCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgIiAldSIsIHZhbCk7CisJCQlqKys7CisJCX0KKwkJYnVmZmVyW2xlbisrXSA9ICdcbic7CisJfQorCS8qIGV4dHJhIHByZWNpc2lvbiBjb3VudGVycyAqLworCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspIHsKKwkJaWYgKCFjcHVfcG9zc2libGUoaSkpIGNvbnRpbnVlOworCQl4c194c3RyYXRfYnl0ZXMgKz0gcGVyX2NwdSh4ZnNzdGF0cywgaSkueHNfeHN0cmF0X2J5dGVzOworCQl4c193cml0ZV9ieXRlcyArPSBwZXJfY3B1KHhmc3N0YXRzLCBpKS54c193cml0ZV9ieXRlczsKKwkJeHNfcmVhZF9ieXRlcyArPSBwZXJfY3B1KHhmc3N0YXRzLCBpKS54c19yZWFkX2J5dGVzOworCX0KKworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgInhwYyAlTHUgJUx1ICVMdVxuIiwKKwkJCXhzX3hzdHJhdF9ieXRlcywgeHNfd3JpdGVfYnl0ZXMsIHhzX3JlYWRfYnl0ZXMpOworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlciArIGxlbiwgImRlYnVnICV1XG4iLAorI2lmIGRlZmluZWQoREVCVUcpCisJCTEpOworI2Vsc2UKKwkJMCk7CisjZW5kaWYKKworCWlmIChvZmZzZXQgPj0gbGVuKSB7CisJCSpzdGFydCA9IGJ1ZmZlcjsKKwkJKmVvZiA9IDE7CisJCXJldHVybiAwOworCX0KKwkqc3RhcnQgPSBidWZmZXIgKyBvZmZzZXQ7CisJaWYgKChsZW4gLT0gb2Zmc2V0KSA+IGNvdW50KQorCQlyZXR1cm4gY291bnQ7CisJKmVvZiA9IDE7CisKKwlyZXR1cm4gbGVuOworfQorCit2b2lkCit4ZnNfaW5pdF9wcm9jZnModm9pZCkKK3sKKwlpZiAoIXByb2NfbWtkaXIoImZzL3hmcyIsIE5VTEwpKQorCQlyZXR1cm47CisJY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiZnMveGZzL3N0YXQiLCAwLCBOVUxMLCB4ZnNfcmVhZF94ZnNzdGF0cywgTlVMTCk7Cit9CisKK3ZvaWQKK3hmc19jbGVhbnVwX3Byb2Nmcyh2b2lkKQoreworCXJlbW92ZV9wcm9jX2VudHJ5KCJmcy94ZnMvc3RhdCIsIE5VTEwpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJmcy94ZnMiLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3N0YXRzLmggYi9mcy94ZnMvbGludXgtMi42L3hmc19zdGF0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNzU2YTYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19zdGF0cy5oCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfU1RBVFNfSF9fCisjZGVmaW5lIF9fWEZTX1NUQVRTX0hfXworCisKKyNpZiBkZWZpbmVkKENPTkZJR19QUk9DX0ZTKSAmJiAhZGVmaW5lZChYRlNfU1RBVFNfT0ZGKQorCisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisKKy8qCisgKiBYRlMgZ2xvYmFsIHN0YXRpc3RpY3MKKyAqLworc3RydWN0IHhmc3N0YXRzIHsKKyMgZGVmaW5lIFhGU1NUQVRfRU5EX0VYVEVOVF9BTExPQwk0CisJX191aW50MzJfdAkJeHNfYWxsb2N4OworCV9fdWludDMyX3QJCXhzX2FsbG9jYjsKKwlfX3VpbnQzMl90CQl4c19mcmVleDsKKwlfX3VpbnQzMl90CQl4c19mcmVlYjsKKyMgZGVmaW5lIFhGU1NUQVRfRU5EX0FMTE9DX0JUUkVFCShYRlNTVEFUX0VORF9FWFRFTlRfQUxMT0MrNCkKKwlfX3VpbnQzMl90CQl4c19hYnRfbG9va3VwOworCV9fdWludDMyX3QJCXhzX2FidF9jb21wYXJlOworCV9fdWludDMyX3QJCXhzX2FidF9pbnNyZWM7CisJX191aW50MzJfdAkJeHNfYWJ0X2RlbHJlYzsKKyMgZGVmaW5lIFhGU1NUQVRfRU5EX0JMT0NLX01BUFBJTkcJKFhGU1NUQVRfRU5EX0FMTE9DX0JUUkVFKzcpCisJX191aW50MzJfdAkJeHNfYmxrX21hcHI7CisJX191aW50MzJfdAkJeHNfYmxrX21hcHc7CisJX191aW50MzJfdAkJeHNfYmxrX3VubWFwOworCV9fdWludDMyX3QJCXhzX2FkZF9leGxpc3Q7CisJX191aW50MzJfdAkJeHNfZGVsX2V4bGlzdDsKKwlfX3VpbnQzMl90CQl4c19sb29rX2V4bGlzdDsKKwlfX3VpbnQzMl90CQl4c19jbXBfZXhsaXN0OworIyBkZWZpbmUgWEZTU1RBVF9FTkRfQkxPQ0tfTUFQX0JUUkVFCShYRlNTVEFUX0VORF9CTE9DS19NQVBQSU5HKzQpCisJX191aW50MzJfdAkJeHNfYm1idF9sb29rdXA7CisJX191aW50MzJfdAkJeHNfYm1idF9jb21wYXJlOworCV9fdWludDMyX3QJCXhzX2JtYnRfaW5zcmVjOworCV9fdWludDMyX3QJCXhzX2JtYnRfZGVscmVjOworIyBkZWZpbmUgWEZTU1RBVF9FTkRfRElSRUNUT1JZX09QUwkoWEZTU1RBVF9FTkRfQkxPQ0tfTUFQX0JUUkVFKzQpCisJX191aW50MzJfdAkJeHNfZGlyX2xvb2t1cDsKKwlfX3VpbnQzMl90CQl4c19kaXJfY3JlYXRlOworCV9fdWludDMyX3QJCXhzX2Rpcl9yZW1vdmU7CisJX191aW50MzJfdAkJeHNfZGlyX2dldGRlbnRzOworIyBkZWZpbmUgWEZTU1RBVF9FTkRfVFJBTlNBQ1RJT05TCShYRlNTVEFUX0VORF9ESVJFQ1RPUllfT1BTKzMpCisJX191aW50MzJfdAkJeHNfdHJhbnNfc3luYzsKKwlfX3VpbnQzMl90CQl4c190cmFuc19hc3luYzsKKwlfX3VpbnQzMl90CQl4c190cmFuc19lbXB0eTsKKyMgZGVmaW5lIFhGU1NUQVRfRU5EX0lOT0RFX09QUwkJKFhGU1NUQVRfRU5EX1RSQU5TQUNUSU9OUys3KQorCV9fdWludDMyX3QJCXhzX2lnX2F0dGVtcHRzOworCV9fdWludDMyX3QJCXhzX2lnX2ZvdW5kOworCV9fdWludDMyX3QJCXhzX2lnX2ZyZWN5Y2xlOworCV9fdWludDMyX3QJCXhzX2lnX21pc3NlZDsKKwlfX3VpbnQzMl90CQl4c19pZ19kdXA7CisJX191aW50MzJfdAkJeHNfaWdfcmVjbGFpbXM7CisJX191aW50MzJfdAkJeHNfaWdfYXR0cmNoZzsKKyMgZGVmaW5lIFhGU1NUQVRfRU5EX0xPR19PUFMJCShYRlNTVEFUX0VORF9JTk9ERV9PUFMrNSkKKwlfX3VpbnQzMl90CQl4c19sb2dfd3JpdGVzOworCV9fdWludDMyX3QJCXhzX2xvZ19ibG9ja3M7CisJX191aW50MzJfdAkJeHNfbG9nX25vaWNsb2dzOworCV9fdWludDMyX3QJCXhzX2xvZ19mb3JjZTsKKwlfX3VpbnQzMl90CQl4c19sb2dfZm9yY2Vfc2xlZXA7CisjIGRlZmluZSBYRlNTVEFUX0VORF9UQUlMX1BVU0hJTkcJKFhGU1NUQVRfRU5EX0xPR19PUFMrMTApCisJX191aW50MzJfdAkJeHNfdHJ5X2xvZ3NwYWNlOworCV9fdWludDMyX3QJCXhzX3NsZWVwX2xvZ3NwYWNlOworCV9fdWludDMyX3QJCXhzX3B1c2hfYWlsOworCV9fdWludDMyX3QJCXhzX3B1c2hfYWlsX3N1Y2Nlc3M7CisJX191aW50MzJfdAkJeHNfcHVzaF9haWxfcHVzaGJ1ZjsKKwlfX3VpbnQzMl90CQl4c19wdXNoX2FpbF9waW5uZWQ7CisJX191aW50MzJfdAkJeHNfcHVzaF9haWxfbG9ja2VkOworCV9fdWludDMyX3QJCXhzX3B1c2hfYWlsX2ZsdXNoaW5nOworCV9fdWludDMyX3QJCXhzX3B1c2hfYWlsX3Jlc3RhcnRzOworCV9fdWludDMyX3QJCXhzX3B1c2hfYWlsX2ZsdXNoOworIyBkZWZpbmUgWEZTU1RBVF9FTkRfV1JJVEVfQ09OVkVSVAkoWEZTU1RBVF9FTkRfVEFJTF9QVVNISU5HKzIpCisJX191aW50MzJfdAkJeHNfeHN0cmF0X3F1aWNrOworCV9fdWludDMyX3QJCXhzX3hzdHJhdF9zcGxpdDsKKyMgZGVmaW5lIFhGU1NUQVRfRU5EX1JFQURfV1JJVEVfT1BTCShYRlNTVEFUX0VORF9XUklURV9DT05WRVJUKzIpCisJX191aW50MzJfdAkJeHNfd3JpdGVfY2FsbHM7CisJX191aW50MzJfdAkJeHNfcmVhZF9jYWxsczsKKyMgZGVmaW5lIFhGU1NUQVRfRU5EX0FUVFJJQlVURV9PUFMJKFhGU1NUQVRfRU5EX1JFQURfV1JJVEVfT1BTKzQpCisJX191aW50MzJfdAkJeHNfYXR0cl9nZXQ7CisJX191aW50MzJfdAkJeHNfYXR0cl9zZXQ7CisJX191aW50MzJfdAkJeHNfYXR0cl9yZW1vdmU7CisJX191aW50MzJfdAkJeHNfYXR0cl9saXN0OworIyBkZWZpbmUgWEZTU1RBVF9FTkRfSU5PREVfQ0xVU1RFUgkoWEZTU1RBVF9FTkRfQVRUUklCVVRFX09QUyszKQorCV9fdWludDMyX3QJCXhzX2lmbHVzaF9jb3VudDsKKwlfX3VpbnQzMl90CQl4c19pY2x1c3Rlcl9mbHVzaGNudDsKKwlfX3VpbnQzMl90CQl4c19pY2x1c3Rlcl9mbHVzaGlub2RlOworIyBkZWZpbmUgWEZTU1RBVF9FTkRfVk5PREVfT1BTCQkoWEZTU1RBVF9FTkRfSU5PREVfQ0xVU1RFUis4KQorCV9fdWludDMyX3QJCXZuX2FjdGl2ZTsJLyogIyB2bm9kZXMgbm90IG9uIGZyZWUgbGlzdHMgKi8KKwlfX3VpbnQzMl90CQl2bl9hbGxvYzsJLyogIyB0aW1lcyB2bl9hbGxvYyBjYWxsZWQgKi8KKwlfX3VpbnQzMl90CQl2bl9nZXQ7CQkvKiAjIHRpbWVzIHZuX2dldCBjYWxsZWQgKi8KKwlfX3VpbnQzMl90CQl2bl9ob2xkOwkvKiAjIHRpbWVzIHZuX2hvbGQgY2FsbGVkICovCisJX191aW50MzJfdAkJdm5fcmVsZTsJLyogIyB0aW1lcyB2bl9yZWxlIGNhbGxlZCAqLworCV9fdWludDMyX3QJCXZuX3JlY2xhaW07CS8qICMgdGltZXMgdm5fcmVjbGFpbSBjYWxsZWQgKi8KKwlfX3VpbnQzMl90CQl2bl9yZW1vdmU7CS8qICMgdGltZXMgdm5fcmVtb3ZlIGNhbGxlZCAqLworCV9fdWludDMyX3QJCXZuX2ZyZWU7CS8qICMgdGltZXMgdm5fZnJlZSBjYWxsZWQgKi8KKyNkZWZpbmUgWEZTU1RBVF9FTkRfQlVGCQkJKFhGU1NUQVRfRU5EX1ZOT0RFX09QUys5KQorCV9fdWludDMyX3QJCXBiX2dldDsKKwlfX3VpbnQzMl90CQlwYl9jcmVhdGU7CisJX191aW50MzJfdAkJcGJfZ2V0X2xvY2tlZDsKKwlfX3VpbnQzMl90CQlwYl9nZXRfbG9ja2VkX3dhaXRlZDsKKwlfX3VpbnQzMl90CQlwYl9idXN5X2xvY2tlZDsKKwlfX3VpbnQzMl90CQlwYl9taXNzX2xvY2tlZDsKKwlfX3VpbnQzMl90CQlwYl9wYWdlX3JldHJpZXM7CisJX191aW50MzJfdAkJcGJfcGFnZV9mb3VuZDsKKwlfX3VpbnQzMl90CQlwYl9nZXRfcmVhZDsKKy8qIEV4dHJhIHByZWNpc2lvbiBjb3VudGVycyAqLworCV9fdWludDY0X3QJCXhzX3hzdHJhdF9ieXRlczsKKwlfX3VpbnQ2NF90CQl4c193cml0ZV9ieXRlczsKKwlfX3VpbnQ2NF90CQl4c19yZWFkX2J5dGVzOworfTsKKworREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCB4ZnNzdGF0cywgeGZzc3RhdHMpOworCisvKgorICogV2UgZG9uJ3QgZGlzYWJsZSBwcmVlbXB0LCBub3QgdG9vIHdvcnJpZWQgYWJvdXQgcG9raW5nIHRoZQorICogd3JvbmcgQ1BVJ3Mgc3RhdCBmb3Igbm93IChhbHNvIGFnZ3JlZ2F0ZWQgYmVmb3JlIHJlcG9ydGluZykuCisgKi8KKyNkZWZpbmUgWEZTX1NUQVRTX0lOQyh2KQkocGVyX2NwdSh4ZnNzdGF0cywgY3VycmVudF9jcHUoKSkudisrKQorI2RlZmluZSBYRlNfU1RBVFNfREVDKHYpCShwZXJfY3B1KHhmc3N0YXRzLCBjdXJyZW50X2NwdSgpKS52LS0pCisjZGVmaW5lIFhGU19TVEFUU19BREQodiwgaW5jKQkocGVyX2NwdSh4ZnNzdGF0cywgY3VycmVudF9jcHUoKSkudiArPSAoaW5jKSkKKworZXh0ZXJuIHZvaWQgeGZzX2luaXRfcHJvY2ZzKHZvaWQpOworZXh0ZXJuIHZvaWQgeGZzX2NsZWFudXBfcHJvY2ZzKHZvaWQpOworCisKKyNlbHNlCS8qICFDT05GSUdfUFJPQ19GUyAqLworCisjIGRlZmluZSBYRlNfU1RBVFNfSU5DKGNvdW50KQorIyBkZWZpbmUgWEZTX1NUQVRTX0RFQyhjb3VudCkKKyMgZGVmaW5lIFhGU19TVEFUU19BREQoY291bnQsIGluYykKKworc3RhdGljIF9faW5saW5lIHZvaWQgeGZzX2luaXRfcHJvY2ZzKHZvaWQpIHsgfTsKK3N0YXRpYyBfX2lubGluZSB2b2lkIHhmc19jbGVhbnVwX3Byb2Nmcyh2b2lkKSB7IH07CisKKyNlbmRpZgkvKiAhQ09ORklHX1BST0NfRlMgKi8KKworI2VuZGlmIC8qIF9fWEZTX1NUQVRTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNkYzY1OAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmMKQEAgLTAsMCArMSw5MTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKworI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc19jbG50LmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX3F1b3RhLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvYy5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19ibWFwLmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgorI2luY2x1ZGUgInhmc19ydGFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisjaW5jbHVkZSAieGZzX2l0YWJsZS5oIgorI2luY2x1ZGUgInhmc19ydy5oIgorI2luY2x1ZGUgInhmc19hY2wuaCIKKyNpbmNsdWRlICJ4ZnNfY2FwLmgiCisjaW5jbHVkZSAieGZzX21hYy5oIgorI2luY2x1ZGUgInhmc19hdHRyLmgiCisjaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCisjaW5jbHVkZSAieGZzX3V0aWxzLmgiCisjaW5jbHVkZSAieGZzX3ZlcnNpb24uaCIKKyNpbmNsdWRlICJ4ZnNfaW9jdGwzMi5oIgorCisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KKworU1RBVElDIHN0cnVjdCBxdW90YWN0bF9vcHMgbGludmZzX3FvcHM7CitTVEFUSUMgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgbGludmZzX3NvcHM7CitTVEFUSUMga21lbV96b25lX3QgKmxpbnZmc19pbm9kZV96b25lOworCitTVEFUSUMgc3RydWN0IHhmc19tb3VudF9hcmdzICoKK3hmc19hcmdzX2FsbG9jYXRlKAorCXN0cnVjdCBzdXBlcl9ibG9jawkqc2IpCit7CisJc3RydWN0IHhmc19tb3VudF9hcmdzCSphcmdzOworCisJYXJncyA9IGttZW1femFsbG9jKHNpemVvZihzdHJ1Y3QgeGZzX21vdW50X2FyZ3MpLCBLTV9TTEVFUCk7CisJYXJncy0+bG9nYnVmcyA9IGFyZ3MtPmxvZ2J1ZnNpemUgPSAtMTsKKwlzdHJuY3B5KGFyZ3MtPmZzbmFtZSwgc2ItPnNfaWQsIE1BWE5BTUVMRU4pOworCisJLyogQ29weSB0aGUgYWxyZWFkeS1wYXJzZWQgbW91bnQoMikgZmxhZ3Mgd2UncmUgaW50ZXJlc3RlZCBpbiAqLworCWlmIChzYi0+c19mbGFncyAmIE1TX05PQVRJTUUpCisJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9OT0FUSU1FOworCWlmIChzYi0+c19mbGFncyAmIE1TX0RJUlNZTkMpCisJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9ESVJTWU5DOworCWlmIChzYi0+c19mbGFncyAmIE1TX1NZTkNIUk9OT1VTKQorCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfV1NZTkM7CisKKwkvKiBEZWZhdWx0IHRvIDMyIGJpdCBpbm9kZXMgb24gTGludXggYWxsIHRoZSB0aW1lICovCisJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UXzMyQklUSU5PREVTOworCisJcmV0dXJuIGFyZ3M7Cit9CisKK19fdWludDY0X3QKK3hmc19tYXhfZmlsZV9vZmZzZXQoCisJdW5zaWduZWQgaW50CQlibG9ja3NoaWZ0KQoreworCXVuc2lnbmVkIGludAkJcGFnZWZhY3RvciA9IDE7CisJdW5zaWduZWQgaW50CQliaXRzaGlmdCA9IEJJVFNfUEVSX0xPTkcgLSAxOworCisJLyogRmlndXJlIG91dCBtYXhpbXVtIGZpbGVzaXplLCBvbiBMaW51eCB0aGlzIGNhbiBkZXBlbmQgb24KKwkgKiB0aGUgZmlsZXN5c3RlbSBibG9ja3NpemUgKG9uIDMyIGJpdCBwbGF0Zm9ybXMpLgorCSAqIF9fYmxvY2tfcHJlcGFyZV93cml0ZSBkb2VzIHRoaXMgaW4gYW4gW3Vuc2lnbmVkXSBsb25nLi4uCisJICogICAgICBwYWdlLT5pbmRleCA8PCAoUEFHRV9DQUNIRV9TSElGVCAtIGJiaXRzKQorCSAqIFNvLCBmb3IgcGFnZSBzaXplZCBibG9ja3MgKDRLIG9uIDMyIGJpdCBwbGF0Zm9ybXMpLAorCSAqIHRoaXMgd3JhcHMgYXQgYXJvdW5kIDhUYiAoaGVuY2UgTUFYX0xGU19GSUxFU0laRSB3aGljaCBpcworCSAqICAgICAgKCgodTY0KVBBR0VfQ0FDSEVfU0laRSA8PCAoQklUU19QRVJfTE9ORy0xKSktMSkKKwkgKiBidXQgZm9yIHNtYWxsZXIgYmxvY2tzaXplcyBpdCBpcyBsZXNzIChiYml0cyA9IGxvZzIgYnNpemUpLgorCSAqIE5vdGUxOiBnZXRfYmxvY2tfdCB0YWtlcyBhIGxvbmcgKGltcGxpY2l0IGNhc3QgZnJvbSBhYm92ZSkKKwkgKiBOb3RlMjogVGhlIExhcmdlIEJsb2NrIERldmljZSAoTEJEIGFuZCBIQVZFX1NFQ1RPUl9UKSBwYXRjaAorCSAqIGNhbiBvcHRpb25hbGx5IGNvbnZlcnQgdGhlIFt1bnNpZ25lZF0gbG9uZyBmcm9tIGFib3ZlIGludG8KKwkgKiBhbiBbdW5zaWduZWRdIGxvbmcgbG9uZy4KKwkgKi8KKworI2lmIEJJVFNfUEVSX0xPTkcgPT0gMzIKKyMgaWYgZGVmaW5lZChDT05GSUdfTEJEKQorCUFTU0VSVChzaXplb2Yoc2VjdG9yX3QpID09IDgpOworCXBhZ2VmYWN0b3IgPSBQQUdFX0NBQ0hFX1NJWkU7CisJYml0c2hpZnQgPSBCSVRTX1BFUl9MT05HOworIyBlbHNlCisJcGFnZWZhY3RvciA9IFBBR0VfQ0FDSEVfU0laRSA+PiAoUEFHRV9DQUNIRV9TSElGVCAtIGJsb2Nrc2hpZnQpOworIyBlbmRpZgorI2VuZGlmCisKKwlyZXR1cm4gKCgoX191aW50NjRfdClwYWdlZmFjdG9yKSA8PCBiaXRzaGlmdCkgLSAxOworfQorCitTVEFUSUMgX19pbmxpbmVfXyB2b2lkCit4ZnNfc2V0X2lub2Rlb3BzKAorCXN0cnVjdCBpbm9kZQkJKmlub2RlKQoreworCXZub2RlX3QJCQkqdnAgPSBMSU5WRlNfR0VUX1ZQKGlub2RlKTsKKworCWlmICh2cC0+dl90eXBlID09IFZOT04pIHsKKwkJdm5fbWFya19iYWQodnApOworCX0gZWxzZSBpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgeworCQlpbm9kZS0+aV9vcCA9ICZsaW52ZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9mb3AgPSAmbGludmZzX2ZpbGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmbGludmZzX2FvcHM7CisJfSBlbHNlIGlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CisJCWlub2RlLT5pX29wID0gJmxpbnZmc19kaXJfaW5vZGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJmxpbnZmc19kaXJfb3BlcmF0aW9uczsKKwl9IGVsc2UgaWYgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkpIHsKKwkJaW5vZGUtPmlfb3AgPSAmbGludmZzX3N5bWxpbmtfaW5vZGVfb3BlcmF0aW9uczsKKwkJaWYgKGlub2RlLT5pX2Jsb2NrcykKKwkJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmxpbnZmc19hb3BzOworCX0gZWxzZSB7CisJCWlub2RlLT5pX29wID0gJmxpbnZmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CisJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwgaW5vZGUtPmlfcmRldik7CisJfQorfQorCitTVEFUSUMgX19pbmxpbmVfXyB2b2lkCit4ZnNfcmV2YWxpZGF0ZV9pbm9kZSgKKwl4ZnNfbW91bnRfdAkJKm1wLAorCXZub2RlX3QJCQkqdnAsCisJeGZzX2lub2RlX3QJCSppcCkKK3sKKwlzdHJ1Y3QgaW5vZGUJCSppbm9kZSA9IExJTlZGU19HRVRfSVAodnApOworCisJaW5vZGUtPmlfbW9kZQk9IChpcC0+aV9kLmRpX21vZGUgJiBNT0RFTUFTSykgfCBWVFRPSUYodnAtPnZfdHlwZSk7CisJaW5vZGUtPmlfbmxpbmsJPSBpcC0+aV9kLmRpX25saW5rOworCWlub2RlLT5pX3VpZAk9IGlwLT5pX2QuZGlfdWlkOworCWlub2RlLT5pX2dpZAk9IGlwLT5pX2QuZGlfZ2lkOworCWlmICgoKDEgPDwgdnAtPnZfdHlwZSkgJiAoKDE8PFZCTEspIHwgKDE8PFZDSFIpKSkgPT0gMCkgeworCQlpbm9kZS0+aV9yZGV2ID0gMDsKKwl9IGVsc2UgeworCQl4ZnNfZGV2X3QgZGV2ID0gaXAtPmlfZGYuaWZfdTIuaWZfcmRldjsKKwkJaW5vZGUtPmlfcmRldiA9IE1LREVWKHN5c3ZfbWFqb3IoZGV2KSAmIDB4MWZmLCBzeXN2X21pbm9yKGRldikpOworCX0KKwlpbm9kZS0+aV9ibGtzaXplID0gUEFHRV9DQUNIRV9TSVpFOworCWlub2RlLT5pX2dlbmVyYXRpb24gPSBpcC0+aV9kLmRpX2dlbjsKKwlpX3NpemVfd3JpdGUoaW5vZGUsIGlwLT5pX2QuZGlfc2l6ZSk7CisJaW5vZGUtPmlfYmxvY2tzID0KKwkJWEZTX0ZTQl9UT19CQihtcCwgaXAtPmlfZC5kaV9uYmxvY2tzICsgaXAtPmlfZGVsYXllZF9ibGtzKTsKKwlpbm9kZS0+aV9hdGltZS50dl9zZWMJPSBpcC0+aV9kLmRpX2F0aW1lLnRfc2VjOworCWlub2RlLT5pX2F0aW1lLnR2X25zZWMJPSBpcC0+aV9kLmRpX2F0aW1lLnRfbnNlYzsKKwlpbm9kZS0+aV9tdGltZS50dl9zZWMJPSBpcC0+aV9kLmRpX210aW1lLnRfc2VjOworCWlub2RlLT5pX210aW1lLnR2X25zZWMJPSBpcC0+aV9kLmRpX210aW1lLnRfbnNlYzsKKwlpbm9kZS0+aV9jdGltZS50dl9zZWMJPSBpcC0+aV9kLmRpX2N0aW1lLnRfc2VjOworCWlub2RlLT5pX2N0aW1lLnR2X25zZWMJPSBpcC0+aV9kLmRpX2N0aW1lLnRfbnNlYzsKKwlpZiAoaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfSU1NVVRBQkxFKQorCQlpbm9kZS0+aV9mbGFncyB8PSBTX0lNTVVUQUJMRTsKKwllbHNlCisJCWlub2RlLT5pX2ZsYWdzICY9IH5TX0lNTVVUQUJMRTsKKwlpZiAoaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfQVBQRU5EKQorCQlpbm9kZS0+aV9mbGFncyB8PSBTX0FQUEVORDsKKwllbHNlCisJCWlub2RlLT5pX2ZsYWdzICY9IH5TX0FQUEVORDsKKwlpZiAoaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfU1lOQykKKwkJaW5vZGUtPmlfZmxhZ3MgfD0gU19TWU5DOworCWVsc2UKKwkJaW5vZGUtPmlfZmxhZ3MgJj0gflNfU1lOQzsKKwlpZiAoaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfTk9BVElNRSkKKwkJaW5vZGUtPmlfZmxhZ3MgfD0gU19OT0FUSU1FOworCWVsc2UKKwkJaW5vZGUtPmlfZmxhZ3MgJj0gflNfTk9BVElNRTsKKwl2cC0+dl9mbGFnICY9IH5WTU9ESUZJRUQ7Cit9CisKK3ZvaWQKK3hmc19pbml0aWFsaXplX3Zub2RlKAorCWJodl9kZXNjX3QJCSpiZHAsCisJdm5vZGVfdAkJCSp2cCwKKwliaHZfZGVzY190CQkqaW5vZGVfYmh2LAorCWludAkJCXVubG9jaykKK3sKKwl4ZnNfaW5vZGVfdAkJKmlwID0gWEZTX0JIVlRPSShpbm9kZV9iaHYpOworCXN0cnVjdCBpbm9kZQkJKmlub2RlID0gTElOVkZTX0dFVF9JUCh2cCk7CisKKwlpZiAoIWlub2RlX2Jodi0+YmRfdm9iaikgeworCQl2cC0+dl92ZnNwID0gYmh2dG92ZnMoYmRwKTsKKwkJYmh2X2Rlc2NfaW5pdChpbm9kZV9iaHYsIGlwLCB2cCwgJnhmc192bm9kZW9wcyk7CisJCWJodl9pbnNlcnQoVk5fQkhWX0hFQUQodnApLCBpbm9kZV9iaHYpOworCX0KKworCS8qCisJICogV2UgbmVlZCB0byBzZXQgdGhlIG9wcyB2ZWN0b3JzLCBhbmQgdW5sb2NrIHRoZSBpbm9kZSwgYnV0IGlmCisJICogd2UgaGF2ZSBiZWVuIGNhbGxlZCBkdXJpbmcgdGhlIG5ldyBpbm9kZSBjcmVhdGUgcHJvY2VzcywgaXQgaXMKKwkgKiB0b28gZWFybHkgdG8gZmlsbCBpbiB0aGUgTGludXggaW5vZGUuICBXZSB3aWxsIGdldCBjYWxsZWQgYQorCSAqIHNlY29uZCB0aW1lIG9uY2UgdGhlIGlub2RlIGlzIHByb3Blcmx5IHNldCB1cCwgYW5kIHRoZW4gd2UgY2FuCisJICogZmluaXNoIG91ciB3b3JrLgorCSAqLworCWlmIChpcC0+aV9kLmRpX21vZGUgIT0gMCAmJiB1bmxvY2sgJiYgKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpKSB7CisJCXZwLT52X3R5cGUgPSBJRlRPVlQoaXAtPmlfZC5kaV9tb2RlKTsKKwkJeGZzX3JldmFsaWRhdGVfaW5vZGUoWEZTX0JIVlRPTShiZHApLCB2cCwgaXApOworCQl4ZnNfc2V0X2lub2Rlb3BzKGlub2RlKTsKKwkKKwkJaXAtPmlfZmxhZ3MgJj0gflhGU19JTkVXOworCQliYXJyaWVyKCk7CisKKwkJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CisJfQorfQorCitpbnQKK3hmc19ibGtkZXZfZ2V0KAorCXhmc19tb3VudF90CQkqbXAsCisJY29uc3QgY2hhcgkJKm5hbWUsCisJc3RydWN0IGJsb2NrX2RldmljZQkqKmJkZXZwKQoreworCWludAkJCWVycm9yID0gMDsKKworCSpiZGV2cCA9IG9wZW5fYmRldl9leGNsKG5hbWUsIDAsIG1wKTsKKwlpZiAoSVNfRVJSKCpiZGV2cCkpIHsKKwkJZXJyb3IgPSBQVFJfRVJSKCpiZGV2cCk7CisJCXByaW50aygiWEZTOiBJbnZhbGlkIGRldmljZSBbJXNdLCBlcnJvcj0lZFxuIiwgbmFtZSwgZXJyb3IpOworCX0KKworCXJldHVybiAtZXJyb3I7Cit9CisKK3ZvaWQKK3hmc19ibGtkZXZfcHV0KAorCXN0cnVjdCBibG9ja19kZXZpY2UJKmJkZXYpCit7CisJaWYgKGJkZXYpCisJCWNsb3NlX2JkZXZfZXhjbChiZGV2KTsKK30KKworCitTVEFUSUMgc3RydWN0IGlub2RlICoKK2xpbnZmc19hbGxvY19pbm9kZSgKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sJKnNiKQoreworCXZub2RlX3QJCQkqdnA7CisKKwl2cCA9ICh2bm9kZV90ICopa21lbV9jYWNoZV9hbGxvYyhsaW52ZnNfaW5vZGVfem9uZSwgCisgICAgICAgICAgICAgICAga21lbV9mbGFnc19jb252ZXJ0KEtNX1NMRUVQKSk7CisJaWYgKCF2cCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIExJTlZGU19HRVRfSVAodnApOworfQorCitTVEFUSUMgdm9pZAorbGludmZzX2Rlc3Ryb3lfaW5vZGUoCisJc3RydWN0IGlub2RlCQkqaW5vZGUpCit7CisJa21lbV9jYWNoZV9mcmVlKGxpbnZmc19pbm9kZV96b25lLCBMSU5WRlNfR0VUX1ZQKGlub2RlKSk7Cit9CisKK1NUQVRJQyB2b2lkCitpbml0X29uY2UoCisJdm9pZAkJCSpkYXRhLAorCWttZW1fY2FjaGVfdAkJKmNhY2hlcCwKKwl1bnNpZ25lZCBsb25nCQlmbGFncykKK3sKKwl2bm9kZV90CQkJKnZwID0gKHZub2RlX3QgKilkYXRhOworCisJaWYgKChmbGFncyAmIChTTEFCX0NUT1JfVkVSSUZZfFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikpID09CisJICAgIFNMQUJfQ1RPUl9DT05TVFJVQ1RPUikKKwkJaW5vZGVfaW5pdF9vbmNlKExJTlZGU19HRVRfSVAodnApKTsKK30KKworU1RBVElDIGludAoraW5pdF9pbm9kZWNhY2hlKCB2b2lkICkKK3sKKwlsaW52ZnNfaW5vZGVfem9uZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJsaW52ZnNfaWNhY2hlIiwKKwkJCQlzaXplb2Yodm5vZGVfdCksIDAsIFNMQUJfUkVDTEFJTV9BQ0NPVU5ULAorCQkJCWluaXRfb25jZSwgTlVMTCk7CisJaWYgKGxpbnZmc19pbm9kZV96b25lID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCitTVEFUSUMgdm9pZAorZGVzdHJveV9pbm9kZWNhY2hlKCB2b2lkICkKK3sKKwlpZiAoa21lbV9jYWNoZV9kZXN0cm95KGxpbnZmc19pbm9kZV96b25lKSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGNhY2hlIHN0aWxsIGluIHVzZSFcbiIsIF9fRlVOQ1RJT05fXyk7Cit9CisKKy8qCisgKiBBdHRlbXB0IHRvIGZsdXNoIHRoZSBpbm9kZSwgdGhpcyB3aWxsIGFjdHVhbGx5IGZhaWwKKyAqIGlmIHRoZSBpbm9kZSBpcyBwaW5uZWQsIGJ1dCB3ZSBkaXJ0eSB0aGUgaW5vZGUgYWdhaW4KKyAqIGF0IHRoZSBwb2ludCB3aGVuIGl0IGlzIHVucGlubmVkIGFmdGVyIGEgbG9nIHdyaXRlLAorICogc2luY2UgdGhpcyBpcyB3aGVuIHRoZSBpbm9kZSBpdHNlbGYgYmVjb21lcyBmbHVzaGFibGUuIAorICovCitTVEFUSUMgaW50CitsaW52ZnNfd3JpdGVfaW5vZGUoCisJc3RydWN0IGlub2RlCQkqaW5vZGUsCisJaW50CQkJc3luYykKK3sKKwl2bm9kZV90CQkJKnZwID0gTElOVkZTX0dFVF9WUChpbm9kZSk7CisJaW50CQkJZXJyb3IgPSAwLCBmbGFncyA9IEZMVVNIX0lOT0RFOworCisJaWYgKHZwKSB7CisJCXZuX3RyYWNlX2VudHJ5KHZwLCBfX0ZVTkNUSU9OX18sIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKwkJaWYgKHN5bmMpCisJCQlmbGFncyB8PSBGTFVTSF9TWU5DOworCQlWT1BfSUZMVVNIKHZwLCBmbGFncywgZXJyb3IpOworCQlpZiAoZXJyb3IgPT0gRUFHQUlOKSB7CisJCQlpZiAoc3luYykKKwkJCQlWT1BfSUZMVVNIKHZwLCBmbGFncyB8IEZMVVNIX0xPRywgZXJyb3IpOworCQkJZWxzZQorCQkJCWVycm9yID0gMDsKKwkJfQorCX0KKworCXJldHVybiAtZXJyb3I7Cit9CisKK1NUQVRJQyB2b2lkCitsaW52ZnNfY2xlYXJfaW5vZGUoCisJc3RydWN0IGlub2RlCQkqaW5vZGUpCit7CisJdm5vZGVfdAkJCSp2cCA9IExJTlZGU19HRVRfVlAoaW5vZGUpOworCisJaWYgKHZwKSB7CisJCXZuX3JlbGUodnApOworCQl2bl90cmFjZV9lbnRyeSh2cCwgX19GVU5DVElPTl9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisJCS8qCisJCSAqIERvIGFsbCBvdXIgY2xlYW51cCwgYW5kIHJlbW92ZSB0aGlzIHZub2RlLgorCQkgKi8KKwkJdm5fcmVtb3ZlKHZwKTsKKwl9Cit9CisKKworLyoKKyAqIEVucXVldWUgYSB3b3JrIGl0ZW0gdG8gYmUgcGlja2VkIHVwIGJ5IHRoZSB2ZnMgeGZzc3luY2QgdGhyZWFkLgorICogRG9pbmcgdGhpcyBoYXMgdHdvIGFkdmFudGFnZXM6CisgKiAtIEl0IHNhdmVzIG9uIHN0YWNrIHNwYWNlLCB3aGljaCBpcyB0aWdodCBpbiBjZXJ0YWluIHNpdHVhdGlvbnMKKyAqIC0gSXQgY2FuIGJlIHVzZWQgKHdpdGggY2FyZSkgYXMgYSBtZWNoYW5pc20gdG8gYXZvaWQgZGVhZGxvY2tzLgorICogRmx1c2hpbmcgd2hpbGUgYWxsb2NhdGluZyBpbiBhIGZ1bGwgZmlsZXN5c3RlbSByZXF1aXJlcyBib3RoLgorICovCitTVEFUSUMgdm9pZAoreGZzX3N5bmNkX3F1ZXVlX3dvcmsoCisJc3RydWN0IHZmcwkqdmZzLAorCXZvaWQJCSpkYXRhLAorCXZvaWQJCSgqc3luY2VyKSh2ZnNfdCAqLCB2b2lkICopKQoreworCXZmc19zeW5jX3dvcmtfdAkqd29yazsKKworCXdvcmsgPSBrbWVtX2FsbG9jKHNpemVvZihzdHJ1Y3QgdmZzX3N5bmNfd29yayksIEtNX1NMRUVQKTsKKwlJTklUX0xJU1RfSEVBRCgmd29yay0+d19saXN0KTsKKwl3b3JrLT53X3N5bmNlciA9IHN5bmNlcjsKKwl3b3JrLT53X2RhdGEgPSBkYXRhOworCXdvcmstPndfdmZzID0gdmZzOworCXNwaW5fbG9jaygmdmZzLT52ZnNfc3luY19sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZ3b3JrLT53X2xpc3QsICZ2ZnMtPnZmc19zeW5jX2xpc3QpOworCXNwaW5fdW5sb2NrKCZ2ZnMtPnZmc19zeW5jX2xvY2spOworCXdha2VfdXBfcHJvY2Vzcyh2ZnMtPnZmc19zeW5jX3Rhc2spOworfQorCisvKgorICogRmx1c2ggZGVsYXllZCBhbGxvY2F0ZSBkYXRhLCBhdHRlbXB0aW5nIHRvIGZyZWUgdXAgcmVzZXJ2ZWQgc3BhY2UKKyAqIGZyb20gZXhpc3RpbmcgYWxsb2NhdGlvbnMuICBBdCB0aGlzIHBvaW50IGEgbmV3IGFsbG9jYXRpb24gYXR0ZW1wdAorICogaGFzIGZhaWxlZCB3aXRoIEVOT1NQQyBhbmQgd2UgYXJlIGluIHRoZSBwcm9jZXNzIG9mIHNjcmF0Y2hpbmcgb3VyCisgKiBoZWFkcywgbG9va2luZyBhYm91dCBmb3IgbW9yZSByb29tLi4uCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfZmx1c2hfaW5vZGVfd29yaygKKwl2ZnNfdAkJKnZmcywKKwl2b2lkCQkqaW5vZGUpCit7CisJZmlsZW1hcF9mbHVzaCgoKHN0cnVjdCBpbm9kZSAqKWlub2RlKS0+aV9tYXBwaW5nKTsKKwlpcHV0KChzdHJ1Y3QgaW5vZGUgKilpbm9kZSk7Cit9CisKK3ZvaWQKK3hmc19mbHVzaF9pbm9kZSgKKwl4ZnNfaW5vZGVfdAkqaXApCit7CisJc3RydWN0IGlub2RlCSppbm9kZSA9IExJTlZGU19HRVRfSVAoWEZTX0lUT1YoaXApKTsKKwlzdHJ1Y3QgdmZzCSp2ZnMgPSBYRlNfTVRPVkZTKGlwLT5pX21vdW50KTsKKworCWlncmFiKGlub2RlKTsKKwl4ZnNfc3luY2RfcXVldWVfd29yayh2ZnMsIGlub2RlLCB4ZnNfZmx1c2hfaW5vZGVfd29yayk7CisJZGVsYXkoSFovMik7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSAiYmlnZ2VyIGhhbW1lciIgdmVyc2lvbiBvZiB4ZnNfZmx1c2hfaW5vZGVfd29yay4uLgorICogKElPVywgIklmIGF0IGZpcnN0IHlvdSBkb24ndCBzdWNjZWVkLCB1c2UgYSBCaWdnZXIgSGFtbWVyIikuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfZmx1c2hfZGV2aWNlX3dvcmsoCisJdmZzX3QJCSp2ZnMsCisJdm9pZAkJKmlub2RlKQoreworCXN5bmNfYmxvY2tkZXYodmZzLT52ZnNfc3VwZXItPnNfYmRldik7CisJaXB1dCgoc3RydWN0IGlub2RlICopaW5vZGUpOworfQorCit2b2lkCit4ZnNfZmx1c2hfZGV2aWNlKAorCXhmc19pbm9kZV90CSppcCkKK3sKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gTElOVkZTX0dFVF9JUChYRlNfSVRPVihpcCkpOworCXN0cnVjdCB2ZnMJKnZmcyA9IFhGU19NVE9WRlMoaXAtPmlfbW91bnQpOworCisJaWdyYWIoaW5vZGUpOworCXhmc19zeW5jZF9xdWV1ZV93b3JrKHZmcywgaW5vZGUsIHhmc19mbHVzaF9kZXZpY2Vfd29yayk7CisJZGVsYXkoSFovMik7CisJeGZzX2xvZ19mb3JjZShpcC0+aV9tb3VudCwgKHhmc19sc25fdCkwLCBYRlNfTE9HX0ZPUkNFfFhGU19MT0dfU1lOQyk7Cit9CisKKyNkZWZpbmUgU1lOQ0RfRkxBR1MJKFNZTkNfRlNEQVRBfFNZTkNfQkRGTFVTSHxTWU5DX0FUVFIpCitTVEFUSUMgdm9pZAordmZzX3N5bmNfd29ya2VyKAorCXZmc190CQkqdmZzcCwKKwl2b2lkCQkqdW51c2VkKQoreworCWludAkJZXJyb3I7CisKKwlpZiAoISh2ZnNwLT52ZnNfZmxhZyAmIFZGU19SRE9OTFkpKQorCQlWRlNfU1lOQyh2ZnNwLCBTWU5DRF9GTEFHUywgTlVMTCwgZXJyb3IpOworCXZmc3AtPnZmc19zeW5jX3NlcSsrOworCXdtYigpOworCXdha2VfdXAoJnZmc3AtPnZmc193YWl0X3NpbmdsZV9zeW5jX3Rhc2spOworfQorCitTVEFUSUMgaW50Cit4ZnNzeW5jZCgKKwl2b2lkCQkJKmFyZykKK3sKKwlsb25nCQkJdGltZWxlZnQ7CisJdmZzX3QJCQkqdmZzcCA9ICh2ZnNfdCAqKSBhcmc7CisJc3RydWN0IGxpc3RfaGVhZAl0bXA7CisJc3RydWN0IHZmc19zeW5jX3dvcmsJKndvcmssICpuOworCisJZGFlbW9uaXplKCJ4ZnNzeW5jZCIpOworCisJdmZzcC0+dmZzX3N5bmNfd29yay53X3ZmcyA9IHZmc3A7CisJdmZzcC0+dmZzX3N5bmNfd29yay53X3N5bmNlciA9IHZmc19zeW5jX3dvcmtlcjsKKwl2ZnNwLT52ZnNfc3luY190YXNrID0gY3VycmVudDsKKwl3bWIoKTsKKwl3YWtlX3VwKCZ2ZnNwLT52ZnNfd2FpdF9zeW5jX3Rhc2spOworCisJSU5JVF9MSVNUX0hFQUQoJnRtcCk7CisJdGltZWxlZnQgPSAoeGZzX3N5bmNkX2NlbnRpc2VjcyAqIEhaKSAvIDEwMDsKKwlmb3IgKDs7KSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXRpbWVsZWZ0ID0gc2NoZWR1bGVfdGltZW91dCh0aW1lbGVmdCk7CisJCS8qIHN3c3VzcCAqLworCQl0cnlfdG9fZnJlZXplKFBGX0ZSRUVaRSk7CisJCWlmICh2ZnNwLT52ZnNfZmxhZyAmIFZGU19VTU9VTlQpCisJCQlicmVhazsKKworCQlzcGluX2xvY2soJnZmc3AtPnZmc19zeW5jX2xvY2spOworCQkvKgorCQkgKiBXZSBjYW4gZ2V0IHdva2VuIGJ5IGxhcHRvcCBtb2RlLCB0byBkbyBhIHN5bmMgLQorCQkgKiB0aGF0J3MgdGhlIChvbmx5ISkgY2FzZSB3aGVyZSB0aGUgbGlzdCB3b3VsZCBiZQorCQkgKiBlbXB0eSB3aXRoIHRpbWUgcmVtYWluaW5nLgorCQkgKi8KKwkJaWYgKCF0aW1lbGVmdCB8fCBsaXN0X2VtcHR5KCZ2ZnNwLT52ZnNfc3luY19saXN0KSkgeworCQkJaWYgKCF0aW1lbGVmdCkKKwkJCQl0aW1lbGVmdCA9ICh4ZnNfc3luY2RfY2VudGlzZWNzICogSFopIC8gMTAwOworCQkJSU5JVF9MSVNUX0hFQUQoJnZmc3AtPnZmc19zeW5jX3dvcmsud19saXN0KTsKKwkJCWxpc3RfYWRkX3RhaWwoJnZmc3AtPnZmc19zeW5jX3dvcmsud19saXN0LAorCQkJCQkmdmZzcC0+dmZzX3N5bmNfbGlzdCk7CisJCX0KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHdvcmssIG4sICZ2ZnNwLT52ZnNfc3luY19saXN0LCB3X2xpc3QpCisJCQlsaXN0X21vdmUoJndvcmstPndfbGlzdCwgJnRtcCk7CisJCXNwaW5fdW5sb2NrKCZ2ZnNwLT52ZnNfc3luY19sb2NrKTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUod29yaywgbiwgJnRtcCwgd19saXN0KSB7CisJCQkoKndvcmstPndfc3luY2VyKSh2ZnNwLCB3b3JrLT53X2RhdGEpOworCQkJbGlzdF9kZWwoJndvcmstPndfbGlzdCk7CisJCQlpZiAod29yayA9PSAmdmZzcC0+dmZzX3N5bmNfd29yaykKKwkJCQljb250aW51ZTsKKwkJCWttZW1fZnJlZSh3b3JrLCBzaXplb2Yoc3RydWN0IHZmc19zeW5jX3dvcmspKTsKKwkJfQorCX0KKworCXZmc3AtPnZmc19zeW5jX3Rhc2sgPSBOVUxMOworCXdtYigpOworCXdha2VfdXAoJnZmc3AtPnZmc193YWl0X3N5bmNfdGFzayk7CisKKwlyZXR1cm4gMDsKK30KKworU1RBVElDIGludAorbGludmZzX3N0YXJ0X3N5bmNkKAorCXZmc190CQkJKnZmc3ApCit7CisJaW50CQkJcGlkOworCisJcGlkID0ga2VybmVsX3RocmVhZCh4ZnNzeW5jZCwgKHZvaWQgKikgdmZzcCwKKwkJCUNMT05FX1ZNIHwgQ0xPTkVfRlMgfCBDTE9ORV9GSUxFUyk7CisJaWYgKHBpZCA8IDApCisJCXJldHVybiAtcGlkOworCXdhaXRfZXZlbnQodmZzcC0+dmZzX3dhaXRfc3luY190YXNrLCB2ZnNwLT52ZnNfc3luY190YXNrKTsKKwlyZXR1cm4gMDsKK30KKworU1RBVElDIHZvaWQKK2xpbnZmc19zdG9wX3N5bmNkKAorCXZmc190CQkJKnZmc3ApCit7CisJdmZzcC0+dmZzX2ZsYWcgfD0gVkZTX1VNT1VOVDsKKwl3bWIoKTsKKworCXdha2VfdXBfcHJvY2Vzcyh2ZnNwLT52ZnNfc3luY190YXNrKTsKKwl3YWl0X2V2ZW50KHZmc3AtPnZmc193YWl0X3N5bmNfdGFzaywgIXZmc3AtPnZmc19zeW5jX3Rhc2spOworfQorCitTVEFUSUMgdm9pZAorbGludmZzX3B1dF9zdXBlcigKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sJKnNiKQoreworCXZmc190CQkJKnZmc3AgPSBMSU5WRlNfR0VUX1ZGUyhzYik7CisJaW50CQkJZXJyb3I7CisKKwlsaW52ZnNfc3RvcF9zeW5jZCh2ZnNwKTsKKwlWRlNfU1lOQyh2ZnNwLCBTWU5DX0FUVFJ8U1lOQ19ERUxXUkksIE5VTEwsIGVycm9yKTsKKwlpZiAoIWVycm9yKQorCQlWRlNfVU5NT1VOVCh2ZnNwLCAwLCBOVUxMLCBlcnJvcik7CisJaWYgKGVycm9yKSB7CisJCXByaW50aygiWEZTIHVubW91bnQgZ290IGVycm9yICVkXG4iLCBlcnJvcik7CisJCXByaW50aygiJXM6IHZmc3AvMHglcCBsZWZ0IGRhbmdsaW5nIVxuIiwgX19GVU5DVElPTl9fLCB2ZnNwKTsKKwkJcmV0dXJuOworCX0KKworCXZmc19kZWFsbG9jYXRlKHZmc3ApOworfQorCitTVEFUSUMgdm9pZAorbGludmZzX3dyaXRlX3N1cGVyKAorCXN0cnVjdCBzdXBlcl9ibG9jawkqc2IpCit7CisJdmZzX3QJCQkqdmZzcCA9IExJTlZGU19HRVRfVkZTKHNiKTsKKwlpbnQJCQllcnJvcjsKKworCWlmIChzYi0+c19mbGFncyAmIE1TX1JET05MWSkgeworCQlzYi0+c19kaXJ0ID0gMDsgLyogcGFyYW5vaWEgKi8KKwkJcmV0dXJuOworCX0KKwkvKiBQdXNoIHRoZSBsb2cgYW5kIHN1cGVyYmxvY2sgYSBsaXR0bGUgKi8KKwlWRlNfU1lOQyh2ZnNwLCBTWU5DX0ZTREFUQSwgTlVMTCwgZXJyb3IpOworCXNiLT5zX2RpcnQgPSAwOworfQorCitTVEFUSUMgaW50CitsaW52ZnNfc3luY19zdXBlcigKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sJKnNiLAorCWludAkJCXdhaXQpCit7CisJdmZzX3QJCSp2ZnNwID0gTElOVkZTX0dFVF9WRlMoc2IpOworCWludAkJZXJyb3I7CisJaW50CQlmbGFncyA9IFNZTkNfRlNEQVRBOworCisJaWYgKHdhaXQpCisJCWZsYWdzIHw9IFNZTkNfV0FJVDsKKworCVZGU19TWU5DKHZmc3AsIGZsYWdzLCBOVUxMLCBlcnJvcik7CisJc2ItPnNfZGlydCA9IDA7CisKKwlpZiAodW5saWtlbHkobGFwdG9wX21vZGUpKSB7CisJCWludAlwcmV2X3N5bmNfc2VxID0gdmZzcC0+dmZzX3N5bmNfc2VxOworCisJCS8qCisJCSAqIFRoZSBkaXNrIG11c3QgYmUgYWN0aXZlIGJlY2F1c2Ugd2UncmUgc3luY2luZy4KKwkJICogV2Ugc2NoZWR1bGUgeGZzc3luY2Qgbm93IChub3cgdGhhdCB0aGUgZGlzayBpcworCQkgKiBhY3RpdmUpIGluc3RlYWQgb2YgbGF0ZXIgKHdoZW4gaXQgbWlnaHQgbm90IGJlKS4KKwkJICovCisJCXdha2VfdXBfcHJvY2Vzcyh2ZnNwLT52ZnNfc3luY190YXNrKTsKKwkJLyoKKwkJICogV2UgaGF2ZSB0byB3YWl0IGZvciB0aGUgc3luYyBpdGVyYXRpb24gdG8gY29tcGxldGUuCisJCSAqIElmIHdlIGRvbid0LCB0aGUgZGlzayBhY3Rpdml0eSBjYXVzZWQgYnkgdGhlIHN5bmMKKwkJICogd2lsbCBjb21lIGFmdGVyIHRoZSBzeW5jIGlzIGNvbXBsZXRlZCwgYW5kIHRoYXQKKwkJICogdHJpZ2dlcnMgYW5vdGhlciBzeW5jIGZyb20gbGFwdG9wIG1vZGUuCisJCSAqLworCQl3YWl0X2V2ZW50KHZmc3AtPnZmc193YWl0X3NpbmdsZV9zeW5jX3Rhc2ssCisJCQkJdmZzcC0+dmZzX3N5bmNfc2VxICE9IHByZXZfc3luY19zZXEpOworCX0KKworCXJldHVybiAtZXJyb3I7Cit9CisKK1NUQVRJQyBpbnQKK2xpbnZmc19zdGF0ZnMoCisJc3RydWN0IHN1cGVyX2Jsb2NrCSpzYiwKKwlzdHJ1Y3Qga3N0YXRmcwkJKnN0YXRwKQoreworCXZmc190CQkJKnZmc3AgPSBMSU5WRlNfR0VUX1ZGUyhzYik7CisJaW50CQkJZXJyb3I7CisKKwlWRlNfU1RBVFZGUyh2ZnNwLCBzdGF0cCwgTlVMTCwgZXJyb3IpOworCXJldHVybiAtZXJyb3I7Cit9CisKK1NUQVRJQyBpbnQKK2xpbnZmc19yZW1vdW50KAorCXN0cnVjdCBzdXBlcl9ibG9jawkqc2IsCisJaW50CQkJKmZsYWdzLAorCWNoYXIJCQkqb3B0aW9ucykKK3sKKwl2ZnNfdAkJCSp2ZnNwID0gTElOVkZTX0dFVF9WRlMoc2IpOworCXN0cnVjdCB4ZnNfbW91bnRfYXJncwkqYXJncyA9IHhmc19hcmdzX2FsbG9jYXRlKHNiKTsKKwlpbnQJCQllcnJvcjsKKworCVZGU19QQVJTRUFSR1ModmZzcCwgb3B0aW9ucywgYXJncywgMSwgZXJyb3IpOworCWlmICghZXJyb3IpCisJCVZGU19NTlRVUERBVEUodmZzcCwgZmxhZ3MsIGFyZ3MsIGVycm9yKTsKKwlrbWVtX2ZyZWUoYXJncywgc2l6ZW9mKCphcmdzKSk7CisJcmV0dXJuIC1lcnJvcjsKK30KKworU1RBVElDIHZvaWQKK2xpbnZmc19mcmVlemVfZnMoCisJc3RydWN0IHN1cGVyX2Jsb2NrCSpzYikKK3sKKwlWRlNfRlJFRVpFKExJTlZGU19HRVRfVkZTKHNiKSk7Cit9CisKK1NUQVRJQyBpbnQKK2xpbnZmc19zaG93X29wdGlvbnMoCisJc3RydWN0IHNlcV9maWxlCQkqbSwKKwlzdHJ1Y3QgdmZzbW91bnQJCSptbnQpCit7CisJc3RydWN0IHZmcwkJKnZmc3AgPSBMSU5WRlNfR0VUX1ZGUyhtbnQtPm1udF9zYik7CisJaW50CQkJZXJyb3I7CisKKwlWRlNfU0hPV0FSR1ModmZzcCwgbSwgZXJyb3IpOworCXJldHVybiBlcnJvcjsKK30KKworU1RBVElDIGludAorbGludmZzX2dldHhzdGF0ZSgKKwlzdHJ1Y3Qgc3VwZXJfYmxvY2sJKnNiLAorCXN0cnVjdCBmc19xdW90YV9zdGF0CSpmcXMpCit7CisJc3RydWN0IHZmcwkJKnZmc3AgPSBMSU5WRlNfR0VUX1ZGUyhzYik7CisJaW50CQkJZXJyb3I7CisKKwlWRlNfUVVPVEFDVEwodmZzcCwgUV9YR0VUUVNUQVQsIDAsIChjYWRkcl90KWZxcywgZXJyb3IpOworCXJldHVybiAtZXJyb3I7Cit9CisKK1NUQVRJQyBpbnQKK2xpbnZmc19zZXR4c3RhdGUoCisJc3RydWN0IHN1cGVyX2Jsb2NrCSpzYiwKKwl1bnNpZ25lZCBpbnQJCWZsYWdzLAorCWludAkJCW9wKQoreworCXN0cnVjdCB2ZnMJCSp2ZnNwID0gTElOVkZTX0dFVF9WRlMoc2IpOworCWludAkJCWVycm9yOworCisJVkZTX1FVT1RBQ1RMKHZmc3AsIG9wLCAwLCAoY2FkZHJfdCkmZmxhZ3MsIGVycm9yKTsKKwlyZXR1cm4gLWVycm9yOworfQorCitTVEFUSUMgaW50CitsaW52ZnNfZ2V0eHF1b3RhKAorCXN0cnVjdCBzdXBlcl9ibG9jawkqc2IsCisJaW50CQkJdHlwZSwKKwlxaWRfdAkJCWlkLAorCXN0cnVjdCBmc19kaXNrX3F1b3RhCSpmZHEpCit7CisJc3RydWN0IHZmcwkJKnZmc3AgPSBMSU5WRlNfR0VUX1ZGUyhzYik7CisJaW50CQkJZXJyb3IsIGdldG1vZGU7CisKKwlnZXRtb2RlID0gKHR5cGUgPT0gR1JQUVVPVEEpID8gUV9YR0VUR1FVT1RBIDogUV9YR0VUUVVPVEE7CisJVkZTX1FVT1RBQ1RMKHZmc3AsIGdldG1vZGUsIGlkLCAoY2FkZHJfdClmZHEsIGVycm9yKTsKKwlyZXR1cm4gLWVycm9yOworfQorCitTVEFUSUMgaW50CitsaW52ZnNfc2V0eHF1b3RhKAorCXN0cnVjdCBzdXBlcl9ibG9jawkqc2IsCisJaW50CQkJdHlwZSwKKwlxaWRfdAkJCWlkLAorCXN0cnVjdCBmc19kaXNrX3F1b3RhCSpmZHEpCit7CisJc3RydWN0IHZmcwkJKnZmc3AgPSBMSU5WRlNfR0VUX1ZGUyhzYik7CisJaW50CQkJZXJyb3IsIHNldG1vZGU7CisKKwlzZXRtb2RlID0gKHR5cGUgPT0gR1JQUVVPVEEpID8gUV9YU0VUR1FMSU0gOiBRX1hTRVRRTElNOworCVZGU19RVU9UQUNUTCh2ZnNwLCBzZXRtb2RlLCBpZCwgKGNhZGRyX3QpZmRxLCBlcnJvcik7CisJcmV0dXJuIC1lcnJvcjsKK30KKworU1RBVElDIGludAorbGludmZzX2ZpbGxfc3VwZXIoCisJc3RydWN0IHN1cGVyX2Jsb2NrCSpzYiwKKwl2b2lkCQkJKmRhdGEsCisJaW50CQkJc2lsZW50KQoreworCXZub2RlX3QJCQkqcm9vdHZwOworCXN0cnVjdCB2ZnMJCSp2ZnNwID0gdmZzX2FsbG9jYXRlKCk7CisJc3RydWN0IHhmc19tb3VudF9hcmdzCSphcmdzID0geGZzX2FyZ3NfYWxsb2NhdGUoc2IpOworCXN0cnVjdCBrc3RhdGZzCQlzdGF0dmZzOworCWludAkJCWVycm9yLCBlcnJvcjI7CisKKwl2ZnNwLT52ZnNfc3VwZXIgPSBzYjsKKwlMSU5WRlNfU0VUX1ZGUyhzYiwgdmZzcCk7CisJaWYgKHNiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKQorCQl2ZnNwLT52ZnNfZmxhZyB8PSBWRlNfUkRPTkxZOworCWJodl9pbnNlcnRfYWxsX3Zmc29wcyh2ZnNwKTsKKworCVZGU19QQVJTRUFSR1ModmZzcCwgKGNoYXIgKilkYXRhLCBhcmdzLCAwLCBlcnJvcik7CisJaWYgKGVycm9yKSB7CisJCWJodl9yZW1vdmVfYWxsX3Zmc29wcyh2ZnNwLCAxKTsKKwkJZ290byBmYWlsX3Zmc29wOworCX0KKworCXNiX21pbl9ibG9ja3NpemUoc2IsIEJCU0laRSk7CisjaWZkZWYgQ09ORklHX1hGU19FWFBPUlQKKwlzYi0+c19leHBvcnRfb3AgPSAmbGludmZzX2V4cG9ydF9vcHM7CisjZW5kaWYKKwlzYi0+c19xY29wID0gJmxpbnZmc19xb3BzOworCXNiLT5zX29wID0gJmxpbnZmc19zb3BzOworCisJVkZTX01PVU5UKHZmc3AsIGFyZ3MsIE5VTEwsIGVycm9yKTsKKwlpZiAoZXJyb3IpIHsKKwkJYmh2X3JlbW92ZV9hbGxfdmZzb3BzKHZmc3AsIDEpOworCQlnb3RvIGZhaWxfdmZzb3A7CisJfQorCisJVkZTX1NUQVRWRlModmZzcCwgJnN0YXR2ZnMsIE5VTEwsIGVycm9yKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZmFpbF91bm1vdW50OworCisJc2ItPnNfZGlydCA9IDE7CisJc2ItPnNfbWFnaWMgPSBzdGF0dmZzLmZfdHlwZTsKKwlzYi0+c19ibG9ja3NpemUgPSBzdGF0dmZzLmZfYnNpemU7CisJc2ItPnNfYmxvY2tzaXplX2JpdHMgPSBmZnMoc3RhdHZmcy5mX2JzaXplKSAtIDE7CisJc2ItPnNfbWF4Ynl0ZXMgPSB4ZnNfbWF4X2ZpbGVfb2Zmc2V0KHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzKTsKKwlzYi0+c190aW1lX2dyYW4gPSAxOworCXNldF9wb3NpeF9hY2xfZmxhZyhzYik7CisKKwlWRlNfUk9PVCh2ZnNwLCAmcm9vdHZwLCBlcnJvcik7CisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWxfdW5tb3VudDsKKworCXNiLT5zX3Jvb3QgPSBkX2FsbG9jX3Jvb3QoTElOVkZTX0dFVF9JUChyb290dnApKTsKKwlpZiAoIXNiLT5zX3Jvb3QpIHsKKwkJZXJyb3IgPSBFTk9NRU07CisJCWdvdG8gZmFpbF92bnJlbGU7CisJfQorCWlmIChpc19iYWRfaW5vZGUoc2ItPnNfcm9vdC0+ZF9pbm9kZSkpIHsKKwkJZXJyb3IgPSBFSU5WQUw7CisJCWdvdG8gZmFpbF92bnJlbGU7CisJfQorCWlmICgoZXJyb3IgPSBsaW52ZnNfc3RhcnRfc3luY2QodmZzcCkpKQorCQlnb3RvIGZhaWxfdm5yZWxlOworCXZuX3RyYWNlX2V4aXQocm9vdHZwLCBfX0ZVTkNUSU9OX18sIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKworCWttZW1fZnJlZShhcmdzLCBzaXplb2YoKmFyZ3MpKTsKKwlyZXR1cm4gMDsKKworZmFpbF92bnJlbGU6CisJaWYgKHNiLT5zX3Jvb3QpIHsKKwkJZHB1dChzYi0+c19yb290KTsKKwkJc2ItPnNfcm9vdCA9IE5VTEw7CisJfSBlbHNlIHsKKwkJVk5fUkVMRShyb290dnApOworCX0KKworZmFpbF91bm1vdW50OgorCVZGU19VTk1PVU5UKHZmc3AsIDAsIE5VTEwsIGVycm9yMik7CisKK2ZhaWxfdmZzb3A6CisJdmZzX2RlYWxsb2NhdGUodmZzcCk7CisJa21lbV9mcmVlKGFyZ3MsIHNpemVvZigqYXJncykpOworCXJldHVybiAtZXJyb3I7Cit9CisKK1NUQVRJQyBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKgorbGludmZzX2dldF9zYigKKwlzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZQkqZnNfdHlwZSwKKwlpbnQJCQlmbGFncywKKwljb25zdCBjaGFyCQkqZGV2X25hbWUsCisJdm9pZAkJCSpkYXRhKQoreworCXJldHVybiBnZXRfc2JfYmRldihmc190eXBlLCBmbGFncywgZGV2X25hbWUsIGRhdGEsIGxpbnZmc19maWxsX3N1cGVyKTsKK30KKworU1RBVElDIHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGxpbnZmc19zb3BzID0geworCS5hbGxvY19pbm9kZQkJPSBsaW52ZnNfYWxsb2NfaW5vZGUsCisJLmRlc3Ryb3lfaW5vZGUJCT0gbGludmZzX2Rlc3Ryb3lfaW5vZGUsCisJLndyaXRlX2lub2RlCQk9IGxpbnZmc193cml0ZV9pbm9kZSwKKwkuY2xlYXJfaW5vZGUJCT0gbGludmZzX2NsZWFyX2lub2RlLAorCS5wdXRfc3VwZXIJCT0gbGludmZzX3B1dF9zdXBlciwKKwkud3JpdGVfc3VwZXIJCT0gbGludmZzX3dyaXRlX3N1cGVyLAorCS5zeW5jX2ZzCQk9IGxpbnZmc19zeW5jX3N1cGVyLAorCS53cml0ZV9zdXBlcl9sb2NrZnMJPSBsaW52ZnNfZnJlZXplX2ZzLAorCS5zdGF0ZnMJCQk9IGxpbnZmc19zdGF0ZnMsCisJLnJlbW91bnRfZnMJCT0gbGludmZzX3JlbW91bnQsCisJLnNob3dfb3B0aW9ucwkJPSBsaW52ZnNfc2hvd19vcHRpb25zLAorfTsKKworU1RBVElDIHN0cnVjdCBxdW90YWN0bF9vcHMgbGludmZzX3FvcHMgPSB7CisJLmdldF94c3RhdGUJCT0gbGludmZzX2dldHhzdGF0ZSwKKwkuc2V0X3hzdGF0ZQkJPSBsaW52ZnNfc2V0eHN0YXRlLAorCS5nZXRfeHF1b3RhCQk9IGxpbnZmc19nZXR4cXVvdGEsCisJLnNldF94cXVvdGEJCT0gbGludmZzX3NldHhxdW90YSwKK307CisKK1NUQVRJQyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSB4ZnNfZnNfdHlwZSA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5uYW1lCQkJPSAieGZzIiwKKwkuZ2V0X3NiCQkJPSBsaW52ZnNfZ2V0X3NiLAorCS5raWxsX3NiCQk9IGtpbGxfYmxvY2tfc3VwZXIsCisJLmZzX2ZsYWdzCQk9IEZTX1JFUVVJUkVTX0RFViwKK307CisKKworU1RBVElDIGludCBfX2luaXQKK2luaXRfeGZzX2ZzKCB2b2lkICkKK3sKKwlpbnQJCQllcnJvcjsKKwlzdHJ1Y3Qgc3lzaW5mbwkJc2k7CisJc3RhdGljIGNoYXIJCW1lc3NhZ2VbXSBfX2luaXRkYXRhID0gS0VSTl9JTkZPIFwKKwkJWEZTX1ZFUlNJT05fU1RSSU5HICIgd2l0aCAiIFhGU19CVUlMRF9PUFRJT05TICIgZW5hYmxlZFxuIjsKKworCXByaW50ayhtZXNzYWdlKTsKKworCXNpX21lbWluZm8oJnNpKTsKKwl4ZnNfcGh5c21lbSA9IHNpLnRvdGFscmFtOworCisJa3RyYWNlX2luaXQoNjQpOworCisJZXJyb3IgPSBpbml0X2lub2RlY2FjaGUoKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIHVuZG9faW5vZGVjYWNoZTsKKworCWVycm9yID0gcGFnZWJ1Zl9pbml0KCk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byB1bmRvX3BhZ2VidWY7CisKKwl2bl9pbml0KCk7CisJeGZzX2luaXQoKTsKKwl1dWlkX2luaXQoKTsKKwl2ZnNfaW5pdHF1b3RhKCk7CisKKwllcnJvciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnhmc19mc190eXBlKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gdW5kb19yZWdpc3RlcjsKKwlYRlNfRE1fSU5JVCgmeGZzX2ZzX3R5cGUpOworCXJldHVybiAwOworCit1bmRvX3JlZ2lzdGVyOgorCXBhZ2VidWZfdGVybWluYXRlKCk7CisKK3VuZG9fcGFnZWJ1ZjoKKwlkZXN0cm95X2lub2RlY2FjaGUoKTsKKwordW5kb19pbm9kZWNhY2hlOgorCXJldHVybiBlcnJvcjsKK30KKworU1RBVElDIHZvaWQgX19leGl0CitleGl0X3hmc19mcyggdm9pZCApCit7CisJdmZzX2V4aXRxdW90YSgpOworCVhGU19ETV9FWElUKCZ4ZnNfZnNfdHlwZSk7CisJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZ4ZnNfZnNfdHlwZSk7CisJeGZzX2NsZWFudXAoKTsKKwlwYWdlYnVmX3Rlcm1pbmF0ZSgpOworCWRlc3Ryb3lfaW5vZGVjYWNoZSgpOworCWt0cmFjZV91bmluaXQoKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF94ZnNfZnMpOworbW9kdWxlX2V4aXQoZXhpdF94ZnNfZnMpOworCitNT0RVTEVfQVVUSE9SKCJTaWxpY29uIEdyYXBoaWNzLCBJbmMuIik7CitNT0RVTEVfREVTQ1JJUFRJT04oWEZTX1ZFUlNJT05fU1RSSU5HICIgd2l0aCAiIFhGU19CVUlMRF9PUFRJT05TICIgZW5hYmxlZCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfc3VwZXIuaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM3ZTAwMwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N1cGVyLmgKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX1NVUEVSX0hfXworI2RlZmluZSBfX1hGU19TVVBFUl9IX18KKworI2lmZGVmIENPTkZJR19YRlNfRE1BUEkKKyMgZGVmaW5lIHZmc19pbnNlcnRkbWFwaSh2ZnMpCXZmc19pbnNlcnRvcHModmZzcCwgJnhmc19kbW9wcykKKyMgZGVmaW5lIHZmc19pbml0ZG1hcGkoKQlkbWFwaV9pbml0KCkKKyMgZGVmaW5lIHZmc19leGl0ZG1hcGkoKQlkbWFwaV91bmluaXQoKQorI2Vsc2UKKyMgZGVmaW5lIHZmc19pbnNlcnRkbWFwaSh2ZnMpCWRvIHsgfSB3aGlsZSAoMCkKKyMgZGVmaW5lIHZmc19pbml0ZG1hcGkoKQlkbyB7IH0gd2hpbGUgKDApCisjIGRlZmluZSB2ZnNfZXhpdGRtYXBpKCkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfWEZTX1FVT1RBCisjIGRlZmluZSB2ZnNfaW5zZXJ0cXVvdGEodmZzKQl2ZnNfaW5zZXJ0b3BzKHZmc3AsICZ4ZnNfcW1vcHMpCitleHRlcm4gdm9pZCB4ZnNfcW1faW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIHhmc19xbV9leGl0KHZvaWQpOworIyBkZWZpbmUgdmZzX2luaXRxdW90YSgpCXhmc19xbV9pbml0KCkKKyMgZGVmaW5lIHZmc19leGl0cXVvdGEoKQl4ZnNfcW1fZXhpdCgpCisjZWxzZQorIyBkZWZpbmUgdmZzX2luc2VydHF1b3RhKHZmcykJZG8geyB9IHdoaWxlICgwKQorIyBkZWZpbmUgdmZzX2luaXRxdW90YSgpCWRvIHsgfSB3aGlsZSAoMCkKKyMgZGVmaW5lIHZmc19leGl0cXVvdGEoKQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19YRlNfUE9TSVhfQUNMCisjIGRlZmluZSBYRlNfQUNMX1NUUklORwkJIkFDTHMsICIKKyMgZGVmaW5lIHNldF9wb3NpeF9hY2xfZmxhZyhzYikJKChzYiktPnNfZmxhZ3MgfD0gTVNfUE9TSVhBQ0wpCisjZWxzZQorIyBkZWZpbmUgWEZTX0FDTF9TVFJJTkcKKyMgZGVmaW5lIHNldF9wb3NpeF9hY2xfZmxhZyhzYikJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfWEZTX1NFQ1VSSVRZCisjIGRlZmluZSBYRlNfU0VDVVJJVFlfU1RSSU5HCSJzZWN1cml0eSBhdHRyaWJ1dGVzLCAiCisjIGRlZmluZSBFTk9TRUNVUklUWQkJMAorI2Vsc2UKKyMgZGVmaW5lIFhGU19TRUNVUklUWV9TVFJJTkcKKyMgZGVmaW5lIEVOT1NFQ1VSSVRZCQlFT1BOT1RTVVBQCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19YRlNfUlQKKyMgZGVmaW5lIFhGU19SRUFMVElNRV9TVFJJTkcJInJlYWx0aW1lLCAiCisjZWxzZQorIyBkZWZpbmUgWEZTX1JFQUxUSU1FX1NUUklORworI2VuZGlmCisKKyNpZiBYRlNfQklHX0JMS05PUworIyBpZiBYRlNfQklHX0lOVU1TCisjICBkZWZpbmUgWEZTX0JJR0ZTX1NUUklORwkibGFyZ2UgYmxvY2svaW5vZGUgbnVtYmVycywgIgorIyBlbHNlCisjICBkZWZpbmUgWEZTX0JJR0ZTX1NUUklORwkibGFyZ2UgYmxvY2sgbnVtYmVycywgIgorIyBlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIFhGU19CSUdGU19TVFJJTkcKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1hGU19UUkFDRQorIyBkZWZpbmUgWEZTX1RSQUNFX1NUUklORwkidHJhY2luZywgIgorI2Vsc2UKKyMgZGVmaW5lIFhGU19UUkFDRV9TVFJJTkcKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1hGU19ETUFQSQorIyBkZWZpbmUgWEZTX0RNQVBJX1NUUklORwkiZG1hcGkgc3VwcG9ydCwgIgorI2Vsc2UKKyMgZGVmaW5lIFhGU19ETUFQSV9TVFJJTkcKKyNlbmRpZgorCisjaWZkZWYgREVCVUcKKyMgZGVmaW5lIFhGU19EQkdfU1RSSU5HCQkiZGVidWciCisjZWxzZQorIyBkZWZpbmUgWEZTX0RCR19TVFJJTkcJCSJubyBkZWJ1ZyIKKyNlbmRpZgorCisjZGVmaW5lIFhGU19CVUlMRF9PUFRJT05TCVhGU19BQ0xfU1RSSU5HIFwKKwkJCQlYRlNfU0VDVVJJVFlfU1RSSU5HIFwKKwkJCQlYRlNfUkVBTFRJTUVfU1RSSU5HIFwKKwkJCQlYRlNfQklHRlNfU1RSSU5HIFwKKwkJCQlYRlNfVFJBQ0VfU1RSSU5HIFwKKwkJCQlYRlNfRE1BUElfU1RSSU5HIFwKKwkJCQlYRlNfREJHX1NUUklORyAvKiBEQkcgbXVzdCBiZSBsYXN0ICovCisKKyNkZWZpbmUgTElOVkZTX0dFVF9WRlMocykgXAorCSh2ZnNfdCAqKSgocyktPnNfZnNfaW5mbykKKyNkZWZpbmUgTElOVkZTX1NFVF9WRlMocywgdmZzcCkgXAorCSgocyktPnNfZnNfaW5mbyA9IHZmc3ApCisKK3N0cnVjdCB4ZnNfaW5vZGU7CitzdHJ1Y3QgeGZzX21vdW50Oworc3RydWN0IHhmc19idWZ0YXJnOworc3RydWN0IGJsb2NrX2RldmljZTsKKworZXh0ZXJuIF9fdWludDY0X3QgeGZzX21heF9maWxlX29mZnNldCh1bnNpZ25lZCBpbnQpOworCitleHRlcm4gdm9pZCB4ZnNfaW5pdGlhbGl6ZV92bm9kZShiaHZfZGVzY190ICosIHZub2RlX3QgKiwgYmh2X2Rlc2NfdCAqLCBpbnQpOworCitleHRlcm4gdm9pZCB4ZnNfZmx1c2hfaW5vZGUoc3RydWN0IHhmc19pbm9kZSAqKTsKK2V4dGVybiB2b2lkIHhmc19mbHVzaF9kZXZpY2Uoc3RydWN0IHhmc19pbm9kZSAqKTsKKworZXh0ZXJuIGludCAgeGZzX2Jsa2Rldl9nZXQoc3RydWN0IHhmc19tb3VudCAqLCBjb25zdCBjaGFyICosCisJCQkJc3RydWN0IGJsb2NrX2RldmljZSAqKik7CitleHRlcm4gdm9pZCB4ZnNfYmxrZGV2X3B1dChzdHJ1Y3QgYmxvY2tfZGV2aWNlICopOworCitleHRlcm4gc3RydWN0IGV4cG9ydF9vcGVyYXRpb25zIGxpbnZmc19leHBvcnRfb3BzOworCisjZW5kaWYJLyogX19YRlNfU1VQRVJfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19zeXNjdGwuYyBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N5c2N0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYzAxMDMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19zeXNjdGwuYwpAQCAtMCwwICsxLDE3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorI2luY2x1ZGUgInhmc19ydy5oIgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKworCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKnhmc190YWJsZV9oZWFkZXI7CisKKworI2lmZGVmIENPTkZJR19QUk9DX0ZTCitTVEFUSUMgaW50Cit4ZnNfc3RhdHNfY2xlYXJfcHJvY19oYW5kbGVyKAorCWN0bF90YWJsZQkqY3RsLAorCWludAkJd3JpdGUsCisJc3RydWN0IGZpbGUJKmZpbHAsCisJdm9pZAkJX191c2VyICpidWZmZXIsCisJc2l6ZV90CQkqbGVucCwKKwlsb2ZmX3QJCSpwcG9zKQoreworCWludAkJYywgcmV0LCAqdmFscCA9IGN0bC0+ZGF0YTsKKwlfX3VpbnQzMl90CXZuX2FjdGl2ZTsKKworCXJldCA9IHByb2NfZG9pbnR2ZWNfbWlubWF4KGN0bCwgd3JpdGUsIGZpbHAsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisKKwlpZiAoIXJldCAmJiB3cml0ZSAmJiAqdmFscCkgeworCQlwcmludGsoIlhGUyBDbGVhcmluZyB4ZnNzdGF0c1xuIik7CisJCWZvciAoYyA9IDA7IGMgPCBOUl9DUFVTOyBjKyspIHsKKwkJCWlmICghY3B1X3Bvc3NpYmxlKGMpKSBjb250aW51ZTsKKwkJCXByZWVtcHRfZGlzYWJsZSgpOworCQkJLyogc2F2ZSB2bl9hY3RpdmUsIGl0J3MgYSB1bml2ZXJzYWwgdHJ1dGghICovCisJCQl2bl9hY3RpdmUgPSBwZXJfY3B1KHhmc3N0YXRzLCBjKS52bl9hY3RpdmU7CisJCQltZW1zZXQoJnBlcl9jcHUoeGZzc3RhdHMsIGMpLCAwLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgeGZzc3RhdHMpKTsKKwkJCXBlcl9jcHUoeGZzc3RhdHMsIGMpLnZuX2FjdGl2ZSA9IHZuX2FjdGl2ZTsKKwkJCXByZWVtcHRfZW5hYmxlKCk7CisJCX0KKwkJeGZzX3N0YXRzX2NsZWFyID0gMDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisKK1NUQVRJQyBjdGxfdGFibGUgeGZzX3RhYmxlW10gPSB7CisJe1hGU19SRVNUUklDVF9DSE9XTiwgInJlc3RyaWN0X2Nob3duIiwgJnhmc19wYXJhbXMucmVzdHJpY3RfY2hvd24udmFsLAorCXNpemVvZihpbnQpLCAwNjQ0LCBOVUxMLCAmcHJvY19kb2ludHZlY19taW5tYXgsCisJJnN5c2N0bF9pbnR2ZWMsIE5VTEwsIAorCSZ4ZnNfcGFyYW1zLnJlc3RyaWN0X2Nob3duLm1pbiwgJnhmc19wYXJhbXMucmVzdHJpY3RfY2hvd24ubWF4fSwKKworCXtYRlNfU0dJRF9JTkhFUklULCAiaXJpeF9zZ2lkX2luaGVyaXQiLCAmeGZzX3BhcmFtcy5zZ2lkX2luaGVyaXQudmFsLAorCXNpemVvZihpbnQpLCAwNjQ0LCBOVUxMLCAmcHJvY19kb2ludHZlY19taW5tYXgsCisJJnN5c2N0bF9pbnR2ZWMsIE5VTEwsCisJJnhmc19wYXJhbXMuc2dpZF9pbmhlcml0Lm1pbiwgJnhmc19wYXJhbXMuc2dpZF9pbmhlcml0Lm1heH0sCisKKwl7WEZTX1NZTUxJTktfTU9ERSwgImlyaXhfc3ltbGlua19tb2RlIiwgJnhmc19wYXJhbXMuc3ltbGlua19tb2RlLnZhbCwKKwlzaXplb2YoaW50KSwgMDY0NCwgTlVMTCwgJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCSZzeXNjdGxfaW50dmVjLCBOVUxMLCAKKwkmeGZzX3BhcmFtcy5zeW1saW5rX21vZGUubWluLCAmeGZzX3BhcmFtcy5zeW1saW5rX21vZGUubWF4fSwKKworCXtYRlNfUEFOSUNfTUFTSywgInBhbmljX21hc2siLCAmeGZzX3BhcmFtcy5wYW5pY19tYXNrLnZhbCwKKwlzaXplb2YoaW50KSwgMDY0NCwgTlVMTCwgJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCSZzeXNjdGxfaW50dmVjLCBOVUxMLCAKKwkmeGZzX3BhcmFtcy5wYW5pY19tYXNrLm1pbiwgJnhmc19wYXJhbXMucGFuaWNfbWFzay5tYXh9LAorCisJe1hGU19FUlJMRVZFTCwgImVycm9yX2xldmVsIiwgJnhmc19wYXJhbXMuZXJyb3JfbGV2ZWwudmFsLAorCXNpemVvZihpbnQpLCAwNjQ0LCBOVUxMLCAmcHJvY19kb2ludHZlY19taW5tYXgsCisJJnN5c2N0bF9pbnR2ZWMsIE5VTEwsIAorCSZ4ZnNfcGFyYW1zLmVycm9yX2xldmVsLm1pbiwgJnhmc19wYXJhbXMuZXJyb3JfbGV2ZWwubWF4fSwKKworCXtYRlNfU1lOQ0RfVElNRVIsICJ4ZnNzeW5jZF9jZW50aXNlY3MiLCAmeGZzX3BhcmFtcy5zeW5jZF90aW1lci52YWwsCisJc2l6ZW9mKGludCksIDA2NDQsIE5VTEwsICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkmc3lzY3RsX2ludHZlYywgTlVMTCwgCisJJnhmc19wYXJhbXMuc3luY2RfdGltZXIubWluLCAmeGZzX3BhcmFtcy5zeW5jZF90aW1lci5tYXh9LAorCisJe1hGU19JTkhFUklUX1NZTkMsICJpbmhlcml0X3N5bmMiLCAmeGZzX3BhcmFtcy5pbmhlcml0X3N5bmMudmFsLAorCXNpemVvZihpbnQpLCAwNjQ0LCBOVUxMLCAmcHJvY19kb2ludHZlY19taW5tYXgsCisJJnN5c2N0bF9pbnR2ZWMsIE5VTEwsCisJJnhmc19wYXJhbXMuaW5oZXJpdF9zeW5jLm1pbiwgJnhmc19wYXJhbXMuaW5oZXJpdF9zeW5jLm1heH0sCisKKwl7WEZTX0lOSEVSSVRfTk9EVU1QLCAiaW5oZXJpdF9ub2R1bXAiLCAmeGZzX3BhcmFtcy5pbmhlcml0X25vZHVtcC52YWwsCisJc2l6ZW9mKGludCksIDA2NDQsIE5VTEwsICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkmc3lzY3RsX2ludHZlYywgTlVMTCwKKwkmeGZzX3BhcmFtcy5pbmhlcml0X25vZHVtcC5taW4sICZ4ZnNfcGFyYW1zLmluaGVyaXRfbm9kdW1wLm1heH0sCisKKwl7WEZTX0lOSEVSSVRfTk9BVElNRSwgImluaGVyaXRfbm9hdGltZSIsICZ4ZnNfcGFyYW1zLmluaGVyaXRfbm9hdGltLnZhbCwKKwlzaXplb2YoaW50KSwgMDY0NCwgTlVMTCwgJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCSZzeXNjdGxfaW50dmVjLCBOVUxMLAorCSZ4ZnNfcGFyYW1zLmluaGVyaXRfbm9hdGltLm1pbiwgJnhmc19wYXJhbXMuaW5oZXJpdF9ub2F0aW0ubWF4fSwKKwkKKwl7WEZTX0JVRl9USU1FUiwgInhmc2J1ZmRfY2VudGlzZWNzIiwgJnhmc19wYXJhbXMueGZzX2J1Zl90aW1lci52YWwsCisJc2l6ZW9mKGludCksIDA2NDQsIE5VTEwsICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkmc3lzY3RsX2ludHZlYywgTlVMTCwKKwkmeGZzX3BhcmFtcy54ZnNfYnVmX3RpbWVyLm1pbiwgJnhmc19wYXJhbXMueGZzX2J1Zl90aW1lci5tYXh9LAorCisJe1hGU19CVUZfQUdFLCAiYWdlX2J1ZmZlcl9jZW50aXNlY3MiLCAmeGZzX3BhcmFtcy54ZnNfYnVmX2FnZS52YWwsCisJc2l6ZW9mKGludCksIDA2NDQsIE5VTEwsICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkmc3lzY3RsX2ludHZlYywgTlVMTCwKKwkmeGZzX3BhcmFtcy54ZnNfYnVmX2FnZS5taW4sICZ4ZnNfcGFyYW1zLnhmc19idWZfYWdlLm1heH0sCisKKwl7WEZTX0lOSEVSSVRfTk9TWU0sICJpbmhlcml0X25vc3ltbGlua3MiLCAmeGZzX3BhcmFtcy5pbmhlcml0X25vc3ltLnZhbCwKKwlzaXplb2YoaW50KSwgMDY0NCwgTlVMTCwgJnByb2NfZG9pbnR2ZWNfbWlubWF4LAorCSZzeXNjdGxfaW50dmVjLCBOVUxMLAorCSZ4ZnNfcGFyYW1zLmluaGVyaXRfbm9zeW0ubWluLCAmeGZzX3BhcmFtcy5pbmhlcml0X25vc3ltLm1heH0sCisKKwl7WEZTX1JPVE9SU1RFUCwgInJvdG9yc3RlcCIsICZ4ZnNfcGFyYW1zLnJvdG9yc3RlcC52YWwsCisJc2l6ZW9mKGludCksIDA2NDQsIE5VTEwsICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkmc3lzY3RsX2ludHZlYywgTlVMTCwgCisJJnhmc19wYXJhbXMucm90b3JzdGVwLm1pbiwgJnhmc19wYXJhbXMucm90b3JzdGVwLm1heH0sCisKKwkvKiBwbGVhc2Uga2VlcCB0aGlzIHRoZSBsYXN0IGVudHJ5ICovCisjaWZkZWYgQ09ORklHX1BST0NfRlMKKwl7WEZTX1NUQVRTX0NMRUFSLCAic3RhdHNfY2xlYXIiLCAmeGZzX3BhcmFtcy5zdGF0c19jbGVhci52YWwsCisJc2l6ZW9mKGludCksIDA2NDQsIE5VTEwsICZ4ZnNfc3RhdHNfY2xlYXJfcHJvY19oYW5kbGVyLAorCSZzeXNjdGxfaW50dmVjLCBOVUxMLCAKKwkmeGZzX3BhcmFtcy5zdGF0c19jbGVhci5taW4sICZ4ZnNfcGFyYW1zLnN0YXRzX2NsZWFyLm1heH0sCisjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKworCXswfQorfTsKKworU1RBVElDIGN0bF90YWJsZSB4ZnNfZGlyX3RhYmxlW10gPSB7CisJe0ZTX1hGUywgInhmcyIsIE5VTEwsIDAsIDA1NTUsIHhmc190YWJsZX0sCisJezB9Cit9OworCitTVEFUSUMgY3RsX3RhYmxlIHhmc19yb290X3RhYmxlW10gPSB7CisJe0NUTF9GUywgImZzIiwgIE5VTEwsIDAsIDA1NTUsIHhmc19kaXJfdGFibGV9LAorCXswfQorfTsKKwordm9pZAoreGZzX3N5c2N0bF9yZWdpc3Rlcih2b2lkKQoreworCXhmc190YWJsZV9oZWFkZXIgPSByZWdpc3Rlcl9zeXNjdGxfdGFibGUoeGZzX3Jvb3RfdGFibGUsIDEpOworfQorCit2b2lkCit4ZnNfc3lzY3RsX3VucmVnaXN0ZXIodm9pZCkKK3sKKwlpZiAoeGZzX3RhYmxlX2hlYWRlcikKKwkJdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUoeGZzX3RhYmxlX2hlYWRlcik7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc19zeXNjdGwuaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3N5c2N0bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzOWE5NTAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc19zeXNjdGwuaApAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2lmbmRlZiBfX1hGU19TWVNDVExfSF9fCisjZGVmaW5lIF9fWEZTX1NZU0NUTF9IX18KKworI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorCisvKgorICogVHVuYWJsZSB4ZnMgcGFyYW1ldGVycworICovCisKK3R5cGVkZWYgc3RydWN0IHhmc19zeXNjdGxfdmFsIHsKKwlpbnQgbWluOworCWludCB2YWw7CisJaW50IG1heDsKK30geGZzX3N5c2N0bF92YWxfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX3BhcmFtIHsKKwl4ZnNfc3lzY3RsX3ZhbF90IHJlc3RyaWN0X2Nob3duOy8qIFJvb3Qvbm9uLXJvb3QgY2FuIGdpdmUgYXdheSBmaWxlcy4qLworCXhmc19zeXNjdGxfdmFsX3Qgc2dpZF9pbmhlcml0OwkvKiBJbmhlcml0IFNfSVNHSUQgaWYgcHJvY2VzcycgR0lEIGlzCisJCQkJCSAqIG5vdCBhIG1lbWJlciBvZiBwYXJlbnQgZGlyIEdJRC4gKi8KKwl4ZnNfc3lzY3RsX3ZhbF90IHN5bWxpbmtfbW9kZTsJLyogTGluayBjcmVhdCBtb2RlIGFmZmVjdGVkIGJ5IHVtYXNrICovCisJeGZzX3N5c2N0bF92YWxfdCBwYW5pY19tYXNrOwkvKiBiaXRtYXNrIHRvIGNhdXNlIHBhbmljIG9uIGVycm9ycy4gKi8KKwl4ZnNfc3lzY3RsX3ZhbF90IGVycm9yX2xldmVsOwkvKiBEZWdyZWUgb2YgcmVwb3J0aW5nIGZvciBwcm9ibGVtcyAgKi8KKwl4ZnNfc3lzY3RsX3ZhbF90IHN5bmNkX3RpbWVyOwkvKiBJbnRlcnZhbCBiZXR3ZWVuIHhmc3N5bmNkIHdha2V1cHMgKi8KKwl4ZnNfc3lzY3RsX3ZhbF90IHN0YXRzX2NsZWFyOwkvKiBSZXNldCBhbGwgWEZTIHN0YXRpc3RpY3MgdG8gemVyby4gKi8KKwl4ZnNfc3lzY3RsX3ZhbF90IGluaGVyaXRfc3luYzsJLyogSW5oZXJpdCB0aGUgInN5bmMiIGlub2RlIGZsYWcuICovCisJeGZzX3N5c2N0bF92YWxfdCBpbmhlcml0X25vZHVtcDsvKiBJbmhlcml0IHRoZSAibm9kdW1wIiBpbm9kZSBmbGFnLiAqLworCXhmc19zeXNjdGxfdmFsX3QgaW5oZXJpdF9ub2F0aW07LyogSW5oZXJpdCB0aGUgIm5vYXRpbWUiIGlub2RlIGZsYWcuICovCisJeGZzX3N5c2N0bF92YWxfdCB4ZnNfYnVmX3RpbWVyOwkvKiBJbnRlcnZhbCBiZXR3ZWVuIHhmc2J1ZmQgd2FrZXVwcy4gKi8KKwl4ZnNfc3lzY3RsX3ZhbF90IHhmc19idWZfYWdlOwkvKiBNZXRhZGF0YSBidWZmZXIgYWdlIGJlZm9yZSBmbHVzaC4gKi8KKwl4ZnNfc3lzY3RsX3ZhbF90IGluaGVyaXRfbm9zeW07CS8qIEluaGVyaXQgdGhlICJub3N5bWxpbmtzIiBmbGFnLiAqLworCXhmc19zeXNjdGxfdmFsX3Qgcm90b3JzdGVwOwkvKiBpbm9kZTMyIEFHIHJvdG9yaW5nIGNvbnRyb2wga25vYiAqLworfSB4ZnNfcGFyYW1fdDsKKworLyoKKyAqIHhmc19lcnJvcl9sZXZlbDoKKyAqCisgKiBIb3cgbXVjaCBlcnJvciByZXBvcnRpbmcgd2lsbCBiZSBkb25lIHdoZW4gaW50ZXJuYWwgcHJvYmxlbXMgYXJlCisgKiBlbmNvdW50ZXJlZC4gIFRoZXNlIHByb2JsZW1zIG5vcm1hbGx5IHJldHVybiBhbiBFRlNDT1JSVVBURUQgdG8gdGhlaXIKKyAqIGNhbGxlciwgd2l0aCBubyBvdGhlciBpbmZvcm1hdGlvbiByZXBvcnRlZC4KKyAqCisgKiAwCU5vIGVycm9yIHJlcG9ydHMKKyAqIDEJUmVwb3J0IEVGU0NPUlJVUFRFRCBlcnJvcnMgdGhhdCB3aWxsIGNhdXNlIGEgZmlsZXN5c3RlbSBzaHV0ZG93bgorICogNQlSZXBvcnQgYWxsIEVGU0NPUlJVUFRFRCBlcnJvcnMgKGFsbCBvZiB0aGUgYWJvdmUgZXJyb3JzLCBwbHVzIGFueQorICoJYWRkaXRpb25hbCBlcnJvcnMgdGhhdCBhcmUga25vd24gdG8gbm90IGNhdXNlIHNodXRkb3ducykKKyAqCisgKiB4ZnNfcGFuaWNfbWFzayBiaXQgMHg4IHR1cm5zIHRoZSBlcnJvciByZXBvcnRzIGludG8gcGFuaWNzCisgKi8KKworZW51bSB7CisJLyogWEZTX1JFRkNBQ0hFX1NJWkUgPSAxICovCisJLyogWEZTX1JFRkNBQ0hFX1BVUkdFID0gMiAqLworCVhGU19SRVNUUklDVF9DSE9XTiA9IDMsCisJWEZTX1NHSURfSU5IRVJJVCA9IDQsCisJWEZTX1NZTUxJTktfTU9ERSA9IDUsCisJWEZTX1BBTklDX01BU0sgPSA2LAorCVhGU19FUlJMRVZFTCA9IDcsCisJWEZTX1NZTkNEX1RJTUVSID0gOCwKKwkvKiBYRlNfUFJPQkVfRE1BUEkgPSA5ICovCisJLyogWEZTX1BST0JFX0lPT1BTID0gMTAgKi8KKwkvKiBYRlNfUFJPQkVfUVVPVEEgPSAxMSAqLworCVhGU19TVEFUU19DTEVBUiA9IDEyLAorCVhGU19JTkhFUklUX1NZTkMgPSAxMywKKwlYRlNfSU5IRVJJVF9OT0RVTVAgPSAxNCwKKwlYRlNfSU5IRVJJVF9OT0FUSU1FID0gMTUsCisJWEZTX0JVRl9USU1FUiA9IDE2LAorCVhGU19CVUZfQUdFID0gMTcsCisJLyogWEZTX0lPX0JZUEFTUyA9IDE4ICovCisJWEZTX0lOSEVSSVRfTk9TWU0gPSAxOSwKKwlYRlNfUk9UT1JTVEVQID0gMjAsCit9OworCitleHRlcm4geGZzX3BhcmFtX3QJeGZzX3BhcmFtczsKKworI2lmZGVmIENPTkZJR19TWVNDVEwKK2V4dGVybiB2b2lkIHhmc19zeXNjdGxfcmVnaXN0ZXIodm9pZCk7CitleHRlcm4gdm9pZCB4ZnNfc3lzY3RsX3VucmVnaXN0ZXIodm9pZCk7CisjZWxzZQorIyBkZWZpbmUgeGZzX3N5c2N0bF9yZWdpc3RlcigpCQlkbyB7IH0gd2hpbGUgKDApCisjIGRlZmluZSB4ZnNfc3lzY3RsX3VucmVnaXN0ZXIoKQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYgLyogQ09ORklHX1NZU0NUTCAqLworCisjZW5kaWYgLyogX19YRlNfU1lTQ1RMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfdmVyc2lvbi5oIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfdmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2Zjk2MzkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc192ZXJzaW9uLmgKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4JIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworLyoKKyAqIER1bW15IGZpbGUgdGhhdCBjYW4gY29udGFpbiBhIHRpbWVzdGFtcCB0byBwdXQgaW50byB0aGUKKyAqIFhGUyBpbml0IHN0cmluZywgdG8gaGVscCB1c2VycyBrZWVwIHRyYWNrIG9mIHdoYXQgdGhleSdyZQorICogcnVubmluZworICovCisKKyNpZm5kZWYgX19YRlNfVkVSU0lPTl9IX18KKyNkZWZpbmUgX19YRlNfVkVSU0lPTl9IX18KKworI2RlZmluZSBYRlNfVkVSU0lPTl9TVFJJTkcgIlNHSSBYRlMiCisKKyNlbmRpZiAvKiBfX1hGU19WRVJTSU9OX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfdmZzLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc192ZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjljNjE2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfdmZzLmMKQEAgLTAsMCArMSwzMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKyNpbmNsdWRlICJ4ZnNfZnMuaCIKKyNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX2NsbnQuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfaW1hcC5oIgorI2luY2x1ZGUgInhmc19hbGxvYy5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19xdW90YS5oIgorCitpbnQKK3Zmc19tb3VudCgKKwlzdHJ1Y3QgYmh2X2Rlc2MJCSpiZHAsCisJc3RydWN0IHhmc19tb3VudF9hcmdzCSphcmdzLAorCXN0cnVjdCBjcmVkCQkqY3IpCit7CisJc3RydWN0IGJodl9kZXNjCQkqbmV4dCA9IGJkcDsKKworCUFTU0VSVChuZXh0KTsKKwl3aGlsZSAoISAoYmh2dG92ZnNvcHMobmV4dCkpLT52ZnNfbW91bnQpCisJCW5leHQgPSBCSFZfTkVYVChuZXh0KTsKKwlyZXR1cm4gKCgqYmh2dG92ZnNvcHMobmV4dCktPnZmc19tb3VudCkobmV4dCwgYXJncywgY3IpKTsKK30KKworaW50Cit2ZnNfcGFyc2VhcmdzKAorCXN0cnVjdCBiaHZfZGVzYwkJKmJkcCwKKwljaGFyCQkJKnMsCisJc3RydWN0IHhmc19tb3VudF9hcmdzCSphcmdzLAorCWludAkJCWYpCit7CisJc3RydWN0IGJodl9kZXNjCQkqbmV4dCA9IGJkcDsKKworCUFTU0VSVChuZXh0KTsKKwl3aGlsZSAoISAoYmh2dG92ZnNvcHMobmV4dCkpLT52ZnNfcGFyc2VhcmdzKQorCQluZXh0ID0gQkhWX05FWFQobmV4dCk7CisJcmV0dXJuICgoKmJodnRvdmZzb3BzKG5leHQpLT52ZnNfcGFyc2VhcmdzKShuZXh0LCBzLCBhcmdzLCBmKSk7Cit9CisKK2ludAordmZzX3Nob3dhcmdzKAorCXN0cnVjdCBiaHZfZGVzYwkJKmJkcCwKKwlzdHJ1Y3Qgc2VxX2ZpbGUJCSptKQoreworCXN0cnVjdCBiaHZfZGVzYwkJKm5leHQgPSBiZHA7CisKKwlBU1NFUlQobmV4dCk7CisJd2hpbGUgKCEgKGJodnRvdmZzb3BzKG5leHQpKS0+dmZzX3Nob3dhcmdzKQorCQluZXh0ID0gQkhWX05FWFQobmV4dCk7CisJcmV0dXJuICgoKmJodnRvdmZzb3BzKG5leHQpLT52ZnNfc2hvd2FyZ3MpKG5leHQsIG0pKTsKK30KKworaW50Cit2ZnNfdW5tb3VudCgKKwlzdHJ1Y3QgYmh2X2Rlc2MJCSpiZHAsCisJaW50CQkJZmwsCisJc3RydWN0IGNyZWQJCSpjcikKK3sKKwlzdHJ1Y3QgYmh2X2Rlc2MJCSpuZXh0ID0gYmRwOworCisJQVNTRVJUKG5leHQpOworCXdoaWxlICghIChiaHZ0b3Zmc29wcyhuZXh0KSktPnZmc191bm1vdW50KQorCQluZXh0ID0gQkhWX05FWFQobmV4dCk7CisJcmV0dXJuICgoKmJodnRvdmZzb3BzKG5leHQpLT52ZnNfdW5tb3VudCkobmV4dCwgZmwsIGNyKSk7Cit9CisKK2ludAordmZzX21udHVwZGF0ZSgKKwlzdHJ1Y3QgYmh2X2Rlc2MJCSpiZHAsCisJaW50CQkJKmZsLAorCXN0cnVjdCB4ZnNfbW91bnRfYXJncwkqYXJncykKK3sKKwlzdHJ1Y3QgYmh2X2Rlc2MJCSpuZXh0ID0gYmRwOworCisJQVNTRVJUKG5leHQpOworCXdoaWxlICghIChiaHZ0b3Zmc29wcyhuZXh0KSktPnZmc19tbnR1cGRhdGUpCisJCW5leHQgPSBCSFZfTkVYVChuZXh0KTsKKwlyZXR1cm4gKCgqYmh2dG92ZnNvcHMobmV4dCktPnZmc19tbnR1cGRhdGUpKG5leHQsIGZsLCBhcmdzKSk7Cit9CisKK2ludAordmZzX3Jvb3QoCisJc3RydWN0IGJodl9kZXNjCQkqYmRwLAorCXN0cnVjdCB2bm9kZQkJKip2cHApCit7CisJc3RydWN0IGJodl9kZXNjCQkqbmV4dCA9IGJkcDsKKworCUFTU0VSVChuZXh0KTsKKwl3aGlsZSAoISAoYmh2dG92ZnNvcHMobmV4dCkpLT52ZnNfcm9vdCkKKwkJbmV4dCA9IEJIVl9ORVhUKG5leHQpOworCXJldHVybiAoKCpiaHZ0b3Zmc29wcyhuZXh0KS0+dmZzX3Jvb3QpKG5leHQsIHZwcCkpOworfQorCitpbnQKK3Zmc19zdGF0dmZzKAorCXN0cnVjdCBiaHZfZGVzYwkJKmJkcCwKKwl4ZnNfc3RhdGZzX3QJCSpzcCwKKwlzdHJ1Y3Qgdm5vZGUJCSp2cCkKK3sKKwlzdHJ1Y3QgYmh2X2Rlc2MJCSpuZXh0ID0gYmRwOworCisJQVNTRVJUKG5leHQpOworCXdoaWxlICghIChiaHZ0b3Zmc29wcyhuZXh0KSktPnZmc19zdGF0dmZzKQorCQluZXh0ID0gQkhWX05FWFQobmV4dCk7CisJcmV0dXJuICgoKmJodnRvdmZzb3BzKG5leHQpLT52ZnNfc3RhdHZmcykobmV4dCwgc3AsIHZwKSk7Cit9CisKK2ludAordmZzX3N5bmMoCisJc3RydWN0IGJodl9kZXNjCQkqYmRwLAorCWludAkJCWZsLAorCXN0cnVjdCBjcmVkCQkqY3IpCit7CisJc3RydWN0IGJodl9kZXNjCQkqbmV4dCA9IGJkcDsKKworCUFTU0VSVChuZXh0KTsKKwl3aGlsZSAoISAoYmh2dG92ZnNvcHMobmV4dCkpLT52ZnNfc3luYykKKwkJbmV4dCA9IEJIVl9ORVhUKG5leHQpOworCXJldHVybiAoKCpiaHZ0b3Zmc29wcyhuZXh0KS0+dmZzX3N5bmMpKG5leHQsIGZsLCBjcikpOworfQorCitpbnQKK3Zmc192Z2V0KAorCXN0cnVjdCBiaHZfZGVzYwkJKmJkcCwKKwlzdHJ1Y3Qgdm5vZGUJCSoqdnBwLAorCXN0cnVjdCBmaWQJCSpmaWRwKQoreworCXN0cnVjdCBiaHZfZGVzYwkJKm5leHQgPSBiZHA7CisKKwlBU1NFUlQobmV4dCk7CisJd2hpbGUgKCEgKGJodnRvdmZzb3BzKG5leHQpKS0+dmZzX3ZnZXQpCisJCW5leHQgPSBCSFZfTkVYVChuZXh0KTsKKwlyZXR1cm4gKCgqYmh2dG92ZnNvcHMobmV4dCktPnZmc192Z2V0KShuZXh0LCB2cHAsIGZpZHApKTsKK30KKworaW50Cit2ZnNfZG1hcGlvcHMoCisJc3RydWN0IGJodl9kZXNjCQkqYmRwLAorCWNhZGRyX3QJCQlhZGRyKQoreworCXN0cnVjdCBiaHZfZGVzYwkJKm5leHQgPSBiZHA7CisKKwlBU1NFUlQobmV4dCk7CisJd2hpbGUgKCEgKGJodnRvdmZzb3BzKG5leHQpKS0+dmZzX2RtYXBpb3BzKQorCQluZXh0ID0gQkhWX05FWFQobmV4dCk7CisJcmV0dXJuICgoKmJodnRvdmZzb3BzKG5leHQpLT52ZnNfZG1hcGlvcHMpKG5leHQsIGFkZHIpKTsKK30KKworaW50Cit2ZnNfcXVvdGFjdGwoCisJc3RydWN0IGJodl9kZXNjCQkqYmRwLAorCWludAkJCWNtZCwKKwlpbnQJCQlpZCwKKwljYWRkcl90CQkJYWRkcikKK3sKKwlzdHJ1Y3QgYmh2X2Rlc2MJCSpuZXh0ID0gYmRwOworCisJQVNTRVJUKG5leHQpOworCXdoaWxlICghIChiaHZ0b3Zmc29wcyhuZXh0KSktPnZmc19xdW90YWN0bCkKKwkJbmV4dCA9IEJIVl9ORVhUKG5leHQpOworCXJldHVybiAoKCpiaHZ0b3Zmc29wcyhuZXh0KS0+dmZzX3F1b3RhY3RsKShuZXh0LCBjbWQsIGlkLCBhZGRyKSk7Cit9CisKK3ZvaWQKK3Zmc19pbml0X3Zub2RlKAorCXN0cnVjdCBiaHZfZGVzYwkJKmJkcCwKKwlzdHJ1Y3Qgdm5vZGUJCSp2cCwKKwlzdHJ1Y3QgYmh2X2Rlc2MJCSpicCwKKwlpbnQJCQl1bmxvY2spCit7CisJc3RydWN0IGJodl9kZXNjCQkqbmV4dCA9IGJkcDsKKworCUFTU0VSVChuZXh0KTsKKwl3aGlsZSAoISAoYmh2dG92ZnNvcHMobmV4dCkpLT52ZnNfaW5pdF92bm9kZSkKKwkJbmV4dCA9IEJIVl9ORVhUKG5leHQpOworCSgoKmJodnRvdmZzb3BzKG5leHQpLT52ZnNfaW5pdF92bm9kZSkobmV4dCwgdnAsIGJwLCB1bmxvY2spKTsKK30KKwordm9pZAordmZzX2ZvcmNlX3NodXRkb3duKAorCXN0cnVjdCBiaHZfZGVzYwkJKmJkcCwKKwlpbnQJCQlmbCwKKwljaGFyCQkJKmZpbGUsCisJaW50CQkJbGluZSkKK3sKKwlzdHJ1Y3QgYmh2X2Rlc2MJCSpuZXh0ID0gYmRwOworCisJQVNTRVJUKG5leHQpOworCXdoaWxlICghIChiaHZ0b3Zmc29wcyhuZXh0KSktPnZmc19mb3JjZV9zaHV0ZG93bikKKwkJbmV4dCA9IEJIVl9ORVhUKG5leHQpOworCSgoKmJodnRvdmZzb3BzKG5leHQpLT52ZnNfZm9yY2Vfc2h1dGRvd24pKG5leHQsIGZsLCBmaWxlLCBsaW5lKSk7Cit9CisKK3ZvaWQKK3Zmc19mcmVlemUoCisJc3RydWN0IGJodl9kZXNjCQkqYmRwKQoreworCXN0cnVjdCBiaHZfZGVzYwkJKm5leHQgPSBiZHA7CisKKwlBU1NFUlQobmV4dCk7CisJd2hpbGUgKCEgKGJodnRvdmZzb3BzKG5leHQpKS0+dmZzX2ZyZWV6ZSkKKwkJbmV4dCA9IEJIVl9ORVhUKG5leHQpOworCSgoKmJodnRvdmZzb3BzKG5leHQpLT52ZnNfZnJlZXplKShuZXh0KSk7Cit9CisKK3Zmc190ICoKK3Zmc19hbGxvY2F0ZSggdm9pZCApCit7CisJc3RydWN0IHZmcwkJKnZmc3A7CisKKwl2ZnNwID0ga21lbV96YWxsb2Moc2l6ZW9mKHZmc190KSwgS01fU0xFRVApOworCWJodl9oZWFkX2luaXQoVkZTX0JIVkhFQUQodmZzcCksICJ2ZnMiKTsKKwlJTklUX0xJU1RfSEVBRCgmdmZzcC0+dmZzX3N5bmNfbGlzdCk7CisJc3Bpbl9sb2NrX2luaXQoJnZmc3AtPnZmc19zeW5jX2xvY2spOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnZmc3AtPnZmc193YWl0X3N5bmNfdGFzayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmdmZzcC0+dmZzX3dhaXRfc2luZ2xlX3N5bmNfdGFzayk7CisJcmV0dXJuIHZmc3A7Cit9CisKK3ZvaWQKK3Zmc19kZWFsbG9jYXRlKAorCXN0cnVjdCB2ZnMJCSp2ZnNwKQoreworCWJodl9oZWFkX2Rlc3Ryb3koVkZTX0JIVkhFQUQodmZzcCkpOworCWttZW1fZnJlZSh2ZnNwLCBzaXplb2YodmZzX3QpKTsKK30KKwordm9pZAordmZzX2luc2VydG9wcygKKwlzdHJ1Y3QgdmZzCQkqdmZzcCwKKwlzdHJ1Y3QgYmh2X3Zmc29wcwkqdmZzb3BzKQoreworCXN0cnVjdCBiaHZfZGVzYwkJKmJkcDsKKworCWJkcCA9IGttZW1fYWxsb2Moc2l6ZW9mKHN0cnVjdCBiaHZfZGVzYyksIEtNX1NMRUVQKTsKKwliaHZfZGVzY19pbml0KGJkcCwgTlVMTCwgdmZzcCwgdmZzb3BzKTsKKwliaHZfaW5zZXJ0KCZ2ZnNwLT52ZnNfYmgsIGJkcCk7Cit9CisKK3ZvaWQKK3Zmc19pbnNlcnRiaHYoCisJc3RydWN0IHZmcwkJKnZmc3AsCisJc3RydWN0IGJodl9kZXNjCQkqYmRwLAorCXN0cnVjdCB2ZnNvcHMJCSp2ZnNvcHMsCisJdm9pZAkJCSptb3VudCkKK3sKKwliaHZfZGVzY19pbml0KGJkcCwgbW91bnQsIHZmc3AsIHZmc29wcyk7CisJYmh2X2luc2VydF9pbml0aWFsKCZ2ZnNwLT52ZnNfYmgsIGJkcCk7Cit9CisKK3ZvaWQKK2Jodl9yZW1vdmVfdmZzb3BzKAorCXN0cnVjdCB2ZnMJCSp2ZnNwLAorCWludAkJCXBvcykKK3sKKwlzdHJ1Y3QgYmh2X2Rlc2MJCSpiaHY7CisKKwliaHYgPSBiaHZfbG9va3VwX3JhbmdlKCZ2ZnNwLT52ZnNfYmgsIHBvcywgcG9zKTsKKwlpZiAoIWJodikKKwkJcmV0dXJuOworCWJodl9yZW1vdmUoJnZmc3AtPnZmc19iaCwgYmh2KTsKKwlrbWVtX2ZyZWUoYmh2LCBzaXplb2YoKmJodikpOworfQorCit2b2lkCitiaHZfcmVtb3ZlX2FsbF92ZnNvcHMoCisJc3RydWN0IHZmcwkJKnZmc3AsCisJaW50CQkJZnJlZWJhc2UpCit7CisJc3RydWN0IHhmc19tb3VudAkqbXA7CisKKwliaHZfcmVtb3ZlX3Zmc29wcyh2ZnNwLCBWRlNfUE9TSVRJT05fUU0pOworCWJodl9yZW1vdmVfdmZzb3BzKHZmc3AsIFZGU19QT1NJVElPTl9ETSk7CisJaWYgKCFmcmVlYmFzZSkKKwkJcmV0dXJuOworCW1wID0gWEZTX0JIVlRPTShiaHZfbG9va3VwKFZGU19CSFZIRUFEKHZmc3ApLCAmeGZzX3Zmc29wcykpOworCVZGU19SRU1PVkVCSFYodmZzcCwgJm1wLT5tX2Jodik7CisJeGZzX21vdW50X2ZyZWUobXAsIDApOworfQorCit2b2lkCitiaHZfaW5zZXJ0X2FsbF92ZnNvcHMoCisJc3RydWN0IHZmcwkJKnZmc3ApCit7CisJc3RydWN0IHhmc19tb3VudAkqbXA7CisKKwltcCA9IHhmc19tb3VudF9pbml0KCk7CisJdmZzX2luc2VydGJodih2ZnNwLCAmbXAtPm1fYmh2LCAmeGZzX3Zmc29wcywgbXApOworCXZmc19pbnNlcnRkbWFwaSh2ZnNwKTsKKwl2ZnNfaW5zZXJ0cXVvdGEodmZzcCk7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMvbGludXgtMi42L3hmc192ZnMuaCBiL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NDkzOTkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc192ZnMuaApAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfVkZTX0hfXworI2RlZmluZSBfX1hGU19WRlNfSF9fCisKKyNpbmNsdWRlIDxsaW51eC92ZnMuaD4KKyNpbmNsdWRlICJ4ZnNfZnMuaCIKKworc3RydWN0IGZpZDsKK3N0cnVjdCB2ZnM7CitzdHJ1Y3QgY3JlZDsKK3N0cnVjdCB2bm9kZTsKK3N0cnVjdCBrc3RhdGZzOworc3RydWN0IHNlcV9maWxlOworc3RydWN0IHN1cGVyX2Jsb2NrOworc3RydWN0IHhmc19tb3VudF9hcmdzOworCit0eXBlZGVmIHN0cnVjdCBrc3RhdGZzIHhmc19zdGF0ZnNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgdmZzX3N5bmNfd29yayB7CisJc3RydWN0IGxpc3RfaGVhZAl3X2xpc3Q7CisJc3RydWN0IHZmcwkJKndfdmZzOworCXZvaWQJCQkqd19kYXRhOwkvKiBzeW5jZXIgcm91dGluZSBhcmd1bWVudCAqLworCXZvaWQJCQkoKndfc3luY2VyKShzdHJ1Y3QgdmZzICosIHZvaWQgKik7Cit9IHZmc19zeW5jX3dvcmtfdDsKKwordHlwZWRlZiBzdHJ1Y3QgdmZzIHsKKwl1X2ludAkJCXZmc19mbGFnOwkvKiBmbGFncyAqLworCXhmc19mc2lkX3QJCXZmc19mc2lkOwkvKiBmaWxlIHN5c3RlbSBJRCAqLworCXhmc19mc2lkX3QJCSp2ZnNfYWx0ZnNpZDsJLyogQW4gSUQgZml4ZWQgZm9yIGxpZmUgb2YgRlMgKi8KKwliaHZfaGVhZF90CQl2ZnNfYmg7CQkvKiBoZWFkIG9mIHZmcyBiZWhhdmlvciBjaGFpbiAqLworCXN0cnVjdCBzdXBlcl9ibG9jawkqdmZzX3N1cGVyOwkvKiBnZW5lcmljIHN1cGVyYmxvY2sgcG9pbnRlciAqLworCXN0cnVjdCB0YXNrX3N0cnVjdAkqdmZzX3N5bmNfdGFzazsJLyogZ2VuZXJhbGlzZWQgc3luYyB0aHJlYWQgKi8KKwl2ZnNfc3luY193b3JrX3QJCXZmc19zeW5jX3dvcms7CS8qIHdvcmsgaXRlbSBmb3IgVkZTX1NZTkMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCXZmc19zeW5jX2xpc3Q7CS8qIHN5bmMgdGhyZWFkIHdvcmsgaXRlbSBsaXN0ICovCisJc3BpbmxvY2tfdAkJdmZzX3N5bmNfbG9jazsJLyogd29yayBpdGVtIGxpc3QgbG9jayAqLworCWludCAJCQl2ZnNfc3luY19zZXE7CS8qIHN5bmMgdGhyZWFkIGdlbmVyYXRpb24gbm8uICovCisJd2FpdF9xdWV1ZV9oZWFkX3QJdmZzX3dhaXRfc2luZ2xlX3N5bmNfdGFzazsKKwl3YWl0X3F1ZXVlX2hlYWRfdAl2ZnNfd2FpdF9zeW5jX3Rhc2s7Cit9IHZmc190OworCisjZGVmaW5lIHZmc19mYmh2CQl2ZnNfYmguYmhfZmlyc3QJLyogMXN0IG9uIHZmcyBiZWhhdmlvciBjaGFpbiAqLworCisjZGVmaW5lIGJodnRvdmZzKGJkcCkJCSggKHN0cnVjdCB2ZnMgKilCSFZfVk9CSihiZHApICkKKyNkZWZpbmUgYmh2dG92ZnNvcHMoYmRwKQkoIChzdHJ1Y3QgdmZzb3BzICopQkhWX09QUyhiZHApICkKKyNkZWZpbmUgVkZTX0JIVkhFQUQodmZzKQkoICYodmZzKS0+dmZzX2JoICkKKyNkZWZpbmUgVkZTX1JFTU9WRUJIVih2ZnMsIGJkcCkJKCBiaHZfcmVtb3ZlKFZGU19CSFZIRUFEKHZmcyksIGJkcCkgKQorCisjZGVmaW5lIFZGU19QT1NJVElPTl9CQVNFCUJIVl9QT1NJVElPTl9CQVNFCS8qIGNoYWluIGJvdHRvbSAqLworI2RlZmluZSBWRlNfUE9TSVRJT05fVE9QCUJIVl9QT1NJVElPTl9UT1AJLyogY2hhaW4gdG9wICovCisjZGVmaW5lIFZGU19QT1NJVElPTl9JTlZBTElECUJIVl9QT1NJVElPTl9JTlZBTElECS8qIGludmFsaWQgcG9zLiBudW0gKi8KKwordHlwZWRlZiBlbnVtIHsKKwlWRlNfQkhWX1VOS05PV04sCS8qIG5vdCBzcGVjaWZpZWQgKi8KKwlWRlNfQkhWX1hGUywJCS8qIHhmcyAqLworCVZGU19CSFZfRE0sCQkvKiBkYXRhIG1pZ3JhdGlvbiAqLworCVZGU19CSFZfUU0sCQkvKiBxdW90YSBtYW5hZ2VyICovCisJVkZTX0JIVl9JTywJCS8qIElPIHBhdGggKi8KKwlWRlNfQkhWX0VORAkJLyogaG91c2VrZWVwaW5nIGVuZC1vZi1yYW5nZSAqLworfSB2ZnNfYmh2X3Q7CisKKyNkZWZpbmUgVkZTX1BPU0lUSU9OX1hGUwkoQkhWX1BPU0lUSU9OX0JBU0UpCisjZGVmaW5lIFZGU19QT1NJVElPTl9ETQkJKFZGU19QT1NJVElPTl9CQVNFKzEwKQorI2RlZmluZSBWRlNfUE9TSVRJT05fUU0JCShWRlNfUE9TSVRJT05fQkFTRSsyMCkKKyNkZWZpbmUgVkZTX1BPU0lUSU9OX0lPCQkoVkZTX1BPU0lUSU9OX0JBU0UrMzApCisKKyNkZWZpbmUgVkZTX1JET05MWQkJMHgwMDAxCS8qIHJlYWQtb25seSB2ZnMgKi8KKyNkZWZpbmUgVkZTX0dSUElECQkweDAwMDIJLyogZ3JvdXAtSUQgYXNzaWduZWQgZnJvbSBkaXJlY3RvcnkgKi8KKyNkZWZpbmUgVkZTX0RNSQkJCTB4MDAwNAkvKiBmaWxlc3lzdGVtIGhhcyB0aGUgRE1JIGVuYWJsZWQgKi8KKyNkZWZpbmUgVkZTX1VNT1VOVAkJMHgwMDA4CS8qIHVubW91bnQgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUgVkZTX0VORAkJCTB4MDAwOAkvKiBtYXggZmxhZyAqLworCisjZGVmaW5lIFNZTkNfQVRUUgkJMHgwMDAxCS8qIHN5bmMgYXR0cmlidXRlcyAqLworI2RlZmluZSBTWU5DX0NMT1NFCQkweDAwMDIJLyogY2xvc2UgZmlsZSBzeXN0ZW0gZG93biAqLworI2RlZmluZSBTWU5DX0RFTFdSSQkJMHgwMDA0CS8qIGxvb2sgYXQgZGVsYXllZCB3cml0ZXMgKi8KKyNkZWZpbmUgU1lOQ19XQUlUCQkweDAwMDgJLyogd2FpdCBmb3IgaS9vIHRvIGNvbXBsZXRlICovCisjZGVmaW5lIFNZTkNfQkRGTFVTSAkJMHgwMDEwCS8qIEJERkxVU0ggaXMgY2FsbGluZyAtLSBkb24ndCBibG9jayAqLworI2RlZmluZSBTWU5DX0ZTREFUQQkJMHgwMDIwCS8qIGZsdXNoIGZzIGRhdGEgKGUuZy4gc3VwZXJibG9ja3MpICovCisjZGVmaW5lIFNZTkNfUkVGQ0FDSEUJCTB4MDA0MCAgLyogcHJ1bmUgc29tZSBvZiB0aGUgbmZzIHJlZiBjYWNoZSAqLworI2RlZmluZSBTWU5DX1JFTU9VTlQJCTB4MDA4MCAgLyogcmVtb3VudCByZWFkb25seSwgbm8gZHVtbXkgTFJzICovCisKK3R5cGVkZWYgaW50CSgqdmZzX21vdW50X3QpKGJodl9kZXNjX3QgKiwKKwkJCQlzdHJ1Y3QgeGZzX21vdW50X2FyZ3MgKiwgc3RydWN0IGNyZWQgKik7Cit0eXBlZGVmIGludAkoKnZmc19wYXJzZWFyZ3NfdCkoYmh2X2Rlc2NfdCAqLCBjaGFyICosCisJCQkJc3RydWN0IHhmc19tb3VudF9hcmdzICosIGludCk7Cit0eXBlZGVmCWludAkoKnZmc19zaG93YXJnc190KShiaHZfZGVzY190ICosIHN0cnVjdCBzZXFfZmlsZSAqKTsKK3R5cGVkZWYgaW50CSgqdmZzX3VubW91bnRfdCkoYmh2X2Rlc2NfdCAqLCBpbnQsIHN0cnVjdCBjcmVkICopOwordHlwZWRlZiBpbnQJKCp2ZnNfbW50dXBkYXRlX3QpKGJodl9kZXNjX3QgKiwgaW50ICosCisJCQkJc3RydWN0IHhmc19tb3VudF9hcmdzICopOwordHlwZWRlZiBpbnQJKCp2ZnNfcm9vdF90KShiaHZfZGVzY190ICosIHN0cnVjdCB2bm9kZSAqKik7Cit0eXBlZGVmIGludAkoKnZmc19zdGF0dmZzX3QpKGJodl9kZXNjX3QgKiwgeGZzX3N0YXRmc190ICosIHN0cnVjdCB2bm9kZSAqKTsKK3R5cGVkZWYgaW50CSgqdmZzX3N5bmNfdCkoYmh2X2Rlc2NfdCAqLCBpbnQsIHN0cnVjdCBjcmVkICopOwordHlwZWRlZiBpbnQJKCp2ZnNfdmdldF90KShiaHZfZGVzY190ICosIHN0cnVjdCB2bm9kZSAqKiwgc3RydWN0IGZpZCAqKTsKK3R5cGVkZWYgaW50CSgqdmZzX2RtYXBpb3BzX3QpKGJodl9kZXNjX3QgKiwgY2FkZHJfdCk7Cit0eXBlZGVmIGludAkoKnZmc19xdW90YWN0bF90KShiaHZfZGVzY190ICosIGludCwgaW50LCBjYWRkcl90KTsKK3R5cGVkZWYgdm9pZAkoKnZmc19pbml0X3Zub2RlX3QpKGJodl9kZXNjX3QgKiwKKwkJCQlzdHJ1Y3Qgdm5vZGUgKiwgYmh2X2Rlc2NfdCAqLCBpbnQpOwordHlwZWRlZiB2b2lkCSgqdmZzX2ZvcmNlX3NodXRkb3duX3QpKGJodl9kZXNjX3QgKiwgaW50LCBjaGFyICosIGludCk7Cit0eXBlZGVmIHZvaWQJKCp2ZnNfZnJlZXplX3QpKGJodl9kZXNjX3QgKik7CisKK3R5cGVkZWYgc3RydWN0IHZmc29wcyB7CisJYmh2X3Bvc2l0aW9uX3QJCXZmX3Bvc2l0aW9uOwkvKiBiZWhhdmlvciBjaGFpbiBwb3NpdGlvbiAqLworCXZmc19tb3VudF90CQl2ZnNfbW91bnQ7CS8qIG1vdW50IGZpbGUgc3lzdGVtICovCisJdmZzX3BhcnNlYXJnc190CQl2ZnNfcGFyc2VhcmdzOwkvKiBwYXJzZSBtb3VudCBvcHRpb25zICovCisJdmZzX3Nob3dhcmdzX3QJCXZmc19zaG93YXJnczsJLyogdW5wYXJzZSBtb3VudCBvcHRpb25zICovCisJdmZzX3VubW91bnRfdAkJdmZzX3VubW91bnQ7CS8qIHVubW91bnQgZmlsZSBzeXN0ZW0gKi8KKwl2ZnNfbW50dXBkYXRlX3QJCXZmc19tbnR1cGRhdGU7CS8qIHVwZGF0ZSBmaWxlIHN5c3RlbSBvcHRpb25zICovCisJdmZzX3Jvb3RfdAkJdmZzX3Jvb3Q7CS8qIGdldCByb290IHZub2RlICovCisJdmZzX3N0YXR2ZnNfdAkJdmZzX3N0YXR2ZnM7CS8qIGZpbGUgc3lzdGVtIHN0YXRpc3RpY3MgKi8KKwl2ZnNfc3luY190CQl2ZnNfc3luYzsJLyogZmx1c2ggZmlsZXMgKi8KKwl2ZnNfdmdldF90CQl2ZnNfdmdldDsJLyogZ2V0IHZub2RlIGZyb20gZmlkICovCisJdmZzX2RtYXBpb3BzX3QJCXZmc19kbWFwaW9wczsJLyogZGF0YSBtaWdyYXRpb24gKi8KKwl2ZnNfcXVvdGFjdGxfdAkJdmZzX3F1b3RhY3RsOwkvKiBkaXNrIHF1b3RhICovCisJdmZzX2luaXRfdm5vZGVfdAl2ZnNfaW5pdF92bm9kZTsJLyogaW5pdGlhbGl6ZSBhIG5ldyB2bm9kZSAqLworCXZmc19mb3JjZV9zaHV0ZG93bl90CXZmc19mb3JjZV9zaHV0ZG93bjsJLyogY3Jhc2ggYW5kIGJ1cm4gKi8KKwl2ZnNfZnJlZXplX3QJCXZmc19mcmVlemU7CS8qIGZyZWV6ZSBmcyBmb3Igc25hcHNob3QgKi8KK30gdmZzb3BzX3Q7CisKKy8qCisgKiBWRlMncy4gIE9wZXJhdGVzIG9uIHZmcyBzdHJ1Y3R1cmUgcG9pbnRlcnMgKHN0YXJ0cyBhdCBiaHYgaGVhZCkuCisgKi8KKyNkZWZpbmUgVkhFQUQodikJCQkoKHYpLT52ZnNfZmJodikKKyNkZWZpbmUgVkZTX01PVU5UKHYsIG1hLGNyLCBydikJCSgocnYpID0gdmZzX21vdW50KFZIRUFEKHYpLCBtYSxjcikpCisjZGVmaW5lIFZGU19QQVJTRUFSR1ModiwgbyxtYSxmLCBydikJKChydikgPSB2ZnNfcGFyc2VhcmdzKFZIRUFEKHYpLCBvLG1hLGYpKQorI2RlZmluZSBWRlNfU0hPV0FSR1ModiwgbSwgcnYpCQkoKHJ2KSA9IHZmc19zaG93YXJncyhWSEVBRCh2KSwgbSkpCisjZGVmaW5lIFZGU19VTk1PVU5UKHYsIGYsIGNyLCBydikJKChydikgPSB2ZnNfdW5tb3VudChWSEVBRCh2KSwgZixjcikpCisjZGVmaW5lIFZGU19NTlRVUERBVEUodiwgZmwsIGFyZ3MsIHJ2KQkoKHJ2KSA9IHZmc19tbnR1cGRhdGUoVkhFQUQodiksIGZsLCBhcmdzKSkKKyNkZWZpbmUgVkZTX1JPT1QodiwgdnBwLCBydikJCSgocnYpID0gdmZzX3Jvb3QoVkhFQUQodiksIHZwcCkpCisjZGVmaW5lIFZGU19TVEFUVkZTKHYsIHNwLHZwLCBydikJKChydikgPSB2ZnNfc3RhdHZmcyhWSEVBRCh2KSwgc3AsdnApKQorI2RlZmluZSBWRlNfU1lOQyh2LCBmbGFnLGNyLCBydikJKChydikgPSB2ZnNfc3luYyhWSEVBRCh2KSwgZmxhZyxjcikpCisjZGVmaW5lIFZGU19WR0VUKHYsIHZwcCxmaWRwLCBydikJKChydikgPSB2ZnNfdmdldChWSEVBRCh2KSwgdnBwLGZpZHApKQorI2RlZmluZSBWRlNfRE1BUElPUFModiwgcCwgcnYpCQkoKHJ2KSA9IHZmc19kbWFwaW9wcyhWSEVBRCh2KSwgcCkpCisjZGVmaW5lIFZGU19RVU9UQUNUTCh2LCBjLGlkLHAsIHJ2KQkoKHJ2KSA9IHZmc19xdW90YWN0bChWSEVBRCh2KSwgYyxpZCxwKSkKKyNkZWZpbmUgVkZTX0lOSVRfVk5PREUodiwgdnAsYix1bCkJKCB2ZnNfaW5pdF92bm9kZShWSEVBRCh2KSwgdnAsYix1bCkgKQorI2RlZmluZSBWRlNfRk9SQ0VfU0hVVERPV04odiwgZmwsZixsKQkoIHZmc19mb3JjZV9zaHV0ZG93bihWSEVBRCh2KSwgZmwsZixsKSApCisjZGVmaW5lIFZGU19GUkVFWkUodikJCQkoIHZmc19mcmVlemUoVkhFQUQodikpICkKKworLyoKKyAqIFBWRlMncy4gIE9wZXJhdGVzIG9uIGJlaGF2aW9yIGRlc2NyaXB0b3IgcG9pbnRlcnMuCisgKi8KKyNkZWZpbmUgUFZGU19NT1VOVChiLCBtYSxjciwgcnYpCSgocnYpID0gdmZzX21vdW50KGIsIG1hLGNyKSkKKyNkZWZpbmUgUFZGU19QQVJTRUFSR1MoYiwgbyxtYSxmLCBydikJKChydikgPSB2ZnNfcGFyc2VhcmdzKGIsIG8sbWEsZikpCisjZGVmaW5lIFBWRlNfU0hPV0FSR1MoYiwgbSwgcnYpCQkoKHJ2KSA9IHZmc19zaG93YXJncyhiLCBtKSkKKyNkZWZpbmUgUFZGU19VTk1PVU5UKGIsIGYsY3IsIHJ2KQkoKHJ2KSA9IHZmc191bm1vdW50KGIsIGYsY3IpKQorI2RlZmluZSBQVkZTX01OVFVQREFURShiLCBmbCwgYXJncywgcnYpCSgocnYpID0gdmZzX21udHVwZGF0ZShiLCBmbCwgYXJncykpCisjZGVmaW5lIFBWRlNfUk9PVChiLCB2cHAsIHJ2KQkJKChydikgPSB2ZnNfcm9vdChiLCB2cHApKQorI2RlZmluZSBQVkZTX1NUQVRWRlMoYiwgc3AsdnAsIHJ2KQkoKHJ2KSA9IHZmc19zdGF0dmZzKGIsIHNwLHZwKSkKKyNkZWZpbmUgUFZGU19TWU5DKGIsIGZsYWcsY3IsIHJ2KQkoKHJ2KSA9IHZmc19zeW5jKGIsIGZsYWcsY3IpKQorI2RlZmluZSBQVkZTX1ZHRVQoYiwgdnBwLGZpZHAsIHJ2KQkoKHJ2KSA9IHZmc192Z2V0KGIsIHZwcCxmaWRwKSkKKyNkZWZpbmUgUFZGU19ETUFQSU9QUyhiLCBwLCBydikJCSgocnYpID0gdmZzX2RtYXBpb3BzKGIsIHApKQorI2RlZmluZSBQVkZTX1FVT1RBQ1RMKGIsIGMsaWQscCwgcnYpCSgocnYpID0gdmZzX3F1b3RhY3RsKGIsIGMsaWQscCkpCisjZGVmaW5lIFBWRlNfSU5JVF9WTk9ERShiLCB2cCxiMix1bCkJKCB2ZnNfaW5pdF92bm9kZShiLCB2cCxiMix1bCkgKQorI2RlZmluZSBQVkZTX0ZPUkNFX1NIVVRET1dOKGIsIGZsLGYsbCkJKCB2ZnNfZm9yY2Vfc2h1dGRvd24oYiwgZmwsZixsKSApCisjZGVmaW5lIFBWRlNfRlJFRVpFKGIpCQkJKCB2ZnNfZnJlZXplKGIpICkKKworZXh0ZXJuIGludCB2ZnNfbW91bnQoYmh2X2Rlc2NfdCAqLCBzdHJ1Y3QgeGZzX21vdW50X2FyZ3MgKiwgc3RydWN0IGNyZWQgKik7CitleHRlcm4gaW50IHZmc19wYXJzZWFyZ3MoYmh2X2Rlc2NfdCAqLCBjaGFyICosIHN0cnVjdCB4ZnNfbW91bnRfYXJncyAqLCBpbnQpOworZXh0ZXJuIGludCB2ZnNfc2hvd2FyZ3MoYmh2X2Rlc2NfdCAqLCBzdHJ1Y3Qgc2VxX2ZpbGUgKik7CitleHRlcm4gaW50IHZmc191bm1vdW50KGJodl9kZXNjX3QgKiwgaW50LCBzdHJ1Y3QgY3JlZCAqKTsKK2V4dGVybiBpbnQgdmZzX21udHVwZGF0ZShiaHZfZGVzY190ICosIGludCAqLCBzdHJ1Y3QgeGZzX21vdW50X2FyZ3MgKik7CitleHRlcm4gaW50IHZmc19yb290KGJodl9kZXNjX3QgKiwgc3RydWN0IHZub2RlICoqKTsKK2V4dGVybiBpbnQgdmZzX3N0YXR2ZnMoYmh2X2Rlc2NfdCAqLCB4ZnNfc3RhdGZzX3QgKiwgc3RydWN0IHZub2RlICopOworZXh0ZXJuIGludCB2ZnNfc3luYyhiaHZfZGVzY190ICosIGludCwgc3RydWN0IGNyZWQgKik7CitleHRlcm4gaW50IHZmc192Z2V0KGJodl9kZXNjX3QgKiwgc3RydWN0IHZub2RlICoqLCBzdHJ1Y3QgZmlkICopOworZXh0ZXJuIGludCB2ZnNfZG1hcGlvcHMoYmh2X2Rlc2NfdCAqLCBjYWRkcl90KTsKK2V4dGVybiBpbnQgdmZzX3F1b3RhY3RsKGJodl9kZXNjX3QgKiwgaW50LCBpbnQsIGNhZGRyX3QpOworZXh0ZXJuIHZvaWQgdmZzX2luaXRfdm5vZGUoYmh2X2Rlc2NfdCAqLCBzdHJ1Y3Qgdm5vZGUgKiwgYmh2X2Rlc2NfdCAqLCBpbnQpOworZXh0ZXJuIHZvaWQgdmZzX2ZvcmNlX3NodXRkb3duKGJodl9kZXNjX3QgKiwgaW50LCBjaGFyICosIGludCk7CitleHRlcm4gdm9pZCB2ZnNfZnJlZXplKGJodl9kZXNjX3QgKik7CisKK3R5cGVkZWYgc3RydWN0IGJodl92ZnNvcHMgeworCXN0cnVjdCB2ZnNvcHMJCWJodl9jb21tb247CisJdm9pZCAqCQkJYmh2X2N1c3RvbTsKK30gYmh2X3Zmc29wc190OworCisjZGVmaW5lIHZmc19iaHZfbG9va3VwKHYsIGlkKQkoIGJodl9sb29rdXBfcmFuZ2UoJih2KS0+dmZzX2JoLCAoaWQpLCAoaWQpKSApCisjZGVmaW5lIHZmc19iaHZfY3VzdG9tKGIpCSggKChiaHZfdmZzb3BzX3QgKilCSFZfT1BTKGIpKS0+Ymh2X2N1c3RvbSApCisjZGVmaW5lIHZmc19iaHZfc2V0X2N1c3RvbShiLG8pCSggKGIpLT5iaHZfY3VzdG9tID0gKHZvaWQgKikobykpCisjZGVmaW5lIHZmc19iaHZfY2xyX2N1c3RvbShiKQkoIChiKS0+Ymh2X2N1c3RvbSA9IE5VTEwgKQorCitleHRlcm4gdmZzX3QgKnZmc19hbGxvY2F0ZSh2b2lkKTsKK2V4dGVybiB2b2lkIHZmc19kZWFsbG9jYXRlKHZmc190ICopOworZXh0ZXJuIHZvaWQgdmZzX2luc2VydG9wcyh2ZnNfdCAqLCBiaHZfdmZzb3BzX3QgKik7CitleHRlcm4gdm9pZCB2ZnNfaW5zZXJ0Ymh2KHZmc190ICosIGJodl9kZXNjX3QgKiwgdmZzb3BzX3QgKiwgdm9pZCAqKTsKKworZXh0ZXJuIHZvaWQgYmh2X2luc2VydF9hbGxfdmZzb3BzKHN0cnVjdCB2ZnMgKik7CitleHRlcm4gdm9pZCBiaHZfcmVtb3ZlX2FsbF92ZnNvcHMoc3RydWN0IHZmcyAqLCBpbnQpOworZXh0ZXJuIHZvaWQgYmh2X3JlbW92ZV92ZnNvcHMoc3RydWN0IHZmcyAqLCBpbnQpOworCisjZGVmaW5lIGZzX2Zyb3plbih2ZnNwKQkJKCh2ZnNwKS0+dmZzX3N1cGVyLT5zX2Zyb3plbikKKyNkZWZpbmUgZnNfY2hlY2tfZnJvemVuKHZmc3AsIGxldmVsKSBcCisJdmZzX2NoZWNrX2Zyb3plbih2ZnNwLT52ZnNfc3VwZXIsIGxldmVsKTsKKworI2VuZGlmCS8qIF9fWEZTX1ZGU19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zub2RlLmMgYi9mcy94ZnMvbGludXgtMi42L3hmc192bm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0OWM2MWMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc192bm9kZS5jCkBAIC0wLDAgKzEsNDU1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisKKwordWludDY0X3Qgdm5fZ2VuZXJhdGlvbjsJCS8qIHZub2RlIGdlbmVyYXRpb24gbnVtYmVyICovCitERUZJTkVfU1BJTkxPQ0sodm51bWJlcl9sb2NrKTsKKworLyoKKyAqIERlZGljYXRlZCB2bm9kZSBpbmFjdGl2ZS9yZWNsYWltIHN5bmMgc2VtYXBob3Jlcy4KKyAqIFByaW1lIG51bWJlciBvZiBoYXNoIGJ1Y2tldHMgc2luY2UgYWRkcmVzcyBpcyB1c2VkIGFzIHRoZSBrZXkuCisgKi8KKyNkZWZpbmUgTlZTWU5DICAgICAgICAgICAgICAgICAgMzcKKyNkZWZpbmUgdnB0b3N5bmModikgICAgICAgICAgICAgKCZ2c3luY1soKHVuc2lnbmVkIGxvbmcpdikgJSBOVlNZTkNdKQorc3ZfdCB2c3luY1tOVlNZTkNdOworCisvKgorICogVHJhbnNsYXRlIHN0YXQoMikgZmlsZSB0eXBlcyB0byB2bm9kZSB0eXBlcyBhbmQgdmljZSB2ZXJzYS4KKyAqIEF3YXJlIG9mIG51bWVyaWMgb3JkZXIgb2YgU19JRk1UIGFuZCB2bm9kZSB0eXBlIHZhbHVlcy4KKyAqLworZW51bSB2dHlwZSBpZnRvdnRfdGFiW10gPSB7CisJVk5PTiwgVkZJRk8sIFZDSFIsIFZOT04sIFZESVIsIFZOT04sIFZCTEssIFZOT04sCisJVlJFRywgVk5PTiwgVkxOSywgVk5PTiwgVlNPQ0ssIFZOT04sIFZOT04sIFZOT04KK307CisKK3Vfc2hvcnQgdnR0b2lmX3RhYltdID0geworCTAsIFNfSUZSRUcsIFNfSUZESVIsIFNfSUZCTEssIFNfSUZDSFIsIFNfSUZMTkssIFNfSUZJRk8sIDAsIFNfSUZTT0NLCit9OworCisKK3ZvaWQKK3ZuX2luaXQodm9pZCkKK3sKKwlyZWdpc3RlciBzdl90ICpzdnA7CisJcmVnaXN0ZXIgaW50IGk7CisKKwlmb3IgKHN2cCA9IHZzeW5jLCBpID0gMDsgaSA8IE5WU1lOQzsgaSsrLCBzdnArKykKKwkJaW5pdF9zdihzdnAsIFNWX0RFRkFVTFQsICJ2c3kiLCBpKTsKK30KKworLyoKKyAqIENsZWFuIGEgdm5vZGUgb2YgZmlsZXN5c3RlbS1zcGVjaWZpYyBkYXRhIGFuZCBwcmVwYXJlIGl0IGZvciByZXVzZS4KKyAqLworU1RBVElDIGludAordm5fcmVjbGFpbSgKKwlzdHJ1Y3Qgdm5vZGUJKnZwKQoreworCWludAkJZXJyb3I7CisKKwlYRlNfU1RBVFNfSU5DKHZuX3JlY2xhaW0pOworCXZuX3RyYWNlX2VudHJ5KHZwLCAidm5fcmVjbGFpbSIsIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKworCS8qCisJICogT25seSBtYWtlIHRoZSBWT1BfUkVDTEFJTSBjYWxsIGlmIHRoZXJlIGFyZSBiZWhhdmlvcnMKKwkgKiB0byBjYWxsLgorCSAqLworCWlmICh2cC0+dl9mYmh2KSB7CisJCVZPUF9SRUNMQUlNKHZwLCBlcnJvcik7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiAtZXJyb3I7CisJfQorCUFTU0VSVCh2cC0+dl9mYmh2ID09IE5VTEwpOworCisJVk5fTE9DSyh2cCk7CisJdnAtPnZfZmxhZyAmPSAoVlJFQ0xNfFZXQUlUKTsKKwlWTl9VTkxPQ0sodnAsIDApOworCisJdnAtPnZfdHlwZSA9IFZOT047CisJdnAtPnZfZmJodiA9IE5VTEw7CisKKyNpZmRlZiBYRlNfVk5PREVfVFJBQ0UKKwlrdHJhY2VfZnJlZSh2cC0+dl90cmFjZSk7CisJdnAtPnZfdHJhY2UgPSBOVUxMOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworU1RBVElDIHZvaWQKK3ZuX3dha2V1cCgKKwlzdHJ1Y3Qgdm5vZGUJKnZwKQoreworCVZOX0xPQ0sodnApOworCWlmICh2cC0+dl9mbGFnICYgVldBSVQpCisJCXN2X2Jyb2FkY2FzdCh2cHRvc3luYyh2cCkpOworCXZwLT52X2ZsYWcgJj0gfihWUkVDTE18VldBSVR8Vk1PRElGSUVEKTsKKwlWTl9VTkxPQ0sodnAsIDApOworfQorCitpbnQKK3ZuX3dhaXQoCisJc3RydWN0IHZub2RlCSp2cCkKK3sKKwlWTl9MT0NLKHZwKTsKKwlpZiAodnAtPnZfZmxhZyAmIChWSU5BQ1QgfCBWUkVDTE0pKSB7CisJCXZwLT52X2ZsYWcgfD0gVldBSVQ7CisJCXN2X3dhaXQodnB0b3N5bmModnApLCBQSU5PRCwgJnZwLT52X2xvY2ssIDApOworCQlyZXR1cm4gMTsKKwl9CisJVk5fVU5MT0NLKHZwLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHZub2RlICoKK3ZuX2luaXRpYWxpemUoCisJc3RydWN0IGlub2RlCSppbm9kZSkKK3sKKwlzdHJ1Y3Qgdm5vZGUJKnZwID0gTElOVkZTX0dFVF9WUChpbm9kZSk7CisKKwlYRlNfU1RBVFNfSU5DKHZuX2FjdGl2ZSk7CisJWEZTX1NUQVRTX0lOQyh2bl9hbGxvYyk7CisKKwl2cC0+dl9mbGFnID0gVk1PRElGSUVEOworCXNwaW5sb2NrX2luaXQoJnZwLT52X2xvY2ssICJ2X2xvY2siKTsKKworCXNwaW5fbG9jaygmdm51bWJlcl9sb2NrKTsKKwlpZiAoISsrdm5fZ2VuZXJhdGlvbikJLyogdl9udW1iZXIgc2hvdWxkbid0IGJlIHplcm8gKi8KKwkJdm5fZ2VuZXJhdGlvbisrOworCXZwLT52X251bWJlciA9IHZuX2dlbmVyYXRpb247CisJc3Bpbl91bmxvY2soJnZudW1iZXJfbG9jayk7CisKKwlBU1NFUlQoVk5fQ0FDSEVEKHZwKSA9PSAwKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGZpcnN0IGJlaGF2aW9yIGFuZCB0aGUgYmVoYXZpb3IgY2hhaW4gaGVhZC4gKi8KKwl2bl9iaHZfaGVhZF9pbml0KFZOX0JIVl9IRUFEKHZwKSwgInZub2RlIik7CisKKyNpZmRlZglYRlNfVk5PREVfVFJBQ0UKKwl2cC0+dl90cmFjZSA9IGt0cmFjZV9hbGxvYyhWTk9ERV9UUkFDRV9TSVpFLCBLTV9TTEVFUCk7CisJcHJpbnRrKCJBbGxvY2F0ZWQgVk5PREVfVFJBQ0UgYXQgMHglcFxuIiwgdnAtPnZfdHJhY2UpOworI2VuZGlmCS8qIFhGU19WTk9ERV9UUkFDRSAqLworCisJdm5fdHJhY2VfZXhpdCh2cCwgInZuX2luaXRpYWxpemUiLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisJcmV0dXJuIHZwOworfQorCisvKgorICogR2V0IGEgcmVmZXJlbmNlIG9uIGEgdm5vZGUuCisgKi8KK3Zub2RlX3QgKgordm5fZ2V0KAorCXN0cnVjdCB2bm9kZQkqdnAsCisJdm1hcF90CQkqdm1hcCkKK3sKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlOworCisJWEZTX1NUQVRTX0lOQyh2bl9nZXQpOworCWlub2RlID0gTElOVkZTX0dFVF9JUCh2cCk7CisJaWYgKGlub2RlLT5pX3N0YXRlICYgSV9GUkVFSU5HKQorCQlyZXR1cm4gTlVMTDsKKworCWlub2RlID0gaWxvb2t1cCh2bWFwLT52X3Zmc3AtPnZmc19zdXBlciwgdm1hcC0+dl9pbm8pOworCWlmICghaW5vZGUpCS8qIElub2RlIG5vdCBwcmVzZW50ICovCisJCXJldHVybiBOVUxMOworCisJdm5fdHJhY2VfZXhpdCh2cCwgInZuX2dldCIsIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKworCXJldHVybiB2cDsKK30KKworLyoKKyAqIFJldmFsaWRhdGUgdGhlIExpbnV4IGlub2RlIGZyb20gdGhlIHZhdHRyLgorICogTm90ZTogaV9zaXplIF9ub3RfIHVwZGF0ZWQ7IHdlIG11c3QgaG9sZCB0aGUgaW5vZGUKKyAqIHNlbWFwaG9yZSB3aGVuIGRvaW5nIHRoYXQgLSBjYWxsZXJzIHJlc3BvbnNpYmlsaXR5LgorICovCit2b2lkCit2bl9yZXZhbGlkYXRlX2NvcmUoCisJc3RydWN0IHZub2RlCSp2cCwKKwl2YXR0cl90CQkqdmFwKQoreworCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBMSU5WRlNfR0VUX0lQKHZwKTsKKworCWlub2RlLT5pX21vZGUJICAgID0gVlRUT0lGKHZhcC0+dmFfdHlwZSkgfCB2YXAtPnZhX21vZGU7CisJaW5vZGUtPmlfbmxpbmsJICAgID0gdmFwLT52YV9ubGluazsKKwlpbm9kZS0+aV91aWQJICAgID0gdmFwLT52YV91aWQ7CisJaW5vZGUtPmlfZ2lkCSAgICA9IHZhcC0+dmFfZ2lkOworCWlub2RlLT5pX2Jsb2NrcwkgICAgPSB2YXAtPnZhX25ibG9ja3M7CisJaW5vZGUtPmlfbXRpbWUJICAgID0gdmFwLT52YV9tdGltZTsKKwlpbm9kZS0+aV9jdGltZQkgICAgPSB2YXAtPnZhX2N0aW1lOworCWlub2RlLT5pX2F0aW1lCSAgICA9IHZhcC0+dmFfYXRpbWU7CisJaWYgKHZhcC0+dmFfeGZsYWdzICYgWEZTX1hGTEFHX0lNTVVUQUJMRSkKKwkJaW5vZGUtPmlfZmxhZ3MgfD0gU19JTU1VVEFCTEU7CisJZWxzZQorCQlpbm9kZS0+aV9mbGFncyAmPSB+U19JTU1VVEFCTEU7CisJaWYgKHZhcC0+dmFfeGZsYWdzICYgWEZTX1hGTEFHX0FQUEVORCkKKwkJaW5vZGUtPmlfZmxhZ3MgfD0gU19BUFBFTkQ7CisJZWxzZQorCQlpbm9kZS0+aV9mbGFncyAmPSB+U19BUFBFTkQ7CisJaWYgKHZhcC0+dmFfeGZsYWdzICYgWEZTX1hGTEFHX1NZTkMpCisJCWlub2RlLT5pX2ZsYWdzIHw9IFNfU1lOQzsKKwllbHNlCisJCWlub2RlLT5pX2ZsYWdzICY9IH5TX1NZTkM7CisJaWYgKHZhcC0+dmFfeGZsYWdzICYgWEZTX1hGTEFHX05PQVRJTUUpCisJCWlub2RlLT5pX2ZsYWdzIHw9IFNfTk9BVElNRTsKKwllbHNlCisJCWlub2RlLT5pX2ZsYWdzICY9IH5TX05PQVRJTUU7Cit9CisKKy8qCisgKiBSZXZhbGlkYXRlIHRoZSBMaW51eCBpbm9kZSBmcm9tIHRoZSB2bm9kZS4KKyAqLworaW50Cit2bl9yZXZhbGlkYXRlKAorCXN0cnVjdCB2bm9kZQkqdnApCit7CisJdmF0dHJfdAkJdmE7CisJaW50CQllcnJvcjsKKworCXZuX3RyYWNlX2VudHJ5KHZwLCAidm5fcmV2YWxpZGF0ZSIsIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKwlBU1NFUlQodnAtPnZfZmJodiAhPSBOVUxMKTsKKworCXZhLnZhX21hc2sgPSBYRlNfQVRfU1RBVHxYRlNfQVRfWEZMQUdTOworCVZPUF9HRVRBVFRSKHZwLCAmdmEsIDAsIE5VTEwsIGVycm9yKTsKKwlpZiAoIWVycm9yKSB7CisJCXZuX3JldmFsaWRhdGVfY29yZSh2cCwgJnZhKTsKKwkJVlVOTU9ESUZZKHZwKTsKKwl9CisJcmV0dXJuIC1lcnJvcjsKK30KKworLyoKKyAqIHB1cmdlIGEgdm5vZGUgZnJvbSB0aGUgY2FjaGUKKyAqIEF0IHRoaXMgcG9pbnQgdGhlIHZub2RlIGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSBubyByZWZlcmVuY2VzICh2bl9jb3VudCA9PSAwKQorICogVGhlIGNhbGxlciBoYXMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlcmUgYXJlIG5vIHdheXMgc29tZW9uZSBjb3VsZAorICogZ2V0IGEgaGFuZGxlICh2aWEgdm5fZ2V0KSBvbiB0aGUgdm5vZGUgKHVzdWFsbHkgZG9uZSB2aWEgYSBtb3VudC92ZnMgbG9jaykuCisgKi8KK3ZvaWQKK3ZuX3B1cmdlKAorCXN0cnVjdCB2bm9kZQkqdnAsCisJdm1hcF90CQkqdm1hcCkKK3sKKwl2bl90cmFjZV9lbnRyeSh2cCwgInZuX3B1cmdlIiwgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCithZ2FpbjoKKwkvKgorCSAqIENoZWNrIHdoZXRoZXIgdnAgaGFzIGFscmVhZHkgYmVlbiByZWNsYWltZWQgc2luY2Ugb3VyIGNhbGxlcgorCSAqIHNhbXBsZWQgaXRzIHZlcnNpb24gd2hpbGUgaG9sZGluZyBhIGZpbGVzeXN0ZW0gY2FjaGUgbG9jayB0aGF0CisJICogaXRzIFZPUF9SRUNMQUlNIGZ1bmN0aW9uIGFjcXVpcmVzLgorCSAqLworCVZOX0xPQ0sodnApOworCWlmICh2cC0+dl9udW1iZXIgIT0gdm1hcC0+dl9udW1iZXIpIHsKKwkJVk5fVU5MT0NLKHZwLCAwKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogSWYgdnAgaXMgYmVpbmcgcmVjbGFpbWVkIG9yIGluYWN0aXZhdGVkLCB3YWl0IHVudGlsIGl0IGlzIGluZXJ0LAorCSAqIHRoZW4gcHJvY2VlZC4gIENhbid0IGFzc3VtZSB0aGF0IHZub2RlIGlzIGFjdHVhbGx5IHJlY2xhaW1lZAorCSAqIGp1c3QgYmVjYXVzZSB0aGUgcmVjbGFpbWVkIGZsYWcgaXMgYXNzZXJ0ZWQgLS0gYSB2bl9hbGxvYworCSAqIHJlY2xhaW0gY2FuIGZhaWwuCisJICovCisJaWYgKHZwLT52X2ZsYWcgJiAoVklOQUNUIHwgVlJFQ0xNKSkgeworCQlBU1NFUlQodm5fY291bnQodnApID09IDApOworCQl2cC0+dl9mbGFnIHw9IFZXQUlUOworCQlzdl93YWl0KHZwdG9zeW5jKHZwKSwgUElOT0QsICZ2cC0+dl9sb2NrLCAwKTsKKwkJZ290byBhZ2FpbjsKKwl9CisKKwkvKgorCSAqIEFub3RoZXIgcHJvY2VzcyBjb3VsZCBoYXZlIHJhY2VkIGluIGFuZCBnb3R0ZW4gdGhpcyB2bm9kZS4uLgorCSAqLworCWlmICh2bl9jb3VudCh2cCkgPiAwKSB7CisJCVZOX1VOTE9DSyh2cCwgMCk7CisJCXJldHVybjsKKwl9CisKKwlYRlNfU1RBVFNfREVDKHZuX2FjdGl2ZSk7CisJdnAtPnZfZmxhZyB8PSBWUkVDTE07CisJVk5fVU5MT0NLKHZwLCAwKTsKKworCS8qCisJICogQ2FsbCBWT1BfUkVDTEFJTSBhbmQgY2xlYW4gdnAuIFRoZSBGU1lOQ19JTlZBTCBmbGFnIHRlbGxzCisJICogdnAncyBmaWxlc3lzdGVtIHRvIGZsdXNoIGFuZCBpbnZhbGlkYXRlIGFsbCBjYWNoZWQgcmVzb3VyY2VzLgorCSAqIFdoZW4gdm5fcmVjbGFpbSByZXR1cm5zLCB2cCBzaG91bGQgaGF2ZSBubyBwcml2YXRlIGRhdGEsCisJICogZWl0aGVyIGluIGEgc3lzdGVtIGNhY2hlIG9yIGF0dGFjaGVkIHRvIHZfZGF0YS4KKwkgKi8KKwlpZiAodm5fcmVjbGFpbSh2cCkgIT0gMCkKKwkJcGFuaWMoInZuX3B1cmdlOiBjYW5ub3QgcmVjbGFpbSIpOworCisJLyoKKwkgKiBXYWtldXAgYW55b25lIHdhaXRpbmcgZm9yIHZwIHRvIGJlIHJlY2xhaW1lZC4KKwkgKi8KKwl2bl93YWtldXAodnApOworfQorCisvKgorICogQWRkIGEgcmVmZXJlbmNlIHRvIGEgcmVmZXJlbmNlZCB2bm9kZS4KKyAqLworc3RydWN0IHZub2RlICoKK3ZuX2hvbGQoCisJc3RydWN0IHZub2RlCSp2cCkKK3sKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlOworCisJWEZTX1NUQVRTX0lOQyh2bl9ob2xkKTsKKworCVZOX0xPQ0sodnApOworCWlub2RlID0gaWdyYWIoTElOVkZTX0dFVF9JUCh2cCkpOworCUFTU0VSVChpbm9kZSk7CisJVk5fVU5MT0NLKHZwLCAwKTsKKworCXJldHVybiB2cDsKK30KKworLyoKKyAqICBDYWxsIFZPUF9JTkFDVElWRSBvbiBsYXN0IHJlZmVyZW5jZS4KKyAqLwordm9pZAordm5fcmVsZSgKKwlzdHJ1Y3Qgdm5vZGUJKnZwKQoreworCWludAkJdmNudDsKKwlpbnQJCWNhY2hlOworCisJWEZTX1NUQVRTX0lOQyh2bl9yZWxlKTsKKworCVZOX0xPQ0sodnApOworCisJdm5fdHJhY2VfZW50cnkodnAsICJ2bl9yZWxlIiwgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCXZjbnQgPSB2bl9jb3VudCh2cCk7CisKKwkvKgorCSAqIFNpbmNlIHdlIGFsd2F5cyBnZXQgY2FsbGVkIGZyb20gcHV0X2lub2RlIHdlIGtub3cKKwkgKiB0aGF0IGlfY291bnQgd29uJ3QgYmUgZGVjcmVtZW50ZWQgYWZ0ZXIgd2UKKwkgKiByZXR1cm4uCisJICovCisJaWYgKCF2Y250KSB7CisJCS8qCisJCSAqIEFzIHNvb24gYXMgd2UgdHVybiB0aGlzIG9uLCBub29uZSBjYW4gZmluZCB1cyBpbiB2bl9nZXQKKwkJICogdW50aWwgd2UgdHVybiBvZmYgVklOQUNUIG9yIFZSRUNMTQorCQkgKi8KKwkJdnAtPnZfZmxhZyB8PSBWSU5BQ1Q7CisJCVZOX1VOTE9DSyh2cCwgMCk7CisKKwkJLyoKKwkJICogRG8gbm90IG1ha2UgdGhlIFZPUF9JTkFDVElWRSBjYWxsIGlmIHRoZXJlCisJCSAqIGFyZSBubyBiZWhhdmlvcnMgYXR0YWNoZWQgdG8gdGhlIHZub2RlIHRvIGNhbGwuCisJCSAqLworCQlpZiAodnAtPnZfZmJodikKKwkJCVZPUF9JTkFDVElWRSh2cCwgTlVMTCwgY2FjaGUpOworCisJCVZOX0xPQ0sodnApOworCQlpZiAodnAtPnZfZmxhZyAmIFZXQUlUKQorCQkJc3ZfYnJvYWRjYXN0KHZwdG9zeW5jKHZwKSk7CisKKwkJdnAtPnZfZmxhZyAmPSB+KFZJTkFDVHxWV0FJVHxWUkVDTE18Vk1PRElGSUVEKTsKKwl9CisKKwlWTl9VTkxPQ0sodnAsIDApOworCisJdm5fdHJhY2VfZXhpdCh2cCwgInZuX3JlbGUiLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7Cit9CisKKy8qCisgKiBGaW5pc2ggdGhlIHJlbW92YWwgb2YgYSB2bm9kZS4KKyAqLwordm9pZAordm5fcmVtb3ZlKAorCXN0cnVjdCB2bm9kZQkqdnApCit7CisJdm1hcF90CQl2bWFwOworCisJLyogTWFrZSBzdXJlIHdlIGRvbid0IGRvIHRoaXMgdG8gdGhlIHNhbWUgdm5vZGUgdHdpY2UgKi8KKwlpZiAoISh2cC0+dl9mYmh2KSkKKwkJcmV0dXJuOworCisJWEZTX1NUQVRTX0lOQyh2bl9yZW1vdmUpOworCXZuX3RyYWNlX2V4aXQodnAsICJ2bl9yZW1vdmUiLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisKKwkvKgorCSAqIEFmdGVyIHRoZSBmb2xsb3dpbmcgcHVyZ2UgdGhlIHZub2RlCisJICogd2lsbCBubyBsb25nZXIgZXhpc3QuCisJICovCisJVk1BUCh2cCwgdm1hcCk7CisJdm5fcHVyZ2UodnAsICZ2bWFwKTsKK30KKworCisjaWZkZWYJWEZTX1ZOT0RFX1RSQUNFCisKKyNkZWZpbmUgS1RSQUNFX0VOVEVSKHZwLCB2aywgcywgbGluZSwgcmEpCQkJXAorCWt0cmFjZV9lbnRlcigJKHZwKS0+dl90cmFjZSwJCQkJXAorLyogIDAgKi8JCSh2b2lkICopKF9fcHNpbnRfdCkodmspLAkJXAorLyogIDEgKi8JCSh2b2lkICopKHMpLAkJCQlcCisvKiAgMiAqLwkJKHZvaWQgKikoX19wc2ludF90KSBsaW5lLAkJXAorLyogIDMgKi8JCSh2b2lkICopKHZuX2NvdW50KHZwKSksIFwKKy8qICA0ICovCQkodm9pZCAqKShyYSksCQkJCVwKKy8qICA1ICovCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdCkodnApLT52X2ZsYWcsCVwKKy8qICA2ICovCQkodm9pZCAqKShfX3BzaW50X3QpY3VycmVudF9jcHUoKSwJXAorLyogIDcgKi8JCSh2b2lkICopKF9fcHNpbnRfdCljdXJyZW50X3BpZCgpLAlcCisvKiAgOCAqLwkJKHZvaWQgKilfX3JldHVybl9hZGRyZXNzLAkJXAorLyogIDkgKi8JCTAsIDAsIDAsIDAsIDAsIDAsIDApCisKKy8qCisgKiBWbm9kZSB0cmFjaW5nIGNvZGUuCisgKi8KK3ZvaWQKK3ZuX3RyYWNlX2VudHJ5KHZub2RlX3QgKnZwLCBjaGFyICpmdW5jLCBpbnN0X3QgKnJhKQoreworCUtUUkFDRV9FTlRFUih2cCwgVk5PREVfS1RSQUNFX0VOVFJZLCBmdW5jLCAwLCByYSk7Cit9CisKK3ZvaWQKK3ZuX3RyYWNlX2V4aXQodm5vZGVfdCAqdnAsIGNoYXIgKmZ1bmMsIGluc3RfdCAqcmEpCit7CisJS1RSQUNFX0VOVEVSKHZwLCBWTk9ERV9LVFJBQ0VfRVhJVCwgZnVuYywgMCwgcmEpOworfQorCit2b2lkCit2bl90cmFjZV9ob2xkKHZub2RlX3QgKnZwLCBjaGFyICpmaWxlLCBpbnQgbGluZSwgaW5zdF90ICpyYSkKK3sKKwlLVFJBQ0VfRU5URVIodnAsIFZOT0RFX0tUUkFDRV9IT0xELCBmaWxlLCBsaW5lLCByYSk7Cit9CisKK3ZvaWQKK3ZuX3RyYWNlX3JlZih2bm9kZV90ICp2cCwgY2hhciAqZmlsZSwgaW50IGxpbmUsIGluc3RfdCAqcmEpCit7CisJS1RSQUNFX0VOVEVSKHZwLCBWTk9ERV9LVFJBQ0VfUkVGLCBmaWxlLCBsaW5lLCByYSk7Cit9CisKK3ZvaWQKK3ZuX3RyYWNlX3JlbGUodm5vZGVfdCAqdnAsIGNoYXIgKmZpbGUsIGludCBsaW5lLCBpbnN0X3QgKnJhKQoreworCUtUUkFDRV9FTlRFUih2cCwgVk5PREVfS1RSQUNFX1JFTEUsIGZpbGUsIGxpbmUsIHJhKTsKK30KKyNlbmRpZgkvKiBYRlNfVk5PREVfVFJBQ0UgKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX3Zub2RlLmggYi9mcy94ZnMvbGludXgtMi42L3hmc192bm9kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNzZjMWYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvbGludXgtMi42L3hmc192bm9kZS5oCkBAIC0wLDAgKzEsNjY2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5ODksIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBfX1hGU19WTk9ERV9IX18KKyNkZWZpbmUgX19YRlNfVk5PREVfSF9fCisKK3N0cnVjdCB1aW87CitzdHJ1Y3QgZmlsZTsKK3N0cnVjdCB2YXR0cjsKK3N0cnVjdCB4ZnNfaW9tYXA7CitzdHJ1Y3QgYXR0cmxpc3RfY3Vyc29yX2tlcm47CisKKy8qCisgKiBWbm9kZSB0eXBlcy4gIFZOT04gbWVhbnMgbm8gdHlwZS4KKyAqLworZW51bSB2dHlwZQl7IFZOT04sIFZSRUcsIFZESVIsIFZCTEssIFZDSFIsIFZMTkssIFZGSUZPLCBWQkFELCBWU09DSyB9OworCit0eXBlZGVmIHhmc19pbm9fdCB2bnVtYmVyX3Q7Cit0eXBlZGVmIHN0cnVjdCBkZW50cnkgdm5hbWVfdDsKK3R5cGVkZWYgYmh2X2hlYWRfdCB2bl9iaHZfaGVhZF90OworCisvKgorICogTVAgbG9ja2luZyBwcm90b2NvbHM6CisgKgl2X2ZsYWcsIHZfdmZzcAkJCQlWTl9MT0NLL1ZOX1VOTE9DSworICoJdl90eXBlCQkJCQlyZWFkLW9ubHkgb3IgZnMtZGVwZW5kZW50CisgKi8KK3R5cGVkZWYgc3RydWN0IHZub2RlIHsKKwlfX3UzMgkJdl9mbGFnOwkJCS8qIHZub2RlIGZsYWdzIChzZWUgYmVsb3cpICovCisJZW51bSB2dHlwZQl2X3R5cGU7CQkJLyogdm5vZGUgdHlwZSAqLworCXN0cnVjdCB2ZnMJKnZfdmZzcDsJCS8qIHB0ciB0byBjb250YWluaW5nIFZGUyAqLworCXZudW1iZXJfdAl2X251bWJlcjsJCS8qIGluLWNvcmUgdm5vZGUgbnVtYmVyICovCisJdm5fYmh2X2hlYWRfdAl2X2JoOwkJCS8qIGJlaGF2aW9yIGhlYWQgKi8KKwlzcGlubG9ja190CXZfbG9jazsJCQkvKiBWTl9MT0NLL1ZOX1VOTE9DSyAqLworCXN0cnVjdCBpbm9kZQl2X2lub2RlOwkJLyogTGludXggaW5vZGUgKi8KKyNpZmRlZiBYRlNfVk5PREVfVFJBQ0UKKwlzdHJ1Y3Qga3RyYWNlCSp2X3RyYWNlOwkJLyogdHJhY2UgaGVhZGVyIHN0cnVjdHVyZSAgICAqLworI2VuZGlmCit9IHZub2RlX3Q7CisKKyNkZWZpbmUgdl9mYmh2CQkJdl9iaC5iaF9maXJzdAkgICAgICAgLyogZmlyc3QgYmVoYXZpb3IgKi8KKyNkZWZpbmUgdl9mb3BzCQkJdl9iaC5iaF9maXJzdC0+YmRfb3BzICAvKiBmaXJzdCBiZWhhdmlvciBvcHMgKi8KKworI2RlZmluZSBWTk9ERV9QT1NJVElPTl9CQVNFCUJIVl9QT1NJVElPTl9CQVNFCS8qIGNoYWluIGJvdHRvbSAqLworI2RlZmluZSBWTk9ERV9QT1NJVElPTl9UT1AJQkhWX1BPU0lUSU9OX1RPUAkvKiBjaGFpbiB0b3AgKi8KKyNkZWZpbmUgVk5PREVfUE9TSVRJT05fSU5WQUxJRAlCSFZfUE9TSVRJT05fSU5WQUxJRAkvKiBpbnZhbGlkIHBvcy4gbnVtICovCisKK3R5cGVkZWYgZW51bSB7CisJVk5fQkhWX1VOS05PV04sCQkvKiBub3Qgc3BlY2lmaWVkICovCisJVk5fQkhWX1hGUywJCS8qIHhmcyAqLworCVZOX0JIVl9ETSwJCS8qIGRhdGEgbWlncmF0aW9uICovCisJVk5fQkhWX1FNLAkJLyogcXVvdGEgbWFuYWdlciAqLworCVZOX0JIVl9JTywJCS8qIElPIHBhdGggKi8KKwlWTl9CSFZfRU5ECQkvKiBob3VzZWtlZXBpbmcgZW5kLW9mLXJhbmdlICovCit9IHZuX2Jodl90OworCisjZGVmaW5lIFZOT0RFX1BPU0lUSU9OX1hGUwkoVk5PREVfUE9TSVRJT05fQkFTRSkKKyNkZWZpbmUgVk5PREVfUE9TSVRJT05fRE0JKFZOT0RFX1BPU0lUSU9OX0JBU0UrMTApCisjZGVmaW5lIFZOT0RFX1BPU0lUSU9OX1FNCShWTk9ERV9QT1NJVElPTl9CQVNFKzIwKQorI2RlZmluZSBWTk9ERV9QT1NJVElPTl9JTwkoVk5PREVfUE9TSVRJT05fQkFTRSszMCkKKworLyoKKyAqIE1hY3JvcyBmb3IgZGVhbGluZyB3aXRoIHRoZSBiZWhhdmlvciBkZXNjcmlwdG9yIGluc2lkZSBvZiB0aGUgdm5vZGUuCisgKi8KKyNkZWZpbmUgQkhWX1RPX1ZOT0RFKGJkcCkJKCh2bm9kZV90ICopQkhWX1ZPQkooYmRwKSkKKyNkZWZpbmUgQkhWX1RPX1ZOT0RFX05VTEwoYmRwKQkoKHZub2RlX3QgKilCSFZfVk9CSk5VTEwoYmRwKSkKKworI2RlZmluZSBWTl9CSFZfSEVBRCh2cCkJCQkoKGJodl9oZWFkX3QgKikoJigodnApLT52X2JoKSkpCisjZGVmaW5lIHZuX2Jodl9oZWFkX2luaXQoYmhwLG5hbWUpCWJodl9oZWFkX2luaXQoYmhwLG5hbWUpCisjZGVmaW5lIHZuX2Jodl9yZW1vdmUoYmhwLGJkcCkJCWJodl9yZW1vdmUoYmhwLGJkcCkKKyNkZWZpbmUgdm5fYmh2X2xvb2t1cChiaHAsb3BzKQkJYmh2X2xvb2t1cChiaHAsb3BzKQorI2RlZmluZSB2bl9iaHZfbG9va3VwX3VubG9ja2VkKGJocCxvcHMpIGJodl9sb29rdXBfdW5sb2NrZWQoYmhwLG9wcykKKworLyoKKyAqIFZub2RlIHRvIExpbnV4IGlub2RlIG1hcHBpbmcuCisgKi8KKyNkZWZpbmUgTElOVkZTX0dFVF9WUChpbm9kZSkJKCh2bm9kZV90ICopbGlzdF9lbnRyeShpbm9kZSwgdm5vZGVfdCwgdl9pbm9kZSkpCisjZGVmaW5lIExJTlZGU19HRVRfSVAodnApCSgmKHZwKS0+dl9pbm9kZSkKKworLyoKKyAqIENvbnZlcnQgYmV0d2VlbiB2bm9kZSB0eXBlcyBhbmQgaW5vZGUgZm9ybWF0cyAoc2luY2UgUE9TSVguMQorICogZGVmaW5lcyBtb2RlIHdvcmQgb2Ygc3RhdCBzdHJ1Y3R1cmUgaW4gdGVybXMgb2YgaW5vZGUgZm9ybWF0cykuCisgKi8KK2V4dGVybiBlbnVtIHZ0eXBlCWlmdG92dF90YWJbXTsKK2V4dGVybiB1X3Nob3J0CQl2dHRvaWZfdGFiW107CisjZGVmaW5lIElGVE9WVChtb2RlKQkoaWZ0b3Z0X3RhYlsoKG1vZGUpICYgU19JRk1UKSA+PiAxMl0pCisjZGVmaW5lIFZUVE9JRihpbmR4KQkodnR0b2lmX3RhYlsoaW50KShpbmR4KV0pCisjZGVmaW5lIE1BS0VJTU9ERShpbmR4LCBtb2RlKQkoaW50KShWVFRPSUYoaW5keCkgfCAobW9kZSkpCisKKworLyoKKyAqIFZub2RlIGZsYWdzLgorICovCisjZGVmaW5lIFZJTkFDVAkJICAgICAgIDB4MQkvKiB2bm9kZSBpcyBiZWluZyBpbmFjdGl2YXRlZAkqLworI2RlZmluZSBWUkVDTE0JCSAgICAgICAweDIJLyogdm5vZGUgaXMgYmVpbmcgcmVjbGFpbWVkCSovCisjZGVmaW5lIFZXQUlUCQkgICAgICAgMHg0CS8qIHdhaXRpbmcgZm9yIFZJTkFDVC9WUkVDTE0gdG8gZW5kICovCisjZGVmaW5lIFZNT0RJRklFRAkgICAgICAgMHg4CS8qIFhGUyBpbm9kZSBzdGF0ZSBwb3NzaWJseSBkaWZmZXJzICovCisJCQkJCS8qIHRvIHRoZSBMaW51eCBpbm9kZSBzdGF0ZS4JKi8KKworLyoKKyAqIFZhbHVlcyBmb3IgdGhlIFZPUF9SV0xPQ0sgYW5kIFZPUF9SV1VOTE9DSyBmbGFncyBwYXJhbWV0ZXIuCisgKi8KK3R5cGVkZWYgZW51bSB2cndsb2NrIHsKKwlWUldMT0NLX05PTkUsCisJVlJXTE9DS19SRUFELAorCVZSV0xPQ0tfV1JJVEUsCisJVlJXTE9DS19XUklURV9ESVJFQ1QsCisJVlJXTE9DS19UUllfUkVBRCwKKwlWUldMT0NLX1RSWV9XUklURQorfSB2cndsb2NrX3Q7CisKKy8qCisgKiBSZXR1cm4gdmFsdWVzIGZvciBWT1BfSU5BQ1RJVkUuICBBIHJldHVybiB2YWx1ZSBvZgorICogVk5fSU5BQ1RJVkVfTk9DQUNIRSBpbXBsaWVzIHRoYXQgdGhlIGZpbGUgc3lzdGVtIGJlaGF2aW9yCisgKiBoYXMgZGlzYXNzb2NpYXRlZCBpdHMgc3RhdGUgYW5kIGJodl9kZXNjX3QgZnJvbSB0aGUgdm5vZGUuCisgKi8KKyNkZWZpbmUJVk5fSU5BQ1RJVkVfQ0FDSEUJMAorI2RlZmluZQlWTl9JTkFDVElWRV9OT0NBQ0hFCTEKKworLyoKKyAqIFZhbHVlcyBmb3IgdGhlIGNtZCBjb2RlIGdpdmVuIHRvIFZPUF9WTk9ERV9DSEFOR0UuCisgKi8KK3R5cGVkZWYgZW51bSB2Y2hhbmdlIHsKKwlWQ0hBTkdFX0ZMQUdTX0ZSTE9DS1MJCT0gMCwKKwlWQ0hBTkdFX0ZMQUdTX0VORl9MT0NLSU5HCT0gMSwKKwlWQ0hBTkdFX0ZMQUdTX1RSVU5DQVRFRAkJPSAyLAorCVZDSEFOR0VfRkxBR1NfUEFHRV9ESVJUWQk9IDMsCisJVkNIQU5HRV9GTEFHU19JT0VYQ0xfQ09VTlQJPSA0Cit9IHZjaGFuZ2VfdDsKKworCit0eXBlZGVmIGludAkoKnZvcF9vcGVuX3QpKGJodl9kZXNjX3QgKiwgc3RydWN0IGNyZWQgKik7Cit0eXBlZGVmIHNzaXplX3QgKCp2b3BfcmVhZF90KShiaHZfZGVzY190ICosIHN0cnVjdCBraW9jYiAqLAorCQkJCWNvbnN0IHN0cnVjdCBpb3ZlYyAqLCB1bnNpZ25lZCBpbnQsCisJCQkJbG9mZl90ICosIGludCwgc3RydWN0IGNyZWQgKik7Cit0eXBlZGVmIHNzaXplX3QgKCp2b3Bfd3JpdGVfdCkoYmh2X2Rlc2NfdCAqLCBzdHJ1Y3Qga2lvY2IgKiwKKwkJCQljb25zdCBzdHJ1Y3QgaW92ZWMgKiwgdW5zaWduZWQgaW50LAorCQkJCWxvZmZfdCAqLCBpbnQsIHN0cnVjdCBjcmVkICopOwordHlwZWRlZiBzc2l6ZV90ICgqdm9wX3NlbmRmaWxlX3QpKGJodl9kZXNjX3QgKiwgc3RydWN0IGZpbGUgKiwKKwkJCQlsb2ZmX3QgKiwgaW50LCBzaXplX3QsIHJlYWRfYWN0b3JfdCwKKwkJCQl2b2lkICosIHN0cnVjdCBjcmVkICopOwordHlwZWRlZiBpbnQJKCp2b3BfaW9jdGxfdCkoYmh2X2Rlc2NfdCAqLCBzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKiwKKwkJCQlpbnQsIHVuc2lnbmVkIGludCwgdm9pZCBfX3VzZXIgKik7Cit0eXBlZGVmIGludAkoKnZvcF9nZXRhdHRyX3QpKGJodl9kZXNjX3QgKiwgc3RydWN0IHZhdHRyICosIGludCwKKwkJCQlzdHJ1Y3QgY3JlZCAqKTsKK3R5cGVkZWYgaW50CSgqdm9wX3NldGF0dHJfdCkoYmh2X2Rlc2NfdCAqLCBzdHJ1Y3QgdmF0dHIgKiwgaW50LAorCQkJCXN0cnVjdCBjcmVkICopOwordHlwZWRlZiBpbnQJKCp2b3BfYWNjZXNzX3QpKGJodl9kZXNjX3QgKiwgaW50LCBzdHJ1Y3QgY3JlZCAqKTsKK3R5cGVkZWYgaW50CSgqdm9wX2xvb2t1cF90KShiaHZfZGVzY190ICosIHZuYW1lX3QgKiwgdm5vZGVfdCAqKiwKKwkJCQlpbnQsIHZub2RlX3QgKiwgc3RydWN0IGNyZWQgKik7Cit0eXBlZGVmIGludAkoKnZvcF9jcmVhdGVfdCkoYmh2X2Rlc2NfdCAqLCB2bmFtZV90ICosIHN0cnVjdCB2YXR0ciAqLAorCQkJCXZub2RlX3QgKiosIHN0cnVjdCBjcmVkICopOwordHlwZWRlZiBpbnQJKCp2b3BfcmVtb3ZlX3QpKGJodl9kZXNjX3QgKiwgdm5hbWVfdCAqLCBzdHJ1Y3QgY3JlZCAqKTsKK3R5cGVkZWYgaW50CSgqdm9wX2xpbmtfdCkoYmh2X2Rlc2NfdCAqLCB2bm9kZV90ICosIHZuYW1lX3QgKiwKKwkJCQlzdHJ1Y3QgY3JlZCAqKTsKK3R5cGVkZWYgaW50CSgqdm9wX3JlbmFtZV90KShiaHZfZGVzY190ICosIHZuYW1lX3QgKiwgdm5vZGVfdCAqLCB2bmFtZV90ICosCisJCQkJc3RydWN0IGNyZWQgKik7Cit0eXBlZGVmIGludAkoKnZvcF9ta2Rpcl90KShiaHZfZGVzY190ICosIHZuYW1lX3QgKiwgc3RydWN0IHZhdHRyICosCisJCQkJdm5vZGVfdCAqKiwgc3RydWN0IGNyZWQgKik7Cit0eXBlZGVmIGludAkoKnZvcF9ybWRpcl90KShiaHZfZGVzY190ICosIHZuYW1lX3QgKiwgc3RydWN0IGNyZWQgKik7Cit0eXBlZGVmIGludAkoKnZvcF9yZWFkZGlyX3QpKGJodl9kZXNjX3QgKiwgc3RydWN0IHVpbyAqLCBzdHJ1Y3QgY3JlZCAqLAorCQkJCWludCAqKTsKK3R5cGVkZWYgaW50CSgqdm9wX3N5bWxpbmtfdCkoYmh2X2Rlc2NfdCAqLCB2bmFtZV90ICosIHN0cnVjdCB2YXR0ciAqLAorCQkJCWNoYXIgKiwgdm5vZGVfdCAqKiwgc3RydWN0IGNyZWQgKik7Cit0eXBlZGVmIGludAkoKnZvcF9yZWFkbGlua190KShiaHZfZGVzY190ICosIHN0cnVjdCB1aW8gKiwgaW50LAorCQkJCXN0cnVjdCBjcmVkICopOwordHlwZWRlZiBpbnQJKCp2b3BfZnN5bmNfdCkoYmh2X2Rlc2NfdCAqLCBpbnQsIHN0cnVjdCBjcmVkICosCisJCQkJeGZzX29mZl90LCB4ZnNfb2ZmX3QpOwordHlwZWRlZiBpbnQJKCp2b3BfaW5hY3RpdmVfdCkoYmh2X2Rlc2NfdCAqLCBzdHJ1Y3QgY3JlZCAqKTsKK3R5cGVkZWYgaW50CSgqdm9wX2ZpZDJfdCkoYmh2X2Rlc2NfdCAqLCBzdHJ1Y3QgZmlkICopOwordHlwZWRlZiBpbnQJKCp2b3BfcmVsZWFzZV90KShiaHZfZGVzY190ICopOwordHlwZWRlZiBpbnQJKCp2b3Bfcndsb2NrX3QpKGJodl9kZXNjX3QgKiwgdnJ3bG9ja190KTsKK3R5cGVkZWYgdm9pZAkoKnZvcF9yd3VubG9ja190KShiaHZfZGVzY190ICosIHZyd2xvY2tfdCk7Cit0eXBlZGVmIGludAkoKnZvcF9ibWFwX3QpKGJodl9kZXNjX3QgKiwgeGZzX29mZl90LCBzc2l6ZV90LCBpbnQsCisJCQkJc3RydWN0IHhmc19pb21hcCAqLCBpbnQgKik7Cit0eXBlZGVmIGludAkoKnZvcF9yZWNsYWltX3QpKGJodl9kZXNjX3QgKik7Cit0eXBlZGVmIGludAkoKnZvcF9hdHRyX2dldF90KShiaHZfZGVzY190ICosIGNoYXIgKiwgY2hhciAqLCBpbnQgKiwgaW50LAorCQkJCXN0cnVjdCBjcmVkICopOwordHlwZWRlZglpbnQJKCp2b3BfYXR0cl9zZXRfdCkoYmh2X2Rlc2NfdCAqLCBjaGFyICosIGNoYXIgKiwgaW50LCBpbnQsCisJCQkJc3RydWN0IGNyZWQgKik7Cit0eXBlZGVmCWludAkoKnZvcF9hdHRyX3JlbW92ZV90KShiaHZfZGVzY190ICosIGNoYXIgKiwgaW50LCBzdHJ1Y3QgY3JlZCAqKTsKK3R5cGVkZWYJaW50CSgqdm9wX2F0dHJfbGlzdF90KShiaHZfZGVzY190ICosIGNoYXIgKiwgaW50LCBpbnQsCisJCQkJc3RydWN0IGF0dHJsaXN0X2N1cnNvcl9rZXJuICosIHN0cnVjdCBjcmVkICopOwordHlwZWRlZiB2b2lkCSgqdm9wX2xpbmtfcmVtb3ZlZF90KShiaHZfZGVzY190ICosIHZub2RlX3QgKiwgaW50KTsKK3R5cGVkZWYgdm9pZAkoKnZvcF92bm9kZV9jaGFuZ2VfdCkoYmh2X2Rlc2NfdCAqLCB2Y2hhbmdlX3QsIF9fcHNpbnRfdCk7Cit0eXBlZGVmIHZvaWQJKCp2b3BfcHRvc3N2cF90KShiaHZfZGVzY190ICosIHhmc19vZmZfdCwgeGZzX29mZl90LCBpbnQpOwordHlwZWRlZiB2b2lkCSgqdm9wX3BmbHVzaGludmFsdnBfdCkoYmh2X2Rlc2NfdCAqLCB4ZnNfb2ZmX3QsIHhmc19vZmZfdCwgaW50KTsKK3R5cGVkZWYgaW50CSgqdm9wX3BmbHVzaHZwX3QpKGJodl9kZXNjX3QgKiwgeGZzX29mZl90LCB4ZnNfb2ZmX3QsCisJCQkJdWludDY0X3QsIGludCk7Cit0eXBlZGVmIGludAkoKnZvcF9pZmx1c2hfdCkoYmh2X2Rlc2NfdCAqLCBpbnQpOworCisKK3R5cGVkZWYgc3RydWN0IHZub2Rlb3BzIHsKKwliaHZfcG9zaXRpb25fdCAgdm5fcG9zaXRpb247ICAgIC8qIHBvc2l0aW9uIHdpdGhpbiBiZWhhdmlvciBjaGFpbiAqLworCXZvcF9vcGVuX3QJCXZvcF9vcGVuOworCXZvcF9yZWFkX3QJCXZvcF9yZWFkOworCXZvcF93cml0ZV90CQl2b3Bfd3JpdGU7CisJdm9wX3NlbmRmaWxlX3QJCXZvcF9zZW5kZmlsZTsKKwl2b3BfaW9jdGxfdAkJdm9wX2lvY3RsOworCXZvcF9nZXRhdHRyX3QJCXZvcF9nZXRhdHRyOworCXZvcF9zZXRhdHRyX3QJCXZvcF9zZXRhdHRyOworCXZvcF9hY2Nlc3NfdAkJdm9wX2FjY2VzczsKKwl2b3BfbG9va3VwX3QJCXZvcF9sb29rdXA7CisJdm9wX2NyZWF0ZV90CQl2b3BfY3JlYXRlOworCXZvcF9yZW1vdmVfdAkJdm9wX3JlbW92ZTsKKwl2b3BfbGlua190CQl2b3BfbGluazsKKwl2b3BfcmVuYW1lX3QJCXZvcF9yZW5hbWU7CisJdm9wX21rZGlyX3QJCXZvcF9ta2RpcjsKKwl2b3Bfcm1kaXJfdAkJdm9wX3JtZGlyOworCXZvcF9yZWFkZGlyX3QJCXZvcF9yZWFkZGlyOworCXZvcF9zeW1saW5rX3QJCXZvcF9zeW1saW5rOworCXZvcF9yZWFkbGlua190CQl2b3BfcmVhZGxpbms7CisJdm9wX2ZzeW5jX3QJCXZvcF9mc3luYzsKKwl2b3BfaW5hY3RpdmVfdAkJdm9wX2luYWN0aXZlOworCXZvcF9maWQyX3QJCXZvcF9maWQyOworCXZvcF9yd2xvY2tfdAkJdm9wX3J3bG9jazsKKwl2b3Bfcnd1bmxvY2tfdAkJdm9wX3J3dW5sb2NrOworCXZvcF9ibWFwX3QJCXZvcF9ibWFwOworCXZvcF9yZWNsYWltX3QJCXZvcF9yZWNsYWltOworCXZvcF9hdHRyX2dldF90CQl2b3BfYXR0cl9nZXQ7CisJdm9wX2F0dHJfc2V0X3QJCXZvcF9hdHRyX3NldDsKKwl2b3BfYXR0cl9yZW1vdmVfdAl2b3BfYXR0cl9yZW1vdmU7CisJdm9wX2F0dHJfbGlzdF90CQl2b3BfYXR0cl9saXN0OworCXZvcF9saW5rX3JlbW92ZWRfdAl2b3BfbGlua19yZW1vdmVkOworCXZvcF92bm9kZV9jaGFuZ2VfdAl2b3Bfdm5vZGVfY2hhbmdlOworCXZvcF9wdG9zc3ZwX3QJCXZvcF90b3NzcGFnZXM7CisJdm9wX3BmbHVzaGludmFsdnBfdAl2b3BfZmx1c2hpbnZhbF9wYWdlczsKKwl2b3BfcGZsdXNodnBfdAkJdm9wX2ZsdXNoX3BhZ2VzOworCXZvcF9yZWxlYXNlX3QJCXZvcF9yZWxlYXNlOworCXZvcF9pZmx1c2hfdAkJdm9wX2lmbHVzaDsKK30gdm5vZGVvcHNfdDsKKworLyoKKyAqIFZPUCdzLgorICovCisjZGVmaW5lIF9WT1BfKG9wLCB2cCkJKCooKHZub2Rlb3BzX3QgKikodnApLT52X2ZvcHMpLT5vcCkKKworI2RlZmluZSBWT1BfUkVBRCh2cCxmaWxlLGlvdixzZWdzLG9mZnNldCxpb2ZsYWdzLGNyLHJ2KQkJCVwKKwlydiA9IF9WT1BfKHZvcF9yZWFkLCB2cCkoKHZwKS0+dl9mYmh2LGZpbGUsaW92LHNlZ3Msb2Zmc2V0LGlvZmxhZ3MsY3IpCisjZGVmaW5lIFZPUF9XUklURSh2cCxmaWxlLGlvdixzZWdzLG9mZnNldCxpb2ZsYWdzLGNyLHJ2KQkJXAorCXJ2ID0gX1ZPUF8odm9wX3dyaXRlLCB2cCkoKHZwKS0+dl9mYmh2LGZpbGUsaW92LHNlZ3Msb2Zmc2V0LGlvZmxhZ3MsY3IpCisjZGVmaW5lIFZPUF9TRU5ERklMRSh2cCxmLG9mZixpb2ZsYWdzLGNudCxhY3QsdGFyZyxjcixydikJCVwKKwlydiA9IF9WT1BfKHZvcF9zZW5kZmlsZSwgdnApKCh2cCktPnZfZmJodixmLG9mZixpb2ZsYWdzLGNudCxhY3QsdGFyZyxjcikKKyNkZWZpbmUgVk9QX0JNQVAodnAsb2Ysc3oscncsYixuLHJ2KQkJCQkJXAorCXJ2ID0gX1ZPUF8odm9wX2JtYXAsIHZwKSgodnApLT52X2ZiaHYsb2Ysc3oscncsYixuKQorI2RlZmluZSBWT1BfT1BFTih2cCwgY3IsIHJ2KQkJCQkJCVwKKwlydiA9IF9WT1BfKHZvcF9vcGVuLCB2cCkoKHZwKS0+dl9mYmh2LCBjcikKKyNkZWZpbmUgVk9QX0dFVEFUVFIodnAsIHZhcCwgZiwgY3IsIHJ2KQkJCQkJXAorCXJ2ID0gX1ZPUF8odm9wX2dldGF0dHIsIHZwKSgodnApLT52X2ZiaHYsIHZhcCwgZiwgY3IpCisjZGVmaW5lCVZPUF9TRVRBVFRSKHZwLCB2YXAsIGYsIGNyLCBydikJCQkJCVwKKwlydiA9IF9WT1BfKHZvcF9zZXRhdHRyLCB2cCkoKHZwKS0+dl9mYmh2LCB2YXAsIGYsIGNyKQorI2RlZmluZQlWT1BfQUNDRVNTKHZwLCBtb2RlLCBjciwgcnYpCQkJCQlcCisJcnYgPSBfVk9QXyh2b3BfYWNjZXNzLCB2cCkoKHZwKS0+dl9mYmh2LCBtb2RlLCBjcikKKyNkZWZpbmUJVk9QX0xPT0tVUCh2cCxkLHZwcCxmLHJkaXIsY3IscnYpCQkJCVwKKwlydiA9IF9WT1BfKHZvcF9sb29rdXAsIHZwKSgodnApLT52X2ZiaHYsZCx2cHAsZixyZGlyLGNyKQorI2RlZmluZSBWT1BfQ1JFQVRFKGR2cCxkLHZhcCx2cHAsY3IscnYpCQkJCQlcCisJcnYgPSBfVk9QXyh2b3BfY3JlYXRlLCBkdnApKChkdnApLT52X2ZiaHYsZCx2YXAsdnBwLGNyKQorI2RlZmluZSBWT1BfUkVNT1ZFKGR2cCxkLGNyLHJ2KQkJCQkJCVwKKwlydiA9IF9WT1BfKHZvcF9yZW1vdmUsIGR2cCkoKGR2cCktPnZfZmJodixkLGNyKQorI2RlZmluZQlWT1BfTElOSyh0ZHZwLGZ2cCxkLGNyLHJ2KQkJCQkJXAorCXJ2ID0gX1ZPUF8odm9wX2xpbmssIHRkdnApKCh0ZHZwKS0+dl9mYmh2LGZ2cCxkLGNyKQorI2RlZmluZQlWT1BfUkVOQU1FKGZ2cCxmbm0sdGR2cCx0bm0sY3IscnYpCQkJCVwKKwlydiA9IF9WT1BfKHZvcF9yZW5hbWUsIGZ2cCkoKGZ2cCktPnZfZmJodixmbm0sdGR2cCx0bm0sY3IpCisjZGVmaW5lCVZPUF9NS0RJUihkcCxkLHZhcCx2cHAsY3IscnYpCQkJCQlcCisJcnYgPSBfVk9QXyh2b3BfbWtkaXIsIGRwKSgoZHApLT52X2ZiaHYsZCx2YXAsdnBwLGNyKQorI2RlZmluZQlWT1BfUk1ESVIoZHAsZCxjcixydikJIAkJCQkJXAorCXJ2ID0gX1ZPUF8odm9wX3JtZGlyLCBkcCkoKGRwKS0+dl9mYmh2LGQsY3IpCisjZGVmaW5lCVZPUF9SRUFERElSKHZwLHVpb3AsY3IsZW9mcCxydikJCQkJCVwKKwlydiA9IF9WT1BfKHZvcF9yZWFkZGlyLCB2cCkoKHZwKS0+dl9mYmh2LHVpb3AsY3IsZW9mcCkKKyNkZWZpbmUJVk9QX1NZTUxJTksoZHZwLGQsdmFwLHRubSx2cHAsY3IscnYpCQkJCVwKKwlydiA9IF9WT1BfKHZvcF9zeW1saW5rLCBkdnApICgoZHZwKS0+dl9mYmh2LGQsdmFwLHRubSx2cHAsY3IpCisjZGVmaW5lCVZPUF9SRUFETElOSyh2cCx1aW9wLGZsLGNyLHJ2KQkJCQkJXAorCXJ2ID0gX1ZPUF8odm9wX3JlYWRsaW5rLCB2cCkoKHZwKS0+dl9mYmh2LHVpb3AsZmwsY3IpCisjZGVmaW5lCVZPUF9GU1lOQyh2cCxmLGNyLGIsZSxydikJCQkJCVwKKwlydiA9IF9WT1BfKHZvcF9mc3luYywgdnApKCh2cCktPnZfZmJodixmLGNyLGIsZSkKKyNkZWZpbmUgVk9QX0lOQUNUSVZFKHZwLCBjciwgcnYpCQkJCQlcCisJcnYgPSBfVk9QXyh2b3BfaW5hY3RpdmUsIHZwKSgodnApLT52X2ZiaHYsIGNyKQorI2RlZmluZSBWT1BfUkVMRUFTRSh2cCwgcnYpCQkJCQkJXAorCXJ2ID0gX1ZPUF8odm9wX3JlbGVhc2UsIHZwKSgodnApLT52X2ZiaHYpCisjZGVmaW5lIFZPUF9GSUQyKHZwLCBmaWRwLCBydikJCQkJCQlcCisJcnYgPSBfVk9QXyh2b3BfZmlkMiwgdnApKCh2cCktPnZfZmJodiwgZmlkcCkKKyNkZWZpbmUgVk9QX1JXTE9DSyh2cCxpKQkJCQkJCVwKKwkodm9pZClfVk9QXyh2b3Bfcndsb2NrLCB2cCkoKHZwKS0+dl9mYmh2LCBpKQorI2RlZmluZSBWT1BfUldMT0NLX1RSWSh2cCxpKQkJCQkJCVwKKwlfVk9QXyh2b3Bfcndsb2NrLCB2cCkoKHZwKS0+dl9mYmh2LCBpKQorI2RlZmluZSBWT1BfUldVTkxPQ0sodnAsaSkJCQkJCQlcCisJKHZvaWQpX1ZPUF8odm9wX3J3dW5sb2NrLCB2cCkoKHZwKS0+dl9mYmh2LCBpKQorI2RlZmluZSBWT1BfRlJMT0NLKHZwLGMsZmwsZmxhZ3Msb2Zmc2V0LGZyLHJ2KQkJCQlcCisJcnYgPSBfVk9QXyh2b3BfZnJsb2NrLCB2cCkoKHZwKS0+dl9mYmh2LGMsZmwsZmxhZ3Msb2Zmc2V0LGZyKQorI2RlZmluZSBWT1BfUkVDTEFJTSh2cCwgcnYpCQkJCQkJXAorCXJ2ID0gX1ZPUF8odm9wX3JlY2xhaW0sIHZwKSgodnApLT52X2ZiaHYpCisjZGVmaW5lIFZPUF9BVFRSX0dFVCh2cCwgbmFtZSwgdmFsLCB2YWxsZW5wLCBmbCwgY3JlZCwgcnYpCQlcCisJcnYgPSBfVk9QXyh2b3BfYXR0cl9nZXQsIHZwKSgodnApLT52X2ZiaHYsbmFtZSx2YWwsdmFsbGVucCxmbCxjcmVkKQorI2RlZmluZQlWT1BfQVRUUl9TRVQodnAsIG5hbWUsIHZhbCwgdmFsbGVuLCBmbCwgY3JlZCwgcnYpCQlcCisJcnYgPSBfVk9QXyh2b3BfYXR0cl9zZXQsIHZwKSgodnApLT52X2ZiaHYsbmFtZSx2YWwsdmFsbGVuLGZsLGNyZWQpCisjZGVmaW5lCVZPUF9BVFRSX1JFTU9WRSh2cCwgbmFtZSwgZmxhZ3MsIGNyZWQsIHJ2KQkJCVwKKwlydiA9IF9WT1BfKHZvcF9hdHRyX3JlbW92ZSwgdnApKCh2cCktPnZfZmJodixuYW1lLGZsYWdzLGNyZWQpCisjZGVmaW5lCVZPUF9BVFRSX0xJU1QodnAsIGJ1ZiwgYnVmbGVuLCBmbCwgY3Vyc29yLCBjcmVkLCBydikJCVwKKwlydiA9IF9WT1BfKHZvcF9hdHRyX2xpc3QsIHZwKSgodnApLT52X2ZiaHYsYnVmLGJ1ZmxlbixmbCxjdXJzb3IsY3JlZCkKKyNkZWZpbmUgVk9QX0xJTktfUkVNT1ZFRCh2cCwgZHZwLCBsaW5remVybykJCQkJXAorCSh2b2lkKV9WT1BfKHZvcF9saW5rX3JlbW92ZWQsIHZwKSgodnApLT52X2ZiaHYsIGR2cCwgbGlua3plcm8pCisjZGVmaW5lIFZPUF9WTk9ERV9DSEFOR0UodnAsIGNtZCwgdmFsKQkJCQkJXAorCSh2b2lkKV9WT1BfKHZvcF92bm9kZV9jaGFuZ2UsIHZwKSgodnApLT52X2ZiaHYsY21kLHZhbCkKKy8qCisgKiBUaGVzZSBhcmUgcGFnZSBjYWNoZSBmdW5jdGlvbnMgdGhhdCBub3cgZ28gdGhydSBWT1BzLgorICogJ2xhc3QnIHBhcmFtZXRlciBpcyB1bnVzZWQgYW5kIGxlZnQgaW4gZm9yIElSSVggY29tcGF0aWJpbGl0eQorICovCisjZGVmaW5lIFZPUF9UT1NTX1BBR0VTKHZwLCBmaXJzdCwgbGFzdCwgZmlvcHQpCQkJCVwKKwlfVk9QXyh2b3BfdG9zc3BhZ2VzLCB2cCkoKHZwKS0+dl9mYmh2LGZpcnN0LCBsYXN0LCBmaW9wdCkKKy8qCisgKiAnbGFzdCcgcGFyYW1ldGVyIGlzIHVudXNlZCBhbmQgbGVmdCBpbiBmb3IgSVJJWCBjb21wYXRpYmlsaXR5CisgKi8KKyNkZWZpbmUgVk9QX0ZMVVNISU5WQUxfUEFHRVModnAsIGZpcnN0LCBsYXN0LCBmaW9wdCkJCQlcCisJX1ZPUF8odm9wX2ZsdXNoaW52YWxfcGFnZXMsIHZwKSgodnApLT52X2ZiaHYsZmlyc3QsbGFzdCxmaW9wdCkKKy8qCisgKiAnbGFzdCcgcGFyYW1ldGVyIGlzIHVudXNlZCBhbmQgbGVmdCBpbiBmb3IgSVJJWCBjb21wYXRpYmlsaXR5CisgKi8KKyNkZWZpbmUgVk9QX0ZMVVNIX1BBR0VTKHZwLCBmaXJzdCwgbGFzdCwgZmxhZ3MsIGZpb3B0LCBydikJCVwKKwlydiA9IF9WT1BfKHZvcF9mbHVzaF9wYWdlcywgdnApKCh2cCktPnZfZmJodixmaXJzdCxsYXN0LGZsYWdzLGZpb3B0KQorI2RlZmluZSBWT1BfSU9DVEwodnAsIGlub2RlLCBmaWxwLCBmbCwgY21kLCBhcmcsIHJ2KQkJCVwKKwlydiA9IF9WT1BfKHZvcF9pb2N0bCwgdnApKCh2cCktPnZfZmJodixpbm9kZSxmaWxwLGZsLGNtZCxhcmcpCisjZGVmaW5lIFZPUF9JRkxVU0godnAsIGZsYWdzLCBydikJCQkJCVwKKwlydiA9IF9WT1BfKHZvcF9pZmx1c2gsIHZwKSgodnApLT52X2ZiaHYsIGZsYWdzKQorCisvKgorICogRmxhZ3MgZm9yIHJlYWQvd3JpdGUgY2FsbHMgLSBzYW1lIHZhbHVlcyBhcyBJUklYCisgKi8KKyNkZWZpbmUgSU9fSVNBSU8JMHgwMDAwMQkJLyogZG9uJ3Qgd2FpdCBmb3IgY29tcGxldGlvbiAqLworI2RlZmluZSBJT19JU0RJUkVDVAkweDAwMDA0CQkvKiBieXBhc3MgcGFnZSBjYWNoZSAqLworI2RlZmluZSBJT19JTlZJUwkweDAwMDIwCQkvKiBkb24ndCB1cGRhdGUgaW5vZGUgdGltZXN0YW1wcyAqLworCisvKgorICogRmxhZ3MgZm9yIFZPUF9JRkxVU0ggY2FsbAorICovCisjZGVmaW5lIEZMVVNIX1NZTkMJCTEJLyogd2FpdCBmb3IgZmx1c2ggdG8gY29tcGxldGUJKi8KKyNkZWZpbmUgRkxVU0hfSU5PREUJCTIJLyogZmx1c2ggdGhlIGlub2RlIGl0c2VsZgkqLworI2RlZmluZSBGTFVTSF9MT0cJCTQJLyogZm9yY2UgdGhlIGxhc3QgbG9nIGVudHJ5IGZvcgorCQkJCQkgKiB0aGlzIGlub2RlIG91dCB0byBkaXNrCSovCisKKy8qCisgKiBGbHVzaC9JbnZhbGlkYXRlIG9wdGlvbnMgZm9yIFZPUF9UT1NTX1BBR0VTLCBWT1BfRkxVU0hJTlZBTF9QQUdFUyBhbmQKKyAqCVZPUF9GTFVTSF9QQUdFUy4KKyAqLworI2RlZmluZSBGSV9OT05FCQkJMAkvKiBub25lICovCisjZGVmaW5lIEZJX1JFTUFQRgkJMQkvKiBEbyBhIHJlbWFwZiBwcmlvciB0byB0aGUgb3BlcmF0aW9uICovCisjZGVmaW5lIEZJX1JFTUFQRl9MT0NLRUQJMgkvKiBEbyBhIHJlbWFwZiBwcmlvciB0byB0aGUgb3BlcmF0aW9uLgorCQkJCQkgICBQcmV2ZW50IFZNIGFjY2VzcyB0byB0aGUgcGFnZXMgdW50aWwKKwkJCQkJICAgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZXMuICovCisKKy8qCisgKiBWbm9kZSBhdHRyaWJ1dGVzLiAgdmFfbWFzayBpbmRpY2F0ZXMgdGhvc2UgYXR0cmlidXRlcyB0aGUgY2FsbGVyCisgKiB3YW50cyB0byBzZXQgb3IgZXh0cmFjdC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgdmF0dHIgeworCWludAkJdmFfbWFzazsJLyogYml0LW1hc2sgb2YgYXR0cmlidXRlcyBwcmVzZW50ICovCisJZW51bSB2dHlwZQl2YV90eXBlOwkvKiB2bm9kZSB0eXBlIChmb3IgY3JlYXRlKSAqLworCW1vZGVfdAkJdmFfbW9kZTsJLyogZmlsZSBhY2Nlc3MgbW9kZSBhbmQgdHlwZSAqLworCW5saW5rX3QJCXZhX25saW5rOwkvKiBudW1iZXIgb2YgcmVmZXJlbmNlcyB0byBmaWxlICovCisJdWlkX3QJCXZhX3VpZDsJCS8qIG93bmVyIHVzZXIgaWQgKi8KKwlnaWRfdAkJdmFfZ2lkOwkJLyogb3duZXIgZ3JvdXAgaWQgKi8KKwl4ZnNfaW5vX3QJdmFfbm9kZWlkOwkvKiBmaWxlIGlkICovCisJeGZzX29mZl90CXZhX3NpemU7CS8qIGZpbGUgc2l6ZSBpbiBieXRlcyAqLworCXVfbG9uZwkJdmFfYmxvY2tzaXplOwkvKiBibG9ja3NpemUgcHJlZmVycmVkIGZvciBpL28gKi8KKwlzdHJ1Y3QgdGltZXNwZWMJdmFfYXRpbWU7CS8qIHRpbWUgb2YgbGFzdCBhY2Nlc3MgKi8KKwlzdHJ1Y3QgdGltZXNwZWMJdmFfbXRpbWU7CS8qIHRpbWUgb2YgbGFzdCBtb2RpZmljYXRpb24gKi8KKwlzdHJ1Y3QgdGltZXNwZWMJdmFfY3RpbWU7CS8qIHRpbWUgZmlsZSBjaGFuZ2VkICovCisJdV9pbnQJCXZhX2dlbjsJCS8qIGdlbmVyYXRpb24gbnVtYmVyIG9mIGZpbGUgKi8KKwl4ZnNfZGV2X3QJdmFfcmRldjsJLyogZGV2aWNlIHRoZSBzcGVjaWFsIGZpbGUgcmVwcmVzZW50cyAqLworCV9faW50NjRfdAl2YV9uYmxvY2tzOwkvKiBudW1iZXIgb2YgYmxvY2tzIGFsbG9jYXRlZCAqLworCXVfbG9uZwkJdmFfeGZsYWdzOwkvKiByYW5kb20gZXh0ZW5kZWQgZmlsZSBmbGFncyAqLworCXVfbG9uZwkJdmFfZXh0c2l6ZTsJLyogZmlsZSBleHRlbnQgc2l6ZSAqLworCXVfbG9uZwkJdmFfbmV4dGVudHM7CS8qIG51bWJlciBvZiBleHRlbnRzIGluIGZpbGUgKi8KKwl1X2xvbmcJCXZhX2FuZXh0ZW50czsJLyogbnVtYmVyIG9mIGF0dHIgZXh0ZW50cyBpbiBmaWxlICovCisJaW50CQl2YV9wcm9qaWQ7CS8qIHByb2plY3QgaWQgKi8KK30gdmF0dHJfdDsKKworLyoKKyAqIHNldGF0dHIgb3IgZ2V0YXR0ciBhdHRyaWJ1dGVzCisgKi8KKyNkZWZpbmUgWEZTX0FUX1RZUEUJCTB4MDAwMDAwMDEKKyNkZWZpbmUgWEZTX0FUX01PREUJCTB4MDAwMDAwMDIKKyNkZWZpbmUgWEZTX0FUX1VJRAkJMHgwMDAwMDAwNAorI2RlZmluZSBYRlNfQVRfR0lECQkweDAwMDAwMDA4CisjZGVmaW5lIFhGU19BVF9GU0lECQkweDAwMDAwMDEwCisjZGVmaW5lIFhGU19BVF9OT0RFSUQJCTB4MDAwMDAwMjAKKyNkZWZpbmUgWEZTX0FUX05MSU5LCQkweDAwMDAwMDQwCisjZGVmaW5lIFhGU19BVF9TSVpFCQkweDAwMDAwMDgwCisjZGVmaW5lIFhGU19BVF9BVElNRQkJMHgwMDAwMDEwMAorI2RlZmluZSBYRlNfQVRfTVRJTUUJCTB4MDAwMDAyMDAKKyNkZWZpbmUgWEZTX0FUX0NUSU1FCQkweDAwMDAwNDAwCisjZGVmaW5lIFhGU19BVF9SREVWCQkweDAwMDAwODAwCisjZGVmaW5lIFhGU19BVF9CTEtTSVpFCQkweDAwMDAxMDAwCisjZGVmaW5lIFhGU19BVF9OQkxPQ0tTCQkweDAwMDAyMDAwCisjZGVmaW5lIFhGU19BVF9WQ09ERQkJMHgwMDAwNDAwMAorI2RlZmluZSBYRlNfQVRfTUFDCQkweDAwMDA4MDAwCisjZGVmaW5lIFhGU19BVF9VUERBVElNRQkJMHgwMDAxMDAwMAorI2RlZmluZSBYRlNfQVRfVVBETVRJTUUJCTB4MDAwMjAwMDAKKyNkZWZpbmUgWEZTX0FUX1VQRENUSU1FCQkweDAwMDQwMDAwCisjZGVmaW5lIFhGU19BVF9BQ0wJCTB4MDAwODAwMDAKKyNkZWZpbmUgWEZTX0FUX0NBUAkJMHgwMDEwMDAwMAorI2RlZmluZSBYRlNfQVRfSU5GCQkweDAwMjAwMDAwCisjZGVmaW5lIFhGU19BVF9YRkxBR1MJCTB4MDA0MDAwMDAKKyNkZWZpbmUgWEZTX0FUX0VYVFNJWkUJCTB4MDA4MDAwMDAKKyNkZWZpbmUgWEZTX0FUX05FWFRFTlRTCQkweDAxMDAwMDAwCisjZGVmaW5lIFhGU19BVF9BTkVYVEVOVFMJMHgwMjAwMDAwMAorI2RlZmluZSBYRlNfQVRfUFJPSklECQkweDA0MDAwMDAwCisjZGVmaW5lIFhGU19BVF9TSVpFX05PUEVSTQkweDA4MDAwMDAwCisjZGVmaW5lIFhGU19BVF9HRU5DT1VOVAkJMHgxMDAwMDAwMAorCisjZGVmaW5lIFhGU19BVF9BTEwJKFhGU19BVF9UWVBFfFhGU19BVF9NT0RFfFhGU19BVF9VSUR8WEZTX0FUX0dJRHxcCisJCVhGU19BVF9GU0lEfFhGU19BVF9OT0RFSUR8WEZTX0FUX05MSU5LfFhGU19BVF9TSVpFfFwKKwkJWEZTX0FUX0FUSU1FfFhGU19BVF9NVElNRXxYRlNfQVRfQ1RJTUV8WEZTX0FUX1JERVZ8XAorCQlYRlNfQVRfQkxLU0laRXxYRlNfQVRfTkJMT0NLU3xYRlNfQVRfVkNPREV8WEZTX0FUX01BQ3xcCisJCVhGU19BVF9BQ0x8WEZTX0FUX0NBUHxYRlNfQVRfSU5GfFhGU19BVF9YRkxBR1N8WEZTX0FUX0VYVFNJWkV8XAorCQlYRlNfQVRfTkVYVEVOVFN8WEZTX0FUX0FORVhURU5UU3xYRlNfQVRfUFJPSklEfFhGU19BVF9HRU5DT1VOVCkKKworI2RlZmluZSBYRlNfQVRfU1RBVAkoWEZTX0FUX1RZUEV8WEZTX0FUX01PREV8WEZTX0FUX1VJRHxYRlNfQVRfR0lEfFwKKwkJWEZTX0FUX0ZTSUR8WEZTX0FUX05PREVJRHxYRlNfQVRfTkxJTkt8WEZTX0FUX1NJWkV8XAorCQlYRlNfQVRfQVRJTUV8WEZTX0FUX01USU1FfFhGU19BVF9DVElNRXxYRlNfQVRfUkRFVnxcCisJCVhGU19BVF9CTEtTSVpFfFhGU19BVF9OQkxPQ0tTfFhGU19BVF9QUk9KSUQpCisKKyNkZWZpbmUgWEZTX0FUX1RJTUVTCShYRlNfQVRfQVRJTUV8WEZTX0FUX01USU1FfFhGU19BVF9DVElNRSkKKworI2RlZmluZSBYRlNfQVRfVVBEVElNRVMJKFhGU19BVF9VUERBVElNRXxYRlNfQVRfVVBETVRJTUV8WEZTX0FUX1VQRENUSU1FKQorCisjZGVmaW5lIFhGU19BVF9OT1NFVAkoWEZTX0FUX05MSU5LfFhGU19BVF9SREVWfFhGU19BVF9GU0lEfFhGU19BVF9OT0RFSUR8XAorCQlYRlNfQVRfVFlQRXxYRlNfQVRfQkxLU0laRXxYRlNfQVRfTkJMT0NLU3xYRlNfQVRfVkNPREV8XAorCQlYRlNfQVRfTkVYVEVOVFN8WEZTX0FUX0FORVhURU5UU3xYRlNfQVRfR0VOQ09VTlQpCisKKy8qCisgKiAgTW9kZXMuCisgKi8KKyNkZWZpbmUgVlNVSUQJU19JU1VJRAkJLyogc2V0IHVzZXIgaWQgb24gZXhlY3V0aW9uICovCisjZGVmaW5lIFZTR0lECVNfSVNHSUQJCS8qIHNldCBncm91cCBpZCBvbiBleGVjdXRpb24gKi8KKyNkZWZpbmUgVlNWVFgJU19JU1ZUWAkJLyogc2F2ZSBzd2FwcGVkIHRleHQgZXZlbiBhZnRlciB1c2UgKi8KKyNkZWZpbmUgVlJFQUQJU19JUlVTUgkJLyogcmVhZCwgd3JpdGUsIGV4ZWN1dGUgcGVybWlzc2lvbnMgKi8KKyNkZWZpbmUgVldSSVRFCVNfSVdVU1IKKyNkZWZpbmUgVkVYRUMJU19JWFVTUgorCisjZGVmaW5lIE1PREVNQVNLIFNfSUFMTFVHTwkvKiBtb2RlIGJpdHMgcGx1cyBwZXJtaXNzaW9uIGJpdHMgKi8KKworLyoKKyAqIENoZWNrIHdoZXRoZXIgbWFuZGF0b3J5IGZpbGUgbG9ja2luZyBpcyBlbmFibGVkLgorICovCisjZGVmaW5lIE1BTkRMT0NLKHZwLCBtb2RlKQlcCisJKCh2cCktPnZfdHlwZSA9PSBWUkVHICYmICgobW9kZSkgJiAoVlNHSUR8KFZFWEVDPj4zKSkpID09IFZTR0lEKQorCitleHRlcm4gdm9pZAl2bl9pbml0KHZvaWQpOworZXh0ZXJuIGludAl2bl93YWl0KHN0cnVjdCB2bm9kZSAqKTsKK2V4dGVybiB2bm9kZV90CSp2bl9pbml0aWFsaXplKHN0cnVjdCBpbm9kZSAqKTsKKworLyoKKyAqIEFjcXVpcmluZyBhbmQgaW52YWxpZGF0aW5nIHZub2RlczoKKyAqCisgKglpZiAodm5fZ2V0KHZwLCB2ZXJzaW9uLCAwKSkKKyAqCQkuLi47CisgKgl2bl9wdXJnZSh2cCwgdmVyc2lvbik7CisgKgorICogdm5fZ2V0IGFuZCB2bl9wdXJnZSBtdXN0IGJlIGNhbGxlZCB3aXRoIHZtYXBfdCBhcmd1bWVudHMsIHNhbXBsZWQKKyAqIHdoaWxlIGEgbG9jayB0aGF0IHRoZSB2bm9kZSdzIFZPUF9SRUNMQUlNIGZ1bmN0aW9uIGFjcXVpcmVzIGlzCisgKiBoZWxkLCB0byBlbnN1cmUgdGhhdCB0aGUgdm5vZGUgc2FtcGxlZCB3aXRoIHRoZSBsb2NrIGhlbGQgaXNuJ3QKKyAqIHJlY3ljbGVkIChWT1BfUkVDTEFJTWVkKSBvciBkZWFsbG9jYXRlZCBiZXR3ZWVuIHRoZSByZWxlYXNlIG9mIHRoZSBsb2NrCisgKiBhbmQgdGhlIHN1YnNlcXVlbnQgdm5fZ2V0IG9yIHZuX3B1cmdlLgorICovCisKKy8qCisgKiB2bm9kZV9tYXAgc3RydWN0dXJlcyBfbXVzdF8gbWF0Y2ggdm5fZXBvY2ggYW5kIHZub2RlIHN0cnVjdHVyZSBzaXplcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3Qgdm5vZGVfbWFwIHsKKwl2ZnNfdAkJKnZfdmZzcDsKKwl2bnVtYmVyX3QJdl9udW1iZXI7CQkvKiBpbi1jb3JlIHZub2RlIG51bWJlciAqLworCXhmc19pbm9fdAl2X2lubzsJCQkvKiBpbm9kZSAjCSovCit9IHZtYXBfdDsKKworI2RlZmluZSBWTUFQKHZwLCB2bWFwKQl7KHZtYXApLnZfdmZzcAkgPSAodnApLT52X3Zmc3AsCVwKKwkJCSAodm1hcCkudl9udW1iZXIgPSAodnApLT52X251bWJlciwJXAorCQkJICh2bWFwKS52X2lubwkgPSAodnApLT52X2lub2RlLmlfaW5vOyB9CisKK2V4dGVybiB2b2lkCXZuX3B1cmdlKHN0cnVjdCB2bm9kZSAqLCB2bWFwX3QgKik7CitleHRlcm4gdm5vZGVfdAkqdm5fZ2V0KHN0cnVjdCB2bm9kZSAqLCB2bWFwX3QgKik7CitleHRlcm4gaW50CXZuX3JldmFsaWRhdGUoc3RydWN0IHZub2RlICopOworZXh0ZXJuIHZvaWQJdm5fcmV2YWxpZGF0ZV9jb3JlKHN0cnVjdCB2bm9kZSAqLCB2YXR0cl90ICopOworZXh0ZXJuIHZvaWQJdm5fcmVtb3ZlKHN0cnVjdCB2bm9kZSAqKTsKKworc3RhdGljIGlubGluZSBpbnQgdm5fY291bnQoc3RydWN0IHZub2RlICp2cCkKK3sKKwlyZXR1cm4gYXRvbWljX3JlYWQoJkxJTlZGU19HRVRfSVAodnApLT5pX2NvdW50KTsKK30KKworLyoKKyAqIFZub2RlIHJlZmVyZW5jZSBjb3VudGluZyBmdW5jdGlvbnMgKGFuZCBtYWNyb3MgZm9yIGNvbXBhdGliaWxpdHkpLgorICovCitleHRlcm4gdm5vZGVfdAkqdm5faG9sZChzdHJ1Y3Qgdm5vZGUgKik7CitleHRlcm4gdm9pZAl2bl9yZWxlKHN0cnVjdCB2bm9kZSAqKTsKKworI2lmIGRlZmluZWQoWEZTX1ZOT0RFX1RSQUNFKQorI2RlZmluZSBWTl9IT0xEKHZwKQkJXAorCSgodm9pZCl2bl9ob2xkKHZwKSwJXAorCSAgdm5fdHJhY2VfaG9sZCh2cCwgX19GSUxFX18sIF9fTElORV9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcykpCisjZGVmaW5lIFZOX1JFTEUodnApCQlcCisJICAodm5fdHJhY2VfcmVsZSh2cCwgX19GSUxFX18sIF9fTElORV9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyksIFwKKwkgICBpcHV0KExJTlZGU19HRVRfSVAodnApKSkKKyNlbHNlCisjZGVmaW5lIFZOX0hPTEQodnApCQkoKHZvaWQpdm5faG9sZCh2cCkpCisjZGVmaW5lIFZOX1JFTEUodnApCQkoaXB1dChMSU5WRlNfR0VUX0lQKHZwKSkpCisjZW5kaWYKKworLyoKKyAqIFZuYW1lIGhhbmRsaW5nIG1hY3Jvcy4KKyAqLworI2RlZmluZSBWTkFNRShkZW50cnkpCQkoKGNoYXIgKikgKGRlbnRyeSktPmRfbmFtZS5uYW1lKQorI2RlZmluZSBWTkFNRUxFTihkZW50cnkpCSgoZGVudHJ5KS0+ZF9uYW1lLmxlbikKKyNkZWZpbmUgVk5BTUVfVE9fVk5PREUoZGVudHJ5KQkoTElOVkZTX0dFVF9WUCgoZGVudHJ5KS0+ZF9pbm9kZSkpCisKKy8qCisgKiBWbm9kZSBzcGlubG9jayBtYW5pcHVsYXRpb24uCisgKi8KKyNkZWZpbmUgVk5fTE9DSyh2cCkJCW11dGV4X3NwaW5sb2NrKCYodnApLT52X2xvY2spCisjZGVmaW5lIFZOX1VOTE9DSyh2cCwgcykJbXV0ZXhfc3BpbnVubG9jaygmKHZwKS0+dl9sb2NrLCBzKQorI2RlZmluZSBWTl9GTEFHU0VUKHZwLGIpCXZuX2ZsYWdzZXQodnAsYikKKyNkZWZpbmUgVk5fRkxBR0NMUih2cCxiKQl2bl9mbGFnY2xyKHZwLGIpCisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgdm5fZmxhZ3NldChzdHJ1Y3Qgdm5vZGUgKnZwLCB1aW50IGZsYWcpCit7CisJc3Bpbl9sb2NrKCZ2cC0+dl9sb2NrKTsKKwl2cC0+dl9mbGFnIHw9IGZsYWc7CisJc3Bpbl91bmxvY2soJnZwLT52X2xvY2spOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIHZuX2ZsYWdjbHIoc3RydWN0IHZub2RlICp2cCwgdWludCBmbGFnKQoreworCXNwaW5fbG9jaygmdnAtPnZfbG9jayk7CisJdnAtPnZfZmxhZyAmPSB+ZmxhZzsKKwlzcGluX3VubG9jaygmdnAtPnZfbG9jayk7Cit9CisKKy8qCisgKiBVcGRhdGUgbW9kaWZ5L2FjY2Vzcy9jaGFuZ2UgdGltZXMgb24gdGhlIHZub2RlCisgKi8KKyNkZWZpbmUgVk5fTVRJTUVTRVQodnAsIHR2cCkJKExJTlZGU19HRVRfSVAodnApLT5pX210aW1lID0gKih0dnApKQorI2RlZmluZSBWTl9BVElNRVNFVCh2cCwgdHZwKQkoTElOVkZTX0dFVF9JUCh2cCktPmlfYXRpbWUgPSAqKHR2cCkpCisjZGVmaW5lIFZOX0NUSU1FU0VUKHZwLCB0dnApCShMSU5WRlNfR0VUX0lQKHZwKS0+aV9jdGltZSA9ICoodHZwKSkKKworLyoKKyAqIERlYWxpbmcgd2l0aCBiYWQgaW5vZGVzCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB2bl9tYXJrX2JhZChzdHJ1Y3Qgdm5vZGUgKnZwKQoreworCW1ha2VfYmFkX2lub2RlKExJTlZGU19HRVRfSVAodnApKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgVk5fQkFEKHN0cnVjdCB2bm9kZSAqdnApCit7CisJcmV0dXJuIGlzX2JhZF9pbm9kZShMSU5WRlNfR0VUX0lQKHZwKSk7Cit9CisKKy8qCisgKiBTb21lIHVzZWZ1bCBwcmVkaWNhdGVzLgorICovCisjZGVmaW5lIFZOX01BUFBFRCh2cCkJbWFwcGluZ19tYXBwZWQoTElOVkZTX0dFVF9JUCh2cCktPmlfbWFwcGluZykKKyNkZWZpbmUgVk5fQ0FDSEVEKHZwKQkoTElOVkZTX0dFVF9JUCh2cCktPmlfbWFwcGluZy0+bnJwYWdlcykKKyNkZWZpbmUgVk5fRElSVFkodnApCW1hcHBpbmdfdGFnZ2VkKExJTlZGU19HRVRfSVAodnApLT5pX21hcHBpbmcsIFwKKwkJCQkJUEFHRUNBQ0hFX1RBR19ESVJUWSkKKyNkZWZpbmUgVk1PRElGWSh2cCkJVk5fRkxBR1NFVCh2cCwgVk1PRElGSUVEKQorI2RlZmluZSBWVU5NT0RJRlkodnApCVZOX0ZMQUdDTFIodnAsIFZNT0RJRklFRCkKKworLyoKKyAqIEZsYWdzIHRvIFZPUF9TRVRBVFRSL1ZPUF9HRVRBVFRSLgorICovCisjZGVmaW5lCUFUVFJfVVRJTUUJMHgwMQkvKiBub24tZGVmYXVsdCB1dGltZSgyKSByZXF1ZXN0ICovCisjZGVmaW5lCUFUVFJfRE1JCTB4MDgJLyogaW52b2NhdGlvbiBmcm9tIGEgRE1JIGZ1bmN0aW9uICovCisjZGVmaW5lCUFUVFJfTEFaWQkweDgwCS8qIHNldC9nZXQgYXR0cmlidXRlcyBsYXppbHkgKi8KKyNkZWZpbmUJQVRUUl9OT05CTE9DSwkweDEwMAkvKiByZXR1cm4gRUFHQUlOIGlmIG9wZXJhdGlvbiB3b3VsZCBibG9jayAqLworCisvKgorICogRmxhZ3MgdG8gVk9QX0ZTWU5DIGFuZCBWT1BfUkVDTEFJTS4KKyAqLworI2RlZmluZSBGU1lOQ19OT1dBSVQJMAkvKiBhc3luY2hyb25vdXMgZmx1c2ggKi8KKyNkZWZpbmUgRlNZTkNfV0FJVAkweDEJLyogc3luY2hyb25vdXMgZnN5bmMgb3IgZm9yY2VkIHJlY2xhaW0gKi8KKyNkZWZpbmUgRlNZTkNfSU5WQUwJMHgyCS8qIGZsdXNoIGFuZCBpbnZhbGlkYXRlIGNhY2hlZCBkYXRhICovCisjZGVmaW5lIEZTWU5DX0RBVEEJMHg0CS8qIHN5bmNocm9ub3VzIGZzeW5jIG9mIGRhdGEgb25seSAqLworCisvKgorICogVHJhY2tpbmcgdm5vZGUgYWN0aXZpdHkuCisgKi8KKyNpZiBkZWZpbmVkKFhGU19WTk9ERV9UUkFDRSkKKworI2RlZmluZQlWTk9ERV9UUkFDRV9TSVpFCTE2CQkvKiBudW1iZXIgb2YgdHJhY2UgZW50cmllcyAqLworI2RlZmluZQlWTk9ERV9LVFJBQ0VfRU5UUlkJMQorI2RlZmluZQlWTk9ERV9LVFJBQ0VfRVhJVAkyCisjZGVmaW5lCVZOT0RFX0tUUkFDRV9IT0xECTMKKyNkZWZpbmUJVk5PREVfS1RSQUNFX1JFRgk0CisjZGVmaW5lCVZOT0RFX0tUUkFDRV9SRUxFCTUKKworZXh0ZXJuIHZvaWQgdm5fdHJhY2VfZW50cnkoc3RydWN0IHZub2RlICosIGNoYXIgKiwgaW5zdF90ICopOworZXh0ZXJuIHZvaWQgdm5fdHJhY2VfZXhpdChzdHJ1Y3Qgdm5vZGUgKiwgY2hhciAqLCBpbnN0X3QgKik7CitleHRlcm4gdm9pZCB2bl90cmFjZV9ob2xkKHN0cnVjdCB2bm9kZSAqLCBjaGFyICosIGludCwgaW5zdF90ICopOworZXh0ZXJuIHZvaWQgdm5fdHJhY2VfcmVmKHN0cnVjdCB2bm9kZSAqLCBjaGFyICosIGludCwgaW5zdF90ICopOworZXh0ZXJuIHZvaWQgdm5fdHJhY2VfcmVsZShzdHJ1Y3Qgdm5vZGUgKiwgY2hhciAqLCBpbnQsIGluc3RfdCAqKTsKKworI2RlZmluZQlWTl9UUkFDRSh2cCkJCVwKKwl2bl90cmFjZV9yZWYodnAsIF9fRklMRV9fLCBfX0xJTkVfXywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpCisjZWxzZQorI2RlZmluZQl2bl90cmFjZV9lbnRyeShhLGIsYykKKyNkZWZpbmUJdm5fdHJhY2VfZXhpdChhLGIsYykKKyNkZWZpbmUJdm5fdHJhY2VfaG9sZChhLGIsYyxkKQorI2RlZmluZQl2bl90cmFjZV9yZWYoYSxiLGMsZCkKKyNkZWZpbmUJdm5fdHJhY2VfcmVsZShhLGIsYyxkKQorI2RlZmluZQlWTl9UUkFDRSh2cCkKKyNlbmRpZgorCisjZW5kaWYJLyogX19YRlNfVk5PREVfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvcXVvdGEveGZzX2RxdW90LmMgYi9mcy94ZnMvcXVvdGEveGZzX2RxdW90LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQwZDIwZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3QuYwpAQCAtMCwwICsxLDE2NDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuCSBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKyNpbmNsdWRlICJ4ZnNfZnMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfcXVvdGEuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2JtYXAuaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCisjaW5jbHVkZSAieGZzX3J0YWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKKyNpbmNsdWRlICJ4ZnNfaXRhYmxlLmgiCisjaW5jbHVkZSAieGZzX3J3LmgiCisjaW5jbHVkZSAieGZzX2FjbC5oIgorI2luY2x1ZGUgInhmc19jYXAuaCIKKyNpbmNsdWRlICJ4ZnNfbWFjLmgiCisjaW5jbHVkZSAieGZzX2F0dHIuaCIKKyNpbmNsdWRlICJ4ZnNfYnVmX2l0ZW0uaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnNfc3BhY2UuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnNfcHJpdi5oIgorCisjaW5jbHVkZSAieGZzX3FtLmgiCisKKworLyoKKyAgIExPQ0sgT1JERVIKKworICAgaW5vZGUgbG9jawkJICAgIChpbG9jaykKKyAgIGRxdW90IGhhc2gtY2hhaW4gbG9jayAgICAoaGFzaGxvY2spCisgICB4cW0gZHF1b3QgZnJlZWxpc3QgbG9jayAgKGZyZWVsaXN0bG9jaworICAgbW91bnQncyBkcXVvdCBsaXN0IGxvY2sgIChtcGxpc3Rsb2NrKQorICAgdXNlciBkcXVvdCBsb2NrIC0gbG9jayBvcmRlcmluZyBhbW9uZyBkcXVvdHMgaXMgYmFzZWQgb24gdGhlIHVpZCBvciBnaWQKKyAgIGdyb3VwIGRxdW90IGxvY2sgLSBzaW1pbGFyIHRvIHVkcXVvdHMuIEJldHdlZW4gdGhlIHR3byBkcXVvdHMsIHRoZSB1ZHF1b3QKKwkJICAgICAgaGFzIHRvIGJlIGxvY2tlZCBmaXJzdC4KKyAgIHBpbiBsb2NrIC0gdGhlIGRxdW90IGxvY2sgbXVzdCBiZSBoZWxkIHRvIHRha2UgdGhpcyBsb2NrLgorICAgZmx1c2ggbG9jayAtIGRpdHRvLgorKi8KKworU1RBVElDIHZvaWQJCXhmc19xbV9kcWZsdXNoX2RvbmUoeGZzX2J1Zl90ICosIHhmc19kcV9sb2dpdGVtX3QgKik7CisKKyNpZmRlZiBERUJVRworeGZzX2J1ZnRhcmdfdCAqeGZzX2RxZXJyb3JfdGFyZ2V0OworaW50IHhmc19kb19kcWVycm9yOworaW50IHhmc19kcXJlcV9udW07CitpbnQgeGZzX2RxZXJyb3JfbW9kID0gMzM7CisjZW5kaWYKKworLyoKKyAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgZHF1b3QuIFdlIGRvbid0IGFsd2F5cyBhbGxvY2F0ZSBmcmVzaCBtZW1vcnk7CisgKiB3ZSB0cnkgdG8gcmVjbGFpbSBhIGZyZWUgZHF1b3QgaWYgdGhlIG51bWJlciBvZiBpbmNvcmUgZHF1b3RzIGFyZSBhYm92ZQorICogYSB0aHJlc2hvbGQuCisgKiBUaGUgb25seSBmaWVsZCBpbnNpZGUgdGhlIGNvcmUgdGhhdCBnZXRzIGluaXRpYWxpemVkIGF0IHRoaXMgcG9pbnQKKyAqIGlzIHRoZSBkX2lkIGZpZWxkLiBUaGUgaWRlYSBpcyB0byBmaWxsIGluIHRoZSBlbnRpcmUgcV9jb3JlCisgKiB3aGVuIHdlIHJlYWQgaW4gdGhlIG9uIGRpc2sgZHF1b3QuCisgKi8KK3hmc19kcXVvdF90ICoKK3hmc19xbV9kcWluaXQoCisJeGZzX21vdW50X3QgICptcCwKKwl4ZnNfZHFpZF90ICAgaWQsCisJdWludAkgICAgIHR5cGUpCit7CisJeGZzX2RxdW90X3QJKmRxcDsKKwlib29sZWFuX3QJYnJhbmRuZXdkcXVvdDsKKworCWJyYW5kbmV3ZHF1b3QgPSB4ZnNfcW1fZHFhbGxvY19pbmNvcmUoJmRxcCk7CisJZHFwLT5kcV9mbGFncyA9IHR5cGU7CisJSU5UX1NFVChkcXAtPnFfY29yZS5kX2lkLCBBUkNIX0NPTlZFUlQsIGlkKTsKKwlkcXAtPnFfbW91bnQgPSBtcDsKKworCS8qCisJICogTm8gbmVlZCB0byByZS1pbml0aWFsaXplIHRoZXNlIGlmIHRoaXMgaXMgYSByZWNsYWltZWQgZHF1b3QuCisJICovCisJaWYgKGJyYW5kbmV3ZHF1b3QpIHsKKwkJZHFwLT5kcV9mbG5leHQgPSBkcXAtPmRxX2ZscHJldiA9IGRxcDsKKwkJbXV0ZXhfaW5pdCgmZHFwLT5xX3Fsb2NrLCAgTVVURVhfREVGQVVMVCwgInhkcSIpOworCQlpbml0bnNlbWEoJmRxcC0+cV9mbG9jaywgMSwgImZkcSIpOworCQlzdl9pbml0KCZkcXAtPnFfcGlud2FpdCwgU1ZfREVGQVVMVCwgInBkcSIpOworCisjaWZkZWYgWEZTX0RRVU9UX1RSQUNFCisJCWRxcC0+cV90cmFjZSA9IGt0cmFjZV9hbGxvYyhEUVVPVF9UUkFDRV9TSVpFLCBLTV9TTEVFUCk7CisJCXhmc19kcXRyYWNlX2VudHJ5KGRxcCwgIkRRSU5JVCIpOworI2VuZGlmCisJfSBlbHNlIHsKKwkJLyoKKwkJICogT25seSB0aGUgcV9jb3JlIHBvcnRpb24gd2FzIHplcm9lZCBpbiBkcXJlY2xhaW1fb25lKCkuCisJCSAqIFNvLCB3ZSBuZWVkIHRvIHJlc2V0IG90aGVycy4KKwkJICovCisJCSBkcXAtPnFfbnJlZnMgPSAwOworCQkgZHFwLT5xX2Jsa25vID0gMDsKKwkJIGRxcC0+TVBMX05FWFQgPSBkcXAtPkhMX05FWFQgPSBOVUxMOworCQkgZHFwLT5ITF9QUkVWUCA9IGRxcC0+TVBMX1BSRVZQID0gTlVMTDsKKwkJIGRxcC0+cV9idWZvZmZzZXQgPSAwOworCQkgZHFwLT5xX2ZpbGVvZmZzZXQgPSAwOworCQkgZHFwLT5xX3RyYW5zcCA9IE5VTEw7CisJCSBkcXAtPnFfZ2RxdW90ID0gTlVMTDsKKwkJIGRxcC0+cV9yZXNfYmNvdW50ID0gMDsKKwkJIGRxcC0+cV9yZXNfaWNvdW50ID0gMDsKKwkJIGRxcC0+cV9yZXNfcnRiY291bnQgPSAwOworCQkgZHFwLT5xX3BpbmNvdW50ID0gMDsKKwkJIGRxcC0+cV9oYXNoID0gTlVMTDsKKwkJIEFTU0VSVChkcXAtPmRxX2ZsbmV4dCA9PSBkcXAtPmRxX2ZscHJldik7CisKKyNpZmRlZiBYRlNfRFFVT1RfVFJBQ0UKKwkJIEFTU0VSVChkcXAtPnFfdHJhY2UpOworCQkgeGZzX2RxdHJhY2VfZW50cnkoZHFwLCAiRFFSRUNMQUlNRURfSU5JVCIpOworI2VuZGlmCisJIH0KKworCS8qCisJICogbG9nIGl0ZW0gZ2V0cyBpbml0aWFsaXplZCBsYXRlcgorCSAqLworCXJldHVybiAoZHFwKTsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHRvIGZyZWUgYWxsIHRoZSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIGEgZHF1b3QKKyAqLwordm9pZAoreGZzX3FtX2RxZGVzdHJveSgKKwl4ZnNfZHF1b3RfdAkqZHFwKQoreworCUFTU0VSVCghIFhGU19EUV9JU19PTl9GUkVFTElTVChkcXApKTsKKworCW11dGV4X2Rlc3Ryb3koJmRxcC0+cV9xbG9jayk7CisJZnJlZXNlbWEoJmRxcC0+cV9mbG9jayk7CisJc3ZfZGVzdHJveSgmZHFwLT5xX3BpbndhaXQpOworCisjaWZkZWYgWEZTX0RRVU9UX1RSQUNFCisJaWYgKGRxcC0+cV90cmFjZSkKKwkgICAgIGt0cmFjZV9mcmVlKGRxcC0+cV90cmFjZSk7CisJZHFwLT5xX3RyYWNlID0gTlVMTDsKKyNlbmRpZgorCWttZW1fem9uZV9mcmVlKHhmc19HcW0tPnFtX2Rxem9uZSwgZHFwKTsKKwlhdG9taWNfZGVjKCZ4ZnNfR3FtLT5xbV90b3RhbGRxdW90cyk7Cit9CisKKy8qCisgKiBUaGlzIGlzIHdoYXQgYSAnZnJlc2gnIGRxdW90IGluc2lkZSBhIGRxdW90IGNodW5rIGxvb2tzIGxpa2Ugb24gZGlzay4KKyAqLworU1RBVElDIHZvaWQKK3hmc19xbV9kcWluaXRfY29yZSgKKwl4ZnNfZHFpZF90CWlkLAorCXVpbnQJCXR5cGUsCisJeGZzX2RxYmxrX3QJKmQpCit7CisJLyoKKwkgKiBDYWxsZXIgaGFzIHplcm8nZCB0aGUgZW50aXJlIGRxdW90ICdjaHVuaycgYWxyZWFkeS4KKwkgKi8KKwlJTlRfU0VUKGQtPmRkX2Rpc2tkcS5kX21hZ2ljLCBBUkNIX0NPTlZFUlQsIFhGU19EUVVPVF9NQUdJQyk7CisJSU5UX1NFVChkLT5kZF9kaXNrZHEuZF92ZXJzaW9uLCBBUkNIX0NPTlZFUlQsIFhGU19EUVVPVF9WRVJTSU9OKTsKKwlJTlRfU0VUKGQtPmRkX2Rpc2tkcS5kX2lkLCBBUkNIX0NPTlZFUlQsIGlkKTsKKwlJTlRfU0VUKGQtPmRkX2Rpc2tkcS5kX2ZsYWdzLCBBUkNIX0NPTlZFUlQsIHR5cGUpOworfQorCisKKyNpZmRlZiBYRlNfRFFVT1RfVFJBQ0UKKy8qCisgKiBEcXVvdCB0cmFjaW5nIGZvciBkZWJ1Z2dpbmcuCisgKi8KKy8qIEFSR1NVU0VEICovCit2b2lkCitfX3hmc19kcXRyYWNlX2VudHJ5KAorCXhmc19kcXVvdF90CSpkcXAsCisJY2hhcgkJKmZ1bmMsCisJdm9pZAkJKnJldGFkZHIsCisJeGZzX2lub2RlX3QJKmlwKQoreworCXhmc19kcXVvdF90CSp1ZHFwID0gTlVMTDsKKwl4ZnNfaW5vX3QJaW5vID0gMDsKKworCUFTU0VSVChkcXAtPnFfdHJhY2UpOworCWlmIChpcCkgeworCQlpbm8gPSBpcC0+aV9pbm87CisJCXVkcXAgPSBpcC0+aV91ZHF1b3Q7CisJfQorCWt0cmFjZV9lbnRlcihkcXAtPnFfdHJhY2UsCisJCSAgICAgKHZvaWQgKikoX19wc2ludF90KURRVU9UX0tUUkFDRV9FTlRSWSwKKwkJICAgICAodm9pZCAqKWZ1bmMsCisJCSAgICAgKHZvaWQgKikoX19wc2ludF90KWRxcC0+cV9ucmVmcywKKwkJICAgICAodm9pZCAqKShfX3BzaW50X3QpZHFwLT5kcV9mbGFncywKKwkJICAgICAodm9pZCAqKShfX3BzaW50X3QpZHFwLT5xX3Jlc19iY291bnQsCisJCSAgICAgKHZvaWQgKikoX19wc2ludF90KUlOVF9HRVQoZHFwLT5xX2NvcmUuZF9iY291bnQsCisJCQkJCQlBUkNIX0NPTlZFUlQpLAorCQkgICAgICh2b2lkICopKF9fcHNpbnRfdClJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaWNvdW50LAorCQkJCQkJQVJDSF9DT05WRVJUKSwKKwkJICAgICAodm9pZCAqKShfX3BzaW50X3QpSU5UX0dFVChkcXAtPnFfY29yZS5kX2Jsa19oYXJkbGltaXQsCisJCQkJCQlBUkNIX0NPTlZFUlQpLAorCQkgICAgICh2b2lkICopKF9fcHNpbnRfdClJTlRfR0VUKGRxcC0+cV9jb3JlLmRfYmxrX3NvZnRsaW1pdCwKKwkJCQkJCUFSQ0hfQ09OVkVSVCksCisJCSAgICAgKHZvaWQgKikoX19wc2ludF90KUlOVF9HRVQoZHFwLT5xX2NvcmUuZF9pbm9faGFyZGxpbWl0LAorCQkJCQkJQVJDSF9DT05WRVJUKSwKKwkJICAgICAodm9pZCAqKShfX3BzaW50X3QpSU5UX0dFVChkcXAtPnFfY29yZS5kX2lub19zb2Z0bGltaXQsCisJCQkJCQlBUkNIX0NPTlZFUlQpLAorCQkgICAgICh2b2lkICopKF9fcHNpbnRfdClJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaWQsIEFSQ0hfQ09OVkVSVCksCisJCSAgICAgKHZvaWQgKikoX19wc2ludF90KWN1cnJlbnRfcGlkKCksCisJCSAgICAgKHZvaWQgKikoX19wc2ludF90KWlubywKKwkJICAgICAodm9pZCAqKShfX3BzaW50X3QpcmV0YWRkciwKKwkJICAgICAodm9pZCAqKShfX3BzaW50X3QpdWRxcCk7CisJcmV0dXJuOworfQorI2VuZGlmCisKKworLyoKKyAqIElmIGRlZmF1bHQgbGltaXRzIGFyZSBpbiBmb3JjZSwgcHVzaCB0aGVtIGludG8gdGhlIGRxdW90IG5vdy4KKyAqIFdlIG92ZXJ3cml0ZSB0aGUgZHF1b3QgbGltaXRzIG9ubHkgaWYgdGhleSBhcmUgemVybyBhbmQgdGhpcworICogaXMgbm90IHRoZSByb290IGRxdW90LgorICovCit2b2lkCit4ZnNfcW1fYWRqdXN0X2RxbGltaXRzKAorCXhmc19tb3VudF90CQkqbXAsCisJeGZzX2Rpc2tfZHF1b3RfdAkqZCkKK3sKKwl4ZnNfcXVvdGFpbmZvX3QJCSpxID0gbXAtPm1fcXVvdGFpbmZvOworCisJQVNTRVJUKGQtPmRfaWQpOworCisJaWYgKHEtPnFpX2Jzb2Z0bGltaXQgJiYgIWQtPmRfYmxrX3NvZnRsaW1pdCkKKwkJSU5UX1NFVChkLT5kX2Jsa19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCwgcS0+cWlfYnNvZnRsaW1pdCk7CisJaWYgKHEtPnFpX2JoYXJkbGltaXQgJiYgIWQtPmRfYmxrX2hhcmRsaW1pdCkKKwkJSU5UX1NFVChkLT5kX2Jsa19oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCwgcS0+cWlfYmhhcmRsaW1pdCk7CisJaWYgKHEtPnFpX2lzb2Z0bGltaXQgJiYgIWQtPmRfaW5vX3NvZnRsaW1pdCkKKwkJSU5UX1NFVChkLT5kX2lub19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCwgcS0+cWlfaXNvZnRsaW1pdCk7CisJaWYgKHEtPnFpX2loYXJkbGltaXQgJiYgIWQtPmRfaW5vX2hhcmRsaW1pdCkKKwkJSU5UX1NFVChkLT5kX2lub19oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCwgcS0+cWlfaWhhcmRsaW1pdCk7CisJaWYgKHEtPnFpX3J0YnNvZnRsaW1pdCAmJiAhZC0+ZF9ydGJfc29mdGxpbWl0KQorCQlJTlRfU0VUKGQtPmRfcnRiX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJULCBxLT5xaV9ydGJzb2Z0bGltaXQpOworCWlmIChxLT5xaV9ydGJoYXJkbGltaXQgJiYgIWQtPmRfcnRiX2hhcmRsaW1pdCkKKwkJSU5UX1NFVChkLT5kX3J0Yl9oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCwgcS0+cWlfcnRiaGFyZGxpbWl0KTsKK30KKworLyoKKyAqIENoZWNrIHRoZSBsaW1pdHMgYW5kIHRpbWVycyBvZiBhIGRxdW90IGFuZCBzdGFydCBvciByZXNldCB0aW1lcnMKKyAqIGlmIG5lY2Vzc2FyeS4KKyAqIFRoaXMgZ2V0cyBjYWxsZWQgZXZlbiB3aGVuIHF1b3RhIGVuZm9yY2VtZW50IGlzIE9GRiwgd2hpY2ggbWFrZXMgb3VyCisgKiBsaWZlIGEgbGl0dGxlIGxlc3MgY29tcGxpY2F0ZWQuIChXZSBqdXN0IGRvbid0IHJlamVjdCBhbnkgcXVvdGEKKyAqIHJlc2VydmF0aW9ucyBpbiB0aGF0IGNhc2UsIHdoZW4gZW5mb3JjZW1lbnQgaXMgb2ZmKS4KKyAqIFdlIGFsc28gcmV0dXJuIDAgYXMgdGhlIHZhbHVlcyBvZiB0aGUgdGltZXJzIGluIFFfR0VUUVVPVEEgY2FsbHMsIHdoZW4KKyAqIGVuZm9yY2VtZW50J3Mgb2ZmLgorICogSW4gY29udHJhc3QsIHdhcm5pbmdzIGFyZSBhIGxpdHRsZSBkaWZmZXJlbnQgaW4gdGhhdCB0aGV5IGRvbid0CisgKiAnYXV0b21hdGljYWxseScgZ2V0IHN0YXJ0ZWQgd2hlbiBsaW1pdHMgZ2V0IGV4Y2VlZGVkLgorICovCit2b2lkCit4ZnNfcW1fYWRqdXN0X2RxdGltZXJzKAorCXhmc19tb3VudF90CQkqbXAsCisJeGZzX2Rpc2tfZHF1b3RfdAkqZCkKK3sKKwlBU1NFUlQoZC0+ZF9pZCk7CisKKyNpZmRlZiBRVU9UQURFQlVHCisJaWYgKElOVF9HRVQoZC0+ZF9ibGtfaGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQpKQorCQlBU1NFUlQoSU5UX0dFVChkLT5kX2Jsa19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkgPD0KKwkJCUlOVF9HRVQoZC0+ZF9ibGtfaGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQpKTsKKwlpZiAoSU5UX0dFVChkLT5kX2lub19oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCkpCisJCUFTU0VSVChJTlRfR0VUKGQtPmRfaW5vX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJUKSA8PQorCQkJSU5UX0dFVChkLT5kX2lub19oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCkpOworCWlmIChJTlRfR0VUKGQtPmRfcnRiX2hhcmRsaW1pdCwgQVJDSF9DT05WRVJUKSkKKwkJQVNTRVJUKElOVF9HRVQoZC0+ZF9ydGJfc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpIDw9CisJCQlJTlRfR0VUKGQtPmRfcnRiX2hhcmRsaW1pdCwgQVJDSF9DT05WRVJUKSk7CisjZW5kaWYKKwlpZiAoIWQtPmRfYnRpbWVyKSB7CisJCWlmICgoSU5UX0dFVChkLT5kX2Jsa19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkgJiYKKwkJICAgIChJTlRfR0VUKGQtPmRfYmNvdW50LCBBUkNIX0NPTlZFUlQpID49CisJCQkJSU5UX0dFVChkLT5kX2Jsa19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkpKSB8fAorCQkgICAgKElOVF9HRVQoZC0+ZF9ibGtfaGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQpICYmCisJCSAgICAoSU5UX0dFVChkLT5kX2Jjb3VudCwgQVJDSF9DT05WRVJUKSA+PQorCQkJCUlOVF9HRVQoZC0+ZF9ibGtfaGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQpKSkpIHsKKwkJCUlOVF9TRVQoZC0+ZF9idGltZXIsIEFSQ0hfQ09OVkVSVCwKKwkJCQlnZXRfc2Vjb25kcygpICsgWEZTX1FJX0JUSU1FTElNSVQobXApKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmICgoIWQtPmRfYmxrX3NvZnRsaW1pdCB8fAorCQkgICAgKElOVF9HRVQoZC0+ZF9iY291bnQsIEFSQ0hfQ09OVkVSVCkgPAorCQkJCUlOVF9HRVQoZC0+ZF9ibGtfc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpKSkgJiYKKwkJICAgICghZC0+ZF9ibGtfaGFyZGxpbWl0IHx8CisJCSAgICAoSU5UX0dFVChkLT5kX2Jjb3VudCwgQVJDSF9DT05WRVJUKSA8CisJCQkJSU5UX0dFVChkLT5kX2Jsa19oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCkpKSkgeworCQkJZC0+ZF9idGltZXIgPSAwOworCQl9CisJfQorCisJaWYgKCFkLT5kX2l0aW1lcikgeworCQlpZiAoKElOVF9HRVQoZC0+ZF9pbm9fc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpICYmCisJCSAgICAoSU5UX0dFVChkLT5kX2ljb3VudCwgQVJDSF9DT05WRVJUKSA+PQorCQkJCUlOVF9HRVQoZC0+ZF9pbm9fc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpKSkgfHwKKwkJICAgIChJTlRfR0VUKGQtPmRfaW5vX2hhcmRsaW1pdCwgQVJDSF9DT05WRVJUKSAmJgorCQkgICAgKElOVF9HRVQoZC0+ZF9pY291bnQsIEFSQ0hfQ09OVkVSVCkgPj0KKwkJCQlJTlRfR0VUKGQtPmRfaW5vX2hhcmRsaW1pdCwgQVJDSF9DT05WRVJUKSkpKSB7CisJCQlJTlRfU0VUKGQtPmRfaXRpbWVyLCBBUkNIX0NPTlZFUlQsCisJCQkJZ2V0X3NlY29uZHMoKSArIFhGU19RSV9JVElNRUxJTUlUKG1wKSk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoKCFkLT5kX2lub19zb2Z0bGltaXQgfHwKKwkJICAgIChJTlRfR0VUKGQtPmRfaWNvdW50LCBBUkNIX0NPTlZFUlQpIDwKKwkJCQlJTlRfR0VUKGQtPmRfaW5vX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJUKSkpICAmJgorCQkgICAgKCFkLT5kX2lub19oYXJkbGltaXQgfHwKKwkJICAgIChJTlRfR0VUKGQtPmRfaWNvdW50LCBBUkNIX0NPTlZFUlQpIDwKKwkJCQlJTlRfR0VUKGQtPmRfaW5vX2hhcmRsaW1pdCwgQVJDSF9DT05WRVJUKSkpKSB7CisJCQlkLT5kX2l0aW1lciA9IDA7CisJCX0KKwl9CisKKwlpZiAoIWQtPmRfcnRidGltZXIpIHsKKwkJaWYgKChJTlRfR0VUKGQtPmRfcnRiX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJUKSAmJgorCQkgICAgKElOVF9HRVQoZC0+ZF9ydGJjb3VudCwgQVJDSF9DT05WRVJUKSA+PQorCQkJCUlOVF9HRVQoZC0+ZF9ydGJfc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpKSkgfHwKKwkJICAgIChJTlRfR0VUKGQtPmRfcnRiX2hhcmRsaW1pdCwgQVJDSF9DT05WRVJUKSAmJgorCQkgICAgKElOVF9HRVQoZC0+ZF9ydGJjb3VudCwgQVJDSF9DT05WRVJUKSA+PQorCQkJCUlOVF9HRVQoZC0+ZF9ydGJfaGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQpKSkpIHsKKwkJCUlOVF9TRVQoZC0+ZF9ydGJ0aW1lciwgQVJDSF9DT05WRVJULAorCQkJCWdldF9zZWNvbmRzKCkgKyBYRlNfUUlfUlRCVElNRUxJTUlUKG1wKSk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoKCFkLT5kX3J0Yl9zb2Z0bGltaXQgfHwKKwkJICAgIChJTlRfR0VUKGQtPmRfcnRiY291bnQsIEFSQ0hfQ09OVkVSVCkgPAorCQkJCUlOVF9HRVQoZC0+ZF9ydGJfc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpKSkgJiYKKwkJICAgICghZC0+ZF9ydGJfaGFyZGxpbWl0IHx8CisJCSAgICAoSU5UX0dFVChkLT5kX3J0YmNvdW50LCBBUkNIX0NPTlZFUlQpIDwKKwkJCQlJTlRfR0VUKGQtPmRfcnRiX2hhcmRsaW1pdCwgQVJDSF9DT05WRVJUKSkpKSB7CisJCQlkLT5kX3J0YnRpbWVyID0gMDsKKwkJfQorCX0KK30KKworLyoKKyAqIEluY3JlbWVudCBvciByZXNldCB3YXJuaW5ncyBvZiBhIGdpdmVuIGRxdW90LgorICovCitpbnQKK3hmc19xbV9kcXdhcm4oCisJeGZzX2Rpc2tfZHF1b3RfdAkqZCwKKwl1aW50CQkJZmxhZ3MpCit7CisJaW50CXdhcm5lZDsKKworCS8qCisJICogcm9vdCdzIGxpbWl0cyBhcmUgbm90IHJlYWwgbGltaXRzLgorCSAqLworCWlmICghZC0+ZF9pZCkKKwkJcmV0dXJuICgwKTsKKworCXdhcm5lZCA9IDA7CisJaWYgKElOVF9HRVQoZC0+ZF9ibGtfc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpICYmCisJICAgIChJTlRfR0VUKGQtPmRfYmNvdW50LCBBUkNIX0NPTlZFUlQpID49CisJICAgICBJTlRfR0VUKGQtPmRfYmxrX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJUKSkpIHsKKwkJaWYgKGZsYWdzICYgWEZTX1FNT1BUX0RPV0FSTikgeworCQkJSU5UX01PRChkLT5kX2J3YXJucywgQVJDSF9DT05WRVJULCArMSk7CisJCQl3YXJuZWQrKzsKKwkJfQorCX0gZWxzZSB7CisJCWlmICghZC0+ZF9ibGtfc29mdGxpbWl0IHx8CisJCSAgICAoSU5UX0dFVChkLT5kX2Jjb3VudCwgQVJDSF9DT05WRVJUKSA8CisJCSAgICAgSU5UX0dFVChkLT5kX2Jsa19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkpKSB7CisJCQlkLT5kX2J3YXJucyA9IDA7CisJCX0KKwl9CisKKwlpZiAoSU5UX0dFVChkLT5kX2lub19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkgPiAwICYmCisJICAgIChJTlRfR0VUKGQtPmRfaWNvdW50LCBBUkNIX0NPTlZFUlQpID49CisJICAgICBJTlRfR0VUKGQtPmRfaW5vX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJUKSkpIHsKKwkJaWYgKGZsYWdzICYgWEZTX1FNT1BUX0RPV0FSTikgeworCQkJSU5UX01PRChkLT5kX2l3YXJucywgQVJDSF9DT05WRVJULCArMSk7CisJCQl3YXJuZWQrKzsKKwkJfQorCX0gZWxzZSB7CisJCWlmICghZC0+ZF9pbm9fc29mdGxpbWl0IHx8CisJCSAgICAoSU5UX0dFVChkLT5kX2ljb3VudCwgQVJDSF9DT05WRVJUKSA8CisJCSAgICAgSU5UX0dFVChkLT5kX2lub19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkpKSB7CisJCQlkLT5kX2l3YXJucyA9IDA7CisJCX0KKwl9CisjaWZkZWYgUVVPVEFERUJVRworCWlmIChJTlRfR0VUKGQtPmRfaXdhcm5zLCBBUkNIX0NPTlZFUlQpKQorCQljbW5fZXJyKENFX0RFQlVHLAorCQkJIi0tLS0tLS0tQEBJbm9kZSB3YXJuaW5ncyBydW5uaW5nIDogJUx1ID49ICVMdSIsCisJCQlJTlRfR0VUKGQtPmRfaWNvdW50LCBBUkNIX0NPTlZFUlQpLAorCQkJSU5UX0dFVChkLT5kX2lub19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkpOworCWlmIChJTlRfR0VUKGQtPmRfYndhcm5zLCBBUkNIX0NPTlZFUlQpKQorCQljbW5fZXJyKENFX0RFQlVHLAorCQkJIi0tLS0tLS0tQEBCbGtzIHdhcm5pbmdzIHJ1bm5pbmcgOiAlTHUgPj0gJUx1IiwKKwkJCUlOVF9HRVQoZC0+ZF9iY291bnQsIEFSQ0hfQ09OVkVSVCksCisJCQlJTlRfR0VUKGQtPmRfYmxrX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJUKSk7CisjZW5kaWYKKwlyZXR1cm4gKHdhcm5lZCk7Cit9CisKKworLyoKKyAqIGluaXRpYWxpemUgYSBidWZmZXIgZnVsbCBvZiBkcXVvdHMgYW5kIGxvZyB0aGUgd2hvbGUgdGhpbmcKKyAqLworU1RBVElDIHZvaWQKK3hmc19xbV9pbml0X2RxdW90X2JsaygKKwl4ZnNfdHJhbnNfdAkqdHAsCisJeGZzX21vdW50X3QJKm1wLAorCXhmc19kcWlkX3QJaWQsCisJdWludAkJdHlwZSwKKwl4ZnNfYnVmX3QJKmJwKQoreworCXhmc19kcWJsa190CSpkOworCWludAkJY3VyaWQsIGk7CisKKwlBU1NFUlQodHApOworCUFTU0VSVChYRlNfQlVGX0lTQlVTWShicCkpOworCUFTU0VSVChYRlNfQlVGX1ZBTFVTRU1BKGJwKSA8PSAwKTsKKworCWQgPSAoeGZzX2RxYmxrX3QgKilYRlNfQlVGX1BUUihicCk7CisKKwkvKgorCSAqIElEIG9mIHRoZSBmaXJzdCBkcXVvdCBpbiB0aGUgYmxvY2sgLSBpZCdzIGFyZSB6ZXJvIGJhc2VkLgorCSAqLworCWN1cmlkID0gaWQgLSAoaWQgJSBYRlNfUU1fRFFQRVJCTEsobXApKTsKKwlBU1NFUlQoY3VyaWQgPj0gMCk7CisJbWVtc2V0KGQsIDAsIEJCVE9CKFhGU19RSV9EUUNIVU5LTEVOKG1wKSkpOworCWZvciAoaSA9IDA7IGkgPCBYRlNfUU1fRFFQRVJCTEsobXApOyBpKyssIGQrKywgY3VyaWQrKykKKwkJeGZzX3FtX2RxaW5pdF9jb3JlKGN1cmlkLCB0eXBlLCBkKTsKKwl4ZnNfdHJhbnNfZHF1b3RfYnVmKHRwLCBicCwKKwkJCSAgICB0eXBlICYgWEZTX0RRX1VTRVIgPworCQkJICAgIFhGU19CTElfVURRVU9UX0JVRiA6CisJCQkgICAgWEZTX0JMSV9HRFFVT1RfQlVGKTsKKwl4ZnNfdHJhbnNfbG9nX2J1Zih0cCwgYnAsIDAsIEJCVE9CKFhGU19RSV9EUUNIVU5LTEVOKG1wKSkgLSAxKTsKK30KKworCisKKy8qCisgKiBBbGxvY2F0ZSBhIGJsb2NrIGFuZCBmaWxsIGl0IHdpdGggZHF1b3RzLgorICogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgYm1hcGkgZmluZHMgYSBob2xlLgorICovCitTVEFUSUMgaW50Cit4ZnNfcW1fZHFhbGxvYygKKwl4ZnNfdHJhbnNfdAkqdHAsCisJeGZzX21vdW50X3QJKm1wLAorCXhmc19kcXVvdF90CSpkcXAsCisJeGZzX2lub2RlX3QJKnF1b3RpcCwKKwl4ZnNfZmlsZW9mZl90CW9mZnNldF9mc2IsCisJeGZzX2J1Zl90CSoqT19icHApCit7CisJeGZzX2ZzYmxvY2tfdAlmaXJzdGJsb2NrOworCXhmc19ibWFwX2ZyZWVfdCBmbGlzdDsKKwl4ZnNfYm1idF9pcmVjX3QgbWFwOworCWludAkJbm1hcHMsIGVycm9yLCBjb21taXR0ZWQ7CisJeGZzX2J1Zl90CSpicDsKKworCUFTU0VSVCh0cCAhPSBOVUxMKTsKKwl4ZnNfZHF0cmFjZV9lbnRyeShkcXAsICJEUUFMTE9DIik7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIGJtYXAgZnJlZWxpc3QgcHJpb3IgdG8gY2FsbGluZyBibWFwaSBjb2RlLgorCSAqLworCVhGU19CTUFQX0lOSVQoJmZsaXN0LCAmZmlyc3RibG9jayk7CisJeGZzX2lsb2NrKHF1b3RpcCwgWEZTX0lMT0NLX0VYQ0wpOworCS8qCisJICogUmV0dXJuIGlmIHRoaXMgdHlwZSBvZiBxdW90YXMgaXMgdHVybmVkIG9mZiB3aGlsZSB3ZSBkaWRuJ3QKKwkgKiBoYXZlIGFuIGlub2RlIGxvY2sKKwkgKi8KKwlpZiAoWEZTX0lTX1RISVNfUVVPVEFfT0ZGKGRxcCkpIHsKKwkJeGZzX2l1bmxvY2socXVvdGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCXJldHVybiAoRVNSQ0gpOworCX0KKworCS8qCisJICogeGZzX3RyYW5zX2NvbW1pdCBub3JtYWxseSBkZWNyZW1lbnRzIHRoZSB2bm9kZSByZWYgY291bnQKKwkgKiB3aGVuIGl0IHVubG9ja3MgdGhlIGlub2RlLiBTaW5jZSB3ZSB3YW50IHRvIGtlZXAgdGhlIHF1b3RhCisJICogaW5vZGUgYXJvdW5kLCB3ZSBidW1wIHRoZSB2bm9kZSByZWYgY291bnQgbm93LgorCSAqLworCVZOX0hPTEQoWEZTX0lUT1YocXVvdGlwKSk7CisKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIHF1b3RpcCwgWEZTX0lMT0NLX0VYQ0wpOworCW5tYXBzID0gMTsKKwlpZiAoKGVycm9yID0geGZzX2JtYXBpKHRwLCBxdW90aXAsCisJCQkgICAgICBvZmZzZXRfZnNiLCBYRlNfRFFVT1RfQ0xVU1RFUl9TSVpFX0ZTQiwKKwkJCSAgICAgIFhGU19CTUFQSV9NRVRBREFUQSB8IFhGU19CTUFQSV9XUklURSwKKwkJCSAgICAgICZmaXJzdGJsb2NrLAorCQkJICAgICAgWEZTX1FNX0RRQUxMT0NfU1BBQ0VfUkVTKG1wKSwKKwkJCSAgICAgICZtYXAsICZubWFwcywgJmZsaXN0KSkpIHsKKwkJZ290byBlcnJvcjA7CisJfQorCUFTU0VSVChtYXAuYnJfYmxvY2tjb3VudCA9PSBYRlNfRFFVT1RfQ0xVU1RFUl9TSVpFX0ZTQik7CisJQVNTRVJUKG5tYXBzID09IDEpOworCUFTU0VSVCgobWFwLmJyX3N0YXJ0YmxvY2sgIT0gREVMQVlTVEFSVEJMT0NLKSAmJgorCSAgICAgICAobWFwLmJyX3N0YXJ0YmxvY2sgIT0gSE9MRVNUQVJUQkxPQ0spKTsKKworCS8qCisJICogS2VlcCB0cmFjayBvZiB0aGUgYmxrbm8gdG8gc2F2ZSBhIGxvb2t1cCBsYXRlcgorCSAqLworCWRxcC0+cV9ibGtubyA9IFhGU19GU0JfVE9fREFERFIobXAsIG1hcC5icl9zdGFydGJsb2NrKTsKKworCS8qIG5vdyB3ZSBjYW4ganVzdCBnZXQgdGhlIGJ1ZmZlciAodGhlcmUncyBub3RoaW5nIHRvIHJlYWQgeWV0KSAqLworCWJwID0geGZzX3RyYW5zX2dldF9idWYodHAsIG1wLT5tX2RkZXZfdGFyZ3AsCisJCQkgICAgICAgZHFwLT5xX2Jsa25vLAorCQkJICAgICAgIFhGU19RSV9EUUNIVU5LTEVOKG1wKSwKKwkJCSAgICAgICAwKTsKKwlpZiAoIWJwIHx8IChlcnJvciA9IFhGU19CVUZfR0VURVJST1IoYnApKSkKKwkJZ290byBlcnJvcjE7CisJLyoKKwkgKiBNYWtlIGEgY2h1bmsgb2YgZHF1b3RzIG91dCBvZiB0aGlzIGJ1ZmZlciBhbmQgbG9nCisJICogdGhlIGVudGlyZSB0aGluZy4KKwkgKi8KKwl4ZnNfcW1faW5pdF9kcXVvdF9ibGsodHAsIG1wLCBJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaWQsIEFSQ0hfQ09OVkVSVCksCisJCQkgICAgICBkcXAtPmRxX2ZsYWdzICYgKFhGU19EUV9VU0VSfFhGU19EUV9HUk9VUCksCisJCQkgICAgICBicCk7CisKKwlpZiAoKGVycm9yID0geGZzX2JtYXBfZmluaXNoKCZ0cCwgJmZsaXN0LCBmaXJzdGJsb2NrLCAmY29tbWl0dGVkKSkpIHsKKwkJZ290byBlcnJvcjE7CisJfQorCisJKk9fYnBwID0gYnA7CisJcmV0dXJuIDA7CisKKyAgICAgIGVycm9yMToKKwl4ZnNfYm1hcF9jYW5jZWwoJmZsaXN0KTsKKyAgICAgIGVycm9yMDoKKwl4ZnNfaXVubG9jayhxdW90aXAsIFhGU19JTE9DS19FWENMKTsKKworCXJldHVybiAoZXJyb3IpOworfQorCisvKgorICogTWFwcyBhIGRxdW90IHRvIHRoZSBidWZmZXIgY29udGFpbmluZyBpdHMgb24tZGlzayB2ZXJzaW9uLgorICogVGhpcyByZXR1cm5zIGEgcHRyIHRvIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgb24tZGlzayBkcXVvdAorICogaW4gdGhlIGJwcCBwYXJhbSwgYW5kIGEgcHRyIHRvIHRoZSBvbi1kaXNrIGRxdW90IHdpdGhpbiB0aGF0IGJ1ZmZlcgorICovCitTVEFUSUMgaW50Cit4ZnNfcW1fZHF0b2JwKAorCXhmc190cmFuc190CQkqdHAsCisJeGZzX2RxdW90X3QJCSpkcXAsCisJeGZzX2Rpc2tfZHF1b3RfdAkqKk9fZGRwcCwKKwl4ZnNfYnVmX3QJCSoqT19icHAsCisJdWludAkJCWZsYWdzKQoreworCXhmc19ibWJ0X2lyZWNfdCBtYXA7CisJaW50CQlubWFwcywgZXJyb3I7CisJeGZzX2J1Zl90CSpicDsKKwl4ZnNfaW5vZGVfdAkqcXVvdGlwOworCXhmc19tb3VudF90CSptcDsKKwl4ZnNfZGlza19kcXVvdF90ICpkZHE7CisJeGZzX2RxaWRfdAlpZDsKKwlib29sZWFuX3QJbmV3ZHF1b3Q7CisKKwltcCA9IGRxcC0+cV9tb3VudDsKKwlpZCA9IElOVF9HRVQoZHFwLT5xX2NvcmUuZF9pZCwgQVJDSF9DT05WRVJUKTsKKwlubWFwcyA9IDE7CisJbmV3ZHF1b3QgPSBCX0ZBTFNFOworCisJLyoKKwkgKiBJZiB3ZSBkb24ndCBrbm93IHdoZXJlIHRoZSBkcXVvdCBsaXZlcywgZmluZCBvdXQuCisJICovCisJaWYgKGRxcC0+cV9ibGtubyA9PSAoeGZzX2RhZGRyX3QpIDApIHsKKwkJLyogV2UgdXNlIHRoZSBpZCBhcyBhbiBpbmRleCAqLworCQlkcXAtPnFfZmlsZW9mZnNldCA9ICh4ZnNfZmlsZW9mZl90KSAoKHVpbnQpaWQgLworCQkJCQkJICAgICBYRlNfUU1fRFFQRVJCTEsobXApKTsKKwkJbm1hcHMgPSAxOworCQlxdW90aXAgPSBYRlNfRFFfVE9fUUlQKGRxcCk7CisJCXhmc19pbG9jayhxdW90aXAsIFhGU19JTE9DS19TSEFSRUQpOworCQkvKgorCQkgKiBSZXR1cm4gaWYgdGhpcyB0eXBlIG9mIHF1b3RhcyBpcyB0dXJuZWQgb2ZmIHdoaWxlIHdlIGRpZG4ndAorCQkgKiBoYXZlIGFuIGlub2RlIGxvY2sKKwkJICovCisJCWlmIChYRlNfSVNfVEhJU19RVU9UQV9PRkYoZHFwKSkgeworCQkJeGZzX2l1bmxvY2socXVvdGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKwkJCXJldHVybiAoRVNSQ0gpOworCQl9CisJCS8qCisJCSAqIEZpbmQgdGhlIGJsb2NrIG1hcDsgbm8gYWxsb2NhdGlvbnMgeWV0CisJCSAqLworCQllcnJvciA9IHhmc19ibWFwaShOVUxMLCBxdW90aXAsIGRxcC0+cV9maWxlb2Zmc2V0LAorCQkJCSAgWEZTX0RRVU9UX0NMVVNURVJfU0laRV9GU0IsCisJCQkJICBYRlNfQk1BUElfTUVUQURBVEEsCisJCQkJICBOVUxMLCAwLCAmbWFwLCAmbm1hcHMsIE5VTEwpOworCisJCXhmc19pdW5sb2NrKHF1b3RpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiAoZXJyb3IpOworCQlBU1NFUlQobm1hcHMgPT0gMSk7CisJCUFTU0VSVChtYXAuYnJfYmxvY2tjb3VudCA9PSAxKTsKKworCQkvKgorCQkgKiBvZmZzZXQgb2YgZHF1b3QgaW4gdGhlIChmaXhlZCBzaXplZCkgZHF1b3QgY2h1bmsuCisJCSAqLworCQlkcXAtPnFfYnVmb2Zmc2V0ID0gKGlkICUgWEZTX1FNX0RRUEVSQkxLKG1wKSkgKgorCQkJc2l6ZW9mKHhmc19kcWJsa190KTsKKwkJaWYgKG1hcC5icl9zdGFydGJsb2NrID09IEhPTEVTVEFSVEJMT0NLKSB7CisJCQkvKgorCQkJICogV2UgZG9uJ3QgYWxsb2NhdGUgdW5sZXNzIHdlJ3JlIGFza2VkIHRvCisJCQkgKi8KKwkJCWlmICghKGZsYWdzICYgWEZTX1FNT1BUX0RRQUxMT0MpKQorCQkJCXJldHVybiAoRU5PRU5UKTsKKworCQkJQVNTRVJUKHRwKTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfcW1fZHFhbGxvYyh0cCwgbXAsIGRxcCwgcXVvdGlwLAorCQkJCQkJZHFwLT5xX2ZpbGVvZmZzZXQsICZicCkpKQorCQkJCXJldHVybiAoZXJyb3IpOworCQkJbmV3ZHF1b3QgPSBCX1RSVUU7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogc3RvcmUgdGhlIGJsa25vIGV0YyBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gZG8gdGhlCisJCQkgKiBtYXBwaW5nIGFsbCB0aGUgdGltZQorCQkJICovCisJCQlkcXAtPnFfYmxrbm8gPSBYRlNfRlNCX1RPX0RBRERSKG1wLCBtYXAuYnJfc3RhcnRibG9jayk7CisJCX0KKwl9CisJQVNTRVJUKGRxcC0+cV9ibGtubyAhPSBERUxBWVNUQVJUQkxPQ0spOworCUFTU0VSVChkcXAtPnFfYmxrbm8gIT0gSE9MRVNUQVJUQkxPQ0spOworCisJLyoKKwkgKiBSZWFkIGluIHRoZSBidWZmZXIsIHVubGVzcyB3ZSd2ZSBqdXN0IGRvbmUgdGhlIGFsbG9jYXRpb24KKwkgKiAoaW4gd2hpY2ggY2FzZSB3ZSBhbHJlYWR5IGhhdmUgdGhlIGJ1ZikuCisJICovCisJaWYgKCEgbmV3ZHF1b3QpIHsKKwkJeGZzX2RxdHJhY2VfZW50cnkoZHFwLCAiRFFUT0JQIFJFQURCVUYiKTsKKwkJaWYgKChlcnJvciA9IHhmc190cmFuc19yZWFkX2J1ZihtcCwgdHAsIG1wLT5tX2RkZXZfdGFyZ3AsCisJCQkJCSAgICAgICBkcXAtPnFfYmxrbm8sCisJCQkJCSAgICAgICBYRlNfUUlfRFFDSFVOS0xFTihtcCksCisJCQkJCSAgICAgICAwLCAmYnApKSkgeworCQkJcmV0dXJuIChlcnJvcik7CisJCX0KKwkJaWYgKGVycm9yIHx8ICFicCkKKwkJCXJldHVybiBYRlNfRVJST1IoZXJyb3IpOworCX0KKwlBU1NFUlQoWEZTX0JVRl9JU0JVU1koYnApKTsKKwlBU1NFUlQoWEZTX0JVRl9WQUxVU0VNQShicCkgPD0gMCk7CisKKwkvKgorCSAqIGNhbGN1bGF0ZSB0aGUgbG9jYXRpb24gb2YgdGhlIGRxdW90IGluc2lkZSB0aGUgYnVmZmVyLgorCSAqLworCWRkcSA9ICh4ZnNfZGlza19kcXVvdF90ICopKChjaGFyICopWEZTX0JVRl9QVFIoYnApICsgZHFwLT5xX2J1Zm9mZnNldCk7CisKKwkvKgorCSAqIEEgc2ltcGxlIHNhbml0eSBjaGVjayBpbiBjYXNlIHdlIGdvdCBhIGNvcnJ1cHRlZCBkcXVvdC4uLgorCSAqLworCWlmICh4ZnNfcW1fZHFjaGVjayhkZHEsIGlkLAorCQkJICAgZHFwLT5kcV9mbGFncyAmIChYRlNfRFFfVVNFUnxYRlNfRFFfR1JPVVApLAorCQkJICAgZmxhZ3MgJiAoWEZTX1FNT1BUX0RRUkVQQUlSfFhGU19RTU9QVF9ET1dBUk4pLAorCQkJICAgImRxdG9icCIpKSB7CisJCWlmICghKGZsYWdzICYgWEZTX1FNT1BUX0RRUkVQQUlSKSkgeworCQkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOworCQkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCQl9CisJCVhGU19CVUZfQlVTWShicCk7IC8qIFdlIGRpcnRpZWQgdGhpcyAqLworCX0KKworCSpPX2JwcCA9IGJwOworCSpPX2RkcHAgPSBkZHE7CisKKwlyZXR1cm4gKDApOworfQorCisKKy8qCisgKiBSZWFkIGluIHRoZSBvbmRpc2sgZHF1b3QgdXNpbmcgZHF0b2JwKCkgdGhlbiBjb3B5IGl0IHRvIGFuIGluY29yZSB2ZXJzaW9uLAorICogYW5kIHJlbGVhc2UgdGhlIGJ1ZmZlciBpbW1lZGlhdGVseS4KKyAqCisgKi8KKy8qIEFSR1NVU0VEICovCitTVEFUSUMgaW50Cit4ZnNfcW1fZHFyZWFkKAorCXhmc190cmFuc190CSp0cCwKKwl4ZnNfZHFpZF90CWlkLAorCXhmc19kcXVvdF90CSpkcXAsCS8qIGRxdW90IHRvIGdldCBmaWxsZWQgaW4gKi8KKwl1aW50CQlmbGFncykKK3sKKwl4ZnNfZGlza19kcXVvdF90ICpkZHFwOworCXhmc19idWZfdAkgKmJwOworCWludAkJIGVycm9yOworCisJLyoKKwkgKiBnZXQgYSBwb2ludGVyIHRvIHRoZSBvbi1kaXNrIGRxdW90IGFuZCB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgaXQKKwkgKiBkcXAgYWxyZWFkeSBrbm93cyBpdHMgb3duIHR5cGUgKEdST1VQL1VTRVIpLgorCSAqLworCXhmc19kcXRyYWNlX2VudHJ5KGRxcCwgIkRRUkVBRCIpOworCWlmICgoZXJyb3IgPSB4ZnNfcW1fZHF0b2JwKHRwLCBkcXAsICZkZHFwLCAmYnAsIGZsYWdzKSkpIHsKKwkJcmV0dXJuIChlcnJvcik7CisJfQorCisJLyogY29weSBldmVyeXRoaW5nIGZyb20gZGlzayBkcXVvdCB0byB0aGUgaW5jb3JlIGRxdW90ICovCisJbWVtY3B5KCZkcXAtPnFfY29yZSwgZGRxcCwgc2l6ZW9mKHhmc19kaXNrX2RxdW90X3QpKTsKKwlBU1NFUlQoSU5UX0dFVChkcXAtPnFfY29yZS5kX2lkLCBBUkNIX0NPTlZFUlQpID09IGlkKTsKKwl4ZnNfcW1fZHF1b3RfbG9naXRlbV9pbml0KGRxcCk7CisKKwkvKgorCSAqIFJlc2VydmF0aW9uIGNvdW50ZXJzIGFyZSBkZWZpbmVkIGFzIHJlc2VydmF0aW9uIHBsdXMgY3VycmVudCB1c2FnZQorCSAqIHRvIGF2b2lkIGhhdmluZyB0byBhZGQgZXZlcnl0aW1lLgorCSAqLworCWRxcC0+cV9yZXNfYmNvdW50ID0gSU5UX0dFVChkZHFwLT5kX2Jjb3VudCwgQVJDSF9DT05WRVJUKTsKKwlkcXAtPnFfcmVzX2ljb3VudCA9IElOVF9HRVQoZGRxcC0+ZF9pY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJZHFwLT5xX3Jlc19ydGJjb3VudCA9IElOVF9HRVQoZGRxcC0+ZF9ydGJjb3VudCwgQVJDSF9DT05WRVJUKTsKKworCS8qIE1hcmsgdGhlIGJ1ZiBzbyB0aGF0IHRoaXMgd2lsbCBzdGF5IGluY29yZSBhIGxpdHRsZSBsb25nZXIgKi8KKwlYRlNfQlVGX1NFVF9WVFlQRV9SRUYoYnAsIEJfRlNfRFFVT1QsIFhGU19EUVVPVF9SRUYpOworCisJLyoKKwkgKiBXZSBnb3QgdGhlIGJ1ZmZlciB3aXRoIGEgeGZzX3RyYW5zX3JlYWRfYnVmKCkgKGluIGRxdG9icCgpKQorCSAqIFNvIHdlIG5lZWQgdG8gcmVsZWFzZSB3aXRoIHhmc190cmFuc19icmVsc2UoKS4KKwkgKiBUaGUgc3RyYXRlZ3kgaGVyZSBpcyBpZGVudGljYWwgdG8gdGhhdCBvZiBpbm9kZXM7IHdlIGxvY2sKKwkgKiB0aGUgZHF1b3QgaW4geGZzX3FtX2RxZ2V0KCkgYmVmb3JlIG1ha2luZyBpdCBhY2Nlc3NpYmxlIHRvCisJICogb3RoZXJzLiBUaGlzIGlzIGJlY2F1c2UgZHF1b3RzLCBsaWtlIGlub2RlcywgbmVlZCBhIGdvb2QgbGV2ZWwgb2YKKwkgKiBjb25jdXJyZW5jeSwgYW5kIHdlIGRvbid0IHdhbnQgdG8gdGFrZSBsb2NrcyBvbiB0aGUgZW50aXJlIGJ1ZmZlcnMKKwkgKiBmb3IgZHF1b3QgYWNjZXNzZXMuCisJICogTm90ZSBhbHNvIHRoYXQgdGhlIGRxdW90IGJ1ZmZlciBtYXkgZXZlbiBiZSBkaXJ0eSBhdCB0aGlzIHBvaW50LCBpZgorCSAqIHRoaXMgcGFydGljdWxhciBkcXVvdCB3YXMgcmVwYWlyZWQuIFdlIHN0aWxsIGFyZW4ndCBhZnJhaWQgdG8KKwkgKiBicmVsc2UgaXQgYmVjYXVzZSB3ZSBoYXZlIHRoZSBjaGFuZ2VzIGluY29yZS4KKwkgKi8KKwlBU1NFUlQoWEZTX0JVRl9JU0JVU1koYnApKTsKKwlBU1NFUlQoWEZTX0JVRl9WQUxVU0VNQShicCkgPD0gMCk7CisJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOworCisJcmV0dXJuIChlcnJvcik7Cit9CisKKworLyoKKyAqIGFsbG9jYXRlIGFuIGluY29yZSBkcXVvdCBmcm9tIHRoZSBrZXJuZWwgaGVhcCwKKyAqIGFuZCBmaWxsIGl0cyBjb3JlIHdpdGggcXVvdGEgaW5mb3JtYXRpb24ga2VwdCBvbiBkaXNrLgorICogSWYgWEZTX1FNT1BUX0RRQUxMT0MgaXMgc2V0LCBpdCdsbCBhbGxvY2F0ZSBhIGRxdW90IG9uIGRpc2sKKyAqIGlmIGl0IHdhc24ndCBhbHJlYWR5IGFsbG9jYXRlZC4KKyAqLworU1RBVElDIGludAoreGZzX3FtX2lkdG9kcSgKKwl4ZnNfbW91bnRfdAkqbXAsCisJeGZzX2RxaWRfdAlpZCwJIC8qIGdpZCBvciB1aWQsIGRlcGVuZGluZyBvbiB0eXBlICovCisJdWludAkJdHlwZSwJIC8qIFVEUVVPVCBvciBHRFFVT1QgKi8KKwl1aW50CQlmbGFncywJIC8qIERRQUxMT0MsIERRUkVQQUlSICovCisJeGZzX2RxdW90X3QJKipPX2RxcHApLyogT1VUIDogaW5jb3JlIGRxdW90LCBub3QgbG9ja2VkICovCit7CisJeGZzX2RxdW90X3QJKmRxcDsKKwlpbnQJCWVycm9yOworCXhmc190cmFuc190CSp0cDsKKwlpbnQJCWNhbmNlbGZsYWdzPTA7CisKKwlkcXAgPSB4ZnNfcW1fZHFpbml0KG1wLCBpZCwgdHlwZSk7CisJdHAgPSBOVUxMOworCWlmIChmbGFncyAmIFhGU19RTU9QVF9EUUFMTE9DKSB7CisJCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfUU1fRFFBTExPQyk7CisJCWlmICgoZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwKKwkJCQkgICAgICAgWEZTX1FNX0RRQUxMT0NfU1BBQ0VfUkVTKG1wKSwKKwkJCQkgICAgICAgWEZTX1dSSVRFX0xPR19SRVMobXApICsKKwkJCQkJICAgICAgQkJUT0IoWEZTX1FJX0RRQ0hVTktMRU4obXApKSAtIDEgKworCQkJCQkgICAgICAxMjgsCisJCQkJICAgICAgIDAsCisJCQkJICAgICAgIFhGU19UUkFOU19QRVJNX0xPR19SRVMsCisJCQkJICAgICAgIFhGU19XUklURV9MT0dfQ09VTlQpKSkgeworCQkJY2FuY2VsZmxhZ3MgPSAwOworCQkJZ290byBlcnJvcjA7CisJCX0KKwkJY2FuY2VsZmxhZ3MgPSBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTOworCX0KKworCS8qCisJICogUmVhZCBpdCBmcm9tIGRpc2s7IHhmc19kcXJlYWQoKSB0YWtlcyBjYXJlIG9mCisJICogYWxsIHRoZSBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb24gb2YgZHF1b3QncyBmaWVsZHMgKGxvY2tzLCBldGMpCisJICovCisJaWYgKChlcnJvciA9IHhmc19xbV9kcXJlYWQodHAsIGlkLCBkcXAsIGZsYWdzKSkpIHsKKwkJLyoKKwkJICogVGhpcyBjYW4gaGFwcGVuIGlmIHF1b3RhcyBnb3QgdHVybmVkIG9mZiAoRVNSQ0gpLAorCQkgKiBvciBpZiB0aGUgZHF1b3QgZGlkbid0IGV4aXN0IG9uIGRpc2sgYW5kIHdlIGFzayB0bworCQkgKiBhbGxvY2F0ZSAoRU5PRU5UKS4KKwkJICovCisJCXhmc19kcXRyYWNlX2VudHJ5KGRxcCwgIkRRUkVBRCBGQUlMIik7CisJCWNhbmNlbGZsYWdzIHw9IFhGU19UUkFOU19BQk9SVDsKKwkJZ290byBlcnJvcjA7CisJfQorCWlmICh0cCkgeworCQlpZiAoKGVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwgWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUywKKwkJCQkJICAgICBOVUxMKSkpCisJCQlnb3RvIGVycm9yMTsKKwl9CisKKwkqT19kcXBwID0gZHFwOworCXJldHVybiAoMCk7CisKKyBlcnJvcjA6CisJQVNTRVJUKGVycm9yKTsKKwlpZiAodHApCisJCXhmc190cmFuc19jYW5jZWwodHAsIGNhbmNlbGZsYWdzKTsKKyBlcnJvcjE6CisJeGZzX3FtX2RxZGVzdHJveShkcXApOworCSpPX2RxcHAgPSBOVUxMOworCXJldHVybiAoZXJyb3IpOworfQorCisvKgorICogTG9va3VwIGEgZHF1b3QgaW4gdGhlIGluY29yZSBkcXVvdCBoYXNodGFibGUuIFdlIGtlZXAgdHdvIHNlcGFyYXRlCisgKiBoYXNodGFibGVzIGZvciB1c2VyIGFuZCBncm91cCBkcXVvdHM7IGFuZCwgdGhlc2UgYXJlIGdsb2JhbCB0YWJsZXMKKyAqIGluc2lkZSB0aGUgWFFNLCBub3QgcGVyLWZpbGVzeXN0ZW0gdGFibGVzLgorICogVGhlIGhhc2ggY2hhaW4gbXVzdCBiZSBsb2NrZWQgYnkgY2FsbGVyLCBhbmQgaXQgaXMgbGVmdCBsb2NrZWQKKyAqIG9uIHJldHVybi4gUmV0dXJuaW5nIGRxdW90IGlzIGxvY2tlZC4KKyAqLworU1RBVElDIGludAoreGZzX3FtX2RxbG9va3VwKAorCXhmc19tb3VudF90CQkqbXAsCisJeGZzX2RxaWRfdAkJaWQsCisJeGZzX2RxaGFzaF90CQkqcWgsCisJeGZzX2RxdW90X3QJCSoqT19kcXBwKQoreworCXhmc19kcXVvdF90CQkqZHFwOworCXVpbnQJCQlmbGlzdF9sb2NrZWQ7CisJeGZzX2RxdW90X3QJCSpkOworCisJQVNTRVJUKFhGU19EUV9JU19IQVNIX0xPQ0tFRChxaCkpOworCisJZmxpc3RfbG9ja2VkID0gQl9GQUxTRTsKKworCS8qCisJICogVHJhdmVyc2UgdGhlIGhhc2hjaGFpbiBsb29raW5nIGZvciBhIG1hdGNoCisJICovCisJZm9yIChkcXAgPSBxaC0+cWhfbmV4dDsgZHFwICE9IE5VTEw7IGRxcCA9IGRxcC0+SExfTkVYVCkgeworCQkvKgorCQkgKiBXZSBhbHJlYWR5IGhhdmUgdGhlIGhhc2hsb2NrLiBXZSBkb24ndCBuZWVkIHRoZQorCQkgKiBkcWxvY2sgdG8gbG9vayBhdCB0aGUgaWQgZmllbGQgb2YgdGhlIGRxdW90LCBzaW5jZSB0aGUKKwkJICogaWQgY2FuJ3QgYmUgbW9kaWZpZWQgd2l0aG91dCB0aGUgaGFzaGxvY2sgYW55d2F5LgorCQkgKi8KKwkJaWYgKElOVF9HRVQoZHFwLT5xX2NvcmUuZF9pZCwgQVJDSF9DT05WRVJUKSA9PSBpZCAmJiBkcXAtPnFfbW91bnQgPT0gbXApIHsKKwkJCXhmc19kcXRyYWNlX2VudHJ5KGRxcCwgIkRRRk9VTkQgQlkgTE9PS1VQIik7CisJCQkvKgorCQkJICogQWxsIGluIGNvcmUgZHF1b3RzIG11c3QgYmUgb24gdGhlIGRxbGlzdCBvZiBtcAorCQkJICovCisJCQlBU1NFUlQoZHFwLT5NUExfUFJFVlAgIT0gTlVMTCk7CisKKwkJCXhmc19kcWxvY2soZHFwKTsKKwkJCWlmIChkcXAtPnFfbnJlZnMgPT0gMCkgeworCQkJCUFTU0VSVCAoWEZTX0RRX0lTX09OX0ZSRUVMSVNUKGRxcCkpOworCQkJCWlmICghIHhmc19xbV9mcmVlbGlzdF9sb2NrX25vd2FpdCh4ZnNfR3FtKSkgeworCQkJCQl4ZnNfZHF0cmFjZV9lbnRyeShkcXAsICJEUUxPT0tVUDogV0FOVCIpOworCisJCQkJCS8qCisJCQkJCSAqIFdlIG1heSBoYXZlIHJhY2VkIHdpdGggZHFyZWNsYWltX29uZSgpCisJCQkJCSAqIChhbmQgbG9zdCkuIFNvLCBmbGFnIHRoYXQgd2UgZG9uJ3QKKwkJCQkJICogd2FudCB0aGUgZHF1b3QgdG8gYmUgcmVjbGFpbWVkLgorCQkJCQkgKi8KKwkJCQkJZHFwLT5kcV9mbGFncyB8PSBYRlNfRFFfV0FOVDsKKwkJCQkJeGZzX2RxdW5sb2NrKGRxcCk7CisJCQkJCXhmc19xbV9mcmVlbGlzdF9sb2NrKHhmc19HcW0pOworCQkJCQl4ZnNfZHFsb2NrKGRxcCk7CisJCQkJCWRxcC0+ZHFfZmxhZ3MgJj0gfihYRlNfRFFfV0FOVCk7CisJCQkJfQorCQkJCWZsaXN0X2xvY2tlZCA9IEJfVFJVRTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIGlkIGNvdWxkbid0IGhhdmUgY2hhbmdlZDsgd2UgaGFkIHRoZSBoYXNobG9jayBhbGwKKwkJCSAqIGFsb25nCisJCQkgKi8KKwkJCUFTU0VSVChJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaWQsIEFSQ0hfQ09OVkVSVCkgPT0gaWQpOworCisJCQlpZiAoZmxpc3RfbG9ja2VkKSB7CisJCQkJaWYgKGRxcC0+cV9ucmVmcyAhPSAwKSB7CisJCQkJCXhmc19xbV9mcmVlbGlzdF91bmxvY2soeGZzX0dxbSk7CisJCQkJCWZsaXN0X2xvY2tlZCA9IEJfRkFMU0U7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyoKKwkJCQkJICogdGFrZSBpdCBvZmYgdGhlIGZyZWVsaXN0CisJCQkJCSAqLworCQkJCQl4ZnNfZHF0cmFjZV9lbnRyeShkcXAsCisJCQkJCQkJIkRRTE9PS1VQOiBUQUtFT0ZGIEZMIik7CisJCQkJCVhRTV9GUkVFTElTVF9SRU1PVkUoZHFwKTsKKwkJCQkJLyogeGZzX3FtX2ZyZWVsaXN0X3ByaW50KCYoeGZzX0dxbS0+CisJCQkJCQkJcW1fZHFmcmVlbGlzdCksCisJCQkJCQkJImFmdGVyIHJlbW92YWwiKTsgKi8KKwkJCQl9CisJCQl9CisKKwkJCS8qCisJCQkgKiBncmFiIGEgcmVmZXJlbmNlCisJCQkgKi8KKwkJCVhGU19EUUhPTEQoZHFwKTsKKworCQkJaWYgKGZsaXN0X2xvY2tlZCkKKwkJCQl4ZnNfcW1fZnJlZWxpc3RfdW5sb2NrKHhmc19HcW0pOworCQkJLyoKKwkJCSAqIG1vdmUgdGhlIGRxdW90IHRvIHRoZSBmcm9udCBvZiB0aGUgaGFzaGNoYWluCisJCQkgKi8KKwkJCUFTU0VSVChYRlNfRFFfSVNfSEFTSF9MT0NLRUQocWgpKTsKKwkJCWlmIChkcXAtPkhMX1BSRVZQICE9ICZxaC0+cWhfbmV4dCkgeworCQkJCXhmc19kcXRyYWNlX2VudHJ5KGRxcCwKKwkJCQkJCSAgIkRRTE9PS1VQOiBIQVNIIE1PVkVUT0ZST05UIik7CisJCQkJaWYgKChkID0gZHFwLT5ITF9ORVhUKSkKKwkJCQkJZC0+SExfUFJFVlAgPSBkcXAtPkhMX1BSRVZQOworCQkJCSooZHFwLT5ITF9QUkVWUCkgPSBkOworCQkJCWQgPSBxaC0+cWhfbmV4dDsKKwkJCQlkLT5ITF9QUkVWUCA9ICZkcXAtPkhMX05FWFQ7CisJCQkJZHFwLT5ITF9ORVhUID0gZDsKKwkJCQlkcXAtPkhMX1BSRVZQID0gJnFoLT5xaF9uZXh0OworCQkJCXFoLT5xaF9uZXh0ID0gZHFwOworCQkJfQorCQkJeGZzX2RxdHJhY2VfZW50cnkoZHFwLCAiTE9PS1VQIEVORCIpOworCQkJKk9fZHFwcCA9IGRxcDsKKwkJCUFTU0VSVChYRlNfRFFfSVNfSEFTSF9MT0NLRUQocWgpKTsKKwkJCXJldHVybiAoMCk7CisJCX0KKwl9CisKKwkqT19kcXBwID0gTlVMTDsKKwlBU1NFUlQoWEZTX0RRX0lTX0hBU0hfTE9DS0VEKHFoKSk7CisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIEdpdmVuIHRoZSBmaWxlIHN5c3RlbSwgaW5vZGUgT1IgaWQsIGFuZCB0eXBlIChVRFFVT1QvR0RRVU9UKSwgcmV0dXJuIGEKKyAqIGEgbG9ja2VkIGRxdW90LCBkb2luZyBhbiBhbGxvY2F0aW9uIChpZiByZXF1ZXN0ZWQpIGFzIG5lZWRlZC4KKyAqIFdoZW4gYm90aCBhbiBpbm9kZSBhbmQgYW4gaWQgYXJlIGdpdmVuLCB0aGUgaW5vZGUncyBpZCB0YWtlcyBwcmVjZWRlbmNlLgorICogVGhhdCBpcywgaWYgdGhlIGlkIGNoYW5nZXMgd2hpbGUgd2UgZG9uJ3QgaG9sZCB0aGUgaWxvY2sgaW5zaWRlIHRoaXMKKyAqIGZ1bmN0aW9uLCB0aGUgbmV3IGRxdW90IGlzIHJldHVybmVkLCBub3QgbmVjZXNzYXJpbHkgdGhlIG9uZSByZXF1ZXN0ZWQKKyAqIGluIHRoZSBpZCBhcmd1bWVudC4KKyAqLworaW50Cit4ZnNfcW1fZHFnZXQoCisJeGZzX21vdW50X3QJKm1wLAorCXhmc19pbm9kZV90CSppcCwJICAvKiBsb2NrZWQgaW5vZGUgKG9wdGlvbmFsKSAqLworCXhmc19kcWlkX3QJaWQsCSAgLyogZ2lkIG9yIHVpZCwgZGVwZW5kaW5nIG9uIHR5cGUgKi8KKwl1aW50CQl0eXBlLAkgIC8qIFVEUVVPVCBvciBHRFFVT1QgKi8KKwl1aW50CQlmbGFncywJICAvKiBEUUFMTE9DLCBEUVNVU0VSLCBEUVJFUEFJUiwgRE9XQVJOICovCisJeGZzX2RxdW90X3QJKipPX2RxcHApIC8qIE9VVCA6IGxvY2tlZCBpbmNvcmUgZHF1b3QgKi8KK3sKKwl4ZnNfZHF1b3RfdAkqZHFwOworCXhmc19kcWhhc2hfdAkqaDsKKwl1aW50CQl2ZXJzaW9uOworCWludAkJZXJyb3I7CisKKwlBU1NFUlQoWEZTX0lTX1FVT1RBX1JVTk5JTkcobXApKTsKKwlpZiAoKCEgWEZTX0lTX1VRVU9UQV9PTihtcCkgJiYgdHlwZSA9PSBYRlNfRFFfVVNFUikgfHwKKwkgICAgKCEgWEZTX0lTX0dRVU9UQV9PTihtcCkgJiYgdHlwZSA9PSBYRlNfRFFfR1JPVVApKSB7CisJCXJldHVybiAoRVNSQ0gpOworCX0KKwloID0gWEZTX0RRX0hBU0gobXAsIGlkLCB0eXBlKTsKKworI2lmZGVmIERFQlVHCisJaWYgKHhmc19kb19kcWVycm9yKSB7CisJCWlmICgoeGZzX2RxZXJyb3JfdGFyZ2V0ID09IG1wLT5tX2RkZXZfdGFyZ3ApICYmCisJCSAgICAoeGZzX2RxcmVxX251bSsrICUgeGZzX2RxZXJyb3JfbW9kKSA9PSAwKSB7CisJCQljbW5fZXJyKENFX0RFQlVHLCAiUmV0dXJuaW5nIGVycm9yIGluIGRxZ2V0Iik7CisJCQlyZXR1cm4gKEVJTyk7CisJCX0KKwl9CisjZW5kaWYKKworIGFnYWluOgorCisjaWZkZWYgREVCVUcKKwlBU1NFUlQodHlwZSA9PSBYRlNfRFFfVVNFUiB8fCB0eXBlID09IFhGU19EUV9HUk9VUCk7CisJaWYgKGlwKSB7CisJCUFTU0VSVChYRlNfSVNMT0NLRURfSU5PREVfRVhDTChpcCkpOworCQlpZiAodHlwZSA9PSBYRlNfRFFfVVNFUikKKwkJCUFTU0VSVChpcC0+aV91ZHF1b3QgPT0gTlVMTCk7CisJCWVsc2UKKwkJCUFTU0VSVChpcC0+aV9nZHF1b3QgPT0gTlVMTCk7CisJfQorI2VuZGlmCisJWEZTX0RRX0hBU0hfTE9DSyhoKTsKKworCS8qCisJICogTG9vayBpbiB0aGUgY2FjaGUgKGhhc2h0YWJsZSkuCisJICogVGhlIGNoYWluIGlzIGtlcHQgbG9ja2VkIGR1cmluZyBsb29rdXAuCisJICovCisJaWYgKHhmc19xbV9kcWxvb2t1cChtcCwgaWQsIGgsIE9fZHFwcCkgPT0gMCkgeworCQlYUU1fU1RBVFNfSU5DKHhxbXN0YXRzLnhzX3FtX2RxY2FjaGVoaXRzKTsKKwkJLyoKKwkJICogVGhlIGRxdW90IHdhcyBmb3VuZCwgbW92ZWQgdG8gdGhlIGZyb250IG9mIHRoZSBjaGFpbiwKKwkJICogdGFrZW4gb2ZmIHRoZSBmcmVlbGlzdCBpZiBpdCB3YXMgb24gaXQsIGFuZCBsb2NrZWQKKwkJICogYXQgdGhpcyBwb2ludC4gSnVzdCB1bmxvY2sgdGhlIGhhc2hjaGFpbiBhbmQgcmV0dXJuLgorCQkgKi8KKwkJQVNTRVJUKCpPX2RxcHApOworCQlBU1NFUlQoWEZTX0RRX0lTX0xPQ0tFRCgqT19kcXBwKSk7CisJCVhGU19EUV9IQVNIX1VOTE9DSyhoKTsKKwkJeGZzX2RxdHJhY2VfZW50cnkoKk9fZHFwcCwgIkRRR0VUIERPTkUgKEZST00gQ0FDSEUpIik7CisJCXJldHVybiAoMCk7CS8qIHN1Y2Nlc3MgKi8KKwl9CisJWFFNX1NUQVRTX0lOQyh4cW1zdGF0cy54c19xbV9kcWNhY2hlbWlzc2VzKTsKKworCS8qCisJICogRHF1b3QgY2FjaGUgbWlzcy4gV2UgZG9uJ3Qgd2FudCB0byBrZWVwIHRoZSBpbm9kZSBsb2NrIGFjcm9zcworCSAqIGEgKHBvdGVudGlhbCkgZGlzayByZWFkLiBBbHNvIHdlIGRvbid0IHdhbnQgdG8gZGVhbCB3aXRoIHRoZSBsb2NrCisJICogb3JkZXJpbmcgYmV0d2VlbiBxdW90YWlub2RlIGFuZCB0aGlzIGlub2RlLiBPVE9ILCBkcm9wcGluZyB0aGUgaW5vZGUKKwkgKiBsb2NrIGhlcmUgbWVhbnMgZGVhbGluZyB3aXRoIGEgY2hvd24gdGhhdCBjYW4gaGFwcGVuIGJlZm9yZQorCSAqIHdlIHJlLWFjcXVpcmUgdGhlIGxvY2suCisJICovCisJaWYgKGlwKQorCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCS8qCisJICogU2F2ZSB0aGUgaGFzaGNoYWluIHZlcnNpb24gc3RhbXAsIGFuZCB1bmxvY2sgdGhlIGNoYWluLCBzbyB0aGF0CisJICogd2UgZG9uJ3Qga2VlcCB0aGUgbG9jayBhY3Jvc3MgYSBkaXNrIHJlYWQKKwkgKi8KKwl2ZXJzaW9uID0gaC0+cWhfdmVyc2lvbjsKKwlYRlNfRFFfSEFTSF9VTkxPQ0soaCk7CisKKwkvKgorCSAqIEFsbG9jYXRlIHRoZSBkcXVvdCBvbiB0aGUga2VybmVsIGhlYXAsIGFuZCByZWFkIHRoZSBvbmRpc2sKKwkgKiBwb3J0aW9uIG9mZiB0aGUgZGlzay4gQWxzbywgZG8gYWxsIHRoZSBuZWNlc3NhcnkgaW5pdGlhbGl6YXRpb24KKwkgKiBUaGlzIGNhbiByZXR1cm4gRU5PRU5UIGlmIGRxdW90IGRpZG4ndCBleGlzdCBvbiBkaXNrIGFuZCB3ZSBkaWRuJ3QKKwkgKiBhc2sgaXQgdG8gYWxsb2NhdGU7IEVTUkNIIGlmIHF1b3RhcyBnb3QgdHVybmVkIG9mZiBzdWRkZW5seS4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX3FtX2lkdG9kcShtcCwgaWQsIHR5cGUsCisJCQkJICBmbGFncyAmIChYRlNfUU1PUFRfRFFBTExPQ3xYRlNfUU1PUFRfRFFSRVBBSVJ8CisJCQkJCSAgIFhGU19RTU9QVF9ET1dBUk4pLAorCQkJCSAgJmRxcCkpKSB7CisJCWlmIChpcCkKKwkJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQlyZXR1cm4gKGVycm9yKTsKKwl9CisKKwkvKgorCSAqIFNlZSBpZiB0aGlzIGlzIG1vdW50IGNvZGUgY2FsbGluZyB0byBsb29rIGF0IHRoZSBvdmVyYWxsIHF1b3RhIGxpbWl0cworCSAqIHdoaWNoIGFyZSBzdG9yZWQgaW4gdGhlIGlkID09IDAgdXNlciBvciBncm91cCdzIGRxdW90LgorCSAqIFNpbmNlIHdlIG1heSBub3QgaGF2ZSBkb25lIGEgcXVvdGFjaGVjayBieSB0aGlzIHBvaW50LCBqdXN0IHJldHVybgorCSAqIHRoZSBkcXVvdCB3aXRob3V0IGF0dGFjaGluZyBpdCB0byBhbnkgaGFzaHRhYmxlcywgbGlzdHMsIGV0Yywgb3IgZXZlbgorCSAqIHRha2luZyBhIHJlZmVyZW5jZS4KKwkgKiBUaGUgY2FsbGVyIG11c3QgZHFkZXN0cm95IHRoaXMgb25jZSBkb25lLgorCSAqLworCWlmIChmbGFncyAmIFhGU19RTU9QVF9EUVNVU0VSKSB7CisJCUFTU0VSVChpZCA9PSAwKTsKKwkJQVNTRVJUKCEgaXApOworCQlnb3RvIGRxcmV0OworCX0KKworCS8qCisJICogRHF1b3QgbG9jayBjb21lcyBhZnRlciBoYXNobG9jayBpbiB0aGUgbG9jayBvcmRlcmluZworCSAqLworCWlmIChpcCkgeworCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwkJaWYgKCEgWEZTX0lTX0RRVFlQRV9PTihtcCwgdHlwZSkpIHsKKwkJCS8qIGlub2RlIHN0YXlzIGxvY2tlZCBvbiByZXR1cm4gKi8KKwkJCXhmc19xbV9kcWRlc3Ryb3koZHFwKTsKKwkJCXJldHVybiBYRlNfRVJST1IoRVNSQ0gpOworCQl9CisJCS8qCisJCSAqIEEgZHF1b3QgY291bGQgYmUgYXR0YWNoZWQgdG8gdGhpcyBpbm9kZSBieSBub3csIHNpbmNlCisJCSAqIHdlIGhhZCBkcm9wcGVkIHRoZSBpbG9jay4KKwkJICovCisJCWlmICh0eXBlID09IFhGU19EUV9VU0VSKSB7CisJCQlpZiAoaXAtPmlfdWRxdW90KSB7CisJCQkJeGZzX3FtX2RxZGVzdHJveShkcXApOworCQkJCWRxcCA9IGlwLT5pX3VkcXVvdDsKKwkJCQl4ZnNfZHFsb2NrKGRxcCk7CisJCQkJZ290byBkcXJldDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChpcC0+aV9nZHF1b3QpIHsKKwkJCQl4ZnNfcW1fZHFkZXN0cm95KGRxcCk7CisJCQkJZHFwID0gaXAtPmlfZ2RxdW90OworCQkJCXhmc19kcWxvY2soZHFwKTsKKwkJCQlnb3RvIGRxcmV0OworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBIYXNobG9jayBjb21lcyBhZnRlciBpbG9jayBpbiBsb2NrIG9yZGVyCisJICovCisJWEZTX0RRX0hBU0hfTE9DSyhoKTsKKwlpZiAodmVyc2lvbiAhPSBoLT5xaF92ZXJzaW9uKSB7CisJCXhmc19kcXVvdF90ICp0bXBkcXA7CisJCS8qCisJCSAqIE5vdywgc2VlIGlmIHNvbWVib2R5IGVsc2UgcHV0IHRoZSBkcXVvdCBpbiB0aGUKKwkJICogaGFzaHRhYmxlIGJlZm9yZSB1cy4gVGhpcyBjYW4gaGFwcGVuIGJlY2F1c2Ugd2UgZGlkbid0CisJCSAqIGtlZXAgdGhlIGhhc2hjaGFpbiBsb2NrLiBXZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0CisJCSAqIGxvY2sgb3JkZXIgYmV0d2VlbiB0aGUgdHdvIGRxdW90cyBoZXJlIHNpbmNlIGRxcCBpc24ndAorCQkgKiBvbiBhbnkgZmluZGFibGUgbGlzdHMgeWV0LgorCQkgKi8KKwkJaWYgKHhmc19xbV9kcWxvb2t1cChtcCwgaWQsIGgsICZ0bXBkcXApID09IDApIHsKKwkJCS8qCisJCQkgKiBEdXBsaWNhdGUgZm91bmQuIEp1c3QgdGhyb3cgYXdheSB0aGUgbmV3IGRxdW90CisJCQkgKiBhbmQgc3RhcnQgb3Zlci4KKwkJCSAqLworCQkJeGZzX3FtX2RxcHV0KHRtcGRxcCk7CisJCQlYRlNfRFFfSEFTSF9VTkxPQ0soaCk7CisJCQl4ZnNfcW1fZHFkZXN0cm95KGRxcCk7CisJCQlYUU1fU1RBVFNfSU5DKHhxbXN0YXRzLnhzX3FtX2RxdW90X2R1cHMpOworCQkJZ290byBhZ2FpbjsKKwkJfQorCX0KKworCS8qCisJICogUHV0IHRoZSBkcXVvdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBoYXNoLWNoYWluIGFuZCBtcCdzIGxpc3QKKwkgKiBMT0NLIE9SREVSOiBoYXNobG9jaywgZnJlZWxpc3Rsb2NrLCBtcGxpc3Rsb2NrLCB1ZHFsb2NrLCBnZHFsb2NrIC4uCisJICovCisJQVNTRVJUKFhGU19EUV9JU19IQVNIX0xPQ0tFRChoKSk7CisJZHFwLT5xX2hhc2ggPSBoOworCVhRTV9IQVNITElTVF9JTlNFUlQoaCwgZHFwKTsKKworCS8qCisJICogQXR0YWNoIHRoaXMgZHF1b3QgdG8gdGhpcyBmaWxlc3lzdGVtJ3MgbGlzdCBvZiBhbGwgZHF1b3RzLAorCSAqIGtlcHQgaW5zaWRlIHRoZSBtb3VudCBzdHJ1Y3R1cmUgaW4gbV9xdW90YWluZm8gZmllbGQKKwkgKi8KKwl4ZnNfcW1fbXBsaXN0X2xvY2sobXApOworCisJLyoKKwkgKiBXZSByZXR1cm4gYSBsb2NrZWQgZHF1b3QgdG8gdGhlIGNhbGxlciwgd2l0aCBhIHJlZmVyZW5jZSB0YWtlbgorCSAqLworCXhmc19kcWxvY2soZHFwKTsKKwlkcXAtPnFfbnJlZnMgPSAxOworCisJWFFNX01QTElTVF9JTlNFUlQoJihYRlNfUUlfTVBMX0xJU1QobXApKSwgZHFwKTsKKworCXhmc19xbV9tcGxpc3RfdW5sb2NrKG1wKTsKKwlYRlNfRFFfSEFTSF9VTkxPQ0soaCk7CisgZHFyZXQ6CisJQVNTRVJUKChpcCA9PSBOVUxMKSB8fCBYRlNfSVNMT0NLRURfSU5PREVfRVhDTChpcCkpOworCXhmc19kcXRyYWNlX2VudHJ5KGRxcCwgIkRRR0VUIERPTkUiKTsKKwkqT19kcXBwID0gZHFwOworCXJldHVybiAoMCk7Cit9CisKKworLyoKKyAqIFJlbGVhc2UgYSByZWZlcmVuY2UgdG8gdGhlIGRxdW90IChkZWNyZW1lbnQgcmVmLWNvdW50KQorICogYW5kIHVubG9jayBpdC4gSWYgdGhlcmUgaXMgYSBncm91cCBxdW90YSBhdHRhY2hlZCB0byB0aGlzCisgKiBkcXVvdCwgY2FyZWZ1bGx5IHJlbGVhc2UgdGhhdCB0b28gd2l0aG91dCB0cmlwcGluZyBvdmVyCisgKiBkZWFkbG9ja3MnbidzdHVmZi4KKyAqLwordm9pZAoreGZzX3FtX2RxcHV0KAorCXhmc19kcXVvdF90CSpkcXApCit7CisJeGZzX2RxdW90X3QJKmdkcXA7CisKKwlBU1NFUlQoZHFwLT5xX25yZWZzID4gMCk7CisJQVNTRVJUKFhGU19EUV9JU19MT0NLRUQoZHFwKSk7CisJeGZzX2RxdHJhY2VfZW50cnkoZHFwLCAiRFFQVVQiKTsKKworCWlmIChkcXAtPnFfbnJlZnMgIT0gMSkgeworCQlkcXAtPnFfbnJlZnMtLTsKKwkJeGZzX2RxdW5sb2NrKGRxcCk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIGRyb3AgdGhlIGRxbG9jayBhbmQgYWNxdWlyZSB0aGUgZnJlZWxpc3QgYW5kIGRxbG9jaworCSAqIGluIHRoZSByaWdodCBvcmRlcjsgYnV0IHRyeSB0byBnZXQgaXQgb3V0LW9mLW9yZGVyIGZpcnN0CisJICovCisJaWYgKCEgeGZzX3FtX2ZyZWVsaXN0X2xvY2tfbm93YWl0KHhmc19HcW0pKSB7CisJCXhmc19kcXRyYWNlX2VudHJ5KGRxcCwgIkRRUFVUOiBGTExPQ0stV0FJVCIpOworCQl4ZnNfZHF1bmxvY2soZHFwKTsKKwkJeGZzX3FtX2ZyZWVsaXN0X2xvY2soeGZzX0dxbSk7CisJCXhmc19kcWxvY2soZHFwKTsKKwl9CisKKwl3aGlsZSAoMSkgeworCQlnZHFwID0gTlVMTDsKKworCQkvKiBXZSBjYW4ndCBkZXBlbmQgb24gbnJlZnMgYmVpbmcgPT0gMSBoZXJlICovCisJCWlmICgtLWRxcC0+cV9ucmVmcyA9PSAwKSB7CisJCQl4ZnNfZHF0cmFjZV9lbnRyeShkcXAsICJEUVBVVDogT04gRlJFRUxJU1QiKTsKKwkJCS8qCisJCQkgKiBpbnNlcnQgYXQgZW5kIG9mIHRoZSBmcmVlbGlzdC4KKwkJCSAqLworCQkJWFFNX0ZSRUVMSVNUX0lOU0VSVCgmKHhmc19HcW0tPnFtX2RxZnJlZWxpc3QpLCBkcXApOworCisJCQkvKgorCQkJICogSWYgd2UganVzdCBhZGRlZCBhIHVkcXVvdCB0byB0aGUgZnJlZWxpc3QsIHRoZW4KKwkJCSAqIHdlIHdhbnQgdG8gcmVsZWFzZSB0aGUgZ2RxdW90IHJlZmVyZW5jZSB0aGF0CisJCQkgKiBpdCAocHJvYmFibHkpIGhhcy4gT3RoZXJ3aXNlIGl0J2xsIGtlZXAgdGhlCisJCQkgKiBnZHF1b3QgZnJvbSBnZXR0aW5nIHJlY2xhaW1lZC4KKwkJCSAqLworCQkJaWYgKChnZHFwID0gZHFwLT5xX2dkcXVvdCkpIHsKKwkJCQkvKgorCQkJCSAqIEF2b2lkIGEgcmVjdXJzaXZlIGRxcHV0IGNhbGwKKwkJCQkgKi8KKwkJCQl4ZnNfZHFsb2NrKGdkcXApOworCQkJCWRxcC0+cV9nZHF1b3QgPSBOVUxMOworCQkJfQorCisJCQkvKiB4ZnNfcW1fZnJlZWxpc3RfcHJpbnQoJih4ZnNfR3FtLT5xbV9kcWZyZWVsaXN0KSwKKwkJCSAgICJAQEBAQCsrIEZyZWUgbGlzdCAoYWZ0ZXIgYXBwZW5kKSBAQEBAQCsiKTsKKwkJCSAgICovCisJCX0KKwkJeGZzX2RxdW5sb2NrKGRxcCk7CisKKwkJLyoKKwkJICogSWYgd2UgaGFkIGEgZ3JvdXAgcXVvdGEgaW5zaWRlIHRoZSB1c2VyIHF1b3RhIGFzIGEgaGludCwKKwkJICogcmVsZWFzZSBpdCBub3cuCisJCSAqLworCQlpZiAoISBnZHFwKQorCQkJYnJlYWs7CisJCWRxcCA9IGdkcXA7CisJfQorCXhmc19xbV9mcmVlbGlzdF91bmxvY2soeGZzX0dxbSk7Cit9CisKKy8qCisgKiBSZWxlYXNlIGEgZHF1b3QuIEZsdXNoIGl0IGlmIGRpcnR5LCB0aGVuIGRxcHV0KCkgaXQuCisgKiBkcXVvdCBtdXN0IG5vdCBiZSBsb2NrZWQuCisgKi8KK3ZvaWQKK3hmc19xbV9kcXJlbGUoCisJeGZzX2RxdW90X3QJKmRxcCkKK3sKKwlBU1NFUlQoZHFwKTsKKwl4ZnNfZHF0cmFjZV9lbnRyeShkcXAsICJEUVJFTEUiKTsKKworCXhmc19kcWxvY2soZHFwKTsKKwkvKgorCSAqIFdlIGRvbid0IGNhcmUgdG8gZmx1c2ggaXQgaWYgdGhlIGRxdW90IGlzIGRpcnR5IGhlcmUuCisJICogVGhhdCB3aWxsIGNyZWF0ZSBzdHV0dGVycyB0aGF0IHdlIHdhbnQgdG8gYXZvaWQuCisJICogSW5zdGVhZCB3ZSBkbyBhIGRlbGF5ZWQgd3JpdGUgd2hlbiB3ZSB0cnkgdG8gcmVjbGFpbQorCSAqIGEgZGlydHkgZHF1b3QuIEFsc28geGZzX3N5bmMgd2lsbCB0YWtlIHBhcnQgb2YgdGhlIGJ1cmRlbi4uLgorCSAqLworCXhmc19xbV9kcXB1dChkcXApOworfQorCisKKy8qCisgKiBXcml0ZSBhIG1vZGlmaWVkIGRxdW90IHRvIGRpc2suCisgKiBUaGUgZHF1b3QgbXVzdCBiZSBsb2NrZWQgYW5kIHRoZSBmbHVzaCBsb2NrIHRvbyB0YWtlbiBieSBjYWxsZXIuCisgKiBUaGUgZmx1c2ggbG9jayB3aWxsIG5vdCBiZSB1bmxvY2tlZCB1bnRpbCB0aGUgZHF1b3QgcmVhY2hlcyB0aGUgZGlzaywKKyAqIGJ1dCB0aGUgZHF1b3QgaXMgZnJlZSB0byBiZSB1bmxvY2tlZCBhbmQgbW9kaWZpZWQgYnkgdGhlIGNhbGxlcgorICogaW4gdGhlIGludGVyaW0uIERxdW90IGlzIHN0aWxsIGxvY2tlZCBvbiByZXR1cm4uIFRoaXMgYmVoYXZpb3IgaXMKKyAqIGlkZW50aWNhbCB0byB0aGF0IG9mIGlub2Rlcy4KKyAqLworaW50Cit4ZnNfcW1fZHFmbHVzaCgKKwl4ZnNfZHF1b3RfdAkJKmRxcCwKKwl1aW50CQkJZmxhZ3MpCit7CisJeGZzX21vdW50X3QJCSptcDsKKwl4ZnNfYnVmX3QJCSpicDsKKwl4ZnNfZGlza19kcXVvdF90CSpkZHFwOworCWludAkJCWVycm9yOworCVNQTERFQ0wocyk7CisKKwlBU1NFUlQoWEZTX0RRX0lTX0xPQ0tFRChkcXApKTsKKwlBU1NFUlQoWEZTX0RRX0lTX0ZMVVNIX0xPQ0tFRChkcXApKTsKKwl4ZnNfZHF0cmFjZV9lbnRyeShkcXAsICJEUUZMVVNIIik7CisKKwkvKgorCSAqIElmIG5vdCBkaXJ0eSwgbmFkYS4KKwkgKi8KKwlpZiAoIVhGU19EUV9JU19ESVJUWShkcXApKSB7CisJCXhmc19kcWZ1bmxvY2soZHFwKTsKKwkJcmV0dXJuICgwKTsKKwl9CisKKwkvKgorCSAqIENhbnQgZmx1c2ggYSBwaW5uZWQgZHF1b3QuIFdhaXQgZm9yIGl0LgorCSAqLworCXhmc19xbV9kcXVucGluX3dhaXQoZHFwKTsKKworCS8qCisJICogVGhpcyBtYXkgaGF2ZSBiZWVuIHVucGlubmVkIGJlY2F1c2UgdGhlIGZpbGVzeXN0ZW0gaXMgc2h1dHRpbmcKKwkgKiBkb3duIGZvcmNpYmx5LiBJZiB0aGF0J3MgdGhlIGNhc2Ugd2UgbXVzdCBub3Qgd3JpdGUgdGhpcyBkcXVvdAorCSAqIHRvIGRpc2ssIGJlY2F1c2UgdGhlIGxvZyByZWNvcmQgZGlkbid0IG1ha2UgaXQgdG8gZGlzayEKKwkgKi8KKwlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihkcXAtPnFfbW91bnQpKSB7CisJCWRxcC0+ZHFfZmxhZ3MgJj0gfihYRlNfRFFfRElSVFkpOworCQl4ZnNfZHFmdW5sb2NrKGRxcCk7CisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKwl9CisKKwkvKgorCSAqIEdldCB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIG9uLWRpc2sgZHF1b3QKKwkgKiBXZSBkb24ndCBuZWVkIGEgdHJhbnNhY3Rpb24gZW52ZWxvcGUgYmVjYXVzZSB3ZSBrbm93IHRoYXQgdGhlCisJICogdGhlIG9uZGlzay1kcXVvdCBoYXMgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBmb3IuCisJICovCisJaWYgKChlcnJvciA9IHhmc19xbV9kcXRvYnAoTlVMTCwgZHFwLCAmZGRxcCwgJmJwLCBYRlNfUU1PUFRfRE9XQVJOKSkpIHsKKwkJeGZzX2RxdHJhY2VfZW50cnkoZHFwLCAiRFFUT0JQIEZBSUwiKTsKKwkJQVNTRVJUKGVycm9yICE9IEVOT0VOVCk7CisJCS8qCisJCSAqIFF1b3RhcyBjb3VsZCBoYXZlIGdvdHRlbiB0dXJuZWQgb2ZmIChFU1JDSCkKKwkJICovCisJCXhmc19kcWZ1bmxvY2soZHFwKTsKKwkJcmV0dXJuIChlcnJvcik7CisJfQorCisJaWYgKHhmc19xbV9kcWNoZWNrKCZkcXAtPnFfY29yZSwgSU5UX0dFVChkZHFwLT5kX2lkLCBBUkNIX0NPTlZFUlQpLCAwLCBYRlNfUU1PUFRfRE9XQVJOLAorCQkJICAgImRxZmx1c2ggKGluY29yZSBjb3B5KSIpKSB7CisJCXhmc19mb3JjZV9zaHV0ZG93bihkcXAtPnFfbW91bnQsIFhGU19DT1JSVVBUX0lOQ09SRSk7CisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKwl9CisKKwkvKiBUaGlzIGlzIHRoZSBvbmx5IHBvcnRpb24gb2YgZGF0YSB0aGF0IG5lZWRzIHRvIHBlcnNpc3QgKi8KKwltZW1jcHkoZGRxcCwgJihkcXAtPnFfY29yZSksIHNpemVvZih4ZnNfZGlza19kcXVvdF90KSk7CisKKwkvKgorCSAqIENsZWFyIHRoZSBkaXJ0eSBmaWVsZCBhbmQgcmVtZW1iZXIgdGhlIGZsdXNoIGxzbiBmb3IgbGF0ZXIgdXNlLgorCSAqLworCWRxcC0+ZHFfZmxhZ3MgJj0gfihYRlNfRFFfRElSVFkpOworCW1wID0gZHFwLT5xX21vdW50OworCisJLyogbHNuIGlzIDY0IGJpdHMgKi8KKwlBSUxfTE9DSyhtcCwgcyk7CisJZHFwLT5xX2xvZ2l0ZW0ucWxpX2ZsdXNoX2xzbiA9IGRxcC0+cV9sb2dpdGVtLnFsaV9pdGVtLmxpX2xzbjsKKwlBSUxfVU5MT0NLKG1wLCBzKTsKKworCS8qCisJICogQXR0YWNoIGFuIGlvZG9uZSByb3V0aW5lIHNvIHRoYXQgd2UgY2FuIHJlbW92ZSB0aGlzIGRxdW90IGZyb20gdGhlCisJICogQUlMIGFuZCByZWxlYXNlIHRoZSBmbHVzaCBsb2NrIG9uY2UgdGhlIGRxdW90IGlzIHN5bmNlZCB0byBkaXNrLgorCSAqLworCXhmc19idWZfYXR0YWNoX2lvZG9uZShicCwgKHZvaWQoKikoeGZzX2J1Zl90ICosIHhmc19sb2dfaXRlbV90ICopKQorCQkJICAgICAgeGZzX3FtX2RxZmx1c2hfZG9uZSwgJihkcXAtPnFfbG9naXRlbS5xbGlfaXRlbSkpOworCS8qCisJICogSWYgdGhlIGJ1ZmZlciBpcyBwaW5uZWQgdGhlbiBwdXNoIG9uIHRoZSBsb2cgc28gd2Ugd29uJ3QKKwkgKiBnZXQgc3R1Y2sgd2FpdGluZyBpbiB0aGUgd3JpdGUgZm9yIHRvbyBsb25nLgorCSAqLworCWlmIChYRlNfQlVGX0lTUElOTkVEKGJwKSkgeworCQl4ZnNfZHF0cmFjZV9lbnRyeShkcXAsICJEUUZMVVNIIExPRyBGT1JDRSIpOworCQl4ZnNfbG9nX2ZvcmNlKG1wLCAoeGZzX2xzbl90KTAsIFhGU19MT0dfRk9SQ0UpOworCX0KKworCWlmIChmbGFncyAmIFhGU19RTU9QVF9ERUxXUkkpIHsKKwkJeGZzX2Jkd3JpdGUobXAsIGJwKTsKKwl9IGVsc2UgaWYgKGZsYWdzICYgWEZTX1FNT1BUX0FTWU5DKSB7CisJCXhmc19iYXdyaXRlKG1wLCBicCk7CisJfSBlbHNlIHsKKwkJZXJyb3IgPSB4ZnNfYndyaXRlKG1wLCBicCk7CisJfQorCXhmc19kcXRyYWNlX2VudHJ5KGRxcCwgIkRRRkxVU0ggRU5EIik7CisJLyoKKwkgKiBkcXAgaXMgc3RpbGwgbG9ja2VkLCBidXQgY2FsbGVyIGlzIGZyZWUgdG8gdW5sb2NrIGl0IG5vdy4KKwkgKi8KKwlyZXR1cm4gKGVycm9yKTsKKworfQorCisvKgorICogVGhpcyBpcyB0aGUgZHF1b3QgZmx1c2hpbmcgSS9PIGNvbXBsZXRpb24gcm91dGluZS4gIEl0IGlzIGNhbGxlZAorICogZnJvbSBpbnRlcnJ1cHQgbGV2ZWwgd2hlbiB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGRxdW90IGlzCisgKiBmbHVzaGVkIHRvIGRpc2suICBJdCBpcyByZXNwb25zaWJsZSBmb3IgcmVtb3ZpbmcgdGhlIGRxdW90IGxvZ2l0ZW0KKyAqIGZyb20gdGhlIEFJTCBpZiBpdCBoYXMgbm90IGJlZW4gcmUtbG9nZ2VkLCBhbmQgdW5sb2NraW5nIHRoZSBkcXVvdCdzCisgKiBmbHVzaCBsb2NrLiBUaGlzIGJlaGF2aW9yIGlzIHZlcnkgc2ltaWxhciB0byB0aGF0IG9mIGlub2Rlcy4uCisgKi8KKy8qQVJHU1VTRUQqLworU1RBVElDIHZvaWQKK3hmc19xbV9kcWZsdXNoX2RvbmUoCisJeGZzX2J1Zl90CQkqYnAsCisJeGZzX2RxX2xvZ2l0ZW1fdAkqcWlwKQoreworCXhmc19kcXVvdF90CQkqZHFwOworCVNQTERFQ0wocyk7CisKKwlkcXAgPSBxaXAtPnFsaV9kcXVvdDsKKworCS8qCisJICogV2Ugb25seSB3YW50IHRvIHB1bGwgdGhlIGl0ZW0gZnJvbSB0aGUgQUlMIGlmIGl0cworCSAqIGxvY2F0aW9uIGluIHRoZSBsb2cgaGFzIG5vdCBjaGFuZ2VkIHNpbmNlIHdlIHN0YXJ0ZWQgdGhlIGZsdXNoLgorCSAqIFRodXMsIHdlIG9ubHkgYm90aGVyIGlmIHRoZSBkcXVvdCdzIGxzbiBoYXMKKwkgKiBub3QgY2hhbmdlZC4gRmlyc3Qgd2UgY2hlY2sgdGhlIGxzbiBvdXRzaWRlIHRoZSBsb2NrCisJICogc2luY2UgaXQncyBjaGVhcGVyLCBhbmQgdGhlbiB3ZSByZWNoZWNrIHdoaWxlCisJICogaG9sZGluZyB0aGUgbG9jayBiZWZvcmUgcmVtb3ZpbmcgdGhlIGRxdW90IGZyb20gdGhlIEFJTC4KKwkgKi8KKwlpZiAoKHFpcC0+cWxpX2l0ZW0ubGlfZmxhZ3MgJiBYRlNfTElfSU5fQUlMKSAmJgorCSAgICBxaXAtPnFsaV9pdGVtLmxpX2xzbiA9PSBxaXAtPnFsaV9mbHVzaF9sc24pIHsKKworCQlBSUxfTE9DSyhkcXAtPnFfbW91bnQsIHMpOworCQkvKgorCQkgKiB4ZnNfdHJhbnNfZGVsZXRlX2FpbCgpIGRyb3BzIHRoZSBBSUwgbG9jay4KKwkJICovCisJCWlmIChxaXAtPnFsaV9pdGVtLmxpX2xzbiA9PSBxaXAtPnFsaV9mbHVzaF9sc24pCisJCQl4ZnNfdHJhbnNfZGVsZXRlX2FpbChkcXAtPnFfbW91bnQsCisJCQkJCSAgICAgKHhmc19sb2dfaXRlbV90KilxaXAsIHMpOworCQllbHNlCisJCQlBSUxfVU5MT0NLKGRxcC0+cV9tb3VudCwgcyk7CisJfQorCisJLyoKKwkgKiBSZWxlYXNlIHRoZSBkcSdzIGZsdXNoIGxvY2sgc2luY2Ugd2UncmUgZG9uZSB3aXRoIGl0LgorCSAqLworCXhmc19kcWZ1bmxvY2soZHFwKTsKK30KKworCitpbnQKK3hmc19xbV9kcWZsb2NrX25vd2FpdCgKKwl4ZnNfZHF1b3RfdCAqZHFwKQoreworCWludCBsb2NrZWQ7CisKKwlsb2NrZWQgPSBjcHNlbWEoJigoZHFwKS0+cV9mbG9jaykpOworCisJLyogWFhYIGlmZGVmIHRoZXNlIG91dCAqLworCWlmIChsb2NrZWQpCisJCShkcXApLT5kcV9mbGFncyB8PSBYRlNfRFFfRkxPQ0tFRDsKKwlyZXR1cm4gKGxvY2tlZCk7Cit9CisKKworaW50Cit4ZnNfcW1fZHFsb2NrX25vd2FpdCgKKwl4ZnNfZHF1b3RfdCAqZHFwKQoreworCXJldHVybiAobXV0ZXhfdHJ5bG9jaygmKChkcXApLT5xX3Fsb2NrKSkpOworfQorCit2b2lkCit4ZnNfZHFsb2NrKAorCXhmc19kcXVvdF90ICpkcXApCit7CisJbXV0ZXhfbG9jaygmKGRxcC0+cV9xbG9jayksIFBJTk9EKTsKK30KKwordm9pZAoreGZzX2RxdW5sb2NrKAorCXhmc19kcXVvdF90ICpkcXApCit7CisJbXV0ZXhfdW5sb2NrKCYoZHFwLT5xX3Fsb2NrKSk7CisJaWYgKGRxcC0+cV9sb2dpdGVtLnFsaV9kcXVvdCA9PSBkcXApIHsKKwkJLyogT25jZSB3YXMgZHFwLT5xX21vdW50LCBidXQgbWlnaHQganVzdCBoYXZlIGJlZW4gY2xlYXJlZCAqLworCQl4ZnNfdHJhbnNfdW5sb2NrZWRfaXRlbShkcXAtPnFfbG9naXRlbS5xbGlfaXRlbS5saV9tb3VudHAsCisJCQkJCSh4ZnNfbG9nX2l0ZW1fdCopJihkcXAtPnFfbG9naXRlbSkpOworCX0KK30KKworCit2b2lkCit4ZnNfZHF1bmxvY2tfbm9ub3RpZnkoCisJeGZzX2RxdW90X3QgKmRxcCkKK3sKKwltdXRleF91bmxvY2soJihkcXAtPnFfcWxvY2spKTsKK30KKwordm9pZAoreGZzX2RxbG9jazIoCisJeGZzX2RxdW90X3QJKmQxLAorCXhmc19kcXVvdF90CSpkMikKK3sKKwlpZiAoZDEgJiYgZDIpIHsKKwkJQVNTRVJUKGQxICE9IGQyKTsKKwkJaWYgKElOVF9HRVQoZDEtPnFfY29yZS5kX2lkLCBBUkNIX0NPTlZFUlQpID4gSU5UX0dFVChkMi0+cV9jb3JlLmRfaWQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJCXhmc19kcWxvY2soZDIpOworCQkJeGZzX2RxbG9jayhkMSk7CisJCX0gZWxzZSB7CisJCQl4ZnNfZHFsb2NrKGQxKTsKKwkJCXhmc19kcWxvY2soZDIpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGQxKSB7CisJCQl4ZnNfZHFsb2NrKGQxKTsKKwkJfSBlbHNlIGlmIChkMikgeworCQkJeGZzX2RxbG9jayhkMik7CisJCX0KKwl9Cit9CisKKworLyoKKyAqIFRha2UgYSBkcXVvdCBvdXQgb2YgdGhlIG1vdW50J3MgZHFsaXN0IGFzIHdlbGwgYXMgdGhlIGhhc2hsaXN0LgorICogVGhpcyBpcyBjYWxsZWQgdmlhIHVubW91bnQgYXMgd2VsbCBhcyBxdW90YW9mZiwgYW5kIHRoZSBwdXJnZQorICogd2lsbCBhbHdheXMgc3VjY2VlZCB1bmxlc3MgdGhlcmUgYXJlIHNvZnQgKHRlbXApIHJlZmVyZW5jZXMKKyAqIG91dHN0YW5kaW5nLgorICoKKyAqIFRoaXMgcmV0dXJucyAwIGlmIGl0IHdhcyBwdXJnZWQsIDEgaWYgaXQgd2Fzbid0LiBJdCdzIG5vdCBhbiBlcnJvciBjb2RlCisgKiB0aGF0IHdlJ3JlIHJldHVybmluZyEgWFhYc3VwIC0gbm90IGNvb2wuCisgKi8KKy8qIEFSR1NVU0VEICovCitpbnQKK3hmc19xbV9kcXB1cmdlKAorCXhmc19kcXVvdF90CSpkcXAsCisJdWludAkJZmxhZ3MpCit7CisJeGZzX2RxaGFzaF90CSp0aGlzaGFzaDsKKwl4ZnNfbW91bnRfdAkqbXA7CisKKwltcCA9IGRxcC0+cV9tb3VudDsKKworCUFTU0VSVChYRlNfUU1fSVNfTVBMSVNUX0xPQ0tFRChtcCkpOworCUFTU0VSVChYRlNfRFFfSVNfSEFTSF9MT0NLRUQoZHFwLT5xX2hhc2gpKTsKKworCXhmc19kcWxvY2soZHFwKTsKKwkvKgorCSAqIFdlIHJlYWxseSBjYW4ndCBhZmZvcmQgdG8gcHVyZ2UgYSBkcXVvdCB0aGF0IGlzCisJICogcmVmZXJlbmNlZCwgYmVjYXVzZSB0aGVzZSBhcmUgaGFyZCByZWZzLgorCSAqIEl0IHNob3VsZG4ndCBoYXBwZW4gaW4gZ2VuZXJhbCBiZWNhdXNlIHdlIHdlbnQgdGhydSBfYWxsXyBpbm9kZXMgaW4KKwkgKiBkcXJlbGVfYWxsX2lub2RlcyBiZWZvcmUgY2FsbGluZyB0aGlzIGFuZCBkaWRuJ3QgbGV0IHRoZSBtb3VudGxvY2sgZ28uCisJICogSG93ZXZlciBpdCBpcyBwb3NzaWJsZSB0aGF0IHdlIGhhdmUgZHF1b3RzIHdpdGggdGVtcG9yYXJ5CisJICogcmVmZXJlbmNlcyB0aGF0IGFyZSBub3QgYXR0YWNoZWQgdG8gYW4gaW5vZGUuIGUuZy4gc2VlIHhmc19zZXRhdHRyKCkuCisJICovCisJaWYgKGRxcC0+cV9ucmVmcyAhPSAwKSB7CisJCXhmc19kcXVubG9jayhkcXApOworCQlYRlNfRFFfSEFTSF9VTkxPQ0soZHFwLT5xX2hhc2gpOworCQlyZXR1cm4gKDEpOworCX0KKworCUFTU0VSVChYRlNfRFFfSVNfT05fRlJFRUxJU1QoZHFwKSk7CisKKwkvKgorCSAqIElmIHdlJ3JlIHR1cm5pbmcgb2ZmIHF1b3Rhcywgd2UgaGF2ZSB0byBtYWtlIHN1cmUgdGhhdCwgZm9yCisJICogZXhhbXBsZSwgd2UgZG9uJ3QgZGVsZXRlIHF1b3RhIGRpc2sgYmxvY2tzIHdoaWxlIGRxdW90cyBhcmUKKwkgKiBpbiB0aGUgcHJvY2VzcyBvZiBnZXR0aW5nIHdyaXR0ZW4gdG8gdGhvc2UgZGlzayBibG9ja3MuCisJICogVGhpcyBkcXVvdCBtaWdodCB3ZWxsIGJlIG9uIEFJTCwgYW5kIHdlIGNhbid0IGxlYXZlIGl0IHRoZXJlCisJICogaWYgd2UncmUgdHVybmluZyBvZmYgcXVvdGFzLiBCYXNpY2FsbHksIHdlIG5lZWQgdGhpcyBmbHVzaAorCSAqIGxvY2ssIGFuZCBhcmUgd2lsbGluZyB0byBibG9jayBvbiBpdC4KKwkgKi8KKwlpZiAoISB4ZnNfcW1fZHFmbG9ja19ub3dhaXQoZHFwKSkgeworCQkvKgorCQkgKiBCbG9jayBvbiB0aGUgZmx1c2ggbG9jayBhZnRlciBudWRnaW5nIGRxdW90IGJ1ZmZlciwKKwkJICogaWYgaXQgaXMgaW5jb3JlLgorCQkgKi8KKwkJeGZzX3FtX2RxZmxvY2tfcHVzaGJ1Zl93YWl0KGRxcCk7CisJfQorCisJLyoKKwkgKiBYWFhJZiB3ZSdyZSB0dXJuaW5nIHRoaXMgdHlwZSBvZiBxdW90YXMgb2ZmLCB3ZSBkb24ndCBjYXJlCisJICogYWJvdXQgdGhlIGRpcnR5IG1ldGFkYXRhIHNpdHRpbmcgaW4gdGhpcyBkcXVvdC4gT1RPSCwgaWYKKwkgKiB3ZSdyZSB1bm1vdW50aW5nLCB3ZSBkbyBjYXJlLCBzbyB3ZSBmbHVzaCBpdCBhbmQgd2FpdC4KKwkgKi8KKwlpZiAoWEZTX0RRX0lTX0RJUlRZKGRxcCkpIHsKKwkJeGZzX2RxdHJhY2VfZW50cnkoZHFwLCAiRFFQVVJHRSAtPkRRRkxVU0g6IERRRElSVFkiKTsKKwkJLyogZHFmbHVzaCB1bmxvY2tzIGRxZmxvY2sgKi8KKwkJLyoKKwkJICogR2l2ZW4gdGhhdCBkcXB1cmdlIGlzIGEgdmVyeSByYXJlIG9jY3VycmVuY2UsIGl0IGlzIE9LCisJCSAqIHRoYXQgd2UncmUgaG9sZGluZyB0aGUgaGFzaGxpc3QgYW5kIG1wbGlzdCBsb2NrcworCQkgKiBhY3Jvc3MgdGhlIGRpc2sgd3JpdGUuIEJ1dCwgLi4uIFhYWHN1cAorCQkgKgorCQkgKiBXZSBkb24ndCBjYXJlIGFib3V0IGdldHRpbmcgZGlzayBlcnJvcnMgaGVyZS4gV2UgbmVlZAorCQkgKiB0byBwdXJnZSB0aGlzIGRxdW90IGFueXdheSwgc28gd2UgZ28gYWhlYWQgcmVnYXJkbGVzcy4KKwkJICovCisJCSh2b2lkKSB4ZnNfcW1fZHFmbHVzaChkcXAsIFhGU19RTU9QVF9TWU5DKTsKKwkJeGZzX2RxZmxvY2soZHFwKTsKKwl9CisJQVNTRVJUKGRxcC0+cV9waW5jb3VudCA9PSAwKTsKKwlBU1NFUlQoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkgfHwKKwkgICAgICAgIShkcXAtPnFfbG9naXRlbS5xbGlfaXRlbS5saV9mbGFncyAmIFhGU19MSV9JTl9BSUwpKTsKKworCXRoaXNoYXNoID0gZHFwLT5xX2hhc2g7CisJWFFNX0hBU0hMSVNUX1JFTU9WRSh0aGlzaGFzaCwgZHFwKTsKKwlYUU1fTVBMSVNUX1JFTU9WRSgmKFhGU19RSV9NUExfTElTVChtcCkpLCBkcXApOworCS8qCisJICogWFhYIE1vdmUgdGhpcyB0byB0aGUgZnJvbnQgb2YgdGhlIGZyZWVsaXN0LCBpZiB3ZSBjYW4gZ2V0IHRoZQorCSAqIGZyZWVsaXN0IGxvY2suCisJICovCisJQVNTRVJUKFhGU19EUV9JU19PTl9GUkVFTElTVChkcXApKTsKKworCWRxcC0+cV9tb3VudCA9IE5VTEw7CisJZHFwLT5xX2hhc2ggPSBOVUxMOworCWRxcC0+ZHFfZmxhZ3MgPSBYRlNfRFFfSU5BQ1RJVkU7CisJbWVtc2V0KCZkcXAtPnFfY29yZSwgMCwgc2l6ZW9mKGRxcC0+cV9jb3JlKSk7CisJeGZzX2RxZnVubG9jayhkcXApOworCXhmc19kcXVubG9jayhkcXApOworCVhGU19EUV9IQVNIX1VOTE9DSyh0aGlzaGFzaCk7CisJcmV0dXJuICgwKTsKK30KKworCisjaWZkZWYgUVVPVEFERUJVRwordm9pZAoreGZzX3FtX2RxcHJpbnQoeGZzX2RxdW90X3QgKmRxcCkKK3sKKwljbW5fZXJyKENFX0RFQlVHLCAiLS0tLS0tLS0tLS1LRVJORUwgRFFVT1QtLS0tLS0tLS0tLS0tLS0tIik7CisJY21uX2VycihDRV9ERUJVRywgIi0tLS0gZHF1b3RJRCA9ICAlZCIsCisJCShpbnQpSU5UX0dFVChkcXAtPnFfY29yZS5kX2lkLCBBUkNIX0NPTlZFUlQpKTsKKwljbW5fZXJyKENFX0RFQlVHLCAiLS0tLSB0eXBlICAgID0gICVzIiwKKwkJWEZTX1FNX0lTVURRKGRxcCkgPyAiVVNSIiA6ICJHUlAiKTsKKwljbW5fZXJyKENFX0RFQlVHLCAiLS0tLSBmcyAgICAgID0gIDB4JXAiLCBkcXAtPnFfbW91bnQpOworCWNtbl9lcnIoQ0VfREVCVUcsICItLS0tIGJsa25vICAgPSAgMHgleCIsIChpbnQpIGRxcC0+cV9ibGtubyk7CisJY21uX2VycihDRV9ERUJVRywgIi0tLS0gYm9mZnNldCA9ICAweCV4IiwgKGludCkgZHFwLT5xX2J1Zm9mZnNldCk7CisJY21uX2VycihDRV9ERUJVRywgIi0tLS0gYmxraGxpbWl0ID0gICVMdSAoMHgleCkiLAorCQlJTlRfR0VUKGRxcC0+cV9jb3JlLmRfYmxrX2hhcmRsaW1pdCwgQVJDSF9DT05WRVJUKSwKKwkJKGludCkgSU5UX0dFVChkcXAtPnFfY29yZS5kX2Jsa19oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCkpOworCWNtbl9lcnIoQ0VfREVCVUcsICItLS0tIGJsa3NsaW1pdCA9ICAlTHUgKDB4JXgpIiwKKwkJSU5UX0dFVChkcXAtPnFfY29yZS5kX2Jsa19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCksCisJCShpbnQpSU5UX0dFVChkcXAtPnFfY29yZS5kX2Jsa19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkpOworCWNtbl9lcnIoQ0VfREVCVUcsICItLS0tIGlub2hsaW1pdCA9ICAlTHUgKDB4JXgpIiwKKwkJSU5UX0dFVChkcXAtPnFfY29yZS5kX2lub19oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCksCisJCShpbnQpSU5UX0dFVChkcXAtPnFfY29yZS5kX2lub19oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCkpOworCWNtbl9lcnIoQ0VfREVCVUcsICItLS0tIGlub3NsaW1pdCA9ICAlTHUgKDB4JXgpIiwKKwkJSU5UX0dFVChkcXAtPnFfY29yZS5kX2lub19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCksCisJCShpbnQpSU5UX0dFVChkcXAtPnFfY29yZS5kX2lub19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkpOworCWNtbl9lcnIoQ0VfREVCVUcsICItLS0tIGJjb3VudCAgPSAgJUx1ICgweCV4KSIsCisJCUlOVF9HRVQoZHFwLT5xX2NvcmUuZF9iY291bnQsIEFSQ0hfQ09OVkVSVCksCisJCShpbnQpSU5UX0dFVChkcXAtPnFfY29yZS5kX2Jjb3VudCwgQVJDSF9DT05WRVJUKSk7CisJY21uX2VycihDRV9ERUJVRywgIi0tLS0gaWNvdW50ICA9ICAlTHUgKDB4JXgpIiwKKwkJSU5UX0dFVChkcXAtPnFfY29yZS5kX2ljb3VudCwgQVJDSF9DT05WRVJUKSwKKwkJKGludClJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaWNvdW50LCBBUkNIX0NPTlZFUlQpKTsKKwljbW5fZXJyKENFX0RFQlVHLCAiLS0tLSBidGltZXIgID0gICVkIiwKKwkJKGludClJTlRfR0VUKGRxcC0+cV9jb3JlLmRfYnRpbWVyLCBBUkNIX0NPTlZFUlQpKTsKKwljbW5fZXJyKENFX0RFQlVHLCAiLS0tLSBpdGltZXIgID0gICVkIiwKKwkJKGludClJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaXRpbWVyLCBBUkNIX0NPTlZFUlQpKTsKKwljbW5fZXJyKENFX0RFQlVHLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Cit9CisjZW5kaWYKKworLyoKKyAqIEdpdmUgdGhlIGJ1ZmZlciBhIGxpdHRsZSBwdXNoIGlmIGl0IGlzIGluY29yZSBhbmQKKyAqIHdhaXQgb24gdGhlIGZsdXNoIGxvY2suCisgKi8KK3ZvaWQKK3hmc19xbV9kcWZsb2NrX3B1c2hidWZfd2FpdCgKKwl4ZnNfZHF1b3RfdAkqZHFwKQoreworCXhmc19idWZfdAkqYnA7CisKKwkvKgorCSAqIENoZWNrIHRvIHNlZSBpZiB0aGUgZHF1b3QgaGFzIGJlZW4gZmx1c2hlZCBkZWxheWVkCisJICogd3JpdGUuICBJZiBzbywgZ3JhYiBpdHMgYnVmZmVyIGFuZCBzZW5kIGl0CisJICogb3V0IGltbWVkaWF0ZWx5LiAgV2UnbGwgYmUgYWJsZSB0byBhY3F1aXJlCisJICogdGhlIGZsdXNoIGxvY2sgd2hlbiB0aGUgSS9PIGNvbXBsZXRlcy4KKwkgKi8KKwlicCA9IHhmc19pbmNvcmUoZHFwLT5xX21vdW50LT5tX2RkZXZfdGFyZ3AsIGRxcC0+cV9ibGtubywKKwkJICAgIFhGU19RSV9EUUNIVU5LTEVOKGRxcC0+cV9tb3VudCksCisJCSAgICBYRlNfSU5DT1JFX1RSWUxPQ0spOworCWlmIChicCAhPSBOVUxMKSB7CisJCWlmIChYRlNfQlVGX0lTREVMQVlXUklURShicCkpIHsKKwkJCWlmIChYRlNfQlVGX0lTUElOTkVEKGJwKSkgeworCQkJCXhmc19sb2dfZm9yY2UoZHFwLT5xX21vdW50LAorCQkJCQkgICAgICAoeGZzX2xzbl90KTAsCisJCQkJCSAgICAgIFhGU19MT0dfRk9SQ0UpOworCQkJfQorCQkJeGZzX2Jhd3JpdGUoZHFwLT5xX21vdW50LCBicCk7CisJCX0gZWxzZSB7CisJCQl4ZnNfYnVmX3JlbHNlKGJwKTsKKwkJfQorCX0KKwl4ZnNfZHFmbG9jayhkcXApOworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc19kcXVvdC5oIGIvZnMveGZzL3F1b3RhL3hmc19kcXVvdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjM2ZlMzEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvcXVvdGEveGZzX2RxdW90LmgKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuCSBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX0RRVU9UX0hfXworI2RlZmluZSBfX1hGU19EUVVPVF9IX18KKworLyoKKyAqIERxdW90cyBhcmUgc3RydWN0dXJlcyB0aGF0IGhvbGQgcXVvdGEgaW5mb3JtYXRpb24gYWJvdXQgYSB1c2VyIG9yIGEgZ3JvdXAsCisgKiBtdWNoIGxpa2UgaW5vZGVzIGFyZSBmb3IgZmlsZXMuIEluIGZhY3QsIGRxdW90cyBzaGFyZSBtYW55IGNoYXJhY3RlcmlzdGljcworICogd2l0aCBpbm9kZXMuIEhvd2V2ZXIsIGRxdW90cyBjYW4gYWxzbyBiZSBhIGNlbnRyYWxpemVkIHJlc291cmNlLCByZWxhdGl2ZQorICogdG8gYSBjb2xsZWN0aW9uIG9mIGlub2Rlcy4gSW4gdGhpcyByZXNwZWN0LCBkcXVvdHMgc2hhcmUgc29tZSBjaGFyYWN0ZXJpc3RpY3MKKyAqIG9mIHRoZSBzdXBlcmJsb2NrLgorICogWEZTIGRxdW90cyBleHBsb2l0IGJvdGggdGhvc2UgaW4gaXRzIGFsZ29yaXRobXMuIFRoZXkgbWFrZSBldmVyeSBhdHRlbXB0CisgKiB0byBub3QgYmUgYSBib3R0bGVuZWNrIHdoZW4gcXVvdGFzIGFyZSBvbiBhbmQgaGF2ZSBtaW5pbWFsIGltcGFjdCwgaWYgYW55LAorICogd2hlbiBxdW90YXMgYXJlIG9mZi4KKyAqLworCisvKgorICogVGhlIGhhc2ggY2hhaW4gaGVhZGVycyAoaGFzaCBidWNrZXRzKQorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZHFoYXNoIHsKKwlzdHJ1Y3QgeGZzX2RxdW90ICpxaF9uZXh0OworCW11dGV4X3QJCSAgcWhfbG9jazsKKwl1aW50CQkgIHFoX3ZlcnNpb247CS8qIGV2ZXIgaW5jcmVhc2luZyB2ZXJzaW9uICovCisJdWludAkJICBxaF9uZWxlbXM7CS8qIG51bWJlciBvZiBkcXVvdHMgb24gdGhlIGxpc3QgKi8KK30geGZzX2RxaGFzaF90OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfZHFsaW5rIHsKKwlzdHJ1Y3QgeGZzX2RxdW90ICAqcWxfbmV4dDsJLyogZm9yd2FyZCBsaW5rICovCisJc3RydWN0IHhmc19kcXVvdCAqKnFsX3ByZXZwOwkvKiBwb2ludGVyIHRvIHByZXYgcWxfbmV4dCAqLworfSB4ZnNfZHFsaW5rX3Q7CisKK3N0cnVjdCB4ZnNfbW91bnQ7CitzdHJ1Y3QgeGZzX3RyYW5zOworCisvKgorICogVGhpcyBpcyB0aGUgbWFya2VyIHdoaWNoIGlzIGRlc2lnbmVkIHRvIG9jY3VweSB0aGUgZmlyc3QgZmV3CisgKiBieXRlcyBvZiB0aGUgeGZzX2RxdW90X3Qgc3RydWN0dXJlLiBFdmVuIGluc2lkZSB0aGlzLCB0aGUgZnJlZWxpc3QgcG9pbnRlcnMKKyAqIG11c3QgY29tZSBmaXJzdC4KKyAqIFRoaXMgc2VydmVzIGFzIHRoZSBtYXJrZXIgKCJzZW50aW5lbCIpIHdoZW4gd2UgaGF2ZSB0byByZXN0YXJ0IGxpc3QKKyAqIGl0ZXJhdGlvbnMgYmVjYXVzZSBvZiBsb2NraW5nIGNvbnNpZGVyYXRpb25zLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZHFtYXJrZXIgeworCXN0cnVjdCB4ZnNfZHF1b3QqZHFtX2ZsbmV4dDsJLyogbGluayB0byBmcmVlbGlzdDogbXVzdCBiZSBmaXJzdCAqLworCXN0cnVjdCB4ZnNfZHF1b3QqZHFtX2ZscHJldjsKKwl4ZnNfZHFsaW5rX3QJIGRxbV9tcGxpc3Q7CS8qIGxpbmsgdG8gbW91bnQncyBsaXN0IG9mIGRxdW90cyAqLworCXhmc19kcWxpbmtfdAkgZHFtX2hhc2hsaXN0OwkvKiBsaW5rIHRvIHRoZSBoYXNoIGNoYWluICovCisJdWludAkJIGRxbV9mbGFnczsJLyogdmFyaW91cyBmbGFncyAoWEZTX0RRXyopICovCit9IHhmc19kcW1hcmtlcl90OworCisvKgorICogVGhlIGluY29yZSBkcXVvdCBzdHJ1Y3R1cmUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RxdW90IHsKKwl4ZnNfZHFtYXJrZXJfdAkgcV9saXN0czsJLyogbGlzdCBwdHJzLCBxX2ZsYWdzIChtYXJrZXIpICovCisJeGZzX2RxaGFzaF90CSpxX2hhc2g7CS8qIHRoZSBoYXNoY2hhaW4gaGVhZGVyICovCisJc3RydWN0IHhmc19tb3VudCpxX21vdW50OwkvKiBmaWxlc3lzdGVtIHRoaXMgcmVsYXRlcyB0byAqLworCXN0cnVjdCB4ZnNfdHJhbnMqcV90cmFuc3A7CS8qIHRyYW5zIHRoaXMgYmVsb25ncyB0byBjdXJyZW50bHkgKi8KKwl1aW50CQkgcV9ucmVmczsJLyogIyBhY3RpdmUgcmVmcyBmcm9tIGlub2RlcyAqLworCXhmc19kYWRkcl90CSBxX2Jsa25vOwkvKiBibGtubyBvZiBkcXVvdCBidWZmZXIgKi8KKwlpbnQJCSBxX2J1Zm9mZnNldDsJLyogb2ZmIG9mIGRxIGluIGJ1ZmZlciAoIyBkcXVvdHMpICovCisJeGZzX2ZpbGVvZmZfdAkgcV9maWxlb2Zmc2V0OwkvKiBvZmZzZXQgaW4gcXVvdGFzIGZpbGUgKi8KKworCXN0cnVjdCB4ZnNfZHF1b3QqcV9nZHF1b3Q7CS8qIGdyb3VwIGRxdW90LCBoaW50IG9ubHkgKi8KKwl4ZnNfZGlza19kcXVvdF90IHFfY29yZTsJLyogYWN0dWFsIHVzYWdlICYgcXVvdGFzICovCisJeGZzX2RxX2xvZ2l0ZW1fdCBxX2xvZ2l0ZW07CS8qIGRxdW90IGxvZyBpdGVtICovCisJeGZzX3FjbnRfdAkgcV9yZXNfYmNvdW50OwkvKiB0b3RhbCByZWd1bGFyIG5ibGtzIHVzZWQrcmVzZXJ2ZWQgKi8KKwl4ZnNfcWNudF90CSBxX3Jlc19pY291bnQ7CS8qIHRvdGFsIGlub3MgYWxsb2NkK3Jlc2VydmVkICovCisJeGZzX3FjbnRfdAkgcV9yZXNfcnRiY291bnQ7LyogdG90YWwgcmVhbHRpbWUgYmxrcyB1c2VkK3Jlc2VydmVkICovCisJbXV0ZXhfdAkJIHFfcWxvY2s7CS8qIHF1b3RhIGxvY2sgKi8KKwlzZW1hX3QJCSBxX2Zsb2NrOwkvKiBmbHVzaCBsb2NrICovCisJdWludAkJIHFfcGluY291bnQ7CS8qIHBpbiBjb3VudCBmb3IgdGhpcyBkcXVvdCAqLworCXN2X3QJCSBxX3BpbndhaXQ7CS8qIHN5bmMgdmFyIGZvciBwaW5uaW5nICovCisjaWZkZWYgWEZTX0RRVU9UX1RSQUNFCisJc3RydWN0IGt0cmFjZQkqcV90cmFjZTsJLyogdHJhY2UgaGVhZGVyIHN0cnVjdHVyZSAqLworI2VuZGlmCit9IHhmc19kcXVvdF90OworCisKKyNkZWZpbmUgZHFfZmxuZXh0CXFfbGlzdHMuZHFtX2ZsbmV4dAorI2RlZmluZSBkcV9mbHByZXYJcV9saXN0cy5kcW1fZmxwcmV2CisjZGVmaW5lIGRxX21wbGlzdAlxX2xpc3RzLmRxbV9tcGxpc3QKKyNkZWZpbmUgZHFfaGFzaGxpc3QJcV9saXN0cy5kcW1faGFzaGxpc3QKKyNkZWZpbmUgZHFfZmxhZ3MJcV9saXN0cy5kcW1fZmxhZ3MKKworI2RlZmluZSBYRlNfRFFIT0xEKGRxcCkJCSgoZHFwKS0+cV9ucmVmcysrKQorCisvKgorICogUXVvdGEgQWNjb3VudGluZyBmbGFncworICovCisjZGVmaW5lIFhGU19BTExfUVVPVEFfQUNDVAkoWEZTX1VRVU9UQV9BQ0NUIHwgWEZTX0dRVU9UQV9BQ0NUKQorI2RlZmluZSBYRlNfQUxMX1FVT1RBX0VORkQJKFhGU19VUVVPVEFfRU5GRCB8IFhGU19HUVVPVEFfRU5GRCkKKyNkZWZpbmUgWEZTX0FMTF9RVU9UQV9DSEtECShYRlNfVVFVT1RBX0NIS0QgfCBYRlNfR1FVT1RBX0NIS0QpCisjZGVmaW5lIFhGU19BTExfUVVPVEFfQUNUVgkoWEZTX1VRVU9UQV9BQ1RJVkUgfCBYRlNfR1FVT1RBX0FDVElWRSkKKyNkZWZpbmUgWEZTX0FMTF9RVU9UQV9BQ0NUX0VORkQgKFhGU19VUVVPVEFfQUNDVHxYRlNfVVFVT1RBX0VORkR8XAorCQkJCSBYRlNfR1FVT1RBX0FDQ1R8WEZTX0dRVU9UQV9FTkZEKQorCisjZGVmaW5lIFhGU19JU19RVU9UQV9SVU5OSU5HKG1wKSAgKChtcCktPm1fcWZsYWdzICYgWEZTX0FMTF9RVU9UQV9BQ0NUKQorI2RlZmluZSBYRlNfSVNfVVFVT1RBX1JVTk5JTkcobXApICgobXApLT5tX3FmbGFncyAmIFhGU19VUVVPVEFfQUNDVCkKKyNkZWZpbmUgWEZTX0lTX0dRVU9UQV9SVU5OSU5HKG1wKSAoKG1wKS0+bV9xZmxhZ3MgJiBYRlNfR1FVT1RBX0FDQ1QpCisKKy8qCisgKiBRdW90YSBMaW1pdCBFbmZvcmNlbWVudCBmbGFncworICovCisjZGVmaW5lIFhGU19JU19RVU9UQV9FTkZPUkNFRChtcCkJKChtcCktPm1fcWZsYWdzICYgWEZTX0FMTF9RVU9UQV9FTkZEKQorI2RlZmluZSBYRlNfSVNfVVFVT1RBX0VORk9SQ0VEKG1wKQkoKG1wKS0+bV9xZmxhZ3MgJiBYRlNfVVFVT1RBX0VORkQpCisjZGVmaW5lIFhGU19JU19HUVVPVEFfRU5GT1JDRUQobXApCSgobXApLT5tX3FmbGFncyAmIFhGU19HUVVPVEFfRU5GRCkKKworI2lmZGVmIERFQlVHCitzdGF0aWMgaW5saW5lIGludAorWEZTX0RRX0lTX0xPQ0tFRCh4ZnNfZHF1b3RfdCAqZHFwKQoreworCWlmIChtdXRleF90cnlsb2NrKCZkcXAtPnFfcWxvY2spKSB7CisJCW11dGV4X3VubG9jaygmZHFwLT5xX3Fsb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorI2VuZGlmCisKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgdGhyZWUgcm91dGluZXMgc2ltcGx5IG1hbmFnZSB0aGUgcV9mbG9jaworICogc2VtYXBob3JlIGVtYmVkZGVkIGluIHRoZSBkcXVvdC4gIFRoaXMgc2VtYXBob3JlIHN5bmNocm9uaXplcworICogcHJvY2Vzc2VzIGF0dGVtcHRpbmcgdG8gZmx1c2ggdGhlIGluLWNvcmUgZHF1b3QgYmFjayB0byBkaXNrLgorICovCisjZGVmaW5lIHhmc19kcWZsb2NrKGRxcCkJIHsgcHNlbWEoJigoZHFwKS0+cV9mbG9jayksIFBJTk9EIHwgUFJFQ0FMQyk7XAorCQkJCSAgIChkcXApLT5kcV9mbGFncyB8PSBYRlNfRFFfRkxPQ0tFRDsgfQorI2RlZmluZSB4ZnNfZHFmdW5sb2NrKGRxcCkJIHsgQVNTRVJUKHZhbHVzZW1hKCYoKGRxcCktPnFfZmxvY2spKSA8PSAwKTsgXAorCQkJCSAgIHZzZW1hKCYoKGRxcCktPnFfZmxvY2spKTsgXAorCQkJCSAgIChkcXApLT5kcV9mbGFncyAmPSB+KFhGU19EUV9GTE9DS0VEKTsgfQorCisjZGVmaW5lIFhGU19EUV9QSU5MT0NLKGRxcCkJICAgbXV0ZXhfc3BpbmxvY2soIFwKKwkJCQkgICAgICYoWEZTX0RRX1RPX1FJTkYoZHFwKS0+cWlfcGlubG9jaykpCisjZGVmaW5lIFhGU19EUV9QSU5VTkxPQ0soZHFwLCBzKSAgIG11dGV4X3NwaW51bmxvY2soIFwKKwkJCQkgICAgICYoWEZTX0RRX1RPX1FJTkYoZHFwKS0+cWlfcGlubG9jayksIHMpCisKKyNkZWZpbmUgWEZTX0RRX0lTX0ZMVVNIX0xPQ0tFRChkcXApICh2YWx1c2VtYSgmKChkcXApLT5xX2Zsb2NrKSkgPD0gMCkKKyNkZWZpbmUgWEZTX0RRX0lTX09OX0ZSRUVMSVNUKGRxcCkgICgoZHFwKS0+ZHFfZmxuZXh0ICE9IChkcXApKQorI2RlZmluZSBYRlNfRFFfSVNfRElSVFkoZHFwKQkoKGRxcCktPmRxX2ZsYWdzICYgWEZTX0RRX0RJUlRZKQorI2RlZmluZSBYRlNfUU1fSVNVRFEoZHFwKQkoKGRxcCktPmRxX2ZsYWdzICYgWEZTX0RRX1VTRVIpCisjZGVmaW5lIFhGU19EUV9UT19RSU5GKGRxcCkJKChkcXApLT5xX21vdW50LT5tX3F1b3RhaW5mbykKKyNkZWZpbmUgWEZTX0RRX1RPX1FJUChkcXApCShYRlNfUU1fSVNVRFEoZHFwKSA/IFwKKwkJCQkgWEZTX0RRX1RPX1FJTkYoZHFwKS0+cWlfdXF1b3RhaXAgOiBcCisJCQkJIFhGU19EUV9UT19RSU5GKGRxcCktPnFpX2dxdW90YWlwKQorCisjZGVmaW5lIFhGU19JU19USElTX1FVT1RBX09GRihkKSAoISAoWEZTX1FNX0lTVURRKGQpID8gXAorCQkJCSAgICAgKFhGU19JU19VUVVPVEFfT04oKGQpLT5xX21vdW50KSkgOiBcCisJCQkJICAgICAoWEZTX0lTX0dRVU9UQV9PTigoZCktPnFfbW91bnQpKSkpCisKKyNpZmRlZiBYRlNfRFFVT1RfVFJBQ0UKKy8qCisgKiBEcXVvdCBUcmFjaW5nIHN0dWZmLgorICovCisjZGVmaW5lIERRVU9UX1RSQUNFX1NJWkUJNjQKKyNkZWZpbmUgRFFVT1RfS1RSQUNFX0VOVFJZCTEKKworZXh0ZXJuIHZvaWQJCV9feGZzX2RxdHJhY2VfZW50cnkoeGZzX2RxdW90X3QgKmRxcCwgY2hhciAqZnVuYywKKwkJCQkJICAgIHZvaWQgKiwgeGZzX2lub2RlX3QgKik7CisjZGVmaW5lIHhmc19kcXRyYWNlX2VudHJ5X2lubyhhLGIsaXApIFwKKwkJX194ZnNfZHF0cmFjZV9lbnRyeSgoYSksIChiKSwgKHZvaWQqKV9fcmV0dXJuX2FkZHJlc3MsIChpcCkpCisjZGVmaW5lIHhmc19kcXRyYWNlX2VudHJ5KGEsYikgXAorCQlfX3hmc19kcXRyYWNlX2VudHJ5KChhKSwgKGIpLCAodm9pZCopX19yZXR1cm5fYWRkcmVzcywgTlVMTCkKKyNlbHNlCisjZGVmaW5lIHhmc19kcXRyYWNlX2VudHJ5KGEsYikKKyNkZWZpbmUgeGZzX2RxdHJhY2VfZW50cnlfaW5vKGEsYixpcCkKKyNlbmRpZgorCisjaWZkZWYgUVVPVEFERUJVRworZXh0ZXJuIHZvaWQJCXhmc19xbV9kcXByaW50KHhmc19kcXVvdF90ICopOworI2Vsc2UKKyNkZWZpbmUgeGZzX3FtX2RxcHJpbnQoYSkKKyNlbmRpZgorCitleHRlcm4gdm9pZAkJeGZzX3FtX2RxZGVzdHJveSh4ZnNfZHF1b3RfdCAqKTsKK2V4dGVybiBpbnQJCXhmc19xbV9kcWZsdXNoKHhmc19kcXVvdF90ICosIHVpbnQpOworZXh0ZXJuIGludAkJeGZzX3FtX2RxcHVyZ2UoeGZzX2RxdW90X3QgKiwgdWludCk7CitleHRlcm4gdm9pZAkJeGZzX3FtX2RxdW5waW5fd2FpdCh4ZnNfZHF1b3RfdCAqKTsKK2V4dGVybiBpbnQJCXhmc19xbV9kcWxvY2tfbm93YWl0KHhmc19kcXVvdF90ICopOworZXh0ZXJuIGludAkJeGZzX3FtX2RxZmxvY2tfbm93YWl0KHhmc19kcXVvdF90ICopOworZXh0ZXJuIHZvaWQJCXhmc19xbV9kcWZsb2NrX3B1c2hidWZfd2FpdCh4ZnNfZHF1b3RfdCAqZHFwKTsKK2V4dGVybiB2b2lkCQl4ZnNfcW1fYWRqdXN0X2RxdGltZXJzKHhmc19tb3VudF90ICosCisJCQkJCXhmc19kaXNrX2RxdW90X3QgKik7CitleHRlcm4gdm9pZAkJeGZzX3FtX2FkanVzdF9kcWxpbWl0cyh4ZnNfbW91bnRfdCAqLAorCQkJCQl4ZnNfZGlza19kcXVvdF90ICopOworZXh0ZXJuIGludAkJeGZzX3FtX2Rxd2Fybih4ZnNfZGlza19kcXVvdF90ICosIHVpbnQpOworZXh0ZXJuIGludAkJeGZzX3FtX2RxZ2V0KHhmc19tb3VudF90ICosIHhmc19pbm9kZV90ICosCisJCQkJCXhmc19kcWlkX3QsIHVpbnQsIHVpbnQsIHhmc19kcXVvdF90ICoqKTsKK2V4dGVybiB2b2lkCQl4ZnNfcW1fZHFwdXQoeGZzX2RxdW90X3QgKik7CitleHRlcm4gdm9pZAkJeGZzX3FtX2RxcmVsZSh4ZnNfZHF1b3RfdCAqKTsKK2V4dGVybiB2b2lkCQl4ZnNfZHFsb2NrKHhmc19kcXVvdF90ICopOworZXh0ZXJuIHZvaWQJCXhmc19kcWxvY2syKHhmc19kcXVvdF90ICosIHhmc19kcXVvdF90ICopOworZXh0ZXJuIHZvaWQJCXhmc19kcXVubG9jayh4ZnNfZHF1b3RfdCAqKTsKK2V4dGVybiB2b2lkCQl4ZnNfZHF1bmxvY2tfbm9ub3RpZnkoeGZzX2RxdW90X3QgKik7CisKKyNlbmRpZiAvKiBfX1hGU19EUVVPVF9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3RfaXRlbS5jIGIvZnMveGZzL3F1b3RhL3hmc19kcXVvdF9pdGVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU0MjVlZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3RfaXRlbS5jCkBAIC0wLDAgKzEsNzE1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLgkgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisjaW5jbHVkZSAieGZzX2ZzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2FnLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX3F1b3RhLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvYy5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19ibWFwLmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgorI2luY2x1ZGUgInhmc19ydGFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisjaW5jbHVkZSAieGZzX2l0YWJsZS5oIgorI2luY2x1ZGUgInhmc19ydy5oIgorI2luY2x1ZGUgInhmc19hY2wuaCIKKyNpbmNsdWRlICJ4ZnNfY2FwLmgiCisjaW5jbHVkZSAieGZzX21hYy5oIgorI2luY2x1ZGUgInhmc19hdHRyLmgiCisjaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zX3ByaXYuaCIKKworI2luY2x1ZGUgInhmc19xbS5oIgorCisKKy8qCisgKiByZXR1cm5zIHRoZSBudW1iZXIgb2YgaW92ZWNzIG5lZWRlZCB0byBsb2cgdGhlIGdpdmVuIGRxdW90IGl0ZW0uCisgKi8KKy8qIEFSR1NVU0VEICovCitTVEFUSUMgdWludAoreGZzX3FtX2RxdW90X2xvZ2l0ZW1fc2l6ZSgKKwl4ZnNfZHFfbG9naXRlbV90CSpsb2dpdGVtKQoreworCS8qCisJICogd2UgbmVlZCBvbmx5IHR3byBpb3ZlY3MsIG9uZSBmb3IgdGhlIGZvcm1hdCwgb25lIGZvciB0aGUgcmVhbCB0aGluZworCSAqLworCXJldHVybiAoMik7Cit9CisKKy8qCisgKiBmaWxscyBpbiB0aGUgdmVjdG9yIG9mIGxvZyBpb3ZlY3MgZm9yIHRoZSBnaXZlbiBkcXVvdCBsb2cgaXRlbS4KKyAqLworU1RBVElDIHZvaWQKK3hmc19xbV9kcXVvdF9sb2dpdGVtX2Zvcm1hdCgKKwl4ZnNfZHFfbG9naXRlbV90CSpsb2dpdGVtLAorCXhmc19sb2dfaW92ZWNfdAkJKmxvZ3ZlYykKK3sKKwlBU1NFUlQobG9naXRlbSk7CisJQVNTRVJUKGxvZ2l0ZW0tPnFsaV9kcXVvdCk7CisKKwlsb2d2ZWMtPmlfYWRkciA9ICh4ZnNfY2FkZHJfdCkmbG9naXRlbS0+cWxpX2Zvcm1hdDsKKwlsb2d2ZWMtPmlfbGVuICA9IHNpemVvZih4ZnNfZHFfbG9nZm9ybWF0X3QpOworCWxvZ3ZlYysrOworCWxvZ3ZlYy0+aV9hZGRyID0gKHhmc19jYWRkcl90KSZsb2dpdGVtLT5xbGlfZHF1b3QtPnFfY29yZTsKKwlsb2d2ZWMtPmlfbGVuICA9IHNpemVvZih4ZnNfZGlza19kcXVvdF90KTsKKworCUFTU0VSVCgyID09IGxvZ2l0ZW0tPnFsaV9pdGVtLmxpX2Rlc2MtPmxpZF9zaXplKTsKKwlsb2dpdGVtLT5xbGlfZm9ybWF0LnFsZl9zaXplID0gMjsKKworfQorCisvKgorICogSW5jcmVtZW50IHRoZSBwaW4gY291bnQgb2YgdGhlIGdpdmVuIGRxdW90LgorICogVGhpcyB2YWx1ZSBpcyBwcm90ZWN0ZWQgYnkgcGlubG9jayBzcGlubG9jayBpbiB0aGUgeFFNIHN0cnVjdHVyZS4KKyAqLworU1RBVElDIHZvaWQKK3hmc19xbV9kcXVvdF9sb2dpdGVtX3BpbigKKwl4ZnNfZHFfbG9naXRlbV90ICpsb2dpdGVtKQoreworCXVuc2lnbmVkIGxvbmcJczsKKwl4ZnNfZHF1b3RfdCAqZHFwOworCisJZHFwID0gbG9naXRlbS0+cWxpX2RxdW90OworCUFTU0VSVChYRlNfRFFfSVNfTE9DS0VEKGRxcCkpOworCXMgPSBYRlNfRFFfUElOTE9DSyhkcXApOworCWRxcC0+cV9waW5jb3VudCsrOworCVhGU19EUV9QSU5VTkxPQ0soZHFwLCBzKTsKK30KKworLyoKKyAqIERlY3JlbWVudCB0aGUgcGluIGNvdW50IG9mIHRoZSBnaXZlbiBkcXVvdCwgYW5kIHdha2UgdXAKKyAqIGFueW9uZSBpbiB4ZnNfZHF3YWl0X3VucGluKCkgaWYgdGhlIGNvdW50IGdvZXMgdG8gMC4JIFRoZQorICogZHF1b3QgbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSBwaW5uZWQgd2l0aCBhIGNhbGwgdG8geGZzX2RxcGluKCkuCisgKi8KKy8qIEFSR1NVU0VEICovCitTVEFUSUMgdm9pZAoreGZzX3FtX2RxdW90X2xvZ2l0ZW1fdW5waW4oCisJeGZzX2RxX2xvZ2l0ZW1fdCAqbG9naXRlbSwKKwlpbnQJCSAgc3RhbGUpCit7CisJdW5zaWduZWQgbG9uZwlzOworCXhmc19kcXVvdF90ICpkcXA7CisKKwlkcXAgPSBsb2dpdGVtLT5xbGlfZHF1b3Q7CisJQVNTRVJUKGRxcC0+cV9waW5jb3VudCA+IDApOworCXMgPSBYRlNfRFFfUElOTE9DSyhkcXApOworCWRxcC0+cV9waW5jb3VudC0tOworCWlmIChkcXAtPnFfcGluY291bnQgPT0gMCkgeworCQlzdl9icm9hZGNhc3QoJmRxcC0+cV9waW53YWl0KTsKKwl9CisJWEZTX0RRX1BJTlVOTE9DSyhkcXAsIHMpOworfQorCisvKiBBUkdTVVNFRCAqLworU1RBVElDIHZvaWQKK3hmc19xbV9kcXVvdF9sb2dpdGVtX3VucGluX3JlbW92ZSgKKwl4ZnNfZHFfbG9naXRlbV90ICpsb2dpdGVtLAorCXhmc190cmFuc190CSAqdHApCit7CisJeGZzX3FtX2RxdW90X2xvZ2l0ZW1fdW5waW4obG9naXRlbSwgMCk7Cit9CisKKy8qCisgKiBHaXZlbiB0aGUgbG9naXRlbSwgdGhpcyB3cml0ZXMgdGhlIGNvcnJlc3BvbmRpbmcgZHF1b3QgZW50cnkgdG8gZGlzaworICogYXN5bmNocm9ub3VzbHkuIFRoaXMgaXMgY2FsbGVkIHdpdGggdGhlIGRxdW90IGVudHJ5IHNlY3VyZWx5IGxvY2tlZDsKKyAqIHdlIHNpbXBseSBnZXQgeGZzX3FtX2RxZmx1c2goKSB0byBkbyB0aGUgd29yaywgYW5kIHVubG9jayB0aGUgZHF1b3QKKyAqIGF0IHRoZSBlbmQuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfcW1fZHF1b3RfbG9naXRlbV9wdXNoKAorCXhmc19kcV9sb2dpdGVtX3QJKmxvZ2l0ZW0pCit7CisJeGZzX2RxdW90X3QJKmRxcDsKKworCWRxcCA9IGxvZ2l0ZW0tPnFsaV9kcXVvdDsKKworCUFTU0VSVChYRlNfRFFfSVNfTE9DS0VEKGRxcCkpOworCUFTU0VSVChYRlNfRFFfSVNfRkxVU0hfTE9DS0VEKGRxcCkpOworCisJLyoKKwkgKiBTaW5jZSB3ZSB3ZXJlIGFibGUgdG8gbG9jayB0aGUgZHF1b3QncyBmbHVzaCBsb2NrIGFuZAorCSAqIHdlIGZvdW5kIGl0IG9uIHRoZSBBSUwsIHRoZSBkcXVvdCBtdXN0IGJlIGRpcnR5LiAgVGhpcworCSAqIGlzIGJlY2F1c2UgdGhlIGRxdW90IGlzIHJlbW92ZWQgZnJvbSB0aGUgQUlMIHdoaWxlIHN0aWxsCisJICogaG9sZGluZyB0aGUgZmx1c2ggbG9jayBpbiB4ZnNfZHFmbHVzaF9kb25lKCkuICBUaHVzLCBpZgorCSAqIHdlIGZvdW5kIGl0IGluIHRoZSBBSUwgYW5kIHdlcmUgYWJsZSB0byBvYnRhaW4gdGhlIGZsdXNoCisJICogbG9jayB3aXRob3V0IHNsZWVwaW5nLCB0aGVuIHRoZXJlIG11c3Qgbm90IGhhdmUgYmVlbgorCSAqIGFueW9uZSBpbiB0aGUgcHJvY2VzcyBvZiBmbHVzaGluZyB0aGUgZHF1b3QuCisJICovCisJeGZzX3FtX2RxZmx1c2goZHFwLCBYRlNfQl9ERUxXUkkpOworCXhmc19kcXVubG9jayhkcXApOworfQorCisvKkFSR1NVU0VEKi8KK1NUQVRJQyB4ZnNfbHNuX3QKK3hmc19xbV9kcXVvdF9sb2dpdGVtX2NvbW1pdHRlZCgKKwl4ZnNfZHFfbG9naXRlbV90CSpsLAorCXhmc19sc25fdAkJbHNuKQoreworCS8qCisJICogV2UgYWx3YXlzIHJlLWxvZyB0aGUgZW50aXJlIGRxdW90IHdoZW4gaXQgYmVjb21lcyBkaXJ0eSwKKwkgKiBzbywgdGhlIGxhdGVzdCBjb3B5IF9pc18gdGhlIG9ubHkgb25lIHRoYXQgbWF0dGVycy4KKwkgKi8KKwlyZXR1cm4gKGxzbik7Cit9CisKKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHRvIHdhaXQgZm9yIHRoZSBnaXZlbiBkcXVvdCB0byBiZSB1bnBpbm5lZC4KKyAqIE1vc3Qgb2YgdGhlc2UgcGluL3VucGluIHJvdXRpbmVzIGFyZSBwbGFnaWFyaXplZCBmcm9tIGlub2RlIGNvZGUuCisgKi8KK3ZvaWQKK3hmc19xbV9kcXVucGluX3dhaXQoCisJeGZzX2RxdW90X3QJKmRxcCkKK3sKKwlTUExERUNMKHMpOworCisJQVNTRVJUKFhGU19EUV9JU19MT0NLRUQoZHFwKSk7CisJaWYgKGRxcC0+cV9waW5jb3VudCA9PSAwKSB7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIEdpdmUgdGhlIGxvZyBhIHB1c2ggc28gd2UgZG9uJ3Qgd2FpdCBoZXJlIHRvbyBsb25nLgorCSAqLworCXhmc19sb2dfZm9yY2UoZHFwLT5xX21vdW50LCAoeGZzX2xzbl90KTAsIFhGU19MT0dfRk9SQ0UpOworCXMgPSBYRlNfRFFfUElOTE9DSyhkcXApOworCWlmIChkcXAtPnFfcGluY291bnQgPT0gMCkgeworCQlYRlNfRFFfUElOVU5MT0NLKGRxcCwgcyk7CisJCXJldHVybjsKKwl9CisJc3Zfd2FpdCgmKGRxcC0+cV9waW53YWl0KSwgUElOT0QsCisJCSYoWEZTX0RRX1RPX1FJTkYoZHFwKS0+cWlfcGlubG9jayksIHMpOworfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgd2hlbiBJT1BfVFJZTE9DSyByZXR1cm5zIFhGU19JVEVNX1BVU0hCVUYgdG8gaW5kaWNhdGUgdGhhdAorICogdGhlIGRxdW90IGlzIGxvY2tlZCBieSB1cywgYnV0IHRoZSBmbHVzaCBsb2NrIGlzbid0LiBTbywgaGVyZSB3ZSBhcmUKKyAqIGdvaW5nIHRvIHNlZSBpZiB0aGUgcmVsZXZhbnQgZHF1b3QgYnVmZmVyIGlzIGluY29yZSwgd2FpdGluZyBvbiBERUxXUkkuCisgKiBJZiBzbywgd2Ugd2FudCB0byBwdXNoIGl0IG91dCB0byBoZWxwIHVzIHRha2UgdGhpcyBpdGVtIG9mZiB0aGUgQUlMIGFzIHNvb24KKyAqIGFzIHBvc3NpYmxlLgorICoKKyAqIFdlIG11c3Qgbm90IGJlIGhvbGRpbmcgdGhlIEFJTF9MT0NLIGF0IHRoaXMgcG9pbnQuIENhbGxpbmcgaW5jb3JlKCkgdG8KKyAqIHNlYXJjaCB0aGUgYnVmZmVyY2FjaGUgY2FuIGJlIGEgdGltZSBjb25zdW1pbmcgdGhpbmcsIGFuZCBBSUxfTE9DSyBpcyBhCisgKiBzcGlubG9jay4KKyAqLworU1RBVElDIHZvaWQKK3hmc19xbV9kcXVvdF9sb2dpdGVtX3B1c2hidWYoCisJeGZzX2RxX2xvZ2l0ZW1fdCAgICAqcWlwKQoreworCXhmc19kcXVvdF90CSpkcXA7CisJeGZzX21vdW50X3QJKm1wOworCXhmc19idWZfdAkqYnA7CisJdWludAkJZG9wdXNoOworCisJZHFwID0gcWlwLT5xbGlfZHF1b3Q7CisJQVNTRVJUKFhGU19EUV9JU19MT0NLRUQoZHFwKSk7CisKKwkvKgorCSAqIFRoZSBxbGlfcHVzaGJ1Zl9mbGFnIGtlZXBzIG90aGVycyBmcm9tCisJICogdHJ5aW5nIHRvIGR1cGxpY2F0ZSBvdXIgZWZmb3J0LgorCSAqLworCUFTU0VSVChxaXAtPnFsaV9wdXNoYnVmX2ZsYWcgIT0gMCk7CisJQVNTRVJUKHFpcC0+cWxpX3B1c2hfb3duZXIgPT0gZ2V0X3RocmVhZF9pZCgpKTsKKworCS8qCisJICogSWYgZmx1c2hsb2NrIGlzbid0IGxvY2tlZCBhbnltb3JlLCBjaGFuY2VzIGFyZSB0aGF0IHRoZQorCSAqIGlub2RlIGZsdXNoIGNvbXBsZXRlZCBhbmQgdGhlIGlub2RlIHdhcyB0YWtlbiBvZmYgdGhlIEFJTC4KKwkgKiBTbywganVzdCBnZXQgb3V0LgorCSAqLworCWlmICgodmFsdXNlbWEoJihkcXAtPnFfZmxvY2spKSA+IDApICB8fAorCSAgICAoKHFpcC0+cWxpX2l0ZW0ubGlfZmxhZ3MgJiBYRlNfTElfSU5fQUlMKSA9PSAwKSkgeworCQlxaXAtPnFsaV9wdXNoYnVmX2ZsYWcgPSAwOworCQl4ZnNfZHF1bmxvY2soZHFwKTsKKwkJcmV0dXJuOworCX0KKwltcCA9IGRxcC0+cV9tb3VudDsKKwlicCA9IHhmc19pbmNvcmUobXAtPm1fZGRldl90YXJncCwgcWlwLT5xbGlfZm9ybWF0LnFsZl9ibGtubywKKwkJICAgIFhGU19RSV9EUUNIVU5LTEVOKG1wKSwKKwkJICAgIFhGU19JTkNPUkVfVFJZTE9DSyk7CisJaWYgKGJwICE9IE5VTEwpIHsKKwkJaWYgKFhGU19CVUZfSVNERUxBWVdSSVRFKGJwKSkgeworCQkJZG9wdXNoID0gKChxaXAtPnFsaV9pdGVtLmxpX2ZsYWdzICYgWEZTX0xJX0lOX0FJTCkgJiYKKwkJCQkgICh2YWx1c2VtYSgmKGRxcC0+cV9mbG9jaykpIDw9IDApKTsKKwkJCXFpcC0+cWxpX3B1c2hidWZfZmxhZyA9IDA7CisJCQl4ZnNfZHF1bmxvY2soZHFwKTsKKworCQkJaWYgKFhGU19CVUZfSVNQSU5ORUQoYnApKSB7CisJCQkJeGZzX2xvZ19mb3JjZShtcCwgKHhmc19sc25fdCkwLAorCQkJCQkgICAgICBYRlNfTE9HX0ZPUkNFKTsKKwkJCX0KKwkJCWlmIChkb3B1c2gpIHsKKyNpZmRlZiBYRlNSQUNFREVCVUcKKwkJCQlkZWxheV9mb3JfaW50cigpOworCQkJCWRlbGF5KDMwMCk7CisjZW5kaWYKKwkJCQl4ZnNfYmF3cml0ZShtcCwgYnApOworCQkJfSBlbHNlIHsKKwkJCQl4ZnNfYnVmX3JlbHNlKGJwKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXFpcC0+cWxpX3B1c2hidWZfZmxhZyA9IDA7CisJCQl4ZnNfZHF1bmxvY2soZHFwKTsKKwkJCXhmc19idWZfcmVsc2UoYnApOworCQl9CisJCXJldHVybjsKKwl9CisKKwlxaXAtPnFsaV9wdXNoYnVmX2ZsYWcgPSAwOworCXhmc19kcXVubG9jayhkcXApOworfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgdG8gYXR0ZW1wdCB0byBsb2NrIHRoZSBkcXVvdCBhc3NvY2lhdGVkIHdpdGggdGhpcworICogZHF1b3QgbG9nIGl0ZW0uICBEb24ndCBzbGVlcCBvbiB0aGUgZHF1b3QgbG9jayBvciB0aGUgZmx1c2ggbG9jay4KKyAqIElmIHRoZSBmbHVzaCBsb2NrIGlzIGFscmVhZHkgaGVsZCwgaW5kaWNhdGluZyB0aGF0IHRoZSBkcXVvdCBoYXMKKyAqIGJlZW4gb3IgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZmx1c2hlZCwgdGhlbiBzZWUgaWYgd2UgY2FuCisgKiBmaW5kIHRoZSBkcXVvdCdzIGJ1ZmZlciBpbiB0aGUgYnVmZmVyIGNhY2hlIHdpdGhvdXQgc2xlZXBpbmcuICBJZgorICogd2UgY2FuIGFuZCBpdCBpcyBtYXJrZWQgZGVsYXllZCB3cml0ZSwgdGhlbiB3ZSB3YW50IHRvIHNlbmQgaXQgb3V0LgorICogV2UgZGVsYXkgZG9pbmcgc28gdW50aWwgdGhlIHB1c2ggcm91dGluZSwgdGhvdWdoLCB0byBhdm9pZCBzbGVlcGluZworICogaW4gYW55IGRldmljZSBzdHJhdGVneSByb3V0aW5lcy4KKyAqLworU1RBVElDIHVpbnQKK3hmc19xbV9kcXVvdF9sb2dpdGVtX3RyeWxvY2soCisJeGZzX2RxX2xvZ2l0ZW1fdAkqcWlwKQoreworCXhmc19kcXVvdF90CQkqZHFwOworCXVpbnQJCQlyZXR2YWw7CisKKwlkcXAgPSBxaXAtPnFsaV9kcXVvdDsKKwlpZiAoZHFwLT5xX3BpbmNvdW50ID4gMCkKKwkJcmV0dXJuIChYRlNfSVRFTV9QSU5ORUQpOworCisJaWYgKCEgeGZzX3FtX2RxbG9ja19ub3dhaXQoZHFwKSkKKwkJcmV0dXJuIChYRlNfSVRFTV9MT0NLRUQpOworCisJcmV0dmFsID0gWEZTX0lURU1fU1VDQ0VTUzsKKwlpZiAoISB4ZnNfcW1fZHFmbG9ja19ub3dhaXQoZHFwKSkgeworCQkvKgorCQkgKiBUaGUgZHF1b3QgaXMgYWxyZWFkeSBiZWluZyBmbHVzaGVkLglJdCBtYXkgaGF2ZSBiZWVuCisJCSAqIGZsdXNoZWQgZGVsYXllZCB3cml0ZSwgaG93ZXZlciwgYW5kIHdlIGRvbid0IHdhbnQgdG8KKwkJICogZ2V0IHN0dWNrIHdhaXRpbmcgZm9yIHRoYXQgdG8gY29tcGxldGUuICBTbywgd2Ugd2FudCB0byBjaGVjaworCQkgKiB0byBzZWUgaWYgd2UgY2FuIGxvY2sgdGhlIGRxdW90J3MgYnVmZmVyIHdpdGhvdXQgc2xlZXBpbmcuCisJCSAqIElmIHdlIGNhbiBhbmQgaXQgaXMgbWFya2VkIGZvciBkZWxheWVkIHdyaXRlLCB0aGVuIHdlCisJCSAqIGhvbGQgaXQgYW5kIHNlbmQgaXQgb3V0IGZyb20gdGhlIHB1c2ggcm91dGluZS4gIFdlIGRvbid0CisJCSAqIHdhbnQgdG8gZG8gdGhhdCBub3cgc2luY2Ugd2UgbWlnaHQgc2xlZXAgaW4gdGhlIGRldmljZQorCQkgKiBzdHJhdGVneSByb3V0aW5lLiAgV2UgYWxzbyBkb24ndCB3YW50IHRvIGdyYWIgdGhlIGJ1ZmZlciBsb2NrCisJCSAqIGhlcmUgYmVjYXVzZSB3ZSdkIGxpa2Ugbm90IHRvIGNhbGwgaW50byB0aGUgYnVmZmVyIGNhY2hlCisJCSAqIHdoaWxlIGhvbGRpbmcgdGhlIEFJTF9MT0NLLgorCQkgKiBNYWtlIHN1cmUgdG8gb25seSByZXR1cm4gUFVTSEJVRiBpZiB3ZSBzZXQgcHVzaGJ1Zl9mbGFnCisJCSAqIG91cnNlbHZlcy4gIElmIHNvbWVvbmUgZWxzZSBpcyBkb2luZyBpdCB0aGVuIHdlIGRvbid0CisJCSAqIHdhbnQgdG8gZ28gdG8gdGhlIHB1c2ggcm91dGluZSBhbmQgZHVwbGljYXRlIHRoZWlyIGVmZm9ydHMuCisJCSAqLworCQlpZiAocWlwLT5xbGlfcHVzaGJ1Zl9mbGFnID09IDApIHsKKwkJCXFpcC0+cWxpX3B1c2hidWZfZmxhZyA9IDE7CisJCQlBU1NFUlQocWlwLT5xbGlfZm9ybWF0LnFsZl9ibGtubyA9PSBkcXAtPnFfYmxrbm8pOworI2lmZGVmIERFQlVHCisJCQlxaXAtPnFsaV9wdXNoX293bmVyID0gZ2V0X3RocmVhZF9pZCgpOworI2VuZGlmCisJCQkvKgorCQkJICogVGhlIGRxdW90IGlzIGxlZnQgbG9ja2VkLgorCQkJICovCisJCQlyZXR2YWwgPSBYRlNfSVRFTV9QVVNIQlVGOworCQl9IGVsc2UgeworCQkJcmV0dmFsID0gWEZTX0lURU1fRkxVU0hJTkc7CisJCQl4ZnNfZHF1bmxvY2tfbm9ub3RpZnkoZHFwKTsKKwkJfQorCX0KKworCUFTU0VSVChxaXAtPnFsaV9pdGVtLmxpX2ZsYWdzICYgWEZTX0xJX0lOX0FJTCk7CisJcmV0dXJuIChyZXR2YWwpOworfQorCisKKy8qCisgKiBVbmxvY2sgdGhlIGRxdW90IGFzc29jaWF0ZWQgd2l0aCB0aGUgbG9nIGl0ZW0uCisgKiBDbGVhciB0aGUgZmllbGRzIG9mIHRoZSBkcXVvdCBhbmQgZHF1b3QgbG9nIGl0ZW0gdGhhdAorICogYXJlIHNwZWNpZmljIHRvIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLiAgSWYgdGhlCisgKiBob2xkIGZsYWdzIGlzIHNldCwgZG8gbm90IHVubG9jayB0aGUgZHF1b3QuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfcW1fZHF1b3RfbG9naXRlbV91bmxvY2soCisJeGZzX2RxX2xvZ2l0ZW1fdCAgICAqcWwpCit7CisJeGZzX2RxdW90X3QJKmRxcDsKKworCUFTU0VSVChxbCAhPSBOVUxMKTsKKwlkcXAgPSBxbC0+cWxpX2RxdW90OworCUFTU0VSVChYRlNfRFFfSVNfTE9DS0VEKGRxcCkpOworCisJLyoKKwkgKiBDbGVhciB0aGUgdHJhbnNhY3Rpb24gcG9pbnRlciBpbiB0aGUgZHF1b3QKKwkgKi8KKwlkcXAtPnFfdHJhbnNwID0gTlVMTDsKKworCS8qCisJICogZHF1b3RzIGFyZSBuZXZlciAnaGVsZCcgZnJvbSBnZXR0aW5nIHVubG9ja2VkIGF0IHRoZSBlbmQgb2YKKwkgKiBhIHRyYW5zYWN0aW9uLiAgVGhlaXIgbG9ja2luZyBhbmQgdW5sb2NraW5nIGlzIGhpZGRlbiBpbnNpZGUgdGhlCisJICogdHJhbnNhY3Rpb24gbGF5ZXIsIHdpdGhpbiB0cmFuc19jb21taXQuIEhlbmNlLCBubyBMSV9IT0xEIGZsYWcKKwkgKiBmb3IgdGhlIGxvZ2l0ZW0uCisJICovCisJeGZzX2RxdW5sb2NrKGRxcCk7Cit9CisKKworLyoKKyAqIFRoZSB0cmFuc2FjdGlvbiB3aXRoIHRoZSBkcXVvdCBsb2NrZWQgaGFzIGFib3J0ZWQuICBUaGUgZHF1b3QKKyAqIG11c3Qgbm90IGJlIGRpcnR5IHdpdGhpbiB0aGUgdHJhbnNhY3Rpb24uICBXZSBzaW1wbHkgdW5sb2NrIGp1c3QKKyAqIGFzIGlmIHRoZSB0cmFuc2FjdGlvbiBoYWQgYmVlbiBjYW5jZWxsZWQuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfcW1fZHF1b3RfbG9naXRlbV9hYm9ydCgKKwl4ZnNfZHFfbG9naXRlbV90ICAgICpxbCkKK3sKKwl4ZnNfcW1fZHF1b3RfbG9naXRlbV91bmxvY2socWwpOworfQorCisvKgorICogdGhpcyBuZWVkcyB0byBzdGFtcCBhbiBsc24gaW50byB0aGUgZHF1b3QsIEkgdGhpbmsuCisgKiBycGMncyB0aGF0IGxvb2sgYXQgdXNlciBkcXVvdCdzIHdvdWxkIHRoZW4gaGF2ZSB0bworICogcHVzaCBvbiB0aGUgZGVwZW5kZW5jeSByZWNvcmRlZCBpbiB0aGUgZHF1b3QKKyAqLworLyogQVJHU1VTRUQgKi8KK1NUQVRJQyB2b2lkCit4ZnNfcW1fZHF1b3RfbG9naXRlbV9jb21taXR0aW5nKAorCXhmc19kcV9sb2dpdGVtX3QJKmwsCisJeGZzX2xzbl90CQlsc24pCit7CisJcmV0dXJuOworfQorCisKKy8qCisgKiBUaGlzIGlzIHRoZSBvcHMgdmVjdG9yIGZvciBkcXVvdHMKKyAqLworc3RydWN0IHhmc19pdGVtX29wcyB4ZnNfZHF1b3RfaXRlbV9vcHMgPSB7CisJLmlvcF9zaXplCT0gKHVpbnQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfcW1fZHF1b3RfbG9naXRlbV9zaXplLAorCS5pb3BfZm9ybWF0CT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqLCB4ZnNfbG9nX2lvdmVjX3QqKSkKKwkJCQkJeGZzX3FtX2RxdW90X2xvZ2l0ZW1fZm9ybWF0LAorCS5pb3BfcGluCT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfcW1fZHF1b3RfbG9naXRlbV9waW4sCisJLmlvcF91bnBpbgk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KiwgaW50KSkKKwkJCQkJeGZzX3FtX2RxdW90X2xvZ2l0ZW1fdW5waW4sCisJLmlvcF91bnBpbl9yZW1vdmUgPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCosIHhmc190cmFuc190KikpCisJCQkJCXhmc19xbV9kcXVvdF9sb2dpdGVtX3VucGluX3JlbW92ZSwKKwkuaW9wX3RyeWxvY2sJPSAodWludCgqKSh4ZnNfbG9nX2l0ZW1fdCopKQorCQkJCQl4ZnNfcW1fZHF1b3RfbG9naXRlbV90cnlsb2NrLAorCS5pb3BfdW5sb2NrCT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfcW1fZHF1b3RfbG9naXRlbV91bmxvY2ssCisJLmlvcF9jb21taXR0ZWQJPSAoeGZzX2xzbl90KCopKHhmc19sb2dfaXRlbV90KiwgeGZzX2xzbl90KSkKKwkJCQkJeGZzX3FtX2RxdW90X2xvZ2l0ZW1fY29tbWl0dGVkLAorCS5pb3BfcHVzaAk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KikpeGZzX3FtX2RxdW90X2xvZ2l0ZW1fcHVzaCwKKwkuaW9wX2Fib3J0CT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfcW1fZHF1b3RfbG9naXRlbV9hYm9ydCwKKwkuaW9wX3B1c2hidWYJPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCopKQorCQkJCQl4ZnNfcW1fZHF1b3RfbG9naXRlbV9wdXNoYnVmLAorCS5pb3BfY29tbWl0dGluZyA9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KiwgeGZzX2xzbl90KSkKKwkJCQkJeGZzX3FtX2RxdW90X2xvZ2l0ZW1fY29tbWl0dGluZworfTsKKworLyoKKyAqIEluaXRpYWxpemUgdGhlIGRxdW90IGxvZyBpdGVtIGZvciBhIG5ld2x5IGFsbG9jYXRlZCBkcXVvdC4KKyAqIFRoZSBkcXVvdCBpc24ndCBsb2NrZWQgYXQgdGhpcyBwb2ludCwgYnV0IGl0IGlzbid0IG9uIGFueSBvZiB0aGUgbGlzdHMKKyAqIGVpdGhlciwgc28gd2UgZG9uJ3QgY2FyZS4KKyAqLwordm9pZAoreGZzX3FtX2RxdW90X2xvZ2l0ZW1faW5pdCgKKwlzdHJ1Y3QgeGZzX2RxdW90ICpkcXApCit7CisJeGZzX2RxX2xvZ2l0ZW1fdCAgKmxwOworCWxwID0gJmRxcC0+cV9sb2dpdGVtOworCisJbHAtPnFsaV9pdGVtLmxpX3R5cGUgPSBYRlNfTElfRFFVT1Q7CisJbHAtPnFsaV9pdGVtLmxpX29wcyA9ICZ4ZnNfZHF1b3RfaXRlbV9vcHM7CisJbHAtPnFsaV9pdGVtLmxpX21vdW50cCA9IGRxcC0+cV9tb3VudDsKKwlscC0+cWxpX2RxdW90ID0gZHFwOworCWxwLT5xbGlfZm9ybWF0LnFsZl90eXBlID0gWEZTX0xJX0RRVU9UOworCWxwLT5xbGlfZm9ybWF0LnFsZl9pZCA9IElOVF9HRVQoZHFwLT5xX2NvcmUuZF9pZCwgQVJDSF9DT05WRVJUKTsKKwlscC0+cWxpX2Zvcm1hdC5xbGZfYmxrbm8gPSBkcXAtPnFfYmxrbm87CisJbHAtPnFsaV9mb3JtYXQucWxmX2xlbiA9IDE7CisJLyoKKwkgKiBUaGlzIGlzIGp1c3QgdGhlIG9mZnNldCBvZiB0aGlzIGRxdW90IHdpdGhpbiBpdHMgYnVmZmVyCisJICogKHdoaWNoIGlzIGN1cnJlbnRseSAxIEZTQiBhbmQgcHJvYmFibHkgd29uJ3QgY2hhbmdlKS4KKwkgKiBIZW5jZSAzMiBiaXRzIGZvciB0aGlzIG9mZnNldCBzaG91bGQgYmUganVzdCBmaW5lLgorCSAqIEFsdGVybmF0aXZlbHksIHdlIGNhbiBzdG9yZSAoYnVmb2Zmc2V0IC8gc2l6ZW9mKHhmc19kcWJsa190KSkKKwkgKiBoZXJlLCBhbmQgcmVjb21wdXRlIGl0IGF0IHJlY292ZXJ5IHRpbWUuCisJICovCisJbHAtPnFsaV9mb3JtYXQucWxmX2JvZmZzZXQgPSAoX191aW50MzJfdClkcXAtPnFfYnVmb2Zmc2V0OworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLSAgUVVPVEFPRkYgTE9HIElURU1TICAtLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIFRoaXMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGlvdmVjcyBuZWVkZWQgdG8gbG9nIHRoZSBnaXZlbiBxdW90YW9mZiBpdGVtLgorICogV2Ugb25seSBuZWVkIDEgaW92ZWMgZm9yIGFuIHF1b3Rhb2ZmIGl0ZW0uICBJdCBqdXN0IGxvZ3MgdGhlCisgKiBxdW90YW9mZl9sb2dfZm9ybWF0IHN0cnVjdHVyZS4KKyAqLworLypBUkdTVVNFRCovCitTVEFUSUMgdWludAoreGZzX3FtX3FvZmZfbG9naXRlbV9zaXplKHhmc19xb2ZmX2xvZ2l0ZW1fdCAqcWYpCit7CisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHRvIGZpbGwgaW4gdGhlIHZlY3RvciBvZiBsb2cgaW92ZWNzIGZvciB0aGUKKyAqIGdpdmVuIHF1b3Rhb2ZmIGxvZyBpdGVtLiBXZSB1c2Ugb25seSAxIGlvdmVjLCBhbmQgd2UgcG9pbnQgdGhhdAorICogYXQgdGhlIHF1b3Rhb2ZmX2xvZ19mb3JtYXQgc3RydWN0dXJlIGVtYmVkZGVkIGluIHRoZSBxdW90YW9mZiBpdGVtLgorICogSXQgaXMgYXQgdGhpcyBwb2ludCB0aGF0IHdlIGFzc2VydCB0aGF0IGFsbCBvZiB0aGUgZXh0ZW50CisgKiBzbG90cyBpbiB0aGUgcXVvdGFvZmYgaXRlbSBoYXZlIGJlZW4gZmlsbGVkLgorICovCitTVEFUSUMgdm9pZAoreGZzX3FtX3FvZmZfbG9naXRlbV9mb3JtYXQoeGZzX3FvZmZfbG9naXRlbV90CSpxZiwKKwkJCSAgIHhmc19sb2dfaW92ZWNfdAkqbG9nX3ZlY3RvcikKK3sKKwlBU1NFUlQocWYtPnFxbF9mb3JtYXQucWZfdHlwZSA9PSBYRlNfTElfUVVPVEFPRkYpOworCisJbG9nX3ZlY3Rvci0+aV9hZGRyID0gKHhmc19jYWRkcl90KSYocWYtPnFxbF9mb3JtYXQpOworCWxvZ192ZWN0b3ItPmlfbGVuID0gc2l6ZW9mKHhmc19xb2ZmX2xvZ2l0ZW1fdCk7CisJcWYtPnFxbF9mb3JtYXQucWZfc2l6ZSA9IDE7Cit9CisKKworLyoKKyAqIFBpbm5pbmcgaGFzIG5vIG1lYW5pbmcgZm9yIGFuIHF1b3Rhb2ZmIGl0ZW0sIHNvIGp1c3QgcmV0dXJuLgorICovCisvKkFSR1NVU0VEKi8KK1NUQVRJQyB2b2lkCit4ZnNfcW1fcW9mZl9sb2dpdGVtX3Bpbih4ZnNfcW9mZl9sb2dpdGVtX3QgKnFmKQoreworCXJldHVybjsKK30KKworCisvKgorICogU2luY2UgcGlubmluZyBoYXMgbm8gbWVhbmluZyBmb3IgYW4gcXVvdGFvZmYgaXRlbSwgdW5waW5uaW5nIGRvZXMKKyAqIG5vdCBlaXRoZXIuCisgKi8KKy8qQVJHU1VTRUQqLworU1RBVElDIHZvaWQKK3hmc19xbV9xb2ZmX2xvZ2l0ZW1fdW5waW4oeGZzX3FvZmZfbG9naXRlbV90ICpxZiwgaW50IHN0YWxlKQoreworCXJldHVybjsKK30KKworLypBUkdTVVNFRCovCitTVEFUSUMgdm9pZAoreGZzX3FtX3FvZmZfbG9naXRlbV91bnBpbl9yZW1vdmUoeGZzX3FvZmZfbG9naXRlbV90ICpxZiwgeGZzX3RyYW5zX3QgKnRwKQoreworCXJldHVybjsKK30KKworLyoKKyAqIFF1b3Rhb2ZmIGl0ZW1zIGhhdmUgbm8gbG9ja2luZywgc28ganVzdCByZXR1cm4gc3VjY2Vzcy4KKyAqLworLypBUkdTVVNFRCovCitTVEFUSUMgdWludAoreGZzX3FtX3FvZmZfbG9naXRlbV90cnlsb2NrKHhmc19xb2ZmX2xvZ2l0ZW1fdCAqcWYpCit7CisJcmV0dXJuIFhGU19JVEVNX0xPQ0tFRDsKK30KKworLyoKKyAqIFF1b3Rhb2ZmIGl0ZW1zIGhhdmUgbm8gbG9ja2luZyBvciBwdXNoaW5nLCBzbyByZXR1cm4gZmFpbHVyZQorICogc28gdGhhdCB0aGUgY2FsbGVyIGRvZXNuJ3QgYm90aGVyIHdpdGggdXMuCisgKi8KKy8qQVJHU1VTRUQqLworU1RBVElDIHZvaWQKK3hmc19xbV9xb2ZmX2xvZ2l0ZW1fdW5sb2NrKHhmc19xb2ZmX2xvZ2l0ZW1fdCAqcWYpCit7CisJcmV0dXJuOworfQorCisvKgorICogVGhlIHF1b3Rhb2ZmLXN0YXJ0LWl0ZW0gaXMgbG9nZ2VkIG9ubHkgb25jZSBhbmQgY2Fubm90IGJlIG1vdmVkIGluIHRoZSBsb2csCisgKiBzbyBzaW1wbHkgcmV0dXJuIHRoZSBsc24gYXQgd2hpY2ggaXQncyBiZWVuIGxvZ2dlZC4KKyAqLworLypBUkdTVVNFRCovCitTVEFUSUMgeGZzX2xzbl90Cit4ZnNfcW1fcW9mZl9sb2dpdGVtX2NvbW1pdHRlZCh4ZnNfcW9mZl9sb2dpdGVtX3QgKnFmLCB4ZnNfbHNuX3QgbHNuKQoreworCXJldHVybiAobHNuKTsKK30KKworLyoKKyAqIFRoZSB0cmFuc2FjdGlvbiBvZiB3aGljaCB0aGlzIFFVT1RBT0ZGIGlzIGEgcGFydCBoYXMgYmVlbiBhYm9ydGVkLgorICogSnVzdCBjbGVhbiB1cCBhZnRlciBvdXJzZWx2ZXMuCisgKiBTaG91bGRuJ3QgdGhpcyBuZXZlciBoYXBwZW4gaW4gdGhlIGNhc2Ugb2YgcW9mZmVuZCBsb2dpdGVtcz8gWFhYCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfcW1fcW9mZl9sb2dpdGVtX2Fib3J0KHhmc19xb2ZmX2xvZ2l0ZW1fdCAqcWYpCit7CisJa21lbV9mcmVlKHFmLCBzaXplb2YoeGZzX3FvZmZfbG9naXRlbV90KSk7Cit9CisKKy8qCisgKiBUaGVyZSBpc24ndCBtdWNoIHlvdSBjYW4gZG8gdG8gcHVzaCBvbiBhbiBxdW90YW9mZiBpdGVtLiAgSXQgaXMgc2ltcGx5CisgKiBzdHVjayB3YWl0aW5nIGZvciB0aGUgbG9nIHRvIGJlIGZsdXNoZWQgdG8gZGlzay4KKyAqLworLypBUkdTVVNFRCovCitTVEFUSUMgdm9pZAoreGZzX3FtX3FvZmZfbG9naXRlbV9wdXNoKHhmc19xb2ZmX2xvZ2l0ZW1fdCAqcWYpCit7CisJcmV0dXJuOworfQorCisKKy8qQVJHU1VTRUQqLworU1RBVElDIHhmc19sc25fdAoreGZzX3FtX3FvZmZlbmRfbG9naXRlbV9jb21taXR0ZWQoCisJeGZzX3FvZmZfbG9naXRlbV90ICpxZmUsCisJeGZzX2xzbl90IGxzbikKK3sKKwl4ZnNfcW9mZl9sb2dpdGVtX3QJKnFmczsKKwlTUExERUNMKHMpOworCisJcWZzID0gcWZlLT5xcWxfc3RhcnRfbGlwOworCUFJTF9MT0NLKHFmcy0+cXFsX2l0ZW0ubGlfbW91bnRwLHMpOworCS8qCisJICogRGVsZXRlIHRoZSBxb2ZmLXN0YXJ0IGxvZ2l0ZW0gZnJvbSB0aGUgQUlMLgorCSAqIHhmc190cmFuc19kZWxldGVfYWlsKCkgZHJvcHMgdGhlIEFJTCBsb2NrLgorCSAqLworCXhmc190cmFuc19kZWxldGVfYWlsKHFmcy0+cXFsX2l0ZW0ubGlfbW91bnRwLCAoeGZzX2xvZ19pdGVtX3QgKilxZnMsIHMpOworCWttZW1fZnJlZShxZnMsIHNpemVvZih4ZnNfcW9mZl9sb2dpdGVtX3QpKTsKKwlrbWVtX2ZyZWUocWZlLCBzaXplb2YoeGZzX3FvZmZfbG9naXRlbV90KSk7CisJcmV0dXJuICh4ZnNfbHNuX3QpLTE7Cit9CisKKy8qCisgKiBYWFggcmNjIC0gZG9uJ3Qga25vdyBxdWl0ZSB3aGF0IHRvIGRvIHdpdGggdGhpcy4gIEkgdGhpbmsgd2UgY2FuCisgKiBqdXN0IGlnbm9yZSBpdC4gIFRoZSBvbmx5IHRpbWUgdGhhdCBpc24ndCB0aGUgY2FzZSBpcyBpZiB3ZSBhbGxvdworICogdGhlIGNsaWVudCB0byBzb21laG93IHNlZSB0aGF0IHF1b3RhcyBoYXZlIGJlZW4gdHVybmVkIG9mZiBpbiB3aGljaAorICogd2UgY2FuJ3QgYWxsb3cgdGhhdCB0byBnZXQgYmFjayB1bnRpbCB0aGUgcXVvdGFvZmYgaGl0cyB0aGUgZGlzay4KKyAqIFNvIGhvdyB3b3VsZCB0aGF0IGhhcHBlbj8gIEFsc28sIGRvIHdlIG5lZWQgZGlmZmVyZW50IHJvdXRpbmVzIGZvcgorICogcXVvdGFvZmYgc3RhcnQgYW5kIHF1b3Rhb2ZmIGVuZD8gIEkgc3VzcGVjdCB0aGUgYW5zd2VyIGlzIHllcyBidXQKKyAqIHRvIGJlIHN1cmUsIEkgbmVlZCB0byBsb29rIGF0IHRoZSByZWNvdmVyeSBjb2RlIGFuZCBzZWUgaG93IHF1b3RhIG9mZgorICogcmVjb3ZlcnkgaXMgaGFuZGxlZCAoZG8gd2Ugcm9sbCBmb3J3YXJkIG9yIGJhY2sgb3IgZG8gc29tZXRoaW5nIGVsc2UpLgorICogSWYgd2Ugcm9sbCBmb3J3YXJkcyBvciBiYWNrd2FyZHMsIHRoZW4gd2UgbmVlZCB0d28gc2VwYXJhdGUgcm91dGluZXMsCisgKiBvbmUgdGhhdCBkb2VzIG5vdGhpbmcgYW5kIG9uZSB0aGF0IHN0YW1wcyBpbiB0aGUgbHNuIHRoYXQgbWF0dGVycworICogKHRydWx5IG1ha2VzIHRoZSBxdW90YW9mZiBpcnJldm9jYWJsZSkuICBJZiB3ZSBkbyBzb21ldGhpbmcgZWxzZSwKKyAqIHRoZW4gbWF5YmUgd2UgZG9uJ3QgbmVlZCB0d28uCisgKi8KKy8qIEFSR1NVU0VEICovCitTVEFUSUMgdm9pZAoreGZzX3FtX3FvZmZfbG9naXRlbV9jb21taXR0aW5nKHhmc19xb2ZmX2xvZ2l0ZW1fdCAqcWlwLCB4ZnNfbHNuX3QgY29tbWl0X2xzbikKK3sKKwlyZXR1cm47Cit9CisKKy8qIEFSR1NVU0VEICovCitTVEFUSUMgdm9pZAoreGZzX3FtX3FvZmZlbmRfbG9naXRlbV9jb21taXR0aW5nKHhmc19xb2ZmX2xvZ2l0ZW1fdCAqcWlwLCB4ZnNfbHNuX3QgY29tbWl0X2xzbikKK3sKKwlyZXR1cm47Cit9CisKK3N0cnVjdCB4ZnNfaXRlbV9vcHMgeGZzX3FtX3FvZmZlbmRfbG9naXRlbV9vcHMgPSB7CisJLmlvcF9zaXplCT0gKHVpbnQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfcW1fcW9mZl9sb2dpdGVtX3NpemUsCisJLmlvcF9mb3JtYXQJPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCosIHhmc19sb2dfaW92ZWNfdCopKQorCQkJCQl4ZnNfcW1fcW9mZl9sb2dpdGVtX2Zvcm1hdCwKKwkuaW9wX3Bpbgk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KikpeGZzX3FtX3FvZmZfbG9naXRlbV9waW4sCisJLmlvcF91bnBpbgk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KiAsaW50KSkKKwkJCQkJeGZzX3FtX3FvZmZfbG9naXRlbV91bnBpbiwKKwkuaW9wX3VucGluX3JlbW92ZSA9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90Kix4ZnNfdHJhbnNfdCopKQorCQkJCQl4ZnNfcW1fcW9mZl9sb2dpdGVtX3VucGluX3JlbW92ZSwKKwkuaW9wX3RyeWxvY2sJPSAodWludCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19xbV9xb2ZmX2xvZ2l0ZW1fdHJ5bG9jaywKKwkuaW9wX3VubG9jawk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KikpeGZzX3FtX3FvZmZfbG9naXRlbV91bmxvY2ssCisJLmlvcF9jb21taXR0ZWQJPSAoeGZzX2xzbl90KCopKHhmc19sb2dfaXRlbV90KiwgeGZzX2xzbl90KSkKKwkJCQkJeGZzX3FtX3FvZmZlbmRfbG9naXRlbV9jb21taXR0ZWQsCisJLmlvcF9wdXNoCT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfcW1fcW9mZl9sb2dpdGVtX3B1c2gsCisJLmlvcF9hYm9ydAk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KikpeGZzX3FtX3FvZmZfbG9naXRlbV9hYm9ydCwKKwkuaW9wX3B1c2hidWYJPSBOVUxMLAorCS5pb3BfY29tbWl0dGluZyA9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KiwgeGZzX2xzbl90KSkKKwkJCQkJeGZzX3FtX3FvZmZlbmRfbG9naXRlbV9jb21taXR0aW5nCit9OworCisvKgorICogVGhpcyBpcyB0aGUgb3BzIHZlY3RvciBzaGFyZWQgYnkgYWxsIHF1b3Rhb2ZmLXN0YXJ0IGxvZyBpdGVtcy4KKyAqLworc3RydWN0IHhmc19pdGVtX29wcyB4ZnNfcW1fcW9mZl9sb2dpdGVtX29wcyA9IHsKKwkuaW9wX3NpemUJPSAodWludCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19xbV9xb2ZmX2xvZ2l0ZW1fc2l6ZSwKKwkuaW9wX2Zvcm1hdAk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KiwgeGZzX2xvZ19pb3ZlY190KikpCisJCQkJCXhmc19xbV9xb2ZmX2xvZ2l0ZW1fZm9ybWF0LAorCS5pb3BfcGluCT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfcW1fcW9mZl9sb2dpdGVtX3BpbiwKKwkuaW9wX3VucGluCT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqLCBpbnQpKQorCQkJCQl4ZnNfcW1fcW9mZl9sb2dpdGVtX3VucGluLAorCS5pb3BfdW5waW5fcmVtb3ZlID0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqLHhmc190cmFuc190KikpCisJCQkJCXhmc19xbV9xb2ZmX2xvZ2l0ZW1fdW5waW5fcmVtb3ZlLAorCS5pb3BfdHJ5bG9jawk9ICh1aW50KCopKHhmc19sb2dfaXRlbV90KikpeGZzX3FtX3FvZmZfbG9naXRlbV90cnlsb2NrLAorCS5pb3BfdW5sb2NrCT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfcW1fcW9mZl9sb2dpdGVtX3VubG9jaywKKwkuaW9wX2NvbW1pdHRlZAk9ICh4ZnNfbHNuX3QoKikoeGZzX2xvZ19pdGVtX3QqLCB4ZnNfbHNuX3QpKQorCQkJCQl4ZnNfcW1fcW9mZl9sb2dpdGVtX2NvbW1pdHRlZCwKKwkuaW9wX3B1c2gJPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19xbV9xb2ZmX2xvZ2l0ZW1fcHVzaCwKKwkuaW9wX2Fib3J0CT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfcW1fcW9mZl9sb2dpdGVtX2Fib3J0LAorCS5pb3BfcHVzaGJ1Zgk9IE5VTEwsCisJLmlvcF9jb21taXR0aW5nID0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqLCB4ZnNfbHNuX3QpKQorCQkJCQl4ZnNfcW1fcW9mZl9sb2dpdGVtX2NvbW1pdHRpbmcKK307CisKKy8qCisgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhbiBxdW90YW9mZiBpdGVtIG9mIHRoZSBjb3JyZWN0IHF1b3RhIHR5cGUocykuCisgKi8KK3hmc19xb2ZmX2xvZ2l0ZW1fdCAqCit4ZnNfcW1fcW9mZl9sb2dpdGVtX2luaXQoCisJc3RydWN0IHhmc19tb3VudCAqbXAsCisJeGZzX3FvZmZfbG9naXRlbV90ICpzdGFydCwKKwl1aW50IGZsYWdzKQoreworCXhmc19xb2ZmX2xvZ2l0ZW1fdAkqcWY7CisKKwlxZiA9ICh4ZnNfcW9mZl9sb2dpdGVtX3QqKSBrbWVtX3phbGxvYyhzaXplb2YoeGZzX3FvZmZfbG9naXRlbV90KSwgS01fU0xFRVApOworCisJcWYtPnFxbF9pdGVtLmxpX3R5cGUgPSBYRlNfTElfUVVPVEFPRkY7CisJaWYgKHN0YXJ0KQorCQlxZi0+cXFsX2l0ZW0ubGlfb3BzID0gJnhmc19xbV9xb2ZmZW5kX2xvZ2l0ZW1fb3BzOworCWVsc2UKKwkJcWYtPnFxbF9pdGVtLmxpX29wcyA9ICZ4ZnNfcW1fcW9mZl9sb2dpdGVtX29wczsKKwlxZi0+cXFsX2l0ZW0ubGlfbW91bnRwID0gbXA7CisJcWYtPnFxbF9mb3JtYXQucWZfdHlwZSA9IFhGU19MSV9RVU9UQU9GRjsKKwlxZi0+cXFsX2Zvcm1hdC5xZl9mbGFncyA9IGZsYWdzOworCXFmLT5xcWxfc3RhcnRfbGlwID0gc3RhcnQ7CisJcmV0dXJuIChxZik7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMvcXVvdGEveGZzX2RxdW90X2l0ZW0uaCBiL2ZzL3hmcy9xdW90YS94ZnNfZHF1b3RfaXRlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNjUwMGQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvcXVvdGEveGZzX2RxdW90X2l0ZW0uaApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLgkgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19EUVVPVF9JVEVNX0hfXworI2RlZmluZSBfX1hGU19EUVVPVF9JVEVNX0hfXworCitzdHJ1Y3QgeGZzX2RxdW90Oworc3RydWN0IHhmc190cmFuczsKK3N0cnVjdCB4ZnNfbW91bnQ7CitzdHJ1Y3QgeGZzX3FvZmZfbG9naXRlbTsKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RxX2xvZ2l0ZW0geworCXhmc19sb2dfaXRlbV90CQkgcWxpX2l0ZW07CSAgIC8qIGNvbW1vbiBwb3J0aW9uICovCisJc3RydWN0IHhmc19kcXVvdAkqcWxpX2RxdW90OwkgICAvKiBkcXVvdCBwdHIgKi8KKwl4ZnNfbHNuX3QJCSBxbGlfZmx1c2hfbHNuOwkgICAvKiBsc24gYXQgbGFzdCBmbHVzaCAqLworCXVuc2lnbmVkIHNob3J0CQkgcWxpX3B1c2hidWZfZmxhZzsgLyogMSBiaXQgdXNlZCBpbiBwdXNoX2FpbCAqLworI2lmZGVmIERFQlVHCisJdWludDY0X3QJCSBxbGlfcHVzaF9vd25lcjsKKyNlbmRpZgorCXhmc19kcV9sb2dmb3JtYXRfdAkgcWxpX2Zvcm1hdDsJICAgLyogbG9nZ2VkIHN0cnVjdHVyZSAqLworfSB4ZnNfZHFfbG9naXRlbV90OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfcW9mZl9sb2dpdGVtIHsKKwl4ZnNfbG9nX2l0ZW1fdAkJIHFxbF9pdGVtOwkvKiBjb21tb24gcG9ydGlvbiAqLworCXN0cnVjdCB4ZnNfcW9mZl9sb2dpdGVtICpxcWxfc3RhcnRfbGlwOyAvKiBxb2ZmLXN0YXJ0IGxvZ2l0ZW0sIGlmIGFueSAqLworCXhmc19xb2ZmX2xvZ2Zvcm1hdF90CSBxcWxfZm9ybWF0OwkvKiBsb2dnZWQgc3RydWN0dXJlICovCit9IHhmc19xb2ZmX2xvZ2l0ZW1fdDsKKworCitleHRlcm4gdm9pZAkJICAgeGZzX3FtX2RxdW90X2xvZ2l0ZW1faW5pdChzdHJ1Y3QgeGZzX2RxdW90ICopOworZXh0ZXJuIHhmc19xb2ZmX2xvZ2l0ZW1fdCAqeGZzX3FtX3FvZmZfbG9naXRlbV9pbml0KHN0cnVjdCB4ZnNfbW91bnQgKiwKKwkJCQkJc3RydWN0IHhmc19xb2ZmX2xvZ2l0ZW0gKiwgdWludCk7CitleHRlcm4geGZzX3FvZmZfbG9naXRlbV90ICp4ZnNfdHJhbnNfZ2V0X3FvZmZfaXRlbShzdHJ1Y3QgeGZzX3RyYW5zICosCisJCQkJCXN0cnVjdCB4ZnNfcW9mZl9sb2dpdGVtICosIHVpbnQpOworZXh0ZXJuIHZvaWQJCSAgIHhmc190cmFuc19sb2dfcXVvdGFvZmZfaXRlbShzdHJ1Y3QgeGZzX3RyYW5zICosCisJCQkJCXN0cnVjdCB4ZnNfcW9mZl9sb2dpdGVtICopOworCisjZW5kaWYJLyogX19YRlNfRFFVT1RfSVRFTV9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9xdW90YS94ZnNfcW0uYyBiL2ZzL3hmcy9xdW90YS94ZnNfcW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWYyY2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3F1b3RhL3hmc19xbS5jCkBAIC0wLDAgKzEsMjg0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4JIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorI2luY2x1ZGUgInhmc19mcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc19jbG50LmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2FnLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX3F1b3RhLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvYy5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19ibWFwLmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgorI2luY2x1ZGUgInhmc19ydGFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisjaW5jbHVkZSAieGZzX2l0YWJsZS5oIgorI2luY2x1ZGUgInhmc19ydy5oIgorI2luY2x1ZGUgInhmc19hY2wuaCIKKyNpbmNsdWRlICJ4ZnNfY2FwLmgiCisjaW5jbHVkZSAieGZzX21hYy5oIgorI2luY2x1ZGUgInhmc19hdHRyLmgiCisjaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zX3NwYWNlLmgiCisjaW5jbHVkZSAieGZzX3V0aWxzLmgiCisKKyNpbmNsdWRlICJ4ZnNfcW0uaCIKKworLyoKKyAqIFRoZSBnbG9iYWwgcXVvdGEgbWFuYWdlci4gVGhlcmUgaXMgb25seSBvbmUgb2YgdGhlc2UgZm9yIHRoZSBlbnRpcmUKKyAqIHN5c3RlbSwgX25vdF8gb25lIHBlciBmaWxlIHN5c3RlbS4gWFFNIGtlZXBzIHRyYWNrIG9mIHRoZSBvdmVyYWxsCisgKiBxdW90YSBmdW5jdGlvbmFsaXR5LCBpbmNsdWRpbmcgbWFpbnRhaW5pbmcgdGhlIGZyZWVsaXN0IGFuZCBoYXNoCisgKiB0YWJsZXMgb2YgZHF1b3RzLgorICovCittdXRleF90IHhmc19HcW1fbG9jazsKK3N0cnVjdCB4ZnNfcW0JKnhmc19HcW07CisKK2ttZW1fem9uZV90CSpxbV9kcXpvbmU7CitrbWVtX3pvbmVfdAkqcW1fZHF0cnh6b25lOwora21lbV9zaGFrZXJfdAl4ZnNfcW1fc2hha2VyOworCitTVEFUSUMgdm9pZAl4ZnNfcW1fbGlzdF9pbml0KHhmc19kcWxpc3RfdCAqLCBjaGFyICosIGludCk7CitTVEFUSUMgdm9pZAl4ZnNfcW1fbGlzdF9kZXN0cm95KHhmc19kcWxpc3RfdCAqKTsKKworU1RBVElDIGludAl4ZnNfcW1faW5pdF9xdW90YWlub3MoeGZzX21vdW50X3QgKik7CitTVEFUSUMgaW50CXhmc19xbV9zaGFrZShpbnQsIHVuc2lnbmVkIGludCk7CisKKyNpZmRlZiBERUJVRworZXh0ZXJuIG11dGV4X3QJcWNoZWNrX2xvY2s7CisjZW5kaWYKKworI2lmZGVmIFFVT1RBREVCVUcKKyNkZWZpbmUgWFFNX0xJU1RfUFJJTlQobCwgTlhULCB0aXRsZSkgXAoreyBcCisJeGZzX2RxdW90X3QJKmRxcDsgaW50IGkgPSAwOyBcCisJY21uX2VycihDRV9ERUJVRywgIiVzICgjJWQpIiwgdGl0bGUsIChpbnQpIChsKS0+cWhfbmVsZW1zKTsgXAorCWZvciAoZHFwID0gKGwpLT5xaF9uZXh0OyBkcXAgIT0gTlVMTDsgZHFwID0gZHFwLT5OWFQpIHsgXAorCQljbW5fZXJyKENFX0RFQlVHLCAiICAgJWQuICBcIiVkICglcylcIiAgICIgXAorCQkJCSAgImJjbnQgPSAlZCwgaWNudCA9ICVkLCByZWZzID0gJWQiLCBcCisJCQkrK2ksIChpbnQpIElOVF9HRVQoZHFwLT5xX2NvcmUuZF9pZCwgQVJDSF9DT05WRVJUKSwgXAorCQkJRFFGTEFHVE9fVFlQRVNUUihkcXApLAkgICAgIFwKKwkJCShpbnQpIElOVF9HRVQoZHFwLT5xX2NvcmUuZF9iY291bnQsIEFSQ0hfQ09OVkVSVCksIFwKKwkJCShpbnQpIElOVF9HRVQoZHFwLT5xX2NvcmUuZF9pY291bnQsIEFSQ0hfQ09OVkVSVCksIFwKKwkJCShpbnQpIGRxcC0+cV9ucmVmcyk7ICB9IFwKK30KKyNlbHNlCisjZGVmaW5lIFhRTV9MSVNUX1BSSU5UKGwsIE5YVCwgdGl0bGUpIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisvKgorICogSW5pdGlhbGl6ZSB0aGUgWFFNIHN0cnVjdHVyZS4KKyAqIE5vdGUgdGhhdCB0aGVyZSBpcyBub3Qgb25lIHF1b3RhIG1hbmFnZXIgcGVyIGZpbGUgc3lzdGVtLgorICovCitTVEFUSUMgc3RydWN0IHhmc19xbSAqCit4ZnNfR3FtX2luaXQodm9pZCkKK3sKKwl4ZnNfcW1fdAkJKnhxbTsKKwlpbnQJCQloc2l6ZSwgaTsKKworCXhxbSA9IGttZW1femFsbG9jKHNpemVvZih4ZnNfcW1fdCksIEtNX1NMRUVQKTsKKwlBU1NFUlQoeHFtKTsKKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgZHF1b3QgaGFzaCB0YWJsZXMuCisJICovCisJaHNpemUgPSAoRFFVT1RfSEFTSF9IRVVSSVNUSUMgPCBYRlNfUU1fTkNTSVpFX1RIUkVTSE9MRCkgPworCQlYRlNfUU1fSEFTSFNJWkVfTE9XIDogWEZTX1FNX0hBU0hTSVpFX0hJR0g7CisJeHFtLT5xbV9kcWhhc2htYXNrID0gaHNpemUgLSAxOworCisJeHFtLT5xbV91c3JfZHFodGFibGUgPSAoeGZzX2RxaGFzaF90ICopa21lbV96YWxsb2MoaHNpemUgKgorCQkJCQkJICAgICAgc2l6ZW9mKHhmc19kcWhhc2hfdCksCisJCQkJCQkgICAgICBLTV9TTEVFUCk7CisJeHFtLT5xbV9ncnBfZHFodGFibGUgPSAoeGZzX2RxaGFzaF90ICopa21lbV96YWxsb2MoaHNpemUgKgorCQkJCQkJICAgICAgc2l6ZW9mKHhmc19kcWhhc2hfdCksCisJCQkJCQkgICAgICBLTV9TTEVFUCk7CisJQVNTRVJUKHhxbS0+cW1fdXNyX2RxaHRhYmxlICE9IE5VTEwpOworCUFTU0VSVCh4cW0tPnFtX2dycF9kcWh0YWJsZSAhPSBOVUxMKTsKKworCWZvciAoaSA9IDA7IGkgPCBoc2l6ZTsgaSsrKSB7CisJCXhmc19xbV9saXN0X2luaXQoJih4cW0tPnFtX3Vzcl9kcWh0YWJsZVtpXSksICJ1eGRxaCIsIGkpOworCQl4ZnNfcW1fbGlzdF9pbml0KCYoeHFtLT5xbV9ncnBfZHFodGFibGVbaV0pLCAiZ3hkcWgiLCBpKTsKKwl9CisKKwkvKgorCSAqIEZyZWVsaXN0IG9mIGFsbCBkcXVvdHMgb2YgYWxsIGZpbGUgc3lzdGVtcworCSAqLworCXhmc19xbV9mcmVlbGlzdF9pbml0KCYoeHFtLT5xbV9kcWZyZWVsaXN0KSk7CisKKwkvKgorCSAqIGRxdW90IHpvbmUuIHdlIHJlZ2lzdGVyIG91ciBvd24gbG93LW1lbW9yeSBjYWxsYmFjay4KKwkgKi8KKwlpZiAoIXFtX2Rxem9uZSkgeworCQl4cW0tPnFtX2Rxem9uZSA9IGttZW1fem9uZV9pbml0KHNpemVvZih4ZnNfZHF1b3RfdCksCisJCQkJCQkieGZzX2RxdW90cyIpOworCQlxbV9kcXpvbmUgPSB4cW0tPnFtX2Rxem9uZTsKKwl9IGVsc2UKKwkJeHFtLT5xbV9kcXpvbmUgPSBxbV9kcXpvbmU7CisKKwl4ZnNfcW1fc2hha2VyID0ga21lbV9zaGFrZV9yZWdpc3Rlcih4ZnNfcW1fc2hha2UpOworCisJLyoKKwkgKiBUaGUgdF9kcWluZm8gcG9ydGlvbiBvZiB0cmFuc2FjdGlvbnMuCisJICovCisJaWYgKCFxbV9kcXRyeHpvbmUpIHsKKwkJeHFtLT5xbV9kcXRyeHpvbmUgPSBrbWVtX3pvbmVfaW5pdChzaXplb2YoeGZzX2RxdW90X2FjY3RfdCksCisJCQkJCQkgICAieGZzX2RxdHJ4Iik7CisJCXFtX2RxdHJ4em9uZSA9IHhxbS0+cW1fZHF0cnh6b25lOworCX0gZWxzZQorCQl4cW0tPnFtX2RxdHJ4em9uZSA9IHFtX2RxdHJ4em9uZTsKKworCWF0b21pY19zZXQoJnhxbS0+cW1fdG90YWxkcXVvdHMsIDApOworCXhxbS0+cW1fZHFmcmVlX3JhdGlvID0gWEZTX1FNX0RRRlJFRV9SQVRJTzsKKwl4cW0tPnFtX25yZWZzID0gMDsKKyNpZmRlZiBERUJVRworCW11dGV4X2luaXQoJnFjaGVja19sb2NrLCBNVVRFWF9ERUZBVUxULCAicWNoayIpOworI2VuZGlmCisJcmV0dXJuIHhxbTsKK30KKworLyoKKyAqIERlc3Ryb3kgdGhlIGdsb2JhbCBxdW90YSBtYW5hZ2VyIHdoZW4gaXRzIHJlZmVyZW5jZSBjb3VudCBnb2VzIHRvIHplcm8uCisgKi8KK3ZvaWQKK3hmc19xbV9kZXN0cm95KAorCXN0cnVjdCB4ZnNfcW0JKnhxbSkKK3sKKwlpbnQJCWhzaXplLCBpOworCisJQVNTRVJUKHhxbSAhPSBOVUxMKTsKKwlBU1NFUlQoeHFtLT5xbV9ucmVmcyA9PSAwKTsKKwlrbWVtX3NoYWtlX2RlcmVnaXN0ZXIoeGZzX3FtX3NoYWtlcik7CisJaHNpemUgPSB4cW0tPnFtX2RxaGFzaG1hc2sgKyAxOworCWZvciAoaSA9IDA7IGkgPCBoc2l6ZTsgaSsrKSB7CisJCXhmc19xbV9saXN0X2Rlc3Ryb3koJih4cW0tPnFtX3Vzcl9kcWh0YWJsZVtpXSkpOworCQl4ZnNfcW1fbGlzdF9kZXN0cm95KCYoeHFtLT5xbV9ncnBfZHFodGFibGVbaV0pKTsKKwl9CisJa21lbV9mcmVlKHhxbS0+cW1fdXNyX2RxaHRhYmxlLCBoc2l6ZSAqIHNpemVvZih4ZnNfZHFoYXNoX3QpKTsKKwlrbWVtX2ZyZWUoeHFtLT5xbV9ncnBfZHFodGFibGUsIGhzaXplICogc2l6ZW9mKHhmc19kcWhhc2hfdCkpOworCXhxbS0+cW1fdXNyX2RxaHRhYmxlID0gTlVMTDsKKwl4cW0tPnFtX2dycF9kcWh0YWJsZSA9IE5VTEw7CisJeHFtLT5xbV9kcWhhc2htYXNrID0gMDsKKwl4ZnNfcW1fZnJlZWxpc3RfZGVzdHJveSgmKHhxbS0+cW1fZHFmcmVlbGlzdCkpOworI2lmZGVmIERFQlVHCisJbXV0ZXhfZGVzdHJveSgmcWNoZWNrX2xvY2spOworI2VuZGlmCisJa21lbV9mcmVlKHhxbSwgc2l6ZW9mKHhmc19xbV90KSk7Cit9CisKKy8qCisgKiBDYWxsZWQgYXQgbW91bnQgdGltZSB0byBsZXQgWFFNIGtub3cgdGhhdCBhbm90aGVyIGZpbGUgc3lzdGVtIGlzCisgKiBzdGFydGluZyBxdW90YXMuIFRoaXMgaXNuJ3QgY3J1Y2lhbCBpbmZvcm1hdGlvbiBhcyB0aGUgaW5kaXZpZHVhbCBtb3VudAorICogc3RydWN0dXJlcyBhcmUgcHJldHR5IGluZGVwZW5kZW50LCBidXQgaXQgaGVscHMgdGhlIFhRTSBrZWVwIGEKKyAqIGdsb2JhbCB2aWV3IG9mIHdoYXQncyBnb2luZyBvbi4KKyAqLworLyogQVJHU1VTRUQgKi8KK1NUQVRJQyBpbnQKK3hmc19xbV9ob2xkX3F1b3RhZnNfcmVmKAorCXN0cnVjdCB4ZnNfbW91bnQgKm1wKQoreworCS8qCisJICogTmVlZCB0byBsb2NrIHRoZSB4ZnNfR3FtIHN0cnVjdHVyZSBmb3IgdGhpbmdzIGxpa2UgdGhpcy4gRm9yIGV4YW1wbGUsCisJICogdGhlIHN0cnVjdHVyZSBjb3VsZCBkaXNhcHBlYXIgYmV0d2VlbiB0aGUgZW50cnkgdG8gdGhpcyByb3V0aW5lIGFuZAorCSAqIGEgSE9MRCBvcGVyYXRpb24gaWYgbm90IGxvY2tlZC4KKwkgKi8KKwlYRlNfUU1fTE9DSyh4ZnNfR3FtKTsKKworCWlmICh4ZnNfR3FtID09IE5VTEwpCisJCXhmc19HcW0gPSB4ZnNfR3FtX2luaXQoKTsKKwkvKgorCSAqIFdlIGNhbiBrZWVwIGEgbGlzdCBvZiBhbGwgZmlsZXN5c3RlbXMgd2l0aCBxdW90YXMgbW91bnRlZCBmb3IKKwkgKiBkZWJ1Z2dpbmcgYW5kIHN0YXRpc3RpY2FsIHB1cnBvc2VzLCBidXQgLi4uCisJICogSnVzdCB0YWtlIGEgcmVmZXJlbmNlIGFuZCBnZXQgb3V0LgorCSAqLworCVhGU19RTV9IT0xEKHhmc19HcW0pOworCVhGU19RTV9VTkxPQ0soeGZzX0dxbSk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogUmVsZWFzZSB0aGUgcmVmZXJlbmNlIHRoYXQgYSBmaWxlc3lzdGVtIHRvb2sgYXQgbW91bnQgdGltZSwKKyAqIHNvIHRoYXQgd2Uga25vdyB3aGVuIHdlIG5lZWQgdG8gZGVzdHJveSB0aGUgZW50aXJlIHF1b3RhIG1hbmFnZXIuCisgKi8KKy8qIEFSR1NVU0VEICovCitTVEFUSUMgdm9pZAoreGZzX3FtX3JlbGVfcXVvdGFmc19yZWYoCisJc3RydWN0IHhmc19tb3VudCAqbXApCit7CisJeGZzX2RxdW90X3QJKmRxcCwgKm5leHRkcXA7CisKKwlBU1NFUlQoeGZzX0dxbSk7CisJQVNTRVJUKHhmc19HcW0tPnFtX25yZWZzID4gMCk7CisKKwkvKgorCSAqIEdvIHRocnUgdGhlIGZyZWVsaXN0IGFuZCBkZXN0cm95IGFsbCBpbmFjdGl2ZSBkcXVvdHMuCisJICovCisJeGZzX3FtX2ZyZWVsaXN0X2xvY2soeGZzX0dxbSk7CisKKwlmb3IgKGRxcCA9IHhmc19HcW0tPnFtX2RxZnJlZWxpc3QucWhfbmV4dDsKKwkgICAgIGRxcCAhPSAoeGZzX2RxdW90X3QgKikmKHhmc19HcW0tPnFtX2RxZnJlZWxpc3QpOyApIHsKKwkJeGZzX2RxbG9jayhkcXApOworCQluZXh0ZHFwID0gZHFwLT5kcV9mbG5leHQ7CisJCWlmIChkcXAtPmRxX2ZsYWdzICYgWEZTX0RRX0lOQUNUSVZFKSB7CisJCQlBU1NFUlQoZHFwLT5xX21vdW50ID09IE5VTEwpOworCQkJQVNTRVJUKCEgWEZTX0RRX0lTX0RJUlRZKGRxcCkpOworCQkJQVNTRVJUKGRxcC0+SExfUFJFVlAgPT0gTlVMTCk7CisJCQlBU1NFUlQoZHFwLT5NUExfUFJFVlAgPT0gTlVMTCk7CisJCQlYUU1fRlJFRUxJU1RfUkVNT1ZFKGRxcCk7CisJCQl4ZnNfZHF1bmxvY2soZHFwKTsKKwkJCXhmc19xbV9kcWRlc3Ryb3koZHFwKTsKKwkJfSBlbHNlIHsKKwkJCXhmc19kcXVubG9jayhkcXApOworCQl9CisJCWRxcCA9IG5leHRkcXA7CisJfQorCXhmc19xbV9mcmVlbGlzdF91bmxvY2soeGZzX0dxbSk7CisKKwkvKgorCSAqIERlc3Ryb3kgdGhlIGVudGlyZSBYUU0uIElmIHNvbWVib2R5IG1vdW50cyB3aXRoIHF1b3Rhb24sIHRoaXMnbGwKKwkgKiBiZSByZXN0YXJ0ZWQuCisJICovCisJWEZTX1FNX0xPQ0soeGZzX0dxbSk7CisJWEZTX1FNX1JFTEUoeGZzX0dxbSk7CisJaWYgKHhmc19HcW0tPnFtX25yZWZzID09IDApIHsKKwkJeGZzX3FtX2Rlc3Ryb3koeGZzX0dxbSk7CisJCXhmc19HcW0gPSBOVUxMOworCX0KKwlYRlNfUU1fVU5MT0NLKHhmc19HcW0pOworfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgYXQgbW91bnQgdGltZSBmcm9tIHhmc19tb3VudGZzIHRvIGluaXRpYWxpemUgdGhlIHF1b3RhaW5mbworICogc3RydWN0dXJlIGFuZCBzdGFydCB0aGUgZ2xvYmFsIHF1b3RhbWFuYWdlciAoeGZzX0dxbSkgaWYgaXQgaGFzbid0IGRvbmUKKyAqIHNvIGFscmVhZHkuCU5vdGUgdGhhdCB0aGUgc3VwZXJibG9jayBoYXMgbm90IGJlZW4gcmVhZCBpbiB5ZXQuCisgKi8KK3ZvaWQKK3hmc19xbV9tb3VudF9xdW90YWluaXQoCisJeGZzX21vdW50X3QJKm1wLAorCXVpbnQJCWZsYWdzKQoreworCS8qCisJICogVXNlciBvciBncm91cCBxdW90YXMgaGFzIHRvIGJlIG9uLgorCSAqLworCUFTU0VSVChmbGFncyAmIChYRlNNTlRfVVFVT1RBIHwgWEZTTU5UX0dRVU9UQSkpOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBmbGFncyBpbiB0aGUgbW91bnQgc3RydWN0dXJlLiBGcm9tIHRoaXMgcG9pbnQKKwkgKiBvbndhcmRzIHdlIGxvb2sgYXQgbV9xZmxhZ3MgdG8gZmlndXJlIG91dCBpZiBxdW90YXMncyBPTi9PRkYsIGV0Yy4KKwkgKiBOb3RlIHRoYXQgd2UgZW5mb3JjZSBub3RoaW5nIGlmIGFjY291bnRpbmcgaXMgb2ZmLgorCSAqIGllLglYRlNNTlRfKlFVT1RBIG11c3QgYmUgT04gZm9yIFhGU01OVF8qUVVPVEFFTkYuCisJICogSXQgaXNuJ3QgbmVjZXNzYXJ5IHRvIHRha2UgdGhlIHF1b3Rhb2ZmIGxvY2sgdG8gZG8gdGhpczsgdGhpcyBpcworCSAqIGNhbGxlZCBmcm9tIG1vdW50LgorCSAqLworCWlmIChmbGFncyAmIFhGU01OVF9VUVVPVEEpIHsKKwkJbXAtPm1fcWZsYWdzIHw9IChYRlNfVVFVT1RBX0FDQ1QgfCBYRlNfVVFVT1RBX0FDVElWRSk7CisJCWlmIChmbGFncyAmIFhGU01OVF9VUVVPVEFFTkYpCisJCQltcC0+bV9xZmxhZ3MgfD0gWEZTX1VRVU9UQV9FTkZEOworCX0KKwlpZiAoZmxhZ3MgJiBYRlNNTlRfR1FVT1RBKSB7CisJCW1wLT5tX3FmbGFncyB8PSAoWEZTX0dRVU9UQV9BQ0NUIHwgWEZTX0dRVU9UQV9BQ1RJVkUpOworCQlpZiAoZmxhZ3MgJiBYRlNNTlRfR1FVT1RBRU5GKQorCQkJbXAtPm1fcWZsYWdzIHw9IFhGU19HUVVPVEFfRU5GRDsKKwl9Cit9CisKKy8qCisgKiBKdXN0IGRlc3Ryb3kgdGhlIHF1b3RhaW5mbyBzdHJ1Y3R1cmUuCisgKi8KK3ZvaWQKK3hmc19xbV91bm1vdW50X3F1b3RhZGVzdHJveSgKKwl4ZnNfbW91bnRfdAkqbXApCit7CisJaWYgKG1wLT5tX3F1b3RhaW5mbykKKwkJeGZzX3FtX2Rlc3Ryb3lfcXVvdGFpbmZvKG1wKTsKK30KKworCisvKgorICogVGhpcyBpcyBjYWxsZWQgZnJvbSB4ZnNfbW91bnRmcyB0byBzdGFydCBxdW90YXMgYW5kIGluaXRpYWxpemUgYWxsCisgKiBuZWNlc3NhcnkgZGF0YSBzdHJ1Y3R1cmVzIGxpa2UgcXVvdGFpbmZvLiAgVGhpcyBpcyBhbHNvIHJlc3BvbnNpYmxlIGZvcgorICogcnVubmluZyBhIHF1b3RhY2hlY2sgYXMgbmVjZXNzYXJ5LiAgV2UgYXJlIGd1YXJhbnRlZWQgdGhhdCB0aGUgc3VwZXJibG9jaworICogaXMgY29uc2lzdGVudGx5IHJlYWQgaW4gYXQgdGhpcyBwb2ludC4KKyAqLworaW50Cit4ZnNfcW1fbW91bnRfcXVvdGFzKAorCXhmc19tb3VudF90CSptcCwKKwlpbnQJCW1mc2lfZmxhZ3MpCit7CisJdW5zaWduZWQgbG9uZwlzOworCWludAkJZXJyb3IgPSAwOworCXVpbnQJCXNiZjsKKworCS8qCisJICogSWYgYSBmaWxlIHN5c3RlbSBoYWQgcXVvdGFzIHJ1bm5pbmcgZWFybGllciwgYnV0IGRlY2lkZWQgdG8KKwkgKiBtb3VudCB3aXRob3V0IC1vIHF1b3RhL3VxdW90YS9ncXVvdGEgb3B0aW9ucywgcmV2b2tlIHRoZQorCSAqIHF1b3RhY2hlY2tlZCBsaWNlbnNlLCBhbmQgYmFpbCBvdXQuCisJICovCisJaWYgKCEgWEZTX0lTX1FVT1RBX09OKG1wKSAmJgorCSAgICAobXAtPm1fc2Iuc2JfcWZsYWdzICYgKFhGU19VUVVPVEFfQUNDVHxYRlNfR1FVT1RBX0FDQ1QpKSkgeworCQltcC0+bV9xZmxhZ3MgPSAwOworCQlnb3RvIHdyaXRlX2NoYW5nZXM7CisJfQorCisJLyoKKwkgKiBJZiBxdW90YXMgb24gcmVhbHRpbWUgdm9sdW1lcyBpcyBub3Qgc3VwcG9ydGVkLCB3ZSBkaXNhYmxlCisJICogcXVvdGFzIGltbWVkaWF0ZWx5LgorCSAqLworCWlmIChtcC0+bV9zYi5zYl9yZXh0ZW50cykgeworCQljbW5fZXJyKENFX05PVEUsCisJCQkiQ2Fubm90IHR1cm4gb24gcXVvdGFzIGZvciByZWFsdGltZSBmaWxlc3lzdGVtICVzIiwKKwkJCW1wLT5tX2ZzbmFtZSk7CisJCW1wLT5tX3FmbGFncyA9IDA7CisJCWdvdG8gd3JpdGVfY2hhbmdlczsKKwl9CisKKyNpZiBkZWZpbmVkKERFQlVHKSAmJiBkZWZpbmVkKFhGU19MT1VEX1JFQ09WRVJZKQorCWNtbl9lcnIoQ0VfTk9URSwgIkF0dGVtcHRpbmcgdG8gdHVybiBvbiBkaXNrIHF1b3Rhcy4iKTsKKyNlbmRpZgorCisJQVNTRVJUKFhGU19JU19RVU9UQV9SVU5OSU5HKG1wKSk7CisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUgcXVvdGFpbmZvIHN0cnVjdHVyZSBpbnNpZGUgdGhlIG1vdW50IHN0cnVjdCwgYW5kCisJICogY3JlYXRlIHF1b3RhaW5vZGUocyksIGFuZCBjaGFuZ2UvcmV2IHN1cGVyYmxvY2sgaWYgbmVjZXNzYXJ5LgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfcW1faW5pdF9xdW90YWluZm8obXApKSkgeworCQkvKgorCQkgKiBXZSBtdXN0IHR1cm4gb2ZmIHF1b3Rhcy4KKwkJICovCisJCUFTU0VSVChtcC0+bV9xdW90YWluZm8gPT0gTlVMTCk7CisJCW1wLT5tX3FmbGFncyA9IDA7CisJCWdvdG8gd3JpdGVfY2hhbmdlczsKKwl9CisJLyoKKwkgKiBJZiBhbnkgb2YgdGhlIHF1b3RhcyBhcmUgbm90IGNvbnNpc3RlbnQsIGRvIGEgcXVvdGFjaGVjay4KKwkgKi8KKwlpZiAoWEZTX1FNX05FRURfUVVPVEFDSEVDSyhtcCkgJiYKKwkJIShtZnNpX2ZsYWdzICYgWEZTX01GU0lfTk9fUVVPVEFDSEVDSykpIHsKKyNpZmRlZiBERUJVRworCQljbW5fZXJyKENFX05PVEUsICJEb2luZyBhIHF1b3RhY2hlY2suIFBsZWFzZSB3YWl0LiIpOworI2VuZGlmCisJCWlmICgoZXJyb3IgPSB4ZnNfcW1fcXVvdGFjaGVjayhtcCkpKSB7CisJCQkvKiBRdW90YWNoZWNrIGhhcyBmYWlsZWQgYW5kIHF1b3RhcyBoYXZlCisJCQkgKiBiZWVuIGRpc2FibGVkLgorCQkJICovCisJCQlyZXR1cm4gWEZTX0VSUk9SKGVycm9yKTsKKwkJfQorI2lmZGVmIERFQlVHCisJCWNtbl9lcnIoQ0VfTk9URSwgIkRvbmUgcXVvdGFjaGVjay4iKTsKKyNlbmRpZgorCX0KKyB3cml0ZV9jaGFuZ2VzOgorCS8qCisJICogV2UgYWN0dWFsbHkgZG9uJ3QgaGF2ZSB0byBhY3F1aXJlIHRoZSBTQl9MT0NLIGF0IGFsbC4KKwkgKiBUaGlzIGNhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIG1vdW50LCBhbmQgdGhhdCdzIHNpbmdsZSB0aHJlYWRlZC4gWFhYCisJICovCisJcyA9IFhGU19TQl9MT0NLKG1wKTsKKwlzYmYgPSBtcC0+bV9zYi5zYl9xZmxhZ3M7CisJbXAtPm1fc2Iuc2JfcWZsYWdzID0gbXAtPm1fcWZsYWdzICYgWEZTX01PVU5UX1FVT1RBX0FMTDsKKwlYRlNfU0JfVU5MT0NLKG1wLCBzKTsKKworCWlmIChzYmYgIT0gKG1wLT5tX3FmbGFncyAmIFhGU19NT1VOVF9RVU9UQV9BTEwpKSB7CisJCWlmICh4ZnNfcW1fd3JpdGVfc2JfY2hhbmdlcyhtcCwgWEZTX1NCX1FGTEFHUykpIHsKKwkJCS8qCisJCQkgKiBXZSBjb3VsZCBvbmx5IGhhdmUgYmVlbiB0dXJuaW5nIHF1b3RhcyBvZmYuCisJCQkgKiBXZSBhcmVuJ3QgaW4gdmVyeSBnb29kIHNoYXBlIGFjdHVhbGx5IGJlY2F1c2UKKwkJCSAqIHRoZSBpbmNvcmUgc3RydWN0dXJlcyBhcmUgY29udmluY2VkIHRoYXQgcXVvdGFzIGFyZQorCQkJICogb2ZmLCBidXQgdGhlIG9uIGRpc2sgc3VwZXJibG9jayBkb2Vzbid0IGtub3cgdGhhdCAhCisJCQkgKi8KKwkJCUFTU0VSVCghKFhGU19JU19RVU9UQV9SVU5OSU5HKG1wKSkpOworCQkJeGZzX2ZzX2Ntbl9lcnIoQ0VfQUxFUlQsIG1wLAorCQkJCSJYRlMgbW91bnRfcXVvdGFzOiBTdXBlcmJsb2NrIHVwZGF0ZSBmYWlsZWQhIik7CisJCX0KKwl9CisKKwlpZiAoZXJyb3IpIHsKKwkJeGZzX2ZzX2Ntbl9lcnIoQ0VfV0FSTiwgbXAsCisJCQkiRmFpbGVkIHRvIGluaXRpYWxpemUgZGlzayBxdW90YXMuIik7CisJfQorCXJldHVybiBYRlNfRVJST1IoZXJyb3IpOworfQorCisvKgorICogQ2FsbGVkIGZyb20gdGhlIHZmc29wcyBsYXllci4KKyAqLworaW50Cit4ZnNfcW1fdW5tb3VudF9xdW90YXMoCisJeGZzX21vdW50X3QJKm1wKQoreworCXhmc19pbm9kZV90CSp1cXAsICpncXA7CisJaW50CQllcnJvciA9IDA7CisKKwkvKgorCSAqIFJlbGVhc2UgdGhlIGRxdW90cyB0aGF0IHJvb3QgaW5vZGUsIGV0IGFsIG1pZ2h0IGJlIGhvbGRpbmcsCisJICogYmVmb3JlIHdlIGZsdXNoIHF1b3RhcyBhbmQgYmxvdyBhd2F5IHRoZSBxdW90YWluZm8gc3RydWN0dXJlLgorCSAqLworCUFTU0VSVChtcC0+bV9yb290aXApOworCXhmc19xbV9kcWRldGFjaChtcC0+bV9yb290aXApOworCWlmIChtcC0+bV9yYm1pcCkKKwkJeGZzX3FtX2RxZGV0YWNoKG1wLT5tX3JibWlwKTsKKwlpZiAobXAtPm1fcnN1bWlwKQorCQl4ZnNfcW1fZHFkZXRhY2gobXAtPm1fcnN1bWlwKTsKKworCS8qCisJICogRmx1c2ggb3V0IHRoZSBxdW90YSBpbm9kZXMuCisJICovCisJdXFwID0gZ3FwID0gTlVMTDsKKwlpZiAobXAtPm1fcXVvdGFpbmZvKSB7CisJCWlmICgodXFwID0gbXAtPm1fcXVvdGFpbmZvLT5xaV91cXVvdGFpcCkgIT0gTlVMTCkgeworCQkJeGZzX2lsb2NrKHVxcCwgWEZTX0lMT0NLX0VYQ0wpOworCQkJeGZzX2lmbG9jayh1cXApOworCQkJZXJyb3IgPSB4ZnNfaWZsdXNoKHVxcCwgWEZTX0lGTFVTSF9TWU5DKTsKKwkJCXhmc19pdW5sb2NrKHVxcCwgWEZTX0lMT0NLX0VYQ0wpOworCQkJaWYgKHVubGlrZWx5KGVycm9yID09IEVGU0NPUlJVUFRFRCkpIHsKKwkJCQlYRlNfRVJST1JfUkVQT1JUKCJ4ZnNfcW1fdW5tb3VudF9xdW90YXMoMSkiLAorCQkJCQkJIFhGU19FUlJMRVZFTF9MT1csIG1wKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQlpZiAoKGdxcCA9IG1wLT5tX3F1b3RhaW5mby0+cWlfZ3F1b3RhaXApICE9IE5VTEwpIHsKKwkJCXhmc19pbG9jayhncXAsIFhGU19JTE9DS19FWENMKTsKKwkJCXhmc19pZmxvY2soZ3FwKTsKKwkJCWVycm9yID0geGZzX2lmbHVzaChncXAsIFhGU19JRkxVU0hfU1lOQyk7CisJCQl4ZnNfaXVubG9jayhncXAsIFhGU19JTE9DS19FWENMKTsKKwkJCWlmICh1bmxpa2VseShlcnJvciA9PSBFRlNDT1JSVVBURUQpKSB7CisJCQkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX3FtX3VubW91bnRfcXVvdGFzKDIpIiwKKwkJCQkJCSBYRlNfRVJSTEVWRUxfTE9XLCBtcCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwl9CisJaWYgKHVxcCkgeworCQkgWEZTX1BVUkdFX0lOT0RFKHVxcCk7CisJCSBtcC0+bV9xdW90YWluZm8tPnFpX3VxdW90YWlwID0gTlVMTDsKKwl9CisJaWYgKGdxcCkgeworCQlYRlNfUFVSR0VfSU5PREUoZ3FwKTsKKwkJbXAtPm1fcXVvdGFpbmZvLT5xaV9ncXVvdGFpcCA9IE5VTEw7CisJfQorb3V0OgorCXJldHVybiBYRlNfRVJST1IoZXJyb3IpOworfQorCisvKgorICogRmx1c2ggYWxsIGRxdW90cyBvZiB0aGUgZ2l2ZW4gZmlsZSBzeXN0ZW0gdG8gZGlzay4gVGhlIGRxdW90cyBhcmUKKyAqIF9ub3RfIHB1cmdlZCBmcm9tIG1lbW9yeSBoZXJlLCBqdXN0IHRoZWlyIGRhdGEgd3JpdHRlbiB0byBkaXNrLgorICovCitpbnQKK3hmc19xbV9kcWZsdXNoX2FsbCgKKwl4ZnNfbW91bnRfdAkqbXAsCisJaW50CQlmbGFncykKK3sKKwlpbnQJCXJlY2w7CisJeGZzX2RxdW90X3QJKmRxcDsKKwlpbnQJCW5pdGVyczsKKwlpbnQJCWVycm9yOworCisJaWYgKG1wLT5tX3F1b3RhaW5mbyA9PSBOVUxMKQorCQlyZXR1cm4gKDApOworCW5pdGVycyA9IDA7CithZ2FpbjoKKwl4ZnNfcW1fbXBsaXN0X2xvY2sobXApOworCUZPUkVBQ0hfRFFVT1RfSU5fTVAoZHFwLCBtcCkgeworCQl4ZnNfZHFsb2NrKGRxcCk7CisJCWlmICghIFhGU19EUV9JU19ESVJUWShkcXApKSB7CisJCQl4ZnNfZHF1bmxvY2soZHFwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXhmc19kcXRyYWNlX2VudHJ5KGRxcCwgIkZMVVNIQUxMOiBEUURJUlRZIik7CisJCS8qIFhYWCBhIHNlbnRpbmVsIHdvdWxkIGJlIGJldHRlciAqLworCQlyZWNsID0gWEZTX1FJX01QTFJFQ0xBSU1TKG1wKTsKKwkJaWYgKCEgeGZzX3FtX2RxZmxvY2tfbm93YWl0KGRxcCkpIHsKKwkJCS8qCisJCQkgKiBJZiB3ZSBjYW4ndCBncmFiIHRoZSBmbHVzaCBsb2NrIHRoZW4gY2hlY2sKKwkJCSAqIHRvIHNlZSBpZiB0aGUgZHF1b3QgaGFzIGJlZW4gZmx1c2hlZCBkZWxheWVkCisJCQkgKiB3cml0ZS4gIElmIHNvLCBncmFiIGl0cyBidWZmZXIgYW5kIHNlbmQgaXQKKwkJCSAqIG91dCBpbW1lZGlhdGVseS4gIFdlJ2xsIGJlIGFibGUgdG8gYWNxdWlyZQorCQkJICogdGhlIGZsdXNoIGxvY2sgd2hlbiB0aGUgSS9PIGNvbXBsZXRlcy4KKwkJCSAqLworCQkJeGZzX3FtX2RxZmxvY2tfcHVzaGJ1Zl93YWl0KGRxcCk7CisJCX0KKwkJLyoKKwkJICogTGV0IGdvIG9mIHRoZSBtcGxpc3QgbG9jay4gV2UgZG9uJ3Qgd2FudCB0byBob2xkIGl0CisJCSAqIGFjcm9zcyBhIGRpc2sgd3JpdGUuCisJCSAqLworCQl4ZnNfcW1fbXBsaXN0X3VubG9jayhtcCk7CisJCWVycm9yID0geGZzX3FtX2RxZmx1c2goZHFwLCBmbGFncyk7CisJCXhmc19kcXVubG9jayhkcXApOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gKGVycm9yKTsKKworCQl4ZnNfcW1fbXBsaXN0X2xvY2sobXApOworCQlpZiAocmVjbCAhPSBYRlNfUUlfTVBMUkVDTEFJTVMobXApKSB7CisJCQl4ZnNfcW1fbXBsaXN0X3VubG9jayhtcCk7CisJCQkvKiBYWFggcmVzdGFydCBsaW1pdCAqLworCQkJZ290byBhZ2FpbjsKKwkJfQorCX0KKworCXhmc19xbV9tcGxpc3RfdW5sb2NrKG1wKTsKKwkvKiByZXR1cm4gISBidXN5ICovCisJcmV0dXJuICgwKTsKK30KKy8qCisgKiBSZWxlYXNlIHRoZSBncm91cCBkcXVvdCBwb2ludGVycyB0aGUgdXNlciBkcXVvdHMgbWF5IGJlCisgKiBjYXJyeWluZyBhcm91bmQgYXMgYSBoaW50LiBtcGxpc3QgaXMgbG9ja2VkIG9uIGVudHJ5IGFuZCBleGl0LgorICovCitTVEFUSUMgdm9pZAoreGZzX3FtX2RldGFjaF9nZHF1b3RzKAorCXhmc19tb3VudF90CSptcCkKK3sKKwl4ZnNfZHF1b3RfdAkqZHFwLCAqZ2RxcDsKKwlpbnQJCW5yZWNsOworCisgYWdhaW46CisJQVNTRVJUKFhGU19RTV9JU19NUExJU1RfTE9DS0VEKG1wKSk7CisJZHFwID0gWEZTX1FJX01QTE5FWFQobXApOworCXdoaWxlIChkcXApIHsKKwkJeGZzX2RxbG9jayhkcXApOworCQlpZiAoKGdkcXAgPSBkcXAtPnFfZ2RxdW90KSkgeworCQkJeGZzX2RxbG9jayhnZHFwKTsKKwkJCWRxcC0+cV9nZHF1b3QgPSBOVUxMOworCQl9CisJCXhmc19kcXVubG9jayhkcXApOworCisJCWlmIChnZHFwKSB7CisJCQkvKgorCQkJICogQ2FuJ3QgaG9sZCB0aGUgbXBsaXN0IGxvY2sgYWNyb3NzIGEgZHFwdXQuCisJCQkgKiBYWFhtdXN0IGNvbnZlcnQgdG8gbWFya2VyIGJhc2VkIGl0ZXJhdGlvbnMgaGVyZS4KKwkJCSAqLworCQkJbnJlY2wgPSBYRlNfUUlfTVBMUkVDTEFJTVMobXApOworCQkJeGZzX3FtX21wbGlzdF91bmxvY2sobXApOworCQkJeGZzX3FtX2RxcHV0KGdkcXApOworCisJCQl4ZnNfcW1fbXBsaXN0X2xvY2sobXApOworCQkJaWYgKG5yZWNsICE9IFhGU19RSV9NUExSRUNMQUlNUyhtcCkpCisJCQkJZ290byBhZ2FpbjsKKwkJfQorCQlkcXAgPSBkcXAtPk1QTF9ORVhUOworCX0KK30KKworLyoKKyAqIEdvIHRocm91Z2ggYWxsIHRoZSBpbmNvcmUgZHF1b3RzIG9mIHRoaXMgZmlsZSBzeXN0ZW0gYW5kIHRha2UgdGhlbQorICogb2ZmIHRoZSBtcGxpc3QgYW5kIGhhc2hsaXN0LCBpZiB0aGUgZHF1b3QgdHlwZSBtYXRjaGVzIHRoZSBkcXR5cGUKKyAqIHBhcmFtZXRlci4gVGhpcyBpcyB1c2VkIHdoZW4gdHVybmluZyBvZmYgcXVvdGEgYWNjb3VudGluZyBmb3IKKyAqIHVzZXJzIGFuZC9vciBncm91cHMsIGFzIHdlbGwgYXMgd2hlbiB0aGUgZmlsZXN5c3RlbSBpcyB1bm1vdW50aW5nLgorICovCitTVEFUSUMgaW50Cit4ZnNfcW1fZHFwdXJnZV9pbnQoCisJeGZzX21vdW50X3QJKm1wLAorCXVpbnQJCWZsYWdzKSAvKiBRVU9UQU9GRi9VTU9VTlRJTkcvVVFVT1RBL0dRVU9UQSAqLworeworCXhmc19kcXVvdF90CSpkcXA7CisJdWludAkJZHF0eXBlOworCWludAkJbnJlY2w7CisJeGZzX2RxdW90X3QJKm5leHRkcXA7CisJaW50CQlubWlzc2VzOworCisJaWYgKG1wLT5tX3F1b3RhaW5mbyA9PSBOVUxMKQorCQlyZXR1cm4gKDApOworCisJZHF0eXBlID0gKGZsYWdzICYgWEZTX1FNT1BUX1VRVU9UQSkgPyBYRlNfRFFfVVNFUiA6IDA7CisJZHF0eXBlIHw9IChmbGFncyAmIFhGU19RTU9QVF9HUVVPVEEpID8gWEZTX0RRX0dST1VQIDogMDsKKworCXhmc19xbV9tcGxpc3RfbG9jayhtcCk7CisKKwkvKgorCSAqIEluIHRoZSBmaXJzdCBwYXNzIHRocm91Z2ggYWxsIGluY29yZSBkcXVvdHMgb2YgdGhpcyBmaWxlc3lzdGVtLAorCSAqIHdlIHJlbGVhc2UgdGhlIGdyb3VwIGRxdW90IHBvaW50ZXJzIHRoZSB1c2VyIGRxdW90cyBtYXkgYmUKKwkgKiBjYXJyeWluZyBhcm91bmQgYXMgYSBoaW50LiBXZSBuZWVkIHRvIGRvIHRoaXMgaXJyZXNwZWN0aXZlIG9mCisJICogd2hhdCdzIGJlaW5nIHR1cm5lZCBvZmYuCisJICovCisJeGZzX3FtX2RldGFjaF9nZHF1b3RzKG1wKTsKKworICAgICAgYWdhaW46CisJbm1pc3NlcyA9IDA7CisJQVNTRVJUKFhGU19RTV9JU19NUExJU1RfTE9DS0VEKG1wKSk7CisJLyoKKwkgKiBUcnkgdG8gZ2V0IHJpZCBvZiBhbGwgb2YgdGhlIHVud2FudGVkIGRxdW90cy4gVGhlIGlkZWEgaXMgdG8KKwkgKiBnZXQgdGhlbSBvZmYgbXBsaXN0IGFuZCBoYXNobGlzdCwgYnV0IGxlYXZlIHRoZW0gb24gZnJlZWxpc3QuCisJICovCisJZHFwID0gWEZTX1FJX01QTE5FWFQobXApOworCXdoaWxlIChkcXApIHsKKwkJLyoKKwkJICogSXQncyBPSyB0byBsb29rIGF0IHRoZSB0eXBlIHdpdGhvdXQgdGFraW5nIGRxbG9jayBoZXJlLgorCQkgKiBXZSdyZSBob2xkaW5nIHRoZSBtcGxpc3QgbG9jayBoZXJlLCBhbmQgdGhhdCdzIG5lZWRlZCBmb3IKKwkJICogYSBkcXJlY2xhaW0uCisJCSAqLworCQlpZiAoKGRxcC0+ZHFfZmxhZ3MgJiBkcXR5cGUpID09IDApIHsKKwkJCWRxcCA9IGRxcC0+TVBMX05FWFQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghIHhmc19xbV9kcWhhc2hsb2NrX25vd2FpdChkcXApKSB7CisJCQlucmVjbCA9IFhGU19RSV9NUExSRUNMQUlNUyhtcCk7CisJCQl4ZnNfcW1fbXBsaXN0X3VubG9jayhtcCk7CisJCQlYRlNfRFFfSEFTSF9MT0NLKGRxcC0+cV9oYXNoKTsKKwkJCXhmc19xbV9tcGxpc3RfbG9jayhtcCk7CisKKwkJCS8qCisJCQkgKiBYWFhUaGVvcmV0aWNhbGx5LCB3ZSBjYW4gZ2V0IGludG8gYSB2ZXJ5IGxvbmcKKwkJCSAqIHBpbmcgcG9uZyBnYW1lIGhlcmUuCisJCQkgKiBObyBvbmUgY2FuIGJlIGFkZGluZyBkcXVvdHMgdG8gdGhlIG1wbGlzdCBhdAorCQkJICogdGhpcyBwb2ludCwgYnV0IHNvbWVib2R5IG1pZ2h0IGJlIHRha2luZyB0aGluZ3Mgb2ZmLgorCQkJICovCisJCQlpZiAobnJlY2wgIT0gWEZTX1FJX01QTFJFQ0xBSU1TKG1wKSkgeworCQkJCVhGU19EUV9IQVNIX1VOTE9DSyhkcXAtPnFfaGFzaCk7CisJCQkJZ290byBhZ2FpbjsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIFRha2UgdGhlIGRxdW90IG9mZiB0aGUgbXBsaXN0IGFuZCBoYXNobGlzdC4gSXQgbWF5IHJlbWFpbiBvbgorCQkgKiBmcmVlbGlzdCBpbiBJTkFDVElWRSBzdGF0ZS4KKwkJICovCisJCW5leHRkcXAgPSBkcXAtPk1QTF9ORVhUOworCQlubWlzc2VzICs9IHhmc19xbV9kcXB1cmdlKGRxcCwgZmxhZ3MpOworCQlkcXAgPSBuZXh0ZHFwOworCX0KKwl4ZnNfcW1fbXBsaXN0X3VubG9jayhtcCk7CisJcmV0dXJuIG5taXNzZXM7Cit9CisKK2ludAoreGZzX3FtX2RxcHVyZ2VfYWxsKAorCXhmc19tb3VudF90CSptcCwKKwl1aW50CQlmbGFncykKK3sKKwlpbnQJCW5kcXVvdHM7CisKKwkvKgorCSAqIFB1cmdlIHRoZSBkcXVvdCBjYWNoZS4KKwkgKiBOb25lIG9mIHRoZSBkcXVvdHMgc2hvdWxkIHJlYWxseSBiZSBidXN5IGF0IHRoaXMgcG9pbnQuCisJICovCisJaWYgKG1wLT5tX3F1b3RhaW5mbykgeworCQl3aGlsZSAoKG5kcXVvdHMgPSB4ZnNfcW1fZHFwdXJnZV9pbnQobXAsIGZsYWdzKSkpIHsKKwkJCWRlbGF5KG5kcXVvdHMgKiAxMCk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK1NUQVRJQyBpbnQKK3hmc19xbV9kcWF0dGFjaF9vbmUoCisJeGZzX2lub2RlX3QJKmlwLAorCXhmc19kcWlkX3QJaWQsCisJdWludAkJdHlwZSwKKwl1aW50CQlkb2FsbG9jLAorCXVpbnQJCWRvbG9jaywKKwl4ZnNfZHF1b3RfdAkqdWRxaGludCwgLyogaGludCAqLworCXhmc19kcXVvdF90CSoqSU9faWRxcHApCit7CisJeGZzX2RxdW90X3QJKmRxcDsKKwlpbnQJCWVycm9yOworCisJQVNTRVJUKFhGU19JU0xPQ0tFRF9JTk9ERV9FWENMKGlwKSk7CisJZXJyb3IgPSAwOworCS8qCisJICogU2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBpdCBpbiB0aGUgaW5vZGUgaXRzZWxmLiBJT19pZHFwcCBpcworCSAqICZpX3VkcXVvdCBvciAmaV9nZHF1b3QuIFRoaXMgbWFkZSB0aGUgY29kZSBsb29rIHdlaXJkLCBidXQKKwkgKiBtYWRlIHRoZSBsb2dpYyBhIGxvdCBzaW1wbGVyLgorCSAqLworCWlmICgoZHFwID0gKklPX2lkcXBwKSkgeworCQlpZiAoZG9sb2NrKQorCQkJeGZzX2RxbG9jayhkcXApOworCQl4ZnNfZHF0cmFjZV9lbnRyeShkcXAsICJEUUFUVEFDSDogZm91bmQgaW4gaXAiKTsKKwkJZ290byBkb25lOworCX0KKworCS8qCisJICogdWRxaGludCBpcyB0aGUgaV91ZHF1b3QgZmllbGQgaW4gaW5vZGUsIGFuZCBpcyBub24tTlVMTCBvbmx5CisJICogd2hlbiB0aGUgdHlwZSBhcmcgaXMgWEZTX0RRX0dST1VQLiBJdHMgcHVycG9zZSBpcyB0byBzYXZlIGEKKwkgKiBsb29rdXAgYnkgZHFpZCAoeGZzX3FtX2RxZ2V0KSBieSBjYWNoaW5nIGEgZ3JvdXAgZHF1b3QgaW5zaWRlCisJICogdGhlIHVzZXIgZHF1b3QuCisJICovCisJQVNTRVJUKCF1ZHFoaW50IHx8IHR5cGUgPT0gWEZTX0RRX0dST1VQKTsKKwlpZiAodWRxaGludCAmJiAhZG9sb2NrKQorCQl4ZnNfZHFsb2NrKHVkcWhpbnQpOworCisJLyoKKwkgKiBObyBuZWVkIHRvIHRha2UgZHFsb2NrIHRvIGxvb2sgYXQgdGhlIGlkLgorCSAqIFRoZSBJRCBjYW4ndCBjaGFuZ2UgdW50aWwgaXQgZ2V0cyByZWNsYWltZWQsIGFuZCBpdCB3b24ndAorCSAqIGJlIHJlY2xhaW1lZCBhcyBsb25nIGFzIHdlIGhhdmUgYSByZWYgZnJvbSBpbm9kZSBhbmQgd2UgaG9sZAorCSAqIHRoZSBpbG9jay4KKwkgKi8KKwlpZiAodWRxaGludCAmJgorCSAgICAoZHFwID0gdWRxaGludC0+cV9nZHF1b3QpICYmCisJICAgIChJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaWQsIEFSQ0hfQ09OVkVSVCkgPT0gaWQpKSB7CisJCUFTU0VSVChYRlNfRFFfSVNfTE9DS0VEKHVkcWhpbnQpKTsKKwkJeGZzX2RxbG9jayhkcXApOworCQlYRlNfRFFIT0xEKGRxcCk7CisJCUFTU0VSVCgqSU9faWRxcHAgPT0gTlVMTCk7CisJCSpJT19pZHFwcCA9IGRxcDsKKwkJaWYgKCFkb2xvY2spIHsKKwkJCXhmc19kcXVubG9jayhkcXApOworCQkJeGZzX2RxdW5sb2NrKHVkcWhpbnQpOworCQl9CisJCWdvdG8gZG9uZTsKKwl9CisJLyoKKwkgKiBXZSBjYW4ndCBob2xkIGEgZHF1b3QgbG9jayB3aGVuIHdlIGNhbGwgdGhlIGRxZ2V0IGNvZGUuCisJICogV2UnbGwgZGVhZGxvY2sgaW4gbm8gdGltZSwgYmVjYXVzZSBvZiAobm90IGNvbmZvcm1pbmcgdG8pCisJICogbG9jayBvcmRlcmluZyAtIHRoZSBpbm9kZWxvY2sgY29tZXMgYmVmb3JlIGFueSBkcXVvdCBsb2NrLAorCSAqIGFuZCB3ZSBtYXkgZHJvcCBhbmQgcmVhY3F1aXJlIHRoZSBpbG9jayBpbiB4ZnNfcW1fZHFnZXQoKS4KKwkgKi8KKwlpZiAodWRxaGludCkKKwkJeGZzX2RxdW5sb2NrKHVkcWhpbnQpOworCS8qCisJICogRmluZCB0aGUgZHF1b3QgZnJvbSBzb21ld2hlcmUuIFRoaXMgYnVtcHMgdGhlCisJICogcmVmZXJlbmNlIGNvdW50IG9mIGRxdW90IGFuZCByZXR1cm5zIGl0IGxvY2tlZC4KKwkgKiBUaGlzIGNhbiByZXR1cm4gRU5PRU5UIGlmIGRxdW90IGRpZG4ndCBleGlzdCBvbgorCSAqIGRpc2sgYW5kIHdlIGRpZG4ndCBhc2sgaXQgdG8gYWxsb2NhdGU7CisJICogRVNSQ0ggaWYgcXVvdGFzIGdvdCB0dXJuZWQgb2ZmIHN1ZGRlbmx5LgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfcW1fZHFnZXQoaXAtPmlfbW91bnQsIGlwLCBpZCwgdHlwZSwKKwkJCQkgZG9hbGxvY3xYRlNfUU1PUFRfRE9XQVJOLCAmZHFwKSkpIHsKKwkJaWYgKHVkcWhpbnQgJiYgZG9sb2NrKQorCQkJeGZzX2RxbG9jayh1ZHFoaW50KTsKKwkJZ290byBkb25lOworCX0KKworCXhmc19kcXRyYWNlX2VudHJ5KGRxcCwgIkRRQVRUQUNIOiBmb3VuZCBieSBkcWdldCIpOworCS8qCisJICogZHFnZXQgbWF5IGhhdmUgZHJvcHBlZCBhbmQgcmUtYWNxdWlyZWQgdGhlIGlsb2NrLCBidXQgaXQgZ3VhcmFudGVlcworCSAqIHRoYXQgdGhlIGRxdW90IHJldHVybmVkIGlzIHRoZSBvbmUgdGhhdCBzaG91bGQgZ28gaW4gdGhlIGlub2RlLgorCSAqLworCSpJT19pZHFwcCA9IGRxcDsKKwlBU1NFUlQoZHFwKTsKKwlBU1NFUlQoWEZTX0RRX0lTX0xPQ0tFRChkcXApKTsKKwlpZiAoISBkb2xvY2spIHsKKwkJeGZzX2RxdW5sb2NrKGRxcCk7CisJCWdvdG8gZG9uZTsKKwl9CisJaWYgKCEgdWRxaGludCkKKwkJZ290byBkb25lOworCisJQVNTRVJUKHVkcWhpbnQpOworCUFTU0VSVChkb2xvY2spOworCUFTU0VSVChYRlNfRFFfSVNfTE9DS0VEKGRxcCkpOworCWlmICghIHhmc19xbV9kcWxvY2tfbm93YWl0KHVkcWhpbnQpKSB7CisJCXhmc19kcXVubG9jayhkcXApOworCQl4ZnNfZHFsb2NrKHVkcWhpbnQpOworCQl4ZnNfZHFsb2NrKGRxcCk7CisJfQorICAgICAgZG9uZToKKyNpZmRlZiBRVU9UQURFQlVHCisJaWYgKHVkcWhpbnQpIHsKKwkJaWYgKGRvbG9jaykKKwkJCUFTU0VSVChYRlNfRFFfSVNfTE9DS0VEKHVkcWhpbnQpKTsKKwl9CisJaWYgKCEgZXJyb3IpIHsKKwkJaWYgKGRvbG9jaykKKwkJCUFTU0VSVChYRlNfRFFfSVNfTE9DS0VEKGRxcCkpOworCX0KKyNlbmRpZgorCXJldHVybiAoZXJyb3IpOworfQorCisKKy8qCisgKiBHaXZlbiBhIHVkcXVvdCBhbmQgZ2RxdW90LCBhdHRhY2ggYSBwdHIgdG8gdGhlIGdyb3VwIGRxdW90IGluIHRoZQorICogdWRxdW90IGFzIGEgaGludCBmb3IgZnV0dXJlIGxvb2t1cHMuIFRoZSBpZGVhIHNvdW5kcyBzaW1wbGUsIGJ1dCB0aGUKKyAqIGV4ZWN1dGlvbiBpc24ndCwgYmVjYXVzZSB0aGUgdWRxdW90IG1pZ2h0IGhhdmUgYSBncm91cCBkcXVvdCBhdHRhY2hlZAorICogYWxyZWFkeSBhbmQgZ2V0dGluZyByaWQgb2YgdGhhdCBnZXRzIHVzIGludG8gbG9jayBvcmRlcmluZyBjb250cmFpbnRzLgorICogVGhlIHByb2Nlc3MgaXMgY29tcGxpY2F0ZWQgbW9yZSBieSB0aGUgZmFjdCB0aGF0IHRoZSBkcXVvdHMgbWF5IG9yIG1heSBub3QKKyAqIGJlIGxvY2tlZCBvbiBlbnRyeS4KKyAqLworU1RBVElDIHZvaWQKK3hmc19xbV9kcWF0dGFjaF9ncm91cGhpbnQoCisJeGZzX2RxdW90X3QJKnVkcSwKKwl4ZnNfZHF1b3RfdAkqZ2RxLAorCXVpbnQJCWxvY2tlZCkKK3sKKwl4ZnNfZHF1b3RfdAkqdG1wOworCisjaWZkZWYgUVVPVEFERUJVRworCWlmIChsb2NrZWQpIHsKKwkJQVNTRVJUKFhGU19EUV9JU19MT0NLRUQodWRxKSk7CisJCUFTU0VSVChYRlNfRFFfSVNfTE9DS0VEKGdkcSkpOworCX0KKyNlbmRpZgorCWlmICghIGxvY2tlZCkKKwkJeGZzX2RxbG9jayh1ZHEpOworCisJaWYgKCh0bXAgPSB1ZHEtPnFfZ2RxdW90KSkgeworCQlpZiAodG1wID09IGdkcSkgeworCQkJaWYgKCEgbG9ja2VkKQorCQkJCXhmc19kcXVubG9jayh1ZHEpOworCQkJcmV0dXJuOworCQl9CisKKwkJdWRxLT5xX2dkcXVvdCA9IE5VTEw7CisJCS8qCisJCSAqIFdlIGNhbid0IGtlZXAgYW55IGRxbG9ja3Mgd2hlbiBjYWxsaW5nIGRxcmVsZSwKKwkJICogYmVjYXVzZSB0aGUgZnJlZWxpc3QgbG9jayBjb21lcyBiZWZvcmUgZHFsb2Nrcy4KKwkJICovCisJCXhmc19kcXVubG9jayh1ZHEpOworCQlpZiAobG9ja2VkKQorCQkJeGZzX2RxdW5sb2NrKGdkcSk7CisJCS8qCisJCSAqIHdlIHRvb2sgYSBoYXJkIHJlZmVyZW5jZSBvbmNlIHVwb24gYSB0aW1lIGluIGRxZ2V0LAorCQkgKiBzbyBnaXZlIGl0IGJhY2sgd2hlbiB0aGUgdWRxdW90IG5vIGxvbmdlciBwb2ludHMgYXQgaXQKKwkJICogZHFwdXQoKSBkb2VzIHRoZSB1bmxvY2tpbmcgb2YgdGhlIGRxdW90LgorCQkgKi8KKwkJeGZzX3FtX2RxcmVsZSh0bXApOworCisJCXhmc19kcWxvY2sodWRxKTsKKwkJeGZzX2RxbG9jayhnZHEpOworCisJfSBlbHNlIHsKKwkJQVNTRVJUKFhGU19EUV9JU19MT0NLRUQodWRxKSk7CisJCWlmICghIGxvY2tlZCkgeworCQkJeGZzX2RxbG9jayhnZHEpOworCQl9CisJfQorCisJQVNTRVJUKFhGU19EUV9JU19MT0NLRUQodWRxKSk7CisJQVNTRVJUKFhGU19EUV9JU19MT0NLRUQoZ2RxKSk7CisJLyoKKwkgKiBTb21lYm9keSBjb3VsZCBoYXZlIGF0dGFjaGVkIGEgZ2RxdW90IGhlcmUsCisJICogd2hlbiB3ZSBkcm9wcGVkIHRoZSB1cWxvY2suIElmIHNvLCBqdXN0IGRvIG5vdGhpbmcuCisJICovCisJaWYgKHVkcS0+cV9nZHF1b3QgPT0gTlVMTCkgeworCQlYRlNfRFFIT0xEKGdkcSk7CisJCXVkcS0+cV9nZHF1b3QgPSBnZHE7CisJfQorCWlmICghIGxvY2tlZCkgeworCQl4ZnNfZHF1bmxvY2soZ2RxKTsKKwkJeGZzX2RxdW5sb2NrKHVkcSk7CisJfQorfQorCisKKy8qCisgKiBHaXZlbiBhIGxvY2tlZCBpbm9kZSwgYXR0YWNoIGRxdW90KHMpIHRvIGl0LCB0YWtpbmcgVVFVT1RBT04gLyBHUVVPVEFPTgorICogaW4gdG8gYWNjb3VudC4KKyAqIElmIFhGU19RTU9QVF9EUUFMTE9DLCB0aGUgZHF1b3Qocykgd2lsbCBiZSBhbGxvY2F0ZWQgaWYgbmVlZGVkLgorICogSWYgWEZTX1FNT1BUX0RRTE9DSywgdGhlIGRxdW90KHMpIHdpbGwgYmUgcmV0dXJuZWQgbG9ja2VkLiBUaGlzIG9wdGlvbiBwcmV0dHkKKyAqIG11Y2ggbWFkZSB0aGlzIGNvZGUgYSBjb21wbGV0ZSBtZXNzLCBidXQgaXQgaGFzIGJlZW4gcHJldHR5IHVzZWZ1bC4KKyAqIElmIFhGU19RTU9QVF9JTE9DS0VELCB0aGVuIGlub2RlIHNlbnQgaXMgYWxyZWFkeSBsb2NrZWQgRVhDTC4KKyAqIElub2RlIG1heSBnZXQgdW5sb2NrZWQgYW5kIHJlbG9ja2VkIGluIGhlcmUsIGFuZCB0aGUgY2FsbGVyIG11c3QgZGVhbCB3aXRoCisgKiB0aGUgY29uc2VxdWVuY2VzLgorICovCitpbnQKK3hmc19xbV9kcWF0dGFjaCgKKwl4ZnNfaW5vZGVfdAkqaXAsCisJdWludAkJZmxhZ3MpCit7CisJeGZzX21vdW50X3QJKm1wID0gaXAtPmlfbW91bnQ7CisJdWludAkJbnF1b3RhcyA9IDA7CisJaW50CQllcnJvciA9IDA7CisKKwlpZiAoKCEgWEZTX0lTX1FVT1RBX09OKG1wKSkgfHwKKwkgICAgKCEgWEZTX05PVF9EUUFUVEFDSEVEKG1wLCBpcCkpIHx8CisJICAgIChpcC0+aV9pbm8gPT0gbXAtPm1fc2Iuc2JfdXF1b3Rpbm8pIHx8CisJICAgIChpcC0+aV9pbm8gPT0gbXAtPm1fc2Iuc2JfZ3F1b3Rpbm8pKQorCQlyZXR1cm4gKDApOworCisJQVNTRVJUKChmbGFncyAmIFhGU19RTU9QVF9JTE9DS0VEKSA9PSAwIHx8CisJICAgICAgIFhGU19JU0xPQ0tFRF9JTk9ERV9FWENMKGlwKSk7CisKKwlpZiAoISAoZmxhZ3MgJiBYRlNfUU1PUFRfSUxPQ0tFRCkpCisJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCisJaWYgKFhGU19JU19VUVVPVEFfT04obXApKSB7CisJCWVycm9yID0geGZzX3FtX2RxYXR0YWNoX29uZShpcCwgaXAtPmlfZC5kaV91aWQsIFhGU19EUV9VU0VSLAorCQkJCQkJZmxhZ3MgJiBYRlNfUU1PUFRfRFFBTExPQywKKwkJCQkJCWZsYWdzICYgWEZTX1FNT1BUX0RRTE9DSywKKwkJCQkJCU5VTEwsICZpcC0+aV91ZHF1b3QpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGRvbmU7CisJCW5xdW90YXMrKzsKKwl9CisJQVNTRVJUKFhGU19JU0xPQ0tFRF9JTk9ERV9FWENMKGlwKSk7CisJaWYgKFhGU19JU19HUVVPVEFfT04obXApKSB7CisJCWVycm9yID0geGZzX3FtX2RxYXR0YWNoX29uZShpcCwgaXAtPmlfZC5kaV9naWQsIFhGU19EUV9HUk9VUCwKKwkJCQkJCWZsYWdzICYgWEZTX1FNT1BUX0RRQUxMT0MsCisJCQkJCQlmbGFncyAmIFhGU19RTU9QVF9EUUxPQ0ssCisJCQkJCQlpcC0+aV91ZHF1b3QsICZpcC0+aV9nZHF1b3QpOworCQkvKgorCQkgKiBEb24ndCB3b3JyeSBhYm91dCB0aGUgdWRxdW90IHRoYXQgd2UgbWF5IGhhdmUKKwkJICogYXR0YWNoZWQgYWJvdmUuIEl0J2xsIGdldCBkZXRhY2hlZCwgaWYgbm90IGFscmVhZHkuCisJCSAqLworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGRvbmU7CisJCW5xdW90YXMrKzsKKwl9CisKKwkvKgorCSAqIEF0dGFjaCB0aGlzIGdyb3VwIHF1b3RhIHRvIHRoZSB1c2VyIHF1b3RhIGFzIGEgaGludC4KKwkgKiBUaGlzIFdPTidULCBpbiBnZW5lcmFsLCByZXN1bHQgaW4gYSB0aHJhc2guCisJICovCisJaWYgKG5xdW90YXMgPT0gMikgeworCQlBU1NFUlQoWEZTX0lTTE9DS0VEX0lOT0RFX0VYQ0woaXApKTsKKwkJQVNTRVJUKGlwLT5pX3VkcXVvdCk7CisJCUFTU0VSVChpcC0+aV9nZHF1b3QpOworCisJCS8qCisJCSAqIFdlIG1heSBvciBtYXkgbm90IGhhdmUgdGhlIGlfdWRxdW90IGxvY2tlZCBhdCB0aGlzIHBvaW50LAorCQkgKiBidXQgdGhpcyBjaGVjayBpcyBPSyBzaW5jZSB3ZSBkb24ndCBkZXBlbmQgb24gdGhlIGlfZ2RxdW90IHRvCisJCSAqIGJlIGFjY3VyYXRlIDEwMCUgYWxsIHRoZSB0aW1lLiBJdCBpcyBqdXN0IGEgaGludCwgYW5kIHRoaXMKKwkJICogd2lsbCBzdWNjZWVkIGluIGdlbmVyYWwuCisJCSAqLworCQlpZiAoaXAtPmlfdWRxdW90LT5xX2dkcXVvdCA9PSBpcC0+aV9nZHF1b3QpCisJCQlnb3RvIGRvbmU7CisJCS8qCisJCSAqIEF0dGFjaCBpX2dkcXVvdCB0byB0aGUgZ2RxdW90IGhpbnQgaW5zaWRlIHRoZSBpX3VkcXVvdC4KKwkJICovCisJCXhmc19xbV9kcWF0dGFjaF9ncm91cGhpbnQoaXAtPmlfdWRxdW90LCBpcC0+aV9nZHF1b3QsCisJCQkJCSBmbGFncyAmIFhGU19RTU9QVF9EUUxPQ0spOworCX0KKworICAgICAgZG9uZToKKworI2lmZGVmIFFVT1RBREVCVUcKKwlpZiAoISBlcnJvcikgeworCQlpZiAoaXAtPmlfdWRxdW90KSB7CisJCQlpZiAoZmxhZ3MgJiBYRlNfUU1PUFRfRFFMT0NLKQorCQkJCUFTU0VSVChYRlNfRFFfSVNfTE9DS0VEKGlwLT5pX3VkcXVvdCkpOworCQl9CisJCWlmIChpcC0+aV9nZHF1b3QpIHsKKwkJCWlmIChmbGFncyAmIFhGU19RTU9QVF9EUUxPQ0spCisJCQkJQVNTRVJUKFhGU19EUV9JU19MT0NLRUQoaXAtPmlfZ2RxdW90KSk7CisJCX0KKwkJaWYgKFhGU19JU19VUVVPVEFfT04obXApKQorCQkJQVNTRVJUKGlwLT5pX3VkcXVvdCk7CisJCWlmIChYRlNfSVNfR1FVT1RBX09OKG1wKSkKKwkJCUFTU0VSVChpcC0+aV9nZHF1b3QpOworCX0KKyNlbmRpZgorCisJaWYgKCEgKGZsYWdzICYgWEZTX1FNT1BUX0lMT0NLRUQpKQorCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCisjaWZkZWYgUVVPVEFERUJVRworCWVsc2UKKwkJQVNTRVJUKFhGU19JU0xPQ0tFRF9JTk9ERV9FWENMKGlwKSk7CisjZW5kaWYKKwlyZXR1cm4gKGVycm9yKTsKK30KKworLyoKKyAqIFJlbGVhc2UgZHF1b3RzIChhbmQgdGhlaXIgcmVmZXJlbmNlcykgaWYgYW55LgorICogVGhlIGlub2RlIHNob3VsZCBiZSBsb2NrZWQgRVhDTCBleGNlcHQgd2hlbiB0aGlzJ3MgY2FsbGVkIGJ5CisgKiB4ZnNfaXJlY2xhaW0uCisgKi8KK3ZvaWQKK3hmc19xbV9kcWRldGFjaCgKKwl4ZnNfaW5vZGVfdAkqaXApCit7CisJaWYgKCEoaXAtPmlfdWRxdW90IHx8IGlwLT5pX2dkcXVvdCkpCisJCXJldHVybjsKKworCUFTU0VSVChpcC0+aV9pbm8gIT0gaXAtPmlfbW91bnQtPm1fc2Iuc2JfdXF1b3Rpbm8pOworCUFTU0VSVChpcC0+aV9pbm8gIT0gaXAtPmlfbW91bnQtPm1fc2Iuc2JfZ3F1b3Rpbm8pOworCWlmIChpcC0+aV91ZHF1b3QpCisJCXhmc19kcXRyYWNlX2VudHJ5X2lubyhpcC0+aV91ZHF1b3QsICJEUURFVFRBQ0giLCBpcCk7CisJaWYgKGlwLT5pX3VkcXVvdCkgeworCQl4ZnNfcW1fZHFyZWxlKGlwLT5pX3VkcXVvdCk7CisJCWlwLT5pX3VkcXVvdCA9IE5VTEw7CisJfQorCWlmIChpcC0+aV9nZHF1b3QpIHsKKwkJeGZzX3FtX2RxcmVsZShpcC0+aV9nZHF1b3QpOworCQlpcC0+aV9nZHF1b3QgPSBOVUxMOworCX0KK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIGJ5IFZGU19TWU5DIGFuZCBmbGFncyBhcmcgZGV0ZXJtaW5lcyB0aGUgY2FsbGVyLAorICogYW5kIGl0cyBtb3RpdmVzLCBhcyBkb25lIGluIHhmc19zeW5jLgorICoKKyAqIHZmc19zeW5jOiBTWU5DX0ZTREFUQXxTWU5DX0FUVFJ8U1lOQ19CREZMVVNIIDB4MzEKKyAqIHN5c2NhbGwgc3luYzogU1lOQ19GU0RBVEF8U1lOQ19BVFRSfFNZTkNfREVMV1JJIDB4MjUKKyAqIHVtb3VudHJvb3QgOiBTWU5DX1dBSVQgfCBTWU5DX0NMT1NFIHwgU1lOQ19BVFRSIHwgU1lOQ19GU0RBVEEKKyAqLworCitpbnQKK3hmc19xbV9zeW5jKAorCXhmc19tb3VudF90CSptcCwKKwlzaG9ydAkJZmxhZ3MpCit7CisJaW50CQlyZWNsLCByZXN0YXJ0czsKKwl4ZnNfZHF1b3RfdAkqZHFwOworCXVpbnQJCWZsdXNoX2ZsYWdzOworCWJvb2xlYW5fdAlub3dhaXQ7CisJaW50CQllcnJvcjsKKworCXJlc3RhcnRzID0gMDsKKwkvKgorCSAqIFdlIHdvbid0IGJsb2NrIHVubGVzcyB3ZSBhcmUgYXNrZWQgdG8uCisJICovCisJbm93YWl0ID0gKGJvb2xlYW5fdCkoZmxhZ3MgJiBTWU5DX0JERkxVU0ggfHwgKGZsYWdzICYgU1lOQ19XQUlUKSA9PSAwKTsKKworICBhZ2FpbjoKKwl4ZnNfcW1fbXBsaXN0X2xvY2sobXApOworCS8qCisJICogZHFwdXJnZV9hbGwoKSBhbHNvIHRha2VzIHRoZSBtcGxpc3QgbG9jayBhbmQgaXRlcmF0ZSB0aHJ1IGFsbCBkcXVvdHMKKwkgKiBpbiBxdW90YW9mZi4gSG93ZXZlciwgaWYgdGhlIFFVT1RBX0FDVElWRSBiaXRzIGFyZSBub3QgY2xlYXJlZAorCSAqIHdoZW4gd2UgaGF2ZSB0aGUgbXBsaXN0IGxvY2ssIHdlIGtub3cgdGhhdCBkcXVvdHMgd2lsbCBiZSBjb25zaXN0ZW50CisJICogYXMgbG9uZyBhcyB3ZSBoYXZlIGl0IGxvY2tlZC4KKwkgKi8KKwlpZiAoISBYRlNfSVNfUVVPVEFfT04obXApKSB7CisJCXhmc19xbV9tcGxpc3RfdW5sb2NrKG1wKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJRk9SRUFDSF9EUVVPVF9JTl9NUChkcXAsIG1wKSB7CisJCS8qCisJCSAqIElmIHRoaXMgaXMgdmZzX3N5bmMgY2FsbGluZywgdGhlbiBza2lwIHRoZSBkcXVvdHMgdGhhdAorCQkgKiBkb24ndCAnc2VlbScgdG8gYmUgZGlydHkuIGllLiBkb24ndCBhY3F1aXJlIGRxbG9jay4KKwkJICogVGhpcyBpcyB2ZXJ5IHNpbWlsYXIgdG8gd2hhdCB4ZnNfc3luYyBkb2VzIHdpdGggaW5vZGVzLgorCQkgKi8KKwkJaWYgKGZsYWdzICYgU1lOQ19CREZMVVNIKSB7CisJCQlpZiAoISBYRlNfRFFfSVNfRElSVFkoZHFwKSkKKwkJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChub3dhaXQpIHsKKwkJCS8qCisJCQkgKiBUcnkgdG8gYWNxdWlyZSB0aGUgZHF1b3QgbG9jay4gV2UgYXJlIE5PVCBvdXQgb2YKKwkJCSAqIGxvY2sgb3JkZXIsIGJ1dCB3ZSBqdXN0IGRvbid0IHdhbnQgdG8gd2FpdCBmb3IgdGhpcworCQkJICogbG9jaywgdW5sZXNzIHNvbWVib2R5IHdhbnRlZCB1cyB0by4KKwkJCSAqLworCQkJaWYgKCEgeGZzX3FtX2RxbG9ja19ub3dhaXQoZHFwKSkKKwkJCQljb250aW51ZTsKKwkJfSBlbHNlIHsKKwkJCXhmc19kcWxvY2soZHFwKTsKKwkJfQorCisJCS8qCisJCSAqIE5vdywgZmluZCBvdXQgZm9yIHN1cmUgaWYgdGhpcyBkcXVvdCBpcyBkaXJ0eSBvciBub3QuCisJCSAqLworCQlpZiAoISBYRlNfRFFfSVNfRElSVFkoZHFwKSkgeworCQkJeGZzX2RxdW5sb2NrKGRxcCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFhYWCBhIHNlbnRpbmVsIHdvdWxkIGJlIGJldHRlciAqLworCQlyZWNsID0gWEZTX1FJX01QTFJFQ0xBSU1TKG1wKTsKKwkJaWYgKCEgeGZzX3FtX2RxZmxvY2tfbm93YWl0KGRxcCkpIHsKKwkJCWlmIChub3dhaXQpIHsKKwkJCQl4ZnNfZHF1bmxvY2soZHFwKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qCisJCQkgKiBJZiB3ZSBjYW4ndCBncmFiIHRoZSBmbHVzaCBsb2NrIHRoZW4gaWYgdGhlIGNhbGxlcgorCQkJICogcmVhbGx5IHdhbnRlZCB1cyB0byBnaXZlIHRoaXMgb3VyIGJlc3Qgc2hvdCwKKwkJCSAqIHNlZSBpZiB3ZSBjYW4gZ2l2ZSBhIHB1c2ggdG8gdGhlIGJ1ZmZlciBiZWZvcmUgd2Ugd2FpdAorCQkJICogb24gdGhlIGZsdXNoIGxvY2suIEF0IHRoaXMgcG9pbnQsIHdlIGtub3cgdGhhdAorCQkJICogZXZlbnRob3VnaCB0aGUgZHF1b3QgaXMgYmVpbmcgZmx1c2hlZCwKKwkJCSAqIGl0IGhhcyAobmV3KSBkaXJ0eSBkYXRhLgorCQkJICovCisJCQl4ZnNfcW1fZHFmbG9ja19wdXNoYnVmX3dhaXQoZHFwKTsKKwkJfQorCQkvKgorCQkgKiBMZXQgZ28gb2YgdGhlIG1wbGlzdCBsb2NrLiBXZSBkb24ndCB3YW50IHRvIGhvbGQgaXQKKwkJICogYWNyb3NzIGEgZGlzayB3cml0ZQorCQkgKi8KKwkJZmx1c2hfZmxhZ3MgPSAobm93YWl0KSA/IFhGU19RTU9QVF9ERUxXUkkgOiBYRlNfUU1PUFRfU1lOQzsKKwkJeGZzX3FtX21wbGlzdF91bmxvY2sobXApOworCQl4ZnNfZHF0cmFjZV9lbnRyeShkcXAsICJYUU1fU1lOQzogRFFGTFVTSCIpOworCQllcnJvciA9IHhmc19xbV9kcWZsdXNoKGRxcCwgZmx1c2hfZmxhZ3MpOworCQl4ZnNfZHF1bmxvY2soZHFwKTsKKwkJaWYgKGVycm9yICYmIFhGU19GT1JDRURfU0hVVERPV04obXApKQorCQkJcmV0dXJuKDApOwkvKiBOZWVkIHRvIHByZXZlbnQgdW1vdW50IGZhaWx1cmUgKi8KKwkJZWxzZSBpZiAoZXJyb3IpCisJCQlyZXR1cm4gKGVycm9yKTsKKworCQl4ZnNfcW1fbXBsaXN0X2xvY2sobXApOworCQlpZiAocmVjbCAhPSBYRlNfUUlfTVBMUkVDTEFJTVMobXApKSB7CisJCQlpZiAoKytyZXN0YXJ0cyA+PSBYRlNfUU1fU1lOQ19NQVhfUkVTVEFSVFMpCisJCQkJYnJlYWs7CisKKwkJCXhmc19xbV9tcGxpc3RfdW5sb2NrKG1wKTsKKwkJCWdvdG8gYWdhaW47CisJCX0KKwl9CisKKwl4ZnNfcW1fbXBsaXN0X3VubG9jayhtcCk7CisJcmV0dXJuICgwKTsKK30KKworCisvKgorICogVGhpcyBpbml0aWFsaXplcyBhbGwgdGhlIHF1b3RhIGluZm9ybWF0aW9uIHRoYXQncyBrZXB0IGluIHRoZQorICogbW91bnQgc3RydWN0dXJlCisgKi8KK2ludAoreGZzX3FtX2luaXRfcXVvdGFpbmZvKAorCXhmc19tb3VudF90CSptcCkKK3sKKwl4ZnNfcXVvdGFpbmZvX3QgKnFpbmY7CisJaW50CQllcnJvcjsKKwl4ZnNfZHF1b3RfdAkqZHFwOworCisJQVNTRVJUKFhGU19JU19RVU9UQV9SVU5OSU5HKG1wKSk7CisKKwkvKgorCSAqIFRlbGwgWFFNIHRoYXQgd2UgZXhpc3QgYXMgc29vbiBhcyBwb3NzaWJsZS4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX3FtX2hvbGRfcXVvdGFmc19yZWYobXApKSkgeworCQlyZXR1cm4gKGVycm9yKTsKKwl9CisKKwlxaW5mID0gbXAtPm1fcXVvdGFpbmZvID0ga21lbV96YWxsb2Moc2l6ZW9mKHhmc19xdW90YWluZm9fdCksIEtNX1NMRUVQKTsKKworCS8qCisJICogU2VlIGlmIHF1b3RhaW5vZGVzIGFyZSBzZXR1cCwgYW5kIGlmIG5vdCwgYWxsb2NhdGUgdGhlbSwKKwkgKiBhbmQgY2hhbmdlIHRoZSBzdXBlcmJsb2NrIGFjY29yZGluZ2x5LgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfcW1faW5pdF9xdW90YWlub3MobXApKSkgeworCQlrbWVtX2ZyZWUocWluZiwgc2l6ZW9mKHhmc19xdW90YWluZm9fdCkpOworCQltcC0+bV9xdW90YWluZm8gPSBOVUxMOworCQlyZXR1cm4gKGVycm9yKTsKKwl9CisKKwlzcGlubG9ja19pbml0KCZxaW5mLT5xaV9waW5sb2NrLCAieGZzX3FpbmZfcGluIik7CisJeGZzX3FtX2xpc3RfaW5pdCgmcWluZi0+cWlfZHFsaXN0LCAibXBkcWxpc3QiLCAwKTsKKwlxaW5mLT5xaV9kcXJlY2xhaW1zID0gMDsKKworCS8qIG11dGV4IHVzZWQgdG8gc2VyaWFsaXplIHF1b3Rhb2ZmcyAqLworCW11dGV4X2luaXQoJnFpbmYtPnFpX3F1b3Rhb2ZmbG9jaywgTVVURVhfREVGQVVMVCwgInFvZmYiKTsKKworCS8qIFByZWNhbGMgc29tZSBjb25zdGFudHMgKi8KKwlxaW5mLT5xaV9kcWNodW5rbGVuID0gWEZTX0ZTQl9UT19CQihtcCwgWEZTX0RRVU9UX0NMVVNURVJfU0laRV9GU0IpOworCUFTU0VSVChxaW5mLT5xaV9kcWNodW5rbGVuKTsKKwlxaW5mLT5xaV9kcXBlcmNodW5rID0gQkJUT0IocWluZi0+cWlfZHFjaHVua2xlbik7CisJZG9fZGl2KHFpbmYtPnFpX2RxcGVyY2h1bmssIHNpemVvZih4ZnNfZHFibGtfdCkpOworCisJbXAtPm1fcWZsYWdzIHw9IChtcC0+bV9zYi5zYl9xZmxhZ3MgJiBYRlNfQUxMX1FVT1RBX0NIS0QpOworCisJLyoKKwkgKiBXZSB0cnkgdG8gZ2V0IHRoZSBsaW1pdHMgZnJvbSB0aGUgc3VwZXJ1c2VyJ3MgbGltaXRzIGZpZWxkcy4KKwkgKiBUaGlzIGlzIHF1aXRlIGhhY2t5LCBidXQgaXQgaXMgc3RhbmRhcmQgcXVvdGEgcHJhY3RpY2UuCisJICogV2UgbG9vayBhdCB0aGUgVVNSIGRxdW90IHdpdGggaWQgPT0gMCBmaXJzdCwgYnV0IGlmIHVzZXIgcXVvdGFzCisJICogYXJlIG5vdCBlbmFibGVkIHdlIGdvdG8gdGhlIEdSUCBkcXVvdCB3aXRoIGlkID09IDAuCisJICogV2UgZG9uJ3QgcmVhbGx5IGNhcmUgdG8ga2VlcCBzZXBhcmF0ZSBkZWZhdWx0IGxpbWl0cyBmb3IgdXNlcgorCSAqIGFuZCBncm91cCBxdW90YXMsIGF0IGxlYXN0IG5vdCBhdCB0aGlzIHBvaW50LgorCSAqLworCWVycm9yID0geGZzX3FtX2RxZ2V0KG1wLCBOVUxMLCAoeGZzX2RxaWRfdCkwLAorCQkJICAgICAoWEZTX0lTX1VRVU9UQV9SVU5OSU5HKG1wKSkgPworCQkJICAgICBYRlNfRFFfVVNFUiA6IFhGU19EUV9HUk9VUCwKKwkJCSAgICAgWEZTX1FNT1BUX0RRU1VTRVJ8WEZTX1FNT1BUX0RPV0FSTiwKKwkJCSAgICAgJmRxcCk7CisJaWYgKCEgZXJyb3IpIHsKKwkJeGZzX2Rpc2tfZHF1b3RfdAkqZGRxcCA9ICZkcXAtPnFfY29yZTsKKworCQkvKgorCQkgKiBUaGUgd2FybmluZ3MgYW5kIHRpbWVycyBzZXQgdGhlIGdyYWNlIHBlcmlvZCBnaXZlbiB0bworCQkgKiBhIHVzZXIgb3IgZ3JvdXAgYmVmb3JlIGhlIG9yIHNoZSBjYW4gbm90IHBlcmZvcm0gYW55CisJCSAqIG1vcmUgd3JpdGluZy4gSWYgaXQgaXMgemVybywgYSBkZWZhdWx0IGlzIHVzZWQuCisJCSAqLworCQlxaW5mLT5xaV9idGltZWxpbWl0ID0KKwkJCQlJTlRfR0VUKGRkcXAtPmRfYnRpbWVyLCBBUkNIX0NPTlZFUlQpID8KKwkJCQlJTlRfR0VUKGRkcXAtPmRfYnRpbWVyLCBBUkNIX0NPTlZFUlQpIDoKKwkJCQlYRlNfUU1fQlRJTUVMSU1JVDsKKwkJcWluZi0+cWlfaXRpbWVsaW1pdCA9CisJCQkJSU5UX0dFVChkZHFwLT5kX2l0aW1lciwgQVJDSF9DT05WRVJUKSA/CisJCQkJSU5UX0dFVChkZHFwLT5kX2l0aW1lciwgQVJDSF9DT05WRVJUKSA6CisJCQkJWEZTX1FNX0lUSU1FTElNSVQ7CisJCXFpbmYtPnFpX3J0YnRpbWVsaW1pdCA9CisJCQkJSU5UX0dFVChkZHFwLT5kX3J0YnRpbWVyLCBBUkNIX0NPTlZFUlQpID8KKwkJCQlJTlRfR0VUKGRkcXAtPmRfcnRidGltZXIsIEFSQ0hfQ09OVkVSVCkgOgorCQkJCVhGU19RTV9SVEJUSU1FTElNSVQ7CisJCXFpbmYtPnFpX2J3YXJubGltaXQgPQorCQkJCUlOVF9HRVQoZGRxcC0+ZF9id2FybnMsIEFSQ0hfQ09OVkVSVCkgPworCQkJCUlOVF9HRVQoZGRxcC0+ZF9id2FybnMsIEFSQ0hfQ09OVkVSVCkgOgorCQkJCVhGU19RTV9CV0FSTkxJTUlUOworCQlxaW5mLT5xaV9pd2FybmxpbWl0ID0KKwkJCQlJTlRfR0VUKGRkcXAtPmRfaXdhcm5zLCBBUkNIX0NPTlZFUlQpID8KKwkJCQlJTlRfR0VUKGRkcXAtPmRfaXdhcm5zLCBBUkNIX0NPTlZFUlQpIDoKKwkJCQlYRlNfUU1fSVdBUk5MSU1JVDsKKwkJcWluZi0+cWlfYmhhcmRsaW1pdCA9CisJCQkJSU5UX0dFVChkZHFwLT5kX2Jsa19oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCk7CisJCXFpbmYtPnFpX2Jzb2Z0bGltaXQgPQorCQkJCUlOVF9HRVQoZGRxcC0+ZF9ibGtfc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpOworCQlxaW5mLT5xaV9paGFyZGxpbWl0ID0KKwkJCQlJTlRfR0VUKGRkcXAtPmRfaW5vX2hhcmRsaW1pdCwgQVJDSF9DT05WRVJUKTsKKwkJcWluZi0+cWlfaXNvZnRsaW1pdCA9CisJCQkJSU5UX0dFVChkZHFwLT5kX2lub19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCk7CisJCXFpbmYtPnFpX3J0YmhhcmRsaW1pdCA9CisJCQkJSU5UX0dFVChkZHFwLT5kX3J0Yl9oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCk7CisJCXFpbmYtPnFpX3J0YnNvZnRsaW1pdCA9CisJCQkJSU5UX0dFVChkZHFwLT5kX3J0Yl9zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCk7CisgCisJCS8qCisJCSAqIFdlIHNlbnQgdGhlIFhGU19RTU9QVF9EUVNVU0VSIGZsYWcgdG8gZHFnZXQgYmVjYXVzZQorCQkgKiB3ZSBkb24ndCB3YW50IHRoaXMgZHF1b3QgY2FjaGVkLiBXZSBoYXZlbid0IGRvbmUgYQorCQkgKiBxdW90YWNoZWNrIHlldCwgYW5kIHF1b3RhY2hlY2sgZG9lc24ndCBsaWtlIGluY29yZSBkcXVvdHMuCisJCSAqLworCQl4ZnNfcW1fZHFkZXN0cm95KGRxcCk7CisJfSBlbHNlIHsKKwkJcWluZi0+cWlfYnRpbWVsaW1pdCA9IFhGU19RTV9CVElNRUxJTUlUOworCQlxaW5mLT5xaV9pdGltZWxpbWl0ID0gWEZTX1FNX0lUSU1FTElNSVQ7CisJCXFpbmYtPnFpX3J0YnRpbWVsaW1pdCA9IFhGU19RTV9SVEJUSU1FTElNSVQ7CisJCXFpbmYtPnFpX2J3YXJubGltaXQgPSBYRlNfUU1fQldBUk5MSU1JVDsKKwkJcWluZi0+cWlfaXdhcm5saW1pdCA9IFhGU19RTV9JV0FSTkxJTUlUOworCX0KKworCXJldHVybiAoMCk7Cit9CisKKworLyoKKyAqIEdldHMgY2FsbGVkIHdoZW4gdW5tb3VudGluZyBhIGZpbGVzeXN0ZW0gb3Igd2hlbiBhbGwgcXVvdGFzIGdldAorICogdHVybmVkIG9mZi4KKyAqIFRoaXMgcHVyZ2VzIHRoZSBxdW90YSBpbm9kZXMsIGRlc3Ryb3lzIGxvY2tzIGFuZCBmcmVlcyBpdHNlbGYuCisgKi8KK3ZvaWQKK3hmc19xbV9kZXN0cm95X3F1b3RhaW5mbygKKwl4ZnNfbW91bnRfdAkqbXApCit7CisJeGZzX3F1b3RhaW5mb190ICpxaTsKKworCXFpID0gbXAtPm1fcXVvdGFpbmZvOworCUFTU0VSVChxaSAhPSBOVUxMKTsKKwlBU1NFUlQoeGZzX0dxbSAhPSBOVUxMKTsKKworCS8qCisJICogUmVsZWFzZSB0aGUgcmVmZXJlbmNlIHRoYXQgWFFNIGtlcHQsIHNvIHRoYXQgd2Uga25vdworCSAqIHdoZW4gdGhlIFhRTSBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGZyZWVkLiBXZSBjYW5ub3QgYXNzdW1lCisJICogdGhhdCB4ZnNfR3FtIGlzIG5vbi1udWxsIGFmdGVyIHRoaXMgcG9pbnQuCisJICovCisJeGZzX3FtX3JlbGVfcXVvdGFmc19yZWYobXApOworCisJc3BpbmxvY2tfZGVzdHJveSgmcWktPnFpX3BpbmxvY2spOworCXhmc19xbV9saXN0X2Rlc3Ryb3koJnFpLT5xaV9kcWxpc3QpOworCisJaWYgKHFpLT5xaV91cXVvdGFpcCkgeworCQlYRlNfUFVSR0VfSU5PREUocWktPnFpX3VxdW90YWlwKTsKKwkJcWktPnFpX3VxdW90YWlwID0gTlVMTDsgLyogcGFyYW5vaWEgKi8KKwl9CisJaWYgKHFpLT5xaV9ncXVvdGFpcCkgeworCQlYRlNfUFVSR0VfSU5PREUocWktPnFpX2dxdW90YWlwKTsKKwkJcWktPnFpX2dxdW90YWlwID0gTlVMTDsKKwl9CisJbXV0ZXhfZGVzdHJveSgmcWktPnFpX3F1b3Rhb2ZmbG9jayk7CisJa21lbV9mcmVlKHFpLCBzaXplb2YoeGZzX3F1b3RhaW5mb190KSk7CisJbXAtPm1fcXVvdGFpbmZvID0gTlVMTDsKK30KKworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gUFJJVkFURSBTVEFUSUMgRlVOQ1RJT05TIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEFSR1NVU0VEICovCitTVEFUSUMgdm9pZAoreGZzX3FtX2xpc3RfaW5pdCgKKwl4ZnNfZHFsaXN0X3QJKmxpc3QsCisJY2hhcgkJKnN0ciwKKwlpbnQJCW4pCit7CisJbXV0ZXhfaW5pdCgmbGlzdC0+cWhfbG9jaywgTVVURVhfREVGQVVMVCwgc3RyKTsKKwlsaXN0LT5xaF9uZXh0ID0gTlVMTDsKKwlsaXN0LT5xaF92ZXJzaW9uID0gMDsKKwlsaXN0LT5xaF9uZWxlbXMgPSAwOworfQorCitTVEFUSUMgdm9pZAoreGZzX3FtX2xpc3RfZGVzdHJveSgKKwl4ZnNfZHFsaXN0X3QJKmxpc3QpCit7CisJbXV0ZXhfZGVzdHJveSgmKGxpc3QtPnFoX2xvY2spKTsKK30KKworCisvKgorICogU3RyaXBwZWQgZG93biB2ZXJzaW9uIG9mIGRxYXR0YWNoLiBUaGlzIGRvZXNuJ3QgYXR0YWNoLCBvciBldmVuIGxvb2sgYXQgdGhlCisgKiBkcXVvdHMgYXR0YWNoZWQgdG8gdGhlIGlub2RlLiBUaGUgcmF0aW9uYWxlIGlzIHRoYXQgdGhlcmUgd29uJ3QgYmUgYW55CisgKiBhdHRhY2hlZCBhdCB0aGUgdGltZSB0aGlzIGlzIGNhbGxlZCBmcm9tIHF1b3RhY2hlY2suCisgKi8KK1NUQVRJQyBpbnQKK3hmc19xbV9kcWdldF9ub2F0dGFjaCgKKwl4ZnNfaW5vZGVfdAkqaXAsCisJeGZzX2RxdW90X3QJKipPX3VkcXBwLAorCXhmc19kcXVvdF90CSoqT19nZHFwcCkKK3sKKwlpbnQJCWVycm9yOworCXhmc19tb3VudF90CSptcDsKKwl4ZnNfZHF1b3RfdAkqdWRxcCwgKmdkcXA7CisKKwlBU1NFUlQoWEZTX0lTTE9DS0VEX0lOT0RFX0VYQ0woaXApKTsKKwltcCA9IGlwLT5pX21vdW50OworCXVkcXAgPSBOVUxMOworCWdkcXAgPSBOVUxMOworCisJaWYgKFhGU19JU19VUVVPVEFfT04obXApKSB7CisJCUFTU0VSVChpcC0+aV91ZHF1b3QgPT0gTlVMTCk7CisJCS8qCisJCSAqIFdlIHdhbnQgdGhlIGRxdW90IGFsbG9jYXRlZCBpZiBpdCBkb2Vzbid0IGV4aXN0LgorCQkgKi8KKwkJaWYgKChlcnJvciA9IHhmc19xbV9kcWdldChtcCwgaXAsIGlwLT5pX2QuZGlfdWlkLCBYRlNfRFFfVVNFUiwKKwkJCQkJIFhGU19RTU9QVF9EUUFMTE9DIHwgWEZTX1FNT1BUX0RPV0FSTiwKKwkJCQkJICZ1ZHFwKSkpIHsKKwkJCS8qCisJCQkgKiBTaG91bGRuJ3QgYmUgYWJsZSB0byB0dXJuIG9mZiBxdW90YXMgaGVyZS4KKwkJCSAqLworCQkJQVNTRVJUKGVycm9yICE9IEVTUkNIKTsKKwkJCUFTU0VSVChlcnJvciAhPSBFTk9FTlQpOworCQkJcmV0dXJuIChlcnJvcik7CisJCX0KKwkJQVNTRVJUKHVkcXApOworCX0KKworCWlmIChYRlNfSVNfR1FVT1RBX09OKG1wKSkgeworCQlBU1NFUlQoaXAtPmlfZ2RxdW90ID09IE5VTEwpOworCQlpZiAodWRxcCkKKwkJCXhmc19kcXVubG9jayh1ZHFwKTsKKwkJaWYgKChlcnJvciA9IHhmc19xbV9kcWdldChtcCwgaXAsIGlwLT5pX2QuZGlfZ2lkLCBYRlNfRFFfR1JPVVAsCisJCQkJCSBYRlNfUU1PUFRfRFFBTExPQ3xYRlNfUU1PUFRfRE9XQVJOLAorCQkJCQkgJmdkcXApKSkgeworCQkJaWYgKHVkcXApCisJCQkJeGZzX3FtX2RxcmVsZSh1ZHFwKTsKKwkJCUFTU0VSVChlcnJvciAhPSBFU1JDSCk7CisJCQlBU1NFUlQoZXJyb3IgIT0gRU5PRU5UKTsKKwkJCXJldHVybiAoZXJyb3IpOworCQl9CisJCUFTU0VSVChnZHFwKTsKKworCQkvKiBSZWFjcXVpcmUgdGhlIGxvY2tzIGluIHRoZSByaWdodCBvcmRlciAqLworCQlpZiAodWRxcCkgeworCQkJaWYgKCEgeGZzX3FtX2RxbG9ja19ub3dhaXQodWRxcCkpIHsKKwkJCQl4ZnNfZHF1bmxvY2soZ2RxcCk7CisJCQkJeGZzX2RxbG9jayh1ZHFwKTsKKwkJCQl4ZnNfZHFsb2NrKGdkcXApOworCQkJfQorCQl9CisJfQorCisJKk9fdWRxcHAgPSB1ZHFwOworCSpPX2dkcXBwID0gZ2RxcDsKKworI2lmZGVmIFFVT1RBREVCVUcKKwlpZiAodWRxcCkgQVNTRVJUKFhGU19EUV9JU19MT0NLRUQodWRxcCkpOworCWlmIChnZHFwKSBBU1NFUlQoWEZTX0RRX0lTX0xPQ0tFRChnZHFwKSk7CisjZW5kaWYKKwlyZXR1cm4gKDApOworfQorCisvKgorICogQ3JlYXRlIGFuIGlub2RlIGFuZCByZXR1cm4gd2l0aCBhIHJlZmVyZW5jZSBhbHJlYWR5IHRha2VuLCBidXQgdW5sb2NrZWQKKyAqIFRoaXMgaXMgaG93IHdlIGNyZWF0ZSBxdW90YSBpbm9kZXMKKyAqLworU1RBVElDIGludAoreGZzX3FtX3Fpbm9fYWxsb2MoCisJeGZzX21vdW50X3QJKm1wLAorCXhmc19pbm9kZV90CSoqaXAsCisJX19pbnQ2NF90CXNiZmllbGRzLAorCXVpbnQJCWZsYWdzKQoreworCXhmc190cmFuc190CSp0cDsKKwlpbnQJCWVycm9yOworCXVuc2lnbmVkIGxvbmcgczsKKwljcmVkX3QJCXplcm9jcjsKKwlpbnQJCWNvbW1pdHRlZDsKKworCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLFhGU19UUkFOU19RTV9RSU5PQ1JFQVRFKTsKKwlpZiAoKGVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsCisJCQkJICAgICAgWEZTX1FNX1FJTk9DUkVBVEVfU1BBQ0VfUkVTKG1wKSwKKwkJCQkgICAgICBYRlNfQ1JFQVRFX0xPR19SRVMobXApLCAwLAorCQkJCSAgICAgIFhGU19UUkFOU19QRVJNX0xPR19SRVMsCisJCQkJICAgICAgWEZTX0NSRUFURV9MT0dfQ09VTlQpKSkgeworCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCAwKTsKKwkJcmV0dXJuIChlcnJvcik7CisJfQorCW1lbXNldCgmemVyb2NyLCAwLCBzaXplb2YoemVyb2NyKSk7CisKKwlpZiAoKGVycm9yID0geGZzX2Rpcl9pYWxsb2MoJnRwLCBtcC0+bV9yb290aXAsIFNfSUZSRUcsIDEsIDAsCisJCQkJICAgJnplcm9jciwgMCwgMSwgaXAsICZjb21taXR0ZWQpKSkgeworCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTIHwKKwkJCQkgWEZTX1RSQU5TX0FCT1JUKTsKKwkJcmV0dXJuIChlcnJvcik7CisJfQorCisJLyoKKwkgKiBLZWVwIGFuIGV4dHJhIHJlZmVyZW5jZSB0byB0aGlzIHF1b3RhIGlub2RlLiBUaGlzIGlub2RlIGlzCisJICogbG9ja2VkIGV4Y2x1c2l2ZWx5IGFuZCBqb2luZWQgdG8gdGhlIHRyYW5zYWN0aW9uIGFscmVhZHkuCisJICovCisJQVNTRVJUKFhGU19JU0xPQ0tFRF9JTk9ERV9FWENMKCppcCkpOworCVZOX0hPTEQoWEZTX0lUT1YoKCppcCkpKTsKKworCS8qCisJICogTWFrZSB0aGUgY2hhbmdlcyBpbiB0aGUgc3VwZXJibG9jaywgYW5kIGxvZyB0aG9zZSB0b28uCisJICogc2JmaWVsZHMgYXJnIG1heSBjb250YWluIGZpZWxkcyBvdGhlciB0aGFuICpRVU9USU5POworCSAqIFZFUlNJT05OVU0gZm9yIGV4YW1wbGUuCisJICovCisJcyA9IFhGU19TQl9MT0NLKG1wKTsKKwlpZiAoZmxhZ3MgJiBYRlNfUU1PUFRfU0JWRVJTSU9OKSB7CisjaWYgZGVmaW5lZChERUJVRykgJiYgZGVmaW5lZChYRlNfTE9VRF9SRUNPVkVSWSkKKwkJdW5zaWduZWQgb2xkdiA9IG1wLT5tX3NiLnNiX3ZlcnNpb25udW07CisjZW5kaWYKKwkJQVNTRVJUKCFYRlNfU0JfVkVSU0lPTl9IQVNRVU9UQSgmbXAtPm1fc2IpKTsKKwkJQVNTRVJUKChzYmZpZWxkcyAmIChYRlNfU0JfVkVSU0lPTk5VTSB8IFhGU19TQl9VUVVPVElOTyB8CisJCQkJICAgWEZTX1NCX0dRVU9USU5PIHwgWEZTX1NCX1FGTEFHUykpID09CisJCSAgICAgICAoWEZTX1NCX1ZFUlNJT05OVU0gfCBYRlNfU0JfVVFVT1RJTk8gfAorCQkJWEZTX1NCX0dRVU9USU5PIHwgWEZTX1NCX1FGTEFHUykpOworCisJCVhGU19TQl9WRVJTSU9OX0FERFFVT1RBKCZtcC0+bV9zYik7CisJCW1wLT5tX3NiLnNiX3VxdW90aW5vID0gTlVMTEZTSU5POworCQltcC0+bV9zYi5zYl9ncXVvdGlubyA9IE5VTExGU0lOTzsKKworCQkvKiBxZmxhZ3Mgd2lsbCBnZXQgdXBkYXRlZCBfYWZ0ZXJfIHF1b3RhY2hlY2sgKi8KKwkJbXAtPm1fc2Iuc2JfcWZsYWdzID0gMDsKKyNpZiBkZWZpbmVkKERFQlVHKSAmJiBkZWZpbmVkKFhGU19MT1VEX1JFQ09WRVJZKQorCQljbW5fZXJyKENFX05PVEUsCisJCQkiT2xkIHN1cGVyYmxvY2sgdmVyc2lvbiAleCwgY29udmVydGluZyB0byAleC4iLAorCQkJb2xkdiwgbXAtPm1fc2Iuc2JfdmVyc2lvbm51bSk7CisjZW5kaWYKKwl9CisJaWYgKGZsYWdzICYgWEZTX1FNT1BUX1VRVU9UQSkKKwkJbXAtPm1fc2Iuc2JfdXF1b3Rpbm8gPSAoKmlwKS0+aV9pbm87CisJZWxzZQorCQltcC0+bV9zYi5zYl9ncXVvdGlubyA9ICgqaXApLT5pX2lubzsKKwlYRlNfU0JfVU5MT0NLKG1wLCBzKTsKKwl4ZnNfbW9kX3NiKHRwLCBzYmZpZWxkcyk7CisKKwlpZiAoKGVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwgWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUywKKwkJCQkgICAgIE5VTEwpKSkgeworCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbXAsICJYRlMgcWlub19hbGxvYyBmYWlsZWQhIik7CisJCXJldHVybiAoZXJyb3IpOworCX0KKwlyZXR1cm4gKDApOworfQorCisKK1NUQVRJQyBpbnQKK3hmc19xbV9yZXNldF9kcWNvdW50cygKKwl4ZnNfbW91bnRfdAkqbXAsCisJeGZzX2J1Zl90CSpicCwKKwl4ZnNfZHFpZF90CWlkLAorCXVpbnQJCXR5cGUpCit7CisJeGZzX2Rpc2tfZHF1b3RfdAkqZGRxOworCWludAkJCWo7CisKKwl4ZnNfYnVmdHJhY2UoIlJFU0VUIERRVU9UUyIsIGJwKTsKKwkvKgorCSAqIFJlc2V0IGFsbCBjb3VudGVycyBhbmQgdGltZXJzLiBUaGV5J2xsIGJlCisJICogc3RhcnRlZCBhZnJlc2ggYnkgeGZzX3FtX3F1b3RhY2hlY2suCisJICovCisjaWZkZWYgREVCVUcKKwlqID0gWEZTX0ZTQl9UT19CKG1wLCBYRlNfRFFVT1RfQ0xVU1RFUl9TSVpFX0ZTQik7CisJZG9fZGl2KGosIHNpemVvZih4ZnNfZHFibGtfdCkpOworCUFTU0VSVChYRlNfUU1fRFFQRVJCTEsobXApID09IGopOworI2VuZGlmCisJZGRxID0gKHhmc19kaXNrX2RxdW90X3QgKilYRlNfQlVGX1BUUihicCk7CisJZm9yIChqID0gMDsgaiA8IFhGU19RTV9EUVBFUkJMSyhtcCk7IGorKykgeworCQkvKgorCQkgKiBEbyBhIHNhbml0eSBjaGVjaywgYW5kIGlmIG5lZWRlZCwgcmVwYWlyIHRoZSBkcWJsay4gRG9uJ3QKKwkJICogb3V0cHV0IGFueSB3YXJuaW5ncyBiZWNhdXNlIGl0J3MgcGVyZmVjdGx5IHBvc3NpYmxlIHRvCisJCSAqIGZpbmQgdW5pdGlhbGl6ZWQgZHF1b3QgYmxrcy4gU2VlIGNvbW1lbnQgaW4geGZzX3FtX2RxY2hlY2suCisJCSAqLworCQkodm9pZCkgeGZzX3FtX2RxY2hlY2soZGRxLCBpZCtqLCB0eXBlLCBYRlNfUU1PUFRfRFFSRVBBSVIsCisJCQkJICAgICAgInhmc19xdW90YWNoZWNrIik7CisJCUlOVF9TRVQoZGRxLT5kX2Jjb3VudCwgQVJDSF9DT05WRVJULCAwVUxMKTsKKwkJSU5UX1NFVChkZHEtPmRfaWNvdW50LCBBUkNIX0NPTlZFUlQsIDBVTEwpOworCQlJTlRfU0VUKGRkcS0+ZF9ydGJjb3VudCwgQVJDSF9DT05WRVJULCAwVUxMKTsKKwkJSU5UX1NFVChkZHEtPmRfYnRpbWVyLCBBUkNIX0NPTlZFUlQsICh0aW1lX3QpMCk7CisJCUlOVF9TRVQoZGRxLT5kX2l0aW1lciwgQVJDSF9DT05WRVJULCAodGltZV90KTApOworCQlJTlRfU0VUKGRkcS0+ZF9id2FybnMsIEFSQ0hfQ09OVkVSVCwgMFVMKTsKKwkJSU5UX1NFVChkZHEtPmRfaXdhcm5zLCBBUkNIX0NPTlZFUlQsIDBVTCk7CisJCWRkcSA9ICh4ZnNfZGlza19kcXVvdF90ICopICgoeGZzX2RxYmxrX3QgKilkZHEgKyAxKTsKKwl9CisKKwlyZXR1cm4gKDApOworfQorCitTVEFUSUMgaW50Cit4ZnNfcW1fZHFpdGVyX2J1ZnMoCisJeGZzX21vdW50X3QJKm1wLAorCXhmc19kcWlkX3QJZmlyc3RpZCwKKwl4ZnNfZnNibG9ja190CWJubywKKwl4ZnNfZmlsYmxrc190CWJsa2NudCwKKwl1aW50CQlmbGFncykKK3sKKwl4ZnNfYnVmX3QJKmJwOworCWludAkJZXJyb3I7CisJaW50CQlub3Rjb21taXR0ZWQ7CisJaW50CQlpbmNyOworCisJQVNTRVJUKGJsa2NudCA+IDApOworCW5vdGNvbW1pdHRlZCA9IDA7CisJaW5jciA9IChibGtjbnQgPiBYRlNfUU1fTUFYX0RRQ0xVU1RFUl9MT0dTWikgPworCQlYRlNfUU1fTUFYX0RRQ0xVU1RFUl9MT0dTWiA6IGJsa2NudDsKKwllcnJvciA9IDA7CisKKwkvKgorCSAqIEJsa2NudCBhcmcgY2FuIGJlIGEgdmVyeSBiaWcgbnVtYmVyLCBhbmQgbWlnaHQgZXZlbiBiZQorCSAqIGxhcmdlciB0aGFuIHRoZSBsb2cgaXRzZWxmLiBTbywgd2UgaGF2ZSB0byBicmVhayBpdCB1cCBpbnRvCisJICogbWFuYWdlYWJsZS1zaXplZCB0cmFuc2FjdGlvbnMuCisJICogTm90ZSB0aGF0IHdlIGRvbid0IHN0YXJ0IGEgcGVybWFuZW50IHRyYW5zYWN0aW9uIGhlcmU7IHdlIG1pZ2h0CisJICogbm90IGJlIGFibGUgdG8gZ2V0IGEgbG9nIHJlc2VydmF0aW9uIGZvciB0aGUgd2hvbGUgdGhpbmcgdXAgZnJvbnQsCisJICogYW5kIHdlIGRvbid0IHJlYWxseSBjYXJlIHRvIGVpdGhlciwgYmVjYXVzZSB3ZSBqdXN0IGRpc2NhcmQKKwkgKiBldmVyeXRoaW5nIGlmIHdlIHdlcmUgdG8gY3Jhc2ggaW4gdGhlIG1pZGRsZSBvZiB0aGlzIGxvb3AuCisJICovCisJd2hpbGUgKGJsa2NudC0tKSB7CisJCWVycm9yID0geGZzX3RyYW5zX3JlYWRfYnVmKG1wLCBOVUxMLCBtcC0+bV9kZGV2X3RhcmdwLAorCQkJICAgICAgWEZTX0ZTQl9UT19EQUREUihtcCwgYm5vKSwKKwkJCSAgICAgIChpbnQpWEZTX1FJX0RRQ0hVTktMRU4obXApLCAwLCAmYnApOworCQlpZiAoZXJyb3IpCisJCQlicmVhazsKKworCQkodm9pZCkgeGZzX3FtX3Jlc2V0X2RxY291bnRzKG1wLCBicCwgZmlyc3RpZCwKKwkJCQkJICAgICBmbGFncyAmIFhGU19RTU9QVF9VUVVPVEEgPworCQkJCQkgICAgIFhGU19EUV9VU0VSIDogWEZTX0RRX0dST1VQKTsKKwkJeGZzX2Jkd3JpdGUobXAsIGJwKTsKKwkJLyoKKwkJICogZ290byB0aGUgbmV4dCBibG9jay4KKwkJICovCisJCWJubysrOworCQlmaXJzdGlkICs9IFhGU19RTV9EUVBFUkJMSyhtcCk7CisJfQorCXJldHVybiAoZXJyb3IpOworfQorCisvKgorICogSXRlcmF0ZSBvdmVyIGFsbCBhbGxvY2F0ZWQgVVNSL0dSUCBkcXVvdHMgaW4gdGhlIHN5c3RlbSwgY2FsbGluZyBhCisgKiBjYWxsZXIgc3VwcGxpZWQgZnVuY3Rpb24gZm9yIGV2ZXJ5IGNodW5rIG9mIGRxdW90cyB0aGF0IHdlIGZpbmQuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19xbV9kcWl0ZXJhdGUoCisJeGZzX21vdW50X3QJKm1wLAorCXhmc19pbm9kZV90CSpxaXAsCisJdWludAkJZmxhZ3MpCit7CisJeGZzX2JtYnRfaXJlY190CQkqbWFwOworCWludAkJCWksIG5tYXBzOwkvKiBudW1iZXIgb2YgbWFwIGVudHJpZXMgKi8KKwlpbnQJCQllcnJvcjsJCS8qIHJldHVybiB2YWx1ZSAqLworCXhmc19maWxlb2ZmX3QJCWxibGtubzsKKwl4ZnNfZmlsYmxrc190CQltYXhsYmxrY250OworCXhmc19kcWlkX3QJCWZpcnN0aWQ7CisJeGZzX2ZzYmxvY2tfdAkJcmFibGtubzsKKwl4ZnNfZmlsYmxrc190CQlyYWJsa2NudDsKKworCWVycm9yID0gMDsKKwkvKgorCSAqIFRoaXMgbG9va3MgcmFjZXksIGJ1dCB3ZSBjYW4ndCBrZWVwIGFuIGlub2RlIGxvY2sgYWNyb3NzIGEKKwkgKiB0cmFuc19yZXNlcnZlLiBCdXQsIHRoaXMgZ2V0cyBjYWxsZWQgZHVyaW5nIHF1b3RhY2hlY2ssIGFuZCB0aGF0CisJICogaGFwcGVucyBvbmx5IGF0IG1vdW50IHRpbWUgd2hpY2ggaXMgc2luZ2xlIHRocmVhZGVkLgorCSAqLworCWlmIChxaXAtPmlfZC5kaV9uYmxvY2tzID09IDApCisJCXJldHVybiAoMCk7CisKKwltYXAgPSBrbWVtX2FsbG9jKFhGU19EUUlURVJfTUFQX1NJWkUgKiBzaXplb2YoKm1hcCksIEtNX1NMRUVQKTsKKworCWxibGtubyA9IDA7CisJbWF4bGJsa2NudCA9IFhGU19CX1RPX0ZTQihtcCwgKHhmc191ZnNpemVfdClYRlNfTUFYSU9GRlNFVChtcCkpOworCWRvIHsKKwkJbm1hcHMgPSBYRlNfRFFJVEVSX01BUF9TSVpFOworCQkvKgorCQkgKiBXZSBhcmVuJ3QgY2hhbmdpbmcgdGhlIGlub2RlIGl0c2VsZi4gSnVzdCBjaGFuZ2luZworCQkgKiBzb21lIG9mIGl0cyBkYXRhLiBObyBuZXcgYmxvY2tzIGFyZSBhZGRlZCBoZXJlLCBhbmQKKwkJICogdGhlIGlub2RlIGlzIG5ldmVyIGFkZGVkIHRvIHRoZSB0cmFuc2FjdGlvbi4KKwkJICovCisJCXhmc19pbG9jayhxaXAsIFhGU19JTE9DS19TSEFSRUQpOworCQllcnJvciA9IHhmc19ibWFwaShOVUxMLCBxaXAsIGxibGtubywKKwkJCQkgIG1heGxibGtjbnQgLSBsYmxrbm8sCisJCQkJICBYRlNfQk1BUElfTUVUQURBVEEsCisJCQkJICBOVUxMLAorCQkJCSAgMCwgbWFwLCAmbm1hcHMsIE5VTEwpOworCQl4ZnNfaXVubG9jayhxaXAsIFhGU19JTE9DS19TSEFSRUQpOworCQlpZiAoZXJyb3IpCisJCQlicmVhazsKKworCQlBU1NFUlQobm1hcHMgPD0gWEZTX0RRSVRFUl9NQVBfU0laRSk7CisJCWZvciAoaSA9IDA7IGkgPCBubWFwczsgaSsrKSB7CisJCQlBU1NFUlQobWFwW2ldLmJyX3N0YXJ0YmxvY2sgIT0gREVMQVlTVEFSVEJMT0NLKTsKKwkJCUFTU0VSVChtYXBbaV0uYnJfYmxvY2tjb3VudCk7CisKKworCQkJbGJsa25vICs9IG1hcFtpXS5icl9ibG9ja2NvdW50OworCisJCQlpZiAobWFwW2ldLmJyX3N0YXJ0YmxvY2sgPT0gSE9MRVNUQVJUQkxPQ0spCisJCQkJY29udGludWU7CisKKwkJCWZpcnN0aWQgPSAoeGZzX2RxaWRfdCkgbWFwW2ldLmJyX3N0YXJ0b2ZmICoKKwkJCQlYRlNfUU1fRFFQRVJCTEsobXApOworCQkJLyoKKwkJCSAqIERvIGEgcmVhZC1haGVhZCBvbiB0aGUgbmV4dCBleHRlbnQuCisJCQkgKi8KKwkJCWlmICgoaSsxIDwgbm1hcHMpICYmCisJCQkgICAgKG1hcFtpKzFdLmJyX3N0YXJ0YmxvY2sgIT0gSE9MRVNUQVJUQkxPQ0spKSB7CisJCQkJcmFibGtjbnQgPSAgbWFwW2krMV0uYnJfYmxvY2tjb3VudDsKKwkJCQlyYWJsa25vID0gbWFwW2krMV0uYnJfc3RhcnRibG9jazsKKwkJCQl3aGlsZSAocmFibGtjbnQtLSkgeworCQkJCQl4ZnNfYmFyZWFkKG1wLT5tX2RkZXZfdGFyZ3AsCisJCQkJCSAgICAgICBYRlNfRlNCX1RPX0RBRERSKG1wLCByYWJsa25vKSwKKwkJCQkJICAgICAgIChpbnQpWEZTX1FJX0RRQ0hVTktMRU4obXApKTsKKwkJCQkJcmFibGtubysrOworCQkJCX0KKwkJCX0KKwkJCS8qCisJCQkgKiBJdGVyYXRlIHRocnUgYWxsIHRoZSBibGtzIGluIHRoZSBleHRlbnQgYW5kCisJCQkgKiByZXNldCB0aGUgY291bnRlcnMgb2YgYWxsIHRoZSBkcXVvdHMgaW5zaWRlIHRoZW0uCisJCQkgKi8KKwkJCWlmICgoZXJyb3IgPSB4ZnNfcW1fZHFpdGVyX2J1ZnMobXAsCisJCQkJCQkgICAgICAgZmlyc3RpZCwKKwkJCQkJCSAgICAgICBtYXBbaV0uYnJfc3RhcnRibG9jaywKKwkJCQkJCSAgICAgICBtYXBbaV0uYnJfYmxvY2tjb3VudCwKKwkJCQkJCSAgICAgICBmbGFncykpKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoZXJyb3IpCisJCQlicmVhazsKKwl9IHdoaWxlIChubWFwcyA+IDApOworCisJa21lbV9mcmVlKG1hcCwgWEZTX0RRSVRFUl9NQVBfU0laRSAqIHNpemVvZigqbWFwKSk7CisKKwlyZXR1cm4gKGVycm9yKTsKK30KKworLyoKKyAqIENhbGxlZCBieSBkcXVzYWdlX2FkanVzdCBpbiBkb2luZyBhIHF1b3RhY2hlY2suCisgKiBHaXZlbiB0aGUgaW5vZGUsIGFuZCBhIGRxdW90IChlaXRoZXIgVVNSIG9yIEdSUCwgZG9lc24ndCBtYXR0ZXIpLAorICogdGhpcyB1cGRhdGVzIGl0cyBpbmNvcmUgY29weSBhcyB3ZWxsIGFzIHRoZSBidWZmZXIgY29weS4gVGhpcyBpcworICogc28gdGhhdCBvbmNlIHRoZSBxdW90YWNoZWNrIGlzIGRvbmUsIHdlIGNhbiBqdXN0IGxvZyBhbGwgdGhlIGJ1ZmZlcnMsCisgKiBhcyBvcHBvc2VkIHRvIGxvZ2dpbmcgbnVtZXJvdXMgdXBkYXRlcyB0byBpbmRpdmlkdWFsIGRxdW90cy4KKyAqLworU1RBVElDIHZvaWQKK3hmc19xbV9xdW90YWNoZWNrX2RxYWRqdXN0KAorCXhmc19kcXVvdF90CQkqZHFwLAorCXhmc19xY250X3QJCW5ibGtzLAorCXhmc19xY250X3QJCXJ0YmxrcykKK3sKKwlBU1NFUlQoWEZTX0RRX0lTX0xPQ0tFRChkcXApKTsKKwl4ZnNfZHF0cmFjZV9lbnRyeShkcXAsICJRQ0hFQ0sgRFFBREpVU1QiKTsKKwkvKgorCSAqIEFkanVzdCB0aGUgaW5vZGUgY291bnQgYW5kIHRoZSBibG9jayBjb3VudCB0byByZWZsZWN0IHRoaXMgaW5vZGUncworCSAqIHJlc291cmNlIHVzYWdlLgorCSAqLworCUlOVF9NT0QoZHFwLT5xX2NvcmUuZF9pY291bnQsIEFSQ0hfQ09OVkVSVCwgKzEpOworCWRxcC0+cV9yZXNfaWNvdW50Kys7CisJaWYgKG5ibGtzKSB7CisJCUlOVF9NT0QoZHFwLT5xX2NvcmUuZF9iY291bnQsIEFSQ0hfQ09OVkVSVCwgbmJsa3MpOworCQlkcXAtPnFfcmVzX2Jjb3VudCArPSBuYmxrczsKKwl9CisJaWYgKHJ0YmxrcykgeworCQlJTlRfTU9EKGRxcC0+cV9jb3JlLmRfcnRiY291bnQsIEFSQ0hfQ09OVkVSVCwgcnRibGtzKTsKKwkJZHFwLT5xX3Jlc19ydGJjb3VudCArPSBydGJsa3M7CisJfQorCisJLyoKKwkgKiBTZXQgZGVmYXVsdCBsaW1pdHMsIGFkanVzdCB0aW1lcnMgKHNpbmNlIHdlIGNoYW5nZWQgdXNhZ2VzKQorCSAqLworCWlmICghIFhGU19JU19TVVNFUl9EUVVPVChkcXApKSB7CisJCXhmc19xbV9hZGp1c3RfZHFsaW1pdHMoZHFwLT5xX21vdW50LCAmZHFwLT5xX2NvcmUpOworCQl4ZnNfcW1fYWRqdXN0X2RxdGltZXJzKGRxcC0+cV9tb3VudCwgJmRxcC0+cV9jb3JlKTsKKwl9CisKKwlkcXAtPmRxX2ZsYWdzIHw9IFhGU19EUV9ESVJUWTsKK30KKworU1RBVElDIGludAoreGZzX3FtX2dldF9ydGJsa3MoCisJeGZzX2lub2RlX3QJKmlwLAorCXhmc19xY250X3QJKk9fcnRibGtzKQoreworCXhmc19maWxibGtzX3QJcnRibGtzOwkJCS8qIHRvdGFsIHJ0IGJsa3MgKi8KKwl4ZnNfaWZvcmtfdAkqaWZwOwkJCS8qIGlub2RlIGZvcmsgcG9pbnRlciAqLworCXhmc19leHRudW1fdAluZXh0ZW50czsJCS8qIG51bWJlciBvZiBleHRlbnQgZW50cmllcyAqLworCXhmc19ibWJ0X3JlY190CSpiYXNlOwkJCS8qIGJhc2Ugb2YgZXh0ZW50IGFycmF5ICovCisJeGZzX2JtYnRfcmVjX3QJKmVwOwkJCS8qIHBvaW50ZXIgdG8gYW4gZXh0ZW50IGVudHJ5ICovCisJaW50CQllcnJvcjsKKworCUFTU0VSVChYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApKTsKKwlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCBYRlNfREFUQV9GT1JLKTsKKwlpZiAoIShpZnAtPmlmX2ZsYWdzICYgWEZTX0lGRVhURU5UUykpIHsKKwkJaWYgKChlcnJvciA9IHhmc19pcmVhZF9leHRlbnRzKE5VTEwsIGlwLCBYRlNfREFUQV9GT1JLKSkpCisJCQlyZXR1cm4gKGVycm9yKTsKKwl9CisJcnRibGtzID0gMDsKKwluZXh0ZW50cyA9IGlmcC0+aWZfYnl0ZXMgLyBzaXplb2YoeGZzX2JtYnRfcmVjX3QpOworCWJhc2UgPSAmaWZwLT5pZl91MS5pZl9leHRlbnRzWzBdOworCWZvciAoZXAgPSBiYXNlOyBlcCA8ICZiYXNlW25leHRlbnRzXTsgZXArKykKKwkJcnRibGtzICs9IHhmc19ibWJ0X2dldF9ibG9ja2NvdW50KGVwKTsKKwkqT19ydGJsa3MgPSAoeGZzX3FjbnRfdClydGJsa3M7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIGNhbGxiYWNrIHJvdXRpbmUgc3VwcGxpZWQgdG8gYnVsa3N0YXQoKS4gR2l2ZW4gYW4gaW51bWJlciwgZmluZCBpdHMKKyAqIGRxdW90cyBhbmQgdXBkYXRlIHRoZW0gdG8gYWNjb3VudCBmb3IgcmVzb3VyY2VzIHRha2VuIGJ5IHRoYXQgaW5vZGUuCisgKi8KKy8qIEFSR1NVU0VEICovCitTVEFUSUMgaW50Cit4ZnNfcW1fZHF1c2FnZV9hZGp1c3QoCisJeGZzX21vdW50X3QJKm1wLAkJLyogbW91bnQgcG9pbnQgZm9yIGZpbGVzeXN0ZW0gKi8KKwl4ZnNfaW5vX3QJaW5vLAkJLyogaW5vZGUgbnVtYmVyIHRvIGdldCBkYXRhIGZvciAqLworCXZvaWQJCV9fdXNlciAqYnVmZmVyLAkvKiBub3QgdXNlZCAqLworCWludAkJdWJzaXplLAkJLyogbm90IHVzZWQgKi8KKwl2b2lkCQkqcHJpdmF0ZV9kYXRhLAkvKiBub3QgdXNlZCAqLworCXhmc19kYWRkcl90CWJubywJCS8qIHN0YXJ0aW5nIGJsb2NrIG9mIGlub2RlIGNsdXN0ZXIgKi8KKwlpbnQJCSp1YnVzZWQsCS8qIG5vdCB1c2VkICovCisJdm9pZAkJKmRpcCwJCS8qIG9uLWRpc2sgaW5vZGUgcG9pbnRlciAobm90IHVzZWQpICovCisJaW50CQkqcmVzKQkJLyogcmVzdWx0IGNvZGUgdmFsdWUgKi8KK3sKKwl4ZnNfaW5vZGVfdAkqaXA7CisJeGZzX2RxdW90X3QJKnVkcXAsICpnZHFwOworCXhmc19xY250X3QJbmJsa3MsIHJ0YmxrczsKKwlpbnQJCWVycm9yOworCisJQVNTRVJUKFhGU19JU19RVU9UQV9SVU5OSU5HKG1wKSk7CisKKwkvKgorCSAqIHJvb3Rpbm8gbXVzdCBoYXZlIGl0cyByZXNvdXJjZXMgYWNjb3VudGVkIGZvciwgbm90IHNvIHdpdGggdGhlIHF1b3RhCisJICogaW5vZGVzLgorCSAqLworCWlmIChpbm8gPT0gbXAtPm1fc2Iuc2JfdXF1b3Rpbm8gfHwgaW5vID09IG1wLT5tX3NiLnNiX2dxdW90aW5vKSB7CisJCSpyZXMgPSBCVUxLU1RBVF9SVl9OT1RISU5HOworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisJfQorCisJLyoKKwkgKiBXZSBkb24ndCBfbmVlZF8gdG8gdGFrZSB0aGUgaWxvY2sgRVhDTC4gSG93ZXZlciwgdGhlIHhmc19xbV9kcWdldAorCSAqIGludGVyZmFjZSBleHBlY3RzIHRoZSBpbm9kZSB0byBiZSBleGNsdXNpdmVseSBsb2NrZWQgYmVjYXVzZSB0aGF0J3MKKwkgKiB0aGUgY2FzZSBpbiBhbGwgb3RoZXIgaW5zdGFuY2VzLiBJdCdzIE9LIHRoYXQgd2UgZG8gdGhpcyBiZWNhdXNlCisJICogcXVvdGFjaGVjayBpcyBkb25lIG9ubHkgYXQgbW91bnQgdGltZS4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2lnZXQobXAsIE5VTEwsIGlubywgMCwgWEZTX0lMT0NLX0VYQ0wsICZpcCwgYm5vKSkpIHsKKwkJKnJlcyA9IEJVTEtTVEFUX1JWX05PVEhJTkc7CisJCXJldHVybiAoZXJyb3IpOworCX0KKworCWlmIChpcC0+aV9kLmRpX21vZGUgPT0gMCkgeworCQl4ZnNfaXB1dF9uZXcoaXAsIFhGU19JTE9DS19FWENMKTsKKwkJKnJlcyA9IEJVTEtTVEFUX1JWX05PVEhJTkc7CisJCXJldHVybiBYRlNfRVJST1IoRU5PRU5UKTsKKwl9CisKKwkvKgorCSAqIE9idGFpbiB0aGUgbG9ja2VkIGRxdW90cy4gSW4gY2FzZSBvZiBhbiBlcnJvciAoZWcuIGFsbG9jYXRpb24KKwkgKiBmYWlscyBmb3IgRU5PU1BDKSwgd2UgcmV0dXJuIHRoZSBuZWdhdGl2ZSBvZiB0aGUgZXJyb3IgbnVtYmVyCisJICogdG8gYnVsa3N0YXQsIHNvIHRoYXQgaXQgY2FuIGdldCBwcm9wYWdhdGVkIHRvIHF1b3RhY2hlY2soKSBhbmQKKwkgKiBtYWtpbmcgdXMgZGlzYWJsZSBxdW90YXMgZm9yIHRoZSBmaWxlIHN5c3RlbS4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX3FtX2RxZ2V0X25vYXR0YWNoKGlwLCAmdWRxcCwgJmdkcXApKSkgeworCQl4ZnNfaXB1dChpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQkqcmVzID0gQlVMS1NUQVRfUlZfR0lWRVVQOworCQlyZXR1cm4gKGVycm9yKTsKKwl9CisKKwlydGJsa3MgPSAwOworCWlmICghIFhGU19JU19SRUFMVElNRV9JTk9ERShpcCkpIHsKKwkJbmJsa3MgPSAoeGZzX3FjbnRfdClpcC0+aV9kLmRpX25ibG9ja3M7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogV2FsayB0aHJ1IHRoZSBleHRlbnQgbGlzdCBhbmQgY291bnQgdGhlIHJlYWx0aW1lIGJsb2Nrcy4KKwkJICovCisJCWlmICgoZXJyb3IgPSB4ZnNfcW1fZ2V0X3J0YmxrcyhpcCwgJnJ0YmxrcykpKSB7CisJCQl4ZnNfaXB1dChpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQkJaWYgKHVkcXApCisJCQkJeGZzX3FtX2RxcHV0KHVkcXApOworCQkJaWYgKGdkcXApCisJCQkJeGZzX3FtX2RxcHV0KGdkcXApOworCQkJKnJlcyA9IEJVTEtTVEFUX1JWX0dJVkVVUDsKKwkJCXJldHVybiAoZXJyb3IpOworCQl9CisJCW5ibGtzID0gKHhmc19xY250X3QpaXAtPmlfZC5kaV9uYmxvY2tzIC0gcnRibGtzOworCX0KKwlBU1NFUlQoaXAtPmlfZGVsYXllZF9ibGtzID09IDApOworCisJLyoKKwkgKiBXZSBjYW4ndCByZWxlYXNlIHRoZSBpbm9kZSB3aGlsZSBob2xkaW5nIGl0cyBkcXVvdCBsb2Nrcy4KKwkgKiBUaGUgaW5vZGUgY2FuIGdvIGludG8gaW5hY3RpdmUgYW5kIG1pZ2h0IHRyeSB0byBhY3F1aXJlIHRoZSBkcXVvdGxvY2tzLgorCSAqIFNvLCBqdXN0IHVubG9jayBoZXJlIGFuZCBkbyBhIHZuX3JlbGUgYXQgdGhlIGVuZC4KKwkgKi8KKwl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCisJLyoKKwkgKiBBZGQgdGhlIChkaXNrIGJsb2NrcyBhbmQgaW5vZGUpIHJlc291cmNlcyBvY2N1cGllZCBieSB0aGlzCisJICogaW5vZGUgdG8gaXRzIGRxdW90cy4gV2UgZG8gdGhpcyBhZGp1c3RtZW50IGluIHRoZSBpbmNvcmUgZHF1b3QsCisJICogYW5kIGFsc28gY29weSB0aGUgY2hhbmdlcyB0byBpdHMgYnVmZmVyLgorCSAqIFdlIGRvbid0IGNhcmUgYWJvdXQgcHV0dGluZyB0aGVzZSBjaGFuZ2VzIGluIGEgdHJhbnNhY3Rpb24KKwkgKiBlbnZlbG9wZSBiZWNhdXNlIGlmIHdlIGNyYXNoIGluIHRoZSBtaWRkbGUgb2YgYSAncXVvdGFjaGVjaycKKwkgKiB3ZSBoYXZlIHRvIHN0YXJ0IGZyb20gdGhlIGJlZ2lubmluZyBhbnl3YXkuCisJICogT25jZSB3ZSdyZSBkb25lLCB3ZSdsbCBsb2cgYWxsIHRoZSBkcXVvdCBidWZzLgorCSAqCisJICogVGhlICpRVU9UQV9PTiBjaGVja3MgYmVsb3cgbWF5IGxvb2sgcHJldHR5IHJhY2V5LCBidXQgcXVvdGFjaGVja3MKKwkgKiBhbmQgcXVvdGFvZmZzIGRvbid0IHJhY2UuIChRdW90YWNoZWNrcyBoYXBwZW4gYXQgbW91bnQgdGltZSBvbmx5KS4KKwkgKi8KKwlpZiAoWEZTX0lTX1VRVU9UQV9PTihtcCkpIHsKKwkJQVNTRVJUKHVkcXApOworCQl4ZnNfcW1fcXVvdGFjaGVja19kcWFkanVzdCh1ZHFwLCBuYmxrcywgcnRibGtzKTsKKwkJeGZzX3FtX2RxcHV0KHVkcXApOworCX0KKwlpZiAoWEZTX0lTX0dRVU9UQV9PTihtcCkpIHsKKwkJQVNTRVJUKGdkcXApOworCQl4ZnNfcW1fcXVvdGFjaGVja19kcWFkanVzdChnZHFwLCBuYmxrcywgcnRibGtzKTsKKwkJeGZzX3FtX2RxcHV0KGdkcXApOworCX0KKwkvKgorCSAqIE5vdyByZWxlYXNlIHRoZSBpbm9kZS4gVGhpcyB3aWxsIHNlbmQgaXQgdG8gJ2luYWN0aXZlJywgYW5kCisJICogcG9zc2libHkgZXZlbiBmcmVlIGJsb2Nrcy4KKwkgKi8KKwlWTl9SRUxFKFhGU19JVE9WKGlwKSk7CisKKwkvKgorCSAqIEdvdG8gbmV4dCBpbm9kZS4KKwkgKi8KKwkqcmVzID0gQlVMS1NUQVRfUlZfRElET05FOworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBXYWxrIHRocnUgYWxsIHRoZSBmaWxlc3lzdGVtIGlub2RlcyBhbmQgY29uc3RydWN0IGEgY29uc2lzdGVudCB2aWV3CisgKiBvZiB0aGUgZGlzayBxdW90YSB3b3JsZC4gSWYgdGhlIHF1b3RhY2hlY2sgZmFpbHMsIGRpc2FibGUgcXVvdGFzLgorICovCitpbnQKK3hmc19xbV9xdW90YWNoZWNrKAorCXhmc19tb3VudF90CSptcCkKK3sKKwlpbnQJCWRvbmUsIGNvdW50LCBlcnJvcjsKKwl4ZnNfaW5vX3QJbGFzdGlubzsKKwlzaXplX3QJCXN0cnVjdHN6OworCXhmc19pbm9kZV90CSp1aXAsICpnaXA7CisJdWludAkJZmxhZ3M7CisKKwljb3VudCA9IElOVF9NQVg7CisJc3RydWN0c3ogPSAxOworCWxhc3Rpbm8gPSAwOworCWZsYWdzID0gMDsKKworCUFTU0VSVChYRlNfUUlfVVFJUChtcCkgfHwgWEZTX1FJX0dRSVAobXApKTsKKwlBU1NFUlQoWEZTX0lTX1FVT1RBX1JVTk5JTkcobXApKTsKKworCS8qCisJICogVGhlcmUgc2hvdWxkIGJlIG5vIGNhY2hlZCBkcXVvdHMuIFRoZSAoc2ltcGxpc3RpYykgcXVvdGFjaGVjaworCSAqIGFsZ29yaXRobSBkb2Vzbid0IGxpa2UgdGhhdC4KKwkgKi8KKwlBU1NFUlQoWEZTX1FJX01QTE5EUVVPVFMobXApID09IDApOworCisJY21uX2VycihDRV9OT1RFLCAiWEZTIHF1b3RhY2hlY2sgJXM6IFBsZWFzZSB3YWl0LiIsIG1wLT5tX2ZzbmFtZSk7CisKKwkvKgorCSAqIEZpcnN0IHdlIGdvIHRocnUgYWxsIHRoZSBkcXVvdHMgb24gZGlzaywgVVNSIGFuZCBHUlAsIGFuZCByZXNldAorCSAqIHRoZWlyIGNvdW50ZXJzIHRvIHplcm8uIFdlIG5lZWQgYSBjbGVhbiBzbGF0ZS4KKwkgKiBXZSBkb24ndCBsb2cgb3VyIGNoYW5nZXMgdGlsbCBsYXRlci4KKwkgKi8KKwlpZiAoKHVpcCA9IFhGU19RSV9VUUlQKG1wKSkpIHsKKwkJaWYgKChlcnJvciA9IHhmc19xbV9kcWl0ZXJhdGUobXAsIHVpcCwgWEZTX1FNT1BUX1VRVU9UQSkpKQorCQkJZ290byBlcnJvcl9yZXR1cm47CisJCWZsYWdzIHw9IFhGU19VUVVPVEFfQ0hLRDsKKwl9CisKKwlpZiAoKGdpcCA9IFhGU19RSV9HUUlQKG1wKSkpIHsKKwkJaWYgKChlcnJvciA9IHhmc19xbV9kcWl0ZXJhdGUobXAsIGdpcCwgWEZTX1FNT1BUX0dRVU9UQSkpKQorCQkJZ290byBlcnJvcl9yZXR1cm47CisJCWZsYWdzIHw9IFhGU19HUVVPVEFfQ0hLRDsKKwl9CisKKwlkbyB7CisJCS8qCisJCSAqIEl0ZXJhdGUgdGhydSBhbGwgdGhlIGlub2RlcyBpbiB0aGUgZmlsZSBzeXN0ZW0sCisJCSAqIGFkanVzdGluZyB0aGUgY29ycmVzcG9uZGluZyBkcXVvdCBjb3VudGVycyBpbiBjb3JlLgorCQkgKi8KKwkJaWYgKChlcnJvciA9IHhmc19idWxrc3RhdChtcCwgJmxhc3Rpbm8sICZjb3VudCwKKwkJCQkgICAgIHhmc19xbV9kcXVzYWdlX2FkanVzdCwgTlVMTCwKKwkJCQkgICAgIHN0cnVjdHN6LCBOVUxMLAorCQkJCSAgICAgQlVMS1NUQVRfRkdfSUdFVHxCVUxLU1RBVF9GR19WRlNMT0NLRUQsCisJCQkJICAgICAmZG9uZSkpKQorCQkJYnJlYWs7CisKKwl9IHdoaWxlICghIGRvbmUpOworCisJLyoKKwkgKiBXZSBjYW4gZ2V0IHRoaXMgZXJyb3IgaWYgd2UgY291bGRuJ3QgZG8gYSBkcXVvdCBhbGxvY2F0aW9uIGluc2lkZQorCSAqIHhmc19xbV9kcXVzYWdlX2FkanVzdCAodmlhIGJ1bGtzdGF0KS4gV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUKKwkgKiBkaXJ0eSBkcXVvdHMgdGhhdCBtaWdodCBiZSBjYWNoZWQsIHdlIGp1c3Qgd2FudCB0byBnZXQgcmlkIG9mIHRoZW0KKwkgKiBhbmQgdHVybiBxdW90YW9mZi4gVGhlIGRxdW90cyB3b24ndCBiZSBhdHRhY2hlZCB0byBhbnkgb2YgdGhlIGlub2RlcworCSAqIGF0IHRoaXMgcG9pbnQgKGJlY2F1c2Ugd2UgaW50ZW50aW9uYWxseSBkaWRuJ3QgaW4gZHFnZXRfbm9hdHRhY2gpLgorCSAqLworCWlmIChlcnJvcikgeworCQl4ZnNfcW1fZHFwdXJnZV9hbGwobXAsCisJCQkJICAgWEZTX1FNT1BUX1VRVU9UQXxYRlNfUU1PUFRfR1FVT1RBfAorCQkJCSAgIFhGU19RTU9QVF9RVU9UQU9GRik7CisJCWdvdG8gZXJyb3JfcmV0dXJuOworCX0KKwkvKgorCSAqIFdlJ3ZlIG1hZGUgYWxsIHRoZSBjaGFuZ2VzIHRoYXQgd2UgbmVlZCB0byBtYWtlIGluY29yZS4KKwkgKiBOb3cgZmx1c2hfdGhlbSBkb3duIHRvIGRpc2sgYnVmZmVycy4KKwkgKi8KKwl4ZnNfcW1fZHFmbHVzaF9hbGwobXAsIFhGU19RTU9QVF9ERUxXUkkpOworCisJLyoKKwkgKiBXZSBkaWRuJ3QgbG9nIGFueXRoaW5nLCBiZWNhdXNlIGlmIHdlIGNyYXNoZWQsIHdlJ2xsIGhhdmUgdG8KKwkgKiBzdGFydCB0aGUgcXVvdGFjaGVjayBmcm9tIHNjcmF0Y2ggYW55d2F5LiBIb3dldmVyLCB3ZSBtdXN0IG1ha2UKKwkgKiBzdXJlIHRoYXQgb3VyIGRxdW90IGNoYW5nZXMgYXJlIHNlY3VyZSBiZWZvcmUgd2UgcHV0IHRoZQorCSAqIHF1b3RhY2hlY2snZCBzdGFtcCBvbiB0aGUgc3VwZXJibG9jay4gU28sIGhlcmUgd2UgZG8gYSBzeW5jaHJvbm91cworCSAqIGZsdXNoLgorCSAqLworCVhGU19iZmx1c2gobXAtPm1fZGRldl90YXJncCk7CisKKwkvKgorCSAqIElmIG9uZSB0eXBlIG9mIHF1b3RhcyBpcyBvZmYsIHRoZW4gaXQgd2lsbCBsb3NlIGl0cworCSAqIHF1b3RhY2hlY2tlZCBzdGF0dXMsIHNpbmNlIHdlIHdvbid0IGJlIGRvaW5nIGFjY291bnRpbmcgZm9yCisJICogdGhhdCB0eXBlIGFueW1vcmUuCisJICovCisJbXAtPm1fcWZsYWdzICY9IH4oWEZTX0dRVU9UQV9DSEtEIHwgWEZTX1VRVU9UQV9DSEtEKTsKKwltcC0+bV9xZmxhZ3MgfD0gZmxhZ3M7CisKKwlYUU1fTElTVF9QUklOVCgmKFhGU19RSV9NUExfTElTVChtcCkpLCBNUExfTkVYVCwgIisrKysgTXAgbGlzdCArKysiKTsKKworIGVycm9yX3JldHVybjoKKwlpZiAoZXJyb3IpIHsKKwkJY21uX2VycihDRV9XQVJOLCAiWEZTIHF1b3RhY2hlY2sgJXM6IFVuc3VjY2Vzc2Z1bCAoRXJyb3IgJWQpOiAiCisJCQkiRGlzYWJsaW5nIHF1b3Rhcy4iLAorCQkJbXAtPm1fZnNuYW1lLCBlcnJvcik7CisJCS8qCisJCSAqIFdlIG11c3QgdHVybiBvZmYgcXVvdGFzLgorCQkgKi8KKwkJQVNTRVJUKG1wLT5tX3F1b3RhaW5mbyAhPSBOVUxMKTsKKwkJQVNTRVJUKHhmc19HcW0gIT0gTlVMTCk7CisJCXhmc19xbV9kZXN0cm95X3F1b3RhaW5mbyhtcCk7CisJCXhmc19tb3VudF9yZXNldF9zYnFmbGFncyhtcCk7CisJfSBlbHNlIHsKKwkJY21uX2VycihDRV9OT1RFLCAiWEZTIHF1b3RhY2hlY2sgJXM6IERvbmUuIiwgbXAtPm1fZnNuYW1lKTsKKwl9CisJcmV0dXJuIChlcnJvcik7Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgc3VwZXJibG9jayBoYXMgYmVlbiByZWFkIGluIGFuZCB3ZSdyZSByZWFkeSB0bworICogaWdldCB0aGUgcXVvdGEgaW5vZGVzLgorICovCitTVEFUSUMgaW50Cit4ZnNfcW1faW5pdF9xdW90YWlub3MoCisJeGZzX21vdW50X3QJKm1wKQoreworCXhmc19pbm9kZV90CSp1aXAsICpnaXA7CisJaW50CQllcnJvcjsKKwlfX2ludDY0X3QJc2JmbGFnczsKKwl1aW50CQlmbGFnczsKKworCUFTU0VSVChtcC0+bV9xdW90YWluZm8pOworCXVpcCA9IGdpcCA9IE5VTEw7CisJc2JmbGFncyA9IDA7CisJZmxhZ3MgPSAwOworCisJLyoKKwkgKiBHZXQgdGhlIHVxdW90YSBhbmQgZ3F1b3RhIGlub2RlcworCSAqLworCWlmIChYRlNfU0JfVkVSU0lPTl9IQVNRVU9UQSgmbXAtPm1fc2IpKSB7CisJCWlmIChYRlNfSVNfVVFVT1RBX09OKG1wKSAmJgorCQkgICAgbXAtPm1fc2Iuc2JfdXF1b3Rpbm8gIT0gTlVMTEZTSU5PKSB7CisJCQlBU1NFUlQobXAtPm1fc2Iuc2JfdXF1b3Rpbm8gPiAwKTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfaWdldChtcCwgTlVMTCwgbXAtPm1fc2Iuc2JfdXF1b3Rpbm8sCisJCQkJCSAgICAgMCwgMCwgJnVpcCwgMCkpKQorCQkJCXJldHVybiBYRlNfRVJST1IoZXJyb3IpOworCQl9CisJCWlmIChYRlNfSVNfR1FVT1RBX09OKG1wKSAmJgorCQkgICAgbXAtPm1fc2Iuc2JfZ3F1b3Rpbm8gIT0gTlVMTEZTSU5PKSB7CisJCQlBU1NFUlQobXAtPm1fc2Iuc2JfZ3F1b3Rpbm8gPiAwKTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfaWdldChtcCwgTlVMTCwgbXAtPm1fc2Iuc2JfZ3F1b3Rpbm8sCisJCQkJCSAgICAgMCwgMCwgJmdpcCwgMCkpKSB7CisJCQkJaWYgKHVpcCkKKwkJCQkJVk5fUkVMRShYRlNfSVRPVih1aXApKTsKKwkJCQlyZXR1cm4gWEZTX0VSUk9SKGVycm9yKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWZsYWdzIHw9IFhGU19RTU9QVF9TQlZFUlNJT047CisJCXNiZmxhZ3MgfD0gKFhGU19TQl9WRVJTSU9OTlVNIHwgWEZTX1NCX1VRVU9USU5PIHwKKwkJCSAgICBYRlNfU0JfR1FVT1RJTk8gfCBYRlNfU0JfUUZMQUdTKTsKKwl9CisKKwkvKgorCSAqIENyZWF0ZSB0aGUgdHdvIGlub2RlcywgaWYgdGhleSBkb24ndCBleGlzdCBhbHJlYWR5LiBUaGUgY2hhbmdlcworCSAqIG1hZGUgYWJvdmUgd2lsbCBnZXQgYWRkZWQgdG8gYSB0cmFuc2FjdGlvbiBhbmQgbG9nZ2VkIGluIG9uZSBvZgorCSAqIHRoZSBxaW5vX2FsbG9jIGNhbGxzIGJlbG93LiAgSWYgdGhlIGRldmljZSBpcyByZWFkb25seSwKKwkgKiB0ZW1wb3JhcmlseSBzd2l0Y2ggdG8gcmVhZC13cml0ZSB0byBkbyB0aGlzLgorCSAqLworCWlmIChYRlNfSVNfVVFVT1RBX09OKG1wKSAmJiB1aXAgPT0gTlVMTCkgeworCQlpZiAoKGVycm9yID0geGZzX3FtX3Fpbm9fYWxsb2MobXAsICZ1aXAsCisJCQkJCSAgICAgIHNiZmxhZ3MgfCBYRlNfU0JfVVFVT1RJTk8sCisJCQkJCSAgICAgIGZsYWdzIHwgWEZTX1FNT1BUX1VRVU9UQSkpKQorCQkJcmV0dXJuIFhGU19FUlJPUihlcnJvcik7CisKKwkJZmxhZ3MgJj0gflhGU19RTU9QVF9TQlZFUlNJT047CisJfQorCWlmIChYRlNfSVNfR1FVT1RBX09OKG1wKSAmJiBnaXAgPT0gTlVMTCkgeworCQlpZiAoKGVycm9yID0geGZzX3FtX3Fpbm9fYWxsb2MobXAsICZnaXAsCisJCQkJCSAgICAgIHNiZmxhZ3MgfCBYRlNfU0JfR1FVT1RJTk8sCisJCQkJCSAgICAgIGZsYWdzIHwgWEZTX1FNT1BUX0dRVU9UQSkpKSB7CisJCQlpZiAodWlwKQorCQkJCVZOX1JFTEUoWEZTX0lUT1YodWlwKSk7CisKKwkJCXJldHVybiBYRlNfRVJST1IoZXJyb3IpOworCQl9CisJfQorCisJWEZTX1FJX1VRSVAobXApID0gdWlwOworCVhGU19RSV9HUUlQKG1wKSA9IGdpcDsKKworCXJldHVybiAoMCk7Cit9CisKKworLyoKKyAqIFRyYXZlcnNlIHRoZSBmcmVlbGlzdCBvZiBkcXVvdHMgYW5kIGF0dGVtcHQgdG8gcmVjbGFpbSBhIG1heGltdW0gb2YKKyAqICdob3dtYW55JyBkcXVvdHMuIFRoaXMgb3BlcmF0aW9uIHJhY2VzIHdpdGggZHFsb29rdXAoKSwgYW5kIGF0dGVtcHRzIHRvCisgKiBmYXZvciB0aGUgbG9va3VwIGZ1bmN0aW9uIC4uLgorICogWFhYc3VwIG1lcmdlIHRoaXMgd2l0aCBxbV9yZWNsYWltX29uZSgpLgorICovCitTVEFUSUMgaW50Cit4ZnNfcW1fc2hha2VfZnJlZWxpc3QoCisJaW50IGhvd21hbnkpCit7CisJaW50CQlucmVjbGFpbWVkOworCXhmc19kcWhhc2hfdAkqaGFzaDsKKwl4ZnNfZHF1b3RfdAkqZHFwLCAqbmV4dGRxcDsKKwlpbnQJCXJlc3RhcnRzOworCWludAkJbmZsdXNoZXM7CisKKwlpZiAoaG93bWFueSA8PSAwKQorCQlyZXR1cm4gKDApOworCisJbnJlY2xhaW1lZCA9IDA7CisJcmVzdGFydHMgPSAwOworCW5mbHVzaGVzID0gMDsKKworI2lmZGVmIFFVT1RBREVCVUcKKwljbW5fZXJyKENFX0RFQlVHLCAiU2hha2UgZnJlZSAweCV4IiwgaG93bWFueSk7CisjZW5kaWYKKwkvKiBsb2NrIG9yZGVyIGlzIDogaGFzaGNoYWlubG9jaywgZnJlZWxpc3Rsb2NrLCBtcGxpc3Rsb2NrICovCisgdHJ5YWdhaW46CisJeGZzX3FtX2ZyZWVsaXN0X2xvY2soeGZzX0dxbSk7CisKKwlmb3IgKGRxcCA9IHhmc19HcW0tPnFtX2RxZnJlZWxpc3QucWhfbmV4dDsKKwkgICAgICgoZHFwICE9ICh4ZnNfZHF1b3RfdCAqKSAmeGZzX0dxbS0+cW1fZHFmcmVlbGlzdCkgJiYKKwkgICAgICBucmVjbGFpbWVkIDwgaG93bWFueSk7ICkgeworCQl4ZnNfZHFsb2NrKGRxcCk7CisKKwkJLyoKKwkJICogV2UgYXJlIHJhY2luZyB3aXRoIGRxbG9va3VwIGhlcmUuIE5hdHVyYWxseSB3ZSBkb24ndAorCQkgKiB3YW50IHRvIHJlY2xhaW0gYSBkcXVvdCB0aGF0IGxvb2t1cCB3YW50cy4KKwkJICovCisJCWlmIChkcXAtPmRxX2ZsYWdzICYgWEZTX0RRX1dBTlQpIHsKKwkJCXhmc19kcXVubG9jayhkcXApOworCQkJeGZzX3FtX2ZyZWVsaXN0X3VubG9jayh4ZnNfR3FtKTsKKwkJCWlmICgrK3Jlc3RhcnRzID49IFhGU19RTV9SRUNMQUlNX01BWF9SRVNUQVJUUykKKwkJCQlyZXR1cm4gKG5yZWNsYWltZWQpOworCQkJWFFNX1NUQVRTX0lOQyh4cW1zdGF0cy54c19xbV9kcXdhbnRzKTsKKwkJCWdvdG8gdHJ5YWdhaW47CisJCX0KKworCQkvKgorCQkgKiBJZiB0aGUgZHF1b3QgaXMgaW5hY3RpdmUsIHdlIGFyZSBhc3N1cmVkIHRoYXQgaXQgaXMKKwkJICogbm90IG9uIHRoZSBtcGxpc3Qgb3IgdGhlIGhhc2hsaXN0LCBhbmQgdGhhdCBtYWtlcyBvdXIKKwkJICogbGlmZSBlYXNpZXIuCisJCSAqLworCQlpZiAoZHFwLT5kcV9mbGFncyAmIFhGU19EUV9JTkFDVElWRSkgeworCQkJQVNTRVJUKGRxcC0+cV9tb3VudCA9PSBOVUxMKTsKKwkJCUFTU0VSVCghIFhGU19EUV9JU19ESVJUWShkcXApKTsKKwkJCUFTU0VSVChkcXAtPkhMX1BSRVZQID09IE5VTEwpOworCQkJQVNTRVJUKGRxcC0+TVBMX1BSRVZQID09IE5VTEwpOworCQkJWFFNX1NUQVRTX0lOQyh4cW1zdGF0cy54c19xbV9kcWluYWN0X3JlY2xhaW1zKTsKKwkJCW5leHRkcXAgPSBkcXAtPmRxX2ZsbmV4dDsKKwkJCWdvdG8gb2ZmX2ZyZWVsaXN0OworCQl9CisKKwkJQVNTRVJUKGRxcC0+TVBMX1BSRVZQKTsKKwkJLyoKKwkJICogVHJ5IHRvIGdyYWIgdGhlIGZsdXNoIGxvY2suIElmIHRoaXMgZHF1b3QgaXMgaW4gdGhlIHByb2Nlc3Mgb2YKKwkJICogZ2V0dGluZyBmbHVzaGVkIHRvIGRpc2ssIHdlIGRvbid0IHdhbnQgdG8gcmVjbGFpbSBpdC4KKwkJICovCisJCWlmICghIHhmc19xbV9kcWZsb2NrX25vd2FpdChkcXApKSB7CisJCQl4ZnNfZHF1bmxvY2soZHFwKTsKKwkJCWRxcCA9IGRxcC0+ZHFfZmxuZXh0OworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBXZSBoYXZlIHRoZSBmbHVzaCBsb2NrIHNvIHdlIGtub3cgdGhhdCB0aGlzIGlzIG5vdCBpbiB0aGUKKwkJICogcHJvY2VzcyBvZiBiZWluZyBmbHVzaGVkLiBTbywgaWYgdGhpcyBpcyBkaXJ0eSwgZmx1c2ggaXQKKwkJICogREVMV1JJIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IGEgZnJlZWxpc3QgaW5mZXN0ZWQgd2l0aAorCQkgKiBkaXJ0eSBkcXVvdHMuCisJCSAqLworCQlpZiAoWEZTX0RRX0lTX0RJUlRZKGRxcCkpIHsKKwkJCXhmc19kcXRyYWNlX2VudHJ5KGRxcCwgIkRRU0hBS0U6IERRRElSVFkiKTsKKwkJCS8qCisJCQkgKiBXZSBmbHVzaCBpdCBkZWxheWVkIHdyaXRlLCBzbyBkb24ndCBib3RoZXIKKwkJCSAqIHJlbGVhc2luZyB0aGUgbXBsb2NrLgorCQkJICovCisJCQkodm9pZCkgeGZzX3FtX2RxZmx1c2goZHFwLCBYRlNfUU1PUFRfREVMV1JJKTsKKwkJCXhmc19kcXVubG9jayhkcXApOyAvKiBkcWZsdXNoIHVubG9ja3MgZHFmbG9jayAqLworCQkJZHFwID0gZHFwLT5kcV9mbG5leHQ7CisJCQljb250aW51ZTsKKwkJfQorCQkvKgorCQkgKiBXZSdyZSB0cnlpbmcgdG8gZ2V0IHRoZSBoYXNobG9jayBvdXQgb2Ygb3JkZXIuIFRoaXMgcmFjZXMKKwkJICogd2l0aCBkcWxvb2t1cDsgc28sIHdlIGdpdmV1cCBhbmQgZ290byB0aGUgbmV4dCBkcXVvdCBpZgorCQkgKiB3ZSBjb3VsZG4ndCBnZXQgdGhlIGhhc2hsb2NrLiBUaGlzIHdheSwgd2Ugd29uJ3Qgc3RhcnZlCisJCSAqIGEgZHFsb29rdXAgcHJvY2VzcyB0aGF0IGhvbGRzIHRoZSBoYXNobG9jayB0aGF0IGlzCisJCSAqIHdhaXRpbmcgZm9yIHRoZSBmcmVlbGlzdCBsb2NrLgorCQkgKi8KKwkJaWYgKCEgeGZzX3FtX2RxaGFzaGxvY2tfbm93YWl0KGRxcCkpIHsKKwkJCXhmc19kcWZ1bmxvY2soZHFwKTsKKwkJCXhmc19kcXVubG9jayhkcXApOworCQkJZHFwID0gZHFwLT5kcV9mbG5leHQ7CisJCQljb250aW51ZTsKKwkJfQorCQkvKgorCQkgKiBUaGlzIHJhY2VzIHdpdGggZHF1b3QgYWxsb2NhdGlvbiBjb2RlIGFzIHdlbGwgYXMgZHFmbHVzaF9hbGwKKwkJICogYW5kIHJlY2xhaW0gY29kZS4gU28sIGlmIHdlIGZhaWxlZCB0byBncmFiIHRoZSBtcGxpc3QgbG9jaywKKwkJICogZ2l2ZXVwIGV2ZXJ5dGhpbmcgYW5kIHN0YXJ0IG92ZXIuCisJCSAqLworCQloYXNoID0gZHFwLT5xX2hhc2g7CisJCUFTU0VSVChoYXNoKTsKKwkJaWYgKCEgeGZzX3FtX21wbGlzdF9ub3dhaXQoZHFwLT5xX21vdW50KSkgeworCQkJLyogWFhYIHB1dCBhIHNlbnRpbmVsIHNvIHRoYXQgd2UgY2FuIGNvbWUgYmFjayBoZXJlICovCisJCQl4ZnNfZHFmdW5sb2NrKGRxcCk7CisJCQl4ZnNfZHF1bmxvY2soZHFwKTsKKwkJCVhGU19EUV9IQVNIX1VOTE9DSyhoYXNoKTsKKwkJCXhmc19xbV9mcmVlbGlzdF91bmxvY2soeGZzX0dxbSk7CisJCQlpZiAoKytyZXN0YXJ0cyA+PSBYRlNfUU1fUkVDTEFJTV9NQVhfUkVTVEFSVFMpCisJCQkJcmV0dXJuIChucmVjbGFpbWVkKTsKKwkJCWdvdG8gdHJ5YWdhaW47CisJCX0KKwkJeGZzX2RxdHJhY2VfZW50cnkoZHFwLCAiRFFTSEFLRTogVU5MSU5LSU5HIik7CisjaWZkZWYgUVVPVEFERUJVRworCQljbW5fZXJyKENFX0RFQlVHLCAiU2hha2UgMHglcCwgSUQgMHgleFxuIiwKKwkJCWRxcCwgSU5UX0dFVChkcXAtPnFfY29yZS5kX2lkLCBBUkNIX0NPTlZFUlQpKTsKKyNlbmRpZgorCQlBU1NFUlQoZHFwLT5xX25yZWZzID09IDApOworCQluZXh0ZHFwID0gZHFwLT5kcV9mbG5leHQ7CisJCVhRTV9NUExJU1RfUkVNT1ZFKCYoWEZTX1FJX01QTF9MSVNUKGRxcC0+cV9tb3VudCkpLCBkcXApOworCQlYUU1fSEFTSExJU1RfUkVNT1ZFKGhhc2gsIGRxcCk7CisJCXhmc19kcWZ1bmxvY2soZHFwKTsKKwkJeGZzX3FtX21wbGlzdF91bmxvY2soZHFwLT5xX21vdW50KTsKKwkJWEZTX0RRX0hBU0hfVU5MT0NLKGhhc2gpOworCisgb2ZmX2ZyZWVsaXN0OgorCQlYUU1fRlJFRUxJU1RfUkVNT1ZFKGRxcCk7CisJCXhmc19kcXVubG9jayhkcXApOworCQlucmVjbGFpbWVkKys7CisJCVhRTV9TVEFUU19JTkMoeHFtc3RhdHMueHNfcW1fZHFzaGFrZV9yZWNsYWltcyk7CisJCXhmc19xbV9kcWRlc3Ryb3koZHFwKTsKKwkJZHFwID0gbmV4dGRxcDsKKwl9CisJeGZzX3FtX2ZyZWVsaXN0X3VubG9jayh4ZnNfR3FtKTsKKwlyZXR1cm4gKG5yZWNsYWltZWQpOworfQorCisKKy8qCisgKiBUaGUga21lbV9zaGFrZSBpbnRlcmZhY2UgaXMgaW52b2tlZCB3aGVuIG1lbW9yeSBpcyBydW5uaW5nIGxvdy4KKyAqLworLyogQVJHU1VTRUQgKi8KK1NUQVRJQyBpbnQKK3hmc19xbV9zaGFrZShpbnQgbnJfdG9fc2NhbiwgdW5zaWduZWQgaW50IGdmcF9tYXNrKQoreworCWludAluZHF1c2VkLCBuZnJlZSwgbjsKKworCWlmICgha21lbV9zaGFrZV9hbGxvdyhnZnBfbWFzaykpCisJCXJldHVybiAoMCk7CisJaWYgKCF4ZnNfR3FtKQorCQlyZXR1cm4gKDApOworCisJbmZyZWUgPSB4ZnNfR3FtLT5xbV9kcWZyZWVsaXN0LnFoX25lbGVtczsgLyogZnJlZSBkcXVvdHMgKi8KKwkvKiBpbmNvcmUgZHF1b3RzIGluIGFsbCBmL3MncyAqLworCW5kcXVzZWQgPSBhdG9taWNfcmVhZCgmeGZzX0dxbS0+cW1fdG90YWxkcXVvdHMpIC0gbmZyZWU7CisKKwlBU1NFUlQobmRxdXNlZCA+PSAwKTsKKworCWlmIChuZnJlZSA8PSBuZHF1c2VkICYmIG5mcmVlIDwgbmRxdW90KQorCQlyZXR1cm4gKDApOworCisJbmRxdXNlZCAqPSB4ZnNfR3FtLT5xbV9kcWZyZWVfcmF0aW87CS8qIHRhcmdldCAjIG9mIGZyZWUgZHF1b3RzICovCisJbiA9IG5mcmVlIC0gbmRxdXNlZCAtIG5kcXVvdDsJCS8qICMgb3ZlciB0YXJnZXQgKi8KKworCXJldHVybiB4ZnNfcW1fc2hha2VfZnJlZWxpc3QoTUFYKG5mcmVlLCBuKSk7Cit9CisKKworLyoKKyAqIEp1c3QgcG9wIHRoZSBsZWFzdCByZWNlbnRseSB1c2VkIGRxdW90IG9mZiB0aGUgZnJlZWxpc3QgYW5kCisgKiByZWN5Y2xlIGl0LiBUaGUgcmV0dXJuZWQgZHF1b3QgaXMgbG9ja2VkLgorICovCitTVEFUSUMgeGZzX2RxdW90X3QgKgoreGZzX3FtX2RxcmVjbGFpbV9vbmUodm9pZCkKK3sKKwl4ZnNfZHF1b3RfdAkqZHFwb3V0OworCXhmc19kcXVvdF90CSpkcXA7CisJaW50CQlyZXN0YXJ0czsKKwlpbnQJCW5mbHVzaGVzOworCisJcmVzdGFydHMgPSAwOworCWRxcG91dCA9IE5VTEw7CisJbmZsdXNoZXMgPSAwOworCisJLyogbG9ja29yZGVyOiBoYXNoY2hhaW5sb2NrLCBmcmVlbGlzdGxvY2ssIG1wbGlzdGxvY2ssIGRxbG9jaywgZHFmbG9jayAqLworIHN0YXJ0YWdhaW46CisJeGZzX3FtX2ZyZWVsaXN0X2xvY2soeGZzX0dxbSk7CisKKwlGT1JFQUNIX0RRVU9UX0lOX0ZSRUVMSVNUKGRxcCwgJih4ZnNfR3FtLT5xbV9kcWZyZWVsaXN0KSkgeworCQl4ZnNfZHFsb2NrKGRxcCk7CisKKwkJLyoKKwkJICogV2UgYXJlIHJhY2luZyB3aXRoIGRxbG9va3VwIGhlcmUuIE5hdHVyYWxseSB3ZSBkb24ndAorCQkgKiB3YW50IHRvIHJlY2xhaW0gYSBkcXVvdCB0aGF0IGxvb2t1cCB3YW50cy4gV2UgcmVsZWFzZSB0aGUKKwkJICogZnJlZWxpc3QgbG9jayBhbmQgc3RhcnQgb3Zlciwgc28gdGhhdCBsb29rdXAgd2lsbCBncmFiCisJCSAqIGJvdGggdGhlIGRxdW90IGFuZCB0aGUgZnJlZWxpc3Rsb2NrLgorCQkgKi8KKwkJaWYgKGRxcC0+ZHFfZmxhZ3MgJiBYRlNfRFFfV0FOVCkgeworCQkJQVNTRVJUKCEgKGRxcC0+ZHFfZmxhZ3MgJiBYRlNfRFFfSU5BQ1RJVkUpKTsKKwkJCXhmc19kcXRyYWNlX2VudHJ5KGRxcCwgIkRRUkVDTEFJTTogRFFXQU5UIik7CisJCQl4ZnNfZHF1bmxvY2soZHFwKTsKKwkJCXhmc19xbV9mcmVlbGlzdF91bmxvY2soeGZzX0dxbSk7CisJCQlpZiAoKytyZXN0YXJ0cyA+PSBYRlNfUU1fUkVDTEFJTV9NQVhfUkVTVEFSVFMpCisJCQkJcmV0dXJuIChOVUxMKTsKKwkJCVhRTV9TVEFUU19JTkMoeHFtc3RhdHMueHNfcW1fZHF3YW50cyk7CisJCQlnb3RvIHN0YXJ0YWdhaW47CisJCX0KKworCQkvKgorCQkgKiBJZiB0aGUgZHF1b3QgaXMgaW5hY3RpdmUsIHdlIGFyZSBhc3N1cmVkIHRoYXQgaXQgaXMKKwkJICogbm90IG9uIHRoZSBtcGxpc3Qgb3IgdGhlIGhhc2hsaXN0LCBhbmQgdGhhdCBtYWtlcyBvdXIKKwkJICogbGlmZSBlYXNpZXIuCisJCSAqLworCQlpZiAoZHFwLT5kcV9mbGFncyAmIFhGU19EUV9JTkFDVElWRSkgeworCQkJQVNTRVJUKGRxcC0+cV9tb3VudCA9PSBOVUxMKTsKKwkJCUFTU0VSVCghIFhGU19EUV9JU19ESVJUWShkcXApKTsKKwkJCUFTU0VSVChkcXAtPkhMX1BSRVZQID09IE5VTEwpOworCQkJQVNTRVJUKGRxcC0+TVBMX1BSRVZQID09IE5VTEwpOworCQkJWFFNX0ZSRUVMSVNUX1JFTU9WRShkcXApOworCQkJeGZzX2RxdW5sb2NrKGRxcCk7CisJCQlkcXBvdXQgPSBkcXA7CisJCQlYUU1fU1RBVFNfSU5DKHhxbXN0YXRzLnhzX3FtX2RxaW5hY3RfcmVjbGFpbXMpOworCQkJYnJlYWs7CisJCX0KKworCQlBU1NFUlQoZHFwLT5xX2hhc2gpOworCQlBU1NFUlQoZHFwLT5NUExfUFJFVlApOworCisJCS8qCisJCSAqIFRyeSB0byBncmFiIHRoZSBmbHVzaCBsb2NrLiBJZiB0aGlzIGRxdW90IGlzIGluIHRoZSBwcm9jZXNzIG9mCisJCSAqIGdldHRpbmcgZmx1c2hlZCB0byBkaXNrLCB3ZSBkb24ndCB3YW50IHRvIHJlY2xhaW0gaXQuCisJCSAqLworCQlpZiAoISB4ZnNfcW1fZHFmbG9ja19ub3dhaXQoZHFwKSkgeworCQkJeGZzX2RxdW5sb2NrKGRxcCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIFdlIGhhdmUgdGhlIGZsdXNoIGxvY2sgc28gd2Uga25vdyB0aGF0IHRoaXMgaXMgbm90IGluIHRoZQorCQkgKiBwcm9jZXNzIG9mIGJlaW5nIGZsdXNoZWQuIFNvLCBpZiB0aGlzIGlzIGRpcnR5LCBmbHVzaCBpdAorCQkgKiBERUxXUkkgc28gdGhhdCB3ZSBkb24ndCBnZXQgYSBmcmVlbGlzdCBpbmZlc3RlZCB3aXRoCisJCSAqIGRpcnR5IGRxdW90cy4KKwkJICovCisJCWlmIChYRlNfRFFfSVNfRElSVFkoZHFwKSkgeworCQkJeGZzX2RxdHJhY2VfZW50cnkoZHFwLCAiRFFSRUNMQUlNOiBEUURJUlRZIik7CisJCQkvKgorCQkJICogV2UgZmx1c2ggaXQgZGVsYXllZCB3cml0ZSwgc28gZG9uJ3QgYm90aGVyCisJCQkgKiByZWxlYXNpbmcgdGhlIGZyZWVsaXN0IGxvY2suCisJCQkgKi8KKwkJCSh2b2lkKSB4ZnNfcW1fZHFmbHVzaChkcXAsIFhGU19RTU9QVF9ERUxXUkkpOworCQkJeGZzX2RxdW5sb2NrKGRxcCk7IC8qIGRxZmx1c2ggdW5sb2NrcyBkcWZsb2NrICovCisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghIHhmc19xbV9tcGxpc3Rfbm93YWl0KGRxcC0+cV9tb3VudCkpIHsKKwkJCXhmc19kcWZ1bmxvY2soZHFwKTsKKwkJCXhmc19kcXVubG9jayhkcXApOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoISB4ZnNfcW1fZHFoYXNobG9ja19ub3dhaXQoZHFwKSkKKwkJCWdvdG8gbXBsaXN0dW5sb2NrOworCisJCUFTU0VSVChkcXAtPnFfbnJlZnMgPT0gMCk7CisJCXhmc19kcXRyYWNlX2VudHJ5KGRxcCwgIkRRUkVDTEFJTTogVU5MSU5LSU5HIik7CisJCVhRTV9NUExJU1RfUkVNT1ZFKCYoWEZTX1FJX01QTF9MSVNUKGRxcC0+cV9tb3VudCkpLCBkcXApOworCQlYUU1fSEFTSExJU1RfUkVNT1ZFKGRxcC0+cV9oYXNoLCBkcXApOworCQlYUU1fRlJFRUxJU1RfUkVNT1ZFKGRxcCk7CisJCWRxcG91dCA9IGRxcDsKKwkJWEZTX0RRX0hBU0hfVU5MT0NLKGRxcC0+cV9oYXNoKTsKKyBtcGxpc3R1bmxvY2s6CisJCXhmc19xbV9tcGxpc3RfdW5sb2NrKGRxcC0+cV9tb3VudCk7CisJCXhmc19kcWZ1bmxvY2soZHFwKTsKKwkJeGZzX2RxdW5sb2NrKGRxcCk7CisJCWlmIChkcXBvdXQpCisJCQlicmVhazsKKwl9CisKKwl4ZnNfcW1fZnJlZWxpc3RfdW5sb2NrKHhmc19HcW0pOworCXJldHVybiAoZHFwb3V0KTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBSZXR1cm4gYSBuZXcgaW5jb3JlIGRxdW90LiBEZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZgorICogZHF1b3RzIGluIHRoZSBzeXN0ZW0sIHdlIGVpdGhlciBhbGxvY2F0ZSBhIG5ldyBvbmUgb24gdGhlIGtlcm5lbCBoZWFwLAorICogb3IgcmVjbGFpbSBhIGZyZWUgb25lLgorICogUmV0dXJuIHZhbHVlIGlzIEJfVFJVRSBpZiB3ZSBhbGxvY2F0ZWQgYSBuZXcgZHF1b3QsIEJfRkFMU0UgaWYgd2UgbWFuYWdlZAorICogdG8gcmVjbGFpbSBhbiBleGlzdGluZyBvbmUgZnJvbSB0aGUgZnJlZWxpc3QuCisgKi8KK2Jvb2xlYW5fdAoreGZzX3FtX2RxYWxsb2NfaW5jb3JlKAorCXhmc19kcXVvdF90ICoqT19kcXBwKQoreworCXhmc19kcXVvdF90CSpkcXA7CisKKwkvKgorCSAqIENoZWNrIGFnYWluc3QgaGlnaCB3YXRlciBtYXJrIHRvIHNlZSBpZiB3ZSB3YW50IHRvIHBvcAorCSAqIGEgbmluY29tcG9vcCBkcXVvdCBvZmYgdGhlIGZyZWVsaXN0LgorCSAqLworCWlmIChhdG9taWNfcmVhZCgmeGZzX0dxbS0+cW1fdG90YWxkcXVvdHMpID49IG5kcXVvdCkgeworCQkvKgorCQkgKiBUcnkgdG8gcmVjeWNsZSBhIGRxdW90IGZyb20gdGhlIGZyZWVsaXN0LgorCQkgKi8KKwkJaWYgKChkcXAgPSB4ZnNfcW1fZHFyZWNsYWltX29uZSgpKSkgeworCQkJWFFNX1NUQVRTX0lOQyh4cW1zdGF0cy54c19xbV9kcXJlY2xhaW1zKTsKKwkJCS8qCisJCQkgKiBKdXN0IHplcm8gdGhlIGNvcmUgaGVyZS4gVGhlIHJlc3Qgd2lsbCBnZXQKKwkJCSAqIHJlaW5pdGlhbGl6ZWQgYnkgY2FsbGVyLiBYWFggd2Ugc2hvdWxkbid0IGV2ZW4KKwkJCSAqIGRvIHRoaXMgemVybyAuLi4KKwkJCSAqLworCQkJbWVtc2V0KCZkcXAtPnFfY29yZSwgMCwgc2l6ZW9mKGRxcC0+cV9jb3JlKSk7CisJCQkqT19kcXBwID0gZHFwOworCQkJcmV0dXJuIChCX0ZBTFNFKTsKKwkJfQorCQlYUU1fU1RBVFNfSU5DKHhxbXN0YXRzLnhzX3FtX2RxcmVjbGFpbV9taXNzZXMpOworCX0KKworCS8qCisJICogQWxsb2NhdGUgYSBicmFuZCBuZXcgZHF1b3Qgb24gdGhlIGtlcm5lbCBoZWFwIGFuZCByZXR1cm4gaXQKKwkgKiB0byB0aGUgY2FsbGVyIHRvIGluaXRpYWxpemUuCisJICovCisJQVNTRVJUKHhmc19HcW0tPnFtX2Rxem9uZSAhPSBOVUxMKTsKKwkqT19kcXBwID0ga21lbV96b25lX3phbGxvYyh4ZnNfR3FtLT5xbV9kcXpvbmUsIEtNX1NMRUVQKTsKKwlhdG9taWNfaW5jKCZ4ZnNfR3FtLT5xbV90b3RhbGRxdW90cyk7CisKKwlyZXR1cm4gKEJfVFJVRSk7Cit9CisKKworLyoKKyAqIFN0YXJ0IGEgdHJhbnNhY3Rpb24gYW5kIHdyaXRlIHRoZSBpbmNvcmUgc3VwZXJibG9jayBjaGFuZ2VzIHRvCisgKiBkaXNrLiBmbGFncyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHdoaWNoIGZpZWxkcyBoYXZlIGNoYW5nZWQuCisgKi8KK2ludAoreGZzX3FtX3dyaXRlX3NiX2NoYW5nZXMoCisJeGZzX21vdW50X3QJKm1wLAorCV9faW50NjRfdAlmbGFncykKK3sKKwl4ZnNfdHJhbnNfdAkqdHA7CisJaW50CQllcnJvcjsKKworI2lmZGVmIFFVT1RBREVCVUcKKwljbW5fZXJyKENFX05PVEUsICJXcml0aW5nIHN1cGVyYmxvY2sgcXVvdGEgY2hhbmdlcyA6JXMiLCBtcC0+bV9mc25hbWUpOworI2VuZGlmCisJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19RTV9TQkNIQU5HRSk7CisJaWYgKChlcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCAwLAorCQkJCSAgICAgIG1wLT5tX3NiLnNiX3NlY3RzaXplICsgMTI4LCAwLAorCQkJCSAgICAgIDAsCisJCQkJICAgICAgWEZTX0RFRkFVTFRfTE9HX0NPVU5UKSkpIHsKKwkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgMCk7CisJCXJldHVybiAoZXJyb3IpOworCX0KKworCXhmc19tb2Rfc2IodHAsIGZsYWdzKTsKKwkodm9pZCkgeGZzX3RyYW5zX2NvbW1pdCh0cCwgMCwgTlVMTCk7CisKKwlyZXR1cm4gKDApOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLSB1dGlsaXR5IGZ1bmN0aW9ucyBmb3Igdm5vZGVvcHMgLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qCisgKiBHaXZlbiBhbiBpbm9kZSwgYSB1aWQgYW5kIGdpZCAoZnJvbSBjcmVkX3QpIG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUKKyAqIGFsbG9jYXRlZCByZWxldmFudCBkcXVvdChzKSBvbiBkaXNrLCBhbmQgdGhhdCB3ZSB3b24ndCBleGNlZWQgaW5vZGUKKyAqIHF1b3RhcyBieSBjcmVhdGluZyB0aGlzIGZpbGUuCisgKiBUaGlzIGFsc28gYXR0YWNoZXMgZHF1b3QocykgdG8gdGhlIGdpdmVuIGlub2RlIGFmdGVyIGxvY2tpbmcgaXQsCisgKiBhbmQgcmV0dXJucyB0aGUgZHF1b3RzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVpZCBhbmQvb3IgZ2lkLgorICoKKyAqIGluCTogaW5vZGUgKHVubG9ja2VkKQorICogb3V0CTogdWRxdW90LCBnZHF1b3Qgd2l0aCByZWZlcmVuY2VzIHRha2VuIGFuZCB1bmxvY2tlZAorICovCitpbnQKK3hmc19xbV92b3BfZHFhbGxvYygKKwl4ZnNfbW91bnRfdAkqbXAsCisJeGZzX2lub2RlX3QJKmlwLAorCXVpZF90CQl1aWQsCisJZ2lkX3QJCWdpZCwKKwl1aW50CQlmbGFncywKKwl4ZnNfZHF1b3RfdAkqKk9fdWRxcHAsCisJeGZzX2RxdW90X3QJKipPX2dkcXBwKQoreworCWludAkJZXJyb3I7CisJeGZzX2RxdW90X3QJKnVxLCAqZ3E7CisJdWludAkJbG9ja2ZsYWdzOworCisJaWYgKCFYRlNfSVNfUVVPVEFfT04obXApKQorCQlyZXR1cm4gMDsKKworCWxvY2tmbGFncyA9IFhGU19JTE9DS19FWENMOworCXhmc19pbG9jayhpcCwgbG9ja2ZsYWdzKTsKKworCWlmICgoZmxhZ3MgJiBYRlNfUU1PUFRfSU5IRVJJVCkgJiYKKwkgICAgWEZTX0lOSEVSSVRfR0lEKGlwLCBYRlNfTVRPVkZTKG1wKSkpCisJCWdpZCA9IGlwLT5pX2QuZGlfZ2lkOworCisJLyoKKwkgKiBBdHRhY2ggdGhlIGRxdW90KHMpIHRvIHRoaXMgaW5vZGUsIGRvaW5nIGEgZHF1b3QgYWxsb2NhdGlvbgorCSAqIGlmIG5lY2Vzc2FyeS4gVGhlIGRxdW90KHMpIHdpbGwgbm90IGJlIGxvY2tlZC4KKwkgKi8KKwlpZiAoWEZTX05PVF9EUUFUVEFDSEVEKG1wLCBpcCkpIHsKKwkJaWYgKChlcnJvciA9IHhmc19xbV9kcWF0dGFjaChpcCwgWEZTX1FNT1BUX0RRQUxMT0MgfAorCQkJCQkgICAgWEZTX1FNT1BUX0lMT0NLRUQpKSkgeworCQkJeGZzX2l1bmxvY2soaXAsIGxvY2tmbGFncyk7CisJCQlyZXR1cm4gKGVycm9yKTsKKwkJfQorCX0KKworCXVxID0gZ3EgPSBOVUxMOworCWlmICgoZmxhZ3MgJiBYRlNfUU1PUFRfVVFVT1RBKSAmJgorCSAgICBYRlNfSVNfVVFVT1RBX09OKG1wKSkgeworCQlpZiAoaXAtPmlfZC5kaV91aWQgIT0gdWlkKSB7CisJCQkvKgorCQkJICogV2hhdCB3ZSBuZWVkIGlzIHRoZSBkcXVvdCB0aGF0IGhhcyB0aGlzIHVpZCwgYW5kCisJCQkgKiBpZiB3ZSBzZW5kIHRoZSBpbm9kZSB0byBkcWdldCwgdGhlIHVpZCBvZiB0aGUgaW5vZGUKKwkJCSAqIHRha2VzIHByaW9yaXR5IG92ZXIgd2hhdCdzIHNlbnQgaW4gdGhlIHVpZCBhcmd1bWVudC4KKwkJCSAqIFdlIG11c3QgdW5sb2NrIGlub2RlIGhlcmUgYmVmb3JlIGNhbGxpbmcgZHFnZXQgaWYKKwkJCSAqIHdlJ3JlIG5vdCBzZW5kaW5nIHRoZSBpbm9kZSwgYmVjYXVzZSBvdGhlcndpc2UKKwkJCSAqIHdlJ2xsIGRlYWRsb2NrIGJ5IGRvaW5nIHRyYW5zX3Jlc2VydmUgd2hpbGUKKwkJCSAqIGhvbGRpbmcgaWxvY2suCisJCQkgKi8KKwkJCXhmc19pdW5sb2NrKGlwLCBsb2NrZmxhZ3MpOworCQkJaWYgKChlcnJvciA9IHhmc19xbV9kcWdldChtcCwgTlVMTCwgKHhmc19kcWlkX3QpIHVpZCwKKwkJCQkJCSBYRlNfRFFfVVNFUiwKKwkJCQkJCSBYRlNfUU1PUFRfRFFBTExPQyB8CisJCQkJCQkgWEZTX1FNT1BUX0RPV0FSTiwKKwkJCQkJCSAmdXEpKSkgeworCQkJCUFTU0VSVChlcnJvciAhPSBFTk9FTlQpOworCQkJCXJldHVybiAoZXJyb3IpOworCQkJfQorCQkJLyoKKwkJCSAqIEdldCB0aGUgaWxvY2sgaW4gdGhlIHJpZ2h0IG9yZGVyLgorCQkJICovCisJCQl4ZnNfZHF1bmxvY2sodXEpOworCQkJbG9ja2ZsYWdzID0gWEZTX0lMT0NLX1NIQVJFRDsKKwkJCXhmc19pbG9jayhpcCwgbG9ja2ZsYWdzKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBUYWtlIGFuIGV4dHJhIHJlZmVyZW5jZSwgYmVjYXVzZSB3ZSdsbCByZXR1cm4KKwkJCSAqIHRoaXMgdG8gY2FsbGVyCisJCQkgKi8KKwkJCUFTU0VSVChpcC0+aV91ZHF1b3QpOworCQkJdXEgPSBpcC0+aV91ZHF1b3Q7CisJCQl4ZnNfZHFsb2NrKHVxKTsKKwkJCVhGU19EUUhPTEQodXEpOworCQkJeGZzX2RxdW5sb2NrKHVxKTsKKwkJfQorCX0KKwlpZiAoKGZsYWdzICYgWEZTX1FNT1BUX0dRVU9UQSkgJiYKKwkgICAgWEZTX0lTX0dRVU9UQV9PTihtcCkpIHsKKwkJaWYgKGlwLT5pX2QuZGlfZ2lkICE9IGdpZCkgeworCQkJeGZzX2l1bmxvY2soaXAsIGxvY2tmbGFncyk7CisJCQlpZiAoKGVycm9yID0geGZzX3FtX2RxZ2V0KG1wLCBOVUxMLCAoeGZzX2RxaWRfdClnaWQsCisJCQkJCQkgWEZTX0RRX0dST1VQLAorCQkJCQkJIFhGU19RTU9QVF9EUUFMTE9DIHwKKwkJCQkJCSBYRlNfUU1PUFRfRE9XQVJOLAorCQkJCQkJICZncSkpKSB7CisJCQkJaWYgKHVxKQorCQkJCQl4ZnNfcW1fZHFyZWxlKHVxKTsKKwkJCQlBU1NFUlQoZXJyb3IgIT0gRU5PRU5UKTsKKwkJCQlyZXR1cm4gKGVycm9yKTsKKwkJCX0KKwkJCXhmc19kcXVubG9jayhncSk7CisJCQlsb2NrZmxhZ3MgPSBYRlNfSUxPQ0tfU0hBUkVEOworCQkJeGZzX2lsb2NrKGlwLCBsb2NrZmxhZ3MpOworCQl9IGVsc2UgeworCQkJQVNTRVJUKGlwLT5pX2dkcXVvdCk7CisJCQlncSA9IGlwLT5pX2dkcXVvdDsKKwkJCXhmc19kcWxvY2soZ3EpOworCQkJWEZTX0RRSE9MRChncSk7CisJCQl4ZnNfZHF1bmxvY2soZ3EpOworCQl9CisJfQorCWlmICh1cSkKKwkJeGZzX2RxdHJhY2VfZW50cnlfaW5vKHVxLCAiRFFBTExPQyIsIGlwKTsKKworCXhmc19pdW5sb2NrKGlwLCBsb2NrZmxhZ3MpOworCWlmIChPX3VkcXBwKQorCQkqT191ZHFwcCA9IHVxOworCWVsc2UgaWYgKHVxKQorCQl4ZnNfcW1fZHFyZWxlKHVxKTsKKwlpZiAoT19nZHFwcCkKKwkJKk9fZ2RxcHAgPSBncTsKKwllbHNlIGlmIChncSkKKwkJeGZzX3FtX2RxcmVsZShncSk7CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIEFjdHVhbGx5IHRyYW5zZmVyIG93bmVyc2hpcCwgYW5kIGRvIGRxdW90IG1vZGlmaWNhdGlvbnMuCisgKiBUaGVzZSB3ZXJlIGFscmVhZHkgcmVzZXJ2ZWQuCisgKi8KK3hmc19kcXVvdF90ICoKK3hmc19xbV92b3BfY2hvd24oCisJeGZzX3RyYW5zX3QJKnRwLAorCXhmc19pbm9kZV90CSppcCwKKwl4ZnNfZHF1b3RfdAkqKklPX29sZGRxLAorCXhmc19kcXVvdF90CSpuZXdkcSkKK3sKKwl4ZnNfZHF1b3RfdAkqcHJldmRxOworCUFTU0VSVChYRlNfSVNMT0NLRURfSU5PREVfRVhDTChpcCkpOworCUFTU0VSVChYRlNfSVNfUVVPVEFfUlVOTklORyhpcC0+aV9tb3VudCkpOworCisJLyogb2xkIGRxdW90ICovCisJcHJldmRxID0gKklPX29sZGRxOworCUFTU0VSVChwcmV2ZHEpOworCUFTU0VSVChwcmV2ZHEgIT0gbmV3ZHEpOworCisJeGZzX3RyYW5zX21vZF9kcXVvdCh0cCwgcHJldmRxLAorCQkJICAgIFhGU19UUkFOU19EUV9CQ09VTlQsCisJCQkgICAgLShpcC0+aV9kLmRpX25ibG9ja3MpKTsKKwl4ZnNfdHJhbnNfbW9kX2RxdW90KHRwLCBwcmV2ZHEsCisJCQkgICAgWEZTX1RSQU5TX0RRX0lDT1VOVCwKKwkJCSAgICAtMSk7CisKKwkvKiB0aGUgc3BhcmtsaW5nIG5ldyBkcXVvdCAqLworCXhmc190cmFuc19tb2RfZHF1b3QodHAsIG5ld2RxLAorCQkJICAgIFhGU19UUkFOU19EUV9CQ09VTlQsCisJCQkgICAgaXAtPmlfZC5kaV9uYmxvY2tzKTsKKwl4ZnNfdHJhbnNfbW9kX2RxdW90KHRwLCBuZXdkcSwKKwkJCSAgICBYRlNfVFJBTlNfRFFfSUNPVU5ULAorCQkJICAgIDEpOworCisJLyoKKwkgKiBUYWtlIGFuIGV4dHJhIHJlZmVyZW5jZSwgYmVjYXVzZSB0aGUgaW5vZGUKKwkgKiBpcyBnb2luZyB0byBrZWVwIHRoaXMgZHF1b3QgcG9pbnRlciBldmVuCisJICogYWZ0ZXIgdGhlIHRyYW5zX2NvbW1pdC4KKwkgKi8KKwl4ZnNfZHFsb2NrKG5ld2RxKTsKKwlYRlNfRFFIT0xEKG5ld2RxKTsKKwl4ZnNfZHF1bmxvY2sobmV3ZHEpOworCSpJT19vbGRkcSA9IG5ld2RxOworCisJcmV0dXJuIChwcmV2ZHEpOworfQorCisvKgorICogUXVvdGEgcmVzZXJ2YXRpb25zIGZvciBzZXRhdHRyKEFUX1VJRHxBVF9HSUQpLgorICovCitpbnQKK3hmc19xbV92b3BfY2hvd25fcmVzZXJ2ZSgKKwl4ZnNfdHJhbnNfdAkqdHAsCisJeGZzX2lub2RlX3QJKmlwLAorCXhmc19kcXVvdF90CSp1ZHFwLAorCXhmc19kcXVvdF90CSpnZHFwLAorCXVpbnQJCWZsYWdzKQoreworCWludAkJZXJyb3I7CisJeGZzX21vdW50X3QJKm1wOworCXVpbnQJCWRlbGJsa3M7CisJeGZzX2RxdW90X3QJKnVucmVzdWRxLCAqdW5yZXNnZHEsICpkZWxibGtzdWRxLCAqZGVsYmxrc2dkcTsKKworCUFTU0VSVChYRlNfSVNMT0NLRURfSU5PREUoaXApKTsKKwltcCA9IGlwLT5pX21vdW50OworCUFTU0VSVChYRlNfSVNfUVVPVEFfUlVOTklORyhtcCkpOworCisJZGVsYmxrcyA9IGlwLT5pX2RlbGF5ZWRfYmxrczsKKwlkZWxibGtzdWRxID0gZGVsYmxrc2dkcSA9IHVucmVzdWRxID0gdW5yZXNnZHEgPSBOVUxMOworCisJaWYgKFhGU19JU19VUVVPVEFfT04obXApICYmIHVkcXAgJiYKKwkgICAgaXAtPmlfZC5kaV91aWQgIT0gKHVpZF90KUlOVF9HRVQodWRxcC0+cV9jb3JlLmRfaWQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJZGVsYmxrc3VkcSA9IHVkcXA7CisJCS8qCisJCSAqIElmIHRoZXJlIGFyZSBkZWxheWVkIGFsbG9jYXRpb24gYmxvY2tzLCB0aGVuIHdlIGhhdmUgdG8KKwkJICogdW5yZXNlcnZlIHRob3NlIGZyb20gdGhlIG9sZCBkcXVvdCwgYW5kIGFkZCB0aGVtIHRvIHRoZQorCQkgKiBuZXcgZHF1b3QuCisJCSAqLworCQlpZiAoZGVsYmxrcykgeworCQkJQVNTRVJUKGlwLT5pX3VkcXVvdCk7CisJCQl1bnJlc3VkcSA9IGlwLT5pX3VkcXVvdDsKKwkJfQorCX0KKwlpZiAoWEZTX0lTX0dRVU9UQV9PTihpcC0+aV9tb3VudCkgJiYgZ2RxcCAmJgorCSAgICBpcC0+aV9kLmRpX2dpZCAhPSBJTlRfR0VUKGdkcXAtPnFfY29yZS5kX2lkLCBBUkNIX0NPTlZFUlQpKSB7CisJCWRlbGJsa3NnZHEgPSBnZHFwOworCQlpZiAoZGVsYmxrcykgeworCQkJQVNTRVJUKGlwLT5pX2dkcXVvdCk7CisJCQl1bnJlc2dkcSA9IGlwLT5pX2dkcXVvdDsKKwkJfQorCX0KKworCWlmICgoZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZV9xdW90YV9ieWRxdW90cyh0cCwgaXAtPmlfbW91bnQsCisJCQkJZGVsYmxrc3VkcSwgZGVsYmxrc2dkcSwgaXAtPmlfZC5kaV9uYmxvY2tzLCAxLAorCQkJCWZsYWdzIHwgWEZTX1FNT1BUX1JFU19SRUdCTEtTKSkpCisJCXJldHVybiAoZXJyb3IpOworCisJLyoKKwkgKiBEbyB0aGUgZGVsYXllZCBibGtzIHJlc2VydmF0aW9ucy91bnJlc2VydmF0aW9ucyBub3cuIFNpbmNlLCB0aGVzZQorCSAqIGFyZSBkb25lIHdpdGhvdXQgdGhlIGhlbHAgb2YgYSB0cmFuc2FjdGlvbiwgaWYgYSByZXNlcnZhdGlvbiBmYWlscworCSAqIGl0cyBwcmV2aW91cyByZXNlcnZhdGlvbnMgd29uJ3QgYmUgYXV0b21hdGljYWxseSB1bmRvbmUgYnkgdHJhbnMKKwkgKiBjb2RlLiBTbywgd2UgaGF2ZSB0byBkbyBpdCBtYW51YWxseSBoZXJlLgorCSAqLworCWlmIChkZWxibGtzKSB7CisJCS8qCisJCSAqIERvIHRoZSByZXNlcnZhdGlvbnMgZmlyc3QuIFVucmVzZXJ2YXRpb24gY2FuJ3QgZmFpbC4KKwkJICovCisJCUFTU0VSVChkZWxibGtzdWRxIHx8IGRlbGJsa3NnZHEpOworCQlBU1NFUlQodW5yZXN1ZHEgfHwgdW5yZXNnZHEpOworCQlpZiAoKGVycm9yID0geGZzX3RyYW5zX3Jlc2VydmVfcXVvdGFfYnlkcXVvdHMoTlVMTCwgaXAtPmlfbW91bnQsCisJCQkJZGVsYmxrc3VkcSwgZGVsYmxrc2dkcSwgKHhmc19xY250X3QpZGVsYmxrcywgMCwKKwkJCQlmbGFncyB8IFhGU19RTU9QVF9SRVNfUkVHQkxLUykpKQorCQkJcmV0dXJuIChlcnJvcik7CisJCXhmc190cmFuc19yZXNlcnZlX3F1b3RhX2J5ZHF1b3RzKE5VTEwsIGlwLT5pX21vdW50LAorCQkJCXVucmVzdWRxLCB1bnJlc2dkcSwgLSgoeGZzX3FjbnRfdClkZWxibGtzKSwgMCwKKwkJCQlYRlNfUU1PUFRfUkVTX1JFR0JMS1MpOworCX0KKworCXJldHVybiAoMCk7Cit9CisKK2ludAoreGZzX3FtX3ZvcF9yZW5hbWVfZHFhdHRhY2goCisJeGZzX2lub2RlX3QJKippX3RhYikKK3sKKwl4ZnNfaW5vZGVfdAkqaXA7CisJaW50CQlpOworCWludAkJZXJyb3I7CisKKwlpcCA9IGlfdGFiWzBdOworCisJaWYgKCEgWEZTX0lTX1FVT1RBX09OKGlwLT5pX21vdW50KSkKKwkJcmV0dXJuICgwKTsKKworCWlmIChYRlNfTk9UX0RRQVRUQUNIRUQoaXAtPmlfbW91bnQsIGlwKSkgeworCQllcnJvciA9IHhmc19xbV9kcWF0dGFjaChpcCwgMCk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiAoZXJyb3IpOworCX0KKwlmb3IgKGkgPSAxOyAoaSA8IDQgJiYgaV90YWJbaV0pOyBpKyspIHsKKwkJLyoKKwkJICogV2F0Y2ggb3V0IGZvciBkdXBsaWNhdGUgZW50cmllcyBpbiB0aGUgdGFibGUuCisJCSAqLworCQlpZiAoKGlwID0gaV90YWJbaV0pICE9IGlfdGFiW2ktMV0pIHsKKwkJCWlmIChYRlNfTk9UX0RRQVRUQUNIRUQoaXAtPmlfbW91bnQsIGlwKSkgeworCQkJCWVycm9yID0geGZzX3FtX2RxYXR0YWNoKGlwLCAwKTsKKwkJCQlpZiAoZXJyb3IpCisJCQkJCXJldHVybiAoZXJyb3IpOworCQkJfQorCQl9CisJfQorCXJldHVybiAoMCk7Cit9CisKK3ZvaWQKK3hmc19xbV92b3BfZHFhdHRhY2hfYW5kX2RxbW9kX25ld2lub2RlKAorCXhmc190cmFuc190CSp0cCwKKwl4ZnNfaW5vZGVfdAkqaXAsCisJeGZzX2RxdW90X3QJKnVkcXAsCisJeGZzX2RxdW90X3QJKmdkcXApCit7CisJaWYgKCFYRlNfSVNfUVVPVEFfT04odHAtPnRfbW91bnRwKSkKKwkJcmV0dXJuOworCisJQVNTRVJUKFhGU19JU0xPQ0tFRF9JTk9ERV9FWENMKGlwKSk7CisJQVNTRVJUKFhGU19JU19RVU9UQV9SVU5OSU5HKHRwLT50X21vdW50cCkpOworCisJaWYgKHVkcXApIHsKKwkJeGZzX2RxbG9jayh1ZHFwKTsKKwkJWEZTX0RRSE9MRCh1ZHFwKTsKKwkJeGZzX2RxdW5sb2NrKHVkcXApOworCQlBU1NFUlQoaXAtPmlfdWRxdW90ID09IE5VTEwpOworCQlpcC0+aV91ZHF1b3QgPSB1ZHFwOworCQlBU1NFUlQoaXAtPmlfZC5kaV91aWQgPT0gSU5UX0dFVCh1ZHFwLT5xX2NvcmUuZF9pZCwgQVJDSF9DT05WRVJUKSk7CisJCXhmc190cmFuc19tb2RfZHF1b3QodHAsIHVkcXAsIFhGU19UUkFOU19EUV9JQ09VTlQsIDEpOworCX0KKwlpZiAoZ2RxcCkgeworCQl4ZnNfZHFsb2NrKGdkcXApOworCQlYRlNfRFFIT0xEKGdkcXApOworCQl4ZnNfZHF1bmxvY2soZ2RxcCk7CisJCUFTU0VSVChpcC0+aV9nZHF1b3QgPT0gTlVMTCk7CisJCWlwLT5pX2dkcXVvdCA9IGdkcXA7CisJCUFTU0VSVChpcC0+aV9kLmRpX2dpZCA9PSBJTlRfR0VUKGdkcXAtPnFfY29yZS5kX2lkLCBBUkNIX0NPTlZFUlQpKTsKKwkJeGZzX3RyYW5zX21vZF9kcXVvdCh0cCwgZ2RxcCwgWEZTX1RSQU5TX0RRX0lDT1VOVCwgMSk7CisJfQorfQorCisvKiAtLS0tLS0tLS0tLS0tIGxpc3Qgc3R1ZmYgLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZAoreGZzX3FtX2ZyZWVsaXN0X2luaXQoeGZzX2ZybGlzdF90ICpxbCkKK3sKKwlxbC0+cWhfbmV4dCA9IHFsLT5xaF9wcmV2ID0gKHhmc19kcXVvdF90ICopIHFsOworCW11dGV4X2luaXQoJnFsLT5xaF9sb2NrLCBNVVRFWF9ERUZBVUxULCAiZHFmIik7CisJcWwtPnFoX3ZlcnNpb24gPSAwOworCXFsLT5xaF9uZWxlbXMgPSAwOworfQorCit2b2lkCit4ZnNfcW1fZnJlZWxpc3RfZGVzdHJveSh4ZnNfZnJsaXN0X3QgKnFsKQoreworCXhmc19kcXVvdF90CSpkcXAsICpuZXh0ZHFwOworCisJbXV0ZXhfbG9jaygmcWwtPnFoX2xvY2ssIFBJTk9EKTsKKwlmb3IgKGRxcCA9IHFsLT5xaF9uZXh0OworCSAgICAgZHFwICE9ICh4ZnNfZHF1b3RfdCAqKXFsOyApIHsKKwkJeGZzX2RxbG9jayhkcXApOworCQluZXh0ZHFwID0gZHFwLT5kcV9mbG5leHQ7CisjaWZkZWYgUVVPVEFERUJVRworCQljbW5fZXJyKENFX0RFQlVHLCAiRlJFRUxJU1QgZGVzdHJveSAweCVwIiwgZHFwKTsKKyNlbmRpZgorCQlYUU1fRlJFRUxJU1RfUkVNT1ZFKGRxcCk7CisJCXhmc19kcXVubG9jayhkcXApOworCQl4ZnNfcW1fZHFkZXN0cm95KGRxcCk7CisJCWRxcCA9IG5leHRkcXA7CisJfQorCS8qCisJICogRG9uJ3QgYm90aGVyIGFib3V0IHVubG9ja2luZy4KKwkgKi8KKwltdXRleF9kZXN0cm95KCZxbC0+cWhfbG9jayk7CisKKwlBU1NFUlQocWwtPnFoX25lbGVtcyA9PSAwKTsKK30KKwordm9pZAoreGZzX3FtX2ZyZWVsaXN0X2luc2VydCh4ZnNfZnJsaXN0X3QgKnFsLCB4ZnNfZHF1b3RfdCAqZHEpCit7CisJZHEtPmRxX2ZsbmV4dCA9IHFsLT5xaF9uZXh0OworCWRxLT5kcV9mbHByZXYgPSAoeGZzX2RxdW90X3QgKilxbDsKKwlxbC0+cWhfbmV4dCA9IGRxOworCWRxLT5kcV9mbG5leHQtPmRxX2ZscHJldiA9IGRxOworCXhmc19HcW0tPnFtX2RxZnJlZWxpc3QucWhfbmVsZW1zKys7CisJeGZzX0dxbS0+cW1fZHFmcmVlbGlzdC5xaF92ZXJzaW9uKys7Cit9CisKK3ZvaWQKK3hmc19xbV9mcmVlbGlzdF91bmxpbmsoeGZzX2RxdW90X3QgKmRxKQoreworCXhmc19kcXVvdF90ICpuZXh0ID0gZHEtPmRxX2ZsbmV4dDsKKwl4ZnNfZHF1b3RfdCAqcHJldiA9IGRxLT5kcV9mbHByZXY7CisKKwluZXh0LT5kcV9mbHByZXYgPSBwcmV2OworCXByZXYtPmRxX2ZsbmV4dCA9IG5leHQ7CisJZHEtPmRxX2ZsbmV4dCA9IGRxLT5kcV9mbHByZXYgPSBkcTsKKwl4ZnNfR3FtLT5xbV9kcWZyZWVsaXN0LnFoX25lbGVtcy0tOworCXhmc19HcW0tPnFtX2RxZnJlZWxpc3QucWhfdmVyc2lvbisrOworfQorCit2b2lkCit4ZnNfcW1fZnJlZWxpc3RfYXBwZW5kKHhmc19mcmxpc3RfdCAqcWwsIHhmc19kcXVvdF90ICpkcSkKK3sKKwl4ZnNfcW1fZnJlZWxpc3RfaW5zZXJ0KCh4ZnNfZnJsaXN0X3QgKilxbC0+cWhfcHJldiwgZHEpOworfQorCitpbnQKK3hmc19xbV9kcWhhc2hsb2NrX25vd2FpdCgKKwl4ZnNfZHF1b3RfdCAqZHFwKQoreworCWludCBsb2NrZWQ7CisKKwlsb2NrZWQgPSBtdXRleF90cnlsb2NrKCYoKGRxcCktPnFfaGFzaC0+cWhfbG9jaykpOworCXJldHVybiAobG9ja2VkKTsKK30KKworaW50Cit4ZnNfcW1fZnJlZWxpc3RfbG9ja19ub3dhaXQoCisJeGZzX3FtX3QgKnhxbSkKK3sKKwlpbnQgbG9ja2VkOworCisJbG9ja2VkID0gbXV0ZXhfdHJ5bG9jaygmKHhxbS0+cW1fZHFmcmVlbGlzdC5xaF9sb2NrKSk7CisJcmV0dXJuIChsb2NrZWQpOworfQorCitpbnQKK3hmc19xbV9tcGxpc3Rfbm93YWl0KAorCXhmc19tb3VudF90CSptcCkKK3sKKwlpbnQgbG9ja2VkOworCisJQVNTRVJUKG1wLT5tX3F1b3RhaW5mbyk7CisJbG9ja2VkID0gbXV0ZXhfdHJ5bG9jaygmKFhGU19RSV9NUExMT0NLKG1wKSkpOworCXJldHVybiAobG9ja2VkKTsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy9xdW90YS94ZnNfcW0uaCBiL2ZzL3hmcy9xdW90YS94ZnNfcW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2YxYTdhCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3F1b3RhL3hmc19xbS5oCkBAIC0wLDAgKzEsMjM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLgkgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19RTV9IX18KKyNkZWZpbmUgX19YRlNfUU1fSF9fCisKKyNpbmNsdWRlICJ4ZnNfZHF1b3RfaXRlbS5oIgorI2luY2x1ZGUgInhmc19kcXVvdC5oIgorI2luY2x1ZGUgInhmc19xdW90YV9wcml2LmgiCisjaW5jbHVkZSAieGZzX3FtX3N0YXRzLmgiCisKK3N0cnVjdCB4ZnNfcW07CitzdHJ1Y3QgeGZzX2lub2RlOworCitleHRlcm4gbXV0ZXhfdAkJeGZzX0dxbV9sb2NrOworZXh0ZXJuIHN0cnVjdCB4ZnNfcW0JKnhmc19HcW07CitleHRlcm4ga21lbV96b25lX3QJKnFtX2Rxem9uZTsKK2V4dGVybiBrbWVtX3pvbmVfdAkqcW1fZHF0cnh6b25lOworCisvKgorICogVXNlZCBpbiB4ZnNfcW1fc3luYyBjYWxsZWQgYnkgeGZzX3N5bmMgdG8gY291bnQgdGhlIG1heCB0aW1lcyB0aGF0IGl0IGNhbgorICogaXRlcmF0ZSBvdmVyIHRoZSBtb3VudHB0J3MgZHF1b3QgbGlzdCBpbiBvbmUgY2FsbC4KKyAqLworI2RlZmluZSBYRlNfUU1fU1lOQ19NQVhfUkVTVEFSVFMJNworCisvKgorICogRGl0dG8sIGZvciB4ZnNfcW1fZHFyZWNsYWltX29uZS4KKyAqLworI2RlZmluZSBYRlNfUU1fUkVDTEFJTV9NQVhfUkVTVEFSVFMJNAorCisvKgorICogSWRlYWwgcmF0aW8gb2YgZnJlZSB0byBpbiB1c2UgZHF1b3RzLiBRdW90YSBtYW5hZ2VyIG1ha2VzIGFuIGF0dGVtcHQKKyAqIHRvIGtlZXAgdGhpcyBiYWxhbmNlLgorICovCisjZGVmaW5lIFhGU19RTV9EUUZSRUVfUkFUSU8JCTIKKworLyoKKyAqIERxdW90IGhhc2h0YWJsZSBjb25zdGFudHMvdGhyZXNob2xkIHZhbHVlcy4KKyAqLworI2RlZmluZSBYRlNfUU1fTkNTSVpFX1RIUkVTSE9MRAkJNTAwMAorI2RlZmluZSBYRlNfUU1fSEFTSFNJWkVfTE9XCQkzMgorI2RlZmluZSBYRlNfUU1fSEFTSFNJWkVfSElHSAkJNjQKKworLyoKKyAqIFdlIG91dHB1dCBhIGNtbl9lcnIgd2hlbiBxdW90YWNoZWNraW5nIGEgcXVvdGEgZmlsZSB3aXRoIG1vcmUgdGhhbgorICogdGhpcyBtYW55IGZzYnMuCisgKi8KKyNkZWZpbmUgWEZTX1FNX0JJR19RQ0hFQ0tfTkJMS1MJCTUwMAorCisvKgorICogVGhpcyBkZWZpbmVzIHRoZSB1bml0IG9mIGFsbG9jYXRpb24gb2YgZHF1b3RzLgorICogQ3VycmVudGx5LCBpdCBpcyBqdXN0IG9uZSBmaWxlIHN5c3RlbSBibG9jaywgYW5kIGEgNEsgYmxrIGNvbnRhaW5zIDMwCisgKiAoMTM2ICogMzAgPSA0MDgwKSBkcXVvdHMuIEl0J3MgcHJvYmFibHkgbm90IHdvcnRoIHRyeWluZyB0byBtYWtlCisgKiB0aGlzIG1vcmUgZHluYW1pYy4KKyAqIFhYWHN1cCBIb3dldmVyLCBpZiB0aGlzIG51bWJlciBpcyBjaGFuZ2VkLCB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0CisgKiBpbXBsaWNpdGx5IGFzc3VtZSB0aGF0IHdlIGRvIGFsbG9jYXRpb25zIGluIGNodW5rcyBvZiBhIHNpbmdsZSBmaWxlc3lzdGVtCisgKiBibG9jayBpbiB0aGUgZHF1b3QveHFtIGNvZGUuCisgKi8KKyNkZWZpbmUgWEZTX0RRVU9UX0NMVVNURVJfU0laRV9GU0IJKHhmc19maWxibGtzX3QpMQorLyoKKyAqIFdoZW4gZG9pbmcgYSBxdW90YWNoZWNrLCB3ZSBsb2cgZHF1b3QgY2x1c3RlcnMgb2YgdGhpcyBtYW55IEZTQnMgYXQgbW9zdAorICogaW4gYSBzaW5nbGUgdHJhbnNhY3Rpb24uIFdlIGRvbid0IHdhbnQgdG8gYXNrIGZvciB0b28gaHVnZSBhIGxvZyByZXNlcnZhdGlvbi4KKyAqLworI2RlZmluZSBYRlNfUU1fTUFYX0RRQ0xVU1RFUl9MT0dTWgkzCisKK3R5cGVkZWYgeGZzX2RxaGFzaF90CXhmc19kcWxpc3RfdDsKKy8qCisgKiBUaGUgZnJlZWxpc3QgaGVhZC4gVGhlIGZpcnN0IHR3byBmaWVsZHMgbWF0Y2ggdGhlIGZpcnN0IHR3byBpbiB0aGUKKyAqIHhmc19kcXVvdF90IHN0cnVjdHVyZSAoaW4geGZzX2RxbWFya2VyX3QpCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19mcmxpc3QgeworICAgICAgIHN0cnVjdCB4ZnNfZHF1b3QgKnFoX25leHQ7CisgICAgICAgc3RydWN0IHhmc19kcXVvdCAqcWhfcHJldjsKKyAgICAgICBtdXRleF90CQkgcWhfbG9jazsKKyAgICAgICB1aW50CQkgcWhfdmVyc2lvbjsKKyAgICAgICB1aW50CQkgcWhfbmVsZW1zOworfSB4ZnNfZnJsaXN0X3Q7CisKKy8qCisgKiBRdW90YSBNYW5hZ2VyIChnbG9iYWwpIHN0cnVjdHVyZS4gTGl2ZXMgb25seSBpbiBjb3JlLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfcW0geworCXhmc19kcWxpc3RfdAkqcW1fdXNyX2RxaHRhYmxlOy8qIHVkcXVvdCBoYXNoIHRhYmxlICovCisJeGZzX2RxbGlzdF90CSpxbV9ncnBfZHFodGFibGU7LyogZ2RxdW90IGhhc2ggdGFibGUgKi8KKwl1aW50CQkgcW1fZHFoYXNobWFzazsJIC8qICMgYnVja2V0cyBpbiBkcSBoYXNodGFiIC0gMSAqLworCXhmc19mcmxpc3RfdAkgcW1fZHFmcmVlbGlzdDsJIC8qIGZyZWVsaXN0IG9mIGRxdW90cyAqLworCWF0b21pY190CSBxbV90b3RhbGRxdW90czsgLyogdG90YWwgaW5jb3JlIGRxdW90cyAqLworCXVpbnQJCSBxbV9ucmVmczsJIC8qIGZpbGUgc3lzdGVtcyB3aXRoIHF1b3RhIG9uICovCisJaW50CQkgcW1fZHFmcmVlX3JhdGlvOy8qIHJhdGlvIG9mIGZyZWUgdG8gaW51c2UgZHF1b3RzICovCisJa21lbV96b25lX3QJKnFtX2Rxem9uZTsJIC8qIGRxdW90IG1lbS1hbGxvYyB6b25lICovCisJa21lbV96b25lX3QJKnFtX2RxdHJ4em9uZTsJIC8qIHRfZHFpbmZvIG9mIHRyYW5zYWN0aW9ucyAqLworfSB4ZnNfcW1fdDsKKworLyoKKyAqIFZhcmlvdXMgcXVvdGEgaW5mb3JtYXRpb24gZm9yIGluZGl2aWR1YWwgZmlsZXN5c3RlbXMuCisgKiBUaGUgbW91bnQgc3RydWN0dXJlIGtlZXBzIGEgcG9pbnRlciB0byB0aGlzLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfcXVvdGFpbmZvIHsKKwl4ZnNfaW5vZGVfdAkqcWlfdXF1b3RhaXA7CSAvKiB1c2VyIHF1b3RhIGlub2RlICovCisJeGZzX2lub2RlX3QJKnFpX2dxdW90YWlwOwkgLyogZ3JvdXAgcXVvdGEgaW5vZGUgKi8KKwlsb2NrX3QJCSBxaV9waW5sb2NrOwkgLyogZHF1b3QgcGlubmluZyBtdXRleCAqLworCXhmc19kcWxpc3RfdAkgcWlfZHFsaXN0OwkgLyogYWxsIGRxdW90cyBpbiBmaWxlc3lzICovCisJaW50CQkgcWlfZHFyZWNsYWltczsJIC8qIGEgY2hhbmdlIGhlcmUgaW5kaWNhdGVzCisJCQkJCSAgICBhIHJlbW92YWwgaW4gdGhlIGRxbGlzdCAqLworCXRpbWVfdAkJIHFpX2J0aW1lbGltaXQ7CSAvKiBsaW1pdCBmb3IgYmxrcyB0aW1lciAqLworCXRpbWVfdAkJIHFpX2l0aW1lbGltaXQ7CSAvKiBsaW1pdCBmb3IgaW5vZGVzIHRpbWVyICovCisJdGltZV90CQkgcWlfcnRidGltZWxpbWl0Oy8qIGxpbWl0IGZvciBydCBibGtzIHRpbWVyICovCisJeGZzX3F3YXJuY250X3QJIHFpX2J3YXJubGltaXQ7CSAvKiBsaW1pdCBmb3IgbnVtIHdhcm5pbmdzICovCisJeGZzX3F3YXJuY250X3QJIHFpX2l3YXJubGltaXQ7CSAvKiBsaW1pdCBmb3IgbnVtIHdhcm5pbmdzICovCisJbXV0ZXhfdAkJIHFpX3F1b3Rhb2ZmbG9jazsvKiB0byBzZXJpYWxpemUgcXVvdGFvZmYgKi8KKwl4ZnNfZmlsYmxrc190CSBxaV9kcWNodW5rbGVuOwkgLyogIyBCQnMgaW4gYSBjaHVuayBvZiBkcXMgKi8KKwl1aW50CQkgcWlfZHFwZXJjaHVuazsJIC8qICMgb25kaXNrIGRxcyBpbiBhYm92ZSBjaHVuayAqLworCXhmc19xY250X3QJIHFpX2JoYXJkbGltaXQ7CSAvKiBkZWZhdWx0IGRhdGEgYmxrIGhhcmQgbGltaXQgKi8KKwl4ZnNfcWNudF90CSBxaV9ic29mdGxpbWl0OwkgLyogZGVmYXVsdCBkYXRhIGJsayBzb2Z0IGxpbWl0ICovCisJeGZzX3FjbnRfdAkgcWlfaWhhcmRsaW1pdDsJIC8qIGRlZmF1bHQgaW5vZGUgY291bnQgaGFyZCBsaW1pdCAqLworCXhmc19xY250X3QJIHFpX2lzb2Z0bGltaXQ7CSAvKiBkZWZhdWx0IGlub2RlIGNvdW50IHNvZnQgbGltaXQgKi8KKwl4ZnNfcWNudF90CSBxaV9ydGJoYXJkbGltaXQ7LyogZGVmYXVsdCByZWFsdGltZSBibGsgaGFyZCBsaW1pdCAqLworCXhmc19xY250X3QJIHFpX3J0YnNvZnRsaW1pdDsvKiBkZWZhdWx0IHJlYWx0aW1lIGJsayBzb2Z0IGxpbWl0ICovCit9IHhmc19xdW90YWluZm9fdDsKKworCitleHRlcm4geGZzX2RxdHJ4b3BzX3QJeGZzX3RyYW5zX2RxdW90X29wczsKKworZXh0ZXJuIHZvaWQJeGZzX3RyYW5zX21vZF9kcXVvdCh4ZnNfdHJhbnNfdCAqLCB4ZnNfZHF1b3RfdCAqLCB1aW50LCBsb25nKTsKK2V4dGVybiBpbnQJeGZzX3RyYW5zX3Jlc2VydmVfcXVvdGFfYnlkcXVvdHMoeGZzX3RyYW5zX3QgKiwgeGZzX21vdW50X3QgKiwKKwkJCXhmc19kcXVvdF90ICosIHhmc19kcXVvdF90ICosIGxvbmcsIGxvbmcsIHVpbnQpOworZXh0ZXJuIHZvaWQJeGZzX3RyYW5zX2Rxam9pbih4ZnNfdHJhbnNfdCAqLCB4ZnNfZHF1b3RfdCAqKTsKK2V4dGVybiB2b2lkCXhmc190cmFuc19sb2dfZHF1b3QoeGZzX3RyYW5zX3QgKiwgeGZzX2RxdW90X3QgKik7CisKKy8qCisgKiBXZSBrZWVwIHRoZSB1c3IgYW5kIGdycCBkcXVvdHMgc2VwYXJhdGVseSBzbyB0aGF0IGxvY2tpbmcgd2lsbCBiZSBlYXNpZXIKKyAqIHRvIGRvIGF0IGNvbW1pdCB0aW1lLiBBbGwgdHJhbnNhY3Rpb25zIHRoYXQgd2Uga25vdyBvZiBhdCB0aGlzIHBvaW50CisgKiBhZmZlY3Qgbm8gbW9yZSB0aGFuIHR3byBkcXVvdHMgb2Ygb25lIHR5cGUuIEhlbmNlLCB0aGUgVFJBTlNfTUFYRFFTIHZhbHVlLgorICovCisjZGVmaW5lIFhGU19RTV9UUkFOU19NQVhEUVMJCTIKK3R5cGVkZWYgc3RydWN0IHhmc19kcXVvdF9hY2N0IHsKKwl4ZnNfZHF0cnhfdAlkcWFfdXNyZHF1b3RzW1hGU19RTV9UUkFOU19NQVhEUVNdOworCXhmc19kcXRyeF90CWRxYV9ncnBkcXVvdHNbWEZTX1FNX1RSQU5TX01BWERRU107Cit9IHhmc19kcXVvdF9hY2N0X3Q7CisKKy8qCisgKiBVc2VycyBhcmUgYWxsb3dlZCB0byBoYXZlIGEgdXNhZ2UgZXhjZWVkaW5nIHRoZWlyIHNvZnRsaW1pdCBmb3IKKyAqIGEgcGVyaW9kIHRoaXMgbG9uZy4KKyAqLworI2RlZmluZSBYRlNfUU1fQlRJTUVMSU1JVAkoNyAqIDI0KjYwKjYwKSAgICAgICAgICAvKiAxIHdlZWsgKi8KKyNkZWZpbmUgWEZTX1FNX1JUQlRJTUVMSU1JVAkoNyAqIDI0KjYwKjYwKSAgICAgICAgICAvKiAxIHdlZWsgKi8KKyNkZWZpbmUgWEZTX1FNX0lUSU1FTElNSVQJKDcgKiAyNCo2MCo2MCkgICAgICAgICAgLyogMSB3ZWVrICovCisKKyNkZWZpbmUgWEZTX1FNX0JXQVJOTElNSVQJNQorI2RlZmluZSBYRlNfUU1fSVdBUk5MSU1JVAk1CisKKyNkZWZpbmUgWEZTX1FNX0xPQ0soeHFtKQkobXV0ZXhfbG9jaygmeHFtIyNfbG9jaywgUElOT0QpKQorI2RlZmluZSBYRlNfUU1fVU5MT0NLKHhxbSkJKG11dGV4X3VubG9jaygmeHFtIyNfbG9jaykpCisjZGVmaW5lIFhGU19RTV9IT0xEKHhxbSkJKCh4cW0pLT5xbV9ucmVmcysrKQorI2RlZmluZSBYRlNfUU1fUkVMRSh4cW0pCSgoeHFtKS0+cW1fbnJlZnMtLSkKKworZXh0ZXJuIHZvaWQJCXhmc19tb3VudF9yZXNldF9zYnFmbGFncyh4ZnNfbW91bnRfdCAqKTsKKworZXh0ZXJuIGludAkJeGZzX3FtX2luaXRfcXVvdGFpbmZvKHhmc19tb3VudF90ICopOworZXh0ZXJuIHZvaWQJCXhmc19xbV9kZXN0cm95X3F1b3RhaW5mbyh4ZnNfbW91bnRfdCAqKTsKK2V4dGVybiBpbnQJCXhmc19xbV9tb3VudF9xdW90YXMoeGZzX21vdW50X3QgKiwgaW50KTsKK2V4dGVybiB2b2lkCQl4ZnNfcW1fbW91bnRfcXVvdGFpbml0KHhmc19tb3VudF90ICosIHVpbnQpOworZXh0ZXJuIGludAkJeGZzX3FtX3F1b3RhY2hlY2soeGZzX21vdW50X3QgKik7CitleHRlcm4gdm9pZAkJeGZzX3FtX3VubW91bnRfcXVvdGFkZXN0cm95KHhmc19tb3VudF90ICopOworZXh0ZXJuIGludAkJeGZzX3FtX3VubW91bnRfcXVvdGFzKHhmc19tb3VudF90ICopOworZXh0ZXJuIGludAkJeGZzX3FtX3dyaXRlX3NiX2NoYW5nZXMoeGZzX21vdW50X3QgKiwgX19pbnQ2NF90KTsKK2V4dGVybiBpbnQJCXhmc19xbV9zeW5jKHhmc19tb3VudF90ICosIHNob3J0KTsKKworLyogZHF1b3Qgc3R1ZmYgKi8KK2V4dGVybiBib29sZWFuX3QJeGZzX3FtX2RxYWxsb2NfaW5jb3JlKHhmc19kcXVvdF90ICoqKTsKK2V4dGVybiBpbnQJCXhmc19xbV9kcWF0dGFjaCh4ZnNfaW5vZGVfdCAqLCB1aW50KTsKK2V4dGVybiB2b2lkCQl4ZnNfcW1fZHFkZXRhY2goeGZzX2lub2RlX3QgKik7CitleHRlcm4gaW50CQl4ZnNfcW1fZHFwdXJnZV9hbGwoeGZzX21vdW50X3QgKiwgdWludCk7CitleHRlcm4gdm9pZAkJeGZzX3FtX2RxcmVsZV9hbGxfaW5vZGVzKHhmc19tb3VudF90ICosIHVpbnQpOworCisvKiB2b3Agc3R1ZmYgKi8KK2V4dGVybiBpbnQJCXhmc19xbV92b3BfZHFhbGxvYyh4ZnNfbW91bnRfdCAqLCB4ZnNfaW5vZGVfdCAqLAorCQkJCQl1aWRfdCwgZ2lkX3QsIHVpbnQsCisJCQkJCXhmc19kcXVvdF90ICoqLCB4ZnNfZHF1b3RfdCAqKik7CitleHRlcm4gdm9pZAkJeGZzX3FtX3ZvcF9kcWF0dGFjaF9hbmRfZHFtb2RfbmV3aW5vZGUoCisJCQkJCXhmc190cmFuc190ICosIHhmc19pbm9kZV90ICosCisJCQkJCXhmc19kcXVvdF90ICosIHhmc19kcXVvdF90ICopOworZXh0ZXJuIGludAkJeGZzX3FtX3ZvcF9yZW5hbWVfZHFhdHRhY2goeGZzX2lub2RlX3QgKiopOworZXh0ZXJuIHhmc19kcXVvdF90ICoJeGZzX3FtX3ZvcF9jaG93bih4ZnNfdHJhbnNfdCAqLCB4ZnNfaW5vZGVfdCAqLAorCQkJCQl4ZnNfZHF1b3RfdCAqKiwgeGZzX2RxdW90X3QgKik7CitleHRlcm4gaW50CQl4ZnNfcW1fdm9wX2Nob3duX3Jlc2VydmUoeGZzX3RyYW5zX3QgKiwgeGZzX2lub2RlX3QgKiwKKwkJCQkJeGZzX2RxdW90X3QgKiwgeGZzX2RxdW90X3QgKiwgdWludCk7CisKKy8qIGxpc3Qgc3R1ZmYgKi8KK2V4dGVybiB2b2lkCQl4ZnNfcW1fZnJlZWxpc3RfaW5pdCh4ZnNfZnJsaXN0X3QgKik7CitleHRlcm4gdm9pZAkJeGZzX3FtX2ZyZWVsaXN0X2Rlc3Ryb3koeGZzX2ZybGlzdF90ICopOworZXh0ZXJuIHZvaWQJCXhmc19xbV9mcmVlbGlzdF9pbnNlcnQoeGZzX2ZybGlzdF90ICosIHhmc19kcXVvdF90ICopOworZXh0ZXJuIHZvaWQJCXhmc19xbV9mcmVlbGlzdF9hcHBlbmQoeGZzX2ZybGlzdF90ICosIHhmc19kcXVvdF90ICopOworZXh0ZXJuIHZvaWQJCXhmc19xbV9mcmVlbGlzdF91bmxpbmsoeGZzX2RxdW90X3QgKik7CitleHRlcm4gaW50CQl4ZnNfcW1fZnJlZWxpc3RfbG9ja19ub3dhaXQoeGZzX3FtX3QgKik7CitleHRlcm4gaW50CQl4ZnNfcW1fbXBsaXN0X25vd2FpdCh4ZnNfbW91bnRfdCAqKTsKK2V4dGVybiBpbnQJCXhmc19xbV9kcWhhc2hsb2NrX25vd2FpdCh4ZnNfZHF1b3RfdCAqKTsKKworLyogc3lzdGVtIGNhbGwgaW50ZXJmYWNlICovCitleHRlcm4gaW50CQl4ZnNfcW1fcXVvdGFjdGwoYmh2X2Rlc2NfdCAqLCBpbnQsIGludCwgeGZzX2NhZGRyX3QpOworCisjaWZkZWYgREVCVUcKK2V4dGVybiBpbnQJCXhmc19xbV9pbnRlcm5hbHFjaGVjayh4ZnNfbW91bnRfdCAqKTsKKyNlbHNlCisjZGVmaW5lIHhmc19xbV9pbnRlcm5hbHFjaGVjayhtcCkJKDApCisjZW5kaWYKKworI2VuZGlmIC8qIF9fWEZTX1FNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc19xbV9iaHYuYyBiL2ZzL3hmcy9xdW90YS94ZnNfcW1fYmh2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU2N2Q5YwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9xdW90YS94ZnNfcW1fYmh2LmMKQEAgLTAsMCArMSw0MTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuCSBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKyNpbmNsdWRlICJ4ZnNfZnMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfY2xudC5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc19hbGxvYy5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19xdW90YS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcC5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKKyNpbmNsdWRlICJ4ZnNfcnRhbGxvYy5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorI2luY2x1ZGUgInhmc19pdGFibGUuaCIKKyNpbmNsdWRlICJ4ZnNfcncuaCIKKyNpbmNsdWRlICJ4ZnNfYWNsLmgiCisjaW5jbHVkZSAieGZzX2NhcC5oIgorI2luY2x1ZGUgInhmc19tYWMuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0ci5oIgorI2luY2x1ZGUgInhmc19idWZfaXRlbS5oIgorCisjaW5jbHVkZSAieGZzX3FtLmgiCisKKyNkZWZpbmUgTU5UT1BUX1FVT1RBCSJxdW90YSIJCS8qIGRpc2sgcXVvdGFzICh1c2VyKSAqLworI2RlZmluZSBNTlRPUFRfTk9RVU9UQQkibm9xdW90YSIJLyogbm8gcXVvdGFzICovCisjZGVmaW5lIE1OVE9QVF9VU1JRVU9UQQkidXNycXVvdGEiCS8qIHVzZXIgcXVvdGEgZW5hYmxlZCAqLworI2RlZmluZSBNTlRPUFRfR1JQUVVPVEEJImdycHF1b3RhIgkvKiBncm91cCBxdW90YSBlbmFibGVkICovCisjZGVmaW5lIE1OVE9QVF9VUVVPVEEJInVxdW90YSIJLyogdXNlciBxdW90YSAoSVJJWCB2YXJpYW50KSAqLworI2RlZmluZSBNTlRPUFRfR1FVT1RBCSJncXVvdGEiCS8qIGdyb3VwIHF1b3RhIChJUklYIHZhcmlhbnQpICovCisjZGVmaW5lIE1OVE9QVF9VUVVPVEFOT0VORiAidXFub2VuZm9yY2UiLyogdXNlciBxdW90YSBsaW1pdCBlbmZvcmNlbWVudCAqLworI2RlZmluZSBNTlRPUFRfR1FVT1RBTk9FTkYgImdxbm9lbmZvcmNlIi8qIGdyb3VwIHF1b3RhIGxpbWl0IGVuZm9yY2VtZW50ICovCisjZGVmaW5lIE1OVE9QVF9RVU9UQU5PRU5GICAicW5vZW5mb3JjZSIJLyogc2FtZSBhcyB1cW5vZW5mb3JjZSAqLworCitTVEFUSUMgaW50Cit4ZnNfcW1fcGFyc2VhcmdzKAorCXN0cnVjdCBiaHZfZGVzYwkJKmJodiwKKwljaGFyCQkJKm9wdGlvbnMsCisJc3RydWN0IHhmc19tb3VudF9hcmdzCSphcmdzLAorCWludAkJCXVwZGF0ZSkKK3sKKwlzaXplX3QJCQlsZW5ndGg7CisJY2hhcgkJCSpsb2NhbF9vcHRpb25zID0gb3B0aW9uczsKKwljaGFyCQkJKnRoaXNfY2hhcjsKKwlpbnQJCQllcnJvcjsKKwlpbnQJCQlyZWZlcmVuY2VkID0gdXBkYXRlOworCisJd2hpbGUgKCh0aGlzX2NoYXIgPSBzdHJzZXAoJmxvY2FsX29wdGlvbnMsICIsIikpICE9IE5VTEwpIHsKKwkJbGVuZ3RoID0gc3RybGVuKHRoaXNfY2hhcik7CisJCWlmIChsb2NhbF9vcHRpb25zKQorCQkJbGVuZ3RoKys7CisKKwkJaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfTk9RVU9UQSkpIHsKKwkJCWFyZ3MtPmZsYWdzICY9IH4oWEZTTU5UX1VRVU9UQUVORnxYRlNNTlRfVVFVT1RBKTsKKwkJCWFyZ3MtPmZsYWdzICY9IH4oWEZTTU5UX0dRVU9UQUVORnxYRlNNTlRfR1FVT1RBKTsKKwkJCXJlZmVyZW5jZWQgPSB1cGRhdGU7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9RVU9UQSkgfHwKKwkJCSAgICFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfVVFVT1RBKSB8fAorCQkJICAgIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9VU1JRVU9UQSkpIHsKKwkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9VUVVPVEEgfCBYRlNNTlRfVVFVT1RBRU5GOworCQkJcmVmZXJlbmNlZCA9IDE7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9RVU9UQU5PRU5GKSB8fAorCQkJICAgIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9VUVVPVEFOT0VORikpIHsKKwkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9VUVVPVEE7CisJCQlhcmdzLT5mbGFncyAmPSB+WEZTTU5UX1VRVU9UQUVORjsKKwkJCXJlZmVyZW5jZWQgPSAxOworCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfR1FVT1RBKSB8fAorCQkJICAgIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9HUlBRVU9UQSkpIHsKKwkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9HUVVPVEEgfCBYRlNNTlRfR1FVT1RBRU5GOworCQkJcmVmZXJlbmNlZCA9IDE7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9HUVVPVEFOT0VORikpIHsKKwkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9HUVVPVEE7CisJCQlhcmdzLT5mbGFncyAmPSB+WEZTTU5UX0dRVU9UQUVORjsKKwkJCXJlZmVyZW5jZWQgPSAxOworCQl9IGVsc2UgeworCQkJaWYgKGxvY2FsX29wdGlvbnMpCisJCQkJKihsb2NhbF9vcHRpb25zLTEpID0gJywnOworCQkJY29udGludWU7CisJCX0KKworCQl3aGlsZSAobGVuZ3RoLS0pCisJCQkqdGhpc19jaGFyKysgPSAnLCc7CisJfQorCisJUFZGU19QQVJTRUFSR1MoQkhWX05FWFQoYmh2KSwgb3B0aW9ucywgYXJncywgdXBkYXRlLCBlcnJvcik7CisJaWYgKCFlcnJvciAmJiAhcmVmZXJlbmNlZCkKKwkJYmh2X3JlbW92ZV92ZnNvcHMoYmh2dG92ZnMoYmh2KSwgVkZTX1BPU0lUSU9OX1FNKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK1NUQVRJQyBpbnQKK3hmc19xbV9zaG93YXJncygKKwlzdHJ1Y3QgYmh2X2Rlc2MJCSpiaHYsCisJc3RydWN0IHNlcV9maWxlCQkqbSkKK3sKKwlzdHJ1Y3QgdmZzCQkqdmZzcCA9IGJodnRvdmZzKGJodik7CisJc3RydWN0IHhmc19tb3VudAkqbXAgPSBYRlNfVkZTVE9NKHZmc3ApOworCWludAkJCWVycm9yOworCisJaWYgKG1wLT5tX3FmbGFncyAmIFhGU19VUVVPVEFfQUNDVCkgeworCQkobXAtPm1fcWZsYWdzICYgWEZTX1VRVU9UQV9FTkZEKSA/CisJCQlzZXFfcHV0cyhtLCAiLCIgTU5UT1BUX1VTUlFVT1RBKSA6CisJCQlzZXFfcHV0cyhtLCAiLCIgTU5UT1BUX1VRVU9UQU5PRU5GKTsKKwl9CisKKwlpZiAobXAtPm1fcWZsYWdzICYgWEZTX0dRVU9UQV9BQ0NUKSB7CisJCShtcC0+bV9xZmxhZ3MgJiBYRlNfR1FVT1RBX0VORkQpID8KKwkJCXNlcV9wdXRzKG0sICIsIiBNTlRPUFRfR1JQUVVPVEEpIDoKKwkJCXNlcV9wdXRzKG0sICIsIiBNTlRPUFRfR1FVT1RBTk9FTkYpOworCX0KKworCWlmICghKG1wLT5tX3FmbGFncyAmIChYRlNfVVFVT1RBX0FDQ1R8WEZTX0dRVU9UQV9BQ0NUKSkpCisJCXNlcV9wdXRzKG0sICIsIiBNTlRPUFRfTk9RVU9UQSk7CisKKwlQVkZTX1NIT1dBUkdTKEJIVl9ORVhUKGJodiksIG0sIGVycm9yKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK1NUQVRJQyBpbnQKK3hmc19xbV9tb3VudCgKKwlzdHJ1Y3QgYmh2X2Rlc2MJCSpiaHYsCisJc3RydWN0IHhmc19tb3VudF9hcmdzCSphcmdzLAorCXN0cnVjdCBjcmVkCQkqY3IpCit7CisJc3RydWN0IHZmcwkJKnZmc3AgPSBiaHZ0b3ZmcyhiaHYpOworCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gWEZTX1ZGU1RPTSh2ZnNwKTsKKwlpbnQJCQllcnJvcjsKKworCWlmIChhcmdzLT5mbGFncyAmIChYRlNNTlRfVVFVT1RBIHwgWEZTTU5UX0dRVU9UQSkpCisJCXhmc19xbV9tb3VudF9xdW90YWluaXQobXAsIGFyZ3MtPmZsYWdzKTsKKwlQVkZTX01PVU5UKEJIVl9ORVhUKGJodiksIGFyZ3MsIGNyLCBlcnJvcik7CisJcmV0dXJuIGVycm9yOworfQorCitTVEFUSUMgaW50Cit4ZnNfcW1fc3luY2FsbCgKKwlzdHJ1Y3QgYmh2X2Rlc2MJCSpiaHYsCisJaW50CQkJZmxhZ3MsCisJY3JlZF90CQkJKmNyZWRwKQoreworCXN0cnVjdCB2ZnMJCSp2ZnNwID0gYmh2dG92ZnMoYmh2KTsKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCA9IFhGU19WRlNUT00odmZzcCk7CisJaW50CQkJZXJyb3I7CisKKwkvKgorCSAqIEdldCB0aGUgUXVvdGEgTWFuYWdlciB0byBmbHVzaCB0aGUgZHF1b3RzLgorCSAqLworCWlmIChYRlNfSVNfUVVPVEFfT04obXApKSB7CisJCWlmICgoZXJyb3IgPSB4ZnNfcW1fc3luYyhtcCwgZmxhZ3MpKSkgeworCQkJLyoKKwkJCSAqIElmIHdlIGdvdCBhbiBJTyBlcnJvciwgd2Ugd2lsbCBiZSBzaHV0dGluZyBkb3duLgorCQkJICogU28sIHRoZXJlJ3Mgbm90aGluZyBtb3JlIGZvciB1cyB0byBkbyBoZXJlLgorCQkJICovCisJCQlBU1NFUlQoZXJyb3IgIT0gRUlPIHx8IFhGU19GT1JDRURfU0hVVERPV04obXApKTsKKwkJCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkgeworCQkJCXJldHVybiBYRlNfRVJST1IoZXJyb3IpOworCQkJfQorCQl9CisJfQorCVBWRlNfU1lOQyhCSFZfTkVYVChiaHYpLCBmbGFncywgY3JlZHAsIGVycm9yKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBDbGVhciB0aGUgcXVvdGFmbGFncyBpbiBtZW1vcnkgYW5kIGluIHRoZSBzdXBlcmJsb2NrLgorICovCit2b2lkCit4ZnNfbW91bnRfcmVzZXRfc2JxZmxhZ3MoCisJeGZzX21vdW50X3QJCSptcCkKK3sKKwl4ZnNfdHJhbnNfdAkJKnRwOworCXVuc2lnbmVkIGxvbmcJCXM7CisKKwltcC0+bV9xZmxhZ3MgPSAwOworCS8qCisJICogSXQgaXMgT0sgdG8gbG9vayBhdCBzYl9xZmxhZ3MgaGVyZSBpbiBtb3VudCBwYXRoLAorCSAqIHdpdGhvdXQgU0JfTE9DSy4KKwkgKi8KKwlpZiAobXAtPm1fc2Iuc2JfcWZsYWdzID09IDApCisJCXJldHVybjsKKwlzID0gWEZTX1NCX0xPQ0sobXApOworCW1wLT5tX3NiLnNiX3FmbGFncyA9IDA7CisJWEZTX1NCX1VOTE9DSyhtcCwgcyk7CisKKwkvKgorCSAqIGlmIHRoZSBmcyBpcyByZWFkb25seSwgbGV0IHRoZSBpbmNvcmUgc3VwZXJibG9jayBydW4KKwkgKiB3aXRoIHF1b3RhcyBvZmYgYnV0IGRvbid0IGZsdXNoIHRoZSB1cGRhdGUgb3V0IHRvIGRpc2sKKwkgKi8KKwlpZiAoWEZTX01UT1ZGUyhtcCktPnZmc19mbGFnICYgVkZTX1JET05MWSkKKwkJcmV0dXJuOworI2lmZGVmIFFVT1RBREVCVUcKKwl4ZnNfZnNfY21uX2VycihDRV9OT1RFLCBtcCwgIldyaXRpbmcgc3VwZXJibG9jayBxdW90YSBjaGFuZ2VzIik7CisjZW5kaWYKKwl0cCA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX1FNX1NCQ0hBTkdFKTsKKwlpZiAoeGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsIG1wLT5tX3NiLnNiX3NlY3RzaXplICsgMTI4LCAwLCAwLAorCQkJCSAgICAgIFhGU19ERUZBVUxUX0xPR19DT1VOVCkpIHsKKwkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgMCk7CisJCXhmc19mc19jbW5fZXJyKENFX0FMRVJULCBtcCwKKwkJCSJ4ZnNfbW91bnRfcmVzZXRfc2JxZmxhZ3M6IFN1cGVyYmxvY2sgdXBkYXRlIGZhaWxlZCEiKTsKKwkJcmV0dXJuOworCX0KKwl4ZnNfbW9kX3NiKHRwLCBYRlNfU0JfUUZMQUdTKTsKKwl4ZnNfdHJhbnNfY29tbWl0KHRwLCAwLCBOVUxMKTsKK30KKworU1RBVElDIGludAoreGZzX3FtX25ld21vdW50KAorCXhmc19tb3VudF90CSptcCwKKwl1aW50CQkqbmVlZHF1b3RhbW91bnQsCisJdWludAkJKnF1b3RhZmxhZ3MpCit7CisJdWludAkJcXVvdGFvbmRpc2s7CisJdWludAkJdXF1b3Rhb25kaXNrID0gMCwgZ3F1b3Rhb25kaXNrID0gMDsKKworCSpxdW90YWZsYWdzID0gMDsKKwkqbmVlZHF1b3RhbW91bnQgPSBCX0ZBTFNFOworCisJcXVvdGFvbmRpc2sgPSBYRlNfU0JfVkVSU0lPTl9IQVNRVU9UQSgmbXAtPm1fc2IpICYmCisJCW1wLT5tX3NiLnNiX3FmbGFncyAmIChYRlNfVVFVT1RBX0FDQ1R8WEZTX0dRVU9UQV9BQ0NUKTsKKworCWlmIChxdW90YW9uZGlzaykgeworCQl1cXVvdGFvbmRpc2sgPSBtcC0+bV9zYi5zYl9xZmxhZ3MgJiBYRlNfVVFVT1RBX0FDQ1Q7CisJCWdxdW90YW9uZGlzayA9IG1wLT5tX3NiLnNiX3FmbGFncyAmIFhGU19HUVVPVEFfQUNDVDsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBkZXZpY2UgaXRzZWxmIGlzIHJlYWQtb25seSwgd2UgY2FuJ3QgYWxsb3cKKwkgKiB0aGUgdXNlciB0byBjaGFuZ2UgdGhlIHN0YXRlIG9mIHF1b3RhIG9uIHRoZSBtb3VudCAtCisJICogdGhpcyB3b3VsZCBnZW5lcmF0ZSBhIHRyYW5zYWN0aW9uIG9uIHRoZSBybyBkZXZpY2UsCisJICogd2hpY2ggd291bGQgbGVhZCB0byBhbiBJL08gZXJyb3IgYW5kIHNodXRkb3duCisJICovCisKKwlpZiAoKCh1cXVvdGFvbmRpc2sgJiYgIVhGU19JU19VUVVPVEFfT04obXApKSB8fAorCSAgICAoIXVxdW90YW9uZGlzayAmJiAgWEZTX0lTX1VRVU9UQV9PTihtcCkpIHx8CisJICAgICAoZ3F1b3Rhb25kaXNrICYmICFYRlNfSVNfR1FVT1RBX09OKG1wKSkgfHwKKwkgICAgKCFncXVvdGFvbmRpc2sgJiYgIFhGU19JU19HUVVPVEFfT04obXApKSkgICYmCisJICAgIHhmc19kZXZfaXNfcmVhZF9vbmx5KG1wLCAiY2hhbmdpbmcgcXVvdGEgc3RhdGUiKSkgeworCQljbW5fZXJyKENFX1dBUk4sCisJCQkiWEZTOiBwbGVhc2UgbW91bnQgd2l0aCVzJXMlcy4iLAorCQkJKCFxdW90YW9uZGlzayA/ICJvdXQgcXVvdGEiIDogIiIpLAorCQkJKHVxdW90YW9uZGlzayA/ICIgdXNycXVvdGEiIDogIiIpLAorCQkJKGdxdW90YW9uZGlzayA/ICIgZ3JwcXVvdGEiIDogIiIpKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFUEVSTSk7CisJfQorCisJaWYgKFhGU19JU19RVU9UQV9PTihtcCkgfHwgcXVvdGFvbmRpc2spIHsKKwkJLyoKKwkJICogQ2FsbCBtb3VudF9xdW90YXMgYXQgdGhpcyBwb2ludCBvbmx5IGlmIHdlIHdvbid0IGhhdmUgdG8gZG8KKwkJICogYSBxdW90YWNoZWNrLgorCQkgKi8KKwkJaWYgKHF1b3Rhb25kaXNrICYmICFYRlNfUU1fTkVFRF9RVU9UQUNIRUNLKG1wKSkgeworCQkJLyoKKwkJCSAqIElmIGFuIGVycm9yIG9jY3VyZWQsIHFtX21vdW50X3F1b3RhcyBjb2RlCisJCQkgKiBoYXMgYWxyZWFkeSBkaXNhYmxlZCBxdW90YXMuIFNvLCBqdXN0IGZpbmlzaAorCQkJICogbW91bnRpbmcsIGFuZCBnZXQgb24gd2l0aCB0aGUgYm9yaW5nIGxpZmUKKwkJCSAqIHdpdGhvdXQgZGlzayBxdW90YXMuCisJCQkgKi8KKwkJCXhmc19xbV9tb3VudF9xdW90YXMobXAsIDApOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIENsZWFyIHRoZSBxdW90YSBmbGFncywgYnV0IHJlbWVtYmVyIHRoZW0uIFRoaXMKKwkJCSAqIGlzIHNvIHRoYXQgdGhlIHF1b3RhIGNvZGUgZG9lc24ndCBnZXQgaW52b2tlZAorCQkJICogYmVmb3JlIHdlJ3JlIHJlYWR5LiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBhbgorCQkJICogaW5vZGUgZ29lcyBpbmFjdGl2ZSBhbmQgd2FudHMgdG8gZnJlZSBibG9ja3MsCisJCQkgKiBvciB2aWEgeGZzX2xvZ19tb3VudF9maW5pc2guCisJCQkgKi8KKwkJCSpuZWVkcXVvdGFtb3VudCA9IEJfVFJVRTsKKwkJCSpxdW90YWZsYWdzID0gbXAtPm1fcWZsYWdzOworCQkJbXAtPm1fcWZsYWdzID0gMDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitTVEFUSUMgaW50Cit4ZnNfcW1fZW5kbW91bnQoCisJeGZzX21vdW50X3QJKm1wLAorCXVpbnQJCW5lZWRxdW90YW1vdW50LAorCXVpbnQJCXF1b3RhZmxhZ3MsCisJaW50CQltZnNpX2ZsYWdzKQoreworCWlmIChuZWVkcXVvdGFtb3VudCkgeworCQlBU1NFUlQobXAtPm1fcWZsYWdzID09IDApOworCQltcC0+bV9xZmxhZ3MgPSBxdW90YWZsYWdzOworCQl4ZnNfcW1fbW91bnRfcXVvdGFzKG1wLCBtZnNpX2ZsYWdzKTsKKwl9CisKKyNpZiBkZWZpbmVkKERFQlVHKSAmJiBkZWZpbmVkKFhGU19MT1VEX1JFQ09WRVJZKQorCWlmICghIChYRlNfSVNfUVVPVEFfT04obXApKSkKKwkJeGZzX2ZzX2Ntbl9lcnIoQ0VfTk9URSwgbXAsICJEaXNrIHF1b3RhcyBub3QgdHVybmVkIG9uIik7CisJZWxzZQorCQl4ZnNfZnNfY21uX2VycihDRV9OT1RFLCBtcCwgIkRpc2sgcXVvdGFzIHR1cm5lZCBvbiIpOworI2VuZGlmCisKKyNpZmRlZiBRVU9UQURFQlVHCisJaWYgKFhGU19JU19RVU9UQV9PTihtcCkgJiYgeGZzX3FtX2ludGVybmFscWNoZWNrKG1wKSkKKwkJY21uX2VycihDRV9XQVJOLCAiWEZTOiBtb3VudCBpbnRlcm5hbHFjaGVjayBmYWlsZWQiKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK1NUQVRJQyB2b2lkCit4ZnNfcW1fZHFyZWxlX251bGwoCisJeGZzX2RxdW90X3QJKmRxKQoreworCS8qCisJICogQ2FsbGVkIGZyb20gWEZTLCB3aGVyZSB3ZSBhbHdheXMgY2hlY2sgZmlyc3QgZm9yIGEgTlVMTCBkcXVvdC4KKwkgKi8KKwlpZiAoIWRxKQorCQlyZXR1cm47CisJeGZzX3FtX2RxcmVsZShkcSk7Cit9CisKKworc3RydWN0IHhmc19xbW9wcyB4ZnNfcW1jb3JlX3hmcyA9IHsKKwkueGZzX3FtaW5pdAkJPSB4ZnNfcW1fbmV3bW91bnQsCisJLnhmc19xbWRvbmUJCT0geGZzX3FtX3VubW91bnRfcXVvdGFkZXN0cm95LAorCS54ZnNfcW1tb3VudAkJPSB4ZnNfcW1fZW5kbW91bnQsCisJLnhmc19xbXVubW91bnQJCT0geGZzX3FtX3VubW91bnRfcXVvdGFzLAorCS54ZnNfZHFyZWxlCQk9IHhmc19xbV9kcXJlbGVfbnVsbCwKKwkueGZzX2RxYXR0YWNoCQk9IHhmc19xbV9kcWF0dGFjaCwKKwkueGZzX2RxZGV0YWNoCQk9IHhmc19xbV9kcWRldGFjaCwKKwkueGZzX2RxcHVyZ2VhbGwJCT0geGZzX3FtX2RxcHVyZ2VfYWxsLAorCS54ZnNfZHF2b3BhbGxvYwkJPSB4ZnNfcW1fdm9wX2RxYWxsb2MsCisJLnhmc19kcXZvcGNyZWF0ZQk9IHhmc19xbV92b3BfZHFhdHRhY2hfYW5kX2RxbW9kX25ld2lub2RlLAorCS54ZnNfZHF2b3ByZW5hbWUJPSB4ZnNfcW1fdm9wX3JlbmFtZV9kcWF0dGFjaCwKKwkueGZzX2Rxdm9wY2hvd24JCT0geGZzX3FtX3ZvcF9jaG93biwKKwkueGZzX2Rxdm9wY2hvd25yZXN2CT0geGZzX3FtX3ZvcF9jaG93bl9yZXNlcnZlLAorCS54ZnNfZHF0cnhvcHMJCT0gJnhmc190cmFuc19kcXVvdF9vcHMsCit9OworCitzdHJ1Y3QgYmh2X3Zmc29wcyB4ZnNfcW1vcHMgPSB7IHsKKwlCSFZfSURFTlRJVFlfSU5JVChWRlNfQkhWX1FNLCBWRlNfUE9TSVRJT05fUU0pLAorCS52ZnNfcGFyc2VhcmdzCQk9IHhmc19xbV9wYXJzZWFyZ3MsCisJLnZmc19zaG93YXJncwkJPSB4ZnNfcW1fc2hvd2FyZ3MsCisJLnZmc19tb3VudAkJPSB4ZnNfcW1fbW91bnQsCisJLnZmc19zeW5jCQk9IHhmc19xbV9zeW5jYWxsLAorCS52ZnNfcXVvdGFjdGwJCT0geGZzX3FtX3F1b3RhY3RsLCB9LAorfTsKKworCit2b2lkIF9faW5pdAoreGZzX3FtX2luaXQodm9pZCkKK3sKKwlzdGF0aWMgY2hhcgltZXNzYWdlW10gX19pbml0ZGF0YSA9CisJCUtFUk5fSU5GTyAiU0dJIFhGUyBRdW90YSBNYW5hZ2VtZW50IHN1YnN5c3RlbVxuIjsKKworCXByaW50ayhtZXNzYWdlKTsKKwltdXRleF9pbml0KCZ4ZnNfR3FtX2xvY2ssIE1VVEVYX0RFRkFVTFQsICJ4ZnNfcW1sb2NrIik7CisJdmZzX2Jodl9zZXRfY3VzdG9tKCZ4ZnNfcW1vcHMsICZ4ZnNfcW1jb3JlX3hmcyk7CisJeGZzX3FtX2luaXRfcHJvY2ZzKCk7Cit9CisKK3ZvaWQgX19leGl0Cit4ZnNfcW1fZXhpdCh2b2lkKQoreworCXZmc19iaHZfY2xyX2N1c3RvbSgmeGZzX3Ftb3BzKTsKKwl4ZnNfcW1fY2xlYW51cF9wcm9jZnMoKTsKKwlpZiAocW1fZHF6b25lKQorCQlrbWVtX2NhY2hlX2Rlc3Ryb3kocW1fZHF6b25lKTsKKwlpZiAocW1fZHF0cnh6b25lKQorCQlrbWVtX2NhY2hlX2Rlc3Ryb3kocW1fZHF0cnh6b25lKTsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy9xdW90YS94ZnNfcW1fc3RhdHMuYyBiL2ZzL3hmcy9xdW90YS94ZnNfcW1fc3RhdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTk3OGUwCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3F1b3RhL3hmc19xbV9zdGF0cy5jCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLgkgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisjaW5jbHVkZSAieGZzX2ZzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX3F1b3RhLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvYy5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19ibWFwLmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgorI2luY2x1ZGUgInhmc19ydGFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisjaW5jbHVkZSAieGZzX2l0YWJsZS5oIgorI2luY2x1ZGUgInhmc19ydy5oIgorI2luY2x1ZGUgInhmc19hY2wuaCIKKyNpbmNsdWRlICJ4ZnNfY2FwLmgiCisjaW5jbHVkZSAieGZzX21hYy5oIgorI2luY2x1ZGUgInhmc19hdHRyLmgiCisjaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCisKKyNpbmNsdWRlICJ4ZnNfcW0uaCIKKworc3RydWN0IHhxbXN0YXRzIHhxbXN0YXRzOworCitTVEFUSUMgaW50Cit4ZnNfcW1fcmVhZF94ZnNxdW90YSgKKwljaGFyCQkqYnVmZmVyLAorCWNoYXIJCSoqc3RhcnQsCisJb2ZmX3QJCW9mZnNldCwKKwlpbnQJCWNvdW50LAorCWludAkJKmVvZiwKKwl2b2lkCQkqZGF0YSkKK3sKKwlpbnQJCWxlbjsKKworCS8qIG1heGltdW07IGluY29yZTsgcmF0aW8gZnJlZSB0byBpbnVzZTsgZnJlZWxpc3QgKi8KKwlsZW4gPSBzcHJpbnRmKGJ1ZmZlciwgIiVkXHQlZFx0JWRcdCV1XG4iLAorCQkJbmRxdW90LAorCQkJeGZzX0dxbT8gYXRvbWljX3JlYWQoJnhmc19HcW0tPnFtX3RvdGFsZHF1b3RzKSA6IDAsCisJCQl4ZnNfR3FtPyB4ZnNfR3FtLT5xbV9kcWZyZWVfcmF0aW8gOiAwLAorCQkJeGZzX0dxbT8geGZzX0dxbS0+cW1fZHFmcmVlbGlzdC5xaF9uZWxlbXMgOiAwKTsKKworCWlmIChvZmZzZXQgPj0gbGVuKSB7CisJCSpzdGFydCA9IGJ1ZmZlcjsKKwkJKmVvZiA9IDE7CisJCXJldHVybiAwOworCX0KKwkqc3RhcnQgPSBidWZmZXIgKyBvZmZzZXQ7CisJaWYgKChsZW4gLT0gb2Zmc2V0KSA+IGNvdW50KQorCQlyZXR1cm4gY291bnQ7CisJKmVvZiA9IDE7CisKKwlyZXR1cm4gbGVuOworfQorCitTVEFUSUMgaW50Cit4ZnNfcW1fcmVhZF9zdGF0cygKKwljaGFyCQkqYnVmZmVyLAorCWNoYXIJCSoqc3RhcnQsCisJb2ZmX3QJCW9mZnNldCwKKwlpbnQJCWNvdW50LAorCWludAkJKmVvZiwKKwl2b2lkCQkqZGF0YSkKK3sKKwlpbnQJCWxlbjsKKworCS8qIHF1b3RhIHBlcmZvcm1hbmNlIHN0YXRpc3RpY3MgKi8KKwlsZW4gPSBzcHJpbnRmKGJ1ZmZlciwgInFtICV1ICV1ICV1ICV1ICV1ICV1ICV1ICV1XG4iLAorCQkJeHFtc3RhdHMueHNfcW1fZHFyZWNsYWltcywKKwkJCXhxbXN0YXRzLnhzX3FtX2RxcmVjbGFpbV9taXNzZXMsCisJCQl4cW1zdGF0cy54c19xbV9kcXVvdF9kdXBzLAorCQkJeHFtc3RhdHMueHNfcW1fZHFjYWNoZW1pc3NlcywKKwkJCXhxbXN0YXRzLnhzX3FtX2RxY2FjaGVoaXRzLAorCQkJeHFtc3RhdHMueHNfcW1fZHF3YW50cywKKwkJCXhxbXN0YXRzLnhzX3FtX2Rxc2hha2VfcmVjbGFpbXMsCisJCQl4cW1zdGF0cy54c19xbV9kcWluYWN0X3JlY2xhaW1zKTsKKworCWlmIChvZmZzZXQgPj0gbGVuKSB7CisJCSpzdGFydCA9IGJ1ZmZlcjsKKwkJKmVvZiA9IDE7CisJCXJldHVybiAwOworCX0KKwkqc3RhcnQgPSBidWZmZXIgKyBvZmZzZXQ7CisJaWYgKChsZW4gLT0gb2Zmc2V0KSA+IGNvdW50KQorCQlyZXR1cm4gY291bnQ7CisJKmVvZiA9IDE7CisKKwlyZXR1cm4gbGVuOworfQorCit2b2lkCit4ZnNfcW1faW5pdF9wcm9jZnModm9pZCkKK3sKKwljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJmcy94ZnMveHFtc3RhdCIsIDAsIE5VTEwsIHhmc19xbV9yZWFkX3N0YXRzLCBOVUxMKTsKKwljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJmcy94ZnMveHFtIiwgMCwgTlVMTCwgeGZzX3FtX3JlYWRfeGZzcXVvdGEsIE5VTEwpOworfQorCit2b2lkCit4ZnNfcW1fY2xlYW51cF9wcm9jZnModm9pZCkKK3sKKwlyZW1vdmVfcHJvY19lbnRyeSgiZnMveGZzL3hxbSIsIE5VTEwpOworCXJlbW92ZV9wcm9jX2VudHJ5KCJmcy94ZnMveHFtc3RhdCIsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3F1b3RhL3hmc19xbV9zdGF0cy5oIGIvZnMveGZzL3F1b3RhL3hmc19xbV9zdGF0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwOTNjNWMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvcXVvdGEveGZzX3FtX3N0YXRzLmgKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuCSBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX1FNX1NUQVRTX0hfXworI2RlZmluZSBfX1hGU19RTV9TVEFUU19IX18KKworCisjaWYgZGVmaW5lZChDT05GSUdfUFJPQ19GUykgJiYgIWRlZmluZWQoWEZTX1NUQVRTX09GRikKKworLyoKKyAqIFhRTSBnbG9iYWwgc3RhdGlzdGljcworICovCitzdHJ1Y3QgeHFtc3RhdHMgeworCV9fdWludDMyX3QJCXhzX3FtX2RxcmVjbGFpbXM7CisJX191aW50MzJfdAkJeHNfcW1fZHFyZWNsYWltX21pc3NlczsKKwlfX3VpbnQzMl90CQl4c19xbV9kcXVvdF9kdXBzOworCV9fdWludDMyX3QJCXhzX3FtX2RxY2FjaGVtaXNzZXM7CisJX191aW50MzJfdAkJeHNfcW1fZHFjYWNoZWhpdHM7CisJX191aW50MzJfdAkJeHNfcW1fZHF3YW50czsKKwlfX3VpbnQzMl90CQl4c19xbV9kcXNoYWtlX3JlY2xhaW1zOworCV9fdWludDMyX3QJCXhzX3FtX2RxaW5hY3RfcmVjbGFpbXM7Cit9OworCitleHRlcm4gc3RydWN0IHhxbXN0YXRzIHhxbXN0YXRzOworCisjIGRlZmluZSBYUU1fU1RBVFNfSU5DKGNvdW50KQkoIChjb3VudCkrKyApCisKK2V4dGVybiB2b2lkIHhmc19xbV9pbml0X3Byb2Nmcyh2b2lkKTsKK2V4dGVybiB2b2lkIHhmc19xbV9jbGVhbnVwX3Byb2Nmcyh2b2lkKTsKKworI2Vsc2UKKworIyBkZWZpbmUgWFFNX1NUQVRTX0lOQyhjb3VudCkJZG8geyB9IHdoaWxlICgwKQorCitzdGF0aWMgX19pbmxpbmUgdm9pZCB4ZnNfcW1faW5pdF9wcm9jZnModm9pZCkgeyB9Oworc3RhdGljIF9faW5saW5lIHZvaWQgeGZzX3FtX2NsZWFudXBfcHJvY2ZzKHZvaWQpIHsgfTsKKworI2VuZGlmCisKKyNlbmRpZgkvKiBfX1hGU19RTV9TVEFUU19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9xdW90YS94ZnNfcW1fc3lzY2FsbHMuYyBiL2ZzL3hmcy9xdW90YS94ZnNfcW1fc3lzY2FsbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjlmNWI1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3F1b3RhL3hmc19xbV9zeXNjYWxscy5jCkBAIC0wLDAgKzEsMTQ1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4JIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorI2luY2x1ZGUgInhmc19mcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc19hbGxvYy5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19xdW90YS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcC5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKKyNpbmNsdWRlICJ4ZnNfcnRhbGxvYy5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorI2luY2x1ZGUgInhmc19pdGFibGUuaCIKKyNpbmNsdWRlICJ4ZnNfcncuaCIKKyNpbmNsdWRlICJ4ZnNfYWNsLmgiCisjaW5jbHVkZSAieGZzX2NhcC5oIgorI2luY2x1ZGUgInhmc19tYWMuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0ci5oIgorI2luY2x1ZGUgInhmc19idWZfaXRlbS5oIgorI2luY2x1ZGUgInhmc191dGlscy5oIgorCisjaW5jbHVkZSAieGZzX3FtLmgiCisKKyNpZmRlZiBERUJVRworIyBkZWZpbmUgcWRwcmludGsocywgYXJncy4uLikJY21uX2VycihDRV9ERUJVRywgcywgIyMgYXJncykKKyNlbHNlCisjIGRlZmluZSBxZHByaW50ayhzLCBhcmdzLi4uKQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworU1RBVElDIGludAl4ZnNfcW1fc2NhbGxfdHJ1bmNfcWZpbGVzKHhmc19tb3VudF90ICosIHVpbnQpOworU1RBVElDIGludAl4ZnNfcW1fc2NhbGxfZ2V0cXVvdGEoeGZzX21vdW50X3QgKiwgeGZzX2RxaWRfdCwgdWludCwKKwkJCQkJZnNfZGlza19xdW90YV90ICopOworU1RBVElDIGludAl4ZnNfcW1fc2NhbGxfZ2V0cXN0YXQoeGZzX21vdW50X3QgKiwgZnNfcXVvdGFfc3RhdF90ICopOworU1RBVElDIGludAl4ZnNfcW1fc2NhbGxfc2V0cWxpbSh4ZnNfbW91bnRfdCAqLCB4ZnNfZHFpZF90LCB1aW50LAorCQkJCQlmc19kaXNrX3F1b3RhX3QgKik7CitTVEFUSUMgaW50CXhmc19xbV9zY2FsbF9xdW90YW9uKHhmc19tb3VudF90ICosIHVpbnQpOworU1RBVElDIGludAl4ZnNfcW1fc2NhbGxfcXVvdGFvZmYoeGZzX21vdW50X3QgKiwgdWludCwgYm9vbGVhbl90KTsKK1NUQVRJQyBpbnQJeGZzX3FtX2xvZ19xdW90YW9mZih4ZnNfbW91bnRfdCAqLCB4ZnNfcW9mZl9sb2dpdGVtX3QgKiosIHVpbnQpOworU1RBVElDIGludAl4ZnNfcW1fbG9nX3F1b3Rhb2ZmX2VuZCh4ZnNfbW91bnRfdCAqLCB4ZnNfcW9mZl9sb2dpdGVtX3QgKiwKKwkJCQkJdWludCk7CitTVEFUSUMgdWludAl4ZnNfcW1faW1wb3J0X2ZsYWdzKHVpbnQpOworU1RBVElDIHVpbnQJeGZzX3FtX2V4cG9ydF9mbGFncyh1aW50KTsKK1NUQVRJQyB1aW50CXhmc19xbV9pbXBvcnRfcXR5cGVfZmxhZ3ModWludCk7CitTVEFUSUMgdWludAl4ZnNfcW1fZXhwb3J0X3F0eXBlX2ZsYWdzKHVpbnQpOworU1RBVElDIHZvaWQJeGZzX3FtX2V4cG9ydF9kcXVvdCh4ZnNfbW91bnRfdCAqLCB4ZnNfZGlza19kcXVvdF90ICosCisJCQkJCWZzX2Rpc2tfcXVvdGFfdCAqKTsKKworCisvKgorICogVGhlIG1haW4gZGlzdHJpYnV0aW9uIHN3aXRjaCBvZiBhbGwgWEZTIHF1b3RhY3RsIHN5c3RlbSBjYWxscy4KKyAqLworaW50Cit4ZnNfcW1fcXVvdGFjdGwoCisJc3RydWN0IGJodl9kZXNjICpiZHAsCisJaW50CQljbWQsCisJaW50CQlpZCwKKwl4ZnNfY2FkZHJfdAlhZGRyKQoreworCXhmc19tb3VudF90CSptcDsKKwlpbnQJCWVycm9yOworCXN0cnVjdCB2ZnMJKnZmc3A7CisKKwl2ZnNwID0gYmh2dG92ZnMoYmRwKTsKKwltcCA9IFhGU19WRlNUT00odmZzcCk7CisKKwlpZiAoYWRkciA9PSBOVUxMICYmIGNtZCAhPSBRX1NZTkMpCisJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKwlpZiAoaWQgPCAwICYmIGNtZCAhPSBRX1NZTkMpCisJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKworCS8qCisJICogVGhlIGZvbGxvd2luZyBjb21tYW5kcyBhcmUgdmFsaWQgZXZlbiB3aGVuIHF1b3Rhb2ZmLgorCSAqLworCXN3aXRjaCAoY21kKSB7CisJCS8qCisJCSAqIHRydW5jYXRlIHF1b3RhIGZpbGVzLiBxdW90YSBtdXN0IGJlIG9mZi4KKwkJICovCisJICAgICAgY2FzZSBRX1hRVU9UQVJNOgorCQlpZiAoWEZTX0lTX1FVT1RBX09OKG1wKSB8fCBhZGRyID09IE5VTEwpCisJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisJCWlmICh2ZnNwLT52ZnNfZmxhZyAmIFZGU19SRE9OTFkpCisJCQlyZXR1cm4gWEZTX0VSUk9SKEVST0ZTKTsKKwkJcmV0dXJuICh4ZnNfcW1fc2NhbGxfdHJ1bmNfcWZpbGVzKG1wLAorCQkJICAgICAgIHhmc19xbV9pbXBvcnRfcXR5cGVfZmxhZ3MoKih1aW50ICopYWRkcikpKTsKKwkJLyoKKwkJICogR2V0IHF1b3RhIHN0YXR1cyBpbmZvcm1hdGlvbi4KKwkJICovCisJICAgICAgY2FzZSBRX1hHRVRRU1RBVDoKKwkJcmV0dXJuICh4ZnNfcW1fc2NhbGxfZ2V0cXN0YXQobXAsIChmc19xdW90YV9zdGF0X3QgKilhZGRyKSk7CisKKwkJLyoKKwkJICogUVVPVEFPTiBmb3Igcm9vdCBmL3MgYW5kIHF1b3RhIGVuZm9yY2VtZW50IG9uIG90aGVycy4uCisJCSAqIFF1b3RhIGFjY291bnRpbmcgZm9yIG5vbi1yb290IGYvcydzIG11c3QgYmUgdHVybmVkIG9uCisJCSAqIGF0IG1vdW50IHRpbWUuCisJCSAqLworCSAgICAgIGNhc2UgUV9YUVVPVEFPTjoKKwkJaWYgKGFkZHIgPT0gTlVMTCkKKwkJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKwkJaWYgKHZmc3AtPnZmc19mbGFnICYgVkZTX1JET05MWSkKKwkJCXJldHVybiBYRlNfRVJST1IoRVJPRlMpOworCQlyZXR1cm4gKHhmc19xbV9zY2FsbF9xdW90YW9uKG1wLAorCQkJCQkgIHhmc19xbV9pbXBvcnRfZmxhZ3MoKih1aW50ICopYWRkcikpKTsKKwkgICAgICBjYXNlIFFfWFFVT1RBT0ZGOgorCQlpZiAodmZzcC0+dmZzX2ZsYWcgJiBWRlNfUkRPTkxZKQorCQkJcmV0dXJuIFhGU19FUlJPUihFUk9GUyk7CisJCWJyZWFrOworCisJICAgICAgZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJaWYgKCEgWEZTX0lTX1FVT1RBX09OKG1wKSkKKwkJcmV0dXJuIFhGU19FUlJPUihFU1JDSCk7CisKKwlzd2l0Y2ggKGNtZCkgeworCSAgICAgIGNhc2UgUV9YUVVPVEFPRkY6CisJCWlmICh2ZnNwLT52ZnNfZmxhZyAmIFZGU19SRE9OTFkpCisJCQlyZXR1cm4gWEZTX0VSUk9SKEVST0ZTKTsKKwkJZXJyb3IgPSB4ZnNfcW1fc2NhbGxfcXVvdGFvZmYobXAsCisJCQkJCSAgICB4ZnNfcW1faW1wb3J0X2ZsYWdzKCoodWludCAqKWFkZHIpLAorCQkJCQkgICAgQl9GQUxTRSk7CisJCWJyZWFrOworCisJCS8qCisJCSAqIERlZmF1bHRzIHRvIFhGU19HRVRVUVVPVEEuCisJCSAqLworCSAgICAgIGNhc2UgUV9YR0VUUVVPVEE6CisJCWVycm9yID0geGZzX3FtX3NjYWxsX2dldHF1b3RhKG1wLCAoeGZzX2RxaWRfdClpZCwgWEZTX0RRX1VTRVIsCisJCQkJCShmc19kaXNrX3F1b3RhX3QgKilhZGRyKTsKKwkJYnJlYWs7CisJCS8qCisJCSAqIFNldCBsaW1pdHMsIGJvdGggaGFyZCBhbmQgc29mdC4gRGVmYXVsdHMgdG8gUV9TRVRVUUxJTS4KKwkJICovCisJICAgICAgY2FzZSBRX1hTRVRRTElNOgorCQlpZiAodmZzcC0+dmZzX2ZsYWcgJiBWRlNfUkRPTkxZKQorCQkJcmV0dXJuIFhGU19FUlJPUihFUk9GUyk7CisJCWVycm9yID0geGZzX3FtX3NjYWxsX3NldHFsaW0obXAsICh4ZnNfZHFpZF90KWlkLCBYRlNfRFFfVVNFUiwKKwkJCQkJICAgICAoZnNfZGlza19xdW90YV90ICopYWRkcik7CisJCWJyZWFrOworCisJICAgICAgIGNhc2UgUV9YU0VUR1FMSU06CisJCWlmICh2ZnNwLT52ZnNfZmxhZyAmIFZGU19SRE9OTFkpCisJCQlyZXR1cm4gWEZTX0VSUk9SKEVST0ZTKTsKKwkJZXJyb3IgPSB4ZnNfcW1fc2NhbGxfc2V0cWxpbShtcCwgKHhmc19kcWlkX3QpaWQsIFhGU19EUV9HUk9VUCwKKwkJCQkJICAgICAoZnNfZGlza19xdW90YV90ICopYWRkcik7CisJCWJyZWFrOworCisKKwkgICAgICBjYXNlIFFfWEdFVEdRVU9UQToKKwkJZXJyb3IgPSB4ZnNfcW1fc2NhbGxfZ2V0cXVvdGEobXAsICh4ZnNfZHFpZF90KWlkLCBYRlNfRFFfR1JPVVAsCisJCQkJCShmc19kaXNrX3F1b3RhX3QgKilhZGRyKTsKKwkJYnJlYWs7CisKKwkJLyoKKwkJICogUXVvdGFzIGFyZSBlbnRpcmVseSB1bmRlZmluZWQgYWZ0ZXIgcXVvdGFvZmYgaW4gWEZTIHF1b3Rhcy4KKwkJICogRm9yIGluc3RhbmNlLCB0aGVyZSdzIG5vIHdheSB0byBzZXQgbGltaXRzIHdoZW4gcXVvdGFvZmYuCisJCSAqLworCisJICAgICAgZGVmYXVsdDoKKwkJZXJyb3IgPSBYRlNfRVJST1IoRUlOVkFMKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIChlcnJvcik7Cit9CisKKy8qCisgKiBUdXJuIG9mZiBxdW90YSBhY2NvdW50aW5nIGFuZC9vciBlbmZvcmNlbWVudCBmb3IgYWxsIHVkcXVvdHMgYW5kL29yCisgKiBnZHF1b3RzLiBDYWxsZWQgb25seSBhdCB1bm1vdW50IHRpbWUuCisgKgorICogVGhpcyBhc3N1bWVzIHRoYXQgdGhlcmUgYXJlIG5vIGRxdW90cyBvZiB0aGlzIGZpbGUgc3lzdGVtIGNhY2hlZAorICogaW5jb3JlLCBhbmQgbW9kaWZpZXMgdGhlIG9uZGlzayBkcXVvdCBkaXJlY3RseS4gVGhlcmVmb3JlLCBmb3IgZXhhbXBsZSwKKyAqIGl0IGlzIGFuIGVycm9yIHRvIGNhbGwgdGhpcyB0d2ljZSwgd2l0aG91dCBwdXJnaW5nIHRoZSBjYWNoZS4KKyAqLworU1RBVElDIGludAoreGZzX3FtX3NjYWxsX3F1b3Rhb2ZmKAorCXhmc19tb3VudF90CQkqbXAsCisJdWludAkJCWZsYWdzLAorCWJvb2xlYW5fdAkJZm9yY2UpCit7CisJdWludAkJCWRxdHlwZTsKKwl1bnNpZ25lZCBsb25nCXM7CisJaW50CQkJZXJyb3I7CisJdWludAkJCWluYWN0aXZhdGVfZmxhZ3M7CisJeGZzX3FvZmZfbG9naXRlbV90CSpxb2Zmc3RhcnQ7CisJaW50CQkJbmN1bHByaXRzOworCisJaWYgKCFmb3JjZSAmJiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIFhGU19FUlJPUihFUEVSTSk7CisJLyoKKwkgKiBObyBmaWxlIHN5c3RlbSBjYW4gaGF2ZSBxdW90YXMgZW5hYmxlZCBvbiBkaXNrIGJ1dCBub3QgaW4gY29yZS4KKwkgKiBOb3RlIHRoYXQgcXVvdGEgdXRpbGl0aWVzIChsaWtlIHF1b3Rhb2ZmKSBfZXhwZWN0XworCSAqIGVycm5vID09IEVFWElTVCBoZXJlLgorCSAqLworCWlmICgobXAtPm1fcWZsYWdzICYgZmxhZ3MpID09IDApCisJCXJldHVybiBYRlNfRVJST1IoRUVYSVNUKTsKKwllcnJvciA9IDA7CisKKwlmbGFncyAmPSAoWEZTX0FMTF9RVU9UQV9BQ0NUIHwgWEZTX0FMTF9RVU9UQV9FTkZEKTsKKworCS8qCisJICogV2UgZG9uJ3Qgd2FudCB0byBkZWFsIHdpdGggdHdvIHF1b3Rhb2ZmcyBtZXNzaW5nIHVwIGVhY2ggb3RoZXIsCisJICogc28gd2UncmUgZ29pbmcgdG8gc2VyaWFsaXplIGl0LiBxdW90YW9mZiBpc24ndCBleGFjdGx5IGEgcGVyZm9ybWFuY2UKKwkgKiBjcml0aWNhbCB0aGluZy4KKwkgKiBJZiBxdW90YW9mZiwgdGhlbiB3ZSBtdXN0IGJlIGRlYWxpbmcgd2l0aCB0aGUgcm9vdCBmaWxlc3lzdGVtLgorCSAqLworCUFTU0VSVChtcC0+bV9xdW90YWluZm8pOworCWlmIChtcC0+bV9xdW90YWluZm8pCisJCW11dGV4X2xvY2soJihYRlNfUUlfUU9GRkxPQ0sobXApKSwgUElOT0QpOworCisJQVNTRVJUKG1wLT5tX3F1b3RhaW5mbyk7CisKKwkvKgorCSAqIElmIHdlJ3JlIGp1c3QgdHVybmluZyBvZmYgcXVvdGEgZW5mb3JjZW1lbnQsIGNoYW5nZSBtcCBhbmQgZ28uCisJICovCisJaWYgKChmbGFncyAmIFhGU19BTExfUVVPVEFfQUNDVCkgPT0gMCkgeworCQltcC0+bV9xZmxhZ3MgJj0gfihmbGFncyk7CisKKwkJcyA9IFhGU19TQl9MT0NLKG1wKTsKKwkJbXAtPm1fc2Iuc2JfcWZsYWdzID0gbXAtPm1fcWZsYWdzOworCQlYRlNfU0JfVU5MT0NLKG1wLCBzKTsKKwkJbXV0ZXhfdW5sb2NrKCYoWEZTX1FJX1FPRkZMT0NLKG1wKSkpOworCisJCS8qIFhYWCB3aGF0IHRvIGRvIGlmIGVycm9yID8gUmV2ZXJ0IGJhY2sgdG8gb2xkIHZhbHMgaW5jb3JlID8gKi8KKwkJZXJyb3IgPSB4ZnNfcW1fd3JpdGVfc2JfY2hhbmdlcyhtcCwgWEZTX1NCX1FGTEFHUyk7CisJCXJldHVybiAoZXJyb3IpOworCX0KKworCWRxdHlwZSA9IDA7CisJaW5hY3RpdmF0ZV9mbGFncyA9IDA7CisJLyoKKwkgKiBJZiBhY2NvdW50aW5nIGlzIG9mZiwgd2UgbXVzdCB0dXJuIGVuZm9yY2VtZW50IG9mZiwgY2xlYXIgdGhlCisJICogcXVvdGEgJ0NIS0QnIGNlcnRpZmljYXRlIHRvIG1ha2UgaXQga25vd24gdGhhdCB3ZSBoYXZlIHRvCisJICogZG8gYSBxdW90YWNoZWNrIHRoZSBuZXh0IHRpbWUgdGhpcyBxdW90YSBpcyB0dXJuZWQgb24uCisJICovCisJaWYgKGZsYWdzICYgWEZTX1VRVU9UQV9BQ0NUKSB7CisJCWRxdHlwZSB8PSBYRlNfUU1PUFRfVVFVT1RBOworCQlmbGFncyB8PSAoWEZTX1VRVU9UQV9DSEtEIHwgWEZTX1VRVU9UQV9FTkZEKTsKKwkJaW5hY3RpdmF0ZV9mbGFncyB8PSBYRlNfVVFVT1RBX0FDVElWRTsKKwl9CisJaWYgKGZsYWdzICYgWEZTX0dRVU9UQV9BQ0NUKSB7CisJCWRxdHlwZSB8PSBYRlNfUU1PUFRfR1FVT1RBOworCQlmbGFncyB8PSAoWEZTX0dRVU9UQV9DSEtEIHwgWEZTX0dRVU9UQV9FTkZEKTsKKwkJaW5hY3RpdmF0ZV9mbGFncyB8PSBYRlNfR1FVT1RBX0FDVElWRTsKKwl9CisKKwkvKgorCSAqIE5vdGhpbmcgdG8gZG8/ICBEb24ndCBjb21wbGFpbi4gVGhpcyBoYXBwZW5zIHdoZW4gd2UncmUganVzdAorCSAqIHR1cm5pbmcgb2ZmIHF1b3RhIGVuZm9yY2VtZW50LgorCSAqLworCWlmICgobXAtPm1fcWZsYWdzICYgZmxhZ3MpID09IDApIHsKKwkJbXV0ZXhfdW5sb2NrKCYoWEZTX1FJX1FPRkZMT0NLKG1wKSkpOworCQlyZXR1cm4gKDApOworCX0KKworCS8qCisJICogV3JpdGUgdGhlIExJX1FVT1RBT0ZGIGxvZyByZWNvcmQsIGFuZCBkbyBTQiBjaGFuZ2VzIGF0b21pY2FsbHksCisJICogYW5kIHN5bmNocm9ub3VzbHkuCisJICovCisJeGZzX3FtX2xvZ19xdW90YW9mZihtcCwgJnFvZmZzdGFydCwgZmxhZ3MpOworCisJLyoKKwkgKiBOZXh0IHdlIGNsZWFyIHRoZSBYRlNfTU9VTlRfKkRRX0FDVElWRSBiaXQocykgaW4gdGhlIG1vdW50IHN0cnVjdAorCSAqIHRvIHRha2UgY2FyZSBvZiB0aGUgcmFjZSBiZXR3ZWVuIGRxZ2V0IGFuZCBxdW90YW9mZi4gV2UgZG9uJ3QgdGFrZQorCSAqIGFueSBzcGVjaWFsIGxvY2tzIHRvIHJlc2V0IHRoZXNlIGJpdHMuIEFsbCBwcm9jZXNzZXMgbmVlZCB0byBjaGVjaworCSAqIHRoZXNlIGJpdHMgKmFmdGVyKiB0YWtpbmcgaW5vZGUgbG9jayhzKSB0byBzZWUgaWYgdGhlIHBhcnRpY3VsYXIKKwkgKiBxdW90YSB0eXBlIGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIHR1cm5lZCBvZmYuIElmICpBQ1RJVkUsIGl0IGlzCisJICogZ3VhcmFudGVlZCB0aGF0IGFsbCBkcXVvdCBzdHJ1Y3R1cmVzIGFuZCBhbGwgcXVvdGFpbm9kZSBwdHJzIHdpbGwgYWxsCisJICogc3RheSB2YWxpZCBhcyBsb25nIGFzIHRoYXQgaW5vZGUgaXMga2VwdCBsb2NrZWQuCisJICoKKwkgKiBUaGVyZSBpcyBubyB0dXJuaW5nIGJhY2sgYWZ0ZXIgdGhpcy4KKwkgKi8KKwltcC0+bV9xZmxhZ3MgJj0gfmluYWN0aXZhdGVfZmxhZ3M7CisKKwkvKgorCSAqIEdpdmUgYmFjayBhbGwgdGhlIGRxdW90IHJlZmVyZW5jZShzKSBoZWxkIGJ5IGlub2Rlcy4KKwkgKiBIZXJlIHdlIGdvIHRocnUgZXZlcnkgc2luZ2xlIGluY29yZSBpbm9kZSBpbiB0aGlzIGZpbGUgc3lzdGVtLCBhbmQKKwkgKiBkbyBhIGRxcmVsZSBvbiB0aGUgaV91ZHF1b3QvaV9nZHF1b3QgdGhhdCBpdCBtYXkgaGF2ZS4KKwkgKiBFc3NlbnRpYWxseSwgYXMgbG9uZyBhcyBzb21lYm9keSBoYXMgYW4gaW5vZGUgbG9ja2VkLCB0aGlzIGd1YXJhbnRlZXMKKwkgKiB0aGF0IHF1b3RhcyB3aWxsIG5vdCBiZSB0dXJuZWQgb2ZmLiBUaGlzIGlzIGhhbmR5IGJlY2F1c2UgaW4gYQorCSAqIHRyYW5zYWN0aW9uIG9uY2Ugd2UgbG9jayB0aGUgaW5vZGUocykgYW5kIGNoZWNrIGZvciBxdW90YW9uLCB3ZSBjYW4KKwkgKiBkZXBlbmQgb24gdGhlIHF1b3RhIGlub2RlcyAoYW5kIG90aGVyIHRoaW5ncykgYmVpbmcgdmFsaWQgYXMgbG9uZyBhcworCSAqIHdlIGtlZXAgdGhlIGxvY2socykuCisJICovCisJeGZzX3FtX2RxcmVsZV9hbGxfaW5vZGVzKG1wLCBmbGFncyk7CisKKwkvKgorCSAqIE5leHQgd2UgbWFrZSB0aGUgY2hhbmdlcyBpbiB0aGUgcXVvdGEgZmxhZyBpbiB0aGUgbW91bnQgc3RydWN0LgorCSAqIFRoaXMgaXNuJ3QgcHJvdGVjdGVkIGJ5IGEgcGFydGljdWxhciBsb2NrIGRpcmVjdGx5LCBiZWNhdXNlIHdlCisJICogZG9uJ3Qgd2FudCB0byB0YWtlIGEgbXJsb2NrIGV2ZXJ5dGltZSB3ZSBkZXBlbmQgb24gcXVvdGFzIGJlaW5nIG9uLgorCSAqLworCW1wLT5tX3FmbGFncyAmPSB+KGZsYWdzKTsKKworCS8qCisJICogR28gdGhyb3VnaCBhbGwgdGhlIGRxdW90cyBvZiB0aGlzIGZpbGUgc3lzdGVtIGFuZCBwdXJnZSB0aGVtLAorCSAqIGFjY29yZGluZyB0byB3aGF0IHdhcyB0dXJuZWQgb2ZmLiBXZSBtYXkgbm90IGJlIGFibGUgdG8gZ2V0IHJpZAorCSAqIG9mIGFsbCBkcXVvdHMsIGJlY2F1c2UgZHF1b3RzIGNhbiBoYXZlIHRlbXBvcmFyeSByZWZlcmVuY2VzIHRoYXQKKwkgKiBhcmUgbm90IGF0dGFjaGVkIHRvIGlub2Rlcy4gZWcuIHhmc19zZXRhdHRyLCB4ZnNfY3JlYXRlLgorCSAqIFNvLCBpZiB3ZSBjb3VsZG4ndCBwdXJnZSBhbGwgdGhlIGRxdW90cyBmcm9tIHRoZSBmaWxlc3lzdGVtLAorCSAqIHdlIGNhbid0IGdldCByaWQgb2YgdGhlIGluY29yZSBkYXRhIHN0cnVjdHVyZXMuCisJICovCisJd2hpbGUgKChuY3VscHJpdHMgPSB4ZnNfcW1fZHFwdXJnZV9hbGwobXAsIGRxdHlwZXxYRlNfUU1PUFRfUVVPVEFPRkYpKSkKKwkJZGVsYXkoMTAgKiBuY3VscHJpdHMpOworCisJLyoKKwkgKiBUcmFuc2FjdGlvbnMgdGhhdCBoYWQgc3RhcnRlZCBiZWZvcmUgQUNUSVZFIHN0YXRlIGJpdCB3YXMgY2xlYXJlZAorCSAqIGNvdWxkIGhhdmUgbG9nZ2VkIG1hbnkgZHF1b3RzLCBzbyB0aGV5J2QgaGF2ZSBoaWdoZXIgTFNOcyB0aGFuCisJICogdGhlIGZpcnN0IFFVT1RBT0ZGIGxvZyByZWNvcmQgZG9lcy4gSWYgd2UgaGFwcGVuIHRvIGNyYXNoIHdoZW4KKwkgKiB0aGUgdGFpbCBvZiB0aGUgbG9nIGhhcyBnb25lIHBhc3QgdGhlIFFVT1RBT0ZGIHJlY29yZCwgYnV0CisJICogYmVmb3JlIHRoZSBsYXN0IGRxdW90IG1vZGlmaWNhdGlvbiwgdGhvc2UgZHF1b3RzIF9fd2lsbF9fCisJICogcmVjb3ZlciwgYW5kIHRoYXQncyBub3QgZ29vZC4KKwkgKgorCSAqIFNvLCB3ZSBoYXZlIFFVT1RBT0ZGIHN0YXJ0IGFuZCBlbmQgbG9naXRlbXM7IHRoZSBzdGFydAorCSAqIGxvZ2l0ZW0gd29uJ3QgZ2V0IG92ZXJ3cml0dGVuIHVudGlsIHRoZSBlbmQgbG9naXRlbSBhcHBlYXJzLi4uCisJICovCisJeGZzX3FtX2xvZ19xdW90YW9mZl9lbmQobXAsIHFvZmZzdGFydCwgZmxhZ3MpOworCisJLyoKKwkgKiBJZiBxdW90YXMgaXMgY29tcGxldGVseSBkaXNhYmxlZCwgY2xvc2Ugc2hvcC4KKwkgKi8KKwlpZiAoKGZsYWdzICYgWEZTX01PVU5UX1FVT1RBX0FMTCkgPT0gWEZTX01PVU5UX1FVT1RBX0FMTCkgeworCQltdXRleF91bmxvY2soJihYRlNfUUlfUU9GRkxPQ0sobXApKSk7CisJCXhmc19xbV9kZXN0cm95X3F1b3RhaW5mbyhtcCk7CisJCXJldHVybiAoMCk7CisJfQorCisJLyoKKwkgKiBSZWxlYXNlIG91ciBxdW90YWlub2RlIHJlZmVyZW5jZXMsIGFuZCB2bl9wdXJnZSB0aGVtLAorCSAqIGlmIHdlIGRvbid0IG5lZWQgdGhlbSBhbnltb3JlLgorCSAqLworCWlmICgoZHF0eXBlICYgWEZTX1FNT1BUX1VRVU9UQSkgJiYgWEZTX1FJX1VRSVAobXApKSB7CisJCVhGU19QVVJHRV9JTk9ERShYRlNfUUlfVVFJUChtcCkpOworCQlYRlNfUUlfVVFJUChtcCkgPSBOVUxMOworCX0KKwlpZiAoKGRxdHlwZSAmIFhGU19RTU9QVF9HUVVPVEEpICYmIFhGU19RSV9HUUlQKG1wKSkgeworCQlYRlNfUFVSR0VfSU5PREUoWEZTX1FJX0dRSVAobXApKTsKKwkJWEZTX1FJX0dRSVAobXApID0gTlVMTDsKKwl9CisJbXV0ZXhfdW5sb2NrKCYoWEZTX1FJX1FPRkZMT0NLKG1wKSkpOworCisJcmV0dXJuIChlcnJvcik7Cit9CisKK1NUQVRJQyBpbnQKK3hmc19xbV9zY2FsbF90cnVuY19xZmlsZXMoCisJeGZzX21vdW50X3QJKm1wLAorCXVpbnQJCWZsYWdzKQoreworCWludAkJZXJyb3I7CisJeGZzX2lub2RlX3QJKnFpcDsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIFhGU19FUlJPUihFUEVSTSk7CisJZXJyb3IgPSAwOworCWlmICghWEZTX1NCX1ZFUlNJT05fSEFTUVVPVEEoJm1wLT5tX3NiKSB8fCBmbGFncyA9PSAwKSB7CisJCXFkcHJpbnRrKCJxdHJ1bmMgZmxhZ3M9JXggbV9xZmxhZ3M9JXhcbiIsIGZsYWdzLCBtcC0+bV9xZmxhZ3MpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisJfQorCisJaWYgKChmbGFncyAmIFhGU19EUV9VU0VSKSAmJiBtcC0+bV9zYi5zYl91cXVvdGlubyAhPSBOVUxMRlNJTk8pIHsKKwkJZXJyb3IgPSB4ZnNfaWdldChtcCwgTlVMTCwgbXAtPm1fc2Iuc2JfdXF1b3Rpbm8sIDAsIDAsICZxaXAsIDApOworCQlpZiAoISBlcnJvcikgeworCQkJKHZvaWQpIHhmc190cnVuY2F0ZV9maWxlKG1wLCBxaXApOworCQkJVk5fUkVMRShYRlNfSVRPVihxaXApKTsKKwkJfQorCX0KKworCWlmICgoZmxhZ3MgJiBYRlNfRFFfR1JPVVApICYmIG1wLT5tX3NiLnNiX2dxdW90aW5vICE9IE5VTExGU0lOTykgeworCQllcnJvciA9IHhmc19pZ2V0KG1wLCBOVUxMLCBtcC0+bV9zYi5zYl9ncXVvdGlubywgMCwgMCwgJnFpcCwgMCk7CisJCWlmICghIGVycm9yKSB7CisJCQkodm9pZCkgeGZzX3RydW5jYXRlX2ZpbGUobXAsIHFpcCk7CisJCQlWTl9SRUxFKFhGU19JVE9WKHFpcCkpOworCQl9CisJfQorCisJcmV0dXJuIChlcnJvcik7Cit9CisKKworLyoKKyAqIFN3aXRjaCBvbiAoYSBnaXZlbikgcXVvdGEgZW5mb3JjZW1lbnQgZm9yIGEgZmlsZXN5c3RlbS4gIFRoaXMgdGFrZXMKKyAqIGVmZmVjdCBpbW1lZGlhdGVseS4KKyAqIChTd2l0Y2hpbmcgb24gcXVvdGEgYWNjb3VudGluZyBtdXN0IGJlIGRvbmUgYXQgbW91bnQgdGltZS4pCisgKi8KK1NUQVRJQyBpbnQKK3hmc19xbV9zY2FsbF9xdW90YW9uKAorCXhmc19tb3VudF90CSptcCwKKwl1aW50CQlmbGFncykKK3sKKwlpbnQJCWVycm9yOworCXVuc2lnbmVkIGxvbmcgczsKKwl1aW50CQlxZjsKKwl1aW50CQlhY2NmbGFnczsKKwlfX2ludDY0X3QJc2JmbGFnczsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIFhGU19FUlJPUihFUEVSTSk7CisKKwlmbGFncyAmPSAoWEZTX0FMTF9RVU9UQV9BQ0NUIHwgWEZTX0FMTF9RVU9UQV9FTkZEKTsKKwkvKgorCSAqIFN3aXRjaGluZyBvbiBxdW90YSBhY2NvdW50aW5nIG11c3QgYmUgZG9uZSBhdCBtb3VudCB0aW1lLgorCSAqLworCWFjY2ZsYWdzID0gZmxhZ3MgJiBYRlNfQUxMX1FVT1RBX0FDQ1Q7CisJZmxhZ3MgJj0gfihYRlNfQUxMX1FVT1RBX0FDQ1QpOworCisJc2JmbGFncyA9IDA7CisKKwlpZiAoZmxhZ3MgPT0gMCkgeworCQlxZHByaW50aygicXVvdGFvbjogemVybyBmbGFncywgbV9xZmxhZ3M9JXhcbiIsIG1wLT5tX3FmbGFncyk7CisJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKwl9CisKKwkvKiBObyBmcyBjYW4gdHVybiBvbiBxdW90YXMgd2l0aCBhIGRlbGF5ZWQgZWZmZWN0ICovCisJQVNTRVJUKChmbGFncyAmIFhGU19BTExfUVVPVEFfQUNDVCkgPT0gMCk7CisKKwkvKgorCSAqIENhbid0IGVuZm9yY2Ugd2l0aG91dCBhY2NvdW50aW5nLiBXZSBjaGVjayB0aGUgc3VwZXJibG9jaworCSAqIHFmbGFncyBoZXJlIGluc3RlYWQgb2YgbV9xZmxhZ3MgYmVjYXVzZSByb290ZnMgY2FuIGhhdmUKKwkgKiBxdW90YSBhY2N0IG9uIG9uZGlzayB3aXRob3V0IG1fcWZsYWdzJyBrbm93aW5nLgorCSAqLworCWlmICgoKGZsYWdzICYgWEZTX1VRVU9UQV9BQ0NUKSA9PSAwICYmCisJICAgIChtcC0+bV9zYi5zYl9xZmxhZ3MgJiBYRlNfVVFVT1RBX0FDQ1QpID09IDAgJiYKKwkgICAgKGZsYWdzICYgWEZTX1VRVU9UQV9FTkZEKSkKKwkgICAgfHwKKwkgICAgKChmbGFncyAmIFhGU19HUVVPVEFfQUNDVCkgPT0gMCAmJgorCSAgICAobXAtPm1fc2Iuc2JfcWZsYWdzICYgWEZTX0dRVU9UQV9BQ0NUKSA9PSAwICYmCisJICAgIChmbGFncyAmIFhGU19HUVVPVEFfRU5GRCkpKSB7CisJCXFkcHJpbnRrKCJDYW4ndCBlbmZvcmNlIHdpdGhvdXQgYWNjdCwgZmxhZ3M9JXggc2JmbGFncz0leFxuIiwKKwkJCWZsYWdzLCBtcC0+bV9zYi5zYl9xZmxhZ3MpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisJfQorCS8qCisJICogSWYgZXZlcnl0aGluZydzIHVwdG8tZGF0ZSBpbmNvcmUsIHRoZW4gZG9uJ3Qgd2FzdGUgdGltZS4KKwkgKi8KKwlpZiAoKG1wLT5tX3FmbGFncyAmIGZsYWdzKSA9PSBmbGFncykKKwkJcmV0dXJuIFhGU19FUlJPUihFRVhJU1QpOworCisJLyoKKwkgKiBDaGFuZ2Ugc2JfcWZsYWdzIG9uIGRpc2sgYnV0IG5vdCBpbmNvcmUgbXAtPnFmbGFncworCSAqIGlmIHRoaXMgaXMgdGhlIHJvb3QgZmlsZXN5c3RlbS4KKwkgKi8KKwlzID0gWEZTX1NCX0xPQ0sobXApOworCXFmID0gbXAtPm1fc2Iuc2JfcWZsYWdzOworCW1wLT5tX3NiLnNiX3FmbGFncyA9IHFmIHwgZmxhZ3M7CisJWEZTX1NCX1VOTE9DSyhtcCwgcyk7CisKKwkvKgorCSAqIFRoZXJlJ3Mgbm90aGluZyB0byBjaGFuZ2UgaWYgaXQncyB0aGUgc2FtZS4KKwkgKi8KKwlpZiAoKHFmICYgZmxhZ3MpID09IGZsYWdzICYmIHNiZmxhZ3MgPT0gMCkKKwkJcmV0dXJuIFhGU19FUlJPUihFRVhJU1QpOworCXNiZmxhZ3MgfD0gWEZTX1NCX1FGTEFHUzsKKworCWlmICgoZXJyb3IgPSB4ZnNfcW1fd3JpdGVfc2JfY2hhbmdlcyhtcCwgc2JmbGFncykpKQorCQlyZXR1cm4gKGVycm9yKTsKKwkvKgorCSAqIElmIHdlIGFyZW4ndCB0cnlpbmcgdG8gc3dpdGNoIG9uIHF1b3RhIGVuZm9yY2VtZW50LCB3ZSBhcmUgZG9uZS4KKwkgKi8KKwlpZiAgKCgobXAtPm1fc2Iuc2JfcWZsYWdzICYgWEZTX1VRVU9UQV9BQ0NUKSAhPQorCSAgICAgKG1wLT5tX3FmbGFncyAmIFhGU19VUVVPVEFfQUNDVCkpIHx8CisJICAgIChmbGFncyAmIFhGU19BTExfUVVPVEFfRU5GRCkgPT0gMCkKKwkJcmV0dXJuICgwKTsKKworCWlmICghIFhGU19JU19RVU9UQV9SVU5OSU5HKG1wKSkKKwkJcmV0dXJuIFhGU19FUlJPUihFU1JDSCk7CisKKwkvKgorCSAqIFN3aXRjaCBvbiBxdW90YSBlbmZvcmNlbWVudCBpbiBjb3JlLgorCSAqLworCW11dGV4X2xvY2soJihYRlNfUUlfUU9GRkxPQ0sobXApKSwgUElOT0QpOworCW1wLT5tX3FmbGFncyB8PSAoZmxhZ3MgJiBYRlNfQUxMX1FVT1RBX0VORkQpOworCW11dGV4X3VubG9jaygmKFhGU19RSV9RT0ZGTE9DSyhtcCkpKTsKKworCXJldHVybiAoMCk7Cit9CisKKworCisvKgorICogUmV0dXJuIHF1b3RhIHN0YXR1cyBpbmZvcm1hdGlvbiwgc3VjaCBhcyB1cXVvdGEtb2ZmLCBlbmZvcmNlbWVudHMsIGV0Yy4KKyAqLworU1RBVElDIGludAoreGZzX3FtX3NjYWxsX2dldHFzdGF0KAorCXhmc19tb3VudF90CSptcCwKKwlmc19xdW90YV9zdGF0X3QgKm91dCkKK3sKKwl4ZnNfaW5vZGVfdAkqdWlwLCAqZ2lwOworCWJvb2xlYW5fdAl0ZW1wdXFpcCwgdGVtcGdxaXA7CisKKwl1aXAgPSBnaXAgPSBOVUxMOworCXRlbXB1cWlwID0gdGVtcGdxaXAgPSBCX0ZBTFNFOworCW1lbXNldChvdXQsIDAsIHNpemVvZihmc19xdW90YV9zdGF0X3QpKTsKKworCW91dC0+cXNfdmVyc2lvbiA9IEZTX1FTVEFUX1ZFUlNJT047CisJaWYgKCEgWEZTX1NCX1ZFUlNJT05fSEFTUVVPVEEoJm1wLT5tX3NiKSkgeworCQlvdXQtPnFzX3VxdW90YS5xZnNfaW5vID0gTlVMTEZTSU5POworCQlvdXQtPnFzX2dxdW90YS5xZnNfaW5vID0gTlVMTEZTSU5POworCQlyZXR1cm4gKDApOworCX0KKwlvdXQtPnFzX2ZsYWdzID0gKF9fdWludDE2X3QpIHhmc19xbV9leHBvcnRfZmxhZ3MobXAtPm1fcWZsYWdzICYKKwkJCQkJCQkoWEZTX0FMTF9RVU9UQV9BQ0NUfAorCQkJCQkJCSBYRlNfQUxMX1FVT1RBX0VORkQpKTsKKwlvdXQtPnFzX3BhZCA9IDA7CisJb3V0LT5xc191cXVvdGEucWZzX2lubyA9IG1wLT5tX3NiLnNiX3VxdW90aW5vOworCW91dC0+cXNfZ3F1b3RhLnFmc19pbm8gPSBtcC0+bV9zYi5zYl9ncXVvdGlubzsKKworCWlmIChtcC0+bV9xdW90YWluZm8pIHsKKwkJdWlwID0gbXAtPm1fcXVvdGFpbmZvLT5xaV91cXVvdGFpcDsKKwkJZ2lwID0gbXAtPm1fcXVvdGFpbmZvLT5xaV9ncXVvdGFpcDsKKwl9CisJaWYgKCF1aXAgJiYgbXAtPm1fc2Iuc2JfdXF1b3Rpbm8gIT0gTlVMTEZTSU5PKSB7CisJCWlmICh4ZnNfaWdldChtcCwgTlVMTCwgbXAtPm1fc2Iuc2JfdXF1b3Rpbm8sCisJCQkJCTAsIDAsICZ1aXAsIDApID09IDApCisJCQl0ZW1wdXFpcCA9IEJfVFJVRTsKKwl9CisJaWYgKCFnaXAgJiYgbXAtPm1fc2Iuc2JfZ3F1b3Rpbm8gIT0gTlVMTEZTSU5PKSB7CisJCWlmICh4ZnNfaWdldChtcCwgTlVMTCwgbXAtPm1fc2Iuc2JfZ3F1b3Rpbm8sCisJCQkJCTAsIDAsICZnaXAsIDApID09IDApCisJCQl0ZW1wZ3FpcCA9IEJfVFJVRTsKKwl9CisJaWYgKHVpcCkgeworCQlvdXQtPnFzX3VxdW90YS5xZnNfbmJsa3MgPSB1aXAtPmlfZC5kaV9uYmxvY2tzOworCQlvdXQtPnFzX3VxdW90YS5xZnNfbmV4dGVudHMgPSB1aXAtPmlfZC5kaV9uZXh0ZW50czsKKwkJaWYgKHRlbXB1cWlwKQorCQkJVk5fUkVMRShYRlNfSVRPVih1aXApKTsKKwl9CisJaWYgKGdpcCkgeworCQlvdXQtPnFzX2dxdW90YS5xZnNfbmJsa3MgPSBnaXAtPmlfZC5kaV9uYmxvY2tzOworCQlvdXQtPnFzX2dxdW90YS5xZnNfbmV4dGVudHMgPSBnaXAtPmlfZC5kaV9uZXh0ZW50czsKKwkJaWYgKHRlbXBncWlwKQorCQkJVk5fUkVMRShYRlNfSVRPVihnaXApKTsKKwl9CisJaWYgKG1wLT5tX3F1b3RhaW5mbykgeworCQlvdXQtPnFzX2luY29yZWRxcyA9IFhGU19RSV9NUExORFFVT1RTKG1wKTsKKwkJb3V0LT5xc19idGltZWxpbWl0ID0gWEZTX1FJX0JUSU1FTElNSVQobXApOworCQlvdXQtPnFzX2l0aW1lbGltaXQgPSBYRlNfUUlfSVRJTUVMSU1JVChtcCk7CisJCW91dC0+cXNfcnRidGltZWxpbWl0ID0gWEZTX1FJX1JUQlRJTUVMSU1JVChtcCk7CisJCW91dC0+cXNfYndhcm5saW1pdCA9IFhGU19RSV9CV0FSTkxJTUlUKG1wKTsKKwkJb3V0LT5xc19pd2FybmxpbWl0ID0gWEZTX1FJX0lXQVJOTElNSVQobXApOworCX0KKwlyZXR1cm4gKDApOworfQorCisvKgorICogQWRqdXN0IHF1b3RhIGxpbWl0cywgYW5kIHN0YXJ0L3N0b3AgdGltZXJzIGFjY29yZGluZ2x5LgorICovCitTVEFUSUMgaW50Cit4ZnNfcW1fc2NhbGxfc2V0cWxpbSgKKwl4ZnNfbW91bnRfdAkJKm1wLAorCXhmc19kcWlkX3QJCWlkLAorCXVpbnQJCQl0eXBlLAorCWZzX2Rpc2tfcXVvdGFfdAkJKm5ld2xpbSkKK3sKKwl4ZnNfZGlza19kcXVvdF90CSpkZHE7CisJeGZzX2RxdW90X3QJCSpkcXA7CisJeGZzX3RyYW5zX3QJCSp0cDsKKwlpbnQJCQllcnJvcjsKKwl4ZnNfcWNudF90CQloYXJkLCBzb2Z0OworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVQRVJNKTsKKworCWlmICgobmV3bGltLT5kX2ZpZWxkbWFzayAmIChGU19EUV9MSU1JVF9NQVNLfEZTX0RRX1RJTUVSX01BU0spKSA9PSAwKQorCQlyZXR1cm4gKDApOworCisJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19RTV9TRVRRTElNKTsKKwlpZiAoKGVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsIHNpemVvZih4ZnNfZGlza19kcXVvdF90KSArIDEyOCwKKwkJCQkgICAgICAwLCAwLCBYRlNfREVGQVVMVF9MT0dfQ09VTlQpKSkgeworCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCAwKTsKKwkJcmV0dXJuIChlcnJvcik7CisJfQorCisJLyoKKwkgKiBXZSBkb24ndCB3YW50IHRvIHJhY2Ugd2l0aCBhIHF1b3Rhb2ZmIHNvIHRha2UgdGhlIHF1b3Rhb2ZmIGxvY2suCisJICogKFdlIGRvbid0IGhvbGQgYW4gaW5vZGUgbG9jaywgc28gdGhlcmUncyBub3RoaW5nIGVsc2UgdG8gc3RvcAorCSAqIGEgcXVvdGFvZmYgZnJvbSBoYXBwZW5pbmcpLiAoWFhYVGhpcyBkb2Vzbid0IGN1cnJlbnRseSBoYXBwZW4KKwkgKiBiZWNhdXNlIHdlIHRha2UgdGhlIHZmc2xvY2sgYmVmb3JlIGNhbGxpbmcgeGZzX3FtX3N5c2VudCkuCisJICovCisJbXV0ZXhfbG9jaygmKFhGU19RSV9RT0ZGTE9DSyhtcCkpLCBQSU5PRCk7CisKKwkvKgorCSAqIEdldCB0aGUgZHF1b3QgKGxvY2tlZCksIGFuZCBqb2luIGl0IHRvIHRoZSB0cmFuc2FjdGlvbi4KKwkgKiBBbGxvY2F0ZSB0aGUgZHF1b3QgaWYgdGhpcyBkb2Vzbid0IGV4aXN0LgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfcW1fZHFnZXQobXAsIE5VTEwsIGlkLCB0eXBlLCBYRlNfUU1PUFRfRFFBTExPQywgJmRxcCkpKSB7CisJCXhmc190cmFuc19jYW5jZWwodHAsIFhGU19UUkFOU19BQk9SVCk7CisJCW11dGV4X3VubG9jaygmKFhGU19RSV9RT0ZGTE9DSyhtcCkpKTsKKwkJQVNTRVJUKGVycm9yICE9IEVOT0VOVCk7CisJCXJldHVybiAoZXJyb3IpOworCX0KKwl4ZnNfZHF0cmFjZV9lbnRyeShkcXAsICJRX1NFVFFMSU06IEFGVCBEUUdFVCIpOworCXhmc190cmFuc19kcWpvaW4odHAsIGRxcCk7CisJZGRxID0gJmRxcC0+cV9jb3JlOworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhhdCBoYXJkbGltaXRzIGFyZSA+PSBzb2Z0IGxpbWl0cyBiZWZvcmUgY2hhbmdpbmcuCisJICovCisJaGFyZCA9IChuZXdsaW0tPmRfZmllbGRtYXNrICYgRlNfRFFfQkhBUkQpID8KKwkJKHhmc19xY250X3QpIFhGU19CQl9UT19GU0IobXAsIG5ld2xpbS0+ZF9ibGtfaGFyZGxpbWl0KSA6CisJCQlJTlRfR0VUKGRkcS0+ZF9ibGtfaGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQpOworCXNvZnQgPSAobmV3bGltLT5kX2ZpZWxkbWFzayAmIEZTX0RRX0JTT0ZUKSA/CisJCSh4ZnNfcWNudF90KSBYRlNfQkJfVE9fRlNCKG1wLCBuZXdsaW0tPmRfYmxrX3NvZnRsaW1pdCkgOgorCQkJSU5UX0dFVChkZHEtPmRfYmxrX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJUKTsKKwlpZiAoaGFyZCA9PSAwIHx8IGhhcmQgPj0gc29mdCkgeworCQlJTlRfU0VUKGRkcS0+ZF9ibGtfaGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQsIGhhcmQpOworCQlJTlRfU0VUKGRkcS0+ZF9ibGtfc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQsIHNvZnQpOworCQlpZiAoaWQgPT0gMCkgeworCQkJbXAtPm1fcXVvdGFpbmZvLT5xaV9iaGFyZGxpbWl0ID0gaGFyZDsKKwkJCW1wLT5tX3F1b3RhaW5mby0+cWlfYnNvZnRsaW1pdCA9IHNvZnQ7CisJCX0KKwl9IGVsc2UgeworCQlxZHByaW50aygiYmxraGFyZCAlTGQgPCBibGtzb2Z0ICVMZFxuIiwgaGFyZCwgc29mdCk7CisJfQorCWhhcmQgPSAobmV3bGltLT5kX2ZpZWxkbWFzayAmIEZTX0RRX1JUQkhBUkQpID8KKwkJKHhmc19xY250X3QpIFhGU19CQl9UT19GU0IobXAsIG5ld2xpbS0+ZF9ydGJfaGFyZGxpbWl0KSA6CisJCQlJTlRfR0VUKGRkcS0+ZF9ydGJfaGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQpOworCXNvZnQgPSAobmV3bGltLT5kX2ZpZWxkbWFzayAmIEZTX0RRX1JUQlNPRlQpID8KKwkJKHhmc19xY250X3QpIFhGU19CQl9UT19GU0IobXAsIG5ld2xpbS0+ZF9ydGJfc29mdGxpbWl0KSA6CisJCQlJTlRfR0VUKGRkcS0+ZF9ydGJfc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpOworCWlmIChoYXJkID09IDAgfHwgaGFyZCA+PSBzb2Z0KSB7CisJCUlOVF9TRVQoZGRxLT5kX3J0Yl9oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCwgaGFyZCk7CisJCUlOVF9TRVQoZGRxLT5kX3J0Yl9zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCwgc29mdCk7CisJCWlmIChpZCA9PSAwKSB7CisJCQltcC0+bV9xdW90YWluZm8tPnFpX3J0YmhhcmRsaW1pdCA9IGhhcmQ7CisJCQltcC0+bV9xdW90YWluZm8tPnFpX3J0YnNvZnRsaW1pdCA9IHNvZnQ7CisJCX0KKwl9IGVsc2UgeworCQlxZHByaW50aygicnRiaGFyZCAlTGQgPCBydGJzb2Z0ICVMZFxuIiwgaGFyZCwgc29mdCk7CisJfQorCisJaGFyZCA9IChuZXdsaW0tPmRfZmllbGRtYXNrICYgRlNfRFFfSUhBUkQpID8KKwkJKHhmc19xY250X3QpIG5ld2xpbS0+ZF9pbm9faGFyZGxpbWl0IDoKKwkJCUlOVF9HRVQoZGRxLT5kX2lub19oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCk7CisJc29mdCA9IChuZXdsaW0tPmRfZmllbGRtYXNrICYgRlNfRFFfSVNPRlQpID8KKwkJKHhmc19xY250X3QpIG5ld2xpbS0+ZF9pbm9fc29mdGxpbWl0IDoKKwkJCUlOVF9HRVQoZGRxLT5kX2lub19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCk7CisJaWYgKGhhcmQgPT0gMCB8fCBoYXJkID49IHNvZnQpIHsKKwkJSU5UX1NFVChkZHEtPmRfaW5vX2hhcmRsaW1pdCwgQVJDSF9DT05WRVJULCBoYXJkKTsKKwkJSU5UX1NFVChkZHEtPmRfaW5vX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJULCBzb2Z0KTsKKwkJaWYgKGlkID09IDApIHsKKwkJCW1wLT5tX3F1b3RhaW5mby0+cWlfaWhhcmRsaW1pdCA9IGhhcmQ7CisJCQltcC0+bV9xdW90YWluZm8tPnFpX2lzb2Z0bGltaXQgPSBzb2Z0OworCQl9CisJfSBlbHNlIHsKKwkJcWRwcmludGsoImloYXJkICVMZCA8IGlzb2Z0ICVMZFxuIiwgaGFyZCwgc29mdCk7CisJfQorCisJaWYgKGlkID09IDApIHsKKwkJLyoKKwkJICogVGltZWxpbWl0cyBmb3IgdGhlIHN1cGVyIHVzZXIgc2V0IHRoZSByZWxhdGl2ZSB0aW1lCisJCSAqIHRoZSBvdGhlciB1c2VycyBjYW4gYmUgb3ZlciBxdW90YSBmb3IgdGhpcyBmaWxlIHN5c3RlbS4KKwkJICogSWYgaXQgaXMgemVybyBhIGRlZmF1bHQgaXMgdXNlZC4gIERpdHRvIGZvciB0aGUgZGVmYXVsdAorCQkgKiBzb2Z0IGFuZCBoYXJkIGxpbWl0IHZhbHVlcyAoYWxyZWFkeSBkb25lLCBhYm92ZSkuCisJCSAqLworCQlpZiAobmV3bGltLT5kX2ZpZWxkbWFzayAmIEZTX0RRX0JUSU1FUikgeworCQkJbXAtPm1fcXVvdGFpbmZvLT5xaV9idGltZWxpbWl0ID0gbmV3bGltLT5kX2J0aW1lcjsKKwkJCUlOVF9TRVQoZGRxLT5kX2J0aW1lciwgQVJDSF9DT05WRVJULCBuZXdsaW0tPmRfYnRpbWVyKTsKKwkJfQorCQlpZiAobmV3bGltLT5kX2ZpZWxkbWFzayAmIEZTX0RRX0lUSU1FUikgeworCQkJbXAtPm1fcXVvdGFpbmZvLT5xaV9pdGltZWxpbWl0ID0gbmV3bGltLT5kX2l0aW1lcjsKKwkJCUlOVF9TRVQoZGRxLT5kX2l0aW1lciwgQVJDSF9DT05WRVJULCBuZXdsaW0tPmRfaXRpbWVyKTsKKwkJfQorCQlpZiAobmV3bGltLT5kX2ZpZWxkbWFzayAmIEZTX0RRX1JUQlRJTUVSKSB7CisJCQltcC0+bV9xdW90YWluZm8tPnFpX3J0YnRpbWVsaW1pdCA9IG5ld2xpbS0+ZF9ydGJ0aW1lcjsKKwkJCUlOVF9TRVQoZGRxLT5kX3J0YnRpbWVyLCBBUkNIX0NPTlZFUlQsIG5ld2xpbS0+ZF9ydGJ0aW1lcik7CisJCX0KKwl9IGVsc2UgLyogaWYgKFhGU19JU19RVU9UQV9FTkZPUkNFRChtcCkpICovIHsKKwkJLyoKKwkJICogSWYgdGhlIHVzZXIgaXMgbm93IG92ZXIgcXVvdGEsIHN0YXJ0IHRoZSB0aW1lbGltaXQuCisJCSAqIFRoZSB1c2VyIHdpbGwgbm90IGJlICd3YXJuZWQnLgorCQkgKiBOb3RlIHRoYXQgd2Uga2VlcCB0aGUgdGltZXJzIHRpY2tpbmcsIHdoZXRoZXIgZW5mb3JjZW1lbnQKKwkJICogaXMgb24gb3Igb2ZmLiBXZSBkb24ndCByZWFsbHkgd2FudCB0byBib3RoZXIgd2l0aCBpdGVyYXRpbmcKKwkJICogb3ZlciBhbGwgb25kaXNrIGRxdW90cyBhbmQgdHVybmluZyB0aGUgdGltZXJzIG9uL29mZi4KKwkJICovCisJCXhmc19xbV9hZGp1c3RfZHF0aW1lcnMobXAsIGRkcSk7CisJfQorCWRxcC0+ZHFfZmxhZ3MgfD0gWEZTX0RRX0RJUlRZOworCXhmc190cmFuc19sb2dfZHF1b3QodHAsIGRxcCk7CisKKwl4ZnNfZHF0cmFjZV9lbnRyeShkcXAsICJRX1NFVFFMSU06IENPTU1JVCIpOworCXhmc190cmFuc19jb21taXQodHAsIDAsIE5VTEwpOworCXhmc19xbV9kcXByaW50KGRxcCk7CisJeGZzX3FtX2RxcmVsZShkcXApOworCW11dGV4X3VubG9jaygmKFhGU19RSV9RT0ZGTE9DSyhtcCkpKTsKKworCXJldHVybiAoMCk7Cit9CisKK1NUQVRJQyBpbnQKK3hmc19xbV9zY2FsbF9nZXRxdW90YSgKKwl4ZnNfbW91bnRfdAkqbXAsCisJeGZzX2RxaWRfdAlpZCwKKwl1aW50CQl0eXBlLAorCWZzX2Rpc2tfcXVvdGFfdCAqb3V0KQoreworCXhmc19kcXVvdF90CSpkcXA7CisJaW50CQllcnJvcjsKKworCS8qCisJICogVHJ5IHRvIGdldCB0aGUgZHF1b3QuIFdlIGRvbid0IHdhbnQgaXQgYWxsb2NhdGVkIG9uIGRpc2ssIHNvCisJICogd2UgYXJlbid0IHBhc3NpbmcgdGhlIFhGU19RTU9QVF9ET0FMTE9DIGZsYWcuIElmIGl0IGRvZXNuJ3QKKwkgKiBleGlzdCwgd2UnbGwgZ2V0IEVOT0VOVCBiYWNrLgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfcW1fZHFnZXQobXAsIE5VTEwsIGlkLCB0eXBlLCAwLCAmZHFwKSkpIHsKKwkJcmV0dXJuIChlcnJvcik7CisJfQorCisJeGZzX2RxdHJhY2VfZW50cnkoZHFwLCAiUV9HRVRRVU9UQSBTVUNDRVNTIik7CisJLyoKKwkgKiBJZiBldmVyeXRoaW5nJ3MgTlVMTCwgdGhpcyBkcXVvdCBkb2Vzbid0IHF1aXRlIGV4aXN0IGFzIGZhciBhcworCSAqIG91ciB1dGlsaXR5IHByb2dyYW1zIGFyZSBjb25jZXJuZWQuCisJICovCisJaWYgKFhGU19JU19EUVVPVF9VTklOSVRJQUxJWkVEKGRxcCkpIHsKKwkJeGZzX3FtX2RxcHV0KGRxcCk7CisJCXJldHVybiBYRlNfRVJST1IoRU5PRU5UKTsKKwl9CisJLyogeGZzX3FtX2RxcHJpbnQoZHFwKTsgKi8KKwkvKgorCSAqIENvbnZlcnQgdGhlIGRpc2sgZHF1b3QgdG8gdGhlIGV4cG9ydGFibGUgZm9ybWF0CisJICovCisJeGZzX3FtX2V4cG9ydF9kcXVvdChtcCwgJmRxcC0+cV9jb3JlLCBvdXQpOworCXhmc19xbV9kcXB1dChkcXApOworCXJldHVybiAoZXJyb3IgPyBYRlNfRVJST1IoRUZBVUxUKSA6IDApOworfQorCisKK1NUQVRJQyBpbnQKK3hmc19xbV9sb2dfcXVvdGFvZmZfZW5kKAorCXhmc19tb3VudF90CQkqbXAsCisJeGZzX3FvZmZfbG9naXRlbV90CSpzdGFydHFvZmYsCisJdWludAkJCWZsYWdzKQoreworCXhmc190cmFuc190CSAgICAgICAqdHA7CisJaW50CQkJZXJyb3I7CisJeGZzX3FvZmZfbG9naXRlbV90ICAgICAqcW9mZmk7CisKKwl0cCA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX1FNX1FVT1RBT0ZGX0VORCk7CisKKwlpZiAoKGVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsIHNpemVvZih4ZnNfcW9mZl9sb2dpdGVtX3QpICogMiwKKwkJCQkgICAgICAwLCAwLCBYRlNfREVGQVVMVF9MT0dfQ09VTlQpKSkgeworCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCAwKTsKKwkJcmV0dXJuIChlcnJvcik7CisJfQorCisJcW9mZmkgPSB4ZnNfdHJhbnNfZ2V0X3FvZmZfaXRlbSh0cCwgc3RhcnRxb2ZmLAorCQkJCQlmbGFncyAmIFhGU19BTExfUVVPVEFfQUNDVCk7CisJeGZzX3RyYW5zX2xvZ19xdW90YW9mZl9pdGVtKHRwLCBxb2ZmaSk7CisKKwkvKgorCSAqIFdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIGlzIHNlY3VyZSBvbiBkaXNrIGJlZm9yZSB3ZQorCSAqIHJldHVybiBhbmQgYWN0dWFsbHkgc3RvcCBxdW90YSBhY2NvdW50aW5nLiBTbywgbWFrZSBpdCBzeW5jaHJvbm91cy4KKwkgKiBXZSBkb24ndCBjYXJlIGFib3V0IHF1b3RvZmYncyBwZXJmb3JtYW5jZS4KKwkgKi8KKwl4ZnNfdHJhbnNfc2V0X3N5bmModHApOworCWVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwgMCwgTlVMTCk7CisJcmV0dXJuIChlcnJvcik7Cit9CisKKworU1RBVElDIGludAoreGZzX3FtX2xvZ19xdW90YW9mZigKKwl4ZnNfbW91bnRfdAkgICAgICAgKm1wLAorCXhmc19xb2ZmX2xvZ2l0ZW1fdCAgICAgKipxb2Zmc3RhcnRwLAorCXVpbnQJCSAgICAgICBmbGFncykKK3sKKwl4ZnNfdHJhbnNfdAkgICAgICAgKnRwOworCWludAkJCWVycm9yOworCXVuc2lnbmVkIGxvbmcJczsKKwl4ZnNfcW9mZl9sb2dpdGVtX3QgICAgICpxb2ZmaT1OVUxMOworCXVpbnQJCQlvbGRzYnFmbGFnPTA7CisKKwl0cCA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX1FNX1FVT1RBT0ZGKTsKKwlpZiAoKGVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsCisJCQkJICAgICAgc2l6ZW9mKHhmc19xb2ZmX2xvZ2l0ZW1fdCkgKiAyICsKKwkJCQkgICAgICBtcC0+bV9zYi5zYl9zZWN0c2l6ZSArIDEyOCwKKwkJCQkgICAgICAwLAorCQkJCSAgICAgIDAsCisJCQkJICAgICAgWEZTX0RFRkFVTFRfTE9HX0NPVU5UKSkpIHsKKwkJZ290byBlcnJvcjA7CisJfQorCisJcW9mZmkgPSB4ZnNfdHJhbnNfZ2V0X3FvZmZfaXRlbSh0cCwgTlVMTCwgZmxhZ3MgJiBYRlNfQUxMX1FVT1RBX0FDQ1QpOworCXhmc190cmFuc19sb2dfcXVvdGFvZmZfaXRlbSh0cCwgcW9mZmkpOworCisJcyA9IFhGU19TQl9MT0NLKG1wKTsKKwlvbGRzYnFmbGFnID0gbXAtPm1fc2Iuc2JfcWZsYWdzOworCW1wLT5tX3NiLnNiX3FmbGFncyA9IChtcC0+bV9xZmxhZ3MgJiB+KGZsYWdzKSkgJiBYRlNfTU9VTlRfUVVPVEFfQUxMOworCVhGU19TQl9VTkxPQ0sobXAsIHMpOworCisJeGZzX21vZF9zYih0cCwgWEZTX1NCX1FGTEFHUyk7CisKKwkvKgorCSAqIFdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIGlzIHNlY3VyZSBvbiBkaXNrIGJlZm9yZSB3ZQorCSAqIHJldHVybiBhbmQgYWN0dWFsbHkgc3RvcCBxdW90YSBhY2NvdW50aW5nLiBTbywgbWFrZSBpdCBzeW5jaHJvbm91cy4KKwkgKiBXZSBkb24ndCBjYXJlIGFib3V0IHF1b3RvZmYncyBwZXJmb3JtYW5jZS4KKwkgKi8KKwl4ZnNfdHJhbnNfc2V0X3N5bmModHApOworCWVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwgMCwgTlVMTCk7CisKK2Vycm9yMDoKKwlpZiAoZXJyb3IpIHsKKwkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgMCk7CisJCS8qCisJCSAqIE5vIG9uZSBlbHNlIGlzIG1vZGlmeWluZyBzYl9xZmxhZ3MsIHNvIHRoaXMgaXMgT0suCisJCSAqIFdlIHN0aWxsIGhvbGQgdGhlIHF1b3Rhb2ZmbG9jay4KKwkJICovCisJCXMgPSBYRlNfU0JfTE9DSyhtcCk7CisJCW1wLT5tX3NiLnNiX3FmbGFncyA9IG9sZHNicWZsYWc7CisJCVhGU19TQl9VTkxPQ0sobXAsIHMpOworCX0KKwkqcW9mZnN0YXJ0cCA9IHFvZmZpOworCXJldHVybiAoZXJyb3IpOworfQorCisKKy8qCisgKiBUcmFuc2xhdGUgYW4gaW50ZXJuYWwgc3R5bGUgb24tZGlzay1kcXVvdCB0byB0aGUgZXhwb3J0YWJsZSBmb3JtYXQuCisgKiBUaGUgbWFpbiBkaWZmZXJlbmNlcyBhcmUgdGhhdCB0aGUgY291bnRlcnMvbGltaXRzIGFyZSBhbGwgaW4gQmFzaWMKKyAqIEJsb2NrcyAoQkJzKSBpbnN0ZWFkIG9mIHRoZSBpbnRlcm5hbCBGU0JzLCBhbmQgYWxsIG9uLWRpc2sgZGF0YSBoYXMKKyAqIHRvIGJlIGNvbnZlcnRlZCB0byB0aGUgbmF0aXZlIGVuZGlhbm5lc3MuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfcW1fZXhwb3J0X2RxdW90KAorCXhmc19tb3VudF90CQkqbXAsCisJeGZzX2Rpc2tfZHF1b3RfdAkqc3JjLAorCXN0cnVjdCBmc19kaXNrX3F1b3RhCSpkc3QpCit7CisJbWVtc2V0KGRzdCwgMCwgc2l6ZW9mKCpkc3QpKTsKKwlkc3QtPmRfdmVyc2lvbiA9IEZTX0RRVU9UX1ZFUlNJT047ICAvKiBkaWZmZXJlbnQgZnJvbSBzcmMtPmRfdmVyc2lvbiAqLworCWRzdC0+ZF9mbGFncyA9CisJCXhmc19xbV9leHBvcnRfcXR5cGVfZmxhZ3MoSU5UX0dFVChzcmMtPmRfZmxhZ3MsIEFSQ0hfQ09OVkVSVCkpOworCWRzdC0+ZF9pZCA9IElOVF9HRVQoc3JjLT5kX2lkLCBBUkNIX0NPTlZFUlQpOworCWRzdC0+ZF9ibGtfaGFyZGxpbWl0ID0gKF9fdWludDY0X3QpCisJCVhGU19GU0JfVE9fQkIobXAsIElOVF9HRVQoc3JjLT5kX2Jsa19oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCkpOworCWRzdC0+ZF9ibGtfc29mdGxpbWl0ID0gKF9fdWludDY0X3QpCisJCVhGU19GU0JfVE9fQkIobXAsIElOVF9HRVQoc3JjLT5kX2Jsa19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkpOworCWRzdC0+ZF9pbm9faGFyZGxpbWl0ID0gKF9fdWludDY0X3QpCisJCUlOVF9HRVQoc3JjLT5kX2lub19oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCk7CisJZHN0LT5kX2lub19zb2Z0bGltaXQgPSAoX191aW50NjRfdCkKKwkJSU5UX0dFVChzcmMtPmRfaW5vX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJUKTsKKwlkc3QtPmRfYmNvdW50ID0gKF9fdWludDY0X3QpCisJCVhGU19GU0JfVE9fQkIobXAsIElOVF9HRVQoc3JjLT5kX2Jjb3VudCwgQVJDSF9DT05WRVJUKSk7CisJZHN0LT5kX2ljb3VudCA9IChfX3VpbnQ2NF90KSBJTlRfR0VUKHNyYy0+ZF9pY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJZHN0LT5kX2J0aW1lciA9IChfX3VpbnQzMl90KSBJTlRfR0VUKHNyYy0+ZF9idGltZXIsIEFSQ0hfQ09OVkVSVCk7CisJZHN0LT5kX2l0aW1lciA9IChfX3VpbnQzMl90KSBJTlRfR0VUKHNyYy0+ZF9pdGltZXIsIEFSQ0hfQ09OVkVSVCk7CisJZHN0LT5kX2l3YXJucyA9IElOVF9HRVQoc3JjLT5kX2l3YXJucywgQVJDSF9DT05WRVJUKTsKKwlkc3QtPmRfYndhcm5zID0gSU5UX0dFVChzcmMtPmRfYndhcm5zLCBBUkNIX0NPTlZFUlQpOworCisJZHN0LT5kX3J0Yl9oYXJkbGltaXQgPSAoX191aW50NjRfdCkKKwkJWEZTX0ZTQl9UT19CQihtcCwgSU5UX0dFVChzcmMtPmRfcnRiX2hhcmRsaW1pdCwgQVJDSF9DT05WRVJUKSk7CisJZHN0LT5kX3J0Yl9zb2Z0bGltaXQgPSAoX191aW50NjRfdCkKKwkJWEZTX0ZTQl9UT19CQihtcCwgSU5UX0dFVChzcmMtPmRfcnRiX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJUKSk7CisJZHN0LT5kX3J0YmNvdW50ID0gKF9fdWludDY0X3QpCisJCVhGU19GU0JfVE9fQkIobXAsIElOVF9HRVQoc3JjLT5kX3J0YmNvdW50LCBBUkNIX0NPTlZFUlQpKTsKKwlkc3QtPmRfcnRidGltZXIgPSAoX191aW50MzJfdCkgSU5UX0dFVChzcmMtPmRfcnRidGltZXIsIEFSQ0hfQ09OVkVSVCk7CisJZHN0LT5kX3J0Yndhcm5zID0gSU5UX0dFVChzcmMtPmRfcnRid2FybnMsIEFSQ0hfQ09OVkVSVCk7CisKKwkvKgorCSAqIEludGVybmFsbHksIHdlIGRvbid0IHJlc2V0IGFsbCB0aGUgdGltZXJzIHdoZW4gcXVvdGEgZW5mb3JjZW1lbnQKKwkgKiBnZXRzIHR1cm5lZCBvZmYuIE5vIG5lZWQgdG8gY29uZnVzZSB0aGUgdXNlcmxldmVsIGNvZGUsCisJICogc28gcmV0dXJuIHplcm9lcyBpbiB0aGF0IGNhc2UuCisJICovCisJaWYgKCEgWEZTX0lTX1FVT1RBX0VORk9SQ0VEKG1wKSkgeworCQlkc3QtPmRfYnRpbWVyID0gMDsKKwkJZHN0LT5kX2l0aW1lciA9IDA7CisJCWRzdC0+ZF9ydGJ0aW1lciA9IDA7CisJfQorCisjaWZkZWYgREVCVUcKKwlpZiAoWEZTX0lTX1FVT1RBX0VORk9SQ0VEKG1wKSAmJiBkc3QtPmRfaWQgIT0gMCkgeworCQlpZiAoKChpbnQpIGRzdC0+ZF9iY291bnQgPj0gKGludCkgZHN0LT5kX2Jsa19zb2Z0bGltaXQpICYmCisJCSAgICAoZHN0LT5kX2Jsa19zb2Z0bGltaXQgPiAwKSkgeworCQkJQVNTRVJUKGRzdC0+ZF9idGltZXIgIT0gMCk7CisJCX0KKwkJaWYgKCgoaW50KSBkc3QtPmRfaWNvdW50ID49IChpbnQpIGRzdC0+ZF9pbm9fc29mdGxpbWl0KSAmJgorCQkgICAgKGRzdC0+ZF9pbm9fc29mdGxpbWl0ID4gMCkpIHsKKwkJCUFTU0VSVChkc3QtPmRfaXRpbWVyICE9IDApOworCQl9CisJfQorI2VuZGlmCit9CisKK1NUQVRJQyB1aW50Cit4ZnNfcW1faW1wb3J0X3F0eXBlX2ZsYWdzKAorCXVpbnQgdWZsYWdzKQoreworCS8qCisJICogQ2FuJ3QgYmUgYm90aCBhdCB0aGUgc2FtZSB0aW1lLgorCSAqLworCWlmICgoKHVmbGFncyAmIChYRlNfR1JPVVBfUVVPVEEgfCBYRlNfVVNFUl9RVU9UQSkpID09CisJICAgICAoWEZTX0dST1VQX1FVT1RBIHwgWEZTX1VTRVJfUVVPVEEpKSB8fAorCSAgICAoKHVmbGFncyAmIChYRlNfR1JPVVBfUVVPVEEgfCBYRlNfVVNFUl9RVU9UQSkpID09IDApKQorCQlyZXR1cm4gKDApOworCisJcmV0dXJuICh1ZmxhZ3MgJiBYRlNfVVNFUl9RVU9UQSkgPworCQlYRlNfRFFfVVNFUiA6IFhGU19EUV9HUk9VUDsKK30KKworU1RBVElDIHVpbnQKK3hmc19xbV9leHBvcnRfcXR5cGVfZmxhZ3MoCisJdWludCBmbGFncykKK3sKKwkvKgorCSAqIENhbid0IGJlIGJvdGggYXQgdGhlIHNhbWUgdGltZS4KKwkgKi8KKwlBU1NFUlQoKGZsYWdzICYgKFhGU19HUk9VUF9RVU9UQSB8IFhGU19VU0VSX1FVT1RBKSkgIT0KKwkJKFhGU19HUk9VUF9RVU9UQSB8IFhGU19VU0VSX1FVT1RBKSk7CisJQVNTRVJUKChmbGFncyAmIChYRlNfR1JPVVBfUVVPVEEgfCBYRlNfVVNFUl9RVU9UQSkpICE9IDApOworCisJcmV0dXJuIChmbGFncyAmIFhGU19EUV9VU0VSKSA/CisJCVhGU19VU0VSX1FVT1RBIDogWEZTX0dST1VQX1FVT1RBOworfQorCitTVEFUSUMgdWludAoreGZzX3FtX2ltcG9ydF9mbGFncygKKwl1aW50IHVmbGFncykKK3sKKwl1aW50IGZsYWdzID0gMDsKKworCWlmICh1ZmxhZ3MgJiBYRlNfUVVPVEFfVURRX0FDQ1QpCisJCWZsYWdzIHw9IFhGU19VUVVPVEFfQUNDVDsKKwlpZiAodWZsYWdzICYgWEZTX1FVT1RBX0dEUV9BQ0NUKQorCQlmbGFncyB8PSBYRlNfR1FVT1RBX0FDQ1Q7CisJaWYgKHVmbGFncyAmIFhGU19RVU9UQV9VRFFfRU5GRCkKKwkJZmxhZ3MgfD0gWEZTX1VRVU9UQV9FTkZEOworCWlmICh1ZmxhZ3MgJiBYRlNfUVVPVEFfR0RRX0VORkQpCisJCWZsYWdzIHw9IFhGU19HUVVPVEFfRU5GRDsKKwlyZXR1cm4gKGZsYWdzKTsKK30KKworCitTVEFUSUMgdWludAoreGZzX3FtX2V4cG9ydF9mbGFncygKKwl1aW50IGZsYWdzKQoreworCXVpbnQgdWZsYWdzOworCisJdWZsYWdzID0gMDsKKwlpZiAoZmxhZ3MgJiBYRlNfVVFVT1RBX0FDQ1QpCisJCXVmbGFncyB8PSBYRlNfUVVPVEFfVURRX0FDQ1Q7CisJaWYgKGZsYWdzICYgWEZTX0dRVU9UQV9BQ0NUKQorCQl1ZmxhZ3MgfD0gWEZTX1FVT1RBX0dEUV9BQ0NUOworCWlmIChmbGFncyAmIFhGU19VUVVPVEFfRU5GRCkKKwkJdWZsYWdzIHw9IFhGU19RVU9UQV9VRFFfRU5GRDsKKwlpZiAoZmxhZ3MgJiBYRlNfR1FVT1RBX0VORkQpCisJCXVmbGFncyB8PSBYRlNfUVVPVEFfR0RRX0VORkQ7CisJcmV0dXJuICh1ZmxhZ3MpOworfQorCisKKy8qCisgKiBHbyB0aHJ1IGFsbCB0aGUgaW5vZGVzIGluIHRoZSBmaWxlIHN5c3RlbSwgcmVsZWFzaW5nIHRoZWlyIGRxdW90cy4KKyAqIE5vdGUgdGhhdCB0aGUgbW91bnQgc3RydWN0dXJlIGdldHMgbW9kaWZpZWQgdG8gaW5kaWNhdGUgdGhhdCBxdW90YXMgYXJlIG9mZgorICogQUZURVIgdGhpcywgaW4gdGhlIGNhc2Ugb2YgcXVvdGFvZmYuIFRoaXMgYWxzbyBnZXRzIGNhbGxlZCBmcm9tCisgKiB4ZnNfcm9vdHVtb3VudC4KKyAqLwordm9pZAoreGZzX3FtX2RxcmVsZV9hbGxfaW5vZGVzKAorCXN0cnVjdCB4ZnNfbW91bnQgKm1wLAorCXVpbnQJCSBmbGFncykKK3sKKwl2bWFwX3QJCXZtYXA7CisJeGZzX2lub2RlX3QJKmlwLCAqdG9waW5vOworCXVpbnQJCWlyZWNsYWltczsKKwl2bm9kZV90CQkqdnA7CisJYm9vbGVhbl90CXZub2RlX3JlZmQ7CisKKwlBU1NFUlQobXAtPm1fcXVvdGFpbmZvKTsKKworYWdhaW46CisJWEZTX01PVU5UX0lMT0NLKG1wKTsKKwlpcCA9IG1wLT5tX2lub2RlczsKKwlpZiAoaXAgPT0gTlVMTCkgeworCQlYRlNfTU9VTlRfSVVOTE9DSyhtcCk7CisJCXJldHVybjsKKwl9CisJZG8geworCQkvKiBTa2lwIG1hcmtlcnMgaW5zZXJ0ZWQgYnkgeGZzX3N5bmMgKi8KKwkJaWYgKGlwLT5pX21vdW50ID09IE5VTEwpIHsKKwkJCWlwID0gaXAtPmlfbW5leHQ7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBSb290IGlub2RlLCByYm1pcCBhbmQgcnN1bWlwIGhhdmUgYXNzb2NpYXRlZCBibG9ja3MgKi8KKwkJaWYgKGlwID09IFhGU19RSV9VUUlQKG1wKSB8fCBpcCA9PSBYRlNfUUlfR1FJUChtcCkpIHsKKwkJCUFTU0VSVChpcC0+aV91ZHF1b3QgPT0gTlVMTCk7CisJCQlBU1NFUlQoaXAtPmlfZ2RxdW90ID09IE5VTEwpOworCQkJaXAgPSBpcC0+aV9tbmV4dDsKKwkJCWNvbnRpbnVlOworCQl9CisJCXZwID0gWEZTX0lUT1ZfTlVMTChpcCk7CisJCWlmICghdnApIHsKKwkJCUFTU0VSVChpcC0+aV91ZHF1b3QgPT0gTlVMTCk7CisJCQlBU1NFUlQoaXAtPmlfZ2RxdW90ID09IE5VTEwpOworCQkJaXAgPSBpcC0+aV9tbmV4dDsKKwkJCWNvbnRpbnVlOworCQl9CisJCXZub2RlX3JlZmQgPSBCX0ZBTFNFOworCQlpZiAoeGZzX2lsb2NrX25vd2FpdChpcCwgWEZTX0lMT0NLX0VYQ0wpID09IDApIHsKKwkJCS8qCisJCQkgKiBTYW1wbGUgdnAgbWFwcGluZyB3aGlsZSBob2xkaW5nIHRoZSBtcGxvY2ssIGxlc3QKKwkJCSAqIHdlIGNvbWUgYWNyb3NzIGEgbm9uLWV4aXN0ZW50IHZub2RlLgorCQkJICovCisJCQlWTUFQKHZwLCB2bWFwKTsKKwkJCWlyZWNsYWltcyA9IG1wLT5tX2lyZWNsYWltczsKKwkJCXRvcGlubyA9IG1wLT5tX2lub2RlczsKKwkJCVhGU19NT1VOVF9JVU5MT0NLKG1wKTsKKworCQkJLyogWFhYIHJlc3RhcnQgbGltaXQgPyAqLworCQkJaWYgKCAhICh2cCA9IHZuX2dldCh2cCwgJnZtYXApKSkKKwkJCQlnb3RvIGFnYWluOworCQkJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCQl2bm9kZV9yZWZkID0gQl9UUlVFOworCQl9IGVsc2UgeworCQkJaXJlY2xhaW1zID0gbXAtPm1faXJlY2xhaW1zOworCQkJdG9waW5vID0gbXAtPm1faW5vZGVzOworCQkJWEZTX01PVU5UX0lVTkxPQ0sobXApOworCQl9CisKKwkJLyoKKwkJICogV2UgZG9uJ3Qga2VlcCB0aGUgbW91bnRsb2NrIGFjcm9zcyB0aGUgZHFyZWxlKCkgY2FsbCwKKwkJICogc2luY2UgaXQgY2FuIHRha2UgYSB3aGlsZS4uCisJCSAqLworCQlpZiAoKGZsYWdzICYgWEZTX1VRVU9UQV9BQ0NUKSAmJiBpcC0+aV91ZHF1b3QpIHsKKwkJCXhmc19xbV9kcXJlbGUoaXAtPmlfdWRxdW90KTsKKwkJCWlwLT5pX3VkcXVvdCA9IE5VTEw7CisJCX0KKwkJaWYgKChmbGFncyAmIFhGU19HUVVPVEFfQUNDVCkgJiYgaXAtPmlfZ2RxdW90KSB7CisJCQl4ZnNfcW1fZHFyZWxlKGlwLT5pX2dkcXVvdCk7CisJCQlpcC0+aV9nZHF1b3QgPSBOVUxMOworCQl9CisJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCS8qCisJCSAqIFdhaXQgdW50aWwgd2UndmUgZHJvcHBlZCB0aGUgaWxvY2sgYW5kIG1vdW50bG9jayB0bworCQkgKiBkbyB0aGUgdm5fcmVsZS4gT3IgYmUgY29uZGVtbmVkIHRvIGFuIGV0ZXJuaXR5IGluIHRoZQorCQkgKiBpbmFjdGl2ZSBjb2RlIGluIGhlbGwuCisJCSAqLworCQlpZiAodm5vZGVfcmVmZCkKKwkJCVZOX1JFTEUodnApOworCQlYRlNfTU9VTlRfSUxPQ0sobXApOworCQkvKgorCQkgKiBJZiBhbiBpbm9kZSB3YXMgaW5zZXJ0ZWQgb3IgcmVtb3ZlZCwgd2UgZ290dGEKKwkJICogc3RhcnQgb3ZlciBhZ2Fpbi4KKwkJICovCisJCWlmICh0b3Bpbm8gIT0gbXAtPm1faW5vZGVzIHx8IG1wLT5tX2lyZWNsYWltcyAhPSBpcmVjbGFpbXMpIHsKKwkJCS8qIFhYWCB1c2UgYSBzZW50aW5lbCAqLworCQkJWEZTX01PVU5UX0lVTkxPQ0sobXApOworCQkJZ290byBhZ2FpbjsKKwkJfQorCQlpcCA9IGlwLT5pX21uZXh0OworCX0gd2hpbGUgKGlwICE9IG1wLT5tX2lub2Rlcyk7CisKKwlYRlNfTU9VTlRfSVVOTE9DSyhtcCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZmRlZiBERUJVRworLyoKKyAqIFRoaXMgY29udGFpbnMgYWxsIHRoZSB0ZXN0IGZ1bmN0aW9ucyBmb3IgWEZTIGRpc2sgcXVvdGFzLgorICogQ3VycmVudGx5IGl0IGRvZXMgYSBxdW90YSBhY2NvdW50aW5nIGNoZWNrLiBpZS4gaXQgd2Fsa3MgdGhyb3VnaAorICogYWxsIGlub2RlcyBpbiB0aGUgZmlsZSBzeXN0ZW0sIGNhbGN1bGF0aW5nIHRoZSBkcXVvdCBhY2NvdW50aW5nIGZpZWxkcywKKyAqIGFuZCBwcmludHMgb3V0IGFueSBpbmNvbnNpc3RlbmNpZXMuCisgKi8KK3hmc19kcWhhc2hfdCAqcW10ZXN0X3VkcXRhYjsKK3hmc19kcWhhc2hfdCAqcW10ZXN0X2dkcXRhYjsKK2ludAkgICAgICBxbXRlc3RfaGFzaG1hc2s7CitpbnQJICAgICAgcW10ZXN0X25mYWlsczsKK211dGV4X3QJICAgICAgcWNoZWNrX2xvY2s7CisKKyNkZWZpbmUgRFFURVNUX0hBU0hWQUwobXAsIGlkKSAoKChfX3BzdW5zaWduZWRfdCkobXApICsgXAorCQkJCSAoX19wc3Vuc2lnbmVkX3QpKGlkKSkgJiBcCisJCQkJKHFtdGVzdF9oYXNobWFzayAtIDEpKQorCisjZGVmaW5lIERRVEVTVF9IQVNIKG1wLCBpZCwgdHlwZSkgICAoKHR5cGUgJiBYRlNfRFFfVVNFUikgPyBcCisJCQkJICAgICAocW10ZXN0X3VkcXRhYiArIFwKKwkJCQkgICAgICBEUVRFU1RfSEFTSFZBTChtcCwgaWQpKSA6IFwKKwkJCQkgICAgIChxbXRlc3RfZ2RxdGFiICsgXAorCQkJCSAgICAgIERRVEVTVF9IQVNIVkFMKG1wLCBpZCkpKQorCisjZGVmaW5lIERRVEVTVF9MSVNUX1BSSU5UKGwsIE5YVCwgdGl0bGUpIFwKK3sgXAorCSAgeGZzX2RxdGVzdF90CSpkcXA7IGludCBpID0gMDtcCisJICBjbW5fZXJyKENFX0RFQlVHLCAiJXMgKCMlZCkiLCB0aXRsZSwgKGludCkgKGwpLT5xaF9uZWxlbXMpOyBcCisJICBmb3IgKGRxcCA9ICh4ZnNfZHF0ZXN0X3QgKikobCktPnFoX25leHQ7IGRxcCAhPSBOVUxMOyBcCisJICAgICAgIGRxcCA9ICh4ZnNfZHF0ZXN0X3QgKilkcXAtPk5YVCkgeyBcCisJCWNtbl9lcnIoQ0VfREVCVUcsICIgICVkLiBcIiVkICglcylcIiAgYmNudCA9ICVkLCBpY250ID0gJWQiLCBcCisJCQkgKytpLCBkcXAtPmRfaWQsIERRRkxBR1RPX1RZUEVTVFIoZHFwKSwJICAgICBcCisJCQkgZHFwLT5kX2Jjb3VudCwgZHFwLT5kX2ljb3VudCk7IH0gXAorfQorCit0eXBlZGVmIHN0cnVjdCBkcXRlc3QgeworCXhmc19kcW1hcmtlcl90CXFfbGlzdHM7CisJeGZzX2RxaGFzaF90CSpxX2hhc2g7CS8qIHRoZSBoYXNoY2hhaW4gaGVhZGVyICovCisJeGZzX21vdW50X3QJKnFfbW91bnQ7CS8qIGZpbGVzeXN0ZW0gdGhpcyByZWxhdGVzIHRvICovCisJeGZzX2RxaWRfdAlkX2lkOwkJLyogdXNlciBpZCBvciBncm91cCBpZCAqLworCXhmc19xY250X3QJZF9iY291bnQ7CS8qICMgZGlzayBibG9ja3Mgb3duZWQgYnkgdGhlIHVzZXIgKi8KKwl4ZnNfcWNudF90CWRfaWNvdW50OwkvKiAjIGlub2RlcyBvd25lZCBieSB0aGUgdXNlciAqLworfSB4ZnNfZHF0ZXN0X3Q7CisKK1NUQVRJQyB2b2lkCit4ZnNfcW1faGFzaGluc2VydCh4ZnNfZHFoYXNoX3QgKmgsIHhmc19kcXRlc3RfdCAqZHFwKQoreworCXhmc19kcXVvdF90ICpkOworCWlmICgoKGQpID0gKGgpLT5xaF9uZXh0KSkKKwkJKGQpLT5ITF9QUkVWUCA9ICYoKGRxcCktPkhMX05FWFQpOworCShkcXApLT5ITF9ORVhUID0gZDsKKwkoZHFwKS0+SExfUFJFVlAgPSAmKChoKS0+cWhfbmV4dCk7CisJKGgpLT5xaF9uZXh0ID0gKHhmc19kcXVvdF90ICopZHFwOworCShoKS0+cWhfdmVyc2lvbisrOworCShoKS0+cWhfbmVsZW1zKys7Cit9CitTVEFUSUMgdm9pZAoreGZzX3FtX2RxdGVzdF9wcmludCgKKwl4ZnNfZHF0ZXN0X3QJKmQpCit7CisJY21uX2VycihDRV9ERUJVRywgIi0tLS0tLS0tLS0tRFFURVNUIERRVU9ULS0tLS0tLS0tLS0tLS0tLSIpOworCWNtbl9lcnIoQ0VfREVCVUcsICItLS0tIGRxdW90IElEID0gJWQiLCBkLT5kX2lkKTsKKwljbW5fZXJyKENFX0RFQlVHLCAiLS0tLSB0eXBlICAgICA9ICVzIiwgWEZTX1FNX0lTVURRKGQpPyAiVVNSIiA6ICJHUlAiKTsKKwljbW5fZXJyKENFX0RFQlVHLCAiLS0tLSBmcyAgICAgICA9IDB4JXAiLCBkLT5xX21vdW50KTsKKwljbW5fZXJyKENFX0RFQlVHLCAiLS0tLSBiY291bnQgICA9ICVMdSAoMHgleCkiLAorCQlkLT5kX2Jjb3VudCwgKGludClkLT5kX2Jjb3VudCk7CisJY21uX2VycihDRV9ERUJVRywgIi0tLS0gaWNvdW50ICAgPSAlTHUgKDB4JXgpIiwKKwkJZC0+ZF9pY291bnQsIChpbnQpZC0+ZF9pY291bnQpOworCWNtbl9lcnIoQ0VfREVCVUcsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKK30KKworU1RBVElDIHZvaWQKK3hmc19xbV9kcXRlc3RfZmFpbGVkKAorCXhmc19kcXRlc3RfdAkqZCwKKwl4ZnNfZHF1b3RfdAkqZHFwLAorCWNoYXIJCSpyZWFzb24sCisJeGZzX3FjbnRfdAlhLAorCXhmc19xY250X3QJYiwKKwlpbnQJCWVycm9yKQoreworCXFtdGVzdF9uZmFpbHMrKzsKKwlpZiAoZXJyb3IpCisJCWNtbl9lcnIoQ0VfREVCVUcsICJxdW90YWNoZWNrIGZhaWxlZCBpZD0lZCwgZXJyPSVkXG5yZWFzb246ICVzIiwKKwkJICAgICAgIElOVF9HRVQoZC0+ZF9pZCwgQVJDSF9DT05WRVJUKSwgZXJyb3IsIHJlYXNvbik7CisJZWxzZQorCQljbW5fZXJyKENFX0RFQlVHLCAicXVvdGFjaGVjayBmYWlsZWQgaWQ9JWQgKCVzKSBbJWQgIT0gJWRdIiwKKwkJICAgICAgIElOVF9HRVQoZC0+ZF9pZCwgQVJDSF9DT05WRVJUKSwgcmVhc29uLCAoaW50KWEsIChpbnQpYik7CisJeGZzX3FtX2RxdGVzdF9wcmludChkKTsKKwlpZiAoZHFwKQorCQl4ZnNfcW1fZHFwcmludChkcXApOworfQorCitTVEFUSUMgaW50Cit4ZnNfZHF0ZXN0X2NtcDIoCisJeGZzX2RxdGVzdF90CSpkLAorCXhmc19kcXVvdF90CSpkcXApCit7CisJaW50IGVyciA9IDA7CisJaWYgKElOVF9HRVQoZHFwLT5xX2NvcmUuZF9pY291bnQsIEFSQ0hfQ09OVkVSVCkgIT0gZC0+ZF9pY291bnQpIHsKKwkJeGZzX3FtX2RxdGVzdF9mYWlsZWQoZCwgZHFwLCAiaWNvdW50IG1pc21hdGNoIiwKKwkJCUlOVF9HRVQoZHFwLT5xX2NvcmUuZF9pY291bnQsIEFSQ0hfQ09OVkVSVCksCisJCQlkLT5kX2ljb3VudCwgMCk7CisJCWVycisrOworCX0KKwlpZiAoSU5UX0dFVChkcXAtPnFfY29yZS5kX2Jjb3VudCwgQVJDSF9DT05WRVJUKSAhPSBkLT5kX2Jjb3VudCkgeworCQl4ZnNfcW1fZHF0ZXN0X2ZhaWxlZChkLCBkcXAsICJiY291bnQgbWlzbWF0Y2giLAorCQkJSU5UX0dFVChkcXAtPnFfY29yZS5kX2Jjb3VudCwgQVJDSF9DT05WRVJUKSwKKwkJCWQtPmRfYmNvdW50LCAwKTsKKwkJZXJyKys7CisJfQorCWlmIChJTlRfR0VUKGRxcC0+cV9jb3JlLmRfYmxrX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJUKSAmJgorCSAgICBJTlRfR0VUKGRxcC0+cV9jb3JlLmRfYmNvdW50LCBBUkNIX0NPTlZFUlQpID49CisJICAgIElOVF9HRVQoZHFwLT5xX2NvcmUuZF9ibGtfc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpKSB7CisJCWlmICghZHFwLT5xX2NvcmUuZF9idGltZXIgJiYgZHFwLT5xX2NvcmUuZF9pZCkgeworCQkJY21uX2VycihDRV9ERUJVRywKKwkJCQkiJWQgWyVzXSBbMHglcF0gQkxLIFRJTUVSIE5PVCBTVEFSVEVEIiwKKwkJCQlkLT5kX2lkLCBEUUZMQUdUT19UWVBFU1RSKGQpLCBkLT5xX21vdW50KTsKKwkJCWVycisrOworCQl9CisJfQorCWlmIChJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaW5vX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJUKSAmJgorCSAgICBJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaWNvdW50LCBBUkNIX0NPTlZFUlQpID49CisJICAgIElOVF9HRVQoZHFwLT5xX2NvcmUuZF9pbm9fc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpKSB7CisJCWlmICghZHFwLT5xX2NvcmUuZF9pdGltZXIgJiYgZHFwLT5xX2NvcmUuZF9pZCkgeworCQkJY21uX2VycihDRV9ERUJVRywKKwkJCQkiJWQgWyVzXSBbMHglcF0gSU5PIFRJTUVSIE5PVCBTVEFSVEVEIiwKKwkJCQlkLT5kX2lkLCBEUUZMQUdUT19UWVBFU1RSKGQpLCBkLT5xX21vdW50KTsKKwkJCWVycisrOworCQl9CisJfQorI2lmZGVmIFFVT1RBREVCVUcKKwlpZiAoIWVycikgeworCQljbW5fZXJyKENFX0RFQlVHLCAiJWQgWyVzXSBbMHglcF0gcWNoZWNrZWQiLAorCQkJZC0+ZF9pZCwgWEZTX1FNX0lTVURRKGQpID8gIlVTUiIgOiAiR1JQIiwgZC0+cV9tb3VudCk7CisJfQorI2VuZGlmCisJcmV0dXJuIChlcnIpOworfQorCitTVEFUSUMgdm9pZAoreGZzX2RxdGVzdF9jbXAoCisJeGZzX2RxdGVzdF90CSpkKQoreworCXhmc19kcXVvdF90CSpkcXA7CisJaW50CQllcnJvcjsKKworCS8qIHhmc19xbV9kcXRlc3RfcHJpbnQoZCk7ICovCisJaWYgKChlcnJvciA9IHhmc19xbV9kcWdldChkLT5xX21vdW50LCBOVUxMLCBkLT5kX2lkLCBkLT5kcV9mbGFncywgMCwKKwkJCQkgJmRxcCkpKSB7CisJCXhmc19xbV9kcXRlc3RfZmFpbGVkKGQsIE5VTEwsICJkcWdldCBmYWlsZWQiLCAwLCAwLCBlcnJvcik7CisJCXJldHVybjsKKwl9CisJeGZzX2RxdGVzdF9jbXAyKGQsIGRxcCk7CisJeGZzX3FtX2RxcHV0KGRxcCk7Cit9CisKK1NUQVRJQyBpbnQKK3hmc19xbV9pbnRlcm5hbHFjaGVja19kcWdldCgKKwl4ZnNfbW91bnRfdAkqbXAsCisJeGZzX2RxaWRfdAlpZCwKKwl1aW50CQl0eXBlLAorCXhmc19kcXRlc3RfdAkqKk9fZHEpCit7CisJeGZzX2RxdGVzdF90CSpkOworCXhmc19kcWhhc2hfdAkqaDsKKworCWggPSBEUVRFU1RfSEFTSChtcCwgaWQsIHR5cGUpOworCWZvciAoZCA9ICh4ZnNfZHF0ZXN0X3QgKikgaC0+cWhfbmV4dDsgZCAhPSBOVUxMOworCSAgICAgZCA9ICh4ZnNfZHF0ZXN0X3QgKikgZC0+SExfTkVYVCkgeworCQkvKiBEUVRFU1RfTElTVF9QUklOVChoLCBITF9ORVhULCAiQEBAQEAgZHF0ZXN0bGlzdCBAQEBAQCIpOyAqLworCQlpZiAoZC0+ZF9pZCA9PSBpZCAmJiBtcCA9PSBkLT5xX21vdW50KSB7CisJCQkqT19kcSA9IGQ7CisJCQlyZXR1cm4gKDApOworCQl9CisJfQorCWQgPSBrbWVtX3phbGxvYyhzaXplb2YoeGZzX2RxdGVzdF90KSwgS01fU0xFRVApOworCWQtPmRxX2ZsYWdzID0gdHlwZTsKKwlkLT5kX2lkID0gaWQ7CisJZC0+cV9tb3VudCA9IG1wOworCWQtPnFfaGFzaCA9IGg7CisJeGZzX3FtX2hhc2hpbnNlcnQoaCwgZCk7CisJKk9fZHEgPSBkOworCXJldHVybiAoMCk7Cit9CisKK1NUQVRJQyB2b2lkCit4ZnNfcW1faW50ZXJuYWxxY2hlY2tfZ2V0X2RxdW90cygKKwl4ZnNfbW91bnRfdAkqbXAsCisJeGZzX2RxaWRfdAl1aWQsCisJeGZzX2RxaWRfdAlnaWQsCisJeGZzX2RxdGVzdF90CSoqdWQsCisJeGZzX2RxdGVzdF90CSoqZ2QpCit7CisJaWYgKFhGU19JU19VUVVPVEFfT04obXApKQorCQl4ZnNfcW1faW50ZXJuYWxxY2hlY2tfZHFnZXQobXAsIHVpZCwgWEZTX0RRX1VTRVIsIHVkKTsKKwlpZiAoWEZTX0lTX0dRVU9UQV9PTihtcCkpCisJCXhmc19xbV9pbnRlcm5hbHFjaGVja19kcWdldChtcCwgZ2lkLCBYRlNfRFFfR1JPVVAsIGdkKTsKK30KKworCitTVEFUSUMgdm9pZAoreGZzX3FtX2ludGVybmFscWNoZWNrX2RxYWRqdXN0KAorCXhmc19pbm9kZV90CQkqaXAsCisJeGZzX2RxdGVzdF90CQkqZCkKK3sKKwlkLT5kX2ljb3VudCsrOworCWQtPmRfYmNvdW50ICs9ICh4ZnNfcWNudF90KWlwLT5pX2QuZGlfbmJsb2NrczsKK30KKworU1RBVElDIGludAoreGZzX3FtX2ludGVybmFscWNoZWNrX2FkanVzdCgKKwl4ZnNfbW91bnRfdAkqbXAsCQkvKiBtb3VudCBwb2ludCBmb3IgZmlsZXN5c3RlbSAqLworCXhmc19pbm9fdAlpbm8sCQkvKiBpbm9kZSBudW1iZXIgdG8gZ2V0IGRhdGEgZm9yICovCisJdm9pZAkJX191c2VyICpidWZmZXIsCS8qIG5vdCB1c2VkICovCisJaW50CQl1YnNpemUsCQkvKiBub3QgdXNlZCAqLworCXZvaWQJCSpwcml2YXRlX2RhdGEsCS8qIG5vdCB1c2VkICovCisJeGZzX2RhZGRyX3QJYm5vLAkJLyogc3RhcnRpbmcgYmxvY2sgb2YgaW5vZGUgY2x1c3RlciAqLworCWludAkJKnVidXNlZCwJLyogbm90IHVzZWQgKi8KKwl2b2lkCQkqZGlwLAkJLyogbm90IHVzZWQgKi8KKwlpbnQJCSpyZXMpCQkvKiBidWxrc3RhdCByZXN1bHQgY29kZSAqLworeworCXhmc19pbm9kZV90CQkqaXA7CisJeGZzX2RxdGVzdF90CQkqdWQsICpnZDsKKwl1aW50CQkJbG9ja19mbGFnczsKKwlib29sZWFuX3QJCWlwcmVsZWFzZWQ7CisJaW50CQkJZXJyb3I7CisKKwlBU1NFUlQoWEZTX0lTX1FVT1RBX1JVTk5JTkcobXApKTsKKworCWlmIChpbm8gPT0gbXAtPm1fc2Iuc2JfdXF1b3Rpbm8gfHwgaW5vID09IG1wLT5tX3NiLnNiX2dxdW90aW5vKSB7CisJCSpyZXMgPSBCVUxLU1RBVF9SVl9OT1RISU5HOworCQlxZHByaW50aygiaW50ZXJuYWxxY2hlY2s6IGlubz0lbGx1LCB1cWlubz0lbGx1LCBncWlubz0lbGx1XG4iLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgaW5vLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgbXAtPm1fc2Iuc2JfdXF1b3Rpbm8sCisJCQkodW5zaWduZWQgbG9uZyBsb25nKSBtcC0+bV9zYi5zYl9ncXVvdGlubyk7CisJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKwl9CisJaXByZWxlYXNlZCA9IEJfRkFMU0U7CisgYWdhaW46CisJbG9ja19mbGFncyA9IFhGU19JTE9DS19TSEFSRUQ7CisJaWYgKChlcnJvciA9IHhmc19pZ2V0KG1wLCBOVUxMLCBpbm8sIDAsIGxvY2tfZmxhZ3MsICZpcCwgYm5vKSkpIHsKKwkJKnJlcyA9IEJVTEtTVEFUX1JWX05PVEhJTkc7CisJCXJldHVybiAoZXJyb3IpOworCX0KKworCWlmIChpcC0+aV9kLmRpX21vZGUgPT0gMCkgeworCQl4ZnNfaXB1dF9uZXcoaXAsIGxvY2tfZmxhZ3MpOworCQkqcmVzID0gQlVMS1NUQVRfUlZfTk9USElORzsKKwkJcmV0dXJuIFhGU19FUlJPUihFTk9FTlQpOworCX0KKworCS8qCisJICogVGhpcyBpbm9kZSBjYW4gaGF2ZSBibG9ja3MgYWZ0ZXIgZW9mIHdoaWNoIGNhbiBnZXQgcmVsZWFzZWQKKwkgKiB3aGVuIHdlIHNlbmQgaXQgdG8gaW5hY3RpdmUuIFNpbmNlIHdlIGRvbid0IGNoZWNrIHRoZSBkcXVvdAorCSAqIHVudGlsIHRoZSBhZnRlciBhbGwgb3VyIGNhbGN1bGF0aW9ucyBhcmUgZG9uZSwgd2UgbXVzdCBnZXQgcmlkCisJICogb2YgdGhvc2Ugbm93LgorCSAqLworCWlmICghIGlwcmVsZWFzZWQpIHsKKwkJeGZzX2lwdXQoaXAsIGxvY2tfZmxhZ3MpOworCQlpcHJlbGVhc2VkID0gQl9UUlVFOworCQlnb3RvIGFnYWluOworCX0KKwl4ZnNfcW1faW50ZXJuYWxxY2hlY2tfZ2V0X2RxdW90cyhtcCwKKwkJCQkJKHhmc19kcWlkX3QpIGlwLT5pX2QuZGlfdWlkLAorCQkJCQkoeGZzX2RxaWRfdCkgaXAtPmlfZC5kaV9naWQsCisJCQkJCSZ1ZCwgJmdkKTsKKwlpZiAoWEZTX0lTX1VRVU9UQV9PTihtcCkpIHsKKwkJQVNTRVJUKHVkKTsKKwkJeGZzX3FtX2ludGVybmFscWNoZWNrX2RxYWRqdXN0KGlwLCB1ZCk7CisJfQorCWlmIChYRlNfSVNfR1FVT1RBX09OKG1wKSkgeworCQlBU1NFUlQoZ2QpOworCQl4ZnNfcW1faW50ZXJuYWxxY2hlY2tfZHFhZGp1c3QoaXAsIGdkKTsKKwl9CisJeGZzX2lwdXQoaXAsIGxvY2tfZmxhZ3MpOworCSpyZXMgPSBCVUxLU1RBVF9SVl9ESURPTkU7CisJcmV0dXJuICgwKTsKK30KKworCisvKiBQUklWQVRFLCBkZWJ1Z2dpbmcgKi8KK2ludAoreGZzX3FtX2ludGVybmFscWNoZWNrKAorCXhmc19tb3VudF90CSptcCkKK3sKKwl4ZnNfaW5vX3QJbGFzdGlubzsKKwlpbnQJCWRvbmUsIGNvdW50OworCWludAkJaTsKKwl4ZnNfZHF0ZXN0X3QJKmQsICplOworCXhmc19kcWhhc2hfdAkqaDE7CisJaW50CQllcnJvcjsKKworCWxhc3Rpbm8gPSAwOworCXFtdGVzdF9oYXNobWFzayA9IDMyOworCWNvdW50ID0gNTsKKwlkb25lID0gMDsKKwlxbXRlc3RfbmZhaWxzID0gMDsKKworCWlmICghIFhGU19JU19RVU9UQV9PTihtcCkpCisJCXJldHVybiBYRlNfRVJST1IoRVNSQ0gpOworCisJeGZzX2xvZ19mb3JjZShtcCwgKHhmc19sc25fdCkwLCBYRlNfTE9HX0ZPUkNFIHwgWEZTX0xPR19TWU5DKTsKKwlYRlNfYmZsdXNoKG1wLT5tX2RkZXZfdGFyZ3ApOworCXhmc19sb2dfZm9yY2UobXAsICh4ZnNfbHNuX3QpMCwgWEZTX0xPR19GT1JDRSB8IFhGU19MT0dfU1lOQyk7CisJWEZTX2JmbHVzaChtcC0+bV9kZGV2X3RhcmdwKTsKKworCW11dGV4X2xvY2soJnFjaGVja19sb2NrLCBQSU5PRCk7CisJLyogVGhlcmUgc2hvdWxkIGJlIGFic29sdXRlbHkgbm8gcXVvdGEgYWN0aXZpdHkgd2hpbGUgdGhpcworCSAgIGlzIGdvaW5nIG9uLiAqLworCXFtdGVzdF91ZHF0YWIgPSBrbWVtX3phbGxvYyhxbXRlc3RfaGFzaG1hc2sgKgorCQkJCSAgICBzaXplb2YoeGZzX2RxaGFzaF90KSwgS01fU0xFRVApOworCXFtdGVzdF9nZHF0YWIgPSBrbWVtX3phbGxvYyhxbXRlc3RfaGFzaG1hc2sgKgorCQkJCSAgICBzaXplb2YoeGZzX2RxaGFzaF90KSwgS01fU0xFRVApOworCWRvIHsKKwkJLyoKKwkJICogSXRlcmF0ZSB0aHJ1IGFsbCB0aGUgaW5vZGVzIGluIHRoZSBmaWxlIHN5c3RlbSwKKwkJICogYWRqdXN0aW5nIHRoZSBjb3JyZXNwb25kaW5nIGRxdW90IGNvdW50ZXJzCisJCSAqLworCQlpZiAoKGVycm9yID0geGZzX2J1bGtzdGF0KG1wLCAmbGFzdGlubywgJmNvdW50LAorCQkJCSB4ZnNfcW1faW50ZXJuYWxxY2hlY2tfYWRqdXN0LCBOVUxMLAorCQkJCSAwLCBOVUxMLCBCVUxLU1RBVF9GR19JR0VULCAmZG9uZSkpKSB7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKCEgZG9uZSk7CisJaWYgKGVycm9yKSB7CisJCWNtbl9lcnIoQ0VfREVCVUcsICJCdWxrc3RhdCByZXR1cm5lZCBlcnJvciAweCV4IiwgZXJyb3IpOworCX0KKwljbW5fZXJyKENFX0RFQlVHLCAiQ2hlY2tpbmcgcmVzdWx0cyBhZ2FpbnN0IHN5c3RlbSBkcXVvdHMiKTsKKwlmb3IgKGkgPSAwOyBpIDwgcW10ZXN0X2hhc2htYXNrOyBpKyspIHsKKwkJaDEgPSAmcW10ZXN0X3VkcXRhYltpXTsKKwkJZm9yIChkID0gKHhmc19kcXRlc3RfdCAqKSBoMS0+cWhfbmV4dDsgZCAhPSBOVUxMOyApIHsKKwkJCXhmc19kcXRlc3RfY21wKGQpOworCQkJZSA9ICh4ZnNfZHF0ZXN0X3QgKikgZC0+SExfTkVYVDsKKwkJCWttZW1fZnJlZShkLCBzaXplb2YoeGZzX2RxdGVzdF90KSk7CisJCQlkID0gZTsKKwkJfQorCQloMSA9ICZxbXRlc3RfZ2RxdGFiW2ldOworCQlmb3IgKGQgPSAoeGZzX2RxdGVzdF90ICopIGgxLT5xaF9uZXh0OyBkICE9IE5VTEw7ICkgeworCQkJeGZzX2RxdGVzdF9jbXAoZCk7CisJCQllID0gKHhmc19kcXRlc3RfdCAqKSBkLT5ITF9ORVhUOworCQkJa21lbV9mcmVlKGQsIHNpemVvZih4ZnNfZHF0ZXN0X3QpKTsKKwkJCWQgPSBlOworCQl9CisJfQorCisJaWYgKHFtdGVzdF9uZmFpbHMpIHsKKwkJY21uX2VycihDRV9ERUJVRywgIioqKioqKioqIHF1b3RhY2hlY2sgZmFpbGVkICAqKioqKioqKiIpOworCQljbW5fZXJyKENFX0RFQlVHLCAiZmFpbHVyZXMgPSAlZCIsIHFtdGVzdF9uZmFpbHMpOworCX0gZWxzZSB7CisJCWNtbl9lcnIoQ0VfREVCVUcsICIqKioqKioqKiBxdW90YWNoZWNrIHN1Y2Nlc3NmdWwhICoqKioqKioqIik7CisJfQorCWttZW1fZnJlZShxbXRlc3RfdWRxdGFiLCBxbXRlc3RfaGFzaG1hc2sgKiBzaXplb2YoeGZzX2RxaGFzaF90KSk7CisJa21lbV9mcmVlKHFtdGVzdF9nZHF0YWIsIHFtdGVzdF9oYXNobWFzayAqIHNpemVvZih4ZnNfZHFoYXNoX3QpKTsKKwltdXRleF91bmxvY2soJnFjaGVja19sb2NrKTsKKwlyZXR1cm4gKHFtdGVzdF9uZmFpbHMpOworfQorCisjZW5kaWYgLyogREVCVUcgKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9xdW90YS94ZnNfcXVvdGFfcHJpdi5oIGIvZnMveGZzL3F1b3RhL3hmc19xdW90YV9wcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE0YjYwMAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9xdW90YS94ZnNfcXVvdGFfcHJpdi5oCkBAIC0wLDAgKzEsMTkyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLgkgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19RVU9UQV9QUklWX0hfXworI2RlZmluZSBfX1hGU19RVU9UQV9QUklWX0hfXworCisvKgorICogTnVtYmVyIG9mIGJtYXBzIHRoYXQgd2UgYXNrIGZyb20gYm1hcGkgd2hlbiBkb2luZyBhIHF1b3RhY2hlY2suCisgKiBXZSBtYWtlIHRoaXMgcmVzdHJpY3Rpb24gdG8ga2VlcCB0aGUgbWVtb3J5IHVzYWdlIHRvIGEgbWluaW11bS4KKyAqLworI2RlZmluZSBYRlNfRFFJVEVSX01BUF9TSVpFCTEwCisKKy8qIE51bWJlciBvZiBkcXVvdHMgdGhhdCBmaXQgaW4gdG8gYSBkcXVvdCBibG9jayAqLworI2RlZmluZSBYRlNfUU1fRFFQRVJCTEsobXApCSgobXApLT5tX3F1b3RhaW5mby0+cWlfZHFwZXJjaHVuaykKKworI2RlZmluZSBYRlNfSVNMT0NLRURfSU5PREUoaXApCQkoaXNtcmxvY2tlZCgmKGlwKS0+aV9sb2NrLCBcCisJCQkJCSAgICBNUl9VUERBVEUgfCBNUl9BQ0NFU1MpICE9IDApCisjZGVmaW5lIFhGU19JU0xPQ0tFRF9JTk9ERV9FWENMKGlwKQkoaXNtcmxvY2tlZCgmKGlwKS0+aV9sb2NrLCBcCisJCQkJCSAgICBNUl9VUERBVEUpICE9IDApCisKKyNkZWZpbmUgWEZTX0RRX0lTX0FEREVEVE9fVFJYKHQsIGQpCSgoZCktPnFfdHJhbnNwID09ICh0KSkKKworI2RlZmluZSBYRlNfUUlfTVBMUkVDTEFJTVMobXApCSgobXApLT5tX3F1b3RhaW5mby0+cWlfZHFyZWNsYWltcykKKyNkZWZpbmUgWEZTX1FJX1VRSVAobXApCQkoKG1wKS0+bV9xdW90YWluZm8tPnFpX3VxdW90YWlwKQorI2RlZmluZSBYRlNfUUlfR1FJUChtcCkJCSgobXApLT5tX3F1b3RhaW5mby0+cWlfZ3F1b3RhaXApCisjZGVmaW5lIFhGU19RSV9EUUNIVU5LTEVOKG1wKQkoKG1wKS0+bV9xdW90YWluZm8tPnFpX2RxY2h1bmtsZW4pCisjZGVmaW5lIFhGU19RSV9CVElNRUxJTUlUKG1wKQkoKG1wKS0+bV9xdW90YWluZm8tPnFpX2J0aW1lbGltaXQpCisjZGVmaW5lIFhGU19RSV9SVEJUSU1FTElNSVQobXApICgobXApLT5tX3F1b3RhaW5mby0+cWlfcnRidGltZWxpbWl0KQorI2RlZmluZSBYRlNfUUlfSVRJTUVMSU1JVChtcCkJKChtcCktPm1fcXVvdGFpbmZvLT5xaV9pdGltZWxpbWl0KQorI2RlZmluZSBYRlNfUUlfQldBUk5MSU1JVChtcCkJKChtcCktPm1fcXVvdGFpbmZvLT5xaV9id2FybmxpbWl0KQorI2RlZmluZSBYRlNfUUlfSVdBUk5MSU1JVChtcCkJKChtcCktPm1fcXVvdGFpbmZvLT5xaV9pd2FybmxpbWl0KQorI2RlZmluZSBYRlNfUUlfUU9GRkxPQ0sobXApCSgobXApLT5tX3F1b3RhaW5mby0+cWlfcXVvdGFvZmZsb2NrKQorCisjZGVmaW5lIFhGU19RSV9NUExfTElTVChtcCkJKChtcCktPm1fcXVvdGFpbmZvLT5xaV9kcWxpc3QpCisjZGVmaW5lIFhGU19RSV9NUExMT0NLKG1wKQkoKG1wKS0+bV9xdW90YWluZm8tPnFpX2RxbGlzdC5xaF9sb2NrKQorI2RlZmluZSBYRlNfUUlfTVBMTkVYVChtcCkJKChtcCktPm1fcXVvdGFpbmZvLT5xaV9kcWxpc3QucWhfbmV4dCkKKyNkZWZpbmUgWEZTX1FJX01QTE5EUVVPVFMobXApCSgobXApLT5tX3F1b3RhaW5mby0+cWlfZHFsaXN0LnFoX25lbGVtcykKKworI2RlZmluZSBYUU1MQ0soaCkJCQkobXV0ZXhfbG9jaygmKChoKS0+cWhfbG9jayksIFBJTk9EKSkKKyNkZWZpbmUgWFFNVU5MQ0soaCkJCQkobXV0ZXhfdW5sb2NrKCYoKGgpLT5xaF9sb2NrKSkpCisjaWZkZWYgREVCVUcKK3N0cnVjdCB4ZnNfZHFoYXNoOworc3RhdGljIGlubGluZSBpbnQgWFFNSVNMQ0tEKHN0cnVjdCB4ZnNfZHFoYXNoICpoKQoreworCWlmIChtdXRleF90cnlsb2NrKCZoLT5xaF9sb2NrKSkgeworCQltdXRleF91bmxvY2soJmgtPnFoX2xvY2spOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworI2RlZmluZSBYRlNfRFFfSEFTSF9MT0NLKGgpCQlYUU1MQ0soaCkKKyNkZWZpbmUgWEZTX0RRX0hBU0hfVU5MT0NLKGgpCQlYUU1VTkxDSyhoKQorI2RlZmluZSBYRlNfRFFfSVNfSEFTSF9MT0NLRUQoaCkJWFFNSVNMQ0tEKGgpCisKKyNkZWZpbmUgeGZzX3FtX21wbGlzdF9sb2NrKG1wKQkJWFFNTENLKCYoWEZTX1FJX01QTF9MSVNUKG1wKSkpCisjZGVmaW5lIHhmc19xbV9tcGxpc3RfdW5sb2NrKG1wKQlYUU1VTkxDSygmKFhGU19RSV9NUExfTElTVChtcCkpKQorI2RlZmluZSBYRlNfUU1fSVNfTVBMSVNUX0xPQ0tFRChtcCkJWFFNSVNMQ0tEKCYoWEZTX1FJX01QTF9MSVNUKG1wKSkpCisKKyNkZWZpbmUgeGZzX3FtX2ZyZWVsaXN0X2xvY2socW0pCVhRTUxDSygmKChxbSktPnFtX2RxZnJlZWxpc3QpKQorI2RlZmluZSB4ZnNfcW1fZnJlZWxpc3RfdW5sb2NrKHFtKQlYUU1VTkxDSygmKChxbSktPnFtX2RxZnJlZWxpc3QpKQorI2RlZmluZSBYRlNfUU1fSVNfRlJFRUxJU1RfTE9DS0VEKHFtKQlYUU1JU0xDS0QoJigocW0pLT5xbV9kcWZyZWVsaXN0KSkKKworLyoKKyAqIEhhc2ggaW50byBhIGJ1Y2tldCBpbiB0aGUgZHF1b3QgaGFzaCB0YWJsZSwgYmFzZWQgb24gPG1wLCBpZD4uCisgKi8KKyNkZWZpbmUgWEZTX0RRX0hBU0hWQUwobXAsIGlkKSAoKChfX3BzdW5zaWduZWRfdCkobXApICsgXAorCQkJCSAoX19wc3Vuc2lnbmVkX3QpKGlkKSkgJiBcCisJCQkJKHhmc19HcW0tPnFtX2RxaGFzaG1hc2sgLSAxKSkKKyNkZWZpbmUgWEZTX0RRX0hBU0gobXAsIGlkLCB0eXBlKSAgICh0eXBlID09IFhGU19EUV9VU0VSID8gXAorCQkJCSAgICAgKHhmc19HcW0tPnFtX3Vzcl9kcWh0YWJsZSArIFwKKwkJCQkgICAgICBYRlNfRFFfSEFTSFZBTChtcCwgaWQpKSA6IFwKKwkJCQkgICAgICh4ZnNfR3FtLT5xbV9ncnBfZHFodGFibGUgKyBcCisJCQkJICAgICAgWEZTX0RRX0hBU0hWQUwobXAsIGlkKSkpCisjZGVmaW5lIFhGU19JU19EUVRZUEVfT04obXAsIHR5cGUpICAgKHR5cGUgPT0gWEZTX0RRX1VTRVIgPyBcCisJCQkJICAgICAgWEZTX0lTX1VRVU9UQV9PTihtcCk6WEZTX0lTX0dRVU9UQV9PTihtcCkpCisjZGVmaW5lIFhGU19JU19EUVVPVF9VTklOSVRJQUxJWkVEKGRxcCkgKCBcCisJIWRxcC0+cV9jb3JlLmRfYmxrX2hhcmRsaW1pdCAmJiBcCisJIWRxcC0+cV9jb3JlLmRfYmxrX3NvZnRsaW1pdCAmJiBcCisJIWRxcC0+cV9jb3JlLmRfcnRiX2hhcmRsaW1pdCAmJiBcCisJIWRxcC0+cV9jb3JlLmRfcnRiX3NvZnRsaW1pdCAmJiBcCisJIWRxcC0+cV9jb3JlLmRfaW5vX2hhcmRsaW1pdCAmJiBcCisJIWRxcC0+cV9jb3JlLmRfaW5vX3NvZnRsaW1pdCAmJiBcCisJIWRxcC0+cV9jb3JlLmRfYmNvdW50ICYmIFwKKwkhZHFwLT5xX2NvcmUuZF9ydGJjb3VudCAmJiBcCisJIWRxcC0+cV9jb3JlLmRfaWNvdW50KQorCisjZGVmaW5lIEhMX1BSRVZQCWRxX2hhc2hsaXN0LnFsX3ByZXZwCisjZGVmaW5lIEhMX05FWFQJCWRxX2hhc2hsaXN0LnFsX25leHQKKyNkZWZpbmUgTVBMX1BSRVZQCWRxX21wbGlzdC5xbF9wcmV2cAorI2RlZmluZSBNUExfTkVYVAlkcV9tcGxpc3QucWxfbmV4dAorCisKKyNkZWZpbmUgX0xJU1RfUkVNT1ZFKGgsIGRxcCwgUFZQLCBOWFQpCQkJCVwKKwl7CQkJCQkJCVwKKwkJIHhmc19kcXVvdF90ICpkOwkJCQlcCisJCSBpZiAoKChkKSA9IChkcXApLT5OWFQpKQkJCQlcCisJCQkgKGQpLT5QVlAgPSAoZHFwKS0+UFZQOwkJCVwKKwkJICooKGRxcCktPlBWUCkgPSBkOwkJCQlcCisJCSAoZHFwKS0+TlhUID0gTlVMTDsJCQkJXAorCQkgKGRxcCktPlBWUCA9IE5VTEw7CQkJCVwKKwkJIChoKS0+cWhfdmVyc2lvbisrOwkJCQlcCisJCSAoaCktPnFoX25lbGVtcy0tOwkJCQlcCisJfQorCisjZGVmaW5lIF9MSVNUX0lOU0VSVChoLCBkcXAsIFBWUCwgTlhUKQkJCQlcCisJewkJCQkJCQlcCisJCSB4ZnNfZHF1b3RfdCAqZDsJCQkJXAorCQkgaWYgKCgoZCkgPSAoaCktPnFoX25leHQpKQkJCVwKKwkJCSAoZCktPlBWUCA9ICYoKGRxcCktPk5YVCk7CQlcCisJCSAoZHFwKS0+TlhUID0gZDsJCQkJXAorCQkgKGRxcCktPlBWUCA9ICYoKGgpLT5xaF9uZXh0KTsJCQlcCisJCSAoaCktPnFoX25leHQgPSBkcXA7CQkJCVwKKwkJIChoKS0+cWhfdmVyc2lvbisrOwkJCQlcCisJCSAoaCktPnFoX25lbGVtcysrOwkJCQlcCisJIH0KKworI2RlZmluZSBGT1JFQUNIX0RRVU9UX0lOX01QKGRxcCwgbXApIFwKKwlmb3IgKChkcXApID0gWEZTX1FJX01QTE5FWFQobXApOyAoZHFwKSAhPSBOVUxMOyAoZHFwKSA9IChkcXApLT5NUExfTkVYVCkKKworI2RlZmluZSBGT1JFQUNIX0RRVU9UX0lOX0ZSRUVMSVNUKGRxcCwgcWxpc3QpCVwKK2ZvciAoKGRxcCkgPSAocWxpc3QpLT5xaF9uZXh0OyAoZHFwKSAhPSAoeGZzX2RxdW90X3QgKikocWxpc3QpOyBcCisgICAgIChkcXApID0gKGRxcCktPmRxX2ZsbmV4dCkKKworI2RlZmluZSBYUU1fSEFTSExJU1RfSU5TRVJUKGgsIGRxcCkJXAorCSBfTElTVF9JTlNFUlQoaCwgZHFwLCBITF9QUkVWUCwgSExfTkVYVCkKKworI2RlZmluZSBYUU1fRlJFRUxJU1RfSU5TRVJUKGgsIGRxcCkJXAorCSB4ZnNfcW1fZnJlZWxpc3RfYXBwZW5kKGgsIGRxcCkKKworI2RlZmluZSBYUU1fTVBMSVNUX0lOU0VSVChoLCBkcXApCVwKKwkgX0xJU1RfSU5TRVJUKGgsIGRxcCwgTVBMX1BSRVZQLCBNUExfTkVYVCkKKworI2RlZmluZSBYUU1fSEFTSExJU1RfUkVNT1ZFKGgsIGRxcCkJXAorCSBfTElTVF9SRU1PVkUoaCwgZHFwLCBITF9QUkVWUCwgSExfTkVYVCkKKyNkZWZpbmUgWFFNX0ZSRUVMSVNUX1JFTU9WRShkcXApCVwKKwkgeGZzX3FtX2ZyZWVsaXN0X3VubGluayhkcXApCisjZGVmaW5lIFhRTV9NUExJU1RfUkVNT1ZFKGgsIGRxcCkJXAorCXsgX0xJU1RfUkVNT1ZFKGgsIGRxcCwgTVBMX1BSRVZQLCBNUExfTkVYVCk7IFwKKwkgIFhGU19RSV9NUExSRUNMQUlNUygoZHFwKS0+cV9tb3VudCkrKzsgfQorCisjZGVmaW5lIFhGU19EUV9JU19MT0dJVEVNX0lOSVREKGRxcCkJKChkcXApLT5xX2xvZ2l0ZW0ucWxpX2RxdW90ID09IChkcXApKQorCisjZGVmaW5lIFhGU19RTV9EUVBfVE9fRFFBQ0NUKHRwLCBkcXApCShYRlNfUU1fSVNVRFEoZHFwKSA/IFwKKwkJCQkJICh0cCktPnRfZHFpbmZvLT5kcWFfdXNyZHF1b3RzIDogXAorCQkJCQkgKHRwKS0+dF9kcWluZm8tPmRxYV9ncnBkcXVvdHMpCisjZGVmaW5lIFhGU19JU19TVVNFUl9EUVVPVChkcXApCQlcCisJKCEoKGRxcCktPnFfY29yZS5kX2lkKSkKKworI2RlZmluZSBYRlNfUFVSR0VfSU5PREUoaXApCQlcCisJewkJCQlcCisJICB2bWFwX3QgZHF2bWFwOwkJXAorCSAgdm5vZGVfdCAqZHF2cDsJCVwKKwkgIGRxdnAgPSBYRlNfSVRPVihpcCk7CQlcCisJICBWTUFQKGRxdnAsIGRxdm1hcCk7CQlcCisJICBWTl9SRUxFKGRxdnApOwkJXAorCX0KKworI2RlZmluZSBEUUZMQUdUT19UWVBFU1RSKGQpCSgoKGQpLT5kcV9mbGFncyAmIFhGU19EUV9VU0VSKSA/ICJVU1IiIDogXAorCQkJCSAoKChkKS0+ZHFfZmxhZ3MgJiBYRlNfRFFfR1JPVVApID8gIkdSUCIgOiAiPz8/IikpCisjZGVmaW5lIERRRkxBR1RPX0RJUlRZU1RSKGQpCShYRlNfRFFfSVNfRElSVFkoZCkgPyAiRElSVFkiIDogIk5PVERJUlRZIikKKworI2VuZGlmCS8qIF9fWEZTX1FVT1RBX1BSSVZfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvcXVvdGEveGZzX3RyYW5zX2RxdW90LmMgYi9mcy94ZnMvcXVvdGEveGZzX3RyYW5zX2RxdW90LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ5YjJhMQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9xdW90YS94ZnNfdHJhbnNfZHF1b3QuYwpAQCAtMCwwICsxLDk0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4JIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorI2luY2x1ZGUgInhmc19mcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19hZy5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc19hbGxvYy5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19xdW90YS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcC5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKKyNpbmNsdWRlICJ4ZnNfcnRhbGxvYy5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorI2luY2x1ZGUgInhmc19pdGFibGUuaCIKKyNpbmNsdWRlICJ4ZnNfcncuaCIKKyNpbmNsdWRlICJ4ZnNfYWNsLmgiCisjaW5jbHVkZSAieGZzX2NhcC5oIgorI2luY2x1ZGUgInhmc19tYWMuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0ci5oIgorI2luY2x1ZGUgInhmc19idWZfaXRlbS5oIgorI2luY2x1ZGUgInhmc190cmFuc19wcml2LmgiCisKKyNpbmNsdWRlICJ4ZnNfcW0uaCIKKworU1RBVElDIHZvaWQJeGZzX3RyYW5zX2FsbG9jX2RxaW5mbyh4ZnNfdHJhbnNfdCAqKTsKKworLyoKKyAqIEFkZCB0aGUgbG9ja2VkIGRxdW90IHRvIHRoZSB0cmFuc2FjdGlvbi4KKyAqIFRoZSBkcXVvdCBtdXN0IGJlIGxvY2tlZCwgYW5kIGl0IGNhbm5vdCBiZSBhc3NvY2lhdGVkIHdpdGggYW55CisgKiB0cmFuc2FjdGlvbi4KKyAqLwordm9pZAoreGZzX3RyYW5zX2Rxam9pbigKKwl4ZnNfdHJhbnNfdAkqdHAsCisJeGZzX2RxdW90X3QJKmRxcCkKK3sKKwl4ZnNfZHFfbG9naXRlbV90ICAgICpscDsKKworCUFTU0VSVCghIFhGU19EUV9JU19BRERFRFRPX1RSWCh0cCwgZHFwKSk7CisJQVNTRVJUKFhGU19EUV9JU19MT0NLRUQoZHFwKSk7CisJQVNTRVJUKFhGU19EUV9JU19MT0dJVEVNX0lOSVREKGRxcCkpOworCWxwID0gJmRxcC0+cV9sb2dpdGVtOworCisJLyoKKwkgKiBHZXQgYSBsb2dfaXRlbV9kZXNjIHRvIHBvaW50IGF0IHRoZSBuZXcgaXRlbS4KKwkgKi8KKwkodm9pZCkgeGZzX3RyYW5zX2FkZF9pdGVtKHRwLCAoeGZzX2xvZ19pdGVtX3QqKShscCkpOworCisJLyoKKwkgKiBJbml0aWFsaXplIGlfdHJhbnNwIHNvIHdlIGNhbiBsYXRlciBkZXRlcm1pbmUgaWYgdGhpcyBkcXVvdCBpcworCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zYWN0aW9uLgorCSAqLworCWRxcC0+cV90cmFuc3AgPSB0cDsKK30KKworCisvKgorICogVGhpcyBpcyBjYWxsZWQgdG8gbWFyayB0aGUgZHF1b3QgYXMgbmVlZGluZworICogdG8gYmUgbG9nZ2VkIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIGNvbW1pdHRlZC4gIFRoZSBkcXVvdCBtdXN0CisgKiBhbHJlYWR5IGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24uCisgKiBOb3RlIHRoYXQgaXQgbWFya3MgdGhlIGVudGlyZSB0cmFuc2FjdGlvbiBhcyBkaXJ0eS4gSW4gdGhlIG9yZGluYXJ5CisgKiBjYXNlLCB0aGlzIGdldHMgY2FsbGVkIHZpYSB4ZnNfdHJhbnNfY29tbWl0LCBhZnRlciB0aGUgdHJhbnNhY3Rpb24KKyAqIGlzIGFscmVhZHkgZGlydHkuIEhvd2V2ZXIsIHRoZXJlJ3Mgbm90aGluZyBzdG9wIHRoaXMgZnJvbSBnZXR0aW5nCisgKiBjYWxsZWQgZGlyZWN0bHksIGFzIGRvbmUgYnkgeGZzX3FtX3NjYWxsX3NldHFsaW0uIEhlbmNlLCB0aGUgVFJBTlNfRElSVFkKKyAqIGZsYWcuCisgKi8KK3ZvaWQKK3hmc190cmFuc19sb2dfZHF1b3QoCisJeGZzX3RyYW5zX3QJKnRwLAorCXhmc19kcXVvdF90CSpkcXApCit7CisJeGZzX2xvZ19pdGVtX2Rlc2NfdAkqbGlkcDsKKworCUFTU0VSVChYRlNfRFFfSVNfQURERURUT19UUlgodHAsIGRxcCkpOworCUFTU0VSVChYRlNfRFFfSVNfTE9DS0VEKGRxcCkpOworCisJbGlkcCA9IHhmc190cmFuc19maW5kX2l0ZW0odHAsICh4ZnNfbG9nX2l0ZW1fdCopKCZkcXAtPnFfbG9naXRlbSkpOworCUFTU0VSVChsaWRwICE9IE5VTEwpOworCisJdHAtPnRfZmxhZ3MgfD0gWEZTX1RSQU5TX0RJUlRZOworCWxpZHAtPmxpZF9mbGFncyB8PSBYRlNfTElEX0RJUlRZOworfQorCisvKgorICogQ2FycnkgZm9yd2FyZCB3aGF0ZXZlciBpcyBsZWZ0IG9mIHRoZSBxdW90YSBibGsgcmVzZXJ2YXRpb24gdG8KKyAqIHRoZSBzcGFua3kgbmV3IHRyYW5zYWN0aW9uCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfdHJhbnNfZHVwX2RxaW5mbygKKwl4ZnNfdHJhbnNfdAkqb3RwLAorCXhmc190cmFuc190CSpudHApCit7CisJeGZzX2RxdHJ4X3QJKm9xLCAqbnE7CisJaW50CQlpLGo7CisJeGZzX2RxdHJ4X3QJKm9xYSwgKm5xYTsKKworCWlmICghb3RwLT50X2RxaW5mbykKKwkJcmV0dXJuOworCisJeGZzX3RyYW5zX2FsbG9jX2RxaW5mbyhudHApOworCW9xYSA9IG90cC0+dF9kcWluZm8tPmRxYV91c3JkcXVvdHM7CisJbnFhID0gbnRwLT50X2RxaW5mby0+ZHFhX3VzcmRxdW90czsKKworCS8qCisJICogQmVjYXVzZSB0aGUgcXVvdGEgYmxrIHJlc2VydmF0aW9uIGlzIGNhcnJpZWQgZm9yd2FyZCwKKwkgKiBpdCBpcyBhbHNvIG5lY2Vzc2FyeSB0byBjYXJyeSBmb3J3YXJkIHRoZSBEUV9ESVJUWSBmbGFnLgorCSAqLworCWlmKG90cC0+dF9mbGFncyAmIFhGU19UUkFOU19EUV9ESVJUWSkKKwkJbnRwLT50X2ZsYWdzIHw9IFhGU19UUkFOU19EUV9ESVJUWTsKKworCWZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IFhGU19RTV9UUkFOU19NQVhEUVM7IGkrKykgeworCQkJaWYgKG9xYVtpXS5xdF9kcXVvdCA9PSBOVUxMKQorCQkJCWJyZWFrOworCQkJb3EgPSAmb3FhW2ldOworCQkJbnEgPSAmbnFhW2ldOworCisJCQlucS0+cXRfZHF1b3QgPSBvcS0+cXRfZHF1b3Q7CisJCQlucS0+cXRfYmNvdW50X2RlbHRhID0gbnEtPnF0X2ljb3VudF9kZWx0YSA9IDA7CisJCQlucS0+cXRfcnRiY291bnRfZGVsdGEgPSAwOworCisJCQkvKgorCQkJICogVHJhbnNmZXIgd2hhdGV2ZXIgaXMgbGVmdCBvZiB0aGUgcmVzZXJ2YXRpb25zLgorCQkJICovCisJCQlucS0+cXRfYmxrX3JlcyA9IG9xLT5xdF9ibGtfcmVzIC0gb3EtPnF0X2Jsa19yZXNfdXNlZDsKKwkJCW9xLT5xdF9ibGtfcmVzID0gb3EtPnF0X2Jsa19yZXNfdXNlZDsKKworCQkJbnEtPnF0X3J0YmxrX3JlcyA9IG9xLT5xdF9ydGJsa19yZXMgLQorCQkJCW9xLT5xdF9ydGJsa19yZXNfdXNlZDsKKwkJCW9xLT5xdF9ydGJsa19yZXMgPSBvcS0+cXRfcnRibGtfcmVzX3VzZWQ7CisKKwkJCW5xLT5xdF9pbm9fcmVzID0gb3EtPnF0X2lub19yZXMgLSBvcS0+cXRfaW5vX3Jlc191c2VkOworCQkJb3EtPnF0X2lub19yZXMgPSBvcS0+cXRfaW5vX3Jlc191c2VkOworCisJCX0KKwkJb3FhID0gb3RwLT50X2RxaW5mby0+ZHFhX2dycGRxdW90czsKKwkJbnFhID0gbnRwLT50X2RxaW5mby0+ZHFhX2dycGRxdW90czsKKwl9Cit9CisKKy8qCisgKiBXcmFwIGFyb3VuZCBtb2RfZHF1b3QgdG8gYWNjb3VudCBmb3IgYm90aCB1c2VyIGFuZCBncm91cCBxdW90YXMuCisgKi8KK3ZvaWQKK3hmc190cmFuc19tb2RfZHF1b3RfYnlpbm8oCisJeGZzX3RyYW5zX3QJKnRwLAorCXhmc19pbm9kZV90CSppcCwKKwl1aW50CQlmaWVsZCwKKwlsb25nCQlkZWx0YSkKK3sKKwl4ZnNfbW91bnRfdAkqbXA7CisKKwlBU1NFUlQodHApOworCW1wID0gdHAtPnRfbW91bnRwOworCisJaWYgKCFYRlNfSVNfUVVPVEFfT04obXApIHx8CisJICAgIGlwLT5pX2lubyA9PSBtcC0+bV9zYi5zYl91cXVvdGlubyB8fAorCSAgICBpcC0+aV9pbm8gPT0gbXAtPm1fc2Iuc2JfZ3F1b3Rpbm8pCisJCXJldHVybjsKKworCWlmICh0cC0+dF9kcWluZm8gPT0gTlVMTCkKKwkJeGZzX3RyYW5zX2FsbG9jX2RxaW5mbyh0cCk7CisKKwlpZiAoWEZTX0lTX1VRVU9UQV9PTihtcCkgJiYgaXAtPmlfdWRxdW90KSB7CisJCSh2b2lkKSB4ZnNfdHJhbnNfbW9kX2RxdW90KHRwLCBpcC0+aV91ZHF1b3QsIGZpZWxkLCBkZWx0YSk7CisJfQorCWlmIChYRlNfSVNfR1FVT1RBX09OKG1wKSAmJiBpcC0+aV9nZHF1b3QpIHsKKwkJKHZvaWQpIHhmc190cmFuc19tb2RfZHF1b3QodHAsIGlwLT5pX2dkcXVvdCwgZmllbGQsIGRlbHRhKTsKKwl9Cit9CisKK1NUQVRJQyB4ZnNfZHF0cnhfdCAqCit4ZnNfdHJhbnNfZ2V0X2RxdHJ4KAorCXhmc190cmFuc190CSp0cCwKKwl4ZnNfZHF1b3RfdAkqZHFwKQoreworCWludAkJaTsKKwl4ZnNfZHF0cnhfdAkqcWE7CisKKwlmb3IgKGkgPSAwOyBpIDwgWEZTX1FNX1RSQU5TX01BWERRUzsgaSsrKSB7CisJCXFhID0gWEZTX1FNX0RRUF9UT19EUUFDQ1QodHAsIGRxcCk7CisKKwkJaWYgKHFhW2ldLnF0X2RxdW90ID09IE5VTEwgfHwKKwkJICAgIHFhW2ldLnF0X2RxdW90ID09IGRxcCkgeworCQkJcmV0dXJuICgmcWFbaV0pOworCQl9CisJfQorCisJcmV0dXJuIChOVUxMKTsKK30KKworLyoKKyAqIE1ha2UgdGhlIGNoYW5nZXMgaW4gdGhlIHRyYW5zYWN0aW9uIHN0cnVjdHVyZS4KKyAqIFRoZSBtb3JhbCBlcXVpdmFsZW50IHRvIHhmc190cmFuc19tb2Rfc2IoKS4KKyAqIFdlIGRvbid0IHRvdWNoIGFueSBmaWVsZHMgaW4gdGhlIGRxdW90LCBzbyB3ZSBkb24ndCBjYXJlCisgKiBpZiBpdCdzIGxvY2tlZCBvciBub3QgKG1vc3Qgb2YgdGhlIHRpbWUgaXQgd29uJ3QgYmUpLgorICovCit2b2lkCit4ZnNfdHJhbnNfbW9kX2RxdW90KAorCXhmc190cmFuc190CSp0cCwKKwl4ZnNfZHF1b3RfdAkqZHFwLAorCXVpbnQJCWZpZWxkLAorCWxvbmcJCWRlbHRhKQoreworCXhmc19kcXRyeF90CSpxdHJ4OworCisJQVNTRVJUKHRwKTsKKwlxdHJ4ID0gTlVMTDsKKworCWlmICh0cC0+dF9kcWluZm8gPT0gTlVMTCkKKwkJeGZzX3RyYW5zX2FsbG9jX2RxaW5mbyh0cCk7CisJLyoKKwkgKiBGaW5kIGVpdGhlciB0aGUgZmlyc3QgZnJlZSBzbG90IG9yIHRoZSBzbG90IHRoYXQgYmVsb25ncworCSAqIHRvIHRoaXMgZHF1b3QuCisJICovCisJcXRyeCA9IHhmc190cmFuc19nZXRfZHF0cngodHAsIGRxcCk7CisJQVNTRVJUKHF0cngpOworCWlmIChxdHJ4LT5xdF9kcXVvdCA9PSBOVUxMKQorCQlxdHJ4LT5xdF9kcXVvdCA9IGRxcDsKKworCXN3aXRjaCAoZmllbGQpIHsKKworCQkvKgorCQkgKiByZWd1bGFyIGRpc2sgYmxrIHJlc2VydmF0aW9uCisJCSAqLworCSAgICAgIGNhc2UgWEZTX1RSQU5TX0RRX1JFU19CTEtTOgorCQlxdHJ4LT5xdF9ibGtfcmVzICs9ICh1bG9uZylkZWx0YTsKKwkJYnJlYWs7CisKKwkJLyoKKwkJICogaW5vZGUgcmVzZXJ2YXRpb24KKwkJICovCisJICAgICAgY2FzZSBYRlNfVFJBTlNfRFFfUkVTX0lOT1M6CisJCXF0cngtPnF0X2lub19yZXMgKz0gKHVsb25nKWRlbHRhOworCQlicmVhazsKKworCQkvKgorCQkgKiBkaXNrIGJsb2NrcyB1c2VkLgorCQkgKi8KKwkgICAgICBjYXNlIFhGU19UUkFOU19EUV9CQ09VTlQ6CisJCWlmIChxdHJ4LT5xdF9ibGtfcmVzICYmIGRlbHRhID4gMCkgeworCQkJcXRyeC0+cXRfYmxrX3Jlc191c2VkICs9ICh1bG9uZylkZWx0YTsKKwkJCUFTU0VSVChxdHJ4LT5xdF9ibGtfcmVzID49IHF0cngtPnF0X2Jsa19yZXNfdXNlZCk7CisJCX0KKwkJcXRyeC0+cXRfYmNvdW50X2RlbHRhICs9IGRlbHRhOworCQlicmVhazsKKworCSAgICAgIGNhc2UgWEZTX1RSQU5TX0RRX0RFTEJDT1VOVDoKKwkJcXRyeC0+cXRfZGVsYmNudF9kZWx0YSArPSBkZWx0YTsKKwkJYnJlYWs7CisKKwkJLyoKKwkJICogSW5vZGUgQ291bnQKKwkJICovCisJICAgICAgY2FzZSBYRlNfVFJBTlNfRFFfSUNPVU5UOgorCQlpZiAocXRyeC0+cXRfaW5vX3JlcyAmJiBkZWx0YSA+IDApIHsKKwkJCXF0cngtPnF0X2lub19yZXNfdXNlZCArPSAodWxvbmcpZGVsdGE7CisJCQlBU1NFUlQocXRyeC0+cXRfaW5vX3JlcyA+PSBxdHJ4LT5xdF9pbm9fcmVzX3VzZWQpOworCQl9CisJCXF0cngtPnF0X2ljb3VudF9kZWx0YSArPSBkZWx0YTsKKwkJYnJlYWs7CisKKwkJLyoKKwkJICogcnRibGsgcmVzZXJ2YXRpb24KKwkJICovCisJICAgICAgY2FzZSBYRlNfVFJBTlNfRFFfUkVTX1JUQkxLUzoKKwkJcXRyeC0+cXRfcnRibGtfcmVzICs9ICh1bG9uZylkZWx0YTsKKwkJYnJlYWs7CisKKwkJLyoKKwkJICogcnRibGsgY291bnQKKwkJICovCisJICAgICAgY2FzZSBYRlNfVFJBTlNfRFFfUlRCQ09VTlQ6CisJCWlmIChxdHJ4LT5xdF9ydGJsa19yZXMgJiYgZGVsdGEgPiAwKSB7CisJCQlxdHJ4LT5xdF9ydGJsa19yZXNfdXNlZCArPSAodWxvbmcpZGVsdGE7CisJCQlBU1NFUlQocXRyeC0+cXRfcnRibGtfcmVzID49IHF0cngtPnF0X3J0YmxrX3Jlc191c2VkKTsKKwkJfQorCQlxdHJ4LT5xdF9ydGJjb3VudF9kZWx0YSArPSBkZWx0YTsKKwkJYnJlYWs7CisKKwkgICAgICBjYXNlIFhGU19UUkFOU19EUV9ERUxSVEJDT1VOVDoKKwkJcXRyeC0+cXRfZGVscnRiX2RlbHRhICs9IGRlbHRhOworCQlicmVhazsKKworCSAgICAgIGRlZmF1bHQ6CisJCUFTU0VSVCgwKTsKKwl9CisJdHAtPnRfZmxhZ3MgfD0gWEZTX1RSQU5TX0RRX0RJUlRZOworfQorCisKKy8qCisgKiBHaXZlbiBhbiBhcnJheSBvZiBkcXRyeCBzdHJ1Y3R1cmVzLCBsb2NrIGFsbCB0aGUgZHF1b3RzIGFzc29jaWF0ZWQKKyAqIGFuZCBqb2luIHRoZW0gdG8gdGhlIHRyYW5zYWN0aW9uLCBwcm92aWRlZCB0aGV5IGhhdmUgYmVlbiBtb2RpZmllZC4KKyAqIFdlIGtub3cgdGhhdCB0aGUgaGlnaGVzdCBudW1iZXIgb2YgZHF1b3RzIChvZiBvbmUgdHlwZSAtIHVzciBPUiBncnApLAorICogaW52b2x2ZWQgaW4gYSB0cmFuc2FjdGlvbiBpcyAyIGFuZCB0aGF0IGJvdGggdXNyIGFuZCBncnAgY29tYmluZWQgLSAzLgorICogU28sIHdlIGRvbid0IGF0dGVtcHQgdG8gbWFrZSB0aGlzIHZlcnkgZ2VuZXJpYy4KKyAqLworU1RBVElDIHZvaWQKK3hmc190cmFuc19kcWxvY2tlZGpvaW4oCisJeGZzX3RyYW5zX3QJKnRwLAorCXhmc19kcXRyeF90CSpxKQoreworCUFTU0VSVChxWzBdLnF0X2RxdW90ICE9IE5VTEwpOworCWlmIChxWzFdLnF0X2RxdW90ID09IE5VTEwpIHsKKwkJeGZzX2RxbG9jayhxWzBdLnF0X2RxdW90KTsKKwkJeGZzX3RyYW5zX2Rxam9pbih0cCwgcVswXS5xdF9kcXVvdCk7CisJfSBlbHNlIHsKKwkJQVNTRVJUKFhGU19RTV9UUkFOU19NQVhEUVMgPT0gMik7CisJCXhmc19kcWxvY2syKHFbMF0ucXRfZHF1b3QsIHFbMV0ucXRfZHF1b3QpOworCQl4ZnNfdHJhbnNfZHFqb2luKHRwLCBxWzBdLnF0X2RxdW90KTsKKwkJeGZzX3RyYW5zX2Rxam9pbih0cCwgcVsxXS5xdF9kcXVvdCk7CisJfQorfQorCisKKy8qCisgKiBDYWxsZWQgYnkgeGZzX3RyYW5zX2NvbW1pdCgpIGFuZCBzaW1pbGFyIGluIHNwaXJpdCB0bworICogeGZzX3RyYW5zX2FwcGx5X3NiX2RlbHRhcygpLgorICogR28gdGhydSBhbGwgdGhlIGRxdW90cyBiZWxvbmdpbmcgdG8gdGhpcyB0cmFuc2FjdGlvbiBhbmQgbW9kaWZ5IHRoZQorICogSU5DT1JFIGRxdW90IHRvIHJlZmxlY3QgdGhlIGFjdHVhbCB1c2FnZXMuCisgKiBVbnJlc2VydmUganVzdCB0aGUgcmVzZXJ2YXRpb25zIGRvbmUgYnkgdGhpcyB0cmFuc2FjdGlvbi4KKyAqIGRxdW90IGlzIHN0aWxsIGxlZnQgbG9ja2VkIGF0IGV4aXQuCisgKi8KK3ZvaWQKK3hmc190cmFuc19hcHBseV9kcXVvdF9kZWx0YXMoCisJeGZzX3RyYW5zX3QJCSp0cCkKK3sKKwlpbnQJCQlpLCBqOworCXhmc19kcXVvdF90CQkqZHFwOworCXhmc19kcXRyeF90CQkqcXRyeCwgKnFhOworCXhmc19kaXNrX2RxdW90X3QJKmQ7CisJbG9uZwkJCXRvdGFsYmRlbHRhOworCWxvbmcJCQl0b3RhbHJ0YmRlbHRhOworCisJaWYgKCEgKHRwLT50X2ZsYWdzICYgWEZTX1RSQU5TX0RRX0RJUlRZKSkKKwkJcmV0dXJuOworCisJQVNTRVJUKHRwLT50X2RxaW5mbyk7CisJcWEgPSB0cC0+dF9kcWluZm8tPmRxYV91c3JkcXVvdHM7CisJZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworCQlpZiAocWFbMF0ucXRfZHF1b3QgPT0gTlVMTCkgeworCQkJcWEgPSB0cC0+dF9kcWluZm8tPmRxYV9ncnBkcXVvdHM7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIExvY2sgYWxsIG9mIHRoZSBkcXVvdHMgYW5kIGpvaW4gdGhlbSB0byB0aGUgdHJhbnNhY3Rpb24uCisJCSAqLworCQl4ZnNfdHJhbnNfZHFsb2NrZWRqb2luKHRwLCBxYSk7CisKKwkJZm9yIChpID0gMDsgaSA8IFhGU19RTV9UUkFOU19NQVhEUVM7IGkrKykgeworCQkJcXRyeCA9ICZxYVtpXTsKKwkJCS8qCisJCQkgKiBUaGUgYXJyYXkgb2YgZHF1b3RzIGlzIGZpbGxlZAorCQkJICogc2VxdWVudGlhbGx5LCBub3Qgc3BhcnNlbHkuCisJCQkgKi8KKwkJCWlmICgoZHFwID0gcXRyeC0+cXRfZHF1b3QpID09IE5VTEwpCisJCQkJYnJlYWs7CisKKwkJCUFTU0VSVChYRlNfRFFfSVNfTE9DS0VEKGRxcCkpOworCQkJQVNTRVJUKFhGU19EUV9JU19BRERFRFRPX1RSWCh0cCwgZHFwKSk7CisKKwkJCS8qCisJCQkgKiBhZGp1c3QgdGhlIGFjdHVhbCBudW1iZXIgb2YgYmxvY2tzIHVzZWQKKwkJCSAqLworCQkJZCA9ICZkcXAtPnFfY29yZTsKKworCQkJLyoKKwkJCSAqIFRoZSBpc3N1ZSBoZXJlIGlzIC0gc29tZXRpbWVzIHdlIGRvbid0IG1ha2UgYSBibGtxdW90YQorCQkJICogcmVzZXJ2YXRpb24gaW50ZW50aW9uYWxseSB0byBiZSBmYWlyIHRvIHVzZXJzCisJCQkgKiAod2hlbiB0aGUgYW1vdW50IGlzIHNtYWxsKS4gT24gdGhlIG90aGVyIGhhbmQsCisJCQkgKiBkZWxheWVkIGFsbG9jcyBkbyBtYWtlIHJlc2VydmF0aW9ucywgYnV0IHRoYXQncworCQkJICogb3V0c2lkZSBvZiBhIHRyYW5zYWN0aW9uLCBzbyB3ZSBoYXZlIG5vCisJCQkgKiBpZGVhIGhvdyBtdWNoIHdhcyByZWFsbHkgcmVzZXJ2ZWQuCisJCQkgKiBTbywgaGVyZSB3ZSd2ZSBhY2N1bXVsYXRlZCBkZWxheWVkIGFsbG9jYXRpb24gYmxrcyBhbmQKKwkJCSAqIG5vbi1kZWxheSBibGtzLiBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IHRoZQorCQkJICogZGVsYXllZCBvbmVzIGFyZSBhbHdheXMgcmVzZXJ2ZWQgKG91dHNpZGUgb2YgYQorCQkJICogdHJhbnNhY3Rpb24pLCBhbmQgdGhlIG90aGVycyBtYXkgb3IgbWF5IG5vdCBoYXZlCisJCQkgKiBxdW90YSByZXNlcnZhdGlvbnMuCisJCQkgKi8KKwkJCXRvdGFsYmRlbHRhID0gcXRyeC0+cXRfYmNvdW50X2RlbHRhICsKKwkJCQlxdHJ4LT5xdF9kZWxiY250X2RlbHRhOworCQkJdG90YWxydGJkZWx0YSA9IHF0cngtPnF0X3J0YmNvdW50X2RlbHRhICsKKwkJCQlxdHJ4LT5xdF9kZWxydGJfZGVsdGE7CisjaWZkZWYgUVVPVEFERUJVRworCQkJaWYgKHRvdGFsYmRlbHRhIDwgMCkKKwkJCQlBU1NFUlQoSU5UX0dFVChkLT5kX2Jjb3VudCwgQVJDSF9DT05WRVJUKSA+PQorCQkJCSAgICAgICAoeGZzX3FjbnRfdCkgLXRvdGFsYmRlbHRhKTsKKworCQkJaWYgKHRvdGFscnRiZGVsdGEgPCAwKQorCQkJCUFTU0VSVChJTlRfR0VUKGQtPmRfcnRiY291bnQsIEFSQ0hfQ09OVkVSVCkgPj0KKwkJCQkgICAgICAgKHhmc19xY250X3QpIC10b3RhbHJ0YmRlbHRhKTsKKworCQkJaWYgKHF0cngtPnF0X2ljb3VudF9kZWx0YSA8IDApCisJCQkJQVNTRVJUKElOVF9HRVQoZC0+ZF9pY291bnQsIEFSQ0hfQ09OVkVSVCkgPj0KKwkJCQkgICAgICAgKHhmc19xY250X3QpIC1xdHJ4LT5xdF9pY291bnRfZGVsdGEpOworI2VuZGlmCisJCQlpZiAodG90YWxiZGVsdGEpCisJCQkJSU5UX01PRChkLT5kX2Jjb3VudCwgQVJDSF9DT05WRVJULCAoeGZzX3FjbnRfdCl0b3RhbGJkZWx0YSk7CisKKwkJCWlmIChxdHJ4LT5xdF9pY291bnRfZGVsdGEpCisJCQkJSU5UX01PRChkLT5kX2ljb3VudCwgQVJDSF9DT05WRVJULCAoeGZzX3FjbnRfdClxdHJ4LT5xdF9pY291bnRfZGVsdGEpOworCisJCQlpZiAodG90YWxydGJkZWx0YSkKKwkJCQlJTlRfTU9EKGQtPmRfcnRiY291bnQsIEFSQ0hfQ09OVkVSVCwgKHhmc19xY250X3QpdG90YWxydGJkZWx0YSk7CisKKwkJCS8qCisJCQkgKiBHZXQgYW55IGRlZmF1bHQgbGltaXRzIGluIHVzZS4KKwkJCSAqIFN0YXJ0L3Jlc2V0IHRoZSB0aW1lcihzKSBpZiBuZWVkZWQuCisJCQkgKi8KKwkJCWlmIChkLT5kX2lkKSB7CisJCQkJeGZzX3FtX2FkanVzdF9kcWxpbWl0cyh0cC0+dF9tb3VudHAsIGQpOworCQkJCXhmc19xbV9hZGp1c3RfZHF0aW1lcnModHAtPnRfbW91bnRwLCBkKTsKKwkJCX0KKworCQkJZHFwLT5kcV9mbGFncyB8PSBYRlNfRFFfRElSVFk7CisJCQkvKgorCQkJICogYWRkIHRoaXMgdG8gdGhlIGxpc3Qgb2YgaXRlbXMgdG8gZ2V0IGxvZ2dlZAorCQkJICovCisJCQl4ZnNfdHJhbnNfbG9nX2RxdW90KHRwLCBkcXApOworCQkJLyoKKwkJCSAqIFRha2Ugb2ZmIHdoYXQncyBsZWZ0IG9mIHRoZSBvcmlnaW5hbCByZXNlcnZhdGlvbi4KKwkJCSAqIEluIGNhc2Ugb2YgZGVsYXllZCBhbGxvY2F0aW9ucywgdGhlcmUncyBubworCQkJICogcmVzZXJ2YXRpb24gdGhhdCBhIHRyYW5zYWN0aW9uIHN0cnVjdHVyZSBrbm93cyBvZi4KKwkJCSAqLworCQkJaWYgKHF0cngtPnF0X2Jsa19yZXMgIT0gMCkgeworCQkJCWlmIChxdHJ4LT5xdF9ibGtfcmVzICE9IHF0cngtPnF0X2Jsa19yZXNfdXNlZCkgeworCQkJCQlpZiAocXRyeC0+cXRfYmxrX3JlcyA+CisJCQkJCSAgICBxdHJ4LT5xdF9ibGtfcmVzX3VzZWQpCisJCQkJCQlkcXAtPnFfcmVzX2Jjb3VudCAtPSAoeGZzX3FjbnRfdCkKKwkJCQkJCQkocXRyeC0+cXRfYmxrX3JlcyAtCisJCQkJCQkJIHF0cngtPnF0X2Jsa19yZXNfdXNlZCk7CisJCQkJCWVsc2UKKwkJCQkJCWRxcC0+cV9yZXNfYmNvdW50IC09ICh4ZnNfcWNudF90KQorCQkJCQkJCShxdHJ4LT5xdF9ibGtfcmVzX3VzZWQgLQorCQkJCQkJCSBxdHJ4LT5xdF9ibGtfcmVzKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogVGhlc2UgYmxrcyB3ZXJlIG5ldmVyIHJlc2VydmVkLCBlaXRoZXIgaW5zaWRlCisJCQkJICogYSB0cmFuc2FjdGlvbiBvciBvdXRzaWRlIG9uZSAoaW4gYSBkZWxheWVkCisJCQkJICogYWxsb2NhdGlvbikuIEFsc28sIHRoaXMgaXNuJ3QgYWx3YXlzIGEKKwkJCQkgKiBuZWdhdGl2ZSBudW1iZXIgc2luY2Ugd2Ugc29tZXRpbWVzCisJCQkJICogZGVsaWJlcmF0ZWx5IHNraXAgcXVvdGEgcmVzZXJ2YXRpb25zLgorCQkJCSAqLworCQkJCWlmIChxdHJ4LT5xdF9iY291bnRfZGVsdGEpIHsKKwkJCQkJZHFwLT5xX3Jlc19iY291bnQgKz0KKwkJCQkJICAgICAgKHhmc19xY250X3QpcXRyeC0+cXRfYmNvdW50X2RlbHRhOworCQkJCX0KKwkJCX0KKwkJCS8qCisJCQkgKiBBZGp1c3QgdGhlIFJUIHJlc2VydmF0aW9uLgorCQkJICovCisJCQlpZiAocXRyeC0+cXRfcnRibGtfcmVzICE9IDApIHsKKwkJCQlpZiAocXRyeC0+cXRfYmxrX3JlcyAhPSBxdHJ4LT5xdF9ibGtfcmVzX3VzZWQpIHsKKwkJCQkJaWYgKHF0cngtPnF0X3J0YmxrX3JlcyA+CisJCQkJCSAgICBxdHJ4LT5xdF9ydGJsa19yZXNfdXNlZCkKKwkJCQkJICAgICAgIGRxcC0+cV9yZXNfcnRiY291bnQgLT0gKHhmc19xY250X3QpCisJCQkJCQkgICAgICAgKHF0cngtPnF0X3J0YmxrX3JlcyAtCisJCQkJCQkJcXRyeC0+cXRfcnRibGtfcmVzX3VzZWQpOworCQkJCQllbHNlCisJCQkJCSAgICAgICBkcXAtPnFfcmVzX3J0YmNvdW50IC09ICh4ZnNfcWNudF90KQorCQkJCQkJICAgICAgIChxdHJ4LT5xdF9ydGJsa19yZXNfdXNlZCAtCisJCQkJCQkJcXRyeC0+cXRfcnRibGtfcmVzKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChxdHJ4LT5xdF9ydGJjb3VudF9kZWx0YSkKKwkJCQkJZHFwLT5xX3Jlc19ydGJjb3VudCArPQorCQkJCQkgICAgKHhmc19xY250X3QpcXRyeC0+cXRfcnRiY291bnRfZGVsdGE7CisJCQl9CisKKwkJCS8qCisJCQkgKiBBZGp1c3QgdGhlIGlub2RlIHJlc2VydmF0aW9uLgorCQkJICovCisJCQlpZiAocXRyeC0+cXRfaW5vX3JlcyAhPSAwKSB7CisJCQkJQVNTRVJUKHF0cngtPnF0X2lub19yZXMgPj0KKwkJCQkgICAgICAgcXRyeC0+cXRfaW5vX3Jlc191c2VkKTsKKwkJCQlpZiAocXRyeC0+cXRfaW5vX3JlcyA+IHF0cngtPnF0X2lub19yZXNfdXNlZCkKKwkJCQkJZHFwLT5xX3Jlc19pY291bnQgLT0gKHhmc19xY250X3QpCisJCQkJCQkocXRyeC0+cXRfaW5vX3JlcyAtCisJCQkJCQkgcXRyeC0+cXRfaW5vX3Jlc191c2VkKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHF0cngtPnF0X2ljb3VudF9kZWx0YSkKKwkJCQkJZHFwLT5xX3Jlc19pY291bnQgKz0KKwkJCQkJICAgICh4ZnNfcWNudF90KXF0cngtPnF0X2ljb3VudF9kZWx0YTsKKwkJCX0KKworCisjaWZkZWYgUVVPVEFERUJVRworCQkJaWYgKHF0cngtPnF0X3J0YmxrX3JlcyAhPSAwKQorCQkJCWNtbl9lcnIoQ0VfREVCVUcsICJSVCByZXMgJWQgZm9yIDB4JXBcbiIsCisJCQkJCShpbnQpIHF0cngtPnF0X3J0YmxrX3JlcywgZHFwKTsKKyNlbmRpZgorCQkJQVNTRVJUKGRxcC0+cV9yZXNfYmNvdW50ID49CisJCQkJSU5UX0dFVChkcXAtPnFfY29yZS5kX2Jjb3VudCwgQVJDSF9DT05WRVJUKSk7CisJCQlBU1NFUlQoZHFwLT5xX3Jlc19pY291bnQgPj0KKwkJCQlJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaWNvdW50LCBBUkNIX0NPTlZFUlQpKTsKKwkJCUFTU0VSVChkcXAtPnFfcmVzX3J0YmNvdW50ID49CisJCQkJSU5UX0dFVChkcXAtPnFfY29yZS5kX3J0YmNvdW50LCBBUkNIX0NPTlZFUlQpKTsKKwkJfQorCQkvKgorCQkgKiBEbyB0aGUgZ3JvdXAgcXVvdGFzIG5leHQKKwkJICovCisJCXFhID0gdHAtPnRfZHFpbmZvLT5kcWFfZ3JwZHF1b3RzOworCX0KK30KKworLyoKKyAqIFJlbGVhc2UgdGhlIHJlc2VydmF0aW9ucywgYW5kIGFkanVzdCB0aGUgZHF1b3RzIGFjY29yZGluZ2x5LgorICogVGhpcyBpcyBjYWxsZWQgb25seSB3aGVuIHRoZSB0cmFuc2FjdGlvbiBpcyBiZWluZyBhYm9ydGVkLiBJZiBieQorICogYW55IGNoYW5jZSB3ZSBoYXZlIGRvbmUgZHF1b3QgbW9kaWZpY2F0aW9ucyBpbmNvcmUgKGllLiBkZWx0YXMpIGFscmVhZHksCisgKiB3ZSBzaW1wbHkgdGhyb3cgdGhvc2UgYXdheSwgc2luY2UgdGhhdCdzIHRoZSBleHBlY3RlZCBiZWhhdmlvcgorICogd2hlbiBhIHRyYW5zYWN0aW9uIGlzIGN1cnRhaWxlZCB3aXRob3V0IGEgY29tbWl0LgorICovCitTVEFUSUMgdm9pZAoreGZzX3RyYW5zX3VucmVzZXJ2ZV9hbmRfbW9kX2RxdW90cygKKwl4ZnNfdHJhbnNfdAkJKnRwKQoreworCWludAkJCWksIGo7CisJeGZzX2RxdW90X3QJCSpkcXA7CisJeGZzX2RxdHJ4X3QJCSpxdHJ4LCAqcWE7CisJYm9vbGVhbl90CQlsb2NrZWQ7CisKKwlpZiAoIXRwLT50X2RxaW5mbyB8fCAhKHRwLT50X2ZsYWdzICYgWEZTX1RSQU5TX0RRX0RJUlRZKSkKKwkJcmV0dXJuOworCisJcWEgPSB0cC0+dF9kcWluZm8tPmRxYV91c3JkcXVvdHM7CisKKwlmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBYRlNfUU1fVFJBTlNfTUFYRFFTOyBpKyspIHsKKwkJCXF0cnggPSAmcWFbaV07CisJCQkvKgorCQkJICogV2UgYXNzdW1lIHRoYXQgdGhlIGFycmF5IG9mIGRxdW90cyBpcyBmaWxsZWQKKwkJCSAqIHNlcXVlbnRpYWxseSwgbm90IHNwYXJzZWx5LgorCQkJICovCisJCQlpZiAoKGRxcCA9IHF0cngtPnF0X2RxdW90KSA9PSBOVUxMKQorCQkJCWJyZWFrOworCQkJLyoKKwkJCSAqIFVucmVzZXJ2ZSB0aGUgb3JpZ2luYWwgcmVzZXJ2YXRpb24uIFdlIGRvbid0IGNhcmUKKwkJCSAqIGFib3V0IHRoZSBudW1iZXIgb2YgYmxvY2tzIHVzZWQgZmllbGQsIG9yIGRlbHRhcy4KKwkJCSAqIEFsc28gd2UgZG9uJ3QgYm90aGVyIHRvIHplcm8gdGhlIGZpZWxkcy4KKwkJCSAqLworCQkJbG9ja2VkID0gQl9GQUxTRTsKKwkJCWlmIChxdHJ4LT5xdF9ibGtfcmVzKSB7CisJCQkJeGZzX2RxbG9jayhkcXApOworCQkJCWxvY2tlZCA9IEJfVFJVRTsKKwkJCQlkcXAtPnFfcmVzX2Jjb3VudCAtPQorCQkJCQkoeGZzX3FjbnRfdClxdHJ4LT5xdF9ibGtfcmVzOworCQkJfQorCQkJaWYgKHF0cngtPnF0X2lub19yZXMpIHsKKwkJCQlpZiAoIWxvY2tlZCkgeworCQkJCQl4ZnNfZHFsb2NrKGRxcCk7CisJCQkJCWxvY2tlZCA9IEJfVFJVRTsKKwkJCQl9CisJCQkJZHFwLT5xX3Jlc19pY291bnQgLT0KKwkJCQkJKHhmc19xY250X3QpcXRyeC0+cXRfaW5vX3JlczsKKwkJCX0KKworCQkJaWYgKHF0cngtPnF0X3J0YmxrX3JlcykgeworCQkJCWlmICghbG9ja2VkKSB7CisJCQkJCXhmc19kcWxvY2soZHFwKTsKKwkJCQkJbG9ja2VkID0gQl9UUlVFOworCQkJCX0KKwkJCQlkcXAtPnFfcmVzX3J0YmNvdW50IC09CisJCQkJCSh4ZnNfcWNudF90KXF0cngtPnF0X3J0YmxrX3JlczsKKwkJCX0KKwkJCWlmIChsb2NrZWQpCisJCQkJeGZzX2RxdW5sb2NrKGRxcCk7CisKKwkJfQorCQlxYSA9IHRwLT50X2RxaW5mby0+ZHFhX2dycGRxdW90czsKKwl9Cit9CisKKy8qCisgKiBUaGlzIHJlc2VydmVzIGRpc2sgYmxvY2tzIGFuZCBpbm9kZXMgYWdhaW5zdCBhIGRxdW90LgorICogRmxhZ3MgaW5kaWNhdGUgaWYgdGhlIGRxdW90IGlzIHRvIGJlIGxvY2tlZCBoZXJlIGFuZCBhbHNvCisgKiBpZiB0aGUgYmxrIHJlc2VydmF0aW9uIGlzIGZvciBSVCBvciByZWd1bGFyIGJsb2Nrcy4KKyAqIFNlbmRpbmcgaW4gWEZTX1FNT1BUX0ZPUkNFX1JFUyBmbGFnIHNraXBzIHRoZSBxdW90YSBjaGVjay4KKyAqIFJldHVybnMgRURRVU9UIGlmIHF1b3RhIGlzIGV4Y2VlZGVkLgorICovCitTVEFUSUMgaW50Cit4ZnNfdHJhbnNfZHFyZXN2KAorCXhmc190cmFuc190CSp0cCwKKwl4ZnNfbW91bnRfdAkqbXAsCisJeGZzX2RxdW90X3QJKmRxcCwKKwlsb25nCQluYmxrcywKKwlsb25nCQluaW5vcywKKwl1aW50CQlmbGFncykKK3sKKwlpbnQJCWVycm9yOworCXhmc19xY250X3QJaGFyZGxpbWl0OworCXhmc19xY250X3QJc29mdGxpbWl0OworCXRpbWVfdAkJYnRpbWVyOworCXhmc19xY250X3QJKnJlc2Jjb3VudHA7CisJeGZzX3F1b3RhaW5mb190CSpxID0gbXAtPm1fcXVvdGFpbmZvOworCisJaWYgKCEgKGZsYWdzICYgWEZTX1FNT1BUX0RRTE9DSykpIHsKKwkJeGZzX2RxbG9jayhkcXApOworCX0KKwlBU1NFUlQoWEZTX0RRX0lTX0xPQ0tFRChkcXApKTsKKwlpZiAoZmxhZ3MgJiBYRlNfVFJBTlNfRFFfUkVTX0JMS1MpIHsKKwkJaGFyZGxpbWl0ID0gSU5UX0dFVChkcXAtPnFfY29yZS5kX2Jsa19oYXJkbGltaXQsIEFSQ0hfQ09OVkVSVCk7CisJCWlmICghaGFyZGxpbWl0KQorCQkJaGFyZGxpbWl0ID0gcS0+cWlfYmhhcmRsaW1pdDsKKwkJc29mdGxpbWl0ID0gSU5UX0dFVChkcXAtPnFfY29yZS5kX2Jsa19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCk7CisJCWlmICghc29mdGxpbWl0KQorCQkJc29mdGxpbWl0ID0gcS0+cWlfYnNvZnRsaW1pdDsKKwkJYnRpbWVyID0gSU5UX0dFVChkcXAtPnFfY29yZS5kX2J0aW1lciwgQVJDSF9DT05WRVJUKTsKKwkJcmVzYmNvdW50cCA9ICZkcXAtPnFfcmVzX2Jjb3VudDsKKwl9IGVsc2UgeworCQlBU1NFUlQoZmxhZ3MgJiBYRlNfVFJBTlNfRFFfUkVTX1JUQkxLUyk7CisJCWhhcmRsaW1pdCA9IElOVF9HRVQoZHFwLT5xX2NvcmUuZF9ydGJfaGFyZGxpbWl0LCBBUkNIX0NPTlZFUlQpOworCQlpZiAoIWhhcmRsaW1pdCkKKwkJCWhhcmRsaW1pdCA9IHEtPnFpX3J0YmhhcmRsaW1pdDsKKwkJc29mdGxpbWl0ID0gSU5UX0dFVChkcXAtPnFfY29yZS5kX3J0Yl9zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCk7CisJCWlmICghc29mdGxpbWl0KQorCQkJc29mdGxpbWl0ID0gcS0+cWlfcnRic29mdGxpbWl0OworCQlidGltZXIgPSBJTlRfR0VUKGRxcC0+cV9jb3JlLmRfcnRidGltZXIsIEFSQ0hfQ09OVkVSVCk7CisJCXJlc2Jjb3VudHAgPSAmZHFwLT5xX3Jlc19ydGJjb3VudDsKKwl9CisJZXJyb3IgPSAwOworCisJaWYgKChmbGFncyAmIFhGU19RTU9QVF9GT1JDRV9SRVMpID09IDAgJiYKKwkgICAgZHFwLT5xX2NvcmUuZF9pZCAmJgorCSAgICBYRlNfSVNfUVVPVEFfRU5GT1JDRUQoZHFwLT5xX21vdW50KSkgeworI2lmZGVmIFFVT1RBREVCVUcKKwkJY21uX2VycihDRV9ERUJVRywgIkJMSyBSZXM6IG5ibGtzPSVsZCArIHJlc2Jjb3VudD0lTGQiCisJCQkgICIgPiBoYXJkbGltaXQ9JUxkPyIsIG5ibGtzLCAqcmVzYmNvdW50cCwgaGFyZGxpbWl0KTsKKyNlbmRpZgorCQlpZiAobmJsa3MgPiAwKSB7CisJCQkvKgorCQkJICogZHF1b3QgaXMgbG9ja2VkIGFscmVhZHkuIFNlZSBpZiB3ZSdkIGdvIG92ZXIgdGhlCisJCQkgKiBoYXJkbGltaXQgb3IgZXhjZWVkIHRoZSB0aW1lbGltaXQgaWYgd2UgYWxsb2NhdGUKKwkJCSAqIG5ibGtzLgorCQkJICovCisJCQlpZiAoaGFyZGxpbWl0ID4gMFVMTCAmJgorCQkJICAgICAoaGFyZGxpbWl0IDw9IG5ibGtzICsgKnJlc2Jjb3VudHApKSB7CisJCQkJZXJyb3IgPSBFRFFVT1Q7CisJCQkJZ290byBlcnJvcl9yZXR1cm47CisJCQl9CisKKwkJCWlmIChzb2Z0bGltaXQgPiAwVUxMICYmCisJCQkgICAgIChzb2Z0bGltaXQgPD0gbmJsa3MgKyAqcmVzYmNvdW50cCkpIHsKKwkJCQkvKgorCQkJCSAqIElmIHRpbWVyIG9yIHdhcm5pbmdzIGhhcyBleHBpcmVkLAorCQkJCSAqIHJldHVybiBFRFFVT1QKKwkJCQkgKi8KKwkJCQlpZiAoKGJ0aW1lciAhPSAwICYmIGdldF9zZWNvbmRzKCkgPiBidGltZXIpIHx8CisJCQkJICAgIChkcXAtPnFfY29yZS5kX2J3YXJucyAmJgorCQkJCSAgICAgSU5UX0dFVChkcXAtPnFfY29yZS5kX2J3YXJucywgQVJDSF9DT05WRVJUKSA+PQorCQkJCSAgICAgWEZTX1FJX0JXQVJOTElNSVQoZHFwLT5xX21vdW50KSkpIHsKKwkJCQkJZXJyb3IgPSBFRFFVT1Q7CisJCQkJCWdvdG8gZXJyb3JfcmV0dXJuOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAobmlub3MgPiAwKSB7CisJCQloYXJkbGltaXQgPSBJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaW5vX2hhcmRsaW1pdCwgQVJDSF9DT05WRVJUKTsKKwkJCWlmICghaGFyZGxpbWl0KQorCQkJCWhhcmRsaW1pdCA9IHEtPnFpX2loYXJkbGltaXQ7CisJCQlzb2Z0bGltaXQgPSBJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaW5vX3NvZnRsaW1pdCwgQVJDSF9DT05WRVJUKTsKKwkJCWlmICghc29mdGxpbWl0KQorCQkJCXNvZnRsaW1pdCA9IHEtPnFpX2lzb2Z0bGltaXQ7CisJCQlpZiAoaGFyZGxpbWl0ID4gMFVMTCAmJgorCQkJICAgIElOVF9HRVQoZHFwLT5xX2NvcmUuZF9pY291bnQsIEFSQ0hfQ09OVkVSVCkgPj0gaGFyZGxpbWl0KSB7CisJCQkJZXJyb3IgPSBFRFFVT1Q7CisJCQkJZ290byBlcnJvcl9yZXR1cm47CisJCQl9IGVsc2UgaWYgKHNvZnRsaW1pdCA+IDBVTEwgJiYKKwkJCQkgICBJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaWNvdW50LCBBUkNIX0NPTlZFUlQpID49IHNvZnRsaW1pdCkgeworCQkJCS8qCisJCQkJICogSWYgdGltZXIgb3Igd2FybmluZ3MgaGFzIGV4cGlyZWQsCisJCQkJICogcmV0dXJuIEVEUVVPVAorCQkJCSAqLworCQkJCWlmICgoZHFwLT5xX2NvcmUuZF9pdGltZXIgJiYKKwkJCQkgICAgIGdldF9zZWNvbmRzKCkgPiBJTlRfR0VUKGRxcC0+cV9jb3JlLmRfaXRpbWVyLCBBUkNIX0NPTlZFUlQpKSB8fAorCQkJCSAgICAoZHFwLT5xX2NvcmUuZF9pd2FybnMgJiYKKwkJCQkgICAgIElOVF9HRVQoZHFwLT5xX2NvcmUuZF9pd2FybnMsIEFSQ0hfQ09OVkVSVCkgPj0KKwkJCQkgICAgIFhGU19RSV9JV0FSTkxJTUlUKGRxcC0+cV9tb3VudCkpKSB7CisJCQkJCWVycm9yID0gRURRVU9UOworCQkJCQlnb3RvIGVycm9yX3JldHVybjsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIENoYW5nZSB0aGUgcmVzZXJ2YXRpb24sIGJ1dCBub3QgdGhlIGFjdHVhbCB1c2FnZS4KKwkgKiBOb3RlIHRoYXQgcV9yZXNfYmNvdW50ID0gcV9jb3JlLmRfYmNvdW50ICsgcmVzdgorCSAqLworCSgqcmVzYmNvdW50cCkgKz0gKHhmc19xY250X3QpbmJsa3M7CisJaWYgKG5pbm9zICE9IDApCisJCWRxcC0+cV9yZXNfaWNvdW50ICs9ICh4ZnNfcWNudF90KW5pbm9zOworCisJLyoKKwkgKiBub3RlIHRoZSByZXNlcnZhdGlvbiBhbXQgaW4gdGhlIHRyYW5zIHN0cnVjdCB0b28sCisJICogc28gdGhhdCB0aGUgdHJhbnNhY3Rpb24ga25vd3MgaG93IG11Y2ggd2FzIHJlc2VydmVkIGJ5CisJICogaXQgYWdhaW5zdCB0aGlzIHBhcnRpY3VsYXIgZHF1b3QuCisJICogV2UgZG9uJ3QgZG8gdGhpcyB3aGVuIHdlIGFyZSByZXNlcnZpbmcgZm9yIGEgZGVsYXllZCBhbGxvY2F0aW9uLAorCSAqIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSB0aGUgbHV4dXJ5IG9mIGEgdHJhbnNhY3Rpb24gZW52ZWxvcGUgdGhlbi4KKwkgKi8KKwlpZiAodHApIHsKKwkJQVNTRVJUKHRwLT50X2RxaW5mbyk7CisJCUFTU0VSVChmbGFncyAmIFhGU19RTU9QVF9SRVNCTEtfTUFTSyk7CisJCWlmIChuYmxrcyAhPSAwKQorCQkJeGZzX3RyYW5zX21vZF9kcXVvdCh0cCwgZHFwLAorCQkJCQkgICAgZmxhZ3MgJiBYRlNfUU1PUFRfUkVTQkxLX01BU0ssCisJCQkJCSAgICBuYmxrcyk7CisJCWlmIChuaW5vcyAhPSAwKQorCQkJeGZzX3RyYW5zX21vZF9kcXVvdCh0cCwgZHFwLAorCQkJCQkgICAgWEZTX1RSQU5TX0RRX1JFU19JTk9TLAorCQkJCQkgICAgbmlub3MpOworCX0KKwlBU1NFUlQoZHFwLT5xX3Jlc19iY291bnQgPj0gSU5UX0dFVChkcXAtPnFfY29yZS5kX2Jjb3VudCwgQVJDSF9DT05WRVJUKSk7CisJQVNTRVJUKGRxcC0+cV9yZXNfcnRiY291bnQgPj0gSU5UX0dFVChkcXAtPnFfY29yZS5kX3J0YmNvdW50LCBBUkNIX0NPTlZFUlQpKTsKKwlBU1NFUlQoZHFwLT5xX3Jlc19pY291bnQgPj0gSU5UX0dFVChkcXAtPnFfY29yZS5kX2ljb3VudCwgQVJDSF9DT05WRVJUKSk7CisKK2Vycm9yX3JldHVybjoKKwlpZiAoISAoZmxhZ3MgJiBYRlNfUU1PUFRfRFFMT0NLKSkgeworCQl4ZnNfZHF1bmxvY2soZHFwKTsKKwl9CisJcmV0dXJuIChlcnJvcik7Cit9CisKKworLyoKKyAqIEdpdmVuIGEgZHF1b3QocyksIG1ha2UgZGlzayBibG9jayBhbmQvb3IgaW5vZGUgcmVzZXJ2YXRpb25zIGFnYWluc3QgdGhlbS4KKyAqIFRoZSBmYWN0IHRoYXQgdGhpcyBkb2VzIHRoZSByZXNlcnZhdGlvbiBhZ2FpbnN0IGJvdGggdGhlIHVzciBhbmQKKyAqIGdycCBxdW90YXMgaXMgaW1wb3J0YW50LCBiZWNhdXNlIHRoaXMgZm9sbG93cyBhIGJvdGgtb3Itbm90aGluZworICogYXBwcm9hY2guCisgKgorICogZmxhZ3MgPSBYRlNfUU1PUFRfRFFMT0NLIGluZGljYXRlIGlmIGRxdW90KHMpIG5lZWQgdG8gYmUgbG9ja2VkLgorICoJICAgWEZTX1FNT1BUX0ZPUkNFX1JFUyBldmFkZXMgbGltaXQgZW5mb3JjZW1lbnQuIFVzZWQgYnkgY2hvd24uCisgKgkgICBYRlNfVFJBTlNfRFFfUkVTX0JMS1MgcmVzZXJ2ZXMgcmVndWxhciBkaXNrIGJsb2NrcworICoJICAgWEZTX1RSQU5TX0RRX1JFU19SVEJMS1MgcmVzZXJ2ZXMgcmVhbHRpbWUgZGlzayBibG9ja3MKKyAqIGRxdW90cyBhcmUgdW5sb2NrZWQgb24gcmV0dXJuLCBpZiB0aGV5IHdlcmUgbm90IGxvY2tlZCBieSBjYWxsZXIuCisgKi8KK2ludAoreGZzX3RyYW5zX3Jlc2VydmVfcXVvdGFfYnlkcXVvdHMoCisJeGZzX3RyYW5zX3QJKnRwLAorCXhmc19tb3VudF90CSptcCwKKwl4ZnNfZHF1b3RfdAkqdWRxcCwKKwl4ZnNfZHF1b3RfdAkqZ2RxcCwKKwlsb25nCQluYmxrcywKKwlsb25nCQluaW5vcywKKwl1aW50CQlmbGFncykKK3sKKwlpbnQJCXJlc3ZkOworCisJaWYgKCEgWEZTX0lTX1FVT1RBX09OKG1wKSkKKwkJcmV0dXJuICgwKTsKKworCWlmICh0cCAmJiB0cC0+dF9kcWluZm8gPT0gTlVMTCkKKwkJeGZzX3RyYW5zX2FsbG9jX2RxaW5mbyh0cCk7CisKKwlBU1NFUlQoZmxhZ3MgJiBYRlNfUU1PUFRfUkVTQkxLX01BU0spOworCXJlc3ZkID0gMDsKKworCWlmICh1ZHFwKSB7CisJCWlmICh4ZnNfdHJhbnNfZHFyZXN2KHRwLCBtcCwgdWRxcCwgbmJsa3MsIG5pbm9zLCBmbGFncykpCisJCQlyZXR1cm4gKEVEUVVPVCk7CisJCXJlc3ZkID0gMTsKKwl9CisKKwlpZiAoZ2RxcCkgeworCQlpZiAoeGZzX3RyYW5zX2RxcmVzdih0cCwgbXAsIGdkcXAsIG5ibGtzLCBuaW5vcywgZmxhZ3MpKSB7CisJCQkvKgorCQkJICogY2FuJ3QgZG8gaXQsIHNvIGJhY2tvdXQgcHJldmlvdXMgcmVzZXJ2YXRpb24KKwkJCSAqLworCQkJaWYgKHJlc3ZkKSB7CisJCQkJZmxhZ3MgfD0gWEZTX1FNT1BUX0ZPUkNFX1JFUzsKKwkJCQl4ZnNfdHJhbnNfZHFyZXN2KHRwLCBtcCwgdWRxcCwKKwkJCQkJCSAtbmJsa3MsIC1uaW5vcywgZmxhZ3MpOworCQkJfQorCQkJcmV0dXJuIChFRFFVT1QpOworCQl9CisJfQorCisJLyoKKwkgKiBEaWRudCBjaGFuZ2UgYW55dGhpbmcgY3JpdGljYWwsIHNvLCBubyBuZWVkIHRvIGxvZworCSAqLworCXJldHVybiAoMCk7Cit9CisKKworLyoKKyAqIExvY2sgdGhlIGRxdW90IGFuZCBjaGFuZ2UgdGhlIHJlc2VydmF0aW9uIGlmIHdlIGNhbi4KKyAqIFRoaXMgZG9lc24ndCBjaGFuZ2UgdGhlIGFjdHVhbCB1c2FnZSwganVzdCB0aGUgcmVzZXJ2YXRpb24uCisgKiBUaGUgaW5vZGUgc2VudCBpbiBpcyBsb2NrZWQuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIEVEUVVPVCBvciBvdGhlciBlcnJvcnMgb3RoZXJ3aXNlCisgKi8KK1NUQVRJQyBpbnQKK3hmc190cmFuc19yZXNlcnZlX3F1b3RhX25ibGtzKAorCXhmc190cmFuc190CSp0cCwKKwl4ZnNfbW91bnRfdAkqbXAsCisJeGZzX2lub2RlX3QJKmlwLAorCWxvbmcJCW5ibGtzLAorCWxvbmcJCW5pbm9zLAorCXVpbnQJCXR5cGUpCit7CisJaW50CQllcnJvcjsKKworCWlmICghWEZTX0lTX1FVT1RBX09OKG1wKSkKKwkJcmV0dXJuICgwKTsKKworCUFTU0VSVChpcC0+aV9pbm8gIT0gbXAtPm1fc2Iuc2JfdXF1b3Rpbm8pOworCUFTU0VSVChpcC0+aV9pbm8gIT0gbXAtPm1fc2Iuc2JfZ3F1b3Rpbm8pOworCisJQVNTRVJUKFhGU19JU0xPQ0tFRF9JTk9ERV9FWENMKGlwKSk7CisJQVNTRVJUKFhGU19JU19RVU9UQV9SVU5OSU5HKGlwLT5pX21vdW50KSk7CisJQVNTRVJUKCh0eXBlICYgflhGU19RTU9QVF9GT1JDRV9SRVMpID09IFhGU19UUkFOU19EUV9SRVNfUlRCTEtTIHx8CisJICAgICAgICh0eXBlICYgflhGU19RTU9QVF9GT1JDRV9SRVMpID09IFhGU19UUkFOU19EUV9SRVNfQkxLUyk7CisKKwkvKgorCSAqIFJlc2VydmUgbmJsa3MgYWdhaW5zdCB0aGVzZSBkcXVvdHMsIHdpdGggdHJhbnMgYXMgdGhlIG1lZGlhdG9yLgorCSAqLworCWVycm9yID0geGZzX3RyYW5zX3Jlc2VydmVfcXVvdGFfYnlkcXVvdHModHAsIG1wLAorCQkJCQkJIGlwLT5pX3VkcXVvdCwgaXAtPmlfZ2RxdW90LAorCQkJCQkJIG5ibGtzLCBuaW5vcywKKwkJCQkJCSB0eXBlKTsKKwlyZXR1cm4gKGVycm9yKTsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gYWxsb2NhdGUgYSBxdW90YW9mZiBsb2cgaXRlbS4KKyAqLworeGZzX3FvZmZfbG9naXRlbV90ICoKK3hmc190cmFuc19nZXRfcW9mZl9pdGVtKAorCXhmc190cmFuc190CQkqdHAsCisJeGZzX3FvZmZfbG9naXRlbV90CSpzdGFydHFvZmYsCisJdWludAkJCWZsYWdzKQoreworCXhmc19xb2ZmX2xvZ2l0ZW1fdAkqcTsKKworCUFTU0VSVCh0cCAhPSBOVUxMKTsKKworCXEgPSB4ZnNfcW1fcW9mZl9sb2dpdGVtX2luaXQodHAtPnRfbW91bnRwLCBzdGFydHFvZmYsIGZsYWdzKTsKKwlBU1NFUlQocSAhPSBOVUxMKTsKKworCS8qCisJICogR2V0IGEgbG9nX2l0ZW1fZGVzYyB0byBwb2ludCBhdCB0aGUgbmV3IGl0ZW0uCisJICovCisJKHZvaWQpIHhmc190cmFuc19hZGRfaXRlbSh0cCwgKHhmc19sb2dfaXRlbV90KilxKTsKKworCXJldHVybiAocSk7Cit9CisKKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHRvIG1hcmsgdGhlIHF1b3Rhb2ZmIGxvZ2l0ZW0gYXMgbmVlZGluZworICogdG8gYmUgbG9nZ2VkIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIGNvbW1pdHRlZC4gIFRoZSBsb2dpdGVtIG11c3QKKyAqIGFscmVhZHkgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiB0cmFuc2FjdGlvbi4KKyAqLwordm9pZAoreGZzX3RyYW5zX2xvZ19xdW90YW9mZl9pdGVtKAorCXhmc190cmFuc190CQkqdHAsCisJeGZzX3FvZmZfbG9naXRlbV90CSpxbHApCit7CisJeGZzX2xvZ19pdGVtX2Rlc2NfdAkqbGlkcDsKKworCWxpZHAgPSB4ZnNfdHJhbnNfZmluZF9pdGVtKHRwLCAoeGZzX2xvZ19pdGVtX3QgKilxbHApOworCUFTU0VSVChsaWRwICE9IE5VTEwpOworCisJdHAtPnRfZmxhZ3MgfD0gWEZTX1RSQU5TX0RJUlRZOworCWxpZHAtPmxpZF9mbGFncyB8PSBYRlNfTElEX0RJUlRZOworfQorCitTVEFUSUMgdm9pZAoreGZzX3RyYW5zX2FsbG9jX2RxaW5mbygKKwl4ZnNfdHJhbnNfdAkqdHApCit7CisJKHRwKS0+dF9kcWluZm8gPSBrbWVtX3pvbmVfemFsbG9jKHhmc19HcW0tPnFtX2RxdHJ4em9uZSwgS01fU0xFRVApOworfQorCitTVEFUSUMgdm9pZAoreGZzX3RyYW5zX2ZyZWVfZHFpbmZvKAorCXhmc190cmFuc190CSp0cCkKK3sKKwlpZiAoIXRwLT50X2RxaW5mbykKKwkJcmV0dXJuOworCWttZW1fem9uZV9mcmVlKHhmc19HcW0tPnFtX2RxdHJ4em9uZSwgKHRwKS0+dF9kcWluZm8pOworCSh0cCktPnRfZHFpbmZvID0gTlVMTDsKK30KKworeGZzX2RxdHJ4b3BzX3QJeGZzX3RyYW5zX2RxdW90X29wcyA9IHsKKwkucW9fZHVwX2RxaW5mbwkJCT0geGZzX3RyYW5zX2R1cF9kcWluZm8sCisJLnFvX2ZyZWVfZHFpbmZvCQkJPSB4ZnNfdHJhbnNfZnJlZV9kcWluZm8sCisJLnFvX21vZF9kcXVvdF9ieWlubwkJPSB4ZnNfdHJhbnNfbW9kX2RxdW90X2J5aW5vLAorCS5xb19hcHBseV9kcXVvdF9kZWx0YXMJCT0geGZzX3RyYW5zX2FwcGx5X2RxdW90X2RlbHRhcywKKwkucW9fcmVzZXJ2ZV9xdW90YV9uYmxrcwkJPSB4ZnNfdHJhbnNfcmVzZXJ2ZV9xdW90YV9uYmxrcywKKwkucW9fcmVzZXJ2ZV9xdW90YV9ieWRxdW90cwk9IHhmc190cmFuc19yZXNlcnZlX3F1b3RhX2J5ZHF1b3RzLAorCS5xb191bnJlc2VydmVfYW5kX21vZF9kcXVvdHMJPSB4ZnNfdHJhbnNfdW5yZXNlcnZlX2FuZF9tb2RfZHF1b3RzLAorfTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9zdXBwb3J0L2RlYnVnLmMgYi9mcy94ZnMvc3VwcG9ydC9kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNmUxZjMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvc3VwcG9ydC9kZWJ1Zy5jCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSAiZGVidWcuaCIKKworI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworaW50CQkJZG9hc3MgPSAxOworc3RhdGljIGNoYXIJCW1lc3NhZ2VbMjU2XTsJLyoga2VlcCBpdCBvZmYgdGhlIHN0YWNrICovCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHhmc19lcnJfbG9jayk7CisKKy8qIFRyYW5zbGF0ZSBmcm9tIENFX0ZPTyB0byBLRVJOX0ZPTywgZXJyX2xldmVsKENFX0ZPTykgPT0gS0VSTl9GT08gKi8KKyNkZWZpbmUgWEZTX01BWF9FUlJfTEVWRUwJNworI2RlZmluZSBYRlNfRVJSX01BU0sJCSgoMSA8PCAzKSAtIDEpCitzdGF0aWMgY2hhcgkJKmVycl9sZXZlbFtYRlNfTUFYX0VSUl9MRVZFTCsxXSA9CisJCQkJCXtLRVJOX0VNRVJHLCBLRVJOX0FMRVJULCBLRVJOX0NSSVQsCisJCQkJCSBLRVJOX0VSUiwgS0VSTl9XQVJOSU5HLCBLRVJOX05PVElDRSwKKwkJCQkJIEtFUk5fSU5GTywgS0VSTl9ERUJVR307CisKK3ZvaWQKK2Fzc2ZhaWwoY2hhciAqYSwgY2hhciAqZiwgaW50IGwpCit7CisgICAgcHJpbnRrKCJYRlMgYXNzZXJ0aW9uIGZhaWxlZDogJXMsIGZpbGU6ICVzLCBsaW5lOiAlZFxuIiwgYSwgZiwgbCk7CisgICAgQlVHKCk7Cit9CisKKyNpZiAoKGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoSU5EVUNFX0lPX0VSUlJPUikpICYmICFkZWZpbmVkKE5PX1dBTlRfUkFORE9NKSkKKwordW5zaWduZWQgbG9uZworcmFuZG9tKHZvaWQpCit7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcJUmFuZG9tVmFsdWUgPSAxOworCS8qIGN5Y2xlcyBwc2V1ZG8tcmFuZG9tbHkgdGhyb3VnaCBhbGwgdmFsdWVzIGJldHdlZW4gMSBhbmQgMl4zMSAtIDIgKi8KKwlyZWdpc3RlciBsb25nCXJ2ID0gUmFuZG9tVmFsdWU7CisJcmVnaXN0ZXIgbG9uZwlsbzsKKwlyZWdpc3RlciBsb25nCWhpOworCisJaGkgPSBydiAvIDEyNzc3MzsKKwlsbyA9IHJ2ICUgMTI3NzczOworCXJ2ID0gMTY4MDcgKiBsbyAtIDI4MzYgKiBoaTsKKwlpZiggcnYgPD0gMCApIHJ2ICs9IDIxNDc0ODM2NDc7CisJcmV0dXJuKCBSYW5kb21WYWx1ZSA9IHJ2ICk7Cit9CisKK2ludAorZ2V0X3RocmVhZF9pZCh2b2lkKQoreworCXJldHVybiBjdXJyZW50LT5waWQ7Cit9CisKKyNlbmRpZiAvKiBERUJVRyB8fCBJTkRVQ0VfSU9fRVJSUk9SIHx8ICFOT19XQU5UX1JBTkRPTSAqLworCit2b2lkCitjbW5fZXJyKHJlZ2lzdGVyIGludCBsZXZlbCwgY2hhciAqZm10LCAuLi4pCit7CisJY2hhcgkqZnAgPSBmbXQ7CisJaW50CWxlbjsKKwl1bG9uZwlmbGFnczsKKwl2YV9saXN0CWFwOworCisJbGV2ZWwgJj0gWEZTX0VSUl9NQVNLOworCWlmIChsZXZlbCA+IFhGU19NQVhfRVJSX0xFVkVMKQorCQlsZXZlbCA9IFhGU19NQVhfRVJSX0xFVkVMOworCXNwaW5fbG9ja19pcnFzYXZlKCZ4ZnNfZXJyX2xvY2ssZmxhZ3MpOworCXZhX3N0YXJ0KGFwLCBmbXQpOworCWlmICgqZm10ID09ICchJykgZnArKzsKKwlsZW4gPSB2c3ByaW50ZihtZXNzYWdlLCBmcCwgYXApOworCWlmIChtZXNzYWdlW2xlbi0xXSAhPSAnXG4nKQorCQlzdHJjYXQobWVzc2FnZSwgIlxuIik7CisJcHJpbnRrKCIlcyVzIiwgZXJyX2xldmVsW2xldmVsXSwgbWVzc2FnZSk7CisJdmFfZW5kKGFwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4ZnNfZXJyX2xvY2ssZmxhZ3MpOworCisJaWYgKGxldmVsID09IENFX1BBTklDKQorCQlCVUcoKTsKK30KKworCit2b2lkCitpY21uX2VycihyZWdpc3RlciBpbnQgbGV2ZWwsIGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKK3sKKwl1bG9uZwlmbGFnczsKKwlpbnQJbGVuOworCisJbGV2ZWwgJj0gWEZTX0VSUl9NQVNLOworCWlmKGxldmVsID4gWEZTX01BWF9FUlJfTEVWRUwpCisJCWxldmVsID0gWEZTX01BWF9FUlJfTEVWRUw7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnhmc19lcnJfbG9jayxmbGFncyk7CisJbGVuID0gdnNwcmludGYobWVzc2FnZSwgZm10LCBhcCk7CisJaWYgKG1lc3NhZ2VbbGVuLTFdICE9ICdcbicpCisJCXN0cmNhdChtZXNzYWdlLCAiXG4iKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4ZnNfZXJyX2xvY2ssZmxhZ3MpOworCXByaW50aygiJXMlcyIsIGVycl9sZXZlbFtsZXZlbF0sIG1lc3NhZ2UpOworCWlmIChsZXZlbCA9PSBDRV9QQU5JQykKKwkJQlVHKCk7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMvc3VwcG9ydC9kZWJ1Zy5oIGIvZnMveGZzL3N1cHBvcnQvZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGIwZjRjCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3N1cHBvcnQvZGVidWcuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZglfX1hGU19TVVBQT1JUX0RFQlVHX0hfXworI2RlZmluZQlfX1hGU19TVVBQT1JUX0RFQlVHX0hfXworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNkZWZpbmUgQ0VfREVCVUcgICAgICAgIDcgICAgICAgICAgICAgICAvKiBkZWJ1ZyAgICAgICAgKi8KKyNkZWZpbmUgQ0VfQ09OVCAgICAgICAgIDYgICAgICAgICAgICAgICAvKiBjb250aW51YXRpb24gKi8KKyNkZWZpbmUgQ0VfTk9URSAgICAgICAgIDUgICAgICAgICAgICAgICAvKiBub3RpY2UgICAgICAgKi8KKyNkZWZpbmUgQ0VfV0FSTiAgICAgICAgIDQgICAgICAgICAgICAgICAvKiB3YXJuaW5nICAgICAgKi8KKyNkZWZpbmUgQ0VfQUxFUlQgICAgICAgIDEgICAgICAgICAgICAgICAvKiBhbGVydCAgICAgICAgKi8KKyNkZWZpbmUgQ0VfUEFOSUMgICAgICAgIDAgICAgICAgICAgICAgICAvKiBwYW5pYyAgICAgICAgKi8KKworZXh0ZXJuIHZvaWQgaWNtbl9lcnIoaW50LCBjaGFyICosIHZhX2xpc3QpOworLyogUFJJTlRGTElLRTIgKi8KK2V4dGVybiB2b2lkIGNtbl9lcnIoaW50LCBjaGFyICosIC4uLik7CisKKyNpZm5kZWYgU1RBVElDCisjIGRlZmluZSBTVEFUSUMgc3RhdGljCisjZW5kaWYKKworI2lmZGVmIERFQlVHCisjIGlmZGVmIGxpbnQKKyMgIGRlZmluZSBBU1NFUlQoRVgpCSgodm9pZCkwKSAvKiBhdm9pZCAiY29uc3RhbnQgaW4gY29uZGl0aW9uYWwiIGJhYmJsZSAqLworIyBlbHNlCisjICBkZWZpbmUgQVNTRVJUKEVYKSAoKCFkb2Fzc3x8KEVYKSk/KCh2b2lkKTApOmFzc2ZhaWwoI0VYLCBfX0ZJTEVfXywgX19MSU5FX18pKQorIyBlbmRpZgkvKiBsaW50ICovCisjZWxzZQorIyBkZWZpbmUgQVNTRVJUKHgpCSgodm9pZCkwKQorI2VuZGlmCisKK2V4dGVybiBpbnQgZG9hc3M7CQkvKiBkeW5hbWljYWxseSB0dXJuIG9mZiBhc3NlcnRzICovCitleHRlcm4gdm9pZCBhc3NmYWlsKGNoYXIgKiwgY2hhciAqLCBpbnQpOworI2lmZGVmIERFQlVHCitleHRlcm4gdW5zaWduZWQgbG9uZyByYW5kb20odm9pZCk7CitleHRlcm4gaW50IGdldF90aHJlYWRfaWQodm9pZCk7CisjZW5kaWYKKworI2RlZmluZSBBU1NFUlRfQUxXQVlTKEVYKSAgKChFWCk/KCh2b2lkKTApOmFzc2ZhaWwoI0VYLCBfX0ZJTEVfXywgX19MSU5FX18pKQorI2RlZmluZQlkZWJ1Z19zdG9wX2FsbF9jcHVzKHBhcmFtKQkvKiBwYXJhbSBpcyAiY3B1bWFza190ICoiICovCisKKyNlbmRpZiAgLyogX19YRlNfU1VQUE9SVF9ERUJVR19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy9zdXBwb3J0L2t0cmFjZS5jIGIvZnMveGZzL3N1cHBvcnQva3RyYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RhZTE0YwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9zdXBwb3J0L2t0cmFjZS5jCkBAIC0wLDAgKzEsMzQ2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSA8eGZzLmg+CisKK3N0YXRpYyBrbWVtX3pvbmVfdCAqa3RyYWNlX2hkcl96b25lOworc3RhdGljIGttZW1fem9uZV90ICprdHJhY2VfZW50X3pvbmU7CitzdGF0aWMgaW50ICAgICAgICAgIGt0cmFjZV96ZW50cmllczsKKwordm9pZAora3RyYWNlX2luaXQoaW50IHplbnRyaWVzKQoreworCWt0cmFjZV96ZW50cmllcyA9IHplbnRyaWVzOworCisJa3RyYWNlX2hkcl96b25lID0ga21lbV96b25lX2luaXQoc2l6ZW9mKGt0cmFjZV90KSwKKwkJCQkJImt0cmFjZV9oZHIiKTsKKwlBU1NFUlQoa3RyYWNlX2hkcl96b25lKTsKKworCWt0cmFjZV9lbnRfem9uZSA9IGttZW1fem9uZV9pbml0KGt0cmFjZV96ZW50cmllcworCQkJCQkqIHNpemVvZihrdHJhY2VfZW50cnlfdCksCisJCQkJCSJrdHJhY2VfZW50Iik7CisJQVNTRVJUKGt0cmFjZV9lbnRfem9uZSk7Cit9CisKK3ZvaWQKK2t0cmFjZV91bmluaXQodm9pZCkKK3sKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koa3RyYWNlX2hkcl96b25lKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koa3RyYWNlX2VudF96b25lKTsKK30KKworLyoKKyAqIGt0cmFjZV9hbGxvYygpCisgKgorICogQWxsb2NhdGUgYSBrdHJhY2UgaGVhZGVyIGFuZCBlbm91Z2ggYnVmZmVyaW5nIGZvciB0aGUgZ2l2ZW4KKyAqIG51bWJlciBvZiBlbnRyaWVzLgorICovCitrdHJhY2VfdCAqCitrdHJhY2VfYWxsb2MoaW50IG5lbnRyaWVzLCBpbnQgc2xlZXApCit7CisJa3RyYWNlX3QgICAgICAgICprdHA7CisJa3RyYWNlX2VudHJ5X3QgICprdGVwOworCisJa3RwID0gKGt0cmFjZV90KilrbWVtX3pvbmVfYWxsb2Moa3RyYWNlX2hkcl96b25lLCBzbGVlcCk7CisKKwlpZiAoa3RwID09IChrdHJhY2VfdCopTlVMTCkgeworCQkvKgorCQkgKiBLTV9TTEVFUCBjYWxsZXJzIGRvbid0IGV4cGVjdCBmYWlsdXJlLgorCQkgKi8KKwkJaWYgKHNsZWVwICYgS01fU0xFRVApCisJCQlwYW5pYygia3RyYWNlX2FsbG9jOiBOVUxMIG1lbW9yeSBvbiBLTV9TTEVFUCByZXF1ZXN0ISIpOworCisJCXJldHVybiBOVUxMOworCX0KKworCS8qCisJICogU3BlY2lhbCB0cmVhdG1lbnQgZm9yIGJ1ZmZlcnMgd2l0aCB0aGUga3RyYWNlX3plbnRyaWVzIGVudHJpZXMKKwkgKi8KKwlpZiAobmVudHJpZXMgPT0ga3RyYWNlX3plbnRyaWVzKSB7CisJCWt0ZXAgPSAoa3RyYWNlX2VudHJ5X3QqKWttZW1fem9uZV96YWxsb2Moa3RyYWNlX2VudF96b25lLAorCQkJCQkJCSAgICBzbGVlcCk7CisJfSBlbHNlIHsKKwkJa3RlcCA9IChrdHJhY2VfZW50cnlfdCopa21lbV96YWxsb2MoKG5lbnRyaWVzICogc2l6ZW9mKCprdGVwKSksCisJCQkJCQkJICAgIHNsZWVwKTsKKwl9CisKKwlpZiAoa3RlcCA9PSBOVUxMKSB7CisJCS8qCisJCSAqIEtNX1NMRUVQIGNhbGxlcnMgZG9uJ3QgZXhwZWN0IGZhaWx1cmUuCisJCSAqLworCQlpZiAoc2xlZXAgJiBLTV9TTEVFUCkKKwkJCXBhbmljKCJrdHJhY2VfYWxsb2M6IE5VTEwgbWVtb3J5IG9uIEtNX1NMRUVQIHJlcXVlc3QhIik7CisKKwkJa21lbV9mcmVlKGt0cCwgc2l6ZW9mKCprdHApKTsKKworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzcGlubG9ja19pbml0KCYoa3RwLT5rdF9sb2NrKSwgImt0X2xvY2siKTsKKworCWt0cC0+a3RfZW50cmllcyAgPSBrdGVwOworCWt0cC0+a3RfbmVudHJpZXMgPSBuZW50cmllczsKKwlrdHAtPmt0X2luZGV4ICAgID0gMDsKKwlrdHAtPmt0X3JvbGxvdmVyID0gMDsKKwlyZXR1cm4ga3RwOworfQorCisKKy8qCisgKiBrdHJhY2VfZnJlZSgpCisgKgorICogRnJlZSB1cCB0aGUga3RyYWNlIGhlYWRlciBhbmQgYnVmZmVyLiAgSXQgaXMgdXAgdG8gdGhlIGNhbGxlcgorICogdG8gZW5zdXJlIHRoYXQgbm8tb25lIGlzIHJlZmVyZW5jaW5nIGl0LgorICovCit2b2lkCitrdHJhY2VfZnJlZShrdHJhY2VfdCAqa3RwKQoreworCWludCAgICAgZW50cmllc19zaXplOworCisJaWYgKGt0cCA9PSAoa3RyYWNlX3QgKilOVUxMKQorCQlyZXR1cm47CisKKwlzcGlubG9ja19kZXN0cm95KCZrdHAtPmt0X2xvY2spOworCisJLyoKKwkgKiBTcGVjaWFsIHRyZWF0bWVudCBmb3IgdGhlIFZub2RlIHRyYWNlIGJ1ZmZlci4KKwkgKi8KKwlpZiAoa3RwLT5rdF9uZW50cmllcyA9PSBrdHJhY2VfemVudHJpZXMpIHsKKwkJa21lbV96b25lX2ZyZWUoa3RyYWNlX2VudF96b25lLCBrdHAtPmt0X2VudHJpZXMpOworCX0gZWxzZSB7CisJCWVudHJpZXNfc2l6ZSA9IChpbnQpKGt0cC0+a3RfbmVudHJpZXMgKiBzaXplb2Yoa3RyYWNlX2VudHJ5X3QpKTsKKworCQlrbWVtX2ZyZWUoa3RwLT5rdF9lbnRyaWVzLCBlbnRyaWVzX3NpemUpOworCX0KKworCWttZW1fem9uZV9mcmVlKGt0cmFjZV9oZHJfem9uZSwga3RwKTsKK30KKworCisvKgorICogRW50ZXIgdGhlIGdpdmVuIHZhbHVlcyBpbnRvIHRoZSAibmV4dCIgZW50cnkgaW4gdGhlIHRyYWNlIGJ1ZmZlci4KKyAqIGt0X2luZGV4IGlzIGFsd2F5cyB0aGUgaW5kZXggb2YgdGhlIG5leHQgZW50cnkgdG8gYmUgZmlsbGVkLgorICovCit2b2lkCitrdHJhY2VfZW50ZXIoCisJa3RyYWNlX3QgICAgICAgICprdHAsCisJdm9pZCAgICAgICAgICAgICp2YWwwLAorCXZvaWQgICAgICAgICAgICAqdmFsMSwKKwl2b2lkICAgICAgICAgICAgKnZhbDIsCisJdm9pZCAgICAgICAgICAgICp2YWwzLAorCXZvaWQgICAgICAgICAgICAqdmFsNCwKKwl2b2lkICAgICAgICAgICAgKnZhbDUsCisJdm9pZCAgICAgICAgICAgICp2YWw2LAorCXZvaWQgICAgICAgICAgICAqdmFsNywKKwl2b2lkICAgICAgICAgICAgKnZhbDgsCisJdm9pZCAgICAgICAgICAgICp2YWw5LAorCXZvaWQgICAgICAgICAgICAqdmFsMTAsCisJdm9pZCAgICAgICAgICAgICp2YWwxMSwKKwl2b2lkICAgICAgICAgICAgKnZhbDEyLAorCXZvaWQgICAgICAgICAgICAqdmFsMTMsCisJdm9pZCAgICAgICAgICAgICp2YWwxNCwKKwl2b2lkICAgICAgICAgICAgKnZhbDE1KQoreworCXN0YXRpYyBsb2NrX3QgICB3cmFwX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlpbnQgICAgICAgICAgICAgaW5kZXg7CisJa3RyYWNlX2VudHJ5X3QgICprdGVwOworCisJQVNTRVJUKGt0cCAhPSBOVUxMKTsKKworCS8qCisJICogR3JhYiBhbiBlbnRyeSBieSBwdXNoaW5nIHRoZSBpbmRleCB1cCB0byB0aGUgbmV4dCBvbmUuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJndyYXBfbG9jaywgZmxhZ3MpOworCWluZGV4ID0ga3RwLT5rdF9pbmRleDsKKwlpZiAoKytrdHAtPmt0X2luZGV4ID09IGt0cC0+a3RfbmVudHJpZXMpCisJCWt0cC0+a3RfaW5kZXggPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndyYXBfbG9jaywgZmxhZ3MpOworCisJaWYgKCFrdHAtPmt0X3JvbGxvdmVyICYmIGluZGV4ID09IGt0cC0+a3RfbmVudHJpZXMgLSAxKQorCQlrdHAtPmt0X3JvbGxvdmVyID0gMTsKKworCUFTU0VSVCgoaW5kZXggPj0gMCkgJiYgKGluZGV4IDwga3RwLT5rdF9uZW50cmllcykpOworCisJa3RlcCA9ICYoa3RwLT5rdF9lbnRyaWVzW2luZGV4XSk7CisKKwlrdGVwLT52YWxbMF0gID0gdmFsMDsKKwlrdGVwLT52YWxbMV0gID0gdmFsMTsKKwlrdGVwLT52YWxbMl0gID0gdmFsMjsKKwlrdGVwLT52YWxbM10gID0gdmFsMzsKKwlrdGVwLT52YWxbNF0gID0gdmFsNDsKKwlrdGVwLT52YWxbNV0gID0gdmFsNTsKKwlrdGVwLT52YWxbNl0gID0gdmFsNjsKKwlrdGVwLT52YWxbN10gID0gdmFsNzsKKwlrdGVwLT52YWxbOF0gID0gdmFsODsKKwlrdGVwLT52YWxbOV0gID0gdmFsOTsKKwlrdGVwLT52YWxbMTBdID0gdmFsMTA7CisJa3RlcC0+dmFsWzExXSA9IHZhbDExOworCWt0ZXAtPnZhbFsxMl0gPSB2YWwxMjsKKwlrdGVwLT52YWxbMTNdID0gdmFsMTM7CisJa3RlcC0+dmFsWzE0XSA9IHZhbDE0OworCWt0ZXAtPnZhbFsxNV0gPSB2YWwxNTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHRyYWNlIGJ1ZmZlci4KKyAqLworaW50CitrdHJhY2VfbmVudHJpZXMoCisJa3RyYWNlX3QgICAgICAgICprdHApCit7CisJaWYgKGt0cCA9PSBOVUxMKSB7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAoa3RwLT5rdF9yb2xsb3ZlciA/IGt0cC0+a3RfbmVudHJpZXMgOiBrdHAtPmt0X2luZGV4KTsKK30KKworLyoKKyAqIGt0cmFjZV9maXJzdCgpCisgKgorICogVGhpcyBpcyB1c2VkIHRvIGZpbmQgdGhlIHN0YXJ0IG9mIHRoZSB0cmFjZSBidWZmZXIuCisgKiBJbiBjb25qdW5jdGlvbiB3aXRoIGt0cmFjZV9uZXh0KCkgaXQgY2FuIGJlIHVzZWQgdG8KKyAqIGl0ZXJhdGUgdGhyb3VnaCB0aGUgZW50aXJlIHRyYWNlIGJ1ZmZlci4gIFRoaXMgY29kZSBkb2VzCisgKiBub3QgZG8gYW55IGxvY2tpbmcgYmVjYXVzZSBpdCBpcyBhc3N1bWVkIHRoYXQgaXQgaXMgY2FsbGVkCisgKiBmcm9tIHRoZSBkZWJ1Z2dlci4KKyAqCisgKiBUaGUgY2FsbGVyIG11c3QgcGFzcyBpbiBhIHBvaW50ZXIgdG8gYSBrdHJhY2Vfc25hcAorICogc3RydWN0dXJlIGluIHdoaWNoIHdlIHdpbGwga2VlcCBzb21lIHN0YXRlIHVzZWQgdG8KKyAqIGl0ZXJhdGUgdGhyb3VnaCB0aGUgYnVmZmVyLiAgVGhpcyBzdGF0ZSBtdXN0IG5vdCB0b3VjaGVkCisgKiBieSBhbnkgY29kZSBvdXRzaWRlIG9mIHRoaXMgbW9kdWxlLgorICovCitrdHJhY2VfZW50cnlfdCAqCitrdHJhY2VfZmlyc3Qoa3RyYWNlX3QgICAqa3RwLCBrdHJhY2Vfc25hcF90ICAgICAqa3RzcCkKK3sKKwlrdHJhY2VfZW50cnlfdCAgKmt0ZXA7CisJaW50ICAgICAgICAgICAgIGluZGV4OworCWludCAgICAgICAgICAgICBuZW50cmllczsKKworCWlmIChrdHAtPmt0X3JvbGxvdmVyKQorCQlpbmRleCA9IGt0cC0+a3RfaW5kZXg7CisJZWxzZQorCQlpbmRleCA9IDA7CisKKwlrdHNwLT5rc19zdGFydCA9IGluZGV4OworCWt0ZXAgPSAmKGt0cC0+a3RfZW50cmllc1tpbmRleF0pOworCisJbmVudHJpZXMgPSBrdHJhY2VfbmVudHJpZXMoa3RwKTsKKwlpbmRleCsrOworCWlmIChpbmRleCA8IG5lbnRyaWVzKSB7CisJCWt0c3AtPmtzX2luZGV4ID0gaW5kZXg7CisJfSBlbHNlIHsKKwkJa3RzcC0+a3NfaW5kZXggPSAwOworCQlpZiAoaW5kZXggPiBuZW50cmllcykKKwkJCWt0ZXAgPSBOVUxMOworCX0KKwlyZXR1cm4ga3RlcDsKK30KKworLyoKKyAqIGt0cmFjZV9uZXh0KCkKKyAqCisgKiBUaGlzIGlzIHVzZWQgdG8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBlbnRyaWVzIG9mIHRoZSBnaXZlbgorICogdHJhY2UgYnVmZmVyLiAgVGhlIGNhbGxlciBtdXN0IHBhc3MgaW4gdGhlIGt0cmFjZV9zbmFwX3QKKyAqIHN0cnVjdHVyZSBpbml0aWFsaXplZCBieSBrdHJhY2VfZmlyc3QoKS4gIFRoZSByZXR1cm4gdmFsdWUKKyAqIHdpbGwgYmUgZWl0aGVyIGEgcG9pbnRlciB0byB0aGUgbmV4dCBrdHJhY2VfZW50cnkgb3IgTlVMTAorICogaWYgYWxsIG9mIHRoZSBlbnRyaWVzIGhhdmUgYmVlbiB0cmF2ZXJzZWQuCisgKi8KK2t0cmFjZV9lbnRyeV90ICoKK2t0cmFjZV9uZXh0KAorCWt0cmFjZV90ICAgICAgICAqa3RwLAorCWt0cmFjZV9zbmFwX3QgICAqa3RzcCkKK3sKKwlpbnQgICAgICAgICAgICAgaW5kZXg7CisJa3RyYWNlX2VudHJ5X3QgICprdGVwOworCisJaW5kZXggPSBrdHNwLT5rc19pbmRleDsKKwlpZiAoaW5kZXggPT0ga3RzcC0+a3Nfc3RhcnQpIHsKKwkJa3RlcCA9IE5VTEw7CisJfSBlbHNlIHsKKwkJa3RlcCA9ICZrdHAtPmt0X2VudHJpZXNbaW5kZXhdOworCX0KKworCWluZGV4Kys7CisJaWYgKGluZGV4ID09IGt0cmFjZV9uZW50cmllcyhrdHApKSB7CisJCWt0c3AtPmtzX2luZGV4ID0gMDsKKwl9IGVsc2UgeworCQlrdHNwLT5rc19pbmRleCA9IGluZGV4OworCX0KKworCXJldHVybiBrdGVwOworfQorCisvKgorICoga3RyYWNlX3NraXAoKQorICoKKyAqIFNraXAgdGhlIG5leHQgImNvdW50IiBlbnRyaWVzIGFuZCByZXR1cm4gdGhlIGVudHJ5IGFmdGVyIHRoYXQuCisgKiBSZXR1cm4gTlVMTCBpZiB0aGlzIGNhdXNlcyB1cyB0byBpdGVyYXRlIHBhc3QgdGhlIGJlZ2lubmluZyBhZ2Fpbi4KKyAqLwora3RyYWNlX2VudHJ5X3QgKgora3RyYWNlX3NraXAoCisJa3RyYWNlX3QgICAgICAgICprdHAsCisJaW50ICAgICAgICAgICAgIGNvdW50LAorCWt0cmFjZV9zbmFwX3QgICAqa3RzcCkKK3sKKwlpbnQgICAgICAgICAgICAgaW5kZXg7CisJaW50ICAgICAgICAgICAgIG5ld19pbmRleDsKKwlrdHJhY2VfZW50cnlfdCAgKmt0ZXA7CisJaW50ICAgICAgICAgICAgIG5lbnRyaWVzID0ga3RyYWNlX25lbnRyaWVzKGt0cCk7CisKKwlpbmRleCA9IGt0c3AtPmtzX2luZGV4OworCW5ld19pbmRleCA9IGluZGV4ICsgY291bnQ7CisJd2hpbGUgKG5ld19pbmRleCA+PSBuZW50cmllcykgeworCQluZXdfaW5kZXggLT0gbmVudHJpZXM7CisJfQorCWlmIChpbmRleCA9PSBrdHNwLT5rc19zdGFydCkgeworCQkvKgorCQkgKiBXZSd2ZSBpdGVyYXRlZCBhcm91bmQgdG8gdGhlIHN0YXJ0LCBzbyB3ZSdyZSBkb25lLgorCQkgKi8KKwkJa3RlcCA9IE5VTEw7CisJfSBlbHNlIGlmICgobmV3X2luZGV4IDwgaW5kZXgpICYmIChpbmRleCA8IGt0c3AtPmtzX2luZGV4KSkgeworCQkvKgorCQkgKiBXZSd2ZSBza2lwcGVkIHBhc3QgdGhlIHN0YXJ0IGFnYWluLCBzbyB3ZSdyZSBkb25lLgorCQkgKi8KKwkJa3RlcCA9IE5VTEw7CisJCWt0c3AtPmtzX2luZGV4ID0ga3RzcC0+a3Nfc3RhcnQ7CisJfSBlbHNlIHsKKwkJa3RlcCA9ICYoa3RwLT5rdF9lbnRyaWVzW25ld19pbmRleF0pOworCQluZXdfaW5kZXgrKzsKKwkJaWYgKG5ld19pbmRleCA9PSBuZW50cmllcykgeworCQkJa3RzcC0+a3NfaW5kZXggPSAwOworCQl9IGVsc2UgeworCQkJa3RzcC0+a3NfaW5kZXggPSBuZXdfaW5kZXg7CisJCX0KKwl9CisJcmV0dXJuIGt0ZXA7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMvc3VwcG9ydC9rdHJhY2UuaCBiL2ZzL3hmcy9zdXBwb3J0L2t0cmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZDFhMWEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvc3VwcG9ydC9rdHJhY2UuaApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfU1VQUE9SVF9LVFJBQ0VfSF9fCisjZGVmaW5lIF9fWEZTX1NVUFBPUlRfS1RSQUNFX0hfXworCisjaW5jbHVkZSA8c3Bpbi5oPgorCisvKgorICogVHJhY2UgYnVmZmVyIGVudHJ5IHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3Qga3RyYWNlX2VudHJ5IHsKKwl2b2lkCSp2YWxbMTZdOworfSBrdHJhY2VfZW50cnlfdDsKKworLyoKKyAqIFRyYWNlIGJ1ZmZlciBoZWFkZXIgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBrdHJhY2UgeworCWxvY2tfdAkJa3RfbG9jazsJLyogbXV0ZXggdG8gZ3VhcmQgY291bnRlcnMgKi8KKwlpbnQJCWt0X25lbnRyaWVzOwkvKiBudW1iZXIgb2YgZW50cmllcyBpbiB0cmFjZSBidWYgKi8KKwlpbnQJCWt0X2luZGV4OwkvKiBjdXJyZW50IGluZGV4IGluIGVudHJpZXMgKi8KKwlpbnQJCWt0X3JvbGxvdmVyOworCWt0cmFjZV9lbnRyeV90CSprdF9lbnRyaWVzOwkvKiBidWZmZXIgb2YgZW50cmllcyAqLworfSBrdHJhY2VfdDsKKworLyoKKyAqIFRyYWNlIGJ1ZmZlciBzbmFwc2hvdCBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IGt0cmFjZV9zbmFwIHsKKwlpbnQJCWtzX3N0YXJ0OwkvKiBrdF9pbmRleCBhdCB0aW1lIG9mIHNuYXAgKi8KKwlpbnQJCWtzX2luZGV4OwkvKiBjdXJyZW50IGluZGV4ICovCit9IGt0cmFjZV9zbmFwX3Q7CisKKworI2lmZGVmIENPTkZJR19YRlNfVFJBQ0UKKworZXh0ZXJuIHZvaWQga3RyYWNlX2luaXQoaW50IHplbnRyaWVzKTsKK2V4dGVybiB2b2lkIGt0cmFjZV91bmluaXQodm9pZCk7CisKK2V4dGVybiBrdHJhY2VfdCAqa3RyYWNlX2FsbG9jKGludCwgaW50KTsKK2V4dGVybiB2b2lkIGt0cmFjZV9mcmVlKGt0cmFjZV90ICopOworCitleHRlcm4gdm9pZCBrdHJhY2VfZW50ZXIoCisJa3RyYWNlX3QJKiwKKwl2b2lkCQkqLAorCXZvaWQJCSosCisJdm9pZAkJKiwKKwl2b2lkCQkqLAorCXZvaWQJCSosCisJdm9pZAkJKiwKKwl2b2lkCQkqLAorCXZvaWQJCSosCisJdm9pZAkJKiwKKwl2b2lkCQkqLAorCXZvaWQJCSosCisJdm9pZAkJKiwKKwl2b2lkCQkqLAorCXZvaWQJCSosCisJdm9pZAkJKiwKKwl2b2lkCQkqKTsKKworZXh0ZXJuIGt0cmFjZV9lbnRyeV90ICAgKmt0cmFjZV9maXJzdChrdHJhY2VfdCAqLCBrdHJhY2Vfc25hcF90ICopOworZXh0ZXJuIGludCAgICAgICAgICAgICAga3RyYWNlX25lbnRyaWVzKGt0cmFjZV90ICopOworZXh0ZXJuIGt0cmFjZV9lbnRyeV90ICAgKmt0cmFjZV9uZXh0KGt0cmFjZV90ICosIGt0cmFjZV9zbmFwX3QgKik7CitleHRlcm4ga3RyYWNlX2VudHJ5X3QgICAqa3RyYWNlX3NraXAoa3RyYWNlX3QgKiwgaW50LCBrdHJhY2Vfc25hcF90ICopOworCisjZWxzZQorI2RlZmluZSBrdHJhY2VfaW5pdCh4KQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIGt0cmFjZV91bmluaXQoKQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYJLyogQ09ORklHX1hGU19UUkFDRSAqLworCisjZW5kaWYJLyogX19YRlNfU1VQUE9SVF9LVFJBQ0VfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvc3VwcG9ydC9tb3ZlLmMgYi9mcy94ZnMvc3VwcG9ydC9tb3ZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTViNTE5NAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9zdXBwb3J0L21vdmUuYwpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSA8eGZzLmg+CisKKy8qIFJlYWQgZnJvbSBrZXJuZWwgYnVmZmVyIGF0IHNyYyB0byB1c2VyL2tlcm5lbCBidWZmZXIgZGVmaW5lZAorICogYnkgdGhlIHVpbyBzdHJ1Y3R1cmUuIEFkdmFuY2UgdGhlIHBvaW50ZXIgaW4gdGhlIHVpbyBzdHJ1Y3QKKyAqIGFzIHdlIGdvLgorICovCitpbnQKK3Vpb19yZWFkKGNhZGRyX3Qgc3JjLCBzaXplX3QgbGVuLCBzdHJ1Y3QgdWlvICp1aW8pCit7CisJc2l6ZV90CWNvdW50OworCisJaWYgKCFsZW4gfHwgIXVpby0+dWlvX3Jlc2lkKQorCQlyZXR1cm4gMDsKKworCWNvdW50ID0gdWlvLT51aW9faW92LT5pb3ZfbGVuOworCWlmICghY291bnQpCisJCXJldHVybiAwOworCWlmIChjb3VudCA+IGxlbikKKwkJY291bnQgPSBsZW47CisKKwlpZiAodWlvLT51aW9fc2VnZmxnID09IFVJT19VU0VSU1BBQ0UpIHsKKwkJaWYgKGNvcHlfdG9fdXNlcih1aW8tPnVpb19pb3YtPmlvdl9iYXNlLCBzcmMsIGNvdW50KSkKKwkJCXJldHVybiBFRkFVTFQ7CisJfSBlbHNlIHsKKwkJQVNTRVJUKHVpby0+dWlvX3NlZ2ZsZyA9PSBVSU9fU1lTU1BBQ0UpOworCQltZW1jcHkodWlvLT51aW9faW92LT5pb3ZfYmFzZSwgc3JjLCBjb3VudCk7CisJfQorCisJdWlvLT51aW9faW92LT5pb3ZfYmFzZSA9ICh2b2lkKikoKGNoYXIqKXVpby0+dWlvX2lvdi0+aW92X2Jhc2UgKyBjb3VudCk7CisJdWlvLT51aW9faW92LT5pb3ZfbGVuIC09IGNvdW50OworCXVpby0+dWlvX29mZnNldCArPSBjb3VudDsKKwl1aW8tPnVpb19yZXNpZCAtPSBjb3VudDsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy9zdXBwb3J0L21vdmUuaCBiL2ZzL3hmcy9zdXBwb3J0L21vdmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDQwNmRjCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3N1cHBvcnQvbW92ZS5oCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICogCisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKGMpIDE5ODIsIDE5ODYsIDE5OTMsIDE5OTQKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBfX1hGU19TVVBQT1JUX01PVkVfSF9fCisjZGVmaW5lIF9fWEZTX1NVUFBPUlRfTU9WRV9IX18KKworI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKy8qIFNlZ21lbnQgZmxhZyB2YWx1ZXMuICovCitlbnVtIHVpb19zZWcgeworCVVJT19VU0VSU1BBQ0UsICAgICAgICAgIC8qIGZyb20gdXNlciBkYXRhIHNwYWNlICovCisJVUlPX1NZU1NQQUNFLCAgICAgICAgICAgLyogZnJvbSBzeXN0ZW0gc3BhY2UgKi8KK307CisKK3N0cnVjdCB1aW8geworCXN0cnVjdCBpb3ZlYwkqdWlvX2lvdjsgICAvKiBwb2ludGVyIHRvIGFycmF5IG9mIGlvdmVjcyAqLworCWludAkJdWlvX2lvdmNudDsgLyogbnVtYmVyIG9mIGlvdmVjcyBpbiBhcnJheSAqLworCXhmc19vZmZfdAl1aW9fb2Zmc2V0OyAvKiBvZmZzZXQgaW4gZmlsZSB0aGlzIHVpbyBjb3JyZXNwb25kcyB0byAqLworCWludAkJdWlvX3Jlc2lkOyAgLyogcmVzaWR1YWwgaS9vIGNvdW50ICovCisJZW51bSB1aW9fc2VnCXVpb19zZWdmbGc7IC8qIHNlZSBhYm92ZSAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QgdWlvIHVpb190OwordHlwZWRlZiBzdHJ1Y3QgaW92ZWMgaW92ZWNfdDsKKworZXh0ZXJuIGludAl1aW9fcmVhZCAoY2FkZHJfdCwgc2l6ZV90LCB1aW9fdCAqKTsKKworI2VuZGlmICAvKiBfX1hGU19TVVBQT1JUX01PVkVfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMvc3VwcG9ydC9xc29ydC5jIGIvZnMveGZzL3N1cHBvcnQvcXNvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWM4MjQxCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3N1cHBvcnQvcXNvcnQuYwpAQCAtMCwwICsxLDE1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5MiwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworLyoKKyAqIFFzb3J0IHJvdXRpbmUgZnJvbSBCZW50bGV5ICYgTWNJbHJveSdzICJFbmdpbmVlcmluZyBhIFNvcnQgRnVuY3Rpb24iLgorICovCisjZGVmaW5lIHN3YXBjb2RlKFRZUEUsIHBhcm1pLCBwYXJtaiwgbikgeyAJCVwKKwlsb25nIGkgPSAobikgLyBzaXplb2YgKFRZUEUpOyAJCQlcCisJcmVnaXN0ZXIgVFlQRSAqcGkgPSAoVFlQRSAqKSAocGFybWkpOyAJCVwKKwlyZWdpc3RlciBUWVBFICpwaiA9IChUWVBFICopIChwYXJtaik7IAkJXAorCWRvIHsgCQkJCQkJXAorCQlyZWdpc3RlciBUWVBFCXQgPSAqcGk7CQlcCisJCSpwaSsrID0gKnBqOwkJCQlcCisJCSpwaisrID0gdDsJCQkJXAorICAgICAgICB9IHdoaWxlICgtLWkgPiAwKTsJCQkJXAorfQorCisjZGVmaW5lIFNXQVBJTklUKGEsIGVzKSBzd2FwdHlwZSA9ICgoY2hhciAqKWEgLSAoY2hhciAqKTApICUgc2l6ZW9mKGxvbmcpIHx8IFwKKwllcyAlIHNpemVvZihsb25nKSA/IDIgOiBlcyA9PSBzaXplb2YobG9uZyk/IDAgOiAxOworCitzdGF0aWMgX19pbmxpbmUgdm9pZAorc3dhcGZ1bmMoY2hhciAqYSwgY2hhciAqYiwgaW50IG4sIGludCBzd2FwdHlwZSkKK3sKKwlpZiAoc3dhcHR5cGUgPD0gMSkgCisJCXN3YXBjb2RlKGxvbmcsIGEsIGIsIG4pCisJZWxzZQorCQlzd2FwY29kZShjaGFyLCBhLCBiLCBuKQorfQorCisjZGVmaW5lIHN3YXAoYSwgYikJCQkJCVwKKwlpZiAoc3dhcHR5cGUgPT0gMCkgewkJCQlcCisJCWxvbmcgdCA9ICoobG9uZyAqKShhKTsJCQlcCisJCSoobG9uZyAqKShhKSA9ICoobG9uZyAqKShiKTsJCVwKKwkJKihsb25nICopKGIpID0gdDsJCQlcCisJfSBlbHNlCQkJCQkJXAorCQlzd2FwZnVuYyhhLCBiLCBlcywgc3dhcHR5cGUpCisKKyNkZWZpbmUgdmVjc3dhcChhLCBiLCBuKSAJaWYgKChuKSA+IDApIHN3YXBmdW5jKGEsIGIsIG4sIHN3YXB0eXBlKQorCitzdGF0aWMgX19pbmxpbmUgY2hhciAqCittZWQzKGNoYXIgKmEsIGNoYXIgKmIsIGNoYXIgKmMsIGludCAoKmNtcCkoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKQoreworCXJldHVybiBjbXAoYSwgYikgPCAwID8KKwkgICAgICAgKGNtcChiLCBjKSA8IDAgPyBiIDogKGNtcChhLCBjKSA8IDAgPyBjIDogYSApKQorICAgICAgICAgICAgICA6KGNtcChiLCBjKSA+IDAgPyBiIDogKGNtcChhLCBjKSA8IDAgPyBhIDogYyApKTsKK30KKwordm9pZAorcXNvcnQodm9pZCAqYWEsIHNpemVfdCBuLCBzaXplX3QgZXMsIGludCAoKmNtcCkoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopKQoreworCWNoYXIgKnBhLCAqcGIsICpwYywgKnBkLCAqcGwsICpwbSwgKnBuOworCWludCBkLCByLCBzd2FwdHlwZSwgc3dhcF9jbnQ7CisJcmVnaXN0ZXIgY2hhciAqYSA9IGFhOworCitsb29wOglTV0FQSU5JVChhLCBlcyk7CisJc3dhcF9jbnQgPSAwOworCWlmIChuIDwgNykgeworCQlmb3IgKHBtID0gKGNoYXIgKilhICsgZXM7IHBtIDwgKGNoYXIgKikgYSArIG4gKiBlczsgcG0gKz0gZXMpCisJCQlmb3IgKHBsID0gcG07IHBsID4gKGNoYXIgKikgYSAmJiBjbXAocGwgLSBlcywgcGwpID4gMDsKKwkJCSAgICAgcGwgLT0gZXMpCisJCQkJc3dhcChwbCwgcGwgLSBlcyk7CisJCXJldHVybjsKKwl9CisJcG0gPSAoY2hhciAqKWEgKyAobiAvIDIpICogZXM7CisJaWYgKG4gPiA3KSB7CisJCXBsID0gKGNoYXIgKilhOworCQlwbiA9IChjaGFyICopYSArIChuIC0gMSkgKiBlczsKKwkJaWYgKG4gPiA0MCkgeworCQkJZCA9IChuIC8gOCkgKiBlczsKKwkJCXBsID0gbWVkMyhwbCwgcGwgKyBkLCBwbCArIDIgKiBkLCBjbXApOworCQkJcG0gPSBtZWQzKHBtIC0gZCwgcG0sIHBtICsgZCwgY21wKTsKKwkJCXBuID0gbWVkMyhwbiAtIDIgKiBkLCBwbiAtIGQsIHBuLCBjbXApOworCQl9CisJCXBtID0gbWVkMyhwbCwgcG0sIHBuLCBjbXApOworCX0KKwlzd2FwKGEsIHBtKTsKKwlwYSA9IHBiID0gKGNoYXIgKilhICsgZXM7CisKKwlwYyA9IHBkID0gKGNoYXIgKilhICsgKG4gLSAxKSAqIGVzOworCWZvciAoOzspIHsKKwkJd2hpbGUgKHBiIDw9IHBjICYmIChyID0gY21wKHBiLCBhKSkgPD0gMCkgeworCQkJaWYgKHIgPT0gMCkgeworCQkJCXN3YXBfY250ID0gMTsKKwkJCQlzd2FwKHBhLCBwYik7CisJCQkJcGEgKz0gZXM7CisJCQl9CisJCQlwYiArPSBlczsKKwkJfQorCQl3aGlsZSAocGIgPD0gcGMgJiYgKHIgPSBjbXAocGMsIGEpKSA+PSAwKSB7CisJCQlpZiAociA9PSAwKSB7CisJCQkJc3dhcF9jbnQgPSAxOworCQkJCXN3YXAocGMsIHBkKTsKKwkJCQlwZCAtPSBlczsKKwkJCX0KKwkJCXBjIC09IGVzOworCQl9CisJCWlmIChwYiA+IHBjKQorCQkJYnJlYWs7CisJCXN3YXAocGIsIHBjKTsKKwkJc3dhcF9jbnQgPSAxOworCQlwYiArPSBlczsKKwkJcGMgLT0gZXM7CisJfQorCWlmIChzd2FwX2NudCA9PSAwKSB7ICAvKiBTd2l0Y2ggdG8gaW5zZXJ0aW9uIHNvcnQgKi8KKwkJZm9yIChwbSA9IChjaGFyICopIGEgKyBlczsgcG0gPCAoY2hhciAqKSBhICsgbiAqIGVzOyBwbSArPSBlcykKKwkJCWZvciAocGwgPSBwbTsgcGwgPiAoY2hhciAqKSBhICYmIGNtcChwbCAtIGVzLCBwbCkgPiAwOyAKKwkJCSAgICAgcGwgLT0gZXMpCisJCQkJc3dhcChwbCwgcGwgLSBlcyk7CisJCXJldHVybjsKKwl9CisKKwlwbiA9IChjaGFyICopYSArIG4gKiBlczsKKwlyID0gbWluKHBhIC0gKGNoYXIgKilhLCBwYiAtIHBhKTsKKwl2ZWNzd2FwKGEsIHBiIC0gciwgcik7CisJciA9IG1pbigobG9uZykocGQgLSBwYyksIChsb25nKShwbiAtIHBkIC0gZXMpKTsKKwl2ZWNzd2FwKHBiLCBwbiAtIHIsIHIpOworCWlmICgociA9IHBiIC0gcGEpID4gZXMpCisJCXFzb3J0KGEsIHIgLyBlcywgZXMsIGNtcCk7CisJaWYgKChyID0gcGQgLSBwYykgPiBlcykgeyAKKwkJLyogSXRlcmF0ZSByYXRoZXIgdGhhbiByZWN1cnNlIHRvIHNhdmUgc3RhY2sgc3BhY2UgKi8KKwkJYSA9IHBuIC0gcjsKKwkJbiA9IHIgLyBlczsKKwkJZ290byBsb29wOworCX0KKy8qCQlxc29ydChwbiAtIHIsIHIgLyBlcywgZXMsIGNtcCk7Ki8KK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy9zdXBwb3J0L3Fzb3J0LmggYi9mcy94ZnMvc3VwcG9ydC9xc29ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MjYzMTAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMvc3VwcG9ydC9xc29ydC5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpZm5kZWYgUVNPUlRfSAorI2RlZmluZSBRU09SVF9ICisKK2V4dGVybiB2b2lkIHFzb3J0ICh2b2lkICpjb25zdCBwYmFzZSwKKwkJICAgIHNpemVfdCB0b3RhbF9lbGVtcywKKwkJICAgIHNpemVfdCBzaXplLAorCQkgICAgaW50ICgqY21wKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL3hmcy9zdXBwb3J0L3V1aWQuYyBiL2ZzL3hmcy9zdXBwb3J0L3V1aWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWY0MGNmCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3N1cHBvcnQvdXVpZC5jCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSA8eGZzLmg+CisKK3N0YXRpYyBtdXRleF90CXV1aWRfbW9uaXRvcjsKK3N0YXRpYyBpbnQJdXVpZF90YWJsZV9zaXplOworc3RhdGljIHV1aWRfdAkqdXVpZF90YWJsZTsKKwordm9pZAordXVpZF9pbml0KHZvaWQpCit7CisJbXV0ZXhfaW5pdCgmdXVpZF9tb25pdG9yLCBNVVRFWF9ERUZBVUxULCAidXVpZF9tb25pdG9yIik7Cit9CisKKy8qCisgKiB1dWlkX2dldG5vZGV1bmlxIC0gb2J0YWluIHRoZSBub2RlIHVuaXF1ZSBmaWVsZHMgb2YgYSBVVUlELgorICoKKyAqIFRoaXMgaXMgbm90IGluIGFueSB3YXkgYSBzdGFuZGFyZCBvciBjb25kb25lZCBVVUlEIGZ1bmN0aW9uOworICogaXQganVzdCBzb21ldGhpbmcgdGhhdCdzIG5lZWRlZCBmb3IgdXNlci1sZXZlbCBmaWxlIGhhbmRsZXMuCisgKi8KK3ZvaWQKK3V1aWRfZ2V0bm9kZXVuaXEodXVpZF90ICp1dWlkLCBpbnQgZnNpZCBbMl0pCit7CisJY2hhcgkqdXUgPSAoY2hhciAqKXV1aWQ7CisKKwkvKiBvbiBJUklYLCB0aGlzIGZ1bmN0aW9uIGFzc3VtZXMgYmlnLWVuZGlhbiBmaWVsZHMgd2l0aGluCisJICogdGhlIHV1aWQsIHNvIHdlIHVzZSBJTlRfR0VUIHRvIGdldCB0aGUgc2FtZSByZXN1bHQgb24KKwkgKiBsaXR0bGUtZW5kaWFuIHN5c3RlbXMKKwkgKi8KKworCWZzaWRbMF0gPSAoSU5UX0dFVCgqKHVfaW50MTZfdCopKHV1KzgpLCBBUkNIX0NPTlZFUlQpIDw8IDE2KSArCisJCSAgIElOVF9HRVQoKih1X2ludDE2X3QqKSh1dSs0KSwgQVJDSF9DT05WRVJUKTsKKwlmc2lkWzFdID0gIElOVF9HRVQoKih1X2ludDMyX3QqKSh1dSAgKSwgQVJDSF9DT05WRVJUKTsKK30KKwordm9pZAordXVpZF9jcmVhdGVfbmlsKHV1aWRfdCAqdXVpZCkKK3sKKwltZW1zZXQodXVpZCwgMCwgc2l6ZW9mKCp1dWlkKSk7Cit9CisKK2ludAordXVpZF9pc19uaWwodXVpZF90ICp1dWlkKQoreworCWludAlpOworCWNoYXIJKmNwID0gKGNoYXIgKil1dWlkOworCisJaWYgKHV1aWQgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJLyogaW1wbGllZCBjaGVjayBvZiB2ZXJzaW9uIG51bWJlciBoZXJlLi4uICovCisJZm9yIChpID0gMDsgaSA8IHNpemVvZiAqdXVpZDsgaSsrKQorCQlpZiAoKmNwKyspIHJldHVybiAwOwkvKiBub3QgbmlsICovCisJcmV0dXJuIDE7CS8qIGlzIG5pbCAqLworfQorCitpbnQKK3V1aWRfZXF1YWwodXVpZF90ICp1dWlkMSwgdXVpZF90ICp1dWlkMikKK3sKKwlyZXR1cm4gbWVtY21wKHV1aWQxLCB1dWlkMiwgc2l6ZW9mKHV1aWRfdCkpID8gMCA6IDE7Cit9CisKKy8qCisgKiBHaXZlbiBhIDEyOC1iaXQgdXVpZCwgcmV0dXJuIGEgNjQtYml0IHZhbHVlIGJ5IGFkZGluZyB0aGUgdG9wIGFuZCBib3R0b20KKyAqIDY0LWJpdCB3b3Jkcy4gIE5PVEU6IFRoaXMgZnVuY3Rpb24gY2FuIG5vdCBiZSBjaGFuZ2VkIEVWRVIuICBBbHRob3VnaAorICogYnJhaW4tZGVhZCwgc29tZSBhcHBsaWNhdGlvbnMgZGVwZW5kIG9uIHRoaXMgNjQtYml0IHZhbHVlIHJlbWFpbmluZworICogcGVyc2lzdGVudC4gIFNwZWNpZmljYWxseSwgRE1JIHZlbmRvcnMgc3RvcmUgdGhlIHZhbHVlIGFzIGEgcGVyc2lzdGVudAorICogZmlsZWhhbmRsZS4KKyAqLworX191aW50NjRfdAordXVpZF9oYXNoNjQodXVpZF90ICp1dWlkKQoreworCV9fdWludDY0X3QJKnNwID0gKF9fdWludDY0X3QgKil1dWlkOworCisJcmV0dXJuIHNwWzBdICsgc3BbMV07Cit9CisKK2ludAordXVpZF90YWJsZV9pbnNlcnQodXVpZF90ICp1dWlkKQoreworCWludAlpLCBob2xlOworCisJbXV0ZXhfbG9jaygmdXVpZF9tb25pdG9yLCBQVkZTKTsKKwlmb3IgKGkgPSAwLCBob2xlID0gLTE7IGkgPCB1dWlkX3RhYmxlX3NpemU7IGkrKykgeworCQlpZiAodXVpZF9pc19uaWwoJnV1aWRfdGFibGVbaV0pKSB7CisJCQlob2xlID0gaTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICh1dWlkX2VxdWFsKHV1aWQsICZ1dWlkX3RhYmxlW2ldKSkgeworCQkJbXV0ZXhfdW5sb2NrKCZ1dWlkX21vbml0b3IpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJaWYgKGhvbGUgPCAwKSB7CisJCXV1aWRfdGFibGUgPSBrbWVtX3JlYWxsb2ModXVpZF90YWJsZSwKKwkJCSh1dWlkX3RhYmxlX3NpemUgKyAxKSAqIHNpemVvZigqdXVpZF90YWJsZSksCisJCQl1dWlkX3RhYmxlX3NpemUgICogc2l6ZW9mKCp1dWlkX3RhYmxlKSwKKwkJCUtNX1NMRUVQKTsKKwkJaG9sZSA9IHV1aWRfdGFibGVfc2l6ZSsrOworCX0KKwl1dWlkX3RhYmxlW2hvbGVdID0gKnV1aWQ7CisJbXV0ZXhfdW5sb2NrKCZ1dWlkX21vbml0b3IpOworCXJldHVybiAxOworfQorCit2b2lkCit1dWlkX3RhYmxlX3JlbW92ZSh1dWlkX3QgKnV1aWQpCit7CisJaW50CWk7CisKKwltdXRleF9sb2NrKCZ1dWlkX21vbml0b3IsIFBWRlMpOworCWZvciAoaSA9IDA7IGkgPCB1dWlkX3RhYmxlX3NpemU7IGkrKykgeworCQlpZiAodXVpZF9pc19uaWwoJnV1aWRfdGFibGVbaV0pKQorCQkJY29udGludWU7CisJCWlmICghdXVpZF9lcXVhbCh1dWlkLCAmdXVpZF90YWJsZVtpXSkpCisJCQljb250aW51ZTsKKwkJdXVpZF9jcmVhdGVfbmlsKCZ1dWlkX3RhYmxlW2ldKTsKKwkJYnJlYWs7CisJfQorCUFTU0VSVChpIDwgdXVpZF90YWJsZV9zaXplKTsKKwltdXRleF91bmxvY2soJnV1aWRfbW9uaXRvcik7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMvc3VwcG9ydC91dWlkLmggYi9mcy94ZnMvc3VwcG9ydC91dWlkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIyMGVhNQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy9zdXBwb3J0L3V1aWQuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19TVVBQT1JUX1VVSURfSF9fCisjZGVmaW5lIF9fWEZTX1NVUFBPUlRfVVVJRF9IX18KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIJX191X2JpdHNbMTZdOworfSB1dWlkX3Q7CisKK3ZvaWQgdXVpZF9pbml0KHZvaWQpOwordm9pZCB1dWlkX2NyZWF0ZV9uaWwodXVpZF90ICp1dWlkKTsKK2ludCB1dWlkX2lzX25pbCh1dWlkX3QgKnV1aWQpOworaW50IHV1aWRfZXF1YWwodXVpZF90ICp1dWlkMSwgdXVpZF90ICp1dWlkMik7Cit2b2lkIHV1aWRfZ2V0bm9kZXVuaXEodXVpZF90ICp1dWlkLCBpbnQgZnNpZCBbMl0pOworX191aW50NjRfdCB1dWlkX2hhc2g2NCh1dWlkX3QgKnV1aWQpOworaW50IHV1aWRfdGFibGVfaW5zZXJ0KHV1aWRfdCAqdXVpZCk7Cit2b2lkIHV1aWRfdGFibGVfcmVtb3ZlKHV1aWRfdCAqdXVpZCk7CisKKyNlbmRpZgkvKiBfX1hGU19TVVBQT1JUX1VVSURfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzLmggYi9mcy94ZnMveGZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UyNzZkYwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnMuaApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19IX18KKyNkZWZpbmUgX19YRlNfSF9fCisKKyNpbmNsdWRlIDxsaW51eC0yLjYveGZzX2xpbnV4Lmg+CisKKyNpbmNsdWRlIDx4ZnNfZnMuaD4gCisjaW5jbHVkZSA8eGZzX21hY3Jvcy5oPgorCisjZW5kaWYJLyogX19YRlNfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2FjbC5jIGIvZnMveGZzL3hmc19hY2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDAxZGNlCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19hY2wuYwpAQCAtMCwwICsxLDkzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfYWNsLmgiCisjaW5jbHVkZSAieGZzX21hYy5oIgorI2luY2x1ZGUgInhmc19hdHRyLmgiCisKKyNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2xfeGF0dHIuaD4KKworU1RBVElDIGludAl4ZnNfYWNsX3NldG1vZGUodm5vZGVfdCAqLCB4ZnNfYWNsX3QgKiwgaW50ICopOworU1RBVElDIHZvaWQgICAgIHhmc19hY2xfZmlsdGVyX21vZGUobW9kZV90LCB4ZnNfYWNsX3QgKik7CitTVEFUSUMgdm9pZAl4ZnNfYWNsX2dldF9lbmRpYW4oeGZzX2FjbF90ICopOworU1RBVElDIGludAl4ZnNfYWNsX2FjY2Vzcyh1aWRfdCwgZ2lkX3QsIHhmc19hY2xfdCAqLCBtb2RlX3QsIGNyZWRfdCAqKTsKK1NUQVRJQyBpbnQJeGZzX2FjbF9pbnZhbGlkKHhmc19hY2xfdCAqKTsKK1NUQVRJQyB2b2lkCXhmc19hY2xfc3luY19tb2RlKG1vZGVfdCwgeGZzX2FjbF90ICopOworU1RBVElDIHZvaWQJeGZzX2FjbF9nZXRfYXR0cih2bm9kZV90ICosIHhmc19hY2xfdCAqLCBpbnQsIGludCwgaW50ICopOworU1RBVElDIHZvaWQJeGZzX2FjbF9zZXRfYXR0cih2bm9kZV90ICosIHhmc19hY2xfdCAqLCBpbnQsIGludCAqKTsKK1NUQVRJQyBpbnQJeGZzX2FjbF9hbGxvd19zZXQodm5vZGVfdCAqLCBpbnQpOworCitrbWVtX3pvbmVfdCAqeGZzX2FjbF96b25lOworCisKKy8qCisgKiBUZXN0IGZvciBleGlzdGVuY2Ugb2YgYWNjZXNzIEFDTCBhdHRyaWJ1dGUgYXMgZWZmaWNpZW50bHkgYXMgcG9zc2libGUuCisgKi8KK2ludAoreGZzX2FjbF92aGFzYWNsX2FjY2VzcygKKwl2bm9kZV90CQkqdnApCit7CisJaW50CQllcnJvcjsKKworCXhmc19hY2xfZ2V0X2F0dHIodnAsIE5VTEwsIF9BQ0xfVFlQRV9BQ0NFU1MsIEFUVFJfS0VSTk9WQUwsICZlcnJvcik7CisJcmV0dXJuIChlcnJvciA9PSAwKTsKK30KKworLyoKKyAqIFRlc3QgZm9yIGV4aXN0ZW5jZSBvZiBkZWZhdWx0IEFDTCBhdHRyaWJ1dGUgYXMgZWZmaWNpZW50bHkgYXMgcG9zc2libGUuCisgKi8KK2ludAoreGZzX2FjbF92aGFzYWNsX2RlZmF1bHQoCisJdm5vZGVfdAkJKnZwKQoreworCWludAkJZXJyb3I7CisKKwlpZiAodnAtPnZfdHlwZSAhPSBWRElSKQorCQlyZXR1cm4gMDsKKwl4ZnNfYWNsX2dldF9hdHRyKHZwLCBOVUxMLCBfQUNMX1RZUEVfREVGQVVMVCwgQVRUUl9LRVJOT1ZBTCwgJmVycm9yKTsKKwlyZXR1cm4gKGVycm9yID09IDApOworfQorCisvKgorICogQ29udmVydCBmcm9tIGV4dGVuZGVkIGF0dHJpYnV0ZSByZXByZXNlbnRhdGlvbiB0byBpbi1tZW1vcnkgZm9yIFhGUy4KKyAqLworU1RBVElDIGludAorcG9zaXhfYWNsX3hhdHRyX3RvX3hmcygKKwlwb3NpeF9hY2xfeGF0dHJfaGVhZGVyCSpzcmMsCisJc2l6ZV90CQkJc2l6ZSwKKwl4ZnNfYWNsX3QJCSpkZXN0KQoreworCXBvc2l4X2FjbF94YXR0cl9lbnRyeQkqc3JjX2VudHJ5OworCXhmc19hY2xfZW50cnlfdAkJKmRlc3RfZW50cnk7CisJaW50CQkJbjsKKworCWlmICghc3JjIHx8ICFkZXN0KQorCQlyZXR1cm4gRUlOVkFMOworCisJaWYgKHNpemUgPCBzaXplb2YocG9zaXhfYWNsX3hhdHRyX2hlYWRlcikpCisJCXJldHVybiBFSU5WQUw7CisKKwlpZiAoc3JjLT5hX3ZlcnNpb24gIT0gY3B1X3RvX2xlMzIoUE9TSVhfQUNMX1hBVFRSX1ZFUlNJT04pKQorCQlyZXR1cm4gRU9QTk9UU1VQUDsKKworCW1lbXNldChkZXN0LCAwLCBzaXplb2YoeGZzX2FjbF90KSk7CisJZGVzdC0+YWNsX2NudCA9IHBvc2l4X2FjbF94YXR0cl9jb3VudChzaXplKTsKKwlpZiAoZGVzdC0+YWNsX2NudCA8IDAgfHwgZGVzdC0+YWNsX2NudCA+IFhGU19BQ0xfTUFYX0VOVFJJRVMpCisJCXJldHVybiBFSU5WQUw7CisKKwkvKgorCSAqIGFjbF9zZXRfZmlsZSgzKSBtYXkgcmVxdWVzdCB0aGF0IHdlIHNldCBkZWZhdWx0IEFDTHMgd2l0aAorCSAqIHplcm8gbGVuZ3RoIC0tIGRlZmVuZCAoZ3JhY2VmdWxseSkgYWdhaW5zdCB0aGF0IGhlcmUuCisJICovCisJaWYgKCFkZXN0LT5hY2xfY250KQorCQlyZXR1cm4gMDsKKworCXNyY19lbnRyeSA9IChwb3NpeF9hY2xfeGF0dHJfZW50cnkgKikoKGNoYXIgKilzcmMgKyBzaXplb2YoKnNyYykpOworCWRlc3RfZW50cnkgPSAmZGVzdC0+YWNsX2VudHJ5WzBdOworCisJZm9yIChuID0gMDsgbiA8IGRlc3QtPmFjbF9jbnQ7IG4rKywgc3JjX2VudHJ5KyssIGRlc3RfZW50cnkrKykgeworCQlkZXN0X2VudHJ5LT5hZV9wZXJtID0gbGUxNl90b19jcHUoc3JjX2VudHJ5LT5lX3Blcm0pOworCQlpZiAoX0FDTF9QRVJNX0lOVkFMSUQoZGVzdF9lbnRyeS0+YWVfcGVybSkpCisJCQlyZXR1cm4gRUlOVkFMOworCQlkZXN0X2VudHJ5LT5hZV90YWcgID0gbGUxNl90b19jcHUoc3JjX2VudHJ5LT5lX3RhZyk7CisJCXN3aXRjaChkZXN0X2VudHJ5LT5hZV90YWcpIHsKKwkJY2FzZSBBQ0xfVVNFUjoKKwkJY2FzZSBBQ0xfR1JPVVA6CisJCQlkZXN0X2VudHJ5LT5hZV9pZCA9IGxlMzJfdG9fY3B1KHNyY19lbnRyeS0+ZV9pZCk7CisJCQlicmVhazsKKwkJY2FzZSBBQ0xfVVNFUl9PQko6CisJCWNhc2UgQUNMX0dST1VQX09CSjoKKwkJY2FzZSBBQ0xfTUFTSzoKKwkJY2FzZSBBQ0xfT1RIRVI6CisJCQlkZXN0X2VudHJ5LT5hZV9pZCA9IEFDTF9VTkRFRklORURfSUQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBFSU5WQUw7CisJCX0KKwl9CisJaWYgKHhmc19hY2xfaW52YWxpZChkZXN0KSkKKwkJcmV0dXJuIEVJTlZBTDsKKworCXJldHVybiAwOworfQorCisvKgorICogQ29tcGFyaXNvbiBmdW5jdGlvbiBjYWxsZWQgZnJvbSBxc29ydCgpLgorICogUHJpbWFyeSBrZXkgaXMgYWVfdGFnLCBzZWNvbmRhcnkga2V5IGlzIGFlX2lkLgorICovCitTVEFUSUMgaW50Cit4ZnNfYWNsX2VudHJ5X2NvbXBhcmUoCisJY29uc3Qgdm9pZAkqdmEsCisJY29uc3Qgdm9pZAkqdmIpCit7CisJeGZzX2FjbF9lbnRyeV90CSphID0gKHhmc19hY2xfZW50cnlfdCAqKXZhLAorCQkJKmIgPSAoeGZzX2FjbF9lbnRyeV90ICopdmI7CisKKwlpZiAoYS0+YWVfdGFnID09IGItPmFlX3RhZykKKwkJcmV0dXJuIChhLT5hZV9pZCAtIGItPmFlX2lkKTsKKwlyZXR1cm4gKGEtPmFlX3RhZyAtIGItPmFlX3RhZyk7Cit9CisKKy8qCisgKiBDb252ZXJ0IGZyb20gaW4tbWVtb3J5IFhGUyB0byBleHRlbmRlZCBhdHRyaWJ1dGUgcmVwcmVzZW50YXRpb24uCisgKi8KK1NUQVRJQyBpbnQKK3Bvc2l4X2FjbF94ZnNfdG9feGF0dHIoCisJeGZzX2FjbF90CQkqc3JjLAorCXBvc2l4X2FjbF94YXR0cl9oZWFkZXIJKmRlc3QsCisJc2l6ZV90CQkJc2l6ZSkKK3sKKwlpbnQJCQluOworCXNpemVfdAkJCW5ld19zaXplID0gcG9zaXhfYWNsX3hhdHRyX3NpemUoc3JjLT5hY2xfY250KTsKKwlwb3NpeF9hY2xfeGF0dHJfZW50cnkJKmRlc3RfZW50cnk7CisJeGZzX2FjbF9lbnRyeV90CQkqc3JjX2VudHJ5OworCisJaWYgKHNpemUgPCBuZXdfc2l6ZSkKKwkJcmV0dXJuIC1FUkFOR0U7CisKKwkvKiBOZWVkIHRvIHNvcnQgc3JjIFhGUyBBQ0wgYnkgPGFlX3RhZyxhZV9pZD4gKi8KKwlxc29ydChzcmMtPmFjbF9lbnRyeSwgc3JjLT5hY2xfY250LCBzaXplb2Yoc3JjLT5hY2xfZW50cnlbMF0pLAorCQl4ZnNfYWNsX2VudHJ5X2NvbXBhcmUpOworCisJZGVzdC0+YV92ZXJzaW9uID0gY3B1X3RvX2xlMzIoUE9TSVhfQUNMX1hBVFRSX1ZFUlNJT04pOworCWRlc3RfZW50cnkgPSAmZGVzdC0+YV9lbnRyaWVzWzBdOworCXNyY19lbnRyeSA9ICZzcmMtPmFjbF9lbnRyeVswXTsKKwlmb3IgKG4gPSAwOyBuIDwgc3JjLT5hY2xfY250OyBuKyssIGRlc3RfZW50cnkrKywgc3JjX2VudHJ5KyspIHsKKwkJZGVzdF9lbnRyeS0+ZV9wZXJtID0gY3B1X3RvX2xlMTYoc3JjX2VudHJ5LT5hZV9wZXJtKTsKKwkJaWYgKF9BQ0xfUEVSTV9JTlZBTElEKHNyY19lbnRyeS0+YWVfcGVybSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZGVzdF9lbnRyeS0+ZV90YWcgID0gY3B1X3RvX2xlMTYoc3JjX2VudHJ5LT5hZV90YWcpOworCQlzd2l0Y2ggKHNyY19lbnRyeS0+YWVfdGFnKSB7CisJCWNhc2UgQUNMX1VTRVI6CisJCWNhc2UgQUNMX0dST1VQOgorCQkJZGVzdF9lbnRyeS0+ZV9pZCA9IGNwdV90b19sZTMyKHNyY19lbnRyeS0+YWVfaWQpOworCQkJCWJyZWFrOworCQljYXNlIEFDTF9VU0VSX09CSjoKKwkJY2FzZSBBQ0xfR1JPVVBfT0JKOgorCQljYXNlIEFDTF9NQVNLOgorCQljYXNlIEFDTF9PVEhFUjoKKwkJCWRlc3RfZW50cnktPmVfaWQgPSBjcHVfdG9fbGUzMihBQ0xfVU5ERUZJTkVEX0lEKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJcmV0dXJuIG5ld19zaXplOworfQorCitpbnQKK3hmc19hY2xfdmdldCgKKwl2bm9kZV90CQkqdnAsCisJdm9pZAkJKmFjbCwKKwlzaXplX3QJCXNpemUsCisJaW50CQlraW5kKQoreworCWludAkJCWVycm9yOworCXhmc19hY2xfdAkJKnhmc19hY2wgPSBOVUxMOworCXBvc2l4X2FjbF94YXR0cl9oZWFkZXIJKmV4dF9hY2wgPSBhY2w7CisJaW50CQkJZmxhZ3MgPSAwOworCisJVk5fSE9MRCh2cCk7CisJaWYoc2l6ZSkgeworCQlpZiAoIShfQUNMX0FMTE9DKHhmc19hY2wpKSkgeworCQkJZXJyb3IgPSBFTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCQltZW1zZXQoeGZzX2FjbCwgMCwgc2l6ZW9mKHhmc19hY2xfdCkpOworCX0gZWxzZQorCQlmbGFncyA9IEFUVFJfS0VSTk9WQUw7CisKKwl4ZnNfYWNsX2dldF9hdHRyKHZwLCB4ZnNfYWNsLCBraW5kLCBmbGFncywgJmVycm9yKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCisJaWYgKCFzaXplKSB7CisJCWVycm9yID0gLXBvc2l4X2FjbF94YXR0cl9zaXplKFhGU19BQ0xfTUFYX0VOVFJJRVMpOworCX0gZWxzZSB7CisJCWlmICh4ZnNfYWNsX2ludmFsaWQoeGZzX2FjbCkpIHsKKwkJCWVycm9yID0gRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKGtpbmQgPT0gX0FDTF9UWVBFX0FDQ0VTUykgeworCQkJdmF0dHJfdAl2YTsKKworCQkJdmEudmFfbWFzayA9IFhGU19BVF9NT0RFOworCQkJVk9QX0dFVEFUVFIodnAsICZ2YSwgMCwgc3lzX2NyZWQsIGVycm9yKTsKKwkJCWlmIChlcnJvcikKKwkJCQlnb3RvIG91dDsKKwkJCXhmc19hY2xfc3luY19tb2RlKHZhLnZhX21vZGUsIHhmc19hY2wpOworCQl9CisJCWVycm9yID0gLXBvc2l4X2FjbF94ZnNfdG9feGF0dHIoeGZzX2FjbCwgZXh0X2FjbCwgc2l6ZSk7CisJfQorb3V0OgorCVZOX1JFTEUodnApOworCWlmKHhmc19hY2wpCisJCV9BQ0xfRlJFRSh4ZnNfYWNsKTsKKwlyZXR1cm4gLWVycm9yOworfQorCitpbnQKK3hmc19hY2xfdnJlbW92ZSgKKwl2bm9kZV90CQkqdnAsCisJaW50CQlraW5kKQoreworCWludAkJZXJyb3I7CisKKwlWTl9IT0xEKHZwKTsKKwllcnJvciA9IHhmc19hY2xfYWxsb3dfc2V0KHZwLCBraW5kKTsKKwlpZiAoIWVycm9yKSB7CisJCVZPUF9BVFRSX1JFTU9WRSh2cCwga2luZCA9PSBfQUNMX1RZUEVfREVGQVVMVD8KKwkJCQlTR0lfQUNMX0RFRkFVTFQ6IFNHSV9BQ0xfRklMRSwKKwkJCQlBVFRSX1JPT1QsIHN5c19jcmVkLCBlcnJvcik7CisJCWlmIChlcnJvciA9PSBFTk9BVFRSKQorCQkJZXJyb3IgPSAwOwkvKiAnc2Nvb2wgKi8KKwl9CisJVk5fUkVMRSh2cCk7CisJcmV0dXJuIC1lcnJvcjsKK30KKworaW50Cit4ZnNfYWNsX3ZzZXQoCisJdm5vZGVfdAkJCSp2cCwKKwl2b2lkCQkJKmFjbCwKKwlzaXplX3QJCQlzaXplLAorCWludAkJCWtpbmQpCit7CisJcG9zaXhfYWNsX3hhdHRyX2hlYWRlcgkqZXh0X2FjbCA9IGFjbDsKKwl4ZnNfYWNsX3QJCSp4ZnNfYWNsOworCWludAkJCWVycm9yOworCWludAkJCWJhc2ljcGVybXMgPSAwOyAvKiBtb3JlIHRoYW4gc3RkIHVuaXggcGVybXM/ICovCisKKwlpZiAoIWFjbCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIShfQUNMX0FMTE9DKHhmc19hY2wpKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllcnJvciA9IHBvc2l4X2FjbF94YXR0cl90b194ZnMoZXh0X2FjbCwgc2l6ZSwgeGZzX2FjbCk7CisJaWYgKGVycm9yKSB7CisJCV9BQ0xfRlJFRSh4ZnNfYWNsKTsKKwkJcmV0dXJuIC1lcnJvcjsKKwl9CisJaWYgKCF4ZnNfYWNsLT5hY2xfY250KSB7CisJCV9BQ0xfRlJFRSh4ZnNfYWNsKTsKKwkJcmV0dXJuIDA7CisJfQorCisJVk5fSE9MRCh2cCk7CisJZXJyb3IgPSB4ZnNfYWNsX2FsbG93X3NldCh2cCwga2luZCk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKworCS8qIEluY29taW5nIEFDTCBleGlzdHMsIHNldCBmaWxlIG1vZGUgYmFzZWQgb24gaXRzIHZhbHVlICovCisJaWYgKGtpbmQgPT0gX0FDTF9UWVBFX0FDQ0VTUykKKwkJeGZzX2FjbF9zZXRtb2RlKHZwLCB4ZnNfYWNsLCAmYmFzaWNwZXJtcyk7CisKKwkvKgorCSAqIElmIHdlIGhhdmUgbW9yZSB0aGFuIHN0ZCB1bml4IHBlcm1pc3Npb25zLCBzZXQgdXAgdGhlIGFjdHVhbCBhdHRyLgorCSAqIE90aGVyd2lzZSwgZGVsZXRlIGFueSBleGlzdGluZyBhdHRyLiAgVGhpcyBwcmV2ZW50cyB1cyBmcm9tCisJICogaGF2aW5nIGFjdHVhbCBhdHRycyBmb3IgcGVybWlzc2lvbnMgdGhhdCBjYW4gYmUgc3RvcmVkIGluIHRoZQorCSAqIHN0YW5kYXJkIHBlcm1pc3Npb24gYml0cy4KKwkgKi8KKwlpZiAoIWJhc2ljcGVybXMpIHsKKwkJeGZzX2FjbF9zZXRfYXR0cih2cCwgeGZzX2FjbCwga2luZCwgJmVycm9yKTsKKwl9IGVsc2UgeworCQl4ZnNfYWNsX3ZyZW1vdmUodnAsIF9BQ0xfVFlQRV9BQ0NFU1MpOworCX0KKworb3V0OgorCVZOX1JFTEUodnApOworCV9BQ0xfRlJFRSh4ZnNfYWNsKTsKKwlyZXR1cm4gLWVycm9yOworfQorCitpbnQKK3hmc19hY2xfaWFjY2VzcygKKwl4ZnNfaW5vZGVfdAkqaXAsCisJbW9kZV90CQltb2RlLAorCWNyZWRfdAkJKmNyKQoreworCXhmc19hY2xfdAkqYWNsOworCWludAkJcnZhbDsKKworCWlmICghKF9BQ0xfQUxMT0MoYWNsKSkpCisJCXJldHVybiAtMTsKKworCS8qIElmIHRoZSBmaWxlIGhhcyBubyBBQ0wgcmV0dXJuIC0xLiAqLworCXJ2YWwgPSBzaXplb2YoeGZzX2FjbF90KTsKKwlpZiAoeGZzX2F0dHJfZmV0Y2goaXAsIFNHSV9BQ0xfRklMRSwgU0dJX0FDTF9GSUxFX1NJWkUsCisJCQkoY2hhciAqKWFjbCwgJnJ2YWwsIEFUVFJfUk9PVCB8IEFUVFJfS0VSTkFDQ0VTUywgY3IpKSB7CisJCV9BQ0xfRlJFRShhY2wpOworCQlyZXR1cm4gLTE7CisJfQorCXhmc19hY2xfZ2V0X2VuZGlhbihhY2wpOworCisJLyogSWYgdGhlIGZpbGUgaGFzIGFuIGVtcHR5IEFDTCByZXR1cm4gLTEuICovCisJaWYgKGFjbC0+YWNsX2NudCA9PSBYRlNfQUNMX05PVF9QUkVTRU5UKSB7CisJCV9BQ0xfRlJFRShhY2wpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogU3luY2hyb25pemUgQUNMIHdpdGggbW9kZSBiaXRzICovCisJeGZzX2FjbF9zeW5jX21vZGUoaXAtPmlfZC5kaV9tb2RlLCBhY2wpOworCisJcnZhbCA9IHhmc19hY2xfYWNjZXNzKGlwLT5pX2QuZGlfdWlkLCBpcC0+aV9kLmRpX2dpZCwgYWNsLCBtb2RlLCBjcik7CisJX0FDTF9GUkVFKGFjbCk7CisJcmV0dXJuIHJ2YWw7Cit9CisKK1NUQVRJQyBpbnQKK3hmc19hY2xfYWxsb3dfc2V0KAorCXZub2RlX3QJCSp2cCwKKwlpbnQJCWtpbmQpCit7CisJdmF0dHJfdAkJdmE7CisJaW50CQllcnJvcjsKKworCWlmICh2cC0+dl9pbm9kZS5pX2ZsYWdzICYgKFNfSU1NVVRBQkxFfFNfQVBQRU5EKSkKKwkJcmV0dXJuIEVQRVJNOworCWlmIChraW5kID09IF9BQ0xfVFlQRV9ERUZBVUxUICYmIHZwLT52X3R5cGUgIT0gVkRJUikKKwkJcmV0dXJuIEVOT1RESVI7CisJaWYgKHZwLT52X3Zmc3AtPnZmc19mbGFnICYgVkZTX1JET05MWSkKKwkJcmV0dXJuIEVST0ZTOworCXZhLnZhX21hc2sgPSBYRlNfQVRfVUlEOworCVZPUF9HRVRBVFRSKHZwLCAmdmEsIDAsIE5VTEwsIGVycm9yKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwlpZiAodmEudmFfdWlkICE9IGN1cnJlbnQtPmZzdWlkICYmICFjYXBhYmxlKENBUF9GT1dORVIpKQorCQlyZXR1cm4gRVBFUk07CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogVGhlIGFjY2VzcyBjb250cm9sIHByb2Nlc3MgdG8gZGV0ZXJtaW5lIHRoZSBhY2Nlc3MgcGVybWlzc2lvbjoKKyAqCWlmIHVpZCA9PSBmaWxlIG93bmVyIGlkLCB1c2UgdGhlIGZpbGUgb3duZXIgYml0cy4KKyAqCWlmIGdpZCA9PSBmaWxlIG93bmVyIGdyb3VwIGlkLCB1c2UgdGhlIGZpbGUgZ3JvdXAgYml0cy4KKyAqCXNjYW4gQUNMIGZvciBhIG1hY2hpbmcgdXNlciBvciBncm91cCwgYW5kIHVzZSBtYXRjaGVkIGVudHJ5CisgKglwZXJtaXNzaW9uLiBVc2UgdG90YWwgcGVybWlzc2lvbnMgb2YgYWxsIG1hdGNoaW5nIGdyb3VwIGVudHJpZXMsCisgKgl1bnRpbCBhbGwgYWNsIGVudHJpZXMgYXJlIGV4aGF1c3RlZC4gVGhlIGZpbmFsIHBlcm1pc3Npb24gcHJvZHVjZWQKKyAqCWJ5IG1hdGNoaW5nIGFjbCBlbnRyeSBvciBlbnRyaWVzIG5lZWRzIHRvIGJlICYgd2l0aCBncm91cCBwZXJtaXNzaW9uLgorICoJaWYgbm90IG93bmVyLCBvd25pbmcgZ3JvdXAsIG9yIG1hdGNoaW5nIGVudHJ5IGluIEFDTCwgdXNlIGZpbGUKKyAqCW90aGVyIGJpdHMuICAKKyAqLworU1RBVElDIGludAoreGZzX2FjbF9jYXBhYmlsaXR5X2NoZWNrKAorCW1vZGVfdAkJbW9kZSwKKwljcmVkX3QJCSpjcikKK3sKKwlpZiAoKG1vZGUgJiBBQ0xfUkVBRCkgJiYgIWNhcGFibGVfY3JlZChjciwgQ0FQX0RBQ19SRUFEX1NFQVJDSCkpCisJCXJldHVybiBFQUNDRVM7CisJaWYgKChtb2RlICYgQUNMX1dSSVRFKSAmJiAhY2FwYWJsZV9jcmVkKGNyLCBDQVBfREFDX09WRVJSSURFKSkKKwkJcmV0dXJuIEVBQ0NFUzsKKwlpZiAoKG1vZGUgJiBBQ0xfRVhFQ1VURSkgJiYgIWNhcGFibGVfY3JlZChjciwgQ0FQX0RBQ19PVkVSUklERSkpCisJCXJldHVybiBFQUNDRVM7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE5vdGU6IGNyIGlzIG9ubHkgdXNlZCBoZXJlIGZvciB0aGUgY2FwYWJpbGl0eSBjaGVjayBpZiB0aGUgQUNMIHRlc3QgZmFpbHMuCisgKiAgICAgICBJdCBpcyBub3QgdXNlZCB0byBmaW5kIG91dCB0aGUgY3JlZGVudGlhbHMgdWlkIG9yIGdyb3VwcyBldGMsIGFzIHdhcworICogICAgICAgZG9uZSBpbiBJUklYLiBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIHVpZCBhbmQgZ3JvdXBzIGZvciB0aGUgY3VycmVudAorICogICAgICAgdGhyZWFkIGFyZSB0YWtlbiBmcm9tICJjdXJyZW50IiBpbnN0ZWFkIG9mIHRoZSBjciBwYXJhbWV0ZXIuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19hY2xfYWNjZXNzKAorCXVpZF90CQlmdWlkLAorCWdpZF90CQlmZ2lkLAorCXhmc19hY2xfdAkqZmFwLAorCW1vZGVfdAkJbWQsCisJY3JlZF90CQkqY3IpCit7CisJeGZzX2FjbF9lbnRyeV90CW1hdGNoZWQ7CisJaW50CQlpLCBhbGxvd3M7CisJaW50CQltYXNrYWxsb3dzID0gLTE7CS8qIHRydWUsIGJ1dCBub3QgMSwgZWl0aGVyICovCisJaW50CQlzZWVuX3VzZXJvYmogPSAwOworCisJbWF0Y2hlZC5hZV90YWcgPSAwOwkvKiBJbnZhbGlkIHR5cGUgKi8KKwltZCA+Pj0gNjsJLyogTm9ybWFsaXplIHRoZSBiaXRzIGZvciBjb21wYXJpc29uICovCisKKwlmb3IgKGkgPSAwOyBpIDwgZmFwLT5hY2xfY250OyBpKyspIHsKKwkJLyoKKwkJICogQnJlYWsgb3V0IGlmIHdlJ3ZlIGdvdCBhIHVzZXJfb2JqIGVudHJ5IG9yCisJCSAqIGEgdXNlciBlbnRyeSBhbmQgdGhlIG1hc2sgKGFuZCBoYXZlIHByb2Nlc3NlZCBVU0VSX09CSikKKwkJICovCisJCWlmIChtYXRjaGVkLmFlX3RhZyA9PSBBQ0xfVVNFUl9PQkopCisJCQlicmVhazsKKwkJaWYgKG1hdGNoZWQuYWVfdGFnID09IEFDTF9VU0VSKSB7CisJCQlpZiAobWFza2FsbG93cyAhPSAtMSAmJiBzZWVuX3VzZXJvYmopCisJCQkJYnJlYWs7CisJCQlpZiAoZmFwLT5hY2xfZW50cnlbaV0uYWVfdGFnICE9IEFDTF9NQVNLICYmCisJCQkgICAgZmFwLT5hY2xfZW50cnlbaV0uYWVfdGFnICE9IEFDTF9VU0VSX09CSikKKwkJCQljb250aW51ZTsKKwkJfQorCQkvKiBUcnVlIGlmIHRoaXMgZW50cnkgYWxsb3dzIHRoZSByZXF1ZXN0ZWQgYWNjZXNzICovCisJCWFsbG93cyA9ICgoZmFwLT5hY2xfZW50cnlbaV0uYWVfcGVybSAmIG1kKSA9PSBtZCk7CisKKwkJc3dpdGNoIChmYXAtPmFjbF9lbnRyeVtpXS5hZV90YWcpIHsKKwkJY2FzZSBBQ0xfVVNFUl9PQko6CisJCQlzZWVuX3VzZXJvYmogPSAxOworCQkJaWYgKGZ1aWQgIT0gY3VycmVudC0+ZnN1aWQpCisJCQkJY29udGludWU7CisJCQltYXRjaGVkLmFlX3RhZyA9IEFDTF9VU0VSX09CSjsKKwkJCW1hdGNoZWQuYWVfcGVybSA9IGFsbG93czsKKwkJCWJyZWFrOworCQljYXNlIEFDTF9VU0VSOgorCQkJaWYgKGZhcC0+YWNsX2VudHJ5W2ldLmFlX2lkICE9IGN1cnJlbnQtPmZzdWlkKQorCQkJCWNvbnRpbnVlOworCQkJbWF0Y2hlZC5hZV90YWcgPSBBQ0xfVVNFUjsKKwkJCW1hdGNoZWQuYWVfcGVybSA9IGFsbG93czsKKwkJCWJyZWFrOworCQljYXNlIEFDTF9HUk9VUF9PQko6CisJCQlpZiAoKG1hdGNoZWQuYWVfdGFnID09IEFDTF9HUk9VUF9PQkogfHwKKwkJCSAgICBtYXRjaGVkLmFlX3RhZyA9PSBBQ0xfR1JPVVApICYmICFhbGxvd3MpCisJCQkJY29udGludWU7CisJCQlpZiAoIWluX2dyb3VwX3AoZmdpZCkpCisJCQkJY29udGludWU7CisJCQltYXRjaGVkLmFlX3RhZyA9IEFDTF9HUk9VUF9PQko7CisJCQltYXRjaGVkLmFlX3Blcm0gPSBhbGxvd3M7CisJCQlicmVhazsKKwkJY2FzZSBBQ0xfR1JPVVA6CisJCQlpZiAoKG1hdGNoZWQuYWVfdGFnID09IEFDTF9HUk9VUF9PQkogfHwKKwkJCSAgICBtYXRjaGVkLmFlX3RhZyA9PSBBQ0xfR1JPVVApICYmICFhbGxvd3MpCisJCQkJY29udGludWU7CisJCQlpZiAoIWluX2dyb3VwX3AoZmFwLT5hY2xfZW50cnlbaV0uYWVfaWQpKQorCQkJCWNvbnRpbnVlOworCQkJbWF0Y2hlZC5hZV90YWcgPSBBQ0xfR1JPVVA7CisJCQltYXRjaGVkLmFlX3Blcm0gPSBhbGxvd3M7CisJCQlicmVhazsKKwkJY2FzZSBBQ0xfTUFTSzoKKwkJCW1hc2thbGxvd3MgPSBhbGxvd3M7CisJCQlicmVhazsKKwkJY2FzZSBBQ0xfT1RIRVI6CisJCQlpZiAobWF0Y2hlZC5hZV90YWcgIT0gMCkKKwkJCQljb250aW51ZTsKKwkJCW1hdGNoZWQuYWVfdGFnID0gQUNMX09USEVSOworCQkJbWF0Y2hlZC5hZV9wZXJtID0gYWxsb3dzOworCQkJYnJlYWs7CisJCX0KKwl9CisJLyoKKwkgKiBGaXJzdCBwb3NzaWJpbGl0eSBpcyB0aGF0IG5vIG1hdGNoZWQgZW50cnkgYWxsb3dzIGFjY2Vzcy4KKwkgKiBUaGUgY2FwYWJpbGl0eSB0byBvdmVycmlkZSBEQUMgbWF5IGV4aXN0LCBzbyBjaGVjayBmb3IgaXQuCisJICovCisJc3dpdGNoIChtYXRjaGVkLmFlX3RhZykgeworCWNhc2UgQUNMX09USEVSOgorCWNhc2UgQUNMX1VTRVJfT0JKOgorCQlpZiAobWF0Y2hlZC5hZV9wZXJtKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCWNhc2UgQUNMX1VTRVI6CisJY2FzZSBBQ0xfR1JPVVBfT0JKOgorCWNhc2UgQUNMX0dST1VQOgorCQlpZiAobWFza2FsbG93cyAmJiBtYXRjaGVkLmFlX3Blcm0pCisJCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4geGZzX2FjbF9jYXBhYmlsaXR5X2NoZWNrKG1kLCBjcik7Cit9CisKKy8qCisgKiBBQ0wgdmFsaWRpdHkgY2hlY2tlci4KKyAqICAgVGhpcyBhY2wgdmFsaWRhdGlvbiByb3V0aW5lIGNoZWNrcyBlYWNoIEFDTCBlbnRyeSByZWFkIGluIG1ha2VzIHNlbnNlLgorICovCitTVEFUSUMgaW50Cit4ZnNfYWNsX2ludmFsaWQoCisJeGZzX2FjbF90CSphY2xwKQoreworCXhmc19hY2xfZW50cnlfdAkqZW50cnksICplOworCWludAkJdXNlciA9IDAsIGdyb3VwID0gMCwgb3RoZXIgPSAwLCBtYXNrID0gMDsKKwlpbnQJCW1hc2tfcmVxdWlyZWQgPSAwOworCWludAkJaSwgajsKKworCWlmICghYWNscCkKKwkJZ290byBhY2xfaW52YWxpZDsKKworCWlmIChhY2xwLT5hY2xfY250ID4gWEZTX0FDTF9NQVhfRU5UUklFUykKKwkJZ290byBhY2xfaW52YWxpZDsKKworCWZvciAoaSA9IDA7IGkgPCBhY2xwLT5hY2xfY250OyBpKyspIHsKKwkJZW50cnkgPSAmYWNscC0+YWNsX2VudHJ5W2ldOworCQlzd2l0Y2ggKGVudHJ5LT5hZV90YWcpIHsKKwkJY2FzZSBBQ0xfVVNFUl9PQko6CisJCQlpZiAodXNlcisrKQorCQkJCWdvdG8gYWNsX2ludmFsaWQ7CisJCQlicmVhazsKKwkJY2FzZSBBQ0xfR1JPVVBfT0JKOgorCQkJaWYgKGdyb3VwKyspCisJCQkJZ290byBhY2xfaW52YWxpZDsKKwkJCWJyZWFrOworCQljYXNlIEFDTF9PVEhFUjoKKwkJCWlmIChvdGhlcisrKQorCQkJCWdvdG8gYWNsX2ludmFsaWQ7CisJCQlicmVhazsKKwkJY2FzZSBBQ0xfVVNFUjoKKwkJY2FzZSBBQ0xfR1JPVVA6CisJCQlmb3IgKGogPSBpICsgMTsgaiA8IGFjbHAtPmFjbF9jbnQ7IGorKykgeworCQkJCWUgPSAmYWNscC0+YWNsX2VudHJ5W2pdOworCQkJCWlmIChlLT5hZV9pZCA9PSBlbnRyeS0+YWVfaWQgJiYKKwkJCQkgICAgZS0+YWVfdGFnID09IGVudHJ5LT5hZV90YWcpCisJCQkJCWdvdG8gYWNsX2ludmFsaWQ7CisJCQl9CisJCQltYXNrX3JlcXVpcmVkKys7CisJCQlicmVhazsKKwkJY2FzZSBBQ0xfTUFTSzoKKwkJCWlmIChtYXNrKyspCisJCQkJZ290byBhY2xfaW52YWxpZDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byBhY2xfaW52YWxpZDsKKwkJfQorCX0KKwlpZiAoIXVzZXIgfHwgIWdyb3VwIHx8ICFvdGhlciB8fCAobWFza19yZXF1aXJlZCAmJiAhbWFzaykpCisJCWdvdG8gYWNsX2ludmFsaWQ7CisJZWxzZQorCQlyZXR1cm4gMDsKK2FjbF9pbnZhbGlkOgorCXJldHVybiBFSU5WQUw7Cit9CisKKy8qCisgKiBEbyBBQ0wgZW5kaWFuIGNvbnZlcnNpb24uCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYWNsX2dldF9lbmRpYW4oCisJeGZzX2FjbF90CSphY2xwKQoreworCXhmc19hY2xfZW50cnlfdAkqYWNlLCAqZW5kOworCisJSU5UX1NFVChhY2xwLT5hY2xfY250LCBBUkNIX0NPTlZFUlQsIGFjbHAtPmFjbF9jbnQpOworCWVuZCA9ICZhY2xwLT5hY2xfZW50cnlbMF0rYWNscC0+YWNsX2NudDsKKwlmb3IgKGFjZSA9ICZhY2xwLT5hY2xfZW50cnlbMF07IGFjZSA8IGVuZDsgYWNlKyspIHsKKwkJSU5UX1NFVChhY2UtPmFlX3RhZywgQVJDSF9DT05WRVJULCBhY2UtPmFlX3RhZyk7CisJCUlOVF9TRVQoYWNlLT5hZV9pZCwgQVJDSF9DT05WRVJULCBhY2UtPmFlX2lkKTsKKwkJSU5UX1NFVChhY2UtPmFlX3Blcm0sIEFSQ0hfQ09OVkVSVCwgYWNlLT5hZV9wZXJtKTsKKwl9Cit9CisKKy8qCisgKiBHZXQgdGhlIEFDTCBmcm9tIHRoZSBFQSBhbmQgZG8gZW5kaWFuIGNvbnZlcnNpb24uCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYWNsX2dldF9hdHRyKAorCXZub2RlX3QJCSp2cCwKKwl4ZnNfYWNsX3QJKmFjbHAsCisJaW50CQlraW5kLAorCWludAkJZmxhZ3MsCisJaW50CQkqZXJyb3IpCit7CisJaW50CQlsZW4gPSBzaXplb2YoeGZzX2FjbF90KTsKKworCUFTU0VSVCgoZmxhZ3MgJiBBVFRSX0tFUk5PVkFMKSA/IChhY2xwID09IE5VTEwpIDogMSk7CisJZmxhZ3MgfD0gQVRUUl9ST09UOworCVZPUF9BVFRSX0dFVCh2cCwKKwkJa2luZCA9PSBfQUNMX1RZUEVfQUNDRVNTID8gU0dJX0FDTF9GSUxFIDogU0dJX0FDTF9ERUZBVUxULAorCQkoY2hhciAqKWFjbHAsICZsZW4sIGZsYWdzLCBzeXNfY3JlZCwgKmVycm9yKTsKKwlpZiAoKmVycm9yIHx8IChmbGFncyAmIEFUVFJfS0VSTk9WQUwpKQorCQlyZXR1cm47CisJeGZzX2FjbF9nZXRfZW5kaWFuKGFjbHApOworfQorCisvKgorICogU2V0IHRoZSBFQSB3aXRoIHRoZSBBQ0wgYW5kIGRvIGVuZGlhbiBjb252ZXJzaW9uLgorICovCitTVEFUSUMgdm9pZAoreGZzX2FjbF9zZXRfYXR0cigKKwl2bm9kZV90CQkqdnAsCisJeGZzX2FjbF90CSphY2xwLAorCWludAkJa2luZCwKKwlpbnQJCSplcnJvcikKK3sKKwl4ZnNfYWNsX2VudHJ5X3QJKmFjZSwgKm5ld2FjZSwgKmVuZDsKKwl4ZnNfYWNsX3QJKm5ld2FjbDsKKwlpbnQJCWxlbjsKKworCWlmICghKF9BQ0xfQUxMT0MobmV3YWNsKSkpIHsKKwkJKmVycm9yID0gRU5PTUVNOworCQlyZXR1cm47CisJfQorCisJbGVuID0gc2l6ZW9mKHhmc19hY2xfdCkgLQorCSAgICAgIChzaXplb2YoeGZzX2FjbF9lbnRyeV90KSAqIChYRlNfQUNMX01BWF9FTlRSSUVTIC0gYWNscC0+YWNsX2NudCkpOworCWVuZCA9ICZhY2xwLT5hY2xfZW50cnlbMF0rYWNscC0+YWNsX2NudDsKKwlmb3IgKGFjZSA9ICZhY2xwLT5hY2xfZW50cnlbMF0sIG5ld2FjZSA9ICZuZXdhY2wtPmFjbF9lbnRyeVswXTsKKwkgICAgIGFjZSA8IGVuZDsKKwkgICAgIGFjZSsrLCBuZXdhY2UrKykgeworCQlJTlRfU0VUKG5ld2FjZS0+YWVfdGFnLCBBUkNIX0NPTlZFUlQsIGFjZS0+YWVfdGFnKTsKKwkJSU5UX1NFVChuZXdhY2UtPmFlX2lkLCBBUkNIX0NPTlZFUlQsIGFjZS0+YWVfaWQpOworCQlJTlRfU0VUKG5ld2FjZS0+YWVfcGVybSwgQVJDSF9DT05WRVJULCBhY2UtPmFlX3Blcm0pOworCX0KKwlJTlRfU0VUKG5ld2FjbC0+YWNsX2NudCwgQVJDSF9DT05WRVJULCBhY2xwLT5hY2xfY250KTsKKwlWT1BfQVRUUl9TRVQodnAsCisJCWtpbmQgPT0gX0FDTF9UWVBFX0FDQ0VTUyA/IFNHSV9BQ0xfRklMRTogU0dJX0FDTF9ERUZBVUxULAorCQkoY2hhciAqKW5ld2FjbCwgbGVuLCBBVFRSX1JPT1QsIHN5c19jcmVkLCAqZXJyb3IpOworCV9BQ0xfRlJFRShuZXdhY2wpOworfQorCitpbnQKK3hmc19hY2xfdnRvYWNsKAorCXZub2RlX3QJCSp2cCwKKwl4ZnNfYWNsX3QJKmFjY2Vzc19hY2wsCisJeGZzX2FjbF90CSpkZWZhdWx0X2FjbCkKK3sKKwl2YXR0cl90CQl2YTsKKwlpbnQJCWVycm9yID0gMDsKKworCWlmIChhY2Nlc3NfYWNsKSB7CisJCS8qCisJCSAqIEdldCB0aGUgQWNjZXNzIEFDTCBhbmQgdGhlIG1vZGUuICBJZiBlaXRoZXIgY2Fubm90CisJCSAqIGJlIG9idGFpbmVkIGZvciBzb21lIHJlYXNvbiwgaW52YWxpZGF0ZSB0aGUgYWNjZXNzIEFDTC4KKwkJICovCisJCXhmc19hY2xfZ2V0X2F0dHIodnAsIGFjY2Vzc19hY2wsIF9BQ0xfVFlQRV9BQ0NFU1MsIDAsICZlcnJvcik7CisJCWlmICghZXJyb3IpIHsKKwkJCS8qIEdvdCB0aGUgQUNMLCBuZWVkIHRoZSBtb2RlLi4uICovCisJCQl2YS52YV9tYXNrID0gWEZTX0FUX01PREU7CisJCQlWT1BfR0VUQVRUUih2cCwgJnZhLCAwLCBzeXNfY3JlZCwgZXJyb3IpOworCQl9CisKKwkJaWYgKGVycm9yKQorCQkJYWNjZXNzX2FjbC0+YWNsX2NudCA9IFhGU19BQ0xfTk9UX1BSRVNFTlQ7CisJCWVsc2UgLyogV2UgaGF2ZSBhIGdvb2QgQUNMIGFuZCB0aGUgZmlsZSBtb2RlLCBzeW5jaHJvbml6ZS4gKi8KKwkJCXhmc19hY2xfc3luY19tb2RlKHZhLnZhX21vZGUsIGFjY2Vzc19hY2wpOworCX0KKworCWlmIChkZWZhdWx0X2FjbCkgeworCQl4ZnNfYWNsX2dldF9hdHRyKHZwLCBkZWZhdWx0X2FjbCwgX0FDTF9UWVBFX0RFRkFVTFQsIDAsICZlcnJvcik7CisJCWlmIChlcnJvcikKKwkJCWRlZmF1bHRfYWNsLT5hY2xfY250ID0gWEZTX0FDTF9OT1RfUFJFU0VOVDsKKwl9CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIHBhcmVudCBkaXJlY3RvcnkncyBhY2wsIHByb2Nlc3NlcyBpdAorICogYW5kIGxldHMgdGhlIGNoaWxkIGluaGVyaXQgdGhlIGFjbChzKSB0aGF0IGl0IHNob3VsZC4KKyAqLworaW50Cit4ZnNfYWNsX2luaGVyaXQoCisJdm5vZGVfdAkJKnZwLAorCXZhdHRyX3QJCSp2YXAsCisJeGZzX2FjbF90CSpwZGFjbHApCit7CisJeGZzX2FjbF90CSpjYWNsOworCWludAkJZXJyb3IgPSAwOworCWludAkJYmFzaWNwZXJtcyA9IDA7CisKKwkvKgorCSAqIElmIHRoZSBwYXJlbnQgZG9lcyBub3QgaGF2ZSBhIGRlZmF1bHQgQUNMLCBvciBpdCdzIGFuCisJICogaW52YWxpZCBBQ0wsIHdlJ3JlIGRvbmUuCisJICovCisJaWYgKCF2cCkKKwkJcmV0dXJuIDA7CisJaWYgKCFwZGFjbHAgfHwgeGZzX2FjbF9pbnZhbGlkKHBkYWNscCkpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBDb3B5IHRoZSBkZWZhdWx0IEFDTCBvZiB0aGUgY29udGFpbmluZyBkaXJlY3RvcnkgdG8KKwkgKiB0aGUgYWNjZXNzIEFDTCBvZiB0aGUgbmV3IGZpbGUgYW5kIHVzZSB0aGUgbW9kZSB0aGF0CisJICogd2FzIHBhc3NlZCBpbiB0byBzZXQgdXAgdGhlIGNvcnJlY3QgaW5pdGlhbCB2YWx1ZXMgZm9yCisJICogdGhlIHU6OixnOjpbbTo6XSwgYW5kIG86OiBlbnRyaWVzLiAgVGhpcyBpcyB3aGF0IG1ha2VzCisJICogdW1hc2soKSAid29yayIgd2l0aCBBQ0wncy4KKwkgKi8KKworCWlmICghKF9BQ0xfQUxMT0MoY2FjbCkpKQorCQlyZXR1cm4gRU5PTUVNOworCisJbWVtY3B5KGNhY2wsIHBkYWNscCwgc2l6ZW9mKHhmc19hY2xfdCkpOworCXhmc19hY2xfZmlsdGVyX21vZGUodmFwLT52YV9tb2RlLCBjYWNsKTsKKwl4ZnNfYWNsX3NldG1vZGUodnAsIGNhY2wsICZiYXNpY3Blcm1zKTsKKworCS8qCisJICogU2V0IHRoZSBEZWZhdWx0IGFuZCBBY2Nlc3MgQUNMIG9uIHRoZSBmaWxlLiAgVGhlIG1vZGUgaXMgYWxyZWFkeQorCSAqIHNldCBvbiB0aGUgZmlsZSwgc28gd2UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCB0aGF0LgorCSAqCisJICogSWYgdGhlIG5ldyBmaWxlIGlzIGEgZGlyZWN0b3J5LCBpdHMgZGVmYXVsdCBBQ0wgaXMgYSBjb3B5IG9mCisJICogdGhlIGNvbnRhaW5pbmcgZGlyZWN0b3J5J3MgZGVmYXVsdCBBQ0wuCisJICovCisJaWYgKHZwLT52X3R5cGUgPT0gVkRJUikKKwkJeGZzX2FjbF9zZXRfYXR0cih2cCwgcGRhY2xwLCBfQUNMX1RZUEVfREVGQVVMVCwgJmVycm9yKTsKKwlpZiAoIWVycm9yICYmICFiYXNpY3Blcm1zKQorCQl4ZnNfYWNsX3NldF9hdHRyKHZwLCBjYWNsLCBfQUNMX1RZUEVfQUNDRVNTLCAmZXJyb3IpOworCV9BQ0xfRlJFRShjYWNsKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBTZXQgdXAgdGhlIGNvcnJlY3QgbW9kZSBvbiB0aGUgZmlsZSBiYXNlZCBvbiB0aGUgc3VwcGxpZWQgQUNMLiAgVGhpcworICogbWFrZXMgc3VyZSB0aGF0IHRoZSBtb2RlIG9uIHRoZSBmaWxlIHJlZmxlY3RzIHRoZSBzdGF0ZSBvZiB0aGUKKyAqIHU6OixnOjpbbTo6XSwgYW5kIG86OiBlbnRyaWVzIGluIHRoZSBBQ0wuICBTaW5jZSB0aGUgbW9kZSBpcyB3aGVyZQorICogdGhlIEFDTCBpcyBnb2luZyB0byBnZXQgdGhlIHBlcm1pc3Npb25zIGZvciB0aGVzZSBlbnRyaWVzLCB3ZSBtdXN0CisgKiBzeW5jaHJvbml6ZSB0aGUgbW9kZSB3aGVuZXZlciB3ZSBzZXQgdGhlIEFDTCBvbiBhIGZpbGUuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19hY2xfc2V0bW9kZSgKKwl2bm9kZV90CQkqdnAsCisJeGZzX2FjbF90CSphY2wsCisJaW50CQkqYmFzaWNwZXJtcykKK3sKKwl2YXR0cl90CQl2YTsKKwl4ZnNfYWNsX2VudHJ5X3QJKmFwOworCXhmc19hY2xfZW50cnlfdAkqZ2FwID0gTlVMTDsKKwlpbnQJCWksIGVycm9yLCBub21hc2sgPSAxOworCisJKmJhc2ljcGVybXMgPSAxOworCisJaWYgKGFjbC0+YWNsX2NudCA9PSBYRlNfQUNMX05PVF9QUkVTRU5UKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogQ29weSB0aGUgdTo6LCBnOjosIG86OiwgYW5kIG06OiBiaXRzIGZyb20gdGhlIEFDTCBpbnRvIHRoZQorCSAqIG1vZGUuICBUaGUgbTo6IGJpdHMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhlIGc6OiBiaXRzLgorCSAqLworCXZhLnZhX21hc2sgPSBYRlNfQVRfTU9ERTsKKwlWT1BfR0VUQVRUUih2cCwgJnZhLCAwLCBzeXNfY3JlZCwgZXJyb3IpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJdmEudmFfbWFzayA9IFhGU19BVF9NT0RFOworCXZhLnZhX21vZGUgJj0gfihTX0lSV1hVfFNfSVJXWEd8U19JUldYTyk7CisJYXAgPSBhY2wtPmFjbF9lbnRyeTsKKwlmb3IgKGkgPSAwOyBpIDwgYWNsLT5hY2xfY250OyArK2kpIHsKKwkJc3dpdGNoIChhcC0+YWVfdGFnKSB7CisJCWNhc2UgQUNMX1VTRVJfT0JKOgorCQkJdmEudmFfbW9kZSB8PSBhcC0+YWVfcGVybSA8PCA2OworCQkJYnJlYWs7CisJCWNhc2UgQUNMX0dST1VQX09CSjoKKwkJCWdhcCA9IGFwOworCQkJYnJlYWs7CisJCWNhc2UgQUNMX01BU0s6CS8qIG1vcmUgdGhhbiBqdXN0IHN0YW5kYXJkIG1vZGVzICovCisJCQlub21hc2sgPSAwOworCQkJdmEudmFfbW9kZSB8PSBhcC0+YWVfcGVybSA8PCAzOworCQkJKmJhc2ljcGVybXMgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgQUNMX09USEVSOgorCQkJdmEudmFfbW9kZSB8PSBhcC0+YWVfcGVybTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgkvKiBtb3JlIHRoYW4ganVzdCBzdGFuZGFyZCBtb2RlcyAqLworCQkJKmJhc2ljcGVybXMgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJYXArKzsKKwl9CisKKwkvKiBTZXQgdGhlIGdyb3VwIGJpdHMgZnJvbSBBQ0xfR1JPVVBfT0JKIGlmIHRoZXJlJ3Mgbm8gQUNMX01BU0sgKi8KKwlpZiAoZ2FwICYmIG5vbWFzaykKKwkJdmEudmFfbW9kZSB8PSBnYXAtPmFlX3Blcm0gPDwgMzsKKworCVZPUF9TRVRBVFRSKHZwLCAmdmEsIDAsIHN5c19jcmVkLCBlcnJvcik7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogVGhlIHBlcm1pc3Npb25zIGZvciB0aGUgc3BlY2lhbCBBQ0wgZW50cmllcyAodTo6LCBnOjpbbTo6XSwgbzo6KSBhcmUKKyAqIGFjdHVhbGx5IHN0b3JlZCBpbiB0aGUgZmlsZSBtb2RlIChpZiB0aGVyZSBpcyBib3RoIGEgZ3JvdXAgYW5kIGEgbWFzaywKKyAqIHRoZSBncm91cCBpcyBzdG9yZWQgaW4gdGhlIEFDTCBlbnRyeSBhbmQgdGhlIG1hc2sgaXMgc3RvcmVkIG9uIHRoZSBmaWxlKS4KKyAqIFRoaXMgYWxsb3dzIHRoZSBtb2RlIHRvIHJlbWFpbiBhdXRvbWF0aWNhbGx5IGluIHN5bmMgd2l0aCB0aGUgQUNMIHdpdGhvdXQKKyAqIHRoZSBuZWVkIGZvciBhIGNhbGwtYmFjayB0byB0aGUgQUNMIHN5c3RlbSBhdCBldmVyeSBwb2ludCB3aGVyZSB0aGUgbW9kZQorICogY291bGQgY2hhbmdlLiAgVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgcGVybWlzc2lvbnMgZnJvbSB0aGUgc3BlY2lmaWVkIG1vZGUKKyAqIGFuZCBwbGFjZXMgaXQgaW4gdGhlIHN1cHBsaWVkIEFDTC4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGRyYXdzIGl0cyB2YWxpZGl0eSBmcm9tIHRoZSBmYWN0IHRoYXQsIHdoZW4gdGhlIEFDTAorICogd2FzIGFzc2lnbmVkLCB0aGUgbW9kZSB3YXMgY29waWVkIGZyb20gdGhlIEFDTC4KKyAqIElmIHRoZSBtb2RlIGRpZCBub3QgY2hhbmdlLCB0aGVyZWZvcmUsIHRoZSBtb2RlIHJlbWFpbnMgZXhhY3RseSB3aGF0IHdhcworICogdGFrZW4gZnJvbSB0aGUgc3BlY2lhbCBBQ0wgZW50cmllcyBhdCBhc3NpZ25tZW50LgorICogSWYgYSBzdWJzZXF1ZW50IGNobW9kKCkgd2FzIGRvbmUsIHRoZSBQT1NJWCBzcGVjIHNheXMgdGhhdCB0aGUgY2hhbmdlIGluCisgKiBtb2RlIG11c3QgY2F1c2UgYW4gdXBkYXRlIHRvIHRoZSBBQ0wgc2VlbiBhdCB1c2VyIGxldmVsIGFuZCB1c2VkIGZvcgorICogYWNjZXNzIGNoZWNrcy4gIEJlZm9yZSBhbmQgYWZ0ZXIgYSBtb2RlIGNoYW5nZSwgdGhlcmVmb3JlLCB0aGUgZmlsZSBtb2RlCisgKiBtb3N0IGFjY3VyYXRlbHkgcmVmbGVjdHMgd2hhdCB0aGUgc3BlY2lhbCBBQ0wgZW50cmllcyBzaG91bGQgcGVybWl0L2RlbnkuCisgKgorICogQ0FWRUFUOiBJZiBzb21lb25lIHNldHMgdGhlIFNHSV9BQ0xfRklMRSBhdHRyaWJ1dGUgZGlyZWN0bHksCisgKiAgICAgICAgIHRoZSBleGlzdGluZyBtb2RlIGJpdHMgd2lsbCBvdmVycmlkZSB3aGF0ZXZlciBpcyBpbiB0aGUKKyAqICAgICAgICAgQUNMLiBTaW1pbGFybHksIGlmIHRoZXJlIGlzIGEgcHJlLWV4aXN0aW5nIEFDTCB0aGF0IHdhcworICogICAgICAgICBuZXZlciBpbiBzeW5jIHdpdGggaXRzIG1vZGUgKG93aW5nIHRvIGEgYnVnIGluIDYuNSBhbmQKKyAqICAgICAgICAgYmVmb3JlKSwgaXQgd2lsbCBub3cgbWFnaWNhbGx5IChvciBteXN0aWNhbGx5KSBiZQorICogICAgICAgICBzeW5jaHJvbml6ZWQuICBUaGlzIGNvdWxkIGNhdXNlIHNsaWdodCBhc3RvbmlzaG1lbnQsIGJ1dAorICogICAgICAgICBpdCBpcyBiZXR0ZXIgdGhhbiBpbmNvbnNpc3RlbnQgcGVybWlzc2lvbnMuCisgKgorICogVGhlIHN1cHBsaWVkIEFDTCBpcyBhIHRlbXBsYXRlIHRoYXQgbWF5IGNvbnRhaW4gYW55IGNvbWJpbmF0aW9uCisgKiBvZiBzcGVjaWFsIGVudHJpZXMuICBUaGVzZSBhcmUgdHJlYXRlZCBhcyBwbGFjZSBob2xkZXJzIHdoZW4gd2UgZmlsbAorICogb3V0IHRoZSBBQ0wuICBUaGlzIHJvdXRpbmUgZG9lcyBub3QgYWRkIG9yIHJlbW92ZSBzcGVjaWFsIGVudHJpZXMsIGl0CisgKiBzaW1wbHkgdW5pdGVzIGVhY2ggc3BlY2lhbCBlbnRyeSB3aXRoIGl0cyBhc3NvY2lhdGVkIHNldCBvZiBwZXJtaXNzaW9ucy4KKyAqLworU1RBVElDIHZvaWQKK3hmc19hY2xfc3luY19tb2RlKAorCW1vZGVfdAkJbW9kZSwKKwl4ZnNfYWNsX3QJKmFjbCkKK3sKKwlpbnQJCWksIG5vbWFzayA9IDE7CisJeGZzX2FjbF9lbnRyeV90CSphcDsKKwl4ZnNfYWNsX2VudHJ5X3QJKmdhcCA9IE5VTEw7CisKKwkvKgorCSAqIFNldCBBQ0wgZW50cmllcy4gUE9TSVgxMDAzLjFlRDE2IHJlcXVpcmVzIHRoYXQgdGhlIE1BU0sKKwkgKiBiZSBzZXQgaW5zdGVhZCBvZiB0aGUgR1JPVVAgZW50cnksIGlmIHRoZXJlIGlzIGEgTUFTSy4KKwkgKi8KKwlmb3IgKGFwID0gYWNsLT5hY2xfZW50cnksIGkgPSAwOyBpIDwgYWNsLT5hY2xfY250OyBhcCsrLCBpKyspIHsKKwkJc3dpdGNoIChhcC0+YWVfdGFnKSB7CisJCWNhc2UgQUNMX1VTRVJfT0JKOgorCQkJYXAtPmFlX3Blcm0gPSAobW9kZSA+PiA2KSAmIDB4NzsKKwkJCWJyZWFrOworCQljYXNlIEFDTF9HUk9VUF9PQko6CisJCQlnYXAgPSBhcDsKKwkJCWJyZWFrOworCQljYXNlIEFDTF9NQVNLOgorCQkJbm9tYXNrID0gMDsKKwkJCWFwLT5hZV9wZXJtID0gKG1vZGUgPj4gMykgJiAweDc7CisJCQlicmVhazsKKwkJY2FzZSBBQ0xfT1RIRVI6CisJCQlhcC0+YWVfcGVybSA9IG1vZGUgJiAweDc7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCS8qIFNldCB0aGUgQUNMX0dST1VQX09CSiBpZiB0aGVyZSdzIG5vIEFDTF9NQVNLICovCisJaWYgKGdhcCAmJiBub21hc2spCisJCWdhcC0+YWVfcGVybSA9IChtb2RlID4+IDMpICYgMHg3OworfQorCisvKgorICogV2hlbiBpbmhlcml0aW5nIGFuIEFjY2VzcyBBQ0wgZnJvbSBhIGRpcmVjdG9yeSBEZWZhdWx0IEFDTCwKKyAqIHRoZSBBQ0wgYml0cyBhcmUgc2V0IHRvIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIEFDTCBkZWZhdWx0CisgKiBwZXJtaXNzaW9uIGJpdHMgYW5kIHRoZSBmaWxlIHBlcm1pc3Npb24gYml0cyBpbiBtb2RlLiBJZiB0aGVyZQorICogYXJlIG5vIHBlcm1pc3Npb24gYml0cyBvbiB0aGUgZmlsZSB0aGVuIHdlIG11c3Qgbm90IGdpdmUgdGhlbQorICogdGhlIEFDTC4gVGhpcyBpcyB3aGF0IHdoYXQgbWFrZXMgdW1hc2soKSB3b3JrIHdpdGggQUNMcy4KKyAqLworU1RBVElDIHZvaWQKK3hmc19hY2xfZmlsdGVyX21vZGUoCisJbW9kZV90CQltb2RlLAorCXhmc19hY2xfdAkqYWNsKQoreworCWludAkJaSwgbm9tYXNrID0gMTsKKwl4ZnNfYWNsX2VudHJ5X3QJKmFwOworCXhmc19hY2xfZW50cnlfdAkqZ2FwID0gTlVMTDsKKworCS8qCisJICogU2V0IEFDTCBlbnRyaWVzLiBQT1NJWDEwMDMuMWVEMTYgcmVxdWlyZXMgdGhhdCB0aGUgTUFTSworCSAqIGJlIG1lcmdlZCB3aXRoIEdST1VQIGVudHJ5LCBpZiB0aGVyZSBpcyBhIE1BU0suCisJICovCisJZm9yIChhcCA9IGFjbC0+YWNsX2VudHJ5LCBpID0gMDsgaSA8IGFjbC0+YWNsX2NudDsgYXArKywgaSsrKSB7CisJCXN3aXRjaCAoYXAtPmFlX3RhZykgeworCQljYXNlIEFDTF9VU0VSX09CSjoKKwkJCWFwLT5hZV9wZXJtICY9IChtb2RlID4+IDYpICYgMHg3OworCQkJYnJlYWs7CisJCWNhc2UgQUNMX0dST1VQX09CSjoKKwkJCWdhcCA9IGFwOworCQkJYnJlYWs7CisJCWNhc2UgQUNMX01BU0s6CisJCQlub21hc2sgPSAwOworCQkJYXAtPmFlX3Blcm0gJj0gKG1vZGUgPj4gMykgJiAweDc7CisJCQlicmVhazsKKwkJY2FzZSBBQ0xfT1RIRVI6CisJCQlhcC0+YWVfcGVybSAmPSBtb2RlICYgMHg3OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKwkvKiBTZXQgdGhlIEFDTF9HUk9VUF9PQkogaWYgdGhlcmUncyBubyBBQ0xfTUFTSyAqLworCWlmIChnYXAgJiYgbm9tYXNrKQorCQlnYXAtPmFlX3Blcm0gJj0gKG1vZGUgPj4gMykgJiAweDc7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2FjbC5oIGIvZnMveGZzL3hmc19hY2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzYzZWI0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19hY2wuaApAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfQUNMX0hfXworI2RlZmluZSBfX1hGU19BQ0xfSF9fCisKKy8qCisgKiBBY2Nlc3MgQ29udHJvbCBMaXN0cworICovCit0eXBlZGVmIF9fdWludDE2X3QJeGZzX2FjbF9wZXJtX3Q7Cit0eXBlZGVmIF9faW50MzJfdAl4ZnNfYWNsX3R5cGVfdDsKK3R5cGVkZWYgX19pbnQzMl90CXhmc19hY2xfdGFnX3Q7Cit0eXBlZGVmIF9faW50MzJfdAl4ZnNfYWNsX2lkX3Q7CisKKyNkZWZpbmUgWEZTX0FDTF9NQVhfRU5UUklFUyAyNQorI2RlZmluZSBYRlNfQUNMX05PVF9QUkVTRU5UICgtMSkKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2FjbF9lbnRyeSB7CisJeGZzX2FjbF90YWdfdAlhZV90YWc7CisJeGZzX2FjbF9pZF90CWFlX2lkOworCXhmc19hY2xfcGVybV90CWFlX3Blcm07Cit9IHhmc19hY2xfZW50cnlfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2FjbCB7CisJX19pbnQzMl90CWFjbF9jbnQ7CisJeGZzX2FjbF9lbnRyeV90CWFjbF9lbnRyeVtYRlNfQUNMX01BWF9FTlRSSUVTXTsKK30geGZzX2FjbF90OworCisvKiBPbi1kaXNrIFhGUyBleHRlbmRlZCBhdHRyaWJ1dGUgbmFtZXMgKi8KKyNkZWZpbmUgU0dJX0FDTF9GSUxFCSJTR0lfQUNMX0ZJTEUiCisjZGVmaW5lIFNHSV9BQ0xfREVGQVVMVAkiU0dJX0FDTF9ERUZBVUxUIgorI2RlZmluZSBTR0lfQUNMX0ZJTEVfU0laRQkoc2l6ZW9mKFNHSV9BQ0xfRklMRSktMSkKKyNkZWZpbmUgU0dJX0FDTF9ERUZBVUxUX1NJWkUJKHNpemVvZihTR0lfQUNMX0RFRkFVTFQpLTEpCisKKworI2lmZGVmIENPTkZJR19YRlNfUE9TSVhfQUNMCisKK3N0cnVjdCB2YXR0cjsKK3N0cnVjdCB2bm9kZTsKK3N0cnVjdCB4ZnNfaW5vZGU7CisKK2V4dGVybiBzdHJ1Y3Qga21lbV96b25lICp4ZnNfYWNsX3pvbmU7CisjZGVmaW5lIHhmc19hY2xfem9uZV9pbml0KHpvbmUsIG5hbWUpCVwKKwkJKHpvbmUpID0ga21lbV96b25lX2luaXQoc2l6ZW9mKHhmc19hY2xfdCksIG5hbWUpCisjZGVmaW5lIHhmc19hY2xfem9uZV9kZXN0cm95KHpvbmUpCWttZW1fY2FjaGVfZGVzdHJveSh6b25lKQorCitleHRlcm4gaW50IHhmc19hY2xfaW5oZXJpdChzdHJ1Y3Qgdm5vZGUgKiwgc3RydWN0IHZhdHRyICosIHhmc19hY2xfdCAqKTsKK2V4dGVybiBpbnQgeGZzX2FjbF9pYWNjZXNzKHN0cnVjdCB4ZnNfaW5vZGUgKiwgbW9kZV90LCBjcmVkX3QgKik7CitleHRlcm4gaW50IHhmc19hY2xfdnRvYWNsKHN0cnVjdCB2bm9kZSAqLCB4ZnNfYWNsX3QgKiwgeGZzX2FjbF90ICopOworZXh0ZXJuIGludCB4ZnNfYWNsX3ZoYXNhY2xfYWNjZXNzKHN0cnVjdCB2bm9kZSAqKTsKK2V4dGVybiBpbnQgeGZzX2FjbF92aGFzYWNsX2RlZmF1bHQoc3RydWN0IHZub2RlICopOworZXh0ZXJuIGludCB4ZnNfYWNsX3ZzZXQoc3RydWN0IHZub2RlICosIHZvaWQgKiwgc2l6ZV90LCBpbnQpOworZXh0ZXJuIGludCB4ZnNfYWNsX3ZnZXQoc3RydWN0IHZub2RlICosIHZvaWQgKiwgc2l6ZV90LCBpbnQpOworZXh0ZXJuIGludCB4ZnNfYWNsX3ZyZW1vdmUoc3RydWN0IHZub2RlICp2cCwgaW50KTsKKworI2RlZmluZSBfQUNMX1RZUEVfQUNDRVNTCTEKKyNkZWZpbmUgX0FDTF9UWVBFX0RFRkFVTFQJMgorI2RlZmluZSBfQUNMX1BFUk1fSU5WQUxJRChwZXJtKQkoKHBlcm0pICYgfihBQ0xfUkVBRHxBQ0xfV1JJVEV8QUNMX0VYRUNVVEUpKQorCisjZGVmaW5lIF9BQ0xfSU5IRVJJVChjLHYsZCkJKHhmc19hY2xfaW5oZXJpdChjLHYsZCkpCisjZGVmaW5lIF9BQ0xfR0VUX0FDQ0VTUyhwdixwYSkJKHhmc19hY2xfdnRvYWNsKHB2LHBhLE5VTEwpID09IDApCisjZGVmaW5lIF9BQ0xfR0VUX0RFRkFVTFQocHYscGQpCSh4ZnNfYWNsX3Z0b2FjbChwdixOVUxMLHBkKSA9PSAwKQorI2RlZmluZSBfQUNMX0FDQ0VTU19FWElTVFMJeGZzX2FjbF92aGFzYWNsX2FjY2VzcworI2RlZmluZSBfQUNMX0RFRkFVTFRfRVhJU1RTCXhmc19hY2xfdmhhc2FjbF9kZWZhdWx0CisjZGVmaW5lIF9BQ0xfWEZTX0lBQ0NFU1MoaSxtLGMpIChYRlNfSUZPUktfUShpKSA/IHhmc19hY2xfaWFjY2VzcyhpLG0sYykgOiAtMSkKKworI2RlZmluZSBfQUNMX0FMTE9DKGEpCQkoKGEpID0ga21lbV96b25lX2FsbG9jKHhmc19hY2xfem9uZSwgS01fU0xFRVApKQorI2RlZmluZSBfQUNMX0ZSRUUoYSkJCSgoYSk/IGttZW1fem9uZV9mcmVlKHhmc19hY2xfem9uZSwgKGEpKToodm9pZCkwKQorCisjZWxzZQorI2RlZmluZSB4ZnNfYWNsX3pvbmVfaW5pdCh6b25lLG5hbWUpCisjZGVmaW5lIHhmc19hY2xfem9uZV9kZXN0cm95KHpvbmUpCisjZGVmaW5lIHhmc19hY2xfdnNldCh2LHAsc3osdCkJKC1FT1BOT1RTVVBQKQorI2RlZmluZSB4ZnNfYWNsX3ZnZXQodixwLHN6LHQpCSgtRU9QTk9UU1VQUCkKKyNkZWZpbmUgeGZzX2FjbF92cmVtb3ZlKHYsdCkJKC1FT1BOT1RTVVBQKQorI2RlZmluZSB4ZnNfYWNsX3ZoYXNhY2xfYWNjZXNzKHYpCSgwKQorI2RlZmluZSB4ZnNfYWNsX3ZoYXNhY2xfZGVmYXVsdCh2KQkoMCkKKyNkZWZpbmUgX0FDTF9BTExPQyhhKQkJKDEpCS8qIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZSBub3RoaW5nICovCisjZGVmaW5lIF9BQ0xfRlJFRShhKQkJKCh2b2lkKTApCisjZGVmaW5lIF9BQ0xfSU5IRVJJVChjLHYsZCkJKDApCisjZGVmaW5lIF9BQ0xfR0VUX0FDQ0VTUyhwdixwYSkJKDApCisjZGVmaW5lIF9BQ0xfR0VUX0RFRkFVTFQocHYscGQpCSgwKQorI2RlZmluZSBfQUNMX0FDQ0VTU19FWElTVFMJKE5VTEwpCisjZGVmaW5lIF9BQ0xfREVGQVVMVF9FWElTVFMJKE5VTEwpCisjZGVmaW5lIF9BQ0xfWEZTX0lBQ0NFU1MoaSxtLGMpICgtMSkKKyNlbmRpZgorCisjZW5kaWYJLyogX19YRlNfQUNMX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hZy5oIGIvZnMveGZzL3hmc19hZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2YjcwZjcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2FnLmgKQEAgLTAsMCArMSwzNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX0FHX0hfXworI2RlZmluZQlfX1hGU19BR19IX18KKworLyoKKyAqIEFsbG9jYXRpb24gZ3JvdXAgaGVhZGVyCisgKiBUaGlzIGlzIGRpdmlkZWQgaW50byB0aHJlZSBzdHJ1Y3R1cmVzLCBwbGFjZWQgaW4gc2VxdWVudGlhbCA1MTItYnl0ZQorICogYnVmZmVycyBhZnRlciBhIGNvcHkgb2YgdGhlIHN1cGVyYmxvY2sgKGFsc28gaW4gYSA1MTItYnl0ZSBidWZmZXIpLgorICovCisKK3N0cnVjdCB4ZnNfYnVmOworc3RydWN0IHhmc19tb3VudDsKK3N0cnVjdCB4ZnNfdHJhbnM7CisKKyNkZWZpbmUJWEZTX0FHRl9NQUdJQwkweDU4NDE0NzQ2CS8qICdYQUdGJyAqLworI2RlZmluZQlYRlNfQUdJX01BR0lDCTB4NTg0MTQ3NDkJLyogJ1hBR0knICovCisjZGVmaW5lCVhGU19BR0ZfVkVSU0lPTgkxCisjZGVmaW5lCVhGU19BR0lfVkVSU0lPTgkxCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BR0ZfR09PRF9WRVJTSU9OKQoraW50IHhmc19hZ2ZfZ29vZF92ZXJzaW9uKHVuc2lnbmVkIHYpOworI2RlZmluZQlYRlNfQUdGX0dPT0RfVkVSU0lPTih2KQl4ZnNfYWdmX2dvb2RfdmVyc2lvbih2KQorI2Vsc2UKKyNkZWZpbmUgWEZTX0FHRl9HT09EX1ZFUlNJT04odikJCSgodikgPT0gWEZTX0FHRl9WRVJTSU9OKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BR0lfR09PRF9WRVJTSU9OKQoraW50IHhmc19hZ2lfZ29vZF92ZXJzaW9uKHVuc2lnbmVkIHYpOworI2RlZmluZQlYRlNfQUdJX0dPT0RfVkVSU0lPTih2KQl4ZnNfYWdpX2dvb2RfdmVyc2lvbih2KQorI2Vsc2UKKyNkZWZpbmUgWEZTX0FHSV9HT09EX1ZFUlNJT04odikJCSgodikgPT0gWEZTX0FHSV9WRVJTSU9OKQorI2VuZGlmCisKKy8qCisgKiBCdHJlZSBudW1iZXIgMCBpcyBibm8sIDEgaXMgY250LiAgVGhpcyB2YWx1ZSBnaXZlcyB0aGUgc2l6ZSBvZiB0aGUKKyAqIGFycmF5cyBiZWxvdy4KKyAqLworI2RlZmluZQlYRlNfQlROVU1fQUdGCSgoaW50KVhGU19CVE5VTV9DTlRpICsgMSkKKworLyoKKyAqIFRoZSBzZWNvbmQgd29yZCBvZiBhZ2ZfbGV2ZWxzIGluIHRoZSBmaXJzdCBhLmcuIG92ZXJsYXBzIHRoZSBFRlMKKyAqIHN1cGVyYmxvY2sncyBtYWdpYyBudW1iZXIuICBTaW5jZSB0aGUgbWFnaWMgbnVtYmVycyB2YWxpZCBmb3IgRUZTCisgKiBhcmUgPiA2NGssIG91ciB2YWx1ZSBjYW5ub3QgYmUgY29uZnVzZWQgZm9yIGFuIEVGUyBzdXBlcmJsb2NrJ3MuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2FnZgoreworCS8qCisJICogQ29tbW9uIGFsbG9jYXRpb24gZ3JvdXAgaGVhZGVyIGluZm9ybWF0aW9uCisJICovCisJX191aW50MzJfdAlhZ2ZfbWFnaWNudW07CS8qIG1hZ2ljIG51bWJlciA9PSBYRlNfQUdGX01BR0lDICovCisJX191aW50MzJfdAlhZ2ZfdmVyc2lvbm51bTsJLyogaGVhZGVyIHZlcnNpb24gPT0gWEZTX0FHRl9WRVJTSU9OICovCisJeGZzX2FnbnVtYmVyX3QJYWdmX3NlcW5vOwkvKiBzZXF1ZW5jZSAjIHN0YXJ0aW5nIGZyb20gMCAqLworCXhmc19hZ2Jsb2NrX3QJYWdmX2xlbmd0aDsJLyogc2l6ZSBpbiBibG9ja3Mgb2YgYS5nLiAqLworCS8qCisJICogRnJlZXNwYWNlIGluZm9ybWF0aW9uCisJICovCisJeGZzX2FnYmxvY2tfdAlhZ2Zfcm9vdHNbWEZTX0JUTlVNX0FHRl07CS8qIHJvb3QgYmxvY2tzICovCisJX191aW50MzJfdAlhZ2Zfc3BhcmUwOwkvKiBzcGFyZSBmaWVsZCAqLworCV9fdWludDMyX3QJYWdmX2xldmVsc1tYRlNfQlROVU1fQUdGXTsJLyogYnRyZWUgbGV2ZWxzICovCisJX191aW50MzJfdAlhZ2Zfc3BhcmUxOwkvKiBzcGFyZSBmaWVsZCAqLworCV9fdWludDMyX3QJYWdmX2ZsZmlyc3Q7CS8qIGZpcnN0IGZyZWVsaXN0IGJsb2NrJ3MgaW5kZXggKi8KKwlfX3VpbnQzMl90CWFnZl9mbGxhc3Q7CS8qIGxhc3QgZnJlZWxpc3QgYmxvY2sncyBpbmRleCAqLworCV9fdWludDMyX3QJYWdmX2ZsY291bnQ7CS8qIGNvdW50IG9mIGJsb2NrcyBpbiBmcmVlbGlzdCAqLworCXhmc19leHRsZW5fdAlhZ2ZfZnJlZWJsa3M7CS8qIHRvdGFsIGZyZWUgYmxvY2tzICovCisJeGZzX2V4dGxlbl90CWFnZl9sb25nZXN0OwkvKiBsb25nZXN0IGZyZWUgc3BhY2UgKi8KK30geGZzX2FnZl90OworCisjZGVmaW5lCVhGU19BR0ZfTUFHSUNOVU0JMHgwMDAwMDAwMQorI2RlZmluZQlYRlNfQUdGX1ZFUlNJT05OVU0JMHgwMDAwMDAwMgorI2RlZmluZQlYRlNfQUdGX1NFUU5PCQkweDAwMDAwMDA0CisjZGVmaW5lCVhGU19BR0ZfTEVOR1RICQkweDAwMDAwMDA4CisjZGVmaW5lCVhGU19BR0ZfUk9PVFMJCTB4MDAwMDAwMTAKKyNkZWZpbmUJWEZTX0FHRl9MRVZFTFMJCTB4MDAwMDAwMjAKKyNkZWZpbmUJWEZTX0FHRl9GTEZJUlNUCQkweDAwMDAwMDQwCisjZGVmaW5lCVhGU19BR0ZfRkxMQVNUCQkweDAwMDAwMDgwCisjZGVmaW5lCVhGU19BR0ZfRkxDT1VOVAkJMHgwMDAwMDEwMAorI2RlZmluZQlYRlNfQUdGX0ZSRUVCTEtTCTB4MDAwMDAyMDAKKyNkZWZpbmUJWEZTX0FHRl9MT05HRVNUCQkweDAwMDAwNDAwCisjZGVmaW5lCVhGU19BR0ZfTlVNX0JJVFMJMTEKKyNkZWZpbmUJWEZTX0FHRl9BTExfQklUUwkoKDEgPDwgWEZTX0FHRl9OVU1fQklUUykgLSAxKQorCisvKiBkaXNrIGJsb2NrICh4ZnNfZGFkZHJfdCkgaW4gdGhlIEFHICovCisjZGVmaW5lIFhGU19BR0ZfREFERFIobXApCSgoeGZzX2RhZGRyX3QpKDEgPDwgKG1wKS0+bV9zZWN0YmJfbG9nKSkKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0FHRl9CTE9DSykKK3hmc19hZ2Jsb2NrX3QgeGZzX2FnZl9ibG9jayhzdHJ1Y3QgeGZzX21vdW50ICptcCk7CisjZGVmaW5lCVhGU19BR0ZfQkxPQ0sobXApCXhmc19hZ2ZfYmxvY2sobXApCisjZWxzZQorI2RlZmluZSBYRlNfQUdGX0JMT0NLKG1wKQlYRlNfSERSX0JMT0NLKG1wLCBYRlNfQUdGX0RBRERSKG1wKSkKKyNlbmRpZgorCisvKgorICogU2l6ZSBvZiB0aGUgdW5saW5rZWQgaW5vZGUgaGFzaCB0YWJsZSBpbiB0aGUgYWdpLgorICovCisjZGVmaW5lCVhGU19BR0lfVU5MSU5LRURfQlVDS0VUUwk2NAorCit0eXBlZGVmIHN0cnVjdCB4ZnNfYWdpCit7CisJLyoKKwkgKiBDb21tb24gYWxsb2NhdGlvbiBncm91cCBoZWFkZXIgaW5mb3JtYXRpb24KKwkgKi8KKwlfX3VpbnQzMl90CWFnaV9tYWdpY251bTsJLyogbWFnaWMgbnVtYmVyID09IFhGU19BR0lfTUFHSUMgKi8KKwlfX3VpbnQzMl90CWFnaV92ZXJzaW9ubnVtOwkvKiBoZWFkZXIgdmVyc2lvbiA9PSBYRlNfQUdJX1ZFUlNJT04gKi8KKwl4ZnNfYWdudW1iZXJfdAlhZ2lfc2Vxbm87CS8qIHNlcXVlbmNlICMgc3RhcnRpbmcgZnJvbSAwICovCisJeGZzX2FnYmxvY2tfdAlhZ2lfbGVuZ3RoOwkvKiBzaXplIGluIGJsb2NrcyBvZiBhLmcuICovCisJLyoKKwkgKiBJbm9kZSBpbmZvcm1hdGlvbgorCSAqIElub2RlcyBhcmUgbWFwcGVkIGJ5IGludGVycHJldGluZyB0aGUgaW5vZGUgbnVtYmVyLCBzbyBubworCSAqIG1hcHBpbmcgZGF0YSBpcyBuZWVkZWQgaGVyZS4KKwkgKi8KKwl4ZnNfYWdpbm9fdAlhZ2lfY291bnQ7CS8qIGNvdW50IG9mIGFsbG9jYXRlZCBpbm9kZXMgKi8KKwl4ZnNfYWdibG9ja190CWFnaV9yb290OwkvKiByb290IG9mIGlub2RlIGJ0cmVlICovCisJX191aW50MzJfdAlhZ2lfbGV2ZWw7CS8qIGxldmVscyBpbiBpbm9kZSBidHJlZSAqLworCXhmc19hZ2lub190CWFnaV9mcmVlY291bnQ7CS8qIG51bWJlciBvZiBmcmVlIGlub2RlcyAqLworCXhmc19hZ2lub190CWFnaV9uZXdpbm87CS8qIG5ldyBpbm9kZSBqdXN0IGFsbG9jYXRlZCAqLworCXhmc19hZ2lub190CWFnaV9kaXJpbm87CS8qIGxhc3QgZGlyZWN0b3J5IGlub2RlIGNodW5rICovCisJLyoKKwkgKiBIYXNoIHRhYmxlIG9mIGlub2RlcyB3aGljaCBoYXZlIGJlZW4gdW5saW5rZWQgYnV0IGFyZQorCSAqIHN0aWxsIGJlaW5nIHJlZmVyZW5jZWQuCisJICovCisJeGZzX2FnaW5vX3QJYWdpX3VubGlua2VkW1hGU19BR0lfVU5MSU5LRURfQlVDS0VUU107Cit9IHhmc19hZ2lfdDsKKworI2RlZmluZQlYRlNfQUdJX01BR0lDTlVNCTB4MDAwMDAwMDEKKyNkZWZpbmUJWEZTX0FHSV9WRVJTSU9OTlVNCTB4MDAwMDAwMDIKKyNkZWZpbmUJWEZTX0FHSV9TRVFOTwkJMHgwMDAwMDAwNAorI2RlZmluZQlYRlNfQUdJX0xFTkdUSAkJMHgwMDAwMDAwOAorI2RlZmluZQlYRlNfQUdJX0NPVU5UCQkweDAwMDAwMDEwCisjZGVmaW5lCVhGU19BR0lfUk9PVAkJMHgwMDAwMDAyMAorI2RlZmluZQlYRlNfQUdJX0xFVkVMCQkweDAwMDAwMDQwCisjZGVmaW5lCVhGU19BR0lfRlJFRUNPVU5UCTB4MDAwMDAwODAKKyNkZWZpbmUJWEZTX0FHSV9ORVdJTk8JCTB4MDAwMDAxMDAKKyNkZWZpbmUJWEZTX0FHSV9ESVJJTk8JCTB4MDAwMDAyMDAKKyNkZWZpbmUJWEZTX0FHSV9VTkxJTktFRAkweDAwMDAwNDAwCisjZGVmaW5lCVhGU19BR0lfTlVNX0JJVFMJMTEKKyNkZWZpbmUJWEZTX0FHSV9BTExfQklUUwkoKDEgPDwgWEZTX0FHSV9OVU1fQklUUykgLSAxKQorCisvKiBkaXNrIGJsb2NrICh4ZnNfZGFkZHJfdCkgaW4gdGhlIEFHICovCisjZGVmaW5lIFhGU19BR0lfREFERFIobXApCSgoeGZzX2RhZGRyX3QpKDIgPDwgKG1wKS0+bV9zZWN0YmJfbG9nKSkKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0FHSV9CTE9DSykKK3hmc19hZ2Jsb2NrX3QgeGZzX2FnaV9ibG9jayhzdHJ1Y3QgeGZzX21vdW50ICptcCk7CisjZGVmaW5lCVhGU19BR0lfQkxPQ0sobXApCXhmc19hZ2lfYmxvY2sobXApCisjZWxzZQorI2RlZmluZSBYRlNfQUdJX0JMT0NLKG1wKQlYRlNfSERSX0JMT0NLKG1wLCBYRlNfQUdJX0RBRERSKG1wKSkKKyNlbmRpZgorCisvKgorICogVGhlIHRoaXJkIGEuZy4gYmxvY2sgY29udGFpbnMgdGhlIGEuZy4gZnJlZWxpc3QsIGFuIGFycmF5CisgKiBvZiBibG9jayBwb2ludGVycyB0byBibG9ja3Mgb3duZWQgYnkgdGhlIGFsbG9jYXRpb24gYnRyZWUgY29kZS4KKyAqLworI2RlZmluZSBYRlNfQUdGTF9EQUREUihtcCkJKCh4ZnNfZGFkZHJfdCkoMyA8PCAobXApLT5tX3NlY3RiYl9sb2cpKQorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQUdGTF9CTE9DSykKK3hmc19hZ2Jsb2NrX3QgeGZzX2FnZmxfYmxvY2soc3RydWN0IHhmc19tb3VudCAqbXApOworI2RlZmluZQlYRlNfQUdGTF9CTE9DSyhtcCkJeGZzX2FnZmxfYmxvY2sobXApCisjZWxzZQorI2RlZmluZSBYRlNfQUdGTF9CTE9DSyhtcCkJWEZTX0hEUl9CTE9DSyhtcCwgWEZTX0FHRkxfREFERFIobXApKQorI2VuZGlmCisjZGVmaW5lIFhGU19BR0ZMX1NJWkUobXApCSgobXApLT5tX3NiLnNiX3NlY3RzaXplIC8gc2l6ZW9mKHhmc19hZ2Jsb2NrX3QpKQorCit0eXBlZGVmIHN0cnVjdCB4ZnNfYWdmbCB7CisJeGZzX2FnYmxvY2tfdAlhZ2ZsX2Jub1sxXTsJLyogYWN0dWFsbHkgWEZTX0FHRkxfU0laRShtcCkgKi8KK30geGZzX2FnZmxfdDsKKworLyoKKyAqIEJ1c3kgYmxvY2svZXh0ZW50IGVudHJ5LiAgVXNlZCBpbiBwZXJhZyB0byBtYXJrIGJsb2NrcyB0aGF0IGhhdmUgYmVlbiBmcmVlZAorICogYnV0IHdob3NlIHRyYW5zYWN0aW9ucyBhcmVuJ3QgY29tbWl0dGVkIHRvIGRpc2sgeWV0LgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfcGVyYWdfYnVzeSB7CisJeGZzX2FnYmxvY2tfdAlidXN5X3N0YXJ0OworCXhmc19leHRsZW5fdAlidXN5X2xlbmd0aDsKKwlzdHJ1Y3QgeGZzX3RyYW5zICpidXN5X3RwOwkvKiB0cmFuc2FjdGlvbiB0aGF0IGRpZCB0aGUgZnJlZSAqLworfSB4ZnNfcGVyYWdfYnVzeV90OworCisvKgorICogUGVyLWFnIGluY29yZSBzdHJ1Y3R1cmUsIGNvcGllcyBvZiBpbmZvcm1hdGlvbiBpbiBhZ2YgYW5kIGFnaSwKKyAqIHRvIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIG9mIGFsbG9jYXRpb24gZ3JvdXAgc2VsZWN0aW9uLgorICoKKyAqIHBpY2sgc2l6ZXMgd2hpY2ggZml0IGluIGFsbG9jYXRpb24gYnVja2V0cyB3ZWxsCisgKi8KKyNpZiAoQklUU19QRVJfTE9ORyA9PSAzMikKKyNkZWZpbmUgWEZTX1BBR0JfTlVNX1NMT1RTCTg0CisjZWxpZiAoQklUU19QRVJfTE9ORyA9PSA2NCkKKyNkZWZpbmUgWEZTX1BBR0JfTlVNX1NMT1RTCTEyOAorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHhmc19wZXJhZworeworCWNoYXIJCXBhZ2ZfaW5pdDsJLyogdGhpcyBhZ2YncyBlbnRyeSBpcyBpbml0aWFsaXplZCAqLworCWNoYXIJCXBhZ2lfaW5pdDsJLyogdGhpcyBhZ2kncyBlbnRyeSBpcyBpbml0aWFsaXplZCAqLworCWNoYXIJCXBhZ2ZfbWV0YWRhdGE7CS8qIHRoZSBhZ2YgaXMgcHJlZmVyZWQgdG8gYmUgbWV0YWRhdGEgKi8KKwljaGFyCQlwYWdpX2lub2Rlb2s7CS8qIFRoZSBhZ2kgaXMgb2sgZm9yIGlub2RlcyAqLworCV9fdWludDhfdAlwYWdmX2xldmVsc1tYRlNfQlROVU1fQUdGXTsKKwkJCQkJLyogIyBvZiBsZXZlbHMgaW4gYm5vICYgY250IGJ0cmVlICovCisJX191aW50MzJfdAlwYWdmX2ZsY291bnQ7CS8qIGNvdW50IG9mIGJsb2NrcyBpbiBmcmVlbGlzdCAqLworCXhmc19leHRsZW5fdAlwYWdmX2ZyZWVibGtzOwkvKiB0b3RhbCBmcmVlIGJsb2NrcyAqLworCXhmc19leHRsZW5fdAlwYWdmX2xvbmdlc3Q7CS8qIGxvbmdlc3QgZnJlZSBzcGFjZSAqLworCXhmc19hZ2lub190CXBhZ2lfZnJlZWNvdW50OwkvKiBudW1iZXIgb2YgZnJlZSBpbm9kZXMgKi8KKyNpZmRlZiBfX0tFUk5FTF9fCisJbG9ja190CQlwYWdiX2xvY2s7CS8qIGxvY2sgZm9yIHBhZ2JfbGlzdCAqLworI2VuZGlmCisJaW50CQlwYWdiX2NvdW50OwkvKiBwYWdiIHNsb3RzIGluIHVzZSAqLworCXhmc19wZXJhZ19idXN5X3QgKnBhZ2JfbGlzdDsJLyogdW5zdGFibGUgYmxvY2tzICovCit9IHhmc19wZXJhZ190OworCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BR19NQVhMRVZFTFMpCitpbnQgeGZzX2FnX21heGxldmVscyhzdHJ1Y3QgeGZzX21vdW50ICptcCk7CisjZGVmaW5lCVhGU19BR19NQVhMRVZFTFMobXApCQl4ZnNfYWdfbWF4bGV2ZWxzKG1wKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0FHX01BWExFVkVMUyhtcCkJKChtcCktPm1fYWdfbWF4bGV2ZWxzKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19NSU5fRlJFRUxJU1QpCitpbnQgeGZzX21pbl9mcmVlbGlzdCh4ZnNfYWdmX3QgKmEsIHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKKyNkZWZpbmUJWEZTX01JTl9GUkVFTElTVChhLG1wKQkJeGZzX21pbl9mcmVlbGlzdChhLG1wKQorI2Vsc2UKKyNkZWZpbmUJWEZTX01JTl9GUkVFTElTVChhLG1wKQlcCisJWEZTX01JTl9GUkVFTElTVF9SQVcoCVwKKwkJSU5UX0dFVCgoYSktPmFnZl9sZXZlbHNbWEZTX0JUTlVNX0JOT2ldLCBBUkNIX0NPTlZFUlQpLCBcCisJCUlOVF9HRVQoKGEpLT5hZ2ZfbGV2ZWxzW1hGU19CVE5VTV9DTlRpXSwgQVJDSF9DT05WRVJUKSwgbXApCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX01JTl9GUkVFTElTVF9QQUcpCitpbnQgeGZzX21pbl9mcmVlbGlzdF9wYWcoeGZzX3BlcmFnX3QgKnBhZywgc3RydWN0IHhmc19tb3VudCAqbXApOworI2RlZmluZQlYRlNfTUlOX0ZSRUVMSVNUX1BBRyhwYWcsbXApCXhmc19taW5fZnJlZWxpc3RfcGFnKHBhZyxtcCkKKyNlbHNlCisjZGVmaW5lCVhGU19NSU5fRlJFRUxJU1RfUEFHKHBhZyxtcCkJXAorCVhGU19NSU5fRlJFRUxJU1RfUkFXKCh1aW50X3QpKHBhZyktPnBhZ2ZfbGV2ZWxzW1hGU19CVE5VTV9CTk9pXSwgXAorCQkJICAgICAodWludF90KShwYWcpLT5wYWdmX2xldmVsc1tYRlNfQlROVU1fQ05UaV0sIG1wKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19NSU5fRlJFRUxJU1RfUkFXKQoraW50IHhmc19taW5fZnJlZWxpc3RfcmF3KGludCBibCwgaW50IGNsLCBzdHJ1Y3QgeGZzX21vdW50ICptcCk7CisjZGVmaW5lCVhGU19NSU5fRlJFRUxJU1RfUkFXKGJsLGNsLG1wKQl4ZnNfbWluX2ZyZWVsaXN0X3JhdyhibCxjbCxtcCkKKyNlbHNlCisjZGVmaW5lCVhGU19NSU5fRlJFRUxJU1RfUkFXKGJsLGNsLG1wKQlcCisJKE1JTihibCArIDEsIFhGU19BR19NQVhMRVZFTFMobXApKSArIFwKKwkgTUlOKGNsICsgMSwgWEZTX0FHX01BWExFVkVMUyhtcCkpKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0FHQl9UT19GU0IpCit4ZnNfZnNibG9ja190IHhmc19hZ2JfdG9fZnNiKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfYWdudW1iZXJfdCBhZ25vLAorCQkJICAgICB4ZnNfYWdibG9ja190IGFnYm5vKTsKKyNkZWZpbmUgWEZTX0FHQl9UT19GU0IobXAsYWdubyxhZ2JubykJeGZzX2FnYl90b19mc2IobXAsYWdubyxhZ2JubykKKyNlbHNlCisjZGVmaW5lCVhGU19BR0JfVE9fRlNCKG1wLGFnbm8sYWdibm8pIFwKKwkoKCh4ZnNfZnNibG9ja190KShhZ25vKSA8PCAobXApLT5tX3NiLnNiX2FnYmxrbG9nKSB8IChhZ2JubykpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0ZTQl9UT19BR05PKQoreGZzX2FnbnVtYmVyX3QgeGZzX2ZzYl90b19hZ25vKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZnNibG9ja190IGZzYm5vKTsKKyNkZWZpbmUJWEZTX0ZTQl9UT19BR05PKG1wLGZzYm5vKQl4ZnNfZnNiX3RvX2Fnbm8obXAsZnNibm8pCisjZWxzZQorI2RlZmluZQlYRlNfRlNCX1RPX0FHTk8obXAsZnNibm8pIFwKKwkoKHhmc19hZ251bWJlcl90KSgoZnNibm8pID4+IChtcCktPm1fc2Iuc2JfYWdibGtsb2cpKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19GU0JfVE9fQUdCTk8pCit4ZnNfYWdibG9ja190IHhmc19mc2JfdG9fYWdibm8oc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19mc2Jsb2NrX3QgZnNibm8pOworI2RlZmluZQlYRlNfRlNCX1RPX0FHQk5PKG1wLGZzYm5vKQl4ZnNfZnNiX3RvX2FnYm5vKG1wLGZzYm5vKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0ZTQl9UT19BR0JOTyhtcCxmc2JubykgXAorCSgoeGZzX2FnYmxvY2tfdCkoKGZzYm5vKSAmIFhGU19NQVNLMzJMTygobXApLT5tX3NiLnNiX2FnYmxrbG9nKSkpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQUdCX1RPX0RBRERSKQoreGZzX2RhZGRyX3QgeGZzX2FnYl90b19kYWRkcihzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2FnbnVtYmVyX3QgYWdubywKKwkJCQl4ZnNfYWdibG9ja190IGFnYm5vKTsKKyNkZWZpbmUJWEZTX0FHQl9UT19EQUREUihtcCxhZ25vLGFnYm5vKQl4ZnNfYWdiX3RvX2RhZGRyKG1wLGFnbm8sYWdibm8pCisjZWxzZQorI2RlZmluZQlYRlNfQUdCX1RPX0RBRERSKG1wLGFnbm8sYWdibm8pIFwKKwkoKHhmc19kYWRkcl90KShYRlNfRlNCX1RPX0JCKG1wLCBcCisJCSh4ZnNfZnNibG9ja190KShhZ25vKSAqIChtcCktPm1fc2Iuc2JfYWdibG9ja3MgKyAoYWdibm8pKSkpCisjZW5kaWYKKy8qCisgKiBYRlNfREFERFJfVE9fQUdOTyBhbmQgWEZTX0RBRERSX1RPX0FHQk5PIG1vdmVkIHRvIHhmc19tb3VudC5oCisgKiB0byBhdm9pZCBoZWFkZXIgZmlsZSBvcmRlcmluZyBjaGFuZ2UKKyAqLworCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BR19EQUREUikKK3hmc19kYWRkcl90IHhmc19hZ19kYWRkcihzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2FnbnVtYmVyX3QgYWdubywKKwkJCQl4ZnNfZGFkZHJfdCBkKTsKKyNkZWZpbmUJWEZTX0FHX0RBRERSKG1wLGFnbm8sZCkJCXhmc19hZ19kYWRkcihtcCxhZ25vLGQpCisjZWxzZQorI2RlZmluZQlYRlNfQUdfREFERFIobXAsYWdubyxkKQkoWEZTX0FHQl9UT19EQUREUihtcCwgYWdubywgMCkgKyAoZCkpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQlVGX1RPX0FHRikKK3hmc19hZ2ZfdCAqeGZzX2J1Zl90b19hZ2Yoc3RydWN0IHhmc19idWYgKmJwKTsKKyNkZWZpbmUJWEZTX0JVRl9UT19BR0YoYnApCQl4ZnNfYnVmX3RvX2FnZihicCkKKyNlbHNlCisjZGVmaW5lCVhGU19CVUZfVE9fQUdGKGJwKQkoKHhmc19hZ2ZfdCAqKVhGU19CVUZfUFRSKGJwKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQlVGX1RPX0FHSSkKK3hmc19hZ2lfdCAqeGZzX2J1Zl90b19hZ2koc3RydWN0IHhmc19idWYgKmJwKTsKKyNkZWZpbmUJWEZTX0JVRl9UT19BR0koYnApCQl4ZnNfYnVmX3RvX2FnaShicCkKKyNlbHNlCisjZGVmaW5lCVhGU19CVUZfVE9fQUdJKGJwKQkoKHhmc19hZ2lfdCAqKVhGU19CVUZfUFRSKGJwKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQlVGX1RPX0FHRkwpCit4ZnNfYWdmbF90ICp4ZnNfYnVmX3RvX2FnZmwoc3RydWN0IHhmc19idWYgKmJwKTsKKyNkZWZpbmUJWEZTX0JVRl9UT19BR0ZMKGJwKQkJeGZzX2J1Zl90b19hZ2ZsKGJwKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0JVRl9UT19BR0ZMKGJwKQkoKHhmc19hZ2ZsX3QgKilYRlNfQlVGX1BUUihicCkpCisjZW5kaWYKKworLyoKKyAqIEZvciBjaGVja2luZyBmb3IgYmFkIHJhbmdlcyBvZiB4ZnNfZGFkZHJfdCdzLCBjb3ZlcmluZyBtdWx0aXBsZQorICogYWxsb2NhdGlvbiBncm91cHMgb3IgYSBzaW5nbGUgeGZzX2RhZGRyX3QgdGhhdCdzIGEgc3VwZXJibG9jayBjb3B5LgorICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BR19DSEVDS19EQUREUikKK3ZvaWQgeGZzX2FnX2NoZWNrX2RhZGRyKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGFkZHJfdCBkLCB4ZnNfZXh0bGVuX3QgbGVuKTsKKyNkZWZpbmUJWEZTX0FHX0NIRUNLX0RBRERSKG1wLGQsbGVuKQl4ZnNfYWdfY2hlY2tfZGFkZHIobXAsZCxsZW4pCisjZWxzZQorI2RlZmluZQlYRlNfQUdfQ0hFQ0tfREFERFIobXAsZCxsZW4pCVwKKwkoKGxlbikgPT0gMSA/IFwKKwkgICAgQVNTRVJUKChkKSA9PSBYRlNfU0JfREFERFIgfHwgXAorCQkgICBYRlNfREFERFJfVE9fQUdCTk8obXAsIGQpICE9IFhGU19TQl9EQUREUikgOiBcCisJICAgIEFTU0VSVChYRlNfREFERFJfVE9fQUdOTyhtcCwgZCkgPT0gXAorCQkgICBYRlNfREFERFJfVE9fQUdOTyhtcCwgKGQpICsgKGxlbikgLSAxKSkpCisjZW5kaWYKKworI2VuZGlmCS8qIF9fWEZTX0FHX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hbGxvYy5jIGIvZnMveGZzL3hmc19hbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NjAzZGIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2FsbG9jLmMKQEAgLTAsMCArMSwyNjIzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisvKgorICogRnJlZSBzcGFjZSBhbGxvY2F0aW9uIGZvciBYRlMuCisgKi8KKyNpbmNsdWRlICJ4ZnMuaCIKKyNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2FnLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisKKworI2RlZmluZSBYRlNfQUJTRElGRihhLGIpCSgoKGEpIDw9IChiKSkgPyAoKGIpIC0gKGEpKSA6ICgoYSkgLSAoYikpKQorCisjZGVmaW5lCVhGU0FfRklYVVBfQk5PX09LCTEKKyNkZWZpbmUJWEZTQV9GSVhVUF9DTlRfT0sJMgorCitpbnQKK3hmc19hbGxvY19zZWFyY2hfYnVzeSh4ZnNfdHJhbnNfdCAqdHAsCisJCSAgICB4ZnNfYWdudW1iZXJfdCBhZ25vLAorCQkgICAgeGZzX2FnYmxvY2tfdCBibm8sCisJCSAgICB4ZnNfZXh0bGVuX3QgbGVuKTsKKworI2lmIGRlZmluZWQoWEZTX0FMTE9DX1RSQUNFKQora3RyYWNlX3QgKnhmc19hbGxvY190cmFjZV9idWY7CisKKyNkZWZpbmUJVFJBQ0VfQUxMT0MocyxhKQlcCisJeGZzX2FsbG9jX3RyYWNlX2FsbG9jKGZuYW1lLCBzLCBhLCBfX0xJTkVfXykKKyNkZWZpbmUJVFJBQ0VfRlJFRShzLGEsYix4LGYpCVwKKwl4ZnNfYWxsb2NfdHJhY2VfZnJlZShmbmFtZSwgcywgbXAsIGEsIGIsIHgsIGYsIF9fTElORV9fKQorI2RlZmluZQlUUkFDRV9NT0RBR0YocyxhLGYpCVwKKwl4ZnNfYWxsb2NfdHJhY2VfbW9kYWdmKGZuYW1lLCBzLCBtcCwgYSwgZiwgX19MSU5FX18pCisjZGVmaW5lCVRSQUNFX0JVU1koZm5hbWUscyxhZyxhZ2IsbCxzbCx0cCkJXAorCXhmc19hbGxvY190cmFjZV9idXN5KGZuYW1lLCBzLCBtcCwgYWcsIGFnYiwgbCwgc2wsIHRwLCBYRlNfQUxMT0NfS1RSQUNFX0JVU1ksIF9fTElORV9fKQorI2RlZmluZQlUUkFDRV9VTkJVU1koZm5hbWUscyxhZyxzbCx0cCkJXAorCXhmc19hbGxvY190cmFjZV9idXN5KGZuYW1lLCBzLCBtcCwgYWcsIC0xLCAtMSwgc2wsIHRwLCBYRlNfQUxMT0NfS1RSQUNFX1VOQlVTWSwgX19MSU5FX18pCisjZGVmaW5lCVRSQUNFX0JVU1lTRUFSQ0goZm5hbWUscyxhZyxhZ2IsbCxzbCx0cCkJXAorCXhmc19hbGxvY190cmFjZV9idXN5KGZuYW1lLCBzLCBtcCwgYWcsIGFnYiwgbCwgc2wsIHRwLCBYRlNfQUxMT0NfS1RSQUNFX0JVU1lTRUFSQ0gsIF9fTElORV9fKQorI2Vsc2UKKyNkZWZpbmUJVFJBQ0VfQUxMT0MocyxhKQorI2RlZmluZQlUUkFDRV9GUkVFKHMsYSxiLHgsZikKKyNkZWZpbmUJVFJBQ0VfTU9EQUdGKHMsYSxmKQorI2RlZmluZQlUUkFDRV9CVVNZKHMsYSxhZyxhZ2IsbCxzbCx0cCkKKyNkZWZpbmUJVFJBQ0VfVU5CVVNZKGZuYW1lLHMsYWcsc2wsdHApCisjZGVmaW5lCVRSQUNFX0JVU1lTRUFSQ0goZm5hbWUscyxhZyxhZ2IsbCxzbCx0cCkKKyNlbmRpZgkvKiBYRlNfQUxMT0NfVFJBQ0UgKi8KKworLyoKKyAqIFByb3RvdHlwZXMgZm9yIHBlci1hZyBhbGxvY2F0aW9uIHJvdXRpbmVzCisgKi8KKworU1RBVElDIGludCB4ZnNfYWxsb2NfYWdfdmV4dGVudF9leGFjdCh4ZnNfYWxsb2NfYXJnX3QgKik7CitTVEFUSUMgaW50IHhmc19hbGxvY19hZ192ZXh0ZW50X25lYXIoeGZzX2FsbG9jX2FyZ190ICopOworU1RBVElDIGludCB4ZnNfYWxsb2NfYWdfdmV4dGVudF9zaXplKHhmc19hbGxvY19hcmdfdCAqKTsKK1NUQVRJQyBpbnQgeGZzX2FsbG9jX2FnX3ZleHRlbnRfc21hbGwoeGZzX2FsbG9jX2FyZ190ICosCisJeGZzX2J0cmVlX2N1cl90ICosIHhmc19hZ2Jsb2NrX3QgKiwgeGZzX2V4dGxlbl90ICosIGludCAqKTsKKworLyoKKyAqIEludGVybmFsIGZ1bmN0aW9ucy4KKyAqLworCisvKgorICogQ29tcHV0ZSBhbGlnbmVkIHZlcnNpb24gb2YgdGhlIGZvdW5kIGV4dGVudC4KKyAqIFRha2VzIGFsaWdubWVudCBhbmQgbWluIGxlbmd0aCBpbnRvIGFjY291bnQuCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogc3VjY2VzcyAoPj0gbWlubGVuKSAqLworeGZzX2FsbG9jX2NvbXB1dGVfYWxpZ25lZCgKKwl4ZnNfYWdibG9ja190CWZvdW5kYm5vLAkvKiBzdGFydGluZyBibG9jayBpbiBmb3VuZCBleHRlbnQgKi8KKwl4ZnNfZXh0bGVuX3QJZm91bmRsZW4sCS8qIGxlbmd0aCBpbiBmb3VuZCBleHRlbnQgKi8KKwl4ZnNfZXh0bGVuX3QJYWxpZ25tZW50LAkvKiBhbGlnbm1lbnQgZm9yIGFsbG9jYXRpb24gKi8KKwl4ZnNfZXh0bGVuX3QJbWlubGVuLAkJLyogbWluaW11bSBsZW5ndGggZm9yIGFsbG9jYXRpb24gKi8KKwl4ZnNfYWdibG9ja190CSpyZXNibm8sCS8qIHJlc3VsdCBibG9jayBudW1iZXIgKi8KKwl4ZnNfZXh0bGVuX3QJKnJlc2xlbikJLyogcmVzdWx0IGxlbmd0aCAqLworeworCXhmc19hZ2Jsb2NrX3QJYm5vOworCXhmc19leHRsZW5fdAlkaWZmOworCXhmc19leHRsZW5fdAlsZW47CisKKwlpZiAoYWxpZ25tZW50ID4gMSAmJiBmb3VuZGxlbiA+PSBtaW5sZW4pIHsKKwkJYm5vID0gcm91bmR1cChmb3VuZGJubywgYWxpZ25tZW50KTsKKwkJZGlmZiA9IGJubyAtIGZvdW5kYm5vOworCQlsZW4gPSBkaWZmID49IGZvdW5kbGVuID8gMCA6IGZvdW5kbGVuIC0gZGlmZjsKKwl9IGVsc2UgeworCQlibm8gPSBmb3VuZGJubzsKKwkJbGVuID0gZm91bmRsZW47CisJfQorCSpyZXNibm8gPSBibm87CisJKnJlc2xlbiA9IGxlbjsKKwlyZXR1cm4gbGVuID49IG1pbmxlbjsKK30KKworLyoKKyAqIENvbXB1dGUgYmVzdCBzdGFydCBibG9jayBhbmQgZGlmZiBmb3IgIm5lYXIiIGFsbG9jYXRpb25zLgorICogZnJlZWxlbiA+PSB3YW50bGVuIGFscmVhZHkgY2hlY2tlZCBieSBjYWxsZXIuCisgKi8KK1NUQVRJQyB4ZnNfZXh0bGVuX3QJCQkvKiBkaWZmZXJlbmNlIHZhbHVlIChhYnNvbHV0ZSkgKi8KK3hmc19hbGxvY19jb21wdXRlX2RpZmYoCisJeGZzX2FnYmxvY2tfdAl3YW50Ym5vLAkvKiB0YXJnZXQgc3RhcnRpbmcgYmxvY2sgKi8KKwl4ZnNfZXh0bGVuX3QJd2FudGxlbiwJLyogdGFyZ2V0IGxlbmd0aCAqLworCXhmc19leHRsZW5fdAlhbGlnbm1lbnQsCS8qIHRhcmdldCBhbGlnbm1lbnQgKi8KKwl4ZnNfYWdibG9ja190CWZyZWVibm8sCS8qIGZyZWVzcGFjZSdzIHN0YXJ0aW5nIGJsb2NrICovCisJeGZzX2V4dGxlbl90CWZyZWVsZW4sCS8qIGZyZWVzcGFjZSdzIGxlbmd0aCAqLworCXhmc19hZ2Jsb2NrX3QJKm5ld2Jub3ApCS8qIHJlc3VsdDogYmVzdCBzdGFydCBibG9jayBmcm9tIGZyZWUgKi8KK3sKKwl4ZnNfYWdibG9ja190CWZyZWVlbmQ7CS8qIGVuZCBvZiBmcmVlc3BhY2UgZXh0ZW50ICovCisJeGZzX2FnYmxvY2tfdAluZXdibm8xOwkvKiByZXR1cm4gYmxvY2sgbnVtYmVyICovCisJeGZzX2FnYmxvY2tfdAluZXdibm8yOwkvKiBvdGhlciBuZXcgYmxvY2sgbnVtYmVyICovCisJeGZzX2V4dGxlbl90CW5ld2xlbjE9MDsJLyogbGVuZ3RoIHdpdGggbmV3Ym5vMSAqLworCXhmc19leHRsZW5fdAluZXdsZW4yPTA7CS8qIGxlbmd0aCB3aXRoIG5ld2JubzIgKi8KKwl4ZnNfYWdibG9ja190CXdhbnRlbmQ7CS8qIGVuZCBvZiB0YXJnZXQgZXh0ZW50ICovCisKKwlBU1NFUlQoZnJlZWxlbiA+PSB3YW50bGVuKTsKKwlmcmVlZW5kID0gZnJlZWJubyArIGZyZWVsZW47CisJd2FudGVuZCA9IHdhbnRibm8gKyB3YW50bGVuOworCWlmIChmcmVlYm5vID49IHdhbnRibm8pIHsKKwkJaWYgKChuZXdibm8xID0gcm91bmR1cChmcmVlYm5vLCBhbGlnbm1lbnQpKSA+PSBmcmVlZW5kKQorCQkJbmV3Ym5vMSA9IE5VTExBR0JMT0NLOworCX0gZWxzZSBpZiAoZnJlZWVuZCA+PSB3YW50ZW5kICYmIGFsaWdubWVudCA+IDEpIHsKKwkJbmV3Ym5vMSA9IHJvdW5kdXAod2FudGJubywgYWxpZ25tZW50KTsKKwkJbmV3Ym5vMiA9IG5ld2JubzEgLSBhbGlnbm1lbnQ7CisJCWlmIChuZXdibm8xID49IGZyZWVlbmQpCisJCQluZXdibm8xID0gTlVMTEFHQkxPQ0s7CisJCWVsc2UKKwkJCW5ld2xlbjEgPSBYRlNfRVhUTEVOX01JTih3YW50bGVuLCBmcmVlZW5kIC0gbmV3Ym5vMSk7CisJCWlmIChuZXdibm8yIDwgZnJlZWJubykKKwkJCW5ld2JubzIgPSBOVUxMQUdCTE9DSzsKKwkJZWxzZQorCQkJbmV3bGVuMiA9IFhGU19FWFRMRU5fTUlOKHdhbnRsZW4sIGZyZWVlbmQgLSBuZXdibm8yKTsKKwkJaWYgKG5ld2JubzEgIT0gTlVMTEFHQkxPQ0sgJiYgbmV3Ym5vMiAhPSBOVUxMQUdCTE9DSykgeworCQkJaWYgKG5ld2xlbjEgPCBuZXdsZW4yIHx8CisJCQkgICAgKG5ld2xlbjEgPT0gbmV3bGVuMiAmJgorCQkJICAgICBYRlNfQUJTRElGRihuZXdibm8xLCB3YW50Ym5vKSA+CisJCQkgICAgIFhGU19BQlNESUZGKG5ld2JubzIsIHdhbnRibm8pKSkKKwkJCQluZXdibm8xID0gbmV3Ym5vMjsKKwkJfSBlbHNlIGlmIChuZXdibm8yICE9IE5VTExBR0JMT0NLKQorCQkJbmV3Ym5vMSA9IG5ld2JubzI7CisJfSBlbHNlIGlmIChmcmVlZW5kID49IHdhbnRlbmQpIHsKKwkJbmV3Ym5vMSA9IHdhbnRibm87CisJfSBlbHNlIGlmIChhbGlnbm1lbnQgPiAxKSB7CisJCW5ld2JubzEgPSByb3VuZHVwKGZyZWVlbmQgLSB3YW50bGVuLCBhbGlnbm1lbnQpOworCQlpZiAobmV3Ym5vMSA+IGZyZWVlbmQgLSB3YW50bGVuICYmCisJCSAgICBuZXdibm8xIC0gYWxpZ25tZW50ID49IGZyZWVibm8pCisJCQluZXdibm8xIC09IGFsaWdubWVudDsKKwkJZWxzZSBpZiAobmV3Ym5vMSA+PSBmcmVlZW5kKQorCQkJbmV3Ym5vMSA9IE5VTExBR0JMT0NLOworCX0gZWxzZQorCQluZXdibm8xID0gZnJlZWVuZCAtIHdhbnRsZW47CisJKm5ld2Jub3AgPSBuZXdibm8xOworCXJldHVybiBuZXdibm8xID09IE5VTExBR0JMT0NLID8gMCA6IFhGU19BQlNESUZGKG5ld2JubzEsIHdhbnRibm8pOworfQorCisvKgorICogRml4IHVwIHRoZSBsZW5ndGgsIGJhc2VkIG9uIG1vZCBhbmQgcHJvZC4KKyAqIGxlbiBzaG91bGQgYmUgayAqIHByb2QgKyBtb2QgZm9yIHNvbWUgay4KKyAqIElmIGxlbiBpcyB0b28gc21hbGwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgorICogSWYgbGVuIGhpdHMgbWF4bGVuIGl0IGlzIGxlZnQgYWxvbmUuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYWxsb2NfZml4X2xlbigKKwl4ZnNfYWxsb2NfYXJnX3QJKmFyZ3MpCQkvKiBhbGxvY2F0aW9uIGFyZ3VtZW50IHN0cnVjdHVyZSAqLworeworCXhmc19leHRsZW5fdAlrOworCXhmc19leHRsZW5fdAlybGVuOworCisJQVNTRVJUKGFyZ3MtPm1vZCA8IGFyZ3MtPnByb2QpOworCXJsZW4gPSBhcmdzLT5sZW47CisJQVNTRVJUKHJsZW4gPj0gYXJncy0+bWlubGVuKTsKKwlBU1NFUlQocmxlbiA8PSBhcmdzLT5tYXhsZW4pOworCWlmIChhcmdzLT5wcm9kIDw9IDEgfHwgcmxlbiA8IGFyZ3MtPm1vZCB8fCBybGVuID09IGFyZ3MtPm1heGxlbiB8fAorCSAgICAoYXJncy0+bW9kID09IDAgJiYgcmxlbiA8IGFyZ3MtPnByb2QpKQorCQlyZXR1cm47CisJayA9IHJsZW4gJSBhcmdzLT5wcm9kOworCWlmIChrID09IGFyZ3MtPm1vZCkKKwkJcmV0dXJuOworCWlmIChrID4gYXJncy0+bW9kKSB7CisJCWlmICgoaW50KShybGVuID0gcmxlbiAtIGsgLSBhcmdzLT5tb2QpIDwgKGludClhcmdzLT5taW5sZW4pCisJCQlyZXR1cm47CisJfSBlbHNlIHsKKwkJaWYgKChpbnQpKHJsZW4gPSBybGVuIC0gYXJncy0+cHJvZCAtIChhcmdzLT5tb2QgLSBrKSkgPAorCQkgICAgKGludClhcmdzLT5taW5sZW4pCisJCQlyZXR1cm47CisJfQorCUFTU0VSVChybGVuID49IGFyZ3MtPm1pbmxlbik7CisJQVNTRVJUKHJsZW4gPD0gYXJncy0+bWF4bGVuKTsKKwlhcmdzLT5sZW4gPSBybGVuOworfQorCisvKgorICogRml4IHVwIGxlbmd0aCBpZiB0aGVyZSBpcyB0b28gbGl0dGxlIHNwYWNlIGxlZnQgaW4gdGhlIGEuZy4KKyAqIFJldHVybiAxIGlmIG9rLCAwIGlmIHRvbyBsaXR0bGUsIHNob3VsZCBnaXZlIHVwLgorICovCitTVEFUSUMgaW50Cit4ZnNfYWxsb2NfZml4X21pbmxlZnQoCisJeGZzX2FsbG9jX2FyZ190CSphcmdzKQkJLyogYWxsb2NhdGlvbiBhcmd1bWVudCBzdHJ1Y3R1cmUgKi8KK3sKKwl4ZnNfYWdmX3QJKmFnZjsJCS8qIGEuZy4gZnJlZWxpc3QgaGVhZGVyICovCisJaW50CQlkaWZmOwkJLyogZnJlZSBzcGFjZSBkaWZmZXJlbmNlICovCisKKwlpZiAoYXJncy0+bWlubGVmdCA9PSAwKQorCQlyZXR1cm4gMTsKKwlhZ2YgPSBYRlNfQlVGX1RPX0FHRihhcmdzLT5hZ2JwKTsKKwlkaWZmID0gSU5UX0dFVChhZ2YtPmFnZl9mcmVlYmxrcywgQVJDSF9DT05WRVJUKQorCQkrIElOVF9HRVQoYWdmLT5hZ2ZfZmxjb3VudCwgQVJDSF9DT05WRVJUKQorCQktIGFyZ3MtPmxlbiAtIGFyZ3MtPm1pbmxlZnQ7CisJaWYgKGRpZmYgPj0gMCkKKwkJcmV0dXJuIDE7CisJYXJncy0+bGVuICs9IGRpZmY7CQkvKiBzaHJpbmsgdGhlIGFsbG9jYXRlZCBzcGFjZSAqLworCWlmIChhcmdzLT5sZW4gPj0gYXJncy0+bWlubGVuKQorCQlyZXR1cm4gMTsKKwlhcmdzLT5hZ2JubyA9IE5VTExBR0JMT0NLOworCXJldHVybiAwOworfQorCisvKgorICogVXBkYXRlIHRoZSB0d28gYnRyZWVzLCBsb2dpY2FsbHkgcmVtb3ZpbmcgZnJvbSBmcmVlc3BhY2UgdGhlIGV4dGVudAorICogc3RhcnRpbmcgYXQgcmJubywgcmxlbiBibG9ja3MuICBUaGUgZXh0ZW50IGlzIGNvbnRhaW5lZCB3aXRoaW4gdGhlCisgKiBhY3R1YWwgKGN1cnJlbnQpIGZyZWUgZXh0ZW50IGZibm8gZm9yIGZsZW4gYmxvY2tzLgorICogRmxhZ3MgYXJlIHBhc3NlZCBpbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGN1cnNvcnMgYXJlIHNldCB0byB0aGUKKyAqIHJlbGV2YW50IHJlY29yZHMuCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgY29kZSAqLworeGZzX2FsbG9jX2ZpeHVwX3RyZWVzKAorCXhmc19idHJlZV9jdXJfdAkqY250X2N1ciwJLyogY3Vyc29yIGZvciBieS1zaXplIGJ0cmVlICovCisJeGZzX2J0cmVlX2N1cl90CSpibm9fY3VyLAkvKiBjdXJzb3IgZm9yIGJ5LWJsb2NrIGJ0cmVlICovCisJeGZzX2FnYmxvY2tfdAlmYm5vLAkJLyogc3RhcnRpbmcgYmxvY2sgb2YgZnJlZSBleHRlbnQgKi8KKwl4ZnNfZXh0bGVuX3QJZmxlbiwJCS8qIGxlbmd0aCBvZiBmcmVlIGV4dGVudCAqLworCXhmc19hZ2Jsb2NrX3QJcmJubywJCS8qIHN0YXJ0aW5nIGJsb2NrIG9mIHJldHVybmVkIGV4dGVudCAqLworCXhmc19leHRsZW5fdAlybGVuLAkJLyogbGVuZ3RoIG9mIHJldHVybmVkIGV4dGVudCAqLworCWludAkJZmxhZ3MpCQkvKiBmbGFncywgWEZTQV9GSVhVUF8uLi4gKi8KK3sKKwlpbnQJCWVycm9yOwkJLyogZXJyb3IgY29kZSAqLworCWludAkJaTsJCS8qIG9wZXJhdGlvbiByZXN1bHRzICovCisJeGZzX2FnYmxvY2tfdAluZmJubzE7CQkvKiBmaXJzdCBuZXcgZnJlZSBzdGFydGJsb2NrICovCisJeGZzX2FnYmxvY2tfdAluZmJubzI7CQkvKiBzZWNvbmQgbmV3IGZyZWUgc3RhcnRibG9jayAqLworCXhmc19leHRsZW5fdAluZmxlbjE9MDsJLyogZmlyc3QgbmV3IGZyZWUgbGVuZ3RoICovCisJeGZzX2V4dGxlbl90CW5mbGVuMj0wOwkvKiBzZWNvbmQgbmV3IGZyZWUgbGVuZ3RoICovCisKKwkvKgorCSAqIExvb2sgdXAgdGhlIHJlY29yZCBpbiB0aGUgYnktc2l6ZSB0cmVlIGlmIG5lY2Vzc2FyeS4KKwkgKi8KKwlpZiAoZmxhZ3MgJiBYRlNBX0ZJWFVQX0NOVF9PSykgeworI2lmZGVmIERFQlVHCisJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfZ2V0X3JlYyhjbnRfY3VyLCAmbmZibm8xLCAmbmZsZW4xLCAmaSkpKQorCQkJcmV0dXJuIGVycm9yOworCQlYRlNfV0FOVF9DT1JSVVBURURfUkVUVVJOKAorCQkJaSA9PSAxICYmIG5mYm5vMSA9PSBmYm5vICYmIG5mbGVuMSA9PSBmbGVuKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfbG9va3VwX2VxKGNudF9jdXIsIGZibm8sIGZsZW4sICZpKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCVhGU19XQU5UX0NPUlJVUFRFRF9SRVRVUk4oaSA9PSAxKTsKKwl9CisJLyoKKwkgKiBMb29rIHVwIHRoZSByZWNvcmQgaW4gdGhlIGJ5LWJsb2NrIHRyZWUgaWYgbmVjZXNzYXJ5LgorCSAqLworCWlmIChmbGFncyAmIFhGU0FfRklYVVBfQk5PX09LKSB7CisjaWZkZWYgREVCVUcKKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19nZXRfcmVjKGJub19jdXIsICZuZmJubzEsICZuZmxlbjEsICZpKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCVhGU19XQU5UX0NPUlJVUFRFRF9SRVRVUk4oCisJCQlpID09IDEgJiYgbmZibm8xID09IGZibm8gJiYgbmZsZW4xID09IGZsZW4pOworI2VuZGlmCisJfSBlbHNlIHsKKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19sb29rdXBfZXEoYm5vX2N1ciwgZmJubywgZmxlbiwgJmkpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJWEZTX1dBTlRfQ09SUlVQVEVEX1JFVFVSTihpID09IDEpOworCX0KKyNpZmRlZiBERUJVRworCXsKKwkJeGZzX2FsbG9jX2Jsb2NrX3QJKmJub2Jsb2NrOworCQl4ZnNfYWxsb2NfYmxvY2tfdAkqY250YmxvY2s7CisKKwkJaWYgKGJub19jdXItPmJjX25sZXZlbHMgPT0gMSAmJgorCQkgICAgY250X2N1ci0+YmNfbmxldmVscyA9PSAxKSB7CisJCQlibm9ibG9jayA9IFhGU19CVUZfVE9fQUxMT0NfQkxPQ0soYm5vX2N1ci0+YmNfYnVmc1swXSk7CisJCQljbnRibG9jayA9IFhGU19CVUZfVE9fQUxMT0NfQkxPQ0soY250X2N1ci0+YmNfYnVmc1swXSk7CisJCQlYRlNfV0FOVF9DT1JSVVBURURfUkVUVVJOKAorCQkJCUlOVF9HRVQoYm5vYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgPT0gSU5UX0dFVChjbnRibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSk7CisJCX0KKwl9CisjZW5kaWYKKwkvKgorCSAqIERlYWwgd2l0aCBhbGwgZm91ciBjYXNlczogdGhlIGFsbG9jYXRlZCByZWNvcmQgaXMgY29udGFpbmVkCisJICogd2l0aGluIHRoZSBmcmVlc3BhY2UgcmVjb3JkLCBzbyB3ZSBjYW4gaGF2ZSBuZXcgZnJlZXNwYWNlCisJICogYXQgZWl0aGVyIChvciBib3RoKSBlbmQsIG9yIG5vIGZyZWVzcGFjZSByZW1haW5pbmcuCisJICovCisJaWYgKHJibm8gPT0gZmJubyAmJiBybGVuID09IGZsZW4pCisJCW5mYm5vMSA9IG5mYm5vMiA9IE5VTExBR0JMT0NLOworCWVsc2UgaWYgKHJibm8gPT0gZmJubykgeworCQluZmJubzEgPSByYm5vICsgcmxlbjsKKwkJbmZsZW4xID0gZmxlbiAtIHJsZW47CisJCW5mYm5vMiA9IE5VTExBR0JMT0NLOworCX0gZWxzZSBpZiAocmJubyArIHJsZW4gPT0gZmJubyArIGZsZW4pIHsKKwkJbmZibm8xID0gZmJubzsKKwkJbmZsZW4xID0gZmxlbiAtIHJsZW47CisJCW5mYm5vMiA9IE5VTExBR0JMT0NLOworCX0gZWxzZSB7CisJCW5mYm5vMSA9IGZibm87CisJCW5mbGVuMSA9IHJibm8gLSBmYm5vOworCQluZmJubzIgPSByYm5vICsgcmxlbjsKKwkJbmZsZW4yID0gKGZibm8gKyBmbGVuKSAtIG5mYm5vMjsKKwl9CisJLyoKKwkgKiBEZWxldGUgdGhlIGVudHJ5IGZyb20gdGhlIGJ5LXNpemUgYnRyZWUuCisJICovCisJaWYgKChlcnJvciA9IHhmc19hbGxvY19kZWxldGUoY250X2N1ciwgJmkpKSkKKwkJcmV0dXJuIGVycm9yOworCVhGU19XQU5UX0NPUlJVUFRFRF9SRVRVUk4oaSA9PSAxKTsKKwkvKgorCSAqIEFkZCBuZXcgYnktc2l6ZSBidHJlZSBlbnRyeShzKS4KKwkgKi8KKwlpZiAobmZibm8xICE9IE5VTExBR0JMT0NLKSB7CisJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfbG9va3VwX2VxKGNudF9jdXIsIG5mYm5vMSwgbmZsZW4xLCAmaSkpKQorCQkJcmV0dXJuIGVycm9yOworCQlYRlNfV0FOVF9DT1JSVVBURURfUkVUVVJOKGkgPT0gMCk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfaW5zZXJ0KGNudF9jdXIsICZpKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCVhGU19XQU5UX0NPUlJVUFRFRF9SRVRVUk4oaSA9PSAxKTsKKwl9CisJaWYgKG5mYm5vMiAhPSBOVUxMQUdCTE9DSykgeworCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2xvb2t1cF9lcShjbnRfY3VyLCBuZmJubzIsIG5mbGVuMiwgJmkpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJWEZTX1dBTlRfQ09SUlVQVEVEX1JFVFVSTihpID09IDApOworCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2luc2VydChjbnRfY3VyLCAmaSkpKQorCQkJcmV0dXJuIGVycm9yOworCQlYRlNfV0FOVF9DT1JSVVBURURfUkVUVVJOKGkgPT0gMSk7CisJfQorCS8qCisJICogRml4IHVwIHRoZSBieS1ibG9jayBidHJlZSBlbnRyeShzKS4KKwkgKi8KKwlpZiAobmZibm8xID09IE5VTExBR0JMT0NLKSB7CisJCS8qCisJCSAqIE5vIHJlbWFpbmluZyBmcmVlc3BhY2UsIGp1c3QgZGVsZXRlIHRoZSBieS1ibG9jayB0cmVlIGVudHJ5LgorCQkgKi8KKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19kZWxldGUoYm5vX2N1ciwgJmkpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJWEZTX1dBTlRfQ09SUlVQVEVEX1JFVFVSTihpID09IDEpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFVwZGF0ZSB0aGUgYnktYmxvY2sgZW50cnkgdG8gc3RhcnQgbGF0ZXJ8YmUgc2hvcnRlci4KKwkJICovCisJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfdXBkYXRlKGJub19jdXIsIG5mYm5vMSwgbmZsZW4xKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJfQorCWlmIChuZmJubzIgIT0gTlVMTEFHQkxPQ0spIHsKKwkJLyoKKwkJICogMiByZXN1bHRpbmcgZnJlZSBlbnRyaWVzLCBuZWVkIHRvIGFkZCBvbmUuCisJCSAqLworCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2xvb2t1cF9lcShibm9fY3VyLCBuZmJubzIsIG5mbGVuMiwgJmkpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJWEZTX1dBTlRfQ09SUlVQVEVEX1JFVFVSTihpID09IDApOworCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2luc2VydChibm9fY3VyLCAmaSkpKQorCQkJcmV0dXJuIGVycm9yOworCQlYRlNfV0FOVF9DT1JSVVBURURfUkVUVVJOKGkgPT0gMSk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogUmVhZCBpbiB0aGUgYWxsb2NhdGlvbiBncm91cCBmcmVlIGJsb2NrIGFycmF5LgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfYWxsb2NfcmVhZF9hZ2ZsKAorCXhmc19tb3VudF90CSptcCwJCS8qIG1vdW50IHBvaW50IHN0cnVjdHVyZSAqLworCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfYWdudW1iZXJfdAlhZ25vLAkJLyogYWxsb2NhdGlvbiBncm91cCBudW1iZXIgKi8KKwl4ZnNfYnVmX3QJKipicHApCQkvKiBidWZmZXIgZm9yIHRoZSBhZyBmcmVlIGJsb2NrIGFycmF5ICovCit7CisJeGZzX2J1Zl90CSpicDsJCS8qIHJldHVybiB2YWx1ZSAqLworCWludAkJZXJyb3I7CisKKwlBU1NFUlQoYWdubyAhPSBOVUxMQUdOVU1CRVIpOworCWVycm9yID0geGZzX3RyYW5zX3JlYWRfYnVmKAorCQkJbXAsIHRwLCBtcC0+bV9kZGV2X3RhcmdwLAorCQkJWEZTX0FHX0RBRERSKG1wLCBhZ25vLCBYRlNfQUdGTF9EQUREUihtcCkpLAorCQkJWEZTX0ZTU19UT19CQihtcCwgMSksIDAsICZicCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJQVNTRVJUKGJwKTsKKwlBU1NFUlQoIVhGU19CVUZfR0VURVJST1IoYnApKTsKKwlYRlNfQlVGX1NFVF9WVFlQRV9SRUYoYnAsIEJfRlNfQUdGTCwgWEZTX0FHRkxfUkVGKTsKKwkqYnBwID0gYnA7CisJcmV0dXJuIDA7Cit9CisKKyNpZiBkZWZpbmVkKFhGU19BTExPQ19UUkFDRSkKKy8qCisgKiBBZGQgYW4gYWxsb2NhdGlvbiB0cmFjZSBlbnRyeSBmb3IgYW4gYWxsb2MgY2FsbC4KKyAqLworU1RBVElDIHZvaWQKK3hmc19hbGxvY190cmFjZV9hbGxvYygKKwljaGFyCQkqbmFtZSwJCS8qIGZ1bmN0aW9uIHRhZyBzdHJpbmcgKi8KKwljaGFyCQkqc3RyLAkJLyogYWRkaXRpb25hbCBzdHJpbmcgKi8KKwl4ZnNfYWxsb2NfYXJnX3QJKmFyZ3MsCQkvKiBhbGxvY2F0aW9uIGFyZ3VtZW50IHN0cnVjdHVyZSAqLworCWludAkJbGluZSkJCS8qIHNvdXJjZSBsaW5lIG51bWJlciAqLworeworCWt0cmFjZV9lbnRlcih4ZnNfYWxsb2NfdHJhY2VfYnVmLAorCQkodm9pZCAqKShfX3BzaW50X3QpKFhGU19BTExPQ19LVFJBQ0VfQUxMT0MgfCAobGluZSA8PCAxNikpLAorCQkodm9pZCAqKW5hbWUsCisJCSh2b2lkICopc3RyLAorCQkodm9pZCAqKWFyZ3MtPm1wLAorCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdClhcmdzLT5hZ25vLAorCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdClhcmdzLT5hZ2JubywKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpYXJncy0+bWlubGVuLAorCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdClhcmdzLT5tYXhsZW4sCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KWFyZ3MtPm1vZCwKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpYXJncy0+cHJvZCwKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpYXJncy0+bWlubGVmdCwKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpYXJncy0+dG90YWwsCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KWFyZ3MtPmFsaWdubWVudCwKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpYXJncy0+bGVuLAorCQkodm9pZCAqKSgoKChfX3BzaW50X3QpYXJncy0+dHlwZSkgPDwgMTYpIHwKKwkJCSAoX19wc2ludF90KWFyZ3MtPm90eXBlKSwKKwkJKHZvaWQgKikoX19wc2ludF90KSgoYXJncy0+d2FzZGVsIDw8IDMpIHwKKwkJCQkgICAgKGFyZ3MtPndhc2Zyb21mbCA8PCAyKSB8CisJCQkJICAgIChhcmdzLT5pc2ZsIDw8IDEpIHwKKwkJCQkgICAgKGFyZ3MtPnVzZXJkYXRhIDw8IDApKSk7Cit9CisKKy8qCisgKiBBZGQgYW4gYWxsb2NhdGlvbiB0cmFjZSBlbnRyeSBmb3IgYSBmcmVlIGNhbGwuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYWxsb2NfdHJhY2VfZnJlZSgKKwljaGFyCQkqbmFtZSwJCS8qIGZ1bmN0aW9uIHRhZyBzdHJpbmcgKi8KKwljaGFyCQkqc3RyLAkJLyogYWRkaXRpb25hbCBzdHJpbmcgKi8KKwl4ZnNfbW91bnRfdAkqbXAsCQkvKiBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc19hZ251bWJlcl90CWFnbm8sCQkvKiBhbGxvY2F0aW9uIGdyb3VwIG51bWJlciAqLworCXhmc19hZ2Jsb2NrX3QJYWdibm8sCQkvKiBhLmcuIHJlbGF0aXZlIGJsb2NrIG51bWJlciAqLworCXhmc19leHRsZW5fdAlsZW4sCQkvKiBsZW5ndGggb2YgZXh0ZW50ICovCisJaW50CQlpc2ZsLAkJLyogc2V0IGlmIGlzIGZyZWVsaXN0IGFsbG9jYXRpb24vZnJlZSAqLworCWludAkJbGluZSkJCS8qIHNvdXJjZSBsaW5lIG51bWJlciAqLworeworCWt0cmFjZV9lbnRlcih4ZnNfYWxsb2NfdHJhY2VfYnVmLAorCQkodm9pZCAqKShfX3BzaW50X3QpKFhGU19BTExPQ19LVFJBQ0VfRlJFRSB8IChsaW5lIDw8IDE2KSksCisJCSh2b2lkICopbmFtZSwKKwkJKHZvaWQgKilzdHIsCisJCSh2b2lkICopbXAsCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KWFnbm8sCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KWFnYm5vLAorCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdClsZW4sCisJCSh2b2lkICopKF9fcHNpbnRfdClpc2ZsLAorCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKK30KKworLyoKKyAqIEFkZCBhbiBhbGxvY2F0aW9uIHRyYWNlIGVudHJ5IGZvciBtb2RpZnlpbmcgYW4gYWdmLgorICovCitTVEFUSUMgdm9pZAoreGZzX2FsbG9jX3RyYWNlX21vZGFnZigKKwljaGFyCQkqbmFtZSwJCS8qIGZ1bmN0aW9uIHRhZyBzdHJpbmcgKi8KKwljaGFyCQkqc3RyLAkJLyogYWRkaXRpb25hbCBzdHJpbmcgKi8KKwl4ZnNfbW91bnRfdAkqbXAsCQkvKiBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc19hZ2ZfdAkqYWdmLAkJLyogbmV3IGFnZiB2YWx1ZSAqLworCWludAkJZmxhZ3MsCQkvKiBsb2dnaW5nIGZsYWdzIGZvciBhZ2YgKi8KKwlpbnQJCWxpbmUpCQkvKiBzb3VyY2UgbGluZSBudW1iZXIgKi8KK3sKKwlrdHJhY2VfZW50ZXIoeGZzX2FsbG9jX3RyYWNlX2J1ZiwKKwkJKHZvaWQgKikoX19wc2ludF90KShYRlNfQUxMT0NfS1RSQUNFX01PREFHRiB8IChsaW5lIDw8IDE2KSksCisJCSh2b2lkICopbmFtZSwKKwkJKHZvaWQgKilzdHIsCisJCSh2b2lkICopbXAsCisJCSh2b2lkICopKF9fcHNpbnRfdClmbGFncywKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpSU5UX0dFVChhZ2YtPmFnZl9zZXFubywgQVJDSF9DT05WRVJUKSwKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpSU5UX0dFVChhZ2YtPmFnZl9sZW5ndGgsIEFSQ0hfQ09OVkVSVCksCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KUlOVF9HRVQoYWdmLT5hZ2Zfcm9vdHNbWEZTX0JUTlVNX0JOT10sCisJCQkJCQlBUkNIX0NPTlZFUlQpLAorCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdClJTlRfR0VUKGFnZi0+YWdmX3Jvb3RzW1hGU19CVE5VTV9DTlRdLAorCQkJCQkJQVJDSF9DT05WRVJUKSwKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpSU5UX0dFVChhZ2YtPmFnZl9sZXZlbHNbWEZTX0JUTlVNX0JOT10sCisJCQkJCQlBUkNIX0NPTlZFUlQpLAorCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdClJTlRfR0VUKGFnZi0+YWdmX2xldmVsc1tYRlNfQlROVU1fQ05UXSwKKwkJCQkJCUFSQ0hfQ09OVkVSVCksCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KUlOVF9HRVQoYWdmLT5hZ2ZfZmxmaXJzdCwgQVJDSF9DT05WRVJUKSwKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpSU5UX0dFVChhZ2YtPmFnZl9mbGxhc3QsIEFSQ0hfQ09OVkVSVCksCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KUlOVF9HRVQoYWdmLT5hZ2ZfZmxjb3VudCwgQVJDSF9DT05WRVJUKSwKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpSU5UX0dFVChhZ2YtPmFnZl9mcmVlYmxrcywgQVJDSF9DT05WRVJUKSwKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpSU5UX0dFVChhZ2YtPmFnZl9sb25nZXN0LCBBUkNIX0NPTlZFUlQpKTsKK30KKworU1RBVElDIHZvaWQKK3hmc19hbGxvY190cmFjZV9idXN5KAorCWNoYXIJCSpuYW1lLAkJLyogZnVuY3Rpb24gdGFnIHN0cmluZyAqLworCWNoYXIJCSpzdHIsCQkvKiBhZGRpdGlvbmFsIHN0cmluZyAqLworCXhmc19tb3VudF90CSptcCwJCS8qIGZpbGUgc3lzdGVtIG1vdW50IHBvaW5nICovCisJeGZzX2FnbnVtYmVyX3QJYWdubywJCS8qIGFsbG9jYXRpb24gZ3JvdXAgbnVtYmVyICovCisJeGZzX2FnYmxvY2tfdAlhZ2JubywJCS8qIGEuZy4gcmVsYXRpdmUgYmxvY2sgbnVtYmVyICovCisJeGZzX2V4dGxlbl90CWxlbiwJCS8qIGxlbmd0aCBvZiBleHRlbnQgKi8KKwlpbnQJCXNsb3QsCQkvKiBwZXJhZyBCdXN5IHNsb3QgKi8KKwl4ZnNfdHJhbnNfdAkqdHAsCisJaW50CQl0cnR5cGUsCQkvKiB0eXBlOiBhZGQsIGRlbGV0ZSwgc2VhcmNoICovCisJaW50CQlsaW5lKQkJLyogc291cmNlIGxpbmUgbnVtYmVyICovCit7CisJa3RyYWNlX2VudGVyKHhmc19hbGxvY190cmFjZV9idWYsCisJCSh2b2lkICopKF9fcHNpbnRfdCkodHJ0eXBlIHwgKGxpbmUgPDwgMTYpKSwKKwkJKHZvaWQgKiluYW1lLAorCQkodm9pZCAqKXN0ciwKKwkJKHZvaWQgKiltcCwKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpYWdubywKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpYWdibm8sCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KWxlbiwKKwkJKHZvaWQgKikoX19wc2ludF90KXNsb3QsCisJCSh2b2lkICopdHAsCisJCU5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworfQorI2VuZGlmCS8qIFhGU19BTExPQ19UUkFDRSAqLworCisvKgorICogQWxsb2NhdGlvbiBncm91cCBsZXZlbCBmdW5jdGlvbnMuCisgKi8KKworLyoKKyAqIEFsbG9jYXRlIGEgdmFyaWFibGUgZXh0ZW50IGluIHRoZSBhbGxvY2F0aW9uIGdyb3VwIGFnbm8uCisgKiBUeXBlIGFuZCBibm8gYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXJlIGluIHRoZSBhbGxvY2F0aW9uIGdyb3VwIHRoZQorICogZXh0ZW50IHdpbGwgc3RhcnQuCisgKiBFeHRlbnQncyBsZW5ndGggKHJldHVybmVkIGluICpsZW4pIHdpbGwgYmUgYmV0d2VlbiBtaW5sZW4gYW5kIG1heGxlbiwKKyAqIGFuZCBvZiB0aGUgZm9ybSBrICogcHJvZCArIG1vZCB1bmxlc3MgdGhlcmUncyBub3RoaW5nIHRoYXQgbGFyZ2UuCisgKiBSZXR1cm4gdGhlIHN0YXJ0aW5nIGEuZy4gYmxvY2ssIG9yIE5VTExBR0JMT0NLIGlmIHdlIGNhbid0IGRvIGl0LgorICovCitTVEFUSUMgaW50CQkJLyogZXJyb3IgKi8KK3hmc19hbGxvY19hZ192ZXh0ZW50KAorCXhmc19hbGxvY19hcmdfdAkqYXJncykJLyogYXJndW1lbnQgc3RydWN0dXJlIGZvciBhbGxvY2F0aW9uICovCit7CisJaW50CQllcnJvcj0wOworI2lmZGVmIFhGU19BTExPQ19UUkFDRQorCXN0YXRpYyBjaGFyCWZuYW1lW10gPSAieGZzX2FsbG9jX2FnX3ZleHRlbnQiOworI2VuZGlmCisKKwlBU1NFUlQoYXJncy0+bWlubGVuID4gMCk7CisJQVNTRVJUKGFyZ3MtPm1heGxlbiA+IDApOworCUFTU0VSVChhcmdzLT5taW5sZW4gPD0gYXJncy0+bWF4bGVuKTsKKwlBU1NFUlQoYXJncy0+bW9kIDwgYXJncy0+cHJvZCk7CisJQVNTRVJUKGFyZ3MtPmFsaWdubWVudCA+IDApOworCS8qCisJICogQnJhbmNoIHRvIGNvcnJlY3Qgcm91dGluZSBiYXNlZCBvbiB0aGUgdHlwZS4KKwkgKi8KKwlhcmdzLT53YXNmcm9tZmwgPSAwOworCXN3aXRjaCAoYXJncy0+dHlwZSkgeworCWNhc2UgWEZTX0FMTE9DVFlQRV9USElTX0FHOgorCQllcnJvciA9IHhmc19hbGxvY19hZ192ZXh0ZW50X3NpemUoYXJncyk7CisJCWJyZWFrOworCWNhc2UgWEZTX0FMTE9DVFlQRV9ORUFSX0JOTzoKKwkJZXJyb3IgPSB4ZnNfYWxsb2NfYWdfdmV4dGVudF9uZWFyKGFyZ3MpOworCQlicmVhazsKKwljYXNlIFhGU19BTExPQ1RZUEVfVEhJU19CTk86CisJCWVycm9yID0geGZzX2FsbG9jX2FnX3ZleHRlbnRfZXhhY3QoYXJncyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUFTU0VSVCgwKTsKKwkJLyogTk9UUkVBQ0hFRCAqLworCX0KKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwkvKgorCSAqIElmIHRoZSBhbGxvY2F0aW9uIHdvcmtlZCwgbmVlZCB0byBjaGFuZ2UgdGhlIGFnZiBzdHJ1Y3R1cmUKKwkgKiAoYW5kIGxvZyBpdCksIGFuZCB0aGUgc3VwZXJibG9jay4KKwkgKi8KKwlpZiAoYXJncy0+YWdibm8gIT0gTlVMTEFHQkxPQ0spIHsKKwkJeGZzX2FnZl90CSphZ2Y7CS8qIGFsbG9jYXRpb24gZ3JvdXAgZnJlZWxpc3QgaGVhZGVyICovCisjaWZkZWYgWEZTX0FMTE9DX1RSQUNFCisJCXhmc19tb3VudF90CSptcCA9IGFyZ3MtPm1wOworI2VuZGlmCisJCWxvbmcJCXNsZW4gPSAobG9uZylhcmdzLT5sZW47CisKKwkJQVNTRVJUKGFyZ3MtPmxlbiA+PSBhcmdzLT5taW5sZW4gJiYgYXJncy0+bGVuIDw9IGFyZ3MtPm1heGxlbik7CisJCUFTU0VSVCghKGFyZ3MtPndhc2Zyb21mbCkgfHwgIWFyZ3MtPmlzZmwpOworCQlBU1NFUlQoYXJncy0+YWdibm8gJSBhcmdzLT5hbGlnbm1lbnQgPT0gMCk7CisJCWlmICghKGFyZ3MtPndhc2Zyb21mbCkpIHsKKworCQkJYWdmID0gWEZTX0JVRl9UT19BR0YoYXJncy0+YWdicCk7CisJCQlJTlRfTU9EKGFnZi0+YWdmX2ZyZWVibGtzLCBBUkNIX0NPTlZFUlQsIC0oYXJncy0+bGVuKSk7CisJCQl4ZnNfdHJhbnNfYWdibG9ja3NfZGVsdGEoYXJncy0+dHAsCisJCQkJCQkgLSgobG9uZykoYXJncy0+bGVuKSkpOworCQkJYXJncy0+cGFnLT5wYWdmX2ZyZWVibGtzIC09IGFyZ3MtPmxlbjsKKwkJCUFTU0VSVChJTlRfR0VUKGFnZi0+YWdmX2ZyZWVibGtzLCBBUkNIX0NPTlZFUlQpCisJCQkJPD0gSU5UX0dFVChhZ2YtPmFnZl9sZW5ndGgsIEFSQ0hfQ09OVkVSVCkpOworCQkJVFJBQ0VfTU9EQUdGKE5VTEwsIGFnZiwgWEZTX0FHRl9GUkVFQkxLUyk7CisJCQl4ZnNfYWxsb2NfbG9nX2FnZihhcmdzLT50cCwgYXJncy0+YWdicCwKKwkJCQkJCVhGU19BR0ZfRlJFRUJMS1MpOworCQkJLyogc2VhcmNoIHRoZSBidXN5bGlzdCBmb3IgdGhlc2UgYmxvY2tzICovCisJCQl4ZnNfYWxsb2Nfc2VhcmNoX2J1c3koYXJncy0+dHAsIGFyZ3MtPmFnbm8sCisJCQkJCWFyZ3MtPmFnYm5vLCBhcmdzLT5sZW4pOworCQl9CisJCWlmICghYXJncy0+aXNmbCkKKwkJCXhmc190cmFuc19tb2Rfc2IoYXJncy0+dHAsCisJCQkJYXJncy0+d2FzZGVsID8gWEZTX1RSQU5TX1NCX1JFU19GREJMT0NLUyA6CisJCQkJCVhGU19UUkFOU19TQl9GREJMT0NLUywgLXNsZW4pOworCQlYRlNfU1RBVFNfSU5DKHhzX2FsbG9jeCk7CisJCVhGU19TVEFUU19BREQoeHNfYWxsb2NiLCBhcmdzLT5sZW4pOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEFsbG9jYXRlIGEgdmFyaWFibGUgZXh0ZW50IGF0IGV4YWN0bHkgYWduby9ibm8uCisgKiBFeHRlbnQncyBsZW5ndGggKHJldHVybmVkIGluICpsZW4pIHdpbGwgYmUgYmV0d2VlbiBtaW5sZW4gYW5kIG1heGxlbiwKKyAqIGFuZCBvZiB0aGUgZm9ybSBrICogcHJvZCArIG1vZCB1bmxlc3MgdGhlcmUncyBub3RoaW5nIHRoYXQgbGFyZ2UuCisgKiBSZXR1cm4gdGhlIHN0YXJ0aW5nIGEuZy4gYmxvY2sgKGJubyksIG9yIE5VTExBR0JMT0NLIGlmIHdlIGNhbid0IGRvIGl0LgorICovCitTVEFUSUMgaW50CQkJLyogZXJyb3IgKi8KK3hmc19hbGxvY19hZ192ZXh0ZW50X2V4YWN0KAorCXhmc19hbGxvY19hcmdfdAkqYXJncykJLyogYWxsb2NhdGlvbiBhcmd1bWVudCBzdHJ1Y3R1cmUgKi8KK3sKKwl4ZnNfYnRyZWVfY3VyX3QJKmJub19jdXI7LyogYnkgYmxvY2stbnVtYmVyIGJ0cmVlIGN1cnNvciAqLworCXhmc19idHJlZV9jdXJfdAkqY250X2N1cjsvKiBieSBjb3VudCBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfYWdibG9ja190CWVuZDsJLyogZW5kIG9mIGFsbG9jYXRlZCBleHRlbnQgKi8KKwlpbnQJCWVycm9yOworCXhmc19hZ2Jsb2NrX3QJZmJubzsJLyogc3RhcnQgYmxvY2sgb2YgZm91bmQgZXh0ZW50ICovCisJeGZzX2FnYmxvY2tfdAlmZW5kOwkvKiBlbmQgYmxvY2sgb2YgZm91bmQgZXh0ZW50ICovCisJeGZzX2V4dGxlbl90CWZsZW47CS8qIGxlbmd0aCBvZiBmb3VuZCBleHRlbnQgKi8KKyNpZmRlZiBYRlNfQUxMT0NfVFJBQ0UKKwlzdGF0aWMgY2hhcglmbmFtZVtdID0gInhmc19hbGxvY19hZ192ZXh0ZW50X2V4YWN0IjsKKyNlbmRpZgorCWludAkJaTsJLyogc3VjY2Vzcy9mYWlsdXJlIG9mIG9wZXJhdGlvbiAqLworCXhmc19hZ2Jsb2NrX3QJbWF4ZW5kOwkvKiBlbmQgb2YgbWF4aW1hbCBleHRlbnQgKi8KKwl4ZnNfYWdibG9ja190CW1pbmVuZDsJLyogZW5kIG9mIG1pbmltYWwgZXh0ZW50ICovCisJeGZzX2V4dGxlbl90CXJsZW47CS8qIGxlbmd0aCBvZiByZXR1cm5lZCBleHRlbnQgKi8KKworCUFTU0VSVChhcmdzLT5hbGlnbm1lbnQgPT0gMSk7CisJLyoKKwkgKiBBbGxvY2F0ZS9pbml0aWFsaXplIGEgY3Vyc29yIGZvciB0aGUgYnktbnVtYmVyIGZyZWVzcGFjZSBidHJlZS4KKwkgKi8KKwlibm9fY3VyID0geGZzX2J0cmVlX2luaXRfY3Vyc29yKGFyZ3MtPm1wLCBhcmdzLT50cCwgYXJncy0+YWdicCwKKwkJYXJncy0+YWdubywgWEZTX0JUTlVNX0JOTywgTlVMTCwgMCk7CisJLyoKKwkgKiBMb29rdXAgYm5vIGFuZCBtaW5sZW4gaW4gdGhlIGJ0cmVlIChtaW5sZW4gaXMgaXJyZWxldmFudCwgcmVhbGx5KS4KKwkgKiBMb29rIGZvciB0aGUgY2xvc2VzdCBmcmVlIGJsb2NrIDw9IGJubywgaXQgbXVzdCBjb250YWluIGJubworCSAqIGlmIGFueSBmcmVlIGJsb2NrIGRvZXMuCisJICovCisJaWYgKChlcnJvciA9IHhmc19hbGxvY19sb29rdXBfbGUoYm5vX2N1ciwgYXJncy0+YWdibm8sIGFyZ3MtPm1pbmxlbiwgJmkpKSkKKwkJZ290byBlcnJvcjA7CisJaWYgKCFpKSB7CisJCS8qCisJCSAqIERpZG4ndCBmaW5kIGl0LCByZXR1cm4gbnVsbC4KKwkJICovCisJCXhmc19idHJlZV9kZWxfY3Vyc29yKGJub19jdXIsIFhGU19CVFJFRV9OT0VSUk9SKTsKKwkJYXJncy0+YWdibm8gPSBOVUxMQUdCTE9DSzsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogR3JhYiB0aGUgZnJlZXNwYWNlIHJlY29yZC4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2FsbG9jX2dldF9yZWMoYm5vX2N1ciwgJmZibm8sICZmbGVuLCAmaSkpKQorCQlnb3RvIGVycm9yMDsKKwlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJQVNTRVJUKGZibm8gPD0gYXJncy0+YWdibm8pOworCW1pbmVuZCA9IGFyZ3MtPmFnYm5vICsgYXJncy0+bWlubGVuOworCW1heGVuZCA9IGFyZ3MtPmFnYm5vICsgYXJncy0+bWF4bGVuOworCWZlbmQgPSBmYm5vICsgZmxlbjsKKwkvKgorCSAqIEdpdmUgdXAgaWYgdGhlIGZyZWVzcGFjZSBpc24ndCBsb25nIGVub3VnaCBmb3IgdGhlIG1pbmltdW0gcmVxdWVzdC4KKwkgKi8KKwlpZiAoZmVuZCA8IG1pbmVuZCkgeworCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihibm9fY3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CisJCWFyZ3MtPmFnYm5vID0gTlVMTEFHQkxPQ0s7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIEVuZCBvZiBleHRlbnQgd2lsbCBiZSBzbWFsbGVyIG9mIHRoZSBmcmVlc3BhY2UgZW5kIGFuZCB0aGUKKwkgKiBtYXhpbWFsIHJlcXVlc3RlZCBlbmQuCisJICovCisJZW5kID0gWEZTX0FHQkxPQ0tfTUlOKGZlbmQsIG1heGVuZCk7CisJLyoKKwkgKiBGaXggdGhlIGxlbmd0aCBhY2NvcmRpbmcgdG8gbW9kIGFuZCBwcm9kIGlmIGdpdmVuLgorCSAqLworCWFyZ3MtPmxlbiA9IGVuZCAtIGFyZ3MtPmFnYm5vOworCXhmc19hbGxvY19maXhfbGVuKGFyZ3MpOworCWlmICgheGZzX2FsbG9jX2ZpeF9taW5sZWZ0KGFyZ3MpKSB7CisJCXhmc19idHJlZV9kZWxfY3Vyc29yKGJub19jdXIsIFhGU19CVFJFRV9OT0VSUk9SKTsKKwkJcmV0dXJuIDA7CisJfQorCXJsZW4gPSBhcmdzLT5sZW47CisJQVNTRVJUKGFyZ3MtPmFnYm5vICsgcmxlbiA8PSBmZW5kKTsKKwllbmQgPSBhcmdzLT5hZ2JubyArIHJsZW47CisJLyoKKwkgKiBXZSBhcmUgYWxsb2NhdGluZyBhZ2JubyBmb3IgcmxlbiBbYWdibm8gLi4gZW5kXQorCSAqIEFsbG9jYXRlL2luaXRpYWxpemUgYSBjdXJzb3IgZm9yIHRoZSBieS1zaXplIGJ0cmVlLgorCSAqLworCWNudF9jdXIgPSB4ZnNfYnRyZWVfaW5pdF9jdXJzb3IoYXJncy0+bXAsIGFyZ3MtPnRwLCBhcmdzLT5hZ2JwLAorCQlhcmdzLT5hZ25vLCBYRlNfQlROVU1fQ05ULCBOVUxMLCAwKTsKKwlBU1NFUlQoYXJncy0+YWdibm8gKyBhcmdzLT5sZW4gPD0KKwkJSU5UX0dFVChYRlNfQlVGX1RPX0FHRihhcmdzLT5hZ2JwKS0+YWdmX2xlbmd0aCwKKwkJCUFSQ0hfQ09OVkVSVCkpOworCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfZml4dXBfdHJlZXMoY250X2N1ciwgYm5vX2N1ciwgZmJubywgZmxlbiwKKwkJCWFyZ3MtPmFnYm5vLCBhcmdzLT5sZW4sIFhGU0FfRklYVVBfQk5PX09LKSkpIHsKKwkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY250X2N1ciwgWEZTX0JUUkVFX0VSUk9SKTsKKwkJZ290byBlcnJvcjA7CisJfQorCXhmc19idHJlZV9kZWxfY3Vyc29yKGJub19jdXIsIFhGU19CVFJFRV9OT0VSUk9SKTsKKwl4ZnNfYnRyZWVfZGVsX2N1cnNvcihjbnRfY3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CisJVFJBQ0VfQUxMT0MoIm5vcm1hbCIsIGFyZ3MpOworCWFyZ3MtPndhc2Zyb21mbCA9IDA7CisJcmV0dXJuIDA7CisKK2Vycm9yMDoKKwl4ZnNfYnRyZWVfZGVsX2N1cnNvcihibm9fY3VyLCBYRlNfQlRSRUVfRVJST1IpOworCVRSQUNFX0FMTE9DKCJlcnJvciIsIGFyZ3MpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIEFsbG9jYXRlIGEgdmFyaWFibGUgZXh0ZW50IG5lYXIgYm5vIGluIHRoZSBhbGxvY2F0aW9uIGdyb3VwIGFnbm8uCisgKiBFeHRlbnQncyBsZW5ndGggKHJldHVybmVkIGluIGxlbikgd2lsbCBiZSBiZXR3ZWVuIG1pbmxlbiBhbmQgbWF4bGVuLAorICogYW5kIG9mIHRoZSBmb3JtIGsgKiBwcm9kICsgbW9kIHVubGVzcyB0aGVyZSdzIG5vdGhpbmcgdGhhdCBsYXJnZS4KKyAqIFJldHVybiB0aGUgc3RhcnRpbmcgYS5nLiBibG9jaywgb3IgTlVMTEFHQkxPQ0sgaWYgd2UgY2FuJ3QgZG8gaXQuCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19hbGxvY19hZ192ZXh0ZW50X25lYXIoCisJeGZzX2FsbG9jX2FyZ190CSphcmdzKQkJLyogYWxsb2NhdGlvbiBhcmd1bWVudCBzdHJ1Y3R1cmUgKi8KK3sKKwl4ZnNfYnRyZWVfY3VyX3QJKmJub19jdXJfZ3Q7CS8qIGN1cnNvciBmb3IgYm5vIGJ0cmVlLCByaWdodCBzaWRlICovCisJeGZzX2J0cmVlX2N1cl90CSpibm9fY3VyX2x0OwkvKiBjdXJzb3IgZm9yIGJubyBidHJlZSwgbGVmdCBzaWRlICovCisJeGZzX2J0cmVlX2N1cl90CSpjbnRfY3VyOwkvKiBjdXJzb3IgZm9yIGNvdW50IGJ0cmVlICovCisjaWZkZWYgWEZTX0FMTE9DX1RSQUNFCisJc3RhdGljIGNoYXIJZm5hbWVbXSA9ICJ4ZnNfYWxsb2NfYWdfdmV4dGVudF9uZWFyIjsKKyNlbmRpZgorCXhmc19hZ2Jsb2NrX3QJZ3Ribm87CQkvKiBzdGFydCBibm8gb2YgcmlnaHQgc2lkZSBlbnRyeSAqLworCXhmc19hZ2Jsb2NrX3QJZ3Ribm9hOwkJLyogYWxpZ25lZCAuLi4gKi8KKwl4ZnNfZXh0bGVuX3QJZ3RkaWZmOwkJLyogZGlmZmVyZW5jZSB0byByaWdodCBzaWRlIGVudHJ5ICovCisJeGZzX2V4dGxlbl90CWd0bGVuOwkJLyogbGVuZ3RoIG9mIHJpZ2h0IHNpZGUgZW50cnkgKi8KKwl4ZnNfZXh0bGVuX3QJZ3RsZW5hOwkJLyogYWxpZ25lZCAuLi4gKi8KKwl4ZnNfYWdibG9ja190CWd0bmV3OwkJLyogdXNlZnVsIHN0YXJ0IGJubyBvZiByaWdodCBzaWRlICovCisJaW50CQllcnJvcjsJCS8qIGVycm9yIGNvZGUgKi8KKwlpbnQJCWk7CQkvKiByZXN1bHQgY29kZSwgdGVtcG9yYXJ5ICovCisJaW50CQlqOwkJLyogcmVzdWx0IGNvZGUsIHRlbXBvcmFyeSAqLworCXhmc19hZ2Jsb2NrX3QJbHRibm87CQkvKiBzdGFydCBibm8gb2YgbGVmdCBzaWRlIGVudHJ5ICovCisJeGZzX2FnYmxvY2tfdAlsdGJub2E7CQkvKiBhbGlnbmVkIC4uLiAqLworCXhmc19leHRsZW5fdAlsdGRpZmY7CQkvKiBkaWZmZXJlbmNlIHRvIGxlZnQgc2lkZSBlbnRyeSAqLworCS8qUkVGRVJFTkNFRCovCisJeGZzX2FnYmxvY2tfdAlsdGVuZDsJCS8qIGVuZCBibm8gb2YgbGVmdCBzaWRlIGVudHJ5ICovCisJeGZzX2V4dGxlbl90CWx0bGVuOwkJLyogbGVuZ3RoIG9mIGxlZnQgc2lkZSBlbnRyeSAqLworCXhmc19leHRsZW5fdAlsdGxlbmE7CQkvKiBhbGlnbmVkIC4uLiAqLworCXhmc19hZ2Jsb2NrX3QJbHRuZXc7CQkvKiB1c2VmdWwgc3RhcnQgYm5vIG9mIGxlZnQgc2lkZSAqLworCXhmc19leHRsZW5fdAlybGVuOwkJLyogbGVuZ3RoIG9mIHJldHVybmVkIGV4dGVudCAqLworI2lmIGRlZmluZWQoREVCVUcpICYmIGRlZmluZWQoX19LRVJORUxfXykKKwkvKgorCSAqIFJhbmRvbWx5IGRvbid0IGV4ZWN1dGUgdGhlIGZpcnN0IGFsZ29yaXRobS4KKwkgKi8KKwlpbnQJCWRvZmlyc3Q7CS8qIHNldCB0byBkbyBmaXJzdCBhbGdvcml0aG0gKi8KKworCWRvZmlyc3QgPSByYW5kb20oKSAmIDE7CisjZW5kaWYKKwkvKgorCSAqIEdldCBhIGN1cnNvciBmb3IgdGhlIGJ5LXNpemUgYnRyZWUuCisJICovCisJY250X2N1ciA9IHhmc19idHJlZV9pbml0X2N1cnNvcihhcmdzLT5tcCwgYXJncy0+dHAsIGFyZ3MtPmFnYnAsCisJCWFyZ3MtPmFnbm8sIFhGU19CVE5VTV9DTlQsIE5VTEwsIDApOworCWx0bGVuID0gMDsKKwlibm9fY3VyX2x0ID0gYm5vX2N1cl9ndCA9IE5VTEw7CisJLyoKKwkgKiBTZWUgaWYgdGhlcmUgYXJlIGFueSBmcmVlIGV4dGVudHMgYXMgYmlnIGFzIG1heGxlbi4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2FsbG9jX2xvb2t1cF9nZShjbnRfY3VyLCAwLCBhcmdzLT5tYXhsZW4sICZpKSkpCisJCWdvdG8gZXJyb3IwOworCS8qCisJICogSWYgbm9uZSwgdGhlbiBwaWNrIHVwIHRoZSBsYXN0IGVudHJ5IGluIHRoZSB0cmVlIHVubGVzcyB0aGUKKwkgKiB0cmVlIGlzIGVtcHR5LgorCSAqLworCWlmICghaSkgeworCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2FnX3ZleHRlbnRfc21hbGwoYXJncywgY250X2N1ciwgJmx0Ym5vLAorCQkJCSZsdGxlbiwgJmkpKSkKKwkJCWdvdG8gZXJyb3IwOworCQlpZiAoaSA9PSAwIHx8IGx0bGVuID09IDApIHsKKwkJCXhmc19idHJlZV9kZWxfY3Vyc29yKGNudF9jdXIsIFhGU19CVFJFRV9OT0VSUk9SKTsKKwkJCXJldHVybiAwOworCQl9CisJCUFTU0VSVChpID09IDEpOworCX0KKwlhcmdzLT53YXNmcm9tZmwgPSAwOworCS8qCisJICogRmlyc3QgYWxnb3JpdGhtLgorCSAqIElmIHRoZSByZXF1ZXN0ZWQgZXh0ZW50IGlzIGxhcmdlIHdydCB0aGUgZnJlZXNwYWNlcyBhdmFpbGFibGUKKwkgKiBpbiB0aGlzIGEuZy4sIHRoZW4gdGhlIGN1cnNvciB3aWxsIGJlIHBvaW50aW5nIHRvIGEgYnRyZWUgZW50cnkKKwkgKiBuZWFyIHRoZSByaWdodCBlZGdlIG9mIHRoZSB0cmVlLiAgSWYgaXQncyBpbiB0aGUgbGFzdCBidHJlZSBsZWFmCisJICogYmxvY2ssIHRoZW4gd2UganVzdCBleGFtaW5lIGFsbCB0aGUgZW50cmllcyBpbiB0aGF0IGJsb2NrCisJICogdGhhdCBhcmUgYmlnIGVub3VnaCwgYW5kIHBpY2sgdGhlIGJlc3Qgb25lLgorCSAqIFRoaXMgaXMgd3JpdHRlbiBhcyBhIHdoaWxlIGxvb3Agc28gd2UgY2FuIGJyZWFrIG91dCBvZiBpdCwKKwkgKiBidXQgd2UgbmV2ZXIgbG9vcCBiYWNrIHRvIHRoZSB0b3AuCisJICovCisJd2hpbGUgKHhmc19idHJlZV9pc2xhc3RibG9jayhjbnRfY3VyLCAwKSkgeworCQl4ZnNfZXh0bGVuX3QJYmRpZmY7CisJCWludAkJYmVzdGk9MDsKKwkJeGZzX2V4dGxlbl90CWJsZW49MDsKKwkJeGZzX2FnYmxvY2tfdAlibmV3PTA7CisKKyNpZiBkZWZpbmVkKERFQlVHKSAmJiBkZWZpbmVkKF9fS0VSTkVMX18pCisJCWlmICghZG9maXJzdCkKKwkJCWJyZWFrOworI2VuZGlmCisJCS8qCisJCSAqIFN0YXJ0IGZyb20gdGhlIGVudHJ5IHRoYXQgbG9va3VwIGZvdW5kLCBzZXF1ZW5jZSB0aHJvdWdoCisJCSAqIGFsbCBsYXJnZXIgZnJlZSBibG9ja3MuICBJZiB3ZSdyZSBhY3R1YWxseSBwb2ludGluZyBhdCBhCisJCSAqIHJlY29yZCBzbWFsbGVyIHRoYW4gbWF4bGVuLCBnbyB0byB0aGUgc3RhcnQgb2YgdGhpcyBibG9jaywKKwkJICogYW5kIHNraXAgYWxsIHRob3NlIHNtYWxsZXIgdGhhbiBtaW5sZW4uCisJCSAqLworCQlpZiAobHRsZW4gfHwgYXJncy0+YWxpZ25tZW50ID4gMSkgeworCQkJY250X2N1ci0+YmNfcHRyc1swXSA9IDE7CisJCQlkbyB7CisJCQkJaWYgKChlcnJvciA9IHhmc19hbGxvY19nZXRfcmVjKGNudF9jdXIsICZsdGJubywKKwkJCQkJCSZsdGxlbiwgJmkpKSkKKwkJCQkJZ290byBlcnJvcjA7CisJCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCQkJCWlmIChsdGxlbiA+PSBhcmdzLT5taW5sZW4pCisJCQkJCWJyZWFrOworCQkJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfaW5jcmVtZW50KGNudF9jdXIsIDAsICZpKSkpCisJCQkJCWdvdG8gZXJyb3IwOworCQkJfSB3aGlsZSAoaSk7CisJCQlBU1NFUlQobHRsZW4gPj0gYXJncy0+bWlubGVuKTsKKwkJCWlmICghaSkKKwkJCQlicmVhazsKKwkJfQorCQlpID0gY250X2N1ci0+YmNfcHRyc1swXTsKKwkJZm9yIChqID0gMSwgYmxlbiA9IDAsIGJkaWZmID0gMDsKKwkJICAgICAhZXJyb3IgJiYgaiAmJiAoYmxlbiA8IGFyZ3MtPm1heGxlbiB8fCBiZGlmZiA+IDApOworCQkgICAgIGVycm9yID0geGZzX2FsbG9jX2luY3JlbWVudChjbnRfY3VyLCAwLCAmaikpIHsKKwkJCS8qCisJCQkgKiBGb3IgZWFjaCBlbnRyeSwgZGVjaWRlIGlmIGl0J3MgYmV0dGVyIHRoYW4KKwkJCSAqIHRoZSBwcmV2aW91cyBiZXN0IGVudHJ5LgorCQkJICovCisJCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2dldF9yZWMoY250X2N1ciwgJmx0Ym5vLCAmbHRsZW4sICZpKSkpCisJCQkJZ290byBlcnJvcjA7CisJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCQlpZiAoIXhmc19hbGxvY19jb21wdXRlX2FsaWduZWQobHRibm8sIGx0bGVuLAorCQkJCQlhcmdzLT5hbGlnbm1lbnQsIGFyZ3MtPm1pbmxlbiwKKwkJCQkJJmx0Ym5vYSwgJmx0bGVuYSkpCisJCQkJY29udGludWU7CisJCQlhcmdzLT5sZW4gPSBYRlNfRVhUTEVOX01JTihsdGxlbmEsIGFyZ3MtPm1heGxlbik7CisJCQl4ZnNfYWxsb2NfZml4X2xlbihhcmdzKTsKKwkJCUFTU0VSVChhcmdzLT5sZW4gPj0gYXJncy0+bWlubGVuKTsKKwkJCWlmIChhcmdzLT5sZW4gPCBibGVuKQorCQkJCWNvbnRpbnVlOworCQkJbHRkaWZmID0geGZzX2FsbG9jX2NvbXB1dGVfZGlmZihhcmdzLT5hZ2JubywgYXJncy0+bGVuLAorCQkJCWFyZ3MtPmFsaWdubWVudCwgbHRibm8sIGx0bGVuLCAmbHRuZXcpOworCQkJaWYgKGx0bmV3ICE9IE5VTExBR0JMT0NLICYmCisJCQkgICAgKGFyZ3MtPmxlbiA+IGJsZW4gfHwgbHRkaWZmIDwgYmRpZmYpKSB7CisJCQkJYmRpZmYgPSBsdGRpZmY7CisJCQkJYm5ldyA9IGx0bmV3OworCQkJCWJsZW4gPSBhcmdzLT5sZW47CisJCQkJYmVzdGkgPSBjbnRfY3VyLT5iY19wdHJzWzBdOworCQkJfQorCQl9CisJCS8qCisJCSAqIEl0IGRpZG4ndCB3b3JrLiAgV2UgQ09VTEQgYmUgaW4gYSBjYXNlIHdoZXJlCisJCSAqIHRoZXJlJ3MgYSBnb29kIHJlY29yZCBzb21ld2hlcmUsIHNvIHRyeSBhZ2Fpbi4KKwkJICovCisJCWlmIChibGVuID09IDApCisJCQlicmVhazsKKwkJLyoKKwkJICogUG9pbnQgYXQgdGhlIGJlc3QgZW50cnksIGFuZCByZXRyaWV2ZSBpdCBhZ2Fpbi4KKwkJICovCisJCWNudF9jdXItPmJjX3B0cnNbMF0gPSBiZXN0aTsKKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19nZXRfcmVjKGNudF9jdXIsICZsdGJubywgJmx0bGVuLCAmaSkpKQorCQkJZ290byBlcnJvcjA7CisJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKwkJbHRlbmQgPSBsdGJubyArIGx0bGVuOworCQlBU1NFUlQobHRlbmQgPD0gSU5UX0dFVChYRlNfQlVGX1RPX0FHRihhcmdzLT5hZ2JwKS0+YWdmX2xlbmd0aCwKKwkJCQlBUkNIX0NPTlZFUlQpKTsKKwkJYXJncy0+bGVuID0gYmxlbjsKKwkJaWYgKCF4ZnNfYWxsb2NfZml4X21pbmxlZnQoYXJncykpIHsKKwkJCXhmc19idHJlZV9kZWxfY3Vyc29yKGNudF9jdXIsIFhGU19CVFJFRV9OT0VSUk9SKTsKKwkJCVRSQUNFX0FMTE9DKCJub21pbmxlZnQiLCBhcmdzKTsKKwkJCXJldHVybiAwOworCQl9CisJCWJsZW4gPSBhcmdzLT5sZW47CisJCS8qCisJCSAqIFdlIGFyZSBhbGxvY2F0aW5nIHN0YXJ0aW5nIGF0IGJuZXcgZm9yIGJsZW4gYmxvY2tzLgorCQkgKi8KKwkJYXJncy0+YWdibm8gPSBibmV3OworCQlBU1NFUlQoYm5ldyA+PSBsdGJubyk7CisJCUFTU0VSVChibmV3ICsgYmxlbiA8PSBsdGVuZCk7CisJCS8qCisJCSAqIFNldCB1cCBhIGN1cnNvciBmb3IgdGhlIGJ5LWJubyB0cmVlLgorCQkgKi8KKwkJYm5vX2N1cl9sdCA9IHhmc19idHJlZV9pbml0X2N1cnNvcihhcmdzLT5tcCwgYXJncy0+dHAsCisJCQlhcmdzLT5hZ2JwLCBhcmdzLT5hZ25vLCBYRlNfQlROVU1fQk5PLCBOVUxMLCAwKTsKKwkJLyoKKwkJICogRml4IHVwIHRoZSBidHJlZSBlbnRyaWVzLgorCQkgKi8KKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19maXh1cF90cmVlcyhjbnRfY3VyLCBibm9fY3VyX2x0LCBsdGJubywKKwkJCQlsdGxlbiwgYm5ldywgYmxlbiwgWEZTQV9GSVhVUF9DTlRfT0spKSkKKwkJCWdvdG8gZXJyb3IwOworCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihjbnRfY3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CisJCXhmc19idHJlZV9kZWxfY3Vyc29yKGJub19jdXJfbHQsIFhGU19CVFJFRV9OT0VSUk9SKTsKKwkJVFJBQ0VfQUxMT0MoImZpcnN0IiwgYXJncyk7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIFNlY29uZCBhbGdvcml0aG0uCisJICogU2VhcmNoIGluIHRoZSBieS1ibm8gdHJlZSB0byB0aGUgbGVmdCBhbmQgdG8gdGhlIHJpZ2h0CisJICogc2ltdWx0YW5lb3VzbHksIHVudGlsIGluIGVhY2ggY2FzZSB3ZSBmaW5kIGEgc3BhY2UgYmlnIGVub3VnaCwKKwkgKiBvciBydW4gaW50byB0aGUgZWRnZSBvZiB0aGUgdHJlZS4gIFdoZW4gd2UgcnVuIGludG8gdGhlIGVkZ2UsCisJICogd2UgZGVhbGxvY2F0ZSB0aGF0IGN1cnNvci4KKwkgKiBJZiBib3RoIHNlYXJjaGVzIHN1Y2NlZWQsIHdlIGNvbXBhcmUgdGhlIHR3byBzcGFjZXMgYW5kIHBpY2sKKwkgKiB0aGUgYmV0dGVyIG9uZS4KKwkgKiBXaXRoIGFsaWdubWVudCwgaXQncyBwb3NzaWJsZSBmb3IgYm90aCB0byBmYWlsOyB0aGUgdXBwZXIKKwkgKiBsZXZlbCBhbGdvcml0aG0gdGhhdCBwaWNrcyBhbGxvY2F0aW9uIGdyb3VwcyBmb3IgYWxsb2NhdGlvbnMKKwkgKiBpcyBub3Qgc3VwcG9zZWQgdG8gZG8gdGhpcy4KKwkgKi8KKwkvKgorCSAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBjdXJzb3IgZm9yIHRoZSBsZWZ0d2FyZCBzZWFyY2guCisJICovCisJYm5vX2N1cl9sdCA9IHhmc19idHJlZV9pbml0X2N1cnNvcihhcmdzLT5tcCwgYXJncy0+dHAsIGFyZ3MtPmFnYnAsCisJCWFyZ3MtPmFnbm8sIFhGU19CVE5VTV9CTk8sIE5VTEwsIDApOworCS8qCisJICogTG9va3VwIDw9IGJubyB0byBmaW5kIHRoZSBsZWZ0d2FyZCBzZWFyY2gncyBzdGFydGluZyBwb2ludC4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2FsbG9jX2xvb2t1cF9sZShibm9fY3VyX2x0LCBhcmdzLT5hZ2JubywgYXJncy0+bWF4bGVuLCAmaSkpKQorCQlnb3RvIGVycm9yMDsKKwlpZiAoIWkpIHsKKwkJLyoKKwkJICogRGlkbid0IGZpbmQgYW55dGhpbmc7IHVzZSB0aGlzIGN1cnNvciBmb3IgdGhlIHJpZ2h0d2FyZAorCQkgKiBzZWFyY2guCisJCSAqLworCQlibm9fY3VyX2d0ID0gYm5vX2N1cl9sdDsKKwkJYm5vX2N1cl9sdCA9IE5VTEw7CisJfQorCS8qCisJICogRm91bmQgc29tZXRoaW5nLiAgRHVwbGljYXRlIHRoZSBjdXJzb3IgZm9yIHRoZSByaWdodHdhcmQgc2VhcmNoLgorCSAqLworCWVsc2UgaWYgKChlcnJvciA9IHhmc19idHJlZV9kdXBfY3Vyc29yKGJub19jdXJfbHQsICZibm9fY3VyX2d0KSkpCisJCWdvdG8gZXJyb3IwOworCS8qCisJICogSW5jcmVtZW50IHRoZSBjdXJzb3IsIHNvIHdlIHdpbGwgcG9pbnQgYXQgdGhlIGVudHJ5IGp1c3QgcmlnaHQKKwkgKiBvZiB0aGUgbGVmdHdhcmQgZW50cnkgaWYgYW55LCBvciB0byB0aGUgbGVmdG1vc3QgZW50cnkuCisJICovCisJaWYgKChlcnJvciA9IHhmc19hbGxvY19pbmNyZW1lbnQoYm5vX2N1cl9ndCwgMCwgJmkpKSkKKwkJZ290byBlcnJvcjA7CisJaWYgKCFpKSB7CisJCS8qCisJCSAqIEl0IGZhaWxlZCwgdGhlcmUgYXJlIG5vIHJpZ2h0d2FyZCBlbnRyaWVzLgorCQkgKi8KKwkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoYm5vX2N1cl9ndCwgWEZTX0JUUkVFX05PRVJST1IpOworCQlibm9fY3VyX2d0ID0gTlVMTDsKKwl9CisJLyoKKwkgKiBMb29wIGdvaW5nIGxlZnQgd2l0aCB0aGUgbGVmdHdhcmQgY3Vyc29yLCByaWdodCB3aXRoIHRoZQorCSAqIHJpZ2h0d2FyZCBjdXJzb3IsIHVudGlsIGVpdGhlciBib3RoIGRpcmVjdGlvbnMgZ2l2ZSB1cCBvcgorCSAqIHdlIGZpbmQgYW4gZW50cnkgYXQgbGVhc3QgYXMgYmlnIGFzIG1pbmxlbi4KKwkgKi8KKwlkbyB7CisJCWlmIChibm9fY3VyX2x0KSB7CisJCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2dldF9yZWMoYm5vX2N1cl9sdCwgJmx0Ym5vLCAmbHRsZW4sICZpKSkpCisJCQkJZ290byBlcnJvcjA7CisJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCQlpZiAoeGZzX2FsbG9jX2NvbXB1dGVfYWxpZ25lZChsdGJubywgbHRsZW4sCisJCQkJCWFyZ3MtPmFsaWdubWVudCwgYXJncy0+bWlubGVuLAorCQkJCQkmbHRibm9hLCAmbHRsZW5hKSkKKwkJCQlicmVhazsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfZGVjcmVtZW50KGJub19jdXJfbHQsIDAsICZpKSkpCisJCQkJZ290byBlcnJvcjA7CisJCQlpZiAoIWkpIHsKKwkJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihibm9fY3VyX2x0LAorCQkJCQkJICAgICBYRlNfQlRSRUVfTk9FUlJPUik7CisJCQkJYm5vX2N1cl9sdCA9IE5VTEw7CisJCQl9CisJCX0KKwkJaWYgKGJub19jdXJfZ3QpIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfZ2V0X3JlYyhibm9fY3VyX2d0LCAmZ3Ribm8sICZndGxlbiwgJmkpKSkKKwkJCQlnb3RvIGVycm9yMDsKKwkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKwkJCWlmICh4ZnNfYWxsb2NfY29tcHV0ZV9hbGlnbmVkKGd0Ym5vLCBndGxlbiwKKwkJCQkJYXJncy0+YWxpZ25tZW50LCBhcmdzLT5taW5sZW4sCisJCQkJCSZndGJub2EsICZndGxlbmEpKQorCQkJCWJyZWFrOworCQkJaWYgKChlcnJvciA9IHhmc19hbGxvY19pbmNyZW1lbnQoYm5vX2N1cl9ndCwgMCwgJmkpKSkKKwkJCQlnb3RvIGVycm9yMDsKKwkJCWlmICghaSkgeworCQkJCXhmc19idHJlZV9kZWxfY3Vyc29yKGJub19jdXJfZ3QsCisJCQkJCQkgICAgIFhGU19CVFJFRV9OT0VSUk9SKTsKKwkJCQlibm9fY3VyX2d0ID0gTlVMTDsKKwkJCX0KKwkJfQorCX0gd2hpbGUgKGJub19jdXJfbHQgfHwgYm5vX2N1cl9ndCk7CisJLyoKKwkgKiBHb3QgYm90aCBjdXJzb3JzIHN0aWxsIGFjdGl2ZSwgbmVlZCB0byBmaW5kIGJldHRlciBlbnRyeS4KKwkgKi8KKwlpZiAoYm5vX2N1cl9sdCAmJiBibm9fY3VyX2d0KSB7CisJCS8qCisJCSAqIExlZnQgc2lkZSBpcyBsb25nIGVub3VnaCwgbG9vayBmb3IgYSByaWdodCBzaWRlIGVudHJ5LgorCQkgKi8KKwkJaWYgKGx0bGVuYSA+PSBhcmdzLT5taW5sZW4pIHsKKwkJCS8qCisJCQkgKiBGaXggdXAgdGhlIGxlbmd0aC4KKwkJCSAqLworCQkJYXJncy0+bGVuID0gWEZTX0VYVExFTl9NSU4obHRsZW5hLCBhcmdzLT5tYXhsZW4pOworCQkJeGZzX2FsbG9jX2ZpeF9sZW4oYXJncyk7CisJCQlybGVuID0gYXJncy0+bGVuOworCQkJbHRkaWZmID0geGZzX2FsbG9jX2NvbXB1dGVfZGlmZihhcmdzLT5hZ2JubywgcmxlbiwKKwkJCQlhcmdzLT5hbGlnbm1lbnQsIGx0Ym5vLCBsdGxlbiwgJmx0bmV3KTsKKwkJCS8qCisJCQkgKiBOb3QgcGVyZmVjdC4KKwkJCSAqLworCQkJaWYgKGx0ZGlmZikgeworCQkJCS8qCisJCQkJICogTG9vayB1bnRpbCB3ZSBmaW5kIGEgYmV0dGVyIG9uZSwgcnVuIG91dCBvZgorCQkJCSAqIHNwYWNlLCBvciBydW4gb2ZmIHRoZSBlbmQuCisJCQkJICovCisJCQkJd2hpbGUgKGJub19jdXJfbHQgJiYgYm5vX2N1cl9ndCkgeworCQkJCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2dldF9yZWMoCisJCQkJCQkJYm5vX2N1cl9ndCwgJmd0Ym5vLAorCQkJCQkJCSZndGxlbiwgJmkpKSkKKwkJCQkJCWdvdG8gZXJyb3IwOworCQkJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCQkJCXhmc19hbGxvY19jb21wdXRlX2FsaWduZWQoZ3Ribm8sIGd0bGVuLAorCQkJCQkJYXJncy0+YWxpZ25tZW50LCBhcmdzLT5taW5sZW4sCisJCQkJCQkmZ3Ribm9hLCAmZ3RsZW5hKTsKKwkJCQkJLyoKKwkJCQkJICogVGhlIGxlZnQgb25lIGlzIGNsZWFybHkgYmV0dGVyLgorCQkJCQkgKi8KKwkJCQkJaWYgKGd0Ym5vYSA+PSBhcmdzLT5hZ2JubyArIGx0ZGlmZikgeworCQkJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoCisJCQkJCQkJYm5vX2N1cl9ndCwKKwkJCQkJCQlYRlNfQlRSRUVfTk9FUlJPUik7CisJCQkJCQlibm9fY3VyX2d0ID0gTlVMTDsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCS8qCisJCQkJCSAqIElmIHdlIHJlYWNoIGEgYmlnIGVub3VnaCBlbnRyeSwKKwkJCQkJICogY29tcGFyZSB0aGUgdHdvIGFuZCBwaWNrIHRoZSBiZXN0LgorCQkJCQkgKi8KKwkJCQkJaWYgKGd0bGVuYSA+PSBhcmdzLT5taW5sZW4pIHsKKwkJCQkJCWFyZ3MtPmxlbiA9CisJCQkJCQkJWEZTX0VYVExFTl9NSU4oZ3RsZW5hLAorCQkJCQkJCQlhcmdzLT5tYXhsZW4pOworCQkJCQkJeGZzX2FsbG9jX2ZpeF9sZW4oYXJncyk7CisJCQkJCQlybGVuID0gYXJncy0+bGVuOworCQkJCQkJZ3RkaWZmID0geGZzX2FsbG9jX2NvbXB1dGVfZGlmZigKKwkJCQkJCQlhcmdzLT5hZ2JubywgcmxlbiwKKwkJCQkJCQlhcmdzLT5hbGlnbm1lbnQsCisJCQkJCQkJZ3Ribm8sIGd0bGVuLCAmZ3RuZXcpOworCQkJCQkJLyoKKwkJCQkJCSAqIFJpZ2h0IHNpZGUgaXMgYmV0dGVyLgorCQkJCQkJICovCisJCQkJCQlpZiAoZ3RkaWZmIDwgbHRkaWZmKSB7CisJCQkJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoCisJCQkJCQkJCWJub19jdXJfbHQsCisJCQkJCQkJCVhGU19CVFJFRV9OT0VSUk9SKTsKKwkJCQkJCQlibm9fY3VyX2x0ID0gTlVMTDsKKwkJCQkJCX0KKwkJCQkJCS8qCisJCQkJCQkgKiBMZWZ0IHNpZGUgaXMgYmV0dGVyLgorCQkJCQkJICovCisJCQkJCQllbHNlIHsKKwkJCQkJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcigKKwkJCQkJCQkJYm5vX2N1cl9ndCwKKwkJCQkJCQkJWEZTX0JUUkVFX05PRVJST1IpOworCQkJCQkJCWJub19jdXJfZ3QgPSBOVUxMOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJLyoKKwkJCQkJICogRmVsbCBvZmYgdGhlIHJpZ2h0IGVuZC4KKwkJCQkJICovCisJCQkJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfaW5jcmVtZW50KAorCQkJCQkJCWJub19jdXJfZ3QsIDAsICZpKSkpCisJCQkJCQlnb3RvIGVycm9yMDsKKwkJCQkJaWYgKCFpKSB7CisJCQkJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcigKKwkJCQkJCQlibm9fY3VyX2d0LAorCQkJCQkJCVhGU19CVFJFRV9OT0VSUk9SKTsKKwkJCQkJCWJub19jdXJfZ3QgPSBOVUxMOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQkvKgorCQkJICogVGhlIGxlZnQgc2lkZSBpcyBwZXJmZWN0LCB0cmFzaCB0aGUgcmlnaHQgc2lkZS4KKwkJCSAqLworCQkJZWxzZSB7CisJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoYm5vX2N1cl9ndCwKKwkJCQkJCSAgICAgWEZTX0JUUkVFX05PRVJST1IpOworCQkJCWJub19jdXJfZ3QgPSBOVUxMOworCQkJfQorCQl9CisJCS8qCisJCSAqIEl0J3MgdGhlIHJpZ2h0IHNpZGUgdGhhdCB3YXMgZm91bmQgZmlyc3QsIGxvb2sgbGVmdC4KKwkJICovCisJCWVsc2UgeworCQkJLyoKKwkJCSAqIEZpeCB1cCB0aGUgbGVuZ3RoLgorCQkJICovCisJCQlhcmdzLT5sZW4gPSBYRlNfRVhUTEVOX01JTihndGxlbmEsIGFyZ3MtPm1heGxlbik7CisJCQl4ZnNfYWxsb2NfZml4X2xlbihhcmdzKTsKKwkJCXJsZW4gPSBhcmdzLT5sZW47CisJCQlndGRpZmYgPSB4ZnNfYWxsb2NfY29tcHV0ZV9kaWZmKGFyZ3MtPmFnYm5vLCBybGVuLAorCQkJCWFyZ3MtPmFsaWdubWVudCwgZ3Ribm8sIGd0bGVuLCAmZ3RuZXcpOworCQkJLyoKKwkJCSAqIFJpZ2h0IHNpZGUgZW50cnkgaXNuJ3QgcGVyZmVjdC4KKwkJCSAqLworCQkJaWYgKGd0ZGlmZikgeworCQkJCS8qCisJCQkJICogTG9vayB1bnRpbCB3ZSBmaW5kIGEgYmV0dGVyIG9uZSwgcnVuIG91dCBvZgorCQkJCSAqIHNwYWNlLCBvciBydW4gb2ZmIHRoZSBlbmQuCisJCQkJICovCisJCQkJd2hpbGUgKGJub19jdXJfbHQgJiYgYm5vX2N1cl9ndCkgeworCQkJCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2dldF9yZWMoCisJCQkJCQkJYm5vX2N1cl9sdCwgJmx0Ym5vLAorCQkJCQkJCSZsdGxlbiwgJmkpKSkKKwkJCQkJCWdvdG8gZXJyb3IwOworCQkJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCQkJCXhmc19hbGxvY19jb21wdXRlX2FsaWduZWQobHRibm8sIGx0bGVuLAorCQkJCQkJYXJncy0+YWxpZ25tZW50LCBhcmdzLT5taW5sZW4sCisJCQkJCQkmbHRibm9hLCAmbHRsZW5hKTsKKwkJCQkJLyoKKwkJCQkJICogVGhlIHJpZ2h0IG9uZSBpcyBjbGVhcmx5IGJldHRlci4KKwkJCQkJICovCisJCQkJCWlmIChsdGJub2EgPD0gYXJncy0+YWdibm8gLSBndGRpZmYpIHsKKwkJCQkJCXhmc19idHJlZV9kZWxfY3Vyc29yKAorCQkJCQkJCWJub19jdXJfbHQsCisJCQkJCQkJWEZTX0JUUkVFX05PRVJST1IpOworCQkJCQkJYm5vX2N1cl9sdCA9IE5VTEw7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQkvKgorCQkJCQkgKiBJZiB3ZSByZWFjaCBhIGJpZyBlbm91Z2ggZW50cnksCisJCQkJCSAqIGNvbXBhcmUgdGhlIHR3byBhbmQgcGljayB0aGUgYmVzdC4KKwkJCQkJICovCisJCQkJCWlmIChsdGxlbmEgPj0gYXJncy0+bWlubGVuKSB7CisJCQkJCQlhcmdzLT5sZW4gPSBYRlNfRVhUTEVOX01JTigKKwkJCQkJCQlsdGxlbmEsIGFyZ3MtPm1heGxlbik7CisJCQkJCQl4ZnNfYWxsb2NfZml4X2xlbihhcmdzKTsKKwkJCQkJCXJsZW4gPSBhcmdzLT5sZW47CisJCQkJCQlsdGRpZmYgPSB4ZnNfYWxsb2NfY29tcHV0ZV9kaWZmKAorCQkJCQkJCWFyZ3MtPmFnYm5vLCBybGVuLAorCQkJCQkJCWFyZ3MtPmFsaWdubWVudCwKKwkJCQkJCQlsdGJubywgbHRsZW4sICZsdG5ldyk7CisJCQkJCQkvKgorCQkJCQkJICogTGVmdCBzaWRlIGlzIGJldHRlci4KKwkJCQkJCSAqLworCQkJCQkJaWYgKGx0ZGlmZiA8IGd0ZGlmZikgeworCQkJCQkJCXhmc19idHJlZV9kZWxfY3Vyc29yKAorCQkJCQkJCQlibm9fY3VyX2d0LAorCQkJCQkJCQlYRlNfQlRSRUVfTk9FUlJPUik7CisJCQkJCQkJYm5vX2N1cl9ndCA9IE5VTEw7CisJCQkJCQl9CisJCQkJCQkvKgorCQkJCQkJICogUmlnaHQgc2lkZSBpcyBiZXR0ZXIuCisJCQkJCQkgKi8KKwkJCQkJCWVsc2UgeworCQkJCQkJCXhmc19idHJlZV9kZWxfY3Vyc29yKAorCQkJCQkJCQlibm9fY3VyX2x0LAorCQkJCQkJCQlYRlNfQlRSRUVfTk9FUlJPUik7CisJCQkJCQkJYm5vX2N1cl9sdCA9IE5VTEw7CisJCQkJCQl9CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQkvKgorCQkJCQkgKiBGZWxsIG9mZiB0aGUgbGVmdCBlbmQuCisJCQkJCSAqLworCQkJCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2RlY3JlbWVudCgKKwkJCQkJCQlibm9fY3VyX2x0LCAwLCAmaSkpKQorCQkJCQkJZ290byBlcnJvcjA7CisJCQkJCWlmICghaSkgeworCQkJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoYm5vX2N1cl9sdCwKKwkJCQkJCQlYRlNfQlRSRUVfTk9FUlJPUik7CisJCQkJCQlibm9fY3VyX2x0ID0gTlVMTDsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJLyoKKwkJCSAqIFRoZSByaWdodCBzaWRlIGlzIHBlcmZlY3QsIHRyYXNoIHRoZSBsZWZ0IHNpZGUuCisJCQkgKi8KKwkJCWVsc2UgeworCQkJCXhmc19idHJlZV9kZWxfY3Vyc29yKGJub19jdXJfbHQsCisJCQkJCVhGU19CVFJFRV9OT0VSUk9SKTsKKwkJCQlibm9fY3VyX2x0ID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KKwkvKgorCSAqIElmIHdlIGNvdWxkbid0IGdldCBhbnl0aGluZywgZ2l2ZSB1cC4KKwkgKi8KKwlpZiAoYm5vX2N1cl9sdCA9PSBOVUxMICYmIGJub19jdXJfZ3QgPT0gTlVMTCkgeworCQlUUkFDRV9BTExPQygibmVpdGhlciIsIGFyZ3MpOworCQlhcmdzLT5hZ2JubyA9IE5VTExBR0JMT0NLOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgc2VsZWN0ZWQgYSBmcmVlc3BhY2UgZW50cnksIGVpdGhlciB0byB0aGUKKwkgKiBsZWZ0IG9yIHRvIHRoZSByaWdodC4gIElmIGl0J3Mgb24gdGhlIHJpZ2h0LCBjb3B5IGFsbCB0aGUKKwkgKiB1c2VmdWwgdmFyaWFibGVzIHRvIHRoZSAibGVmdCIgc2V0IHNvIHdlIG9ubHkgaGF2ZSBvbmUKKwkgKiBjb3B5IG9mIHRoaXMgY29kZS4KKwkgKi8KKwlpZiAoYm5vX2N1cl9ndCkgeworCQlibm9fY3VyX2x0ID0gYm5vX2N1cl9ndDsKKwkJYm5vX2N1cl9ndCA9IE5VTEw7CisJCWx0Ym5vID0gZ3Ribm87CisJCWx0Ym5vYSA9IGd0Ym5vYTsKKwkJbHRsZW4gPSBndGxlbjsKKwkJbHRsZW5hID0gZ3RsZW5hOworCQlqID0gMTsKKwl9IGVsc2UKKwkJaiA9IDA7CisJLyoKKwkgKiBGaXggdXAgdGhlIGxlbmd0aCBhbmQgY29tcHV0ZSB0aGUgdXNlZnVsIGFkZHJlc3MuCisJICovCisJbHRlbmQgPSBsdGJubyArIGx0bGVuOworCWFyZ3MtPmxlbiA9IFhGU19FWFRMRU5fTUlOKGx0bGVuYSwgYXJncy0+bWF4bGVuKTsKKwl4ZnNfYWxsb2NfZml4X2xlbihhcmdzKTsKKwlpZiAoIXhmc19hbGxvY19maXhfbWlubGVmdChhcmdzKSkgeworCQlUUkFDRV9BTExPQygibm9taW5sZWZ0IiwgYXJncyk7CisJCXhmc19idHJlZV9kZWxfY3Vyc29yKGJub19jdXJfbHQsIFhGU19CVFJFRV9OT0VSUk9SKTsKKwkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY250X2N1ciwgWEZTX0JUUkVFX05PRVJST1IpOworCQlyZXR1cm4gMDsKKwl9CisJcmxlbiA9IGFyZ3MtPmxlbjsKKwkodm9pZCl4ZnNfYWxsb2NfY29tcHV0ZV9kaWZmKGFyZ3MtPmFnYm5vLCBybGVuLCBhcmdzLT5hbGlnbm1lbnQsIGx0Ym5vLAorCQlsdGxlbiwgJmx0bmV3KTsKKwlBU1NFUlQobHRuZXcgPj0gbHRibm8pOworCUFTU0VSVChsdG5ldyArIHJsZW4gPD0gbHRlbmQpOworCUFTU0VSVChsdG5ldyArIHJsZW4gPD0gSU5UX0dFVChYRlNfQlVGX1RPX0FHRihhcmdzLT5hZ2JwKS0+YWdmX2xlbmd0aCwKKwkJQVJDSF9DT05WRVJUKSk7CisJYXJncy0+YWdibm8gPSBsdG5ldzsKKwlpZiAoKGVycm9yID0geGZzX2FsbG9jX2ZpeHVwX3RyZWVzKGNudF9jdXIsIGJub19jdXJfbHQsIGx0Ym5vLCBsdGxlbiwKKwkJCWx0bmV3LCBybGVuLCBYRlNBX0ZJWFVQX0JOT19PSykpKQorCQlnb3RvIGVycm9yMDsKKwlUUkFDRV9BTExPQyhqID8gImd0IiA6ICJsdCIsIGFyZ3MpOworCXhmc19idHJlZV9kZWxfY3Vyc29yKGNudF9jdXIsIFhGU19CVFJFRV9OT0VSUk9SKTsKKwl4ZnNfYnRyZWVfZGVsX2N1cnNvcihibm9fY3VyX2x0LCBYRlNfQlRSRUVfTk9FUlJPUik7CisJcmV0dXJuIDA7CisKKyBlcnJvcjA6CisJVFJBQ0VfQUxMT0MoImVycm9yIiwgYXJncyk7CisJaWYgKGNudF9jdXIgIT0gTlVMTCkKKwkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY250X2N1ciwgWEZTX0JUUkVFX0VSUk9SKTsKKwlpZiAoYm5vX2N1cl9sdCAhPSBOVUxMKQorCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihibm9fY3VyX2x0LCBYRlNfQlRSRUVfRVJST1IpOworCWlmIChibm9fY3VyX2d0ICE9IE5VTEwpCisJCXhmc19idHJlZV9kZWxfY3Vyc29yKGJub19jdXJfZ3QsIFhGU19CVFJFRV9FUlJPUik7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogQWxsb2NhdGUgYSB2YXJpYWJsZSBleHRlbnQgYW55d2hlcmUgaW4gdGhlIGFsbG9jYXRpb24gZ3JvdXAgYWduby4KKyAqIEV4dGVudCdzIGxlbmd0aCAocmV0dXJuZWQgaW4gbGVuKSB3aWxsIGJlIGJldHdlZW4gbWlubGVuIGFuZCBtYXhsZW4sCisgKiBhbmQgb2YgdGhlIGZvcm0gayAqIHByb2QgKyBtb2QgdW5sZXNzIHRoZXJlJ3Mgbm90aGluZyB0aGF0IGxhcmdlLgorICogUmV0dXJuIHRoZSBzdGFydGluZyBhLmcuIGJsb2NrLCBvciBOVUxMQUdCTE9DSyBpZiB3ZSBjYW4ndCBkbyBpdC4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX2FsbG9jX2FnX3ZleHRlbnRfc2l6ZSgKKwl4ZnNfYWxsb2NfYXJnX3QJKmFyZ3MpCQkvKiBhbGxvY2F0aW9uIGFyZ3VtZW50IHN0cnVjdHVyZSAqLworeworCXhmc19idHJlZV9jdXJfdAkqYm5vX2N1cjsJLyogY3Vyc29yIGZvciBibm8gYnRyZWUgKi8KKwl4ZnNfYnRyZWVfY3VyX3QJKmNudF9jdXI7CS8qIGN1cnNvciBmb3IgY250IGJ0cmVlICovCisJaW50CQllcnJvcjsJCS8qIGVycm9yIHJlc3VsdCAqLworCXhmc19hZ2Jsb2NrX3QJZmJubzsJCS8qIHN0YXJ0IG9mIGZvdW5kIGZyZWVzcGFjZSAqLworCXhmc19leHRsZW5fdAlmbGVuOwkJLyogbGVuZ3RoIG9mIGZvdW5kIGZyZWVzcGFjZSAqLworI2lmZGVmIFhGU19BTExPQ19UUkFDRQorCXN0YXRpYyBjaGFyCWZuYW1lW10gPSAieGZzX2FsbG9jX2FnX3ZleHRlbnRfc2l6ZSI7CisjZW5kaWYKKwlpbnQJCWk7CQkvKiB0ZW1wIHN0YXR1cyB2YXJpYWJsZSAqLworCXhmc19hZ2Jsb2NrX3QJcmJubzsJCS8qIHJldHVybmVkIGJsb2NrIG51bWJlciAqLworCXhmc19leHRsZW5fdAlybGVuOwkJLyogbGVuZ3RoIG9mIHJldHVybmVkIGV4dGVudCAqLworCisJLyoKKwkgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIGN1cnNvciBmb3IgdGhlIGJ5LXNpemUgYnRyZWUuCisJICovCisJY250X2N1ciA9IHhmc19idHJlZV9pbml0X2N1cnNvcihhcmdzLT5tcCwgYXJncy0+dHAsIGFyZ3MtPmFnYnAsCisJCWFyZ3MtPmFnbm8sIFhGU19CVE5VTV9DTlQsIE5VTEwsIDApOworCWJub19jdXIgPSBOVUxMOworCS8qCisJICogTG9vayBmb3IgYW4gZW50cnkgPj0gbWF4bGVuK2FsaWdubWVudC0xIGJsb2Nrcy4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2FsbG9jX2xvb2t1cF9nZShjbnRfY3VyLCAwLAorCQkJYXJncy0+bWF4bGVuICsgYXJncy0+YWxpZ25tZW50IC0gMSwgJmkpKSkKKwkJZ290byBlcnJvcjA7CisJLyoKKwkgKiBJZiBub25lLCB0aGVuIHBpY2sgdXAgdGhlIGxhc3QgZW50cnkgaW4gdGhlIHRyZWUgdW5sZXNzIHRoZQorCSAqIHRyZWUgaXMgZW1wdHkuCisJICovCisJaWYgKCFpKSB7CisJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfYWdfdmV4dGVudF9zbWFsbChhcmdzLCBjbnRfY3VyLCAmZmJubywKKwkJCQkmZmxlbiwgJmkpKSkKKwkJCWdvdG8gZXJyb3IwOworCQlpZiAoaSA9PSAwIHx8IGZsZW4gPT0gMCkgeworCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY250X2N1ciwgWEZTX0JUUkVFX05PRVJST1IpOworCQkJVFJBQ0VfQUxMT0MoIm5vZW50cnkiLCBhcmdzKTsKKwkJCXJldHVybiAwOworCQl9CisJCUFTU0VSVChpID09IDEpOworCX0KKwkvKgorCSAqIFRoZXJlJ3MgYSBmcmVlc3BhY2UgYXMgYmlnIGFzIG1heGxlbithbGlnbm1lbnQtMSwgZ2V0IGl0LgorCSAqLworCWVsc2UgeworCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2dldF9yZWMoY250X2N1ciwgJmZibm8sICZmbGVuLCAmaSkpKQorCQkJZ290byBlcnJvcjA7CisJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKwl9CisJLyoKKwkgKiBJbiB0aGUgZmlyc3QgY2FzZSBhYm92ZSwgd2UgZ290IHRoZSBsYXN0IGVudHJ5IGluIHRoZQorCSAqIGJ5LXNpemUgYnRyZWUuICBOb3cgd2UgY2hlY2sgdG8gc2VlIGlmIHRoZSBzcGFjZSBoaXRzIG1heGxlbgorCSAqIG9uY2UgYWxpZ25lZDsgaWYgbm90LCB3ZSBzZWFyY2ggbGVmdCBmb3Igc29tZXRoaW5nIGJldHRlci4KKwkgKiBUaGlzIGNhbid0IGhhcHBlbiBpbiB0aGUgc2Vjb25kIGNhc2UgYWJvdmUuCisJICovCisJeGZzX2FsbG9jX2NvbXB1dGVfYWxpZ25lZChmYm5vLCBmbGVuLCBhcmdzLT5hbGlnbm1lbnQsIGFyZ3MtPm1pbmxlbiwKKwkJJnJibm8sICZybGVuKTsKKwlybGVuID0gWEZTX0VYVExFTl9NSU4oYXJncy0+bWF4bGVuLCBybGVuKTsKKwlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhybGVuID09IDAgfHwKKwkJCShybGVuIDw9IGZsZW4gJiYgcmJubyArIHJsZW4gPD0gZmJubyArIGZsZW4pLCBlcnJvcjApOworCWlmIChybGVuIDwgYXJncy0+bWF4bGVuKSB7CisJCXhmc19hZ2Jsb2NrX3QJYmVzdGZibm87CisJCXhmc19leHRsZW5fdAliZXN0ZmxlbjsKKwkJeGZzX2FnYmxvY2tfdAliZXN0cmJubzsKKwkJeGZzX2V4dGxlbl90CWJlc3RybGVuOworCisJCWJlc3RybGVuID0gcmxlbjsKKwkJYmVzdHJibm8gPSByYm5vOworCQliZXN0ZmxlbiA9IGZsZW47CisJCWJlc3RmYm5vID0gZmJubzsKKwkJZm9yICg7OykgeworCQkJaWYgKChlcnJvciA9IHhmc19hbGxvY19kZWNyZW1lbnQoY250X2N1ciwgMCwgJmkpKSkKKwkJCQlnb3RvIGVycm9yMDsKKwkJCWlmIChpID09IDApCisJCQkJYnJlYWs7CisJCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2dldF9yZWMoY250X2N1ciwgJmZibm8sICZmbGVuLAorCQkJCQkmaSkpKQorCQkJCWdvdG8gZXJyb3IwOworCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCQkJaWYgKGZsZW4gPCBiZXN0cmxlbikKKwkJCQlicmVhazsKKwkJCXhmc19hbGxvY19jb21wdXRlX2FsaWduZWQoZmJubywgZmxlbiwgYXJncy0+YWxpZ25tZW50LAorCQkJCWFyZ3MtPm1pbmxlbiwgJnJibm8sICZybGVuKTsKKwkJCXJsZW4gPSBYRlNfRVhUTEVOX01JTihhcmdzLT5tYXhsZW4sIHJsZW4pOworCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8ocmxlbiA9PSAwIHx8CisJCQkJKHJsZW4gPD0gZmxlbiAmJiByYm5vICsgcmxlbiA8PSBmYm5vICsgZmxlbiksCisJCQkJZXJyb3IwKTsKKwkJCWlmIChybGVuID4gYmVzdHJsZW4pIHsKKwkJCQliZXN0cmxlbiA9IHJsZW47CisJCQkJYmVzdHJibm8gPSByYm5vOworCQkJCWJlc3RmbGVuID0gZmxlbjsKKwkJCQliZXN0ZmJubyA9IGZibm87CisJCQkJaWYgKHJsZW4gPT0gYXJncy0+bWF4bGVuKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2xvb2t1cF9lcShjbnRfY3VyLCBiZXN0ZmJubywgYmVzdGZsZW4sCisJCQkJJmkpKSkKKwkJCWdvdG8gZXJyb3IwOworCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCXJsZW4gPSBiZXN0cmxlbjsKKwkJcmJubyA9IGJlc3RyYm5vOworCQlmbGVuID0gYmVzdGZsZW47CisJCWZibm8gPSBiZXN0ZmJubzsKKwl9CisJYXJncy0+d2FzZnJvbWZsID0gMDsKKwkvKgorCSAqIEZpeCB1cCB0aGUgbGVuZ3RoLgorCSAqLworCWFyZ3MtPmxlbiA9IHJsZW47CisJeGZzX2FsbG9jX2ZpeF9sZW4oYXJncyk7CisJaWYgKHJsZW4gPCBhcmdzLT5taW5sZW4gfHwgIXhmc19hbGxvY19maXhfbWlubGVmdChhcmdzKSkgeworCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihjbnRfY3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CisJCVRSQUNFX0FMTE9DKCJub21pbmxlZnQiLCBhcmdzKTsKKwkJYXJncy0+YWdibm8gPSBOVUxMQUdCTE9DSzsKKwkJcmV0dXJuIDA7CisJfQorCXJsZW4gPSBhcmdzLT5sZW47CisJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8ocmxlbiA8PSBmbGVuLCBlcnJvcjApOworCS8qCisJICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBjdXJzb3IgZm9yIHRoZSBieS1ibG9jayB0cmVlLgorCSAqLworCWJub19jdXIgPSB4ZnNfYnRyZWVfaW5pdF9jdXJzb3IoYXJncy0+bXAsIGFyZ3MtPnRwLCBhcmdzLT5hZ2JwLAorCQlhcmdzLT5hZ25vLCBYRlNfQlROVU1fQk5PLCBOVUxMLCAwKTsKKwlpZiAoKGVycm9yID0geGZzX2FsbG9jX2ZpeHVwX3RyZWVzKGNudF9jdXIsIGJub19jdXIsIGZibm8sIGZsZW4sCisJCQlyYm5vLCBybGVuLCBYRlNBX0ZJWFVQX0NOVF9PSykpKQorCQlnb3RvIGVycm9yMDsKKwl4ZnNfYnRyZWVfZGVsX2N1cnNvcihjbnRfY3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CisJeGZzX2J0cmVlX2RlbF9jdXJzb3IoYm5vX2N1ciwgWEZTX0JUUkVFX05PRVJST1IpOworCWNudF9jdXIgPSBibm9fY3VyID0gTlVMTDsKKwlhcmdzLT5sZW4gPSBybGVuOworCWFyZ3MtPmFnYm5vID0gcmJubzsKKwlYRlNfV0FOVF9DT1JSVVBURURfR09UTygKKwkJYXJncy0+YWdibm8gKyBhcmdzLT5sZW4gPD0KKwkJCUlOVF9HRVQoWEZTX0JVRl9UT19BR0YoYXJncy0+YWdicCktPmFnZl9sZW5ndGgsCisJCQlBUkNIX0NPTlZFUlQpLAorCQllcnJvcjApOworCVRSQUNFX0FMTE9DKCJub3JtYWwiLCBhcmdzKTsKKwlyZXR1cm4gMDsKKworZXJyb3IwOgorCVRSQUNFX0FMTE9DKCJlcnJvciIsIGFyZ3MpOworCWlmIChjbnRfY3VyKQorCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihjbnRfY3VyLCBYRlNfQlRSRUVfRVJST1IpOworCWlmIChibm9fY3VyKQorCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihibm9fY3VyLCBYRlNfQlRSRUVfRVJST1IpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIERlYWwgd2l0aCB0aGUgY2FzZSB3aGVyZSBvbmx5IHNtYWxsIGZyZWVzcGFjZXMgcmVtYWluLgorICogRWl0aGVyIHJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIGxhc3QgZnJlZXNwYWNlIHJlY29yZCwKKyAqIG9yIGFsbG9jYXRlIHNwYWNlIGZyb20gdGhlIGZyZWVsaXN0IGlmIHRoZXJlIGlzIG5vdGhpbmcgaW4gdGhlIHRyZWUuCisgKi8KK1NUQVRJQyBpbnQJCQkvKiBlcnJvciAqLworeGZzX2FsbG9jX2FnX3ZleHRlbnRfc21hbGwoCisJeGZzX2FsbG9jX2FyZ190CSphcmdzLAkvKiBhbGxvY2F0aW9uIGFyZ3VtZW50IHN0cnVjdHVyZSAqLworCXhmc19idHJlZV9jdXJfdAkqY2N1ciwJLyogYnktc2l6ZSBjdXJzb3IgKi8KKwl4ZnNfYWdibG9ja190CSpmYm5vcCwJLyogcmVzdWx0IGJsb2NrIG51bWJlciAqLworCXhmc19leHRsZW5fdAkqZmxlbnAsCS8qIHJlc3VsdCBsZW5ndGggKi8KKwlpbnQJCSpzdGF0KQkvKiBzdGF0dXM6IDAtZnJlZWxpc3QsIDEtbm9ybWFsL25vbmUgKi8KK3sKKwlpbnQJCWVycm9yOworCXhmc19hZ2Jsb2NrX3QJZmJubzsKKwl4ZnNfZXh0bGVuX3QJZmxlbjsKKyNpZmRlZiBYRlNfQUxMT0NfVFJBQ0UKKwlzdGF0aWMgY2hhcglmbmFtZVtdID0gInhmc19hbGxvY19hZ192ZXh0ZW50X3NtYWxsIjsKKyNlbmRpZgorCWludAkJaTsKKworCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfZGVjcmVtZW50KGNjdXIsIDAsICZpKSkpCisJCWdvdG8gZXJyb3IwOworCWlmIChpKSB7CisJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfZ2V0X3JlYyhjY3VyLCAmZmJubywgJmZsZW4sICZpKSkpCisJCQlnb3RvIGVycm9yMDsKKwkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCX0KKwkvKgorCSAqIE5vdGhpbmcgaW4gdGhlIGJ0cmVlLCB0cnkgdGhlIGZyZWVsaXN0LiAgTWFrZSBzdXJlCisJICogdG8gcmVzcGVjdCBtaW5sZWZ0IGV2ZW4gd2hlbiBwdWxsaW5nIGZyb20gdGhlCisJICogZnJlZWxpc3QuCisJICovCisJZWxzZSBpZiAoYXJncy0+bWlubGVuID09IDEgJiYgYXJncy0+YWxpZ25tZW50ID09IDEgJiYgIWFyZ3MtPmlzZmwgJiYKKwkJIChJTlRfR0VUKFhGU19CVUZfVE9fQUdGKGFyZ3MtPmFnYnApLT5hZ2ZfZmxjb3VudCwKKwkJCUFSQ0hfQ09OVkVSVCkgPiBhcmdzLT5taW5sZWZ0KSkgeworCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2dldF9mcmVlbGlzdChhcmdzLT50cCwgYXJncy0+YWdicCwgJmZibm8pKSkKKwkJCWdvdG8gZXJyb3IwOworCQlpZiAoZmJubyAhPSBOVUxMQUdCTE9DSykgeworCQkJaWYgKGFyZ3MtPnVzZXJkYXRhKSB7CisJCQkJeGZzX2J1Zl90CSpicDsKKworCQkJCWJwID0geGZzX2J0cmVlX2dldF9idWZzKGFyZ3MtPm1wLCBhcmdzLT50cCwKKwkJCQkJYXJncy0+YWdubywgZmJubywgMCk7CisJCQkJeGZzX3RyYW5zX2JpbnZhbChhcmdzLT50cCwgYnApOworCQkJfQorCQkJYXJncy0+bGVuID0gMTsKKwkJCWFyZ3MtPmFnYm5vID0gZmJubzsKKwkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKAorCQkJCWFyZ3MtPmFnYm5vICsgYXJncy0+bGVuIDw9CisJCQkJSU5UX0dFVChYRlNfQlVGX1RPX0FHRihhcmdzLT5hZ2JwKS0+YWdmX2xlbmd0aCwKKwkJCQkJQVJDSF9DT05WRVJUKSwKKwkJCQllcnJvcjApOworCQkJYXJncy0+d2FzZnJvbWZsID0gMTsKKwkJCVRSQUNFX0FMTE9DKCJmcmVlbGlzdCIsIGFyZ3MpOworCQkJKnN0YXQgPSAwOworCQkJcmV0dXJuIDA7CisJCX0KKwkJLyoKKwkJICogTm90aGluZyBpbiB0aGUgZnJlZWxpc3QuCisJCSAqLworCQllbHNlCisJCQlmbGVuID0gMDsKKwl9CisJLyoKKwkgKiBDYW4ndCBhbGxvY2F0ZSBmcm9tIHRoZSBmcmVlbGlzdCBmb3Igc29tZSByZWFzb24uCisJICovCisJZWxzZQorCQlmbGVuID0gMDsKKwkvKgorCSAqIENhbid0IGRvIHRoZSBhbGxvY2F0aW9uLCBnaXZlIHVwLgorCSAqLworCWlmIChmbGVuIDwgYXJncy0+bWlubGVuKSB7CisJCWFyZ3MtPmFnYm5vID0gTlVMTEFHQkxPQ0s7CisJCVRSQUNFX0FMTE9DKCJub3Rlbm91Z2giLCBhcmdzKTsKKwkJZmxlbiA9IDA7CisJfQorCSpmYm5vcCA9IGZibm87CisJKmZsZW5wID0gZmxlbjsKKwkqc3RhdCA9IDE7CisJVFJBQ0VfQUxMT0MoIm5vcm1hbCIsIGFyZ3MpOworCXJldHVybiAwOworCitlcnJvcjA6CisJVFJBQ0VfQUxMT0MoImVycm9yIiwgYXJncyk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogRnJlZSB0aGUgZXh0ZW50IHN0YXJ0aW5nIGF0IGFnbm8vYm5vIGZvciBsZW5ndGguCisgKi8KK1NUQVRJQyBpbnQJCQkvKiBlcnJvciAqLworeGZzX2ZyZWVfYWdfZXh0ZW50KAorCXhmc190cmFuc190CSp0cCwJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19idWZfdAkqYWdicCwJLyogYnVmZmVyIGZvciBhLmcuIGZyZWVsaXN0IGhlYWRlciAqLworCXhmc19hZ251bWJlcl90CWFnbm8sCS8qIGFsbG9jYXRpb24gZ3JvdXAgbnVtYmVyICovCisJeGZzX2FnYmxvY2tfdAlibm8sCS8qIHN0YXJ0aW5nIGJsb2NrIG51bWJlciAqLworCXhmc19leHRsZW5fdAlsZW4sCS8qIGxlbmd0aCBvZiBleHRlbnQgKi8KKwlpbnQJCWlzZmwpCS8qIHNldCBpZiBpcyBmcmVlbGlzdCBibG9ja3MgLSBubyBzYiBhY2N0ZyAqLworeworCXhmc19idHJlZV9jdXJfdAkqYm5vX2N1cjsJLyogY3Vyc29yIGZvciBieS1ibG9jayBidHJlZSAqLworCXhmc19idHJlZV9jdXJfdAkqY250X2N1cjsJLyogY3Vyc29yIGZvciBieS1zaXplIGJ0cmVlICovCisJaW50CQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworI2lmZGVmIFhGU19BTExPQ19UUkFDRQorCXN0YXRpYyBjaGFyCWZuYW1lW10gPSAieGZzX2ZyZWVfYWdfZXh0ZW50IjsKKyNlbmRpZgorCXhmc19hZ2Jsb2NrX3QJZ3Ribm87CQkvKiBzdGFydCBvZiByaWdodCBuZWlnaGJvciBibG9jayAqLworCXhmc19leHRsZW5fdAlndGxlbjsJCS8qIGxlbmd0aCBvZiByaWdodCBuZWlnaGJvciBibG9jayAqLworCWludAkJaGF2ZWxlZnQ7CS8qIGhhdmUgYSBsZWZ0IG5laWdoYm9yIGJsb2NrICovCisJaW50CQloYXZlcmlnaHQ7CS8qIGhhdmUgYSByaWdodCBuZWlnaGJvciBibG9jayAqLworCWludAkJaTsJCS8qIHRlbXAsIHJlc3VsdCBjb2RlICovCisJeGZzX2FnYmxvY2tfdAlsdGJubzsJCS8qIHN0YXJ0IG9mIGxlZnQgbmVpZ2hib3IgYmxvY2sgKi8KKwl4ZnNfZXh0bGVuX3QJbHRsZW47CQkvKiBsZW5ndGggb2YgbGVmdCBuZWlnaGJvciBibG9jayAqLworCXhmc19tb3VudF90CSptcDsJCS8qIG1vdW50IHBvaW50IHN0cnVjdCBmb3IgZmlsZXN5c3RlbSAqLworCXhmc19hZ2Jsb2NrX3QJbmJubzsJCS8qIG5ldyBzdGFydGluZyBibG9jayBvZiBmcmVlc3BhY2UgKi8KKwl4ZnNfZXh0bGVuX3QJbmxlbjsJCS8qIG5ldyBsZW5ndGggb2YgZnJlZXNwYWNlICovCisKKwltcCA9IHRwLT50X21vdW50cDsKKwkvKgorCSAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgY3Vyc29yIGZvciB0aGUgYnktYmxvY2sgYnRyZWUuCisJICovCisJYm5vX2N1ciA9IHhmc19idHJlZV9pbml0X2N1cnNvcihtcCwgdHAsIGFnYnAsIGFnbm8sIFhGU19CVE5VTV9CTk8sIE5VTEwsCisJCTApOworCWNudF9jdXIgPSBOVUxMOworCS8qCisJICogTG9vayBmb3IgYSBuZWlnaGJvcmluZyBibG9jayBvbiB0aGUgbGVmdCAobG93ZXIgYmxvY2sgbnVtYmVycykKKwkgKiB0aGF0IGlzIGNvbnRpZ3VvdXMgd2l0aCB0aGlzIHNwYWNlLgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfbG9va3VwX2xlKGJub19jdXIsIGJubywgbGVuLCAmaGF2ZWxlZnQpKSkKKwkJZ290byBlcnJvcjA7CisJaWYgKGhhdmVsZWZ0KSB7CisJCS8qCisJCSAqIFRoZXJlIGlzIGEgYmxvY2sgdG8gb3VyIGxlZnQuCisJCSAqLworCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2dldF9yZWMoYm5vX2N1ciwgJmx0Ym5vLCAmbHRsZW4sICZpKSkpCisJCQlnb3RvIGVycm9yMDsKKwkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCQkvKgorCQkgKiBJdCdzIG5vdCBjb250aWd1b3VzLCB0aG91Z2guCisJCSAqLworCQlpZiAobHRibm8gKyBsdGxlbiA8IGJubykKKwkJCWhhdmVsZWZ0ID0gMDsKKwkJZWxzZSB7CisJCQkvKgorCQkJICogSWYgdGhpcyBmYWlsdXJlIGhhcHBlbnMgdGhlIHJlcXVlc3QgdG8gZnJlZSB0aGlzCisJCQkgKiBzcGFjZSB3YXMgaW52YWxpZCwgaXQncyAocGFydGx5KSBhbHJlYWR5IGZyZWUuCisJCQkgKiBWZXJ5IGJhZC4KKwkJCSAqLworCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8obHRibm8gKyBsdGxlbiA8PSBibm8sIGVycm9yMCk7CisJCX0KKwl9CisJLyoKKwkgKiBMb29rIGZvciBhIG5laWdoYm9yaW5nIGJsb2NrIG9uIHRoZSByaWdodCAoaGlnaGVyIGJsb2NrIG51bWJlcnMpCisJICogdGhhdCBpcyBjb250aWd1b3VzIHdpdGggdGhpcyBzcGFjZS4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2FsbG9jX2luY3JlbWVudChibm9fY3VyLCAwLCAmaGF2ZXJpZ2h0KSkpCisJCWdvdG8gZXJyb3IwOworCWlmIChoYXZlcmlnaHQpIHsKKwkJLyoKKwkJICogVGhlcmUgaXMgYSBibG9jayB0byBvdXIgcmlnaHQuCisJCSAqLworCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2dldF9yZWMoYm5vX2N1ciwgJmd0Ym5vLCAmZ3RsZW4sICZpKSkpCisJCQlnb3RvIGVycm9yMDsKKwkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCQkvKgorCQkgKiBJdCdzIG5vdCBjb250aWd1b3VzLCB0aG91Z2guCisJCSAqLworCQlpZiAoYm5vICsgbGVuIDwgZ3Ribm8pCisJCQloYXZlcmlnaHQgPSAwOworCQllbHNlIHsKKwkJCS8qCisJCQkgKiBJZiB0aGlzIGZhaWx1cmUgaGFwcGVucyB0aGUgcmVxdWVzdCB0byBmcmVlIHRoaXMKKwkJCSAqIHNwYWNlIHdhcyBpbnZhbGlkLCBpdCdzIChwYXJ0bHkpIGFscmVhZHkgZnJlZS4KKwkJCSAqIFZlcnkgYmFkLgorCQkJICovCisJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhndGJubyA+PSBibm8gKyBsZW4sIGVycm9yMCk7CisJCX0KKwl9CisJLyoKKwkgKiBOb3cgYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBjdXJzb3IgZm9yIHRoZSBieS1zaXplIHRyZWUuCisJICovCisJY250X2N1ciA9IHhmc19idHJlZV9pbml0X2N1cnNvcihtcCwgdHAsIGFnYnAsIGFnbm8sIFhGU19CVE5VTV9DTlQsIE5VTEwsCisJCTApOworCS8qCisJICogSGF2ZSBib3RoIGxlZnQgYW5kIHJpZ2h0IGNvbnRpZ3VvdXMgbmVpZ2hib3JzLgorCSAqIE1lcmdlIGFsbCB0aHJlZSBpbnRvIGEgc2luZ2xlIGZyZWUgYmxvY2suCisJICovCisJaWYgKGhhdmVsZWZ0ICYmIGhhdmVyaWdodCkgeworCQkvKgorCQkgKiBEZWxldGUgdGhlIG9sZCBieS1zaXplIGVudHJ5IG9uIHRoZSBsZWZ0LgorCQkgKi8KKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19sb29rdXBfZXEoY250X2N1ciwgbHRibm8sIGx0bGVuLCAmaSkpKQorCQkJZ290byBlcnJvcjA7CisJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19kZWxldGUoY250X2N1ciwgJmkpKSkKKwkJCWdvdG8gZXJyb3IwOworCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCS8qCisJCSAqIERlbGV0ZSB0aGUgb2xkIGJ5LXNpemUgZW50cnkgb24gdGhlIHJpZ2h0LgorCQkgKi8KKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19sb29rdXBfZXEoY250X2N1ciwgZ3Ribm8sIGd0bGVuLCAmaSkpKQorCQkJZ290byBlcnJvcjA7CisJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19kZWxldGUoY250X2N1ciwgJmkpKSkKKwkJCWdvdG8gZXJyb3IwOworCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCS8qCisJCSAqIERlbGV0ZSB0aGUgb2xkIGJ5LWJsb2NrIGVudHJ5IGZvciB0aGUgcmlnaHQgYmxvY2suCisJCSAqLworCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2RlbGV0ZShibm9fY3VyLCAmaSkpKQorCQkJZ290byBlcnJvcjA7CisJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKwkJLyoKKwkJICogTW92ZSB0aGUgYnktYmxvY2sgY3Vyc29yIGJhY2sgdG8gdGhlIGxlZnQgbmVpZ2hib3IuCisJCSAqLworCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2RlY3JlbWVudChibm9fY3VyLCAwLCAmaSkpKQorCQkJZ290byBlcnJvcjA7CisJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKyNpZmRlZiBERUJVRworCQkvKgorCQkgKiBDaGVjayB0aGF0IHRoaXMgaXMgdGhlIHJpZ2h0IHJlY29yZDogZGVsZXRlIGRpZG4ndAorCQkgKiBtYW5nbGUgdGhlIGN1cnNvci4KKwkJICovCisJCXsKKwkJCXhmc19hZ2Jsb2NrX3QJeHhibm87CisJCQl4ZnNfZXh0bGVuX3QJeHhsZW47CisKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfZ2V0X3JlYyhibm9fY3VyLCAmeHhibm8sICZ4eGxlbiwKKwkJCQkJJmkpKSkKKwkJCQlnb3RvIGVycm9yMDsKKwkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKAorCQkJCWkgPT0gMSAmJiB4eGJubyA9PSBsdGJubyAmJiB4eGxlbiA9PSBsdGxlbiwKKwkJCQllcnJvcjApOworCQl9CisjZW5kaWYKKwkJLyoKKwkJICogVXBkYXRlIHJlbWFpbmluZyBieS1ibG9jayBlbnRyeSB0byB0aGUgbmV3LCBqb2luZWQgYmxvY2suCisJCSAqLworCQluYm5vID0gbHRibm87CisJCW5sZW4gPSBsZW4gKyBsdGxlbiArIGd0bGVuOworCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX3VwZGF0ZShibm9fY3VyLCBuYm5vLCBubGVuKSkpCisJCQlnb3RvIGVycm9yMDsKKwl9CisJLyoKKwkgKiBIYXZlIG9ubHkgYSBsZWZ0IGNvbnRpZ3VvdXMgbmVpZ2hib3IuCisJICogTWVyZ2UgaXQgdG9nZXRoZXIgd2l0aCB0aGUgbmV3IGZyZWVzcGFjZS4KKwkgKi8KKwllbHNlIGlmIChoYXZlbGVmdCkgeworCQkvKgorCQkgKiBEZWxldGUgdGhlIG9sZCBieS1zaXplIGVudHJ5IG9uIHRoZSBsZWZ0LgorCQkgKi8KKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19sb29rdXBfZXEoY250X2N1ciwgbHRibm8sIGx0bGVuLCAmaSkpKQorCQkJZ290byBlcnJvcjA7CisJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19kZWxldGUoY250X2N1ciwgJmkpKSkKKwkJCWdvdG8gZXJyb3IwOworCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCS8qCisJCSAqIEJhY2sgdXAgdGhlIGJ5LWJsb2NrIGN1cnNvciB0byB0aGUgbGVmdCBuZWlnaGJvciwgYW5kCisJCSAqIHVwZGF0ZSBpdHMgbGVuZ3RoLgorCQkgKi8KKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19kZWNyZW1lbnQoYm5vX2N1ciwgMCwgJmkpKSkKKwkJCWdvdG8gZXJyb3IwOworCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCW5ibm8gPSBsdGJubzsKKwkJbmxlbiA9IGxlbiArIGx0bGVuOworCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX3VwZGF0ZShibm9fY3VyLCBuYm5vLCBubGVuKSkpCisJCQlnb3RvIGVycm9yMDsKKwl9CisJLyoKKwkgKiBIYXZlIG9ubHkgYSByaWdodCBjb250aWd1b3VzIG5laWdoYm9yLgorCSAqIE1lcmdlIGl0IHRvZ2V0aGVyIHdpdGggdGhlIG5ldyBmcmVlc3BhY2UuCisJICovCisJZWxzZSBpZiAoaGF2ZXJpZ2h0KSB7CisJCS8qCisJCSAqIERlbGV0ZSB0aGUgb2xkIGJ5LXNpemUgZW50cnkgb24gdGhlIHJpZ2h0LgorCQkgKi8KKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19sb29rdXBfZXEoY250X2N1ciwgZ3Ribm8sIGd0bGVuLCAmaSkpKQorCQkJZ290byBlcnJvcjA7CisJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19kZWxldGUoY250X2N1ciwgJmkpKSkKKwkJCWdvdG8gZXJyb3IwOworCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCS8qCisJCSAqIFVwZGF0ZSB0aGUgc3RhcnRpbmcgYmxvY2sgYW5kIGxlbmd0aCBvZiB0aGUgcmlnaHQKKwkJICogbmVpZ2hib3IgaW4gdGhlIGJ5LWJsb2NrIHRyZWUuCisJCSAqLworCQluYm5vID0gYm5vOworCQlubGVuID0gbGVuICsgZ3RsZW47CisJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfdXBkYXRlKGJub19jdXIsIG5ibm8sIG5sZW4pKSkKKwkJCWdvdG8gZXJyb3IwOworCX0KKwkvKgorCSAqIE5vIGNvbnRpZ3VvdXMgbmVpZ2hib3JzLgorCSAqIEluc2VydCB0aGUgbmV3IGZyZWVzcGFjZSBpbnRvIHRoZSBieS1ibG9jayB0cmVlLgorCSAqLworCWVsc2UgeworCQluYm5vID0gYm5vOworCQlubGVuID0gbGVuOworCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2luc2VydChibm9fY3VyLCAmaSkpKQorCQkJZ290byBlcnJvcjA7CisJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKwl9CisJeGZzX2J0cmVlX2RlbF9jdXJzb3IoYm5vX2N1ciwgWEZTX0JUUkVFX05PRVJST1IpOworCWJub19jdXIgPSBOVUxMOworCS8qCisJICogSW4gYWxsIGNhc2VzIHdlIG5lZWQgdG8gaW5zZXJ0IHRoZSBuZXcgZnJlZXNwYWNlIGluIHRoZSBieS1zaXplIHRyZWUuCisJICovCisJaWYgKChlcnJvciA9IHhmc19hbGxvY19sb29rdXBfZXEoY250X2N1ciwgbmJubywgbmxlbiwgJmkpKSkKKwkJZ290byBlcnJvcjA7CisJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAwLCBlcnJvcjApOworCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfaW5zZXJ0KGNudF9jdXIsICZpKSkpCisJCWdvdG8gZXJyb3IwOworCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKwl4ZnNfYnRyZWVfZGVsX2N1cnNvcihjbnRfY3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CisJY250X2N1ciA9IE5VTEw7CisJLyoKKwkgKiBVcGRhdGUgdGhlIGZyZWVzcGFjZSB0b3RhbHMgaW4gdGhlIGFnIGFuZCBzdXBlcmJsb2NrLgorCSAqLworCXsKKwkJeGZzX2FnZl90CSphZ2Y7CisJCXhmc19wZXJhZ190CSpwYWc7CQkvKiBwZXIgYWxsb2NhdGlvbiBncm91cCBkYXRhICovCisKKwkJYWdmID0gWEZTX0JVRl9UT19BR0YoYWdicCk7CisJCXBhZyA9ICZtcC0+bV9wZXJhZ1thZ25vXTsKKwkJSU5UX01PRChhZ2YtPmFnZl9mcmVlYmxrcywgQVJDSF9DT05WRVJULCBsZW4pOworCQl4ZnNfdHJhbnNfYWdibG9ja3NfZGVsdGEodHAsIGxlbik7CisJCXBhZy0+cGFnZl9mcmVlYmxrcyArPSBsZW47CisJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKAorCQkJSU5UX0dFVChhZ2YtPmFnZl9mcmVlYmxrcywgQVJDSF9DT05WRVJUKQorCQkJCTw9IElOVF9HRVQoYWdmLT5hZ2ZfbGVuZ3RoLCBBUkNIX0NPTlZFUlQpLAorCQkJZXJyb3IwKTsKKwkJVFJBQ0VfTU9EQUdGKE5VTEwsIGFnZiwgWEZTX0FHRl9GUkVFQkxLUyk7CisJCXhmc19hbGxvY19sb2dfYWdmKHRwLCBhZ2JwLCBYRlNfQUdGX0ZSRUVCTEtTKTsKKwkJaWYgKCFpc2ZsKQorCQkJeGZzX3RyYW5zX21vZF9zYih0cCwgWEZTX1RSQU5TX1NCX0ZEQkxPQ0tTLCAobG9uZylsZW4pOworCQlYRlNfU1RBVFNfSU5DKHhzX2ZyZWV4KTsKKwkJWEZTX1NUQVRTX0FERCh4c19mcmVlYiwgbGVuKTsKKwl9CisJVFJBQ0VfRlJFRShoYXZlbGVmdCA/CisJCQkoaGF2ZXJpZ2h0ID8gImJvdGgiIDogImxlZnQiKSA6CisJCQkoaGF2ZXJpZ2h0ID8gInJpZ2h0IiA6ICJub25lIiksCisJCWFnbm8sIGJubywgbGVuLCBpc2ZsKTsKKworCS8qCisJICogU2luY2UgYmxvY2tzIG1vdmUgdG8gdGhlIGZyZWUgbGlzdCB3aXRob3V0IHRoZSBjb29yZGluYXRpb24KKwkgKiB1c2VkIGluIHhmc19ibWFwX2ZpbmlzaCwgd2UgY2FuJ3QgYWxsb3cgYmxvY2sgdG8gYmUgYXZhaWxhYmxlCisJICogZm9yIHJlYWxsb2NhdGlvbiBhbmQgbm9uLXRyYW5zYWN0aW9uIHdyaXRpbmcgKHVzZXIgZGF0YSkKKwkgKiB1bnRpbCB3ZSBrbm93IHRoYXQgdGhlIHRyYW5zYWN0aW9uIHRoYXQgbW92ZWQgaXQgdG8gdGhlIGZyZWUKKwkgKiBsaXN0IGlzIHBlcm1hbmVudGx5IG9uIGRpc2suICBXZSB0cmFjayB0aGUgYmxvY2tzIGJ5IGRlY2xhcmluZworCSAqIHRoZXNlIGJsb2NrcyBhcyAiYnVzeSI7IHRoZSBidXN5IGxpc3QgaXMgbWFpbnRhaW5lZCBvbiBhIHBlci1hZworCSAqIGJhc2lzIGFuZCBlYWNoIHRyYW5zYWN0aW9uIHJlY29yZHMgd2hpY2ggZW50cmllcyBzaG91bGQgYmUgcmVtb3ZlZAorCSAqIHdoZW4gdGhlIGljbG9nIGNvbW1pdHMgdG8gZGlzay4gIElmIGEgYnVzeSBibG9jayBpcyBhbGxvY2F0ZWQsCisJICogdGhlIGljbG9nIGlzIHB1c2hlZCB1cCB0byB0aGUgTFNOIHRoYXQgZnJlZWQgdGhlIGJsb2NrLgorCSAqLworCXhmc19hbGxvY19tYXJrX2J1c3kodHAsIGFnbm8sIGJubywgbGVuKTsKKwlyZXR1cm4gMDsKKworIGVycm9yMDoKKwlUUkFDRV9GUkVFKCJlcnJvciIsIGFnbm8sIGJubywgbGVuLCBpc2ZsKTsKKwlpZiAoYm5vX2N1cikKKwkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoYm5vX2N1ciwgWEZTX0JUUkVFX0VSUk9SKTsKKwlpZiAoY250X2N1cikKKwkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY250X2N1ciwgWEZTX0JUUkVFX0VSUk9SKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBWaXNpYmxlIChleHBvcnRlZCkgYWxsb2NhdGlvbi9mcmVlIGZ1bmN0aW9ucy4KKyAqIFNvbWUgb2YgdGhlc2UgYXJlIHVzZWQganVzdCBieSB4ZnNfYWxsb2NfYnRyZWUuYyBhbmQgdGhpcyBmaWxlLgorICovCisKKy8qCisgKiBDb21wdXRlIGFuZCBmaWxsIGluIHZhbHVlIG9mIG1fYWdfbWF4bGV2ZWxzLgorICovCit2b2lkCit4ZnNfYWxsb2NfY29tcHV0ZV9tYXhsZXZlbHMoCisJeGZzX21vdW50X3QJKm1wKQkvKiBmaWxlIHN5c3RlbSBtb3VudCBzdHJ1Y3R1cmUgKi8KK3sKKwlpbnQJCWxldmVsOworCXVpbnQJCW1heGJsb2NrczsKKwl1aW50CQltYXhsZWFmZW50czsKKwlpbnQJCW1pbmxlYWZyZWNzOworCWludAkJbWlubm9kZXJlY3M7CisKKwltYXhsZWFmZW50cyA9IChtcC0+bV9zYi5zYl9hZ2Jsb2NrcyArIDEpIC8gMjsKKwltaW5sZWFmcmVjcyA9IG1wLT5tX2FsbG9jX21uclswXTsKKwltaW5ub2RlcmVjcyA9IG1wLT5tX2FsbG9jX21uclsxXTsKKwltYXhibG9ja3MgPSAobWF4bGVhZmVudHMgKyBtaW5sZWFmcmVjcyAtIDEpIC8gbWlubGVhZnJlY3M7CisJZm9yIChsZXZlbCA9IDE7IG1heGJsb2NrcyA+IDE7IGxldmVsKyspCisJCW1heGJsb2NrcyA9IChtYXhibG9ja3MgKyBtaW5ub2RlcmVjcyAtIDEpIC8gbWlubm9kZXJlY3M7CisJbXAtPm1fYWdfbWF4bGV2ZWxzID0gbGV2ZWw7Cit9CisKKy8qCisgKiBEZWNpZGUgd2hldGhlciB0byB1c2UgdGhpcyBhbGxvY2F0aW9uIGdyb3VwIGZvciB0aGlzIGFsbG9jYXRpb24uCisgKiBJZiBzbywgZml4IHVwIHRoZSBidHJlZSBmcmVlbGlzdCdzIHNpemUuCisgKi8KK1NUQVRJQyBpbnQJCQkvKiBlcnJvciAqLworeGZzX2FsbG9jX2ZpeF9mcmVlbGlzdCgKKwl4ZnNfYWxsb2NfYXJnX3QJKmFyZ3MsCS8qIGFsbG9jYXRpb24gYXJndW1lbnQgc3RydWN0dXJlICovCisJaW50CQlmbGFncykJLyogWEZTX0FMTE9DX0ZMQUdfLi4uICovCit7CisJeGZzX2J1Zl90CSphZ2JwOwkvKiBhZ2YgYnVmZmVyIHBvaW50ZXIgKi8KKwl4ZnNfYWdmX3QJKmFnZjsJLyogYS5nLiBmcmVlc3BhY2Ugc3RydWN0dXJlIHBvaW50ZXIgKi8KKwl4ZnNfYnVmX3QJKmFnZmxicDsvKiBhZ2ZsIGJ1ZmZlciBwb2ludGVyICovCisJeGZzX2FnYmxvY2tfdAlibm87CS8qIGZyZWVsaXN0IGJsb2NrICovCisJeGZzX2V4dGxlbl90CWRlbHRhOwkvKiBuZXcgYmxvY2tzIG5lZWRlZCBpbiBmcmVlbGlzdCAqLworCWludAkJZXJyb3I7CS8qIGVycm9yIHJlc3VsdCBjb2RlICovCisJeGZzX2V4dGxlbl90CWxvbmdlc3Q7LyogbG9uZ2VzdCBleHRlbnQgaW4gYWxsb2NhdGlvbiBncm91cCAqLworCXhmc19tb3VudF90CSptcDsJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgc3RydWN0dXJlICovCisJeGZzX2V4dGxlbl90CW5lZWQ7CS8qIHRvdGFsIGJsb2NrcyBuZWVkZWQgaW4gZnJlZWxpc3QgKi8KKwl4ZnNfcGVyYWdfdAkqcGFnOwkvKiBwZXItYWcgaW5mb3JtYXRpb24gc3RydWN0dXJlICovCisJeGZzX2FsbG9jX2FyZ190CXRhcmdzOwkvKiBsb2NhbCBhbGxvY2F0aW9uIGFyZ3VtZW50cyAqLworCXhmc190cmFuc190CSp0cDsJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCisJbXAgPSBhcmdzLT5tcDsKKworCXBhZyA9IGFyZ3MtPnBhZzsKKwl0cCA9IGFyZ3MtPnRwOworCWlmICghcGFnLT5wYWdmX2luaXQpIHsKKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19yZWFkX2FnZihtcCwgdHAsIGFyZ3MtPmFnbm8sIGZsYWdzLAorCQkJCSZhZ2JwKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCWlmICghcGFnLT5wYWdmX2luaXQpIHsKKwkJCWFyZ3MtPmFnYnAgPSBOVUxMOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2UKKwkJYWdicCA9IE5VTEw7CisKKwkvKiBJZiB0aGlzIGlzIGEgbWV0YWRhdGEgcHJlZmVyZWQgcGFnIGFuZCB3ZSBhcmUgdXNlciBkYXRhCisJICogdGhlbiB0cnkgc29tZXdoZXJlIGVsc2UgaWYgd2UgYXJlIG5vdCBiZWluZyBhc2tlZCB0bworCSAqIHRyeSBoYXJkZXIgYXQgdGhpcyBwb2ludAorCSAqLworCWlmIChwYWctPnBhZ2ZfbWV0YWRhdGEgJiYgYXJncy0+dXNlcmRhdGEgJiYgZmxhZ3MpIHsKKwkJYXJncy0+YWdicCA9IE5VTEw7CisJCXJldHVybiAwOworCX0KKworCW5lZWQgPSBYRlNfTUlOX0ZSRUVMSVNUX1BBRyhwYWcsIG1wKTsKKwlkZWx0YSA9IG5lZWQgPiBwYWctPnBhZ2ZfZmxjb3VudCA/IG5lZWQgLSBwYWctPnBhZ2ZfZmxjb3VudCA6IDA7CisJLyoKKwkgKiBJZiBpdCBsb29rcyBsaWtlIHRoZXJlIGlzbid0IGEgbG9uZyBlbm91Z2ggZXh0ZW50LCBvciBlbm91Z2gKKwkgKiB0b3RhbCBibG9ja3MsIHJlamVjdCBpdC4KKwkgKi8KKwlsb25nZXN0ID0gKHBhZy0+cGFnZl9sb25nZXN0ID4gZGVsdGEpID8KKwkJKHBhZy0+cGFnZl9sb25nZXN0IC0gZGVsdGEpIDoKKwkJKHBhZy0+cGFnZl9mbGNvdW50ID4gMCB8fCBwYWctPnBhZ2ZfbG9uZ2VzdCA+IDApOworCWlmIChhcmdzLT5taW5sZW4gKyBhcmdzLT5hbGlnbm1lbnQgKyBhcmdzLT5taW5hbGlnbnNsb3AgLSAxID4gbG9uZ2VzdCB8fAorCSAgICAoYXJncy0+bWlubGVmdCAmJgorCSAgICAgKGludCkocGFnLT5wYWdmX2ZyZWVibGtzICsgcGFnLT5wYWdmX2ZsY291bnQgLQorCQkgICBuZWVkIC0gYXJncy0+dG90YWwpIDwKKwkgICAgIChpbnQpYXJncy0+bWlubGVmdCkpIHsKKwkJaWYgKGFnYnApCisJCQl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBhZ2JwKTsKKwkJYXJncy0+YWdicCA9IE5VTEw7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIEdldCB0aGUgYS5nLiBmcmVlc3BhY2UgYnVmZmVyLgorCSAqIENhbiBmYWlsIGlmIHdlJ3JlIG5vdCBibG9ja2luZyBvbiBsb2NrcywgYW5kIGl0J3MgaGVsZC4KKwkgKi8KKwlpZiAoYWdicCA9PSBOVUxMKSB7CisJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfcmVhZF9hZ2YobXAsIHRwLCBhcmdzLT5hZ25vLCBmbGFncywKKwkJCQkmYWdicCkpKQorCQkJcmV0dXJuIGVycm9yOworCQlpZiAoYWdicCA9PSBOVUxMKSB7CisJCQlhcmdzLT5hZ2JwID0gTlVMTDsKKwkJCXJldHVybiAwOworCQl9CisJfQorCS8qCisJICogRmlndXJlIG91dCBob3cgbWFueSBibG9ja3Mgd2Ugc2hvdWxkIGhhdmUgaW4gdGhlIGZyZWVsaXN0LgorCSAqLworCWFnZiA9IFhGU19CVUZfVE9fQUdGKGFnYnApOworCW5lZWQgPSBYRlNfTUlOX0ZSRUVMSVNUKGFnZiwgbXApOworCWRlbHRhID0gbmVlZCA+IElOVF9HRVQoYWdmLT5hZ2ZfZmxjb3VudCwgQVJDSF9DT05WRVJUKSA/CisJCShuZWVkIC0gSU5UX0dFVChhZ2YtPmFnZl9mbGNvdW50LCBBUkNIX0NPTlZFUlQpKSA6IDA7CisJLyoKKwkgKiBJZiB0aGVyZSBpc24ndCBlbm91Z2ggdG90YWwgb3Igc2luZ2xlLWV4dGVudCwgcmVqZWN0IGl0LgorCSAqLworCWxvbmdlc3QgPSBJTlRfR0VUKGFnZi0+YWdmX2xvbmdlc3QsIEFSQ0hfQ09OVkVSVCk7CisJbG9uZ2VzdCA9IChsb25nZXN0ID4gZGVsdGEpID8gKGxvbmdlc3QgLSBkZWx0YSkgOgorCQkoSU5UX0dFVChhZ2YtPmFnZl9mbGNvdW50LCBBUkNIX0NPTlZFUlQpID4gMCB8fCBsb25nZXN0ID4gMCk7CisJaWYgKGFyZ3MtPm1pbmxlbiArIGFyZ3MtPmFsaWdubWVudCArIGFyZ3MtPm1pbmFsaWduc2xvcCAtIDEgPiBsb25nZXN0IHx8CisJICAgICAoYXJncy0+bWlubGVmdCAmJgorCQkoaW50KShJTlRfR0VUKGFnZi0+YWdmX2ZyZWVibGtzLCBBUkNIX0NPTlZFUlQpICsKKwkJICAgSU5UX0dFVChhZ2YtPmFnZl9mbGNvdW50LCBBUkNIX0NPTlZFUlQpIC0gbmVlZCAtIGFyZ3MtPnRvdGFsKSA8CisJICAgICAoaW50KWFyZ3MtPm1pbmxlZnQpKSB7CisJCXhmc190cmFuc19icmVsc2UodHAsIGFnYnApOworCQlhcmdzLT5hZ2JwID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogTWFrZSB0aGUgZnJlZWxpc3Qgc2hvcnRlciBpZiBpdCdzIHRvbyBsb25nLgorCSAqLworCXdoaWxlIChJTlRfR0VUKGFnZi0+YWdmX2ZsY291bnQsIEFSQ0hfQ09OVkVSVCkgPiBuZWVkKSB7CisJCXhmc19idWZfdAkqYnA7CisKKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19nZXRfZnJlZWxpc3QodHAsIGFnYnAsICZibm8pKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJaWYgKChlcnJvciA9IHhmc19mcmVlX2FnX2V4dGVudCh0cCwgYWdicCwgYXJncy0+YWdubywgYm5vLCAxLCAxKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCWJwID0geGZzX2J0cmVlX2dldF9idWZzKG1wLCB0cCwgYXJncy0+YWdubywgYm5vLCAwKTsKKwkJeGZzX3RyYW5zX2JpbnZhbCh0cCwgYnApOworCX0KKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIGFyZ3Mgc3RydWN0dXJlLgorCSAqLworCXRhcmdzLnRwID0gdHA7CisJdGFyZ3MubXAgPSBtcDsKKwl0YXJncy5hZ2JwID0gYWdicDsKKwl0YXJncy5hZ25vID0gYXJncy0+YWdubzsKKwl0YXJncy5tb2QgPSB0YXJncy5taW5sZWZ0ID0gdGFyZ3Mud2FzZGVsID0gdGFyZ3MudXNlcmRhdGEgPQorCQl0YXJncy5taW5hbGlnbnNsb3AgPSAwOworCXRhcmdzLmFsaWdubWVudCA9IHRhcmdzLm1pbmxlbiA9IHRhcmdzLnByb2QgPSB0YXJncy5pc2ZsID0gMTsKKwl0YXJncy50eXBlID0gWEZTX0FMTE9DVFlQRV9USElTX0FHOworCXRhcmdzLnBhZyA9IHBhZzsKKwlpZiAoKGVycm9yID0geGZzX2FsbG9jX3JlYWRfYWdmbChtcCwgdHAsIHRhcmdzLmFnbm8sICZhZ2ZsYnApKSkKKwkJcmV0dXJuIGVycm9yOworCS8qCisJICogTWFrZSB0aGUgZnJlZWxpc3QgbG9uZ2VyIGlmIGl0J3MgdG9vIHNob3J0LgorCSAqLworCXdoaWxlIChJTlRfR0VUKGFnZi0+YWdmX2ZsY291bnQsIEFSQ0hfQ09OVkVSVCkgPCBuZWVkKSB7CisJCXRhcmdzLmFnYm5vID0gMDsKKwkJdGFyZ3MubWF4bGVuID0gbmVlZCAtIElOVF9HRVQoYWdmLT5hZ2ZfZmxjb3VudCwgQVJDSF9DT05WRVJUKTsKKwkJLyoKKwkJICogQWxsb2NhdGUgYXMgbWFueSBibG9ja3MgYXMgcG9zc2libGUgYXQgb25jZS4KKwkJICovCisJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfYWdfdmV4dGVudCgmdGFyZ3MpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJLyoKKwkJICogU3RvcCBpZiB3ZSBydW4gb3V0LiAgV29uJ3QgaGFwcGVuIGlmIGNhbGxlcnMgYXJlIG9iZXlpbmcKKwkJICogdGhlIHJlc3RyaWN0aW9ucyBjb3JyZWN0bHkuICBDYW4gaGFwcGVuIGZvciBmcmVlIGNhbGxzCisJCSAqIG9uIGEgY29tcGxldGVseSBmdWxsIGFnLgorCQkgKi8KKwkJaWYgKHRhcmdzLmFnYm5vID09IE5VTExBR0JMT0NLKQorCQkJYnJlYWs7CisJCS8qCisJCSAqIFB1dCBlYWNoIGFsbG9jYXRlZCBibG9jayBvbiB0aGUgbGlzdC4KKwkJICovCisJCWZvciAoYm5vID0gdGFyZ3MuYWdibm87IGJubyA8IHRhcmdzLmFnYm5vICsgdGFyZ3MubGVuOyBibm8rKykgeworCQkJaWYgKChlcnJvciA9IHhmc19hbGxvY19wdXRfZnJlZWxpc3QodHAsIGFnYnAsIGFnZmxicCwKKwkJCQkJYm5vKSkpCisJCQkJcmV0dXJuIGVycm9yOworCQl9CisJfQorCWFyZ3MtPmFnYnAgPSBhZ2JwOworCXJldHVybiAwOworfQorCisvKgorICogR2V0IGEgYmxvY2sgZnJvbSB0aGUgZnJlZWxpc3QuCisgKiBSZXR1cm5zIHdpdGggdGhlIGJ1ZmZlciBmb3IgdGhlIGJsb2NrIGdvdHRlbi4KKyAqLworaW50CQkJCS8qIGVycm9yICovCit4ZnNfYWxsb2NfZ2V0X2ZyZWVsaXN0KAorCXhmc190cmFuc190CSp0cCwJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19idWZfdAkqYWdicCwJLyogYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGFnZiBzdHJ1Y3R1cmUgKi8KKwl4ZnNfYWdibG9ja190CSpibm9wKQkvKiBibG9jayBhZGRyZXNzIHJldHJpZXZlZCBmcm9tIGZyZWVsaXN0ICovCit7CisJeGZzX2FnZl90CSphZ2Y7CS8qIGEuZy4gZnJlZXNwYWNlIHN0cnVjdHVyZSAqLworCXhmc19hZ2ZsX3QJKmFnZmw7CS8qIGEuZy4gZnJlZWxpc3Qgc3RydWN0dXJlICovCisJeGZzX2J1Zl90CSphZ2ZsYnA7LyogYnVmZmVyIGZvciBhLmcuIGZyZWVsaXN0IHN0cnVjdHVyZSAqLworCXhmc19hZ2Jsb2NrX3QJYm5vOwkvKiBibG9jayBudW1iZXIgcmV0dXJuZWQgKi8KKwlpbnQJCWVycm9yOworI2lmZGVmIFhGU19BTExPQ19UUkFDRQorCXN0YXRpYyBjaGFyCWZuYW1lW10gPSAieGZzX2FsbG9jX2dldF9mcmVlbGlzdCI7CisjZW5kaWYKKwl4ZnNfbW91bnRfdAkqbXA7CS8qIG1vdW50IHN0cnVjdHVyZSAqLworCXhmc19wZXJhZ190CSpwYWc7CS8qIHBlciBhbGxvY2F0aW9uIGdyb3VwIGRhdGEgKi8KKworCWFnZiA9IFhGU19CVUZfVE9fQUdGKGFnYnApOworCS8qCisJICogRnJlZWxpc3QgaXMgZW1wdHksIGdpdmUgdXAuCisJICovCisJaWYgKCFhZ2YtPmFnZl9mbGNvdW50KSB7CisJCSpibm9wID0gTlVMTEFHQkxPQ0s7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIFJlYWQgdGhlIGFycmF5IG9mIGZyZWUgYmxvY2tzLgorCSAqLworCW1wID0gdHAtPnRfbW91bnRwOworCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfcmVhZF9hZ2ZsKG1wLCB0cCwKKwkJCUlOVF9HRVQoYWdmLT5hZ2Zfc2Vxbm8sIEFSQ0hfQ09OVkVSVCksICZhZ2ZsYnApKSkKKwkJcmV0dXJuIGVycm9yOworCWFnZmwgPSBYRlNfQlVGX1RPX0FHRkwoYWdmbGJwKTsKKwkvKgorCSAqIEdldCB0aGUgYmxvY2sgbnVtYmVyIGFuZCB1cGRhdGUgdGhlIGRhdGEgc3RydWN0dXJlcy4KKwkgKi8KKwlibm8gPSBJTlRfR0VUKGFnZmwtPmFnZmxfYm5vW0lOVF9HRVQoYWdmLT5hZ2ZfZmxmaXJzdCwgQVJDSF9DT05WRVJUKV0sIEFSQ0hfQ09OVkVSVCk7CisJSU5UX01PRChhZ2YtPmFnZl9mbGZpcnN0LCBBUkNIX0NPTlZFUlQsIDEpOworCXhmc190cmFuc19icmVsc2UodHAsIGFnZmxicCk7CisJaWYgKElOVF9HRVQoYWdmLT5hZ2ZfZmxmaXJzdCwgQVJDSF9DT05WRVJUKSA9PSBYRlNfQUdGTF9TSVpFKG1wKSkKKwkJYWdmLT5hZ2ZfZmxmaXJzdCA9IDA7CisJcGFnID0gJm1wLT5tX3BlcmFnW0lOVF9HRVQoYWdmLT5hZ2Zfc2Vxbm8sIEFSQ0hfQ09OVkVSVCldOworCUlOVF9NT0QoYWdmLT5hZ2ZfZmxjb3VudCwgQVJDSF9DT05WRVJULCAtMSk7CisJeGZzX3RyYW5zX2FnZmxpc3RfZGVsdGEodHAsIC0xKTsKKwlwYWctPnBhZ2ZfZmxjb3VudC0tOworCVRSQUNFX01PREFHRihOVUxMLCBhZ2YsIFhGU19BR0ZfRkxGSVJTVCB8IFhGU19BR0ZfRkxDT1VOVCk7CisJeGZzX2FsbG9jX2xvZ19hZ2YodHAsIGFnYnAsIFhGU19BR0ZfRkxGSVJTVCB8IFhGU19BR0ZfRkxDT1VOVCk7CisJKmJub3AgPSBibm87CisKKwkvKgorCSAqIEFzIGJsb2NrcyBhcmUgZnJlZWQsIHRoZXkgYXJlIGFkZGVkIHRvIHRoZSBwZXItYWcgYnVzeSBsaXN0CisJICogYW5kIHJlbWFpbiB0aGVyZSB1bnRpbCB0aGUgZnJlZWluZyB0cmFuc2FjdGlvbiBpcyBjb21taXR0ZWQgdG8KKwkgKiBkaXNrLiAgTm93IHRoYXQgd2UgaGF2ZSBhbGxvY2F0ZWQgYmxvY2tzLCB0aGlzIGxpc3QgbXVzdCBiZQorCSAqIHNlYXJjaGVkIHRvIHNlZSBpZiBhIGJsb2NrIGlzIGJlaW5nIHJldXNlZC4gIElmIG9uZSBpcywgdGhlbgorCSAqIHRoZSBmcmVlaW5nIHRyYW5zYWN0aW9uIG11c3QgYmUgcHVzaGVkIHRvIGRpc2sgTk9XIGJ5IGZvcmNpbmcKKwkgKiB0byBkaXNrIGFsbCBpY2xvZ3MgdXAgdGhhdCB0cmFuc2FjdGlvbidzIExTTi4KKwkgKi8KKwl4ZnNfYWxsb2Nfc2VhcmNoX2J1c3kodHAsIElOVF9HRVQoYWdmLT5hZ2Zfc2Vxbm8sIEFSQ0hfQ09OVkVSVCksIGJubywgMSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBMb2cgdGhlIGdpdmVuIGZpZWxkcyBmcm9tIHRoZSBhZ2Ygc3RydWN0dXJlLgorICovCit2b2lkCit4ZnNfYWxsb2NfbG9nX2FnZigKKwl4ZnNfdHJhbnNfdAkqdHAsCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfYnVmX3QJKmJwLAkvKiBidWZmZXIgZm9yIGEuZy4gZnJlZWxpc3QgaGVhZGVyICovCisJaW50CQlmaWVsZHMpCS8qIG1hc2sgb2YgZmllbGRzIHRvIGJlIGxvZ2dlZCAoWEZTX0FHRl8uLi4pICovCit7CisJaW50CWZpcnN0OwkJLyogZmlyc3QgYnl0ZSBvZmZzZXQgKi8KKwlpbnQJbGFzdDsJCS8qIGxhc3QgYnl0ZSBvZmZzZXQgKi8KKwlzdGF0aWMgY29uc3Qgc2hvcnQJb2Zmc2V0c1tdID0geworCQlvZmZzZXRvZih4ZnNfYWdmX3QsIGFnZl9tYWdpY251bSksCisJCW9mZnNldG9mKHhmc19hZ2ZfdCwgYWdmX3ZlcnNpb25udW0pLAorCQlvZmZzZXRvZih4ZnNfYWdmX3QsIGFnZl9zZXFubyksCisJCW9mZnNldG9mKHhmc19hZ2ZfdCwgYWdmX2xlbmd0aCksCisJCW9mZnNldG9mKHhmc19hZ2ZfdCwgYWdmX3Jvb3RzWzBdKSwKKwkJb2Zmc2V0b2YoeGZzX2FnZl90LCBhZ2ZfbGV2ZWxzWzBdKSwKKwkJb2Zmc2V0b2YoeGZzX2FnZl90LCBhZ2ZfZmxmaXJzdCksCisJCW9mZnNldG9mKHhmc19hZ2ZfdCwgYWdmX2ZsbGFzdCksCisJCW9mZnNldG9mKHhmc19hZ2ZfdCwgYWdmX2ZsY291bnQpLAorCQlvZmZzZXRvZih4ZnNfYWdmX3QsIGFnZl9mcmVlYmxrcyksCisJCW9mZnNldG9mKHhmc19hZ2ZfdCwgYWdmX2xvbmdlc3QpLAorCQlzaXplb2YoeGZzX2FnZl90KQorCX07CisKKwl4ZnNfYnRyZWVfb2Zmc2V0cyhmaWVsZHMsIG9mZnNldHMsIFhGU19BR0ZfTlVNX0JJVFMsICZmaXJzdCwgJmxhc3QpOworCXhmc190cmFuc19sb2dfYnVmKHRwLCBicCwgKHVpbnQpZmlyc3QsICh1aW50KWxhc3QpOworfQorCisvKgorICogSW50ZXJmYWNlIGZvciBpbm9kZSBhbGxvY2F0aW9uIHRvIGZvcmNlIHRoZSBwYWcgZGF0YSB0byBiZSBpbml0aWFsaXplZC4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2FsbG9jX3BhZ2ZfaW5pdCgKKwl4ZnNfbW91bnRfdAkJKm1wLAkvKiBmaWxlIHN5c3RlbSBtb3VudCBzdHJ1Y3R1cmUgKi8KKwl4ZnNfdHJhbnNfdAkJKnRwLAkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2FnbnVtYmVyX3QJCWFnbm8sCS8qIGFsbG9jYXRpb24gZ3JvdXAgbnVtYmVyICovCisJaW50CQkJZmxhZ3MpCS8qIFhGU19BTExPQ19GTEFHU18uLi4gKi8KK3sKKwl4ZnNfYnVmX3QJCSpicDsKKwlpbnQJCQllcnJvcjsKKworCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfcmVhZF9hZ2YobXAsIHRwLCBhZ25vLCBmbGFncywgJmJwKSkpCisJCXJldHVybiBlcnJvcjsKKwlpZiAoYnApCisJCXhmc190cmFuc19icmVsc2UodHAsIGJwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFB1dCB0aGUgYmxvY2sgb24gdGhlIGZyZWVsaXN0IGZvciB0aGUgYWxsb2NhdGlvbiBncm91cC4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2FsbG9jX3B1dF9mcmVlbGlzdCgKKwl4ZnNfdHJhbnNfdAkJKnRwLAkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2J1Zl90CQkqYWdicCwJLyogYnVmZmVyIGZvciBhLmcuIGZyZWVsaXN0IGhlYWRlciAqLworCXhmc19idWZfdAkJKmFnZmxicCwvKiBidWZmZXIgZm9yIGEuZy4gZnJlZSBibG9jayBhcnJheSAqLworCXhmc19hZ2Jsb2NrX3QJCWJubykJLyogYmxvY2sgYmVpbmcgZnJlZWQgKi8KK3sKKwl4ZnNfYWdmX3QJCSphZ2Y7CS8qIGEuZy4gZnJlZXNwYWNlIHN0cnVjdHVyZSAqLworCXhmc19hZ2ZsX3QJCSphZ2ZsOwkvKiBhLmcuIGZyZWUgYmxvY2sgYXJyYXkgKi8KKwl4ZnNfYWdibG9ja190CQkqYmxvY2twOy8qIHBvaW50ZXIgdG8gYXJyYXkgZW50cnkgKi8KKwlpbnQJCQllcnJvcjsKKyNpZmRlZiBYRlNfQUxMT0NfVFJBQ0UKKwlzdGF0aWMgY2hhcgkJZm5hbWVbXSA9ICJ4ZnNfYWxsb2NfcHV0X2ZyZWVsaXN0IjsKKyNlbmRpZgorCXhmc19tb3VudF90CQkqbXA7CS8qIG1vdW50IHN0cnVjdHVyZSAqLworCXhmc19wZXJhZ190CQkqcGFnOwkvKiBwZXIgYWxsb2NhdGlvbiBncm91cCBkYXRhICovCisKKwlhZ2YgPSBYRlNfQlVGX1RPX0FHRihhZ2JwKTsKKwltcCA9IHRwLT50X21vdW50cDsKKworCWlmICghYWdmbGJwICYmIChlcnJvciA9IHhmc19hbGxvY19yZWFkX2FnZmwobXAsIHRwLAorCQkJSU5UX0dFVChhZ2YtPmFnZl9zZXFubywgQVJDSF9DT05WRVJUKSwgJmFnZmxicCkpKQorCQlyZXR1cm4gZXJyb3I7CisJYWdmbCA9IFhGU19CVUZfVE9fQUdGTChhZ2ZsYnApOworCUlOVF9NT0QoYWdmLT5hZ2ZfZmxsYXN0LCBBUkNIX0NPTlZFUlQsIDEpOworCWlmIChJTlRfR0VUKGFnZi0+YWdmX2ZsbGFzdCwgQVJDSF9DT05WRVJUKSA9PSBYRlNfQUdGTF9TSVpFKG1wKSkKKwkJYWdmLT5hZ2ZfZmxsYXN0ID0gMDsKKwlwYWcgPSAmbXAtPm1fcGVyYWdbSU5UX0dFVChhZ2YtPmFnZl9zZXFubywgQVJDSF9DT05WRVJUKV07CisJSU5UX01PRChhZ2YtPmFnZl9mbGNvdW50LCBBUkNIX0NPTlZFUlQsIDEpOworCXhmc190cmFuc19hZ2ZsaXN0X2RlbHRhKHRwLCAxKTsKKwlwYWctPnBhZ2ZfZmxjb3VudCsrOworCUFTU0VSVChJTlRfR0VUKGFnZi0+YWdmX2ZsY291bnQsIEFSQ0hfQ09OVkVSVCkgPD0gWEZTX0FHRkxfU0laRShtcCkpOworCWJsb2NrcCA9ICZhZ2ZsLT5hZ2ZsX2Jub1tJTlRfR0VUKGFnZi0+YWdmX2ZsbGFzdCwgQVJDSF9DT05WRVJUKV07CisJSU5UX1NFVCgqYmxvY2twLCBBUkNIX0NPTlZFUlQsIGJubyk7CisJVFJBQ0VfTU9EQUdGKE5VTEwsIGFnZiwgWEZTX0FHRl9GTExBU1QgfCBYRlNfQUdGX0ZMQ09VTlQpOworCXhmc19hbGxvY19sb2dfYWdmKHRwLCBhZ2JwLCBYRlNfQUdGX0ZMTEFTVCB8IFhGU19BR0ZfRkxDT1VOVCk7CisJeGZzX3RyYW5zX2xvZ19idWYodHAsIGFnZmxicCwKKwkJKGludCkoKHhmc19jYWRkcl90KWJsb2NrcCAtICh4ZnNfY2FkZHJfdClhZ2ZsKSwKKwkJKGludCkoKHhmc19jYWRkcl90KWJsb2NrcCAtICh4ZnNfY2FkZHJfdClhZ2ZsICsKKwkJCXNpemVvZih4ZnNfYWdibG9ja190KSAtIDEpKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlYWQgaW4gdGhlIGFsbG9jYXRpb24gZ3JvdXAgaGVhZGVyIChmcmVlL2FsbG9jIHNlY3Rpb24pLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYWxsb2NfcmVhZF9hZ2YoCisJeGZzX21vdW50X3QJKm1wLAkJLyogbW91bnQgcG9pbnQgc3RydWN0dXJlICovCisJeGZzX3RyYW5zX3QJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19hZ251bWJlcl90CWFnbm8sCQkvKiBhbGxvY2F0aW9uIGdyb3VwIG51bWJlciAqLworCWludAkJZmxhZ3MsCQkvKiBYRlNfQUxMT0NfRkxBR18uLi4gKi8KKwl4ZnNfYnVmX3QJKipicHApCQkvKiBidWZmZXIgZm9yIHRoZSBhZyBmcmVlbGlzdCBoZWFkZXIgKi8KK3sKKwl4ZnNfYWdmX3QJKmFnZjsJCS8qIGFnIGZyZWVsaXN0IGhlYWRlciAqLworCWludAkJYWdmX29rOwkJLyogc2V0IGlmIGFnZiBpcyBjb25zaXN0ZW50ICovCisJeGZzX2J1Zl90CSpicDsJCS8qIHJldHVybiB2YWx1ZSAqLworCXhmc19wZXJhZ190CSpwYWc7CQkvKiBwZXIgYWxsb2NhdGlvbiBncm91cCBkYXRhICovCisJaW50CQllcnJvcjsKKworCUFTU0VSVChhZ25vICE9IE5VTExBR05VTUJFUik7CisJZXJyb3IgPSB4ZnNfdHJhbnNfcmVhZF9idWYoCisJCQltcCwgdHAsIG1wLT5tX2RkZXZfdGFyZ3AsCisJCQlYRlNfQUdfREFERFIobXAsIGFnbm8sIFhGU19BR0ZfREFERFIobXApKSwKKwkJCVhGU19GU1NfVE9fQkIobXAsIDEpLAorCQkJKGZsYWdzICYgWEZTX0FMTE9DX0ZMQUdfVFJZTE9DSykgPyBYRlNfQlVGX1RSWUxPQ0sgOiAwVSwKKwkJCSZicCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJQVNTRVJUKCFicCB8fCAhWEZTX0JVRl9HRVRFUlJPUihicCkpOworCWlmICghYnApIHsKKwkJKmJwcCA9IE5VTEw7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIFZhbGlkYXRlIHRoZSBtYWdpYyBudW1iZXIgb2YgdGhlIGFnZiBibG9jay4KKwkgKi8KKwlhZ2YgPSBYRlNfQlVGX1RPX0FHRihicCk7CisJYWdmX29rID0KKwkJSU5UX0dFVChhZ2YtPmFnZl9tYWdpY251bSwgQVJDSF9DT05WRVJUKSA9PSBYRlNfQUdGX01BR0lDICYmCisJCVhGU19BR0ZfR09PRF9WRVJTSU9OKAorCQkJSU5UX0dFVChhZ2YtPmFnZl92ZXJzaW9ubnVtLCBBUkNIX0NPTlZFUlQpKSAmJgorCQlJTlRfR0VUKGFnZi0+YWdmX2ZyZWVibGtzLCBBUkNIX0NPTlZFUlQpIDw9CisJCQkJSU5UX0dFVChhZ2YtPmFnZl9sZW5ndGgsIEFSQ0hfQ09OVkVSVCkgJiYKKwkJSU5UX0dFVChhZ2YtPmFnZl9mbGZpcnN0LCBBUkNIX0NPTlZFUlQpIDwgWEZTX0FHRkxfU0laRShtcCkgJiYKKwkJSU5UX0dFVChhZ2YtPmFnZl9mbGxhc3QsICBBUkNIX0NPTlZFUlQpIDwgWEZTX0FHRkxfU0laRShtcCkgJiYKKwkJSU5UX0dFVChhZ2YtPmFnZl9mbGNvdW50LCBBUkNIX0NPTlZFUlQpIDw9IFhGU19BR0ZMX1NJWkUobXApOworCWlmICh1bmxpa2VseShYRlNfVEVTVF9FUlJPUighYWdmX29rLCBtcCwgWEZTX0VSUlRBR19BTExPQ19SRUFEX0FHRiwKKwkJCVhGU19SQU5ET01fQUxMT0NfUkVBRF9BR0YpKSkgeworCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGZzX2FsbG9jX3JlYWRfYWdmIiwKKwkJCQkgICAgIFhGU19FUlJMRVZFTF9MT1csIG1wLCBhZ2YpOworCQl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBicCk7CisJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwl9CisJcGFnID0gJm1wLT5tX3BlcmFnW2Fnbm9dOworCWlmICghcGFnLT5wYWdmX2luaXQpIHsKKwkJcGFnLT5wYWdmX2ZyZWVibGtzID0gSU5UX0dFVChhZ2YtPmFnZl9mcmVlYmxrcywgQVJDSF9DT05WRVJUKTsKKwkJcGFnLT5wYWdmX2ZsY291bnQgPSBJTlRfR0VUKGFnZi0+YWdmX2ZsY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJCXBhZy0+cGFnZl9sb25nZXN0ID0gSU5UX0dFVChhZ2YtPmFnZl9sb25nZXN0LCBBUkNIX0NPTlZFUlQpOworCQlwYWctPnBhZ2ZfbGV2ZWxzW1hGU19CVE5VTV9CTk9pXSA9CisJCQlJTlRfR0VUKGFnZi0+YWdmX2xldmVsc1tYRlNfQlROVU1fQk5PaV0sIEFSQ0hfQ09OVkVSVCk7CisJCXBhZy0+cGFnZl9sZXZlbHNbWEZTX0JUTlVNX0NOVGldID0KKwkJCUlOVF9HRVQoYWdmLT5hZ2ZfbGV2ZWxzW1hGU19CVE5VTV9DTlRpXSwgQVJDSF9DT05WRVJUKTsKKwkJc3BpbmxvY2tfaW5pdCgmcGFnLT5wYWdiX2xvY2ssICJ4ZnNwYWdiIik7CisJCXBhZy0+cGFnYl9saXN0ID0ga21lbV96YWxsb2MoWEZTX1BBR0JfTlVNX1NMT1RTICoKKwkJCQkJc2l6ZW9mKHhmc19wZXJhZ19idXN5X3QpLCBLTV9TTEVFUCk7CisJCXBhZy0+cGFnZl9pbml0ID0gMTsKKwl9CisjaWZkZWYgREVCVUcKKwllbHNlIGlmICghWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpIHsKKwkJQVNTRVJUKHBhZy0+cGFnZl9mcmVlYmxrcyA9PSBJTlRfR0VUKGFnZi0+YWdmX2ZyZWVibGtzLCBBUkNIX0NPTlZFUlQpKTsKKwkJQVNTRVJUKHBhZy0+cGFnZl9mbGNvdW50ID09IElOVF9HRVQoYWdmLT5hZ2ZfZmxjb3VudCwgQVJDSF9DT05WRVJUKSk7CisJCUFTU0VSVChwYWctPnBhZ2ZfbG9uZ2VzdCA9PSBJTlRfR0VUKGFnZi0+YWdmX2xvbmdlc3QsIEFSQ0hfQ09OVkVSVCkpOworCQlBU1NFUlQocGFnLT5wYWdmX2xldmVsc1tYRlNfQlROVU1fQk5PaV0gPT0KKwkJICAgICAgIElOVF9HRVQoYWdmLT5hZ2ZfbGV2ZWxzW1hGU19CVE5VTV9CTk9pXSwgQVJDSF9DT05WRVJUKSk7CisJCUFTU0VSVChwYWctPnBhZ2ZfbGV2ZWxzW1hGU19CVE5VTV9DTlRpXSA9PQorCQkgICAgICAgSU5UX0dFVChhZ2YtPmFnZl9sZXZlbHNbWEZTX0JUTlVNX0NOVGldLCBBUkNIX0NPTlZFUlQpKTsKKwl9CisjZW5kaWYKKwlYRlNfQlVGX1NFVF9WVFlQRV9SRUYoYnAsIEJfRlNfQUdGLCBYRlNfQUdGX1JFRik7CisJKmJwcCA9IGJwOworCXJldHVybiAwOworfQorCisvKgorICogQWxsb2NhdGUgYW4gZXh0ZW50ICh2YXJpYWJsZS1zaXplKS4KKyAqIERlcGVuZGluZyBvbiB0aGUgYWxsb2NhdGlvbiB0eXBlLCB3ZSBlaXRoZXIgbG9vayBpbiBhIHNpbmdsZSBhbGxvY2F0aW9uCisgKiBncm91cCBvciBsb29wIG92ZXIgdGhlIGFsbG9jYXRpb24gZ3JvdXBzIHRvIGZpbmQgdGhlIHJlc3VsdC4KKyAqLworaW50CQkJCS8qIGVycm9yICovCit4ZnNfYWxsb2NfdmV4dGVudCgKKwl4ZnNfYWxsb2NfYXJnX3QJKmFyZ3MpCS8qIGFsbG9jYXRpb24gYXJndW1lbnQgc3RydWN0dXJlICovCit7CisJeGZzX2FnYmxvY2tfdAlhZ3NpemU7CS8qIGFsbG9jYXRpb24gZ3JvdXAgc2l6ZSAqLworCWludAkJZXJyb3I7CisJaW50CQlmbGFnczsJLyogWEZTX0FMTE9DX0ZMQUdfLi4uIGxvY2tpbmcgZmxhZ3MgKi8KKyNpZmRlZiBYRlNfQUxMT0NfVFJBQ0UKKwlzdGF0aWMgY2hhcglmbmFtZVtdID0gInhmc19hbGxvY192ZXh0ZW50IjsKKyNlbmRpZgorCXhmc19leHRsZW5fdAltaW5sZWZ0Oy8qIG1pbmltdW0gbGVmdCB2YWx1ZSwgdGVtcCBjb3B5ICovCisJeGZzX21vdW50X3QJKm1wOwkvKiBtb3VudCBzdHJ1Y3R1cmUgcG9pbnRlciAqLworCXhmc19hZ251bWJlcl90CXNhZ25vOwkvKiBzdGFydGluZyBhbGxvY2F0aW9uIGdyb3VwIG51bWJlciAqLworCXhmc19hbGxvY3R5cGVfdAl0eXBlOwkvKiBpbnB1dCBhbGxvY2F0aW9uIHR5cGUgKi8KKwlpbnQJCWJ1bXBfcm90b3IgPSAwOworCWludAkJbm9fbWluID0gMDsKKwl4ZnNfYWdudW1iZXJfdAlyb3RvcnN0ZXAgPSB4ZnNfcm90b3JzdGVwOyAvKiBpbm9kZTMyIGFnZiBzdGVwcGVyICovCisKKwltcCA9IGFyZ3MtPm1wOworCXR5cGUgPSBhcmdzLT5vdHlwZSA9IGFyZ3MtPnR5cGU7CisJYXJncy0+YWdibm8gPSBOVUxMQUdCTE9DSzsKKwkvKgorCSAqIEp1c3QgZml4IHRoaXMgdXAsIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgbGFzdCBhLmcuIGlzIHNob3J0ZXIKKwkgKiAob3IgdGhlcmUncyBvbmx5IG9uZSBhLmcuKSBhbmQgdGhlIGNhbGxlciBjb3VsZG4ndCBlYXNpbHkgZmlndXJlCisJICogdGhhdCBvdXQgKHhmc19ibWFwX2FsbG9jKS4KKwkgKi8KKwlhZ3NpemUgPSBtcC0+bV9zYi5zYl9hZ2Jsb2NrczsKKwlpZiAoYXJncy0+bWF4bGVuID4gYWdzaXplKQorCQlhcmdzLT5tYXhsZW4gPSBhZ3NpemU7CisJaWYgKGFyZ3MtPmFsaWdubWVudCA9PSAwKQorCQlhcmdzLT5hbGlnbm1lbnQgPSAxOworCUFTU0VSVChYRlNfRlNCX1RPX0FHTk8obXAsIGFyZ3MtPmZzYm5vKSA8IG1wLT5tX3NiLnNiX2FnY291bnQpOworCUFTU0VSVChYRlNfRlNCX1RPX0FHQk5PKG1wLCBhcmdzLT5mc2JubykgPCBhZ3NpemUpOworCUFTU0VSVChhcmdzLT5taW5sZW4gPD0gYXJncy0+bWF4bGVuKTsKKwlBU1NFUlQoYXJncy0+bWlubGVuIDw9IGFnc2l6ZSk7CisJQVNTRVJUKGFyZ3MtPm1vZCA8IGFyZ3MtPnByb2QpOworCWlmIChYRlNfRlNCX1RPX0FHTk8obXAsIGFyZ3MtPmZzYm5vKSA+PSBtcC0+bV9zYi5zYl9hZ2NvdW50IHx8CisJICAgIFhGU19GU0JfVE9fQUdCTk8obXAsIGFyZ3MtPmZzYm5vKSA+PSBhZ3NpemUgfHwKKwkgICAgYXJncy0+bWlubGVuID4gYXJncy0+bWF4bGVuIHx8IGFyZ3MtPm1pbmxlbiA+IGFnc2l6ZSB8fAorCSAgICBhcmdzLT5tb2QgPj0gYXJncy0+cHJvZCkgeworCQlhcmdzLT5mc2JubyA9IE5VTExGU0JMT0NLOworCQlUUkFDRV9BTExPQygiYmFkYXJncyIsIGFyZ3MpOworCQlyZXR1cm4gMDsKKwl9CisJbWlubGVmdCA9IGFyZ3MtPm1pbmxlZnQ7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFhGU19BTExPQ1RZUEVfVEhJU19BRzoKKwljYXNlIFhGU19BTExPQ1RZUEVfTkVBUl9CTk86CisJY2FzZSBYRlNfQUxMT0NUWVBFX1RISVNfQk5POgorCQkvKgorCQkgKiBUaGVzZSB0aHJlZSBmb3JjZSB1cyBpbnRvIGEgc2luZ2xlIGEuZy4KKwkJICovCisJCWFyZ3MtPmFnbm8gPSBYRlNfRlNCX1RPX0FHTk8obXAsIGFyZ3MtPmZzYm5vKTsKKwkJZG93bl9yZWFkKCZtcC0+bV9wZXJhZ2xvY2spOworCQlhcmdzLT5wYWcgPSAmbXAtPm1fcGVyYWdbYXJncy0+YWdub107CisJCWFyZ3MtPm1pbmxlZnQgPSAwOworCQllcnJvciA9IHhmc19hbGxvY19maXhfZnJlZWxpc3QoYXJncywgMCk7CisJCWFyZ3MtPm1pbmxlZnQgPSBtaW5sZWZ0OworCQlpZiAoZXJyb3IpIHsKKwkJCVRSQUNFX0FMTE9DKCJub2ZpeCIsIGFyZ3MpOworCQkJZ290byBlcnJvcjA7CisJCX0KKwkJaWYgKCFhcmdzLT5hZ2JwKSB7CisJCQl1cF9yZWFkKCZtcC0+bV9wZXJhZ2xvY2spOworCQkJVFJBQ0VfQUxMT0MoIm5vYWdicCIsIGFyZ3MpOworCQkJYnJlYWs7CisJCX0KKwkJYXJncy0+YWdibm8gPSBYRlNfRlNCX1RPX0FHQk5PKG1wLCBhcmdzLT5mc2Jubyk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfYWdfdmV4dGVudChhcmdzKSkpCisJCQlnb3RvIGVycm9yMDsKKwkJdXBfcmVhZCgmbXAtPm1fcGVyYWdsb2NrKTsKKwkJYnJlYWs7CisJY2FzZSBYRlNfQUxMT0NUWVBFX1NUQVJUX0JOTzoKKwkJLyoKKwkJICogVHJ5IG5lYXIgYWxsb2NhdGlvbiBmaXJzdCwgdGhlbiBhbnl3aGVyZS1pbi1hZyBhZnRlcgorCQkgKiB0aGUgZmlyc3QgYS5nLiBmYWlscy4KKwkJICovCisJCWlmICgoYXJncy0+dXNlcmRhdGEgID09IFhGU19BTExPQ19JTklUSUFMX1VTRVJfREFUQSkgJiYKKwkJICAgIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF8zMkJJVElOT0RFUykpIHsKKwkJCWFyZ3MtPmZzYm5vID0gWEZTX0FHQl9UT19GU0IobXAsCisJCQkJCSgobXAtPm1fYWdmcm90b3IgLyByb3RvcnN0ZXApICUKKwkJCQkJbXAtPm1fc2Iuc2JfYWdjb3VudCksIDApOworCQkJYnVtcF9yb3RvciA9IDE7CisJCX0KKwkJYXJncy0+YWdibm8gPSBYRlNfRlNCX1RPX0FHQk5PKG1wLCBhcmdzLT5mc2Jubyk7CisJCWFyZ3MtPnR5cGUgPSBYRlNfQUxMT0NUWVBFX05FQVJfQk5POworCQkvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgWEZTX0FMTE9DVFlQRV9BTllfQUc6CisJY2FzZSBYRlNfQUxMT0NUWVBFX1NUQVJUX0FHOgorCWNhc2UgWEZTX0FMTE9DVFlQRV9GSVJTVF9BRzoKKwkJLyoKKwkJICogUm90YXRlIHRocm91Z2ggdGhlIGFsbG9jYXRpb24gZ3JvdXBzIGxvb2tpbmcgZm9yIGEgd2lubmVyLgorCQkgKi8KKwkJaWYgKHR5cGUgPT0gWEZTX0FMTE9DVFlQRV9BTllfQUcpIHsKKwkJCS8qCisJCQkgKiBTdGFydCB3aXRoIHRoZSBsYXN0IHBsYWNlIHdlIGxlZnQgb2ZmLgorCQkJICovCisJCQlhcmdzLT5hZ25vID0gc2Fnbm8gPSAobXAtPm1fYWdmcm90b3IgLyByb3RvcnN0ZXApICUKKwkJCQkJbXAtPm1fc2Iuc2JfYWdjb3VudDsKKwkJCWFyZ3MtPnR5cGUgPSBYRlNfQUxMT0NUWVBFX1RISVNfQUc7CisJCQlmbGFncyA9IFhGU19BTExPQ19GTEFHX1RSWUxPQ0s7CisJCX0gZWxzZSBpZiAodHlwZSA9PSBYRlNfQUxMT0NUWVBFX0ZJUlNUX0FHKSB7CisJCQkvKgorCQkJICogU3RhcnQgd2l0aCBhbGxvY2F0aW9uIGdyb3VwIGdpdmVuIGJ5IGJuby4KKwkJCSAqLworCQkJYXJncy0+YWdubyA9IFhGU19GU0JfVE9fQUdOTyhtcCwgYXJncy0+ZnNibm8pOworCQkJYXJncy0+dHlwZSA9IFhGU19BTExPQ1RZUEVfVEhJU19BRzsKKwkJCXNhZ25vID0gMDsKKwkJCWZsYWdzID0gMDsKKwkJfSBlbHNlIHsKKwkJCWlmICh0eXBlID09IFhGU19BTExPQ1RZUEVfU1RBUlRfQUcpCisJCQkJYXJncy0+dHlwZSA9IFhGU19BTExPQ1RZUEVfVEhJU19BRzsKKwkJCS8qCisJCQkgKiBTdGFydCB3aXRoIHRoZSBnaXZlbiBhbGxvY2F0aW9uIGdyb3VwLgorCQkJICovCisJCQlhcmdzLT5hZ25vID0gc2Fnbm8gPSBYRlNfRlNCX1RPX0FHTk8obXAsIGFyZ3MtPmZzYm5vKTsKKwkJCWZsYWdzID0gWEZTX0FMTE9DX0ZMQUdfVFJZTE9DSzsKKwkJfQorCQkvKgorCQkgKiBMb29wIG92ZXIgYWxsb2NhdGlvbiBncm91cHMgdHdpY2U7IGZpcnN0IHRpbWUgd2l0aAorCQkgKiB0cnlsb2NrIHNldCwgc2Vjb25kIHRpbWUgd2l0aG91dC4KKwkJICovCisJCWRvd25fcmVhZCgmbXAtPm1fcGVyYWdsb2NrKTsKKwkJZm9yICg7OykgeworCQkJYXJncy0+cGFnID0gJm1wLT5tX3BlcmFnW2FyZ3MtPmFnbm9dOworCQkJaWYgKG5vX21pbikgYXJncy0+bWlubGVmdCA9IDA7CisJCQllcnJvciA9IHhmc19hbGxvY19maXhfZnJlZWxpc3QoYXJncywgZmxhZ3MpOworCQkJYXJncy0+bWlubGVmdCA9IG1pbmxlZnQ7CisJCQlpZiAoZXJyb3IpIHsKKwkJCQlUUkFDRV9BTExPQygibm9maXgiLCBhcmdzKTsKKwkJCQlnb3RvIGVycm9yMDsKKwkJCX0KKwkJCS8qCisJCQkgKiBJZiB3ZSBnZXQgYSBidWZmZXIgYmFjayB0aGVuIHRoZSBhbGxvY2F0aW9uIHdpbGwgZmx5LgorCQkJICovCisJCQlpZiAoYXJncy0+YWdicCkgeworCQkJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfYWdfdmV4dGVudChhcmdzKSkpCisJCQkJCWdvdG8gZXJyb3IwOworCQkJCWJyZWFrOworCQkJfQorCQkJVFJBQ0VfQUxMT0MoImxvb3BmYWlsZWQiLCBhcmdzKTsKKwkJCS8qCisJCQkgKiBEaWRuJ3Qgd29yaywgZmlndXJlIG91dCB0aGUgbmV4dCBpdGVyYXRpb24uCisJCQkgKi8KKwkJCWlmIChhcmdzLT5hZ25vID09IHNhZ25vICYmCisJCQkgICAgdHlwZSA9PSBYRlNfQUxMT0NUWVBFX1NUQVJUX0JOTykKKwkJCQlhcmdzLT50eXBlID0gWEZTX0FMTE9DVFlQRV9USElTX0FHOworCQkJaWYgKCsrKGFyZ3MtPmFnbm8pID09IG1wLT5tX3NiLnNiX2FnY291bnQpCisJCQkJYXJncy0+YWdubyA9IDA7CisJCQkvKgorCQkJICogUmVhY2hlZCB0aGUgc3RhcnRpbmcgYS5nLiwgbXVzdCBlaXRoZXIgYmUgZG9uZQorCQkJICogb3Igc3dpdGNoIHRvIG5vbi10cnlsb2NrIG1vZGUuCisJCQkgKi8KKwkJCWlmIChhcmdzLT5hZ25vID09IHNhZ25vKSB7CisJCQkJaWYgKG5vX21pbiA9PSAxKSB7CisJCQkJCWFyZ3MtPmFnYm5vID0gTlVMTEFHQkxPQ0s7CisJCQkJCVRSQUNFX0FMTE9DKCJhbGxmYWlsZWQiLCBhcmdzKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmIChmbGFncyA9PSAwKSB7CisJCQkJCW5vX21pbiA9IDE7CisJCQkJfSBlbHNlIHsKKwkJCQkJZmxhZ3MgPSAwOworCQkJCQlpZiAodHlwZSA9PSBYRlNfQUxMT0NUWVBFX1NUQVJUX0JOTykgeworCQkJCQkJYXJncy0+YWdibm8gPSBYRlNfRlNCX1RPX0FHQk5PKG1wLAorCQkJCQkJCWFyZ3MtPmZzYm5vKTsKKwkJCQkJCWFyZ3MtPnR5cGUgPSBYRlNfQUxMT0NUWVBFX05FQVJfQk5POworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJCXVwX3JlYWQoJm1wLT5tX3BlcmFnbG9jayk7CisJCWlmIChidW1wX3JvdG9yIHx8ICh0eXBlID09IFhGU19BTExPQ1RZUEVfQU5ZX0FHKSkgeworCQkJaWYgKGFyZ3MtPmFnbm8gPT0gc2Fnbm8pCisJCQkJbXAtPm1fYWdmcm90b3IgPSAobXAtPm1fYWdmcm90b3IgKyAxKSAlCisJCQkJCShtcC0+bV9zYi5zYl9hZ2NvdW50ICogcm90b3JzdGVwKTsKKwkJCWVsc2UKKwkJCQltcC0+bV9hZ2Zyb3RvciA9IChhcmdzLT5hZ25vICogcm90b3JzdGVwICsgMSkgJQorCQkJCQkobXAtPm1fc2Iuc2JfYWdjb3VudCAqIHJvdG9yc3RlcCk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQVNTRVJUKDApOworCQkvKiBOT1RSRUFDSEVEICovCisJfQorCWlmIChhcmdzLT5hZ2JubyA9PSBOVUxMQUdCTE9DSykKKwkJYXJncy0+ZnNibm8gPSBOVUxMRlNCTE9DSzsKKwllbHNlIHsKKwkJYXJncy0+ZnNibm8gPSBYRlNfQUdCX1RPX0ZTQihtcCwgYXJncy0+YWdubywgYXJncy0+YWdibm8pOworI2lmZGVmIERFQlVHCisJCUFTU0VSVChhcmdzLT5sZW4gPj0gYXJncy0+bWlubGVuKTsKKwkJQVNTRVJUKGFyZ3MtPmxlbiA8PSBhcmdzLT5tYXhsZW4pOworCQlBU1NFUlQoYXJncy0+YWdibm8gJSBhcmdzLT5hbGlnbm1lbnQgPT0gMCk7CisJCVhGU19BR19DSEVDS19EQUREUihtcCwgWEZTX0ZTQl9UT19EQUREUihtcCwgYXJncy0+ZnNibm8pLAorCQkJYXJncy0+bGVuKTsKKyNlbmRpZgorCX0KKwlyZXR1cm4gMDsKK2Vycm9yMDoKKwl1cF9yZWFkKCZtcC0+bV9wZXJhZ2xvY2spOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIEZyZWUgYW4gZXh0ZW50LgorICogSnVzdCBicmVhayB1cCB0aGUgZXh0ZW50IGFkZHJlc3MgYW5kIGhhbmQgb2ZmIHRvIHhmc19mcmVlX2FnX2V4dGVudAorICogYWZ0ZXIgZml4aW5nIHVwIHRoZSBmcmVlbGlzdC4KKyAqLworaW50CQkJCS8qIGVycm9yICovCit4ZnNfZnJlZV9leHRlbnQoCisJeGZzX3RyYW5zX3QJKnRwLAkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2ZzYmxvY2tfdAlibm8sCS8qIHN0YXJ0aW5nIGJsb2NrIG51bWJlciBvZiBleHRlbnQgKi8KKwl4ZnNfZXh0bGVuX3QJbGVuKQkvKiBsZW5ndGggb2YgZXh0ZW50ICovCit7CisjaWZkZWYgREVCVUcKKwl4ZnNfYWdmX3QJKmFnZjsJLyogYS5nLiBmcmVlc3BhY2UgaGVhZGVyICovCisjZW5kaWYKKwl4ZnNfYWxsb2NfYXJnX3QJYXJnczsJLyogYWxsb2NhdGlvbiBhcmd1bWVudCBzdHJ1Y3R1cmUgKi8KKwlpbnQJCWVycm9yOworCisJQVNTRVJUKGxlbiAhPSAwKTsKKwlhcmdzLnRwID0gdHA7CisJYXJncy5tcCA9IHRwLT50X21vdW50cDsKKwlhcmdzLmFnbm8gPSBYRlNfRlNCX1RPX0FHTk8oYXJncy5tcCwgYm5vKTsKKwlBU1NFUlQoYXJncy5hZ25vIDwgYXJncy5tcC0+bV9zYi5zYl9hZ2NvdW50KTsKKwlhcmdzLmFnYm5vID0gWEZTX0ZTQl9UT19BR0JOTyhhcmdzLm1wLCBibm8pOworCWFyZ3MuYWxpZ25tZW50ID0gMTsKKwlhcmdzLm1pbmxlbiA9IGFyZ3MubWlubGVmdCA9IGFyZ3MubWluYWxpZ25zbG9wID0gMDsKKwlkb3duX3JlYWQoJmFyZ3MubXAtPm1fcGVyYWdsb2NrKTsKKwlhcmdzLnBhZyA9ICZhcmdzLm1wLT5tX3BlcmFnW2FyZ3MuYWdub107CisJaWYgKChlcnJvciA9IHhmc19hbGxvY19maXhfZnJlZWxpc3QoJmFyZ3MsIDApKSkKKwkJZ290byBlcnJvcjA7CisjaWZkZWYgREVCVUcKKwlBU1NFUlQoYXJncy5hZ2JwICE9IE5VTEwpOworCWFnZiA9IFhGU19CVUZfVE9fQUdGKGFyZ3MuYWdicCk7CisJQVNTRVJUKGFyZ3MuYWdibm8gKyBsZW4gPD0gSU5UX0dFVChhZ2YtPmFnZl9sZW5ndGgsIEFSQ0hfQ09OVkVSVCkpOworI2VuZGlmCisJZXJyb3IgPSB4ZnNfZnJlZV9hZ19leHRlbnQodHAsIGFyZ3MuYWdicCwgYXJncy5hZ25vLCBhcmdzLmFnYm5vLAorCQlsZW4sIDApOworZXJyb3IwOgorCXVwX3JlYWQoJmFyZ3MubXAtPm1fcGVyYWdsb2NrKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworLyoKKyAqIEFHIEJ1c3kgbGlzdCBtYW5hZ2VtZW50CisgKiBUaGUgYnVzeSBsaXN0IGNvbnRhaW5zIGJsb2NrIHJhbmdlcyB0aGF0IGhhdmUgYmVlbiBmcmVlZCBidXQgd2hvc2UKKyAqIHRyYW5zYWNhdGlvbnMgaGF2ZSBub3QgeWV0IGhpdCBkaXNrLiAgSWYgYW55IGJsb2NrIGxpc3RlZCBpbiBhIGJ1c3kKKyAqIGxpc3QgaXMgcmV1c2VkLCB0aGUgdHJhbnNhY3Rpb24gdGhhdCBmcmVlZCBpdCBtdXN0IGJlIGZvcmNlZCB0byBkaXNrCisgKiBiZWZvcmUgY29udGludWluZyB0byB1c2UgdGhlIGJsb2NrLgorICoKKyAqIHhmc19hbGxvY19tYXJrX2J1c3kgLSBhZGQgdG8gdGhlIHBlci1hZyBidXN5IGxpc3QKKyAqIHhmc19hbGxvY19jbGVhcl9idXN5IC0gcmVtb3ZlIGFuIGl0ZW0gZnJvbSB0aGUgcGVyLWFnIGJ1c3kgbGlzdAorICovCit2b2lkCit4ZnNfYWxsb2NfbWFya19idXN5KHhmc190cmFuc190ICp0cCwKKwkJICAgIHhmc19hZ251bWJlcl90IGFnbm8sCisJCSAgICB4ZnNfYWdibG9ja190IGJubywKKwkJICAgIHhmc19leHRsZW5fdCBsZW4pCit7CisJeGZzX21vdW50X3QJCSptcDsKKwl4ZnNfcGVyYWdfYnVzeV90CSpic3k7CisJaW50CQkJbjsKKwlTUExERUNMKHMpOworCisJbXAgPSB0cC0+dF9tb3VudHA7CisJcyA9IG11dGV4X3NwaW5sb2NrKCZtcC0+bV9wZXJhZ1thZ25vXS5wYWdiX2xvY2spOworCisJLyogc2VhcmNoIHBhZ2JfbGlzdCBmb3IgYW4gb3BlbiBzbG90ICovCisJZm9yIChic3kgPSBtcC0+bV9wZXJhZ1thZ25vXS5wYWdiX2xpc3QsIG4gPSAwOworCSAgICAgbiA8IFhGU19QQUdCX05VTV9TTE9UUzsKKwkgICAgIGJzeSsrLCBuKyspIHsKKwkJaWYgKGJzeS0+YnVzeV90cCA9PSBOVUxMKSB7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChuIDwgWEZTX1BBR0JfTlVNX1NMT1RTKSB7CisJCWJzeSA9ICZtcC0+bV9wZXJhZ1thZ25vXS5wYWdiX2xpc3Rbbl07CisJCW1wLT5tX3BlcmFnW2Fnbm9dLnBhZ2JfY291bnQrKzsKKwkJVFJBQ0VfQlVTWSgieGZzX2FsbG9jX21hcmtfYnVzeSIsICJnb3QiLCBhZ25vLCBibm8sIGxlbiwgbiwgdHApOworCQlic3ktPmJ1c3lfc3RhcnQgPSBibm87CisJCWJzeS0+YnVzeV9sZW5ndGggPSBsZW47CisJCWJzeS0+YnVzeV90cCA9IHRwOworCQl4ZnNfdHJhbnNfYWRkX2J1c3kodHAsIGFnbm8sIG4pOworCX0gZWxzZSB7CisJCVRSQUNFX0JVU1koInhmc19hbGxvY19tYXJrX2J1c3kiLCAiRlVMTCIsIGFnbm8sIGJubywgbGVuLCAtMSwgdHApOworCQkvKgorCQkgKiBUaGUgYnVzeSBsaXN0IGlzIGZ1bGwhICBTaW5jZSBpdCBpcyBub3cgbm90IHBvc3NpYmxlIHRvCisJCSAqIHRyYWNrIHRoZSBmcmVlIGJsb2NrLCBtYWtlIHRoaXMgYSBzeW5jaHJvbm91cyB0cmFuc2FjdGlvbgorCQkgKiB0byBpbnN1cmUgdGhhdCB0aGUgYmxvY2sgaXMgbm90IHJldXNlZCBiZWZvcmUgdGhpcworCQkgKiB0cmFuc2FjdGlvbiBjb21taXRzLgorCQkgKi8KKwkJeGZzX3RyYW5zX3NldF9zeW5jKHRwKTsKKwl9CisKKwltdXRleF9zcGludW5sb2NrKCZtcC0+bV9wZXJhZ1thZ25vXS5wYWdiX2xvY2ssIHMpOworfQorCit2b2lkCit4ZnNfYWxsb2NfY2xlYXJfYnVzeSh4ZnNfdHJhbnNfdCAqdHAsCisJCSAgICAgeGZzX2FnbnVtYmVyX3QgYWdubywKKwkJICAgICBpbnQgaWR4KQoreworCXhmc19tb3VudF90CQkqbXA7CisJeGZzX3BlcmFnX2J1c3lfdAkqbGlzdDsKKwlTUExERUNMKHMpOworCisJbXAgPSB0cC0+dF9tb3VudHA7CisKKwlzID0gbXV0ZXhfc3BpbmxvY2soJm1wLT5tX3BlcmFnW2Fnbm9dLnBhZ2JfbG9jayk7CisJbGlzdCA9IG1wLT5tX3BlcmFnW2Fnbm9dLnBhZ2JfbGlzdDsKKworCUFTU0VSVChpZHggPCBYRlNfUEFHQl9OVU1fU0xPVFMpOworCWlmIChsaXN0W2lkeF0uYnVzeV90cCA9PSB0cCkgeworCQlUUkFDRV9VTkJVU1koInhmc19hbGxvY19jbGVhcl9idXN5IiwgImZvdW5kIiwgYWdubywgaWR4LCB0cCk7CisJCWxpc3RbaWR4XS5idXN5X3RwID0gTlVMTDsKKwkJbXAtPm1fcGVyYWdbYWdub10ucGFnYl9jb3VudC0tOworCX0gZWxzZSB7CisJCVRSQUNFX1VOQlVTWSgieGZzX2FsbG9jX2NsZWFyX2J1c3kiLCAibWlzc2luZyIsIGFnbm8sIGlkeCwgdHApOworCX0KKworCW11dGV4X3NwaW51bmxvY2soJm1wLT5tX3BlcmFnW2Fnbm9dLnBhZ2JfbG9jaywgcyk7Cit9CisKKworLyoKKyAqIHJldHVybnMgbm9uLXplcm8gaWYgYW55IG9mIChhZ25vLGJubyk6bGVuIGlzIGluIGEgYnVzeSBsaXN0CisgKi8KK2ludAoreGZzX2FsbG9jX3NlYXJjaF9idXN5KHhmc190cmFuc190ICp0cCwKKwkJICAgIHhmc19hZ251bWJlcl90IGFnbm8sCisJCSAgICB4ZnNfYWdibG9ja190IGJubywKKwkJICAgIHhmc19leHRsZW5fdCBsZW4pCit7CisJeGZzX21vdW50X3QJCSptcDsKKwl4ZnNfcGVyYWdfYnVzeV90CSpic3k7CisJaW50CQkJbjsKKwl4ZnNfYWdibG9ja190CQl1ZW5kLCBiZW5kOworCXhmc19sc25fdAkJbHNuOworCWludAkJCWNudDsKKwlTUExERUNMKHMpOworCisJbXAgPSB0cC0+dF9tb3VudHA7CisKKwlzID0gbXV0ZXhfc3BpbmxvY2soJm1wLT5tX3BlcmFnW2Fnbm9dLnBhZ2JfbG9jayk7CisJY250ID0gbXAtPm1fcGVyYWdbYWdub10ucGFnYl9jb3VudDsKKworCXVlbmQgPSBibm8gKyBsZW4gLSAxOworCisJLyogc2VhcmNoIHBhZ2JfbGlzdCBmb3IgdGhpcyBzbG90LCBza2lwcGluZyBvcGVuIHNsb3RzICovCisJZm9yIChic3kgPSBtcC0+bV9wZXJhZ1thZ25vXS5wYWdiX2xpc3QsIG4gPSAwOworCSAgICAgY250OyBic3krKywgbisrKSB7CisKKwkJLyoKKwkJICogKHN0YXJ0MSxsZW5ndGgxKSB3aXRoaW4gKHN0YXJ0MiwgbGVuZ3RoMikKKwkJICovCisJCWlmIChic3ktPmJ1c3lfdHAgIT0gTlVMTCkgeworCQkJYmVuZCA9IGJzeS0+YnVzeV9zdGFydCArIGJzeS0+YnVzeV9sZW5ndGggLSAxOworCQkJaWYgKChibm8gPiBiZW5kKSB8fAorCQkJICAgICh1ZW5kIDwgYnN5LT5idXN5X3N0YXJ0KSkgeworCQkJCWNudC0tOworCQkJfSBlbHNlIHsKKwkJCQlUUkFDRV9CVVNZU0VBUkNIKCJ4ZnNfYWxsb2Nfc2VhcmNoX2J1c3kiLAorCQkJCQkJICJmb3VuZDEiLCBhZ25vLCBibm8sIGxlbiwgbiwKKwkJCQkJCSB0cCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIElmIGEgYmxvY2sgd2FzIGZvdW5kLCBmb3JjZSB0aGUgbG9nIHRocm91Z2ggdGhlIExTTiBvZiB0aGUKKwkgKiB0cmFuc2FjdGlvbiB0aGF0IGZyZWVkIHRoZSBibG9jaworCSAqLworCWlmIChjbnQpIHsKKwkJVFJBQ0VfQlVTWVNFQVJDSCgieGZzX2FsbG9jX3NlYXJjaF9idXN5IiwgImZvdW5kIiwgYWdubywgYm5vLCBsZW4sIG4sIHRwKTsKKwkJbHNuID0gYnN5LT5idXN5X3RwLT50X2NvbW1pdF9sc247CisJCW11dGV4X3NwaW51bmxvY2soJm1wLT5tX3BlcmFnW2Fnbm9dLnBhZ2JfbG9jaywgcyk7CisJCXhmc19sb2dfZm9yY2UobXAsIGxzbiwgWEZTX0xPR19GT1JDRXxYRlNfTE9HX1NZTkMpOworCX0gZWxzZSB7CisJCVRSQUNFX0JVU1lTRUFSQ0goInhmc19hbGxvY19zZWFyY2hfYnVzeSIsICJub3QtZm91bmQiLCBhZ25vLCBibm8sIGxlbiwgbiwgdHApOworCQluID0gLTE7CisJCW11dGV4X3NwaW51bmxvY2soJm1wLT5tX3BlcmFnW2Fnbm9dLnBhZ2JfbG9jaywgcyk7CisJfQorCisJcmV0dXJuIG47Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2FsbG9jLmggYi9mcy94ZnMveGZzX2FsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIzMjljOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfYWxsb2MuaApAQCAtMCwwICsxLDIwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfQUxMT0NfSF9fCisjZGVmaW5lCV9fWEZTX0FMTE9DX0hfXworCitzdHJ1Y3QgeGZzX2J1ZjsKK3N0cnVjdCB4ZnNfbW91bnQ7CitzdHJ1Y3QgeGZzX3BlcmFnOworc3RydWN0IHhmc190cmFuczsKKworLyoKKyAqIEZyZWVzcGFjZSBhbGxvY2F0aW9uIHR5cGVzLiAgQXJndW1lbnQgdG8geGZzX2FsbG9jX1t2XWV4dGVudC4KKyAqLwordHlwZWRlZiBlbnVtIHhmc19hbGxvY3R5cGUKK3sKKwlYRlNfQUxMT0NUWVBFX0FOWV9BRywJCS8qIGFsbG9jYXRlIGFueXdoZXJlLCB1c2Ugcm90b3IgKi8KKwlYRlNfQUxMT0NUWVBFX0ZJUlNUX0FHLAkJLyogLi4uIHN0YXJ0IGF0IGFnIDAgKi8KKwlYRlNfQUxMT0NUWVBFX1NUQVJUX0FHLAkJLyogYW55d2hlcmUsIHN0YXJ0IGluIHRoaXMgYS5nLiAqLworCVhGU19BTExPQ1RZUEVfVEhJU19BRywJCS8qIGFueXdoZXJlIGluIHRoaXMgYS5nLiAqLworCVhGU19BTExPQ1RZUEVfU1RBUlRfQk5PLAkvKiBuZWFyIHRoaXMgYmxvY2sgZWxzZSBhbnl3aGVyZSAqLworCVhGU19BTExPQ1RZUEVfTkVBUl9CTk8sCQkvKiBpbiB0aGlzIGEuZy4gYW5kIG5lYXIgdGhpcyBibG9jayAqLworCVhGU19BTExPQ1RZUEVfVEhJU19CTk8JCS8qIGF0IGV4YWN0bHkgdGhpcyBibG9jayAqLworfSB4ZnNfYWxsb2N0eXBlX3Q7CisKKy8qCisgKiBGbGFncyBmb3IgeGZzX2FsbG9jX2ZpeF9mcmVlbGlzdC4KKyAqLworI2RlZmluZQlYRlNfQUxMT0NfRkxBR19UUllMT0NLCTB4MDAwMDAwMDEgIC8qIHVzZSB0cnlsb2NrIGZvciBidWZmZXIgbG9ja2luZyAqLworCisvKgorICogQXJndW1lbnQgc3RydWN0dXJlIGZvciB4ZnNfYWxsb2Mgcm91dGluZXMuCisgKiBUaGlzIGlzIHR1cm5lZCBpbnRvIGEgc3RydWN0dXJlIHRvIGF2b2lkIGhhdmluZyAyMCBhcmd1bWVudHMgcGFzc2VkCisgKiBkb3duIHNldmVyYWwgbGV2ZWxzIG9mIHRoZSBzdGFjay4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2FsbG9jX2FyZyB7CisJc3RydWN0IHhmc190cmFucyAqdHA7CQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJc3RydWN0IHhmc19tb3VudCAqbXA7CQkvKiBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCXN0cnVjdCB4ZnNfYnVmCSphZ2JwOwkJLyogYnVmZmVyIGZvciBhLmcuIGZyZWVsaXN0IGhlYWRlciAqLworCXN0cnVjdCB4ZnNfcGVyYWcgKnBhZzsJCS8qIHBlci1hZyBzdHJ1Y3QgZm9yIHRoaXMgYWdubyAqLworCXhmc19mc2Jsb2NrX3QJZnNibm87CQkvKiBmaWxlIHN5c3RlbSBibG9jayBudW1iZXIgKi8KKwl4ZnNfYWdudW1iZXJfdAlhZ25vOwkJLyogYWxsb2NhdGlvbiBncm91cCBudW1iZXIgKi8KKwl4ZnNfYWdibG9ja190CWFnYm5vOwkJLyogYWxsb2NhdGlvbiBncm91cC1yZWxhdGl2ZSBibG9jayAjICovCisJeGZzX2V4dGxlbl90CW1pbmxlbjsJCS8qIG1pbmltdW0gc2l6ZSBvZiBleHRlbnQgKi8KKwl4ZnNfZXh0bGVuX3QJbWF4bGVuOwkJLyogbWF4aW11bSBzaXplIG9mIGV4dGVudCAqLworCXhmc19leHRsZW5fdAltb2Q7CQkvKiBtb2QgdmFsdWUgZm9yIGV4dGVudCBzaXplICovCisJeGZzX2V4dGxlbl90CXByb2Q7CQkvKiBwcm9kIHZhbHVlIGZvciBleHRlbnQgc2l6ZSAqLworCXhmc19leHRsZW5fdAltaW5sZWZ0OwkvKiBtaW4gYmxvY2tzIG11c3QgYmUgbGVmdCBhZnRlciB1cyAqLworCXhmc19leHRsZW5fdAl0b3RhbDsJCS8qIHRvdGFsIGJsb2NrcyBuZWVkZWQgaW4geGFjdGlvbiAqLworCXhmc19leHRsZW5fdAlhbGlnbm1lbnQ7CS8qIGFsaWduIGFuc3dlciB0byBtdWx0aXBsZSBvZiB0aGlzICovCisJeGZzX2V4dGxlbl90CW1pbmFsaWduc2xvcDsJLyogc2xvcCBmb3IgbWlubGVuK2FsaWdubWVudCBjYWxjcyAqLworCXhmc19leHRsZW5fdAlsZW47CQkvKiBvdXRwdXQ6IGFjdHVhbCBzaXplIG9mIGV4dGVudCAqLworCXhmc19hbGxvY3R5cGVfdAl0eXBlOwkJLyogYWxsb2NhdGlvbiB0eXBlIFhGU19BTExPQ1RZUEVfLi4uICovCisJeGZzX2FsbG9jdHlwZV90CW90eXBlOwkJLyogb3JpZ2luYWwgYWxsb2NhdGlvbiB0eXBlICovCisJY2hhcgkJd2FzZGVsOwkJLyogc2V0IGlmIGFsbG9jYXRpb24gd2FzIHByZXYgZGVsYXllZCAqLworCWNoYXIJCXdhc2Zyb21mbDsJLyogc2V0IGlmIGFsbG9jYXRpb24gaXMgZnJvbSBmcmVlbGlzdCAqLworCWNoYXIJCWlzZmw7CQkvKiBzZXQgaWYgaXMgZnJlZWxpc3QgYmxvY2tzIC0gIWFjdGcgKi8KKwljaGFyCQl1c2VyZGF0YTsJLyogc2V0IGlmIHRoaXMgaXMgdXNlciBkYXRhICovCit9IHhmc19hbGxvY19hcmdfdDsKKworLyoKKyAqIERlZmluZXMgZm9yIHVzZXJkYXRhCisgKi8KKyNkZWZpbmUgWEZTX0FMTE9DX1VTRVJEQVRBCQkxCS8qIGFsbG9jYXRpb24gaXMgZm9yIHVzZXIgZGF0YSovCisjZGVmaW5lIFhGU19BTExPQ19JTklUSUFMX1VTRVJfREFUQQkyCS8qIHNwZWNpYWwgY2FzZSBzdGFydCBvZiBmaWxlICovCisKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2lmIGRlZmluZWQoWEZTX0FMTE9DX1RSQUNFKQorLyoKKyAqIEFsbG9jYXRpb24gdHJhY2luZyBidWZmZXIgc2l6ZS4KKyAqLworI2RlZmluZQlYRlNfQUxMT0NfVFJBQ0VfU0laRQk0MDk2CitleHRlcm4ga3RyYWNlX3QgKnhmc19hbGxvY190cmFjZV9idWY7CisKKy8qCisgKiBUeXBlcyBmb3IgYWxsb2MgdHJhY2luZy4KKyAqLworI2RlZmluZQlYRlNfQUxMT0NfS1RSQUNFX0FMTE9DCTEKKyNkZWZpbmUJWEZTX0FMTE9DX0tUUkFDRV9GUkVFCTIKKyNkZWZpbmUJWEZTX0FMTE9DX0tUUkFDRV9NT0RBR0YJMworI2RlZmluZQlYRlNfQUxMT0NfS1RSQUNFX0JVU1kJNAorI2RlZmluZQlYRlNfQUxMT0NfS1RSQUNFX1VOQlVTWQk1CisjZGVmaW5lCVhGU19BTExPQ19LVFJBQ0VfQlVTWVNFQVJDSAk2CisjZW5kaWYKKworLyoKKyAqIENvbXB1dGUgYW5kIGZpbGwgaW4gdmFsdWUgb2YgbV9hZ19tYXhsZXZlbHMuCisgKi8KK3ZvaWQKK3hmc19hbGxvY19jb21wdXRlX21heGxldmVscygKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCk7CS8qIGZpbGUgc3lzdGVtIG1vdW50IHN0cnVjdHVyZSAqLworCisvKgorICogR2V0IGEgYmxvY2sgZnJvbSB0aGUgZnJlZWxpc3QuCisgKiBSZXR1cm5zIHdpdGggdGhlIGJ1ZmZlciBmb3IgdGhlIGJsb2NrIGdvdHRlbi4KKyAqLworaW50CQkJCS8qIGVycm9yICovCit4ZnNfYWxsb2NfZ2V0X2ZyZWVsaXN0KAorCXN0cnVjdCB4ZnNfdHJhbnMgKnRwLAkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJc3RydWN0IHhmc19idWYJKmFnYnAsCS8qIGJ1ZmZlciBjb250YWluaW5nIHRoZSBhZ2Ygc3RydWN0dXJlICovCisJeGZzX2FnYmxvY2tfdAkqYm5vcCk7CS8qIGJsb2NrIGFkZHJlc3MgcmV0cmlldmVkIGZyb20gZnJlZWxpc3QgKi8KKworLyoKKyAqIExvZyB0aGUgZ2l2ZW4gZmllbGRzIGZyb20gdGhlIGFnZiBzdHJ1Y3R1cmUuCisgKi8KK3ZvaWQKK3hmc19hbGxvY19sb2dfYWdmKAorCXN0cnVjdCB4ZnNfdHJhbnMgKnRwLAkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJc3RydWN0IHhmc19idWYJKmJwLAkvKiBidWZmZXIgZm9yIGEuZy4gZnJlZWxpc3QgaGVhZGVyICovCisJaW50CQlmaWVsZHMpOy8qIG1hc2sgb2YgZmllbGRzIHRvIGJlIGxvZ2dlZCAoWEZTX0FHRl8uLi4pICovCisKKy8qCisgKiBJbnRlcmZhY2UgZm9yIGlub2RlIGFsbG9jYXRpb24gdG8gZm9yY2UgdGhlIHBhZyBkYXRhIHRvIGJlIGluaXRpYWxpemVkLgorICovCitpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19hbGxvY19wYWdmX2luaXQoCisJc3RydWN0IHhmc19tb3VudCAqbXAsCS8qIGZpbGUgc3lzdGVtIG1vdW50IHN0cnVjdHVyZSAqLworCXN0cnVjdCB4ZnNfdHJhbnMgKnRwLAkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2FnbnVtYmVyX3QJYWdubywJLyogYWxsb2NhdGlvbiBncm91cCBudW1iZXIgKi8KKwlpbnQJCWZsYWdzKTsJLyogWEZTX0FMTE9DX0ZMQUdTXy4uLiAqLworCisvKgorICogUHV0IHRoZSBibG9jayBvbiB0aGUgZnJlZWxpc3QgZm9yIHRoZSBhbGxvY2F0aW9uIGdyb3VwLgorICovCitpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19hbGxvY19wdXRfZnJlZWxpc3QoCisJc3RydWN0IHhmc190cmFucyAqdHAsCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgeGZzX2J1ZgkqYWdicCwJLyogYnVmZmVyIGZvciBhLmcuIGZyZWVsaXN0IGhlYWRlciAqLworCXN0cnVjdCB4ZnNfYnVmCSphZ2ZsYnAsLyogYnVmZmVyIGZvciBhLmcuIGZyZWUgYmxvY2sgYXJyYXkgKi8KKwl4ZnNfYWdibG9ja190CWJubyk7CS8qIGJsb2NrIGJlaW5nIGZyZWVkICovCisKKy8qCisgKiBSZWFkIGluIHRoZSBhbGxvY2F0aW9uIGdyb3VwIGhlYWRlciAoZnJlZS9hbGxvYyBzZWN0aW9uKS4KKyAqLworaW50CQkJCQkvKiBlcnJvciAgKi8KK3hmc19hbGxvY19yZWFkX2FnZigKKwlzdHJ1Y3QgeGZzX21vdW50ICptcCwJCS8qIG1vdW50IHBvaW50IHN0cnVjdHVyZSAqLworCXN0cnVjdCB4ZnNfdHJhbnMgKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19hZ251bWJlcl90CWFnbm8sCQkvKiBhbGxvY2F0aW9uIGdyb3VwIG51bWJlciAqLworCWludAkJZmxhZ3MsCQkvKiBYRlNfQUxMT0NfRkxBR18uLi4gKi8KKwlzdHJ1Y3QgeGZzX2J1ZgkqKmJwcCk7CQkvKiBidWZmZXIgZm9yIHRoZSBhZyBmcmVlbGlzdCBoZWFkZXIgKi8KKworLyoKKyAqIEFsbG9jYXRlIGFuIGV4dGVudCAodmFyaWFibGUtc2l6ZSkuCisgKi8KK2ludAkJCQkvKiBlcnJvciAqLworeGZzX2FsbG9jX3ZleHRlbnQoCisJeGZzX2FsbG9jX2FyZ190CSphcmdzKTsJLyogYWxsb2NhdGlvbiBhcmd1bWVudCBzdHJ1Y3R1cmUgKi8KKworLyoKKyAqIEZyZWUgYW4gZXh0ZW50LgorICovCitpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19mcmVlX2V4dGVudCgKKwlzdHJ1Y3QgeGZzX3RyYW5zICp0cCwJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19mc2Jsb2NrX3QJYm5vLAkvKiBzdGFydGluZyBibG9jayBudW1iZXIgb2YgZXh0ZW50ICovCisJeGZzX2V4dGxlbl90CWxlbik7CS8qIGxlbmd0aCBvZiBleHRlbnQgKi8KKwordm9pZAoreGZzX2FsbG9jX21hcmtfYnVzeSh4ZnNfdHJhbnNfdCAqdHAsCisJCXhmc19hZ251bWJlcl90IGFnbm8sCisJCXhmc19hZ2Jsb2NrX3QgYm5vLAorCQl4ZnNfZXh0bGVuX3QgbGVuKTsKKwordm9pZAoreGZzX2FsbG9jX2NsZWFyX2J1c3koeGZzX3RyYW5zX3QgKnRwLAorCQl4ZnNfYWdudW1iZXJfdCBhZywKKwkJaW50IGlkeCk7CisKKworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmCS8qIF9fWEZTX0FMTE9DX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hbGxvY19idHJlZS5jIGIvZnMveGZzL3hmc19hbGxvY19idHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMzU1YTEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2FsbG9jX2J0cmVlLmMKQEAgLTAsMCArMSwyMjA0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisvKgorICogRnJlZSBzcGFjZSBhbGxvY2F0aW9uIGZvciBYRlMuCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvYy5oIgorI2luY2x1ZGUgInhmc19hbGxvYy5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorCisvKgorICogUHJvdG90eXBlcyBmb3IgaW50ZXJuYWwgZnVuY3Rpb25zLgorICovCisKK1NUQVRJQyB2b2lkIHhmc19hbGxvY19sb2dfYmxvY2soeGZzX3RyYW5zX3QgKiwgeGZzX2J1Zl90ICosIGludCk7CitTVEFUSUMgdm9pZCB4ZnNfYWxsb2NfbG9nX2tleXMoeGZzX2J0cmVlX2N1cl90ICosIHhmc19idWZfdCAqLCBpbnQsIGludCk7CitTVEFUSUMgdm9pZCB4ZnNfYWxsb2NfbG9nX3B0cnMoeGZzX2J0cmVlX2N1cl90ICosIHhmc19idWZfdCAqLCBpbnQsIGludCk7CitTVEFUSUMgdm9pZCB4ZnNfYWxsb2NfbG9nX3JlY3MoeGZzX2J0cmVlX2N1cl90ICosIHhmc19idWZfdCAqLCBpbnQsIGludCk7CitTVEFUSUMgaW50IHhmc19hbGxvY19sc2hpZnQoeGZzX2J0cmVlX2N1cl90ICosIGludCwgaW50ICopOworU1RBVElDIGludCB4ZnNfYWxsb2NfbmV3cm9vdCh4ZnNfYnRyZWVfY3VyX3QgKiwgaW50ICopOworU1RBVElDIGludCB4ZnNfYWxsb2NfcnNoaWZ0KHhmc19idHJlZV9jdXJfdCAqLCBpbnQsIGludCAqKTsKK1NUQVRJQyBpbnQgeGZzX2FsbG9jX3NwbGl0KHhmc19idHJlZV9jdXJfdCAqLCBpbnQsIHhmc19hZ2Jsb2NrX3QgKiwKKwkJeGZzX2FsbG9jX2tleV90ICosIHhmc19idHJlZV9jdXJfdCAqKiwgaW50ICopOworU1RBVElDIGludCB4ZnNfYWxsb2NfdXBka2V5KHhmc19idHJlZV9jdXJfdCAqLCB4ZnNfYWxsb2Nfa2V5X3QgKiwgaW50KTsKKworLyoKKyAqIEludGVybmFsIGZ1bmN0aW9ucy4KKyAqLworCisvKgorICogU2luZ2xlIGxldmVsIG9mIHRoZSB4ZnNfYWxsb2NfZGVsZXRlIHJlY29yZCBkZWxldGlvbiByb3V0aW5lLgorICogRGVsZXRlIHJlY29yZCBwb2ludGVkIHRvIGJ5IGN1ci9sZXZlbC4KKyAqIFJlbW92ZSB0aGUgcmVjb3JkIGZyb20gaXRzIGJsb2NrIHRoZW4gcmViYWxhbmNlIHRoZSB0cmVlLgorICogUmV0dXJuIDAgZm9yIGVycm9yLCAxIGZvciBkb25lLCAyIHRvIGdvIG9uIHRvIHRoZSBuZXh0IGxldmVsLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfYWxsb2NfZGVscmVjKAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkJbGV2ZWwsCS8qIGxldmVsIHJlbW92aW5nIHJlY29yZCBmcm9tICovCisJaW50CQkJKnN0YXQpCS8qIGZhaWwvZG9uZS9nby1vbiAqLworeworCXhmc19hZ2ZfdAkJKmFnZjsJLyogYWxsb2NhdGlvbiBncm91cCBmcmVlbGlzdCBoZWFkZXIgKi8KKwl4ZnNfYWxsb2NfYmxvY2tfdAkqYmxvY2s7CS8qIGJ0cmVlIGJsb2NrIHJlY29yZC9rZXkgbGl2ZXMgaW4gKi8KKwl4ZnNfYWdibG9ja190CQlibm87CS8qIGJ0cmVlIGJsb2NrIG51bWJlciAqLworCXhmc19idWZfdAkJKmJwOwkvKiBidWZmZXIgZm9yIGJsb2NrICovCisJaW50CQkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCWludAkJCWk7CS8qIGxvb3AgaW5kZXggKi8KKwl4ZnNfYWxsb2Nfa2V5X3QJCWtleTsJLyoga3AgcG9pbnRzIGhlcmUgaWYgYmxvY2sgaXMgbGV2ZWwgMCAqLworCXhmc19hZ2Jsb2NrX3QJCWxibm87CS8qIGxlZnQgYmxvY2sncyBibG9jayBudW1iZXIgKi8KKwl4ZnNfYnVmX3QJCSpsYnA7CS8qIGxlZnQgYmxvY2sncyBidWZmZXIgcG9pbnRlciAqLworCXhmc19hbGxvY19ibG9ja190CSpsZWZ0OwkvKiBsZWZ0IGJ0cmVlIGJsb2NrICovCisJeGZzX2FsbG9jX2tleV90CQkqbGtwPU5VTEw7CS8qIGxlZnQgYmxvY2sga2V5IHBvaW50ZXIgKi8KKwl4ZnNfYWxsb2NfcHRyX3QJCSpscHA9TlVMTDsJLyogbGVmdCBibG9jayBhZGRyZXNzIHBvaW50ZXIgKi8KKwlpbnQJCQlscmVjcz0wOwkvKiBudW1iZXIgb2YgcmVjb3JkcyBpbiBsZWZ0IGJsb2NrICovCisJeGZzX2FsbG9jX3JlY190CQkqbHJwOwkvKiBsZWZ0IGJsb2NrIHJlY29yZCBwb2ludGVyICovCisJeGZzX21vdW50X3QJCSptcDsJLyogbW91bnQgc3RydWN0dXJlICovCisJaW50CQkJcHRyOwkvKiBpbmRleCBpbiBidHJlZSBibG9jayBmb3IgdGhpcyByZWMgKi8KKwl4ZnNfYWdibG9ja190CQlyYm5vOwkvKiByaWdodCBibG9jaydzIGJsb2NrIG51bWJlciAqLworCXhmc19idWZfdAkJKnJicDsJLyogcmlnaHQgYmxvY2sncyBidWZmZXIgcG9pbnRlciAqLworCXhmc19hbGxvY19ibG9ja190CSpyaWdodDsJLyogcmlnaHQgYnRyZWUgYmxvY2sgKi8KKwl4ZnNfYWxsb2Nfa2V5X3QJCSpya3A7CS8qIHJpZ2h0IGJsb2NrIGtleSBwb2ludGVyICovCisJeGZzX2FsbG9jX3B0cl90CQkqcnBwOwkvKiByaWdodCBibG9jayBhZGRyZXNzIHBvaW50ZXIgKi8KKwlpbnQJCQlycmVjcz0wOwkvKiBudW1iZXIgb2YgcmVjb3JkcyBpbiByaWdodCBibG9jayAqLworCXhmc19hbGxvY19yZWNfdAkJKnJycDsJLyogcmlnaHQgYmxvY2sgcmVjb3JkIHBvaW50ZXIgKi8KKwl4ZnNfYnRyZWVfY3VyX3QJCSp0Y3VyOwkvKiB0ZW1wb3JhcnkgYnRyZWUgY3Vyc29yICovCisKKwkvKgorCSAqIEdldCB0aGUgaW5kZXggb2YgdGhlIGVudHJ5IGJlaW5nIGRlbGV0ZWQsIGNoZWNrIGZvciBub3RoaW5nIHRoZXJlLgorCSAqLworCXB0ciA9IGN1ci0+YmNfcHRyc1tsZXZlbF07CisJaWYgKHB0ciA9PSAwKSB7CisJCSpzdGF0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogR2V0IHRoZSBidWZmZXIgJiBibG9jayBjb250YWluaW5nIHRoZSByZWNvcmQgb3Iga2V5L3B0ci4KKwkgKi8KKwlicCA9IGN1ci0+YmNfYnVmc1tsZXZlbF07CisJYmxvY2sgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKGJwKTsKKyNpZmRlZiBERUJVRworCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgYmxvY2ssIGxldmVsLCBicCkpKQorCQlyZXR1cm4gZXJyb3I7CisjZW5kaWYKKwkvKgorCSAqIEZhaWwgaWYgd2UncmUgb2ZmIHRoZSBlbmQgb2YgdGhlIGJsb2NrLgorCSAqLworCWlmIChwdHIgPiBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKSB7CisJCSpzdGF0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCVhGU19TVEFUU19JTkMoeHNfYWJ0X2RlbHJlYyk7CisJLyoKKwkgKiBJdCdzIGEgbm9ubGVhZi4gIEV4Y2lzZSB0aGUga2V5IGFuZCBwdHIgYmVpbmcgZGVsZXRlZCwgYnkKKwkgKiBzbGlkaW5nIHRoZSBlbnRyaWVzIHBhc3QgdGhlbSBkb3duIG9uZS4KKwkgKiBMb2cgdGhlIGNoYW5nZWQgYXJlYXMgb2YgdGhlIGJsb2NrLgorCSAqLworCWlmIChsZXZlbCA+IDApIHsKKwkJbGtwID0gWEZTX0FMTE9DX0tFWV9BRERSKGJsb2NrLCAxLCBjdXIpOworCQlscHAgPSBYRlNfQUxMT0NfUFRSX0FERFIoYmxvY2ssIDEsIGN1cik7CisjaWZkZWYgREVCVUcKKwkJZm9yIChpID0gcHRyOyBpIDwgSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsgaSsrKSB7CisJCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NwdHIoY3VyLCBJTlRfR0VUKGxwcFtpXSwgQVJDSF9DT05WRVJUKSwgbGV2ZWwpKSkKKwkJCQlyZXR1cm4gZXJyb3I7CisJCX0KKyNlbmRpZgorCQlpZiAocHRyIDwgSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkgeworCQkJbWVtbW92ZSgmbGtwW3B0ciAtIDFdLCAmbGtwW3B0cl0sCisJCQkJKElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgLSBwdHIpICogc2l6ZW9mKCpsa3ApKTsgLyogSU5UXzogbWVtIGNvcHkgKi8KKwkJCW1lbW1vdmUoJmxwcFtwdHIgLSAxXSwgJmxwcFtwdHJdLAorCQkJCShJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIC0gcHRyKSAqIHNpemVvZigqbHBwKSk7IC8qIElOVF86IG1lbSBjb3B5ICovCisJCQl4ZnNfYWxsb2NfbG9nX3B0cnMoY3VyLCBicCwgcHRyLCBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIC0gMSk7CisJCQl4ZnNfYWxsb2NfbG9nX2tleXMoY3VyLCBicCwgcHRyLCBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIC0gMSk7CisJCX0KKwl9CisJLyoKKwkgKiBJdCdzIGEgbGVhZi4gIEV4Y2lzZSB0aGUgcmVjb3JkIGJlaW5nIGRlbGV0ZWQsIGJ5IHNsaWRpbmcgdGhlCisJICogZW50cmllcyBwYXN0IGl0IGRvd24gb25lLiAgTG9nIHRoZSBjaGFuZ2VkIGFyZWFzIG9mIHRoZSBibG9jay4KKwkgKi8KKwllbHNlIHsKKwkJbHJwID0gWEZTX0FMTE9DX1JFQ19BRERSKGJsb2NrLCAxLCBjdXIpOworCQlpZiAocHRyIDwgSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkgeworCQkJbWVtbW92ZSgmbHJwW3B0ciAtIDFdLCAmbHJwW3B0cl0sCisJCQkJKElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgLSBwdHIpICogc2l6ZW9mKCpscnApKTsKKwkJCXhmc19hbGxvY19sb2dfcmVjcyhjdXIsIGJwLCBwdHIsIElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgLSAxKTsKKwkJfQorCQkvKgorCQkgKiBJZiBpdCdzIHRoZSBmaXJzdCByZWNvcmQgaW4gdGhlIGJsb2NrLCB3ZSdsbCBuZWVkIGEga2V5CisJCSAqIHN0cnVjdHVyZSB0byBwYXNzIHVwIHRvIHRoZSBuZXh0IGxldmVsICh1cGRrZXkpLgorCQkgKi8KKwkJaWYgKHB0ciA9PSAxKSB7CisJCQlrZXkuYXJfc3RhcnRibG9jayA9IGxycC0+YXJfc3RhcnRibG9jazsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KKwkJCWtleS5hcl9ibG9ja2NvdW50ID0gbHJwLT5hcl9ibG9ja2NvdW50OyAvKiBJTlRfOiBkaXJlY3QgY29weSAqLworCQkJbGtwID0gJmtleTsKKwkJfQorCX0KKwkvKgorCSAqIERlY3JlbWVudCBhbmQgbG9nIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgYmxvY2suCisJICovCisJSU5UX01PRChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCAtMSk7CisJeGZzX2FsbG9jX2xvZ19ibG9jayhjdXItPmJjX3RwLCBicCwgWEZTX0JCX05VTVJFQ1MpOworCS8qCisJICogU2VlIGlmIHRoZSBsb25nZXN0IGZyZWUgZXh0ZW50IGluIHRoZSBhbGxvY2F0aW9uIGdyb3VwIHdhcworCSAqIGNoYW5nZWQgYnkgdGhpcyBvcGVyYXRpb24uICBUcnVlIGlmIGl0J3MgdGhlIGJ5LXNpemUgYnRyZWUsIGFuZAorCSAqIHRoaXMgaXMgdGhlIGxlYWYgbGV2ZWwsIGFuZCB0aGVyZSBpcyBubyByaWdodCBzaWJsaW5nIGJsb2NrLAorCSAqIGFuZCB0aGlzIHdhcyB0aGUgbGFzdCByZWNvcmQuCisJICovCisJYWdmID0gWEZTX0JVRl9UT19BR0YoY3VyLT5iY19wcml2YXRlLmEuYWdicCk7CisJbXAgPSBjdXItPmJjX21wOworCisJaWYgKGxldmVsID09IDAgJiYKKwkgICAgY3VyLT5iY19idG51bSA9PSBYRlNfQlROVU1fQ05UICYmCisJICAgIElOVF9HRVQoYmxvY2stPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpID09IE5VTExBR0JMT0NLICYmCisJICAgIHB0ciA+IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJQVNTRVJUKHB0ciA9PSBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICsgMSk7CisJCS8qCisJCSAqIFRoZXJlIGFyZSBzdGlsbCByZWNvcmRzIGluIHRoZSBibG9jay4gIEdyYWIgdGhlIHNpemUKKwkJICogZnJvbSB0aGUgbGFzdCBvbmUuCisJCSAqLworCQlpZiAoSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkgeworCQkJcnJwID0gWEZTX0FMTE9DX1JFQ19BRERSKGJsb2NrLCBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpLCBjdXIpOworCQkJSU5UX0NPUFkoYWdmLT5hZ2ZfbG9uZ2VzdCwgcnJwLT5hcl9ibG9ja2NvdW50LCBBUkNIX0NPTlZFUlQpOworCQl9CisJCS8qCisJCSAqIE5vIGZyZWUgZXh0ZW50cyBsZWZ0LgorCQkgKi8KKwkJZWxzZQorCQkJYWdmLT5hZ2ZfbG9uZ2VzdCA9IDA7CisJCW1wLT5tX3BlcmFnW0lOVF9HRVQoYWdmLT5hZ2Zfc2Vxbm8sIEFSQ0hfQ09OVkVSVCldLnBhZ2ZfbG9uZ2VzdCA9CisJCQlJTlRfR0VUKGFnZi0+YWdmX2xvbmdlc3QsIEFSQ0hfQ09OVkVSVCk7CisJCXhmc19hbGxvY19sb2dfYWdmKGN1ci0+YmNfdHAsIGN1ci0+YmNfcHJpdmF0ZS5hLmFnYnAsCisJCQlYRlNfQUdGX0xPTkdFU1QpOworCX0KKwkvKgorCSAqIElzIHRoaXMgdGhlIHJvb3QgbGV2ZWw/ICBJZiBzbywgd2UncmUgYWxtb3N0IGRvbmUuCisJICovCisJaWYgKGxldmVsID09IGN1ci0+YmNfbmxldmVscyAtIDEpIHsKKwkJLyoKKwkJICogSWYgdGhpcyBpcyB0aGUgcm9vdCBsZXZlbCwKKwkJICogYW5kIHRoZXJlJ3Mgb25seSBvbmUgZW50cnkgbGVmdCwKKwkJICogYW5kIGl0J3MgTk9UIHRoZSBsZWFmIGxldmVsLAorCQkgKiB0aGVuIHdlIGNhbiBnZXQgcmlkIG9mIHRoaXMgbGV2ZWwuCisJCSAqLworCQlpZiAoSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSA9PSAxICYmIGxldmVsID4gMCkgeworCQkJLyoKKwkJCSAqIGxwcCBpcyBzdGlsbCBzZXQgdG8gdGhlIGZpcnN0IHBvaW50ZXIgaW4gdGhlIGJsb2NrLgorCQkJICogTWFrZSBpdCB0aGUgbmV3IHJvb3Qgb2YgdGhlIGJ0cmVlLgorCQkJICovCisJCQlibm8gPSBJTlRfR0VUKGFnZi0+YWdmX3Jvb3RzW2N1ci0+YmNfYnRudW1dLCBBUkNIX0NPTlZFUlQpOworCQkJSU5UX0NPUFkoYWdmLT5hZ2Zfcm9vdHNbY3VyLT5iY19idG51bV0sICpscHAsIEFSQ0hfQ09OVkVSVCk7CisJCQlJTlRfTU9EKGFnZi0+YWdmX2xldmVsc1tjdXItPmJjX2J0bnVtXSwgQVJDSF9DT05WRVJULCAtMSk7CisJCQltcC0+bV9wZXJhZ1tJTlRfR0VUKGFnZi0+YWdmX3NlcW5vLCBBUkNIX0NPTlZFUlQpXS5wYWdmX2xldmVsc1tjdXItPmJjX2J0bnVtXS0tOworCQkJLyoKKwkJCSAqIFB1dCB0aGlzIGJ1ZmZlci9ibG9jayBvbiB0aGUgYWcncyBmcmVlbGlzdC4KKwkJCSAqLworCQkJaWYgKChlcnJvciA9IHhmc19hbGxvY19wdXRfZnJlZWxpc3QoY3VyLT5iY190cCwKKwkJCQkJY3VyLT5iY19wcml2YXRlLmEuYWdicCwgTlVMTCwgYm5vKSkpCisJCQkJcmV0dXJuIGVycm9yOworCQkJLyoKKwkJCSAqIFNpbmNlIGJsb2NrcyBtb3ZlIHRvIHRoZSBmcmVlIGxpc3Qgd2l0aG91dCB0aGUKKwkJCSAqIGNvb3JkaW5hdGlvbiB1c2VkIGluIHhmc19ibWFwX2ZpbmlzaCwgd2UgY2FuJ3QgYWxsb3cKKwkJCSAqIGJsb2NrIHRvIGJlIGF2YWlsYWJsZSBmb3IgcmVhbGxvY2F0aW9uIGFuZAorCQkJICogbm9uLXRyYW5zYWN0aW9uIHdyaXRpbmcgKHVzZXIgZGF0YSkgdW50aWwgd2Uga25vdworCQkJICogdGhhdCB0aGUgdHJhbnNhY3Rpb24gdGhhdCBtb3ZlZCBpdCB0byB0aGUgZnJlZSBsaXN0CisJCQkgKiBpcyBwZXJtYW5lbnRseSBvbiBkaXNrLiBXZSB0cmFjayB0aGUgYmxvY2tzIGJ5CisJCQkgKiBkZWNsYXJpbmcgdGhlc2UgYmxvY2tzIGFzICJidXN5IjsgdGhlIGJ1c3kgbGlzdCBpcworCQkJICogbWFpbnRhaW5lZCBvbiBhIHBlci1hZyBiYXNpcyBhbmQgZWFjaCB0cmFuc2FjdGlvbgorCQkJICogcmVjb3JkcyB3aGljaCBlbnRyaWVzIHNob3VsZCBiZSByZW1vdmVkIHdoZW4gdGhlCisJCQkgKiBpY2xvZyBjb21taXRzIHRvIGRpc2suIElmIGEgYnVzeSBibG9jayBpcworCQkJICogYWxsb2NhdGVkLCB0aGUgaWNsb2cgaXMgcHVzaGVkIHVwIHRvIHRoZSBMU04KKwkJCSAqIHRoYXQgZnJlZWQgdGhlIGJsb2NrLgorCQkJICovCisJCQl4ZnNfYWxsb2NfbWFya19idXN5KGN1ci0+YmNfdHAsCisJCQkJSU5UX0dFVChhZ2YtPmFnZl9zZXFubywgQVJDSF9DT05WRVJUKSwgYm5vLCAxKTsKKworCQkJeGZzX3RyYW5zX2FnYnRyZWVfZGVsdGEoY3VyLT5iY190cCwgLTEpOworCQkJeGZzX2FsbG9jX2xvZ19hZ2YoY3VyLT5iY190cCwgY3VyLT5iY19wcml2YXRlLmEuYWdicCwKKwkJCQlYRlNfQUdGX1JPT1RTIHwgWEZTX0FHRl9MRVZFTFMpOworCQkJLyoKKwkJCSAqIFVwZGF0ZSB0aGUgY3Vyc29yIHNvIHRoZXJlJ3Mgb25lIGZld2VyIGxldmVsLgorCQkJICovCisJCQl4ZnNfYnRyZWVfc2V0YnVmKGN1ciwgbGV2ZWwsIE5VTEwpOworCQkJY3VyLT5iY19ubGV2ZWxzLS07CisJCX0gZWxzZSBpZiAobGV2ZWwgPiAwICYmCisJCQkgICAoZXJyb3IgPSB4ZnNfYWxsb2NfZGVjcmVtZW50KGN1ciwgbGV2ZWwsICZpKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCSpzdGF0ID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogSWYgd2UgZGVsZXRlZCB0aGUgbGVmdG1vc3QgZW50cnkgaW4gdGhlIGJsb2NrLCB1cGRhdGUgdGhlCisJICoga2V5IHZhbHVlcyBhYm92ZSB1cyBpbiB0aGUgdHJlZS4KKwkgKi8KKwlpZiAocHRyID09IDEgJiYgKGVycm9yID0geGZzX2FsbG9jX3VwZGtleShjdXIsIGxrcCwgbGV2ZWwgKyAxKSkpCisJCXJldHVybiBlcnJvcjsKKwkvKgorCSAqIElmIHRoZSBudW1iZXIgb2YgcmVjb3JkcyByZW1haW5pbmcgaW4gdGhlIGJsb2NrIGlzIGF0IGxlYXN0CisJICogdGhlIG1pbmltdW0sIHdlJ3JlIGRvbmUuCisJICovCisJaWYgKElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgPj0gWEZTX0FMTE9DX0JMT0NLX01JTlJFQ1MobGV2ZWwsIGN1cikpIHsKKwkJaWYgKGxldmVsID4gMCAmJiAoZXJyb3IgPSB4ZnNfYWxsb2NfZGVjcmVtZW50KGN1ciwgbGV2ZWwsICZpKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCSpzdGF0ID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogT3RoZXJ3aXNlLCB3ZSBoYXZlIHRvIG1vdmUgc29tZSByZWNvcmRzIGFyb3VuZCB0byBrZWVwIHRoZQorCSAqIHRyZWUgYmFsYW5jZWQuICBMb29rIGF0IHRoZSBsZWZ0IGFuZCByaWdodCBzaWJsaW5nIGJsb2NrcyB0bworCSAqIHNlZSBpZiB3ZSBjYW4gcmUtYmFsYW5jZSBieSBtb3Zpbmcgb25seSBvbmUgcmVjb3JkLgorCSAqLworCXJibm8gPSBJTlRfR0VUKGJsb2NrLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKTsKKwlsYm5vID0gSU5UX0dFVChibG9jay0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJUKTsKKwlibm8gPSBOVUxMQUdCTE9DSzsKKwlBU1NFUlQocmJubyAhPSBOVUxMQUdCTE9DSyB8fCBsYm5vICE9IE5VTExBR0JMT0NLKTsKKwkvKgorCSAqIER1cGxpY2F0ZSB0aGUgY3Vyc29yIHNvIG91ciBidHJlZSBtYW5pcHVsYXRpb25zIGhlcmUgd29uJ3QKKwkgKiBkaXNydXB0IHRoZSBuZXh0IGxldmVsIHVwLgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfZHVwX2N1cnNvcihjdXIsICZ0Y3VyKSkpCisJCXJldHVybiBlcnJvcjsKKwkvKgorCSAqIElmIHRoZXJlJ3MgYSByaWdodCBzaWJsaW5nLCBzZWUgaWYgaXQncyBvayB0byBzaGlmdCBhbiBlbnRyeQorCSAqIG91dCBvZiBpdC4KKwkgKi8KKwlpZiAocmJubyAhPSBOVUxMQUdCTE9DSykgeworCQkvKgorCQkgKiBNb3ZlIHRoZSB0ZW1wIGN1cnNvciB0byB0aGUgbGFzdCBlbnRyeSBpbiB0aGUgbmV4dCBibG9jay4KKwkJICogQWN0dWFsbHkgYW55IGVudHJ5IGJ1dCB0aGUgZmlyc3Qgd291bGQgc3VmZmljZS4KKwkJICovCisJCWkgPSB4ZnNfYnRyZWVfbGFzdHJlYyh0Y3VyLCBsZXZlbCk7CisJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19pbmNyZW1lbnQodGN1ciwgbGV2ZWwsICZpKSkpCisJCQlnb3RvIGVycm9yMDsKKwkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCQlpID0geGZzX2J0cmVlX2xhc3RyZWModGN1ciwgbGV2ZWwpOworCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCS8qCisJCSAqIEdyYWIgYSBwb2ludGVyIHRvIHRoZSBibG9jay4KKwkJICovCisJCXJicCA9IHRjdXItPmJjX2J1ZnNbbGV2ZWxdOworCQlyaWdodCA9IFhGU19CVUZfVE9fQUxMT0NfQkxPQ0socmJwKTsKKyNpZmRlZiBERUJVRworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIHJpZ2h0LCBsZXZlbCwgcmJwKSkpCisJCQlnb3RvIGVycm9yMDsKKyNlbmRpZgorCQkvKgorCQkgKiBHcmFiIHRoZSBjdXJyZW50IGJsb2NrIG51bWJlciwgZm9yIGZ1dHVyZSB1c2UuCisJCSAqLworCQlibm8gPSBJTlRfR0VUKHJpZ2h0LT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQpOworCQkvKgorCQkgKiBJZiByaWdodCBibG9jayBpcyBmdWxsIGVub3VnaCBzbyB0aGF0IHJlbW92aW5nIG9uZSBlbnRyeQorCQkgKiB3b24ndCBtYWtlIGl0IHRvbyBlbXB0eSwgYW5kIGxlZnQtc2hpZnRpbmcgYW4gZW50cnkgb3V0CisJCSAqIG9mIHJpZ2h0IHRvIHVzIHdvcmtzLCB3ZSdyZSBkb25lLgorCQkgKi8KKwkJaWYgKElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgLSAxID49CisJCSAgICAgWEZTX0FMTE9DX0JMT0NLX01JTlJFQ1MobGV2ZWwsIGN1cikpIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfbHNoaWZ0KHRjdXIsIGxldmVsLCAmaSkpKQorCQkJCWdvdG8gZXJyb3IwOworCQkJaWYgKGkpIHsKKwkJCQlBU1NFUlQoSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSA+PQorCQkJCSAgICAgICBYRlNfQUxMT0NfQkxPQ0tfTUlOUkVDUyhsZXZlbCwgY3VyKSk7CisJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IodGN1ciwKKwkJCQkJCSAgICAgWEZTX0JUUkVFX05PRVJST1IpOworCQkJCWlmIChsZXZlbCA+IDAgJiYKKwkJCQkgICAgKGVycm9yID0geGZzX2FsbG9jX2RlY3JlbWVudChjdXIsIGxldmVsLAorCQkJCQkgICAgJmkpKSkKKwkJCQkJcmV0dXJuIGVycm9yOworCQkJCSpzdGF0ID0gMTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQkvKgorCQkgKiBPdGhlcndpc2UsIGdyYWIgdGhlIG51bWJlciBvZiByZWNvcmRzIGluIHJpZ2h0IGZvcgorCQkgKiBmdXR1cmUgcmVmZXJlbmNlLCBhbmQgZml4IHVwIHRoZSB0ZW1wIGN1cnNvciB0byBwb2ludAorCQkgKiB0byBvdXIgYmxvY2sgYWdhaW4gKGxhc3QgcmVjb3JkKS4KKwkJICovCisJCXJyZWNzID0gSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKKwkJaWYgKGxibm8gIT0gTlVMTEFHQkxPQ0spIHsKKwkJCWkgPSB4ZnNfYnRyZWVfZmlyc3RyZWModGN1ciwgbGV2ZWwpOworCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCQkJaWYgKChlcnJvciA9IHhmc19hbGxvY19kZWNyZW1lbnQodGN1ciwgbGV2ZWwsICZpKSkpCisJCQkJZ290byBlcnJvcjA7CisJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCX0KKwl9CisJLyoKKwkgKiBJZiB0aGVyZSdzIGEgbGVmdCBzaWJsaW5nLCBzZWUgaWYgaXQncyBvayB0byBzaGlmdCBhbiBlbnRyeQorCSAqIG91dCBvZiBpdC4KKwkgKi8KKwlpZiAobGJubyAhPSBOVUxMQUdCTE9DSykgeworCQkvKgorCQkgKiBNb3ZlIHRoZSB0ZW1wIGN1cnNvciB0byB0aGUgZmlyc3QgZW50cnkgaW4gdGhlCisJCSAqIHByZXZpb3VzIGJsb2NrLgorCQkgKi8KKwkJaSA9IHhmc19idHJlZV9maXJzdHJlYyh0Y3VyLCBsZXZlbCk7CisJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19kZWNyZW1lbnQodGN1ciwgbGV2ZWwsICZpKSkpCisJCQlnb3RvIGVycm9yMDsKKwkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCQl4ZnNfYnRyZWVfZmlyc3RyZWModGN1ciwgbGV2ZWwpOworCQkvKgorCQkgKiBHcmFiIGEgcG9pbnRlciB0byB0aGUgYmxvY2suCisJCSAqLworCQlsYnAgPSB0Y3VyLT5iY19idWZzW2xldmVsXTsKKwkJbGVmdCA9IFhGU19CVUZfVE9fQUxMT0NfQkxPQ0sobGJwKTsKKyNpZmRlZiBERUJVRworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGxlZnQsIGxldmVsLCBsYnApKSkKKwkJCWdvdG8gZXJyb3IwOworI2VuZGlmCisJCS8qCisJCSAqIEdyYWIgdGhlIGN1cnJlbnQgYmxvY2sgbnVtYmVyLCBmb3IgZnV0dXJlIHVzZS4KKwkJICovCisJCWJubyA9IElOVF9HRVQobGVmdC0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCk7CisJCS8qCisJCSAqIElmIGxlZnQgYmxvY2sgaXMgZnVsbCBlbm91Z2ggc28gdGhhdCByZW1vdmluZyBvbmUgZW50cnkKKwkJICogd29uJ3QgbWFrZSBpdCB0b28gZW1wdHksIGFuZCByaWdodC1zaGlmdGluZyBhbiBlbnRyeSBvdXQKKwkJICogb2YgbGVmdCB0byB1cyB3b3Jrcywgd2UncmUgZG9uZS4KKwkJICovCisJCWlmIChJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgLSAxID49CisJCSAgICAgWEZTX0FMTE9DX0JMT0NLX01JTlJFQ1MobGV2ZWwsIGN1cikpIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfcnNoaWZ0KHRjdXIsIGxldmVsLCAmaSkpKQorCQkJCWdvdG8gZXJyb3IwOworCQkJaWYgKGkpIHsKKwkJCQlBU1NFUlQoSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSA+PQorCQkJCSAgICAgICBYRlNfQUxMT0NfQkxPQ0tfTUlOUkVDUyhsZXZlbCwgY3VyKSk7CisJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IodGN1ciwKKwkJCQkJCSAgICAgWEZTX0JUUkVFX05PRVJST1IpOworCQkJCWlmIChsZXZlbCA9PSAwKQorCQkJCQljdXItPmJjX3B0cnNbMF0rKzsKKwkJCQkqc3RhdCA9IDE7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkJLyoKKwkJICogT3RoZXJ3aXNlLCBncmFiIHRoZSBudW1iZXIgb2YgcmVjb3JkcyBpbiByaWdodCBmb3IKKwkJICogZnV0dXJlIHJlZmVyZW5jZS4KKwkJICovCisJCWxyZWNzID0gSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOworCX0KKwkvKgorCSAqIERlbGV0ZSB0aGUgdGVtcCBjdXJzb3IsIHdlJ3JlIGRvbmUgd2l0aCBpdC4KKwkgKi8KKwl4ZnNfYnRyZWVfZGVsX2N1cnNvcih0Y3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CisJLyoKKwkgKiBJZiBoZXJlLCB3ZSBuZWVkIHRvIGRvIGEgam9pbiB0byBrZWVwIHRoZSB0cmVlIGJhbGFuY2VkLgorCSAqLworCUFTU0VSVChibm8gIT0gTlVMTEFHQkxPQ0spOworCS8qCisJICogU2VlIGlmIHdlIGNhbiBqb2luIHdpdGggdGhlIGxlZnQgbmVpZ2hib3IgYmxvY2suCisJICovCisJaWYgKGxibm8gIT0gTlVMTEFHQkxPQ0sgJiYKKwkgICAgbHJlY3MgKyBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIDw9IFhGU19BTExPQ19CTE9DS19NQVhSRUNTKGxldmVsLCBjdXIpKSB7CisJCS8qCisJCSAqIFNldCAicmlnaHQiIHRvIGJlIHRoZSBzdGFydGluZyBibG9jaywKKwkJICogImxlZnQiIHRvIGJlIHRoZSBsZWZ0IG5laWdoYm9yLgorCQkgKi8KKwkJcmJubyA9IGJubzsKKwkJcmlnaHQgPSBibG9jazsKKwkJcmJwID0gYnA7CisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZzKG1wLCBjdXItPmJjX3RwLAorCQkJCWN1ci0+YmNfcHJpdmF0ZS5hLmFnbm8sIGxibm8sIDAsICZsYnAsCisJCQkJWEZTX0FMTE9DX0JUUkVFX1JFRikpKQorCQkJcmV0dXJuIGVycm9yOworCQlsZWZ0ID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhsYnApOworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGxlZnQsIGxldmVsLCBsYnApKSkKKwkJCXJldHVybiBlcnJvcjsKKwl9CisJLyoKKwkgKiBJZiB0aGF0IHdvbid0IHdvcmssIHNlZSBpZiB3ZSBjYW4gam9pbiB3aXRoIHRoZSByaWdodCBuZWlnaGJvciBibG9jay4KKwkgKi8KKwllbHNlIGlmIChyYm5vICE9IE5VTExBR0JMT0NLICYmCisJCSBycmVjcyArIElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgPD0KKwkJICBYRlNfQUxMT0NfQkxPQ0tfTUFYUkVDUyhsZXZlbCwgY3VyKSkgeworCQkvKgorCQkgKiBTZXQgImxlZnQiIHRvIGJlIHRoZSBzdGFydGluZyBibG9jaywKKwkJICogInJpZ2h0IiB0byBiZSB0aGUgcmlnaHQgbmVpZ2hib3IuCisJCSAqLworCQlsYm5vID0gYm5vOworCQlsZWZ0ID0gYmxvY2s7CisJCWxicCA9IGJwOworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmcyhtcCwgY3VyLT5iY190cCwKKwkJCQljdXItPmJjX3ByaXZhdGUuYS5hZ25vLCByYm5vLCAwLCAmcmJwLAorCQkJCVhGU19BTExPQ19CVFJFRV9SRUYpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJcmlnaHQgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKHJicCk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgcmlnaHQsIGxldmVsLCByYnApKSkKKwkJCXJldHVybiBlcnJvcjsKKwl9CisJLyoKKwkgKiBPdGhlcndpc2UsIHdlIGNhbid0IGZpeCB0aGUgaW1iYWxhbmNlLgorCSAqIEp1c3QgcmV0dXJuLiAgVGhpcyBpcyBwcm9iYWJseSBhIGxvZ2ljIGVycm9yLCBidXQgaXQncyBub3QgZmF0YWwuCisJICovCisJZWxzZSB7CisJCWlmIChsZXZlbCA+IDAgJiYgKGVycm9yID0geGZzX2FsbG9jX2RlY3JlbWVudChjdXIsIGxldmVsLCAmaSkpKQorCQkJcmV0dXJuIGVycm9yOworCQkqc3RhdCA9IDE7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIFdlJ3JlIG5vdyBnb2luZyB0byBqb2luICJsZWZ0IiBhbmQgInJpZ2h0IiBieSBtb3ZpbmcgYWxsIHRoZSBzdHVmZgorCSAqIGluICJyaWdodCIgdG8gImxlZnQiIGFuZCBkZWxldGluZyAicmlnaHQiLgorCSAqLworCWlmIChsZXZlbCA+IDApIHsKKwkJLyoKKwkJICogSXQncyBhIG5vbi1sZWFmLiAgTW92ZSBrZXlzIGFuZCBwb2ludGVycy4KKwkJICovCisJCWxrcCA9IFhGU19BTExPQ19LRVlfQUREUihsZWZ0LCBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKyAxLCBjdXIpOworCQlscHAgPSBYRlNfQUxMT0NfUFRSX0FERFIobGVmdCwgSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICsgMSwgY3VyKTsKKwkJcmtwID0gWEZTX0FMTE9DX0tFWV9BRERSKHJpZ2h0LCAxLCBjdXIpOworCQlycHAgPSBYRlNfQUxMT0NfUFRSX0FERFIocmlnaHQsIDEsIGN1cik7CisjaWZkZWYgREVCVUcKKwkJZm9yIChpID0gMDsgaSA8IElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7IGkrKykgeworCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgSU5UX0dFVChycHBbaV0sIEFSQ0hfQ09OVkVSVCksIGxldmVsKSkpCisJCQkJcmV0dXJuIGVycm9yOworCQl9CisjZW5kaWYKKwkJbWVtY3B5KGxrcCwgcmtwLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpsa3ApKTsgLyogSU5UXzogc3RydWN0dXJlIGNvcHkgKi8KKwkJbWVtY3B5KGxwcCwgcnBwLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpscHApKTsgLyogSU5UXzogc3RydWN0dXJlIGNvcHkgKi8KKwkJeGZzX2FsbG9jX2xvZ19rZXlzKGN1ciwgbGJwLCBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKyAxLAorCQkJCSAgIElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSArIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpOworCQl4ZnNfYWxsb2NfbG9nX3B0cnMoY3VyLCBsYnAsIElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSArIDEsCisJCQkJICAgSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICsgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogSXQncyBhIGxlYWYuICBNb3ZlIHJlY29yZHMuCisJCSAqLworCQlscnAgPSBYRlNfQUxMT0NfUkVDX0FERFIobGVmdCwgSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICsgMSwgY3VyKTsKKwkJcnJwID0gWEZTX0FMTE9DX1JFQ19BRERSKHJpZ2h0LCAxLCBjdXIpOworCQltZW1jcHkobHJwLCBycnAsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKiBzaXplb2YoKmxycCkpOworCQl4ZnNfYWxsb2NfbG9nX3JlY3MoY3VyLCBsYnAsIElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSArIDEsCisJCQkJICAgSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICsgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSk7CisJfQorCS8qCisJICogSWYgd2Ugam9pbmVkIHdpdGggdGhlIGxlZnQgbmVpZ2hib3IsIHNldCB0aGUgYnVmZmVyIGluIHRoZQorCSAqIGN1cnNvciB0byB0aGUgbGVmdCBibG9jaywgYW5kIGZpeCB1cCB0aGUgaW5kZXguCisJICovCisJaWYgKGJwICE9IGxicCkgeworCQl4ZnNfYnRyZWVfc2V0YnVmKGN1ciwgbGV2ZWwsIGxicCk7CisJCWN1ci0+YmNfcHRyc1tsZXZlbF0gKz0gSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOworCX0KKwkvKgorCSAqIElmIHdlIGpvaW5lZCB3aXRoIHRoZSByaWdodCBuZWlnaGJvciBhbmQgdGhlcmUncyBhIGxldmVsIGFib3ZlCisJICogdXMsIGluY3JlbWVudCB0aGUgY3Vyc29yIGF0IHRoYXQgbGV2ZWwuCisJICovCisJZWxzZSBpZiAobGV2ZWwgKyAxIDwgY3VyLT5iY19ubGV2ZWxzICYmCisJCSAoZXJyb3IgPSB4ZnNfYWxsb2NfaW5jcmVtZW50KGN1ciwgbGV2ZWwgKyAxLCAmaSkpKQorCQlyZXR1cm4gZXJyb3I7CisJLyoKKwkgKiBGaXggdXAgdGhlIG51bWJlciBvZiByZWNvcmRzIGluIHRoZSBzdXJ2aXZpbmcgYmxvY2suCisJICovCisJSU5UX01PRChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpOworCS8qCisJICogRml4IHVwIHRoZSByaWdodCBibG9jayBwb2ludGVyIGluIHRoZSBzdXJ2aXZpbmcgYmxvY2ssIGFuZCBsb2cgaXQuCisJICovCisJbGVmdC0+YmJfcmlnaHRzaWIgPSByaWdodC0+YmJfcmlnaHRzaWI7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCisJeGZzX2FsbG9jX2xvZ19ibG9jayhjdXItPmJjX3RwLCBsYnAsIFhGU19CQl9OVU1SRUNTIHwgWEZTX0JCX1JJR0hUU0lCKTsKKwkvKgorCSAqIElmIHRoZXJlIGlzIGEgcmlnaHQgc2libGluZyBub3csIG1ha2UgaXQgcG9pbnQgdG8gdGhlCisJICogcmVtYWluaW5nIGJsb2NrLgorCSAqLworCWlmIChJTlRfR0VUKGxlZnQtPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpICE9IE5VTExBR0JMT0NLKSB7CisJCXhmc19hbGxvY19ibG9ja190CSpycmJsb2NrOworCQl4ZnNfYnVmX3QJCSpycmJwOworCisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZzKG1wLCBjdXItPmJjX3RwLAorCQkJCWN1ci0+YmNfcHJpdmF0ZS5hLmFnbm8sIElOVF9HRVQobGVmdC0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCksIDAsCisJCQkJJnJyYnAsIFhGU19BTExPQ19CVFJFRV9SRUYpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJcnJibG9jayA9IFhGU19CVUZfVE9fQUxMT0NfQkxPQ0socnJicCk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgcnJibG9jaywgbGV2ZWwsIHJyYnApKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJSU5UX1NFVChycmJsb2NrLT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQsIGxibm8pOworCQl4ZnNfYWxsb2NfbG9nX2Jsb2NrKGN1ci0+YmNfdHAsIHJyYnAsIFhGU19CQl9MRUZUU0lCKTsKKwl9CisJLyoKKwkgKiBGcmVlIHRoZSBkZWxldGluZyBibG9jayBieSBwdXR0aW5nIGl0IG9uIHRoZSBmcmVlbGlzdC4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2FsbG9jX3B1dF9mcmVlbGlzdChjdXItPmJjX3RwLCBjdXItPmJjX3ByaXZhdGUuYS5hZ2JwLAorCQkJTlVMTCwgcmJubykpKQorCQlyZXR1cm4gZXJyb3I7CisJLyoKKwkgKiBTaW5jZSBibG9ja3MgbW92ZSB0byB0aGUgZnJlZSBsaXN0IHdpdGhvdXQgdGhlIGNvb3JkaW5hdGlvbgorCSAqIHVzZWQgaW4geGZzX2JtYXBfZmluaXNoLCB3ZSBjYW4ndCBhbGxvdyBibG9jayB0byBiZSBhdmFpbGFibGUKKwkgKiBmb3IgcmVhbGxvY2F0aW9uIGFuZCBub24tdHJhbnNhY3Rpb24gd3JpdGluZyAodXNlciBkYXRhKQorCSAqIHVudGlsIHdlIGtub3cgdGhhdCB0aGUgdHJhbnNhY3Rpb24gdGhhdCBtb3ZlZCBpdCB0byB0aGUgZnJlZQorCSAqIGxpc3QgaXMgcGVybWFuZW50bHkgb24gZGlzay4gV2UgdHJhY2sgdGhlIGJsb2NrcyBieSBkZWNsYXJpbmcKKwkgKiB0aGVzZSBibG9ja3MgYXMgImJ1c3kiOyB0aGUgYnVzeSBsaXN0IGlzIG1haW50YWluZWQgb24gYQorCSAqIHBlci1hZyBiYXNpcyBhbmQgZWFjaCB0cmFuc2FjdGlvbiByZWNvcmRzIHdoaWNoIGVudHJpZXMKKwkgKiBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuIHRoZSBpY2xvZyBjb21taXRzIHRvIGRpc2suIElmIGEKKwkgKiBidXN5IGJsb2NrIGlzIGFsbG9jYXRlZCwgdGhlIGljbG9nIGlzIHB1c2hlZCB1cCB0byB0aGUKKwkgKiBMU04gdGhhdCBmcmVlZCB0aGUgYmxvY2suCisJICovCisJeGZzX2FsbG9jX21hcmtfYnVzeShjdXItPmJjX3RwLAorCQlJTlRfR0VUKGFnZi0+YWdmX3NlcW5vLCBBUkNIX0NPTlZFUlQpLCBibm8sIDEpOworCisJeGZzX3RyYW5zX2FnYnRyZWVfZGVsdGEoY3VyLT5iY190cCwgLTEpOworCS8qCisJICogQWRqdXN0IHRoZSBjdXJyZW50IGxldmVsJ3MgY3Vyc29yIHNvIHRoYXQgd2UncmUgbGVmdCByZWZlcnJpbmcKKwkgKiB0byB0aGUgcmlnaHQgbm9kZSwgYWZ0ZXIgd2UncmUgZG9uZS4KKwkgKiBJZiB0aGlzIGxlYXZlcyB0aGUgcHRyIHZhbHVlIDAgb3VyIGNhbGxlciB3aWxsIGZpeCBpdCB1cC4KKwkgKi8KKwlpZiAobGV2ZWwgPiAwKQorCQljdXItPmJjX3B0cnNbbGV2ZWxdLS07CisJLyoKKwkgKiBSZXR1cm4gdmFsdWUgbWVhbnMgdGhlIG5leHQgbGV2ZWwgdXAgaGFzIHNvbWV0aGluZyB0byBkby4KKwkgKi8KKwkqc3RhdCA9IDI7CisJcmV0dXJuIDA7CisKK2Vycm9yMDoKKwl4ZnNfYnRyZWVfZGVsX2N1cnNvcih0Y3VyLCBYRlNfQlRSRUVfRVJST1IpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIEluc2VydCBvbmUgcmVjb3JkL2xldmVsLiAgUmV0dXJuIGluZm9ybWF0aW9uIHRvIHRoZSBjYWxsZXIKKyAqIGFsbG93aW5nIHRoZSBuZXh0IGxldmVsIHVwIHRvIHByb2NlZWQgaWYgbmVjZXNzYXJ5LgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfYWxsb2NfaW5zcmVjKAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkJbGV2ZWwsCS8qIGxldmVsIHRvIGluc2VydCByZWNvcmQgYXQgKi8KKwl4ZnNfYWdibG9ja190CQkqYm5vcCwJLyogaS9vOiBibG9jayBudW1iZXIgaW5zZXJ0ZWQgKi8KKwl4ZnNfYWxsb2NfcmVjX3QJCSpyZWNwLAkvKiBpL286IHJlY29yZCBkYXRhIGluc2VydGVkICovCisJeGZzX2J0cmVlX2N1cl90CQkqKmN1cnAsCS8qIG91dHB1dDogbmV3IGN1cnNvciByZXBsYWNpbmcgY3VyICovCisJaW50CQkJKnN0YXQpCS8qIG91dHB1dDogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJeGZzX2FnZl90CQkqYWdmOwkvKiBhbGxvY2F0aW9uIGdyb3VwIGZyZWVsaXN0IGhlYWRlciAqLworCXhmc19hbGxvY19ibG9ja190CSpibG9jazsJLyogYnRyZWUgYmxvY2sgcmVjb3JkL2tleSBsaXZlcyBpbiAqLworCXhmc19idWZfdAkJKmJwOwkvKiBidWZmZXIgZm9yIGJsb2NrICovCisJaW50CQkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCWludAkJCWk7CS8qIGxvb3AgaW5kZXggKi8KKwl4ZnNfYWxsb2Nfa2V5X3QJCWtleTsJLyoga2V5IHZhbHVlIGJlaW5nIGluc2VydGVkICovCisJeGZzX2FsbG9jX2tleV90CQkqa3A7CS8qIHBvaW50ZXIgdG8gYnRyZWUga2V5cyAqLworCXhmc19hZ2Jsb2NrX3QJCW5ibm87CS8qIGJsb2NrIG51bWJlciBvZiBhbGxvY2F0ZWQgYmxvY2sgKi8KKwl4ZnNfYnRyZWVfY3VyX3QJCSpuY3VyOwkvKiBuZXcgY3Vyc29yIHRvIGJlIHVzZWQgYXQgbmV4dCBsdmwgKi8KKwl4ZnNfYWxsb2Nfa2V5X3QJCW5rZXk7CS8qIG5ldyBrZXkgdmFsdWUsIGZyb20gc3BsaXQgKi8KKwl4ZnNfYWxsb2NfcmVjX3QJCW5yZWM7CS8qIG5ldyByZWNvcmQgdmFsdWUsIGZvciBjYWxsZXIgKi8KKwlpbnQJCQlvcHRyOwkvKiBvbGQgcHRyIHZhbHVlICovCisJeGZzX2FsbG9jX3B0cl90CQkqcHA7CS8qIHBvaW50ZXIgdG8gYnRyZWUgYWRkcmVzc2VzICovCisJaW50CQkJcHRyOwkvKiBpbmRleCBpbiBidHJlZSBibG9jayBmb3IgdGhpcyByZWMgKi8KKwl4ZnNfYWxsb2NfcmVjX3QJCSpycDsJLyogcG9pbnRlciB0byBidHJlZSByZWNvcmRzICovCisKKwlBU1NFUlQoSU5UX0dFVChyZWNwLT5hcl9ibG9ja2NvdW50LCBBUkNIX0NPTlZFUlQpID4gMCk7CisJLyoKKwkgKiBJZiB3ZSBtYWRlIGl0IHRvIHRoZSByb290IGxldmVsLCBhbGxvY2F0ZSBhIG5ldyByb290IGJsb2NrCisJICogYW5kIHdlJ3JlIGRvbmUuCisJICovCisJaWYgKGxldmVsID49IGN1ci0+YmNfbmxldmVscykgeworCQlYRlNfU1RBVFNfSU5DKHhzX2FidF9pbnNyZWMpOworCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX25ld3Jvb3QoY3VyLCAmaSkpKQorCQkJcmV0dXJuIGVycm9yOworCQkqYm5vcCA9IE5VTExBR0JMT0NLOworCQkqc3RhdCA9IGk7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIE1ha2UgYSBrZXkgb3V0IG9mIHRoZSByZWNvcmQgZGF0YSB0byBiZSBpbnNlcnRlZCwgYW5kIHNhdmUgaXQuCisJICovCisJa2V5LmFyX3N0YXJ0YmxvY2sgPSByZWNwLT5hcl9zdGFydGJsb2NrOyAvKiBJTlRfOiBkaXJlY3QgY29weSAqLworCWtleS5hcl9ibG9ja2NvdW50ID0gcmVjcC0+YXJfYmxvY2tjb3VudDsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KKwlvcHRyID0gcHRyID0gY3VyLT5iY19wdHJzW2xldmVsXTsKKwkvKgorCSAqIElmIHdlJ3JlIG9mZiB0aGUgbGVmdCBlZGdlLCByZXR1cm4gZmFpbHVyZS4KKwkgKi8KKwlpZiAocHRyID09IDApIHsKKwkJKnN0YXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJWEZTX1NUQVRTX0lOQyh4c19hYnRfaW5zcmVjKTsKKwkvKgorCSAqIEdldCBwb2ludGVycyB0byB0aGUgYnRyZWUgYnVmZmVyIGFuZCBibG9jay4KKwkgKi8KKwlicCA9IGN1ci0+YmNfYnVmc1tsZXZlbF07CisJYmxvY2sgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKGJwKTsKKyNpZmRlZiBERUJVRworCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgYmxvY2ssIGxldmVsLCBicCkpKQorCQlyZXR1cm4gZXJyb3I7CisJLyoKKwkgKiBDaGVjayB0aGF0IHRoZSBuZXcgZW50cnkgaXMgYmVpbmcgaW5zZXJ0ZWQgaW4gdGhlIHJpZ2h0IHBsYWNlLgorCSAqLworCWlmIChwdHIgPD0gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkgeworCQlpZiAobGV2ZWwgPT0gMCkgeworCQkJcnAgPSBYRlNfQUxMT0NfUkVDX0FERFIoYmxvY2ssIHB0ciwgY3VyKTsKKwkJCXhmc19idHJlZV9jaGVja19yZWMoY3VyLT5iY19idG51bSwgcmVjcCwgcnApOworCQl9IGVsc2UgeworCQkJa3AgPSBYRlNfQUxMT0NfS0VZX0FERFIoYmxvY2ssIHB0ciwgY3VyKTsKKwkJCXhmc19idHJlZV9jaGVja19rZXkoY3VyLT5iY19idG51bSwgJmtleSwga3ApOworCQl9CisJfQorI2VuZGlmCisJbmJubyA9IE5VTExBR0JMT0NLOworCW5jdXIgPSAoeGZzX2J0cmVlX2N1cl90ICopMDsKKwkvKgorCSAqIElmIHRoZSBibG9jayBpcyBmdWxsLCB3ZSBjYW4ndCBpbnNlcnQgdGhlIG5ldyBlbnRyeSB1bnRpbCB3ZQorCSAqIG1ha2UgdGhlIGJsb2NrIHVuLWZ1bGwuCisJICovCisJaWYgKElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0FMTE9DX0JMT0NLX01BWFJFQ1MobGV2ZWwsIGN1cikpIHsKKwkJLyoKKwkJICogRmlyc3QsIHRyeSBzaGlmdGluZyBhbiBlbnRyeSB0byB0aGUgcmlnaHQgbmVpZ2hib3IuCisJCSAqLworCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX3JzaGlmdChjdXIsIGxldmVsLCAmaSkpKQorCQkJcmV0dXJuIGVycm9yOworCQlpZiAoaSkgeworCQkJLyogbm90aGluZyAqLworCQl9CisJCS8qCisJCSAqIE5leHQsIHRyeSBzaGlmdGluZyBhbiBlbnRyeSB0byB0aGUgbGVmdCBuZWlnaGJvci4KKwkJICovCisJCWVsc2UgeworCQkJaWYgKChlcnJvciA9IHhmc19hbGxvY19sc2hpZnQoY3VyLCBsZXZlbCwgJmkpKSkKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQlpZiAoaSkKKwkJCQlvcHRyID0gcHRyID0gY3VyLT5iY19wdHJzW2xldmVsXTsKKwkJCWVsc2UgeworCQkJCS8qCisJCQkJICogTmV4dCwgdHJ5IHNwbGl0dGluZyB0aGUgY3VycmVudCBibG9jayBpbgorCQkJCSAqIGhhbGYuIElmIHRoaXMgd29ya3Mgd2UgaGF2ZSB0byByZS1zZXQgb3VyCisJCQkJICogdmFyaWFibGVzIGJlY2F1c2Ugd2UgY291bGQgYmUgaW4gYQorCQkJCSAqIGRpZmZlcmVudCBibG9jayBub3cuCisJCQkJICovCisJCQkJaWYgKChlcnJvciA9IHhmc19hbGxvY19zcGxpdChjdXIsIGxldmVsLCAmbmJubywKKwkJCQkJCSZua2V5LCAmbmN1ciwgJmkpKSkKKwkJCQkJcmV0dXJuIGVycm9yOworCQkJCWlmIChpKSB7CisJCQkJCWJwID0gY3VyLT5iY19idWZzW2xldmVsXTsKKwkJCQkJYmxvY2sgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKGJwKTsKKyNpZmRlZiBERUJVRworCQkJCQlpZiAoKGVycm9yID0KKwkJCQkJCXhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLAorCQkJCQkJCWJsb2NrLCBsZXZlbCwgYnApKSkKKwkJCQkJCXJldHVybiBlcnJvcjsKKyNlbmRpZgorCQkJCQlwdHIgPSBjdXItPmJjX3B0cnNbbGV2ZWxdOworCQkJCQlucmVjLmFyX3N0YXJ0YmxvY2sgPSBua2V5LmFyX3N0YXJ0YmxvY2s7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCisJCQkJCW5yZWMuYXJfYmxvY2tjb3VudCA9IG5rZXkuYXJfYmxvY2tjb3VudDsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBPdGhlcndpc2UgdGhlIGluc2VydCBmYWlscy4KKwkJCQkgKi8KKwkJCQllbHNlIHsKKwkJCQkJKnN0YXQgPSAwOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJLyoKKwkgKiBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhlcmUncyByb29tIGZvciBvdXIgbmV3IGVudHJ5IGluIHRoZSBibG9jaworCSAqIHdlJ3JlIHBvaW50aW5nIGF0LgorCSAqLworCWlmIChsZXZlbCA+IDApIHsKKwkJLyoKKwkJICogSXQncyBhIG5vbi1sZWFmIGVudHJ5LiAgTWFrZSBhIGhvbGUgZm9yIHRoZSBuZXcgZGF0YQorCQkgKiBpbiB0aGUga2V5IGFuZCBwdHIgcmVnaW9ucyBvZiB0aGUgYmxvY2suCisJCSAqLworCQlrcCA9IFhGU19BTExPQ19LRVlfQUREUihibG9jaywgMSwgY3VyKTsKKwkJcHAgPSBYRlNfQUxMT0NfUFRSX0FERFIoYmxvY2ssIDEsIGN1cik7CisjaWZkZWYgREVCVUcKKwkJZm9yIChpID0gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsgaSA+PSBwdHI7IGktLSkgeworCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgSU5UX0dFVChwcFtpIC0gMV0sIEFSQ0hfQ09OVkVSVCksIGxldmVsKSkpCisJCQkJcmV0dXJuIGVycm9yOworCQl9CisjZW5kaWYKKwkJbWVtbW92ZSgma3BbcHRyXSwgJmtwW3B0ciAtIDFdLAorCQkJKElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgLSBwdHIgKyAxKSAqIHNpemVvZigqa3ApKTsgLyogSU5UXzogY29weSAqLworCQltZW1tb3ZlKCZwcFtwdHJdLCAmcHBbcHRyIC0gMV0sCisJCQkoSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAtIHB0ciArIDEpICogc2l6ZW9mKCpwcCkpOyAvKiBJTlRfOiBjb3B5ICovCisjaWZkZWYgREVCVUcKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgKmJub3AsIGxldmVsKSkpCisJCQlyZXR1cm4gZXJyb3I7CisjZW5kaWYKKwkJLyoKKwkJICogTm93IHN0dWZmIHRoZSBuZXcgZGF0YSBpbiwgYnVtcCBudW1yZWNzIGFuZCBsb2cgdGhlIG5ldyBkYXRhLgorCQkgKi8KKwkJa3BbcHRyIC0gMV0gPSBrZXk7CisJCUlOVF9TRVQocHBbcHRyIC0gMV0sIEFSQ0hfQ09OVkVSVCwgKmJub3ApOworCQlJTlRfTU9EKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsICsxKTsKKwkJeGZzX2FsbG9jX2xvZ19rZXlzKGN1ciwgYnAsIHB0ciwgSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSk7CisJCXhmc19hbGxvY19sb2dfcHRycyhjdXIsIGJwLCBwdHIsIElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpOworI2lmZGVmIERFQlVHCisJCWlmIChwdHIgPCBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKQorCQkJeGZzX2J0cmVlX2NoZWNrX2tleShjdXItPmJjX2J0bnVtLCBrcCArIHB0ciAtIDEsCisJCQkJa3AgKyBwdHIpOworI2VuZGlmCisJfSBlbHNlIHsKKwkJLyoKKwkJICogSXQncyBhIGxlYWYgZW50cnkuICBNYWtlIGEgaG9sZSBmb3IgdGhlIG5ldyByZWNvcmQuCisJCSAqLworCQlycCA9IFhGU19BTExPQ19SRUNfQUREUihibG9jaywgMSwgY3VyKTsKKwkJbWVtbW92ZSgmcnBbcHRyXSwgJnJwW3B0ciAtIDFdLAorCQkJKElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgLSBwdHIgKyAxKSAqIHNpemVvZigqcnApKTsKKwkJLyoKKwkJICogTm93IHN0dWZmIHRoZSBuZXcgcmVjb3JkIGluLCBidW1wIG51bXJlY3MKKwkJICogYW5kIGxvZyB0aGUgbmV3IGRhdGEuCisJCSAqLworCQlycFtwdHIgLSAxXSA9ICpyZWNwOyAvKiBJTlRfOiBzdHJ1Y3QgY29weSAqLworCQlJTlRfTU9EKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsICsxKTsKKwkJeGZzX2FsbG9jX2xvZ19yZWNzKGN1ciwgYnAsIHB0ciwgSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSk7CisjaWZkZWYgREVCVUcKKwkJaWYgKHB0ciA8IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpCisJCQl4ZnNfYnRyZWVfY2hlY2tfcmVjKGN1ci0+YmNfYnRudW0sIHJwICsgcHRyIC0gMSwKKwkJCQlycCArIHB0cik7CisjZW5kaWYKKwl9CisJLyoKKwkgKiBMb2cgdGhlIG5ldyBudW1iZXIgb2YgcmVjb3JkcyBpbiB0aGUgYnRyZWUgaGVhZGVyLgorCSAqLworCXhmc19hbGxvY19sb2dfYmxvY2soY3VyLT5iY190cCwgYnAsIFhGU19CQl9OVU1SRUNTKTsKKwkvKgorCSAqIElmIHdlIGluc2VydGVkIGF0IHRoZSBzdGFydCBvZiBhIGJsb2NrLCB1cGRhdGUgdGhlIHBhcmVudHMnIGtleXMuCisJICovCisJaWYgKG9wdHIgPT0gMSAmJiAoZXJyb3IgPSB4ZnNfYWxsb2NfdXBka2V5KGN1ciwgJmtleSwgbGV2ZWwgKyAxKSkpCisJCXJldHVybiBlcnJvcjsKKwkvKgorCSAqIExvb2sgdG8gc2VlIGlmIHRoZSBsb25nZXN0IGV4dGVudCBpbiB0aGUgYWxsb2NhdGlvbiBncm91cAorCSAqIG5lZWRzIHRvIGJlIHVwZGF0ZWQuCisJICovCisKKwlhZ2YgPSBYRlNfQlVGX1RPX0FHRihjdXItPmJjX3ByaXZhdGUuYS5hZ2JwKTsKKwlpZiAobGV2ZWwgPT0gMCAmJgorCSAgICBjdXItPmJjX2J0bnVtID09IFhGU19CVE5VTV9DTlQgJiYKKwkgICAgSU5UX0dFVChibG9jay0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTEFHQkxPQ0sgJiYKKwkgICAgSU5UX0dFVChyZWNwLT5hcl9ibG9ja2NvdW50LCBBUkNIX0NPTlZFUlQpID4gSU5UX0dFVChhZ2YtPmFnZl9sb25nZXN0LCBBUkNIX0NPTlZFUlQpKSB7CisJCS8qCisJCSAqIElmIHRoaXMgaXMgYSBsZWFmIGluIHRoZSBieS1zaXplIGJ0cmVlIGFuZCB0aGVyZQorCQkgKiBpcyBubyByaWdodCBzaWJsaW5nIGJsb2NrIGFuZCB0aGlzIGJsb2NrIGlzIGJpZ2dlcgorCQkgKiB0aGFuIHRoZSBwcmV2aW91cyBsb25nZXN0IGJsb2NrLCB1cGRhdGUgaXQuCisJCSAqLworCQlJTlRfQ09QWShhZ2YtPmFnZl9sb25nZXN0LCByZWNwLT5hcl9ibG9ja2NvdW50LCBBUkNIX0NPTlZFUlQpOworCQljdXItPmJjX21wLT5tX3BlcmFnW0lOVF9HRVQoYWdmLT5hZ2Zfc2Vxbm8sIEFSQ0hfQ09OVkVSVCldLnBhZ2ZfbG9uZ2VzdAorCQkJPSBJTlRfR0VUKHJlY3AtPmFyX2Jsb2NrY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJCXhmc19hbGxvY19sb2dfYWdmKGN1ci0+YmNfdHAsIGN1ci0+YmNfcHJpdmF0ZS5hLmFnYnAsCisJCQlYRlNfQUdGX0xPTkdFU1QpOworCX0KKwkvKgorCSAqIFJldHVybiB0aGUgbmV3IGJsb2NrIG51bWJlciwgaWYgYW55LgorCSAqIElmIHRoZXJlIGlzIG9uZSwgZ2l2ZSBiYWNrIGEgcmVjb3JkIHZhbHVlIGFuZCBhIGN1cnNvciB0b28uCisJICovCisJKmJub3AgPSBuYm5vOworCWlmIChuYm5vICE9IE5VTExBR0JMT0NLKSB7CisJCSpyZWNwID0gbnJlYzsgLyogSU5UXzogc3RydWN0IGNvcHkgKi8KKwkJKmN1cnAgPSBuY3VyOyAvKiBJTlRfOiBzdHJ1Y3QgY29weSAqLworCX0KKwkqc3RhdCA9IDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBMb2cgaGVhZGVyIGZpZWxkcyBmcm9tIGEgYnRyZWUgYmxvY2suCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYWxsb2NfbG9nX2Jsb2NrKAorCXhmc190cmFuc190CQkqdHAsCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfYnVmX3QJCSpicCwJLyogYnVmZmVyIGNvbnRhaW5pbmcgYnRyZWUgYmxvY2sgKi8KKwlpbnQJCQlmaWVsZHMpCS8qIG1hc2sgb2YgZmllbGRzOiBYRlNfQkJfLi4uICovCit7CisJaW50CQkJZmlyc3Q7CS8qIGZpcnN0IGJ5dGUgb2Zmc2V0IGxvZ2dlZCAqLworCWludAkJCWxhc3Q7CS8qIGxhc3QgYnl0ZSBvZmZzZXQgbG9nZ2VkICovCisJc3RhdGljIGNvbnN0IHNob3J0CW9mZnNldHNbXSA9IHsJLyogdGFibGUgb2Ygb2Zmc2V0cyAqLworCQlvZmZzZXRvZih4ZnNfYWxsb2NfYmxvY2tfdCwgYmJfbWFnaWMpLAorCQlvZmZzZXRvZih4ZnNfYWxsb2NfYmxvY2tfdCwgYmJfbGV2ZWwpLAorCQlvZmZzZXRvZih4ZnNfYWxsb2NfYmxvY2tfdCwgYmJfbnVtcmVjcyksCisJCW9mZnNldG9mKHhmc19hbGxvY19ibG9ja190LCBiYl9sZWZ0c2liKSwKKwkJb2Zmc2V0b2YoeGZzX2FsbG9jX2Jsb2NrX3QsIGJiX3JpZ2h0c2liKSwKKwkJc2l6ZW9mKHhmc19hbGxvY19ibG9ja190KQorCX07CisKKwl4ZnNfYnRyZWVfb2Zmc2V0cyhmaWVsZHMsIG9mZnNldHMsIFhGU19CQl9OVU1fQklUUywgJmZpcnN0LCAmbGFzdCk7CisJeGZzX3RyYW5zX2xvZ19idWYodHAsIGJwLCBmaXJzdCwgbGFzdCk7Cit9CisKKy8qCisgKiBMb2cga2V5cyBmcm9tIGEgYnRyZWUgYmxvY2sgKG5vbmxlYWYpLgorICovCitTVEFUSUMgdm9pZAoreGZzX2FsbG9jX2xvZ19rZXlzKAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2J1Zl90CQkqYnAsCS8qIGJ1ZmZlciBjb250YWluaW5nIGJ0cmVlIGJsb2NrICovCisJaW50CQkJa2ZpcnN0LAkvKiBpbmRleCBvZiBmaXJzdCBrZXkgdG8gbG9nICovCisJaW50CQkJa2xhc3QpCS8qIGluZGV4IG9mIGxhc3Qga2V5IHRvIGxvZyAqLworeworCXhmc19hbGxvY19ibG9ja190CSpibG9jazsJLyogYnRyZWUgYmxvY2sgdG8gbG9nIGZyb20gKi8KKwlpbnQJCQlmaXJzdDsJLyogZmlyc3QgYnl0ZSBvZmZzZXQgbG9nZ2VkICovCisJeGZzX2FsbG9jX2tleV90CQkqa3A7CS8qIGtleSBwb2ludGVyIGluIGJ0cmVlIGJsb2NrICovCisJaW50CQkJbGFzdDsJLyogbGFzdCBieXRlIG9mZnNldCBsb2dnZWQgKi8KKworCWJsb2NrID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhicCk7CisJa3AgPSBYRlNfQUxMT0NfS0VZX0FERFIoYmxvY2ssIDEsIGN1cik7CisJZmlyc3QgPSAoaW50KSgoeGZzX2NhZGRyX3QpJmtwW2tmaXJzdCAtIDFdIC0gKHhmc19jYWRkcl90KWJsb2NrKTsKKwlsYXN0ID0gKGludCkoKCh4ZnNfY2FkZHJfdCkma3Bba2xhc3RdIC0gMSkgLSAoeGZzX2NhZGRyX3QpYmxvY2spOworCXhmc190cmFuc19sb2dfYnVmKGN1ci0+YmNfdHAsIGJwLCBmaXJzdCwgbGFzdCk7Cit9CisKKy8qCisgKiBMb2cgYmxvY2sgcG9pbnRlciBmaWVsZHMgZnJvbSBhIGJ0cmVlIGJsb2NrIChub25sZWFmKS4KKyAqLworU1RBVElDIHZvaWQKK3hmc19hbGxvY19sb2dfcHRycygKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19idWZfdAkJKmJwLAkvKiBidWZmZXIgY29udGFpbmluZyBidHJlZSBibG9jayAqLworCWludAkJCXBmaXJzdCwJLyogaW5kZXggb2YgZmlyc3QgcG9pbnRlciB0byBsb2cgKi8KKwlpbnQJCQlwbGFzdCkJLyogaW5kZXggb2YgbGFzdCBwb2ludGVyIHRvIGxvZyAqLworeworCXhmc19hbGxvY19ibG9ja190CSpibG9jazsJLyogYnRyZWUgYmxvY2sgdG8gbG9nIGZyb20gKi8KKwlpbnQJCQlmaXJzdDsJLyogZmlyc3QgYnl0ZSBvZmZzZXQgbG9nZ2VkICovCisJaW50CQkJbGFzdDsJLyogbGFzdCBieXRlIG9mZnNldCBsb2dnZWQgKi8KKwl4ZnNfYWxsb2NfcHRyX3QJCSpwcDsJLyogYmxvY2stcG9pbnRlciBwb2ludGVyIGluIGJ0cmVlIGJsayAqLworCisJYmxvY2sgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKGJwKTsKKwlwcCA9IFhGU19BTExPQ19QVFJfQUREUihibG9jaywgMSwgY3VyKTsKKwlmaXJzdCA9IChpbnQpKCh4ZnNfY2FkZHJfdCkmcHBbcGZpcnN0IC0gMV0gLSAoeGZzX2NhZGRyX3QpYmxvY2spOworCWxhc3QgPSAoaW50KSgoKHhmc19jYWRkcl90KSZwcFtwbGFzdF0gLSAxKSAtICh4ZnNfY2FkZHJfdClibG9jayk7CisJeGZzX3RyYW5zX2xvZ19idWYoY3VyLT5iY190cCwgYnAsIGZpcnN0LCBsYXN0KTsKK30KKworLyoKKyAqIExvZyByZWNvcmRzIGZyb20gYSBidHJlZSBibG9jayAobGVhZikuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYWxsb2NfbG9nX3JlY3MoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfYnVmX3QJCSpicCwJLyogYnVmZmVyIGNvbnRhaW5pbmcgYnRyZWUgYmxvY2sgKi8KKwlpbnQJCQlyZmlyc3QsCS8qIGluZGV4IG9mIGZpcnN0IHJlY29yZCB0byBsb2cgKi8KKwlpbnQJCQlybGFzdCkJLyogaW5kZXggb2YgbGFzdCByZWNvcmQgdG8gbG9nICovCit7CisJeGZzX2FsbG9jX2Jsb2NrX3QJKmJsb2NrOwkvKiBidHJlZSBibG9jayB0byBsb2cgZnJvbSAqLworCWludAkJCWZpcnN0OwkvKiBmaXJzdCBieXRlIG9mZnNldCBsb2dnZWQgKi8KKwlpbnQJCQlsYXN0OwkvKiBsYXN0IGJ5dGUgb2Zmc2V0IGxvZ2dlZCAqLworCXhmc19hbGxvY19yZWNfdAkJKnJwOwkvKiByZWNvcmQgcG9pbnRlciBmb3IgYnRyZWUgYmxvY2sgKi8KKworCisJYmxvY2sgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKGJwKTsKKwlycCA9IFhGU19BTExPQ19SRUNfQUREUihibG9jaywgMSwgY3VyKTsKKyNpZmRlZiBERUJVRworCXsKKwkJeGZzX2FnZl90CSphZ2Y7CisJCXhmc19hbGxvY19yZWNfdAkqcDsKKworCQlhZ2YgPSBYRlNfQlVGX1RPX0FHRihjdXItPmJjX3ByaXZhdGUuYS5hZ2JwKTsKKwkJZm9yIChwID0gJnJwW3JmaXJzdCAtIDFdOyBwIDw9ICZycFtybGFzdCAtIDFdOyBwKyspCisJCQlBU1NFUlQoSU5UX0dFVChwLT5hcl9zdGFydGJsb2NrLCBBUkNIX0NPTlZFUlQpICsgSU5UX0dFVChwLT5hcl9ibG9ja2NvdW50LCBBUkNIX0NPTlZFUlQpIDw9CisJCQkgICAgICAgSU5UX0dFVChhZ2YtPmFnZl9sZW5ndGgsIEFSQ0hfQ09OVkVSVCkpOworCX0KKyNlbmRpZgorCWZpcnN0ID0gKGludCkoKHhmc19jYWRkcl90KSZycFtyZmlyc3QgLSAxXSAtICh4ZnNfY2FkZHJfdClibG9jayk7CisJbGFzdCA9IChpbnQpKCgoeGZzX2NhZGRyX3QpJnJwW3JsYXN0XSAtIDEpIC0gKHhmc19jYWRkcl90KWJsb2NrKTsKKwl4ZnNfdHJhbnNfbG9nX2J1ZihjdXItPmJjX3RwLCBicCwgZmlyc3QsIGxhc3QpOworfQorCisvKgorICogTG9va3VwIHRoZSByZWNvcmQuICBUaGUgY3Vyc29yIGlzIG1hZGUgdG8gcG9pbnQgdG8gaXQsIGJhc2VkIG9uIGRpci4KKyAqIFJldHVybiAwIGlmIGNhbid0IGZpbmQgYW55IHN1Y2ggcmVjb3JkLCAxIGZvciBzdWNjZXNzLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfYWxsb2NfbG9va3VwKAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2xvb2t1cF90CQlkaXIsCS8qIDw9LCA9PSwgb3IgPj0gKi8KKwlpbnQJCQkqc3RhdCkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJeGZzX2FnYmxvY2tfdAkJYWdibm87CS8qIGEuZy4gcmVsYXRpdmUgYnRyZWUgYmxvY2sgbnVtYmVyICovCisJeGZzX2FnbnVtYmVyX3QJCWFnbm87CS8qIGFsbG9jYXRpb24gZ3JvdXAgbnVtYmVyICovCisJeGZzX2FsbG9jX2Jsb2NrX3QJKmJsb2NrPU5VTEw7CS8qIGN1cnJlbnQgYnRyZWUgYmxvY2sgKi8KKwlpbnQJCQlkaWZmOwkvKiBkaWZmZXJlbmNlIGZvciB0aGUgY3VycmVudCBrZXkgKi8KKwlpbnQJCQllcnJvcjsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJaW50CQkJa2V5bm89MDsJLyogY3VycmVudCBrZXkgbnVtYmVyICovCisJaW50CQkJbGV2ZWw7CS8qIGxldmVsIGluIHRoZSBidHJlZSAqLworCXhmc19tb3VudF90CQkqbXA7CS8qIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50ICovCisKKwlYRlNfU1RBVFNfSU5DKHhzX2FidF9sb29rdXApOworCS8qCisJICogR2V0IHRoZSBhbGxvY2F0aW9uIGdyb3VwIGhlYWRlciwgYW5kIHRoZSByb290IGJsb2NrIG51bWJlci4KKwkgKi8KKwltcCA9IGN1ci0+YmNfbXA7CisKKwl7CisJCXhmc19hZ2ZfdAkqYWdmOwkvKiBhLmcuIGZyZWVzcGFjZSBoZWFkZXIgKi8KKworCQlhZ2YgPSBYRlNfQlVGX1RPX0FHRihjdXItPmJjX3ByaXZhdGUuYS5hZ2JwKTsKKwkJYWdubyA9IElOVF9HRVQoYWdmLT5hZ2Zfc2Vxbm8sIEFSQ0hfQ09OVkVSVCk7CisJCWFnYm5vID0gSU5UX0dFVChhZ2YtPmFnZl9yb290c1tjdXItPmJjX2J0bnVtXSwgQVJDSF9DT05WRVJUKTsKKwl9CisJLyoKKwkgKiBJdGVyYXRlIG92ZXIgZWFjaCBsZXZlbCBpbiB0aGUgYnRyZWUsIHN0YXJ0aW5nIGF0IHRoZSByb290LgorCSAqIEZvciBlYWNoIGxldmVsIGFib3ZlIHRoZSBsZWF2ZXMsIGZpbmQgdGhlIGtleSB3ZSBuZWVkLCBiYXNlZAorCSAqIG9uIHRoZSBsb29rdXAgcmVjb3JkLCB0aGVuIGZvbGxvdyB0aGUgY29ycmVzcG9uZGluZyBibG9jaworCSAqIHBvaW50ZXIgZG93biB0byB0aGUgbmV4dCBsZXZlbC4KKwkgKi8KKwlmb3IgKGxldmVsID0gY3VyLT5iY19ubGV2ZWxzIC0gMSwgZGlmZiA9IDE7IGxldmVsID49IDA7IGxldmVsLS0pIHsKKwkJeGZzX2J1Zl90CSpicDsJLyogYnVmZmVyIHBvaW50ZXIgZm9yIGJ0cmVlIGJsb2NrICovCisJCXhmc19kYWRkcl90CWQ7CS8qIGRpc2sgYWRkcmVzcyBvZiBidHJlZSBibG9jayAqLworCisJCS8qCisJCSAqIEdldCB0aGUgZGlzayBhZGRyZXNzIHdlJ3JlIGxvb2tpbmcgZm9yLgorCQkgKi8KKwkJZCA9IFhGU19BR0JfVE9fREFERFIobXAsIGFnbm8sIGFnYm5vKTsKKwkJLyoKKwkJICogSWYgdGhlIG9sZCBidWZmZXIgYXQgdGhpcyBsZXZlbCBpcyBmb3IgYSBkaWZmZXJlbnQgYmxvY2ssCisJCSAqIHRocm93IGl0IGF3YXksIG90aGVyd2lzZSBqdXN0IHVzZSBpdC4KKwkJICovCisJCWJwID0gY3VyLT5iY19idWZzW2xldmVsXTsKKwkJaWYgKGJwICYmIFhGU19CVUZfQUREUihicCkgIT0gZCkKKwkJCWJwID0gKHhmc19idWZfdCAqKTA7CisJCWlmICghYnApIHsKKwkJCS8qCisJCQkgKiBOZWVkIHRvIGdldCBhIG5ldyBidWZmZXIuICBSZWFkIGl0LCB0aGVuCisJCQkgKiBzZXQgaXQgaW4gdGhlIGN1cnNvciwgcmVsZWFzaW5nIHRoZSBvbGQgb25lLgorCQkJICovCisJCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmcyhtcCwgY3VyLT5iY190cCwgYWdubywKKwkJCQkJYWdibm8sIDAsICZicCwgWEZTX0FMTE9DX0JUUkVFX1JFRikpKQorCQkJCXJldHVybiBlcnJvcjsKKwkJCXhmc19idHJlZV9zZXRidWYoY3VyLCBsZXZlbCwgYnApOworCQkJLyoKKwkJCSAqIFBvaW50IHRvIHRoZSBidHJlZSBibG9jaywgbm93IHRoYXQgd2UgaGF2ZSB0aGUgYnVmZmVyCisJCQkgKi8KKwkJCWJsb2NrID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhicCk7CisJCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGJsb2NrLCBsZXZlbCwKKwkJCQkJYnApKSkKKwkJCQlyZXR1cm4gZXJyb3I7CisJCX0gZWxzZQorCQkJYmxvY2sgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKGJwKTsKKwkJLyoKKwkJICogSWYgd2UgYWxyZWFkeSBoYWQgYSBrZXkgbWF0Y2ggYXQgYSBoaWdoZXIgbGV2ZWwsIHdlIGtub3cKKwkJICogd2UgbmVlZCB0byB1c2UgdGhlIGZpcnN0IGVudHJ5IGluIHRoaXMgYmxvY2suCisJCSAqLworCQlpZiAoZGlmZiA9PSAwKQorCQkJa2V5bm8gPSAxOworCQkvKgorCQkgKiBPdGhlcndpc2Ugd2UgbmVlZCB0byBzZWFyY2ggdGhpcyBibG9jay4gIERvIGEgYmluYXJ5IHNlYXJjaC4KKwkJICovCisJCWVsc2UgeworCQkJaW50CQloaWdoOwkvKiBoaWdoIGVudHJ5IG51bWJlciAqLworCQkJeGZzX2FsbG9jX2tleV90CSpra2Jhc2U9TlVMTDsvKiBiYXNlIG9mIGtleXMgaW4gYmxvY2sgKi8KKwkJCXhmc19hbGxvY19yZWNfdAkqa3JiYXNlPU5VTEw7LyogYmFzZSBvZiByZWNvcmRzIGluIGJsb2NrICovCisJCQlpbnQJCWxvdzsJLyogbG93IGVudHJ5IG51bWJlciAqLworCisJCQkvKgorCQkJICogR2V0IGEgcG9pbnRlciB0byBrZXlzIG9yIHJlY29yZHMuCisJCQkgKi8KKwkJCWlmIChsZXZlbCA+IDApCisJCQkJa2tiYXNlID0gWEZTX0FMTE9DX0tFWV9BRERSKGJsb2NrLCAxLCBjdXIpOworCQkJZWxzZQorCQkJCWtyYmFzZSA9IFhGU19BTExPQ19SRUNfQUREUihibG9jaywgMSwgY3VyKTsKKwkJCS8qCisJCQkgKiBTZXQgbG93IGFuZCBoaWdoIGVudHJ5IG51bWJlcnMsIDEtYmFzZWQuCisJCQkgKi8KKwkJCWxvdyA9IDE7CisJCQlpZiAoIShoaWdoID0gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkpIHsKKwkJCQkvKgorCQkJCSAqIElmIHRoZSBibG9jayBpcyBlbXB0eSwgdGhlIHRyZWUgbXVzdAorCQkJCSAqIGJlIGFuIGVtcHR5IGxlYWYuCisJCQkJICovCisJCQkJQVNTRVJUKGxldmVsID09IDAgJiYgY3VyLT5iY19ubGV2ZWxzID09IDEpOworCQkJCWN1ci0+YmNfcHRyc1swXSA9IGRpciAhPSBYRlNfTE9PS1VQX0xFOworCQkJCSpzdGF0ID0gMDsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCS8qCisJCQkgKiBCaW5hcnkgc2VhcmNoIHRoZSBibG9jay4KKwkJCSAqLworCQkJd2hpbGUgKGxvdyA8PSBoaWdoKSB7CisJCQkJeGZzX2V4dGxlbl90CWJsb2NrY291bnQ7CS8qIGtleSB2YWx1ZSAqLworCQkJCXhmc19hZ2Jsb2NrX3QJc3RhcnRibG9jazsJLyoga2V5IHZhbHVlICovCisKKwkJCQlYRlNfU1RBVFNfSU5DKHhzX2FidF9jb21wYXJlKTsKKwkJCQkvKgorCQkJCSAqIGtleW5vIGlzIGF2ZXJhZ2Ugb2YgbG93IGFuZCBoaWdoLgorCQkJCSAqLworCQkJCWtleW5vID0gKGxvdyArIGhpZ2gpID4+IDE7CisJCQkJLyoKKwkJCQkgKiBHZXQgc3RhcnRibG9jayAmIGJsb2NrY291bnQuCisJCQkJICovCisJCQkJaWYgKGxldmVsID4gMCkgeworCQkJCQl4ZnNfYWxsb2Nfa2V5X3QJKmtrcDsKKworCQkJCQlra3AgPSBra2Jhc2UgKyBrZXlubyAtIDE7CisJCQkJCXN0YXJ0YmxvY2sgPSBJTlRfR0VUKGtrcC0+YXJfc3RhcnRibG9jaywgQVJDSF9DT05WRVJUKTsKKwkJCQkJYmxvY2tjb3VudCA9IElOVF9HRVQoa2twLT5hcl9ibG9ja2NvdW50LCBBUkNIX0NPTlZFUlQpOworCQkJCX0gZWxzZSB7CisJCQkJCXhmc19hbGxvY19yZWNfdAkqa3JwOworCisJCQkJCWtycCA9IGtyYmFzZSArIGtleW5vIC0gMTsKKwkJCQkJc3RhcnRibG9jayA9IElOVF9HRVQoa3JwLT5hcl9zdGFydGJsb2NrLCBBUkNIX0NPTlZFUlQpOworCQkJCQlibG9ja2NvdW50ID0gSU5UX0dFVChrcnAtPmFyX2Jsb2NrY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJCQkJfQorCQkJCS8qCisJCQkJICogQ29tcHV0ZSBkaWZmZXJlbmNlIHRvIGdldCBuZXh0IGRpcmVjdGlvbi4KKwkJCQkgKi8KKwkJCQlpZiAoY3VyLT5iY19idG51bSA9PSBYRlNfQlROVU1fQk5PKQorCQkJCQlkaWZmID0gKGludClzdGFydGJsb2NrIC0KKwkJCQkJICAgICAgIChpbnQpY3VyLT5iY19yZWMuYS5hcl9zdGFydGJsb2NrOworCQkJCWVsc2UgaWYgKCEoZGlmZiA9IChpbnQpYmxvY2tjb3VudCAtCisJCQkJCSAgICAoaW50KWN1ci0+YmNfcmVjLmEuYXJfYmxvY2tjb3VudCkpCisJCQkJCWRpZmYgPSAoaW50KXN0YXJ0YmxvY2sgLQorCQkJCQkgICAgKGludCljdXItPmJjX3JlYy5hLmFyX3N0YXJ0YmxvY2s7CisJCQkJLyoKKwkJCQkgKiBMZXNzIHRoYW4sIG1vdmUgcmlnaHQuCisJCQkJICovCisJCQkJaWYgKGRpZmYgPCAwKQorCQkJCQlsb3cgPSBrZXlubyArIDE7CisJCQkJLyoKKwkJCQkgKiBHcmVhdGVyIHRoYW4sIG1vdmUgbGVmdC4KKwkJCQkgKi8KKwkJCQllbHNlIGlmIChkaWZmID4gMCkKKwkJCQkJaGlnaCA9IGtleW5vIC0gMTsKKwkJCQkvKgorCQkJCSAqIEVxdWFsLCB3ZSdyZSBkb25lLgorCQkJCSAqLworCQkJCWVsc2UKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJLyoKKwkJICogSWYgdGhlcmUgYXJlIG1vcmUgbGV2ZWxzLCBzZXQgdXAgZm9yIHRoZSBuZXh0IGxldmVsCisJCSAqIGJ5IGdldHRpbmcgdGhlIGJsb2NrIG51bWJlciBhbmQgZmlsbGluZyBpbiB0aGUgY3Vyc29yLgorCQkgKi8KKwkJaWYgKGxldmVsID4gMCkgeworCQkJLyoKKwkJCSAqIElmIHdlIG1vdmVkIGxlZnQsIG5lZWQgdGhlIHByZXZpb3VzIGtleSBudW1iZXIsCisJCQkgKiB1bmxlc3MgdGhlcmUgaXNuJ3Qgb25lLgorCQkJICovCisJCQlpZiAoZGlmZiA+IDAgJiYgLS1rZXlubyA8IDEpCisJCQkJa2V5bm8gPSAxOworCQkJYWdibm8gPSBJTlRfR0VUKCpYRlNfQUxMT0NfUFRSX0FERFIoYmxvY2ssIGtleW5vLCBjdXIpLCBBUkNIX0NPTlZFUlQpOworI2lmZGVmIERFQlVHCisJCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NwdHIoY3VyLCBhZ2JubywgbGV2ZWwpKSkKKwkJCQlyZXR1cm4gZXJyb3I7CisjZW5kaWYKKwkJCWN1ci0+YmNfcHRyc1tsZXZlbF0gPSBrZXlubzsKKwkJfQorCX0KKwkvKgorCSAqIERvbmUgd2l0aCB0aGUgc2VhcmNoLgorCSAqIFNlZSBpZiB3ZSBuZWVkIHRvIGFkanVzdCB0aGUgcmVzdWx0cy4KKwkgKi8KKwlpZiAoZGlyICE9IFhGU19MT09LVVBfTEUgJiYgZGlmZiA8IDApIHsKKwkJa2V5bm8rKzsKKwkJLyoKKwkJICogSWYgZ2Ugc2VhcmNoIGFuZCB3ZSB3ZW50IG9mZiB0aGUgZW5kIG9mIHRoZSBibG9jaywgYnV0IGl0J3MKKwkJICogbm90IHRoZSBsYXN0IGJsb2NrLCB3ZSdyZSBpbiB0aGUgd3JvbmcgYmxvY2suCisJCSAqLworCQlpZiAoZGlyID09IFhGU19MT09LVVBfR0UgJiYKKwkJICAgIGtleW5vID4gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAmJgorCQkgICAgSU5UX0dFVChibG9jay0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCkgIT0gTlVMTEFHQkxPQ0spIHsKKwkJCWludAlpOworCisJCQljdXItPmJjX3B0cnNbMF0gPSBrZXlubzsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfaW5jcmVtZW50KGN1ciwgMCwgJmkpKSkKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQlYRlNfV0FOVF9DT1JSVVBURURfUkVUVVJOKGkgPT0gMSk7CisJCQkqc3RhdCA9IDE7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwllbHNlIGlmIChkaXIgPT0gWEZTX0xPT0tVUF9MRSAmJiBkaWZmID4gMCkKKwkJa2V5bm8tLTsKKwljdXItPmJjX3B0cnNbMF0gPSBrZXlubzsKKwkvKgorCSAqIFJldHVybiBpZiB3ZSBzdWNjZWVkZWQgb3Igbm90LgorCSAqLworCWlmIChrZXlubyA9PSAwIHx8IGtleW5vID4gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkKKwkJKnN0YXQgPSAwOworCWVsc2UKKwkJKnN0YXQgPSAoKGRpciAhPSBYRlNfTE9PS1VQX0VRKSB8fCAoZGlmZiA9PSAwKSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBNb3ZlIDEgcmVjb3JkIGxlZnQgZnJvbSBjdXIvbGV2ZWwgaWYgcG9zc2libGUuCisgKiBVcGRhdGUgY3VyIHRvIHJlZmxlY3QgdGhlIG5ldyBwYXRoLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfYWxsb2NfbHNoaWZ0KAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkJbGV2ZWwsCS8qIGxldmVsIHRvIHNoaWZ0IHJlY29yZCBvbiAqLworCWludAkJCSpzdGF0KQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK3sKKwlpbnQJCQllcnJvcjsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisjaWZkZWYgREVCVUcKKwlpbnQJCQlpOwkvKiBsb29wIGluZGV4ICovCisjZW5kaWYKKwl4ZnNfYWxsb2Nfa2V5X3QJCWtleTsJLyoga2V5IHZhbHVlIGZvciBsZWFmIGxldmVsIHVwd2FyZCAqLworCXhmc19idWZfdAkJKmxicDsJLyogYnVmZmVyIGZvciBsZWZ0IG5laWdoYm9yIGJsb2NrICovCisJeGZzX2FsbG9jX2Jsb2NrX3QJKmxlZnQ7CS8qIGxlZnQgbmVpZ2hib3IgYnRyZWUgYmxvY2sgKi8KKwlpbnQJCQlucmVjOwkvKiBuZXcgbnVtYmVyIG9mIGxlZnQgYmxvY2sgZW50cmllcyAqLworCXhmc19idWZfdAkJKnJicDsJLyogYnVmZmVyIGZvciByaWdodCAoY3VycmVudCkgYmxvY2sgKi8KKwl4ZnNfYWxsb2NfYmxvY2tfdAkqcmlnaHQ7CS8qIHJpZ2h0IChjdXJyZW50KSBidHJlZSBibG9jayAqLworCXhmc19hbGxvY19rZXlfdAkJKnJrcD1OVUxMOwkvKiBrZXkgcG9pbnRlciBmb3IgcmlnaHQgYmxvY2sgKi8KKwl4ZnNfYWxsb2NfcHRyX3QJCSpycHA9TlVMTDsJLyogYWRkcmVzcyBwb2ludGVyIGZvciByaWdodCBibG9jayAqLworCXhmc19hbGxvY19yZWNfdAkJKnJycD1OVUxMOwkvKiByZWNvcmQgcG9pbnRlciBmb3IgcmlnaHQgYmxvY2sgKi8KKworCS8qCisJICogU2V0IHVwIHZhcmlhYmxlcyBmb3IgdGhpcyBibG9jayBhcyAicmlnaHQiLgorCSAqLworCXJicCA9IGN1ci0+YmNfYnVmc1tsZXZlbF07CisJcmlnaHQgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKHJicCk7CisjaWZkZWYgREVCVUcKKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIHJpZ2h0LCBsZXZlbCwgcmJwKSkpCisJCXJldHVybiBlcnJvcjsKKyNlbmRpZgorCS8qCisJICogSWYgd2UndmUgZ290IG5vIGxlZnQgc2libGluZyB0aGVuIHdlIGNhbid0IHNoaWZ0IGFuIGVudHJ5IGxlZnQuCisJICovCisJaWYgKElOVF9HRVQocmlnaHQtPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTEFHQkxPQ0spIHsKKwkJKnN0YXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBJZiB0aGUgY3Vyc29yIGVudHJ5IGlzIHRoZSBvbmUgdGhhdCB3b3VsZCBiZSBtb3ZlZCwgZG9uJ3QKKwkgKiBkbyBpdC4uLiBpdCdzIHRvbyBjb21wbGljYXRlZC4KKwkgKi8KKwlpZiAoY3VyLT5iY19wdHJzW2xldmVsXSA8PSAxKSB7CisJCSpzdGF0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogU2V0IHVwIHRoZSBsZWZ0IG5laWdoYm9yIGFzICJsZWZ0Ii4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmcyhjdXItPmJjX21wLCBjdXItPmJjX3RwLAorCQkJY3VyLT5iY19wcml2YXRlLmEuYWdubywgSU5UX0dFVChyaWdodC0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJUKSwgMCwgJmxicCwKKwkJCVhGU19BTExPQ19CVFJFRV9SRUYpKSkKKwkJcmV0dXJuIGVycm9yOworCWxlZnQgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKGxicCk7CisJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBsZWZ0LCBsZXZlbCwgbGJwKSkpCisJCXJldHVybiBlcnJvcjsKKwkvKgorCSAqIElmIGl0J3MgZnVsbCwgaXQgY2FuJ3QgdGFrZSBhbm90aGVyIGVudHJ5LgorCSAqLworCWlmIChJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0FMTE9DX0JMT0NLX01BWFJFQ1MobGV2ZWwsIGN1cikpIHsKKwkJKnN0YXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJbnJlYyA9IElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSArIDE7CisJLyoKKwkgKiBJZiBub24tbGVhZiwgY29weSBhIGtleSBhbmQgYSBwdHIgdG8gdGhlIGxlZnQgYmxvY2suCisJICovCisJaWYgKGxldmVsID4gMCkgeworCQl4ZnNfYWxsb2Nfa2V5X3QJKmxrcDsJLyoga2V5IHBvaW50ZXIgZm9yIGxlZnQgYmxvY2sgKi8KKwkJeGZzX2FsbG9jX3B0cl90CSpscHA7CS8qIGFkZHJlc3MgcG9pbnRlciBmb3IgbGVmdCBibG9jayAqLworCisJCWxrcCA9IFhGU19BTExPQ19LRVlfQUREUihsZWZ0LCBucmVjLCBjdXIpOworCQlya3AgPSBYRlNfQUxMT0NfS0VZX0FERFIocmlnaHQsIDEsIGN1cik7CisJCSpsa3AgPSAqcmtwOworCQl4ZnNfYWxsb2NfbG9nX2tleXMoY3VyLCBsYnAsIG5yZWMsIG5yZWMpOworCQlscHAgPSBYRlNfQUxMT0NfUFRSX0FERFIobGVmdCwgbnJlYywgY3VyKTsKKwkJcnBwID0gWEZTX0FMTE9DX1BUUl9BRERSKHJpZ2h0LCAxLCBjdXIpOworI2lmZGVmIERFQlVHCisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsIElOVF9HRVQoKnJwcCwgQVJDSF9DT05WRVJUKSwgbGV2ZWwpKSkKKwkJCXJldHVybiBlcnJvcjsKKyNlbmRpZgorCQkqbHBwID0gKnJwcDsgLyogSU5UXzogY29weSAqLworCQl4ZnNfYWxsb2NfbG9nX3B0cnMoY3VyLCBsYnAsIG5yZWMsIG5yZWMpOworCQl4ZnNfYnRyZWVfY2hlY2tfa2V5KGN1ci0+YmNfYnRudW0sIGxrcCAtIDEsIGxrcCk7CisJfQorCS8qCisJICogSWYgbGVhZiwgY29weSBhIHJlY29yZCB0byB0aGUgbGVmdCBibG9jay4KKwkgKi8KKwllbHNlIHsKKwkJeGZzX2FsbG9jX3JlY190CSpscnA7CS8qIHJlY29yZCBwb2ludGVyIGZvciBsZWZ0IGJsb2NrICovCisKKwkJbHJwID0gWEZTX0FMTE9DX1JFQ19BRERSKGxlZnQsIG5yZWMsIGN1cik7CisJCXJycCA9IFhGU19BTExPQ19SRUNfQUREUihyaWdodCwgMSwgY3VyKTsKKwkJKmxycCA9ICpycnA7CisJCXhmc19hbGxvY19sb2dfcmVjcyhjdXIsIGxicCwgbnJlYywgbnJlYyk7CisJCXhmc19idHJlZV9jaGVja19yZWMoY3VyLT5iY19idG51bSwgbHJwIC0gMSwgbHJwKTsKKwl9CisJLyoKKwkgKiBCdW1wIGFuZCBsb2cgbGVmdCdzIG51bXJlY3MsIGRlY3JlbWVudCBhbmQgbG9nIHJpZ2h0J3MgbnVtcmVjcy4KKwkgKi8KKwlJTlRfTU9EKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCwgKzEpOworCXhmc19hbGxvY19sb2dfYmxvY2soY3VyLT5iY190cCwgbGJwLCBYRlNfQkJfTlVNUkVDUyk7CisJSU5UX01PRChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCAtMSk7CisJeGZzX2FsbG9jX2xvZ19ibG9jayhjdXItPmJjX3RwLCByYnAsIFhGU19CQl9OVU1SRUNTKTsKKwkvKgorCSAqIFNsaWRlIHRoZSBjb250ZW50cyBvZiByaWdodCBkb3duIG9uZSBlbnRyeS4KKwkgKi8KKwlpZiAobGV2ZWwgPiAwKSB7CisjaWZkZWYgREVCVUcKKwkJZm9yIChpID0gMDsgaSA8IElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7IGkrKykgeworCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgSU5UX0dFVChycHBbaSArIDFdLCBBUkNIX0NPTlZFUlQpLAorCQkJCQlsZXZlbCkpKQorCQkJCXJldHVybiBlcnJvcjsKKwkJfQorI2VuZGlmCisJCW1lbW1vdmUocmtwLCBya3AgKyAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpya3ApKTsKKwkJbWVtbW92ZShycHAsIHJwcCArIDEsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKiBzaXplb2YoKnJwcCkpOworCQl4ZnNfYWxsb2NfbG9nX2tleXMoY3VyLCByYnAsIDEsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpOworCQl4ZnNfYWxsb2NfbG9nX3B0cnMoY3VyLCByYnAsIDEsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpOworCX0gZWxzZSB7CisJCW1lbW1vdmUocnJwLCBycnAgKyAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpycnApKTsKKwkJeGZzX2FsbG9jX2xvZ19yZWNzKGN1ciwgcmJwLCAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKTsKKwkJa2V5LmFyX3N0YXJ0YmxvY2sgPSBycnAtPmFyX3N0YXJ0YmxvY2s7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCisJCWtleS5hcl9ibG9ja2NvdW50ID0gcnJwLT5hcl9ibG9ja2NvdW50OyAvKiBJTlRfOiBkaXJlY3QgY29weSAqLworCQlya3AgPSAma2V5OworCX0KKwkvKgorCSAqIFVwZGF0ZSB0aGUgcGFyZW50IGtleSB2YWx1ZXMgb2YgcmlnaHQuCisJICovCisJaWYgKChlcnJvciA9IHhmc19hbGxvY191cGRrZXkoY3VyLCBya3AsIGxldmVsICsgMSkpKQorCQlyZXR1cm4gZXJyb3I7CisJLyoKKwkgKiBTbGlkZSB0aGUgY3Vyc29yIHZhbHVlIGxlZnQgb25lLgorCSAqLworCWN1ci0+YmNfcHRyc1tsZXZlbF0tLTsKKwkqc3RhdCA9IDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBhIG5ldyByb290IGJsb2NrLCBmaWxsIGl0IGluLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfYWxsb2NfbmV3cm9vdCgKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJCSpzdGF0KQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK3sKKwlpbnQJCQllcnJvcjsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJeGZzX2FnYmxvY2tfdAkJbGJubzsJLyogbGVmdCBibG9jayBudW1iZXIgKi8KKwl4ZnNfYnVmX3QJCSpsYnA7CS8qIGxlZnQgYnRyZWUgYnVmZmVyICovCisJeGZzX2FsbG9jX2Jsb2NrX3QJKmxlZnQ7CS8qIGxlZnQgYnRyZWUgYmxvY2sgKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkvKiBtb3VudCBzdHJ1Y3R1cmUgKi8KKwl4ZnNfYWdibG9ja190CQluYm5vOwkvKiBuZXcgYmxvY2sgbnVtYmVyICovCisJeGZzX2J1Zl90CQkqbmJwOwkvKiBuZXcgKHJvb3QpIGJ1ZmZlciAqLworCXhmc19hbGxvY19ibG9ja190CSpuZXc7CS8qIG5ldyAocm9vdCkgYnRyZWUgYmxvY2sgKi8KKwlpbnQJCQlucHRyOwkvKiBuZXcgdmFsdWUgZm9yIGtleSBpbmRleCwgMSBvciAyICovCisJeGZzX2FnYmxvY2tfdAkJcmJubzsJLyogcmlnaHQgYmxvY2sgbnVtYmVyICovCisJeGZzX2J1Zl90CQkqcmJwOwkvKiByaWdodCBidHJlZSBidWZmZXIgKi8KKwl4ZnNfYWxsb2NfYmxvY2tfdAkqcmlnaHQ7CS8qIHJpZ2h0IGJ0cmVlIGJsb2NrICovCisKKwltcCA9IGN1ci0+YmNfbXA7CisKKwlBU1NFUlQoY3VyLT5iY19ubGV2ZWxzIDwgWEZTX0FHX01BWExFVkVMUyhtcCkpOworCS8qCisJICogR2V0IGEgYnVmZmVyIGZyb20gdGhlIGZyZWVsaXN0IGJsb2NrcywgZm9yIHRoZSBuZXcgcm9vdC4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2FsbG9jX2dldF9mcmVlbGlzdChjdXItPmJjX3RwLCBjdXItPmJjX3ByaXZhdGUuYS5hZ2JwLAorCQkJJm5ibm8pKSkKKwkJcmV0dXJuIGVycm9yOworCS8qCisJICogTm9uZSBhdmFpbGFibGUsIHdlIGZhaWwuCisJICovCisJaWYgKG5ibm8gPT0gTlVMTEFHQkxPQ0spIHsKKwkJKnN0YXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJeGZzX3RyYW5zX2FnYnRyZWVfZGVsdGEoY3VyLT5iY190cCwgMSk7CisJbmJwID0geGZzX2J0cmVlX2dldF9idWZzKG1wLCBjdXItPmJjX3RwLCBjdXItPmJjX3ByaXZhdGUuYS5hZ25vLCBuYm5vLAorCQkwKTsKKwluZXcgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKG5icCk7CisJLyoKKwkgKiBTZXQgdGhlIHJvb3QgZGF0YSBpbiB0aGUgYS5nLiBmcmVlc3BhY2Ugc3RydWN0dXJlLgorCSAqLworCXsKKwkJeGZzX2FnZl90CSphZ2Y7CS8qIGEuZy4gZnJlZXNwYWNlIGhlYWRlciAqLworCQl4ZnNfYWdudW1iZXJfdAlzZXFubzsKKworCQlhZ2YgPSBYRlNfQlVGX1RPX0FHRihjdXItPmJjX3ByaXZhdGUuYS5hZ2JwKTsKKwkJSU5UX1NFVChhZ2YtPmFnZl9yb290c1tjdXItPmJjX2J0bnVtXSwgQVJDSF9DT05WRVJULCBuYm5vKTsKKwkJSU5UX01PRChhZ2YtPmFnZl9sZXZlbHNbY3VyLT5iY19idG51bV0sIEFSQ0hfQ09OVkVSVCwgMSk7CisJCXNlcW5vID0gSU5UX0dFVChhZ2YtPmFnZl9zZXFubywgQVJDSF9DT05WRVJUKTsKKwkJbXAtPm1fcGVyYWdbc2Vxbm9dLnBhZ2ZfbGV2ZWxzW2N1ci0+YmNfYnRudW1dKys7CisJCXhmc19hbGxvY19sb2dfYWdmKGN1ci0+YmNfdHAsIGN1ci0+YmNfcHJpdmF0ZS5hLmFnYnAsCisJCQlYRlNfQUdGX1JPT1RTIHwgWEZTX0FHRl9MRVZFTFMpOworCX0KKwkvKgorCSAqIEF0IHRoZSBwcmV2aW91cyByb290IGxldmVsIHRoZXJlIGFyZSBub3cgdHdvIGJsb2NrczogdGhlIG9sZAorCSAqIHJvb3QsIGFuZCB0aGUgbmV3IGJsb2NrIGdlbmVyYXRlZCB3aGVuIGl0IHdhcyBzcGxpdC4KKwkgKiBXZSBkb24ndCBrbm93IHdoaWNoIG9uZSB0aGUgY3Vyc29yIGlzIHBvaW50aW5nIGF0LCBzbyB3ZQorCSAqIHNldCB1cCB2YXJpYWJsZXMgImxlZnQiIGFuZCAicmlnaHQiIGZvciBlYWNoIGNhc2UuCisJICovCisJbGJwID0gY3VyLT5iY19idWZzW2N1ci0+YmNfbmxldmVscyAtIDFdOworCWxlZnQgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKGxicCk7CisjaWZkZWYgREVCVUcKKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGxlZnQsIGN1ci0+YmNfbmxldmVscyAtIDEsIGxicCkpKQorCQlyZXR1cm4gZXJyb3I7CisjZW5kaWYKKwlpZiAoSU5UX0dFVChsZWZ0LT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSAhPSBOVUxMQUdCTE9DSykgeworCQkvKgorCQkgKiBPdXIgYmxvY2sgaXMgbGVmdCwgcGljayB1cCB0aGUgcmlnaHQgYmxvY2suCisJCSAqLworCQlsYm5vID0gWEZTX0RBRERSX1RPX0FHQk5PKG1wLCBYRlNfQlVGX0FERFIobGJwKSk7CisJCXJibm8gPSBJTlRfR0VUKGxlZnQtPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpOworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmcyhtcCwgY3VyLT5iY190cCwKKwkJCQljdXItPmJjX3ByaXZhdGUuYS5hZ25vLCByYm5vLCAwLCAmcmJwLAorCQkJCVhGU19BTExPQ19CVFJFRV9SRUYpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJcmlnaHQgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKHJicCk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgcmlnaHQsCisJCQkJY3VyLT5iY19ubGV2ZWxzIC0gMSwgcmJwKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCW5wdHIgPSAxOworCX0gZWxzZSB7CisJCS8qCisJCSAqIE91ciBibG9jayBpcyByaWdodCwgcGljayB1cCB0aGUgbGVmdCBibG9jay4KKwkJICovCisJCXJicCA9IGxicDsKKwkJcmlnaHQgPSBsZWZ0OworCQlyYm5vID0gWEZTX0RBRERSX1RPX0FHQk5PKG1wLCBYRlNfQlVGX0FERFIocmJwKSk7CisJCWxibm8gPSBJTlRfR0VUKHJpZ2h0LT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQpOworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmcyhtcCwgY3VyLT5iY190cCwKKwkJCQljdXItPmJjX3ByaXZhdGUuYS5hZ25vLCBsYm5vLCAwLCAmbGJwLAorCQkJCVhGU19BTExPQ19CVFJFRV9SRUYpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJbGVmdCA9IFhGU19CVUZfVE9fQUxMT0NfQkxPQ0sobGJwKTsKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBsZWZ0LAorCQkJCWN1ci0+YmNfbmxldmVscyAtIDEsIGxicCkpKQorCQkJcmV0dXJuIGVycm9yOworCQlucHRyID0gMjsKKwl9CisJLyoKKwkgKiBGaWxsIGluIHRoZSBuZXcgYmxvY2sncyBidHJlZSBoZWFkZXIgYW5kIGxvZyBpdC4KKwkgKi8KKwlJTlRfU0VUKG5ldy0+YmJfbWFnaWMsIEFSQ0hfQ09OVkVSVCwgeGZzX21hZ2ljc1tjdXItPmJjX2J0bnVtXSk7CisJSU5UX1NFVChuZXctPmJiX2xldmVsLCBBUkNIX0NPTlZFUlQsIChfX3VpbnQxNl90KWN1ci0+YmNfbmxldmVscyk7CisJSU5UX1NFVChuZXctPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCwgMik7CisJSU5UX1NFVChuZXctPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCwgTlVMTEFHQkxPQ0spOworCUlOVF9TRVQobmV3LT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJULCBOVUxMQUdCTE9DSyk7CisJeGZzX2FsbG9jX2xvZ19ibG9jayhjdXItPmJjX3RwLCBuYnAsIFhGU19CQl9BTExfQklUUyk7CisJQVNTRVJUKGxibm8gIT0gTlVMTEFHQkxPQ0sgJiYgcmJubyAhPSBOVUxMQUdCTE9DSyk7CisJLyoKKwkgKiBGaWxsIGluIHRoZSBrZXkgZGF0YSBpbiB0aGUgbmV3IHJvb3QuCisJICovCisJeworCQl4ZnNfYWxsb2Nfa2V5X3QJCSprcDsJLyogYnRyZWUga2V5IHBvaW50ZXIgKi8KKworCQlrcCA9IFhGU19BTExPQ19LRVlfQUREUihuZXcsIDEsIGN1cik7CisJCWlmIChJTlRfR0VUKGxlZnQtPmJiX2xldmVsLCBBUkNIX0NPTlZFUlQpID4gMCkgeworCQkJa3BbMF0gPSAqWEZTX0FMTE9DX0tFWV9BRERSKGxlZnQsIDEsIGN1cik7IC8qIElOVF86IHN0cnVjdHVyZSBjb3B5ICovCisJCQlrcFsxXSA9ICpYRlNfQUxMT0NfS0VZX0FERFIocmlnaHQsIDEsIGN1cik7LyogSU5UXzogc3RydWN0dXJlIGNvcHkgKi8KKwkJfSBlbHNlIHsKKwkJCXhmc19hbGxvY19yZWNfdAkqcnA7CS8qIGJ0cmVlIHJlY29yZCBwb2ludGVyICovCisKKwkJCXJwID0gWEZTX0FMTE9DX1JFQ19BRERSKGxlZnQsIDEsIGN1cik7CisJCQlrcFswXS5hcl9zdGFydGJsb2NrID0gcnAtPmFyX3N0YXJ0YmxvY2s7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCisJCQlrcFswXS5hcl9ibG9ja2NvdW50ID0gcnAtPmFyX2Jsb2NrY291bnQ7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCisJCQlycCA9IFhGU19BTExPQ19SRUNfQUREUihyaWdodCwgMSwgY3VyKTsKKwkJCWtwWzFdLmFyX3N0YXJ0YmxvY2sgPSBycC0+YXJfc3RhcnRibG9jazsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KKwkJCWtwWzFdLmFyX2Jsb2NrY291bnQgPSBycC0+YXJfYmxvY2tjb3VudDsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KKwkJfQorCX0KKwl4ZnNfYWxsb2NfbG9nX2tleXMoY3VyLCBuYnAsIDEsIDIpOworCS8qCisJICogRmlsbCBpbiB0aGUgcG9pbnRlciBkYXRhIGluIHRoZSBuZXcgcm9vdC4KKwkgKi8KKwl7CisJCXhmc19hbGxvY19wdHJfdAkJKnBwOwkvKiBidHJlZSBhZGRyZXNzIHBvaW50ZXIgKi8KKworCQlwcCA9IFhGU19BTExPQ19QVFJfQUREUihuZXcsIDEsIGN1cik7CisJCUlOVF9TRVQocHBbMF0sIEFSQ0hfQ09OVkVSVCwgbGJubyk7CisJCUlOVF9TRVQocHBbMV0sIEFSQ0hfQ09OVkVSVCwgcmJubyk7CisJfQorCXhmc19hbGxvY19sb2dfcHRycyhjdXIsIG5icCwgMSwgMik7CisJLyoKKwkgKiBGaXggdXAgdGhlIGN1cnNvci4KKwkgKi8KKwl4ZnNfYnRyZWVfc2V0YnVmKGN1ciwgY3VyLT5iY19ubGV2ZWxzLCBuYnApOworCWN1ci0+YmNfcHRyc1tjdXItPmJjX25sZXZlbHNdID0gbnB0cjsKKwljdXItPmJjX25sZXZlbHMrKzsKKwkqc3RhdCA9IDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBNb3ZlIDEgcmVjb3JkIHJpZ2h0IGZyb20gY3VyL2xldmVsIGlmIHBvc3NpYmxlLgorICogVXBkYXRlIGN1ciB0byByZWZsZWN0IHRoZSBuZXcgcGF0aC4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX2FsbG9jX3JzaGlmdCgKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJCWxldmVsLAkvKiBsZXZlbCB0byBzaGlmdCByZWNvcmQgb24gKi8KKwlpbnQJCQkqc3RhdCkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJaW50CQkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCWludAkJCWk7CS8qIGxvb3AgaW5kZXggKi8KKwl4ZnNfYWxsb2Nfa2V5X3QJCWtleTsJLyoga2V5IHZhbHVlIGZvciBsZWFmIGxldmVsIHVwd2FyZCAqLworCXhmc19idWZfdAkJKmxicDsJLyogYnVmZmVyIGZvciBsZWZ0IChjdXJyZW50KSBibG9jayAqLworCXhmc19hbGxvY19ibG9ja190CSpsZWZ0OwkvKiBsZWZ0IChjdXJyZW50KSBidHJlZSBibG9jayAqLworCXhmc19idWZfdAkJKnJicDsJLyogYnVmZmVyIGZvciByaWdodCBuZWlnaGJvciBibG9jayAqLworCXhmc19hbGxvY19ibG9ja190CSpyaWdodDsJLyogcmlnaHQgbmVpZ2hib3IgYnRyZWUgYmxvY2sgKi8KKwl4ZnNfYWxsb2Nfa2V5X3QJCSpya3A7CS8qIGtleSBwb2ludGVyIGZvciByaWdodCBibG9jayAqLworCXhmc19idHJlZV9jdXJfdAkJKnRjdXI7CS8qIHRlbXBvcmFyeSBjdXJzb3IgKi8KKworCS8qCisJICogU2V0IHVwIHZhcmlhYmxlcyBmb3IgdGhpcyBibG9jayBhcyAibGVmdCIuCisJICovCisJbGJwID0gY3VyLT5iY19idWZzW2xldmVsXTsKKwlsZWZ0ID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhsYnApOworI2lmZGVmIERFQlVHCisJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBsZWZ0LCBsZXZlbCwgbGJwKSkpCisJCXJldHVybiBlcnJvcjsKKyNlbmRpZgorCS8qCisJICogSWYgd2UndmUgZ290IG5vIHJpZ2h0IHNpYmxpbmcgdGhlbiB3ZSBjYW4ndCBzaGlmdCBhbiBlbnRyeSByaWdodC4KKwkgKi8KKwlpZiAoSU5UX0dFVChsZWZ0LT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSA9PSBOVUxMQUdCTE9DSykgeworCQkqc3RhdCA9IDA7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIElmIHRoZSBjdXJzb3IgZW50cnkgaXMgdGhlIG9uZSB0aGF0IHdvdWxkIGJlIG1vdmVkLCBkb24ndAorCSAqIGRvIGl0Li4uIGl0J3MgdG9vIGNvbXBsaWNhdGVkLgorCSAqLworCWlmIChjdXItPmJjX3B0cnNbbGV2ZWxdID49IElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkgeworCQkqc3RhdCA9IDA7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIFNldCB1cCB0aGUgcmlnaHQgbmVpZ2hib3IgYXMgInJpZ2h0Ii4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmcyhjdXItPmJjX21wLCBjdXItPmJjX3RwLAorCQkJY3VyLT5iY19wcml2YXRlLmEuYWdubywgSU5UX0dFVChsZWZ0LT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSwgMCwgJnJicCwKKwkJCVhGU19BTExPQ19CVFJFRV9SRUYpKSkKKwkJcmV0dXJuIGVycm9yOworCXJpZ2h0ID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhyYnApOworCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgcmlnaHQsIGxldmVsLCByYnApKSkKKwkJcmV0dXJuIGVycm9yOworCS8qCisJICogSWYgaXQncyBmdWxsLCBpdCBjYW4ndCB0YWtlIGFub3RoZXIgZW50cnkuCisJICovCisJaWYgKElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0FMTE9DX0JMT0NLX01BWFJFQ1MobGV2ZWwsIGN1cikpIHsKKwkJKnN0YXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBNYWtlIGEgaG9sZSBhdCB0aGUgc3RhcnQgb2YgdGhlIHJpZ2h0IG5laWdoYm9yIGJsb2NrLCB0aGVuCisJICogY29weSB0aGUgbGFzdCBsZWZ0IGJsb2NrIGVudHJ5IHRvIHRoZSBob2xlLgorCSAqLworCWlmIChsZXZlbCA+IDApIHsKKwkJeGZzX2FsbG9jX2tleV90CSpsa3A7CS8qIGtleSBwb2ludGVyIGZvciBsZWZ0IGJsb2NrICovCisJCXhmc19hbGxvY19wdHJfdAkqbHBwOwkvKiBhZGRyZXNzIHBvaW50ZXIgZm9yIGxlZnQgYmxvY2sgKi8KKwkJeGZzX2FsbG9jX3B0cl90CSpycHA7CS8qIGFkZHJlc3MgcG9pbnRlciBmb3IgcmlnaHQgYmxvY2sgKi8KKworCQlsa3AgPSBYRlNfQUxMT0NfS0VZX0FERFIobGVmdCwgSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpLCBjdXIpOworCQlscHAgPSBYRlNfQUxMT0NfUFRSX0FERFIobGVmdCwgSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpLCBjdXIpOworCQlya3AgPSBYRlNfQUxMT0NfS0VZX0FERFIocmlnaHQsIDEsIGN1cik7CisJCXJwcCA9IFhGU19BTExPQ19QVFJfQUREUihyaWdodCwgMSwgY3VyKTsKKyNpZmRlZiBERUJVRworCQlmb3IgKGkgPSBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsIElOVF9HRVQocnBwW2ldLCBBUkNIX0NPTlZFUlQpLCBsZXZlbCkpKQorCQkJCXJldHVybiBlcnJvcjsKKwkJfQorI2VuZGlmCisJCW1lbW1vdmUocmtwICsgMSwgcmtwLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpya3ApKTsKKwkJbWVtbW92ZShycHAgKyAxLCBycHAsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKiBzaXplb2YoKnJwcCkpOworI2lmZGVmIERFQlVHCisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsIElOVF9HRVQoKmxwcCwgQVJDSF9DT05WRVJUKSwgbGV2ZWwpKSkKKwkJCXJldHVybiBlcnJvcjsKKyNlbmRpZgorCQkqcmtwID0gKmxrcDsgLyogSU5UXzogY29weSAqLworCQkqcnBwID0gKmxwcDsgLyogSU5UXzogY29weSAqLworCQl4ZnNfYWxsb2NfbG9nX2tleXMoY3VyLCByYnAsIDEsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKyAxKTsKKwkJeGZzX2FsbG9jX2xvZ19wdHJzKGN1ciwgcmJwLCAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICsgMSk7CisJCXhmc19idHJlZV9jaGVja19rZXkoY3VyLT5iY19idG51bSwgcmtwLCBya3AgKyAxKTsKKwl9IGVsc2UgeworCQl4ZnNfYWxsb2NfcmVjX3QJKmxycDsJLyogcmVjb3JkIHBvaW50ZXIgZm9yIGxlZnQgYmxvY2sgKi8KKwkJeGZzX2FsbG9jX3JlY190CSpycnA7CS8qIHJlY29yZCBwb2ludGVyIGZvciByaWdodCBibG9jayAqLworCisJCWxycCA9IFhGU19BTExPQ19SRUNfQUREUihsZWZ0LCBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCksIGN1cik7CisJCXJycCA9IFhGU19BTExPQ19SRUNfQUREUihyaWdodCwgMSwgY3VyKTsKKwkJbWVtbW92ZShycnAgKyAxLCBycnAsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKiBzaXplb2YoKnJycCkpOworCQkqcnJwID0gKmxycDsKKwkJeGZzX2FsbG9jX2xvZ19yZWNzKGN1ciwgcmJwLCAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICsgMSk7CisJCWtleS5hcl9zdGFydGJsb2NrID0gcnJwLT5hcl9zdGFydGJsb2NrOyAvKiBJTlRfOiBkaXJlY3QgY29weSAqLworCQlrZXkuYXJfYmxvY2tjb3VudCA9IHJycC0+YXJfYmxvY2tjb3VudDsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KKwkJcmtwID0gJmtleTsKKwkJeGZzX2J0cmVlX2NoZWNrX3JlYyhjdXItPmJjX2J0bnVtLCBycnAsIHJycCArIDEpOworCX0KKwkvKgorCSAqIERlY3JlbWVudCBhbmQgbG9nIGxlZnQncyBudW1yZWNzLCBidW1wIGFuZCBsb2cgcmlnaHQncyBudW1yZWNzLgorCSAqLworCUlOVF9NT0QobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCAtMSk7CisJeGZzX2FsbG9jX2xvZ19ibG9jayhjdXItPmJjX3RwLCBsYnAsIFhGU19CQl9OVU1SRUNTKTsKKwlJTlRfTU9EKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsICsxKTsKKwl4ZnNfYWxsb2NfbG9nX2Jsb2NrKGN1ci0+YmNfdHAsIHJicCwgWEZTX0JCX05VTVJFQ1MpOworCS8qCisJICogVXNpbmcgYSB0ZW1wb3JhcnkgY3Vyc29yLCB1cGRhdGUgdGhlIHBhcmVudCBrZXkgdmFsdWVzIG9mIHRoZQorCSAqIGJsb2NrIG9uIHRoZSByaWdodC4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX2R1cF9jdXJzb3IoY3VyLCAmdGN1cikpKQorCQlyZXR1cm4gZXJyb3I7CisJaSA9IHhmc19idHJlZV9sYXN0cmVjKHRjdXIsIGxldmVsKTsKKwlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJaWYgKChlcnJvciA9IHhmc19hbGxvY19pbmNyZW1lbnQodGN1ciwgbGV2ZWwsICZpKSkgfHwKKwkgICAgKGVycm9yID0geGZzX2FsbG9jX3VwZGtleSh0Y3VyLCBya3AsIGxldmVsICsgMSkpKQorCQlnb3RvIGVycm9yMDsKKwl4ZnNfYnRyZWVfZGVsX2N1cnNvcih0Y3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CisJKnN0YXQgPSAxOworCXJldHVybiAwOworZXJyb3IwOgorCXhmc19idHJlZV9kZWxfY3Vyc29yKHRjdXIsIFhGU19CVFJFRV9FUlJPUik7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogU3BsaXQgY3VyL2xldmVsIGJsb2NrIGluIGhhbGYuCisgKiBSZXR1cm4gbmV3IGJsb2NrIG51bWJlciBhbmQgaXRzIGZpcnN0IHJlY29yZCAodG8gYmUgaW5zZXJ0ZWQgaW50byBwYXJlbnQpLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfYWxsb2Nfc3BsaXQoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCQlsZXZlbCwJLyogbGV2ZWwgdG8gc3BsaXQgKi8KKwl4ZnNfYWdibG9ja190CQkqYm5vcCwJLyogb3V0cHV0OiBibG9jayBudW1iZXIgYWxsb2NhdGVkICovCisJeGZzX2FsbG9jX2tleV90CQkqa2V5cCwJLyogb3V0cHV0OiBmaXJzdCBrZXkgb2YgbmV3IGJsb2NrICovCisJeGZzX2J0cmVlX2N1cl90CQkqKmN1cnAsCS8qIG91dHB1dDogbmV3IGN1cnNvciAqLworCWludAkJCSpzdGF0KQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK3sKKwlpbnQJCQllcnJvcjsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJaW50CQkJaTsJLyogbG9vcCBpbmRleC9yZWNvcmQgbnVtYmVyICovCisJeGZzX2FnYmxvY2tfdAkJbGJubzsJLyogbGVmdCAoY3VycmVudCkgYmxvY2sgbnVtYmVyICovCisJeGZzX2J1Zl90CQkqbGJwOwkvKiBidWZmZXIgZm9yIGxlZnQgYmxvY2sgKi8KKwl4ZnNfYWxsb2NfYmxvY2tfdAkqbGVmdDsJLyogbGVmdCAoY3VycmVudCkgYnRyZWUgYmxvY2sgKi8KKwl4ZnNfYWdibG9ja190CQlyYm5vOwkvKiByaWdodCAobmV3KSBibG9jayBudW1iZXIgKi8KKwl4ZnNfYnVmX3QJCSpyYnA7CS8qIGJ1ZmZlciBmb3IgcmlnaHQgYmxvY2sgKi8KKwl4ZnNfYWxsb2NfYmxvY2tfdAkqcmlnaHQ7CS8qIHJpZ2h0IChuZXcpIGJ0cmVlIGJsb2NrICovCisKKwkvKgorCSAqIEFsbG9jYXRlIHRoZSBuZXcgYmxvY2sgZnJvbSB0aGUgZnJlZWxpc3QuCisJICogSWYgd2UgY2FuJ3QgZG8gaXQsIHdlJ3JlIHRvYXN0LiAgR2l2ZSB1cC4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2FsbG9jX2dldF9mcmVlbGlzdChjdXItPmJjX3RwLCBjdXItPmJjX3ByaXZhdGUuYS5hZ2JwLAorCQkJJnJibm8pKSkKKwkJcmV0dXJuIGVycm9yOworCWlmIChyYm5vID09IE5VTExBR0JMT0NLKSB7CisJCSpzdGF0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCXhmc190cmFuc19hZ2J0cmVlX2RlbHRhKGN1ci0+YmNfdHAsIDEpOworCXJicCA9IHhmc19idHJlZV9nZXRfYnVmcyhjdXItPmJjX21wLCBjdXItPmJjX3RwLCBjdXItPmJjX3ByaXZhdGUuYS5hZ25vLAorCQlyYm5vLCAwKTsKKwkvKgorCSAqIFNldCB1cCB0aGUgbmV3IGJsb2NrIGFzICJyaWdodCIuCisJICovCisJcmlnaHQgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKHJicCk7CisJLyoKKwkgKiAiTGVmdCIgaXMgdGhlIGN1cnJlbnQgKGFjY29yZGluZyB0byB0aGUgY3Vyc29yKSBibG9jay4KKwkgKi8KKwlsYnAgPSBjdXItPmJjX2J1ZnNbbGV2ZWxdOworCWxlZnQgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKGxicCk7CisjaWZkZWYgREVCVUcKKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGxlZnQsIGxldmVsLCBsYnApKSkKKwkJcmV0dXJuIGVycm9yOworI2VuZGlmCisJLyoKKwkgKiBGaWxsIGluIHRoZSBidHJlZSBoZWFkZXIgZm9yIHRoZSBuZXcgYmxvY2suCisJICovCisJSU5UX1NFVChyaWdodC0+YmJfbWFnaWMsIEFSQ0hfQ09OVkVSVCwgeGZzX21hZ2ljc1tjdXItPmJjX2J0bnVtXSk7CisJcmlnaHQtPmJiX2xldmVsID0gbGVmdC0+YmJfbGV2ZWw7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCisJSU5UX1NFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCAoX191aW50MTZfdCkoSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIC8gMikpOworCS8qCisJICogTWFrZSBzdXJlIHRoYXQgaWYgdGhlcmUncyBhbiBvZGQgbnVtYmVyIG9mIGVudHJpZXMgbm93LCB0aGF0CisJICogZWFjaCBuZXcgYmxvY2sgd2lsbCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBlbnRyaWVzLgorCSAqLworCWlmICgoSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICYgMSkgJiYKKwkgICAgY3VyLT5iY19wdHJzW2xldmVsXSA8PSBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICsgMSkKKwkJSU5UX01PRChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCArMSk7CisJaSA9IElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAtIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKyAxOworCS8qCisJICogRm9yIG5vbi1sZWFmIGJsb2NrcywgY29weSBrZXlzIGFuZCBhZGRyZXNzZXMgb3ZlciB0byB0aGUgbmV3IGJsb2NrLgorCSAqLworCWlmIChsZXZlbCA+IDApIHsKKwkJeGZzX2FsbG9jX2tleV90CSpsa3A7CS8qIGxlZnQgYnRyZWUga2V5IHBvaW50ZXIgKi8KKwkJeGZzX2FsbG9jX3B0cl90CSpscHA7CS8qIGxlZnQgYnRyZWUgYWRkcmVzcyBwb2ludGVyICovCisJCXhmc19hbGxvY19rZXlfdAkqcmtwOwkvKiByaWdodCBidHJlZSBrZXkgcG9pbnRlciAqLworCQl4ZnNfYWxsb2NfcHRyX3QJKnJwcDsJLyogcmlnaHQgYnRyZWUgYWRkcmVzcyBwb2ludGVyICovCisKKwkJbGtwID0gWEZTX0FMTE9DX0tFWV9BRERSKGxlZnQsIGksIGN1cik7CisJCWxwcCA9IFhGU19BTExPQ19QVFJfQUREUihsZWZ0LCBpLCBjdXIpOworCQlya3AgPSBYRlNfQUxMT0NfS0VZX0FERFIocmlnaHQsIDEsIGN1cik7CisJCXJwcCA9IFhGU19BTExPQ19QVFJfQUREUihyaWdodCwgMSwgY3VyKTsKKyNpZmRlZiBERUJVRworCQlmb3IgKGkgPSAwOyBpIDwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsgaSsrKSB7CisJCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NwdHIoY3VyLCBJTlRfR0VUKGxwcFtpXSwgQVJDSF9DT05WRVJUKSwgbGV2ZWwpKSkKKwkJCQlyZXR1cm4gZXJyb3I7CisJCX0KKyNlbmRpZgorCQltZW1jcHkocmtwLCBsa3AsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKiBzaXplb2YoKnJrcCkpOyAvKiBJTlRfOiBjb3B5ICovCisJCW1lbWNweShycHAsIGxwcCwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAqIHNpemVvZigqcnBwKSk7IC8qIElOVF86IGNvcHkgKi8KKwkJeGZzX2FsbG9jX2xvZ19rZXlzKGN1ciwgcmJwLCAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKTsKKwkJeGZzX2FsbG9jX2xvZ19wdHJzKGN1ciwgcmJwLCAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKTsKKwkJKmtleXAgPSAqcmtwOworCX0KKwkvKgorCSAqIEZvciBsZWFmIGJsb2NrcywgY29weSByZWNvcmRzIG92ZXIgdG8gdGhlIG5ldyBibG9jay4KKwkgKi8KKwllbHNlIHsKKwkJeGZzX2FsbG9jX3JlY190CSpscnA7CS8qIGxlZnQgYnRyZWUgcmVjb3JkIHBvaW50ZXIgKi8KKwkJeGZzX2FsbG9jX3JlY190CSpycnA7CS8qIHJpZ2h0IGJ0cmVlIHJlY29yZCBwb2ludGVyICovCisKKwkJbHJwID0gWEZTX0FMTE9DX1JFQ19BRERSKGxlZnQsIGksIGN1cik7CisJCXJycCA9IFhGU19BTExPQ19SRUNfQUREUihyaWdodCwgMSwgY3VyKTsKKwkJbWVtY3B5KHJycCwgbHJwLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpycnApKTsKKwkJeGZzX2FsbG9jX2xvZ19yZWNzKGN1ciwgcmJwLCAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKTsKKwkJa2V5cC0+YXJfc3RhcnRibG9jayA9IHJycC0+YXJfc3RhcnRibG9jazsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KKwkJa2V5cC0+YXJfYmxvY2tjb3VudCA9IHJycC0+YXJfYmxvY2tjb3VudDsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KKwl9CisJLyoKKwkgKiBGaW5kIHRoZSBsZWZ0IGJsb2NrIG51bWJlciBieSBsb29raW5nIGluIHRoZSBidWZmZXIuCisJICogQWRqdXN0IG51bXJlY3MsIHNpYmxpbmcgcG9pbnRlcnMuCisJICovCisJbGJubyA9IFhGU19EQUREUl9UT19BR0JOTyhjdXItPmJjX21wLCBYRlNfQlVGX0FERFIobGJwKSk7CisJSU5UX01PRChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIC0oSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkpOworCXJpZ2h0LT5iYl9yaWdodHNpYiA9IGxlZnQtPmJiX3JpZ2h0c2liOyAvKiBJTlRfOiBkaXJlY3QgY29weSAqLworCUlOVF9TRVQobGVmdC0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCwgcmJubyk7CisJSU5UX1NFVChyaWdodC0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJULCBsYm5vKTsKKwl4ZnNfYWxsb2NfbG9nX2Jsb2NrKGN1ci0+YmNfdHAsIHJicCwgWEZTX0JCX0FMTF9CSVRTKTsKKwl4ZnNfYWxsb2NfbG9nX2Jsb2NrKGN1ci0+YmNfdHAsIGxicCwgWEZTX0JCX05VTVJFQ1MgfCBYRlNfQkJfUklHSFRTSUIpOworCS8qCisJICogSWYgdGhlcmUncyBhIGJsb2NrIHRvIHRoZSBuZXcgYmxvY2sncyByaWdodCwgbWFrZSB0aGF0IGJsb2NrCisJICogcG9pbnQgYmFjayB0byByaWdodCBpbnN0ZWFkIG9mIHRvIGxlZnQuCisJICovCisJaWYgKElOVF9HRVQocmlnaHQtPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpICE9IE5VTExBR0JMT0NLKSB7CisJCXhmc19hbGxvY19ibG9ja190CSpycmJsb2NrOwkvKiByciBidHJlZSBibG9jayAqLworCQl4ZnNfYnVmX3QJCSpycmJwOwkJLyogYnVmZmVyIGZvciBycmJsb2NrICovCisKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZnMoY3VyLT5iY19tcCwgY3VyLT5iY190cCwKKwkJCQljdXItPmJjX3ByaXZhdGUuYS5hZ25vLCBJTlRfR0VUKHJpZ2h0LT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSwgMCwKKwkJCQkmcnJicCwgWEZTX0FMTE9DX0JUUkVFX1JFRikpKQorCQkJcmV0dXJuIGVycm9yOworCQlycmJsb2NrID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhycmJwKTsKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBycmJsb2NrLCBsZXZlbCwgcnJicCkpKQorCQkJcmV0dXJuIGVycm9yOworCQlJTlRfU0VUKHJyYmxvY2stPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCwgcmJubyk7CisJCXhmc19hbGxvY19sb2dfYmxvY2soY3VyLT5iY190cCwgcnJicCwgWEZTX0JCX0xFRlRTSUIpOworCX0KKwkvKgorCSAqIElmIHRoZSBjdXJzb3IgaXMgcmVhbGx5IGluIHRoZSByaWdodCBibG9jaywgbW92ZSBpdCB0aGVyZS4KKwkgKiBJZiBpdCdzIGp1c3QgcG9pbnRpbmcgcGFzdCB0aGUgbGFzdCBlbnRyeSBpbiBsZWZ0LCB0aGVuIHdlJ2xsCisJICogaW5zZXJ0IHRoZXJlLCBzbyBkb24ndCBjaGFuZ2UgYW55dGhpbmcgaW4gdGhhdCBjYXNlLgorCSAqLworCWlmIChjdXItPmJjX3B0cnNbbGV2ZWxdID4gSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICsgMSkgeworCQl4ZnNfYnRyZWVfc2V0YnVmKGN1ciwgbGV2ZWwsIHJicCk7CisJCWN1ci0+YmNfcHRyc1tsZXZlbF0gLT0gSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOworCX0KKwkvKgorCSAqIElmIHRoZXJlIGFyZSBtb3JlIGxldmVscywgd2UnbGwgbmVlZCBhbm90aGVyIGN1cnNvciB3aGljaCByZWZlcnMgdG8KKwkgKiB0aGUgcmlnaHQgYmxvY2ssIG5vIG1hdHRlciB3aGVyZSB0aGlzIGN1cnNvciB3YXMuCisJICovCisJaWYgKGxldmVsICsgMSA8IGN1ci0+YmNfbmxldmVscykgeworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2R1cF9jdXJzb3IoY3VyLCBjdXJwKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCSgqY3VycCktPmJjX3B0cnNbbGV2ZWwgKyAxXSsrOworCX0KKwkqYm5vcCA9IHJibm87CisJKnN0YXQgPSAxOworCXJldHVybiAwOworfQorCisvKgorICogVXBkYXRlIGtleXMgYXQgYWxsIGxldmVscyBmcm9tIGhlcmUgdG8gdGhlIHJvb3QgYWxvbmcgdGhlIGN1cnNvcidzIHBhdGguCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19hbGxvY191cGRrZXkoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfYWxsb2Nfa2V5X3QJCSprZXlwLAkvKiBuZXcga2V5IHZhbHVlIHRvIHVwZGF0ZSB0byAqLworCWludAkJCWxldmVsKQkvKiBzdGFydGluZyBsZXZlbCBmb3IgdXBkYXRlICovCit7CisJaW50CQkJcHRyOwkvKiBpbmRleCBvZiBrZXkgaW4gYmxvY2sgKi8KKworCS8qCisJICogR28gdXAgdGhlIHRyZWUgZnJvbSB0aGlzIGxldmVsIHRvd2FyZCB0aGUgcm9vdC4KKwkgKiBBdCBlYWNoIGxldmVsLCB1cGRhdGUgdGhlIGtleSB2YWx1ZSB0byB0aGUgdmFsdWUgaW5wdXQuCisJICogU3RvcCB3aGVuIHdlIHJlYWNoIGEgbGV2ZWwgd2hlcmUgdGhlIGN1cnNvciBpc24ndCBwb2ludGluZworCSAqIGF0IHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgYmxvY2suCisJICovCisJZm9yIChwdHIgPSAxOyBwdHIgPT0gMSAmJiBsZXZlbCA8IGN1ci0+YmNfbmxldmVsczsgbGV2ZWwrKykgeworCQl4ZnNfYWxsb2NfYmxvY2tfdAkqYmxvY2s7CS8qIGJ0cmVlIGJsb2NrICovCisJCXhmc19idWZfdAkJKmJwOwkvKiBidWZmZXIgZm9yIGJsb2NrICovCisjaWZkZWYgREVCVUcKKwkJaW50CQkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworI2VuZGlmCisJCXhmc19hbGxvY19rZXlfdAkJKmtwOwkvKiBwdHIgdG8gYnRyZWUgYmxvY2sga2V5cyAqLworCisJCWJwID0gY3VyLT5iY19idWZzW2xldmVsXTsKKwkJYmxvY2sgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKGJwKTsKKyNpZmRlZiBERUJVRworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGJsb2NrLCBsZXZlbCwgYnApKSkKKwkJCXJldHVybiBlcnJvcjsKKyNlbmRpZgorCQlwdHIgPSBjdXItPmJjX3B0cnNbbGV2ZWxdOworCQlrcCA9IFhGU19BTExPQ19LRVlfQUREUihibG9jaywgcHRyLCBjdXIpOworCQkqa3AgPSAqa2V5cDsKKwkJeGZzX2FsbG9jX2xvZ19rZXlzKGN1ciwgYnAsIHB0ciwgcHRyKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBFeHRlcm5hbGx5IHZpc2libGUgcm91dGluZXMuCisgKi8KKworLyoKKyAqIERlY3JlbWVudCBjdXJzb3IgYnkgb25lIHJlY29yZCBhdCB0aGUgbGV2ZWwuCisgKiBGb3Igbm9uemVybyBsZXZlbHMgdGhlIGxlYWYtd2FyZCBpbmZvcm1hdGlvbiBpcyB1bnRvdWNoZWQuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19hbGxvY19kZWNyZW1lbnQoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCQlsZXZlbCwJLyogbGV2ZWwgaW4gYnRyZWUsIDAgaXMgbGVhZiAqLworCWludAkJCSpzdGF0KQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK3sKKwl4ZnNfYWxsb2NfYmxvY2tfdAkqYmxvY2s7CS8qIGJ0cmVlIGJsb2NrICovCisJaW50CQkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCWludAkJCWxldjsJLyogYnRyZWUgbGV2ZWwgKi8KKworCUFTU0VSVChsZXZlbCA8IGN1ci0+YmNfbmxldmVscyk7CisJLyoKKwkgKiBSZWFkLWFoZWFkIHRvIHRoZSBsZWZ0IGF0IHRoaXMgbGV2ZWwuCisJICovCisJeGZzX2J0cmVlX3JlYWRhaGVhZChjdXIsIGxldmVsLCBYRlNfQlRDVVJfTEVGVFJBKTsKKwkvKgorCSAqIERlY3JlbWVudCB0aGUgcHRyIGF0IHRoaXMgbGV2ZWwuICBJZiB3ZSdyZSBzdGlsbCBpbiB0aGUgYmxvY2sKKwkgKiB0aGVuIHdlJ3JlIGRvbmUuCisJICovCisJaWYgKC0tY3VyLT5iY19wdHJzW2xldmVsXSA+IDApIHsKKwkJKnN0YXQgPSAxOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBHZXQgYSBwb2ludGVyIHRvIHRoZSBidHJlZSBibG9jay4KKwkgKi8KKwlibG9jayA9IFhGU19CVUZfVE9fQUxMT0NfQkxPQ0soY3VyLT5iY19idWZzW2xldmVsXSk7CisjaWZkZWYgREVCVUcKKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGJsb2NrLCBsZXZlbCwKKwkJCWN1ci0+YmNfYnVmc1tsZXZlbF0pKSkKKwkJcmV0dXJuIGVycm9yOworI2VuZGlmCisJLyoKKwkgKiBJZiB3ZSBqdXN0IHdlbnQgb2ZmIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIHRyZWUsIHJldHVybiBmYWlsdXJlLgorCSAqLworCWlmIChJTlRfR0VUKGJsb2NrLT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQpID09IE5VTExBR0JMT0NLKSB7CisJCSpzdGF0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogTWFyY2ggdXAgdGhlIHRyZWUgZGVjcmVtZW50aW5nIHBvaW50ZXJzLgorCSAqIFN0b3Agd2hlbiB3ZSBkb24ndCBnbyBvZmYgdGhlIGxlZnQgZWRnZSBvZiBhIGJsb2NrLgorCSAqLworCWZvciAobGV2ID0gbGV2ZWwgKyAxOyBsZXYgPCBjdXItPmJjX25sZXZlbHM7IGxldisrKSB7CisJCWlmICgtLWN1ci0+YmNfcHRyc1tsZXZdID4gMCkKKwkJCWJyZWFrOworCQkvKgorCQkgKiBSZWFkLWFoZWFkIHRoZSBsZWZ0IGJsb2NrLCB3ZSdyZSBnb2luZyB0byByZWFkIGl0CisJCSAqIGluIHRoZSBuZXh0IGxvb3AuCisJCSAqLworCQl4ZnNfYnRyZWVfcmVhZGFoZWFkKGN1ciwgbGV2LCBYRlNfQlRDVVJfTEVGVFJBKTsKKwl9CisJLyoKKwkgKiBJZiB3ZSB3ZW50IG9mZiB0aGUgcm9vdCB0aGVuIHdlIGFyZSBzZXJpb3VzbHkgY29uZnVzZWQuCisJICovCisJQVNTRVJUKGxldiA8IGN1ci0+YmNfbmxldmVscyk7CisJLyoKKwkgKiBOb3cgd2FsayBiYWNrIGRvd24gdGhlIHRyZWUsIGZpeGluZyB1cCB0aGUgY3Vyc29yJ3MgYnVmZmVyCisJICogcG9pbnRlcnMgYW5kIGtleSBudW1iZXJzLgorCSAqLworCWZvciAoYmxvY2sgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKGN1ci0+YmNfYnVmc1tsZXZdKTsgbGV2ID4gbGV2ZWw7ICkgeworCQl4ZnNfYWdibG9ja190CWFnYm5vOwkvKiBibG9jayBudW1iZXIgb2YgYnRyZWUgYmxvY2sgKi8KKwkJeGZzX2J1Zl90CSpicDsJLyogYnVmZmVyIHBvaW50ZXIgZm9yIGJsb2NrICovCisKKwkJYWdibm8gPSBJTlRfR0VUKCpYRlNfQUxMT0NfUFRSX0FERFIoYmxvY2ssIGN1ci0+YmNfcHRyc1tsZXZdLCBjdXIpLCBBUkNIX0NPTlZFUlQpOworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmcyhjdXItPmJjX21wLCBjdXItPmJjX3RwLAorCQkJCWN1ci0+YmNfcHJpdmF0ZS5hLmFnbm8sIGFnYm5vLCAwLCAmYnAsCisJCQkJWEZTX0FMTE9DX0JUUkVFX1JFRikpKQorCQkJcmV0dXJuIGVycm9yOworCQlsZXYtLTsKKwkJeGZzX2J0cmVlX3NldGJ1ZihjdXIsIGxldiwgYnApOworCQlibG9jayA9IFhGU19CVUZfVE9fQUxMT0NfQkxPQ0soYnApOworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGJsb2NrLCBsZXYsIGJwKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCWN1ci0+YmNfcHRyc1tsZXZdID0gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKKwl9CisJKnN0YXQgPSAxOworCXJldHVybiAwOworfQorCisvKgorICogRGVsZXRlIHRoZSByZWNvcmQgcG9pbnRlZCB0byBieSBjdXIuCisgKiBUaGUgY3Vyc29yIHJlZmVycyB0byB0aGUgcGxhY2Ugd2hlcmUgdGhlIHJlY29yZCB3YXMgKGNvdWxkIGJlIGluc2VydGVkKQorICogd2hlbiB0aGUgb3BlcmF0aW9uIHJldHVybnMuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19hbGxvY19kZWxldGUoCisJeGZzX2J0cmVlX2N1cl90CSpjdXIsCQkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCSpzdGF0KQkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJaW50CQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCWludAkJaTsJCS8qIHJlc3VsdCBjb2RlICovCisJaW50CQlsZXZlbDsJCS8qIGJ0cmVlIGxldmVsICovCisKKwkvKgorCSAqIEdvIHVwIHRoZSB0cmVlLCBzdGFydGluZyBhdCBsZWFmIGxldmVsLgorCSAqIElmIDIgaXMgcmV0dXJuZWQgdGhlbiBhIGpvaW4gd2FzIGRvbmU7IGdvIHRvIHRoZSBuZXh0IGxldmVsLgorCSAqIE90aGVyd2lzZSB3ZSBhcmUgZG9uZS4KKwkgKi8KKwlmb3IgKGxldmVsID0gMCwgaSA9IDI7IGkgPT0gMjsgbGV2ZWwrKykgeworCQlpZiAoKGVycm9yID0geGZzX2FsbG9jX2RlbHJlYyhjdXIsIGxldmVsLCAmaSkpKQorCQkJcmV0dXJuIGVycm9yOworCX0KKwlpZiAoaSA9PSAwKSB7CisJCWZvciAobGV2ZWwgPSAxOyBsZXZlbCA8IGN1ci0+YmNfbmxldmVsczsgbGV2ZWwrKykgeworCQkJaWYgKGN1ci0+YmNfcHRyc1tsZXZlbF0gPT0gMCkgeworCQkJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfZGVjcmVtZW50KGN1ciwgbGV2ZWwsICZpKSkpCisJCQkJCXJldHVybiBlcnJvcjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwkqc3RhdCA9IGk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBHZXQgdGhlIGRhdGEgZnJvbSB0aGUgcG9pbnRlZC10byByZWNvcmQuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19hbGxvY19nZXRfcmVjKAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2FnYmxvY2tfdAkJKmJubywJLyogb3V0cHV0OiBzdGFydGluZyBibG9jayBvZiBleHRlbnQgKi8KKwl4ZnNfZXh0bGVuX3QJCSpsZW4sCS8qIG91dHB1dDogbGVuZ3RoIG9mIGV4dGVudCAqLworCWludAkJCSpzdGF0KQkvKiBvdXRwdXQ6IHN1Y2Nlc3MvZmFpbHVyZSAqLworeworCXhmc19hbGxvY19ibG9ja190CSpibG9jazsJLyogYnRyZWUgYmxvY2sgKi8KKyNpZmRlZiBERUJVRworCWludAkJCWVycm9yOwkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKyNlbmRpZgorCWludAkJCXB0cjsJLyogcmVjb3JkIG51bWJlciAqLworCisJcHRyID0gY3VyLT5iY19wdHJzWzBdOworCWJsb2NrID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhjdXItPmJjX2J1ZnNbMF0pOworI2lmZGVmIERFQlVHCisJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBibG9jaywgMCwgY3VyLT5iY19idWZzWzBdKSkpCisJCXJldHVybiBlcnJvcjsKKyNlbmRpZgorCS8qCisJICogT2ZmIHRoZSByaWdodCBlbmQgb3IgbGVmdCBlbmQsIHJldHVybiBmYWlsdXJlLgorCSAqLworCWlmIChwdHIgPiBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIHx8IHB0ciA8PSAwKSB7CisJCSpzdGF0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogUG9pbnQgdG8gdGhlIHJlY29yZCBhbmQgZXh0cmFjdCBpdHMgZGF0YS4KKwkgKi8KKwl7CisJCXhmc19hbGxvY19yZWNfdAkJKnJlYzsJLyogcmVjb3JkIGRhdGEgKi8KKworCQlyZWMgPSBYRlNfQUxMT0NfUkVDX0FERFIoYmxvY2ssIHB0ciwgY3VyKTsKKwkJKmJubyA9IElOVF9HRVQocmVjLT5hcl9zdGFydGJsb2NrLCBBUkNIX0NPTlZFUlQpOworCQkqbGVuID0gSU5UX0dFVChyZWMtPmFyX2Jsb2NrY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJfQorCSpzdGF0ID0gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEluY3JlbWVudCBjdXJzb3IgYnkgb25lIHJlY29yZCBhdCB0aGUgbGV2ZWwuCisgKiBGb3Igbm9uemVybyBsZXZlbHMgdGhlIGxlYWYtd2FyZCBpbmZvcm1hdGlvbiBpcyB1bnRvdWNoZWQuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19hbGxvY19pbmNyZW1lbnQoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCQlsZXZlbCwJLyogbGV2ZWwgaW4gYnRyZWUsIDAgaXMgbGVhZiAqLworCWludAkJCSpzdGF0KQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK3sKKwl4ZnNfYWxsb2NfYmxvY2tfdAkqYmxvY2s7CS8qIGJ0cmVlIGJsb2NrICovCisJeGZzX2J1Zl90CQkqYnA7CS8qIHRyZWUgYmxvY2sgYnVmZmVyICovCisJaW50CQkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCWludAkJCWxldjsJLyogYnRyZWUgbGV2ZWwgKi8KKworCUFTU0VSVChsZXZlbCA8IGN1ci0+YmNfbmxldmVscyk7CisJLyoKKwkgKiBSZWFkLWFoZWFkIHRvIHRoZSByaWdodCBhdCB0aGlzIGxldmVsLgorCSAqLworCXhmc19idHJlZV9yZWFkYWhlYWQoY3VyLCBsZXZlbCwgWEZTX0JUQ1VSX1JJR0hUUkEpOworCS8qCisJICogR2V0IGEgcG9pbnRlciB0byB0aGUgYnRyZWUgYmxvY2suCisJICovCisJYnAgPSBjdXItPmJjX2J1ZnNbbGV2ZWxdOworCWJsb2NrID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhicCk7CisjaWZkZWYgREVCVUcKKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGJsb2NrLCBsZXZlbCwgYnApKSkKKwkJcmV0dXJuIGVycm9yOworI2VuZGlmCisJLyoKKwkgKiBJbmNyZW1lbnQgdGhlIHB0ciBhdCB0aGlzIGxldmVsLiAgSWYgd2UncmUgc3RpbGwgaW4gdGhlIGJsb2NrCisJICogdGhlbiB3ZSdyZSBkb25lLgorCSAqLworCWlmICgrK2N1ci0+YmNfcHRyc1tsZXZlbF0gPD0gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkgeworCQkqc3RhdCA9IDE7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIElmIHdlIGp1c3Qgd2VudCBvZmYgdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIHRyZWUsIHJldHVybiBmYWlsdXJlLgorCSAqLworCWlmIChJTlRfR0VUKGJsb2NrLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSA9PSBOVUxMQUdCTE9DSykgeworCQkqc3RhdCA9IDA7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIE1hcmNoIHVwIHRoZSB0cmVlIGluY3JlbWVudGluZyBwb2ludGVycy4KKwkgKiBTdG9wIHdoZW4gd2UgZG9uJ3QgZ28gb2ZmIHRoZSByaWdodCBlZGdlIG9mIGEgYmxvY2suCisJICovCisJZm9yIChsZXYgPSBsZXZlbCArIDE7IGxldiA8IGN1ci0+YmNfbmxldmVsczsgbGV2KyspIHsKKwkJYnAgPSBjdXItPmJjX2J1ZnNbbGV2XTsKKwkJYmxvY2sgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKGJwKTsKKyNpZmRlZiBERUJVRworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGJsb2NrLCBsZXYsIGJwKSkpCisJCQlyZXR1cm4gZXJyb3I7CisjZW5kaWYKKwkJaWYgKCsrY3VyLT5iY19wdHJzW2xldl0gPD0gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkKKwkJCWJyZWFrOworCQkvKgorCQkgKiBSZWFkLWFoZWFkIHRoZSByaWdodCBibG9jaywgd2UncmUgZ29pbmcgdG8gcmVhZCBpdAorCQkgKiBpbiB0aGUgbmV4dCBsb29wLgorCQkgKi8KKwkJeGZzX2J0cmVlX3JlYWRhaGVhZChjdXIsIGxldiwgWEZTX0JUQ1VSX1JJR0hUUkEpOworCX0KKwkvKgorCSAqIElmIHdlIHdlbnQgb2ZmIHRoZSByb290IHRoZW4gd2UgYXJlIHNlcmlvdXNseSBjb25mdXNlZC4KKwkgKi8KKwlBU1NFUlQobGV2IDwgY3VyLT5iY19ubGV2ZWxzKTsKKwkvKgorCSAqIE5vdyB3YWxrIGJhY2sgZG93biB0aGUgdHJlZSwgZml4aW5nIHVwIHRoZSBjdXJzb3IncyBidWZmZXIKKwkgKiBwb2ludGVycyBhbmQga2V5IG51bWJlcnMuCisJICovCisJZm9yIChicCA9IGN1ci0+YmNfYnVmc1tsZXZdLCBibG9jayA9IFhGU19CVUZfVE9fQUxMT0NfQkxPQ0soYnApOworCSAgICAgbGV2ID4gbGV2ZWw7ICkgeworCQl4ZnNfYWdibG9ja190CWFnYm5vOwkvKiBibG9jayBudW1iZXIgb2YgYnRyZWUgYmxvY2sgKi8KKworCQlhZ2JubyA9IElOVF9HRVQoKlhGU19BTExPQ19QVFJfQUREUihibG9jaywgY3VyLT5iY19wdHJzW2xldl0sIGN1ciksIEFSQ0hfQ09OVkVSVCk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZzKGN1ci0+YmNfbXAsIGN1ci0+YmNfdHAsCisJCQkJY3VyLT5iY19wcml2YXRlLmEuYWdubywgYWdibm8sIDAsICZicCwKKwkJCQlYRlNfQUxMT0NfQlRSRUVfUkVGKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCWxldi0tOworCQl4ZnNfYnRyZWVfc2V0YnVmKGN1ciwgbGV2LCBicCk7CisJCWJsb2NrID0gWEZTX0JVRl9UT19BTExPQ19CTE9DSyhicCk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgYmxvY2ssIGxldiwgYnApKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJY3VyLT5iY19wdHJzW2xldl0gPSAxOworCX0KKwkqc3RhdCA9IDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJbnNlcnQgdGhlIGN1cnJlbnQgcmVjb3JkIGF0IHRoZSBwb2ludCByZWZlcmVuY2VkIGJ5IGN1ci4KKyAqIFRoZSBjdXJzb3IgbWF5IGJlIGluY29uc2lzdGVudCBvbiByZXR1cm4gaWYgc3BsaXRzIGhhdmUgYmVlbiBkb25lLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYWxsb2NfaW5zZXJ0KAorCXhmc19idHJlZV9jdXJfdAkqY3VyLAkJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkqc3RhdCkJCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworeworCWludAkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwlpbnQJCWk7CQkvKiByZXN1bHQgdmFsdWUsIDAgZm9yIGZhaWx1cmUgKi8KKwlpbnQJCWxldmVsOwkJLyogY3VycmVudCBsZXZlbCBudW1iZXIgaW4gYnRyZWUgKi8KKwl4ZnNfYWdibG9ja190CW5ibm87CQkvKiBuZXcgYmxvY2sgbnVtYmVyIChzcGxpdCByZXN1bHQpICovCisJeGZzX2J0cmVlX2N1cl90CSpuY3VyOwkJLyogbmV3IGN1cnNvciAoc3BsaXQgcmVzdWx0KSAqLworCXhmc19hbGxvY19yZWNfdAlucmVjOwkJLyogcmVjb3JkIGJlaW5nIGluc2VydGVkIHRoaXMgbGV2ZWwgKi8KKwl4ZnNfYnRyZWVfY3VyX3QJKnBjdXI7CQkvKiBwcmV2aW91cyBsZXZlbCdzIGN1cnNvciAqLworCisJbGV2ZWwgPSAwOworCW5ibm8gPSBOVUxMQUdCTE9DSzsKKwlJTlRfU0VUKG5yZWMuYXJfc3RhcnRibG9jaywgQVJDSF9DT05WRVJULCBjdXItPmJjX3JlYy5hLmFyX3N0YXJ0YmxvY2spOworCUlOVF9TRVQobnJlYy5hcl9ibG9ja2NvdW50LCBBUkNIX0NPTlZFUlQsIGN1ci0+YmNfcmVjLmEuYXJfYmxvY2tjb3VudCk7CisJbmN1ciA9ICh4ZnNfYnRyZWVfY3VyX3QgKikwOworCXBjdXIgPSBjdXI7CisJLyoKKwkgKiBMb29wIGdvaW5nIHVwIHRoZSB0cmVlLCBzdGFydGluZyBhdCB0aGUgbGVhZiBsZXZlbC4KKwkgKiBTdG9wIHdoZW4gd2UgZG9uJ3QgZ2V0IGEgc3BsaXQgYmxvY2ssIHRoYXQgbXVzdCBtZWFuIHRoYXQKKwkgKiB0aGUgaW5zZXJ0IGlzIGZpbmlzaGVkIHdpdGggdGhpcyBsZXZlbC4KKwkgKi8KKwlkbyB7CisJCS8qCisJCSAqIEluc2VydCBucmVjL25ibm8gaW50byB0aGlzIGxldmVsIG9mIHRoZSB0cmVlLgorCQkgKiBOb3RlIGlmIHdlIGZhaWwsIG5ibm8gd2lsbCBiZSBudWxsLgorCQkgKi8KKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY19pbnNyZWMocGN1ciwgbGV2ZWwrKywgJm5ibm8sICZucmVjLCAmbmN1ciwKKwkJCQkmaSkpKSB7CisJCQlpZiAocGN1ciAhPSBjdXIpCisJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IocGN1ciwgWEZTX0JUUkVFX0VSUk9SKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQkvKgorCQkgKiBTZWUgaWYgdGhlIGN1cnNvciB3ZSBqdXN0IHVzZWQgaXMgdHJhc2guCisJCSAqIENhbid0IHRyYXNoIHRoZSBjYWxsZXIncyBjdXJzb3IsIGJ1dCBvdGhlcndpc2Ugd2Ugc2hvdWxkCisJCSAqIGlmIG5jdXIgaXMgYSBuZXcgY3Vyc29yIG9yIHdlJ3JlIGFib3V0IHRvIGJlIGRvbmUuCisJCSAqLworCQlpZiAocGN1ciAhPSBjdXIgJiYgKG5jdXIgfHwgbmJubyA9PSBOVUxMQUdCTE9DSykpIHsKKwkJCWN1ci0+YmNfbmxldmVscyA9IHBjdXItPmJjX25sZXZlbHM7CisJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihwY3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CisJCX0KKwkJLyoKKwkJICogSWYgd2UgZ290IGEgbmV3IGN1cnNvciwgc3dpdGNoIHRvIGl0LgorCQkgKi8KKwkJaWYgKG5jdXIpIHsKKwkJCXBjdXIgPSBuY3VyOworCQkJbmN1ciA9ICh4ZnNfYnRyZWVfY3VyX3QgKikwOworCQl9CisJfSB3aGlsZSAobmJubyAhPSBOVUxMQUdCTE9DSyk7CisJKnN0YXQgPSBpOworCXJldHVybiAwOworfQorCisvKgorICogTG9va3VwIHRoZSByZWNvcmQgZXF1YWwgdG8gW2JubywgbGVuXSBpbiB0aGUgYnRyZWUgZ2l2ZW4gYnkgY3VyLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYWxsb2NfbG9va3VwX2VxKAorCXhmc19idHJlZV9jdXJfdAkqY3VyLAkJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2FnYmxvY2tfdAlibm8sCQkvKiBzdGFydGluZyBibG9jayBvZiBleHRlbnQgKi8KKwl4ZnNfZXh0bGVuX3QJbGVuLAkJLyogbGVuZ3RoIG9mIGV4dGVudCAqLworCWludAkJKnN0YXQpCQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK3sKKwljdXItPmJjX3JlYy5hLmFyX3N0YXJ0YmxvY2sgPSBibm87CisJY3VyLT5iY19yZWMuYS5hcl9ibG9ja2NvdW50ID0gbGVuOworCXJldHVybiB4ZnNfYWxsb2NfbG9va3VwKGN1ciwgWEZTX0xPT0tVUF9FUSwgc3RhdCk7Cit9CisKKy8qCisgKiBMb29rdXAgdGhlIGZpcnN0IHJlY29yZCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gW2JubywgbGVuXQorICogaW4gdGhlIGJ0cmVlIGdpdmVuIGJ5IGN1ci4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2FsbG9jX2xvb2t1cF9nZSgKKwl4ZnNfYnRyZWVfY3VyX3QJKmN1ciwJCS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19hZ2Jsb2NrX3QJYm5vLAkJLyogc3RhcnRpbmcgYmxvY2sgb2YgZXh0ZW50ICovCisJeGZzX2V4dGxlbl90CWxlbiwJCS8qIGxlbmd0aCBvZiBleHRlbnQgKi8KKwlpbnQJCSpzdGF0KQkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJY3VyLT5iY19yZWMuYS5hcl9zdGFydGJsb2NrID0gYm5vOworCWN1ci0+YmNfcmVjLmEuYXJfYmxvY2tjb3VudCA9IGxlbjsKKwlyZXR1cm4geGZzX2FsbG9jX2xvb2t1cChjdXIsIFhGU19MT09LVVBfR0UsIHN0YXQpOworfQorCisvKgorICogTG9va3VwIHRoZSBmaXJzdCByZWNvcmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFtibm8sIGxlbl0KKyAqIGluIHRoZSBidHJlZSBnaXZlbiBieSBjdXIuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19hbGxvY19sb29rdXBfbGUoCisJeGZzX2J0cmVlX2N1cl90CSpjdXIsCQkvKiBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfYWdibG9ja190CWJubywJCS8qIHN0YXJ0aW5nIGJsb2NrIG9mIGV4dGVudCAqLworCXhmc19leHRsZW5fdAlsZW4sCQkvKiBsZW5ndGggb2YgZXh0ZW50ICovCisJaW50CQkqc3RhdCkJCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworeworCWN1ci0+YmNfcmVjLmEuYXJfc3RhcnRibG9jayA9IGJubzsKKwljdXItPmJjX3JlYy5hLmFyX2Jsb2NrY291bnQgPSBsZW47CisJcmV0dXJuIHhmc19hbGxvY19sb29rdXAoY3VyLCBYRlNfTE9PS1VQX0xFLCBzdGF0KTsKK30KKworLyoKKyAqIFVwZGF0ZSB0aGUgcmVjb3JkIHJlZmVycmVkIHRvIGJ5IGN1ciwgdG8gdGhlIHZhbHVlIGdpdmVuIGJ5IFtibm8sIGxlbl0uCisgKiBUaGlzIGVpdGhlciB3b3JrcyAocmV0dXJuIDApIG9yIGdldHMgYW4gRUZTQ09SUlVQVEVEIGVycm9yLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYWxsb2NfdXBkYXRlKAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2FnYmxvY2tfdAkJYm5vLAkvKiBzdGFydGluZyBibG9jayBvZiBleHRlbnQgKi8KKwl4ZnNfZXh0bGVuX3QJCWxlbikJLyogbGVuZ3RoIG9mIGV4dGVudCAqLworeworCXhmc19hbGxvY19ibG9ja190CSpibG9jazsJLyogYnRyZWUgYmxvY2sgdG8gdXBkYXRlICovCisJaW50CQkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCWludAkJCXB0cjsJLyogY3VycmVudCByZWNvcmQgbnVtYmVyICh1cGRhdGluZykgKi8KKworCUFTU0VSVChsZW4gPiAwKTsKKwkvKgorCSAqIFBpY2sgdXAgdGhlIGEuZy4gZnJlZWxpc3Qgc3RydWN0IGFuZCB0aGUgY3VycmVudCBibG9jay4KKwkgKi8KKwlibG9jayA9IFhGU19CVUZfVE9fQUxMT0NfQkxPQ0soY3VyLT5iY19idWZzWzBdKTsKKyNpZmRlZiBERUJVRworCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgYmxvY2ssIDAsIGN1ci0+YmNfYnVmc1swXSkpKQorCQlyZXR1cm4gZXJyb3I7CisjZW5kaWYKKwkvKgorCSAqIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgcmVjIHRvIGJlIHVwZGF0ZWQuCisJICovCisJcHRyID0gY3VyLT5iY19wdHJzWzBdOworCXsKKwkJeGZzX2FsbG9jX3JlY190CQkqcnA7CS8qIHBvaW50ZXIgdG8gdXBkYXRlZCByZWNvcmQgKi8KKworCQlycCA9IFhGU19BTExPQ19SRUNfQUREUihibG9jaywgcHRyLCBjdXIpOworCQkvKgorCQkgKiBGaWxsIGluIHRoZSBuZXcgY29udGVudHMgYW5kIGxvZyB0aGVtLgorCQkgKi8KKwkJSU5UX1NFVChycC0+YXJfc3RhcnRibG9jaywgQVJDSF9DT05WRVJULCBibm8pOworCQlJTlRfU0VUKHJwLT5hcl9ibG9ja2NvdW50LCBBUkNIX0NPTlZFUlQsIGxlbik7CisJCXhmc19hbGxvY19sb2dfcmVjcyhjdXIsIGN1ci0+YmNfYnVmc1swXSwgcHRyLCBwdHIpOworCX0KKwkvKgorCSAqIElmIGl0J3MgdGhlIGJ5LXNpemUgYnRyZWUgYW5kIGl0J3MgdGhlIGxhc3QgbGVhZiBibG9jayBhbmQKKwkgKiBpdCdzIHRoZSBsYXN0IHJlY29yZC4uLiB0aGVuIHVwZGF0ZSB0aGUgc2l6ZSBvZiB0aGUgbG9uZ2VzdAorCSAqIGV4dGVudCBpbiB0aGUgYS5nLiwgd2hpY2ggd2UgY2FjaGUgaW4gdGhlIGEuZy4gZnJlZWxpc3QgaGVhZGVyLgorCSAqLworCWlmIChjdXItPmJjX2J0bnVtID09IFhGU19CVE5VTV9DTlQgJiYKKwkgICAgSU5UX0dFVChibG9jay0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTEFHQkxPQ0sgJiYKKwkgICAgcHRyID09IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJeGZzX2FnZl90CSphZ2Y7CS8qIGEuZy4gZnJlZXNwYWNlIGhlYWRlciAqLworCQl4ZnNfYWdudW1iZXJfdAlzZXFubzsKKworCQlhZ2YgPSBYRlNfQlVGX1RPX0FHRihjdXItPmJjX3ByaXZhdGUuYS5hZ2JwKTsKKwkJc2Vxbm8gPSBJTlRfR0VUKGFnZi0+YWdmX3NlcW5vLCBBUkNIX0NPTlZFUlQpOworCQljdXItPmJjX21wLT5tX3BlcmFnW3NlcW5vXS5wYWdmX2xvbmdlc3QgPSBsZW47CisJCUlOVF9TRVQoYWdmLT5hZ2ZfbG9uZ2VzdCwgQVJDSF9DT05WRVJULCBsZW4pOworCQl4ZnNfYWxsb2NfbG9nX2FnZihjdXItPmJjX3RwLCBjdXItPmJjX3ByaXZhdGUuYS5hZ2JwLAorCQkJWEZTX0FHRl9MT05HRVNUKTsKKwl9CisJLyoKKwkgKiBVcGRhdGluZyBmaXJzdCByZWNvcmQgaW4gbGVhZi4gUGFzcyBuZXcga2V5IHZhbHVlIHVwIHRvIG91ciBwYXJlbnQuCisJICovCisJaWYgKHB0ciA9PSAxKSB7CisJCXhmc19hbGxvY19rZXlfdAlrZXk7CS8qIGtleSBjb250YWluaW5nIFtibm8sIGxlbl0gKi8KKworCQlJTlRfU0VUKGtleS5hcl9zdGFydGJsb2NrLCBBUkNIX0NPTlZFUlQsIGJubyk7CisJCUlOVF9TRVQoa2V5LmFyX2Jsb2NrY291bnQsIEFSQ0hfQ09OVkVSVCwgbGVuKTsKKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY191cGRrZXkoY3VyLCAma2V5LCAxKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hbGxvY19idHJlZS5oIGIvZnMveGZzL3hmc19hbGxvY19idHJlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNTE2MWEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2FsbG9jX2J0cmVlLmgKQEAgLTAsMCArMSwyNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19BTExPQ19CVFJFRV9IX18KKyNkZWZpbmUJX19YRlNfQUxMT0NfQlRSRUVfSF9fCisKKy8qCisgKiBGcmVlc3BhY2Ugb24tZGlzayBzdHJ1Y3R1cmVzCisgKi8KKworc3RydWN0IHhmc19idWY7CitzdHJ1Y3QgeGZzX2J0cmVlX2N1cjsKK3N0cnVjdCB4ZnNfYnRyZWVfc2Jsb2NrOworc3RydWN0IHhmc19tb3VudDsKKworLyoKKyAqIFRoZXJlIGFyZSB0d28gb24tZGlzayBidHJlZXMsIG9uZSBzb3J0ZWQgYnkgYmxvY2tubyBhbmQgb25lIHNvcnRlZAorICogYnkgYmxvY2tjb3VudCBhbmQgYmxvY2tuby4gIEFsbCBibG9ja3MgbG9vayB0aGUgc2FtZSB0byBtYWtlIHRoZSBjb2RlCisgKiBzaW1wbGVyOyBpZiB3ZSBoYXZlIHRpbWUgbGF0ZXIsIHdlJ2xsIG1ha2UgdGhlIG9wdGltaXphdGlvbnMuCisgKi8KKyNkZWZpbmUJWEZTX0FCVEJfTUFHSUMJMHg0MTQyNTQ0MgkvKiAnQUJUQicgZm9yIGJubyB0cmVlICovCisjZGVmaW5lCVhGU19BQlRDX01BR0lDCTB4NDE0MjU0NDMJLyogJ0FCVEMnIGZvciBjbnQgdHJlZSAqLworCisvKgorICogRGF0YSByZWNvcmQva2V5IHN0cnVjdHVyZQorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfYWxsb2NfcmVjCit7CisJeGZzX2FnYmxvY2tfdAlhcl9zdGFydGJsb2NrOwkvKiBzdGFydGluZyBibG9jayBudW1iZXIgKi8KKwl4ZnNfZXh0bGVuX3QJYXJfYmxvY2tjb3VudDsJLyogY291bnQgb2YgZnJlZSBibG9ja3MgKi8KK30geGZzX2FsbG9jX3JlY190LCB4ZnNfYWxsb2Nfa2V5X3Q7CisKK3R5cGVkZWYgeGZzX2FnYmxvY2tfdCB4ZnNfYWxsb2NfcHRyX3Q7CS8qIGJ0cmVlIHBvaW50ZXIgdHlwZSAqLworCQkJCQkvKiBidHJlZSBibG9jayBoZWFkZXIgdHlwZSAqLwordHlwZWRlZglzdHJ1Y3QgeGZzX2J0cmVlX3NibG9jayB4ZnNfYWxsb2NfYmxvY2tfdDsKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQlVGX1RPX0FMTE9DX0JMT0NLKQoreGZzX2FsbG9jX2Jsb2NrX3QgKnhmc19idWZfdG9fYWxsb2NfYmxvY2soc3RydWN0IHhmc19idWYgKmJwKTsKKyNkZWZpbmUJWEZTX0JVRl9UT19BTExPQ19CTE9DSyhicCkJeGZzX2J1Zl90b19hbGxvY19ibG9jayhicCkKKyNlbHNlCisjZGVmaW5lCVhGU19CVUZfVE9fQUxMT0NfQkxPQ0soYnApICgoeGZzX2FsbG9jX2Jsb2NrX3QgKikoWEZTX0JVRl9QVFIoYnApKSkKKyNlbmRpZgorCisvKgorICogUmVhbCBibG9jayBzdHJ1Y3R1cmVzIGhhdmUgYSBzaXplIGVxdWFsIHRvIHRoZSBkaXNrIGJsb2NrIHNpemUuCisgKi8KKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQUxMT0NfQkxPQ0tfU0laRSkKK2ludCB4ZnNfYWxsb2NfYmxvY2tfc2l6ZShpbnQgbGV2LCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyKTsKKyNkZWZpbmUJWEZTX0FMTE9DX0JMT0NLX1NJWkUobGV2LGN1cikJeGZzX2FsbG9jX2Jsb2NrX3NpemUobGV2LGN1cikKKyNlbHNlCisjZGVmaW5lCVhGU19BTExPQ19CTE9DS19TSVpFKGxldixjdXIpCSgxIDw8IChjdXIpLT5iY19ibG9ja2xvZykKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BTExPQ19CTE9DS19NQVhSRUNTKQoraW50IHhmc19hbGxvY19ibG9ja19tYXhyZWNzKGludCBsZXYsIHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIpOworI2RlZmluZQlYRlNfQUxMT0NfQkxPQ0tfTUFYUkVDUyhsZXYsY3VyKQl4ZnNfYWxsb2NfYmxvY2tfbWF4cmVjcyhsZXYsY3VyKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0FMTE9DX0JMT0NLX01BWFJFQ1MobGV2LGN1cikJXAorCSgoY3VyKS0+YmNfbXAtPm1fYWxsb2NfbXhyW2xldiAhPSAwXSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQUxMT0NfQkxPQ0tfTUlOUkVDUykKK2ludCB4ZnNfYWxsb2NfYmxvY2tfbWlucmVjcyhpbnQgbGV2LCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyKTsKKyNkZWZpbmUJWEZTX0FMTE9DX0JMT0NLX01JTlJFQ1MobGV2LGN1cikJeGZzX2FsbG9jX2Jsb2NrX21pbnJlY3MobGV2LGN1cikKKyNlbHNlCisjZGVmaW5lCVhGU19BTExPQ19CTE9DS19NSU5SRUNTKGxldixjdXIpCVwKKwkoKGN1ciktPmJjX21wLT5tX2FsbG9jX21ucltsZXYgIT0gMF0pCisjZW5kaWYKKworLyoKKyAqIE1pbmltdW0gYW5kIG1heGltdW0gYmxvY2tzaXplIGFuZCBzZWN0b3JzaXplLgorICogVGhlIGJsb2Nrc2l6ZSB1cHBlciBsaW1pdCBpcyBwcmV0dHkgbXVjaCBhcmJpdHJhcnkuCisgKiBUaGUgc2VjdG9yc2l6ZSB1cHBlciBsaW1pdCBpcyBkdWUgdG8gc2l6ZW9mKHNiX3NlY3RzaXplKS4KKyAqLworI2RlZmluZSBYRlNfTUlOX0JMT0NLU0laRV9MT0cJOQkvKiBpLmUuIDUxMiBieXRlcyAqLworI2RlZmluZSBYRlNfTUFYX0JMT0NLU0laRV9MT0cJMTYJLyogaS5lLiA2NTUzNiBieXRlcyAqLworI2RlZmluZSBYRlNfTUlOX0JMT0NLU0laRQkoMSA8PCBYRlNfTUlOX0JMT0NLU0laRV9MT0cpCisjZGVmaW5lIFhGU19NQVhfQkxPQ0tTSVpFCSgxIDw8IFhGU19NQVhfQkxPQ0tTSVpFX0xPRykKKyNkZWZpbmUgWEZTX01JTl9TRUNUT1JTSVpFX0xPRwk5CS8qIGkuZS4gNTEyIGJ5dGVzICovCisjZGVmaW5lIFhGU19NQVhfU0VDVE9SU0laRV9MT0cJMTUJLyogaS5lLiAzMjc2OCBieXRlcyAqLworI2RlZmluZSBYRlNfTUlOX1NFQ1RPUlNJWkUJKDEgPDwgWEZTX01JTl9TRUNUT1JTSVpFX0xPRykKKyNkZWZpbmUgWEZTX01BWF9TRUNUT1JTSVpFCSgxIDw8IFhGU19NQVhfU0VDVE9SU0laRV9MT0cpCisKKy8qCisgKiBCbG9jayBudW1iZXJzIGluIHRoZSBBRzoKKyAqIFNCIGlzIHNlY3RvciAwLCBBR0YgaXMgc2VjdG9yIDEsIEFHSSBpcyBzZWN0b3IgMiwgQUdGTCBpcyBzZWN0b3IgMy4KKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQk5PX0JMT0NLKQoreGZzX2FnYmxvY2tfdCB4ZnNfYm5vX2Jsb2NrKHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKKyNkZWZpbmUJWEZTX0JOT19CTE9DSyhtcCkJeGZzX2Jub19ibG9jayhtcCkKKyNlbHNlCisjZGVmaW5lCVhGU19CTk9fQkxPQ0sobXApCSgoeGZzX2FnYmxvY2tfdCkoWEZTX0FHRkxfQkxPQ0sobXApICsgMSkpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0NOVF9CTE9DSykKK3hmc19hZ2Jsb2NrX3QgeGZzX2NudF9ibG9jayhzdHJ1Y3QgeGZzX21vdW50ICptcCk7CisjZGVmaW5lCVhGU19DTlRfQkxPQ0sobXApCXhmc19jbnRfYmxvY2sobXApCisjZWxzZQorI2RlZmluZQlYRlNfQ05UX0JMT0NLKG1wKQkoKHhmc19hZ2Jsb2NrX3QpKFhGU19CTk9fQkxPQ0sobXApICsgMSkpCisjZW5kaWYKKworLyoKKyAqIFJlY29yZCwga2V5LCBhbmQgcG9pbnRlciBhZGRyZXNzIG1hY3JvcyBmb3IgYnRyZWUgYmxvY2tzLgorICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BTExPQ19SRUNfQUREUikKK3hmc19hbGxvY19yZWNfdCAqeGZzX2FsbG9jX3JlY19hZGRyKHhmc19hbGxvY19ibG9ja190ICpiYiwgaW50IGksCisJCQkJICAgIHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIpOworI2RlZmluZQlYRlNfQUxMT0NfUkVDX0FERFIoYmIsaSxjdXIpCXhmc19hbGxvY19yZWNfYWRkcihiYixpLGN1cikKKyNlbHNlCisjZGVmaW5lCVhGU19BTExPQ19SRUNfQUREUihiYixpLGN1cikJXAorCVhGU19CVFJFRV9SRUNfQUREUihYRlNfQUxMT0NfQkxPQ0tfU0laRSgwLGN1ciksIHhmc19hbGxvYywgYmIsIGksIFwKKwkJWEZTX0FMTE9DX0JMT0NLX01BWFJFQ1MoMCwgY3VyKSkKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BTExPQ19LRVlfQUREUikKK3hmc19hbGxvY19rZXlfdCAqeGZzX2FsbG9jX2tleV9hZGRyKHhmc19hbGxvY19ibG9ja190ICpiYiwgaW50IGksCisJCQkJICAgIHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIpOworI2RlZmluZQlYRlNfQUxMT0NfS0VZX0FERFIoYmIsaSxjdXIpCXhmc19hbGxvY19rZXlfYWRkcihiYixpLGN1cikKKyNlbHNlCisjZGVmaW5lCVhGU19BTExPQ19LRVlfQUREUihiYixpLGN1cikJXAorCVhGU19CVFJFRV9LRVlfQUREUihYRlNfQUxMT0NfQkxPQ0tfU0laRSgxLGN1ciksIHhmc19hbGxvYywgYmIsIGksIFwKKwkJWEZTX0FMTE9DX0JMT0NLX01BWFJFQ1MoMSwgY3VyKSkKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BTExPQ19QVFJfQUREUikKK3hmc19hbGxvY19wdHJfdCAqeGZzX2FsbG9jX3B0cl9hZGRyKHhmc19hbGxvY19ibG9ja190ICpiYiwgaW50IGksCisJCQkJICAgIHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIpOworI2RlZmluZQlYRlNfQUxMT0NfUFRSX0FERFIoYmIsaSxjdXIpCXhmc19hbGxvY19wdHJfYWRkcihiYixpLGN1cikKKyNlbHNlCisjZGVmaW5lCVhGU19BTExPQ19QVFJfQUREUihiYixpLGN1cikJXAorCVhGU19CVFJFRV9QVFJfQUREUihYRlNfQUxMT0NfQkxPQ0tfU0laRSgxLGN1ciksIHhmc19hbGxvYywgYmIsIGksIFwKKwkJWEZTX0FMTE9DX0JMT0NLX01BWFJFQ1MoMSwgY3VyKSkKKyNlbmRpZgorCisvKgorICogUHJvdG90eXBlcyBmb3IgZXh0ZXJuYWxseSB2aXNpYmxlIHJvdXRpbmVzLgorICovCisKKy8qCisgKiBEZWNyZW1lbnQgY3Vyc29yIGJ5IG9uZSByZWNvcmQgYXQgdGhlIGxldmVsLgorICogRm9yIG5vbnplcm8gbGV2ZWxzIHRoZSBsZWFmLXdhcmQgaW5mb3JtYXRpb24gaXMgdW50b3VjaGVkLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYWxsb2NfZGVjcmVtZW50KAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJCWxldmVsLAkvKiBsZXZlbCBpbiBidHJlZSwgMCBpcyBsZWFmICovCisJaW50CQkJKnN0YXQpOwkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KKworLyoKKyAqIERlbGV0ZSB0aGUgcmVjb3JkIHBvaW50ZWQgdG8gYnkgY3VyLgorICogVGhlIGN1cnNvciByZWZlcnMgdG8gdGhlIHBsYWNlIHdoZXJlIHRoZSByZWNvcmQgd2FzIChjb3VsZCBiZSBpbnNlcnRlZCkKKyAqIHdoZW4gdGhlIG9wZXJhdGlvbiByZXR1cm5zLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYWxsb2NfZGVsZXRlKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJCSpzdGF0KTsJLyogc3VjY2Vzcy9mYWlsdXJlICovCisKKy8qCisgKiBHZXQgdGhlIGRhdGEgZnJvbSB0aGUgcG9pbnRlZC10byByZWNvcmQuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19hbGxvY19nZXRfcmVjKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19hZ2Jsb2NrX3QJCSpibm8sCS8qIG91dHB1dDogc3RhcnRpbmcgYmxvY2sgb2YgZXh0ZW50ICovCisJeGZzX2V4dGxlbl90CQkqbGVuLAkvKiBvdXRwdXQ6IGxlbmd0aCBvZiBleHRlbnQgKi8KKwlpbnQJCQkqc3RhdCk7CS8qIG91dHB1dDogc3VjY2Vzcy9mYWlsdXJlICovCisKKy8qCisgKiBJbmNyZW1lbnQgY3Vyc29yIGJ5IG9uZSByZWNvcmQgYXQgdGhlIGxldmVsLgorICogRm9yIG5vbnplcm8gbGV2ZWxzIHRoZSBsZWFmLXdhcmQgaW5mb3JtYXRpb24gaXMgdW50b3VjaGVkLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYWxsb2NfaW5jcmVtZW50KAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJCWxldmVsLAkvKiBsZXZlbCBpbiBidHJlZSwgMCBpcyBsZWFmICovCisJaW50CQkJKnN0YXQpOwkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KKworLyoKKyAqIEluc2VydCB0aGUgY3VycmVudCByZWNvcmQgYXQgdGhlIHBvaW50IHJlZmVyZW5jZWQgYnkgY3VyLgorICogVGhlIGN1cnNvciBtYXkgYmUgaW5jb25zaXN0ZW50IG9uIHJldHVybiBpZiBzcGxpdHMgaGF2ZSBiZWVuIGRvbmUuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19hbGxvY19pbnNlcnQoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkJKnN0YXQpOwkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KKworLyoKKyAqIExvb2t1cCB0aGUgcmVjb3JkIGVxdWFsIHRvIFtibm8sIGxlbl0gaW4gdGhlIGJ0cmVlIGdpdmVuIGJ5IGN1ci4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2FsbG9jX2xvb2t1cF9lcSgKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfYWdibG9ja190CQlibm8sCS8qIHN0YXJ0aW5nIGJsb2NrIG9mIGV4dGVudCAqLworCXhmc19leHRsZW5fdAkJbGVuLAkvKiBsZW5ndGggb2YgZXh0ZW50ICovCisJaW50CQkJKnN0YXQpOwkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KKworLyoKKyAqIExvb2t1cCB0aGUgZmlyc3QgcmVjb3JkIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBbYm5vLCBsZW5dCisgKiBpbiB0aGUgYnRyZWUgZ2l2ZW4gYnkgY3VyLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYWxsb2NfbG9va3VwX2dlKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19hZ2Jsb2NrX3QJCWJubywJLyogc3RhcnRpbmcgYmxvY2sgb2YgZXh0ZW50ICovCisJeGZzX2V4dGxlbl90CQlsZW4sCS8qIGxlbmd0aCBvZiBleHRlbnQgKi8KKwlpbnQJCQkqc3RhdCk7CS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworCisvKgorICogTG9va3VwIHRoZSBmaXJzdCByZWNvcmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFtibm8sIGxlbl0KKyAqIGluIHRoZSBidHJlZSBnaXZlbiBieSBjdXIuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19hbGxvY19sb29rdXBfbGUoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2FnYmxvY2tfdAkJYm5vLAkvKiBzdGFydGluZyBibG9jayBvZiBleHRlbnQgKi8KKwl4ZnNfZXh0bGVuX3QJCWxlbiwJLyogbGVuZ3RoIG9mIGV4dGVudCAqLworCWludAkJCSpzdGF0KTsJLyogc3VjY2Vzcy9mYWlsdXJlICovCisKKy8qCisgKiBVcGRhdGUgdGhlIHJlY29yZCByZWZlcnJlZCB0byBieSBjdXIsIHRvIHRoZSB2YWx1ZSBnaXZlbiBieSBbYm5vLCBsZW5dLgorICogVGhpcyBlaXRoZXIgd29ya3MgKHJldHVybiAwKSBvciBnZXRzIGFuIEVGU0NPUlJVUFRFRCBlcnJvci4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2FsbG9jX3VwZGF0ZSgKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfYWdibG9ja190CQlibm8sCS8qIHN0YXJ0aW5nIGJsb2NrIG9mIGV4dGVudCAqLworCXhmc19leHRsZW5fdAkJbGVuKTsJLyogbGVuZ3RoIG9mIGV4dGVudCAqLworCisjZW5kaWYJLyogX19YRlNfQUxMT0NfQlRSRUVfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2FyY2guaCBiL2ZzL3hmcy94ZnNfYXJjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMzUxODkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2FyY2guaApAQCAtMCwwICsxLDIxMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfQVJDSF9IX18KKyNkZWZpbmUgX19YRlNfQVJDSF9IX18KKworI2lmbmRlZiBYRlNfQklHX0lOVU1TCisjIGVycm9yIFhGU19CSUdfSU5VTVMgbXVzdCBiZSBkZWZpbmVkIHRydWUgb3IgZmFsc2UKKyNlbmRpZgorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorCisjaWZkZWYgX19MSVRUTEVfRU5ESUFOCisjIGRlZmluZSBfX0JZVEVfT1JERVIJX19MSVRUTEVfRU5ESUFOCisjZW5kaWYKKyNpZmRlZiBfX0JJR19FTkRJQU4KKyMgZGVmaW5lIF9fQllURV9PUkRFUglfX0JJR19FTkRJQU4KKyNlbmRpZgorCisjZW5kaWYJLyogX19LRVJORUxfXyAqLworCisvKiBkbyB3ZSBuZWVkIGNvbnZlcnNpb24/ICovCisKKyNkZWZpbmUgQVJDSF9OT0NPTlZFUlQgMQorI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKyMgZGVmaW5lIEFSQ0hfQ09OVkVSVAkwCisjZWxzZQorIyBkZWZpbmUgQVJDSF9DT05WRVJUCUFSQ0hfTk9DT05WRVJUCisjZW5kaWYKKworLyogZ2VuZXJpYyBzd2FwcGluZyBtYWNyb3MgKi8KKworI2lmbmRlZiBIQVZFX1NXQUJNQUNST1MKKyNkZWZpbmUgSU5UX1NXQVAxNih0eXBlLHZhcikgKCh0eXBlb2YodHlwZSkpKF9fc3dhYjE2KChfX3UxNikodmFyKSkpKQorI2RlZmluZSBJTlRfU1dBUDMyKHR5cGUsdmFyKSAoKHR5cGVvZih0eXBlKSkoX19zd2FiMzIoKF9fdTMyKSh2YXIpKSkpCisjZGVmaW5lIElOVF9TV0FQNjQodHlwZSx2YXIpICgodHlwZW9mKHR5cGUpKShfX3N3YWI2NCgoX191NjQpKHZhcikpKSkKKyNlbmRpZgorCisjZGVmaW5lIElOVF9TV0FQKHR5cGUsIHZhcikgXAorICAgICgoc2l6ZW9mKHR5cGUpID09IDgpID8gSU5UX1NXQVA2NCh0eXBlLHZhcikgOiBcCisgICAgKChzaXplb2YodHlwZSkgPT0gNCkgPyBJTlRfU1dBUDMyKHR5cGUsdmFyKSA6IFwKKyAgICAoKHNpemVvZih0eXBlKSA9PSAyKSA/IElOVF9TV0FQMTYodHlwZSx2YXIpIDogXAorICAgICh2YXIpKSkpCisKKy8qCisgKiBnZXQgYW5kIHNldCBpbnRlZ2VycyBmcm9tIHBvdGVudGlhbGx5IHVuYWxpZ25lZCBsb2NhdGlvbnMKKyAqLworCisjZGVmaW5lIElOVF9HRVRfVU5BTElHTkVEXzE2X0JFKHBvaW50ZXIpIFwKKyAgICgoX191MTYpKCgoKF9fdTgqKShwb2ludGVyKSlbMF0gPDwgOCkgfCAoKChfX3U4KikocG9pbnRlcikpWzFdKSkpCisjZGVmaW5lIElOVF9TRVRfVU5BTElHTkVEXzE2X0JFKHBvaW50ZXIsdmFsdWUpIFwKKyAgICB7IFwKKwkoKF9fdTgqKShwb2ludGVyKSlbMF0gPSAoKCh2YWx1ZSkgPj4gOCkgJiAweGZmKTsgXAorCSgoX191OCopKHBvaW50ZXIpKVsxXSA9ICgoKHZhbHVlKSAgICAgKSAmIDB4ZmYpOyBcCisgICAgfQorCisvKiBkZWZpbmUgZ2VuZXJpYyBJTlRfIG1hY3JvcyAqLworCisjZGVmaW5lIElOVF9HRVQocmVmZXJlbmNlLGFyY2gpIFwKKyAgICAoKChhcmNoKSA9PSBBUkNIX05PQ09OVkVSVCkgXAorCT8gXAorCSAgICAocmVmZXJlbmNlKSBcCisJOiBcCisJICAgIElOVF9TV0FQKChyZWZlcmVuY2UpLChyZWZlcmVuY2UpKSBcCisgICAgKQorCisvKiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZSAqLworI2RlZmluZSBJTlRfU0VUKHJlZmVyZW5jZSxhcmNoLHZhbHVlcmVmKSBcCisgICAgKF9fYnVpbHRpbl9jb25zdGFudF9wKHZhbHVlcmVmKSA/IFwKKwkodm9pZCkoIChyZWZlcmVuY2UpID0gKCAoKGFyY2gpICE9IEFSQ0hfTk9DT05WRVJUKSA/IChJTlRfU1dBUCgocmVmZXJlbmNlKSwodmFsdWVyZWYpKSkgOiAodmFsdWVyZWYpKSApIDogXAorCSh2b2lkKSggXAorCSAgICAoKHJlZmVyZW5jZSkgPSAodmFsdWVyZWYpKSwgXAorCSAgICAoICgoYXJjaCkgIT0gQVJDSF9OT0NPTlZFUlQpID8gKHJlZmVyZW5jZSkgPSBJTlRfU1dBUCgocmVmZXJlbmNlKSwocmVmZXJlbmNlKSkgOiAwICkgXAorCSkgXAorICAgICkKKworLyogZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUgKi8KKyNkZWZpbmUgSU5UX01PRF9FWFBSKHJlZmVyZW5jZSxhcmNoLGNvZGUpIFwKKyAgICAoKChhcmNoKSA9PSBBUkNIX05PQ09OVkVSVCkgXAorCT8gXAorCSAgICAodm9pZCkoKHJlZmVyZW5jZSkgY29kZSkgXAorCTogXAorCSAgICAodm9pZCkoIFwKKwkJKHJlZmVyZW5jZSkgPSBJTlRfR0VUKChyZWZlcmVuY2UpLGFyY2gpICwgXAorCQkoKHJlZmVyZW5jZSkgY29kZSksIFwKKwkJSU5UX1NFVChyZWZlcmVuY2UsIGFyY2gsIHJlZmVyZW5jZSkgXAorCSAgICApIFwKKyAgICApCisKKy8qIGRvZXMgbm90IHJldHVybiBhIHZhbHVlICovCisjZGVmaW5lIElOVF9NT0QocmVmZXJlbmNlLGFyY2gsZGVsdGEpIFwKKyAgICAodm9pZCkoIFwKKwlJTlRfTU9EX0VYUFIocmVmZXJlbmNlLGFyY2gsKz0oZGVsdGEpKSBcCisgICAgKQorCisvKgorICogSU5UX0NPUFkgLSBjb3B5IGEgdmFsdWUgYmV0d2VlbiB0d28gbG9jYXRpb25zIHdpdGggdGhlCisgKgkgICAgICBfc2FtZSBhcmNoaXRlY3R1cmVfIGJ1dCBfcG90ZW50aWFsbHkgZGlmZmVyZW50IHNpemVzXworICoKKyAqCSAgICBpZiB0aGUgdHlwZXMgb2YgdGhlIHR3byBwYXJhbWV0ZXJzIGFyZSBlcXVhbCBvciB0aGV5IGFyZQorICoJCWluIG5hdGl2ZSBhcmNoaXRlY3R1cmUsIGEgc2ltcGxlIGNvcHkgaXMgZG9uZQorICoKKyAqCSAgICBvdGhlcndpc2UsIGFyY2hpdGVjdHVyZSBjb252ZXJzaW9ucyBhcmUgZG9uZQorICoKKyAqLworCisvKiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZSAqLworI2RlZmluZSBJTlRfQ09QWShkc3Qsc3JjLGFyY2gpIFwKKyAgICAoIFwKKwkoKHNpemVvZihkc3QpID09IHNpemVvZihzcmMpKSB8fCAoKGFyY2gpID09IEFSQ0hfTk9DT05WRVJUKSkgXAorCSAgICA/IFwKKwkJKHZvaWQpKChkc3QpID0gKHNyYykpIFwKKwkgICAgOiBcCisJCUlOVF9TRVQoZHN0LCBhcmNoLCBJTlRfR0VUKHNyYywgYXJjaCkpIFwKKyAgICApCisKKy8qCisgKiBJTlRfWExBVEUgLSBjb3B5IGEgdmFsdWUgaW4gZWl0aGVyIGRpcmVjdGlvbiBiZXR3ZWVuIHR3byBsb2NhdGlvbnMKKyAqCSAgICAgICB3aXRoIGRpZmZlcmVudCBhcmNoaXRlY3R1cmVzCisgKgorICoJCSAgICBkaXIgPCAwCS0gY29weSBmcm9tIG1lbW9yeSB0byBidWZmZXIgKG5hdGl2ZSB0byBhcmNoKQorICoJCSAgICBkaXIgPiAwCS0gY29weSBmcm9tIGJ1ZmZlciB0byBtZW1vcnkgKGFyY2ggdG8gbmF0aXZlKQorICovCisKKy8qIGRvZXMgbm90IHJldHVybiBhIHZhbHVlICovCisjZGVmaW5lIElOVF9YTEFURShidWYsbWVtLGRpcixhcmNoKSB7XAorICAgIEFTU0VSVChkaXIpOyBcCisgICAgaWYgKGRpcj4wKSB7IFwKKwkobWVtKT1JTlRfR0VUKGJ1ZiwgYXJjaCk7IFwKKyAgICB9IGVsc2UgeyBcCisJSU5UX1NFVChidWYsIGFyY2gsIG1lbSk7IFwKKyAgICB9IFwKK30KKworLyoKKyAqIEluIGRpcmVjdG9yaWVzIGlub2RlIG51bWJlcnMgYXJlIHN0b3JlZCBhcyB1bmFsaWduZWQgYXJyYXlzIG9mIHVuc2lnbmVkCisgKiA4Yml0IGludGVnZXJzIG9uIGRpc2suCisgKgorICogRm9yIHYxIGRpcmVjdG9yaWVzIG9yIHYyIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbiBpbm9kZSBudW1iZXJzIHRoYXQKKyAqIGRvIG5vdCBmaXQgaW50byAzMmJpdCB0aGUgYXJyYXkgaGFzIGVpZ2h0IG1lbWJlcnMsIGJ1dCB0aGUgZmlyc3QgbWVtYmVyCisgKiBpcyBhbHdheXMgemVybzoKKyAqCisgKiAgfHVudXNlZHw0OC01NXw0MC00N3wzMi0zOXwyNC0zMXwxNi0yM3wgOC0xNXwgMC0gN3wKKyAqCisgKiBGb3IgdjIgZGlyZWN0b3JpZXMgdGhhdCBvbmx5IGNvbnRhaW4gZW50cmllcyB3aXRoIGlub2RlIG51bWJlcnMgdGhhdCBmaXQKKyAqIGludG8gMzJiaXRzIGEgZm91ci1tZW1iZXIgYXJyYXkgaXMgdXNlZDoKKyAqCisgKiAgfDI0LTMxfDE2LTIzfCA4LTE1fCAwLSA3fAorICovIAorCisjZGVmaW5lIFhGU19HRVRfRElSX0lOTzQoZGkpIFwKKwkoKCh1MzIpKGRpKS5pWzBdIDw8IDI0KSB8ICgoZGkpLmlbMV0gPDwgMTYpIHwgKChkaSkuaVsyXSA8PCA4KSB8ICgoZGkpLmlbM10pKQorCisjZGVmaW5lIFhGU19QVVRfRElSX0lOTzQoZnJvbSwgZGkpIFwKK2RvIHsgXAorCShkaSkuaVswXSA9ICgoKGZyb20pICYgMHhmZjAwMDAwMFVMTCkgPj4gMjQpOyBcCisJKGRpKS5pWzFdID0gKCgoZnJvbSkgJiAweDAwZmYwMDAwVUxMKSA+PiAxNik7IFwKKwkoZGkpLmlbMl0gPSAoKChmcm9tKSAmIDB4MDAwMGZmMDBVTEwpID4+IDgpOyBcCisJKGRpKS5pWzNdID0gKChmcm9tKSAmIDB4MDAwMDAwZmZVTEwpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFhGU19ESV9ISShkaSkgXAorCSgoKHUzMikoZGkpLmlbMV0gPDwgMTYpIHwgKChkaSkuaVsyXSA8PCA4KSB8ICgoZGkpLmlbM10pKQorI2RlZmluZSBYRlNfRElfTE8oZGkpIFwKKwkoKCh1MzIpKGRpKS5pWzRdIDw8IDI0KSB8ICgoZGkpLmlbNV0gPDwgMTYpIHwgKChkaSkuaVs2XSA8PCA4KSB8ICgoZGkpLmlbN10pKQorCisjZGVmaW5lIFhGU19HRVRfRElSX0lOTzgoZGkpICAgICAgICBcCisJKCgoeGZzX2lub190KVhGU19ESV9MTyhkaSkgJiAweGZmZmZmZmZmVUxMKSB8IFwKKwkgKCh4ZnNfaW5vX3QpWEZTX0RJX0hJKGRpKSA8PCAzMikpCisKKyNkZWZpbmUgWEZTX1BVVF9ESVJfSU5POChmcm9tLCBkaSkgXAorZG8geyBcCisJKGRpKS5pWzBdID0gMDsgXAorCShkaSkuaVsxXSA9ICgoKGZyb20pICYgMHgwMGZmMDAwMDAwMDAwMDAwVUxMKSA+PiA0OCk7IFwKKwkoZGkpLmlbMl0gPSAoKChmcm9tKSAmIDB4MDAwMGZmMDAwMDAwMDAwMFVMTCkgPj4gNDApOyBcCisJKGRpKS5pWzNdID0gKCgoZnJvbSkgJiAweDAwMDAwMGZmMDAwMDAwMDBVTEwpID4+IDMyKTsgXAorCShkaSkuaVs0XSA9ICgoKGZyb20pICYgMHgwMDAwMDAwMGZmMDAwMDAwVUxMKSA+PiAyNCk7IFwKKwkoZGkpLmlbNV0gPSAoKChmcm9tKSAmIDB4MDAwMDAwMDAwMGZmMDAwMFVMTCkgPj4gMTYpOyBcCisJKGRpKS5pWzZdID0gKCgoZnJvbSkgJiAweDAwMDAwMDAwMDAwMGZmMDBVTEwpID4+IDgpOyBcCisJKGRpKS5pWzddID0gKChmcm9tKSAmIDB4MDAwMDAwMDAwMDAwMDBmZlVMTCk7IFwKK30gd2hpbGUgKDApCisJCisjZW5kaWYJLyogX19YRlNfQVJDSF9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYXR0ci5jIGIvZnMveGZzL3hmc19hdHRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU4YjU5MAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfYXR0ci5jCkBAIC0wLDAgKzEsMjY2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorCisjaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc190eXBlcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19hZy5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19hbGxvYy5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2JtYXAuaCIKKyNpbmNsdWRlICJ4ZnNfZGFfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0ci5oIgorI2luY2x1ZGUgInhmc19hdHRyX2xlYWYuaCIKKyNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCisjaW5jbHVkZSAieGZzX3F1b3RhLmgiCisjaW5jbHVkZSAieGZzX3J3LmgiCisjaW5jbHVkZSAieGZzX3RyYW5zX3NwYWNlLmgiCisjaW5jbHVkZSAieGZzX2FjbC5oIgorCisvKgorICogeGZzX2F0dHIuYworICoKKyAqIFByb3ZpZGUgdGhlIGV4dGVybmFsIGludGVyZmFjZXMgdG8gbWFuYWdlIGF0dHJpYnV0ZSBsaXN0cy4KKyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRnVuY3Rpb24gcHJvdG90eXBlcyBmb3IgdGhlIGtlcm5lbC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAqIEludGVybmFsIHJvdXRpbmVzIHdoZW4gYXR0cmlidXRlIGxpc3QgZml0cyBpbnNpZGUgdGhlIGlub2RlLgorICovCitTVEFUSUMgaW50IHhmc19hdHRyX3Nob3J0Zm9ybV9hZGRuYW1lKHhmc19kYV9hcmdzX3QgKmFyZ3MpOworCisvKgorICogSW50ZXJuYWwgcm91dGluZXMgd2hlbiBhdHRyaWJ1dGUgbGlzdCBpcyBvbmUgYmxvY2suCisgKi8KK1NUQVRJQyBpbnQgeGZzX2F0dHJfbGVhZl9hZGRuYW1lKHhmc19kYV9hcmdzX3QgKmFyZ3MpOworU1RBVElDIGludCB4ZnNfYXR0cl9sZWFmX3JlbW92ZW5hbWUoeGZzX2RhX2FyZ3NfdCAqYXJncyk7CitTVEFUSUMgaW50IHhmc19hdHRyX2xlYWZfbGlzdCh4ZnNfYXR0cl9saXN0X2NvbnRleHRfdCAqY29udGV4dCk7CisKKy8qCisgKiBJbnRlcm5hbCByb3V0aW5lcyB3aGVuIGF0dHJpYnV0ZSBsaXN0IGlzIG1vcmUgdGhhbiBvbmUgYmxvY2suCisgKi8KK1NUQVRJQyBpbnQgeGZzX2F0dHJfbm9kZV9hZGRuYW1lKHhmc19kYV9hcmdzX3QgKmFyZ3MpOworU1RBVElDIGludCB4ZnNfYXR0cl9ub2RlX3JlbW92ZW5hbWUoeGZzX2RhX2FyZ3NfdCAqYXJncyk7CitTVEFUSUMgaW50IHhmc19hdHRyX25vZGVfbGlzdCh4ZnNfYXR0cl9saXN0X2NvbnRleHRfdCAqY29udGV4dCk7CitTVEFUSUMgaW50IHhmc19hdHRyX2ZpbGxzdGF0ZSh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUpOworU1RBVElDIGludCB4ZnNfYXR0cl9yZWZpbGxzdGF0ZSh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUpOworCisvKgorICogUm91dGluZXMgdG8gbWFuaXB1bGF0ZSBvdXQtb2YtbGluZSBhdHRyaWJ1dGUgdmFsdWVzLgorICovCitTVEFUSUMgaW50IHhmc19hdHRyX3JtdHZhbF9nZXQoeGZzX2RhX2FyZ3NfdCAqYXJncyk7CitTVEFUSUMgaW50IHhmc19hdHRyX3JtdHZhbF9zZXQoeGZzX2RhX2FyZ3NfdCAqYXJncyk7CitTVEFUSUMgaW50IHhmc19hdHRyX3JtdHZhbF9yZW1vdmUoeGZzX2RhX2FyZ3NfdCAqYXJncyk7CisKKyNkZWZpbmUgQVRUUl9STVRWQUxVRV9NQVBTSVpFCTEJLyogIyBvZiBtYXAgZW50cmllcyBhdCBvbmNlICovCisKKyNpZiBkZWZpbmVkKFhGU19BVFRSX1RSQUNFKQora3RyYWNlX3QgKnhmc19hdHRyX3RyYWNlX2J1ZjsKKyNlbmRpZgorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBPdmVyYWxsIGV4dGVybmFsIGludGVyZmFjZSByb3V0aW5lcy4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworaW50Cit4ZnNfYXR0cl9mZXRjaCh4ZnNfaW5vZGVfdCAqaXAsIGNoYXIgKm5hbWUsIGludCBuYW1lbGVuLAorCSAgICAgICBjaGFyICp2YWx1ZSwgaW50ICp2YWx1ZWxlbnAsIGludCBmbGFncywgc3RydWN0IGNyZWQgKmNyZWQpCit7CisJeGZzX2RhX2FyZ3NfdCAgIGFyZ3M7CisJaW50ICAgICAgICAgICAgIGVycm9yOworCisJaWYgKChYRlNfSUZPUktfUShpcCkgPT0gMCkgfHwKKwkgICAgKGlwLT5pX2QuZGlfYWZvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICYmCisJICAgICBpcC0+aV9kLmRpX2FuZXh0ZW50cyA9PSAwKSkKKwkJcmV0dXJuKEVOT0FUVFIpOworCisJaWYgKCEoZmxhZ3MgJiAoQVRUUl9LRVJOQUNDRVNTfEFUVFJfU0VDVVJFKSkpIHsKKwkJaWYgKChlcnJvciA9IHhmc19pYWNjZXNzKGlwLCBTX0lSVVNSLCBjcmVkKSkpCisJCQlyZXR1cm4oWEZTX0VSUk9SKGVycm9yKSk7CisJfQorCisJLyoKKwkgKiBGaWxsIGluIHRoZSBhcmcgc3RydWN0dXJlIGZvciB0aGlzIHJlcXVlc3QuCisJICovCisJbWVtc2V0KChjaGFyICopJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7CisJYXJncy5uYW1lID0gbmFtZTsKKwlhcmdzLm5hbWVsZW4gPSBuYW1lbGVuOworCWFyZ3MudmFsdWUgPSB2YWx1ZTsKKwlhcmdzLnZhbHVlbGVuID0gKnZhbHVlbGVucDsKKwlhcmdzLmZsYWdzID0gZmxhZ3M7CisJYXJncy5oYXNodmFsID0geGZzX2RhX2hhc2huYW1lKGFyZ3MubmFtZSwgYXJncy5uYW1lbGVuKTsKKwlhcmdzLmRwID0gaXA7CisJYXJncy53aGljaGZvcmsgPSBYRlNfQVRUUl9GT1JLOworCisJLyoKKwkgKiBEZWNpZGUgb24gd2hhdCB3b3JrIHJvdXRpbmVzIHRvIGNhbGwgYmFzZWQgb24gdGhlIGlub2RlIHNpemUuCisJICovCisJaWYgKFhGU19JRk9SS19RKGlwKSA9PSAwIHx8CisJICAgIChpcC0+aV9kLmRpX2Fmb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUyAmJgorCSAgICAgaXAtPmlfZC5kaV9hbmV4dGVudHMgPT0gMCkpIHsKKwkJZXJyb3IgPSBYRlNfRVJST1IoRU5PQVRUUik7CisJfSBlbHNlIGlmIChpcC0+aV9kLmRpX2Fmb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpIHsKKwkJZXJyb3IgPSB4ZnNfYXR0cl9zaG9ydGZvcm1fZ2V0dmFsdWUoJmFyZ3MpOworCX0gZWxzZSBpZiAoeGZzX2JtYXBfb25lX2Jsb2NrKGlwLCBYRlNfQVRUUl9GT1JLKSkgeworCQllcnJvciA9IHhmc19hdHRyX2xlYWZfZ2V0KCZhcmdzKTsKKwl9IGVsc2UgeworCQllcnJvciA9IHhmc19hdHRyX25vZGVfZ2V0KCZhcmdzKTsKKwl9CisKKwkvKgorCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSB2YWx1ZSB0byB0aGUgY2FsbGVyLgorCSAqLworCSp2YWx1ZWxlbnAgPSBhcmdzLnZhbHVlbGVuOworCisJaWYgKGVycm9yID09IEVFWElTVCkKKwkJZXJyb3IgPSAwOworCXJldHVybihlcnJvcik7Cit9CisKK2ludAoreGZzX2F0dHJfZ2V0KGJodl9kZXNjX3QgKmJkcCwgY2hhciAqbmFtZSwgY2hhciAqdmFsdWUsIGludCAqdmFsdWVsZW5wLAorCSAgICAgaW50IGZsYWdzLCBzdHJ1Y3QgY3JlZCAqY3JlZCkKK3sKKwl4ZnNfaW5vZGVfdAkqaXAgPSBYRlNfQkhWVE9JKGJkcCk7CisJaW50CQllcnJvciwgbmFtZWxlbjsKKworCVhGU19TVEFUU19JTkMoeHNfYXR0cl9nZXQpOworCisJaWYgKCFuYW1lKQorCQlyZXR1cm4oRUlOVkFMKTsKKwluYW1lbGVuID0gc3RybGVuKG5hbWUpOworCWlmIChuYW1lbGVuID49IE1BWE5BTUVMRU4pCisJCXJldHVybihFRkFVTFQpOwkJLyogbWF0Y2ggSVJJWCBiZWhhdmlvdXIgKi8KKworCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKGlwLT5pX21vdW50KSkKKwkJcmV0dXJuKEVJTyk7CisKKwl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOworCWVycm9yID0geGZzX2F0dHJfZmV0Y2goaXAsIG5hbWUsIG5hbWVsZW4sIHZhbHVlLCB2YWx1ZWxlbnAsIGZsYWdzLCBjcmVkKTsKKwl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisJcmV0dXJuKGVycm9yKTsKK30KKworLypBUkdTVVNFRCovCitpbnQJCQkJCQkJCS8qIGVycm9yICovCit4ZnNfYXR0cl9zZXQoYmh2X2Rlc2NfdCAqYmRwLCBjaGFyICpuYW1lLCBjaGFyICp2YWx1ZSwgaW50IHZhbHVlbGVuLCBpbnQgZmxhZ3MsCisJCSAgICAgc3RydWN0IGNyZWQgKmNyZWQpCit7CisJeGZzX2RhX2FyZ3NfdAlhcmdzOworCXhmc19pbm9kZV90CSpkcDsKKwl4ZnNfZnNibG9ja190CWZpcnN0YmxvY2s7CisJeGZzX2JtYXBfZnJlZV90IGZsaXN0OworCWludAkJZXJyb3IsIGVycjIsIGNvbW1pdHRlZDsKKwlpbnQJCWxvY2FsLCBzaXplOworCXVpbnQJCW5ibGtzOworCXhmc19tb3VudF90CSptcDsKKwlpbnQgICAgICAgICAgICAgcnN2ZCA9IChmbGFncyAmIEFUVFJfUk9PVCkgIT0gMDsKKwlpbnQgICAgICAgICAgICAgbmFtZWxlbjsKKworCW5hbWVsZW4gPSBzdHJsZW4obmFtZSk7CisJaWYgKG5hbWVsZW4gPj0gTUFYTkFNRUxFTikKKwkJcmV0dXJuIEVGQVVMVDsJCS8qIG1hdGNoIElSSVggYmVoYXZpb3VyICovCisKKwlYRlNfU1RBVFNfSU5DKHhzX2F0dHJfc2V0KTsKKworCWRwID0gWEZTX0JIVlRPSShiZHApOworCW1wID0gZHAtPmlfbW91bnQ7CisJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQorCQlyZXR1cm4gKEVJTyk7CisKKwl4ZnNfaWxvY2soZHAsIFhGU19JTE9DS19TSEFSRUQpOworCWlmICghKGZsYWdzICYgQVRUUl9TRUNVUkUpICYmCisJICAgICAoZXJyb3IgPSB4ZnNfaWFjY2VzcyhkcCwgU19JV1VTUiwgY3JlZCkpKSB7CisJCXhmc19pdW5sb2NrKGRwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKwkJcmV0dXJuKFhGU19FUlJPUihlcnJvcikpOworCX0KKwl4ZnNfaXVubG9jayhkcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisKKwkvKgorCSAqIEF0dGFjaCB0aGUgZHF1b3RzIHRvIHRoZSBpbm9kZS4KKwkgKi8KKwlpZiAoKGVycm9yID0gWEZTX1FNX0RRQVRUQUNIKG1wLCBkcCwgMCkpKQorCQlyZXR1cm4gKGVycm9yKTsKKworCS8qCisJICogSWYgdGhlIGlub2RlIGRvZXNuJ3QgaGF2ZSBhbiBhdHRyaWJ1dGUgZm9yaywgYWRkIG9uZS4KKwkgKiAoaW5vZGUgbXVzdCBub3QgYmUgbG9ja2VkIHdoZW4gd2UgY2FsbCB0aGlzIHJvdXRpbmUpCisJICovCisJaWYgKFhGU19JRk9SS19RKGRwKSA9PSAwKSB7CisJCWVycm9yID0geGZzX2JtYXBfYWRkX2F0dHJmb3JrKGRwLCByc3ZkKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuKGVycm9yKTsKKwl9CisKKwkvKgorCSAqIEZpbGwgaW4gdGhlIGFyZyBzdHJ1Y3R1cmUgZm9yIHRoaXMgcmVxdWVzdC4KKwkgKi8KKwltZW1zZXQoKGNoYXIgKikmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKKwlhcmdzLm5hbWUgPSBuYW1lOworCWFyZ3MubmFtZWxlbiA9IG5hbWVsZW47CisJYXJncy52YWx1ZSA9IHZhbHVlOworCWFyZ3MudmFsdWVsZW4gPSB2YWx1ZWxlbjsKKwlhcmdzLmZsYWdzID0gZmxhZ3M7CisJYXJncy5oYXNodmFsID0geGZzX2RhX2hhc2huYW1lKGFyZ3MubmFtZSwgYXJncy5uYW1lbGVuKTsKKwlhcmdzLmRwID0gZHA7CisJYXJncy5maXJzdGJsb2NrID0gJmZpcnN0YmxvY2s7CisJYXJncy5mbGlzdCA9ICZmbGlzdDsKKwlhcmdzLndoaWNoZm9yayA9IFhGU19BVFRSX0ZPUks7CisJYXJncy5va25vZW50ID0gMTsKKworCS8qIERldGVybWluZSBzcGFjZSBuZXcgYXR0cmlidXRlIHdpbGwgdXNlLCBhbmQgaWYgaXQgd2lsbCBiZSBpbmxpbmUKKwkgKiBvciBvdXQgb2YgbGluZS4KKwkgKi8KKwlzaXplID0geGZzX2F0dHJfbGVhZl9uZXdlbnRzaXplKCZhcmdzLCBtcC0+bV9zYi5zYl9ibG9ja3NpemUsICZsb2NhbCk7CisKKwluYmxrcyA9IFhGU19EQUVOVEVSX1NQQUNFX1JFUyhtcCwgWEZTX0FUVFJfRk9SSyk7CisJaWYgKGxvY2FsKSB7CisJCWlmIChzaXplID4gKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSA+PiAxKSkgeworCQkJLyogRG91YmxlIHNwbGl0IHBvc3NpYmxlICovCisJCQluYmxrcyA8PD0gMTsKKwkJfQorCX0gZWxzZSB7CisJCXVpbnQJZGJsb2NrcyA9IFhGU19CX1RPX0ZTQihtcCwgdmFsdWVsZW4pOworCQkvKiBPdXQgb2YgbGluZSBhdHRyaWJ1dGUsIGNhbm5vdCBkb3VibGUgc3BsaXQsIGJ1dCBtYWtlCisJCSAqIHJvb20gZm9yIHRoZSBhdHRyaWJ1dGUgdmFsdWUgaXRzZWxmLgorCQkgKi8KKwkJbmJsa3MgKz0gZGJsb2NrczsKKwkJbmJsa3MgKz0gWEZTX05FWFRFTlRBRERfU1BBQ0VfUkVTKG1wLCBkYmxvY2tzLCBYRlNfQVRUUl9GT1JLKTsKKwl9CisKKwkvKiBTaXplIGlzIG5vdyBibG9ja3MgZm9yIGF0dHJpYnV0ZSBkYXRhICovCisJYXJncy50b3RhbCA9IG5ibGtzOworCisJLyoKKwkgKiBTdGFydCBvdXIgZmlyc3QgdHJhbnNhY3Rpb24gb2YgdGhlIGRheS4KKwkgKgorCSAqIEFsbCBmdXR1cmUgdHJhbnNhY3Rpb25zIGR1cmluZyB0aGlzIGNvZGUgbXVzdCBiZSAiY2hhaW5lZCIgb2ZmCisJICogdGhpcyBvbmUgdmlhIHRoZSB0cmFuc19kdXAoKSBjYWxsLiAgQWxsIHRyYW5zYWN0aW9ucyB3aWxsIGNvbnRhaW4KKwkgKiB0aGUgaW5vZGUsIGFuZCB0aGUgaW5vZGUgd2lsbCBhbHdheXMgYmUgbWFya2VkIHdpdGggdHJhbnNfaWhvbGQoKS4KKwkgKiBTaW5jZSB0aGUgaW5vZGUgd2lsbCBiZSBsb2NrZWQgaW4gYWxsIHRyYW5zYWN0aW9ucywgd2UgbXVzdCBsb2cKKwkgKiB0aGUgaW5vZGUgaW4gZXZlcnkgdHJhbnNhY3Rpb24gdG8gbGV0IGl0IGZsb2F0IHVwd2FyZCB0aHJvdWdoCisJICogdGhlIGxvZy4KKwkgKi8KKwlhcmdzLnRyYW5zID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfQVRUUl9TRVQpOworCisJLyoKKwkgKiBSb290IGZvcmsgYXR0cmlidXRlcyBjYW4gdXNlIHJlc2VydmVkIGRhdGEgYmxvY2tzIGZvciB0aGlzCisJICogb3BlcmF0aW9uIGlmIG5lY2Vzc2FyeQorCSAqLworCisJaWYgKHJzdmQpCisJCWFyZ3MudHJhbnMtPnRfZmxhZ3MgfD0gWEZTX1RSQU5TX1JFU0VSVkU7CisKKwlpZiAoKGVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUoYXJncy50cmFucywgKHVpbnQpIG5ibGtzLAorCQkJCSAgICAgIFhGU19BVFRSU0VUX0xPR19SRVMobXAsIG5ibGtzKSwKKwkJCQkgICAgICAwLCBYRlNfVFJBTlNfUEVSTV9MT0dfUkVTLAorCQkJCSAgICAgIFhGU19BVFRSU0VUX0xPR19DT1VOVCkpKSB7CisJCXhmc190cmFuc19jYW5jZWwoYXJncy50cmFucywgMCk7CisJCXJldHVybihlcnJvcik7CisJfQorCXhmc19pbG9jayhkcCwgWEZTX0lMT0NLX0VYQ0wpOworCisJZXJyb3IgPSBYRlNfVFJBTlNfUkVTRVJWRV9RVU9UQV9OQkxLUyhtcCwgYXJncy50cmFucywgZHAsIG5ibGtzLCAwLAorCQkJIHJzdmQgPyBYRlNfUU1PUFRfUkVTX1JFR0JMS1MgfCBYRlNfUU1PUFRfRk9SQ0VfUkVTIDoKKwkJCQlYRlNfUU1PUFRfUkVTX1JFR0JMS1MpOworCWlmIChlcnJvcikgeworCQl4ZnNfaXVubG9jayhkcCwgWEZTX0lMT0NLX0VYQ0wpOworCQl4ZnNfdHJhbnNfY2FuY2VsKGFyZ3MudHJhbnMsIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMpOworCQlyZXR1cm4gKGVycm9yKTsKKwl9CisKKwl4ZnNfdHJhbnNfaWpvaW4oYXJncy50cmFucywgZHAsIFhGU19JTE9DS19FWENMKTsKKwl4ZnNfdHJhbnNfaWhvbGQoYXJncy50cmFucywgZHApOworCisJLyoKKwkgKiBJZiB0aGUgYXR0cmlidXRlIGxpc3QgaXMgbm9uLWV4aXN0YW50IG9yIGEgc2hvcnRmb3JtIGxpc3QsCisJICogdXBncmFkZSBpdCB0byBhIHNpbmdsZS1sZWFmLWJsb2NrIGF0dHJpYnV0ZSBsaXN0LgorCSAqLworCWlmICgoZHAtPmlfZC5kaV9hZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0xPQ0FMKSB8fAorCSAgICAoKGRwLT5pX2QuZGlfYWZvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTKSAmJgorCSAgICAgKGRwLT5pX2QuZGlfYW5leHRlbnRzID09IDApKSkgeworCisJCS8qCisJCSAqIEJ1aWxkIGluaXRpYWwgYXR0cmlidXRlIGxpc3QgKGlmIHJlcXVpcmVkKS4KKwkJICovCisJCWlmIChkcC0+aV9kLmRpX2Fmb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUykKKwkJCSh2b2lkKXhmc19hdHRyX3Nob3J0Zm9ybV9jcmVhdGUoJmFyZ3MpOworCisJCS8qCisJCSAqIFRyeSB0byBhZGQgdGhlIGF0dHIgdG8gdGhlIGF0dHJpYnV0ZSBsaXN0IGluCisJCSAqIHRoZSBpbm9kZS4KKwkJICovCisJCWVycm9yID0geGZzX2F0dHJfc2hvcnRmb3JtX2FkZG5hbWUoJmFyZ3MpOworCQlpZiAoZXJyb3IgIT0gRU5PU1BDKSB7CisJCQkvKgorCQkJICogQ29tbWl0IHRoZSBzaG9ydGZvcm0gbW9kcywgYW5kIHdlJ3JlIGRvbmUuCisJCQkgKiBOT1RFOiB0aGlzIGlzIGFsc28gdGhlIGVycm9yIHBhdGggKEVFWElTVCwgZXRjKS4KKwkJCSAqLworCQkJQVNTRVJUKGFyZ3MudHJhbnMgIT0gTlVMTCk7CisKKwkJCS8qCisJCQkgKiBJZiB0aGlzIGlzIGEgc3luY2hyb25vdXMgbW91bnQsIG1ha2Ugc3VyZSB0aGF0CisJCQkgKiB0aGUgdHJhbnNhY3Rpb24gZ29lcyB0byBkaXNrIGJlZm9yZSByZXR1cm5pbmcKKwkJCSAqIHRvIHRoZSB1c2VyLgorCQkJICovCisJCQlpZiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfV1NZTkMpIHsKKwkJCQl4ZnNfdHJhbnNfc2V0X3N5bmMoYXJncy50cmFucyk7CisJCQl9CisJCQllcnIyID0geGZzX3RyYW5zX2NvbW1pdChhcmdzLnRyYW5zLAorCQkJCQkJIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMsCisJCQkJCQkgTlVMTCk7CisJCQl4ZnNfaXVubG9jayhkcCwgWEZTX0lMT0NLX0VYQ0wpOworCisJCQkvKgorCQkJICogSGl0IHRoZSBpbm9kZSBjaGFuZ2UgdGltZS4KKwkJCSAqLworCQkJaWYgKCFlcnJvciAmJiAoZmxhZ3MgJiBBVFRSX0tFUk5PVElNRSkgPT0gMCkgeworCQkJCXhmc19pY2hndGltZShkcCwgWEZTX0lDSEdUSU1FX0NIRyk7CisJCQl9CisJCQlyZXR1cm4oZXJyb3IgPT0gMCA/IGVycjIgOiBlcnJvcik7CisJCX0KKworCQkvKgorCQkgKiBJdCB3b24ndCBmaXQgaW4gdGhlIHNob3J0Zm9ybSwgdHJhbnNmb3JtIHRvIGEgbGVhZiBibG9jay4KKwkJICogR1JPVDogYW5vdGhlciBwb3NzaWJsZSByZXEnbXQgZm9yIGEgZG91YmxlLXNwbGl0IGJ0cmVlIG9wLgorCQkgKi8KKwkJWEZTX0JNQVBfSU5JVChhcmdzLmZsaXN0LCBhcmdzLmZpcnN0YmxvY2spOworCQllcnJvciA9IHhmc19hdHRyX3Nob3J0Zm9ybV90b19sZWFmKCZhcmdzKTsKKwkJaWYgKCFlcnJvcikgeworCQkJZXJyb3IgPSB4ZnNfYm1hcF9maW5pc2goJmFyZ3MudHJhbnMsIGFyZ3MuZmxpc3QsCisJCQkJCQkqYXJncy5maXJzdGJsb2NrLCAmY29tbWl0dGVkKTsKKwkJfQorCQlpZiAoZXJyb3IpIHsKKwkJCUFTU0VSVChjb21taXR0ZWQpOworCQkJYXJncy50cmFucyA9IE5VTEw7CisJCQl4ZnNfYm1hcF9jYW5jZWwoJmZsaXN0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyoKKwkJICogYm1hcF9maW5pc2goKSBtYXkgaGF2ZSBjb21taXR0ZWQgdGhlIGxhc3QgdHJhbnMgYW5kIHN0YXJ0ZWQKKwkJICogYSBuZXcgb25lLiAgV2UgbmVlZCB0aGUgaW5vZGUgdG8gYmUgaW4gYWxsIHRyYW5zYWN0aW9ucy4KKwkJICovCisJCWlmIChjb21taXR0ZWQpIHsKKwkJCXhmc190cmFuc19pam9pbihhcmdzLnRyYW5zLCBkcCwgWEZTX0lMT0NLX0VYQ0wpOworCQkJeGZzX3RyYW5zX2lob2xkKGFyZ3MudHJhbnMsIGRwKTsKKwkJfQorCisJCS8qCisJCSAqIENvbW1pdCB0aGUgbGVhZiB0cmFuc2Zvcm1hdGlvbi4gIFdlJ2xsIG5lZWQgYW5vdGhlciAobGlua2VkKQorCQkgKiB0cmFuc2FjdGlvbiB0byBhZGQgdGhlIG5ldyBhdHRyaWJ1dGUgdG8gdGhlIGxlYWYuCisJCSAqLworCQlpZiAoKGVycm9yID0geGZzX2F0dHJfcm9sbHRyYW5zKCZhcmdzLnRyYW5zLCBkcCkpKQorCQkJZ290byBvdXQ7CisKKwl9CisKKwlpZiAoeGZzX2JtYXBfb25lX2Jsb2NrKGRwLCBYRlNfQVRUUl9GT1JLKSkgeworCQllcnJvciA9IHhmc19hdHRyX2xlYWZfYWRkbmFtZSgmYXJncyk7CisJfSBlbHNlIHsKKwkJZXJyb3IgPSB4ZnNfYXR0cl9ub2RlX2FkZG5hbWUoJmFyZ3MpOworCX0KKwlpZiAoZXJyb3IpIHsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBJZiB0aGlzIGlzIGEgc3luY2hyb25vdXMgbW91bnQsIG1ha2Ugc3VyZSB0aGF0IHRoZQorCSAqIHRyYW5zYWN0aW9uIGdvZXMgdG8gZGlzayBiZWZvcmUgcmV0dXJuaW5nIHRvIHRoZSB1c2VyLgorCSAqLworCWlmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9XU1lOQykgeworCQl4ZnNfdHJhbnNfc2V0X3N5bmMoYXJncy50cmFucyk7CisJfQorCisJLyoKKwkgKiBDb21taXQgdGhlIGxhc3QgaW4gdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9ucy4KKwkgKi8KKwl4ZnNfdHJhbnNfbG9nX2lub2RlKGFyZ3MudHJhbnMsIGRwLCBYRlNfSUxPR19DT1JFKTsKKwllcnJvciA9IHhmc190cmFuc19jb21taXQoYXJncy50cmFucywgWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUywKKwkJCQkgTlVMTCk7CisJeGZzX2l1bmxvY2soZHAsIFhGU19JTE9DS19FWENMKTsKKworCS8qCisJICogSGl0IHRoZSBpbm9kZSBjaGFuZ2UgdGltZS4KKwkgKi8KKwlpZiAoIWVycm9yICYmIChmbGFncyAmIEFUVFJfS0VSTk9USU1FKSA9PSAwKSB7CisJCXhmc19pY2hndGltZShkcCwgWEZTX0lDSEdUSU1FX0NIRyk7CisJfQorCisJcmV0dXJuKGVycm9yKTsKKworb3V0OgorCWlmIChhcmdzLnRyYW5zKQorCQl4ZnNfdHJhbnNfY2FuY2VsKGFyZ3MudHJhbnMsCisJCQlYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTfFhGU19UUkFOU19BQk9SVCk7CisJeGZzX2l1bmxvY2soZHAsIFhGU19JTE9DS19FWENMKTsKKwlyZXR1cm4oZXJyb3IpOworfQorCisvKgorICogR2VuZXJpYyBoYW5kbGVyIHJvdXRpbmUgdG8gcmVtb3ZlIGEgbmFtZSBmcm9tIGFuIGF0dHJpYnV0ZSBsaXN0LgorICogVHJhbnNpdGlvbnMgYXR0cmlidXRlIGxpc3QgZnJvbSBCdHJlZSB0byBzaG9ydGZvcm0gYXMgbmVjZXNzYXJ5LgorICovCisvKkFSR1NVU0VEKi8KK2ludAkJCQkJCQkJLyogZXJyb3IgKi8KK3hmc19hdHRyX3JlbW92ZShiaHZfZGVzY190ICpiZHAsIGNoYXIgKm5hbWUsIGludCBmbGFncywgc3RydWN0IGNyZWQgKmNyZWQpCit7CisJeGZzX2RhX2FyZ3NfdCAgICAgICBhcmdzOworCXhmc19pbm9kZV90ICAgICAgICAgKmRwOworCXhmc19mc2Jsb2NrX3QgICAgICAgZmlyc3RibG9jazsKKwl4ZnNfYm1hcF9mcmVlX3QgICAgIGZsaXN0OworCWludCAgICAgICAgICAgICAgICAgZXJyb3I7CisJeGZzX21vdW50X3QgICAgICAgICAqbXA7CisJaW50ICAgICAgICAgICAgICAgICBuYW1lbGVuOworCisJQVNTRVJUKE1BWE5BTUVMRU4tMTw9MHhmZik7IC8qIGxlbmd0aCBpcyBzdG9yZWQgaW4gdWludDggKi8KKwluYW1lbGVuID0gc3RybGVuKG5hbWUpOworCWlmIChuYW1lbGVuPj1NQVhOQU1FTEVOKQorCQlyZXR1cm4gRUZBVUxUOyAvKiBtYXRjaCBpcml4IGJlaGF2aW91ciAqLworCisJWEZTX1NUQVRTX0lOQyh4c19hdHRyX3JlbW92ZSk7CisKKwlkcCA9IFhGU19CSFZUT0koYmRwKTsKKwltcCA9IGRwLT5pX21vdW50OworCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKKwkJcmV0dXJuIChFSU8pOworCisJeGZzX2lsb2NrKGRwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKwlpZiAoIShmbGFncyAmIEFUVFJfU0VDVVJFKSAmJgorCSAgICAgKGVycm9yID0geGZzX2lhY2Nlc3MoZHAsIFNfSVdVU1IsIGNyZWQpKSkgeworCQl4ZnNfaXVubG9jayhkcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisJCXJldHVybihYRlNfRVJST1IoZXJyb3IpKTsKKwl9IGVsc2UgaWYgKFhGU19JRk9SS19RKGRwKSA9PSAwIHx8CisJCSAgIChkcC0+aV9kLmRpX2Fmb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUyAmJgorCQkgICAgZHAtPmlfZC5kaV9hbmV4dGVudHMgPT0gMCkpIHsKKwkJeGZzX2l1bmxvY2soZHAsIFhGU19JTE9DS19TSEFSRUQpOworCQlyZXR1cm4oWEZTX0VSUk9SKEVOT0FUVFIpKTsKKwl9CisJeGZzX2l1bmxvY2soZHAsIFhGU19JTE9DS19TSEFSRUQpOworCisJLyoKKwkgKiBGaWxsIGluIHRoZSBhcmcgc3RydWN0dXJlIGZvciB0aGlzIHJlcXVlc3QuCisJICovCisJbWVtc2V0KChjaGFyICopJmFyZ3MsIDAsIHNpemVvZihhcmdzKSk7CisJYXJncy5uYW1lID0gbmFtZTsKKwlhcmdzLm5hbWVsZW4gPSBuYW1lbGVuOworCWFyZ3MuZmxhZ3MgPSBmbGFnczsKKwlhcmdzLmhhc2h2YWwgPSB4ZnNfZGFfaGFzaG5hbWUoYXJncy5uYW1lLCBhcmdzLm5hbWVsZW4pOworCWFyZ3MuZHAgPSBkcDsKKwlhcmdzLmZpcnN0YmxvY2sgPSAmZmlyc3RibG9jazsKKwlhcmdzLmZsaXN0ID0gJmZsaXN0OworCWFyZ3MudG90YWwgPSAwOworCWFyZ3Mud2hpY2hmb3JrID0gWEZTX0FUVFJfRk9SSzsKKworCS8qCisJICogQXR0YWNoIHRoZSBkcXVvdHMgdG8gdGhlIGlub2RlLgorCSAqLworCWlmICgoZXJyb3IgPSBYRlNfUU1fRFFBVFRBQ0gobXAsIGRwLCAwKSkpCisJCXJldHVybiAoZXJyb3IpOworCisJLyoKKwkgKiBTdGFydCBvdXIgZmlyc3QgdHJhbnNhY3Rpb24gb2YgdGhlIGRheS4KKwkgKgorCSAqIEFsbCBmdXR1cmUgdHJhbnNhY3Rpb25zIGR1cmluZyB0aGlzIGNvZGUgbXVzdCBiZSAiY2hhaW5lZCIgb2ZmCisJICogdGhpcyBvbmUgdmlhIHRoZSB0cmFuc19kdXAoKSBjYWxsLiAgQWxsIHRyYW5zYWN0aW9ucyB3aWxsIGNvbnRhaW4KKwkgKiB0aGUgaW5vZGUsIGFuZCB0aGUgaW5vZGUgd2lsbCBhbHdheXMgYmUgbWFya2VkIHdpdGggdHJhbnNfaWhvbGQoKS4KKwkgKiBTaW5jZSB0aGUgaW5vZGUgd2lsbCBiZSBsb2NrZWQgaW4gYWxsIHRyYW5zYWN0aW9ucywgd2UgbXVzdCBsb2cKKwkgKiB0aGUgaW5vZGUgaW4gZXZlcnkgdHJhbnNhY3Rpb24gdG8gbGV0IGl0IGZsb2F0IHVwd2FyZCB0aHJvdWdoCisJICogdGhlIGxvZy4KKwkgKi8KKwlhcmdzLnRyYW5zID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfQVRUUl9STSk7CisKKwkvKgorCSAqIFJvb3QgZm9yayBhdHRyaWJ1dGVzIGNhbiB1c2UgcmVzZXJ2ZWQgZGF0YSBibG9ja3MgZm9yIHRoaXMKKwkgKiBvcGVyYXRpb24gaWYgbmVjZXNzYXJ5CisJICovCisKKwlpZiAoZmxhZ3MgJiBBVFRSX1JPT1QpCisJCWFyZ3MudHJhbnMtPnRfZmxhZ3MgfD0gWEZTX1RSQU5TX1JFU0VSVkU7CisKKwlpZiAoKGVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUoYXJncy50cmFucywKKwkJCQkgICAgICBYRlNfQVRUUlJNX1NQQUNFX1JFUyhtcCksCisJCQkJICAgICAgWEZTX0FUVFJSTV9MT0dfUkVTKG1wKSwKKwkJCQkgICAgICAwLCBYRlNfVFJBTlNfUEVSTV9MT0dfUkVTLAorCQkJCSAgICAgIFhGU19BVFRSUk1fTE9HX0NPVU5UKSkpIHsKKwkJeGZzX3RyYW5zX2NhbmNlbChhcmdzLnRyYW5zLCAwKTsKKwkJcmV0dXJuKGVycm9yKTsKKworCX0KKworCXhmc19pbG9jayhkcCwgWEZTX0lMT0NLX0VYQ0wpOworCS8qCisJICogTm8gbmVlZCB0byBtYWtlIHF1b3RhIHJlc2VydmF0aW9ucyBoZXJlLiBXZSBleHBlY3QgdG8gcmVsZWFzZSBzb21lCisJICogYmxvY2tzIG5vdCBhbGxvY2F0ZSBpbiB0aGUgY29tbW9uIGNhc2UuCisJICovCisJeGZzX3RyYW5zX2lqb2luKGFyZ3MudHJhbnMsIGRwLCBYRlNfSUxPQ0tfRVhDTCk7CisJeGZzX3RyYW5zX2lob2xkKGFyZ3MudHJhbnMsIGRwKTsKKworCS8qCisJICogRGVjaWRlIG9uIHdoYXQgd29yayByb3V0aW5lcyB0byBjYWxsIGJhc2VkIG9uIHRoZSBpbm9kZSBzaXplLgorCSAqLworCWlmIChYRlNfSUZPUktfUShkcCkgPT0gMCB8fAorCSAgICAoZHAtPmlfZC5kaV9hZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0VYVEVOVFMgJiYKKwkgICAgIGRwLT5pX2QuZGlfYW5leHRlbnRzID09IDApKSB7CisJCWVycm9yID0gWEZTX0VSUk9SKEVOT0FUVFIpOworCQlnb3RvIG91dDsKKwl9CisJaWYgKGRwLT5pX2QuZGlfYWZvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9MT0NBTCkgeworCQlBU1NFUlQoZHAtPmlfYWZwLT5pZl9mbGFncyAmIFhGU19JRklOTElORSk7CisJCWVycm9yID0geGZzX2F0dHJfc2hvcnRmb3JtX3JlbW92ZSgmYXJncyk7CisJCWlmIChlcnJvcikgeworCQkJZ290byBvdXQ7CisJCX0KKwl9IGVsc2UgaWYgKHhmc19ibWFwX29uZV9ibG9jayhkcCwgWEZTX0FUVFJfRk9SSykpIHsKKwkJZXJyb3IgPSB4ZnNfYXR0cl9sZWFmX3JlbW92ZW5hbWUoJmFyZ3MpOworCX0gZWxzZSB7CisJCWVycm9yID0geGZzX2F0dHJfbm9kZV9yZW1vdmVuYW1lKCZhcmdzKTsKKwl9CisJaWYgKGVycm9yKSB7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogSWYgdGhpcyBpcyBhIHN5bmNocm9ub3VzIG1vdW50LCBtYWtlIHN1cmUgdGhhdCB0aGUKKwkgKiB0cmFuc2FjdGlvbiBnb2VzIHRvIGRpc2sgYmVmb3JlIHJldHVybmluZyB0byB0aGUgdXNlci4KKwkgKi8KKwlpZiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfV1NZTkMpIHsKKwkJeGZzX3RyYW5zX3NldF9zeW5jKGFyZ3MudHJhbnMpOworCX0KKworCS8qCisJICogQ29tbWl0IHRoZSBsYXN0IGluIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbnMuCisJICovCisJeGZzX3RyYW5zX2xvZ19pbm9kZShhcmdzLnRyYW5zLCBkcCwgWEZTX0lMT0dfQ09SRSk7CisJZXJyb3IgPSB4ZnNfdHJhbnNfY29tbWl0KGFyZ3MudHJhbnMsIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMsCisJCQkJIE5VTEwpOworCXhmc19pdW5sb2NrKGRwLCBYRlNfSUxPQ0tfRVhDTCk7CisKKwkvKgorCSAqIEhpdCB0aGUgaW5vZGUgY2hhbmdlIHRpbWUuCisJICovCisJaWYgKCFlcnJvciAmJiAoZmxhZ3MgJiBBVFRSX0tFUk5PVElNRSkgPT0gMCkgeworCQl4ZnNfaWNoZ3RpbWUoZHAsIFhGU19JQ0hHVElNRV9DSEcpOworCX0KKworCXJldHVybihlcnJvcik7CisKK291dDoKKwlpZiAoYXJncy50cmFucykKKwkJeGZzX3RyYW5zX2NhbmNlbChhcmdzLnRyYW5zLAorCQkJWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFU3xYRlNfVFJBTlNfQUJPUlQpOworCXhmc19pdW5sb2NrKGRwLCBYRlNfSUxPQ0tfRVhDTCk7CisJcmV0dXJuKGVycm9yKTsKK30KKworLyoKKyAqIEdlbmVyYXRlIGEgbGlzdCBvZiBleHRlbmRlZCBhdHRyaWJ1dGUgbmFtZXMgYW5kIG9wdGlvbmFsbHkKKyAqIGFsc28gdmFsdWUgbGVuZ3Rocy4gIFBvc2l0aXZlIHJldHVybiB2YWx1ZSBmb2xsb3dzIHRoZSBYRlMKKyAqIGNvbnZlbnRpb24gb2YgYmVpbmcgYW4gZXJyb3IsIHplcm8gb3IgbmVnYXRpdmUgcmV0dXJuIGNvZGUKKyAqIGlzIHRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciByZXR1cm5lZCAobmVnYXRlZCksIGluZGljYXRpbmcKKyAqIHN1Y2Nlc3MuCisgKi8KK2ludAoreGZzX2F0dHJfbGlzdChiaHZfZGVzY190ICpiZHAsIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZnNpemUsIGludCBmbGFncywKKwkJICAgICAgYXR0cmxpc3RfY3Vyc29yX2tlcm5fdCAqY3Vyc29yLCBzdHJ1Y3QgY3JlZCAqY3JlZCkKK3sKKwl4ZnNfYXR0cl9saXN0X2NvbnRleHRfdCBjb250ZXh0OworCXhmc19pbm9kZV90ICpkcDsKKwlpbnQgZXJyb3I7CisKKwlYRlNfU1RBVFNfSU5DKHhzX2F0dHJfbGlzdCk7CisKKwkvKgorCSAqIFZhbGlkYXRlIHRoZSBjdXJzb3IuCisJICovCisJaWYgKGN1cnNvci0+cGFkMSB8fCBjdXJzb3ItPnBhZDIpCisJCXJldHVybihYRlNfRVJST1IoRUlOVkFMKSk7CisJaWYgKChjdXJzb3ItPmluaXR0ZWQgPT0gMCkgJiYKKwkgICAgKGN1cnNvci0+aGFzaHZhbCB8fCBjdXJzb3ItPmJsa25vIHx8IGN1cnNvci0+b2Zmc2V0KSkKKwkJcmV0dXJuKFhGU19FUlJPUihFSU5WQUwpKTsKKworCS8qCisJICogQ2hlY2sgZm9yIGEgcHJvcGVybHkgYWxpZ25lZCBidWZmZXIuCisJICovCisJaWYgKCgobG9uZylidWZmZXIpICYgKHNpemVvZihpbnQpLTEpKQorCQlyZXR1cm4oWEZTX0VSUk9SKEVGQVVMVCkpOworCWlmIChmbGFncyAmIEFUVFJfS0VSTk9WQUwpCisJCWJ1ZnNpemUgPSAwOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBvdXRwdXQgYnVmZmVyLgorCSAqLworCWNvbnRleHQuZHAgPSBkcCA9IFhGU19CSFZUT0koYmRwKTsKKwljb250ZXh0LmN1cnNvciA9IGN1cnNvcjsKKwljb250ZXh0LmNvdW50ID0gMDsKKwljb250ZXh0LmR1cGNudCA9IDA7CisJY29udGV4dC5yZXN5bmNoID0gMTsKKwljb250ZXh0LmZsYWdzID0gZmxhZ3M7CisJaWYgKCEoZmxhZ3MgJiBBVFRSX0tFUk5BTUVMUykpIHsKKwkJY29udGV4dC5idWZzaXplID0gKGJ1ZnNpemUgJiB+KHNpemVvZihpbnQpLTEpKTsgIC8qIGFsaWduICovCisJCWNvbnRleHQuZmlyc3R1ID0gY29udGV4dC5idWZzaXplOworCQljb250ZXh0LmFsaXN0ID0gKGF0dHJsaXN0X3QgKilidWZmZXI7CisJCWNvbnRleHQuYWxpc3QtPmFsX2NvdW50ID0gMDsKKwkJY29udGV4dC5hbGlzdC0+YWxfbW9yZSA9IDA7CisJCWNvbnRleHQuYWxpc3QtPmFsX29mZnNldFswXSA9IGNvbnRleHQuYnVmc2l6ZTsKKwl9CisJZWxzZSB7CisJCWNvbnRleHQuYnVmc2l6ZSA9IGJ1ZnNpemU7CisJCWNvbnRleHQuZmlyc3R1ID0gY29udGV4dC5idWZzaXplOworCQljb250ZXh0LmFsaXN0ID0gKGF0dHJsaXN0X3QgKilidWZmZXI7CisJfQorCisJaWYgKFhGU19GT1JDRURfU0hVVERPV04oZHAtPmlfbW91bnQpKQorCQlyZXR1cm4gKEVJTyk7CisKKwl4ZnNfaWxvY2soZHAsIFhGU19JTE9DS19TSEFSRUQpOworCWlmICghKGZsYWdzICYgQVRUUl9TRUNVUkUpICYmCisJICAgICAoZXJyb3IgPSB4ZnNfaWFjY2VzcyhkcCwgU19JUlVTUiwgY3JlZCkpKSB7CisJCXhmc19pdW5sb2NrKGRwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKwkJcmV0dXJuKFhGU19FUlJPUihlcnJvcikpOworCX0KKworCS8qCisJICogRGVjaWRlIG9uIHdoYXQgd29yayByb3V0aW5lcyB0byBjYWxsIGJhc2VkIG9uIHRoZSBpbm9kZSBzaXplLgorCSAqLworCXhmc19hdHRyX3RyYWNlX2xfYygic3lzY2FsbCBzdGFydCIsICZjb250ZXh0KTsKKwlpZiAoWEZTX0lGT1JLX1EoZHApID09IDAgfHwKKwkgICAgKGRwLT5pX2QuZGlfYWZvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICYmCisJICAgICBkcC0+aV9kLmRpX2FuZXh0ZW50cyA9PSAwKSkgeworCQllcnJvciA9IDA7CisJfSBlbHNlIGlmIChkcC0+aV9kLmRpX2Fmb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpIHsKKwkJZXJyb3IgPSB4ZnNfYXR0cl9zaG9ydGZvcm1fbGlzdCgmY29udGV4dCk7CisJfSBlbHNlIGlmICh4ZnNfYm1hcF9vbmVfYmxvY2soZHAsIFhGU19BVFRSX0ZPUkspKSB7CisJCWVycm9yID0geGZzX2F0dHJfbGVhZl9saXN0KCZjb250ZXh0KTsKKwl9IGVsc2UgeworCQllcnJvciA9IHhmc19hdHRyX25vZGVfbGlzdCgmY29udGV4dCk7CisJfQorCXhmc19pdW5sb2NrKGRwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKwl4ZnNfYXR0cl90cmFjZV9sX2MoInN5c2NhbGwgZW5kIiwgJmNvbnRleHQpOworCisJaWYgKCEoY29udGV4dC5mbGFncyAmIChBVFRSX0tFUk5PVkFMfEFUVFJfS0VSTkFNRUxTKSkpIHsKKwkJQVNTRVJUKGVycm9yID49IDApOworCX0KKwllbHNlIHsJLyogbXVzdCByZXR1cm4gbmVnYXRlZCBidWZmZXIgc2l6ZSBvciB0aGUgZXJyb3IgKi8KKwkJaWYgKGNvbnRleHQuY291bnQgPCAwKQorCQkJZXJyb3IgPSBYRlNfRVJST1IoRVJBTkdFKTsKKwkJZWxzZQorCQkJZXJyb3IgPSAtY29udGV4dC5jb3VudDsKKwl9CisKKwlyZXR1cm4oZXJyb3IpOworfQorCitpbnQJCQkJCQkJCS8qIGVycm9yICovCit4ZnNfYXR0cl9pbmFjdGl2ZSh4ZnNfaW5vZGVfdCAqZHApCit7CisJeGZzX3RyYW5zX3QgKnRyYW5zOworCXhmc19tb3VudF90ICptcDsKKwlpbnQgZXJyb3I7CisKKwltcCA9IGRwLT5pX21vdW50OworCUFTU0VSVCghIFhGU19OT1RfRFFBVFRBQ0hFRChtcCwgZHApKTsKKworCXhmc19pbG9jayhkcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisJaWYgKChYRlNfSUZPUktfUShkcCkgPT0gMCkgfHwKKwkgICAgKGRwLT5pX2QuZGlfYWZvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9MT0NBTCkgfHwKKwkgICAgKGRwLT5pX2QuZGlfYWZvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICYmCisJICAgICBkcC0+aV9kLmRpX2FuZXh0ZW50cyA9PSAwKSkgeworCQl4ZnNfaXVubG9jayhkcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisJCXJldHVybigwKTsKKwl9CisJeGZzX2l1bmxvY2soZHAsIFhGU19JTE9DS19TSEFSRUQpOworCisJLyoKKwkgKiBTdGFydCBvdXIgZmlyc3QgdHJhbnNhY3Rpb24gb2YgdGhlIGRheS4KKwkgKgorCSAqIEFsbCBmdXR1cmUgdHJhbnNhY3Rpb25zIGR1cmluZyB0aGlzIGNvZGUgbXVzdCBiZSAiY2hhaW5lZCIgb2ZmCisJICogdGhpcyBvbmUgdmlhIHRoZSB0cmFuc19kdXAoKSBjYWxsLiAgQWxsIHRyYW5zYWN0aW9ucyB3aWxsIGNvbnRhaW4KKwkgKiB0aGUgaW5vZGUsIGFuZCB0aGUgaW5vZGUgd2lsbCBhbHdheXMgYmUgbWFya2VkIHdpdGggdHJhbnNfaWhvbGQoKS4KKwkgKiBTaW5jZSB0aGUgaW5vZGUgd2lsbCBiZSBsb2NrZWQgaW4gYWxsIHRyYW5zYWN0aW9ucywgd2UgbXVzdCBsb2cKKwkgKiB0aGUgaW5vZGUgaW4gZXZlcnkgdHJhbnNhY3Rpb24gdG8gbGV0IGl0IGZsb2F0IHVwd2FyZCB0aHJvdWdoCisJICogdGhlIGxvZy4KKwkgKi8KKwl0cmFucyA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX0FUVFJJTlZBTCk7CisJaWYgKChlcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRyYW5zLCAwLCBYRlNfQVRUUklOVkFMX0xPR19SRVMobXApLCAwLAorCQkJCSAgICAgIFhGU19UUkFOU19QRVJNX0xPR19SRVMsCisJCQkJICAgICAgWEZTX0FUVFJJTlZBTF9MT0dfQ09VTlQpKSkgeworCQl4ZnNfdHJhbnNfY2FuY2VsKHRyYW5zLCAwKTsKKwkJcmV0dXJuKGVycm9yKTsKKwl9CisJeGZzX2lsb2NrKGRwLCBYRlNfSUxPQ0tfRVhDTCk7CisKKwkvKgorCSAqIE5vIG5lZWQgdG8gbWFrZSBxdW90YSByZXNlcnZhdGlvbnMgaGVyZS4gV2UgZXhwZWN0IHRvIHJlbGVhc2Ugc29tZQorCSAqIGJsb2Nrcywgbm90IGFsbG9jYXRlLCBpbiB0aGUgY29tbW9uIGNhc2UuCisJICovCisJeGZzX3RyYW5zX2lqb2luKHRyYW5zLCBkcCwgWEZTX0lMT0NLX0VYQ0wpOworCXhmc190cmFuc19paG9sZCh0cmFucywgZHApOworCisJLyoKKwkgKiBEZWNpZGUgb24gd2hhdCB3b3JrIHJvdXRpbmVzIHRvIGNhbGwgYmFzZWQgb24gdGhlIGlub2RlIHNpemUuCisJICovCisJaWYgKChYRlNfSUZPUktfUShkcCkgPT0gMCkgfHwKKwkgICAgKGRwLT5pX2QuZGlfYWZvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9MT0NBTCkgfHwKKwkgICAgKGRwLT5pX2QuZGlfYWZvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICYmCisJICAgICBkcC0+aV9kLmRpX2FuZXh0ZW50cyA9PSAwKSkgeworCQllcnJvciA9IDA7CisJCWdvdG8gb3V0OworCX0KKwllcnJvciA9IHhmc19hdHRyX3Jvb3RfaW5hY3RpdmUoJnRyYW5zLCBkcCk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKwkvKgorCSAqIHNpZ25hbCBzeW5jaHJvbm91cyBpbmFjdGl2ZSB0cmFuc2FjdGlvbnMgdW5sZXNzIHRoaXMKKwkgKiBpcyBhIHN5bmNocm9ub3VzIG1vdW50IGZpbGVzeXN0ZW0gaW4gd2hpY2ggY2FzZSB3ZQorCSAqIGtub3cgdGhhdCB3ZSdyZSBoZXJlIGJlY2F1c2Ugd2UndmUgYmVlbiBjYWxsZWQgb3V0IG9mCisJICogeGZzX2luYWN0aXZlIHdoaWNoIG1lYW5zIHRoYXQgdGhlIGxhc3QgcmVmZXJlbmNlIGlzIGdvbmUKKwkgKiBhbmQgdGhlIHVubGluayB0cmFuc2FjdGlvbiBoYXMgYWxyZWFkeSBoaXQgdGhlIGRpc2sgc28KKwkgKiBhc3luYyBpbmFjdGl2ZSB0cmFuc2FjdGlvbnMgYXJlIHNhZmUuCisJICovCisJaWYgKChlcnJvciA9IHhmc19pdHJ1bmNhdGVfZmluaXNoKCZ0cmFucywgZHAsIDBMTCwgWEZTX0FUVFJfRk9SSywKKwkJCQkoIShtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9XU1lOQykKKwkJCQkgPyAxIDogMCkpKSkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIENvbW1pdCB0aGUgbGFzdCBpbiB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb25zLgorCSAqLworCXhmc190cmFuc19sb2dfaW5vZGUodHJhbnMsIGRwLCBYRlNfSUxPR19DT1JFKTsKKwllcnJvciA9IHhmc190cmFuc19jb21taXQodHJhbnMsIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMsCisJCQkJIE5VTEwpOworCXhmc19pdW5sb2NrKGRwLCBYRlNfSUxPQ0tfRVhDTCk7CisKKwlyZXR1cm4oZXJyb3IpOworCitvdXQ6CisJeGZzX3RyYW5zX2NhbmNlbCh0cmFucywgWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFU3xYRlNfVFJBTlNfQUJPUlQpOworCXhmc19pdW5sb2NrKGRwLCBYRlNfSUxPQ0tfRVhDTCk7CisJcmV0dXJuKGVycm9yKTsKK30KKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBFeHRlcm5hbCByb3V0aW5lcyB3aGVuIGF0dHJpYnV0ZSBsaXN0IGlzIGluc2lkZSB0aGUgaW5vZGUKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAqIEFkZCBhIG5hbWUgdG8gdGhlIHNob3J0Zm9ybSBhdHRyaWJ1dGUgbGlzdCBzdHJ1Y3R1cmUKKyAqIFRoaXMgaXMgdGhlIGV4dGVybmFsIHJvdXRpbmUuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19hdHRyX3Nob3J0Zm9ybV9hZGRuYW1lKHhmc19kYV9hcmdzX3QgKmFyZ3MpCit7CisJaW50IG5ld3NpemUsIHJldHZhbDsKKworCXJldHZhbCA9IHhmc19hdHRyX3Nob3J0Zm9ybV9sb29rdXAoYXJncyk7CisJaWYgKChhcmdzLT5mbGFncyAmIEFUVFJfUkVQTEFDRSkgJiYgKHJldHZhbCA9PSBFTk9BVFRSKSkgeworCQlyZXR1cm4ocmV0dmFsKTsKKwl9IGVsc2UgaWYgKHJldHZhbCA9PSBFRVhJU1QpIHsKKwkJaWYgKGFyZ3MtPmZsYWdzICYgQVRUUl9DUkVBVEUpCisJCQlyZXR1cm4ocmV0dmFsKTsKKwkJcmV0dmFsID0geGZzX2F0dHJfc2hvcnRmb3JtX3JlbW92ZShhcmdzKTsKKwkJQVNTRVJUKHJldHZhbCA9PSAwKTsKKwl9CisKKwluZXdzaXplID0gWEZTX0FUVFJfU0ZfVE9UU0laRShhcmdzLT5kcCk7CisJbmV3c2l6ZSArPSBYRlNfQVRUUl9TRl9FTlRTSVpFX0JZTkFNRShhcmdzLT5uYW1lbGVuLCBhcmdzLT52YWx1ZWxlbik7CisJaWYgKChuZXdzaXplIDw9IFhGU19JRk9SS19BU0laRShhcmdzLT5kcCkpICYmCisJICAgIChhcmdzLT5uYW1lbGVuIDwgWEZTX0FUVFJfU0ZfRU5UU0laRV9NQVgpICYmCisJICAgIChhcmdzLT52YWx1ZWxlbiA8IFhGU19BVFRSX1NGX0VOVFNJWkVfTUFYKSkgeworCQlyZXR2YWwgPSB4ZnNfYXR0cl9zaG9ydGZvcm1fYWRkKGFyZ3MpOworCQlBU1NFUlQocmV0dmFsID09IDApOworCX0gZWxzZSB7CisJCXJldHVybihYRlNfRVJST1IoRU5PU1BDKSk7CisJfQorCXJldHVybigwKTsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRXh0ZXJuYWwgcm91dGluZXMgd2hlbiBhdHRyaWJ1dGUgbGlzdCBpcyBvbmUgYmxvY2sKKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAqIEFkZCBhIG5hbWUgdG8gdGhlIGxlYWYgYXR0cmlidXRlIGxpc3Qgc3RydWN0dXJlCisgKgorICogVGhpcyBsZWFmIGJsb2NrIGNhbm5vdCBoYXZlIGEgInJlbW90ZSIgdmFsdWUsIHdlIG9ubHkgY2FsbCB0aGlzIHJvdXRpbmUKKyAqIGlmIGJtYXBfb25lX2Jsb2NrKCkgc2F5cyB0aGVyZSBpcyBvbmx5IG9uZSBibG9jayAoaWU6IG5vIHJlbW90ZSBibGtzKS4KKyAqLworaW50Cit4ZnNfYXR0cl9sZWFmX2FkZG5hbWUoeGZzX2RhX2FyZ3NfdCAqYXJncykKK3sKKwl4ZnNfaW5vZGVfdCAqZHA7CisJeGZzX2RhYnVmX3QgKmJwOworCWludCByZXR2YWwsIGVycm9yLCBjb21taXR0ZWQ7CisKKwkvKgorCSAqIFJlYWQgdGhlIChvbmx5KSBibG9jayBpbiB0aGUgYXR0cmlidXRlIGxpc3QgaW4uCisJICovCisJZHAgPSBhcmdzLT5kcDsKKwlhcmdzLT5ibGtubyA9IDA7CisJZXJyb3IgPSB4ZnNfZGFfcmVhZF9idWYoYXJncy0+dHJhbnMsIGFyZ3MtPmRwLCBhcmdzLT5ibGtubywgLTEsICZicCwKKwkJCQkJICAgICBYRlNfQVRUUl9GT1JLKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybihlcnJvcik7CisJQVNTRVJUKGJwICE9IE5VTEwpOworCisJLyoKKwkgKiBMb29rIHVwIHRoZSBnaXZlbiBhdHRyaWJ1dGUgaW4gdGhlIGxlYWYgYmxvY2suICBGaWd1cmUgb3V0IGlmCisJICogdGhlIGdpdmVuIGZsYWdzIHByb2R1Y2UgYW4gZXJyb3Igb3IgY2FsbCBmb3IgYW4gYXRvbWljIHJlbmFtZS4KKwkgKi8KKwlyZXR2YWwgPSB4ZnNfYXR0cl9sZWFmX2xvb2t1cF9pbnQoYnAsIGFyZ3MpOworCWlmICgoYXJncy0+ZmxhZ3MgJiBBVFRSX1JFUExBQ0UpICYmIChyZXR2YWwgPT0gRU5PQVRUUikpIHsKKwkJeGZzX2RhX2JyZWxzZShhcmdzLT50cmFucywgYnApOworCQlyZXR1cm4ocmV0dmFsKTsKKwl9IGVsc2UgaWYgKHJldHZhbCA9PSBFRVhJU1QpIHsKKwkJaWYgKGFyZ3MtPmZsYWdzICYgQVRUUl9DUkVBVEUpIHsJLyogcHVyZSBjcmVhdGUgb3AgKi8KKwkJCXhmc19kYV9icmVsc2UoYXJncy0+dHJhbnMsIGJwKTsKKwkJCXJldHVybihyZXR2YWwpOworCQl9CisJCWFyZ3MtPnJlbmFtZSA9IDE7CQkJLyogYW4gYXRvbWljIHJlbmFtZSAqLworCQlhcmdzLT5ibGtubzIgPSBhcmdzLT5ibGtubzsJCS8qIHNldCAybmQgZW50cnkgaW5mbyovCisJCWFyZ3MtPmluZGV4MiA9IGFyZ3MtPmluZGV4OworCQlhcmdzLT5ybXRibGtubzIgPSBhcmdzLT5ybXRibGtubzsKKwkJYXJncy0+cm10YmxrY250MiA9IGFyZ3MtPnJtdGJsa2NudDsKKwl9CisKKwkvKgorCSAqIEFkZCB0aGUgYXR0cmlidXRlIHRvIHRoZSBsZWFmIGJsb2NrLCB0cmFuc2l0aW9uaW5nIHRvIGEgQnRyZWUKKwkgKiBpZiByZXF1aXJlZC4KKwkgKi8KKwlyZXR2YWwgPSB4ZnNfYXR0cl9sZWFmX2FkZChicCwgYXJncyk7CisJeGZzX2RhX2J1Zl9kb25lKGJwKTsKKwlpZiAocmV0dmFsID09IEVOT1NQQykgeworCQkvKgorCQkgKiBQcm9tb3RlIHRoZSBhdHRyaWJ1dGUgbGlzdCB0byB0aGUgQnRyZWUgZm9ybWF0LCB0aGVuCisJCSAqIENvbW1pdCB0aGF0IHRyYW5zYWN0aW9uIHNvIHRoYXQgdGhlIG5vZGVfYWRkbmFtZSgpIGNhbGwKKwkJICogY2FuIG1hbmFnZSBpdHMgb3duIHRyYW5zYWN0aW9ucy4KKwkJICovCisJCVhGU19CTUFQX0lOSVQoYXJncy0+Zmxpc3QsIGFyZ3MtPmZpcnN0YmxvY2spOworCQllcnJvciA9IHhmc19hdHRyX2xlYWZfdG9fbm9kZShhcmdzKTsKKwkJaWYgKCFlcnJvcikgeworCQkJZXJyb3IgPSB4ZnNfYm1hcF9maW5pc2goJmFyZ3MtPnRyYW5zLCBhcmdzLT5mbGlzdCwKKwkJCQkJCSphcmdzLT5maXJzdGJsb2NrLCAmY29tbWl0dGVkKTsKKwkJfQorCQlpZiAoZXJyb3IpIHsKKwkJCUFTU0VSVChjb21taXR0ZWQpOworCQkJYXJncy0+dHJhbnMgPSBOVUxMOworCQkJeGZzX2JtYXBfY2FuY2VsKGFyZ3MtPmZsaXN0KTsKKwkJCXJldHVybihlcnJvcik7CisJCX0KKworCQkvKgorCQkgKiBibWFwX2ZpbmlzaCgpIG1heSBoYXZlIGNvbW1pdHRlZCB0aGUgbGFzdCB0cmFucyBhbmQgc3RhcnRlZAorCQkgKiBhIG5ldyBvbmUuICBXZSBuZWVkIHRoZSBpbm9kZSB0byBiZSBpbiBhbGwgdHJhbnNhY3Rpb25zLgorCQkgKi8KKwkJaWYgKGNvbW1pdHRlZCkgeworCQkJeGZzX3RyYW5zX2lqb2luKGFyZ3MtPnRyYW5zLCBkcCwgWEZTX0lMT0NLX0VYQ0wpOworCQkJeGZzX3RyYW5zX2lob2xkKGFyZ3MtPnRyYW5zLCBkcCk7CisJCX0KKworCQkvKgorCQkgKiBDb21taXQgdGhlIGN1cnJlbnQgdHJhbnMgKGluY2x1ZGluZyB0aGUgaW5vZGUpIGFuZCBzdGFydAorCQkgKiBhIG5ldyBvbmUuCisJCSAqLworCQlpZiAoKGVycm9yID0geGZzX2F0dHJfcm9sbHRyYW5zKCZhcmdzLT50cmFucywgZHApKSkKKwkJCXJldHVybiAoZXJyb3IpOworCisJCS8qCisJCSAqIEZvYiB0aGUgd2hvbGUgcmVzdCBvZiB0aGUgcHJvYmxlbSBvZmYgb24gdGhlIEJ0cmVlIGNvZGUuCisJCSAqLworCQllcnJvciA9IHhmc19hdHRyX25vZGVfYWRkbmFtZShhcmdzKTsKKwkJcmV0dXJuKGVycm9yKTsKKwl9CisKKwkvKgorCSAqIENvbW1pdCB0aGUgdHJhbnNhY3Rpb24gdGhhdCBhZGRlZCB0aGUgYXR0ciBuYW1lIHNvIHRoYXQKKwkgKiBsYXRlciByb3V0aW5lcyBjYW4gbWFuYWdlIHRoZWlyIG93biB0cmFuc2FjdGlvbnMuCisJICovCisJaWYgKChlcnJvciA9IHhmc19hdHRyX3JvbGx0cmFucygmYXJncy0+dHJhbnMsIGRwKSkpCisJCXJldHVybiAoZXJyb3IpOworCisJLyoKKwkgKiBJZiB0aGVyZSB3YXMgYW4gb3V0LW9mLWxpbmUgdmFsdWUsIGFsbG9jYXRlIHRoZSBibG9ja3Mgd2UKKwkgKiBpZGVudGlmaWVkIGZvciBpdHMgc3RvcmFnZSBhbmQgY29weSB0aGUgdmFsdWUuICBUaGlzIGlzIGRvbmUKKwkgKiBhZnRlciB3ZSBjcmVhdGUgdGhlIGF0dHJpYnV0ZSBzbyB0aGF0IHdlIGRvbid0IG92ZXJmbG93IHRoZQorCSAqIG1heGltdW0gc2l6ZSBvZiBhIHRyYW5zYWN0aW9uIGFuZC9vciBoaXQgYSBkZWFkbG9jay4KKwkgKi8KKwlpZiAoYXJncy0+cm10Ymxrbm8gPiAwKSB7CisJCWVycm9yID0geGZzX2F0dHJfcm10dmFsX3NldChhcmdzKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuKGVycm9yKTsKKwl9CisKKwkvKgorCSAqIElmIHRoaXMgaXMgYW4gYXRvbWljIHJlbmFtZSBvcGVyYXRpb24sIHdlIG11c3QgImZsaXAiIHRoZQorCSAqIGluY29tcGxldGUgZmxhZ3Mgb24gdGhlICJuZXciIGFuZCAib2xkIiBhdHRyaWJ1dGUvdmFsdWUgcGFpcnMKKwkgKiBzbyB0aGF0IG9uZSBkaXNhcHBlYXJzIGFuZCBvbmUgYXBwZWFycyBhdG9taWNhbGx5LiAgVGhlbiB3ZQorCSAqIG11c3QgcmVtb3ZlIHRoZSAib2xkIiBhdHRyaWJ1dGUvdmFsdWUgcGFpci4KKwkgKi8KKwlpZiAoYXJncy0+cmVuYW1lKSB7CisJCS8qCisJCSAqIEluIGEgc2VwYXJhdGUgdHJhbnNhY3Rpb24sIHNldCB0aGUgaW5jb21wbGV0ZSBmbGFnIG9uIHRoZQorCQkgKiAib2xkIiBhdHRyIGFuZCBjbGVhciB0aGUgaW5jb21wbGV0ZSBmbGFnIG9uIHRoZSAibmV3IiBhdHRyLgorCQkgKi8KKwkJZXJyb3IgPSB4ZnNfYXR0cl9sZWFmX2ZsaXBmbGFncyhhcmdzKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuKGVycm9yKTsKKworCQkvKgorCQkgKiBEaXNtYW50bGUgdGhlICJvbGQiIGF0dHJpYnV0ZS92YWx1ZSBwYWlyIGJ5IHJlbW92aW5nCisJCSAqIGEgInJlbW90ZSIgdmFsdWUgKGlmIGl0IGV4aXN0cykuCisJCSAqLworCQlhcmdzLT5pbmRleCA9IGFyZ3MtPmluZGV4MjsKKwkJYXJncy0+Ymxrbm8gPSBhcmdzLT5ibGtubzI7CisJCWFyZ3MtPnJtdGJsa25vID0gYXJncy0+cm10Ymxrbm8yOworCQlhcmdzLT5ybXRibGtjbnQgPSBhcmdzLT5ybXRibGtjbnQyOworCQlpZiAoYXJncy0+cm10Ymxrbm8pIHsKKwkJCWVycm9yID0geGZzX2F0dHJfcm10dmFsX3JlbW92ZShhcmdzKTsKKwkJCWlmIChlcnJvcikKKwkJCQlyZXR1cm4oZXJyb3IpOworCQl9CisKKwkJLyoKKwkJICogUmVhZCBpbiB0aGUgYmxvY2sgY29udGFpbmluZyB0aGUgIm9sZCIgYXR0ciwgdGhlbgorCQkgKiByZW1vdmUgdGhlICJvbGQiIGF0dHIgZnJvbSB0aGF0IGJsb2NrIChuZWF0LCBodWghKQorCQkgKi8KKwkJZXJyb3IgPSB4ZnNfZGFfcmVhZF9idWYoYXJncy0+dHJhbnMsIGFyZ3MtPmRwLCBhcmdzLT5ibGtubywgLTEsCisJCQkJCQkgICAgICZicCwgWEZTX0FUVFJfRk9SSyk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybihlcnJvcik7CisJCUFTU0VSVChicCAhPSBOVUxMKTsKKwkJKHZvaWQpeGZzX2F0dHJfbGVhZl9yZW1vdmUoYnAsIGFyZ3MpOworCisJCS8qCisJCSAqIElmIHRoZSByZXN1bHQgaXMgc21hbGwgZW5vdWdoLCBzaHJpbmsgaXQgYWxsIGludG8gdGhlIGlub2RlLgorCQkgKi8KKwkJaWYgKHhmc19hdHRyX3Nob3J0Zm9ybV9hbGxmaXQoYnAsIGRwKSkgeworCQkJWEZTX0JNQVBfSU5JVChhcmdzLT5mbGlzdCwgYXJncy0+Zmlyc3RibG9jayk7CisJCQllcnJvciA9IHhmc19hdHRyX2xlYWZfdG9fc2hvcnRmb3JtKGJwLCBhcmdzKTsKKwkJCS8qIGJwIGlzIGdvbmUgZHVlIHRvIHhmc19kYV9zaHJpbmtfaW5vZGUgKi8KKwkJCWlmICghZXJyb3IpIHsKKwkJCQllcnJvciA9IHhmc19ibWFwX2ZpbmlzaCgmYXJncy0+dHJhbnMsCisJCQkJCQkJYXJncy0+Zmxpc3QsCisJCQkJCQkJKmFyZ3MtPmZpcnN0YmxvY2ssCisJCQkJCQkJJmNvbW1pdHRlZCk7CisJCQl9CisJCQlpZiAoZXJyb3IpIHsKKwkJCQlBU1NFUlQoY29tbWl0dGVkKTsKKwkJCQlhcmdzLT50cmFucyA9IE5VTEw7CisJCQkJeGZzX2JtYXBfY2FuY2VsKGFyZ3MtPmZsaXN0KTsKKwkJCQlyZXR1cm4oZXJyb3IpOworCQkJfQorCisJCQkvKgorCQkJICogYm1hcF9maW5pc2goKSBtYXkgaGF2ZSBjb21taXR0ZWQgdGhlIGxhc3QgdHJhbnMKKwkJCSAqIGFuZCBzdGFydGVkIGEgbmV3IG9uZS4gIFdlIG5lZWQgdGhlIGlub2RlIHRvIGJlCisJCQkgKiBpbiBhbGwgdHJhbnNhY3Rpb25zLgorCQkJICovCisJCQlpZiAoY29tbWl0dGVkKSB7CisJCQkJeGZzX3RyYW5zX2lqb2luKGFyZ3MtPnRyYW5zLCBkcCwgWEZTX0lMT0NLX0VYQ0wpOworCQkJCXhmc190cmFuc19paG9sZChhcmdzLT50cmFucywgZHApOworCQkJfQorCQl9IGVsc2UKKwkJCXhmc19kYV9idWZfZG9uZShicCk7CisKKwkJLyoKKwkJICogQ29tbWl0IHRoZSByZW1vdmUgYW5kIHN0YXJ0IHRoZSBuZXh0IHRyYW5zIGluIHNlcmllcy4KKwkJICovCisJCWVycm9yID0geGZzX2F0dHJfcm9sbHRyYW5zKCZhcmdzLT50cmFucywgZHApOworCisJfSBlbHNlIGlmIChhcmdzLT5ybXRibGtubyA+IDApIHsKKwkJLyoKKwkJICogQWRkZWQgYSAicmVtb3RlIiB2YWx1ZSwganVzdCBjbGVhciB0aGUgaW5jb21wbGV0ZSBmbGFnLgorCQkgKi8KKwkJZXJyb3IgPSB4ZnNfYXR0cl9sZWFmX2NsZWFyZmxhZyhhcmdzKTsKKwl9CisJcmV0dXJuKGVycm9yKTsKK30KKworLyoKKyAqIFJlbW92ZSBhIG5hbWUgZnJvbSB0aGUgbGVhZiBhdHRyaWJ1dGUgbGlzdCBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGxlYWYgYmxvY2sgY2Fubm90IGhhdmUgYSAicmVtb3RlIiB2YWx1ZSwgd2Ugb25seSBjYWxsIHRoaXMgcm91dGluZQorICogaWYgYm1hcF9vbmVfYmxvY2soKSBzYXlzIHRoZXJlIGlzIG9ubHkgb25lIGJsb2NrIChpZTogbm8gcmVtb3RlIGJsa3MpLgorICovCitTVEFUSUMgaW50Cit4ZnNfYXR0cl9sZWFmX3JlbW92ZW5hbWUoeGZzX2RhX2FyZ3NfdCAqYXJncykKK3sKKwl4ZnNfaW5vZGVfdCAqZHA7CisJeGZzX2RhYnVmX3QgKmJwOworCWludCBjb21taXR0ZWQ7CisJaW50IGVycm9yOworCisJLyoKKwkgKiBSZW1vdmUgdGhlIGF0dHJpYnV0ZS4KKwkgKi8KKwlkcCA9IGFyZ3MtPmRwOworCWFyZ3MtPmJsa25vID0gMDsKKwllcnJvciA9IHhmc19kYV9yZWFkX2J1ZihhcmdzLT50cmFucywgYXJncy0+ZHAsIGFyZ3MtPmJsa25vLCAtMSwgJmJwLAorCQkJCQkgICAgIFhGU19BVFRSX0ZPUkspOworCWlmIChlcnJvcikgeworCQlyZXR1cm4oZXJyb3IpOworCX0KKworCUFTU0VSVChicCAhPSBOVUxMKTsKKwllcnJvciA9IHhmc19hdHRyX2xlYWZfbG9va3VwX2ludChicCwgYXJncyk7CisJaWYgKGVycm9yID09IEVOT0FUVFIpIHsKKwkJeGZzX2RhX2JyZWxzZShhcmdzLT50cmFucywgYnApOworCQlyZXR1cm4oZXJyb3IpOworCX0KKworCSh2b2lkKXhmc19hdHRyX2xlYWZfcmVtb3ZlKGJwLCBhcmdzKTsKKworCS8qCisJICogSWYgdGhlIHJlc3VsdCBpcyBzbWFsbCBlbm91Z2gsIHNocmluayBpdCBhbGwgaW50byB0aGUgaW5vZGUuCisJICovCisJaWYgKHhmc19hdHRyX3Nob3J0Zm9ybV9hbGxmaXQoYnAsIGRwKSkgeworCQlYRlNfQk1BUF9JTklUKGFyZ3MtPmZsaXN0LCBhcmdzLT5maXJzdGJsb2NrKTsKKwkJZXJyb3IgPSB4ZnNfYXR0cl9sZWFmX3RvX3Nob3J0Zm9ybShicCwgYXJncyk7CisJCS8qIGJwIGlzIGdvbmUgZHVlIHRvIHhmc19kYV9zaHJpbmtfaW5vZGUgKi8KKwkJaWYgKCFlcnJvcikgeworCQkJZXJyb3IgPSB4ZnNfYm1hcF9maW5pc2goJmFyZ3MtPnRyYW5zLCBhcmdzLT5mbGlzdCwKKwkJCQkJCSphcmdzLT5maXJzdGJsb2NrLCAmY29tbWl0dGVkKTsKKwkJfQorCQlpZiAoZXJyb3IpIHsKKwkJCUFTU0VSVChjb21taXR0ZWQpOworCQkJYXJncy0+dHJhbnMgPSBOVUxMOworCQkJeGZzX2JtYXBfY2FuY2VsKGFyZ3MtPmZsaXN0KTsKKwkJCXJldHVybihlcnJvcik7CisJCX0KKworCQkvKgorCQkgKiBibWFwX2ZpbmlzaCgpIG1heSBoYXZlIGNvbW1pdHRlZCB0aGUgbGFzdCB0cmFucyBhbmQgc3RhcnRlZAorCQkgKiBhIG5ldyBvbmUuICBXZSBuZWVkIHRoZSBpbm9kZSB0byBiZSBpbiBhbGwgdHJhbnNhY3Rpb25zLgorCQkgKi8KKwkJaWYgKGNvbW1pdHRlZCkgeworCQkJeGZzX3RyYW5zX2lqb2luKGFyZ3MtPnRyYW5zLCBkcCwgWEZTX0lMT0NLX0VYQ0wpOworCQkJeGZzX3RyYW5zX2lob2xkKGFyZ3MtPnRyYW5zLCBkcCk7CisJCX0KKwl9IGVsc2UKKwkJeGZzX2RhX2J1Zl9kb25lKGJwKTsKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBMb29rIHVwIGEgbmFtZSBpbiBhIGxlYWYgYXR0cmlidXRlIGxpc3Qgc3RydWN0dXJlLgorICoKKyAqIFRoaXMgbGVhZiBibG9jayBjYW5ub3QgaGF2ZSBhICJyZW1vdGUiIHZhbHVlLCB3ZSBvbmx5IGNhbGwgdGhpcyByb3V0aW5lCisgKiBpZiBibWFwX29uZV9ibG9jaygpIHNheXMgdGhlcmUgaXMgb25seSBvbmUgYmxvY2sgKGllOiBubyByZW1vdGUgYmxrcykuCisgKi8KK2ludAoreGZzX2F0dHJfbGVhZl9nZXQoeGZzX2RhX2FyZ3NfdCAqYXJncykKK3sKKwl4ZnNfZGFidWZfdCAqYnA7CisJaW50IGVycm9yOworCisJYXJncy0+Ymxrbm8gPSAwOworCWVycm9yID0geGZzX2RhX3JlYWRfYnVmKGFyZ3MtPnRyYW5zLCBhcmdzLT5kcCwgYXJncy0+Ymxrbm8sIC0xLCAmYnAsCisJCQkJCSAgICAgWEZTX0FUVFJfRk9SSyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4oZXJyb3IpOworCUFTU0VSVChicCAhPSBOVUxMKTsKKworCWVycm9yID0geGZzX2F0dHJfbGVhZl9sb29rdXBfaW50KGJwLCBhcmdzKTsKKwlpZiAoZXJyb3IgIT0gRUVYSVNUKSAgeworCQl4ZnNfZGFfYnJlbHNlKGFyZ3MtPnRyYW5zLCBicCk7CisJCXJldHVybihlcnJvcik7CisJfQorCWVycm9yID0geGZzX2F0dHJfbGVhZl9nZXR2YWx1ZShicCwgYXJncyk7CisJeGZzX2RhX2JyZWxzZShhcmdzLT50cmFucywgYnApOworCWlmICghZXJyb3IgJiYgKGFyZ3MtPnJtdGJsa25vID4gMCkgJiYgIShhcmdzLT5mbGFncyAmIEFUVFJfS0VSTk9WQUwpKSB7CisJCWVycm9yID0geGZzX2F0dHJfcm10dmFsX2dldChhcmdzKTsKKwl9CisJcmV0dXJuKGVycm9yKTsKK30KKworLyoKKyAqIENvcHkgb3V0IGF0dHJpYnV0ZSBlbnRyaWVzIGZvciBhdHRyX2xpc3QoKSwgZm9yIGxlYWYgYXR0cmlidXRlIGxpc3RzLgorICovCitTVEFUSUMgaW50Cit4ZnNfYXR0cl9sZWFmX2xpc3QoeGZzX2F0dHJfbGlzdF9jb250ZXh0X3QgKmNvbnRleHQpCit7CisJeGZzX2F0dHJfbGVhZmJsb2NrX3QgKmxlYWY7CisJaW50IGVycm9yOworCXhmc19kYWJ1Zl90ICpicDsKKworCWNvbnRleHQtPmN1cnNvci0+Ymxrbm8gPSAwOworCWVycm9yID0geGZzX2RhX3JlYWRfYnVmKE5VTEwsIGNvbnRleHQtPmRwLCAwLCAtMSwgJmJwLCBYRlNfQVRUUl9GT1JLKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybihlcnJvcik7CisJQVNTRVJUKGJwICE9IE5VTEwpOworCWxlYWYgPSBicC0+ZGF0YTsKKwlpZiAodW5saWtlbHkoSU5UX0dFVChsZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKQorCQkJCQkJIT0gWEZTX0FUVFJfTEVBRl9NQUdJQykpIHsKKwkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhmc19hdHRyX2xlYWZfbGlzdCIsIFhGU19FUlJMRVZFTF9MT1csCisJCQkJICAgICBjb250ZXh0LT5kcC0+aV9tb3VudCwgbGVhZik7CisJCXhmc19kYV9icmVsc2UoTlVMTCwgYnApOworCQlyZXR1cm4oWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCkpOworCX0KKworCSh2b2lkKXhmc19hdHRyX2xlYWZfbGlzdF9pbnQoYnAsIGNvbnRleHQpOworCXhmc19kYV9icmVsc2UoTlVMTCwgYnApOworCXJldHVybigwKTsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRXh0ZXJuYWwgcm91dGluZXMgd2hlbiBhdHRyaWJ1dGUgbGlzdCBzaXplID4gWEZTX0xCU0laRShtcCkuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgKiBBZGQgYSBuYW1lIHRvIGEgQnRyZWUtZm9ybWF0IGF0dHJpYnV0ZSBsaXN0LgorICoKKyAqIFRoaXMgd2lsbCBpbnZvbHZlIHdhbGtpbmcgZG93biB0aGUgQnRyZWUsIGFuZCBtYXkgaW52b2x2ZSBzcGxpdHRpbmcKKyAqIGxlYWYgbm9kZXMgYW5kIGV2ZW4gc3BsaXR0aW5nIGludGVybWVkaWF0ZSBub2RlcyB1cCB0byBhbmQgaW5jbHVkaW5nCisgKiB0aGUgcm9vdCBub2RlIChhIHNwZWNpYWwgY2FzZSBvZiBhbiBpbnRlcm1lZGlhdGUgbm9kZSkuCisgKgorICogIlJlbW90ZSIgYXR0cmlidXRlIHZhbHVlcyBjb25mdXNlIHRoZSBpc3N1ZSBhbmQgYXRvbWljIHJlbmFtZSBvcGVyYXRpb25zCisgKiBhZGQgYSB3aG9sZSBleHRyYSBsYXllciBvZiBjb25mdXNpb24gb24gdG9wIG9mIHRoYXQuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19hdHRyX25vZGVfYWRkbmFtZSh4ZnNfZGFfYXJnc190ICphcmdzKQoreworCXhmc19kYV9zdGF0ZV90ICpzdGF0ZTsKKwl4ZnNfZGFfc3RhdGVfYmxrX3QgKmJsazsKKwl4ZnNfaW5vZGVfdCAqZHA7CisJeGZzX21vdW50X3QgKm1wOworCWludCBjb21taXR0ZWQsIHJldHZhbCwgZXJyb3I7CisKKwkvKgorCSAqIEZpbGwgaW4gYnVja2V0IG9mIGFyZ3VtZW50cy9yZXN1bHRzL2NvbnRleHQgdG8gY2FycnkgYXJvdW5kLgorCSAqLworCWRwID0gYXJncy0+ZHA7CisJbXAgPSBkcC0+aV9tb3VudDsKK3Jlc3RhcnQ6CisJc3RhdGUgPSB4ZnNfZGFfc3RhdGVfYWxsb2MoKTsKKwlzdGF0ZS0+YXJncyA9IGFyZ3M7CisJc3RhdGUtPm1wID0gbXA7CisJc3RhdGUtPmJsb2Nrc2l6ZSA9IHN0YXRlLT5tcC0+bV9zYi5zYl9ibG9ja3NpemU7CisJc3RhdGUtPm5vZGVfZW50cyA9IHN0YXRlLT5tcC0+bV9hdHRyX25vZGVfZW50czsKKworCS8qCisJICogU2VhcmNoIHRvIHNlZSBpZiBuYW1lIGFscmVhZHkgZXhpc3RzLCBhbmQgZ2V0IGJhY2sgYSBwb2ludGVyCisJICogdG8gd2hlcmUgaXQgc2hvdWxkIGdvLgorCSAqLworCWVycm9yID0geGZzX2RhX25vZGVfbG9va3VwX2ludChzdGF0ZSwgJnJldHZhbCk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKwlibGsgPSAmc3RhdGUtPnBhdGguYmxrWyBzdGF0ZS0+cGF0aC5hY3RpdmUtMSBdOworCUFTU0VSVChibGstPm1hZ2ljID09IFhGU19BVFRSX0xFQUZfTUFHSUMpOworCWlmICgoYXJncy0+ZmxhZ3MgJiBBVFRSX1JFUExBQ0UpICYmIChyZXR2YWwgPT0gRU5PQVRUUikpIHsKKwkJZ290byBvdXQ7CisJfSBlbHNlIGlmIChyZXR2YWwgPT0gRUVYSVNUKSB7CisJCWlmIChhcmdzLT5mbGFncyAmIEFUVFJfQ1JFQVRFKQorCQkJZ290byBvdXQ7CisJCWFyZ3MtPnJlbmFtZSA9IDE7CQkJLyogYXRvbWljIHJlbmFtZSBvcCAqLworCQlhcmdzLT5ibGtubzIgPSBhcmdzLT5ibGtubzsJCS8qIHNldCAybmQgZW50cnkgaW5mbyovCisJCWFyZ3MtPmluZGV4MiA9IGFyZ3MtPmluZGV4OworCQlhcmdzLT5ybXRibGtubzIgPSBhcmdzLT5ybXRibGtubzsKKwkJYXJncy0+cm10YmxrY250MiA9IGFyZ3MtPnJtdGJsa2NudDsKKwkJYXJncy0+cm10Ymxrbm8gPSAwOworCQlhcmdzLT5ybXRibGtjbnQgPSAwOworCX0KKworCXJldHZhbCA9IHhmc19hdHRyX2xlYWZfYWRkKGJsay0+YnAsIHN0YXRlLT5hcmdzKTsKKwlpZiAocmV0dmFsID09IEVOT1NQQykgeworCQlpZiAoc3RhdGUtPnBhdGguYWN0aXZlID09IDEpIHsKKwkJCS8qCisJCQkgKiBJdHMgcmVhbGx5IGEgc2luZ2xlIGxlYWYgbm9kZSwgYnV0IGl0IGhhZAorCQkJICogb3V0LW9mLWxpbmUgdmFsdWVzIHNvIGl0IGxvb2tlZCBsaWtlIGl0ICptaWdodCoKKwkJCSAqIGhhdmUgYmVlbiBhIGItdHJlZS4KKwkJCSAqLworCQkJeGZzX2RhX3N0YXRlX2ZyZWUoc3RhdGUpOworCQkJWEZTX0JNQVBfSU5JVChhcmdzLT5mbGlzdCwgYXJncy0+Zmlyc3RibG9jayk7CisJCQllcnJvciA9IHhmc19hdHRyX2xlYWZfdG9fbm9kZShhcmdzKTsKKwkJCWlmICghZXJyb3IpIHsKKwkJCQllcnJvciA9IHhmc19ibWFwX2ZpbmlzaCgmYXJncy0+dHJhbnMsCisJCQkJCQkJYXJncy0+Zmxpc3QsCisJCQkJCQkJKmFyZ3MtPmZpcnN0YmxvY2ssCisJCQkJCQkJJmNvbW1pdHRlZCk7CisJCQl9CisJCQlpZiAoZXJyb3IpIHsKKwkJCQlBU1NFUlQoY29tbWl0dGVkKTsKKwkJCQlhcmdzLT50cmFucyA9IE5VTEw7CisJCQkJeGZzX2JtYXBfY2FuY2VsKGFyZ3MtPmZsaXN0KTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJLyoKKwkJCSAqIGJtYXBfZmluaXNoKCkgbWF5IGhhdmUgY29tbWl0dGVkIHRoZSBsYXN0IHRyYW5zCisJCQkgKiBhbmQgc3RhcnRlZCBhIG5ldyBvbmUuICBXZSBuZWVkIHRoZSBpbm9kZSB0byBiZQorCQkJICogaW4gYWxsIHRyYW5zYWN0aW9ucy4KKwkJCSAqLworCQkJaWYgKGNvbW1pdHRlZCkgeworCQkJCXhmc190cmFuc19pam9pbihhcmdzLT50cmFucywgZHAsIFhGU19JTE9DS19FWENMKTsKKwkJCQl4ZnNfdHJhbnNfaWhvbGQoYXJncy0+dHJhbnMsIGRwKTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIENvbW1pdCB0aGUgbm9kZSBjb252ZXJzaW9uIGFuZCBzdGFydCB0aGUgbmV4dAorCQkJICogdHJhbnMgaW4gdGhlIGNoYWluLgorCQkJICovCisJCQlpZiAoKGVycm9yID0geGZzX2F0dHJfcm9sbHRyYW5zKCZhcmdzLT50cmFucywgZHApKSkKKwkJCQlnb3RvIG91dDsKKworCQkJZ290byByZXN0YXJ0OworCQl9CisKKwkJLyoKKwkJICogU3BsaXQgYXMgbWFueSBCdHJlZSBlbGVtZW50cyBhcyByZXF1aXJlZC4KKwkJICogVGhpcyBjb2RlIHRyYWNrcyB0aGUgbmV3IGFuZCBvbGQgYXR0cidzIGxvY2F0aW9uCisJCSAqIGluIHRoZSBpbmRleC9ibGtuby9ybXRibGtuby9ybXRibGtjbnQgZmllbGRzIGFuZAorCQkgKiBpbiB0aGUgaW5kZXgyL2Jsa25vMi9ybXRibGtubzIvcm10YmxrY250MiBmaWVsZHMuCisJCSAqLworCQlYRlNfQk1BUF9JTklUKGFyZ3MtPmZsaXN0LCBhcmdzLT5maXJzdGJsb2NrKTsKKwkJZXJyb3IgPSB4ZnNfZGFfc3BsaXQoc3RhdGUpOworCQlpZiAoIWVycm9yKSB7CisJCQllcnJvciA9IHhmc19ibWFwX2ZpbmlzaCgmYXJncy0+dHJhbnMsIGFyZ3MtPmZsaXN0LAorCQkJCQkJKmFyZ3MtPmZpcnN0YmxvY2ssICZjb21taXR0ZWQpOworCQl9CisJCWlmIChlcnJvcikgeworCQkJQVNTRVJUKGNvbW1pdHRlZCk7CisJCQlhcmdzLT50cmFucyA9IE5VTEw7CisJCQl4ZnNfYm1hcF9jYW5jZWwoYXJncy0+Zmxpc3QpOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKgorCQkgKiBibWFwX2ZpbmlzaCgpIG1heSBoYXZlIGNvbW1pdHRlZCB0aGUgbGFzdCB0cmFucyBhbmQgc3RhcnRlZAorCQkgKiBhIG5ldyBvbmUuICBXZSBuZWVkIHRoZSBpbm9kZSB0byBiZSBpbiBhbGwgdHJhbnNhY3Rpb25zLgorCQkgKi8KKwkJaWYgKGNvbW1pdHRlZCkgeworCQkJeGZzX3RyYW5zX2lqb2luKGFyZ3MtPnRyYW5zLCBkcCwgWEZTX0lMT0NLX0VYQ0wpOworCQkJeGZzX3RyYW5zX2lob2xkKGFyZ3MtPnRyYW5zLCBkcCk7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBBZGRpdGlvbiBzdWNjZWVkZWQsIHVwZGF0ZSBCdHJlZSBoYXNodmFscy4KKwkJICovCisJCXhmc19kYV9maXhoYXNocGF0aChzdGF0ZSwgJnN0YXRlLT5wYXRoKTsKKwl9CisKKwkvKgorCSAqIEtpbGwgdGhlIHN0YXRlIHN0cnVjdHVyZSwgd2UncmUgZG9uZSB3aXRoIGl0IGFuZCBuZWVkIHRvCisJICogYWxsb3cgdGhlIGJ1ZmZlcnMgdG8gY29tZSBiYWNrIGxhdGVyLgorCSAqLworCXhmc19kYV9zdGF0ZV9mcmVlKHN0YXRlKTsKKwlzdGF0ZSA9IE5VTEw7CisKKwkvKgorCSAqIENvbW1pdCB0aGUgbGVhZiBhZGRpdGlvbiBvciBidHJlZSBzcGxpdCBhbmQgc3RhcnQgdGhlIG5leHQKKwkgKiB0cmFucyBpbiB0aGUgY2hhaW4uCisJICovCisJaWYgKChlcnJvciA9IHhmc19hdHRyX3JvbGx0cmFucygmYXJncy0+dHJhbnMsIGRwKSkpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBJZiB0aGVyZSB3YXMgYW4gb3V0LW9mLWxpbmUgdmFsdWUsIGFsbG9jYXRlIHRoZSBibG9ja3Mgd2UKKwkgKiBpZGVudGlmaWVkIGZvciBpdHMgc3RvcmFnZSBhbmQgY29weSB0aGUgdmFsdWUuICBUaGlzIGlzIGRvbmUKKwkgKiBhZnRlciB3ZSBjcmVhdGUgdGhlIGF0dHJpYnV0ZSBzbyB0aGF0IHdlIGRvbid0IG92ZXJmbG93IHRoZQorCSAqIG1heGltdW0gc2l6ZSBvZiBhIHRyYW5zYWN0aW9uIGFuZC9vciBoaXQgYSBkZWFkbG9jay4KKwkgKi8KKwlpZiAoYXJncy0+cm10Ymxrbm8gPiAwKSB7CisJCWVycm9yID0geGZzX2F0dHJfcm10dmFsX3NldChhcmdzKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuKGVycm9yKTsKKwl9CisKKwkvKgorCSAqIElmIHRoaXMgaXMgYW4gYXRvbWljIHJlbmFtZSBvcGVyYXRpb24sIHdlIG11c3QgImZsaXAiIHRoZQorCSAqIGluY29tcGxldGUgZmxhZ3Mgb24gdGhlICJuZXciIGFuZCAib2xkIiBhdHRyaWJ1dGUvdmFsdWUgcGFpcnMKKwkgKiBzbyB0aGF0IG9uZSBkaXNhcHBlYXJzIGFuZCBvbmUgYXBwZWFycyBhdG9taWNhbGx5LiAgVGhlbiB3ZQorCSAqIG11c3QgcmVtb3ZlIHRoZSAib2xkIiBhdHRyaWJ1dGUvdmFsdWUgcGFpci4KKwkgKi8KKwlpZiAoYXJncy0+cmVuYW1lKSB7CisJCS8qCisJCSAqIEluIGEgc2VwYXJhdGUgdHJhbnNhY3Rpb24sIHNldCB0aGUgaW5jb21wbGV0ZSBmbGFnIG9uIHRoZQorCQkgKiAib2xkIiBhdHRyIGFuZCBjbGVhciB0aGUgaW5jb21wbGV0ZSBmbGFnIG9uIHRoZSAibmV3IiBhdHRyLgorCQkgKi8KKwkJZXJyb3IgPSB4ZnNfYXR0cl9sZWFmX2ZsaXBmbGFncyhhcmdzKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXQ7CisKKwkJLyoKKwkJICogRGlzbWFudGxlIHRoZSAib2xkIiBhdHRyaWJ1dGUvdmFsdWUgcGFpciBieSByZW1vdmluZworCQkgKiBhICJyZW1vdGUiIHZhbHVlIChpZiBpdCBleGlzdHMpLgorCQkgKi8KKwkJYXJncy0+aW5kZXggPSBhcmdzLT5pbmRleDI7CisJCWFyZ3MtPmJsa25vID0gYXJncy0+Ymxrbm8yOworCQlhcmdzLT5ybXRibGtubyA9IGFyZ3MtPnJtdGJsa25vMjsKKwkJYXJncy0+cm10YmxrY250ID0gYXJncy0+cm10YmxrY250MjsKKwkJaWYgKGFyZ3MtPnJtdGJsa25vKSB7CisJCQllcnJvciA9IHhmc19hdHRyX3JtdHZhbF9yZW1vdmUoYXJncyk7CisJCQlpZiAoZXJyb3IpCisJCQkJcmV0dXJuKGVycm9yKTsKKwkJfQorCisJCS8qCisJCSAqIFJlLWZpbmQgdGhlICJvbGQiIGF0dHJpYnV0ZSBlbnRyeSBhZnRlciBhbnkgc3BsaXQgb3BzLgorCQkgKiBUaGUgSU5DT01QTEVURSBmbGFnIG1lYW5zIHRoYXQgd2Ugd2lsbCBmaW5kIHRoZSAib2xkIgorCQkgKiBhdHRyLCBub3QgdGhlICJuZXciIG9uZS4KKwkJICovCisJCWFyZ3MtPmZsYWdzIHw9IFhGU19BVFRSX0lOQ09NUExFVEU7CisJCXN0YXRlID0geGZzX2RhX3N0YXRlX2FsbG9jKCk7CisJCXN0YXRlLT5hcmdzID0gYXJnczsKKwkJc3RhdGUtPm1wID0gbXA7CisJCXN0YXRlLT5ibG9ja3NpemUgPSBzdGF0ZS0+bXAtPm1fc2Iuc2JfYmxvY2tzaXplOworCQlzdGF0ZS0+bm9kZV9lbnRzID0gc3RhdGUtPm1wLT5tX2F0dHJfbm9kZV9lbnRzOworCQlzdGF0ZS0+aW5sZWFmID0gMDsKKwkJZXJyb3IgPSB4ZnNfZGFfbm9kZV9sb29rdXBfaW50KHN0YXRlLCAmcmV0dmFsKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXQ7CisKKwkJLyoKKwkJICogUmVtb3ZlIHRoZSBuYW1lIGFuZCB1cGRhdGUgdGhlIGhhc2h2YWxzIGluIHRoZSB0cmVlLgorCQkgKi8KKwkJYmxrID0gJnN0YXRlLT5wYXRoLmJsa1sgc3RhdGUtPnBhdGguYWN0aXZlLTEgXTsKKwkJQVNTRVJUKGJsay0+bWFnaWMgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisJCWVycm9yID0geGZzX2F0dHJfbGVhZl9yZW1vdmUoYmxrLT5icCwgYXJncyk7CisJCXhmc19kYV9maXhoYXNocGF0aChzdGF0ZSwgJnN0YXRlLT5wYXRoKTsKKworCQkvKgorCQkgKiBDaGVjayB0byBzZWUgaWYgdGhlIHRyZWUgbmVlZHMgdG8gYmUgY29sbGFwc2VkLgorCQkgKi8KKwkJaWYgKHJldHZhbCAmJiAoc3RhdGUtPnBhdGguYWN0aXZlID4gMSkpIHsKKwkJCVhGU19CTUFQX0lOSVQoYXJncy0+Zmxpc3QsIGFyZ3MtPmZpcnN0YmxvY2spOworCQkJZXJyb3IgPSB4ZnNfZGFfam9pbihzdGF0ZSk7CisJCQlpZiAoIWVycm9yKSB7CisJCQkJZXJyb3IgPSB4ZnNfYm1hcF9maW5pc2goJmFyZ3MtPnRyYW5zLAorCQkJCQkJCWFyZ3MtPmZsaXN0LAorCQkJCQkJCSphcmdzLT5maXJzdGJsb2NrLAorCQkJCQkJCSZjb21taXR0ZWQpOworCQkJfQorCQkJaWYgKGVycm9yKSB7CisJCQkJQVNTRVJUKGNvbW1pdHRlZCk7CisJCQkJYXJncy0+dHJhbnMgPSBOVUxMOworCQkJCXhmc19ibWFwX2NhbmNlbChhcmdzLT5mbGlzdCk7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCS8qCisJCQkgKiBibWFwX2ZpbmlzaCgpIG1heSBoYXZlIGNvbW1pdHRlZCB0aGUgbGFzdCB0cmFucworCQkJICogYW5kIHN0YXJ0ZWQgYSBuZXcgb25lLiAgV2UgbmVlZCB0aGUgaW5vZGUgdG8gYmUKKwkJCSAqIGluIGFsbCB0cmFuc2FjdGlvbnMuCisJCQkgKi8KKwkJCWlmIChjb21taXR0ZWQpIHsKKwkJCQl4ZnNfdHJhbnNfaWpvaW4oYXJncy0+dHJhbnMsIGRwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCQkJeGZzX3RyYW5zX2lob2xkKGFyZ3MtPnRyYW5zLCBkcCk7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBDb21taXQgYW5kIHN0YXJ0IHRoZSBuZXh0IHRyYW5zIGluIHRoZSBjaGFpbi4KKwkJICovCisJCWlmICgoZXJyb3IgPSB4ZnNfYXR0cl9yb2xsdHJhbnMoJmFyZ3MtPnRyYW5zLCBkcCkpKQorCQkJZ290byBvdXQ7CisKKwl9IGVsc2UgaWYgKGFyZ3MtPnJtdGJsa25vID4gMCkgeworCQkvKgorCQkgKiBBZGRlZCBhICJyZW1vdGUiIHZhbHVlLCBqdXN0IGNsZWFyIHRoZSBpbmNvbXBsZXRlIGZsYWcuCisJCSAqLworCQllcnJvciA9IHhmc19hdHRyX2xlYWZfY2xlYXJmbGFnKGFyZ3MpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dDsKKwl9CisJcmV0dmFsID0gZXJyb3IgPSAwOworCitvdXQ6CisJaWYgKHN0YXRlKQorCQl4ZnNfZGFfc3RhdGVfZnJlZShzdGF0ZSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4oZXJyb3IpOworCXJldHVybihyZXR2YWwpOworfQorCisvKgorICogUmVtb3ZlIGEgbmFtZSBmcm9tIGEgQi10cmVlIGF0dHJpYnV0ZSBsaXN0LgorICoKKyAqIFRoaXMgd2lsbCBpbnZvbHZlIHdhbGtpbmcgZG93biB0aGUgQnRyZWUsIGFuZCBtYXkgaW52b2x2ZSBqb2luaW5nCisgKiBsZWFmIG5vZGVzIGFuZCBldmVuIGpvaW5pbmcgaW50ZXJtZWRpYXRlIG5vZGVzIHVwIHRvIGFuZCBpbmNsdWRpbmcKKyAqIHRoZSByb290IG5vZGUgKGEgc3BlY2lhbCBjYXNlIG9mIGFuIGludGVybWVkaWF0ZSBub2RlKS4KKyAqLworU1RBVElDIGludAoreGZzX2F0dHJfbm9kZV9yZW1vdmVuYW1lKHhmc19kYV9hcmdzX3QgKmFyZ3MpCit7CisJeGZzX2RhX3N0YXRlX3QgKnN0YXRlOworCXhmc19kYV9zdGF0ZV9ibGtfdCAqYmxrOworCXhmc19pbm9kZV90ICpkcDsKKwl4ZnNfZGFidWZfdCAqYnA7CisJaW50IHJldHZhbCwgZXJyb3IsIGNvbW1pdHRlZDsKKworCS8qCisJICogVGllIGEgc3RyaW5nIGFyb3VuZCBvdXIgZmluZ2VyIHRvIHJlbWluZCB1cyB3aGVyZSB3ZSBhcmUuCisJICovCisJZHAgPSBhcmdzLT5kcDsKKwlzdGF0ZSA9IHhmc19kYV9zdGF0ZV9hbGxvYygpOworCXN0YXRlLT5hcmdzID0gYXJnczsKKwlzdGF0ZS0+bXAgPSBkcC0+aV9tb3VudDsKKwlzdGF0ZS0+YmxvY2tzaXplID0gc3RhdGUtPm1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZTsKKwlzdGF0ZS0+bm9kZV9lbnRzID0gc3RhdGUtPm1wLT5tX2F0dHJfbm9kZV9lbnRzOworCisJLyoKKwkgKiBTZWFyY2ggdG8gc2VlIGlmIG5hbWUgZXhpc3RzLCBhbmQgZ2V0IGJhY2sgYSBwb2ludGVyIHRvIGl0LgorCSAqLworCWVycm9yID0geGZzX2RhX25vZGVfbG9va3VwX2ludChzdGF0ZSwgJnJldHZhbCk7CisJaWYgKGVycm9yIHx8IChyZXR2YWwgIT0gRUVYSVNUKSkgeworCQlpZiAoZXJyb3IgPT0gMCkKKwkJCWVycm9yID0gcmV0dmFsOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIElmIHRoZXJlIGlzIGFuIG91dC1vZi1saW5lIHZhbHVlLCBkZS1hbGxvY2F0ZSB0aGUgYmxvY2tzLgorCSAqIFRoaXMgaXMgZG9uZSBiZWZvcmUgd2UgcmVtb3ZlIHRoZSBhdHRyaWJ1dGUgc28gdGhhdCB3ZSBkb24ndAorCSAqIG92ZXJmbG93IHRoZSBtYXhpbXVtIHNpemUgb2YgYSB0cmFuc2FjdGlvbiBhbmQvb3IgaGl0IGEgZGVhZGxvY2suCisJICovCisJYmxrID0gJnN0YXRlLT5wYXRoLmJsa1sgc3RhdGUtPnBhdGguYWN0aXZlLTEgXTsKKwlBU1NFUlQoYmxrLT5icCAhPSBOVUxMKTsKKwlBU1NFUlQoYmxrLT5tYWdpYyA9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKwlpZiAoYXJncy0+cm10Ymxrbm8gPiAwKSB7CisJCS8qCisJCSAqIEZpbGwgaW4gZGlzayBibG9jayBudW1iZXJzIGluIHRoZSBzdGF0ZSBzdHJ1Y3R1cmUKKwkJICogc28gdGhhdCB3ZSBjYW4gZ2V0IHRoZSBidWZmZXJzIGJhY2sgYWZ0ZXIgd2UgY29tbWl0CisJCSAqIHNldmVyYWwgdHJhbnNhY3Rpb25zIGluIHRoZSBmb2xsb3dpbmcgY2FsbHMuCisJCSAqLworCQllcnJvciA9IHhmc19hdHRyX2ZpbGxzdGF0ZShzdGF0ZSk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gb3V0OworCisJCS8qCisJCSAqIE1hcmsgdGhlIGF0dHJpYnV0ZSBhcyBJTkNPTVBMRVRFLCB0aGVuIGJ1bm1hcGkoKSB0aGUKKwkJICogcmVtb3RlIHZhbHVlLgorCQkgKi8KKwkJZXJyb3IgPSB4ZnNfYXR0cl9sZWFmX3NldGZsYWcoYXJncyk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gb3V0OworCQllcnJvciA9IHhmc19hdHRyX3JtdHZhbF9yZW1vdmUoYXJncyk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gb3V0OworCisJCS8qCisJCSAqIFJlZmlsbCB0aGUgc3RhdGUgc3RydWN0dXJlIHdpdGggYnVmZmVycywgdGhlIHByaW9yIGNhbGxzCisJCSAqIHJlbGVhc2VkIG91ciBidWZmZXJzLgorCQkgKi8KKwkJZXJyb3IgPSB4ZnNfYXR0cl9yZWZpbGxzdGF0ZShzdGF0ZSk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogUmVtb3ZlIHRoZSBuYW1lIGFuZCB1cGRhdGUgdGhlIGhhc2h2YWxzIGluIHRoZSB0cmVlLgorCSAqLworCWJsayA9ICZzdGF0ZS0+cGF0aC5ibGtbIHN0YXRlLT5wYXRoLmFjdGl2ZS0xIF07CisJQVNTRVJUKGJsay0+bWFnaWMgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisJcmV0dmFsID0geGZzX2F0dHJfbGVhZl9yZW1vdmUoYmxrLT5icCwgYXJncyk7CisJeGZzX2RhX2ZpeGhhc2hwYXRoKHN0YXRlLCAmc3RhdGUtPnBhdGgpOworCisJLyoKKwkgKiBDaGVjayB0byBzZWUgaWYgdGhlIHRyZWUgbmVlZHMgdG8gYmUgY29sbGFwc2VkLgorCSAqLworCWlmIChyZXR2YWwgJiYgKHN0YXRlLT5wYXRoLmFjdGl2ZSA+IDEpKSB7CisJCVhGU19CTUFQX0lOSVQoYXJncy0+Zmxpc3QsIGFyZ3MtPmZpcnN0YmxvY2spOworCQllcnJvciA9IHhmc19kYV9qb2luKHN0YXRlKTsKKwkJaWYgKCFlcnJvcikgeworCQkJZXJyb3IgPSB4ZnNfYm1hcF9maW5pc2goJmFyZ3MtPnRyYW5zLCBhcmdzLT5mbGlzdCwKKwkJCQkJCSphcmdzLT5maXJzdGJsb2NrLCAmY29tbWl0dGVkKTsKKwkJfQorCQlpZiAoZXJyb3IpIHsKKwkJCUFTU0VSVChjb21taXR0ZWQpOworCQkJYXJncy0+dHJhbnMgPSBOVUxMOworCQkJeGZzX2JtYXBfY2FuY2VsKGFyZ3MtPmZsaXN0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyoKKwkJICogYm1hcF9maW5pc2goKSBtYXkgaGF2ZSBjb21taXR0ZWQgdGhlIGxhc3QgdHJhbnMgYW5kIHN0YXJ0ZWQKKwkJICogYSBuZXcgb25lLiAgV2UgbmVlZCB0aGUgaW5vZGUgdG8gYmUgaW4gYWxsIHRyYW5zYWN0aW9ucy4KKwkJICovCisJCWlmIChjb21taXR0ZWQpIHsKKwkJCXhmc190cmFuc19pam9pbihhcmdzLT50cmFucywgZHAsIFhGU19JTE9DS19FWENMKTsKKwkJCXhmc190cmFuc19paG9sZChhcmdzLT50cmFucywgZHApOworCQl9CisKKwkJLyoKKwkJICogQ29tbWl0IHRoZSBCdHJlZSBqb2luIG9wZXJhdGlvbiBhbmQgc3RhcnQgYSBuZXcgdHJhbnMuCisJCSAqLworCQlpZiAoKGVycm9yID0geGZzX2F0dHJfcm9sbHRyYW5zKCZhcmdzLT50cmFucywgZHApKSkKKwkJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogSWYgdGhlIHJlc3VsdCBpcyBzbWFsbCBlbm91Z2gsIHB1c2ggaXQgYWxsIGludG8gdGhlIGlub2RlLgorCSAqLworCWlmICh4ZnNfYm1hcF9vbmVfYmxvY2soZHAsIFhGU19BVFRSX0ZPUkspKSB7CisJCS8qCisJCSAqIEhhdmUgdG8gZ2V0IHJpZCBvZiB0aGUgY29weSBvZiB0aGlzIGRhYnVmIGluIHRoZSBzdGF0ZS4KKwkJICovCisJCUFTU0VSVChzdGF0ZS0+cGF0aC5hY3RpdmUgPT0gMSk7CisJCUFTU0VSVChzdGF0ZS0+cGF0aC5ibGtbMF0uYnApOworCQl4ZnNfZGFfYnVmX2RvbmUoc3RhdGUtPnBhdGguYmxrWzBdLmJwKTsKKwkJc3RhdGUtPnBhdGguYmxrWzBdLmJwID0gTlVMTDsKKworCQllcnJvciA9IHhmc19kYV9yZWFkX2J1ZihhcmdzLT50cmFucywgYXJncy0+ZHAsIDAsIC0xLCAmYnAsCisJCQkJCQkgICAgIFhGU19BVFRSX0ZPUkspOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dDsKKwkJQVNTRVJUKElOVF9HRVQoKCh4ZnNfYXR0cl9sZWFmYmxvY2tfdCAqKQorCQkJCSAgICAgIGJwLT5kYXRhKS0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCSAgICAgICA9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKworCQlpZiAoeGZzX2F0dHJfc2hvcnRmb3JtX2FsbGZpdChicCwgZHApKSB7CisJCQlYRlNfQk1BUF9JTklUKGFyZ3MtPmZsaXN0LCBhcmdzLT5maXJzdGJsb2NrKTsKKwkJCWVycm9yID0geGZzX2F0dHJfbGVhZl90b19zaG9ydGZvcm0oYnAsIGFyZ3MpOworCQkJLyogYnAgaXMgZ29uZSBkdWUgdG8geGZzX2RhX3Nocmlua19pbm9kZSAqLworCQkJaWYgKCFlcnJvcikgeworCQkJCWVycm9yID0geGZzX2JtYXBfZmluaXNoKCZhcmdzLT50cmFucywKKwkJCQkJCQlhcmdzLT5mbGlzdCwKKwkJCQkJCQkqYXJncy0+Zmlyc3RibG9jaywKKwkJCQkJCQkmY29tbWl0dGVkKTsKKwkJCX0KKwkJCWlmIChlcnJvcikgeworCQkJCUFTU0VSVChjb21taXR0ZWQpOworCQkJCWFyZ3MtPnRyYW5zID0gTlVMTDsKKwkJCQl4ZnNfYm1hcF9jYW5jZWwoYXJncy0+Zmxpc3QpOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQkvKgorCQkJICogYm1hcF9maW5pc2goKSBtYXkgaGF2ZSBjb21taXR0ZWQgdGhlIGxhc3QgdHJhbnMKKwkJCSAqIGFuZCBzdGFydGVkIGEgbmV3IG9uZS4gIFdlIG5lZWQgdGhlIGlub2RlIHRvIGJlCisJCQkgKiBpbiBhbGwgdHJhbnNhY3Rpb25zLgorCQkJICovCisJCQlpZiAoY29tbWl0dGVkKSB7CisJCQkJeGZzX3RyYW5zX2lqb2luKGFyZ3MtPnRyYW5zLCBkcCwgWEZTX0lMT0NLX0VYQ0wpOworCQkJCXhmc190cmFuc19paG9sZChhcmdzLT50cmFucywgZHApOworCQkJfQorCQl9IGVsc2UKKwkJCXhmc19kYV9icmVsc2UoYXJncy0+dHJhbnMsIGJwKTsKKwl9CisJZXJyb3IgPSAwOworCitvdXQ6CisJeGZzX2RhX3N0YXRlX2ZyZWUoc3RhdGUpOworCXJldHVybihlcnJvcik7Cit9CisKKy8qCisgKiBGaWxsIGluIHRoZSBkaXNrIGJsb2NrIG51bWJlcnMgaW4gdGhlIHN0YXRlIHN0cnVjdHVyZSBmb3IgdGhlIGJ1ZmZlcnMKKyAqIHRoYXQgYXJlIGF0dGFjaGVkIHRvIHRoZSBzdGF0ZSBzdHJ1Y3R1cmUuCisgKiBUaGlzIGlzIGRvbmUgc28gdGhhdCB3ZSBjYW4gcXVpY2tseSByZWF0dGFjaCBvdXJzZWx2ZXMgdG8gdGhvc2UgYnVmZmVycworICogYWZ0ZXIgc29tZSBzZXQgb2YgdHJhbnNhY3Rpb24gY29tbWl0J3MgaGFzIHJlbGVhc2VkIHRoZXNlIGJ1ZmZlcnMuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19hdHRyX2ZpbGxzdGF0ZSh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUpCit7CisJeGZzX2RhX3N0YXRlX3BhdGhfdCAqcGF0aDsKKwl4ZnNfZGFfc3RhdGVfYmxrX3QgKmJsazsKKwlpbnQgbGV2ZWw7CisKKwkvKgorCSAqIFJvbGwgZG93biB0aGUgInBhdGgiIGluIHRoZSBzdGF0ZSBzdHJ1Y3R1cmUsIHN0b3JpbmcgdGhlIG9uLWRpc2sKKwkgKiBibG9jayBudW1iZXIgZm9yIHRob3NlIGJ1ZmZlcnMgaW4gdGhlICJwYXRoIi4KKwkgKi8KKwlwYXRoID0gJnN0YXRlLT5wYXRoOworCUFTU0VSVCgocGF0aC0+YWN0aXZlID49IDApICYmIChwYXRoLT5hY3RpdmUgPCBYRlNfREFfTk9ERV9NQVhERVBUSCkpOworCWZvciAoYmxrID0gcGF0aC0+YmxrLCBsZXZlbCA9IDA7IGxldmVsIDwgcGF0aC0+YWN0aXZlOyBibGsrKywgbGV2ZWwrKykgeworCQlpZiAoYmxrLT5icCkgeworCQkJYmxrLT5kaXNrX2Jsa25vID0geGZzX2RhX2Jsa25vKGJsay0+YnApOworCQkJeGZzX2RhX2J1Zl9kb25lKGJsay0+YnApOworCQkJYmxrLT5icCA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQlibGstPmRpc2tfYmxrbm8gPSAwOworCQl9CisJfQorCisJLyoKKwkgKiBSb2xsIGRvd24gdGhlICJhbHRwYXRoIiBpbiB0aGUgc3RhdGUgc3RydWN0dXJlLCBzdG9yaW5nIHRoZSBvbi1kaXNrCisJICogYmxvY2sgbnVtYmVyIGZvciB0aG9zZSBidWZmZXJzIGluIHRoZSAiYWx0cGF0aCIuCisJICovCisJcGF0aCA9ICZzdGF0ZS0+YWx0cGF0aDsKKwlBU1NFUlQoKHBhdGgtPmFjdGl2ZSA+PSAwKSAmJiAocGF0aC0+YWN0aXZlIDwgWEZTX0RBX05PREVfTUFYREVQVEgpKTsKKwlmb3IgKGJsayA9IHBhdGgtPmJsaywgbGV2ZWwgPSAwOyBsZXZlbCA8IHBhdGgtPmFjdGl2ZTsgYmxrKyssIGxldmVsKyspIHsKKwkJaWYgKGJsay0+YnApIHsKKwkJCWJsay0+ZGlza19ibGtubyA9IHhmc19kYV9ibGtubyhibGstPmJwKTsKKwkJCXhmc19kYV9idWZfZG9uZShibGstPmJwKTsKKwkJCWJsay0+YnAgPSBOVUxMOworCQl9IGVsc2UgeworCQkJYmxrLT5kaXNrX2Jsa25vID0gMDsKKwkJfQorCX0KKworCXJldHVybigwKTsKK30KKworLyoKKyAqIFJlYXR0YWNoIHRoZSBidWZmZXJzIHRvIHRoZSBzdGF0ZSBzdHJ1Y3R1cmUgYmFzZWQgb24gdGhlIGRpc2sgYmxvY2sKKyAqIG51bWJlcnMgc3RvcmVkIGluIHRoZSBzdGF0ZSBzdHJ1Y3R1cmUuCisgKiBUaGlzIGlzIGRvbmUgYWZ0ZXIgc29tZSBzZXQgb2YgdHJhbnNhY3Rpb24gY29tbWl0J3MgaGFzIHJlbGVhc2VkIHRob3NlCisgKiBidWZmZXJzIGZyb20gb3VyIGdyaXAuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19hdHRyX3JlZmlsbHN0YXRlKHhmc19kYV9zdGF0ZV90ICpzdGF0ZSkKK3sKKwl4ZnNfZGFfc3RhdGVfcGF0aF90ICpwYXRoOworCXhmc19kYV9zdGF0ZV9ibGtfdCAqYmxrOworCWludCBsZXZlbCwgZXJyb3I7CisKKwkvKgorCSAqIFJvbGwgZG93biB0aGUgInBhdGgiIGluIHRoZSBzdGF0ZSBzdHJ1Y3R1cmUsIHN0b3JpbmcgdGhlIG9uLWRpc2sKKwkgKiBibG9jayBudW1iZXIgZm9yIHRob3NlIGJ1ZmZlcnMgaW4gdGhlICJwYXRoIi4KKwkgKi8KKwlwYXRoID0gJnN0YXRlLT5wYXRoOworCUFTU0VSVCgocGF0aC0+YWN0aXZlID49IDApICYmIChwYXRoLT5hY3RpdmUgPCBYRlNfREFfTk9ERV9NQVhERVBUSCkpOworCWZvciAoYmxrID0gcGF0aC0+YmxrLCBsZXZlbCA9IDA7IGxldmVsIDwgcGF0aC0+YWN0aXZlOyBibGsrKywgbGV2ZWwrKykgeworCQlpZiAoYmxrLT5kaXNrX2Jsa25vKSB7CisJCQllcnJvciA9IHhmc19kYV9yZWFkX2J1ZihzdGF0ZS0+YXJncy0+dHJhbnMsCisJCQkJCQlzdGF0ZS0+YXJncy0+ZHAsCisJCQkJCQlibGstPmJsa25vLCBibGstPmRpc2tfYmxrbm8sCisJCQkJCQkmYmxrLT5icCwgWEZTX0FUVFJfRk9SSyk7CisJCQlpZiAoZXJyb3IpCisJCQkJcmV0dXJuKGVycm9yKTsKKwkJfSBlbHNlIHsKKwkJCWJsay0+YnAgPSBOVUxMOworCQl9CisJfQorCisJLyoKKwkgKiBSb2xsIGRvd24gdGhlICJhbHRwYXRoIiBpbiB0aGUgc3RhdGUgc3RydWN0dXJlLCBzdG9yaW5nIHRoZSBvbi1kaXNrCisJICogYmxvY2sgbnVtYmVyIGZvciB0aG9zZSBidWZmZXJzIGluIHRoZSAiYWx0cGF0aCIuCisJICovCisJcGF0aCA9ICZzdGF0ZS0+YWx0cGF0aDsKKwlBU1NFUlQoKHBhdGgtPmFjdGl2ZSA+PSAwKSAmJiAocGF0aC0+YWN0aXZlIDwgWEZTX0RBX05PREVfTUFYREVQVEgpKTsKKwlmb3IgKGJsayA9IHBhdGgtPmJsaywgbGV2ZWwgPSAwOyBsZXZlbCA8IHBhdGgtPmFjdGl2ZTsgYmxrKyssIGxldmVsKyspIHsKKwkJaWYgKGJsay0+ZGlza19ibGtubykgeworCQkJZXJyb3IgPSB4ZnNfZGFfcmVhZF9idWYoc3RhdGUtPmFyZ3MtPnRyYW5zLAorCQkJCQkJc3RhdGUtPmFyZ3MtPmRwLAorCQkJCQkJYmxrLT5ibGtubywgYmxrLT5kaXNrX2Jsa25vLAorCQkJCQkJJmJsay0+YnAsIFhGU19BVFRSX0ZPUkspOworCQkJaWYgKGVycm9yKQorCQkJCXJldHVybihlcnJvcik7CisJCX0gZWxzZSB7CisJCQlibGstPmJwID0gTlVMTDsKKwkJfQorCX0KKworCXJldHVybigwKTsKK30KKworLyoKKyAqIExvb2sgdXAgYSBmaWxlbmFtZSBpbiBhIG5vZGUgYXR0cmlidXRlIGxpc3QuCisgKgorICogVGhpcyByb3V0aW5lIGdldHMgY2FsbGVkIGZvciBhbnkgYXR0cmlidXRlIGZvcmsgdGhhdCBoYXMgbW9yZSB0aGFuIG9uZQorICogYmxvY2ssIGllOiBib3RoIHRydWUgQnRyZWUgYXR0ciBsaXN0cyBhbmQgZm9yIHNpbmdsZS1sZWFmLWJsb2NrcyB3aXRoCisgKiAicmVtb3RlIiB2YWx1ZXMgdGFraW5nIHVwIG1vcmUgYmxvY2tzLgorICovCitpbnQKK3hmc19hdHRyX25vZGVfZ2V0KHhmc19kYV9hcmdzX3QgKmFyZ3MpCit7CisJeGZzX2RhX3N0YXRlX3QgKnN0YXRlOworCXhmc19kYV9zdGF0ZV9ibGtfdCAqYmxrOworCWludCBlcnJvciwgcmV0dmFsOworCWludCBpOworCisJc3RhdGUgPSB4ZnNfZGFfc3RhdGVfYWxsb2MoKTsKKwlzdGF0ZS0+YXJncyA9IGFyZ3M7CisJc3RhdGUtPm1wID0gYXJncy0+ZHAtPmlfbW91bnQ7CisJc3RhdGUtPmJsb2Nrc2l6ZSA9IHN0YXRlLT5tcC0+bV9zYi5zYl9ibG9ja3NpemU7CisJc3RhdGUtPm5vZGVfZW50cyA9IHN0YXRlLT5tcC0+bV9hdHRyX25vZGVfZW50czsKKworCS8qCisJICogU2VhcmNoIHRvIHNlZSBpZiBuYW1lIGV4aXN0cywgYW5kIGdldCBiYWNrIGEgcG9pbnRlciB0byBpdC4KKwkgKi8KKwllcnJvciA9IHhmc19kYV9ub2RlX2xvb2t1cF9pbnQoc3RhdGUsICZyZXR2YWwpOworCWlmIChlcnJvcikgeworCQlyZXR2YWwgPSBlcnJvcjsKKwl9IGVsc2UgaWYgKHJldHZhbCA9PSBFRVhJU1QpIHsKKwkJYmxrID0gJnN0YXRlLT5wYXRoLmJsa1sgc3RhdGUtPnBhdGguYWN0aXZlLTEgXTsKKwkJQVNTRVJUKGJsay0+YnAgIT0gTlVMTCk7CisJCUFTU0VSVChibGstPm1hZ2ljID09IFhGU19BVFRSX0xFQUZfTUFHSUMpOworCisJCS8qCisJCSAqIEdldCB0aGUgdmFsdWUsIGxvY2FsIG9yICJyZW1vdGUiCisJCSAqLworCQlyZXR2YWwgPSB4ZnNfYXR0cl9sZWFmX2dldHZhbHVlKGJsay0+YnAsIGFyZ3MpOworCQlpZiAoIXJldHZhbCAmJiAoYXJncy0+cm10Ymxrbm8gPiAwKQorCQkgICAgJiYgIShhcmdzLT5mbGFncyAmIEFUVFJfS0VSTk9WQUwpKSB7CisJCQlyZXR2YWwgPSB4ZnNfYXR0cl9ybXR2YWxfZ2V0KGFyZ3MpOworCQl9CisJfQorCisJLyoKKwkgKiBJZiBub3QgaW4gYSB0cmFuc2FjdGlvbiwgd2UgaGF2ZSB0byByZWxlYXNlIGFsbCB0aGUgYnVmZmVycy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc3RhdGUtPnBhdGguYWN0aXZlOyBpKyspIHsKKwkJeGZzX2RhX2JyZWxzZShhcmdzLT50cmFucywgc3RhdGUtPnBhdGguYmxrW2ldLmJwKTsKKwkJc3RhdGUtPnBhdGguYmxrW2ldLmJwID0gTlVMTDsKKwl9CisKKwl4ZnNfZGFfc3RhdGVfZnJlZShzdGF0ZSk7CisJcmV0dXJuKHJldHZhbCk7Cit9CisKK1NUQVRJQyBpbnQJCQkJCQkJLyogZXJyb3IgKi8KK3hmc19hdHRyX25vZGVfbGlzdCh4ZnNfYXR0cl9saXN0X2NvbnRleHRfdCAqY29udGV4dCkKK3sKKwlhdHRybGlzdF9jdXJzb3Jfa2Vybl90ICpjdXJzb3I7CisJeGZzX2F0dHJfbGVhZmJsb2NrX3QgKmxlYWY7CisJeGZzX2RhX2ludG5vZGVfdCAqbm9kZTsKKwl4ZnNfZGFfbm9kZV9lbnRyeV90ICpidHJlZTsKKwlpbnQgZXJyb3IsIGk7CisJeGZzX2RhYnVmX3QgKmJwOworCisJY3Vyc29yID0gY29udGV4dC0+Y3Vyc29yOworCWN1cnNvci0+aW5pdHRlZCA9IDE7CisKKwkvKgorCSAqIERvIGFsbCBzb3J0cyBvZiB2YWxpZGF0aW9uIG9uIHRoZSBwYXNzZWQtaW4gY3Vyc29yIHN0cnVjdHVyZS4KKwkgKiBJZiBhbnl0aGluZyBpcyBhbWlzcywgaWdub3JlIHRoZSBjdXJzb3IgYW5kIGxvb2sgdXAgdGhlIGhhc2h2YWwKKwkgKiBzdGFydGluZyBmcm9tIHRoZSBidHJlZSByb290LgorCSAqLworCWJwID0gTlVMTDsKKwlpZiAoY3Vyc29yLT5ibGtubyA+IDApIHsKKwkJZXJyb3IgPSB4ZnNfZGFfcmVhZF9idWYoTlVMTCwgY29udGV4dC0+ZHAsIGN1cnNvci0+Ymxrbm8sIC0xLAorCQkJCQkgICAgICAmYnAsIFhGU19BVFRSX0ZPUkspOworCQlpZiAoKGVycm9yICE9IDApICYmIChlcnJvciAhPSBFRlNDT1JSVVBURUQpKQorCQkJcmV0dXJuKGVycm9yKTsKKwkJaWYgKGJwKSB7CisJCQlub2RlID0gYnAtPmRhdGE7CisJCQlzd2l0Y2ggKElOVF9HRVQobm9kZS0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJCWNhc2UgWEZTX0RBX05PREVfTUFHSUM6CisJCQkJeGZzX2F0dHJfdHJhY2VfbF9jbigid3JvbmcgYmxrIiwgY29udGV4dCwgbm9kZSk7CisJCQkJeGZzX2RhX2JyZWxzZShOVUxMLCBicCk7CisJCQkJYnAgPSBOVUxMOworCQkJCWJyZWFrOworCQkJY2FzZSBYRlNfQVRUUl9MRUFGX01BR0lDOgorCQkJCWxlYWYgPSBicC0+ZGF0YTsKKwkJCQlpZiAoY3Vyc29yLT5oYXNodmFsID4KKwkJCQkgICAgSU5UX0dFVChsZWFmLT5lbnRyaWVzWworCQkJCQkgSU5UX0dFVChsZWFmLT5oZHIuY291bnQsCisJCQkJCQlBUkNIX0NPTlZFUlQpLTFdLmhhc2h2YWwsCisJCQkJCQkJQVJDSF9DT05WRVJUKSkgeworCQkJCQl4ZnNfYXR0cl90cmFjZV9sX2NsKCJ3cm9uZyBibGsiLAorCQkJCQkJCSAgIGNvbnRleHQsIGxlYWYpOworCQkJCQl4ZnNfZGFfYnJlbHNlKE5VTEwsIGJwKTsKKwkJCQkJYnAgPSBOVUxMOworCQkJCX0gZWxzZSBpZiAoY3Vyc29yLT5oYXNodmFsIDw9CisJCQkJCSAgICAgSU5UX0dFVChsZWFmLT5lbnRyaWVzWzBdLmhhc2h2YWwsCisJCQkJCQkJQVJDSF9DT05WRVJUKSkgeworCQkJCQl4ZnNfYXR0cl90cmFjZV9sX2NsKCJtYXliZSB3cm9uZyBibGsiLAorCQkJCQkJCSAgIGNvbnRleHQsIGxlYWYpOworCQkJCQl4ZnNfZGFfYnJlbHNlKE5VTEwsIGJwKTsKKwkJCQkJYnAgPSBOVUxMOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJeGZzX2F0dHJfdHJhY2VfbF9jKCJ3cm9uZyBibGsgLSA/PyIsIGNvbnRleHQpOworCQkJCXhmc19kYV9icmVsc2UoTlVMTCwgYnApOworCQkJCWJwID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogV2UgZGlkIG5vdCBmaW5kIHdoYXQgd2UgZXhwZWN0ZWQgZ2l2ZW4gdGhlIGN1cnNvcidzIGNvbnRlbnRzLAorCSAqIHNvIHdlIHN0YXJ0IGZyb20gdGhlIHRvcCBhbmQgd29yayBkb3duIGJhc2VkIG9uIHRoZSBoYXNoIHZhbHVlLgorCSAqIE5vdGUgdGhhdCBzdGFydCBvZiBub2RlIGJsb2NrIGlzIHNhbWUgYXMgc3RhcnQgb2YgbGVhZiBibG9jay4KKwkgKi8KKwlpZiAoYnAgPT0gTlVMTCkgeworCQljdXJzb3ItPmJsa25vID0gMDsKKwkJZm9yICg7OykgeworCQkJZXJyb3IgPSB4ZnNfZGFfcmVhZF9idWYoTlVMTCwgY29udGV4dC0+ZHAsCisJCQkJCQkgICAgICBjdXJzb3ItPmJsa25vLCAtMSwgJmJwLAorCQkJCQkJICAgICAgWEZTX0FUVFJfRk9SSyk7CisJCQlpZiAoZXJyb3IpCisJCQkJcmV0dXJuKGVycm9yKTsKKwkJCWlmICh1bmxpa2VseShicCA9PSBOVUxMKSkgeworCQkJCVhGU19FUlJPUl9SRVBPUlQoInhmc19hdHRyX25vZGVfbGlzdCgyKSIsCisJCQkJCQkgWEZTX0VSUkxFVkVMX0xPVywKKwkJCQkJCSBjb250ZXh0LT5kcC0+aV9tb3VudCk7CisJCQkJcmV0dXJuKFhGU19FUlJPUihFRlNDT1JSVVBURUQpKTsKKwkJCX0KKwkJCW5vZGUgPSBicC0+ZGF0YTsKKwkJCWlmIChJTlRfR0VUKG5vZGUtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpCisJCQkJCQkJPT0gWEZTX0FUVFJfTEVBRl9NQUdJQykKKwkJCQlicmVhazsKKwkJCWlmICh1bmxpa2VseShJTlRfR0VUKG5vZGUtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpCisJCQkJCQkJIT0gWEZTX0RBX05PREVfTUFHSUMpKSB7CisJCQkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhmc19hdHRyX25vZGVfbGlzdCgzKSIsCisJCQkJCQkgICAgIFhGU19FUlJMRVZFTF9MT1csCisJCQkJCQkgICAgIGNvbnRleHQtPmRwLT5pX21vdW50LAorCQkJCQkJICAgICBub2RlKTsKKwkJCQl4ZnNfZGFfYnJlbHNlKE5VTEwsIGJwKTsKKwkJCQlyZXR1cm4oWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCkpOworCQkJfQorCQkJYnRyZWUgPSBub2RlLT5idHJlZTsKKwkJCWZvciAoaSA9IDA7CisJCQkJaSA8IElOVF9HRVQobm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOworCQkJCQkJCQlidHJlZSsrLCBpKyspIHsKKwkJCQlpZiAoY3Vyc29yLT5oYXNodmFsCisJCQkJCQk8PSBJTlRfR0VUKGJ0cmVlLT5oYXNodmFsLAorCQkJCQkJCSAgICBBUkNIX0NPTlZFUlQpKSB7CisJCQkJCWN1cnNvci0+Ymxrbm8gPSBJTlRfR0VUKGJ0cmVlLT5iZWZvcmUsIEFSQ0hfQ09OVkVSVCk7CisJCQkJCXhmc19hdHRyX3RyYWNlX2xfY2IoImRlc2NlbmRpbmciLAorCQkJCQkJCSAgICBjb250ZXh0LCBidHJlZSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmIChpID09IElOVF9HRVQobm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpKSB7CisJCQkJeGZzX2RhX2JyZWxzZShOVUxMLCBicCk7CisJCQkJcmV0dXJuKDApOworCQkJfQorCQkJeGZzX2RhX2JyZWxzZShOVUxMLCBicCk7CisJCX0KKwl9CisJQVNTRVJUKGJwICE9IE5VTEwpOworCisJLyoKKwkgKiBSb2xsIHVwd2FyZCB0aHJvdWdoIHRoZSBibG9ja3MsIHByb2Nlc3NpbmcgZWFjaCBsZWFmIGJsb2NrIGluCisJICogb3JkZXIuICBBcyBsb25nIGFzIHRoZXJlIGlzIHNwYWNlIGluIHRoZSByZXN1bHQgYnVmZmVyLCBrZWVwCisJICogYWRkaW5nIHRoZSBpbmZvcm1hdGlvbi4KKwkgKi8KKwlmb3IgKDs7KSB7CisJCWxlYWYgPSBicC0+ZGF0YTsKKwkJaWYgKHVubGlrZWx5KElOVF9HRVQobGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCSE9IFhGU19BVFRSX0xFQUZfTUFHSUMpKSB7CisJCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGZzX2F0dHJfbm9kZV9saXN0KDQpIiwKKwkJCQkJICAgICBYRlNfRVJSTEVWRUxfTE9XLAorCQkJCQkgICAgIGNvbnRleHQtPmRwLT5pX21vdW50LCBsZWFmKTsKKwkJCXhmc19kYV9icmVsc2UoTlVMTCwgYnApOworCQkJcmV0dXJuKFhGU19FUlJPUihFRlNDT1JSVVBURUQpKTsKKwkJfQorCQllcnJvciA9IHhmc19hdHRyX2xlYWZfbGlzdF9pbnQoYnAsIGNvbnRleHQpOworCQlpZiAoZXJyb3IgfHwgIWxlYWYtPmhkci5pbmZvLmZvcncpCisJCQlicmVhazsJLyogbm90IHJlYWxseSBhbiBlcnJvciwgYnVmZmVyIGZ1bGwgb3IgRU9GICovCisJCWN1cnNvci0+Ymxrbm8gPSBJTlRfR0VUKGxlYWYtPmhkci5pbmZvLmZvcncsIEFSQ0hfQ09OVkVSVCk7CisJCXhmc19kYV9icmVsc2UoTlVMTCwgYnApOworCQllcnJvciA9IHhmc19kYV9yZWFkX2J1ZihOVUxMLCBjb250ZXh0LT5kcCwgY3Vyc29yLT5ibGtubywgLTEsCisJCQkJCSAgICAgICZicCwgWEZTX0FUVFJfRk9SSyk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybihlcnJvcik7CisJCWlmICh1bmxpa2VseSgoYnAgPT0gTlVMTCkpKSB7CisJCQlYRlNfRVJST1JfUkVQT1JUKCJ4ZnNfYXR0cl9ub2RlX2xpc3QoNSkiLAorCQkJCQkgWEZTX0VSUkxFVkVMX0xPVywKKwkJCQkJIGNvbnRleHQtPmRwLT5pX21vdW50KTsKKwkJCXJldHVybihYRlNfRVJST1IoRUZTQ09SUlVQVEVEKSk7CisJCX0KKwl9CisJeGZzX2RhX2JyZWxzZShOVUxMLCBicCk7CisJcmV0dXJuKDApOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBFeHRlcm5hbCByb3V0aW5lcyBmb3IgbWFuaXB1bGF0aW5nIG91dC1vZi1saW5lIGF0dHJpYnV0ZSB2YWx1ZXMuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgKiBSZWFkIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYW4gYXR0cmlidXRlIGZyb20gdGhlIG91dC1vZi1saW5lIGJ1ZmZlcgorICogdGhhdCB3ZSBzdG9yZWQgaXQgaW4uCisgKi8KK1NUQVRJQyBpbnQKK3hmc19hdHRyX3JtdHZhbF9nZXQoeGZzX2RhX2FyZ3NfdCAqYXJncykKK3sKKwl4ZnNfYm1idF9pcmVjX3QgbWFwW0FUVFJfUk1UVkFMVUVfTUFQU0laRV07CisJeGZzX21vdW50X3QgKm1wOworCXhmc19kYWRkcl90IGRibGtubzsKKwl4ZnNfY2FkZHJfdCBkc3Q7CisJeGZzX2J1Zl90ICpicDsKKwlpbnQgbm1hcCwgZXJyb3IsIHRtcCwgdmFsdWVsZW4sIGJsa2NudCwgaTsKKwl4ZnNfZGFibGtfdCBsYmxrbm87CisKKwlBU1NFUlQoIShhcmdzLT5mbGFncyAmIEFUVFJfS0VSTk9WQUwpKTsKKworCW1wID0gYXJncy0+ZHAtPmlfbW91bnQ7CisJZHN0ID0gYXJncy0+dmFsdWU7CisJdmFsdWVsZW4gPSBhcmdzLT52YWx1ZWxlbjsKKwlsYmxrbm8gPSBhcmdzLT5ybXRibGtubzsKKwl3aGlsZSAodmFsdWVsZW4gPiAwKSB7CisJCW5tYXAgPSBBVFRSX1JNVFZBTFVFX01BUFNJWkU7CisJCWVycm9yID0geGZzX2JtYXBpKGFyZ3MtPnRyYW5zLCBhcmdzLT5kcCwgKHhmc19maWxlb2ZmX3QpbGJsa25vLAorCQkJCSAgYXJncy0+cm10YmxrY250LAorCQkJCSAgWEZTX0JNQVBJX0FUVFJGT1JLIHwgWEZTX0JNQVBJX01FVEFEQVRBLAorCQkJCSAgTlVMTCwgMCwgbWFwLCAmbm1hcCwgTlVMTCk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybihlcnJvcik7CisJCUFTU0VSVChubWFwID49IDEpOworCisJCWZvciAoaSA9IDA7IChpIDwgbm1hcCkgJiYgKHZhbHVlbGVuID4gMCk7IGkrKykgeworCQkJQVNTRVJUKChtYXBbaV0uYnJfc3RhcnRibG9jayAhPSBERUxBWVNUQVJUQkxPQ0spICYmCisJCQkgICAgICAgKG1hcFtpXS5icl9zdGFydGJsb2NrICE9IEhPTEVTVEFSVEJMT0NLKSk7CisJCQlkYmxrbm8gPSBYRlNfRlNCX1RPX0RBRERSKG1wLCBtYXBbaV0uYnJfc3RhcnRibG9jayk7CisJCQlibGtjbnQgPSBYRlNfRlNCX1RPX0JCKG1wLCBtYXBbaV0uYnJfYmxvY2tjb3VudCk7CisJCQllcnJvciA9IHhmc19yZWFkX2J1ZihtcCwgbXAtPm1fZGRldl90YXJncCwgZGJsa25vLAorCQkJCQkgICAgIGJsa2NudCwgWEZTX0JVRl9MT0NLLCAmYnApOworCQkJaWYgKGVycm9yKQorCQkJCXJldHVybihlcnJvcik7CisKKwkJCXRtcCA9ICh2YWx1ZWxlbiA8IFhGU19CVUZfU0laRShicCkpCisJCQkJPyB2YWx1ZWxlbiA6IFhGU19CVUZfU0laRShicCk7CisJCQl4ZnNfYmlvbW92ZShicCwgMCwgdG1wLCBkc3QsIFhGU19CX1JFQUQpOworCQkJeGZzX2J1Zl9yZWxzZShicCk7CisJCQlkc3QgKz0gdG1wOworCQkJdmFsdWVsZW4gLT0gdG1wOworCisJCQlsYmxrbm8gKz0gbWFwW2ldLmJyX2Jsb2NrY291bnQ7CisJCX0KKwl9CisJQVNTRVJUKHZhbHVlbGVuID09IDApOworCXJldHVybigwKTsKK30KKworLyoKKyAqIFdyaXRlIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYW4gYXR0cmlidXRlIGludG8gdGhlIG91dC1vZi1saW5lIGJ1ZmZlcgorICogdGhhdCB3ZSBoYXZlIGRlZmluZWQgZm9yIGl0LgorICovCitTVEFUSUMgaW50Cit4ZnNfYXR0cl9ybXR2YWxfc2V0KHhmc19kYV9hcmdzX3QgKmFyZ3MpCit7CisJeGZzX21vdW50X3QgKm1wOworCXhmc19maWxlb2ZmX3QgbGZpbGVvZmY7CisJeGZzX2lub2RlX3QgKmRwOworCXhmc19ibWJ0X2lyZWNfdCBtYXA7CisJeGZzX2RhZGRyX3QgZGJsa25vOworCXhmc19jYWRkcl90IHNyYzsKKwl4ZnNfYnVmX3QgKmJwOworCXhmc19kYWJsa190IGxibGtubzsKKwlpbnQgYmxrY250LCB2YWx1ZWxlbiwgbm1hcCwgZXJyb3IsIHRtcCwgY29tbWl0dGVkOworCisJZHAgPSBhcmdzLT5kcDsKKwltcCA9IGRwLT5pX21vdW50OworCXNyYyA9IGFyZ3MtPnZhbHVlOworCisJLyoKKwkgKiBGaW5kIGEgImhvbGUiIGluIHRoZSBhdHRyaWJ1dGUgYWRkcmVzcyBzcGFjZSBsYXJnZSBlbm91Z2ggZm9yCisJICogdXMgdG8gZHJvcCB0aGUgbmV3IGF0dHJpYnV0ZSdzIHZhbHVlIGludG8uCisJICovCisJYmxrY250ID0gWEZTX0JfVE9fRlNCKG1wLCBhcmdzLT52YWx1ZWxlbik7CisJbGZpbGVvZmYgPSAwOworCWVycm9yID0geGZzX2JtYXBfZmlyc3RfdW51c2VkKGFyZ3MtPnRyYW5zLCBhcmdzLT5kcCwgYmxrY250LCAmbGZpbGVvZmYsCisJCQkJCQkgICBYRlNfQVRUUl9GT1JLKTsKKwlpZiAoZXJyb3IpIHsKKwkJcmV0dXJuKGVycm9yKTsKKwl9CisJYXJncy0+cm10Ymxrbm8gPSBsYmxrbm8gPSAoeGZzX2RhYmxrX3QpbGZpbGVvZmY7CisJYXJncy0+cm10YmxrY250ID0gYmxrY250OworCisJLyoKKwkgKiBSb2xsIHRocm91Z2ggdGhlICJ2YWx1ZSIsIGFsbG9jYXRpbmcgYmxvY2tzIG9uIGRpc2sgYXMgcmVxdWlyZWQuCisJICovCisJd2hpbGUgKGJsa2NudCA+IDApIHsKKwkJLyoKKwkJICogQWxsb2NhdGUgYSBzaW5nbGUgZXh0ZW50LCB1cCB0byB0aGUgc2l6ZSBvZiB0aGUgdmFsdWUuCisJCSAqLworCQlYRlNfQk1BUF9JTklUKGFyZ3MtPmZsaXN0LCBhcmdzLT5maXJzdGJsb2NrKTsKKwkJbm1hcCA9IDE7CisJCWVycm9yID0geGZzX2JtYXBpKGFyZ3MtPnRyYW5zLCBkcCwgKHhmc19maWxlb2ZmX3QpbGJsa25vLAorCQkJCSAgYmxrY250LAorCQkJCSAgWEZTX0JNQVBJX0FUVFJGT1JLIHwgWEZTX0JNQVBJX01FVEFEQVRBIHwKKwkJCQkJCQlYRlNfQk1BUElfV1JJVEUsCisJCQkJICBhcmdzLT5maXJzdGJsb2NrLCBhcmdzLT50b3RhbCwgJm1hcCwgJm5tYXAsCisJCQkJICBhcmdzLT5mbGlzdCk7CisJCWlmICghZXJyb3IpIHsKKwkJCWVycm9yID0geGZzX2JtYXBfZmluaXNoKCZhcmdzLT50cmFucywgYXJncy0+Zmxpc3QsCisJCQkJCQkqYXJncy0+Zmlyc3RibG9jaywgJmNvbW1pdHRlZCk7CisJCX0KKwkJaWYgKGVycm9yKSB7CisJCQlBU1NFUlQoY29tbWl0dGVkKTsKKwkJCWFyZ3MtPnRyYW5zID0gTlVMTDsKKwkJCXhmc19ibWFwX2NhbmNlbChhcmdzLT5mbGlzdCk7CisJCQlyZXR1cm4oZXJyb3IpOworCQl9CisKKwkJLyoKKwkJICogYm1hcF9maW5pc2goKSBtYXkgaGF2ZSBjb21taXR0ZWQgdGhlIGxhc3QgdHJhbnMgYW5kIHN0YXJ0ZWQKKwkJICogYSBuZXcgb25lLiAgV2UgbmVlZCB0aGUgaW5vZGUgdG8gYmUgaW4gYWxsIHRyYW5zYWN0aW9ucy4KKwkJICovCisJCWlmIChjb21taXR0ZWQpIHsKKwkJCXhmc190cmFuc19pam9pbihhcmdzLT50cmFucywgZHAsIFhGU19JTE9DS19FWENMKTsKKwkJCXhmc190cmFuc19paG9sZChhcmdzLT50cmFucywgZHApOworCQl9CisKKwkJQVNTRVJUKG5tYXAgPT0gMSk7CisJCUFTU0VSVCgobWFwLmJyX3N0YXJ0YmxvY2sgIT0gREVMQVlTVEFSVEJMT0NLKSAmJgorCQkgICAgICAgKG1hcC5icl9zdGFydGJsb2NrICE9IEhPTEVTVEFSVEJMT0NLKSk7CisJCWxibGtubyArPSBtYXAuYnJfYmxvY2tjb3VudDsKKwkJYmxrY250IC09IG1hcC5icl9ibG9ja2NvdW50OworCisJCS8qCisJCSAqIFN0YXJ0IHRoZSBuZXh0IHRyYW5zIGluIHRoZSBjaGFpbi4KKwkJICovCisJCWlmICgoZXJyb3IgPSB4ZnNfYXR0cl9yb2xsdHJhbnMoJmFyZ3MtPnRyYW5zLCBkcCkpKQorCQkJcmV0dXJuIChlcnJvcik7CisJfQorCisJLyoKKwkgKiBSb2xsIHRocm91Z2ggdGhlICJ2YWx1ZSIsIGNvcHlpbmcgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byB0aGUKKwkgKiBhbHJlYWR5LWFsbG9jYXRlZCBibG9ja3MuICBCbG9ja3MgYXJlIHdyaXR0ZW4gc3luY2hyb25vdXNseQorCSAqIHNvIHRoYXQgd2UgY2FuIGtub3cgdGhleSBhcmUgYWxsIG9uIGRpc2sgYmVmb3JlIHdlIHR1cm4gb2ZmCisJICogdGhlIElOQ09NUExFVEUgZmxhZy4KKwkgKi8KKwlsYmxrbm8gPSBhcmdzLT5ybXRibGtubzsKKwl2YWx1ZWxlbiA9IGFyZ3MtPnZhbHVlbGVuOworCXdoaWxlICh2YWx1ZWxlbiA+IDApIHsKKwkJLyoKKwkJICogVHJ5IHRvIHJlbWVtYmVyIHdoZXJlIHdlIGRlY2lkZWQgdG8gcHV0IHRoZSB2YWx1ZS4KKwkJICovCisJCVhGU19CTUFQX0lOSVQoYXJncy0+Zmxpc3QsIGFyZ3MtPmZpcnN0YmxvY2spOworCQlubWFwID0gMTsKKwkJZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgZHAsICh4ZnNfZmlsZW9mZl90KWxibGtubywKKwkJCQkgIGFyZ3MtPnJtdGJsa2NudCwKKwkJCQkgIFhGU19CTUFQSV9BVFRSRk9SSyB8IFhGU19CTUFQSV9NRVRBREFUQSwKKwkJCQkgIGFyZ3MtPmZpcnN0YmxvY2ssIDAsICZtYXAsICZubWFwLCBOVUxMKTsKKwkJaWYgKGVycm9yKSB7CisJCQlyZXR1cm4oZXJyb3IpOworCQl9CisJCUFTU0VSVChubWFwID09IDEpOworCQlBU1NFUlQoKG1hcC5icl9zdGFydGJsb2NrICE9IERFTEFZU1RBUlRCTE9DSykgJiYKKwkJICAgICAgIChtYXAuYnJfc3RhcnRibG9jayAhPSBIT0xFU1RBUlRCTE9DSykpOworCisJCWRibGtubyA9IFhGU19GU0JfVE9fREFERFIobXAsIG1hcC5icl9zdGFydGJsb2NrKSwKKwkJYmxrY250ID0gWEZTX0ZTQl9UT19CQihtcCwgbWFwLmJyX2Jsb2NrY291bnQpOworCisJCWJwID0geGZzX2J1Zl9nZXRfZmxhZ3MobXAtPm1fZGRldl90YXJncCwgZGJsa25vLAorCQkJCQkJCWJsa2NudCwgWEZTX0JVRl9MT0NLKTsKKwkJQVNTRVJUKGJwKTsKKwkJQVNTRVJUKCFYRlNfQlVGX0dFVEVSUk9SKGJwKSk7CisKKwkJdG1wID0gKHZhbHVlbGVuIDwgWEZTX0JVRl9TSVpFKGJwKSkgPyB2YWx1ZWxlbiA6CisJCQkJCQkJWEZTX0JVRl9TSVpFKGJwKTsKKwkJeGZzX2Jpb21vdmUoYnAsIDAsIHRtcCwgc3JjLCBYRlNfQl9XUklURSk7CisJCWlmICh0bXAgPCBYRlNfQlVGX1NJWkUoYnApKQorCQkJeGZzX2Jpb3plcm8oYnAsIHRtcCwgWEZTX0JVRl9TSVpFKGJwKSAtIHRtcCk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYndyaXRlKG1wLCBicCkpKSB7LyogR1JPVDogTk9URTogc3luY2hyb25vdXMgd3JpdGUgKi8KKwkJCXJldHVybiAoZXJyb3IpOworCQl9CisJCXNyYyArPSB0bXA7CisJCXZhbHVlbGVuIC09IHRtcDsKKworCQlsYmxrbm8gKz0gbWFwLmJyX2Jsb2NrY291bnQ7CisJfQorCUFTU0VSVCh2YWx1ZWxlbiA9PSAwKTsKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBSZW1vdmUgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhbiBhdHRyaWJ1dGUgYnkgZGVsZXRpbmcgdGhlCisgKiBvdXQtb2YtbGluZSBidWZmZXIgdGhhdCBpdCBpcyBzdG9yZWQgb24uCisgKi8KK1NUQVRJQyBpbnQKK3hmc19hdHRyX3JtdHZhbF9yZW1vdmUoeGZzX2RhX2FyZ3NfdCAqYXJncykKK3sKKwl4ZnNfbW91bnRfdCAqbXA7CisJeGZzX2JtYnRfaXJlY190IG1hcDsKKwl4ZnNfYnVmX3QgKmJwOworCXhmc19kYWRkcl90IGRibGtubzsKKwl4ZnNfZGFibGtfdCBsYmxrbm87CisJaW50IHZhbHVlbGVuLCBibGtjbnQsIG5tYXAsIGVycm9yLCBkb25lLCBjb21taXR0ZWQ7CisKKwltcCA9IGFyZ3MtPmRwLT5pX21vdW50OworCisJLyoKKwkgKiBSb2xsIHRocm91Z2ggdGhlICJ2YWx1ZSIsIGludmFsaWRhdGluZyB0aGUgYXR0cmlidXRlIHZhbHVlJ3MKKwkgKiBibG9ja3MuCisJICovCisJbGJsa25vID0gYXJncy0+cm10Ymxrbm87CisJdmFsdWVsZW4gPSBhcmdzLT5ybXRibGtjbnQ7CisJd2hpbGUgKHZhbHVlbGVuID4gMCkgeworCQkvKgorCQkgKiBUcnkgdG8gcmVtZW1iZXIgd2hlcmUgd2UgZGVjaWRlZCB0byBwdXQgdGhlIHZhbHVlLgorCQkgKi8KKwkJWEZTX0JNQVBfSU5JVChhcmdzLT5mbGlzdCwgYXJncy0+Zmlyc3RibG9jayk7CisJCW5tYXAgPSAxOworCQllcnJvciA9IHhmc19ibWFwaShOVUxMLCBhcmdzLT5kcCwgKHhmc19maWxlb2ZmX3QpbGJsa25vLAorCQkJCQlhcmdzLT5ybXRibGtjbnQsCisJCQkJCVhGU19CTUFQSV9BVFRSRk9SSyB8IFhGU19CTUFQSV9NRVRBREFUQSwKKwkJCQkJYXJncy0+Zmlyc3RibG9jaywgMCwgJm1hcCwgJm5tYXAsCisJCQkJCWFyZ3MtPmZsaXN0KTsKKwkJaWYgKGVycm9yKSB7CisJCQlyZXR1cm4oZXJyb3IpOworCQl9CisJCUFTU0VSVChubWFwID09IDEpOworCQlBU1NFUlQoKG1hcC5icl9zdGFydGJsb2NrICE9IERFTEFZU1RBUlRCTE9DSykgJiYKKwkJICAgICAgIChtYXAuYnJfc3RhcnRibG9jayAhPSBIT0xFU1RBUlRCTE9DSykpOworCisJCWRibGtubyA9IFhGU19GU0JfVE9fREFERFIobXAsIG1hcC5icl9zdGFydGJsb2NrKSwKKwkJYmxrY250ID0gWEZTX0ZTQl9UT19CQihtcCwgbWFwLmJyX2Jsb2NrY291bnQpOworCisJCS8qCisJCSAqIElmIHRoZSAicmVtb3RlIiB2YWx1ZSBpcyBpbiB0aGUgY2FjaGUsIHJlbW92ZSBpdC4KKwkJICovCisJCWJwID0geGZzX2luY29yZShtcC0+bV9kZGV2X3RhcmdwLCBkYmxrbm8sIGJsa2NudCwKKwkJCQlYRlNfSU5DT1JFX1RSWUxPQ0spOworCQlpZiAoYnApIHsKKwkJCVhGU19CVUZfU1RBTEUoYnApOworCQkJWEZTX0JVRl9VTkRFTEFZV1JJVEUoYnApOworCQkJeGZzX2J1Zl9yZWxzZShicCk7CisJCQlicCA9IE5VTEw7CisJCX0KKworCQl2YWx1ZWxlbiAtPSBtYXAuYnJfYmxvY2tjb3VudDsKKworCQlsYmxrbm8gKz0gbWFwLmJyX2Jsb2NrY291bnQ7CisJfQorCisJLyoKKwkgKiBLZWVwIGRlLWFsbG9jYXRpbmcgZXh0ZW50cyB1bnRpbCB0aGUgcmVtb3RlLXZhbHVlIHJlZ2lvbiBpcyBnb25lLgorCSAqLworCWxibGtubyA9IGFyZ3MtPnJtdGJsa25vOworCWJsa2NudCA9IGFyZ3MtPnJtdGJsa2NudDsKKwlkb25lID0gMDsKKwl3aGlsZSAoIWRvbmUpIHsKKwkJWEZTX0JNQVBfSU5JVChhcmdzLT5mbGlzdCwgYXJncy0+Zmlyc3RibG9jayk7CisJCWVycm9yID0geGZzX2J1bm1hcGkoYXJncy0+dHJhbnMsIGFyZ3MtPmRwLCBsYmxrbm8sIGJsa2NudCwKKwkJCQkgICAgWEZTX0JNQVBJX0FUVFJGT1JLIHwgWEZTX0JNQVBJX01FVEFEQVRBLAorCQkJCSAgICAxLCBhcmdzLT5maXJzdGJsb2NrLCBhcmdzLT5mbGlzdCwgJmRvbmUpOworCQlpZiAoIWVycm9yKSB7CisJCQllcnJvciA9IHhmc19ibWFwX2ZpbmlzaCgmYXJncy0+dHJhbnMsIGFyZ3MtPmZsaXN0LAorCQkJCQkJKmFyZ3MtPmZpcnN0YmxvY2ssICZjb21taXR0ZWQpOworCQl9CisJCWlmIChlcnJvcikgeworCQkJQVNTRVJUKGNvbW1pdHRlZCk7CisJCQlhcmdzLT50cmFucyA9IE5VTEw7CisJCQl4ZnNfYm1hcF9jYW5jZWwoYXJncy0+Zmxpc3QpOworCQkJcmV0dXJuKGVycm9yKTsKKwkJfQorCisJCS8qCisJCSAqIGJtYXBfZmluaXNoKCkgbWF5IGhhdmUgY29tbWl0dGVkIHRoZSBsYXN0IHRyYW5zIGFuZCBzdGFydGVkCisJCSAqIGEgbmV3IG9uZS4gIFdlIG5lZWQgdGhlIGlub2RlIHRvIGJlIGluIGFsbCB0cmFuc2FjdGlvbnMuCisJCSAqLworCQlpZiAoY29tbWl0dGVkKSB7CisJCQl4ZnNfdHJhbnNfaWpvaW4oYXJncy0+dHJhbnMsIGFyZ3MtPmRwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCQl4ZnNfdHJhbnNfaWhvbGQoYXJncy0+dHJhbnMsIGFyZ3MtPmRwKTsKKwkJfQorCisJCS8qCisJCSAqIENsb3NlIG91dCB0cmFucyBhbmQgc3RhcnQgdGhlIG5leHQgb25lIGluIHRoZSBjaGFpbi4KKwkJICovCisJCWlmICgoZXJyb3IgPSB4ZnNfYXR0cl9yb2xsdHJhbnMoJmFyZ3MtPnRyYW5zLCBhcmdzLT5kcCkpKQorCQkJcmV0dXJuIChlcnJvcik7CisJfQorCXJldHVybigwKTsKK30KKworI2lmIGRlZmluZWQoWEZTX0FUVFJfVFJBQ0UpCisvKgorICogQWRkIGEgdHJhY2UgYnVmZmVyIGVudHJ5IGZvciBhbiBhdHRyX2xpc3QgY29udGV4dCBzdHJ1Y3R1cmUuCisgKi8KK3ZvaWQKK3hmc19hdHRyX3RyYWNlX2xfYyhjaGFyICp3aGVyZSwgc3RydWN0IHhmc19hdHRyX2xpc3RfY29udGV4dCAqY29udGV4dCkKK3sKKwl4ZnNfYXR0cl90cmFjZV9lbnRlcihYRlNfQVRUUl9LVFJBQ0VfTF9DLCB3aGVyZSwKKwkJKF9fcHN1bnNpZ25lZF90KWNvbnRleHQtPmRwLAorCQkoX19wc3Vuc2lnbmVkX3QpY29udGV4dC0+Y3Vyc29yLT5oYXNodmFsLAorCQkoX19wc3Vuc2lnbmVkX3QpY29udGV4dC0+Y3Vyc29yLT5ibGtubywKKwkJKF9fcHN1bnNpZ25lZF90KWNvbnRleHQtPmN1cnNvci0+b2Zmc2V0LAorCQkoX19wc3Vuc2lnbmVkX3QpY29udGV4dC0+YWxpc3QsCisJCShfX3BzdW5zaWduZWRfdCljb250ZXh0LT5idWZzaXplLAorCQkoX19wc3Vuc2lnbmVkX3QpY29udGV4dC0+Y291bnQsCisJCShfX3BzdW5zaWduZWRfdCljb250ZXh0LT5maXJzdHUsCisJCShfX3BzdW5zaWduZWRfdCkKKwkJCSgoY29udGV4dC0+Y291bnQgPiAwKSAmJgorCQkJIShjb250ZXh0LT5mbGFncyAmIChBVFRSX0tFUk5BTUVMU3xBVFRSX0tFUk5PVkFMKSkpCisJCQkJPyAoQVRUUl9FTlRSWShjb250ZXh0LT5hbGlzdCwKKwkJCQkJICAgICAgY29udGV4dC0+Y291bnQtMSktPmFfdmFsdWVsZW4pCisJCQkJOiAwLAorCQkoX19wc3Vuc2lnbmVkX3QpY29udGV4dC0+ZHVwY250LAorCQkoX19wc3Vuc2lnbmVkX3QpY29udGV4dC0+ZmxhZ3MsCisJCShfX3BzdW5zaWduZWRfdClOVUxMLAorCQkoX19wc3Vuc2lnbmVkX3QpTlVMTCwKKwkJKF9fcHN1bnNpZ25lZF90KU5VTEwpOworfQorCisvKgorICogQWRkIGEgdHJhY2UgYnVmZmVyIGVudHJ5IGZvciBhIGNvbnRleHQgc3RydWN0dXJlIGFuZCBhIEJ0cmVlIG5vZGUuCisgKi8KK3ZvaWQKK3hmc19hdHRyX3RyYWNlX2xfY24oY2hhciAqd2hlcmUsIHN0cnVjdCB4ZnNfYXR0cl9saXN0X2NvbnRleHQgKmNvbnRleHQsCisJCQkgc3RydWN0IHhmc19kYV9pbnRub2RlICpub2RlKQoreworCXhmc19hdHRyX3RyYWNlX2VudGVyKFhGU19BVFRSX0tUUkFDRV9MX0NOLCB3aGVyZSwKKwkJKF9fcHN1bnNpZ25lZF90KWNvbnRleHQtPmRwLAorCQkoX19wc3Vuc2lnbmVkX3QpY29udGV4dC0+Y3Vyc29yLT5oYXNodmFsLAorCQkoX19wc3Vuc2lnbmVkX3QpY29udGV4dC0+Y3Vyc29yLT5ibGtubywKKwkJKF9fcHN1bnNpZ25lZF90KWNvbnRleHQtPmN1cnNvci0+b2Zmc2V0LAorCQkoX19wc3Vuc2lnbmVkX3QpY29udGV4dC0+YWxpc3QsCisJCShfX3BzdW5zaWduZWRfdCljb250ZXh0LT5idWZzaXplLAorCQkoX19wc3Vuc2lnbmVkX3QpY29udGV4dC0+Y291bnQsCisJCShfX3BzdW5zaWduZWRfdCljb250ZXh0LT5maXJzdHUsCisJCShfX3BzdW5zaWduZWRfdCkKKwkJCSgoY29udGV4dC0+Y291bnQgPiAwKSAmJgorCQkJIShjb250ZXh0LT5mbGFncyAmIChBVFRSX0tFUk5BTUVMU3xBVFRSX0tFUk5PVkFMKSkpCisJCQkJPyAoQVRUUl9FTlRSWShjb250ZXh0LT5hbGlzdCwKKwkJCQkJICAgICAgY29udGV4dC0+Y291bnQtMSktPmFfdmFsdWVsZW4pCisJCQkJOiAwLAorCQkoX19wc3Vuc2lnbmVkX3QpY29udGV4dC0+ZHVwY250LAorCQkoX19wc3Vuc2lnbmVkX3QpY29udGV4dC0+ZmxhZ3MsCisJCShfX3BzdW5zaWduZWRfdClJTlRfR0VUKG5vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSwKKwkJKF9fcHN1bnNpZ25lZF90KUlOVF9HRVQobm9kZS0+YnRyZWVbMF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSwKKwkJKF9fcHN1bnNpZ25lZF90KUlOVF9HRVQobm9kZS0+YnRyZWVbSU5UX0dFVChub2RlLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCktMV0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSk7Cit9CisKKy8qCisgKiBBZGQgYSB0cmFjZSBidWZmZXIgZW50cnkgZm9yIGEgY29udGV4dCBzdHJ1Y3R1cmUgYW5kIGEgQnRyZWUgZWxlbWVudC4KKyAqLwordm9pZAoreGZzX2F0dHJfdHJhY2VfbF9jYihjaGFyICp3aGVyZSwgc3RydWN0IHhmc19hdHRyX2xpc3RfY29udGV4dCAqY29udGV4dCwKKwkJCSAgc3RydWN0IHhmc19kYV9ub2RlX2VudHJ5ICpidHJlZSkKK3sKKwl4ZnNfYXR0cl90cmFjZV9lbnRlcihYRlNfQVRUUl9LVFJBQ0VfTF9DQiwgd2hlcmUsCisJCShfX3BzdW5zaWduZWRfdCljb250ZXh0LT5kcCwKKwkJKF9fcHN1bnNpZ25lZF90KWNvbnRleHQtPmN1cnNvci0+aGFzaHZhbCwKKwkJKF9fcHN1bnNpZ25lZF90KWNvbnRleHQtPmN1cnNvci0+Ymxrbm8sCisJCShfX3BzdW5zaWduZWRfdCljb250ZXh0LT5jdXJzb3ItPm9mZnNldCwKKwkJKF9fcHN1bnNpZ25lZF90KWNvbnRleHQtPmFsaXN0LAorCQkoX19wc3Vuc2lnbmVkX3QpY29udGV4dC0+YnVmc2l6ZSwKKwkJKF9fcHN1bnNpZ25lZF90KWNvbnRleHQtPmNvdW50LAorCQkoX19wc3Vuc2lnbmVkX3QpY29udGV4dC0+Zmlyc3R1LAorCQkoX19wc3Vuc2lnbmVkX3QpCisJCQkoKGNvbnRleHQtPmNvdW50ID4gMCkgJiYKKwkJCSEoY29udGV4dC0+ZmxhZ3MgJiAoQVRUUl9LRVJOQU1FTFN8QVRUUl9LRVJOT1ZBTCkpKQorCQkJCT8gKEFUVFJfRU5UUlkoY29udGV4dC0+YWxpc3QsCisJCQkJCSAgICAgIGNvbnRleHQtPmNvdW50LTEpLT5hX3ZhbHVlbGVuKQorCQkJCTogMCwKKwkJKF9fcHN1bnNpZ25lZF90KWNvbnRleHQtPmR1cGNudCwKKwkJKF9fcHN1bnNpZ25lZF90KWNvbnRleHQtPmZsYWdzLAorCQkoX19wc3Vuc2lnbmVkX3QpSU5UX0dFVChidHJlZS0+aGFzaHZhbCwgQVJDSF9DT05WRVJUKSwKKwkJKF9fcHN1bnNpZ25lZF90KUlOVF9HRVQoYnRyZWUtPmJlZm9yZSwgQVJDSF9DT05WRVJUKSwKKwkJKF9fcHN1bnNpZ25lZF90KU5VTEwpOworfQorCisvKgorICogQWRkIGEgdHJhY2UgYnVmZmVyIGVudHJ5IGZvciBhIGNvbnRleHQgc3RydWN0dXJlIGFuZCBhIGxlYWYgYmxvY2suCisgKi8KK3ZvaWQKK3hmc19hdHRyX3RyYWNlX2xfY2woY2hhciAqd2hlcmUsIHN0cnVjdCB4ZnNfYXR0cl9saXN0X2NvbnRleHQgKmNvbnRleHQsCisJCQkgICAgICBzdHJ1Y3QgeGZzX2F0dHJfbGVhZmJsb2NrICpsZWFmKQoreworCXhmc19hdHRyX3RyYWNlX2VudGVyKFhGU19BVFRSX0tUUkFDRV9MX0NMLCB3aGVyZSwKKwkJKF9fcHN1bnNpZ25lZF90KWNvbnRleHQtPmRwLAorCQkoX19wc3Vuc2lnbmVkX3QpY29udGV4dC0+Y3Vyc29yLT5oYXNodmFsLAorCQkoX19wc3Vuc2lnbmVkX3QpY29udGV4dC0+Y3Vyc29yLT5ibGtubywKKwkJKF9fcHN1bnNpZ25lZF90KWNvbnRleHQtPmN1cnNvci0+b2Zmc2V0LAorCQkoX19wc3Vuc2lnbmVkX3QpY29udGV4dC0+YWxpc3QsCisJCShfX3BzdW5zaWduZWRfdCljb250ZXh0LT5idWZzaXplLAorCQkoX19wc3Vuc2lnbmVkX3QpY29udGV4dC0+Y291bnQsCisJCShfX3BzdW5zaWduZWRfdCljb250ZXh0LT5maXJzdHUsCisJCShfX3BzdW5zaWduZWRfdCkKKwkJCSgoY29udGV4dC0+Y291bnQgPiAwKSAmJgorCQkJIShjb250ZXh0LT5mbGFncyAmIChBVFRSX0tFUk5BTUVMU3xBVFRSX0tFUk5PVkFMKSkpCisJCQkJPyAoQVRUUl9FTlRSWShjb250ZXh0LT5hbGlzdCwKKwkJCQkJICAgICAgY29udGV4dC0+Y291bnQtMSktPmFfdmFsdWVsZW4pCisJCQkJOiAwLAorCQkoX19wc3Vuc2lnbmVkX3QpY29udGV4dC0+ZHVwY250LAorCQkoX19wc3Vuc2lnbmVkX3QpY29udGV4dC0+ZmxhZ3MsCisJCShfX3BzdW5zaWduZWRfdClJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSwKKwkJKF9fcHN1bnNpZ25lZF90KUlOVF9HRVQobGVhZi0+ZW50cmllc1swXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpLAorCQkoX19wc3Vuc2lnbmVkX3QpSU5UX0dFVChsZWFmLT5lbnRyaWVzW0lOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpLTFdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkpOworfQorCisvKgorICogQWRkIGEgdHJhY2UgYnVmZmVyIGVudHJ5IGZvciB0aGUgYXJndW1lbnRzIGdpdmVuIHRvIHRoZSByb3V0aW5lLAorICogZ2VuZXJpYyBmb3JtLgorICovCit2b2lkCit4ZnNfYXR0cl90cmFjZV9lbnRlcihpbnQgdHlwZSwgY2hhciAqd2hlcmUsCisJCQkgX19wc3Vuc2lnbmVkX3QgYTIsIF9fcHN1bnNpZ25lZF90IGEzLAorCQkJIF9fcHN1bnNpZ25lZF90IGE0LCBfX3BzdW5zaWduZWRfdCBhNSwKKwkJCSBfX3BzdW5zaWduZWRfdCBhNiwgX19wc3Vuc2lnbmVkX3QgYTcsCisJCQkgX19wc3Vuc2lnbmVkX3QgYTgsIF9fcHN1bnNpZ25lZF90IGE5LAorCQkJIF9fcHN1bnNpZ25lZF90IGExMCwgX19wc3Vuc2lnbmVkX3QgYTExLAorCQkJIF9fcHN1bnNpZ25lZF90IGExMiwgX19wc3Vuc2lnbmVkX3QgYTEzLAorCQkJIF9fcHN1bnNpZ25lZF90IGExNCwgX19wc3Vuc2lnbmVkX3QgYTE1KQoreworCUFTU0VSVCh4ZnNfYXR0cl90cmFjZV9idWYpOworCWt0cmFjZV9lbnRlcih4ZnNfYXR0cl90cmFjZV9idWYsICh2b2lkICopKChfX3BzdW5zaWduZWRfdCl0eXBlKSwKKwkJCQkJICh2b2lkICopd2hlcmUsCisJCQkJCSAodm9pZCAqKWEyLCAgKHZvaWQgKilhMywgICh2b2lkICopYTQsCisJCQkJCSAodm9pZCAqKWE1LCAgKHZvaWQgKilhNiwgICh2b2lkICopYTcsCisJCQkJCSAodm9pZCAqKWE4LCAgKHZvaWQgKilhOSwgICh2b2lkICopYTEwLAorCQkJCQkgKHZvaWQgKilhMTEsICh2b2lkICopYTEyLCAodm9pZCAqKWExMywKKwkJCQkJICh2b2lkICopYTE0LCAodm9pZCAqKWExNSk7Cit9CisjZW5kaWYJLyogWEZTX0FUVFJfVFJBQ0UgKi8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU3lzdGVtIChwc2V1ZG8pIG5hbWVzcGFjZSBhdHRyaWJ1dGUgaW50ZXJmYWNlIHJvdXRpbmVzLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitTVEFUSUMgaW50Citwb3NpeF9hY2xfYWNjZXNzX3NldCgKKwl2bm9kZV90CSp2cCwgY2hhciAqbmFtZSwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIGludCB4ZmxhZ3MpCit7CisJcmV0dXJuIHhmc19hY2xfdnNldCh2cCwgZGF0YSwgc2l6ZSwgX0FDTF9UWVBFX0FDQ0VTUyk7Cit9CisKK1NUQVRJQyBpbnQKK3Bvc2l4X2FjbF9hY2Nlc3NfcmVtb3ZlKAorCXN0cnVjdCB2bm9kZSAqdnAsIGNoYXIgKm5hbWUsIGludCB4ZmxhZ3MpCit7CisJcmV0dXJuIHhmc19hY2xfdnJlbW92ZSh2cCwgX0FDTF9UWVBFX0FDQ0VTUyk7Cit9CisKK1NUQVRJQyBpbnQKK3Bvc2l4X2FjbF9hY2Nlc3NfZ2V0KAorCXZub2RlX3QgKnZwLCBjaGFyICpuYW1lLCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgaW50IHhmbGFncykKK3sKKwlyZXR1cm4geGZzX2FjbF92Z2V0KHZwLCBkYXRhLCBzaXplLCBfQUNMX1RZUEVfQUNDRVNTKTsKK30KKworU1RBVElDIGludAorcG9zaXhfYWNsX2FjY2Vzc19leGlzdHMoCisJdm5vZGVfdCAqdnApCit7CisJcmV0dXJuIHhmc19hY2xfdmhhc2FjbF9hY2Nlc3ModnApOworfQorCitTVEFUSUMgaW50Citwb3NpeF9hY2xfZGVmYXVsdF9zZXQoCisJdm5vZGVfdAkqdnAsIGNoYXIgKm5hbWUsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBpbnQgeGZsYWdzKQoreworCXJldHVybiB4ZnNfYWNsX3ZzZXQodnAsIGRhdGEsIHNpemUsIF9BQ0xfVFlQRV9ERUZBVUxUKTsKK30KKworU1RBVElDIGludAorcG9zaXhfYWNsX2RlZmF1bHRfZ2V0KAorCXZub2RlX3QgKnZwLCBjaGFyICpuYW1lLCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgaW50IHhmbGFncykKK3sKKwlyZXR1cm4geGZzX2FjbF92Z2V0KHZwLCBkYXRhLCBzaXplLCBfQUNMX1RZUEVfREVGQVVMVCk7Cit9CisKK1NUQVRJQyBpbnQKK3Bvc2l4X2FjbF9kZWZhdWx0X3JlbW92ZSgKKwlzdHJ1Y3Qgdm5vZGUgKnZwLCBjaGFyICpuYW1lLCBpbnQgeGZsYWdzKQoreworCXJldHVybiB4ZnNfYWNsX3ZyZW1vdmUodnAsIF9BQ0xfVFlQRV9ERUZBVUxUKTsKK30KKworU1RBVElDIGludAorcG9zaXhfYWNsX2RlZmF1bHRfZXhpc3RzKAorCXZub2RlX3QgKnZwKQoreworCXJldHVybiB4ZnNfYWNsX3ZoYXNhY2xfZGVmYXVsdCh2cCk7Cit9CisKK3N0cnVjdCBhdHRybmFtZXMgcG9zaXhfYWNsX2FjY2VzcyA9IHsKKwkuYXR0cl9uYW1lCT0gInBvc2l4X2FjbF9hY2Nlc3MiLAorCS5hdHRyX25hbWVsZW4JPSBzaXplb2YoInBvc2l4X2FjbF9hY2Nlc3MiKSAtIDEsCisJLmF0dHJfZ2V0CT0gcG9zaXhfYWNsX2FjY2Vzc19nZXQsCisJLmF0dHJfc2V0CT0gcG9zaXhfYWNsX2FjY2Vzc19zZXQsCisJLmF0dHJfcmVtb3ZlCT0gcG9zaXhfYWNsX2FjY2Vzc19yZW1vdmUsCisJLmF0dHJfZXhpc3RzCT0gcG9zaXhfYWNsX2FjY2Vzc19leGlzdHMsCit9OworCitzdHJ1Y3QgYXR0cm5hbWVzIHBvc2l4X2FjbF9kZWZhdWx0ID0geworCS5hdHRyX25hbWUJPSAicG9zaXhfYWNsX2RlZmF1bHQiLAorCS5hdHRyX25hbWVsZW4JPSBzaXplb2YoInBvc2l4X2FjbF9kZWZhdWx0IikgLSAxLAorCS5hdHRyX2dldAk9IHBvc2l4X2FjbF9kZWZhdWx0X2dldCwKKwkuYXR0cl9zZXQJPSBwb3NpeF9hY2xfZGVmYXVsdF9zZXQsCisJLmF0dHJfcmVtb3ZlCT0gcG9zaXhfYWNsX2RlZmF1bHRfcmVtb3ZlLAorCS5hdHRyX2V4aXN0cwk9IHBvc2l4X2FjbF9kZWZhdWx0X2V4aXN0cywKK307CisKK3N0cnVjdCBhdHRybmFtZXMgKmF0dHJfc3lzdGVtX25hbWVzW10gPQorCXsgJnBvc2l4X2FjbF9hY2Nlc3MsICZwb3NpeF9hY2xfZGVmYXVsdCB9OworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBOYW1lc3BhY2UtcHJlZml4LXN0eWxlIGF0dHJpYnV0ZSBuYW1lIGludGVyZmFjZSByb3V0aW5lcy4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworU1RBVElDIGludAorYXR0cl9nZW5lcmljX3NldCgKKwlzdHJ1Y3Qgdm5vZGUgKnZwLCBjaGFyICpuYW1lLCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgaW50IHhmbGFncykKK3sKKwlpbnQgCWVycm9yOworCisJVk9QX0FUVFJfU0VUKHZwLCBuYW1lLCBkYXRhLCBzaXplLCB4ZmxhZ3MsIE5VTEwsIGVycm9yKTsKKwlyZXR1cm4gLWVycm9yOworfQorCitTVEFUSUMgaW50CithdHRyX2dlbmVyaWNfZ2V0KAorCXN0cnVjdCB2bm9kZSAqdnAsIGNoYXIgKm5hbWUsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBpbnQgeGZsYWdzKQoreworCWludAllcnJvciwgYXNpemUgPSBzaXplOworCisJVk9QX0FUVFJfR0VUKHZwLCBuYW1lLCBkYXRhLCAmYXNpemUsIHhmbGFncywgTlVMTCwgZXJyb3IpOworCWlmICghZXJyb3IpCisJCXJldHVybiBhc2l6ZTsKKwlyZXR1cm4gLWVycm9yOworfQorCitTVEFUSUMgaW50CithdHRyX2dlbmVyaWNfcmVtb3ZlKAorCXN0cnVjdCB2bm9kZSAqdnAsIGNoYXIgKm5hbWUsIGludCB4ZmxhZ3MpCit7CisJaW50CWVycm9yOworCisJVk9QX0FUVFJfUkVNT1ZFKHZwLCBuYW1lLCB4ZmxhZ3MsIE5VTEwsIGVycm9yKTsKKwlyZXR1cm4gLWVycm9yOworfQorCitTVEFUSUMgaW50CithdHRyX2dlbmVyaWNfbGlzdGFkZCgKKwlhdHRybmFtZXNfdAkJKnByZWZpeCwKKwlhdHRybmFtZXNfdAkJKm5hbWVzcCwKKwl2b2lkCQkJKmRhdGEsCisJc2l6ZV90CQkJc2l6ZSwKKwlzc2l6ZV90CQkJKnJlc3VsdCkKK3sKKwljaGFyCQkJKnAgPSBkYXRhICsgKnJlc3VsdDsKKworCSpyZXN1bHQgKz0gcHJlZml4LT5hdHRyX25hbWVsZW47CisJKnJlc3VsdCArPSBuYW1lc3AtPmF0dHJfbmFtZWxlbiArIDE7CisJaWYgKCFzaXplKQorCQlyZXR1cm4gMDsKKwlpZiAoKnJlc3VsdCA+IHNpemUpCisJCXJldHVybiAtRVJBTkdFOworCXN0cmNweShwLCBwcmVmaXgtPmF0dHJfbmFtZSk7CisJcCArPSBwcmVmaXgtPmF0dHJfbmFtZWxlbjsKKwlzdHJjcHkocCwgbmFtZXNwLT5hdHRyX25hbWUpOworCXAgKz0gbmFtZXNwLT5hdHRyX25hbWVsZW4gKyAxOworCXJldHVybiAwOworfQorCitTVEFUSUMgaW50CithdHRyX3N5c3RlbV9saXN0KAorCXN0cnVjdCB2bm9kZQkJKnZwLAorCXZvaWQJCQkqZGF0YSwKKwlzaXplX3QJCQlzaXplLAorCXNzaXplX3QJCQkqcmVzdWx0KQoreworCWF0dHJuYW1lc190CQkqbmFtZXNwOworCWludAkJCWksIGVycm9yID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBBVFRSX1NZU0NPVU5UOyBpKyspIHsKKwkJbmFtZXNwID0gYXR0cl9zeXN0ZW1fbmFtZXNbaV07CisJCWlmICghbmFtZXNwLT5hdHRyX2V4aXN0cyB8fCAhbmFtZXNwLT5hdHRyX2V4aXN0cyh2cCkpCisJCQljb250aW51ZTsKKwkJZXJyb3IgPSBhdHRyX2dlbmVyaWNfbGlzdGFkZCgmYXR0cl9zeXN0ZW0sIG5hbWVzcCwKKwkJCQkJCWRhdGEsIHNpemUsIHJlc3VsdCk7CisJCWlmIChlcnJvcikKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKK2ludAorYXR0cl9nZW5lcmljX2xpc3QoCisJc3RydWN0IHZub2RlICp2cCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIGludCB4ZmxhZ3MsIHNzaXplX3QgKnJlc3VsdCkKK3sKKwlhdHRybGlzdF9jdXJzb3Jfa2Vybl90CWN1cnNvciA9IHsgMCB9OworCWludAkJCWVycm9yOworCisJVk9QX0FUVFJfTElTVCh2cCwgZGF0YSwgc2l6ZSwgeGZsYWdzLCAmY3Vyc29yLCBOVUxMLCBlcnJvcik7CisJaWYgKGVycm9yID4gMCkKKwkJcmV0dXJuIC1lcnJvcjsKKwkqcmVzdWx0ID0gLWVycm9yOworCXJldHVybiBhdHRyX3N5c3RlbV9saXN0KHZwLCBkYXRhLCBzaXplLCByZXN1bHQpOworfQorCithdHRybmFtZXNfdCAqCithdHRyX2xvb2t1cF9uYW1lc3BhY2UoCisJY2hhcgkJCSpuYW1lLAorCXN0cnVjdCBhdHRybmFtZXMJKipuYW1lcywKKwlpbnQJCQlubmFtZXMpCit7CisJaW50CQkJaTsKKworCWZvciAoaSA9IDA7IGkgPCBubmFtZXM7IGkrKykKKwkJaWYgKCFzdHJuY21wKG5hbWUsIG5hbWVzW2ldLT5hdHRyX25hbWUsIG5hbWVzW2ldLT5hdHRyX25hbWVsZW4pKQorCQkJcmV0dXJuIG5hbWVzW2ldOworCXJldHVybiBOVUxMOworfQorCisvKgorICogU29tZSBjaGVja3MgdG8gcHJldmVudCBwZW9wbGUgYWJ1c2luZyBFQXMgdG8gZ2V0IG92ZXIgcXVvdGE6CisgKiAtIERvbid0IGFsbG93IG1vZGlmeWluZyB1c2VyIEVBcyBvbiBkZXZpY2VzL3N5bWxpbmtzOworICogLSBEb24ndCBhbGxvdyBtb2RpZnlpbmcgdXNlciBFQXMgaWYgc3RpY2t5IGJpdCBzZXQ7CisgKi8KK1NUQVRJQyBpbnQKK2F0dHJfdXNlcl9jYXBhYmxlKAorCXN0cnVjdCB2bm9kZQkqdnAsCisJY3JlZF90CQkqY3JlZCkKK3sKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gTElOVkZTX0dFVF9JUCh2cCk7CisKKwlpZiAoSVNfSU1NVVRBQkxFKGlub2RlKSB8fCBJU19BUFBFTkQoaW5vZGUpKQorCQlyZXR1cm4gLUVQRVJNOworCWlmICghU19JU1JFRyhpbm9kZS0+aV9tb2RlKSAmJiAhU19JU0RJUihpbm9kZS0+aV9tb2RlKSAmJgorCSAgICAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSAmJiAoaW5vZGUtPmlfbW9kZSAmIFNfSVNWVFgpICYmCisJICAgIChjdXJyZW50X2ZzdWlkKGNyZWQpICE9IGlub2RlLT5pX3VpZCkgJiYgIWNhcGFibGUoQ0FQX0ZPV05FUikpCisJCXJldHVybiAtRVBFUk07CisJcmV0dXJuIDA7Cit9CisKK1NUQVRJQyBpbnQKK2F0dHJfdHJ1c3RlZF9jYXBhYmxlKAorCXN0cnVjdCB2bm9kZQkqdnAsCisJY3JlZF90CQkqY3JlZCkKK3sKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gTElOVkZTX0dFVF9JUCh2cCk7CisKKwlpZiAoSVNfSU1NVVRBQkxFKGlub2RlKSB8fCBJU19BUFBFTkQoaW5vZGUpKQorCQlyZXR1cm4gLUVQRVJNOworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKKwlyZXR1cm4gMDsKK30KKworU1RBVElDIGludAorYXR0cl9zZWN1cmVfY2FwYWJsZSgKKwlzdHJ1Y3Qgdm5vZGUJKnZwLAorCWNyZWRfdAkJKmNyZWQpCit7CisJcmV0dXJuIC1FTk9TRUNVUklUWTsKK30KKworU1RBVElDIGludAorYXR0cl9zeXN0ZW1fc2V0KAorCXN0cnVjdCB2bm9kZSAqdnAsIGNoYXIgKm5hbWUsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBpbnQgeGZsYWdzKQoreworCWF0dHJuYW1lc190CSpuYW1lc3A7CisJaW50CQllcnJvcjsKKworCWlmICh4ZmxhZ3MgJiBBVFRSX0NSRUFURSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwluYW1lc3AgPSBhdHRyX2xvb2t1cF9uYW1lc3BhY2UobmFtZSwgYXR0cl9zeXN0ZW1fbmFtZXMsIEFUVFJfU1lTQ09VTlQpOworCWlmICghbmFtZXNwKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJZXJyb3IgPSBuYW1lc3AtPmF0dHJfc2V0KHZwLCBuYW1lLCBkYXRhLCBzaXplLCB4ZmxhZ3MpOworCWlmICghZXJyb3IpCisJCWVycm9yID0gdm5fcmV2YWxpZGF0ZSh2cCk7CisJcmV0dXJuIGVycm9yOworfQorCitTVEFUSUMgaW50CithdHRyX3N5c3RlbV9nZXQoCisJc3RydWN0IHZub2RlICp2cCwgY2hhciAqbmFtZSwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIGludCB4ZmxhZ3MpCit7CisJYXR0cm5hbWVzX3QJKm5hbWVzcDsKKworCW5hbWVzcCA9IGF0dHJfbG9va3VwX25hbWVzcGFjZShuYW1lLCBhdHRyX3N5c3RlbV9uYW1lcywgQVRUUl9TWVNDT1VOVCk7CisJaWYgKCFuYW1lc3ApCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwlyZXR1cm4gbmFtZXNwLT5hdHRyX2dldCh2cCwgbmFtZSwgZGF0YSwgc2l6ZSwgeGZsYWdzKTsKK30KKworU1RBVElDIGludAorYXR0cl9zeXN0ZW1fcmVtb3ZlKAorCXN0cnVjdCB2bm9kZSAqdnAsIGNoYXIgKm5hbWUsIGludCB4ZmxhZ3MpCit7CisJYXR0cm5hbWVzX3QJKm5hbWVzcDsKKworCW5hbWVzcCA9IGF0dHJfbG9va3VwX25hbWVzcGFjZShuYW1lLCBhdHRyX3N5c3RlbV9uYW1lcywgQVRUUl9TWVNDT1VOVCk7CisJaWYgKCFuYW1lc3ApCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwlyZXR1cm4gbmFtZXNwLT5hdHRyX3JlbW92ZSh2cCwgbmFtZSwgeGZsYWdzKTsKK30KKworc3RydWN0IGF0dHJuYW1lcyBhdHRyX3N5c3RlbSA9IHsKKwkuYXR0cl9uYW1lCT0gInN5c3RlbS4iLAorCS5hdHRyX25hbWVsZW4JPSBzaXplb2YoInN5c3RlbS4iKSAtIDEsCisJLmF0dHJfZmxhZwk9IEFUVFJfU1lTVEVNLAorCS5hdHRyX2dldAk9IGF0dHJfc3lzdGVtX2dldCwKKwkuYXR0cl9zZXQJPSBhdHRyX3N5c3RlbV9zZXQsCisJLmF0dHJfcmVtb3ZlCT0gYXR0cl9zeXN0ZW1fcmVtb3ZlLAorCS5hdHRyX2NhcGFibGUJPSAoYXR0cmNhcGFibGVfdClmc19ub2VyciwKK307CisKK3N0cnVjdCBhdHRybmFtZXMgYXR0cl90cnVzdGVkID0geworCS5hdHRyX25hbWUJPSAidHJ1c3RlZC4iLAorCS5hdHRyX25hbWVsZW4JPSBzaXplb2YoInRydXN0ZWQuIikgLSAxLAorCS5hdHRyX2ZsYWcJPSBBVFRSX1JPT1QsCisJLmF0dHJfZ2V0CT0gYXR0cl9nZW5lcmljX2dldCwKKwkuYXR0cl9zZXQJPSBhdHRyX2dlbmVyaWNfc2V0LAorCS5hdHRyX3JlbW92ZQk9IGF0dHJfZ2VuZXJpY19yZW1vdmUsCisJLmF0dHJfY2FwYWJsZQk9IGF0dHJfdHJ1c3RlZF9jYXBhYmxlLAorfTsKKworc3RydWN0IGF0dHJuYW1lcyBhdHRyX3NlY3VyZSA9IHsKKwkuYXR0cl9uYW1lCT0gInNlY3VyaXR5LiIsCisJLmF0dHJfbmFtZWxlbgk9IHNpemVvZigic2VjdXJpdHkuIikgLSAxLAorCS5hdHRyX2ZsYWcJPSBBVFRSX1NFQ1VSRSwKKwkuYXR0cl9nZXQJPSBhdHRyX2dlbmVyaWNfZ2V0LAorCS5hdHRyX3NldAk9IGF0dHJfZ2VuZXJpY19zZXQsCisJLmF0dHJfcmVtb3ZlCT0gYXR0cl9nZW5lcmljX3JlbW92ZSwKKwkuYXR0cl9jYXBhYmxlCT0gYXR0cl9zZWN1cmVfY2FwYWJsZSwKK307CisKK3N0cnVjdCBhdHRybmFtZXMgYXR0cl91c2VyID0geworCS5hdHRyX25hbWUJPSAidXNlci4iLAorCS5hdHRyX25hbWVsZW4JPSBzaXplb2YoInVzZXIuIikgLSAxLAorCS5hdHRyX2dldAk9IGF0dHJfZ2VuZXJpY19nZXQsCisJLmF0dHJfc2V0CT0gYXR0cl9nZW5lcmljX3NldCwKKwkuYXR0cl9yZW1vdmUJPSBhdHRyX2dlbmVyaWNfcmVtb3ZlLAorCS5hdHRyX2NhcGFibGUJPSBhdHRyX3VzZXJfY2FwYWJsZSwKK307CisKK3N0cnVjdCBhdHRybmFtZXMgKmF0dHJfbmFtZXNwYWNlc1tdID0KKwl7ICZhdHRyX3N5c3RlbSwgJmF0dHJfdHJ1c3RlZCwgJmF0dHJfc2VjdXJlLCAmYXR0cl91c2VyIH07CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2F0dHIuaCBiL2ZzL3hmcy94ZnNfYXR0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3Y2QwZjUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2F0dHIuaApAQCAtMCwwICsxLDE5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMi0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfQVRUUl9IX18KKyNkZWZpbmUJX19YRlNfQVRUUl9IX18KKworLyoKKyAqIHhmc19hdHRyLmgKKyAqCisgKiBMYXJnZSBhdHRyaWJ1dGUgbGlzdHMgYXJlIHN0cnVjdHVyZWQgYXJvdW5kIEJ0cmVlcyB3aGVyZSBhbGwgdGhlIGRhdGEKKyAqIGVsZW1lbnRzIGFyZSBpbiB0aGUgbGVhZiBub2Rlcy4gIEF0dHJpYnV0ZSBuYW1lcyBhcmUgaGFzaGVkIGludG8gYW4gaW50LAorICogdGhlbiB0aGF0IGludCBpcyB1c2VkIGFzIHRoZSBpbmRleCBpbnRvIHRoZSBCdHJlZS4gIFNpbmNlIHRoZSBoYXNodmFsCisgKiBvZiBhbiBhdHRyaWJ1dGUgbmFtZSBtYXkgbm90IGJlIHVuaXF1ZSwgd2UgbWF5IGhhdmUgZHVwbGljYXRlIGtleXMuCisgKiBUaGUgaW50ZXJuYWwgbGlua3MgaW4gdGhlIEJ0cmVlIGFyZSBsb2dpY2FsIGJsb2NrIG9mZnNldHMgaW50byB0aGUgZmlsZS4KKyAqCisgKiBTbWFsbCBhdHRyaWJ1dGUgbGlzdHMgdXNlIGEgZGlmZmVyZW50IGZvcm1hdCBhbmQgYXJlIHBhY2tlZCBhcyB0aWdodGx5CisgKiBhcyBwb3NzaWJsZSBzbyBhcyB0byBmaXQgaW50byB0aGUgbGl0ZXJhbCBhcmVhIG9mIHRoZSBpbm9kZS4KKyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRXh0ZXJuYWwgaW50ZXJmYWNlcworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdHJ1Y3QgY3JlZDsKK3N0cnVjdCB2bm9kZTsKKwordHlwZWRlZiBpbnQgKCphdHRyc2V0X3QpKHN0cnVjdCB2bm9kZSAqLCBjaGFyICosIHZvaWQgKiwgc2l6ZV90LCBpbnQpOwordHlwZWRlZiBpbnQgKCphdHRyZ2V0X3QpKHN0cnVjdCB2bm9kZSAqLCBjaGFyICosIHZvaWQgKiwgc2l6ZV90LCBpbnQpOwordHlwZWRlZiBpbnQgKCphdHRycmVtb3ZlX3QpKHN0cnVjdCB2bm9kZSAqLCBjaGFyICosIGludCk7Cit0eXBlZGVmIGludCAoKmF0dHJleGlzdHNfdCkoc3RydWN0IHZub2RlICopOwordHlwZWRlZiBpbnQgKCphdHRyY2FwYWJsZV90KShzdHJ1Y3Qgdm5vZGUgKiwgc3RydWN0IGNyZWQgKik7CisKK3R5cGVkZWYgc3RydWN0IGF0dHJuYW1lcyB7CisJY2hhciAqCQlhdHRyX25hbWU7CisJdW5zaWduZWQgaW50CWF0dHJfbmFtZWxlbjsKKwl1bnNpZ25lZCBpbnQJYXR0cl9mbGFnOworCWF0dHJnZXRfdAlhdHRyX2dldDsKKwlhdHRyc2V0X3QJYXR0cl9zZXQ7CisJYXR0cnJlbW92ZV90CWF0dHJfcmVtb3ZlOworCWF0dHJleGlzdHNfdAlhdHRyX2V4aXN0czsKKwlhdHRyY2FwYWJsZV90CWF0dHJfY2FwYWJsZTsKK30gYXR0cm5hbWVzX3Q7CisKKyNkZWZpbmUgQVRUUl9OQU1FQ09VTlQJNAorZXh0ZXJuIHN0cnVjdCBhdHRybmFtZXMgYXR0cl91c2VyOworZXh0ZXJuIHN0cnVjdCBhdHRybmFtZXMgYXR0cl9zZWN1cmU7CitleHRlcm4gc3RydWN0IGF0dHJuYW1lcyBhdHRyX3N5c3RlbTsKK2V4dGVybiBzdHJ1Y3QgYXR0cm5hbWVzIGF0dHJfdHJ1c3RlZDsKK2V4dGVybiBzdHJ1Y3QgYXR0cm5hbWVzICphdHRyX25hbWVzcGFjZXNbQVRUUl9OQU1FQ09VTlRdOworCisjZGVmaW5lIEFUVFJfU1lTQ09VTlQJMgorZXh0ZXJuIHN0cnVjdCBhdHRybmFtZXMgcG9zaXhfYWNsX2FjY2VzczsKK2V4dGVybiBzdHJ1Y3QgYXR0cm5hbWVzIHBvc2l4X2FjbF9kZWZhdWx0OworZXh0ZXJuIHN0cnVjdCBhdHRybmFtZXMgKmF0dHJfc3lzdGVtX25hbWVzW0FUVFJfU1lTQ09VTlRdOworCitleHRlcm4gYXR0cm5hbWVzX3QgKmF0dHJfbG9va3VwX25hbWVzcGFjZShjaGFyICosIGF0dHJuYW1lc190ICoqLCBpbnQpOworZXh0ZXJuIGludCBhdHRyX2dlbmVyaWNfbGlzdChzdHJ1Y3Qgdm5vZGUgKiwgdm9pZCAqLCBzaXplX3QsIGludCwgc3NpemVfdCAqKTsKKworI2RlZmluZSBBVFRSX0RPTlRGT0xMT1cJMHgwMDAxCS8qIC0tIHVudXNlZCwgZnJvbSBJUklYIC0tICovCisjZGVmaW5lIEFUVFJfUk9PVAkweDAwMDIJLyogdXNlIGF0dHJzIGluIHJvb3QgKHRydXN0ZWQpIG5hbWVzcGFjZSAqLworI2RlZmluZSBBVFRSX1RSVVNUCTB4MDAwNAkvKiAtLSB1bnVzZWQsIGZyb20gSVJJWCAtLSAqLworI2RlZmluZSBBVFRSX1NFQ1VSRQkweDAwMDgJLyogdXNlIGF0dHJzIGluIHNlY3VyaXR5IG5hbWVzcGFjZSAqLworI2RlZmluZSBBVFRSX0NSRUFURQkweDAwMTAJLyogcHVyZSBjcmVhdGU6IGZhaWwgaWYgYXR0ciBhbHJlYWR5IGV4aXN0cyAqLworI2RlZmluZSBBVFRSX1JFUExBQ0UJMHgwMDIwCS8qIHB1cmUgc2V0OiBmYWlsIGlmIGF0dHIgZG9lcyBub3QgZXhpc3QgKi8KKyNkZWZpbmUgQVRUUl9TWVNURU0JMHgwMTAwCS8qIHVzZSBhdHRycyBpbiBzeXN0ZW0gKHBzZXVkbykgbmFtZXNwYWNlICovCisKKyNkZWZpbmUgQVRUUl9LRVJOQUNDRVNTCTB4MDQwMAkvKiBba2VybmVsXSBpYWNjZXNzLCBpbm9kZSBoZWxkIGlvLWxvY2tlZCAqLworI2RlZmluZSBBVFRSX0tFUk5PVElNRQkweDEwMDAJLyogW2tlcm5lbF0gZG9uJ3QgdXBkYXRlIGlub2RlIHRpbWVzdGFtcHMgKi8KKyNkZWZpbmUgQVRUUl9LRVJOT1ZBTAkweDIwMDAJLyogW2tlcm5lbF0gZ2V0IGF0dHIgc2l6ZSBvbmx5LCBub3QgdmFsdWUgKi8KKyNkZWZpbmUgQVRUUl9LRVJOQU1FTFMJMHg0MDAwCS8qIFtrZXJuZWxdIGxpc3QgYXR0ciBuYW1lcyAoc2ltcGxlIGxpc3QpICovCisKKyNkZWZpbmUgQVRUUl9LRVJOT1JNQUxTCTB4MDgwMAkvKiBba2VybmVsXSBub3JtYWwgYXR0ciBsaXN0OiB1c2VyK3NlY3VyZSAqLworI2RlZmluZSBBVFRSX0tFUk5ST09UTFMJMHg4MDAwCS8qIFtrZXJuZWxdIGluY2x1ZGUgcm9vdCBpbiB0aGUgYXR0ciBsaXN0ICovCisjZGVmaW5lIEFUVFJfS0VSTkZVTExTCShBVFRSX0tFUk5PUk1BTFN8QVRUUl9LRVJOUk9PVExTKQorCisvKgorICogVGhlIG1heGltdW0gc2l6ZSAoaW50byB0aGUga2VybmVsIG9yIHJldHVybmVkIGZyb20gdGhlIGtlcm5lbCkgb2YgYW4KKyAqIGF0dHJpYnV0ZSB2YWx1ZSBvciB0aGUgYnVmZmVyIHVzZWQgZm9yIGFuIGF0dHJfbGlzdCgpIGNhbGwuICBMYXJnZXIKKyAqIHNpemVzIHdpbGwgcmVzdWx0IGluIGFuIEVSQU5HRSByZXR1cm4gY29kZS4KKyAqLworI2RlZmluZQlBVFRSX01BWF9WQUxVRUxFTgkoNjQqMTAyNCkJLyogbWF4IGxlbmd0aCBvZiBhIHZhbHVlICovCisKKy8qCisgKiBEZWZpbmUgaG93IGxpc3RzIG9mIGF0dHJpYnV0ZSBuYW1lcyBhcmUgcmV0dXJuZWQgdG8gdGhlIHVzZXIgZnJvbQorICogdGhlIGF0dHJfbGlzdCgpIGNhbGwuICBBIGxhcmdlLCAzMmJpdCBhbGlnbmVkLCBidWZmZXIgaXMgcGFzc2VkIGluCisgKiBhbG9uZyB3aXRoIGl0cyBzaXplLiAgV2UgcHV0IGFuIGFycmF5IG9mIG9mZnNldHMgYXQgdGhlIHRvcCB0aGF0IGVhY2gKKyAqIHJlZmVyZW5jZSBhbiBhdHRybGlzdF9lbnRfdCBhbmQgcGFjayB0aGUgYXR0cmxpc3RfZW50X3QncyBhdCB0aGUgYm90dG9tLgorICovCit0eXBlZGVmIHN0cnVjdCBhdHRybGlzdCB7CisJX19zMzIJYWxfY291bnQ7CS8qIG51bWJlciBvZiBlbnRyaWVzIGluIGF0dHJsaXN0ICovCisJX19zMzIJYWxfbW9yZTsJLyogVC9GOiBtb3JlIGF0dHJzIChkbyBjYWxsIGFnYWluKSAqLworCV9fczMyCWFsX29mZnNldFsxXTsJLyogYnl0ZSBvZmZzZXRzIG9mIGF0dHJzIFt2YXItc2l6ZWRdICovCit9IGF0dHJsaXN0X3Q7CisKKy8qCisgKiBTaG93IHRoZSBpbnRlcmVzdGluZyBpbmZvIGFib3V0IG9uZSBhdHRyaWJ1dGUuICBUaGlzIGlzIHdoYXQgdGhlCisgKiBhbF9vZmZzZXRbaV0gZW50cnkgcG9pbnRzIHRvLgorICovCit0eXBlZGVmIHN0cnVjdCBhdHRybGlzdF9lbnQgewkvKiBkYXRhIGZyb20gYXR0cl9saXN0KCkgKi8KKwlfX3UzMglhX3ZhbHVlbGVuOwkvKiBudW1iZXIgYnl0ZXMgaW4gdmFsdWUgb2YgYXR0ciAqLworCWNoYXIJYV9uYW1lWzFdOwkvKiBhdHRyIG5hbWUgKE5VTEwgdGVybWluYXRlZCkgKi8KK30gYXR0cmxpc3RfZW50X3Q7CisKKy8qCisgKiBHaXZlbiBhIHBvaW50ZXIgdG8gdGhlIChjaGFyKikgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGF0dHJfbGlzdCgpIHJlc3VsdCwKKyAqIGFuZCBhbiBpbmRleCwgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgaW5kaWNhdGVkIGF0dHJpYnV0ZSBpbiB0aGUgYnVmZmVyLgorICovCisjZGVmaW5lCUFUVFJfRU5UUlkoYnVmZmVyLCBpbmRleCkJCVwKKwkoKGF0dHJsaXN0X2VudF90ICopCQkJXAorCSAmKChjaGFyICopYnVmZmVyKVsgKChhdHRybGlzdF90ICopKGJ1ZmZlcikpLT5hbF9vZmZzZXRbaW5kZXhdIF0pCisKKy8qCisgKiBNdWx0aS1hdHRyaWJ1dGUgb3BlcmF0aW9uIHZlY3Rvci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgYXR0cl9tdWx0aW9wIHsKKwlpbnQJYW1fb3Bjb2RlOwkvKiBvcGVyYXRpb24gdG8gcGVyZm9ybSAoQVRUUl9PUF9HRVQsIGV0Yy4pICovCisJaW50CWFtX2Vycm9yOwkvKiBbb3V0IGFyZ10gcmVzdWx0IG9mIHRoaXMgc3ViLW9wIChhbiBlcnJubykgKi8KKwljaGFyCSphbV9hdHRybmFtZTsJLyogYXR0cmlidXRlIG5hbWUgdG8gd29yayB3aXRoICovCisJY2hhcgkqYW1fYXR0cnZhbHVlOwkvKiBbaW4vb3V0IGFyZ10gYXR0cmlidXRlIHZhbHVlIChyYXcgYnl0ZXMpICovCisJaW50CWFtX2xlbmd0aDsJLyogW2luL291dCBhcmddIGxlbmd0aCBvZiB2YWx1ZSAqLworCWludAlhbV9mbGFnczsJLyogYml0d2lzZSBPUiBvZiBhdHRyIEFQSSBmbGFncyBkZWZpbmVkIGFib3ZlICovCit9IGF0dHJfbXVsdGlvcF90OworCisjZGVmaW5lIEFUVFJfT1BfR0VUCTEJLyogcmV0dXJuIHRoZSBpbmRpY2F0ZWQgYXR0cidzIHZhbHVlICovCisjZGVmaW5lIEFUVFJfT1BfU0VUCTIJLyogc2V0L2NyZWF0ZSB0aGUgaW5kaWNhdGVkIGF0dHIvdmFsdWUgcGFpciAqLworI2RlZmluZSBBVFRSX09QX1JFTU9WRQkzCS8qIHJlbW92ZSB0aGUgaW5kaWNhdGVkIGF0dHIgKi8KKworLyoKKyAqIEtlcm5lbC1pbnRlcm5hbCB2ZXJzaW9uIG9mIHRoZSBhdHRybGlzdCBjdXJzb3IuCisgKi8KK3R5cGVkZWYgc3RydWN0IGF0dHJsaXN0X2N1cnNvcl9rZXJuIHsKKwlfX3UzMgloYXNodmFsOwkvKiBoYXNoIHZhbHVlIG9mIG5leHQgZW50cnkgdG8gYWRkICovCisJX191MzIJYmxrbm87CQkvKiBibG9jayBjb250YWluaW5nIGVudHJ5IChzdWdnZXN0aW9uKSAqLworCV9fdTMyCW9mZnNldDsJCS8qIG9mZnNldCBpbiBsaXN0IG9mIGVxdWFsLWhhc2h2YWxzICovCisJX191MTYJcGFkMTsJCS8qIHBhZGRpbmcgdG8gbWF0Y2ggdXNlci1sZXZlbCAqLworCV9fdTgJcGFkMjsJCS8qIHBhZGRpbmcgdG8gbWF0Y2ggdXNlci1sZXZlbCAqLworCV9fdTgJaW5pdHRlZDsJLyogVC9GOiBjdXJzb3IgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgKi8KK30gYXR0cmxpc3RfY3Vyc29yX2tlcm5fdDsKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRnVuY3Rpb24gcHJvdG90eXBlcyBmb3IgdGhlIGtlcm5lbC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RydWN0IHhmc19pbm9kZTsKK3N0cnVjdCBhdHRybGlzdF9jdXJzb3Jfa2VybjsKK3N0cnVjdCB4ZnNfZGFfYXJnczsKKworLyoKKyAqIE92ZXJhbGwgZXh0ZXJuYWwgaW50ZXJmYWNlIHJvdXRpbmVzLgorICovCitpbnQgeGZzX2F0dHJfZ2V0KGJodl9kZXNjX3QgKiwgY2hhciAqLCBjaGFyICosIGludCAqLCBpbnQsIHN0cnVjdCBjcmVkICopOworaW50IHhmc19hdHRyX3NldChiaHZfZGVzY190ICosIGNoYXIgKiwgY2hhciAqLCBpbnQsIGludCwgc3RydWN0IGNyZWQgKik7CitpbnQgeGZzX2F0dHJfcmVtb3ZlKGJodl9kZXNjX3QgKiwgY2hhciAqLCBpbnQsIHN0cnVjdCBjcmVkICopOworaW50IHhmc19hdHRyX2xpc3QoYmh2X2Rlc2NfdCAqLCBjaGFyICosIGludCwgaW50LAorCQkJIHN0cnVjdCBhdHRybGlzdF9jdXJzb3Jfa2VybiAqLCBzdHJ1Y3QgY3JlZCAqKTsKK2ludCB4ZnNfYXR0cl9pbmFjdGl2ZShzdHJ1Y3QgeGZzX2lub2RlICpkcCk7CisKK2ludCB4ZnNfYXR0cl9ub2RlX2dldChzdHJ1Y3QgeGZzX2RhX2FyZ3MgKik7CitpbnQgeGZzX2F0dHJfbGVhZl9nZXQoc3RydWN0IHhmc19kYV9hcmdzICopOworaW50IHhmc19hdHRyX3Nob3J0Zm9ybV9nZXR2YWx1ZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKik7CitpbnQgeGZzX2F0dHJfZmV0Y2goc3RydWN0IHhmc19pbm9kZSAqLCBjaGFyICosIGludCwKKwkJCWNoYXIgKiwgaW50ICosIGludCwgc3RydWN0IGNyZWQgKik7CisKKyNlbmRpZgkvKiBfX1hGU19BVFRSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hdHRyX2xlYWYuYyBiL2ZzL3hmcy94ZnNfYXR0cl9sZWFmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjExMjU2ZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfYXR0cl9sZWFmLmMKQEAgLTAsMCArMSwzMDUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworLyoKKyAqIHhmc19hdHRyX2xlYWYuYworICoKKyAqIEdST1Q6IGZpZ3VyZSBvdXQgaG93IHRvIHJlY292ZXIgZ3JhY2VmdWxseSB3aGVuIGJtYXAgcmV0dXJucyBFTk9TUEMuCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorCisjaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc190eXBlcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19hZy5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19hbGxvYy5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2JtYXAuaCIKKyNpbmNsdWRlICJ4ZnNfZGFfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0ci5oIgorI2luY2x1ZGUgInhmc19hdHRyX2xlYWYuaCIKKyNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCisKKy8qCisgKiB4ZnNfYXR0cl9sZWFmLmMKKyAqCisgKiBSb3V0aW5lcyB0byBpbXBsZW1lbnQgbGVhZiBibG9ja3Mgb2YgYXR0cmlidXRlcyBhcyBCdHJlZXMgb2YgaGFzaGVkIG5hbWVzLgorICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGdW5jdGlvbiBwcm90b3R5cGVzIGZvciB0aGUga2VybmVsLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICogUm91dGluZXMgdXNlZCBmb3IgZ3Jvd2luZyB0aGUgQnRyZWUuCisgKi8KK1NUQVRJQyBpbnQgeGZzX2F0dHJfbGVhZl9hZGRfd29yayh4ZnNfZGFidWZfdCAqbGVhZl9idWZmZXIsIHhmc19kYV9hcmdzX3QgKmFyZ3MsCisJCQkJCSAgICAgIGludCBmcmVlbWFwX2luZGV4KTsKK1NUQVRJQyB2b2lkIHhmc19hdHRyX2xlYWZfY29tcGFjdCh4ZnNfdHJhbnNfdCAqdHJhbnMsIHhmc19kYWJ1Zl90ICpsZWFmX2J1ZmZlcik7CitTVEFUSUMgdm9pZCB4ZnNfYXR0cl9sZWFmX3JlYmFsYW5jZSh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUsCisJCQkJCQkgICB4ZnNfZGFfc3RhdGVfYmxrX3QgKmJsazEsCisJCQkJCQkgICB4ZnNfZGFfc3RhdGVfYmxrX3QgKmJsazIpOworU1RBVElDIGludCB4ZnNfYXR0cl9sZWFmX2ZpZ3VyZV9iYWxhbmNlKHhmc19kYV9zdGF0ZV90ICpzdGF0ZSwKKwkJCQkJICAgeGZzX2RhX3N0YXRlX2Jsa190ICpsZWFmX2Jsa18xLAorCQkJCQkgICB4ZnNfZGFfc3RhdGVfYmxrX3QgKmxlYWZfYmxrXzIsCisJCQkJCSAgIGludCAqbnVtYmVyX2VudHJpZXNfaW5fYmxrMSwKKwkJCQkJICAgaW50ICpudW1iZXJfdXNlZGJ5dGVzX2luX2JsazEpOworCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqLworU1RBVElDIHZvaWQgeGZzX2F0dHJfbGVhZl9tb3ZlZW50cyh4ZnNfYXR0cl9sZWFmYmxvY2tfdCAqc3JjX2xlYWYsCisJCQkJCSBpbnQgc3JjX3N0YXJ0LAorCQkJCQkgeGZzX2F0dHJfbGVhZmJsb2NrX3QgKmRzdF9sZWFmLAorCQkJCQkgaW50IGRzdF9zdGFydCwgaW50IG1vdmVfY291bnQsCisJCQkJCSB4ZnNfbW91bnRfdCAqbXApOworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBFeHRlcm5hbCByb3V0aW5lcyB3aGVuIGRpcnNpemUgPCBYRlNfTElUSU5PKG1wKS4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAqIENyZWF0ZSB0aGUgaW5pdGlhbCBjb250ZW50cyBvZiBhIHNob3J0Zm9ybSBhdHRyaWJ1dGUgbGlzdC4KKyAqLworaW50Cit4ZnNfYXR0cl9zaG9ydGZvcm1fY3JlYXRlKHhmc19kYV9hcmdzX3QgKmFyZ3MpCit7CisJeGZzX2F0dHJfc2ZfaGRyX3QgKmhkcjsKKwl4ZnNfaW5vZGVfdCAqZHA7CisJeGZzX2lmb3JrX3QgKmlmcDsKKworCWRwID0gYXJncy0+ZHA7CisJQVNTRVJUKGRwICE9IE5VTEwpOworCWlmcCA9IGRwLT5pX2FmcDsKKwlBU1NFUlQoaWZwICE9IE5VTEwpOworCUFTU0VSVChpZnAtPmlmX2J5dGVzID09IDApOworCWlmIChkcC0+aV9kLmRpX2Fmb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUykgeworCQlpZnAtPmlmX2ZsYWdzICY9IH5YRlNfSUZFWFRFTlRTOwkvKiBqdXN0IGluIGNhc2UgKi8KKwkJZHAtPmlfZC5kaV9hZm9ybWF0ID0gWEZTX0RJTk9ERV9GTVRfTE9DQUw7CisJCWlmcC0+aWZfZmxhZ3MgfD0gWEZTX0lGSU5MSU5FOworCX0gZWxzZSB7CisJCUFTU0VSVChpZnAtPmlmX2ZsYWdzICYgWEZTX0lGSU5MSU5FKTsKKwl9CisJeGZzX2lkYXRhX3JlYWxsb2MoZHAsIHNpemVvZigqaGRyKSwgWEZTX0FUVFJfRk9SSyk7CisJaGRyID0gKHhmc19hdHRyX3NmX2hkcl90ICopaWZwLT5pZl91MS5pZl9kYXRhOworCWhkci0+Y291bnQgPSAwOworCUlOVF9TRVQoaGRyLT50b3RzaXplLCBBUkNIX0NPTlZFUlQsIHNpemVvZigqaGRyKSk7CisJeGZzX3RyYW5zX2xvZ19pbm9kZShhcmdzLT50cmFucywgZHAsIFhGU19JTE9HX0NPUkUgfCBYRlNfSUxPR19BREFUQSk7CisJcmV0dXJuKDApOworfQorCisvKgorICogQWRkIGEgbmFtZS92YWx1ZSBwYWlyIHRvIHRoZSBzaG9ydGZvcm0gYXR0cmlidXRlIGxpc3QuCisgKiBPdmVyZmxvdyBmcm9tIHRoZSBpbm9kZSBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQgZm9yLgorICovCitpbnQKK3hmc19hdHRyX3Nob3J0Zm9ybV9hZGQoeGZzX2RhX2FyZ3NfdCAqYXJncykKK3sKKwl4ZnNfYXR0cl9zaG9ydGZvcm1fdCAqc2Y7CisJeGZzX2F0dHJfc2ZfZW50cnlfdCAqc2ZlOworCWludCBpLCBvZmZzZXQsIHNpemU7CisJeGZzX2lub2RlX3QgKmRwOworCXhmc19pZm9ya190ICppZnA7CisKKwlkcCA9IGFyZ3MtPmRwOworCWlmcCA9IGRwLT5pX2FmcDsKKwlBU1NFUlQoaWZwLT5pZl9mbGFncyAmIFhGU19JRklOTElORSk7CisJc2YgPSAoeGZzX2F0dHJfc2hvcnRmb3JtX3QgKilpZnAtPmlmX3UxLmlmX2RhdGE7CisJc2ZlID0gJnNmLT5saXN0WzBdOworCWZvciAoaSA9IDA7IGkgPCBJTlRfR0VUKHNmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJCQkJc2ZlID0gWEZTX0FUVFJfU0ZfTkVYVEVOVFJZKHNmZSksIGkrKykgeworCQlpZiAoc2ZlLT5uYW1lbGVuICE9IGFyZ3MtPm5hbWVsZW4pCisJCQljb250aW51ZTsKKwkJaWYgKG1lbWNtcChhcmdzLT5uYW1lLCBzZmUtPm5hbWV2YWwsIGFyZ3MtPm5hbWVsZW4pICE9IDApCisJCQljb250aW51ZTsKKwkJaWYgKCgoYXJncy0+ZmxhZ3MgJiBBVFRSX1NFQ1VSRSkgIT0gMCkgIT0KKwkJICAgICgoc2ZlLT5mbGFncyAmIFhGU19BVFRSX1NFQ1VSRSkgIT0gMCkpCisJCQljb250aW51ZTsKKwkJaWYgKCgoYXJncy0+ZmxhZ3MgJiBBVFRSX1JPT1QpICE9IDApICE9CisJCSAgICAoKHNmZS0+ZmxhZ3MgJiBYRlNfQVRUUl9ST09UKSAhPSAwKSkKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4oWEZTX0VSUk9SKEVFWElTVCkpOworCX0KKworCW9mZnNldCA9IChjaGFyICopc2ZlIC0gKGNoYXIgKilzZjsKKwlzaXplID0gWEZTX0FUVFJfU0ZfRU5UU0laRV9CWU5BTUUoYXJncy0+bmFtZWxlbiwgYXJncy0+dmFsdWVsZW4pOworCXhmc19pZGF0YV9yZWFsbG9jKGRwLCBzaXplLCBYRlNfQVRUUl9GT1JLKTsKKwlzZiA9ICh4ZnNfYXR0cl9zaG9ydGZvcm1fdCAqKWlmcC0+aWZfdTEuaWZfZGF0YTsKKwlzZmUgPSAoeGZzX2F0dHJfc2ZfZW50cnlfdCAqKSgoY2hhciAqKXNmICsgb2Zmc2V0KTsKKworCXNmZS0+bmFtZWxlbiA9IGFyZ3MtPm5hbWVsZW47CisJSU5UX1NFVChzZmUtPnZhbHVlbGVuLCBBUkNIX0NPTlZFUlQsIGFyZ3MtPnZhbHVlbGVuKTsKKwlzZmUtPmZsYWdzID0gKGFyZ3MtPmZsYWdzICYgQVRUUl9TRUNVUkUpID8gWEZTX0FUVFJfU0VDVVJFIDoKKwkJCSgoYXJncy0+ZmxhZ3MgJiBBVFRSX1JPT1QpID8gWEZTX0FUVFJfUk9PVCA6IDApOworCW1lbWNweShzZmUtPm5hbWV2YWwsIGFyZ3MtPm5hbWUsIGFyZ3MtPm5hbWVsZW4pOworCW1lbWNweSgmc2ZlLT5uYW1ldmFsW2FyZ3MtPm5hbWVsZW5dLCBhcmdzLT52YWx1ZSwgYXJncy0+dmFsdWVsZW4pOworCUlOVF9NT0Qoc2YtPmhkci5jb3VudCwgQVJDSF9DT05WRVJULCAxKTsKKwlJTlRfTU9EKHNmLT5oZHIudG90c2l6ZSwgQVJDSF9DT05WRVJULCBzaXplKTsKKwl4ZnNfdHJhbnNfbG9nX2lub2RlKGFyZ3MtPnRyYW5zLCBkcCwgWEZTX0lMT0dfQ09SRSB8IFhGU19JTE9HX0FEQVRBKTsKKworCXJldHVybigwKTsKK30KKworLyoKKyAqIFJlbW92ZSBhIG5hbWUgZnJvbSB0aGUgc2hvcnRmb3JtIGF0dHJpYnV0ZSBsaXN0IHN0cnVjdHVyZS4KKyAqLworaW50Cit4ZnNfYXR0cl9zaG9ydGZvcm1fcmVtb3ZlKHhmc19kYV9hcmdzX3QgKmFyZ3MpCit7CisJeGZzX2F0dHJfc2hvcnRmb3JtX3QgKnNmOworCXhmc19hdHRyX3NmX2VudHJ5X3QgKnNmZTsKKwlpbnQgYmFzZSwgc2l6ZT0wLCBlbmQsIHRvdHNpemUsIGk7CisJeGZzX2lub2RlX3QgKmRwOworCisJLyoKKwkgKiBSZW1vdmUgdGhlIGF0dHJpYnV0ZS4KKwkgKi8KKwlkcCA9IGFyZ3MtPmRwOworCWJhc2UgPSBzaXplb2YoeGZzX2F0dHJfc2ZfaGRyX3QpOworCXNmID0gKHhmc19hdHRyX3Nob3J0Zm9ybV90ICopZHAtPmlfYWZwLT5pZl91MS5pZl9kYXRhOworCXNmZSA9ICZzZi0+bGlzdFswXTsKKwlmb3IgKGkgPSAwOyBpIDwgSU5UX0dFVChzZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOworCQkJCXNmZSA9IFhGU19BVFRSX1NGX05FWFRFTlRSWShzZmUpLAorCQkJCQliYXNlICs9IHNpemUsIGkrKykgeworCQlzaXplID0gWEZTX0FUVFJfU0ZfRU5UU0laRShzZmUpOworCQlpZiAoc2ZlLT5uYW1lbGVuICE9IGFyZ3MtPm5hbWVsZW4pCisJCQljb250aW51ZTsKKwkJaWYgKG1lbWNtcChzZmUtPm5hbWV2YWwsIGFyZ3MtPm5hbWUsIGFyZ3MtPm5hbWVsZW4pICE9IDApCisJCQljb250aW51ZTsKKwkJaWYgKCgoYXJncy0+ZmxhZ3MgJiBBVFRSX1NFQ1VSRSkgIT0gMCkgIT0KKwkJICAgICgoc2ZlLT5mbGFncyAmIFhGU19BVFRSX1NFQ1VSRSkgIT0gMCkpCisJCQljb250aW51ZTsKKwkJaWYgKCgoYXJncy0+ZmxhZ3MgJiBBVFRSX1JPT1QpICE9IDApICE9CisJCSAgICAoKHNmZS0+ZmxhZ3MgJiBYRlNfQVRUUl9ST09UKSAhPSAwKSkKKwkJCWNvbnRpbnVlOworCQlicmVhazsKKwl9CisJaWYgKGkgPT0gSU5UX0dFVChzZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpKQorCQlyZXR1cm4oWEZTX0VSUk9SKEVOT0FUVFIpKTsKKworCWVuZCA9IGJhc2UgKyBzaXplOworCXRvdHNpemUgPSBJTlRfR0VUKHNmLT5oZHIudG90c2l6ZSwgQVJDSF9DT05WRVJUKTsKKwlpZiAoZW5kICE9IHRvdHNpemUpIHsKKwkJbWVtbW92ZSgmKChjaGFyICopc2YpW2Jhc2VdLCAmKChjaGFyICopc2YpW2VuZF0sCisJCQkJCQkJdG90c2l6ZSAtIGVuZCk7CisJfQorCUlOVF9NT0Qoc2YtPmhkci5jb3VudCwgQVJDSF9DT05WRVJULCAtMSk7CisJSU5UX01PRChzZi0+aGRyLnRvdHNpemUsIEFSQ0hfQ09OVkVSVCwgLXNpemUpOworCXhmc19pZGF0YV9yZWFsbG9jKGRwLCAtc2l6ZSwgWEZTX0FUVFJfRk9SSyk7CisJeGZzX3RyYW5zX2xvZ19pbm9kZShhcmdzLT50cmFucywgZHAsIFhGU19JTE9HX0NPUkUgfCBYRlNfSUxPR19BREFUQSk7CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBMb29rIHVwIGEgbmFtZSBpbiBhIHNob3J0Zm9ybSBhdHRyaWJ1dGUgbGlzdCBzdHJ1Y3R1cmUuCisgKi8KKy8qQVJHU1VTRUQqLworaW50Cit4ZnNfYXR0cl9zaG9ydGZvcm1fbG9va3VwKHhmc19kYV9hcmdzX3QgKmFyZ3MpCit7CisJeGZzX2F0dHJfc2hvcnRmb3JtX3QgKnNmOworCXhmc19hdHRyX3NmX2VudHJ5X3QgKnNmZTsKKwlpbnQgaTsKKwl4ZnNfaWZvcmtfdCAqaWZwOworCisJaWZwID0gYXJncy0+ZHAtPmlfYWZwOworCUFTU0VSVChpZnAtPmlmX2ZsYWdzICYgWEZTX0lGSU5MSU5FKTsKKwlzZiA9ICh4ZnNfYXR0cl9zaG9ydGZvcm1fdCAqKWlmcC0+aWZfdTEuaWZfZGF0YTsKKwlzZmUgPSAmc2YtPmxpc3RbMF07CisJZm9yIChpID0gMDsgaSA8IElOVF9HRVQoc2YtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKTsKKwkJCQlzZmUgPSBYRlNfQVRUUl9TRl9ORVhURU5UUlkoc2ZlKSwgaSsrKSB7CisJCWlmIChzZmUtPm5hbWVsZW4gIT0gYXJncy0+bmFtZWxlbikKKwkJCWNvbnRpbnVlOworCQlpZiAobWVtY21wKGFyZ3MtPm5hbWUsIHNmZS0+bmFtZXZhbCwgYXJncy0+bmFtZWxlbikgIT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoKChhcmdzLT5mbGFncyAmIEFUVFJfU0VDVVJFKSAhPSAwKSAhPQorCQkgICAgKChzZmUtPmZsYWdzICYgWEZTX0FUVFJfU0VDVVJFKSAhPSAwKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoKChhcmdzLT5mbGFncyAmIEFUVFJfUk9PVCkgIT0gMCkgIT0KKwkJICAgICgoc2ZlLT5mbGFncyAmIFhGU19BVFRSX1JPT1QpICE9IDApKQorCQkJY29udGludWU7CisJCXJldHVybihYRlNfRVJST1IoRUVYSVNUKSk7CisJfQorCXJldHVybihYRlNfRVJST1IoRU5PQVRUUikpOworfQorCisvKgorICogTG9vayB1cCBhIG5hbWUgaW4gYSBzaG9ydGZvcm0gYXR0cmlidXRlIGxpc3Qgc3RydWN0dXJlLgorICovCisvKkFSR1NVU0VEKi8KK2ludAoreGZzX2F0dHJfc2hvcnRmb3JtX2dldHZhbHVlKHhmc19kYV9hcmdzX3QgKmFyZ3MpCit7CisJeGZzX2F0dHJfc2hvcnRmb3JtX3QgKnNmOworCXhmc19hdHRyX3NmX2VudHJ5X3QgKnNmZTsKKwlpbnQgaTsKKworCUFTU0VSVChhcmdzLT5kcC0+aV9kLmRpX2Fmb3JtYXQgPT0gWEZTX0lGSU5MSU5FKTsKKwlzZiA9ICh4ZnNfYXR0cl9zaG9ydGZvcm1fdCAqKWFyZ3MtPmRwLT5pX2FmcC0+aWZfdTEuaWZfZGF0YTsKKwlzZmUgPSAmc2YtPmxpc3RbMF07CisJZm9yIChpID0gMDsgaSA8IElOVF9HRVQoc2YtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKTsKKwkJCQlzZmUgPSBYRlNfQVRUUl9TRl9ORVhURU5UUlkoc2ZlKSwgaSsrKSB7CisJCWlmIChzZmUtPm5hbWVsZW4gIT0gYXJncy0+bmFtZWxlbikKKwkJCWNvbnRpbnVlOworCQlpZiAobWVtY21wKGFyZ3MtPm5hbWUsIHNmZS0+bmFtZXZhbCwgYXJncy0+bmFtZWxlbikgIT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoKChhcmdzLT5mbGFncyAmIEFUVFJfU0VDVVJFKSAhPSAwKSAhPQorCQkgICAgKChzZmUtPmZsYWdzICYgWEZTX0FUVFJfU0VDVVJFKSAhPSAwKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoKChhcmdzLT5mbGFncyAmIEFUVFJfUk9PVCkgIT0gMCkgIT0KKwkJICAgICgoc2ZlLT5mbGFncyAmIFhGU19BVFRSX1JPT1QpICE9IDApKQorCQkJY29udGludWU7CisJCWlmIChhcmdzLT5mbGFncyAmIEFUVFJfS0VSTk9WQUwpIHsKKwkJCWFyZ3MtPnZhbHVlbGVuID0gSU5UX0dFVChzZmUtPnZhbHVlbGVuLCBBUkNIX0NPTlZFUlQpOworCQkJcmV0dXJuKFhGU19FUlJPUihFRVhJU1QpKTsKKwkJfQorCQlpZiAoYXJncy0+dmFsdWVsZW4gPCBJTlRfR0VUKHNmZS0+dmFsdWVsZW4sIEFSQ0hfQ09OVkVSVCkpIHsKKwkJCWFyZ3MtPnZhbHVlbGVuID0gSU5UX0dFVChzZmUtPnZhbHVlbGVuLCBBUkNIX0NPTlZFUlQpOworCQkJcmV0dXJuKFhGU19FUlJPUihFUkFOR0UpKTsKKwkJfQorCQlhcmdzLT52YWx1ZWxlbiA9IElOVF9HRVQoc2ZlLT52YWx1ZWxlbiwgQVJDSF9DT05WRVJUKTsKKwkJbWVtY3B5KGFyZ3MtPnZhbHVlLCAmc2ZlLT5uYW1ldmFsW2FyZ3MtPm5hbWVsZW5dLAorCQkJCQkJICAgIGFyZ3MtPnZhbHVlbGVuKTsKKwkJcmV0dXJuKFhGU19FUlJPUihFRVhJU1QpKTsKKwl9CisJcmV0dXJuKFhGU19FUlJPUihFTk9BVFRSKSk7Cit9CisKKy8qCisgKiBDb252ZXJ0IGZyb20gdXNpbmcgdGhlIHNob3J0Zm9ybSB0byB0aGUgbGVhZi4KKyAqLworaW50Cit4ZnNfYXR0cl9zaG9ydGZvcm1fdG9fbGVhZih4ZnNfZGFfYXJnc190ICphcmdzKQoreworCXhmc19pbm9kZV90ICpkcDsKKwl4ZnNfYXR0cl9zaG9ydGZvcm1fdCAqc2Y7CisJeGZzX2F0dHJfc2ZfZW50cnlfdCAqc2ZlOworCXhmc19kYV9hcmdzX3QgbmFyZ3M7CisJY2hhciAqdG1wYnVmZmVyOworCWludCBlcnJvciwgaSwgc2l6ZTsKKwl4ZnNfZGFibGtfdCBibGtubzsKKwl4ZnNfZGFidWZfdCAqYnA7CisJeGZzX2lmb3JrX3QgKmlmcDsKKworCWRwID0gYXJncy0+ZHA7CisJaWZwID0gZHAtPmlfYWZwOworCXNmID0gKHhmc19hdHRyX3Nob3J0Zm9ybV90ICopaWZwLT5pZl91MS5pZl9kYXRhOworCXNpemUgPSBJTlRfR0VUKHNmLT5oZHIudG90c2l6ZSwgQVJDSF9DT05WRVJUKTsKKwl0bXBidWZmZXIgPSBrbWVtX2FsbG9jKHNpemUsIEtNX1NMRUVQKTsKKwlBU1NFUlQodG1wYnVmZmVyICE9IE5VTEwpOworCW1lbWNweSh0bXBidWZmZXIsIGlmcC0+aWZfdTEuaWZfZGF0YSwgc2l6ZSk7CisJc2YgPSAoeGZzX2F0dHJfc2hvcnRmb3JtX3QgKil0bXBidWZmZXI7CisKKwl4ZnNfaWRhdGFfcmVhbGxvYyhkcCwgLXNpemUsIFhGU19BVFRSX0ZPUkspOworCWJwID0gTlVMTDsKKwllcnJvciA9IHhmc19kYV9ncm93X2lub2RlKGFyZ3MsICZibGtubyk7CisJaWYgKGVycm9yKSB7CisJCS8qCisJCSAqIElmIHdlIGhpdCBhbiBJTyBlcnJvciBtaWRkbGUgb2YgdGhlIHRyYW5zYWN0aW9uIGluc2lkZQorCQkgKiBncm93X2lub2RlKCksIHdlIG1heSBoYXZlIGluY29uc2lzdGVudCBkYXRhLiBCYWlsIG91dC4KKwkJICovCisJCWlmIChlcnJvciA9PSBFSU8pCisJCQlnb3RvIG91dDsKKwkJeGZzX2lkYXRhX3JlYWxsb2MoZHAsIHNpemUsIFhGU19BVFRSX0ZPUkspOwkvKiB0cnkgdG8gcHV0ICovCisJCW1lbWNweShpZnAtPmlmX3UxLmlmX2RhdGEsIHRtcGJ1ZmZlciwgc2l6ZSk7CS8qIGl0IGJhY2sgKi8KKwkJZ290byBvdXQ7CisJfQorCisJQVNTRVJUKGJsa25vID09IDApOworCWVycm9yID0geGZzX2F0dHJfbGVhZl9jcmVhdGUoYXJncywgYmxrbm8sICZicCk7CisJaWYgKGVycm9yKSB7CisJCWVycm9yID0geGZzX2RhX3Nocmlua19pbm9kZShhcmdzLCAwLCBicCk7CisJCWJwID0gTlVMTDsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXQ7CisJCXhmc19pZGF0YV9yZWFsbG9jKGRwLCBzaXplLCBYRlNfQVRUUl9GT1JLKTsJLyogdHJ5IHRvIHB1dCAqLworCQltZW1jcHkoaWZwLT5pZl91MS5pZl9kYXRhLCB0bXBidWZmZXIsIHNpemUpOwkvKiBpdCBiYWNrICovCisJCWdvdG8gb3V0OworCX0KKworCW1lbXNldCgoY2hhciAqKSZuYXJncywgMCwgc2l6ZW9mKG5hcmdzKSk7CisJbmFyZ3MuZHAgPSBkcDsKKwluYXJncy5maXJzdGJsb2NrID0gYXJncy0+Zmlyc3RibG9jazsKKwluYXJncy5mbGlzdCA9IGFyZ3MtPmZsaXN0OworCW5hcmdzLnRvdGFsID0gYXJncy0+dG90YWw7CisJbmFyZ3Mud2hpY2hmb3JrID0gWEZTX0FUVFJfRk9SSzsKKwluYXJncy50cmFucyA9IGFyZ3MtPnRyYW5zOworCW5hcmdzLm9rbm9lbnQgPSAxOworCisJc2ZlID0gJnNmLT5saXN0WzBdOworCWZvciAoaSA9IDA7IGkgPCBJTlRfR0VUKHNmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7IGkrKykgeworCQluYXJncy5uYW1lID0gKGNoYXIgKilzZmUtPm5hbWV2YWw7CisJCW5hcmdzLm5hbWVsZW4gPSBzZmUtPm5hbWVsZW47CisJCW5hcmdzLnZhbHVlID0gKGNoYXIgKikmc2ZlLT5uYW1ldmFsW25hcmdzLm5hbWVsZW5dOworCQluYXJncy52YWx1ZWxlbiA9IElOVF9HRVQoc2ZlLT52YWx1ZWxlbiwgQVJDSF9DT05WRVJUKTsKKwkJbmFyZ3MuaGFzaHZhbCA9IHhmc19kYV9oYXNobmFtZSgoY2hhciAqKXNmZS0+bmFtZXZhbCwKKwkJCQkJCXNmZS0+bmFtZWxlbik7CisJCW5hcmdzLmZsYWdzID0gKHNmZS0+ZmxhZ3MgJiBYRlNfQVRUUl9TRUNVUkUpID8gQVRUUl9TRUNVUkUgOgorCQkJCSgoc2ZlLT5mbGFncyAmIFhGU19BVFRSX1JPT1QpID8gQVRUUl9ST09UIDogMCk7CisJCWVycm9yID0geGZzX2F0dHJfbGVhZl9sb29rdXBfaW50KGJwLCAmbmFyZ3MpOyAvKiBzZXQgYS0+aW5kZXggKi8KKwkJQVNTRVJUKGVycm9yID09IEVOT0FUVFIpOworCQllcnJvciA9IHhmc19hdHRyX2xlYWZfYWRkKGJwLCAmbmFyZ3MpOworCQlBU1NFUlQoZXJyb3IgIT0gRU5PU1BDKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXQ7CisJCXNmZSA9IFhGU19BVFRSX1NGX05FWFRFTlRSWShzZmUpOworCX0KKwllcnJvciA9IDA7CisKK291dDoKKwlpZihicCkKKwkJeGZzX2RhX2J1Zl9kb25lKGJwKTsKKwlrbWVtX2ZyZWUodG1wYnVmZmVyLCBzaXplKTsKKwlyZXR1cm4oZXJyb3IpOworfQorCitTVEFUSUMgaW50Cit4ZnNfYXR0cl9zaG9ydGZvcm1fY29tcGFyZShjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworCXhmc19hdHRyX3NmX3NvcnRfdCAqc2EsICpzYjsKKworCXNhID0gKHhmc19hdHRyX3NmX3NvcnRfdCAqKWE7CisJc2IgPSAoeGZzX2F0dHJfc2Zfc29ydF90ICopYjsKKwlpZiAoSU5UX0dFVChzYS0+aGFzaCwgQVJDSF9DT05WRVJUKQorCQkJCTwgSU5UX0dFVChzYi0+aGFzaCwgQVJDSF9DT05WRVJUKSkgeworCQlyZXR1cm4oLTEpOworCX0gZWxzZSBpZiAoSU5UX0dFVChzYS0+aGFzaCwgQVJDSF9DT05WRVJUKQorCQkJCT4gSU5UX0dFVChzYi0+aGFzaCwgQVJDSF9DT05WRVJUKSkgeworCQlyZXR1cm4oMSk7CisJfSBlbHNlIHsKKwkJcmV0dXJuKHNhLT5lbnRubyAtIHNiLT5lbnRubyk7CisJfQorfQorCisvKgorICogQ29weSBvdXQgZW50cmllcyBvZiBzaG9ydGZvcm0gYXR0cmlidXRlIGxpc3RzIGZvciBhdHRyX2xpc3QoKS4KKyAqIFNob3J0Zm9ybSBhdHJ0cmlidXRlIGxpc3RzIGFyZSBub3Qgc3RvcmVkIGluIGhhc2h2YWwgc29ydGVkIG9yZGVyLgorICogSWYgdGhlIG91dHB1dCBidWZmZXIgaXMgbm90IGxhcmdlIGVub3VnaCB0byBob2xkIHRoZW0gYWxsLCB0aGVuIHdlCisgKiB3ZSBoYXZlIHRvIGNhbGN1bGF0ZSBlYWNoIGVudHJpZXMnIGhhc2h2YWx1ZSBhbmQgc29ydCB0aGVtIGJlZm9yZQorICogd2UgY2FuIGJlZ2luIHJldHVybmluZyB0aGVtIHRvIHRoZSB1c2VyLgorICovCisvKkFSR1NVU0VEKi8KK2ludAoreGZzX2F0dHJfc2hvcnRmb3JtX2xpc3QoeGZzX2F0dHJfbGlzdF9jb250ZXh0X3QgKmNvbnRleHQpCit7CisJYXR0cmxpc3RfY3Vyc29yX2tlcm5fdCAqY3Vyc29yOworCXhmc19hdHRyX3NmX3NvcnRfdCAqc2J1ZiwgKnNicDsKKwl4ZnNfYXR0cl9zaG9ydGZvcm1fdCAqc2Y7CisJeGZzX2F0dHJfc2ZfZW50cnlfdCAqc2ZlOworCXhmc19pbm9kZV90ICpkcDsKKwlpbnQgc2JzaXplLCBuc2J1ZiwgY291bnQsIGk7CisKKwlBU1NFUlQoY29udGV4dCAhPSBOVUxMKTsKKwlkcCA9IGNvbnRleHQtPmRwOworCUFTU0VSVChkcCAhPSBOVUxMKTsKKwlBU1NFUlQoZHAtPmlfYWZwICE9IE5VTEwpOworCXNmID0gKHhmc19hdHRyX3Nob3J0Zm9ybV90ICopZHAtPmlfYWZwLT5pZl91MS5pZl9kYXRhOworCUFTU0VSVChzZiAhPSBOVUxMKTsKKwlpZiAoIXNmLT5oZHIuY291bnQpCisJCXJldHVybigwKTsKKwljdXJzb3IgPSBjb250ZXh0LT5jdXJzb3I7CisJQVNTRVJUKGN1cnNvciAhPSBOVUxMKTsKKworCXhmc19hdHRyX3RyYWNlX2xfYygic2Ygc3RhcnQiLCBjb250ZXh0KTsKKworCS8qCisJICogSWYgdGhlIGJ1ZmZlciBpcyBsYXJnZSBlbm91Z2gsIGRvIG5vdCBib3RoZXIgd2l0aCBzb3J0aW5nLgorCSAqIE5vdGUgdGhlIGdlbmVyb3VzIGZ1ZGdlIGZhY3RvciBvZiAxNiBvdmVyaGVhZCBieXRlcyBwZXIgZW50cnkuCisJICovCisJaWYgKChkcC0+aV9hZnAtPmlmX2J5dGVzICsgSU5UX0dFVChzZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpICogMTYpCisJCQkJCQkJPCBjb250ZXh0LT5idWZzaXplKSB7CisJCWZvciAoaSA9IDAsIHNmZSA9ICZzZi0+bGlzdFswXTsKKwkJCQlpIDwgSU5UX0dFVChzZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOyBpKyspIHsKKwkJCWF0dHJuYW1lc190CSpuYW1lc3A7CisKKwkJCWlmICgoKGNvbnRleHQtPmZsYWdzICYgQVRUUl9TRUNVUkUpICE9IDApICE9CisJCQkgICAgKChzZmUtPmZsYWdzICYgWEZTX0FUVFJfU0VDVVJFKSAhPSAwKSAmJgorCQkJICAgICEoY29udGV4dC0+ZmxhZ3MgJiBBVFRSX0tFUk5PUk1BTFMpKSB7CisJCQkJc2ZlID0gWEZTX0FUVFJfU0ZfTkVYVEVOVFJZKHNmZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoKChjb250ZXh0LT5mbGFncyAmIEFUVFJfUk9PVCkgIT0gMCkgIT0KKwkJCSAgICAoKHNmZS0+ZmxhZ3MgJiBYRlNfQVRUUl9ST09UKSAhPSAwKSAmJgorCQkJICAgICEoY29udGV4dC0+ZmxhZ3MgJiBBVFRSX0tFUk5ST09UTFMpKSB7CisJCQkJc2ZlID0gWEZTX0FUVFJfU0ZfTkVYVEVOVFJZKHNmZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQluYW1lc3AgPSAoc2ZlLT5mbGFncyAmIFhGU19BVFRSX1NFQ1VSRSkgPyAmYXR0cl9zZWN1cmU6CisJCQkJKChzZmUtPmZsYWdzICYgWEZTX0FUVFJfUk9PVCkgPyAmYXR0cl90cnVzdGVkIDoKKwkJCQkgICZhdHRyX3VzZXIpOworCQkJaWYgKGNvbnRleHQtPmZsYWdzICYgQVRUUl9LRVJOT1ZBTCkgeworCQkJCUFTU0VSVChjb250ZXh0LT5mbGFncyAmIEFUVFJfS0VSTkFNRUxTKTsKKwkJCQljb250ZXh0LT5jb3VudCArPSBuYW1lc3AtPmF0dHJfbmFtZWxlbiArCisJCQkJCUlOVF9HRVQoc2ZlLT5uYW1lbGVuLCBBUkNIX0NPTlZFUlQpICsgMTsKKwkJCX0KKwkJCWVsc2UgeworCQkJCWlmICh4ZnNfYXR0cl9wdXRfbGlzdGVudChjb250ZXh0LCBuYW1lc3AsCisJCQkJCQkgICAoY2hhciAqKXNmZS0+bmFtZXZhbCwKKwkJCQkJCSAgIChpbnQpc2ZlLT5uYW1lbGVuLAorCQkJCQkJICAgKGludClJTlRfR0VUKHNmZS0+dmFsdWVsZW4sCisJCQkJCQkJCUFSQ0hfQ09OVkVSVCkpKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCXNmZSA9IFhGU19BVFRSX1NGX05FWFRFTlRSWShzZmUpOworCQl9CisJCXhmc19hdHRyX3RyYWNlX2xfYygic2YgYmlnLWd1bHAiLCBjb250ZXh0KTsKKwkJcmV0dXJuKDApOworCX0KKworCS8qCisJICogSXQgZGlkbid0IGFsbCBmaXQsIHNvIHdlIGhhdmUgdG8gc29ydCBldmVyeXRoaW5nIG9uIGhhc2h2YWwuCisJICovCisJc2JzaXplID0gSU5UX0dFVChzZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpzYnVmKTsKKwlzYnAgPSBzYnVmID0ga21lbV9hbGxvYyhzYnNpemUsIEtNX1NMRUVQKTsKKworCS8qCisJICogU2NhbiB0aGUgYXR0cmlidXRlIGxpc3QgZm9yIHRoZSByZXN0IG9mIHRoZSBlbnRyaWVzLCBzdG9yaW5nCisJICogdGhlIHJlbGV2YW50IGluZm8gZnJvbSBvbmx5IHRob3NlIHRoYXQgbWF0Y2ggaW50byBhIGJ1ZmZlci4KKwkgKi8KKwluc2J1ZiA9IDA7CisJZm9yIChpID0gMCwgc2ZlID0gJnNmLT5saXN0WzBdOworCQkJaSA8IElOVF9HRVQoc2YtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKTsgaSsrKSB7CisJCWlmICh1bmxpa2VseSgKKwkJICAgICgoY2hhciAqKXNmZSA8IChjaGFyICopc2YpIHx8CisJCSAgICAoKGNoYXIgKilzZmUgPj0gKChjaGFyICopc2YgKyBkcC0+aV9hZnAtPmlmX2J5dGVzKSkpKSB7CisJCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGZzX2F0dHJfc2hvcnRmb3JtX2xpc3QiLAorCQkJCQkgICAgIFhGU19FUlJMRVZFTF9MT1csCisJCQkJCSAgICAgY29udGV4dC0+ZHAtPmlfbW91bnQsIHNmZSk7CisJCQl4ZnNfYXR0cl90cmFjZV9sX2MoInNmIGNvcnJ1cHRlZCIsIGNvbnRleHQpOworCQkJa21lbV9mcmVlKHNidWYsIHNic2l6ZSk7CisJCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJCX0KKwkJaWYgKCgoY29udGV4dC0+ZmxhZ3MgJiBBVFRSX1NFQ1VSRSkgIT0gMCkgIT0KKwkJICAgICgoc2ZlLT5mbGFncyAmIFhGU19BVFRSX1NFQ1VSRSkgIT0gMCkgJiYKKwkJICAgICEoY29udGV4dC0+ZmxhZ3MgJiBBVFRSX0tFUk5PUk1BTFMpKSB7CisJCQlzZmUgPSBYRlNfQVRUUl9TRl9ORVhURU5UUlkoc2ZlKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICgoKGNvbnRleHQtPmZsYWdzICYgQVRUUl9ST09UKSAhPSAwKSAhPQorCQkgICAgKChzZmUtPmZsYWdzICYgWEZTX0FUVFJfUk9PVCkgIT0gMCkgJiYKKwkJICAgICEoY29udGV4dC0+ZmxhZ3MgJiBBVFRSX0tFUk5ST09UTFMpKSB7CisJCQlzZmUgPSBYRlNfQVRUUl9TRl9ORVhURU5UUlkoc2ZlKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXNicC0+ZW50bm8gPSBpOworCQlJTlRfU0VUKHNicC0+aGFzaCwgQVJDSF9DT05WRVJULAorCQkJeGZzX2RhX2hhc2huYW1lKChjaGFyICopc2ZlLT5uYW1ldmFsLCBzZmUtPm5hbWVsZW4pKTsKKwkJc2JwLT5uYW1lID0gKGNoYXIgKilzZmUtPm5hbWV2YWw7CisJCXNicC0+bmFtZWxlbiA9IHNmZS0+bmFtZWxlbjsKKwkJLyogVGhlc2UgYXJlIGJ5dGVzLCBhbmQgYm90aCBvbi1kaXNrLCBkb24ndCBlbmRpYW4tZmxpcCAqLworCQlzYnAtPnZhbHVlbGVuID0gc2ZlLT52YWx1ZWxlbjsKKwkJc2JwLT5mbGFncyA9IHNmZS0+ZmxhZ3M7CisJCXNmZSA9IFhGU19BVFRSX1NGX05FWFRFTlRSWShzZmUpOworCQlzYnArKzsKKwkJbnNidWYrKzsKKwl9CisKKwkvKgorCSAqIFNvcnQgdGhlIGVudHJpZXMgb24gaGFzaCB0aGVuIGVudG5vLgorCSAqLworCXFzb3J0KHNidWYsIG5zYnVmLCBzaXplb2YoKnNidWYpLCB4ZnNfYXR0cl9zaG9ydGZvcm1fY29tcGFyZSk7CisKKwkvKgorCSAqIFJlLWZpbmQgb3VyIHBsYWNlIElOIFRIRSBTT1JURUQgTElTVC4KKwkgKi8KKwljb3VudCA9IDA7CisJY3Vyc29yLT5pbml0dGVkID0gMTsKKwljdXJzb3ItPmJsa25vID0gMDsKKwlmb3IgKHNicCA9IHNidWYsIGkgPSAwOyBpIDwgbnNidWY7IGkrKywgc2JwKyspIHsKKwkJaWYgKElOVF9HRVQoc2JwLT5oYXNoLCBBUkNIX0NPTlZFUlQpID09IGN1cnNvci0+aGFzaHZhbCkgeworCQkJaWYgKGN1cnNvci0+b2Zmc2V0ID09IGNvdW50KSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQljb3VudCsrOworCQl9IGVsc2UgaWYgKElOVF9HRVQoc2JwLT5oYXNoLCBBUkNIX0NPTlZFUlQpID4gY3Vyc29yLT5oYXNodmFsKSB7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoaSA9PSBuc2J1ZikgeworCQlrbWVtX2ZyZWUoc2J1Ziwgc2JzaXplKTsKKwkJeGZzX2F0dHJfdHJhY2VfbF9jKCJibGsgZW5kIiwgY29udGV4dCk7CisJCXJldHVybigwKTsKKwl9CisKKwkvKgorCSAqIExvb3AgcHV0dGluZyBlbnRyaWVzIGludG8gdGhlIHVzZXIgYnVmZmVyLgorCSAqLworCWZvciAoIDsgaSA8IG5zYnVmOyBpKyssIHNicCsrKSB7CisJCWF0dHJuYW1lc190CSpuYW1lc3A7CisKKwkJbmFtZXNwID0gKHNicC0+ZmxhZ3MgJiBYRlNfQVRUUl9TRUNVUkUpID8gJmF0dHJfc2VjdXJlIDoKKwkJCSgoc2JwLT5mbGFncyAmIFhGU19BVFRSX1JPT1QpID8gJmF0dHJfdHJ1c3RlZCA6CisJCQkgICZhdHRyX3VzZXIpOworCisJCWlmIChjdXJzb3ItPmhhc2h2YWwgIT0gSU5UX0dFVChzYnAtPmhhc2gsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJCWN1cnNvci0+aGFzaHZhbCA9IElOVF9HRVQoc2JwLT5oYXNoLCBBUkNIX0NPTlZFUlQpOworCQkJY3Vyc29yLT5vZmZzZXQgPSAwOworCQl9CisJCWlmIChjb250ZXh0LT5mbGFncyAmIEFUVFJfS0VSTk9WQUwpIHsKKwkJCUFTU0VSVChjb250ZXh0LT5mbGFncyAmIEFUVFJfS0VSTkFNRUxTKTsKKwkJCWNvbnRleHQtPmNvdW50ICs9IG5hbWVzcC0+YXR0cl9uYW1lbGVuICsKKwkJCQkJCXNicC0+bmFtZWxlbiArIDE7CisJCX0gZWxzZSB7CisJCQlpZiAoeGZzX2F0dHJfcHV0X2xpc3RlbnQoY29udGV4dCwgbmFtZXNwLAorCQkJCQlzYnAtPm5hbWUsIHNicC0+bmFtZWxlbiwKKwkJCQkJSU5UX0dFVChzYnAtPnZhbHVlbGVuLCBBUkNIX0NPTlZFUlQpKSkKKwkJCQlicmVhazsKKwkJfQorCQljdXJzb3ItPm9mZnNldCsrOworCX0KKworCWttZW1fZnJlZShzYnVmLCBzYnNpemUpOworCXhmc19hdHRyX3RyYWNlX2xfYygic2YgRS1PLUYiLCBjb250ZXh0KTsKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBDaGVjayBhIGxlYWYgYXR0cmlidXRlIGJsb2NrIHRvIHNlZSBpZiBhbGwgdGhlIGVudHJpZXMgd291bGQgZml0IGludG8KKyAqIGEgc2hvcnRmb3JtIGF0dHJpYnV0ZSBsaXN0LgorICovCitpbnQKK3hmc19hdHRyX3Nob3J0Zm9ybV9hbGxmaXQoeGZzX2RhYnVmX3QgKmJwLCB4ZnNfaW5vZGVfdCAqZHApCit7CisJeGZzX2F0dHJfbGVhZmJsb2NrX3QgKmxlYWY7CisJeGZzX2F0dHJfbGVhZl9lbnRyeV90ICplbnRyeTsKKwl4ZnNfYXR0cl9sZWFmX25hbWVfbG9jYWxfdCAqbmFtZV9sb2M7CisJaW50IGJ5dGVzLCBpOworCisJbGVhZiA9IGJwLT5kYXRhOworCUFTU0VSVChJTlRfR0VUKGxlYWYtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpCisJCQkJCQk9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKworCWVudHJ5ID0gJmxlYWYtPmVudHJpZXNbMF07CisJYnl0ZXMgPSBzaXplb2Yoc3RydWN0IHhmc19hdHRyX3NmX2hkcik7CisJZm9yIChpID0gMDsgaSA8IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOyBlbnRyeSsrLCBpKyspIHsKKwkJaWYgKGVudHJ5LT5mbGFncyAmIFhGU19BVFRSX0lOQ09NUExFVEUpCisJCQljb250aW51ZTsJCS8qIGRvbid0IGNvcHkgcGFydGlhbCBlbnRyaWVzICovCisJCWlmICghKGVudHJ5LT5mbGFncyAmIFhGU19BVFRSX0xPQ0FMKSkKKwkJCXJldHVybigwKTsKKwkJbmFtZV9sb2MgPSBYRlNfQVRUUl9MRUFGX05BTUVfTE9DQUwobGVhZiwgaSk7CisJCWlmIChuYW1lX2xvYy0+bmFtZWxlbiA+PSBYRlNfQVRUUl9TRl9FTlRTSVpFX01BWCkKKwkJCXJldHVybigwKTsKKwkJaWYgKElOVF9HRVQobmFtZV9sb2MtPnZhbHVlbGVuLCBBUkNIX0NPTlZFUlQpID49IFhGU19BVFRSX1NGX0VOVFNJWkVfTUFYKQorCQkJcmV0dXJuKDApOworCQlieXRlcyArPSBzaXplb2Yoc3RydWN0IHhmc19hdHRyX3NmX2VudHJ5KS0xCisJCQkJKyBuYW1lX2xvYy0+bmFtZWxlbgorCQkJCSsgSU5UX0dFVChuYW1lX2xvYy0+dmFsdWVsZW4sIEFSQ0hfQ09OVkVSVCk7CisJfQorCXJldHVybiggYnl0ZXMgPCBYRlNfSUZPUktfQVNJWkUoZHApICk7Cit9CisKKy8qCisgKiBDb252ZXJ0IGEgbGVhZiBhdHRyaWJ1dGUgbGlzdCB0byBzaG9ydGZvcm0gYXR0cmlidXRlIGxpc3QKKyAqLworaW50Cit4ZnNfYXR0cl9sZWFmX3RvX3Nob3J0Zm9ybSh4ZnNfZGFidWZfdCAqYnAsIHhmc19kYV9hcmdzX3QgKmFyZ3MpCit7CisJeGZzX2F0dHJfbGVhZmJsb2NrX3QgKmxlYWY7CisJeGZzX2F0dHJfbGVhZl9lbnRyeV90ICplbnRyeTsKKwl4ZnNfYXR0cl9sZWFmX25hbWVfbG9jYWxfdCAqbmFtZV9sb2M7CisJeGZzX2RhX2FyZ3NfdCBuYXJnczsKKwl4ZnNfaW5vZGVfdCAqZHA7CisJY2hhciAqdG1wYnVmZmVyOworCWludCBlcnJvciwgaTsKKworCWRwID0gYXJncy0+ZHA7CisJdG1wYnVmZmVyID0ga21lbV9hbGxvYyhYRlNfTEJTSVpFKGRwLT5pX21vdW50KSwgS01fU0xFRVApOworCUFTU0VSVCh0bXBidWZmZXIgIT0gTlVMTCk7CisKKwlBU1NFUlQoYnAgIT0gTlVMTCk7CisJbWVtY3B5KHRtcGJ1ZmZlciwgYnAtPmRhdGEsIFhGU19MQlNJWkUoZHAtPmlfbW91bnQpKTsKKwlsZWFmID0gKHhmc19hdHRyX2xlYWZibG9ja190ICopdG1wYnVmZmVyOworCUFTU0VSVChJTlRfR0VUKGxlYWYtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpCisJCQkJCQk9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKwltZW1zZXQoYnAtPmRhdGEsIDAsIFhGU19MQlNJWkUoZHAtPmlfbW91bnQpKTsKKworCS8qCisJICogQ2xlYW4gb3V0IHRoZSBwcmlvciBjb250ZW50cyBvZiB0aGUgYXR0cmlidXRlIGxpc3QuCisJICovCisJZXJyb3IgPSB4ZnNfZGFfc2hyaW5rX2lub2RlKGFyZ3MsIDAsIGJwKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCWVycm9yID0geGZzX2F0dHJfc2hvcnRmb3JtX2NyZWF0ZShhcmdzKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBDb3B5IHRoZSBhdHRyaWJ1dGVzCisJICovCisJbWVtc2V0KChjaGFyICopJm5hcmdzLCAwLCBzaXplb2YobmFyZ3MpKTsKKwluYXJncy5kcCA9IGRwOworCW5hcmdzLmZpcnN0YmxvY2sgPSBhcmdzLT5maXJzdGJsb2NrOworCW5hcmdzLmZsaXN0ID0gYXJncy0+Zmxpc3Q7CisJbmFyZ3MudG90YWwgPSBhcmdzLT50b3RhbDsKKwluYXJncy53aGljaGZvcmsgPSBYRlNfQVRUUl9GT1JLOworCW5hcmdzLnRyYW5zID0gYXJncy0+dHJhbnM7CisJbmFyZ3Mub2tub2VudCA9IDE7CisJZW50cnkgPSAmbGVhZi0+ZW50cmllc1swXTsKKwlmb3IgKGkgPSAwOyBpIDwgSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7IGVudHJ5KyssIGkrKykgeworCQlpZiAoZW50cnktPmZsYWdzICYgWEZTX0FUVFJfSU5DT01QTEVURSkKKwkJCWNvbnRpbnVlOwkvKiBkb24ndCBjb3B5IHBhcnRpYWwgZW50cmllcyAqLworCQlpZiAoIWVudHJ5LT5uYW1laWR4KQorCQkJY29udGludWU7CisJCUFTU0VSVChlbnRyeS0+ZmxhZ3MgJiBYRlNfQVRUUl9MT0NBTCk7CisJCW5hbWVfbG9jID0gWEZTX0FUVFJfTEVBRl9OQU1FX0xPQ0FMKGxlYWYsIGkpOworCQluYXJncy5uYW1lID0gKGNoYXIgKiluYW1lX2xvYy0+bmFtZXZhbDsKKwkJbmFyZ3MubmFtZWxlbiA9IG5hbWVfbG9jLT5uYW1lbGVuOworCQluYXJncy52YWx1ZSA9IChjaGFyICopJm5hbWVfbG9jLT5uYW1ldmFsW25hcmdzLm5hbWVsZW5dOworCQluYXJncy52YWx1ZWxlbiA9IElOVF9HRVQobmFtZV9sb2MtPnZhbHVlbGVuLCBBUkNIX0NPTlZFUlQpOworCQluYXJncy5oYXNodmFsID0gSU5UX0dFVChlbnRyeS0+aGFzaHZhbCwgQVJDSF9DT05WRVJUKTsKKwkJbmFyZ3MuZmxhZ3MgPSAoZW50cnktPmZsYWdzICYgWEZTX0FUVFJfU0VDVVJFKSA/IEFUVFJfU0VDVVJFIDoKKwkJCSAgICAgICgoZW50cnktPmZsYWdzICYgWEZTX0FUVFJfUk9PVCkgPyBBVFRSX1JPT1QgOiAwKTsKKwkJeGZzX2F0dHJfc2hvcnRmb3JtX2FkZCgmbmFyZ3MpOworCX0KKwllcnJvciA9IDA7CisKK291dDoKKwlrbWVtX2ZyZWUodG1wYnVmZmVyLCBYRlNfTEJTSVpFKGRwLT5pX21vdW50KSk7CisJcmV0dXJuKGVycm9yKTsKK30KKworLyoKKyAqIENvbnZlcnQgZnJvbSB1c2luZyBhIHNpbmdsZSBsZWFmIHRvIGEgcm9vdCBub2RlIGFuZCBhIGxlYWYuCisgKi8KK2ludAoreGZzX2F0dHJfbGVhZl90b19ub2RlKHhmc19kYV9hcmdzX3QgKmFyZ3MpCit7CisJeGZzX2F0dHJfbGVhZmJsb2NrX3QgKmxlYWY7CisJeGZzX2RhX2ludG5vZGVfdCAqbm9kZTsKKwl4ZnNfaW5vZGVfdCAqZHA7CisJeGZzX2RhYnVmX3QgKmJwMSwgKmJwMjsKKwl4ZnNfZGFibGtfdCBibGtubzsKKwlpbnQgZXJyb3I7CisKKwlkcCA9IGFyZ3MtPmRwOworCWJwMSA9IGJwMiA9IE5VTEw7CisJZXJyb3IgPSB4ZnNfZGFfZ3Jvd19pbm9kZShhcmdzLCAmYmxrbm8pOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisJZXJyb3IgPSB4ZnNfZGFfcmVhZF9idWYoYXJncy0+dHJhbnMsIGFyZ3MtPmRwLCAwLCAtMSwgJmJwMSwKKwkJCQkJICAgICBYRlNfQVRUUl9GT1JLKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gb3V0OworCUFTU0VSVChicDEgIT0gTlVMTCk7CisJYnAyID0gTlVMTDsKKwllcnJvciA9IHhmc19kYV9nZXRfYnVmKGFyZ3MtPnRyYW5zLCBhcmdzLT5kcCwgYmxrbm8sIC0xLCAmYnAyLAorCQkJCQkgICAgWEZTX0FUVFJfRk9SSyk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKwlBU1NFUlQoYnAyICE9IE5VTEwpOworCW1lbWNweShicDItPmRhdGEsIGJwMS0+ZGF0YSwgWEZTX0xCU0laRShkcC0+aV9tb3VudCkpOworCXhmc19kYV9idWZfZG9uZShicDEpOworCWJwMSA9IE5VTEw7CisJeGZzX2RhX2xvZ19idWYoYXJncy0+dHJhbnMsIGJwMiwgMCwgWEZTX0xCU0laRShkcC0+aV9tb3VudCkgLSAxKTsKKworCS8qCisJICogU2V0IHVwIHRoZSBuZXcgcm9vdCBub2RlLgorCSAqLworCWVycm9yID0geGZzX2RhX25vZGVfY3JlYXRlKGFyZ3MsIDAsIDEsICZicDEsIFhGU19BVFRSX0ZPUkspOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisJbm9kZSA9IGJwMS0+ZGF0YTsKKwlsZWFmID0gYnAyLT5kYXRhOworCUFTU0VSVChJTlRfR0VUKGxlYWYtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpCisJCQkJCQk9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKwkvKiBib3RoIG9uLWRpc2ssIGRvbid0IGVuZGlhbi1mbGlwIHR3aWNlICovCisJbm9kZS0+YnRyZWVbMF0uaGFzaHZhbCA9CisJCWxlYWYtPmVudHJpZXNbSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCktMSBdLmhhc2h2YWw7CisJSU5UX1NFVChub2RlLT5idHJlZVswXS5iZWZvcmUsIEFSQ0hfQ09OVkVSVCwgYmxrbm8pOworCUlOVF9TRVQobm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQsIDEpOworCXhmc19kYV9sb2dfYnVmKGFyZ3MtPnRyYW5zLCBicDEsIDAsIFhGU19MQlNJWkUoZHAtPmlfbW91bnQpIC0gMSk7CisJZXJyb3IgPSAwOworb3V0OgorCWlmIChicDEpCisJCXhmc19kYV9idWZfZG9uZShicDEpOworCWlmIChicDIpCisJCXhmc19kYV9idWZfZG9uZShicDIpOworCXJldHVybihlcnJvcik7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJvdXRpbmVzIHVzZWQgZm9yIGdyb3dpbmcgdGhlIEJ0cmVlLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICogQ3JlYXRlIHRoZSBpbml0aWFsIGNvbnRlbnRzIG9mIGEgbGVhZiBhdHRyaWJ1dGUgbGlzdAorICogb3IgYSBsZWFmIGluIGEgbm9kZSBhdHRyaWJ1dGUgbGlzdC4KKyAqLworaW50Cit4ZnNfYXR0cl9sZWFmX2NyZWF0ZSh4ZnNfZGFfYXJnc190ICphcmdzLCB4ZnNfZGFibGtfdCBibGtubywgeGZzX2RhYnVmX3QgKipicHApCit7CisJeGZzX2F0dHJfbGVhZmJsb2NrX3QgKmxlYWY7CisJeGZzX2F0dHJfbGVhZl9oZHJfdCAqaGRyOworCXhmc19pbm9kZV90ICpkcDsKKwl4ZnNfZGFidWZfdCAqYnA7CisJaW50IGVycm9yOworCisJZHAgPSBhcmdzLT5kcDsKKwlBU1NFUlQoZHAgIT0gTlVMTCk7CisJZXJyb3IgPSB4ZnNfZGFfZ2V0X2J1ZihhcmdzLT50cmFucywgYXJncy0+ZHAsIGJsa25vLCAtMSwgJmJwLAorCQkJCQkgICAgWEZTX0FUVFJfRk9SSyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4oZXJyb3IpOworCUFTU0VSVChicCAhPSBOVUxMKTsKKwlsZWFmID0gYnAtPmRhdGE7CisJbWVtc2V0KChjaGFyICopbGVhZiwgMCwgWEZTX0xCU0laRShkcC0+aV9tb3VudCkpOworCWhkciA9ICZsZWFmLT5oZHI7CisJSU5UX1NFVChoZHItPmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCwgWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisJSU5UX1NFVChoZHItPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJULCBYRlNfTEJTSVpFKGRwLT5pX21vdW50KSk7CisJaWYgKCFoZHItPmZpcnN0dXNlZCkgeworCQlJTlRfU0VUKGhkci0+Zmlyc3R1c2VkLCBBUkNIX0NPTlZFUlQsCisJCQlYRlNfTEJTSVpFKGRwLT5pX21vdW50KSAtIFhGU19BVFRSX0xFQUZfTkFNRV9BTElHTik7CisJfQorCisJSU5UX1NFVChoZHItPmZyZWVtYXBbMF0uYmFzZSwgQVJDSF9DT05WRVJULAorCQkJCQkJc2l6ZW9mKHhmc19hdHRyX2xlYWZfaGRyX3QpKTsKKwlJTlRfU0VUKGhkci0+ZnJlZW1hcFswXS5zaXplLCBBUkNIX0NPTlZFUlQsCisJCQkJCSAgSU5UX0dFVChoZHItPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJUKQorCQkJCQktIElOVF9HRVQoaGRyLT5mcmVlbWFwWzBdLmJhc2UsCisJCQkJCQkJCUFSQ0hfQ09OVkVSVCkpOworCisJeGZzX2RhX2xvZ19idWYoYXJncy0+dHJhbnMsIGJwLCAwLCBYRlNfTEJTSVpFKGRwLT5pX21vdW50KSAtIDEpOworCisJKmJwcCA9IGJwOworCXJldHVybigwKTsKK30KKworLyoKKyAqIFNwbGl0IHRoZSBsZWFmIG5vZGUsIHJlYmFsYW5jZSwgdGhlbiBhZGQgdGhlIG5ldyBlbnRyeS4KKyAqLworaW50Cit4ZnNfYXR0cl9sZWFmX3NwbGl0KHhmc19kYV9zdGF0ZV90ICpzdGF0ZSwgeGZzX2RhX3N0YXRlX2Jsa190ICpvbGRibGssCisJCQkJICAgeGZzX2RhX3N0YXRlX2Jsa190ICpuZXdibGspCit7CisJeGZzX2RhYmxrX3QgYmxrbm87CisJaW50IGVycm9yOworCisJLyoKKwkgKiBBbGxvY2F0ZSBzcGFjZSBmb3IgYSBuZXcgbGVhZiBub2RlLgorCSAqLworCUFTU0VSVChvbGRibGstPm1hZ2ljID09IFhGU19BVFRSX0xFQUZfTUFHSUMpOworCWVycm9yID0geGZzX2RhX2dyb3dfaW5vZGUoc3RhdGUtPmFyZ3MsICZibGtubyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4oZXJyb3IpOworCWVycm9yID0geGZzX2F0dHJfbGVhZl9jcmVhdGUoc3RhdGUtPmFyZ3MsIGJsa25vLCAmbmV3YmxrLT5icCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4oZXJyb3IpOworCW5ld2Jsay0+Ymxrbm8gPSBibGtubzsKKwluZXdibGstPm1hZ2ljID0gWEZTX0FUVFJfTEVBRl9NQUdJQzsKKworCS8qCisJICogUmViYWxhbmNlIHRoZSBlbnRyaWVzIGFjcm9zcyB0aGUgdHdvIGxlYXZlcy4KKwkgKiBOT1RFOiByZWJhbGFuY2UoKSBjdXJyZW50bHkgZGVwZW5kcyBvbiB0aGUgMm5kIGJsb2NrIGJlaW5nIGVtcHR5LgorCSAqLworCXhmc19hdHRyX2xlYWZfcmViYWxhbmNlKHN0YXRlLCBvbGRibGssIG5ld2Jsayk7CisJZXJyb3IgPSB4ZnNfZGFfYmxrX2xpbmsoc3RhdGUsIG9sZGJsaywgbmV3YmxrKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybihlcnJvcik7CisKKwkvKgorCSAqIFNhdmUgaW5mbyBvbiAib2xkIiBhdHRyaWJ1dGUgZm9yICJhdG9taWMgcmVuYW1lIiBvcHMsIGxlYWZfYWRkKCkKKwkgKiBtb2RpZmllcyB0aGUgaW5kZXgvYmxrbm8vcm10YmxrL3JtdGJsa2NudCBmaWVsZHMgdG8gc2hvdyB0aGUKKwkgKiAibmV3IiBhdHRycyBpbmZvLiAgV2lsbCBuZWVkIHRoZSAib2xkIiBpbmZvIHRvIHJlbW92ZSBpdCBsYXRlci4KKwkgKgorCSAqIEluc2VydCB0aGUgIm5ldyIgZW50cnkgaW4gdGhlIGNvcnJlY3QgYmxvY2suCisJICovCisJaWYgKHN0YXRlLT5pbmxlYWYpCisJCWVycm9yID0geGZzX2F0dHJfbGVhZl9hZGQob2xkYmxrLT5icCwgc3RhdGUtPmFyZ3MpOworCWVsc2UKKwkJZXJyb3IgPSB4ZnNfYXR0cl9sZWFmX2FkZChuZXdibGstPmJwLCBzdGF0ZS0+YXJncyk7CisKKwkvKgorCSAqIFVwZGF0ZSBsYXN0IGhhc2h2YWwgaW4gZWFjaCBibG9jayBzaW5jZSB3ZSBhZGRlZCB0aGUgbmFtZS4KKwkgKi8KKwlvbGRibGstPmhhc2h2YWwgPSB4ZnNfYXR0cl9sZWFmX2xhc3RoYXNoKG9sZGJsay0+YnAsIE5VTEwpOworCW5ld2Jsay0+aGFzaHZhbCA9IHhmc19hdHRyX2xlYWZfbGFzdGhhc2gobmV3YmxrLT5icCwgTlVMTCk7CisJcmV0dXJuKGVycm9yKTsKK30KKworLyoKKyAqIEFkZCBhIG5hbWUgdG8gdGhlIGxlYWYgYXR0cmlidXRlIGxpc3Qgc3RydWN0dXJlLgorICovCitpbnQKK3hmc19hdHRyX2xlYWZfYWRkKHhmc19kYWJ1Zl90ICpicCwgeGZzX2RhX2FyZ3NfdCAqYXJncykKK3sKKwl4ZnNfYXR0cl9sZWFmYmxvY2tfdCAqbGVhZjsKKwl4ZnNfYXR0cl9sZWFmX2hkcl90ICpoZHI7CisJeGZzX2F0dHJfbGVhZl9tYXBfdCAqbWFwOworCWludCB0YWJsZXNpemUsIGVudHNpemUsIHN1bSwgdG1wLCBpOworCisJbGVhZiA9IGJwLT5kYXRhOworCUFTU0VSVChJTlRfR0VUKGxlYWYtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpCisJCQkJCQk9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKwlBU1NFUlQoKGFyZ3MtPmluZGV4ID49IDApCisJCSYmIChhcmdzLT5pbmRleCA8PSBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSkpOworCWhkciA9ICZsZWFmLT5oZHI7CisJZW50c2l6ZSA9IHhmc19hdHRyX2xlYWZfbmV3ZW50c2l6ZShhcmdzLAorCQkJICAgYXJncy0+dHJhbnMtPnRfbW91bnRwLT5tX3NiLnNiX2Jsb2Nrc2l6ZSwgTlVMTCk7CisKKwkvKgorCSAqIFNlYXJjaCB0aHJvdWdoIGZyZWVtYXAgZm9yIGZpcnN0LWZpdCBvbiBuZXcgbmFtZSBsZW5ndGguCisJICogKG1heSBuZWVkIHRvIGZpZ3VyZSBpbiBzaXplIG9mIGVudHJ5IHN0cnVjdCB0b28pCisJICovCisJdGFibGVzaXplID0gKElOVF9HRVQoaGRyLT5jb3VudCwgQVJDSF9DT05WRVJUKSArIDEpCisJCQkJCSogc2l6ZW9mKHhmc19hdHRyX2xlYWZfZW50cnlfdCkKKwkJCQkJKyBzaXplb2YoeGZzX2F0dHJfbGVhZl9oZHJfdCk7CisJbWFwID0gJmhkci0+ZnJlZW1hcFtYRlNfQVRUUl9MRUFGX01BUFNJWkUtMV07CisJZm9yIChzdW0gPSAwLCBpID0gWEZTX0FUVFJfTEVBRl9NQVBTSVpFLTE7IGkgPj0gMDsgbWFwLS0sIGktLSkgeworCQlpZiAodGFibGVzaXplID4gSU5UX0dFVChoZHItPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJUKSkgeworCQkJc3VtICs9IElOVF9HRVQobWFwLT5zaXplLCBBUkNIX0NPTlZFUlQpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFtYXAtPnNpemUpCisJCQljb250aW51ZTsJLyogbm8gc3BhY2UgaW4gdGhpcyBtYXAgKi8KKwkJdG1wID0gZW50c2l6ZTsKKwkJaWYgKElOVF9HRVQobWFwLT5iYXNlLCBBUkNIX0NPTlZFUlQpCisJCQkJPCBJTlRfR0VUKGhkci0+Zmlyc3R1c2VkLCBBUkNIX0NPTlZFUlQpKQorCQkJdG1wICs9IHNpemVvZih4ZnNfYXR0cl9sZWFmX2VudHJ5X3QpOworCQlpZiAoSU5UX0dFVChtYXAtPnNpemUsIEFSQ0hfQ09OVkVSVCkgPj0gdG1wKSB7CisJCQl0bXAgPSB4ZnNfYXR0cl9sZWFmX2FkZF93b3JrKGJwLCBhcmdzLCBpKTsKKwkJCXJldHVybih0bXApOworCQl9CisJCXN1bSArPSBJTlRfR0VUKG1hcC0+c2l6ZSwgQVJDSF9DT05WRVJUKTsKKwl9CisKKwkvKgorCSAqIElmIHRoZXJlIGFyZSBubyBob2xlcyBpbiB0aGUgYWRkcmVzcyBzcGFjZSBvZiB0aGUgYmxvY2ssCisJICogYW5kIHdlIGRvbid0IGhhdmUgZW5vdWdoIGZyZWVzcGFjZSwgdGhlbiBjb21wYWN0aW9uIHdpbGwgZG8gdXMKKwkgKiBubyBnb29kIGFuZCB3ZSBzaG91bGQganVzdCBnaXZlIHVwLgorCSAqLworCWlmICghaGRyLT5ob2xlcyAmJiAoc3VtIDwgZW50c2l6ZSkpCisJCXJldHVybihYRlNfRVJST1IoRU5PU1BDKSk7CisKKwkvKgorCSAqIENvbXBhY3QgdGhlIGVudHJpZXMgdG8gY29hbGVzY2UgZnJlZSBzcGFjZS4KKwkgKiBUaGlzIG1heSBjaGFuZ2UgdGhlIGhkci0+Y291bnQgdmlhIGRyb3BwaW5nIElOQ09NUExFVEUgZW50cmllcy4KKwkgKi8KKwl4ZnNfYXR0cl9sZWFmX2NvbXBhY3QoYXJncy0+dHJhbnMsIGJwKTsKKworCS8qCisJICogQWZ0ZXIgY29tcGFjdGlvbiwgdGhlIGJsb2NrIGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSBvbmx5IG9uZQorCSAqIGZyZWUgcmVnaW9uLCBpbiBmcmVlbWFwWzBdLiAgSWYgaXQgaXMgbm90IGJpZyBlbm91Z2gsIGdpdmUgdXAuCisJICovCisJaWYgKElOVF9HRVQoaGRyLT5mcmVlbWFwWzBdLnNpemUsIEFSQ0hfQ09OVkVSVCkKKwkJCQk8IChlbnRzaXplICsgc2l6ZW9mKHhmc19hdHRyX2xlYWZfZW50cnlfdCkpKQorCQlyZXR1cm4oWEZTX0VSUk9SKEVOT1NQQykpOworCisJcmV0dXJuKHhmc19hdHRyX2xlYWZfYWRkX3dvcmsoYnAsIGFyZ3MsIDApKTsKK30KKworLyoKKyAqIEFkZCBhIG5hbWUgdG8gYSBsZWFmIGF0dHJpYnV0ZSBsaXN0IHN0cnVjdHVyZS4KKyAqLworU1RBVElDIGludAoreGZzX2F0dHJfbGVhZl9hZGRfd29yayh4ZnNfZGFidWZfdCAqYnAsIHhmc19kYV9hcmdzX3QgKmFyZ3MsIGludCBtYXBpbmRleCkKK3sKKwl4ZnNfYXR0cl9sZWFmYmxvY2tfdCAqbGVhZjsKKwl4ZnNfYXR0cl9sZWFmX2hkcl90ICpoZHI7CisJeGZzX2F0dHJfbGVhZl9lbnRyeV90ICplbnRyeTsKKwl4ZnNfYXR0cl9sZWFmX25hbWVfbG9jYWxfdCAqbmFtZV9sb2M7CisJeGZzX2F0dHJfbGVhZl9uYW1lX3JlbW90ZV90ICpuYW1lX3JtdDsKKwl4ZnNfYXR0cl9sZWFmX21hcF90ICptYXA7CisJeGZzX21vdW50X3QgKm1wOworCWludCB0bXAsIGk7CisKKwlsZWFmID0gYnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQobGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCT09IFhGU19BVFRSX0xFQUZfTUFHSUMpOworCWhkciA9ICZsZWFmLT5oZHI7CisJQVNTRVJUKChtYXBpbmRleCA+PSAwKSAmJiAobWFwaW5kZXggPCBYRlNfQVRUUl9MRUFGX01BUFNJWkUpKTsKKwlBU1NFUlQoKGFyZ3MtPmluZGV4ID49IDApCisJCSYmIChhcmdzLT5pbmRleCA8PSBJTlRfR0VUKGhkci0+Y291bnQsIEFSQ0hfQ09OVkVSVCkpKTsKKworCS8qCisJICogRm9yY2Ugb3BlbiBzb21lIHNwYWNlIGluIHRoZSBlbnRyeSBhcnJheSBhbmQgZmlsbCBpdCBpbi4KKwkgKi8KKwllbnRyeSA9ICZsZWFmLT5lbnRyaWVzW2FyZ3MtPmluZGV4XTsKKwlpZiAoYXJncy0+aW5kZXggPCBJTlRfR0VUKGhkci0+Y291bnQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJdG1wICA9IElOVF9HRVQoaGRyLT5jb3VudCwgQVJDSF9DT05WRVJUKSAtIGFyZ3MtPmluZGV4OworCQl0bXAgKj0gc2l6ZW9mKHhmc19hdHRyX2xlYWZfZW50cnlfdCk7CisJCW1lbW1vdmUoKGNoYXIgKikoZW50cnkrMSksIChjaGFyICopZW50cnksIHRtcCk7CisJCXhmc19kYV9sb2dfYnVmKGFyZ3MtPnRyYW5zLCBicCwKKwkJICAgIFhGU19EQV9MT0dSQU5HRShsZWFmLCBlbnRyeSwgdG1wICsgc2l6ZW9mKCplbnRyeSkpKTsKKwl9CisJSU5UX01PRChoZHItPmNvdW50LCBBUkNIX0NPTlZFUlQsIDEpOworCisJLyoKKwkgKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIG5ldyBzdHJpbmcgKGF0IHRoZSBlbmQgb2YgdGhlIHJ1bikuCisJICovCisJbWFwID0gJmhkci0+ZnJlZW1hcFttYXBpbmRleF07CisJbXAgPSBhcmdzLT50cmFucy0+dF9tb3VudHA7CisJQVNTRVJUKElOVF9HRVQobWFwLT5iYXNlLCBBUkNIX0NPTlZFUlQpIDwgWEZTX0xCU0laRShtcCkpOworCUFTU0VSVCgoSU5UX0dFVChtYXAtPmJhc2UsIEFSQ0hfQ09OVkVSVCkgJiAweDMpID09IDApOworCUFTU0VSVChJTlRfR0VUKG1hcC0+c2l6ZSwgQVJDSF9DT05WRVJUKQorCQkJCT49IHhmc19hdHRyX2xlYWZfbmV3ZW50c2l6ZShhcmdzLAorCQkJCQkgICAgIG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSwgTlVMTCkpOworCUFTU0VSVChJTlRfR0VUKG1hcC0+c2l6ZSwgQVJDSF9DT05WRVJUKSA8IFhGU19MQlNJWkUobXApKTsKKwlBU1NFUlQoKElOVF9HRVQobWFwLT5zaXplLCBBUkNIX0NPTlZFUlQpICYgMHgzKSA9PSAwKTsKKwlJTlRfTU9EKG1hcC0+c2l6ZSwgQVJDSF9DT05WRVJULAorCQkteGZzX2F0dHJfbGVhZl9uZXdlbnRzaXplKGFyZ3MsIG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSwgJnRtcCkpOworCUlOVF9TRVQoZW50cnktPm5hbWVpZHgsIEFSQ0hfQ09OVkVSVCwKKwkJCQkJSU5UX0dFVChtYXAtPmJhc2UsIEFSQ0hfQ09OVkVSVCkKKwkJCQkgICAgICArIElOVF9HRVQobWFwLT5zaXplLCBBUkNIX0NPTlZFUlQpKTsKKwlJTlRfU0VUKGVudHJ5LT5oYXNodmFsLCBBUkNIX0NPTlZFUlQsIGFyZ3MtPmhhc2h2YWwpOworCWVudHJ5LT5mbGFncyA9IHRtcCA/IFhGU19BVFRSX0xPQ0FMIDogMDsKKwllbnRyeS0+ZmxhZ3MgfD0gKGFyZ3MtPmZsYWdzICYgQVRUUl9TRUNVUkUpID8gWEZTX0FUVFJfU0VDVVJFIDoKKwkJCSgoYXJncy0+ZmxhZ3MgJiBBVFRSX1JPT1QpID8gWEZTX0FUVFJfUk9PVCA6IDApOworCWlmIChhcmdzLT5yZW5hbWUpIHsKKwkJZW50cnktPmZsYWdzIHw9IFhGU19BVFRSX0lOQ09NUExFVEU7CisJCWlmICgoYXJncy0+Ymxrbm8yID09IGFyZ3MtPmJsa25vKSAmJgorCQkgICAgKGFyZ3MtPmluZGV4MiA8PSBhcmdzLT5pbmRleCkpIHsKKwkJCWFyZ3MtPmluZGV4MisrOworCQl9CisJfQorCXhmc19kYV9sb2dfYnVmKGFyZ3MtPnRyYW5zLCBicCwKKwkJCSAgWEZTX0RBX0xPR1JBTkdFKGxlYWYsIGVudHJ5LCBzaXplb2YoKmVudHJ5KSkpOworCUFTU0VSVCgoYXJncy0+aW5kZXggPT0gMCkgfHwgKElOVF9HRVQoZW50cnktPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCT49IElOVF9HRVQoKGVudHJ5LTEpLT5oYXNodmFsLAorCQkJCQkJCSAgICBBUkNIX0NPTlZFUlQpKSk7CisJQVNTRVJUKChhcmdzLT5pbmRleCA9PSBJTlRfR0VUKGhkci0+Y291bnQsIEFSQ0hfQ09OVkVSVCktMSkgfHwKKwkgICAgICAgKElOVF9HRVQoZW50cnktPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkKKwkJCSAgICA8PSAoSU5UX0dFVCgoZW50cnkrMSktPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkpKSk7CisKKwkvKgorCSAqIENvcHkgdGhlIGF0dHJpYnV0ZSBuYW1lIGFuZCB2YWx1ZSBpbnRvIHRoZSBuZXcgc3BhY2UuCisJICoKKwkgKiBGb3IgInJlbW90ZSIgYXR0cmlidXRlIHZhbHVlcywgc2ltcGx5IG5vdGUgdGhhdCB3ZSBuZWVkIHRvCisJICogYWxsb2NhdGUgc3BhY2UgZm9yIHRoZSAicmVtb3RlIiB2YWx1ZS4gIFdlIGNhbid0IGFjdHVhbGx5CisJICogYWxsb2NhdGUgdGhlIGV4dGVudHMgaW4gdGhpcyB0cmFuc2FjdGlvbiwgYW5kIHdlIGNhbid0IGRlY2lkZQorCSAqIHdoaWNoIGJsb2NrcyB0aGV5IHNob3VsZCBiZSBhcyB3ZSBtaWdodCBhbGxvY2F0ZSBtb3JlIGJsb2NrcworCSAqIGFzIHBhcnQgb2YgdGhpcyB0cmFuc2FjdGlvbiAoYSBzcGxpdCBvcGVyYXRpb24gZm9yIGV4YW1wbGUpLgorCSAqLworCWlmIChlbnRyeS0+ZmxhZ3MgJiBYRlNfQVRUUl9MT0NBTCkgeworCQluYW1lX2xvYyA9IFhGU19BVFRSX0xFQUZfTkFNRV9MT0NBTChsZWFmLCBhcmdzLT5pbmRleCk7CisJCW5hbWVfbG9jLT5uYW1lbGVuID0gYXJncy0+bmFtZWxlbjsKKwkJSU5UX1NFVChuYW1lX2xvYy0+dmFsdWVsZW4sIEFSQ0hfQ09OVkVSVCwgYXJncy0+dmFsdWVsZW4pOworCQltZW1jcHkoKGNoYXIgKiluYW1lX2xvYy0+bmFtZXZhbCwgYXJncy0+bmFtZSwgYXJncy0+bmFtZWxlbik7CisJCW1lbWNweSgoY2hhciAqKSZuYW1lX2xvYy0+bmFtZXZhbFthcmdzLT5uYW1lbGVuXSwgYXJncy0+dmFsdWUsCisJCQkJICAgSU5UX0dFVChuYW1lX2xvYy0+dmFsdWVsZW4sIEFSQ0hfQ09OVkVSVCkpOworCX0gZWxzZSB7CisJCW5hbWVfcm10ID0gWEZTX0FUVFJfTEVBRl9OQU1FX1JFTU9URShsZWFmLCBhcmdzLT5pbmRleCk7CisJCW5hbWVfcm10LT5uYW1lbGVuID0gYXJncy0+bmFtZWxlbjsKKwkJbWVtY3B5KChjaGFyICopbmFtZV9ybXQtPm5hbWUsIGFyZ3MtPm5hbWUsIGFyZ3MtPm5hbWVsZW4pOworCQllbnRyeS0+ZmxhZ3MgfD0gWEZTX0FUVFJfSU5DT01QTEVURTsKKwkJLyoganVzdCBpbiBjYXNlICovCisJCW5hbWVfcm10LT52YWx1ZWxlbiA9IDA7CisJCW5hbWVfcm10LT52YWx1ZWJsayA9IDA7CisJCWFyZ3MtPnJtdGJsa25vID0gMTsKKwkJYXJncy0+cm10YmxrY250ID0gWEZTX0JfVE9fRlNCKG1wLCBhcmdzLT52YWx1ZWxlbik7CisJfQorCXhmc19kYV9sb2dfYnVmKGFyZ3MtPnRyYW5zLCBicCwKKwkgICAgIFhGU19EQV9MT0dSQU5HRShsZWFmLCBYRlNfQVRUUl9MRUFGX05BTUUobGVhZiwgYXJncy0+aW5kZXgpLAorCQkJCSAgIHhmc19hdHRyX2xlYWZfZW50c2l6ZShsZWFmLCBhcmdzLT5pbmRleCkpKTsKKworCS8qCisJICogVXBkYXRlIHRoZSBjb250cm9sIGluZm8gZm9yIHRoaXMgbGVhZiBub2RlCisJICovCisJaWYgKElOVF9HRVQoZW50cnktPm5hbWVpZHgsIEFSQ0hfQ09OVkVSVCkKKwkJCQk8IElOVF9HRVQoaGRyLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJLyogYm90aCBvbi1kaXNrLCBkb24ndCBlbmRpYW4tZmxpcCB0d2ljZSAqLworCQloZHItPmZpcnN0dXNlZCA9IGVudHJ5LT5uYW1laWR4OworCX0KKwlBU1NFUlQoSU5UX0dFVChoZHItPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJUKQorCQkJCT49ICgoSU5UX0dFVChoZHItPmNvdW50LCBBUkNIX0NPTlZFUlQpCisJCQkJCSogc2l6ZW9mKCplbnRyeSkpK3NpemVvZigqaGRyKSkpOworCXRtcCA9IChJTlRfR0VUKGhkci0+Y291bnQsIEFSQ0hfQ09OVkVSVCktMSkKKwkJCQkJKiBzaXplb2YoeGZzX2F0dHJfbGVhZl9lbnRyeV90KQorCQkJCQkrIHNpemVvZih4ZnNfYXR0cl9sZWFmX2hkcl90KTsKKwltYXAgPSAmaGRyLT5mcmVlbWFwWzBdOworCWZvciAoaSA9IDA7IGkgPCBYRlNfQVRUUl9MRUFGX01BUFNJWkU7IG1hcCsrLCBpKyspIHsKKwkJaWYgKElOVF9HRVQobWFwLT5iYXNlLCBBUkNIX0NPTlZFUlQpID09IHRtcCkgeworCQkJSU5UX01PRChtYXAtPmJhc2UsIEFSQ0hfQ09OVkVSVCwKKwkJCQkJc2l6ZW9mKHhmc19hdHRyX2xlYWZfZW50cnlfdCkpOworCQkJSU5UX01PRChtYXAtPnNpemUsIEFSQ0hfQ09OVkVSVCwKKwkJCQkJLXNpemVvZih4ZnNfYXR0cl9sZWFmX2VudHJ5X3QpKTsKKwkJfQorCX0KKwlJTlRfTU9EKGhkci0+dXNlZGJ5dGVzLCBBUkNIX0NPTlZFUlQsCisJCQkJeGZzX2F0dHJfbGVhZl9lbnRzaXplKGxlYWYsIGFyZ3MtPmluZGV4KSk7CisJeGZzX2RhX2xvZ19idWYoYXJncy0+dHJhbnMsIGJwLAorCQlYRlNfREFfTE9HUkFOR0UobGVhZiwgaGRyLCBzaXplb2YoKmhkcikpKTsKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBHYXJiYWdlIGNvbGxlY3QgYSBsZWFmIGF0dHJpYnV0ZSBsaXN0IGJsb2NrIGJ5IGNvcHlpbmcgaXQgdG8gYSBuZXcgYnVmZmVyLgorICovCitTVEFUSUMgdm9pZAoreGZzX2F0dHJfbGVhZl9jb21wYWN0KHhmc190cmFuc190ICp0cmFucywgeGZzX2RhYnVmX3QgKmJwKQoreworCXhmc19hdHRyX2xlYWZibG9ja190ICpsZWFmX3MsICpsZWFmX2Q7CisJeGZzX2F0dHJfbGVhZl9oZHJfdCAqaGRyX3MsICpoZHJfZDsKKwl4ZnNfbW91bnRfdCAqbXA7CisJY2hhciAqdG1wYnVmZmVyOworCisJbXAgPSB0cmFucy0+dF9tb3VudHA7CisJdG1wYnVmZmVyID0ga21lbV9hbGxvYyhYRlNfTEJTSVpFKG1wKSwgS01fU0xFRVApOworCUFTU0VSVCh0bXBidWZmZXIgIT0gTlVMTCk7CisJbWVtY3B5KHRtcGJ1ZmZlciwgYnAtPmRhdGEsIFhGU19MQlNJWkUobXApKTsKKwltZW1zZXQoYnAtPmRhdGEsIDAsIFhGU19MQlNJWkUobXApKTsKKworCS8qCisJICogQ29weSBiYXNpYyBpbmZvcm1hdGlvbgorCSAqLworCWxlYWZfcyA9ICh4ZnNfYXR0cl9sZWFmYmxvY2tfdCAqKXRtcGJ1ZmZlcjsKKwlsZWFmX2QgPSBicC0+ZGF0YTsKKwloZHJfcyA9ICZsZWFmX3MtPmhkcjsKKwloZHJfZCA9ICZsZWFmX2QtPmhkcjsKKwloZHJfZC0+aW5mbyA9IGhkcl9zLT5pbmZvOwkvKiBzdHJ1Y3QgY29weSAqLworCUlOVF9TRVQoaGRyX2QtPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJULCBYRlNfTEJTSVpFKG1wKSk7CisJLyogaGFuZGxlIHRydW5jYXRpb24gZ3JhY2VmdWxseSAqLworCWlmICghaGRyX2QtPmZpcnN0dXNlZCkgeworCQlJTlRfU0VUKGhkcl9kLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCwKKwkJCQlYRlNfTEJTSVpFKG1wKSAtIFhGU19BVFRSX0xFQUZfTkFNRV9BTElHTik7CisJfQorCWhkcl9kLT51c2VkYnl0ZXMgPSAwOworCWhkcl9kLT5jb3VudCA9IDA7CisJaGRyX2QtPmhvbGVzID0gMDsKKwlJTlRfU0VUKGhkcl9kLT5mcmVlbWFwWzBdLmJhc2UsIEFSQ0hfQ09OVkVSVCwKKwkJCQkJc2l6ZW9mKHhmc19hdHRyX2xlYWZfaGRyX3QpKTsKKwlJTlRfU0VUKGhkcl9kLT5mcmVlbWFwWzBdLnNpemUsIEFSQ0hfQ09OVkVSVCwKKwkJCQlJTlRfR0VUKGhkcl9kLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCkKKwkJCSAgICAgIC0gSU5UX0dFVChoZHJfZC0+ZnJlZW1hcFswXS5iYXNlLCBBUkNIX0NPTlZFUlQpKTsKKworCS8qCisJICogQ29weSBhbGwgZW50cnkncyBpbiB0aGUgc2FtZSAoc29ydGVkKSBvcmRlciwKKwkgKiBidXQgYWxsb2NhdGUgbmFtZS92YWx1ZSBwYWlycyBwYWNrZWQgYW5kIGluIHNlcXVlbmNlLgorCSAqLworCXhmc19hdHRyX2xlYWZfbW92ZWVudHMobGVhZl9zLCAwLCBsZWFmX2QsIDAsCisJCQkJKGludClJTlRfR0VUKGhkcl9zLT5jb3VudCwgQVJDSF9DT05WRVJUKSwgbXApOworCisJeGZzX2RhX2xvZ19idWYodHJhbnMsIGJwLCAwLCBYRlNfTEJTSVpFKG1wKSAtIDEpOworCisJa21lbV9mcmVlKHRtcGJ1ZmZlciwgWEZTX0xCU0laRShtcCkpOworfQorCisvKgorICogUmVkaXN0cmlidXRlIHRoZSBhdHRyaWJ1dGUgbGlzdCBlbnRyaWVzIGJldHdlZW4gdHdvIGxlYWYgbm9kZXMsCisgKiB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBzaXplIG9mIHRoZSBuZXcgZW50cnkuCisgKgorICogTk9URTogaWYgbmV3IGJsb2NrIGlzIGVtcHR5LCB0aGVuIGl0IHdpbGwgZ2V0IHRoZSB1cHBlciBoYWxmIG9mIHRoZQorICogb2xkIGJsb2NrLiAgQXQgcHJlc2VudCwgYWxsIChvbmUpIGNhbGxlcnMgcGFzcyBpbiBhbiBlbXB0eSBzZWNvbmQgYmxvY2suCisgKgorICogVGhpcyBjb2RlIGFkanVzdHMgdGhlIGFyZ3MtPmluZGV4L2Jsa25vIGFuZCBhcmdzLT5pbmRleDIvYmxrbm8yIGZpZWxkcworICogdG8gbWF0Y2ggd2hhdCBpdCBpcyBkb2luZyBpbiBzcGxpdHRpbmcgdGhlIGF0dHJpYnV0ZSBsZWFmIGJsb2NrLiAgVGhvc2UKKyAqIHZhbHVlcyBhcmUgdXNlZCBpbiAiYXRvbWljIHJlbmFtZSIgb3BlcmF0aW9ucyBvbiBhdHRyaWJ1dGVzLiAgTm90ZSB0aGF0CisgKiB0aGUgIm5ldyIgYW5kICJvbGQiIHZhbHVlcyBjYW4gZW5kIHVwIGluIGRpZmZlcmVudCBibG9ja3MuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYXR0cl9sZWFmX3JlYmFsYW5jZSh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUsIHhmc19kYV9zdGF0ZV9ibGtfdCAqYmxrMSwKKwkJCQkgICAgICAgeGZzX2RhX3N0YXRlX2Jsa190ICpibGsyKQoreworCXhmc19kYV9hcmdzX3QgKmFyZ3M7CisJeGZzX2RhX3N0YXRlX2Jsa190ICp0bXBfYmxrOworCXhmc19hdHRyX2xlYWZibG9ja190ICpsZWFmMSwgKmxlYWYyOworCXhmc19hdHRyX2xlYWZfaGRyX3QgKmhkcjEsICpoZHIyOworCWludCBjb3VudCwgdG90YWxsZW4sIG1heCwgc3BhY2UsIHN3YXA7CisKKwkvKgorCSAqIFNldCB1cCBlbnZpcm9ubWVudC4KKwkgKi8KKwlBU1NFUlQoYmxrMS0+bWFnaWMgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisJQVNTRVJUKGJsazItPm1hZ2ljID09IFhGU19BVFRSX0xFQUZfTUFHSUMpOworCWxlYWYxID0gYmxrMS0+YnAtPmRhdGE7CisJbGVhZjIgPSBibGsyLT5icC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChsZWFmMS0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCT09IFhGU19BVFRSX0xFQUZfTUFHSUMpOworCUFTU0VSVChJTlRfR0VUKGxlYWYyLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKQorCQkJCQkJPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisJYXJncyA9IHN0YXRlLT5hcmdzOworCisJLyoKKwkgKiBDaGVjayBvcmRlcmluZyBvZiBibG9ja3MsIHJldmVyc2UgaWYgaXQgbWFrZXMgdGhpbmdzIHNpbXBsZXIuCisJICoKKwkgKiBOT1RFOiBHaXZlbiB0aGF0IGFsbCAoY3VycmVudCkgY2FsbGVycyBwYXNzIGluIGFuIGVtcHR5CisJICogc2Vjb25kIGJsb2NrLCB0aGlzIGNvZGUgc2hvdWxkIG5ldmVyIHNldCAic3dhcCIuCisJICovCisJc3dhcCA9IDA7CisJaWYgKHhmc19hdHRyX2xlYWZfb3JkZXIoYmxrMS0+YnAsIGJsazItPmJwKSkgeworCQl0bXBfYmxrID0gYmxrMTsKKwkJYmxrMSA9IGJsazI7CisJCWJsazIgPSB0bXBfYmxrOworCQlsZWFmMSA9IGJsazEtPmJwLT5kYXRhOworCQlsZWFmMiA9IGJsazItPmJwLT5kYXRhOworCQlzd2FwID0gMTsKKwl9CisJaGRyMSA9ICZsZWFmMS0+aGRyOworCWhkcjIgPSAmbGVhZjItPmhkcjsKKworCS8qCisJICogRXhhbWluZSBlbnRyaWVzIHVudGlsIHdlIHJlZHVjZSB0aGUgYWJzb2x1dGUgZGlmZmVyZW5jZSBpbgorCSAqIGJ5dGUgdXNhZ2UgYmV0d2VlbiB0aGUgdHdvIGJsb2NrcyB0byBhIG1pbmltdW0uICBUaGVuIGdldAorCSAqIHRoZSBkaXJlY3Rpb24gdG8gY29weSBhbmQgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBtb3ZlLgorCSAqCisJICogImlubGVhZiIgaXMgdHJ1ZSBpZiB0aGUgbmV3IGVudHJ5IHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIGJsazEuCisJICogSWYgInN3YXAiIGlzIGFsc28gdHJ1ZSwgdGhlbiByZXZlcnNlIHRoZSBzZW5zZSBvZiAiaW5sZWFmIi4KKwkgKi8KKwlzdGF0ZS0+aW5sZWFmID0geGZzX2F0dHJfbGVhZl9maWd1cmVfYmFsYW5jZShzdGF0ZSwgYmxrMSwgYmxrMiwKKwkJCQkJCQkgICAgJmNvdW50LCAmdG90YWxsZW4pOworCWlmIChzd2FwKQorCQlzdGF0ZS0+aW5sZWFmID0gIXN0YXRlLT5pbmxlYWY7CisKKwkvKgorCSAqIE1vdmUgYW55IGVudHJpZXMgcmVxdWlyZWQgZnJvbSBsZWFmIHRvIGxlYWY6CisJICovCisJaWYgKGNvdW50IDwgSU5UX0dFVChoZHIxLT5jb3VudCwgQVJDSF9DT05WRVJUKSkgeworCQkvKgorCQkgKiBGaWd1cmUgdGhlIHRvdGFsIGJ5dGVzIHRvIGJlIGFkZGVkIHRvIHRoZSBkZXN0aW5hdGlvbiBsZWFmLgorCQkgKi8KKwkJLyogbnVtYmVyIGVudHJpZXMgYmVpbmcgbW92ZWQgKi8KKwkJY291bnQgPSBJTlRfR0VUKGhkcjEtPmNvdW50LCBBUkNIX0NPTlZFUlQpIC0gY291bnQ7CisJCXNwYWNlICA9IElOVF9HRVQoaGRyMS0+dXNlZGJ5dGVzLCBBUkNIX0NPTlZFUlQpIC0gdG90YWxsZW47CisJCXNwYWNlICs9IGNvdW50ICogc2l6ZW9mKHhmc19hdHRyX2xlYWZfZW50cnlfdCk7CisKKwkJLyoKKwkJICogbGVhZjIgaXMgdGhlIGRlc3RpbmF0aW9uLCBjb21wYWN0IGl0IGlmIGl0IGxvb2tzIHRpZ2h0LgorCQkgKi8KKwkJbWF4ICA9IElOVF9HRVQoaGRyMi0+Zmlyc3R1c2VkLCBBUkNIX0NPTlZFUlQpCisJCQkJCQktIHNpemVvZih4ZnNfYXR0cl9sZWFmX2hkcl90KTsKKwkJbWF4IC09IElOVF9HRVQoaGRyMi0+Y291bnQsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJKiBzaXplb2YoeGZzX2F0dHJfbGVhZl9lbnRyeV90KTsKKwkJaWYgKHNwYWNlID4gbWF4KSB7CisJCQl4ZnNfYXR0cl9sZWFmX2NvbXBhY3QoYXJncy0+dHJhbnMsIGJsazItPmJwKTsKKwkJfQorCisJCS8qCisJCSAqIE1vdmUgaGlnaCBlbnRyaWVzIGZyb20gbGVhZjEgdG8gbG93IGVuZCBvZiBsZWFmMi4KKwkJICovCisJCXhmc19hdHRyX2xlYWZfbW92ZWVudHMobGVhZjEsCisJCQkJSU5UX0dFVChoZHIxLT5jb3VudCwgQVJDSF9DT05WRVJUKS1jb3VudCwKKwkJCQlsZWFmMiwgMCwgY291bnQsIHN0YXRlLT5tcCk7CisKKwkJeGZzX2RhX2xvZ19idWYoYXJncy0+dHJhbnMsIGJsazEtPmJwLCAwLCBzdGF0ZS0+YmxvY2tzaXplLTEpOworCQl4ZnNfZGFfbG9nX2J1ZihhcmdzLT50cmFucywgYmxrMi0+YnAsIDAsIHN0YXRlLT5ibG9ja3NpemUtMSk7CisJfSBlbHNlIGlmIChjb3VudCA+IElOVF9HRVQoaGRyMS0+Y291bnQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJLyoKKwkJICogSSBhc3NlcnQgdGhhdCBzaW5jZSBhbGwgY2FsbGVycyBwYXNzIGluIGFuIGVtcHR5CisJCSAqIHNlY29uZCBidWZmZXIsIHRoaXMgY29kZSBzaG91bGQgbmV2ZXIgZXhlY3V0ZS4KKwkJICovCisKKwkJLyoKKwkJICogRmlndXJlIHRoZSB0b3RhbCBieXRlcyB0byBiZSBhZGRlZCB0byB0aGUgZGVzdGluYXRpb24gbGVhZi4KKwkJICovCisJCS8qIG51bWJlciBlbnRyaWVzIGJlaW5nIG1vdmVkICovCisJCWNvdW50IC09IElOVF9HRVQoaGRyMS0+Y291bnQsIEFSQ0hfQ09OVkVSVCk7CisJCXNwYWNlICA9IHRvdGFsbGVuIC0gSU5UX0dFVChoZHIxLT51c2VkYnl0ZXMsIEFSQ0hfQ09OVkVSVCk7CisJCXNwYWNlICs9IGNvdW50ICogc2l6ZW9mKHhmc19hdHRyX2xlYWZfZW50cnlfdCk7CisKKwkJLyoKKwkJICogbGVhZjEgaXMgdGhlIGRlc3RpbmF0aW9uLCBjb21wYWN0IGl0IGlmIGl0IGxvb2tzIHRpZ2h0LgorCQkgKi8KKwkJbWF4ICA9IElOVF9HRVQoaGRyMS0+Zmlyc3R1c2VkLCBBUkNIX0NPTlZFUlQpCisJCQkJCQktIHNpemVvZih4ZnNfYXR0cl9sZWFmX2hkcl90KTsKKwkJbWF4IC09IElOVF9HRVQoaGRyMS0+Y291bnQsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJKiBzaXplb2YoeGZzX2F0dHJfbGVhZl9lbnRyeV90KTsKKwkJaWYgKHNwYWNlID4gbWF4KSB7CisJCQl4ZnNfYXR0cl9sZWFmX2NvbXBhY3QoYXJncy0+dHJhbnMsIGJsazEtPmJwKTsKKwkJfQorCisJCS8qCisJCSAqIE1vdmUgbG93IGVudHJpZXMgZnJvbSBsZWFmMiB0byBoaWdoIGVuZCBvZiBsZWFmMS4KKwkJICovCisJCXhmc19hdHRyX2xlYWZfbW92ZWVudHMobGVhZjIsIDAsIGxlYWYxLAorCQkJCShpbnQpSU5UX0dFVChoZHIxLT5jb3VudCwgQVJDSF9DT05WRVJUKSwgY291bnQsCisJCQkJc3RhdGUtPm1wKTsKKworCQl4ZnNfZGFfbG9nX2J1ZihhcmdzLT50cmFucywgYmxrMS0+YnAsIDAsIHN0YXRlLT5ibG9ja3NpemUtMSk7CisJCXhmc19kYV9sb2dfYnVmKGFyZ3MtPnRyYW5zLCBibGsyLT5icCwgMCwgc3RhdGUtPmJsb2Nrc2l6ZS0xKTsKKwl9CisKKwkvKgorCSAqIENvcHkgb3V0IGxhc3QgaGFzaHZhbCBpbiBlYWNoIGJsb2NrIGZvciBCLXRyZWUgY29kZS4KKwkgKi8KKwlibGsxLT5oYXNodmFsID0KKwkgICAgSU5UX0dFVChsZWFmMS0+ZW50cmllc1tJTlRfR0VUKGxlYWYxLT5oZHIuY291bnQsCisJCQkJICAgIEFSQ0hfQ09OVkVSVCktMV0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKTsKKwlibGsyLT5oYXNodmFsID0KKwkgICAgSU5UX0dFVChsZWFmMi0+ZW50cmllc1tJTlRfR0VUKGxlYWYyLT5oZHIuY291bnQsCisJCQkJICAgIEFSQ0hfQ09OVkVSVCktMV0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKTsKKworCS8qCisJICogQWRqdXN0IHRoZSBleHBlY3RlZCBpbmRleCBmb3IgaW5zZXJ0aW9uLgorCSAqIE5PVEU6IHRoaXMgY29kZSBkZXBlbmRzIG9uIHRoZSAoY3VycmVudCkgc2l0dWF0aW9uIHRoYXQgdGhlCisJICogc2Vjb25kIGJsb2NrIHdhcyBvcmlnaW5hbGx5IGVtcHR5LgorCSAqCisJICogSWYgdGhlIGluc2VydGlvbiBwb2ludCBtb3ZlZCB0byB0aGUgMm5kIGJsb2NrLCB3ZSBtdXN0IGFkanVzdAorCSAqIHRoZSBpbmRleC4gIFdlIG11c3QgYWxzbyB0cmFjayB0aGUgZW50cnkganVzdCBmb2xsb3dpbmcgdGhlCisJICogbmV3IGVudHJ5IGZvciB1c2UgaW4gYW4gImF0b21pYyByZW5hbWUiIG9wZXJhdGlvbiwgdGhhdCBlbnRyeQorCSAqIGlzIGFsd2F5cyB0aGUgIm9sZCIgZW50cnkgYW5kIHRoZSAibmV3IiBlbnRyeSBpcyB3aGF0IHdlIGFyZQorCSAqIGluc2VydGluZy4gIFRoZSBpbmRleC9ibGtubyBmaWVsZHMgcmVmZXIgdG8gdGhlICJvbGQiIGVudHJ5LAorCSAqIHdoaWxlIHRoZSBpbmRleDIvYmxrbm8yIGZpZWxkcyByZWZlciB0byB0aGUgIm5ldyIgZW50cnkuCisJICovCisJaWYgKGJsazEtPmluZGV4ID4gSU5UX0dFVChsZWFmMS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpKSB7CisJCUFTU0VSVChzdGF0ZS0+aW5sZWFmID09IDApOworCQlibGsyLT5pbmRleCA9IGJsazEtPmluZGV4CisJCQkJLSBJTlRfR0VUKGxlYWYxLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJCWFyZ3MtPmluZGV4ID0gYXJncy0+aW5kZXgyID0gYmxrMi0+aW5kZXg7CisJCWFyZ3MtPmJsa25vID0gYXJncy0+Ymxrbm8yID0gYmxrMi0+Ymxrbm87CisJfSBlbHNlIGlmIChibGsxLT5pbmRleCA9PSBJTlRfR0VUKGxlYWYxLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJaWYgKHN0YXRlLT5pbmxlYWYpIHsKKwkJCWFyZ3MtPmluZGV4ID0gYmxrMS0+aW5kZXg7CisJCQlhcmdzLT5ibGtubyA9IGJsazEtPmJsa25vOworCQkJYXJncy0+aW5kZXgyID0gMDsKKwkJCWFyZ3MtPmJsa25vMiA9IGJsazItPmJsa25vOworCQl9IGVsc2UgeworCQkJYmxrMi0+aW5kZXggPSBibGsxLT5pbmRleAorCQkJCSAgICAtIElOVF9HRVQobGVhZjEtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKTsKKwkJCWFyZ3MtPmluZGV4ID0gYXJncy0+aW5kZXgyID0gYmxrMi0+aW5kZXg7CisJCQlhcmdzLT5ibGtubyA9IGFyZ3MtPmJsa25vMiA9IGJsazItPmJsa25vOworCQl9CisJfSBlbHNlIHsKKwkJQVNTRVJUKHN0YXRlLT5pbmxlYWYgPT0gMSk7CisJCWFyZ3MtPmluZGV4ID0gYXJncy0+aW5kZXgyID0gYmxrMS0+aW5kZXg7CisJCWFyZ3MtPmJsa25vID0gYXJncy0+Ymxrbm8yID0gYmxrMS0+Ymxrbm87CisJfQorfQorCisvKgorICogRXhhbWluZSBlbnRyaWVzIHVudGlsIHdlIHJlZHVjZSB0aGUgYWJzb2x1dGUgZGlmZmVyZW5jZSBpbgorICogYnl0ZSB1c2FnZSBiZXR3ZWVuIHRoZSB0d28gYmxvY2tzIHRvIGEgbWluaW11bS4KKyAqIEdST1Q6IElzIHRoaXMgcmVhbGx5IG5lY2Vzc2FyeT8gIFdpdGggb3RoZXIgdGhhbiBhIDUxMiBieXRlIGJsb2Nrc2l6ZSwKKyAqIEdST1Q6IHRoZXJlIHdpbGwgYWx3YXlzIGJlIGVub3VnaCByb29tIGluIGVpdGhlciBibG9jayBmb3IgYSBuZXcgZW50cnkuCisgKiBHUk9UOiBEbyBhIGRvdWJsZS1zcGxpdCBmb3IgdGhpcyBjYXNlPworICovCitTVEFUSUMgaW50Cit4ZnNfYXR0cl9sZWFmX2ZpZ3VyZV9iYWxhbmNlKHhmc19kYV9zdGF0ZV90ICpzdGF0ZSwKKwkJCQkgICAgeGZzX2RhX3N0YXRlX2Jsa190ICpibGsxLAorCQkJCSAgICB4ZnNfZGFfc3RhdGVfYmxrX3QgKmJsazIsCisJCQkJICAgIGludCAqY291bnRhcmcsIGludCAqdXNlZGJ5dGVzYXJnKQoreworCXhmc19hdHRyX2xlYWZibG9ja190ICpsZWFmMSwgKmxlYWYyOworCXhmc19hdHRyX2xlYWZfaGRyX3QgKmhkcjEsICpoZHIyOworCXhmc19hdHRyX2xlYWZfZW50cnlfdCAqZW50cnk7CisJaW50IGNvdW50LCBtYXgsIGluZGV4LCB0b3RhbGxlbiwgaGFsZjsKKwlpbnQgbGFzdGRlbHRhLCBmb3VuZGl0LCB0bXA7CisKKwkvKgorCSAqIFNldCB1cCBlbnZpcm9ubWVudC4KKwkgKi8KKwlsZWFmMSA9IGJsazEtPmJwLT5kYXRhOworCWxlYWYyID0gYmxrMi0+YnAtPmRhdGE7CisJaGRyMSA9ICZsZWFmMS0+aGRyOworCWhkcjIgPSAmbGVhZjItPmhkcjsKKwlmb3VuZGl0ID0gMDsKKwl0b3RhbGxlbiA9IDA7CisKKwkvKgorCSAqIEV4YW1pbmUgZW50cmllcyB1bnRpbCB3ZSByZWR1Y2UgdGhlIGFic29sdXRlIGRpZmZlcmVuY2UgaW4KKwkgKiBieXRlIHVzYWdlIGJldHdlZW4gdGhlIHR3byBibG9ja3MgdG8gYSBtaW5pbXVtLgorCSAqLworCW1heCA9IElOVF9HRVQoaGRyMS0+Y291bnQsIEFSQ0hfQ09OVkVSVCkKKwkJCSsgSU5UX0dFVChoZHIyLT5jb3VudCwgQVJDSF9DT05WRVJUKTsKKwloYWxmICA9IChtYXgrMSkgKiBzaXplb2YoKmVudHJ5KTsKKwloYWxmICs9IElOVF9HRVQoaGRyMS0+dXNlZGJ5dGVzLCBBUkNIX0NPTlZFUlQpCisJCQkJKyBJTlRfR0VUKGhkcjItPnVzZWRieXRlcywgQVJDSF9DT05WRVJUKQorCQkJCSsgeGZzX2F0dHJfbGVhZl9uZXdlbnRzaXplKHN0YXRlLT5hcmdzLAorCQkJCQkJICAgICBzdGF0ZS0+YmxvY2tzaXplLCBOVUxMKTsKKwloYWxmIC89IDI7CisJbGFzdGRlbHRhID0gc3RhdGUtPmJsb2Nrc2l6ZTsKKwllbnRyeSA9ICZsZWFmMS0+ZW50cmllc1swXTsKKwlmb3IgKGNvdW50ID0gaW5kZXggPSAwOyBjb3VudCA8IG1heDsgZW50cnkrKywgaW5kZXgrKywgY291bnQrKykgeworCisjZGVmaW5lIFhGU19BVFRSX0FCUyhBKQkoKChBKSA8IDApID8gLShBKSA6IChBKSkKKwkJLyoKKwkJICogVGhlIG5ldyBlbnRyeSBpcyBpbiB0aGUgZmlyc3QgYmxvY2ssIGFjY291bnQgZm9yIGl0LgorCQkgKi8KKwkJaWYgKGNvdW50ID09IGJsazEtPmluZGV4KSB7CisJCQl0bXAgPSB0b3RhbGxlbiArIHNpemVvZigqZW50cnkpICsKKwkJCQl4ZnNfYXR0cl9sZWFmX25ld2VudHNpemUoc3RhdGUtPmFyZ3MsCisJCQkJCQkJIHN0YXRlLT5ibG9ja3NpemUsCisJCQkJCQkJIE5VTEwpOworCQkJaWYgKFhGU19BVFRSX0FCUyhoYWxmIC0gdG1wKSA+IGxhc3RkZWx0YSkKKwkJCQlicmVhazsKKwkJCWxhc3RkZWx0YSA9IFhGU19BVFRSX0FCUyhoYWxmIC0gdG1wKTsKKwkJCXRvdGFsbGVuID0gdG1wOworCQkJZm91bmRpdCA9IDE7CisJCX0KKworCQkvKgorCQkgKiBXcmFwIGFyb3VuZCBpbnRvIHRoZSBzZWNvbmQgYmxvY2sgaWYgbmVjZXNzYXJ5LgorCQkgKi8KKwkJaWYgKGNvdW50ID09IElOVF9HRVQoaGRyMS0+Y291bnQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJCWxlYWYxID0gbGVhZjI7CisJCQllbnRyeSA9ICZsZWFmMS0+ZW50cmllc1swXTsKKwkJCWluZGV4ID0gMDsKKwkJfQorCisJCS8qCisJCSAqIEZpZ3VyZSBvdXQgaWYgbmV4dCBsZWFmIGVudHJ5IHdvdWxkIGJlIHRvbyBtdWNoLgorCQkgKi8KKwkJdG1wID0gdG90YWxsZW4gKyBzaXplb2YoKmVudHJ5KSArIHhmc19hdHRyX2xlYWZfZW50c2l6ZShsZWFmMSwKKwkJCQkJCQkJCWluZGV4KTsKKwkJaWYgKFhGU19BVFRSX0FCUyhoYWxmIC0gdG1wKSA+IGxhc3RkZWx0YSkKKwkJCWJyZWFrOworCQlsYXN0ZGVsdGEgPSBYRlNfQVRUUl9BQlMoaGFsZiAtIHRtcCk7CisJCXRvdGFsbGVuID0gdG1wOworI3VuZGVmIFhGU19BVFRSX0FCUworCX0KKworCS8qCisJICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgdXNlZGJ5dGVzIHRoYXQgd2lsbCBlbmQgdXAgaW4gbG93ZXIgYmxvY2suCisJICogSWYgbmV3IGVudHJ5IG5vdCBpbiBsb3dlciBibG9jaywgZml4IHVwIHRoZSBjb3VudC4KKwkgKi8KKwl0b3RhbGxlbiAtPSBjb3VudCAqIHNpemVvZigqZW50cnkpOworCWlmIChmb3VuZGl0KSB7CisJCXRvdGFsbGVuIC09IHNpemVvZigqZW50cnkpICsKKwkJCQl4ZnNfYXR0cl9sZWFmX25ld2VudHNpemUoc3RhdGUtPmFyZ3MsCisJCQkJCQkJIHN0YXRlLT5ibG9ja3NpemUsCisJCQkJCQkJIE5VTEwpOworCX0KKworCSpjb3VudGFyZyA9IGNvdW50OworCSp1c2VkYnl0ZXNhcmcgPSB0b3RhbGxlbjsKKwlyZXR1cm4oZm91bmRpdCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSb3V0aW5lcyB1c2VkIGZvciBzaHJpbmtpbmcgdGhlIEJ0cmVlLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICogQ2hlY2sgYSBsZWFmIGJsb2NrIGFuZCBpdHMgbmVpZ2hib3JzIHRvIHNlZSBpZiB0aGUgYmxvY2sgc2hvdWxkIGJlCisgKiBjb2xsYXBzZWQgaW50byBvbmUgb3IgdGhlIG90aGVyIG5laWdoYm9yLiAgQWx3YXlzIGtlZXAgdGhlIGJsb2NrCisgKiB3aXRoIHRoZSBzbWFsbGVyIGJsb2NrIG51bWJlci4KKyAqIElmIHRoZSBjdXJyZW50IGJsb2NrIGlzIG92ZXIgNTAlIGZ1bGwsIGRvbid0IHRyeSB0byBqb2luIGl0LCByZXR1cm4gMC4KKyAqIElmIHRoZSBibG9jayBpcyBlbXB0eSwgZmlsbCBpbiB0aGUgc3RhdGUgc3RydWN0dXJlIGFuZCByZXR1cm4gMi4KKyAqIElmIGl0IGNhbiBiZSBjb2xsYXBzZWQsIGZpbGwgaW4gdGhlIHN0YXRlIHN0cnVjdHVyZSBhbmQgcmV0dXJuIDEuCisgKiBJZiBub3RoaW5nIGNhbiBiZSBkb25lLCByZXR1cm4gMC4KKyAqCisgKiBHUk9UOiBhbGxvdyBmb3IgSU5DT01QTEVURSBlbnRyaWVzIGluIGNhbGN1bGF0aW9uLgorICovCitpbnQKK3hmc19hdHRyX2xlYWZfdG9vc21hbGwoeGZzX2RhX3N0YXRlX3QgKnN0YXRlLCBpbnQgKmFjdGlvbikKK3sKKwl4ZnNfYXR0cl9sZWFmYmxvY2tfdCAqbGVhZjsKKwl4ZnNfZGFfc3RhdGVfYmxrX3QgKmJsazsKKwl4ZnNfZGFfYmxraW5mb190ICppbmZvOworCWludCBjb3VudCwgYnl0ZXMsIGZvcndhcmQsIGVycm9yLCByZXR2YWwsIGk7CisJeGZzX2RhYmxrX3QgYmxrbm87CisJeGZzX2RhYnVmX3QgKmJwOworCisJLyoKKwkgKiBDaGVjayBmb3IgdGhlIGRlZ2VuZXJhdGUgY2FzZSBvZiB0aGUgYmxvY2sgYmVpbmcgb3ZlciA1MCUgZnVsbC4KKwkgKiBJZiBzbywgaXQncyBub3Qgd29ydGggZXZlbiBsb29raW5nIHRvIHNlZSBpZiB3ZSBtaWdodCBiZSBhYmxlCisJICogdG8gY29hbGVzY2Ugd2l0aCBhIHNpYmxpbmcuCisJICovCisJYmxrID0gJnN0YXRlLT5wYXRoLmJsa1sgc3RhdGUtPnBhdGguYWN0aXZlLTEgXTsKKwlpbmZvID0gYmxrLT5icC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChpbmZvLT5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKwlsZWFmID0gKHhmc19hdHRyX2xlYWZibG9ja190ICopaW5mbzsKKwljb3VudCA9IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOworCWJ5dGVzID0gc2l6ZW9mKHhmc19hdHRyX2xlYWZfaGRyX3QpICsKKwkJY291bnQgKiBzaXplb2YoeGZzX2F0dHJfbGVhZl9lbnRyeV90KSArCisJCUlOVF9HRVQobGVhZi0+aGRyLnVzZWRieXRlcywgQVJDSF9DT05WRVJUKTsKKwlpZiAoYnl0ZXMgPiAoc3RhdGUtPmJsb2Nrc2l6ZSA+PiAxKSkgeworCQkqYWN0aW9uID0gMDsJLyogYmxrIG92ZXIgNTAlLCBkb24ndCB0cnkgdG8gam9pbiAqLworCQlyZXR1cm4oMCk7CisJfQorCisJLyoKKwkgKiBDaGVjayBmb3IgdGhlIGRlZ2VuZXJhdGUgY2FzZSBvZiB0aGUgYmxvY2sgYmVpbmcgZW1wdHkuCisJICogSWYgdGhlIGJsb2NrIGlzIGVtcHR5LCB3ZSdsbCBzaW1wbHkgZGVsZXRlIGl0LCBubyBuZWVkIHRvCisJICogY29hbGVzY2UgaXQgd2l0aCBhIHNpYmxpbmcgYmxvY2suICBXZSBjaG9vc2UgKGFyaWJ0cmFyaWx5KQorCSAqIHRvIG1lcmdlIHdpdGggdGhlIGZvcndhcmQgYmxvY2sgdW5sZXNzIGl0IGlzIE5VTEwuCisJICovCisJaWYgKGNvdW50ID09IDApIHsKKwkJLyoKKwkJICogTWFrZSBhbHRwYXRoIHBvaW50IHRvIHRoZSBibG9jayB3ZSB3YW50IHRvIGtlZXAgYW5kCisJCSAqIHBhdGggcG9pbnQgdG8gdGhlIGJsb2NrIHdlIHdhbnQgdG8gZHJvcCAodGhpcyBvbmUpLgorCQkgKi8KKwkJZm9yd2FyZCA9IGluZm8tPmZvcnc7CisJCW1lbWNweSgmc3RhdGUtPmFsdHBhdGgsICZzdGF0ZS0+cGF0aCwgc2l6ZW9mKHN0YXRlLT5wYXRoKSk7CisJCWVycm9yID0geGZzX2RhX3BhdGhfc2hpZnQoc3RhdGUsICZzdGF0ZS0+YWx0cGF0aCwgZm9yd2FyZCwKKwkJCQkJCSAwLCAmcmV0dmFsKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuKGVycm9yKTsKKwkJaWYgKHJldHZhbCkgeworCQkJKmFjdGlvbiA9IDA7CisJCX0gZWxzZSB7CisJCQkqYWN0aW9uID0gMjsKKwkJfQorCQlyZXR1cm4oMCk7CisJfQorCisJLyoKKwkgKiBFeGFtaW5lIGVhY2ggc2libGluZyBibG9jayB0byBzZWUgaWYgd2UgY2FuIGNvYWxlc2NlIHdpdGgKKwkgKiBhdCBsZWFzdCAyNSUgZnJlZSBzcGFjZSB0byBzcGFyZS4gIFdlIG5lZWQgdG8gZmlndXJlIG91dAorCSAqIHdoZXRoZXIgdG8gbWVyZ2Ugd2l0aCB0aGUgZm9yd2FyZCBvciB0aGUgYmFja3dhcmQgYmxvY2suCisJICogV2UgcHJlZmVyIGNvYWxlc2Npbmcgd2l0aCB0aGUgbG93ZXIgbnVtYmVyZWQgc2libGluZyBzbyBhcworCSAqIHRvIHNocmluayBhbiBhdHRyaWJ1dGUgbGlzdCBvdmVyIHRpbWUuCisJICovCisJLyogc3RhcnQgd2l0aCBzbWFsbGVyIGJsayBudW0gKi8KKwlmb3J3YXJkID0gKElOVF9HRVQoaW5mby0+Zm9ydywgQVJDSF9DT05WRVJUKQorCQkJCQk8IElOVF9HRVQoaW5mby0+YmFjaywgQVJDSF9DT05WRVJUKSk7CisJZm9yIChpID0gMDsgaSA8IDI7IGZvcndhcmQgPSAhZm9yd2FyZCwgaSsrKSB7CisJCWlmIChmb3J3YXJkKQorCQkJYmxrbm8gPSBJTlRfR0VUKGluZm8tPmZvcncsIEFSQ0hfQ09OVkVSVCk7CisJCWVsc2UKKwkJCWJsa25vID0gSU5UX0dFVChpbmZvLT5iYWNrLCBBUkNIX0NPTlZFUlQpOworCQlpZiAoYmxrbm8gPT0gMCkKKwkJCWNvbnRpbnVlOworCQllcnJvciA9IHhmc19kYV9yZWFkX2J1ZihzdGF0ZS0+YXJncy0+dHJhbnMsIHN0YXRlLT5hcmdzLT5kcCwKKwkJCQkJYmxrbm8sIC0xLCAmYnAsIFhGU19BVFRSX0ZPUkspOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4oZXJyb3IpOworCQlBU1NFUlQoYnAgIT0gTlVMTCk7CisKKwkJbGVhZiA9ICh4ZnNfYXR0cl9sZWFmYmxvY2tfdCAqKWluZm87CisJCWNvdW50ICA9IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOworCQlieXRlcyAgPSBzdGF0ZS0+YmxvY2tzaXplIC0gKHN0YXRlLT5ibG9ja3NpemU+PjIpOworCQlieXRlcyAtPSBJTlRfR0VUKGxlYWYtPmhkci51c2VkYnl0ZXMsIEFSQ0hfQ09OVkVSVCk7CisJCWxlYWYgPSBicC0+ZGF0YTsKKwkJQVNTRVJUKElOVF9HRVQobGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCT09IFhGU19BVFRSX0xFQUZfTUFHSUMpOworCQljb3VudCArPSBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKTsKKwkJYnl0ZXMgLT0gSU5UX0dFVChsZWFmLT5oZHIudXNlZGJ5dGVzLCBBUkNIX0NPTlZFUlQpOworCQlieXRlcyAtPSBjb3VudCAqIHNpemVvZih4ZnNfYXR0cl9sZWFmX2VudHJ5X3QpOworCQlieXRlcyAtPSBzaXplb2YoeGZzX2F0dHJfbGVhZl9oZHJfdCk7CisJCXhmc19kYV9icmVsc2Uoc3RhdGUtPmFyZ3MtPnRyYW5zLCBicCk7CisJCWlmIChieXRlcyA+PSAwKQorCQkJYnJlYWs7CS8qIGZpdHMgd2l0aCBhdCBsZWFzdCAyNSUgdG8gc3BhcmUgKi8KKwl9CisJaWYgKGkgPj0gMikgeworCQkqYWN0aW9uID0gMDsKKwkJcmV0dXJuKDApOworCX0KKworCS8qCisJICogTWFrZSBhbHRwYXRoIHBvaW50IHRvIHRoZSBibG9jayB3ZSB3YW50IHRvIGtlZXAgKHRoZSBsb3dlcgorCSAqIG51bWJlcmVkIGJsb2NrKSBhbmQgcGF0aCBwb2ludCB0byB0aGUgYmxvY2sgd2Ugd2FudCB0byBkcm9wLgorCSAqLworCW1lbWNweSgmc3RhdGUtPmFsdHBhdGgsICZzdGF0ZS0+cGF0aCwgc2l6ZW9mKHN0YXRlLT5wYXRoKSk7CisJaWYgKGJsa25vIDwgYmxrLT5ibGtubykgeworCQllcnJvciA9IHhmc19kYV9wYXRoX3NoaWZ0KHN0YXRlLCAmc3RhdGUtPmFsdHBhdGgsIGZvcndhcmQsCisJCQkJCQkgMCwgJnJldHZhbCk7CisJfSBlbHNlIHsKKwkJZXJyb3IgPSB4ZnNfZGFfcGF0aF9zaGlmdChzdGF0ZSwgJnN0YXRlLT5wYXRoLCBmb3J3YXJkLAorCQkJCQkJIDAsICZyZXR2YWwpOworCX0KKwlpZiAoZXJyb3IpCisJCXJldHVybihlcnJvcik7CisJaWYgKHJldHZhbCkgeworCQkqYWN0aW9uID0gMDsKKwl9IGVsc2UgeworCQkqYWN0aW9uID0gMTsKKwl9CisJcmV0dXJuKDApOworfQorCisvKgorICogUmVtb3ZlIGEgbmFtZSBmcm9tIHRoZSBsZWFmIGF0dHJpYnV0ZSBsaXN0IHN0cnVjdHVyZS4KKyAqCisgKiBSZXR1cm4gMSBpZiBsZWFmIGlzIGxlc3MgdGhhbiAzNyUgZnVsbCwgMCBpZiA+PSAzNyUgZnVsbC4KKyAqIElmIHR3byBsZWF2ZXMgYXJlIDM3JSBmdWxsLCB3aGVuIGNvbWJpbmVkIHRoZXkgd2lsbCBsZWF2ZSAyNSUgZnJlZS4KKyAqLworaW50Cit4ZnNfYXR0cl9sZWFmX3JlbW92ZSh4ZnNfZGFidWZfdCAqYnAsIHhmc19kYV9hcmdzX3QgKmFyZ3MpCit7CisJeGZzX2F0dHJfbGVhZmJsb2NrX3QgKmxlYWY7CisJeGZzX2F0dHJfbGVhZl9oZHJfdCAqaGRyOworCXhmc19hdHRyX2xlYWZfbWFwX3QgKm1hcDsKKwl4ZnNfYXR0cl9sZWFmX2VudHJ5X3QgKmVudHJ5OworCWludCBiZWZvcmUsIGFmdGVyLCBzbWFsbGVzdCwgZW50c2l6ZTsKKwlpbnQgdGFibGVzaXplLCB0bXAsIGk7CisJeGZzX21vdW50X3QgKm1wOworCisJbGVhZiA9IGJwLT5kYXRhOworCUFTU0VSVChJTlRfR0VUKGxlYWYtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpCisJCQkJCQk9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKwloZHIgPSAmbGVhZi0+aGRyOworCW1wID0gYXJncy0+dHJhbnMtPnRfbW91bnRwOworCUFTU0VSVCgoSU5UX0dFVChoZHItPmNvdW50LCBBUkNIX0NPTlZFUlQpID4gMCkKKwkJJiYgKElOVF9HRVQoaGRyLT5jb3VudCwgQVJDSF9DT05WRVJUKSA8IChYRlNfTEJTSVpFKG1wKS84KSkpOworCUFTU0VSVCgoYXJncy0+aW5kZXggPj0gMCkKKwkJJiYgKGFyZ3MtPmluZGV4IDwgSU5UX0dFVChoZHItPmNvdW50LCBBUkNIX0NPTlZFUlQpKSk7CisJQVNTRVJUKElOVF9HRVQoaGRyLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCkKKwkJCQk+PSAoKElOVF9HRVQoaGRyLT5jb3VudCwgQVJDSF9DT05WRVJUKQorCQkJCQkqIHNpemVvZigqZW50cnkpKStzaXplb2YoKmhkcikpKTsKKwllbnRyeSA9ICZsZWFmLT5lbnRyaWVzW2FyZ3MtPmluZGV4XTsKKwlBU1NFUlQoSU5UX0dFVChlbnRyeS0+bmFtZWlkeCwgQVJDSF9DT05WRVJUKQorCQkJCT49IElOVF9HRVQoaGRyLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCkpOworCUFTU0VSVChJTlRfR0VUKGVudHJ5LT5uYW1laWR4LCBBUkNIX0NPTlZFUlQpIDwgWEZTX0xCU0laRShtcCkpOworCisJLyoKKwkgKiBTY2FuIHRocm91Z2ggZnJlZSByZWdpb24gdGFibGU6CisJICogICAgY2hlY2sgZm9yIGFkamFjZW5jeSBvZiBmcmVlJ2QgZW50cnkgd2l0aCBhbiBleGlzdGluZyBvbmUsCisJICogICAgZmluZCBzbWFsbGVzdCBmcmVlIHJlZ2lvbiBpbiBjYXNlIHdlIG5lZWQgdG8gcmVwbGFjZSBpdCwKKwkgKiAgICBhZGp1c3QgYW55IG1hcCB0aGF0IGJvcmRlcnMgdGhlIGVudHJ5IHRhYmxlLAorCSAqLworCXRhYmxlc2l6ZSA9IElOVF9HRVQoaGRyLT5jb3VudCwgQVJDSF9DT05WRVJUKQorCQkJCQkqIHNpemVvZih4ZnNfYXR0cl9sZWFmX2VudHJ5X3QpCisJCQkJCSsgc2l6ZW9mKHhmc19hdHRyX2xlYWZfaGRyX3QpOworCW1hcCA9ICZoZHItPmZyZWVtYXBbMF07CisJdG1wID0gSU5UX0dFVChtYXAtPnNpemUsIEFSQ0hfQ09OVkVSVCk7CisJYmVmb3JlID0gYWZ0ZXIgPSAtMTsKKwlzbWFsbGVzdCA9IFhGU19BVFRSX0xFQUZfTUFQU0laRSAtIDE7CisJZW50c2l6ZSA9IHhmc19hdHRyX2xlYWZfZW50c2l6ZShsZWFmLCBhcmdzLT5pbmRleCk7CisJZm9yIChpID0gMDsgaSA8IFhGU19BVFRSX0xFQUZfTUFQU0laRTsgbWFwKyssIGkrKykgeworCQlBU1NFUlQoSU5UX0dFVChtYXAtPmJhc2UsIEFSQ0hfQ09OVkVSVCkgPCBYRlNfTEJTSVpFKG1wKSk7CisJCUFTU0VSVChJTlRfR0VUKG1hcC0+c2l6ZSwgQVJDSF9DT05WRVJUKSA8IFhGU19MQlNJWkUobXApKTsKKwkJaWYgKElOVF9HRVQobWFwLT5iYXNlLCBBUkNIX0NPTlZFUlQpID09IHRhYmxlc2l6ZSkgeworCQkJSU5UX01PRChtYXAtPmJhc2UsIEFSQ0hfQ09OVkVSVCwKKwkJCQkJLXNpemVvZih4ZnNfYXR0cl9sZWFmX2VudHJ5X3QpKTsKKwkJCUlOVF9NT0QobWFwLT5zaXplLCBBUkNIX0NPTlZFUlQsCisJCQkJCXNpemVvZih4ZnNfYXR0cl9sZWFmX2VudHJ5X3QpKTsKKwkJfQorCisJCWlmICgoSU5UX0dFVChtYXAtPmJhc2UsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJKyBJTlRfR0VUKG1hcC0+c2l6ZSwgQVJDSF9DT05WRVJUKSkKKwkJCQk9PSBJTlRfR0VUKGVudHJ5LT5uYW1laWR4LCBBUkNIX0NPTlZFUlQpKSB7CisJCQliZWZvcmUgPSBpOworCQl9IGVsc2UgaWYgKElOVF9HRVQobWFwLT5iYXNlLCBBUkNIX0NPTlZFUlQpCisJCQk9PSAoSU5UX0dFVChlbnRyeS0+bmFtZWlkeCwgQVJDSF9DT05WRVJUKSArIGVudHNpemUpKSB7CisJCQlhZnRlciA9IGk7CisJCX0gZWxzZSBpZiAoSU5UX0dFVChtYXAtPnNpemUsIEFSQ0hfQ09OVkVSVCkgPCB0bXApIHsKKwkJCXRtcCA9IElOVF9HRVQobWFwLT5zaXplLCBBUkNIX0NPTlZFUlQpOworCQkJc21hbGxlc3QgPSBpOworCQl9CisJfQorCisJLyoKKwkgKiBDb2FsZXNjZSBhZGphY2VudCBmcmVlbWFwIHJlZ2lvbnMsCisJICogb3IgcmVwbGFjZSB0aGUgc21hbGxlc3QgcmVnaW9uLgorCSAqLworCWlmICgoYmVmb3JlID49IDApIHx8IChhZnRlciA+PSAwKSkgeworCQlpZiAoKGJlZm9yZSA+PSAwKSAmJiAoYWZ0ZXIgPj0gMCkpIHsKKwkJCW1hcCA9ICZoZHItPmZyZWVtYXBbYmVmb3JlXTsKKwkJCUlOVF9NT0QobWFwLT5zaXplLCBBUkNIX0NPTlZFUlQsIGVudHNpemUpOworCQkJSU5UX01PRChtYXAtPnNpemUsIEFSQ0hfQ09OVkVSVCwKKwkJCQlJTlRfR0VUKGhkci0+ZnJlZW1hcFthZnRlcl0uc2l6ZSwKKwkJCQkJCQlBUkNIX0NPTlZFUlQpKTsKKwkJCWhkci0+ZnJlZW1hcFthZnRlcl0uYmFzZSA9IDA7CisJCQloZHItPmZyZWVtYXBbYWZ0ZXJdLnNpemUgPSAwOworCQl9IGVsc2UgaWYgKGJlZm9yZSA+PSAwKSB7CisJCQltYXAgPSAmaGRyLT5mcmVlbWFwW2JlZm9yZV07CisJCQlJTlRfTU9EKG1hcC0+c2l6ZSwgQVJDSF9DT05WRVJULCBlbnRzaXplKTsKKwkJfSBlbHNlIHsKKwkJCW1hcCA9ICZoZHItPmZyZWVtYXBbYWZ0ZXJdOworCQkJLyogYm90aCBvbi1kaXNrLCBkb24ndCBlbmRpYW4gZmxpcCB0d2ljZSAqLworCQkJbWFwLT5iYXNlID0gZW50cnktPm5hbWVpZHg7CisJCQlJTlRfTU9EKG1hcC0+c2l6ZSwgQVJDSF9DT05WRVJULCBlbnRzaXplKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIFJlcGxhY2Ugc21hbGxlc3QgcmVnaW9uIChpZiBpdCBpcyBzbWFsbGVyIHRoYW4gZnJlZSdkIGVudHJ5KQorCQkgKi8KKwkJbWFwID0gJmhkci0+ZnJlZW1hcFtzbWFsbGVzdF07CisJCWlmIChJTlRfR0VUKG1hcC0+c2l6ZSwgQVJDSF9DT05WRVJUKSA8IGVudHNpemUpIHsKKwkJCUlOVF9TRVQobWFwLT5iYXNlLCBBUkNIX0NPTlZFUlQsCisJCQkJCUlOVF9HRVQoZW50cnktPm5hbWVpZHgsIEFSQ0hfQ09OVkVSVCkpOworCQkJSU5UX1NFVChtYXAtPnNpemUsIEFSQ0hfQ09OVkVSVCwgZW50c2l6ZSk7CisJCX0KKwl9CisKKwkvKgorCSAqIERpZCB3ZSByZW1vdmUgdGhlIGZpcnN0IGVudHJ5PworCSAqLworCWlmIChJTlRfR0VUKGVudHJ5LT5uYW1laWR4LCBBUkNIX0NPTlZFUlQpCisJCQkJPT0gSU5UX0dFVChoZHItPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJUKSkKKwkJc21hbGxlc3QgPSAxOworCWVsc2UKKwkJc21hbGxlc3QgPSAwOworCisJLyoKKwkgKiBDb21wcmVzcyB0aGUgcmVtYWluaW5nIGVudHJpZXMgYW5kIHplcm8gb3V0IHRoZSByZW1vdmVkIHN0dWZmLgorCSAqLworCW1lbXNldChYRlNfQVRUUl9MRUFGX05BTUUobGVhZiwgYXJncy0+aW5kZXgpLCAwLCBlbnRzaXplKTsKKwlJTlRfTU9EKGhkci0+dXNlZGJ5dGVzLCBBUkNIX0NPTlZFUlQsIC1lbnRzaXplKTsKKwl4ZnNfZGFfbG9nX2J1ZihhcmdzLT50cmFucywgYnAsCisJICAgICBYRlNfREFfTE9HUkFOR0UobGVhZiwgWEZTX0FUVFJfTEVBRl9OQU1FKGxlYWYsIGFyZ3MtPmluZGV4KSwKKwkJCQkgICBlbnRzaXplKSk7CisKKwl0bXAgPSAoSU5UX0dFVChoZHItPmNvdW50LCBBUkNIX0NPTlZFUlQpIC0gYXJncy0+aW5kZXgpCisJCQkJCSogc2l6ZW9mKHhmc19hdHRyX2xlYWZfZW50cnlfdCk7CisJbWVtbW92ZSgoY2hhciAqKWVudHJ5LCAoY2hhciAqKShlbnRyeSsxKSwgdG1wKTsKKwlJTlRfTU9EKGhkci0+Y291bnQsIEFSQ0hfQ09OVkVSVCwgLTEpOworCXhmc19kYV9sb2dfYnVmKGFyZ3MtPnRyYW5zLCBicCwKKwkgICAgWEZTX0RBX0xPR1JBTkdFKGxlYWYsIGVudHJ5LCB0bXAgKyBzaXplb2YoKmVudHJ5KSkpOworCWVudHJ5ID0gJmxlYWYtPmVudHJpZXNbSU5UX0dFVChoZHItPmNvdW50LCBBUkNIX0NPTlZFUlQpXTsKKwltZW1zZXQoKGNoYXIgKillbnRyeSwgMCwgc2l6ZW9mKHhmc19hdHRyX2xlYWZfZW50cnlfdCkpOworCisJLyoKKwkgKiBJZiB3ZSByZW1vdmVkIHRoZSBmaXJzdCBlbnRyeSwgcmUtZmluZCB0aGUgZmlyc3QgdXNlZCBieXRlCisJICogaW4gdGhlIG5hbWUgYXJlYS4gIE5vdGUgdGhhdCBpZiB0aGUgZW50cnkgd2FzIHRoZSAiZmlyc3R1c2VkIiwKKwkgKiB0aGVuIHdlIGRvbid0IGhhdmUgYSAiaG9sZSIgaW4gb3VyIGJsb2NrIHJlc3VsdGluZyBmcm9tCisJICogcmVtb3ZpbmcgdGhlIG5hbWUuCisJICovCisJaWYgKHNtYWxsZXN0KSB7CisJCXRtcCA9IFhGU19MQlNJWkUobXApOworCQllbnRyeSA9ICZsZWFmLT5lbnRyaWVzWzBdOworCQlmb3IgKGkgPSBJTlRfR0VUKGhkci0+Y291bnQsIEFSQ0hfQ09OVkVSVCktMTsKKwkJCQkJCWkgPj0gMDsgZW50cnkrKywgaS0tKSB7CisJCQlBU1NFUlQoSU5UX0dFVChlbnRyeS0+bmFtZWlkeCwgQVJDSF9DT05WRVJUKQorCQkJCT49IElOVF9HRVQoaGRyLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCkpOworCQkJQVNTRVJUKElOVF9HRVQoZW50cnktPm5hbWVpZHgsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCQk8IFhGU19MQlNJWkUobXApKTsKKwkJCWlmIChJTlRfR0VUKGVudHJ5LT5uYW1laWR4LCBBUkNIX0NPTlZFUlQpIDwgdG1wKQorCQkJCXRtcCA9IElOVF9HRVQoZW50cnktPm5hbWVpZHgsIEFSQ0hfQ09OVkVSVCk7CisJCX0KKwkJSU5UX1NFVChoZHItPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJULCB0bXApOworCQlpZiAoIWhkci0+Zmlyc3R1c2VkKSB7CisJCQlJTlRfU0VUKGhkci0+Zmlyc3R1c2VkLCBBUkNIX0NPTlZFUlQsCisJCQkJCXRtcCAtIFhGU19BVFRSX0xFQUZfTkFNRV9BTElHTik7CisJCX0KKwl9IGVsc2UgeworCQloZHItPmhvbGVzID0gMTsJCS8qIG1hcmsgYXMgbmVlZGluZyBjb21wYWN0aW9uICovCisJfQorCXhmc19kYV9sb2dfYnVmKGFyZ3MtPnRyYW5zLCBicCwKKwkJCSAgWEZTX0RBX0xPR1JBTkdFKGxlYWYsIGhkciwgc2l6ZW9mKCpoZHIpKSk7CisKKwkvKgorCSAqIENoZWNrIGlmIGxlYWYgaXMgbGVzcyB0aGFuIDUwJSBmdWxsLCBjYWxsZXIgbWF5IHdhbnQgdG8KKwkgKiAiam9pbiIgdGhlIGxlYWYgd2l0aCBhIHNpYmxpbmcgaWYgc28uCisJICovCisJdG1wICA9IHNpemVvZih4ZnNfYXR0cl9sZWFmX2hkcl90KTsKKwl0bXAgKz0gSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJKiBzaXplb2YoeGZzX2F0dHJfbGVhZl9lbnRyeV90KTsKKwl0bXAgKz0gSU5UX0dFVChsZWFmLT5oZHIudXNlZGJ5dGVzLCBBUkNIX0NPTlZFUlQpOworCXJldHVybih0bXAgPCBtcC0+bV9hdHRyX21hZ2ljcGN0KTsgLyogbGVhZiBpcyA8IDM3JSBmdWxsICovCit9CisKKy8qCisgKiBNb3ZlIGFsbCB0aGUgYXR0cmlidXRlIGxpc3QgZW50cmllcyBmcm9tIGRyb3BfbGVhZiBpbnRvIHNhdmVfbGVhZi4KKyAqLwordm9pZAoreGZzX2F0dHJfbGVhZl91bmJhbGFuY2UoeGZzX2RhX3N0YXRlX3QgKnN0YXRlLCB4ZnNfZGFfc3RhdGVfYmxrX3QgKmRyb3BfYmxrLAorCQkJCSAgICAgICB4ZnNfZGFfc3RhdGVfYmxrX3QgKnNhdmVfYmxrKQoreworCXhmc19hdHRyX2xlYWZibG9ja190ICpkcm9wX2xlYWYsICpzYXZlX2xlYWYsICp0bXBfbGVhZjsKKwl4ZnNfYXR0cl9sZWFmX2hkcl90ICpkcm9wX2hkciwgKnNhdmVfaGRyLCAqdG1wX2hkcjsKKwl4ZnNfbW91bnRfdCAqbXA7CisJY2hhciAqdG1wYnVmZmVyOworCisJLyoKKwkgKiBTZXQgdXAgZW52aXJvbm1lbnQuCisJICovCisJbXAgPSBzdGF0ZS0+bXA7CisJQVNTRVJUKGRyb3BfYmxrLT5tYWdpYyA9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKwlBU1NFUlQoc2F2ZV9ibGstPm1hZ2ljID09IFhGU19BVFRSX0xFQUZfTUFHSUMpOworCWRyb3BfbGVhZiA9IGRyb3BfYmxrLT5icC0+ZGF0YTsKKwlzYXZlX2xlYWYgPSBzYXZlX2Jsay0+YnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQoZHJvcF9sZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKQorCQkJCQkJPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisJQVNTRVJUKElOVF9HRVQoc2F2ZV9sZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKQorCQkJCQkJPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisJZHJvcF9oZHIgPSAmZHJvcF9sZWFmLT5oZHI7CisJc2F2ZV9oZHIgPSAmc2F2ZV9sZWFmLT5oZHI7CisKKwkvKgorCSAqIFNhdmUgbGFzdCBoYXNodmFsIGZyb20gZHlpbmcgYmxvY2sgZm9yIGxhdGVyIEJ0cmVlIGZpeHVwLgorCSAqLworCWRyb3BfYmxrLT5oYXNodmFsID0KKwkJSU5UX0dFVChkcm9wX2xlYWYtPmVudHJpZXNbSU5UX0dFVChkcm9wX2xlYWYtPmhkci5jb3VudCwKKwkJCQkJCUFSQ0hfQ09OVkVSVCktMV0uaGFzaHZhbCwKKwkJCQkJCQkJQVJDSF9DT05WRVJUKTsKKworCS8qCisJICogQ2hlY2sgaWYgd2UgbmVlZCBhIHRlbXAgYnVmZmVyLCBvciBjYW4gd2UgZG8gaXQgaW4gcGxhY2UuCisJICogTm90ZSB0aGF0IHdlIGRvbid0IGNoZWNrICJsZWFmIiBmb3IgaG9sZXMgYmVjYXVzZSB3ZSB3aWxsCisJICogYWx3YXlzIGJlIGRyb3BwaW5nIGl0LCB0b29zbWFsbCgpIGRlY2lkZWQgdGhhdCBmb3IgdXMgYWxyZWFkeS4KKwkgKi8KKwlpZiAoc2F2ZV9oZHItPmhvbGVzID09IDApIHsKKwkJLyoKKwkJICogZGVzdCBsZWFmIGhhcyBubyBob2xlcywgc28gd2UgYWRkIHRoZXJlLiAgTWF5IG5lZWQKKwkJICogdG8gbWFrZSBzb21lIHJvb20gaW4gdGhlIGVudHJ5IGFycmF5LgorCQkgKi8KKwkJaWYgKHhmc19hdHRyX2xlYWZfb3JkZXIoc2F2ZV9ibGstPmJwLCBkcm9wX2Jsay0+YnApKSB7CisJCQl4ZnNfYXR0cl9sZWFmX21vdmVlbnRzKGRyb3BfbGVhZiwgMCwgc2F2ZV9sZWFmLCAwLAorCQkJICAgICAoaW50KUlOVF9HRVQoZHJvcF9oZHItPmNvdW50LCBBUkNIX0NPTlZFUlQpLCBtcCk7CisJCX0gZWxzZSB7CisJCQl4ZnNfYXR0cl9sZWFmX21vdmVlbnRzKGRyb3BfbGVhZiwgMCwgc2F2ZV9sZWFmLAorCQkJCSAgSU5UX0dFVChzYXZlX2hkci0+Y291bnQsIEFSQ0hfQ09OVkVSVCksCisJCQkJICAoaW50KUlOVF9HRVQoZHJvcF9oZHItPmNvdW50LCBBUkNIX0NPTlZFUlQpLAorCQkJCSAgbXApOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogRGVzdGluYXRpb24gaGFzIGhvbGVzLCBzbyB3ZSBtYWtlIGEgdGVtcG9yYXJ5IGNvcHkKKwkJICogb2YgdGhlIGxlYWYgYW5kIGFkZCB0aGVtIGJvdGggdG8gdGhhdC4KKwkJICovCisJCXRtcGJ1ZmZlciA9IGttZW1fYWxsb2Moc3RhdGUtPmJsb2Nrc2l6ZSwgS01fU0xFRVApOworCQlBU1NFUlQodG1wYnVmZmVyICE9IE5VTEwpOworCQltZW1zZXQodG1wYnVmZmVyLCAwLCBzdGF0ZS0+YmxvY2tzaXplKTsKKwkJdG1wX2xlYWYgPSAoeGZzX2F0dHJfbGVhZmJsb2NrX3QgKil0bXBidWZmZXI7CisJCXRtcF9oZHIgPSAmdG1wX2xlYWYtPmhkcjsKKwkJdG1wX2hkci0+aW5mbyA9IHNhdmVfaGRyLT5pbmZvOwkvKiBzdHJ1Y3QgY29weSAqLworCQl0bXBfaGRyLT5jb3VudCA9IDA7CisJCUlOVF9TRVQodG1wX2hkci0+Zmlyc3R1c2VkLCBBUkNIX0NPTlZFUlQsIHN0YXRlLT5ibG9ja3NpemUpOworCQlpZiAoIXRtcF9oZHItPmZpcnN0dXNlZCkgeworCQkJSU5UX1NFVCh0bXBfaGRyLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCwKKwkJCQlzdGF0ZS0+YmxvY2tzaXplIC0gWEZTX0FUVFJfTEVBRl9OQU1FX0FMSUdOKTsKKwkJfQorCQl0bXBfaGRyLT51c2VkYnl0ZXMgPSAwOworCQlpZiAoeGZzX2F0dHJfbGVhZl9vcmRlcihzYXZlX2Jsay0+YnAsIGRyb3BfYmxrLT5icCkpIHsKKwkJCXhmc19hdHRyX2xlYWZfbW92ZWVudHMoZHJvcF9sZWFmLCAwLCB0bXBfbGVhZiwgMCwKKwkJCQkoaW50KUlOVF9HRVQoZHJvcF9oZHItPmNvdW50LCBBUkNIX0NPTlZFUlQpLAorCQkJCW1wKTsKKwkJCXhmc19hdHRyX2xlYWZfbW92ZWVudHMoc2F2ZV9sZWFmLCAwLCB0bXBfbGVhZiwKKwkJCQkgIElOVF9HRVQodG1wX2xlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSwKKwkJCQkgKGludClJTlRfR0VUKHNhdmVfaGRyLT5jb3VudCwgQVJDSF9DT05WRVJUKSwKKwkJCQkgbXApOworCQl9IGVsc2UgeworCQkJeGZzX2F0dHJfbGVhZl9tb3ZlZW50cyhzYXZlX2xlYWYsIDAsIHRtcF9sZWFmLCAwLAorCQkJCShpbnQpSU5UX0dFVChzYXZlX2hkci0+Y291bnQsIEFSQ0hfQ09OVkVSVCksCisJCQkJbXApOworCQkJeGZzX2F0dHJfbGVhZl9tb3ZlZW50cyhkcm9wX2xlYWYsIDAsIHRtcF9sZWFmLAorCQkJCUlOVF9HRVQodG1wX2xlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSwKKwkJCQkoaW50KUlOVF9HRVQoZHJvcF9oZHItPmNvdW50LCBBUkNIX0NPTlZFUlQpLAorCQkJCW1wKTsKKwkJfQorCQltZW1jcHkoKGNoYXIgKilzYXZlX2xlYWYsIChjaGFyICopdG1wX2xlYWYsIHN0YXRlLT5ibG9ja3NpemUpOworCQlrbWVtX2ZyZWUodG1wYnVmZmVyLCBzdGF0ZS0+YmxvY2tzaXplKTsKKwl9CisKKwl4ZnNfZGFfbG9nX2J1ZihzdGF0ZS0+YXJncy0+dHJhbnMsIHNhdmVfYmxrLT5icCwgMCwKKwkJCQkJICAgc3RhdGUtPmJsb2Nrc2l6ZSAtIDEpOworCisJLyoKKwkgKiBDb3B5IG91dCBsYXN0IGhhc2h2YWwgaW4gZWFjaCBibG9jayBmb3IgQi10cmVlIGNvZGUuCisJICovCisJc2F2ZV9ibGstPmhhc2h2YWwgPQorCQlJTlRfR0VUKHNhdmVfbGVhZi0+ZW50cmllc1tJTlRfR0VUKHNhdmVfbGVhZi0+aGRyLmNvdW50LAorCQkJCQkJQVJDSF9DT05WRVJUKS0xXS5oYXNodmFsLAorCQkJCQkJCQlBUkNIX0NPTlZFUlQpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUm91dGluZXMgdXNlZCBmb3IgZmluZGluZyB0aGluZ3MgaW4gdGhlIEJ0cmVlLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICogTG9vayB1cCBhIG5hbWUgaW4gYSBsZWFmIGF0dHJpYnV0ZSBsaXN0IHN0cnVjdHVyZS4KKyAqIFRoaXMgaXMgdGhlIGludGVybmFsIHJvdXRpbmUsIGl0IHVzZXMgdGhlIGNhbGxlcidzIGJ1ZmZlci4KKyAqCisgKiBOb3RlIHRoYXQgZHVwbGljYXRlIGtleXMgYXJlIGFsbG93ZWQsIGJ1dCBvbmx5IGNoZWNrIHdpdGhpbiB0aGUKKyAqIGN1cnJlbnQgbGVhZiBub2RlLiAgVGhlIEJ0cmVlIGNvZGUgbXVzdCBjaGVjayBpbiBhZGphY2VudCBsZWFmIG5vZGVzLgorICoKKyAqIFJldHVybiBpbiBhcmdzLT5pbmRleCB0aGUgaW5kZXggaW50byB0aGUgZW50cnlbXSBhcnJheSBvZiBlaXRoZXIKKyAqIHRoZSBmb3VuZCBlbnRyeSwgb3Igd2hlcmUgdGhlIGVudHJ5IHNob3VsZCBoYXZlIGJlZW4gKGluc2VydCBiZWZvcmUKKyAqIHRoYXQgZW50cnkpLgorICoKKyAqIERvbid0IGNoYW5nZSB0aGUgYXJncy0+dmFsdWUgdW5sZXNzIHdlIGZpbmQgdGhlIGF0dHJpYnV0ZS4KKyAqLworaW50Cit4ZnNfYXR0cl9sZWFmX2xvb2t1cF9pbnQoeGZzX2RhYnVmX3QgKmJwLCB4ZnNfZGFfYXJnc190ICphcmdzKQoreworCXhmc19hdHRyX2xlYWZibG9ja190ICpsZWFmOworCXhmc19hdHRyX2xlYWZfZW50cnlfdCAqZW50cnk7CisJeGZzX2F0dHJfbGVhZl9uYW1lX2xvY2FsX3QgKm5hbWVfbG9jOworCXhmc19hdHRyX2xlYWZfbmFtZV9yZW1vdGVfdCAqbmFtZV9ybXQ7CisJaW50IHByb2JlLCBzcGFuOworCXhmc19kYWhhc2hfdCBoYXNodmFsOworCisJbGVhZiA9IGJwLT5kYXRhOworCUFTU0VSVChJTlRfR0VUKGxlYWYtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpCisJCQkJCQk9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKwlBU1NFUlQoSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJPCAoWEZTX0xCU0laRShhcmdzLT5kcC0+aV9tb3VudCkvOCkpOworCisJLyoKKwkgKiBCaW5hcnkgc2VhcmNoLiAgKG5vdGU6IHNtYWxsIGJsb2NrcyB3aWxsIHNraXAgdGhpcyBsb29wKQorCSAqLworCWhhc2h2YWwgPSBhcmdzLT5oYXNodmFsOworCXByb2JlID0gc3BhbiA9IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpIC8gMjsKKwlmb3IgKGVudHJ5ID0gJmxlYWYtPmVudHJpZXNbcHJvYmVdOyBzcGFuID4gNDsKKwkJICAgZW50cnkgPSAmbGVhZi0+ZW50cmllc1twcm9iZV0pIHsKKwkJc3BhbiAvPSAyOworCQlpZiAoSU5UX0dFVChlbnRyeS0+aGFzaHZhbCwgQVJDSF9DT05WRVJUKSA8IGhhc2h2YWwpCisJCQlwcm9iZSArPSBzcGFuOworCQllbHNlIGlmIChJTlRfR0VUKGVudHJ5LT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpID4gaGFzaHZhbCkKKwkJCXByb2JlIC09IHNwYW47CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKwlBU1NFUlQoKHByb2JlID49IDApICYmIAorCSAgICAgICAoIWxlYWYtPmhkci5jb3VudAorCSAgICAgICB8fCAocHJvYmUgPCBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSkpKTsKKwlBU1NFUlQoKHNwYW4gPD0gNCkgfHwgKElOVF9HRVQoZW50cnktPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCQk9PSBoYXNodmFsKSk7CisKKwkvKgorCSAqIFNpbmNlIHdlIG1heSBoYXZlIGR1cGxpY2F0ZSBoYXNodmFsJ3MsIGZpbmQgdGhlIGZpcnN0IG1hdGNoaW5nCisJICogaGFzaHZhbCBpbiB0aGUgbGVhZi4KKwkgKi8KKwl3aGlsZSAoKHByb2JlID4gMCkgJiYgKElOVF9HRVQoZW50cnktPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCQk+PSBoYXNodmFsKSkgeworCQllbnRyeS0tOworCQlwcm9iZS0tOworCX0KKwl3aGlsZSAoKHByb2JlIDwgSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkpCisJCSYmIChJTlRfR0VUKGVudHJ5LT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpIDwgaGFzaHZhbCkpIHsKKwkJZW50cnkrKzsKKwkJcHJvYmUrKzsKKwl9CisJaWYgKChwcm9iZSA9PSBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSkKKwkJICAgIHx8IChJTlRfR0VUKGVudHJ5LT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpICE9IGhhc2h2YWwpKSB7CisJCWFyZ3MtPmluZGV4ID0gcHJvYmU7CisJCXJldHVybihYRlNfRVJST1IoRU5PQVRUUikpOworCX0KKworCS8qCisJICogRHVwbGljYXRlIGtleXMgbWF5IGJlIHByZXNlbnQsIHNvIHNlYXJjaCBhbGwgb2YgdGhlbSBmb3IgYSBtYXRjaC4KKwkgKi8KKwlmb3IgKCAgOyAocHJvYmUgPCBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSkKKwkJCSYmIChJTlRfR0VUKGVudHJ5LT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpID09IGhhc2h2YWwpOworCQkJZW50cnkrKywgcHJvYmUrKykgeworLyoKKyAqIEdST1Q6IEFkZCBjb2RlIHRvIHJlbW92ZSBpbmNvbXBsZXRlIGVudHJpZXMuCisgKi8KKwkJLyoKKwkJICogSWYgd2UgYXJlIGxvb2tpbmcgZm9yIElOQ09NUExFVEUgZW50cmllcywgc2hvdyBvbmx5IHRob3NlLgorCQkgKiBJZiB3ZSBhcmUgbG9va2luZyBmb3IgY29tcGxldGUgZW50cmllcywgc2hvdyBvbmx5IHRob3NlLgorCQkgKi8KKwkJaWYgKChhcmdzLT5mbGFncyAmIFhGU19BVFRSX0lOQ09NUExFVEUpICE9CisJCSAgICAoZW50cnktPmZsYWdzICYgWEZTX0FUVFJfSU5DT01QTEVURSkpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChlbnRyeS0+ZmxhZ3MgJiBYRlNfQVRUUl9MT0NBTCkgeworCQkJbmFtZV9sb2MgPSBYRlNfQVRUUl9MRUFGX05BTUVfTE9DQUwobGVhZiwgcHJvYmUpOworCQkJaWYgKG5hbWVfbG9jLT5uYW1lbGVuICE9IGFyZ3MtPm5hbWVsZW4pCisJCQkJY29udGludWU7CisJCQlpZiAobWVtY21wKGFyZ3MtPm5hbWUsIChjaGFyICopbmFtZV9sb2MtPm5hbWV2YWwsCisJCQkJCSAgICAgYXJncy0+bmFtZWxlbikgIT0gMCkKKwkJCQljb250aW51ZTsKKwkJCWlmICgoKGFyZ3MtPmZsYWdzICYgQVRUUl9TRUNVUkUpICE9IDApICE9CisJCQkgICAgKChlbnRyeS0+ZmxhZ3MgJiBYRlNfQVRUUl9TRUNVUkUpICE9IDApKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCgoYXJncy0+ZmxhZ3MgJiBBVFRSX1JPT1QpICE9IDApICE9CisJCQkgICAgKChlbnRyeS0+ZmxhZ3MgJiBYRlNfQVRUUl9ST09UKSAhPSAwKSkKKwkJCQljb250aW51ZTsKKwkJCWFyZ3MtPmluZGV4ID0gcHJvYmU7CisJCQlyZXR1cm4oWEZTX0VSUk9SKEVFWElTVCkpOworCQl9IGVsc2UgeworCQkJbmFtZV9ybXQgPSBYRlNfQVRUUl9MRUFGX05BTUVfUkVNT1RFKGxlYWYsIHByb2JlKTsKKwkJCWlmIChuYW1lX3JtdC0+bmFtZWxlbiAhPSBhcmdzLT5uYW1lbGVuKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKG1lbWNtcChhcmdzLT5uYW1lLCAoY2hhciAqKW5hbWVfcm10LT5uYW1lLAorCQkJCQkgICAgIGFyZ3MtPm5hbWVsZW4pICE9IDApCisJCQkJY29udGludWU7CisJCQlpZiAoKChhcmdzLT5mbGFncyAmIEFUVFJfU0VDVVJFKSAhPSAwKSAhPQorCQkJICAgICgoZW50cnktPmZsYWdzICYgWEZTX0FUVFJfU0VDVVJFKSAhPSAwKSkKKwkJCQljb250aW51ZTsKKwkJCWlmICgoKGFyZ3MtPmZsYWdzICYgQVRUUl9ST09UKSAhPSAwKSAhPQorCQkJICAgICgoZW50cnktPmZsYWdzICYgWEZTX0FUVFJfUk9PVCkgIT0gMCkpCisJCQkJY29udGludWU7CisJCQlhcmdzLT5pbmRleCA9IHByb2JlOworCQkJYXJncy0+cm10Ymxrbm8KKwkJCQkgID0gSU5UX0dFVChuYW1lX3JtdC0+dmFsdWVibGssIEFSQ0hfQ09OVkVSVCk7CisJCQlhcmdzLT5ybXRibGtjbnQgPSBYRlNfQl9UT19GU0IoYXJncy0+ZHAtPmlfbW91bnQsCisJCQkJCQkgICBJTlRfR0VUKG5hbWVfcm10LT52YWx1ZWxlbiwKKwkJCQkJCQkJQVJDSF9DT05WRVJUKSk7CisJCQlyZXR1cm4oWEZTX0VSUk9SKEVFWElTVCkpOworCQl9CisJfQorCWFyZ3MtPmluZGV4ID0gcHJvYmU7CisJcmV0dXJuKFhGU19FUlJPUihFTk9BVFRSKSk7Cit9CisKKy8qCisgKiBHZXQgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhbiBhdHRyaWJ1dGUgbmFtZSBmcm9tIGEgbGVhZiBhdHRyaWJ1dGUKKyAqIGxpc3Qgc3RydWN0dXJlLgorICovCitpbnQKK3hmc19hdHRyX2xlYWZfZ2V0dmFsdWUoeGZzX2RhYnVmX3QgKmJwLCB4ZnNfZGFfYXJnc190ICphcmdzKQoreworCWludCB2YWx1ZWxlbjsKKwl4ZnNfYXR0cl9sZWFmYmxvY2tfdCAqbGVhZjsKKwl4ZnNfYXR0cl9sZWFmX2VudHJ5X3QgKmVudHJ5OworCXhmc19hdHRyX2xlYWZfbmFtZV9sb2NhbF90ICpuYW1lX2xvYzsKKwl4ZnNfYXR0cl9sZWFmX25hbWVfcmVtb3RlX3QgKm5hbWVfcm10OworCisJbGVhZiA9IGJwLT5kYXRhOworCUFTU0VSVChJTlRfR0VUKGxlYWYtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpCisJCQkJCQk9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKwlBU1NFUlQoSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJPCAoWEZTX0xCU0laRShhcmdzLT5kcC0+aV9tb3VudCkvOCkpOworCUFTU0VSVChhcmdzLT5pbmRleCA8ICgoaW50KUlOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpKSk7CisKKwllbnRyeSA9ICZsZWFmLT5lbnRyaWVzW2FyZ3MtPmluZGV4XTsKKwlpZiAoZW50cnktPmZsYWdzICYgWEZTX0FUVFJfTE9DQUwpIHsKKwkJbmFtZV9sb2MgPSBYRlNfQVRUUl9MRUFGX05BTUVfTE9DQUwobGVhZiwgYXJncy0+aW5kZXgpOworCQlBU1NFUlQobmFtZV9sb2MtPm5hbWVsZW4gPT0gYXJncy0+bmFtZWxlbik7CisJCUFTU0VSVChtZW1jbXAoYXJncy0+bmFtZSwgbmFtZV9sb2MtPm5hbWV2YWwsIGFyZ3MtPm5hbWVsZW4pID09IDApOworCQl2YWx1ZWxlbiA9IElOVF9HRVQobmFtZV9sb2MtPnZhbHVlbGVuLCBBUkNIX0NPTlZFUlQpOworCQlpZiAoYXJncy0+ZmxhZ3MgJiBBVFRSX0tFUk5PVkFMKSB7CisJCQlhcmdzLT52YWx1ZWxlbiA9IHZhbHVlbGVuOworCQkJcmV0dXJuKDApOworCQl9CisJCWlmIChhcmdzLT52YWx1ZWxlbiA8IHZhbHVlbGVuKSB7CisJCQlhcmdzLT52YWx1ZWxlbiA9IHZhbHVlbGVuOworCQkJcmV0dXJuKFhGU19FUlJPUihFUkFOR0UpKTsKKwkJfQorCQlhcmdzLT52YWx1ZWxlbiA9IHZhbHVlbGVuOworCQltZW1jcHkoYXJncy0+dmFsdWUsICZuYW1lX2xvYy0+bmFtZXZhbFthcmdzLT5uYW1lbGVuXSwgdmFsdWVsZW4pOworCX0gZWxzZSB7CisJCW5hbWVfcm10ID0gWEZTX0FUVFJfTEVBRl9OQU1FX1JFTU9URShsZWFmLCBhcmdzLT5pbmRleCk7CisJCUFTU0VSVChuYW1lX3JtdC0+bmFtZWxlbiA9PSBhcmdzLT5uYW1lbGVuKTsKKwkJQVNTRVJUKG1lbWNtcChhcmdzLT5uYW1lLCBuYW1lX3JtdC0+bmFtZSwgYXJncy0+bmFtZWxlbikgPT0gMCk7CisJCXZhbHVlbGVuID0gSU5UX0dFVChuYW1lX3JtdC0+dmFsdWVsZW4sIEFSQ0hfQ09OVkVSVCk7CisJCWFyZ3MtPnJtdGJsa25vID0gSU5UX0dFVChuYW1lX3JtdC0+dmFsdWVibGssIEFSQ0hfQ09OVkVSVCk7CisJCWFyZ3MtPnJtdGJsa2NudCA9IFhGU19CX1RPX0ZTQihhcmdzLT5kcC0+aV9tb3VudCwgdmFsdWVsZW4pOworCQlpZiAoYXJncy0+ZmxhZ3MgJiBBVFRSX0tFUk5PVkFMKSB7CisJCQlhcmdzLT52YWx1ZWxlbiA9IHZhbHVlbGVuOworCQkJcmV0dXJuKDApOworCQl9CisJCWlmIChhcmdzLT52YWx1ZWxlbiA8IHZhbHVlbGVuKSB7CisJCQlhcmdzLT52YWx1ZWxlbiA9IHZhbHVlbGVuOworCQkJcmV0dXJuKFhGU19FUlJPUihFUkFOR0UpKTsKKwkJfQorCQlhcmdzLT52YWx1ZWxlbiA9IHZhbHVlbGVuOworCX0KKwlyZXR1cm4oMCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICogTW92ZSB0aGUgaW5kaWNhdGVkIGVudHJpZXMgZnJvbSBvbmUgbGVhZiB0byBhbm90aGVyLgorICogTk9URTogdGhpcyByb3V0aW5lIG1vZGlmaWVzIGJvdGggc291cmNlIGFuZCBkZXN0aW5hdGlvbiBsZWF2ZXMuCisgKi8KKy8qQVJHU1VTRUQqLworU1RBVElDIHZvaWQKK3hmc19hdHRyX2xlYWZfbW92ZWVudHMoeGZzX2F0dHJfbGVhZmJsb2NrX3QgKmxlYWZfcywgaW50IHN0YXJ0X3MsCisJCQl4ZnNfYXR0cl9sZWFmYmxvY2tfdCAqbGVhZl9kLCBpbnQgc3RhcnRfZCwKKwkJCWludCBjb3VudCwgeGZzX21vdW50X3QgKm1wKQoreworCXhmc19hdHRyX2xlYWZfaGRyX3QgKmhkcl9zLCAqaGRyX2Q7CisJeGZzX2F0dHJfbGVhZl9lbnRyeV90ICplbnRyeV9zLCAqZW50cnlfZDsKKwlpbnQgZGVzdGksIHRtcCwgaTsKKworCS8qCisJICogQ2hlY2sgZm9yIG5vdGhpbmcgdG8gZG8uCisJICovCisJaWYgKGNvdW50ID09IDApCisJCXJldHVybjsKKworCS8qCisJICogU2V0IHVwIGVudmlyb25tZW50LgorCSAqLworCUFTU0VSVChJTlRfR0VUKGxlYWZfcy0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCT09IFhGU19BVFRSX0xFQUZfTUFHSUMpOworCUFTU0VSVChJTlRfR0VUKGxlYWZfZC0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCT09IFhGU19BVFRSX0xFQUZfTUFHSUMpOworCWhkcl9zID0gJmxlYWZfcy0+aGRyOworCWhkcl9kID0gJmxlYWZfZC0+aGRyOworCUFTU0VSVCgoSU5UX0dFVChoZHJfcy0+Y291bnQsIEFSQ0hfQ09OVkVSVCkgPiAwKQorCQkJCSYmIChJTlRfR0VUKGhkcl9zLT5jb3VudCwgQVJDSF9DT05WRVJUKQorCQkJCQkJPCAoWEZTX0xCU0laRShtcCkvOCkpKTsKKwlBU1NFUlQoSU5UX0dFVChoZHJfcy0+Zmlyc3R1c2VkLCBBUkNIX0NPTlZFUlQpID49CisJCSgoSU5UX0dFVChoZHJfcy0+Y291bnQsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJKiBzaXplb2YoKmVudHJ5X3MpKStzaXplb2YoKmhkcl9zKSkpOworCUFTU0VSVChJTlRfR0VUKGhkcl9kLT5jb3VudCwgQVJDSF9DT05WRVJUKSA8IChYRlNfTEJTSVpFKG1wKS84KSk7CisJQVNTRVJUKElOVF9HRVQoaGRyX2QtPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJUKSA+PQorCQkoKElOVF9HRVQoaGRyX2QtPmNvdW50LCBBUkNIX0NPTlZFUlQpCisJCQkJCSogc2l6ZW9mKCplbnRyeV9kKSkrc2l6ZW9mKCpoZHJfZCkpKTsKKworCUFTU0VSVChzdGFydF9zIDwgSU5UX0dFVChoZHJfcy0+Y291bnQsIEFSQ0hfQ09OVkVSVCkpOworCUFTU0VSVChzdGFydF9kIDw9IElOVF9HRVQoaGRyX2QtPmNvdW50LCBBUkNIX0NPTlZFUlQpKTsKKwlBU1NFUlQoY291bnQgPD0gSU5UX0dFVChoZHJfcy0+Y291bnQsIEFSQ0hfQ09OVkVSVCkpOworCisJLyoKKwkgKiBNb3ZlIHRoZSBlbnRyaWVzIGluIHRoZSBkZXN0aW5hdGlvbiBsZWFmIHVwIHRvIG1ha2UgYSBob2xlPworCSAqLworCWlmIChzdGFydF9kIDwgSU5UX0dFVChoZHJfZC0+Y291bnQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJdG1wICA9IElOVF9HRVQoaGRyX2QtPmNvdW50LCBBUkNIX0NPTlZFUlQpIC0gc3RhcnRfZDsKKwkJdG1wICo9IHNpemVvZih4ZnNfYXR0cl9sZWFmX2VudHJ5X3QpOworCQllbnRyeV9zID0gJmxlYWZfZC0+ZW50cmllc1tzdGFydF9kXTsKKwkJZW50cnlfZCA9ICZsZWFmX2QtPmVudHJpZXNbc3RhcnRfZCArIGNvdW50XTsKKwkJbWVtbW92ZSgoY2hhciAqKWVudHJ5X2QsIChjaGFyICopZW50cnlfcywgdG1wKTsKKwl9CisKKwkvKgorCSAqIENvcHkgYWxsIGVudHJ5J3MgaW4gdGhlIHNhbWUgKHNvcnRlZCkgb3JkZXIsCisJICogYnV0IGFsbG9jYXRlIGF0dHJpYnV0ZSBpbmZvIHBhY2tlZCBhbmQgaW4gc2VxdWVuY2UuCisJICovCisJZW50cnlfcyA9ICZsZWFmX3MtPmVudHJpZXNbc3RhcnRfc107CisJZW50cnlfZCA9ICZsZWFmX2QtPmVudHJpZXNbc3RhcnRfZF07CisJZGVzdGkgPSBzdGFydF9kOworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgZW50cnlfcysrLCBlbnRyeV9kKyssIGRlc3RpKyssIGkrKykgeworCQlBU1NFUlQoSU5UX0dFVChlbnRyeV9zLT5uYW1laWR4LCBBUkNIX0NPTlZFUlQpCisJCQkJPj0gSU5UX0dFVChoZHJfcy0+Zmlyc3R1c2VkLCBBUkNIX0NPTlZFUlQpKTsKKwkJdG1wID0geGZzX2F0dHJfbGVhZl9lbnRzaXplKGxlYWZfcywgc3RhcnRfcyArIGkpOworI2lmZGVmIEdST1QKKwkJLyoKKwkJICogQ29kZSB0byBkcm9wIElOQ09NUExFVEUgZW50cmllcy4gIERpZmZpY3VsdCB0byB1c2UgYXMgd2UKKwkJICogbWF5IGFsc28gbmVlZCB0byBjaGFuZ2UgdGhlIGluc2VydGlvbiBpbmRleC4gIENvZGUgdHVybmVkCisJCSAqIG9mZiBmb3IgNi4yLCBzaG91bGQgYmUgcmV2aXNpdGVkIGxhdGVyLgorCQkgKi8KKwkJaWYgKGVudHJ5X3MtPmZsYWdzICYgWEZTX0FUVFJfSU5DT01QTEVURSkgeyAvKiBza2lwIHBhcnRpYWxzPyAqLworCQkJbWVtc2V0KFhGU19BVFRSX0xFQUZfTkFNRShsZWFmX3MsIHN0YXJ0X3MgKyBpKSwgMCwgdG1wKTsKKwkJCUlOVF9NT0QoaGRyX3MtPnVzZWRieXRlcywgQVJDSF9DT05WRVJULCAtdG1wKTsKKwkJCUlOVF9NT0QoaGRyX3MtPmNvdW50LCBBUkNIX0NPTlZFUlQsIC0xKTsKKwkJCWVudHJ5X2QtLTsJLyogdG8gY29tcGVuc2F0ZSBmb3IgKysgaW4gbG9vcCBoZHIgKi8KKwkJCWRlc3RpLS07CisJCQlpZiAoKHN0YXJ0X3MgKyBpKSA8IG9mZnNldCkKKwkJCQlyZXN1bHQrKzsJLyogaW5zZXJ0aW9uIGluZGV4IGFkanVzdG1lbnQgKi8KKwkJfSBlbHNlIHsKKyNlbmRpZiAvKiBHUk9UICovCisJCQlJTlRfTU9EKGhkcl9kLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCwgLXRtcCk7CisJCQkvKiBib3RoIG9uLWRpc2ssIGRvbid0IGVuZGlhbiBmbGlwIHR3aWNlICovCisJCQllbnRyeV9kLT5oYXNodmFsID0gZW50cnlfcy0+aGFzaHZhbDsKKwkJCS8qIGJvdGggb24tZGlzaywgZG9uJ3QgZW5kaWFuIGZsaXAgdHdpY2UgKi8KKwkJCWVudHJ5X2QtPm5hbWVpZHggPSBoZHJfZC0+Zmlyc3R1c2VkOworCQkJZW50cnlfZC0+ZmxhZ3MgPSBlbnRyeV9zLT5mbGFnczsKKwkJCUFTU0VSVChJTlRfR0VUKGVudHJ5X2QtPm5hbWVpZHgsIEFSQ0hfQ09OVkVSVCkgKyB0bXAKKwkJCQkJCQk8PSBYRlNfTEJTSVpFKG1wKSk7CisJCQltZW1tb3ZlKFhGU19BVFRSX0xFQUZfTkFNRShsZWFmX2QsIGRlc3RpKSwKKwkJCQlYRlNfQVRUUl9MRUFGX05BTUUobGVhZl9zLCBzdGFydF9zICsgaSksIHRtcCk7CisJCQlBU1NFUlQoSU5UX0dFVChlbnRyeV9zLT5uYW1laWR4LCBBUkNIX0NPTlZFUlQpICsgdG1wCisJCQkJCQkJPD0gWEZTX0xCU0laRShtcCkpOworCQkJbWVtc2V0KFhGU19BVFRSX0xFQUZfTkFNRShsZWFmX3MsIHN0YXJ0X3MgKyBpKSwgMCwgdG1wKTsKKwkJCUlOVF9NT0QoaGRyX3MtPnVzZWRieXRlcywgQVJDSF9DT05WRVJULCAtdG1wKTsKKwkJCUlOVF9NT0QoaGRyX2QtPnVzZWRieXRlcywgQVJDSF9DT05WRVJULCB0bXApOworCQkJSU5UX01PRChoZHJfcy0+Y291bnQsIEFSQ0hfQ09OVkVSVCwgLTEpOworCQkJSU5UX01PRChoZHJfZC0+Y291bnQsIEFSQ0hfQ09OVkVSVCwgMSk7CisJCQl0bXAgPSBJTlRfR0VUKGhkcl9kLT5jb3VudCwgQVJDSF9DT05WRVJUKQorCQkJCQkJKiBzaXplb2YoeGZzX2F0dHJfbGVhZl9lbnRyeV90KQorCQkJCQkJKyBzaXplb2YoeGZzX2F0dHJfbGVhZl9oZHJfdCk7CisJCQlBU1NFUlQoSU5UX0dFVChoZHJfZC0+Zmlyc3R1c2VkLCBBUkNIX0NPTlZFUlQpID49IHRtcCk7CisjaWZkZWYgR1JPVAorCQl9CisjZW5kaWYgLyogR1JPVCAqLworCX0KKworCS8qCisJICogWmVybyBvdXQgdGhlIGVudHJpZXMgd2UganVzdCBjb3BpZWQuCisJICovCisJaWYgKHN0YXJ0X3MgPT0gSU5UX0dFVChoZHJfcy0+Y291bnQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJdG1wID0gY291bnQgKiBzaXplb2YoeGZzX2F0dHJfbGVhZl9lbnRyeV90KTsKKwkJZW50cnlfcyA9ICZsZWFmX3MtPmVudHJpZXNbc3RhcnRfc107CisJCUFTU0VSVCgoKGNoYXIgKillbnRyeV9zICsgdG1wKSA8PQorCQkgICAgICAgKChjaGFyICopbGVhZl9zICsgWEZTX0xCU0laRShtcCkpKTsKKwkJbWVtc2V0KChjaGFyICopZW50cnlfcywgMCwgdG1wKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBNb3ZlIHRoZSByZW1haW5pbmcgZW50cmllcyBkb3duIHRvIGZpbGwgdGhlIGhvbGUsCisJCSAqIHRoZW4gemVybyB0aGUgZW50cmllcyBhdCB0aGUgdG9wLgorCQkgKi8KKwkJdG1wICA9IElOVF9HRVQoaGRyX3MtPmNvdW50LCBBUkNIX0NPTlZFUlQpIC0gY291bnQ7CisJCXRtcCAqPSBzaXplb2YoeGZzX2F0dHJfbGVhZl9lbnRyeV90KTsKKwkJZW50cnlfcyA9ICZsZWFmX3MtPmVudHJpZXNbc3RhcnRfcyArIGNvdW50XTsKKwkJZW50cnlfZCA9ICZsZWFmX3MtPmVudHJpZXNbc3RhcnRfc107CisJCW1lbW1vdmUoKGNoYXIgKillbnRyeV9kLCAoY2hhciAqKWVudHJ5X3MsIHRtcCk7CisKKwkJdG1wID0gY291bnQgKiBzaXplb2YoeGZzX2F0dHJfbGVhZl9lbnRyeV90KTsKKwkJZW50cnlfcyA9ICZsZWFmX3MtPmVudHJpZXNbSU5UX0dFVChoZHJfcy0+Y291bnQsCisJCQkJCQkJQVJDSF9DT05WRVJUKV07CisJCUFTU0VSVCgoKGNoYXIgKillbnRyeV9zICsgdG1wKSA8PQorCQkgICAgICAgKChjaGFyICopbGVhZl9zICsgWEZTX0xCU0laRShtcCkpKTsKKwkJbWVtc2V0KChjaGFyICopZW50cnlfcywgMCwgdG1wKTsKKwl9CisKKwkvKgorCSAqIEZpbGwgaW4gdGhlIGZyZWVtYXAgaW5mb3JtYXRpb24KKwkgKi8KKwlJTlRfU0VUKGhkcl9kLT5mcmVlbWFwWzBdLmJhc2UsIEFSQ0hfQ09OVkVSVCwKKwkJCQkJc2l6ZW9mKHhmc19hdHRyX2xlYWZfaGRyX3QpKTsKKwlJTlRfTU9EKGhkcl9kLT5mcmVlbWFwWzBdLmJhc2UsIEFSQ0hfQ09OVkVSVCwKKwkJCQlJTlRfR0VUKGhkcl9kLT5jb3VudCwgQVJDSF9DT05WRVJUKQorCQkJCQkqIHNpemVvZih4ZnNfYXR0cl9sZWFmX2VudHJ5X3QpKTsKKwlJTlRfU0VUKGhkcl9kLT5mcmVlbWFwWzBdLnNpemUsIEFSQ0hfQ09OVkVSVCwKKwkJCQlJTlRfR0VUKGhkcl9kLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCkKKwkJCSAgICAgIC0gSU5UX0dFVChoZHJfZC0+ZnJlZW1hcFswXS5iYXNlLCBBUkNIX0NPTlZFUlQpKTsKKwloZHJfZC0+ZnJlZW1hcFsxXS5iYXNlID0gMDsKKwloZHJfZC0+ZnJlZW1hcFsyXS5iYXNlID0gMDsKKwloZHJfZC0+ZnJlZW1hcFsxXS5zaXplID0gMDsKKwloZHJfZC0+ZnJlZW1hcFsyXS5zaXplID0gMDsKKwloZHJfcy0+aG9sZXMgPSAxOwkvKiBsZWFmIG1heSBub3QgYmUgY29tcGFjdCAqLworfQorCisvKgorICogQ29tcGFyZSB0d28gbGVhZiBibG9ja3MgIm9yZGVyIi4KKyAqIFJldHVybiAwIHVubGVzcyBsZWFmMiBzaG91bGQgZ28gYmVmb3JlIGxlYWYxLgorICovCitpbnQKK3hmc19hdHRyX2xlYWZfb3JkZXIoeGZzX2RhYnVmX3QgKmxlYWYxX2JwLCB4ZnNfZGFidWZfdCAqbGVhZjJfYnApCit7CisJeGZzX2F0dHJfbGVhZmJsb2NrX3QgKmxlYWYxLCAqbGVhZjI7CisKKwlsZWFmMSA9IGxlYWYxX2JwLT5kYXRhOworCWxlYWYyID0gbGVhZjJfYnAtPmRhdGE7CisJQVNTRVJUKChJTlRfR0VUKGxlYWYxLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKQorCQkJCQkJPT0gWEZTX0FUVFJfTEVBRl9NQUdJQykgJiYKKwkgICAgICAgKElOVF9HRVQobGVhZjItPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpCisJCQkJCQk9PSBYRlNfQVRUUl9MRUFGX01BR0lDKSk7CisJaWYgKCAgIChJTlRfR0VUKGxlYWYxLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgPiAwKQorCSAgICAmJiAoSU5UX0dFVChsZWFmMi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpID4gMCkKKwkgICAgJiYgKCAgIChJTlRfR0VUKGxlYWYyLT5lbnRyaWVzWyAwIF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSA8CisJCSAgICAgIElOVF9HRVQobGVhZjEtPmVudHJpZXNbIDAgXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpKQorCQl8fCAoSU5UX0dFVChsZWFmMi0+ZW50cmllc1tJTlRfR0VUKGxlYWYyLT5oZHIuY291bnQsCisJCQkJQVJDSF9DT05WRVJUKS0xXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpIDwKKwkJICAgICAgSU5UX0dFVChsZWFmMS0+ZW50cmllc1tJTlRfR0VUKGxlYWYxLT5oZHIuY291bnQsCisJCQkJQVJDSF9DT05WRVJUKS0xXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpKSkgKSB7CisJCXJldHVybigxKTsKKwl9CisJcmV0dXJuKDApOworfQorCisvKgorICogUGljayB1cCB0aGUgbGFzdCBoYXNodmFsdWUgZnJvbSBhIGxlYWYgYmxvY2suCisgKi8KK3hmc19kYWhhc2hfdAoreGZzX2F0dHJfbGVhZl9sYXN0aGFzaCh4ZnNfZGFidWZfdCAqYnAsIGludCAqY291bnQpCit7CisJeGZzX2F0dHJfbGVhZmJsb2NrX3QgKmxlYWY7CisKKwlsZWFmID0gYnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQobGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCT09IFhGU19BVFRSX0xFQUZfTUFHSUMpOworCWlmIChjb3VudCkKKwkJKmNvdW50ID0gSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJaWYgKCFsZWFmLT5oZHIuY291bnQpCisJCXJldHVybigwKTsKKwlyZXR1cm4oSU5UX0dFVChsZWFmLT5lbnRyaWVzW0lOVF9HRVQobGVhZi0+aGRyLmNvdW50LAorCQkJCUFSQ0hfQ09OVkVSVCktMV0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSk7Cit9CisKKy8qCisgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBieXRlcyB1c2VkIHRvIHN0b3JlIHRoZSBpbmRpY2F0ZWQgYXR0cmlidXRlCisgKiAod2hldGhlciBsb2NhbCBvciByZW1vdGUgb25seSBjYWxjdWxhdGUgYnl0ZXMgaW4gdGhpcyBibG9jaykuCisgKi8KK2ludAoreGZzX2F0dHJfbGVhZl9lbnRzaXplKHhmc19hdHRyX2xlYWZibG9ja190ICpsZWFmLCBpbnQgaW5kZXgpCit7CisJeGZzX2F0dHJfbGVhZl9uYW1lX2xvY2FsX3QgKm5hbWVfbG9jOworCXhmc19hdHRyX2xlYWZfbmFtZV9yZW1vdGVfdCAqbmFtZV9ybXQ7CisJaW50IHNpemU7CisKKwlBU1NFUlQoSU5UX0dFVChsZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKQorCQkJCQkJPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisJaWYgKGxlYWYtPmVudHJpZXNbaW5kZXhdLmZsYWdzICYgWEZTX0FUVFJfTE9DQUwpIHsKKwkJbmFtZV9sb2MgPSBYRlNfQVRUUl9MRUFGX05BTUVfTE9DQUwobGVhZiwgaW5kZXgpOworCQlzaXplID0gWEZTX0FUVFJfTEVBRl9FTlRTSVpFX0xPQ0FMKG5hbWVfbG9jLT5uYW1lbGVuLAorCQkJCQkJICAgSU5UX0dFVChuYW1lX2xvYy0+dmFsdWVsZW4sCisJCQkJCQkJCUFSQ0hfQ09OVkVSVCkpOworCX0gZWxzZSB7CisJCW5hbWVfcm10ID0gWEZTX0FUVFJfTEVBRl9OQU1FX1JFTU9URShsZWFmLCBpbmRleCk7CisJCXNpemUgPSBYRlNfQVRUUl9MRUFGX0VOVFNJWkVfUkVNT1RFKG5hbWVfcm10LT5uYW1lbGVuKTsKKwl9CisJcmV0dXJuKHNpemUpOworfQorCisvKgorICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSByZXF1aXJlZCB0byBzdG9yZSB0aGUgbmV3CisgKiBhdHRyaWJ1dGUgKHdoZXRoZXIgbG9jYWwgb3IgcmVtb3RlIG9ubHkgY2FsY3VsYXRlIGJ5dGVzIGluIHRoaXMgYmxvY2spLgorICogVGhpcyByb3V0aW5lIGRlY2lkZXMgYXMgYSBzaWRlIGVmZmVjdCB3aGV0aGVyIHRoZSBhdHRyaWJ1dGUgd2lsbCBiZQorICogYSAibG9jYWwiIG9yIGEgInJlbW90ZSIgYXR0cmlidXRlLgorICovCitpbnQKK3hmc19hdHRyX2xlYWZfbmV3ZW50c2l6ZSh4ZnNfZGFfYXJnc190ICphcmdzLCBpbnQgYmxvY2tzaXplLCBpbnQgKmxvY2FsKQoreworCWludCBzaXplOworCisJc2l6ZSA9IFhGU19BVFRSX0xFQUZfRU5UU0laRV9MT0NBTChhcmdzLT5uYW1lbGVuLCBhcmdzLT52YWx1ZWxlbik7CisJaWYgKHNpemUgPCBYRlNfQVRUUl9MRUFGX0VOVFNJWkVfTE9DQUxfTUFYKGJsb2Nrc2l6ZSkpIHsKKwkJaWYgKGxvY2FsKSB7CisJCQkqbG9jYWwgPSAxOworCQl9CisJfSBlbHNlIHsKKwkJc2l6ZSA9IFhGU19BVFRSX0xFQUZfRU5UU0laRV9SRU1PVEUoYXJncy0+bmFtZWxlbik7CisJCWlmIChsb2NhbCkgeworCQkJKmxvY2FsID0gMDsKKwkJfQorCX0KKwlyZXR1cm4oc2l6ZSk7Cit9CisKKy8qCisgKiBDb3B5IG91dCBhdHRyaWJ1dGUgbGlzdCBlbnRyaWVzIGZvciBhdHRyX2xpc3QoKSwgZm9yIGxlYWYgYXR0cmlidXRlIGxpc3RzLgorICovCitpbnQKK3hmc19hdHRyX2xlYWZfbGlzdF9pbnQoeGZzX2RhYnVmX3QgKmJwLCB4ZnNfYXR0cl9saXN0X2NvbnRleHRfdCAqY29udGV4dCkKK3sKKwlhdHRybGlzdF9jdXJzb3Jfa2Vybl90ICpjdXJzb3I7CisJeGZzX2F0dHJfbGVhZmJsb2NrX3QgKmxlYWY7CisJeGZzX2F0dHJfbGVhZl9lbnRyeV90ICplbnRyeTsKKwl4ZnNfYXR0cl9sZWFmX25hbWVfbG9jYWxfdCAqbmFtZV9sb2M7CisJeGZzX2F0dHJfbGVhZl9uYW1lX3JlbW90ZV90ICpuYW1lX3JtdDsKKwlpbnQgcmV0dmFsLCBpOworCisJQVNTRVJUKGJwICE9IE5VTEwpOworCWxlYWYgPSBicC0+ZGF0YTsKKwljdXJzb3IgPSBjb250ZXh0LT5jdXJzb3I7CisJY3Vyc29yLT5pbml0dGVkID0gMTsKKworCXhmc19hdHRyX3RyYWNlX2xfY2woImJsayBzdGFydCIsIGNvbnRleHQsIGxlYWYpOworCisJLyoKKwkgKiBSZS1maW5kIG91ciBwbGFjZSBpbiB0aGUgbGVhZiBibG9jayBpZiB0aGlzIGlzIGEgbmV3IHN5c2NhbGwuCisJICovCisJaWYgKGNvbnRleHQtPnJlc3luY2gpIHsKKwkJZW50cnkgPSAmbGVhZi0+ZW50cmllc1swXTsKKwkJZm9yIChpID0gMDsgaSA8IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOworCQkJCQkJCWVudHJ5KyssIGkrKykgeworCQkJaWYgKElOVF9HRVQoZW50cnktPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCQk9PSBjdXJzb3ItPmhhc2h2YWwpIHsKKwkJCQlpZiAoY3Vyc29yLT5vZmZzZXQgPT0gY29udGV4dC0+ZHVwY250KSB7CisJCQkJCWNvbnRleHQtPmR1cGNudCA9IDA7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljb250ZXh0LT5kdXBjbnQrKzsKKwkJCX0gZWxzZSBpZiAoSU5UX0dFVChlbnRyeS0+aGFzaHZhbCwgQVJDSF9DT05WRVJUKQorCQkJCQkJCT4gY3Vyc29yLT5oYXNodmFsKSB7CisJCQkJY29udGV4dC0+ZHVwY250ID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoaSA9PSBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSkgeworCQkJeGZzX2F0dHJfdHJhY2VfbF9jKCJub3QgZm91bmQiLCBjb250ZXh0KTsKKwkJCXJldHVybigwKTsKKwkJfQorCX0gZWxzZSB7CisJCWVudHJ5ID0gJmxlYWYtPmVudHJpZXNbMF07CisJCWkgPSAwOworCX0KKwljb250ZXh0LT5yZXN5bmNoID0gMDsKKworCS8qCisJICogV2UgaGF2ZSBmb3VuZCBvdXIgcGxhY2UsIHN0YXJ0IGNvcHlpbmcgb3V0IHRoZSBuZXcgYXR0cmlidXRlcy4KKwkgKi8KKwlyZXR2YWwgPSAwOworCWZvciAoICA7IChpIDwgSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkpCisJICAgICAmJiAocmV0dmFsID09IDApOyBlbnRyeSsrLCBpKyspIHsKKwkJYXR0cm5hbWVzX3QJKm5hbWVzcDsKKworCQlpZiAoSU5UX0dFVChlbnRyeS0+aGFzaHZhbCwgQVJDSF9DT05WRVJUKSAhPSBjdXJzb3ItPmhhc2h2YWwpIHsKKwkJCWN1cnNvci0+aGFzaHZhbCA9IElOVF9HRVQoZW50cnktPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCk7CisJCQljdXJzb3ItPm9mZnNldCA9IDA7CisJCX0KKworCQlpZiAoZW50cnktPmZsYWdzICYgWEZTX0FUVFJfSU5DT01QTEVURSkKKwkJCWNvbnRpbnVlOwkJLyogc2tpcCBpbmNvbXBsZXRlIGVudHJpZXMgKi8KKwkJaWYgKCgoY29udGV4dC0+ZmxhZ3MgJiBBVFRSX1NFQ1VSRSkgIT0gMCkgIT0KKwkJICAgICgoZW50cnktPmZsYWdzICYgWEZTX0FUVFJfU0VDVVJFKSAhPSAwKSAmJgorCQkgICAgIShjb250ZXh0LT5mbGFncyAmIEFUVFJfS0VSTk9STUFMUykpCisJCQljb250aW51ZTsJCS8qIHNraXAgbm9uLW1hdGNoaW5nIGVudHJpZXMgKi8KKwkJaWYgKCgoY29udGV4dC0+ZmxhZ3MgJiBBVFRSX1JPT1QpICE9IDApICE9CisJCSAgICAoKGVudHJ5LT5mbGFncyAmIFhGU19BVFRSX1JPT1QpICE9IDApICYmCisJCSAgICAhKGNvbnRleHQtPmZsYWdzICYgQVRUUl9LRVJOUk9PVExTKSkKKwkJCWNvbnRpbnVlOwkJLyogc2tpcCBub24tbWF0Y2hpbmcgZW50cmllcyAqLworCisJCW5hbWVzcCA9IChlbnRyeS0+ZmxhZ3MgJiBYRlNfQVRUUl9TRUNVUkUpID8gJmF0dHJfc2VjdXJlIDoKKwkJCSgoZW50cnktPmZsYWdzICYgWEZTX0FUVFJfUk9PVCkgPyAmYXR0cl90cnVzdGVkIDoKKwkJCSAgJmF0dHJfdXNlcik7CisKKwkJaWYgKGVudHJ5LT5mbGFncyAmIFhGU19BVFRSX0xPQ0FMKSB7CisJCQluYW1lX2xvYyA9IFhGU19BVFRSX0xFQUZfTkFNRV9MT0NBTChsZWFmLCBpKTsKKwkJCWlmIChjb250ZXh0LT5mbGFncyAmIEFUVFJfS0VSTk9WQUwpIHsKKwkJCQlBU1NFUlQoY29udGV4dC0+ZmxhZ3MgJiBBVFRSX0tFUk5BTUVMUyk7CisJCQkJY29udGV4dC0+Y291bnQgKz0gbmFtZXNwLT5hdHRyX25hbWVsZW4gKworCQkJCQkJKGludCluYW1lX2xvYy0+bmFtZWxlbiArIDE7CisJCQl9IGVsc2UgeworCQkJCXJldHZhbCA9IHhmc19hdHRyX3B1dF9saXN0ZW50KGNvbnRleHQsIG5hbWVzcCwKKwkJCQkJKGNoYXIgKiluYW1lX2xvYy0+bmFtZXZhbCwKKwkJCQkJKGludCluYW1lX2xvYy0+bmFtZWxlbiwKKwkJCQkJKGludClJTlRfR0VUKG5hbWVfbG9jLT52YWx1ZWxlbiwKKwkJCQkJCQkJQVJDSF9DT05WRVJUKSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQluYW1lX3JtdCA9IFhGU19BVFRSX0xFQUZfTkFNRV9SRU1PVEUobGVhZiwgaSk7CisJCQlpZiAoY29udGV4dC0+ZmxhZ3MgJiBBVFRSX0tFUk5PVkFMKSB7CisJCQkJQVNTRVJUKGNvbnRleHQtPmZsYWdzICYgQVRUUl9LRVJOQU1FTFMpOworCQkJCWNvbnRleHQtPmNvdW50ICs9IG5hbWVzcC0+YXR0cl9uYW1lbGVuICsKKwkJCQkJCShpbnQpbmFtZV9ybXQtPm5hbWVsZW4gKyAxOworCQkJfSBlbHNlIHsKKwkJCQlyZXR2YWwgPSB4ZnNfYXR0cl9wdXRfbGlzdGVudChjb250ZXh0LCBuYW1lc3AsCisJCQkJCShjaGFyICopbmFtZV9ybXQtPm5hbWUsCisJCQkJCShpbnQpbmFtZV9ybXQtPm5hbWVsZW4sCisJCQkJCShpbnQpSU5UX0dFVChuYW1lX3JtdC0+dmFsdWVsZW4sCisJCQkJCQkJCUFSQ0hfQ09OVkVSVCkpOworCQkJfQorCQl9CisJCWlmIChyZXR2YWwgPT0gMCkgeworCQkJY3Vyc29yLT5vZmZzZXQrKzsKKwkJfQorCX0KKwl4ZnNfYXR0cl90cmFjZV9sX2NsKCJibGsgZW5kIiwgY29udGV4dCwgbGVhZik7CisJcmV0dXJuKHJldHZhbCk7Cit9CisKKyNkZWZpbmUJQVRUUl9FTlRCQVNFU0laRQkJLyogbWluaW11bSBieXRlcyB1c2VkIGJ5IGFuIGF0dHIgKi8gXAorCSgoKHN0cnVjdCBhdHRybGlzdF9lbnQgKikgMCktPmFfbmFtZSAtIChjaGFyICopIDApCisjZGVmaW5lCUFUVFJfRU5UU0laRShuYW1lbGVuKQkJLyogYWN0dWFsIGJ5dGVzIHVzZWQgYnkgYW4gYXR0ciAqLyBcCisJKChBVFRSX0VOVEJBU0VTSVpFICsgKG5hbWVsZW4pICsgMSArIHNpemVvZih1X2ludDMyX3QpLTEpIFwKKwkgJiB+KHNpemVvZih1X2ludDMyX3QpLTEpKQorCisvKgorICogRm9ybWF0IGFuIGF0dHJpYnV0ZSBhbmQgY29weSBpdCBvdXQgdG8gdGhlIHVzZXIncyBidWZmZXIuCisgKiBUYWtlIGNhcmUgdG8gY2hlY2sgdmFsdWVzIGFuZCBwcm90ZWN0IGFnYWluc3QgdGhlbSBjaGFuZ2luZyBsYXRlciwKKyAqIHdlIG1heSBiZSByZWFkaW5nIHRoZW0gZGlyZWN0bHkgb3V0IG9mIGEgdXNlciBidWZmZXIuCisgKi8KKy8qQVJHU1VTRUQqLworaW50Cit4ZnNfYXR0cl9wdXRfbGlzdGVudCh4ZnNfYXR0cl9saXN0X2NvbnRleHRfdCAqY29udGV4dCwKKwkJICAgICBhdHRybmFtZXNfdCAqbmFtZXNwLCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwgaW50IHZhbHVlbGVuKQoreworCWF0dHJsaXN0X2VudF90ICphZXA7CisJaW50IGFycmF5dG9wOworCisJQVNTRVJUKCEoY29udGV4dC0+ZmxhZ3MgJiBBVFRSX0tFUk5PVkFMKSk7CisJaWYgKGNvbnRleHQtPmZsYWdzICYgQVRUUl9LRVJOQU1FTFMpIHsKKwkJY2hhciAqb2Zmc2V0OworCisJCUFTU0VSVChjb250ZXh0LT5jb3VudCA+PSAwKTsKKworCQlhcnJheXRvcCA9IGNvbnRleHQtPmNvdW50ICsgbmFtZXNwLT5hdHRyX25hbWVsZW4gKyBuYW1lbGVuICsgMTsKKwkJaWYgKGFycmF5dG9wID4gY29udGV4dC0+Zmlyc3R1KSB7CisJCQljb250ZXh0LT5jb3VudCA9IC0xOwkvKiBpbnN1ZmZpY2llbnQgc3BhY2UgKi8KKwkJCXJldHVybigxKTsKKwkJfQorCQlvZmZzZXQgPSAoY2hhciAqKWNvbnRleHQtPmFsaXN0ICsgY29udGV4dC0+Y291bnQ7CisJCXN0cm5jcHkob2Zmc2V0LCBuYW1lc3AtPmF0dHJfbmFtZSwgbmFtZXNwLT5hdHRyX25hbWVsZW4pOworCQlvZmZzZXQgKz0gbmFtZXNwLT5hdHRyX25hbWVsZW47CisJCXN0cm5jcHkob2Zmc2V0LCBuYW1lLCBuYW1lbGVuKTsJCQkvKiByZWFsIG5hbWUgKi8KKwkJb2Zmc2V0ICs9IG5hbWVsZW47CisJCSpvZmZzZXQgPSAnXDAnOworCQljb250ZXh0LT5jb3VudCArPSBuYW1lc3AtPmF0dHJfbmFtZWxlbiArIG5hbWVsZW4gKyAxOworCQlyZXR1cm4oMCk7CisJfQorCisJQVNTRVJUKGNvbnRleHQtPmNvdW50ID49IDApOworCUFTU0VSVChjb250ZXh0LT5jb3VudCA8IChBVFRSX01BWF9WQUxVRUxFTi84KSk7CisJQVNTRVJUKGNvbnRleHQtPmZpcnN0dSA+PSBzaXplb2YoKmNvbnRleHQtPmFsaXN0KSk7CisJQVNTRVJUKGNvbnRleHQtPmZpcnN0dSA8PSBjb250ZXh0LT5idWZzaXplKTsKKworCWFycmF5dG9wID0gc2l6ZW9mKCpjb250ZXh0LT5hbGlzdCkgKworCQkJY29udGV4dC0+Y291bnQgKiBzaXplb2YoY29udGV4dC0+YWxpc3QtPmFsX29mZnNldFswXSk7CisJY29udGV4dC0+Zmlyc3R1IC09IEFUVFJfRU5UU0laRShuYW1lbGVuKTsKKwlpZiAoY29udGV4dC0+Zmlyc3R1IDwgYXJyYXl0b3ApIHsKKwkJeGZzX2F0dHJfdHJhY2VfbF9jKCJidWZmZXIgZnVsbCIsIGNvbnRleHQpOworCQljb250ZXh0LT5hbGlzdC0+YWxfbW9yZSA9IDE7CisJCXJldHVybigxKTsKKwl9CisKKwlhZXAgPSAoYXR0cmxpc3RfZW50X3QgKikmKCgoY2hhciAqKWNvbnRleHQtPmFsaXN0KVsgY29udGV4dC0+Zmlyc3R1IF0pOworCWFlcC0+YV92YWx1ZWxlbiA9IHZhbHVlbGVuOworCW1lbWNweShhZXAtPmFfbmFtZSwgbmFtZSwgbmFtZWxlbik7CisJYWVwLT5hX25hbWVbIG5hbWVsZW4gXSA9IDA7CisJY29udGV4dC0+YWxpc3QtPmFsX29mZnNldFsgY29udGV4dC0+Y291bnQrKyBdID0gY29udGV4dC0+Zmlyc3R1OworCWNvbnRleHQtPmFsaXN0LT5hbF9jb3VudCA9IGNvbnRleHQtPmNvdW50OworCXhmc19hdHRyX3RyYWNlX2xfYygiYWRkIiwgY29udGV4dCk7CisJcmV0dXJuKDApOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTWFuYWdlIHRoZSBJTkNPTVBMRVRFIGZsYWcgaW4gYSBsZWFmIGVudHJ5CisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgKiBDbGVhciB0aGUgSU5DT01QTEVURSBmbGFnIG9uIGFuIGVudHJ5IGluIGEgbGVhZiBibG9jay4KKyAqLworaW50Cit4ZnNfYXR0cl9sZWFmX2NsZWFyZmxhZyh4ZnNfZGFfYXJnc190ICphcmdzKQoreworCXhmc19hdHRyX2xlYWZibG9ja190ICpsZWFmOworCXhmc19hdHRyX2xlYWZfZW50cnlfdCAqZW50cnk7CisJeGZzX2F0dHJfbGVhZl9uYW1lX3JlbW90ZV90ICpuYW1lX3JtdDsKKwl4ZnNfZGFidWZfdCAqYnA7CisJaW50IGVycm9yOworI2lmZGVmIERFQlVHCisJeGZzX2F0dHJfbGVhZl9uYW1lX2xvY2FsX3QgKm5hbWVfbG9jOworCWludCBuYW1lbGVuOworCWNoYXIgKm5hbWU7CisjZW5kaWYgLyogREVCVUcgKi8KKworCS8qCisJICogU2V0IHVwIHRoZSBvcGVyYXRpb24uCisJICovCisJZXJyb3IgPSB4ZnNfZGFfcmVhZF9idWYoYXJncy0+dHJhbnMsIGFyZ3MtPmRwLCBhcmdzLT5ibGtubywgLTEsICZicCwKKwkJCQkJICAgICBYRlNfQVRUUl9GT1JLKTsKKwlpZiAoZXJyb3IpIHsKKwkJcmV0dXJuKGVycm9yKTsKKwl9CisJQVNTRVJUKGJwICE9IE5VTEwpOworCisJbGVhZiA9IGJwLT5kYXRhOworCUFTU0VSVChJTlRfR0VUKGxlYWYtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpCisJCQkJCQk9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKwlBU1NFUlQoYXJncy0+aW5kZXggPCBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSk7CisJQVNTRVJUKGFyZ3MtPmluZGV4ID49IDApOworCWVudHJ5ID0gJmxlYWYtPmVudHJpZXNbIGFyZ3MtPmluZGV4IF07CisJQVNTRVJUKGVudHJ5LT5mbGFncyAmIFhGU19BVFRSX0lOQ09NUExFVEUpOworCisjaWZkZWYgREVCVUcKKwlpZiAoZW50cnktPmZsYWdzICYgWEZTX0FUVFJfTE9DQUwpIHsKKwkJbmFtZV9sb2MgPSBYRlNfQVRUUl9MRUFGX05BTUVfTE9DQUwobGVhZiwgYXJncy0+aW5kZXgpOworCQluYW1lbGVuID0gbmFtZV9sb2MtPm5hbWVsZW47CisJCW5hbWUgPSAoY2hhciAqKW5hbWVfbG9jLT5uYW1ldmFsOworCX0gZWxzZSB7CisJCW5hbWVfcm10ID0gWEZTX0FUVFJfTEVBRl9OQU1FX1JFTU9URShsZWFmLCBhcmdzLT5pbmRleCk7CisJCW5hbWVsZW4gPSBuYW1lX3JtdC0+bmFtZWxlbjsKKwkJbmFtZSA9IChjaGFyICopbmFtZV9ybXQtPm5hbWU7CisJfQorCUFTU0VSVChJTlRfR0VUKGVudHJ5LT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpID09IGFyZ3MtPmhhc2h2YWwpOworCUFTU0VSVChuYW1lbGVuID09IGFyZ3MtPm5hbWVsZW4pOworCUFTU0VSVChtZW1jbXAobmFtZSwgYXJncy0+bmFtZSwgbmFtZWxlbikgPT0gMCk7CisjZW5kaWYgLyogREVCVUcgKi8KKworCWVudHJ5LT5mbGFncyAmPSB+WEZTX0FUVFJfSU5DT01QTEVURTsKKwl4ZnNfZGFfbG9nX2J1ZihhcmdzLT50cmFucywgYnAsCisJCQkgWEZTX0RBX0xPR1JBTkdFKGxlYWYsIGVudHJ5LCBzaXplb2YoKmVudHJ5KSkpOworCisJaWYgKGFyZ3MtPnJtdGJsa25vKSB7CisJCUFTU0VSVCgoZW50cnktPmZsYWdzICYgWEZTX0FUVFJfTE9DQUwpID09IDApOworCQluYW1lX3JtdCA9IFhGU19BVFRSX0xFQUZfTkFNRV9SRU1PVEUobGVhZiwgYXJncy0+aW5kZXgpOworCQlJTlRfU0VUKG5hbWVfcm10LT52YWx1ZWJsaywgQVJDSF9DT05WRVJULCBhcmdzLT5ybXRibGtubyk7CisJCUlOVF9TRVQobmFtZV9ybXQtPnZhbHVlbGVuLCBBUkNIX0NPTlZFUlQsIGFyZ3MtPnZhbHVlbGVuKTsKKwkJeGZzX2RhX2xvZ19idWYoYXJncy0+dHJhbnMsIGJwLAorCQkJIFhGU19EQV9MT0dSQU5HRShsZWFmLCBuYW1lX3JtdCwgc2l6ZW9mKCpuYW1lX3JtdCkpKTsKKwl9CisJeGZzX2RhX2J1Zl9kb25lKGJwKTsKKworCS8qCisJICogQ29tbWl0IHRoZSBmbGFnIHZhbHVlIGNoYW5nZSBhbmQgc3RhcnQgdGhlIG5leHQgdHJhbnMgaW4gc2VyaWVzLgorCSAqLworCWVycm9yID0geGZzX2F0dHJfcm9sbHRyYW5zKCZhcmdzLT50cmFucywgYXJncy0+ZHApOworCisJcmV0dXJuKGVycm9yKTsKK30KKworLyoKKyAqIFNldCB0aGUgSU5DT01QTEVURSBmbGFnIG9uIGFuIGVudHJ5IGluIGEgbGVhZiBibG9jay4KKyAqLworaW50Cit4ZnNfYXR0cl9sZWFmX3NldGZsYWcoeGZzX2RhX2FyZ3NfdCAqYXJncykKK3sKKwl4ZnNfYXR0cl9sZWFmYmxvY2tfdCAqbGVhZjsKKwl4ZnNfYXR0cl9sZWFmX2VudHJ5X3QgKmVudHJ5OworCXhmc19hdHRyX2xlYWZfbmFtZV9yZW1vdGVfdCAqbmFtZV9ybXQ7CisJeGZzX2RhYnVmX3QgKmJwOworCWludCBlcnJvcjsKKworCS8qCisJICogU2V0IHVwIHRoZSBvcGVyYXRpb24uCisJICovCisJZXJyb3IgPSB4ZnNfZGFfcmVhZF9idWYoYXJncy0+dHJhbnMsIGFyZ3MtPmRwLCBhcmdzLT5ibGtubywgLTEsICZicCwKKwkJCQkJICAgICBYRlNfQVRUUl9GT1JLKTsKKwlpZiAoZXJyb3IpIHsKKwkJcmV0dXJuKGVycm9yKTsKKwl9CisJQVNTRVJUKGJwICE9IE5VTEwpOworCisJbGVhZiA9IGJwLT5kYXRhOworCUFTU0VSVChJTlRfR0VUKGxlYWYtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpCisJCQkJCQk9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKwlBU1NFUlQoYXJncy0+aW5kZXggPCBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSk7CisJQVNTRVJUKGFyZ3MtPmluZGV4ID49IDApOworCWVudHJ5ID0gJmxlYWYtPmVudHJpZXNbIGFyZ3MtPmluZGV4IF07CisKKwlBU1NFUlQoKGVudHJ5LT5mbGFncyAmIFhGU19BVFRSX0lOQ09NUExFVEUpID09IDApOworCWVudHJ5LT5mbGFncyB8PSBYRlNfQVRUUl9JTkNPTVBMRVRFOworCXhmc19kYV9sb2dfYnVmKGFyZ3MtPnRyYW5zLCBicCwKKwkJCVhGU19EQV9MT0dSQU5HRShsZWFmLCBlbnRyeSwgc2l6ZW9mKCplbnRyeSkpKTsKKwlpZiAoKGVudHJ5LT5mbGFncyAmIFhGU19BVFRSX0xPQ0FMKSA9PSAwKSB7CisJCW5hbWVfcm10ID0gWEZTX0FUVFJfTEVBRl9OQU1FX1JFTU9URShsZWFmLCBhcmdzLT5pbmRleCk7CisJCW5hbWVfcm10LT52YWx1ZWJsayA9IDA7CisJCW5hbWVfcm10LT52YWx1ZWxlbiA9IDA7CisJCXhmc19kYV9sb2dfYnVmKGFyZ3MtPnRyYW5zLCBicCwKKwkJCSBYRlNfREFfTE9HUkFOR0UobGVhZiwgbmFtZV9ybXQsIHNpemVvZigqbmFtZV9ybXQpKSk7CisJfQorCXhmc19kYV9idWZfZG9uZShicCk7CisKKwkvKgorCSAqIENvbW1pdCB0aGUgZmxhZyB2YWx1ZSBjaGFuZ2UgYW5kIHN0YXJ0IHRoZSBuZXh0IHRyYW5zIGluIHNlcmllcy4KKwkgKi8KKwllcnJvciA9IHhmc19hdHRyX3JvbGx0cmFucygmYXJncy0+dHJhbnMsIGFyZ3MtPmRwKTsKKworCXJldHVybihlcnJvcik7Cit9CisKKy8qCisgKiBJbiBhIHNpbmdsZSB0cmFuc2FjdGlvbiwgY2xlYXIgdGhlIElOQ09NUExFVEUgZmxhZyBvbiB0aGUgbGVhZiBlbnRyeQorICogZ2l2ZW4gYnkgYXJncy0+Ymxrbm8vaW5kZXggYW5kIHNldCB0aGUgSU5DT01QTEVURSBmbGFnIG9uIHRoZSBsZWFmCisgKiBlbnRyeSBnaXZlbiBieSBhcmdzLT5ibGtubzIvaW5kZXgyLgorICoKKyAqIE5vdGUgdGhhdCB0aGV5IGNvdWxkIGJlIGluIGRpZmZlcmVudCBibG9ja3MsIG9yIGluIHRoZSBzYW1lIGJsb2NrLgorICovCitpbnQKK3hmc19hdHRyX2xlYWZfZmxpcGZsYWdzKHhmc19kYV9hcmdzX3QgKmFyZ3MpCit7CisJeGZzX2F0dHJfbGVhZmJsb2NrX3QgKmxlYWYxLCAqbGVhZjI7CisJeGZzX2F0dHJfbGVhZl9lbnRyeV90ICplbnRyeTEsICplbnRyeTI7CisJeGZzX2F0dHJfbGVhZl9uYW1lX3JlbW90ZV90ICpuYW1lX3JtdDsKKwl4ZnNfZGFidWZfdCAqYnAxLCAqYnAyOworCWludCBlcnJvcjsKKyNpZmRlZiBERUJVRworCXhmc19hdHRyX2xlYWZfbmFtZV9sb2NhbF90ICpuYW1lX2xvYzsKKwlpbnQgbmFtZWxlbjEsIG5hbWVsZW4yOworCWNoYXIgKm5hbWUxLCAqbmFtZTI7CisjZW5kaWYgLyogREVCVUcgKi8KKworCS8qCisJICogUmVhZCB0aGUgYmxvY2sgY29udGFpbmluZyB0aGUgIm9sZCIgYXR0cgorCSAqLworCWVycm9yID0geGZzX2RhX3JlYWRfYnVmKGFyZ3MtPnRyYW5zLCBhcmdzLT5kcCwgYXJncy0+Ymxrbm8sIC0xLCAmYnAxLAorCQkJCQkgICAgIFhGU19BVFRSX0ZPUkspOworCWlmIChlcnJvcikgeworCQlyZXR1cm4oZXJyb3IpOworCX0KKwlBU1NFUlQoYnAxICE9IE5VTEwpOworCisJLyoKKwkgKiBSZWFkIHRoZSBibG9jayBjb250YWluaW5nIHRoZSAibmV3IiBhdHRyLCBpZiBpdCBpcyBkaWZmZXJlbnQKKwkgKi8KKwlpZiAoYXJncy0+Ymxrbm8yICE9IGFyZ3MtPmJsa25vKSB7CisJCWVycm9yID0geGZzX2RhX3JlYWRfYnVmKGFyZ3MtPnRyYW5zLCBhcmdzLT5kcCwgYXJncy0+Ymxrbm8yLAorCQkJCQktMSwgJmJwMiwgWEZTX0FUVFJfRk9SSyk7CisJCWlmIChlcnJvcikgeworCQkJcmV0dXJuKGVycm9yKTsKKwkJfQorCQlBU1NFUlQoYnAyICE9IE5VTEwpOworCX0gZWxzZSB7CisJCWJwMiA9IGJwMTsKKwl9CisKKwlsZWFmMSA9IGJwMS0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChsZWFmMS0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCT09IFhGU19BVFRSX0xFQUZfTUFHSUMpOworCUFTU0VSVChhcmdzLT5pbmRleCA8IElOVF9HRVQobGVhZjEtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSk7CisJQVNTRVJUKGFyZ3MtPmluZGV4ID49IDApOworCWVudHJ5MSA9ICZsZWFmMS0+ZW50cmllc1sgYXJncy0+aW5kZXggXTsKKworCWxlYWYyID0gYnAyLT5kYXRhOworCUFTU0VSVChJTlRfR0VUKGxlYWYyLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKQorCQkJCQkJPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisJQVNTRVJUKGFyZ3MtPmluZGV4MiA8IElOVF9HRVQobGVhZjItPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSk7CisJQVNTRVJUKGFyZ3MtPmluZGV4MiA+PSAwKTsKKwllbnRyeTIgPSAmbGVhZjItPmVudHJpZXNbIGFyZ3MtPmluZGV4MiBdOworCisjaWZkZWYgREVCVUcKKwlpZiAoZW50cnkxLT5mbGFncyAmIFhGU19BVFRSX0xPQ0FMKSB7CisJCW5hbWVfbG9jID0gWEZTX0FUVFJfTEVBRl9OQU1FX0xPQ0FMKGxlYWYxLCBhcmdzLT5pbmRleCk7CisJCW5hbWVsZW4xID0gbmFtZV9sb2MtPm5hbWVsZW47CisJCW5hbWUxID0gKGNoYXIgKiluYW1lX2xvYy0+bmFtZXZhbDsKKwl9IGVsc2UgeworCQluYW1lX3JtdCA9IFhGU19BVFRSX0xFQUZfTkFNRV9SRU1PVEUobGVhZjEsIGFyZ3MtPmluZGV4KTsKKwkJbmFtZWxlbjEgPSBuYW1lX3JtdC0+bmFtZWxlbjsKKwkJbmFtZTEgPSAoY2hhciAqKW5hbWVfcm10LT5uYW1lOworCX0KKwlpZiAoZW50cnkyLT5mbGFncyAmIFhGU19BVFRSX0xPQ0FMKSB7CisJCW5hbWVfbG9jID0gWEZTX0FUVFJfTEVBRl9OQU1FX0xPQ0FMKGxlYWYyLCBhcmdzLT5pbmRleDIpOworCQluYW1lbGVuMiA9IG5hbWVfbG9jLT5uYW1lbGVuOworCQluYW1lMiA9IChjaGFyICopbmFtZV9sb2MtPm5hbWV2YWw7CisJfSBlbHNlIHsKKwkJbmFtZV9ybXQgPSBYRlNfQVRUUl9MRUFGX05BTUVfUkVNT1RFKGxlYWYyLCBhcmdzLT5pbmRleDIpOworCQluYW1lbGVuMiA9IG5hbWVfcm10LT5uYW1lbGVuOworCQluYW1lMiA9IChjaGFyICopbmFtZV9ybXQtPm5hbWU7CisJfQorCUFTU0VSVChJTlRfR0VUKGVudHJ5MS0+aGFzaHZhbCwgQVJDSF9DT05WRVJUKSA9PSBJTlRfR0VUKGVudHJ5Mi0+aGFzaHZhbCwgQVJDSF9DT05WRVJUKSk7CisJQVNTRVJUKG5hbWVsZW4xID09IG5hbWVsZW4yKTsKKwlBU1NFUlQobWVtY21wKG5hbWUxLCBuYW1lMiwgbmFtZWxlbjEpID09IDApOworI2VuZGlmIC8qIERFQlVHICovCisKKwlBU1NFUlQoZW50cnkxLT5mbGFncyAmIFhGU19BVFRSX0lOQ09NUExFVEUpOworCUFTU0VSVCgoZW50cnkyLT5mbGFncyAmIFhGU19BVFRSX0lOQ09NUExFVEUpID09IDApOworCisJZW50cnkxLT5mbGFncyAmPSB+WEZTX0FUVFJfSU5DT01QTEVURTsKKwl4ZnNfZGFfbG9nX2J1ZihhcmdzLT50cmFucywgYnAxLAorCQkJICBYRlNfREFfTE9HUkFOR0UobGVhZjEsIGVudHJ5MSwgc2l6ZW9mKCplbnRyeTEpKSk7CisJaWYgKGFyZ3MtPnJtdGJsa25vKSB7CisJCUFTU0VSVCgoZW50cnkxLT5mbGFncyAmIFhGU19BVFRSX0xPQ0FMKSA9PSAwKTsKKwkJbmFtZV9ybXQgPSBYRlNfQVRUUl9MRUFGX05BTUVfUkVNT1RFKGxlYWYxLCBhcmdzLT5pbmRleCk7CisJCUlOVF9TRVQobmFtZV9ybXQtPnZhbHVlYmxrLCBBUkNIX0NPTlZFUlQsIGFyZ3MtPnJtdGJsa25vKTsKKwkJSU5UX1NFVChuYW1lX3JtdC0+dmFsdWVsZW4sIEFSQ0hfQ09OVkVSVCwgYXJncy0+dmFsdWVsZW4pOworCQl4ZnNfZGFfbG9nX2J1ZihhcmdzLT50cmFucywgYnAxLAorCQkJIFhGU19EQV9MT0dSQU5HRShsZWFmMSwgbmFtZV9ybXQsIHNpemVvZigqbmFtZV9ybXQpKSk7CisJfQorCisJZW50cnkyLT5mbGFncyB8PSBYRlNfQVRUUl9JTkNPTVBMRVRFOworCXhmc19kYV9sb2dfYnVmKGFyZ3MtPnRyYW5zLCBicDIsCisJCQkgIFhGU19EQV9MT0dSQU5HRShsZWFmMiwgZW50cnkyLCBzaXplb2YoKmVudHJ5MikpKTsKKwlpZiAoKGVudHJ5Mi0+ZmxhZ3MgJiBYRlNfQVRUUl9MT0NBTCkgPT0gMCkgeworCQluYW1lX3JtdCA9IFhGU19BVFRSX0xFQUZfTkFNRV9SRU1PVEUobGVhZjIsIGFyZ3MtPmluZGV4Mik7CisJCW5hbWVfcm10LT52YWx1ZWJsayA9IDA7CisJCW5hbWVfcm10LT52YWx1ZWxlbiA9IDA7CisJCXhmc19kYV9sb2dfYnVmKGFyZ3MtPnRyYW5zLCBicDIsCisJCQkgWEZTX0RBX0xPR1JBTkdFKGxlYWYyLCBuYW1lX3JtdCwgc2l6ZW9mKCpuYW1lX3JtdCkpKTsKKwl9CisJeGZzX2RhX2J1Zl9kb25lKGJwMSk7CisJaWYgKGJwMSAhPSBicDIpCisJCXhmc19kYV9idWZfZG9uZShicDIpOworCisJLyoKKwkgKiBDb21taXQgdGhlIGZsYWcgdmFsdWUgY2hhbmdlIGFuZCBzdGFydCB0aGUgbmV4dCB0cmFucyBpbiBzZXJpZXMuCisJICovCisJZXJyb3IgPSB4ZnNfYXR0cl9yb2xsdHJhbnMoJmFyZ3MtPnRyYW5zLCBhcmdzLT5kcCk7CisKKwlyZXR1cm4oZXJyb3IpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5kaXNjcmltaW5hdGVseSBkZWxldGUgdGhlIGVudGlyZSBhdHRyaWJ1dGUgZm9yaworICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICogUmVjdXJzZSAoZ2FzcCEpIHRocm91Z2ggdGhlIGF0dHJpYnV0ZSBub2RlcyB1bnRpbCB3ZSBmaW5kIGxlYXZlcy4KKyAqIFdlJ3JlIGRvaW5nIGEgZGVwdGgtZmlyc3QgdHJhdmVyc2FsIGluIG9yZGVyIHRvIGludmFsaWRhdGUgZXZlcnl0aGluZy4KKyAqLworaW50Cit4ZnNfYXR0cl9yb290X2luYWN0aXZlKHhmc190cmFuc190ICoqdHJhbnMsIHhmc19pbm9kZV90ICpkcCkKK3sKKwl4ZnNfZGFfYmxraW5mb190ICppbmZvOworCXhmc19kYWRkcl90IGJsa25vOworCXhmc19kYWJ1Zl90ICpicDsKKwlpbnQgZXJyb3I7CisKKwkvKgorCSAqIFJlYWQgYmxvY2sgMCB0byBzZWUgd2hhdCB3ZSBoYXZlIHRvIHdvcmsgd2l0aC4KKwkgKiBXZSBvbmx5IGdldCBoZXJlIGlmIHdlIGhhdmUgZXh0ZW50cywgc2luY2Ugd2UgcmVtb3ZlCisJICogdGhlIGV4dGVudHMgaW4gcmV2ZXJzZSBvcmRlciB0aGUgZXh0ZW50IGNvbnRhaW5pbmcKKwkgKiBibG9jayAwIG11c3Qgc3RpbGwgYmUgdGhlcmUuCisJICovCisJZXJyb3IgPSB4ZnNfZGFfcmVhZF9idWYoKnRyYW5zLCBkcCwgMCwgLTEsICZicCwgWEZTX0FUVFJfRk9SSyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4oZXJyb3IpOworCWJsa25vID0geGZzX2RhX2Jsa25vKGJwKTsKKworCS8qCisJICogSW52YWxpZGF0ZSB0aGUgdHJlZSwgZXZlbiBpZiB0aGUgInRyZWUiIGlzIG9ubHkgYSBzaW5nbGUgbGVhZiBibG9jay4KKwkgKiBUaGlzIGlzIGEgZGVwdGgtZmlyc3QgdHJhdmVyc2FsIQorCSAqLworCWluZm8gPSBicC0+ZGF0YTsKKwlpZiAoSU5UX0dFVChpbmZvLT5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfREFfTk9ERV9NQUdJQykgeworCQllcnJvciA9IHhmc19hdHRyX25vZGVfaW5hY3RpdmUodHJhbnMsIGRwLCBicCwgMSk7CisJfSBlbHNlIGlmIChJTlRfR0VUKGluZm8tPm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19BVFRSX0xFQUZfTUFHSUMpIHsKKwkJZXJyb3IgPSB4ZnNfYXR0cl9sZWFmX2luYWN0aXZlKHRyYW5zLCBkcCwgYnApOworCX0gZWxzZSB7CisJCWVycm9yID0gWEZTX0VSUk9SKEVJTyk7CisJCXhmc19kYV9icmVsc2UoKnRyYW5zLCBicCk7CisJfQorCWlmIChlcnJvcikKKwkJcmV0dXJuKGVycm9yKTsKKworCS8qCisJICogSW52YWxpZGF0ZSB0aGUgaW5jb3JlIGNvcHkgb2YgdGhlIHJvb3QgYmxvY2suCisJICovCisJZXJyb3IgPSB4ZnNfZGFfZ2V0X2J1ZigqdHJhbnMsIGRwLCAwLCBibGtubywgJmJwLCBYRlNfQVRUUl9GT1JLKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybihlcnJvcik7CisJeGZzX2RhX2JpbnZhbCgqdHJhbnMsIGJwKTsJLyogcmVtb3ZlIGZyb20gY2FjaGUgKi8KKwkvKgorCSAqIENvbW1pdCB0aGUgaW52YWxpZGF0ZSBhbmQgc3RhcnQgdGhlIG5leHQgdHJhbnNhY3Rpb24uCisJICovCisJZXJyb3IgPSB4ZnNfYXR0cl9yb2xsdHJhbnModHJhbnMsIGRwKTsKKworCXJldHVybiAoZXJyb3IpOworfQorCisvKgorICogUmVjdXJzZSAoZ2FzcCEpIHRocm91Z2ggdGhlIGF0dHJpYnV0ZSBub2RlcyB1bnRpbCB3ZSBmaW5kIGxlYXZlcy4KKyAqIFdlJ3JlIGRvaW5nIGEgZGVwdGgtZmlyc3QgdHJhdmVyc2FsIGluIG9yZGVyIHRvIGludmFsaWRhdGUgZXZlcnl0aGluZy4KKyAqLworaW50Cit4ZnNfYXR0cl9ub2RlX2luYWN0aXZlKHhmc190cmFuc190ICoqdHJhbnMsIHhmc19pbm9kZV90ICpkcCwgeGZzX2RhYnVmX3QgKmJwLAorCQkJCSAgIGludCBsZXZlbCkKK3sKKwl4ZnNfZGFfYmxraW5mb190ICppbmZvOworCXhmc19kYV9pbnRub2RlX3QgKm5vZGU7CisJeGZzX2RhYmxrX3QgY2hpbGRfZnNiOworCXhmc19kYWRkcl90IHBhcmVudF9ibGtubywgY2hpbGRfYmxrbm87CisJaW50IGVycm9yLCBjb3VudCwgaTsKKwl4ZnNfZGFidWZfdCAqY2hpbGRfYnA7CisKKwkvKgorCSAqIFNpbmNlIHRoaXMgY29kZSBpcyByZWN1cnNpdmUgKGdhc3AhKSB3ZSBtdXN0IHByb3RlY3Qgb3Vyc2VsdmVzLgorCSAqLworCWlmIChsZXZlbCA+IFhGU19EQV9OT0RFX01BWERFUFRIKSB7CisJCXhmc19kYV9icmVsc2UoKnRyYW5zLCBicCk7CS8qIG5vIGxvY2tzIGZvciBsYXRlciB0cmFucyAqLworCQlyZXR1cm4oWEZTX0VSUk9SKEVJTykpOworCX0KKworCW5vZGUgPSBicC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChub2RlLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKQorCQkJCQkJPT0gWEZTX0RBX05PREVfTUFHSUMpOworCXBhcmVudF9ibGtubyA9IHhmc19kYV9ibGtubyhicCk7CS8qIHNhdmUgZm9yIHJlLXJlYWQgbGF0ZXIgKi8KKwljb3VudCA9IElOVF9HRVQobm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOworCWlmICghY291bnQpIHsKKwkJeGZzX2RhX2JyZWxzZSgqdHJhbnMsIGJwKTsKKwkJcmV0dXJuKDApOworCX0KKwljaGlsZF9mc2IgPSBJTlRfR0VUKG5vZGUtPmJ0cmVlWzBdLmJlZm9yZSwgQVJDSF9DT05WRVJUKTsKKwl4ZnNfZGFfYnJlbHNlKCp0cmFucywgYnApOwkvKiBubyBsb2NrcyBmb3IgbGF0ZXIgdHJhbnMgKi8KKworCS8qCisJICogSWYgdGhpcyBpcyB0aGUgbm9kZSBsZXZlbCBqdXN0IGFib3ZlIHRoZSBsZWF2ZXMsIHNpbXBseSBsb29wCisJICogb3ZlciB0aGUgbGVhdmVzIHJlbW92aW5nIGFsbCBvZiB0aGVtLiAgSWYgdGhpcyBpcyBoaWdoZXIgdXAKKwkgKiBpbiB0aGUgdHJlZSwgcmVjdXJzZSBkb3dud2FyZC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQkvKgorCQkgKiBSZWFkIHRoZSBzdWJzaWRpYXJ5IGJsb2NrIHRvIHNlZSB3aGF0IHdlIGhhdmUgdG8gd29yayB3aXRoLgorCQkgKiBEb24ndCBkbyB0aGlzIGluIGEgdHJhbnNhY3Rpb24uICBUaGlzIGlzIGEgZGVwdGgtZmlyc3QKKwkJICogdHJhdmVyc2FsIG9mIHRoZSB0cmVlIHNvIHdlIG1heSBkZWFsIHdpdGggbWFueSBibG9ja3MKKwkJICogYmVmb3JlIHdlIGNvbWUgYmFjayB0byB0aGlzIG9uZS4KKwkJICovCisJCWVycm9yID0geGZzX2RhX3JlYWRfYnVmKCp0cmFucywgZHAsIGNoaWxkX2ZzYiwgLTIsICZjaGlsZF9icCwKKwkJCQkJCVhGU19BVFRSX0ZPUkspOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4oZXJyb3IpOworCQlpZiAoY2hpbGRfYnApIHsKKwkJCQkJCS8qIHNhdmUgZm9yIHJlLXJlYWQgbGF0ZXIgKi8KKwkJCWNoaWxkX2Jsa25vID0geGZzX2RhX2Jsa25vKGNoaWxkX2JwKTsKKworCQkJLyoKKwkJCSAqIEludmFsaWRhdGUgdGhlIHN1YnRyZWUsIGhvd2V2ZXIgd2UgaGF2ZSB0by4KKwkJCSAqLworCQkJaW5mbyA9IGNoaWxkX2JwLT5kYXRhOworCQkJaWYgKElOVF9HRVQoaW5mby0+bWFnaWMsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCQk9PSBYRlNfREFfTk9ERV9NQUdJQykgeworCQkJCWVycm9yID0geGZzX2F0dHJfbm9kZV9pbmFjdGl2ZSh0cmFucywgZHAsCisJCQkJCQljaGlsZF9icCwgbGV2ZWwrMSk7CisJCQl9IGVsc2UgaWYgKElOVF9HRVQoaW5mby0+bWFnaWMsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCT09IFhGU19BVFRSX0xFQUZfTUFHSUMpIHsKKwkJCQllcnJvciA9IHhmc19hdHRyX2xlYWZfaW5hY3RpdmUodHJhbnMsIGRwLAorCQkJCQkJY2hpbGRfYnApOworCQkJfSBlbHNlIHsKKwkJCQllcnJvciA9IFhGU19FUlJPUihFSU8pOworCQkJCXhmc19kYV9icmVsc2UoKnRyYW5zLCBjaGlsZF9icCk7CisJCQl9CisJCQlpZiAoZXJyb3IpCisJCQkJcmV0dXJuKGVycm9yKTsKKworCQkJLyoKKwkJCSAqIFJlbW92ZSB0aGUgc3Vic2lkaWFyeSBibG9jayBmcm9tIHRoZSBjYWNoZQorCQkJICogYW5kIGZyb20gdGhlIGxvZy4KKwkJCSAqLworCQkJZXJyb3IgPSB4ZnNfZGFfZ2V0X2J1ZigqdHJhbnMsIGRwLCAwLCBjaGlsZF9ibGtubywKKwkJCQkmY2hpbGRfYnAsIFhGU19BVFRSX0ZPUkspOworCQkJaWYgKGVycm9yKQorCQkJCXJldHVybihlcnJvcik7CisJCQl4ZnNfZGFfYmludmFsKCp0cmFucywgY2hpbGRfYnApOworCQl9CisKKwkJLyoKKwkJICogSWYgd2UncmUgbm90IGRvbmUsIHJlLXJlYWQgdGhlIHBhcmVudCB0byBnZXQgdGhlIG5leHQKKwkJICogY2hpbGQgYmxvY2sgbnVtYmVyLgorCQkgKi8KKwkJaWYgKChpKzEpIDwgY291bnQpIHsKKwkJCWVycm9yID0geGZzX2RhX3JlYWRfYnVmKCp0cmFucywgZHAsIDAsIHBhcmVudF9ibGtubywKKwkJCQkmYnAsIFhGU19BVFRSX0ZPUkspOworCQkJaWYgKGVycm9yKQorCQkJCXJldHVybihlcnJvcik7CisJCQljaGlsZF9mc2IgPSBJTlRfR0VUKG5vZGUtPmJ0cmVlW2krMV0uYmVmb3JlLCBBUkNIX0NPTlZFUlQpOworCQkJeGZzX2RhX2JyZWxzZSgqdHJhbnMsIGJwKTsKKwkJfQorCQkvKgorCQkgKiBBdG9taWNhbGx5IGNvbW1pdCB0aGUgd2hvbGUgaW52YWxpZGF0ZSBzdHVmZi4KKwkJICovCisJCWlmICgoZXJyb3IgPSB4ZnNfYXR0cl9yb2xsdHJhbnModHJhbnMsIGRwKSkpCisJCQlyZXR1cm4gKGVycm9yKTsKKwl9CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBJbnZhbGlkYXRlIGFsbCBvZiB0aGUgInJlbW90ZSIgdmFsdWUgcmVnaW9ucyBwb2ludGVkIHRvIGJ5IGEgcGFydGljdWxhcgorICogbGVhZiBibG9jay4KKyAqIE5vdGUgdGhhdCB3ZSBtdXN0IHJlbGVhc2UgdGhlIGxvY2sgb24gdGhlIGJ1ZmZlciBzbyB0aGF0IHdlIGFyZSBub3QKKyAqIGNhdWdodCBob2xkaW5nIHNvbWV0aGluZyB0aGF0IHRoZSBsb2dnaW5nIGNvZGUgd2FudHMgdG8gZmx1c2ggdG8gZGlzay4KKyAqLworaW50Cit4ZnNfYXR0cl9sZWFmX2luYWN0aXZlKHhmc190cmFuc190ICoqdHJhbnMsIHhmc19pbm9kZV90ICpkcCwgeGZzX2RhYnVmX3QgKmJwKQoreworCXhmc19hdHRyX2xlYWZibG9ja190ICpsZWFmOworCXhmc19hdHRyX2xlYWZfZW50cnlfdCAqZW50cnk7CisJeGZzX2F0dHJfbGVhZl9uYW1lX3JlbW90ZV90ICpuYW1lX3JtdDsKKwl4ZnNfYXR0cl9pbmFjdGl2ZV9saXN0X3QgKmxpc3QsICpscDsKKwlpbnQgZXJyb3IsIGNvdW50LCBzaXplLCB0bXAsIGk7CisKKwlsZWFmID0gYnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQobGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCT09IFhGU19BVFRSX0xFQUZfTUFHSUMpOworCisJLyoKKwkgKiBDb3VudCB0aGUgbnVtYmVyIG9mICJyZW1vdGUiIHZhbHVlIGV4dGVudHMuCisJICovCisJY291bnQgPSAwOworCWVudHJ5ID0gJmxlYWYtPmVudHJpZXNbMF07CisJZm9yIChpID0gMDsgaSA8IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOyBlbnRyeSsrLCBpKyspIHsKKwkJaWYgKCAgIElOVF9HRVQoZW50cnktPm5hbWVpZHgsIEFSQ0hfQ09OVkVSVCkKKwkJICAgICYmICgoZW50cnktPmZsYWdzICYgWEZTX0FUVFJfTE9DQUwpID09IDApKSB7CisJCQluYW1lX3JtdCA9IFhGU19BVFRSX0xFQUZfTkFNRV9SRU1PVEUobGVhZiwgaSk7CisJCQlpZiAobmFtZV9ybXQtPnZhbHVlYmxrKQorCQkJCWNvdW50Kys7CisJCX0KKwl9CisKKwkvKgorCSAqIElmIHRoZXJlIGFyZSBubyAicmVtb3RlIiB2YWx1ZXMsIHdlJ3JlIGRvbmUuCisJICovCisJaWYgKGNvdW50ID09IDApIHsKKwkJeGZzX2RhX2JyZWxzZSgqdHJhbnMsIGJwKTsKKwkJcmV0dXJuKDApOworCX0KKworCS8qCisJICogQWxsb2NhdGUgc3RvcmFnZSBmb3IgYSBsaXN0IG9mIGFsbCB0aGUgInJlbW90ZSIgdmFsdWUgZXh0ZW50cy4KKwkgKi8KKwlzaXplID0gY291bnQgKiBzaXplb2YoeGZzX2F0dHJfaW5hY3RpdmVfbGlzdF90KTsKKwlsaXN0ID0gKHhmc19hdHRyX2luYWN0aXZlX2xpc3RfdCAqKWttZW1fYWxsb2Moc2l6ZSwgS01fU0xFRVApOworCisJLyoKKwkgKiBJZGVudGlmeSBlYWNoIG9mIHRoZSAicmVtb3RlIiB2YWx1ZSBleHRlbnRzLgorCSAqLworCWxwID0gbGlzdDsKKwllbnRyeSA9ICZsZWFmLT5lbnRyaWVzWzBdOworCWZvciAoaSA9IDA7IGkgPCBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKTsgZW50cnkrKywgaSsrKSB7CisJCWlmICggICBJTlRfR0VUKGVudHJ5LT5uYW1laWR4LCBBUkNIX0NPTlZFUlQpCisJCSAgICAmJiAoKGVudHJ5LT5mbGFncyAmIFhGU19BVFRSX0xPQ0FMKSA9PSAwKSkgeworCQkJbmFtZV9ybXQgPSBYRlNfQVRUUl9MRUFGX05BTUVfUkVNT1RFKGxlYWYsIGkpOworCQkJaWYgKG5hbWVfcm10LT52YWx1ZWJsaykgeworCQkJCS8qIGJvdGggb24tZGlzaywgZG9uJ3QgZW5kaWFuIGZsaXAgdHdpY2UgKi8KKwkJCQlscC0+dmFsdWVibGsgPSBuYW1lX3JtdC0+dmFsdWVibGs7CisJCQkJSU5UX1NFVChscC0+dmFsdWVsZW4sIEFSQ0hfQ09OVkVSVCwKKwkJCQkJCVhGU19CX1RPX0ZTQihkcC0+aV9tb3VudCwKKwkJCQkJCSAgICBJTlRfR0VUKG5hbWVfcm10LT52YWx1ZWxlbiwKKwkJCQkJCQkgICAgICBBUkNIX0NPTlZFUlQpKSk7CisJCQkJbHArKzsKKwkJCX0KKwkJfQorCX0KKwl4ZnNfZGFfYnJlbHNlKCp0cmFucywgYnApOwkvKiB1bmxvY2sgZm9yIHRyYW5zLiBpbiBmcmVleHRlbnQoKSAqLworCisJLyoKKwkgKiBJbnZhbGlkYXRlIGVhY2ggb2YgdGhlICJyZW1vdGUiIHZhbHVlIGV4dGVudHMuCisJICovCisJZXJyb3IgPSAwOworCWZvciAobHAgPSBsaXN0LCBpID0gMDsgaSA8IGNvdW50OyBpKyssIGxwKyspIHsKKwkJdG1wID0geGZzX2F0dHJfbGVhZl9mcmVleHRlbnQodHJhbnMsIGRwLAorCQkJCQkJICAgICBJTlRfR0VUKGxwLT52YWx1ZWJsaywKKwkJCQkJCQkJQVJDSF9DT05WRVJUKSwKKwkJCQkJCSAgICAgSU5UX0dFVChscC0+dmFsdWVsZW4sCisJCQkJCQkJCUFSQ0hfQ09OVkVSVCkpOworCQlpZiAoZXJyb3IgPT0gMCkKKwkJCWVycm9yID0gdG1wOwkvKiBzYXZlIG9ubHkgdGhlIDFzdCBlcnJubyAqLworCX0KKworCWttZW1fZnJlZSgoeGZzX2NhZGRyX3QpbGlzdCwgc2l6ZSk7CisJcmV0dXJuKGVycm9yKTsKK30KKworLyoKKyAqIExvb2sgYXQgYWxsIHRoZSBleHRlbnRzIGZvciB0aGlzIGxvZ2ljYWwgcmVnaW9uLAorICogaW52YWxpZGF0ZSBhbnkgYnVmZmVycyB0aGF0IGFyZSBpbmNvcmUvaW4gdHJhbnNhY3Rpb25zLgorICovCitpbnQKK3hmc19hdHRyX2xlYWZfZnJlZXh0ZW50KHhmc190cmFuc190ICoqdHJhbnMsIHhmc19pbm9kZV90ICpkcCwKKwkJCQkgICAgeGZzX2RhYmxrX3QgYmxrbm8sIGludCBibGtjbnQpCit7CisJeGZzX2JtYnRfaXJlY190IG1hcDsKKwl4ZnNfZGFibGtfdCB0Ymxrbm87CisJaW50IHRibGtjbnQsIGRibGtjbnQsIG5tYXAsIGVycm9yOworCXhmc19kYWRkcl90IGRibGtubzsKKwl4ZnNfYnVmX3QgKmJwOworCisJLyoKKwkgKiBSb2xsIHRocm91Z2ggdGhlICJ2YWx1ZSIsIGludmFsaWRhdGluZyB0aGUgYXR0cmlidXRlIHZhbHVlJ3MKKwkgKiBibG9ja3MuCisJICovCisJdGJsa25vID0gYmxrbm87CisJdGJsa2NudCA9IGJsa2NudDsKKwl3aGlsZSAodGJsa2NudCA+IDApIHsKKwkJLyoKKwkJICogVHJ5IHRvIHJlbWVtYmVyIHdoZXJlIHdlIGRlY2lkZWQgdG8gcHV0IHRoZSB2YWx1ZS4KKwkJICovCisJCW5tYXAgPSAxOworCQllcnJvciA9IHhmc19ibWFwaSgqdHJhbnMsIGRwLCAoeGZzX2ZpbGVvZmZfdCl0Ymxrbm8sIHRibGtjbnQsCisJCQkJCVhGU19CTUFQSV9BVFRSRk9SSyB8IFhGU19CTUFQSV9NRVRBREFUQSwKKwkJCQkJTlVMTCwgMCwgJm1hcCwgJm5tYXAsIE5VTEwpOworCQlpZiAoZXJyb3IpIHsKKwkJCXJldHVybihlcnJvcik7CisJCX0KKwkJQVNTRVJUKG5tYXAgPT0gMSk7CisJCUFTU0VSVChtYXAuYnJfc3RhcnRibG9jayAhPSBERUxBWVNUQVJUQkxPQ0spOworCisJCS8qCisJCSAqIElmIGl0J3MgYSBob2xlLCB0aGVzZSBhcmUgYWxyZWFkeSB1bm1hcHBlZAorCQkgKiBzbyB0aGVyZSdzIG5vdGhpbmcgdG8gaW52YWxpZGF0ZS4KKwkJICovCisJCWlmIChtYXAuYnJfc3RhcnRibG9jayAhPSBIT0xFU1RBUlRCTE9DSykgeworCisJCQlkYmxrbm8gPSBYRlNfRlNCX1RPX0RBRERSKGRwLT5pX21vdW50LAorCQkJCQkJICBtYXAuYnJfc3RhcnRibG9jayk7CisJCQlkYmxrY250ID0gWEZTX0ZTQl9UT19CQihkcC0+aV9tb3VudCwKKwkJCQkJCW1hcC5icl9ibG9ja2NvdW50KTsKKwkJCWJwID0geGZzX3RyYW5zX2dldF9idWYoKnRyYW5zLAorCQkJCQlkcC0+aV9tb3VudC0+bV9kZGV2X3RhcmdwLAorCQkJCQlkYmxrbm8sIGRibGtjbnQsIFhGU19CVUZfTE9DSyk7CisJCQl4ZnNfdHJhbnNfYmludmFsKCp0cmFucywgYnApOworCQkJLyoKKwkJCSAqIFJvbGwgdG8gbmV4dCB0cmFuc2FjdGlvbi4KKwkJCSAqLworCQkJaWYgKChlcnJvciA9IHhmc19hdHRyX3JvbGx0cmFucyh0cmFucywgZHApKSkKKwkJCQlyZXR1cm4gKGVycm9yKTsKKwkJfQorCisJCXRibGtubyArPSBtYXAuYnJfYmxvY2tjb3VudDsKKwkJdGJsa2NudCAtPSBtYXAuYnJfYmxvY2tjb3VudDsKKwl9CisKKwlyZXR1cm4oMCk7Cit9CisKKworLyoKKyAqIFJvbGwgZnJvbSBvbmUgdHJhbnMgaW4gdGhlIHNlcXVlbmNlIG9mIFBFUk1BTkVOVCB0cmFuc2FjdGlvbnMgdG8gdGhlIG5leHQuCisgKi8KK2ludAoreGZzX2F0dHJfcm9sbHRyYW5zKHhmc190cmFuc190ICoqdHJhbnNwLCB4ZnNfaW5vZGVfdCAqZHApCit7CisJeGZzX3RyYW5zX3QgKnRyYW5zOworCXVuc2lnbmVkIGludCBsb2dyZXMsIGNvdW50OworCWludAllcnJvcjsKKworCS8qCisJICogRW5zdXJlIHRoYXQgdGhlIGlub2RlIGlzIGFsd2F5cyBsb2dnZWQuCisJICovCisJdHJhbnMgPSAqdHJhbnNwOworCXhmc190cmFuc19sb2dfaW5vZGUodHJhbnMsIGRwLCBYRlNfSUxPR19DT1JFKTsKKworCS8qCisJICogQ29weSB0aGUgY3JpdGljYWwgcGFyYW1ldGVycyBmcm9tIG9uZSB0cmFucyB0byB0aGUgbmV4dC4KKwkgKi8KKwlsb2dyZXMgPSB0cmFucy0+dF9sb2dfcmVzOworCWNvdW50ID0gdHJhbnMtPnRfbG9nX2NvdW50OworCSp0cmFuc3AgPSB4ZnNfdHJhbnNfZHVwKHRyYW5zKTsKKworCS8qCisJICogQ29tbWl0IHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLgorCSAqIElmIHRoaXMgY29tbWl0IGZhaWxlZCwgdGhlbiBpdCdkIGp1c3QgdW5sb2NrIHRob3NlIGl0ZW1zIHRoYXQKKwkgKiBhcmUgbm90IG1hcmtlZCBpaG9sZC4gVGhhdCBhbHNvIG1lYW5zIHRoYXQgYSBmaWxlc3lzdGVtIHNodXRkb3duCisJICogaXMgaW4gcHJvZ3Jlc3MuIFRoZSBjYWxsZXIgdGFrZXMgdGhlIHJlc3BvbnNpYmlsaXR5IHRvIGNhbmNlbAorCSAqIHRoZSBkdXBsaWNhdGUgdHJhbnNhY3Rpb24gdGhhdCBnZXRzIHJldHVybmVkLgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfdHJhbnNfY29tbWl0KHRyYW5zLCAwLCBOVUxMKSkpCisJCXJldHVybiAoZXJyb3IpOworCisJdHJhbnMgPSAqdHJhbnNwOworCisJLyoKKwkgKiBSZXNlcnZlIHNwYWNlIGluIHRoZSBsb2cgZm9yIHRoIG5leHQgdHJhbnNhY3Rpb24uCisJICogVGhpcyBhbHNvIHB1c2hlcyBpdGVtcyBpbiB0aGUgIkFJTCIsIHRoZSBsaXN0IG9mIGxvZ2dlZCBpdGVtcywKKwkgKiBvdXQgdG8gZGlzayBpZiB0aGV5IGFyZSB0YWtpbmcgdXAgc3BhY2UgYXQgdGhlIHRhaWwgb2YgdGhlIGxvZworCSAqIHRoYXQgd2Ugd2FudCB0byB1c2UuICBUaGlzIHJlcXVpcmVzIHRoYXQgZWl0aGVyIG5vdGhpbmcgYmUgbG9ja2VkCisJICogYWNyb3NzIHRoaXMgY2FsbCwgb3IgdGhhdCBhbnl0aGluZyB0aGF0IGlzIGxvY2tlZCBiZSBsb2dnZWQgaW4KKwkgKiB0aGUgcHJpb3IgYW5kIHRoZSBuZXh0IHRyYW5zYWN0aW9ucy4KKwkgKi8KKwllcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRyYW5zLCAwLCBsb2dyZXMsIDAsCisJCQkJICBYRlNfVFJBTlNfUEVSTV9MT0dfUkVTLCBjb3VudCk7CisJLyoKKwkgKiAgRW5zdXJlIHRoYXQgdGhlIGlub2RlIGlzIGluIHRoZSBuZXcgdHJhbnNhY3Rpb24gYW5kIGxvY2tlZC4KKwkgKi8KKwlpZiAoIWVycm9yKSB7CisJCXhmc190cmFuc19pam9pbih0cmFucywgZHAsIFhGU19JTE9DS19FWENMKTsKKwkJeGZzX3RyYW5zX2lob2xkKHRyYW5zLCBkcCk7CisJfQorCXJldHVybiAoZXJyb3IpOworCit9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2F0dHJfbGVhZi5oIGIvZnMveGZzL3hmc19hdHRyX2xlYWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTQ4MGUwCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19hdHRyX2xlYWYuaApAQCAtMCwwICsxLDMwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMi0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfQVRUUl9MRUFGX0hfXworI2RlZmluZQlfX1hGU19BVFRSX0xFQUZfSF9fCisKKy8qCisgKiBBdHRyaWJ1dGUgc3RvcmFnZSBsYXlvdXQsIGludGVybmFsIHN0cnVjdHVyZSwgYWNjZXNzIG1hY3JvcywgZXRjLgorICoKKyAqIEF0dHJpYnV0ZSBsaXN0cyBhcmUgc3RydWN0dXJlZCBhcm91bmQgQnRyZWVzIHdoZXJlIGFsbCB0aGUgZGF0YQorICogZWxlbWVudHMgYXJlIGluIHRoZSBsZWFmIG5vZGVzLiAgQXR0cmlidXRlIG5hbWVzIGFyZSBoYXNoZWQgaW50byBhbiBpbnQsCisgKiB0aGVuIHRoYXQgaW50IGlzIHVzZWQgYXMgdGhlIGluZGV4IGludG8gdGhlIEJ0cmVlLiAgU2luY2UgdGhlIGhhc2h2YWwKKyAqIG9mIGFuIGF0dHJpYnV0ZSBuYW1lIG1heSBub3QgYmUgdW5pcXVlLCB3ZSBtYXkgaGF2ZSBkdXBsaWNhdGUga2V5cy4gIFRoZQorICogaW50ZXJuYWwgbGlua3MgaW4gdGhlIEJ0cmVlIGFyZSBsb2dpY2FsIGJsb2NrIG9mZnNldHMgaW50byB0aGUgZmlsZS4KKyAqLworCitzdHJ1Y3QgYXR0cmxpc3Q7CitzdHJ1Y3QgYXR0cmxpc3RfY3Vyc29yX2tlcm47CitzdHJ1Y3QgYXR0cm5hbWVzOworc3RydWN0IHhmc19kYWJ1ZjsKK3N0cnVjdCB4ZnNfZGFfYXJnczsKK3N0cnVjdCB4ZnNfZGFfc3RhdGU7CitzdHJ1Y3QgeGZzX2RhX3N0YXRlX2JsazsKK3N0cnVjdCB4ZnNfaW5vZGU7CitzdHJ1Y3QgeGZzX3RyYW5zOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQXR0cmlidXRlIHN0cnVjdHVyZSB3aGVuIGVxdWFsIHRvIFhGU19MQlNJWkUobXApIGJ5dGVzLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICogVGhpcyBpcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBsZWFmIG5vZGVzIGluIHRoZSBCdHJlZS4KKyAqCisgKiBTdHJ1Y3QgbGVhZl9lbnRyeSdzIGFyZSBwYWNrZWQgZnJvbSB0aGUgdG9wLiAgTmFtZS92YWx1ZXMgZ3JvdyBmcm9tIHRoZQorICogYm90dG9tIGJ1dCBhcmUgbm90IHBhY2tlZC4gIFRoZSBmcmVlbWFwIGNvbnRhaW5zIHJ1bi1sZW5ndGgtZW5jb2RlZCBlbnRyaWVzCisgKiBmb3IgdGhlIGZyZWUgYnl0ZXMgYWZ0ZXIgdGhlIGxlYWZfZW50cnkncywgYnV0IG9ubHkgdGhlIE4gbGFyZ2VzdCBzdWNoLAorICogc21hbGxlciBydW5zIGFyZSBkcm9wcGVkLiAgV2hlbiB0aGUgZnJlZW1hcCBkb2Vzbid0IHNob3cgZW5vdWdoIHNwYWNlCisgKiBmb3IgYW4gYWxsb2NhdGlvbiwgd2UgY29tcGFjdCB0aGUgbmFtZS92YWx1ZSBhcmVhIGFuZCB0cnkgYWdhaW4uICBJZiB3ZQorICogc3RpbGwgZG9uJ3QgaGF2ZSBlbm91Z2ggc3BhY2UsIHRoZW4gd2UgaGF2ZSB0byBzcGxpdCB0aGUgYmxvY2suICBUaGUKKyAqIG5hbWUvdmFsdWUgc3RydWN0cyAoYm90aCBsb2NhbCBhbmQgcmVtb3RlIHZlcnNpb25zKSBtdXN0IGJlIDMyYml0IGFsaWduZWQuCisgKgorICogU2luY2Ugd2UgaGF2ZSBkdXBsaWNhdGUgaGFzaCBrZXlzLCBmb3IgZWFjaCBrZXkgdGhhdCBtYXRjaGVzLCBjb21wYXJlCisgKiB0aGUgYWN0dWFsIG5hbWUgc3RyaW5nLiAgVGhlIHJvb3QgYW5kIGludGVybWVkaWF0ZSBub2RlIHNlYXJjaCBhbHdheXMKKyAqIHRha2VzIHRoZSBmaXJzdC1pbi10aGUtYmxvY2sga2V5IG1hdGNoIGZvdW5kLCBzbyB3ZSBzaG91bGQgb25seSBoYXZlCisgKiB0byB3b3JrICJmb3J3ImFyZC4gIElmIG5vbmUgbWF0Y2hlcywgY29udGludWUgd2l0aCB0aGUgImZvcnciYXJkIGxlYWYKKyAqIG5vZGVzIHVudGlsIHRoZSBoYXNoIGtleSBjaGFuZ2VzIG9yIHRoZSBhdHRyaWJ1dGUgbmFtZSBpcyBmb3VuZC4KKyAqCisgKiBXZSBzdG9yZSB0aGUgZmFjdCB0aGF0IGFuIGF0dHJpYnV0ZSBpcyBhIFJPT1QvVVNFUi9TRUNVUkUgYXR0cmlidXRlIGluCisgKiB0aGUgbGVhZl9lbnRyeS4gIFRoZSBuYW1lc3BhY2VzIGFyZSBpbmRlcGVuZGVudCBvbmx5IGJlY2F1c2Ugd2UgYWxzbyBsb29rCisgKiBhdCB0aGUgbmFtZXNwYWNlIGJpdCB3aGVuIHdlIGFyZSBsb29raW5nIGZvciBhIG1hdGNoaW5nIGF0dHJpYnV0ZSBuYW1lLgorICoKKyAqIFdlIGFsc28gc3RvcmUgYSAiaW5jb21wbGV0ZSIgYml0IGluIHRoZSBsZWFmX2VudHJ5LiAgSXQgc2hvd3MgdGhhdCBhbgorICogYXR0cmlidXRlIGlzIGluIHRoZSBtaWRkbGUgb2YgYmVpbmcgY3JlYXRlZCBhbmQgc2hvdWxkIG5vdCBiZSBzaG93biB0bworICogdGhlIHVzZXIgaWYgd2UgY3Jhc2ggZHVyaW5nIHRoZSB0aW1lIHRoYXQgdGhlIGJpdCBpcyBzZXQuICBXZSBjbGVhciB0aGUKKyAqIGJpdCB3aGVuIHdlIGhhdmUgZmluaXNoZWQgc2V0dGluZyB1cCB0aGUgYXR0cmlidXRlLiAgV2UgZG8gdGhpcyBiZWNhdXNlCisgKiB3ZSBjYW5ub3QgY3JlYXRlIHNvbWUgbGFyZ2UgYXR0cmlidXRlcyBpbnNpZGUgYSBzaW5nbGUgdHJhbnNhY3Rpb24sIGFuZCB3ZQorICogbmVlZCBzb21lIGluZGljYXRpb24gdGhhdCB3ZSB3ZXJlbid0IGZpbmlzaGVkIGlmIHdlIGNyYXNoIGluIHRoZSBtaWRkbGUuCisgKi8KKyNkZWZpbmUgWEZTX0FUVFJfTEVBRl9NQVBTSVpFCTMJLyogaG93IG1hbnkgZnJlZXNwYWNlIHNsb3RzICovCisKK3R5cGVkZWYgc3RydWN0IHhmc19hdHRyX2xlYWZibG9jayB7CisJc3RydWN0IHhmc19hdHRyX2xlYWZfaGRyIHsJLyogY29uc3RhbnQtc3RydWN0dXJlIGhlYWRlciBibG9jayAqLworCQl4ZnNfZGFfYmxraW5mb190IGluZm87CS8qIGJsb2NrIHR5cGUsIGxpbmtzLCBldGMuICovCisJCV9fdWludDE2X3QgY291bnQ7CS8qIGNvdW50IG9mIGFjdGl2ZSBsZWFmX2VudHJ5J3MgKi8KKwkJX191aW50MTZfdCB1c2VkYnl0ZXM7CS8qIG51bSBieXRlcyBvZiBuYW1lcy92YWx1ZXMgc3RvcmVkICovCisJCV9fdWludDE2X3QgZmlyc3R1c2VkOwkvKiBmaXJzdCB1c2VkIGJ5dGUgaW4gbmFtZSBhcmVhICovCisJCV9fdWludDhfdCAgaG9sZXM7CS8qICE9IDAgaWYgYmxrIG5lZWRzIGNvbXBhY3Rpb24gKi8KKwkJX191aW50OF90ICBwYWQxOworCQlzdHJ1Y3QgeGZzX2F0dHJfbGVhZl9tYXAgewkgIC8qIFJMRSBtYXAgb2YgZnJlZSBieXRlcyAqLworCQkJX191aW50MTZfdCBiYXNlOwkgIC8qIGJhc2Ugb2YgZnJlZSByZWdpb24gKi8KKwkJCV9fdWludDE2X3Qgc2l6ZTsJICAvKiBsZW5ndGggb2YgZnJlZSByZWdpb24gKi8KKwkJfSBmcmVlbWFwW1hGU19BVFRSX0xFQUZfTUFQU0laRV07IC8qIE4gbGFyZ2VzdCBmcmVlIHJlZ2lvbnMgKi8KKwl9IGhkcjsKKwlzdHJ1Y3QgeGZzX2F0dHJfbGVhZl9lbnRyeSB7CS8qIHNvcnRlZCBvbiBrZXksIG5vdCBuYW1lICovCisJCXhmc19kYWhhc2hfdCBoYXNodmFsOwkvKiBoYXNoIHZhbHVlIG9mIG5hbWUgKi8KKwkJX191aW50MTZfdCBuYW1laWR4OwkvKiBpbmRleCBpbnRvIGJ1ZmZlciBvZiBuYW1lL3ZhbHVlICovCisJCV9fdWludDhfdCBmbGFnczsJLyogTE9DQUwvUk9PVC9TRUNVUkUvSU5DT01QTEVURSBmbGFnICovCisJCV9fdWludDhfdCBwYWQyOwkJLyogdW51c2VkIHBhZCBieXRlICovCisJfSBlbnRyaWVzWzFdOwkJCS8qIHZhcmlhYmxlIHNpemVkIGFycmF5ICovCisJc3RydWN0IHhmc19hdHRyX2xlYWZfbmFtZV9sb2NhbCB7CisJCV9fdWludDE2X3QgdmFsdWVsZW47CS8qIG51bWJlciBvZiBieXRlcyBpbiB2YWx1ZSAqLworCQlfX3VpbnQ4X3QgbmFtZWxlbjsJLyogbGVuZ3RoIG9mIG5hbWUgYnl0ZXMgKi8KKwkJX191aW50OF90IG5hbWV2YWxbMV07CS8qIG5hbWUvdmFsdWUgYnl0ZXMgKi8KKwl9IG5hbWVsaXN0OwkJCS8qIGdyb3dzIGZyb20gYm90dG9tIG9mIGJ1ZiAqLworCXN0cnVjdCB4ZnNfYXR0cl9sZWFmX25hbWVfcmVtb3RlIHsKKwkJeGZzX2RhYmxrX3QgdmFsdWVibGs7CS8qIGJsb2NrIG51bWJlciBvZiB2YWx1ZSBieXRlcyAqLworCQlfX3VpbnQzMl90IHZhbHVlbGVuOwkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gdmFsdWUgKi8KKwkJX191aW50OF90IG5hbWVsZW47CS8qIGxlbmd0aCBvZiBuYW1lIGJ5dGVzICovCisJCV9fdWludDhfdCBuYW1lWzFdOwkvKiBuYW1lIGJ5dGVzICovCisJfSB2YWx1ZWxpc3Q7CQkJLyogZ3Jvd3MgZnJvbSBib3R0b20gb2YgYnVmICovCit9IHhmc19hdHRyX2xlYWZibG9ja190OwordHlwZWRlZiBzdHJ1Y3QgeGZzX2F0dHJfbGVhZl9oZHIgeGZzX2F0dHJfbGVhZl9oZHJfdDsKK3R5cGVkZWYgc3RydWN0IHhmc19hdHRyX2xlYWZfbWFwIHhmc19hdHRyX2xlYWZfbWFwX3Q7Cit0eXBlZGVmIHN0cnVjdCB4ZnNfYXR0cl9sZWFmX2VudHJ5IHhmc19hdHRyX2xlYWZfZW50cnlfdDsKK3R5cGVkZWYgc3RydWN0IHhmc19hdHRyX2xlYWZfbmFtZV9sb2NhbCB4ZnNfYXR0cl9sZWFmX25hbWVfbG9jYWxfdDsKK3R5cGVkZWYgc3RydWN0IHhmc19hdHRyX2xlYWZfbmFtZV9yZW1vdGUgeGZzX2F0dHJfbGVhZl9uYW1lX3JlbW90ZV90OworCisvKgorICogRmxhZ3MgdXNlZCBpbiB0aGUgbGVhZl9lbnRyeVtpXS5mbGFncyBmaWVsZC4KKyAqIE5PVEU6IHRoZSBJTkNPTVBMRVRFIGJpdCBtdXN0IG5vdCBjb2xsaWRlIHdpdGggdGhlIGZsYWdzIGJpdHMgc3BlY2lmaWVkCisgKiBvbiB0aGUgc3lzdGVtIGNhbGwsIHRoZXkgYXJlICJvciJlZCB0b2dldGhlciBmb3IgdmFyaW91cyBvcGVyYXRpb25zLgorICovCisjZGVmaW5lCVhGU19BVFRSX0xPQ0FMX0JJVAkwCS8qIGF0dHIgaXMgc3RvcmVkIGxvY2FsbHkgKi8KKyNkZWZpbmUJWEZTX0FUVFJfUk9PVF9CSVQJMQkvKiBsaW1pdCBhY2Nlc3MgdG8gdHJ1c3RlZCBhdHRycyAqLworI2RlZmluZQlYRlNfQVRUUl9TRUNVUkVfQklUCTIJLyogbGltaXQgYWNjZXNzIHRvIHNlY3VyZSBhdHRycyAqLworI2RlZmluZQlYRlNfQVRUUl9JTkNPTVBMRVRFX0JJVAk3CS8qIGF0dHIgaW4gbWlkZGxlIG9mIGNyZWF0ZS9kZWxldGUgKi8KKyNkZWZpbmUgWEZTX0FUVFJfTE9DQUwJCSgxIDw8IFhGU19BVFRSX0xPQ0FMX0JJVCkKKyNkZWZpbmUgWEZTX0FUVFJfUk9PVAkJKDEgPDwgWEZTX0FUVFJfUk9PVF9CSVQpCisjZGVmaW5lIFhGU19BVFRSX1NFQ1VSRQkJKDEgPDwgWEZTX0FUVFJfU0VDVVJFX0JJVCkKKyNkZWZpbmUgWEZTX0FUVFJfSU5DT01QTEVURQkoMSA8PCBYRlNfQVRUUl9JTkNPTVBMRVRFX0JJVCkKKworLyoKKyAqIEFsaWdubWVudCBmb3IgbmFtZWxpc3QgYW5kIHZhbHVlbGlzdCBlbnRyaWVzIChzaW5jZSB0aGV5IGFyZSBtaXhlZAorICogdGhlcmUgY2FuIGJlIG9ubHkgb25lIGFsaWdubWVudCB2YWx1ZSkKKyAqLworI2RlZmluZQlYRlNfQVRUUl9MRUFGX05BTUVfQUxJR04JKCh1aW50KXNpemVvZih4ZnNfZGFibGtfdCkpCisKKy8qCisgKiBDYXN0IHR5cGVkIHBvaW50ZXJzIGZvciAibG9jYWwiIGFuZCAicmVtb3RlIiBuYW1lL3ZhbHVlIHN0cnVjdHMuCisgKi8KKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0FUVFJfTEVBRl9OQU1FX1JFTU9URSkKK3hmc19hdHRyX2xlYWZfbmFtZV9yZW1vdGVfdCAqCit4ZnNfYXR0cl9sZWFmX25hbWVfcmVtb3RlKHhmc19hdHRyX2xlYWZibG9ja190ICpsZWFmcCwgaW50IGlkeCk7CisjZGVmaW5lIFhGU19BVFRSX0xFQUZfTkFNRV9SRU1PVEUobGVhZnAsaWR4KQlcCisJeGZzX2F0dHJfbGVhZl9uYW1lX3JlbW90ZShsZWFmcCxpZHgpCisjZWxzZQorI2RlZmluZSBYRlNfQVRUUl9MRUFGX05BTUVfUkVNT1RFKGxlYWZwLGlkeCkJLyogcmVtb3RlIG5hbWUgc3RydWN0IHB0ciAqLyBcCisJKCh4ZnNfYXR0cl9sZWFmX25hbWVfcmVtb3RlX3QgKikJCVwKKwkgJigoY2hhciAqKShsZWFmcCkpWyBJTlRfR0VUKChsZWFmcCktPmVudHJpZXNbaWR4XS5uYW1laWR4LCBBUkNIX0NPTlZFUlQpIF0pCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0FUVFJfTEVBRl9OQU1FX0xPQ0FMKQoreGZzX2F0dHJfbGVhZl9uYW1lX2xvY2FsX3QgKgoreGZzX2F0dHJfbGVhZl9uYW1lX2xvY2FsKHhmc19hdHRyX2xlYWZibG9ja190ICpsZWFmcCwgaW50IGlkeCk7CisjZGVmaW5lIFhGU19BVFRSX0xFQUZfTkFNRV9MT0NBTChsZWFmcCxpZHgpCVwKKwl4ZnNfYXR0cl9sZWFmX25hbWVfbG9jYWwobGVhZnAsaWR4KQorI2Vsc2UKKyNkZWZpbmUgWEZTX0FUVFJfTEVBRl9OQU1FX0xPQ0FMKGxlYWZwLGlkeCkJLyogbG9jYWwgbmFtZSBzdHJ1Y3QgcHRyICovIFwKKwkoKHhmc19hdHRyX2xlYWZfbmFtZV9sb2NhbF90ICopCQlcCisJICYoKGNoYXIgKikobGVhZnApKVsgSU5UX0dFVCgobGVhZnApLT5lbnRyaWVzW2lkeF0ubmFtZWlkeCwgQVJDSF9DT05WRVJUKSBdKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BVFRSX0xFQUZfTkFNRSkKK2NoYXIgKnhmc19hdHRyX2xlYWZfbmFtZSh4ZnNfYXR0cl9sZWFmYmxvY2tfdCAqbGVhZnAsIGludCBpZHgpOworI2RlZmluZSBYRlNfQVRUUl9MRUFGX05BTUUobGVhZnAsaWR4KQkJeGZzX2F0dHJfbGVhZl9uYW1lKGxlYWZwLGlkeCkKKyNlbHNlCisjZGVmaW5lIFhGU19BVFRSX0xFQUZfTkFNRShsZWFmcCxpZHgpCQkvKiBnZW5lcmljIG5hbWUgc3RydWN0IHB0ciAqLyBcCisJKCYoKGNoYXIgKikobGVhZnApKVsgSU5UX0dFVCgobGVhZnApLT5lbnRyaWVzW2lkeF0ubmFtZWlkeCwgQVJDSF9DT05WRVJUKSBdKQorI2VuZGlmCisKKy8qCisgKiBDYWxjdWxhdGUgdG90YWwgYnl0ZXMgdXNlZCAoaW5jbHVkaW5nIHRyYWlsaW5nIHBhZCBmb3IgYWxpZ25tZW50KSBmb3IKKyAqIGEgImxvY2FsIiBuYW1lL3ZhbHVlIHN0cnVjdHVyZSwgYSAicmVtb3RlIiBuYW1lL3ZhbHVlIHN0cnVjdHVyZSwgYW5kCisgKiBhIHBvaW50ZXIgd2hpY2ggbWlnaHQgYmUgZWl0aGVyLgorICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BVFRSX0xFQUZfRU5UU0laRV9SRU1PVEUpCitpbnQgeGZzX2F0dHJfbGVhZl9lbnRzaXplX3JlbW90ZShpbnQgbmxlbik7CisjZGVmaW5lIFhGU19BVFRSX0xFQUZfRU5UU0laRV9SRU1PVEUobmxlbikJXAorCXhmc19hdHRyX2xlYWZfZW50c2l6ZV9yZW1vdGUobmxlbikKKyNlbHNlCisjZGVmaW5lIFhGU19BVFRSX0xFQUZfRU5UU0laRV9SRU1PVEUobmxlbikJLyogc3BhY2UgZm9yIHJlbW90ZSBzdHJ1Y3QgKi8gXAorCSgoKHVpbnQpc2l6ZW9mKHhmc19hdHRyX2xlYWZfbmFtZV9yZW1vdGVfdCkgLSAxICsgKG5sZW4pICsgXAorCSAgWEZTX0FUVFJfTEVBRl9OQU1FX0FMSUdOIC0gMSkgJiB+KFhGU19BVFRSX0xFQUZfTkFNRV9BTElHTiAtIDEpKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BVFRSX0xFQUZfRU5UU0laRV9MT0NBTCkKK2ludCB4ZnNfYXR0cl9sZWFmX2VudHNpemVfbG9jYWwoaW50IG5sZW4sIGludCB2bGVuKTsKKyNkZWZpbmUgWEZTX0FUVFJfTEVBRl9FTlRTSVpFX0xPQ0FMKG5sZW4sdmxlbikJXAorCXhmc19hdHRyX2xlYWZfZW50c2l6ZV9sb2NhbChubGVuLHZsZW4pCisjZWxzZQorI2RlZmluZSBYRlNfQVRUUl9MRUFGX0VOVFNJWkVfTE9DQUwobmxlbix2bGVuKQkvKiBzcGFjZSBmb3IgbG9jYWwgc3RydWN0ICovIFwKKwkoKCh1aW50KXNpemVvZih4ZnNfYXR0cl9sZWFmX25hbWVfbG9jYWxfdCkgLSAxICsgKG5sZW4pICsgKHZsZW4pICsgXAorCSAgWEZTX0FUVFJfTEVBRl9OQU1FX0FMSUdOIC0gMSkgJiB+KFhGU19BVFRSX0xFQUZfTkFNRV9BTElHTiAtIDEpKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BVFRSX0xFQUZfRU5UU0laRV9MT0NBTF9NQVgpCitpbnQgeGZzX2F0dHJfbGVhZl9lbnRzaXplX2xvY2FsX21heChpbnQgYnNpemUpOworI2RlZmluZSBYRlNfQVRUUl9MRUFGX0VOVFNJWkVfTE9DQUxfTUFYKGJzaXplKQlcCisJeGZzX2F0dHJfbGVhZl9lbnRzaXplX2xvY2FsX21heChic2l6ZSkKKyNlbHNlCisjZGVmaW5lIFhGU19BVFRSX0xFQUZfRU5UU0laRV9MT0NBTF9NQVgoYnNpemUpCS8qIG1heCBsb2NhbCBzdHJ1Y3Qgc2l6ZSAqLyBcCisJKCgoYnNpemUpID4+IDEpICsgKChic2l6ZSkgPj4gMikpCisjZW5kaWYKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU3RydWN0dXJlIHVzZWQgdG8gcGFzcyBjb250ZXh0IGFyb3VuZCBhbW9uZyB0aGUgcm91dGluZXMuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3R5cGVkZWYgc3RydWN0IHhmc19hdHRyX2xpc3RfY29udGV4dCB7CisJc3RydWN0IHhmc19pbm9kZQkJKmRwOwkvKiBpbm9kZSAqLworCXN0cnVjdCBhdHRybGlzdF9jdXJzb3Jfa2VybgkqY3Vyc29yOy8qIHBvc2l0aW9uIGluIGxpc3QgKi8KKwlzdHJ1Y3QgYXR0cmxpc3QJCQkqYWxpc3Q7CS8qIG91dHB1dCBidWZmZXIgKi8KKwlpbnQJCQkJY291bnQ7CS8qIG51bSB1c2VkIGVudHJpZXMgKi8KKwlpbnQJCQkJZHVwY250OwkvKiBjb3VudCBkdXAgaGFzaHZhbHMgc2VlbiAqLworCWludAkJCQlidWZzaXplOy8qIHRvdGFsIGJ1ZmZlciBzaXplICovCisJaW50CQkJCWZpcnN0dTsJLyogZmlyc3QgdXNlZCBieXRlIGluIGJ1ZmZlciAqLworCWludAkJCQlmbGFnczsJLyogZnJvbSBWT1AgY2FsbCAqLworCWludAkJCQlyZXN5bmNoOy8qIFQvRjogcmVzeW5jaCB3aXRoIGN1cnNvciAqLworfSB4ZnNfYXR0cl9saXN0X2NvbnRleHRfdDsKKworLyoKKyAqIFVzZWQgdG8ga2VlcCBhIGxpc3Qgb2YgInJlbW90ZSB2YWx1ZSIgZXh0ZW50cyB3aGVuIHVubGlua2luZyBhbiBpbm9kZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2F0dHJfaW5hY3RpdmVfbGlzdCB7CisJeGZzX2RhYmxrX3QJdmFsdWVibGs7CS8qIGJsb2NrIG51bWJlciBvZiB2YWx1ZSBieXRlcyAqLworCWludAkJdmFsdWVsZW47CS8qIG51bWJlciBvZiBieXRlcyBpbiB2YWx1ZSAqLworfSB4ZnNfYXR0cl9pbmFjdGl2ZV9saXN0X3Q7CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIHRoZSBrZXJuZWwuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgKiBJbnRlcm5hbCByb3V0aW5lcyB3aGVuIGRpcnNpemUgPCBYRlNfTElUSU5PKG1wKS4KKyAqLworaW50CXhmc19hdHRyX3Nob3J0Zm9ybV9jcmVhdGUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKK2ludAl4ZnNfYXR0cl9zaG9ydGZvcm1fYWRkKHN0cnVjdCB4ZnNfZGFfYXJncyAqYWRkKTsKK2ludAl4ZnNfYXR0cl9zaG9ydGZvcm1fbG9va3VwKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CitpbnQJeGZzX2F0dHJfc2hvcnRmb3JtX2dldHZhbHVlKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CitpbnQJeGZzX2F0dHJfc2hvcnRmb3JtX3RvX2xlYWYoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKK2ludAl4ZnNfYXR0cl9zaG9ydGZvcm1fcmVtb3ZlKHN0cnVjdCB4ZnNfZGFfYXJncyAqcmVtb3ZlKTsKK2ludAl4ZnNfYXR0cl9zaG9ydGZvcm1fbGlzdChzdHJ1Y3QgeGZzX2F0dHJfbGlzdF9jb250ZXh0ICpjb250ZXh0KTsKK2ludAl4ZnNfYXR0cl9zaG9ydGZvcm1fYWxsZml0KHN0cnVjdCB4ZnNfZGFidWYgKmJwLCBzdHJ1Y3QgeGZzX2lub2RlICpkcCk7CisKKy8qCisgKiBJbnRlcm5hbCByb3V0aW5lcyB3aGVuIGRpcnNpemUgPT0gWEZTX0xCU0laRShtcCkuCisgKi8KK2ludAl4ZnNfYXR0cl9sZWFmX3RvX25vZGUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKK2ludAl4ZnNfYXR0cl9sZWFmX3RvX3Nob3J0Zm9ybShzdHJ1Y3QgeGZzX2RhYnVmICpicCwKKwkJCQkJICBzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworaW50CXhmc19hdHRyX2xlYWZfY2xlYXJmbGFnKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CitpbnQJeGZzX2F0dHJfbGVhZl9zZXRmbGFnKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CitpbnQJeGZzX2F0dHJfbGVhZl9mbGlwZmxhZ3MoeGZzX2RhX2FyZ3NfdCAqYXJncyk7CisKKy8qCisgKiBSb3V0aW5lcyB1c2VkIGZvciBncm93aW5nIHRoZSBCdHJlZS4KKyAqLworaW50CXhmc19hdHRyX2xlYWZfY3JlYXRlKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywgeGZzX2RhYmxrX3Qgd2hpY2hfYmxvY2ssCisJCQkJICAgIHN0cnVjdCB4ZnNfZGFidWYgKipicHApOworaW50CXhmc19hdHRyX2xlYWZfc3BsaXQoc3RydWN0IHhmc19kYV9zdGF0ZSAqc3RhdGUsCisJCQkJICAgc3RydWN0IHhmc19kYV9zdGF0ZV9ibGsgKm9sZGJsaywKKwkJCQkgICBzdHJ1Y3QgeGZzX2RhX3N0YXRlX2JsayAqbmV3YmxrKTsKK2ludAl4ZnNfYXR0cl9sZWFmX2xvb2t1cF9pbnQoc3RydWN0IHhmc19kYWJ1ZiAqbGVhZiwKKwkJCQkJc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKK2ludAl4ZnNfYXR0cl9sZWFmX2dldHZhbHVlKHN0cnVjdCB4ZnNfZGFidWYgKmJwLCBzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworaW50CXhmc19hdHRyX2xlYWZfYWRkKHN0cnVjdCB4ZnNfZGFidWYgKmxlYWZfYnVmZmVyLAorCQkJCSBzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworaW50CXhmc19hdHRyX2xlYWZfcmVtb3ZlKHN0cnVjdCB4ZnNfZGFidWYgKmxlYWZfYnVmZmVyLAorCQkJCSAgICBzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworaW50CXhmc19hdHRyX2xlYWZfbGlzdF9pbnQoc3RydWN0IHhmc19kYWJ1ZiAqYnAsCisJCQkJICAgICAgc3RydWN0IHhmc19hdHRyX2xpc3RfY29udGV4dCAqY29udGV4dCk7CisKKy8qCisgKiBSb3V0aW5lcyB1c2VkIGZvciBzaHJpbmtpbmcgdGhlIEJ0cmVlLgorICovCitpbnQJeGZzX2F0dHJfbGVhZl90b29zbWFsbChzdHJ1Y3QgeGZzX2RhX3N0YXRlICpzdGF0ZSwgaW50ICpyZXR2YWwpOwordm9pZAl4ZnNfYXR0cl9sZWFmX3VuYmFsYW5jZShzdHJ1Y3QgeGZzX2RhX3N0YXRlICpzdGF0ZSwKKwkJCQkgICAgICAgc3RydWN0IHhmc19kYV9zdGF0ZV9ibGsgKmRyb3BfYmxrLAorCQkJCSAgICAgICBzdHJ1Y3QgeGZzX2RhX3N0YXRlX2JsayAqc2F2ZV9ibGspOworaW50CXhmc19hdHRyX3Jvb3RfaW5hY3RpdmUoc3RydWN0IHhmc190cmFucyAqKnRyYW5zLCBzdHJ1Y3QgeGZzX2lub2RlICpkcCk7CitpbnQJeGZzX2F0dHJfbm9kZV9pbmFjdGl2ZShzdHJ1Y3QgeGZzX3RyYW5zICoqdHJhbnMsIHN0cnVjdCB4ZnNfaW5vZGUgKmRwLAorCQkJCSAgICAgIHN0cnVjdCB4ZnNfZGFidWYgKmJwLCBpbnQgbGV2ZWwpOworaW50CXhmc19hdHRyX2xlYWZfaW5hY3RpdmUoc3RydWN0IHhmc190cmFucyAqKnRyYW5zLCBzdHJ1Y3QgeGZzX2lub2RlICpkcCwKKwkJCQkgICAgICBzdHJ1Y3QgeGZzX2RhYnVmICpicCk7CitpbnQJeGZzX2F0dHJfbGVhZl9mcmVleHRlbnQoc3RydWN0IHhmc190cmFucyAqKnRyYW5zLCBzdHJ1Y3QgeGZzX2lub2RlICpkcCwKKwkJCQkgICAgICAgeGZzX2RhYmxrX3QgYmxrbm8sIGludCBibGtjbnQpOworCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqLworeGZzX2RhaGFzaF90CXhmc19hdHRyX2xlYWZfbGFzdGhhc2goc3RydWN0IHhmc19kYWJ1ZiAqYnAsIGludCAqY291bnQpOworaW50CXhmc19hdHRyX2xlYWZfb3JkZXIoc3RydWN0IHhmc19kYWJ1ZiAqbGVhZjFfYnAsCisJCQkJICAgc3RydWN0IHhmc19kYWJ1ZiAqbGVhZjJfYnApOworaW50CXhmc19hdHRyX2xlYWZfbmV3ZW50c2l6ZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsIGludCBibG9ja3NpemUsCisJCQkJCWludCAqbG9jYWwpOworaW50CXhmc19hdHRyX2xlYWZfZW50c2l6ZShzdHJ1Y3QgeGZzX2F0dHJfbGVhZmJsb2NrICpsZWFmLCBpbnQgaW5kZXgpOworaW50CXhmc19hdHRyX3B1dF9saXN0ZW50KHN0cnVjdCB4ZnNfYXR0cl9saXN0X2NvbnRleHQgKmNvbnRleHQsCisJCQkgICAgIHN0cnVjdCBhdHRybmFtZXMgKiwgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sCisJCQkgICAgIGludCB2YWx1ZWxlbik7CitpbnQJeGZzX2F0dHJfcm9sbHRyYW5zKHN0cnVjdCB4ZnNfdHJhbnMgKip0cmFuc3AsIHN0cnVjdCB4ZnNfaW5vZGUgKmRwKTsKKworI2VuZGlmCS8qIF9fWEZTX0FUVFJfTEVBRl9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYXR0cl9zZi5oIGIvZnMveGZzL3hmc19hdHRyX3NmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY3ZDI5NAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfYXR0cl9zZi5oCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfQVRUUl9TRl9IX18KKyNkZWZpbmUJX19YRlNfQVRUUl9TRl9IX18KKworLyoKKyAqIEF0dHJpYnV0ZSBzdG9yYWdlIHdoZW4gc3RvcmVkIGluc2lkZSB0aGUgaW5vZGUuCisgKgorICogU21hbGwgYXR0cmlidXRlIGxpc3RzIGFyZSBwYWNrZWQgYXMgdGlnaHRseSBhcyBwb3NzaWJsZSBzbyBhcworICogdG8gZml0IGludG8gdGhlIGxpdGVyYWwgYXJlYSBvZiB0aGUgaW5vZGUuCisgKi8KKworc3RydWN0IHhmc19pbm9kZTsKKworLyoKKyAqIEVudHJpZXMgYXJlIHBhY2tlZCB0b3dhcmQgdGhlIHRvcCBhcyB0aWdodCBhcyBwb3NzaWJsZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2F0dHJfc2hvcnRmb3JtIHsKKwlzdHJ1Y3QgeGZzX2F0dHJfc2ZfaGRyIHsJLyogY29uc3RhbnQtc3RydWN0dXJlIGhlYWRlciBibG9jayAqLworCQlfX3VpbnQxNl90IHRvdHNpemU7CS8qIHRvdGFsIGJ5dGVzIGluIHNob3J0Zm9ybSBsaXN0ICovCisJCV9fdWludDhfdCBjb3VudDsJLyogY291bnQgb2YgYWN0aXZlIGVudHJpZXMgKi8KKwl9IGhkcjsKKwlzdHJ1Y3QgeGZzX2F0dHJfc2ZfZW50cnkgeworCQlfX3VpbnQ4X3QgbmFtZWxlbjsJLyogYWN0dWFsIGxlbmd0aCBvZiBuYW1lIChubyBOVUxMKSAqLworCQlfX3VpbnQ4X3QgdmFsdWVsZW47CS8qIGFjdHVhbCBsZW5ndGggb2YgdmFsdWUgKG5vIE5VTEwpICovCisJCV9fdWludDhfdCBmbGFnczsJLyogZmxhZ3MgYml0cyAoc2VlIHhmc19hdHRyX2xlYWYuaCkgKi8KKwkJX191aW50OF90IG5hbWV2YWxbMV07CS8qIG5hbWUgJiB2YWx1ZSBieXRlcyBjb25jYXRlbmF0ZWQgKi8KKwl9IGxpc3RbMV07CQkJLyogdmFyaWFibGUgc2l6ZWQgYXJyYXkgKi8KK30geGZzX2F0dHJfc2hvcnRmb3JtX3Q7Cit0eXBlZGVmIHN0cnVjdCB4ZnNfYXR0cl9zZl9oZHIgeGZzX2F0dHJfc2ZfaGRyX3Q7Cit0eXBlZGVmIHN0cnVjdCB4ZnNfYXR0cl9zZl9lbnRyeSB4ZnNfYXR0cl9zZl9lbnRyeV90OworCisvKgorICogV2UgZ2VuZXJhdGUgdGhpcyB0aGVuIHNvcnQgaXQsIGF0dHJfbGlzdCgpIG11c3QgcmV0dXJuIHRoaW5ncyBpbiBoYXNoLW9yZGVyLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfYXR0cl9zZl9zb3J0IHsKKwlfX3VpbnQ4X3QJZW50bm87CQkvKiBlbnRyeSBudW1iZXIgaW4gb3JpZ2luYWwgbGlzdCAqLworCV9fdWludDhfdAluYW1lbGVuOwkvKiBsZW5ndGggb2YgbmFtZSB2YWx1ZSAobm8gbnVsbCkgKi8KKwlfX3VpbnQ4X3QJdmFsdWVsZW47CS8qIGxlbmd0aCBvZiB2YWx1ZSAqLworCV9fdWludDhfdAlmbGFnczsJCS8qIGZsYWdzIGJpdHMgKHNlZSB4ZnNfYXR0cl9sZWFmLmgpICovCisJeGZzX2RhaGFzaF90CWhhc2g7CQkvKiB0aGlzIGVudHJ5J3MgaGFzaCB2YWx1ZSAqLworCWNoYXIJCSpuYW1lOwkJLyogbmFtZSB2YWx1ZSwgcG9pbnRlciBpbnRvIGJ1ZmZlciAqLworfSB4ZnNfYXR0cl9zZl9zb3J0X3Q7CisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0FUVFJfU0ZfRU5UU0laRV9CWU5BTUUpCitpbnQgeGZzX2F0dHJfc2ZfZW50c2l6ZV9ieW5hbWUoaW50IG5sZW4sIGludCB2bGVuKTsKKyNkZWZpbmUgWEZTX0FUVFJfU0ZfRU5UU0laRV9CWU5BTUUobmxlbix2bGVuKQlcCisJeGZzX2F0dHJfc2ZfZW50c2l6ZV9ieW5hbWUobmxlbix2bGVuKQorI2Vsc2UKKyNkZWZpbmUgWEZTX0FUVFJfU0ZfRU5UU0laRV9CWU5BTUUobmxlbix2bGVuKQkvKiBzcGFjZSBuYW1lL3ZhbHVlIHVzZXMgKi8gXAorCSgoaW50KXNpemVvZih4ZnNfYXR0cl9zZl9lbnRyeV90KS0xICsgKG5sZW4pKyh2bGVuKSkKKyNlbmRpZgorI2RlZmluZSBYRlNfQVRUUl9TRl9FTlRTSVpFX01BWAkJCS8qIG1heCBzcGFjZSBmb3IgbmFtZSZ2YWx1ZSAqLyBcCisJKCgxIDw8IChOQkJZKihpbnQpc2l6ZW9mKF9fdWludDhfdCkpKSAtIDEpCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BVFRSX1NGX0VOVFNJWkUpCitpbnQgeGZzX2F0dHJfc2ZfZW50c2l6ZSh4ZnNfYXR0cl9zZl9lbnRyeV90ICpzZmVwKTsKKyNkZWZpbmUgWEZTX0FUVFJfU0ZfRU5UU0laRShzZmVwKQl4ZnNfYXR0cl9zZl9lbnRzaXplKHNmZXApCisjZWxzZQorI2RlZmluZSBYRlNfQVRUUl9TRl9FTlRTSVpFKHNmZXApCQkvKiBzcGFjZSBhbiBlbnRyeSB1c2VzICovIFwKKwkoKGludClzaXplb2YoeGZzX2F0dHJfc2ZfZW50cnlfdCktMSArIChzZmVwKS0+bmFtZWxlbisoc2ZlcCktPnZhbHVlbGVuKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BVFRSX1NGX05FWFRFTlRSWSkKK3hmc19hdHRyX3NmX2VudHJ5X3QgKnhmc19hdHRyX3NmX25leHRlbnRyeSh4ZnNfYXR0cl9zZl9lbnRyeV90ICpzZmVwKTsKKyNkZWZpbmUgWEZTX0FUVFJfU0ZfTkVYVEVOVFJZKHNmZXApCXhmc19hdHRyX3NmX25leHRlbnRyeShzZmVwKQorI2Vsc2UKKyNkZWZpbmUgWEZTX0FUVFJfU0ZfTkVYVEVOVFJZKHNmZXApCQkvKiBuZXh0IGVudHJ5IGluIHN0cnVjdCAqLyBcCisJKCh4ZnNfYXR0cl9zZl9lbnRyeV90ICopIFwKKwkJKChjaGFyICopKHNmZXApICsgWEZTX0FUVFJfU0ZfRU5UU0laRShzZmVwKSkpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0FUVFJfU0ZfVE9UU0laRSkKK2ludCB4ZnNfYXR0cl9zZl90b3RzaXplKHN0cnVjdCB4ZnNfaW5vZGUgKmRwKTsKKyNkZWZpbmUgWEZTX0FUVFJfU0ZfVE9UU0laRShkcCkJCXhmc19hdHRyX3NmX3RvdHNpemUoZHApCisjZWxzZQorI2RlZmluZSBYRlNfQVRUUl9TRl9UT1RTSVpFKGRwKQkJCS8qIHRvdGFsIHNwYWNlIGluIHVzZSAqLyBcCisJKElOVF9HRVQoKCh4ZnNfYXR0cl9zaG9ydGZvcm1fdCAqKSgoZHApLT5pX2FmcC0+aWZfdTEuaWZfZGF0YSkpLT5oZHIudG90c2l6ZSwgQVJDSF9DT05WRVJUKSkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChYRlNfQVRUUl9UUkFDRSkKKy8qCisgKiBLZXJuZWwgdHJhY2luZyBzdXBwb3J0IGZvciBhdHRyaWJ1dGUgbGlzdHMKKyAqLworc3RydWN0IHhmc19hdHRyX2xpc3RfY29udGV4dDsKK3N0cnVjdCB4ZnNfZGFfaW50bm9kZTsKK3N0cnVjdCB4ZnNfZGFfbm9kZV9lbnRyeTsKK3N0cnVjdCB4ZnNfYXR0cl9sZWFmYmxvY2s7CisKKyNkZWZpbmUJWEZTX0FUVFJfVFJBQ0VfU0laRQk0MDk2CS8qIHNpemUgb2YgZ2xvYmFsIHRyYWNlIGJ1ZmZlciAqLworZXh0ZXJuIGt0cmFjZV90CSp4ZnNfYXR0cl90cmFjZV9idWY7CisKKy8qCisgKiBUcmFjZSByZWNvcmQgdHlwZXMuCisgKi8KKyNkZWZpbmUJWEZTX0FUVFJfS1RSQUNFX0xfQwkxCS8qIGNvbnRleHQgKi8KKyNkZWZpbmUJWEZTX0FUVFJfS1RSQUNFX0xfQ04JMgkvKiBjb250ZXh0LCBub2RlICovCisjZGVmaW5lCVhGU19BVFRSX0tUUkFDRV9MX0NCCTMJLyogY29udGV4dCwgYnRyZWUgKi8KKyNkZWZpbmUJWEZTX0FUVFJfS1RSQUNFX0xfQ0wJNAkvKiBjb250ZXh0LCBsZWFmICovCisKK3ZvaWQgeGZzX2F0dHJfdHJhY2VfbF9jKGNoYXIgKndoZXJlLCBzdHJ1Y3QgeGZzX2F0dHJfbGlzdF9jb250ZXh0ICpjb250ZXh0KTsKK3ZvaWQgeGZzX2F0dHJfdHJhY2VfbF9jbihjaGFyICp3aGVyZSwgc3RydWN0IHhmc19hdHRyX2xpc3RfY29udGV4dCAqY29udGV4dCwKKwkJCSAgICAgIHN0cnVjdCB4ZnNfZGFfaW50bm9kZSAqbm9kZSk7Cit2b2lkIHhmc19hdHRyX3RyYWNlX2xfY2IoY2hhciAqd2hlcmUsIHN0cnVjdCB4ZnNfYXR0cl9saXN0X2NvbnRleHQgKmNvbnRleHQsCisJCQkgICAgICBzdHJ1Y3QgeGZzX2RhX25vZGVfZW50cnkgKmJ0cmVlKTsKK3ZvaWQgeGZzX2F0dHJfdHJhY2VfbF9jbChjaGFyICp3aGVyZSwgc3RydWN0IHhmc19hdHRyX2xpc3RfY29udGV4dCAqY29udGV4dCwKKwkJCSAgICAgIHN0cnVjdCB4ZnNfYXR0cl9sZWFmYmxvY2sgKmxlYWYpOwordm9pZCB4ZnNfYXR0cl90cmFjZV9lbnRlcihpbnQgdHlwZSwgY2hhciAqd2hlcmUsCisJCQkgICAgIF9fcHN1bnNpZ25lZF90IGEyLCBfX3BzdW5zaWduZWRfdCBhMywKKwkJCSAgICAgX19wc3Vuc2lnbmVkX3QgYTQsIF9fcHN1bnNpZ25lZF90IGE1LAorCQkJICAgICBfX3BzdW5zaWduZWRfdCBhNiwgX19wc3Vuc2lnbmVkX3QgYTcsCisJCQkgICAgIF9fcHN1bnNpZ25lZF90IGE4LCBfX3BzdW5zaWduZWRfdCBhOSwKKwkJCSAgICAgX19wc3Vuc2lnbmVkX3QgYTEwLCBfX3BzdW5zaWduZWRfdCBhMTEsCisJCQkgICAgIF9fcHN1bnNpZ25lZF90IGExMiwgX19wc3Vuc2lnbmVkX3QgYTEzLAorCQkJICAgICBfX3BzdW5zaWduZWRfdCBhMTQsIF9fcHN1bnNpZ25lZF90IGExNSk7CisjZWxzZQorI2RlZmluZQl4ZnNfYXR0cl90cmFjZV9sX2ModyxjKQorI2RlZmluZQl4ZnNfYXR0cl90cmFjZV9sX2NuKHcsYyxuKQorI2RlZmluZQl4ZnNfYXR0cl90cmFjZV9sX2NiKHcsYyxiKQorI2RlZmluZQl4ZnNfYXR0cl90cmFjZV9sX2NsKHcsYyxsKQorI2VuZGlmIC8qIFhGU19BVFRSX1RSQUNFICovCisKKyNlbmRpZgkvKiBfX1hGU19BVFRSX1NGX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19iZWhhdmlvci5jIGIvZnMveGZzL3hmc19iZWhhdmlvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MDg4ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2JlaGF2aW9yLmMKQEAgLTAsMCArMSwyMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICoKKyAqLworI2luY2x1ZGUgInhmcy5oIgorCisvKgorICogU291cmNlIGZpbGUgdXNlZCB0byBhc3NvY2lhdGUvZGlzYXNzb2NpYXRlIGJlaGF2aW9ycyB3aXRoIHZpcnR1YWxpemVkCisgKiBvYmplY3RzLiAgU2VlIHhmc19iZWhhdmlvci5oIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGJlaGF2aW9ycywgZXRjLgorICoKKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBzcGxpdCBiZXR3ZWVuIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgYW5kIG1hY3JvcworICogaW4geGZzX2JlaGF2aW9yLmguCisgKi8KKworLyoKKyAqIEluc2VydCBhIG5ldyBiZWhhdmlvciBkZXNjcmlwdG9yIGludG8gYSBiZWhhdmlvciBjaGFpbi4KKyAqCisgKiBUaGUgYmVoYXZpb3IgY2hhaW4gaXMgb3JkZXJlZCBiYXNlZCBvbiB0aGUgJ3Bvc2l0aW9uJyBudW1iZXIgd2hpY2gKKyAqIGxpdmVzIGluIHRoZSBmaXJzdCBmaWVsZCBvZiB0aGUgb3BzIHZlY3RvciAoaGlnaGVyIG51bWJlcnMgZmlyc3QpLgorICoKKyAqIEF0dGVtcHMgdG8gaW5zZXJ0IGR1cGxpY2F0ZSBvcHMgcmVzdWx0IGluIGFuIEVJTlZBTCByZXR1cm4gY29kZS4KKyAqIE90aGVyd2lzZSwgcmV0dXJuIDAgdG8gaW5kaWNhdGUgc3VjY2Vzcy4KKyAqLworaW50CitiaHZfaW5zZXJ0KGJodl9oZWFkX3QgKmJocCwgYmh2X2Rlc2NfdCAqYmRwKQoreworCWJodl9kZXNjX3QJKmN1cmRlc2MsICpwcmV2OworCWludAkJcG9zaXRpb247CisKKwkvKgorCSAqIFZhbGlkYXRlIHRoZSBwb3NpdGlvbiB2YWx1ZSBvZiB0aGUgbmV3IGJlaGF2aW9yLgorCSAqLworCXBvc2l0aW9uID0gQkhWX1BPU0lUSU9OKGJkcCk7CisJQVNTRVJUKHBvc2l0aW9uID49IEJIVl9QT1NJVElPTl9CQVNFICYmIHBvc2l0aW9uIDw9IEJIVl9QT1NJVElPTl9UT1ApOworCisJLyoKKwkgKiBGaW5kIGxvY2F0aW9uIHRvIGluc2VydCBiZWhhdmlvci4gIENoZWNrIGZvciBkdXBsaWNhdGVzLgorCSAqLworCXByZXYgPSBOVUxMOworCWZvciAoY3VyZGVzYyA9IGJocC0+YmhfZmlyc3Q7CisJICAgICBjdXJkZXNjICE9IE5VTEw7CisJICAgICBjdXJkZXNjID0gY3VyZGVzYy0+YmRfbmV4dCkgeworCisJCS8qIENoZWNrIGZvciBkdXBsaWNhdGlvbi4gKi8KKwkJaWYgKGN1cmRlc2MtPmJkX29wcyA9PSBiZHAtPmJkX29wcykgeworCQkJQVNTRVJUKDApOworCQkJcmV0dXJuIEVJTlZBTDsKKwkJfQorCisJCS8qIEZpbmQgY29ycmVjdCBwb3NpdGlvbiAqLworCQlpZiAocG9zaXRpb24gPj0gQkhWX1BPU0lUSU9OKGN1cmRlc2MpKSB7CisJCQlBU1NFUlQocG9zaXRpb24gIT0gQkhWX1BPU0lUSU9OKGN1cmRlc2MpKTsKKwkJCWJyZWFrOwkJLyogZm91bmQgaXQgKi8KKwkJfQorCisJCXByZXYgPSBjdXJkZXNjOworCX0KKworCWlmIChwcmV2ID09IE5VTEwpIHsKKwkJLyogaW5zZXJ0IGF0IGZyb250IG9mIGNoYWluICovCisJCWJkcC0+YmRfbmV4dCA9IGJocC0+YmhfZmlyc3Q7CisJCWJocC0+YmhfZmlyc3QgPSBiZHA7CisJfSBlbHNlIHsKKwkJLyogaW5zZXJ0IGFmdGVyIHByZXYgKi8KKwkJYmRwLT5iZF9uZXh0ID0gcHJldi0+YmRfbmV4dDsKKwkJcHJldi0+YmRfbmV4dCA9IGJkcDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlbW92ZSBhIGJlaGF2aW9yIGRlc2NyaXB0b3IgZnJvbSBhIHBvc2l0aW9uIGluIGEgYmVoYXZpb3IgY2hhaW47CisgKiB0aGUgcG9zdGl0aW9uIGlzIGd1YXJhbnRlZWQgbm90IHRvIGJlIHRoZSBmaXJzdCBwb3NpdGlvbi4KKyAqIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSB0aGUgYmh2X3JlbW92ZSgpIG1hY3JvLgorICovCit2b2lkCitiaHZfcmVtb3ZlX25vdF9maXJzdChiaHZfaGVhZF90ICpiaHAsIGJodl9kZXNjX3QgKmJkcCkKK3sKKwliaHZfZGVzY190CSpjdXJkZXNjLCAqcHJldjsKKworCUFTU0VSVChiaHAtPmJoX2ZpcnN0ICE9IE5VTEwpOworCUFTU0VSVChiaHAtPmJoX2ZpcnN0LT5iZF9uZXh0ICE9IE5VTEwpOworCisJcHJldiA9IGJocC0+YmhfZmlyc3Q7CisJZm9yIChjdXJkZXNjID0gYmhwLT5iaF9maXJzdC0+YmRfbmV4dDsKKwkgICAgIGN1cmRlc2MgIT0gTlVMTDsKKwkgICAgIGN1cmRlc2MgPSBjdXJkZXNjLT5iZF9uZXh0KSB7CisKKwkJaWYgKGN1cmRlc2MgPT0gYmRwKQorCQkJYnJlYWs7CQkvKiBmb3VuZCBpdCAqLworCQlwcmV2ID0gY3VyZGVzYzsKKwl9CisKKwlBU1NFUlQoY3VyZGVzYyA9PSBiZHApOworCXByZXYtPmJkX25leHQgPSBiZHAtPmJkX25leHQ7CS8qIHJlbW92ZSBmcm9tIGFmdGVyIHByZXYgKi8KK30KKworLyoKKyAqIExvb2sgZm9yIGEgc3BlY2lmaWMgb3BzIHZlY3RvciBvbiB0aGUgc3BlY2lmaWVkIGJlaGF2aW9yIGNoYWluLgorICogUmV0dXJuIHRoZSBhc3NvY2lhdGVkIGJlaGF2aW9yIGRlc2NyaXB0b3IuICBPciBOVUxMLCBpZiBub3QgZm91bmQuCisgKi8KK2Jodl9kZXNjX3QgKgorYmh2X2xvb2t1cChiaHZfaGVhZF90ICpiaHAsIHZvaWQgKm9wcykKK3sKKwliaHZfZGVzY190CSpjdXJkZXNjOworCisJZm9yIChjdXJkZXNjID0gYmhwLT5iaF9maXJzdDsKKwkgICAgIGN1cmRlc2MgIT0gTlVMTDsKKwkgICAgIGN1cmRlc2MgPSBjdXJkZXNjLT5iZF9uZXh0KSB7CisKKwkJaWYgKGN1cmRlc2MtPmJkX29wcyA9PSBvcHMpCisJCQlyZXR1cm4gY3VyZGVzYzsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIExvb2tzIGZvciB0aGUgZmlyc3QgYmVoYXZpb3Igd2l0aGluIGEgc3BlY2lmaWVkIHJhbmdlIG9mIHBvc2l0aW9ucy4KKyAqIFJldHVybiB0aGUgYXNzb2NpYXRlZCBiZWhhdmlvciBkZXNjcmlwdG9yLiAgT3IgTlVMTCwgaWYgbm9uZSBmb3VuZC4KKyAqLworYmh2X2Rlc2NfdCAqCitiaHZfbG9va3VwX3JhbmdlKGJodl9oZWFkX3QgKmJocCwgaW50IGxvdywgaW50IGhpZ2gpCit7CisJYmh2X2Rlc2NfdAkqY3VyZGVzYzsKKworCWZvciAoY3VyZGVzYyA9IGJocC0+YmhfZmlyc3Q7CisJICAgICBjdXJkZXNjICE9IE5VTEw7CisJICAgICBjdXJkZXNjID0gY3VyZGVzYy0+YmRfbmV4dCkgeworCisJCWludAlwb3NpdGlvbiA9IEJIVl9QT1NJVElPTihjdXJkZXNjKTsKKworCQlpZiAocG9zaXRpb24gPD0gaGlnaCkgeworCQkJaWYgKHBvc2l0aW9uID49IGxvdykKKwkJCQlyZXR1cm4gY3VyZGVzYzsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIGJhc2UgYmVoYXZpb3IgaW4gdGhlIGNoYWluLCBvciBOVUxMIGlmIHRoZSBjaGFpbgorICogaXMgZW1wdHkuCisgKgorICogVGhlIGNhbGxlciBoYXMgbm90IHJlYWQgbG9ja2VkIHRoZSBiZWhhdmlvciBjaGFpbiwgc28gYWNxdWlyZSB0aGUKKyAqIGxvY2sgYmVmb3JlIHRyYXZlcnNpbmcgdGhlIGNoYWluLgorICovCitiaHZfZGVzY190ICoKK2Jodl9iYXNlKGJodl9oZWFkX3QgKmJocCkKK3sKKwliaHZfZGVzY190CSpjdXJkZXNjOworCisJZm9yIChjdXJkZXNjID0gYmhwLT5iaF9maXJzdDsKKwkgICAgIGN1cmRlc2MgIT0gTlVMTDsKKwkgICAgIGN1cmRlc2MgPSBjdXJkZXNjLT5iZF9uZXh0KSB7CisKKwkJaWYgKGN1cmRlc2MtPmJkX25leHQgPT0gTlVMTCkgeworCQkJcmV0dXJuIGN1cmRlc2M7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZAorYmh2X2hlYWRfaW5pdCgKKwliaHZfaGVhZF90ICpiaHAsCisJY2hhciAqbmFtZSkKK3sKKwliaHAtPmJoX2ZpcnN0ID0gTlVMTDsKK30KKwordm9pZAorYmh2X2luc2VydF9pbml0aWFsKAorCWJodl9oZWFkX3QgKmJocCwKKwliaHZfZGVzY190ICpiZHApCit7CisJQVNTRVJUKGJocC0+YmhfZmlyc3QgPT0gTlVMTCk7CisJKGJocCktPmJoX2ZpcnN0ID0gYmRwOworfQorCit2b2lkCitiaHZfaGVhZF9kZXN0cm95KAorCWJodl9oZWFkX3QgKmJocCkKK3sKKwlBU1NFUlQoYmhwLT5iaF9maXJzdCA9PSBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYmVoYXZpb3IuaCBiL2ZzL3hmcy94ZnNfYmVoYXZpb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWVkNWE4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19iZWhhdmlvci5oCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19CRUhBVklPUl9IX18KKyNkZWZpbmUgX19YRlNfQkVIQVZJT1JfSF9fCisKKy8qCisgKiBIZWFkZXIgZmlsZSB1c2VkIHRvIGFzc29jaWF0ZSBiZWhhdmlvcnMgd2l0aCB2aXJ0dWFsaXplZCBvYmplY3RzLgorICoKKyAqIEEgdmlydHVhbGl6ZWQgb2JqZWN0IGlzIGFuIGludGVybmFsLCB2aXJ0dWFsaXplZCByZXByZXNlbnRhdGlvbiBvZgorICogT1MgZW50aXRpZXMgc3VjaCBhcyBwZXJzaXN0ZW50IGZpbGVzLCBwcm9jZXNzZXMsIG9yIHNvY2tldHMuICBFeGFtcGxlcworICogb2YgdmlydHVhbGl6ZWQgb2JqZWN0cyBpbmNsdWRlIHZub2RlcywgdnByb2NzLCBhbmQgdnNvY2tldHMuICBPZnRlbgorICogYSB2aXJ0dWFsaXplZCBvYmplY3QgaXMgcmVmZXJyZWQgdG8gc2ltcGx5IGFzIGFuICJvYmplY3QuIgorICoKKyAqIEEgYmVoYXZpb3IgaXMgZXNzZW50aWFsbHkgYW4gaW1wbGVtZW50YXRpb24gbGF5ZXIgYXNzb2NpYXRlZCB3aXRoCisgKiBhbiBvYmplY3QuICBNdWx0aXBsZSBiZWhhdmlvcnMgZm9yIGFuIG9iamVjdCBhcmUgY2hhaW5lZCB0b2dldGhlciwKKyAqIHRoZSBvcmRlciBvZiBjaGFpbmluZyBkZXRlcm1pbmluZyB0aGUgb3JkZXIgb2YgaW52b2NhdGlvbi4gIEVhY2gKKyAqIGJlaGF2aW9yIG9mIGEgZ2l2ZW4gb2JqZWN0IGltcGxlbWVudHMgdGhlIHNhbWUgc2V0IG9mIGludGVyZmFjZXMKKyAqIChlLmcuLCB0aGUgVk9QIGludGVyZmFjZXMpLgorICoKKyAqIEJlaGF2aW9ycyBtYXkgYmUgZHluYW1pY2FsbHkgaW5zZXJ0ZWQgaW50byBhbiBvYmplY3QncyBiZWhhdmlvciBjaGFpbiwKKyAqIHN1Y2ggdGhhdCB0aGUgYWRkaXRpb24gaXMgdHJhbnNwYXJlbnQgdG8gY29uc3VtZXJzIHRoYXQgYWxyZWFkeSBoYXZlCisgKiByZWZlcmVuY2VzIHRvIHRoZSBvYmplY3QuICBUeXBpY2FsbHksIGEgZ2l2ZW4gYmVoYXZpb3Igd2lsbCBiZSBpbnNlcnRlZAorICogYXQgYSBwYXJ0aWN1bGFyIGxvY2F0aW9uIGluIHRoZSBiZWhhdmlvciBjaGFpbi4gIEluc2VydGlvbiBvZiBuZXcKKyAqIGJlaGF2aW9ycyBpcyBzeW5jaHJvbml6ZWQgd2l0aCBvcGVyYXRpb25zLWluLXByb2dyZXNzIChvaXAncykgc28gdGhhdAorICogdGhlIG9pcCdzIGFsd2F5cyBzZWUgYSBjb25zaXN0ZW50IHZpZXcgb2YgdGhlIGNoYWluLgorICoKKyAqIFRoZSB0ZXJtICJpbnRlcnBvc3Rpb24iIGlzIHVzZWQgdG8gcmVmZXIgdG8gdGhlIGFjdCBvZiBpbnNlcnRpbmcKKyAqIGEgYmVoYXZpb3Igc3VjaCB0aGF0IGl0IGludGVycG9zZXMgb24gKGkuZS4sIGlzIGluc2VydGVkIGluIGZyb250CisgKiBvZikgYSBwYXJ0aWN1bGFyIG90aGVyIGJlaGF2aW9yLiAgQSBrZXkgZXhhbXBsZSBvZiB0aGlzIGlzIHdoZW4gYQorICogc3lzdGVtIGltcGxlbWVudGluZyBkaXN0cmlidXRlZCBzaW5nbGUgc3lzdGVtIGltYWdlIHdpc2hlcyB0bworICogaW50ZXJwb3NlIGEgZGlzdHJpYnV0aW9uIGxheWVyIChwcm92aWRpbmcgZGlzdHJpYnV0ZWQgY29oZXJlbmN5KQorICogaW4gZnJvbnQgb2YgYW4gb2JqZWN0IHRoYXQgaXMgb3RoZXJ3aXNlIG9ubHkgYWNjZXNzZWQgbG9jYWxseS4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIHRyYWRpdGlvbmFsIHZub2RlL2lub2RlIGNvbWJpbmF0aW9uIGlzIHNpbXBseSBhIHZpcnR1YWxpemVkCisgKiBvYmplY3QgdGhhdCBoYXMgZXhhY3RseSBvbmUgYXNzb2NpYXRlZCBiZWhhdmlvci4KKyAqCisgKiBCZWhhdmlvciBzeW5jaHJvbml6YXRpb24gaXMgbG9naWMgd2hpY2ggaXMgbmVjZXNzYXJ5IHVuZGVyIGNlcnRhaW4KKyAqIGNpcmN1bXN0YW5jZXMgdGhhdCB0aGVyZSBpcyBubyBjb25mbGljdCBiZXR3ZWVuIG9uZ29pbmcgb3BlcmF0aW9ucworICogdHJhdmVyc2luZyB0aGUgYmVoYXZpb3IgY2hhaW4gYW5kIHRob3NlIGR1bmFtaWNhbGx5IG1vZGlmeWluZyB0aGUKKyAqIGJlaGF2aW9yIGNoYWluLiAgQmVjYXVzZSBiZWhhdmlvciBzeW5jaHJvbml6YXRpb24gYWRkcyBleHRyYSBvdmVyaGVhZAorICogdG8gdmlydHVhbCBvcGVyYXRpb24gaW52b2NhdGlvbiwgd2Ugd2FudCB0byByZXN0cmljdCwgYXMgbXVjaCBhcworICogd2UgY2FuLCB0aGUgcmVxdWlyZW1lbnQgZm9yIHRoaXMgZXh0cmEgY29kZSwgdG8gdGhvc2Ugc2l0dWF0aW9ucworICogaW4gd2hpY2ggaXQgaXMgdHJ1bHkgbmVjZXNzYXJ5LgorICoKKyAqIEJlaGF2aW9yIHN5bmNocm9uaXphdGlvbiBpcyBuZWVkZWQgd2hlbmV2ZXIgdGhlcmUncyBhdCBsZWFzdCBvbmUgY2xhc3MKKyAqIG9mIG9iamVjdCBpbiB0aGUgc3lzdGVtIGZvciB3aGljaDoKKyAqIDEpIG11bHRpcGxlIGJlaGF2aW9ycyBmb3IgYSBnaXZlbiBvYmplY3QgYXJlIHN1cHBvcnRlZCwKKyAqIC0tIEFORCAtLQorICogMmEpIGluc2VydGlvbiBvZiBhIG5ldyBiZWhhdmlvciBjYW4gaGFwcGVuIGR5bmFtaWNhbGx5IGF0IGFueSB0aW1lIGR1cmluZworICogICAgIHRoZSBsaWZlIG9mIGFuIGFjdGl2ZSBvYmplY3QsCisgKgktLSBBTkQgLS0KKyAqCTNhKSBpbnNlcnRpb24gb2YgYSBuZXcgYmVoYXZpb3IgbmVlZHMgdG8gc3luY2hyb25pemUgd2l0aCBleGlzdGluZworICoJICAgIG9wcy1pbi1wcm9ncmVzcy4KKyAqCS0tIE9SIC0tCisgKgkzYikgbXVsdGlwbGUgZGlmZmVyZW50IGJlaGF2aW9ycyBjYW4gYmUgZHluYW1pY2FsbHkgaW5zZXJ0ZWQgYXQKKyAqCSAgICBhbnkgdGltZSBkdXJpbmcgdGhlIGxpZmUgb2YgYW4gYWN0aXZlIG9iamVjdAorICoJLS0gT1IgLS0KKyAqCTNjKSByZW1vdmFsIG9mIGEgYmVoYXZpb3IgY2FuIG9jY3VyIGF0IGFueSB0aW1lIGR1cmluZyB0aGUgbGlmZSBvZgorICoJICAgIGFuIGFjdGl2ZSBvYmplY3QuCisgKiAtLSBPUiAtLQorICogMmIpIHJlbW92YWwgb2YgYSBiZWhhdmlvciBjYW4gb2NjdXIgYXQgYW55IHRpbWUgZHVyaW5nIHRoZSBsaWZlIG9mIGFuCisgKiAgICAgYWN0aXZlIG9iamVjdAorICoKKyAqLworCitzdHJ1Y3QgYmh2X2hlYWRfbG9jazsKKworLyoKKyAqIEJlaGF2aW9yIGhlYWQuICBIZWFkIG9mIHRoZSBjaGFpbiBvZiBiZWhhdmlvcnMuCisgKiBDb250YWluZWQgd2l0aGluIGVhY2ggdmlydHVhbGl6ZWQgb2JqZWN0IGRhdGEgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdCBiaHZfaGVhZCB7CisJc3RydWN0IGJodl9kZXNjICpiaF9maXJzdDsJLyogZmlyc3QgYmVoYXZpb3IgaW4gY2hhaW4gKi8KKwlzdHJ1Y3QgYmh2X2hlYWRfbG9jayAqYmhfbG9ja3A7CS8qIHBvaW50ZXIgdG8gbG9jayBpbmZvIHN0cnVjdCAqLworfSBiaHZfaGVhZF90OworCisvKgorICogQmVoYXZpb3IgZGVzY3JpcHRvci4JIERlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoIGVhY2ggYmVoYXZpb3IuCisgKiBDb250YWluZWQgd2l0aGluIHRoZSBiZWhhdmlvcidzIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IGJodl9kZXNjIHsKKwl2b2lkCQkqYmRfcGRhdGE7CS8qIHByaXZhdGUgZGF0YSBmb3IgdGhpcyBiZWhhdmlvciAqLworCXZvaWQJCSpiZF92b2JqOwkvKiB2aXJ0dWFsIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggKi8KKwl2b2lkCQkqYmRfb3BzOwkvKiBvcHMgZm9yIHRoaXMgYmVoYXZpb3IgKi8KKwlzdHJ1Y3QgYmh2X2Rlc2MgKmJkX25leHQ7CS8qIG5leHQgYmVoYXZpb3IgaW4gY2hhaW4gKi8KK30gYmh2X2Rlc2NfdDsKKworLyoKKyAqIEJlaGF2aW9yIGlkZW50aXR5IGZpZWxkLiAgQSBiZWhhdmlvcidzIGlkZW50aXR5IGRldGVybWluZXMgdGhlIHBvc2l0aW9uCisgKiB3aGVyZSBpdCBsaXZlcyB3aXRoaW4gYSBiZWhhdmlvciBjaGFpbiwgYW5kIGl0J3MgYWx3YXlzIHRoZSBmaXJzdCBmaWVsZAorICogb2YgdGhlIGJlaGF2aW9yJ3Mgb3BzIHZlY3Rvci4gVGhlIG9wdGlvbmFsIGlkIGZpZWxkIGZ1cnRoZXIgaWRlbnRpZmllcyB0aGUKKyAqIHN1YnN5c3RlbSByZXNwb25zaWJsZSBmb3IgdGhlIGJlaGF2aW9yLgorICovCit0eXBlZGVmIHN0cnVjdCBiaHZfaWRlbnRpdHkgeworCV9fdTE2CWJpX2lkOwkJLyogb3duaW5nIHN1YnN5c3RlbSBpZCAqLworCV9fdTE2CWJpX3Bvc2l0aW9uOwkvKiBwb3NpdGlvbiBpbiBjaGFpbiAqLworfSBiaHZfaWRlbnRpdHlfdDsKKwordHlwZWRlZiBiaHZfaWRlbnRpdHlfdCBiaHZfcG9zaXRpb25fdDsKKworI2RlZmluZSBCSFZfSURFTlRJVFlfSU5JVChpZCxwb3MpCXtpZCwgcG9zfQorI2RlZmluZSBCSFZfSURFTlRJVFlfSU5JVF9QT1NJVElPTihwb3MpIEJIVl9JREVOVElUWV9JTklUKDAsIHBvcykKKworLyoKKyAqIERlZmluZSBib3VuZGFyaWVzIG9mIHBvc2l0aW9uIHZhbHVlcy4KKyAqLworI2RlZmluZSBCSFZfUE9TSVRJT05fSU5WQUxJRAkwCS8qIGludmFsaWQgcG9zaXRpb24gbnVtYmVyICovCisjZGVmaW5lIEJIVl9QT1NJVElPTl9CQVNFCTEJLyogYmFzZSAobGFzdCkgaW1wbGVtZW50YXRpb24gbGF5ZXIgKi8KKyNkZWZpbmUgQkhWX1BPU0lUSU9OX1RPUAk2MwkvKiB0b3AgKGZpcnN0KSBpbXBsZW1lbnRhdGlvbiBsYXllciAqLworCisvKgorICogUGx1bWJpbmcgbWFjcm9zLgorICovCisjZGVmaW5lIEJIVl9IRUFEX0ZJUlNUKGJocCkJKEFTU0VSVCgoYmhwKS0+YmhfZmlyc3QpLCAoYmhwKS0+YmhfZmlyc3QpCisjZGVmaW5lIEJIVl9ORVhUKGJkcCkJCShBU1NFUlQoKGJkcCktPmJkX25leHQpLCAoYmRwKS0+YmRfbmV4dCkKKyNkZWZpbmUgQkhWX05FWFROVUxMKGJkcCkJKChiZHApLT5iZF9uZXh0KQorI2RlZmluZSBCSFZfVk9CSihiZHApCQkoQVNTRVJUKChiZHApLT5iZF92b2JqKSwgKGJkcCktPmJkX3ZvYmopCisjZGVmaW5lIEJIVl9WT0JKTlVMTChiZHApCSgoYmRwKS0+YmRfdm9iaikKKyNkZWZpbmUgQkhWX1BEQVRBKGJkcCkJCShiZHApLT5iZF9wZGF0YQorI2RlZmluZSBCSFZfT1BTKGJkcCkJCShiZHApLT5iZF9vcHMKKyNkZWZpbmUgQkhWX0lERU5USVRZKGJkcCkJKChiaHZfaWRlbnRpdHlfdCAqKShiZHApLT5iZF9vcHMpCisjZGVmaW5lIEJIVl9QT1NJVElPTihiZHApCShCSFZfSURFTlRJVFkoYmRwKS0+YmlfcG9zaXRpb24pCisKK2V4dGVybiB2b2lkIGJodl9oZWFkX2luaXQoYmh2X2hlYWRfdCAqLCBjaGFyICopOworZXh0ZXJuIHZvaWQgYmh2X2hlYWRfZGVzdHJveShiaHZfaGVhZF90ICopOworZXh0ZXJuIGludCAgYmh2X2luc2VydChiaHZfaGVhZF90ICosIGJodl9kZXNjX3QgKik7CitleHRlcm4gdm9pZCBiaHZfaW5zZXJ0X2luaXRpYWwoYmh2X2hlYWRfdCAqLCBiaHZfZGVzY190ICopOworCisvKgorICogSW5pdGlhbGl6ZSBhIG5ldyBiZWhhdmlvciBkZXNjcmlwdG9yLgorICogQXJndW1lbnRzOgorICogICBiZHAgLSBwb2ludGVyIHRvIGJlaGF2aW9yIGRlc2NyaXB0b3IKKyAqICAgcGRhdGEgLSBwb2ludGVyIHRvIGJlaGF2aW9yJ3MgcHJpdmF0ZSBkYXRhCisgKiAgIHZvYmogLSBwb2ludGVyIHRvIGFzc29jaWF0ZWQgdmlydHVhbCBvYmplY3QKKyAqICAgb3BzIC0gcG9pbnRlciB0byBvcHMgZm9yIHRoaXMgYmVoYXZpb3IKKyAqLworI2RlZmluZSBiaHZfZGVzY19pbml0KGJkcCwgcGRhdGEsIHZvYmosIG9wcykJCVwKKyB7CQkJCQkJCVwKKwkoYmRwKS0+YmRfcGRhdGEgPSBwZGF0YTsJCQlcCisJKGJkcCktPmJkX3ZvYmogPSB2b2JqOwkJCQlcCisJKGJkcCktPmJkX29wcyA9IG9wczsJCQkJXAorCShiZHApLT5iZF9uZXh0ID0gTlVMTDsJCQkJXAorIH0KKworLyoKKyAqIFJlbW92ZSBhIGJlaGF2aW9yIGRlc2NyaXB0b3IgZnJvbSBhIGJlaGF2aW9yIGNoYWluLgorICovCisjZGVmaW5lIGJodl9yZW1vdmUoYmhwLCBiZHApCQkJCVwKKyB7CQkJCQkJCVwKKwlpZiAoKGJocCktPmJoX2ZpcnN0ID09IChiZHApKSB7CQkJXAorCQkvKgkJCQkJXAorCQkqIFJlbW92ZSBmcm9tIGZyb250IG9mIGNoYWluLgkJXAorCQkqIEF0b21pYyB3cnQgb2lwJ3MuCQkJXAorCQkqLwkJCQkJXAorCSAgICAgICAoYmhwKS0+YmhfZmlyc3QgPSAoYmRwKS0+YmRfbmV4dDsJXAorCX0gZWxzZSB7CQkJCQlcCisJICAgICAgIC8qIHJlbW92ZSBmcm9tIG5vbi1mcm9udCBvZiBjaGFpbiAqLwlcCisJICAgICAgIGJodl9yZW1vdmVfbm90X2ZpcnN0KGJocCwgYmRwKTsJCVwKKwl9CQkJCQkJXAorCShiZHApLT5iZF92b2JqID0gTlVMTDsJCQkJXAorIH0KKworLyoKKyAqIEJlaGF2aW9yIG1vZHVsZSBwcm90b3R5cGVzLgorICovCitleHRlcm4gdm9pZAkJYmh2X3JlbW92ZV9ub3RfZmlyc3QoYmh2X2hlYWRfdCAqYmhwLCBiaHZfZGVzY190ICpiZHApOworZXh0ZXJuIGJodl9kZXNjX3QgKgliaHZfbG9va3VwKGJodl9oZWFkX3QgKmJocCwgdm9pZCAqb3BzKTsKK2V4dGVybiBiaHZfZGVzY190ICoJYmh2X2xvb2t1cF9yYW5nZShiaHZfaGVhZF90ICpiaHAsIGludCBsb3csIGludCBoaWdoKTsKK2V4dGVybiBiaHZfZGVzY190ICoJYmh2X2Jhc2UoYmh2X2hlYWRfdCAqYmhwKTsKKworLyogTm8gYmh2IGxvY2tpbmcgb24gTGludXggKi8KKyNkZWZpbmUgYmh2X2xvb2t1cF91bmxvY2tlZAliaHZfbG9va3VwCisjZGVmaW5lIGJodl9iYXNlX3VubG9ja2VkCWJodl9iYXNlCisKKyNlbmRpZiAvKiBfX1hGU19CRUhBVklPUl9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYml0LmMgYi9mcy94ZnMveGZzX2JpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMGE2YzMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2JpdC5jCkBAIC0wLDAgKzEsMzEyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisvKgorICogWEZTIGJpdCBtYW5pcHVsYXRpb24gcm91dGluZXMsIHVzZWQgaW4gbm9uLXJlYWx0aW1lIGNvZGUuCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCisKKworI2lmbmRlZiBIQVZFX0FSQ0hfSElHSEJJVAorLyoKKyAqIEluZGV4IG9mIGhpZ2ggYml0IG51bWJlciBpbiBieXRlLCAtMSBmb3Igbm9uZSBzZXQsIDAuLjcgb3RoZXJ3aXNlLgorICovCitjb25zdCBjaGFyIHhmc19oaWdoYml0WzI1Nl0gPSB7CisgICAgICAgLTEsIDAsIDEsIDEsIDIsIDIsIDIsIDIsCQkJLyogMDAgLi4gMDcgKi8KKwkzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAkJCS8qIDA4IC4uIDBmICovCisJNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwJCQkvKiAxMCAuLiAxNyAqLworCTQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCQkJLyogMTggLi4gMWYgKi8KKwk1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LAkJCS8qIDIwIC4uIDI3ICovCisJNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwJCQkvKiAyOCAuLiAyZiAqLworCTUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsCQkJLyogMzAgLi4gMzcgKi8KKwk1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LAkJCS8qIDM4IC4uIDNmICovCisJNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwJCQkvKiA0MCAuLiA0NyAqLworCTYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsCQkJLyogNDggLi4gNGYgKi8KKwk2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAkJCS8qIDUwIC4uIDU3ICovCisJNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwJCQkvKiA1OCAuLiA1ZiAqLworCTYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsCQkJLyogNjAgLi4gNjcgKi8KKwk2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAkJCS8qIDY4IC4uIDZmICovCisJNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwJCQkvKiA3MCAuLiA3NyAqLworCTYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsCQkJLyogNzggLi4gN2YgKi8KKwk3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAkJCS8qIDgwIC4uIDg3ICovCisJNywgNywgNywgNywgNywgNywgNywgNywJCQkvKiA4OCAuLiA4ZiAqLworCTcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCQkJLyogOTAgLi4gOTcgKi8KKwk3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAkJCS8qIDk4IC4uIDlmICovCisJNywgNywgNywgNywgNywgNywgNywgNywJCQkvKiBhMCAuLiBhNyAqLworCTcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCQkJLyogYTggLi4gYWYgKi8KKwk3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAkJCS8qIGIwIC4uIGI3ICovCisJNywgNywgNywgNywgNywgNywgNywgNywJCQkvKiBiOCAuLiBiZiAqLworCTcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCQkJLyogYzAgLi4gYzcgKi8KKwk3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAkJCS8qIGM4IC4uIGNmICovCisJNywgNywgNywgNywgNywgNywgNywgNywJCQkvKiBkMCAuLiBkNyAqLworCTcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCQkJLyogZDggLi4gZGYgKi8KKwk3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAkJCS8qIGUwIC4uIGU3ICovCisJNywgNywgNywgNywgNywgNywgNywgNywJCQkvKiBlOCAuLiBlZiAqLworCTcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCQkJLyogZjAgLi4gZjcgKi8KKwk3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAkJCS8qIGY4IC4uIGZmICovCit9OworI2VuZGlmCisKKy8qCisgKiBDb3VudCBvZiBiaXRzIHNldCBpbiBieXRlLCAwLi44LgorICovCitzdGF0aWMgY29uc3QgY2hhciB4ZnNfY291bnRiaXRbMjU2XSA9IHsKKwkwLCAxLCAxLCAyLCAxLCAyLCAyLCAzLAkJCS8qIDAwIC4uIDA3ICovCisJMSwgMiwgMiwgMywgMiwgMywgMywgNCwJCQkvKiAwOCAuLiAwZiAqLworCTEsIDIsIDIsIDMsIDIsIDMsIDMsIDQsCQkJLyogMTAgLi4gMTcgKi8KKwkyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LAkJCS8qIDE4IC4uIDFmICovCisJMSwgMiwgMiwgMywgMiwgMywgMywgNCwJCQkvKiAyMCAuLiAyNyAqLworCTIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsCQkJLyogMjggLi4gMmYgKi8KKwkyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LAkJCS8qIDMwIC4uIDM3ICovCisJMywgNCwgNCwgNSwgNCwgNSwgNSwgNiwJCQkvKiAzOCAuLiAzZiAqLworCTEsIDIsIDIsIDMsIDIsIDMsIDMsIDQsCQkJLyogNDAgLi4gNDcgKi8KKwkyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LAkJCS8qIDQ4IC4uIDRmICovCisJMiwgMywgMywgNCwgMywgNCwgNCwgNSwJCQkvKiA1MCAuLiA1NyAqLworCTMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsCQkJLyogNTggLi4gNWYgKi8KKwkyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LAkJCS8qIDYwIC4uIDY3ICovCisJMywgNCwgNCwgNSwgNCwgNSwgNSwgNiwJCQkvKiA2OCAuLiA2ZiAqLworCTMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsCQkJLyogNzAgLi4gNzcgKi8KKwk0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LAkJCS8qIDc4IC4uIDdmICovCisJMSwgMiwgMiwgMywgMiwgMywgMywgNCwJCQkvKiA4MCAuLiA4NyAqLworCTIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsCQkJLyogODggLi4gOGYgKi8KKwkyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LAkJCS8qIDkwIC4uIDk3ICovCisJMywgNCwgNCwgNSwgNCwgNSwgNSwgNiwJCQkvKiA5OCAuLiA5ZiAqLworCTIsIDMsIDMsIDQsIDMsIDQsIDQsIDUsCQkJLyogYTAgLi4gYTcgKi8KKwkzLCA0LCA0LCA1LCA0LCA1LCA1LCA2LAkJCS8qIGE4IC4uIGFmICovCisJMywgNCwgNCwgNSwgNCwgNSwgNSwgNiwJCQkvKiBiMCAuLiBiNyAqLworCTQsIDUsIDUsIDYsIDUsIDYsIDYsIDcsCQkJLyogYjggLi4gYmYgKi8KKwkyLCAzLCAzLCA0LCAzLCA0LCA0LCA1LAkJCS8qIGMwIC4uIGM3ICovCisJMywgNCwgNCwgNSwgNCwgNSwgNSwgNiwJCQkvKiBjOCAuLiBjZiAqLworCTMsIDQsIDQsIDUsIDQsIDUsIDUsIDYsCQkJLyogZDAgLi4gZDcgKi8KKwk0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LAkJCS8qIGQ4IC4uIGRmICovCisJMywgNCwgNCwgNSwgNCwgNSwgNSwgNiwJCQkvKiBlMCAuLiBlNyAqLworCTQsIDUsIDUsIDYsIDUsIDYsIDYsIDcsCQkJLyogZTggLi4gZWYgKi8KKwk0LCA1LCA1LCA2LCA1LCA2LCA2LCA3LAkJCS8qIGYwIC4uIGY3ICovCisJNSwgNiwgNiwgNywgNiwgNywgNywgOCwJCQkvKiBmOCAuLiBmZiAqLworfTsKKworLyoKKyAqIHhmc19oaWdoYml0MzI6IGdldCBoaWdoIGJpdCBzZXQgb3V0IG9mIDMyLWJpdCBhcmd1bWVudCwgLTEgaWYgbm9uZSBzZXQuCisgKi8KK2lubGluZSBpbnQKK3hmc19oaWdoYml0MzIoCisJX191aW50MzJfdAl2KQoreworI2lmZGVmIEhBVkVfQVJDSF9ISUdIQklUCisJcmV0dXJuIGhpZ2hiaXQzMih2KTsKKyNlbHNlCisJaW50CQlpOworCisJaWYgKHYgJiAweGZmZmYwMDAwKQorCQlpZiAodiAmIDB4ZmYwMDAwMDApCisJCQlpID0gMjQ7CisJCWVsc2UKKwkJCWkgPSAxNjsKKwllbHNlIGlmICh2ICYgMHgwMDAwZmZmZikKKwkJaWYgKHYgJiAweDAwMDBmZjAwKQorCQkJaSA9IDg7CisJCWVsc2UKKwkJCWkgPSAwOworCWVsc2UKKwkJcmV0dXJuIC0xOworCXJldHVybiBpICsgeGZzX2hpZ2hiaXRbKHYgPj4gaSkgJiAweGZmXTsKKyNlbmRpZgorfQorCisvKgorICogeGZzX2xvd2JpdDY0OiBnZXQgbG93IGJpdCBzZXQgb3V0IG9mIDY0LWJpdCBhcmd1bWVudCwgLTEgaWYgbm9uZSBzZXQuCisgKi8KK2ludAoreGZzX2xvd2JpdDY0KAorCV9fdWludDY0X3QJdikKK3sKKwlfX3VpbnQzMl90CXcgPSAoX191aW50MzJfdCl2OworCWludAkJbiA9IDA7CisKKwlpZiAodykgewkvKiBsb3dlciBiaXRzICovCisJCW4gPSBmZnModyk7CisJfSBlbHNlIHsJLyogdXBwZXIgYml0cyAqLworCQl3ID0gKF9fdWludDMyX3QpKHYgPj4gMzIpOworCQlpZiAodyAmJiAobiA9IGZmcyh3KSkpCisJCQluICs9IDMyOworCX0KKwlyZXR1cm4gbiAtIDE7Cit9CisKKy8qCisgKiB4ZnNfaGlnaGJpdDY0OiBnZXQgaGlnaCBiaXQgc2V0IG91dCBvZiA2NC1iaXQgYXJndW1lbnQsIC0xIGlmIG5vbmUgc2V0LgorICovCitpbnQKK3hmc19oaWdoYml0NjQoCisJX191aW50NjRfdAl2KQoreworCV9fdWludDMyX3QJaCA9IChfX3VpbnQzMl90KSh2ID4+IDMyKTsKKworCWlmIChoKQorCQlyZXR1cm4geGZzX2hpZ2hiaXQzMihoKSArIDMyOworCXJldHVybiB4ZnNfaGlnaGJpdDMyKChfX3VpbnQzMl90KXYpOworfQorCisKKy8qCisgKiBDb3VudCB0aGUgbnVtYmVyIG9mIGJpdHMgc2V0IGluIHRoZSBiaXRtYXAgc3RhcnRpbmcgd2l0aCBiaXQKKyAqIHN0YXJ0X2JpdC4gIFNpemUgaXMgdGhlIHNpemUgb2YgdGhlIGJpdG1hcCBpbiB3b3Jkcy4KKyAqCisgKiBEbyB0aGUgY291bnRpbmcgYnkgbWFwcGluZyBhIGJ5dGUgdmFsdWUgdG8gdGhlIG51bWJlciBvZiBzZXQKKyAqIGJpdHMgZm9yIHRoYXQgdmFsdWUgdXNpbmcgdGhlIHhmc19jb3VudGJpdCBhcnJheSwgaS5lLgorICogeGZzX2NvdW50Yml0WzBdID09IDAsIHhmc19jb3VudGJpdFsxXSA9PSAxLCB4ZnNfY291bnRiaXRbMl0gPT0gMSwKKyAqIHhmc19jb3VudGJpdFszXSA9PSAyLCBldGMuCisgKi8KK2ludAoreGZzX2NvdW50X2JpdHModWludCAqbWFwLCB1aW50IHNpemUsIHVpbnQgc3RhcnRfYml0KQoreworCXJlZ2lzdGVyIGludAliaXRzOworCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIJKmJ5dGVwOworCXJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIJKmVuZF9tYXA7CisJaW50CQlieXRlX2JpdDsKKworCWJpdHMgPSAwOworCWVuZF9tYXAgPSAoY2hhciopKG1hcCArIHNpemUpOworCWJ5dGVwID0gKGNoYXIqKShtYXAgKyAoc3RhcnRfYml0ICYgfjB4NykpOworCWJ5dGVfYml0ID0gc3RhcnRfYml0ICYgMHg3OworCisJLyoKKwkgKiBJZiB0aGUgY2FsbGVyIGZlbGwgb2ZmIHRoZSBlbmQgb2YgdGhlIG1hcCwgcmV0dXJuIDAuCisJICovCisJaWYgKGJ5dGVwID49IGVuZF9tYXApIHsKKwkJcmV0dXJuICgwKTsKKwl9CisKKwkvKgorCSAqIElmIHN0YXJ0X2JpdCBpcyBub3QgYnl0ZSBhbGlnbmVkLCB0aGVuIHByb2Nlc3MgdGhlCisJICogZmlyc3QgYnl0ZSBzZXBhcmF0ZWx5LgorCSAqLworCWlmIChieXRlX2JpdCAhPSAwKSB7CisJCS8qCisJCSAqIFNoaWZ0IG9mZiB0aGUgYml0cyB3ZSBkb24ndCB3YW50IHRvIGxvb2sgYXQsCisJCSAqIGJlZm9yZSBpbmRleGluZyBpbnRvIHhmc19jb3VudGJpdC4KKwkJICovCisJCWJpdHMgKz0geGZzX2NvdW50Yml0WygqYnl0ZXAgPj4gYnl0ZV9iaXQpXTsKKwkJYnl0ZXArKzsKKwl9CisKKwkvKgorCSAqIENvdW50IHRoZSBiaXRzIGluIGVhY2ggYnl0ZSB1bnRpbCB0aGUgZW5kIG9mIHRoZSBiaXRtYXAuCisJICovCisJd2hpbGUgKGJ5dGVwIDwgZW5kX21hcCkgeworCQliaXRzICs9IHhmc19jb3VudGJpdFsqYnl0ZXBdOworCQlieXRlcCsrOworCX0KKworCXJldHVybiAoYml0cyk7Cit9CisKKy8qCisgKiBDb3VudCB0aGUgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgYml0cyBzZXQgaW4gdGhlIGJpdG1hcCBzdGFydGluZyB3aXRoIGJpdAorICogc3RhcnRfYml0LiAgU2l6ZSBpcyB0aGUgc2l6ZSBvZiB0aGUgYml0bWFwIGluIHdvcmRzLgorICovCitpbnQKK3hmc19jb250aWdfYml0cyh1aW50ICptYXAsIHVpbnQJc2l6ZSwgdWludCBzdGFydF9iaXQpCit7CisJdWludCAqIHAgPSAoKHVuc2lnbmVkIGludCAqKSBtYXApICsgKHN0YXJ0X2JpdCA+PiBCSVRfVE9fV09SRF9TSElGVCk7CisJdWludCByZXN1bHQgPSAwOworCXVpbnQgdG1wOworCisJc2l6ZSA8PD0gQklUX1RPX1dPUkRfU0hJRlQ7CisKKwlBU1NFUlQoc3RhcnRfYml0IDwgc2l6ZSk7CisJc2l6ZSAtPSBzdGFydF9iaXQgJiB+KE5CV09SRCAtIDEpOworCXN0YXJ0X2JpdCAmPSAoTkJXT1JEIC0gMSk7CisJaWYgKHN0YXJ0X2JpdCkgeworCQl0bXAgPSAqcCsrOworCQkvKiBzZXQgdG8gb25lIGZpcnN0IG9mZnNldCBiaXRzIHByaW9yIHRvIHN0YXJ0ICovCisJCXRtcCB8PSAofjBVID4+IChOQldPUkQtc3RhcnRfYml0KSk7CisJCWlmICh0bXAgIT0gfjBVKQorCQkJZ290byBmb3VuZDsKKwkJcmVzdWx0ICs9IE5CV09SRDsKKwkJc2l6ZSAtPSBOQldPUkQ7CisJfQorCXdoaWxlIChzaXplKSB7CisJCWlmICgodG1wID0gKnArKykgIT0gfjBVKQorCQkJZ290byBmb3VuZDsKKwkJcmVzdWx0ICs9IE5CV09SRDsKKwkJc2l6ZSAtPSBOQldPUkQ7CisJfQorCXJldHVybiByZXN1bHQgLSBzdGFydF9iaXQ7Citmb3VuZDoKKwlyZXR1cm4gcmVzdWx0ICsgZmZ6KHRtcCkgLSBzdGFydF9iaXQ7Cit9CisKKy8qCisgKiBUaGlzIHRha2VzIHRoZSBiaXQgbnVtYmVyIHRvIHN0YXJ0IGxvb2tpbmcgZnJvbSBhbmQKKyAqIHJldHVybnMgdGhlIG5leHQgc2V0IGJpdCBmcm9tIHRoZXJlLiAgSXQgcmV0dXJucyAtMQorICogaWYgdGhlcmUgYXJlIG5vIG1vcmUgYml0cyBzZXQgb3IgdGhlIHN0YXJ0IGJpdCBpcworICogYmV5b25kIHRoZSBlbmQgb2YgdGhlIGJpdG1hcC4KKyAqCisgKiBTaXplIGlzIHRoZSBudW1iZXIgb2Ygd29yZHMsIG5vdCBieXRlcywgaW4gdGhlIGJpdG1hcC4KKyAqLworaW50IHhmc19uZXh0X2JpdCh1aW50ICptYXAsIHVpbnQgc2l6ZSwgdWludCBzdGFydF9iaXQpCit7CisJdWludCAqIHAgPSAoKHVuc2lnbmVkIGludCAqKSBtYXApICsgKHN0YXJ0X2JpdCA+PiBCSVRfVE9fV09SRF9TSElGVCk7CisJdWludCByZXN1bHQgPSBzdGFydF9iaXQgJiB+KE5CV09SRCAtIDEpOworCXVpbnQgdG1wOworCisJc2l6ZSA8PD0gQklUX1RPX1dPUkRfU0hJRlQ7CisKKwlpZiAoc3RhcnRfYml0ID49IHNpemUpCisJCXJldHVybiAtMTsKKwlzaXplIC09IHJlc3VsdDsKKwlzdGFydF9iaXQgJj0gKE5CV09SRCAtIDEpOworCWlmIChzdGFydF9iaXQpIHsKKwkJdG1wID0gKnArKzsKKwkJLyogc2V0IHRvIHplcm8gZmlyc3Qgb2Zmc2V0IGJpdHMgcHJpb3IgdG8gc3RhcnQgKi8KKwkJdG1wICY9ICh+MFUgPDwgc3RhcnRfYml0KTsKKwkJaWYgKHRtcCAhPSAwVSkKKwkJCWdvdG8gZm91bmQ7CisJCXJlc3VsdCArPSBOQldPUkQ7CisJCXNpemUgLT0gTkJXT1JEOworCX0KKwl3aGlsZSAoc2l6ZSkgeworCQlpZiAoKHRtcCA9ICpwKyspICE9IDBVKQorCQkJZ290byBmb3VuZDsKKwkJcmVzdWx0ICs9IE5CV09SRDsKKwkJc2l6ZSAtPSBOQldPUkQ7CisJfQorCXJldHVybiAtMTsKK2ZvdW5kOgorCXJldHVybiByZXN1bHQgKyBmZnModG1wKSAtIDE7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2JpdC5oIGIvZnMveGZzL3hmc19iaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTdmNTdkCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19iaXQuaApAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfQklUX0hfXworI2RlZmluZQlfX1hGU19CSVRfSF9fCisKKy8qCisgKiBYRlMgYml0IG1hbmlwdWxhdGlvbiByb3V0aW5lcy4KKyAqLworCisvKgorICogbWFza3Mgd2l0aCBuIGhpZ2gvbG93IGJpdHMgc2V0LCAzMi1iaXQgdmFsdWVzICYgNjQtYml0IHZhbHVlcworICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19NQVNLMzJISSkKK19fdWludDMyX3QgeGZzX21hc2szMmhpKGludCBuKTsKKyNkZWZpbmUJWEZTX01BU0szMkhJKG4pCQl4ZnNfbWFzazMyaGkobikKKyNlbHNlCisjZGVmaW5lCVhGU19NQVNLMzJISShuKQkJKChfX3VpbnQzMl90KS0xIDw8ICgzMiAtIChuKSkpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX01BU0s2NEhJKQorX191aW50NjRfdCB4ZnNfbWFzazY0aGkoaW50IG4pOworI2RlZmluZQlYRlNfTUFTSzY0SEkobikJCXhmc19tYXNrNjRoaShuKQorI2Vsc2UKKyNkZWZpbmUJWEZTX01BU0s2NEhJKG4pCQkoKF9fdWludDY0X3QpLTEgPDwgKDY0IC0gKG4pKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfTUFTSzMyTE8pCitfX3VpbnQzMl90IHhmc19tYXNrMzJsbyhpbnQgbik7CisjZGVmaW5lCVhGU19NQVNLMzJMTyhuKQkJeGZzX21hc2szMmxvKG4pCisjZWxzZQorI2RlZmluZQlYRlNfTUFTSzMyTE8obikJCSgoKF9fdWludDMyX3QpMSA8PCAobikpIC0gMSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfTUFTSzY0TE8pCitfX3VpbnQ2NF90IHhmc19tYXNrNjRsbyhpbnQgbik7CisjZGVmaW5lCVhGU19NQVNLNjRMTyhuKQkJeGZzX21hc2s2NGxvKG4pCisjZWxzZQorI2RlZmluZQlYRlNfTUFTSzY0TE8obikJCSgoKF9fdWludDY0X3QpMSA8PCAobikpIC0gMSkKKyNlbmRpZgorCisvKiBHZXQgaGlnaCBiaXQgc2V0IG91dCBvZiAzMi1iaXQgYXJndW1lbnQsIC0xIGlmIG5vbmUgc2V0ICovCitleHRlcm4gaW50IHhmc19oaWdoYml0MzIoX191aW50MzJfdCB2KTsKKworLyogR2V0IGxvdyBiaXQgc2V0IG91dCBvZiA2NC1iaXQgYXJndW1lbnQsIC0xIGlmIG5vbmUgc2V0ICovCitleHRlcm4gaW50IHhmc19sb3diaXQ2NChfX3VpbnQ2NF90IHYpOworCisvKiBHZXQgaGlnaCBiaXQgc2V0IG91dCBvZiA2NC1iaXQgYXJndW1lbnQsIC0xIGlmIG5vbmUgc2V0ICovCitleHRlcm4gaW50IHhmc19oaWdoYml0NjQoX191aW50NjRfdCk7CisKKy8qIENvdW50IHNldCBiaXRzIGluIG1hcCBzdGFydGluZyB3aXRoIHN0YXJ0X2JpdCAqLworZXh0ZXJuIGludCB4ZnNfY291bnRfYml0cyh1aW50ICptYXAsIHVpbnQgc2l6ZSwgdWludCBzdGFydF9iaXQpOworCisvKiBDb3VudCBjb250aW51b3VzIG9uZSBiaXRzIGluIG1hcCBzdGFydGluZyB3aXRoIHN0YXJ0X2JpdCAqLworZXh0ZXJuIGludCB4ZnNfY29udGlnX2JpdHModWludCAqbWFwLCB1aW50IHNpemUsIHVpbnQgc3RhcnRfYml0KTsKKworLyogRmluZCBuZXh0IHNldCBiaXQgaW4gbWFwICovCitleHRlcm4gaW50IHhmc19uZXh0X2JpdCh1aW50ICptYXAsIHVpbnQgc2l6ZSwgdWludCBzdGFydF9iaXQpOworCisjZW5kaWYJLyogX19YRlNfQklUX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19ibWFwLmMgYi9mcy94ZnMveGZzX2JtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTMxNjI0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19ibWFwLmMKQEAgLTAsMCArMSw2MjQ2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisKKyNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2FnLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvYy5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2l0YWJsZS5oIgorI2luY2x1ZGUgInhmc19leHRmcmVlX2l0ZW0uaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcC5oIgorI2luY2x1ZGUgInhmc19ydGFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisjaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9sZWFmLmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgorI2luY2x1ZGUgInhmc19ydy5oIgorI2luY2x1ZGUgInhmc19xdW90YS5oIgorI2luY2x1ZGUgInhmc190cmFuc19zcGFjZS5oIgorI2luY2x1ZGUgInhmc19idWZfaXRlbS5oIgorCisKKyNpZmRlZiBERUJVRworU1RBVElDIHZvaWQKK3hmc19ibWFwX2NoZWNrX2xlYWZfZXh0ZW50cyh4ZnNfYnRyZWVfY3VyX3QgKmN1ciwgeGZzX2lub2RlX3QgKmlwLCBpbnQgd2hpY2hmb3JrKTsKKyNlbmRpZgorCitrbWVtX3pvbmVfdAkJKnhmc19ibWFwX2ZyZWVfaXRlbV96b25lOworCisvKgorICogUHJvdG90eXBlcyBmb3IgaW50ZXJuYWwgYm1hcCByb3V0aW5lcy4KKyAqLworCisKKy8qCisgKiBDYWxsZWQgZnJvbSB4ZnNfYm1hcF9hZGRfYXR0cmZvcmsgdG8gaGFuZGxlIGV4dGVudHMgZm9ybWF0IGZpbGVzLgorICovCitTVEFUSUMgaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2JtYXBfYWRkX2F0dHJmb3JrX2V4dGVudHMoCisJeGZzX3RyYW5zX3QJCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfaW5vZGVfdAkJKmlwLAkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfZnNibG9ja190CQkqZmlyc3RibG9jaywJLyogZmlyc3QgYmxvY2sgYWxsb2NhdGVkICovCisJeGZzX2JtYXBfZnJlZV90CQkqZmxpc3QsCQkvKiBibG9ja3MgdG8gZnJlZSBhdCBjb21taXQgKi8KKwlpbnQJCQkqZmxhZ3MpOwkvKiBpbm9kZSBsb2dnaW5nIGZsYWdzICovCisKKy8qCisgKiBDYWxsZWQgZnJvbSB4ZnNfYm1hcF9hZGRfYXR0cmZvcmsgdG8gaGFuZGxlIGxvY2FsIGZvcm1hdCBmaWxlcy4KKyAqLworU1RBVElDIGludAkJCQkJLyogZXJyb3IgKi8KK3hmc19ibWFwX2FkZF9hdHRyZm9ya19sb2NhbCgKKwl4ZnNfdHJhbnNfdAkJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19pbm9kZV90CQkqaXAsCQkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLworCXhmc19mc2Jsb2NrX3QJCSpmaXJzdGJsb2NrLAkvKiBmaXJzdCBibG9jayBhbGxvY2F0ZWQgKi8KKwl4ZnNfYm1hcF9mcmVlX3QJCSpmbGlzdCwJCS8qIGJsb2NrcyB0byBmcmVlIGF0IGNvbW1pdCAqLworCWludAkJCSpmbGFncyk7CS8qIGlub2RlIGxvZ2dpbmcgZmxhZ3MgKi8KKworLyoKKyAqIENhbGxlZCBieSB4ZnNfYm1hcGkgdG8gdXBkYXRlIGV4dGVudCBsaXN0IHN0cnVjdHVyZSBhbmQgdGhlIGJ0cmVlCisgKiBhZnRlciBhbGxvY2F0aW5nIHNwYWNlIChvciBkb2luZyBhIGRlbGF5ZWQgYWxsb2NhdGlvbikuCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19ibWFwX2FkZF9leHRlbnQoCisJeGZzX2lub2RlX3QJCSppcCwJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfZXh0bnVtX3QJCWlkeCwJLyogZXh0ZW50IG51bWJlciB0byB1cGRhdGUvaW5zZXJ0ICovCisJeGZzX2J0cmVlX2N1cl90CQkqKmN1cnAsCS8qIGlmICpjdXJwIGlzIG51bGwsIG5vdCBhIGJ0cmVlICovCisJeGZzX2JtYnRfaXJlY190CQkqbmV3LAkvKiBuZXcgZGF0YSB0byBwdXQgaW4gZXh0ZW50IGxpc3QgKi8KKwl4ZnNfZnNibG9ja190CQkqZmlyc3QsCS8qIHBvaW50ZXIgdG8gZmlyc3RibG9jayB2YXJpYWJsZSAqLworCXhmc19ibWFwX2ZyZWVfdAkJKmZsaXN0LAkvKiBsaXN0IG9mIGV4dGVudHMgdG8gYmUgZnJlZWQgKi8KKwlpbnQJCQkqbG9nZmxhZ3NwLCAvKiBpbm9kZSBsb2dnaW5nIGZsYWdzICovCisJaW50CQkJd2hpY2hmb3JrLCAvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworCWludAkJCXJzdmQpOwkvKiBPSyB0byBhbGxvY2F0ZSByZXNlcnZlZCBibG9ja3MgKi8KKworLyoKKyAqIENhbGxlZCBieSB4ZnNfYm1hcF9hZGRfZXh0ZW50IHRvIGhhbmRsZSBjYXNlcyBjb252ZXJ0aW5nIGEgZGVsYXllZAorICogYWxsb2NhdGlvbiB0byBhIHJlYWwgYWxsb2NhdGlvbi4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX2JtYXBfYWRkX2V4dGVudF9kZWxheV9yZWFsKAorCXhmc19pbm9kZV90CQkqaXAsCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCisJeGZzX2V4dG51bV90CQlpZHgsCS8qIGV4dGVudCBudW1iZXIgdG8gdXBkYXRlL2luc2VydCAqLworCXhmc19idHJlZV9jdXJfdAkJKipjdXJwLAkvKiBpZiAqY3VycCBpcyBudWxsLCBub3QgYSBidHJlZSAqLworCXhmc19ibWJ0X2lyZWNfdAkJKm5ldywJLyogbmV3IGRhdGEgdG8gcHV0IGluIGV4dGVudCBsaXN0ICovCisJeGZzX2ZpbGJsa3NfdAkJKmRuZXcsCS8qIG5ldyBkZWxheWVkLWFsbG9jIGluZGlyZWN0IGJsb2NrcyAqLworCXhmc19mc2Jsb2NrX3QJCSpmaXJzdCwJLyogcG9pbnRlciB0byBmaXJzdGJsb2NrIHZhcmlhYmxlICovCisJeGZzX2JtYXBfZnJlZV90CQkqZmxpc3QsCS8qIGxpc3Qgb2YgZXh0ZW50cyB0byBiZSBmcmVlZCAqLworCWludAkJCSpsb2dmbGFnc3AsIC8qIGlub2RlIGxvZ2dpbmcgZmxhZ3MgKi8KKwlpbnQJCQlyc3ZkKTsJLyogT0sgdG8gYWxsb2NhdGUgcmVzZXJ2ZWQgYmxvY2tzICovCisKKy8qCisgKiBDYWxsZWQgYnkgeGZzX2JtYXBfYWRkX2V4dGVudCB0byBoYW5kbGUgY2FzZXMgY29udmVydGluZyBhIGhvbGUKKyAqIHRvIGEgZGVsYXllZCBhbGxvY2F0aW9uLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfYm1hcF9hZGRfZXh0ZW50X2hvbGVfZGVsYXkoCisJeGZzX2lub2RlX3QJCSppcCwJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfZXh0bnVtX3QJCWlkeCwJLyogZXh0ZW50IG51bWJlciB0byB1cGRhdGUvaW5zZXJ0ICovCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBpZiBudWxsLCBub3QgYSBidHJlZSAqLworCXhmc19ibWJ0X2lyZWNfdAkJKm5ldywJLyogbmV3IGRhdGEgdG8gcHV0IGluIGV4dGVudCBsaXN0ICovCisJaW50CQkJKmxvZ2ZsYWdzcCwvKiBpbm9kZSBsb2dnaW5nIGZsYWdzICovCisJaW50CQkJcnN2ZCk7CS8qIE9LIHRvIGFsbG9jYXRlIHJlc2VydmVkIGJsb2NrcyAqLworCisvKgorICogQ2FsbGVkIGJ5IHhmc19ibWFwX2FkZF9leHRlbnQgdG8gaGFuZGxlIGNhc2VzIGNvbnZlcnRpbmcgYSBob2xlCisgKiB0byBhIHJlYWwgYWxsb2NhdGlvbi4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX2JtYXBfYWRkX2V4dGVudF9ob2xlX3JlYWwoCisJeGZzX2lub2RlX3QJCSppcCwJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfZXh0bnVtX3QJCWlkeCwJLyogZXh0ZW50IG51bWJlciB0byB1cGRhdGUvaW5zZXJ0ICovCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBpZiBudWxsLCBub3QgYSBidHJlZSAqLworCXhmc19ibWJ0X2lyZWNfdAkJKm5ldywJLyogbmV3IGRhdGEgdG8gcHV0IGluIGV4dGVudCBsaXN0ICovCisJaW50CQkJKmxvZ2ZsYWdzcCwgLyogaW5vZGUgbG9nZ2luZyBmbGFncyAqLworCWludAkJCXdoaWNoZm9yayk7IC8qIGRhdGEgb3IgYXR0ciBmb3JrICovCisKKy8qCisgKiBDYWxsZWQgYnkgeGZzX2JtYXBfYWRkX2V4dGVudCB0byBoYW5kbGUgY2FzZXMgY29udmVydGluZyBhbiB1bndyaXR0ZW4KKyAqIGFsbG9jYXRpb24gdG8gYSByZWFsIGFsbG9jYXRpb24gb3IgdmljZSB2ZXJzYS4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX2JtYXBfYWRkX2V4dGVudF91bndyaXR0ZW5fcmVhbCgKKwl4ZnNfaW5vZGVfdAkJKmlwLAkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLworCXhmc19leHRudW1fdAkJaWR4LAkvKiBleHRlbnQgbnVtYmVyIHRvIHVwZGF0ZS9pbnNlcnQgKi8KKwl4ZnNfYnRyZWVfY3VyX3QJCSoqY3VycCwJLyogaWYgKmN1cnAgaXMgbnVsbCwgbm90IGEgYnRyZWUgKi8KKwl4ZnNfYm1idF9pcmVjX3QJCSpuZXcsCS8qIG5ldyBkYXRhIHRvIHB1dCBpbiBleHRlbnQgbGlzdCAqLworCWludAkJCSpsb2dmbGFnc3ApOyAvKiBpbm9kZSBsb2dnaW5nIGZsYWdzICovCisKKy8qCisgKiB4ZnNfYm1hcF9hbGxvYyBpcyBjYWxsZWQgYnkgeGZzX2JtYXBpIHRvIGFsbG9jYXRlIGFuIGV4dGVudCBmb3IgYSBmaWxlLgorICogSXQgZmlndXJlcyBvdXQgd2hlcmUgdG8gYXNrIHRoZSB1bmRlcmx5aW5nIGFsbG9jYXRvciB0byBwdXQgdGhlIG5ldyBleHRlbnQuCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19ibWFwX2FsbG9jKAorCXhmc19ibWFsbG9jYV90CQkqYXApOwkvKiBibWFwIGFsbG9jIGFyZ3VtZW50IHN0cnVjdCAqLworCisvKgorICogVHJhbnNmb3JtIGEgYnRyZWUgZm9ybWF0IGZpbGUgd2l0aCBvbmx5IG9uZSBsZWFmIG5vZGUsIHdoZXJlIHRoZQorICogZXh0ZW50cyBsaXN0IHdpbGwgZml0IGluIHRoZSBpbm9kZSwgaW50byBhbiBleHRlbnRzIGZvcm1hdCBmaWxlLgorICogU2luY2UgdGhlIGV4dGVudCBsaXN0IGlzIGFscmVhZHkgaW4tY29yZSwgYWxsIHdlIGhhdmUgdG8gZG8gaXMKKyAqIGdpdmUgdXAgdGhlIHNwYWNlIGZvciB0aGUgYnRyZWUgcm9vdCBhbmQgcGl0Y2ggdGhlIGxlYWYgYmxvY2suCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19ibWFwX2J0cmVlX3RvX2V4dGVudHMoCisJeGZzX3RyYW5zX3QJCSp0cCwJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19pbm9kZV90CQkqaXAsCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCQkqbG9nZmxhZ3NwLCAvKiBpbm9kZSBsb2dnaW5nIGZsYWdzICovCisJaW50CQkJd2hpY2hmb3JrKTsgLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KKworI2lmZGVmIERFQlVHCisvKgorICogQ2hlY2sgdGhhdCB0aGUgZXh0ZW50cyBsaXN0IGZvciB0aGUgaW5vZGUgaXAgaXMgaW4gdGhlIHJpZ2h0IG9yZGVyLgorICovCitTVEFUSUMgdm9pZAoreGZzX2JtYXBfY2hlY2tfZXh0ZW50cygKKwl4ZnNfaW5vZGVfdAkJKmlwLAkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwlpbnQJCQl3aGljaGZvcmspOwkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworI2VuZGlmCisKKy8qCisgKiBDYWxsZWQgYnkgeGZzX2JtYXBpIHRvIHVwZGF0ZSBleHRlbnQgbGlzdCBzdHJ1Y3R1cmUgYW5kIHRoZSBidHJlZQorICogYWZ0ZXIgcmVtb3Zpbmcgc3BhY2UgKG9yIHVuZG9pbmcgYSBkZWxheWVkIGFsbG9jYXRpb24pLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfYm1hcF9kZWxfZXh0ZW50KAorCXhmc19pbm9kZV90CQkqaXAsCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCisJeGZzX3RyYW5zX3QJCSp0cCwJLyogY3VycmVudCB0cmFucyBwb2ludGVyICovCisJeGZzX2V4dG51bV90CQlpZHgsCS8qIGV4dGVudCBudW1iZXIgdG8gdXBkYXRlL2luc2VydCAqLworCXhmc19ibWFwX2ZyZWVfdAkJKmZsaXN0LAkvKiBsaXN0IG9mIGV4dGVudHMgdG8gYmUgZnJlZWQgKi8KKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGlmIG51bGwsIG5vdCBhIGJ0cmVlICovCisJeGZzX2JtYnRfaXJlY190CQkqbmV3LAkvKiBuZXcgZGF0YSB0byBwdXQgaW4gZXh0ZW50IGxpc3QgKi8KKwlpbnQJCQkqbG9nZmxhZ3NwLC8qIGlub2RlIGxvZ2dpbmcgZmxhZ3MgKi8KKwlpbnQJCQl3aGljaGZvcmssIC8qIGRhdGEgb3IgYXR0ciBmb3JrICovCisJaW50CQkJcnN2ZCk7CSAvKiBPSyB0byBhbGxvY2F0ZSByZXNlcnZlZCBibG9ja3MgKi8KKworLyoKKyAqIFJlbW92ZSB0aGUgZW50cnkgImZyZWUiIGZyb20gdGhlIGZyZWUgaXRlbSBsaXN0LiAgUHJldiBwb2ludHMgdG8gdGhlCisgKiBwcmV2aW91cyBlbnRyeSwgdW5sZXNzICJmcmVlIiBpcyB0aGUgaGVhZCBvZiB0aGUgbGlzdC4KKyAqLworU1RBVElDIHZvaWQKK3hmc19ibWFwX2RlbF9mcmVlKAorCXhmc19ibWFwX2ZyZWVfdAkJKmZsaXN0LAkvKiBmcmVlIGl0ZW0gbGlzdCBoZWFkZXIgKi8KKwl4ZnNfYm1hcF9mcmVlX2l0ZW1fdAkqcHJldiwJLyogcHJldmlvdXMgaXRlbSBvbiBsaXN0LCBpZiBhbnkgKi8KKwl4ZnNfYm1hcF9mcmVlX2l0ZW1fdAkqZnJlZSk7CS8qIGxpc3QgaXRlbSB0byBiZSBmcmVlZCAqLworCisvKgorICogUmVtb3ZlIGNvdW50IGVudHJpZXMgZnJvbSB0aGUgZXh0ZW50cyBhcnJheSBmb3IgaW5vZGUgImlwIiwgc3RhcnRpbmcKKyAqIGF0IGluZGV4ICJpZHgiLiAgQ29waWVzIHRoZSByZW1haW5pbmcgaXRlbXMgZG93biBvdmVyIHRoZSBkZWxldGVkIG9uZXMsCisgKiBhbmQgZ2l2ZXMgYmFjayB0aGUgZXhjZXNzIG1lbW9yeS4KKyAqLworU1RBVElDIHZvaWQKK3hmc19ibWFwX2RlbGV0ZV9leGxpc3QoCisJeGZzX2lub2RlX3QJKmlwLAkJLyogaW5jb2RlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfZXh0bnVtX3QJaWR4LAkJLyogc3RhcnRpbmcgZGVsZXRlIGluZGV4ICovCisJeGZzX2V4dG51bV90CWNvdW50LAkJLyogY291bnQgb2YgaXRlbXMgdG8gZGVsZXRlICovCisJaW50CQl3aGljaGZvcmspOwkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworCisvKgorICogQ29udmVydCBhbiBleHRlbnRzLWZvcm1hdCBmaWxlIGludG8gYSBidHJlZS1mb3JtYXQgZmlsZS4KKyAqIFRoZSBuZXcgZmlsZSB3aWxsIGhhdmUgYSByb290IGJsb2NrIChpbiB0aGUgaW5vZGUpIGFuZCBhIHNpbmdsZSBjaGlsZCBibG9jay4KKyAqLworU1RBVElDIGludAkJCQkJLyogZXJyb3IgKi8KK3hmc19ibWFwX2V4dGVudHNfdG9fYnRyZWUoCisJeGZzX3RyYW5zX3QJCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfaW5vZGVfdAkJKmlwLAkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfZnNibG9ja190CQkqZmlyc3RibG9jaywJLyogZmlyc3QtYmxvY2stYWxsb2NhdGVkICovCisJeGZzX2JtYXBfZnJlZV90CQkqZmxpc3QsCQkvKiBibG9ja3MgZnJlZWQgaW4geGFjdGlvbiAqLworCXhmc19idHJlZV9jdXJfdAkJKipjdXJwLAkJLyogY3Vyc29yIHJldHVybmVkIHRvIGNhbGxlciAqLworCWludAkJCXdhc2RlbCwJCS8qIGNvbnZlcnRpbmcgYSBkZWxheWVkIGFsbG9jICovCisJaW50CQkJKmxvZ2ZsYWdzcCwJLyogaW5vZGUgbG9nZ2luZyBmbGFncyAqLworCWludAkJCXdoaWNoZm9yayk7CS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCisKKy8qCisgKiBJbnNlcnQgbmV3IGl0ZW0ocykgaW4gdGhlIGV4dGVudCBsaXN0IGZvciBpbm9kZSAiaXAiLgorICogQ291bnQgbmV3IGl0ZW1zIGFyZSBpbnNlcnRlZCBhdCBvZmZzZXQgaWR4LgorICovCitTVEFUSUMgdm9pZAoreGZzX2JtYXBfaW5zZXJ0X2V4bGlzdCgKKwl4ZnNfaW5vZGVfdAkqaXAsCQkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLworCXhmc19leHRudW1fdAlpZHgsCQkvKiBzdGFydGluZyBpbmRleCBvZiBuZXcgaXRlbXMgKi8KKwl4ZnNfZXh0bnVtX3QJY291bnQsCQkvKiBudW1iZXIgb2YgaW5zZXJ0ZWQgaXRlbXMgKi8KKwl4ZnNfYm1idF9pcmVjX3QJKm5ldywJCS8qIGl0ZW1zIHRvIGluc2VydCAqLworCWludAkJd2hpY2hmb3JrKTsJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KKworLyoKKyAqIENvbnZlcnQgYSBsb2NhbCBmaWxlIHRvIGFuIGV4dGVudHMgZmlsZS4KKyAqIFRoaXMgY29kZSBpcyBzb3J0IG9mIGJvZ3VzLCBzaW5jZSB0aGUgZmlsZSBkYXRhIG5lZWRzIHRvIGdldAorICogbG9nZ2VkIHNvIGl0IHdvbid0IGJlIGxvc3QuICBUaGUgYm1hcC1sZXZlbCBtYW5pcHVsYXRpb25zIGFyZSBvaywgdGhvdWdoLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfYm1hcF9sb2NhbF90b19leHRlbnRzKAorCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfaW5vZGVfdAkqaXAsCQkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLworCXhmc19mc2Jsb2NrX3QJKmZpcnN0YmxvY2ssCS8qIGZpcnN0IGJsb2NrIGFsbG9jYXRlZCBpbiB4YWN0aW9uICovCisJeGZzX2V4dGxlbl90CXRvdGFsLAkJLyogdG90YWwgYmxvY2tzIG5lZWRlZCBieSB0cmFuc2FjdGlvbiAqLworCWludAkJKmxvZ2ZsYWdzcCwJLyogaW5vZGUgbG9nZ2luZyBmbGFncyAqLworCWludAkJd2hpY2hmb3JrKTsJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KKworLyoKKyAqIFNlYXJjaCB0aGUgZXh0ZW50cyBsaXN0IGZvciB0aGUgaW5vZGUsIGZvciB0aGUgZXh0ZW50IGNvbnRhaW5pbmcgYm5vLgorICogSWYgYm5vIGxpZXMgaW4gYSBob2xlLCBwb2ludCB0byB0aGUgbmV4dCBlbnRyeS4gIElmIGJubyBsaWVzIHBhc3QgZW9mLAorICogKmVvZnAgd2lsbCBiZSBzZXQsIGFuZCAqcHJldnAgd2lsbCBjb250YWluIHRoZSBsYXN0IGVudHJ5IChudWxsIGlmIG5vbmUpLgorICogRWxzZSwgKmxhc3R4cCB3aWxsIGJlIHNldCB0byB0aGUgaW5kZXggb2YgdGhlIGZvdW5kCisgKiBlbnRyeTsgKmdvdHAgd2lsbCBjb250YWluIHRoZSBlbnRyeS4KKyAqLworU1RBVElDIHhmc19ibWJ0X3JlY190ICoJCQkvKiBwb2ludGVyIHRvIGZvdW5kIGV4dGVudCBlbnRyeSAqLworeGZzX2JtYXBfc2VhcmNoX2V4dGVudHMoCisJeGZzX2lub2RlX3QJKmlwLAkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfZmlsZW9mZl90CWJubywJCS8qIGJsb2NrIG51bWJlciBzZWFyY2hlZCBmb3IgKi8KKwlpbnQJCXdoaWNoZm9yaywJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KKwlpbnQJCSplb2ZwLAkJLyogb3V0OiBlbmQgb2YgZmlsZSBmb3VuZCAqLworCXhmc19leHRudW1fdAkqbGFzdHhwLAkvKiBvdXQ6IGxhc3QgZXh0ZW50IGluZGV4ICovCisJeGZzX2JtYnRfaXJlY190CSpnb3RwLAkJLyogb3V0OiBleHRlbnQgZW50cnkgZm91bmQgKi8KKwl4ZnNfYm1idF9pcmVjX3QJKnByZXZwKTsJLyogb3V0OiBwcmV2aW91cyBleHRlbnQgZW50cnkgZm91bmQgKi8KKworI2lmZGVmIFhGU19CTUFQX1RSQUNFCisvKgorICogQWRkIGEgYm1hcCB0cmFjZSBidWZmZXIgZW50cnkuICBCYXNlIHJvdXRpbmUgZm9yIHRoZSBvdGhlcnMuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYm1hcF90cmFjZV9hZGRlbnRyeSgKKwlpbnQJCW9wY29kZSwJCS8qIG9wZXJhdGlvbiAqLworCWNoYXIJCSpmbmFtZSwJCS8qIGZ1bmN0aW9uIG5hbWUgKi8KKwljaGFyCQkqZGVzYywJCS8qIG9wZXJhdGlvbiBkZXNjcmlwdGlvbiAqLworCXhmc19pbm9kZV90CSppcCwJCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCisJeGZzX2V4dG51bV90CWlkeCwJCS8qIGluZGV4IG9mIGVudHJ5KGllcykgKi8KKwl4ZnNfZXh0bnVtX3QJY250LAkJLyogY291bnQgb2YgZW50cmllcywgMSBvciAyICovCisJeGZzX2JtYnRfcmVjX3QJKnIxLAkJLyogZmlyc3QgcmVjb3JkICovCisJeGZzX2JtYnRfcmVjX3QJKnIyLAkJLyogc2Vjb25kIHJlY29yZCBvciBudWxsICovCisJaW50CQl3aGljaGZvcmspOwkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworCisvKgorICogQWRkIGJtYXAgdHJhY2UgZW50cnkgcHJpb3IgdG8gYSBjYWxsIHRvIHhmc19ibWFwX2RlbGV0ZV9leGxpc3QuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYm1hcF90cmFjZV9kZWxldGUoCisJY2hhcgkJKmZuYW1lLAkJLyogZnVuY3Rpb24gbmFtZSAqLworCWNoYXIJCSpkZXNjLAkJLyogb3BlcmF0aW9uIGRlc2NyaXB0aW9uICovCisJeGZzX2lub2RlX3QJKmlwLAkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfZXh0bnVtX3QJaWR4LAkJLyogaW5kZXggb2YgZW50cnkoZW50cmllcykgZGVsZXRlZCAqLworCXhmc19leHRudW1fdAljbnQsCQkvKiBjb3VudCBvZiBlbnRyaWVzIGRlbGV0ZWQsIDEgb3IgMiAqLworCWludAkJd2hpY2hmb3JrKTsJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KKworLyoKKyAqIEFkZCBibWFwIHRyYWNlIGVudHJ5IHByaW9yIHRvIGEgY2FsbCB0byB4ZnNfYm1hcF9pbnNlcnRfZXhsaXN0LCBvcgorICogcmVhZGluZyBpbiB0aGUgZXh0ZW50cyBsaXN0IGZyb20gdGhlIGRpc2sgKGluIHRoZSBidHJlZSkuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYm1hcF90cmFjZV9pbnNlcnQoCisJY2hhcgkJKmZuYW1lLAkJLyogZnVuY3Rpb24gbmFtZSAqLworCWNoYXIJCSpkZXNjLAkJLyogb3BlcmF0aW9uIGRlc2NyaXB0aW9uICovCisJeGZzX2lub2RlX3QJKmlwLAkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfZXh0bnVtX3QJaWR4LAkJLyogaW5kZXggb2YgZW50cnkoZW50cmllcykgaW5zZXJ0ZWQgKi8KKwl4ZnNfZXh0bnVtX3QJY250LAkJLyogY291bnQgb2YgZW50cmllcyBpbnNlcnRlZCwgMSBvciAyICovCisJeGZzX2JtYnRfaXJlY190CSpyMSwJCS8qIGluc2VydGVkIHJlY29yZCAxICovCisJeGZzX2JtYnRfaXJlY190CSpyMiwJCS8qIGluc2VydGVkIHJlY29yZCAyIG9yIG51bGwgKi8KKwlpbnQJCXdoaWNoZm9yayk7CS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCisKKy8qCisgKiBBZGQgYm1hcCB0cmFjZSBlbnRyeSBhZnRlciB1cGRhdGluZyBhbiBleHRlbnQgbGlzdCBlbnRyeSBpbiBwbGFjZS4KKyAqLworU1RBVElDIHZvaWQKK3hmc19ibWFwX3RyYWNlX3Bvc3RfdXBkYXRlKAorCWNoYXIJCSpmbmFtZSwJCS8qIGZ1bmN0aW9uIG5hbWUgKi8KKwljaGFyCQkqZGVzYywJCS8qIG9wZXJhdGlvbiBkZXNjcmlwdGlvbiAqLworCXhmc19pbm9kZV90CSppcCwJCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCisJeGZzX2V4dG51bV90CWlkeCwJCS8qIGluZGV4IG9mIGVudHJ5IHVwZGF0ZWQgKi8KKwlpbnQJCXdoaWNoZm9yayk7CS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCisKKy8qCisgKiBBZGQgYm1hcCB0cmFjZSBlbnRyeSBwcmlvciB0byB1cGRhdGluZyBhbiBleHRlbnQgbGlzdCBlbnRyeSBpbiBwbGFjZS4KKyAqLworU1RBVElDIHZvaWQKK3hmc19ibWFwX3RyYWNlX3ByZV91cGRhdGUoCisJY2hhcgkJKmZuYW1lLAkJLyogZnVuY3Rpb24gbmFtZSAqLworCWNoYXIJCSpkZXNjLAkJLyogb3BlcmF0aW9uIGRlc2NyaXB0aW9uICovCisJeGZzX2lub2RlX3QJKmlwLAkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfZXh0bnVtX3QJaWR4LAkJLyogaW5kZXggb2YgZW50cnkgdG8gYmUgdXBkYXRlZCAqLworCWludAkJd2hpY2hmb3JrKTsJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KKworI2Vsc2UKKyNkZWZpbmUJeGZzX2JtYXBfdHJhY2VfZGVsZXRlKGYsZCxpcCxpLGMsdykKKyNkZWZpbmUJeGZzX2JtYXBfdHJhY2VfaW5zZXJ0KGYsZCxpcCxpLGMscjEscjIsdykKKyNkZWZpbmUJeGZzX2JtYXBfdHJhY2VfcG9zdF91cGRhdGUoZixkLGlwLGksdykKKyNkZWZpbmUJeGZzX2JtYXBfdHJhY2VfcHJlX3VwZGF0ZShmLGQsaXAsaSx3KQorI2VuZGlmCS8qIFhGU19CTUFQX1RSQUNFICovCisKKy8qCisgKiBDb21wdXRlIHRoZSB3b3JzdC1jYXNlIG51bWJlciBvZiBpbmRpcmVjdCBibG9ja3MgdGhhdCB3aWxsIGJlIHVzZWQKKyAqIGZvciBpcCdzIGRlbGF5ZWQgZXh0ZW50IG9mIGxlbmd0aCAibGVuIi4KKyAqLworU1RBVElDIHhmc19maWxibGtzX3QKK3hmc19ibWFwX3dvcnN0X2luZGxlbigKKwl4ZnNfaW5vZGVfdAkJKmlwLAkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLworCXhmc19maWxibGtzX3QJCWxlbik7CS8qIGRlbGF5ZWQgZXh0ZW50IGxlbmd0aCAqLworCisjaWZkZWYgREVCVUcKKy8qCisgKiBQZXJmb3JtIHZhcmlvdXMgdmFsaWRhdGlvbiBjaGVja3Mgb24gdGhlIHZhbHVlcyBiZWluZyByZXR1cm5lZAorICogZnJvbSB4ZnNfYm1hcGkoKS4KKyAqLworU1RBVElDIHZvaWQKK3hmc19ibWFwX3ZhbGlkYXRlX3JldCgKKwl4ZnNfZmlsZW9mZl90CQlibm8sCisJeGZzX2ZpbGJsa3NfdAkJbGVuLAorCWludAkJCWZsYWdzLAorCXhmc19ibWJ0X2lyZWNfdAkJKm12YWwsCisJaW50CQkJbm1hcCwKKwlpbnQJCQlyZXRfbm1hcCk7CisjZWxzZQorI2RlZmluZQl4ZnNfYm1hcF92YWxpZGF0ZV9yZXQoYm5vLGxlbixmbGFncyxtdmFsLG9ubWFwLG5tYXApCisjZW5kaWYgLyogREVCVUcgKi8KKworI2lmIGRlZmluZWQoWEZTX1JXX1RSQUNFKQorU1RBVElDIHZvaWQKK3hmc19idW5tYXBfdHJhY2UoCisJeGZzX2lub2RlX3QJCSppcCwKKwl4ZnNfZmlsZW9mZl90CQlibm8sCisJeGZzX2ZpbGJsa3NfdAkJbGVuLAorCWludAkJCWZsYWdzLAorCWluc3RfdAkJCSpyYSk7CisjZWxzZQorI2RlZmluZQl4ZnNfYnVubWFwX3RyYWNlKGlwLCBibm8sIGxlbiwgZmxhZ3MsIHJhKQorI2VuZGlmCS8qIFhGU19SV19UUkFDRSAqLworCitTVEFUSUMgaW50Cit4ZnNfYm1hcF9jb3VudF90cmVlKAorCXhmc19tb3VudF90ICAgICAqbXAsCisJeGZzX3RyYW5zX3QgICAgICp0cCwKKwl4ZnNfZnNibG9ja190ICAgYmxvY2tubywKKwlpbnQgICAgICAgICAgICAgbGV2ZWxpbiwKKwlpbnQJCSpjb3VudCk7CisKK1NUQVRJQyBpbnQKK3hmc19ibWFwX2NvdW50X2xlYXZlcygKKwl4ZnNfYm1idF9yZWNfdAkJKmZycCwKKwlpbnQJCQludW1yZWNzLAorCWludAkJCSpjb3VudCk7CisKKy8qCisgKiBCbWFwIGludGVybmFsIHJvdXRpbmVzLgorICovCisKKy8qCisgKiBDYWxsZWQgZnJvbSB4ZnNfYm1hcF9hZGRfYXR0cmZvcmsgdG8gaGFuZGxlIGJ0cmVlIGZvcm1hdCBmaWxlcy4KKyAqLworU1RBVElDIGludAkJCQkJLyogZXJyb3IgKi8KK3hmc19ibWFwX2FkZF9hdHRyZm9ya19idHJlZSgKKwl4ZnNfdHJhbnNfdAkJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19pbm9kZV90CQkqaXAsCQkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLworCXhmc19mc2Jsb2NrX3QJCSpmaXJzdGJsb2NrLAkvKiBmaXJzdCBibG9jayBhbGxvY2F0ZWQgKi8KKwl4ZnNfYm1hcF9mcmVlX3QJCSpmbGlzdCwJCS8qIGJsb2NrcyB0byBmcmVlIGF0IGNvbW1pdCAqLworCWludAkJCSpmbGFncykJCS8qIGlub2RlIGxvZ2dpbmcgZmxhZ3MgKi8KK3sKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXI7CQkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCXhmc19tb3VudF90CQkqbXA7CQkvKiBmaWxlIHN5c3RlbSBtb3VudCBzdHJ1Y3QgKi8KKwlpbnQJCQlzdGF0OwkJLyogbmV3cm9vdCBzdGF0dXMgKi8KKworCW1wID0gaXAtPmlfbW91bnQ7CisJaWYgKGlwLT5pX2RmLmlmX2Jyb290X2J5dGVzIDw9IFhGU19JRk9SS19EU0laRShpcCkpCisJCSpmbGFncyB8PSBYRlNfSUxPR19EQlJPT1Q7CisJZWxzZSB7CisJCWN1ciA9IHhmc19idHJlZV9pbml0X2N1cnNvcihtcCwgdHAsIE5VTEwsIDAsIFhGU19CVE5VTV9CTUFQLCBpcCwKKwkJCVhGU19EQVRBX0ZPUkspOworCQljdXItPmJjX3ByaXZhdGUuYi5mbGlzdCA9IGZsaXN0OworCQljdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrID0gKmZpcnN0YmxvY2s7CisJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZ2UoY3VyLCAwLCAwLCAwLCAmc3RhdCkpKQorCQkJZ290byBlcnJvcjA7CisJCUFTU0VSVChzdGF0ID09IDEpOwkvKiBtdXN0IGJlIGF0IGxlYXN0IG9uZSBlbnRyeSAqLworCQlpZiAoKGVycm9yID0geGZzX2JtYnRfbmV3cm9vdChjdXIsIGZsYWdzLCAmc3RhdCkpKQorCQkJZ290byBlcnJvcjA7CisJCWlmIChzdGF0ID09IDApIHsKKwkJCXhmc19idHJlZV9kZWxfY3Vyc29yKGN1ciwgWEZTX0JUUkVFX05PRVJST1IpOworCQkJcmV0dXJuIFhGU19FUlJPUihFTk9TUEMpOworCQl9CisJCSpmaXJzdGJsb2NrID0gY3VyLT5iY19wcml2YXRlLmIuZmlyc3RibG9jazsKKwkJY3VyLT5iY19wcml2YXRlLmIuYWxsb2NhdGVkID0gMDsKKwkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CisJfQorCXJldHVybiAwOworZXJyb3IwOgorCXhmc19idHJlZV9kZWxfY3Vyc29yKGN1ciwgWEZTX0JUUkVFX0VSUk9SKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBDYWxsZWQgZnJvbSB4ZnNfYm1hcF9hZGRfYXR0cmZvcmsgdG8gaGFuZGxlIGV4dGVudHMgZm9ybWF0IGZpbGVzLgorICovCitTVEFUSUMgaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2JtYXBfYWRkX2F0dHJmb3JrX2V4dGVudHMoCisJeGZzX3RyYW5zX3QJCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfaW5vZGVfdAkJKmlwLAkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfZnNibG9ja190CQkqZmlyc3RibG9jaywJLyogZmlyc3QgYmxvY2sgYWxsb2NhdGVkICovCisJeGZzX2JtYXBfZnJlZV90CQkqZmxpc3QsCQkvKiBibG9ja3MgdG8gZnJlZSBhdCBjb21taXQgKi8KKwlpbnQJCQkqZmxhZ3MpCQkvKiBpbm9kZSBsb2dnaW5nIGZsYWdzICovCit7CisJeGZzX2J0cmVlX2N1cl90CQkqY3VyOwkJLyogYm1hcCBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCisJaWYgKGlwLT5pX2QuZGlfbmV4dGVudHMgKiBzaXplb2YoeGZzX2JtYnRfcmVjX3QpIDw9IFhGU19JRk9SS19EU0laRShpcCkpCisJCXJldHVybiAwOworCWN1ciA9IE5VTEw7CisJZXJyb3IgPSB4ZnNfYm1hcF9leHRlbnRzX3RvX2J0cmVlKHRwLCBpcCwgZmlyc3RibG9jaywgZmxpc3QsICZjdXIsIDAsCisJCWZsYWdzLCBYRlNfREFUQV9GT1JLKTsKKwlpZiAoY3VyKSB7CisJCWN1ci0+YmNfcHJpdmF0ZS5iLmFsbG9jYXRlZCA9IDA7CisJCXhmc19idHJlZV9kZWxfY3Vyc29yKGN1ciwKKwkJCWVycm9yID8gWEZTX0JUUkVFX0VSUk9SIDogWEZTX0JUUkVFX05PRVJST1IpOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBDYWxsZWQgZnJvbSB4ZnNfYm1hcF9hZGRfYXR0cmZvcmsgdG8gaGFuZGxlIGxvY2FsIGZvcm1hdCBmaWxlcy4KKyAqLworU1RBVElDIGludAkJCQkJLyogZXJyb3IgKi8KK3hmc19ibWFwX2FkZF9hdHRyZm9ya19sb2NhbCgKKwl4ZnNfdHJhbnNfdAkJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19pbm9kZV90CQkqaXAsCQkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLworCXhmc19mc2Jsb2NrX3QJCSpmaXJzdGJsb2NrLAkvKiBmaXJzdCBibG9jayBhbGxvY2F0ZWQgKi8KKwl4ZnNfYm1hcF9mcmVlX3QJCSpmbGlzdCwJCS8qIGJsb2NrcyB0byBmcmVlIGF0IGNvbW1pdCAqLworCWludAkJCSpmbGFncykJCS8qIGlub2RlIGxvZ2dpbmcgZmxhZ3MgKi8KK3sKKwl4ZnNfZGFfYXJnc190CQlkYXJnczsJCS8qIGFyZ3MgZm9yIGRpci9hdHRyIGNvZGUgKi8KKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCXhmc19tb3VudF90CQkqbXA7CQkvKiBtb3VudCBzdHJ1Y3R1cmUgcG9pbnRlciAqLworCisJaWYgKGlwLT5pX2RmLmlmX2J5dGVzIDw9IFhGU19JRk9SS19EU0laRShpcCkpCisJCXJldHVybiAwOworCWlmICgoaXAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSA9PSBTX0lGRElSKSB7CisJCW1wID0gaXAtPmlfbW91bnQ7CisJCW1lbXNldCgmZGFyZ3MsIDAsIHNpemVvZihkYXJncykpOworCQlkYXJncy5kcCA9IGlwOworCQlkYXJncy5maXJzdGJsb2NrID0gZmlyc3RibG9jazsKKwkJZGFyZ3MuZmxpc3QgPSBmbGlzdDsKKwkJZGFyZ3MudG90YWwgPSBtcC0+bV9kaXJibGtmc2JzOworCQlkYXJncy53aGljaGZvcmsgPSBYRlNfREFUQV9GT1JLOworCQlkYXJncy50cmFucyA9IHRwOworCQllcnJvciA9IFhGU19ESVJfU0hPUlRGT1JNX1RPX1NJTkdMRShtcCwgJmRhcmdzKTsKKwl9IGVsc2UKKwkJZXJyb3IgPSB4ZnNfYm1hcF9sb2NhbF90b19leHRlbnRzKHRwLCBpcCwgZmlyc3RibG9jaywgMSwgZmxhZ3MsCisJCQlYRlNfREFUQV9GT1JLKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBDYWxsZWQgYnkgeGZzX2JtYXBpIHRvIHVwZGF0ZSBleHRlbnQgbGlzdCBzdHJ1Y3R1cmUgYW5kIHRoZSBidHJlZQorICogYWZ0ZXIgYWxsb2NhdGluZyBzcGFjZSAob3IgZG9pbmcgYSBkZWxheWVkIGFsbG9jYXRpb24pLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfYm1hcF9hZGRfZXh0ZW50KAorCXhmc19pbm9kZV90CQkqaXAsCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCisJeGZzX2V4dG51bV90CQlpZHgsCS8qIGV4dGVudCBudW1iZXIgdG8gdXBkYXRlL2luc2VydCAqLworCXhmc19idHJlZV9jdXJfdAkJKipjdXJwLAkvKiBpZiAqY3VycCBpcyBudWxsLCBub3QgYSBidHJlZSAqLworCXhmc19ibWJ0X2lyZWNfdAkJKm5ldywJLyogbmV3IGRhdGEgdG8gcHV0IGluIGV4dGVudCBsaXN0ICovCisJeGZzX2ZzYmxvY2tfdAkJKmZpcnN0LAkvKiBwb2ludGVyIHRvIGZpcnN0YmxvY2sgdmFyaWFibGUgKi8KKwl4ZnNfYm1hcF9mcmVlX3QJCSpmbGlzdCwJLyogbGlzdCBvZiBleHRlbnRzIHRvIGJlIGZyZWVkICovCisJaW50CQkJKmxvZ2ZsYWdzcCwgLyogaW5vZGUgbG9nZ2luZyBmbGFncyAqLworCWludAkJCXdoaWNoZm9yaywgLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KKwlpbnQJCQlyc3ZkKQkvKiBPSyB0byB1c2UgcmVzZXJ2ZWQgZGF0YSBibG9ja3MgKi8KK3sKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXI7CS8qIGJ0cmVlIGN1cnNvciBvciBudWxsICovCisJeGZzX2ZpbGJsa3NfdAkJZGFfbmV3OyAvKiBuZXcgY291bnQgZGVsIGFsbG9jIGJsb2NrcyB1c2VkICovCisJeGZzX2ZpbGJsa3NfdAkJZGFfb2xkOyAvKiBvbGQgY291bnQgZGVsIGFsbG9jIGJsb2NrcyB1c2VkICovCisJaW50CQkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworI2lmZGVmIFhGU19CTUFQX1RSQUNFCisJc3RhdGljIGNoYXIJCWZuYW1lW10gPSAieGZzX2JtYXBfYWRkX2V4dGVudCI7CisjZW5kaWYKKwl4ZnNfaWZvcmtfdAkJKmlmcDsJLyogaW5vZGUgZm9yayBwdHIgKi8KKwlpbnQJCQlsb2dmbGFnczsgLyogcmV0dXJuZWQgdmFsdWUgKi8KKwl4ZnNfZXh0bnVtX3QJCW5leHRlbnRzOyAvKiBudW1iZXIgb2YgZXh0ZW50cyBpbiBmaWxlIG5vdyAqLworCisJWEZTX1NUQVRTX0lOQyh4c19hZGRfZXhsaXN0KTsKKwljdXIgPSAqY3VycDsKKwlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOworCW5leHRlbnRzID0gaWZwLT5pZl9ieXRlcyAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCk7CisJQVNTRVJUKGlkeCA8PSBuZXh0ZW50cyk7CisJZGFfb2xkID0gZGFfbmV3ID0gMDsKKwllcnJvciA9IDA7CisJLyoKKwkgKiBUaGlzIGlzIHRoZSBmaXJzdCBleHRlbnQgYWRkZWQgdG8gYSBuZXcvZW1wdHkgZmlsZS4KKwkgKiBTcGVjaWFsIGNhc2UgdGhpcyBvbmUsIHNvIG90aGVyIHJvdXRpbmVzIGdldCB0byBhc3N1bWUgdGhlcmUgYXJlCisJICogYWxyZWFkeSBleHRlbnRzIGluIHRoZSBsaXN0LgorCSAqLworCWlmIChuZXh0ZW50cyA9PSAwKSB7CisJCXhmc19ibWFwX3RyYWNlX2luc2VydChmbmFtZSwgImluc2VydCBlbXB0eSIsIGlwLCAwLCAxLCBuZXcsCisJCQlOVUxMLCB3aGljaGZvcmspOworCQl4ZnNfYm1hcF9pbnNlcnRfZXhsaXN0KGlwLCAwLCAxLCBuZXcsIHdoaWNoZm9yayk7CisJCUFTU0VSVChjdXIgPT0gTlVMTCk7CisJCWlmcC0+aWZfbGFzdGV4ID0gMDsKKwkJaWYgKCFJU05VTExTVEFSVEJMT0NLKG5ldy0+YnJfc3RhcnRibG9jaykpIHsKKwkJCVhGU19JRk9SS19ORVhUX1NFVChpcCwgd2hpY2hmb3JrLCAxKTsKKwkJCWxvZ2ZsYWdzID0gWEZTX0lMT0dfQ09SRSB8IFhGU19JTE9HX0ZFWFQod2hpY2hmb3JrKTsKKwkJfSBlbHNlCisJCQlsb2dmbGFncyA9IDA7CisJfQorCS8qCisJICogQW55IGtpbmQgb2YgbmV3IGRlbGF5ZWQgYWxsb2NhdGlvbiBnb2VzIGhlcmUuCisJICovCisJZWxzZSBpZiAoSVNOVUxMU1RBUlRCTE9DSyhuZXctPmJyX3N0YXJ0YmxvY2spKSB7CisJCWlmIChjdXIpCisJCQlBU1NFUlQoKGN1ci0+YmNfcHJpdmF0ZS5iLmZsYWdzICYKKwkJCQlYRlNfQlRDVVJfQlBSVl9XQVNERUwpID09IDApOworCQlpZiAoKGVycm9yID0geGZzX2JtYXBfYWRkX2V4dGVudF9ob2xlX2RlbGF5KGlwLCBpZHgsIGN1ciwgbmV3LAorCQkJCSZsb2dmbGFncywgcnN2ZCkpKQorCQkJZ290byBkb25lOworCX0KKwkvKgorCSAqIFJlYWwgYWxsb2NhdGlvbiBvZmYgdGhlIGVuZCBvZiB0aGUgZmlsZS4KKwkgKi8KKwllbHNlIGlmIChpZHggPT0gbmV4dGVudHMpIHsKKwkJaWYgKGN1cikKKwkJCUFTU0VSVCgoY3VyLT5iY19wcml2YXRlLmIuZmxhZ3MgJgorCQkJCVhGU19CVENVUl9CUFJWX1dBU0RFTCkgPT0gMCk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYm1hcF9hZGRfZXh0ZW50X2hvbGVfcmVhbChpcCwgaWR4LCBjdXIsIG5ldywKKwkJCQkmbG9nZmxhZ3MsIHdoaWNoZm9yaykpKQorCQkJZ290byBkb25lOworCX0gZWxzZSB7CisJCXhmc19ibWJ0X2lyZWNfdAlwcmV2OwkvKiBvbGQgZXh0ZW50IGF0IG9mZnNldCBpZHggKi8KKworCQkvKgorCQkgKiBHZXQgdGhlIHJlY29yZCByZWZlcnJlZCB0byBieSBpZHguCisJCSAqLworCQl4ZnNfYm1idF9nZXRfYWxsKCZpZnAtPmlmX3UxLmlmX2V4dGVudHNbaWR4XSwgJnByZXYpOworCQkvKgorCQkgKiBJZiBpdCdzIGEgcmVhbCBhbGxvY2F0aW9uIHJlY29yZCwgYW5kIHRoZSBuZXcgYWxsb2NhdGlvbiBlbmRzCisJCSAqIGFmdGVyIHRoZSBzdGFydCBvZiB0aGUgcmVmZXJyZWQgdG8gcmVjb3JkLCB0aGVuIHdlJ3JlIGZpbGxpbmcKKwkJICogaW4gYSBkZWxheWVkIG9yIHVud3JpdHRlbiBhbGxvY2F0aW9uIHdpdGggYSByZWFsIG9uZSwgb3IKKwkJICogY29udmVydGluZyByZWFsIGJhY2sgdG8gdW53cml0dGVuLgorCQkgKi8KKwkJaWYgKCFJU05VTExTVEFSVEJMT0NLKG5ldy0+YnJfc3RhcnRibG9jaykgJiYKKwkJICAgIG5ldy0+YnJfc3RhcnRvZmYgKyBuZXctPmJyX2Jsb2NrY291bnQgPiBwcmV2LmJyX3N0YXJ0b2ZmKSB7CisJCQlpZiAocHJldi5icl9zdGF0ZSAhPSBYRlNfRVhUX1VOV1JJVFRFTiAmJgorCQkJICAgIElTTlVMTFNUQVJUQkxPQ0socHJldi5icl9zdGFydGJsb2NrKSkgeworCQkJCWRhX29sZCA9IFNUQVJUQkxPQ0tWQUwocHJldi5icl9zdGFydGJsb2NrKTsKKwkJCQlpZiAoY3VyKQorCQkJCQlBU1NFUlQoY3VyLT5iY19wcml2YXRlLmIuZmxhZ3MgJgorCQkJCQkJWEZTX0JUQ1VSX0JQUlZfV0FTREVMKTsKKwkJCQlpZiAoKGVycm9yID0geGZzX2JtYXBfYWRkX2V4dGVudF9kZWxheV9yZWFsKGlwLAorCQkJCQlpZHgsICZjdXIsIG5ldywgJmRhX25ldywgZmlyc3QsIGZsaXN0LAorCQkJCQkmbG9nZmxhZ3MsIHJzdmQpKSkKKwkJCQkJZ290byBkb25lOworCQkJfSBlbHNlIGlmIChuZXctPmJyX3N0YXRlID09IFhGU19FWFRfTk9STSkgeworCQkJCUFTU0VSVChuZXctPmJyX3N0YXRlID09IFhGU19FWFRfTk9STSk7CisJCQkJaWYgKChlcnJvciA9IHhmc19ibWFwX2FkZF9leHRlbnRfdW53cml0dGVuX3JlYWwoCisJCQkJCWlwLCBpZHgsICZjdXIsIG5ldywgJmxvZ2ZsYWdzKSkpCisJCQkJCWdvdG8gZG9uZTsKKwkJCX0gZWxzZSB7CisJCQkJQVNTRVJUKG5ldy0+YnJfc3RhdGUgPT0gWEZTX0VYVF9VTldSSVRURU4pOworCQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1hcF9hZGRfZXh0ZW50X3Vud3JpdHRlbl9yZWFsKAorCQkJCQlpcCwgaWR4LCAmY3VyLCBuZXcsICZsb2dmbGFncykpKQorCQkJCQlnb3RvIGRvbmU7CisJCQl9CisJCQlBU1NFUlQoKmN1cnAgPT0gY3VyIHx8ICpjdXJwID09IE5VTEwpOworCQl9CisJCS8qCisJCSAqIE90aGVyd2lzZSB3ZSdyZSBmaWxsaW5nIGluIGEgaG9sZSB3aXRoIGFuIGFsbG9jYXRpb24uCisJCSAqLworCQllbHNlIHsKKwkJCWlmIChjdXIpCisJCQkJQVNTRVJUKChjdXItPmJjX3ByaXZhdGUuYi5mbGFncyAmCisJCQkJCVhGU19CVENVUl9CUFJWX1dBU0RFTCkgPT0gMCk7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYXBfYWRkX2V4dGVudF9ob2xlX3JlYWwoaXAsIGlkeCwgY3VyLAorCQkJCQluZXcsICZsb2dmbGFncywgd2hpY2hmb3JrKSkpCisJCQkJZ290byBkb25lOworCQl9CisJfQorCisJQVNTRVJUKCpjdXJwID09IGN1ciB8fCAqY3VycCA9PSBOVUxMKTsKKwkvKgorCSAqIENvbnZlcnQgdG8gYSBidHJlZSBpZiBuZWNlc3NhcnkuCisJICovCisJaWYgKFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgPT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUyAmJgorCSAgICBYRlNfSUZPUktfTkVYVEVOVFMoaXAsIHdoaWNoZm9yaykgPiBpZnAtPmlmX2V4dF9tYXgpIHsKKwkJaW50CXRtcF9sb2dmbGFnczsJLyogcGFydGlhbCBsb2cgZmxhZyByZXR1cm4gdmFsICovCisKKwkJQVNTRVJUKGN1ciA9PSBOVUxMKTsKKwkJZXJyb3IgPSB4ZnNfYm1hcF9leHRlbnRzX3RvX2J0cmVlKGlwLT5pX3RyYW5zcCwgaXAsIGZpcnN0LAorCQkJZmxpc3QsICZjdXIsIGRhX29sZCA+IDAsICZ0bXBfbG9nZmxhZ3MsIHdoaWNoZm9yayk7CisJCWxvZ2ZsYWdzIHw9IHRtcF9sb2dmbGFnczsKKwkJaWYgKGVycm9yKQorCQkJZ290byBkb25lOworCX0KKwkvKgorCSAqIEFkanVzdCBmb3IgY2hhbmdlcyBpbiByZXNlcnZlZCBkZWxheWVkIGluZGlyZWN0IGJsb2Nrcy4KKwkgKiBOb3RoaW5nIHRvIGRvIGZvciBkaXNrIHF1b3RhcyBoZXJlLgorCSAqLworCWlmIChkYV9vbGQgfHwgZGFfbmV3KSB7CisJCXhmc19maWxibGtzX3QJbmJsa3M7CisKKwkJbmJsa3MgPSBkYV9uZXc7CisJCWlmIChjdXIpCisJCQluYmxrcyArPSBjdXItPmJjX3ByaXZhdGUuYi5hbGxvY2F0ZWQ7CisJCUFTU0VSVChuYmxrcyA8PSBkYV9vbGQpOworCQlpZiAobmJsa3MgPCBkYV9vbGQpCisJCQl4ZnNfbW9kX2luY29yZV9zYihpcC0+aV9tb3VudCwgWEZTX1NCU19GREJMT0NLUywKKwkJCQkoaW50KShkYV9vbGQgLSBuYmxrcyksIHJzdmQpOworCX0KKwkvKgorCSAqIENsZWFyIG91dCB0aGUgYWxsb2NhdGVkIGZpZWxkLCBkb25lIHdpdGggaXQgbm93IGluIGFueSBjYXNlLgorCSAqLworCWlmIChjdXIpIHsKKwkJY3VyLT5iY19wcml2YXRlLmIuYWxsb2NhdGVkID0gMDsKKwkJKmN1cnAgPSBjdXI7CisJfQorZG9uZToKKyNpZmRlZiBERUJVRworCWlmICghZXJyb3IpCisJCXhmc19ibWFwX2NoZWNrX2xlYWZfZXh0ZW50cygqY3VycCwgaXAsIHdoaWNoZm9yayk7CisjZW5kaWYKKwkqbG9nZmxhZ3NwID0gbG9nZmxhZ3M7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogQ2FsbGVkIGJ5IHhmc19ibWFwX2FkZF9leHRlbnQgdG8gaGFuZGxlIGNhc2VzIGNvbnZlcnRpbmcgYSBkZWxheWVkCisgKiBhbGxvY2F0aW9uIHRvIGEgcmVhbCBhbGxvY2F0aW9uLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfYm1hcF9hZGRfZXh0ZW50X2RlbGF5X3JlYWwoCisJeGZzX2lub2RlX3QJCSppcCwJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfZXh0bnVtX3QJCWlkeCwJLyogZXh0ZW50IG51bWJlciB0byB1cGRhdGUvaW5zZXJ0ICovCisJeGZzX2J0cmVlX2N1cl90CQkqKmN1cnAsCS8qIGlmICpjdXJwIGlzIG51bGwsIG5vdCBhIGJ0cmVlICovCisJeGZzX2JtYnRfaXJlY190CQkqbmV3LAkvKiBuZXcgZGF0YSB0byBwdXQgaW4gZXh0ZW50IGxpc3QgKi8KKwl4ZnNfZmlsYmxrc190CQkqZG5ldywJLyogbmV3IGRlbGF5ZWQtYWxsb2MgaW5kaXJlY3QgYmxvY2tzICovCisJeGZzX2ZzYmxvY2tfdAkJKmZpcnN0LAkvKiBwb2ludGVyIHRvIGZpcnN0YmxvY2sgdmFyaWFibGUgKi8KKwl4ZnNfYm1hcF9mcmVlX3QJCSpmbGlzdCwJLyogbGlzdCBvZiBleHRlbnRzIHRvIGJlIGZyZWVkICovCisJaW50CQkJKmxvZ2ZsYWdzcCwgLyogaW5vZGUgbG9nZ2luZyBmbGFncyAqLworCWludAkJCXJzdmQpCS8qIE9LIHRvIHVzZSByZXNlcnZlZCBkYXRhIGJsb2NrIGFsbG9jYXRpb24gKi8KK3sKKwl4ZnNfYm1idF9yZWNfdAkJKmJhc2U7CS8qIGJhc2Ugb2YgZXh0ZW50IGVudHJ5IGxpc3QgKi8KKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXI7CS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJCWRpZmY7CS8qIHRlbXAgdmFsdWUgKi8KKwl4ZnNfYm1idF9yZWNfdAkJKmVwOwkvKiBleHRlbnQgZW50cnkgZm9yIGlkeCAqLworCWludAkJCWVycm9yOwkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKyNpZmRlZiBYRlNfQk1BUF9UUkFDRQorCXN0YXRpYyBjaGFyCQlmbmFtZVtdID0gInhmc19ibWFwX2FkZF9leHRlbnRfZGVsYXlfcmVhbCI7CisjZW5kaWYKKwlpbnQJCQlpOwkvKiB0ZW1wIHN0YXRlICovCisJeGZzX2ZpbGVvZmZfdAkJbmV3X2VuZG9mZjsJLyogZW5kIG9mZnNldCBvZiBuZXcgZW50cnkgKi8KKwl4ZnNfYm1idF9pcmVjX3QJCXJbM107CS8qIG5laWdoYm9yIGV4dGVudCBlbnRyaWVzICovCisJCQkJCS8qIGxlZnQgaXMgMCwgcmlnaHQgaXMgMSwgcHJldiBpcyAyICovCisJaW50CQkJcnZhbD0wOwkvKiByZXR1cm4gdmFsdWUgKGxvZ2dpbmcgZmxhZ3MpICovCisJaW50CQkJc3RhdGUgPSAwOy8qIHN0YXRlIGJpdHMsIGFjY2Vzc2VkIHRocnUgbWFjcm9zICovCisJeGZzX2ZpbGJsa3NfdAkJdGVtcDsJLyogdmFsdWUgZm9yIGRuZXcgY2FsY3VsYXRpb25zICovCisJeGZzX2ZpbGJsa3NfdAkJdGVtcDI7CS8qIHZhbHVlIGZvciBkbmV3IGNhbGN1bGF0aW9ucyAqLworCWludAkJCXRtcF9ydmFsOwkvKiBwYXJ0aWFsIGxvZ2dpbmcgZmxhZ3MgKi8KKwllbnVtIHsJCQkJLyogYml0IG51bWJlciBkZWZpbml0aW9ucyBmb3Igc3RhdGUgKi8KKwkJTEVGVF9DT05USUcsCVJJR0hUX0NPTlRJRywKKwkJTEVGVF9GSUxMSU5HLAlSSUdIVF9GSUxMSU5HLAorCQlMRUZUX0RFTEFZLAlSSUdIVF9ERUxBWSwKKwkJTEVGVF9WQUxJRCwJUklHSFRfVkFMSUQKKwl9OworCisjZGVmaW5lCUxFRlQJCXJbMF0KKyNkZWZpbmUJUklHSFQJCXJbMV0KKyNkZWZpbmUJUFJFVgkJclsyXQorI2RlZmluZQlNQVNLKGIpCQkoMSA8PCAoYikpCisjZGVmaW5lCU1BU0syKGEsYikJKE1BU0soYSkgfCBNQVNLKGIpKQorI2RlZmluZQlNQVNLMyhhLGIsYykJKE1BU0syKGEsYikgfCBNQVNLKGMpKQorI2RlZmluZQlNQVNLNChhLGIsYyxkKQkoTUFTSzMoYSxiLGMpIHwgTUFTSyhkKSkKKyNkZWZpbmUJU1RBVEVfU0VUKGIsdikJKCh2KSA/IChzdGF0ZSB8PSBNQVNLKGIpKSA6IChzdGF0ZSAmPSB+TUFTSyhiKSkpCisjZGVmaW5lCVNUQVRFX1RFU1QoYikJKHN0YXRlICYgTUFTSyhiKSkKKyNkZWZpbmUJU1RBVEVfU0VUX1RFU1QoYix2KQkoKHYpID8gKChzdGF0ZSB8PSBNQVNLKGIpKSwgMSkgOiBcCisJCQkJICAgICAgICgoc3RhdGUgJj0gfk1BU0soYikpLCAwKSkKKyNkZWZpbmUJU1dJVENIX1NUQVRFCQlcCisJKHN0YXRlICYgTUFTSzQoTEVGVF9GSUxMSU5HLCBSSUdIVF9GSUxMSU5HLCBMRUZUX0NPTlRJRywgUklHSFRfQ09OVElHKSkKKworCS8qCisJICogU2V0IHVwIGEgYnVuY2ggb2YgdmFyaWFibGVzIHRvIG1ha2UgdGhlIHRlc3RzIHNpbXBsZXIuCisJICovCisJY3VyID0gKmN1cnA7CisJYmFzZSA9IGlwLT5pX2RmLmlmX3UxLmlmX2V4dGVudHM7CisJZXAgPSAmYmFzZVtpZHhdOworCXhmc19ibWJ0X2dldF9hbGwoZXAsICZQUkVWKTsKKwluZXdfZW5kb2ZmID0gbmV3LT5icl9zdGFydG9mZiArIG5ldy0+YnJfYmxvY2tjb3VudDsKKwlBU1NFUlQoUFJFVi5icl9zdGFydG9mZiA8PSBuZXctPmJyX3N0YXJ0b2ZmKTsKKwlBU1NFUlQoUFJFVi5icl9zdGFydG9mZiArIFBSRVYuYnJfYmxvY2tjb3VudCA+PSBuZXdfZW5kb2ZmKTsKKwkvKgorCSAqIFNldCBmbGFncyBkZXRlcm1pbmluZyB3aGF0IHBhcnQgb2YgdGhlIHByZXZpb3VzIGRlbGF5ZWQgYWxsb2NhdGlvbgorCSAqIGV4dGVudCBpcyBiZWluZyByZXBsYWNlZCBieSBhIHJlYWwgYWxsb2NhdGlvbi4KKwkgKi8KKwlTVEFURV9TRVQoTEVGVF9GSUxMSU5HLCBQUkVWLmJyX3N0YXJ0b2ZmID09IG5ldy0+YnJfc3RhcnRvZmYpOworCVNUQVRFX1NFVChSSUdIVF9GSUxMSU5HLAorCQlQUkVWLmJyX3N0YXJ0b2ZmICsgUFJFVi5icl9ibG9ja2NvdW50ID09IG5ld19lbmRvZmYpOworCS8qCisJICogQ2hlY2sgYW5kIHNldCBmbGFncyBpZiB0aGlzIHNlZ21lbnQgaGFzIGEgbGVmdCBuZWlnaGJvci4KKwkgKiBEb24ndCBzZXQgY29udGlndW91cyBpZiB0aGUgY29tYmluZWQgZXh0ZW50IHdvdWxkIGJlIHRvbyBsYXJnZS4KKwkgKi8KKwlpZiAoU1RBVEVfU0VUX1RFU1QoTEVGVF9WQUxJRCwgaWR4ID4gMCkpIHsKKwkJeGZzX2JtYnRfZ2V0X2FsbChlcCAtIDEsICZMRUZUKTsKKwkJU1RBVEVfU0VUKExFRlRfREVMQVksIElTTlVMTFNUQVJUQkxPQ0soTEVGVC5icl9zdGFydGJsb2NrKSk7CisJfQorCVNUQVRFX1NFVChMRUZUX0NPTlRJRywKKwkJU1RBVEVfVEVTVChMRUZUX1ZBTElEKSAmJiAhU1RBVEVfVEVTVChMRUZUX0RFTEFZKSAmJgorCQlMRUZULmJyX3N0YXJ0b2ZmICsgTEVGVC5icl9ibG9ja2NvdW50ID09IG5ldy0+YnJfc3RhcnRvZmYgJiYKKwkJTEVGVC5icl9zdGFydGJsb2NrICsgTEVGVC5icl9ibG9ja2NvdW50ID09IG5ldy0+YnJfc3RhcnRibG9jayAmJgorCQlMRUZULmJyX3N0YXRlID09IG5ldy0+YnJfc3RhdGUgJiYKKwkJTEVGVC5icl9ibG9ja2NvdW50ICsgbmV3LT5icl9ibG9ja2NvdW50IDw9IE1BWEVYVExFTik7CisJLyoKKwkgKiBDaGVjayBhbmQgc2V0IGZsYWdzIGlmIHRoaXMgc2VnbWVudCBoYXMgYSByaWdodCBuZWlnaGJvci4KKwkgKiBEb24ndCBzZXQgY29udGlndW91cyBpZiB0aGUgY29tYmluZWQgZXh0ZW50IHdvdWxkIGJlIHRvbyBsYXJnZS4KKwkgKiBBbHNvIGNoZWNrIGZvciBhbGwtdGhyZWUtY29udGlndW91cyBiZWluZyB0b28gbGFyZ2UuCisJICovCisJaWYgKFNUQVRFX1NFVF9URVNUKFJJR0hUX1ZBTElELAorCQkJaWR4IDwKKwkJCWlwLT5pX2RmLmlmX2J5dGVzIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KSAtIDEpKSB7CisJCXhmc19ibWJ0X2dldF9hbGwoZXAgKyAxLCAmUklHSFQpOworCQlTVEFURV9TRVQoUklHSFRfREVMQVksIElTTlVMTFNUQVJUQkxPQ0soUklHSFQuYnJfc3RhcnRibG9jaykpOworCX0KKwlTVEFURV9TRVQoUklHSFRfQ09OVElHLAorCQlTVEFURV9URVNUKFJJR0hUX1ZBTElEKSAmJiAhU1RBVEVfVEVTVChSSUdIVF9ERUxBWSkgJiYKKwkJbmV3X2VuZG9mZiA9PSBSSUdIVC5icl9zdGFydG9mZiAmJgorCQluZXctPmJyX3N0YXJ0YmxvY2sgKyBuZXctPmJyX2Jsb2NrY291bnQgPT0KKwkJICAgIFJJR0hULmJyX3N0YXJ0YmxvY2sgJiYKKwkJbmV3LT5icl9zdGF0ZSA9PSBSSUdIVC5icl9zdGF0ZSAmJgorCQluZXctPmJyX2Jsb2NrY291bnQgKyBSSUdIVC5icl9ibG9ja2NvdW50IDw9IE1BWEVYVExFTiAmJgorCQkoKHN0YXRlICYgTUFTSzMoTEVGVF9DT05USUcsIExFRlRfRklMTElORywgUklHSFRfRklMTElORykpICE9CisJCSAgTUFTSzMoTEVGVF9DT05USUcsIExFRlRfRklMTElORywgUklHSFRfRklMTElORykgfHwKKwkJIExFRlQuYnJfYmxvY2tjb3VudCArIG5ldy0+YnJfYmxvY2tjb3VudCArIFJJR0hULmJyX2Jsb2NrY291bnQKKwkJICAgICA8PSBNQVhFWFRMRU4pKTsKKwllcnJvciA9IDA7CisJLyoKKwkgKiBTd2l0Y2ggb3V0IGJhc2VkIG9uIHRoZSBGSUxMSU5HIGFuZCBDT05USUcgc3RhdGUgYml0cy4KKwkgKi8KKwlzd2l0Y2ggKFNXSVRDSF9TVEFURSkgeworCisJY2FzZSBNQVNLNChMRUZUX0ZJTExJTkcsIFJJR0hUX0ZJTExJTkcsIExFRlRfQ09OVElHLCBSSUdIVF9DT05USUcpOgorCQkvKgorCQkgKiBGaWxsaW5nIGluIGFsbCBvZiBhIHByZXZpb3VzbHkgZGVsYXllZCBhbGxvY2F0aW9uIGV4dGVudC4KKwkJICogVGhlIGxlZnQgYW5kIHJpZ2h0IG5laWdoYm9ycyBhcmUgYm90aCBjb250aWd1b3VzIHdpdGggbmV3LgorCQkgKi8KKwkJeGZzX2JtYXBfdHJhY2VfcHJlX3VwZGF0ZShmbmFtZSwgIkxGfFJGfExDfFJDIiwgaXAsIGlkeCAtIDEsCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJeGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoZXAgLSAxLAorCQkJTEVGVC5icl9ibG9ja2NvdW50ICsgUFJFVi5icl9ibG9ja2NvdW50ICsKKwkJCVJJR0hULmJyX2Jsb2NrY291bnQpOworCQl4ZnNfYm1hcF90cmFjZV9wb3N0X3VwZGF0ZShmbmFtZSwgIkxGfFJGfExDfFJDIiwgaXAsIGlkeCAtIDEsCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJeGZzX2JtYXBfdHJhY2VfZGVsZXRlKGZuYW1lLCAiTEZ8UkZ8TEN8UkMiLCBpcCwgaWR4LCAyLAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCXhmc19ibWFwX2RlbGV0ZV9leGxpc3QoaXAsIGlkeCwgMiwgWEZTX0RBVEFfRk9SSyk7CisJCWlwLT5pX2RmLmlmX2xhc3RleCA9IGlkeCAtIDE7CisJCWlwLT5pX2QuZGlfbmV4dGVudHMtLTsKKwkJaWYgKGN1ciA9PSBOVUxMKQorCQkJcnZhbCA9IFhGU19JTE9HX0NPUkUgfCBYRlNfSUxPR19ERVhUOworCQllbHNlIHsKKwkJCXJ2YWwgPSBYRlNfSUxPR19DT1JFOworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2xvb2t1cF9lcShjdXIsIFJJR0hULmJyX3N0YXJ0b2ZmLAorCQkJCQlSSUdIVC5icl9zdGFydGJsb2NrLAorCQkJCQlSSUdIVC5icl9ibG9ja2NvdW50LCAmaSkpKQorCQkJCWdvdG8gZG9uZTsKKwkJCUFTU0VSVChpID09IDEpOworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2RlbGV0ZShjdXIsICZpKSkpCisJCQkJZ290byBkb25lOworCQkJQVNTRVJUKGkgPT0gMSk7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfZGVjcmVtZW50KGN1ciwgMCwgJmkpKSkKKwkJCQlnb3RvIGRvbmU7CisJCQlBU1NFUlQoaSA9PSAxKTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF91cGRhdGUoY3VyLCBMRUZULmJyX3N0YXJ0b2ZmLAorCQkJCQlMRUZULmJyX3N0YXJ0YmxvY2ssCisJCQkJCUxFRlQuYnJfYmxvY2tjb3VudCArCisJCQkJCVBSRVYuYnJfYmxvY2tjb3VudCArCisJCQkJCVJJR0hULmJyX2Jsb2NrY291bnQsIExFRlQuYnJfc3RhdGUpKSkKKwkJCQlnb3RvIGRvbmU7CisJCX0KKwkJKmRuZXcgPSAwOworCQlicmVhazsKKworCWNhc2UgTUFTSzMoTEVGVF9GSUxMSU5HLCBSSUdIVF9GSUxMSU5HLCBMRUZUX0NPTlRJRyk6CisJCS8qCisJCSAqIEZpbGxpbmcgaW4gYWxsIG9mIGEgcHJldmlvdXNseSBkZWxheWVkIGFsbG9jYXRpb24gZXh0ZW50LgorCQkgKiBUaGUgbGVmdCBuZWlnaGJvciBpcyBjb250aWd1b3VzLCB0aGUgcmlnaHQgaXMgbm90LgorCQkgKi8KKwkJeGZzX2JtYXBfdHJhY2VfcHJlX3VwZGF0ZShmbmFtZSwgIkxGfFJGfExDIiwgaXAsIGlkeCAtIDEsCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJeGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoZXAgLSAxLAorCQkJTEVGVC5icl9ibG9ja2NvdW50ICsgUFJFVi5icl9ibG9ja2NvdW50KTsKKwkJeGZzX2JtYXBfdHJhY2VfcG9zdF91cGRhdGUoZm5hbWUsICJMRnxSRnxMQyIsIGlwLCBpZHggLSAxLAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCWlwLT5pX2RmLmlmX2xhc3RleCA9IGlkeCAtIDE7CisJCXhmc19ibWFwX3RyYWNlX2RlbGV0ZShmbmFtZSwgIkxGfFJGfExDIiwgaXAsIGlkeCwgMSwKKwkJCVhGU19EQVRBX0ZPUkspOworCQl4ZnNfYm1hcF9kZWxldGVfZXhsaXN0KGlwLCBpZHgsIDEsIFhGU19EQVRBX0ZPUkspOworCQlpZiAoY3VyID09IE5VTEwpCisJCQlydmFsID0gWEZTX0lMT0dfREVYVDsKKwkJZWxzZSB7CisJCQlydmFsID0gMDsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoY3VyLCBMRUZULmJyX3N0YXJ0b2ZmLAorCQkJCQlMRUZULmJyX3N0YXJ0YmxvY2ssIExFRlQuYnJfYmxvY2tjb3VudCwKKwkJCQkJJmkpKSkKKwkJCQlnb3RvIGRvbmU7CisJCQlBU1NFUlQoaSA9PSAxKTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF91cGRhdGUoY3VyLCBMRUZULmJyX3N0YXJ0b2ZmLAorCQkJCQlMRUZULmJyX3N0YXJ0YmxvY2ssCisJCQkJCUxFRlQuYnJfYmxvY2tjb3VudCArCisJCQkJCVBSRVYuYnJfYmxvY2tjb3VudCwgTEVGVC5icl9zdGF0ZSkpKQorCQkJCWdvdG8gZG9uZTsKKwkJfQorCQkqZG5ldyA9IDA7CisJCWJyZWFrOworCisJY2FzZSBNQVNLMyhMRUZUX0ZJTExJTkcsIFJJR0hUX0ZJTExJTkcsIFJJR0hUX0NPTlRJRyk6CisJCS8qCisJCSAqIEZpbGxpbmcgaW4gYWxsIG9mIGEgcHJldmlvdXNseSBkZWxheWVkIGFsbG9jYXRpb24gZXh0ZW50LgorCQkgKiBUaGUgcmlnaHQgbmVpZ2hib3IgaXMgY29udGlndW91cywgdGhlIGxlZnQgaXMgbm90LgorCQkgKi8KKwkJeGZzX2JtYXBfdHJhY2VfcHJlX3VwZGF0ZShmbmFtZSwgIkxGfFJGfFJDIiwgaXAsIGlkeCwKKwkJCVhGU19EQVRBX0ZPUkspOworCQl4ZnNfYm1idF9zZXRfc3RhcnRibG9jayhlcCwgbmV3LT5icl9zdGFydGJsb2NrKTsKKwkJeGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoZXAsCisJCQlQUkVWLmJyX2Jsb2NrY291bnQgKyBSSUdIVC5icl9ibG9ja2NvdW50KTsKKwkJeGZzX2JtYXBfdHJhY2VfcG9zdF91cGRhdGUoZm5hbWUsICJMRnxSRnxSQyIsIGlwLCBpZHgsCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJaXAtPmlfZGYuaWZfbGFzdGV4ID0gaWR4OworCQl4ZnNfYm1hcF90cmFjZV9kZWxldGUoZm5hbWUsICJMRnxSRnxSQyIsIGlwLCBpZHggKyAxLCAxLAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCXhmc19ibWFwX2RlbGV0ZV9leGxpc3QoaXAsIGlkeCArIDEsIDEsIFhGU19EQVRBX0ZPUkspOworCQlpZiAoY3VyID09IE5VTEwpCisJCQlydmFsID0gWEZTX0lMT0dfREVYVDsKKwkJZWxzZSB7CisJCQlydmFsID0gMDsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoY3VyLCBSSUdIVC5icl9zdGFydG9mZiwKKwkJCQkJUklHSFQuYnJfc3RhcnRibG9jaywKKwkJCQkJUklHSFQuYnJfYmxvY2tjb3VudCwgJmkpKSkKKwkJCQlnb3RvIGRvbmU7CisJCQlBU1NFUlQoaSA9PSAxKTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF91cGRhdGUoY3VyLCBQUkVWLmJyX3N0YXJ0b2ZmLAorCQkJCQluZXctPmJyX3N0YXJ0YmxvY2ssCisJCQkJCVBSRVYuYnJfYmxvY2tjb3VudCArCisJCQkJCVJJR0hULmJyX2Jsb2NrY291bnQsIFBSRVYuYnJfc3RhdGUpKSkKKwkJCQlnb3RvIGRvbmU7CisJCX0KKwkJKmRuZXcgPSAwOworCQlicmVhazsKKworCWNhc2UgTUFTSzIoTEVGVF9GSUxMSU5HLCBSSUdIVF9GSUxMSU5HKToKKwkJLyoKKwkJICogRmlsbGluZyBpbiBhbGwgb2YgYSBwcmV2aW91c2x5IGRlbGF5ZWQgYWxsb2NhdGlvbiBleHRlbnQuCisJCSAqIE5laXRoZXIgdGhlIGxlZnQgbm9yIHJpZ2h0IG5laWdoYm9ycyBhcmUgY29udGlndW91cyB3aXRoCisJCSAqIHRoZSBuZXcgb25lLgorCQkgKi8KKwkJeGZzX2JtYXBfdHJhY2VfcHJlX3VwZGF0ZShmbmFtZSwgIkxGfFJGIiwgaXAsIGlkeCwKKwkJCVhGU19EQVRBX0ZPUkspOworCQl4ZnNfYm1idF9zZXRfc3RhcnRibG9jayhlcCwgbmV3LT5icl9zdGFydGJsb2NrKTsKKwkJeGZzX2JtYXBfdHJhY2VfcG9zdF91cGRhdGUoZm5hbWUsICJMRnxSRiIsIGlwLCBpZHgsCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJaXAtPmlfZGYuaWZfbGFzdGV4ID0gaWR4OworCQlpcC0+aV9kLmRpX25leHRlbnRzKys7CisJCWlmIChjdXIgPT0gTlVMTCkKKwkJCXJ2YWwgPSBYRlNfSUxPR19DT1JFIHwgWEZTX0lMT0dfREVYVDsKKwkJZWxzZSB7CisJCQlydmFsID0gWEZTX0lMT0dfQ09SRTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoY3VyLCBuZXctPmJyX3N0YXJ0b2ZmLAorCQkJCQluZXctPmJyX3N0YXJ0YmxvY2ssIG5ldy0+YnJfYmxvY2tjb3VudCwKKwkJCQkJJmkpKSkKKwkJCQlnb3RvIGRvbmU7CisJCQlBU1NFUlQoaSA9PSAwKTsKKwkJCWN1ci0+YmNfcmVjLmIuYnJfc3RhdGUgPSBYRlNfRVhUX05PUk07CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfaW5zZXJ0KGN1ciwgJmkpKSkKKwkJCQlnb3RvIGRvbmU7CisJCQlBU1NFUlQoaSA9PSAxKTsKKwkJfQorCQkqZG5ldyA9IDA7CisJCWJyZWFrOworCisJY2FzZSBNQVNLMihMRUZUX0ZJTExJTkcsIExFRlRfQ09OVElHKToKKwkJLyoKKwkJICogRmlsbGluZyBpbiB0aGUgZmlyc3QgcGFydCBvZiBhIHByZXZpb3VzIGRlbGF5ZWQgYWxsb2NhdGlvbi4KKwkJICogVGhlIGxlZnQgbmVpZ2hib3IgaXMgY29udGlndW91cy4KKwkJICovCisJCXhmc19ibWFwX3RyYWNlX3ByZV91cGRhdGUoZm5hbWUsICJMRnxMQyIsIGlwLCBpZHggLSAxLAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCXhmc19ibWJ0X3NldF9ibG9ja2NvdW50KGVwIC0gMSwKKwkJCUxFRlQuYnJfYmxvY2tjb3VudCArIG5ldy0+YnJfYmxvY2tjb3VudCk7CisJCXhmc19ibWJ0X3NldF9zdGFydG9mZihlcCwKKwkJCVBSRVYuYnJfc3RhcnRvZmYgKyBuZXctPmJyX2Jsb2NrY291bnQpOworCQl4ZnNfYm1hcF90cmFjZV9wb3N0X3VwZGF0ZShmbmFtZSwgIkxGfExDIiwgaXAsIGlkeCAtIDEsCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJdGVtcCA9IFBSRVYuYnJfYmxvY2tjb3VudCAtIG5ldy0+YnJfYmxvY2tjb3VudDsKKwkJeGZzX2JtYXBfdHJhY2VfcHJlX3VwZGF0ZShmbmFtZSwgIkxGfExDIiwgaXAsIGlkeCwKKwkJCVhGU19EQVRBX0ZPUkspOworCQl4ZnNfYm1idF9zZXRfYmxvY2tjb3VudChlcCwgdGVtcCk7CisJCWlwLT5pX2RmLmlmX2xhc3RleCA9IGlkeCAtIDE7CisJCWlmIChjdXIgPT0gTlVMTCkKKwkJCXJ2YWwgPSBYRlNfSUxPR19ERVhUOworCQllbHNlIHsKKwkJCXJ2YWwgPSAwOworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2xvb2t1cF9lcShjdXIsIExFRlQuYnJfc3RhcnRvZmYsCisJCQkJCUxFRlQuYnJfc3RhcnRibG9jaywgTEVGVC5icl9ibG9ja2NvdW50LAorCQkJCQkmaSkpKQorCQkJCWdvdG8gZG9uZTsKKwkJCUFTU0VSVChpID09IDEpOworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X3VwZGF0ZShjdXIsIExFRlQuYnJfc3RhcnRvZmYsCisJCQkJCUxFRlQuYnJfc3RhcnRibG9jaywKKwkJCQkJTEVGVC5icl9ibG9ja2NvdW50ICsKKwkJCQkJbmV3LT5icl9ibG9ja2NvdW50LAorCQkJCQlMRUZULmJyX3N0YXRlKSkpCisJCQkJZ290byBkb25lOworCQl9CisJCXRlbXAgPSBYRlNfRklMQkxLU19NSU4oeGZzX2JtYXBfd29yc3RfaW5kbGVuKGlwLCB0ZW1wKSwKKwkJCVNUQVJUQkxPQ0tWQUwoUFJFVi5icl9zdGFydGJsb2NrKSk7CisJCXhmc19ibWJ0X3NldF9zdGFydGJsb2NrKGVwLCBOVUxMU1RBUlRCTE9DSygoaW50KXRlbXApKTsKKwkJeGZzX2JtYXBfdHJhY2VfcG9zdF91cGRhdGUoZm5hbWUsICJMRnxMQyIsIGlwLCBpZHgsCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJKmRuZXcgPSB0ZW1wOworCQlicmVhazsKKworCWNhc2UgTUFTSyhMRUZUX0ZJTExJTkcpOgorCQkvKgorCQkgKiBGaWxsaW5nIGluIHRoZSBmaXJzdCBwYXJ0IG9mIGEgcHJldmlvdXMgZGVsYXllZCBhbGxvY2F0aW9uLgorCQkgKiBUaGUgbGVmdCBuZWlnaGJvciBpcyBub3QgY29udGlndW91cy4KKwkJICovCisJCXhmc19ibWFwX3RyYWNlX3ByZV91cGRhdGUoZm5hbWUsICJMRiIsIGlwLCBpZHgsIFhGU19EQVRBX0ZPUkspOworCQl4ZnNfYm1idF9zZXRfc3RhcnRvZmYoZXAsIG5ld19lbmRvZmYpOworCQl0ZW1wID0gUFJFVi5icl9ibG9ja2NvdW50IC0gbmV3LT5icl9ibG9ja2NvdW50OworCQl4ZnNfYm1idF9zZXRfYmxvY2tjb3VudChlcCwgdGVtcCk7CisJCXhmc19ibWFwX3RyYWNlX2luc2VydChmbmFtZSwgIkxGIiwgaXAsIGlkeCwgMSwgbmV3LCBOVUxMLAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCXhmc19ibWFwX2luc2VydF9leGxpc3QoaXAsIGlkeCwgMSwgbmV3LCBYRlNfREFUQV9GT1JLKTsKKwkJaXAtPmlfZGYuaWZfbGFzdGV4ID0gaWR4OworCQlpcC0+aV9kLmRpX25leHRlbnRzKys7CisJCWlmIChjdXIgPT0gTlVMTCkKKwkJCXJ2YWwgPSBYRlNfSUxPR19DT1JFIHwgWEZTX0lMT0dfREVYVDsKKwkJZWxzZSB7CisJCQlydmFsID0gWEZTX0lMT0dfQ09SRTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoY3VyLCBuZXctPmJyX3N0YXJ0b2ZmLAorCQkJCQluZXctPmJyX3N0YXJ0YmxvY2ssIG5ldy0+YnJfYmxvY2tjb3VudCwKKwkJCQkJJmkpKSkKKwkJCQlnb3RvIGRvbmU7CisJCQlBU1NFUlQoaSA9PSAwKTsKKwkJCWN1ci0+YmNfcmVjLmIuYnJfc3RhdGUgPSBYRlNfRVhUX05PUk07CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfaW5zZXJ0KGN1ciwgJmkpKSkKKwkJCQlnb3RvIGRvbmU7CisJCQlBU1NFUlQoaSA9PSAxKTsKKwkJfQorCQlpZiAoaXAtPmlfZC5kaV9mb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUyAmJgorCQkgICAgaXAtPmlfZC5kaV9uZXh0ZW50cyA+IGlwLT5pX2RmLmlmX2V4dF9tYXgpIHsKKwkJCWVycm9yID0geGZzX2JtYXBfZXh0ZW50c190b19idHJlZShpcC0+aV90cmFuc3AsIGlwLAorCQkJCQlmaXJzdCwgZmxpc3QsICZjdXIsIDEsICZ0bXBfcnZhbCwKKwkJCQkJWEZTX0RBVEFfRk9SSyk7CisJCQlydmFsIHw9IHRtcF9ydmFsOworCQkJaWYgKGVycm9yKQorCQkJCWdvdG8gZG9uZTsKKwkJfQorCQl0ZW1wID0gWEZTX0ZJTEJMS1NfTUlOKHhmc19ibWFwX3dvcnN0X2luZGxlbihpcCwgdGVtcCksCisJCQlTVEFSVEJMT0NLVkFMKFBSRVYuYnJfc3RhcnRibG9jaykgLQorCQkJKGN1ciA/IGN1ci0+YmNfcHJpdmF0ZS5iLmFsbG9jYXRlZCA6IDApKTsKKwkJYmFzZSA9IGlwLT5pX2RmLmlmX3UxLmlmX2V4dGVudHM7CisJCWVwID0gJmJhc2VbaWR4ICsgMV07CisJCXhmc19ibWJ0X3NldF9zdGFydGJsb2NrKGVwLCBOVUxMU1RBUlRCTE9DSygoaW50KXRlbXApKTsKKwkJeGZzX2JtYXBfdHJhY2VfcG9zdF91cGRhdGUoZm5hbWUsICJMRiIsIGlwLCBpZHggKyAxLAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCSpkbmV3ID0gdGVtcDsKKwkJYnJlYWs7CisKKwljYXNlIE1BU0syKFJJR0hUX0ZJTExJTkcsIFJJR0hUX0NPTlRJRyk6CisJCS8qCisJCSAqIEZpbGxpbmcgaW4gdGhlIGxhc3QgcGFydCBvZiBhIHByZXZpb3VzIGRlbGF5ZWQgYWxsb2NhdGlvbi4KKwkJICogVGhlIHJpZ2h0IG5laWdoYm9yIGlzIGNvbnRpZ3VvdXMgd2l0aCB0aGUgbmV3IGFsbG9jYXRpb24uCisJCSAqLworCQl0ZW1wID0gUFJFVi5icl9ibG9ja2NvdW50IC0gbmV3LT5icl9ibG9ja2NvdW50OworCQl4ZnNfYm1hcF90cmFjZV9wcmVfdXBkYXRlKGZuYW1lLCAiUkZ8UkMiLCBpcCwgaWR4LAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCXhmc19ibWFwX3RyYWNlX3ByZV91cGRhdGUoZm5hbWUsICJSRnxSQyIsIGlwLCBpZHggKyAxLAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCXhmc19ibWJ0X3NldF9ibG9ja2NvdW50KGVwLCB0ZW1wKTsKKwkJeGZzX2JtYnRfc2V0X2FsbGYoZXAgKyAxLCBuZXctPmJyX3N0YXJ0b2ZmLCBuZXctPmJyX3N0YXJ0YmxvY2ssCisJCQluZXctPmJyX2Jsb2NrY291bnQgKyBSSUdIVC5icl9ibG9ja2NvdW50LAorCQkJUklHSFQuYnJfc3RhdGUpOworCQl4ZnNfYm1hcF90cmFjZV9wb3N0X3VwZGF0ZShmbmFtZSwgIlJGfFJDIiwgaXAsIGlkeCArIDEsCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJaXAtPmlfZGYuaWZfbGFzdGV4ID0gaWR4ICsgMTsKKwkJaWYgKGN1ciA9PSBOVUxMKQorCQkJcnZhbCA9IFhGU19JTE9HX0RFWFQ7CisJCWVsc2UgeworCQkJcnZhbCA9IDA7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfbG9va3VwX2VxKGN1ciwgUklHSFQuYnJfc3RhcnRvZmYsCisJCQkJCVJJR0hULmJyX3N0YXJ0YmxvY2ssCisJCQkJCVJJR0hULmJyX2Jsb2NrY291bnQsICZpKSkpCisJCQkJZ290byBkb25lOworCQkJQVNTRVJUKGkgPT0gMSk7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfdXBkYXRlKGN1ciwgbmV3LT5icl9zdGFydG9mZiwKKwkJCQkJbmV3LT5icl9zdGFydGJsb2NrLAorCQkJCQluZXctPmJyX2Jsb2NrY291bnQgKworCQkJCQlSSUdIVC5icl9ibG9ja2NvdW50LAorCQkJCQlSSUdIVC5icl9zdGF0ZSkpKQorCQkJCWdvdG8gZG9uZTsKKwkJfQorCQl0ZW1wID0gWEZTX0ZJTEJMS1NfTUlOKHhmc19ibWFwX3dvcnN0X2luZGxlbihpcCwgdGVtcCksCisJCQlTVEFSVEJMT0NLVkFMKFBSRVYuYnJfc3RhcnRibG9jaykpOworCQl4ZnNfYm1idF9zZXRfc3RhcnRibG9jayhlcCwgTlVMTFNUQVJUQkxPQ0soKGludCl0ZW1wKSk7CisJCXhmc19ibWFwX3RyYWNlX3Bvc3RfdXBkYXRlKGZuYW1lLCAiUkZ8UkMiLCBpcCwgaWR4LAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCSpkbmV3ID0gdGVtcDsKKwkJYnJlYWs7CisKKwljYXNlIE1BU0soUklHSFRfRklMTElORyk6CisJCS8qCisJCSAqIEZpbGxpbmcgaW4gdGhlIGxhc3QgcGFydCBvZiBhIHByZXZpb3VzIGRlbGF5ZWQgYWxsb2NhdGlvbi4KKwkJICogVGhlIHJpZ2h0IG5laWdoYm9yIGlzIG5vdCBjb250aWd1b3VzLgorCQkgKi8KKwkJdGVtcCA9IFBSRVYuYnJfYmxvY2tjb3VudCAtIG5ldy0+YnJfYmxvY2tjb3VudDsKKwkJeGZzX2JtYXBfdHJhY2VfcHJlX3VwZGF0ZShmbmFtZSwgIlJGIiwgaXAsIGlkeCwgWEZTX0RBVEFfRk9SSyk7CisJCXhmc19ibWJ0X3NldF9ibG9ja2NvdW50KGVwLCB0ZW1wKTsKKwkJeGZzX2JtYXBfdHJhY2VfaW5zZXJ0KGZuYW1lLCAiUkYiLCBpcCwgaWR4ICsgMSwgMSwKKwkJCW5ldywgTlVMTCwgWEZTX0RBVEFfRk9SSyk7CisJCXhmc19ibWFwX2luc2VydF9leGxpc3QoaXAsIGlkeCArIDEsIDEsIG5ldywgWEZTX0RBVEFfRk9SSyk7CisJCWlwLT5pX2RmLmlmX2xhc3RleCA9IGlkeCArIDE7CisJCWlwLT5pX2QuZGlfbmV4dGVudHMrKzsKKwkJaWYgKGN1ciA9PSBOVUxMKQorCQkJcnZhbCA9IFhGU19JTE9HX0NPUkUgfCBYRlNfSUxPR19ERVhUOworCQllbHNlIHsKKwkJCXJ2YWwgPSBYRlNfSUxPR19DT1JFOworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2xvb2t1cF9lcShjdXIsIG5ldy0+YnJfc3RhcnRvZmYsCisJCQkJCW5ldy0+YnJfc3RhcnRibG9jaywgbmV3LT5icl9ibG9ja2NvdW50LAorCQkJCQkmaSkpKQorCQkJCWdvdG8gZG9uZTsKKwkJCUFTU0VSVChpID09IDApOworCQkJY3VyLT5iY19yZWMuYi5icl9zdGF0ZSA9IFhGU19FWFRfTk9STTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9pbnNlcnQoY3VyLCAmaSkpKQorCQkJCWdvdG8gZG9uZTsKKwkJCUFTU0VSVChpID09IDEpOworCQl9CisJCWlmIChpcC0+aV9kLmRpX2Zvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICYmCisJCSAgICBpcC0+aV9kLmRpX25leHRlbnRzID4gaXAtPmlfZGYuaWZfZXh0X21heCkgeworCQkJZXJyb3IgPSB4ZnNfYm1hcF9leHRlbnRzX3RvX2J0cmVlKGlwLT5pX3RyYW5zcCwgaXAsCisJCQkJZmlyc3QsIGZsaXN0LCAmY3VyLCAxLCAmdG1wX3J2YWwsCisJCQkJWEZTX0RBVEFfRk9SSyk7CisJCQlydmFsIHw9IHRtcF9ydmFsOworCQkJaWYgKGVycm9yKQorCQkJCWdvdG8gZG9uZTsKKwkJfQorCQl0ZW1wID0gWEZTX0ZJTEJMS1NfTUlOKHhmc19ibWFwX3dvcnN0X2luZGxlbihpcCwgdGVtcCksCisJCQlTVEFSVEJMT0NLVkFMKFBSRVYuYnJfc3RhcnRibG9jaykgLQorCQkJKGN1ciA/IGN1ci0+YmNfcHJpdmF0ZS5iLmFsbG9jYXRlZCA6IDApKTsKKwkJYmFzZSA9IGlwLT5pX2RmLmlmX3UxLmlmX2V4dGVudHM7CisJCWVwID0gJmJhc2VbaWR4XTsKKwkJeGZzX2JtYnRfc2V0X3N0YXJ0YmxvY2soZXAsIE5VTExTVEFSVEJMT0NLKChpbnQpdGVtcCkpOworCQl4ZnNfYm1hcF90cmFjZV9wb3N0X3VwZGF0ZShmbmFtZSwgIlJGIiwgaXAsIGlkeCwgWEZTX0RBVEFfRk9SSyk7CisJCSpkbmV3ID0gdGVtcDsKKwkJYnJlYWs7CisKKwljYXNlIDA6CisJCS8qCisJCSAqIEZpbGxpbmcgaW4gdGhlIG1pZGRsZSBwYXJ0IG9mIGEgcHJldmlvdXMgZGVsYXllZCBhbGxvY2F0aW9uLgorCQkgKiBDb250aWd1aXR5IGlzIGltcG9zc2libGUgaGVyZS4KKwkJICogVGhpcyBjYXNlIGlzIGF2b2lkZWQgYWxtb3N0IGFsbCB0aGUgdGltZS4KKwkJICovCisJCXRlbXAgPSBuZXctPmJyX3N0YXJ0b2ZmIC0gUFJFVi5icl9zdGFydG9mZjsKKwkJeGZzX2JtYXBfdHJhY2VfcHJlX3VwZGF0ZShmbmFtZSwgIjAiLCBpcCwgaWR4LCBYRlNfREFUQV9GT1JLKTsKKwkJeGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoZXAsIHRlbXApOworCQlyWzBdID0gKm5ldzsKKwkJclsxXS5icl9zdGFydG9mZiA9IG5ld19lbmRvZmY7CisJCXRlbXAyID0gUFJFVi5icl9zdGFydG9mZiArIFBSRVYuYnJfYmxvY2tjb3VudCAtIG5ld19lbmRvZmY7CisJCXJbMV0uYnJfYmxvY2tjb3VudCA9IHRlbXAyOworCQl4ZnNfYm1hcF90cmFjZV9pbnNlcnQoZm5hbWUsICIwIiwgaXAsIGlkeCArIDEsIDIsICZyWzBdLCAmclsxXSwKKwkJCVhGU19EQVRBX0ZPUkspOworCQl4ZnNfYm1hcF9pbnNlcnRfZXhsaXN0KGlwLCBpZHggKyAxLCAyLCAmclswXSwgWEZTX0RBVEFfRk9SSyk7CisJCWlwLT5pX2RmLmlmX2xhc3RleCA9IGlkeCArIDE7CisJCWlwLT5pX2QuZGlfbmV4dGVudHMrKzsKKwkJaWYgKGN1ciA9PSBOVUxMKQorCQkJcnZhbCA9IFhGU19JTE9HX0NPUkUgfCBYRlNfSUxPR19ERVhUOworCQllbHNlIHsKKwkJCXJ2YWwgPSBYRlNfSUxPR19DT1JFOworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2xvb2t1cF9lcShjdXIsIG5ldy0+YnJfc3RhcnRvZmYsCisJCQkJCW5ldy0+YnJfc3RhcnRibG9jaywgbmV3LT5icl9ibG9ja2NvdW50LAorCQkJCQkmaSkpKQorCQkJCWdvdG8gZG9uZTsKKwkJCUFTU0VSVChpID09IDApOworCQkJY3VyLT5iY19yZWMuYi5icl9zdGF0ZSA9IFhGU19FWFRfTk9STTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9pbnNlcnQoY3VyLCAmaSkpKQorCQkJCWdvdG8gZG9uZTsKKwkJCUFTU0VSVChpID09IDEpOworCQl9CisJCWlmIChpcC0+aV9kLmRpX2Zvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICYmCisJCSAgICBpcC0+aV9kLmRpX25leHRlbnRzID4gaXAtPmlfZGYuaWZfZXh0X21heCkgeworCQkJZXJyb3IgPSB4ZnNfYm1hcF9leHRlbnRzX3RvX2J0cmVlKGlwLT5pX3RyYW5zcCwgaXAsCisJCQkJCWZpcnN0LCBmbGlzdCwgJmN1ciwgMSwgJnRtcF9ydmFsLAorCQkJCQlYRlNfREFUQV9GT1JLKTsKKwkJCXJ2YWwgfD0gdG1wX3J2YWw7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBkb25lOworCQl9CisJCXRlbXAgPSB4ZnNfYm1hcF93b3JzdF9pbmRsZW4oaXAsIHRlbXApOworCQl0ZW1wMiA9IHhmc19ibWFwX3dvcnN0X2luZGxlbihpcCwgdGVtcDIpOworCQlkaWZmID0gKGludCkodGVtcCArIHRlbXAyIC0gU1RBUlRCTE9DS1ZBTChQUkVWLmJyX3N0YXJ0YmxvY2spIC0KKwkJCShjdXIgPyBjdXItPmJjX3ByaXZhdGUuYi5hbGxvY2F0ZWQgOiAwKSk7CisJCWlmIChkaWZmID4gMCAmJgorCQkgICAgeGZzX21vZF9pbmNvcmVfc2IoaXAtPmlfbW91bnQsIFhGU19TQlNfRkRCTE9DS1MsIC1kaWZmLCByc3ZkKSkgeworCQkJLyoKKwkJCSAqIEljayBncm9zcyBnYWcgbWUgd2l0aCBhIHNwb29uLgorCQkJICovCisJCQlBU1NFUlQoMCk7CS8qIHdhbnQgdG8gc2VlIGlmIHRoaXMgZXZlciBoYXBwZW5zISAqLworCQkJd2hpbGUgKGRpZmYgPiAwKSB7CisJCQkJaWYgKHRlbXApIHsKKwkJCQkJdGVtcC0tOworCQkJCQlkaWZmLS07CisJCQkJCWlmICghZGlmZiB8fAorCQkJCQkgICAgIXhmc19tb2RfaW5jb3JlX3NiKGlwLT5pX21vdW50LAorCQkJCQkJICAgIFhGU19TQlNfRkRCTE9DS1MsIC1kaWZmLCByc3ZkKSkKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAodGVtcDIpIHsKKwkJCQkJdGVtcDItLTsKKwkJCQkJZGlmZi0tOworCQkJCQlpZiAoIWRpZmYgfHwKKwkJCQkJICAgICF4ZnNfbW9kX2luY29yZV9zYihpcC0+aV9tb3VudCwKKwkJCQkJCSAgICBYRlNfU0JTX0ZEQkxPQ0tTLCAtZGlmZiwgcnN2ZCkpCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwkJYmFzZSA9IGlwLT5pX2RmLmlmX3UxLmlmX2V4dGVudHM7CisJCWVwID0gJmJhc2VbaWR4XTsKKwkJeGZzX2JtYnRfc2V0X3N0YXJ0YmxvY2soZXAsIE5VTExTVEFSVEJMT0NLKChpbnQpdGVtcCkpOworCQl4ZnNfYm1hcF90cmFjZV9wb3N0X3VwZGF0ZShmbmFtZSwgIjAiLCBpcCwgaWR4LCBYRlNfREFUQV9GT1JLKTsKKwkJeGZzX2JtYXBfdHJhY2VfcHJlX3VwZGF0ZShmbmFtZSwgIjAiLCBpcCwgaWR4ICsgMiwKKwkJCVhGU19EQVRBX0ZPUkspOworCQl4ZnNfYm1idF9zZXRfc3RhcnRibG9jayhlcCArIDIsIE5VTExTVEFSVEJMT0NLKChpbnQpdGVtcDIpKTsKKwkJeGZzX2JtYXBfdHJhY2VfcG9zdF91cGRhdGUoZm5hbWUsICIwIiwgaXAsIGlkeCArIDIsCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJKmRuZXcgPSB0ZW1wICsgdGVtcDI7CisJCWJyZWFrOworCisJY2FzZSBNQVNLMyhMRUZUX0ZJTExJTkcsIExFRlRfQ09OVElHLCBSSUdIVF9DT05USUcpOgorCWNhc2UgTUFTSzMoUklHSFRfRklMTElORywgTEVGVF9DT05USUcsIFJJR0hUX0NPTlRJRyk6CisJY2FzZSBNQVNLMihMRUZUX0ZJTExJTkcsIFJJR0hUX0NPTlRJRyk6CisJY2FzZSBNQVNLMihSSUdIVF9GSUxMSU5HLCBMRUZUX0NPTlRJRyk6CisJY2FzZSBNQVNLMihMRUZUX0NPTlRJRywgUklHSFRfQ09OVElHKToKKwljYXNlIE1BU0soTEVGVF9DT05USUcpOgorCWNhc2UgTUFTSyhSSUdIVF9DT05USUcpOgorCQkvKgorCQkgKiBUaGVzZSBjYXNlcyBhcmUgYWxsIGltcG9zc2libGUuCisJCSAqLworCQlBU1NFUlQoMCk7CisJfQorCSpjdXJwID0gY3VyOworZG9uZToKKwkqbG9nZmxhZ3NwID0gcnZhbDsKKwlyZXR1cm4gZXJyb3I7CisjdW5kZWYJTEVGVAorI3VuZGVmCVJJR0hUCisjdW5kZWYJUFJFVgorI3VuZGVmCU1BU0sKKyN1bmRlZglNQVNLMgorI3VuZGVmCU1BU0szCisjdW5kZWYJTUFTSzQKKyN1bmRlZglTVEFURV9TRVQKKyN1bmRlZglTVEFURV9URVNUCisjdW5kZWYJU1RBVEVfU0VUX1RFU1QKKyN1bmRlZglTV0lUQ0hfU1RBVEUKK30KKworLyoKKyAqIENhbGxlZCBieSB4ZnNfYm1hcF9hZGRfZXh0ZW50IHRvIGhhbmRsZSBjYXNlcyBjb252ZXJ0aW5nIGFuIHVud3JpdHRlbgorICogYWxsb2NhdGlvbiB0byBhIHJlYWwgYWxsb2NhdGlvbiBvciB2aWNlIHZlcnNhLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfYm1hcF9hZGRfZXh0ZW50X3Vud3JpdHRlbl9yZWFsKAorCXhmc19pbm9kZV90CQkqaXAsCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCisJeGZzX2V4dG51bV90CQlpZHgsCS8qIGV4dGVudCBudW1iZXIgdG8gdXBkYXRlL2luc2VydCAqLworCXhmc19idHJlZV9jdXJfdAkJKipjdXJwLAkvKiBpZiAqY3VycCBpcyBudWxsLCBub3QgYSBidHJlZSAqLworCXhmc19ibWJ0X2lyZWNfdAkJKm5ldywJLyogbmV3IGRhdGEgdG8gcHV0IGluIGV4dGVudCBsaXN0ICovCisJaW50CQkJKmxvZ2ZsYWdzcCkgLyogaW5vZGUgbG9nZ2luZyBmbGFncyAqLworeworCXhmc19ibWJ0X3JlY190CQkqYmFzZTsJLyogYmFzZSBvZiBleHRlbnQgZW50cnkgbGlzdCAqLworCXhmc19idHJlZV9jdXJfdAkJKmN1cjsJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2JtYnRfcmVjX3QJCSplcDsJLyogZXh0ZW50IGVudHJ5IGZvciBpZHggKi8KKwlpbnQJCQllcnJvcjsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisjaWZkZWYgWEZTX0JNQVBfVFJBQ0UKKwlzdGF0aWMgY2hhcgkJZm5hbWVbXSA9ICJ4ZnNfYm1hcF9hZGRfZXh0ZW50X3Vud3JpdHRlbl9yZWFsIjsKKyNlbmRpZgorCWludAkJCWk7CS8qIHRlbXAgc3RhdGUgKi8KKwl4ZnNfZmlsZW9mZl90CQluZXdfZW5kb2ZmOwkvKiBlbmQgb2Zmc2V0IG9mIG5ldyBlbnRyeSAqLworCXhmc19leG50c3RfdAkJbmV3ZXh0OwkvKiBuZXcgZXh0ZW50IHN0YXRlICovCisJeGZzX2V4bnRzdF90CQlvbGRleHQ7CS8qIG9sZCBleHRlbnQgc3RhdGUgKi8KKwl4ZnNfYm1idF9pcmVjX3QJCXJbM107CS8qIG5laWdoYm9yIGV4dGVudCBlbnRyaWVzICovCisJCQkJCS8qIGxlZnQgaXMgMCwgcmlnaHQgaXMgMSwgcHJldiBpcyAyICovCisJaW50CQkJcnZhbD0wOwkvKiByZXR1cm4gdmFsdWUgKGxvZ2dpbmcgZmxhZ3MpICovCisJaW50CQkJc3RhdGUgPSAwOy8qIHN0YXRlIGJpdHMsIGFjY2Vzc2VkIHRocnUgbWFjcm9zICovCisJZW51bSB7CQkJCS8qIGJpdCBudW1iZXIgZGVmaW5pdGlvbnMgZm9yIHN0YXRlICovCisJCUxFRlRfQ09OVElHLAlSSUdIVF9DT05USUcsCisJCUxFRlRfRklMTElORywJUklHSFRfRklMTElORywKKwkJTEVGVF9ERUxBWSwJUklHSFRfREVMQVksCisJCUxFRlRfVkFMSUQsCVJJR0hUX1ZBTElECisJfTsKKworI2RlZmluZQlMRUZUCQlyWzBdCisjZGVmaW5lCVJJR0hUCQlyWzFdCisjZGVmaW5lCVBSRVYJCXJbMl0KKyNkZWZpbmUJTUFTSyhiKQkJKDEgPDwgKGIpKQorI2RlZmluZQlNQVNLMihhLGIpCShNQVNLKGEpIHwgTUFTSyhiKSkKKyNkZWZpbmUJTUFTSzMoYSxiLGMpCShNQVNLMihhLGIpIHwgTUFTSyhjKSkKKyNkZWZpbmUJTUFTSzQoYSxiLGMsZCkJKE1BU0szKGEsYixjKSB8IE1BU0soZCkpCisjZGVmaW5lCVNUQVRFX1NFVChiLHYpCSgodikgPyAoc3RhdGUgfD0gTUFTSyhiKSkgOiAoc3RhdGUgJj0gfk1BU0soYikpKQorI2RlZmluZQlTVEFURV9URVNUKGIpCShzdGF0ZSAmIE1BU0soYikpCisjZGVmaW5lCVNUQVRFX1NFVF9URVNUKGIsdikJKCh2KSA/ICgoc3RhdGUgfD0gTUFTSyhiKSksIDEpIDogXAorCQkJCSAgICAgICAoKHN0YXRlICY9IH5NQVNLKGIpKSwgMCkpCisjZGVmaW5lCVNXSVRDSF9TVEFURQkJXAorCShzdGF0ZSAmIE1BU0s0KExFRlRfRklMTElORywgUklHSFRfRklMTElORywgTEVGVF9DT05USUcsIFJJR0hUX0NPTlRJRykpCisKKwkvKgorCSAqIFNldCB1cCBhIGJ1bmNoIG9mIHZhcmlhYmxlcyB0byBtYWtlIHRoZSB0ZXN0cyBzaW1wbGVyLgorCSAqLworCWVycm9yID0gMDsKKwljdXIgPSAqY3VycDsKKwliYXNlID0gaXAtPmlfZGYuaWZfdTEuaWZfZXh0ZW50czsKKwllcCA9ICZiYXNlW2lkeF07CisJeGZzX2JtYnRfZ2V0X2FsbChlcCwgJlBSRVYpOworCW5ld2V4dCA9IG5ldy0+YnJfc3RhdGU7CisJb2xkZXh0ID0gKG5ld2V4dCA9PSBYRlNfRVhUX1VOV1JJVFRFTikgPworCQlYRlNfRVhUX05PUk0gOiBYRlNfRVhUX1VOV1JJVFRFTjsKKwlBU1NFUlQoUFJFVi5icl9zdGF0ZSA9PSBvbGRleHQpOworCW5ld19lbmRvZmYgPSBuZXctPmJyX3N0YXJ0b2ZmICsgbmV3LT5icl9ibG9ja2NvdW50OworCUFTU0VSVChQUkVWLmJyX3N0YXJ0b2ZmIDw9IG5ldy0+YnJfc3RhcnRvZmYpOworCUFTU0VSVChQUkVWLmJyX3N0YXJ0b2ZmICsgUFJFVi5icl9ibG9ja2NvdW50ID49IG5ld19lbmRvZmYpOworCS8qCisJICogU2V0IGZsYWdzIGRldGVybWluaW5nIHdoYXQgcGFydCBvZiB0aGUgcHJldmlvdXMgb2xkZXh0IGFsbG9jYXRpb24KKwkgKiBleHRlbnQgaXMgYmVpbmcgcmVwbGFjZWQgYnkgYSBuZXdleHQgYWxsb2NhdGlvbi4KKwkgKi8KKwlTVEFURV9TRVQoTEVGVF9GSUxMSU5HLCBQUkVWLmJyX3N0YXJ0b2ZmID09IG5ldy0+YnJfc3RhcnRvZmYpOworCVNUQVRFX1NFVChSSUdIVF9GSUxMSU5HLAorCQlQUkVWLmJyX3N0YXJ0b2ZmICsgUFJFVi5icl9ibG9ja2NvdW50ID09IG5ld19lbmRvZmYpOworCS8qCisJICogQ2hlY2sgYW5kIHNldCBmbGFncyBpZiB0aGlzIHNlZ21lbnQgaGFzIGEgbGVmdCBuZWlnaGJvci4KKwkgKiBEb24ndCBzZXQgY29udGlndW91cyBpZiB0aGUgY29tYmluZWQgZXh0ZW50IHdvdWxkIGJlIHRvbyBsYXJnZS4KKwkgKi8KKwlpZiAoU1RBVEVfU0VUX1RFU1QoTEVGVF9WQUxJRCwgaWR4ID4gMCkpIHsKKwkJeGZzX2JtYnRfZ2V0X2FsbChlcCAtIDEsICZMRUZUKTsKKwkJU1RBVEVfU0VUKExFRlRfREVMQVksIElTTlVMTFNUQVJUQkxPQ0soTEVGVC5icl9zdGFydGJsb2NrKSk7CisJfQorCVNUQVRFX1NFVChMRUZUX0NPTlRJRywKKwkJU1RBVEVfVEVTVChMRUZUX1ZBTElEKSAmJiAhU1RBVEVfVEVTVChMRUZUX0RFTEFZKSAmJgorCQlMRUZULmJyX3N0YXJ0b2ZmICsgTEVGVC5icl9ibG9ja2NvdW50ID09IG5ldy0+YnJfc3RhcnRvZmYgJiYKKwkJTEVGVC5icl9zdGFydGJsb2NrICsgTEVGVC5icl9ibG9ja2NvdW50ID09IG5ldy0+YnJfc3RhcnRibG9jayAmJgorCQlMRUZULmJyX3N0YXRlID09IG5ld2V4dCAmJgorCQlMRUZULmJyX2Jsb2NrY291bnQgKyBuZXctPmJyX2Jsb2NrY291bnQgPD0gTUFYRVhUTEVOKTsKKwkvKgorCSAqIENoZWNrIGFuZCBzZXQgZmxhZ3MgaWYgdGhpcyBzZWdtZW50IGhhcyBhIHJpZ2h0IG5laWdoYm9yLgorCSAqIERvbid0IHNldCBjb250aWd1b3VzIGlmIHRoZSBjb21iaW5lZCBleHRlbnQgd291bGQgYmUgdG9vIGxhcmdlLgorCSAqIEFsc28gY2hlY2sgZm9yIGFsbC10aHJlZS1jb250aWd1b3VzIGJlaW5nIHRvbyBsYXJnZS4KKwkgKi8KKwlpZiAoU1RBVEVfU0VUX1RFU1QoUklHSFRfVkFMSUQsCisJCQlpZHggPAorCQkJaXAtPmlfZGYuaWZfYnl0ZXMgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpIC0gMSkpIHsKKwkJeGZzX2JtYnRfZ2V0X2FsbChlcCArIDEsICZSSUdIVCk7CisJCVNUQVRFX1NFVChSSUdIVF9ERUxBWSwgSVNOVUxMU1RBUlRCTE9DSyhSSUdIVC5icl9zdGFydGJsb2NrKSk7CisJfQorCVNUQVRFX1NFVChSSUdIVF9DT05USUcsCisJCVNUQVRFX1RFU1QoUklHSFRfVkFMSUQpICYmICFTVEFURV9URVNUKFJJR0hUX0RFTEFZKSAmJgorCQluZXdfZW5kb2ZmID09IFJJR0hULmJyX3N0YXJ0b2ZmICYmCisJCW5ldy0+YnJfc3RhcnRibG9jayArIG5ldy0+YnJfYmxvY2tjb3VudCA9PQorCQkgICAgUklHSFQuYnJfc3RhcnRibG9jayAmJgorCQluZXdleHQgPT0gUklHSFQuYnJfc3RhdGUgJiYKKwkJbmV3LT5icl9ibG9ja2NvdW50ICsgUklHSFQuYnJfYmxvY2tjb3VudCA8PSBNQVhFWFRMRU4gJiYKKwkJKChzdGF0ZSAmIE1BU0szKExFRlRfQ09OVElHLCBMRUZUX0ZJTExJTkcsIFJJR0hUX0ZJTExJTkcpKSAhPQorCQkgIE1BU0szKExFRlRfQ09OVElHLCBMRUZUX0ZJTExJTkcsIFJJR0hUX0ZJTExJTkcpIHx8CisJCSBMRUZULmJyX2Jsb2NrY291bnQgKyBuZXctPmJyX2Jsb2NrY291bnQgKyBSSUdIVC5icl9ibG9ja2NvdW50CisJCSAgICAgPD0gTUFYRVhUTEVOKSk7CisJLyoKKwkgKiBTd2l0Y2ggb3V0IGJhc2VkIG9uIHRoZSBGSUxMSU5HIGFuZCBDT05USUcgc3RhdGUgYml0cy4KKwkgKi8KKwlzd2l0Y2ggKFNXSVRDSF9TVEFURSkgeworCisJY2FzZSBNQVNLNChMRUZUX0ZJTExJTkcsIFJJR0hUX0ZJTExJTkcsIExFRlRfQ09OVElHLCBSSUdIVF9DT05USUcpOgorCQkvKgorCQkgKiBTZXR0aW5nIGFsbCBvZiBhIHByZXZpb3VzIG9sZGV4dCBleHRlbnQgdG8gbmV3ZXh0LgorCQkgKiBUaGUgbGVmdCBhbmQgcmlnaHQgbmVpZ2hib3JzIGFyZSBib3RoIGNvbnRpZ3VvdXMgd2l0aCBuZXcuCisJCSAqLworCQl4ZnNfYm1hcF90cmFjZV9wcmVfdXBkYXRlKGZuYW1lLCAiTEZ8UkZ8TEN8UkMiLCBpcCwgaWR4IC0gMSwKKwkJCVhGU19EQVRBX0ZPUkspOworCQl4ZnNfYm1idF9zZXRfYmxvY2tjb3VudChlcCAtIDEsCisJCQlMRUZULmJyX2Jsb2NrY291bnQgKyBQUkVWLmJyX2Jsb2NrY291bnQgKworCQkJUklHSFQuYnJfYmxvY2tjb3VudCk7CisJCXhmc19ibWFwX3RyYWNlX3Bvc3RfdXBkYXRlKGZuYW1lLCAiTEZ8UkZ8TEN8UkMiLCBpcCwgaWR4IC0gMSwKKwkJCVhGU19EQVRBX0ZPUkspOworCQl4ZnNfYm1hcF90cmFjZV9kZWxldGUoZm5hbWUsICJMRnxSRnxMQ3xSQyIsIGlwLCBpZHgsIDIsCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJeGZzX2JtYXBfZGVsZXRlX2V4bGlzdChpcCwgaWR4LCAyLCBYRlNfREFUQV9GT1JLKTsKKwkJaXAtPmlfZGYuaWZfbGFzdGV4ID0gaWR4IC0gMTsKKwkJaXAtPmlfZC5kaV9uZXh0ZW50cyAtPSAyOworCQlpZiAoY3VyID09IE5VTEwpCisJCQlydmFsID0gWEZTX0lMT0dfQ09SRSB8IFhGU19JTE9HX0RFWFQ7CisJCWVsc2UgeworCQkJcnZhbCA9IFhGU19JTE9HX0NPUkU7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfbG9va3VwX2VxKGN1ciwgUklHSFQuYnJfc3RhcnRvZmYsCisJCQkJCVJJR0hULmJyX3N0YXJ0YmxvY2ssCisJCQkJCVJJR0hULmJyX2Jsb2NrY291bnQsICZpKSkpCisJCQkJZ290byBkb25lOworCQkJQVNTRVJUKGkgPT0gMSk7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfZGVsZXRlKGN1ciwgJmkpKSkKKwkJCQlnb3RvIGRvbmU7CisJCQlBU1NFUlQoaSA9PSAxKTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9kZWNyZW1lbnQoY3VyLCAwLCAmaSkpKQorCQkJCWdvdG8gZG9uZTsKKwkJCUFTU0VSVChpID09IDEpOworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2RlbGV0ZShjdXIsICZpKSkpCisJCQkJZ290byBkb25lOworCQkJQVNTRVJUKGkgPT0gMSk7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfZGVjcmVtZW50KGN1ciwgMCwgJmkpKSkKKwkJCQlnb3RvIGRvbmU7CisJCQlBU1NFUlQoaSA9PSAxKTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF91cGRhdGUoY3VyLCBMRUZULmJyX3N0YXJ0b2ZmLAorCQkJCUxFRlQuYnJfc3RhcnRibG9jaywKKwkJCQlMRUZULmJyX2Jsb2NrY291bnQgKyBQUkVWLmJyX2Jsb2NrY291bnQgKworCQkJCVJJR0hULmJyX2Jsb2NrY291bnQsIExFRlQuYnJfc3RhdGUpKSkKKwkJCQlnb3RvIGRvbmU7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1BU0szKExFRlRfRklMTElORywgUklHSFRfRklMTElORywgTEVGVF9DT05USUcpOgorCQkvKgorCQkgKiBTZXR0aW5nIGFsbCBvZiBhIHByZXZpb3VzIG9sZGV4dCBleHRlbnQgdG8gbmV3ZXh0LgorCQkgKiBUaGUgbGVmdCBuZWlnaGJvciBpcyBjb250aWd1b3VzLCB0aGUgcmlnaHQgaXMgbm90LgorCQkgKi8KKwkJeGZzX2JtYXBfdHJhY2VfcHJlX3VwZGF0ZShmbmFtZSwgIkxGfFJGfExDIiwgaXAsIGlkeCAtIDEsCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJeGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoZXAgLSAxLAorCQkJTEVGVC5icl9ibG9ja2NvdW50ICsgUFJFVi5icl9ibG9ja2NvdW50KTsKKwkJeGZzX2JtYXBfdHJhY2VfcG9zdF91cGRhdGUoZm5hbWUsICJMRnxSRnxMQyIsIGlwLCBpZHggLSAxLAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCWlwLT5pX2RmLmlmX2xhc3RleCA9IGlkeCAtIDE7CisJCXhmc19ibWFwX3RyYWNlX2RlbGV0ZShmbmFtZSwgIkxGfFJGfExDIiwgaXAsIGlkeCwgMSwKKwkJCVhGU19EQVRBX0ZPUkspOworCQl4ZnNfYm1hcF9kZWxldGVfZXhsaXN0KGlwLCBpZHgsIDEsIFhGU19EQVRBX0ZPUkspOworCQlpcC0+aV9kLmRpX25leHRlbnRzLS07CisJCWlmIChjdXIgPT0gTlVMTCkKKwkJCXJ2YWwgPSBYRlNfSUxPR19DT1JFIHwgWEZTX0lMT0dfREVYVDsKKwkJZWxzZSB7CisJCQlydmFsID0gWEZTX0lMT0dfQ09SRTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoY3VyLCBQUkVWLmJyX3N0YXJ0b2ZmLAorCQkJCQlQUkVWLmJyX3N0YXJ0YmxvY2ssIFBSRVYuYnJfYmxvY2tjb3VudCwKKwkJCQkJJmkpKSkKKwkJCQlnb3RvIGRvbmU7CisJCQlBU1NFUlQoaSA9PSAxKTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9kZWxldGUoY3VyLCAmaSkpKQorCQkJCWdvdG8gZG9uZTsKKwkJCUFTU0VSVChpID09IDEpOworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2RlY3JlbWVudChjdXIsIDAsICZpKSkpCisJCQkJZ290byBkb25lOworCQkJQVNTRVJUKGkgPT0gMSk7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfdXBkYXRlKGN1ciwgTEVGVC5icl9zdGFydG9mZiwKKwkJCQlMRUZULmJyX3N0YXJ0YmxvY2ssCisJCQkJTEVGVC5icl9ibG9ja2NvdW50ICsgUFJFVi5icl9ibG9ja2NvdW50LAorCQkJCUxFRlQuYnJfc3RhdGUpKSkKKwkJCQlnb3RvIGRvbmU7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1BU0szKExFRlRfRklMTElORywgUklHSFRfRklMTElORywgUklHSFRfQ09OVElHKToKKwkJLyoKKwkJICogU2V0dGluZyBhbGwgb2YgYSBwcmV2aW91cyBvbGRleHQgZXh0ZW50IHRvIG5ld2V4dC4KKwkJICogVGhlIHJpZ2h0IG5laWdoYm9yIGlzIGNvbnRpZ3VvdXMsIHRoZSBsZWZ0IGlzIG5vdC4KKwkJICovCisJCXhmc19ibWFwX3RyYWNlX3ByZV91cGRhdGUoZm5hbWUsICJMRnxSRnxSQyIsIGlwLCBpZHgsCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJeGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoZXAsCisJCQlQUkVWLmJyX2Jsb2NrY291bnQgKyBSSUdIVC5icl9ibG9ja2NvdW50KTsKKwkJeGZzX2JtYnRfc2V0X3N0YXRlKGVwLCBuZXdleHQpOworCQl4ZnNfYm1hcF90cmFjZV9wb3N0X3VwZGF0ZShmbmFtZSwgIkxGfFJGfFJDIiwgaXAsIGlkeCwKKwkJCVhGU19EQVRBX0ZPUkspOworCQlpcC0+aV9kZi5pZl9sYXN0ZXggPSBpZHg7CisJCXhmc19ibWFwX3RyYWNlX2RlbGV0ZShmbmFtZSwgIkxGfFJGfFJDIiwgaXAsIGlkeCArIDEsIDEsCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJeGZzX2JtYXBfZGVsZXRlX2V4bGlzdChpcCwgaWR4ICsgMSwgMSwgWEZTX0RBVEFfRk9SSyk7CisJCWlwLT5pX2QuZGlfbmV4dGVudHMtLTsKKwkJaWYgKGN1ciA9PSBOVUxMKQorCQkJcnZhbCA9IFhGU19JTE9HX0NPUkUgfCBYRlNfSUxPR19ERVhUOworCQllbHNlIHsKKwkJCXJ2YWwgPSBYRlNfSUxPR19DT1JFOworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2xvb2t1cF9lcShjdXIsIFJJR0hULmJyX3N0YXJ0b2ZmLAorCQkJCQlSSUdIVC5icl9zdGFydGJsb2NrLAorCQkJCQlSSUdIVC5icl9ibG9ja2NvdW50LCAmaSkpKQorCQkJCWdvdG8gZG9uZTsKKwkJCUFTU0VSVChpID09IDEpOworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2RlbGV0ZShjdXIsICZpKSkpCisJCQkJZ290byBkb25lOworCQkJQVNTRVJUKGkgPT0gMSk7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfZGVjcmVtZW50KGN1ciwgMCwgJmkpKSkKKwkJCQlnb3RvIGRvbmU7CisJCQlBU1NFUlQoaSA9PSAxKTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF91cGRhdGUoY3VyLCBuZXctPmJyX3N0YXJ0b2ZmLAorCQkJCW5ldy0+YnJfc3RhcnRibG9jaywKKwkJCQluZXctPmJyX2Jsb2NrY291bnQgKyBSSUdIVC5icl9ibG9ja2NvdW50LAorCQkJCW5ld2V4dCkpKQorCQkJCWdvdG8gZG9uZTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUFTSzIoTEVGVF9GSUxMSU5HLCBSSUdIVF9GSUxMSU5HKToKKwkJLyoKKwkJICogU2V0dGluZyBhbGwgb2YgYSBwcmV2aW91cyBvbGRleHQgZXh0ZW50IHRvIG5ld2V4dC4KKwkJICogTmVpdGhlciB0aGUgbGVmdCBub3IgcmlnaHQgbmVpZ2hib3JzIGFyZSBjb250aWd1b3VzIHdpdGgKKwkJICogdGhlIG5ldyBvbmUuCisJCSAqLworCQl4ZnNfYm1hcF90cmFjZV9wcmVfdXBkYXRlKGZuYW1lLCAiTEZ8UkYiLCBpcCwgaWR4LAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCXhmc19ibWJ0X3NldF9zdGF0ZShlcCwgbmV3ZXh0KTsKKwkJeGZzX2JtYXBfdHJhY2VfcG9zdF91cGRhdGUoZm5hbWUsICJMRnxSRiIsIGlwLCBpZHgsCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJaXAtPmlfZGYuaWZfbGFzdGV4ID0gaWR4OworCQlpZiAoY3VyID09IE5VTEwpCisJCQlydmFsID0gWEZTX0lMT0dfREVYVDsKKwkJZWxzZSB7CisJCQlydmFsID0gMDsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoY3VyLCBuZXctPmJyX3N0YXJ0b2ZmLAorCQkJCQluZXctPmJyX3N0YXJ0YmxvY2ssIG5ldy0+YnJfYmxvY2tjb3VudCwKKwkJCQkJJmkpKSkKKwkJCQlnb3RvIGRvbmU7CisJCQlBU1NFUlQoaSA9PSAxKTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF91cGRhdGUoY3VyLCBuZXctPmJyX3N0YXJ0b2ZmLAorCQkJCW5ldy0+YnJfc3RhcnRibG9jaywgbmV3LT5icl9ibG9ja2NvdW50LAorCQkJCW5ld2V4dCkpKQorCQkJCWdvdG8gZG9uZTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUFTSzIoTEVGVF9GSUxMSU5HLCBMRUZUX0NPTlRJRyk6CisJCS8qCisJCSAqIFNldHRpbmcgdGhlIGZpcnN0IHBhcnQgb2YgYSBwcmV2aW91cyBvbGRleHQgZXh0ZW50IHRvIG5ld2V4dC4KKwkJICogVGhlIGxlZnQgbmVpZ2hib3IgaXMgY29udGlndW91cy4KKwkJICovCisJCXhmc19ibWFwX3RyYWNlX3ByZV91cGRhdGUoZm5hbWUsICJMRnxMQyIsIGlwLCBpZHggLSAxLAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCXhmc19ibWJ0X3NldF9ibG9ja2NvdW50KGVwIC0gMSwKKwkJCUxFRlQuYnJfYmxvY2tjb3VudCArIG5ldy0+YnJfYmxvY2tjb3VudCk7CisJCXhmc19ibWJ0X3NldF9zdGFydG9mZihlcCwKKwkJCVBSRVYuYnJfc3RhcnRvZmYgKyBuZXctPmJyX2Jsb2NrY291bnQpOworCQl4ZnNfYm1hcF90cmFjZV9wb3N0X3VwZGF0ZShmbmFtZSwgIkxGfExDIiwgaXAsIGlkeCAtIDEsCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJeGZzX2JtYXBfdHJhY2VfcHJlX3VwZGF0ZShmbmFtZSwgIkxGfExDIiwgaXAsIGlkeCwKKwkJCVhGU19EQVRBX0ZPUkspOworCQl4ZnNfYm1idF9zZXRfc3RhcnRibG9jayhlcCwKKwkJCW5ldy0+YnJfc3RhcnRibG9jayArIG5ldy0+YnJfYmxvY2tjb3VudCk7CisJCXhmc19ibWJ0X3NldF9ibG9ja2NvdW50KGVwLAorCQkJUFJFVi5icl9ibG9ja2NvdW50IC0gbmV3LT5icl9ibG9ja2NvdW50KTsKKwkJeGZzX2JtYXBfdHJhY2VfcG9zdF91cGRhdGUoZm5hbWUsICJMRnxMQyIsIGlwLCBpZHgsCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJaXAtPmlfZGYuaWZfbGFzdGV4ID0gaWR4IC0gMTsKKwkJaWYgKGN1ciA9PSBOVUxMKQorCQkJcnZhbCA9IFhGU19JTE9HX0RFWFQ7CisJCWVsc2UgeworCQkJcnZhbCA9IDA7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfbG9va3VwX2VxKGN1ciwgUFJFVi5icl9zdGFydG9mZiwKKwkJCQkJUFJFVi5icl9zdGFydGJsb2NrLCBQUkVWLmJyX2Jsb2NrY291bnQsCisJCQkJCSZpKSkpCisJCQkJZ290byBkb25lOworCQkJQVNTRVJUKGkgPT0gMSk7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfdXBkYXRlKGN1ciwKKwkJCQlQUkVWLmJyX3N0YXJ0b2ZmICsgbmV3LT5icl9ibG9ja2NvdW50LAorCQkJCVBSRVYuYnJfc3RhcnRibG9jayArIG5ldy0+YnJfYmxvY2tjb3VudCwKKwkJCQlQUkVWLmJyX2Jsb2NrY291bnQgLSBuZXctPmJyX2Jsb2NrY291bnQsCisJCQkJb2xkZXh0KSkpCisJCQkJZ290byBkb25lOworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2RlY3JlbWVudChjdXIsIDAsICZpKSkpCisJCQkJZ290byBkb25lOworCQkJaWYgKHhmc19ibWJ0X3VwZGF0ZShjdXIsIExFRlQuYnJfc3RhcnRvZmYsCisJCQkJTEVGVC5icl9zdGFydGJsb2NrLAorCQkJCUxFRlQuYnJfYmxvY2tjb3VudCArIG5ldy0+YnJfYmxvY2tjb3VudCwKKwkJCQlMRUZULmJyX3N0YXRlKSkKKwkJCQlnb3RvIGRvbmU7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1BU0soTEVGVF9GSUxMSU5HKToKKwkJLyoKKwkJICogU2V0dGluZyB0aGUgZmlyc3QgcGFydCBvZiBhIHByZXZpb3VzIG9sZGV4dCBleHRlbnQgdG8gbmV3ZXh0LgorCQkgKiBUaGUgbGVmdCBuZWlnaGJvciBpcyBub3QgY29udGlndW91cy4KKwkJICovCisJCXhmc19ibWFwX3RyYWNlX3ByZV91cGRhdGUoZm5hbWUsICJMRiIsIGlwLCBpZHgsIFhGU19EQVRBX0ZPUkspOworCQlBU1NFUlQoZXAgJiYgeGZzX2JtYnRfZ2V0X3N0YXRlKGVwKSA9PSBvbGRleHQpOworCQl4ZnNfYm1idF9zZXRfc3RhcnRvZmYoZXAsIG5ld19lbmRvZmYpOworCQl4ZnNfYm1idF9zZXRfYmxvY2tjb3VudChlcCwKKwkJCVBSRVYuYnJfYmxvY2tjb3VudCAtIG5ldy0+YnJfYmxvY2tjb3VudCk7CisJCXhmc19ibWJ0X3NldF9zdGFydGJsb2NrKGVwLAorCQkJbmV3LT5icl9zdGFydGJsb2NrICsgbmV3LT5icl9ibG9ja2NvdW50KTsKKwkJeGZzX2JtYXBfdHJhY2VfcG9zdF91cGRhdGUoZm5hbWUsICJMRiIsIGlwLCBpZHgsIFhGU19EQVRBX0ZPUkspOworCQl4ZnNfYm1hcF90cmFjZV9pbnNlcnQoZm5hbWUsICJMRiIsIGlwLCBpZHgsIDEsIG5ldywgTlVMTCwKKwkJCVhGU19EQVRBX0ZPUkspOworCQl4ZnNfYm1hcF9pbnNlcnRfZXhsaXN0KGlwLCBpZHgsIDEsIG5ldywgWEZTX0RBVEFfRk9SSyk7CisJCWlwLT5pX2RmLmlmX2xhc3RleCA9IGlkeDsKKwkJaXAtPmlfZC5kaV9uZXh0ZW50cysrOworCQlpZiAoY3VyID09IE5VTEwpCisJCQlydmFsID0gWEZTX0lMT0dfQ09SRSB8IFhGU19JTE9HX0RFWFQ7CisJCWVsc2UgeworCQkJcnZhbCA9IFhGU19JTE9HX0NPUkU7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfbG9va3VwX2VxKGN1ciwgUFJFVi5icl9zdGFydG9mZiwKKwkJCQkJUFJFVi5icl9zdGFydGJsb2NrLCBQUkVWLmJyX2Jsb2NrY291bnQsCisJCQkJCSZpKSkpCisJCQkJZ290byBkb25lOworCQkJQVNTRVJUKGkgPT0gMSk7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfdXBkYXRlKGN1ciwKKwkJCQlQUkVWLmJyX3N0YXJ0b2ZmICsgbmV3LT5icl9ibG9ja2NvdW50LAorCQkJCVBSRVYuYnJfc3RhcnRibG9jayArIG5ldy0+YnJfYmxvY2tjb3VudCwKKwkJCQlQUkVWLmJyX2Jsb2NrY291bnQgLSBuZXctPmJyX2Jsb2NrY291bnQsCisJCQkJb2xkZXh0KSkpCisJCQkJZ290byBkb25lOworCQkJY3VyLT5iY19yZWMuYiA9ICpuZXc7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfaW5zZXJ0KGN1ciwgJmkpKSkKKwkJCQlnb3RvIGRvbmU7CisJCQlBU1NFUlQoaSA9PSAxKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUFTSzIoUklHSFRfRklMTElORywgUklHSFRfQ09OVElHKToKKwkJLyoKKwkJICogU2V0dGluZyB0aGUgbGFzdCBwYXJ0IG9mIGEgcHJldmlvdXMgb2xkZXh0IGV4dGVudCB0byBuZXdleHQuCisJCSAqIFRoZSByaWdodCBuZWlnaGJvciBpcyBjb250aWd1b3VzIHdpdGggdGhlIG5ldyBhbGxvY2F0aW9uLgorCQkgKi8KKwkJeGZzX2JtYXBfdHJhY2VfcHJlX3VwZGF0ZShmbmFtZSwgIlJGfFJDIiwgaXAsIGlkeCwKKwkJCVhGU19EQVRBX0ZPUkspOworCQl4ZnNfYm1hcF90cmFjZV9wcmVfdXBkYXRlKGZuYW1lLCAiUkZ8UkMiLCBpcCwgaWR4ICsgMSwKKwkJCVhGU19EQVRBX0ZPUkspOworCQl4ZnNfYm1idF9zZXRfYmxvY2tjb3VudChlcCwKKwkJCVBSRVYuYnJfYmxvY2tjb3VudCAtIG5ldy0+YnJfYmxvY2tjb3VudCk7CisJCXhmc19ibWFwX3RyYWNlX3Bvc3RfdXBkYXRlKGZuYW1lLCAiUkZ8UkMiLCBpcCwgaWR4LAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCXhmc19ibWJ0X3NldF9hbGxmKGVwICsgMSwgbmV3LT5icl9zdGFydG9mZiwgbmV3LT5icl9zdGFydGJsb2NrLAorCQkJbmV3LT5icl9ibG9ja2NvdW50ICsgUklHSFQuYnJfYmxvY2tjb3VudCwgbmV3ZXh0KTsKKwkJeGZzX2JtYXBfdHJhY2VfcG9zdF91cGRhdGUoZm5hbWUsICJSRnxSQyIsIGlwLCBpZHggKyAxLAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCWlwLT5pX2RmLmlmX2xhc3RleCA9IGlkeCArIDE7CisJCWlmIChjdXIgPT0gTlVMTCkKKwkJCXJ2YWwgPSBYRlNfSUxPR19ERVhUOworCQllbHNlIHsKKwkJCXJ2YWwgPSAwOworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2xvb2t1cF9lcShjdXIsIFBSRVYuYnJfc3RhcnRvZmYsCisJCQkJCVBSRVYuYnJfc3RhcnRibG9jaywKKwkJCQkJUFJFVi5icl9ibG9ja2NvdW50LCAmaSkpKQorCQkJCWdvdG8gZG9uZTsKKwkJCUFTU0VSVChpID09IDEpOworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X3VwZGF0ZShjdXIsIFBSRVYuYnJfc3RhcnRvZmYsCisJCQkJUFJFVi5icl9zdGFydGJsb2NrLAorCQkJCVBSRVYuYnJfYmxvY2tjb3VudCAtIG5ldy0+YnJfYmxvY2tjb3VudCwKKwkJCQlvbGRleHQpKSkKKwkJCQlnb3RvIGRvbmU7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfaW5jcmVtZW50KGN1ciwgMCwgJmkpKSkKKwkJCQlnb3RvIGRvbmU7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfdXBkYXRlKGN1ciwgbmV3LT5icl9zdGFydG9mZiwKKwkJCQluZXctPmJyX3N0YXJ0YmxvY2ssCisJCQkJbmV3LT5icl9ibG9ja2NvdW50ICsgUklHSFQuYnJfYmxvY2tjb3VudCwKKwkJCQluZXdleHQpKSkKKwkJCQlnb3RvIGRvbmU7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1BU0soUklHSFRfRklMTElORyk6CisJCS8qCisJCSAqIFNldHRpbmcgdGhlIGxhc3QgcGFydCBvZiBhIHByZXZpb3VzIG9sZGV4dCBleHRlbnQgdG8gbmV3ZXh0LgorCQkgKiBUaGUgcmlnaHQgbmVpZ2hib3IgaXMgbm90IGNvbnRpZ3VvdXMuCisJCSAqLworCQl4ZnNfYm1hcF90cmFjZV9wcmVfdXBkYXRlKGZuYW1lLCAiUkYiLCBpcCwgaWR4LCBYRlNfREFUQV9GT1JLKTsKKwkJeGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoZXAsCisJCQlQUkVWLmJyX2Jsb2NrY291bnQgLSBuZXctPmJyX2Jsb2NrY291bnQpOworCQl4ZnNfYm1hcF90cmFjZV9wb3N0X3VwZGF0ZShmbmFtZSwgIlJGIiwgaXAsIGlkeCwgWEZTX0RBVEFfRk9SSyk7CisJCXhmc19ibWFwX3RyYWNlX2luc2VydChmbmFtZSwgIlJGIiwgaXAsIGlkeCArIDEsIDEsCisJCQluZXcsIE5VTEwsIFhGU19EQVRBX0ZPUkspOworCQl4ZnNfYm1hcF9pbnNlcnRfZXhsaXN0KGlwLCBpZHggKyAxLCAxLCBuZXcsIFhGU19EQVRBX0ZPUkspOworCQlpcC0+aV9kZi5pZl9sYXN0ZXggPSBpZHggKyAxOworCQlpcC0+aV9kLmRpX25leHRlbnRzKys7CisJCWlmIChjdXIgPT0gTlVMTCkKKwkJCXJ2YWwgPSBYRlNfSUxPR19DT1JFIHwgWEZTX0lMT0dfREVYVDsKKwkJZWxzZSB7CisJCQlydmFsID0gWEZTX0lMT0dfQ09SRTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoY3VyLCBQUkVWLmJyX3N0YXJ0b2ZmLAorCQkJCQlQUkVWLmJyX3N0YXJ0YmxvY2ssIFBSRVYuYnJfYmxvY2tjb3VudCwKKwkJCQkJJmkpKSkKKwkJCQlnb3RvIGRvbmU7CisJCQlBU1NFUlQoaSA9PSAxKTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF91cGRhdGUoY3VyLCBQUkVWLmJyX3N0YXJ0b2ZmLAorCQkJCVBSRVYuYnJfc3RhcnRibG9jaywKKwkJCQlQUkVWLmJyX2Jsb2NrY291bnQgLSBuZXctPmJyX2Jsb2NrY291bnQsCisJCQkJb2xkZXh0KSkpCisJCQkJZ290byBkb25lOworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2xvb2t1cF9lcShjdXIsIG5ldy0+YnJfc3RhcnRvZmYsCisJCQkJCW5ldy0+YnJfc3RhcnRibG9jaywgbmV3LT5icl9ibG9ja2NvdW50LAorCQkJCQkmaSkpKQorCQkJCWdvdG8gZG9uZTsKKwkJCUFTU0VSVChpID09IDApOworCQkJY3VyLT5iY19yZWMuYi5icl9zdGF0ZSA9IFhGU19FWFRfTk9STTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9pbnNlcnQoY3VyLCAmaSkpKQorCQkJCWdvdG8gZG9uZTsKKwkJCUFTU0VSVChpID09IDEpOworCQl9CisJCWJyZWFrOworCisJY2FzZSAwOgorCQkvKgorCQkgKiBTZXR0aW5nIHRoZSBtaWRkbGUgcGFydCBvZiBhIHByZXZpb3VzIG9sZGV4dCBleHRlbnQgdG8KKwkJICogbmV3ZXh0LiAgQ29udGlndWl0eSBpcyBpbXBvc3NpYmxlIGhlcmUuCisJCSAqIE9uZSBleHRlbnQgYmVjb21lcyB0aHJlZSBleHRlbnRzLgorCQkgKi8KKwkJeGZzX2JtYXBfdHJhY2VfcHJlX3VwZGF0ZShmbmFtZSwgIjAiLCBpcCwgaWR4LCBYRlNfREFUQV9GT1JLKTsKKwkJeGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoZXAsCisJCQluZXctPmJyX3N0YXJ0b2ZmIC0gUFJFVi5icl9zdGFydG9mZik7CisJCXhmc19ibWFwX3RyYWNlX3Bvc3RfdXBkYXRlKGZuYW1lLCAiMCIsIGlwLCBpZHgsIFhGU19EQVRBX0ZPUkspOworCQlyWzBdID0gKm5ldzsKKwkJclsxXS5icl9zdGFydG9mZiA9IG5ld19lbmRvZmY7CisJCXJbMV0uYnJfYmxvY2tjb3VudCA9CisJCQlQUkVWLmJyX3N0YXJ0b2ZmICsgUFJFVi5icl9ibG9ja2NvdW50IC0gbmV3X2VuZG9mZjsKKwkJclsxXS5icl9zdGFydGJsb2NrID0gbmV3LT5icl9zdGFydGJsb2NrICsgbmV3LT5icl9ibG9ja2NvdW50OworCQlyWzFdLmJyX3N0YXRlID0gb2xkZXh0OworCQl4ZnNfYm1hcF90cmFjZV9pbnNlcnQoZm5hbWUsICIwIiwgaXAsIGlkeCArIDEsIDIsICZyWzBdLCAmclsxXSwKKwkJCVhGU19EQVRBX0ZPUkspOworCQl4ZnNfYm1hcF9pbnNlcnRfZXhsaXN0KGlwLCBpZHggKyAxLCAyLCAmclswXSwgWEZTX0RBVEFfRk9SSyk7CisJCWlwLT5pX2RmLmlmX2xhc3RleCA9IGlkeCArIDE7CisJCWlwLT5pX2QuZGlfbmV4dGVudHMgKz0gMjsKKwkJaWYgKGN1ciA9PSBOVUxMKQorCQkJcnZhbCA9IFhGU19JTE9HX0NPUkUgfCBYRlNfSUxPR19ERVhUOworCQllbHNlIHsKKwkJCXJ2YWwgPSBYRlNfSUxPR19DT1JFOworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2xvb2t1cF9lcShjdXIsIFBSRVYuYnJfc3RhcnRvZmYsCisJCQkJCVBSRVYuYnJfc3RhcnRibG9jaywgUFJFVi5icl9ibG9ja2NvdW50LAorCQkJCQkmaSkpKQorCQkJCWdvdG8gZG9uZTsKKwkJCUFTU0VSVChpID09IDEpOworCQkJLyogbmV3IHJpZ2h0IGV4dGVudCAtIG9sZGV4dCAqLworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X3VwZGF0ZShjdXIsIHJbMV0uYnJfc3RhcnRvZmYsCisJCQkJclsxXS5icl9zdGFydGJsb2NrLCByWzFdLmJyX2Jsb2NrY291bnQsCisJCQkJclsxXS5icl9zdGF0ZSkpKQorCQkJCWdvdG8gZG9uZTsKKwkJCS8qIG5ldyBsZWZ0IGV4dGVudCAtIG9sZGV4dCAqLworCQkJUFJFVi5icl9ibG9ja2NvdW50ID0KKwkJCQluZXctPmJyX3N0YXJ0b2ZmIC0gUFJFVi5icl9zdGFydG9mZjsKKwkJCWN1ci0+YmNfcmVjLmIgPSBQUkVWOworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2luc2VydChjdXIsICZpKSkpCisJCQkJZ290byBkb25lOworCQkJQVNTRVJUKGkgPT0gMSk7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfaW5jcmVtZW50KGN1ciwgMCwgJmkpKSkKKwkJCQlnb3RvIGRvbmU7CisJCQlBU1NFUlQoaSA9PSAxKTsKKwkJCS8qIG5ldyBtaWRkbGUgZXh0ZW50IC0gbmV3ZXh0ICovCisJCQljdXItPmJjX3JlYy5iID0gKm5ldzsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9pbnNlcnQoY3VyLCAmaSkpKQorCQkJCWdvdG8gZG9uZTsKKwkJCUFTU0VSVChpID09IDEpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBNQVNLMyhMRUZUX0ZJTExJTkcsIExFRlRfQ09OVElHLCBSSUdIVF9DT05USUcpOgorCWNhc2UgTUFTSzMoUklHSFRfRklMTElORywgTEVGVF9DT05USUcsIFJJR0hUX0NPTlRJRyk6CisJY2FzZSBNQVNLMihMRUZUX0ZJTExJTkcsIFJJR0hUX0NPTlRJRyk6CisJY2FzZSBNQVNLMihSSUdIVF9GSUxMSU5HLCBMRUZUX0NPTlRJRyk6CisJY2FzZSBNQVNLMihMRUZUX0NPTlRJRywgUklHSFRfQ09OVElHKToKKwljYXNlIE1BU0soTEVGVF9DT05USUcpOgorCWNhc2UgTUFTSyhSSUdIVF9DT05USUcpOgorCQkvKgorCQkgKiBUaGVzZSBjYXNlcyBhcmUgYWxsIGltcG9zc2libGUuCisJCSAqLworCQlBU1NFUlQoMCk7CisJfQorCSpjdXJwID0gY3VyOworZG9uZToKKwkqbG9nZmxhZ3NwID0gcnZhbDsKKwlyZXR1cm4gZXJyb3I7CisjdW5kZWYJTEVGVAorI3VuZGVmCVJJR0hUCisjdW5kZWYJUFJFVgorI3VuZGVmCU1BU0sKKyN1bmRlZglNQVNLMgorI3VuZGVmCU1BU0szCisjdW5kZWYJTUFTSzQKKyN1bmRlZglTVEFURV9TRVQKKyN1bmRlZglTVEFURV9URVNUCisjdW5kZWYJU1RBVEVfU0VUX1RFU1QKKyN1bmRlZglTV0lUQ0hfU1RBVEUKK30KKworLyoKKyAqIENhbGxlZCBieSB4ZnNfYm1hcF9hZGRfZXh0ZW50IHRvIGhhbmRsZSBjYXNlcyBjb252ZXJ0aW5nIGEgaG9sZQorICogdG8gYSBkZWxheWVkIGFsbG9jYXRpb24uCisgKi8KKy8qQVJHU1VTRUQqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX2JtYXBfYWRkX2V4dGVudF9ob2xlX2RlbGF5KAorCXhmc19pbm9kZV90CQkqaXAsCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCisJeGZzX2V4dG51bV90CQlpZHgsCS8qIGV4dGVudCBudW1iZXIgdG8gdXBkYXRlL2luc2VydCAqLworCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogaWYgbnVsbCwgbm90IGEgYnRyZWUgKi8KKwl4ZnNfYm1idF9pcmVjX3QJCSpuZXcsCS8qIG5ldyBkYXRhIHRvIHB1dCBpbiBleHRlbnQgbGlzdCAqLworCWludAkJCSpsb2dmbGFnc3AsIC8qIGlub2RlIGxvZ2dpbmcgZmxhZ3MgKi8KKwlpbnQJCQlyc3ZkKQkJLyogT0sgdG8gYWxsb2NhdGUgcmVzZXJ2ZWQgYmxvY2tzICovCit7CisJeGZzX2JtYnRfcmVjX3QJCSpiYXNlOwkvKiBiYXNlIG9mIGV4dGVudCBlbnRyeSBsaXN0ICovCisJeGZzX2JtYnRfcmVjX3QJCSplcDsJLyogZXh0ZW50IGxpc3QgZW50cnkgZm9yIGlkeCAqLworI2lmZGVmIFhGU19CTUFQX1RSQUNFCisJc3RhdGljIGNoYXIJCWZuYW1lW10gPSAieGZzX2JtYXBfYWRkX2V4dGVudF9ob2xlX2RlbGF5IjsKKyNlbmRpZgorCXhmc19ibWJ0X2lyZWNfdAkJbGVmdDsJLyogbGVmdCBuZWlnaGJvciBleHRlbnQgZW50cnkgKi8KKwl4ZnNfZmlsYmxrc190CQluZXdsZW49MDsJLyogbmV3IGluZGlyZWN0IHNpemUgKi8KKwl4ZnNfZmlsYmxrc190CQlvbGRsZW49MDsJLyogb2xkIGluZGlyZWN0IHNpemUgKi8KKwl4ZnNfYm1idF9pcmVjX3QJCXJpZ2h0OwkvKiByaWdodCBuZWlnaGJvciBleHRlbnQgZW50cnkgKi8KKwlpbnQJCQlzdGF0ZTsgIC8qIHN0YXRlIGJpdHMsIGFjY2Vzc2VkIHRocnUgbWFjcm9zICovCisJeGZzX2ZpbGJsa3NfdAkJdGVtcDsJLyogdGVtcCBmb3IgaW5kaXJlY3QgY2FsY3VsYXRpb25zICovCisJZW51bSB7CQkJCS8qIGJpdCBudW1iZXIgZGVmaW5pdGlvbnMgZm9yIHN0YXRlICovCisJCUxFRlRfQ09OVElHLAlSSUdIVF9DT05USUcsCisJCUxFRlRfREVMQVksCVJJR0hUX0RFTEFZLAorCQlMRUZUX1ZBTElELAlSSUdIVF9WQUxJRAorCX07CisKKyNkZWZpbmUJTUFTSyhiKQkJCSgxIDw8IChiKSkKKyNkZWZpbmUJTUFTSzIoYSxiKQkJKE1BU0soYSkgfCBNQVNLKGIpKQorI2RlZmluZQlTVEFURV9TRVQoYix2KQkJKCh2KSA/IChzdGF0ZSB8PSBNQVNLKGIpKSA6IChzdGF0ZSAmPSB+TUFTSyhiKSkpCisjZGVmaW5lCVNUQVRFX1RFU1QoYikJCShzdGF0ZSAmIE1BU0soYikpCisjZGVmaW5lCVNUQVRFX1NFVF9URVNUKGIsdikJKCh2KSA/ICgoc3RhdGUgfD0gTUFTSyhiKSksIDEpIDogXAorCQkJCSAgICAgICAoKHN0YXRlICY9IH5NQVNLKGIpKSwgMCkpCisjZGVmaW5lCVNXSVRDSF9TVEFURQkJKHN0YXRlICYgTUFTSzIoTEVGVF9DT05USUcsIFJJR0hUX0NPTlRJRykpCisKKwliYXNlID0gaXAtPmlfZGYuaWZfdTEuaWZfZXh0ZW50czsKKwllcCA9ICZiYXNlW2lkeF07CisJc3RhdGUgPSAwOworCUFTU0VSVChJU05VTExTVEFSVEJMT0NLKG5ldy0+YnJfc3RhcnRibG9jaykpOworCS8qCisJICogQ2hlY2sgYW5kIHNldCBmbGFncyBpZiB0aGlzIHNlZ21lbnQgaGFzIGEgbGVmdCBuZWlnaGJvcgorCSAqLworCWlmIChTVEFURV9TRVRfVEVTVChMRUZUX1ZBTElELCBpZHggPiAwKSkgeworCQl4ZnNfYm1idF9nZXRfYWxsKGVwIC0gMSwgJmxlZnQpOworCQlTVEFURV9TRVQoTEVGVF9ERUxBWSwgSVNOVUxMU1RBUlRCTE9DSyhsZWZ0LmJyX3N0YXJ0YmxvY2spKTsKKwl9CisJLyoKKwkgKiBDaGVjayBhbmQgc2V0IGZsYWdzIGlmIHRoZSBjdXJyZW50IChyaWdodCkgc2VnbWVudCBleGlzdHMuCisJICogSWYgaXQgZG9lc24ndCBleGlzdCwgd2UncmUgY29udmVydGluZyB0aGUgaG9sZSBhdCBlbmQtb2YtZmlsZS4KKwkgKi8KKwlpZiAoU1RBVEVfU0VUX1RFU1QoUklHSFRfVkFMSUQsCisJCQkgICBpZHggPAorCQkJICAgaXAtPmlfZGYuaWZfYnl0ZXMgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpKSkgeworCQl4ZnNfYm1idF9nZXRfYWxsKGVwLCAmcmlnaHQpOworCQlTVEFURV9TRVQoUklHSFRfREVMQVksIElTTlVMTFNUQVJUQkxPQ0socmlnaHQuYnJfc3RhcnRibG9jaykpOworCX0KKwkvKgorCSAqIFNldCBjb250aWd1aXR5IGZsYWdzIG9uIHRoZSBsZWZ0IGFuZCByaWdodCBuZWlnaGJvcnMuCisJICogRG9uJ3QgbGV0IGV4dGVudHMgZ2V0IHRvbyBsYXJnZSwgZXZlbiBpZiB0aGUgcGllY2VzIGFyZSBjb250aWd1b3VzLgorCSAqLworCVNUQVRFX1NFVChMRUZUX0NPTlRJRywKKwkJU1RBVEVfVEVTVChMRUZUX1ZBTElEKSAmJiBTVEFURV9URVNUKExFRlRfREVMQVkpICYmCisJCWxlZnQuYnJfc3RhcnRvZmYgKyBsZWZ0LmJyX2Jsb2NrY291bnQgPT0gbmV3LT5icl9zdGFydG9mZiAmJgorCQlsZWZ0LmJyX2Jsb2NrY291bnQgKyBuZXctPmJyX2Jsb2NrY291bnQgPD0gTUFYRVhUTEVOKTsKKwlTVEFURV9TRVQoUklHSFRfQ09OVElHLAorCQlTVEFURV9URVNUKFJJR0hUX1ZBTElEKSAmJiBTVEFURV9URVNUKFJJR0hUX0RFTEFZKSAmJgorCQluZXctPmJyX3N0YXJ0b2ZmICsgbmV3LT5icl9ibG9ja2NvdW50ID09IHJpZ2h0LmJyX3N0YXJ0b2ZmICYmCisJCW5ldy0+YnJfYmxvY2tjb3VudCArIHJpZ2h0LmJyX2Jsb2NrY291bnQgPD0gTUFYRVhUTEVOICYmCisJCSghU1RBVEVfVEVTVChMRUZUX0NPTlRJRykgfHwKKwkJIChsZWZ0LmJyX2Jsb2NrY291bnQgKyBuZXctPmJyX2Jsb2NrY291bnQgKworCQkgICAgIHJpZ2h0LmJyX2Jsb2NrY291bnQgPD0gTUFYRVhUTEVOKSkpOworCS8qCisJICogU3dpdGNoIG91dCBiYXNlZCBvbiB0aGUgY29udGlndWl0eSBmbGFncy4KKwkgKi8KKwlzd2l0Y2ggKFNXSVRDSF9TVEFURSkgeworCisJY2FzZSBNQVNLMihMRUZUX0NPTlRJRywgUklHSFRfQ09OVElHKToKKwkJLyoKKwkJICogTmV3IGFsbG9jYXRpb24gaXMgY29udGlndW91cyB3aXRoIGRlbGF5ZWQgYWxsb2NhdGlvbnMKKwkJICogb24gdGhlIGxlZnQgYW5kIG9uIHRoZSByaWdodC4KKwkJICogTWVyZ2UgYWxsIHRocmVlIGludG8gYSBzaW5nbGUgZXh0ZW50IGxpc3QgZW50cnkuCisJCSAqLworCQl0ZW1wID0gbGVmdC5icl9ibG9ja2NvdW50ICsgbmV3LT5icl9ibG9ja2NvdW50ICsKKwkJCXJpZ2h0LmJyX2Jsb2NrY291bnQ7CisJCXhmc19ibWFwX3RyYWNlX3ByZV91cGRhdGUoZm5hbWUsICJMQ3xSQyIsIGlwLCBpZHggLSAxLAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCXhmc19ibWJ0X3NldF9ibG9ja2NvdW50KGVwIC0gMSwgdGVtcCk7CisJCW9sZGxlbiA9IFNUQVJUQkxPQ0tWQUwobGVmdC5icl9zdGFydGJsb2NrKSArCisJCQlTVEFSVEJMT0NLVkFMKG5ldy0+YnJfc3RhcnRibG9jaykgKworCQkJU1RBUlRCTE9DS1ZBTChyaWdodC5icl9zdGFydGJsb2NrKTsKKwkJbmV3bGVuID0geGZzX2JtYXBfd29yc3RfaW5kbGVuKGlwLCB0ZW1wKTsKKwkJeGZzX2JtYnRfc2V0X3N0YXJ0YmxvY2soZXAgLSAxLCBOVUxMU1RBUlRCTE9DSygoaW50KW5ld2xlbikpOworCQl4ZnNfYm1hcF90cmFjZV9wb3N0X3VwZGF0ZShmbmFtZSwgIkxDfFJDIiwgaXAsIGlkeCAtIDEsCisJCQlYRlNfREFUQV9GT1JLKTsKKwkJeGZzX2JtYXBfdHJhY2VfZGVsZXRlKGZuYW1lLCAiTEN8UkMiLCBpcCwgaWR4LCAxLAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCXhmc19ibWFwX2RlbGV0ZV9leGxpc3QoaXAsIGlkeCwgMSwgWEZTX0RBVEFfRk9SSyk7CisJCWlwLT5pX2RmLmlmX2xhc3RleCA9IGlkeCAtIDE7CisJCWJyZWFrOworCisJY2FzZSBNQVNLKExFRlRfQ09OVElHKToKKwkJLyoKKwkJICogTmV3IGFsbG9jYXRpb24gaXMgY29udGlndW91cyB3aXRoIGEgZGVsYXllZCBhbGxvY2F0aW9uCisJCSAqIG9uIHRoZSBsZWZ0LgorCQkgKiBNZXJnZSB0aGUgbmV3IGFsbG9jYXRpb24gd2l0aCB0aGUgbGVmdCBuZWlnaGJvci4KKwkJICovCisJCXRlbXAgPSBsZWZ0LmJyX2Jsb2NrY291bnQgKyBuZXctPmJyX2Jsb2NrY291bnQ7CisJCXhmc19ibWFwX3RyYWNlX3ByZV91cGRhdGUoZm5hbWUsICJMQyIsIGlwLCBpZHggLSAxLAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCXhmc19ibWJ0X3NldF9ibG9ja2NvdW50KGVwIC0gMSwgdGVtcCk7CisJCW9sZGxlbiA9IFNUQVJUQkxPQ0tWQUwobGVmdC5icl9zdGFydGJsb2NrKSArCisJCQlTVEFSVEJMT0NLVkFMKG5ldy0+YnJfc3RhcnRibG9jayk7CisJCW5ld2xlbiA9IHhmc19ibWFwX3dvcnN0X2luZGxlbihpcCwgdGVtcCk7CisJCXhmc19ibWJ0X3NldF9zdGFydGJsb2NrKGVwIC0gMSwgTlVMTFNUQVJUQkxPQ0soKGludCluZXdsZW4pKTsKKwkJeGZzX2JtYXBfdHJhY2VfcG9zdF91cGRhdGUoZm5hbWUsICJMQyIsIGlwLCBpZHggLSAxLAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCWlwLT5pX2RmLmlmX2xhc3RleCA9IGlkeCAtIDE7CisJCWJyZWFrOworCisJY2FzZSBNQVNLKFJJR0hUX0NPTlRJRyk6CisJCS8qCisJCSAqIE5ldyBhbGxvY2F0aW9uIGlzIGNvbnRpZ3VvdXMgd2l0aCBhIGRlbGF5ZWQgYWxsb2NhdGlvbgorCQkgKiBvbiB0aGUgcmlnaHQuCisJCSAqIE1lcmdlIHRoZSBuZXcgYWxsb2NhdGlvbiB3aXRoIHRoZSByaWdodCBuZWlnaGJvci4KKwkJICovCisJCXhmc19ibWFwX3RyYWNlX3ByZV91cGRhdGUoZm5hbWUsICJSQyIsIGlwLCBpZHgsIFhGU19EQVRBX0ZPUkspOworCQl0ZW1wID0gbmV3LT5icl9ibG9ja2NvdW50ICsgcmlnaHQuYnJfYmxvY2tjb3VudDsKKwkJb2xkbGVuID0gU1RBUlRCTE9DS1ZBTChuZXctPmJyX3N0YXJ0YmxvY2spICsKKwkJCVNUQVJUQkxPQ0tWQUwocmlnaHQuYnJfc3RhcnRibG9jayk7CisJCW5ld2xlbiA9IHhmc19ibWFwX3dvcnN0X2luZGxlbihpcCwgdGVtcCk7CisJCXhmc19ibWJ0X3NldF9hbGxmKGVwLCBuZXctPmJyX3N0YXJ0b2ZmLAorCQkJTlVMTFNUQVJUQkxPQ0soKGludCluZXdsZW4pLCB0ZW1wLCByaWdodC5icl9zdGF0ZSk7CisJCXhmc19ibWFwX3RyYWNlX3Bvc3RfdXBkYXRlKGZuYW1lLCAiUkMiLCBpcCwgaWR4LCBYRlNfREFUQV9GT1JLKTsKKwkJaXAtPmlfZGYuaWZfbGFzdGV4ID0gaWR4OworCQlicmVhazsKKworCWNhc2UgMDoKKwkJLyoKKwkJICogTmV3IGFsbG9jYXRpb24gaXMgbm90IGNvbnRpZ3VvdXMgd2l0aCBhbm90aGVyCisJCSAqIGRlbGF5ZWQgYWxsb2NhdGlvbi4KKwkJICogSW5zZXJ0IGEgbmV3IGVudHJ5LgorCQkgKi8KKwkJb2xkbGVuID0gbmV3bGVuID0gMDsKKwkJeGZzX2JtYXBfdHJhY2VfaW5zZXJ0KGZuYW1lLCAiMCIsIGlwLCBpZHgsIDEsIG5ldywgTlVMTCwKKwkJCVhGU19EQVRBX0ZPUkspOworCQl4ZnNfYm1hcF9pbnNlcnRfZXhsaXN0KGlwLCBpZHgsIDEsIG5ldywgWEZTX0RBVEFfRk9SSyk7CisJCWlwLT5pX2RmLmlmX2xhc3RleCA9IGlkeDsKKwkJYnJlYWs7CisJfQorCWlmIChvbGRsZW4gIT0gbmV3bGVuKSB7CisJCUFTU0VSVChvbGRsZW4gPiBuZXdsZW4pOworCQl4ZnNfbW9kX2luY29yZV9zYihpcC0+aV9tb3VudCwgWEZTX1NCU19GREJMT0NLUywKKwkJCShpbnQpKG9sZGxlbiAtIG5ld2xlbiksIHJzdmQpOworCQkvKgorCQkgKiBOb3RoaW5nIHRvIGRvIGZvciBkaXNrIHF1b3RhIGFjY291bnRpbmcgaGVyZS4KKwkJICovCisJfQorCSpsb2dmbGFnc3AgPSAwOworCXJldHVybiAwOworI3VuZGVmCU1BU0sKKyN1bmRlZglNQVNLMgorI3VuZGVmCVNUQVRFX1NFVAorI3VuZGVmCVNUQVRFX1RFU1QKKyN1bmRlZglTVEFURV9TRVRfVEVTVAorI3VuZGVmCVNXSVRDSF9TVEFURQorfQorCisvKgorICogQ2FsbGVkIGJ5IHhmc19ibWFwX2FkZF9leHRlbnQgdG8gaGFuZGxlIGNhc2VzIGNvbnZlcnRpbmcgYSBob2xlCisgKiB0byBhIHJlYWwgYWxsb2NhdGlvbi4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX2JtYXBfYWRkX2V4dGVudF9ob2xlX3JlYWwoCisJeGZzX2lub2RlX3QJCSppcCwJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfZXh0bnVtX3QJCWlkeCwJLyogZXh0ZW50IG51bWJlciB0byB1cGRhdGUvaW5zZXJ0ICovCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBpZiBudWxsLCBub3QgYSBidHJlZSAqLworCXhmc19ibWJ0X2lyZWNfdAkJKm5ldywJLyogbmV3IGRhdGEgdG8gcHV0IGluIGV4dGVudCBsaXN0ICovCisJaW50CQkJKmxvZ2ZsYWdzcCwgLyogaW5vZGUgbG9nZ2luZyBmbGFncyAqLworCWludAkJCXdoaWNoZm9yaykgLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KK3sKKwl4ZnNfYm1idF9yZWNfdAkJKmVwOwkvKiBwb2ludGVyIHRvIGV4dGVudCBlbnRyeSBpbnMuIHBvaW50ICovCisJaW50CQkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworI2lmZGVmIFhGU19CTUFQX1RSQUNFCisJc3RhdGljIGNoYXIJCWZuYW1lW10gPSAieGZzX2JtYXBfYWRkX2V4dGVudF9ob2xlX3JlYWwiOworI2VuZGlmCisJaW50CQkJaTsJLyogdGVtcCBzdGF0ZSAqLworCXhmc19pZm9ya190CQkqaWZwOwkvKiBpbm9kZSBmb3JrIHBvaW50ZXIgKi8KKwl4ZnNfYm1idF9pcmVjX3QJCWxlZnQ7CS8qIGxlZnQgbmVpZ2hib3IgZXh0ZW50IGVudHJ5ICovCisJeGZzX2JtYnRfaXJlY190CQlyaWdodDsJLyogcmlnaHQgbmVpZ2hib3IgZXh0ZW50IGVudHJ5ICovCisJaW50CQkJc3RhdGU7CS8qIHN0YXRlIGJpdHMsIGFjY2Vzc2VkIHRocnUgbWFjcm9zICovCisJZW51bSB7CQkJCS8qIGJpdCBudW1iZXIgZGVmaW5pdGlvbnMgZm9yIHN0YXRlICovCisJCUxFRlRfQ09OVElHLAlSSUdIVF9DT05USUcsCisJCUxFRlRfREVMQVksCVJJR0hUX0RFTEFZLAorCQlMRUZUX1ZBTElELAlSSUdIVF9WQUxJRAorCX07CisKKyNkZWZpbmUJTUFTSyhiKQkJCSgxIDw8IChiKSkKKyNkZWZpbmUJTUFTSzIoYSxiKQkJKE1BU0soYSkgfCBNQVNLKGIpKQorI2RlZmluZQlTVEFURV9TRVQoYix2KQkJKCh2KSA/IChzdGF0ZSB8PSBNQVNLKGIpKSA6IChzdGF0ZSAmPSB+TUFTSyhiKSkpCisjZGVmaW5lCVNUQVRFX1RFU1QoYikJCShzdGF0ZSAmIE1BU0soYikpCisjZGVmaW5lCVNUQVRFX1NFVF9URVNUKGIsdikJKCh2KSA/ICgoc3RhdGUgfD0gTUFTSyhiKSksIDEpIDogXAorCQkJCSAgICAgICAoKHN0YXRlICY9IH5NQVNLKGIpKSwgMCkpCisjZGVmaW5lCVNXSVRDSF9TVEFURQkJKHN0YXRlICYgTUFTSzIoTEVGVF9DT05USUcsIFJJR0hUX0NPTlRJRykpCisKKwlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOworCUFTU0VSVChpZHggPD0gaWZwLT5pZl9ieXRlcyAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCkpOworCWVwID0gJmlmcC0+aWZfdTEuaWZfZXh0ZW50c1tpZHhdOworCXN0YXRlID0gMDsKKwkvKgorCSAqIENoZWNrIGFuZCBzZXQgZmxhZ3MgaWYgdGhpcyBzZWdtZW50IGhhcyBhIGxlZnQgbmVpZ2hib3IuCisJICovCisJaWYgKFNUQVRFX1NFVF9URVNUKExFRlRfVkFMSUQsIGlkeCA+IDApKSB7CisJCXhmc19ibWJ0X2dldF9hbGwoZXAgLSAxLCAmbGVmdCk7CisJCVNUQVRFX1NFVChMRUZUX0RFTEFZLCBJU05VTExTVEFSVEJMT0NLKGxlZnQuYnJfc3RhcnRibG9jaykpOworCX0KKwkvKgorCSAqIENoZWNrIGFuZCBzZXQgZmxhZ3MgaWYgdGhpcyBzZWdtZW50IGhhcyBhIGN1cnJlbnQgdmFsdWUuCisJICogTm90IHRydWUgaWYgd2UncmUgaW5zZXJ0aW5nIGludG8gdGhlICJob2xlIiBhdCBlb2YuCisJICovCisJaWYgKFNUQVRFX1NFVF9URVNUKFJJR0hUX1ZBTElELAorCQkJICAgaWR4IDwKKwkJCSAgIGlmcC0+aWZfYnl0ZXMgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpKSkgeworCQl4ZnNfYm1idF9nZXRfYWxsKGVwLCAmcmlnaHQpOworCQlTVEFURV9TRVQoUklHSFRfREVMQVksIElTTlVMTFNUQVJUQkxPQ0socmlnaHQuYnJfc3RhcnRibG9jaykpOworCX0KKwkvKgorCSAqIFdlJ3JlIGluc2VydGluZyBhIHJlYWwgYWxsb2NhdGlvbiBiZXR3ZWVuICJsZWZ0IiBhbmQgInJpZ2h0Ii4KKwkgKiBTZXQgdGhlIGNvbnRpZ3VpdHkgZmxhZ3MuICBEb24ndCBsZXQgZXh0ZW50cyBnZXQgdG9vIGxhcmdlLgorCSAqLworCVNUQVRFX1NFVChMRUZUX0NPTlRJRywKKwkJU1RBVEVfVEVTVChMRUZUX1ZBTElEKSAmJiAhU1RBVEVfVEVTVChMRUZUX0RFTEFZKSAmJgorCQlsZWZ0LmJyX3N0YXJ0b2ZmICsgbGVmdC5icl9ibG9ja2NvdW50ID09IG5ldy0+YnJfc3RhcnRvZmYgJiYKKwkJbGVmdC5icl9zdGFydGJsb2NrICsgbGVmdC5icl9ibG9ja2NvdW50ID09IG5ldy0+YnJfc3RhcnRibG9jayAmJgorCQlsZWZ0LmJyX3N0YXRlID09IG5ldy0+YnJfc3RhdGUgJiYKKwkJbGVmdC5icl9ibG9ja2NvdW50ICsgbmV3LT5icl9ibG9ja2NvdW50IDw9IE1BWEVYVExFTik7CisJU1RBVEVfU0VUKFJJR0hUX0NPTlRJRywKKwkJU1RBVEVfVEVTVChSSUdIVF9WQUxJRCkgJiYgIVNUQVRFX1RFU1QoUklHSFRfREVMQVkpICYmCisJCW5ldy0+YnJfc3RhcnRvZmYgKyBuZXctPmJyX2Jsb2NrY291bnQgPT0gcmlnaHQuYnJfc3RhcnRvZmYgJiYKKwkJbmV3LT5icl9zdGFydGJsb2NrICsgbmV3LT5icl9ibG9ja2NvdW50ID09CisJCSAgICByaWdodC5icl9zdGFydGJsb2NrICYmCisJCW5ldy0+YnJfc3RhdGUgPT0gcmlnaHQuYnJfc3RhdGUgJiYKKwkJbmV3LT5icl9ibG9ja2NvdW50ICsgcmlnaHQuYnJfYmxvY2tjb3VudCA8PSBNQVhFWFRMRU4gJiYKKwkJKCFTVEFURV9URVNUKExFRlRfQ09OVElHKSB8fAorCQkgbGVmdC5icl9ibG9ja2NvdW50ICsgbmV3LT5icl9ibG9ja2NvdW50ICsKKwkJICAgICByaWdodC5icl9ibG9ja2NvdW50IDw9IE1BWEVYVExFTikpOworCisJLyoKKwkgKiBTZWxlY3Qgd2hpY2ggY2FzZSB3ZSdyZSBpbiBoZXJlLCBhbmQgaW1wbGVtZW50IGl0LgorCSAqLworCXN3aXRjaCAoU1dJVENIX1NUQVRFKSB7CisKKwljYXNlIE1BU0syKExFRlRfQ09OVElHLCBSSUdIVF9DT05USUcpOgorCQkvKgorCQkgKiBOZXcgYWxsb2NhdGlvbiBpcyBjb250aWd1b3VzIHdpdGggcmVhbCBhbGxvY2F0aW9ucyBvbiB0aGUKKwkJICogbGVmdCBhbmQgb24gdGhlIHJpZ2h0LgorCQkgKiBNZXJnZSBhbGwgdGhyZWUgaW50byBhIHNpbmdsZSBleHRlbnQgbGlzdCBlbnRyeS4KKwkJICovCisJCXhmc19ibWFwX3RyYWNlX3ByZV91cGRhdGUoZm5hbWUsICJMQ3xSQyIsIGlwLCBpZHggLSAxLAorCQkJd2hpY2hmb3JrKTsKKwkJeGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoZXAgLSAxLAorCQkJbGVmdC5icl9ibG9ja2NvdW50ICsgbmV3LT5icl9ibG9ja2NvdW50ICsKKwkJCXJpZ2h0LmJyX2Jsb2NrY291bnQpOworCQl4ZnNfYm1hcF90cmFjZV9wb3N0X3VwZGF0ZShmbmFtZSwgIkxDfFJDIiwgaXAsIGlkeCAtIDEsCisJCQl3aGljaGZvcmspOworCQl4ZnNfYm1hcF90cmFjZV9kZWxldGUoZm5hbWUsICJMQ3xSQyIsIGlwLAorCQkJaWR4LCAxLCB3aGljaGZvcmspOworCQl4ZnNfYm1hcF9kZWxldGVfZXhsaXN0KGlwLCBpZHgsIDEsIHdoaWNoZm9yayk7CisJCWlmcC0+aWZfbGFzdGV4ID0gaWR4IC0gMTsKKwkJWEZTX0lGT1JLX05FWFRfU0VUKGlwLCB3aGljaGZvcmssCisJCQlYRlNfSUZPUktfTkVYVEVOVFMoaXAsIHdoaWNoZm9yaykgLSAxKTsKKwkJaWYgKGN1ciA9PSBOVUxMKSB7CisJCQkqbG9nZmxhZ3NwID0gWEZTX0lMT0dfQ09SRSB8IFhGU19JTE9HX0ZFWFQod2hpY2hmb3JrKTsKKwkJCXJldHVybiAwOworCQl9CisJCSpsb2dmbGFnc3AgPSBYRlNfSUxPR19DT1JFOworCQlpZiAoKGVycm9yID0geGZzX2JtYnRfbG9va3VwX2VxKGN1ciwgcmlnaHQuYnJfc3RhcnRvZmYsCisJCQkJcmlnaHQuYnJfc3RhcnRibG9jaywgcmlnaHQuYnJfYmxvY2tjb3VudCwgJmkpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJQVNTRVJUKGkgPT0gMSk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9kZWxldGUoY3VyLCAmaSkpKQorCQkJcmV0dXJuIGVycm9yOworCQlBU1NFUlQoaSA9PSAxKTsKKwkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2RlY3JlbWVudChjdXIsIDAsICZpKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCUFTU0VSVChpID09IDEpOworCQllcnJvciA9IHhmc19ibWJ0X3VwZGF0ZShjdXIsIGxlZnQuYnJfc3RhcnRvZmYsCisJCQkJbGVmdC5icl9zdGFydGJsb2NrLAorCQkJCWxlZnQuYnJfYmxvY2tjb3VudCArIG5ldy0+YnJfYmxvY2tjb3VudCArCisJCQkJcmlnaHQuYnJfYmxvY2tjb3VudCwgbGVmdC5icl9zdGF0ZSk7CisJCXJldHVybiBlcnJvcjsKKworCWNhc2UgTUFTSyhMRUZUX0NPTlRJRyk6CisJCS8qCisJCSAqIE5ldyBhbGxvY2F0aW9uIGlzIGNvbnRpZ3VvdXMgd2l0aCBhIHJlYWwgYWxsb2NhdGlvbgorCQkgKiBvbiB0aGUgbGVmdC4KKwkJICogTWVyZ2UgdGhlIG5ldyBhbGxvY2F0aW9uIHdpdGggdGhlIGxlZnQgbmVpZ2hib3IuCisJCSAqLworCQl4ZnNfYm1hcF90cmFjZV9wcmVfdXBkYXRlKGZuYW1lLCAiTEMiLCBpcCwgaWR4IC0gMSwgd2hpY2hmb3JrKTsKKwkJeGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoZXAgLSAxLAorCQkJbGVmdC5icl9ibG9ja2NvdW50ICsgbmV3LT5icl9ibG9ja2NvdW50KTsKKwkJeGZzX2JtYXBfdHJhY2VfcG9zdF91cGRhdGUoZm5hbWUsICJMQyIsIGlwLCBpZHggLSAxLCB3aGljaGZvcmspOworCQlpZnAtPmlmX2xhc3RleCA9IGlkeCAtIDE7CisJCWlmIChjdXIgPT0gTlVMTCkgeworCQkJKmxvZ2ZsYWdzcCA9IFhGU19JTE9HX0ZFWFQod2hpY2hmb3JrKTsKKwkJCXJldHVybiAwOworCQl9CisJCSpsb2dmbGFnc3AgPSAwOworCQlpZiAoKGVycm9yID0geGZzX2JtYnRfbG9va3VwX2VxKGN1ciwgbGVmdC5icl9zdGFydG9mZiwKKwkJCQlsZWZ0LmJyX3N0YXJ0YmxvY2ssIGxlZnQuYnJfYmxvY2tjb3VudCwgJmkpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJQVNTRVJUKGkgPT0gMSk7CisJCWVycm9yID0geGZzX2JtYnRfdXBkYXRlKGN1ciwgbGVmdC5icl9zdGFydG9mZiwKKwkJCQlsZWZ0LmJyX3N0YXJ0YmxvY2ssCisJCQkJbGVmdC5icl9ibG9ja2NvdW50ICsgbmV3LT5icl9ibG9ja2NvdW50LAorCQkJCWxlZnQuYnJfc3RhdGUpOworCQlyZXR1cm4gZXJyb3I7CisKKwljYXNlIE1BU0soUklHSFRfQ09OVElHKToKKwkJLyoKKwkJICogTmV3IGFsbG9jYXRpb24gaXMgY29udGlndW91cyB3aXRoIGEgcmVhbCBhbGxvY2F0aW9uCisJCSAqIG9uIHRoZSByaWdodC4KKwkJICogTWVyZ2UgdGhlIG5ldyBhbGxvY2F0aW9uIHdpdGggdGhlIHJpZ2h0IG5laWdoYm9yLgorCQkgKi8KKwkJeGZzX2JtYXBfdHJhY2VfcHJlX3VwZGF0ZShmbmFtZSwgIlJDIiwgaXAsIGlkeCwgd2hpY2hmb3JrKTsKKwkJeGZzX2JtYnRfc2V0X2FsbGYoZXAsIG5ldy0+YnJfc3RhcnRvZmYsIG5ldy0+YnJfc3RhcnRibG9jaywKKwkJCW5ldy0+YnJfYmxvY2tjb3VudCArIHJpZ2h0LmJyX2Jsb2NrY291bnQsCisJCQlyaWdodC5icl9zdGF0ZSk7CisJCXhmc19ibWFwX3RyYWNlX3Bvc3RfdXBkYXRlKGZuYW1lLCAiUkMiLCBpcCwgaWR4LCB3aGljaGZvcmspOworCQlpZnAtPmlmX2xhc3RleCA9IGlkeDsKKwkJaWYgKGN1ciA9PSBOVUxMKSB7CisJCQkqbG9nZmxhZ3NwID0gWEZTX0lMT0dfRkVYVCh3aGljaGZvcmspOworCQkJcmV0dXJuIDA7CisJCX0KKwkJKmxvZ2ZsYWdzcCA9IDA7CisJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoY3VyLCByaWdodC5icl9zdGFydG9mZiwKKwkJCQlyaWdodC5icl9zdGFydGJsb2NrLCByaWdodC5icl9ibG9ja2NvdW50LCAmaSkpKQorCQkJcmV0dXJuIGVycm9yOworCQlBU1NFUlQoaSA9PSAxKTsKKwkJZXJyb3IgPSB4ZnNfYm1idF91cGRhdGUoY3VyLCBuZXctPmJyX3N0YXJ0b2ZmLAorCQkJCW5ldy0+YnJfc3RhcnRibG9jaywKKwkJCQluZXctPmJyX2Jsb2NrY291bnQgKyByaWdodC5icl9ibG9ja2NvdW50LAorCQkJCXJpZ2h0LmJyX3N0YXRlKTsKKwkJcmV0dXJuIGVycm9yOworCisJY2FzZSAwOgorCQkvKgorCQkgKiBOZXcgYWxsb2NhdGlvbiBpcyBub3QgY29udGlndW91cyB3aXRoIGFub3RoZXIKKwkJICogcmVhbCBhbGxvY2F0aW9uLgorCQkgKiBJbnNlcnQgYSBuZXcgZW50cnkuCisJCSAqLworCQl4ZnNfYm1hcF90cmFjZV9pbnNlcnQoZm5hbWUsICIwIiwgaXAsIGlkeCwgMSwgbmV3LCBOVUxMLAorCQkJd2hpY2hmb3JrKTsKKwkJeGZzX2JtYXBfaW5zZXJ0X2V4bGlzdChpcCwgaWR4LCAxLCBuZXcsIHdoaWNoZm9yayk7CisJCWlmcC0+aWZfbGFzdGV4ID0gaWR4OworCQlYRlNfSUZPUktfTkVYVF9TRVQoaXAsIHdoaWNoZm9yaywKKwkJCVhGU19JRk9SS19ORVhURU5UUyhpcCwgd2hpY2hmb3JrKSArIDEpOworCQlpZiAoY3VyID09IE5VTEwpIHsKKwkJCSpsb2dmbGFnc3AgPSBYRlNfSUxPR19DT1JFIHwgWEZTX0lMT0dfRkVYVCh3aGljaGZvcmspOworCQkJcmV0dXJuIDA7CisJCX0KKwkJKmxvZ2ZsYWdzcCA9IFhGU19JTE9HX0NPUkU7CisJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoY3VyLCBuZXctPmJyX3N0YXJ0b2ZmLAorCQkJCW5ldy0+YnJfc3RhcnRibG9jaywgbmV3LT5icl9ibG9ja2NvdW50LCAmaSkpKQorCQkJcmV0dXJuIGVycm9yOworCQlBU1NFUlQoaSA9PSAwKTsKKwkJY3VyLT5iY19yZWMuYi5icl9zdGF0ZSA9IG5ldy0+YnJfc3RhdGU7CisJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9pbnNlcnQoY3VyLCAmaSkpKQorCQkJcmV0dXJuIGVycm9yOworCQlBU1NFUlQoaSA9PSAxKTsKKwkJcmV0dXJuIDA7CisJfQorI3VuZGVmCU1BU0sKKyN1bmRlZglNQVNLMgorI3VuZGVmCVNUQVRFX1NFVAorI3VuZGVmCVNUQVRFX1RFU1QKKyN1bmRlZglTVEFURV9TRVRfVEVTVAorI3VuZGVmCVNXSVRDSF9TVEFURQorCS8qIE5PVFJFQUNIRUQgKi8KKwlBU1NFUlQoMCk7CisJcmV0dXJuIDA7IC8qIGtlZXAgZ2NjIHF1aXRlICovCit9CisKKyNkZWZpbmUgWEZTX0FMTE9DX0dBUF9VTklUUwk0CisKKy8qCisgKiB4ZnNfYm1hcF9hbGxvYyBpcyBjYWxsZWQgYnkgeGZzX2JtYXBpIHRvIGFsbG9jYXRlIGFuIGV4dGVudCBmb3IgYSBmaWxlLgorICogSXQgZmlndXJlcyBvdXQgd2hlcmUgdG8gYXNrIHRoZSB1bmRlcmx5aW5nIGFsbG9jYXRvciB0byBwdXQgdGhlIG5ldyBleHRlbnQuCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19ibWFwX2FsbG9jKAorCXhmc19ibWFsbG9jYV90CSphcCkJCS8qIGJtYXAgYWxsb2MgYXJndW1lbnQgc3RydWN0ICovCit7CisJeGZzX2ZzYmxvY2tfdAlhZGp1c3Q7CQkvKiBhZGp1c3RtZW50IHRvIGJsb2NrIG51bWJlcnMgKi8KKwl4ZnNfYWxsb2N0eXBlX3QJYXR5cGU9MDsJLyogdHlwZSBmb3IgYWxsb2NhdGlvbiByb3V0aW5lcyAqLworCWludAkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwl4ZnNfYWdudW1iZXJfdAlmYl9hZ25vOwkvKiBhZyBudW1iZXIgb2YgYXAtPmZpcnN0YmxvY2sgKi8KKwl4ZnNfbW91bnRfdAkqbXA7CQkvKiBtb3VudCBwb2ludCBzdHJ1Y3R1cmUgKi8KKwlpbnQJCW51bGxmYjsJCS8qIHRydWUgaWYgYXAtPmZpcnN0YmxvY2sgaXNuJ3Qgc2V0ICovCisJaW50CQlydDsJCS8qIHRydWUgaWYgaW5vZGUgaXMgcmVhbHRpbWUgKi8KKyNpZmRlZiBfX0tFUk5FTF9fCisJeGZzX2V4dGxlbl90CXByb2Q9MDsJCS8qIHByb2R1Y3QgZmFjdG9yIGZvciBhbGxvY2F0b3JzICovCisJeGZzX2V4dGxlbl90CXJhbGVuPTA7CS8qIHJlYWx0aW1lIGFsbG9jYXRpb24gbGVuZ3RoICovCisjZW5kaWYKKworI2RlZmluZQlJU1ZBTElEKHgseSkJXAorCShydCA/IFwKKwkJKHgpIDwgbXAtPm1fc2Iuc2JfcmJsb2NrcyA6IFwKKwkJWEZTX0ZTQl9UT19BR05PKG1wLCB4KSA9PSBYRlNfRlNCX1RPX0FHTk8obXAsIHkpICYmIFwKKwkJWEZTX0ZTQl9UT19BR05PKG1wLCB4KSA8IG1wLT5tX3NiLnNiX2FnY291bnQgJiYgXAorCQlYRlNfRlNCX1RPX0FHQk5PKG1wLCB4KSA8IG1wLT5tX3NiLnNiX2FnYmxvY2tzKQorCisJLyoKKwkgKiBTZXQgdXAgdmFyaWFibGVzLgorCSAqLworCW1wID0gYXAtPmlwLT5pX21vdW50OworCW51bGxmYiA9IGFwLT5maXJzdGJsb2NrID09IE5VTExGU0JMT0NLOworCXJ0ID0gWEZTX0lTX1JFQUxUSU1FX0lOT0RFKGFwLT5pcCkgJiYgYXAtPnVzZXJkYXRhOworCWZiX2Fnbm8gPSBudWxsZmIgPyBOVUxMQUdOVU1CRVIgOiBYRlNfRlNCX1RPX0FHTk8obXAsIGFwLT5maXJzdGJsb2NrKTsKKyNpZmRlZiBfX0tFUk5FTF9fCisJaWYgKHJ0KSB7CisJCXhmc19leHRsZW5fdAlleHRzejsJCS8qIGZpbGUgZXh0ZW50IHNpemUgZm9yIHJ0ICovCisJCXhmc19maWxlb2ZmX3QJbmV4dG87CQkvKiBuZXh0IGZpbGUgb2Zmc2V0ICovCisJCXhmc19leHRsZW5fdAlvcmlnX2FsZW47CS8qIG9yaWdpbmFsIGFwLT5hbGVuICovCisJCXhmc19maWxlb2ZmX3QJb3JpZ19lbmQ7CS8qIG9yaWdpbmFsIG9mZitsZW4gKi8KKwkJeGZzX2ZpbGVvZmZfdAlvcmlnX29mZjsJLyogb3JpZ2luYWwgYXAtPm9mZiAqLworCQl4ZnNfZXh0bGVuX3QJbW9kX29mZjsJLyogbW9kdWx1cyBjYWxjdWxhdGlvbnMgKi8KKwkJeGZzX2ZpbGVvZmZfdAlwcmV2bzsJCS8qIHByZXZpb3VzIGZpbGUgb2Zmc2V0ICovCisJCXhmc19ydGJsb2NrX3QJcnR4OwkJLyogcmVhbHRpbWUgZXh0ZW50IG51bWJlciAqLworCQl4ZnNfZXh0bGVuX3QJdGVtcDsJCS8qIHRlbXAgZm9yIHJ0IGNhbGN1bGF0aW9ucyAqLworCisJCS8qCisJCSAqIFNldCBwcm9kIHRvIG1hdGNoIHRoZSByZWFsdGltZSBleHRlbnQgc2l6ZS4KKwkJICovCisJCWlmICghKGV4dHN6ID0gYXAtPmlwLT5pX2QuZGlfZXh0c2l6ZSkpCisJCQlleHRzeiA9IG1wLT5tX3NiLnNiX3JleHRzaXplOworCQlwcm9kID0gZXh0c3ogLyBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKKwkJb3JpZ19vZmYgPSBhcC0+b2ZmOworCQlvcmlnX2FsZW4gPSBhcC0+YWxlbjsKKwkJb3JpZ19lbmQgPSBvcmlnX29mZiArIG9yaWdfYWxlbjsKKwkJLyoKKwkJICogSWYgdGhlIGZpbGUgb2Zmc2V0IGlzIHVuYWxpZ25lZCB2cy4gdGhlIGV4dGVudCBzaXplCisJCSAqIHdlIG5lZWQgdG8gYWxpZ24gaXQuICBUaGlzIHdpbGwgYmUgcG9zc2libGUgdW5sZXNzCisJCSAqIHRoZSBmaWxlIHdhcyBwcmV2aW91c2x5IHdyaXR0ZW4gd2l0aCBhIGtlcm5lbCB0aGF0IGRpZG4ndAorCQkgKiBwZXJmb3JtIHRoaXMgYWxpZ25tZW50LgorCQkgKi8KKwkJbW9kX29mZiA9IGRvX21vZChvcmlnX29mZiwgZXh0c3opOworCQlpZiAobW9kX29mZikgeworCQkJYXAtPmFsZW4gKz0gbW9kX29mZjsKKwkJCWFwLT5vZmYgLT0gbW9kX29mZjsKKwkJfQorCQkvKgorCQkgKiBTYW1lIGFkanVzdG1lbnQgZm9yIHRoZSBlbmQgb2YgdGhlIHJlcXVlc3RlZCBhcmVhLgorCQkgKi8KKwkJaWYgKCh0ZW1wID0gKGFwLT5hbGVuICUgZXh0c3opKSkKKwkJCWFwLT5hbGVuICs9IGV4dHN6IC0gdGVtcDsKKwkJLyoKKwkJICogSWYgdGhlIHByZXZpb3VzIGJsb2NrIG92ZXJsYXBzIHdpdGggdGhpcyBwcm9wb3NlZCBhbGxvY2F0aW9uCisJCSAqIHRoZW4gbW92ZSB0aGUgc3RhcnQgZm9yd2FyZCB3aXRob3V0IGFkanVzdGluZyB0aGUgbGVuZ3RoLgorCQkgKi8KKwkJcHJldm8gPQorCQkJYXAtPnByZXZwLT5icl9zdGFydG9mZiA9PSBOVUxMRklMRU9GRiA/CisJCQkJMCA6CisJCQkJKGFwLT5wcmV2cC0+YnJfc3RhcnRvZmYgKworCQkJCSBhcC0+cHJldnAtPmJyX2Jsb2NrY291bnQpOworCQlpZiAoYXAtPm9mZiAhPSBvcmlnX29mZiAmJiBhcC0+b2ZmIDwgcHJldm8pCisJCQlhcC0+b2ZmID0gcHJldm87CisJCS8qCisJCSAqIElmIHRoZSBuZXh0IGJsb2NrIG92ZXJsYXBzIHdpdGggdGhpcyBwcm9wb3NlZCBhbGxvY2F0aW9uCisJCSAqIHRoZW4gbW92ZSB0aGUgc3RhcnQgYmFjayB3aXRob3V0IGFkanVzdGluZyB0aGUgbGVuZ3RoLAorCQkgKiBidXQgbm90IGJlZm9yZSBvZmZzZXQgMC4KKwkJICogVGhpcyBtYXkgb2YgY291cnNlIG1ha2UgdGhlIHN0YXJ0IG92ZXJsYXAgcHJldmlvdXMgYmxvY2ssCisJCSAqIGFuZCBpZiB3ZSBoaXQgdGhlIG9mZnNldCAwIGxpbWl0IHRoZW4gdGhlIG5leHQgYmxvY2sKKwkJICogY2FuIHN0aWxsIG92ZXJsYXAgdG9vLgorCQkgKi8KKwkJbmV4dG8gPSAoYXAtPmVvZiB8fCBhcC0+Z290cC0+YnJfc3RhcnRvZmYgPT0gTlVMTEZJTEVPRkYpID8KKwkJCU5VTExGSUxFT0ZGIDogYXAtPmdvdHAtPmJyX3N0YXJ0b2ZmOworCQlpZiAoIWFwLT5lb2YgJiYKKwkJICAgIGFwLT5vZmYgKyBhcC0+YWxlbiAhPSBvcmlnX2VuZCAmJgorCQkgICAgYXAtPm9mZiArIGFwLT5hbGVuID4gbmV4dG8pCisJCQlhcC0+b2ZmID0gbmV4dG8gPiBhcC0+YWxlbiA/IG5leHRvIC0gYXAtPmFsZW4gOiAwOworCQkvKgorCQkgKiBJZiB3ZSdyZSBub3cgb3ZlcmxhcHBpbmcgdGhlIG5leHQgb3IgcHJldmlvdXMgZXh0ZW50IHRoYXQKKwkJICogbWVhbnMgd2UgY2FuJ3QgZml0IGFuIGV4dHN6IHBpZWNlIGluIHRoaXMgaG9sZS4gIEp1c3QgbW92ZQorCQkgKiB0aGUgc3RhcnQgZm9yd2FyZCB0byB0aGUgZmlyc3QgdmFsaWQgc3BvdCBhbmQgc2V0CisJCSAqIHRoZSBsZW5ndGggc28gd2UgaGl0IHRoZSBlbmQuCisJCSAqLworCQlpZiAoKGFwLT5vZmYgIT0gb3JpZ19vZmYgJiYgYXAtPm9mZiA8IHByZXZvKSB8fAorCQkgICAgKGFwLT5vZmYgKyBhcC0+YWxlbiAhPSBvcmlnX2VuZCAmJgorCQkgICAgIGFwLT5vZmYgKyBhcC0+YWxlbiA+IG5leHRvKSkgeworCQkJYXAtPm9mZiA9IHByZXZvOworCQkJYXAtPmFsZW4gPSBuZXh0byAtIHByZXZvOworCQl9CisJCS8qCisJCSAqIElmIHRoZSByZXN1bHQgaXNuJ3QgYSBtdWx0aXBsZSBvZiBydGV4dGVudHMgd2UgbmVlZCB0bworCQkgKiByZW1vdmUgYmxvY2tzIHVudGlsIGl0IGlzLgorCQkgKi8KKwkJaWYgKCh0ZW1wID0gKGFwLT5hbGVuICUgbXAtPm1fc2Iuc2JfcmV4dHNpemUpKSkgeworCQkJLyoKKwkJCSAqIFdlJ3JlIG5vdCBjb3ZlcmluZyB0aGUgb3JpZ2luYWwgcmVxdWVzdCwgb3IKKwkJCSAqIHdlIHdvbid0IGJlIGFibGUgdG8gb25jZSB3ZSBmaXggdGhlIGxlbmd0aC4KKwkJCSAqLworCQkJaWYgKG9yaWdfb2ZmIDwgYXAtPm9mZiB8fAorCQkJICAgIG9yaWdfZW5kID4gYXAtPm9mZiArIGFwLT5hbGVuIHx8CisJCQkgICAgYXAtPmFsZW4gLSB0ZW1wIDwgb3JpZ19hbGVuKQorCQkJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKwkJCS8qCisJCQkgKiBUcnkgdG8gZml4IGl0IGJ5IG1vdmluZyB0aGUgc3RhcnQgdXAuCisJCQkgKi8KKwkJCWlmIChhcC0+b2ZmICsgdGVtcCA8PSBvcmlnX29mZikgeworCQkJCWFwLT5hbGVuIC09IHRlbXA7CisJCQkJYXAtPm9mZiArPSB0ZW1wOworCQkJfQorCQkJLyoKKwkJCSAqIFRyeSB0byBmaXggaXQgYnkgbW92aW5nIHRoZSBlbmQgaW4uCisJCQkgKi8KKwkJCWVsc2UgaWYgKGFwLT5vZmYgKyBhcC0+YWxlbiAtIHRlbXAgPj0gb3JpZ19lbmQpCisJCQkJYXAtPmFsZW4gLT0gdGVtcDsKKwkJCS8qCisJCQkgKiBTZXQgdGhlIHN0YXJ0IHRvIHRoZSBtaW5pbXVtIHRoZW4gdHJpbSB0aGUgbGVuZ3RoLgorCQkJICovCisJCQllbHNlIHsKKwkJCQlhcC0+YWxlbiAtPSBvcmlnX29mZiAtIGFwLT5vZmY7CisJCQkJYXAtPm9mZiA9IG9yaWdfb2ZmOworCQkJCWFwLT5hbGVuIC09IGFwLT5hbGVuICUgbXAtPm1fc2Iuc2JfcmV4dHNpemU7CisJCQl9CisJCQkvKgorCQkJICogUmVzdWx0IGRvZXNuJ3QgY292ZXIgdGhlIHJlcXVlc3QsIGZhaWwgaXQuCisJCQkgKi8KKwkJCWlmIChvcmlnX29mZiA8IGFwLT5vZmYgfHwgb3JpZ19lbmQgPiBhcC0+b2ZmICsgYXAtPmFsZW4pCisJCQkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCQl9CisJCUFTU0VSVChhcC0+YWxlbiAlIG1wLT5tX3NiLnNiX3JleHRzaXplID09IDApOworCQkvKgorCQkgKiBJZiB0aGUgb2Zmc2V0ICYgbGVuZ3RoIGFyZSBub3QgcGVyZmVjdGx5IGFsaWduZWQKKwkJICogdGhlbiBraWxsIHByb2QsIGl0IHdpbGwganVzdCBnZXQgdXMgaW4gdHJvdWJsZS4KKwkJICovCisJCWlmIChkb19tb2QoYXAtPm9mZiwgZXh0c3opIHx8IGFwLT5hbGVuICUgZXh0c3opCisJCQlwcm9kID0gMTsKKwkJLyoKKwkJICogU2V0IHJhbGVuIHRvIGJlIHRoZSBhY3R1YWwgcmVxdWVzdGVkIGxlbmd0aCBpbiBydGV4dGVudHMuCisJCSAqLworCQlyYWxlbiA9IGFwLT5hbGVuIC8gbXAtPm1fc2Iuc2JfcmV4dHNpemU7CisJCS8qCisJCSAqIElmIHRoZSBvbGQgdmFsdWUgd2FzIGNsb3NlIGVub3VnaCB0byBNQVhFWFRMRU4gdGhhdAorCQkgKiB3ZSByb3VuZGVkIHVwIHRvIGl0LCBjdXQgaXQgYmFjayBzbyBpdCdzIHZhbGlkIGFnYWluLgorCQkgKiBOb3RlIHRoYXQgaWYgaXQncyBhIHJlYWxseSBsYXJnZSByZXF1ZXN0IChiaWdnZXIgdGhhbgorCQkgKiBNQVhFWFRMRU4pLCB3ZSBkb24ndCBoZWFyIGFib3V0IHRoYXQgbnVtYmVyLCBhbmQgY2FuJ3QKKwkJICogYWRqdXN0IHRoZSBzdGFydGluZyBwb2ludCB0byBtYXRjaCBpdC4KKwkJICovCisJCWlmIChyYWxlbiAqIG1wLT5tX3NiLnNiX3JleHRzaXplID49IE1BWEVYVExFTikKKwkJCXJhbGVuID0gTUFYRVhUTEVOIC8gbXAtPm1fc2Iuc2JfcmV4dHNpemU7CisJCS8qCisJCSAqIElmIGl0J3MgYW4gYWxsb2NhdGlvbiB0byBhbiBlbXB0eSBmaWxlIGF0IG9mZnNldCAwLAorCQkgKiBwaWNrIGFuIGV4dGVudCB0aGF0IHdpbGwgc3BhY2UgdGhpbmdzIG91dCBpbiB0aGUgcnQgYXJlYS4KKwkJICovCisJCWlmIChhcC0+ZW9mICYmIGFwLT5vZmYgPT0gMCkgeworCQkJZXJyb3IgPSB4ZnNfcnRwaWNrX2V4dGVudChtcCwgYXAtPnRwLCByYWxlbiwgJnJ0eCk7CisJCQlpZiAoZXJyb3IpCisJCQkJcmV0dXJuIGVycm9yOworCQkJYXAtPnJ2YWwgPSBydHggKiBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKKwkJfSBlbHNlCisJCQlhcC0+cnZhbCA9IDA7CisJfQorI2Vsc2UKKwlpZiAocnQpCisJCWFwLT5ydmFsID0gMDsKKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisJZWxzZSBpZiAobnVsbGZiKQorCQlhcC0+cnZhbCA9IFhGU19JTk9fVE9fRlNCKG1wLCBhcC0+aXAtPmlfaW5vKTsKKwllbHNlCisJCWFwLT5ydmFsID0gYXAtPmZpcnN0YmxvY2s7CisJLyoKKwkgKiBJZiBhbGxvY2F0aW5nIGF0IGVvZiwgYW5kIHRoZXJlJ3MgYSBwcmV2aW91cyByZWFsIGJsb2NrLAorCSAqIHRyeSB0byB1c2UgaXQncyBsYXN0IGJsb2NrIGFzIG91ciBzdGFydGluZyBwb2ludC4KKwkgKi8KKwlpZiAoYXAtPmVvZiAmJiBhcC0+cHJldnAtPmJyX3N0YXJ0b2ZmICE9IE5VTExGSUxFT0ZGICYmCisJICAgICFJU05VTExTVEFSVEJMT0NLKGFwLT5wcmV2cC0+YnJfc3RhcnRibG9jaykgJiYKKwkgICAgSVNWQUxJRChhcC0+cHJldnAtPmJyX3N0YXJ0YmxvY2sgKyBhcC0+cHJldnAtPmJyX2Jsb2NrY291bnQsCisJCSAgICBhcC0+cHJldnAtPmJyX3N0YXJ0YmxvY2spKSB7CisJCWFwLT5ydmFsID0gYXAtPnByZXZwLT5icl9zdGFydGJsb2NrICsgYXAtPnByZXZwLT5icl9ibG9ja2NvdW50OworCQkvKgorCQkgKiBBZGp1c3QgZm9yIHRoZSBnYXAgYmV0d2VlbiBwcmV2cCBhbmQgdXMuCisJCSAqLworCQlhZGp1c3QgPSBhcC0+b2ZmIC0KKwkJCShhcC0+cHJldnAtPmJyX3N0YXJ0b2ZmICsgYXAtPnByZXZwLT5icl9ibG9ja2NvdW50KTsKKwkJaWYgKGFkanVzdCAmJgorCQkgICAgSVNWQUxJRChhcC0+cnZhbCArIGFkanVzdCwgYXAtPnByZXZwLT5icl9zdGFydGJsb2NrKSkKKwkJCWFwLT5ydmFsICs9IGFkanVzdDsKKwl9CisJLyoKKwkgKiBJZiBub3QgYXQgZW9mLCB0aGVuIGNvbXBhcmUgdGhlIHR3byBuZWlnaGJvciBibG9ja3MuCisJICogRmlndXJlIG91dCB3aGV0aGVyIGVpdGhlciBvbmUgZ2l2ZXMgdXMgYSBnb29kIHN0YXJ0aW5nIHBvaW50LAorCSAqIGFuZCBwaWNrIHRoZSBiZXR0ZXIgb25lLgorCSAqLworCWVsc2UgaWYgKCFhcC0+ZW9mKSB7CisJCXhmc19mc2Jsb2NrX3QJZ290Ym5vOwkJLyogcmlnaHQgc2lkZSBibG9jayBudW1iZXIgKi8KKwkJeGZzX2ZzYmxvY2tfdAlnb3RkaWZmPTA7CS8qIHJpZ2h0IHNpZGUgZGlmZmVyZW5jZSAqLworCQl4ZnNfZnNibG9ja190CXByZXZibm87CS8qIGxlZnQgc2lkZSBibG9jayBudW1iZXIgKi8KKwkJeGZzX2ZzYmxvY2tfdAlwcmV2ZGlmZj0wOwkvKiBsZWZ0IHNpZGUgZGlmZmVyZW5jZSAqLworCisJCS8qCisJCSAqIElmIHRoZXJlJ3MgYSBwcmV2aW91cyAobGVmdCkgYmxvY2ssIHNlbGVjdCBhIHJlcXVlc3RlZAorCQkgKiBzdGFydCBibG9jayBiYXNlZCBvbiBpdC4KKwkJICovCisJCWlmIChhcC0+cHJldnAtPmJyX3N0YXJ0b2ZmICE9IE5VTExGSUxFT0ZGICYmCisJCSAgICAhSVNOVUxMU1RBUlRCTE9DSyhhcC0+cHJldnAtPmJyX3N0YXJ0YmxvY2spICYmCisJCSAgICAocHJldmJubyA9IGFwLT5wcmV2cC0+YnJfc3RhcnRibG9jayArCisJCQkgICAgICAgYXAtPnByZXZwLT5icl9ibG9ja2NvdW50KSAmJgorCQkgICAgSVNWQUxJRChwcmV2Ym5vLCBhcC0+cHJldnAtPmJyX3N0YXJ0YmxvY2spKSB7CisJCQkvKgorCQkJICogQ2FsY3VsYXRlIGdhcCB0byBlbmQgb2YgcHJldmlvdXMgYmxvY2suCisJCQkgKi8KKwkJCWFkanVzdCA9IHByZXZkaWZmID0gYXAtPm9mZiAtCisJCQkJKGFwLT5wcmV2cC0+YnJfc3RhcnRvZmYgKworCQkJCSBhcC0+cHJldnAtPmJyX2Jsb2NrY291bnQpOworCQkJLyoKKwkJCSAqIEZpZ3VyZSB0aGUgc3RhcnRibG9jayBiYXNlZCBvbiB0aGUgcHJldmlvdXMgYmxvY2sncworCQkJICogZW5kIGFuZCB0aGUgZ2FwIHNpemUuCisJCQkgKiBIZXVyaXN0aWMhCisJCQkgKiBJZiB0aGUgZ2FwIGlzIGxhcmdlIHJlbGF0aXZlIHRvIHRoZSBwaWVjZSB3ZSdyZQorCQkJICogYWxsb2NhdGluZywgb3IgdXNpbmcgaXQgZ2l2ZXMgdXMgYW4gaW52YWxpZCBibG9jaworCQkJICogbnVtYmVyLCB0aGVuIGp1c3QgdXNlIHRoZSBlbmQgb2YgdGhlIHByZXZpb3VzIGJsb2NrLgorCQkJICovCisJCQlpZiAocHJldmRpZmYgPD0gWEZTX0FMTE9DX0dBUF9VTklUUyAqIGFwLT5hbGVuICYmCisJCQkgICAgSVNWQUxJRChwcmV2Ym5vICsgcHJldmRpZmYsCisJCQkJICAgIGFwLT5wcmV2cC0+YnJfc3RhcnRibG9jaykpCisJCQkJcHJldmJubyArPSBhZGp1c3Q7CisJCQllbHNlCisJCQkJcHJldmRpZmYgKz0gYWRqdXN0OworCQkJLyoKKwkJCSAqIElmIHRoZSBmaXJzdGJsb2NrIGZvcmJpZHMgaXQsIGNhbid0IHVzZSBpdCwKKwkJCSAqIG11c3QgdXNlIGRlZmF1bHQuCisJCQkgKi8KKwkJCWlmICghcnQgJiYgIW51bGxmYiAmJgorCQkJICAgIFhGU19GU0JfVE9fQUdOTyhtcCwgcHJldmJubykgIT0gZmJfYWdubykKKwkJCQlwcmV2Ym5vID0gTlVMTEZTQkxPQ0s7CisJCX0KKwkJLyoKKwkJICogTm8gcHJldmlvdXMgYmxvY2sgb3IgY2FuJ3QgZm9sbG93IGl0LCBqdXN0IGRlZmF1bHQuCisJCSAqLworCQllbHNlCisJCQlwcmV2Ym5vID0gTlVMTEZTQkxPQ0s7CisJCS8qCisJCSAqIElmIHRoZXJlJ3MgYSBmb2xsb3dpbmcgKHJpZ2h0KSBibG9jaywgc2VsZWN0IGEgcmVxdWVzdGVkCisJCSAqIHN0YXJ0IGJsb2NrIGJhc2VkIG9uIGl0LgorCQkgKi8KKwkJaWYgKCFJU05VTExTVEFSVEJMT0NLKGFwLT5nb3RwLT5icl9zdGFydGJsb2NrKSkgeworCQkJLyoKKwkJCSAqIENhbGN1bGF0ZSBnYXAgdG8gc3RhcnQgb2YgbmV4dCBibG9jay4KKwkJCSAqLworCQkJYWRqdXN0ID0gZ290ZGlmZiA9IGFwLT5nb3RwLT5icl9zdGFydG9mZiAtIGFwLT5vZmY7CisJCQkvKgorCQkJICogRmlndXJlIHRoZSBzdGFydGJsb2NrIGJhc2VkIG9uIHRoZSBuZXh0IGJsb2NrJ3MKKwkJCSAqIHN0YXJ0IGFuZCB0aGUgZ2FwIHNpemUuCisJCQkgKi8KKwkJCWdvdGJubyA9IGFwLT5nb3RwLT5icl9zdGFydGJsb2NrOworCQkJLyoKKwkJCSAqIEhldXJpc3RpYyEKKwkJCSAqIElmIHRoZSBnYXAgaXMgbGFyZ2UgcmVsYXRpdmUgdG8gdGhlIHBpZWNlIHdlJ3JlCisJCQkgKiBhbGxvY2F0aW5nLCBvciB1c2luZyBpdCBnaXZlcyB1cyBhbiBpbnZhbGlkIGJsb2NrCisJCQkgKiBudW1iZXIsIHRoZW4ganVzdCB1c2UgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGJsb2NrCisJCQkgKiBvZmZzZXQgYnkgb3VyIGxlbmd0aC4KKwkJCSAqLworCQkJaWYgKGdvdGRpZmYgPD0gWEZTX0FMTE9DX0dBUF9VTklUUyAqIGFwLT5hbGVuICYmCisJCQkgICAgSVNWQUxJRChnb3Ribm8gLSBnb3RkaWZmLCBnb3Ribm8pKQorCQkJCWdvdGJubyAtPSBhZGp1c3Q7CisJCQllbHNlIGlmIChJU1ZBTElEKGdvdGJubyAtIGFwLT5hbGVuLCBnb3Ribm8pKSB7CisJCQkJZ290Ym5vIC09IGFwLT5hbGVuOworCQkJCWdvdGRpZmYgKz0gYWRqdXN0IC0gYXAtPmFsZW47CisJCQl9IGVsc2UKKwkJCQlnb3RkaWZmICs9IGFkanVzdDsKKwkJCS8qCisJCQkgKiBJZiB0aGUgZmlyc3RibG9jayBmb3JiaWRzIGl0LCBjYW4ndCB1c2UgaXQsCisJCQkgKiBtdXN0IHVzZSBkZWZhdWx0LgorCQkJICovCisJCQlpZiAoIXJ0ICYmICFudWxsZmIgJiYKKwkJCSAgICBYRlNfRlNCX1RPX0FHTk8obXAsIGdvdGJubykgIT0gZmJfYWdubykKKwkJCQlnb3Ribm8gPSBOVUxMRlNCTE9DSzsKKwkJfQorCQkvKgorCQkgKiBObyBuZXh0IGJsb2NrLCBqdXN0IGRlZmF1bHQuCisJCSAqLworCQllbHNlCisJCQlnb3Ribm8gPSBOVUxMRlNCTE9DSzsKKwkJLyoKKwkJICogSWYgYm90aCB2YWxpZCwgcGljayB0aGUgYmV0dGVyIG9uZSwgZWxzZSB0aGUgb25seSBnb29kCisJCSAqIG9uZSwgZWxzZSBhcC0+cnZhbCBpcyBhbHJlYWR5IHNldCAodG8gMCBvciB0aGUgaW5vZGUgYmxvY2spLgorCQkgKi8KKwkJaWYgKHByZXZibm8gIT0gTlVMTEZTQkxPQ0sgJiYgZ290Ym5vICE9IE5VTExGU0JMT0NLKQorCQkJYXAtPnJ2YWwgPSBwcmV2ZGlmZiA8PSBnb3RkaWZmID8gcHJldmJubyA6IGdvdGJubzsKKwkJZWxzZSBpZiAocHJldmJubyAhPSBOVUxMRlNCTE9DSykKKwkJCWFwLT5ydmFsID0gcHJldmJubzsKKwkJZWxzZSBpZiAoZ290Ym5vICE9IE5VTExGU0JMT0NLKQorCQkJYXAtPnJ2YWwgPSBnb3Ribm87CisJfQorCS8qCisJICogSWYgYWxsb3dlZCwgdXNlIGFwLT5ydmFsOyBvdGhlcndpc2UgbXVzdCB1c2UgZmlyc3RibG9jayBzaW5jZQorCSAqIGl0J3MgaW4gdGhlIHJpZ2h0IGFsbG9jYXRpb24gZ3JvdXAuCisJICovCisJaWYgKG51bGxmYiB8fCBydCB8fCBYRlNfRlNCX1RPX0FHTk8obXAsIGFwLT5ydmFsKSA9PSBmYl9hZ25vKQorCQk7CisJZWxzZQorCQlhcC0+cnZhbCA9IGFwLT5maXJzdGJsb2NrOworCS8qCisJICogUmVhbHRpbWUgYWxsb2NhdGlvbiwgZG9uZSB0aHJvdWdoIHhmc19ydGFsbG9jYXRlX2V4dGVudC4KKwkgKi8KKwlpZiAocnQpIHsKKyNpZm5kZWYgX19LRVJORUxfXworCQlBU1NFUlQoMCk7CisjZWxzZQorCQl4ZnNfcnRibG9ja190CXJ0YjsKKworCQlhdHlwZSA9IGFwLT5ydmFsID09IDAgPworCQkJWEZTX0FMTE9DVFlQRV9BTllfQUcgOiBYRlNfQUxMT0NUWVBFX05FQVJfQk5POworCQlkb19kaXYoYXAtPnJ2YWwsIG1wLT5tX3NiLnNiX3JleHRzaXplKTsKKwkJcnRiID0gYXAtPnJ2YWw7CisJCWFwLT5hbGVuID0gcmFsZW47CisJCWlmICgoZXJyb3IgPSB4ZnNfcnRhbGxvY2F0ZV9leHRlbnQoYXAtPnRwLCBhcC0+cnZhbCwgMSwgYXAtPmFsZW4sCisJCQkJJnJhbGVuLCBhdHlwZSwgYXAtPndhc2RlbCwgcHJvZCwgJnJ0YikpKQorCQkJcmV0dXJuIGVycm9yOworCQlpZiAocnRiID09IE5VTExGU0JMT0NLICYmIHByb2QgPiAxICYmCisJCSAgICAoZXJyb3IgPSB4ZnNfcnRhbGxvY2F0ZV9leHRlbnQoYXAtPnRwLCBhcC0+cnZhbCwgMSwKKwkJCQkJCSAgIGFwLT5hbGVuLCAmcmFsZW4sIGF0eXBlLAorCQkJCQkJICAgYXAtPndhc2RlbCwgMSwgJnJ0YikpKQorCQkJcmV0dXJuIGVycm9yOworCQlhcC0+cnZhbCA9IHJ0YjsKKwkJaWYgKGFwLT5ydmFsICE9IE5VTExGU0JMT0NLKSB7CisJCQlhcC0+cnZhbCAqPSBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKKwkJCXJhbGVuICo9IG1wLT5tX3NiLnNiX3JleHRzaXplOworCQkJYXAtPmFsZW4gPSByYWxlbjsKKwkJCWFwLT5pcC0+aV9kLmRpX25ibG9ja3MgKz0gcmFsZW47CisJCQl4ZnNfdHJhbnNfbG9nX2lub2RlKGFwLT50cCwgYXAtPmlwLCBYRlNfSUxPR19DT1JFKTsKKwkJCWlmIChhcC0+d2FzZGVsKQorCQkJCWFwLT5pcC0+aV9kZWxheWVkX2Jsa3MgLT0gcmFsZW47CisJCQkvKgorCQkJICogQWRqdXN0IHRoZSBkaXNrIHF1b3RhIGFsc28uIFRoaXMgd2FzIHJlc2VydmVkCisJCQkgKiBlYXJsaWVyLgorCQkJICovCisJCQlYRlNfVFJBTlNfTU9EX0RRVU9UX0JZSU5PKG1wLCBhcC0+dHAsIGFwLT5pcCwKKwkJCQlhcC0+d2FzZGVsID8gWEZTX1RSQU5TX0RRX0RFTFJUQkNPVU5UIDoKKwkJCQkJCVhGU19UUkFOU19EUV9SVEJDT1VOVCwKKwkJCQkobG9uZykgcmFsZW4pOworCQl9IGVsc2UKKwkJCWFwLT5hbGVuID0gMDsKKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisJfQorCS8qCisJICogTm9ybWFsIGFsbG9jYXRpb24sIGRvbmUgdGhyb3VnaCB4ZnNfYWxsb2NfdmV4dGVudC4KKwkgKi8KKwllbHNlIHsKKwkJeGZzX2FnbnVtYmVyX3QJYWc7CisJCXhmc19hbGxvY19hcmdfdAlhcmdzOworCQl4ZnNfZXh0bGVuX3QJYmxlbjsKKwkJeGZzX2V4dGxlbl90CWRlbHRhOworCQlpbnQJCWlzYWxpZ25lZDsKKwkJeGZzX2V4dGxlbl90CWxvbmdlc3Q7CisJCXhmc19leHRsZW5fdAluZWVkOworCQl4ZnNfZXh0bGVuX3QJbmV4dG1pbmxlbj0wOworCQlpbnQJCW5vdGluaXQ7CisJCXhmc19wZXJhZ190CSpwYWc7CisJCXhmc19hZ251bWJlcl90CXN0YXJ0YWc7CisJCWludAkJdHJ5YWdhaW47CisKKwkJdHJ5YWdhaW4gPSBpc2FsaWduZWQgPSAwOworCQlhcmdzLnRwID0gYXAtPnRwOworCQlhcmdzLm1wID0gbXA7CisJCWFyZ3MuZnNibm8gPSBhcC0+cnZhbDsKKwkJYXJncy5tYXhsZW4gPSBNSU4oYXAtPmFsZW4sIG1wLT5tX3NiLnNiX2FnYmxvY2tzKTsKKwkJYmxlbiA9IDA7CisJCWlmIChudWxsZmIpIHsKKwkJCWFyZ3MudHlwZSA9IFhGU19BTExPQ1RZUEVfU1RBUlRfQk5POworCQkJYXJncy50b3RhbCA9IGFwLT50b3RhbDsKKwkJCS8qCisJCQkgKiBGaW5kIHRoZSBsb25nZXN0IGF2YWlsYWJsZSBzcGFjZS4KKwkJCSAqIFdlJ3JlIGdvaW5nIHRvIHRyeSBmb3IgdGhlIHdob2xlIGFsbG9jYXRpb24gYXQgb25jZS4KKwkJCSAqLworCQkJc3RhcnRhZyA9IGFnID0gWEZTX0ZTQl9UT19BR05PKG1wLCBhcmdzLmZzYm5vKTsKKwkJCW5vdGluaXQgPSAwOworCQkJZG93bl9yZWFkKCZtcC0+bV9wZXJhZ2xvY2spOworCQkJd2hpbGUgKGJsZW4gPCBhcC0+YWxlbikgeworCQkJCXBhZyA9ICZtcC0+bV9wZXJhZ1thZ107CisJCQkJaWYgKCFwYWctPnBhZ2ZfaW5pdCAmJgorCQkJCSAgICAoZXJyb3IgPSB4ZnNfYWxsb2NfcGFnZl9pbml0KG1wLCBhcmdzLnRwLAorCQkJCQkgICAgYWcsIFhGU19BTExPQ19GTEFHX1RSWUxPQ0spKSkgeworCQkJCQl1cF9yZWFkKCZtcC0+bV9wZXJhZ2xvY2spOworCQkJCQlyZXR1cm4gZXJyb3I7CisJCQkJfQorCQkJCS8qCisJCQkJICogU2VlIHhmc19hbGxvY19maXhfZnJlZWxpc3QuLi4KKwkJCQkgKi8KKwkJCQlpZiAocGFnLT5wYWdmX2luaXQpIHsKKwkJCQkJbmVlZCA9IFhGU19NSU5fRlJFRUxJU1RfUEFHKHBhZywgbXApOworCQkJCQlkZWx0YSA9IG5lZWQgPiBwYWctPnBhZ2ZfZmxjb3VudCA/CisJCQkJCQluZWVkIC0gcGFnLT5wYWdmX2ZsY291bnQgOiAwOworCQkJCQlsb25nZXN0ID0gKHBhZy0+cGFnZl9sb25nZXN0ID4gZGVsdGEpID8KKwkJCQkJCShwYWctPnBhZ2ZfbG9uZ2VzdCAtIGRlbHRhKSA6CisJCQkJCQkocGFnLT5wYWdmX2ZsY291bnQgPiAwIHx8CisJCQkJCQkgcGFnLT5wYWdmX2xvbmdlc3QgPiAwKTsKKwkJCQkJaWYgKGJsZW4gPCBsb25nZXN0KQorCQkJCQkJYmxlbiA9IGxvbmdlc3Q7CisJCQkJfSBlbHNlCisJCQkJCW5vdGluaXQgPSAxOworCQkJCWlmICgrK2FnID09IG1wLT5tX3NiLnNiX2FnY291bnQpCisJCQkJCWFnID0gMDsKKwkJCQlpZiAoYWcgPT0gc3RhcnRhZykKKwkJCQkJYnJlYWs7CisJCQl9CisJCQl1cF9yZWFkKCZtcC0+bV9wZXJhZ2xvY2spOworCQkJLyoKKwkJCSAqIFNpbmNlIHRoZSBhYm92ZSBsb29wIGRpZCBhIEJVRl9UUllMT0NLLCBpdCBpcworCQkJICogcG9zc2libGUgdGhhdCB0aGVyZSBpcyBzcGFjZSBmb3IgdGhpcyByZXF1ZXN0LgorCQkJICovCisJCQlpZiAobm90aW5pdCB8fCBibGVuIDwgYXAtPm1pbmxlbikKKwkJCQlhcmdzLm1pbmxlbiA9IGFwLT5taW5sZW47CisJCQkvKgorCQkJICogSWYgdGhlIGJlc3Qgc2VlbiBsZW5ndGggaXMgbGVzcyB0aGFuIHRoZSByZXF1ZXN0CisJCQkgKiBsZW5ndGgsIHVzZSB0aGUgYmVzdCBhcyB0aGUgbWluaW11bS4KKwkJCSAqLworCQkJZWxzZSBpZiAoYmxlbiA8IGFwLT5hbGVuKQorCQkJCWFyZ3MubWlubGVuID0gYmxlbjsKKwkJCS8qCisJCQkgKiBPdGhlcndpc2Ugd2UndmUgc2VlbiBhbiBleHRlbnQgYXMgYmlnIGFzIGFsZW4sCisJCQkgKiB1c2UgdGhhdCBhcyB0aGUgbWluaW11bS4KKwkJCSAqLworCQkJZWxzZQorCQkJCWFyZ3MubWlubGVuID0gYXAtPmFsZW47CisJCX0gZWxzZSBpZiAoYXAtPmxvdykgeworCQkJYXJncy50eXBlID0gWEZTX0FMTE9DVFlQRV9GSVJTVF9BRzsKKwkJCWFyZ3MudG90YWwgPSBhcmdzLm1pbmxlbiA9IGFwLT5taW5sZW47CisJCX0gZWxzZSB7CisJCQlhcmdzLnR5cGUgPSBYRlNfQUxMT0NUWVBFX05FQVJfQk5POworCQkJYXJncy50b3RhbCA9IGFwLT50b3RhbDsKKwkJCWFyZ3MubWlubGVuID0gYXAtPm1pbmxlbjsKKwkJfQorCQlpZiAoYXAtPmlwLT5pX2QuZGlfZXh0c2l6ZSkgeworCQkJYXJncy5wcm9kID0gYXAtPmlwLT5pX2QuZGlfZXh0c2l6ZTsKKwkJCWlmICgoYXJncy5tb2QgPSAoeGZzX2V4dGxlbl90KWRvX21vZChhcC0+b2ZmLCBhcmdzLnByb2QpKSkKKwkJCQlhcmdzLm1vZCA9ICh4ZnNfZXh0bGVuX3QpKGFyZ3MucHJvZCAtIGFyZ3MubW9kKTsKKwkJfSBlbHNlIGlmIChtcC0+bV9zYi5zYl9ibG9ja3NpemUgPj0gTkJQUCkgeworCQkJYXJncy5wcm9kID0gMTsKKwkJCWFyZ3MubW9kID0gMDsKKwkJfSBlbHNlIHsKKwkJCWFyZ3MucHJvZCA9IE5CUFAgPj4gbXAtPm1fc2Iuc2JfYmxvY2tsb2c7CisJCQlpZiAoKGFyZ3MubW9kID0gKHhmc19leHRsZW5fdCkoZG9fbW9kKGFwLT5vZmYsIGFyZ3MucHJvZCkpKSkKKwkJCQlhcmdzLm1vZCA9ICh4ZnNfZXh0bGVuX3QpKGFyZ3MucHJvZCAtIGFyZ3MubW9kKTsKKwkJfQorCQkvKgorCQkgKiBJZiB3ZSBhcmUgbm90IGxvdyBvbiBhdmFpbGFibGUgZGF0YSBibG9ja3MsIGFuZCB0aGUKKwkJICogdW5kZXJseWluZyBsb2dpY2FsIHZvbHVtZSBtYW5hZ2VyIGlzIGEgc3RyaXBlLCBhbmQKKwkJICogdGhlIGZpbGUgb2Zmc2V0IGlzIHplcm8gdGhlbiB0cnkgdG8gYWxsb2NhdGUgZGF0YQorCQkgKiBibG9ja3Mgb24gc3RyaXBlIHVuaXQgYm91bmRhcnkuCisJCSAqIE5PVEU6IGFwLT5hZW9mIGlzIG9ubHkgc2V0IGlmIHRoZSBhbGxvY2F0aW9uIGxlbmd0aAorCQkgKiBpcyA+PSB0aGUgc3RyaXBlIHVuaXQgYW5kIHRoZSBhbGxvY2F0aW9uIG9mZnNldCBpcworCQkgKiBhdCB0aGUgZW5kIG9mIGZpbGUuCisJCSAqLworCQlpZiAoIWFwLT5sb3cgJiYgYXAtPmFlb2YpIHsKKwkJCWlmICghYXAtPm9mZikgeworCQkJCWFyZ3MuYWxpZ25tZW50ID0gbXAtPm1fZGFsaWduOworCQkJCWF0eXBlID0gYXJncy50eXBlOworCQkJCWlzYWxpZ25lZCA9IDE7CisJCQkJLyoKKwkJCQkgKiBBZGp1c3QgZm9yIGFsaWdubWVudAorCQkJCSAqLworCQkJCWlmIChibGVuID4gYXJncy5hbGlnbm1lbnQgJiYgYmxlbiA8PSBhcC0+YWxlbikKKwkJCQkJYXJncy5taW5sZW4gPSBibGVuIC0gYXJncy5hbGlnbm1lbnQ7CisJCQkJYXJncy5taW5hbGlnbnNsb3AgPSAwOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIEZpcnN0IHRyeSBhbiBleGFjdCBibm8gYWxsb2NhdGlvbi4KKwkJCQkgKiBJZiBpdCBmYWlscyB0aGVuIGRvIGEgbmVhciBvciBzdGFydCBibm8KKwkJCQkgKiBhbGxvY2F0aW9uIHdpdGggYWxpZ25tZW50IHR1cm5lZCBvbi4KKwkJCQkgKi8KKwkJCQlhdHlwZSA9IGFyZ3MudHlwZTsKKwkJCQl0cnlhZ2FpbiA9IDE7CisJCQkJYXJncy50eXBlID0gWEZTX0FMTE9DVFlQRV9USElTX0JOTzsKKwkJCQlhcmdzLmFsaWdubWVudCA9IDE7CisJCQkJLyoKKwkJCQkgKiBDb21wdXRlIHRoZSBtaW5sZW4rYWxpZ25tZW50IGZvciB0aGUKKwkJCQkgKiBuZXh0IGNhc2UuICBTZXQgc2xvcCBzbyB0aGF0IHRoZSB2YWx1ZQorCQkJCSAqIG9mIG1pbmxlbithbGlnbm1lbnQrc2xvcCBkb2Vzbid0IGdvIHVwCisJCQkJICogYmV0d2VlbiB0aGUgY2FsbHMuCisJCQkJICovCisJCQkJaWYgKGJsZW4gPiBtcC0+bV9kYWxpZ24gJiYgYmxlbiA8PSBhcC0+YWxlbikKKwkJCQkJbmV4dG1pbmxlbiA9IGJsZW4gLSBtcC0+bV9kYWxpZ247CisJCQkJZWxzZQorCQkJCQluZXh0bWlubGVuID0gYXJncy5taW5sZW47CisJCQkJaWYgKG5leHRtaW5sZW4gKyBtcC0+bV9kYWxpZ24gPiBhcmdzLm1pbmxlbiArIDEpCisJCQkJCWFyZ3MubWluYWxpZ25zbG9wID0KKwkJCQkJCW5leHRtaW5sZW4gKyBtcC0+bV9kYWxpZ24gLQorCQkJCQkJYXJncy5taW5sZW4gLSAxOworCQkJCWVsc2UKKwkJCQkJYXJncy5taW5hbGlnbnNsb3AgPSAwOworCQkJfQorCQl9IGVsc2UgeworCQkJYXJncy5hbGlnbm1lbnQgPSAxOworCQkJYXJncy5taW5hbGlnbnNsb3AgPSAwOworCQl9CisJCWFyZ3MubWlubGVmdCA9IGFwLT5taW5sZWZ0OworCQlhcmdzLndhc2RlbCA9IGFwLT53YXNkZWw7CisJCWFyZ3MuaXNmbCA9IDA7CisJCWFyZ3MudXNlcmRhdGEgPSBhcC0+dXNlcmRhdGE7CisJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfdmV4dGVudCgmYXJncykpKQorCQkJcmV0dXJuIGVycm9yOworCQlpZiAodHJ5YWdhaW4gJiYgYXJncy5mc2JubyA9PSBOVUxMRlNCTE9DSykgeworCQkJLyoKKwkJCSAqIEV4YWN0IGFsbG9jYXRpb24gZmFpbGVkLiBOb3cgdHJ5IHdpdGggYWxpZ25tZW50CisJCQkgKiB0dXJuZWQgb24uCisJCQkgKi8KKwkJCWFyZ3MudHlwZSA9IGF0eXBlOworCQkJYXJncy5mc2JubyA9IGFwLT5ydmFsOworCQkJYXJncy5hbGlnbm1lbnQgPSBtcC0+bV9kYWxpZ247CisJCQlhcmdzLm1pbmxlbiA9IG5leHRtaW5sZW47CisJCQlhcmdzLm1pbmFsaWduc2xvcCA9IDA7CisJCQlpc2FsaWduZWQgPSAxOworCQkJaWYgKChlcnJvciA9IHhmc19hbGxvY192ZXh0ZW50KCZhcmdzKSkpCisJCQkJcmV0dXJuIGVycm9yOworCQl9CisJCWlmIChpc2FsaWduZWQgJiYgYXJncy5mc2JubyA9PSBOVUxMRlNCTE9DSykgeworCQkJLyoKKwkJCSAqIGFsbG9jYXRpb24gZmFpbGVkLCBzbyB0dXJuIG9mZiBhbGlnbm1lbnQgYW5kCisJCQkgKiB0cnkgYWdhaW4uCisJCQkgKi8KKwkJCWFyZ3MudHlwZSA9IGF0eXBlOworCQkJYXJncy5mc2JubyA9IGFwLT5ydmFsOworCQkJYXJncy5hbGlnbm1lbnQgPSAwOworCQkJaWYgKChlcnJvciA9IHhmc19hbGxvY192ZXh0ZW50KCZhcmdzKSkpCisJCQkJcmV0dXJuIGVycm9yOworCQl9CisJCWlmIChhcmdzLmZzYm5vID09IE5VTExGU0JMT0NLICYmIG51bGxmYiAmJgorCQkgICAgYXJncy5taW5sZW4gPiBhcC0+bWlubGVuKSB7CisJCQlhcmdzLm1pbmxlbiA9IGFwLT5taW5sZW47CisJCQlhcmdzLnR5cGUgPSBYRlNfQUxMT0NUWVBFX1NUQVJUX0JOTzsKKwkJCWFyZ3MuZnNibm8gPSBhcC0+cnZhbDsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfdmV4dGVudCgmYXJncykpKQorCQkJCXJldHVybiBlcnJvcjsKKwkJfQorCQlpZiAoYXJncy5mc2JubyA9PSBOVUxMRlNCTE9DSyAmJiBudWxsZmIpIHsKKwkJCWFyZ3MuZnNibm8gPSAwOworCQkJYXJncy50eXBlID0gWEZTX0FMTE9DVFlQRV9GSVJTVF9BRzsKKwkJCWFyZ3MudG90YWwgPSBhcC0+bWlubGVuOworCQkJYXJncy5taW5sZWZ0ID0gMDsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfdmV4dGVudCgmYXJncykpKQorCQkJCXJldHVybiBlcnJvcjsKKwkJCWFwLT5sb3cgPSAxOworCQl9CisJCWlmIChhcmdzLmZzYm5vICE9IE5VTExGU0JMT0NLKSB7CisJCQlhcC0+Zmlyc3RibG9jayA9IGFwLT5ydmFsID0gYXJncy5mc2JubzsKKwkJCUFTU0VSVChudWxsZmIgfHwgZmJfYWdubyA9PSBhcmdzLmFnbm8gfHwKKwkJCSAgICAgICAoYXAtPmxvdyAmJiBmYl9hZ25vIDwgYXJncy5hZ25vKSk7CisJCQlhcC0+YWxlbiA9IGFyZ3MubGVuOworCQkJYXAtPmlwLT5pX2QuZGlfbmJsb2NrcyArPSBhcmdzLmxlbjsKKwkJCXhmc190cmFuc19sb2dfaW5vZGUoYXAtPnRwLCBhcC0+aXAsIFhGU19JTE9HX0NPUkUpOworCQkJaWYgKGFwLT53YXNkZWwpCisJCQkJYXAtPmlwLT5pX2RlbGF5ZWRfYmxrcyAtPSBhcmdzLmxlbjsKKwkJCS8qCisJCQkgKiBBZGp1c3QgdGhlIGRpc2sgcXVvdGEgYWxzby4gVGhpcyB3YXMgcmVzZXJ2ZWQKKwkJCSAqIGVhcmxpZXIuCisJCQkgKi8KKwkJCVhGU19UUkFOU19NT0RfRFFVT1RfQllJTk8obXAsIGFwLT50cCwgYXAtPmlwLAorCQkJCWFwLT53YXNkZWwgPyBYRlNfVFJBTlNfRFFfREVMQkNPVU5UIDoKKwkJCQkJCVhGU19UUkFOU19EUV9CQ09VTlQsCisJCQkJKGxvbmcpIGFyZ3MubGVuKTsKKwkJfSBlbHNlIHsKKwkJCWFwLT5ydmFsID0gTlVMTEZTQkxPQ0s7CisJCQlhcC0+YWxlbiA9IDA7CisJCX0KKwl9CisJcmV0dXJuIDA7CisjdW5kZWYJSVNWQUxJRAorfQorCisvKgorICogVHJhbnNmb3JtIGEgYnRyZWUgZm9ybWF0IGZpbGUgd2l0aCBvbmx5IG9uZSBsZWFmIG5vZGUsIHdoZXJlIHRoZQorICogZXh0ZW50cyBsaXN0IHdpbGwgZml0IGluIHRoZSBpbm9kZSwgaW50byBhbiBleHRlbnRzIGZvcm1hdCBmaWxlLgorICogU2luY2UgdGhlIGV4dGVudCBsaXN0IGlzIGFscmVhZHkgaW4tY29yZSwgYWxsIHdlIGhhdmUgdG8gZG8gaXMKKyAqIGdpdmUgdXAgdGhlIHNwYWNlIGZvciB0aGUgYnRyZWUgcm9vdCBhbmQgcGl0Y2ggdGhlIGxlYWYgYmxvY2suCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19ibWFwX2J0cmVlX3RvX2V4dGVudHMoCisJeGZzX3RyYW5zX3QJCSp0cCwJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19pbm9kZV90CQkqaXAsCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCQkqbG9nZmxhZ3NwLCAvKiBpbm9kZSBsb2dnaW5nIGZsYWdzICovCisJaW50CQkJd2hpY2hmb3JrKSAgLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KK3sKKwkvKiBSRUZFUkVOQ0VEICovCisJeGZzX2JtYnRfYmxvY2tfdAkqY2Jsb2NrOy8qIGNoaWxkIGJ0cmVlIGJsb2NrICovCisJeGZzX2ZzYmxvY2tfdAkJY2JubzsJLyogY2hpbGQgYmxvY2sgbnVtYmVyICovCisJeGZzX2J1Zl90CQkqY2JwOwkvKiBjaGlsZCBibG9jaydzIGJ1ZmZlciAqLworCWludAkJCWVycm9yOwkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwl4ZnNfaWZvcmtfdAkJKmlmcDsJLyogaW5vZGUgZm9yayBkYXRhICovCisJeGZzX21vdW50X3QJCSptcDsJLyogbW91bnQgcG9pbnQgc3RydWN0dXJlICovCisJeGZzX2JtYnRfcHRyX3QJCSpwcDsJLyogcHRyIHRvIGJsb2NrIGFkZHJlc3MgKi8KKwl4ZnNfYm1idF9ibG9ja190CSpyYmxvY2s7Lyogcm9vdCBidHJlZSBibG9jayAqLworCisJaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgd2hpY2hmb3JrKTsKKwlBU1NFUlQoaWZwLT5pZl9mbGFncyAmIFhGU19JRkVYVEVOVFMpOworCUFTU0VSVChYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspID09IFhGU19ESU5PREVfRk1UX0JUUkVFKTsKKwlyYmxvY2sgPSBpZnAtPmlmX2Jyb290OworCUFTU0VSVChJTlRfR0VUKHJibG9jay0+YmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCkgPT0gMSk7CisJQVNTRVJUKElOVF9HRVQocmJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpID09IDEpOworCUFTU0VSVChYRlNfQk1BUF9CUk9PVF9NQVhSRUNTKGlmcC0+aWZfYnJvb3RfYnl0ZXMpID09IDEpOworCW1wID0gaXAtPmlfbW91bnQ7CisJcHAgPSBYRlNfQk1BUF9CUk9PVF9QVFJfQUREUihyYmxvY2ssIDEsIGlmcC0+aWZfYnJvb3RfYnl0ZXMpOworCSpsb2dmbGFnc3AgPSAwOworI2lmZGVmIERFQlVHCisJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19scHRyKGN1ciwgSU5UX0dFVCgqcHAsIEFSQ0hfQ09OVkVSVCksIDEpKSkKKwkJcmV0dXJuIGVycm9yOworI2VuZGlmCisJY2JubyA9IElOVF9HRVQoKnBwLCBBUkNIX0NPTlZFUlQpOworCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZsKG1wLCB0cCwgY2JubywgMCwgJmNicCwKKwkJCVhGU19CTUFQX0JUUkVFX1JFRikpKQorCQlyZXR1cm4gZXJyb3I7CisJY2Jsb2NrID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKGNicCk7CisJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19sYmxvY2soY3VyLCBjYmxvY2ssIDAsIGNicCkpKQorCQlyZXR1cm4gZXJyb3I7CisJeGZzX2JtYXBfYWRkX2ZyZWUoY2JubywgMSwgY3VyLT5iY19wcml2YXRlLmIuZmxpc3QsIG1wKTsKKwlpcC0+aV9kLmRpX25ibG9ja3MtLTsKKwlYRlNfVFJBTlNfTU9EX0RRVU9UX0JZSU5PKG1wLCB0cCwgaXAsIFhGU19UUkFOU19EUV9CQ09VTlQsIC0xTCk7CisJeGZzX3RyYW5zX2JpbnZhbCh0cCwgY2JwKTsKKwlpZiAoY3VyLT5iY19idWZzWzBdID09IGNicCkKKwkJY3VyLT5iY19idWZzWzBdID0gTlVMTDsKKwl4ZnNfaXJvb3RfcmVhbGxvYyhpcCwgLTEsIHdoaWNoZm9yayk7CisJQVNTRVJUKGlmcC0+aWZfYnJvb3QgPT0gTlVMTCk7CisJQVNTRVJUKChpZnAtPmlmX2ZsYWdzICYgWEZTX0lGQlJPT1QpID09IDApOworCVhGU19JRk9SS19GTVRfU0VUKGlwLCB3aGljaGZvcmssIFhGU19ESU5PREVfRk1UX0VYVEVOVFMpOworCSpsb2dmbGFnc3AgPSBYRlNfSUxPR19DT1JFIHwgWEZTX0lMT0dfRkVYVCh3aGljaGZvcmspOworCXJldHVybiAwOworfQorCisvKgorICogQ2FsbGVkIGJ5IHhmc19ibWFwaSB0byB1cGRhdGUgZXh0ZW50IGxpc3Qgc3RydWN0dXJlIGFuZCB0aGUgYnRyZWUKKyAqIGFmdGVyIHJlbW92aW5nIHNwYWNlIChvciB1bmRvaW5nIGEgZGVsYXllZCBhbGxvY2F0aW9uKS4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX2JtYXBfZGVsX2V4dGVudCgKKwl4ZnNfaW5vZGVfdAkJKmlwLAkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLworCXhmc190cmFuc190CQkqdHAsCS8qIGN1cnJlbnQgdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19leHRudW1fdAkJaWR4LAkvKiBleHRlbnQgbnVtYmVyIHRvIHVwZGF0ZS9kZWxldGUgKi8KKwl4ZnNfYm1hcF9mcmVlX3QJCSpmbGlzdCwJLyogbGlzdCBvZiBleHRlbnRzIHRvIGJlIGZyZWVkICovCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBpZiBudWxsLCBub3QgYSBidHJlZSAqLworCXhmc19ibWJ0X2lyZWNfdAkJKmRlbCwJLyogZGF0YSB0byByZW1vdmUgZnJvbSBleHRlbnQgbGlzdCAqLworCWludAkJCSpsb2dmbGFnc3AsIC8qIGlub2RlIGxvZ2dpbmcgZmxhZ3MgKi8KKwlpbnQJCQl3aGljaGZvcmssIC8qIGRhdGEgb3IgYXR0ciBmb3JrICovCisJaW50CQkJcnN2ZCkJLyogT0sgdG8gYWxsb2NhdGUgcmVzZXJ2ZWQgYmxvY2tzICovCit7CisJeGZzX2ZpbGJsa3NfdAkJZGFfbmV3OwkvKiBuZXcgZGVsYXktYWxsb2MgaW5kaXJlY3QgYmxvY2tzICovCisJeGZzX2ZpbGJsa3NfdAkJZGFfb2xkOwkvKiBvbGQgZGVsYXktYWxsb2MgaW5kaXJlY3QgYmxvY2tzICovCisJeGZzX2ZzYmxvY2tfdAkJZGVsX2VuZGJsb2NrPTA7CS8qIGZpcnN0IGJsb2NrIHBhc3QgZGVsICovCisJeGZzX2ZpbGVvZmZfdAkJZGVsX2VuZG9mZjsJLyogZmlyc3Qgb2Zmc2V0IHBhc3QgZGVsICovCisJaW50CQkJZGVsYXk7CS8qIGN1cnJlbnQgYmxvY2sgaXMgZGVsYXllZCBhbGxvY2F0ZWQgKi8KKwlpbnQJCQlkb19meDsJLyogZnJlZSBleHRlbnQgYXQgZW5kIG9mIHJvdXRpbmUgKi8KKwl4ZnNfYm1idF9yZWNfdAkJKmVwOwkvKiBjdXJyZW50IGV4dGVudCBlbnRyeSBwb2ludGVyICovCisJaW50CQkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCWludAkJCWZsYWdzOwkvKiBpbm9kZSBsb2dnaW5nIGZsYWdzICovCisjaWZkZWYgWEZTX0JNQVBfVFJBQ0UKKwlzdGF0aWMgY2hhcgkJZm5hbWVbXSA9ICJ4ZnNfYm1hcF9kZWxfZXh0ZW50IjsKKyNlbmRpZgorCXhmc19ibWJ0X2lyZWNfdAkJZ290OwkvKiBjdXJyZW50IGV4dGVudCBlbnRyeSAqLworCXhmc19maWxlb2ZmX3QJCWdvdF9lbmRvZmY7CS8qIGZpcnN0IG9mZnNldCBwYXN0IGdvdCAqLworCWludAkJCWk7CS8qIHRlbXAgc3RhdGUgKi8KKwl4ZnNfaWZvcmtfdAkJKmlmcDsJLyogaW5vZGUgZm9yayBwb2ludGVyICovCisJeGZzX21vdW50X3QJCSptcDsJLyogbW91bnQgc3RydWN0dXJlICovCisJeGZzX2ZpbGJsa3NfdAkJbmJsa3M7CS8qIHF1b3RhL3NiIGJsb2NrIGNvdW50ICovCisJeGZzX2JtYnRfaXJlY190CQluZXc7CS8qIG5ldyByZWNvcmQgdG8gYmUgaW5zZXJ0ZWQgKi8KKwkvKiBSRUZFUkVOQ0VEICovCisJeGZzX2V4dG51bV90CQluZXh0ZW50czsJLyogbnVtYmVyIG9mIGV4dGVudHMgaW4gbGlzdCAqLworCXVpbnQJCQlxZmllbGQ7CS8qIHF1b3RhIGZpZWxkIHRvIHVwZGF0ZSAqLworCXhmc19maWxibGtzX3QJCXRlbXA7CS8qIGZvciBpbmRpcmVjdCBsZW5ndGggY2FsY3VsYXRpb25zICovCisJeGZzX2ZpbGJsa3NfdAkJdGVtcDI7CS8qIGZvciBpbmRpcmVjdCBsZW5ndGggY2FsY3VsYXRpb25zICovCisKKwlYRlNfU1RBVFNfSU5DKHhzX2RlbF9leGxpc3QpOworCW1wID0gaXAtPmlfbW91bnQ7CisJaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgd2hpY2hmb3JrKTsKKwluZXh0ZW50cyA9IGlmcC0+aWZfYnl0ZXMgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpOworCUFTU0VSVChpZHggPj0gMCAmJiBpZHggPCBuZXh0ZW50cyk7CisJQVNTRVJUKGRlbC0+YnJfYmxvY2tjb3VudCA+IDApOworCWVwID0gJmlmcC0+aWZfdTEuaWZfZXh0ZW50c1tpZHhdOworCXhmc19ibWJ0X2dldF9hbGwoZXAsICZnb3QpOworCUFTU0VSVChnb3QuYnJfc3RhcnRvZmYgPD0gZGVsLT5icl9zdGFydG9mZik7CisJZGVsX2VuZG9mZiA9IGRlbC0+YnJfc3RhcnRvZmYgKyBkZWwtPmJyX2Jsb2NrY291bnQ7CisJZ290X2VuZG9mZiA9IGdvdC5icl9zdGFydG9mZiArIGdvdC5icl9ibG9ja2NvdW50OworCUFTU0VSVChnb3RfZW5kb2ZmID49IGRlbF9lbmRvZmYpOworCWRlbGF5ID0gSVNOVUxMU1RBUlRCTE9DSyhnb3QuYnJfc3RhcnRibG9jayk7CisJQVNTRVJUKElTTlVMTFNUQVJUQkxPQ0soZGVsLT5icl9zdGFydGJsb2NrKSA9PSBkZWxheSk7CisJZmxhZ3MgPSAwOworCXFmaWVsZCA9IDA7CisJZXJyb3IgPSAwOworCS8qCisJICogSWYgZGVsZXRpbmcgYSByZWFsIGFsbG9jYXRpb24sIG11c3QgZnJlZSB1cCB0aGUgZGlzayBzcGFjZS4KKwkgKi8KKwlpZiAoIWRlbGF5KSB7CisJCWZsYWdzID0gWEZTX0lMT0dfQ09SRTsKKwkJLyoKKwkJICogUmVhbHRpbWUgYWxsb2NhdGlvbi4gIEZyZWUgaXQgYW5kIHJlY29yZCBkaV9uYmxvY2tzIHVwZGF0ZS4KKwkJICovCisJCWlmICh3aGljaGZvcmsgPT0gWEZTX0RBVEFfRk9SSyAmJgorCQkgICAgKGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FKSkgeworCQkJeGZzX2ZzYmxvY2tfdAlibm87CisJCQl4ZnNfZmlsYmxrc190CWxlbjsKKworCQkJQVNTRVJUKGRvX21vZChkZWwtPmJyX2Jsb2NrY291bnQsCisJCQkJICAgICAgbXAtPm1fc2Iuc2JfcmV4dHNpemUpID09IDApOworCQkJQVNTRVJUKGRvX21vZChkZWwtPmJyX3N0YXJ0YmxvY2ssCisJCQkJICAgICAgbXAtPm1fc2Iuc2JfcmV4dHNpemUpID09IDApOworCQkJYm5vID0gZGVsLT5icl9zdGFydGJsb2NrOworCQkJbGVuID0gZGVsLT5icl9ibG9ja2NvdW50OworCQkJZG9fZGl2KGJubywgbXAtPm1fc2Iuc2JfcmV4dHNpemUpOworCQkJZG9fZGl2KGxlbiwgbXAtPm1fc2Iuc2JfcmV4dHNpemUpOworCQkJaWYgKChlcnJvciA9IHhmc19ydGZyZWVfZXh0ZW50KGlwLT5pX3RyYW5zcCwgYm5vLAorCQkJCQkoeGZzX2V4dGxlbl90KWxlbikpKQorCQkJCWdvdG8gZG9uZTsKKwkJCWRvX2Z4ID0gMDsKKwkJCW5ibGtzID0gbGVuICogbXAtPm1fc2Iuc2JfcmV4dHNpemU7CisJCQlxZmllbGQgPSBYRlNfVFJBTlNfRFFfUlRCQ09VTlQ7CisJCX0KKwkJLyoKKwkJICogT3JkaW5hcnkgYWxsb2NhdGlvbi4KKwkJICovCisJCWVsc2UgeworCQkJZG9fZnggPSAxOworCQkJbmJsa3MgPSBkZWwtPmJyX2Jsb2NrY291bnQ7CisJCQlxZmllbGQgPSBYRlNfVFJBTlNfRFFfQkNPVU5UOworCQl9CisJCS8qCisJCSAqIFNldCB1cCBkZWxfZW5kYmxvY2sgYW5kIGN1ciBmb3IgbGF0ZXIuCisJCSAqLworCQlkZWxfZW5kYmxvY2sgPSBkZWwtPmJyX3N0YXJ0YmxvY2sgKyBkZWwtPmJyX2Jsb2NrY291bnQ7CisJCWlmIChjdXIpIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9sb29rdXBfZXEoY3VyLCBnb3QuYnJfc3RhcnRvZmYsCisJCQkJCWdvdC5icl9zdGFydGJsb2NrLCBnb3QuYnJfYmxvY2tjb3VudCwKKwkJCQkJJmkpKSkKKwkJCQlnb3RvIGRvbmU7CisJCQlBU1NFUlQoaSA9PSAxKTsKKwkJfQorCQlkYV9vbGQgPSBkYV9uZXcgPSAwOworCX0gZWxzZSB7CisJCWRhX29sZCA9IFNUQVJUQkxPQ0tWQUwoZ290LmJyX3N0YXJ0YmxvY2spOworCQlkYV9uZXcgPSAwOworCQluYmxrcyA9IDA7CisJCWRvX2Z4ID0gMDsKKwl9CisJLyoKKwkgKiBTZXQgZmxhZyB2YWx1ZSB0byB1c2UgaW4gc3dpdGNoIHN0YXRlbWVudC4KKwkgKiBMZWZ0LWNvbnRpZyBpcyAyLCByaWdodC1jb250aWcgaXMgMS4KKwkgKi8KKwlzd2l0Y2ggKCgoZ290LmJyX3N0YXJ0b2ZmID09IGRlbC0+YnJfc3RhcnRvZmYpIDw8IDEpIHwKKwkJKGdvdF9lbmRvZmYgPT0gZGVsX2VuZG9mZikpIHsKKwljYXNlIDM6CisJCS8qCisJCSAqIE1hdGNoZXMgdGhlIHdob2xlIGV4dGVudC4gIERlbGV0ZSB0aGUgZW50cnkuCisJCSAqLworCQl4ZnNfYm1hcF90cmFjZV9kZWxldGUoZm5hbWUsICIzIiwgaXAsIGlkeCwgMSwgd2hpY2hmb3JrKTsKKwkJeGZzX2JtYXBfZGVsZXRlX2V4bGlzdChpcCwgaWR4LCAxLCB3aGljaGZvcmspOworCQlpZnAtPmlmX2xhc3RleCA9IGlkeDsKKwkJaWYgKGRlbGF5KQorCQkJYnJlYWs7CisJCVhGU19JRk9SS19ORVhUX1NFVChpcCwgd2hpY2hmb3JrLAorCQkJWEZTX0lGT1JLX05FWFRFTlRTKGlwLCB3aGljaGZvcmspIC0gMSk7CisJCWZsYWdzIHw9IFhGU19JTE9HX0NPUkU7CisJCWlmICghY3VyKSB7CisJCQlmbGFncyB8PSBYRlNfSUxPR19GRVhUKHdoaWNoZm9yayk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoKGVycm9yID0geGZzX2JtYnRfZGVsZXRlKGN1ciwgJmkpKSkKKwkJCWdvdG8gZG9uZTsKKwkJQVNTRVJUKGkgPT0gMSk7CisJCWJyZWFrOworCisJY2FzZSAyOgorCQkvKgorCQkgKiBEZWxldGluZyB0aGUgZmlyc3QgcGFydCBvZiB0aGUgZXh0ZW50LgorCQkgKi8KKwkJeGZzX2JtYXBfdHJhY2VfcHJlX3VwZGF0ZShmbmFtZSwgIjIiLCBpcCwgaWR4LCB3aGljaGZvcmspOworCQl4ZnNfYm1idF9zZXRfc3RhcnRvZmYoZXAsIGRlbF9lbmRvZmYpOworCQl0ZW1wID0gZ290LmJyX2Jsb2NrY291bnQgLSBkZWwtPmJyX2Jsb2NrY291bnQ7CisJCXhmc19ibWJ0X3NldF9ibG9ja2NvdW50KGVwLCB0ZW1wKTsKKwkJaWZwLT5pZl9sYXN0ZXggPSBpZHg7CisJCWlmIChkZWxheSkgeworCQkJdGVtcCA9IFhGU19GSUxCTEtTX01JTih4ZnNfYm1hcF93b3JzdF9pbmRsZW4oaXAsIHRlbXApLAorCQkJCWRhX29sZCk7CisJCQl4ZnNfYm1idF9zZXRfc3RhcnRibG9jayhlcCwgTlVMTFNUQVJUQkxPQ0soKGludCl0ZW1wKSk7CisJCQl4ZnNfYm1hcF90cmFjZV9wb3N0X3VwZGF0ZShmbmFtZSwgIjIiLCBpcCwgaWR4LAorCQkJCXdoaWNoZm9yayk7CisJCQlkYV9uZXcgPSB0ZW1wOworCQkJYnJlYWs7CisJCX0KKwkJeGZzX2JtYnRfc2V0X3N0YXJ0YmxvY2soZXAsIGRlbF9lbmRibG9jayk7CisJCXhmc19ibWFwX3RyYWNlX3Bvc3RfdXBkYXRlKGZuYW1lLCAiMiIsIGlwLCBpZHgsIHdoaWNoZm9yayk7CisJCWlmICghY3VyKSB7CisJCQlmbGFncyB8PSBYRlNfSUxPR19GRVhUKHdoaWNoZm9yayk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoKGVycm9yID0geGZzX2JtYnRfdXBkYXRlKGN1ciwgZGVsX2VuZG9mZiwgZGVsX2VuZGJsb2NrLAorCQkJCWdvdC5icl9ibG9ja2NvdW50IC0gZGVsLT5icl9ibG9ja2NvdW50LAorCQkJCWdvdC5icl9zdGF0ZSkpKQorCQkJZ290byBkb25lOworCQlicmVhazsKKworCWNhc2UgMToKKwkJLyoKKwkJICogRGVsZXRpbmcgdGhlIGxhc3QgcGFydCBvZiB0aGUgZXh0ZW50LgorCQkgKi8KKwkJdGVtcCA9IGdvdC5icl9ibG9ja2NvdW50IC0gZGVsLT5icl9ibG9ja2NvdW50OworCQl4ZnNfYm1hcF90cmFjZV9wcmVfdXBkYXRlKGZuYW1lLCAiMSIsIGlwLCBpZHgsIHdoaWNoZm9yayk7CisJCXhmc19ibWJ0X3NldF9ibG9ja2NvdW50KGVwLCB0ZW1wKTsKKwkJaWZwLT5pZl9sYXN0ZXggPSBpZHg7CisJCWlmIChkZWxheSkgeworCQkJdGVtcCA9IFhGU19GSUxCTEtTX01JTih4ZnNfYm1hcF93b3JzdF9pbmRsZW4oaXAsIHRlbXApLAorCQkJCWRhX29sZCk7CisJCQl4ZnNfYm1idF9zZXRfc3RhcnRibG9jayhlcCwgTlVMTFNUQVJUQkxPQ0soKGludCl0ZW1wKSk7CisJCQl4ZnNfYm1hcF90cmFjZV9wb3N0X3VwZGF0ZShmbmFtZSwgIjEiLCBpcCwgaWR4LAorCQkJCXdoaWNoZm9yayk7CisJCQlkYV9uZXcgPSB0ZW1wOworCQkJYnJlYWs7CisJCX0KKwkJeGZzX2JtYXBfdHJhY2VfcG9zdF91cGRhdGUoZm5hbWUsICIxIiwgaXAsIGlkeCwgd2hpY2hmb3JrKTsKKwkJaWYgKCFjdXIpIHsKKwkJCWZsYWdzIHw9IFhGU19JTE9HX0ZFWFQod2hpY2hmb3JrKTsKKwkJCWJyZWFrOworCQl9CisJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF91cGRhdGUoY3VyLCBnb3QuYnJfc3RhcnRvZmYsCisJCQkJZ290LmJyX3N0YXJ0YmxvY2ssCisJCQkJZ290LmJyX2Jsb2NrY291bnQgLSBkZWwtPmJyX2Jsb2NrY291bnQsCisJCQkJZ290LmJyX3N0YXRlKSkpCisJCQlnb3RvIGRvbmU7CisJCWJyZWFrOworCisJY2FzZSAwOgorCQkvKgorCQkgKiBEZWxldGluZyB0aGUgbWlkZGxlIG9mIHRoZSBleHRlbnQuCisJCSAqLworCQl0ZW1wID0gZGVsLT5icl9zdGFydG9mZiAtIGdvdC5icl9zdGFydG9mZjsKKwkJeGZzX2JtYXBfdHJhY2VfcHJlX3VwZGF0ZShmbmFtZSwgIjAiLCBpcCwgaWR4LCB3aGljaGZvcmspOworCQl4ZnNfYm1idF9zZXRfYmxvY2tjb3VudChlcCwgdGVtcCk7CisJCW5ldy5icl9zdGFydG9mZiA9IGRlbF9lbmRvZmY7CisJCXRlbXAyID0gZ290X2VuZG9mZiAtIGRlbF9lbmRvZmY7CisJCW5ldy5icl9ibG9ja2NvdW50ID0gdGVtcDI7CisJCW5ldy5icl9zdGF0ZSA9IGdvdC5icl9zdGF0ZTsKKwkJaWYgKCFkZWxheSkgeworCQkJbmV3LmJyX3N0YXJ0YmxvY2sgPSBkZWxfZW5kYmxvY2s7CisJCQlmbGFncyB8PSBYRlNfSUxPR19DT1JFOworCQkJaWYgKGN1cikgeworCQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF91cGRhdGUoY3VyLAorCQkJCQkJZ290LmJyX3N0YXJ0b2ZmLAorCQkJCQkJZ290LmJyX3N0YXJ0YmxvY2ssIHRlbXAsCisJCQkJCQlnb3QuYnJfc3RhdGUpKSkKKwkJCQkJZ290byBkb25lOworCQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9pbmNyZW1lbnQoY3VyLCAwLCAmaSkpKQorCQkJCQlnb3RvIGRvbmU7CisJCQkJY3VyLT5iY19yZWMuYiA9IG5ldzsKKwkJCQllcnJvciA9IHhmc19ibWJ0X2luc2VydChjdXIsICZpKTsKKwkJCQlpZiAoZXJyb3IgJiYgZXJyb3IgIT0gRU5PU1BDKQorCQkJCQlnb3RvIGRvbmU7CisJCQkJLyoKKwkJCQkgKiBJZiBnZXQgbm8tc3BhY2UgYmFjayBmcm9tIGJ0cmVlIGluc2VydCwKKwkJCQkgKiBpdCB0cmllZCBhIHNwbGl0LCBhbmQgd2UgaGF2ZSBhIHplcm8KKwkJCQkgKiBibG9jayByZXNlcnZhdGlvbi4KKwkJCQkgKiBGaXggdXAgb3VyIHN0YXRlIGFuZCByZXR1cm4gdGhlIGVycm9yLgorCQkJCSAqLworCQkJCWlmIChlcnJvciA9PSBFTk9TUEMpIHsKKwkJCQkJLyoKKwkJCQkJICogUmVzZXQgdGhlIGN1cnNvciwgZG9uJ3QgdHJ1c3QKKwkJCQkJICogaXQgYWZ0ZXIgYW55IGluc2VydCBvcGVyYXRpb24uCisJCQkJCSAqLworCQkJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfbG9va3VwX2VxKGN1ciwKKwkJCQkJCQlnb3QuYnJfc3RhcnRvZmYsCisJCQkJCQkJZ290LmJyX3N0YXJ0YmxvY2ssCisJCQkJCQkJdGVtcCwgJmkpKSkKKwkJCQkJCWdvdG8gZG9uZTsKKwkJCQkJQVNTRVJUKGkgPT0gMSk7CisJCQkJCS8qCisJCQkJCSAqIFVwZGF0ZSB0aGUgYnRyZWUgcmVjb3JkIGJhY2sKKwkJCQkJICogdG8gdGhlIG9yaWdpbmFsIHZhbHVlLgorCQkJCQkgKi8KKwkJCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X3VwZGF0ZShjdXIsCisJCQkJCQkJZ290LmJyX3N0YXJ0b2ZmLAorCQkJCQkJCWdvdC5icl9zdGFydGJsb2NrLAorCQkJCQkJCWdvdC5icl9ibG9ja2NvdW50LAorCQkJCQkJCWdvdC5icl9zdGF0ZSkpKQorCQkJCQkJZ290byBkb25lOworCQkJCQkvKgorCQkJCQkgKiBSZXNldCB0aGUgZXh0ZW50IHJlY29yZCBiYWNrCisJCQkJCSAqIHRvIHRoZSBvcmlnaW5hbCB2YWx1ZS4KKwkJCQkJICovCisJCQkJCXhmc19ibWJ0X3NldF9ibG9ja2NvdW50KGVwLAorCQkJCQkJZ290LmJyX2Jsb2NrY291bnQpOworCQkJCQlmbGFncyA9IDA7CisJCQkJCWVycm9yID0gWEZTX0VSUk9SKEVOT1NQQyk7CisJCQkJCWdvdG8gZG9uZTsKKwkJCQl9CisJCQkJQVNTRVJUKGkgPT0gMSk7CisJCQl9IGVsc2UKKwkJCQlmbGFncyB8PSBYRlNfSUxPR19GRVhUKHdoaWNoZm9yayk7CisJCQlYRlNfSUZPUktfTkVYVF9TRVQoaXAsIHdoaWNoZm9yaywKKwkJCQlYRlNfSUZPUktfTkVYVEVOVFMoaXAsIHdoaWNoZm9yaykgKyAxKTsKKwkJfSBlbHNlIHsKKwkJCUFTU0VSVCh3aGljaGZvcmsgPT0gWEZTX0RBVEFfRk9SSyk7CisJCQl0ZW1wID0geGZzX2JtYXBfd29yc3RfaW5kbGVuKGlwLCB0ZW1wKTsKKwkJCXhmc19ibWJ0X3NldF9zdGFydGJsb2NrKGVwLCBOVUxMU1RBUlRCTE9DSygoaW50KXRlbXApKTsKKwkJCXRlbXAyID0geGZzX2JtYXBfd29yc3RfaW5kbGVuKGlwLCB0ZW1wMik7CisJCQluZXcuYnJfc3RhcnRibG9jayA9IE5VTExTVEFSVEJMT0NLKChpbnQpdGVtcDIpOworCQkJZGFfbmV3ID0gdGVtcCArIHRlbXAyOworCQkJd2hpbGUgKGRhX25ldyA+IGRhX29sZCkgeworCQkJCWlmICh0ZW1wKSB7CisJCQkJCXRlbXAtLTsKKwkJCQkJZGFfbmV3LS07CisJCQkJCXhmc19ibWJ0X3NldF9zdGFydGJsb2NrKGVwLAorCQkJCQkJTlVMTFNUQVJUQkxPQ0soKGludCl0ZW1wKSk7CisJCQkJfQorCQkJCWlmIChkYV9uZXcgPT0gZGFfb2xkKQorCQkJCQlicmVhazsKKwkJCQlpZiAodGVtcDIpIHsKKwkJCQkJdGVtcDItLTsKKwkJCQkJZGFfbmV3LS07CisJCQkJCW5ldy5icl9zdGFydGJsb2NrID0KKwkJCQkJCU5VTExTVEFSVEJMT0NLKChpbnQpdGVtcDIpOworCQkJCX0KKwkJCX0KKwkJfQorCQl4ZnNfYm1hcF90cmFjZV9wb3N0X3VwZGF0ZShmbmFtZSwgIjAiLCBpcCwgaWR4LCB3aGljaGZvcmspOworCQl4ZnNfYm1hcF90cmFjZV9pbnNlcnQoZm5hbWUsICIwIiwgaXAsIGlkeCArIDEsIDEsICZuZXcsIE5VTEwsCisJCQl3aGljaGZvcmspOworCQl4ZnNfYm1hcF9pbnNlcnRfZXhsaXN0KGlwLCBpZHggKyAxLCAxLCAmbmV3LCB3aGljaGZvcmspOworCQlpZnAtPmlmX2xhc3RleCA9IGlkeCArIDE7CisJCWJyZWFrOworCX0KKwkvKgorCSAqIElmIHdlIG5lZWQgdG8sIGFkZCB0byBsaXN0IG9mIGV4dGVudHMgdG8gZGVsZXRlLgorCSAqLworCWlmIChkb19meCkKKwkJeGZzX2JtYXBfYWRkX2ZyZWUoZGVsLT5icl9zdGFydGJsb2NrLCBkZWwtPmJyX2Jsb2NrY291bnQsIGZsaXN0LAorCQkJbXApOworCS8qCisJICogQWRqdXN0IGlub2RlICMgYmxvY2tzIGluIHRoZSBmaWxlLgorCSAqLworCWlmIChuYmxrcykKKwkJaXAtPmlfZC5kaV9uYmxvY2tzIC09IG5ibGtzOworCS8qCisJICogQWRqdXN0IHF1b3RhIGRhdGEuCisJICovCisJaWYgKHFmaWVsZCkKKwkJWEZTX1RSQU5TX01PRF9EUVVPVF9CWUlOTyhtcCwgdHAsIGlwLCBxZmllbGQsIChsb25nKS1uYmxrcyk7CisKKwkvKgorCSAqIEFjY291bnQgZm9yIGNoYW5nZSBpbiBkZWxheWVkIGluZGlyZWN0IGJsb2Nrcy4KKwkgKiBOb3RoaW5nIHRvIGRvIGZvciBkaXNrIHF1b3RhIGFjY291bnRpbmcgaGVyZS4KKwkgKi8KKwlBU1NFUlQoZGFfb2xkID49IGRhX25ldyk7CisJaWYgKGRhX29sZCA+IGRhX25ldykKKwkJeGZzX21vZF9pbmNvcmVfc2IobXAsIFhGU19TQlNfRkRCTE9DS1MsIChpbnQpKGRhX29sZCAtIGRhX25ldyksCisJCQlyc3ZkKTsKK2RvbmU6CisJKmxvZ2ZsYWdzcCA9IGZsYWdzOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIFJlbW92ZSB0aGUgZW50cnkgImZyZWUiIGZyb20gdGhlIGZyZWUgaXRlbSBsaXN0LiAgUHJldiBwb2ludHMgdG8gdGhlCisgKiBwcmV2aW91cyBlbnRyeSwgdW5sZXNzICJmcmVlIiBpcyB0aGUgaGVhZCBvZiB0aGUgbGlzdC4KKyAqLworU1RBVElDIHZvaWQKK3hmc19ibWFwX2RlbF9mcmVlKAorCXhmc19ibWFwX2ZyZWVfdAkJKmZsaXN0LAkvKiBmcmVlIGl0ZW0gbGlzdCBoZWFkZXIgKi8KKwl4ZnNfYm1hcF9mcmVlX2l0ZW1fdAkqcHJldiwJLyogcHJldmlvdXMgaXRlbSBvbiBsaXN0LCBpZiBhbnkgKi8KKwl4ZnNfYm1hcF9mcmVlX2l0ZW1fdAkqZnJlZSkJLyogbGlzdCBpdGVtIHRvIGJlIGZyZWVkICovCit7CisJaWYgKHByZXYpCisJCXByZXYtPnhiZmlfbmV4dCA9IGZyZWUtPnhiZmlfbmV4dDsKKwllbHNlCisJCWZsaXN0LT54YmZfZmlyc3QgPSBmcmVlLT54YmZpX25leHQ7CisJZmxpc3QtPnhiZl9jb3VudC0tOworCWttZW1fem9uZV9mcmVlKHhmc19ibWFwX2ZyZWVfaXRlbV96b25lLCBmcmVlKTsKK30KKworLyoKKyAqIFJlbW92ZSBjb3VudCBlbnRyaWVzIGZyb20gdGhlIGV4dGVudHMgYXJyYXkgZm9yIGlub2RlICJpcCIsIHN0YXJ0aW5nCisgKiBhdCBpbmRleCAiaWR4Ii4gIENvcGllcyB0aGUgcmVtYWluaW5nIGl0ZW1zIGRvd24gb3ZlciB0aGUgZGVsZXRlZCBvbmVzLAorICogYW5kIGdpdmVzIGJhY2sgdGhlIGV4Y2VzcyBtZW1vcnkuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYm1hcF9kZWxldGVfZXhsaXN0KAorCXhmc19pbm9kZV90CSppcCwJCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCisJeGZzX2V4dG51bV90CWlkeCwJCS8qIHN0YXJ0aW5nIGRlbGV0ZSBpbmRleCAqLworCXhmc19leHRudW1fdAljb3VudCwJCS8qIGNvdW50IG9mIGl0ZW1zIHRvIGRlbGV0ZSAqLworCWludAkJd2hpY2hmb3JrKQkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworeworCXhmc19ibWJ0X3JlY190CSpiYXNlOwkJLyogYmFzZSBvZiBleHRlbnQgbGlzdCAqLworCXhmc19pZm9ya190CSppZnA7CQkvKiBpbm9kZSBmb3JrIHBvaW50ZXIgKi8KKwl4ZnNfZXh0bnVtX3QJbmV4dGVudHM7CS8qIG51bWJlciBvZiBleHRlbnRzIGluIGxpc3QgYWZ0ZXIgKi8KKworCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7CisJQVNTRVJUKGlmcC0+aWZfZmxhZ3MgJiBYRlNfSUZFWFRFTlRTKTsKKwliYXNlID0gaWZwLT5pZl91MS5pZl9leHRlbnRzOworCW5leHRlbnRzID0gaWZwLT5pZl9ieXRlcyAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCkgLSBjb3VudDsKKwltZW1tb3ZlKCZiYXNlW2lkeF0sICZiYXNlW2lkeCArIGNvdW50XSwKKwkJKG5leHRlbnRzIC0gaWR4KSAqIHNpemVvZigqYmFzZSkpOworCXhmc19pZXh0X3JlYWxsb2MoaXAsIC1jb3VudCwgd2hpY2hmb3JrKTsKK30KKworLyoKKyAqIENvbnZlcnQgYW4gZXh0ZW50cy1mb3JtYXQgZmlsZSBpbnRvIGEgYnRyZWUtZm9ybWF0IGZpbGUuCisgKiBUaGUgbmV3IGZpbGUgd2lsbCBoYXZlIGEgcm9vdCBibG9jayAoaW4gdGhlIGlub2RlKSBhbmQgYSBzaW5nbGUgY2hpbGQgYmxvY2suCisgKi8KK1NUQVRJQyBpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYm1hcF9leHRlbnRzX3RvX2J0cmVlKAorCXhmc190cmFuc190CQkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2lub2RlX3QJCSppcCwJCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCisJeGZzX2ZzYmxvY2tfdAkJKmZpcnN0YmxvY2ssCS8qIGZpcnN0LWJsb2NrLWFsbG9jYXRlZCAqLworCXhmc19ibWFwX2ZyZWVfdAkJKmZsaXN0LAkJLyogYmxvY2tzIGZyZWVkIGluIHhhY3Rpb24gKi8KKwl4ZnNfYnRyZWVfY3VyX3QJCSoqY3VycCwJCS8qIGN1cnNvciByZXR1cm5lZCB0byBjYWxsZXIgKi8KKwlpbnQJCQl3YXNkZWwsCQkvKiBjb252ZXJ0aW5nIGEgZGVsYXllZCBhbGxvYyAqLworCWludAkJCSpsb2dmbGFnc3AsCS8qIGlub2RlIGxvZ2dpbmcgZmxhZ3MgKi8KKwlpbnQJCQl3aGljaGZvcmspCS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCit7CisJeGZzX2JtYnRfYmxvY2tfdAkqYWJsb2NrOwkvKiBhbGxvY2F0ZWQgKGNoaWxkKSBidCBibG9jayAqLworCXhmc19idWZfdAkJKmFicDsJCS8qIGJ1ZmZlciBmb3IgYWJsb2NrICovCisJeGZzX2FsbG9jX2FyZ190CQlhcmdzOwkJLyogYWxsb2NhdGlvbiBhcmd1bWVudHMgKi8KKwl4ZnNfYm1idF9yZWNfdAkJKmFycDsJCS8qIGNoaWxkIHJlY29yZCBwb2ludGVyICovCisJeGZzX2JtYnRfYmxvY2tfdAkqYmxvY2s7CQkvKiBidHJlZSByb290IGJsb2NrICovCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyOwkJLyogYm1hcCBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfYm1idF9yZWNfdAkJKmVwOwkJLyogZXh0ZW50IGxpc3QgcG9pbnRlciAqLworCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJeGZzX2V4dG51bV90CQlpLCBjbnQ7CQkvKiBleHRlbnQgbGlzdCBpbmRleCAqLworCXhmc19pZm9ya190CQkqaWZwOwkJLyogaW5vZGUgZm9yayBwb2ludGVyICovCisJeGZzX2JtYnRfa2V5X3QJCSprcDsJCS8qIHJvb3QgYmxvY2sga2V5IHBvaW50ZXIgKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkJLyogbW91bnQgc3RydWN0dXJlICovCisJeGZzX2V4dG51bV90CQluZXh0ZW50czsJLyogZXh0ZW50IGxpc3Qgc2l6ZSAqLworCXhmc19ibWJ0X3B0cl90CQkqcHA7CQkvKiByb290IGJsb2NrIGFkZHJlc3MgcG9pbnRlciAqLworCisJaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgd2hpY2hmb3JrKTsKKwlBU1NFUlQoWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTKTsKKwlBU1NFUlQoaWZwLT5pZl9leHRfbWF4ID09CisJICAgICAgIFhGU19JRk9SS19TSVpFKGlwLCB3aGljaGZvcmspIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KSk7CisJLyoKKwkgKiBNYWtlIHNwYWNlIGluIHRoZSBpbm9kZSBpbmNvcmUuCisJICovCisJeGZzX2lyb290X3JlYWxsb2MoaXAsIDEsIHdoaWNoZm9yayk7CisJaWZwLT5pZl9mbGFncyB8PSBYRlNfSUZCUk9PVDsKKwkvKgorCSAqIEZpbGwgaW4gdGhlIHJvb3QuCisJICovCisJYmxvY2sgPSBpZnAtPmlmX2Jyb290OworCUlOVF9TRVQoYmxvY2stPmJiX21hZ2ljLCBBUkNIX0NPTlZFUlQsIFhGU19CTUFQX01BR0lDKTsKKwlJTlRfU0VUKGJsb2NrLT5iYl9sZXZlbCwgQVJDSF9DT05WRVJULCAxKTsKKwlJTlRfU0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIDEpOworCUlOVF9TRVQoYmxvY2stPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCwgTlVMTERGU0JOTyk7CisJSU5UX1NFVChibG9jay0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCwgTlVMTERGU0JOTyk7CisJLyoKKwkgKiBOZWVkIGEgY3Vyc29yLiAgQ2FuJ3QgYWxsb2NhdGUgdW50aWwgYmJfbGV2ZWwgaXMgZmlsbGVkIGluLgorCSAqLworCW1wID0gaXAtPmlfbW91bnQ7CisJY3VyID0geGZzX2J0cmVlX2luaXRfY3Vyc29yKG1wLCB0cCwgTlVMTCwgMCwgWEZTX0JUTlVNX0JNQVAsIGlwLAorCQl3aGljaGZvcmspOworCWN1ci0+YmNfcHJpdmF0ZS5iLmZpcnN0YmxvY2sgPSAqZmlyc3RibG9jazsKKwljdXItPmJjX3ByaXZhdGUuYi5mbGlzdCA9IGZsaXN0OworCWN1ci0+YmNfcHJpdmF0ZS5iLmZsYWdzID0gd2FzZGVsID8gWEZTX0JUQ1VSX0JQUlZfV0FTREVMIDogMDsKKwkvKgorCSAqIENvbnZlcnQgdG8gYSBidHJlZSB3aXRoIHR3byBsZXZlbHMsIG9uZSByZWNvcmQgaW4gcm9vdC4KKwkgKi8KKwlYRlNfSUZPUktfRk1UX1NFVChpcCwgd2hpY2hmb3JrLCBYRlNfRElOT0RFX0ZNVF9CVFJFRSk7CisJYXJncy50cCA9IHRwOworCWFyZ3MubXAgPSBtcDsKKwlpZiAoKmZpcnN0YmxvY2sgPT0gTlVMTEZTQkxPQ0spIHsKKwkJYXJncy50eXBlID0gWEZTX0FMTE9DVFlQRV9TVEFSVF9CTk87CisJCWFyZ3MuZnNibm8gPSBYRlNfSU5PX1RPX0ZTQihtcCwgaXAtPmlfaW5vKTsKKwl9IGVsc2UgaWYgKGZsaXN0LT54YmZfbG93KSB7CisJCWFyZ3MudHlwZSA9IFhGU19BTExPQ1RZUEVfU1RBUlRfQk5POworCQlhcmdzLmZzYm5vID0gKmZpcnN0YmxvY2s7CisJfSBlbHNlIHsKKwkJYXJncy50eXBlID0gWEZTX0FMTE9DVFlQRV9ORUFSX0JOTzsKKwkJYXJncy5mc2JubyA9ICpmaXJzdGJsb2NrOworCX0KKwlhcmdzLm1pbmxlbiA9IGFyZ3MubWF4bGVuID0gYXJncy5wcm9kID0gMTsKKwlhcmdzLnRvdGFsID0gYXJncy5taW5sZWZ0ID0gYXJncy5hbGlnbm1lbnQgPSBhcmdzLm1vZCA9IGFyZ3MuaXNmbCA9CisJCWFyZ3MubWluYWxpZ25zbG9wID0gMDsKKwlhcmdzLndhc2RlbCA9IHdhc2RlbDsKKwkqbG9nZmxhZ3NwID0gMDsKKwlpZiAoKGVycm9yID0geGZzX2FsbG9jX3ZleHRlbnQoJmFyZ3MpKSkgeworCQl4ZnNfaXJvb3RfcmVhbGxvYyhpcCwgLTEsIHdoaWNoZm9yayk7CisJCXhmc19idHJlZV9kZWxfY3Vyc29yKGN1ciwgWEZTX0JUUkVFX0VSUk9SKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKwkvKgorCSAqIEFsbG9jYXRpb24gY2FuJ3QgZmFpbCwgdGhlIHNwYWNlIHdhcyByZXNlcnZlZC4KKwkgKi8KKwlBU1NFUlQoYXJncy5mc2JubyAhPSBOVUxMRlNCTE9DSyk7CisJQVNTRVJUKCpmaXJzdGJsb2NrID09IE5VTExGU0JMT0NLIHx8CisJICAgICAgIGFyZ3MuYWdubyA9PSBYRlNfRlNCX1RPX0FHTk8obXAsICpmaXJzdGJsb2NrKSB8fAorCSAgICAgICAoZmxpc3QtPnhiZl9sb3cgJiYKKwkJYXJncy5hZ25vID4gWEZTX0ZTQl9UT19BR05PKG1wLCAqZmlyc3RibG9jaykpKTsKKwkqZmlyc3RibG9jayA9IGN1ci0+YmNfcHJpdmF0ZS5iLmZpcnN0YmxvY2sgPSBhcmdzLmZzYm5vOworCWN1ci0+YmNfcHJpdmF0ZS5iLmFsbG9jYXRlZCsrOworCWlwLT5pX2QuZGlfbmJsb2NrcysrOworCVhGU19UUkFOU19NT0RfRFFVT1RfQllJTk8obXAsIHRwLCBpcCwgWEZTX1RSQU5TX0RRX0JDT1VOVCwgMUwpOworCWFicCA9IHhmc19idHJlZV9nZXRfYnVmbChtcCwgdHAsIGFyZ3MuZnNibm8sIDApOworCS8qCisJICogRmlsbCBpbiB0aGUgY2hpbGQgYmxvY2suCisJICovCisJYWJsb2NrID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKGFicCk7CisJSU5UX1NFVChhYmxvY2stPmJiX21hZ2ljLCBBUkNIX0NPTlZFUlQsIFhGU19CTUFQX01BR0lDKTsKKwlhYmxvY2stPmJiX2xldmVsID0gMDsKKwlJTlRfU0VUKGFibG9jay0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJULCBOVUxMREZTQk5PKTsKKwlJTlRfU0VUKGFibG9jay0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCwgTlVMTERGU0JOTyk7CisJYXJwID0gWEZTX0JNQVBfUkVDX0lBRERSKGFibG9jaywgMSwgY3VyKTsKKwluZXh0ZW50cyA9IGlmcC0+aWZfYnl0ZXMgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpOworCWZvciAoZXAgPSBpZnAtPmlmX3UxLmlmX2V4dGVudHMsIGNudCA9IGkgPSAwOyBpIDwgbmV4dGVudHM7IGkrKywgZXArKykgeworCQlpZiAoIUlTTlVMTFNUQVJUQkxPQ0soeGZzX2JtYnRfZ2V0X3N0YXJ0YmxvY2soZXApKSkgeworCQkJYXJwLT5sMCA9IElOVF9HRVQoZXAtPmwwLCBBUkNIX0NPTlZFUlQpOworCQkJYXJwLT5sMSA9IElOVF9HRVQoZXAtPmwxLCBBUkNIX0NPTlZFUlQpOworCQkJYXJwKys7IGNudCsrOworCQl9CisJfQorCUlOVF9TRVQoYWJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIGNudCk7CisJQVNTRVJUKElOVF9HRVQoYWJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpID09IFhGU19JRk9SS19ORVhURU5UUyhpcCwgd2hpY2hmb3JrKSk7CisJLyoKKwkgKiBGaWxsIGluIHRoZSByb290IGtleSBhbmQgcG9pbnRlci4KKwkgKi8KKwlrcCA9IFhGU19CTUFQX0tFWV9JQUREUihibG9jaywgMSwgY3VyKTsKKwlhcnAgPSBYRlNfQk1BUF9SRUNfSUFERFIoYWJsb2NrLCAxLCBjdXIpOworCUlOVF9TRVQoa3AtPmJyX3N0YXJ0b2ZmLCBBUkNIX0NPTlZFUlQsIHhmc19ibWJ0X2Rpc2tfZ2V0X3N0YXJ0b2ZmKGFycCkpOworCXBwID0gWEZTX0JNQVBfUFRSX0lBRERSKGJsb2NrLCAxLCBjdXIpOworCUlOVF9TRVQoKnBwLCBBUkNIX0NPTlZFUlQsIGFyZ3MuZnNibm8pOworCS8qCisJICogRG8gYWxsIHRoaXMgbG9nZ2luZyBhdCB0aGUgZW5kIHNvIHRoYXQKKwkgKiB0aGUgcm9vdCBpcyBhdCB0aGUgcmlnaHQgbGV2ZWwuCisJICovCisJeGZzX2JtYnRfbG9nX2Jsb2NrKGN1ciwgYWJwLCBYRlNfQkJfQUxMX0JJVFMpOworCXhmc19ibWJ0X2xvZ19yZWNzKGN1ciwgYWJwLCAxLCBJTlRfR0VUKGFibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSk7CisJQVNTRVJUKCpjdXJwID09IE5VTEwpOworCSpjdXJwID0gY3VyOworCSpsb2dmbGFnc3AgPSBYRlNfSUxPR19DT1JFIHwgWEZTX0lMT0dfRkJST09UKHdoaWNoZm9yayk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJbnNlcnQgbmV3IGl0ZW0ocykgaW4gdGhlIGV4dGVudCBsaXN0IGZvciBpbm9kZSAiaXAiLgorICogQ291bnQgbmV3IGl0ZW1zIGFyZSBpbnNlcnRlZCBhdCBvZmZzZXQgaWR4LgorICovCitTVEFUSUMgdm9pZAoreGZzX2JtYXBfaW5zZXJ0X2V4bGlzdCgKKwl4ZnNfaW5vZGVfdAkqaXAsCQkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLworCXhmc19leHRudW1fdAlpZHgsCQkvKiBzdGFydGluZyBpbmRleCBvZiBuZXcgaXRlbXMgKi8KKwl4ZnNfZXh0bnVtX3QJY291bnQsCQkvKiBudW1iZXIgb2YgaW5zZXJ0ZWQgaXRlbXMgKi8KKwl4ZnNfYm1idF9pcmVjX3QJKm5ldywJCS8qIGl0ZW1zIHRvIGluc2VydCAqLworCWludAkJd2hpY2hmb3JrKQkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworeworCXhmc19ibWJ0X3JlY190CSpiYXNlOwkJLyogZXh0ZW50IGxpc3QgYmFzZSAqLworCXhmc19pZm9ya190CSppZnA7CQkvKiBpbm9kZSBmb3JrIHBvaW50ZXIgKi8KKwl4ZnNfZXh0bnVtX3QJbmV4dGVudHM7CS8qIGV4dGVudCBsaXN0IHNpemUgKi8KKwl4ZnNfZXh0bnVtX3QJdG87CQkvKiBleHRlbnQgbGlzdCBpbmRleCAqLworCisJaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgd2hpY2hmb3JrKTsKKwlBU1NFUlQoaWZwLT5pZl9mbGFncyAmIFhGU19JRkVYVEVOVFMpOworCXhmc19pZXh0X3JlYWxsb2MoaXAsIGNvdW50LCB3aGljaGZvcmspOworCWJhc2UgPSBpZnAtPmlmX3UxLmlmX2V4dGVudHM7CisJbmV4dGVudHMgPSBpZnAtPmlmX2J5dGVzIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KTsKKwltZW1tb3ZlKCZiYXNlW2lkeCArIGNvdW50XSwgJmJhc2VbaWR4XSwKKwkJKG5leHRlbnRzIC0gKGlkeCArIGNvdW50KSkgKiBzaXplb2YoKmJhc2UpKTsKKwlmb3IgKHRvID0gaWR4OyB0byA8IGlkeCArIGNvdW50OyB0bysrLCBuZXcrKykKKwkJeGZzX2JtYnRfc2V0X2FsbCgmYmFzZVt0b10sIG5ldyk7Cit9CisKKy8qCisgKiBDb252ZXJ0IGEgbG9jYWwgZmlsZSB0byBhbiBleHRlbnRzIGZpbGUuCisgKiBUaGlzIGNvZGUgaXMgb3V0IG9mIGJvdW5kcyBmb3IgZGF0YSBmb3JrcyBvZiByZWd1bGFyIGZpbGVzLAorICogc2luY2UgdGhlIGZpbGUgZGF0YSBuZWVkcyB0byBnZXQgbG9nZ2VkIHNvIHRoaW5ncyB3aWxsIHN0YXkgY29uc2lzdGVudC4KKyAqIChUaGUgYm1hcC1sZXZlbCBtYW5pcHVsYXRpb25zIGFyZSBvaywgdGhvdWdoKS4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX2JtYXBfbG9jYWxfdG9fZXh0ZW50cygKKwl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2lub2RlX3QJKmlwLAkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfZnNibG9ja190CSpmaXJzdGJsb2NrLAkvKiBmaXJzdCBibG9jayBhbGxvY2F0ZWQgaW4geGFjdGlvbiAqLworCXhmc19leHRsZW5fdAl0b3RhbCwJCS8qIHRvdGFsIGJsb2NrcyBuZWVkZWQgYnkgdHJhbnNhY3Rpb24gKi8KKwlpbnQJCSpsb2dmbGFnc3AsCS8qIGlub2RlIGxvZ2dpbmcgZmxhZ3MgKi8KKwlpbnQJCXdoaWNoZm9yaykJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KK3sKKwlpbnQJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJaW50CQlmbGFnczsJCS8qIGxvZ2dpbmcgZmxhZ3MgcmV0dXJuZWQgKi8KKyNpZmRlZiBYRlNfQk1BUF9UUkFDRQorCXN0YXRpYyBjaGFyCWZuYW1lW10gPSAieGZzX2JtYXBfbG9jYWxfdG9fZXh0ZW50cyI7CisjZW5kaWYKKwl4ZnNfaWZvcmtfdAkqaWZwOwkJLyogaW5vZGUgZm9yayBwb2ludGVyICovCisKKwkvKgorCSAqIFdlIGRvbid0IHdhbnQgdG8gZGVhbCB3aXRoIHRoZSBjYXNlIG9mIGtlZXBpbmcgaW5vZGUgZGF0YSBpbmxpbmUgeWV0LgorCSAqIFNvIHNlbmRpbmcgdGhlIGRhdGEgZm9yayBvZiBhIHJlZ3VsYXIgaW5vZGUgaXMgaW52YWxpZC4KKwkgKi8KKwlBU1NFUlQoISgoaXAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSA9PSBTX0lGUkVHICYmCisJCSB3aGljaGZvcmsgPT0gWEZTX0RBVEFfRk9SSykpOworCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7CisJQVNTRVJUKFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgPT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpOworCWZsYWdzID0gMDsKKwllcnJvciA9IDA7CisJaWYgKGlmcC0+aWZfYnl0ZXMpIHsKKwkJeGZzX2FsbG9jX2FyZ190CWFyZ3M7CS8qIGFsbG9jYXRpb24gYXJndW1lbnRzICovCisJCXhmc19idWZfdAkqYnA7CS8qIGJ1ZmZlciBmb3IgZXh0ZW50IGxpc3QgYmxvY2sgKi8KKwkJeGZzX2JtYnRfcmVjX3QJKmVwOwkvKiBleHRlbnQgbGlzdCBwb2ludGVyICovCisKKwkJYXJncy50cCA9IHRwOworCQlhcmdzLm1wID0gaXAtPmlfbW91bnQ7CisJCUFTU0VSVChpZnAtPmlmX2ZsYWdzICYgWEZTX0lGSU5MSU5FKTsKKwkJLyoKKwkJICogQWxsb2NhdGUgYSBibG9jay4gIFdlIGtub3cgd2UgbmVlZCBvbmx5IG9uZSwgc2luY2UgdGhlCisJCSAqIGZpbGUgY3VycmVudGx5IGZpdHMgaW4gYW4gaW5vZGUuCisJCSAqLworCQlpZiAoKmZpcnN0YmxvY2sgPT0gTlVMTEZTQkxPQ0spIHsKKwkJCWFyZ3MuZnNibm8gPSBYRlNfSU5PX1RPX0ZTQihhcmdzLm1wLCBpcC0+aV9pbm8pOworCQkJYXJncy50eXBlID0gWEZTX0FMTE9DVFlQRV9TVEFSVF9CTk87CisJCX0gZWxzZSB7CisJCQlhcmdzLmZzYm5vID0gKmZpcnN0YmxvY2s7CisJCQlhcmdzLnR5cGUgPSBYRlNfQUxMT0NUWVBFX05FQVJfQk5POworCQl9CisJCWFyZ3MudG90YWwgPSB0b3RhbDsKKwkJYXJncy5tb2QgPSBhcmdzLm1pbmxlZnQgPSBhcmdzLmFsaWdubWVudCA9IGFyZ3Mud2FzZGVsID0KKwkJCWFyZ3MuaXNmbCA9IGFyZ3MubWluYWxpZ25zbG9wID0gMDsKKwkJYXJncy5taW5sZW4gPSBhcmdzLm1heGxlbiA9IGFyZ3MucHJvZCA9IDE7CisJCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfdmV4dGVudCgmYXJncykpKQorCQkJZ290byBkb25lOworCQkvKgorCQkgKiBDYW4ndCBmYWlsLCB0aGUgc3BhY2Ugd2FzIHJlc2VydmVkLgorCQkgKi8KKwkJQVNTRVJUKGFyZ3MuZnNibm8gIT0gTlVMTEZTQkxPQ0spOworCQlBU1NFUlQoYXJncy5sZW4gPT0gMSk7CisJCSpmaXJzdGJsb2NrID0gYXJncy5mc2JubzsKKwkJYnAgPSB4ZnNfYnRyZWVfZ2V0X2J1ZmwoYXJncy5tcCwgdHAsIGFyZ3MuZnNibm8sIDApOworCQltZW1jcHkoKGNoYXIgKilYRlNfQlVGX1BUUihicCksIGlmcC0+aWZfdTEuaWZfZGF0YSwKKwkJCWlmcC0+aWZfYnl0ZXMpOworCQl4ZnNfdHJhbnNfbG9nX2J1Zih0cCwgYnAsIDAsIGlmcC0+aWZfYnl0ZXMgLSAxKTsKKwkJeGZzX2lkYXRhX3JlYWxsb2MoaXAsIC1pZnAtPmlmX2J5dGVzLCB3aGljaGZvcmspOworCQl4ZnNfaWV4dF9yZWFsbG9jKGlwLCAxLCB3aGljaGZvcmspOworCQllcCA9IGlmcC0+aWZfdTEuaWZfZXh0ZW50czsKKwkJeGZzX2JtYnRfc2V0X2FsbGYoZXAsIDAsIGFyZ3MuZnNibm8sIDEsIFhGU19FWFRfTk9STSk7CisJCXhmc19ibWFwX3RyYWNlX3Bvc3RfdXBkYXRlKGZuYW1lLCAibmV3IiwgaXAsIDAsIHdoaWNoZm9yayk7CisJCVhGU19JRk9SS19ORVhUX1NFVChpcCwgd2hpY2hmb3JrLCAxKTsKKwkJaXAtPmlfZC5kaV9uYmxvY2tzID0gMTsKKwkJWEZTX1RSQU5TX01PRF9EUVVPVF9CWUlOTyhhcmdzLm1wLCB0cCwgaXAsCisJCQlYRlNfVFJBTlNfRFFfQkNPVU5ULCAxTCk7CisJCWZsYWdzIHw9IFhGU19JTE9HX0ZFWFQod2hpY2hmb3JrKTsKKwl9IGVsc2UKKwkJQVNTRVJUKFhGU19JRk9SS19ORVhURU5UUyhpcCwgd2hpY2hmb3JrKSA9PSAwKTsKKwlpZnAtPmlmX2ZsYWdzICY9IH5YRlNfSUZJTkxJTkU7CisJaWZwLT5pZl9mbGFncyB8PSBYRlNfSUZFWFRFTlRTOworCVhGU19JRk9SS19GTVRfU0VUKGlwLCB3aGljaGZvcmssIFhGU19ESU5PREVfRk1UX0VYVEVOVFMpOworCWZsYWdzIHw9IFhGU19JTE9HX0NPUkU7Citkb25lOgorCSpsb2dmbGFnc3AgPSBmbGFnczsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3hmc19ibWJ0X3JlY190ICoJCQkvKiBwb2ludGVyIHRvIGZvdW5kIGV4dGVudCBlbnRyeSAqLworeGZzX2JtYXBfZG9fc2VhcmNoX2V4dGVudHMoCisJeGZzX2JtYnRfcmVjX3QJKmJhc2UsCQkvKiBiYXNlIG9mIGV4dGVudCBsaXN0ICovCisJeGZzX2V4dG51bV90CWxhc3R4LAkJLyogbGFzdCBleHRlbnQgaW5kZXggdXNlZCAqLworCXhmc19leHRudW1fdAluZXh0ZW50cywJLyogZXh0ZW50IGxpc3Qgc2l6ZSAqLworCXhmc19maWxlb2ZmX3QJYm5vLAkJLyogYmxvY2sgbnVtYmVyIHNlYXJjaGVkIGZvciAqLworCWludAkJKmVvZnAsCQkvKiBvdXQ6IGVuZCBvZiBmaWxlIGZvdW5kICovCisJeGZzX2V4dG51bV90CSpsYXN0eHAsCS8qIG91dDogbGFzdCBleHRlbnQgaW5kZXggKi8KKwl4ZnNfYm1idF9pcmVjX3QJKmdvdHAsCQkvKiBvdXQ6IGV4dGVudCBlbnRyeSBmb3VuZCAqLworCXhmc19ibWJ0X2lyZWNfdAkqcHJldnApCQkvKiBvdXQ6IHByZXZpb3VzIGV4dGVudCBlbnRyeSBmb3VuZCAqLworeworCXhmc19ibWJ0X3JlY190CSplcDsJCS8qIGV4dGVudCBsaXN0IGVudHJ5IHBvaW50ZXIgKi8KKwl4ZnNfYm1idF9pcmVjX3QJZ290OwkJLyogZXh0ZW50IGxpc3QgZW50cnksIGRlY29kZWQgKi8KKwlpbnQJCWhpZ2g7CQkvKiBoaWdoIGluZGV4IG9mIGJpbmFyeSBzZWFyY2ggKi8KKwlpbnQJCWxvdzsJCS8qIGxvdyBpbmRleCBvZiBiaW5hcnkgc2VhcmNoICovCisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIGV4dGVudCBlbnRyeSBzdHJ1Y3R1cmUgdG8gY2F0Y2ggYWNjZXNzIHRvCisJICogdW5pbml0aWFsaXplZCBicl9zdGFydGJsb2NrIGZpZWxkLgorCSAqLworCWdvdC5icl9zdGFydG9mZiA9IDB4ZmZhNWE1YTVhNWE1YTVhNUxMOworCWdvdC5icl9ibG9ja2NvdW50ID0gMHhhNTVhNWE1YTVhNWE1YTVhTEw7CisJZ290LmJyX3N0YXRlID0gWEZTX0VYVF9JTlZBTElEOworCisjaWYgWEZTX0JJR19CTEtOT1MKKwlnb3QuYnJfc3RhcnRibG9jayA9IDB4ZmZmZmE1YTVhNWE1YTVhNUxMOworI2Vsc2UKKwlnb3QuYnJfc3RhcnRibG9jayA9IDB4ZmZmZmE1YTU7CisjZW5kaWYKKworCWlmIChsYXN0eCAhPSBOVUxMRVhUTlVNICYmIGxhc3R4IDwgbmV4dGVudHMpCisJCWVwID0gYmFzZSArIGxhc3R4OworCWVsc2UKKwkJZXAgPSBOVUxMOworCXByZXZwLT5icl9zdGFydG9mZiA9IE5VTExGSUxFT0ZGOworCWlmIChlcCAmJiBibm8gPj0gKGdvdC5icl9zdGFydG9mZiA9IHhmc19ibWJ0X2dldF9zdGFydG9mZihlcCkpICYmCisJICAgIGJubyA8IGdvdC5icl9zdGFydG9mZiArCisJCSAgKGdvdC5icl9ibG9ja2NvdW50ID0geGZzX2JtYnRfZ2V0X2Jsb2NrY291bnQoZXApKSkKKwkJKmVvZnAgPSAwOworCWVsc2UgaWYgKGVwICYmIGxhc3R4IDwgbmV4dGVudHMgLSAxICYmCisJCSBibm8gPj0gKGdvdC5icl9zdGFydG9mZiA9IHhmc19ibWJ0X2dldF9zdGFydG9mZihlcCArIDEpKSAmJgorCQkgYm5vIDwgZ290LmJyX3N0YXJ0b2ZmICsKKwkJICAgICAgIChnb3QuYnJfYmxvY2tjb3VudCA9IHhmc19ibWJ0X2dldF9ibG9ja2NvdW50KGVwICsgMSkpKSB7CisJCWxhc3R4Kys7CisJCWVwKys7CisJCSplb2ZwID0gMDsKKwl9IGVsc2UgaWYgKG5leHRlbnRzID09IDApCisJCSplb2ZwID0gMTsKKwllbHNlIGlmIChibm8gPT0gMCAmJgorCQkgKGdvdC5icl9zdGFydG9mZiA9IHhmc19ibWJ0X2dldF9zdGFydG9mZihiYXNlKSkgPT0gMCkgeworCQllcCA9IGJhc2U7CisJCWxhc3R4ID0gMDsKKwkJZ290LmJyX2Jsb2NrY291bnQgPSB4ZnNfYm1idF9nZXRfYmxvY2tjb3VudChlcCk7CisJCSplb2ZwID0gMDsKKwl9IGVsc2UgeworCQkvKiBiaW5hcnkgc2VhcmNoIHRoZSBleHRlbnRzIGFycmF5ICovCisJCWxvdyA9IDA7CisJCWhpZ2ggPSBuZXh0ZW50cyAtIDE7CisJCXdoaWxlIChsb3cgPD0gaGlnaCkgeworCQkJWEZTX1NUQVRTX0lOQyh4c19jbXBfZXhsaXN0KTsKKwkJCWxhc3R4ID0gKGxvdyArIGhpZ2gpID4+IDE7CisJCQllcCA9IGJhc2UgKyBsYXN0eDsKKwkJCWdvdC5icl9zdGFydG9mZiA9IHhmc19ibWJ0X2dldF9zdGFydG9mZihlcCk7CisJCQlnb3QuYnJfYmxvY2tjb3VudCA9IHhmc19ibWJ0X2dldF9ibG9ja2NvdW50KGVwKTsKKwkJCWlmIChibm8gPCBnb3QuYnJfc3RhcnRvZmYpCisJCQkJaGlnaCA9IGxhc3R4IC0gMTsKKwkJCWVsc2UgaWYgKGJubyA+PSBnb3QuYnJfc3RhcnRvZmYgKyBnb3QuYnJfYmxvY2tjb3VudCkKKwkJCQlsb3cgPSBsYXN0eCArIDE7CisJCQllbHNlIHsKKwkJCQlnb3QuYnJfc3RhcnRibG9jayA9IHhmc19ibWJ0X2dldF9zdGFydGJsb2NrKGVwKTsKKwkJCQlnb3QuYnJfc3RhdGUgPSB4ZnNfYm1idF9nZXRfc3RhdGUoZXApOworCQkJCSplb2ZwID0gMDsKKwkJCQkqbGFzdHhwID0gbGFzdHg7CisJCQkJKmdvdHAgPSBnb3Q7CisJCQkJcmV0dXJuIGVwOworCQkJfQorCQl9CisJCWlmIChibm8gPj0gZ290LmJyX3N0YXJ0b2ZmICsgZ290LmJyX2Jsb2NrY291bnQpIHsKKwkJCWxhc3R4Kys7CisJCQlpZiAobGFzdHggPT0gbmV4dGVudHMpIHsKKwkJCQkqZW9mcCA9IDE7CisJCQkJZ290LmJyX3N0YXJ0YmxvY2sgPSB4ZnNfYm1idF9nZXRfc3RhcnRibG9jayhlcCk7CisJCQkJZ290LmJyX3N0YXRlID0geGZzX2JtYnRfZ2V0X3N0YXRlKGVwKTsKKwkJCQkqcHJldnAgPSBnb3Q7CisJCQkJZXAgPSBOVUxMOworCQkJfSBlbHNlIHsKKwkJCQkqZW9mcCA9IDA7CisJCQkJeGZzX2JtYnRfZ2V0X2FsbChlcCwgcHJldnApOworCQkJCWVwKys7CisJCQkJZ290LmJyX3N0YXJ0b2ZmID0geGZzX2JtYnRfZ2V0X3N0YXJ0b2ZmKGVwKTsKKwkJCQlnb3QuYnJfYmxvY2tjb3VudCA9IHhmc19ibWJ0X2dldF9ibG9ja2NvdW50KGVwKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCSplb2ZwID0gMDsKKwkJCWlmIChlcCA+IGJhc2UpCisJCQkJeGZzX2JtYnRfZ2V0X2FsbChlcCAtIDEsIHByZXZwKTsKKwkJfQorCX0KKwlpZiAoZXApIHsKKwkJZ290LmJyX3N0YXJ0YmxvY2sgPSB4ZnNfYm1idF9nZXRfc3RhcnRibG9jayhlcCk7CisJCWdvdC5icl9zdGF0ZSA9IHhmc19ibWJ0X2dldF9zdGF0ZShlcCk7CisJfQorCSpsYXN0eHAgPSBsYXN0eDsKKwkqZ290cCA9IGdvdDsKKwlyZXR1cm4gZXA7Cit9CisKKy8qCisgKiBTZWFyY2ggdGhlIGV4dGVudHMgbGlzdCBmb3IgdGhlIGlub2RlLCBmb3IgdGhlIGV4dGVudCBjb250YWluaW5nIGJuby4KKyAqIElmIGJubyBsaWVzIGluIGEgaG9sZSwgcG9pbnQgdG8gdGhlIG5leHQgZW50cnkuICBJZiBibm8gbGllcyBwYXN0IGVvZiwKKyAqICplb2ZwIHdpbGwgYmUgc2V0LCBhbmQgKnByZXZwIHdpbGwgY29udGFpbiB0aGUgbGFzdCBlbnRyeSAobnVsbCBpZiBub25lKS4KKyAqIEVsc2UsICpsYXN0eHAgd2lsbCBiZSBzZXQgdG8gdGhlIGluZGV4IG9mIHRoZSBmb3VuZAorICogZW50cnk7ICpnb3RwIHdpbGwgY29udGFpbiB0aGUgZW50cnkuCisgKi8KK1NUQVRJQyB4ZnNfYm1idF9yZWNfdCAqICAgICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIGZvdW5kIGV4dGVudCBlbnRyeSAqLworeGZzX2JtYXBfc2VhcmNoX2V4dGVudHMoCisJeGZzX2lub2RlX3QgICAgICppcCwgICAgICAgICAgICAvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLworCXhmc19maWxlb2ZmX3QgICBibm8sICAgICAgICAgICAgLyogYmxvY2sgbnVtYmVyIHNlYXJjaGVkIGZvciAqLworCWludCAgICAgICAgICAgICB3aGljaGZvcmssICAgICAgLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KKwlpbnQgICAgICAgICAgICAgKmVvZnAsICAgICAgICAgIC8qIG91dDogZW5kIG9mIGZpbGUgZm91bmQgKi8KKwl4ZnNfZXh0bnVtX3QgICAgKmxhc3R4cCwgICAgICAgIC8qIG91dDogbGFzdCBleHRlbnQgaW5kZXggKi8KKwl4ZnNfYm1idF9pcmVjX3QgKmdvdHAsICAgICAgICAgIC8qIG91dDogZXh0ZW50IGVudHJ5IGZvdW5kICovCisJeGZzX2JtYnRfaXJlY190ICpwcmV2cCkgICAgICAgICAvKiBvdXQ6IHByZXZpb3VzIGV4dGVudCBlbnRyeSBmb3VuZCAqLworeworCXhmc19pZm9ya190CSppZnA7CQkvKiBpbm9kZSBmb3JrIHBvaW50ZXIgKi8KKwl4ZnNfYm1idF9yZWNfdCAgKmJhc2U7ICAgICAgICAgIC8qIGJhc2Ugb2YgZXh0ZW50IGxpc3QgKi8KKwl4ZnNfZXh0bnVtX3QgICAgbGFzdHg7ICAgICAgICAgIC8qIGxhc3QgZXh0ZW50IGluZGV4IHVzZWQgKi8KKwl4ZnNfZXh0bnVtX3QgICAgbmV4dGVudHM7ICAgICAgIC8qIGV4dGVudCBsaXN0IHNpemUgKi8KKwl4ZnNfYm1idF9yZWNfdCAgKmVwOyAgICAgICAgICAgIC8qIGV4dGVudCBsaXN0IGVudHJ5IHBvaW50ZXIgKi8KKwlpbnQJCXJ0OwkJLyogcmVhbHRpbWUgZmxhZyAgICAqLworCisJWEZTX1NUQVRTX0lOQyh4c19sb29rX2V4bGlzdCk7CisJaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgd2hpY2hmb3JrKTsKKwlsYXN0eCA9IGlmcC0+aWZfbGFzdGV4OworCW5leHRlbnRzID0gaWZwLT5pZl9ieXRlcyAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCk7CisJYmFzZSA9ICZpZnAtPmlmX3UxLmlmX2V4dGVudHNbMF07CisKKwllcCA9IHhmc19ibWFwX2RvX3NlYXJjaF9leHRlbnRzKGJhc2UsIGxhc3R4LCBuZXh0ZW50cywgYm5vLCBlb2ZwLAorCQkJCQkgIGxhc3R4cCwgZ290cCwgcHJldnApOworCXJ0ID0gaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUkVBTFRJTUU7CisJaWYoIXJ0ICYmICFnb3RwLT5icl9zdGFydGJsb2NrICYmICgqbGFzdHhwICE9IE5VTExFWFROVU0pKSB7CisgICAgICAgICAgICAgICAgY21uX2VycihDRV9QQU5JQywiQWNjZXNzIHRvIGJsb2NrIHplcm86IGZzOiA8JXM+IGlub2RlOiAlbGxkICIKKwkJCSJzdGFydF9ibG9jayA6ICVsbHggc3RhcnRfb2ZmIDogJWxseCBibGtjbnQgOiAlbGx4ICIKKwkJCSJleHRlbnQtc3RhdGUgOiAleCBcbiIsCisJCQkoaXAtPmlfbW91bnQpLT5tX2ZzbmFtZSwobG9uZyBsb25nKWlwLT5pX2lubywKKwkJCWdvdHAtPmJyX3N0YXJ0YmxvY2ssIGdvdHAtPmJyX3N0YXJ0b2ZmLAorCQkJZ290cC0+YnJfYmxvY2tjb3VudCxnb3RwLT5icl9zdGF0ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVwOworfQorCisKKyNpZmRlZiBYRlNfQk1BUF9UUkFDRQora3RyYWNlX3QJKnhmc19ibWFwX3RyYWNlX2J1ZjsKKworLyoKKyAqIEFkZCBhIGJtYXAgdHJhY2UgYnVmZmVyIGVudHJ5LiAgQmFzZSByb3V0aW5lIGZvciB0aGUgb3RoZXJzLgorICovCitTVEFUSUMgdm9pZAoreGZzX2JtYXBfdHJhY2VfYWRkZW50cnkoCisJaW50CQlvcGNvZGUsCQkvKiBvcGVyYXRpb24gKi8KKwljaGFyCQkqZm5hbWUsCQkvKiBmdW5jdGlvbiBuYW1lICovCisJY2hhcgkJKmRlc2MsCQkvKiBvcGVyYXRpb24gZGVzY3JpcHRpb24gKi8KKwl4ZnNfaW5vZGVfdAkqaXAsCQkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLworCXhmc19leHRudW1fdAlpZHgsCQkvKiBpbmRleCBvZiBlbnRyeShpZXMpICovCisJeGZzX2V4dG51bV90CWNudCwJCS8qIGNvdW50IG9mIGVudHJpZXMsIDEgb3IgMiAqLworCXhmc19ibWJ0X3JlY190CSpyMSwJCS8qIGZpcnN0IHJlY29yZCAqLworCXhmc19ibWJ0X3JlY190CSpyMiwJCS8qIHNlY29uZCByZWNvcmQgb3IgbnVsbCAqLworCWludAkJd2hpY2hmb3JrKQkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworeworCXhmc19ibWJ0X3JlY190CXRyMjsKKworCUFTU0VSVChjbnQgPT0gMSB8fCBjbnQgPT0gMik7CisJQVNTRVJUKHIxICE9IE5VTEwpOworCWlmIChjbnQgPT0gMSkgeworCQlBU1NFUlQocjIgPT0gTlVMTCk7CisJCXIyID0gJnRyMjsKKwkJbWVtc2V0KCZ0cjIsIDAsIHNpemVvZih0cjIpKTsKKwl9IGVsc2UKKwkJQVNTRVJUKHIyICE9IE5VTEwpOworCWt0cmFjZV9lbnRlcih4ZnNfYm1hcF90cmFjZV9idWYsCisJCSh2b2lkICopKF9fcHNpbnRfdCkob3Bjb2RlIHwgKHdoaWNoZm9yayA8PCAxNikpLAorCQkodm9pZCAqKWZuYW1lLCAodm9pZCAqKWRlc2MsICh2b2lkICopaXAsCisJCSh2b2lkICopKF9fcHNpbnRfdClpZHgsCisJCSh2b2lkICopKF9fcHNpbnRfdCljbnQsCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KShpcC0+aV9pbm8gPj4gMzIpLAorCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdCkodW5zaWduZWQpaXAtPmlfaW5vLAorCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdCkocjEtPmwwID4+IDMyKSwKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpKHVuc2lnbmVkKShyMS0+bDApLAorCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdCkocjEtPmwxID4+IDMyKSwKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpKHVuc2lnbmVkKShyMS0+bDEpLAorCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdCkocjItPmwwID4+IDMyKSwKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpKHVuc2lnbmVkKShyMi0+bDApLAorCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdCkocjItPmwxID4+IDMyKSwKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpKHVuc2lnbmVkKShyMi0+bDEpCisJCSk7CisJQVNTRVJUKGlwLT5pX3h0cmFjZSk7CisJa3RyYWNlX2VudGVyKGlwLT5pX3h0cmFjZSwKKwkJKHZvaWQgKikoX19wc2ludF90KShvcGNvZGUgfCAod2hpY2hmb3JrIDw8IDE2KSksCisJCSh2b2lkICopZm5hbWUsICh2b2lkICopZGVzYywgKHZvaWQgKilpcCwKKwkJKHZvaWQgKikoX19wc2ludF90KWlkeCwKKwkJKHZvaWQgKikoX19wc2ludF90KWNudCwKKwkJKHZvaWQgKikoX19wc3Vuc2lnbmVkX3QpKGlwLT5pX2lubyA+PiAzMiksCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KSh1bnNpZ25lZClpcC0+aV9pbm8sCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KShyMS0+bDAgPj4gMzIpLAorCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdCkodW5zaWduZWQpKHIxLT5sMCksCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KShyMS0+bDEgPj4gMzIpLAorCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdCkodW5zaWduZWQpKHIxLT5sMSksCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KShyMi0+bDAgPj4gMzIpLAorCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdCkodW5zaWduZWQpKHIyLT5sMCksCisJCSh2b2lkICopKF9fcHN1bnNpZ25lZF90KShyMi0+bDEgPj4gMzIpLAorCQkodm9pZCAqKShfX3BzdW5zaWduZWRfdCkodW5zaWduZWQpKHIyLT5sMSkKKwkJKTsKK30KKworLyoKKyAqIEFkZCBibWFwIHRyYWNlIGVudHJ5IHByaW9yIHRvIGEgY2FsbCB0byB4ZnNfYm1hcF9kZWxldGVfZXhsaXN0LgorICovCitTVEFUSUMgdm9pZAoreGZzX2JtYXBfdHJhY2VfZGVsZXRlKAorCWNoYXIJCSpmbmFtZSwJCS8qIGZ1bmN0aW9uIG5hbWUgKi8KKwljaGFyCQkqZGVzYywJCS8qIG9wZXJhdGlvbiBkZXNjcmlwdGlvbiAqLworCXhmc19pbm9kZV90CSppcCwJCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCisJeGZzX2V4dG51bV90CWlkeCwJCS8qIGluZGV4IG9mIGVudHJ5KGVudHJpZXMpIGRlbGV0ZWQgKi8KKwl4ZnNfZXh0bnVtX3QJY250LAkJLyogY291bnQgb2YgZW50cmllcyBkZWxldGVkLCAxIG9yIDIgKi8KKwlpbnQJCXdoaWNoZm9yaykJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KK3sKKwl4ZnNfaWZvcmtfdAkqaWZwOwkJLyogaW5vZGUgZm9yayBwb2ludGVyICovCisKKwlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOworCXhmc19ibWFwX3RyYWNlX2FkZGVudHJ5KFhGU19CTUFQX0tUUkFDRV9ERUxFVEUsIGZuYW1lLCBkZXNjLCBpcCwgaWR4LAorCQljbnQsICZpZnAtPmlmX3UxLmlmX2V4dGVudHNbaWR4XSwKKwkJY250ID09IDIgPyAmaWZwLT5pZl91MS5pZl9leHRlbnRzW2lkeCArIDFdIDogTlVMTCwKKwkJd2hpY2hmb3JrKTsKK30KKworLyoKKyAqIEFkZCBibWFwIHRyYWNlIGVudHJ5IHByaW9yIHRvIGEgY2FsbCB0byB4ZnNfYm1hcF9pbnNlcnRfZXhsaXN0LCBvcgorICogcmVhZGluZyBpbiB0aGUgZXh0ZW50cyBsaXN0IGZyb20gdGhlIGRpc2sgKGluIHRoZSBidHJlZSkuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYm1hcF90cmFjZV9pbnNlcnQoCisJY2hhcgkJKmZuYW1lLAkJLyogZnVuY3Rpb24gbmFtZSAqLworCWNoYXIJCSpkZXNjLAkJLyogb3BlcmF0aW9uIGRlc2NyaXB0aW9uICovCisJeGZzX2lub2RlX3QJKmlwLAkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfZXh0bnVtX3QJaWR4LAkJLyogaW5kZXggb2YgZW50cnkoZW50cmllcykgaW5zZXJ0ZWQgKi8KKwl4ZnNfZXh0bnVtX3QJY250LAkJLyogY291bnQgb2YgZW50cmllcyBpbnNlcnRlZCwgMSBvciAyICovCisJeGZzX2JtYnRfaXJlY190CSpyMSwJCS8qIGluc2VydGVkIHJlY29yZCAxICovCisJeGZzX2JtYnRfaXJlY190CSpyMiwJCS8qIGluc2VydGVkIHJlY29yZCAyIG9yIG51bGwgKi8KKwlpbnQJCXdoaWNoZm9yaykJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KK3sKKwl4ZnNfYm1idF9yZWNfdAl0cjE7CQkvKiBjb21wcmVzc2VkIHJlY29yZCAxICovCisJeGZzX2JtYnRfcmVjX3QJdHIyOwkJLyogY29tcHJlc3NlZCByZWNvcmQgMiBpZiBuZWVkZWQgKi8KKworCXhmc19ibWJ0X3NldF9hbGwoJnRyMSwgcjEpOworCWlmIChjbnQgPT0gMikgeworCQlBU1NFUlQocjIgIT0gTlVMTCk7CisJCXhmc19ibWJ0X3NldF9hbGwoJnRyMiwgcjIpOworCX0gZWxzZSB7CisJCUFTU0VSVChjbnQgPT0gMSk7CisJCUFTU0VSVChyMiA9PSBOVUxMKTsKKwl9CisJeGZzX2JtYXBfdHJhY2VfYWRkZW50cnkoWEZTX0JNQVBfS1RSQUNFX0lOU0VSVCwgZm5hbWUsIGRlc2MsIGlwLCBpZHgsCisJCWNudCwgJnRyMSwgY250ID09IDIgPyAmdHIyIDogTlVMTCwgd2hpY2hmb3JrKTsKK30KKworLyoKKyAqIEFkZCBibWFwIHRyYWNlIGVudHJ5IGFmdGVyIHVwZGF0aW5nIGFuIGV4dGVudCBsaXN0IGVudHJ5IGluIHBsYWNlLgorICovCitTVEFUSUMgdm9pZAoreGZzX2JtYXBfdHJhY2VfcG9zdF91cGRhdGUoCisJY2hhcgkJKmZuYW1lLAkJLyogZnVuY3Rpb24gbmFtZSAqLworCWNoYXIJCSpkZXNjLAkJLyogb3BlcmF0aW9uIGRlc2NyaXB0aW9uICovCisJeGZzX2lub2RlX3QJKmlwLAkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfZXh0bnVtX3QJaWR4LAkJLyogaW5kZXggb2YgZW50cnkgdXBkYXRlZCAqLworCWludAkJd2hpY2hmb3JrKQkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworeworCXhmc19pZm9ya190CSppZnA7CQkvKiBpbm9kZSBmb3JrIHBvaW50ZXIgKi8KKworCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7CisJeGZzX2JtYXBfdHJhY2VfYWRkZW50cnkoWEZTX0JNQVBfS1RSQUNFX1BPU1RfVVAsIGZuYW1lLCBkZXNjLCBpcCwgaWR4LAorCQkxLCAmaWZwLT5pZl91MS5pZl9leHRlbnRzW2lkeF0sIE5VTEwsIHdoaWNoZm9yayk7Cit9CisKKy8qCisgKiBBZGQgYm1hcCB0cmFjZSBlbnRyeSBwcmlvciB0byB1cGRhdGluZyBhbiBleHRlbnQgbGlzdCBlbnRyeSBpbiBwbGFjZS4KKyAqLworU1RBVElDIHZvaWQKK3hmc19ibWFwX3RyYWNlX3ByZV91cGRhdGUoCisJY2hhcgkJKmZuYW1lLAkJLyogZnVuY3Rpb24gbmFtZSAqLworCWNoYXIJCSpkZXNjLAkJLyogb3BlcmF0aW9uIGRlc2NyaXB0aW9uICovCisJeGZzX2lub2RlX3QJKmlwLAkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfZXh0bnVtX3QJaWR4LAkJLyogaW5kZXggb2YgZW50cnkgdG8gYmUgdXBkYXRlZCAqLworCWludAkJd2hpY2hmb3JrKQkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworeworCXhmc19pZm9ya190CSppZnA7CQkvKiBpbm9kZSBmb3JrIHBvaW50ZXIgKi8KKworCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7CisJeGZzX2JtYXBfdHJhY2VfYWRkZW50cnkoWEZTX0JNQVBfS1RSQUNFX1BSRV9VUCwgZm5hbWUsIGRlc2MsIGlwLCBpZHgsIDEsCisJCSZpZnAtPmlmX3UxLmlmX2V4dGVudHNbaWR4XSwgTlVMTCwgd2hpY2hmb3JrKTsKK30KKyNlbmRpZgkvKiBYRlNfQk1BUF9UUkFDRSAqLworCisvKgorICogQ29tcHV0ZSB0aGUgd29yc3QtY2FzZSBudW1iZXIgb2YgaW5kaXJlY3QgYmxvY2tzIHRoYXQgd2lsbCBiZSB1c2VkCisgKiBmb3IgaXAncyBkZWxheWVkIGV4dGVudCBvZiBsZW5ndGggImxlbiIuCisgKi8KK1NUQVRJQyB4ZnNfZmlsYmxrc190Cit4ZnNfYm1hcF93b3JzdF9pbmRsZW4oCisJeGZzX2lub2RlX3QJKmlwLAkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfZmlsYmxrc190CWxlbikJCS8qIGRlbGF5ZWQgZXh0ZW50IGxlbmd0aCAqLworeworCWludAkJbGV2ZWw7CQkvKiBidHJlZSBsZXZlbCBudW1iZXIgKi8KKwlpbnQJCW1heHJlY3M7CS8qIG1heGltdW0gcmVjb3JkIGNvdW50IGF0IHRoaXMgbGV2ZWwgKi8KKwl4ZnNfbW91bnRfdAkqbXA7CQkvKiBtb3VudCBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZmlsYmxrc190CXJ2YWw7CQkvKiByZXR1cm4gdmFsdWUgKi8KKworCW1wID0gaXAtPmlfbW91bnQ7CisJbWF4cmVjcyA9IG1wLT5tX2JtYXBfZG14clswXTsKKwlmb3IgKGxldmVsID0gMCwgcnZhbCA9IDA7CisJICAgICBsZXZlbCA8IFhGU19CTV9NQVhMRVZFTFMobXAsIFhGU19EQVRBX0ZPUkspOworCSAgICAgbGV2ZWwrKykgeworCQlsZW4gKz0gbWF4cmVjcyAtIDE7CisJCWRvX2RpdihsZW4sIG1heHJlY3MpOworCQlydmFsICs9IGxlbjsKKwkJaWYgKGxlbiA9PSAxKQorCQkJcmV0dXJuIHJ2YWwgKyBYRlNfQk1fTUFYTEVWRUxTKG1wLCBYRlNfREFUQV9GT1JLKSAtCisJCQkJbGV2ZWwgLSAxOworCQlpZiAobGV2ZWwgPT0gMCkKKwkJCW1heHJlY3MgPSBtcC0+bV9ibWFwX2RteHJbMV07CisJfQorCXJldHVybiBydmFsOworfQorCisjaWYgZGVmaW5lZChYRlNfUldfVFJBQ0UpCitTVEFUSUMgdm9pZAoreGZzX2J1bm1hcF90cmFjZSgKKwl4ZnNfaW5vZGVfdAkJKmlwLAorCXhmc19maWxlb2ZmX3QJCWJubywKKwl4ZnNfZmlsYmxrc190CQlsZW4sCisJaW50CQkJZmxhZ3MsCisJaW5zdF90CQkJKnJhKQoreworCWlmIChpcC0+aV9yd3RyYWNlID09IE5VTEwpCisJCXJldHVybjsKKwlrdHJhY2VfZW50ZXIoaXAtPmlfcnd0cmFjZSwKKwkJKHZvaWQgKikoX19wc2ludF90KVhGU19CVU5NQVBJLAorCQkodm9pZCAqKWlwLAorCQkodm9pZCAqKShfX3BzaW50X3QpKChpcC0+aV9kLmRpX3NpemUgPj4gMzIpICYgMHhmZmZmZmZmZiksCisJCSh2b2lkICopKF9fcHNpbnRfdCkoaXAtPmlfZC5kaV9zaXplICYgMHhmZmZmZmZmZiksCisJCSh2b2lkICopKF9fcHNpbnRfdCkoKCh4ZnNfZGZpbG9mZl90KWJubyA+PiAzMikgJiAweGZmZmZmZmZmKSwKKwkJKHZvaWQgKikoX19wc2ludF90KSgoeGZzX2RmaWxvZmZfdClibm8gJiAweGZmZmZmZmZmKSwKKwkJKHZvaWQgKikoX19wc2ludF90KWxlbiwKKwkJKHZvaWQgKikoX19wc2ludF90KWZsYWdzLAorCQkodm9pZCAqKSh1bnNpZ25lZCBsb25nKWN1cnJlbnRfY3B1KCksCisJCSh2b2lkICopcmEsCisJCSh2b2lkICopMCwKKwkJKHZvaWQgKikwLAorCQkodm9pZCAqKTAsCisJCSh2b2lkICopMCwKKwkJKHZvaWQgKikwLAorCQkodm9pZCAqKTApOworfQorI2VuZGlmCisKKy8qCisgKiBDb252ZXJ0IGlub2RlIGZyb20gbm9uLWF0dHJpYnV0ZWQgdG8gYXR0cmlidXRlZC4KKyAqIE11c3Qgbm90IGJlIGluIGEgdHJhbnNhY3Rpb24sIGlwIG11c3Qgbm90IGJlIGxvY2tlZC4KKyAqLworaW50CQkJCQkJLyogZXJyb3IgY29kZSAqLworeGZzX2JtYXBfYWRkX2F0dHJmb3JrKAorCXhmc19pbm9kZV90CQkqaXAsCQkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLworCWludAkJCXJzdmQpCQkvKiBPSyB0byBhbGxvY2F0ZWQgcmVzZXJ2ZWQgYmxvY2tzIGluIHRyYW5zICovCit7CisJaW50CQkJYmxrczsJCS8qIHNwYWNlIHJlc2VydmF0aW9uICovCisJaW50CQkJY29tbWl0dGVkOwkvKiB4YWN0aW9uIHdhcyBjb21taXR0ZWQgKi8KKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCXhmc19mc2Jsb2NrX3QJCWZpcnN0YmxvY2s7CS8qIDFzdCBibG9jay9hZyBhbGxvY2F0ZWQgKi8KKwl4ZnNfYm1hcF9mcmVlX3QJCWZsaXN0OwkJLyogZnJlZWQgZXh0ZW50IGxpc3QgKi8KKwlpbnQJCQlsb2dmbGFnczsJLyogbG9nZ2luZyBmbGFncyAqLworCXhmc19tb3VudF90CQkqbXA7CQkvKiBtb3VudCBzdHJ1Y3R1cmUgKi8KKwl1bnNpZ25lZCBsb25nCQlzOwkJLyogc3BpbmxvY2sgc3BsIHZhbHVlICovCisJeGZzX3RyYW5zX3QJCSp0cDsJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKworCUFTU0VSVChpcC0+aV9kZi5pZl9leHRfbWF4ID09CisJICAgICAgIFhGU19JRk9SS19EU0laRShpcCkgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpKTsKKwlpZiAoWEZTX0lGT1JLX1EoaXApKQorCQlyZXR1cm4gMDsKKwltcCA9IGlwLT5pX21vdW50OworCUFTU0VSVCghWEZTX05PVF9EUUFUVEFDSEVEKG1wLCBpcCkpOworCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfQUREQUZPUkspOworCWJsa3MgPSBYRlNfQUREQUZPUktfU1BBQ0VfUkVTKG1wKTsKKwlpZiAocnN2ZCkKKwkJdHAtPnRfZmxhZ3MgfD0gWEZTX1RSQU5TX1JFU0VSVkU7CisJaWYgKChlcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCBibGtzLCBYRlNfQUREQUZPUktfTE9HX1JFUyhtcCksIDAsCisJCQlYRlNfVFJBTlNfUEVSTV9MT0dfUkVTLCBYRlNfQUREQUZPUktfTE9HX0NPVU5UKSkpCisJCWdvdG8gZXJyb3IwOworCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCWVycm9yID0gWEZTX1RSQU5TX1JFU0VSVkVfUVVPVEFfTkJMS1MobXAsIHRwLCBpcCwgYmxrcywgMCwgcnN2ZCA/CisJCQlYRlNfUU1PUFRfUkVTX1JFR0JMS1MgfCBYRlNfUU1PUFRfRk9SQ0VfUkVTIDoKKwkJCVhGU19RTU9QVF9SRVNfUkVHQkxLUyk7CisJaWYgKGVycm9yKSB7CisJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCXhmc190cmFuc19jYW5jZWwodHAsIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCWlmIChYRlNfSUZPUktfUShpcCkpCisJCWdvdG8gZXJyb3IxOworCWlmIChpcC0+aV9kLmRpX2Fmb3JtYXQgIT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUykgeworCQkvKgorCQkgKiBGb3IgaW5vZGVzIGNvbWluZyBmcm9tIHByZS02LjIgZmlsZXN5c3RlbXMuCisJCSAqLworCQlBU1NFUlQoaXAtPmlfZC5kaV9hZm9ybWF0ID09IDApOworCQlpcC0+aV9kLmRpX2Fmb3JtYXQgPSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTOworCX0KKwlBU1NFUlQoaXAtPmlfZC5kaV9hbmV4dGVudHMgPT0gMCk7CisJVk5fSE9MRChYRlNfSVRPVihpcCkpOworCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKKwl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CisJc3dpdGNoIChpcC0+aV9kLmRpX2Zvcm1hdCkgeworCWNhc2UgWEZTX0RJTk9ERV9GTVRfREVWOgorCQlpcC0+aV9kLmRpX2ZvcmtvZmYgPSByb3VuZHVwKHNpemVvZih4ZnNfZGV2X3QpLCA4KSA+PiAzOworCQlicmVhazsKKwljYXNlIFhGU19ESU5PREVfRk1UX1VVSUQ6CisJCWlwLT5pX2QuZGlfZm9ya29mZiA9IHJvdW5kdXAoc2l6ZW9mKHV1aWRfdCksIDgpID4+IDM7CisJCWJyZWFrOworCWNhc2UgWEZTX0RJTk9ERV9GTVRfTE9DQUw6CisJY2FzZSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTOgorCWNhc2UgWEZTX0RJTk9ERV9GTVRfQlRSRUU6CisJCWlwLT5pX2QuZGlfZm9ya29mZiA9IG1wLT5tX2F0dHJvZmZzZXQgPj4gMzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQVNTRVJUKDApOworCQllcnJvciA9IFhGU19FUlJPUihFSU5WQUwpOworCQlnb3RvIGVycm9yMTsKKwl9CisJaXAtPmlfZGYuaWZfZXh0X21heCA9CisJCVhGU19JRk9SS19EU0laRShpcCkgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpOworCUFTU0VSVChpcC0+aV9hZnAgPT0gTlVMTCk7CisJaXAtPmlfYWZwID0ga21lbV96b25lX3phbGxvYyh4ZnNfaWZvcmtfem9uZSwgS01fU0xFRVApOworCWlwLT5pX2FmcC0+aWZfZXh0X21heCA9CisJCVhGU19JRk9SS19BU0laRShpcCkgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpOworCWlwLT5pX2FmcC0+aWZfZmxhZ3MgPSBYRlNfSUZFWFRFTlRTOworCWxvZ2ZsYWdzID0gMDsKKwlYRlNfQk1BUF9JTklUKCZmbGlzdCwgJmZpcnN0YmxvY2spOworCXN3aXRjaCAoaXAtPmlfZC5kaV9mb3JtYXQpIHsKKwljYXNlIFhGU19ESU5PREVfRk1UX0xPQ0FMOgorCQllcnJvciA9IHhmc19ibWFwX2FkZF9hdHRyZm9ya19sb2NhbCh0cCwgaXAsICZmaXJzdGJsb2NrLCAmZmxpc3QsCisJCQkmbG9nZmxhZ3MpOworCQlicmVhazsKKwljYXNlIFhGU19ESU5PREVfRk1UX0VYVEVOVFM6CisJCWVycm9yID0geGZzX2JtYXBfYWRkX2F0dHJmb3JrX2V4dGVudHModHAsIGlwLCAmZmlyc3RibG9jaywKKwkJCSZmbGlzdCwgJmxvZ2ZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSBYRlNfRElOT0RFX0ZNVF9CVFJFRToKKwkJZXJyb3IgPSB4ZnNfYm1hcF9hZGRfYXR0cmZvcmtfYnRyZWUodHAsIGlwLCAmZmlyc3RibG9jaywgJmZsaXN0LAorCQkJJmxvZ2ZsYWdzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyb3IgPSAwOworCQlicmVhazsKKwl9CisJaWYgKGxvZ2ZsYWdzKQorCQl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgbG9nZmxhZ3MpOworCWlmIChlcnJvcikKKwkJZ290byBlcnJvcjI7CisJaWYgKCFYRlNfU0JfVkVSU0lPTl9IQVNBVFRSKCZtcC0+bV9zYikpIHsKKwkJcyA9IFhGU19TQl9MT0NLKG1wKTsKKwkJaWYgKCFYRlNfU0JfVkVSU0lPTl9IQVNBVFRSKCZtcC0+bV9zYikpIHsKKwkJCVhGU19TQl9WRVJTSU9OX0FEREFUVFIoJm1wLT5tX3NiKTsKKwkJCVhGU19TQl9VTkxPQ0sobXAsIHMpOworCQkJeGZzX21vZF9zYih0cCwgWEZTX1NCX1ZFUlNJT05OVU0pOworCQl9IGVsc2UKKwkJCVhGU19TQl9VTkxPQ0sobXAsIHMpOworCX0KKwlpZiAoKGVycm9yID0geGZzX2JtYXBfZmluaXNoKCZ0cCwgJmZsaXN0LCBmaXJzdGJsb2NrLCAmY29tbWl0dGVkKSkpCisJCWdvdG8gZXJyb3IyOworCWVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwgWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywgTlVMTCk7CisJQVNTRVJUKGlwLT5pX2RmLmlmX2V4dF9tYXggPT0KKwkgICAgICAgWEZTX0lGT1JLX0RTSVpFKGlwKSAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCkpOworCXJldHVybiBlcnJvcjsKK2Vycm9yMjoKKwl4ZnNfYm1hcF9jYW5jZWwoJmZsaXN0KTsKK2Vycm9yMToKKwlBU1NFUlQoaXNtcmxvY2tlZCgmaXAtPmlfbG9jayxNUl9VUERBVEUpKTsKKwl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworZXJyb3IwOgorCXhmc190cmFuc19jYW5jZWwodHAsIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVN8WEZTX1RSQU5TX0FCT1JUKTsKKwlBU1NFUlQoaXAtPmlfZGYuaWZfZXh0X21heCA9PQorCSAgICAgICBYRlNfSUZPUktfRFNJWkUoaXApIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KSk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogQWRkIHRoZSBleHRlbnQgdG8gdGhlIGxpc3Qgb2YgZXh0ZW50cyB0byBiZSBmcmVlIGF0IHRyYW5zYWN0aW9uIGVuZC4KKyAqIFRoZSBsaXN0IGlzIG1haW50YWluZWQgc29ydGVkIChieSBibG9jayBudW1iZXIpLgorICovCisvKiBBUkdTVVNFRCAqLwordm9pZAoreGZzX2JtYXBfYWRkX2ZyZWUoCisJeGZzX2ZzYmxvY2tfdAkJYm5vLAkJLyogZnMgYmxvY2sgbnVtYmVyIG9mIGV4dGVudCAqLworCXhmc19maWxibGtzX3QJCWxlbiwJCS8qIGxlbmd0aCBvZiBleHRlbnQgKi8KKwl4ZnNfYm1hcF9mcmVlX3QJCSpmbGlzdCwJCS8qIGxpc3Qgb2YgZXh0ZW50cyAqLworCXhmc19tb3VudF90CQkqbXApCQkvKiBtb3VudCBwb2ludCBzdHJ1Y3R1cmUgKi8KK3sKKwl4ZnNfYm1hcF9mcmVlX2l0ZW1fdAkqY3VyOwkJLyogY3VycmVudCAobmV4dCkgZWxlbWVudCAqLworCXhmc19ibWFwX2ZyZWVfaXRlbV90CSpuZXc7CQkvKiBuZXcgZWxlbWVudCAqLworCXhmc19ibWFwX2ZyZWVfaXRlbV90CSpwcmV2OwkJLyogcHJldmlvdXMgZWxlbWVudCAqLworI2lmZGVmIERFQlVHCisJeGZzX2FnbnVtYmVyX3QJCWFnbm87CisJeGZzX2FnYmxvY2tfdAkJYWdibm87CisKKwlBU1NFUlQoYm5vICE9IE5VTExGU0JMT0NLKTsKKwlBU1NFUlQobGVuID4gMCk7CisJQVNTRVJUKGxlbiA8PSBNQVhFWFRMRU4pOworCUFTU0VSVCghSVNOVUxMU1RBUlRCTE9DSyhibm8pKTsKKwlhZ25vID0gWEZTX0ZTQl9UT19BR05PKG1wLCBibm8pOworCWFnYm5vID0gWEZTX0ZTQl9UT19BR0JOTyhtcCwgYm5vKTsKKwlBU1NFUlQoYWdubyA8IG1wLT5tX3NiLnNiX2FnY291bnQpOworCUFTU0VSVChhZ2JubyA8IG1wLT5tX3NiLnNiX2FnYmxvY2tzKTsKKwlBU1NFUlQobGVuIDwgbXAtPm1fc2Iuc2JfYWdibG9ja3MpOworCUFTU0VSVChhZ2JubyArIGxlbiA8PSBtcC0+bV9zYi5zYl9hZ2Jsb2Nrcyk7CisjZW5kaWYKKwlBU1NFUlQoeGZzX2JtYXBfZnJlZV9pdGVtX3pvbmUgIT0gTlVMTCk7CisJbmV3ID0ga21lbV96b25lX2FsbG9jKHhmc19ibWFwX2ZyZWVfaXRlbV96b25lLCBLTV9TTEVFUCk7CisJbmV3LT54YmZpX3N0YXJ0YmxvY2sgPSBibm87CisJbmV3LT54YmZpX2Jsb2NrY291bnQgPSAoeGZzX2V4dGxlbl90KWxlbjsKKwlmb3IgKHByZXYgPSBOVUxMLCBjdXIgPSBmbGlzdC0+eGJmX2ZpcnN0OworCSAgICAgY3VyICE9IE5VTEw7CisJICAgICBwcmV2ID0gY3VyLCBjdXIgPSBjdXItPnhiZmlfbmV4dCkgeworCQlpZiAoY3VyLT54YmZpX3N0YXJ0YmxvY2sgPj0gYm5vKQorCQkJYnJlYWs7CisJfQorCWlmIChwcmV2KQorCQlwcmV2LT54YmZpX25leHQgPSBuZXc7CisJZWxzZQorCQlmbGlzdC0+eGJmX2ZpcnN0ID0gbmV3OworCW5ldy0+eGJmaV9uZXh0ID0gY3VyOworCWZsaXN0LT54YmZfY291bnQrKzsKK30KKworLyoKKyAqIENvbXB1dGUgYW5kIGZpbGwgaW4gdGhlIHZhbHVlIG9mIHRoZSBtYXhpbXVtIGRlcHRoIG9mIGEgYm1hcCBidHJlZQorICogaW4gdGhpcyBmaWxlc3lzdGVtLiAgRG9uZSBvbmNlLCBkdXJpbmcgbW91bnQuCisgKi8KK3ZvaWQKK3hmc19ibWFwX2NvbXB1dGVfbWF4bGV2ZWxzKAorCXhmc19tb3VudF90CSptcCwJCS8qIGZpbGUgc3lzdGVtIG1vdW50IHN0cnVjdHVyZSAqLworCWludAkJd2hpY2hmb3JrKQkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworeworCWludAkJbGV2ZWw7CQkvKiBidHJlZSBsZXZlbCAqLworCXVpbnQJCW1heGJsb2NrczsJLyogbWF4IGJsb2NrcyBhdCB0aGlzIGxldmVsICovCisJdWludAkJbWF4bGVhZmVudHM7CS8qIG1heCBsZWFmIGVudHJpZXMgcG9zc2libGUgKi8KKwlpbnQJCW1heHJvb3RyZWNzOwkvKiBtYXggcmVjb3JkcyBpbiByb290IGJsb2NrICovCisJaW50CQltaW5sZWFmcmVjczsJLyogbWluIHJlY29yZHMgaW4gbGVhZiBibG9jayAqLworCWludAkJbWlubm9kZXJlY3M7CS8qIG1pbiByZWNvcmRzIGluIG5vZGUgYmxvY2sgKi8KKwlpbnQJCXN6OwkJLyogcm9vdCBibG9jayBzaXplICovCisKKwkvKgorCSAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBleHRlbnRzIGluIGEgZmlsZSwgaGVuY2UgdGhlIG1heGltdW0KKwkgKiBudW1iZXIgb2YgbGVhZiBlbnRyaWVzLCBpcyBjb250cm9sbGVkIGJ5IHRoZSB0eXBlIG9mIGRpX25leHRlbnRzCisJICogKGEgc2lnbmVkIDMyLWJpdCBudW1iZXIsIHhmc19leHRudW1fdCksIG9yIGJ5IGRpX2FuZXh0ZW50cworCSAqIChhIHNpZ25lZCAxNi1iaXQgbnVtYmVyLCB4ZnNfYWV4dG51bV90KS4KKwkgKi8KKwltYXhsZWFmZW50cyA9ICh3aGljaGZvcmsgPT0gWEZTX0RBVEFfRk9SSykgPyBNQVhFWFROVU0gOiBNQVhBRVhUTlVNOworCW1pbmxlYWZyZWNzID0gbXAtPm1fYm1hcF9kbW5yWzBdOworCW1pbm5vZGVyZWNzID0gbXAtPm1fYm1hcF9kbW5yWzFdOworCXN6ID0gKHdoaWNoZm9yayA9PSBYRlNfREFUQV9GT1JLKSA/CisJCW1wLT5tX2F0dHJvZmZzZXQgOgorCQltcC0+bV9zYi5zYl9pbm9kZXNpemUgLSBtcC0+bV9hdHRyb2Zmc2V0OworCW1heHJvb3RyZWNzID0gKGludClYRlNfQlRSRUVfQkxPQ0tfTUFYUkVDUyhzeiwgeGZzX2JtZHIsIDApOworCW1heGJsb2NrcyA9IChtYXhsZWFmZW50cyArIG1pbmxlYWZyZWNzIC0gMSkgLyBtaW5sZWFmcmVjczsKKwlmb3IgKGxldmVsID0gMTsgbWF4YmxvY2tzID4gMTsgbGV2ZWwrKykgeworCQlpZiAobWF4YmxvY2tzIDw9IG1heHJvb3RyZWNzKQorCQkJbWF4YmxvY2tzID0gMTsKKwkJZWxzZQorCQkJbWF4YmxvY2tzID0gKG1heGJsb2NrcyArIG1pbm5vZGVyZWNzIC0gMSkgLyBtaW5ub2RlcmVjczsKKwl9CisJbXAtPm1fYm1fbWF4bGV2ZWxzW3doaWNoZm9ya10gPSBsZXZlbDsKK30KKworLyoKKyAqIFJvdXRpbmUgdG8gYmUgY2FsbGVkIGF0IHRyYW5zYWN0aW9uJ3MgZW5kIGJ5IHhmc19ibWFwaSwgeGZzX2J1bm1hcGkKKyAqIGNhbGxlci4gIEZyZWVzIGFsbCB0aGUgZXh0ZW50cyB0aGF0IG5lZWQgZnJlZWluZywgd2hpY2ggbXVzdCBiZSBkb25lCisgKiBsYXN0IGR1ZSB0byBsb2NraW5nIGNvbnNpZGVyYXRpb25zLiAgV2UgbmV2ZXIgZnJlZSBhbnkgZXh0ZW50cyBpbgorICogdGhlIGZpcnN0IHRyYW5zYWN0aW9uLiAgVGhpcyBpcyB0byBhbGxvdyB0aGUgY2FsbGVyIHRvIG1ha2UgdGhlIGZpcnN0CisgKiB0cmFuc2FjdGlvbiBhIHN5bmNocm9ub3VzIG9uZSBzbyB0aGF0IHRoZSBwb2ludGVycyB0byB0aGUgZGF0YSBiZWluZworICogYnJva2VuIGluIHRoaXMgdHJhbnNhY3Rpb24gd2lsbCBiZSBwZXJtYW5lbnQgYmVmb3JlIHRoZSBkYXRhIGlzIGFjdHVhbGx5CisgKiBmcmVlZC4gIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIHByZXZlbnQgYmxvY2tzIGZyb20gYmVpbmcgcmVhbGxvY2F0ZWQKKyAqIGFuZCB3cml0dGVuIHRvIGJlZm9yZSB0aGUgZnJlZSBhbmQgcmVhbGxvY2F0aW9uIGFyZSBhY3R1YWxseSBwZXJtYW5lbnQuCisgKiBXZSBkbyBub3QganVzdCBtYWtlIHRoZSBmaXJzdCB0cmFuc2FjdGlvbiBzeW5jaHJvbm91cyBoZXJlLCBiZWNhdXNlCisgKiB0aGVyZSBhcmUgbW9yZSBlZmZpY2llbnQgd2F5cyB0byBnYWluIHRoZSBzYW1lIHByb3RlY3Rpb24gaW4gc29tZSBjYXNlcworICogKHNlZSB0aGUgZmlsZSB0cnVuY2F0aW9uIGNvZGUpLgorICoKKyAqIFJldHVybiAxIGlmIHRoZSBnaXZlbiB0cmFuc2FjdGlvbiB3YXMgY29tbWl0dGVkIGFuZCBhIG5ldyBvbmUKKyAqIHN0YXJ0ZWQsIGFuZCAwIG90aGVyd2lzZSBpbiB0aGUgY29tbWl0dGVkIHBhcmFtZXRlci4KKyAqLworLypBUkdTVVNFRCovCitpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2JtYXBfZmluaXNoKAorCXhmc190cmFuc190CQkqKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciBhZGRyICovCisJeGZzX2JtYXBfZnJlZV90CQkqZmxpc3QsCQkvKiBpL286IGxpc3QgZXh0ZW50cyB0byBmcmVlICovCisJeGZzX2ZzYmxvY2tfdAkJZmlyc3RibG9jaywJLyogY29udHJvbGxlZCBhZyBmb3IgYWxsb2NzICovCisJaW50CQkJKmNvbW1pdHRlZCkJLyogeGFjdCBjb21taXR0ZWQgb3Igbm90ICovCit7CisJeGZzX2VmZF9sb2dfaXRlbV90CSplZmQ7CQkvKiBleHRlbnQgZnJlZSBkYXRhICovCisJeGZzX2VmaV9sb2dfaXRlbV90CSplZmk7CQkvKiBleHRlbnQgZnJlZSBpbnRlbnRpb24gKi8KKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCXhmc19ibWFwX2ZyZWVfaXRlbV90CSpmcmVlOwkJLyogZnJlZSBleHRlbnQgbGlzdCBpdGVtICovCisJdW5zaWduZWQgaW50CQlsb2dyZXM7CQkvKiBuZXcgbG9nIHJlc2VydmF0aW9uICovCisJdW5zaWduZWQgaW50CQlsb2djb3VudDsJLyogbmV3IGxvZyBjb3VudCAqLworCXhmc19tb3VudF90CQkqbXA7CQkvKiBmaWxlc3lzdGVtIG1vdW50IHN0cnVjdHVyZSAqLworCXhmc19ibWFwX2ZyZWVfaXRlbV90CSpuZXh0OwkJLyogbmV4dCBpdGVtIG9uIGZyZWUgbGlzdCAqLworCXhmc190cmFuc190CQkqbnRwOwkJLyogbmV3IHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKworCUFTU0VSVCgoKnRwKS0+dF9mbGFncyAmIFhGU19UUkFOU19QRVJNX0xPR19SRVMpOworCWlmIChmbGlzdC0+eGJmX2NvdW50ID09IDApIHsKKwkJKmNvbW1pdHRlZCA9IDA7CisJCXJldHVybiAwOworCX0KKwludHAgPSAqdHA7CisJZWZpID0geGZzX3RyYW5zX2dldF9lZmkobnRwLCBmbGlzdC0+eGJmX2NvdW50KTsKKwlmb3IgKGZyZWUgPSBmbGlzdC0+eGJmX2ZpcnN0OyBmcmVlOyBmcmVlID0gZnJlZS0+eGJmaV9uZXh0KQorCQl4ZnNfdHJhbnNfbG9nX2VmaV9leHRlbnQobnRwLCBlZmksIGZyZWUtPnhiZmlfc3RhcnRibG9jaywKKwkJCWZyZWUtPnhiZmlfYmxvY2tjb3VudCk7CisJbG9ncmVzID0gbnRwLT50X2xvZ19yZXM7CisJbG9nY291bnQgPSBudHAtPnRfbG9nX2NvdW50OworCW50cCA9IHhmc190cmFuc19kdXAoKnRwKTsKKwllcnJvciA9IHhmc190cmFuc19jb21taXQoKnRwLCAwLCBOVUxMKTsKKwkqdHAgPSBudHA7CisJKmNvbW1pdHRlZCA9IDE7CisJLyoKKwkgKiBXZSBoYXZlIGEgbmV3IHRyYW5zYWN0aW9uLCBzbyB3ZSBzaG91bGQgcmV0dXJuIGNvbW1pdHRlZD0xLAorCSAqIGV2ZW4gdGhvdWdoIHdlJ3JlIHJldHVybmluZyBhbiBlcnJvci4KKwkgKi8KKwlpZiAoZXJyb3IpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlpZiAoKGVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUobnRwLCAwLCBsb2dyZXMsIDAsIFhGU19UUkFOU19QRVJNX0xPR19SRVMsCisJCQlsb2djb3VudCkpKQorCQlyZXR1cm4gZXJyb3I7CisJZWZkID0geGZzX3RyYW5zX2dldF9lZmQobnRwLCBlZmksIGZsaXN0LT54YmZfY291bnQpOworCWZvciAoZnJlZSA9IGZsaXN0LT54YmZfZmlyc3Q7IGZyZWUgIT0gTlVMTDsgZnJlZSA9IG5leHQpIHsKKwkJbmV4dCA9IGZyZWUtPnhiZmlfbmV4dDsKKwkJaWYgKChlcnJvciA9IHhmc19mcmVlX2V4dGVudChudHAsIGZyZWUtPnhiZmlfc3RhcnRibG9jaywKKwkJCQlmcmVlLT54YmZpX2Jsb2NrY291bnQpKSkgeworCQkJLyoKKwkJCSAqIFRoZSBibWFwIGZyZWUgbGlzdCB3aWxsIGJlIGNsZWFuZWQgdXAgYXQgYQorCQkJICogaGlnaGVyIGxldmVsLiAgVGhlIEVGSSB3aWxsIGJlIGNhbmNlbGVkIHdoZW4KKwkJCSAqIHRoaXMgdHJhbnNhY3Rpb24gaXMgYWJvcnRlZC4KKwkJCSAqIE5lZWQgdG8gZm9yY2Ugc2h1dGRvd24gaGVyZSB0byBtYWtlIHN1cmUgaXQKKwkJCSAqIGhhcHBlbnMsIHNpbmNlIHRoaXMgdHJhbnNhY3Rpb24gbWF5IG5vdCBiZQorCQkJICogZGlydHkgeWV0LgorCQkJICovCisJCQltcCA9IG50cC0+dF9tb3VudHA7CisJCQlpZiAoIVhGU19GT1JDRURfU0hVVERPV04obXApKQorCQkJCXhmc19mb3JjZV9zaHV0ZG93bihtcCwKKwkJCQkJCSAgIChlcnJvciA9PSBFRlNDT1JSVVBURUQpID8KKwkJCQkJCSAgIFhGU19DT1JSVVBUX0lOQ09SRSA6CisJCQkJCQkgICBYRlNfTUVUQURBVEFfSU9fRVJST1IpOworCQkJcmV0dXJuIGVycm9yOworCQl9CisJCXhmc190cmFuc19sb2dfZWZkX2V4dGVudChudHAsIGVmZCwgZnJlZS0+eGJmaV9zdGFydGJsb2NrLAorCQkJZnJlZS0+eGJmaV9ibG9ja2NvdW50KTsKKwkJeGZzX2JtYXBfZGVsX2ZyZWUoZmxpc3QsIE5VTEwsIGZyZWUpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZyZWUgdXAgYW55IGl0ZW1zIGxlZnQgaW4gdGhlIGxpc3QuCisgKi8KK3ZvaWQKK3hmc19ibWFwX2NhbmNlbCgKKwl4ZnNfYm1hcF9mcmVlX3QJCSpmbGlzdCkJLyogbGlzdCBvZiBibWFwX2ZyZWVfaXRlbXMgKi8KK3sKKwl4ZnNfYm1hcF9mcmVlX2l0ZW1fdAkqZnJlZTsJLyogZnJlZSBsaXN0IGl0ZW0gKi8KKwl4ZnNfYm1hcF9mcmVlX2l0ZW1fdAkqbmV4dDsKKworCWlmIChmbGlzdC0+eGJmX2NvdW50ID09IDApCisJCXJldHVybjsKKwlBU1NFUlQoZmxpc3QtPnhiZl9maXJzdCAhPSBOVUxMKTsKKwlmb3IgKGZyZWUgPSBmbGlzdC0+eGJmX2ZpcnN0OyBmcmVlOyBmcmVlID0gbmV4dCkgeworCQluZXh0ID0gZnJlZS0+eGJmaV9uZXh0OworCQl4ZnNfYm1hcF9kZWxfZnJlZShmbGlzdCwgTlVMTCwgZnJlZSk7CisJfQorCUFTU0VSVChmbGlzdC0+eGJmX2NvdW50ID09IDApOworfQorCisvKgorICogUmV0dXJucyB0aGUgZmlsZS1yZWxhdGl2ZSBibG9jayBudW1iZXIgb2YgdGhlIGZpcnN0IHVudXNlZCBibG9jayhzKQorICogaW4gdGhlIGZpbGUgd2l0aCBhdCBsZWFzdCAibGVuIiBsb2dpY2FsbHkgY29udGlndW91cyBibG9ja3MgZnJlZS4KKyAqIFRoaXMgaXMgdGhlIGxvd2VzdC1hZGRyZXNzIGhvbGUgaWYgdGhlIGZpbGUgaGFzIGhvbGVzLCBlbHNlIHRoZSBmaXJzdCBibG9jaworICogcGFzdCB0aGUgZW5kIG9mIGZpbGUuCisgKiBSZXR1cm4gMCBpZiB0aGUgZmlsZSBpcyBjdXJyZW50bHkgbG9jYWwgKGluLWlub2RlKS4KKyAqLworaW50CQkJCQkJLyogZXJyb3IgKi8KK3hmc19ibWFwX2ZpcnN0X3VudXNlZCgKKwl4ZnNfdHJhbnNfdAkqdHAsCQkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19pbm9kZV90CSppcCwJCQkvKiBpbmNvcmUgaW5vZGUgKi8KKwl4ZnNfZXh0bGVuX3QJbGVuLAkJCS8qIHNpemUgb2YgaG9sZSB0byBmaW5kICovCisJeGZzX2ZpbGVvZmZfdAkqZmlyc3RfdW51c2VkLAkJLyogdW51c2VkIGJsb2NrICovCisJaW50CQl3aGljaGZvcmspCQkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworeworCXhmc19ibWJ0X3JlY190CSpiYXNlOwkJCS8qIGJhc2Ugb2YgZXh0ZW50IGFycmF5ICovCisJeGZzX2JtYnRfcmVjX3QJKmVwOwkJCS8qIHBvaW50ZXIgdG8gYW4gZXh0ZW50IGVudHJ5ICovCisJaW50CQllcnJvcjsJCQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwl4ZnNfaWZvcmtfdAkqaWZwOwkJCS8qIGlub2RlIGZvcmsgcG9pbnRlciAqLworCXhmc19maWxlb2ZmX3QJbGFzdGFkZHI7CQkvKiBsYXN0IGJsb2NrIG51bWJlciBzZWVuICovCisJeGZzX2ZpbGVvZmZfdAlsb3dlc3Q7CQkJLyogbG93ZXN0IHVzZWZ1bCBibG9jayAqLworCXhmc19maWxlb2ZmX3QJbWF4OwkJCS8qIHN0YXJ0aW5nIHVzZWZ1bCBibG9jayAqLworCXhmc19maWxlb2ZmX3QJb2ZmOwkJCS8qIG9mZnNldCBmb3IgdGhpcyBibG9jayAqLworCXhmc19leHRudW1fdAluZXh0ZW50czsJCS8qIG51bWJlciBvZiBleHRlbnQgZW50cmllcyAqLworCisJQVNTRVJUKFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgPT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUgfHwKKwkgICAgICAgWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTIHx8CisJICAgICAgIFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgPT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpOworCWlmIChYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspID09IFhGU19ESU5PREVfRk1UX0xPQ0FMKSB7CisJCSpmaXJzdF91bnVzZWQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgd2hpY2hmb3JrKTsKKwlpZiAoIShpZnAtPmlmX2ZsYWdzICYgWEZTX0lGRVhURU5UUykgJiYKKwkgICAgKGVycm9yID0geGZzX2lyZWFkX2V4dGVudHModHAsIGlwLCB3aGljaGZvcmspKSkKKwkJcmV0dXJuIGVycm9yOworCWxvd2VzdCA9ICpmaXJzdF91bnVzZWQ7CisJbmV4dGVudHMgPSBpZnAtPmlmX2J5dGVzIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KTsKKwliYXNlID0gJmlmcC0+aWZfdTEuaWZfZXh0ZW50c1swXTsKKwlmb3IgKGxhc3RhZGRyID0gMCwgbWF4ID0gbG93ZXN0LCBlcCA9IGJhc2U7CisJICAgICBlcCA8ICZiYXNlW25leHRlbnRzXTsKKwkgICAgIGVwKyspIHsKKwkJb2ZmID0geGZzX2JtYnRfZ2V0X3N0YXJ0b2ZmKGVwKTsKKwkJLyoKKwkJICogU2VlIGlmIHRoZSBob2xlIGJlZm9yZSB0aGlzIGV4dGVudCB3aWxsIHdvcmsuCisJCSAqLworCQlpZiAob2ZmID49IGxvd2VzdCArIGxlbiAmJiBvZmYgLSBtYXggPj0gbGVuKSB7CisJCQkqZmlyc3RfdW51c2VkID0gbWF4OworCQkJcmV0dXJuIDA7CisJCX0KKwkJbGFzdGFkZHIgPSBvZmYgKyB4ZnNfYm1idF9nZXRfYmxvY2tjb3VudChlcCk7CisJCW1heCA9IFhGU19GSUxFT0ZGX01BWChsYXN0YWRkciwgbG93ZXN0KTsKKwl9CisJKmZpcnN0X3VudXNlZCA9IG1heDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJldHVybnMgdGhlIGZpbGUtcmVsYXRpdmUgYmxvY2sgbnVtYmVyIG9mIHRoZSBsYXN0IGJsb2NrICsgMSBiZWZvcmUKKyAqIGxhc3RfYmxvY2sgKGlucHV0IHZhbHVlKSBpbiB0aGUgZmlsZS4KKyAqIFRoaXMgaXMgbm90IGJhc2VkIG9uIGlfc2l6ZSwgaXQgaXMgYmFzZWQgb24gdGhlIGV4dGVudCBsaXN0LgorICogUmV0dXJucyAwIGZvciBsb2NhbCBmaWxlcywgYXMgdGhleSBkbyBub3QgaGF2ZSBhbiBleHRlbnQgbGlzdC4KKyAqLworaW50CQkJCQkJLyogZXJyb3IgKi8KK3hmc19ibWFwX2xhc3RfYmVmb3JlKAorCXhmc190cmFuc190CSp0cCwJCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2lub2RlX3QJKmlwLAkJCS8qIGluY29yZSBpbm9kZSAqLworCXhmc19maWxlb2ZmX3QJKmxhc3RfYmxvY2ssCQkvKiBsYXN0IGJsb2NrICovCisJaW50CQl3aGljaGZvcmspCQkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworeworCXhmc19maWxlb2ZmX3QJYm5vOwkJCS8qIGlucHV0IGZpbGUgb2Zmc2V0ICovCisJaW50CQllb2Y7CQkJLyogaGl0IGVuZCBvZiBmaWxlICovCisJeGZzX2JtYnRfcmVjX3QJKmVwOwkJCS8qIHBvaW50ZXIgdG8gbGFzdCBleHRlbnQgKi8KKwlpbnQJCWVycm9yOwkJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCXhmc19ibWJ0X2lyZWNfdAlnb3Q7CQkJLyogY3VycmVudCBleHRlbnQgdmFsdWUgKi8KKwl4ZnNfaWZvcmtfdAkqaWZwOwkJCS8qIGlub2RlIGZvcmsgcG9pbnRlciAqLworCXhmc19leHRudW1fdAlsYXN0eDsJCQkvKiBsYXN0IGV4dGVudCB1c2VkICovCisJeGZzX2JtYnRfaXJlY190CXByZXY7CQkJLyogcHJldmlvdXMgZXh0ZW50IHZhbHVlICovCisKKwlpZiAoWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSAhPSBYRlNfRElOT0RFX0ZNVF9CVFJFRSAmJgorCSAgICBYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspICE9IFhGU19ESU5PREVfRk1UX0VYVEVOVFMgJiYKKwkgICAgWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSAhPSBYRlNfRElOT0RFX0ZNVF9MT0NBTCkKKwkgICAgICAgcmV0dXJuIFhGU19FUlJPUihFSU8pOworCWlmIChYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspID09IFhGU19ESU5PREVfRk1UX0xPQ0FMKSB7CisJCSpsYXN0X2Jsb2NrID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7CisJaWYgKCEoaWZwLT5pZl9mbGFncyAmIFhGU19JRkVYVEVOVFMpICYmCisJICAgIChlcnJvciA9IHhmc19pcmVhZF9leHRlbnRzKHRwLCBpcCwgd2hpY2hmb3JrKSkpCisJCXJldHVybiBlcnJvcjsKKwlibm8gPSAqbGFzdF9ibG9jayAtIDE7CisJZXAgPSB4ZnNfYm1hcF9zZWFyY2hfZXh0ZW50cyhpcCwgYm5vLCB3aGljaGZvcmssICZlb2YsICZsYXN0eCwgJmdvdCwKKwkJJnByZXYpOworCWlmIChlb2YgfHwgeGZzX2JtYnRfZ2V0X3N0YXJ0b2ZmKGVwKSA+IGJubykgeworCQlpZiAocHJldi5icl9zdGFydG9mZiA9PSBOVUxMRklMRU9GRikKKwkJCSpsYXN0X2Jsb2NrID0gMDsKKwkJZWxzZQorCQkJKmxhc3RfYmxvY2sgPSBwcmV2LmJyX3N0YXJ0b2ZmICsgcHJldi5icl9ibG9ja2NvdW50OworCX0KKwkvKgorCSAqIE90aGVyd2lzZSAqbGFzdF9ibG9jayBpcyBhbHJlYWR5IHRoZSByaWdodCBhbnN3ZXIuCisJICovCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXR1cm5zIHRoZSBmaWxlLXJlbGF0aXZlIGJsb2NrIG51bWJlciBvZiB0aGUgZmlyc3QgYmxvY2sgcGFzdCBlb2YgaW4KKyAqIHRoZSBmaWxlLiAgVGhpcyBpcyBub3QgYmFzZWQgb24gaV9zaXplLCBpdCBpcyBiYXNlZCBvbiB0aGUgZXh0ZW50IGxpc3QuCisgKiBSZXR1cm5zIDAgZm9yIGxvY2FsIGZpbGVzLCBhcyB0aGV5IGRvIG5vdCBoYXZlIGFuIGV4dGVudCBsaXN0LgorICovCitpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2JtYXBfbGFzdF9vZmZzZXQoCisJeGZzX3RyYW5zX3QJKnRwLAkJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfaW5vZGVfdAkqaXAsCQkJLyogaW5jb3JlIGlub2RlICovCisJeGZzX2ZpbGVvZmZfdAkqbGFzdF9ibG9jaywJCS8qIGxhc3QgYmxvY2sgKi8KKwlpbnQJCXdoaWNoZm9yaykJCS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCit7CisJeGZzX2JtYnRfcmVjX3QJKmJhc2U7CQkJLyogYmFzZSBvZiBleHRlbnQgYXJyYXkgKi8KKwl4ZnNfYm1idF9yZWNfdAkqZXA7CQkJLyogcG9pbnRlciB0byBsYXN0IGV4dGVudCAqLworCWludAkJZXJyb3I7CQkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJeGZzX2lmb3JrX3QJKmlmcDsJCQkvKiBpbm9kZSBmb3JrIHBvaW50ZXIgKi8KKwl4ZnNfZXh0bnVtX3QJbmV4dGVudHM7CQkvKiBudW1iZXIgb2YgZXh0ZW50IGVudHJpZXMgKi8KKworCWlmIChYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspICE9IFhGU19ESU5PREVfRk1UX0JUUkVFICYmCisJICAgIFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgIT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUyAmJgorCSAgICBYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspICE9IFhGU19ESU5PREVfRk1UX0xPQ0FMKQorCSAgICAgICByZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJaWYgKFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgPT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpIHsKKwkJKmxhc3RfYmxvY2sgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgd2hpY2hmb3JrKTsKKwlpZiAoIShpZnAtPmlmX2ZsYWdzICYgWEZTX0lGRVhURU5UUykgJiYKKwkgICAgKGVycm9yID0geGZzX2lyZWFkX2V4dGVudHModHAsIGlwLCB3aGljaGZvcmspKSkKKwkJcmV0dXJuIGVycm9yOworCW5leHRlbnRzID0gaWZwLT5pZl9ieXRlcyAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCk7CisJaWYgKCFuZXh0ZW50cykgeworCQkqbGFzdF9ibG9jayA9IDA7CisJCXJldHVybiAwOworCX0KKwliYXNlID0gJmlmcC0+aWZfdTEuaWZfZXh0ZW50c1swXTsKKwlBU1NFUlQoYmFzZSAhPSBOVUxMKTsKKwllcCA9ICZiYXNlW25leHRlbnRzIC0gMV07CisJKmxhc3RfYmxvY2sgPSB4ZnNfYm1idF9nZXRfc3RhcnRvZmYoZXApICsgeGZzX2JtYnRfZ2V0X2Jsb2NrY291bnQoZXApOworCXJldHVybiAwOworfQorCisvKgorICogUmV0dXJucyB3aGV0aGVyIHRoZSBzZWxlY3RlZCBmb3JrIG9mIHRoZSBpbm9kZSBoYXMgZXhhY3RseSBvbmUKKyAqIGJsb2NrIG9yIG5vdC4gIEZvciB0aGUgZGF0YSBmb3JrIHdlIGNoZWNrIHRoaXMgbWF0Y2hlcyBkaV9zaXplLAorICogaW1wbHlpbmcgdGhlIGZpbGUncyByYW5nZSBpcyAwLi5ic2l6ZS0xLgorICovCitpbnQJCQkJCS8qIDE9PjEgYmxvY2ssIDA9Pm90aGVyd2lzZSAqLworeGZzX2JtYXBfb25lX2Jsb2NrKAorCXhmc19pbm9kZV90CSppcCwJCS8qIGluY29yZSBpbm9kZSAqLworCWludAkJd2hpY2hmb3JrKQkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworeworCXhmc19ibWJ0X3JlY190CSplcDsJCS8qIHB0ciB0byBmb3JrJ3MgZXh0ZW50ICovCisJeGZzX2lmb3JrX3QJKmlmcDsJCS8qIGlub2RlIGZvcmsgcG9pbnRlciAqLworCWludAkJcnZhbDsJCS8qIHJldHVybiB2YWx1ZSAqLworCXhmc19ibWJ0X2lyZWNfdAlzOwkJLyogaW50ZXJuYWwgdmVyc2lvbiBvZiBleHRlbnQgKi8KKworI2lmbmRlZiBERUJVRworCWlmICh3aGljaGZvcmsgPT0gWEZTX0RBVEFfRk9SSykKKwkJcmV0dXJuIGlwLT5pX2QuZGlfc2l6ZSA9PSBpcC0+aV9tb3VudC0+bV9zYi5zYl9ibG9ja3NpemU7CisjZW5kaWYJLyogIURFQlVHICovCisJaWYgKFhGU19JRk9SS19ORVhURU5UUyhpcCwgd2hpY2hmb3JrKSAhPSAxKQorCQlyZXR1cm4gMDsKKwlpZiAoWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSAhPSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTKQorCQlyZXR1cm4gMDsKKwlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOworCUFTU0VSVChpZnAtPmlmX2ZsYWdzICYgWEZTX0lGRVhURU5UUyk7CisJZXAgPSBpZnAtPmlmX3UxLmlmX2V4dGVudHM7CisJeGZzX2JtYnRfZ2V0X2FsbChlcCwgJnMpOworCXJ2YWwgPSBzLmJyX3N0YXJ0b2ZmID09IDAgJiYgcy5icl9ibG9ja2NvdW50ID09IDE7CisJaWYgKHJ2YWwgJiYgd2hpY2hmb3JrID09IFhGU19EQVRBX0ZPUkspCisJCUFTU0VSVChpcC0+aV9kLmRpX3NpemUgPT0gaXAtPmlfbW91bnQtPm1fc2Iuc2JfYmxvY2tzaXplKTsKKwlyZXR1cm4gcnZhbDsKK30KKworLyoKKyAqIFJlYWQgaW4gdGhlIGV4dGVudHMgdG8gaWZfZXh0ZW50cy4KKyAqIEFsbCBpbm9kZSBmaWVsZHMgYXJlIHNldCB1cCBieSBjYWxsZXIsIHdlIGp1c3QgdHJhdmVyc2UgdGhlIGJ0cmVlCisgKiBhbmQgY29weSB0aGUgcmVjb3JkcyBpbi4gSWYgdGhlIGZpbGUgc3lzdGVtIGNhbm5vdCBjb250YWluIHVud3JpdHRlbgorICogZXh0ZW50cywgdGhlIHJlY29yZHMgYXJlIGNoZWNrZWQgZm9yIG5vICJzdGF0ZSIgZmxhZ3MuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19ibWFwX3JlYWRfZXh0ZW50cygKKwl4ZnNfdHJhbnNfdAkJKnRwLAkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2lub2RlX3QJCSppcCwJLyogaW5jb3JlIGlub2RlICovCisJaW50CQkJd2hpY2hmb3JrKSAvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworeworCXhmc19ibWJ0X2Jsb2NrX3QJKmJsb2NrOwkvKiBjdXJyZW50IGJ0cmVlIGJsb2NrICovCisJeGZzX2ZzYmxvY2tfdAkJYm5vOwkvKiBibG9jayAjIG9mICJibG9jayIgKi8KKwl4ZnNfYnVmX3QJCSpicDsJLyogYnVmZmVyIGZvciAiYmxvY2siICovCisJaW50CQkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCXhmc19leG50Zm10X3QJCWV4bnRmOwkvKiBYRlNfRVhURk1UX05PU1RBVEUsIGlmIGNoZWNraW5nICovCisjaWZkZWYgWEZTX0JNQVBfVFJBQ0UKKwlzdGF0aWMgY2hhcgkJZm5hbWVbXSA9ICJ4ZnNfYm1hcF9yZWFkX2V4dGVudHMiOworI2VuZGlmCisJeGZzX2V4dG51bV90CQlpLCBqOwkvKiBpbmRleCBpbnRvIHRoZSBleHRlbnRzIGxpc3QgKi8KKwl4ZnNfaWZvcmtfdAkJKmlmcDsJLyogZm9yayBzdHJ1Y3R1cmUgKi8KKwlpbnQJCQlsZXZlbDsJLyogYnRyZWUgbGV2ZWwsIGZvciBjaGVja2luZyAqLworCXhmc19tb3VudF90CQkqbXA7CS8qIGZpbGUgc3lzdGVtIG1vdW50IHN0cnVjdHVyZSAqLworCXhmc19ibWJ0X3B0cl90CQkqcHA7CS8qIHBvaW50ZXIgdG8gYmxvY2sgYWRkcmVzcyAqLworCS8qIFJFRkVSRU5DRUQgKi8KKwl4ZnNfZXh0bnVtX3QJCXJvb207CS8qIG51bWJlciBvZiBlbnRyaWVzIHRoZXJlJ3Mgcm9vbSBmb3IgKi8KKwl4ZnNfYm1idF9yZWNfdAkJKnRycDsJLyogdGFyZ2V0IHJlY29yZCBwb2ludGVyICovCisKKwlibm8gPSBOVUxMRlNCTE9DSzsKKwltcCA9IGlwLT5pX21vdW50OworCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7CisJZXhudGYgPSAod2hpY2hmb3JrICE9IFhGU19EQVRBX0ZPUkspID8gWEZTX0VYVEZNVF9OT1NUQVRFIDoKKwkJCQkJWEZTX0VYVEZNVF9JTk9ERShpcCk7CisJYmxvY2sgPSBpZnAtPmlmX2Jyb290OworCS8qCisJICogUm9vdCBsZXZlbCBtdXN0IHVzZSBCTUFQX0JST09UX1BUUl9BRERSIG1hY3JvIHRvIGdldCBwdHIgb3V0LgorCSAqLworCUFTU0VSVChJTlRfR0VUKGJsb2NrLT5iYl9sZXZlbCwgQVJDSF9DT05WRVJUKSA+IDApOworCWxldmVsID0gSU5UX0dFVChibG9jay0+YmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCk7CisJcHAgPSBYRlNfQk1BUF9CUk9PVF9QVFJfQUREUihibG9jaywgMSwgaWZwLT5pZl9icm9vdF9ieXRlcyk7CisJQVNTRVJUKElOVF9HRVQoKnBwLCBBUkNIX0NPTlZFUlQpICE9IE5VTExERlNCTk8pOworCUFTU0VSVChYRlNfRlNCX1RPX0FHTk8obXAsIElOVF9HRVQoKnBwLCBBUkNIX0NPTlZFUlQpKSA8IG1wLT5tX3NiLnNiX2FnY291bnQpOworCUFTU0VSVChYRlNfRlNCX1RPX0FHQk5PKG1wLCBJTlRfR0VUKCpwcCwgQVJDSF9DT05WRVJUKSkgPCBtcC0+bV9zYi5zYl9hZ2Jsb2Nrcyk7CisJYm5vID0gSU5UX0dFVCgqcHAsIEFSQ0hfQ09OVkVSVCk7CisJLyoKKwkgKiBHbyBkb3duIHRoZSB0cmVlIHVudGlsIGxlYWYgbGV2ZWwgaXMgcmVhY2hlZCwgZm9sbG93aW5nIHRoZSBmaXJzdAorCSAqIHBvaW50ZXIgKGxlZnRtb3N0KSBhdCBlYWNoIGxldmVsLgorCSAqLworCXdoaWxlIChsZXZlbC0tID4gMCkgeworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmbChtcCwgdHAsIGJubywgMCwgJmJwLAorCQkJCVhGU19CTUFQX0JUUkVFX1JFRikpKQorCQkJcmV0dXJuIGVycm9yOworCQlibG9jayA9IFhGU19CVUZfVE9fQk1CVF9CTE9DSyhicCk7CisJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKAorCQkJWEZTX0JNQVBfU0FOSVRZX0NIRUNLKG1wLCBibG9jaywgbGV2ZWwpLAorCQkJZXJyb3IwKTsKKwkJaWYgKGxldmVsID09IDApCisJCQlicmVhazsKKwkJcHAgPSBYRlNfQlRSRUVfUFRSX0FERFIobXAtPm1fc2Iuc2JfYmxvY2tzaXplLCB4ZnNfYm1idCwgYmxvY2ssCisJCQkxLCBtcC0+bV9ibWFwX2RteHJbMV0pOworCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTygKKwkJCVhGU19GU0JfU0FOSVRZX0NIRUNLKG1wLCBJTlRfR0VUKCpwcCwgQVJDSF9DT05WRVJUKSksCisJCQllcnJvcjApOworCQlibm8gPSBJTlRfR0VUKCpwcCwgQVJDSF9DT05WRVJUKTsKKwkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOworCX0KKwkvKgorCSAqIEhlcmUgd2l0aCBicCBhbmQgYmxvY2sgc2V0IHRvIHRoZSBsZWZ0bW9zdCBsZWFmIG5vZGUgaW4gdGhlIHRyZWUuCisJICovCisJcm9vbSA9IGlmcC0+aWZfYnl0ZXMgLyAodWludClzaXplb2YoKnRycCk7CisJdHJwID0gaWZwLT5pZl91MS5pZl9leHRlbnRzOworCWkgPSAwOworCS8qCisJICogTG9vcCBvdmVyIGFsbCBsZWFmIG5vZGVzLiAgQ29weSBpbmZvcm1hdGlvbiB0byB0aGUgZXh0ZW50IGxpc3QuCisJICovCisJZm9yICg7OykgeworCQl4ZnNfYm1idF9yZWNfdAkqZnJwLCAqdGVtcDsKKwkJeGZzX2ZzYmxvY2tfdAluZXh0Ym5vOworCQl4ZnNfZXh0bnVtX3QJbnVtX3JlY3M7CisKKworCQludW1fcmVjcyA9IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7CisJCWlmICh1bmxpa2VseShpICsgbnVtX3JlY3MgPiByb29tKSkgeworCQkJQVNTRVJUKGkgKyBudW1fcmVjcyA8PSByb29tKTsKKwkJCXhmc19mc19jbW5fZXJyKENFX1dBUk4sIGlwLT5pX21vdW50LAorCQkJCSJjb3JydXB0IGRpbm9kZSAlTHUsIChidHJlZSBleHRlbnRzKS4gIFVubW91bnQgYW5kIHJ1biB4ZnNfcmVwYWlyLiIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgaXAtPmlfaW5vKTsKKwkJCVhGU19FUlJPUl9SRVBPUlQoInhmc19ibWFwX3JlYWRfZXh0ZW50cygxKSIsCisJCQkJCSBYRlNfRVJSTEVWRUxfTE9XLAorCQkJCQlpcC0+aV9tb3VudCk7CisJCQlnb3RvIGVycm9yMDsKKwkJfQorCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTygKKwkJCVhGU19CTUFQX1NBTklUWV9DSEVDSyhtcCwgYmxvY2ssIDApLAorCQkJZXJyb3IwKTsKKwkJLyoKKwkJICogUmVhZC1haGVhZCB0aGUgbmV4dCBsZWFmIGJsb2NrLCBpZiBhbnkuCisJCSAqLworCQluZXh0Ym5vID0gSU5UX0dFVChibG9jay0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCk7CisJCWlmIChuZXh0Ym5vICE9IE5VTExGU0JMT0NLKQorCQkJeGZzX2J0cmVlX3JlYWRhX2J1ZmwobXAsIG5leHRibm8sIDEpOworCQkvKgorCQkgKiBDb3B5IHJlY29yZHMgaW50byB0aGUgZXh0ZW50IGxpc3QuCisJCSAqLworCQlmcnAgPSBYRlNfQlRSRUVfUkVDX0FERFIobXAtPm1fc2Iuc2JfYmxvY2tzaXplLCB4ZnNfYm1idCwKKwkJCWJsb2NrLCAxLCBtcC0+bV9ibWFwX2RteHJbMF0pOworCQl0ZW1wID0gdHJwOworCQlmb3IgKGogPSAwOyBqIDwgbnVtX3JlY3M7IGorKywgZnJwKyssIHRycCsrKSB7CisJCQl0cnAtPmwwID0gSU5UX0dFVChmcnAtPmwwLCBBUkNIX0NPTlZFUlQpOworCQkJdHJwLT5sMSA9IElOVF9HRVQoZnJwLT5sMSwgQVJDSF9DT05WRVJUKTsKKwkJfQorCQlpZiAoZXhudGYgPT0gWEZTX0VYVEZNVF9OT1NUQVRFKSB7CisJCQkvKgorCQkJICogQ2hlY2sgYWxsIGF0dHJpYnV0ZSBibWFwIGJ0cmVlIHJlY29yZHMgYW5kCisJCQkgKiBhbnkgIm9sZGVyIiBkYXRhIGJtYXAgYnRyZWUgcmVjb3JkcyBmb3IgYQorCQkJICogc2V0IGJpdCBpbiB0aGUgImV4dGVudCBmbGFnIiBwb3NpdGlvbi4KKwkJCSAqLworCQkJaWYgKHVubGlrZWx5KHhmc19jaGVja19ub3N0YXRlX2V4dGVudHModGVtcCwgbnVtX3JlY3MpKSkgeworCQkJCVhGU19FUlJPUl9SRVBPUlQoInhmc19ibWFwX3JlYWRfZXh0ZW50cygyKSIsCisJCQkJCQkgWEZTX0VSUkxFVkVMX0xPVywKKwkJCQkJCSBpcC0+aV9tb3VudCk7CisJCQkJZ290byBlcnJvcjA7CisJCQl9CisJCX0KKwkJaSArPSBudW1fcmVjczsKKwkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOworCQlibm8gPSBuZXh0Ym5vOworCQkvKgorCQkgKiBJZiB3ZSd2ZSByZWFjaGVkIHRoZSBlbmQsIHN0b3AuCisJCSAqLworCQlpZiAoYm5vID09IE5VTExGU0JMT0NLKQorCQkJYnJlYWs7CisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZsKG1wLCB0cCwgYm5vLCAwLCAmYnAsCisJCQkJWEZTX0JNQVBfQlRSRUVfUkVGKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCWJsb2NrID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKGJwKTsKKwl9CisJQVNTRVJUKGkgPT0gaWZwLT5pZl9ieXRlcyAvICh1aW50KXNpemVvZigqdHJwKSk7CisJQVNTRVJUKGkgPT0gWEZTX0lGT1JLX05FWFRFTlRTKGlwLCB3aGljaGZvcmspKTsKKwl4ZnNfYm1hcF90cmFjZV9leGxpc3QoZm5hbWUsIGlwLCBpLCB3aGljaGZvcmspOworCXJldHVybiAwOworZXJyb3IwOgorCXhmc190cmFuc19icmVsc2UodHAsIGJwKTsKKwlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7Cit9CisKKyNpZmRlZiBYRlNfQk1BUF9UUkFDRQorLyoKKyAqIEFkZCBibWFwIHRyYWNlIGluc2VydCBlbnRyaWVzIGZvciBhbGwgdGhlIGNvbnRlbnRzIG9mIHRoZSBleHRlbnQgbGlzdC4KKyAqLwordm9pZAoreGZzX2JtYXBfdHJhY2VfZXhsaXN0KAorCWNoYXIJCSpmbmFtZSwJCS8qIGZ1bmN0aW9uIG5hbWUgKi8KKwl4ZnNfaW5vZGVfdAkqaXAsCQkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLworCXhmc19leHRudW1fdAljbnQsCQkvKiBjb3VudCBvZiBlbnRyaWVzIGluIHRoZSBsaXN0ICovCisJaW50CQl3aGljaGZvcmspCS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCit7CisJeGZzX2JtYnRfcmVjX3QJKmJhc2U7CQkvKiBiYXNlIG9mIGV4dGVudCBsaXN0ICovCisJeGZzX2JtYnRfcmVjX3QJKmVwOwkJLyogY3VycmVudCBlbnRyeSBpbiBleHRlbnQgbGlzdCAqLworCXhmc19leHRudW1fdAlpZHg7CQkvKiBleHRlbnQgbGlzdCBlbnRyeSBudW1iZXIgKi8KKwl4ZnNfaWZvcmtfdAkqaWZwOwkJLyogaW5vZGUgZm9yayBwb2ludGVyICovCisJeGZzX2JtYnRfaXJlY190CXM7CQkvKiBleHRlbnQgbGlzdCByZWNvcmQgKi8KKworCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7CisJQVNTRVJUKGNudCA9PSBpZnAtPmlmX2J5dGVzIC8gKHVpbnQpc2l6ZW9mKCpiYXNlKSk7CisJYmFzZSA9IGlmcC0+aWZfdTEuaWZfZXh0ZW50czsKKwlmb3IgKGlkeCA9IDAsIGVwID0gYmFzZTsgaWR4IDwgY250OyBpZHgrKywgZXArKykgeworCQl4ZnNfYm1idF9nZXRfYWxsKGVwLCAmcyk7CisJCXhmc19ibWFwX3RyYWNlX2luc2VydChmbmFtZSwgImV4bGlzdCIsIGlwLCBpZHgsIDEsICZzLCBOVUxMLAorCQkJd2hpY2hmb3JrKTsKKwl9Cit9CisjZW5kaWYKKworI2lmZGVmIERFQlVHCisvKgorICogVmFsaWRhdGUgdGhhdCB0aGUgYm1idF9pcmVjcyBiZWluZyByZXR1cm5lZCBmcm9tIGJtYXBpIGFyZSB2YWxpZAorICogZ2l2ZW4gdGhlIGNhbGxlcnMgb3JpZ2luYWwgcGFyYW1ldGVycy4gIFNwZWNpZmljYWxseSBjaGVjayB0aGUKKyAqIHJhbmdlcyBvZiB0aGUgcmV0dXJuZWQgaXJlY3MgdG8gZW5zdXJlIHRoYXQgdGhleSBvbmx5IGV4dGVudCBiZXlvbmQKKyAqIHRoZSBnaXZlbiBwYXJhbWV0ZXJzIGlmIHRoZSBYRlNfQk1BUElfRU5USVJFIGZsYWcgd2FzIHNldC4KKyAqLworU1RBVElDIHZvaWQKK3hmc19ibWFwX3ZhbGlkYXRlX3JldCgKKwl4ZnNfZmlsZW9mZl90CQlibm8sCisJeGZzX2ZpbGJsa3NfdAkJbGVuLAorCWludAkJCWZsYWdzLAorCXhmc19ibWJ0X2lyZWNfdAkJKm12YWwsCisJaW50CQkJbm1hcCwKKwlpbnQJCQlyZXRfbm1hcCkKK3sKKwlpbnQJCQlpOwkJLyogaW5kZXggdG8gbWFwIHZhbHVlcyAqLworCisJQVNTRVJUKHJldF9ubWFwIDw9IG5tYXApOworCisJZm9yIChpID0gMDsgaSA8IHJldF9ubWFwOyBpKyspIHsKKwkJQVNTRVJUKG12YWxbaV0uYnJfYmxvY2tjb3VudCA+IDApOworCQlpZiAoIShmbGFncyAmIFhGU19CTUFQSV9FTlRJUkUpKSB7CisJCQlBU1NFUlQobXZhbFtpXS5icl9zdGFydG9mZiA+PSBibm8pOworCQkJQVNTRVJUKG12YWxbaV0uYnJfYmxvY2tjb3VudCA8PSBsZW4pOworCQkJQVNTRVJUKG12YWxbaV0uYnJfc3RhcnRvZmYgKyBtdmFsW2ldLmJyX2Jsb2NrY291bnQgPD0KKwkJCSAgICAgICBibm8gKyBsZW4pOworCQl9IGVsc2UgeworCQkJQVNTRVJUKG12YWxbaV0uYnJfc3RhcnRvZmYgPCBibm8gKyBsZW4pOworCQkJQVNTRVJUKG12YWxbaV0uYnJfc3RhcnRvZmYgKyBtdmFsW2ldLmJyX2Jsb2NrY291bnQgPgorCQkJICAgICAgIGJubyk7CisJCX0KKwkJQVNTRVJUKGkgPT0gMCB8fAorCQkgICAgICAgbXZhbFtpIC0gMV0uYnJfc3RhcnRvZmYgKyBtdmFsW2kgLSAxXS5icl9ibG9ja2NvdW50ID09CisJCSAgICAgICBtdmFsW2ldLmJyX3N0YXJ0b2ZmKTsKKwkJaWYgKChmbGFncyAmIFhGU19CTUFQSV9XUklURSkgJiYgIShmbGFncyAmIFhGU19CTUFQSV9ERUxBWSkpCisJCQlBU1NFUlQobXZhbFtpXS5icl9zdGFydGJsb2NrICE9IERFTEFZU1RBUlRCTE9DSyAmJgorCQkJICAgICAgIG12YWxbaV0uYnJfc3RhcnRibG9jayAhPSBIT0xFU1RBUlRCTE9DSyk7CisJCUFTU0VSVChtdmFsW2ldLmJyX3N0YXRlID09IFhGU19FWFRfTk9STSB8fAorCQkgICAgICAgbXZhbFtpXS5icl9zdGF0ZSA9PSBYRlNfRVhUX1VOV1JJVFRFTik7CisJfQorfQorI2VuZGlmIC8qIERFQlVHICovCisKKworLyoKKyAqIE1hcCBmaWxlIGJsb2NrcyB0byBmaWxlc3lzdGVtIGJsb2Nrcy4KKyAqIEZpbGUgcmFuZ2UgaXMgZ2l2ZW4gYnkgdGhlIGJuby9sZW4gcGFpci4KKyAqIEFkZHMgYmxvY2tzIHRvIGZpbGUgaWYgYSB3cml0ZSAoImZsYWdzICYgWEZTX0JNQVBJX1dSSVRFIiBzZXQpCisgKiBpbnRvIGEgaG9sZSBvciBwYXN0IGVvZi4KKyAqIE9ubHkgYWxsb2NhdGVzIGJsb2NrcyBmcm9tIGEgc2luZ2xlIGFsbG9jYXRpb24gZ3JvdXAsCisgKiB0byBhdm9pZCBsb2NraW5nIHByb2JsZW1zLgorICogVGhlIHJldHVybmVkIHZhbHVlIGluICJmaXJzdGJsb2NrIiBmcm9tIHRoZSBmaXJzdCBjYWxsIGluIGEgdHJhbnNhY3Rpb24KKyAqIG11c3QgYmUgcmVtZW1iZXJlZCBhbmQgcHJlc2VudGVkIHRvIHN1YnNlcXVlbnQgY2FsbHMgaW4gImZpcnN0YmxvY2siLgorICogQW4gdXBwZXIgYm91bmQgZm9yIHRoZSBudW1iZXIgb2YgYmxvY2tzIHRvIGJlIGFsbG9jYXRlZCBpcyBzdXBwbGllZCB0bworICogdGhlIGZpcnN0IGNhbGwgaW4gInRvdGFsIjsgaWYgbm8gYWxsb2NhdGlvbiBncm91cCBoYXMgdGhhdCBtYW55IGZyZWUKKyAqIGJsb2NrcyB0aGVuIHRoZSBjYWxsIHdpbGwgZmFpbCAocmV0dXJuIE5VTExGU0JMT0NLIGluICJmaXJzdGJsb2NrIikuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19ibWFwaSgKKwl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2lub2RlX3QJKmlwLAkJLyogaW5jb3JlIGlub2RlICovCisJeGZzX2ZpbGVvZmZfdAlibm8sCQkvKiBzdGFydGluZyBmaWxlIG9mZnMuIG1hcHBlZCAqLworCXhmc19maWxibGtzX3QJbGVuLAkJLyogbGVuZ3RoIHRvIG1hcCBpbiBmaWxlICovCisJaW50CQlmbGFncywJCS8qIFhGU19CTUFQSV8uLi4gKi8KKwl4ZnNfZnNibG9ja190CSpmaXJzdGJsb2NrLAkvKiBmaXJzdCBhbGxvY2F0ZWQgYmxvY2sKKwkJCQkJICAgY29udHJvbHMgYS5nLiBmb3IgYWxsb2NzICovCisJeGZzX2V4dGxlbl90CXRvdGFsLAkJLyogdG90YWwgYmxvY2tzIG5lZWRlZCAqLworCXhmc19ibWJ0X2lyZWNfdAkqbXZhbCwJCS8qIG91dHB1dDogbWFwIHZhbHVlcyAqLworCWludAkJKm5tYXAsCQkvKiBpL286IG12YWwgc2l6ZS9jb3VudCAqLworCXhmc19ibWFwX2ZyZWVfdAkqZmxpc3QpCQkvKiBpL286IGxpc3QgZXh0ZW50cyB0byBmcmVlICovCit7CisJeGZzX2ZzYmxvY2tfdAlhYm5vOwkJLyogYWxsb2NhdGVkIGJsb2NrIG51bWJlciAqLworCXhmc19leHRsZW5fdAlhbGVuOwkJLyogYWxsb2NhdGVkIGV4dGVudCBsZW5ndGggKi8KKwl4ZnNfZmlsZW9mZl90CWFvZmY7CQkvKiBhbGxvY2F0ZWQgZmlsZSBvZmZzZXQgKi8KKwl4ZnNfYm1hbGxvY2FfdAlibWE7CQkvKiBhcmdzIGZvciB4ZnNfYm1hcF9hbGxvYyAqLworCWNoYXIJCWNvbnRpZzsJCS8qIGFsbG9jYXRpb24gbXVzdCBiZSBvbmUgZXh0ZW50ICovCisJeGZzX2J0cmVlX2N1cl90CSpjdXI7CQkvKiBibWFwIGJ0cmVlIGN1cnNvciAqLworCWNoYXIJCWRlbGF5OwkJLyogdGhpcyByZXF1ZXN0IGlzIGZvciBkZWxheWVkIGFsbG9jICovCisJeGZzX2ZpbGVvZmZfdAllbmQ7CQkvKiBlbmQgb2YgbWFwcGVkIGZpbGUgcmVnaW9uICovCisJaW50CQllb2Y7CQkvKiB3ZSd2ZSBoaXQgdGhlIGVuZCBvZiBleHRlbnQgbGlzdCAqLworCXhmc19ibWJ0X3JlY190CSplcDsJCS8qIGV4dGVudCBsaXN0IGVudHJ5IHBvaW50ZXIgKi8KKwlpbnQJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuICovCisJY2hhcgkJZXhhY3Q7CQkvKiBkb24ndCBkbyBhbGwgb2Ygd2FzZGVsYXllZCBleHRlbnQgKi8KKwl4ZnNfYm1idF9pcmVjX3QJZ290OwkJLyogY3VycmVudCBleHRlbnQgbGlzdCByZWNvcmQgKi8KKwl4ZnNfaWZvcmtfdAkqaWZwOwkJLyogaW5vZGUgZm9yayBwb2ludGVyICovCisJeGZzX2V4dGxlbl90CWluZGxlbjsJCS8qIGluZGlyZWN0IGJsb2NrcyBsZW5ndGggKi8KKwljaGFyCQlpbmhvbGU7CQkvKiBjdXJyZW50IGxvY2F0aW9uIGlzIGhvbGUgaW4gZmlsZSAqLworCXhmc19leHRudW1fdAlsYXN0eDsJCS8qIGxhc3QgdXNlZnVsIGV4dGVudCBudW1iZXIgKi8KKwlpbnQJCWxvZ2ZsYWdzOwkvKiBmbGFncyBmb3IgdHJhbnNhY3Rpb24gbG9nZ2luZyAqLworCXhmc19leHRsZW5fdAltaW5sZWZ0OwkvKiBtaW4gYmxvY2tzIGxlZnQgYWZ0ZXIgYWxsb2NhdGlvbiAqLworCXhmc19leHRsZW5fdAltaW5sZW47CQkvKiBtaW4gYWxsb2NhdGlvbiBzaXplICovCisJeGZzX21vdW50X3QJKm1wOwkJLyogeGZzIG1vdW50IHN0cnVjdHVyZSAqLworCWludAkJbjsJCS8qIGN1cnJlbnQgZXh0ZW50IGluZGV4ICovCisJaW50CQluYWxsb2NzOwkvKiBudW1iZXIgb2YgZXh0ZW50cyBhbGxvY1wnZCAqLworCXhmc19leHRudW1fdAluZXh0ZW50czsJLyogbnVtYmVyIG9mIGV4dGVudHMgaW4gZmlsZSAqLworCXhmc19maWxlb2ZmX3QJb2JubzsJCS8qIG9sZCBibG9jayBudW1iZXIgKG9mZnNldCkgKi8KKwl4ZnNfYm1idF9pcmVjX3QJcHJldjsJCS8qIHByZXZpb3VzIGV4dGVudCBsaXN0IHJlY29yZCAqLworCWNoYXIJCXN0YXRlbGVzczsJLyogaWdub3JlIHN0YXRlIGZsYWcgc2V0ICovCisJaW50CQl0bXBfbG9nZmxhZ3M7CS8qIHRlbXAgZmxhZ3MgaG9sZGVyICovCisJY2hhcgkJdHJpbTsJCS8qIG91dHB1dCB0cmltbWVkIHRvIG1hdGNoIHJhbmdlICovCisJY2hhcgkJdXNlcmRhdGE7CS8qIGFsbG9jYXRpbmcgbm9uLW1ldGFkYXRhICovCisJY2hhcgkJd2FzZGVsYXk7CS8qIG9sZCBleHRlbnQgd2FzIGRlbGF5ZWQgKi8KKwlpbnQJCXdoaWNoZm9yazsJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KKwljaGFyCQl3cjsJCS8qIHRoaXMgaXMgYSB3cml0ZSByZXF1ZXN0ICovCisJY2hhcgkJcnN2ZDsJCS8qIE9LIHRvIGFsbG9jYXRlIHJlc2VydmVkIGJsb2NrcyAqLworI2lmZGVmIERFQlVHCisJeGZzX2ZpbGVvZmZfdAlvcmlnX2JubzsJLyogb3JpZ2luYWwgYmxvY2sgbnVtYmVyIHZhbHVlICovCisJaW50CQlvcmlnX2ZsYWdzOwkvKiBvcmlnaW5hbCBmbGFncyBhcmcgdmFsdWUgKi8KKwl4ZnNfZmlsYmxrc190CW9yaWdfbGVuOwkvKiBvcmlnaW5hbCB2YWx1ZSBvZiBsZW4gYXJnICovCisJeGZzX2JtYnRfaXJlY190CSpvcmlnX212YWw7CS8qIG9yaWdpbmFsIHZhbHVlIG9mIG12YWwgKi8KKwlpbnQJCW9yaWdfbm1hcDsJLyogb3JpZ2luYWwgdmFsdWUgb2YgKm5tYXAgKi8KKworCW9yaWdfYm5vID0gYm5vOworCW9yaWdfbGVuID0gbGVuOworCW9yaWdfZmxhZ3MgPSBmbGFnczsKKwlvcmlnX212YWwgPSBtdmFsOworCW9yaWdfbm1hcCA9ICpubWFwOworI2VuZGlmCisJQVNTRVJUKCpubWFwID49IDEpOworCUFTU0VSVCgqbm1hcCA8PSBYRlNfQk1BUF9NQVhfTk1BUCB8fCAhKGZsYWdzICYgWEZTX0JNQVBJX1dSSVRFKSk7CisJd2hpY2hmb3JrID0gKGZsYWdzICYgWEZTX0JNQVBJX0FUVFJGT1JLKSA/CisJCVhGU19BVFRSX0ZPUksgOiBYRlNfREFUQV9GT1JLOworCW1wID0gaXAtPmlfbW91bnQ7CisJaWYgKHVubGlrZWx5KFhGU19URVNUX0VSUk9SKAorCSAgICAoWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSAhPSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICYmCisJICAgICBYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspICE9IFhGU19ESU5PREVfRk1UX0JUUkVFICYmCisJICAgICBYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspICE9IFhGU19ESU5PREVfRk1UX0xPQ0FMKSwKKwkgICAgIG1wLCBYRlNfRVJSVEFHX0JNQVBJRk9STUFULCBYRlNfUkFORE9NX0JNQVBJRk9STUFUKSkpIHsKKwkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX2JtYXBpIiwgWEZTX0VSUkxFVkVMX0xPVywgbXApOworCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJfQorCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7CisJQVNTRVJUKGlmcC0+aWZfZXh0X21heCA9PQorCSAgICAgICBYRlNfSUZPUktfU0laRShpcCwgd2hpY2hmb3JrKSAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCkpOworCWlmICgod3IgPSAoZmxhZ3MgJiBYRlNfQk1BUElfV1JJVEUpKSAhPSAwKQorCQlYRlNfU1RBVFNfSU5DKHhzX2Jsa19tYXB3KTsKKwllbHNlCisJCVhGU19TVEFUU19JTkMoeHNfYmxrX21hcHIpOworCWRlbGF5ID0gKGZsYWdzICYgWEZTX0JNQVBJX0RFTEFZKSAhPSAwOworCXRyaW0gPSAoZmxhZ3MgJiBYRlNfQk1BUElfRU5USVJFKSA9PSAwOworCXVzZXJkYXRhID0gKGZsYWdzICYgWEZTX0JNQVBJX01FVEFEQVRBKSA9PSAwOworCWV4YWN0ID0gKGZsYWdzICYgWEZTX0JNQVBJX0VYQUNUKSAhPSAwOworCXJzdmQgPSAoZmxhZ3MgJiBYRlNfQk1BUElfUlNWQkxPQ0tTKSAhPSAwOworCWNvbnRpZyA9IChmbGFncyAmIFhGU19CTUFQSV9DT05USUcpICE9IDA7CisJLyoKKwkgKiBzdGF0ZWxlc3MgaXMgdXNlZCB0byBjb21iaW5lIGV4dGVudHMgd2hpY2gKKwkgKiBkaWZmZXIgb25seSBkdWUgdG8gdGhlIHN0YXRlIG9mIHRoZSBleHRlbnRzLgorCSAqIFRoaXMgdGVjaG5pcXVlIGlzIHVzZWQgZnJvbSB4ZnNfZ2V0Ym1hcCgpCisJICogd2hlbiB0aGUgY2FsbGVyIGRvZXMgbm90IHdpc2ggdG8gc2VlIHRoZQorCSAqIHNlcGFyYXRpb24gKHdoaWNoIGlzIHRoZSBkZWZhdWx0KS4KKwkgKgorCSAqIFRoaXMgdGVjaG5pcXVlIGlzIGFsc28gdXNlZCB3aGVuIHdyaXRpbmcgYQorCSAqIGJ1ZmZlciB3aGljaCBoYXMgYmVlbiBwYXJ0aWFsbHkgd3JpdHRlbiwKKwkgKiAodXN1YWxseSBieSBiZWluZyBmbHVzaGVkIGR1cmluZyBhIGNodW5rcmVhZCksCisJICogdG8gZW5zdXJlIG9uZSB3cml0ZSB0YWtlcyBwbGFjZS4gVGhpcyBhbHNvCisJICogcHJldmVudHMgYSBjaGFuZ2UgaW4gdGhlIHhmcyBpbm9kZSBleHRlbnRzIGF0CisJICogdGhpcyB0aW1lLCBpbnRlbnRpb25hbGx5LiBUaGlzIGNoYW5nZSBvY2N1cnMKKwkgKiBvbiBjb21wbGV0aW9uIG9mIHRoZSB3cml0ZSBvcGVyYXRpb24sIGluCisJICogeGZzX3N0cmF0X2NvbXAoKSwgd2hlcmUgdGhlIHhmc19ibWFwaSgpIGNhbGwKKwkgKiBpcyB0cmFuc2FjdGlvbmVkLCBhbmQgdGhlIGV4dGVudHMgY29tYmluZWQuCisJICovCisJc3RhdGVsZXNzID0gKGZsYWdzICYgWEZTX0JNQVBJX0lHU1RBVEUpICE9IDA7CisJaWYgKHN0YXRlbGVzcyAmJiB3cikJLyogaWYgd3JpdGluZyB1bndyaXR0ZW4gc3BhY2UsIG5vICovCisJCXdyID0gMDsJCS8qIGFsbG9jYXRpb25zIGFyZSBhbGxvd2VkICovCisJQVNTRVJUKHdyIHx8ICFkZWxheSk7CisJbG9nZmxhZ3MgPSAwOworCW5hbGxvY3MgPSAwOworCWN1ciA9IE5VTEw7CisJaWYgKFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgPT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpIHsKKwkJQVNTRVJUKHdyICYmIHRwKTsKKwkJaWYgKChlcnJvciA9IHhmc19ibWFwX2xvY2FsX3RvX2V4dGVudHModHAsIGlwLAorCQkJCWZpcnN0YmxvY2ssIHRvdGFsLCAmbG9nZmxhZ3MsIHdoaWNoZm9yaykpKQorCQkJZ290byBlcnJvcjA7CisJfQorCWlmICh3ciAmJiAqZmlyc3RibG9jayA9PSBOVUxMRlNCTE9DSykgeworCQlpZiAoWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSA9PSBYRlNfRElOT0RFX0ZNVF9CVFJFRSkKKwkJCW1pbmxlZnQgPSBJTlRfR0VUKGlmcC0+aWZfYnJvb3QtPmJiX2xldmVsLCBBUkNIX0NPTlZFUlQpICsgMTsKKwkJZWxzZQorCQkJbWlubGVmdCA9IDE7CisJfSBlbHNlCisJCW1pbmxlZnQgPSAwOworCWlmICghKGlmcC0+aWZfZmxhZ3MgJiBYRlNfSUZFWFRFTlRTKSAmJgorCSAgICAoZXJyb3IgPSB4ZnNfaXJlYWRfZXh0ZW50cyh0cCwgaXAsIHdoaWNoZm9yaykpKQorCQlnb3RvIGVycm9yMDsKKwllcCA9IHhmc19ibWFwX3NlYXJjaF9leHRlbnRzKGlwLCBibm8sIHdoaWNoZm9yaywgJmVvZiwgJmxhc3R4LCAmZ290LAorCQkmcHJldik7CisJbmV4dGVudHMgPSBpZnAtPmlmX2J5dGVzIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KTsKKwluID0gMDsKKwllbmQgPSBibm8gKyBsZW47CisJb2JubyA9IGJubzsKKwlibWEuaXAgPSBOVUxMOworCXdoaWxlIChibm8gPCBlbmQgJiYgbiA8ICpubWFwKSB7CisJCS8qCisJCSAqIFJlYWRpbmcgcGFzdCBlb2YsIGFjdCBhcyB0aG91Z2ggdGhlcmUncyBhIGhvbGUKKwkJICogdXAgdG8gZW5kLgorCQkgKi8KKwkJaWYgKGVvZiAmJiAhd3IpCisJCQlnb3QuYnJfc3RhcnRvZmYgPSBlbmQ7CisJCWluaG9sZSA9IGVvZiB8fCBnb3QuYnJfc3RhcnRvZmYgPiBibm87CisJCXdhc2RlbGF5ID0gd3IgJiYgIWluaG9sZSAmJiAhZGVsYXkgJiYKKwkJCUlTTlVMTFNUQVJUQkxPQ0soZ290LmJyX3N0YXJ0YmxvY2spOworCQkvKgorCQkgKiBGaXJzdCwgZGVhbCB3aXRoIHRoZSBob2xlIGJlZm9yZSB0aGUgYWxsb2NhdGVkIHNwYWNlCisJCSAqIHRoYXQgd2UgZm91bmQsIGlmIGFueS4KKwkJICovCisJCWlmICh3ciAmJiAoaW5ob2xlIHx8IHdhc2RlbGF5KSkgeworCQkJLyoKKwkJCSAqIEZvciB0aGUgd2FzZGVsYXkgY2FzZSwgd2UgY291bGQgYWxzbyBqdXN0CisJCQkgKiBhbGxvY2F0ZSB0aGUgc3R1ZmYgYXNrZWQgZm9yIGluIHRoaXMgYm1hcCBjYWxsCisJCQkgKiBidXQgdGhhdCB3b3VsZG4ndCBiZSBhcyBnb29kLgorCQkJICovCisJCQlpZiAod2FzZGVsYXkgJiYgIWV4YWN0KSB7CisJCQkJYWxlbiA9ICh4ZnNfZXh0bGVuX3QpZ290LmJyX2Jsb2NrY291bnQ7CisJCQkJYW9mZiA9IGdvdC5icl9zdGFydG9mZjsKKwkJCQlpZiAobGFzdHggIT0gTlVMTEVYVE5VTSAmJiBsYXN0eCkgeworCQkJCQllcCA9ICZpZnAtPmlmX3UxLmlmX2V4dGVudHNbbGFzdHggLSAxXTsKKwkJCQkJeGZzX2JtYnRfZ2V0X2FsbChlcCwgJnByZXYpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAod2FzZGVsYXkpIHsKKwkJCQlhbGVuID0gKHhmc19leHRsZW5fdCkKKwkJCQkJWEZTX0ZJTEJMS1NfTUlOKGxlbiwKKwkJCQkJCShnb3QuYnJfc3RhcnRvZmYgKworCQkJCQkJIGdvdC5icl9ibG9ja2NvdW50KSAtIGJubyk7CisJCQkJYW9mZiA9IGJubzsKKwkJCX0gZWxzZSB7CisJCQkJYWxlbiA9ICh4ZnNfZXh0bGVuX3QpCisJCQkJCVhGU19GSUxCTEtTX01JTihsZW4sIE1BWEVYVExFTik7CisJCQkJaWYgKCFlb2YpCisJCQkJCWFsZW4gPSAoeGZzX2V4dGxlbl90KQorCQkJCQkJWEZTX0ZJTEJMS1NfTUlOKGFsZW4sCisJCQkJCQkJZ290LmJyX3N0YXJ0b2ZmIC0gYm5vKTsKKwkJCQlhb2ZmID0gYm5vOworCQkJfQorCQkJbWlubGVuID0gY29udGlnID8gYWxlbiA6IDE7CisJCQlpZiAoZGVsYXkpIHsKKwkJCQlpbmRsZW4gPSAoeGZzX2V4dGxlbl90KQorCQkJCQl4ZnNfYm1hcF93b3JzdF9pbmRsZW4oaXAsIGFsZW4pOworCQkJCUFTU0VSVChpbmRsZW4gPiAwKTsKKwkJCQkvKgorCQkJCSAqIE1ha2UgYSB0cmFuc2FjdGlvbi1sZXNzIHF1b3RhIHJlc2VydmF0aW9uIGZvcgorCQkJCSAqIGRlbGF5ZWQgYWxsb2NhdGlvbiBibG9ja3MuIFRoaXMgbnVtYmVyIGdldHMKKwkJCQkgKiBhZGp1c3RlZCBsYXRlci4KKwkJCQkgKiBXZSByZXR1cm4gRURRVU9UIGlmIHdlIGhhdmVuJ3QgYWxsb2NhdGVkCisJCQkJICogYmxrcyBhbHJlYWR5IGluc2lkZSB0aGlzIGxvb3A7CisJCQkJICovCisJCQkJaWYgKFhGU19UUkFOU19SRVNFUlZFX0JMS1FVT1RBKAorCQkJCQkJbXAsIE5VTEwsIGlwLCAobG9uZylhbGVuKSkgeworCQkJCQlpZiAobiA9PSAwKSB7CisJCQkJCQkqbm1hcCA9IDA7CisJCQkJCQlBU1NFUlQoY3VyID09IE5VTEwpOworCQkJCQkJcmV0dXJuIFhGU19FUlJPUihFRFFVT1QpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCS8qCisJCQkJICogU3BsaXQgY2hhbmdpbmcgc2IgZm9yIGFsZW4gYW5kIGluZGxlbiBzaW5jZQorCQkJCSAqIHRoZXkgY291bGQgYmUgY29taW5nIGZyb20gZGlmZmVyZW50IHBsYWNlcy4KKwkJCQkgKi8KKwkJCQlpZiAoaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUkVBTFRJTUUpIHsKKwkJCQkJeGZzX2V4dGxlbl90CWV4dHN6OworCQkJCQl4ZnNfZXh0bGVuX3QJcmFsZW47CisJCQkJCWlmICghKGV4dHN6ID0gaXAtPmlfZC5kaV9leHRzaXplKSkKKwkJCQkJCWV4dHN6ID0gbXAtPm1fc2Iuc2JfcmV4dHNpemU7CisJCQkJCXJhbGVuID0gcm91bmR1cChhbGVuLCBleHRzeik7CisJCQkJCXJhbGVuID0gcmFsZW4gLyBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKKwkJCQkJaWYgKHhmc19tb2RfaW5jb3JlX3NiKG1wLAorCQkJCQkJWEZTX1NCU19GUkVYVEVOVFMsCisJCQkJCQktKHJhbGVuKSwgcnN2ZCkpIHsKKwkJCQkJCWlmIChYRlNfSVNfUVVPVEFfT04oaXAtPmlfbW91bnQpKQorCQkJCQkJCVhGU19UUkFOU19VTlJFU0VSVkVfQkxLUVVPVEEoCisJCQkJCQkgICAgIAkJbXAsIE5VTEwsIGlwLAorCQkJCQkJCQkobG9uZylhbGVuKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHhmc19tb2RfaW5jb3JlX3NiKG1wLAorCQkJCQkJCSAgICAgIFhGU19TQlNfRkRCTE9DS1MsCisJCQkJCQkJICAgICAgLShhbGVuKSwgcnN2ZCkpIHsKKwkJCQkJCWlmIChYRlNfSVNfUVVPVEFfT04oaXAtPmlfbW91bnQpKQorCQkJCQkJCVhGU19UUkFOU19VTlJFU0VSVkVfQkxLUVVPVEEoCisJCQkJCQkJCW1wLCBOVUxMLCBpcCwKKwkJCQkJCQkJKGxvbmcpYWxlbik7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmICh4ZnNfbW9kX2luY29yZV9zYihtcCwgWEZTX1NCU19GREJMT0NLUywKKwkJCQkJCS0oaW5kbGVuKSwgcnN2ZCkpIHsKKwkJCQkJWEZTX1RSQU5TX1VOUkVTRVJWRV9CTEtRVU9UQSgKKwkJCQkJCW1wLCBOVUxMLCBpcCwgKGxvbmcpYWxlbik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpcC0+aV9kZWxheWVkX2Jsa3MgKz0gYWxlbjsKKwkJCQlhYm5vID0gTlVMTFNUQVJUQkxPQ0soaW5kbGVuKTsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBJZiBmaXJzdCB0aW1lLCBhbGxvY2F0ZSBhbmQgZmlsbCBpbgorCQkJCSAqIG9uY2Utb25seSBibWEgZmllbGRzLgorCQkJCSAqLworCQkJCWlmIChibWEuaXAgPT0gTlVMTCkgeworCQkJCQlibWEudHAgPSB0cDsKKwkJCQkJYm1hLmlwID0gaXA7CisJCQkJCWJtYS5wcmV2cCA9ICZwcmV2OworCQkJCQlibWEuZ290cCA9ICZnb3Q7CisJCQkJCWJtYS50b3RhbCA9IHRvdGFsOworCQkJCQlibWEudXNlcmRhdGEgPSAwOworCQkJCX0KKwkJCQkvKiBJbmRpY2F0ZSBpZiB0aGlzIGlzIHRoZSBmaXJzdCB1c2VyIGRhdGEKKwkJCQkgKiBpbiB0aGUgZmlsZSwgb3IganVzdCBhbnkgdXNlciBkYXRhLgorCQkJCSAqLworCQkJCWlmICh1c2VyZGF0YSkgeworCQkJCQlibWEudXNlcmRhdGEgPSAoYW9mZiA9PSAwKSA/CisJCQkJCQlYRlNfQUxMT0NfSU5JVElBTF9VU0VSX0RBVEEgOgorCQkJCQkJWEZTX0FMTE9DX1VTRVJEQVRBOworCQkJCX0KKwkJCQkvKgorCQkJCSAqIEZpbGwgaW4gY2hhbmdlYWJsZSBibWEgZmllbGRzLgorCQkJCSAqLworCQkJCWJtYS5lb2YgPSBlb2Y7CisJCQkJYm1hLmZpcnN0YmxvY2sgPSAqZmlyc3RibG9jazsKKwkJCQlibWEuYWxlbiA9IGFsZW47CisJCQkJYm1hLm9mZiA9IGFvZmY7CisJCQkJYm1hLndhc2RlbCA9IHdhc2RlbGF5OworCQkJCWJtYS5taW5sZW4gPSBtaW5sZW47CisJCQkJYm1hLmxvdyA9IGZsaXN0LT54YmZfbG93OworCQkJCWJtYS5taW5sZWZ0ID0gbWlubGVmdDsKKwkJCQkvKgorCQkJCSAqIE9ubHkgd2FudCB0byBkbyB0aGUgYWxpZ25tZW50IGF0IHRoZQorCQkJCSAqIGVvZiBpZiBpdCBpcyB1c2VyZGF0YSBhbmQgYWxsb2NhdGlvbiBsZW5ndGgKKwkJCQkgKiBpcyBsYXJnZXIgdGhhbiBhIHN0cmlwZSB1bml0LgorCQkJCSAqLworCQkJCWlmIChtcC0+bV9kYWxpZ24gJiYgYWxlbiA+PSBtcC0+bV9kYWxpZ24gJiYKKwkJCQkgICAgdXNlcmRhdGEgJiYgd2hpY2hmb3JrID09IFhGU19EQVRBX0ZPUkspIHsKKwkJCQkJaWYgKChlcnJvciA9IHhmc19ibWFwX2lzYWVvZihpcCwgYW9mZiwKKwkJCQkJCQl3aGljaGZvcmssICZibWEuYWVvZikpKQorCQkJCQkJZ290byBlcnJvcjA7CisJCQkJfSBlbHNlCisJCQkJCWJtYS5hZW9mID0gMDsKKwkJCQkvKgorCQkJCSAqIENhbGwgYWxsb2NhdG9yLgorCQkJCSAqLworCQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1hcF9hbGxvYygmYm1hKSkpCisJCQkJCWdvdG8gZXJyb3IwOworCQkJCS8qCisJCQkJICogQ29weSBvdXQgcmVzdWx0IGZpZWxkcy4KKwkJCQkgKi8KKwkJCQlhYm5vID0gYm1hLnJ2YWw7CisJCQkJaWYgKChmbGlzdC0+eGJmX2xvdyA9IGJtYS5sb3cpKQorCQkJCQltaW5sZWZ0ID0gMDsKKwkJCQlhbGVuID0gYm1hLmFsZW47CisJCQkJYW9mZiA9IGJtYS5vZmY7CisJCQkJQVNTRVJUKCpmaXJzdGJsb2NrID09IE5VTExGU0JMT0NLIHx8CisJCQkJICAgICAgIFhGU19GU0JfVE9fQUdOTyhtcCwgKmZpcnN0YmxvY2spID09CisJCQkJICAgICAgIFhGU19GU0JfVE9fQUdOTyhtcCwgYm1hLmZpcnN0YmxvY2spIHx8CisJCQkJICAgICAgIChmbGlzdC0+eGJmX2xvdyAmJgorCQkJCQlYRlNfRlNCX1RPX0FHTk8obXAsICpmaXJzdGJsb2NrKSA8CisJCQkJCVhGU19GU0JfVE9fQUdOTyhtcCwgYm1hLmZpcnN0YmxvY2spKSk7CisJCQkJKmZpcnN0YmxvY2sgPSBibWEuZmlyc3RibG9jazsKKwkJCQlpZiAoY3VyKQorCQkJCQljdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrID0KKwkJCQkJCSpmaXJzdGJsb2NrOworCQkJCWlmIChhYm5vID09IE5VTExGU0JMT0NLKQorCQkJCQlicmVhazsKKwkJCQlpZiAoKGlmcC0+aWZfZmxhZ3MgJiBYRlNfSUZCUk9PVCkgJiYgIWN1cikgeworCQkJCQljdXIgPSB4ZnNfYnRyZWVfaW5pdF9jdXJzb3IobXAsCisJCQkJCQl0cCwgTlVMTCwgMCwgWEZTX0JUTlVNX0JNQVAsCisJCQkJCQlpcCwgd2hpY2hmb3JrKTsKKwkJCQkJY3VyLT5iY19wcml2YXRlLmIuZmlyc3RibG9jayA9CisJCQkJCQkqZmlyc3RibG9jazsKKwkJCQkJY3VyLT5iY19wcml2YXRlLmIuZmxpc3QgPSBmbGlzdDsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBCdW1wIHRoZSBudW1iZXIgb2YgZXh0ZW50cyB3ZSd2ZSBhbGxvY2F0ZWQKKwkJCQkgKiBpbiB0aGlzIGNhbGwuCisJCQkJICovCisJCQkJbmFsbG9jcysrOworCQkJfQorCQkJaWYgKGN1cikKKwkJCQljdXItPmJjX3ByaXZhdGUuYi5mbGFncyA9CisJCQkJCXdhc2RlbGF5ID8gWEZTX0JUQ1VSX0JQUlZfV0FTREVMIDogMDsKKwkJCWdvdC5icl9zdGFydG9mZiA9IGFvZmY7CisJCQlnb3QuYnJfc3RhcnRibG9jayA9IGFibm87CisJCQlnb3QuYnJfYmxvY2tjb3VudCA9IGFsZW47CisJCQlnb3QuYnJfc3RhdGUgPSBYRlNfRVhUX05PUk07CS8qIGFzc3VtZSBub3JtYWwgKi8KKwkJCS8qCisJCQkgKiBEZXRlcm1pbmUgc3RhdGUgb2YgZXh0ZW50LCBhbmQgdGhlIGZpbGVzeXN0ZW0uCisJCQkgKiBBIHdhc2RlbGF5IGV4dGVudCBoYXMgYmVlbiBpbml0aWFsaXplZCwgc28KKwkJCSAqIHNob3VsZG4ndCBiZSBmbGFnZ2VkIGFzIHVud3JpdHRlbi4KKwkJCSAqLworCQkJaWYgKHdyICYmIFhGU19TQl9WRVJTSU9OX0hBU0VYVEZMR0JJVCgmbXAtPm1fc2IpKSB7CisJCQkJaWYgKCF3YXNkZWxheSAmJiAoZmxhZ3MgJiBYRlNfQk1BUElfUFJFQUxMT0MpKQorCQkJCQlnb3QuYnJfc3RhdGUgPSBYRlNfRVhUX1VOV1JJVFRFTjsKKwkJCX0KKwkJCWVycm9yID0geGZzX2JtYXBfYWRkX2V4dGVudChpcCwgbGFzdHgsICZjdXIsICZnb3QsCisJCQkJZmlyc3RibG9jaywgZmxpc3QsICZ0bXBfbG9nZmxhZ3MsIHdoaWNoZm9yaywKKwkJCQlyc3ZkKTsKKwkJCWxvZ2ZsYWdzIHw9IHRtcF9sb2dmbGFnczsKKwkJCWlmIChlcnJvcikKKwkJCQlnb3RvIGVycm9yMDsKKwkJCWxhc3R4ID0gaWZwLT5pZl9sYXN0ZXg7CisJCQllcCA9ICZpZnAtPmlmX3UxLmlmX2V4dGVudHNbbGFzdHhdOworCQkJbmV4dGVudHMgPSBpZnAtPmlmX2J5dGVzIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KTsKKwkJCXhmc19ibWJ0X2dldF9hbGwoZXAsICZnb3QpOworCQkJQVNTRVJUKGdvdC5icl9zdGFydG9mZiA8PSBhb2ZmKTsKKwkJCUFTU0VSVChnb3QuYnJfc3RhcnRvZmYgKyBnb3QuYnJfYmxvY2tjb3VudCA+PQorCQkJCWFvZmYgKyBhbGVuKTsKKyNpZmRlZiBERUJVRworCQkJaWYgKGRlbGF5KSB7CisJCQkJQVNTRVJUKElTTlVMTFNUQVJUQkxPQ0soZ290LmJyX3N0YXJ0YmxvY2spKTsKKwkJCQlBU1NFUlQoU1RBUlRCTE9DS1ZBTChnb3QuYnJfc3RhcnRibG9jaykgPiAwKTsKKwkJCX0KKwkJCUFTU0VSVChnb3QuYnJfc3RhdGUgPT0gWEZTX0VYVF9OT1JNIHx8CisJCQkgICAgICAgZ290LmJyX3N0YXRlID09IFhGU19FWFRfVU5XUklUVEVOKTsKKyNlbmRpZgorCQkJLyoKKwkJCSAqIEZhbGwgZG93biBpbnRvIHRoZSBmb3VuZCBhbGxvY2F0ZWQgc3BhY2UgY2FzZS4KKwkJCSAqLworCQl9IGVsc2UgaWYgKGluaG9sZSkgeworCQkJLyoKKwkJCSAqIFJlYWRpbmcgaW4gYSBob2xlLgorCQkJICovCisJCQltdmFsLT5icl9zdGFydG9mZiA9IGJubzsKKwkJCW12YWwtPmJyX3N0YXJ0YmxvY2sgPSBIT0xFU1RBUlRCTE9DSzsKKwkJCW12YWwtPmJyX2Jsb2NrY291bnQgPQorCQkJCVhGU19GSUxCTEtTX01JTihsZW4sIGdvdC5icl9zdGFydG9mZiAtIGJubyk7CisJCQltdmFsLT5icl9zdGF0ZSA9IFhGU19FWFRfTk9STTsKKwkJCWJubyArPSBtdmFsLT5icl9ibG9ja2NvdW50OworCQkJbGVuIC09IG12YWwtPmJyX2Jsb2NrY291bnQ7CisJCQltdmFsKys7CisJCQluKys7CisJCQljb250aW51ZTsKKwkJfQorCQkvKgorCQkgKiBUaGVuIGRlYWwgd2l0aCB0aGUgYWxsb2NhdGVkIHNwYWNlIHdlIGZvdW5kLgorCQkgKi8KKwkJQVNTRVJUKGVwICE9IE5VTEwpOworCQlpZiAodHJpbSAmJiAoZ290LmJyX3N0YXJ0b2ZmICsgZ290LmJyX2Jsb2NrY291bnQgPiBvYm5vKSkgeworCQkJaWYgKG9ibm8gPiBibm8pCisJCQkJYm5vID0gb2JubzsKKwkJCUFTU0VSVCgoYm5vID49IG9ibm8pIHx8IChuID09IDApKTsKKwkJCUFTU0VSVChibm8gPCBlbmQpOworCQkJbXZhbC0+YnJfc3RhcnRvZmYgPSBibm87CisJCQlpZiAoSVNOVUxMU1RBUlRCTE9DSyhnb3QuYnJfc3RhcnRibG9jaykpIHsKKwkJCQlBU1NFUlQoIXdyIHx8IGRlbGF5KTsKKwkJCQltdmFsLT5icl9zdGFydGJsb2NrID0gREVMQVlTVEFSVEJMT0NLOworCQkJfSBlbHNlCisJCQkJbXZhbC0+YnJfc3RhcnRibG9jayA9CisJCQkJCWdvdC5icl9zdGFydGJsb2NrICsKKwkJCQkJKGJubyAtIGdvdC5icl9zdGFydG9mZik7CisJCQkvKgorCQkJICogUmV0dXJuIHRoZSBtaW5pbXVtIG9mIHdoYXQgd2UgZ290IGFuZCB3aGF0IHdlCisJCQkgKiBhc2tlZCBmb3IgZm9yIHRoZSBsZW5ndGguICBXZSBjYW4gdXNlIHRoZSBsZW4KKwkJCSAqIHZhcmlhYmxlIGhlcmUgYmVjYXVzZSBpdCBpcyBtb2RpZmllZCBiZWxvdworCQkJICogYW5kIHdlIGNvdWxkIGhhdmUgYmVlbiB0aGVyZSBiZWZvcmUgY29taW5nCisJCQkgKiBoZXJlIGlmIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBhbGxvY2F0aW9uCisJCQkgKiBkaWRuJ3Qgb3ZlcmxhcCB3aGF0IHdhcyBhc2tlZCBmb3IuCisJCQkgKi8KKwkJCW12YWwtPmJyX2Jsb2NrY291bnQgPQorCQkJCVhGU19GSUxCTEtTX01JTihlbmQgLSBibm8sIGdvdC5icl9ibG9ja2NvdW50IC0KKwkJCQkJKGJubyAtIGdvdC5icl9zdGFydG9mZikpOworCQkJbXZhbC0+YnJfc3RhdGUgPSBnb3QuYnJfc3RhdGU7CisJCQlBU1NFUlQobXZhbC0+YnJfYmxvY2tjb3VudCA8PSBsZW4pOworCQl9IGVsc2UgeworCQkJKm12YWwgPSBnb3Q7CisJCQlpZiAoSVNOVUxMU1RBUlRCTE9DSyhtdmFsLT5icl9zdGFydGJsb2NrKSkgeworCQkJCUFTU0VSVCghd3IgfHwgZGVsYXkpOworCQkJCW12YWwtPmJyX3N0YXJ0YmxvY2sgPSBERUxBWVNUQVJUQkxPQ0s7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBDaGVjayBpZiB3cml0aW5nIHByZXZpb3VzbHkgYWxsb2NhdGVkIGJ1dAorCQkgKiB1bndyaXR0ZW4gZXh0ZW50cy4KKwkJICovCisJCWlmICh3ciAmJiBtdmFsLT5icl9zdGF0ZSA9PSBYRlNfRVhUX1VOV1JJVFRFTiAmJgorCQkgICAgKChmbGFncyAmIChYRlNfQk1BUElfUFJFQUxMT0N8WEZTX0JNQVBJX0RFTEFZKSkgPT0gMCkpIHsKKwkJCS8qCisJCQkgKiBNb2RpZnkgKGJ5IGFkZGluZykgdGhlIHN0YXRlIGZsYWcsIGlmIHdyaXRpbmcuCisJCQkgKi8KKwkJCUFTU0VSVChtdmFsLT5icl9ibG9ja2NvdW50IDw9IGxlbik7CisJCQlpZiAoKGlmcC0+aWZfZmxhZ3MgJiBYRlNfSUZCUk9PVCkgJiYgIWN1cikgeworCQkJCWN1ciA9IHhmc19idHJlZV9pbml0X2N1cnNvcihtcCwKKwkJCQkJdHAsIE5VTEwsIDAsIFhGU19CVE5VTV9CTUFQLAorCQkJCQlpcCwgd2hpY2hmb3JrKTsKKwkJCQljdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrID0KKwkJCQkJKmZpcnN0YmxvY2s7CisJCQkJY3VyLT5iY19wcml2YXRlLmIuZmxpc3QgPSBmbGlzdDsKKwkJCX0KKwkJCW12YWwtPmJyX3N0YXRlID0gWEZTX0VYVF9OT1JNOworCQkJZXJyb3IgPSB4ZnNfYm1hcF9hZGRfZXh0ZW50KGlwLCBsYXN0eCwgJmN1ciwgbXZhbCwKKwkJCQlmaXJzdGJsb2NrLCBmbGlzdCwgJnRtcF9sb2dmbGFncywgd2hpY2hmb3JrLAorCQkJCXJzdmQpOworCQkJbG9nZmxhZ3MgfD0gdG1wX2xvZ2ZsYWdzOworCQkJaWYgKGVycm9yKQorCQkJCWdvdG8gZXJyb3IwOworCQkJbGFzdHggPSBpZnAtPmlmX2xhc3RleDsKKwkJCWVwID0gJmlmcC0+aWZfdTEuaWZfZXh0ZW50c1tsYXN0eF07CisJCQluZXh0ZW50cyA9IGlmcC0+aWZfYnl0ZXMgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpOworCQkJeGZzX2JtYnRfZ2V0X2FsbChlcCwgJmdvdCk7CisJCQkvKgorCQkJICogV2UgbWF5IGhhdmUgY29tYmluZWQgcHJldmlvdXNseSB1bndyaXR0ZW4KKwkJCSAqIHNwYWNlIHdpdGggd3JpdHRlbiBzcGFjZSwgc28gZ2VuZXJhdGUKKwkJCSAqIGFub3RoZXIgcmVxdWVzdC4KKwkJCSAqLworCQkJaWYgKG12YWwtPmJyX2Jsb2NrY291bnQgPCBsZW4pCisJCQkJY29udGludWU7CisJCX0KKworCQlBU1NFUlQoIXRyaW0gfHwKKwkJICAgICAgICgobXZhbC0+YnJfc3RhcnRvZmYgKyBtdmFsLT5icl9ibG9ja2NvdW50KSA8PSBlbmQpKTsKKwkJQVNTRVJUKCF0cmltIHx8IChtdmFsLT5icl9ibG9ja2NvdW50IDw9IGxlbikgfHwKKwkJICAgICAgIChtdmFsLT5icl9zdGFydG9mZiA8IG9ibm8pKTsKKwkJYm5vID0gbXZhbC0+YnJfc3RhcnRvZmYgKyBtdmFsLT5icl9ibG9ja2NvdW50OworCQlsZW4gPSBlbmQgLSBibm87CisJCWlmIChuID4gMCAmJiBtdmFsLT5icl9zdGFydG9mZiA9PSBtdmFsWy0xXS5icl9zdGFydG9mZikgeworCQkJQVNTRVJUKG12YWwtPmJyX3N0YXJ0YmxvY2sgPT0gbXZhbFstMV0uYnJfc3RhcnRibG9jayk7CisJCQlBU1NFUlQobXZhbC0+YnJfYmxvY2tjb3VudCA+IG12YWxbLTFdLmJyX2Jsb2NrY291bnQpOworCQkJQVNTRVJUKG12YWwtPmJyX3N0YXRlID09IG12YWxbLTFdLmJyX3N0YXRlKTsKKwkJCW12YWxbLTFdLmJyX2Jsb2NrY291bnQgPSBtdmFsLT5icl9ibG9ja2NvdW50OworCQkJbXZhbFstMV0uYnJfc3RhdGUgPSBtdmFsLT5icl9zdGF0ZTsKKwkJfSBlbHNlIGlmIChuID4gMCAmJiBtdmFsLT5icl9zdGFydGJsb2NrICE9IERFTEFZU1RBUlRCTE9DSyAmJgorCQkJICAgbXZhbFstMV0uYnJfc3RhcnRibG9jayAhPSBERUxBWVNUQVJUQkxPQ0sgJiYKKwkJCSAgIG12YWxbLTFdLmJyX3N0YXJ0YmxvY2sgIT0gSE9MRVNUQVJUQkxPQ0sgJiYKKwkJCSAgIG12YWwtPmJyX3N0YXJ0YmxvY2sgPT0KKwkJCSAgIG12YWxbLTFdLmJyX3N0YXJ0YmxvY2sgKyBtdmFsWy0xXS5icl9ibG9ja2NvdW50ICYmCisJCQkgICAoc3RhdGVsZXNzIHx8IG12YWxbLTFdLmJyX3N0YXRlID09IG12YWwtPmJyX3N0YXRlKSkgeworCQkJQVNTRVJUKG12YWwtPmJyX3N0YXJ0b2ZmID09CisJCQkgICAgICAgbXZhbFstMV0uYnJfc3RhcnRvZmYgKyBtdmFsWy0xXS5icl9ibG9ja2NvdW50KTsKKwkJCW12YWxbLTFdLmJyX2Jsb2NrY291bnQgKz0gbXZhbC0+YnJfYmxvY2tjb3VudDsKKwkJfSBlbHNlIGlmIChuID4gMCAmJgorCQkJICAgbXZhbC0+YnJfc3RhcnRibG9jayA9PSBERUxBWVNUQVJUQkxPQ0sgJiYKKwkJCSAgIG12YWxbLTFdLmJyX3N0YXJ0YmxvY2sgPT0gREVMQVlTVEFSVEJMT0NLICYmCisJCQkgICBtdmFsLT5icl9zdGFydG9mZiA9PQorCQkJICAgbXZhbFstMV0uYnJfc3RhcnRvZmYgKyBtdmFsWy0xXS5icl9ibG9ja2NvdW50KSB7CisJCQltdmFsWy0xXS5icl9ibG9ja2NvdW50ICs9IG12YWwtPmJyX2Jsb2NrY291bnQ7CisJCQltdmFsWy0xXS5icl9zdGF0ZSA9IG12YWwtPmJyX3N0YXRlOworCQl9IGVsc2UgaWYgKCEoKG4gPT0gMCkgJiYKKwkJCSAgICAgKChtdmFsLT5icl9zdGFydG9mZiArIG12YWwtPmJyX2Jsb2NrY291bnQpIDw9CisJCQkgICAgICBvYm5vKSkpIHsKKwkJCW12YWwrKzsKKwkJCW4rKzsKKwkJfQorCQkvKgorCQkgKiBJZiB3ZSdyZSBkb25lLCBzdG9wIG5vdy4gIFN0b3Agd2hlbiB3ZSd2ZSBhbGxvY2F0ZWQKKwkJICogWEZTX0JNQVBfTUFYX05NQVAgZXh0ZW50cyBubyBtYXR0ZXIgd2hhdC4gIE90aGVyd2lzZQorCQkgKiB0aGUgdHJhbnNhY3Rpb24gbWF5IGdldCB0b28gYmlnLgorCQkgKi8KKwkJaWYgKGJubyA+PSBlbmQgfHwgbiA+PSAqbm1hcCB8fCBuYWxsb2NzID49ICpubWFwKQorCQkJYnJlYWs7CisJCS8qCisJCSAqIEVsc2UgZ28gb24gdG8gdGhlIG5leHQgcmVjb3JkLgorCQkgKi8KKwkJZXArKzsKKwkJbGFzdHgrKzsKKwkJaWYgKGxhc3R4ID49IG5leHRlbnRzKSB7CisJCQllb2YgPSAxOworCQkJcHJldiA9IGdvdDsKKwkJfSBlbHNlCisJCQl4ZnNfYm1idF9nZXRfYWxsKGVwLCAmZ290KTsKKwl9CisJaWZwLT5pZl9sYXN0ZXggPSBsYXN0eDsKKwkqbm1hcCA9IG47CisJLyoKKwkgKiBUcmFuc2Zvcm0gZnJvbSBidHJlZSB0byBleHRlbnRzLCBnaXZlIGl0IGN1ci4KKwkgKi8KKwlpZiAodHAgJiYgWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSA9PSBYRlNfRElOT0RFX0ZNVF9CVFJFRSAmJgorCSAgICBYRlNfSUZPUktfTkVYVEVOVFMoaXAsIHdoaWNoZm9yaykgPD0gaWZwLT5pZl9leHRfbWF4KSB7CisJCUFTU0VSVCh3ciAmJiBjdXIpOworCQllcnJvciA9IHhmc19ibWFwX2J0cmVlX3RvX2V4dGVudHModHAsIGlwLCBjdXIsCisJCQkmdG1wX2xvZ2ZsYWdzLCB3aGljaGZvcmspOworCQlsb2dmbGFncyB8PSB0bXBfbG9nZmxhZ3M7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZXJyb3IwOworCX0KKwlBU1NFUlQoaWZwLT5pZl9leHRfbWF4ID09CisJICAgICAgIFhGU19JRk9SS19TSVpFKGlwLCB3aGljaGZvcmspIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KSk7CisJQVNTRVJUKFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgIT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUgfHwKKwkgICAgICAgWEZTX0lGT1JLX05FWFRFTlRTKGlwLCB3aGljaGZvcmspID4gaWZwLT5pZl9leHRfbWF4KTsKKwllcnJvciA9IDA7CisKK2Vycm9yMDoKKwkvKgorCSAqIExvZyBldmVyeXRoaW5nLiAgRG8gdGhpcyBhZnRlciBjb252ZXJzaW9uLCB0aGVyZSdzIG5vIHBvaW50IGluCisJICogbG9nZ2luZyB0aGUgZXh0ZW50IGxpc3QgaWYgd2UndmUgY29udmVydGVkIHRvIGJ0cmVlIGZvcm1hdC4KKwkgKi8KKwlpZiAoKGxvZ2ZsYWdzICYgWEZTX0lMT0dfRkVYVCh3aGljaGZvcmspKSAmJgorCSAgICBYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspICE9IFhGU19ESU5PREVfRk1UX0VYVEVOVFMpCisJCWxvZ2ZsYWdzICY9IH5YRlNfSUxPR19GRVhUKHdoaWNoZm9yayk7CisJZWxzZSBpZiAoKGxvZ2ZsYWdzICYgWEZTX0lMT0dfRkJST09UKHdoaWNoZm9yaykpICYmCisJCSBYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspICE9IFhGU19ESU5PREVfRk1UX0JUUkVFKQorCQlsb2dmbGFncyAmPSB+WEZTX0lMT0dfRkJST09UKHdoaWNoZm9yayk7CisJLyoKKwkgKiBMb2cgd2hhdGV2ZXIgdGhlIGZsYWdzIHNheSwgZXZlbiBpZiBlcnJvci4gIE90aGVyd2lzZSB3ZSBtaWdodCBtaXNzCisJICogZGV0ZWN0aW5nIGEgY2FzZSB3aGVyZSB0aGUgZGF0YSBpcyBjaGFuZ2VkLCB0aGVyZSdzIGFuIGVycm9yLAorCSAqIGFuZCBpdCdzIG5vdCBsb2dnZWQgc28gd2UgZG9uJ3Qgc2h1dGRvd24gd2hlbiB3ZSBzaG91bGQuCisJICovCisJaWYgKGxvZ2ZsYWdzKSB7CisJCUFTU0VSVCh0cCAmJiB3cik7CisJCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLCBsb2dmbGFncyk7CisJfQorCWlmIChjdXIpIHsKKwkJaWYgKCFlcnJvcikgeworCQkJQVNTRVJUKCpmaXJzdGJsb2NrID09IE5VTExGU0JMT0NLIHx8CisJCQkgICAgICAgWEZTX0ZTQl9UT19BR05PKG1wLCAqZmlyc3RibG9jaykgPT0KKwkJCSAgICAgICBYRlNfRlNCX1RPX0FHTk8obXAsCisJCQkJICAgICAgIGN1ci0+YmNfcHJpdmF0ZS5iLmZpcnN0YmxvY2spIHx8CisJCQkgICAgICAgKGZsaXN0LT54YmZfbG93ICYmCisJCQkJWEZTX0ZTQl9UT19BR05PKG1wLCAqZmlyc3RibG9jaykgPAorCQkJCVhGU19GU0JfVE9fQUdOTyhtcCwKKwkJCQkJY3VyLT5iY19wcml2YXRlLmIuZmlyc3RibG9jaykpKTsKKwkJCSpmaXJzdGJsb2NrID0gY3VyLT5iY19wcml2YXRlLmIuZmlyc3RibG9jazsKKwkJfQorCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihjdXIsCisJCQllcnJvciA/IFhGU19CVFJFRV9FUlJPUiA6IFhGU19CVFJFRV9OT0VSUk9SKTsKKwl9CisJaWYgKCFlcnJvcikKKwkJeGZzX2JtYXBfdmFsaWRhdGVfcmV0KG9yaWdfYm5vLCBvcmlnX2xlbiwgb3JpZ19mbGFncywgb3JpZ19tdmFsLAorCQkJb3JpZ19ubWFwLCAqbm1hcCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogTWFwIGZpbGUgYmxvY2tzIHRvIGZpbGVzeXN0ZW0gYmxvY2tzLCBzaW1wbGUgdmVyc2lvbi4KKyAqIE9uZSBibG9jayAoZXh0ZW50KSBvbmx5LCByZWFkLW9ubHkuCisgKiBGb3IgZmxhZ3MsIG9ubHkgdGhlIFhGU19CTUFQSV9BVFRSRk9SSyBmbGFnIGlzIGV4YW1pbmVkLgorICogRm9yIHRoZSBvdGhlciBmbGFnIHZhbHVlcywgdGhlIGVmZmVjdCBpcyBhcyBpZiBYRlNfQk1BUElfTUVUQURBVEEKKyAqIHdhcyBzZXQgYW5kIGFsbCB0aGUgb3RoZXJzIHdlcmUgY2xlYXIuCisgKi8KK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfYm1hcGlfc2luZ2xlKAorCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfaW5vZGVfdAkqaXAsCQkvKiBpbmNvcmUgaW5vZGUgKi8KKwlpbnQJCXdoaWNoZm9yaywJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KKwl4ZnNfZnNibG9ja190CSpmc2IsCQkvKiBvdXRwdXQ6IG1hcHBlZCBibG9jayAqLworCXhmc19maWxlb2ZmX3QJYm5vKQkJLyogc3RhcnRpbmcgZmlsZSBvZmZzLiBtYXBwZWQgKi8KK3sKKwlpbnQJCWVvZjsJCS8qIHdlJ3ZlIGhpdCB0aGUgZW5kIG9mIGV4dGVudCBsaXN0ICovCisJaW50CQllcnJvcjsJCS8qIGVycm9yIHJldHVybiAqLworCXhmc19ibWJ0X2lyZWNfdAlnb3Q7CQkvKiBjdXJyZW50IGV4dGVudCBsaXN0IHJlY29yZCAqLworCXhmc19pZm9ya190CSppZnA7CQkvKiBpbm9kZSBmb3JrIHBvaW50ZXIgKi8KKwl4ZnNfZXh0bnVtX3QJbGFzdHg7CQkvKiBsYXN0IHVzZWZ1bCBleHRlbnQgbnVtYmVyICovCisJeGZzX2JtYnRfaXJlY190CXByZXY7CQkvKiBwcmV2aW91cyBleHRlbnQgbGlzdCByZWNvcmQgKi8KKworCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7CisJaWYgKHVubGlrZWx5KAorCSAgICBYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspICE9IFhGU19ESU5PREVfRk1UX0JUUkVFICYmCisJICAgIFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgIT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUykpIHsKKwkgICAgICAgWEZTX0VSUk9SX1JFUE9SVCgieGZzX2JtYXBpX3NpbmdsZSIsIFhGU19FUlJMRVZFTF9MT1csCisJCQkJaXAtPmlfbW91bnQpOworCSAgICAgICByZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJfQorCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKGlwLT5pX21vdW50KSkKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCVhGU19TVEFUU19JTkMoeHNfYmxrX21hcHIpOworCWlmICghKGlmcC0+aWZfZmxhZ3MgJiBYRlNfSUZFWFRFTlRTKSAmJgorCSAgICAoZXJyb3IgPSB4ZnNfaXJlYWRfZXh0ZW50cyh0cCwgaXAsIHdoaWNoZm9yaykpKQorCQlyZXR1cm4gZXJyb3I7CisJKHZvaWQpeGZzX2JtYXBfc2VhcmNoX2V4dGVudHMoaXAsIGJubywgd2hpY2hmb3JrLCAmZW9mLCAmbGFzdHgsICZnb3QsCisJCSZwcmV2KTsKKwkvKgorCSAqIFJlYWRpbmcgcGFzdCBlb2YsIGFjdCBhcyB0aG91Z2ggdGhlcmUncyBhIGhvbGUKKwkgKiB1cCB0byBlbmQuCisJICovCisJaWYgKGVvZiB8fCBnb3QuYnJfc3RhcnRvZmYgPiBibm8pIHsKKwkJKmZzYiA9IE5VTExGU0JMT0NLOworCQlyZXR1cm4gMDsKKwl9CisJQVNTRVJUKCFJU05VTExTVEFSVEJMT0NLKGdvdC5icl9zdGFydGJsb2NrKSk7CisJQVNTRVJUKGJubyA8IGdvdC5icl9zdGFydG9mZiArIGdvdC5icl9ibG9ja2NvdW50KTsKKwkqZnNiID0gZ290LmJyX3N0YXJ0YmxvY2sgKyAoYm5vIC0gZ290LmJyX3N0YXJ0b2ZmKTsKKwlpZnAtPmlmX2xhc3RleCA9IGxhc3R4OworCXJldHVybiAwOworfQorCisvKgorICogVW5tYXAgKHJlbW92ZSkgYmxvY2tzIGZyb20gYSBmaWxlLgorICogSWYgbmV4dHMgaXMgbm9uemVybyB0aGVuIHRoZSBudW1iZXIgb2YgZXh0ZW50cyB0byByZW1vdmUgaXMgbGltaXRlZCB0bworICogdGhhdCB2YWx1ZS4gIElmIG5vdCBhbGwgZXh0ZW50cyBpbiB0aGUgYmxvY2sgcmFuZ2UgY2FuIGJlIHJlbW92ZWQgdGhlbgorICogKmRvbmUgaXMgc2V0LgorICovCitpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2J1bm1hcGkoCisJeGZzX3RyYW5zX3QJCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCwJCS8qIGluY29yZSBpbm9kZSAqLworCXhmc19maWxlb2ZmX3QJCWJubywJCS8qIHN0YXJ0aW5nIG9mZnNldCB0byB1bm1hcCAqLworCXhmc19maWxibGtzX3QJCWxlbiwJCS8qIGxlbmd0aCB0byB1bm1hcCBpbiBmaWxlICovCisJaW50CQkJZmxhZ3MsCQkvKiBtaXNjIGZsYWdzICovCisJeGZzX2V4dG51bV90CQluZXh0cywJCS8qIG51bWJlciBvZiBleHRlbnRzIG1heCAqLworCXhmc19mc2Jsb2NrX3QJCSpmaXJzdGJsb2NrLAkvKiBmaXJzdCBhbGxvY2F0ZWQgYmxvY2sKKwkJCQkJCSAgIGNvbnRyb2xzIGEuZy4gZm9yIGFsbG9jcyAqLworCXhmc19ibWFwX2ZyZWVfdAkJKmZsaXN0LAkJLyogaS9vOiBsaXN0IGV4dGVudHMgdG8gZnJlZSAqLworCWludAkJCSpkb25lKQkJLyogc2V0IGlmIG5vdCBkb25lIHlldCAqLworeworCXhmc19idHJlZV9jdXJfdAkJKmN1cjsJCS8qIGJtYXAgYnRyZWUgY3Vyc29yICovCisJeGZzX2JtYnRfaXJlY190CQlkZWw7CQkvKiBleHRlbnQgYmVpbmcgZGVsZXRlZCAqLworCWludAkJCWVvZjsJCS8qIGlzIGRlbGV0aW5nIGF0IGVvZiAqLworCXhmc19ibWJ0X3JlY190CQkqZXA7CQkvKiBleHRlbnQgbGlzdCBlbnRyeSBwb2ludGVyICovCisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwl4ZnNfZXh0bnVtX3QJCWV4dG5vOwkJLyogZXh0ZW50IG51bWJlciBpbiBsaXN0ICovCisJeGZzX2JtYnRfaXJlY190CQlnb3Q7CQkvKiBjdXJyZW50IGV4dGVudCBsaXN0IGVudHJ5ICovCisJeGZzX2lmb3JrX3QJCSppZnA7CQkvKiBpbm9kZSBmb3JrIHBvaW50ZXIgKi8KKwlpbnQJCQlpc3J0OwkJLyogZnJlZWluZyBpbiBydCBhcmVhICovCisJeGZzX2V4dG51bV90CQlsYXN0eDsJCS8qIGxhc3QgZXh0ZW50IGluZGV4IHVzZWQgKi8KKwlpbnQJCQlsb2dmbGFnczsJLyogdHJhbnNhY3Rpb24gbG9nZ2luZyBmbGFncyAqLworCXhmc19leHRsZW5fdAkJbW9kOwkJLyogcnQgZXh0ZW50IG9mZnNldCAqLworCXhmc19tb3VudF90CQkqbXA7CQkvKiBtb3VudCBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZXh0bnVtX3QJCW5leHRlbnRzOwkvKiBzaXplIG9mIGV4dGVudCBsaXN0ICovCisJeGZzX2JtYnRfaXJlY190CQlwcmV2OwkJLyogcHJldmlvdXMgZXh0ZW50IGxpc3QgZW50cnkgKi8KKwl4ZnNfZmlsZW9mZl90CQlzdGFydDsJCS8qIGZpcnN0IGZpbGUgb2Zmc2V0IGRlbGV0ZWQgKi8KKwlpbnQJCQl0bXBfbG9nZmxhZ3M7CS8qIHBhcnRpYWwgbG9nZ2luZyBmbGFncyAqLworCWludAkJCXdhc2RlbDsJCS8qIHdhcyBhIGRlbGF5ZWQgYWxsb2MgZXh0ZW50ICovCisJaW50CQkJd2hpY2hmb3JrOwkvKiBkYXRhIG9yIGF0dHJpYnV0ZSBmb3JrICovCisJaW50CQkJcnN2ZDsJCS8qIE9LIHRvIGFsbG9jYXRlIHJlc2VydmVkIGJsb2NrcyAqLworCXhmc19mc2Jsb2NrX3QJCXN1bTsKKworCXhmc19idW5tYXBfdHJhY2UoaXAsIGJubywgbGVuLCBmbGFncywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCXdoaWNoZm9yayA9IChmbGFncyAmIFhGU19CTUFQSV9BVFRSRk9SSykgPworCQlYRlNfQVRUUl9GT1JLIDogWEZTX0RBVEFfRk9SSzsKKwlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOworCWlmICh1bmxpa2VseSgKKwkgICAgWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSAhPSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICYmCisJICAgIFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgIT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUpKSB7CisJCVhGU19FUlJPUl9SRVBPUlQoInhmc19idW5tYXBpIiwgWEZTX0VSUkxFVkVMX0xPVywKKwkJCQkgaXAtPmlfbW91bnQpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJfQorCW1wID0gaXAtPmlfbW91bnQ7CisJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJcnN2ZCA9IChmbGFncyAmIFhGU19CTUFQSV9SU1ZCTE9DS1MpICE9IDA7CisJQVNTRVJUKGxlbiA+IDApOworCUFTU0VSVChuZXh0cyA+PSAwKTsKKwlBU1NFUlQoaWZwLT5pZl9leHRfbWF4ID09CisJICAgICAgIFhGU19JRk9SS19TSVpFKGlwLCB3aGljaGZvcmspIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KSk7CisJaWYgKCEoaWZwLT5pZl9mbGFncyAmIFhGU19JRkVYVEVOVFMpICYmCisJICAgIChlcnJvciA9IHhmc19pcmVhZF9leHRlbnRzKHRwLCBpcCwgd2hpY2hmb3JrKSkpCisJCXJldHVybiBlcnJvcjsKKwluZXh0ZW50cyA9IGlmcC0+aWZfYnl0ZXMgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpOworCWlmIChuZXh0ZW50cyA9PSAwKSB7CisJCSpkb25lID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCVhGU19TVEFUU19JTkMoeHNfYmxrX3VubWFwKTsKKwlpc3J0ID0gKHdoaWNoZm9yayA9PSBYRlNfREFUQV9GT1JLKSAmJgorCSAgICAgICAoaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUkVBTFRJTUUpOworCXN0YXJ0ID0gYm5vOworCWJubyA9IHN0YXJ0ICsgbGVuIC0gMTsKKwllcCA9IHhmc19ibWFwX3NlYXJjaF9leHRlbnRzKGlwLCBibm8sIHdoaWNoZm9yaywgJmVvZiwgJmxhc3R4LCAmZ290LAorCQkmcHJldik7CisJLyoKKwkgKiBDaGVjayB0byBzZWUgaWYgdGhlIGdpdmVuIGJsb2NrIG51bWJlciBpcyBwYXN0IHRoZSBlbmQgb2YgdGhlCisJICogZmlsZSwgYmFjayB1cCB0byB0aGUgbGFzdCBibG9jayBpZiBzby4uLgorCSAqLworCWlmIChlb2YpIHsKKwkJZXAgPSAmaWZwLT5pZl91MS5pZl9leHRlbnRzWy0tbGFzdHhdOworCQl4ZnNfYm1idF9nZXRfYWxsKGVwLCAmZ290KTsKKwkJYm5vID0gZ290LmJyX3N0YXJ0b2ZmICsgZ290LmJyX2Jsb2NrY291bnQgLSAxOworCX0KKwlsb2dmbGFncyA9IDA7CisJaWYgKGlmcC0+aWZfZmxhZ3MgJiBYRlNfSUZCUk9PVCkgeworCQlBU1NFUlQoWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSA9PSBYRlNfRElOT0RFX0ZNVF9CVFJFRSk7CisJCWN1ciA9IHhmc19idHJlZV9pbml0X2N1cnNvcihtcCwgdHAsIE5VTEwsIDAsIFhGU19CVE5VTV9CTUFQLCBpcCwKKwkJCXdoaWNoZm9yayk7CisJCWN1ci0+YmNfcHJpdmF0ZS5iLmZpcnN0YmxvY2sgPSAqZmlyc3RibG9jazsKKwkJY3VyLT5iY19wcml2YXRlLmIuZmxpc3QgPSBmbGlzdDsKKwkJY3VyLT5iY19wcml2YXRlLmIuZmxhZ3MgPSAwOworCX0gZWxzZQorCQljdXIgPSBOVUxMOworCWV4dG5vID0gMDsKKwl3aGlsZSAoYm5vICE9ICh4ZnNfZmlsZW9mZl90KS0xICYmIGJubyA+PSBzdGFydCAmJiBsYXN0eCA+PSAwICYmCisJICAgICAgIChuZXh0cyA9PSAwIHx8IGV4dG5vIDwgbmV4dHMpKSB7CisJCS8qCisJCSAqIElzIHRoZSBmb3VuZCBleHRlbnQgYWZ0ZXIgYSBob2xlIGluIHdoaWNoIGJubyBsaXZlcz8KKwkJICogSnVzdCBiYWNrIHVwIHRvIHRoZSBwcmV2aW91cyBleHRlbnQsIGlmIHNvLgorCQkgKi8KKwkJaWYgKGdvdC5icl9zdGFydG9mZiA+IGJubykgeworCQkJaWYgKC0tbGFzdHggPCAwKQorCQkJCWJyZWFrOworCQkJZXAtLTsKKwkJCXhmc19ibWJ0X2dldF9hbGwoZXAsICZnb3QpOworCQl9CisJCS8qCisJCSAqIElzIHRoZSBsYXN0IGJsb2NrIG9mIHRoaXMgZXh0ZW50IGJlZm9yZSB0aGUgcmFuZ2UKKwkJICogd2UncmUgc3VwcG9zZWQgdG8gZGVsZXRlPyAgSWYgc28sIHdlJ3JlIGRvbmUuCisJCSAqLworCQlibm8gPSBYRlNfRklMRU9GRl9NSU4oYm5vLAorCQkJZ290LmJyX3N0YXJ0b2ZmICsgZ290LmJyX2Jsb2NrY291bnQgLSAxKTsKKwkJaWYgKGJubyA8IHN0YXJ0KQorCQkJYnJlYWs7CisJCS8qCisJCSAqIFRoZW4gZGVhbCB3aXRoIHRoZSAocG9zc2libHkgZGVsYXllZCkgYWxsb2NhdGVkIHNwYWNlCisJCSAqIHdlIGZvdW5kLgorCQkgKi8KKwkJQVNTRVJUKGVwICE9IE5VTEwpOworCQlkZWwgPSBnb3Q7CisJCXdhc2RlbCA9IElTTlVMTFNUQVJUQkxPQ0soZGVsLmJyX3N0YXJ0YmxvY2spOworCQlpZiAoZ290LmJyX3N0YXJ0b2ZmIDwgc3RhcnQpIHsKKwkJCWRlbC5icl9zdGFydG9mZiA9IHN0YXJ0OworCQkJZGVsLmJyX2Jsb2NrY291bnQgLT0gc3RhcnQgLSBnb3QuYnJfc3RhcnRvZmY7CisJCQlpZiAoIXdhc2RlbCkKKwkJCQlkZWwuYnJfc3RhcnRibG9jayArPSBzdGFydCAtIGdvdC5icl9zdGFydG9mZjsKKwkJfQorCQlpZiAoZGVsLmJyX3N0YXJ0b2ZmICsgZGVsLmJyX2Jsb2NrY291bnQgPiBibm8gKyAxKQorCQkJZGVsLmJyX2Jsb2NrY291bnQgPSBibm8gKyAxIC0gZGVsLmJyX3N0YXJ0b2ZmOworCQlzdW0gPSBkZWwuYnJfc3RhcnRibG9jayArIGRlbC5icl9ibG9ja2NvdW50OworCQlpZiAoaXNydCAmJgorCQkgICAgKG1vZCA9IGRvX21vZChzdW0sIG1wLT5tX3NiLnNiX3JleHRzaXplKSkpIHsKKwkJCS8qCisJCQkgKiBSZWFsdGltZSBleHRlbnQgbm90IGxpbmVkIHVwIGF0IHRoZSBlbmQuCisJCQkgKiBUaGUgZXh0ZW50IGNvdWxkIGhhdmUgYmVlbiBzcGxpdCBpbnRvIHdyaXR0ZW4KKwkJCSAqIGFuZCB1bndyaXR0ZW4gcGllY2VzLCBvciB3ZSBjb3VsZCBqdXN0IGJlCisJCQkgKiB1bm1hcHBpbmcgcGFydCBvZiBpdC4gIEJ1dCB3ZSBjYW4ndCByZWFsbHkKKwkJCSAqIGdldCByaWQgb2YgcGFydCBvZiBhIHJlYWx0aW1lIGV4dGVudC4KKwkJCSAqLworCQkJaWYgKGRlbC5icl9zdGF0ZSA9PSBYRlNfRVhUX1VOV1JJVFRFTiB8fAorCQkJICAgICFYRlNfU0JfVkVSU0lPTl9IQVNFWFRGTEdCSVQoJm1wLT5tX3NiKSkgeworCQkJCS8qCisJCQkJICogVGhpcyBwaWVjZSBpcyB1bndyaXR0ZW4sIG9yIHdlJ3JlIG5vdAorCQkJCSAqIHVzaW5nIHVud3JpdHRlbiBleHRlbnRzLiAgU2tpcCBvdmVyIGl0LgorCQkJCSAqLworCQkJCUFTU0VSVChibm8gPj0gbW9kKTsKKwkJCQlibm8gLT0gbW9kID4gZGVsLmJyX2Jsb2NrY291bnQgPworCQkJCQlkZWwuYnJfYmxvY2tjb3VudCA6IG1vZDsKKwkJCQlpZiAoYm5vIDwgZ290LmJyX3N0YXJ0b2ZmKSB7CisJCQkJCWlmICgtLWxhc3R4ID49IDApCisJCQkJCQl4ZnNfYm1idF9nZXRfYWxsKC0tZXAsICZnb3QpOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qCisJCQkgKiBJdCdzIHdyaXR0ZW4sIHR1cm4gaXQgdW53cml0dGVuLgorCQkJICogVGhpcyBpcyBiZXR0ZXIgdGhhbiB6ZXJvaW5nIGl0LgorCQkJICovCisJCQlBU1NFUlQoZGVsLmJyX3N0YXRlID09IFhGU19FWFRfTk9STSk7CisJCQlBU1NFUlQoeGZzX3RyYW5zX2dldF9ibG9ja19yZXModHApID4gMCk7CisJCQkvKgorCQkJICogSWYgdGhpcyBzcGFucyBhIHJlYWx0aW1lIGV4dGVudCBib3VuZGFyeSwKKwkJCSAqIGNob3AgaXQgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIG9uZSB3ZSBlbmQgYXQuCisJCQkgKi8KKwkJCWlmIChkZWwuYnJfYmxvY2tjb3VudCA+IG1vZCkgeworCQkJCWRlbC5icl9zdGFydG9mZiArPSBkZWwuYnJfYmxvY2tjb3VudCAtIG1vZDsKKwkJCQlkZWwuYnJfc3RhcnRibG9jayArPSBkZWwuYnJfYmxvY2tjb3VudCAtIG1vZDsKKwkJCQlkZWwuYnJfYmxvY2tjb3VudCA9IG1vZDsKKwkJCX0KKwkJCWRlbC5icl9zdGF0ZSA9IFhGU19FWFRfVU5XUklUVEVOOworCQkJZXJyb3IgPSB4ZnNfYm1hcF9hZGRfZXh0ZW50KGlwLCBsYXN0eCwgJmN1ciwgJmRlbCwKKwkJCQlmaXJzdGJsb2NrLCBmbGlzdCwgJmxvZ2ZsYWdzLCBYRlNfREFUQV9GT1JLLCAwKTsKKwkJCWlmIChlcnJvcikKKwkJCQlnb3RvIGVycm9yMDsKKwkJCWdvdG8gbm9kZWxldGU7CisJCX0KKwkJaWYgKGlzcnQgJiYgKG1vZCA9IGRvX21vZChkZWwuYnJfc3RhcnRibG9jaywgbXAtPm1fc2Iuc2JfcmV4dHNpemUpKSkgeworCQkJLyoKKwkJCSAqIFJlYWx0aW1lIGV4dGVudCBpcyBsaW5lZCB1cCBhdCB0aGUgZW5kIGJ1dCBub3QKKwkJCSAqIGF0IHRoZSBmcm9udC4gIFdlJ2xsIGdldCByaWQgb2YgZnVsbCBleHRlbnRzIGlmCisJCQkgKiB3ZSBjYW4uCisJCQkgKi8KKwkJCW1vZCA9IG1wLT5tX3NiLnNiX3JleHRzaXplIC0gbW9kOworCQkJaWYgKGRlbC5icl9ibG9ja2NvdW50ID4gbW9kKSB7CisJCQkJZGVsLmJyX2Jsb2NrY291bnQgLT0gbW9kOworCQkJCWRlbC5icl9zdGFydG9mZiArPSBtb2Q7CisJCQkJZGVsLmJyX3N0YXJ0YmxvY2sgKz0gbW9kOworCQkJfSBlbHNlIGlmICgoZGVsLmJyX3N0YXJ0b2ZmID09IHN0YXJ0ICYmCisJCQkJICAgIChkZWwuYnJfc3RhdGUgPT0gWEZTX0VYVF9VTldSSVRURU4gfHwKKwkJCQkgICAgIHhmc190cmFuc19nZXRfYmxvY2tfcmVzKHRwKSA9PSAwKSkgfHwKKwkJCQkgICAhWEZTX1NCX1ZFUlNJT05fSEFTRVhURkxHQklUKCZtcC0+bV9zYikpIHsKKwkJCQkvKgorCQkJCSAqIENhbid0IG1ha2UgaXQgdW53cml0dGVuLiAgVGhlcmUgaXNuJ3QKKwkJCQkgKiBhIGZ1bGwgZXh0ZW50IGhlcmUgc28ganVzdCBza2lwIGl0LgorCQkJCSAqLworCQkJCUFTU0VSVChibm8gPj0gZGVsLmJyX2Jsb2NrY291bnQpOworCQkJCWJubyAtPSBkZWwuYnJfYmxvY2tjb3VudDsKKwkJCQlpZiAoYm5vIDwgZ290LmJyX3N0YXJ0b2ZmKSB7CisJCQkJCWlmICgtLWxhc3R4ID49IDApCisJCQkJCQl4ZnNfYm1idF9nZXRfYWxsKC0tZXAsICZnb3QpOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSBpZiAoZGVsLmJyX3N0YXRlID09IFhGU19FWFRfVU5XUklUVEVOKSB7CisJCQkJLyoKKwkJCQkgKiBUaGlzIG9uZSBpcyBhbHJlYWR5IHVud3JpdHRlbi4KKwkJCQkgKiBJdCBtdXN0IGhhdmUgYSB3cml0dGVuIGxlZnQgbmVpZ2hib3IuCisJCQkJICogVW53cml0ZSB0aGUga2lsbGVkIHBhcnQgb2YgdGhhdCBvbmUgYW5kCisJCQkJICogdHJ5IGFnYWluLgorCQkJCSAqLworCQkJCUFTU0VSVChsYXN0eCA+IDApOworCQkJCXhmc19ibWJ0X2dldF9hbGwoZXAgLSAxLCAmcHJldik7CisJCQkJQVNTRVJUKHByZXYuYnJfc3RhdGUgPT0gWEZTX0VYVF9OT1JNKTsKKwkJCQlBU1NFUlQoIUlTTlVMTFNUQVJUQkxPQ0socHJldi5icl9zdGFydGJsb2NrKSk7CisJCQkJQVNTRVJUKGRlbC5icl9zdGFydGJsb2NrID09CisJCQkJICAgICAgIHByZXYuYnJfc3RhcnRibG9jayArIHByZXYuYnJfYmxvY2tjb3VudCk7CisJCQkJaWYgKHByZXYuYnJfc3RhcnRvZmYgPCBzdGFydCkgeworCQkJCQltb2QgPSBzdGFydCAtIHByZXYuYnJfc3RhcnRvZmY7CisJCQkJCXByZXYuYnJfYmxvY2tjb3VudCAtPSBtb2Q7CisJCQkJCXByZXYuYnJfc3RhcnRibG9jayArPSBtb2Q7CisJCQkJCXByZXYuYnJfc3RhcnRvZmYgPSBzdGFydDsKKwkJCQl9CisJCQkJcHJldi5icl9zdGF0ZSA9IFhGU19FWFRfVU5XUklUVEVOOworCQkJCWVycm9yID0geGZzX2JtYXBfYWRkX2V4dGVudChpcCwgbGFzdHggLSAxLCAmY3VyLAorCQkJCQkmcHJldiwgZmlyc3RibG9jaywgZmxpc3QsICZsb2dmbGFncywKKwkJCQkJWEZTX0RBVEFfRk9SSywgMCk7CisJCQkJaWYgKGVycm9yKQorCQkJCQlnb3RvIGVycm9yMDsKKwkJCQlnb3RvIG5vZGVsZXRlOworCQkJfSBlbHNlIHsKKwkJCQlBU1NFUlQoZGVsLmJyX3N0YXRlID09IFhGU19FWFRfTk9STSk7CisJCQkJZGVsLmJyX3N0YXRlID0gWEZTX0VYVF9VTldSSVRURU47CisJCQkJZXJyb3IgPSB4ZnNfYm1hcF9hZGRfZXh0ZW50KGlwLCBsYXN0eCwgJmN1ciwKKwkJCQkJJmRlbCwgZmlyc3RibG9jaywgZmxpc3QsICZsb2dmbGFncywKKwkJCQkJWEZTX0RBVEFfRk9SSywgMCk7CisJCQkJaWYgKGVycm9yKQorCQkJCQlnb3RvIGVycm9yMDsKKwkJCQlnb3RvIG5vZGVsZXRlOworCQkJfQorCQl9CisJCWlmICh3YXNkZWwpIHsKKwkJCUFTU0VSVChTVEFSVEJMT0NLVkFMKGRlbC5icl9zdGFydGJsb2NrKSA+IDApOworCQkJeGZzX21vZF9pbmNvcmVfc2IobXAsIFhGU19TQlNfRkRCTE9DS1MsCisJCQkJKGludClkZWwuYnJfYmxvY2tjb3VudCwgcnN2ZCk7CisJCQkvKiBVbnJlc2VydmUgb3VyIHF1b3RhIHNwYWNlICovCisJCQlYRlNfVFJBTlNfUkVTRVJWRV9RVU9UQV9OQkxLUygKKwkJCQltcCwgTlVMTCwgaXAsIC0oKGxvbmcpZGVsLmJyX2Jsb2NrY291bnQpLCAwLAorCQkJCWlzcnQgPwlYRlNfUU1PUFRfUkVTX1JUQkxLUyA6CisJCQkJCVhGU19RTU9QVF9SRVNfUkVHQkxLUyk7CisJCQlpcC0+aV9kZWxheWVkX2Jsa3MgLT0gZGVsLmJyX2Jsb2NrY291bnQ7CisJCQlpZiAoY3VyKQorCQkJCWN1ci0+YmNfcHJpdmF0ZS5iLmZsYWdzIHw9CisJCQkJCVhGU19CVENVUl9CUFJWX1dBU0RFTDsKKwkJfSBlbHNlIGlmIChjdXIpCisJCQljdXItPmJjX3ByaXZhdGUuYi5mbGFncyAmPSB+WEZTX0JUQ1VSX0JQUlZfV0FTREVMOworCQkvKgorCQkgKiBJZiBpdCdzIHRoZSBjYXNlIHdoZXJlIHRoZSBkaXJlY3RvcnkgY29kZSBpcyBydW5uaW5nCisJCSAqIHdpdGggbm8gYmxvY2sgcmVzZXJ2YXRpb24sIGFuZCB0aGUgZGVsZXRlZCBibG9jayBpcyBpbgorCQkgKiB0aGUgbWlkZGxlIG9mIGl0cyBleHRlbnQsIGFuZCB0aGUgcmVzdWx0aW5nIGluc2VydAorCQkgKiBvZiBhbiBleHRlbnQgd291bGQgY2F1c2UgdHJhbnNmb3JtYXRpb24gdG8gYnRyZWUgZm9ybWF0LAorCQkgKiB0aGVuIHJlamVjdCBpdC4gIFRoZSBjYWxsaW5nIGNvZGUgd2lsbCB0aGVuIHN3YXAKKwkJICogYmxvY2tzIGFyb3VuZCBpbnN0ZWFkLgorCQkgKiBXZSBoYXZlIHRvIGRvIHRoaXMgbm93LCByYXRoZXIgdGhhbiB3YWl0aW5nIGZvciB0aGUKKwkJICogY29udmVyc2lvbiB0byBidHJlZSBmb3JtYXQsIHNpbmNlIHRoZSB0cmFuc2FjdGlvbgorCQkgKiB3aWxsIGJlIGRpcnR5LgorCQkgKi8KKwkJaWYgKCF3YXNkZWwgJiYgeGZzX3RyYW5zX2dldF9ibG9ja19yZXModHApID09IDAgJiYKKwkJICAgIFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgPT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUyAmJgorCQkgICAgWEZTX0lGT1JLX05FWFRFTlRTKGlwLCB3aGljaGZvcmspID49IGlmcC0+aWZfZXh0X21heCAmJgorCQkgICAgZGVsLmJyX3N0YXJ0b2ZmID4gZ290LmJyX3N0YXJ0b2ZmICYmCisJCSAgICBkZWwuYnJfc3RhcnRvZmYgKyBkZWwuYnJfYmxvY2tjb3VudCA8CisJCSAgICBnb3QuYnJfc3RhcnRvZmYgKyBnb3QuYnJfYmxvY2tjb3VudCkgeworCQkJZXJyb3IgPSBYRlNfRVJST1IoRU5PU1BDKTsKKwkJCWdvdG8gZXJyb3IwOworCQl9CisJCWVycm9yID0geGZzX2JtYXBfZGVsX2V4dGVudChpcCwgdHAsIGxhc3R4LCBmbGlzdCwgY3VyLCAmZGVsLAorCQkJJnRtcF9sb2dmbGFncywgd2hpY2hmb3JrLCByc3ZkKTsKKwkJbG9nZmxhZ3MgfD0gdG1wX2xvZ2ZsYWdzOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGVycm9yMDsKKwkJYm5vID0gZGVsLmJyX3N0YXJ0b2ZmIC0gMTsKK25vZGVsZXRlOgorCQlsYXN0eCA9IGlmcC0+aWZfbGFzdGV4OworCQkvKgorCQkgKiBJZiBub3QgZG9uZSBnbyBvbiB0byB0aGUgbmV4dCAocHJldmlvdXMpIHJlY29yZC4KKwkJICogUmVzZXQgZXAgaW4gY2FzZSB0aGUgZXh0ZW50cyBhcnJheSB3YXMgcmUtYWxsb2NlZC4KKwkJICovCisJCWVwID0gJmlmcC0+aWZfdTEuaWZfZXh0ZW50c1tsYXN0eF07CisJCWlmIChibm8gIT0gKHhmc19maWxlb2ZmX3QpLTEgJiYgYm5vID49IHN0YXJ0KSB7CisJCQlpZiAobGFzdHggPj0gWEZTX0lGT1JLX05FWFRFTlRTKGlwLCB3aGljaGZvcmspIHx8CisJCQkgICAgeGZzX2JtYnRfZ2V0X3N0YXJ0b2ZmKGVwKSA+IGJubykgeworCQkJCWxhc3R4LS07CisJCQkJZXAtLTsKKwkJCX0KKwkJCWlmIChsYXN0eCA+PSAwKQorCQkJCXhmc19ibWJ0X2dldF9hbGwoZXAsICZnb3QpOworCQkJZXh0bm8rKzsKKwkJfQorCX0KKwlpZnAtPmlmX2xhc3RleCA9IGxhc3R4OworCSpkb25lID0gYm5vID09ICh4ZnNfZmlsZW9mZl90KS0xIHx8IGJubyA8IHN0YXJ0IHx8IGxhc3R4IDwgMDsKKwlBU1NFUlQoaWZwLT5pZl9leHRfbWF4ID09CisJICAgICAgIFhGU19JRk9SS19TSVpFKGlwLCB3aGljaGZvcmspIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KSk7CisJLyoKKwkgKiBDb252ZXJ0IHRvIGEgYnRyZWUgaWYgbmVjZXNzYXJ5LgorCSAqLworCWlmIChYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspID09IFhGU19ESU5PREVfRk1UX0VYVEVOVFMgJiYKKwkgICAgWEZTX0lGT1JLX05FWFRFTlRTKGlwLCB3aGljaGZvcmspID4gaWZwLT5pZl9leHRfbWF4KSB7CisJCUFTU0VSVChjdXIgPT0gTlVMTCk7CisJCWVycm9yID0geGZzX2JtYXBfZXh0ZW50c190b19idHJlZSh0cCwgaXAsIGZpcnN0YmxvY2ssIGZsaXN0LAorCQkJJmN1ciwgMCwgJnRtcF9sb2dmbGFncywgd2hpY2hmb3JrKTsKKwkJbG9nZmxhZ3MgfD0gdG1wX2xvZ2ZsYWdzOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGVycm9yMDsKKwl9CisJLyoKKwkgKiB0cmFuc2Zvcm0gZnJvbSBidHJlZSB0byBleHRlbnRzLCBnaXZlIGl0IGN1cgorCSAqLworCWVsc2UgaWYgKFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgPT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUgJiYKKwkJIFhGU19JRk9SS19ORVhURU5UUyhpcCwgd2hpY2hmb3JrKSA8PSBpZnAtPmlmX2V4dF9tYXgpIHsKKwkJQVNTRVJUKGN1ciAhPSBOVUxMKTsKKwkJZXJyb3IgPSB4ZnNfYm1hcF9idHJlZV90b19leHRlbnRzKHRwLCBpcCwgY3VyLCAmdG1wX2xvZ2ZsYWdzLAorCQkJd2hpY2hmb3JrKTsKKwkJbG9nZmxhZ3MgfD0gdG1wX2xvZ2ZsYWdzOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGVycm9yMDsKKwl9CisJLyoKKwkgKiB0cmFuc2Zvcm0gZnJvbSBleHRlbnRzIHRvIGxvY2FsPworCSAqLworCUFTU0VSVChpZnAtPmlmX2V4dF9tYXggPT0KKwkgICAgICAgWEZTX0lGT1JLX1NJWkUoaXAsIHdoaWNoZm9yaykgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpKTsKKwllcnJvciA9IDA7CitlcnJvcjA6CisJLyoKKwkgKiBMb2cgZXZlcnl0aGluZy4gIERvIHRoaXMgYWZ0ZXIgY29udmVyc2lvbiwgdGhlcmUncyBubyBwb2ludCBpbgorCSAqIGxvZ2dpbmcgdGhlIGV4dGVudCBsaXN0IGlmIHdlJ3ZlIGNvbnZlcnRlZCB0byBidHJlZSBmb3JtYXQuCisJICovCisJaWYgKChsb2dmbGFncyAmIFhGU19JTE9HX0ZFWFQod2hpY2hmb3JrKSkgJiYKKwkgICAgWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSAhPSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTKQorCQlsb2dmbGFncyAmPSB+WEZTX0lMT0dfRkVYVCh3aGljaGZvcmspOworCWVsc2UgaWYgKChsb2dmbGFncyAmIFhGU19JTE9HX0ZCUk9PVCh3aGljaGZvcmspKSAmJgorCQkgWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSAhPSBYRlNfRElOT0RFX0ZNVF9CVFJFRSkKKwkJbG9nZmxhZ3MgJj0gflhGU19JTE9HX0ZCUk9PVCh3aGljaGZvcmspOworCS8qCisJICogTG9nIGlub2RlIGV2ZW4gaW4gdGhlIGVycm9yIGNhc2UsIGlmIHRoZSB0cmFuc2FjdGlvbgorCSAqIGlzIGRpcnR5IHdlJ2xsIG5lZWQgdG8gc2h1dCBkb3duIHRoZSBmaWxlc3lzdGVtLgorCSAqLworCWlmIChsb2dmbGFncykKKwkJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgaXAsIGxvZ2ZsYWdzKTsKKwlpZiAoY3VyKSB7CisJCWlmICghZXJyb3IpIHsKKwkJCSpmaXJzdGJsb2NrID0gY3VyLT5iY19wcml2YXRlLmIuZmlyc3RibG9jazsKKwkJCWN1ci0+YmNfcHJpdmF0ZS5iLmFsbG9jYXRlZCA9IDA7CisJCX0KKwkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY3VyLAorCQkJZXJyb3IgPyBYRlNfQlRSRUVfRVJST1IgOiBYRlNfQlRSRUVfTk9FUlJPUik7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIEZjbnRsIGludGVyZmFjZSB0byB4ZnNfYm1hcGkuCisgKi8KK2ludAkJCQkJCS8qIGVycm9yIGNvZGUgKi8KK3hmc19nZXRibWFwKAorCWJodl9kZXNjX3QJCSpiZHAsCQkvKiBYRlMgYmVoYXZpb3IgZGVzY3JpcHRvciovCisJc3RydWN0IGdldGJtYXAJCSpibXYsCQkvKiB1c2VyIGJtYXAgc3RydWN0dXJlICovCisJdm9pZAkJCV9fdXNlciAqYXAsCS8qIHBvaW50ZXIgdG8gdXNlcidzIGFycmF5ICovCisJaW50CQkJaW50ZXJmYWNlKQkvKiBpbnRlcmZhY2UgZmxhZ3MgKi8KK3sKKwlfX2ludDY0X3QJCWJtdmVuZDsJCS8qIGxhc3QgYmxvY2sgcmVxdWVzdGVkICovCisJaW50CQkJZXJyb3I7CQkvKiByZXR1cm4gdmFsdWUgKi8KKwlfX2ludDY0X3QJCWZpeGxlbjsJCS8qIGxlbmd0aCBmb3IgLTEgY2FzZSAqLworCWludAkJCWk7CQkvKiBleHRlbnQgbnVtYmVyICovCisJeGZzX2lub2RlX3QJCSppcDsJCS8qIHhmcyBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLworCXZub2RlX3QJCQkqdnA7CQkvKiBjb3JyZXNwb25kaW5nIHZub2RlICovCisJaW50CQkJbG9jazsJCS8qIGxvY2sgc3RhdGUgKi8KKwl4ZnNfYm1idF9pcmVjX3QJCSptYXA7CQkvKiBidWZmZXIgZm9yIHVzZXIncyBkYXRhICovCisJeGZzX21vdW50X3QJCSptcDsJCS8qIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50ICovCisJaW50CQkJbmV4OwkJLyogIyBvZiB1c2VyIGV4dGVudHMgY2FuIGRvICovCisJaW50CQkJbmV4bGVmdDsJLyogIyBvZiB1c2VyIGV4dGVudHMgbGVmdCAqLworCWludAkJCXN1Ym5leDsJCS8qICMgb2YgYm1hcGkncyBjYW4gZG8gKi8KKwlpbnQJCQlubWFwOwkJLyogbnVtYmVyIG9mIG1hcCBlbnRyaWVzICovCisJc3RydWN0IGdldGJtYXAJCW91dDsJCS8qIG91dHB1dCBzdHJ1Y3R1cmUgKi8KKwlpbnQJCQl3aGljaGZvcms7CS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCisJaW50CQkJcHJlYWxsb2NlZDsJLyogdGhpcyBpcyBhIGZpbGUgd2l0aAorCQkJCQkJICogcHJlYWxsb2NhdGVkIGRhdGEgc3BhY2UgKi8KKwlpbnQJCQlzaF91bndyaXR0ZW47CS8qIHRydWUsIGlmIHVud3JpdHRlbiAqLworCQkJCQkJLyogZXh0ZW50cyBsaXN0ZWQgc2VwYXJhdGVseSAqLworCWludAkJCWJtYXBpX2ZsYWdzOwkvKiBmbGFncyBmb3IgeGZzX2JtYXBpICovCisJX19pbnQzMl90CQlvZmxhZ3M7CQkvKiBnZXRibWFweCBibXZfb2ZsYWdzIGZpZWxkICovCisKKwl2cCA9IEJIVl9UT19WTk9ERShiZHApOworCWlwID0gWEZTX0JIVlRPSShiZHApOworCW1wID0gaXAtPmlfbW91bnQ7CisKKwl3aGljaGZvcmsgPSBpbnRlcmZhY2UgJiBCTVZfSUZfQVRUUkZPUksgPyBYRlNfQVRUUl9GT1JLIDogWEZTX0RBVEFfRk9SSzsKKwlzaF91bndyaXR0ZW4gPSAoaW50ZXJmYWNlICYgQk1WX0lGX1BSRUFMTE9DKSAhPSAwOworCisJLyoJSWYgdGhlIEJNVl9JRl9OT19ETUFQSV9SRUFEIGludGVyZmFjZSBiaXQgc3BlY2lmaWVkLCBkbyBub3QKKwkgKglnZW5lcmF0ZSBhIERNQVBJIHJlYWQgZXZlbnQuICBPdGhlcndpc2UsIGlmIHRoZSBETV9FVkVOVF9SRUFECisJICoJYml0IGlzIHNldCBmb3IgdGhlIGZpbGUsIGdlbmVyYXRlIGEgcmVhZCBldmVudCBpbiBvcmRlcgorCSAqCXRoYXQgdGhlIERNQVBJIGFwcGxpY2F0aW9uIG1heSBkbyBpdHMgdGhpbmcgYmVmb3JlIHdlIHJldHVybgorCSAqCXRoZSBleHRlbnRzLiAgVXN1YWxseSB0aGlzIG1lYW5zIHJlc3RvcmluZyB1c2VyIGZpbGUgZGF0YSB0bworCSAqCXJlZ2lvbnMgb2YgdGhlIGZpbGUgdGhhdCBsb29rIGxpa2UgaG9sZXMuCisJICoKKwkgKglUaGUgIm9sZCBiZWhhdmlvciIgKGZyb20gWEZTX0lPQ19HRVRCTUFQKSBpcyB0byBub3Qgc3BlY2lmeQorCSAqCUJNVl9JRl9OT19ETUFQSV9SRUFEIHNvIHRoYXQgcmVhZCBldmVudHMgYXJlIGdlbmVyYXRlZC4KKwkgKglJZiB0aGlzIHdlcmUgbm90IHRydWUsIGNhbGxlcnMgb2YgaW9jdGwoIFhGU19JT0NfR0VUQk1BUCApCisJICoJY291bGQgbWlzaW50ZXJwcmV0IGhvbGVzIGluIGEgRE1BUEkgZmlsZSBhcyB0cnVlIGhvbGVzLAorCSAqCXdoZW4gaW4gZmFjdCB0aGV5IG1heSByZXByZXNlbnQgb2ZmbGluZSB1c2VyIGRhdGEuCisJICovCisJaWYgKCAgIChpbnRlcmZhY2UgJiBCTVZfSUZfTk9fRE1BUElfUkVBRCkgPT0gMAorCSAgICAmJiBETV9FVkVOVF9FTkFCTEVEKHZwLT52X3Zmc3AsIGlwLCBETV9FVkVOVF9SRUFEKQorCSAgICAmJiB3aGljaGZvcmsgPT0gWEZTX0RBVEFfRk9SSykgeworCisJCWVycm9yID0gWEZTX1NFTkRfREFUQShtcCwgRE1fRVZFTlRfUkVBRCwgdnAsIDAsIDAsIDAsIE5VTEwpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gWEZTX0VSUk9SKGVycm9yKTsKKwl9CisKKwlpZiAod2hpY2hmb3JrID09IFhGU19BVFRSX0ZPUkspIHsKKwkJaWYgKFhGU19JRk9SS19RKGlwKSkgeworCQkJaWYgKGlwLT5pX2QuZGlfYWZvcm1hdCAhPSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTICYmCisJCQkgICAgaXAtPmlfZC5kaV9hZm9ybWF0ICE9IFhGU19ESU5PREVfRk1UX0JUUkVFICYmCisJCQkgICAgaXAtPmlfZC5kaV9hZm9ybWF0ICE9IFhGU19ESU5PREVfRk1UX0xPQ0FMKQorCQkJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKwkJfSBlbHNlIGlmICh1bmxpa2VseSgKKwkJCSAgIGlwLT5pX2QuZGlfYWZvcm1hdCAhPSAwICYmCisJCQkgICBpcC0+aV9kLmRpX2Fmb3JtYXQgIT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUykpIHsKKwkJCVhGU19FUlJPUl9SRVBPUlQoInhmc19nZXRibWFwIiwgWEZTX0VSUkxFVkVMX0xPVywKKwkJCQkJIGlwLT5pX21vdW50KTsKKwkJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwkJfQorCX0gZWxzZSBpZiAoaXAtPmlfZC5kaV9mb3JtYXQgIT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUyAmJgorCQkgICBpcC0+aV9kLmRpX2Zvcm1hdCAhPSBYRlNfRElOT0RFX0ZNVF9CVFJFRSAmJgorCQkgICBpcC0+aV9kLmRpX2Zvcm1hdCAhPSBYRlNfRElOT0RFX0ZNVF9MT0NBTCkKKwkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCWlmICh3aGljaGZvcmsgPT0gWEZTX0RBVEFfRk9SSykgeworCQlpZiAoaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUFJFQUxMT0MpIHsKKwkJCXByZWFsbG9jZWQgPSAxOworCQkJZml4bGVuID0gWEZTX01BWElPRkZTRVQobXApOworCQl9IGVsc2UgeworCQkJcHJlYWxsb2NlZCA9IDA7CisJCQlmaXhsZW4gPSBpcC0+aV9kLmRpX3NpemU7CisJCX0KKwl9IGVsc2UgeworCQlwcmVhbGxvY2VkID0gMDsKKwkJZml4bGVuID0gMUxMIDw8IDMyOworCX0KKworCWlmIChibXYtPmJtdl9sZW5ndGggPT0gLTEpIHsKKwkJZml4bGVuID0gWEZTX0ZTQl9UT19CQihtcCwgWEZTX0JfVE9fRlNCKG1wLCBmaXhsZW4pKTsKKwkJYm12LT5ibXZfbGVuZ3RoID0gTUFYKCAoX19pbnQ2NF90KShmaXhsZW4gLSBibXYtPmJtdl9vZmZzZXQpLAorCQkJCQkoX19pbnQ2NF90KTApOworCX0gZWxzZSBpZiAoYm12LT5ibXZfbGVuZ3RoIDwgMCkKKwkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCWlmIChibXYtPmJtdl9sZW5ndGggPT0gMCkgeworCQlibXYtPmJtdl9lbnRyaWVzID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCW5leCA9IGJtdi0+Ym12X2NvdW50IC0gMTsKKwlpZiAobmV4IDw9IDApCisJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKwlibXZlbmQgPSBibXYtPmJtdl9vZmZzZXQgKyBibXYtPmJtdl9sZW5ndGg7CisKKwl4ZnNfaWxvY2soaXAsIFhGU19JT0xPQ0tfU0hBUkVEKTsKKworCWlmICh3aGljaGZvcmsgPT0gWEZTX0RBVEFfRk9SSyAmJiBpcC0+aV9kZWxheWVkX2Jsa3MpIHsKKwkJLyogeGZzX2ZzaXplX3QgbGFzdF9ieXRlID0geGZzX2ZpbGVfbGFzdF9ieXRlKGlwKTsgKi8KKwkJVk9QX0ZMVVNIX1BBR0VTKHZwLCAoeGZzX29mZl90KTAsIC0xLCAwLCBGSV9SRU1BUEYsIGVycm9yKTsKKwl9CisKKwlBU1NFUlQod2hpY2hmb3JrID09IFhGU19BVFRSX0ZPUksgfHwgaXAtPmlfZGVsYXllZF9ibGtzID09IDApOworCisJbG9jayA9IHhmc19pbG9ja19tYXBfc2hhcmVkKGlwKTsKKworCS8qCisJICogRG9uJ3QgbGV0IG5leCBiZSBiaWdnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGV4dGVudHMKKwkgKiB3ZSBjYW4gaGF2ZSBhc3N1bWluZyBhbHRlcm5hdGluZyBob2xlcyBhbmQgcmVhbCBleHRlbnRzLgorCSAqLworCWlmIChuZXggPiBYRlNfSUZPUktfTkVYVEVOVFMoaXAsIHdoaWNoZm9yaykgKiAyICsgMSkKKwkJbmV4ID0gWEZTX0lGT1JLX05FWFRFTlRTKGlwLCB3aGljaGZvcmspICogMiArIDE7CisKKwlibWFwaV9mbGFncyA9IFhGU19CTUFQSV9BRkxBRyh3aGljaGZvcmspIHwKKwkJCSgoc2hfdW53cml0dGVuKSA/IDAgOiBYRlNfQk1BUElfSUdTVEFURSk7CisKKwkvKgorCSAqIEFsbG9jYXRlIGVub3VnaCBzcGFjZSB0byBoYW5kbGUgInN1Ym5leCIgbWFwcyBhdCBhIHRpbWUuCisJICovCisJc3VibmV4ID0gMTY7CisJbWFwID0ga21lbV9hbGxvYyhzdWJuZXggKiBzaXplb2YoKm1hcCksIEtNX1NMRUVQKTsKKworCWJtdi0+Ym12X2VudHJpZXMgPSAwOworCisJaWYgKFhGU19JRk9SS19ORVhURU5UUyhpcCwgd2hpY2hmb3JrKSA9PSAwKSB7CisJCWVycm9yID0gMDsKKwkJZ290byB1bmxvY2tfYW5kX3JldHVybjsKKwl9CisKKwluZXhsZWZ0ID0gbmV4OworCisJZG8geworCQlubWFwID0gKG5leGxlZnQgPiBzdWJuZXgpID8gc3VibmV4IDogbmV4bGVmdDsKKwkJZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgaXAsIFhGU19CQl9UT19GU0JUKG1wLCBibXYtPmJtdl9vZmZzZXQpLAorCQkJCSAgWEZTX0JCX1RPX0ZTQihtcCwgYm12LT5ibXZfbGVuZ3RoKSwKKwkJCQkgIGJtYXBpX2ZsYWdzLCBOVUxMLCAwLCBtYXAsICZubWFwLCBOVUxMKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byB1bmxvY2tfYW5kX3JldHVybjsKKwkJQVNTRVJUKG5tYXAgPD0gc3VibmV4KTsKKworCQlmb3IgKGkgPSAwOyBpIDwgbm1hcCAmJiBuZXhsZWZ0ICYmIGJtdi0+Ym12X2xlbmd0aDsgaSsrKSB7CisJCQluZXhsZWZ0LS07CisJCQlvZmxhZ3MgPSAobWFwW2ldLmJyX3N0YXRlID09IFhGU19FWFRfVU5XUklUVEVOKSA/CisJCQkJCUJNVl9PRl9QUkVBTExPQyA6IDA7CisJCQlvdXQuYm12X29mZnNldCA9IFhGU19GU0JfVE9fQkIobXAsIG1hcFtpXS5icl9zdGFydG9mZik7CisJCQlvdXQuYm12X2xlbmd0aCA9IFhGU19GU0JfVE9fQkIobXAsIG1hcFtpXS5icl9ibG9ja2NvdW50KTsKKwkJCUFTU0VSVChtYXBbaV0uYnJfc3RhcnRibG9jayAhPSBERUxBWVNUQVJUQkxPQ0spOworCQkJaWYgKHByZWFsbG9jZWQgJiYKKwkJCSAgICBtYXBbaV0uYnJfc3RhcnRibG9jayA9PSBIT0xFU1RBUlRCTE9DSyAmJgorCQkJICAgIG91dC5ibXZfb2Zmc2V0ICsgb3V0LmJtdl9sZW5ndGggPT0gYm12ZW5kKSB7CisJCQkJLyoKKwkJCQkgKiBjYW1lIHRvIGhvbGUgYXQgZW5kIG9mIGZpbGUKKwkJCQkgKi8KKwkJCQlnb3RvIHVubG9ja19hbmRfcmV0dXJuOworCQkJfSBlbHNlIHsKKwkJCQlvdXQuYm12X2Jsb2NrID0KKwkJCQkgICAgKG1hcFtpXS5icl9zdGFydGJsb2NrID09IEhPTEVTVEFSVEJMT0NLKSA/CisJCQkJCS0xIDoKKwkJCQkJWEZTX0ZTQl9UT19EQihpcCwgbWFwW2ldLmJyX3N0YXJ0YmxvY2spOworCisJCQkJLyogcmV0dXJuIGVpdGhlciBnZXRibWFwL2dldGJtYXB4IHN0cnVjdHVyZS4gKi8KKwkJCQlpZiAoaW50ZXJmYWNlICYgQk1WX0lGX0VYVEVOREVEKSB7CisJCQkJCXN0cnVjdAlnZXRibWFweAlvdXR4OworCisJCQkJCUdFVEJNQVBfQ09OVkVSVChvdXQsb3V0eCk7CisJCQkJCW91dHguYm12X29mbGFncyA9IG9mbGFnczsKKwkJCQkJb3V0eC5ibXZfdW51c2VkMSA9IG91dHguYm12X3VudXNlZDIgPSAwOworCQkJCQlpZiAoY29weV90b191c2VyKGFwLCAmb3V0eCwKKwkJCQkJCQlzaXplb2Yob3V0eCkpKSB7CisJCQkJCQllcnJvciA9IFhGU19FUlJPUihFRkFVTFQpOworCQkJCQkJZ290byB1bmxvY2tfYW5kX3JldHVybjsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmIChjb3B5X3RvX3VzZXIoYXAsICZvdXQsCisJCQkJCQkJc2l6ZW9mKG91dCkpKSB7CisJCQkJCQllcnJvciA9IFhGU19FUlJPUihFRkFVTFQpOworCQkJCQkJZ290byB1bmxvY2tfYW5kX3JldHVybjsKKwkJCQkJfQorCQkJCX0KKwkJCQlibXYtPmJtdl9vZmZzZXQgPQorCQkJCQlvdXQuYm12X29mZnNldCArIG91dC5ibXZfbGVuZ3RoOworCQkJCWJtdi0+Ym12X2xlbmd0aCA9IE1BWCgoX19pbnQ2NF90KTAsCisJCQkJCShfX2ludDY0X3QpKGJtdmVuZCAtIGJtdi0+Ym12X29mZnNldCkpOworCQkJCWJtdi0+Ym12X2VudHJpZXMrKzsKKwkJCQlhcCA9IChpbnRlcmZhY2UgJiBCTVZfSUZfRVhURU5ERUQpID8KKwkJCQkJCSh2b2lkIF9fdXNlciAqKQorCQkJCQkoKHN0cnVjdCBnZXRibWFweCBfX3VzZXIgKilhcCArIDEpIDoKKwkJCQkJCSh2b2lkIF9fdXNlciAqKQorCQkJCQkoKHN0cnVjdCBnZXRibWFwIF9fdXNlciAqKWFwICsgMSk7CisJCQl9CisJCX0KKwl9IHdoaWxlIChubWFwICYmIG5leGxlZnQgJiYgYm12LT5ibXZfbGVuZ3RoKTsKKwordW5sb2NrX2FuZF9yZXR1cm46CisJeGZzX2l1bmxvY2tfbWFwX3NoYXJlZChpcCwgbG9jayk7CisJeGZzX2l1bmxvY2soaXAsIFhGU19JT0xPQ0tfU0hBUkVEKTsKKworCWttZW1fZnJlZShtYXAsIHN1Ym5leCAqIHNpemVvZigqbWFwKSk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBDaGVjayB0aGUgbGFzdCBpbm9kZSBleHRlbnQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBhbGxvY2F0aW9uIHdpbGwgcmVzdWx0CisgKiBpbiBibG9ja3MgYmVpbmcgYWxsb2NhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuIFdoZW4gd2UgYWxsb2NhdGUgbmV3IGRhdGEKKyAqIGJsb2NrcyBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIHdoaWNoIGRvIG5vdCBzdGFydCBhdCB0aGUgcHJldmlvdXMgZGF0YSBibG9jaywKKyAqIHdlIHdpbGwgdHJ5IHRvIGFsaWduIHRoZSBuZXcgYmxvY2tzIGF0IHN0cmlwZSB1bml0IGJvdW5kYXJpZXMuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19ibWFwX2lzYWVvZigKKwl4ZnNfaW5vZGVfdAkqaXAsCQkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLworCXhmc19maWxlb2ZmX3QgICBvZmYsCQkvKiBmaWxlIG9mZnNldCBpbiBmc2Jsb2NrcyAqLworCWludCAgICAgICAgICAgICB3aGljaGZvcmssCS8qIGRhdGEgb3IgYXR0cmlidXRlIGZvcmsgKi8KKwljaGFyCQkqYWVvZikJCS8qIHJldHVybiB2YWx1ZSAqLworeworCWludAkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwl4ZnNfaWZvcmtfdAkqaWZwOwkJLyogaW5vZGUgZm9yayBwb2ludGVyICovCisJeGZzX2JtYnRfcmVjX3QJKmxhc3RyZWM7CS8qIGV4dGVudCBsaXN0IGVudHJ5IHBvaW50ZXIgKi8KKwl4ZnNfZXh0bnVtX3QJbmV4dGVudHM7CS8qIHNpemUgb2YgZXh0ZW50IGxpc3QgKi8KKwl4ZnNfYm1idF9pcmVjX3QJczsJCS8qIGV4cGFuZGVkIGV4dGVudCBsaXN0IGVudHJ5ICovCisKKwlBU1NFUlQod2hpY2hmb3JrID09IFhGU19EQVRBX0ZPUkspOworCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7CisJaWYgKCEoaWZwLT5pZl9mbGFncyAmIFhGU19JRkVYVEVOVFMpICYmCisJICAgIChlcnJvciA9IHhmc19pcmVhZF9leHRlbnRzKE5VTEwsIGlwLCB3aGljaGZvcmspKSkKKwkJcmV0dXJuIGVycm9yOworCW5leHRlbnRzID0gaWZwLT5pZl9ieXRlcyAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCk7CisJaWYgKG5leHRlbnRzID09IDApIHsKKwkJKmFlb2YgPSAxOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBHbyB0byB0aGUgbGFzdCBleHRlbnQKKwkgKi8KKwlsYXN0cmVjID0gJmlmcC0+aWZfdTEuaWZfZXh0ZW50c1tuZXh0ZW50cyAtIDFdOworCXhmc19ibWJ0X2dldF9hbGwobGFzdHJlYywgJnMpOworCS8qCisJICogQ2hlY2sgd2UgYXJlIGFsbG9jYXRpbmcgaW4gdGhlIGxhc3QgZXh0ZW50IChmb3IgZGVsYXllZCBhbGxvY2F0aW9ucykKKwkgKiBvciBwYXN0IHRoZSBsYXN0IGV4dGVudCBmb3Igbm9uLWRlbGF5ZWQgYWxsb2NhdGlvbnMuCisJICovCisJKmFlb2YgPSAob2ZmID49IHMuYnJfc3RhcnRvZmYgJiYKKwkJIG9mZiA8IHMuYnJfc3RhcnRvZmYgKyBzLmJyX2Jsb2NrY291bnQgJiYKKwkJIElTTlVMTFNUQVJUQkxPQ0socy5icl9zdGFydGJsb2NrKSkgfHwKKwkJb2ZmID49IHMuYnJfc3RhcnRvZmYgKyBzLmJyX2Jsb2NrY291bnQ7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDaGVjayBpZiB0aGUgZW5kb2ZmIGlzIG91dHNpZGUgdGhlIGxhc3QgZXh0ZW50LiBJZiBzbyB0aGUgY2FsbGVyIHdpbGwgZ3JvdworICogdGhlIGFsbG9jYXRpb24gdG8gYSBzdHJpcGUgdW5pdCBib3VuZGFyeS4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2JtYXBfZW9mKAorCXhmc19pbm9kZV90CSppcCwJCS8qIGluY29yZSBpbm9kZSBwb2ludGVyICovCisJeGZzX2ZpbGVvZmZfdAllbmRvZmYsCQkvKiBmaWxlIG9mZnNldCBpbiBmc2Jsb2NrcyAqLworCWludAkJd2hpY2hmb3JrLAkvKiBkYXRhIG9yIGF0dHJpYnV0ZSBmb3JrICovCisJaW50CQkqZW9mKQkJLyogcmVzdWx0IHZhbHVlICovCit7CisJeGZzX2ZzYmxvY2tfdAlibG9ja2NvdW50OwkvKiBleHRlbnQgYmxvY2sgY291bnQgKi8KKwlpbnQJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJeGZzX2lmb3JrX3QJKmlmcDsJCS8qIGlub2RlIGZvcmsgcG9pbnRlciAqLworCXhmc19ibWJ0X3JlY190CSpsYXN0cmVjOwkvKiBleHRlbnQgbGlzdCBlbnRyeSBwb2ludGVyICovCisJeGZzX2V4dG51bV90CW5leHRlbnRzOwkvKiBzaXplIG9mIGV4dGVudCBsaXN0ICovCisJeGZzX2ZpbGVvZmZfdAlzdGFydG9mZjsJLyogZXh0ZW50IHN0YXJ0aW5nIGZpbGUgb2Zmc2V0ICovCisKKwlBU1NFUlQod2hpY2hmb3JrID09IFhGU19EQVRBX0ZPUkspOworCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7CisJaWYgKCEoaWZwLT5pZl9mbGFncyAmIFhGU19JRkVYVEVOVFMpICYmCisJICAgIChlcnJvciA9IHhmc19pcmVhZF9leHRlbnRzKE5VTEwsIGlwLCB3aGljaGZvcmspKSkKKwkJcmV0dXJuIGVycm9yOworCW5leHRlbnRzID0gaWZwLT5pZl9ieXRlcyAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCk7CisJaWYgKG5leHRlbnRzID09IDApIHsKKwkJKmVvZiA9IDE7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIEdvIHRvIHRoZSBsYXN0IGV4dGVudAorCSAqLworCWxhc3RyZWMgPSAmaWZwLT5pZl91MS5pZl9leHRlbnRzW25leHRlbnRzIC0gMV07CisJc3RhcnRvZmYgPSB4ZnNfYm1idF9nZXRfc3RhcnRvZmYobGFzdHJlYyk7CisJYmxvY2tjb3VudCA9IHhmc19ibWJ0X2dldF9ibG9ja2NvdW50KGxhc3RyZWMpOworCSplb2YgPSBlbmRvZmYgPj0gc3RhcnRvZmYgKyBibG9ja2NvdW50OworCXJldHVybiAwOworfQorCisjaWZkZWYgREVCVUcKKy8qCisgKiBDaGVjayB0aGF0IHRoZSBleHRlbnRzIGxpc3QgZm9yIHRoZSBpbm9kZSBpcCBpcyBpbiB0aGUgcmlnaHQgb3JkZXIuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYm1hcF9jaGVja19leHRlbnRzKAorCXhmc19pbm9kZV90CQkqaXAsCQkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLworCWludAkJCXdoaWNoZm9yaykJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KK3sKKwl4ZnNfYm1idF9yZWNfdAkJKmJhc2U7CQkvKiBiYXNlIG9mIGV4dGVudHMgbGlzdCAqLworCXhmc19ibWJ0X3JlY190CQkqZXA7CQkvKiBjdXJyZW50IGV4dGVudCBlbnRyeSAqLworCXhmc19pZm9ya190CQkqaWZwOwkJLyogaW5vZGUgZm9yayBwb2ludGVyICovCisJeGZzX2V4dG51bV90CQluZXh0ZW50czsJLyogbnVtYmVyIG9mIGV4dGVudHMgaW4gbGlzdCAqLworCisJaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgd2hpY2hmb3JrKTsKKwlBU1NFUlQoaWZwLT5pZl9mbGFncyAmIFhGU19JRkVYVEVOVFMpOworCWJhc2UgPSBpZnAtPmlmX3UxLmlmX2V4dGVudHM7CisJbmV4dGVudHMgPSBpZnAtPmlmX2J5dGVzIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KTsKKwlmb3IgKGVwID0gYmFzZTsgZXAgPCAmYmFzZVtuZXh0ZW50cyAtIDFdOyBlcCsrKSB7CisJCXhmc19idHJlZV9jaGVja19yZWMoWEZTX0JUTlVNX0JNQVAsICh2b2lkICopZXAsCisJCQkodm9pZCAqKShlcCArIDEpKTsKKwl9Cit9CisKK1NUQVRJQworeGZzX2J1Zl90ICoKK3hmc19ibWFwX2dldF9icCgKKwl4ZnNfYnRyZWVfY3VyX3QgICAgICAgICAqY3VyLAorCXhmc19mc2Jsb2NrX3QJCWJubykKK3sKKwlpbnQgaTsKKwl4ZnNfYnVmX3QgKmJwOworCisJaWYgKCFjdXIpCisJCXJldHVybihOVUxMKTsKKworCWJwID0gTlVMTDsKKwlmb3IoaSA9IDA7IGkgPCBYRlNfQlRSRUVfTUFYTEVWRUxTOyBpKyspIHsKKwkJYnAgPSBjdXItPmJjX2J1ZnNbaV07CisJCWlmICghYnApIGJyZWFrOworCQlpZiAoWEZTX0JVRl9BRERSKGJwKSA9PSBibm8pCisJCQlicmVhazsJLyogRm91bmQgaXQgKi8KKwl9CisJaWYgKGkgPT0gWEZTX0JUUkVFX01BWExFVkVMUykKKwkJYnAgPSBOVUxMOworCisJaWYgKCFicCkgeyAvKiBDaGFzZSBkb3duIGFsbCB0aGUgbG9nIGl0ZW1zIHRvIHNlZSBpZiB0aGUgYnAgaXMgdGhlcmUgKi8KKwkJeGZzX2xvZ19pdGVtX2NodW5rX3QgICAgKmxpY3A7CisJCXhmc190cmFuc190CQkqdHA7CisKKwkJdHAgPSBjdXItPmJjX3RwOworCQlsaWNwID0gJnRwLT50X2l0ZW1zOworCQl3aGlsZSAoIWJwICYmIGxpY3AgIT0gTlVMTCkgeworCQkJaWYgKFhGU19MSUNfQVJFX0FMTF9GUkVFKGxpY3ApKSB7CisJCQkJbGljcCA9IGxpY3AtPmxpY19uZXh0OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZm9yIChpID0gMDsgaSA8IGxpY3AtPmxpY191bnVzZWQ7IGkrKykgeworCQkJCXhmc19sb2dfaXRlbV9kZXNjX3QJKmxpZHA7CisJCQkJeGZzX2xvZ19pdGVtX3QJCSpsaXA7CisJCQkJeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXA7CisJCQkJeGZzX2J1Zl90CQkqbGJwOworCisJCQkJaWYgKFhGU19MSUNfSVNGUkVFKGxpY3AsIGkpKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCWxpZHAgPSBYRlNfTElDX1NMT1QobGljcCwgaSk7CisJCQkJbGlwID0gbGlkcC0+bGlkX2l0ZW07CisJCQkJaWYgKGxpcC0+bGlfdHlwZSAhPSBYRlNfTElfQlVGKQorCQkJCQljb250aW51ZTsKKworCQkJCWJpcCA9ICh4ZnNfYnVmX2xvZ19pdGVtX3QgKilsaXA7CisJCQkJbGJwID0gYmlwLT5ibGlfYnVmOworCisJCQkJaWYgKFhGU19CVUZfQUREUihsYnApID09IGJubykgeworCQkJCQlicCA9IGxicDsKKwkJCQkJYnJlYWs7IC8qIEZvdW5kIGl0ICovCisJCQkJfQorCQkJfQorCQkJbGljcCA9IGxpY3AtPmxpY19uZXh0OworCQl9CisJfQorCXJldHVybihicCk7Cit9CisKK3ZvaWQKK3hmc19jaGVja19ibG9jaygKKwl4ZnNfYm1idF9ibG9ja190ICAgICAgICAqYmxvY2ssCisJeGZzX21vdW50X3QJCSptcCwKKwlpbnQJCQlyb290LAorCXNob3J0CQkJc3opCit7CisJaW50CQkJaSwgaiwgZG14cjsKKwl4ZnNfYm1idF9wdHJfdAkJKnBwLCAqdGhpc3BhOwkvKiBwb2ludGVyIHRvIGJsb2NrIGFkZHJlc3MgKi8KKwl4ZnNfYm1idF9rZXlfdAkJKnByZXZwLCAqa2V5cDsKKworCUFTU0VSVChJTlRfR0VUKGJsb2NrLT5iYl9sZXZlbCwgQVJDSF9DT05WRVJUKSA+IDApOworCisJcHJldnAgPSBOVUxMOworCWZvciggaSA9IDE7IGkgPD0gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTtpKyspIHsKKwkJZG14ciA9IG1wLT5tX2JtYXBfZG14clswXTsKKworCQlpZiAocm9vdCkgeworCQkJa2V5cCA9IFhGU19CTUFQX0JST09UX0tFWV9BRERSKGJsb2NrLCBpLCBzeik7CisJCX0gZWxzZSB7CisJCQlrZXlwID0gWEZTX0JUUkVFX0tFWV9BRERSKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSwKKwkJCQl4ZnNfYm1idCwgYmxvY2ssIGksIGRteHIpOworCQl9CisKKwkJaWYgKHByZXZwKSB7CisJCQl4ZnNfYnRyZWVfY2hlY2tfa2V5KFhGU19CVE5VTV9CTUFQLCBwcmV2cCwga2V5cCk7CisJCX0KKwkJcHJldnAgPSBrZXlwOworCisJCS8qCisJCSAqIENvbXBhcmUgdGhlIGJsb2NrIG51bWJlcnMgdG8gc2VlIGlmIHRoZXJlIGFyZSBkdXBzLgorCQkgKi8KKworCQlpZiAocm9vdCkgeworCQkJcHAgPSBYRlNfQk1BUF9CUk9PVF9QVFJfQUREUihibG9jaywgaSwgc3opOworCQl9IGVsc2UgeworCQkJcHAgPSBYRlNfQlRSRUVfUFRSX0FERFIobXAtPm1fc2Iuc2JfYmxvY2tzaXplLAorCQkJCXhmc19ibWJ0LCBibG9jaywgaSwgZG14cik7CisJCX0KKwkJZm9yIChqID0gaSsxOyBqIDw9IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7IGorKykgeworCQkJaWYgKHJvb3QpIHsKKwkJCQl0aGlzcGEgPSBYRlNfQk1BUF9CUk9PVF9QVFJfQUREUihibG9jaywgaiwgc3opOworCQkJfSBlbHNlIHsKKwkJCQl0aGlzcGEgPSBYRlNfQlRSRUVfUFRSX0FERFIobXAtPm1fc2Iuc2JfYmxvY2tzaXplLAorCQkJCQl4ZnNfYm1idCwgYmxvY2ssIGosIGRteHIpOworCQkJfQorCQkJaWYgKElOVF9HRVQoKnRoaXNwYSwgQVJDSF9DT05WRVJUKSA9PQorCQkJICAgIElOVF9HRVQoKnBwLCBBUkNIX0NPTlZFUlQpKSB7CisJCQkJY21uX2VycihDRV9XQVJOLCAiJXM6IHRoaXNwYSglZCkgPT0gcHAoJWQpICVMZCIsCisJCQkJCV9fRlVOQ1RJT05fXywgaiwgaSwKKwkJCQkJSU5UX0dFVCgqdGhpc3BhLCBBUkNIX0NPTlZFUlQpKTsKKwkJCQlwYW5pYygiJXM6IHB0cnMgYXJlIGVxdWFsIGluIG5vZGVcbiIsCisJCQkJCV9fRlVOQ1RJT05fXyk7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qCisgKiBDaGVjayB0aGF0IHRoZSBleHRlbnRzIGZvciB0aGUgaW5vZGUgaXAgYXJlIGluIHRoZSByaWdodCBvcmRlciBpbiBhbGwKKyAqIGJ0cmVlIGxlYXZlcy4KKyAqLworCitTVEFUSUMgdm9pZAoreGZzX2JtYXBfY2hlY2tfbGVhZl9leHRlbnRzKAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yIG9yIG51bGwgKi8KKwl4ZnNfaW5vZGVfdAkJKmlwLAkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwlpbnQJCQl3aGljaGZvcmspCS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCit7CisJeGZzX2JtYnRfYmxvY2tfdAkqYmxvY2s7CS8qIGN1cnJlbnQgYnRyZWUgYmxvY2sgKi8KKwl4ZnNfZnNibG9ja190CQlibm87CS8qIGJsb2NrICMgb2YgImJsb2NrIiAqLworCXhmc19idWZfdAkJKmJwOwkvKiBidWZmZXIgZm9yICJibG9jayIgKi8KKwlpbnQJCQllcnJvcjsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJeGZzX2V4dG51bV90CQlpPTA7CS8qIGluZGV4IGludG8gdGhlIGV4dGVudHMgbGlzdCAqLworCXhmc19pZm9ya190CQkqaWZwOwkvKiBmb3JrIHN0cnVjdHVyZSAqLworCWludAkJCWxldmVsOwkvKiBidHJlZSBsZXZlbCwgZm9yIGNoZWNraW5nICovCisJeGZzX21vdW50X3QJCSptcDsJLyogZmlsZSBzeXN0ZW0gbW91bnQgc3RydWN0dXJlICovCisJeGZzX2JtYnRfcHRyX3QJCSpwcDsJLyogcG9pbnRlciB0byBibG9jayBhZGRyZXNzICovCisJeGZzX2JtYnRfcmVjX3QJCSplcCwgKmxhc3RwOwkvKiBleHRlbnQgcG9pbnRlcnMgaW4gYmxvY2sgZW50cnkgKi8KKwlpbnQJCQlicF9yZWxlYXNlID0gMDsKKworCWlmIChYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspICE9IFhGU19ESU5PREVfRk1UX0JUUkVFKSB7CisJCXJldHVybjsKKwl9CisKKwlibm8gPSBOVUxMRlNCTE9DSzsKKwltcCA9IGlwLT5pX21vdW50OworCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7CisJYmxvY2sgPSBpZnAtPmlmX2Jyb290OworCS8qCisJICogUm9vdCBsZXZlbCBtdXN0IHVzZSBCTUFQX0JST09UX1BUUl9BRERSIG1hY3JvIHRvIGdldCBwdHIgb3V0LgorCSAqLworCUFTU0VSVChJTlRfR0VUKGJsb2NrLT5iYl9sZXZlbCwgQVJDSF9DT05WRVJUKSA+IDApOworCWxldmVsID0gSU5UX0dFVChibG9jay0+YmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCk7CisJeGZzX2NoZWNrX2Jsb2NrKGJsb2NrLCBtcCwgMSwgaWZwLT5pZl9icm9vdF9ieXRlcyk7CisJcHAgPSBYRlNfQk1BUF9CUk9PVF9QVFJfQUREUihibG9jaywgMSwgaWZwLT5pZl9icm9vdF9ieXRlcyk7CisJQVNTRVJUKElOVF9HRVQoKnBwLCBBUkNIX0NPTlZFUlQpICE9IE5VTExERlNCTk8pOworCUFTU0VSVChYRlNfRlNCX1RPX0FHTk8obXAsIElOVF9HRVQoKnBwLCBBUkNIX0NPTlZFUlQpKSA8IG1wLT5tX3NiLnNiX2FnY291bnQpOworCUFTU0VSVChYRlNfRlNCX1RPX0FHQk5PKG1wLCBJTlRfR0VUKCpwcCwgQVJDSF9DT05WRVJUKSkgPCBtcC0+bV9zYi5zYl9hZ2Jsb2Nrcyk7CisJYm5vID0gSU5UX0dFVCgqcHAsIEFSQ0hfQ09OVkVSVCk7CisJLyoKKwkgKiBHbyBkb3duIHRoZSB0cmVlIHVudGlsIGxlYWYgbGV2ZWwgaXMgcmVhY2hlZCwgZm9sbG93aW5nIHRoZSBmaXJzdAorCSAqIHBvaW50ZXIgKGxlZnRtb3N0KSBhdCBlYWNoIGxldmVsLgorCSAqLworCXdoaWxlIChsZXZlbC0tID4gMCkgeworCQkvKiBTZWUgaWYgYnVmIGlzIGluIGN1ciBmaXJzdCAqLworCQlicCA9IHhmc19ibWFwX2dldF9icChjdXIsIFhGU19GU0JfVE9fREFERFIobXAsIGJubykpOworCQlpZiAoYnApIHsKKwkJCWJwX3JlbGVhc2UgPSAwOworCQl9IGVsc2UgeworCQkJYnBfcmVsZWFzZSA9IDE7CisJCX0KKwkJaWYgKCFicCAmJiAoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZsKG1wLCBOVUxMLCBibm8sIDAsICZicCwKKwkJCQlYRlNfQk1BUF9CVFJFRV9SRUYpKSkKKwkJCWdvdG8gZXJyb3Jfbm9yZWxzZTsKKwkJYmxvY2sgPSBYRlNfQlVGX1RPX0JNQlRfQkxPQ0soYnApOworCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTygKKwkJCVhGU19CTUFQX1NBTklUWV9DSEVDSyhtcCwgYmxvY2ssIGxldmVsKSwKKwkJCWVycm9yMCk7CisJCWlmIChsZXZlbCA9PSAwKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogQ2hlY2sgdGhpcyBibG9jayBmb3IgYmFzaWMgc2FuaXR5IChpbmNyZWFzaW5nIGtleXMgYW5kCisJCSAqIG5vIGR1cGxpY2F0ZSBibG9ja3MpLgorCQkgKi8KKworCQl4ZnNfY2hlY2tfYmxvY2soYmxvY2ssIG1wLCAwLCAwKTsKKwkJcHAgPSBYRlNfQlRSRUVfUFRSX0FERFIobXAtPm1fc2Iuc2JfYmxvY2tzaXplLCB4ZnNfYm1idCwgYmxvY2ssCisJCQkxLCBtcC0+bV9ibWFwX2RteHJbMV0pOworCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhYRlNfRlNCX1NBTklUWV9DSEVDSyhtcCwgSU5UX0dFVCgqcHAsIEFSQ0hfQ09OVkVSVCkpLCBlcnJvcjApOworCQlibm8gPSBJTlRfR0VUKCpwcCwgQVJDSF9DT05WRVJUKTsKKwkJaWYgKGJwX3JlbGVhc2UpIHsKKwkJCWJwX3JlbGVhc2UgPSAwOworCQkJeGZzX3RyYW5zX2JyZWxzZShOVUxMLCBicCk7CisJCX0KKwl9CisKKwkvKgorCSAqIEhlcmUgd2l0aCBicCBhbmQgYmxvY2sgc2V0IHRvIHRoZSBsZWZ0bW9zdCBsZWFmIG5vZGUgaW4gdGhlIHRyZWUuCisJICovCisJaSA9IDA7CisKKwkvKgorCSAqIExvb3Agb3ZlciBhbGwgbGVhZiBub2RlcyBjaGVja2luZyB0aGF0IGFsbCBleHRlbnRzIGFyZSBpbiB0aGUgcmlnaHQgb3JkZXIuCisJICovCisJbGFzdHAgPSBOVUxMOworCWZvciAoOzspIHsKKwkJeGZzX2JtYnRfcmVjX3QJKmZycDsKKwkJeGZzX2ZzYmxvY2tfdAluZXh0Ym5vOworCQl4ZnNfZXh0bnVtX3QJbnVtX3JlY3M7CisKKworCQludW1fcmVjcyA9IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7CisKKwkJLyoKKwkJICogUmVhZC1haGVhZCB0aGUgbmV4dCBsZWFmIGJsb2NrLCBpZiBhbnkuCisJCSAqLworCisJCW5leHRibm8gPSBJTlRfR0VUKGJsb2NrLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKTsKKworCQkvKgorCQkgKiBDaGVjayBhbGwgdGhlIGV4dGVudHMgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIE9LLgorCQkgKiBJZiB3ZSBoYWQgYSBwcmV2aW91cyBibG9jaywgdGhlIGxhc3QgZW50cnkgc2hvdWxkCisJCSAqIGNvbmZvcm0gd2l0aCB0aGUgZmlyc3QgZW50cnkgaW4gdGhpcyBvbmUuCisJCSAqLworCisJCWZycCA9IFhGU19CVFJFRV9SRUNfQUREUihtcC0+bV9zYi5zYl9ibG9ja3NpemUsIHhmc19ibWJ0LAorCQkJYmxvY2ssIDEsIG1wLT5tX2JtYXBfZG14clswXSk7CisKKwkJZm9yIChlcCA9IGZycDtlcCA8IGZycCArIChudW1fcmVjcyAtIDEpOyBlcCsrKSB7CisJCQlpZiAobGFzdHApIHsKKwkJCQl4ZnNfYnRyZWVfY2hlY2tfcmVjKFhGU19CVE5VTV9CTUFQLAorCQkJCQkodm9pZCAqKWxhc3RwLCAodm9pZCAqKWVwKTsKKwkJCX0KKwkJCXhmc19idHJlZV9jaGVja19yZWMoWEZTX0JUTlVNX0JNQVAsICh2b2lkICopZXAsCisJCQkJKHZvaWQgKikoZXAgKyAxKSk7CisJCX0KKwkJbGFzdHAgPSBmcnAgKyBudW1fcmVjcyAtIDE7IC8qIEZvciB0aGUgbmV4dCBpdGVyYXRpb24gKi8KKworCQlpICs9IG51bV9yZWNzOworCQlpZiAoYnBfcmVsZWFzZSkgeworCQkJYnBfcmVsZWFzZSA9IDA7CisJCQl4ZnNfdHJhbnNfYnJlbHNlKE5VTEwsIGJwKTsKKwkJfQorCQlibm8gPSBuZXh0Ym5vOworCQkvKgorCQkgKiBJZiB3ZSd2ZSByZWFjaGVkIHRoZSBlbmQsIHN0b3AuCisJCSAqLworCQlpZiAoYm5vID09IE5VTExGU0JMT0NLKQorCQkJYnJlYWs7CisKKwkJYnAgPSB4ZnNfYm1hcF9nZXRfYnAoY3VyLCBYRlNfRlNCX1RPX0RBRERSKG1wLCBibm8pKTsKKwkJaWYgKGJwKSB7CisJCQlicF9yZWxlYXNlID0gMDsKKwkJfSBlbHNlIHsKKwkJCWJwX3JlbGVhc2UgPSAxOworCQl9CisJCWlmICghYnAgJiYgKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmbChtcCwgTlVMTCwgYm5vLCAwLCAmYnAsCisJCQkJWEZTX0JNQVBfQlRSRUVfUkVGKSkpCisJCQlnb3RvIGVycm9yX25vcmVsc2U7CisJCWJsb2NrID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKGJwKTsKKwl9CisJaWYgKGJwX3JlbGVhc2UpIHsKKwkJYnBfcmVsZWFzZSA9IDA7CisJCXhmc190cmFuc19icmVsc2UoTlVMTCwgYnApOworCX0KKwlyZXR1cm47CisKK2Vycm9yMDoKKwljbW5fZXJyKENFX1dBUk4sICIlczogYXQgZXJyb3IwIiwgX19GVU5DVElPTl9fKTsKKwlpZiAoYnBfcmVsZWFzZSkKKwkJeGZzX3RyYW5zX2JyZWxzZShOVUxMLCBicCk7CitlcnJvcl9ub3JlbHNlOgorCWNtbl9lcnIoQ0VfV0FSTiwgIiVzOiBCQUQgYWZ0ZXIgYnRyZWUgbGVhdmVzIGZvciAlZCBleHRlbnRzIiwKKwkJaSwgX19GVU5DVElPTl9fKTsKKwlwYW5pYygiJXM6IENPUlJVUFRFRCBCVFJFRSBPUiBTT01FVEhJTkciLCBfX0ZVTkNUSU9OX18pOworCXJldHVybjsKK30KKyNlbmRpZgorCisvKgorICogQ291bnQgZnNibG9ja3Mgb2YgdGhlIGdpdmVuIGZvcmsuCisgKi8KK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfYm1hcF9jb3VudF9ibG9ja3MoCisJeGZzX3RyYW5zX3QJCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfaW5vZGVfdAkJKmlwLAkJLyogaW5jb3JlIGlub2RlICovCisJaW50CQkJd2hpY2hmb3JrLAkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworCWludAkJCSpjb3VudCkJCS8qIG91dDogY291bnQgb2YgYmxvY2tzICovCit7CisJeGZzX2JtYnRfYmxvY2tfdAkqYmxvY2s7CS8qIGN1cnJlbnQgYnRyZWUgYmxvY2sgKi8KKwl4ZnNfZnNibG9ja190CQlibm87CS8qIGJsb2NrICMgb2YgImJsb2NrIiAqLworCXhmc19pZm9ya190CQkqaWZwOwkvKiBmb3JrIHN0cnVjdHVyZSAqLworCWludAkJCWxldmVsOwkvKiBidHJlZSBsZXZlbCwgZm9yIGNoZWNraW5nICovCisJeGZzX21vdW50X3QJCSptcDsJLyogZmlsZSBzeXN0ZW0gbW91bnQgc3RydWN0dXJlICovCisJeGZzX2JtYnRfcHRyX3QJCSpwcDsJLyogcG9pbnRlciB0byBibG9jayBhZGRyZXNzICovCisKKwlibm8gPSBOVUxMRlNCTE9DSzsKKwltcCA9IGlwLT5pX21vdW50OworCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7CisJaWYgKCBYRlNfSUZPUktfRk9STUFUKGlwLCB3aGljaGZvcmspID09IFhGU19ESU5PREVfRk1UX0VYVEVOVFMgKSB7CisJCWlmICh1bmxpa2VseSh4ZnNfYm1hcF9jb3VudF9sZWF2ZXMoaWZwLT5pZl91MS5pZl9leHRlbnRzLAorCQkJaWZwLT5pZl9ieXRlcyAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCksCisJCQljb3VudCkgPCAwKSkgeworCQkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX2JtYXBfY291bnRfYmxvY2tzKDEpIiwKKwkJCQkJIFhGU19FUlJMRVZFTF9MT1csIG1wKTsKKwkJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFJvb3QgbGV2ZWwgbXVzdCB1c2UgQk1BUF9CUk9PVF9QVFJfQUREUiBtYWNybyB0byBnZXQgcHRyIG91dC4KKwkgKi8KKwlibG9jayA9IGlmcC0+aWZfYnJvb3Q7CisJQVNTRVJUKElOVF9HRVQoYmxvY2stPmJiX2xldmVsLCBBUkNIX0NPTlZFUlQpID4gMCk7CisJbGV2ZWwgPSBJTlRfR0VUKGJsb2NrLT5iYl9sZXZlbCwgQVJDSF9DT05WRVJUKTsKKwlwcCA9IFhGU19CTUFQX0JST09UX1BUUl9BRERSKGJsb2NrLCAxLCBpZnAtPmlmX2Jyb290X2J5dGVzKTsKKwlBU1NFUlQoSU5UX0dFVCgqcHAsIEFSQ0hfQ09OVkVSVCkgIT0gTlVMTERGU0JOTyk7CisJQVNTRVJUKFhGU19GU0JfVE9fQUdOTyhtcCwgSU5UX0dFVCgqcHAsIEFSQ0hfQ09OVkVSVCkpIDwgbXAtPm1fc2Iuc2JfYWdjb3VudCk7CisJQVNTRVJUKFhGU19GU0JfVE9fQUdCTk8obXAsIElOVF9HRVQoKnBwLCBBUkNIX0NPTlZFUlQpKSA8IG1wLT5tX3NiLnNiX2FnYmxvY2tzKTsKKwlibm8gPSBJTlRfR0VUKCpwcCwgQVJDSF9DT05WRVJUKTsKKworCWlmICh1bmxpa2VseSh4ZnNfYm1hcF9jb3VudF90cmVlKG1wLCB0cCwgYm5vLCBsZXZlbCwgY291bnQpIDwgMCkpIHsKKwkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX2JtYXBfY291bnRfYmxvY2tzKDIpIiwgWEZTX0VSUkxFVkVMX0xPVywKKwkJCQkgbXApOworCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWN1cnNpdmVseSB3YWxrcyBlYWNoIGxldmVsIG9mIGEgYnRyZWUKKyAqIHRvIGNvdW50IHRvdGFsIGZzYmxvY2tzIGlzIHVzZS4KKyAqLworaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVycm9yICovCit4ZnNfYm1hcF9jb3VudF90cmVlKAorCXhmc19tb3VudF90ICAgICAqbXAsICAgICAgICAgICAgLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl4ZnNfdHJhbnNfdCAgICAgKnRwLCAgICAgICAgICAgIC8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfZnNibG9ja190ICAgYmxvY2tubywJLyogZmlsZSBzeXN0ZW0gYmxvY2sgbnVtYmVyICovCisJaW50ICAgICAgICAgICAgIGxldmVsaW4sCS8qIGxldmVsIGluIGJ0cmVlICovCisJaW50CQkqY291bnQpCQkvKiBDb3VudCBvZiBibG9ja3MgKi8KK3sKKwlpbnQJCQllcnJvcjsKKwl4ZnNfYnVmX3QJCSpicCwgKm5icDsKKwlpbnQJCQlsZXZlbCA9IGxldmVsaW47CisJeGZzX2JtYnRfcHRyX3QgICAgICAgICAgKnBwOworCXhmc19mc2Jsb2NrX3QgICAgICAgICAgIGJubyA9IGJsb2Nrbm87CisJeGZzX2ZzYmxvY2tfdAkJbmV4dGJubzsKKwl4ZnNfYm1idF9ibG9ja190ICAgICAgICAqYmxvY2ssICpuZXh0YmxvY2s7CisJaW50CQkJbnVtcmVjczsKKwl4ZnNfYm1idF9yZWNfdAkJKmZycDsKKworCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZsKG1wLCB0cCwgYm5vLCAwLCAmYnAsIFhGU19CTUFQX0JUUkVFX1JFRikpKQorCQlyZXR1cm4gZXJyb3I7CisJKmNvdW50ICs9IDE7CisJYmxvY2sgPSBYRlNfQlVGX1RPX0JNQlRfQkxPQ0soYnApOworCisJaWYgKC0tbGV2ZWwpIHsKKwkJLyogTm90IGF0IG5vZGUgYWJvdmUgbGVhZnMsIGNvdW50IHRoaXMgbGV2ZWwgb2Ygbm9kZXMgKi8KKwkJbmV4dGJubyA9IElOVF9HRVQoYmxvY2stPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpOworCQl3aGlsZSAobmV4dGJubyAhPSBOVUxMRlNCTE9DSykgeworCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZmwobXAsIHRwLCBuZXh0Ym5vLAorCQkJCTAsICZuYnAsIFhGU19CTUFQX0JUUkVFX1JFRikpKQorCQkJCXJldHVybiBlcnJvcjsKKwkJCSpjb3VudCArPSAxOworCQkJbmV4dGJsb2NrID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKG5icCk7CisJCQluZXh0Ym5vID0gSU5UX0dFVChuZXh0YmxvY2stPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpOworCQkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgbmJwKTsKKwkJfQorCisJCS8qIERpdmUgdG8gdGhlIG5leHQgbGV2ZWwgKi8KKwkJcHAgPSBYRlNfQlRSRUVfUFRSX0FERFIobXAtPm1fc2Iuc2JfYmxvY2tzaXplLAorCQkJeGZzX2JtYnQsIGJsb2NrLCAxLCBtcC0+bV9ibWFwX2RteHJbMV0pOworCQlibm8gPSBJTlRfR0VUKCpwcCwgQVJDSF9DT05WRVJUKTsKKwkJaWYgKHVubGlrZWx5KChlcnJvciA9CisJCSAgICAgeGZzX2JtYXBfY291bnRfdHJlZShtcCwgdHAsIGJubywgbGV2ZWwsIGNvdW50KSkgPCAwKSkgeworCQkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOworCQkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX2JtYXBfY291bnRfdHJlZSgxKSIsCisJCQkJCSBYRlNfRVJSTEVWRUxfTE9XLCBtcCk7CisJCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJCX0KKwkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOworCX0gZWxzZSB7CisJCS8qIGNvdW50IGFsbCBsZXZlbCAxIG5vZGVzIGFuZCB0aGVpciBsZWF2ZXMgKi8KKwkJZm9yICg7OykgeworCQkJbmV4dGJubyA9IElOVF9HRVQoYmxvY2stPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpOworCQkJbnVtcmVjcyA9IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7CisJCQlmcnAgPSBYRlNfQlRSRUVfUkVDX0FERFIobXAtPm1fc2Iuc2JfYmxvY2tzaXplLAorCQkJCXhmc19ibWJ0LCBibG9jaywgMSwgbXAtPm1fYm1hcF9kbXhyWzBdKTsKKwkJCWlmICh1bmxpa2VseSh4ZnNfYm1hcF9jb3VudF9sZWF2ZXMoZnJwLCBudW1yZWNzLCBjb3VudCkgPCAwKSkgeworCQkJCXhmc190cmFuc19icmVsc2UodHAsIGJwKTsKKwkJCQlYRlNfRVJST1JfUkVQT1JUKCJ4ZnNfYm1hcF9jb3VudF90cmVlKDIpIiwKKwkJCQkJCSBYRlNfRVJSTEVWRUxfTE9XLCBtcCk7CisJCQkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCQkJfQorCQkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOworCQkJaWYgKG5leHRibm8gPT0gTlVMTEZTQkxPQ0spCisJCQkJYnJlYWs7CisJCQlibm8gPSBuZXh0Ym5vOworCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZmwobXAsIHRwLCBibm8sIDAsICZicCwKKwkJCQlYRlNfQk1BUF9CVFJFRV9SRUYpKSkKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQkqY291bnQgKz0gMTsKKwkJCWJsb2NrID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKGJwKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENvdW50IGxlYWYgYmxvY2tzIGdpdmVuIGEgcG9pbnRlciB0byBhbiBleHRlbnQgbGlzdC4KKyAqLworaW50Cit4ZnNfYm1hcF9jb3VudF9sZWF2ZXMoCisJeGZzX2JtYnRfcmVjX3QJCSpmcnAsCisJaW50CQkJbnVtcmVjcywKKwlpbnQJCQkqY291bnQpCit7CisJaW50CQliOworCisJZm9yICggYiA9IDE7IGIgPD0gbnVtcmVjczsgYisrLCBmcnArKykKKwkJKmNvdW50ICs9IHhmc19ibWJ0X2Rpc2tfZ2V0X2Jsb2NrY291bnQoZnJwKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYm1hcC5oIGIvZnMveGZzL3hmc19ibWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFiYzIyZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfYm1hcC5oCkBAIC0wLDAgKzEsMzc5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19CTUFQX0hfXworI2RlZmluZQlfX1hGU19CTUFQX0hfXworCitzdHJ1Y3QgZ2V0Ym1hcDsKK3N0cnVjdCB4ZnNfYm1idF9pcmVjOworc3RydWN0IHhmc19pbm9kZTsKK3N0cnVjdCB4ZnNfbW91bnQ7CitzdHJ1Y3QgeGZzX3RyYW5zOworCisvKgorICogTGlzdCBvZiBleHRlbnRzIHRvIGJlIGZyZWUgImxhdGVyIi4KKyAqIFRoZSBsaXN0IGlzIGtlcHQgc29ydGVkIG9uIHhiZl9zdGFydGJsb2NrLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfYm1hcF9mcmVlX2l0ZW0KK3sKKwl4ZnNfZnNibG9ja190CQl4YmZpX3N0YXJ0YmxvY2s7Lyogc3RhcnRpbmcgZnMgYmxvY2sgbnVtYmVyICovCisJeGZzX2V4dGxlbl90CQl4YmZpX2Jsb2NrY291bnQ7LyogbnVtYmVyIG9mIGJsb2NrcyBpbiBleHRlbnQgKi8KKwlzdHJ1Y3QgeGZzX2JtYXBfZnJlZV9pdGVtICp4YmZpX25leHQ7CS8qIGxpbmsgdG8gbmV4dCBlbnRyeSAqLworfSB4ZnNfYm1hcF9mcmVlX2l0ZW1fdDsKKworLyoKKyAqIEhlYWRlciBmb3IgZnJlZSBleHRlbnQgbGlzdC4KKyAqLwordHlwZWRlZglzdHJ1Y3QgeGZzX2JtYXBfZnJlZQoreworCXhmc19ibWFwX2ZyZWVfaXRlbV90CSp4YmZfZmlyc3Q7CS8qIGxpc3Qgb2YgdG8tYmUtZnJlZSBleHRlbnRzICovCisJaW50CQkJeGJmX2NvdW50OwkvKiBjb3VudCBvZiBpdGVtcyBvbiBsaXN0ICovCisJaW50CQkJeGJmX2xvdzsJLyoga2x1ZGdlOiBhbGxvYyBpbiBsb3cgbW9kZSAqLworfSB4ZnNfYm1hcF9mcmVlX3Q7CisKKyNkZWZpbmUJWEZTX0JNQVBfTUFYX05NQVAJNAorCisvKgorICogRmxhZ3MgZm9yIHhmc19ibWFwaQorICovCisjZGVmaW5lCVhGU19CTUFQSV9XUklURQkJMHgwMDEJLyogd3JpdGUgb3BlcmF0aW9uOiBhbGxvY2F0ZSBzcGFjZSAqLworI2RlZmluZSBYRlNfQk1BUElfREVMQVkJCTB4MDAyCS8qIGRlbGF5ZWQgd3JpdGUgb3BlcmF0aW9uICovCisjZGVmaW5lIFhGU19CTUFQSV9FTlRJUkUJMHgwMDQJLyogcmV0dXJuIGVudGlyZSBleHRlbnQsIG5vdCB0cmltbWVkICovCisjZGVmaW5lIFhGU19CTUFQSV9NRVRBREFUQQkweDAwOAkvKiBtYXBwaW5nIG1ldGFkYXRhIG5vdCB1c2VyIGRhdGEgKi8KKyNkZWZpbmUgWEZTX0JNQVBJX0VYQUNUCQkweDAxMAkvKiBhbGxvY2F0ZSBvbmx5IHRvIHNwZWMnZCBib3VuZHMgKi8KKyNkZWZpbmUgWEZTX0JNQVBJX0FUVFJGT1JLCTB4MDIwCS8qIHVzZSBhdHRyaWJ1dGUgZm9yayBub3QgZGF0YSAqLworI2RlZmluZSBYRlNfQk1BUElfQVNZTkMJCTB4MDQwCS8qIGJ1bm1hcGkgeGFjdGlvbnMgY2FuIGJlIGFzeW5jICovCisjZGVmaW5lIFhGU19CTUFQSV9SU1ZCTE9DS1MJMHgwODAJLyogT0sgdG8gYWxsb2MuIHJlc2VydmVkIGRhdGEgYmxvY2tzICovCisjZGVmaW5lCVhGU19CTUFQSV9QUkVBTExPQwkweDEwMAkvKiBwcmVhbGxvY2F0aW9uIG9wOiB1bndyaXR0ZW4gc3BhY2UgKi8KKyNkZWZpbmUJWEZTX0JNQVBJX0lHU1RBVEUJMHgyMDAJLyogSWdub3JlIHN0YXRlIC0gKi8KKwkJCQkJLyogY29tYmluZSBjb250aWcuIHNwYWNlICovCisjZGVmaW5lCVhGU19CTUFQSV9DT05USUcJMHg0MDAJLyogbXVzdCBhbGxvY2F0ZSBvbmx5IG9uZSBleHRlbnQgKi8KKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQk1BUElfQUZMQUcpCitpbnQgeGZzX2JtYXBpX2FmbGFnKGludCB3KTsKKyNkZWZpbmUJWEZTX0JNQVBJX0FGTEFHKHcpCXhmc19ibWFwaV9hZmxhZyh3KQorI2Vsc2UKKyNkZWZpbmUJWEZTX0JNQVBJX0FGTEFHKHcpCSgodykgPT0gWEZTX0FUVFJfRk9SSyA/IFhGU19CTUFQSV9BVFRSRk9SSyA6IDApCisjZW5kaWYKKworLyoKKyAqIFNwZWNpYWwgdmFsdWVzIGZvciB4ZnNfYm1idF9pcmVjX3QgYnJfc3RhcnRibG9jayBmaWVsZC4KKyAqLworI2RlZmluZQlERUxBWVNUQVJUQkxPQ0sJCSgoeGZzX2ZzYmxvY2tfdCktMUxMKQorI2RlZmluZQlIT0xFU1RBUlRCTE9DSwkJKCh4ZnNfZnNibG9ja190KS0yTEwpCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JNQVBfSU5JVCkKK3ZvaWQgeGZzX2JtYXBfaW5pdCh4ZnNfYm1hcF9mcmVlX3QgKmZscCwgeGZzX2ZzYmxvY2tfdCAqZmJwKTsKKyNkZWZpbmUJWEZTX0JNQVBfSU5JVChmbHAsZmJwKQl4ZnNfYm1hcF9pbml0KGZscCxmYnApCisjZWxzZQorI2RlZmluZQlYRlNfQk1BUF9JTklUKGZscCxmYnApCVwKKwkoKGZscCktPnhiZl9maXJzdCA9IE5VTEwsIChmbHApLT54YmZfY291bnQgPSAwLCBcCisJIChmbHApLT54YmZfbG93ID0gMCwgKihmYnApID0gTlVMTEZTQkxPQ0spCisjZW5kaWYKKworLyoKKyAqIEFyZ3VtZW50IHN0cnVjdHVyZSBmb3IgeGZzX2JtYXBfYWxsb2MuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19ibWFsbG9jYSB7CisJeGZzX2ZzYmxvY2tfdAkJZmlyc3RibG9jazsgLyogaS9vIGZpcnN0IGJsb2NrIGFsbG9jYXRlZCAqLworCXhmc19mc2Jsb2NrX3QJCXJ2YWw7CS8qIHN0YXJ0aW5nIGJsb2NrIG9mIG5ldyBleHRlbnQgKi8KKwl4ZnNfZmlsZW9mZl90CQlvZmY7CS8qIG9mZnNldCBpbiBmaWxlIGZpbGxpbmcgaW4gKi8KKwlzdHJ1Y3QgeGZzX3RyYW5zCSp0cDsJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXN0cnVjdCB4ZnNfaW5vZGUJKmlwOwkvKiBpbmNvcmUgaW5vZGUgcG9pbnRlciAqLworCXN0cnVjdCB4ZnNfYm1idF9pcmVjCSpwcmV2cDsJLyogZXh0ZW50IGJlZm9yZSB0aGUgbmV3IG9uZSAqLworCXN0cnVjdCB4ZnNfYm1idF9pcmVjCSpnb3RwOwkvKiBleHRlbnQgYWZ0ZXIsIG9yIGRlbGF5ZWQgKi8KKwl4ZnNfZXh0bGVuX3QJCWFsZW47CS8qIGkvbyBsZW5ndGggYXNrZWQvYWxsb2NhdGVkICovCisJeGZzX2V4dGxlbl90CQl0b3RhbDsJLyogdG90YWwgYmxvY2tzIG5lZWRlZCBmb3IgeGFjdGlvbiAqLworCXhmc19leHRsZW5fdAkJbWlubGVuOwkvKiBtaW5pbnVtIGFsbG9jYXRpb24gc2l6ZSAoYmxvY2tzKSAqLworCXhmc19leHRsZW5fdAkJbWlubGVmdDsgLyogYW1vdW50IG11c3QgYmUgbGVmdCBhZnRlciBhbGxvYyAqLworCWNoYXIJCQllb2Y7CS8qIHNldCBpZiBhbGxvY2F0aW5nIHBhc3QgbGFzdCBleHRlbnQgKi8KKwljaGFyCQkJd2FzZGVsOwkvKiByZXBsYWNpbmcgYSBkZWxheWVkIGFsbG9jYXRpb24gKi8KKwljaGFyCQkJdXNlcmRhdGE7Lyogc2V0IGlmIGlzIHVzZXIgZGF0YSAqLworCWNoYXIJCQlsb3c7CS8qIGxvdyBvbiBzcGFjZSwgdXNpbmcgc2VxJ2wgYWdzICovCisJY2hhcgkJCWFlb2Y7ICAgLyogYWxsb2NhdGVkIHNwYWNlIGF0IGVvZiAqLworfSB4ZnNfYm1hbGxvY2FfdDsKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2lmIGRlZmluZWQoWEZTX0JNQVBfVFJBQ0UpCisvKgorICogVHJhY2Ugb3BlcmF0aW9ucyBmb3IgYm1hcCBleHRlbnQgdHJhY2luZworICovCisjZGVmaW5lCVhGU19CTUFQX0tUUkFDRV9ERUxFVEUJMQorI2RlZmluZQlYRlNfQk1BUF9LVFJBQ0VfSU5TRVJUCTIKKyNkZWZpbmUJWEZTX0JNQVBfS1RSQUNFX1BSRV9VUAkzCisjZGVmaW5lCVhGU19CTUFQX0tUUkFDRV9QT1NUX1VQCTQKKworI2RlZmluZQlYRlNfQk1BUF9UUkFDRV9TSVpFCTQwOTYJLyogc2l6ZSBvZiBnbG9iYWwgdHJhY2UgYnVmZmVyICovCisjZGVmaW5lCVhGU19CTUFQX0tUUkFDRV9TSVpFCTMyCS8qIHNpemUgb2YgcGVyLWlub2RlIHRyYWNlIGJ1ZmZlciAqLworZXh0ZXJuIGt0cmFjZV90CSp4ZnNfYm1hcF90cmFjZV9idWY7CisKKy8qCisgKiBBZGQgYm1hcCB0cmFjZSBpbnNlcnQgZW50cmllcyBmb3IgYWxsIHRoZSBjb250ZW50cyBvZiB0aGUgZXh0ZW50IGxpc3QuCisgKi8KK3ZvaWQKK3hmc19ibWFwX3RyYWNlX2V4bGlzdCgKKwljaGFyCQkJKmZuYW1lLAkJLyogZnVuY3Rpb24gbmFtZSAqLworCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfZXh0bnVtX3QJCWNudCwJCS8qIGNvdW50IG9mIGVudHJpZXMgaW4gbGlzdCAqLworCWludAkJCXdoaWNoZm9yayk7CS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCisjZWxzZQorI2RlZmluZQl4ZnNfYm1hcF90cmFjZV9leGxpc3QoZixpcCxjLHcpCisjZW5kaWYKKworLyoKKyAqIENvbnZlcnQgaW5vZGUgZnJvbSBub24tYXR0cmlidXRlZCB0byBhdHRyaWJ1dGVkLgorICogTXVzdCBub3QgYmUgaW4gYSB0cmFuc2FjdGlvbiwgaXAgbXVzdCBub3QgYmUgbG9ja2VkLgorICovCitpbnQJCQkJCS8qIGVycm9yIGNvZGUgKi8KK3hmc19ibWFwX2FkZF9hdHRyZm9yaygKKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCwJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwlpbnQJCQkJCXJzdmQpOwkvKiBmbGFnIGZvciByZXNlcnZlZCBibG9jayBhbGxvY2F0aW9uICovCisKKy8qCisgKiBBZGQgdGhlIGV4dGVudCB0byB0aGUgbGlzdCBvZiBleHRlbnRzIHRvIGJlIGZyZWUgYXQgdHJhbnNhY3Rpb24gZW5kLgorICogVGhlIGxpc3QgaXMgbWFpbnRhaW5lZCBzb3J0ZWQgKGJ5IGJsb2NrIG51bWJlcikuCisgKi8KK3ZvaWQKK3hmc19ibWFwX2FkZF9mcmVlKAorCXhmc19mc2Jsb2NrX3QJCWJubywJCS8qIGZzIGJsb2NrIG51bWJlciBvZiBleHRlbnQgKi8KKwl4ZnNfZmlsYmxrc190CQlsZW4sCQkvKiBsZW5ndGggb2YgZXh0ZW50ICovCisJeGZzX2JtYXBfZnJlZV90CQkqZmxpc3QsCQkvKiBsaXN0IG9mIGV4dGVudHMgKi8KKwlzdHJ1Y3QgeGZzX21vdW50CSptcCk7CQkvKiBtb3VudCBwb2ludCBzdHJ1Y3R1cmUgKi8KKworLyoKKyAqIFJvdXRpbmUgdG8gY2xlYW4gdXAgdGhlIGZyZWUgbGlzdCBkYXRhIHN0cnVjdHVyZSB3aGVuCisgKiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIGEgdHJhbnNhY3Rpb24uCisgKi8KK3ZvaWQKK3hmc19ibWFwX2NhbmNlbCgKKwl4ZnNfYm1hcF9mcmVlX3QJCSpmbGlzdCk7CS8qIGZyZWUgbGlzdCB0byBjbGVhbiB1cCAqLworCisvKgorICogQ29tcHV0ZSBhbmQgZmlsbCBpbiB0aGUgdmFsdWUgb2YgdGhlIG1heGltdW0gZGVwdGggb2YgYSBibWFwIGJ0cmVlCisgKiBpbiB0aGlzIGZpbGVzeXN0ZW0uICBEb25lIG9uY2UsIGR1cmluZyBtb3VudC4KKyAqLwordm9pZAoreGZzX2JtYXBfY29tcHV0ZV9tYXhsZXZlbHMoCisJc3RydWN0IHhmc19tb3VudAkqbXAsCS8qIGZpbGUgc3lzdGVtIG1vdW50IHN0cnVjdHVyZSAqLworCWludAkJCXdoaWNoZm9yayk7CS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCisKKy8qCisgKiBSb3V0aW5lIHRvIGJlIGNhbGxlZCBhdCB0cmFuc2FjdGlvbidzIGVuZCBieSB4ZnNfYm1hcGksIHhmc19idW5tYXBpCisgKiBjYWxsZXIuICBGcmVlcyBhbGwgdGhlIGV4dGVudHMgdGhhdCBuZWVkIGZyZWVpbmcsIHdoaWNoIG11c3QgYmUgZG9uZQorICogbGFzdCBkdWUgdG8gbG9ja2luZyBjb25zaWRlcmF0aW9ucy4KKyAqCisgKiBSZXR1cm4gMSBpZiB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24gd2FzIGNvbW1pdHRlZCBhbmQgYSBuZXcgb25lIGFsbG9jYXRlZCwKKyAqIGFuZCAwIG90aGVyd2lzZS4KKyAqLworaW50CQkJCQkJLyogZXJyb3IgKi8KK3hmc19ibWFwX2ZpbmlzaCgKKwlzdHJ1Y3QgeGZzX3RyYW5zCSoqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyIGFkZHIgKi8KKwl4ZnNfYm1hcF9mcmVlX3QJCSpmbGlzdCwJCS8qIGkvbzogbGlzdCBleHRlbnRzIHRvIGZyZWUgKi8KKwl4ZnNfZnNibG9ja190CQlmaXJzdGJsb2NrLAkvKiBjb250cm9sbGVkIGEuZy4gZm9yIGFsbG9jcyAqLworCWludAkJCSpjb21taXR0ZWQpOwkvKiB4YWN0IGNvbW1pdHRlZCBvciBub3QgKi8KKworLyoKKyAqIFJldHVybnMgdGhlIGZpbGUtcmVsYXRpdmUgYmxvY2sgbnVtYmVyIG9mIHRoZSBmaXJzdCB1bnVzZWQgYmxvY2sgaW4gdGhlIGZpbGUuCisgKiBUaGlzIGlzIHRoZSBsb3dlc3QtYWRkcmVzcyBob2xlIGlmIHRoZSBmaWxlIGhhcyBob2xlcywgZWxzZSB0aGUgZmlyc3QgYmxvY2sKKyAqIHBhc3QgdGhlIGVuZCBvZiBmaWxlLgorICovCitpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2JtYXBfZmlyc3RfdW51c2VkKAorCXN0cnVjdCB4ZnNfdHJhbnMJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAkJLyogaW5jb3JlIGlub2RlICovCisJeGZzX2V4dGxlbl90CQlsZW4sCQkvKiBzaXplIG9mIGhvbGUgdG8gZmluZCAqLworCXhmc19maWxlb2ZmX3QJCSp1bnVzZWQsCS8qIHVudXNlZCBibG9jayBudW0gKi8KKwlpbnQJCQl3aGljaGZvcmspOwkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworCisvKgorICogUmV0dXJucyB0aGUgZmlsZS1yZWxhdGl2ZSBibG9jayBudW1iZXIgb2YgdGhlIGxhc3QgYmxvY2sgKyAxIGJlZm9yZQorICogbGFzdF9ibG9jayAoaW5wdXQgdmFsdWUpIGluIHRoZSBmaWxlLgorICogVGhpcyBpcyBub3QgYmFzZWQgb24gaV9zaXplLCBpdCBpcyBiYXNlZCBvbiB0aGUgZXh0ZW50IGxpc3QuCisgKiBSZXR1cm5zIDAgZm9yIGxvY2FsIGZpbGVzLCBhcyB0aGV5IGRvIG5vdCBoYXZlIGFuIGV4dGVudCBsaXN0LgorICovCitpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2JtYXBfbGFzdF9iZWZvcmUoCisJc3RydWN0IHhmc190cmFucwkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJc3RydWN0IHhmc19pbm9kZQkqaXAsCQkvKiBpbmNvcmUgaW5vZGUgKi8KKwl4ZnNfZmlsZW9mZl90CQkqbGFzdF9ibG9jaywJLyogbGFzdCBibG9jayAqLworCWludAkJCXdoaWNoZm9yayk7CS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCisKKy8qCisgKiBSZXR1cm5zIHRoZSBmaWxlLXJlbGF0aXZlIGJsb2NrIG51bWJlciBvZiB0aGUgZmlyc3QgYmxvY2sgcGFzdCBlb2YgaW4KKyAqIHRoZSBmaWxlLiAgVGhpcyBpcyBub3QgYmFzZWQgb24gaV9zaXplLCBpdCBpcyBiYXNlZCBvbiB0aGUgZXh0ZW50IGxpc3QuCisgKiBSZXR1cm5zIDAgZm9yIGxvY2FsIGZpbGVzLCBhcyB0aGV5IGRvIG5vdCBoYXZlIGFuIGV4dGVudCBsaXN0LgorICovCitpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2JtYXBfbGFzdF9vZmZzZXQoCisJc3RydWN0IHhmc190cmFucwkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJc3RydWN0IHhmc19pbm9kZQkqaXAsCQkvKiBpbmNvcmUgaW5vZGUgKi8KKwl4ZnNfZmlsZW9mZl90CQkqdW51c2VkLAkvKiBsYXN0IGJsb2NrIG51bSAqLworCWludAkJCXdoaWNoZm9yayk7CS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCisKKy8qCisgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHNlbGVjdGVkIGZvcmsgb2YgdGhlIGlub2RlIGhhcyBleGFjdGx5IG9uZQorICogYmxvY2sgb3Igbm90LiAgRm9yIHRoZSBkYXRhIGZvcmsgd2UgY2hlY2sgdGhpcyBtYXRjaGVzIGRpX3NpemUsCisgKiBpbXBseWluZyB0aGUgZmlsZSdzIHJhbmdlIGlzIDAuLmJzaXplLTEuCisgKi8KK2ludAoreGZzX2JtYXBfb25lX2Jsb2NrKAorCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAkJLyogaW5jb3JlIGlub2RlICovCisJaW50CQkJd2hpY2hmb3JrKTsJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KKworLyoKKyAqIFJlYWQgaW4gdGhlIGV4dGVudHMgdG8gaXVfZXh0ZW50cy4KKyAqIEFsbCBpbm9kZSBmaWVsZHMgYXJlIHNldCB1cCBieSBjYWxsZXIsIHdlIGp1c3QgdHJhdmVyc2UgdGhlIGJ0cmVlCisgKiBhbmQgY29weSB0aGUgcmVjb3JkcyBpbi4KKyAqLworaW50CQkJCQkJLyogZXJyb3IgKi8KK3hmc19ibWFwX3JlYWRfZXh0ZW50cygKKwlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCwJCS8qIGluY29yZSBpbm9kZSAqLworCWludAkJCXdoaWNoZm9yayk7CS8qIGRhdGEgb3IgYXR0ciBmb3JrICovCisKKy8qCisgKiBNYXAgZmlsZSBibG9ja3MgdG8gZmlsZXN5c3RlbSBibG9ja3MuCisgKiBGaWxlIHJhbmdlIGlzIGdpdmVuIGJ5IHRoZSBibm8vbGVuIHBhaXIuCisgKiBBZGRzIGJsb2NrcyB0byBmaWxlIGlmIGEgd3JpdGUgKCJmbGFncyAmIFhGU19CTUFQSV9XUklURSIgc2V0KQorICogaW50byBhIGhvbGUgb3IgcGFzdCBlb2YuCisgKiBPbmx5IGFsbG9jYXRlcyBibG9ja3MgZnJvbSBhIHNpbmdsZSBhbGxvY2F0aW9uIGdyb3VwLAorICogdG8gYXZvaWQgbG9ja2luZyBwcm9ibGVtcy4KKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBpbiAiZmlyc3RibG9jayIgZnJvbSB0aGUgZmlyc3QgY2FsbCBpbiBhIHRyYW5zYWN0aW9uCisgKiBtdXN0IGJlIHJlbWVtYmVyZWQgYW5kIHByZXNlbnRlZCB0byBzdWJzZXF1ZW50IGNhbGxzIGluICJmaXJzdGJsb2NrIi4KKyAqIEFuIHVwcGVyIGJvdW5kIGZvciB0aGUgbnVtYmVyIG9mIGJsb2NrcyB0byBiZSBhbGxvY2F0ZWQgaXMgc3VwcGxpZWQgdG8KKyAqIHRoZSBmaXJzdCBjYWxsIGluICJ0b3RhbCI7IGlmIG5vIGFsbG9jYXRpb24gZ3JvdXAgaGFzIHRoYXQgbWFueSBmcmVlCisgKiBibG9ja3MgdGhlbiB0aGUgY2FsbCB3aWxsIGZhaWwgKHJldHVybiBOVUxMRlNCTE9DSyBpbiAiZmlyc3RibG9jayIpLgorICovCitpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2JtYXBpKAorCXN0cnVjdCB4ZnNfdHJhbnMJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAkJLyogaW5jb3JlIGlub2RlICovCisJeGZzX2ZpbGVvZmZfdAkJYm5vLAkJLyogc3RhcnRpbmcgZmlsZSBvZmZzLiBtYXBwZWQgKi8KKwl4ZnNfZmlsYmxrc190CQlsZW4sCQkvKiBsZW5ndGggdG8gbWFwIGluIGZpbGUgKi8KKwlpbnQJCQlmbGFncywJCS8qIFhGU19CTUFQSV8uLi4gKi8KKwl4ZnNfZnNibG9ja190CQkqZmlyc3RibG9jaywJLyogZmlyc3QgYWxsb2NhdGVkIGJsb2NrCisJCQkJCQkgICBjb250cm9scyBhLmcuIGZvciBhbGxvY3MgKi8KKwl4ZnNfZXh0bGVuX3QJCXRvdGFsLAkJLyogdG90YWwgYmxvY2tzIG5lZWRlZCAqLworCXN0cnVjdCB4ZnNfYm1idF9pcmVjCSptdmFsLAkJLyogb3V0cHV0OiBtYXAgdmFsdWVzICovCisJaW50CQkJKm5tYXAsCQkvKiBpL286IG12YWwgc2l6ZS9jb3VudCAqLworCXhmc19ibWFwX2ZyZWVfdAkJKmZsaXN0KTsJLyogaS9vOiBsaXN0IGV4dGVudHMgdG8gZnJlZSAqLworCisvKgorICogTWFwIGZpbGUgYmxvY2tzIHRvIGZpbGVzeXN0ZW0gYmxvY2tzLCBzaW1wbGUgdmVyc2lvbi4KKyAqIE9uZSBibG9jayBvbmx5LCByZWFkLW9ubHkuCisgKiBGb3IgZmxhZ3MsIG9ubHkgdGhlIFhGU19CTUFQSV9BVFRSRk9SSyBmbGFnIGlzIGV4YW1pbmVkLgorICogRm9yIHRoZSBvdGhlciBmbGFnIHZhbHVlcywgdGhlIGVmZmVjdCBpcyBhcyBpZiBYRlNfQk1BUElfTUVUQURBVEEKKyAqIHdhcyBzZXQgYW5kIGFsbCB0aGUgb3RoZXJzIHdlcmUgY2xlYXIuCisgKi8KK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfYm1hcGlfc2luZ2xlKAorCXN0cnVjdCB4ZnNfdHJhbnMJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAkJLyogaW5jb3JlIGlub2RlICovCisJaW50CQkJd2hpY2hmb3JrLAkvKiBkYXRhIG9yIGF0dHIgZm9yayAqLworCXhmc19mc2Jsb2NrX3QJCSpmc2IsCQkvKiBvdXRwdXQ6IG1hcHBlZCBibG9jayAqLworCXhmc19maWxlb2ZmX3QJCWJubyk7CQkvKiBzdGFydGluZyBmaWxlIG9mZnMuIG1hcHBlZCAqLworCisvKgorICogVW5tYXAgKHJlbW92ZSkgYmxvY2tzIGZyb20gYSBmaWxlLgorICogSWYgbmV4dHMgaXMgbm9uemVybyB0aGVuIHRoZSBudW1iZXIgb2YgZXh0ZW50cyB0byByZW1vdmUgaXMgbGltaXRlZCB0bworICogdGhhdCB2YWx1ZS4gIElmIG5vdCBhbGwgZXh0ZW50cyBpbiB0aGUgYmxvY2sgcmFuZ2UgY2FuIGJlIHJlbW92ZWQgdGhlbgorICogKmRvbmUgaXMgc2V0LgorICovCitpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2J1bm1hcGkoCisJc3RydWN0IHhmc190cmFucwkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJc3RydWN0IHhmc19pbm9kZQkqaXAsCQkvKiBpbmNvcmUgaW5vZGUgKi8KKwl4ZnNfZmlsZW9mZl90CQlibm8sCQkvKiBzdGFydGluZyBvZmZzZXQgdG8gdW5tYXAgKi8KKwl4ZnNfZmlsYmxrc190CQlsZW4sCQkvKiBsZW5ndGggdG8gdW5tYXAgaW4gZmlsZSAqLworCWludAkJCWZsYWdzLAkJLyogWEZTX0JNQVBJXy4uLiAqLworCXhmc19leHRudW1fdAkJbmV4dHMsCQkvKiBudW1iZXIgb2YgZXh0ZW50cyBtYXggKi8KKwl4ZnNfZnNibG9ja190CQkqZmlyc3RibG9jaywJLyogZmlyc3QgYWxsb2NhdGVkIGJsb2NrCisJCQkJCQkgICBjb250cm9scyBhLmcuIGZvciBhbGxvY3MgKi8KKwl4ZnNfYm1hcF9mcmVlX3QJCSpmbGlzdCwJCS8qIGkvbzogbGlzdCBleHRlbnRzIHRvIGZyZWUgKi8KKwlpbnQJCQkqZG9uZSk7CQkvKiBzZXQgaWYgbm90IGRvbmUgeWV0ICovCisKKy8qCisgKiBGY250bCBpbnRlcmZhY2UgdG8geGZzX2JtYXBpLgorICovCitpbnQJCQkJCQkvKiBlcnJvciBjb2RlICovCit4ZnNfZ2V0Ym1hcCgKKwliaHZfZGVzY190CQkqYmRwLAkJLyogWEZTIGJlaGF2aW9yIGRlc2NyaXB0b3IqLworCXN0cnVjdCBnZXRibWFwCQkqYm12LAkJLyogdXNlciBibWFwIHN0cnVjdHVyZSAqLworCXZvaWQJCQlfX3VzZXIgKmFwLAkvKiBwb2ludGVyIHRvIHVzZXIncyBhcnJheSAqLworCWludAkJCWlmbGFncyk7CS8qIGludGVyZmFjZSBmbGFncyAqLworCisvKgorICogQ2hlY2sgdGhlIGxhc3QgaW5vZGUgZXh0ZW50IHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMgYWxsb2NhdGlvbiB3aWxsIHJlc3VsdAorICogaW4gYmxvY2tzIGJlaW5nIGFsbG9jYXRlZCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLiBXaGVuIHdlIGFsbG9jYXRlIG5ldyBkYXRhCisgKiBibG9ja3MgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSB3aGljaCBkbyBub3Qgc3RhcnQgYXQgdGhlIHByZXZpb3VzIGRhdGEgYmxvY2ssCisgKiB3ZSB3aWxsIHRyeSB0byBhbGlnbiB0aGUgbmV3IGJsb2NrcyBhdCBzdHJpcGUgdW5pdCBib3VuZGFyaWVzLgorICovCitpbnQKK3hmc19ibWFwX2lzYWVvZigKKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCwKKwl4ZnNfZmlsZW9mZl90CQlvZmYsCisJaW50CQkJd2hpY2hmb3JrLAorCWNoYXIJCQkqYWVvZik7CisKKy8qCisgKiBDaGVjayBpZiB0aGUgZW5kb2ZmIGlzIG91dHNpZGUgdGhlIGxhc3QgZXh0ZW50LiBJZiBzbyB0aGUgY2FsbGVyIHdpbGwgZ3JvdworICogdGhlIGFsbG9jYXRpb24gdG8gYSBzdHJpcGUgdW5pdCBib3VuZGFyeQorICovCitpbnQKK3hmc19ibWFwX2VvZigKKwlzdHJ1Y3QgeGZzX2lub2RlICAgICAgICAqaXAsCisJeGZzX2ZpbGVvZmZfdCAgICAgICAgICAgZW5kb2ZmLAorCWludCAgICAgICAgICAgICAgICAgICAgIHdoaWNoZm9yaywKKwlpbnQgICAgICAgICAgICAgICAgICAgICAqZW9mKTsKKworLyoKKyAqIENvdW50IGZzYmxvY2tzIG9mIHRoZSBnaXZlbiBmb3JrLgorICovCitpbnQKK3hmc19ibWFwX2NvdW50X2Jsb2NrcygKKwl4ZnNfdHJhbnNfdAkJKnRwLAorCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAorCWludAkJCXdoaWNoZm9yaywKKwlpbnQJCQkqY291bnQpOworCisvKgorICogQ2hlY2sgYW4gZXh0ZW50IGxpc3QsIHdoaWNoIGhhcyBqdXN0IGJlZW4gcmVhZCwgZm9yCisgKiBhbnkgYml0IGluIHRoZSBleHRlbnQgZmxhZyBmaWVsZC4KKyAqLworaW50Cit4ZnNfY2hlY2tfbm9zdGF0ZV9leHRlbnRzKAorCXhmc19ibWJ0X3JlY190CQkqZXAsCisJeGZzX2V4dG51bV90CQludW0pOworCisjZW5kaWYJLyogX19LRVJORUxfXyAqLworCisjZW5kaWYJLyogX19YRlNfQk1BUF9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYm1hcF9idHJlZS5jIGIvZnMveGZzL3hmc19ibWFwX2J0cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYzMzA1YQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfYm1hcF9idHJlZS5jCkBAIC0wLDAgKzEsMjgwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorCisjaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc190eXBlcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19hZy5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfaXRhYmxlLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlX2l0ZW0uaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCisjaW5jbHVkZSAieGZzX2JtYXAuaCIKKyNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKKyNpbmNsdWRlICJ4ZnNfcXVvdGEuaCIKKworI2lmIGRlZmluZWQoWEZTX0JNQlRfVFJBQ0UpCitrdHJhY2VfdAkqeGZzX2JtYnRfdHJhY2VfYnVmOworI2VuZGlmCisKKy8qCisgKiBQcm90b3R5cGVzIGZvciBpbnRlcm5hbCBidHJlZSBmdW5jdGlvbnMuCisgKi8KKworCitTVEFUSUMgaW50IHhmc19ibWJ0X2tpbGxyb290KHhmc19idHJlZV9jdXJfdCAqKTsKK1NUQVRJQyB2b2lkIHhmc19ibWJ0X2xvZ19rZXlzKHhmc19idHJlZV9jdXJfdCAqLCB4ZnNfYnVmX3QgKiwgaW50LCBpbnQpOworU1RBVElDIHZvaWQgeGZzX2JtYnRfbG9nX3B0cnMoeGZzX2J0cmVlX2N1cl90ICosIHhmc19idWZfdCAqLCBpbnQsIGludCk7CitTVEFUSUMgaW50IHhmc19ibWJ0X2xzaGlmdCh4ZnNfYnRyZWVfY3VyX3QgKiwgaW50LCBpbnQgKik7CitTVEFUSUMgaW50IHhmc19ibWJ0X3JzaGlmdCh4ZnNfYnRyZWVfY3VyX3QgKiwgaW50LCBpbnQgKik7CitTVEFUSUMgaW50IHhmc19ibWJ0X3NwbGl0KHhmc19idHJlZV9jdXJfdCAqLCBpbnQsIHhmc19mc2Jsb2NrX3QgKiwKKwkJeGZzX2JtYnRfa2V5X3QgKiwgeGZzX2J0cmVlX2N1cl90ICoqLCBpbnQgKik7CitTVEFUSUMgaW50IHhmc19ibWJ0X3VwZGtleSh4ZnNfYnRyZWVfY3VyX3QgKiwgeGZzX2JtYnRfa2V5X3QgKiwgaW50KTsKKworCisjaWYgZGVmaW5lZChYRlNfQk1CVF9UUkFDRSkKKworc3RhdGljIGNoYXIJQVJHU1tdID0gImFyZ3MiOworc3RhdGljIGNoYXIJRU5UUllbXSA9ICJlbnRyeSI7CitzdGF0aWMgY2hhcglFUlJPUltdID0gImVycm9yIjsKKyN1bmRlZiBFWElUCitzdGF0aWMgY2hhcglFWElUW10gPSAiZXhpdCI7CisKKy8qCisgKiBBZGQgYSB0cmFjZSBidWZmZXIgZW50cnkgZm9yIHRoZSBhcmd1bWVudHMgZ2l2ZW4gdG8gdGhlIHJvdXRpbmUsCisgKiBnZW5lcmljIGZvcm0uCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYm1idF90cmFjZV9lbnRlcigKKwljaGFyCQkqZnVuYywKKwl4ZnNfYnRyZWVfY3VyX3QJKmN1ciwKKwljaGFyCQkqcywKKwlpbnQJCXR5cGUsCisJaW50CQlsaW5lLAorCV9fcHN1bnNpZ25lZF90CWEwLAorCV9fcHN1bnNpZ25lZF90CWExLAorCV9fcHN1bnNpZ25lZF90CWEyLAorCV9fcHN1bnNpZ25lZF90CWEzLAorCV9fcHN1bnNpZ25lZF90CWE0LAorCV9fcHN1bnNpZ25lZF90CWE1LAorCV9fcHN1bnNpZ25lZF90CWE2LAorCV9fcHN1bnNpZ25lZF90CWE3LAorCV9fcHN1bnNpZ25lZF90CWE4LAorCV9fcHN1bnNpZ25lZF90CWE5LAorCV9fcHN1bnNpZ25lZF90CWExMCkKK3sKKwl4ZnNfaW5vZGVfdAkqaXA7CisJaW50CQl3aGljaGZvcms7CisKKwlpcCA9IGN1ci0+YmNfcHJpdmF0ZS5iLmlwOworCXdoaWNoZm9yayA9IGN1ci0+YmNfcHJpdmF0ZS5iLndoaWNoZm9yazsKKwlrdHJhY2VfZW50ZXIoeGZzX2JtYnRfdHJhY2VfYnVmLAorCQkodm9pZCAqKSgoX19wc2ludF90KXR5cGUgfCAod2hpY2hmb3JrIDw8IDgpIHwgKGxpbmUgPDwgMTYpKSwKKwkJKHZvaWQgKilmdW5jLCAodm9pZCAqKXMsICh2b2lkICopaXAsICh2b2lkICopY3VyLAorCQkodm9pZCAqKWEwLCAodm9pZCAqKWExLCAodm9pZCAqKWEyLCAodm9pZCAqKWEzLAorCQkodm9pZCAqKWE0LCAodm9pZCAqKWE1LCAodm9pZCAqKWE2LCAodm9pZCAqKWE3LAorCQkodm9pZCAqKWE4LCAodm9pZCAqKWE5LCAodm9pZCAqKWExMCk7CisJQVNTRVJUKGlwLT5pX2J0cmFjZSk7CisJa3RyYWNlX2VudGVyKGlwLT5pX2J0cmFjZSwKKwkJKHZvaWQgKikoKF9fcHNpbnRfdCl0eXBlIHwgKHdoaWNoZm9yayA8PCA4KSB8IChsaW5lIDw8IDE2KSksCisJCSh2b2lkICopZnVuYywgKHZvaWQgKilzLCAodm9pZCAqKWlwLCAodm9pZCAqKWN1ciwKKwkJKHZvaWQgKilhMCwgKHZvaWQgKilhMSwgKHZvaWQgKilhMiwgKHZvaWQgKilhMywKKwkJKHZvaWQgKilhNCwgKHZvaWQgKilhNSwgKHZvaWQgKilhNiwgKHZvaWQgKilhNywKKwkJKHZvaWQgKilhOCwgKHZvaWQgKilhOSwgKHZvaWQgKilhMTApOworfQorLyoKKyAqIEFkZCBhIHRyYWNlIGJ1ZmZlciBlbnRyeSBmb3IgYXJndW1lbnRzLCBmb3IgYSBidWZmZXIgJiAxIGludGVnZXIgYXJnLgorICovCitTVEFUSUMgdm9pZAoreGZzX2JtYnRfdHJhY2VfYXJnYmkoCisJY2hhcgkJKmZ1bmMsCisJeGZzX2J0cmVlX2N1cl90CSpjdXIsCisJeGZzX2J1Zl90CSpiLAorCWludAkJaSwKKwlpbnQJCWxpbmUpCit7CisJeGZzX2JtYnRfdHJhY2VfZW50ZXIoZnVuYywgY3VyLCBBUkdTLCBYRlNfQk1CVF9LVFJBQ0VfQVJHQkksIGxpbmUsCisJCShfX3BzdW5zaWduZWRfdCliLCBpLCAwLCAwLAorCQkwLCAwLCAwLCAwLAorCQkwLCAwLCAwKTsKK30KKworLyoKKyAqIEFkZCBhIHRyYWNlIGJ1ZmZlciBlbnRyeSBmb3IgYXJndW1lbnRzLCBmb3IgYSBidWZmZXIgJiAyIGludGVnZXIgYXJncy4KKyAqLworU1RBVElDIHZvaWQKK3hmc19ibWJ0X3RyYWNlX2FyZ2JpaSgKKwljaGFyCQkqZnVuYywKKwl4ZnNfYnRyZWVfY3VyX3QJKmN1ciwKKwl4ZnNfYnVmX3QJKmIsCisJaW50CQlpMCwKKwlpbnQJCWkxLAorCWludAkJbGluZSkKK3sKKwl4ZnNfYm1idF90cmFjZV9lbnRlcihmdW5jLCBjdXIsIEFSR1MsIFhGU19CTUJUX0tUUkFDRV9BUkdCSUksIGxpbmUsCisJCShfX3BzdW5zaWduZWRfdCliLCBpMCwgaTEsIDAsCisJCTAsIDAsIDAsIDAsCisJCTAsIDAsIDApOworfQorCisvKgorICogQWRkIGEgdHJhY2UgYnVmZmVyIGVudHJ5IGZvciBhcmd1bWVudHMsIGZvciAzIGJsb2NrLWxlbmd0aCBhcmdzCisgKiBhbmQgYW4gaW50ZWdlciBhcmcuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYm1idF90cmFjZV9hcmdmZmZpKAorCWNoYXIJCQkqZnVuYywKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCisJeGZzX2RmaWxvZmZfdAkJbywKKwl4ZnNfZGZzYm5vX3QJCWIsCisJeGZzX2RmaWxibGtzX3QJCWksCisJaW50CQkJaiwKKwlpbnQJCQlsaW5lKQoreworCXhmc19ibWJ0X3RyYWNlX2VudGVyKGZ1bmMsIGN1ciwgQVJHUywgWEZTX0JNQlRfS1RSQUNFX0FSR0ZGRkksIGxpbmUsCisJCW8gPj4gMzIsIChpbnQpbywgYiA+PiAzMiwgKGludCliLAorCQlpID4+IDMyLCAoaW50KWksIChpbnQpaiwgMCwKKwkJMCwgMCwgMCk7Cit9CisKKy8qCisgKiBBZGQgYSB0cmFjZSBidWZmZXIgZW50cnkgZm9yIGFyZ3VtZW50cywgZm9yIG9uZSBpbnRlZ2VyIGFyZy4KKyAqLworU1RBVElDIHZvaWQKK3hmc19ibWJ0X3RyYWNlX2FyZ2koCisJY2hhcgkJKmZ1bmMsCisJeGZzX2J0cmVlX2N1cl90CSpjdXIsCisJaW50CQlpLAorCWludAkJbGluZSkKK3sKKwl4ZnNfYm1idF90cmFjZV9lbnRlcihmdW5jLCBjdXIsIEFSR1MsIFhGU19CTUJUX0tUUkFDRV9BUkdJLCBsaW5lLAorCQlpLCAwLCAwLCAwLAorCQkwLCAwLCAwLCAwLAorCQkwLCAwLCAwKTsKK30KKworLyoKKyAqIEFkZCBhIHRyYWNlIGJ1ZmZlciBlbnRyeSBmb3IgYXJndW1lbnRzLCBmb3IgaW50LCBmc2Jsb2NrLCBrZXkuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYm1idF90cmFjZV9hcmdpZmsoCisJY2hhcgkJCSpmdW5jLAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwKKwlpbnQJCQlpLAorCXhmc19mc2Jsb2NrX3QJCWYsCisJeGZzX2JtYnRfa2V5X3QJCSprLAorCWludAkJCWxpbmUpCit7CisJeGZzX2Rmc2Jub190CQlkOworCXhmc19kZmlsb2ZmX3QJCW87CisKKwlkID0gKHhmc19kZnNibm9fdClmOworCW8gPSBJTlRfR0VUKGstPmJyX3N0YXJ0b2ZmLCBBUkNIX0NPTlZFUlQpOworCXhmc19ibWJ0X3RyYWNlX2VudGVyKGZ1bmMsIGN1ciwgQVJHUywgWEZTX0JNQlRfS1RSQUNFX0FSR0lGSywgbGluZSwKKwkJaSwgZCA+PiAzMiwgKGludClkLCBvID4+IDMyLAorCQkoaW50KW8sIDAsIDAsIDAsCisJCTAsIDAsIDApOworfQorCisvKgorICogQWRkIGEgdHJhY2UgYnVmZmVyIGVudHJ5IGZvciBhcmd1bWVudHMsIGZvciBpbnQsIGZzYmxvY2ssIHJlYy4KKyAqLworU1RBVElDIHZvaWQKK3hmc19ibWJ0X3RyYWNlX2FyZ2lmcigKKwljaGFyCQkJKmZ1bmMsCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAorCWludAkJCWksCisJeGZzX2ZzYmxvY2tfdAkJZiwKKwl4ZnNfYm1idF9yZWNfdAkJKnIsCisJaW50CQkJbGluZSkKK3sKKwl4ZnNfZGZzYm5vX3QJCWI7CisJeGZzX2RmaWxibGtzX3QJCWM7CisJeGZzX2Rmc2Jub190CQlkOworCXhmc19kZmlsb2ZmX3QJCW87CisJeGZzX2JtYnRfaXJlY190CQlzOworCisJZCA9ICh4ZnNfZGZzYm5vX3QpZjsKKwl4ZnNfYm1idF9kaXNrX2dldF9hbGwociwgJnMpOworCW8gPSAoeGZzX2RmaWxvZmZfdClzLmJyX3N0YXJ0b2ZmOworCWIgPSAoeGZzX2Rmc2Jub190KXMuYnJfc3RhcnRibG9jazsKKwljID0gcy5icl9ibG9ja2NvdW50OworCXhmc19ibWJ0X3RyYWNlX2VudGVyKGZ1bmMsIGN1ciwgQVJHUywgWEZTX0JNQlRfS1RSQUNFX0FSR0lGUiwgbGluZSwKKwkJaSwgZCA+PiAzMiwgKGludClkLCBvID4+IDMyLAorCQkoaW50KW8sIGIgPj4gMzIsIChpbnQpYiwgYyA+PiAzMiwKKwkJKGludCljLCAwLCAwKTsKK30KKworLyoKKyAqIEFkZCBhIHRyYWNlIGJ1ZmZlciBlbnRyeSBmb3IgYXJndW1lbnRzLCBmb3IgaW50LCBrZXkuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYm1idF90cmFjZV9hcmdpaygKKwljaGFyCQkJKmZ1bmMsCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAorCWludAkJCWksCisJeGZzX2JtYnRfa2V5X3QJCSprLAorCWludAkJCWxpbmUpCit7CisJeGZzX2RmaWxvZmZfdAkJbzsKKworCW8gPSBJTlRfR0VUKGstPmJyX3N0YXJ0b2ZmLCBBUkNIX0NPTlZFUlQpOworCXhmc19ibWJ0X3RyYWNlX2VudGVyKGZ1bmMsIGN1ciwgQVJHUywgWEZTX0JNQlRfS1RSQUNFX0FSR0lGSywgbGluZSwKKwkJaSwgbyA+PiAzMiwgKGludClvLCAwLAorCQkwLCAwLCAwLCAwLAorCQkwLCAwLCAwKTsKK30KKworLyoKKyAqIEFkZCBhIHRyYWNlIGJ1ZmZlciBlbnRyeSBmb3IgdGhlIGN1cnNvci9vcGVyYXRpb24uCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYm1idF90cmFjZV9jdXJzb3IoCisJY2hhcgkJKmZ1bmMsCisJeGZzX2J0cmVlX2N1cl90CSpjdXIsCisJY2hhcgkJKnMsCisJaW50CQlsaW5lKQoreworCXhmc19ibWJ0X3JlY190CXI7CisKKwl4ZnNfYm1idF9zZXRfYWxsKCZyLCAmY3VyLT5iY19yZWMuYik7CisJeGZzX2JtYnRfdHJhY2VfZW50ZXIoZnVuYywgY3VyLCBzLCBYRlNfQk1CVF9LVFJBQ0VfQ1VSLCBsaW5lLAorCQkoY3VyLT5iY19ubGV2ZWxzIDw8IDI0KSB8IChjdXItPmJjX3ByaXZhdGUuYi5mbGFncyA8PCAxNikgfAorCQljdXItPmJjX3ByaXZhdGUuYi5hbGxvY2F0ZWQsCisJCUlOVF9HRVQoci5sMCwgQVJDSF9DT05WRVJUKSA+PiAzMiwgKGludClJTlRfR0VUKHIubDAsIEFSQ0hfQ09OVkVSVCksIElOVF9HRVQoci5sMSwgQVJDSF9DT05WRVJUKSA+PiAzMiwgKGludClJTlRfR0VUKHIubDEsIEFSQ0hfQ09OVkVSVCksCisJCSh1bnNpZ25lZCBsb25nKWN1ci0+YmNfYnVmc1swXSwgKHVuc2lnbmVkIGxvbmcpY3VyLT5iY19idWZzWzFdLAorCQkodW5zaWduZWQgbG9uZyljdXItPmJjX2J1ZnNbMl0sICh1bnNpZ25lZCBsb25nKWN1ci0+YmNfYnVmc1szXSwKKwkJKGN1ci0+YmNfcHRyc1swXSA8PCAxNikgfCBjdXItPmJjX3B0cnNbMV0sCisJCShjdXItPmJjX3B0cnNbMl0gPDwgMTYpIHwgY3VyLT5iY19wdHJzWzNdKTsKK30KKworI2RlZmluZQlYRlNfQk1CVF9UUkFDRV9BUkdCSShjLGIsaSkJXAorCXhmc19ibWJ0X3RyYWNlX2FyZ2JpKGZuYW1lLCBjLCBiLCBpLCBfX0xJTkVfXykKKyNkZWZpbmUJWEZTX0JNQlRfVFJBQ0VfQVJHQklJKGMsYixpLGopCVwKKwl4ZnNfYm1idF90cmFjZV9hcmdiaWkoZm5hbWUsIGMsIGIsIGksIGosIF9fTElORV9fKQorI2RlZmluZQlYRlNfQk1CVF9UUkFDRV9BUkdGRkZJKGMsbyxiLGksaikJXAorCXhmc19ibWJ0X3RyYWNlX2FyZ2ZmZmkoZm5hbWUsIGMsIG8sIGIsIGksIGosIF9fTElORV9fKQorI2RlZmluZQlYRlNfQk1CVF9UUkFDRV9BUkdJKGMsaSkJXAorCXhmc19ibWJ0X3RyYWNlX2FyZ2koZm5hbWUsIGMsIGksIF9fTElORV9fKQorI2RlZmluZQlYRlNfQk1CVF9UUkFDRV9BUkdJRksoYyxpLGYsaykJXAorCXhmc19ibWJ0X3RyYWNlX2FyZ2lmayhmbmFtZSwgYywgaSwgZiwgaywgX19MSU5FX18pCisjZGVmaW5lCVhGU19CTUJUX1RSQUNFX0FSR0lGUihjLGksZixyKQlcCisJeGZzX2JtYnRfdHJhY2VfYXJnaWZyKGZuYW1lLCBjLCBpLCBmLCByLCBfX0xJTkVfXykKKyNkZWZpbmUJWEZTX0JNQlRfVFJBQ0VfQVJHSUsoYyxpLGspCVwKKwl4ZnNfYm1idF90cmFjZV9hcmdpayhmbmFtZSwgYywgaSwgaywgX19MSU5FX18pCisjZGVmaW5lCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjLHMpCVwKKwl4ZnNfYm1idF90cmFjZV9jdXJzb3IoZm5hbWUsIGMsIHMsIF9fTElORV9fKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0JNQlRfVFJBQ0VfQVJHQkkoYyxiLGkpCisjZGVmaW5lCVhGU19CTUJUX1RSQUNFX0FSR0JJSShjLGIsaSxqKQorI2RlZmluZQlYRlNfQk1CVF9UUkFDRV9BUkdGRkZJKGMsbyxiLGksaikKKyNkZWZpbmUJWEZTX0JNQlRfVFJBQ0VfQVJHSShjLGkpCisjZGVmaW5lCVhGU19CTUJUX1RSQUNFX0FSR0lGSyhjLGksZixrKQorI2RlZmluZQlYRlNfQk1CVF9UUkFDRV9BUkdJRlIoYyxpLGYscikKKyNkZWZpbmUJWEZTX0JNQlRfVFJBQ0VfQVJHSUsoYyxpLGspCisjZGVmaW5lCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjLHMpCisjZW5kaWYJLyogWEZTX0JNQlRfVFJBQ0UgKi8KKworCisvKgorICogSW50ZXJuYWwgZnVuY3Rpb25zLgorICovCisKKy8qCisgKiBEZWxldGUgcmVjb3JkIHBvaW50ZWQgdG8gYnkgY3VyL2xldmVsLgorICovCitTVEFUSUMgaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2JtYnRfZGVscmVjKAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwKKwlpbnQJCQlsZXZlbCwKKwlpbnQJCQkqc3RhdCkJCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworeworCXhmc19ibWJ0X2Jsb2NrX3QJKmJsb2NrOwkJLyogYm1hcCBidHJlZSBibG9jayAqLworCXhmc19mc2Jsb2NrX3QJCWJubzsJCS8qIGZzLXJlbGF0aXZlIGJsb2NrIG51bWJlciAqLworCXhmc19idWZfdAkJKmJwOwkJLyogYnVmZmVyIGZvciBibG9jayAqLworCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisjaWZkZWYgWEZTX0JNQlRfVFJBQ0UKKwlzdGF0aWMgY2hhcgkJZm5hbWVbXSA9ICJ4ZnNfYm1idF9kZWxyZWMiOworI2VuZGlmCisJaW50CQkJaTsJCS8qIGxvb3AgY291bnRlciAqLworCWludAkJCWo7CQkvKiB0ZW1wIHN0YXRlICovCisJeGZzX2JtYnRfa2V5X3QJCWtleTsJCS8qIGJtYXAgYnRyZWUga2V5ICovCisJeGZzX2JtYnRfa2V5X3QJCSprcD1OVUxMOwkvKiBwb2ludGVyIHRvIGJtYXAgYnRyZWUga2V5ICovCisJeGZzX2ZzYmxvY2tfdAkJbGJubzsJCS8qIGxlZnQgc2libGluZyBibG9jayBudW1iZXIgKi8KKwl4ZnNfYnVmX3QJCSpsYnA7CQkvKiBsZWZ0IGJ1ZmZlciBwb2ludGVyICovCisJeGZzX2JtYnRfYmxvY2tfdAkqbGVmdDsJCS8qIGxlZnQgYnRyZWUgYmxvY2sgKi8KKwl4ZnNfYm1idF9rZXlfdAkJKmxrcDsJCS8qIGxlZnQgYnRyZWUga2V5ICovCisJeGZzX2JtYnRfcHRyX3QJCSpscHA7CQkvKiBsZWZ0IGFkZHJlc3MgcG9pbnRlciAqLworCWludAkJCWxyZWNzPTA7CS8qIGxlZnQgcmVjb3JkIGNvdW50ICovCisJeGZzX2JtYnRfcmVjX3QJCSpscnA7CQkvKiBsZWZ0IHJlY29yZCBwb2ludGVyICovCisJeGZzX21vdW50X3QJCSptcDsJCS8qIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50ICovCisJeGZzX2JtYnRfcHRyX3QJCSpwcDsJCS8qIHBvaW50ZXIgdG8gYm1hcCBibG9jayBhZGRyICovCisJaW50CQkJcHRyOwkJLyoga2V5L3JlY29yZCBpbmRleCAqLworCXhmc19mc2Jsb2NrX3QJCXJibm87CQkvKiByaWdodCBzaWJsaW5nIGJsb2NrIG51bWJlciAqLworCXhmc19idWZfdAkJKnJicDsJCS8qIHJpZ2h0IGJ1ZmZlciBwb2ludGVyICovCisJeGZzX2JtYnRfYmxvY2tfdAkqcmlnaHQ7CQkvKiByaWdodCBidHJlZSBibG9jayAqLworCXhmc19ibWJ0X2tleV90CQkqcmtwOwkJLyogcmlnaHQgYnRyZWUga2V5ICovCisJeGZzX2JtYnRfcmVjX3QJCSpycDsJCS8qIHBvaW50ZXIgdG8gYm1hcCBidHJlZSByZWMgKi8KKwl4ZnNfYm1idF9wdHJfdAkJKnJwcDsJCS8qIHJpZ2h0IGFkZHJlc3MgcG9pbnRlciAqLworCXhmc19ibWJ0X2Jsb2NrX3QJKnJyYmxvY2s7CS8qIHJpZ2h0LXJpZ2h0IGJ0cmVlIGJsb2NrICovCisJeGZzX2J1Zl90CQkqcnJicDsJCS8qIHJpZ2h0LXJpZ2h0IGJ1ZmZlciBwb2ludGVyICovCisJaW50CQkJcnJlY3M9MDsJLyogcmlnaHQgcmVjb3JkIGNvdW50ICovCisJeGZzX2JtYnRfcmVjX3QJCSpycnA7CQkvKiByaWdodCByZWNvcmQgcG9pbnRlciAqLworCXhmc19idHJlZV9jdXJfdAkJKnRjdXI7CQkvKiB0ZW1wb3JhcnkgYnRyZWUgY3Vyc29yICovCisJaW50CQkJbnVtcmVjczsJLyogdGVtcG9yYXJ5IG51bXJlYyBjb3VudCAqLworCWludAkJCW51bWxyZWNzLCBudW1ycmVjczsKKworCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVOVFJZKTsKKwlYRlNfQk1CVF9UUkFDRV9BUkdJKGN1ciwgbGV2ZWwpOworCXB0ciA9IGN1ci0+YmNfcHRyc1tsZXZlbF07CisJdGN1ciA9ICh4ZnNfYnRyZWVfY3VyX3QgKikwOworCWlmIChwdHIgPT0gMCkgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKKwkJKnN0YXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJYmxvY2sgPSB4ZnNfYm1idF9nZXRfYmxvY2soY3VyLCBsZXZlbCwgJmJwKTsKKwludW1yZWNzID0gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKKyNpZmRlZiBERUJVRworCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbGJsb2NrKGN1ciwgYmxvY2ssIGxldmVsLCBicCkpKSB7CisJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJZ290byBlcnJvcjA7CisJfQorI2VuZGlmCisJaWYgKHB0ciA+IG51bXJlY3MpIHsKKwkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7CisJCSpzdGF0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCVhGU19TVEFUU19JTkMoeHNfYm1idF9kZWxyZWMpOworCWlmIChsZXZlbCA+IDApIHsKKwkJa3AgPSBYRlNfQk1BUF9LRVlfSUFERFIoYmxvY2ssIDEsIGN1cik7CisJCXBwID0gWEZTX0JNQVBfUFRSX0lBRERSKGJsb2NrLCAxLCBjdXIpOworI2lmZGVmIERFQlVHCisJCWZvciAoaSA9IHB0cjsgaSA8IG51bXJlY3M7IGkrKykgeworCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19scHRyKGN1ciwgSU5UX0dFVChwcFtpXSwgQVJDSF9DT05WRVJUKSwgbGV2ZWwpKSkgeworCQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCQlnb3RvIGVycm9yMDsKKwkJCX0KKwkJfQorI2VuZGlmCisJCWlmIChwdHIgPCBudW1yZWNzKSB7CisJCQltZW1tb3ZlKCZrcFtwdHIgLSAxXSwgJmtwW3B0cl0sCisJCQkJKG51bXJlY3MgLSBwdHIpICogc2l6ZW9mKCprcCkpOworCQkJbWVtbW92ZSgmcHBbcHRyIC0gMV0sICZwcFtwdHJdLCAvKiBJTlRfOiBkaXJlY3QgY29weSAqLworCQkJCShudW1yZWNzIC0gcHRyKSAqIHNpemVvZigqcHApKTsKKwkJCXhmc19ibWJ0X2xvZ19wdHJzKGN1ciwgYnAsIHB0ciwgbnVtcmVjcyAtIDEpOworCQkJeGZzX2JtYnRfbG9nX2tleXMoY3VyLCBicCwgcHRyLCBudW1yZWNzIC0gMSk7CisJCX0KKwl9IGVsc2UgeworCQlycCA9IFhGU19CTUFQX1JFQ19JQUREUihibG9jaywgMSwgY3VyKTsKKwkJaWYgKHB0ciA8IG51bXJlY3MpIHsKKwkJCW1lbW1vdmUoJnJwW3B0ciAtIDFdLCAmcnBbcHRyXSwKKwkJCQkobnVtcmVjcyAtIHB0cikgKiBzaXplb2YoKnJwKSk7CisJCQl4ZnNfYm1idF9sb2dfcmVjcyhjdXIsIGJwLCBwdHIsIG51bXJlY3MgLSAxKTsKKwkJfQorCQlpZiAocHRyID09IDEpIHsKKwkJCUlOVF9TRVQoa2V5LmJyX3N0YXJ0b2ZmLCBBUkNIX0NPTlZFUlQsIHhmc19ibWJ0X2Rpc2tfZ2V0X3N0YXJ0b2ZmKHJwKSk7CisJCQlrcCA9ICZrZXk7CisJCX0KKwl9CisJbnVtcmVjcy0tOworCUlOVF9TRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCwgbnVtcmVjcyk7CisJeGZzX2JtYnRfbG9nX2Jsb2NrKGN1ciwgYnAsIFhGU19CQl9OVU1SRUNTKTsKKwkvKgorCSAqIFdlJ3JlIGF0IHRoZSByb290IGxldmVsLgorCSAqIEZpcnN0LCBzaHJpbmsgdGhlIHJvb3QgYmxvY2sgaW4tbWVtb3J5LgorCSAqIFRyeSB0byBnZXQgcmlkIG9mIHRoZSBuZXh0IGxldmVsIGRvd24uCisJICogSWYgd2UgY2FuJ3QgdGhlbiB0aGVyZSdzIG5vdGhpbmcgbGVmdCB0byBkby4KKwkgKi8KKwlpZiAobGV2ZWwgPT0gY3VyLT5iY19ubGV2ZWxzIC0gMSkgeworCQl4ZnNfaXJvb3RfcmVhbGxvYyhjdXItPmJjX3ByaXZhdGUuYi5pcCwgLTEsCisJCQljdXItPmJjX3ByaXZhdGUuYi53aGljaGZvcmspOworCQlpZiAoKGVycm9yID0geGZzX2JtYnRfa2lsbHJvb3QoY3VyKSkpIHsKKwkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCWdvdG8gZXJyb3IwOworCQl9CisJCWlmIChsZXZlbCA+IDAgJiYgKGVycm9yID0geGZzX2JtYnRfZGVjcmVtZW50KGN1ciwgbGV2ZWwsICZqKSkpIHsKKwkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCWdvdG8gZXJyb3IwOworCQl9CisJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOworCQkqc3RhdCA9IDE7CisJCXJldHVybiAwOworCX0KKwlpZiAocHRyID09IDEgJiYgKGVycm9yID0geGZzX2JtYnRfdXBka2V5KGN1ciwga3AsIGxldmVsICsgMSkpKSB7CisJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJZ290byBlcnJvcjA7CisJfQorCWlmIChudW1yZWNzID49IFhGU19CTUFQX0JMT0NLX0lNSU5SRUNTKGxldmVsLCBjdXIpKSB7CisJCWlmIChsZXZlbCA+IDAgJiYgKGVycm9yID0geGZzX2JtYnRfZGVjcmVtZW50KGN1ciwgbGV2ZWwsICZqKSkpIHsKKwkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCWdvdG8gZXJyb3IwOworCQl9CisJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOworCQkqc3RhdCA9IDE7CisJCXJldHVybiAwOworCX0KKwlyYm5vID0gSU5UX0dFVChibG9jay0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCk7CisJbGJubyA9IElOVF9HRVQoYmxvY2stPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCk7CisJLyoKKwkgKiBPbmUgY2hpbGQgb2Ygcm9vdCwgbmVlZCB0byBnZXQgYSBjaGFuY2UgdG8gY29weSBpdHMgY29udGVudHMKKwkgKiBpbnRvIHRoZSByb290IGFuZCBkZWxldGUgaXQuIENhbid0IGdvIHVwIHRvIG5leHQgbGV2ZWwsCisJICogdGhlcmUncyBub3RoaW5nIHRvIGRlbGV0ZSB0aGVyZS4KKwkgKi8KKwlpZiAobGJubyA9PSBOVUxMRlNCTE9DSyAmJiByYm5vID09IE5VTExGU0JMT0NLICYmCisJICAgIGxldmVsID09IGN1ci0+YmNfbmxldmVscyAtIDIpIHsKKwkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2tpbGxyb290KGN1cikpKSB7CisJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCQlnb3RvIGVycm9yMDsKKwkJfQorCQlpZiAobGV2ZWwgPiAwICYmIChlcnJvciA9IHhmc19ibWJ0X2RlY3JlbWVudChjdXIsIGxldmVsLCAmaSkpKSB7CisJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCQlnb3RvIGVycm9yMDsKKwkJfQorCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKKwkJKnN0YXQgPSAxOworCQlyZXR1cm4gMDsKKwl9CisJQVNTRVJUKHJibm8gIT0gTlVMTEZTQkxPQ0sgfHwgbGJubyAhPSBOVUxMRlNCTE9DSyk7CisJaWYgKChlcnJvciA9IHhmc19idHJlZV9kdXBfY3Vyc29yKGN1ciwgJnRjdXIpKSkgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCWdvdG8gZXJyb3IwOworCX0KKwlibm8gPSBOVUxMRlNCTE9DSzsKKwlpZiAocmJubyAhPSBOVUxMRlNCTE9DSykgeworCQlpID0geGZzX2J0cmVlX2xhc3RyZWModGN1ciwgbGV2ZWwpOworCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9pbmNyZW1lbnQodGN1ciwgbGV2ZWwsICZpKSkpIHsKKwkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCWdvdG8gZXJyb3IwOworCQl9CisJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKwkJaSA9IHhmc19idHJlZV9sYXN0cmVjKHRjdXIsIGxldmVsKTsKKwkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCQlyYnAgPSB0Y3VyLT5iY19idWZzW2xldmVsXTsKKwkJcmlnaHQgPSBYRlNfQlVGX1RPX0JNQlRfQkxPQ0socmJwKTsKKyNpZmRlZiBERUJVRworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xibG9jayhjdXIsIHJpZ2h0LCBsZXZlbCwgcmJwKSkpIHsKKwkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCWdvdG8gZXJyb3IwOworCQl9CisjZW5kaWYKKwkJYm5vID0gSU5UX0dFVChyaWdodC0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJUKTsKKwkJaWYgKElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgLSAxID49CisJCSAgICBYRlNfQk1BUF9CTE9DS19JTUlOUkVDUyhsZXZlbCwgY3VyKSkgeworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2xzaGlmdCh0Y3VyLCBsZXZlbCwgJmkpKSkgeworCQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCQlnb3RvIGVycm9yMDsKKwkJCX0KKwkJCWlmIChpKSB7CisJCQkJQVNTRVJUKElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgPj0KKwkJCQkgICAgICAgWEZTX0JNQVBfQkxPQ0tfSU1JTlJFQ1MobGV2ZWwsIHRjdXIpKTsKKwkJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcih0Y3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CisJCQkJdGN1ciA9IE5VTEw7CisJCQkJaWYgKGxldmVsID4gMCkgeworCQkJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfZGVjcmVtZW50KGN1ciwKKwkJCQkJCQlsZXZlbCwgJmkpKSkgeworCQkJCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwKKwkJCQkJCQlFUlJPUik7CisJCQkJCQlnb3RvIGVycm9yMDsKKwkJCQkJfQorCQkJCX0KKwkJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKKwkJCQkqc3RhdCA9IDE7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkJcnJlY3MgPSBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOworCQlpZiAobGJubyAhPSBOVUxMRlNCTE9DSykgeworCQkJaSA9IHhmc19idHJlZV9maXJzdHJlYyh0Y3VyLCBsZXZlbCk7CisJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfZGVjcmVtZW50KHRjdXIsIGxldmVsLCAmaSkpKSB7CisJCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQkJCWdvdG8gZXJyb3IwOworCQkJfQorCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCQl9CisJfQorCWlmIChsYm5vICE9IE5VTExGU0JMT0NLKSB7CisJCWkgPSB4ZnNfYnRyZWVfZmlyc3RyZWModGN1ciwgbGV2ZWwpOworCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCS8qCisJCSAqIGRlY3JlbWVudCB0byBsYXN0IGluIGJsb2NrCisJCSAqLworCQlpZiAoKGVycm9yID0geGZzX2JtYnRfZGVjcmVtZW50KHRjdXIsIGxldmVsLCAmaSkpKSB7CisJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCQlnb3RvIGVycm9yMDsKKwkJfQorCQlpID0geGZzX2J0cmVlX2ZpcnN0cmVjKHRjdXIsIGxldmVsKTsKKwkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCQlsYnAgPSB0Y3VyLT5iY19idWZzW2xldmVsXTsKKwkJbGVmdCA9IFhGU19CVUZfVE9fQk1CVF9CTE9DSyhsYnApOworI2lmZGVmIERFQlVHCisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbGJsb2NrKGN1ciwgbGVmdCwgbGV2ZWwsIGxicCkpKSB7CisJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCQlnb3RvIGVycm9yMDsKKwkJfQorI2VuZGlmCisJCWJubyA9IElOVF9HRVQobGVmdC0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCk7CisJCWlmIChJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgLSAxID49CisJCSAgICBYRlNfQk1BUF9CTE9DS19JTUlOUkVDUyhsZXZlbCwgY3VyKSkgeworCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X3JzaGlmdCh0Y3VyLCBsZXZlbCwgJmkpKSkgeworCQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCQlnb3RvIGVycm9yMDsKKwkJCX0KKwkJCWlmIChpKSB7CisJCQkJQVNTRVJUKElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgPj0KKwkJCQkgICAgICAgWEZTX0JNQVBfQkxPQ0tfSU1JTlJFQ1MobGV2ZWwsIHRjdXIpKTsKKwkJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcih0Y3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CisJCQkJdGN1ciA9IE5VTEw7CisJCQkJaWYgKGxldmVsID09IDApCisJCQkJCWN1ci0+YmNfcHRyc1swXSsrOworCQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOworCQkJCSpzdGF0ID0gMTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQlscmVjcyA9IElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKKwl9CisJeGZzX2J0cmVlX2RlbF9jdXJzb3IodGN1ciwgWEZTX0JUUkVFX05PRVJST1IpOworCXRjdXIgPSBOVUxMOworCW1wID0gY3VyLT5iY19tcDsKKwlBU1NFUlQoYm5vICE9IE5VTExGU0JMT0NLKTsKKwlpZiAobGJubyAhPSBOVUxMRlNCTE9DSyAmJgorCSAgICBscmVjcyArIElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgPD0gWEZTX0JNQVBfQkxPQ0tfSU1BWFJFQ1MobGV2ZWwsIGN1cikpIHsKKwkJcmJubyA9IGJubzsKKwkJcmlnaHQgPSBibG9jazsKKwkJcmJwID0gYnA7CisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZsKG1wLCBjdXItPmJjX3RwLCBsYm5vLCAwLCAmbGJwLAorCQkJCVhGU19CTUFQX0JUUkVFX1JFRikpKSB7CisJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCQlnb3RvIGVycm9yMDsKKwkJfQorCQlsZWZ0ID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKGxicCk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbGJsb2NrKGN1ciwgbGVmdCwgbGV2ZWwsIGxicCkpKSB7CisJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCQlnb3RvIGVycm9yMDsKKwkJfQorCX0gZWxzZSBpZiAocmJubyAhPSBOVUxMRlNCTE9DSyAmJgorCQkgICBycmVjcyArIElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgPD0KKwkJICAgWEZTX0JNQVBfQkxPQ0tfSU1BWFJFQ1MobGV2ZWwsIGN1cikpIHsKKwkJbGJubyA9IGJubzsKKwkJbGVmdCA9IGJsb2NrOworCQlsYnAgPSBicDsKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZmwobXAsIGN1ci0+YmNfdHAsIHJibm8sIDAsICZyYnAsCisJCQkJWEZTX0JNQVBfQlRSRUVfUkVGKSkpIHsKKwkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCWdvdG8gZXJyb3IwOworCQl9CisJCXJpZ2h0ID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKHJicCk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbGJsb2NrKGN1ciwgcmlnaHQsIGxldmVsLCByYnApKSkgeworCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQkJZ290byBlcnJvcjA7CisJCX0KKwkJbHJlY3MgPSBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7CisJfSBlbHNlIHsKKwkJaWYgKGxldmVsID4gMCAmJiAoZXJyb3IgPSB4ZnNfYm1idF9kZWNyZW1lbnQoY3VyLCBsZXZlbCwgJmkpKSkgeworCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQkJZ290byBlcnJvcjA7CisJCX0KKwkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7CisJCSpzdGF0ID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCW51bWxyZWNzID0gSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOworCW51bXJyZWNzID0gSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKKwlpZiAobGV2ZWwgPiAwKSB7CisJCWxrcCA9IFhGU19CTUFQX0tFWV9JQUREUihsZWZ0LCBudW1scmVjcyArIDEsIGN1cik7CisJCWxwcCA9IFhGU19CTUFQX1BUUl9JQUREUihsZWZ0LCBudW1scmVjcyArIDEsIGN1cik7CisJCXJrcCA9IFhGU19CTUFQX0tFWV9JQUREUihyaWdodCwgMSwgY3VyKTsKKwkJcnBwID0gWEZTX0JNQVBfUFRSX0lBRERSKHJpZ2h0LCAxLCBjdXIpOworI2lmZGVmIERFQlVHCisJCWZvciAoaSA9IDA7IGkgPCBudW1ycmVjczsgaSsrKSB7CisJCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xwdHIoY3VyLCBJTlRfR0VUKHJwcFtpXSwgQVJDSF9DT05WRVJUKSwgbGV2ZWwpKSkgeworCQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCQlnb3RvIGVycm9yMDsKKwkJCX0KKwkJfQorI2VuZGlmCisJCW1lbWNweShsa3AsIHJrcCwgbnVtcnJlY3MgKiBzaXplb2YoKmxrcCkpOworCQltZW1jcHkobHBwLCBycHAsIG51bXJyZWNzICogc2l6ZW9mKCpscHApKTsKKwkJeGZzX2JtYnRfbG9nX2tleXMoY3VyLCBsYnAsIG51bWxyZWNzICsgMSwgbnVtbHJlY3MgKyBudW1ycmVjcyk7CisJCXhmc19ibWJ0X2xvZ19wdHJzKGN1ciwgbGJwLCBudW1scmVjcyArIDEsIG51bWxyZWNzICsgbnVtcnJlY3MpOworCX0gZWxzZSB7CisJCWxycCA9IFhGU19CTUFQX1JFQ19JQUREUihsZWZ0LCBudW1scmVjcyArIDEsIGN1cik7CisJCXJycCA9IFhGU19CTUFQX1JFQ19JQUREUihyaWdodCwgMSwgY3VyKTsKKwkJbWVtY3B5KGxycCwgcnJwLCBudW1ycmVjcyAqIHNpemVvZigqbHJwKSk7CisJCXhmc19ibWJ0X2xvZ19yZWNzKGN1ciwgbGJwLCBudW1scmVjcyArIDEsIG51bWxyZWNzICsgbnVtcnJlY3MpOworCX0KKwlJTlRfTU9EKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCwgbnVtcnJlY3MpOworCWxlZnQtPmJiX3JpZ2h0c2liID0gcmlnaHQtPmJiX3JpZ2h0c2liOyAvKiBJTlRfOiBkaXJlY3QgY29weSAqLworCXhmc19ibWJ0X2xvZ19ibG9jayhjdXIsIGxicCwgWEZTX0JCX1JJR0hUU0lCIHwgWEZTX0JCX05VTVJFQ1MpOworCWlmIChJTlRfR0VUKGxlZnQtPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpICE9IE5VTExERlNCTk8pIHsKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZmwobXAsIGN1ci0+YmNfdHAsCisJCQkJSU5UX0dFVChsZWZ0LT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSwKKwkJCQkwLCAmcnJicCwgWEZTX0JNQVBfQlRSRUVfUkVGKSkpIHsKKwkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCWdvdG8gZXJyb3IwOworCQl9CisJCXJyYmxvY2sgPSBYRlNfQlVGX1RPX0JNQlRfQkxPQ0socnJicCk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbGJsb2NrKGN1ciwgcnJibG9jaywgbGV2ZWwsIHJyYnApKSkgeworCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQkJZ290byBlcnJvcjA7CisJCX0KKwkJSU5UX1NFVChycmJsb2NrLT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQsIGxibm8pOworCQl4ZnNfYm1idF9sb2dfYmxvY2soY3VyLCBycmJwLCBYRlNfQkJfTEVGVFNJQik7CisJfQorCXhmc19ibWFwX2FkZF9mcmVlKFhGU19EQUREUl9UT19GU0IobXAsIFhGU19CVUZfQUREUihyYnApKSwgMSwKKwkJY3VyLT5iY19wcml2YXRlLmIuZmxpc3QsIG1wKTsKKwljdXItPmJjX3ByaXZhdGUuYi5pcC0+aV9kLmRpX25ibG9ja3MtLTsKKwl4ZnNfdHJhbnNfbG9nX2lub2RlKGN1ci0+YmNfdHAsIGN1ci0+YmNfcHJpdmF0ZS5iLmlwLCBYRlNfSUxPR19DT1JFKTsKKwlYRlNfVFJBTlNfTU9EX0RRVU9UX0JZSU5PKG1wLCBjdXItPmJjX3RwLCBjdXItPmJjX3ByaXZhdGUuYi5pcCwKKwkJCVhGU19UUkFOU19EUV9CQ09VTlQsIC0xTCk7CisJeGZzX3RyYW5zX2JpbnZhbChjdXItPmJjX3RwLCByYnApOworCWlmIChicCAhPSBsYnApIHsKKwkJY3VyLT5iY19idWZzW2xldmVsXSA9IGxicDsKKwkJY3VyLT5iY19wdHJzW2xldmVsXSArPSBscmVjczsKKwkJY3VyLT5iY19yYVtsZXZlbF0gPSAwOworCX0gZWxzZSBpZiAoKGVycm9yID0geGZzX2JtYnRfaW5jcmVtZW50KGN1ciwgbGV2ZWwgKyAxLCAmaSkpKSB7CisJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJZ290byBlcnJvcjA7CisJfQorCWlmIChsZXZlbCA+IDApCisJCWN1ci0+YmNfcHRyc1tsZXZlbF0tLTsKKwlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKKwkqc3RhdCA9IDI7CisJcmV0dXJuIDA7CisKK2Vycm9yMDoKKwlpZiAodGN1cikKKwkJeGZzX2J0cmVlX2RlbF9jdXJzb3IodGN1ciwgWEZTX0JUUkVFX0VSUk9SKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKyNpZmRlZiBERUJVRworLyoKKyAqIEdldCB0aGUgZGF0YSBmcm9tIHRoZSBwb2ludGVkLXRvIHJlY29yZC4KKyAqLworaW50Cit4ZnNfYm1idF9nZXRfcmVjKAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwKKwl4ZnNfZmlsZW9mZl90CQkqb2ZmLAorCXhmc19mc2Jsb2NrX3QJCSpibm8sCisJeGZzX2ZpbGJsa3NfdAkJKmxlbiwKKwl4ZnNfZXhudHN0X3QJCSpzdGF0ZSwKKwlpbnQJCQkqc3RhdCkKK3sKKwl4ZnNfYm1idF9ibG9ja190CSpibG9jazsKKwl4ZnNfYnVmX3QJCSpicDsKKyNpZmRlZiBERUJVRworCWludAkJCWVycm9yOworI2VuZGlmCisJaW50CQkJcHRyOworCXhmc19ibWJ0X3JlY190CQkqcnA7CisKKwlibG9jayA9IHhmc19ibWJ0X2dldF9ibG9jayhjdXIsIDAsICZicCk7CisJcHRyID0gY3VyLT5iY19wdHJzWzBdOworI2lmZGVmIERFQlVHCisJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19sYmxvY2soY3VyLCBibG9jaywgMCwgYnApKSkKKwkJcmV0dXJuIGVycm9yOworI2VuZGlmCisJaWYgKHB0ciA+IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgfHwgcHRyIDw9IDApIHsKKwkJKnN0YXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJcnAgPSBYRlNfQk1BUF9SRUNfSUFERFIoYmxvY2ssIHB0ciwgY3VyKTsKKwkqb2ZmID0geGZzX2JtYnRfZGlza19nZXRfc3RhcnRvZmYocnApOworCSpibm8gPSB4ZnNfYm1idF9kaXNrX2dldF9zdGFydGJsb2NrKHJwKTsKKwkqbGVuID0geGZzX2JtYnRfZGlza19nZXRfYmxvY2tjb3VudChycCk7CisJKnN0YXRlID0geGZzX2JtYnRfZGlza19nZXRfc3RhdGUocnApOworCSpzdGF0ID0gMTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKgorICogSW5zZXJ0IG9uZSByZWNvcmQvbGV2ZWwuICBSZXR1cm4gaW5mb3JtYXRpb24gdG8gdGhlIGNhbGxlcgorICogYWxsb3dpbmcgdGhlIG5leHQgbGV2ZWwgdXAgdG8gcHJvY2VlZCBpZiBuZWNlc3NhcnkuCisgKi8KK1NUQVRJQyBpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYm1idF9pbnNyZWMoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAorCWludAkJCWxldmVsLAorCXhmc19mc2Jsb2NrX3QJCSpibm9wLAorCXhmc19ibWJ0X3JlY190CQkqcmVjcCwKKwl4ZnNfYnRyZWVfY3VyX3QJCSoqY3VycCwKKwlpbnQJCQkqc3RhdCkJCS8qIG5vLWdvL2RvbmUvY29udGludWUgKi8KK3sKKwl4ZnNfYm1idF9ibG9ja190CSpibG9jazsJCS8qIGJtYXAgYnRyZWUgYmxvY2sgKi8KKwl4ZnNfYnVmX3QJCSpicDsJCS8qIGJ1ZmZlciBmb3IgYmxvY2sgKi8KKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworI2lmZGVmIFhGU19CTUJUX1RSQUNFCisJc3RhdGljIGNoYXIJCWZuYW1lW10gPSAieGZzX2JtYnRfaW5zcmVjIjsKKyNlbmRpZgorCWludAkJCWk7CQkvKiBsb29wIGluZGV4ICovCisJeGZzX2JtYnRfa2V5X3QJCWtleTsJCS8qIGJtYXAgYnRyZWUga2V5ICovCisJeGZzX2JtYnRfa2V5X3QJCSprcD1OVUxMOwkvKiBwb2ludGVyIHRvIGJtYXAgYnRyZWUga2V5ICovCisJaW50CQkJbG9nZmxhZ3M7CS8qIGlub2RlIGxvZ2dpbmcgZmxhZ3MgKi8KKwl4ZnNfZnNibG9ja190CQluYm5vOwkJLyogbmV3IGJsb2NrIG51bWJlciAqLworCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpuY3VyOwkJLyogbmV3IGJ0cmVlIGN1cnNvciAqLworCXhmc19ibWJ0X2tleV90CQlua2V5OwkJLyogbmV3IGJ0cmVlIGtleSB2YWx1ZSAqLworCXhmc19ibWJ0X3JlY190CQlucmVjOwkJLyogbmV3IHJlY29yZCBjb3VudCAqLworCWludAkJCW9wdHI7CQkvKiBvbGQga2V5L3JlY29yZCBpbmRleCAqLworCXhmc19ibWJ0X3B0cl90CQkqcHA7CQkvKiBwb2ludGVyIHRvIGJtYXAgYmxvY2sgYWRkciAqLworCWludAkJCXB0cjsJCS8qIGtleS9yZWNvcmQgaW5kZXggKi8KKwl4ZnNfYm1idF9yZWNfdAkJKnJwPU5VTEw7CS8qIHBvaW50ZXIgdG8gYm1hcCBidHJlZSByZWMgKi8KKwlpbnQJCQludW1yZWNzOworCisJQVNTRVJUKGxldmVsIDwgY3VyLT5iY19ubGV2ZWxzKTsKKwlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFTlRSWSk7CisJWEZTX0JNQlRfVFJBQ0VfQVJHSUZSKGN1ciwgbGV2ZWwsICpibm9wLCByZWNwKTsKKwluY3VyID0gKHhmc19idHJlZV9jdXJfdCAqKTA7CisJSU5UX1NFVChrZXkuYnJfc3RhcnRvZmYsIEFSQ0hfQ09OVkVSVCwKKwkJeGZzX2JtYnRfZGlza19nZXRfc3RhcnRvZmYocmVjcCkpOworCW9wdHIgPSBwdHIgPSBjdXItPmJjX3B0cnNbbGV2ZWxdOworCWlmIChwdHIgPT0gMCkgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKKwkJKnN0YXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJWEZTX1NUQVRTX0lOQyh4c19ibWJ0X2luc3JlYyk7CisJYmxvY2sgPSB4ZnNfYm1idF9nZXRfYmxvY2soY3VyLCBsZXZlbCwgJmJwKTsKKwludW1yZWNzID0gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKKyNpZmRlZiBERUJVRworCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbGJsb2NrKGN1ciwgYmxvY2ssIGxldmVsLCBicCkpKSB7CisJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlpZiAocHRyIDw9IG51bXJlY3MpIHsKKwkJaWYgKGxldmVsID09IDApIHsKKwkJCXJwID0gWEZTX0JNQVBfUkVDX0lBRERSKGJsb2NrLCBwdHIsIGN1cik7CisJCQl4ZnNfYnRyZWVfY2hlY2tfcmVjKFhGU19CVE5VTV9CTUFQLCByZWNwLCBycCk7CisJCX0gZWxzZSB7CisJCQlrcCA9IFhGU19CTUFQX0tFWV9JQUREUihibG9jaywgcHRyLCBjdXIpOworCQkJeGZzX2J0cmVlX2NoZWNrX2tleShYRlNfQlROVU1fQk1BUCwgJmtleSwga3ApOworCQl9CisJfQorI2VuZGlmCisJbmJubyA9IE5VTExGU0JMT0NLOworCWlmIChudW1yZWNzID09IFhGU19CTUFQX0JMT0NLX0lNQVhSRUNTKGxldmVsLCBjdXIpKSB7CisJCWlmIChudW1yZWNzIDwgWEZTX0JNQVBfQkxPQ0tfRE1BWFJFQ1MobGV2ZWwsIGN1cikpIHsKKwkJCS8qCisJCQkgKiBBIHJvb3QgYmxvY2ssIHRoYXQgY2FuIGJlIG1hZGUgYmlnZ2VyLgorCQkJICovCisJCQl4ZnNfaXJvb3RfcmVhbGxvYyhjdXItPmJjX3ByaXZhdGUuYi5pcCwgMSwKKwkJCQljdXItPmJjX3ByaXZhdGUuYi53aGljaGZvcmspOworCQkJYmxvY2sgPSB4ZnNfYm1idF9nZXRfYmxvY2soY3VyLCBsZXZlbCwgJmJwKTsKKwkJfSBlbHNlIGlmIChsZXZlbCA9PSBjdXItPmJjX25sZXZlbHMgLSAxKSB7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfbmV3cm9vdChjdXIsICZsb2dmbGFncywgc3RhdCkpIHx8CisJCQkgICAgKnN0YXQgPT0gMCkgeworCQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQl9CisJCQl4ZnNfdHJhbnNfbG9nX2lub2RlKGN1ci0+YmNfdHAsIGN1ci0+YmNfcHJpdmF0ZS5iLmlwLAorCQkJCWxvZ2ZsYWdzKTsKKwkJCWJsb2NrID0geGZzX2JtYnRfZ2V0X2Jsb2NrKGN1ciwgbGV2ZWwsICZicCk7CisJCX0gZWxzZSB7CisJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfcnNoaWZ0KGN1ciwgbGV2ZWwsICZpKSkpIHsKKwkJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCQkJcmV0dXJuIGVycm9yOworCQkJfQorCQkJaWYgKGkpIHsKKwkJCQkvKiBub3RoaW5nICovCisJCQl9IGVsc2UgeworCQkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9sc2hpZnQoY3VyLCBsZXZlbCwgJmkpKSkgeworCQkJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCQkJCXJldHVybiBlcnJvcjsKKwkJCQl9CisJCQkJaWYgKGkpIHsKKwkJCQkJb3B0ciA9IHB0ciA9IGN1ci0+YmNfcHRyc1tsZXZlbF07CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKChlcnJvciA9IHhmc19ibWJ0X3NwbGl0KGN1ciwgbGV2ZWwsCisJCQkJCQkJJm5ibm8sICZua2V5LCAmbmN1ciwKKwkJCQkJCQkmaSkpKSB7CisJCQkJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLAorCQkJCQkJCUVSUk9SKTsKKwkJCQkJCXJldHVybiBlcnJvcjsKKwkJCQkJfQorCQkJCQlpZiAoaSkgeworCQkJCQkJYmxvY2sgPSB4ZnNfYm1idF9nZXRfYmxvY2soCisJCQkJCQkJICAgIGN1ciwgbGV2ZWwsICZicCk7CisjaWZkZWYgREVCVUcKKwkJCQkJCWlmICgoZXJyb3IgPQorCQkJCQkJICAgIHhmc19idHJlZV9jaGVja19sYmxvY2soY3VyLAorCQkJCQkJCSAgICBibG9jaywgbGV2ZWwsIGJwKSkpIHsKKwkJCQkJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoCisJCQkJCQkJCWN1ciwgRVJST1IpOworCQkJCQkJCXJldHVybiBlcnJvcjsKKwkJCQkJCX0KKyNlbmRpZgorCQkJCQkJcHRyID0gY3VyLT5iY19wdHJzW2xldmVsXTsKKwkJCQkJCXhmc19ibWJ0X2Rpc2tfc2V0X2FsbGYoJm5yZWMsCisJCQkJCQkJbmtleS5icl9zdGFydG9mZiwgMCwgMCwKKwkJCQkJCQlYRlNfRVhUX05PUk0pOworCQkJCQl9IGVsc2UgeworCQkJCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwKKwkJCQkJCQlFWElUKTsKKwkJCQkJCSpzdGF0ID0gMDsKKwkJCQkJCXJldHVybiAwOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCW51bXJlY3MgPSBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOworCWlmIChsZXZlbCA+IDApIHsKKwkJa3AgPSBYRlNfQk1BUF9LRVlfSUFERFIoYmxvY2ssIDEsIGN1cik7CisJCXBwID0gWEZTX0JNQVBfUFRSX0lBRERSKGJsb2NrLCAxLCBjdXIpOworI2lmZGVmIERFQlVHCisJCWZvciAoaSA9IG51bXJlY3M7IGkgPj0gcHRyOyBpLS0pIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbHB0cihjdXIsIElOVF9HRVQocHBbaSAtIDFdLCBBUkNIX0NPTlZFUlQpLAorCQkJCQlsZXZlbCkpKSB7CisJCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQkJCXJldHVybiBlcnJvcjsKKwkJCX0KKwkJfQorI2VuZGlmCisJCW1lbW1vdmUoJmtwW3B0cl0sICZrcFtwdHIgLSAxXSwKKwkJCShudW1yZWNzIC0gcHRyICsgMSkgKiBzaXplb2YoKmtwKSk7CisJCW1lbW1vdmUoJnBwW3B0cl0sICZwcFtwdHIgLSAxXSwgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KKwkJCShudW1yZWNzIC0gcHRyICsgMSkgKiBzaXplb2YoKnBwKSk7CisjaWZkZWYgREVCVUcKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19scHRyKGN1ciwgKHhmc19ibWJ0X3B0cl90KSpibm9wLAorCQkJCWxldmVsKSkpIHsKKwkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorI2VuZGlmCisJCWtwW3B0ciAtIDFdID0ga2V5OworCQlJTlRfU0VUKHBwW3B0ciAtIDFdLCBBUkNIX0NPTlZFUlQsICpibm9wKTsKKwkJbnVtcmVjcysrOworCQlJTlRfU0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIG51bXJlY3MpOworCQl4ZnNfYm1idF9sb2dfa2V5cyhjdXIsIGJwLCBwdHIsIG51bXJlY3MpOworCQl4ZnNfYm1idF9sb2dfcHRycyhjdXIsIGJwLCBwdHIsIG51bXJlY3MpOworCX0gZWxzZSB7CisJCXJwID0gWEZTX0JNQVBfUkVDX0lBRERSKGJsb2NrLCAxLCBjdXIpOworCQltZW1tb3ZlKCZycFtwdHJdLCAmcnBbcHRyIC0gMV0sCisJCQkobnVtcmVjcyAtIHB0ciArIDEpICogc2l6ZW9mKCpycCkpOworCQlycFtwdHIgLSAxXSA9ICpyZWNwOworCQludW1yZWNzKys7CisJCUlOVF9TRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCwgbnVtcmVjcyk7CisJCXhmc19ibWJ0X2xvZ19yZWNzKGN1ciwgYnAsIHB0ciwgbnVtcmVjcyk7CisJfQorCXhmc19ibWJ0X2xvZ19ibG9jayhjdXIsIGJwLCBYRlNfQkJfTlVNUkVDUyk7CisjaWZkZWYgREVCVUcKKwlpZiAocHRyIDwgbnVtcmVjcykgeworCQlpZiAobGV2ZWwgPT0gMCkKKwkJCXhmc19idHJlZV9jaGVja19yZWMoWEZTX0JUTlVNX0JNQVAsIHJwICsgcHRyIC0gMSwKKwkJCQlycCArIHB0cik7CisJCWVsc2UKKwkJCXhmc19idHJlZV9jaGVja19rZXkoWEZTX0JUTlVNX0JNQVAsIGtwICsgcHRyIC0gMSwKKwkJCQlrcCArIHB0cik7CisJfQorI2VuZGlmCisJaWYgKG9wdHIgPT0gMSAmJiAoZXJyb3IgPSB4ZnNfYm1idF91cGRrZXkoY3VyLCAma2V5LCBsZXZlbCArIDEpKSkgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCXJldHVybiBlcnJvcjsKKwl9CisJKmJub3AgPSBuYm5vOworCWlmIChuYm5vICE9IE5VTExGU0JMT0NLKSB7CisJCSpyZWNwID0gbnJlYzsKKwkJKmN1cnAgPSBuY3VyOworCX0KKwlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKKwkqc3RhdCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK1NUQVRJQyBpbnQKK3hmc19ibWJ0X2tpbGxyb290KAorCXhmc19idHJlZV9jdXJfdAkJKmN1cikKK3sKKwl4ZnNfYm1idF9ibG9ja190CSpibG9jazsKKwl4ZnNfYm1idF9ibG9ja190CSpjYmxvY2s7CisJeGZzX2J1Zl90CQkqY2JwOworCXhmc19ibWJ0X2tleV90CQkqY2twOworCXhmc19ibWJ0X3B0cl90CQkqY3BwOworI2lmZGVmIERFQlVHCisJaW50CQkJZXJyb3I7CisjZW5kaWYKKyNpZmRlZiBYRlNfQk1CVF9UUkFDRQorCXN0YXRpYyBjaGFyCQlmbmFtZVtdID0gInhmc19ibWJ0X2tpbGxyb290IjsKKyNlbmRpZgorCWludAkJCWk7CisJeGZzX2JtYnRfa2V5X3QJCSprcDsKKwl4ZnNfaW5vZGVfdAkJKmlwOworCXhmc19pZm9ya190CQkqaWZwOworCWludAkJCWxldmVsOworCXhmc19ibWJ0X3B0cl90CQkqcHA7CisKKwlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFTlRSWSk7CisJbGV2ZWwgPSBjdXItPmJjX25sZXZlbHMgLSAxOworCUFTU0VSVChsZXZlbCA+PSAxKTsKKwkvKgorCSAqIERvbid0IGRlYWwgd2l0aCB0aGUgcm9vdCBibG9jayBuZWVkcyB0byBiZSBhIGxlYWYgY2FzZS4KKwkgKiBXZSdyZSBqdXN0IGdvaW5nIHRvIHR1cm4gdGhlIHRoaW5nIGJhY2sgaW50byBleHRlbnRzIGFueXdheS4KKwkgKi8KKwlpZiAobGV2ZWwgPT0gMSkgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKKwkJcmV0dXJuIDA7CisJfQorCWJsb2NrID0geGZzX2JtYnRfZ2V0X2Jsb2NrKGN1ciwgbGV2ZWwsICZjYnApOworCS8qCisJICogR2l2ZSB1cCBpZiB0aGUgcm9vdCBoYXMgbXVsdGlwbGUgY2hpbGRyZW4uCisJICovCisJaWYgKElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgIT0gMSkgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogT25seSBkbyB0aGlzIGlmIHRoZSBuZXh0IGxldmVsIHdpbGwgZml0LgorCSAqIFRoZW4gdGhlIGRhdGEgbXVzdCBiZSBjb3BpZWQgdXAgdG8gdGhlIGlub2RlLAorCSAqIGluc3RlYWQgb2YgZnJlZWluZyB0aGUgcm9vdCB5b3UgZnJlZSB0aGUgbmV4dCBsZXZlbC4KKwkgKi8KKwljYnAgPSBjdXItPmJjX2J1ZnNbbGV2ZWwgLSAxXTsKKwljYmxvY2sgPSBYRlNfQlVGX1RPX0JNQlRfQkxPQ0soY2JwKTsKKwlpZiAoSU5UX0dFVChjYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgPiBYRlNfQk1BUF9CTE9DS19ETUFYUkVDUyhsZXZlbCwgY3VyKSkgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKKwkJcmV0dXJuIDA7CisJfQorCUFTU0VSVChJTlRfR0VUKGNibG9jay0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJUKSA9PSBOVUxMREZTQk5PKTsKKwlBU1NFUlQoSU5UX0dFVChjYmxvY2stPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpID09IE5VTExERlNCTk8pOworCWlwID0gY3VyLT5iY19wcml2YXRlLmIuaXA7CisJaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgY3VyLT5iY19wcml2YXRlLmIud2hpY2hmb3JrKTsKKwlBU1NFUlQoWEZTX0JNQVBfQkxPQ0tfSU1BWFJFQ1MobGV2ZWwsIGN1cikgPT0KKwkgICAgICAgWEZTX0JNQVBfQlJPT1RfTUFYUkVDUyhpZnAtPmlmX2Jyb290X2J5dGVzKSk7CisJaSA9IChpbnQpKElOVF9HRVQoY2Jsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIC0gWEZTX0JNQVBfQkxPQ0tfSU1BWFJFQ1MobGV2ZWwsIGN1cikpOworCWlmIChpKSB7CisJCXhmc19pcm9vdF9yZWFsbG9jKGlwLCBpLCBjdXItPmJjX3ByaXZhdGUuYi53aGljaGZvcmspOworCQlibG9jayA9IGlmcC0+aWZfYnJvb3Q7CisJfQorCUlOVF9NT0QoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCwgaSk7CisJQVNTRVJUKElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgPT0gSU5UX0dFVChjYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpOworCWtwID0gWEZTX0JNQVBfS0VZX0lBRERSKGJsb2NrLCAxLCBjdXIpOworCWNrcCA9IFhGU19CTUFQX0tFWV9JQUREUihjYmxvY2ssIDEsIGN1cik7CisJbWVtY3B5KGtwLCBja3AsIElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKiBzaXplb2YoKmtwKSk7CisJcHAgPSBYRlNfQk1BUF9QVFJfSUFERFIoYmxvY2ssIDEsIGN1cik7CisJY3BwID0gWEZTX0JNQVBfUFRSX0lBRERSKGNibG9jaywgMSwgY3VyKTsKKyNpZmRlZiBERUJVRworCWZvciAoaSA9IDA7IGkgPCBJTlRfR0VUKGNibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsgaSsrKSB7CisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbHB0cihjdXIsIElOVF9HRVQoY3BwW2ldLCBBUkNIX0NPTlZFUlQpLCBsZXZlbCAtIDEpKSkgeworCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQkJcmV0dXJuIGVycm9yOworCQl9CisJfQorI2VuZGlmCisJbWVtY3B5KHBwLCBjcHAsIElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKiBzaXplb2YoKnBwKSk7CisJeGZzX2JtYXBfYWRkX2ZyZWUoWEZTX0RBRERSX1RPX0ZTQihjdXItPmJjX21wLCBYRlNfQlVGX0FERFIoY2JwKSksIDEsCisJCQljdXItPmJjX3ByaXZhdGUuYi5mbGlzdCwgY3VyLT5iY19tcCk7CisJaXAtPmlfZC5kaV9uYmxvY2tzLS07CisJWEZTX1RSQU5TX01PRF9EUVVPVF9CWUlOTyhjdXItPmJjX21wLCBjdXItPmJjX3RwLCBpcCwKKwkJCVhGU19UUkFOU19EUV9CQ09VTlQsIC0xTCk7CisJeGZzX3RyYW5zX2JpbnZhbChjdXItPmJjX3RwLCBjYnApOworCWN1ci0+YmNfYnVmc1tsZXZlbCAtIDFdID0gTlVMTDsKKwlJTlRfTU9EKGJsb2NrLT5iYl9sZXZlbCwgQVJDSF9DT05WRVJULCAtMSk7CisJeGZzX3RyYW5zX2xvZ19pbm9kZShjdXItPmJjX3RwLCBpcCwKKwkJWEZTX0lMT0dfQ09SRSB8IFhGU19JTE9HX0ZCUk9PVChjdXItPmJjX3ByaXZhdGUuYi53aGljaGZvcmspKTsKKwljdXItPmJjX25sZXZlbHMtLTsKKwlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIExvZyBrZXkgdmFsdWVzIGZyb20gdGhlIGJ0cmVlIGJsb2NrLgorICovCitTVEFUSUMgdm9pZAoreGZzX2JtYnRfbG9nX2tleXMoCisJeGZzX2J0cmVlX2N1cl90CSpjdXIsCisJeGZzX2J1Zl90CSpicCwKKwlpbnQJCWtmaXJzdCwKKwlpbnQJCWtsYXN0KQoreworI2lmZGVmIFhGU19CTUJUX1RSQUNFCisJc3RhdGljIGNoYXIJZm5hbWVbXSA9ICJ4ZnNfYm1idF9sb2dfa2V5cyI7CisjZW5kaWYKKwl4ZnNfdHJhbnNfdAkqdHA7CisKKwlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFTlRSWSk7CisJWEZTX0JNQlRfVFJBQ0VfQVJHQklJKGN1ciwgYnAsIGtmaXJzdCwga2xhc3QpOworCXRwID0gY3VyLT5iY190cDsKKwlpZiAoYnApIHsKKwkJeGZzX2JtYnRfYmxvY2tfdAkqYmxvY2s7CisJCWludAkJCWZpcnN0OworCQl4ZnNfYm1idF9rZXlfdAkJKmtwOworCQlpbnQJCQlsYXN0OworCisJCWJsb2NrID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKGJwKTsKKwkJa3AgPSBYRlNfQk1BUF9LRVlfREFERFIoYmxvY2ssIDEsIGN1cik7CisJCWZpcnN0ID0gKGludCkoKHhmc19jYWRkcl90KSZrcFtrZmlyc3QgLSAxXSAtICh4ZnNfY2FkZHJfdClibG9jayk7CisJCWxhc3QgPSAoaW50KSgoKHhmc19jYWRkcl90KSZrcFtrbGFzdF0gLSAxKSAtICh4ZnNfY2FkZHJfdClibG9jayk7CisJCXhmc190cmFuc19sb2dfYnVmKHRwLCBicCwgZmlyc3QsIGxhc3QpOworCX0gZWxzZSB7CisJCXhmc19pbm9kZV90CQkgKmlwOworCisJCWlwID0gY3VyLT5iY19wcml2YXRlLmIuaXA7CisJCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLAorCQkJWEZTX0lMT0dfRkJST09UKGN1ci0+YmNfcHJpdmF0ZS5iLndoaWNoZm9yaykpOworCX0KKwlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKK30KKworLyoKKyAqIExvZyBwb2ludGVyIHZhbHVlcyBmcm9tIHRoZSBidHJlZSBibG9jay4KKyAqLworU1RBVElDIHZvaWQKK3hmc19ibWJ0X2xvZ19wdHJzKAorCXhmc19idHJlZV9jdXJfdAkqY3VyLAorCXhmc19idWZfdAkqYnAsCisJaW50CQlwZmlyc3QsCisJaW50CQlwbGFzdCkKK3sKKyNpZmRlZiBYRlNfQk1CVF9UUkFDRQorCXN0YXRpYyBjaGFyCWZuYW1lW10gPSAieGZzX2JtYnRfbG9nX3B0cnMiOworI2VuZGlmCisJeGZzX3RyYW5zX3QJKnRwOworCisJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRU5UUlkpOworCVhGU19CTUJUX1RSQUNFX0FSR0JJSShjdXIsIGJwLCBwZmlyc3QsIHBsYXN0KTsKKwl0cCA9IGN1ci0+YmNfdHA7CisJaWYgKGJwKSB7CisJCXhmc19ibWJ0X2Jsb2NrX3QJKmJsb2NrOworCQlpbnQJCQlmaXJzdDsKKwkJaW50CQkJbGFzdDsKKwkJeGZzX2JtYnRfcHRyX3QJCSpwcDsKKworCQlibG9jayA9IFhGU19CVUZfVE9fQk1CVF9CTE9DSyhicCk7CisJCXBwID0gWEZTX0JNQVBfUFRSX0RBRERSKGJsb2NrLCAxLCBjdXIpOworCQlmaXJzdCA9IChpbnQpKCh4ZnNfY2FkZHJfdCkmcHBbcGZpcnN0IC0gMV0gLSAoeGZzX2NhZGRyX3QpYmxvY2spOworCQlsYXN0ID0gKGludCkoKCh4ZnNfY2FkZHJfdCkmcHBbcGxhc3RdIC0gMSkgLSAoeGZzX2NhZGRyX3QpYmxvY2spOworCQl4ZnNfdHJhbnNfbG9nX2J1Zih0cCwgYnAsIGZpcnN0LCBsYXN0KTsKKwl9IGVsc2UgeworCQl4ZnNfaW5vZGVfdAkJKmlwOworCisJCWlwID0gY3VyLT5iY19wcml2YXRlLmIuaXA7CisJCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLAorCQkJWEZTX0lMT0dfRkJST09UKGN1ci0+YmNfcHJpdmF0ZS5iLndoaWNoZm9yaykpOworCX0KKwlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKK30KKworLyoKKyAqIExvb2t1cCB0aGUgcmVjb3JkLiAgVGhlIGN1cnNvciBpcyBtYWRlIHRvIHBvaW50IHRvIGl0LCBiYXNlZCBvbiBkaXIuCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19ibWJ0X2xvb2t1cCgKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCisJeGZzX2xvb2t1cF90CQlkaXIsCisJaW50CQkJKnN0YXQpCQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK3sKKwl4ZnNfYm1idF9ibG9ja190CSpibG9jaz1OVUxMOworCXhmc19idWZfdAkJKmJwOworCXhmc19kYWRkcl90CQlkOworCXhmc19zZmlsb2ZmX3QJCWRpZmY7CisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKyNpZmRlZiBYRlNfQk1CVF9UUkFDRQorCXN0YXRpYyBjaGFyCWZuYW1lW10gPSAieGZzX2JtYnRfbG9va3VwIjsKKyNlbmRpZgorCXhmc19mc2Jsb2NrX3QJCWZzYm5vPTA7CisJaW50CQkJaGlnaDsKKwlpbnQJCQlpOworCWludAkJCWtleW5vPTA7CisJeGZzX2JtYnRfa2V5X3QJCSpra2Jhc2U9TlVMTDsKKwl4ZnNfYm1idF9rZXlfdAkJKmtrcDsKKwl4ZnNfYm1idF9yZWNfdAkJKmtyYmFzZT1OVUxMOworCXhmc19ibWJ0X3JlY190CQkqa3JwOworCWludAkJCWxldmVsOworCWludAkJCWxvdzsKKwl4ZnNfbW91bnRfdAkJKm1wOworCXhmc19ibWJ0X3B0cl90CQkqcHA7CisJeGZzX2JtYnRfaXJlY190CQkqcnA7CisJeGZzX2ZpbGVvZmZfdAkJc3RhcnRvZmY7CisJeGZzX3RyYW5zX3QJCSp0cDsKKworCVhGU19TVEFUU19JTkMoeHNfYm1idF9sb29rdXApOworCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVOVFJZKTsKKwlYRlNfQk1CVF9UUkFDRV9BUkdJKGN1ciwgKGludClkaXIpOworCXRwID0gY3VyLT5iY190cDsKKwltcCA9IGN1ci0+YmNfbXA7CisJcnAgPSAmY3VyLT5iY19yZWMuYjsKKwlmb3IgKGxldmVsID0gY3VyLT5iY19ubGV2ZWxzIC0gMSwgZGlmZiA9IDE7IGxldmVsID49IDA7IGxldmVsLS0pIHsKKwkJaWYgKGxldmVsIDwgY3VyLT5iY19ubGV2ZWxzIC0gMSkgeworCQkJZCA9IFhGU19GU0JfVE9fREFERFIobXAsIGZzYm5vKTsKKwkJCWJwID0gY3VyLT5iY19idWZzW2xldmVsXTsKKwkJCWlmIChicCAmJiBYRlNfQlVGX0FERFIoYnApICE9IGQpCisJCQkJYnAgPSAoeGZzX2J1Zl90ICopMDsKKwkJCWlmICghYnApIHsKKwkJCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmbChtcCwgdHAsIGZzYm5vLAorCQkJCQkJMCwgJmJwLCBYRlNfQk1BUF9CVFJFRV9SRUYpKSkgeworCQkJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCQkJCXJldHVybiBlcnJvcjsKKwkJCQl9CisJCQkJeGZzX2J0cmVlX3NldGJ1ZihjdXIsIGxldmVsLCBicCk7CisJCQkJYmxvY2sgPSBYRlNfQlVGX1RPX0JNQlRfQkxPQ0soYnApOworCQkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbGJsb2NrKGN1ciwgYmxvY2ssCisJCQkJCQlsZXZlbCwgYnApKSkgeworCQkJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCQkJCXJldHVybiBlcnJvcjsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQlibG9jayA9IFhGU19CVUZfVE9fQk1CVF9CTE9DSyhicCk7CisJCX0gZWxzZQorCQkJYmxvY2sgPSB4ZnNfYm1idF9nZXRfYmxvY2soY3VyLCBsZXZlbCwgJmJwKTsKKwkJaWYgKGRpZmYgPT0gMCkKKwkJCWtleW5vID0gMTsKKwkJZWxzZSB7CisJCQlpZiAobGV2ZWwgPiAwKQorCQkJCWtrYmFzZSA9IFhGU19CTUFQX0tFWV9JQUREUihibG9jaywgMSwgY3VyKTsKKwkJCWVsc2UKKwkJCQlrcmJhc2UgPSBYRlNfQk1BUF9SRUNfSUFERFIoYmxvY2ssIDEsIGN1cik7CisJCQlsb3cgPSAxOworCQkJaWYgKCEoaGlnaCA9IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpKSB7CisJCQkJQVNTRVJUKGxldmVsID09IDApOworCQkJCWN1ci0+YmNfcHRyc1swXSA9IGRpciAhPSBYRlNfTE9PS1VQX0xFOworCQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOworCQkJCSpzdGF0ID0gMDsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXdoaWxlIChsb3cgPD0gaGlnaCkgeworCQkJCVhGU19TVEFUU19JTkMoeHNfYm1idF9jb21wYXJlKTsKKwkJCQlrZXlubyA9IChsb3cgKyBoaWdoKSA+PiAxOworCQkJCWlmIChsZXZlbCA+IDApIHsKKwkJCQkJa2twID0ga2tiYXNlICsga2V5bm8gLSAxOworCQkJCQlzdGFydG9mZiA9IElOVF9HRVQoa2twLT5icl9zdGFydG9mZiwgQVJDSF9DT05WRVJUKTsKKwkJCQl9IGVsc2UgeworCQkJCQlrcnAgPSBrcmJhc2UgKyBrZXlubyAtIDE7CisJCQkJCXN0YXJ0b2ZmID0geGZzX2JtYnRfZGlza19nZXRfc3RhcnRvZmYoa3JwKTsKKwkJCQl9CisJCQkJZGlmZiA9ICh4ZnNfc2ZpbG9mZl90KQorCQkJCQkJKHN0YXJ0b2ZmIC0gcnAtPmJyX3N0YXJ0b2ZmKTsKKwkJCQlpZiAoZGlmZiA8IDApCisJCQkJCWxvdyA9IGtleW5vICsgMTsKKwkJCQllbHNlIGlmIChkaWZmID4gMCkKKwkJCQkJaGlnaCA9IGtleW5vIC0gMTsKKwkJCQllbHNlCisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChsZXZlbCA+IDApIHsKKwkJCWlmIChkaWZmID4gMCAmJiAtLWtleW5vIDwgMSkKKwkJCQlrZXlubyA9IDE7CisJCQlwcCA9IFhGU19CTUFQX1BUUl9JQUREUihibG9jaywga2V5bm8sIGN1cik7CisjaWZkZWYgREVCVUcKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbHB0cihjdXIsIElOVF9HRVQoKnBwLCBBUkNIX0NPTlZFUlQpLCBsZXZlbCkpKSB7CisJCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQkJCXJldHVybiBlcnJvcjsKKwkJCX0KKyNlbmRpZgorCQkJZnNibm8gPSBJTlRfR0VUKCpwcCwgQVJDSF9DT05WRVJUKTsKKwkJCWN1ci0+YmNfcHRyc1tsZXZlbF0gPSBrZXlubzsKKwkJfQorCX0KKwlpZiAoZGlyICE9IFhGU19MT09LVVBfTEUgJiYgZGlmZiA8IDApIHsKKwkJa2V5bm8rKzsKKwkJLyoKKwkJICogSWYgZ2Ugc2VhcmNoIGFuZCB3ZSB3ZW50IG9mZiB0aGUgZW5kIG9mIHRoZSBibG9jaywgYnV0IGl0J3MKKwkJICogbm90IHRoZSBsYXN0IGJsb2NrLCB3ZSdyZSBpbiB0aGUgd3JvbmcgYmxvY2suCisJCSAqLworCQlpZiAoZGlyID09IFhGU19MT09LVVBfR0UgJiYga2V5bm8gPiBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICYmCisJCSAgICBJTlRfR0VUKGJsb2NrLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSAhPSBOVUxMREZTQk5PKSB7CisJCQljdXItPmJjX3B0cnNbMF0gPSBrZXlubzsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1idF9pbmNyZW1lbnQoY3VyLCAwLCAmaSkpKSB7CisJCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQkJCXJldHVybiBlcnJvcjsKKwkJCX0KKwkJCVhGU19XQU5UX0NPUlJVUFRFRF9SRVRVUk4oaSA9PSAxKTsKKwkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOworCQkJKnN0YXQgPSAxOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJZWxzZSBpZiAoZGlyID09IFhGU19MT09LVVBfTEUgJiYgZGlmZiA+IDApCisJCWtleW5vLS07CisJY3VyLT5iY19wdHJzWzBdID0ga2V5bm87CisJaWYgKGtleW5vID09IDAgfHwga2V5bm8gPiBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKSB7CisJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOworCQkqc3RhdCA9IDA7CisJfSBlbHNlIHsKKwkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7CisJCSpzdGF0ID0gKChkaXIgIT0gWEZTX0xPT0tVUF9FUSkgfHwgKGRpZmYgPT0gMCkpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE1vdmUgMSByZWNvcmQgbGVmdCBmcm9tIGN1ci9sZXZlbCBpZiBwb3NzaWJsZS4KKyAqIFVwZGF0ZSBjdXIgdG8gcmVmbGVjdCB0aGUgbmV3IHBhdGguCisgKi8KK1NUQVRJQyBpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYm1idF9sc2hpZnQoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAorCWludAkJCWxldmVsLAorCWludAkJCSpzdGF0KQkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKyNpZmRlZiBYRlNfQk1CVF9UUkFDRQorCXN0YXRpYyBjaGFyCQlmbmFtZVtdID0gInhmc19ibWJ0X2xzaGlmdCI7CisjZW5kaWYKKyNpZmRlZiBERUJVRworCWludAkJCWk7CQkvKiBsb29wIGNvdW50ZXIgKi8KKyNlbmRpZgorCXhmc19ibWJ0X2tleV90CQlrZXk7CQkvKiBibWFwIGJ0cmVlIGtleSAqLworCXhmc19idWZfdAkJKmxicDsJCS8qIGxlZnQgYnVmZmVyIHBvaW50ZXIgKi8KKwl4ZnNfYm1idF9ibG9ja190CSpsZWZ0OwkJLyogbGVmdCBidHJlZSBibG9jayAqLworCXhmc19ibWJ0X2tleV90CQkqbGtwPU5VTEw7CS8qIGxlZnQgYnRyZWUga2V5ICovCisJeGZzX2JtYnRfcHRyX3QJCSpscHA7CQkvKiBsZWZ0IGFkZHJlc3MgcG9pbnRlciAqLworCWludAkJCWxyZWNzOwkJLyogbGVmdCByZWNvcmQgY291bnQgKi8KKwl4ZnNfYm1idF9yZWNfdAkJKmxycD1OVUxMOwkvKiBsZWZ0IHJlY29yZCBwb2ludGVyICovCisJeGZzX21vdW50X3QJCSptcDsJCS8qIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50ICovCisJeGZzX2J1Zl90CQkqcmJwOwkJLyogcmlnaHQgYnVmZmVyIHBvaW50ZXIgKi8KKwl4ZnNfYm1idF9ibG9ja190CSpyaWdodDsJCS8qIHJpZ2h0IGJ0cmVlIGJsb2NrICovCisJeGZzX2JtYnRfa2V5X3QJCSpya3A9TlVMTDsJLyogcmlnaHQgYnRyZWUga2V5ICovCisJeGZzX2JtYnRfcHRyX3QJCSpycHA9TlVMTDsJLyogcmlnaHQgYWRkcmVzcyBwb2ludGVyICovCisJeGZzX2JtYnRfcmVjX3QJCSpycnA9TlVMTDsJLyogcmlnaHQgcmVjb3JkIHBvaW50ZXIgKi8KKwlpbnQJCQlycmVjczsJCS8qIHJpZ2h0IHJlY29yZCBjb3VudCAqLworCisJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRU5UUlkpOworCVhGU19CTUJUX1RSQUNFX0FSR0koY3VyLCBsZXZlbCk7CisJaWYgKGxldmVsID09IGN1ci0+YmNfbmxldmVscyAtIDEpIHsKKwkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7CisJCSpzdGF0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCXJicCA9IGN1ci0+YmNfYnVmc1tsZXZlbF07CisJcmlnaHQgPSBYRlNfQlVGX1RPX0JNQlRfQkxPQ0socmJwKTsKKyNpZmRlZiBERUJVRworCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbGJsb2NrKGN1ciwgcmlnaHQsIGxldmVsLCByYnApKSkgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCXJldHVybiBlcnJvcjsKKwl9CisjZW5kaWYKKwlpZiAoSU5UX0dFVChyaWdodC0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJUKSA9PSBOVUxMREZTQk5PKSB7CisJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOworCQkqc3RhdCA9IDA7CisJCXJldHVybiAwOworCX0KKwlpZiAoY3VyLT5iY19wdHJzW2xldmVsXSA8PSAxKSB7CisJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOworCQkqc3RhdCA9IDA7CisJCXJldHVybiAwOworCX0KKwltcCA9IGN1ci0+YmNfbXA7CisJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZmwobXAsIGN1ci0+YmNfdHAsIElOVF9HRVQocmlnaHQtPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCksIDAsCisJCQkmbGJwLCBYRlNfQk1BUF9CVFJFRV9SRUYpKSkgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCXJldHVybiBlcnJvcjsKKwl9CisJbGVmdCA9IFhGU19CVUZfVE9fQk1CVF9CTE9DSyhsYnApOworCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbGJsb2NrKGN1ciwgbGVmdCwgbGV2ZWwsIGxicCkpKSB7CisJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlpZiAoSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpID09IFhGU19CTUFQX0JMT0NLX0lNQVhSRUNTKGxldmVsLCBjdXIpKSB7CisJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOworCQkqc3RhdCA9IDA7CisJCXJldHVybiAwOworCX0KKwlscmVjcyA9IElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSArIDE7CisJaWYgKGxldmVsID4gMCkgeworCQlsa3AgPSBYRlNfQk1BUF9LRVlfSUFERFIobGVmdCwgbHJlY3MsIGN1cik7CisJCXJrcCA9IFhGU19CTUFQX0tFWV9JQUREUihyaWdodCwgMSwgY3VyKTsKKwkJKmxrcCA9ICpya3A7CisJCXhmc19ibWJ0X2xvZ19rZXlzKGN1ciwgbGJwLCBscmVjcywgbHJlY3MpOworCQlscHAgPSBYRlNfQk1BUF9QVFJfSUFERFIobGVmdCwgbHJlY3MsIGN1cik7CisJCXJwcCA9IFhGU19CTUFQX1BUUl9JQUREUihyaWdodCwgMSwgY3VyKTsKKyNpZmRlZiBERUJVRworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xwdHIoY3VyLCBJTlRfR0VUKCpycHAsIEFSQ0hfQ09OVkVSVCksIGxldmVsKSkpIHsKKwkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorI2VuZGlmCisJCSpscHAgPSAqcnBwOyAvKiBJTlRfOiBkaXJlY3QgY29weSAqLworCQl4ZnNfYm1idF9sb2dfcHRycyhjdXIsIGxicCwgbHJlY3MsIGxyZWNzKTsKKwl9IGVsc2UgeworCQlscnAgPSBYRlNfQk1BUF9SRUNfSUFERFIobGVmdCwgbHJlY3MsIGN1cik7CisJCXJycCA9IFhGU19CTUFQX1JFQ19JQUREUihyaWdodCwgMSwgY3VyKTsKKwkJKmxycCA9ICpycnA7CisJCXhmc19ibWJ0X2xvZ19yZWNzKGN1ciwgbGJwLCBscmVjcywgbHJlY3MpOworCX0KKwlJTlRfU0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCwgbHJlY3MpOworCXhmc19ibWJ0X2xvZ19ibG9jayhjdXIsIGxicCwgWEZTX0JCX05VTVJFQ1MpOworI2lmZGVmIERFQlVHCisJaWYgKGxldmVsID4gMCkKKwkJeGZzX2J0cmVlX2NoZWNrX2tleShYRlNfQlROVU1fQk1BUCwgbGtwIC0gMSwgbGtwKTsKKwllbHNlCisJCXhmc19idHJlZV9jaGVja19yZWMoWEZTX0JUTlVNX0JNQVAsIGxycCAtIDEsIGxycCk7CisjZW5kaWYKKwlycmVjcyA9IElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgLSAxOworCUlOVF9TRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCwgcnJlY3MpOworCXhmc19ibWJ0X2xvZ19ibG9jayhjdXIsIHJicCwgWEZTX0JCX05VTVJFQ1MpOworCWlmIChsZXZlbCA+IDApIHsKKyNpZmRlZiBERUJVRworCQlmb3IgKGkgPSAwOyBpIDwgcnJlY3M7IGkrKykgeworCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19scHRyKGN1ciwgSU5UX0dFVChycHBbaSArIDFdLCBBUkNIX0NPTlZFUlQpLAorCQkJCQlsZXZlbCkpKSB7CisJCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQkJCXJldHVybiBlcnJvcjsKKwkJCX0KKwkJfQorI2VuZGlmCisJCW1lbW1vdmUocmtwLCBya3AgKyAxLCBycmVjcyAqIHNpemVvZigqcmtwKSk7CisJCW1lbW1vdmUocnBwLCBycHAgKyAxLCBycmVjcyAqIHNpemVvZigqcnBwKSk7CisJCXhmc19ibWJ0X2xvZ19rZXlzKGN1ciwgcmJwLCAxLCBycmVjcyk7CisJCXhmc19ibWJ0X2xvZ19wdHJzKGN1ciwgcmJwLCAxLCBycmVjcyk7CisJfSBlbHNlIHsKKwkJbWVtbW92ZShycnAsIHJycCArIDEsIHJyZWNzICogc2l6ZW9mKCpycnApKTsKKwkJeGZzX2JtYnRfbG9nX3JlY3MoY3VyLCByYnAsIDEsIHJyZWNzKTsKKwkJSU5UX1NFVChrZXkuYnJfc3RhcnRvZmYsIEFSQ0hfQ09OVkVSVCwKKwkJCXhmc19ibWJ0X2Rpc2tfZ2V0X3N0YXJ0b2ZmKHJycCkpOworCQlya3AgPSAma2V5OworCX0KKwlpZiAoKGVycm9yID0geGZzX2JtYnRfdXBka2V5KGN1ciwgcmtwLCBsZXZlbCArIDEpKSkgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCXJldHVybiBlcnJvcjsKKwl9CisJY3VyLT5iY19wdHJzW2xldmVsXS0tOworCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOworCSpzdGF0ID0gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE1vdmUgMSByZWNvcmQgcmlnaHQgZnJvbSBjdXIvbGV2ZWwgaWYgcG9zc2libGUuCisgKiBVcGRhdGUgY3VyIHRvIHJlZmxlY3QgdGhlIG5ldyBwYXRoLgorICovCitTVEFUSUMgaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2JtYnRfcnNoaWZ0KAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwKKwlpbnQJCQlsZXZlbCwKKwlpbnQJCQkqc3RhdCkJCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworeworCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisjaWZkZWYgWEZTX0JNQlRfVFJBQ0UKKwlzdGF0aWMgY2hhcgkJZm5hbWVbXSA9ICJ4ZnNfYm1idF9yc2hpZnQiOworI2VuZGlmCisJaW50CQkJaTsJCS8qIGxvb3AgY291bnRlciAqLworCXhmc19ibWJ0X2tleV90CQlrZXk7CQkvKiBibWFwIGJ0cmVlIGtleSAqLworCXhmc19idWZfdAkJKmxicDsJCS8qIGxlZnQgYnVmZmVyIHBvaW50ZXIgKi8KKwl4ZnNfYm1idF9ibG9ja190CSpsZWZ0OwkJLyogbGVmdCBidHJlZSBibG9jayAqLworCXhmc19ibWJ0X2tleV90CQkqbGtwOwkJLyogbGVmdCBidHJlZSBrZXkgKi8KKwl4ZnNfYm1idF9wdHJfdAkJKmxwcDsJCS8qIGxlZnQgYWRkcmVzcyBwb2ludGVyICovCisJeGZzX2JtYnRfcmVjX3QJCSpscnA7CQkvKiBsZWZ0IHJlY29yZCBwb2ludGVyICovCisJeGZzX21vdW50X3QJCSptcDsJCS8qIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50ICovCisJeGZzX2J1Zl90CQkqcmJwOwkJLyogcmlnaHQgYnVmZmVyIHBvaW50ZXIgKi8KKwl4ZnNfYm1idF9ibG9ja190CSpyaWdodDsJCS8qIHJpZ2h0IGJ0cmVlIGJsb2NrICovCisJeGZzX2JtYnRfa2V5X3QJCSpya3A7CQkvKiByaWdodCBidHJlZSBrZXkgKi8KKwl4ZnNfYm1idF9wdHJfdAkJKnJwcDsJCS8qIHJpZ2h0IGFkZHJlc3MgcG9pbnRlciAqLworCXhmc19ibWJ0X3JlY190CQkqcnJwPU5VTEw7CS8qIHJpZ2h0IHJlY29yZCBwb2ludGVyICovCisJc3RydWN0IHhmc19idHJlZV9jdXIJKnRjdXI7CQkvKiB0ZW1wb3JhcnkgYnRyZWUgY3Vyc29yICovCisKKwlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFTlRSWSk7CisJWEZTX0JNQlRfVFJBQ0VfQVJHSShjdXIsIGxldmVsKTsKKwlpZiAobGV2ZWwgPT0gY3VyLT5iY19ubGV2ZWxzIC0gMSkgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKKwkJKnN0YXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJbGJwID0gY3VyLT5iY19idWZzW2xldmVsXTsKKwlsZWZ0ID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKGxicCk7CisjaWZkZWYgREVCVUcKKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xibG9jayhjdXIsIGxlZnQsIGxldmVsLCBsYnApKSkgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCXJldHVybiBlcnJvcjsKKwl9CisjZW5kaWYKKwlpZiAoSU5UX0dFVChsZWZ0LT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSA9PSBOVUxMREZTQk5PKSB7CisJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOworCQkqc3RhdCA9IDA7CisJCXJldHVybiAwOworCX0KKwlpZiAoY3VyLT5iY19wdHJzW2xldmVsXSA+PSBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7CisJCSpzdGF0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCW1wID0gY3VyLT5iY19tcDsKKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmbChtcCwgY3VyLT5iY190cCwgSU5UX0dFVChsZWZ0LT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSwgMCwKKwkJCSZyYnAsIFhGU19CTUFQX0JUUkVFX1JFRikpKSB7CisJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlyaWdodCA9IFhGU19CVUZfVE9fQk1CVF9CTE9DSyhyYnApOworCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbGJsb2NrKGN1ciwgcmlnaHQsIGxldmVsLCByYnApKSkgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCXJldHVybiBlcnJvcjsKKwl9CisJaWYgKElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0JNQVBfQkxPQ0tfSU1BWFJFQ1MobGV2ZWwsIGN1cikpIHsKKwkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7CisJCSpzdGF0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChsZXZlbCA+IDApIHsKKwkJbGtwID0gWEZTX0JNQVBfS0VZX0lBRERSKGxlZnQsIElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSwgY3VyKTsKKwkJbHBwID0gWEZTX0JNQVBfUFRSX0lBRERSKGxlZnQsIElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSwgY3VyKTsKKwkJcmtwID0gWEZTX0JNQVBfS0VZX0lBRERSKHJpZ2h0LCAxLCBjdXIpOworCQlycHAgPSBYRlNfQk1BUF9QVFJfSUFERFIocmlnaHQsIDEsIGN1cik7CisjaWZkZWYgREVCVUcKKwkJZm9yIChpID0gSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xwdHIoY3VyLCBJTlRfR0VUKHJwcFtpXSwgQVJDSF9DT05WRVJUKSwgbGV2ZWwpKSkgeworCQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQl9CisJCX0KKyNlbmRpZgorCQltZW1tb3ZlKHJrcCArIDEsIHJrcCwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAqIHNpemVvZigqcmtwKSk7CisJCW1lbW1vdmUocnBwICsgMSwgcnBwLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpycHApKTsKKyNpZmRlZiBERUJVRworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xwdHIoY3VyLCBJTlRfR0VUKCpscHAsIEFSQ0hfQ09OVkVSVCksIGxldmVsKSkpIHsKKwkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorI2VuZGlmCisJCSpya3AgPSAqbGtwOworCQkqcnBwID0gKmxwcDsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KKwkJeGZzX2JtYnRfbG9nX2tleXMoY3VyLCByYnAsIDEsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKyAxKTsKKwkJeGZzX2JtYnRfbG9nX3B0cnMoY3VyLCByYnAsIDEsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKyAxKTsKKwl9IGVsc2UgeworCQlscnAgPSBYRlNfQk1BUF9SRUNfSUFERFIobGVmdCwgSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpLCBjdXIpOworCQlycnAgPSBYRlNfQk1BUF9SRUNfSUFERFIocmlnaHQsIDEsIGN1cik7CisJCW1lbW1vdmUocnJwICsgMSwgcnJwLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpycnApKTsKKwkJKnJycCA9ICpscnA7CisJCXhmc19ibWJ0X2xvZ19yZWNzKGN1ciwgcmJwLCAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICsgMSk7CisJCUlOVF9TRVQoa2V5LmJyX3N0YXJ0b2ZmLCBBUkNIX0NPTlZFUlQsCisJCQl4ZnNfYm1idF9kaXNrX2dldF9zdGFydG9mZihycnApKTsKKwkJcmtwID0gJmtleTsKKwl9CisJSU5UX01PRChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIC0xKTsKKwl4ZnNfYm1idF9sb2dfYmxvY2soY3VyLCBsYnAsIFhGU19CQl9OVU1SRUNTKTsKKwlJTlRfTU9EKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsICsxKTsKKyNpZmRlZiBERUJVRworCWlmIChsZXZlbCA+IDApCisJCXhmc19idHJlZV9jaGVja19rZXkoWEZTX0JUTlVNX0JNQVAsIHJrcCwgcmtwICsgMSk7CisJZWxzZQorCQl4ZnNfYnRyZWVfY2hlY2tfcmVjKFhGU19CVE5VTV9CTUFQLCBycnAsIHJycCArIDEpOworI2VuZGlmCisJeGZzX2JtYnRfbG9nX2Jsb2NrKGN1ciwgcmJwLCBYRlNfQkJfTlVNUkVDUyk7CisJaWYgKChlcnJvciA9IHhmc19idHJlZV9kdXBfY3Vyc29yKGN1ciwgJnRjdXIpKSkgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCXJldHVybiBlcnJvcjsKKwl9CisJaSA9IHhmc19idHJlZV9sYXN0cmVjKHRjdXIsIGxldmVsKTsKKwlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJaWYgKChlcnJvciA9IHhmc19ibWJ0X2luY3JlbWVudCh0Y3VyLCBsZXZlbCwgJmkpKSkgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IodGN1ciwgRVJST1IpOworCQlnb3RvIGVycm9yMTsKKwl9CisJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCWlmICgoZXJyb3IgPSB4ZnNfYm1idF91cGRrZXkodGN1ciwgcmtwLCBsZXZlbCArIDEpKSkgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IodGN1ciwgRVJST1IpOworCQlnb3RvIGVycm9yMTsKKwl9CisJeGZzX2J0cmVlX2RlbF9jdXJzb3IodGN1ciwgWEZTX0JUUkVFX05PRVJST1IpOworCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOworCSpzdGF0ID0gMTsKKwlyZXR1cm4gMDsKK2Vycm9yMDoKKwlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CitlcnJvcjE6CisJeGZzX2J0cmVlX2RlbF9jdXJzb3IodGN1ciwgWEZTX0JUUkVFX0VSUk9SKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBEZXRlcm1pbmUgdGhlIGV4dGVudCBzdGF0ZS4KKyAqLworLyogQVJHU1VTRUQgKi8KK1NUQVRJQyB4ZnNfZXhudHN0X3QKK3hmc19leHRlbnRfc3RhdGUoCisJeGZzX2ZpbGJsa3NfdAkJYmxrcywKKwlpbnQJCQlleHRlbnRfZmxhZykKK3sKKwlpZiAoZXh0ZW50X2ZsYWcpIHsKKwkJQVNTRVJUKGJsa3MgIT0gMCk7CS8qIHNhdmVkIGZvciBETUlHICovCisJCXJldHVybiBYRlNfRVhUX1VOV1JJVFRFTjsKKwl9CisJcmV0dXJuIFhGU19FWFRfTk9STTsKK30KKworCisvKgorICogU3BsaXQgY3VyL2xldmVsIGJsb2NrIGluIGhhbGYuCisgKiBSZXR1cm4gbmV3IGJsb2NrIG51bWJlciBhbmQgaXRzIGZpcnN0IHJlY29yZCAodG8gYmUgaW5zZXJ0ZWQgaW50byBwYXJlbnQpLgorICovCitTVEFUSUMgaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2JtYnRfc3BsaXQoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAorCWludAkJCWxldmVsLAorCXhmc19mc2Jsb2NrX3QJCSpibm9wLAorCXhmc19ibWJ0X2tleV90CQkqa2V5cCwKKwl4ZnNfYnRyZWVfY3VyX3QJCSoqY3VycCwKKwlpbnQJCQkqc3RhdCkJCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworeworCXhmc19hbGxvY19hcmdfdAkJYXJnczsJCS8qIGJsb2NrIGFsbG9jYXRpb24gYXJncyAqLworCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisjaWZkZWYgWEZTX0JNQlRfVFJBQ0UKKwlzdGF0aWMgY2hhcgkJZm5hbWVbXSA9ICJ4ZnNfYm1idF9zcGxpdCI7CisjZW5kaWYKKwlpbnQJCQlpOwkJLyogbG9vcCBjb3VudGVyICovCisJeGZzX2ZzYmxvY2tfdAkJbGJubzsJCS8qIGxlZnQgc2libGluZyBibG9jayBudW1iZXIgKi8KKwl4ZnNfYnVmX3QJCSpsYnA7CQkvKiBsZWZ0IGJ1ZmZlciBwb2ludGVyICovCisJeGZzX2JtYnRfYmxvY2tfdAkqbGVmdDsJCS8qIGxlZnQgYnRyZWUgYmxvY2sgKi8KKwl4ZnNfYm1idF9rZXlfdAkJKmxrcDsJCS8qIGxlZnQgYnRyZWUga2V5ICovCisJeGZzX2JtYnRfcHRyX3QJCSpscHA7CQkvKiBsZWZ0IGFkZHJlc3MgcG9pbnRlciAqLworCXhmc19ibWJ0X3JlY190CQkqbHJwOwkJLyogbGVmdCByZWNvcmQgcG9pbnRlciAqLworCXhmc19idWZfdAkJKnJicDsJCS8qIHJpZ2h0IGJ1ZmZlciBwb2ludGVyICovCisJeGZzX2JtYnRfYmxvY2tfdAkqcmlnaHQ7CQkvKiByaWdodCBidHJlZSBibG9jayAqLworCXhmc19ibWJ0X2tleV90CQkqcmtwOwkJLyogcmlnaHQgYnRyZWUga2V5ICovCisJeGZzX2JtYnRfcHRyX3QJCSpycHA7CQkvKiByaWdodCBhZGRyZXNzIHBvaW50ZXIgKi8KKwl4ZnNfYm1idF9ibG9ja190CSpycmJsb2NrOwkvKiByaWdodC1yaWdodCBidHJlZSBibG9jayAqLworCXhmc19idWZfdAkJKnJyYnA7CQkvKiByaWdodC1yaWdodCBidWZmZXIgcG9pbnRlciAqLworCXhmc19ibWJ0X3JlY190CQkqcnJwOwkJLyogcmlnaHQgcmVjb3JkIHBvaW50ZXIgKi8KKworCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVOVFJZKTsKKwlYRlNfQk1CVF9UUkFDRV9BUkdJRksoY3VyLCBsZXZlbCwgKmJub3AsIGtleXApOworCWFyZ3MudHAgPSBjdXItPmJjX3RwOworCWFyZ3MubXAgPSBjdXItPmJjX21wOworCWxicCA9IGN1ci0+YmNfYnVmc1tsZXZlbF07CisJbGJubyA9IFhGU19EQUREUl9UT19GU0IoYXJncy5tcCwgWEZTX0JVRl9BRERSKGxicCkpOworCWxlZnQgPSBYRlNfQlVGX1RPX0JNQlRfQkxPQ0sobGJwKTsKKwlhcmdzLmZzYm5vID0gY3VyLT5iY19wcml2YXRlLmIuZmlyc3RibG9jazsKKwlpZiAoYXJncy5mc2JubyA9PSBOVUxMRlNCTE9DSykgeworCQlhcmdzLmZzYm5vID0gbGJubzsKKwkJYXJncy50eXBlID0gWEZTX0FMTE9DVFlQRV9TVEFSVF9CTk87CisJfSBlbHNlIGlmIChjdXItPmJjX3ByaXZhdGUuYi5mbGlzdC0+eGJmX2xvdykKKwkJYXJncy50eXBlID0gWEZTX0FMTE9DVFlQRV9GSVJTVF9BRzsKKwllbHNlCisJCWFyZ3MudHlwZSA9IFhGU19BTExPQ1RZUEVfTkVBUl9CTk87CisJYXJncy5tb2QgPSBhcmdzLm1pbmxlZnQgPSBhcmdzLmFsaWdubWVudCA9IGFyZ3MudG90YWwgPSBhcmdzLmlzZmwgPQorCQlhcmdzLnVzZXJkYXRhID0gYXJncy5taW5hbGlnbnNsb3AgPSAwOworCWFyZ3MubWlubGVuID0gYXJncy5tYXhsZW4gPSBhcmdzLnByb2QgPSAxOworCWFyZ3Mud2FzZGVsID0gY3VyLT5iY19wcml2YXRlLmIuZmxhZ3MgJiBYRlNfQlRDVVJfQlBSVl9XQVNERUw7CisJaWYgKCFhcmdzLndhc2RlbCAmJiB4ZnNfdHJhbnNfZ2V0X2Jsb2NrX3JlcyhhcmdzLnRwKSA9PSAwKSB7CisJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFTk9TUEMpOworCX0KKwlpZiAoKGVycm9yID0geGZzX2FsbG9jX3ZleHRlbnQoJmFyZ3MpKSkgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCXJldHVybiBlcnJvcjsKKwl9CisJaWYgKGFyZ3MuZnNibm8gPT0gTlVMTEZTQkxPQ0spIHsKKwkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7CisJCSpzdGF0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCUFTU0VSVChhcmdzLmxlbiA9PSAxKTsKKwljdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrID0gYXJncy5mc2JubzsKKwljdXItPmJjX3ByaXZhdGUuYi5hbGxvY2F0ZWQrKzsKKwljdXItPmJjX3ByaXZhdGUuYi5pcC0+aV9kLmRpX25ibG9ja3MrKzsKKwl4ZnNfdHJhbnNfbG9nX2lub2RlKGFyZ3MudHAsIGN1ci0+YmNfcHJpdmF0ZS5iLmlwLCBYRlNfSUxPR19DT1JFKTsKKwlYRlNfVFJBTlNfTU9EX0RRVU9UX0JZSU5PKGFyZ3MubXAsIGFyZ3MudHAsIGN1ci0+YmNfcHJpdmF0ZS5iLmlwLAorCQkJWEZTX1RSQU5TX0RRX0JDT1VOVCwgMUwpOworCXJicCA9IHhmc19idHJlZV9nZXRfYnVmbChhcmdzLm1wLCBhcmdzLnRwLCBhcmdzLmZzYm5vLCAwKTsKKwlyaWdodCA9IFhGU19CVUZfVE9fQk1CVF9CTE9DSyhyYnApOworI2lmZGVmIERFQlVHCisJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19sYmxvY2soY3VyLCBsZWZ0LCBsZXZlbCwgcmJwKSkpIHsKKwkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorI2VuZGlmCisJSU5UX1NFVChyaWdodC0+YmJfbWFnaWMsIEFSQ0hfQ09OVkVSVCwgWEZTX0JNQVBfTUFHSUMpOworCXJpZ2h0LT5iYl9sZXZlbCA9IGxlZnQtPmJiX2xldmVsOyAvKiBJTlRfOiBkaXJlY3QgY29weSAqLworCUlOVF9TRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCwgKF9fdWludDE2X3QpKElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAvIDIpKTsKKwlpZiAoKElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAmIDEpICYmCisJICAgIGN1ci0+YmNfcHRyc1tsZXZlbF0gPD0gSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSArIDEpCisJCUlOVF9NT0QocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCwgKzEpOworCWkgPSBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgLSBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICsgMTsKKwlpZiAobGV2ZWwgPiAwKSB7CisJCWxrcCA9IFhGU19CTUFQX0tFWV9JQUREUihsZWZ0LCBpLCBjdXIpOworCQlscHAgPSBYRlNfQk1BUF9QVFJfSUFERFIobGVmdCwgaSwgY3VyKTsKKwkJcmtwID0gWEZTX0JNQVBfS0VZX0lBRERSKHJpZ2h0LCAxLCBjdXIpOworCQlycHAgPSBYRlNfQk1BUF9QVFJfSUFERFIocmlnaHQsIDEsIGN1cik7CisjaWZkZWYgREVCVUcKKwkJZm9yIChpID0gMDsgaSA8IElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7IGkrKykgeworCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19scHRyKGN1ciwgSU5UX0dFVChscHBbaV0sIEFSQ0hfQ09OVkVSVCksIGxldmVsKSkpIHsKKwkJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCQkJcmV0dXJuIGVycm9yOworCQkJfQorCQl9CisjZW5kaWYKKwkJbWVtY3B5KHJrcCwgbGtwLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpya3ApKTsKKwkJbWVtY3B5KHJwcCwgbHBwLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpycHApKTsKKwkJeGZzX2JtYnRfbG9nX2tleXMoY3VyLCByYnAsIDEsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpOworCQl4ZnNfYm1idF9sb2dfcHRycyhjdXIsIHJicCwgMSwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSk7CisJCWtleXAtPmJyX3N0YXJ0b2ZmID0gSU5UX0dFVChya3AtPmJyX3N0YXJ0b2ZmLCBBUkNIX0NPTlZFUlQpOworCX0gZWxzZSB7CisJCWxycCA9IFhGU19CTUFQX1JFQ19JQUREUihsZWZ0LCBpLCBjdXIpOworCQlycnAgPSBYRlNfQk1BUF9SRUNfSUFERFIocmlnaHQsIDEsIGN1cik7CisJCW1lbWNweShycnAsIGxycCwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAqIHNpemVvZigqcnJwKSk7CisJCXhmc19ibWJ0X2xvZ19yZWNzKGN1ciwgcmJwLCAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKTsKKwkJa2V5cC0+YnJfc3RhcnRvZmYgPSB4ZnNfYm1idF9kaXNrX2dldF9zdGFydG9mZihycnApOworCX0KKwlJTlRfTU9EKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCwgLShJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKSk7CisJcmlnaHQtPmJiX3JpZ2h0c2liID0gbGVmdC0+YmJfcmlnaHRzaWI7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCisJSU5UX1NFVChsZWZ0LT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJULCBhcmdzLmZzYm5vKTsKKwlJTlRfU0VUKHJpZ2h0LT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQsIGxibm8pOworCXhmc19ibWJ0X2xvZ19ibG9jayhjdXIsIHJicCwgWEZTX0JCX0FMTF9CSVRTKTsKKwl4ZnNfYm1idF9sb2dfYmxvY2soY3VyLCBsYnAsIFhGU19CQl9OVU1SRUNTIHwgWEZTX0JCX1JJR0hUU0lCKTsKKwlpZiAoSU5UX0dFVChyaWdodC0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCkgIT0gTlVMTERGU0JOTykgeworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmbChhcmdzLm1wLCBhcmdzLnRwLAorCQkJCUlOVF9HRVQocmlnaHQtPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpLCAwLCAmcnJicCwKKwkJCQlYRlNfQk1BUF9CVFJFRV9SRUYpKSkgeworCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQkJcmV0dXJuIGVycm9yOworCQl9CisJCXJyYmxvY2sgPSBYRlNfQlVGX1RPX0JNQlRfQkxPQ0socnJicCk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbGJsb2NrKGN1ciwgcnJibG9jaywgbGV2ZWwsIHJyYnApKSkgeworCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQkJcmV0dXJuIGVycm9yOworCQl9CisJCUlOVF9TRVQocnJibG9jay0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJULCBhcmdzLmZzYm5vKTsKKwkJeGZzX2JtYnRfbG9nX2Jsb2NrKGN1ciwgcnJicCwgWEZTX0JCX0xFRlRTSUIpOworCX0KKwlpZiAoY3VyLT5iY19wdHJzW2xldmVsXSA+IElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSArIDEpIHsKKwkJeGZzX2J0cmVlX3NldGJ1ZihjdXIsIGxldmVsLCByYnApOworCQljdXItPmJjX3B0cnNbbGV2ZWxdIC09IElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKKwl9CisJaWYgKGxldmVsICsgMSA8IGN1ci0+YmNfbmxldmVscykgeworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2R1cF9jdXJzb3IoY3VyLCBjdXJwKSkpIHsKKwkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQkoKmN1cnApLT5iY19wdHJzW2xldmVsICsgMV0rKzsKKwl9CisJKmJub3AgPSBhcmdzLmZzYm5vOworCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOworCSpzdGF0ID0gMTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogVXBkYXRlIGtleXMgZm9yIHRoZSByZWNvcmQuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19ibWJ0X3VwZGtleSgKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCisJeGZzX2JtYnRfa2V5X3QJCSprZXlwLAkvKiBvbi1kaXNrIGZvcm1hdCAqLworCWludAkJCWxldmVsKQoreworCXhmc19ibWJ0X2Jsb2NrX3QJKmJsb2NrOworCXhmc19idWZfdAkJKmJwOworI2lmZGVmIERFQlVHCisJaW50CQkJZXJyb3I7CisjZW5kaWYKKyNpZmRlZiBYRlNfQk1CVF9UUkFDRQorCXN0YXRpYyBjaGFyCQlmbmFtZVtdID0gInhmc19ibWJ0X3VwZGtleSI7CisjZW5kaWYKKwl4ZnNfYm1idF9rZXlfdAkJKmtwOworCWludAkJCXB0cjsKKworCUFTU0VSVChsZXZlbCA+PSAxKTsKKwlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFTlRSWSk7CisJWEZTX0JNQlRfVFJBQ0VfQVJHSUsoY3VyLCBsZXZlbCwga2V5cCk7CisJZm9yIChwdHIgPSAxOyBwdHIgPT0gMSAmJiBsZXZlbCA8IGN1ci0+YmNfbmxldmVsczsgbGV2ZWwrKykgeworCQlibG9jayA9IHhmc19ibWJ0X2dldF9ibG9jayhjdXIsIGxldmVsLCAmYnApOworI2lmZGVmIERFQlVHCisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbGJsb2NrKGN1ciwgYmxvY2ssIGxldmVsLCBicCkpKSB7CisJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKyNlbmRpZgorCQlwdHIgPSBjdXItPmJjX3B0cnNbbGV2ZWxdOworCQlrcCA9IFhGU19CTUFQX0tFWV9JQUREUihibG9jaywgcHRyLCBjdXIpOworCQkqa3AgPSAqa2V5cDsKKwkJeGZzX2JtYnRfbG9nX2tleXMoY3VyLCBicCwgcHRyLCBwdHIpOworCX0KKwlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENvbnZlcnQgb24tZGlzayBmb3JtIG9mIGJ0cmVlIHJvb3QgdG8gaW4tbWVtb3J5IGZvcm0uCisgKi8KK3ZvaWQKK3hmc19ibWRyX3RvX2JtYnQoCisJeGZzX2JtZHJfYmxvY2tfdAkqZGJsb2NrLAorCWludAkJCWRibG9ja2xlbiwKKwl4ZnNfYm1idF9ibG9ja190CSpyYmxvY2ssCisJaW50CQkJcmJsb2NrbGVuKQoreworCWludAkJCWRteHI7CisJeGZzX2JtYnRfa2V5X3QJCSpma3A7CisJeGZzX2JtYnRfcHRyX3QJCSpmcHA7CisJeGZzX2JtYnRfa2V5X3QJCSp0a3A7CisJeGZzX2JtYnRfcHRyX3QJCSp0cHA7CisKKwlJTlRfU0VUKHJibG9jay0+YmJfbWFnaWMsIEFSQ0hfQ09OVkVSVCwgWEZTX0JNQVBfTUFHSUMpOworCXJibG9jay0+YmJfbGV2ZWwgPSBkYmxvY2stPmJiX2xldmVsOwkvKiBib3RoIGluIG9uLWRpc2sgZm9ybWF0ICovCisJQVNTRVJUKElOVF9HRVQocmJsb2NrLT5iYl9sZXZlbCwgQVJDSF9DT05WRVJUKSA+IDApOworCXJibG9jay0+YmJfbnVtcmVjcyA9IGRibG9jay0+YmJfbnVtcmVjczsvKiBib3RoIGluIG9uLWRpc2sgZm9ybWF0ICovCisJSU5UX1NFVChyYmxvY2stPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCwgTlVMTERGU0JOTyk7CisJSU5UX1NFVChyYmxvY2stPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQsIE5VTExERlNCTk8pOworCWRteHIgPSAoaW50KVhGU19CVFJFRV9CTE9DS19NQVhSRUNTKGRibG9ja2xlbiwgeGZzX2JtZHIsIDApOworCWZrcCA9IFhGU19CVFJFRV9LRVlfQUREUihkYmxvY2tsZW4sIHhmc19ibWRyLCBkYmxvY2ssIDEsIGRteHIpOworCXRrcCA9IFhGU19CTUFQX0JST09UX0tFWV9BRERSKHJibG9jaywgMSwgcmJsb2NrbGVuKTsKKwlmcHAgPSBYRlNfQlRSRUVfUFRSX0FERFIoZGJsb2NrbGVuLCB4ZnNfYm1kciwgZGJsb2NrLCAxLCBkbXhyKTsKKwl0cHAgPSBYRlNfQk1BUF9CUk9PVF9QVFJfQUREUihyYmxvY2ssIDEsIHJibG9ja2xlbik7CisJZG14ciA9IElOVF9HRVQoZGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOworCW1lbWNweSh0a3AsIGZrcCwgc2l6ZW9mKCpma3ApICogZG14cik7CisJbWVtY3B5KHRwcCwgZnBwLCBzaXplb2YoKmZwcCkgKiBkbXhyKTsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KK30KKworLyoKKyAqIERlY3JlbWVudCBjdXJzb3IgYnkgb25lIHJlY29yZCBhdCB0aGUgbGV2ZWwuCisgKiBGb3Igbm9uemVybyBsZXZlbHMgdGhlIGxlYWYtd2FyZCBpbmZvcm1hdGlvbiBpcyB1bnRvdWNoZWQuCisgKi8KK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfYm1idF9kZWNyZW1lbnQoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAorCWludAkJCWxldmVsLAorCWludAkJCSpzdGF0KQkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJeGZzX2JtYnRfYmxvY2tfdAkqYmxvY2s7CisJeGZzX2J1Zl90CQkqYnA7CisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKyNpZmRlZiBYRlNfQk1CVF9UUkFDRQorCXN0YXRpYyBjaGFyCQlmbmFtZVtdID0gInhmc19ibWJ0X2RlY3JlbWVudCI7CisjZW5kaWYKKwl4ZnNfZnNibG9ja190CQlmc2JubzsKKwlpbnQJCQlsZXY7CisJeGZzX21vdW50X3QJCSptcDsKKwl4ZnNfdHJhbnNfdAkJKnRwOworCisJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRU5UUlkpOworCVhGU19CTUJUX1RSQUNFX0FSR0koY3VyLCBsZXZlbCk7CisJQVNTRVJUKGxldmVsIDwgY3VyLT5iY19ubGV2ZWxzKTsKKwlpZiAobGV2ZWwgPCBjdXItPmJjX25sZXZlbHMgLSAxKQorCQl4ZnNfYnRyZWVfcmVhZGFoZWFkKGN1ciwgbGV2ZWwsIFhGU19CVENVUl9MRUZUUkEpOworCWlmICgtLWN1ci0+YmNfcHRyc1tsZXZlbF0gPiAwKSB7CisJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOworCQkqc3RhdCA9IDE7CisJCXJldHVybiAwOworCX0KKwlibG9jayA9IHhmc19ibWJ0X2dldF9ibG9jayhjdXIsIGxldmVsLCAmYnApOworI2lmZGVmIERFQlVHCisJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19sYmxvY2soY3VyLCBibG9jaywgbGV2ZWwsIGJwKSkpIHsKKwkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorI2VuZGlmCisJaWYgKElOVF9HRVQoYmxvY2stPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTERGU0JOTykgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKKwkJKnN0YXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJZm9yIChsZXYgPSBsZXZlbCArIDE7IGxldiA8IGN1ci0+YmNfbmxldmVsczsgbGV2KyspIHsKKwkJaWYgKC0tY3VyLT5iY19wdHJzW2xldl0gPiAwKQorCQkJYnJlYWs7CisJCWlmIChsZXYgPCBjdXItPmJjX25sZXZlbHMgLSAxKQorCQkJeGZzX2J0cmVlX3JlYWRhaGVhZChjdXIsIGxldiwgWEZTX0JUQ1VSX0xFRlRSQSk7CisJfQorCWlmIChsZXYgPT0gY3VyLT5iY19ubGV2ZWxzKSB7CisJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOworCQkqc3RhdCA9IDA7CisJCXJldHVybiAwOworCX0KKwl0cCA9IGN1ci0+YmNfdHA7CisJbXAgPSBjdXItPmJjX21wOworCWZvciAoYmxvY2sgPSB4ZnNfYm1idF9nZXRfYmxvY2soY3VyLCBsZXYsICZicCk7IGxldiA+IGxldmVsOyApIHsKKwkJZnNibm8gPSBJTlRfR0VUKCpYRlNfQk1BUF9QVFJfSUFERFIoYmxvY2ssIGN1ci0+YmNfcHRyc1tsZXZdLCBjdXIpLCBBUkNIX0NPTlZFUlQpOworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmbChtcCwgdHAsIGZzYm5vLCAwLCAmYnAsCisJCQkJWEZTX0JNQVBfQlRSRUVfUkVGKSkpIHsKKwkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQlsZXYtLTsKKwkJeGZzX2J0cmVlX3NldGJ1ZihjdXIsIGxldiwgYnApOworCQlibG9jayA9IFhGU19CVUZfVE9fQk1CVF9CTE9DSyhicCk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbGJsb2NrKGN1ciwgYmxvY2ssIGxldiwgYnApKSkgeworCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQkJcmV0dXJuIGVycm9yOworCQl9CisJCWN1ci0+YmNfcHRyc1tsZXZdID0gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKKwl9CisJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7CisJKnN0YXQgPSAxOworCXJldHVybiAwOworfQorCisvKgorICogRGVsZXRlIHRoZSByZWNvcmQgcG9pbnRlZCB0byBieSBjdXIuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19ibWJ0X2RlbGV0ZSgKKwl4ZnNfYnRyZWVfY3VyX3QJKmN1ciwKKwlpbnQJCSpzdGF0KQkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJaW50CQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworI2lmZGVmIFhGU19CTUJUX1RSQUNFCisJc3RhdGljIGNoYXIJZm5hbWVbXSA9ICJ4ZnNfYm1idF9kZWxldGUiOworI2VuZGlmCisJaW50CQlpOworCWludAkJbGV2ZWw7CisKKwlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFTlRSWSk7CisJZm9yIChsZXZlbCA9IDAsIGkgPSAyOyBpID09IDI7IGxldmVsKyspIHsKKwkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2RlbHJlYyhjdXIsIGxldmVsLCAmaSkpKSB7CisJCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwl9CisJaWYgKGkgPT0gMCkgeworCQlmb3IgKGxldmVsID0gMTsgbGV2ZWwgPCBjdXItPmJjX25sZXZlbHM7IGxldmVsKyspIHsKKwkJCWlmIChjdXItPmJjX3B0cnNbbGV2ZWxdID09IDApIHsKKwkJCQlpZiAoKGVycm9yID0geGZzX2JtYnRfZGVjcmVtZW50KGN1ciwgbGV2ZWwsCisJCQkJCQkmaSkpKSB7CisJCQkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCQkJcmV0dXJuIGVycm9yOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKKwkqc3RhdCA9IGk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDb252ZXJ0IGEgY29tcHJlc3NlZCBibWFwIGV4dGVudCByZWNvcmQgdG8gYW4gdW5jb21wcmVzc2VkIGZvcm0uCisgKiBUaGlzIGNvZGUgbXVzdCBiZSBpbiBzeW5jIHdpdGggdGhlIHJvdXRpbmVzIHhmc19ibWJ0X2dldF9zdGFydG9mZiwKKyAqIHhmc19ibWJ0X2dldF9zdGFydGJsb2NrLCB4ZnNfYm1idF9nZXRfYmxvY2tjb3VudCBhbmQgeGZzX2JtYnRfZ2V0X3N0YXRlLgorICovCisKK1NUQVRJQyBfX2lubGluZV9fIHZvaWQKK19feGZzX2JtYnRfZ2V0X2FsbCgKKwkJX191aW50NjRfdCBsMCwKKwkJX191aW50NjRfdCBsMSwKKwkJeGZzX2JtYnRfaXJlY190ICpzKQoreworCWludAlleHRfZmxhZzsKKwl4ZnNfZXhudHN0X3Qgc3Q7CisKKwlleHRfZmxhZyA9IChpbnQpKGwwID4+ICg2NCAtIEJNQlRfRVhOVEZMQUdfQklUTEVOKSk7CisJcy0+YnJfc3RhcnRvZmYgPSAoKHhmc19maWxlb2ZmX3QpbDAgJgorCQkJICAgWEZTX01BU0s2NExPKDY0IC0gQk1CVF9FWE5URkxBR19CSVRMRU4pKSA+PiA5OworI2lmIFhGU19CSUdfQkxLTk9TCisJcy0+YnJfc3RhcnRibG9jayA9ICgoKHhmc19mc2Jsb2NrX3QpbDAgJiBYRlNfTUFTSzY0TE8oOSkpIDw8IDQzKSB8CisJCQkgICAoKCh4ZnNfZnNibG9ja190KWwxKSA+PiAyMSk7CisjZWxzZQorI2lmZGVmIERFQlVHCisJeworCQl4ZnNfZGZzYm5vX3QJYjsKKworCQliID0gKCgoeGZzX2Rmc2Jub190KWwwICYgWEZTX01BU0s2NExPKDkpKSA8PCA0MykgfAorCQkgICAgKCgoeGZzX2Rmc2Jub190KWwxKSA+PiAyMSk7CisJCUFTU0VSVCgoYiA+PiAzMikgPT0gMCB8fCBJU05VTExEU1RBUlRCTE9DSyhiKSk7CisJCXMtPmJyX3N0YXJ0YmxvY2sgPSAoeGZzX2ZzYmxvY2tfdCliOworCX0KKyNlbHNlCS8qICFERUJVRyAqLworCXMtPmJyX3N0YXJ0YmxvY2sgPSAoeGZzX2ZzYmxvY2tfdCkoKCh4ZnNfZGZzYm5vX3QpbDEpID4+IDIxKTsKKyNlbmRpZgkvKiBERUJVRyAqLworI2VuZGlmCS8qIFhGU19CSUdfQkxLTk9TICovCisJcy0+YnJfYmxvY2tjb3VudCA9ICh4ZnNfZmlsYmxrc190KShsMSAmIFhGU19NQVNLNjRMTygyMSkpOworCS8qIFRoaXMgaXMgeGZzX2V4dGVudF9zdGF0ZSgpIGluLWxpbmUgKi8KKwlpZiAoZXh0X2ZsYWcpIHsKKwkJQVNTRVJUKHMtPmJyX2Jsb2NrY291bnQgIT0gMCk7CS8qIHNhdmVkIGZvciBETUlHICovCisJCXN0ID0gWEZTX0VYVF9VTldSSVRURU47CisJfSBlbHNlCisJCXN0ID0gWEZTX0VYVF9OT1JNOworCXMtPmJyX3N0YXRlID0gc3Q7Cit9CisKK3ZvaWQKK3hmc19ibWJ0X2dldF9hbGwoCisJeGZzX2JtYnRfcmVjX3QJKnIsCisJeGZzX2JtYnRfaXJlY190ICpzKQoreworCV9feGZzX2JtYnRfZ2V0X2FsbChyLT5sMCwgci0+bDEsIHMpOworfQorCisvKgorICogR2V0IHRoZSBibG9jayBwb2ludGVyIGZvciB0aGUgZ2l2ZW4gbGV2ZWwgb2YgdGhlIGN1cnNvci4KKyAqIEZpbGwgaW4gdGhlIGJ1ZmZlciBwb2ludGVyLCBpZiBhcHBsaWNhYmxlLgorICovCit4ZnNfYm1idF9ibG9ja190ICoKK3hmc19ibWJ0X2dldF9ibG9jaygKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCisJaW50CQkJbGV2ZWwsCisJeGZzX2J1Zl90CQkqKmJwcCkKK3sKKwl4ZnNfaWZvcmtfdAkJKmlmcDsKKwl4ZnNfYm1idF9ibG9ja190CSpydmFsOworCisJaWYgKGxldmVsIDwgY3VyLT5iY19ubGV2ZWxzIC0gMSkgeworCQkqYnBwID0gY3VyLT5iY19idWZzW2xldmVsXTsKKwkJcnZhbCA9IFhGU19CVUZfVE9fQk1CVF9CTE9DSygqYnBwKTsKKwl9IGVsc2UgeworCQkqYnBwID0gTlVMTDsKKwkJaWZwID0gWEZTX0lGT1JLX1BUUihjdXItPmJjX3ByaXZhdGUuYi5pcCwKKwkJCWN1ci0+YmNfcHJpdmF0ZS5iLndoaWNoZm9yayk7CisJCXJ2YWwgPSBpZnAtPmlmX2Jyb290OworCX0KKwlyZXR1cm4gcnZhbDsKK30KKworLyoKKyAqIEV4dHJhY3QgdGhlIGJsb2NrY291bnQgZmllbGQgZnJvbSBhbiBpbiBtZW1vcnkgYm1hcCBleHRlbnQgcmVjb3JkLgorICovCit4ZnNfZmlsYmxrc190Cit4ZnNfYm1idF9nZXRfYmxvY2tjb3VudCgKKwl4ZnNfYm1idF9yZWNfdAkqcikKK3sKKwlyZXR1cm4gKHhmc19maWxibGtzX3QpKHItPmwxICYgWEZTX01BU0s2NExPKDIxKSk7Cit9CisKKy8qCisgKiBFeHRyYWN0IHRoZSBzdGFydGJsb2NrIGZpZWxkIGZyb20gYW4gaW4gbWVtb3J5IGJtYXAgZXh0ZW50IHJlY29yZC4KKyAqLworeGZzX2ZzYmxvY2tfdAoreGZzX2JtYnRfZ2V0X3N0YXJ0YmxvY2soCisJeGZzX2JtYnRfcmVjX3QJKnIpCit7CisjaWYgWEZTX0JJR19CTEtOT1MKKwlyZXR1cm4gKCgoeGZzX2ZzYmxvY2tfdClyLT5sMCAmIFhGU19NQVNLNjRMTyg5KSkgPDwgNDMpIHwKKwkgICAgICAgKCgoeGZzX2ZzYmxvY2tfdClyLT5sMSkgPj4gMjEpOworI2Vsc2UKKyNpZmRlZiBERUJVRworCXhmc19kZnNibm9fdAliOworCisJYiA9ICgoKHhmc19kZnNibm9fdClyLT5sMCAmIFhGU19NQVNLNjRMTyg5KSkgPDwgNDMpIHwKKwkgICAgKCgoeGZzX2Rmc2Jub190KXItPmwxKSA+PiAyMSk7CisJQVNTRVJUKChiID4+IDMyKSA9PSAwIHx8IElTTlVMTERTVEFSVEJMT0NLKGIpKTsKKwlyZXR1cm4gKHhmc19mc2Jsb2NrX3QpYjsKKyNlbHNlCS8qICFERUJVRyAqLworCXJldHVybiAoeGZzX2ZzYmxvY2tfdCkoKCh4ZnNfZGZzYm5vX3Qpci0+bDEpID4+IDIxKTsKKyNlbmRpZgkvKiBERUJVRyAqLworI2VuZGlmCS8qIFhGU19CSUdfQkxLTk9TICovCit9CisKKy8qCisgKiBFeHRyYWN0IHRoZSBzdGFydG9mZiBmaWVsZCBmcm9tIGFuIGluIG1lbW9yeSBibWFwIGV4dGVudCByZWNvcmQuCisgKi8KK3hmc19maWxlb2ZmX3QKK3hmc19ibWJ0X2dldF9zdGFydG9mZigKKwl4ZnNfYm1idF9yZWNfdAkqcikKK3sKKwlyZXR1cm4gKCh4ZnNfZmlsZW9mZl90KXItPmwwICYKKwkJIFhGU19NQVNLNjRMTyg2NCAtIEJNQlRfRVhOVEZMQUdfQklUTEVOKSkgPj4gOTsKK30KKworeGZzX2V4bnRzdF90Cit4ZnNfYm1idF9nZXRfc3RhdGUoCisJeGZzX2JtYnRfcmVjX3QJKnIpCit7CisJaW50CWV4dF9mbGFnOworCisJZXh0X2ZsYWcgPSAoaW50KSgoci0+bDApID4+ICg2NCAtIEJNQlRfRVhOVEZMQUdfQklUTEVOKSk7CisJcmV0dXJuIHhmc19leHRlbnRfc3RhdGUoeGZzX2JtYnRfZ2V0X2Jsb2NrY291bnQociksCisJCQkJZXh0X2ZsYWcpOworfQorCisjaWYgX19CWVRFX09SREVSICE9IF9fQklHX0VORElBTgorLyogRW5kaWFuIGZsaXBwaW5nIHZlcnNpb25zIG9mIHRoZSBibWJ0IGV4dHJhY3Rpb24gZnVuY3Rpb25zICovCit2b2lkCit4ZnNfYm1idF9kaXNrX2dldF9hbGwoCisJeGZzX2JtYnRfcmVjX3QJKnIsCisJeGZzX2JtYnRfaXJlY190ICpzKQoreworCV9fdWludDY0X3QJbDAsIGwxOworCisJbDAgPSBJTlRfR0VUKHItPmwwLCBBUkNIX0NPTlZFUlQpOworCWwxID0gSU5UX0dFVChyLT5sMSwgQVJDSF9DT05WRVJUKTsKKworCV9feGZzX2JtYnRfZ2V0X2FsbChsMCwgbDEsIHMpOworfQorCisvKgorICogRXh0cmFjdCB0aGUgYmxvY2tjb3VudCBmaWVsZCBmcm9tIGFuIG9uIGRpc2sgYm1hcCBleHRlbnQgcmVjb3JkLgorICovCit4ZnNfZmlsYmxrc190Cit4ZnNfYm1idF9kaXNrX2dldF9ibG9ja2NvdW50KAorCXhmc19ibWJ0X3JlY190CSpyKQoreworCXJldHVybiAoeGZzX2ZpbGJsa3NfdCkoSU5UX0dFVChyLT5sMSwgQVJDSF9DT05WRVJUKSAmIFhGU19NQVNLNjRMTygyMSkpOworfQorCisvKgorICogRXh0cmFjdCB0aGUgc3RhcnRibG9jayBmaWVsZCBmcm9tIGFuIG9uIGRpc2sgYm1hcCBleHRlbnQgcmVjb3JkLgorICovCit4ZnNfZnNibG9ja190Cit4ZnNfYm1idF9kaXNrX2dldF9zdGFydGJsb2NrKAorCXhmc19ibWJ0X3JlY190CSpyKQoreworI2lmIFhGU19CSUdfQkxLTk9TCisJcmV0dXJuICgoKHhmc19mc2Jsb2NrX3QpSU5UX0dFVChyLT5sMCwgQVJDSF9DT05WRVJUKSAmIFhGU19NQVNLNjRMTyg5KSkgPDwgNDMpIHwKKwkgICAgICAgKCgoeGZzX2ZzYmxvY2tfdClJTlRfR0VUKHItPmwxLCBBUkNIX0NPTlZFUlQpKSA+PiAyMSk7CisjZWxzZQorI2lmZGVmIERFQlVHCisJeGZzX2Rmc2Jub190CWI7CisKKwliID0gKCgoeGZzX2Rmc2Jub190KUlOVF9HRVQoci0+bDAsIEFSQ0hfQ09OVkVSVCkgJiBYRlNfTUFTSzY0TE8oOSkpIDw8IDQzKSB8CisJICAgICgoKHhmc19kZnNibm9fdClJTlRfR0VUKHItPmwxLCBBUkNIX0NPTlZFUlQpKSA+PiAyMSk7CisJQVNTRVJUKChiID4+IDMyKSA9PSAwIHx8IElTTlVMTERTVEFSVEJMT0NLKGIpKTsKKwlyZXR1cm4gKHhmc19mc2Jsb2NrX3QpYjsKKyNlbHNlCS8qICFERUJVRyAqLworCXJldHVybiAoeGZzX2ZzYmxvY2tfdCkoKCh4ZnNfZGZzYm5vX3QpSU5UX0dFVChyLT5sMSwgQVJDSF9DT05WRVJUKSkgPj4gMjEpOworI2VuZGlmCS8qIERFQlVHICovCisjZW5kaWYJLyogWEZTX0JJR19CTEtOT1MgKi8KK30KKworLyoKKyAqIEV4dHJhY3QgdGhlIHN0YXJ0b2ZmIGZpZWxkIGZyb20gYSBkaXNrIGZvcm1hdCBibWFwIGV4dGVudCByZWNvcmQuCisgKi8KK3hmc19maWxlb2ZmX3QKK3hmc19ibWJ0X2Rpc2tfZ2V0X3N0YXJ0b2ZmKAorCXhmc19ibWJ0X3JlY190CSpyKQoreworCXJldHVybiAoKHhmc19maWxlb2ZmX3QpSU5UX0dFVChyLT5sMCwgQVJDSF9DT05WRVJUKSAmCisJCSBYRlNfTUFTSzY0TE8oNjQgLSBCTUJUX0VYTlRGTEFHX0JJVExFTikpID4+IDk7Cit9CisKK3hmc19leG50c3RfdAoreGZzX2JtYnRfZGlza19nZXRfc3RhdGUoCisJeGZzX2JtYnRfcmVjX3QgICpyKQoreworCWludAlleHRfZmxhZzsKKworCWV4dF9mbGFnID0gKGludCkoKElOVF9HRVQoci0+bDAsIEFSQ0hfQ09OVkVSVCkpID4+ICg2NCAtIEJNQlRfRVhOVEZMQUdfQklUTEVOKSk7CisJcmV0dXJuIHhmc19leHRlbnRfc3RhdGUoeGZzX2JtYnRfZGlza19nZXRfYmxvY2tjb3VudChyKSwKKwkJCQlleHRfZmxhZyk7Cit9CisjZW5kaWYKKworCisvKgorICogSW5jcmVtZW50IGN1cnNvciBieSBvbmUgcmVjb3JkIGF0IHRoZSBsZXZlbC4KKyAqIEZvciBub256ZXJvIGxldmVscyB0aGUgbGVhZi13YXJkIGluZm9ybWF0aW9uIGlzIHVudG91Y2hlZC4KKyAqLworaW50CQkJCQkJLyogZXJyb3IgKi8KK3hmc19ibWJ0X2luY3JlbWVudCgKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCisJaW50CQkJbGV2ZWwsCisJaW50CQkJKnN0YXQpCQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK3sKKwl4ZnNfYm1idF9ibG9ja190CSpibG9jazsKKwl4ZnNfYnVmX3QJCSpicDsKKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworI2lmZGVmIFhGU19CTUJUX1RSQUNFCisJc3RhdGljIGNoYXIJCWZuYW1lW10gPSAieGZzX2JtYnRfaW5jcmVtZW50IjsKKyNlbmRpZgorCXhmc19mc2Jsb2NrX3QJCWZzYm5vOworCWludAkJCWxldjsKKwl4ZnNfbW91bnRfdAkJKm1wOworCXhmc190cmFuc190CQkqdHA7CisKKwlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFTlRSWSk7CisJWEZTX0JNQlRfVFJBQ0VfQVJHSShjdXIsIGxldmVsKTsKKwlBU1NFUlQobGV2ZWwgPCBjdXItPmJjX25sZXZlbHMpOworCWlmIChsZXZlbCA8IGN1ci0+YmNfbmxldmVscyAtIDEpCisJCXhmc19idHJlZV9yZWFkYWhlYWQoY3VyLCBsZXZlbCwgWEZTX0JUQ1VSX1JJR0hUUkEpOworCWJsb2NrID0geGZzX2JtYnRfZ2V0X2Jsb2NrKGN1ciwgbGV2ZWwsICZicCk7CisjaWZkZWYgREVCVUcKKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xibG9jayhjdXIsIGJsb2NrLCBsZXZlbCwgYnApKSkgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCXJldHVybiBlcnJvcjsKKwl9CisjZW5kaWYKKwlpZiAoKytjdXItPmJjX3B0cnNbbGV2ZWxdIDw9IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7CisJCSpzdGF0ID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChJTlRfR0VUKGJsb2NrLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSA9PSBOVUxMREZTQk5PKSB7CisJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOworCQkqc3RhdCA9IDA7CisJCXJldHVybiAwOworCX0KKwlmb3IgKGxldiA9IGxldmVsICsgMTsgbGV2IDwgY3VyLT5iY19ubGV2ZWxzOyBsZXYrKykgeworCQlibG9jayA9IHhmc19ibWJ0X2dldF9ibG9jayhjdXIsIGxldiwgJmJwKTsKKyNpZmRlZiBERUJVRworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xibG9jayhjdXIsIGJsb2NrLCBsZXYsIGJwKSkpIHsKKwkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorI2VuZGlmCisJCWlmICgrK2N1ci0+YmNfcHRyc1tsZXZdIDw9IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpCisJCQlicmVhazsKKwkJaWYgKGxldiA8IGN1ci0+YmNfbmxldmVscyAtIDEpCisJCQl4ZnNfYnRyZWVfcmVhZGFoZWFkKGN1ciwgbGV2LCBYRlNfQlRDVVJfUklHSFRSQSk7CisJfQorCWlmIChsZXYgPT0gY3VyLT5iY19ubGV2ZWxzKSB7CisJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOworCQkqc3RhdCA9IDA7CisJCXJldHVybiAwOworCX0KKwl0cCA9IGN1ci0+YmNfdHA7CisJbXAgPSBjdXItPmJjX21wOworCWZvciAoYmxvY2sgPSB4ZnNfYm1idF9nZXRfYmxvY2soY3VyLCBsZXYsICZicCk7IGxldiA+IGxldmVsOyApIHsKKwkJZnNibm8gPSBJTlRfR0VUKCpYRlNfQk1BUF9QVFJfSUFERFIoYmxvY2ssIGN1ci0+YmNfcHRyc1tsZXZdLCBjdXIpLCBBUkNIX0NPTlZFUlQpOworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmbChtcCwgdHAsIGZzYm5vLCAwLCAmYnAsCisJCQkJWEZTX0JNQVBfQlRSRUVfUkVGKSkpIHsKKwkJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQlsZXYtLTsKKwkJeGZzX2J0cmVlX3NldGJ1ZihjdXIsIGxldiwgYnApOworCQlibG9jayA9IFhGU19CVUZfVE9fQk1CVF9CTE9DSyhicCk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfbGJsb2NrKGN1ciwgYmxvY2ssIGxldiwgYnApKSkgeworCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQkJcmV0dXJuIGVycm9yOworCQl9CisJCWN1ci0+YmNfcHRyc1tsZXZdID0gMTsKKwl9CisJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7CisJKnN0YXQgPSAxOworCXJldHVybiAwOworfQorCisvKgorICogSW5zZXJ0IHRoZSBjdXJyZW50IHJlY29yZCBhdCB0aGUgcG9pbnQgcmVmZXJlbmNlZCBieSBjdXIuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19ibWJ0X2luc2VydCgKKwl4ZnNfYnRyZWVfY3VyX3QJKmN1ciwKKwlpbnQJCSpzdGF0KQkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJaW50CQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworI2lmZGVmIFhGU19CTUJUX1RSQUNFCisJc3RhdGljIGNoYXIJZm5hbWVbXSA9ICJ4ZnNfYm1idF9pbnNlcnQiOworI2VuZGlmCisJaW50CQlpOworCWludAkJbGV2ZWw7CisJeGZzX2ZzYmxvY2tfdAluYm5vOworCXhmc19idHJlZV9jdXJfdAkqbmN1cjsKKwl4ZnNfYm1idF9yZWNfdAlucmVjOworCXhmc19idHJlZV9jdXJfdAkqcGN1cjsKKworCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVOVFJZKTsKKwlsZXZlbCA9IDA7CisJbmJubyA9IE5VTExGU0JMT0NLOworCXhmc19ibWJ0X2Rpc2tfc2V0X2FsbCgmbnJlYywgJmN1ci0+YmNfcmVjLmIpOworCW5jdXIgPSAoeGZzX2J0cmVlX2N1cl90ICopMDsKKwlwY3VyID0gY3VyOworCWRvIHsKKwkJaWYgKChlcnJvciA9IHhmc19ibWJ0X2luc3JlYyhwY3VyLCBsZXZlbCsrLCAmbmJubywgJm5yZWMsICZuY3VyLAorCQkJCSZpKSkpIHsKKwkJCWlmIChwY3VyICE9IGN1cikKKwkJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihwY3VyLCBYRlNfQlRSRUVfRVJST1IpOworCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQkJcmV0dXJuIGVycm9yOworCQl9CisJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKwkJaWYgKHBjdXIgIT0gY3VyICYmIChuY3VyIHx8IG5ibm8gPT0gTlVMTEZTQkxPQ0spKSB7CisJCQljdXItPmJjX25sZXZlbHMgPSBwY3VyLT5iY19ubGV2ZWxzOworCQkJY3VyLT5iY19wcml2YXRlLmIuYWxsb2NhdGVkICs9CisJCQkJcGN1ci0+YmNfcHJpdmF0ZS5iLmFsbG9jYXRlZDsKKwkJCXBjdXItPmJjX3ByaXZhdGUuYi5hbGxvY2F0ZWQgPSAwOworCQkJQVNTRVJUKChjdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrICE9IE5VTExGU0JMT0NLKSB8fAorCQkJICAgICAgIChjdXItPmJjX3ByaXZhdGUuYi5pcC0+aV9kLmRpX2ZsYWdzICYKKwkJCQlYRlNfRElGTEFHX1JFQUxUSU1FKSk7CisJCQljdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrID0KKwkJCQlwY3VyLT5iY19wcml2YXRlLmIuZmlyc3RibG9jazsKKwkJCUFTU0VSVChjdXItPmJjX3ByaXZhdGUuYi5mbGlzdCA9PQorCQkJICAgICAgIHBjdXItPmJjX3ByaXZhdGUuYi5mbGlzdCk7CisJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihwY3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CisJCX0KKwkJaWYgKG5jdXIpIHsKKwkJCXBjdXIgPSBuY3VyOworCQkJbmN1ciA9ICh4ZnNfYnRyZWVfY3VyX3QgKikwOworCQl9CisJfSB3aGlsZSAobmJubyAhPSBOVUxMRlNCTE9DSyk7CisJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7CisJKnN0YXQgPSBpOworCXJldHVybiAwOworZXJyb3IwOgorCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBMb2cgZmllbGRzIGZyb20gdGhlIGJ0cmVlIGJsb2NrIGhlYWRlci4KKyAqLwordm9pZAoreGZzX2JtYnRfbG9nX2Jsb2NrKAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwKKwl4ZnNfYnVmX3QJCSpicCwKKwlpbnQJCQlmaWVsZHMpCit7CisJaW50CQkJZmlyc3Q7CisjaWZkZWYgWEZTX0JNQlRfVFJBQ0UKKwlzdGF0aWMgY2hhcgkJZm5hbWVbXSA9ICJ4ZnNfYm1idF9sb2dfYmxvY2siOworI2VuZGlmCisJaW50CQkJbGFzdDsKKwl4ZnNfdHJhbnNfdAkJKnRwOworCXN0YXRpYyBjb25zdCBzaG9ydAlvZmZzZXRzW10gPSB7CisJCW9mZnNldG9mKHhmc19ibWJ0X2Jsb2NrX3QsIGJiX21hZ2ljKSwKKwkJb2Zmc2V0b2YoeGZzX2JtYnRfYmxvY2tfdCwgYmJfbGV2ZWwpLAorCQlvZmZzZXRvZih4ZnNfYm1idF9ibG9ja190LCBiYl9udW1yZWNzKSwKKwkJb2Zmc2V0b2YoeGZzX2JtYnRfYmxvY2tfdCwgYmJfbGVmdHNpYiksCisJCW9mZnNldG9mKHhmc19ibWJ0X2Jsb2NrX3QsIGJiX3JpZ2h0c2liKSwKKwkJc2l6ZW9mKHhmc19ibWJ0X2Jsb2NrX3QpCisJfTsKKworCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVOVFJZKTsKKwlYRlNfQk1CVF9UUkFDRV9BUkdCSShjdXIsIGJwLCBmaWVsZHMpOworCXRwID0gY3VyLT5iY190cDsKKwlpZiAoYnApIHsKKwkJeGZzX2J0cmVlX29mZnNldHMoZmllbGRzLCBvZmZzZXRzLCBYRlNfQkJfTlVNX0JJVFMsICZmaXJzdCwKKwkJCQkgICZsYXN0KTsKKwkJeGZzX3RyYW5zX2xvZ19idWYodHAsIGJwLCBmaXJzdCwgbGFzdCk7CisJfSBlbHNlCisJCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGN1ci0+YmNfcHJpdmF0ZS5iLmlwLAorCQkJWEZTX0lMT0dfRkJST09UKGN1ci0+YmNfcHJpdmF0ZS5iLndoaWNoZm9yaykpOworCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOworfQorCisvKgorICogTG9nIHJlY29yZCB2YWx1ZXMgZnJvbSB0aGUgYnRyZWUgYmxvY2suCisgKi8KK3ZvaWQKK3hmc19ibWJ0X2xvZ19yZWNzKAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwKKwl4ZnNfYnVmX3QJCSpicCwKKwlpbnQJCQlyZmlyc3QsCisJaW50CQkJcmxhc3QpCit7CisJeGZzX2JtYnRfYmxvY2tfdAkqYmxvY2s7CisJaW50CQkJZmlyc3Q7CisjaWZkZWYgWEZTX0JNQlRfVFJBQ0UKKwlzdGF0aWMgY2hhcgkJZm5hbWVbXSA9ICJ4ZnNfYm1idF9sb2dfcmVjcyI7CisjZW5kaWYKKwlpbnQJCQlsYXN0OworCXhmc19ibWJ0X3JlY190CQkqcnA7CisJeGZzX3RyYW5zX3QJCSp0cDsKKworCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVOVFJZKTsKKwlYRlNfQk1CVF9UUkFDRV9BUkdCSUkoY3VyLCBicCwgcmZpcnN0LCBybGFzdCk7CisJQVNTRVJUKGJwKTsKKwl0cCA9IGN1ci0+YmNfdHA7CisJYmxvY2sgPSBYRlNfQlVGX1RPX0JNQlRfQkxPQ0soYnApOworCXJwID0gWEZTX0JNQVBfUkVDX0RBRERSKGJsb2NrLCAxLCBjdXIpOworCWZpcnN0ID0gKGludCkoKHhmc19jYWRkcl90KSZycFtyZmlyc3QgLSAxXSAtICh4ZnNfY2FkZHJfdClibG9jayk7CisJbGFzdCA9IChpbnQpKCgoeGZzX2NhZGRyX3QpJnJwW3JsYXN0XSAtIDEpIC0gKHhmc19jYWRkcl90KWJsb2NrKTsKKwl4ZnNfdHJhbnNfbG9nX2J1Zih0cCwgYnAsIGZpcnN0LCBsYXN0KTsKKwlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFWElUKTsKK30KKworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2JtYnRfbG9va3VwX2VxKAorCXhmc19idHJlZV9jdXJfdAkqY3VyLAorCXhmc19maWxlb2ZmX3QJb2ZmLAorCXhmc19mc2Jsb2NrX3QJYm5vLAorCXhmc19maWxibGtzX3QJbGVuLAorCWludAkJKnN0YXQpCQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK3sKKwljdXItPmJjX3JlYy5iLmJyX3N0YXJ0b2ZmID0gb2ZmOworCWN1ci0+YmNfcmVjLmIuYnJfc3RhcnRibG9jayA9IGJubzsKKwljdXItPmJjX3JlYy5iLmJyX2Jsb2NrY291bnQgPSBsZW47CisJcmV0dXJuIHhmc19ibWJ0X2xvb2t1cChjdXIsIFhGU19MT09LVVBfRVEsIHN0YXQpOworfQorCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYm1idF9sb29rdXBfZ2UoCisJeGZzX2J0cmVlX2N1cl90CSpjdXIsCisJeGZzX2ZpbGVvZmZfdAlvZmYsCisJeGZzX2ZzYmxvY2tfdAlibm8sCisJeGZzX2ZpbGJsa3NfdAlsZW4sCisJaW50CQkqc3RhdCkJCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworeworCWN1ci0+YmNfcmVjLmIuYnJfc3RhcnRvZmYgPSBvZmY7CisJY3VyLT5iY19yZWMuYi5icl9zdGFydGJsb2NrID0gYm5vOworCWN1ci0+YmNfcmVjLmIuYnJfYmxvY2tjb3VudCA9IGxlbjsKKwlyZXR1cm4geGZzX2JtYnRfbG9va3VwKGN1ciwgWEZTX0xPT0tVUF9HRSwgc3RhdCk7Cit9CisKK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19ibWJ0X2xvb2t1cF9sZSgKKwl4ZnNfYnRyZWVfY3VyX3QJKmN1ciwKKwl4ZnNfZmlsZW9mZl90CW9mZiwKKwl4ZnNfZnNibG9ja190CWJubywKKwl4ZnNfZmlsYmxrc190CWxlbiwKKwlpbnQJCSpzdGF0KQkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJY3VyLT5iY19yZWMuYi5icl9zdGFydG9mZiA9IG9mZjsKKwljdXItPmJjX3JlYy5iLmJyX3N0YXJ0YmxvY2sgPSBibm87CisJY3VyLT5iY19yZWMuYi5icl9ibG9ja2NvdW50ID0gbGVuOworCXJldHVybiB4ZnNfYm1idF9sb29rdXAoY3VyLCBYRlNfTE9PS1VQX0xFLCBzdGF0KTsKK30KKworLyoKKyAqIEdpdmUgdGhlIGJtYXAgYnRyZWUgYSBuZXcgcm9vdCBibG9jay4gIENvcHkgdGhlIG9sZCBicm9vdCBjb250ZW50cworICogZG93biBpbnRvIGEgcmVhbCBibG9jayBhbmQgbWFrZSB0aGUgYnJvb3QgcG9pbnQgdG8gaXQuCisgKi8KK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfYm1idF9uZXdyb290KAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJCSpsb2dmbGFncywJLyogbG9nZ2luZyBmbGFncyBmb3IgaW5vZGUgKi8KKwlpbnQJCQkqc3RhdCkJCS8qIHJldHVybiBzdGF0dXMgLSAwIGZhaWwgKi8KK3sKKwl4ZnNfYWxsb2NfYXJnX3QJCWFyZ3M7CQkvKiBhbGxvY2F0aW9uIGFyZ3VtZW50cyAqLworCXhmc19ibWJ0X2Jsb2NrX3QJKmJsb2NrOwkJLyogYm1hcCBidHJlZSBibG9jayAqLworCXhmc19idWZfdAkJKmJwOwkJLyogYnVmZmVyIGZvciBibG9jayAqLworCXhmc19ibWJ0X2Jsb2NrX3QJKmNibG9jazsJLyogY2hpbGQgYnRyZWUgYmxvY2sgKi8KKwl4ZnNfYm1idF9rZXlfdAkJKmNrcDsJCS8qIGNoaWxkIGtleSBwb2ludGVyICovCisJeGZzX2JtYnRfcHRyX3QJCSpjcHA7CQkvKiBjaGlsZCBwdHIgcG9pbnRlciAqLworCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIGNvZGUgKi8KKyNpZmRlZiBYRlNfQk1CVF9UUkFDRQorCXN0YXRpYyBjaGFyCQlmbmFtZVtdID0gInhmc19ibWJ0X25ld3Jvb3QiOworI2VuZGlmCisjaWZkZWYgREVCVUcKKwlpbnQJCQlpOwkJLyogbG9vcCBjb3VudGVyICovCisjZW5kaWYKKwl4ZnNfYm1idF9rZXlfdAkJKmtwOwkJLyogcG9pbnRlciB0byBibWFwIGJ0cmVlIGtleSAqLworCWludAkJCWxldmVsOwkJLyogYnRyZWUgbGV2ZWwgKi8KKwl4ZnNfYm1idF9wdHJfdAkJKnBwOwkJLyogcG9pbnRlciB0byBibWFwIGJsb2NrIGFkZHIgKi8KKworCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVOVFJZKTsKKwlsZXZlbCA9IGN1ci0+YmNfbmxldmVscyAtIDE7CisJYmxvY2sgPSB4ZnNfYm1idF9nZXRfYmxvY2soY3VyLCBsZXZlbCwgJmJwKTsKKwkvKgorCSAqIENvcHkgdGhlIHJvb3QgaW50byBhIHJlYWwgYmxvY2suCisJICovCisJYXJncy5tcCA9IGN1ci0+YmNfbXA7CisJcHAgPSBYRlNfQk1BUF9QVFJfSUFERFIoYmxvY2ssIDEsIGN1cik7CisJYXJncy50cCA9IGN1ci0+YmNfdHA7CisJYXJncy5mc2JubyA9IGN1ci0+YmNfcHJpdmF0ZS5iLmZpcnN0YmxvY2s7CisJYXJncy5tb2QgPSBhcmdzLm1pbmxlZnQgPSBhcmdzLmFsaWdubWVudCA9IGFyZ3MudG90YWwgPSBhcmdzLmlzZmwgPQorCQlhcmdzLnVzZXJkYXRhID0gYXJncy5taW5hbGlnbnNsb3AgPSAwOworCWFyZ3MubWlubGVuID0gYXJncy5tYXhsZW4gPSBhcmdzLnByb2QgPSAxOworCWFyZ3Mud2FzZGVsID0gY3VyLT5iY19wcml2YXRlLmIuZmxhZ3MgJiBYRlNfQlRDVVJfQlBSVl9XQVNERUw7CisJaWYgKGFyZ3MuZnNibm8gPT0gTlVMTEZTQkxPQ0spIHsKKyNpZmRlZiBERUJVRworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xwdHIoY3VyLCBJTlRfR0VUKCpwcCwgQVJDSF9DT05WRVJUKSwgbGV2ZWwpKSkgeworCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQkJcmV0dXJuIGVycm9yOworCQl9CisjZW5kaWYKKwkJYXJncy5mc2JubyA9IElOVF9HRVQoKnBwLCBBUkNIX0NPTlZFUlQpOworCQlhcmdzLnR5cGUgPSBYRlNfQUxMT0NUWVBFX1NUQVJUX0JOTzsKKwl9IGVsc2UgaWYgKGFyZ3Mud2FzZGVsKQorCQlhcmdzLnR5cGUgPSBYRlNfQUxMT0NUWVBFX0ZJUlNUX0FHOworCWVsc2UKKwkJYXJncy50eXBlID0gWEZTX0FMTE9DVFlQRV9ORUFSX0JOTzsKKwlpZiAoKGVycm9yID0geGZzX2FsbG9jX3ZleHRlbnQoJmFyZ3MpKSkgeworCQlYRlNfQk1CVF9UUkFDRV9DVVJTT1IoY3VyLCBFUlJPUik7CisJCXJldHVybiBlcnJvcjsKKwl9CisJaWYgKGFyZ3MuZnNibm8gPT0gTlVMTEZTQkxPQ0spIHsKKwkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7CisJCSpzdGF0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCUFTU0VSVChhcmdzLmxlbiA9PSAxKTsKKwljdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrID0gYXJncy5mc2JubzsKKwljdXItPmJjX3ByaXZhdGUuYi5hbGxvY2F0ZWQrKzsKKwljdXItPmJjX3ByaXZhdGUuYi5pcC0+aV9kLmRpX25ibG9ja3MrKzsKKwlYRlNfVFJBTlNfTU9EX0RRVU9UX0JZSU5PKGFyZ3MubXAsIGFyZ3MudHAsIGN1ci0+YmNfcHJpdmF0ZS5iLmlwLAorCQkJICBYRlNfVFJBTlNfRFFfQkNPVU5ULCAxTCk7CisJYnAgPSB4ZnNfYnRyZWVfZ2V0X2J1ZmwoYXJncy5tcCwgY3VyLT5iY190cCwgYXJncy5mc2JubywgMCk7CisJY2Jsb2NrID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKGJwKTsKKwkqY2Jsb2NrID0gKmJsb2NrOworCUlOVF9NT0QoYmxvY2stPmJiX2xldmVsLCBBUkNIX0NPTlZFUlQsICsxKTsKKwlJTlRfU0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIDEpOworCWN1ci0+YmNfbmxldmVscysrOworCWN1ci0+YmNfcHRyc1tsZXZlbCArIDFdID0gMTsKKwlrcCA9IFhGU19CTUFQX0tFWV9JQUREUihibG9jaywgMSwgY3VyKTsKKwlja3AgPSBYRlNfQk1BUF9LRVlfSUFERFIoY2Jsb2NrLCAxLCBjdXIpOworCW1lbWNweShja3AsIGtwLCBJTlRfR0VUKGNibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAqIHNpemVvZigqa3ApKTsKKwljcHAgPSBYRlNfQk1BUF9QVFJfSUFERFIoY2Jsb2NrLCAxLCBjdXIpOworI2lmZGVmIERFQlVHCisJZm9yIChpID0gMDsgaSA8IElOVF9HRVQoY2Jsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOyBpKyspIHsKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19scHRyKGN1ciwgSU5UX0dFVChwcFtpXSwgQVJDSF9DT05WRVJUKSwgbGV2ZWwpKSkgeworCQkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQkJcmV0dXJuIGVycm9yOworCQl9CisJfQorI2VuZGlmCisJbWVtY3B5KGNwcCwgcHAsIElOVF9HRVQoY2Jsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpwcCkpOworI2lmZGVmIERFQlVHCisJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19scHRyKGN1ciwgKHhmc19ibWJ0X3B0cl90KWFyZ3MuZnNibm8sCisJCQlsZXZlbCkpKSB7CisJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKyNlbmRpZgorCUlOVF9TRVQoKnBwLCBBUkNIX0NPTlZFUlQsIGFyZ3MuZnNibm8pOworCXhmc19pcm9vdF9yZWFsbG9jKGN1ci0+YmNfcHJpdmF0ZS5iLmlwLCAxIC0gSU5UX0dFVChjYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCksCisJCWN1ci0+YmNfcHJpdmF0ZS5iLndoaWNoZm9yayk7CisJeGZzX2J0cmVlX3NldGJ1ZihjdXIsIGxldmVsLCBicCk7CisJLyoKKwkgKiBEbyBhbGwgdGhpcyBsb2dnaW5nIGF0IHRoZSBlbmQgc28gdGhhdAorCSAqIHRoZSByb290IGlzIGF0IHRoZSByaWdodCBsZXZlbC4KKwkgKi8KKwl4ZnNfYm1idF9sb2dfYmxvY2soY3VyLCBicCwgWEZTX0JCX0FMTF9CSVRTKTsKKwl4ZnNfYm1idF9sb2dfa2V5cyhjdXIsIGJwLCAxLCBJTlRfR0VUKGNibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSk7CisJeGZzX2JtYnRfbG9nX3B0cnMoY3VyLCBicCwgMSwgSU5UX0dFVChjYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpOworCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOworCSpsb2dmbGFncyB8PQorCQlYRlNfSUxPR19DT1JFIHwgWEZTX0lMT0dfRkJST09UKGN1ci0+YmNfcHJpdmF0ZS5iLndoaWNoZm9yayk7CisJKnN0YXQgPSAxOworCXJldHVybiAwOworfQorCisvKgorICogU2V0IGFsbCB0aGUgZmllbGRzIGluIGEgYm1hcCBleHRlbnQgcmVjb3JkIGZyb20gdGhlIHVuY29tcHJlc3NlZCBmb3JtLgorICovCit2b2lkCit4ZnNfYm1idF9zZXRfYWxsKAorCXhmc19ibWJ0X3JlY190CSpyLAorCXhmc19ibWJ0X2lyZWNfdAkqcykKK3sKKwlpbnQJZXh0ZW50X2ZsYWc7CisKKwlBU1NFUlQoKHMtPmJyX3N0YXRlID09IFhGU19FWFRfTk9STSkgfHwKKwkJKHMtPmJyX3N0YXRlID09IFhGU19FWFRfVU5XUklUVEVOKSk7CisJZXh0ZW50X2ZsYWcgPSAocy0+YnJfc3RhdGUgPT0gWEZTX0VYVF9OT1JNKSA/IDAgOiAxOworCUFTU0VSVCgocy0+YnJfc3RhcnRvZmYgJiBYRlNfTUFTSzY0SEkoOSkpID09IDApOworCUFTU0VSVCgocy0+YnJfYmxvY2tjb3VudCAmIFhGU19NQVNLNjRISSg0MykpID09IDApOworI2lmIFhGU19CSUdfQkxLTk9TCisJQVNTRVJUKChzLT5icl9zdGFydGJsb2NrICYgWEZTX01BU0s2NEhJKDEyKSkgPT0gMCk7CisJci0+bDAgPSAoKHhmc19ibWJ0X3JlY19iYXNlX3QpZXh0ZW50X2ZsYWcgPDwgNjMpIHwKKwkJICgoeGZzX2JtYnRfcmVjX2Jhc2VfdClzLT5icl9zdGFydG9mZiA8PCA5KSB8CisJCSAoKHhmc19ibWJ0X3JlY19iYXNlX3Qpcy0+YnJfc3RhcnRibG9jayA+PiA0Myk7CisJci0+bDEgPSAoKHhmc19ibWJ0X3JlY19iYXNlX3Qpcy0+YnJfc3RhcnRibG9jayA8PCAyMSkgfAorCQkgKCh4ZnNfYm1idF9yZWNfYmFzZV90KXMtPmJyX2Jsb2NrY291bnQgJgorCQkgKHhmc19ibWJ0X3JlY19iYXNlX3QpWEZTX01BU0s2NExPKDIxKSk7CisjZWxzZQkvKiAhWEZTX0JJR19CTEtOT1MgKi8KKwlpZiAoSVNOVUxMU1RBUlRCTE9DSyhzLT5icl9zdGFydGJsb2NrKSkgeworCQlyLT5sMCA9ICgoeGZzX2JtYnRfcmVjX2Jhc2VfdClleHRlbnRfZmxhZyA8PCA2MykgfAorCQkJKCh4ZnNfYm1idF9yZWNfYmFzZV90KXMtPmJyX3N0YXJ0b2ZmIDw8IDkpIHwKKwkJCSAgKHhmc19ibWJ0X3JlY19iYXNlX3QpWEZTX01BU0s2NExPKDkpOworCQlyLT5sMSA9IFhGU19NQVNLNjRISSgxMSkgfAorCQkJICAoKHhmc19ibWJ0X3JlY19iYXNlX3Qpcy0+YnJfc3RhcnRibG9jayA8PCAyMSkgfAorCQkJICAoKHhmc19ibWJ0X3JlY19iYXNlX3Qpcy0+YnJfYmxvY2tjb3VudCAmCisJCQkgICAoeGZzX2JtYnRfcmVjX2Jhc2VfdClYRlNfTUFTSzY0TE8oMjEpKTsKKwl9IGVsc2UgeworCQlyLT5sMCA9ICgoeGZzX2JtYnRfcmVjX2Jhc2VfdClleHRlbnRfZmxhZyA8PCA2MykgfAorCQkJKCh4ZnNfYm1idF9yZWNfYmFzZV90KXMtPmJyX3N0YXJ0b2ZmIDw8IDkpOworCQlyLT5sMSA9ICgoeGZzX2JtYnRfcmVjX2Jhc2VfdClzLT5icl9zdGFydGJsb2NrIDw8IDIxKSB8CisJCQkgICgoeGZzX2JtYnRfcmVjX2Jhc2VfdClzLT5icl9ibG9ja2NvdW50ICYKKwkJCSAgICh4ZnNfYm1idF9yZWNfYmFzZV90KVhGU19NQVNLNjRMTygyMSkpOworCX0KKyNlbmRpZgkvKiBYRlNfQklHX0JMS05PUyAqLworfQorCisvKgorICogU2V0IGFsbCB0aGUgZmllbGRzIGluIGEgYm1hcCBleHRlbnQgcmVjb3JkIGZyb20gdGhlIGFyZ3VtZW50cy4KKyAqLwordm9pZAoreGZzX2JtYnRfc2V0X2FsbGYoCisJeGZzX2JtYnRfcmVjX3QJKnIsCisJeGZzX2ZpbGVvZmZfdAlvLAorCXhmc19mc2Jsb2NrX3QJYiwKKwl4ZnNfZmlsYmxrc190CWMsCisJeGZzX2V4bnRzdF90CXYpCit7CisJaW50CWV4dGVudF9mbGFnOworCisJQVNTRVJUKCh2ID09IFhGU19FWFRfTk9STSkgfHwgKHYgPT0gWEZTX0VYVF9VTldSSVRURU4pKTsKKwlleHRlbnRfZmxhZyA9ICh2ID09IFhGU19FWFRfTk9STSkgPyAwIDogMTsKKwlBU1NFUlQoKG8gJiBYRlNfTUFTSzY0SEkoNjQtQk1CVF9TVEFSVE9GRl9CSVRMRU4pKSA9PSAwKTsKKwlBU1NFUlQoKGMgJiBYRlNfTUFTSzY0SEkoNjQtQk1CVF9CTE9DS0NPVU5UX0JJVExFTikpID09IDApOworI2lmIFhGU19CSUdfQkxLTk9TCisJQVNTRVJUKChiICYgWEZTX01BU0s2NEhJKDY0LUJNQlRfU1RBUlRCTE9DS19CSVRMRU4pKSA9PSAwKTsKKwlyLT5sMCA9ICgoeGZzX2JtYnRfcmVjX2Jhc2VfdClleHRlbnRfZmxhZyA8PCA2MykgfAorCQkoKHhmc19ibWJ0X3JlY19iYXNlX3QpbyA8PCA5KSB8CisJCSgoeGZzX2JtYnRfcmVjX2Jhc2VfdCliID4+IDQzKTsKKwlyLT5sMSA9ICgoeGZzX2JtYnRfcmVjX2Jhc2VfdCliIDw8IDIxKSB8CisJCSgoeGZzX2JtYnRfcmVjX2Jhc2VfdCljICYKKwkJKHhmc19ibWJ0X3JlY19iYXNlX3QpWEZTX01BU0s2NExPKDIxKSk7CisjZWxzZQkvKiAhWEZTX0JJR19CTEtOT1MgKi8KKwlpZiAoSVNOVUxMU1RBUlRCTE9DSyhiKSkgeworCQlyLT5sMCA9ICgoeGZzX2JtYnRfcmVjX2Jhc2VfdClleHRlbnRfZmxhZyA8PCA2MykgfAorCQkJKCh4ZnNfYm1idF9yZWNfYmFzZV90KW8gPDwgOSkgfAorCQkJICh4ZnNfYm1idF9yZWNfYmFzZV90KVhGU19NQVNLNjRMTyg5KTsKKwkJci0+bDEgPSBYRlNfTUFTSzY0SEkoMTEpIHwKKwkJCSAgKCh4ZnNfYm1idF9yZWNfYmFzZV90KWIgPDwgMjEpIHwKKwkJCSAgKCh4ZnNfYm1idF9yZWNfYmFzZV90KWMgJgorCQkJICAgKHhmc19ibWJ0X3JlY19iYXNlX3QpWEZTX01BU0s2NExPKDIxKSk7CisJfSBlbHNlIHsKKwkJci0+bDAgPSAoKHhmc19ibWJ0X3JlY19iYXNlX3QpZXh0ZW50X2ZsYWcgPDwgNjMpIHwKKwkJCSgoeGZzX2JtYnRfcmVjX2Jhc2VfdClvIDw8IDkpOworCQlyLT5sMSA9ICgoeGZzX2JtYnRfcmVjX2Jhc2VfdCliIDw8IDIxKSB8CisJCQkgKCh4ZnNfYm1idF9yZWNfYmFzZV90KWMgJgorCQkJICh4ZnNfYm1idF9yZWNfYmFzZV90KVhGU19NQVNLNjRMTygyMSkpOworCX0KKyNlbmRpZgkvKiBYRlNfQklHX0JMS05PUyAqLworfQorCisjaWYgX19CWVRFX09SREVSICE9IF9fQklHX0VORElBTgorLyoKKyAqIFNldCBhbGwgdGhlIGZpZWxkcyBpbiBhIGJtYXAgZXh0ZW50IHJlY29yZCBmcm9tIHRoZSB1bmNvbXByZXNzZWQgZm9ybS4KKyAqLwordm9pZAoreGZzX2JtYnRfZGlza19zZXRfYWxsKAorCXhmc19ibWJ0X3JlY190CSpyLAorCXhmc19ibWJ0X2lyZWNfdCAqcykKK3sKKwlpbnQJZXh0ZW50X2ZsYWc7CisKKwlBU1NFUlQoKHMtPmJyX3N0YXRlID09IFhGU19FWFRfTk9STSkgfHwKKwkJKHMtPmJyX3N0YXRlID09IFhGU19FWFRfVU5XUklUVEVOKSk7CisJZXh0ZW50X2ZsYWcgPSAocy0+YnJfc3RhdGUgPT0gWEZTX0VYVF9OT1JNKSA/IDAgOiAxOworCUFTU0VSVCgocy0+YnJfc3RhcnRvZmYgJiBYRlNfTUFTSzY0SEkoOSkpID09IDApOworCUFTU0VSVCgocy0+YnJfYmxvY2tjb3VudCAmIFhGU19NQVNLNjRISSg0MykpID09IDApOworI2lmIFhGU19CSUdfQkxLTk9TCisJQVNTRVJUKChzLT5icl9zdGFydGJsb2NrICYgWEZTX01BU0s2NEhJKDEyKSkgPT0gMCk7CisJSU5UX1NFVChyLT5sMCwgQVJDSF9DT05WRVJULCAoKHhmc19ibWJ0X3JlY19iYXNlX3QpZXh0ZW50X2ZsYWcgPDwgNjMpIHwKKwkJICAoKHhmc19ibWJ0X3JlY19iYXNlX3Qpcy0+YnJfc3RhcnRvZmYgPDwgOSkgfAorCQkgICgoeGZzX2JtYnRfcmVjX2Jhc2VfdClzLT5icl9zdGFydGJsb2NrID4+IDQzKSk7CisJSU5UX1NFVChyLT5sMSwgQVJDSF9DT05WRVJULCAoKHhmc19ibWJ0X3JlY19iYXNlX3Qpcy0+YnJfc3RhcnRibG9jayA8PCAyMSkgfAorCQkgICgoeGZzX2JtYnRfcmVjX2Jhc2VfdClzLT5icl9ibG9ja2NvdW50ICYKKwkJICAgKHhmc19ibWJ0X3JlY19iYXNlX3QpWEZTX01BU0s2NExPKDIxKSkpOworI2Vsc2UJLyogIVhGU19CSUdfQkxLTk9TICovCisJaWYgKElTTlVMTFNUQVJUQkxPQ0socy0+YnJfc3RhcnRibG9jaykpIHsKKwkJSU5UX1NFVChyLT5sMCwgQVJDSF9DT05WRVJULCAoKHhmc19ibWJ0X3JlY19iYXNlX3QpZXh0ZW50X2ZsYWcgPDwgNjMpIHwKKwkJCSgoeGZzX2JtYnRfcmVjX2Jhc2VfdClzLT5icl9zdGFydG9mZiA8PCA5KSB8CisJCQkgICh4ZnNfYm1idF9yZWNfYmFzZV90KVhGU19NQVNLNjRMTyg5KSk7CisJCUlOVF9TRVQoci0+bDEsIEFSQ0hfQ09OVkVSVCwgWEZTX01BU0s2NEhJKDExKSB8CisJCQkgICgoeGZzX2JtYnRfcmVjX2Jhc2VfdClzLT5icl9zdGFydGJsb2NrIDw8IDIxKSB8CisJCQkgICgoeGZzX2JtYnRfcmVjX2Jhc2VfdClzLT5icl9ibG9ja2NvdW50ICYKKwkJCSAgICh4ZnNfYm1idF9yZWNfYmFzZV90KVhGU19NQVNLNjRMTygyMSkpKTsKKwl9IGVsc2UgeworCQlJTlRfU0VUKHItPmwwLCBBUkNIX0NPTlZFUlQsICgoeGZzX2JtYnRfcmVjX2Jhc2VfdClleHRlbnRfZmxhZyA8PCA2MykgfAorCQkJKCh4ZnNfYm1idF9yZWNfYmFzZV90KXMtPmJyX3N0YXJ0b2ZmIDw8IDkpKTsKKwkJSU5UX1NFVChyLT5sMSwgQVJDSF9DT05WRVJULCAoKHhmc19ibWJ0X3JlY19iYXNlX3Qpcy0+YnJfc3RhcnRibG9jayA8PCAyMSkgfAorCQkJICAoKHhmc19ibWJ0X3JlY19iYXNlX3Qpcy0+YnJfYmxvY2tjb3VudCAmCisJCQkgICAoeGZzX2JtYnRfcmVjX2Jhc2VfdClYRlNfTUFTSzY0TE8oMjEpKSk7CisJfQorI2VuZGlmCS8qIFhGU19CSUdfQkxLTk9TICovCit9CisKKy8qCisgKiBTZXQgYWxsIHRoZSBmaWVsZHMgaW4gYSBkaXNrIGZvcm1hdCBibWFwIGV4dGVudCByZWNvcmQgZnJvbSB0aGUgYXJndW1lbnRzLgorICovCit2b2lkCit4ZnNfYm1idF9kaXNrX3NldF9hbGxmKAorCXhmc19ibWJ0X3JlY190CSpyLAorCXhmc19maWxlb2ZmX3QJbywKKwl4ZnNfZnNibG9ja190CWIsCisJeGZzX2ZpbGJsa3NfdAljLAorCXhmc19leG50c3RfdAl2KQoreworCWludAlleHRlbnRfZmxhZzsKKworCUFTU0VSVCgodiA9PSBYRlNfRVhUX05PUk0pIHx8ICh2ID09IFhGU19FWFRfVU5XUklUVEVOKSk7CisJZXh0ZW50X2ZsYWcgPSAodiA9PSBYRlNfRVhUX05PUk0pID8gMCA6IDE7CisJQVNTRVJUKChvICYgWEZTX01BU0s2NEhJKDY0LUJNQlRfU1RBUlRPRkZfQklUTEVOKSkgPT0gMCk7CisJQVNTRVJUKChjICYgWEZTX01BU0s2NEhJKDY0LUJNQlRfQkxPQ0tDT1VOVF9CSVRMRU4pKSA9PSAwKTsKKyNpZiBYRlNfQklHX0JMS05PUworCUFTU0VSVCgoYiAmIFhGU19NQVNLNjRISSg2NC1CTUJUX1NUQVJUQkxPQ0tfQklUTEVOKSkgPT0gMCk7CisJSU5UX1NFVChyLT5sMCwgQVJDSF9DT05WRVJULCAoKHhmc19ibWJ0X3JlY19iYXNlX3QpZXh0ZW50X2ZsYWcgPDwgNjMpIHwKKwkJKCh4ZnNfYm1idF9yZWNfYmFzZV90KW8gPDwgOSkgfAorCQkoKHhmc19ibWJ0X3JlY19iYXNlX3QpYiA+PiA0MykpOworCUlOVF9TRVQoci0+bDEsIEFSQ0hfQ09OVkVSVCwgKCh4ZnNfYm1idF9yZWNfYmFzZV90KWIgPDwgMjEpIHwKKwkJICAoKHhmc19ibWJ0X3JlY19iYXNlX3QpYyAmCisJCSAgICh4ZnNfYm1idF9yZWNfYmFzZV90KVhGU19NQVNLNjRMTygyMSkpKTsKKyNlbHNlCS8qICFYRlNfQklHX0JMS05PUyAqLworCWlmIChJU05VTExTVEFSVEJMT0NLKGIpKSB7CisJCUlOVF9TRVQoci0+bDAsIEFSQ0hfQ09OVkVSVCwgKCh4ZnNfYm1idF9yZWNfYmFzZV90KWV4dGVudF9mbGFnIDw8IDYzKSB8CisJCQkoKHhmc19ibWJ0X3JlY19iYXNlX3QpbyA8PCA5KSB8CisJCQkgKHhmc19ibWJ0X3JlY19iYXNlX3QpWEZTX01BU0s2NExPKDkpKTsKKwkJSU5UX1NFVChyLT5sMSwgQVJDSF9DT05WRVJULCBYRlNfTUFTSzY0SEkoMTEpIHwKKwkJCSAgKCh4ZnNfYm1idF9yZWNfYmFzZV90KWIgPDwgMjEpIHwKKwkJCSAgKCh4ZnNfYm1idF9yZWNfYmFzZV90KWMgJgorCQkJICAgKHhmc19ibWJ0X3JlY19iYXNlX3QpWEZTX01BU0s2NExPKDIxKSkpOworCX0gZWxzZSB7CisJCUlOVF9TRVQoci0+bDAsIEFSQ0hfQ09OVkVSVCwgKCh4ZnNfYm1idF9yZWNfYmFzZV90KWV4dGVudF9mbGFnIDw8IDYzKSB8CisJCQkoKHhmc19ibWJ0X3JlY19iYXNlX3QpbyA8PCA5KSk7CisJCUlOVF9TRVQoci0+bDEsIEFSQ0hfQ09OVkVSVCwgKCh4ZnNfYm1idF9yZWNfYmFzZV90KWIgPDwgMjEpIHwKKwkJCSAgKCh4ZnNfYm1idF9yZWNfYmFzZV90KWMgJgorCQkJICAgKHhmc19ibWJ0X3JlY19iYXNlX3QpWEZTX01BU0s2NExPKDIxKSkpOworCX0KKyNlbmRpZgkvKiBYRlNfQklHX0JMS05PUyAqLworfQorI2VuZGlmCisKKy8qCisgKiBTZXQgdGhlIGJsb2NrY291bnQgZmllbGQgaW4gYSBibWFwIGV4dGVudCByZWNvcmQuCisgKi8KK3ZvaWQKK3hmc19ibWJ0X3NldF9ibG9ja2NvdW50KAorCXhmc19ibWJ0X3JlY190CSpyLAorCXhmc19maWxibGtzX3QJdikKK3sKKwlBU1NFUlQoKHYgJiBYRlNfTUFTSzY0SEkoNDMpKSA9PSAwKTsKKwlyLT5sMSA9IChyLT5sMSAmICh4ZnNfYm1idF9yZWNfYmFzZV90KVhGU19NQVNLNjRISSg0MykpIHwKKwkJICAoeGZzX2JtYnRfcmVjX2Jhc2VfdCkodiAmIFhGU19NQVNLNjRMTygyMSkpOworfQorCisvKgorICogU2V0IHRoZSBzdGFydGJsb2NrIGZpZWxkIGluIGEgYm1hcCBleHRlbnQgcmVjb3JkLgorICovCit2b2lkCit4ZnNfYm1idF9zZXRfc3RhcnRibG9jaygKKwl4ZnNfYm1idF9yZWNfdAkqciwKKwl4ZnNfZnNibG9ja190CXYpCit7CisjaWYgWEZTX0JJR19CTEtOT1MKKwlBU1NFUlQoKHYgJiBYRlNfTUFTSzY0SEkoMTIpKSA9PSAwKTsKKwlyLT5sMCA9IChyLT5sMCAmICh4ZnNfYm1idF9yZWNfYmFzZV90KVhGU19NQVNLNjRISSg1NSkpIHwKKwkJICAoeGZzX2JtYnRfcmVjX2Jhc2VfdCkodiA+PiA0Myk7CisJci0+bDEgPSAoci0+bDEgJiAoeGZzX2JtYnRfcmVjX2Jhc2VfdClYRlNfTUFTSzY0TE8oMjEpKSB8CisJCSAgKHhmc19ibWJ0X3JlY19iYXNlX3QpKHYgPDwgMjEpOworI2Vsc2UJLyogIVhGU19CSUdfQkxLTk9TICovCisJaWYgKElTTlVMTFNUQVJUQkxPQ0sodikpIHsKKwkJci0+bDAgfD0gKHhmc19ibWJ0X3JlY19iYXNlX3QpWEZTX01BU0s2NExPKDkpOworCQlyLT5sMSA9ICh4ZnNfYm1idF9yZWNfYmFzZV90KVhGU19NQVNLNjRISSgxMSkgfAorCQkJICAoKHhmc19ibWJ0X3JlY19iYXNlX3QpdiA8PCAyMSkgfAorCQkJICAoci0+bDEgJiAoeGZzX2JtYnRfcmVjX2Jhc2VfdClYRlNfTUFTSzY0TE8oMjEpKTsKKwl9IGVsc2UgeworCQlyLT5sMCAmPSB+KHhmc19ibWJ0X3JlY19iYXNlX3QpWEZTX01BU0s2NExPKDkpOworCQlyLT5sMSA9ICgoeGZzX2JtYnRfcmVjX2Jhc2VfdCl2IDw8IDIxKSB8CisJCQkgIChyLT5sMSAmICh4ZnNfYm1idF9yZWNfYmFzZV90KVhGU19NQVNLNjRMTygyMSkpOworCX0KKyNlbmRpZgkvKiBYRlNfQklHX0JMS05PUyAqLworfQorCisvKgorICogU2V0IHRoZSBzdGFydG9mZiBmaWVsZCBpbiBhIGJtYXAgZXh0ZW50IHJlY29yZC4KKyAqLwordm9pZAoreGZzX2JtYnRfc2V0X3N0YXJ0b2ZmKAorCXhmc19ibWJ0X3JlY190CSpyLAorCXhmc19maWxlb2ZmX3QJdikKK3sKKwlBU1NFUlQoKHYgJiBYRlNfTUFTSzY0SEkoOSkpID09IDApOworCXItPmwwID0gKHItPmwwICYgKHhmc19ibWJ0X3JlY19iYXNlX3QpIFhGU19NQVNLNjRISSgxKSkgfAorCQkoKHhmc19ibWJ0X3JlY19iYXNlX3QpdiA8PCA5KSB8CisJCSAgKHItPmwwICYgKHhmc19ibWJ0X3JlY19iYXNlX3QpWEZTX01BU0s2NExPKDkpKTsKK30KKworLyoKKyAqIFNldCB0aGUgZXh0ZW50IHN0YXRlIGZpZWxkIGluIGEgYm1hcCBleHRlbnQgcmVjb3JkLgorICovCit2b2lkCit4ZnNfYm1idF9zZXRfc3RhdGUoCisJeGZzX2JtYnRfcmVjX3QJKnIsCisJeGZzX2V4bnRzdF90CXYpCit7CisJQVNTRVJUKHYgPT0gWEZTX0VYVF9OT1JNIHx8IHYgPT0gWEZTX0VYVF9VTldSSVRURU4pOworCWlmICh2ID09IFhGU19FWFRfTk9STSkKKwkJci0+bDAgJj0gWEZTX01BU0s2NExPKDY0IC0gQk1CVF9FWE5URkxBR19CSVRMRU4pOworCWVsc2UKKwkJci0+bDAgfD0gWEZTX01BU0s2NEhJKEJNQlRfRVhOVEZMQUdfQklUTEVOKTsKK30KKworLyoKKyAqIENvbnZlcnQgaW4tbWVtb3J5IGZvcm0gb2YgYnRyZWUgcm9vdCB0byBvbi1kaXNrIGZvcm0uCisgKi8KK3ZvaWQKK3hmc19ibWJ0X3RvX2JtZHIoCisJeGZzX2JtYnRfYmxvY2tfdAkqcmJsb2NrLAorCWludAkJCXJibG9ja2xlbiwKKwl4ZnNfYm1kcl9ibG9ja190CSpkYmxvY2ssCisJaW50CQkJZGJsb2NrbGVuKQoreworCWludAkJCWRteHI7CisJeGZzX2JtYnRfa2V5X3QJCSpma3A7CisJeGZzX2JtYnRfcHRyX3QJCSpmcHA7CisJeGZzX2JtYnRfa2V5X3QJCSp0a3A7CisJeGZzX2JtYnRfcHRyX3QJCSp0cHA7CisKKwlBU1NFUlQoSU5UX0dFVChyYmxvY2stPmJiX21hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19CTUFQX01BR0lDKTsKKwlBU1NFUlQoSU5UX0dFVChyYmxvY2stPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTERGU0JOTyk7CisJQVNTRVJUKElOVF9HRVQocmJsb2NrLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSA9PSBOVUxMREZTQk5PKTsKKwlBU1NFUlQoSU5UX0dFVChyYmxvY2stPmJiX2xldmVsLCBBUkNIX0NPTlZFUlQpID4gMCk7CisJZGJsb2NrLT5iYl9sZXZlbCA9IHJibG9jay0+YmJfbGV2ZWw7CS8qIGJvdGggaW4gb24tZGlzayBmb3JtYXQgKi8KKwlkYmxvY2stPmJiX251bXJlY3MgPSByYmxvY2stPmJiX251bXJlY3M7LyogYm90aCBpbiBvbi1kaXNrIGZvcm1hdCAqLworCWRteHIgPSAoaW50KVhGU19CVFJFRV9CTE9DS19NQVhSRUNTKGRibG9ja2xlbiwgeGZzX2JtZHIsIDApOworCWZrcCA9IFhGU19CTUFQX0JST09UX0tFWV9BRERSKHJibG9jaywgMSwgcmJsb2NrbGVuKTsKKwl0a3AgPSBYRlNfQlRSRUVfS0VZX0FERFIoZGJsb2NrbGVuLCB4ZnNfYm1kciwgZGJsb2NrLCAxLCBkbXhyKTsKKwlmcHAgPSBYRlNfQk1BUF9CUk9PVF9QVFJfQUREUihyYmxvY2ssIDEsIHJibG9ja2xlbik7CisJdHBwID0gWEZTX0JUUkVFX1BUUl9BRERSKGRibG9ja2xlbiwgeGZzX2JtZHIsIGRibG9jaywgMSwgZG14cik7CisJZG14ciA9IElOVF9HRVQoZGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOworCW1lbWNweSh0a3AsIGZrcCwgc2l6ZW9mKCpma3ApICogZG14cik7CisJbWVtY3B5KHRwcCwgZnBwLCBzaXplb2YoKmZwcCkgKiBkbXhyKTsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KK30KKworLyoKKyAqIFVwZGF0ZSB0aGUgcmVjb3JkIHRvIHRoZSBwYXNzZWQgdmFsdWVzLgorICovCitpbnQKK3hmc19ibWJ0X3VwZGF0ZSgKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCisJeGZzX2ZpbGVvZmZfdAkJb2ZmLAorCXhmc19mc2Jsb2NrX3QJCWJubywKKwl4ZnNfZmlsYmxrc190CQlsZW4sCisJeGZzX2V4bnRzdF90CQlzdGF0ZSkKK3sKKwl4ZnNfYm1idF9ibG9ja190CSpibG9jazsKKwl4ZnNfYnVmX3QJCSpicDsKKwlpbnQJCQllcnJvcjsKKyNpZmRlZiBYRlNfQk1CVF9UUkFDRQorCXN0YXRpYyBjaGFyCQlmbmFtZVtdID0gInhmc19ibWJ0X3VwZGF0ZSI7CisjZW5kaWYKKwl4ZnNfYm1idF9rZXlfdAkJa2V5OworCWludAkJCXB0cjsKKwl4ZnNfYm1idF9yZWNfdAkJKnJwOworCisJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRU5UUlkpOworCVhGU19CTUJUX1RSQUNFX0FSR0ZGRkkoY3VyLCAoeGZzX2RmaWxvZmZfdClvZmYsICh4ZnNfZGZzYm5vX3QpYm5vLAorCQkoeGZzX2RmaWxibGtzX3QpbGVuLCAoaW50KXN0YXRlKTsKKwlibG9jayA9IHhmc19ibWJ0X2dldF9ibG9jayhjdXIsIDAsICZicCk7CisjaWZkZWYgREVCVUcKKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX2xibG9jayhjdXIsIGJsb2NrLCAwLCBicCkpKSB7CisJCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVSUk9SKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKyNlbmRpZgorCXB0ciA9IGN1ci0+YmNfcHRyc1swXTsKKwlycCA9IFhGU19CTUFQX1JFQ19JQUREUihibG9jaywgcHRyLCBjdXIpOworCXhmc19ibWJ0X2Rpc2tfc2V0X2FsbGYocnAsIG9mZiwgYm5vLCBsZW4sIHN0YXRlKTsKKwl4ZnNfYm1idF9sb2dfcmVjcyhjdXIsIGJwLCBwdHIsIHB0cik7CisJaWYgKHB0ciA+IDEpIHsKKwkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVhJVCk7CisJCXJldHVybiAwOworCX0KKwlJTlRfU0VUKGtleS5icl9zdGFydG9mZiwgQVJDSF9DT05WRVJULCBvZmYpOworCWlmICgoZXJyb3IgPSB4ZnNfYm1idF91cGRrZXkoY3VyLCAma2V5LCAxKSkpIHsKKwkJWEZTX0JNQlRfVFJBQ0VfQ1VSU09SKGN1ciwgRVJST1IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCVhGU19CTUJUX1RSQUNFX0NVUlNPUihjdXIsIEVYSVQpOworCXJldHVybiAwOworfQorCisvKgorICogQ2hlY2sgYW4gZXh0ZW50IGxpc3QsIHdoaWNoIGhhcyBqdXN0IGJlZW4gcmVhZCwgZm9yCisgKiBhbnkgYml0IGluIHRoZSBleHRlbnQgZmxhZyBmaWVsZC4gQVNTRVJUIG9uIGRlYnVnCisgKiBrZXJuZWxzLCBhcyB0aGlzIGNvbmRpdGlvbiBzaG91bGQgbm90IG9jY3VyLgorICogUmV0dXJuIGFuIGVycm9yIGNvbmRpdGlvbiAoMSkgaWYgYW55IGZsYWdzIGZvdW5kLAorICogb3RoZXJ3aXNlIHJldHVybiAwLgorICovCisKK2ludAoreGZzX2NoZWNrX25vc3RhdGVfZXh0ZW50cygKKwl4ZnNfYm1idF9yZWNfdAkJKmVwLAorCXhmc19leHRudW1fdAkJbnVtKQoreworCWZvciAoOyBudW0gPiAwOyBudW0tLSwgZXArKykgeworCQlpZiAoKGVwLT5sMCA+PgorCQkgICAgICg2NCAtIEJNQlRfRVhOVEZMQUdfQklUTEVOKSkgIT0gMCkgeworCQkJQVNTRVJUKDApOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2JtYXBfYnRyZWUuaCBiL2ZzL3hmcy94ZnNfYm1hcF9idHJlZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0M2ZmMTIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2JtYXBfYnRyZWUuaApAQCAtMCwwICsxLDcwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCwyMDAyLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLgkgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19CTUFQX0JUUkVFX0hfXworI2RlZmluZSBfX1hGU19CTUFQX0JUUkVFX0hfXworCisjZGVmaW5lIFhGU19CTUFQX01BR0lDCTB4NDI0ZDQxNTAJLyogJ0JNQVAnICovCisKK3N0cnVjdCB4ZnNfYnRyZWVfY3VyOworc3RydWN0IHhmc19idHJlZV9sYmxvY2s7CitzdHJ1Y3QgeGZzX21vdW50Oworc3RydWN0IHhmc19pbm9kZTsKKworLyoKKyAqIEJtYXAgcm9vdCBoZWFkZXIsIG9uLWRpc2sgZm9ybSBvbmx5LgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfYm1kcl9ibG9jaworeworCV9fdWludDE2X3QJYmJfbGV2ZWw7CS8qIDAgaXMgYSBsZWFmICovCisJX191aW50MTZfdAliYl9udW1yZWNzOwkvKiBjdXJyZW50ICMgb2YgZGF0YSByZWNvcmRzICovCit9IHhmc19ibWRyX2Jsb2NrX3Q7CisKKy8qCisgKiBCbWFwIGJ0cmVlIHJlY29yZCBhbmQgZXh0ZW50IGRlc2NyaXB0b3IuCisgKiBGb3IgMzItYml0IGtlcm5lbHMsCisgKiAgbDA6MzEgaXMgYW4gZXh0ZW50IGZsYWcgKHZhbHVlIDEgaW5kaWNhdGVzIG5vbi1ub3JtYWwpLgorICogIGwwOjAtMzAgYW5kIGwxOjktMzEgYXJlIHN0YXJ0b2ZmLgorICogIGwxOjAtOCwgbDI6MC0zMSwgYW5kIGwzOjIxLTMxIGFyZSBzdGFydGJsb2NrLgorICogIGwzOjAtMjAgYXJlIGJsb2NrY291bnQuCisgKiBGb3IgNjQtYml0IGtlcm5lbHMsCisgKiAgbDA6NjMgaXMgYW4gZXh0ZW50IGZsYWcgKHZhbHVlIDEgaW5kaWNhdGVzIG5vbi1ub3JtYWwpLgorICogIGwwOjktNjIgYXJlIHN0YXJ0b2ZmLgorICogIGwwOjAtOCBhbmQgbDE6MjEtNjMgYXJlIHN0YXJ0YmxvY2suCisgKiAgbDE6MC0yMCBhcmUgYmxvY2tjb3VudC4KKyAqLworCisjaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorCisjZGVmaW5lIEJNQlRfVE9UQUxfQklUTEVOCTEyOAkvKiAxMjggYml0cywgMTYgYnl0ZXMgKi8KKyNkZWZpbmUgQk1CVF9FWE5URkxBR19CSVRPRkYJMAorI2RlZmluZSBCTUJUX0VYTlRGTEFHX0JJVExFTgkxCisjZGVmaW5lIEJNQlRfU1RBUlRPRkZfQklUT0ZGCShCTUJUX0VYTlRGTEFHX0JJVE9GRiArIEJNQlRfRVhOVEZMQUdfQklUTEVOKQorI2RlZmluZSBCTUJUX1NUQVJUT0ZGX0JJVExFTgk1NAorI2RlZmluZSBCTUJUX1NUQVJUQkxPQ0tfQklUT0ZGCShCTUJUX1NUQVJUT0ZGX0JJVE9GRiArIEJNQlRfU1RBUlRPRkZfQklUTEVOKQorI2RlZmluZSBCTUJUX1NUQVJUQkxPQ0tfQklUTEVOCTUyCisjZGVmaW5lIEJNQlRfQkxPQ0tDT1VOVF9CSVRPRkYJXAorCShCTUJUX1NUQVJUQkxPQ0tfQklUT0ZGICsgQk1CVF9TVEFSVEJMT0NLX0JJVExFTikKKyNkZWZpbmUgQk1CVF9CTE9DS0NPVU5UX0JJVExFTgkoQk1CVF9UT1RBTF9CSVRMRU4gLSBCTUJUX0JMT0NLQ09VTlRfQklUT0ZGKQorCisjZWxzZQorCisjZGVmaW5lIEJNQlRfVE9UQUxfQklUTEVOCTEyOAkvKiAxMjggYml0cywgMTYgYnl0ZXMgKi8KKyNkZWZpbmUgQk1CVF9FWE5URkxBR19CSVRPRkYJNjMKKyNkZWZpbmUgQk1CVF9FWE5URkxBR19CSVRMRU4JMQorI2RlZmluZSBCTUJUX1NUQVJUT0ZGX0JJVE9GRgkoQk1CVF9FWE5URkxBR19CSVRPRkYgLSBCTUJUX1NUQVJUT0ZGX0JJVExFTikKKyNkZWZpbmUgQk1CVF9TVEFSVE9GRl9CSVRMRU4JNTQKKyNkZWZpbmUgQk1CVF9TVEFSVEJMT0NLX0JJVE9GRgk4NSAvKiAxMjggLSA0MyAob3RoZXIgOSBpcyBpbiBmaXJzdCB3b3JkKSAqLworI2RlZmluZSBCTUJUX1NUQVJUQkxPQ0tfQklUTEVOCTUyCisjZGVmaW5lIEJNQlRfQkxPQ0tDT1VOVF9CSVRPRkYJNjQgLyogU3RhcnQgb2Ygc2Vjb25kIDY0IGJpdCBjb250YWluZXIgKi8KKyNkZWZpbmUgQk1CVF9CTE9DS0NPVU5UX0JJVExFTgkyMQorCisjZW5kaWYKKworCisjZGVmaW5lIEJNQlRfVVNFXzY0CTEKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2JtYnRfcmVjXzMyCit7CisJX191aW50MzJfdAkJbDAsIGwxLCBsMiwgbDM7Cit9IHhmc19ibWJ0X3JlY18zMl90OwordHlwZWRlZiBzdHJ1Y3QgeGZzX2JtYnRfcmVjXzY0Cit7CisJX191aW50NjRfdAkJbDAsIGwxOworfSB4ZnNfYm1idF9yZWNfNjRfdDsKKwordHlwZWRlZiBfX3VpbnQ2NF90CXhmc19ibWJ0X3JlY19iYXNlX3Q7CS8qIHVzZSB0aGlzIGZvciBjYXN0cyAqLwordHlwZWRlZiB4ZnNfYm1idF9yZWNfNjRfdCB4ZnNfYm1idF9yZWNfdCwgeGZzX2JtZHJfcmVjX3Q7CisKKy8qCisgKiBWYWx1ZXMgYW5kIG1hY3JvcyBmb3IgZGVsYXllZC1hbGxvY2F0aW9uIHN0YXJ0YmxvY2sgZmllbGRzLgorICovCisjZGVmaW5lIFNUQVJUQkxPQ0tWQUxCSVRTCTE3CisjZGVmaW5lIFNUQVJUQkxPQ0tNQVNLQklUUwkoMTUgKyBYRlNfQklHX0JMS05PUyAqIDIwKQorI2RlZmluZSBEU1RBUlRCTE9DS01BU0tCSVRTCSgxNSArIDIwKQorI2RlZmluZSBTVEFSVEJMT0NLTUFTSwkJXAorCSgoKCgoeGZzX2ZzYmxvY2tfdCkxKSA8PCBTVEFSVEJMT0NLTUFTS0JJVFMpIC0gMSkgPDwgU1RBUlRCTE9DS1ZBTEJJVFMpCisjZGVmaW5lIERTVEFSVEJMT0NLTUFTSwkJXAorCSgoKCgoeGZzX2Rmc2Jub190KTEpIDw8IERTVEFSVEJMT0NLTUFTS0JJVFMpIC0gMSkgPDwgU1RBUlRCTE9DS1ZBTEJJVFMpCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX0lTTlVMTFNUQVJUQkxPQ0spCitpbnQgaXNudWxsc3RhcnRibG9jayh4ZnNfZnNibG9ja190IHgpOworI2RlZmluZSBJU05VTExTVEFSVEJMT0NLKHgpCWlzbnVsbHN0YXJ0YmxvY2soeCkKKyNlbHNlCisjZGVmaW5lIElTTlVMTFNUQVJUQkxPQ0soeCkJKCgoeCkgJiBTVEFSVEJMT0NLTUFTSykgPT0gU1RBUlRCTE9DS01BU0spCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fSVNOVUxMRFNUQVJUQkxPQ0spCitpbnQgaXNudWxsZHN0YXJ0YmxvY2soeGZzX2Rmc2Jub190IHgpOworI2RlZmluZSBJU05VTExEU1RBUlRCTE9DSyh4KQlpc251bGxkc3RhcnRibG9jayh4KQorI2Vsc2UKKyNkZWZpbmUgSVNOVUxMRFNUQVJUQkxPQ0soeCkJKCgoeCkgJiBEU1RBUlRCTE9DS01BU0spID09IERTVEFSVEJMT0NLTUFTSykKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19OVUxMU1RBUlRCTE9DSykKK3hmc19mc2Jsb2NrX3QgbnVsbHN0YXJ0YmxvY2soaW50IGspOworI2RlZmluZSBOVUxMU1RBUlRCTE9DSyhrKQludWxsc3RhcnRibG9jayhrKQorI2Vsc2UKKyNkZWZpbmUgTlVMTFNUQVJUQkxPQ0soaykJXAorCSgoQVNTRVJUKGsgPCAoMSA8PCBTVEFSVEJMT0NLVkFMQklUUykpKSwgKFNUQVJUQkxPQ0tNQVNLIHwgKGspKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19TVEFSVEJMT0NLVkFMKQoreGZzX2ZpbGJsa3NfdCBzdGFydGJsb2NrdmFsKHhmc19mc2Jsb2NrX3QgeCk7CisjZGVmaW5lIFNUQVJUQkxPQ0tWQUwoeCkJc3RhcnRibG9ja3ZhbCh4KQorI2Vsc2UKKyNkZWZpbmUgU1RBUlRCTE9DS1ZBTCh4KQkoKHhmc19maWxibGtzX3QpKCh4KSAmIH5TVEFSVEJMT0NLTUFTSykpCisjZW5kaWYKKworLyoKKyAqIFBvc3NpYmxlIGV4dGVudCBmb3JtYXRzLgorICovCit0eXBlZGVmIGVudW0geworCVhGU19FWFRGTVRfTk9TVEFURSA9IDAsCisJWEZTX0VYVEZNVF9IQVNTVEFURQorfSB4ZnNfZXhudGZtdF90OworCisvKgorICogUG9zc2libGUgZXh0ZW50IHN0YXRlcy4KKyAqLwordHlwZWRlZiBlbnVtIHsKKwlYRlNfRVhUX05PUk0sIFhGU19FWFRfVU5XUklUVEVOLAorCVhGU19FWFRfRE1BUElfT0ZGTElORSwgWEZTX0VYVF9JTlZBTElECit9IHhmc19leG50c3RfdDsKKworLyoKKyAqIEV4dGVudCBzdGF0ZSBhbmQgZXh0ZW50IGZvcm1hdCBtYWNyb3MuCisgKi8KKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0VYVEZNVF9JTk9ERSApCit4ZnNfZXhudGZtdF90IHhmc19leHRmbXRfaW5vZGUoc3RydWN0IHhmc19pbm9kZSAqaXApOworI2RlZmluZSBYRlNfRVhURk1UX0lOT0RFKHgpCXhmc19leHRmbXRfaW5vZGUoeCkKKyNlbHNlCisjZGVmaW5lIFhGU19FWFRGTVRfSU5PREUoeCkgXAorICAoWEZTX1NCX1ZFUlNJT05fSEFTRVhURkxHQklUKCYoKHgpLT5pX21vdW50LT5tX3NiKSkgPyBcCisJWEZTX0VYVEZNVF9IQVNTVEFURSA6IFhGU19FWFRGTVRfTk9TVEFURSkKKyNlbmRpZgorI2RlZmluZSBJU1VOV1JJVFRFTih4KQkoKHgpLT5icl9zdGF0ZSA9PSBYRlNfRVhUX1VOV1JJVFRFTikKKworLyoKKyAqIEluY29yZSB2ZXJzaW9uIG9mIGFib3ZlLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfYm1idF9pcmVjCit7CisJeGZzX2ZpbGVvZmZfdAlicl9zdGFydG9mZjsJLyogc3RhcnRpbmcgZmlsZSBvZmZzZXQgKi8KKwl4ZnNfZnNibG9ja190CWJyX3N0YXJ0YmxvY2s7CS8qIHN0YXJ0aW5nIGJsb2NrIG51bWJlciAqLworCXhmc19maWxibGtzX3QJYnJfYmxvY2tjb3VudDsJLyogbnVtYmVyIG9mIGJsb2NrcyAqLworCXhmc19leG50c3RfdAlicl9zdGF0ZTsJLyogZXh0ZW50IHN0YXRlICovCit9IHhmc19ibWJ0X2lyZWNfdDsKKworLyoKKyAqIEtleSBzdHJ1Y3R1cmUgZm9yIG5vbi1sZWFmIGxldmVscyBvZiB0aGUgdHJlZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2JtYnRfa2V5Cit7CisJeGZzX2RmaWxvZmZfdAlicl9zdGFydG9mZjsJLyogc3RhcnRpbmcgZmlsZSBvZmZzZXQgKi8KK30geGZzX2JtYnRfa2V5X3QsIHhmc19ibWRyX2tleV90OworCit0eXBlZGVmIHhmc19kZnNibm9fdCB4ZnNfYm1idF9wdHJfdCwgeGZzX2JtZHJfcHRyX3Q7CS8qIGJ0cmVlIHBvaW50ZXIgdHlwZSAqLworCQkJCQkvKiBidHJlZSBibG9jayBoZWFkZXIgdHlwZSAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2J0cmVlX2xibG9jayB4ZnNfYm1idF9ibG9ja190OworCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CVUZfVE9fQk1CVF9CTE9DSykKK3hmc19ibWJ0X2Jsb2NrX3QgKnhmc19idWZfdG9fYm1idF9ibG9jayhzdHJ1Y3QgeGZzX2J1ZiAqYnApOworI2RlZmluZSBYRlNfQlVGX1RPX0JNQlRfQkxPQ0soYnApCQl4ZnNfYnVmX3RvX2JtYnRfYmxvY2soYnApCisjZWxzZQorI2RlZmluZSBYRlNfQlVGX1RPX0JNQlRfQkxPQ0soYnApICgoeGZzX2JtYnRfYmxvY2tfdCAqKShYRlNfQlVGX1BUUihicCkpKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JNQVBfUkJMT0NLX0RTSVpFKQoraW50IHhmc19ibWFwX3JibG9ja19kc2l6ZShpbnQgbGV2LCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyKTsKKyNkZWZpbmUgWEZTX0JNQVBfUkJMT0NLX0RTSVpFKGxldixjdXIpCQl4ZnNfYm1hcF9yYmxvY2tfZHNpemUobGV2LGN1cikKKyNlbHNlCisjZGVmaW5lIFhGU19CTUFQX1JCTE9DS19EU0laRShsZXYsY3VyKSAoKGN1ciktPmJjX3ByaXZhdGUuYi5mb3Jrc2l6ZSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQk1BUF9SQkxPQ0tfSVNJWkUpCitpbnQgeGZzX2JtYXBfcmJsb2NrX2lzaXplKGludCBsZXYsIHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIpOworI2RlZmluZSBYRlNfQk1BUF9SQkxPQ0tfSVNJWkUobGV2LGN1cikJCXhmc19ibWFwX3JibG9ja19pc2l6ZShsZXYsY3VyKQorI2Vsc2UKKyNkZWZpbmUgWEZTX0JNQVBfUkJMT0NLX0lTSVpFKGxldixjdXIpIFwKKwkoKGludClYRlNfSUZPUktfUFRSKChjdXIpLT5iY19wcml2YXRlLmIuaXAsIFwKKwkJCSAgICAoY3VyKS0+YmNfcHJpdmF0ZS5iLndoaWNoZm9yayktPmlmX2Jyb290X2J5dGVzKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CTUFQX0lCTE9DS19TSVpFKQoraW50IHhmc19ibWFwX2libG9ja19zaXplKGludCBsZXYsIHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIpOworI2RlZmluZSBYRlNfQk1BUF9JQkxPQ0tfU0laRShsZXYsY3VyKQkJeGZzX2JtYXBfaWJsb2NrX3NpemUobGV2LGN1cikKKyNlbHNlCisjZGVmaW5lIFhGU19CTUFQX0lCTE9DS19TSVpFKGxldixjdXIpICgxIDw8IChjdXIpLT5iY19ibG9ja2xvZykKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CTUFQX0JMT0NLX0RTSVpFKQoraW50IHhmc19ibWFwX2Jsb2NrX2RzaXplKGludCBsZXYsIHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIpOworI2RlZmluZSBYRlNfQk1BUF9CTE9DS19EU0laRShsZXYsY3VyKQkJeGZzX2JtYXBfYmxvY2tfZHNpemUobGV2LGN1cikKKyNlbHNlCisjZGVmaW5lIFhGU19CTUFQX0JMT0NLX0RTSVpFKGxldixjdXIpIFwKKwkoKGxldikgPT0gKGN1ciktPmJjX25sZXZlbHMgLSAxID8gXAorCQlYRlNfQk1BUF9SQkxPQ0tfRFNJWkUobGV2LGN1cikgOiBcCisJCVhGU19CTUFQX0lCTE9DS19TSVpFKGxldixjdXIpKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CTUFQX0JMT0NLX0lTSVpFKQoraW50IHhmc19ibWFwX2Jsb2NrX2lzaXplKGludCBsZXYsIHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIpOworI2RlZmluZSBYRlNfQk1BUF9CTE9DS19JU0laRShsZXYsY3VyKQkJeGZzX2JtYXBfYmxvY2tfaXNpemUobGV2LGN1cikKKyNlbHNlCisjZGVmaW5lIFhGU19CTUFQX0JMT0NLX0lTSVpFKGxldixjdXIpIFwKKwkoKGxldikgPT0gKGN1ciktPmJjX25sZXZlbHMgLSAxID8gXAorCQlYRlNfQk1BUF9SQkxPQ0tfSVNJWkUobGV2LGN1cikgOiBcCisJCVhGU19CTUFQX0lCTE9DS19TSVpFKGxldixjdXIpKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JNQVBfQkxPQ0tfRE1BWFJFQ1MpCitpbnQgeGZzX2JtYXBfYmxvY2tfZG1heHJlY3MoaW50IGxldiwgc3RydWN0IHhmc19idHJlZV9jdXIgKmN1cik7CisjZGVmaW5lIFhGU19CTUFQX0JMT0NLX0RNQVhSRUNTKGxldixjdXIpCXhmc19ibWFwX2Jsb2NrX2RtYXhyZWNzKGxldixjdXIpCisjZWxzZQorI2RlZmluZSBYRlNfQk1BUF9CTE9DS19ETUFYUkVDUyhsZXYsY3VyKSBcCisJKChsZXYpID09IChjdXIpLT5iY19ubGV2ZWxzIC0gMSA/IFwKKwkJWEZTX0JUUkVFX0JMT0NLX01BWFJFQ1MoWEZTX0JNQVBfUkJMT0NLX0RTSVpFKGxldixjdXIpLCBcCisJCQl4ZnNfYm1kciwgKGxldikgPT0gMCkgOiBcCisJCSgoY3VyKS0+YmNfbXAtPm1fYm1hcF9kbXhyWyhsZXYpICE9IDBdKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQk1BUF9CTE9DS19JTUFYUkVDUykKK2ludCB4ZnNfYm1hcF9ibG9ja19pbWF4cmVjcyhpbnQgbGV2LCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyKTsKKyNkZWZpbmUgWEZTX0JNQVBfQkxPQ0tfSU1BWFJFQ1MobGV2LGN1cikJeGZzX2JtYXBfYmxvY2tfaW1heHJlY3MobGV2LGN1cikKKyNlbHNlCisjZGVmaW5lIFhGU19CTUFQX0JMT0NLX0lNQVhSRUNTKGxldixjdXIpIFwKKwkoKGxldikgPT0gKGN1ciktPmJjX25sZXZlbHMgLSAxID8gXAorCQlYRlNfQlRSRUVfQkxPQ0tfTUFYUkVDUyhYRlNfQk1BUF9SQkxPQ0tfSVNJWkUobGV2LGN1ciksIFwKKwkJCXhmc19ibWJ0LCAobGV2KSA9PSAwKSA6IFwKKwkJKChjdXIpLT5iY19tcC0+bV9ibWFwX2RteHJbKGxldikgIT0gMF0pKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JNQVBfQkxPQ0tfRE1JTlJFQ1MpCitpbnQgeGZzX2JtYXBfYmxvY2tfZG1pbnJlY3MoaW50IGxldiwgc3RydWN0IHhmc19idHJlZV9jdXIgKmN1cik7CisjZGVmaW5lIFhGU19CTUFQX0JMT0NLX0RNSU5SRUNTKGxldixjdXIpCXhmc19ibWFwX2Jsb2NrX2RtaW5yZWNzKGxldixjdXIpCisjZWxzZQorI2RlZmluZSBYRlNfQk1BUF9CTE9DS19ETUlOUkVDUyhsZXYsY3VyKSBcCisJKChsZXYpID09IChjdXIpLT5iY19ubGV2ZWxzIC0gMSA/IFwKKwkJWEZTX0JUUkVFX0JMT0NLX01JTlJFQ1MoWEZTX0JNQVBfUkJMT0NLX0RTSVpFKGxldixjdXIpLCBcCisJCQl4ZnNfYm1kciwgKGxldikgPT0gMCkgOiBcCisJCSgoY3VyKS0+YmNfbXAtPm1fYm1hcF9kbW5yWyhsZXYpICE9IDBdKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQk1BUF9CTE9DS19JTUlOUkVDUykKK2ludCB4ZnNfYm1hcF9ibG9ja19pbWlucmVjcyhpbnQgbGV2LCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyKTsKKyNkZWZpbmUgWEZTX0JNQVBfQkxPQ0tfSU1JTlJFQ1MobGV2LGN1cikJeGZzX2JtYXBfYmxvY2tfaW1pbnJlY3MobGV2LGN1cikKKyNlbHNlCisjZGVmaW5lIFhGU19CTUFQX0JMT0NLX0lNSU5SRUNTKGxldixjdXIpIFwKKwkoKGxldikgPT0gKGN1ciktPmJjX25sZXZlbHMgLSAxID8gXAorCQlYRlNfQlRSRUVfQkxPQ0tfTUlOUkVDUyhYRlNfQk1BUF9SQkxPQ0tfSVNJWkUobGV2LGN1ciksIFwKKwkJCXhmc19ibWJ0LCAobGV2KSA9PSAwKSA6IFwKKwkJKChjdXIpLT5iY19tcC0+bV9ibWFwX2RtbnJbKGxldikgIT0gMF0pKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JNQVBfUkVDX0RBRERSKQoreGZzX2JtYnRfcmVjX3QgKgoreGZzX2JtYXBfcmVjX2RhZGRyKHhmc19ibWJ0X2Jsb2NrX3QgKmJiLCBpbnQgaSwgc3RydWN0IHhmc19idHJlZV9jdXIgKmN1cik7CisjZGVmaW5lIFhGU19CTUFQX1JFQ19EQUREUihiYixpLGN1cikJCXhmc19ibWFwX3JlY19kYWRkcihiYixpLGN1cikKKyNlbHNlCisjZGVmaW5lIFhGU19CTUFQX1JFQ19EQUREUihiYixpLGN1cikgXAorCVhGU19CVFJFRV9SRUNfQUREUihYRlNfQk1BUF9CTE9DS19EU0laRSgJCVwKKwkJSU5UX0dFVCgoYmIpLT5iYl9sZXZlbCwgQVJDSF9DT05WRVJUKSwgY3VyKSwJXAorCQl4ZnNfYm1idCwgYmIsIGksIFhGU19CTUFQX0JMT0NLX0RNQVhSRUNTKAlcCisJCQlJTlRfR0VUKChiYiktPmJiX2xldmVsLCBBUkNIX0NPTlZFUlQpLCBjdXIpKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CTUFQX1JFQ19JQUREUikKK3hmc19ibWJ0X3JlY190ICoKK3hmc19ibWFwX3JlY19pYWRkcih4ZnNfYm1idF9ibG9ja190ICpiYiwgaW50IGksIHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIpOworI2RlZmluZSBYRlNfQk1BUF9SRUNfSUFERFIoYmIsaSxjdXIpCQl4ZnNfYm1hcF9yZWNfaWFkZHIoYmIsaSxjdXIpCisjZWxzZQorI2RlZmluZSBYRlNfQk1BUF9SRUNfSUFERFIoYmIsaSxjdXIpIFwKKwlYRlNfQlRSRUVfUkVDX0FERFIoWEZTX0JNQVBfQkxPQ0tfSVNJWkUoCQlcCisJCUlOVF9HRVQoKGJiKS0+YmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCksIGN1ciksCVwKKwkJeGZzX2JtYnQsIGJiLCBpLCBYRlNfQk1BUF9CTE9DS19JTUFYUkVDUygJXAorCQkJSU5UX0dFVCgoYmIpLT5iYl9sZXZlbCwgQVJDSF9DT05WRVJUKSwgY3VyKSkKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CTUFQX0tFWV9EQUREUikKK3hmc19ibWJ0X2tleV90ICoKK3hmc19ibWFwX2tleV9kYWRkcih4ZnNfYm1idF9ibG9ja190ICpiYiwgaW50IGksIHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIpOworI2RlZmluZSBYRlNfQk1BUF9LRVlfREFERFIoYmIsaSxjdXIpCQl4ZnNfYm1hcF9rZXlfZGFkZHIoYmIsaSxjdXIpCisjZWxzZQorI2RlZmluZSBYRlNfQk1BUF9LRVlfREFERFIoYmIsaSxjdXIpIFwKKwlYRlNfQlRSRUVfS0VZX0FERFIoWEZTX0JNQVBfQkxPQ0tfRFNJWkUoCQlcCisJCUlOVF9HRVQoKGJiKS0+YmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCksIGN1ciksCVwKKwkJeGZzX2JtYnQsIGJiLCBpLCBYRlNfQk1BUF9CTE9DS19ETUFYUkVDUygJXAorCQkJSU5UX0dFVCgoYmIpLT5iYl9sZXZlbCwgQVJDSF9DT05WRVJUKSwgY3VyKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQk1BUF9LRVlfSUFERFIpCit4ZnNfYm1idF9rZXlfdCAqCit4ZnNfYm1hcF9rZXlfaWFkZHIoeGZzX2JtYnRfYmxvY2tfdCAqYmIsIGludCBpLCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyKTsKKyNkZWZpbmUgWEZTX0JNQVBfS0VZX0lBRERSKGJiLGksY3VyKQkJeGZzX2JtYXBfa2V5X2lhZGRyKGJiLGksY3VyKQorI2Vsc2UKKyNkZWZpbmUgWEZTX0JNQVBfS0VZX0lBRERSKGJiLGksY3VyKSBcCisJWEZTX0JUUkVFX0tFWV9BRERSKFhGU19CTUFQX0JMT0NLX0lTSVpFKAkJXAorCQlJTlRfR0VUKChiYiktPmJiX2xldmVsLCBBUkNIX0NPTlZFUlQpLCBjdXIpLAlcCisJCXhmc19ibWJ0LCBiYiwgaSwgWEZTX0JNQVBfQkxPQ0tfSU1BWFJFQ1MoCVwKKwkJCUlOVF9HRVQoKGJiKS0+YmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCksIGN1cikpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQk1BUF9QVFJfREFERFIpCit4ZnNfYm1idF9wdHJfdCAqCit4ZnNfYm1hcF9wdHJfZGFkZHIoeGZzX2JtYnRfYmxvY2tfdCAqYmIsIGludCBpLCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyKTsKKyNkZWZpbmUgWEZTX0JNQVBfUFRSX0RBRERSKGJiLGksY3VyKQkJeGZzX2JtYXBfcHRyX2RhZGRyKGJiLGksY3VyKQorI2Vsc2UKKyNkZWZpbmUgWEZTX0JNQVBfUFRSX0RBRERSKGJiLGksY3VyKSBcCisJWEZTX0JUUkVFX1BUUl9BRERSKFhGU19CTUFQX0JMT0NLX0RTSVpFKAkJXAorCQlJTlRfR0VUKChiYiktPmJiX2xldmVsLCBBUkNIX0NPTlZFUlQpLCBjdXIpLAlcCisJCXhmc19ibWJ0LCBiYiwgaSwgWEZTX0JNQVBfQkxPQ0tfRE1BWFJFQ1MoCVwKKwkJCUlOVF9HRVQoKGJiKS0+YmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCksIGN1cikpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JNQVBfUFRSX0lBRERSKQoreGZzX2JtYnRfcHRyX3QgKgoreGZzX2JtYXBfcHRyX2lhZGRyKHhmc19ibWJ0X2Jsb2NrX3QgKmJiLCBpbnQgaSwgc3RydWN0IHhmc19idHJlZV9jdXIgKmN1cik7CisjZGVmaW5lIFhGU19CTUFQX1BUUl9JQUREUihiYixpLGN1cikJCXhmc19ibWFwX3B0cl9pYWRkcihiYixpLGN1cikKKyNlbHNlCisjZGVmaW5lIFhGU19CTUFQX1BUUl9JQUREUihiYixpLGN1cikgXAorCVhGU19CVFJFRV9QVFJfQUREUihYRlNfQk1BUF9CTE9DS19JU0laRSgJCVwKKwkJSU5UX0dFVCgoYmIpLT5iYl9sZXZlbCwgQVJDSF9DT05WRVJUKSwgY3VyKSwJXAorCQl4ZnNfYm1idCwgYmIsIGksIFhGU19CTUFQX0JMT0NLX0lNQVhSRUNTKAlcCisJCQlJTlRfR0VUKChiYiktPmJiX2xldmVsLCBBUkNIX0NPTlZFUlQpLCBjdXIpKQorI2VuZGlmCisKKy8qCisgKiBUaGVzZSBhcmUgdG8gYmUgdXNlZCB3aGVuIHdlIGtub3cgdGhlIHNpemUgb2YgdGhlIGJsb2NrIGFuZAorICogd2UgZG9uJ3QgaGF2ZSBhIGN1cnNvci4KKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQk1BUF9CUk9PVF9SRUNfQUREUikKK3hmc19ibWJ0X3JlY190ICp4ZnNfYm1hcF9icm9vdF9yZWNfYWRkcih4ZnNfYm1idF9ibG9ja190ICpiYiwgaW50IGksIGludCBzeik7CisjZGVmaW5lIFhGU19CTUFQX0JST09UX1JFQ19BRERSKGJiLGksc3opCXhmc19ibWFwX2Jyb290X3JlY19hZGRyKGJiLGksc3opCisjZWxzZQorI2RlZmluZSBYRlNfQk1BUF9CUk9PVF9SRUNfQUREUihiYixpLHN6KSBcCisJWEZTX0JUUkVFX1JFQ19BRERSKHN6LHhmc19ibWJ0LGJiLGksWEZTX0JNQVBfQlJPT1RfTUFYUkVDUyhzeikpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JNQVBfQlJPT1RfS0VZX0FERFIpCit4ZnNfYm1idF9rZXlfdCAqeGZzX2JtYXBfYnJvb3Rfa2V5X2FkZHIoeGZzX2JtYnRfYmxvY2tfdCAqYmIsIGludCBpLCBpbnQgc3opOworI2RlZmluZSBYRlNfQk1BUF9CUk9PVF9LRVlfQUREUihiYixpLHN6KQl4ZnNfYm1hcF9icm9vdF9rZXlfYWRkcihiYixpLHN6KQorI2Vsc2UKKyNkZWZpbmUgWEZTX0JNQVBfQlJPT1RfS0VZX0FERFIoYmIsaSxzeikgXAorCVhGU19CVFJFRV9LRVlfQUREUihzeix4ZnNfYm1idCxiYixpLFhGU19CTUFQX0JST09UX01BWFJFQ1Moc3opKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CTUFQX0JST09UX1BUUl9BRERSKQoreGZzX2JtYnRfcHRyX3QgKnhmc19ibWFwX2Jyb290X3B0cl9hZGRyKHhmc19ibWJ0X2Jsb2NrX3QgKmJiLCBpbnQgaSwgaW50IHN6KTsKKyNkZWZpbmUgWEZTX0JNQVBfQlJPT1RfUFRSX0FERFIoYmIsaSxzeikJeGZzX2JtYXBfYnJvb3RfcHRyX2FkZHIoYmIsaSxzeikKKyNlbHNlCisjZGVmaW5lIFhGU19CTUFQX0JST09UX1BUUl9BRERSKGJiLGksc3opIFwKKwlYRlNfQlRSRUVfUFRSX0FERFIoc3oseGZzX2JtYnQsYmIsaSxYRlNfQk1BUF9CUk9PVF9NQVhSRUNTKHN6KSkKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CTUFQX0JST09UX05VTVJFQ1MpCitpbnQgeGZzX2JtYXBfYnJvb3RfbnVtcmVjcyh4ZnNfYm1kcl9ibG9ja190ICpiYik7CisjZGVmaW5lIFhGU19CTUFQX0JST09UX05VTVJFQ1MoYmIpCQl4ZnNfYm1hcF9icm9vdF9udW1yZWNzKGJiKQorI2Vsc2UKKyNkZWZpbmUgWEZTX0JNQVBfQlJPT1RfTlVNUkVDUyhiYikgKElOVF9HRVQoKGJiKS0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQk1BUF9CUk9PVF9NQVhSRUNTKQoraW50IHhmc19ibWFwX2Jyb290X21heHJlY3MoaW50IHN6KTsKKyNkZWZpbmUgWEZTX0JNQVBfQlJPT1RfTUFYUkVDUyhzeikJCXhmc19ibWFwX2Jyb290X21heHJlY3Moc3opCisjZWxzZQorI2RlZmluZSBYRlNfQk1BUF9CUk9PVF9NQVhSRUNTKHN6KSBYRlNfQlRSRUVfQkxPQ0tfTUFYUkVDUyhzeix4ZnNfYm1idCwwKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CTUFQX0JST09UX1NQQUNFX0NBTEMpCitpbnQgeGZzX2JtYXBfYnJvb3Rfc3BhY2VfY2FsYyhpbnQgbnJlY3MpOworI2RlZmluZSBYRlNfQk1BUF9CUk9PVF9TUEFDRV9DQUxDKG5yZWNzKQl4ZnNfYm1hcF9icm9vdF9zcGFjZV9jYWxjKG5yZWNzKQorI2Vsc2UKKyNkZWZpbmUgWEZTX0JNQVBfQlJPT1RfU1BBQ0VfQ0FMQyhucmVjcykgXAorCSgoaW50KShzaXplb2YoeGZzX2JtYnRfYmxvY2tfdCkgKyBcCisJICAgICAgICgobnJlY3MpICogKHNpemVvZih4ZnNfYm1idF9rZXlfdCkgKyBzaXplb2YoeGZzX2JtYnRfcHRyX3QpKSkpKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CTUFQX0JST09UX1NQQUNFKQoraW50IHhmc19ibWFwX2Jyb290X3NwYWNlKHhmc19ibWRyX2Jsb2NrX3QgKmJiKTsKKyNkZWZpbmUgWEZTX0JNQVBfQlJPT1RfU1BBQ0UoYmIpCQl4ZnNfYm1hcF9icm9vdF9zcGFjZShiYikKKyNlbHNlCisjZGVmaW5lIFhGU19CTUFQX0JST09UX1NQQUNFKGJiKSBcCisJWEZTX0JNQVBfQlJPT1RfU1BBQ0VfQ0FMQyhJTlRfR0VUKChiYiktPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0JNRFJfU1BBQ0VfQ0FMQykKK2ludCB4ZnNfYm1kcl9zcGFjZV9jYWxjKGludCBucmVjcyk7CisjZGVmaW5lIFhGU19CTURSX1NQQUNFX0NBTEMobnJlY3MpCQl4ZnNfYm1kcl9zcGFjZV9jYWxjKG5yZWNzKQorI2Vsc2UKKyNkZWZpbmUgWEZTX0JNRFJfU1BBQ0VfQ0FMQyhucmVjcykJXAorCSgoaW50KShzaXplb2YoeGZzX2JtZHJfYmxvY2tfdCkgKyBcCisJICAgICAgICgobnJlY3MpICogKHNpemVvZih4ZnNfYm1idF9rZXlfdCkgKyBzaXplb2YoeGZzX2JtYnRfcHRyX3QpKSkpKQorI2VuZGlmCisKKy8qCisgKiBNYXhpbXVtIG51bWJlciBvZiBibWFwIGJ0cmVlIGxldmVscy4KKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQk1fTUFYTEVWRUxTKQoraW50IHhmc19ibV9tYXhsZXZlbHMoc3RydWN0IHhmc19tb3VudCAqbXAsIGludCB3KTsKKyNkZWZpbmUgWEZTX0JNX01BWExFVkVMUyhtcCx3KQkJCXhmc19ibV9tYXhsZXZlbHMobXAsdykKKyNlbHNlCisjZGVmaW5lIFhGU19CTV9NQVhMRVZFTFMobXAsdykJCSgobXApLT5tX2JtX21heGxldmVsc1t3XSkKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CTUFQX1NBTklUWV9DSEVDSykKK2ludCB4ZnNfYm1hcF9zYW5pdHlfY2hlY2soc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19ibWJ0X2Jsb2NrX3QgKmJiLAorCWludCBsZXZlbCk7CisjZGVmaW5lIFhGU19CTUFQX1NBTklUWV9DSEVDSyhtcCxiYixsZXZlbCkJXAorCXhmc19ibWFwX3Nhbml0eV9jaGVjayhtcCxiYixsZXZlbCkKKyNlbHNlCisjZGVmaW5lIFhGU19CTUFQX1NBTklUWV9DSEVDSyhtcCxiYixsZXZlbCkJXAorCShJTlRfR0VUKChiYiktPmJiX21hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19CTUFQX01BR0lDICYmIFwKKwkgSU5UX0dFVCgoYmIpLT5iYl9sZXZlbCwgQVJDSF9DT05WRVJUKSA9PSBsZXZlbCAmJiBcCisJIElOVF9HRVQoKGJiKS0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSA+IDAgJiYgXAorCSBJTlRfR0VUKChiYiktPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgPD0gKG1wKS0+bV9ibWFwX2RteHJbKGxldmVsKSAhPSAwXSkKKyNlbmRpZgorCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpZiBkZWZpbmVkKFhGU19CTUJUX1RSQUNFKQorLyoKKyAqIFRyYWNlIGJ1ZmZlciBlbnRyeSB0eXBlcy4KKyAqLworI2RlZmluZSBYRlNfQk1CVF9LVFJBQ0VfQVJHQkkJMQorI2RlZmluZSBYRlNfQk1CVF9LVFJBQ0VfQVJHQklJCTIKKyNkZWZpbmUgWEZTX0JNQlRfS1RSQUNFX0FSR0ZGRkkgMworI2RlZmluZSBYRlNfQk1CVF9LVFJBQ0VfQVJHSQk0CisjZGVmaW5lIFhGU19CTUJUX0tUUkFDRV9BUkdJRksJNQorI2RlZmluZSBYRlNfQk1CVF9LVFJBQ0VfQVJHSUZSCTYKKyNkZWZpbmUgWEZTX0JNQlRfS1RSQUNFX0FSR0lLCTcKKyNkZWZpbmUgWEZTX0JNQlRfS1RSQUNFX0NVUgk4CisKKyNkZWZpbmUgWEZTX0JNQlRfVFJBQ0VfU0laRQk0MDk2CS8qIHNpemUgb2YgZ2xvYmFsIHRyYWNlIGJ1ZmZlciAqLworI2RlZmluZSBYRlNfQk1CVF9LVFJBQ0VfU0laRQkzMgkvKiBzaXplIG9mIHBlci1pbm9kZSB0cmFjZSBidWZmZXIgKi8KK2V4dGVybiBrdHJhY2VfdAkqeGZzX2JtYnRfdHJhY2VfYnVmOworI2VuZGlmCisKKy8qCisgKiBQcm90b3R5cGVzIGZvciB4ZnNfYm1hcC5jIHRvIGNhbGwuCisgKi8KKwordm9pZAoreGZzX2JtZHJfdG9fYm1idCgKKwl4ZnNfYm1kcl9ibG9ja190ICosCisJaW50LAorCXhmc19ibWJ0X2Jsb2NrX3QgKiwKKwlpbnQpOworCitpbnQKK3hmc19ibWJ0X2RlY3JlbWVudCgKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqLAorCWludCwKKwlpbnQgKik7CisKK2ludAoreGZzX2JtYnRfZGVsZXRlKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyICosCisJaW50ICopOworCit2b2lkCit4ZnNfYm1idF9nZXRfYWxsKAorCXhmc19ibWJ0X3JlY190CSpyLAorCXhmc19ibWJ0X2lyZWNfdCAqcyk7CisKK3hmc19ibWJ0X2Jsb2NrX3QgKgoreGZzX2JtYnRfZ2V0X2Jsb2NrKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCisJaW50CQkJbGV2ZWwsCisJc3RydWN0IHhmc19idWYJCSoqYnBwKTsKKworeGZzX2ZpbGJsa3NfdAoreGZzX2JtYnRfZ2V0X2Jsb2NrY291bnQoCisJeGZzX2JtYnRfcmVjX3QJKnIpOworCit4ZnNfZnNibG9ja190Cit4ZnNfYm1idF9nZXRfc3RhcnRibG9jaygKKwl4ZnNfYm1idF9yZWNfdAkqcik7CisKK3hmc19maWxlb2ZmX3QKK3hmc19ibWJ0X2dldF9zdGFydG9mZigKKwl4ZnNfYm1idF9yZWNfdAkqcik7CisKK3hmc19leG50c3RfdAoreGZzX2JtYnRfZ2V0X3N0YXRlKAorCXhmc19ibWJ0X3JlY190CSpyKTsKKworI2lmIF9fQllURV9PUkRFUiAhPSBfX0JJR19FTkRJQU4KK3ZvaWQKK3hmc19ibWJ0X2Rpc2tfZ2V0X2FsbCgKKwl4ZnNfYm1idF9yZWNfdAkqciwKKwl4ZnNfYm1idF9pcmVjX3QgKnMpOworCit4ZnNfZXhudHN0X3QKK3hmc19ibWJ0X2Rpc2tfZ2V0X3N0YXRlKAorCXhmc19ibWJ0X3JlY190CSpyKTsKKworeGZzX2ZpbGJsa3NfdAoreGZzX2JtYnRfZGlza19nZXRfYmxvY2tjb3VudCgKKwl4ZnNfYm1idF9yZWNfdAkqcik7CisKK3hmc19mc2Jsb2NrX3QKK3hmc19ibWJ0X2Rpc2tfZ2V0X3N0YXJ0YmxvY2soCisJeGZzX2JtYnRfcmVjX3QJKnIpOworCit4ZnNfZmlsZW9mZl90Cit4ZnNfYm1idF9kaXNrX2dldF9zdGFydG9mZigKKwl4ZnNfYm1idF9yZWNfdAkqcik7CisKKyNlbHNlCisjZGVmaW5lIHhmc19ibWJ0X2Rpc2tfZ2V0X2FsbChyLCBzKSBcCisJeGZzX2JtYnRfZ2V0X2FsbChyLCBzKQorI2RlZmluZSB4ZnNfYm1idF9kaXNrX2dldF9zdGF0ZShyKSBcCisJeGZzX2JtYnRfZ2V0X3N0YXRlKHIpCisjZGVmaW5lIHhmc19ibWJ0X2Rpc2tfZ2V0X2Jsb2NrY291bnQocikgXAorCXhmc19ibWJ0X2dldF9ibG9ja2NvdW50KHIpCisjZGVmaW5lIHhmc19ibWJ0X2Rpc2tfZ2V0X3N0YXJ0YmxvY2socikgXAorCXhmc19ibWJ0X2dldF9ibG9ja2NvdW50KHIpCisjZGVmaW5lIHhmc19ibWJ0X2Rpc2tfZ2V0X3N0YXJ0b2ZmKHIpIFwKKwl4ZnNfYm1idF9nZXRfc3RhcnRvZmYocikKKyNlbmRpZgorCitpbnQKK3hmc19ibWJ0X2luY3JlbWVudCgKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqLAorCWludCwKKwlpbnQgKik7CisKK2ludAoreGZzX2JtYnRfaW5zZXJ0KAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyICosCisJaW50ICopOworCit2b2lkCit4ZnNfYm1idF9sb2dfYmxvY2soCisJc3RydWN0IHhmc19idHJlZV9jdXIgKiwKKwlzdHJ1Y3QgeGZzX2J1ZiAqLAorCWludCk7CisKK3ZvaWQKK3hmc19ibWJ0X2xvZ19yZWNzKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyICosCisJc3RydWN0IHhmc19idWYgKiwKKwlpbnQsCisJaW50KTsKKworaW50Cit4ZnNfYm1idF9sb29rdXBfZXEoCisJc3RydWN0IHhmc19idHJlZV9jdXIgKiwKKwl4ZnNfZmlsZW9mZl90LAorCXhmc19mc2Jsb2NrX3QsCisJeGZzX2ZpbGJsa3NfdCwKKwlpbnQgKik7CisKK2ludAoreGZzX2JtYnRfbG9va3VwX2dlKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyICosCisJeGZzX2ZpbGVvZmZfdCwKKwl4ZnNfZnNibG9ja190LAorCXhmc19maWxibGtzX3QsCisJaW50ICopOworCitpbnQKK3hmc19ibWJ0X2xvb2t1cF9sZSgKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqLAorCXhmc19maWxlb2ZmX3QsCisJeGZzX2ZzYmxvY2tfdCwKKwl4ZnNfZmlsYmxrc190LAorCWludCAqKTsKKworLyoKKyAqIEdpdmUgdGhlIGJtYXAgYnRyZWUgYSBuZXcgcm9vdCBibG9jay4gIENvcHkgdGhlIG9sZCBicm9vdCBjb250ZW50cworICogZG93biBpbnRvIGEgcmVhbCBibG9jayBhbmQgbWFrZSB0aGUgYnJvb3QgcG9pbnQgdG8gaXQuCisgKi8KK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfYm1idF9uZXdyb290KAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCQkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCQkqbG9nZmxhZ3MsCS8qIGxvZ2dpbmcgZmxhZ3MgZm9yIGlub2RlICovCisJaW50CQkJKnN0YXQpOwkJLyogcmV0dXJuIHN0YXR1cyAtIDAgZmFpbCAqLworCit2b2lkCit4ZnNfYm1idF9zZXRfYWxsKAorCXhmc19ibWJ0X3JlY190CSpyLAorCXhmc19ibWJ0X2lyZWNfdCAqcyk7CisKK3ZvaWQKK3hmc19ibWJ0X3NldF9hbGxmKAorCXhmc19ibWJ0X3JlY190CSpyLAorCXhmc19maWxlb2ZmX3QJbywKKwl4ZnNfZnNibG9ja190CWIsCisJeGZzX2ZpbGJsa3NfdAljLAorCXhmc19leG50c3RfdAl2KTsKKwordm9pZAoreGZzX2JtYnRfc2V0X2Jsb2NrY291bnQoCisJeGZzX2JtYnRfcmVjX3QJKnIsCisJeGZzX2ZpbGJsa3NfdAl2KTsKKwordm9pZAoreGZzX2JtYnRfc2V0X3N0YXJ0YmxvY2soCisJeGZzX2JtYnRfcmVjX3QJKnIsCisJeGZzX2ZzYmxvY2tfdAl2KTsKKwordm9pZAoreGZzX2JtYnRfc2V0X3N0YXJ0b2ZmKAorCXhmc19ibWJ0X3JlY190CSpyLAorCXhmc19maWxlb2ZmX3QJdik7CisKK3ZvaWQKK3hmc19ibWJ0X3NldF9zdGF0ZSgKKwl4ZnNfYm1idF9yZWNfdAkqciwKKwl4ZnNfZXhudHN0X3QJdik7CisKKyNpZiBfX0JZVEVfT1JERVIgIT0gX19CSUdfRU5ESUFOCit2b2lkCit4ZnNfYm1idF9kaXNrX3NldF9hbGwoCisJeGZzX2JtYnRfcmVjX3QJKnIsCisJeGZzX2JtYnRfaXJlY190ICpzKTsKKwordm9pZAoreGZzX2JtYnRfZGlza19zZXRfYWxsZigKKwl4ZnNfYm1idF9yZWNfdAkqciwKKwl4ZnNfZmlsZW9mZl90CW8sCisJeGZzX2ZzYmxvY2tfdAliLAorCXhmc19maWxibGtzX3QJYywKKwl4ZnNfZXhudHN0X3QJdik7CisjZWxzZQorI2RlZmluZSB4ZnNfYm1idF9kaXNrX3NldF9hbGwociwgcykgXAorCXhmc19ibWJ0X3NldF9hbGwociwgcykKKyNkZWZpbmUgeGZzX2JtYnRfZGlza19zZXRfYWxsZihyLCBvLCBiLCBjLCB2KSBcCisJeGZzX2JtYnRfc2V0X2FsbGYociwgbywgYiwgYywgdikKKyNlbmRpZgorCit2b2lkCit4ZnNfYm1idF90b19ibWRyKAorCXhmc19ibWJ0X2Jsb2NrX3QgKiwKKwlpbnQsCisJeGZzX2JtZHJfYmxvY2tfdCAqLAorCWludCk7CisKK2ludAoreGZzX2JtYnRfdXBkYXRlKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyICosCisJeGZzX2ZpbGVvZmZfdCwKKwl4ZnNfZnNibG9ja190LAorCXhmc19maWxibGtzX3QsCisJeGZzX2V4bnRzdF90KTsKKworI2lmZGVmIERFQlVHCisvKgorICogR2V0IHRoZSBkYXRhIGZyb20gdGhlIHBvaW50ZWQtdG8gcmVjb3JkLgorICovCitpbnQKK3hmc19ibWJ0X2dldF9yZWMoCisJc3RydWN0IHhmc19idHJlZV9jdXIgKiwKKwl4ZnNfZmlsZW9mZl90ICosCisJeGZzX2ZzYmxvY2tfdCAqLAorCXhmc19maWxibGtzX3QgKiwKKwl4ZnNfZXhudHN0X3QgKiwKKwlpbnQgKik7CisjZW5kaWYKKworCisvKgorICogU2VhcmNoIGFuIGV4dGVudCBsaXN0IGZvciB0aGUgZXh0ZW50IHdoaWNoIGluY2x1ZGVzIGJsb2NrCisgKiBibm8uCisgKi8KK3hmc19ibWJ0X3JlY190ICoKK3hmc19ibWFwX2RvX3NlYXJjaF9leHRlbnRzKAorCXhmc19ibWJ0X3JlY190ICosCisJeGZzX2V4dG51bV90LAorCXhmc19leHRudW1fdCwKKwl4ZnNfZmlsZW9mZl90LAorCWludCAqLAorCXhmc19leHRudW1fdCAqLAorCXhmc19ibWJ0X2lyZWNfdCAqLAorCXhmc19ibWJ0X2lyZWNfdCAqKTsKKworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmCS8qIF9fWEZTX0JNQVBfQlRSRUVfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2J0cmVlLmMgYi9mcy94ZnMveGZzX2J0cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRkMjJkZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfYnRyZWUuYwpAQCAtMCwwICsxLDk0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBjb21tb24gY29kZSBmb3IgdGhlIHNwYWNlIG1hbmFnZXIncyBidHJlZSBpbXBsZW1lbnRhdGlvbnMuCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorCisjaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc190eXBlcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19hZy5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisKKy8qCisgKiBDdXJzb3IgYWxsb2NhdGlvbiB6b25lLgorICovCitrbWVtX3pvbmVfdAkqeGZzX2J0cmVlX2N1cl96b25lOworCisvKgorICogQnRyZWUgbWFnaWMgbnVtYmVycy4KKyAqLworY29uc3QgX191aW50MzJfdCB4ZnNfbWFnaWNzW1hGU19CVE5VTV9NQVhdID0KK3sKKwlYRlNfQUJUQl9NQUdJQywgWEZTX0FCVENfTUFHSUMsIFhGU19CTUFQX01BR0lDLCBYRlNfSUJUX01BR0lDCit9OworCisvKgorICogUHJvdG90eXBlcyBmb3IgaW50ZXJuYWwgcm91dGluZXMuCisgKi8KKworLyoKKyAqIENoZWNraW5nIHJvdXRpbmU6IHJldHVybiBtYXhyZWNzIGZvciB0aGUgYmxvY2suCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogbnVtYmVyIG9mIHJlY29yZHMgZml0dGluZyBpbiBibG9jayAqLworeGZzX2J0cmVlX21heHJlY3MoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfYnRyZWVfYmxvY2tfdAkqYmxvY2spOy8qIGdlbmVyaWMgYnRyZWUgYmxvY2sgcG9pbnRlciAqLworCisvKgorICogSW50ZXJuYWwgcm91dGluZXMuCisgKi8KKworLyoKKyAqIENoZWNraW5nIHJvdXRpbmU6IHJldHVybiBtYXhyZWNzIGZvciB0aGUgYmxvY2suCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogbnVtYmVyIG9mIHJlY29yZHMgZml0dGluZyBpbiBibG9jayAqLworeGZzX2J0cmVlX21heHJlY3MoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfYnRyZWVfYmxvY2tfdAkqYmxvY2spCS8qIGdlbmVyaWMgYnRyZWUgYmxvY2sgcG9pbnRlciAqLworeworCXN3aXRjaCAoY3VyLT5iY19idG51bSkgeworCWNhc2UgWEZTX0JUTlVNX0JOTzoKKwljYXNlIFhGU19CVE5VTV9DTlQ6CisJCXJldHVybiAoaW50KVhGU19BTExPQ19CTE9DS19NQVhSRUNTKElOVF9HRVQoYmxvY2stPmJiX2guYmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCksIGN1cik7CisJY2FzZSBYRlNfQlROVU1fQk1BUDoKKwkJcmV0dXJuIChpbnQpWEZTX0JNQVBfQkxPQ0tfSU1BWFJFQ1MoSU5UX0dFVChibG9jay0+YmJfaC5iYl9sZXZlbCwgQVJDSF9DT05WRVJUKSwgY3VyKTsKKwljYXNlIFhGU19CVE5VTV9JTk86CisJCXJldHVybiAoaW50KVhGU19JTk9CVF9CTE9DS19NQVhSRUNTKElOVF9HRVQoYmxvY2stPmJiX2guYmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCksIGN1cik7CisJZGVmYXVsdDoKKwkJQVNTRVJUKDApOworCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qCisgKiBFeHRlcm5hbCByb3V0aW5lcy4KKyAqLworCisjaWZkZWYgREVCVUcKKy8qCisgKiBEZWJ1ZyByb3V0aW5lOiBjaGVjayB0aGF0IGJsb2NrIGhlYWRlciBpcyBvay4KKyAqLwordm9pZAoreGZzX2J0cmVlX2NoZWNrX2Jsb2NrKAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2J0cmVlX2Jsb2NrX3QJKmJsb2NrLAkvKiBnZW5lcmljIGJ0cmVlIGJsb2NrIHBvaW50ZXIgKi8KKwlpbnQJCQlsZXZlbCwJLyogbGV2ZWwgb2YgdGhlIGJ0cmVlIGJsb2NrICovCisJeGZzX2J1Zl90CQkqYnApCS8qIGJ1ZmZlciBjb250YWluaW5nIGJsb2NrLCBpZiBhbnkgKi8KK3sKKwlpZiAoWEZTX0JUUkVFX0xPTkdfUFRSUyhjdXItPmJjX2J0bnVtKSkKKwkJeGZzX2J0cmVlX2NoZWNrX2xibG9jayhjdXIsICh4ZnNfYnRyZWVfbGJsb2NrX3QgKilibG9jaywgbGV2ZWwsCisJCQlicCk7CisJZWxzZQorCQl4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgKHhmc19idHJlZV9zYmxvY2tfdCAqKWJsb2NrLCBsZXZlbCwKKwkJCWJwKTsKK30KKworLyoKKyAqIERlYnVnIHJvdXRpbmU6IGNoZWNrIHRoYXQga2V5cyBhcmUgaW4gdGhlIHJpZ2h0IG9yZGVyLgorICovCit2b2lkCit4ZnNfYnRyZWVfY2hlY2tfa2V5KAorCXhmc19idG51bV90CWJ0bnVtLAkJLyogYnRyZWUgaWRlbnRpZmllciAqLworCXZvaWQJCSphazEsCQkvKiBwb2ludGVyIHRvIGxlZnQgKGxvd2VyKSBrZXkgKi8KKwl2b2lkCQkqYWsyKQkJLyogcG9pbnRlciB0byByaWdodCAoaGlnaGVyKSBrZXkgKi8KK3sKKwlzd2l0Y2ggKGJ0bnVtKSB7CisJY2FzZSBYRlNfQlROVU1fQk5POiB7CisJCXhmc19hbGxvY19rZXlfdAkqazE7CisJCXhmc19hbGxvY19rZXlfdAkqazI7CisKKwkJazEgPSBhazE7CisJCWsyID0gYWsyOworCQlBU1NFUlQoSU5UX0dFVChrMS0+YXJfc3RhcnRibG9jaywgQVJDSF9DT05WRVJUKSA8IElOVF9HRVQoazItPmFyX3N0YXJ0YmxvY2ssIEFSQ0hfQ09OVkVSVCkpOworCQlicmVhazsKKwkgICAgfQorCWNhc2UgWEZTX0JUTlVNX0NOVDogeworCQl4ZnNfYWxsb2Nfa2V5X3QJKmsxOworCQl4ZnNfYWxsb2Nfa2V5X3QJKmsyOworCisJCWsxID0gYWsxOworCQlrMiA9IGFrMjsKKwkJQVNTRVJUKElOVF9HRVQoazEtPmFyX2Jsb2NrY291bnQsIEFSQ0hfQ09OVkVSVCkgPCBJTlRfR0VUKGsyLT5hcl9ibG9ja2NvdW50LCBBUkNIX0NPTlZFUlQpIHx8CisJCSAgICAgICAoSU5UX0dFVChrMS0+YXJfYmxvY2tjb3VudCwgQVJDSF9DT05WRVJUKSA9PSBJTlRfR0VUKGsyLT5hcl9ibG9ja2NvdW50LCBBUkNIX0NPTlZFUlQpICYmCisJCQlJTlRfR0VUKGsxLT5hcl9zdGFydGJsb2NrLCBBUkNIX0NPTlZFUlQpIDwgSU5UX0dFVChrMi0+YXJfc3RhcnRibG9jaywgQVJDSF9DT05WRVJUKSkpOworCQlicmVhazsKKwkgICAgfQorCWNhc2UgWEZTX0JUTlVNX0JNQVA6IHsKKwkJeGZzX2JtYnRfa2V5X3QJKmsxOworCQl4ZnNfYm1idF9rZXlfdAkqazI7CisKKwkJazEgPSBhazE7CisJCWsyID0gYWsyOworCQlBU1NFUlQoSU5UX0dFVChrMS0+YnJfc3RhcnRvZmYsIEFSQ0hfQ09OVkVSVCkgPCBJTlRfR0VUKGsyLT5icl9zdGFydG9mZiwgQVJDSF9DT05WRVJUKSk7CisJCWJyZWFrOworCSAgICB9CisJY2FzZSBYRlNfQlROVU1fSU5POiB7CisJCXhmc19pbm9idF9rZXlfdAkqazE7CisJCXhmc19pbm9idF9rZXlfdAkqazI7CisKKwkJazEgPSBhazE7CisJCWsyID0gYWsyOworCQlBU1NFUlQoSU5UX0dFVChrMS0+aXJfc3RhcnRpbm8sIEFSQ0hfQ09OVkVSVCkgPCBJTlRfR0VUKGsyLT5pcl9zdGFydGlubywgQVJDSF9DT05WRVJUKSk7CisJCWJyZWFrOworCSAgICB9CisJZGVmYXVsdDoKKwkJQVNTRVJUKDApOworCX0KK30KKyNlbmRpZgkvKiBERUJVRyAqLworCisvKgorICogQ2hlY2tpbmcgcm91dGluZTogY2hlY2sgdGhhdCBsb25nIGZvcm0gYmxvY2sgaGVhZGVyIGlzIG9rLgorICovCisvKiBBUkdTVVNFRCAqLworaW50CQkJCQkvKiBlcnJvciAoMCBvciBFRlNDT1JSVVBURUQpICovCit4ZnNfYnRyZWVfY2hlY2tfbGJsb2NrKAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2J0cmVlX2xibG9ja190CSpibG9jaywJLyogYnRyZWUgbG9uZyBmb3JtIGJsb2NrIHBvaW50ZXIgKi8KKwlpbnQJCQlsZXZlbCwJLyogbGV2ZWwgb2YgdGhlIGJ0cmVlIGJsb2NrICovCisJeGZzX2J1Zl90CQkqYnApCS8qIGJ1ZmZlciBmb3IgYmxvY2ssIGlmIGFueSAqLworeworCWludAkJCWxibG9ja19vazsgLyogYmxvY2sgcGFzc2VzIGNoZWNrcyAqLworCXhmc19tb3VudF90CQkqbXA7CS8qIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50ICovCisKKwltcCA9IGN1ci0+YmNfbXA7CisJbGJsb2NrX29rID0KKwkJSU5UX0dFVChibG9jay0+YmJfbWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0geGZzX21hZ2ljc1tjdXItPmJjX2J0bnVtXSAmJgorCQlJTlRfR0VUKGJsb2NrLT5iYl9sZXZlbCwgQVJDSF9DT05WRVJUKSA9PSBsZXZlbCAmJgorCQlJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIDw9CisJCQl4ZnNfYnRyZWVfbWF4cmVjcyhjdXIsICh4ZnNfYnRyZWVfYmxvY2tfdCAqKWJsb2NrKSAmJgorCQlibG9jay0+YmJfbGVmdHNpYiAmJgorCQkoSU5UX0dFVChibG9jay0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJUKSA9PSBOVUxMREZTQk5PIHx8CisJCSBYRlNfRlNCX1NBTklUWV9DSEVDSyhtcCwgSU5UX0dFVChibG9jay0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJUKSkpICYmCisJCWJsb2NrLT5iYl9yaWdodHNpYiAmJgorCQkoSU5UX0dFVChibG9jay0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTERGU0JOTyB8fAorCQkgWEZTX0ZTQl9TQU5JVFlfQ0hFQ0sobXAsIElOVF9HRVQoYmxvY2stPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpKSk7CisJaWYgKHVubGlrZWx5KFhGU19URVNUX0VSUk9SKCFsYmxvY2tfb2ssIG1wLCBYRlNfRVJSVEFHX0JUUkVFX0NIRUNLX0xCTE9DSywKKwkJCVhGU19SQU5ET01fQlRSRUVfQ0hFQ0tfTEJMT0NLKSkpIHsKKwkJaWYgKGJwKQorCQkJeGZzX2J1ZnRyYWNlKCJMQlRSRUUgRVJST1IiLCBicCk7CisJCVhGU19FUlJPUl9SRVBPUlQoInhmc19idHJlZV9jaGVja19sYmxvY2siLCBYRlNfRVJSTEVWRUxfTE9XLAorCQkJCSBtcCk7CisJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDaGVja2luZyByb3V0aW5lOiBjaGVjayB0aGF0IChsb25nKSBwb2ludGVyIGlzIG9rLgorICovCitpbnQJCQkJCS8qIGVycm9yICgwIG9yIEVGU0NPUlJVUFRFRCkgKi8KK3hmc19idHJlZV9jaGVja19scHRyKAorCXhmc19idHJlZV9jdXJfdAkqY3VyLAkJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2Rmc2Jub190CXB0ciwJCS8qIGJ0cmVlIGJsb2NrIGRpc2sgYWRkcmVzcyAqLworCWludAkJbGV2ZWwpCQkvKiBidHJlZSBibG9jayBsZXZlbCAqLworeworCXhmc19tb3VudF90CSptcDsJCS8qIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50ICovCisKKwltcCA9IGN1ci0+YmNfbXA7CisJWEZTX1dBTlRfQ09SUlVQVEVEX1JFVFVSTigKKwkJbGV2ZWwgPiAwICYmCisJCXB0ciAhPSBOVUxMREZTQk5PICYmCisJCVhGU19GU0JfU0FOSVRZX0NIRUNLKG1wLCBwdHIpKTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIERFQlVHCisvKgorICogRGVidWcgcm91dGluZTogY2hlY2sgdGhhdCByZWNvcmRzIGFyZSBpbiB0aGUgcmlnaHQgb3JkZXIuCisgKi8KK3ZvaWQKK3hmc19idHJlZV9jaGVja19yZWMoCisJeGZzX2J0bnVtX3QJYnRudW0sCQkvKiBidHJlZSBpZGVudGlmaWVyICovCisJdm9pZAkJKmFyMSwJCS8qIHBvaW50ZXIgdG8gbGVmdCAobG93ZXIpIHJlY29yZCAqLworCXZvaWQJCSphcjIpCQkvKiBwb2ludGVyIHRvIHJpZ2h0IChoaWdoZXIpIHJlY29yZCAqLworeworCXN3aXRjaCAoYnRudW0pIHsKKwljYXNlIFhGU19CVE5VTV9CTk86IHsKKwkJeGZzX2FsbG9jX3JlY190CSpyMTsKKwkJeGZzX2FsbG9jX3JlY190CSpyMjsKKworCQlyMSA9IGFyMTsKKwkJcjIgPSBhcjI7CisJCUFTU0VSVChJTlRfR0VUKHIxLT5hcl9zdGFydGJsb2NrLCBBUkNIX0NPTlZFUlQpICsgSU5UX0dFVChyMS0+YXJfYmxvY2tjb3VudCwgQVJDSF9DT05WRVJUKSA8PQorCQkgICAgICAgSU5UX0dFVChyMi0+YXJfc3RhcnRibG9jaywgQVJDSF9DT05WRVJUKSk7CisJCWJyZWFrOworCSAgICB9CisJY2FzZSBYRlNfQlROVU1fQ05UOiB7CisJCXhmc19hbGxvY19yZWNfdAkqcjE7CisJCXhmc19hbGxvY19yZWNfdAkqcjI7CisKKwkJcjEgPSBhcjE7CisJCXIyID0gYXIyOworCQlBU1NFUlQoSU5UX0dFVChyMS0+YXJfYmxvY2tjb3VudCwgQVJDSF9DT05WRVJUKSA8IElOVF9HRVQocjItPmFyX2Jsb2NrY291bnQsIEFSQ0hfQ09OVkVSVCkgfHwKKwkJICAgICAgIChJTlRfR0VUKHIxLT5hcl9ibG9ja2NvdW50LCBBUkNIX0NPTlZFUlQpID09IElOVF9HRVQocjItPmFyX2Jsb2NrY291bnQsIEFSQ0hfQ09OVkVSVCkgJiYKKwkJCUlOVF9HRVQocjEtPmFyX3N0YXJ0YmxvY2ssIEFSQ0hfQ09OVkVSVCkgPCBJTlRfR0VUKHIyLT5hcl9zdGFydGJsb2NrLCBBUkNIX0NPTlZFUlQpKSk7CisJCWJyZWFrOworCSAgICB9CisJY2FzZSBYRlNfQlROVU1fQk1BUDogeworCQl4ZnNfYm1idF9yZWNfdAkqcjE7CisJCXhmc19ibWJ0X3JlY190CSpyMjsKKworCQlyMSA9IGFyMTsKKwkJcjIgPSBhcjI7CisJCUFTU0VSVCh4ZnNfYm1idF9kaXNrX2dldF9zdGFydG9mZihyMSkgKworCQkgICAgICAgeGZzX2JtYnRfZGlza19nZXRfYmxvY2tjb3VudChyMSkgPD0KKwkJICAgICAgIHhmc19ibWJ0X2Rpc2tfZ2V0X3N0YXJ0b2ZmKHIyKSk7CisJCWJyZWFrOworCSAgICB9CisJY2FzZSBYRlNfQlROVU1fSU5POiB7CisJCXhmc19pbm9idF9yZWNfdAkqcjE7CisJCXhmc19pbm9idF9yZWNfdAkqcjI7CisKKwkJcjEgPSBhcjE7CisJCXIyID0gYXIyOworCQlBU1NFUlQoSU5UX0dFVChyMS0+aXJfc3RhcnRpbm8sIEFSQ0hfQ09OVkVSVCkgKyBYRlNfSU5PREVTX1BFUl9DSFVOSyA8PQorCQkgICAgICAgSU5UX0dFVChyMi0+aXJfc3RhcnRpbm8sIEFSQ0hfQ09OVkVSVCkpOworCQlicmVhazsKKwkgICAgfQorCWRlZmF1bHQ6CisJCUFTU0VSVCgwKTsKKwl9Cit9CisjZW5kaWYJLyogREVCVUcgKi8KKworLyoKKyAqIENoZWNraW5nIHJvdXRpbmU6IGNoZWNrIHRoYXQgYmxvY2sgaGVhZGVyIGlzIG9rLgorICovCisvKiBBUkdTVVNFRCAqLworaW50CQkJCQkvKiBlcnJvciAoMCBvciBFRlNDT1JSVVBURUQpICovCit4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2J0cmVlX3NibG9ja190CSpibG9jaywJLyogYnRyZWUgc2hvcnQgZm9ybSBibG9jayBwb2ludGVyICovCisJaW50CQkJbGV2ZWwsCS8qIGxldmVsIG9mIHRoZSBidHJlZSBibG9jayAqLworCXhmc19idWZfdAkJKmJwKQkvKiBidWZmZXIgY29udGFpbmluZyBibG9jayAqLworeworCXhmc19idWZfdAkJKmFnYnA7CS8qIGJ1ZmZlciBmb3IgYWcuIGZyZWVzcGFjZSBzdHJ1Y3QgKi8KKwl4ZnNfYWdmX3QJCSphZ2Y7CS8qIGFnLiBmcmVlc3BhY2Ugc3RydWN0dXJlICovCisJeGZzX2FnYmxvY2tfdAkJYWdmbGVuOwkvKiBuYXRpdmUgYWcuIGZyZWVzcGFjZSBsZW5ndGggKi8KKwlpbnQJCQlzYmxvY2tfb2s7IC8qIGJsb2NrIHBhc3NlcyBjaGVja3MgKi8KKworCWFnYnAgPSBjdXItPmJjX3ByaXZhdGUuYS5hZ2JwOworCWFnZiA9IFhGU19CVUZfVE9fQUdGKGFnYnApOworCWFnZmxlbiA9IElOVF9HRVQoYWdmLT5hZ2ZfbGVuZ3RoLCBBUkNIX0NPTlZFUlQpOworCXNibG9ja19vayA9CisJCUlOVF9HRVQoYmxvY2stPmJiX21hZ2ljLCBBUkNIX0NPTlZFUlQpID09IHhmc19tYWdpY3NbY3VyLT5iY19idG51bV0gJiYKKwkJSU5UX0dFVChibG9jay0+YmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCkgPT0gbGV2ZWwgJiYKKwkJSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSA8PQorCQkJeGZzX2J0cmVlX21heHJlY3MoY3VyLCAoeGZzX2J0cmVlX2Jsb2NrX3QgKilibG9jaykgJiYKKwkJKElOVF9HRVQoYmxvY2stPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTEFHQkxPQ0sgfHwKKwkJIElOVF9HRVQoYmxvY2stPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCkgPCBhZ2ZsZW4pICYmCisJCWJsb2NrLT5iYl9sZWZ0c2liICYmCisJCShJTlRfR0VUKGJsb2NrLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSA9PSBOVUxMQUdCTE9DSyB8fAorCQkgSU5UX0dFVChibG9jay0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCkgPCBhZ2ZsZW4pICYmCisJCWJsb2NrLT5iYl9yaWdodHNpYjsKKwlpZiAodW5saWtlbHkoWEZTX1RFU1RfRVJST1IoIXNibG9ja19vaywgY3VyLT5iY19tcCwKKwkJCVhGU19FUlJUQUdfQlRSRUVfQ0hFQ0tfU0JMT0NLLAorCQkJWEZTX1JBTkRPTV9CVFJFRV9DSEVDS19TQkxPQ0spKSkgeworCQlpZiAoYnApCisJCQl4ZnNfYnVmdHJhY2UoIlNCVFJFRSBFUlJPUiIsIGJwKTsKKwkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX2J0cmVlX2NoZWNrX3NibG9jayIsIFhGU19FUlJMRVZFTF9MT1csCisJCQkJIGN1ci0+YmNfbXApOworCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogQ2hlY2tpbmcgcm91dGluZTogY2hlY2sgdGhhdCAoc2hvcnQpIHBvaW50ZXIgaXMgb2suCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKDAgb3IgRUZTQ09SUlVQVEVEKSAqLworeGZzX2J0cmVlX2NoZWNrX3NwdHIoCisJeGZzX2J0cmVlX2N1cl90CSpjdXIsCQkvKiBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfYWdibG9ja190CXB0ciwJCS8qIGJ0cmVlIGJsb2NrIGRpc2sgYWRkcmVzcyAqLworCWludAkJbGV2ZWwpCQkvKiBidHJlZSBibG9jayBsZXZlbCAqLworeworCXhmc19idWZfdAkqYWdicDsJCS8qIGJ1ZmZlciBmb3IgYWcuIGZyZWVzcGFjZSBzdHJ1Y3QgKi8KKwl4ZnNfYWdmX3QJKmFnZjsJCS8qIGFnLiBmcmVlc3BhY2Ugc3RydWN0dXJlICovCisKKwlhZ2JwID0gY3VyLT5iY19wcml2YXRlLmEuYWdicDsKKwlhZ2YgPSBYRlNfQlVGX1RPX0FHRihhZ2JwKTsKKwlYRlNfV0FOVF9DT1JSVVBURURfUkVUVVJOKAorCQlsZXZlbCA+IDAgJiYKKwkJcHRyICE9IE5VTExBR0JMT0NLICYmIHB0ciAhPSAwICYmCisJCXB0ciA8IElOVF9HRVQoYWdmLT5hZ2ZfbGVuZ3RoLCBBUkNIX0NPTlZFUlQpKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERlbGV0ZSB0aGUgYnRyZWUgY3Vyc29yLgorICovCit2b2lkCit4ZnNfYnRyZWVfZGVsX2N1cnNvcigKKwl4ZnNfYnRyZWVfY3VyX3QJKmN1ciwJCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJZXJyb3IpCQkvKiBkZWwgYmVjYXVzZSBvZiBlcnJvciAqLworeworCWludAkJaTsJCS8qIGJ0cmVlIGxldmVsICovCisKKwkvKgorCSAqIENsZWFyIHRoZSBidWZmZXIgcG9pbnRlcnMsIGFuZCByZWxlYXNlIHRoZSBidWZmZXJzLgorCSAqIElmIHdlJ3JlIGRvaW5nIHRoaXMgaW4gdGhlIGZhY2Ugb2YgYW4gZXJyb3IsIHdlCisJICogbmVlZCB0byBtYWtlIHN1cmUgdG8gaW5zcGVjdCBhbGwgb2YgdGhlIGVudHJpZXMKKwkgKiBpbiB0aGUgYmNfYnVmcyBhcnJheSBmb3IgYnVmZmVycyB0byBiZSB1bmxvY2tlZC4KKwkgKiBUaGlzIGlzIGJlY2F1c2Ugc29tZSBvZiB0aGUgYnRyZWUgY29kZSB3b3JrcyBmcm9tCisJICogbGV2ZWwgbiBkb3duIHRvIDAsIGFuZCBpZiB3ZSBnZXQgYW4gZXJyb3IgYWxvbmcKKwkgKiB0aGUgd2F5IHdlIHdvbid0IGhhdmUgaW5pdGlhbGl6ZWQgYWxsIHRoZSBlbnRyaWVzCisJICogZG93biB0byAwLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBjdXItPmJjX25sZXZlbHM7IGkrKykgeworCQlpZiAoY3VyLT5iY19idWZzW2ldKQorCQkJeGZzX2J0cmVlX3NldGJ1ZihjdXIsIGksIE5VTEwpOworCQllbHNlIGlmICghZXJyb3IpCisJCQlicmVhazsKKwl9CisJLyoKKwkgKiBDYW4ndCBmcmVlIGEgYm1hcCBjdXJzb3Igd2l0aG91dCBoYXZpbmcgZGVhbHQgd2l0aCB0aGUKKwkgKiBhbGxvY2F0ZWQgaW5kaXJlY3QgYmxvY2tzJyBhY2NvdW50aW5nLgorCSAqLworCUFTU0VSVChjdXItPmJjX2J0bnVtICE9IFhGU19CVE5VTV9CTUFQIHx8CisJICAgICAgIGN1ci0+YmNfcHJpdmF0ZS5iLmFsbG9jYXRlZCA9PSAwKTsKKwkvKgorCSAqIEZyZWUgdGhlIGN1cnNvci4KKwkgKi8KKwlrbWVtX3pvbmVfZnJlZSh4ZnNfYnRyZWVfY3VyX3pvbmUsIGN1cik7Cit9CisKKy8qCisgKiBEdXBsaWNhdGUgdGhlIGJ0cmVlIGN1cnNvci4KKyAqIEFsbG9jYXRlIGEgbmV3IG9uZSwgY29weSB0aGUgcmVjb3JkLCByZS1nZXQgdGhlIGJ1ZmZlcnMuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19idHJlZV9kdXBfY3Vyc29yKAorCXhmc19idHJlZV9jdXJfdAkqY3VyLAkJLyogaW5wdXQgY3Vyc29yICovCisJeGZzX2J0cmVlX2N1cl90CSoqbmN1cikJCS8qIG91dHB1dCBjdXJzb3IgKi8KK3sKKwl4ZnNfYnVmX3QJKmJwOwkJLyogYnRyZWUgYmxvY2sncyBidWZmZXIgcG9pbnRlciAqLworCWludAkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwlpbnQJCWk7CQkvKiBsZXZlbCBudW1iZXIgb2YgYnRyZWUgYmxvY2sgKi8KKwl4ZnNfbW91bnRfdAkqbXA7CQkvKiBtb3VudCBzdHJ1Y3R1cmUgZm9yIGZpbGVzeXN0ZW0gKi8KKwl4ZnNfYnRyZWVfY3VyX3QJKm5ldzsJCS8qIG5ldyBjdXJzb3IgdmFsdWUgKi8KKwl4ZnNfdHJhbnNfdAkqdHA7CQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyLCBjYW4gYmUgTlVMTCAqLworCisJdHAgPSBjdXItPmJjX3RwOworCW1wID0gY3VyLT5iY19tcDsKKwkvKgorCSAqIEFsbG9jYXRlIGEgbmV3IGN1cnNvciBsaWtlIHRoZSBvbGQgb25lLgorCSAqLworCW5ldyA9IHhmc19idHJlZV9pbml0X2N1cnNvcihtcCwgdHAsIGN1ci0+YmNfcHJpdmF0ZS5hLmFnYnAsCisJCWN1ci0+YmNfcHJpdmF0ZS5hLmFnbm8sIGN1ci0+YmNfYnRudW0sIGN1ci0+YmNfcHJpdmF0ZS5iLmlwLAorCQljdXItPmJjX3ByaXZhdGUuYi53aGljaGZvcmspOworCS8qCisJICogQ29weSB0aGUgcmVjb3JkIGN1cnJlbnRseSBpbiB0aGUgY3Vyc29yLgorCSAqLworCW5ldy0+YmNfcmVjID0gY3VyLT5iY19yZWM7CisJLyoKKwkgKiBGb3IgZWFjaCBsZXZlbCBjdXJyZW50LCByZS1nZXQgdGhlIGJ1ZmZlciBhbmQgY29weSB0aGUgcHRyIHZhbHVlLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBuZXctPmJjX25sZXZlbHM7IGkrKykgeworCQluZXctPmJjX3B0cnNbaV0gPSBjdXItPmJjX3B0cnNbaV07CisJCW5ldy0+YmNfcmFbaV0gPSBjdXItPmJjX3JhW2ldOworCQlpZiAoKGJwID0gY3VyLT5iY19idWZzW2ldKSkgeworCQkJaWYgKChlcnJvciA9IHhmc190cmFuc19yZWFkX2J1ZihtcCwgdHAsIG1wLT5tX2RkZXZfdGFyZ3AsCisJCQkJWEZTX0JVRl9BRERSKGJwKSwgbXAtPm1fYnNpemUsIDAsICZicCkpKSB7CisJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IobmV3LCBlcnJvcik7CisJCQkJKm5jdXIgPSBOVUxMOworCQkJCXJldHVybiBlcnJvcjsKKwkJCX0KKwkJCW5ldy0+YmNfYnVmc1tpXSA9IGJwOworCQkJQVNTRVJUKGJwKTsKKwkJCUFTU0VSVCghWEZTX0JVRl9HRVRFUlJPUihicCkpOworCQl9IGVsc2UKKwkJCW5ldy0+YmNfYnVmc1tpXSA9IE5VTEw7CisJfQorCS8qCisJICogRm9yIGJtYXAgYnRyZWVzLCBjb3B5IHRoZSBmaXJzdGJsb2NrLCBmbGlzdCwgYW5kIGZsYWdzIHZhbHVlcywKKwkgKiBzaW5jZSBpbml0IGN1cnNvciBkb2Vzbid0IGdldCB0aGVtLgorCSAqLworCWlmIChuZXctPmJjX2J0bnVtID09IFhGU19CVE5VTV9CTUFQKSB7CisJCW5ldy0+YmNfcHJpdmF0ZS5iLmZpcnN0YmxvY2sgPSBjdXItPmJjX3ByaXZhdGUuYi5maXJzdGJsb2NrOworCQluZXctPmJjX3ByaXZhdGUuYi5mbGlzdCA9IGN1ci0+YmNfcHJpdmF0ZS5iLmZsaXN0OworCQluZXctPmJjX3ByaXZhdGUuYi5mbGFncyA9IGN1ci0+YmNfcHJpdmF0ZS5iLmZsYWdzOworCX0KKwkqbmN1ciA9IG5ldzsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENoYW5nZSB0aGUgY3Vyc29yIHRvIHBvaW50IHRvIHRoZSBmaXJzdCByZWNvcmQgYXQgdGhlIGdpdmVuIGxldmVsLgorICogT3RoZXIgbGV2ZWxzIGFyZSB1bmFmZmVjdGVkLgorICovCitpbnQJCQkJCS8qIHN1Y2Nlc3M9MSwgZmFpbHVyZT0wICovCit4ZnNfYnRyZWVfZmlyc3RyZWMoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCQlsZXZlbCkJLyogbGV2ZWwgdG8gY2hhbmdlICovCit7CisJeGZzX2J0cmVlX2Jsb2NrX3QJKmJsb2NrOwkvKiBnZW5lcmljIGJ0cmVlIGJsb2NrIHBvaW50ZXIgKi8KKwl4ZnNfYnVmX3QJCSpicDsJLyogYnVmZmVyIGNvbnRhaW5pbmcgYmxvY2sgKi8KKworCS8qCisJICogR2V0IHRoZSBibG9jayBwb2ludGVyIGZvciB0aGlzIGxldmVsLgorCSAqLworCWJsb2NrID0geGZzX2J0cmVlX2dldF9ibG9jayhjdXIsIGxldmVsLCAmYnApOworCXhmc19idHJlZV9jaGVja19ibG9jayhjdXIsIGJsb2NrLCBsZXZlbCwgYnApOworCS8qCisJICogSXQncyBlbXB0eSwgdGhlcmUgaXMgbm8gc3VjaCByZWNvcmQuCisJICovCisJaWYgKCFibG9jay0+YmJfaC5iYl9udW1yZWNzKQorCQlyZXR1cm4gMDsKKwkvKgorCSAqIFNldCB0aGUgcHRyIHZhbHVlIHRvIDEsIHRoYXQncyB0aGUgZmlyc3QgcmVjb3JkL2tleS4KKwkgKi8KKwljdXItPmJjX3B0cnNbbGV2ZWxdID0gMTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFJldHJpZXZlIHRoZSBibG9jayBwb2ludGVyIGZyb20gdGhlIGN1cnNvciBhdCB0aGUgZ2l2ZW4gbGV2ZWwuCisgKiBUaGlzIG1heSBiZSBhIGJtYXAgYnRyZWUgcm9vdCBvciBmcm9tIGEgYnVmZmVyLgorICovCit4ZnNfYnRyZWVfYmxvY2tfdCAqCQkJLyogZ2VuZXJpYyBidHJlZSBibG9jayBwb2ludGVyICovCit4ZnNfYnRyZWVfZ2V0X2Jsb2NrKAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkJbGV2ZWwsCS8qIGxldmVsIGluIGJ0cmVlICovCisJeGZzX2J1Zl90CQkqKmJwcCkJLyogYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGJsb2NrICovCit7CisJeGZzX2J0cmVlX2Jsb2NrX3QJKmJsb2NrOwkvKiByZXR1cm4gdmFsdWUgKi8KKwl4ZnNfYnVmX3QJCSpicDsJLyogcmV0dXJuIGJ1ZmZlciAqLworCXhmc19pZm9ya190CQkqaWZwOwkvKiBpbm9kZSBmb3JrIHBvaW50ZXIgKi8KKwlpbnQJCQl3aGljaGZvcms7IC8qIGRhdGEgb3IgYXR0ciBmb3JrICovCisKKwlpZiAoY3VyLT5iY19idG51bSA9PSBYRlNfQlROVU1fQk1BUCAmJiBsZXZlbCA9PSBjdXItPmJjX25sZXZlbHMgLSAxKSB7CisJCXdoaWNoZm9yayA9IGN1ci0+YmNfcHJpdmF0ZS5iLndoaWNoZm9yazsKKwkJaWZwID0gWEZTX0lGT1JLX1BUUihjdXItPmJjX3ByaXZhdGUuYi5pcCwgd2hpY2hmb3JrKTsKKwkJYmxvY2sgPSAoeGZzX2J0cmVlX2Jsb2NrX3QgKilpZnAtPmlmX2Jyb290OworCQlicCA9IE5VTEw7CisJfSBlbHNlIHsKKwkJYnAgPSBjdXItPmJjX2J1ZnNbbGV2ZWxdOworCQlibG9jayA9IFhGU19CVUZfVE9fQkxPQ0soYnApOworCX0KKwlBU1NFUlQoYmxvY2sgIT0gTlVMTCk7CisJKmJwcCA9IGJwOworCXJldHVybiBibG9jazsKK30KKworLyoKKyAqIEdldCBhIGJ1ZmZlciBmb3IgdGhlIGJsb2NrLCByZXR1cm4gaXQgd2l0aCBubyBkYXRhIHJlYWQuCisgKiBMb25nLWZvcm0gYWRkcmVzc2luZy4KKyAqLworeGZzX2J1Zl90ICoJCQkJLyogYnVmZmVyIGZvciBmc2JubyAqLworeGZzX2J0cmVlX2dldF9idWZsKAorCXhmc19tb3VudF90CSptcCwJCS8qIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50ICovCisJeGZzX3RyYW5zX3QJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19mc2Jsb2NrX3QJZnNibm8sCQkvKiBmaWxlIHN5c3RlbSBibG9jayBudW1iZXIgKi8KKwl1aW50CQlsb2NrKQkJLyogbG9jayBmbGFncyBmb3IgZ2V0X2J1ZiAqLworeworCXhmc19idWZfdAkqYnA7CQkvKiBidWZmZXIgcG9pbnRlciAocmV0dXJuIHZhbHVlKSAqLworCXhmc19kYWRkcl90CQlkOwkJLyogcmVhbCBkaXNrIGJsb2NrIGFkZHJlc3MgKi8KKworCUFTU0VSVChmc2JubyAhPSBOVUxMRlNCTE9DSyk7CisJZCA9IFhGU19GU0JfVE9fREFERFIobXAsIGZzYm5vKTsKKwlicCA9IHhmc190cmFuc19nZXRfYnVmKHRwLCBtcC0+bV9kZGV2X3RhcmdwLCBkLCBtcC0+bV9ic2l6ZSwgbG9jayk7CisJQVNTRVJUKGJwKTsKKwlBU1NFUlQoIVhGU19CVUZfR0VURVJST1IoYnApKTsKKwlyZXR1cm4gYnA7Cit9CisKKy8qCisgKiBHZXQgYSBidWZmZXIgZm9yIHRoZSBibG9jaywgcmV0dXJuIGl0IHdpdGggbm8gZGF0YSByZWFkLgorICogU2hvcnQtZm9ybSBhZGRyZXNzaW5nLgorICovCit4ZnNfYnVmX3QgKgkJCQkvKiBidWZmZXIgZm9yIGFnbm8vYWdibm8gKi8KK3hmc19idHJlZV9nZXRfYnVmcygKKwl4ZnNfbW91bnRfdAkqbXAsCQkvKiBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfYWdudW1iZXJfdAlhZ25vLAkJLyogYWxsb2NhdGlvbiBncm91cCBudW1iZXIgKi8KKwl4ZnNfYWdibG9ja190CWFnYm5vLAkJLyogYWxsb2NhdGlvbiBncm91cCBibG9jayBudW1iZXIgKi8KKwl1aW50CQlsb2NrKQkJLyogbG9jayBmbGFncyBmb3IgZ2V0X2J1ZiAqLworeworCXhmc19idWZfdAkqYnA7CQkvKiBidWZmZXIgcG9pbnRlciAocmV0dXJuIHZhbHVlKSAqLworCXhmc19kYWRkcl90CQlkOwkJLyogcmVhbCBkaXNrIGJsb2NrIGFkZHJlc3MgKi8KKworCUFTU0VSVChhZ25vICE9IE5VTExBR05VTUJFUik7CisJQVNTRVJUKGFnYm5vICE9IE5VTExBR0JMT0NLKTsKKwlkID0gWEZTX0FHQl9UT19EQUREUihtcCwgYWdubywgYWdibm8pOworCWJwID0geGZzX3RyYW5zX2dldF9idWYodHAsIG1wLT5tX2RkZXZfdGFyZ3AsIGQsIG1wLT5tX2JzaXplLCBsb2NrKTsKKwlBU1NFUlQoYnApOworCUFTU0VSVCghWEZTX0JVRl9HRVRFUlJPUihicCkpOworCXJldHVybiBicDsKK30KKworLyoKKyAqIEFsbG9jYXRlIGEgbmV3IGJ0cmVlIGN1cnNvci4KKyAqIFRoZSBjdXJzb3IgaXMgZWl0aGVyIGZvciBhbGxvY2F0aW9uIChBKSBvciBibWFwIChCKSBvciBpbm9kZXMgKEkpLgorICovCit4ZnNfYnRyZWVfY3VyX3QgKgkJCS8qIG5ldyBidHJlZSBjdXJzb3IgKi8KK3hmc19idHJlZV9pbml0X2N1cnNvcigKKwl4ZnNfbW91bnRfdAkqbXAsCQkvKiBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfYnVmX3QJKmFnYnAsCQkvKiAoQSBvbmx5KSBidWZmZXIgZm9yIGFnZiBzdHJ1Y3R1cmUgKi8KKwkJCQkJLyogKEkgb25seSkgYnVmZmVyIGZvciBhZ2kgc3RydWN0dXJlICovCisJeGZzX2FnbnVtYmVyX3QJYWdubywJCS8qIChBSSBvbmx5KSBhbGxvY2F0aW9uIGdyb3VwIG51bWJlciAqLworCXhmc19idG51bV90CWJ0bnVtLAkJLyogYnRyZWUgaWRlbnRpZmllciAqLworCXhmc19pbm9kZV90CSppcCwJCS8qIChCIG9ubHkpIGlub2RlIG93bmluZyB0aGUgYnRyZWUgKi8KKwlpbnQJCXdoaWNoZm9yaykJLyogKEIgb25seSkgZGF0YSBvciBhdHRyIGZvcmsgKi8KK3sKKwl4ZnNfYWdmX3QJKmFnZjsJCS8qIChBKSBhbGxvY2F0aW9uIGdyb3VwIGZyZWVzcGFjZSAqLworCXhmc19hZ2lfdAkqYWdpOwkJLyogKEkpIGFsbG9jYXRpb24gZ3JvdXAgaW5vZGVzcGFjZSAqLworCXhmc19idHJlZV9jdXJfdAkqY3VyOwkJLyogcmV0dXJuIHZhbHVlICovCisJeGZzX2lmb3JrX3QJKmlmcDsJCS8qIChJKSBpbm9kZSBmb3JrIHBvaW50ZXIgKi8KKwlpbnQJCW5sZXZlbHM9MDsJLyogbnVtYmVyIG9mIGxldmVscyBpbiB0aGUgYnRyZWUgKi8KKworCUFTU0VSVCh4ZnNfYnRyZWVfY3VyX3pvbmUgIT0gTlVMTCk7CisJLyoKKwkgKiBBbGxvY2F0ZSBhIG5ldyBjdXJzb3IuCisJICovCisJY3VyID0ga21lbV96b25lX3phbGxvYyh4ZnNfYnRyZWVfY3VyX3pvbmUsIEtNX1NMRUVQKTsKKwkvKgorCSAqIERlZHVjZSB0aGUgbnVtYmVyIG9mIGJ0cmVlIGxldmVscyBmcm9tIHRoZSBhcmd1bWVudHMuCisJICovCisJc3dpdGNoIChidG51bSkgeworCWNhc2UgWEZTX0JUTlVNX0JOTzoKKwljYXNlIFhGU19CVE5VTV9DTlQ6CisJCWFnZiA9IFhGU19CVUZfVE9fQUdGKGFnYnApOworCQlubGV2ZWxzID0gSU5UX0dFVChhZ2YtPmFnZl9sZXZlbHNbYnRudW1dLCBBUkNIX0NPTlZFUlQpOworCQlicmVhazsKKwljYXNlIFhGU19CVE5VTV9CTUFQOgorCQlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOworCQlubGV2ZWxzID0gSU5UX0dFVChpZnAtPmlmX2Jyb290LT5iYl9sZXZlbCwgQVJDSF9DT05WRVJUKSArIDE7CisJCWJyZWFrOworCWNhc2UgWEZTX0JUTlVNX0lOTzoKKwkJYWdpID0gWEZTX0JVRl9UT19BR0koYWdicCk7CisJCW5sZXZlbHMgPSBJTlRfR0VUKGFnaS0+YWdpX2xldmVsLCBBUkNIX0NPTlZFUlQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlBU1NFUlQoMCk7CisJfQorCS8qCisJICogRmlsbCBpbiB0aGUgY29tbW9uIGZpZWxkcy4KKwkgKi8KKwljdXItPmJjX3RwID0gdHA7CisJY3VyLT5iY19tcCA9IG1wOworCWN1ci0+YmNfbmxldmVscyA9IG5sZXZlbHM7CisJY3VyLT5iY19idG51bSA9IGJ0bnVtOworCWN1ci0+YmNfYmxvY2tsb2cgPSBtcC0+bV9zYi5zYl9ibG9ja2xvZzsKKwkvKgorCSAqIEZpbGwgaW4gcHJpdmF0ZSBmaWVsZHMuCisJICovCisJc3dpdGNoIChidG51bSkgeworCWNhc2UgWEZTX0JUTlVNX0JOTzoKKwljYXNlIFhGU19CVE5VTV9DTlQ6CisJCS8qCisJCSAqIEFsbG9jYXRpb24gYnRyZWUgZmllbGRzLgorCQkgKi8KKwkJY3VyLT5iY19wcml2YXRlLmEuYWdicCA9IGFnYnA7CisJCWN1ci0+YmNfcHJpdmF0ZS5hLmFnbm8gPSBhZ25vOworCQlicmVhazsKKwljYXNlIFhGU19CVE5VTV9CTUFQOgorCQkvKgorCQkgKiBCbWFwIGJ0cmVlIGZpZWxkcy4KKwkJICovCisJCWN1ci0+YmNfcHJpdmF0ZS5iLmZvcmtzaXplID0gWEZTX0lGT1JLX1NJWkUoaXAsIHdoaWNoZm9yayk7CisJCWN1ci0+YmNfcHJpdmF0ZS5iLmlwID0gaXA7CisJCWN1ci0+YmNfcHJpdmF0ZS5iLmZpcnN0YmxvY2sgPSBOVUxMRlNCTE9DSzsKKwkJY3VyLT5iY19wcml2YXRlLmIuZmxpc3QgPSBOVUxMOworCQljdXItPmJjX3ByaXZhdGUuYi5hbGxvY2F0ZWQgPSAwOworCQljdXItPmJjX3ByaXZhdGUuYi5mbGFncyA9IDA7CisJCWN1ci0+YmNfcHJpdmF0ZS5iLndoaWNoZm9yayA9IHdoaWNoZm9yazsKKwkJYnJlYWs7CisJY2FzZSBYRlNfQlROVU1fSU5POgorCQkvKgorCQkgKiBJbm9kZSBhbGxvY2F0aW9uIGJ0cmVlIGZpZWxkcy4KKwkJICovCisJCWN1ci0+YmNfcHJpdmF0ZS5pLmFnYnAgPSBhZ2JwOworCQljdXItPmJjX3ByaXZhdGUuaS5hZ25vID0gYWdubzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQVNTRVJUKDApOworCX0KKwlyZXR1cm4gY3VyOworfQorCisvKgorICogQ2hlY2sgZm9yIHRoZSBjdXJzb3IgcmVmZXJyaW5nIHRvIHRoZSBsYXN0IGJsb2NrIGF0IHRoZSBnaXZlbiBsZXZlbC4KKyAqLworaW50CQkJCQkvKiAxPWlzIGxhc3QgYmxvY2ssIDA9bm90IGxhc3QgYmxvY2sgKi8KK3hmc19idHJlZV9pc2xhc3RibG9jaygKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJCWxldmVsKQkvKiBsZXZlbCB0byBjaGVjayAqLworeworCXhmc19idHJlZV9ibG9ja190CSpibG9jazsJLyogZ2VuZXJpYyBidHJlZSBibG9jayBwb2ludGVyICovCisJeGZzX2J1Zl90CQkqYnA7CS8qIGJ1ZmZlciBjb250YWluaW5nIGJsb2NrICovCisKKwlibG9jayA9IHhmc19idHJlZV9nZXRfYmxvY2soY3VyLCBsZXZlbCwgJmJwKTsKKwl4ZnNfYnRyZWVfY2hlY2tfYmxvY2soY3VyLCBibG9jaywgbGV2ZWwsIGJwKTsKKwlpZiAoWEZTX0JUUkVFX0xPTkdfUFRSUyhjdXItPmJjX2J0bnVtKSkKKwkJcmV0dXJuIElOVF9HRVQoYmxvY2stPmJiX3UubC5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSA9PSBOVUxMREZTQk5POworCWVsc2UKKwkJcmV0dXJuIElOVF9HRVQoYmxvY2stPmJiX3Uucy5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSA9PSBOVUxMQUdCTE9DSzsKK30KKworLyoKKyAqIENoYW5nZSB0aGUgY3Vyc29yIHRvIHBvaW50IHRvIHRoZSBsYXN0IHJlY29yZCBpbiB0aGUgY3VycmVudCBibG9jaworICogYXQgdGhlIGdpdmVuIGxldmVsLiAgT3RoZXIgbGV2ZWxzIGFyZSB1bmFmZmVjdGVkLgorICovCitpbnQJCQkJCS8qIHN1Y2Nlc3M9MSwgZmFpbHVyZT0wICovCit4ZnNfYnRyZWVfbGFzdHJlYygKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJCWxldmVsKQkvKiBsZXZlbCB0byBjaGFuZ2UgKi8KK3sKKwl4ZnNfYnRyZWVfYmxvY2tfdAkqYmxvY2s7CS8qIGdlbmVyaWMgYnRyZWUgYmxvY2sgcG9pbnRlciAqLworCXhmc19idWZfdAkJKmJwOwkvKiBidWZmZXIgY29udGFpbmluZyBibG9jayAqLworCisJLyoKKwkgKiBHZXQgdGhlIGJsb2NrIHBvaW50ZXIgZm9yIHRoaXMgbGV2ZWwuCisJICovCisJYmxvY2sgPSB4ZnNfYnRyZWVfZ2V0X2Jsb2NrKGN1ciwgbGV2ZWwsICZicCk7CisJeGZzX2J0cmVlX2NoZWNrX2Jsb2NrKGN1ciwgYmxvY2ssIGxldmVsLCBicCk7CisJLyoKKwkgKiBJdCdzIGVtcHR5LCB0aGVyZSBpcyBubyBzdWNoIHJlY29yZC4KKwkgKi8KKwlpZiAoIWJsb2NrLT5iYl9oLmJiX251bXJlY3MpCisJCXJldHVybiAwOworCS8qCisJICogU2V0IHRoZSBwdHIgdmFsdWUgdG8gbnVtcmVjcywgdGhhdCdzIHRoZSBsYXN0IHJlY29yZC9rZXkuCisJICovCisJY3VyLT5iY19wdHJzW2xldmVsXSA9IElOVF9HRVQoYmxvY2stPmJiX2guYmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIENvbXB1dGUgZmlyc3QgYW5kIGxhc3QgYnl0ZSBvZmZzZXRzIGZvciB0aGUgZmllbGRzIGdpdmVuLgorICogSW50ZXJwcmV0cyB0aGUgb2Zmc2V0cyB0YWJsZSwgd2hpY2ggY29udGFpbnMgc3RydWN0IGZpZWxkIG9mZnNldHMuCisgKi8KK3ZvaWQKK3hmc19idHJlZV9vZmZzZXRzKAorCV9faW50NjRfdAlmaWVsZHMsCQkvKiBiaXRtYXNrIG9mIGZpZWxkcyAqLworCWNvbnN0IHNob3J0CSpvZmZzZXRzLAkvKiB0YWJsZSBvZiBmaWVsZCBvZmZzZXRzICovCisJaW50CQluYml0cywJCS8qIG51bWJlciBvZiBiaXRzIHRvIGluc3BlY3QgKi8KKwlpbnQJCSpmaXJzdCwJCS8qIG91dHB1dDogZmlyc3QgYnl0ZSBvZmZzZXQgKi8KKwlpbnQJCSpsYXN0KQkJLyogb3V0cHV0OiBsYXN0IGJ5dGUgb2Zmc2V0ICovCit7CisJaW50CQlpOwkJLyogY3VycmVudCBiaXQgbnVtYmVyICovCisJX19pbnQ2NF90CWltYXNrOwkJLyogbWFzayBmb3IgY3VycmVudCBiaXQgbnVtYmVyICovCisKKwlBU1NFUlQoZmllbGRzICE9IDApOworCS8qCisJICogRmluZCB0aGUgbG93ZXN0IGJpdCwgc28gdGhlIGZpcnN0IGJ5dGUgb2Zmc2V0LgorCSAqLworCWZvciAoaSA9IDAsIGltYXNrID0gMUxMOyA7IGkrKywgaW1hc2sgPDw9IDEpIHsKKwkJaWYgKGltYXNrICYgZmllbGRzKSB7CisJCQkqZmlyc3QgPSBvZmZzZXRzW2ldOworCQkJYnJlYWs7CisJCX0KKwl9CisJLyoKKwkgKiBGaW5kIHRoZSBoaWdoZXN0IGJpdCwgc28gdGhlIGxhc3QgYnl0ZSBvZmZzZXQuCisJICovCisJZm9yIChpID0gbmJpdHMgLSAxLCBpbWFzayA9IDFMTCA8PCBpOyA7IGktLSwgaW1hc2sgPj49IDEpIHsKKwkJaWYgKGltYXNrICYgZmllbGRzKSB7CisJCQkqbGFzdCA9IG9mZnNldHNbaSArIDFdIC0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKgorICogR2V0IGEgYnVmZmVyIGZvciB0aGUgYmxvY2ssIHJldHVybiBpdCByZWFkIGluLgorICogTG9uZy1mb3JtIGFkZHJlc3NpbmcuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19idHJlZV9yZWFkX2J1ZmwoCisJeGZzX21vdW50X3QJKm1wLAkJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2ZzYmxvY2tfdAlmc2JubywJCS8qIGZpbGUgc3lzdGVtIGJsb2NrIG51bWJlciAqLworCXVpbnQJCWxvY2ssCQkvKiBsb2NrIGZsYWdzIGZvciByZWFkX2J1ZiAqLworCXhmc19idWZfdAkqKmJwcCwJCS8qIGJ1ZmZlciBmb3IgZnNibm8gKi8KKwlpbnQJCXJlZnZhbCkJCS8qIHJlZiBjb3VudCB2YWx1ZSBmb3IgYnVmZmVyICovCit7CisJeGZzX2J1Zl90CSpicDsJCS8qIHJldHVybiB2YWx1ZSAqLworCXhmc19kYWRkcl90CQlkOwkJLyogcmVhbCBkaXNrIGJsb2NrIGFkZHJlc3MgKi8KKwlpbnQJCWVycm9yOworCisJQVNTRVJUKGZzYm5vICE9IE5VTExGU0JMT0NLKTsKKwlkID0gWEZTX0ZTQl9UT19EQUREUihtcCwgZnNibm8pOworCWlmICgoZXJyb3IgPSB4ZnNfdHJhbnNfcmVhZF9idWYobXAsIHRwLCBtcC0+bV9kZGV2X3RhcmdwLCBkLAorCQkJbXAtPm1fYnNpemUsIGxvY2ssICZicCkpKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJQVNTRVJUKCFicCB8fCAhWEZTX0JVRl9HRVRFUlJPUihicCkpOworCWlmIChicCAhPSBOVUxMKSB7CisJCVhGU19CVUZfU0VUX1ZUWVBFX1JFRihicCwgQl9GU19NQVAsIHJlZnZhbCk7CisJfQorCSpicHAgPSBicDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEdldCBhIGJ1ZmZlciBmb3IgdGhlIGJsb2NrLCByZXR1cm4gaXQgcmVhZCBpbi4KKyAqIFNob3J0LWZvcm0gYWRkcmVzc2luZy4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2J0cmVlX3JlYWRfYnVmcygKKwl4ZnNfbW91bnRfdAkqbXAsCQkvKiBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfYWdudW1iZXJfdAlhZ25vLAkJLyogYWxsb2NhdGlvbiBncm91cCBudW1iZXIgKi8KKwl4ZnNfYWdibG9ja190CWFnYm5vLAkJLyogYWxsb2NhdGlvbiBncm91cCBibG9jayBudW1iZXIgKi8KKwl1aW50CQlsb2NrLAkJLyogbG9jayBmbGFncyBmb3IgcmVhZF9idWYgKi8KKwl4ZnNfYnVmX3QJKipicHAsCQkvKiBidWZmZXIgZm9yIGFnbm8vYWdibm8gKi8KKwlpbnQJCXJlZnZhbCkJCS8qIHJlZiBjb3VudCB2YWx1ZSBmb3IgYnVmZmVyICovCit7CisJeGZzX2J1Zl90CSpicDsJCS8qIHJldHVybiB2YWx1ZSAqLworCXhmc19kYWRkcl90CWQ7CQkvKiByZWFsIGRpc2sgYmxvY2sgYWRkcmVzcyAqLworCWludAkJZXJyb3I7CisKKwlBU1NFUlQoYWdubyAhPSBOVUxMQUdOVU1CRVIpOworCUFTU0VSVChhZ2JubyAhPSBOVUxMQUdCTE9DSyk7CisJZCA9IFhGU19BR0JfVE9fREFERFIobXAsIGFnbm8sIGFnYm5vKTsKKwlpZiAoKGVycm9yID0geGZzX3RyYW5zX3JlYWRfYnVmKG1wLCB0cCwgbXAtPm1fZGRldl90YXJncCwgZCwKKwkJCQkJbXAtPm1fYnNpemUsIGxvY2ssICZicCkpKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJQVNTRVJUKCFicCB8fCAhWEZTX0JVRl9HRVRFUlJPUihicCkpOworCWlmIChicCAhPSBOVUxMKSB7CisJCXN3aXRjaCAocmVmdmFsKSB7CisJCWNhc2UgWEZTX0FMTE9DX0JUUkVFX1JFRjoKKwkJCVhGU19CVUZfU0VUX1ZUWVBFX1JFRihicCwgQl9GU19NQVAsIHJlZnZhbCk7CisJCQlicmVhazsKKwkJY2FzZSBYRlNfSU5PX0JUUkVFX1JFRjoKKwkJCVhGU19CVUZfU0VUX1ZUWVBFX1JFRihicCwgQl9GU19JTk9NQVAsIHJlZnZhbCk7CisJCQlicmVhazsKKwkJfQorCX0KKwkqYnBwID0gYnA7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWFkLWFoZWFkIHRoZSBibG9jaywgZG9uJ3Qgd2FpdCBmb3IgaXQsIGRvbid0IHJldHVybiBhIGJ1ZmZlci4KKyAqIExvbmctZm9ybSBhZGRyZXNzaW5nLgorICovCisvKiBBUkdTVVNFRCAqLwordm9pZAoreGZzX2J0cmVlX3JlYWRhX2J1ZmwoCisJeGZzX21vdW50X3QJKm1wLAkJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl4ZnNfZnNibG9ja190CWZzYm5vLAkJLyogZmlsZSBzeXN0ZW0gYmxvY2sgbnVtYmVyICovCisJeGZzX2V4dGxlbl90CWNvdW50KQkJLyogY291bnQgb2YgZmlsZXN5c3RlbSBibG9ja3MgKi8KK3sKKwl4ZnNfZGFkZHJfdAkJZDsKKworCUFTU0VSVChmc2JubyAhPSBOVUxMRlNCTE9DSyk7CisJZCA9IFhGU19GU0JfVE9fREFERFIobXAsIGZzYm5vKTsKKwl4ZnNfYmFyZWFkKG1wLT5tX2RkZXZfdGFyZ3AsIGQsIG1wLT5tX2JzaXplICogY291bnQpOworfQorCisvKgorICogUmVhZC1haGVhZCB0aGUgYmxvY2ssIGRvbid0IHdhaXQgZm9yIGl0LCBkb24ndCByZXR1cm4gYSBidWZmZXIuCisgKiBTaG9ydC1mb3JtIGFkZHJlc3NpbmcuCisgKi8KKy8qIEFSR1NVU0VEICovCit2b2lkCit4ZnNfYnRyZWVfcmVhZGFfYnVmcygKKwl4ZnNfbW91bnRfdAkqbXAsCQkvKiBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc19hZ251bWJlcl90CWFnbm8sCQkvKiBhbGxvY2F0aW9uIGdyb3VwIG51bWJlciAqLworCXhmc19hZ2Jsb2NrX3QJYWdibm8sCQkvKiBhbGxvY2F0aW9uIGdyb3VwIGJsb2NrIG51bWJlciAqLworCXhmc19leHRsZW5fdAljb3VudCkJCS8qIGNvdW50IG9mIGZpbGVzeXN0ZW0gYmxvY2tzICovCit7CisJeGZzX2RhZGRyX3QJCWQ7CisKKwlBU1NFUlQoYWdubyAhPSBOVUxMQUdOVU1CRVIpOworCUFTU0VSVChhZ2JubyAhPSBOVUxMQUdCTE9DSyk7CisJZCA9IFhGU19BR0JfVE9fREFERFIobXAsIGFnbm8sIGFnYm5vKTsKKwl4ZnNfYmFyZWFkKG1wLT5tX2RkZXZfdGFyZ3AsIGQsIG1wLT5tX2JzaXplICogY291bnQpOworfQorCisvKgorICogUmVhZC1haGVhZCBidHJlZSBibG9ja3MsIGF0IHRoZSBnaXZlbiBsZXZlbC4KKyAqIEJpdHMgaW4gbHIgYXJlIHNldCBmcm9tIFhGU19CVENVUl97TEVGVCxSSUdIVH1SQS4KKyAqLworaW50Cit4ZnNfYnRyZWVfcmVhZGFoZWFkX2NvcmUoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkJbGV2LAkJLyogbGV2ZWwgaW4gYnRyZWUgKi8KKwlpbnQJCQlscikJCS8qIGxlZnQvcmlnaHQgYml0cyAqLworeworCXhmc19hbGxvY19ibG9ja190CSphOworCXhmc19ibWJ0X2Jsb2NrX3QJKmI7CisJeGZzX2lub2J0X2Jsb2NrX3QJKmk7CisJaW50CQkJcnZhbCA9IDA7CisKKwlBU1NFUlQoY3VyLT5iY19idWZzW2xldl0gIT0gTlVMTCk7CisJY3VyLT5iY19yYVtsZXZdIHw9IGxyOworCXN3aXRjaCAoY3VyLT5iY19idG51bSkgeworCWNhc2UgWEZTX0JUTlVNX0JOTzoKKwljYXNlIFhGU19CVE5VTV9DTlQ6CisJCWEgPSBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKGN1ci0+YmNfYnVmc1tsZXZdKTsKKwkJaWYgKChsciAmIFhGU19CVENVUl9MRUZUUkEpICYmIElOVF9HRVQoYS0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJUKSAhPSBOVUxMQUdCTE9DSykgeworCQkJeGZzX2J0cmVlX3JlYWRhX2J1ZnMoY3VyLT5iY19tcCwgY3VyLT5iY19wcml2YXRlLmEuYWdubywKKwkJCQlJTlRfR0VUKGEtPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCksIDEpOworCQkJcnZhbCsrOworCQl9CisJCWlmICgobHIgJiBYRlNfQlRDVVJfUklHSFRSQSkgJiYgSU5UX0dFVChhLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSAhPSBOVUxMQUdCTE9DSykgeworCQkJeGZzX2J0cmVlX3JlYWRhX2J1ZnMoY3VyLT5iY19tcCwgY3VyLT5iY19wcml2YXRlLmEuYWdubywKKwkJCQlJTlRfR0VUKGEtPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpLCAxKTsKKwkJCXJ2YWwrKzsKKwkJfQorCQlicmVhazsKKwljYXNlIFhGU19CVE5VTV9CTUFQOgorCQliID0gWEZTX0JVRl9UT19CTUJUX0JMT0NLKGN1ci0+YmNfYnVmc1tsZXZdKTsKKwkJaWYgKChsciAmIFhGU19CVENVUl9MRUZUUkEpICYmIElOVF9HRVQoYi0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJUKSAhPSBOVUxMREZTQk5PKSB7CisJCQl4ZnNfYnRyZWVfcmVhZGFfYnVmbChjdXItPmJjX21wLCBJTlRfR0VUKGItPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCksIDEpOworCQkJcnZhbCsrOworCQl9CisJCWlmICgobHIgJiBYRlNfQlRDVVJfUklHSFRSQSkgJiYgSU5UX0dFVChiLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSAhPSBOVUxMREZTQk5PKSB7CisJCQl4ZnNfYnRyZWVfcmVhZGFfYnVmbChjdXItPmJjX21wLCBJTlRfR0VUKGItPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpLCAxKTsKKwkJCXJ2YWwrKzsKKwkJfQorCQlicmVhazsKKwljYXNlIFhGU19CVE5VTV9JTk86CisJCWkgPSBYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKGN1ci0+YmNfYnVmc1tsZXZdKTsKKwkJaWYgKChsciAmIFhGU19CVENVUl9MRUZUUkEpICYmIElOVF9HRVQoaS0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJUKSAhPSBOVUxMQUdCTE9DSykgeworCQkJeGZzX2J0cmVlX3JlYWRhX2J1ZnMoY3VyLT5iY19tcCwgY3VyLT5iY19wcml2YXRlLmkuYWdubywKKwkJCQlJTlRfR0VUKGktPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCksIDEpOworCQkJcnZhbCsrOworCQl9CisJCWlmICgobHIgJiBYRlNfQlRDVVJfUklHSFRSQSkgJiYgSU5UX0dFVChpLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSAhPSBOVUxMQUdCTE9DSykgeworCQkJeGZzX2J0cmVlX3JlYWRhX2J1ZnMoY3VyLT5iY19tcCwgY3VyLT5iY19wcml2YXRlLmkuYWdubywKKwkJCQlJTlRfR0VUKGktPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpLCAxKTsKKwkJCXJ2YWwrKzsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlBU1NFUlQoMCk7CisJfQorCXJldHVybiBydmFsOworfQorCisvKgorICogU2V0IHRoZSBidWZmZXIgZm9yIGxldmVsICJsZXYiIGluIHRoZSBjdXJzb3IgdG8gYnAsIHJlbGVhc2luZworICogYW55IHByZXZpb3VzIGJ1ZmZlci4KKyAqLwordm9pZAoreGZzX2J0cmVlX3NldGJ1ZigKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJCWxldiwJLyogbGV2ZWwgaW4gYnRyZWUgKi8KKwl4ZnNfYnVmX3QJCSpicCkJLyogbmV3IGJ1ZmZlciB0byBzZXQgKi8KK3sKKwl4ZnNfYnRyZWVfYmxvY2tfdAkqYjsJLyogYnRyZWUgYmxvY2sgKi8KKwl4ZnNfYnVmX3QJCSpvYnA7CS8qIG9sZCBidWZmZXIgcG9pbnRlciAqLworCisJb2JwID0gY3VyLT5iY19idWZzW2xldl07CisJaWYgKG9icCkKKwkJeGZzX3RyYW5zX2JyZWxzZShjdXItPmJjX3RwLCBvYnApOworCWN1ci0+YmNfYnVmc1tsZXZdID0gYnA7CisJY3VyLT5iY19yYVtsZXZdID0gMDsKKwlpZiAoIWJwKQorCQlyZXR1cm47CisJYiA9IFhGU19CVUZfVE9fQkxPQ0soYnApOworCWlmIChYRlNfQlRSRUVfTE9OR19QVFJTKGN1ci0+YmNfYnRudW0pKSB7CisJCWlmIChJTlRfR0VUKGItPmJiX3UubC5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQpID09IE5VTExERlNCTk8pCisJCQljdXItPmJjX3JhW2xldl0gfD0gWEZTX0JUQ1VSX0xFRlRSQTsKKwkJaWYgKElOVF9HRVQoYi0+YmJfdS5sLmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpID09IE5VTExERlNCTk8pCisJCQljdXItPmJjX3JhW2xldl0gfD0gWEZTX0JUQ1VSX1JJR0hUUkE7CisJfSBlbHNlIHsKKwkJaWYgKElOVF9HRVQoYi0+YmJfdS5zLmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTEFHQkxPQ0spCisJCQljdXItPmJjX3JhW2xldl0gfD0gWEZTX0JUQ1VSX0xFRlRSQTsKKwkJaWYgKElOVF9HRVQoYi0+YmJfdS5zLmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpID09IE5VTExBR0JMT0NLKQorCQkJY3VyLT5iY19yYVtsZXZdIHw9IFhGU19CVENVUl9SSUdIVFJBOworCX0KK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYnRyZWUuaCBiL2ZzL3hmcy94ZnNfYnRyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mzg3MmJiCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19idHJlZS5oCkBAIC0wLDAgKzEsNTkyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19CVFJFRV9IX18KKyNkZWZpbmUJX19YRlNfQlRSRUVfSF9fCisKK3N0cnVjdCB4ZnNfYnVmOworc3RydWN0IHhmc19ibWFwX2ZyZWU7CitzdHJ1Y3QgeGZzX2lub2RlOworc3RydWN0IHhmc19tb3VudDsKK3N0cnVjdCB4ZnNfdHJhbnM7CisKKy8qCisgKiBUaGlzIG5vbnNlbnNlIGlzIHRvIG1ha2UgLXdsaW50IGhhcHB5LgorICovCisjZGVmaW5lCVhGU19MT09LVVBfRVEJKCh4ZnNfbG9va3VwX3QpWEZTX0xPT0tVUF9FUWkpCisjZGVmaW5lCVhGU19MT09LVVBfTEUJKCh4ZnNfbG9va3VwX3QpWEZTX0xPT0tVUF9MRWkpCisjZGVmaW5lCVhGU19MT09LVVBfR0UJKCh4ZnNfbG9va3VwX3QpWEZTX0xPT0tVUF9HRWkpCisKKyNkZWZpbmUJWEZTX0JUTlVNX0JOTwkoKHhmc19idG51bV90KVhGU19CVE5VTV9CTk9pKQorI2RlZmluZQlYRlNfQlROVU1fQ05UCSgoeGZzX2J0bnVtX3QpWEZTX0JUTlVNX0NOVGkpCisjZGVmaW5lCVhGU19CVE5VTV9CTUFQCSgoeGZzX2J0bnVtX3QpWEZTX0JUTlVNX0JNQVBpKQorI2RlZmluZQlYRlNfQlROVU1fSU5PCSgoeGZzX2J0bnVtX3QpWEZTX0JUTlVNX0lOT2kpCisKKy8qCisgKiBTaG9ydCBmb3JtIGhlYWRlcjogc3BhY2UgYWxsb2NhdGlvbiBidHJlZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19idHJlZV9zYmxvY2sKK3sKKwlfX3VpbnQzMl90CWJiX21hZ2ljOwkvKiBtYWdpYyBudW1iZXIgZm9yIGJsb2NrIHR5cGUgKi8KKwlfX3VpbnQxNl90CWJiX2xldmVsOwkvKiAwIGlzIGEgbGVhZiAqLworCV9fdWludDE2X3QJYmJfbnVtcmVjczsJLyogY3VycmVudCAjIG9mIGRhdGEgcmVjb3JkcyAqLworCXhmc19hZ2Jsb2NrX3QJYmJfbGVmdHNpYjsJLyogbGVmdCBzaWJsaW5nIGJsb2NrIG9yIE5VTExBR0JMT0NLICovCisJeGZzX2FnYmxvY2tfdAliYl9yaWdodHNpYjsJLyogcmlnaHQgc2libGluZyBibG9jayBvciBOVUxMQUdCTE9DSyAqLworfSB4ZnNfYnRyZWVfc2Jsb2NrX3Q7CisKKy8qCisgKiBMb25nIGZvcm0gaGVhZGVyOiBibWFwIGJ0cmVlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2J0cmVlX2xibG9jaworeworCV9fdWludDMyX3QJYmJfbWFnaWM7CS8qIG1hZ2ljIG51bWJlciBmb3IgYmxvY2sgdHlwZSAqLworCV9fdWludDE2X3QJYmJfbGV2ZWw7CS8qIDAgaXMgYSBsZWFmICovCisJX191aW50MTZfdAliYl9udW1yZWNzOwkvKiBjdXJyZW50ICMgb2YgZGF0YSByZWNvcmRzICovCisJeGZzX2Rmc2Jub190CWJiX2xlZnRzaWI7CS8qIGxlZnQgc2libGluZyBibG9jayBvciBOVUxMREZTQk5PICovCisJeGZzX2Rmc2Jub190CWJiX3JpZ2h0c2liOwkvKiByaWdodCBzaWJsaW5nIGJsb2NrIG9yIE5VTExERlNCTk8gKi8KK30geGZzX2J0cmVlX2xibG9ja190OworCisvKgorICogQ29tYmluZWQgaGVhZGVyIGFuZCBzdHJ1Y3R1cmUsIHVzZWQgYnkgY29tbW9uIGNvZGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19idHJlZV9oZHIKK3sKKwlfX3VpbnQzMl90CWJiX21hZ2ljOwkvKiBtYWdpYyBudW1iZXIgZm9yIGJsb2NrIHR5cGUgKi8KKwlfX3VpbnQxNl90CWJiX2xldmVsOwkvKiAwIGlzIGEgbGVhZiAqLworCV9fdWludDE2X3QJYmJfbnVtcmVjczsJLyogY3VycmVudCAjIG9mIGRhdGEgcmVjb3JkcyAqLworfSB4ZnNfYnRyZWVfaGRyX3Q7CisKK3R5cGVkZWYgc3RydWN0IHhmc19idHJlZV9ibG9jaworeworCXhmc19idHJlZV9oZHJfdAliYl9oOwkJLyogaGVhZGVyICovCisJdW5pb24JCXsKKwkJc3RydWN0CXsKKwkJCXhmc19hZ2Jsb2NrX3QJYmJfbGVmdHNpYjsKKwkJCXhmc19hZ2Jsb2NrX3QJYmJfcmlnaHRzaWI7CisJCX0JczsJCS8qIHNob3J0IGZvcm0gcG9pbnRlcnMgKi8KKwkJc3RydWN0CXsKKwkJCXhmc19kZnNibm9fdAliYl9sZWZ0c2liOworCQkJeGZzX2Rmc2Jub190CWJiX3JpZ2h0c2liOworCQl9CWw7CQkvKiBsb25nIGZvcm0gcG9pbnRlcnMgKi8KKwl9CQliYl91OwkJLyogcmVzdCAqLworfSB4ZnNfYnRyZWVfYmxvY2tfdDsKKworLyoKKyAqIEZvciBsb2dnaW5nIHJlY29yZCBmaWVsZHMuCisgKi8KKyNkZWZpbmUJWEZTX0JCX01BR0lDCQkweDAxCisjZGVmaW5lCVhGU19CQl9MRVZFTAkJMHgwMgorI2RlZmluZQlYRlNfQkJfTlVNUkVDUwkJMHgwNAorI2RlZmluZQlYRlNfQkJfTEVGVFNJQgkJMHgwOAorI2RlZmluZQlYRlNfQkJfUklHSFRTSUIJCTB4MTAKKyNkZWZpbmUJWEZTX0JCX05VTV9CSVRTCQk1CisjZGVmaW5lCVhGU19CQl9BTExfQklUUwkJKCgxIDw8IFhGU19CQl9OVU1fQklUUykgLSAxKQorCisvKgorICogQm9vbGVhbiB0byBzZWxlY3Qgd2hpY2ggZm9ybSBvZiB4ZnNfYnRyZWVfYmxvY2tfdC5iYl91IHRvIHVzZS4KKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQlRSRUVfTE9OR19QVFJTKQoraW50IHhmc19idHJlZV9sb25nX3B0cnMoeGZzX2J0bnVtX3QgYnRudW0pOworI2RlZmluZQlYRlNfQlRSRUVfTE9OR19QVFJTKGJ0bnVtKQkoKGJ0bnVtKSA9PSBYRlNfQlROVU1fQk1BUCkKKyNlbHNlCisjZGVmaW5lCVhGU19CVFJFRV9MT05HX1BUUlMoYnRudW0pCSgoYnRudW0pID09IFhGU19CVE5VTV9CTUFQKQorI2VuZGlmCisKKy8qCisgKiBNYWdpYyBudW1iZXJzIGZvciBidHJlZSBibG9ja3MuCisgKi8KK2V4dGVybiBjb25zdCBfX3VpbnQzMl90CXhmc19tYWdpY3NbXTsKKworLyoKKyAqIE1heGltdW0gYW5kIG1pbmltdW0gcmVjb3JkcyBpbiBhIGJ0cmVlIGJsb2NrLgorICogR2l2ZW4gYmxvY2sgc2l6ZSwgdHlwZSBwcmVmaXgsIGFuZCBsZWFmIGZsYWcgKDAgb3IgMSkuCisgKiBUaGUgZGl2aXNvciBiZWxvdyBpcyBlcXVpdmFsZW50IHRvIGxmID8gKGUxKSA6IChlMikgYnV0IHRoYXQgcHJvZHVjZXMKKyAqIGNvbXBpbGVyIHdhcm5pbmdzLgorICovCisjZGVmaW5lCVhGU19CVFJFRV9CTE9DS19NQVhSRUNTKGJzeix0LGxmKQlcCisJKChpbnQpKCgoYnN6KSAtICh1aW50KXNpemVvZih0ICMjIF9ibG9ja190KSkgLyBcCisJICgoKGxmKSAqICh1aW50KXNpemVvZih0ICMjIF9yZWNfdCkpICsgXAorCSAgKCgxIC0gKGxmKSkgKiBcCisJICAgKCh1aW50KXNpemVvZih0ICMjIF9rZXlfdCkgKyAodWludClzaXplb2YodCAjIyBfcHRyX3QpKSkpKSkKKyNkZWZpbmUJWEZTX0JUUkVFX0JMT0NLX01JTlJFQ1MoYnN6LHQsbGYpCVwKKwkoWEZTX0JUUkVFX0JMT0NLX01BWFJFQ1MoYnN6LHQsbGYpIC8gMikKKworLyoKKyAqIFJlY29yZCwga2V5LCBhbmQgcG9pbnRlciBhZGRyZXNzIGNhbGN1bGF0aW9uIG1hY3Jvcy4KKyAqIEdpdmVuIGJsb2NrIHNpemUsIHR5cGUgcHJlZml4LCBibG9jayBwb2ludGVyLCBhbmQgaW5kZXggb2YgcmVxdWVzdGVkIGVudHJ5CisgKiAoZmlyc3QgZW50cnkgbnVtYmVyZWQgMSkuCisgKi8KKyNkZWZpbmUJWEZTX0JUUkVFX1JFQ19BRERSKGJzeix0LGJiLGksbXhyKQlcCisJKCh0ICMjIF9yZWNfdCAqKSgoY2hhciAqKShiYikgKyBzaXplb2YodCAjIyBfYmxvY2tfdCkgKyBcCisJICgoaSkgLSAxKSAqIHNpemVvZih0ICMjIF9yZWNfdCkpKQorI2RlZmluZQlYRlNfQlRSRUVfS0VZX0FERFIoYnN6LHQsYmIsaSxteHIpCVwKKwkoKHQgIyMgX2tleV90ICopKChjaGFyICopKGJiKSArIHNpemVvZih0ICMjIF9ibG9ja190KSArIFwKKwkgKChpKSAtIDEpICogc2l6ZW9mKHQgIyMgX2tleV90KSkpCisjZGVmaW5lCVhGU19CVFJFRV9QVFJfQUREUihic3osdCxiYixpLG14cikJXAorCSgodCAjIyBfcHRyX3QgKikoKGNoYXIgKikoYmIpICsgc2l6ZW9mKHQgIyMgX2Jsb2NrX3QpICsgXAorCSAobXhyKSAqIHNpemVvZih0ICMjIF9rZXlfdCkgKyAoKGkpIC0gMSkgKiBzaXplb2YodCAjIyBfcHRyX3QpKSkKKworI2RlZmluZQlYRlNfQlRSRUVfTUFYTEVWRUxTCTgJLyogbWF4IG9mIGFsbCBidHJlZXMgKi8KKworLyoKKyAqIEJ0cmVlIGN1cnNvciBzdHJ1Y3R1cmUuCisgKiBUaGlzIGNvbGxlY3RzIGFsbCBpbmZvcm1hdGlvbiBuZWVkZWQgYnkgdGhlIGJ0cmVlIGNvZGUgaW4gb25lIHBsYWNlLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfYnRyZWVfY3VyCit7CisJc3RydWN0IHhmc190cmFucwkqYmNfdHA7CS8qIHRyYW5zYWN0aW9uIHdlJ3JlIGluLCBpZiBhbnkgKi8KKwlzdHJ1Y3QgeGZzX21vdW50CSpiY19tcDsJLyogZmlsZSBzeXN0ZW0gbW91bnQgc3RydWN0ICovCisJdW5pb24geworCQl4ZnNfYWxsb2NfcmVjX3QJCWE7CisJCXhmc19ibWJ0X2lyZWNfdAkJYjsKKwkJeGZzX2lub2J0X3JlY190CQlpOworCX0JCWJjX3JlYzsJCS8qIGN1cnJlbnQgaW5zZXJ0L3NlYXJjaCByZWNvcmQgdmFsdWUgKi8KKwlzdHJ1Y3QgeGZzX2J1ZgkqYmNfYnVmc1tYRlNfQlRSRUVfTUFYTEVWRUxTXTsJLyogYnVmIHB0ciBwZXIgbGV2ZWwgKi8KKwlpbnQJCWJjX3B0cnNbWEZTX0JUUkVFX01BWExFVkVMU107CS8qIGtleS9yZWNvcmQgIyAqLworCV9fdWludDhfdAliY19yYVtYRlNfQlRSRUVfTUFYTEVWRUxTXTsJLyogcmVhZGFoZWFkIGJpdHMgKi8KKyNkZWZpbmUJWEZTX0JUQ1VSX0xFRlRSQQkxCS8qIGxlZnQgc2libGluZyBoYXMgYmVlbiByZWFkLWFoZWFkICovCisjZGVmaW5lCVhGU19CVENVUl9SSUdIVFJBCTIJLyogcmlnaHQgc2libGluZyBoYXMgYmVlbiByZWFkLWFoZWFkICovCisJX191aW50OF90CWJjX25sZXZlbHM7CS8qIG51bWJlciBvZiBsZXZlbHMgaW4gdGhlIHRyZWUgKi8KKwlfX3VpbnQ4X3QJYmNfYmxvY2tsb2c7CS8qIGxvZzIoYmxvY2tzaXplKSBvZiBidHJlZSBibG9ja3MgKi8KKwl4ZnNfYnRudW1fdAliY19idG51bTsJLyogaWRlbnRpZmllcyB3aGljaCBidHJlZSB0eXBlICovCisJdW5pb24geworCQlzdHJ1Y3QgewkJCS8qIG5lZWRlZCBmb3IgQk5PLCBDTlQgKi8KKwkJCXN0cnVjdCB4ZnNfYnVmCSphZ2JwOwkvKiBhZ2YgYnVmZmVyIHBvaW50ZXIgKi8KKwkJCXhmc19hZ251bWJlcl90CWFnbm87CS8qIGFnIG51bWJlciAqLworCQl9IGE7CisJCXN0cnVjdCB7CQkJLyogbmVlZGVkIGZvciBCTUFQICovCisJCQlzdHJ1Y3QgeGZzX2lub2RlICppcDsJLyogcG9pbnRlciB0byBvdXIgaW5vZGUgKi8KKwkJCXN0cnVjdCB4ZnNfYm1hcF9mcmVlICpmbGlzdDsJLyogbGlzdCB0byBmcmVlIGFmdGVyICovCisJCQl4ZnNfZnNibG9ja190CWZpcnN0YmxvY2s7CS8qIDFzdCBibGsgYWxsb2NhdGVkICovCisJCQlpbnQJCWFsbG9jYXRlZDsJLyogY291bnQgb2YgYWxsb2NlZCAqLworCQkJc2hvcnQJCWZvcmtzaXplOwkvKiBmb3JrJ3MgaW5vZGUgc3BhY2UgKi8KKwkJCWNoYXIJCXdoaWNoZm9yazsJLyogZGF0YSBvciBhdHRyIGZvcmsgKi8KKwkJCWNoYXIJCWZsYWdzOwkJLyogZmxhZ3MgKi8KKyNkZWZpbmUJWEZTX0JUQ1VSX0JQUlZfV0FTREVMCTEJCQkvKiB3YXMgZGVsYXllZCAqLworCQl9IGI7CisJCXN0cnVjdCB7CQkJLyogbmVlZGVkIGZvciBJTk8gKi8KKwkJCXN0cnVjdCB4ZnNfYnVmCSphZ2JwOwkvKiBhZ2kgYnVmZmVyIHBvaW50ZXIgKi8KKwkJCXhmc19hZ251bWJlcl90CWFnbm87CS8qIGFnIG51bWJlciAqLworCQl9IGk7CisJfQkJYmNfcHJpdmF0ZTsJLyogcGVyLWJ0cmVlIHR5cGUgZGF0YSAqLworfSB4ZnNfYnRyZWVfY3VyX3Q7CisKKyNkZWZpbmUJWEZTX0JUUkVFX05PRVJST1IJMAorI2RlZmluZQlYRlNfQlRSRUVfRVJST1IJCTEKKworLyoKKyAqIENvbnZlcnQgZnJvbSBidWZmZXIgdG8gYnRyZWUgYmxvY2sgaGVhZGVyLgorICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CVUZfVE9fQkxPQ0spCit4ZnNfYnRyZWVfYmxvY2tfdCAqeGZzX2J1Zl90b19ibG9jayhzdHJ1Y3QgeGZzX2J1ZiAqYnApOworI2RlZmluZQlYRlNfQlVGX1RPX0JMT0NLKGJwKQl4ZnNfYnVmX3RvX2Jsb2NrKGJwKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0JVRl9UT19CTE9DSyhicCkJKCh4ZnNfYnRyZWVfYmxvY2tfdCAqKShYRlNfQlVGX1BUUihicCkpKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CVUZfVE9fTEJMT0NLKQoreGZzX2J0cmVlX2xibG9ja190ICp4ZnNfYnVmX3RvX2xibG9jayhzdHJ1Y3QgeGZzX2J1ZiAqYnApOworI2RlZmluZQlYRlNfQlVGX1RPX0xCTE9DSyhicCkJeGZzX2J1Zl90b19sYmxvY2soYnApCisjZWxzZQorI2RlZmluZQlYRlNfQlVGX1RPX0xCTE9DSyhicCkJKCh4ZnNfYnRyZWVfbGJsb2NrX3QgKikoWEZTX0JVRl9QVFIoYnApKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQlVGX1RPX1NCTE9DSykKK3hmc19idHJlZV9zYmxvY2tfdCAqeGZzX2J1Zl90b19zYmxvY2soc3RydWN0IHhmc19idWYgKmJwKTsKKyNkZWZpbmUJWEZTX0JVRl9UT19TQkxPQ0soYnApCXhmc19idWZfdG9fc2Jsb2NrKGJwKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0JVRl9UT19TQkxPQ0soYnApCSgoeGZzX2J0cmVlX3NibG9ja190ICopKFhGU19CVUZfUFRSKGJwKSkpCisjZW5kaWYKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2lmZGVmIERFQlVHCisvKgorICogRGVidWcgcm91dGluZTogY2hlY2sgdGhhdCBibG9jayBoZWFkZXIgaXMgb2suCisgKi8KK3ZvaWQKK3hmc19idHJlZV9jaGVja19ibG9jaygKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19idHJlZV9ibG9ja190CSpibG9jaywJLyogZ2VuZXJpYyBidHJlZSBibG9jayBwb2ludGVyICovCisJaW50CQkJbGV2ZWwsCS8qIGxldmVsIG9mIHRoZSBidHJlZSBibG9jayAqLworCXN0cnVjdCB4ZnNfYnVmCQkqYnApOwkvKiBidWZmZXIgY29udGFpbmluZyBibG9jaywgaWYgYW55ICovCisKKy8qCisgKiBEZWJ1ZyByb3V0aW5lOiBjaGVjayB0aGF0IGtleXMgYXJlIGluIHRoZSByaWdodCBvcmRlci4KKyAqLwordm9pZAoreGZzX2J0cmVlX2NoZWNrX2tleSgKKwl4ZnNfYnRudW1fdAkJYnRudW0sCS8qIGJ0cmVlIGlkZW50aWZpZXIgKi8KKwl2b2lkCQkJKmFrMSwJLyogcG9pbnRlciB0byBsZWZ0IChsb3dlcikga2V5ICovCisJdm9pZAkJCSphazIpOwkvKiBwb2ludGVyIHRvIHJpZ2h0IChoaWdoZXIpIGtleSAqLworCisvKgorICogRGVidWcgcm91dGluZTogY2hlY2sgdGhhdCByZWNvcmRzIGFyZSBpbiB0aGUgcmlnaHQgb3JkZXIuCisgKi8KK3ZvaWQKK3hmc19idHJlZV9jaGVja19yZWMoCisJeGZzX2J0bnVtX3QJCWJ0bnVtLAkvKiBidHJlZSBpZGVudGlmaWVyICovCisJdm9pZAkJCSphcjEsCS8qIHBvaW50ZXIgdG8gbGVmdCAobG93ZXIpIHJlY29yZCAqLworCXZvaWQJCQkqYXIyKTsJLyogcG9pbnRlciB0byByaWdodCAoaGlnaGVyKSByZWNvcmQgKi8KKyNlbHNlCisjZGVmaW5lCXhmc19idHJlZV9jaGVja19ibG9jayhhLGIsYyxkKQorI2RlZmluZQl4ZnNfYnRyZWVfY2hlY2tfa2V5KGEsYixjKQorI2RlZmluZQl4ZnNfYnRyZWVfY2hlY2tfcmVjKGEsYixjKQorI2VuZGlmCS8qIERFQlVHICovCisKKy8qCisgKiBDaGVja2luZyByb3V0aW5lOiBjaGVjayB0aGF0IGxvbmcgZm9ybSBibG9jayBoZWFkZXIgaXMgb2suCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKDAgb3IgRUZTQ09SUlVQVEVEKSAqLworeGZzX2J0cmVlX2NoZWNrX2xibG9jaygKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19idHJlZV9sYmxvY2tfdAkqYmxvY2ssCS8qIGJ0cmVlIGxvbmcgZm9ybSBibG9jayBwb2ludGVyICovCisJaW50CQkJbGV2ZWwsCS8qIGxldmVsIG9mIHRoZSBidHJlZSBibG9jayAqLworCXN0cnVjdCB4ZnNfYnVmCQkqYnApOwkvKiBidWZmZXIgY29udGFpbmluZyBibG9jaywgaWYgYW55ICovCisKKy8qCisgKiBDaGVja2luZyByb3V0aW5lOiBjaGVjayB0aGF0IChsb25nKSBwb2ludGVyIGlzIG9rLgorICovCitpbnQJCQkJCS8qIGVycm9yICgwIG9yIEVGU0NPUlJVUFRFRCkgKi8KK3hmc19idHJlZV9jaGVja19scHRyKAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2Rmc2Jub190CQlwdHIsCS8qIGJ0cmVlIGJsb2NrIGRpc2sgYWRkcmVzcyAqLworCWludAkJCWxldmVsKTsJLyogYnRyZWUgYmxvY2sgbGV2ZWwgKi8KKworLyoKKyAqIENoZWNraW5nIHJvdXRpbmU6IGNoZWNrIHRoYXQgc2hvcnQgZm9ybSBibG9jayBoZWFkZXIgaXMgb2suCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKDAgb3IgRUZTQ09SUlVQVEVEKSAqLworeGZzX2J0cmVlX2NoZWNrX3NibG9jaygKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19idHJlZV9zYmxvY2tfdAkqYmxvY2ssCS8qIGJ0cmVlIHNob3J0IGZvcm0gYmxvY2sgcG9pbnRlciAqLworCWludAkJCWxldmVsLAkvKiBsZXZlbCBvZiB0aGUgYnRyZWUgYmxvY2sgKi8KKwlzdHJ1Y3QgeGZzX2J1ZgkJKmJwKTsJLyogYnVmZmVyIGNvbnRhaW5pbmcgYmxvY2sgKi8KKworLyoKKyAqIENoZWNraW5nIHJvdXRpbmU6IGNoZWNrIHRoYXQgKHNob3J0KSBwb2ludGVyIGlzIG9rLgorICovCitpbnQJCQkJCS8qIGVycm9yICgwIG9yIEVGU0NPUlJVUFRFRCkgKi8KK3hmc19idHJlZV9jaGVja19zcHRyKAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2FnYmxvY2tfdAkJcHRyLAkvKiBidHJlZSBibG9jayBkaXNrIGFkZHJlc3MgKi8KKwlpbnQJCQlsZXZlbCk7CS8qIGJ0cmVlIGJsb2NrIGxldmVsICovCisKKy8qCisgKiBEZWxldGUgdGhlIGJ0cmVlIGN1cnNvci4KKyAqLwordm9pZAoreGZzX2J0cmVlX2RlbF9jdXJzb3IoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCQllcnJvcik7CS8qIGRlbCBiZWNhdXNlIG9mIGVycm9yICovCisKKy8qCisgKiBEdXBsaWNhdGUgdGhlIGJ0cmVlIGN1cnNvci4KKyAqIEFsbG9jYXRlIGEgbmV3IG9uZSwgY29weSB0aGUgcmVjb3JkLCByZS1nZXQgdGhlIGJ1ZmZlcnMuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19idHJlZV9kdXBfY3Vyc29yKAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogaW5wdXQgY3Vyc29yICovCisJeGZzX2J0cmVlX2N1cl90CQkqKm5jdXIpOy8qIG91dHB1dCBjdXJzb3IgKi8KKworLyoKKyAqIENoYW5nZSB0aGUgY3Vyc29yIHRvIHBvaW50IHRvIHRoZSBmaXJzdCByZWNvcmQgaW4gdGhlIGN1cnJlbnQgYmxvY2sKKyAqIGF0IHRoZSBnaXZlbiBsZXZlbC4gIE90aGVyIGxldmVscyBhcmUgdW5hZmZlY3RlZC4KKyAqLworaW50CQkJCQkvKiBzdWNjZXNzPTEsIGZhaWx1cmU9MCAqLworeGZzX2J0cmVlX2ZpcnN0cmVjKAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkJbGV2ZWwpOwkvKiBsZXZlbCB0byBjaGFuZ2UgKi8KKworLyoKKyAqIFJldHJpZXZlIHRoZSBibG9jayBwb2ludGVyIGZyb20gdGhlIGN1cnNvciBhdCB0aGUgZ2l2ZW4gbGV2ZWwuCisgKiBUaGlzIG1heSBiZSBhIGJtYXAgYnRyZWUgcm9vdCBvciBmcm9tIGEgYnVmZmVyLgorICovCit4ZnNfYnRyZWVfYmxvY2tfdCAqCQkJLyogZ2VuZXJpYyBidHJlZSBibG9jayBwb2ludGVyICovCit4ZnNfYnRyZWVfZ2V0X2Jsb2NrKAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkJbGV2ZWwsCS8qIGxldmVsIGluIGJ0cmVlICovCisJc3RydWN0IHhmc19idWYJCSoqYnBwKTsJLyogYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGJsb2NrICovCisKKy8qCisgKiBHZXQgYSBidWZmZXIgZm9yIHRoZSBibG9jaywgcmV0dXJuIGl0IHdpdGggbm8gZGF0YSByZWFkLgorICogTG9uZy1mb3JtIGFkZHJlc3NpbmcuCisgKi8KK3N0cnVjdCB4ZnNfYnVmICoJCQkJLyogYnVmZmVyIGZvciBmc2JubyAqLworeGZzX2J0cmVlX2dldF9idWZsKAorCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAkvKiBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCXN0cnVjdCB4ZnNfdHJhbnMJKnRwLAkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2ZzYmxvY2tfdAkJZnNibm8sCS8qIGZpbGUgc3lzdGVtIGJsb2NrIG51bWJlciAqLworCXVpbnQJCQlsb2NrKTsJLyogbG9jayBmbGFncyBmb3IgZ2V0X2J1ZiAqLworCisvKgorICogR2V0IGEgYnVmZmVyIGZvciB0aGUgYmxvY2ssIHJldHVybiBpdCB3aXRoIG5vIGRhdGEgcmVhZC4KKyAqIFNob3J0LWZvcm0gYWRkcmVzc2luZy4KKyAqLworc3RydWN0IHhmc19idWYgKgkJCQkvKiBidWZmZXIgZm9yIGFnbm8vYWdibm8gKi8KK3hmc19idHJlZV9nZXRfYnVmcygKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCwJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19hZ251bWJlcl90CQlhZ25vLAkvKiBhbGxvY2F0aW9uIGdyb3VwIG51bWJlciAqLworCXhmc19hZ2Jsb2NrX3QJCWFnYm5vLAkvKiBhbGxvY2F0aW9uIGdyb3VwIGJsb2NrIG51bWJlciAqLworCXVpbnQJCQlsb2NrKTsJLyogbG9jayBmbGFncyBmb3IgZ2V0X2J1ZiAqLworCisvKgorICogQWxsb2NhdGUgYSBuZXcgYnRyZWUgY3Vyc29yLgorICogVGhlIGN1cnNvciBpcyBlaXRoZXIgZm9yIGFsbG9jYXRpb24gKEEpIG9yIGJtYXAgKEIpLgorICovCit4ZnNfYnRyZWVfY3VyX3QgKgkJCS8qIG5ldyBidHJlZSBjdXJzb3IgKi8KK3hmc19idHJlZV9pbml0X2N1cnNvcigKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCwJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXN0cnVjdCB4ZnNfYnVmCQkqYWdicCwJLyogKEEgb25seSkgYnVmZmVyIGZvciBhZ2Ygc3RydWN0dXJlICovCisJeGZzX2FnbnVtYmVyX3QJCWFnbm8sCS8qIChBIG9ubHkpIGFsbG9jYXRpb24gZ3JvdXAgbnVtYmVyICovCisJeGZzX2J0bnVtX3QJCWJ0bnVtLAkvKiBidHJlZSBpZGVudGlmaWVyICovCisJc3RydWN0IHhmc19pbm9kZQkqaXAsCS8qIChCIG9ubHkpIGlub2RlIG93bmluZyB0aGUgYnRyZWUgKi8KKwlpbnQJCQl3aGljaGZvcmspOyAvKiAoQiBvbmx5KSBkYXRhL2F0dHIgZm9yayAqLworCisvKgorICogQ2hlY2sgZm9yIHRoZSBjdXJzb3IgcmVmZXJyaW5nIHRvIHRoZSBsYXN0IGJsb2NrIGF0IHRoZSBnaXZlbiBsZXZlbC4KKyAqLworaW50CQkJCQkvKiAxPWlzIGxhc3QgYmxvY2ssIDA9bm90IGxhc3QgYmxvY2sgKi8KK3hmc19idHJlZV9pc2xhc3RibG9jaygKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJCWxldmVsKTsJLyogbGV2ZWwgdG8gY2hlY2sgKi8KKworLyoKKyAqIENoYW5nZSB0aGUgY3Vyc29yIHRvIHBvaW50IHRvIHRoZSBsYXN0IHJlY29yZCBpbiB0aGUgY3VycmVudCBibG9jaworICogYXQgdGhlIGdpdmVuIGxldmVsLiAgT3RoZXIgbGV2ZWxzIGFyZSB1bmFmZmVjdGVkLgorICovCitpbnQJCQkJCS8qIHN1Y2Nlc3M9MSwgZmFpbHVyZT0wICovCit4ZnNfYnRyZWVfbGFzdHJlYygKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJCWxldmVsKTsJLyogbGV2ZWwgdG8gY2hhbmdlICovCisKKy8qCisgKiBDb21wdXRlIGZpcnN0IGFuZCBsYXN0IGJ5dGUgb2Zmc2V0cyBmb3IgdGhlIGZpZWxkcyBnaXZlbi4KKyAqIEludGVycHJldHMgdGhlIG9mZnNldHMgdGFibGUsIHdoaWNoIGNvbnRhaW5zIHN0cnVjdCBmaWVsZCBvZmZzZXRzLgorICovCit2b2lkCit4ZnNfYnRyZWVfb2Zmc2V0cygKKwlfX2ludDY0X3QJCWZpZWxkcywJLyogYml0bWFzayBvZiBmaWVsZHMgKi8KKwljb25zdCBzaG9ydAkJKm9mZnNldHMsLyogdGFibGUgb2YgZmllbGQgb2Zmc2V0cyAqLworCWludAkJCW5iaXRzLAkvKiBudW1iZXIgb2YgYml0cyB0byBpbnNwZWN0ICovCisJaW50CQkJKmZpcnN0LAkvKiBvdXRwdXQ6IGZpcnN0IGJ5dGUgb2Zmc2V0ICovCisJaW50CQkJKmxhc3QpOwkvKiBvdXRwdXQ6IGxhc3QgYnl0ZSBvZmZzZXQgKi8KKworLyoKKyAqIEdldCBhIGJ1ZmZlciBmb3IgdGhlIGJsb2NrLCByZXR1cm4gaXQgcmVhZCBpbi4KKyAqIExvbmctZm9ybSBhZGRyZXNzaW5nLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfYnRyZWVfcmVhZF9idWZsKAorCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAkvKiBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCXN0cnVjdCB4ZnNfdHJhbnMJKnRwLAkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2ZzYmxvY2tfdAkJZnNibm8sCS8qIGZpbGUgc3lzdGVtIGJsb2NrIG51bWJlciAqLworCXVpbnQJCQlsb2NrLAkvKiBsb2NrIGZsYWdzIGZvciByZWFkX2J1ZiAqLworCXN0cnVjdCB4ZnNfYnVmCQkqKmJwcCwJLyogYnVmZmVyIGZvciBmc2JubyAqLworCWludAkJCXJlZnZhbCk7LyogcmVmIGNvdW50IHZhbHVlIGZvciBidWZmZXIgKi8KKworLyoKKyAqIEdldCBhIGJ1ZmZlciBmb3IgdGhlIGJsb2NrLCByZXR1cm4gaXQgcmVhZCBpbi4KKyAqIFNob3J0LWZvcm0gYWRkcmVzc2luZy4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2J0cmVlX3JlYWRfYnVmcygKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCwJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwlzdHJ1Y3QgeGZzX3RyYW5zCSp0cCwJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19hZ251bWJlcl90CQlhZ25vLAkvKiBhbGxvY2F0aW9uIGdyb3VwIG51bWJlciAqLworCXhmc19hZ2Jsb2NrX3QJCWFnYm5vLAkvKiBhbGxvY2F0aW9uIGdyb3VwIGJsb2NrIG51bWJlciAqLworCXVpbnQJCQlsb2NrLAkvKiBsb2NrIGZsYWdzIGZvciByZWFkX2J1ZiAqLworCXN0cnVjdCB4ZnNfYnVmCQkqKmJwcCwJLyogYnVmZmVyIGZvciBhZ25vL2FnYm5vICovCisJaW50CQkJcmVmdmFsKTsvKiByZWYgY291bnQgdmFsdWUgZm9yIGJ1ZmZlciAqLworCisvKgorICogUmVhZC1haGVhZCB0aGUgYmxvY2ssIGRvbid0IHdhaXQgZm9yIGl0LCBkb24ndCByZXR1cm4gYSBidWZmZXIuCisgKiBMb25nLWZvcm0gYWRkcmVzc2luZy4KKyAqLwordm9pZAkJCQkJLyogZXJyb3IgKi8KK3hmc19idHJlZV9yZWFkYV9idWZsKAorCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAkvKiBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc19mc2Jsb2NrX3QJCWZzYm5vLAkvKiBmaWxlIHN5c3RlbSBibG9jayBudW1iZXIgKi8KKwl4ZnNfZXh0bGVuX3QJCWNvdW50KTsJLyogY291bnQgb2YgZmlsZXN5c3RlbSBibG9ja3MgKi8KKworLyoKKyAqIFJlYWQtYWhlYWQgdGhlIGJsb2NrLCBkb24ndCB3YWl0IGZvciBpdCwgZG9uJ3QgcmV0dXJuIGEgYnVmZmVyLgorICogU2hvcnQtZm9ybSBhZGRyZXNzaW5nLgorICovCit2b2lkCQkJCQkvKiBlcnJvciAqLworeGZzX2J0cmVlX3JlYWRhX2J1ZnMoCisJc3RydWN0IHhmc19tb3VudAkqbXAsCS8qIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50ICovCisJeGZzX2FnbnVtYmVyX3QJCWFnbm8sCS8qIGFsbG9jYXRpb24gZ3JvdXAgbnVtYmVyICovCisJeGZzX2FnYmxvY2tfdAkJYWdibm8sCS8qIGFsbG9jYXRpb24gZ3JvdXAgYmxvY2sgbnVtYmVyICovCisJeGZzX2V4dGxlbl90CQljb3VudCk7CS8qIGNvdW50IG9mIGZpbGVzeXN0ZW0gYmxvY2tzICovCisKKy8qCisgKiBSZWFkLWFoZWFkIGJ0cmVlIGJsb2NrcywgYXQgdGhlIGdpdmVuIGxldmVsLgorICogQml0cyBpbiBsciBhcmUgc2V0IGZyb20gWEZTX0JUQ1VSX3tMRUZULFJJR0hUfVJBLgorICovCitpbnQJCQkJCS8qIHJlYWRhaGVhZCBibG9jayBjb3VudCAqLworeGZzX2J0cmVlX3JlYWRhaGVhZF9jb3JlKAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkJbGV2LAkvKiBsZXZlbCBpbiBidHJlZSAqLworCWludAkJCWxyKTsJLyogbGVmdC9yaWdodCBiaXRzICovCisKK3N0YXRpYyBpbmxpbmUgaW50CQkJLyogcmVhZGFoZWFkIGJsb2NrIGNvdW50ICovCit4ZnNfYnRyZWVfcmVhZGFoZWFkKAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkJbGV2LAkvKiBsZXZlbCBpbiBidHJlZSAqLworCWludAkJCWxyKQkvKiBsZWZ0L3JpZ2h0IGJpdHMgKi8KK3sKKwlpZiAoKGN1ci0+YmNfcmFbbGV2XSB8IGxyKSA9PSBjdXItPmJjX3JhW2xldl0pCisJCXJldHVybiAwOworCisJcmV0dXJuIHhmc19idHJlZV9yZWFkYWhlYWRfY29yZShjdXIsIGxldiwgbHIpOworfQorCisKKy8qCisgKiBTZXQgdGhlIGJ1ZmZlciBmb3IgbGV2ZWwgImxldiIgaW4gdGhlIGN1cnNvciB0byBicCwgcmVsZWFzaW5nCisgKiBhbnkgcHJldmlvdXMgYnVmZmVyLgorICovCit2b2lkCit4ZnNfYnRyZWVfc2V0YnVmKAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkJbGV2LAkvKiBsZXZlbCBpbiBidHJlZSAqLworCXN0cnVjdCB4ZnNfYnVmCQkqYnApOwkvKiBuZXcgYnVmZmVyIHRvIHNldCAqLworCisjZW5kaWYJLyogX19LRVJORUxfXyAqLworCisKKy8qCisgKiBNaW4gYW5kIG1heCBmdW5jdGlvbnMgZm9yIGV4dGxlbiwgYWdibG9jaywgZmlsZW9mZiwgYW5kIGZpbGJsa3MgdHlwZXMuCisgKi8KKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0VYVExFTl9NSU4pCit4ZnNfZXh0bGVuX3QgeGZzX2V4dGxlbl9taW4oeGZzX2V4dGxlbl90IGEsIHhmc19leHRsZW5fdCBiKTsKKyNkZWZpbmUJWEZTX0VYVExFTl9NSU4oYSxiKQl4ZnNfZXh0bGVuX21pbihhLGIpCisjZWxzZQorI2RlZmluZQlYRlNfRVhUTEVOX01JTihhLGIpCVwKKwkoKHhmc19leHRsZW5fdCkoYSkgPCAoeGZzX2V4dGxlbl90KShiKSA/IFwKKwkgKHhmc19leHRsZW5fdCkoYSkgOiAoeGZzX2V4dGxlbl90KShiKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRVhUTEVOX01BWCkKK3hmc19leHRsZW5fdCB4ZnNfZXh0bGVuX21heCh4ZnNfZXh0bGVuX3QgYSwgeGZzX2V4dGxlbl90IGIpOworI2RlZmluZQlYRlNfRVhUTEVOX01BWChhLGIpCXhmc19leHRsZW5fbWF4KGEsYikKKyNlbHNlCisjZGVmaW5lCVhGU19FWFRMRU5fTUFYKGEsYikJXAorCSgoeGZzX2V4dGxlbl90KShhKSA+ICh4ZnNfZXh0bGVuX3QpKGIpID8gXAorCSAoeGZzX2V4dGxlbl90KShhKSA6ICh4ZnNfZXh0bGVuX3QpKGIpKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0FHQkxPQ0tfTUlOKQoreGZzX2FnYmxvY2tfdCB4ZnNfYWdibG9ja19taW4oeGZzX2FnYmxvY2tfdCBhLCB4ZnNfYWdibG9ja190IGIpOworI2RlZmluZQlYRlNfQUdCTE9DS19NSU4oYSxiKQl4ZnNfYWdibG9ja19taW4oYSxiKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0FHQkxPQ0tfTUlOKGEsYikJXAorCSgoeGZzX2FnYmxvY2tfdCkoYSkgPCAoeGZzX2FnYmxvY2tfdCkoYikgPyBcCisJICh4ZnNfYWdibG9ja190KShhKSA6ICh4ZnNfYWdibG9ja190KShiKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQUdCTE9DS19NQVgpCit4ZnNfYWdibG9ja190IHhmc19hZ2Jsb2NrX21heCh4ZnNfYWdibG9ja190IGEsIHhmc19hZ2Jsb2NrX3QgYik7CisjZGVmaW5lCVhGU19BR0JMT0NLX01BWChhLGIpCXhmc19hZ2Jsb2NrX21heChhLGIpCisjZWxzZQorI2RlZmluZQlYRlNfQUdCTE9DS19NQVgoYSxiKQlcCisJKCh4ZnNfYWdibG9ja190KShhKSA+ICh4ZnNfYWdibG9ja190KShiKSA/IFwKKwkgKHhmc19hZ2Jsb2NrX3QpKGEpIDogKHhmc19hZ2Jsb2NrX3QpKGIpKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0ZJTEVPRkZfTUlOKQoreGZzX2ZpbGVvZmZfdCB4ZnNfZmlsZW9mZl9taW4oeGZzX2ZpbGVvZmZfdCBhLCB4ZnNfZmlsZW9mZl90IGIpOworI2RlZmluZQlYRlNfRklMRU9GRl9NSU4oYSxiKQl4ZnNfZmlsZW9mZl9taW4oYSxiKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0ZJTEVPRkZfTUlOKGEsYikJXAorCSgoeGZzX2ZpbGVvZmZfdCkoYSkgPCAoeGZzX2ZpbGVvZmZfdCkoYikgPyBcCisJICh4ZnNfZmlsZW9mZl90KShhKSA6ICh4ZnNfZmlsZW9mZl90KShiKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRklMRU9GRl9NQVgpCit4ZnNfZmlsZW9mZl90IHhmc19maWxlb2ZmX21heCh4ZnNfZmlsZW9mZl90IGEsIHhmc19maWxlb2ZmX3QgYik7CisjZGVmaW5lCVhGU19GSUxFT0ZGX01BWChhLGIpCXhmc19maWxlb2ZmX21heChhLGIpCisjZWxzZQorI2RlZmluZQlYRlNfRklMRU9GRl9NQVgoYSxiKQlcCisJKCh4ZnNfZmlsZW9mZl90KShhKSA+ICh4ZnNfZmlsZW9mZl90KShiKSA/IFwKKwkgKHhmc19maWxlb2ZmX3QpKGEpIDogKHhmc19maWxlb2ZmX3QpKGIpKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0ZJTEJMS1NfTUlOKQoreGZzX2ZpbGJsa3NfdCB4ZnNfZmlsYmxrc19taW4oeGZzX2ZpbGJsa3NfdCBhLCB4ZnNfZmlsYmxrc190IGIpOworI2RlZmluZQlYRlNfRklMQkxLU19NSU4oYSxiKQl4ZnNfZmlsYmxrc19taW4oYSxiKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0ZJTEJMS1NfTUlOKGEsYikJXAorCSgoeGZzX2ZpbGJsa3NfdCkoYSkgPCAoeGZzX2ZpbGJsa3NfdCkoYikgPyBcCisJICh4ZnNfZmlsYmxrc190KShhKSA6ICh4ZnNfZmlsYmxrc190KShiKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRklMQkxLU19NQVgpCit4ZnNfZmlsYmxrc190IHhmc19maWxibGtzX21heCh4ZnNfZmlsYmxrc190IGEsIHhmc19maWxibGtzX3QgYik7CisjZGVmaW5lCVhGU19GSUxCTEtTX01BWChhLGIpCXhmc19maWxibGtzX21heChhLGIpCisjZWxzZQorI2RlZmluZQlYRlNfRklMQkxLU19NQVgoYSxiKQlcCisJKCh4ZnNfZmlsYmxrc190KShhKSA+ICh4ZnNfZmlsYmxrc190KShiKSA/IFwKKwkgKHhmc19maWxibGtzX3QpKGEpIDogKHhmc19maWxibGtzX3QpKGIpKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19GU0JfU0FOSVRZX0NIRUNLKQoraW50IHhmc19mc2Jfc2FuaXR5X2NoZWNrKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZnNibG9ja190IGZzYik7CisjZGVmaW5lCVhGU19GU0JfU0FOSVRZX0NIRUNLKG1wLGZzYikJeGZzX2ZzYl9zYW5pdHlfY2hlY2sobXAsZnNiKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0ZTQl9TQU5JVFlfQ0hFQ0sobXAsZnNiKQlcCisJKFhGU19GU0JfVE9fQUdOTyhtcCwgZnNiKSA8IG1wLT5tX3NiLnNiX2FnY291bnQgJiYgXAorCSBYRlNfRlNCX1RPX0FHQk5PKG1wLCBmc2IpIDwgbXAtPm1fc2Iuc2JfYWdibG9ja3MpCisjZW5kaWYKKworLyoKKyAqIE1hY3JvcyB0byBzZXQgRUZTQ09SUlVQVEVEICYgcmV0dXJuL2JyYW5jaC4KKyAqLworI2RlZmluZQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyh4LGwpCVwKKwl7IFwKKwkJaW50IGZzX2lzX29rID0gKHgpOyBcCisJCUFTU0VSVChmc19pc19vayk7IFwKKwkJaWYgKHVubGlrZWx5KCFmc19pc19vaykpIHsgXAorCQkJWEZTX0VSUk9SX1JFUE9SVCgiWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8iLCBcCisJCQkJCSBYRlNfRVJSTEVWRUxfTE9XLCBOVUxMKTsgXAorCQkJZXJyb3IgPSBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsgXAorCQkJZ290byBsOyBcCisJCX0gXAorCX0KKworI2RlZmluZQlYRlNfV0FOVF9DT1JSVVBURURfUkVUVVJOKHgpCVwKKwl7IFwKKwkJaW50IGZzX2lzX29rID0gKHgpOyBcCisJCUFTU0VSVChmc19pc19vayk7IFwKKwkJaWYgKHVubGlrZWx5KCFmc19pc19vaykpIHsgXAorCQkJWEZTX0VSUk9SX1JFUE9SVCgiWEZTX1dBTlRfQ09SUlVQVEVEX1JFVFVSTiIsIFwKKwkJCQkJIFhGU19FUlJMRVZFTF9MT1csIE5VTEwpOyBcCisJCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7IFwKKwkJfSBcCisJfQorCisjZW5kaWYJLyogX19YRlNfQlRSRUVfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2J1Zl9pdGVtLmMgYi9mcy94ZnMveGZzX2J1Zl9pdGVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFiMDAzOQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfYnVmX2l0ZW0uYwpAQCAtMCwwICsxLDEyMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKy8qCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB4ZnNfYnVmX2xvZ19pdGVtLgorICogSXQgY29udGFpbnMgdGhlIGl0ZW0gb3BlcmF0aW9ucyB1c2VkIHRvIG1hbmlwdWxhdGUgdGhlIGJ1ZiBsb2cKKyAqIGl0ZW1zIGFzIHdlbGwgYXMgdXRpbGl0eSByb3V0aW5lcyB1c2VkIGJ5IHRoZSBidWZmZXIgc3BlY2lmaWMKKyAqIHRyYW5zYWN0aW9uIHJvdXRpbmVzLgorICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKworI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfYnVmX2l0ZW0uaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX3RyYW5zX3ByaXYuaCIKKyNpbmNsdWRlICJ4ZnNfcncuaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisKKwora21lbV96b25lX3QJKnhmc19idWZfaXRlbV96b25lOworCisjaWZkZWYgWEZTX1RSQU5TX0RFQlVHCisvKgorICogVGhpcyBmdW5jdGlvbiB1c2VzIGFuIGFsdGVybmF0ZSBzdHJhdGVneSBmb3IgdHJhY2tpbmcgdGhlIGJ5dGVzCisgKiB0aGF0IHRoZSB1c2VyIHJlcXVlc3RzIHRvIGJlIGxvZ2dlZC4gIFRoaXMgY2FuIHRoZW4gYmUgdXNlZAorICogaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYmxpX29yaWcgYXJyYXkgaW4gdGhlIGJ1ZiBsb2cgaXRlbSB0bworICogY2F0Y2ggYnVncyBpbiBvdXIgY2FsbGVycycgY29kZS4KKyAqCisgKiBXZSBhbHNvIGRvdWJsZSBjaGVjayB0aGUgYml0cyBzZXQgaW4geGZzX2J1Zl9pdGVtX2xvZyB1c2luZyBhCisgKiBzaW1wbGUgYWxnb3JpdGhtIHRvIGNoZWNrIHRoYXQgZXZlcnkgYnl0ZSBpcyBhY2NvdW50ZWQgZm9yLgorICovCitTVEFUSUMgdm9pZAoreGZzX2J1Zl9pdGVtX2xvZ19kZWJ1ZygKKwl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcCwKKwl1aW50CQkJZmlyc3QsCisJdWludAkJCWxhc3QpCit7CisJdWludAl4OworCXVpbnQJYnl0ZTsKKwl1aW50CW5ieXRlczsKKwl1aW50CWNodW5rX251bTsKKwl1aW50CXdvcmRfbnVtOworCXVpbnQJYml0X251bTsKKwl1aW50CWJpdF9zZXQ7CisJdWludAkqd29yZHA7CisKKwlBU1NFUlQoYmlwLT5ibGlfbG9nZ2VkICE9IE5VTEwpOworCWJ5dGUgPSBmaXJzdDsKKwluYnl0ZXMgPSBsYXN0IC0gZmlyc3QgKyAxOworCWJmc2V0KGJpcC0+YmxpX2xvZ2dlZCwgZmlyc3QsIG5ieXRlcyk7CisJZm9yICh4ID0gMDsgeCA8IG5ieXRlczsgeCsrKSB7CisJCWNodW5rX251bSA9IGJ5dGUgPj4gWEZTX0JMSV9TSElGVDsKKwkJd29yZF9udW0gPSBjaHVua19udW0gPj4gQklUX1RPX1dPUkRfU0hJRlQ7CisJCWJpdF9udW0gPSBjaHVua19udW0gJiAoTkJXT1JEIC0gMSk7CisJCXdvcmRwID0gJihiaXAtPmJsaV9mb3JtYXQuYmxmX2RhdGFfbWFwW3dvcmRfbnVtXSk7CisJCWJpdF9zZXQgPSAqd29yZHAgJiAoMSA8PCBiaXRfbnVtKTsKKwkJQVNTRVJUKGJpdF9zZXQpOworCQlieXRlKys7CisJfQorfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSBmbHVzaCBzb21ldGhpbmcgaW50byBhIGJ1ZmZlciB3aXRob3V0CisgKiBsb2dnaW5nIGl0LiAgVGhpcyBoYXBwZW5zIGZvciB0aGluZ3MgbGlrZSBpbm9kZXMgd2hpY2ggYXJlIGxvZ2dlZAorICogc2VwYXJhdGVseSBmcm9tIHRoZSBidWZmZXIuCisgKi8KK3ZvaWQKK3hmc19idWZfaXRlbV9mbHVzaF9sb2dfZGVidWcoCisJeGZzX2J1Zl90CSpicCwKKwl1aW50CQlmaXJzdCwKKwl1aW50CQlsYXN0KQoreworCXhmc19idWZfbG9nX2l0ZW1fdAkqYmlwOworCXVpbnQJCQluYnl0ZXM7CisKKwliaXAgPSBYRlNfQlVGX0ZTUFJJVkFURShicCwgeGZzX2J1Zl9sb2dfaXRlbV90Kik7CisJaWYgKChiaXAgPT0gTlVMTCkgfHwgKGJpcC0+YmxpX2l0ZW0ubGlfdHlwZSAhPSBYRlNfTElfQlVGKSkgeworCQlyZXR1cm47CisJfQorCisJQVNTRVJUKGJpcC0+YmxpX2xvZ2dlZCAhPSBOVUxMKTsKKwluYnl0ZXMgPSBsYXN0IC0gZmlyc3QgKyAxOworCWJmc2V0KGJpcC0+YmxpX2xvZ2dlZCwgZmlyc3QsIG5ieXRlcyk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB0byB2ZXJpZnkgdGhhdCBvdXIgY2FsbGVyJ3MgaGF2ZSBsb2dnZWQKKyAqIGFsbCB0aGUgYnl0ZXMgdGhhdCB0aGV5IGNoYW5nZWQuCisgKgorICogSXQgZG9lcyB0aGlzIGJ5IGNvbXBhcmluZyB0aGUgb3JpZ2luYWwgY29weSBvZiB0aGUgYnVmZmVyIHN0b3JlZCBpbgorICogdGhlIGJ1ZiBsb2cgaXRlbSdzIGJsaV9vcmlnIGFycmF5IHRvIHRoZSBjdXJyZW50IGNvcHkgb2YgdGhlIGJ1ZmZlcgorICogYW5kIGVuc3VyaW5nIHRoYXQgYWxsIGJ5dGVzIHdoaWNoIG1pc2NvbXBhcmUgYXJlIHNldCBpbiB0aGUgYmxpX2xvZ2dlZAorICogYXJyYXkgb2YgdGhlIGJ1ZiBsb2cgaXRlbS4KKyAqLworU1RBVElDIHZvaWQKK3hmc19idWZfaXRlbV9sb2dfY2hlY2soCisJeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXApCit7CisJY2hhcgkJKm9yaWc7CisJY2hhcgkJKmJ1ZmZlcjsKKwlpbnQJCXg7CisJeGZzX2J1Zl90CSpicDsKKworCUFTU0VSVChiaXAtPmJsaV9vcmlnICE9IE5VTEwpOworCUFTU0VSVChiaXAtPmJsaV9sb2dnZWQgIT0gTlVMTCk7CisKKwlicCA9IGJpcC0+YmxpX2J1ZjsKKwlBU1NFUlQoWEZTX0JVRl9DT1VOVChicCkgPiAwKTsKKwlBU1NFUlQoWEZTX0JVRl9QVFIoYnApICE9IE5VTEwpOworCW9yaWcgPSBiaXAtPmJsaV9vcmlnOworCWJ1ZmZlciA9IFhGU19CVUZfUFRSKGJwKTsKKwlmb3IgKHggPSAwOyB4IDwgWEZTX0JVRl9DT1VOVChicCk7IHgrKykgeworCQlpZiAob3JpZ1t4XSAhPSBidWZmZXJbeF0gJiYgIWJ0c3QoYmlwLT5ibGlfbG9nZ2VkLCB4KSkKKwkJCWNtbl9lcnIoQ0VfUEFOSUMsCisJInhmc19idWZfaXRlbV9sb2dfY2hlY2sgYmlwICV4IGJ1ZmZlciAleCBvcmlnICV4IGluZGV4ICVkIiwKKwkJCQliaXAsIGJwLCBvcmlnLCB4KTsKKwl9Cit9CisjZWxzZQorI2RlZmluZQkJeGZzX2J1Zl9pdGVtX2xvZ19kZWJ1Zyh4LHkseikKKyNkZWZpbmUJCXhmc19idWZfaXRlbV9sb2dfY2hlY2soeCkKKyNlbmRpZgorCitTVEFUSUMgdm9pZAl4ZnNfYnVmX2Vycm9yX3JlbHNlKHhmc19idWZfdCAqYnApOworU1RBVElDIHZvaWQJeGZzX2J1Zl9kb19jYWxsYmFja3MoeGZzX2J1Zl90ICpicCwgeGZzX2xvZ19pdGVtX3QgKmxpcCk7CisKKy8qCisgKiBUaGlzIHJldHVybnMgdGhlIG51bWJlciBvZiBsb2cgaW92ZWNzIG5lZWRlZCB0byBsb2cgdGhlCisgKiBnaXZlbiBidWYgbG9nIGl0ZW0uCisgKgorICogSXQgY2FsY3VsYXRlcyB0aGlzIGFzIDEgaW92ZWMgZm9yIHRoZSBidWYgbG9nIGZvcm1hdCBzdHJ1Y3R1cmUKKyAqIGFuZCAxIGZvciBlYWNoIHN0cmV0Y2ggb2Ygbm9uLWNvbnRpZ3VvdXMgY2h1bmtzIHRvIGJlIGxvZ2dlZC4KKyAqIENvbnRpZ3VvdXMgY2h1bmtzIGFyZSBsb2dnZWQgaW4gYSBzaW5nbGUgaW92ZWMuCisgKgorICogSWYgdGhlIFhGU19CTElfU1RBTEUgZmxhZyBoYXMgYmVlbiBzZXQsIHRoZW4gbG9nIG5vdGhpbmcuCisgKi8KK3VpbnQKK3hmc19idWZfaXRlbV9zaXplKAorCXhmc19idWZfbG9nX2l0ZW1fdAkqYmlwKQoreworCXVpbnQJCW52ZWNzOworCWludAkJbmV4dF9iaXQ7CisJaW50CQlsYXN0X2JpdDsKKwl4ZnNfYnVmX3QJKmJwOworCisJQVNTRVJUKGF0b21pY19yZWFkKCZiaXAtPmJsaV9yZWZjb3VudCkgPiAwKTsKKwlpZiAoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX1NUQUxFKSB7CisJCS8qCisJCSAqIFRoZSBidWZmZXIgaXMgc3RhbGUsIHNvIGFsbCB3ZSBuZWVkIHRvIGxvZworCQkgKiBpcyB0aGUgYnVmIGxvZyBmb3JtYXQgc3RydWN0dXJlIHdpdGggdGhlCisJCSAqIGNhbmNlbCBmbGFnIGluIGl0LgorCQkgKi8KKwkJeGZzX2J1Zl9pdGVtX3RyYWNlKCJTSVpFIFNUQUxFIiwgYmlwKTsKKwkJQVNTRVJUKGJpcC0+YmxpX2Zvcm1hdC5ibGZfZmxhZ3MgJiBYRlNfQkxJX0NBTkNFTCk7CisJCXJldHVybiAxOworCX0KKworCWJwID0gYmlwLT5ibGlfYnVmOworCUFTU0VSVChiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfTE9HR0VEKTsKKwludmVjcyA9IDE7CisJbGFzdF9iaXQgPSB4ZnNfbmV4dF9iaXQoYmlwLT5ibGlfZm9ybWF0LmJsZl9kYXRhX21hcCwKKwkJCQkJIGJpcC0+YmxpX2Zvcm1hdC5ibGZfbWFwX3NpemUsIDApOworCUFTU0VSVChsYXN0X2JpdCAhPSAtMSk7CisJbnZlY3MrKzsKKwl3aGlsZSAobGFzdF9iaXQgIT0gLTEpIHsKKwkJLyoKKwkJICogVGhpcyB0YWtlcyB0aGUgYml0IG51bWJlciB0byBzdGFydCBsb29raW5nIGZyb20gYW5kCisJCSAqIHJldHVybnMgdGhlIG5leHQgc2V0IGJpdCBmcm9tIHRoZXJlLiAgSXQgcmV0dXJucyAtMQorCQkgKiBpZiB0aGVyZSBhcmUgbm8gbW9yZSBiaXRzIHNldCBvciB0aGUgc3RhcnQgYml0IGlzCisJCSAqIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBiaXRtYXAuCisJCSAqLworCQluZXh0X2JpdCA9IHhmc19uZXh0X2JpdChiaXAtPmJsaV9mb3JtYXQuYmxmX2RhdGFfbWFwLAorCQkJCQkJIGJpcC0+YmxpX2Zvcm1hdC5ibGZfbWFwX3NpemUsCisJCQkJCQkgbGFzdF9iaXQgKyAxKTsKKwkJLyoKKwkJICogSWYgd2UgcnVuIG91dCBvZiBiaXRzLCBsZWF2ZSB0aGUgbG9vcCwKKwkJICogZWxzZSBpZiB3ZSBmaW5kIGEgbmV3IHNldCBvZiBiaXRzIGJ1bXAgdGhlIG51bWJlciBvZiB2ZWNzLAorCQkgKiBlbHNlIGtlZXAgc2Nhbm5pbmcgdGhlIGN1cnJlbnQgc2V0IG9mIGJpdHMuCisJCSAqLworCQlpZiAobmV4dF9iaXQgPT0gLTEpIHsKKwkJCWxhc3RfYml0ID0gLTE7CisJCX0gZWxzZSBpZiAobmV4dF9iaXQgIT0gbGFzdF9iaXQgKyAxKSB7CisJCQlsYXN0X2JpdCA9IG5leHRfYml0OworCQkJbnZlY3MrKzsKKwkJfSBlbHNlIGlmICh4ZnNfYnVmX29mZnNldChicCwgbmV4dF9iaXQgKiBYRlNfQkxJX0NIVU5LKSAhPQorCQkJICAgKHhmc19idWZfb2Zmc2V0KGJwLCBsYXN0X2JpdCAqIFhGU19CTElfQ0hVTkspICsKKwkJCSAgICBYRlNfQkxJX0NIVU5LKSkgeworCQkJbGFzdF9iaXQgPSBuZXh0X2JpdDsKKwkJCW52ZWNzKys7CisJCX0gZWxzZSB7CisJCQlsYXN0X2JpdCsrOworCQl9CisJfQorCisJeGZzX2J1Zl9pdGVtX3RyYWNlKCJTSVpFIE5PUk0iLCBiaXApOworCXJldHVybiBudmVjczsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHRvIGZpbGwgaW4gdGhlIHZlY3RvciBvZiBsb2cgaW92ZWNzIGZvciB0aGUKKyAqIGdpdmVuIGxvZyBidWYgaXRlbS4gIEl0IGZpbGxzIHRoZSBmaXJzdCBlbnRyeSB3aXRoIGEgYnVmIGxvZworICogZm9ybWF0IHN0cnVjdHVyZSwgYW5kIHRoZSByZXN0IHBvaW50IHRvIGNvbnRpZ3VvdXMgY2h1bmtzCisgKiB3aXRoaW4gdGhlIGJ1ZmZlci4KKyAqLwordm9pZAoreGZzX2J1Zl9pdGVtX2Zvcm1hdCgKKwl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcCwKKwl4ZnNfbG9nX2lvdmVjX3QJCSpsb2dfdmVjdG9yKQoreworCXVpbnQJCWJhc2Vfc2l6ZTsKKwl1aW50CQludmVjczsKKwl4ZnNfbG9nX2lvdmVjX3QJKnZlY3A7CisJeGZzX2J1Zl90CSpicDsKKwlpbnQJCWZpcnN0X2JpdDsKKwlpbnQJCWxhc3RfYml0OworCWludAkJbmV4dF9iaXQ7CisJdWludAkJbmJpdHM7CisJdWludAkJYnVmZmVyX29mZnNldDsKKworCUFTU0VSVChhdG9taWNfcmVhZCgmYmlwLT5ibGlfcmVmY291bnQpID4gMCk7CisJQVNTRVJUKChiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfTE9HR0VEKSB8fAorCSAgICAgICAoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX1NUQUxFKSk7CisJYnAgPSBiaXAtPmJsaV9idWY7CisJQVNTRVJUKFhGU19CVUZfQlBfSVNNQVBQRUQoYnApKTsKKwl2ZWNwID0gbG9nX3ZlY3RvcjsKKworCS8qCisJICogVGhlIHNpemUgb2YgdGhlIGJhc2Ugc3RydWN0dXJlIGlzIHRoZSBzaXplIG9mIHRoZQorCSAqIGRlY2xhcmVkIHN0cnVjdHVyZSBwbHVzIHRoZSBzcGFjZSBmb3IgdGhlIGV4dHJhIHdvcmRzCisJICogb2YgdGhlIGJpdG1hcC4gIFdlIHN1YnRyYWN0IG9uZSBmcm9tIHRoZSBtYXAgc2l6ZSwgYmVjYXVzZQorCSAqIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBiaXRtYXAgaXMgYWNjb3VudGVkIGZvciBpbiB0aGUKKwkgKiBzaXplIG9mIHRoZSBiYXNlIHN0cnVjdHVyZS4KKwkgKi8KKwliYXNlX3NpemUgPQorCQkodWludCkoc2l6ZW9mKHhmc19idWZfbG9nX2Zvcm1hdF90KSArCisJCSAgICAgICAoKGJpcC0+YmxpX2Zvcm1hdC5ibGZfbWFwX3NpemUgLSAxKSAqIHNpemVvZih1aW50KSkpOworCXZlY3AtPmlfYWRkciA9ICh4ZnNfY2FkZHJfdCkmYmlwLT5ibGlfZm9ybWF0OworCXZlY3AtPmlfbGVuID0gYmFzZV9zaXplOworCXZlY3ArKzsKKwludmVjcyA9IDE7CisKKwlpZiAoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX1NUQUxFKSB7CisJCS8qCisJCSAqIFRoZSBidWZmZXIgaXMgc3RhbGUsIHNvIGFsbCB3ZSBuZWVkIHRvIGxvZworCQkgKiBpcyB0aGUgYnVmIGxvZyBmb3JtYXQgc3RydWN0dXJlIHdpdGggdGhlCisJCSAqIGNhbmNlbCBmbGFnIGluIGl0LgorCQkgKi8KKwkJeGZzX2J1Zl9pdGVtX3RyYWNlKCJGT1JNQVQgU1RBTEUiLCBiaXApOworCQlBU1NFUlQoYmlwLT5ibGlfZm9ybWF0LmJsZl9mbGFncyAmIFhGU19CTElfQ0FOQ0VMKTsKKwkJYmlwLT5ibGlfZm9ybWF0LmJsZl9zaXplID0gbnZlY3M7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIEZpbGwgaW4gYW4gaW92ZWMgZm9yIGVhY2ggc2V0IG9mIGNvbnRpZ3VvdXMgY2h1bmtzLgorCSAqLworCWZpcnN0X2JpdCA9IHhmc19uZXh0X2JpdChiaXAtPmJsaV9mb3JtYXQuYmxmX2RhdGFfbWFwLAorCQkJCQkgYmlwLT5ibGlfZm9ybWF0LmJsZl9tYXBfc2l6ZSwgMCk7CisJQVNTRVJUKGZpcnN0X2JpdCAhPSAtMSk7CisJbGFzdF9iaXQgPSBmaXJzdF9iaXQ7CisJbmJpdHMgPSAxOworCWZvciAoOzspIHsKKwkJLyoKKwkJICogVGhpcyB0YWtlcyB0aGUgYml0IG51bWJlciB0byBzdGFydCBsb29raW5nIGZyb20gYW5kCisJCSAqIHJldHVybnMgdGhlIG5leHQgc2V0IGJpdCBmcm9tIHRoZXJlLiAgSXQgcmV0dXJucyAtMQorCQkgKiBpZiB0aGVyZSBhcmUgbm8gbW9yZSBiaXRzIHNldCBvciB0aGUgc3RhcnQgYml0IGlzCisJCSAqIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBiaXRtYXAuCisJCSAqLworCQluZXh0X2JpdCA9IHhmc19uZXh0X2JpdChiaXAtPmJsaV9mb3JtYXQuYmxmX2RhdGFfbWFwLAorCQkJCQkJIGJpcC0+YmxpX2Zvcm1hdC5ibGZfbWFwX3NpemUsCisJCQkJCQkgKHVpbnQpbGFzdF9iaXQgKyAxKTsKKwkJLyoKKwkJICogSWYgd2UgcnVuIG91dCBvZiBiaXRzIGZpbGwgaW4gdGhlIGxhc3QgaW92ZWMgYW5kIGdldAorCQkgKiBvdXQgb2YgdGhlIGxvb3AuCisJCSAqIEVsc2UgaWYgd2Ugc3RhcnQgYSBuZXcgc2V0IG9mIGJpdHMgdGhlbiBmaWxsIGluIHRoZQorCQkgKiBpb3ZlYyBmb3IgdGhlIHNlcmllcyB3ZSB3ZXJlIGxvb2tpbmcgYXQgYW5kIHN0YXJ0CisJCSAqIGNvdW50aW5nIHRoZSBiaXRzIGluIHRoZSBuZXcgb25lLgorCQkgKiBFbHNlIHdlJ3JlIHN0aWxsIGluIHRoZSBzYW1lIHNldCBvZiBiaXRzIHNvIGp1c3QKKwkJICoga2VlcCBjb3VudGluZyBhbmQgc2Nhbm5pbmcuCisJCSAqLworCQlpZiAobmV4dF9iaXQgPT0gLTEpIHsKKwkJCWJ1ZmZlcl9vZmZzZXQgPSBmaXJzdF9iaXQgKiBYRlNfQkxJX0NIVU5LOworCQkJdmVjcC0+aV9hZGRyID0geGZzX2J1Zl9vZmZzZXQoYnAsIGJ1ZmZlcl9vZmZzZXQpOworCQkJdmVjcC0+aV9sZW4gPSBuYml0cyAqIFhGU19CTElfQ0hVTks7CisJCQludmVjcysrOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAobmV4dF9iaXQgIT0gbGFzdF9iaXQgKyAxKSB7CisJCQlidWZmZXJfb2Zmc2V0ID0gZmlyc3RfYml0ICogWEZTX0JMSV9DSFVOSzsKKwkJCXZlY3AtPmlfYWRkciA9IHhmc19idWZfb2Zmc2V0KGJwLCBidWZmZXJfb2Zmc2V0KTsKKwkJCXZlY3AtPmlfbGVuID0gbmJpdHMgKiBYRlNfQkxJX0NIVU5LOworCQkJbnZlY3MrKzsKKwkJCXZlY3ArKzsKKwkJCWZpcnN0X2JpdCA9IG5leHRfYml0OworCQkJbGFzdF9iaXQgPSBuZXh0X2JpdDsKKwkJCW5iaXRzID0gMTsKKwkJfSBlbHNlIGlmICh4ZnNfYnVmX29mZnNldChicCwgbmV4dF9iaXQgPDwgWEZTX0JMSV9TSElGVCkgIT0KKwkJCSAgICh4ZnNfYnVmX29mZnNldChicCwgbGFzdF9iaXQgPDwgWEZTX0JMSV9TSElGVCkgKworCQkJICAgIFhGU19CTElfQ0hVTkspKSB7CisJCQlidWZmZXJfb2Zmc2V0ID0gZmlyc3RfYml0ICogWEZTX0JMSV9DSFVOSzsKKwkJCXZlY3AtPmlfYWRkciA9IHhmc19idWZfb2Zmc2V0KGJwLCBidWZmZXJfb2Zmc2V0KTsKKwkJCXZlY3AtPmlfbGVuID0gbmJpdHMgKiBYRlNfQkxJX0NIVU5LOworLyogWW91IHdvdWxkIHRoaW5rIHdlIG5lZWQgdG8gYnVtcCB0aGUgbnZlY3MgaGVyZSB0b28sIGJ1dCB3ZSBkbyBub3QKKyAqIHRoaXMgbnVtYmVyIGlzIHVzZWQgYnkgcmVjb3ZlcnksIGFuZCBpdCBnZXRzIGNvbmZ1c2VkIGJ5IHRoZSBib3VuZGFyeQorICogc3BsaXQgaGVyZQorICoJCQludmVjcysrOworICovCisJCQl2ZWNwKys7CisJCQlmaXJzdF9iaXQgPSBuZXh0X2JpdDsKKwkJCWxhc3RfYml0ID0gbmV4dF9iaXQ7CisJCQluYml0cyA9IDE7CisJCX0gZWxzZSB7CisJCQlsYXN0X2JpdCsrOworCQkJbmJpdHMrKzsKKwkJfQorCX0KKwliaXAtPmJsaV9mb3JtYXQuYmxmX3NpemUgPSBudmVjczsKKworCS8qCisJICogQ2hlY2sgdG8gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaXMgY29uc2lzdGVudC4KKwkgKi8KKwl4ZnNfYnVmX2l0ZW1fdHJhY2UoIkZPUk1BVCBOT1JNIiwgYmlwKTsKKwl4ZnNfYnVmX2l0ZW1fbG9nX2NoZWNrKGJpcCk7Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB0byBwaW4gdGhlIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggdGhlIGJ1ZiBsb2cKKyAqIGl0ZW0gaW4gbWVtb3J5IHNvIGl0IGNhbm5vdCBiZSB3cml0dGVuIG91dC4gIFNpbXBseSBjYWxsIGJwaW4oKQorICogb24gdGhlIGJ1ZmZlciB0byBkbyB0aGlzLgorICovCit2b2lkCit4ZnNfYnVmX2l0ZW1fcGluKAorCXhmc19idWZfbG9nX2l0ZW1fdAkqYmlwKQoreworCXhmc19idWZfdAkqYnA7CisKKwlicCA9IGJpcC0+YmxpX2J1ZjsKKwlBU1NFUlQoWEZTX0JVRl9JU0JVU1koYnApKTsKKwlBU1NFUlQoYXRvbWljX3JlYWQoJmJpcC0+YmxpX3JlZmNvdW50KSA+IDApOworCUFTU0VSVCgoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX0xPR0dFRCkgfHwKKwkgICAgICAgKGJpcC0+YmxpX2ZsYWdzICYgWEZTX0JMSV9TVEFMRSkpOworCXhmc19idWZfaXRlbV90cmFjZSgiUElOIiwgYmlwKTsKKwl4ZnNfYnVmdHJhY2UoIlhGU19QSU4iLCBicCk7CisJeGZzX2JwaW4oYnApOworfQorCisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB0byB1bnBpbiB0aGUgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgYnVmIGxvZworICogaXRlbSB3aGljaCB3YXMgcHJldmlvdXNseSBwaW5uZWQgd2l0aCBhIGNhbGwgdG8geGZzX2J1Zl9pdGVtX3BpbigpLgorICogSnVzdCBjYWxsIGJ1bnBpbigpIG9uIHRoZSBidWZmZXIgdG8gZG8gdGhpcy4KKyAqCisgKiBBbHNvIGRyb3AgdGhlIHJlZmVyZW5jZSB0byB0aGUgYnVmIGl0ZW0gZm9yIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLgorICogSWYgdGhlIFhGU19CTElfU1RBTEUgZmxhZyBpcyBzZXQgYW5kIHdlIGFyZSB0aGUgbGFzdCByZWZlcmVuY2UsCisgKiB0aGVuIGZyZWUgdXAgdGhlIGJ1ZiBsb2cgaXRlbSBhbmQgdW5sb2NrIHRoZSBidWZmZXIuCisgKi8KK3ZvaWQKK3hmc19idWZfaXRlbV91bnBpbigKKwl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcCwKKwlpbnQJCQlzdGFsZSkKK3sKKwl4ZnNfbW91bnRfdAkqbXA7CisJeGZzX2J1Zl90CSpicDsKKwlpbnQJCWZyZWVkOworCVNQTERFQ0wocyk7CisKKwlicCA9IGJpcC0+YmxpX2J1ZjsKKwlBU1NFUlQoYnAgIT0gTlVMTCk7CisJQVNTRVJUKFhGU19CVUZfRlNQUklWQVRFKGJwLCB4ZnNfYnVmX2xvZ19pdGVtX3QgKikgPT0gYmlwKTsKKwlBU1NFUlQoYXRvbWljX3JlYWQoJmJpcC0+YmxpX3JlZmNvdW50KSA+IDApOworCXhmc19idWZfaXRlbV90cmFjZSgiVU5QSU4iLCBiaXApOworCXhmc19idWZ0cmFjZSgiWEZTX1VOUElOIiwgYnApOworCisJZnJlZWQgPSBhdG9taWNfZGVjX2FuZF90ZXN0KCZiaXAtPmJsaV9yZWZjb3VudCk7CisJbXAgPSBiaXAtPmJsaV9pdGVtLmxpX21vdW50cDsKKwl4ZnNfYnVucGluKGJwKTsKKwlpZiAoZnJlZWQgJiYgc3RhbGUpIHsKKwkJQVNTRVJUKGJpcC0+YmxpX2ZsYWdzICYgWEZTX0JMSV9TVEFMRSk7CisJCUFTU0VSVChYRlNfQlVGX1ZBTFVTRU1BKGJwKSA8PSAwKTsKKwkJQVNTRVJUKCEoWEZTX0JVRl9JU0RFTEFZV1JJVEUoYnApKSk7CisJCUFTU0VSVChYRlNfQlVGX0lTU1RBTEUoYnApKTsKKwkJQVNTRVJUKGJpcC0+YmxpX2Zvcm1hdC5ibGZfZmxhZ3MgJiBYRlNfQkxJX0NBTkNFTCk7CisJCXhmc19idWZfaXRlbV90cmFjZSgiVU5QSU4gU1RBTEUiLCBiaXApOworCQl4ZnNfYnVmdHJhY2UoIlhGU19VTlBJTiBTVEFMRSIsIGJwKTsKKwkJLyoKKwkJICogSWYgd2UgZ2V0IGNhbGxlZCBoZXJlIGJlY2F1c2Ugb2YgYW4gSU8gZXJyb3IsIHdlIG1heQorCQkgKiBvciBtYXkgbm90IGhhdmUgdGhlIGl0ZW0gb24gdGhlIEFJTC4geGZzX3RyYW5zX2RlbGV0ZV9haWwoKQorCQkgKiB3aWxsIHRha2UgY2FyZSBvZiB0aGF0IHNpdHVhdGlvbi4KKwkJICogeGZzX3RyYW5zX2RlbGV0ZV9haWwoKSBkcm9wcyB0aGUgQUlMIGxvY2suCisJCSAqLworCQlpZiAoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX1NUQUxFX0lOT0RFKSB7CisJCQl4ZnNfYnVmX2RvX2NhbGxiYWNrcyhicCwgKHhmc19sb2dfaXRlbV90ICopYmlwKTsKKwkJCVhGU19CVUZfU0VUX0ZTUFJJVkFURShicCwgTlVMTCk7CisJCQlYRlNfQlVGX0NMUl9JT0RPTkVfRlVOQyhicCk7CisJCX0gZWxzZSB7CisJCQlBSUxfTE9DSyhtcCxzKTsKKwkJCXhmc190cmFuc19kZWxldGVfYWlsKG1wLCAoeGZzX2xvZ19pdGVtX3QgKiliaXAsIHMpOworCQkJeGZzX2J1Zl9pdGVtX3JlbHNlKGJwKTsKKwkJCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURShicCwgdm9pZCAqKSA9PSBOVUxMKTsKKwkJfQorCQl4ZnNfYnVmX3JlbHNlKGJwKTsKKwl9Cit9CisKKy8qCisgKiB0aGlzIGlzIGNhbGxlZCBmcm9tIHVuY29tbWl0IGluIHRoZSBmb3JjZWQtc2h1dGRvd24gcGF0aC4KKyAqIHdlIG5lZWQgdG8gY2hlY2sgdG8gc2VlIGlmIHRoZSByZWZlcmVuY2UgY291bnQgb24gdGhlIGxvZyBpdGVtCisgKiBpcyBnb2luZyB0byBkcm9wIHRvIHplcm8uICBJZiBzbywgdW5waW4gd2lsbCBmcmVlIHRoZSBsb2cgaXRlbQorICogc28gd2UgbmVlZCB0byBmcmVlIHRoZSBpdGVtJ3MgZGVzY3JpcHRvciAodGhhdCBwb2ludHMgdG8gdGhlIGl0ZW0pCisgKiBpbiB0aGUgdHJhbnNhY3Rpb24uCisgKi8KK3ZvaWQKK3hmc19idWZfaXRlbV91bnBpbl9yZW1vdmUoCisJeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXAsCisJeGZzX3RyYW5zX3QJCSp0cCkKK3sKKwl4ZnNfYnVmX3QJCSpicDsKKwl4ZnNfbG9nX2l0ZW1fZGVzY190CSpsaWRwOworCWludAkJCXN0YWxlID0gMDsKKworCWJwID0gYmlwLT5ibGlfYnVmOworCS8qCisJICogd2lsbCB4ZnNfYnVmX2l0ZW1fdW5waW4oKSBjYWxsIHhmc19idWZfaXRlbV9yZWxzZSgpPworCSAqLworCWlmICgoYXRvbWljX3JlYWQoJmJpcC0+YmxpX3JlZmNvdW50KSA9PSAxKSAmJgorCSAgICAoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX1NUQUxFKSkgeworCQlBU1NFUlQoWEZTX0JVRl9WQUxVU0VNQShiaXAtPmJsaV9idWYpIDw9IDApOworCQl4ZnNfYnVmX2l0ZW1fdHJhY2UoIlVOUElOIFJFTU9WRSIsIGJpcCk7CisJCXhmc19idWZ0cmFjZSgiWEZTX1VOUElOX1JFTU9WRSIsIGJwKTsKKwkJLyoKKwkJICogeWVzIC0tIGNsZWFyIHRoZSB4YWN0aW9uIGRlc2NyaXB0b3IgaW4tdXNlIGZsYWcKKwkJICogYW5kIGZyZWUgdGhlIGNodW5rIGlmIHJlcXVpcmVkLiAgV2UgY2FuIHNhZmVseQorCQkgKiBkbyBzb21lIHdvcmsgaGVyZSBhbmQgdGhlbiBjYWxsIGJ1Zl9pdGVtX3VucGluCisJCSAqIHRvIGRvIHRoZSByZXN0IGJlY2F1c2UgaWYgdGhlIGlmIGlzIHRydWUsIHRoZW4KKwkJICogd2UgYXJlIGhvbGRpbmcgdGhlIGJ1ZmZlciBsb2NrZWQgc28gbm8gb25lIGVsc2UKKwkJICogd2lsbCBiZSBhYmxlIHRvIGJ1bXAgdXAgdGhlIHJlZmNvdW50LgorCQkgKi8KKwkJbGlkcCA9IHhmc190cmFuc19maW5kX2l0ZW0odHAsICh4ZnNfbG9nX2l0ZW1fdCAqKSBiaXApOworCQlzdGFsZSA9IGxpZHAtPmxpZF9mbGFncyAmIFhGU19MSURfQlVGX1NUQUxFOworCQl4ZnNfdHJhbnNfZnJlZV9pdGVtKHRwLCBsaWRwKTsKKwkJLyoKKwkJICogU2luY2UgdGhlIHRyYW5zYWN0aW9uIG5vIGxvbmdlciByZWZlcnMgdG8gdGhlIGJ1ZmZlciwKKwkJICogdGhlIGJ1ZmZlciBzaG91bGQgbm8gbG9uZ2VyIHJlZmVyIHRvIHRoZSB0cmFuc2FjdGlvbi4KKwkJICovCisJCVhGU19CVUZfU0VUX0ZTUFJJVkFURTIoYnAsIE5VTEwpOworCX0KKworCXhmc19idWZfaXRlbV91bnBpbihiaXAsIHN0YWxlKTsKKworCXJldHVybjsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHRvIGF0dGVtcHQgdG8gbG9jayB0aGUgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgKiBidWYgbG9nIGl0ZW0uICBEb24ndCBzbGVlcCBvbiB0aGUgYnVmZmVyIGxvY2suICBJZiB3ZSBjYW4ndCBnZXQKKyAqIHRoZSBsb2NrIHJpZ2h0IGF3YXksIHJldHVybiAwLiAgSWYgd2UgY2FuIGdldCB0aGUgbG9jaywgcHVsbCB0aGUKKyAqIGJ1ZmZlciBmcm9tIHRoZSBmcmVlIGxpc3QsIG1hcmsgaXQgYnVzeSwgYW5kIHJldHVybiAxLgorICovCit1aW50Cit4ZnNfYnVmX2l0ZW1fdHJ5bG9jaygKKwl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcCkKK3sKKwl4ZnNfYnVmX3QJKmJwOworCisJYnAgPSBiaXAtPmJsaV9idWY7CisKKwlpZiAoWEZTX0JVRl9JU1BJTk5FRChicCkpIHsKKwkJcmV0dXJuIFhGU19JVEVNX1BJTk5FRDsKKwl9CisKKwlpZiAoIVhGU19CVUZfQ1BTRU1BKGJwKSkgeworCQlyZXR1cm4gWEZTX0lURU1fTE9DS0VEOworCX0KKworCS8qCisJICogUmVtb3ZlIHRoZSBidWZmZXIgZnJvbSB0aGUgZnJlZSBsaXN0LiAgT25seSBkbyB0aGlzCisJICogaWYgaXQncyBvbiB0aGUgZnJlZSBsaXN0LiAgUHJpdmF0ZSBidWZmZXJzIGxpa2UgdGhlCisJICogc3VwZXJibG9jayBidWZmZXIgYXJlIG5vdC4KKwkgKi8KKwlYRlNfQlVGX0hPTEQoYnApOworCisJQVNTRVJUKCEoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX1NUQUxFKSk7CisJeGZzX2J1Zl9pdGVtX3RyYWNlKCJUUllMT0NLIFNVQ0NFU1MiLCBiaXApOworCXJldHVybiBYRlNfSVRFTV9TVUNDRVNTOworfQorCisvKgorICogUmVsZWFzZSB0aGUgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgYnVmIGxvZyBpdGVtLgorICogSWYgdGhlcmUgaXMgbm8gZGlydHkgbG9nZ2VkIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZQorICogYnVmZmVyIHJlY29yZGVkIGluIHRoZSBidWYgbG9nIGl0ZW0sIHRoZW4gZnJlZSB0aGUKKyAqIGJ1ZiBsb2cgaXRlbSBhbmQgcmVtb3ZlIHRoZSByZWZlcmVuY2UgdG8gaXQgaW4gdGhlCisgKiBidWZmZXIuCisgKgorICogVGhpcyBjYWxsIGlnbm9yZXMgdGhlIHJlY3Vyc2lvbiBjb3VudC4gIEl0IGlzIG9ubHkgY2FsbGVkCisgKiB3aGVuIHRoZSBidWZmZXIgc2hvdWxkIFJFQUxMWSBiZSB1bmxvY2tlZCwgcmVnYXJkbGVzcworICogb2YgdGhlIHJlY3Vyc2lvbiBjb3VudC4KKyAqCisgKiBJZiB0aGUgWEZTX0JMSV9IT0xEIGZsYWcgaXMgc2V0IGluIHRoZSBidWYgbG9nIGl0ZW0sIHRoZW4KKyAqIGZyZWUgdGhlIGxvZyBpdGVtIGlmIG5lY2Vzc2FyeSBidXQgZG8gbm90IHVubG9jayB0aGUgYnVmZmVyLgorICogVGhpcyBpcyBmb3Igc3VwcG9ydCBvZiB4ZnNfdHJhbnNfYmhvbGQoKS4gTWFrZSBzdXJlIHRoZQorICogWEZTX0JMSV9IT0xEIGZpZWxkIGlzIGNsZWFyZWQgaWYgd2UgZG9uJ3QgZnJlZSB0aGUgaXRlbS4KKyAqLwordm9pZAoreGZzX2J1Zl9pdGVtX3VubG9jaygKKwl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcCkKK3sKKwlpbnQJCWFib3J0ZWQ7CisJeGZzX2J1Zl90CSpicDsKKwl1aW50CQlob2xkOworCisJYnAgPSBiaXAtPmJsaV9idWY7CisJeGZzX2J1ZnRyYWNlKCJYRlNfVU5MT0NLIiwgYnApOworCisJLyoKKwkgKiBDbGVhciB0aGUgYnVmZmVyJ3MgYXNzb2NpYXRpb24gd2l0aCB0aGlzIHRyYW5zYWN0aW9uLgorCSAqLworCVhGU19CVUZfU0VUX0ZTUFJJVkFURTIoYnAsIE5VTEwpOworCisJLyoKKwkgKiBJZiB0aGlzIGlzIGEgdHJhbnNhY3Rpb24gYWJvcnQsIGRvbid0IHJldHVybiBlYXJseS4KKwkgKiBJbnN0ZWFkLCBhbGxvdyB0aGUgYnJlbHNlIHRvIGhhcHBlbi4KKwkgKiBOb3JtYWxseSBpdCB3b3VsZCBiZSBkb25lIGZvciBzdGFsZSAoY2FuY2VsbGVkKSBidWZmZXJzCisJICogYXQgdW5waW4gdGltZSwgYnV0IHdlJ2xsIG5ldmVyIGdvIHRocm91Z2ggdGhlIHBpbi91bnBpbgorCSAqIGN5Y2xlIGlmIHdlIGFib3J0IGluc2lkZSBjb21taXQuCisJICovCisJYWJvcnRlZCA9IChiaXAtPmJsaV9pdGVtLmxpX2ZsYWdzICYgWEZTX0xJX0FCT1JURUQpICE9IDA7CisKKwkvKgorCSAqIElmIHRoZSBidWYgaXRlbSBpcyBtYXJrZWQgc3RhbGUsIHRoZW4gZG9uJ3QgZG8gYW55dGhpbmcuCisJICogV2UnbGwgdW5sb2NrIHRoZSBidWZmZXIgYW5kIGZyZWUgdGhlIGJ1ZiBpdGVtIHdoZW4gdGhlCisJICogYnVmZmVyIGlzIHVucGlubmVkIGZvciB0aGUgbGFzdCB0aW1lLgorCSAqLworCWlmIChiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfU1RBTEUpIHsKKwkJYmlwLT5ibGlfZmxhZ3MgJj0gflhGU19CTElfTE9HR0VEOworCQl4ZnNfYnVmX2l0ZW1fdHJhY2UoIlVOTE9DSyBTVEFMRSIsIGJpcCk7CisJCUFTU0VSVChiaXAtPmJsaV9mb3JtYXQuYmxmX2ZsYWdzICYgWEZTX0JMSV9DQU5DRUwpOworCQlpZiAoIWFib3J0ZWQpCisJCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBEcm9wIHRoZSB0cmFuc2FjdGlvbidzIHJlZmVyZW5jZSB0byB0aGUgbG9nIGl0ZW0gaWYKKwkgKiBpdCB3YXMgbm90IGxvZ2dlZCBhcyBwYXJ0IG9mIHRoZSB0cmFuc2FjdGlvbi4gIE90aGVyd2lzZQorCSAqIHdlJ2xsIGRyb3AgdGhlIHJlZmVyZW5jZSBpbiB4ZnNfYnVmX2l0ZW1fdW5waW4oKSB3aGVuCisJICogdGhlIHRyYW5zYWN0aW9uIGlzIHJlYWxseSB0aHJvdWdoIHdpdGggdGhlIGJ1ZmZlci4KKwkgKi8KKwlpZiAoIShiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfTE9HR0VEKSkgeworCQlhdG9taWNfZGVjKCZiaXAtPmJsaV9yZWZjb3VudCk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogQ2xlYXIgdGhlIGxvZ2dlZCBmbGFnIHNpbmNlIHRoaXMgaXMgcGVyCisJCSAqIHRyYW5zYWN0aW9uIHN0YXRlLgorCQkgKi8KKwkJYmlwLT5ibGlfZmxhZ3MgJj0gflhGU19CTElfTE9HR0VEOworCX0KKworCS8qCisJICogQmVmb3JlIHBvc3NpYmx5IGZyZWVpbmcgdGhlIGJ1ZiBpdGVtLCBkZXRlcm1pbmUgaWYgd2Ugc2hvdWxkCisJICogcmVsZWFzZSB0aGUgYnVmZmVyIGF0IHRoZSBlbmQgb2YgdGhpcyByb3V0aW5lLgorCSAqLworCWhvbGQgPSBiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfSE9MRDsKKwl4ZnNfYnVmX2l0ZW1fdHJhY2UoIlVOTE9DSyIsIGJpcCk7CisKKwkvKgorCSAqIElmIHRoZSBidWYgaXRlbSBpc24ndCB0cmFja2luZyBhbnkgZGF0YSwgZnJlZSBpdC4KKwkgKiBPdGhlcndpc2UsIGlmIFhGU19CTElfSE9MRCBpcyBzZXQgY2xlYXIgaXQuCisJICovCisJaWYgKHhmc19jb3VudF9iaXRzKGJpcC0+YmxpX2Zvcm1hdC5ibGZfZGF0YV9tYXAsCisJCQkgICAgICBiaXAtPmJsaV9mb3JtYXQuYmxmX21hcF9zaXplLCAwKSA9PSAwKSB7CisJCXhmc19idWZfaXRlbV9yZWxzZShicCk7CisJfSBlbHNlIGlmIChob2xkKSB7CisJCWJpcC0+YmxpX2ZsYWdzICY9IH5YRlNfQkxJX0hPTEQ7CisJfQorCisJLyoKKwkgKiBSZWxlYXNlIHRoZSBidWZmZXIgaWYgWEZTX0JMSV9IT0xEIHdhcyBub3Qgc2V0LgorCSAqLworCWlmICghaG9sZCkgeworCQl4ZnNfYnVmX3JlbHNlKGJwKTsKKwl9Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB0byBmaW5kIG91dCB3aGVyZSB0aGUgb2xkZXN0IGFjdGl2ZSBjb3B5IG9mIHRoZQorICogYnVmIGxvZyBpdGVtIGluIHRoZSBvbiBkaXNrIGxvZyByZXNpZGVzIG5vdyB0aGF0IHRoZSBsYXN0IGxvZworICogd3JpdGUgb2YgaXQgY29tcGxldGVkIGF0IHRoZSBnaXZlbiBsc24uCisgKiBXZSBhbHdheXMgcmUtbG9nIGFsbCB0aGUgZGlydHkgZGF0YSBpbiBhIGJ1ZmZlciwgc28gdXN1YWxseSB0aGUKKyAqIGxhdGVzdCBjb3B5IGluIHRoZSBvbiBkaXNrIGxvZyBpcyB0aGUgb25seSBvbmUgdGhhdCBtYXR0ZXJzLiAgRm9yCisgKiB0aG9zZSBjYXNlcyB3ZSBzaW1wbHkgcmV0dXJuIHRoZSBnaXZlbiBsc24uCisgKgorICogVGhlIG9uZSBleGNlcHRpb24gdG8gdGhpcyBpcyBmb3IgYnVmZmVycyBmdWxsIG9mIG5ld2x5IGFsbG9jYXRlZAorICogaW5vZGVzLiAgVGhlc2UgYnVmZmVycyBhcmUgb25seSByZWxvZ2dlZCB3aXRoIHRoZSBYRlNfQkxJX0lOT0RFX0JVRgorICogZmxhZyBzZXQsIGluZGljYXRpbmcgdGhhdCBvbmx5IHRoZSBkaV9uZXh0X3VubGlua2VkIGZpZWxkcyBmcm9tIHRoZQorICogaW5vZGVzIGluIHRoZSBidWZmZXJzIHdpbGwgYmUgcmVwbGF5ZWQgZHVyaW5nIHJlY292ZXJ5LiAgSWYgdGhlCisgKiBvcmlnaW5hbCBuZXdseSBhbGxvY2F0ZWQgaW5vZGUgaW1hZ2VzIGhhdmUgbm90IHlldCBiZWVuIGZsdXNoZWQKKyAqIHdoZW4gdGhlIGJ1ZmZlciBpcyBzbyByZWxvZ2dlZCwgdGhlbiB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHdlCisgKiBrZWVwIHRoZSBvbGQgaW1hZ2VzIGluIHRoZSAnYWN0aXZlJyBwb3J0aW9uIG9mIHRoZSBsb2cuICBXZSBkbyB0aGlzCisgKiBieSByZXR1cm5pbmcgdGhlIG9yaWdpbmFsIGxzbiBvZiB0aGF0IHRyYW5zYWN0aW9uIGhlcmUgcmF0aGVyIHRoYW4KKyAqIHRoZSBjdXJyZW50IG9uZS4KKyAqLworeGZzX2xzbl90Cit4ZnNfYnVmX2l0ZW1fY29tbWl0dGVkKAorCXhmc19idWZfbG9nX2l0ZW1fdAkqYmlwLAorCXhmc19sc25fdAkJbHNuKQoreworCXhmc19idWZfaXRlbV90cmFjZSgiQ09NTUlUVEVEIiwgYmlwKTsKKwlpZiAoKGJpcC0+YmxpX2ZsYWdzICYgWEZTX0JMSV9JTk9ERV9BTExPQ19CVUYpICYmCisJICAgIChiaXAtPmJsaV9pdGVtLmxpX2xzbiAhPSAwKSkgeworCQlyZXR1cm4gYmlwLT5ibGlfaXRlbS5saV9sc247CisJfQorCXJldHVybiAobHNuKTsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGhvbGRpbmcgdGhlIGJ1ZmZlciBpcyBhYm9ydGVkLgorICogSnVzdCBiZWhhdmUgYXMgaWYgdGhlIHRyYW5zYWN0aW9uIGhhZCBiZWVuIGNhbmNlbGxlZC4gSWYgd2UncmUgc2h1dHRpbmcgZG93bgorICogYW5kIGhhdmUgYWJvcnRlZCB0aGlzIHRyYW5zYWN0aW9uLCB3ZSdsbCB0cmFwIHRoaXMgYnVmZmVyIHdoZW4gaXQgdHJpZXMgdG8KKyAqIGdldCB3cml0dGVuIG91dC4KKyAqLwordm9pZAoreGZzX2J1Zl9pdGVtX2Fib3J0KAorCXhmc19idWZfbG9nX2l0ZW1fdAkqYmlwKQoreworCXhmc19idWZfdAkqYnA7CisKKwlicCA9IGJpcC0+YmxpX2J1ZjsKKwl4ZnNfYnVmdHJhY2UoIlhGU19BQk9SVCIsIGJwKTsKKwlYRlNfQlVGX1NVUEVSX1NUQUxFKGJwKTsKKwl4ZnNfYnVmX2l0ZW1fdW5sb2NrKGJpcCk7CisJcmV0dXJuOworfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgdG8gYXN5bmNocm9ub3VzbHkgd3JpdGUgdGhlIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggdGhpcworICogYnVmIGxvZyBpdGVtIG91dCB0byBkaXNrLiBUaGUgYnVmZmVyIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gbG9ja2VkIGJ5CisgKiBhIHN1Y2Nlc3NmdWwgY2FsbCB0byB4ZnNfYnVmX2l0ZW1fdHJ5bG9jaygpLiAgSWYgdGhlIGJ1ZmZlciBzdGlsbCBoYXMKKyAqIEJfREVMV1JJIHNldCwgdGhlbiBnZXQgaXQgZ29pbmcgb3V0IHRvIGRpc2sgd2l0aCBhIGNhbGwgdG8gYmF3cml0ZSgpLgorICogSWYgbm90LCB0aGVuIGp1c3QgcmVsZWFzZSB0aGUgYnVmZmVyLgorICovCit2b2lkCit4ZnNfYnVmX2l0ZW1fcHVzaCgKKwl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcCkKK3sKKwl4ZnNfYnVmX3QJKmJwOworCisJQVNTRVJUKCEoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX1NUQUxFKSk7CisJeGZzX2J1Zl9pdGVtX3RyYWNlKCJQVVNIIiwgYmlwKTsKKworCWJwID0gYmlwLT5ibGlfYnVmOworCisJaWYgKFhGU19CVUZfSVNERUxBWVdSSVRFKGJwKSkgeworCQl4ZnNfYmF3cml0ZShiaXAtPmJsaV9pdGVtLmxpX21vdW50cCwgYnApOworCX0gZWxzZSB7CisJCXhmc19idWZfcmVsc2UoYnApOworCX0KK30KKworLyogQVJHU1VTRUQgKi8KK3ZvaWQKK3hmc19idWZfaXRlbV9jb21taXR0aW5nKHhmc19idWZfbG9nX2l0ZW1fdCAqYmlwLCB4ZnNfbHNuX3QgY29tbWl0X2xzbikKK3sKK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIG9wcyB2ZWN0b3Igc2hhcmVkIGJ5IGFsbCBidWYgbG9nIGl0ZW1zLgorICovCitzdHJ1Y3QgeGZzX2l0ZW1fb3BzIHhmc19idWZfaXRlbV9vcHMgPSB7CisJLmlvcF9zaXplCT0gKHVpbnQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfYnVmX2l0ZW1fc2l6ZSwKKwkuaW9wX2Zvcm1hdAk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KiwgeGZzX2xvZ19pb3ZlY190KikpCisJCQkJCXhmc19idWZfaXRlbV9mb3JtYXQsCisJLmlvcF9waW4JPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19idWZfaXRlbV9waW4sCisJLmlvcF91bnBpbgk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KiwgaW50KSl4ZnNfYnVmX2l0ZW1fdW5waW4sCisJLmlvcF91bnBpbl9yZW1vdmUgPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCosIHhmc190cmFuc190ICopKQorCQkJCQl4ZnNfYnVmX2l0ZW1fdW5waW5fcmVtb3ZlLAorCS5pb3BfdHJ5bG9jawk9ICh1aW50KCopKHhmc19sb2dfaXRlbV90KikpeGZzX2J1Zl9pdGVtX3RyeWxvY2ssCisJLmlvcF91bmxvY2sJPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19idWZfaXRlbV91bmxvY2ssCisJLmlvcF9jb21taXR0ZWQJPSAoeGZzX2xzbl90KCopKHhmc19sb2dfaXRlbV90KiwgeGZzX2xzbl90KSkKKwkJCQkJeGZzX2J1Zl9pdGVtX2NvbW1pdHRlZCwKKwkuaW9wX3B1c2gJPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19idWZfaXRlbV9wdXNoLAorCS5pb3BfYWJvcnQJPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19idWZfaXRlbV9hYm9ydCwKKwkuaW9wX3B1c2hidWYJPSBOVUxMLAorCS5pb3BfY29tbWl0dGluZyA9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KiwgeGZzX2xzbl90KSkKKwkJCQkJeGZzX2J1Zl9pdGVtX2NvbW1pdHRpbmcKK307CisKKworLyoKKyAqIEFsbG9jYXRlIGEgbmV3IGJ1ZiBsb2cgaXRlbSB0byBnbyB3aXRoIHRoZSBnaXZlbiBidWZmZXIuCisgKiBTZXQgdGhlIGJ1ZmZlcidzIGJfZnNwcml2YXRlIGZpZWxkIHRvIHBvaW50IHRvIHRoZSBuZXcKKyAqIGJ1ZiBsb2cgaXRlbS4gIElmIHRoZXJlIGFyZSBvdGhlciBpdGVtJ3MgYXR0YWNoZWQgdG8gdGhlCisgKiBidWZmZXIgKHNlZSB4ZnNfYnVmX2F0dGFjaF9pb2RvbmUoKSBiZWxvdyksIHRoZW4gcHV0IHRoZQorICogYnVmIGxvZyBpdGVtIGF0IHRoZSBmcm9udC4KKyAqLwordm9pZAoreGZzX2J1Zl9pdGVtX2luaXQoCisJeGZzX2J1Zl90CSpicCwKKwl4ZnNfbW91bnRfdAkqbXApCit7CisJeGZzX2xvZ19pdGVtX3QJCSpsaXA7CisJeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXA7CisJaW50CQkJY2h1bmtzOworCWludAkJCW1hcF9zaXplOworCisJLyoKKwkgKiBDaGVjayB0byBzZWUgaWYgdGhlcmUgaXMgYWxyZWFkeSBhIGJ1ZiBsb2cgaXRlbSBmb3IKKwkgKiB0aGlzIGJ1ZmZlci4gIElmIHRoZXJlIGlzLCBpdCBpcyBndWFyYW50ZWVkIHRvIGJlCisJICogdGhlIGZpcnN0LiAgSWYgd2UgZG8gYWxyZWFkeSBoYXZlIG9uZSwgdGhlcmUgaXMKKwkgKiBub3RoaW5nIHRvIGRvIGhlcmUgc28gcmV0dXJuLgorCSAqLworCWlmIChYRlNfQlVGX0ZTUFJJVkFURTMoYnAsIHhmc19tb3VudF90ICopICE9IG1wKQorCQlYRlNfQlVGX1NFVF9GU1BSSVZBVEUzKGJwLCBtcCk7CisJWEZTX0JVRl9TRVRfQkRTVFJBVF9GVU5DKGJwLCB4ZnNfYmRzdHJhdF9jYik7CisJaWYgKFhGU19CVUZfRlNQUklWQVRFKGJwLCB2b2lkICopICE9IE5VTEwpIHsKKwkJbGlwID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhmc19sb2dfaXRlbV90ICopOworCQlpZiAobGlwLT5saV90eXBlID09IFhGU19MSV9CVUYpIHsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCS8qCisJICogY2h1bmtzIGlzIHRoZSBudW1iZXIgb2YgWEZTX0JMSV9DSFVOSyBzaXplIHBpZWNlcworCSAqIHRoZSBidWZmZXIgY2FuIGJlIGRpdmlkZWQgaW50by4gTWFrZSBzdXJlIG5vdCB0bworCSAqIHRydW5jYXRlIGFueSBwaWVjZXMuICBtYXBfc2l6ZSBpcyB0aGUgc2l6ZSBvZiB0aGUKKwkgKiBiaXRtYXAgbmVlZGVkIHRvIGRlc2NyaWJlIHRoZSBjaHVua3Mgb2YgdGhlIGJ1ZmZlci4KKwkgKi8KKwljaHVua3MgPSAoaW50KSgoWEZTX0JVRl9DT1VOVChicCkgKyAoWEZTX0JMSV9DSFVOSyAtIDEpKSA+PiBYRlNfQkxJX1NISUZUKTsKKwltYXBfc2l6ZSA9IChpbnQpKChjaHVua3MgKyBOQldPUkQpID4+IEJJVF9UT19XT1JEX1NISUZUKTsKKworCWJpcCA9ICh4ZnNfYnVmX2xvZ19pdGVtX3QqKWttZW1fem9uZV96YWxsb2MoeGZzX2J1Zl9pdGVtX3pvbmUsCisJCQkJCQkgICAgS01fU0xFRVApOworCWJpcC0+YmxpX2l0ZW0ubGlfdHlwZSA9IFhGU19MSV9CVUY7CisJYmlwLT5ibGlfaXRlbS5saV9vcHMgPSAmeGZzX2J1Zl9pdGVtX29wczsKKwliaXAtPmJsaV9pdGVtLmxpX21vdW50cCA9IG1wOworCWJpcC0+YmxpX2J1ZiA9IGJwOworCWJpcC0+YmxpX2Zvcm1hdC5ibGZfdHlwZSA9IFhGU19MSV9CVUY7CisJYmlwLT5ibGlfZm9ybWF0LmJsZl9ibGtubyA9IChfX2ludDY0X3QpWEZTX0JVRl9BRERSKGJwKTsKKwliaXAtPmJsaV9mb3JtYXQuYmxmX2xlbiA9ICh1c2hvcnQpQlRPQkIoWEZTX0JVRl9DT1VOVChicCkpOworCWJpcC0+YmxpX2Zvcm1hdC5ibGZfbWFwX3NpemUgPSBtYXBfc2l6ZTsKKyNpZmRlZiBYRlNfQkxJX1RSQUNFCisJYmlwLT5ibGlfdHJhY2UgPSBrdHJhY2VfYWxsb2MoWEZTX0JMSV9UUkFDRV9TSVpFLCBLTV9TTEVFUCk7CisjZW5kaWYKKworI2lmZGVmIFhGU19UUkFOU19ERUJVRworCS8qCisJICogQWxsb2NhdGUgdGhlIGFycmF5cyBmb3IgdHJhY2tpbmcgd2hhdCBuZWVkcyB0byBiZSBsb2dnZWQKKwkgKiBhbmQgd2hhdCBvdXIgY2FsbGVycyByZXF1ZXN0IHRvIGJlIGxvZ2dlZC4gIGJsaV9vcmlnCisJICogaG9sZHMgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCwgY2xlYW4gYnVmZmVyIGZvciBjb21wYXJpc29uCisJICogYWdhaW5zdCwgYW5kIGJsaV9sb2dnZWQga2VlcHMgYSAxIGJpdCBmbGFnIHBlciBieXRlIGluCisJICogdGhlIGJ1ZmZlciB0byBpbmRpY2F0ZSB3aGljaCBieXRlcyB0aGUgY2FsbGVycyBoYXZlIGFza2VkCisJICogdG8gaGF2ZSBsb2dnZWQuCisJICovCisJYmlwLT5ibGlfb3JpZyA9IChjaGFyICopa21lbV9hbGxvYyhYRlNfQlVGX0NPVU5UKGJwKSwgS01fU0xFRVApOworCW1lbWNweShiaXAtPmJsaV9vcmlnLCBYRlNfQlVGX1BUUihicCksIFhGU19CVUZfQ09VTlQoYnApKTsKKwliaXAtPmJsaV9sb2dnZWQgPSAoY2hhciAqKWttZW1femFsbG9jKFhGU19CVUZfQ09VTlQoYnApIC8gTkJCWSwgS01fU0xFRVApOworI2VuZGlmCisKKwkvKgorCSAqIFB1dCB0aGUgYnVmIGl0ZW0gaW50byB0aGUgbGlzdCBvZiBpdGVtcyBhdHRhY2hlZCB0byB0aGUKKwkgKiBidWZmZXIgYXQgdGhlIGZyb250LgorCSAqLworCWlmIChYRlNfQlVGX0ZTUFJJVkFURShicCwgdm9pZCAqKSAhPSBOVUxMKSB7CisJCWJpcC0+YmxpX2l0ZW0ubGlfYmlvX2xpc3QgPQorCQkJCVhGU19CVUZfRlNQUklWQVRFKGJwLCB4ZnNfbG9nX2l0ZW1fdCAqKTsKKwl9CisJWEZTX0JVRl9TRVRfRlNQUklWQVRFKGJwLCBiaXApOworfQorCisKKy8qCisgKiBNYXJrIGJ5dGVzIGZpcnN0IHRocm91Z2ggbGFzdCBpbmNsdXNpdmUgYXMgZGlydHkgaW4gdGhlIGJ1ZgorICogaXRlbSdzIGJpdG1hcC4KKyAqLwordm9pZAoreGZzX2J1Zl9pdGVtX2xvZygKKwl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcCwKKwl1aW50CQkJZmlyc3QsCisJdWludAkJCWxhc3QpCit7CisJdWludAkJZmlyc3RfYml0OworCXVpbnQJCWxhc3RfYml0OworCXVpbnQJCWJpdHNfdG9fc2V0OworCXVpbnQJCWJpdHNfc2V0OworCXVpbnQJCXdvcmRfbnVtOworCXVpbnQJCSp3b3JkcDsKKwl1aW50CQliaXQ7CisJdWludAkJZW5kX2JpdDsKKwl1aW50CQltYXNrOworCisJLyoKKwkgKiBNYXJrIHRoZSBpdGVtIGFzIGhhdmluZyBzb21lIGRpcnR5IGRhdGEgZm9yCisJICogcXVpY2sgcmVmZXJlbmNlIGluIHhmc19idWZfaXRlbV9kaXJ0eS4KKwkgKi8KKwliaXAtPmJsaV9mbGFncyB8PSBYRlNfQkxJX0RJUlRZOworCisJLyoKKwkgKiBDb252ZXJ0IGJ5dGUgb2Zmc2V0cyB0byBiaXQgbnVtYmVycy4KKwkgKi8KKwlmaXJzdF9iaXQgPSBmaXJzdCA+PiBYRlNfQkxJX1NISUZUOworCWxhc3RfYml0ID0gbGFzdCA+PiBYRlNfQkxJX1NISUZUOworCisJLyoKKwkgKiBDYWxjdWxhdGUgdGhlIHRvdGFsIG51bWJlciBvZiBiaXRzIHRvIGJlIHNldC4KKwkgKi8KKwliaXRzX3RvX3NldCA9IGxhc3RfYml0IC0gZmlyc3RfYml0ICsgMTsKKworCS8qCisJICogR2V0IGEgcG9pbnRlciB0byB0aGUgZmlyc3Qgd29yZCBpbiB0aGUgYml0bWFwCisJICogdG8gc2V0IGEgYml0IGluLgorCSAqLworCXdvcmRfbnVtID0gZmlyc3RfYml0ID4+IEJJVF9UT19XT1JEX1NISUZUOworCXdvcmRwID0gJihiaXAtPmJsaV9mb3JtYXQuYmxmX2RhdGFfbWFwW3dvcmRfbnVtXSk7CisKKwkvKgorCSAqIENhbGN1bGF0ZSB0aGUgc3RhcnRpbmcgYml0IGluIHRoZSBmaXJzdCB3b3JkLgorCSAqLworCWJpdCA9IGZpcnN0X2JpdCAmICh1aW50KShOQldPUkQgLSAxKTsKKworCS8qCisJICogRmlyc3Qgc2V0IGFueSBiaXRzIGluIHRoZSBmaXJzdCB3b3JkIG9mIG91ciByYW5nZS4KKwkgKiBJZiBpdCBzdGFydHMgYXQgYml0IDAgb2YgdGhlIHdvcmQsIGl0IHdpbGwgYmUKKwkgKiBzZXQgYmVsb3cgcmF0aGVyIHRoYW4gaGVyZS4gIFRoYXQgaXMgd2hhdCB0aGUgdmFyaWFibGUKKwkgKiBiaXQgdGVsbHMgdXMuIFRoZSB2YXJpYWJsZSBiaXRzX3NldCB0cmFja3MgdGhlIG51bWJlcgorCSAqIG9mIGJpdHMgdGhhdCBoYXZlIGJlZW4gc2V0IHNvIGZhci4gIEVuZF9iaXQgaXMgdGhlIG51bWJlcgorCSAqIG9mIHRoZSBsYXN0IGJpdCB0byBiZSBzZXQgaW4gdGhpcyB3b3JkIHBsdXMgb25lLgorCSAqLworCWlmIChiaXQpIHsKKwkJZW5kX2JpdCA9IE1JTihiaXQgKyBiaXRzX3RvX3NldCwgKHVpbnQpTkJXT1JEKTsKKwkJbWFzayA9ICgoMSA8PCAoZW5kX2JpdCAtIGJpdCkpIC0gMSkgPDwgYml0OworCQkqd29yZHAgfD0gbWFzazsKKwkJd29yZHArKzsKKwkJYml0c19zZXQgPSBlbmRfYml0IC0gYml0OworCX0gZWxzZSB7CisJCWJpdHNfc2V0ID0gMDsKKwl9CisKKwkvKgorCSAqIE5vdyBzZXQgYml0cyBhIHdob2xlIHdvcmQgYXQgYSB0aW1lIHRoYXQgYXJlIGJldHdlZW4KKwkgKiBmaXJzdF9iaXQgYW5kIGxhc3RfYml0LgorCSAqLworCXdoaWxlICgoYml0c190b19zZXQgLSBiaXRzX3NldCkgPj0gTkJXT1JEKSB7CisJCSp3b3JkcCB8PSAweGZmZmZmZmZmOworCQliaXRzX3NldCArPSBOQldPUkQ7CisJCXdvcmRwKys7CisJfQorCisJLyoKKwkgKiBGaW5hbGx5LCBzZXQgYW55IGJpdHMgbGVmdCB0byBiZSBzZXQgaW4gb25lIGxhc3QgcGFydGlhbCB3b3JkLgorCSAqLworCWVuZF9iaXQgPSBiaXRzX3RvX3NldCAtIGJpdHNfc2V0OworCWlmIChlbmRfYml0KSB7CisJCW1hc2sgPSAoMSA8PCBlbmRfYml0KSAtIDE7CisJCSp3b3JkcCB8PSBtYXNrOworCX0KKworCXhmc19idWZfaXRlbV9sb2dfZGVidWcoYmlwLCBmaXJzdCwgbGFzdCk7Cit9CisKKworLyoKKyAqIFJldHVybiAxIGlmIHRoZSBidWZmZXIgaGFzIHNvbWUgZGF0YSB0aGF0IGhhcyBiZWVuIGxvZ2dlZCAoYXQgYW55CisgKiBwb2ludCwgbm90IGp1c3QgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24pIGFuZCAwIGlmIG5vdC4KKyAqLwordWludAoreGZzX2J1Zl9pdGVtX2RpcnR5KAorCXhmc19idWZfbG9nX2l0ZW1fdAkqYmlwKQoreworCXJldHVybiAoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX0RJUlRZKTsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGJ1ZiBsb2cgaXRlbSBpcyBubyBsb25nZXIgbmVlZGVkLiAgSXQgc2hvdWxkCisgKiBmcmVlIHRoZSBidWYgbG9nIGl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBidWZmZXIgYW5kIGNsZWFyCisgKiB0aGUgYnVmZmVyJ3MgcG9pbnRlciB0byB0aGUgYnVmIGxvZyBpdGVtLiAgSWYgdGhlcmUgYXJlIG5vIG1vcmUKKyAqIGl0ZW1zIGluIHRoZSBsaXN0LCBjbGVhciB0aGUgYl9pb2RvbmUgZmllbGQgb2YgdGhlIGJ1ZmZlciAoc2VlCisgKiB4ZnNfYnVmX2F0dGFjaF9pb2RvbmUoKSBiZWxvdykuCisgKi8KK3ZvaWQKK3hmc19idWZfaXRlbV9yZWxzZSgKKwl4ZnNfYnVmX3QJKmJwKQoreworCXhmc19idWZfbG9nX2l0ZW1fdAkqYmlwOworCisJeGZzX2J1ZnRyYWNlKCJYRlNfUkVMU0UiLCBicCk7CisJYmlwID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhmc19idWZfbG9nX2l0ZW1fdCopOworCVhGU19CVUZfU0VUX0ZTUFJJVkFURShicCwgYmlwLT5ibGlfaXRlbS5saV9iaW9fbGlzdCk7CisJaWYgKChYRlNfQlVGX0ZTUFJJVkFURShicCwgdm9pZCAqKSA9PSBOVUxMKSAmJgorCSAgICAoWEZTX0JVRl9JT0RPTkVfRlVOQyhicCkgIT0gTlVMTCkpIHsKKwkJQVNTRVJUKChYRlNfQlVGX0lTVU5JTklUSUFMKGJwKSkgPT0gMCk7CisJCVhGU19CVUZfQ0xSX0lPRE9ORV9GVU5DKGJwKTsKKwl9CisKKyNpZmRlZiBYRlNfVFJBTlNfREVCVUcKKwlrbWVtX2ZyZWUoYmlwLT5ibGlfb3JpZywgWEZTX0JVRl9DT1VOVChicCkpOworCWJpcC0+YmxpX29yaWcgPSBOVUxMOworCWttZW1fZnJlZShiaXAtPmJsaV9sb2dnZWQsIFhGU19CVUZfQ09VTlQoYnApIC8gTkJCWSk7CisJYmlwLT5ibGlfbG9nZ2VkID0gTlVMTDsKKyNlbmRpZiAvKiBYRlNfVFJBTlNfREVCVUcgKi8KKworI2lmZGVmIFhGU19CTElfVFJBQ0UKKwlrdHJhY2VfZnJlZShiaXAtPmJsaV90cmFjZSk7CisjZW5kaWYKKwlrbWVtX3pvbmVfZnJlZSh4ZnNfYnVmX2l0ZW1fem9uZSwgYmlwKTsKK30KKworCisvKgorICogQWRkIHRoZSBnaXZlbiBsb2cgaXRlbSB3aXRoIGl0cyBjYWxsYmFjayB0byB0aGUgbGlzdCBvZiBjYWxsYmFja3MKKyAqIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBidWZmZXIncyBJL08gY29tcGxldGVzLiAgSWYgaXQgaXMgbm90IHNldAorICogYWxyZWFkeSwgc2V0IHRoZSBidWZmZXIncyBiX2lvZG9uZSgpIHJvdXRpbmUgdG8gYmUKKyAqIHhmc19idWZfaW9kb25lX2NhbGxiYWNrcygpIGFuZCBsaW5rIHRoZSBsb2cgaXRlbSBpbnRvIHRoZSBsaXN0IG9mCisgKiBpdGVtcyByb290ZWQgYXQgYl9mc3ByaXZhdGUuICBJdGVtcyBhcmUgYWx3YXlzIGFkZGVkIGFzIHRoZSBzZWNvbmQKKyAqIGVudHJ5IGluIHRoZSBsaXN0IGlmIHRoZXJlIGlzIGEgZmlyc3QsIGJlY2F1c2UgdGhlIGJ1ZiBpdGVtIGNvZGUKKyAqIGFzc3VtZXMgdGhhdCB0aGUgYnVmIGxvZyBpdGVtIGlzIGZpcnN0LgorICovCit2b2lkCit4ZnNfYnVmX2F0dGFjaF9pb2RvbmUoCisJeGZzX2J1Zl90CSpicCwKKwl2b2lkCQkoKmNiKSh4ZnNfYnVmX3QgKiwgeGZzX2xvZ19pdGVtX3QgKiksCisJeGZzX2xvZ19pdGVtX3QJKmxpcCkKK3sKKwl4ZnNfbG9nX2l0ZW1fdAkqaGVhZF9saXA7CisKKwlBU1NFUlQoWEZTX0JVRl9JU0JVU1koYnApKTsKKwlBU1NFUlQoWEZTX0JVRl9WQUxVU0VNQShicCkgPD0gMCk7CisKKwlsaXAtPmxpX2NiID0gY2I7CisJaWYgKFhGU19CVUZfRlNQUklWQVRFKGJwLCB2b2lkICopICE9IE5VTEwpIHsKKwkJaGVhZF9saXAgPSBYRlNfQlVGX0ZTUFJJVkFURShicCwgeGZzX2xvZ19pdGVtX3QgKik7CisJCWxpcC0+bGlfYmlvX2xpc3QgPSBoZWFkX2xpcC0+bGlfYmlvX2xpc3Q7CisJCWhlYWRfbGlwLT5saV9iaW9fbGlzdCA9IGxpcDsKKwl9IGVsc2UgeworCQlYRlNfQlVGX1NFVF9GU1BSSVZBVEUoYnAsIGxpcCk7CisJfQorCisJQVNTRVJUKChYRlNfQlVGX0lPRE9ORV9GVU5DKGJwKSA9PSB4ZnNfYnVmX2lvZG9uZV9jYWxsYmFja3MpIHx8CisJICAgICAgIChYRlNfQlVGX0lPRE9ORV9GVU5DKGJwKSA9PSBOVUxMKSk7CisJWEZTX0JVRl9TRVRfSU9ET05FX0ZVTkMoYnAsIHhmc19idWZfaW9kb25lX2NhbGxiYWNrcyk7Cit9CisKK1NUQVRJQyB2b2lkCit4ZnNfYnVmX2RvX2NhbGxiYWNrcygKKwl4ZnNfYnVmX3QJKmJwLAorCXhmc19sb2dfaXRlbV90CSpsaXApCit7CisJeGZzX2xvZ19pdGVtX3QJKm5saXA7CisKKwl3aGlsZSAobGlwICE9IE5VTEwpIHsKKwkJbmxpcCA9IGxpcC0+bGlfYmlvX2xpc3Q7CisJCUFTU0VSVChsaXAtPmxpX2NiICE9IE5VTEwpOworCQkvKgorCQkgKiBDbGVhciB0aGUgbmV4dCBwb2ludGVyIHNvIHdlIGRvbid0IGhhdmUgYW55CisJCSAqIGNvbmZ1c2lvbiBpZiB0aGUgaXRlbSBpcyBhZGRlZCB0byBhbm90aGVyIGJ1Zi4KKwkJICogRG9uJ3QgdG91Y2ggdGhlIGxvZyBpdGVtIGFmdGVyIGNhbGxpbmcgaXRzCisJCSAqIGNhbGxiYWNrLCBiZWNhdXNlIGl0IGNvdWxkIGhhdmUgZnJlZWQgaXRzZWxmLgorCQkgKi8KKwkJbGlwLT5saV9iaW9fbGlzdCA9IE5VTEw7CisJCWxpcC0+bGlfY2IoYnAsIGxpcCk7CisJCWxpcCA9IG5saXA7CisJfQorfQorCisvKgorICogVGhpcyBpcyB0aGUgaW9kb25lKCkgZnVuY3Rpb24gZm9yIGJ1ZmZlcnMgd2hpY2ggaGF2ZSBoYWQgY2FsbGJhY2tzCisgKiBhdHRhY2hlZCB0byB0aGVtIGJ5IHhmc19idWZfYXR0YWNoX2lvZG9uZSgpLiAgSXQgc2hvdWxkIHJlbW92ZSBlYWNoCisgKiBsb2cgaXRlbSBmcm9tIHRoZSBidWZmZXIncyBsaXN0IGFuZCBjYWxsIHRoZSBjYWxsYmFjayBvZiBlYWNoIGluIHR1cm4uCisgKiBXaGVuIGRvbmUsIHRoZSBidWZmZXIncyBmc3ByaXZhdGUgZmllbGQgaXMgc2V0IHRvIE5VTEwgYW5kIHRoZSBidWZmZXIKKyAqIGlzIHVubG9ja2VkIHdpdGggYSBjYWxsIHRvIGlvZG9uZSgpLgorICovCit2b2lkCit4ZnNfYnVmX2lvZG9uZV9jYWxsYmFja3MoCisJeGZzX2J1Zl90CSpicCkKK3sKKwl4ZnNfbG9nX2l0ZW1fdAkqbGlwOworCXN0YXRpYyB1bG9uZwlsYXN0dGltZTsKKwlzdGF0aWMgeGZzX2J1ZnRhcmdfdCAqbGFzdHRhcmc7CisJeGZzX21vdW50X3QJKm1wOworCisJQVNTRVJUKFhGU19CVUZfRlNQUklWQVRFKGJwLCB2b2lkICopICE9IE5VTEwpOworCWxpcCA9IFhGU19CVUZfRlNQUklWQVRFKGJwLCB4ZnNfbG9nX2l0ZW1fdCAqKTsKKworCWlmIChYRlNfQlVGX0dFVEVSUk9SKGJwKSAhPSAwKSB7CisJCS8qCisJCSAqIElmIHdlJ3ZlIGFscmVhZHkgZGVjaWRlZCB0byBzaHV0ZG93biB0aGUgZmlsZXN5c3RlbQorCQkgKiBiZWNhdXNlIG9mIElPIGVycm9ycywgdGhlcmUncyBubyBwb2ludCBpbiBnaXZpbmcgdGhpcworCQkgKiBhIHJldHJ5LgorCQkgKi8KKwkJbXAgPSBsaXAtPmxpX21vdW50cDsKKwkJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKSB7CisJCQlBU1NFUlQoWEZTX0JVRl9UQVJHRVQoYnApID09IG1wLT5tX2RkZXZfdGFyZ3ApOworCQkJWEZTX0JVRl9TVVBFUl9TVEFMRShicCk7CisJCQl4ZnNfYnVmdHJhY2UoIkJVRl9JT0RPTkVfQ0IiLCBicCk7CisJCQl4ZnNfYnVmX2RvX2NhbGxiYWNrcyhicCwgbGlwKTsKKwkJCVhGU19CVUZfU0VUX0ZTUFJJVkFURShicCwgTlVMTCk7CisJCQlYRlNfQlVGX0NMUl9JT0RPTkVfRlVOQyhicCk7CisKKwkJCS8qCisJCQkgKiBYRlNfU0hVVCBmbGFnIGdldHMgc2V0IHdoZW4gd2UgZ28gdGhydSB0aGUKKwkJCSAqIGVudGlyZSBidWZmZXIgY2FjaGUgYW5kIGRlbGliZXJhdGVseSBzdGFydAorCQkJICogdGhyb3dpbmcgYXdheSBkZWxheWVkIHdyaXRlIGJ1ZmZlcnMuCisJCQkgKiBTaW5jZSB0aGVyZSdzIG5vIGJpb3dhaXQgZG9uZSBvbiB0aG9zZSwKKwkJCSAqIHdlIHNob3VsZCBqdXN0IGJyZWxzZSB0aGVtLgorCQkJICovCisJCQlpZiAoWEZTX0JVRl9JU1NIVVQoYnApKSB7CisJCQkgICAgWEZTX0JVRl9VTlNIVVQoYnApOworCQkJCXhmc19idWZfcmVsc2UoYnApOworCQkJfSBlbHNlIHsKKwkJCQl4ZnNfYmlvZG9uZShicCk7CisJCQl9CisKKwkJCXJldHVybjsKKwkJfQorCisJCWlmICgoWEZTX0JVRl9UQVJHRVQoYnApICE9IGxhc3R0YXJnKSB8fAorCQkgICAgKHRpbWVfYWZ0ZXIoamlmZmllcywgKGxhc3R0aW1lICsgNSpIWikpKSkgeworCQkJbGFzdHRpbWUgPSBqaWZmaWVzOworCQkJcHJkZXYoIlhGUyB3cml0ZSBlcnJvciBpbiBmaWxlIHN5c3RlbSBtZXRhLWRhdGEgIgorCQkJICAgICAgImJsb2NrIDB4JWxseCBpbiAlcyIsCisJCQkgICAgICBYRlNfQlVGX1RBUkdFVChicCksCisJCQkgICAgICAoX191aW50NjRfdClYRlNfQlVGX0FERFIoYnApLCBtcC0+bV9mc25hbWUpOworCQl9CisJCWxhc3R0YXJnID0gWEZTX0JVRl9UQVJHRVQoYnApOworCisJCWlmIChYRlNfQlVGX0lTQVNZTkMoYnApKSB7CisJCQkvKgorCQkJICogSWYgdGhlIHdyaXRlIHdhcyBhc3luY2hyb25vdXMgdGhlbiBub29uZSB3aWxsIGJlCisJCQkgKiBsb29raW5nIGZvciB0aGUgZXJyb3IuICBDbGVhciB0aGUgZXJyb3Igc3RhdGUKKwkJCSAqIGFuZCB3cml0ZSB0aGUgYnVmZmVyIG91dCBhZ2FpbiBkZWxheWVkIHdyaXRlLgorCQkJICoKKwkJCSAqIFhYWHN1cCBUaGlzIGlzIE9LLCBzbyBsb25nIGFzIHdlIGNhdGNoIHRoZXNlCisJCQkgKiBiZWZvcmUgd2Ugc3RhcnQgdGhlIHVtb3VudDsgd2UgZG9uJ3Qgd2FudCB0aGVzZQorCQkJICogREVMV1JJIG1ldGFkYXRhIGJ1ZnMgdG8gYmUgaGFuZ2luZyBhcm91bmQuCisJCQkgKi8KKwkJCVhGU19CVUZfRVJST1IoYnAsMCk7IC8qIGVycm5vIG9mIDAgdW5zZXRzIHRoZSBmbGFnICovCisKKwkJCWlmICghKFhGU19CVUZfSVNTVEFMRShicCkpKSB7CisJCQkJWEZTX0JVRl9ERUxBWVdSSVRFKGJwKTsKKwkJCQlYRlNfQlVGX0RPTkUoYnApOworCQkJCVhGU19CVUZfU0VUX1NUQVJUKGJwKTsKKwkJCX0KKwkJCUFTU0VSVChYRlNfQlVGX0lPRE9ORV9GVU5DKGJwKSk7CisJCQl4ZnNfYnVmdHJhY2UoIkJVRl9JT0RPTkUgQVNZTkMiLCBicCk7CisJCQl4ZnNfYnVmX3JlbHNlKGJwKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBJZiB0aGUgd3JpdGUgb2YgdGhlIGJ1ZmZlciB3YXMgbm90IGFzeW5jaHJvbm91cywKKwkJCSAqIHRoZW4gd2Ugd2FudCB0byBtYWtlIHN1cmUgdG8gcmV0dXJuIHRoZSBlcnJvcgorCQkJICogdG8gdGhlIGNhbGxlciBvZiBid3JpdGUoKS4gIEJlY2F1c2Ugb2YgdGhpcyB3ZQorCQkJICogY2Fubm90IGNsZWFyIHRoZSBCX0VSUk9SIHN0YXRlIGF0IHRoaXMgcG9pbnQuCisJCQkgKiBJbnN0ZWFkIHdlIGluc3RhbGwgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0CisJCQkgKiB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBidWZmZXIgaXMgcmVsZWFzZWQsIGFuZAorCQkJICogdGhhdCByb3V0aW5lIHdpbGwgY2xlYXIgdGhlIGVycm9yIHN0YXRlIGFuZAorCQkJICogc2V0IHRoZSBidWZmZXIgdG8gYmUgd3JpdHRlbiBvdXQgYWdhaW4gYWZ0ZXIKKwkJCSAqIHNvbWUgZGVsYXkuCisJCQkgKi8KKwkJCS8qIFdlIGFjdHVhbGx5IG92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgYi1yZWxzZQorCQkJICAgZnVuY3Rpb24gYXQgdGltZXMsIGJ1dCB3ZSdyZSBnb25uYSBiZSBzaHV0dGluZyBkb3duCisJCQkgICBhbnl3YXkuICovCisJCQlYRlNfQlVGX1NFVF9CUkVMU0VfRlVOQyhicCx4ZnNfYnVmX2Vycm9yX3JlbHNlKTsKKwkJCVhGU19CVUZfRE9ORShicCk7CisJCQlYRlNfQlVGX1ZfSU9ET05FU0VNQShicCk7CisJCX0KKwkJcmV0dXJuOworCX0KKyNpZmRlZiBYRlNFUlJPUkRFQlVHCisJeGZzX2J1ZnRyYWNlKCJYRlMgQlVGQ0IgTk9FUlIiLCBicCk7CisjZW5kaWYKKwl4ZnNfYnVmX2RvX2NhbGxiYWNrcyhicCwgbGlwKTsKKwlYRlNfQlVGX1NFVF9GU1BSSVZBVEUoYnAsIE5VTEwpOworCVhGU19CVUZfQ0xSX0lPRE9ORV9GVU5DKGJwKTsKKwl4ZnNfYmlvZG9uZShicCk7Cit9CisKKy8qCisgKiBUaGlzIGlzIGEgY2FsbGJhY2sgcm91dGluZSBhdHRhY2hlZCB0byBhIGJ1ZmZlciB3aGljaCBnZXRzIGFuIGVycm9yCisgKiB3aGVuIGJlaW5nIHdyaXR0ZW4gb3V0IHN5bmNocm9ub3VzbHkuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfYnVmX2Vycm9yX3JlbHNlKAorCXhmc19idWZfdAkqYnApCit7CisJeGZzX2xvZ19pdGVtX3QJKmxpcDsKKwl4ZnNfbW91bnRfdAkqbXA7CisKKwlsaXAgPSBYRlNfQlVGX0ZTUFJJVkFURShicCwgeGZzX2xvZ19pdGVtX3QgKik7CisJbXAgPSAoeGZzX21vdW50X3QgKilsaXAtPmxpX21vdW50cDsKKwlBU1NFUlQoWEZTX0JVRl9UQVJHRVQoYnApID09IG1wLT5tX2RkZXZfdGFyZ3ApOworCisJWEZTX0JVRl9TVEFMRShicCk7CisJWEZTX0JVRl9ET05FKGJwKTsKKwlYRlNfQlVGX1VOREVMQVlXUklURShicCk7CisJWEZTX0JVRl9FUlJPUihicCwwKTsKKwl4ZnNfYnVmdHJhY2UoIkJVRl9FUlJPUl9SRUxTRSIsIGJwKTsKKwlpZiAoISBYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKKwkJeGZzX2ZvcmNlX3NodXRkb3duKG1wLCBYRlNfTUVUQURBVEFfSU9fRVJST1IpOworCS8qCisJICogV2UgaGF2ZSB0byB1bnBpbiB0aGUgcGlubmVkIGJ1ZmZlcnMgc28gZG8gdGhlCisJICogY2FsbGJhY2tzLgorCSAqLworCXhmc19idWZfZG9fY2FsbGJhY2tzKGJwLCBsaXApOworCVhGU19CVUZfU0VUX0ZTUFJJVkFURShicCwgTlVMTCk7CisJWEZTX0JVRl9DTFJfSU9ET05FX0ZVTkMoYnApOworCVhGU19CVUZfU0VUX0JSRUxTRV9GVU5DKGJwLE5VTEwpOworCXhmc19idWZfcmVsc2UoYnApOworfQorCisKKy8qCisgKiBUaGlzIGlzIHRoZSBpb2RvbmUoKSBmdW5jdGlvbiBmb3IgYnVmZmVycyB3aGljaCBoYXZlIGJlZW4KKyAqIGxvZ2dlZC4gIEl0IGlzIGNhbGxlZCB3aGVuIHRoZXkgYXJlIGV2ZW50dWFsbHkgZmx1c2hlZCBvdXQuCisgKiBJdCBzaG91bGQgcmVtb3ZlIHRoZSBidWYgaXRlbSBmcm9tIHRoZSBBSUwsIGFuZCBmcmVlIHRoZSBidWYgaXRlbS4KKyAqIEl0IGlzIGNhbGxlZCBieSB4ZnNfYnVmX2lvZG9uZV9jYWxsYmFja3MoKSBhYm92ZSB3aGljaCB3aWxsIHRha2UKKyAqIGNhcmUgb2YgY2xlYW5pbmcgdXAgdGhlIGJ1ZmZlciBpdHNlbGYuCisgKi8KKy8qIEFSR1NVU0VEICovCit2b2lkCit4ZnNfYnVmX2lvZG9uZSgKKwl4ZnNfYnVmX3QJCSpicCwKKwl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcCkKK3sKKwlzdHJ1Y3QgeGZzX21vdW50CSptcDsKKwlTUExERUNMKHMpOworCisJQVNTRVJUKGJpcC0+YmxpX2J1ZiA9PSBicCk7CisKKwltcCA9IGJpcC0+YmxpX2l0ZW0ubGlfbW91bnRwOworCisJLyoKKwkgKiBJZiB3ZSBhcmUgZm9yY2libHkgc2h1dHRpbmcgZG93biwgdGhpcyBtYXkgd2VsbCBiZQorCSAqIG9mZiB0aGUgQUlMIGFscmVhZHkuIFRoYXQncyBiZWNhdXNlIHdlIHNpbXVsYXRlIHRoZQorCSAqIGxvZy1jb21taXR0ZWQgY2FsbGJhY2tzIHRvIHVucGluIHRoZXNlIGJ1ZmZlcnMuIE9yIHdlIG1heSBuZXZlcgorCSAqIGhhdmUgcHV0IHRoaXMgaXRlbSBvbiBBSUwgYmVjYXVzZSBvZiB0aGUgdHJhbnNhY3Rpb24gd2FzCisJICogYWJvcnRlZCBmb3JjaWJseS4geGZzX3RyYW5zX2RlbGV0ZV9haWwoKSB0YWtlcyBjYXJlIG9mIHRoZXNlLgorCSAqCisJICogRWl0aGVyIHdheSwgQUlMIGlzIHVzZWxlc3MgaWYgd2UncmUgZm9yY2luZyBhIHNodXRkb3duLgorCSAqLworCUFJTF9MT0NLKG1wLHMpOworCS8qCisJICogeGZzX3RyYW5zX2RlbGV0ZV9haWwoKSBkcm9wcyB0aGUgQUlMIGxvY2suCisJICovCisJeGZzX3RyYW5zX2RlbGV0ZV9haWwobXAsICh4ZnNfbG9nX2l0ZW1fdCAqKWJpcCwgcyk7CisKKyNpZmRlZiBYRlNfVFJBTlNfREVCVUcKKwlrbWVtX2ZyZWUoYmlwLT5ibGlfb3JpZywgWEZTX0JVRl9DT1VOVChicCkpOworCWJpcC0+YmxpX29yaWcgPSBOVUxMOworCWttZW1fZnJlZShiaXAtPmJsaV9sb2dnZWQsIFhGU19CVUZfQ09VTlQoYnApIC8gTkJCWSk7CisJYmlwLT5ibGlfbG9nZ2VkID0gTlVMTDsKKyNlbmRpZiAvKiBYRlNfVFJBTlNfREVCVUcgKi8KKworI2lmZGVmIFhGU19CTElfVFJBQ0UKKwlrdHJhY2VfZnJlZShiaXAtPmJsaV90cmFjZSk7CisjZW5kaWYKKwlrbWVtX3pvbmVfZnJlZSh4ZnNfYnVmX2l0ZW1fem9uZSwgYmlwKTsKK30KKworI2lmIGRlZmluZWQoWEZTX0JMSV9UUkFDRSkKK3ZvaWQKK3hmc19idWZfaXRlbV90cmFjZSgKKwljaGFyCQkJKmlkLAorCXhmc19idWZfbG9nX2l0ZW1fdAkqYmlwKQoreworCXhmc19idWZfdAkJKmJwOworCUFTU0VSVChiaXAtPmJsaV90cmFjZSAhPSBOVUxMKTsKKworCWJwID0gYmlwLT5ibGlfYnVmOworCWt0cmFjZV9lbnRlcihiaXAtPmJsaV90cmFjZSwKKwkJICAgICAodm9pZCAqKWlkLAorCQkgICAgICh2b2lkICopYmlwLT5ibGlfYnVmLAorCQkgICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKWJpcC0+YmxpX2ZsYWdzKSwKKwkJICAgICAodm9pZCAqKSgodW5zaWduZWQgbG9uZyliaXAtPmJsaV9yZWN1ciksCisJCSAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpYXRvbWljX3JlYWQoJmJpcC0+YmxpX3JlZmNvdW50KSksCisJCSAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpCisJCQkJKDB4RkZGRkZGRkYgJiBYRlNfQlVGX0FERFIoYnApID4+IDMyKSksCisJCSAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKDB4RkZGRkZGRkYgJiBYRlNfQlVGX0FERFIoYnApKSksCisJCSAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpWEZTX0JVRl9DT1VOVChicCkpLAorCQkgICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKVhGU19CVUZfQkZMQUdTKGJwKSksCisJCSAgICAgWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHZvaWQgKiksCisJCSAgICAgWEZTX0JVRl9GU1BSSVZBVEUyKGJwLCB2b2lkICopLAorCQkgICAgICh2b2lkICopKHVuc2lnbmVkIGxvbmcpWEZTX0JVRl9JU1BJTk5FRChicCksCisJCSAgICAgKHZvaWQgKilYRlNfQlVGX0lPRE9ORV9GVU5DKGJwKSwKKwkJICAgICAodm9pZCAqKSgodW5zaWduZWQgbG9uZykoWEZTX0JVRl9WQUxVU0VNQShicCkpKSwKKwkJICAgICAodm9pZCAqKWJpcC0+YmxpX2l0ZW0ubGlfZGVzYywKKwkJICAgICAodm9pZCAqKSgodW5zaWduZWQgbG9uZyliaXAtPmJsaV9pdGVtLmxpX2ZsYWdzKSk7Cit9CisjZW5kaWYgLyogWEZTX0JMSV9UUkFDRSAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19idWZfaXRlbS5oIGIvZnMveGZzL3hmc19idWZfaXRlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMWIwYzkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2J1Zl9pdGVtLmgKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmCV9fWEZTX0JVRl9JVEVNX0hfXworI2RlZmluZQlfX1hGU19CVUZfSVRFTV9IX18KKworLyoKKyAqIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSB1c2VkIHRvIGxheSBvdXQgYSBidWYgbG9nIGl0ZW0gaW4gdGhlCisgKiBsb2cuICBUaGUgZGF0YSBtYXAgZGVzY3JpYmVzIHdoaWNoIDEyOCBieXRlIGNodW5rcyBvZiB0aGUgYnVmZmVyCisgKiBoYXZlIGJlZW4gbG9nZ2VkLiAgVGhpcyBzdHJ1Y3R1cmUgd29ya3Mgb25seSBvbiBidWZmZXJzIHRoYXQKKyAqIHJlc2lkZSB1cCB0byB0aGUgZmlyc3QgVEIgaW4gdGhlIGZpbGVzeXN0ZW0uICBUaGVzZSBidWZmZXJzIGFyZQorICogZ2VuZXJhdGVkIG9ubHkgYnkgcHJlLTYuMiBzeXN0ZW1zIGFuZCBhcmUga25vd24gYXMgWEZTX0xJXzZfMV9CVUYuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19idWZfbG9nX2Zvcm1hdF92MSB7CisJdW5zaWduZWQgc2hvcnQJYmxmX3R5cGU7CS8qIGJ1ZiBsb2cgaXRlbSB0eXBlIGluZGljYXRvciAqLworCXVuc2lnbmVkIHNob3J0CWJsZl9zaXplOwkvKiBzaXplIG9mIHRoaXMgaXRlbSAqLworCV9faW50MzJfdAlibGZfYmxrbm87CS8qIHN0YXJ0aW5nIGJsa25vIG9mIHRoaXMgYnVmICovCisJdXNob3J0CQlibGZfZmxhZ3M7CS8qIG1pc2Mgc3RhdGUgKi8KKwl1c2hvcnQJCWJsZl9sZW47CS8qIG51bWJlciBvZiBibG9ja3MgaW4gdGhpcyBidWYgKi8KKwl1bnNpZ25lZCBpbnQJYmxmX21hcF9zaXplOwkvKiBzaXplIG9mIGRhdGEgYml0bWFwIGluIHdvcmRzICovCisJdW5zaWduZWQgaW50CWJsZl9kYXRhX21hcFsxXTsvKiB2YXJpYWJsZSBzaXplIGJpdG1hcCBvZiAqLworCQkJCQkvKiAgIHJlZ2lvbnMgb2YgYnVmZmVyIGluIHRoaXMgaXRlbSAqLworfSB4ZnNfYnVmX2xvZ19mb3JtYXRfdjFfdDsKKworLyoKKyAqIFRoaXMgaXMgYSBmb3JtIG9mIHRoZSBhYm92ZSBzdHJ1Y3R1cmUgd2l0aCBhIDY0IGJpdCBibGtubyBmaWVsZC4KKyAqIEZvciA2LjIgYW5kIGJleW9uZCwgdGhpcyBpcyBYRlNfTElfQlVGLiAgV2UgdXNlIHRoaXMgdG8gbG9nIGV2ZXJ5dGhpbmcuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19idWZfbG9nX2Zvcm1hdF90IHsKKwl1bnNpZ25lZCBzaG9ydAlibGZfdHlwZTsJLyogYnVmIGxvZyBpdGVtIHR5cGUgaW5kaWNhdG9yICovCisJdW5zaWduZWQgc2hvcnQJYmxmX3NpemU7CS8qIHNpemUgb2YgdGhpcyBpdGVtICovCisJdXNob3J0CQlibGZfZmxhZ3M7CS8qIG1pc2Mgc3RhdGUgKi8KKwl1c2hvcnQJCWJsZl9sZW47CS8qIG51bWJlciBvZiBibG9ja3MgaW4gdGhpcyBidWYgKi8KKwlfX2ludDY0X3QJYmxmX2Jsa25vOwkvKiBzdGFydGluZyBibGtubyBvZiB0aGlzIGJ1ZiAqLworCXVuc2lnbmVkIGludAlibGZfbWFwX3NpemU7CS8qIHNpemUgb2YgZGF0YSBiaXRtYXAgaW4gd29yZHMgKi8KKwl1bnNpZ25lZCBpbnQJYmxmX2RhdGFfbWFwWzFdOy8qIHZhcmlhYmxlIHNpemUgYml0bWFwIG9mICovCisJCQkJCS8qICAgcmVnaW9ucyBvZiBidWZmZXIgaW4gdGhpcyBpdGVtICovCit9IHhmc19idWZfbG9nX2Zvcm1hdF90OworCisvKgorICogVGhpcyBmbGFnIGluZGljYXRlcyB0aGF0IHRoZSBidWZmZXIgY29udGFpbnMgb24gZGlzayBpbm9kZXMKKyAqIGFuZCByZXF1aXJlcyBzcGVjaWFsIHJlY292ZXJ5IGhhbmRsaW5nLgorICovCisjZGVmaW5lCVhGU19CTElfSU5PREVfQlVGCTB4MQorLyoKKyAqIFRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgYnVmZmVyIHNob3VsZCBub3QgYmUgcmVwbGF5ZWQKKyAqIGR1cmluZyByZWNvdmVyeSBiZWNhdXNlIGl0cyBibG9ja3MgYXJlIGJlaW5nIGZyZWVkLgorICovCisjZGVmaW5lCVhGU19CTElfQ0FOQ0VMCQkweDIKKy8qCisgKiBUaGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIGJ1ZmZlciBjb250YWlucyBvbiBkaXNrCisgKiB1c2VyIG9yIGdyb3VwIGRxdW90cyBhbmQgbWF5IHJlcXVpcmUgc3BlY2lhbCByZWNvdmVyeSBoYW5kbGluZy4KKyAqLworI2RlZmluZQlYRlNfQkxJX1VEUVVPVF9CVUYJMHg0CisvKiAjZGVmaW5lIFhGU19CTElfUERRVU9UX0JVRgkweDggKi8KKyNkZWZpbmUJWEZTX0JMSV9HRFFVT1RfQlVGCTB4MTAKKworI2RlZmluZQlYRlNfQkxJX0NIVU5LCQkxMjgKKyNkZWZpbmUJWEZTX0JMSV9TSElGVAkJNworI2RlZmluZQlCSVRfVE9fV09SRF9TSElGVAk1CisjZGVmaW5lCU5CV09SRAkJCShOQkJZICogc2l6ZW9mKHVuc2lnbmVkIGludCkpCisKKy8qCisgKiBidWYgbG9nIGl0ZW0gZmxhZ3MKKyAqLworI2RlZmluZQlYRlNfQkxJX0hPTEQJCTB4MDEKKyNkZWZpbmUJWEZTX0JMSV9ESVJUWQkJMHgwMgorI2RlZmluZQlYRlNfQkxJX1NUQUxFCQkweDA0CisjZGVmaW5lCVhGU19CTElfTE9HR0VECQkweDA4CisjZGVmaW5lCVhGU19CTElfSU5PREVfQUxMT0NfQlVGCTB4MTAKKyNkZWZpbmUgWEZTX0JMSV9TVEFMRV9JTk9ERQkweDIwCisKKworI2lmZGVmIF9fS0VSTkVMX18KKworc3RydWN0IHhmc19idWY7CitzdHJ1Y3Qga3RyYWNlOworc3RydWN0IHhmc19tb3VudDsKK3N0cnVjdCB4ZnNfYnVmX2xvZ19pdGVtOworCisjaWYgZGVmaW5lZChYRlNfQkxJX1RSQUNFKQorI2RlZmluZQlYRlNfQkxJX1RSQUNFX1NJWkUJMzIKKwordm9pZAl4ZnNfYnVmX2l0ZW1fdHJhY2UoY2hhciAqLCBzdHJ1Y3QgeGZzX2J1Zl9sb2dfaXRlbSAqKTsKKyNlbHNlCisjZGVmaW5lCXhmc19idWZfaXRlbV90cmFjZShpZCwgYmlwKQorI2VuZGlmCisKKy8qCisgKiBUaGlzIGlzIHRoZSBpbiBjb3JlIGxvZyBpdGVtIHN0cnVjdHVyZSB1c2VkIHRvIHRyYWNrIGluZm9ybWF0aW9uCisgKiBuZWVkZWQgdG8gbG9nIGJ1ZmZlcnMuICBJdCB0cmFja3MgaG93IG1hbnkgdGltZXMgdGhlIGxvY2sgaGFzIGJlZW4KKyAqIGxvY2tlZCwgYW5kIHdoaWNoIDEyOCBieXRlIGNodW5rcyBvZiB0aGUgYnVmZmVyIGFyZSBkaXJ0eS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2J1Zl9sb2dfaXRlbSB7CisJeGZzX2xvZ19pdGVtX3QJCWJsaV9pdGVtOwkvKiBjb21tb24gaXRlbSBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgeGZzX2J1ZgkJKmJsaV9idWY7CS8qIHJlYWwgYnVmZmVyIHBvaW50ZXIgKi8KKwl1bnNpZ25lZCBpbnQJCWJsaV9mbGFnczsJLyogbWlzYyBmbGFncyAqLworCXVuc2lnbmVkIGludAkJYmxpX3JlY3VyOwkvKiBsb2NrIHJlY3Vyc2lvbiBjb3VudCAqLworCWF0b21pY190CQlibGlfcmVmY291bnQ7CS8qIGNudCBvZiB0cCByZWZzICovCisjaWZkZWYgWEZTX0JMSV9UUkFDRQorCXN0cnVjdCBrdHJhY2UJCSpibGlfdHJhY2U7CS8qIGV2ZW50IHRyYWNlIGJ1ZiAqLworI2VuZGlmCisjaWZkZWYgWEZTX1RSQU5TX0RFQlVHCisJY2hhcgkJCSpibGlfb3JpZzsJLyogb3JpZ2luYWwgYnVmZmVyIGNvcHkgKi8KKwljaGFyCQkJKmJsaV9sb2dnZWQ7CS8qIGJ5dGVzIGxvZ2dlZCAoYml0bWFwKSAqLworI2VuZGlmCisJeGZzX2J1Zl9sb2dfZm9ybWF0X3QJYmxpX2Zvcm1hdDsJLyogaW4tbG9nIGhlYWRlciAqLworfSB4ZnNfYnVmX2xvZ19pdGVtX3Q7CisKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGR1cmluZyByZWNvdmVyeSB0byByZWNvcmQgdGhlIGJ1ZiBsb2cKKyAqIGl0ZW1zIHdoaWNoIGhhdmUgYmVlbiBjYW5jZWxlZCBhbmQgc2hvdWxkIG5vdCBiZSByZXBsYXllZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2J1Zl9jYW5jZWwgeworCXhmc19kYWRkcl90CQliY19ibGtubzsKKwl1aW50CQkJYmNfbGVuOworCWludAkJCWJjX3JlZmNvdW50OworCXN0cnVjdCB4ZnNfYnVmX2NhbmNlbAkqYmNfbmV4dDsKK30geGZzX2J1Zl9jYW5jZWxfdDsKKwordm9pZAl4ZnNfYnVmX2l0ZW1faW5pdChzdHJ1Y3QgeGZzX2J1ZiAqLCBzdHJ1Y3QgeGZzX21vdW50ICopOwordm9pZAl4ZnNfYnVmX2l0ZW1fcmVsc2Uoc3RydWN0IHhmc19idWYgKik7Cit2b2lkCXhmc19idWZfaXRlbV9sb2coeGZzX2J1Zl9sb2dfaXRlbV90ICosIHVpbnQsIHVpbnQpOwordWludAl4ZnNfYnVmX2l0ZW1fZGlydHkoeGZzX2J1Zl9sb2dfaXRlbV90ICopOwordm9pZAl4ZnNfYnVmX2F0dGFjaF9pb2RvbmUoc3RydWN0IHhmc19idWYgKiwKKwkJCSAgICAgIHZvaWQoKikoc3RydWN0IHhmc19idWYgKiwgeGZzX2xvZ19pdGVtX3QgKiksCisJCQkgICAgICB4ZnNfbG9nX2l0ZW1fdCAqKTsKK3ZvaWQJeGZzX2J1Zl9pb2RvbmVfY2FsbGJhY2tzKHN0cnVjdCB4ZnNfYnVmICopOwordm9pZAl4ZnNfYnVmX2lvZG9uZShzdHJ1Y3QgeGZzX2J1ZiAqLCB4ZnNfYnVmX2xvZ19pdGVtX3QgKik7CisKKyNpZmRlZiBYRlNfVFJBTlNfREVCVUcKK3ZvaWQKK3hmc19idWZfaXRlbV9mbHVzaF9sb2dfZGVidWcoCisJc3RydWN0IHhmc19idWYgKmJwLAorCXVpbnQJZmlyc3QsCisJdWludAlsYXN0KTsKKyNlbHNlCisjZGVmaW5lCXhmc19idWZfaXRlbV9mbHVzaF9sb2dfZGVidWcoYnAsIGZpcnN0LCBsYXN0KQorI2VuZGlmCisKKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZgkvKiBfX1hGU19CVUZfSVRFTV9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfY2FwLmggYi9mcy94ZnMveGZzX2NhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZWFjNzMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2NhcC5oCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX0NBUF9IX18KKyNkZWZpbmUgX19YRlNfQ0FQX0hfXworCisvKgorICogQ2FwYWJpbGl0aWVzCisgKi8KK3R5cGVkZWYgX191aW50NjRfdCB4ZnNfY2FwX3ZhbHVlX3Q7CisKK3R5cGVkZWYgc3RydWN0IHhmc19jYXBfc2V0IHsKKwl4ZnNfY2FwX3ZhbHVlX3QJY2FwX2VmZmVjdGl2ZTsJLyogdXNlIGluIGNhcGFiaWxpdHkgY2hlY2tzICovCisJeGZzX2NhcF92YWx1ZV90CWNhcF9wZXJtaXR0ZWQ7CS8qIGNvbWJpbmVkIHdpdGggZmlsZSBhdHRycyAqLworCXhmc19jYXBfdmFsdWVfdAljYXBfaW5oZXJpdGFibGU7LyogcGFzcyB0aHJvdWdoIGV4ZWMgKi8KK30geGZzX2NhcF9zZXRfdDsKKworLyogT24tZGlzayBYRlMgZXh0ZW5kZWQgYXR0cmlidXRlIG5hbWVzICovCisjZGVmaW5lIFNHSV9DQVBfRklMRQkiU0dJX0NBUF9GSUxFIgorI2RlZmluZSBTR0lfQ0FQX0ZJTEVfU0laRQkoc2l6ZW9mKFNHSV9DQVBfRklMRSktMSkKKyNkZWZpbmUgU0dJX0NBUF9MSU5VWAkiU0dJX0NBUF9MSU5VWCIKKyNkZWZpbmUgU0dJX0NBUF9MSU5VWF9TSVpFCShzaXplb2YoU0dJX0NBUF9MSU5VWCktMSkKKworLyoKKyAqIEZvciBMaW51eCwgd2UgdGFrZSB0aGUgYml0ZmllbGRzIGRpcmVjdGx5IGZyb20gY2FwYWJpbGl0eS5oCisgKiBhbmQgbm8gbG9uZ2VyIGF0dGVtcHQgdG8ga2VlcCB0aGlzIGF0dHJpYnV0ZSBvbmRpc2sgY29tcGF0aWJsZQorICogd2l0aCBJUklYLiAgU2luY2UgdGhpcyBhdHRyaWJ1dGUgaXMgb25seSBzZXQgb24gZXhlY3R1YWJsZXMsCisgKiBpdCBqdXN0IGRvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlIHRvIHRyeS4gIFdlIGRvIHVzZSBhIGRpZmZlcmVudAorICogbmFtZWQgYXR0cmlidXRlIHRob3VnaCwgdG8gYXZvaWQgY29uZnVzaW9uLgorICovCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpZmRlZiBDT05GSUdfRlNfUE9TSVhfQ0FQCisKKyNpbmNsdWRlIDxsaW51eC9wb3NpeF9jYXBfeGF0dHIuaD4KKworc3RydWN0IHZub2RlOworCitleHRlcm4gaW50IHhmc19jYXBfdmhhc2NhcChzdHJ1Y3Qgdm5vZGUgKik7CitleHRlcm4gaW50IHhmc19jYXBfdnNldChzdHJ1Y3Qgdm5vZGUgKiwgdm9pZCAqLCBzaXplX3QpOworZXh0ZXJuIGludCB4ZnNfY2FwX3ZnZXQoc3RydWN0IHZub2RlICosIHZvaWQgKiwgc2l6ZV90KTsKK2V4dGVybiBpbnQgeGZzX2NhcF92cmVtb3ZlKHN0cnVjdCB2bm9kZSAqdnApOworCisjZGVmaW5lIF9DQVBfRVhJU1RTCQl4ZnNfY2FwX3ZoYXNjYXAKKworI2Vsc2UKKyNkZWZpbmUgeGZzX2NhcF92c2V0KHYscCxzeikJKC1FT1BOT1RTVVBQKQorI2RlZmluZSB4ZnNfY2FwX3ZnZXQodixwLHN6KQkoLUVPUE5PVFNVUFApCisjZGVmaW5lIHhmc19jYXBfdnJlbW92ZSh2KQkoLUVPUE5PVFNVUFApCisjZGVmaW5lIF9DQVBfRVhJU1RTCQkoTlVMTCkKKyNlbmRpZgorCisjZW5kaWYJLyogX19LRVJORUxfXyAqLworCisjZW5kaWYgIC8qIF9fWEZTX0NBUF9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfY2xudC5oIGIvZnMveGZzL3hmc19jbG50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMyMTVmZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfY2xudC5oCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19DTE5UX0hfXworI2RlZmluZSBfX1hGU19DTE5UX0hfXworCisvKgorICogWEZTIGFyZ3VtZW50cyBzdHJ1Y3R1cmUsIGNvbnN0cnVjdGVkIGZyb20gdGhlIGFyZ3VtZW50cyB3ZQorICogYXJlIHBhc3NlZCB2aWEgdGhlIG1vdW50IHN5c3RlbSBjYWxsLgorICoKKyAqIE5PVEU6IFRoZSBtb3VudCBzeXN0ZW0gY2FsbCBpcyBoYW5kbGVkIGRpZmZlcmVudGx5IGJldHdlZW4KKyAqIExpbnV4IGFuZCBJUklYLiAgSW4gSVJJWCB3ZSB3b3JrZWQgd29yayB3aXRoIGEgYmluYXJ5IGRhdGEKKyAqIHN0cnVjdHVyZSBjb21pbmcgaW4gYWNyb3NzIHRoZSBzeXNjYWxsIGludGVyZmFjZSBmcm9tIHVzZXIKKyAqIHNwYWNlICh0aGUgbW91bnQgdXNlcnNwYWNlIGtub3dzIGFib3V0IGVhY2ggZmlsZXN5c3RlbSB0eXBlCisgKiBhbmQgdGhlIHNldCBvZiB2YWxpZCBvcHRpb25zIGZvciBpdCwgYW5kIGNvbnZlcnRzIHRoZSB1c2VycworICogYXJndW1lbnQgc3RyaW5nIGludG8gYSBiaW5hcnkgc3RydWN0dXJlIF9iZWZvcmVfIG1ha2luZyB0aGUKKyAqIHN5c3RlbSBjYWxsKSwgYW5kIHRoZSBBQkkgaXNzdWVzIHRoYXQgdGhpcyBpbXBsaWVzLgorICoKKyAqIEluIExpbnV4LCB3ZSBhcmUgcGFzc2VkIGEgY29tbWEgc2VwYXJhdGVkIHNldCBvZiBvcHRpb25zOworICogaWUuIGEgTlVMTCB0ZXJtaW5hdGVkIHN0cmluZyBvZiBjaGFyYWN0ZXJzLiAgVXNlcnNwYWNlIG1vdW50CisgKiBjb2RlIGRvZXMgbm90IGhhdmUgYW55IGtub3dsZWRnZSBvZiBtb3VudCBvcHRpb25zIGV4cGVjdGVkIGJ5CisgKiBlYWNoIGZpbGVzeXN0ZW0gdHlwZSBhbmQgc28gZWFjaCBmaWxlc3lzdGVtIHBhcnNlcyBpdHMgbW91bnQKKyAqIG9wdGlvbnMgaW4ga2VybmVsIHNwYWNlLgorICoKKyAqIEZvciB0aGUgTGludXggcG9ydCwgd2Uga2VwdCB0aGlzIHN0cnVjdHVyZSBwcmV0dHkgbXVjaCBpbnRhY3QKKyAqIGFuZCB1c2UgaXQgaW50ZXJuYWxseSAoYmVjYXVzZSB0aGUgZXhpc3RpbmcgY29kZSBncm9rcyBpdCkuCisgKi8KK3N0cnVjdCB4ZnNfbW91bnRfYXJncyB7CisJaW50CWZsYWdzOwkJLyogZmxhZ3MgLT4gc2VlIFhGU01OVF8uLi4gbWFjcm9zIGJlbG93ICovCisJaW50CWxvZ2J1ZnM7CS8qIE51bWJlciBvZiBsb2cgYnVmZmVycywgLTEgdG8gZGVmYXVsdCAqLworCWludAlsb2didWZzaXplOwkvKiBTaXplIG9mIGxvZyBidWZmZXJzLCAtMSB0byBkZWZhdWx0ICovCisJY2hhcglmc25hbWVbTUFYTkFNRUxFTisxXTsJLyogZGF0YSBkZXZpY2UgbmFtZSAqLworCWNoYXIJcnRuYW1lW01BWE5BTUVMRU4rMV07CS8qIHJlYWx0aW1lIGRldmljZSBmaWxlbmFtZSAqLworCWNoYXIJbG9nbmFtZVtNQVhOQU1FTEVOKzFdOwkvKiBqb3VybmFsIGRldmljZSBmaWxlbmFtZSAqLworCWNoYXIJbXRwdFtNQVhOQU1FTEVOKzFdOwkvKiBmaWxlc3lzdGVtIG1vdW50IHBvaW50ICovCisJaW50CXN1bml0OwkJLyogc3RyaXBlIHVuaXQgKEJCcykgKi8KKwlpbnQJc3dpZHRoOwkJLyogc3RyaXBlIHdpZHRoIChCQnMpLCBtdWx0aXBsZSBvZiBzdW5pdCAqLworCXVjaGFyX3QgaW9zaXplbG9nOwkvKiBsb2cyIG9mIHRoZSBwcmVmZXJyZWQgSS9PIHNpemUgKi8KKwlpbnQJaWhhc2hzaXplOwkvKiBpbm9kZSBoYXNoIHRhYmxlIHNpemUgKGJ1Y2tldHMpICovCit9OworCisvKgorICogWEZTIG1vdW50IG9wdGlvbiBmbGFncworICovCisjZGVmaW5lCVhGU01OVF9DSEtMT0cJCTB4MDAwMDAwMDEJLyogY2hlY2sgbG9nICovCisjZGVmaW5lCVhGU01OVF9XU1lOQwkJMHgwMDAwMDAwMgkvKiBzYWZlIG1vZGUgbmZzIG1vdW50CisJCQkJCQkgKiBjb21wYXRpYmxlICovCisjZGVmaW5lCVhGU01OVF9JTk82NAkJMHgwMDAwMDAwNAkvKiBtb3ZlIGlub2RlIG51bWJlcnMgdXAKKwkJCQkJCSAqIHBhc3QgMl4zMiAqLworI2RlZmluZSBYRlNNTlRfVVFVT1RBCQkweDAwMDAwMDA4CS8qIHVzZXIgcXVvdGEgYWNjb3VudGluZyAqLworI2RlZmluZSBYRlNNTlRfUFFVT1RBCQkweDAwMDAwMDEwCS8qIElSSVggcHJqIHF1b3RhIGFjY291bnRpbmcgKi8KKyNkZWZpbmUgWEZTTU5UX1VRVU9UQUVORgkweDAwMDAwMDIwCS8qIHVzZXIgcXVvdGEgbGltaXQKKwkJCQkJCSAqIGVuZm9yY2VtZW50ICovCisjZGVmaW5lIFhGU01OVF9QUVVPVEFFTkYJMHgwMDAwMDA0MAkvKiBJUklYIHByb2plY3QgcXVvdGEgbGltaXQKKwkJCQkJCSAqIGVuZm9yY2VtZW50ICovCisjZGVmaW5lIFhGU01OVF9OT0FUSU1FCQkweDAwMDAwMTAwCS8qIGRvbid0IG1vZGlmeSBhY2Nlc3MKKwkJCQkJCSAqIHRpbWVzIG9uIHJlYWRzICovCisjZGVmaW5lIFhGU01OVF9OT0FMSUdOCQkweDAwMDAwMjAwCS8qIGRvbid0IGFsbG9jYXRlIGF0CisJCQkJCQkgKiBzdHJpcGUgYm91bmRhcmllcyovCisjZGVmaW5lIFhGU01OVF9SRVRFUlIJCTB4MDAwMDA0MDAJLyogcmV0dXJuIGVycm9yIHRvIHVzZXIgKi8KKyNkZWZpbmUgWEZTTU5UX05PUkVDT1ZFUlkJMHgwMDAwMDgwMAkvKiBubyByZWNvdmVyeSwgaW1wbGllcworCQkJCQkJICogcmVhZC1vbmx5IG1vdW50ICovCisjZGVmaW5lIFhGU01OVF9TSEFSRUQJCTB4MDAwMDEwMDAJLyogc2hhcmVkIFhGUyBtb3VudCAqLworI2RlZmluZSBYRlNNTlRfSU9TSVpFCQkweDAwMDAyMDAwCS8qIG9wdGltaXplIGZvciBJL08gc2l6ZSAqLworI2RlZmluZSBYRlNNTlRfT1NZTkNJU09TWU5DCTB4MDAwMDQwMDAJLyogb19zeW5jIGlzIFJFQUxMWSBvX3N5bmMgKi8KKwkJCQkJCS8qIChvc3luY2lzZHN5bmMgaXMgbm93IGRlZmF1bHQpICovCisjZGVmaW5lIFhGU01OVF8zMkJJVElOT0RFUwkweDAwMjAwMDAwCS8qIHJlc3RyaWN0IGlub2RlcyB0byAzMgorCQkJCQkJICogYml0cyBvZiBhZGRyZXNzIHNwYWNlICovCisjZGVmaW5lIFhGU01OVF9HUVVPVEEJCTB4MDA0MDAwMDAJLyogZ3JvdXAgcXVvdGEgYWNjb3VudGluZyAqLworI2RlZmluZSBYRlNNTlRfR1FVT1RBRU5GCTB4MDA4MDAwMDAJLyogZ3JvdXAgcXVvdGEgbGltaXQKKwkJCQkJCSAqIGVuZm9yY2VtZW50ICovCisjZGVmaW5lIFhGU01OVF9OT1VVSUQJCTB4MDEwMDAwMDAJLyogSWdub3JlIGZzIHV1aWQgKi8KKyNkZWZpbmUgWEZTTU5UX0RNQVBJCQkweDAyMDAwMDAwCS8qIGVuYWJsZSBkbWFwaS94ZHNtICovCisjZGVmaW5lIFhGU01OVF9OT0xPR0ZMVVNICTB4MDQwMDAwMDAJLyogRG9uJ3QgZmx1c2ggZm9yIGxvZyBibG9ja3MgKi8KKyNkZWZpbmUgWEZTTU5UX0lERUxFVEUJCTB4MDgwMDAwMDAJLyogaW5vZGUgY2x1c3RlciBkZWxldGUgKi8KKyNkZWZpbmUgWEZTTU5UX1NXQUxMT0MJCTB4MTAwMDAwMDAJLyogdHVybiBvbiBzdHJpcGUgd2lkdGgKKwkJCQkJCSAqIGFsbG9jYXRpb24gKi8KKyNkZWZpbmUgWEZTTU5UX0lIQVNIU0laRQkweDIwMDAwMDAwCS8qIGlub2RlIGhhc2ggdGFibGUgc2l6ZSAqLworI2RlZmluZSBYRlNNTlRfRElSU1lOQwkJMHg0MDAwMDAwMAkvKiBzeW5jIGNyZWF0LGxpbmssdW5saW5rLHJlbmFtZQorCQkJCQkJICogc3ltbGluayxta2RpcixybWRpcixta25vZCAqLworCisjZW5kaWYJLyogX19YRlNfQ0xOVF9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGFfYnRyZWUuYyBiL2ZzL3hmcy94ZnNfZGFfYnRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2ZlMjg4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19kYV9idHJlZS5jCkBAIC0wLDAgKzEsMjY0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorCisjaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc190eXBlcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19hZy5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19hbGxvYy5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2JtYXAuaCIKKyNpbmNsdWRlICJ4ZnNfZGFfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0ci5oIgorI2luY2x1ZGUgInhmc19hdHRyX2xlYWYuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX2xlYWYuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9kYXRhLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfbGVhZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX2Jsb2NrLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfbm9kZS5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKKworLyoKKyAqIHhmc19kYV9idHJlZS5jCisgKgorICogUm91dGluZXMgdG8gaW1wbGVtZW50IGRpcmVjdG9yaWVzIGFzIEJ0cmVlcyBvZiBoYXNoZWQgbmFtZXMuCisgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIHRoZSBrZXJuZWwuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgKiBSb3V0aW5lcyB1c2VkIGZvciBncm93aW5nIHRoZSBCdHJlZS4KKyAqLworU1RBVElDIGludCB4ZnNfZGFfcm9vdF9zcGxpdCh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUsCisJCQkJCSAgICB4ZnNfZGFfc3RhdGVfYmxrX3QgKmV4aXN0aW5nX3Jvb3QsCisJCQkJCSAgICB4ZnNfZGFfc3RhdGVfYmxrX3QgKm5ld19jaGlsZCk7CitTVEFUSUMgaW50IHhmc19kYV9ub2RlX3NwbGl0KHhmc19kYV9zdGF0ZV90ICpzdGF0ZSwKKwkJCQkJICAgIHhmc19kYV9zdGF0ZV9ibGtfdCAqZXhpc3RpbmdfYmxrLAorCQkJCQkgICAgeGZzX2RhX3N0YXRlX2Jsa190ICpzcGxpdF9ibGssCisJCQkJCSAgICB4ZnNfZGFfc3RhdGVfYmxrX3QgKmJsa190b19hZGQsCisJCQkJCSAgICBpbnQgdHJlZWxldmVsLAorCQkJCQkgICAgaW50ICpyZXN1bHQpOworU1RBVElDIHZvaWQgeGZzX2RhX25vZGVfcmViYWxhbmNlKHhmc19kYV9zdGF0ZV90ICpzdGF0ZSwKKwkJCQkJIHhmc19kYV9zdGF0ZV9ibGtfdCAqbm9kZV9ibGtfMSwKKwkJCQkJIHhmc19kYV9zdGF0ZV9ibGtfdCAqbm9kZV9ibGtfMik7CitTVEFUSUMgdm9pZCB4ZnNfZGFfbm9kZV9hZGQoeGZzX2RhX3N0YXRlX3QgKnN0YXRlLAorCQkJCSAgIHhmc19kYV9zdGF0ZV9ibGtfdCAqb2xkX25vZGVfYmxrLAorCQkJCSAgIHhmc19kYV9zdGF0ZV9ibGtfdCAqbmV3X25vZGVfYmxrKTsKKworLyoKKyAqIFJvdXRpbmVzIHVzZWQgZm9yIHNocmlua2luZyB0aGUgQnRyZWUuCisgKi8KK1NUQVRJQyBpbnQgeGZzX2RhX3Jvb3Rfam9pbih4ZnNfZGFfc3RhdGVfdCAqc3RhdGUsCisJCQkJCSAgIHhmc19kYV9zdGF0ZV9ibGtfdCAqcm9vdF9ibGspOworU1RBVElDIGludCB4ZnNfZGFfbm9kZV90b29zbWFsbCh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUsIGludCAqcmV0dmFsKTsKK1NUQVRJQyB2b2lkIHhmc19kYV9ub2RlX3JlbW92ZSh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUsCisJCQkJCSAgICAgIHhmc19kYV9zdGF0ZV9ibGtfdCAqZHJvcF9ibGspOworU1RBVElDIHZvaWQgeGZzX2RhX25vZGVfdW5iYWxhbmNlKHhmc19kYV9zdGF0ZV90ICpzdGF0ZSwKKwkJCQkJIHhmc19kYV9zdGF0ZV9ibGtfdCAqc3JjX25vZGVfYmxrLAorCQkJCQkgeGZzX2RhX3N0YXRlX2Jsa190ICpkc3Rfbm9kZV9ibGspOworCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqLworU1RBVElDIHVpbnQJeGZzX2RhX25vZGVfbGFzdGhhc2goeGZzX2RhYnVmX3QgKmJwLCBpbnQgKmNvdW50KTsKK1NUQVRJQyBpbnQJeGZzX2RhX25vZGVfb3JkZXIoeGZzX2RhYnVmX3QgKm5vZGUxX2JwLCB4ZnNfZGFidWZfdCAqbm9kZTJfYnApOworU1RBVElDIHhmc19kYWJ1Zl90ICp4ZnNfZGFfYnVmX21ha2UoaW50IG5idWYsIHhmc19idWZfdCAqKmJwcywgaW5zdF90ICpyYSk7CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJvdXRpbmVzIHVzZWQgZm9yIGdyb3dpbmcgdGhlIEJ0cmVlLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICogQ3JlYXRlIHRoZSBpbml0aWFsIGNvbnRlbnRzIG9mIGFuIGludGVybWVkaWF0ZSBub2RlLgorICovCitpbnQKK3hmc19kYV9ub2RlX2NyZWF0ZSh4ZnNfZGFfYXJnc190ICphcmdzLCB4ZnNfZGFibGtfdCBibGtubywgaW50IGxldmVsLAorCQkJCSB4ZnNfZGFidWZfdCAqKmJwcCwgaW50IHdoaWNoZm9yaykKK3sKKwl4ZnNfZGFfaW50bm9kZV90ICpub2RlOworCXhmc19kYWJ1Zl90ICpicDsKKwlpbnQgZXJyb3I7CisJeGZzX3RyYW5zX3QgKnRwOworCisJdHAgPSBhcmdzLT50cmFuczsKKwllcnJvciA9IHhmc19kYV9nZXRfYnVmKHRwLCBhcmdzLT5kcCwgYmxrbm8sIC0xLCAmYnAsIHdoaWNoZm9yayk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4oZXJyb3IpOworCUFTU0VSVChicCAhPSBOVUxMKTsKKwlub2RlID0gYnAtPmRhdGE7CisJbm9kZS0+aGRyLmluZm8uZm9ydyA9IDA7CisJbm9kZS0+aGRyLmluZm8uYmFjayA9IDA7CisJSU5UX1NFVChub2RlLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJULCBYRlNfREFfTk9ERV9NQUdJQyk7CisJbm9kZS0+aGRyLmluZm8ucGFkID0gMDsKKwlub2RlLT5oZHIuY291bnQgPSAwOworCUlOVF9TRVQobm9kZS0+aGRyLmxldmVsLCBBUkNIX0NPTlZFUlQsIGxldmVsKTsKKworCXhmc19kYV9sb2dfYnVmKHRwLCBicCwKKwkJWEZTX0RBX0xPR1JBTkdFKG5vZGUsICZub2RlLT5oZHIsIHNpemVvZihub2RlLT5oZHIpKSk7CisKKwkqYnBwID0gYnA7CisJcmV0dXJuKDApOworfQorCisvKgorICogU3BsaXQgYSBsZWFmIG5vZGUsIHJlYmFsYW5jZSwgdGhlbiBwb3NzaWJseSBzcGxpdAorICogaW50ZXJtZWRpYXRlIG5vZGVzLCByZWJhbGFuY2UsIGV0Yy4KKyAqLworaW50CQkJCQkJCS8qIGVycm9yICovCit4ZnNfZGFfc3BsaXQoeGZzX2RhX3N0YXRlX3QgKnN0YXRlKQoreworCXhmc19kYV9zdGF0ZV9ibGtfdCAqb2xkYmxrLCAqbmV3YmxrLCAqYWRkYmxrOworCXhmc19kYV9pbnRub2RlX3QgKm5vZGU7CisJeGZzX2RhYnVmX3QgKmJwOworCWludCBtYXgsIGFjdGlvbiwgZXJyb3IsIGk7CisKKwkvKgorCSAqIFdhbGsgYmFjayB1cCB0aGUgdHJlZSBzcGxpdHRpbmcvaW5zZXJ0aW5nL2FkanVzdGluZyBhcyBuZWNlc3NhcnkuCisJICogSWYgd2UgbmVlZCB0byBpbnNlcnQgYW5kIHRoZXJlIGlzbid0IHJvb20sIHNwbGl0IHRoZSBub2RlLCB0aGVuCisJICogZGVjaWRlIHdoaWNoIGZyYWdtZW50IHRvIGluc2VydCB0aGUgbmV3IGJsb2NrIGZyb20gYmVsb3cgaW50by4KKwkgKiBOb3RlIHRoYXQgd2UgbWF5IHNwbGl0IHRoZSByb290IHRoaXMgd2F5LCBidXQgd2UgbmVlZCBtb3JlIGZpeHVwLgorCSAqLworCW1heCA9IHN0YXRlLT5wYXRoLmFjdGl2ZSAtIDE7CisJQVNTRVJUKChtYXggPj0gMCkgJiYgKG1heCA8IFhGU19EQV9OT0RFX01BWERFUFRIKSk7CisJQVNTRVJUKHN0YXRlLT5wYXRoLmJsa1ttYXhdLm1hZ2ljID09IFhGU19BVFRSX0xFQUZfTUFHSUMgfHwKKwkgICAgICAgc3RhdGUtPnBhdGguYmxrW21heF0ubWFnaWMgPT0gWEZTX0RJUlhfTEVBRl9NQUdJQyhzdGF0ZS0+bXApKTsKKworCWFkZGJsayA9ICZzdGF0ZS0+cGF0aC5ibGtbbWF4XTsJCS8qIGluaXRpYWwgZHVtbXkgdmFsdWUgKi8KKwlmb3IgKGkgPSBtYXg7IChpID49IDApICYmIGFkZGJsazsgc3RhdGUtPnBhdGguYWN0aXZlLS0sIGktLSkgeworCQlvbGRibGsgPSAmc3RhdGUtPnBhdGguYmxrW2ldOworCQluZXdibGsgPSAmc3RhdGUtPmFsdHBhdGguYmxrW2ldOworCisJCS8qCisJCSAqIElmIGEgbGVhZiBub2RlIHRoZW4KKwkJICogICAgIEFsbG9jYXRlIGEgbmV3IGxlYWYgbm9kZSwgdGhlbiByZWJhbGFuY2UgYWNyb3NzIHRoZW0uCisJCSAqIGVsc2UgaWYgYW4gaW50ZXJtZWRpYXRlIG5vZGUgdGhlbgorCQkgKiAgICAgV2Ugc3BsaXQgb24gdGhlIGxhc3QgbGF5ZXIsIG11c3Qgd2Ugc3BsaXQgdGhlIG5vZGU/CisJCSAqLworCQlzd2l0Y2ggKG9sZGJsay0+bWFnaWMpIHsKKwkJY2FzZSBYRlNfQVRUUl9MRUFGX01BR0lDOgorI2lmbmRlZiBfX0tFUk5FTF9fCisJCQlyZXR1cm4oRU5PVFRZKTsKKyNlbHNlCisJCQllcnJvciA9IHhmc19hdHRyX2xlYWZfc3BsaXQoc3RhdGUsIG9sZGJsaywgbmV3YmxrKTsKKwkJCWlmICgoZXJyb3IgIT0gMCkgJiYgKGVycm9yICE9IEVOT1NQQykpIHsKKwkJCQlyZXR1cm4oZXJyb3IpOwkvKiBHUk9UOiBhdHRyIGlzIGluY29uc2lzdGVudCAqLworCQkJfQorCQkJaWYgKCFlcnJvcikgeworCQkJCWFkZGJsayA9IG5ld2JsazsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qCisJCQkgKiBFbnRyeSB3b3VsZG4ndCBmaXQsIHNwbGl0IHRoZSBsZWFmIGFnYWluLgorCQkJICovCisJCQlzdGF0ZS0+ZXh0cmF2YWxpZCA9IDE7CisJCQlpZiAoc3RhdGUtPmlubGVhZikgeworCQkJCXN0YXRlLT5leHRyYWFmdGVyID0gMDsJLyogYmVmb3JlIG5ld2JsayAqLworCQkJCWVycm9yID0geGZzX2F0dHJfbGVhZl9zcGxpdChzdGF0ZSwgb2xkYmxrLAorCQkJCQkJCSAgICAmc3RhdGUtPmV4dHJhYmxrKTsKKwkJCX0gZWxzZSB7CisJCQkJc3RhdGUtPmV4dHJhYWZ0ZXIgPSAxOwkvKiBhZnRlciBuZXdibGsgKi8KKwkJCQllcnJvciA9IHhmc19hdHRyX2xlYWZfc3BsaXQoc3RhdGUsIG5ld2JsaywKKwkJCQkJCQkgICAgJnN0YXRlLT5leHRyYWJsayk7CisJCQl9CisJCQlpZiAoZXJyb3IpCisJCQkJcmV0dXJuKGVycm9yKTsJLyogR1JPVDogYXR0ciBpbmNvbnNpc3RlbnQgKi8KKwkJCWFkZGJsayA9IG5ld2JsazsKKwkJCWJyZWFrOworI2VuZGlmCisJCWNhc2UgWEZTX0RJUl9MRUFGX01BR0lDOgorCQkJQVNTRVJUKFhGU19ESVJfSVNfVjEoc3RhdGUtPm1wKSk7CisJCQllcnJvciA9IHhmc19kaXJfbGVhZl9zcGxpdChzdGF0ZSwgb2xkYmxrLCBuZXdibGspOworCQkJaWYgKChlcnJvciAhPSAwKSAmJiAoZXJyb3IgIT0gRU5PU1BDKSkgeworCQkJCXJldHVybihlcnJvcik7CS8qIEdST1Q6IGRpciBpcyBpbmNvbnNpc3RlbnQgKi8KKwkJCX0KKwkJCWlmICghZXJyb3IpIHsKKwkJCQlhZGRibGsgPSBuZXdibGs7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKgorCQkJICogRW50cnkgd291bGRuJ3QgZml0LCBzcGxpdCB0aGUgbGVhZiBhZ2Fpbi4KKwkJCSAqLworCQkJc3RhdGUtPmV4dHJhdmFsaWQgPSAxOworCQkJaWYgKHN0YXRlLT5pbmxlYWYpIHsKKwkJCQlzdGF0ZS0+ZXh0cmFhZnRlciA9IDA7CS8qIGJlZm9yZSBuZXdibGsgKi8KKwkJCQllcnJvciA9IHhmc19kaXJfbGVhZl9zcGxpdChzdGF0ZSwgb2xkYmxrLAorCQkJCQkJCSAgICZzdGF0ZS0+ZXh0cmFibGspOworCQkJCWlmIChlcnJvcikKKwkJCQkJcmV0dXJuKGVycm9yKTsJLyogR1JPVDogZGlyIGluY29uLiAqLworCQkJCWFkZGJsayA9IG5ld2JsazsKKwkJCX0gZWxzZSB7CisJCQkJc3RhdGUtPmV4dHJhYWZ0ZXIgPSAxOwkvKiBhZnRlciBuZXdibGsgKi8KKwkJCQllcnJvciA9IHhmc19kaXJfbGVhZl9zcGxpdChzdGF0ZSwgbmV3YmxrLAorCQkJCQkJCSAgICZzdGF0ZS0+ZXh0cmFibGspOworCQkJCWlmIChlcnJvcikKKwkJCQkJcmV0dXJuKGVycm9yKTsJLyogR1JPVDogZGlyIGluY29uLiAqLworCQkJCWFkZGJsayA9IG5ld2JsazsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFhGU19ESVIyX0xFQUZOX01BR0lDOgorCQkJQVNTRVJUKFhGU19ESVJfSVNfVjIoc3RhdGUtPm1wKSk7CisJCQllcnJvciA9IHhmc19kaXIyX2xlYWZuX3NwbGl0KHN0YXRlLCBvbGRibGssIG5ld2Jsayk7CisJCQlpZiAoZXJyb3IpCisJCQkJcmV0dXJuIGVycm9yOworCQkJYWRkYmxrID0gbmV3YmxrOworCQkJYnJlYWs7CisJCWNhc2UgWEZTX0RBX05PREVfTUFHSUM6CisJCQllcnJvciA9IHhmc19kYV9ub2RlX3NwbGl0KHN0YXRlLCBvbGRibGssIG5ld2JsaywgYWRkYmxrLAorCQkJCQkJCSBtYXggLSBpLCAmYWN0aW9uKTsKKwkJCXhmc19kYV9idWZfZG9uZShhZGRibGstPmJwKTsKKwkJCWFkZGJsay0+YnAgPSBOVUxMOworCQkJaWYgKGVycm9yKQorCQkJCXJldHVybihlcnJvcik7CS8qIEdST1Q6IGRpciBpcyBpbmNvbnNpc3RlbnQgKi8KKwkJCS8qCisJCQkgKiBSZWNvcmQgdGhlIG5ld2x5IHNwbGl0IGJsb2NrIGZvciB0aGUgbmV4dCB0aW1lIHRocnU/CisJCQkgKi8KKwkJCWlmIChhY3Rpb24pCisJCQkJYWRkYmxrID0gbmV3YmxrOworCQkJZWxzZQorCQkJCWFkZGJsayA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIFVwZGF0ZSB0aGUgYnRyZWUgdG8gc2hvdyB0aGUgbmV3IGhhc2h2YWwgZm9yIHRoaXMgY2hpbGQuCisJCSAqLworCQl4ZnNfZGFfZml4aGFzaHBhdGgoc3RhdGUsICZzdGF0ZS0+cGF0aCk7CisJCS8qCisJCSAqIElmIHdlIHdvbid0IG5lZWQgdGhpcyBibG9jayBhZ2FpbiwgaXQncyBnZXR0aW5nIGRyb3BwZWQKKwkJICogZnJvbSB0aGUgYWN0aXZlIHBhdGggYnkgdGhlIGxvb3AgY29udHJvbCwgc28gd2UgbmVlZAorCQkgKiB0byBtYXJrIGl0IGRvbmUgbm93LgorCQkgKi8KKwkJaWYgKGkgPiAwIHx8ICFhZGRibGspCisJCQl4ZnNfZGFfYnVmX2RvbmUob2xkYmxrLT5icCk7CisJfQorCWlmICghYWRkYmxrKQorCQlyZXR1cm4oMCk7CisKKwkvKgorCSAqIFNwbGl0IHRoZSByb290IG5vZGUuCisJICovCisJQVNTRVJUKHN0YXRlLT5wYXRoLmFjdGl2ZSA9PSAwKTsKKwlvbGRibGsgPSAmc3RhdGUtPnBhdGguYmxrWzBdOworCWVycm9yID0geGZzX2RhX3Jvb3Rfc3BsaXQoc3RhdGUsIG9sZGJsaywgYWRkYmxrKTsKKwlpZiAoZXJyb3IpIHsKKwkJeGZzX2RhX2J1Zl9kb25lKG9sZGJsay0+YnApOworCQl4ZnNfZGFfYnVmX2RvbmUoYWRkYmxrLT5icCk7CisJCWFkZGJsay0+YnAgPSBOVUxMOworCQlyZXR1cm4oZXJyb3IpOwkvKiBHUk9UOiBkaXIgaXMgaW5jb25zaXN0ZW50ICovCisJfQorCisJLyoKKwkgKiBVcGRhdGUgcG9pbnRlcnMgdG8gdGhlIG5vZGUgd2hpY2ggdXNlZCB0byBiZSBibG9jayAwIGFuZAorCSAqIGp1c3QgZ290IGJ1bXBlZCBiZWNhdXNlIG9mIHRoZSBhZGRpdGlvbiBvZiBhIG5ldyByb290IG5vZGUuCisJICogVGhlcmUgbWlnaHQgYmUgdGhyZWUgYmxvY2tzIGludm9sdmVkIGlmIGEgZG91YmxlIHNwbGl0IG9jY3VycmVkLAorCSAqIGFuZCB0aGUgb3JpZ2luYWwgYmxvY2sgMCBjb3VsZCBiZSBhdCBhbnkgcG9zaXRpb24gaW4gdGhlIGxpc3QuCisJICovCisKKwlub2RlID0gb2xkYmxrLT5icC0+ZGF0YTsKKwlpZiAobm9kZS0+aGRyLmluZm8uZm9ydykgeworCQlpZiAoSU5UX0dFVChub2RlLT5oZHIuaW5mby5mb3J3LCBBUkNIX0NPTlZFUlQpID09IGFkZGJsay0+Ymxrbm8pIHsKKwkJCWJwID0gYWRkYmxrLT5icDsKKwkJfSBlbHNlIHsKKwkJCUFTU0VSVChzdGF0ZS0+ZXh0cmF2YWxpZCk7CisJCQlicCA9IHN0YXRlLT5leHRyYWJsay5icDsKKwkJfQorCQlub2RlID0gYnAtPmRhdGE7CisJCUlOVF9TRVQobm9kZS0+aGRyLmluZm8uYmFjaywgQVJDSF9DT05WRVJULCBvbGRibGstPmJsa25vKTsKKwkJeGZzX2RhX2xvZ19idWYoc3RhdGUtPmFyZ3MtPnRyYW5zLCBicCwKKwkJICAgIFhGU19EQV9MT0dSQU5HRShub2RlLCAmbm9kZS0+aGRyLmluZm8sCisJCSAgICBzaXplb2Yobm9kZS0+aGRyLmluZm8pKSk7CisJfQorCW5vZGUgPSBvbGRibGstPmJwLT5kYXRhOworCWlmIChJTlRfR0VUKG5vZGUtPmhkci5pbmZvLmJhY2ssIEFSQ0hfQ09OVkVSVCkpIHsKKwkJaWYgKElOVF9HRVQobm9kZS0+aGRyLmluZm8uYmFjaywgQVJDSF9DT05WRVJUKSA9PSBhZGRibGstPmJsa25vKSB7CisJCQlicCA9IGFkZGJsay0+YnA7CisJCX0gZWxzZSB7CisJCQlBU1NFUlQoc3RhdGUtPmV4dHJhdmFsaWQpOworCQkJYnAgPSBzdGF0ZS0+ZXh0cmFibGsuYnA7CisJCX0KKwkJbm9kZSA9IGJwLT5kYXRhOworCQlJTlRfU0VUKG5vZGUtPmhkci5pbmZvLmZvcncsIEFSQ0hfQ09OVkVSVCwgb2xkYmxrLT5ibGtubyk7CisJCXhmc19kYV9sb2dfYnVmKHN0YXRlLT5hcmdzLT50cmFucywgYnAsCisJCSAgICBYRlNfREFfTE9HUkFOR0Uobm9kZSwgJm5vZGUtPmhkci5pbmZvLAorCQkgICAgc2l6ZW9mKG5vZGUtPmhkci5pbmZvKSkpOworCX0KKwl4ZnNfZGFfYnVmX2RvbmUob2xkYmxrLT5icCk7CisJeGZzX2RhX2J1Zl9kb25lKGFkZGJsay0+YnApOworCWFkZGJsay0+YnAgPSBOVUxMOworCXJldHVybigwKTsKK30KKworLyoKKyAqIFNwbGl0IHRoZSByb290LiAgV2UgaGF2ZSB0byBjcmVhdGUgYSBuZXcgcm9vdCBhbmQgcG9pbnQgdG8gdGhlIHR3bworICogcGFydHMgKHRoZSBzcGxpdCBvbGQgcm9vdCkgdGhhdCB3ZSBqdXN0IGNyZWF0ZWQuICBDb3B5IGJsb2NrIHplcm8gdG8KKyAqIHRoZSBFT0YsIGV4dGVuZGluZyB0aGUgaW5vZGUgaW4gcHJvY2Vzcy4KKyAqLworU1RBVElDIGludAkJCQkJCS8qIGVycm9yICovCit4ZnNfZGFfcm9vdF9zcGxpdCh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUsIHhmc19kYV9zdGF0ZV9ibGtfdCAqYmxrMSwKKwkJCQkgeGZzX2RhX3N0YXRlX2Jsa190ICpibGsyKQoreworCXhmc19kYV9pbnRub2RlX3QgKm5vZGUsICpvbGRyb290OworCXhmc19kYV9hcmdzX3QgKmFyZ3M7CisJeGZzX2RhYmxrX3QgYmxrbm87CisJeGZzX2RhYnVmX3QgKmJwOworCWludCBlcnJvciwgc2l6ZTsKKwl4ZnNfaW5vZGVfdCAqZHA7CisJeGZzX3RyYW5zX3QgKnRwOworCXhmc19tb3VudF90ICptcDsKKwl4ZnNfZGlyMl9sZWFmX3QgKmxlYWY7CisKKwkvKgorCSAqIENvcHkgdGhlIGV4aXN0aW5nIChpbmNvcnJlY3QpIGJsb2NrIGZyb20gdGhlIHJvb3Qgbm9kZSBwb3NpdGlvbgorCSAqIHRvIGEgZnJlZSBzcGFjZSBzb21ld2hlcmUuCisJICovCisJYXJncyA9IHN0YXRlLT5hcmdzOworCUFTU0VSVChhcmdzICE9IE5VTEwpOworCWVycm9yID0geGZzX2RhX2dyb3dfaW5vZGUoYXJncywgJmJsa25vKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybihlcnJvcik7CisJZHAgPSBhcmdzLT5kcDsKKwl0cCA9IGFyZ3MtPnRyYW5zOworCW1wID0gc3RhdGUtPm1wOworCWVycm9yID0geGZzX2RhX2dldF9idWYodHAsIGRwLCBibGtubywgLTEsICZicCwgYXJncy0+d2hpY2hmb3JrKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybihlcnJvcik7CisJQVNTRVJUKGJwICE9IE5VTEwpOworCW5vZGUgPSBicC0+ZGF0YTsKKwlvbGRyb290ID0gYmxrMS0+YnAtPmRhdGE7CisJaWYgKElOVF9HRVQob2xkcm9vdC0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RBX05PREVfTUFHSUMpIHsKKwkJc2l6ZSA9IChpbnQpKChjaGFyICopJm9sZHJvb3QtPmJ0cmVlW0lOVF9HRVQob2xkcm9vdC0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpXSAtCisJCQkgICAgIChjaGFyICopb2xkcm9vdCk7CisJfSBlbHNlIHsKKwkJQVNTRVJUKFhGU19ESVJfSVNfVjIobXApKTsKKwkJQVNTRVJUKElOVF9HRVQob2xkcm9vdC0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfTEVBRk5fTUFHSUMpOworCQlsZWFmID0gKHhmc19kaXIyX2xlYWZfdCAqKW9sZHJvb3Q7CisJCXNpemUgPSAoaW50KSgoY2hhciAqKSZsZWFmLT5lbnRzW0lOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpXSAtCisJCQkgICAgIChjaGFyICopbGVhZik7CisJfQorCW1lbWNweShub2RlLCBvbGRyb290LCBzaXplKTsKKwl4ZnNfZGFfbG9nX2J1Zih0cCwgYnAsIDAsIHNpemUgLSAxKTsKKwl4ZnNfZGFfYnVmX2RvbmUoYmxrMS0+YnApOworCWJsazEtPmJwID0gYnA7CisJYmxrMS0+Ymxrbm8gPSBibGtubzsKKworCS8qCisJICogU2V0IHVwIHRoZSBuZXcgcm9vdCBub2RlLgorCSAqLworCWVycm9yID0geGZzX2RhX25vZGVfY3JlYXRlKGFyZ3MsCisJCWFyZ3MtPndoaWNoZm9yayA9PSBYRlNfREFUQV9GT1JLICYmCisJCVhGU19ESVJfSVNfVjIobXApID8gbXAtPm1fZGlybGVhZmJsayA6IDAsCisJCUlOVF9HRVQobm9kZS0+aGRyLmxldmVsLCBBUkNIX0NPTlZFUlQpICsgMSwgJmJwLCBhcmdzLT53aGljaGZvcmspOworCWlmIChlcnJvcikKKwkJcmV0dXJuKGVycm9yKTsKKwlub2RlID0gYnAtPmRhdGE7CisJSU5UX1NFVChub2RlLT5idHJlZVswXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQsIGJsazEtPmhhc2h2YWwpOworCUlOVF9TRVQobm9kZS0+YnRyZWVbMF0uYmVmb3JlLCBBUkNIX0NPTlZFUlQsIGJsazEtPmJsa25vKTsKKwlJTlRfU0VUKG5vZGUtPmJ0cmVlWzFdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCwgYmxrMi0+aGFzaHZhbCk7CisJSU5UX1NFVChub2RlLT5idHJlZVsxXS5iZWZvcmUsIEFSQ0hfQ09OVkVSVCwgYmxrMi0+Ymxrbm8pOworCUlOVF9TRVQobm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQsIDIpOworCisjaWZkZWYgREVCVUcKKwlpZiAoSU5UX0dFVChvbGRyb290LT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9MRUFGTl9NQUdJQykgeworCQlBU1NFUlQoYmxrMS0+Ymxrbm8gPj0gbXAtPm1fZGlybGVhZmJsayAmJgorCQkgICAgICAgYmxrMS0+Ymxrbm8gPCBtcC0+bV9kaXJmcmVlYmxrKTsKKwkJQVNTRVJUKGJsazItPmJsa25vID49IG1wLT5tX2RpcmxlYWZibGsgJiYKKwkJICAgICAgIGJsazItPmJsa25vIDwgbXAtPm1fZGlyZnJlZWJsayk7CisJfQorI2VuZGlmCisKKwkvKiBIZWFkZXIgaXMgYWxyZWFkeSBsb2dnZWQgYnkgeGZzX2RhX25vZGVfY3JlYXRlICovCisJeGZzX2RhX2xvZ19idWYodHAsIGJwLAorCQlYRlNfREFfTE9HUkFOR0Uobm9kZSwgbm9kZS0+YnRyZWUsCisJCQlzaXplb2YoeGZzX2RhX25vZGVfZW50cnlfdCkgKiAyKSk7CisJeGZzX2RhX2J1Zl9kb25lKGJwKTsKKworCXJldHVybigwKTsKK30KKworLyoKKyAqIFNwbGl0IHRoZSBub2RlLCByZWJhbGFuY2UsIHRoZW4gYWRkIHRoZSBuZXcgZW50cnkuCisgKi8KK1NUQVRJQyBpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2RhX25vZGVfc3BsaXQoeGZzX2RhX3N0YXRlX3QgKnN0YXRlLCB4ZnNfZGFfc3RhdGVfYmxrX3QgKm9sZGJsaywKKwkJCQkgeGZzX2RhX3N0YXRlX2Jsa190ICpuZXdibGssCisJCQkJIHhmc19kYV9zdGF0ZV9ibGtfdCAqYWRkYmxrLAorCQkJCSBpbnQgdHJlZWxldmVsLCBpbnQgKnJlc3VsdCkKK3sKKwl4ZnNfZGFfaW50bm9kZV90ICpub2RlOworCXhmc19kYWJsa190IGJsa25vOworCWludCBuZXdjb3VudCwgZXJyb3I7CisJaW50IHVzZWV4dHJhOworCisJbm9kZSA9IG9sZGJsay0+YnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQobm9kZS0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RBX05PREVfTUFHSUMpOworCisJLyoKKwkgKiBXaXRoIFYyIHRoZSBleHRyYSBibG9jayBpcyBkYXRhIG9yIGZyZWVzcGFjZS4KKwkgKi8KKwl1c2VleHRyYSA9IHN0YXRlLT5leHRyYXZhbGlkICYmIFhGU19ESVJfSVNfVjEoc3RhdGUtPm1wKTsKKwluZXdjb3VudCA9IDEgKyB1c2VleHRyYTsKKwkvKgorCSAqIERvIHdlIGhhdmUgdG8gc3BsaXQgdGhlIG5vZGU/CisJICovCisJaWYgKChJTlRfR0VUKG5vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSArIG5ld2NvdW50KSA+IHN0YXRlLT5ub2RlX2VudHMpIHsKKwkJLyoKKwkJICogQWxsb2NhdGUgYSBuZXcgbm9kZSwgYWRkIHRvIHRoZSBkb3VibHkgbGlua2VkIGNoYWluIG9mCisJCSAqIG5vZGVzLCB0aGVuIG1vdmUgc29tZSBvZiBvdXIgZXhjZXNzIGVudHJpZXMgaW50byBpdC4KKwkJICovCisJCWVycm9yID0geGZzX2RhX2dyb3dfaW5vZGUoc3RhdGUtPmFyZ3MsICZibGtubyk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybihlcnJvcik7CS8qIEdST1Q6IGRpciBpcyBpbmNvbnNpc3RlbnQgKi8KKworCQllcnJvciA9IHhmc19kYV9ub2RlX2NyZWF0ZShzdGF0ZS0+YXJncywgYmxrbm8sIHRyZWVsZXZlbCwKKwkJCQkJICAgJm5ld2Jsay0+YnAsIHN0YXRlLT5hcmdzLT53aGljaGZvcmspOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4oZXJyb3IpOwkvKiBHUk9UOiBkaXIgaXMgaW5jb25zaXN0ZW50ICovCisJCW5ld2Jsay0+Ymxrbm8gPSBibGtubzsKKwkJbmV3YmxrLT5tYWdpYyA9IFhGU19EQV9OT0RFX01BR0lDOworCQl4ZnNfZGFfbm9kZV9yZWJhbGFuY2Uoc3RhdGUsIG9sZGJsaywgbmV3YmxrKTsKKwkJZXJyb3IgPSB4ZnNfZGFfYmxrX2xpbmsoc3RhdGUsIG9sZGJsaywgbmV3YmxrKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuKGVycm9yKTsKKwkJKnJlc3VsdCA9IDE7CisJfSBlbHNlIHsKKwkJKnJlc3VsdCA9IDA7CisJfQorCisJLyoKKwkgKiBJbnNlcnQgdGhlIG5ldyBlbnRyeShzKSBpbnRvIHRoZSBjb3JyZWN0IGJsb2NrCisJICogKHVwZGF0aW5nIGxhc3QgaGFzaHZhbCBpbiB0aGUgcHJvY2VzcykuCisJICoKKwkgKiB4ZnNfZGFfbm9kZV9hZGQoKSBpbnNlcnRzIEJFRk9SRSB0aGUgZ2l2ZW4gaW5kZXgsCisJICogYW5kIGFzIGEgcmVzdWx0IG9mIHVzaW5nIG5vZGVfbG9va3VwX2ludCgpIHdlIGFsd2F5cworCSAqIHBvaW50IHRvIGEgdmFsaWQgZW50cnkgKG5vdCBhZnRlciBvbmUpLCBidXQgYSBzcGxpdAorCSAqIG9wZXJhdGlvbiBhbHdheXMgcmVzdWx0cyBpbiBhIG5ldyBibG9jayB3aG9zZSBoYXNodmFscworCSAqIEZPTExPVyB0aGUgY3VycmVudCBibG9jay4KKwkgKgorCSAqIElmIHdlIGhhZCBkb3VibGUtc3BsaXQgb3AgYmVsb3cgdXMsIHRoZW4gYWRkIHRoZSBleHRyYSBibG9jayB0b28uCisJICovCisJbm9kZSA9IG9sZGJsay0+YnAtPmRhdGE7CisJaWYgKG9sZGJsay0+aW5kZXggPD0gSU5UX0dFVChub2RlLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJb2xkYmxrLT5pbmRleCsrOworCQl4ZnNfZGFfbm9kZV9hZGQoc3RhdGUsIG9sZGJsaywgYWRkYmxrKTsKKwkJaWYgKHVzZWV4dHJhKSB7CisJCQlpZiAoc3RhdGUtPmV4dHJhYWZ0ZXIpCisJCQkJb2xkYmxrLT5pbmRleCsrOworCQkJeGZzX2RhX25vZGVfYWRkKHN0YXRlLCBvbGRibGssICZzdGF0ZS0+ZXh0cmFibGspOworCQkJc3RhdGUtPmV4dHJhdmFsaWQgPSAwOworCQl9CisJfSBlbHNlIHsKKwkJbmV3YmxrLT5pbmRleCsrOworCQl4ZnNfZGFfbm9kZV9hZGQoc3RhdGUsIG5ld2JsaywgYWRkYmxrKTsKKwkJaWYgKHVzZWV4dHJhKSB7CisJCQlpZiAoc3RhdGUtPmV4dHJhYWZ0ZXIpCisJCQkJbmV3YmxrLT5pbmRleCsrOworCQkJeGZzX2RhX25vZGVfYWRkKHN0YXRlLCBuZXdibGssICZzdGF0ZS0+ZXh0cmFibGspOworCQkJc3RhdGUtPmV4dHJhdmFsaWQgPSAwOworCQl9CisJfQorCisJcmV0dXJuKDApOworfQorCisvKgorICogQmFsYW5jZSB0aGUgYnRyZWUgZWxlbWVudHMgYmV0d2VlbiB0d28gaW50ZXJtZWRpYXRlIG5vZGVzLAorICogdXN1YWxseSBvbmUgZnVsbCBhbmQgb25lIGVtcHR5LgorICoKKyAqIE5PVEU6IGlmIGJsazIgaXMgZW1wdHksIHRoZW4gaXQgd2lsbCBnZXQgdGhlIHVwcGVyIGhhbGYgb2YgYmxrMS4KKyAqLworU1RBVElDIHZvaWQKK3hmc19kYV9ub2RlX3JlYmFsYW5jZSh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUsIHhmc19kYV9zdGF0ZV9ibGtfdCAqYmxrMSwKKwkJCQkgICAgIHhmc19kYV9zdGF0ZV9ibGtfdCAqYmxrMikKK3sKKwl4ZnNfZGFfaW50bm9kZV90ICpub2RlMSwgKm5vZGUyLCAqdG1wbm9kZTsKKwl4ZnNfZGFfbm9kZV9lbnRyeV90ICpidHJlZV9zLCAqYnRyZWVfZDsKKwlpbnQgY291bnQsIHRtcDsKKwl4ZnNfdHJhbnNfdCAqdHA7CisKKwlub2RlMSA9IGJsazEtPmJwLT5kYXRhOworCW5vZGUyID0gYmxrMi0+YnAtPmRhdGE7CisJLyoKKwkgKiBGaWd1cmUgb3V0IGhvdyBtYW55IGVudHJpZXMgbmVlZCB0byBtb3ZlLCBhbmQgaW4gd2hpY2ggZGlyZWN0aW9uLgorCSAqIFN3YXAgdGhlIG5vZGVzIGFyb3VuZCBpZiB0aGF0IG1ha2VzIGl0IHNpbXBsZXIuCisJICovCisJaWYgKChJTlRfR0VUKG5vZGUxLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgPiAwKSAmJiAoSU5UX0dFVChub2RlMi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpID4gMCkgJiYKKwkgICAgKChJTlRfR0VUKG5vZGUyLT5idHJlZVsgMCBdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkgPCBJTlRfR0VUKG5vZGUxLT5idHJlZVsgMCBdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkpIHx8CisJICAgICAoSU5UX0dFVChub2RlMi0+YnRyZWVbIElOVF9HRVQobm9kZTItPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKS0xIF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSA8CisJICAgICAgSU5UX0dFVChub2RlMS0+YnRyZWVbIElOVF9HRVQobm9kZTEtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKS0xIF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSkpKSB7CisJCXRtcG5vZGUgPSBub2RlMTsKKwkJbm9kZTEgPSBub2RlMjsKKwkJbm9kZTIgPSB0bXBub2RlOworCX0KKwlBU1NFUlQoSU5UX0dFVChub2RlMS0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RBX05PREVfTUFHSUMpOworCUFTU0VSVChJTlRfR0VUKG5vZGUyLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfREFfTk9ERV9NQUdJQyk7CisJY291bnQgPSAoSU5UX0dFVChub2RlMS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpIC0gSU5UX0dFVChub2RlMi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpKSAvIDI7CisJaWYgKGNvdW50ID09IDApCisJCXJldHVybjsKKwl0cCA9IHN0YXRlLT5hcmdzLT50cmFuczsKKwkvKgorCSAqIFR3byBjYXNlczogaGlnaC10by1sb3cgYW5kIGxvdy10by1oaWdoLgorCSAqLworCWlmIChjb3VudCA+IDApIHsKKwkJLyoKKwkJICogTW92ZSBlbGVtZW50cyBpbiBub2RlMiB1cCB0byBtYWtlIGEgaG9sZS4KKwkJICovCisJCWlmICgodG1wID0gSU5UX0dFVChub2RlMi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpKSA+IDApIHsKKwkJCXRtcCAqPSAodWludClzaXplb2YoeGZzX2RhX25vZGVfZW50cnlfdCk7CisJCQlidHJlZV9zID0gJm5vZGUyLT5idHJlZVswXTsKKwkJCWJ0cmVlX2QgPSAmbm9kZTItPmJ0cmVlW2NvdW50XTsKKwkJCW1lbW1vdmUoYnRyZWVfZCwgYnRyZWVfcywgdG1wKTsKKwkJfQorCisJCS8qCisJCSAqIE1vdmUgdGhlIHJlcSdkIEItdHJlZSBlbGVtZW50cyBmcm9tIGhpZ2ggaW4gbm9kZTEgdG8KKwkJICogbG93IGluIG5vZGUyLgorCQkgKi8KKwkJSU5UX01PRChub2RlMi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQsIGNvdW50KTsKKwkJdG1wID0gY291bnQgKiAodWludClzaXplb2YoeGZzX2RhX25vZGVfZW50cnlfdCk7CisJCWJ0cmVlX3MgPSAmbm9kZTEtPmJ0cmVlW0lOVF9HRVQobm9kZTEtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAtIGNvdW50XTsKKwkJYnRyZWVfZCA9ICZub2RlMi0+YnRyZWVbMF07CisJCW1lbWNweShidHJlZV9kLCBidHJlZV9zLCB0bXApOworCQlJTlRfTU9EKG5vZGUxLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCwgLShjb3VudCkpOworCisJfSBlbHNlIHsKKwkJLyoKKwkJICogTW92ZSB0aGUgcmVxJ2QgQi10cmVlIGVsZW1lbnRzIGZyb20gbG93IGluIG5vZGUyIHRvCisJCSAqIGhpZ2ggaW4gbm9kZTEuCisJCSAqLworCQljb3VudCA9IC1jb3VudDsKKwkJdG1wID0gY291bnQgKiAodWludClzaXplb2YoeGZzX2RhX25vZGVfZW50cnlfdCk7CisJCWJ0cmVlX3MgPSAmbm9kZTItPmJ0cmVlWzBdOworCQlidHJlZV9kID0gJm5vZGUxLT5idHJlZVtJTlRfR0VUKG5vZGUxLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCldOworCQltZW1jcHkoYnRyZWVfZCwgYnRyZWVfcywgdG1wKTsKKwkJSU5UX01PRChub2RlMS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQsIGNvdW50KTsKKwkJeGZzX2RhX2xvZ19idWYodHAsIGJsazEtPmJwLAorCQkJWEZTX0RBX0xPR1JBTkdFKG5vZGUxLCBidHJlZV9kLCB0bXApKTsKKworCQkvKgorCQkgKiBNb3ZlIGVsZW1lbnRzIGluIG5vZGUyIGRvd24gdG8gZmlsbCB0aGUgaG9sZS4KKwkJICovCisJCXRtcCAgPSBJTlRfR0VUKG5vZGUyLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgLSBjb3VudDsKKwkJdG1wICo9ICh1aW50KXNpemVvZih4ZnNfZGFfbm9kZV9lbnRyeV90KTsKKwkJYnRyZWVfcyA9ICZub2RlMi0+YnRyZWVbY291bnRdOworCQlidHJlZV9kID0gJm5vZGUyLT5idHJlZVswXTsKKwkJbWVtbW92ZShidHJlZV9kLCBidHJlZV9zLCB0bXApOworCQlJTlRfTU9EKG5vZGUyLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCwgLShjb3VudCkpOworCX0KKworCS8qCisJICogTG9nIGhlYWRlciBvZiBub2RlIDEgYW5kIGFsbCBjdXJyZW50IGJpdHMgb2Ygbm9kZSAyLgorCSAqLworCXhmc19kYV9sb2dfYnVmKHRwLCBibGsxLT5icCwKKwkJWEZTX0RBX0xPR1JBTkdFKG5vZGUxLCAmbm9kZTEtPmhkciwgc2l6ZW9mKG5vZGUxLT5oZHIpKSk7CisJeGZzX2RhX2xvZ19idWYodHAsIGJsazItPmJwLAorCQlYRlNfREFfTE9HUkFOR0Uobm9kZTIsICZub2RlMi0+aGRyLAorCQkJc2l6ZW9mKG5vZGUyLT5oZHIpICsKKwkJCXNpemVvZihub2RlMi0+YnRyZWVbMF0pICogSU5UX0dFVChub2RlMi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpKSk7CisKKwkvKgorCSAqIFJlY29yZCB0aGUgbGFzdCBoYXNodmFsIGZyb20gZWFjaCBibG9jayBmb3IgdXB3YXJkIHByb3BhZ2F0aW9uLgorCSAqIChub3RlOiBkb24ndCB1c2UgdGhlIHN3YXBwZWQgbm9kZSBwb2ludGVycykKKwkgKi8KKwlub2RlMSA9IGJsazEtPmJwLT5kYXRhOworCW5vZGUyID0gYmxrMi0+YnAtPmRhdGE7CisJYmxrMS0+aGFzaHZhbCA9IElOVF9HRVQobm9kZTEtPmJ0cmVlWyBJTlRfR0VUKG5vZGUxLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCktMSBdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCk7CisJYmxrMi0+aGFzaHZhbCA9IElOVF9HRVQobm9kZTItPmJ0cmVlWyBJTlRfR0VUKG5vZGUyLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCktMSBdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCk7CisKKwkvKgorCSAqIEFkanVzdCB0aGUgZXhwZWN0ZWQgaW5kZXggZm9yIGluc2VydGlvbi4KKwkgKi8KKwlpZiAoYmxrMS0+aW5kZXggPj0gSU5UX0dFVChub2RlMS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpKSB7CisJCWJsazItPmluZGV4ID0gYmxrMS0+aW5kZXggLSBJTlRfR0VUKG5vZGUxLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJCWJsazEtPmluZGV4ID0gSU5UX0dFVChub2RlMS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpICsgMTsJLyogbWFrZSBpdCBpbnZhbGlkICovCisJfQorfQorCisvKgorICogQWRkIGEgbmV3IGVudHJ5IHRvIGFuIGludGVybWVkaWF0ZSBub2RlLgorICovCitTVEFUSUMgdm9pZAoreGZzX2RhX25vZGVfYWRkKHhmc19kYV9zdGF0ZV90ICpzdGF0ZSwgeGZzX2RhX3N0YXRlX2Jsa190ICpvbGRibGssCisJCQkgICAgICAgeGZzX2RhX3N0YXRlX2Jsa190ICpuZXdibGspCit7CisJeGZzX2RhX2ludG5vZGVfdCAqbm9kZTsKKwl4ZnNfZGFfbm9kZV9lbnRyeV90ICpidHJlZTsKKwlpbnQgdG1wOworCXhmc19tb3VudF90ICptcDsKKworCW5vZGUgPSBvbGRibGstPmJwLT5kYXRhOworCW1wID0gc3RhdGUtPm1wOworCUFTU0VSVChJTlRfR0VUKG5vZGUtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19EQV9OT0RFX01BR0lDKTsKKwlBU1NFUlQoKG9sZGJsay0+aW5kZXggPj0gMCkgJiYgKG9sZGJsay0+aW5kZXggPD0gSU5UX0dFVChub2RlLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkpKTsKKwlBU1NFUlQobmV3YmxrLT5ibGtubyAhPSAwKTsKKwlpZiAoc3RhdGUtPmFyZ3MtPndoaWNoZm9yayA9PSBYRlNfREFUQV9GT1JLICYmIFhGU19ESVJfSVNfVjIobXApKQorCQlBU1NFUlQobmV3YmxrLT5ibGtubyA+PSBtcC0+bV9kaXJsZWFmYmxrICYmCisJCSAgICAgICBuZXdibGstPmJsa25vIDwgbXAtPm1fZGlyZnJlZWJsayk7CisKKwkvKgorCSAqIFdlIG1heSBuZWVkIHRvIG1ha2Ugc29tZSByb29tIGJlZm9yZSB3ZSBpbnNlcnQgdGhlIG5ldyBub2RlLgorCSAqLworCXRtcCA9IDA7CisJYnRyZWUgPSAmbm9kZS0+YnRyZWVbIG9sZGJsay0+aW5kZXggXTsKKwlpZiAob2xkYmxrLT5pbmRleCA8IElOVF9HRVQobm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpKSB7CisJCXRtcCA9IChJTlRfR0VUKG5vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAtIG9sZGJsay0+aW5kZXgpICogKHVpbnQpc2l6ZW9mKCpidHJlZSk7CisJCW1lbW1vdmUoYnRyZWUgKyAxLCBidHJlZSwgdG1wKTsKKwl9CisJSU5UX1NFVChidHJlZS0+aGFzaHZhbCwgQVJDSF9DT05WRVJULCBuZXdibGstPmhhc2h2YWwpOworCUlOVF9TRVQoYnRyZWUtPmJlZm9yZSwgQVJDSF9DT05WRVJULCBuZXdibGstPmJsa25vKTsKKwl4ZnNfZGFfbG9nX2J1ZihzdGF0ZS0+YXJncy0+dHJhbnMsIG9sZGJsay0+YnAsCisJCVhGU19EQV9MT0dSQU5HRShub2RlLCBidHJlZSwgdG1wICsgc2l6ZW9mKCpidHJlZSkpKTsKKwlJTlRfTU9EKG5vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJULCArMSk7CisJeGZzX2RhX2xvZ19idWYoc3RhdGUtPmFyZ3MtPnRyYW5zLCBvbGRibGstPmJwLAorCQlYRlNfREFfTE9HUkFOR0Uobm9kZSwgJm5vZGUtPmhkciwgc2l6ZW9mKG5vZGUtPmhkcikpKTsKKworCS8qCisJICogQ29weSB0aGUgbGFzdCBoYXNoIHZhbHVlIGZyb20gdGhlIG9sZGJsayB0byBwcm9wYWdhdGUgdXB3YXJkcy4KKwkgKi8KKwlvbGRibGstPmhhc2h2YWwgPSBJTlRfR0VUKG5vZGUtPmJ0cmVlWyBJTlRfR0VUKG5vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKS0xIF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJvdXRpbmVzIHVzZWQgZm9yIHNocmlua2luZyB0aGUgQnRyZWUuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgKiBEZWFsbG9jYXRlIGFuIGVtcHR5IGxlYWYgbm9kZSwgcmVtb3ZlIGl0IGZyb20gaXRzIHBhcmVudCwKKyAqIHBvc3NpYmx5IGRlYWxsb2NhdGluZyB0aGF0IGJsb2NrLCBldGMuLi4KKyAqLworaW50Cit4ZnNfZGFfam9pbih4ZnNfZGFfc3RhdGVfdCAqc3RhdGUpCit7CisJeGZzX2RhX3N0YXRlX2Jsa190ICpkcm9wX2JsaywgKnNhdmVfYmxrOworCWludCBhY3Rpb24sIGVycm9yOworCisJYWN0aW9uID0gMDsKKwlkcm9wX2JsayA9ICZzdGF0ZS0+cGF0aC5ibGtbIHN0YXRlLT5wYXRoLmFjdGl2ZS0xIF07CisJc2F2ZV9ibGsgPSAmc3RhdGUtPmFsdHBhdGguYmxrWyBzdGF0ZS0+cGF0aC5hY3RpdmUtMSBdOworCUFTU0VSVChzdGF0ZS0+cGF0aC5ibGtbMF0ubWFnaWMgPT0gWEZTX0RBX05PREVfTUFHSUMpOworCUFTU0VSVChkcm9wX2Jsay0+bWFnaWMgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyB8fAorCSAgICAgICBkcm9wX2Jsay0+bWFnaWMgPT0gWEZTX0RJUlhfTEVBRl9NQUdJQyhzdGF0ZS0+bXApKTsKKworCS8qCisJICogV2FsayBiYWNrIHVwIHRoZSB0cmVlIGpvaW5pbmcvZGVhbGxvY2F0aW5nIGFzIG5lY2Vzc2FyeS4KKwkgKiBXaGVuIHdlIHN0b3AgZHJvcHBpbmcgYmxvY2tzLCBicmVhayBvdXQuCisJICovCisJZm9yICggIDsgc3RhdGUtPnBhdGguYWN0aXZlID49IDI7IGRyb3BfYmxrLS0sIHNhdmVfYmxrLS0sCisJCSBzdGF0ZS0+cGF0aC5hY3RpdmUtLSkgeworCQkvKgorCQkgKiBTZWUgaWYgd2UgY2FuIGNvbWJpbmUgdGhlIGJsb2NrIHdpdGggYSBuZWlnaGJvci4KKwkJICogICAoYWN0aW9uID09IDApID0+IG5vIG9wdGlvbnMsIGp1c3QgbGVhdmUKKwkJICogICAoYWN0aW9uID09IDEpID0+IGNvYWxlc2NlLCB0aGVuIHVubGluaworCQkgKiAgIChhY3Rpb24gPT0gMikgPT4gYmxvY2sgZW1wdHksIHVubGluayBpdAorCQkgKi8KKwkJc3dpdGNoIChkcm9wX2Jsay0+bWFnaWMpIHsKKwkJY2FzZSBYRlNfQVRUUl9MRUFGX01BR0lDOgorI2lmbmRlZiBfX0tFUk5FTF9fCisJCQllcnJvciA9IEVOT1RUWTsKKyNlbHNlCisJCQllcnJvciA9IHhmc19hdHRyX2xlYWZfdG9vc21hbGwoc3RhdGUsICZhY3Rpb24pOworI2VuZGlmCisJCQlpZiAoZXJyb3IpCisJCQkJcmV0dXJuKGVycm9yKTsKKwkJCWlmIChhY3Rpb24gPT0gMCkKKwkJCQlyZXR1cm4oMCk7CisjaWZkZWYgX19LRVJORUxfXworCQkJeGZzX2F0dHJfbGVhZl91bmJhbGFuY2Uoc3RhdGUsIGRyb3BfYmxrLCBzYXZlX2Jsayk7CisjZW5kaWYKKwkJCWJyZWFrOworCQljYXNlIFhGU19ESVJfTEVBRl9NQUdJQzoKKwkJCUFTU0VSVChYRlNfRElSX0lTX1YxKHN0YXRlLT5tcCkpOworCQkJZXJyb3IgPSB4ZnNfZGlyX2xlYWZfdG9vc21hbGwoc3RhdGUsICZhY3Rpb24pOworCQkJaWYgKGVycm9yKQorCQkJCXJldHVybihlcnJvcik7CisJCQlpZiAoYWN0aW9uID09IDApCisJCQkJcmV0dXJuKDApOworCQkJeGZzX2Rpcl9sZWFmX3VuYmFsYW5jZShzdGF0ZSwgZHJvcF9ibGssIHNhdmVfYmxrKTsKKwkJCWJyZWFrOworCQljYXNlIFhGU19ESVIyX0xFQUZOX01BR0lDOgorCQkJQVNTRVJUKFhGU19ESVJfSVNfVjIoc3RhdGUtPm1wKSk7CisJCQllcnJvciA9IHhmc19kaXIyX2xlYWZuX3Rvb3NtYWxsKHN0YXRlLCAmYWN0aW9uKTsKKwkJCWlmIChlcnJvcikKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQlpZiAoYWN0aW9uID09IDApCisJCQkJcmV0dXJuIDA7CisJCQl4ZnNfZGlyMl9sZWFmbl91bmJhbGFuY2Uoc3RhdGUsIGRyb3BfYmxrLCBzYXZlX2Jsayk7CisJCQlicmVhazsKKwkJY2FzZSBYRlNfREFfTk9ERV9NQUdJQzoKKwkJCS8qCisJCQkgKiBSZW1vdmUgdGhlIG9mZmVuZGluZyBub2RlLCBmaXh1cCBoYXNodmFscywKKwkJCSAqIGNoZWNrIGZvciBhIHRvb3NtYWxsIG5laWdoYm9yLgorCQkJICovCisJCQl4ZnNfZGFfbm9kZV9yZW1vdmUoc3RhdGUsIGRyb3BfYmxrKTsKKwkJCXhmc19kYV9maXhoYXNocGF0aChzdGF0ZSwgJnN0YXRlLT5wYXRoKTsKKwkJCWVycm9yID0geGZzX2RhX25vZGVfdG9vc21hbGwoc3RhdGUsICZhY3Rpb24pOworCQkJaWYgKGVycm9yKQorCQkJCXJldHVybihlcnJvcik7CisJCQlpZiAoYWN0aW9uID09IDApCisJCQkJcmV0dXJuIDA7CisJCQl4ZnNfZGFfbm9kZV91bmJhbGFuY2Uoc3RhdGUsIGRyb3BfYmxrLCBzYXZlX2Jsayk7CisJCQlicmVhazsKKwkJfQorCQl4ZnNfZGFfZml4aGFzaHBhdGgoc3RhdGUsICZzdGF0ZS0+YWx0cGF0aCk7CisJCWVycm9yID0geGZzX2RhX2Jsa191bmxpbmsoc3RhdGUsIGRyb3BfYmxrLCBzYXZlX2Jsayk7CisJCXhmc19kYV9zdGF0ZV9raWxsX2FsdHBhdGgoc3RhdGUpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4oZXJyb3IpOworCQllcnJvciA9IHhmc19kYV9zaHJpbmtfaW5vZGUoc3RhdGUtPmFyZ3MsIGRyb3BfYmxrLT5ibGtubywKKwkJCQkJCQkgZHJvcF9ibGstPmJwKTsKKwkJZHJvcF9ibGstPmJwID0gTlVMTDsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuKGVycm9yKTsKKwl9CisJLyoKKwkgKiBXZSBqb2luZWQgYWxsIHRoZSB3YXkgdG8gdGhlIHRvcC4gIElmIGl0IHR1cm5zIG91dCB0aGF0CisJICogd2Ugb25seSBoYXZlIG9uZSBlbnRyeSBpbiB0aGUgcm9vdCwgbWFrZSB0aGUgY2hpbGQgYmxvY2sKKwkgKiB0aGUgbmV3IHJvb3QuCisJICovCisJeGZzX2RhX25vZGVfcmVtb3ZlKHN0YXRlLCBkcm9wX2Jsayk7CisJeGZzX2RhX2ZpeGhhc2hwYXRoKHN0YXRlLCAmc3RhdGUtPnBhdGgpOworCWVycm9yID0geGZzX2RhX3Jvb3Rfam9pbihzdGF0ZSwgJnN0YXRlLT5wYXRoLmJsa1swXSk7CisJcmV0dXJuKGVycm9yKTsKK30KKworLyoKKyAqIFdlIGhhdmUgb25seSBvbmUgZW50cnkgaW4gdGhlIHJvb3QuICBDb3B5IHRoZSBvbmx5IHJlbWFpbmluZyBjaGlsZCBvZgorICogdGhlIG9sZCByb290IHRvIGJsb2NrIDAgYXMgdGhlIG5ldyByb290IG5vZGUuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19kYV9yb290X2pvaW4oeGZzX2RhX3N0YXRlX3QgKnN0YXRlLCB4ZnNfZGFfc3RhdGVfYmxrX3QgKnJvb3RfYmxrKQoreworCXhmc19kYV9pbnRub2RlX3QgKm9sZHJvb3Q7CisJLyogUkVGRVJFTkNFRCAqLworCXhmc19kYV9ibGtpbmZvX3QgKmJsa2luZm87CisJeGZzX2RhX2FyZ3NfdCAqYXJnczsKKwl4ZnNfZGFibGtfdCBjaGlsZDsKKwl4ZnNfZGFidWZfdCAqYnA7CisJaW50IGVycm9yOworCisJYXJncyA9IHN0YXRlLT5hcmdzOworCUFTU0VSVChhcmdzICE9IE5VTEwpOworCUFTU0VSVChyb290X2Jsay0+bWFnaWMgPT0gWEZTX0RBX05PREVfTUFHSUMpOworCW9sZHJvb3QgPSByb290X2Jsay0+YnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQob2xkcm9vdC0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RBX05PREVfTUFHSUMpOworCUFTU0VSVCghb2xkcm9vdC0+aGRyLmluZm8uZm9ydyk7CisJQVNTRVJUKCFvbGRyb290LT5oZHIuaW5mby5iYWNrKTsKKworCS8qCisJICogSWYgdGhlIHJvb3QgaGFzIG1vcmUgdGhhbiBvbmUgY2hpbGQsIHRoZW4gZG9uJ3QgZG8gYW55dGhpbmcuCisJICovCisJaWYgKElOVF9HRVQob2xkcm9vdC0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpID4gMSkKKwkJcmV0dXJuKDApOworCisJLyoKKwkgKiBSZWFkIGluIHRoZSAob25seSkgY2hpbGQgYmxvY2ssIHRoZW4gY29weSB0aG9zZSBieXRlcyBpbnRvCisJICogdGhlIHJvb3QgYmxvY2sncyBidWZmZXIgYW5kIGZyZWUgdGhlIG9yaWdpbmFsIGNoaWxkIGJsb2NrLgorCSAqLworCWNoaWxkID0gSU5UX0dFVChvbGRyb290LT5idHJlZVsgMCBdLmJlZm9yZSwgQVJDSF9DT05WRVJUKTsKKwlBU1NFUlQoY2hpbGQgIT0gMCk7CisJZXJyb3IgPSB4ZnNfZGFfcmVhZF9idWYoYXJncy0+dHJhbnMsIGFyZ3MtPmRwLCBjaGlsZCwgLTEsICZicCwKKwkJCQkJICAgICBhcmdzLT53aGljaGZvcmspOworCWlmIChlcnJvcikKKwkJcmV0dXJuKGVycm9yKTsKKwlBU1NFUlQoYnAgIT0gTlVMTCk7CisJYmxraW5mbyA9IGJwLT5kYXRhOworCWlmIChJTlRfR0VUKG9sZHJvb3QtPmhkci5sZXZlbCwgQVJDSF9DT05WRVJUKSA9PSAxKSB7CisJCUFTU0VSVChJTlRfR0VUKGJsa2luZm8tPm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVJYX0xFQUZfTUFHSUMoc3RhdGUtPm1wKSB8fAorCQkgICAgICAgSU5UX0dFVChibGtpbmZvLT5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKwl9IGVsc2UgeworCQlBU1NFUlQoSU5UX0dFVChibGtpbmZvLT5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfREFfTk9ERV9NQUdJQyk7CisJfQorCUFTU0VSVCghYmxraW5mby0+Zm9ydyk7CisJQVNTRVJUKCFibGtpbmZvLT5iYWNrKTsKKwltZW1jcHkocm9vdF9ibGstPmJwLT5kYXRhLCBicC0+ZGF0YSwgc3RhdGUtPmJsb2Nrc2l6ZSk7CisJeGZzX2RhX2xvZ19idWYoYXJncy0+dHJhbnMsIHJvb3RfYmxrLT5icCwgMCwgc3RhdGUtPmJsb2Nrc2l6ZSAtIDEpOworCWVycm9yID0geGZzX2RhX3Nocmlua19pbm9kZShhcmdzLCBjaGlsZCwgYnApOworCXJldHVybihlcnJvcik7Cit9CisKKy8qCisgKiBDaGVjayBhIG5vZGUgYmxvY2sgYW5kIGl0cyBuZWlnaGJvcnMgdG8gc2VlIGlmIHRoZSBibG9jayBzaG91bGQgYmUKKyAqIGNvbGxhcHNlZCBpbnRvIG9uZSBvciB0aGUgb3RoZXIgbmVpZ2hib3IuICBBbHdheXMga2VlcCB0aGUgYmxvY2sKKyAqIHdpdGggdGhlIHNtYWxsZXIgYmxvY2sgbnVtYmVyLgorICogSWYgdGhlIGN1cnJlbnQgYmxvY2sgaXMgb3ZlciA1MCUgZnVsbCwgZG9uJ3QgdHJ5IHRvIGpvaW4gaXQsIHJldHVybiAwLgorICogSWYgdGhlIGJsb2NrIGlzIGVtcHR5LCBmaWxsIGluIHRoZSBzdGF0ZSBzdHJ1Y3R1cmUgYW5kIHJldHVybiAyLgorICogSWYgaXQgY2FuIGJlIGNvbGxhcHNlZCwgZmlsbCBpbiB0aGUgc3RhdGUgc3RydWN0dXJlIGFuZCByZXR1cm4gMS4KKyAqIElmIG5vdGhpbmcgY2FuIGJlIGRvbmUsIHJldHVybiAwLgorICovCitTVEFUSUMgaW50Cit4ZnNfZGFfbm9kZV90b29zbWFsbCh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUsIGludCAqYWN0aW9uKQoreworCXhmc19kYV9pbnRub2RlX3QgKm5vZGU7CisJeGZzX2RhX3N0YXRlX2Jsa190ICpibGs7CisJeGZzX2RhX2Jsa2luZm9fdCAqaW5mbzsKKwlpbnQgY291bnQsIGZvcndhcmQsIGVycm9yLCByZXR2YWwsIGk7CisJeGZzX2RhYmxrX3QgYmxrbm87CisJeGZzX2RhYnVmX3QgKmJwOworCisJLyoKKwkgKiBDaGVjayBmb3IgdGhlIGRlZ2VuZXJhdGUgY2FzZSBvZiB0aGUgYmxvY2sgYmVpbmcgb3ZlciA1MCUgZnVsbC4KKwkgKiBJZiBzbywgaXQncyBub3Qgd29ydGggZXZlbiBsb29raW5nIHRvIHNlZSBpZiB3ZSBtaWdodCBiZSBhYmxlCisJICogdG8gY29hbGVzY2Ugd2l0aCBhIHNpYmxpbmcuCisJICovCisJYmxrID0gJnN0YXRlLT5wYXRoLmJsa1sgc3RhdGUtPnBhdGguYWN0aXZlLTEgXTsKKwlpbmZvID0gYmxrLT5icC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChpbmZvLT5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfREFfTk9ERV9NQUdJQyk7CisJbm9kZSA9ICh4ZnNfZGFfaW50bm9kZV90ICopaW5mbzsKKwljb3VudCA9IElOVF9HRVQobm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOworCWlmIChjb3VudCA+IChzdGF0ZS0+bm9kZV9lbnRzID4+IDEpKSB7CisJCSphY3Rpb24gPSAwOwkvKiBibGsgb3ZlciA1MCUsIGRvbid0IHRyeSB0byBqb2luICovCisJCXJldHVybigwKTsJLyogYmxrIG92ZXIgNTAlLCBkb24ndCB0cnkgdG8gam9pbiAqLworCX0KKworCS8qCisJICogQ2hlY2sgZm9yIHRoZSBkZWdlbmVyYXRlIGNhc2Ugb2YgdGhlIGJsb2NrIGJlaW5nIGVtcHR5LgorCSAqIElmIHRoZSBibG9jayBpcyBlbXB0eSwgd2UnbGwgc2ltcGx5IGRlbGV0ZSBpdCwgbm8gbmVlZCB0bworCSAqIGNvYWxlc2NlIGl0IHdpdGggYSBzaWJsaW5nIGJsb2NrLiAgV2UgY2hvb3NlIChhcmlidHJhcmlseSkKKwkgKiB0byBtZXJnZSB3aXRoIHRoZSBmb3J3YXJkIGJsb2NrIHVubGVzcyBpdCBpcyBOVUxMLgorCSAqLworCWlmIChjb3VudCA9PSAwKSB7CisJCS8qCisJCSAqIE1ha2UgYWx0cGF0aCBwb2ludCB0byB0aGUgYmxvY2sgd2Ugd2FudCB0byBrZWVwIGFuZAorCQkgKiBwYXRoIHBvaW50IHRvIHRoZSBibG9jayB3ZSB3YW50IHRvIGRyb3AgKHRoaXMgb25lKS4KKwkJICovCisJCWZvcndhcmQgPSBpbmZvLT5mb3J3OworCQltZW1jcHkoJnN0YXRlLT5hbHRwYXRoLCAmc3RhdGUtPnBhdGgsIHNpemVvZihzdGF0ZS0+cGF0aCkpOworCQllcnJvciA9IHhmc19kYV9wYXRoX3NoaWZ0KHN0YXRlLCAmc3RhdGUtPmFsdHBhdGgsIGZvcndhcmQsCisJCQkJCQkgMCwgJnJldHZhbCk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybihlcnJvcik7CisJCWlmIChyZXR2YWwpIHsKKwkJCSphY3Rpb24gPSAwOworCQl9IGVsc2UgeworCQkJKmFjdGlvbiA9IDI7CisJCX0KKwkJcmV0dXJuKDApOworCX0KKworCS8qCisJICogRXhhbWluZSBlYWNoIHNpYmxpbmcgYmxvY2sgdG8gc2VlIGlmIHdlIGNhbiBjb2FsZXNjZSB3aXRoCisJICogYXQgbGVhc3QgMjUlIGZyZWUgc3BhY2UgdG8gc3BhcmUuICBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQKKwkgKiB3aGV0aGVyIHRvIG1lcmdlIHdpdGggdGhlIGZvcndhcmQgb3IgdGhlIGJhY2t3YXJkIGJsb2NrLgorCSAqIFdlIHByZWZlciBjb2FsZXNjaW5nIHdpdGggdGhlIGxvd2VyIG51bWJlcmVkIHNpYmxpbmcgc28gYXMKKwkgKiB0byBzaHJpbmsgYSBkaXJlY3Rvcnkgb3ZlciB0aW1lLgorCSAqLworCS8qIHN0YXJ0IHdpdGggc21hbGxlciBibGsgbnVtICovCisJZm9yd2FyZCA9IChJTlRfR0VUKGluZm8tPmZvcncsIEFSQ0hfQ09OVkVSVCkKKwkJCQk8IElOVF9HRVQoaW5mby0+YmFjaywgQVJDSF9DT05WRVJUKSk7CisJZm9yIChpID0gMDsgaSA8IDI7IGZvcndhcmQgPSAhZm9yd2FyZCwgaSsrKSB7CisJCWlmIChmb3J3YXJkKQorCQkJYmxrbm8gPSBJTlRfR0VUKGluZm8tPmZvcncsIEFSQ0hfQ09OVkVSVCk7CisJCWVsc2UKKwkJCWJsa25vID0gSU5UX0dFVChpbmZvLT5iYWNrLCBBUkNIX0NPTlZFUlQpOworCQlpZiAoYmxrbm8gPT0gMCkKKwkJCWNvbnRpbnVlOworCQllcnJvciA9IHhmc19kYV9yZWFkX2J1ZihzdGF0ZS0+YXJncy0+dHJhbnMsIHN0YXRlLT5hcmdzLT5kcCwKKwkJCQkJYmxrbm8sIC0xLCAmYnAsIHN0YXRlLT5hcmdzLT53aGljaGZvcmspOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4oZXJyb3IpOworCQlBU1NFUlQoYnAgIT0gTlVMTCk7CisKKwkJbm9kZSA9ICh4ZnNfZGFfaW50bm9kZV90ICopaW5mbzsKKwkJY291bnQgID0gc3RhdGUtPm5vZGVfZW50czsKKwkJY291bnQgLT0gc3RhdGUtPm5vZGVfZW50cyA+PiAyOworCQljb3VudCAtPSBJTlRfR0VUKG5vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKTsKKwkJbm9kZSA9IGJwLT5kYXRhOworCQlBU1NFUlQoSU5UX0dFVChub2RlLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfREFfTk9ERV9NQUdJQyk7CisJCWNvdW50IC09IElOVF9HRVQobm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOworCQl4ZnNfZGFfYnJlbHNlKHN0YXRlLT5hcmdzLT50cmFucywgYnApOworCQlpZiAoY291bnQgPj0gMCkKKwkJCWJyZWFrOwkvKiBmaXRzIHdpdGggYXQgbGVhc3QgMjUlIHRvIHNwYXJlICovCisJfQorCWlmIChpID49IDIpIHsKKwkJKmFjdGlvbiA9IDA7CisJCXJldHVybigwKTsKKwl9CisKKwkvKgorCSAqIE1ha2UgYWx0cGF0aCBwb2ludCB0byB0aGUgYmxvY2sgd2Ugd2FudCB0byBrZWVwICh0aGUgbG93ZXIKKwkgKiBudW1iZXJlZCBibG9jaykgYW5kIHBhdGggcG9pbnQgdG8gdGhlIGJsb2NrIHdlIHdhbnQgdG8gZHJvcC4KKwkgKi8KKwltZW1jcHkoJnN0YXRlLT5hbHRwYXRoLCAmc3RhdGUtPnBhdGgsIHNpemVvZihzdGF0ZS0+cGF0aCkpOworCWlmIChibGtubyA8IGJsay0+Ymxrbm8pIHsKKwkJZXJyb3IgPSB4ZnNfZGFfcGF0aF9zaGlmdChzdGF0ZSwgJnN0YXRlLT5hbHRwYXRoLCBmb3J3YXJkLAorCQkJCQkJIDAsICZyZXR2YWwpOworCQlpZiAoZXJyb3IpIHsKKwkJCXJldHVybihlcnJvcik7CisJCX0KKwkJaWYgKHJldHZhbCkgeworCQkJKmFjdGlvbiA9IDA7CisJCQlyZXR1cm4oMCk7CisJCX0KKwl9IGVsc2UgeworCQllcnJvciA9IHhmc19kYV9wYXRoX3NoaWZ0KHN0YXRlLCAmc3RhdGUtPnBhdGgsIGZvcndhcmQsCisJCQkJCQkgMCwgJnJldHZhbCk7CisJCWlmIChlcnJvcikgeworCQkJcmV0dXJuKGVycm9yKTsKKwkJfQorCQlpZiAocmV0dmFsKSB7CisJCQkqYWN0aW9uID0gMDsKKwkJCXJldHVybigwKTsKKwkJfQorCX0KKwkqYWN0aW9uID0gMTsKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBXYWxrIGJhY2sgdXAgdGhlIHRyZWUgYWRqdXN0aW5nIGhhc2ggdmFsdWVzIGFzIG5lY2Vzc2FyeSwKKyAqIHdoZW4gd2Ugc3RvcCBtYWtpbmcgY2hhbmdlcywgcmV0dXJuLgorICovCit2b2lkCit4ZnNfZGFfZml4aGFzaHBhdGgoeGZzX2RhX3N0YXRlX3QgKnN0YXRlLCB4ZnNfZGFfc3RhdGVfcGF0aF90ICpwYXRoKQoreworCXhmc19kYV9zdGF0ZV9ibGtfdCAqYmxrOworCXhmc19kYV9pbnRub2RlX3QgKm5vZGU7CisJeGZzX2RhX25vZGVfZW50cnlfdCAqYnRyZWU7CisJeGZzX2RhaGFzaF90IGxhc3RoYXNoPTA7CisJaW50IGxldmVsLCBjb3VudDsKKworCWxldmVsID0gcGF0aC0+YWN0aXZlLTE7CisJYmxrID0gJnBhdGgtPmJsa1sgbGV2ZWwgXTsKKwlzd2l0Y2ggKGJsay0+bWFnaWMpIHsKKyNpZmRlZiBfX0tFUk5FTF9fCisJY2FzZSBYRlNfQVRUUl9MRUFGX01BR0lDOgorCQlsYXN0aGFzaCA9IHhmc19hdHRyX2xlYWZfbGFzdGhhc2goYmxrLT5icCwgJmNvdW50KTsKKwkJaWYgKGNvdW50ID09IDApCisJCQlyZXR1cm47CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBYRlNfRElSX0xFQUZfTUFHSUM6CisJCUFTU0VSVChYRlNfRElSX0lTX1YxKHN0YXRlLT5tcCkpOworCQlsYXN0aGFzaCA9IHhmc19kaXJfbGVhZl9sYXN0aGFzaChibGstPmJwLCAmY291bnQpOworCQlpZiAoY291bnQgPT0gMCkKKwkJCXJldHVybjsKKwkJYnJlYWs7CisJY2FzZSBYRlNfRElSMl9MRUFGTl9NQUdJQzoKKwkJQVNTRVJUKFhGU19ESVJfSVNfVjIoc3RhdGUtPm1wKSk7CisJCWxhc3RoYXNoID0geGZzX2RpcjJfbGVhZm5fbGFzdGhhc2goYmxrLT5icCwgJmNvdW50KTsKKwkJaWYgKGNvdW50ID09IDApCisJCQlyZXR1cm47CisJCWJyZWFrOworCWNhc2UgWEZTX0RBX05PREVfTUFHSUM6CisJCWxhc3RoYXNoID0geGZzX2RhX25vZGVfbGFzdGhhc2goYmxrLT5icCwgJmNvdW50KTsKKwkJaWYgKGNvdW50ID09IDApCisJCQlyZXR1cm47CisJCWJyZWFrOworCX0KKwlmb3IgKGJsay0tLCBsZXZlbC0tOyBsZXZlbCA+PSAwOyBibGstLSwgbGV2ZWwtLSkgeworCQlub2RlID0gYmxrLT5icC0+ZGF0YTsKKwkJQVNTRVJUKElOVF9HRVQobm9kZS0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RBX05PREVfTUFHSUMpOworCQlidHJlZSA9ICZub2RlLT5idHJlZVsgYmxrLT5pbmRleCBdOworCQlpZiAoSU5UX0dFVChidHJlZS0+aGFzaHZhbCwgQVJDSF9DT05WRVJUKSA9PSBsYXN0aGFzaCkKKwkJCWJyZWFrOworCQlibGstPmhhc2h2YWwgPSBsYXN0aGFzaDsKKwkJSU5UX1NFVChidHJlZS0+aGFzaHZhbCwgQVJDSF9DT05WRVJULCBsYXN0aGFzaCk7CisJCXhmc19kYV9sb2dfYnVmKHN0YXRlLT5hcmdzLT50cmFucywgYmxrLT5icCwKKwkJCQkgIFhGU19EQV9MT0dSQU5HRShub2RlLCBidHJlZSwgc2l6ZW9mKCpidHJlZSkpKTsKKworCQlsYXN0aGFzaCA9IElOVF9HRVQobm9kZS0+YnRyZWVbIElOVF9HRVQobm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpLTEgXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpOworCX0KK30KKworLyoKKyAqIFJlbW92ZSBhbiBlbnRyeSBmcm9tIGFuIGludGVybWVkaWF0ZSBub2RlLgorICovCitTVEFUSUMgdm9pZAoreGZzX2RhX25vZGVfcmVtb3ZlKHhmc19kYV9zdGF0ZV90ICpzdGF0ZSwgeGZzX2RhX3N0YXRlX2Jsa190ICpkcm9wX2JsaykKK3sKKwl4ZnNfZGFfaW50bm9kZV90ICpub2RlOworCXhmc19kYV9ub2RlX2VudHJ5X3QgKmJ0cmVlOworCWludCB0bXA7CisKKwlub2RlID0gZHJvcF9ibGstPmJwLT5kYXRhOworCUFTU0VSVChkcm9wX2Jsay0+aW5kZXggPCBJTlRfR0VUKG5vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSk7CisJQVNTRVJUKGRyb3BfYmxrLT5pbmRleCA+PSAwKTsKKworCS8qCisJICogQ29weSBvdmVyIHRoZSBvZmZlbmRpbmcgZW50cnksIG9yIGp1c3QgemVybyBpdCBvdXQuCisJICovCisJYnRyZWUgPSAmbm9kZS0+YnRyZWVbZHJvcF9ibGstPmluZGV4XTsKKwlpZiAoZHJvcF9ibGstPmluZGV4IDwgKElOVF9HRVQobm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpLTEpKSB7CisJCXRtcCAgPSBJTlRfR0VUKG5vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAtIGRyb3BfYmxrLT5pbmRleCAtIDE7CisJCXRtcCAqPSAodWludClzaXplb2YoeGZzX2RhX25vZGVfZW50cnlfdCk7CisJCW1lbW1vdmUoYnRyZWUsIGJ0cmVlICsgMSwgdG1wKTsKKwkJeGZzX2RhX2xvZ19idWYoc3RhdGUtPmFyZ3MtPnRyYW5zLCBkcm9wX2Jsay0+YnAsCisJCSAgICBYRlNfREFfTE9HUkFOR0Uobm9kZSwgYnRyZWUsIHRtcCkpOworCQlidHJlZSA9ICZub2RlLT5idHJlZVsgSU5UX0dFVChub2RlLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCktMSBdOworCX0KKwltZW1zZXQoKGNoYXIgKilidHJlZSwgMCwgc2l6ZW9mKHhmc19kYV9ub2RlX2VudHJ5X3QpKTsKKwl4ZnNfZGFfbG9nX2J1ZihzdGF0ZS0+YXJncy0+dHJhbnMsIGRyb3BfYmxrLT5icCwKKwkgICAgWEZTX0RBX0xPR1JBTkdFKG5vZGUsIGJ0cmVlLCBzaXplb2YoKmJ0cmVlKSkpOworCUlOVF9NT0Qobm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQsIC0xKTsKKwl4ZnNfZGFfbG9nX2J1ZihzdGF0ZS0+YXJncy0+dHJhbnMsIGRyb3BfYmxrLT5icCwKKwkgICAgWEZTX0RBX0xPR1JBTkdFKG5vZGUsICZub2RlLT5oZHIsIHNpemVvZihub2RlLT5oZHIpKSk7CisKKwkvKgorCSAqIENvcHkgdGhlIGxhc3QgaGFzaCB2YWx1ZSBmcm9tIHRoZSBibG9jayB0byBwcm9wYWdhdGUgdXB3YXJkcy4KKwkgKi8KKwlidHJlZS0tOworCWRyb3BfYmxrLT5oYXNodmFsID0gSU5UX0dFVChidHJlZS0+aGFzaHZhbCwgQVJDSF9DT05WRVJUKTsKK30KKworLyoKKyAqIFVuYmFsYW5jZSB0aGUgYnRyZWUgZWxlbWVudHMgYmV0d2VlbiB0d28gaW50ZXJtZWRpYXRlIG5vZGVzLAorICogbW92ZSBhbGwgQnRyZWUgZWxlbWVudHMgZnJvbSBvbmUgbm9kZSBpbnRvIGFub3RoZXIuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfZGFfbm9kZV91bmJhbGFuY2UoeGZzX2RhX3N0YXRlX3QgKnN0YXRlLCB4ZnNfZGFfc3RhdGVfYmxrX3QgKmRyb3BfYmxrLAorCQkJCSAgICAgeGZzX2RhX3N0YXRlX2Jsa190ICpzYXZlX2JsaykKK3sKKwl4ZnNfZGFfaW50bm9kZV90ICpkcm9wX25vZGUsICpzYXZlX25vZGU7CisJeGZzX2RhX25vZGVfZW50cnlfdCAqYnRyZWU7CisJaW50IHRtcDsKKwl4ZnNfdHJhbnNfdCAqdHA7CisKKwlkcm9wX25vZGUgPSBkcm9wX2Jsay0+YnAtPmRhdGE7CisJc2F2ZV9ub2RlID0gc2F2ZV9ibGstPmJwLT5kYXRhOworCUFTU0VSVChJTlRfR0VUKGRyb3Bfbm9kZS0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RBX05PREVfTUFHSUMpOworCUFTU0VSVChJTlRfR0VUKHNhdmVfbm9kZS0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RBX05PREVfTUFHSUMpOworCXRwID0gc3RhdGUtPmFyZ3MtPnRyYW5zOworCisJLyoKKwkgKiBJZiB0aGUgZHlpbmcgYmxvY2sgaGFzIGxvd2VyIGhhc2h2YWxzLCB0aGVuIG1vdmUgYWxsIHRoZQorCSAqIGVsZW1lbnRzIGluIHRoZSByZW1haW5pbmcgYmxvY2sgdXAgdG8gbWFrZSBhIGhvbGUuCisJICovCisJaWYgKChJTlRfR0VUKGRyb3Bfbm9kZS0+YnRyZWVbIDAgXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpIDwgSU5UX0dFVChzYXZlX25vZGUtPmJ0cmVlWyAwIF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSkgfHwKKwkgICAgKElOVF9HRVQoZHJvcF9ub2RlLT5idHJlZVsgSU5UX0dFVChkcm9wX25vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKS0xIF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSA8CisJICAgICBJTlRfR0VUKHNhdmVfbm9kZS0+YnRyZWVbIElOVF9HRVQoc2F2ZV9ub2RlLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCktMSBdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkpKQorCXsKKwkJYnRyZWUgPSAmc2F2ZV9ub2RlLT5idHJlZVsgSU5UX0dFVChkcm9wX25vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSBdOworCQl0bXAgPSBJTlRfR0VUKHNhdmVfbm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpICogKHVpbnQpc2l6ZW9mKHhmc19kYV9ub2RlX2VudHJ5X3QpOworCQltZW1tb3ZlKGJ0cmVlLCAmc2F2ZV9ub2RlLT5idHJlZVswXSwgdG1wKTsKKwkJYnRyZWUgPSAmc2F2ZV9ub2RlLT5idHJlZVswXTsKKwkJeGZzX2RhX2xvZ19idWYodHAsIHNhdmVfYmxrLT5icCwKKwkJCVhGU19EQV9MT0dSQU5HRShzYXZlX25vZGUsIGJ0cmVlLAorCQkJCShJTlRfR0VUKHNhdmVfbm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpICsgSU5UX0dFVChkcm9wX25vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSkgKgorCQkJCXNpemVvZih4ZnNfZGFfbm9kZV9lbnRyeV90KSkpOworCX0gZWxzZSB7CisJCWJ0cmVlID0gJnNhdmVfbm9kZS0+YnRyZWVbIElOVF9HRVQoc2F2ZV9ub2RlLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgXTsKKwkJeGZzX2RhX2xvZ19idWYodHAsIHNhdmVfYmxrLT5icCwKKwkJCVhGU19EQV9MT0dSQU5HRShzYXZlX25vZGUsIGJ0cmVlLAorCQkJCUlOVF9HRVQoZHJvcF9ub2RlLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgKgorCQkJCXNpemVvZih4ZnNfZGFfbm9kZV9lbnRyeV90KSkpOworCX0KKworCS8qCisJICogTW92ZSBhbGwgdGhlIEItdHJlZSBlbGVtZW50cyBmcm9tIGRyb3BfYmxrIHRvIHNhdmVfYmxrLgorCSAqLworCXRtcCA9IElOVF9HRVQoZHJvcF9ub2RlLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgKiAodWludClzaXplb2YoeGZzX2RhX25vZGVfZW50cnlfdCk7CisJbWVtY3B5KGJ0cmVlLCAmZHJvcF9ub2RlLT5idHJlZVswXSwgdG1wKTsKKwlJTlRfTU9EKHNhdmVfbm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQsIElOVF9HRVQoZHJvcF9ub2RlLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkpOworCisJeGZzX2RhX2xvZ19idWYodHAsIHNhdmVfYmxrLT5icCwKKwkJWEZTX0RBX0xPR1JBTkdFKHNhdmVfbm9kZSwgJnNhdmVfbm9kZS0+aGRyLAorCQkJc2l6ZW9mKHNhdmVfbm9kZS0+aGRyKSkpOworCisJLyoKKwkgKiBTYXZlIHRoZSBsYXN0IGhhc2h2YWwgaW4gdGhlIHJlbWFpbmluZyBibG9jayBmb3IgdXB3YXJkIHByb3BhZ2F0aW9uLgorCSAqLworCXNhdmVfYmxrLT5oYXNodmFsID0gSU5UX0dFVChzYXZlX25vZGUtPmJ0cmVlWyBJTlRfR0VUKHNhdmVfbm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpLTEgXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUm91dGluZXMgdXNlZCBmb3IgZmluZGluZyB0aGluZ3MgaW4gdGhlIEJ0cmVlLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICogV2FsayBkb3duIHRoZSBCdHJlZSBsb29raW5nIGZvciBhIHBhcnRpY3VsYXIgZmlsZW5hbWUsIGZpbGxpbmcKKyAqIGluIHRoZSBzdGF0ZSBzdHJ1Y3R1cmUgYXMgd2UgZ28uCisgKgorICogV2Ugd2lsbCBzZXQgdGhlIHN0YXRlIHN0cnVjdHVyZSB0byBwb2ludCB0byBlYWNoIG9mIHRoZSBlbGVtZW50cworICogaW4gZWFjaCBvZiB0aGUgbm9kZXMgd2hlcmUgZWl0aGVyIHRoZSBoYXNodmFsIGlzIG9yIHNob3VsZCBiZS4KKyAqCisgKiBXZSBzdXBwb3J0IGR1cGxpY2F0ZSBoYXNodmFsJ3Mgc28gZm9yIGVhY2ggZW50cnkgaW4gdGhlIGN1cnJlbnQKKyAqIG5vZGUgdGhhdCBjb3VsZCBjb250YWluIHRoZSBkZXNpcmVkIGhhc2h2YWwsIGRlc2NlbmQuICBUaGlzIGlzIGEKKyAqIHBydW5lZCBkZXB0aC1maXJzdCB0cmVlIHNlYXJjaC4KKyAqLworaW50CQkJCQkJCS8qIGVycm9yICovCit4ZnNfZGFfbm9kZV9sb29rdXBfaW50KHhmc19kYV9zdGF0ZV90ICpzdGF0ZSwgaW50ICpyZXN1bHQpCit7CisJeGZzX2RhX3N0YXRlX2Jsa190ICpibGs7CisJeGZzX2RhX2Jsa2luZm9fdCAqY3VycjsKKwl4ZnNfZGFfaW50bm9kZV90ICpub2RlOworCXhmc19kYV9ub2RlX2VudHJ5X3QgKmJ0cmVlOworCXhmc19kYWJsa190IGJsa25vOworCWludCBwcm9iZSwgc3BhbiwgbWF4LCBlcnJvciwgcmV0dmFsOworCXhmc19kYWhhc2hfdCBoYXNodmFsOworCXhmc19kYV9hcmdzX3QgKmFyZ3M7CisKKwlhcmdzID0gc3RhdGUtPmFyZ3M7CisKKwkvKgorCSAqIERlc2NlbmQgdGhydSB0aGUgQi10cmVlIHNlYXJjaGluZyBlYWNoIGxldmVsIGZvciB0aGUgcmlnaHQKKwkgKiBub2RlIHRvIHVzZSwgdW50aWwgdGhlIHJpZ2h0IGhhc2h2YWwgaXMgZm91bmQuCisJICovCisJaWYgKGFyZ3MtPndoaWNoZm9yayA9PSBYRlNfREFUQV9GT1JLICYmIFhGU19ESVJfSVNfVjIoc3RhdGUtPm1wKSkKKwkJYmxrbm8gPSBzdGF0ZS0+bXAtPm1fZGlybGVhZmJsazsKKwllbHNlCisJCWJsa25vID0gMDsKKwlmb3IgKGJsayA9ICZzdGF0ZS0+cGF0aC5ibGtbMF0sIHN0YXRlLT5wYXRoLmFjdGl2ZSA9IDE7CisJCQkgc3RhdGUtPnBhdGguYWN0aXZlIDw9IFhGU19EQV9OT0RFX01BWERFUFRIOworCQkJIGJsaysrLCBzdGF0ZS0+cGF0aC5hY3RpdmUrKykgeworCQkvKgorCQkgKiBSZWFkIHRoZSBuZXh0IG5vZGUgZG93biBpbiB0aGUgdHJlZS4KKwkJICovCisJCWJsay0+Ymxrbm8gPSBibGtubzsKKwkJZXJyb3IgPSB4ZnNfZGFfcmVhZF9idWYoYXJncy0+dHJhbnMsIGFyZ3MtPmRwLCBibGtubywKKwkJCQkJLTEsICZibGstPmJwLCBhcmdzLT53aGljaGZvcmspOworCQlpZiAoZXJyb3IpIHsKKwkJCWJsay0+Ymxrbm8gPSAwOworCQkJc3RhdGUtPnBhdGguYWN0aXZlLS07CisJCQlyZXR1cm4oZXJyb3IpOworCQl9CisJCWN1cnIgPSBibGstPmJwLT5kYXRhOworCQlBU1NFUlQoSU5UX0dFVChjdXJyLT5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfREFfTk9ERV9NQUdJQyB8fAorCQkgICAgICAgSU5UX0dFVChjdXJyLT5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSWF9MRUFGX01BR0lDKHN0YXRlLT5tcCkgfHwKKwkJICAgICAgIElOVF9HRVQoY3Vyci0+bWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisKKwkJLyoKKwkJICogU2VhcmNoIGFuIGludGVybWVkaWF0ZSBub2RlIGZvciBhIG1hdGNoLgorCQkgKi8KKwkJYmxrLT5tYWdpYyA9IElOVF9HRVQoY3Vyci0+bWFnaWMsIEFSQ0hfQ09OVkVSVCk7CisJCWlmIChJTlRfR0VUKGN1cnItPm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19EQV9OT0RFX01BR0lDKSB7CisJCQlub2RlID0gYmxrLT5icC0+ZGF0YTsKKwkJCWJsay0+aGFzaHZhbCA9IElOVF9HRVQobm9kZS0+YnRyZWVbIElOVF9HRVQobm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpLTEgXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpOworCisJCQkvKgorCQkJICogQmluYXJ5IHNlYXJjaC4gIChub3RlOiBzbWFsbCBibG9ja3Mgd2lsbCBza2lwIGxvb3ApCisJCQkgKi8KKwkJCW1heCA9IElOVF9HRVQobm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOworCQkJcHJvYmUgPSBzcGFuID0gbWF4IC8gMjsKKwkJCWhhc2h2YWwgPSBhcmdzLT5oYXNodmFsOworCQkJZm9yIChidHJlZSA9ICZub2RlLT5idHJlZVtwcm9iZV07IHNwYW4gPiA0OworCQkJCSAgIGJ0cmVlID0gJm5vZGUtPmJ0cmVlW3Byb2JlXSkgeworCQkJCXNwYW4gLz0gMjsKKwkJCQlpZiAoSU5UX0dFVChidHJlZS0+aGFzaHZhbCwgQVJDSF9DT05WRVJUKSA8IGhhc2h2YWwpCisJCQkJCXByb2JlICs9IHNwYW47CisJCQkJZWxzZSBpZiAoSU5UX0dFVChidHJlZS0+aGFzaHZhbCwgQVJDSF9DT05WRVJUKSA+IGhhc2h2YWwpCisJCQkJCXByb2JlIC09IHNwYW47CisJCQkJZWxzZQorCQkJCQlicmVhazsKKwkJCX0KKwkJCUFTU0VSVCgocHJvYmUgPj0gMCkgJiYgKHByb2JlIDwgbWF4KSk7CisJCQlBU1NFUlQoKHNwYW4gPD0gNCkgfHwgKElOVF9HRVQoYnRyZWUtPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkgPT0gaGFzaHZhbCkpOworCisJCQkvKgorCQkJICogU2luY2Ugd2UgbWF5IGhhdmUgZHVwbGljYXRlIGhhc2h2YWwncywgZmluZCB0aGUgZmlyc3QKKwkJCSAqIG1hdGNoaW5nIGhhc2h2YWwgaW4gdGhlIG5vZGUuCisJCQkgKi8KKwkJCXdoaWxlICgocHJvYmUgPiAwKSAmJiAoSU5UX0dFVChidHJlZS0+aGFzaHZhbCwgQVJDSF9DT05WRVJUKSA+PSBoYXNodmFsKSkgeworCQkJCWJ0cmVlLS07CisJCQkJcHJvYmUtLTsKKwkJCX0KKwkJCXdoaWxlICgocHJvYmUgPCBtYXgpICYmIChJTlRfR0VUKGJ0cmVlLT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpIDwgaGFzaHZhbCkpIHsKKwkJCQlidHJlZSsrOworCQkJCXByb2JlKys7CisJCQl9CisKKwkJCS8qCisJCQkgKiBQaWNrIHRoZSByaWdodCBibG9jayB0byBkZXNjZW5kIG9uLgorCQkJICovCisJCQlpZiAocHJvYmUgPT0gbWF4KSB7CisJCQkJYmxrLT5pbmRleCA9IG1heC0xOworCQkJCWJsa25vID0gSU5UX0dFVChub2RlLT5idHJlZVsgbWF4LTEgXS5iZWZvcmUsIEFSQ0hfQ09OVkVSVCk7CisJCQl9IGVsc2UgeworCQkJCWJsay0+aW5kZXggPSBwcm9iZTsKKwkJCQlibGtubyA9IElOVF9HRVQoYnRyZWUtPmJlZm9yZSwgQVJDSF9DT05WRVJUKTsKKwkJCX0KKwkJfQorI2lmZGVmIF9fS0VSTkVMX18KKwkJZWxzZSBpZiAoSU5UX0dFVChjdXJyLT5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfQVRUUl9MRUFGX01BR0lDKSB7CisJCQlibGstPmhhc2h2YWwgPSB4ZnNfYXR0cl9sZWFmX2xhc3RoYXNoKGJsay0+YnAsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCQllbHNlIGlmIChJTlRfR0VUKGN1cnItPm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVJfTEVBRl9NQUdJQykgeworCQkJYmxrLT5oYXNodmFsID0geGZzX2Rpcl9sZWFmX2xhc3RoYXNoKGJsay0+YnAsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJZWxzZSBpZiAoSU5UX0dFVChjdXJyLT5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9MRUFGTl9NQUdJQykgeworCQkJYmxrLT5oYXNodmFsID0geGZzX2RpcjJfbGVhZm5fbGFzdGhhc2goYmxrLT5icCwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qCisJICogQSBsZWFmIGJsb2NrIHRoYXQgZW5kcyBpbiB0aGUgaGFzaHZhbCB0aGF0IHdlIGFyZSBpbnRlcmVzdGVkIGluCisJICogKGZpbmFsIGhhc2h2YWwgPT0gc2VhcmNoIGhhc2h2YWwpIG1lYW5zIHRoYXQgdGhlIG5leHQgYmxvY2sgbWF5CisJICogY29udGFpbiBtb3JlIGVudHJpZXMgd2l0aCB0aGUgc2FtZSBoYXNodmFsLCBzaGlmdCB1cHdhcmQgdG8gdGhlCisJICogbmV4dCBsZWFmIGFuZCBrZWVwIHNlYXJjaGluZy4KKwkgKi8KKwlmb3IgKDs7KSB7CisJCWlmIChibGstPm1hZ2ljID09IFhGU19ESVJfTEVBRl9NQUdJQykgeworCQkJQVNTRVJUKFhGU19ESVJfSVNfVjEoc3RhdGUtPm1wKSk7CisJCQlyZXR2YWwgPSB4ZnNfZGlyX2xlYWZfbG9va3VwX2ludChibGstPmJwLCBhcmdzLAorCQkJCQkJCQkgICZibGstPmluZGV4KTsKKwkJfSBlbHNlIGlmIChibGstPm1hZ2ljID09IFhGU19ESVIyX0xFQUZOX01BR0lDKSB7CisJCQlBU1NFUlQoWEZTX0RJUl9JU19WMihzdGF0ZS0+bXApKTsKKwkJCXJldHZhbCA9IHhmc19kaXIyX2xlYWZuX2xvb2t1cF9pbnQoYmxrLT5icCwgYXJncywKKwkJCQkJCQkmYmxrLT5pbmRleCwgc3RhdGUpOworCQl9CisjaWZkZWYgX19LRVJORUxfXworCQllbHNlIGlmIChibGstPm1hZ2ljID09IFhGU19BVFRSX0xFQUZfTUFHSUMpIHsKKwkJCXJldHZhbCA9IHhmc19hdHRyX2xlYWZfbG9va3VwX2ludChibGstPmJwLCBhcmdzKTsKKwkJCWJsay0+aW5kZXggPSBhcmdzLT5pbmRleDsKKwkJCWFyZ3MtPmJsa25vID0gYmxrLT5ibGtubzsKKwkJfQorI2VuZGlmCisJCWlmICgoKHJldHZhbCA9PSBFTk9FTlQpIHx8IChyZXR2YWwgPT0gRU5PQVRUUikpICYmCisJCSAgICAoYmxrLT5oYXNodmFsID09IGFyZ3MtPmhhc2h2YWwpKSB7CisJCQllcnJvciA9IHhmc19kYV9wYXRoX3NoaWZ0KHN0YXRlLCAmc3RhdGUtPnBhdGgsIDEsIDEsCisJCQkJCQkJICZyZXR2YWwpOworCQkJaWYgKGVycm9yKQorCQkJCXJldHVybihlcnJvcik7CisJCQlpZiAocmV0dmFsID09IDApIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKyNpZmRlZiBfX0tFUk5FTF9fCisJCQllbHNlIGlmIChibGstPm1hZ2ljID09IFhGU19BVFRSX0xFQUZfTUFHSUMpIHsKKwkJCQkvKiBwYXRoX3NoaWZ0KCkgZ2l2ZXMgRU5PRU5UICovCisJCQkJcmV0dmFsID0gWEZTX0VSUk9SKEVOT0FUVFIpOworCQkJfQorI2VuZGlmCisJCX0KKwkJYnJlYWs7CisJfQorCSpyZXN1bHQgPSByZXR2YWw7CisJcmV0dXJuKDApOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAqIExpbmsgYSBuZXcgYmxvY2sgaW50byBhIGRvdWJseSBsaW5rZWQgbGlzdCBvZiBibG9ja3MgKG9mIHdoYXRldmVyIHR5cGUpLgorICovCitpbnQJCQkJCQkJLyogZXJyb3IgKi8KK3hmc19kYV9ibGtfbGluayh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUsIHhmc19kYV9zdGF0ZV9ibGtfdCAqb2xkX2JsaywKKwkJCSAgICAgICB4ZnNfZGFfc3RhdGVfYmxrX3QgKm5ld19ibGspCit7CisJeGZzX2RhX2Jsa2luZm9fdCAqb2xkX2luZm8sICpuZXdfaW5mbywgKnRtcF9pbmZvOworCXhmc19kYV9hcmdzX3QgKmFyZ3M7CisJaW50IGJlZm9yZT0wLCBlcnJvcjsKKwl4ZnNfZGFidWZfdCAqYnA7CisKKwkvKgorCSAqIFNldCB1cCBlbnZpcm9ubWVudC4KKwkgKi8KKwlhcmdzID0gc3RhdGUtPmFyZ3M7CisJQVNTRVJUKGFyZ3MgIT0gTlVMTCk7CisJb2xkX2luZm8gPSBvbGRfYmxrLT5icC0+ZGF0YTsKKwluZXdfaW5mbyA9IG5ld19ibGstPmJwLT5kYXRhOworCUFTU0VSVChvbGRfYmxrLT5tYWdpYyA9PSBYRlNfREFfTk9ERV9NQUdJQyB8fAorCSAgICAgICBvbGRfYmxrLT5tYWdpYyA9PSBYRlNfRElSWF9MRUFGX01BR0lDKHN0YXRlLT5tcCkgfHwKKwkgICAgICAgb2xkX2Jsay0+bWFnaWMgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisJQVNTRVJUKG9sZF9ibGstPm1hZ2ljID09IElOVF9HRVQob2xkX2luZm8tPm1hZ2ljLCBBUkNIX0NPTlZFUlQpKTsKKwlBU1NFUlQobmV3X2Jsay0+bWFnaWMgPT0gSU5UX0dFVChuZXdfaW5mby0+bWFnaWMsIEFSQ0hfQ09OVkVSVCkpOworCUFTU0VSVChvbGRfYmxrLT5tYWdpYyA9PSBuZXdfYmxrLT5tYWdpYyk7CisKKwlzd2l0Y2ggKG9sZF9ibGstPm1hZ2ljKSB7CisjaWZkZWYgX19LRVJORUxfXworCWNhc2UgWEZTX0FUVFJfTEVBRl9NQUdJQzoKKwkJYmVmb3JlID0geGZzX2F0dHJfbGVhZl9vcmRlcihvbGRfYmxrLT5icCwgbmV3X2Jsay0+YnApOworCQlicmVhazsKKyNlbmRpZgorCWNhc2UgWEZTX0RJUl9MRUFGX01BR0lDOgorCQlBU1NFUlQoWEZTX0RJUl9JU19WMShzdGF0ZS0+bXApKTsKKwkJYmVmb3JlID0geGZzX2Rpcl9sZWFmX29yZGVyKG9sZF9ibGstPmJwLCBuZXdfYmxrLT5icCk7CisJCWJyZWFrOworCWNhc2UgWEZTX0RJUjJfTEVBRk5fTUFHSUM6CisJCUFTU0VSVChYRlNfRElSX0lTX1YyKHN0YXRlLT5tcCkpOworCQliZWZvcmUgPSB4ZnNfZGlyMl9sZWFmbl9vcmRlcihvbGRfYmxrLT5icCwgbmV3X2Jsay0+YnApOworCQlicmVhazsKKwljYXNlIFhGU19EQV9OT0RFX01BR0lDOgorCQliZWZvcmUgPSB4ZnNfZGFfbm9kZV9vcmRlcihvbGRfYmxrLT5icCwgbmV3X2Jsay0+YnApOworCQlicmVhazsKKwl9CisKKwkvKgorCSAqIExpbmsgYmxvY2tzIGluIGFwcHJvcHJpYXRlIG9yZGVyLgorCSAqLworCWlmIChiZWZvcmUpIHsKKwkJLyoKKwkJICogTGluayBuZXcgYmxvY2sgaW4gYmVmb3JlIGV4aXN0aW5nIGJsb2NrLgorCQkgKi8KKwkJSU5UX1NFVChuZXdfaW5mby0+Zm9ydywgQVJDSF9DT05WRVJULCBvbGRfYmxrLT5ibGtubyk7CisJCW5ld19pbmZvLT5iYWNrID0gb2xkX2luZm8tPmJhY2s7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCisJCWlmIChJTlRfR0VUKG9sZF9pbmZvLT5iYWNrLCBBUkNIX0NPTlZFUlQpKSB7CisJCQllcnJvciA9IHhmc19kYV9yZWFkX2J1ZihhcmdzLT50cmFucywgYXJncy0+ZHAsCisJCQkJCQlJTlRfR0VUKG9sZF9pbmZvLT5iYWNrLAorCQkJCQkJCUFSQ0hfQ09OVkVSVCksIC0xLCAmYnAsCisJCQkJCQlhcmdzLT53aGljaGZvcmspOworCQkJaWYgKGVycm9yKQorCQkJCXJldHVybihlcnJvcik7CisJCQlBU1NFUlQoYnAgIT0gTlVMTCk7CisJCQl0bXBfaW5mbyA9IGJwLT5kYXRhOworCQkJQVNTRVJUKElOVF9HRVQodG1wX2luZm8tPm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IElOVF9HRVQob2xkX2luZm8tPm1hZ2ljLCBBUkNIX0NPTlZFUlQpKTsKKwkJCUFTU0VSVChJTlRfR0VUKHRtcF9pbmZvLT5mb3J3LCBBUkNIX0NPTlZFUlQpID09IG9sZF9ibGstPmJsa25vKTsKKwkJCUlOVF9TRVQodG1wX2luZm8tPmZvcncsIEFSQ0hfQ09OVkVSVCwgbmV3X2Jsay0+Ymxrbm8pOworCQkJeGZzX2RhX2xvZ19idWYoYXJncy0+dHJhbnMsIGJwLCAwLCBzaXplb2YoKnRtcF9pbmZvKS0xKTsKKwkJCXhmc19kYV9idWZfZG9uZShicCk7CisJCX0KKwkJSU5UX1NFVChvbGRfaW5mby0+YmFjaywgQVJDSF9DT05WRVJULCBuZXdfYmxrLT5ibGtubyk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogTGluayBuZXcgYmxvY2sgaW4gYWZ0ZXIgZXhpc3RpbmcgYmxvY2suCisJCSAqLworCQluZXdfaW5mby0+Zm9ydyA9IG9sZF9pbmZvLT5mb3J3OyAvKiBJTlRfOiBkaXJlY3QgY29weSAqLworCQlJTlRfU0VUKG5ld19pbmZvLT5iYWNrLCBBUkNIX0NPTlZFUlQsIG9sZF9ibGstPmJsa25vKTsKKwkJaWYgKElOVF9HRVQob2xkX2luZm8tPmZvcncsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJCWVycm9yID0geGZzX2RhX3JlYWRfYnVmKGFyZ3MtPnRyYW5zLCBhcmdzLT5kcCwKKwkJCQkJCUlOVF9HRVQob2xkX2luZm8tPmZvcncsIEFSQ0hfQ09OVkVSVCksIC0xLCAmYnAsCisJCQkJCQlhcmdzLT53aGljaGZvcmspOworCQkJaWYgKGVycm9yKQorCQkJCXJldHVybihlcnJvcik7CisJCQlBU1NFUlQoYnAgIT0gTlVMTCk7CisJCQl0bXBfaW5mbyA9IGJwLT5kYXRhOworCQkJQVNTRVJUKElOVF9HRVQodG1wX2luZm8tPm1hZ2ljLCBBUkNIX0NPTlZFUlQpCisJCQkJICAgID09IElOVF9HRVQob2xkX2luZm8tPm1hZ2ljLCBBUkNIX0NPTlZFUlQpKTsKKwkJCUFTU0VSVChJTlRfR0VUKHRtcF9pbmZvLT5iYWNrLCBBUkNIX0NPTlZFUlQpCisJCQkJICAgID09IG9sZF9ibGstPmJsa25vKTsKKwkJCUlOVF9TRVQodG1wX2luZm8tPmJhY2ssIEFSQ0hfQ09OVkVSVCwgbmV3X2Jsay0+Ymxrbm8pOworCQkJeGZzX2RhX2xvZ19idWYoYXJncy0+dHJhbnMsIGJwLCAwLCBzaXplb2YoKnRtcF9pbmZvKS0xKTsKKwkJCXhmc19kYV9idWZfZG9uZShicCk7CisJCX0KKwkJSU5UX1NFVChvbGRfaW5mby0+Zm9ydywgQVJDSF9DT05WRVJULCBuZXdfYmxrLT5ibGtubyk7CisJfQorCisJeGZzX2RhX2xvZ19idWYoYXJncy0+dHJhbnMsIG9sZF9ibGstPmJwLCAwLCBzaXplb2YoKnRtcF9pbmZvKSAtIDEpOworCXhmc19kYV9sb2dfYnVmKGFyZ3MtPnRyYW5zLCBuZXdfYmxrLT5icCwgMCwgc2l6ZW9mKCp0bXBfaW5mbykgLSAxKTsKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBDb21wYXJlIHR3byBpbnRlcm1lZGlhdGUgbm9kZXMgZm9yICJvcmRlciIuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19kYV9ub2RlX29yZGVyKHhmc19kYWJ1Zl90ICpub2RlMV9icCwgeGZzX2RhYnVmX3QgKm5vZGUyX2JwKQoreworCXhmc19kYV9pbnRub2RlX3QgKm5vZGUxLCAqbm9kZTI7CisKKwlub2RlMSA9IG5vZGUxX2JwLT5kYXRhOworCW5vZGUyID0gbm9kZTJfYnAtPmRhdGE7CisJQVNTRVJUKChJTlRfR0VUKG5vZGUxLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfREFfTk9ERV9NQUdJQykgJiYKKwkgICAgICAgKElOVF9HRVQobm9kZTItPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19EQV9OT0RFX01BR0lDKSk7CisJaWYgKChJTlRfR0VUKG5vZGUxLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgPiAwKSAmJiAoSU5UX0dFVChub2RlMi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpID4gMCkgJiYKKwkgICAgKChJTlRfR0VUKG5vZGUyLT5idHJlZVsgMCBdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkgPAorCSAgICAgIElOVF9HRVQobm9kZTEtPmJ0cmVlWyAwIF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSkgfHwKKwkgICAgIChJTlRfR0VUKG5vZGUyLT5idHJlZVsgSU5UX0dFVChub2RlMi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpLTEgXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpIDwKKwkgICAgICBJTlRfR0VUKG5vZGUxLT5idHJlZVsgSU5UX0dFVChub2RlMS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpLTEgXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpKSkpIHsKKwkJcmV0dXJuKDEpOworCX0KKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBQaWNrIHVwIHRoZSBsYXN0IGhhc2h2YWx1ZSBmcm9tIGFuIGludGVybWVkaWF0ZSBub2RlLgorICovCitTVEFUSUMgdWludAoreGZzX2RhX25vZGVfbGFzdGhhc2goeGZzX2RhYnVmX3QgKmJwLCBpbnQgKmNvdW50KQoreworCXhmc19kYV9pbnRub2RlX3QgKm5vZGU7CisKKwlub2RlID0gYnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQobm9kZS0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RBX05PREVfTUFHSUMpOworCWlmIChjb3VudCkKKwkJKmNvdW50ID0gSU5UX0dFVChub2RlLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJaWYgKCFub2RlLT5oZHIuY291bnQpCisJCXJldHVybigwKTsKKwlyZXR1cm4oSU5UX0dFVChub2RlLT5idHJlZVsgSU5UX0dFVChub2RlLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCktMSBdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkpOworfQorCisvKgorICogVW5saW5rIGEgYmxvY2sgZnJvbSBhIGRvdWJseSBsaW5rZWQgbGlzdCBvZiBibG9ja3MuCisgKi8KK2ludAkJCQkJCQkvKiBlcnJvciAqLworeGZzX2RhX2Jsa191bmxpbmsoeGZzX2RhX3N0YXRlX3QgKnN0YXRlLCB4ZnNfZGFfc3RhdGVfYmxrX3QgKmRyb3BfYmxrLAorCQkJCSB4ZnNfZGFfc3RhdGVfYmxrX3QgKnNhdmVfYmxrKQoreworCXhmc19kYV9ibGtpbmZvX3QgKmRyb3BfaW5mbywgKnNhdmVfaW5mbywgKnRtcF9pbmZvOworCXhmc19kYV9hcmdzX3QgKmFyZ3M7CisJeGZzX2RhYnVmX3QgKmJwOworCWludCBlcnJvcjsKKworCS8qCisJICogU2V0IHVwIGVudmlyb25tZW50LgorCSAqLworCWFyZ3MgPSBzdGF0ZS0+YXJnczsKKwlBU1NFUlQoYXJncyAhPSBOVUxMKTsKKwlzYXZlX2luZm8gPSBzYXZlX2Jsay0+YnAtPmRhdGE7CisJZHJvcF9pbmZvID0gZHJvcF9ibGstPmJwLT5kYXRhOworCUFTU0VSVChzYXZlX2Jsay0+bWFnaWMgPT0gWEZTX0RBX05PREVfTUFHSUMgfHwKKwkgICAgICAgc2F2ZV9ibGstPm1hZ2ljID09IFhGU19ESVJYX0xFQUZfTUFHSUMoc3RhdGUtPm1wKSB8fAorCSAgICAgICBzYXZlX2Jsay0+bWFnaWMgPT0gWEZTX0FUVFJfTEVBRl9NQUdJQyk7CisJQVNTRVJUKHNhdmVfYmxrLT5tYWdpYyA9PSBJTlRfR0VUKHNhdmVfaW5mby0+bWFnaWMsIEFSQ0hfQ09OVkVSVCkpOworCUFTU0VSVChkcm9wX2Jsay0+bWFnaWMgPT0gSU5UX0dFVChkcm9wX2luZm8tPm1hZ2ljLCBBUkNIX0NPTlZFUlQpKTsKKwlBU1NFUlQoc2F2ZV9ibGstPm1hZ2ljID09IGRyb3BfYmxrLT5tYWdpYyk7CisJQVNTRVJUKChJTlRfR0VUKHNhdmVfaW5mby0+Zm9ydywgQVJDSF9DT05WRVJUKSA9PSBkcm9wX2Jsay0+Ymxrbm8pIHx8CisJICAgICAgIChJTlRfR0VUKHNhdmVfaW5mby0+YmFjaywgQVJDSF9DT05WRVJUKSA9PSBkcm9wX2Jsay0+Ymxrbm8pKTsKKwlBU1NFUlQoKElOVF9HRVQoZHJvcF9pbmZvLT5mb3J3LCBBUkNIX0NPTlZFUlQpID09IHNhdmVfYmxrLT5ibGtubykgfHwKKwkgICAgICAgKElOVF9HRVQoZHJvcF9pbmZvLT5iYWNrLCBBUkNIX0NPTlZFUlQpID09IHNhdmVfYmxrLT5ibGtubykpOworCisJLyoKKwkgKiBVbmxpbmsgdGhlIGxlYWYgYmxvY2sgZnJvbSB0aGUgZG91Ymx5IGxpbmtlZCBjaGFpbiBvZiBsZWF2ZXMuCisJICovCisJaWYgKElOVF9HRVQoc2F2ZV9pbmZvLT5iYWNrLCBBUkNIX0NPTlZFUlQpID09IGRyb3BfYmxrLT5ibGtubykgeworCQlzYXZlX2luZm8tPmJhY2sgPSBkcm9wX2luZm8tPmJhY2s7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCisJCWlmIChJTlRfR0VUKGRyb3BfaW5mby0+YmFjaywgQVJDSF9DT05WRVJUKSkgeworCQkJZXJyb3IgPSB4ZnNfZGFfcmVhZF9idWYoYXJncy0+dHJhbnMsIGFyZ3MtPmRwLAorCQkJCQkJSU5UX0dFVChkcm9wX2luZm8tPmJhY2ssCisJCQkJCQkJQVJDSF9DT05WRVJUKSwgLTEsICZicCwKKwkJCQkJCWFyZ3MtPndoaWNoZm9yayk7CisJCQlpZiAoZXJyb3IpCisJCQkJcmV0dXJuKGVycm9yKTsKKwkJCUFTU0VSVChicCAhPSBOVUxMKTsKKwkJCXRtcF9pbmZvID0gYnAtPmRhdGE7CisJCQlBU1NFUlQoSU5UX0dFVCh0bXBfaW5mby0+bWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gSU5UX0dFVChzYXZlX2luZm8tPm1hZ2ljLCBBUkNIX0NPTlZFUlQpKTsKKwkJCUFTU0VSVChJTlRfR0VUKHRtcF9pbmZvLT5mb3J3LCBBUkNIX0NPTlZFUlQpID09IGRyb3BfYmxrLT5ibGtubyk7CisJCQlJTlRfU0VUKHRtcF9pbmZvLT5mb3J3LCBBUkNIX0NPTlZFUlQsIHNhdmVfYmxrLT5ibGtubyk7CisJCQl4ZnNfZGFfbG9nX2J1ZihhcmdzLT50cmFucywgYnAsIDAsCisJCQkJCQkgICAgc2l6ZW9mKCp0bXBfaW5mbykgLSAxKTsKKwkJCXhmc19kYV9idWZfZG9uZShicCk7CisJCX0KKwl9IGVsc2UgeworCQlzYXZlX2luZm8tPmZvcncgPSBkcm9wX2luZm8tPmZvcnc7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCisJCWlmIChJTlRfR0VUKGRyb3BfaW5mby0+Zm9ydywgQVJDSF9DT05WRVJUKSkgeworCQkJZXJyb3IgPSB4ZnNfZGFfcmVhZF9idWYoYXJncy0+dHJhbnMsIGFyZ3MtPmRwLAorCQkJCQkJSU5UX0dFVChkcm9wX2luZm8tPmZvcncsIEFSQ0hfQ09OVkVSVCksIC0xLCAmYnAsCisJCQkJCQlhcmdzLT53aGljaGZvcmspOworCQkJaWYgKGVycm9yKQorCQkJCXJldHVybihlcnJvcik7CisJCQlBU1NFUlQoYnAgIT0gTlVMTCk7CisJCQl0bXBfaW5mbyA9IGJwLT5kYXRhOworCQkJQVNTRVJUKElOVF9HRVQodG1wX2luZm8tPm1hZ2ljLCBBUkNIX0NPTlZFUlQpCisJCQkJICAgID09IElOVF9HRVQoc2F2ZV9pbmZvLT5tYWdpYywgQVJDSF9DT05WRVJUKSk7CisJCQlBU1NFUlQoSU5UX0dFVCh0bXBfaW5mby0+YmFjaywgQVJDSF9DT05WRVJUKQorCQkJCSAgICA9PSBkcm9wX2Jsay0+Ymxrbm8pOworCQkJSU5UX1NFVCh0bXBfaW5mby0+YmFjaywgQVJDSF9DT05WRVJULCBzYXZlX2Jsay0+Ymxrbm8pOworCQkJeGZzX2RhX2xvZ19idWYoYXJncy0+dHJhbnMsIGJwLCAwLAorCQkJCQkJICAgIHNpemVvZigqdG1wX2luZm8pIC0gMSk7CisJCQl4ZnNfZGFfYnVmX2RvbmUoYnApOworCQl9CisJfQorCisJeGZzX2RhX2xvZ19idWYoYXJncy0+dHJhbnMsIHNhdmVfYmxrLT5icCwgMCwgc2l6ZW9mKCpzYXZlX2luZm8pIC0gMSk7CisJcmV0dXJuKDApOworfQorCisvKgorICogTW92ZSBhIHBhdGggImZvcndhcmQiIG9yICIhZm9yd2FyZCIgb25lIGJsb2NrIGF0IHRoZSBjdXJyZW50IGxldmVsLgorICoKKyAqIFRoaXMgcm91dGluZSB3aWxsIGFkanVzdCBhICJwYXRoIiB0byBwb2ludCB0byB0aGUgbmV4dCBibG9jaworICogImZvcndhcmQiIChoaWdoZXIgaGFzaHZhbHVlcykgb3IgIiFmb3J3YXJkIiAobG93ZXIgaGFzaHZhbHMpIGluIHRoZQorICogQnRyZWUsIGluY2x1ZGluZyB1cGRhdGluZyBwb2ludGVycyB0byB0aGUgaW50ZXJtZWRpYXRlIG5vZGVzIGJldHdlZW4KKyAqIHRoZSBuZXcgYm90dG9tIGFuZCB0aGUgcm9vdC4KKyAqLworaW50CQkJCQkJCS8qIGVycm9yICovCit4ZnNfZGFfcGF0aF9zaGlmdCh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUsIHhmc19kYV9zdGF0ZV9wYXRoX3QgKnBhdGgsCisJCQkJIGludCBmb3J3YXJkLCBpbnQgcmVsZWFzZSwgaW50ICpyZXN1bHQpCit7CisJeGZzX2RhX3N0YXRlX2Jsa190ICpibGs7CisJeGZzX2RhX2Jsa2luZm9fdCAqaW5mbzsKKwl4ZnNfZGFfaW50bm9kZV90ICpub2RlOworCXhmc19kYV9hcmdzX3QgKmFyZ3M7CisJeGZzX2RhYmxrX3QgYmxrbm89MDsKKwlpbnQgbGV2ZWwsIGVycm9yOworCisJLyoKKwkgKiBSb2xsIHVwIHRoZSBCdHJlZSBsb29raW5nIGZvciB0aGUgZmlyc3QgYmxvY2sgd2hlcmUgb3VyCisJICogY3VycmVudCBpbmRleCBpcyBub3QgYXQgdGhlIGVkZ2Ugb2YgdGhlIGJsb2NrLiAgTm90ZSB0aGF0CisJICogd2Ugc2tpcCB0aGUgYm90dG9tIGxheWVyIGJlY2F1c2Ugd2Ugd2FudCB0aGUgc2libGluZyBibG9jay4KKwkgKi8KKwlhcmdzID0gc3RhdGUtPmFyZ3M7CisJQVNTRVJUKGFyZ3MgIT0gTlVMTCk7CisJQVNTRVJUKHBhdGggIT0gTlVMTCk7CisJQVNTRVJUKChwYXRoLT5hY3RpdmUgPiAwKSAmJiAocGF0aC0+YWN0aXZlIDwgWEZTX0RBX05PREVfTUFYREVQVEgpKTsKKwlsZXZlbCA9IChwYXRoLT5hY3RpdmUtMSkgLSAxOwkvKiBza2lwIGJvdHRvbSBsYXllciBpbiBwYXRoICovCisJZm9yIChibGsgPSAmcGF0aC0+YmxrW2xldmVsXTsgbGV2ZWwgPj0gMDsgYmxrLS0sIGxldmVsLS0pIHsKKwkJQVNTRVJUKGJsay0+YnAgIT0gTlVMTCk7CisJCW5vZGUgPSBibGstPmJwLT5kYXRhOworCQlBU1NFUlQoSU5UX0dFVChub2RlLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfREFfTk9ERV9NQUdJQyk7CisJCWlmIChmb3J3YXJkICYmIChibGstPmluZGV4IDwgSU5UX0dFVChub2RlLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCktMSkpIHsKKwkJCWJsay0+aW5kZXgrKzsKKwkJCWJsa25vID0gSU5UX0dFVChub2RlLT5idHJlZVsgYmxrLT5pbmRleCBdLmJlZm9yZSwgQVJDSF9DT05WRVJUKTsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKCFmb3J3YXJkICYmIChibGstPmluZGV4ID4gMCkpIHsKKwkJCWJsay0+aW5kZXgtLTsKKwkJCWJsa25vID0gSU5UX0dFVChub2RlLT5idHJlZVsgYmxrLT5pbmRleCBdLmJlZm9yZSwgQVJDSF9DT05WRVJUKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChsZXZlbCA8IDApIHsKKwkJKnJlc3VsdCA9IFhGU19FUlJPUihFTk9FTlQpOwkvKiB3ZSdyZSBvdXQgb2Ygb3VyIHRyZWUgKi8KKwkJQVNTRVJUKGFyZ3MtPm9rbm9lbnQpOworCQlyZXR1cm4oMCk7CisJfQorCisJLyoKKwkgKiBSb2xsIGRvd24gdGhlIGVkZ2Ugb2YgdGhlIHN1YnRyZWUgdW50aWwgd2UgcmVhY2ggdGhlCisJICogc2FtZSBkZXB0aCB3ZSB3ZXJlIGF0IG9yaWdpbmFsbHkuCisJICovCisJZm9yIChibGsrKywgbGV2ZWwrKzsgbGV2ZWwgPCBwYXRoLT5hY3RpdmU7IGJsaysrLCBsZXZlbCsrKSB7CisJCS8qCisJCSAqIFJlbGVhc2UgdGhlIG9sZCBibG9jay4KKwkJICogKGlmIGl0J3MgZGlydHksIHRyYW5zIHdvbid0IGFjdHVhbGx5IGxldCBnbykKKwkJICovCisJCWlmIChyZWxlYXNlKQorCQkJeGZzX2RhX2JyZWxzZShhcmdzLT50cmFucywgYmxrLT5icCk7CisKKwkJLyoKKwkJICogUmVhZCB0aGUgbmV4dCBjaGlsZCBibG9jay4KKwkJICovCisJCWJsay0+Ymxrbm8gPSBibGtubzsKKwkJZXJyb3IgPSB4ZnNfZGFfcmVhZF9idWYoYXJncy0+dHJhbnMsIGFyZ3MtPmRwLCBibGtubywgLTEsCisJCQkJCQkgICAgICZibGstPmJwLCBhcmdzLT53aGljaGZvcmspOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4oZXJyb3IpOworCQlBU1NFUlQoYmxrLT5icCAhPSBOVUxMKTsKKwkJaW5mbyA9IGJsay0+YnAtPmRhdGE7CisJCUFTU0VSVChJTlRfR0VUKGluZm8tPm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19EQV9OT0RFX01BR0lDIHx8CisJCSAgICAgICBJTlRfR0VUKGluZm8tPm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVJYX0xFQUZfTUFHSUMoc3RhdGUtPm1wKSB8fAorCQkgICAgICAgSU5UX0dFVChpbmZvLT5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfQVRUUl9MRUFGX01BR0lDKTsKKwkJYmxrLT5tYWdpYyA9IElOVF9HRVQoaW5mby0+bWFnaWMsIEFSQ0hfQ09OVkVSVCk7CisJCWlmIChJTlRfR0VUKGluZm8tPm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19EQV9OT0RFX01BR0lDKSB7CisJCQlub2RlID0gKHhmc19kYV9pbnRub2RlX3QgKilpbmZvOworCQkJYmxrLT5oYXNodmFsID0gSU5UX0dFVChub2RlLT5idHJlZVsgSU5UX0dFVChub2RlLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCktMSBdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCk7CisJCQlpZiAoZm9yd2FyZCkKKwkJCQlibGstPmluZGV4ID0gMDsKKwkJCWVsc2UKKwkJCQlibGstPmluZGV4ID0gSU5UX0dFVChub2RlLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCktMTsKKwkJCWJsa25vID0gSU5UX0dFVChub2RlLT5idHJlZVsgYmxrLT5pbmRleCBdLmJlZm9yZSwgQVJDSF9DT05WRVJUKTsKKwkJfSBlbHNlIHsKKwkJCUFTU0VSVChsZXZlbCA9PSBwYXRoLT5hY3RpdmUtMSk7CisJCQlibGstPmluZGV4ID0gMDsKKwkJCXN3aXRjaChibGstPm1hZ2ljKSB7CisjaWZkZWYgX19LRVJORUxfXworCQkJY2FzZSBYRlNfQVRUUl9MRUFGX01BR0lDOgorCQkJCWJsay0+aGFzaHZhbCA9IHhmc19hdHRyX2xlYWZfbGFzdGhhc2goYmxrLT5icCwKKwkJCQkJCQkJICAgICAgTlVMTCk7CisJCQkJYnJlYWs7CisjZW5kaWYKKwkJCWNhc2UgWEZTX0RJUl9MRUFGX01BR0lDOgorCQkJCUFTU0VSVChYRlNfRElSX0lTX1YxKHN0YXRlLT5tcCkpOworCQkJCWJsay0+aGFzaHZhbCA9IHhmc19kaXJfbGVhZl9sYXN0aGFzaChibGstPmJwLAorCQkJCQkJCQkgICAgIE5VTEwpOworCQkJCWJyZWFrOworCQkJY2FzZSBYRlNfRElSMl9MRUFGTl9NQUdJQzoKKwkJCQlBU1NFUlQoWEZTX0RJUl9JU19WMihzdGF0ZS0+bXApKTsKKwkJCQlibGstPmhhc2h2YWwgPSB4ZnNfZGlyMl9sZWFmbl9sYXN0aGFzaChibGstPmJwLAorCQkJCQkJCQkgICAgICAgTlVMTCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCUFTU0VSVChibGstPm1hZ2ljID09IFhGU19BVFRSX0xFQUZfTUFHSUMgfHwKKwkJCQkgICAgICAgYmxrLT5tYWdpYyA9PQorCQkJCSAgICAgICBYRlNfRElSWF9MRUFGX01BR0lDKHN0YXRlLT5tcCkpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCSpyZXN1bHQgPSAwOworCXJldHVybigwKTsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAqIEltcGxlbWVudCBhIHNpbXBsZSBoYXNoIG9uIGEgY2hhcmFjdGVyIHN0cmluZy4KKyAqIFJvdGF0ZSB0aGUgaGFzaCB2YWx1ZSBieSA3IGJpdHMsIHRoZW4gWE9SIGVhY2ggY2hhcmFjdGVyIGluLgorICogVGhpcyBpcyBpbXBsZW1lbnRlZCB3aXRoIHNvbWUgc291cmNlLWxldmVsIGxvb3AgdW5yb2xsaW5nLgorICovCit4ZnNfZGFoYXNoX3QKK3hmc19kYV9oYXNobmFtZSh1Y2hhcl90ICpuYW1lLCBpbnQgbmFtZWxlbikKK3sKKwl4ZnNfZGFoYXNoX3QgaGFzaDsKKworI2lmZGVmIFNMT1dWRVJTSU9OCisJLyoKKwkgKiBUaGlzIGlzIHRoZSBvbGQgb25lLWJ5dGUtYXQtYS10aW1lIHZlcnNpb24uCisJICovCisJZm9yIChoYXNoID0gMDsgbmFtZWxlbiA+IDA7IG5hbWVsZW4tLSkKKwkJaGFzaCA9ICpuYW1lKysgXiByb2wzMihoYXNoLCA3KTsKKworCXJldHVybihoYXNoKTsKKyNlbHNlCisJLyoKKwkgKiBEbyBmb3VyIGNoYXJhY3RlcnMgYXQgYSB0aW1lIGFzIGxvbmcgYXMgd2UgY2FuLgorCSAqLworCWZvciAoaGFzaCA9IDA7IG5hbWVsZW4gPj0gNDsgbmFtZWxlbiAtPSA0LCBuYW1lICs9IDQpCisJCWhhc2ggPSAobmFtZVswXSA8PCAyMSkgXiAobmFtZVsxXSA8PCAxNCkgXiAobmFtZVsyXSA8PCA3KSBeCisJCSAgICAgICAobmFtZVszXSA8PCAwKSBeIHJvbDMyKGhhc2gsIDcgKiA0KTsKKworCS8qCisJICogTm93IGRvIHRoZSByZXN0IG9mIHRoZSBjaGFyYWN0ZXJzLgorCSAqLworCXN3aXRjaCAobmFtZWxlbikgeworCWNhc2UgMzoKKwkJcmV0dXJuIChuYW1lWzBdIDw8IDE0KSBeIChuYW1lWzFdIDw8IDcpIF4gKG5hbWVbMl0gPDwgMCkgXgorCQkgICAgICAgcm9sMzIoaGFzaCwgNyAqIDMpOworCWNhc2UgMjoKKwkJcmV0dXJuIChuYW1lWzBdIDw8IDcpIF4gKG5hbWVbMV0gPDwgMCkgXiByb2wzMihoYXNoLCA3ICogMik7CisJY2FzZSAxOgorCQlyZXR1cm4gKG5hbWVbMF0gPDwgMCkgXiByb2wzMihoYXNoLCA3ICogMSk7CisJY2FzZSAwOgorCQlyZXR1cm4gaGFzaDsKKwl9CisJLyogTk9UUkVBQ0hFRCAqLworI2VuZGlmCisJcmV0dXJuIDA7IC8qIGtlZXAgZ2NjIGhhcHB5ICovCit9CisKKy8qCisgKiBBZGQgYSBibG9jayB0byB0aGUgYnRyZWUgYWhlYWQgb2YgdGhlIGZpbGUuCisgKiBSZXR1cm4gdGhlIG5ldyBibG9jayBudW1iZXIgdG8gdGhlIGNhbGxlci4KKyAqLworaW50Cit4ZnNfZGFfZ3Jvd19pbm9kZSh4ZnNfZGFfYXJnc190ICphcmdzLCB4ZnNfZGFibGtfdCAqbmV3X2Jsa25vKQoreworCXhmc19maWxlb2ZmX3QgYm5vLCBiOworCXhmc19ibWJ0X2lyZWNfdCBtYXA7CisJeGZzX2JtYnRfaXJlY190CSptYXBwOworCXhmc19pbm9kZV90ICpkcDsKKwlpbnQgbm1hcCwgZXJyb3IsIHcsIGNvdW50LCBjLCBnb3QsIGksIG1hcGk7CisJeGZzX2ZzaXplX3Qgc2l6ZTsKKwl4ZnNfdHJhbnNfdCAqdHA7CisJeGZzX21vdW50X3QgKm1wOworCisJZHAgPSBhcmdzLT5kcDsKKwltcCA9IGRwLT5pX21vdW50OworCXcgPSBhcmdzLT53aGljaGZvcms7CisJdHAgPSBhcmdzLT50cmFuczsKKwkvKgorCSAqIEZvciBuZXcgZGlyZWN0b3JpZXMgYWRqdXN0IHRoZSBmaWxlIG9mZnNldCBhbmQgYmxvY2sgY291bnQuCisJICovCisJaWYgKHcgPT0gWEZTX0RBVEFfRk9SSyAmJiBYRlNfRElSX0lTX1YyKG1wKSkgeworCQlibm8gPSBtcC0+bV9kaXJsZWFmYmxrOworCQljb3VudCA9IG1wLT5tX2RpcmJsa2ZzYnM7CisJfSBlbHNlIHsKKwkJYm5vID0gMDsKKwkJY291bnQgPSAxOworCX0KKwkvKgorCSAqIEZpbmQgYSBzcG90IGluIHRoZSBmaWxlIHNwYWNlIHRvIHB1dCB0aGUgbmV3IGJsb2NrLgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfYm1hcF9maXJzdF91bnVzZWQodHAsIGRwLCBjb3VudCwgJmJubywgdykpKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJaWYgKHcgPT0gWEZTX0RBVEFfRk9SSyAmJiBYRlNfRElSX0lTX1YyKG1wKSkKKwkJQVNTRVJUKGJubyA+PSBtcC0+bV9kaXJsZWFmYmxrICYmIGJubyA8IG1wLT5tX2RpcmZyZWVibGspOworCS8qCisJICogVHJ5IG1hcHBpbmcgaXQgaW4gb25lIGZpbGVzeXN0ZW0gYmxvY2suCisJICovCisJbm1hcCA9IDE7CisJQVNTRVJUKGFyZ3MtPmZpcnN0YmxvY2sgIT0gTlVMTCk7CisJaWYgKChlcnJvciA9IHhmc19ibWFwaSh0cCwgZHAsIGJubywgY291bnQsCisJCQlYRlNfQk1BUElfQUZMQUcodyl8WEZTX0JNQVBJX1dSSVRFfFhGU19CTUFQSV9NRVRBREFUQXwKKwkJCVhGU19CTUFQSV9DT05USUcsCisJCQlhcmdzLT5maXJzdGJsb2NrLCBhcmdzLT50b3RhbCwgJm1hcCwgJm5tYXAsCisJCQlhcmdzLT5mbGlzdCkpKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJQVNTRVJUKG5tYXAgPD0gMSk7CisJaWYgKG5tYXAgPT0gMSkgeworCQltYXBwID0gJm1hcDsKKwkJbWFwaSA9IDE7CisJfQorCS8qCisJICogSWYgd2UgZGlkbid0IGdldCBpdCBhbmQgdGhlIGJsb2NrIG1pZ2h0IHdvcmsgaWYgZnJhZ21lbnRlZCwKKwkgKiB0cnkgd2l0aG91dCB0aGUgQ09OVElHIGZsYWcuICBMb29wIHVudGlsIHdlIGdldCBpdCBhbGwuCisJICovCisJZWxzZSBpZiAobm1hcCA9PSAwICYmIGNvdW50ID4gMSkgeworCQltYXBwID0ga21lbV9hbGxvYyhzaXplb2YoKm1hcHApICogY291bnQsIEtNX1NMRUVQKTsKKwkJZm9yIChiID0gYm5vLCBtYXBpID0gMDsgYiA8IGJubyArIGNvdW50OyApIHsKKwkJCW5tYXAgPSBNSU4oWEZTX0JNQVBfTUFYX05NQVAsIGNvdW50KTsKKwkJCWMgPSAoaW50KShibm8gKyBjb3VudCAtIGIpOworCQkJaWYgKChlcnJvciA9IHhmc19ibWFwaSh0cCwgZHAsIGIsIGMsCisJCQkJCVhGU19CTUFQSV9BRkxBRyh3KXxYRlNfQk1BUElfV1JJVEV8CisJCQkJCVhGU19CTUFQSV9NRVRBREFUQSwKKwkJCQkJYXJncy0+Zmlyc3RibG9jaywgYXJncy0+dG90YWwsCisJCQkJCSZtYXBwW21hcGldLCAmbm1hcCwgYXJncy0+Zmxpc3QpKSkgeworCQkJCWttZW1fZnJlZShtYXBwLCBzaXplb2YoKm1hcHApICogY291bnQpOworCQkJCXJldHVybiBlcnJvcjsKKwkJCX0KKwkJCWlmIChubWFwIDwgMSkKKwkJCQlicmVhazsKKwkJCW1hcGkgKz0gbm1hcDsKKwkJCWIgPSBtYXBwW21hcGkgLSAxXS5icl9zdGFydG9mZiArCisJCQkgICAgbWFwcFttYXBpIC0gMV0uYnJfYmxvY2tjb3VudDsKKwkJfQorCX0gZWxzZSB7CisJCW1hcGkgPSAwOworCQltYXBwID0gTlVMTDsKKwl9CisJLyoKKwkgKiBDb3VudCB0aGUgYmxvY2tzIHdlIGdvdCwgbWFrZSBzdXJlIGl0IG1hdGNoZXMgdGhlIHRvdGFsLgorCSAqLworCWZvciAoaSA9IDAsIGdvdCA9IDA7IGkgPCBtYXBpOyBpKyspCisJCWdvdCArPSBtYXBwW2ldLmJyX2Jsb2NrY291bnQ7CisJaWYgKGdvdCAhPSBjb3VudCB8fCBtYXBwWzBdLmJyX3N0YXJ0b2ZmICE9IGJubyB8fAorCSAgICBtYXBwW21hcGkgLSAxXS5icl9zdGFydG9mZiArIG1hcHBbbWFwaSAtIDFdLmJyX2Jsb2NrY291bnQgIT0KKwkgICAgYm5vICsgY291bnQpIHsKKwkJaWYgKG1hcHAgIT0gJm1hcCkKKwkJCWttZW1fZnJlZShtYXBwLCBzaXplb2YoKm1hcHApICogY291bnQpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVOT1NQQyk7CisJfQorCWlmIChtYXBwICE9ICZtYXApCisJCWttZW1fZnJlZShtYXBwLCBzaXplb2YoKm1hcHApICogY291bnQpOworCSpuZXdfYmxrbm8gPSAoeGZzX2RhYmxrX3QpYm5vOworCS8qCisJICogRm9yIHZlcnNpb24gMSBkaXJlY3RvcmllcywgYWRqdXN0IHRoZSBmaWxlIHNpemUgaWYgaXQgY2hhbmdlZC4KKwkgKi8KKwlpZiAodyA9PSBYRlNfREFUQV9GT1JLICYmIFhGU19ESVJfSVNfVjEobXApKSB7CisJCUFTU0VSVChtYXBpID09IDEpOworCQlpZiAoKGVycm9yID0geGZzX2JtYXBfbGFzdF9vZmZzZXQodHAsIGRwLCAmYm5vLCB3KSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCXNpemUgPSBYRlNfRlNCX1RPX0IobXAsIGJubyk7CisJCWlmIChzaXplICE9IGRwLT5pX2QuZGlfc2l6ZSkgeworCQkJZHAtPmlfZC5kaV9zaXplID0gc2l6ZTsKKwkJCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGRwLCBYRlNfSUxPR19DT1JFKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEljay4gIFdlIG5lZWQgdG8gYWx3YXlzIGJlIGFibGUgdG8gcmVtb3ZlIGEgYnRyZWUgYmxvY2ssIGV2ZW4KKyAqIGlmIHRoZXJlJ3Mgbm8gc3BhY2UgcmVzZXJ2YXRpb24gYmVjYXVzZSB0aGUgZmlsZXN5c3RlbSBpcyBmdWxsLgorICogVGhpcyBpcyBjYWxsZWQgaWYgeGZzX2J1bm1hcGkgb24gYSBidHJlZSBibG9jayBmYWlscyBkdWUgdG8gRU5PU1BDLgorICogSXQgc3dhcHMgdGhlIHRhcmdldCBibG9jayB3aXRoIHRoZSBsYXN0IGJsb2NrIGluIHRoZSBmaWxlLiAgVGhlCisgKiBsYXN0IGJsb2NrIGluIHRoZSBmaWxlIGNhbiBhbHdheXMgYmUgcmVtb3ZlZCBzaW5jZSBpdCBjYW4ndCBjYXVzZQorICogYSBibWFwIGJ0cmVlIHNwbGl0IHRvIGRvIHRoYXQuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19kYV9zd2FwX2xhc3RibG9jayh4ZnNfZGFfYXJnc190ICphcmdzLCB4ZnNfZGFibGtfdCAqZGVhZF9ibGtub3AsCisJCSAgICAgIHhmc19kYWJ1Zl90ICoqZGVhZF9idWZwKQoreworCXhmc19kYWJsa190IGRlYWRfYmxrbm8sIGxhc3RfYmxrbm8sIHNpYl9ibGtubywgcGFyX2Jsa25vOworCXhmc19kYWJ1Zl90ICpkZWFkX2J1ZiwgKmxhc3RfYnVmLCAqc2liX2J1ZiwgKnBhcl9idWY7CisJeGZzX2ZpbGVvZmZfdCBsYXN0b2ZmOworCXhmc19pbm9kZV90ICppcDsKKwl4ZnNfdHJhbnNfdCAqdHA7CisJeGZzX21vdW50X3QgKm1wOworCWludCBlcnJvciwgdywgZW50bm8sIGxldmVsLCBkZWFkX2xldmVsOworCXhmc19kYV9ibGtpbmZvX3QgKmRlYWRfaW5mbywgKnNpYl9pbmZvOworCXhmc19kYV9pbnRub2RlX3QgKnBhcl9ub2RlLCAqZGVhZF9ub2RlOworCXhmc19kaXJfbGVhZmJsb2NrX3QgKmRlYWRfbGVhZjsKKwl4ZnNfZGlyMl9sZWFmX3QgKmRlYWRfbGVhZjI7CisJeGZzX2RhaGFzaF90IGRlYWRfaGFzaDsKKworCWRlYWRfYnVmID0gKmRlYWRfYnVmcDsKKwlkZWFkX2Jsa25vID0gKmRlYWRfYmxrbm9wOworCXRwID0gYXJncy0+dHJhbnM7CisJaXAgPSBhcmdzLT5kcDsKKwl3ID0gYXJncy0+d2hpY2hmb3JrOworCUFTU0VSVCh3ID09IFhGU19EQVRBX0ZPUkspOworCW1wID0gaXAtPmlfbW91bnQ7CisJaWYgKFhGU19ESVJfSVNfVjIobXApKSB7CisJCWxhc3RvZmYgPSBtcC0+bV9kaXJmcmVlYmxrOworCQllcnJvciA9IHhmc19ibWFwX2xhc3RfYmVmb3JlKHRwLCBpcCwgJmxhc3RvZmYsIHcpOworCX0gZWxzZQorCQllcnJvciA9IHhmc19ibWFwX2xhc3Rfb2Zmc2V0KHRwLCBpcCwgJmxhc3RvZmYsIHcpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCWlmICh1bmxpa2VseShsYXN0b2ZmID09IDApKSB7CisJCVhGU19FUlJPUl9SRVBPUlQoInhmc19kYV9zd2FwX2xhc3RibG9jaygxKSIsIFhGU19FUlJMRVZFTF9MT1csCisJCQkJIG1wKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCX0KKwkvKgorCSAqIFJlYWQgdGhlIGxhc3QgYmxvY2sgaW4gdGhlIGJ0cmVlIHNwYWNlLgorCSAqLworCWxhc3RfYmxrbm8gPSAoeGZzX2RhYmxrX3QpbGFzdG9mZiAtIG1wLT5tX2RpcmJsa2ZzYnM7CisJaWYgKChlcnJvciA9IHhmc19kYV9yZWFkX2J1Zih0cCwgaXAsIGxhc3RfYmxrbm8sIC0xLCAmbGFzdF9idWYsIHcpKSkKKwkJcmV0dXJuIGVycm9yOworCS8qCisJICogQ29weSB0aGUgbGFzdCBibG9jayBpbnRvIHRoZSBkZWFkIGJ1ZmZlciBhbmQgbG9nIGl0LgorCSAqLworCW1lbWNweShkZWFkX2J1Zi0+ZGF0YSwgbGFzdF9idWYtPmRhdGEsIG1wLT5tX2RpcmJsa3NpemUpOworCXhmc19kYV9sb2dfYnVmKHRwLCBkZWFkX2J1ZiwgMCwgbXAtPm1fZGlyYmxrc2l6ZSAtIDEpOworCWRlYWRfaW5mbyA9IGRlYWRfYnVmLT5kYXRhOworCS8qCisJICogR2V0IHZhbHVlcyBmcm9tIHRoZSBtb3ZlZCBibG9jay4KKwkgKi8KKwlpZiAoSU5UX0dFVChkZWFkX2luZm8tPm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVJfTEVBRl9NQUdJQykgeworCQlBU1NFUlQoWEZTX0RJUl9JU19WMShtcCkpOworCQlkZWFkX2xlYWYgPSAoeGZzX2Rpcl9sZWFmYmxvY2tfdCAqKWRlYWRfaW5mbzsKKwkJZGVhZF9sZXZlbCA9IDA7CisJCWRlYWRfaGFzaCA9CisJCQlJTlRfR0VUKGRlYWRfbGVhZi0+ZW50cmllc1tJTlRfR0VUKGRlYWRfbGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpIC0gMV0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKTsKKwl9IGVsc2UgaWYgKElOVF9HRVQoZGVhZF9pbmZvLT5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9MRUFGTl9NQUdJQykgeworCQlBU1NFUlQoWEZTX0RJUl9JU19WMihtcCkpOworCQlkZWFkX2xlYWYyID0gKHhmc19kaXIyX2xlYWZfdCAqKWRlYWRfaW5mbzsKKwkJZGVhZF9sZXZlbCA9IDA7CisJCWRlYWRfaGFzaCA9IElOVF9HRVQoZGVhZF9sZWFmMi0+ZW50c1tJTlRfR0VUKGRlYWRfbGVhZjItPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAtIDFdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCk7CisJfSBlbHNlIHsKKwkJQVNTRVJUKElOVF9HRVQoZGVhZF9pbmZvLT5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfREFfTk9ERV9NQUdJQyk7CisJCWRlYWRfbm9kZSA9ICh4ZnNfZGFfaW50bm9kZV90ICopZGVhZF9pbmZvOworCQlkZWFkX2xldmVsID0gSU5UX0dFVChkZWFkX25vZGUtPmhkci5sZXZlbCwgQVJDSF9DT05WRVJUKTsKKwkJZGVhZF9oYXNoID0gSU5UX0dFVChkZWFkX25vZGUtPmJ0cmVlW0lOVF9HRVQoZGVhZF9ub2RlLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgLSAxXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpOworCX0KKwlzaWJfYnVmID0gcGFyX2J1ZiA9IE5VTEw7CisJLyoKKwkgKiBJZiB0aGUgbW92ZWQgYmxvY2sgaGFzIGEgbGVmdCBzaWJsaW5nLCBmaXggdXAgdGhlIHBvaW50ZXJzLgorCSAqLworCWlmICgoc2liX2Jsa25vID0gSU5UX0dFVChkZWFkX2luZm8tPmJhY2ssIEFSQ0hfQ09OVkVSVCkpKSB7CisJCWlmICgoZXJyb3IgPSB4ZnNfZGFfcmVhZF9idWYodHAsIGlwLCBzaWJfYmxrbm8sIC0xLCAmc2liX2J1ZiwgdykpKQorCQkJZ290byBkb25lOworCQlzaWJfaW5mbyA9IHNpYl9idWYtPmRhdGE7CisJCWlmICh1bmxpa2VseSgKKwkJICAgIElOVF9HRVQoc2liX2luZm8tPmZvcncsIEFSQ0hfQ09OVkVSVCkgIT0gbGFzdF9ibGtubyB8fAorCQkgICAgSU5UX0dFVChzaWJfaW5mby0+bWFnaWMsIEFSQ0hfQ09OVkVSVCkgIT0gSU5UX0dFVChkZWFkX2luZm8tPm1hZ2ljLCBBUkNIX0NPTlZFUlQpKSkgeworCQkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX2RhX3N3YXBfbGFzdGJsb2NrKDIpIiwKKwkJCQkJIFhGU19FUlJMRVZFTF9MT1csIG1wKTsKKwkJCWVycm9yID0gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJCQlnb3RvIGRvbmU7CisJCX0KKwkJSU5UX1NFVChzaWJfaW5mby0+Zm9ydywgQVJDSF9DT05WRVJULCBkZWFkX2Jsa25vKTsKKwkJeGZzX2RhX2xvZ19idWYodHAsIHNpYl9idWYsCisJCQlYRlNfREFfTE9HUkFOR0Uoc2liX2luZm8sICZzaWJfaW5mby0+Zm9ydywKKwkJCQkJc2l6ZW9mKHNpYl9pbmZvLT5mb3J3KSkpOworCQl4ZnNfZGFfYnVmX2RvbmUoc2liX2J1Zik7CisJCXNpYl9idWYgPSBOVUxMOworCX0KKwkvKgorCSAqIElmIHRoZSBtb3ZlZCBibG9jayBoYXMgYSByaWdodCBzaWJsaW5nLCBmaXggdXAgdGhlIHBvaW50ZXJzLgorCSAqLworCWlmICgoc2liX2Jsa25vID0gSU5UX0dFVChkZWFkX2luZm8tPmZvcncsIEFSQ0hfQ09OVkVSVCkpKSB7CisJCWlmICgoZXJyb3IgPSB4ZnNfZGFfcmVhZF9idWYodHAsIGlwLCBzaWJfYmxrbm8sIC0xLCAmc2liX2J1ZiwgdykpKQorCQkJZ290byBkb25lOworCQlzaWJfaW5mbyA9IHNpYl9idWYtPmRhdGE7CisJCWlmICh1bmxpa2VseSgKKwkJICAgICAgIElOVF9HRVQoc2liX2luZm8tPmJhY2ssIEFSQ0hfQ09OVkVSVCkgIT0gbGFzdF9ibGtubworCQkgICAgfHwgSU5UX0dFVChzaWJfaW5mby0+bWFnaWMsIEFSQ0hfQ09OVkVSVCkKKwkJCQkhPSBJTlRfR0VUKGRlYWRfaW5mby0+bWFnaWMsIEFSQ0hfQ09OVkVSVCkpKSB7CisJCQlYRlNfRVJST1JfUkVQT1JUKCJ4ZnNfZGFfc3dhcF9sYXN0YmxvY2soMykiLAorCQkJCQkgWEZTX0VSUkxFVkVMX0xPVywgbXApOworCQkJZXJyb3IgPSBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQlJTlRfU0VUKHNpYl9pbmZvLT5iYWNrLCBBUkNIX0NPTlZFUlQsIGRlYWRfYmxrbm8pOworCQl4ZnNfZGFfbG9nX2J1Zih0cCwgc2liX2J1ZiwKKwkJCVhGU19EQV9MT0dSQU5HRShzaWJfaW5mbywgJnNpYl9pbmZvLT5iYWNrLAorCQkJCQlzaXplb2Yoc2liX2luZm8tPmJhY2spKSk7CisJCXhmc19kYV9idWZfZG9uZShzaWJfYnVmKTsKKwkJc2liX2J1ZiA9IE5VTEw7CisJfQorCXBhcl9ibGtubyA9IFhGU19ESVJfSVNfVjEobXApID8gMCA6IG1wLT5tX2RpcmxlYWZibGs7CisJbGV2ZWwgPSAtMTsKKwkvKgorCSAqIFdhbGsgZG93biB0aGUgdHJlZSBsb29raW5nIGZvciB0aGUgcGFyZW50IG9mIHRoZSBtb3ZlZCBibG9jay4KKwkgKi8KKwlmb3IgKDs7KSB7CisJCWlmICgoZXJyb3IgPSB4ZnNfZGFfcmVhZF9idWYodHAsIGlwLCBwYXJfYmxrbm8sIC0xLCAmcGFyX2J1ZiwgdykpKQorCQkJZ290byBkb25lOworCQlwYXJfbm9kZSA9IHBhcl9idWYtPmRhdGE7CisJCWlmICh1bmxpa2VseSgKKwkJICAgIElOVF9HRVQocGFyX25vZGUtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpICE9IFhGU19EQV9OT0RFX01BR0lDIHx8CisJCSAgICAobGV2ZWwgPj0gMCAmJiBsZXZlbCAhPSBJTlRfR0VUKHBhcl9ub2RlLT5oZHIubGV2ZWwsIEFSQ0hfQ09OVkVSVCkgKyAxKSkpIHsKKwkJCVhGU19FUlJPUl9SRVBPUlQoInhmc19kYV9zd2FwX2xhc3RibG9jayg0KSIsCisJCQkJCSBYRlNfRVJSTEVWRUxfTE9XLCBtcCk7CisJCQllcnJvciA9IFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCQkJZ290byBkb25lOworCQl9CisJCWxldmVsID0gSU5UX0dFVChwYXJfbm9kZS0+aGRyLmxldmVsLCBBUkNIX0NPTlZFUlQpOworCQlmb3IgKGVudG5vID0gMDsKKwkJICAgICBlbnRubyA8IElOVF9HRVQocGFyX25vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAmJgorCQkgICAgIElOVF9HRVQocGFyX25vZGUtPmJ0cmVlW2VudG5vXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpIDwgZGVhZF9oYXNoOworCQkgICAgIGVudG5vKyspCisJCQljb250aW51ZTsKKwkJaWYgKHVubGlrZWx5KGVudG5vID09IElOVF9HRVQocGFyX25vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSkpIHsKKwkJCVhGU19FUlJPUl9SRVBPUlQoInhmc19kYV9zd2FwX2xhc3RibG9jayg1KSIsCisJCQkJCSBYRlNfRVJSTEVWRUxfTE9XLCBtcCk7CisJCQllcnJvciA9IFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCQkJZ290byBkb25lOworCQl9CisJCXBhcl9ibGtubyA9IElOVF9HRVQocGFyX25vZGUtPmJ0cmVlW2VudG5vXS5iZWZvcmUsIEFSQ0hfQ09OVkVSVCk7CisJCWlmIChsZXZlbCA9PSBkZWFkX2xldmVsICsgMSkKKwkJCWJyZWFrOworCQl4ZnNfZGFfYnJlbHNlKHRwLCBwYXJfYnVmKTsKKwkJcGFyX2J1ZiA9IE5VTEw7CisJfQorCS8qCisJICogV2UncmUgaW4gdGhlIHJpZ2h0IHBhcmVudCBibG9jay4KKwkgKiBMb29rIGZvciB0aGUgcmlnaHQgZW50cnkuCisJICovCisJZm9yICg7OykgeworCQlmb3IgKDsKKwkJICAgICBlbnRubyA8IElOVF9HRVQocGFyX25vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAmJgorCQkgICAgIElOVF9HRVQocGFyX25vZGUtPmJ0cmVlW2VudG5vXS5iZWZvcmUsIEFSQ0hfQ09OVkVSVCkgIT0gbGFzdF9ibGtubzsKKwkJICAgICBlbnRubysrKQorCQkJY29udGludWU7CisJCWlmIChlbnRubyA8IElOVF9HRVQocGFyX25vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSkKKwkJCWJyZWFrOworCQlwYXJfYmxrbm8gPSBJTlRfR0VUKHBhcl9ub2RlLT5oZHIuaW5mby5mb3J3LCBBUkNIX0NPTlZFUlQpOworCQl4ZnNfZGFfYnJlbHNlKHRwLCBwYXJfYnVmKTsKKwkJcGFyX2J1ZiA9IE5VTEw7CisJCWlmICh1bmxpa2VseShwYXJfYmxrbm8gPT0gMCkpIHsKKwkJCVhGU19FUlJPUl9SRVBPUlQoInhmc19kYV9zd2FwX2xhc3RibG9jayg2KSIsCisJCQkJCSBYRlNfRVJSTEVWRUxfTE9XLCBtcCk7CisJCQllcnJvciA9IFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCQkJZ290byBkb25lOworCQl9CisJCWlmICgoZXJyb3IgPSB4ZnNfZGFfcmVhZF9idWYodHAsIGlwLCBwYXJfYmxrbm8sIC0xLCAmcGFyX2J1ZiwgdykpKQorCQkJZ290byBkb25lOworCQlwYXJfbm9kZSA9IHBhcl9idWYtPmRhdGE7CisJCWlmICh1bmxpa2VseSgKKwkJICAgIElOVF9HRVQocGFyX25vZGUtPmhkci5sZXZlbCwgQVJDSF9DT05WRVJUKSAhPSBsZXZlbCB8fAorCQkgICAgSU5UX0dFVChwYXJfbm9kZS0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgIT0gWEZTX0RBX05PREVfTUFHSUMpKSB7CisJCQlYRlNfRVJST1JfUkVQT1JUKCJ4ZnNfZGFfc3dhcF9sYXN0YmxvY2soNykiLAorCQkJCQkgWEZTX0VSUkxFVkVMX0xPVywgbXApOworCQkJZXJyb3IgPSBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQllbnRubyA9IDA7CisJfQorCS8qCisJICogVXBkYXRlIHRoZSBwYXJlbnQgZW50cnkgcG9pbnRpbmcgdG8gdGhlIG1vdmVkIGJsb2NrLgorCSAqLworCUlOVF9TRVQocGFyX25vZGUtPmJ0cmVlW2VudG5vXS5iZWZvcmUsIEFSQ0hfQ09OVkVSVCwgZGVhZF9ibGtubyk7CisJeGZzX2RhX2xvZ19idWYodHAsIHBhcl9idWYsCisJCVhGU19EQV9MT0dSQU5HRShwYXJfbm9kZSwgJnBhcl9ub2RlLT5idHJlZVtlbnRub10uYmVmb3JlLAorCQkJCXNpemVvZihwYXJfbm9kZS0+YnRyZWVbZW50bm9dLmJlZm9yZSkpKTsKKwl4ZnNfZGFfYnVmX2RvbmUocGFyX2J1Zik7CisJeGZzX2RhX2J1Zl9kb25lKGRlYWRfYnVmKTsKKwkqZGVhZF9ibGtub3AgPSBsYXN0X2Jsa25vOworCSpkZWFkX2J1ZnAgPSBsYXN0X2J1ZjsKKwlyZXR1cm4gMDsKK2RvbmU6CisJaWYgKHBhcl9idWYpCisJCXhmc19kYV9icmVsc2UodHAsIHBhcl9idWYpOworCWlmIChzaWJfYnVmKQorCQl4ZnNfZGFfYnJlbHNlKHRwLCBzaWJfYnVmKTsKKwl4ZnNfZGFfYnJlbHNlKHRwLCBsYXN0X2J1Zik7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogUmVtb3ZlIGEgYnRyZWUgYmxvY2sgZnJvbSBhIGRpcmVjdG9yeSBvciBhdHRyaWJ1dGUuCisgKi8KK2ludAoreGZzX2RhX3Nocmlua19pbm9kZSh4ZnNfZGFfYXJnc190ICphcmdzLCB4ZnNfZGFibGtfdCBkZWFkX2Jsa25vLAorCQkgICAgeGZzX2RhYnVmX3QgKmRlYWRfYnVmKQoreworCXhmc19pbm9kZV90ICpkcDsKKwlpbnQgZG9uZSwgZXJyb3IsIHcsIGNvdW50OworCXhmc19maWxlb2ZmX3QgYm5vOworCXhmc19mc2l6ZV90IHNpemU7CisJeGZzX3RyYW5zX3QgKnRwOworCXhmc19tb3VudF90ICptcDsKKworCWRwID0gYXJncy0+ZHA7CisJdyA9IGFyZ3MtPndoaWNoZm9yazsKKwl0cCA9IGFyZ3MtPnRyYW5zOworCW1wID0gZHAtPmlfbW91bnQ7CisJaWYgKHcgPT0gWEZTX0RBVEFfRk9SSyAmJiBYRlNfRElSX0lTX1YyKG1wKSkKKwkJY291bnQgPSBtcC0+bV9kaXJibGtmc2JzOworCWVsc2UKKwkJY291bnQgPSAxOworCWZvciAoOzspIHsKKwkJLyoKKwkJICogUmVtb3ZlIGV4dGVudHMuICBJZiB3ZSBnZXQgRU5PU1BDIGZvciBhIGRpciB3ZSBoYXZlIHRvIG1vdmUKKwkJICogdGhlIGxhc3QgYmxvY2sgdG8gdGhlIHBsYWNlIHdlIHdhbnQgdG8ga2lsbC4KKwkJICovCisJCWlmICgoZXJyb3IgPSB4ZnNfYnVubWFwaSh0cCwgZHAsIGRlYWRfYmxrbm8sIGNvdW50LAorCQkJCVhGU19CTUFQSV9BRkxBRyh3KXxYRlNfQk1BUElfTUVUQURBVEEsCisJCQkJMCwgYXJncy0+Zmlyc3RibG9jaywgYXJncy0+Zmxpc3QsCisJCQkJJmRvbmUpKSA9PSBFTk9TUEMpIHsKKwkJCWlmICh3ICE9IFhGU19EQVRBX0ZPUkspCisJCQkJZ290byBkb25lOworCQkJaWYgKChlcnJvciA9IHhmc19kYV9zd2FwX2xhc3RibG9jayhhcmdzLCAmZGVhZF9ibGtubywKKwkJCQkJJmRlYWRfYnVmKSkpCisJCQkJZ290byBkb25lOworCQl9IGVsc2UgaWYgKGVycm9yKQorCQkJZ290byBkb25lOworCQllbHNlCisJCQlicmVhazsKKwl9CisJQVNTRVJUKGRvbmUpOworCXhmc19kYV9iaW52YWwodHAsIGRlYWRfYnVmKTsKKwkvKgorCSAqIEFkanVzdCB0aGUgZGlyZWN0b3J5IHNpemUgZm9yIHZlcnNpb24gMS4KKwkgKi8KKwlpZiAodyA9PSBYRlNfREFUQV9GT1JLICYmIFhGU19ESVJfSVNfVjEobXApKSB7CisJCWlmICgoZXJyb3IgPSB4ZnNfYm1hcF9sYXN0X29mZnNldCh0cCwgZHAsICZibm8sIHcpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJc2l6ZSA9IFhGU19GU0JfVE9fQihkcC0+aV9tb3VudCwgYm5vKTsKKwkJaWYgKHNpemUgIT0gZHAtPmlfZC5kaV9zaXplKSB7CisJCQlkcC0+aV9kLmRpX3NpemUgPSBzaXplOworCQkJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgZHAsIFhGU19JTE9HX0NPUkUpOworCQl9CisJfQorCXJldHVybiAwOworZG9uZToKKwl4ZnNfZGFfYmludmFsKHRwLCBkZWFkX2J1Zik7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogU2VlIGlmIHRoZSBtYXBwaW5nKHMpIGZvciB0aGlzIGJ0cmVlIGJsb2NrIGFyZSB2YWxpZCwgaS5lLgorICogZG9uJ3QgY29udGFpbiBob2xlcywgYXJlIGxvZ2ljYWxseSBjb250aWd1b3VzLCBhbmQgY292ZXIgdGhlIHdob2xlIHJhbmdlLgorICovCitTVEFUSUMgaW50Cit4ZnNfZGFfbWFwX2NvdmVyc19ibG9ja3MoCisJaW50CQlubWFwLAorCXhmc19ibWJ0X2lyZWNfdAkqbWFwcCwKKwl4ZnNfZGFibGtfdAlibm8sCisJaW50CQljb3VudCkKK3sKKwlpbnQJCWk7CisJeGZzX2ZpbGVvZmZfdAlvZmY7CisKKwlmb3IgKGkgPSAwLCBvZmYgPSBibm87IGkgPCBubWFwOyBpKyspIHsKKwkJaWYgKG1hcHBbaV0uYnJfc3RhcnRibG9jayA9PSBIT0xFU1RBUlRCTE9DSyB8fAorCQkgICAgbWFwcFtpXS5icl9zdGFydGJsb2NrID09IERFTEFZU1RBUlRCTE9DSykgeworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKG9mZiAhPSBtYXBwW2ldLmJyX3N0YXJ0b2ZmKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlvZmYgKz0gbWFwcFtpXS5icl9ibG9ja2NvdW50OworCX0KKwlyZXR1cm4gb2ZmID09IGJubyArIGNvdW50OworfQorCisvKgorICogTWFrZSBhIGRhYnVmLgorICogVXNlZCBmb3IgZ2V0X2J1ZiwgcmVhZF9idWYsIHJlYWRfYnVmciwgYW5kIHJlYWRhX2J1Zi4KKyAqLworU1RBVElDIGludAoreGZzX2RhX2RvX2J1ZigKKwl4ZnNfdHJhbnNfdAkqdHJhbnMsCisJeGZzX2lub2RlX3QJKmRwLAorCXhmc19kYWJsa190CWJubywKKwl4ZnNfZGFkZHJfdAkqbWFwcGVkYm5vcCwKKwl4ZnNfZGFidWZfdAkqKmJwcCwKKwlpbnQJCXdoaWNoZm9yaywKKwlpbnQJCWNhbGxlciwKKwlpbnN0X3QJCSpyYSkKK3sKKwl4ZnNfYnVmX3QJKmJwID0gTlVMTDsKKwl4ZnNfYnVmX3QJKipicGxpc3Q7CisJaW50CQllcnJvcj0wOworCWludAkJaTsKKwl4ZnNfYm1idF9pcmVjX3QJbWFwOworCXhmc19ibWJ0X2lyZWNfdAkqbWFwcDsKKwl4ZnNfZGFkZHJfdAltYXBwZWRibm87CisJeGZzX21vdW50X3QJKm1wOworCWludAkJbmJwbGlzdD0wOworCWludAkJbmZzYjsKKwlpbnQJCW5tYXA7CisJeGZzX2RhYnVmX3QJKnJicDsKKworCW1wID0gZHAtPmlfbW91bnQ7CisJaWYgKHdoaWNoZm9yayA9PSBYRlNfREFUQV9GT1JLICYmIFhGU19ESVJfSVNfVjIobXApKQorCQluZnNiID0gbXAtPm1fZGlyYmxrZnNiczsKKwllbHNlCisJCW5mc2IgPSAxOworCW1hcHBlZGJubyA9ICptYXBwZWRibm9wOworCS8qCisJICogQ2FsbGVyIGRvZXNuJ3QgaGF2ZSBhIG1hcHBpbmcuICAtMiBtZWFucyBkb24ndCBjb21wbGFpbgorCSAqIGlmIHdlIGxhbmQgaW4gYSBob2xlLgorCSAqLworCWlmIChtYXBwZWRibm8gPT0gLTEgfHwgbWFwcGVkYm5vID09IC0yKSB7CisJCS8qCisJCSAqIE9wdGltaXplIHRoZSBvbmUtYmxvY2sgY2FzZS4KKwkJICovCisJCWlmIChuZnNiID09IDEpIHsKKwkJCXhmc19mc2Jsb2NrX3QJZnNiOworCisJCQlpZiAoKGVycm9yID0KKwkJCSAgICB4ZnNfYm1hcGlfc2luZ2xlKHRyYW5zLCBkcCwgd2hpY2hmb3JrLCAmZnNiLAorCQkJCSAgICAoeGZzX2ZpbGVvZmZfdClibm8pKSkgeworCQkJCXJldHVybiBlcnJvcjsKKwkJCX0KKwkJCW1hcHAgPSAmbWFwOworCQkJaWYgKGZzYiA9PSBOVUxMRlNCTE9DSykgeworCQkJCW5tYXAgPSAwOworCQkJfSBlbHNlIHsKKwkJCQltYXAuYnJfc3RhcnRibG9jayA9IGZzYjsKKwkJCQltYXAuYnJfc3RhcnRvZmYgPSAoeGZzX2ZpbGVvZmZfdClibm87CisJCQkJbWFwLmJyX2Jsb2NrY291bnQgPSAxOworCQkJCW5tYXAgPSAxOworCQkJfQorCQl9IGVsc2UgeworCQkJbWFwcCA9IGttZW1fYWxsb2Moc2l6ZW9mKCptYXBwKSAqIG5mc2IsIEtNX1NMRUVQKTsKKwkJCW5tYXAgPSBuZnNiOworCQkJaWYgKChlcnJvciA9IHhmc19ibWFwaSh0cmFucywgZHAsICh4ZnNfZmlsZW9mZl90KWJubywKKwkJCQkJbmZzYiwKKwkJCQkJWEZTX0JNQVBJX01FVEFEQVRBIHwKKwkJCQkJCVhGU19CTUFQSV9BRkxBRyh3aGljaGZvcmspLAorCQkJCQlOVUxMLCAwLCBtYXBwLCAmbm1hcCwgTlVMTCkpKQorCQkJCWdvdG8gZXhpdDA7CisJCX0KKwl9IGVsc2UgeworCQltYXAuYnJfc3RhcnRibG9jayA9IFhGU19EQUREUl9UT19GU0IobXAsIG1hcHBlZGJubyk7CisJCW1hcC5icl9zdGFydG9mZiA9ICh4ZnNfZmlsZW9mZl90KWJubzsKKwkJbWFwLmJyX2Jsb2NrY291bnQgPSBuZnNiOworCQltYXBwID0gJm1hcDsKKwkJbm1hcCA9IDE7CisJfQorCWlmICgheGZzX2RhX21hcF9jb3ZlcnNfYmxvY2tzKG5tYXAsIG1hcHAsIGJubywgbmZzYikpIHsKKwkJZXJyb3IgPSBtYXBwZWRibm8gPT0gLTIgPyAwIDogWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJCWlmICh1bmxpa2VseShlcnJvciA9PSBFRlNDT1JSVVBURUQpKSB7CisJCQlpZiAoeGZzX2Vycm9yX2xldmVsID49IFhGU19FUlJMRVZFTF9MT1cpIHsKKwkJCQlpbnQJaTsKKwkJCQljbW5fZXJyKENFX0FMRVJULCAieGZzX2RhX2RvX2J1ZjogYm5vICVsbGRcbiIsCisJCQkJCShsb25nIGxvbmcpYm5vKTsKKwkJCQljbW5fZXJyKENFX0FMRVJULCAiZGlyOiBpbm9kZSAlbGxkXG4iLAorCQkJCQkobG9uZyBsb25nKWRwLT5pX2lubyk7CisJCQkJZm9yIChpID0gMDsgaSA8IG5tYXA7IGkrKykgeworCQkJCQljbW5fZXJyKENFX0FMRVJULAorCQkJCQkJIlslMDJkXSBicl9zdGFydG9mZiAlbGxkIGJyX3N0YXJ0YmxvY2sgJWxsZCBicl9ibG9ja2NvdW50ICVsbGQgYnJfc3RhdGUgJWRcbiIsCisJCQkJCQlpLAorCQkJCQkJKGxvbmcgbG9uZyltYXBwW2ldLmJyX3N0YXJ0b2ZmLAorCQkJCQkJKGxvbmcgbG9uZyltYXBwW2ldLmJyX3N0YXJ0YmxvY2ssCisJCQkJCQkobG9uZyBsb25nKW1hcHBbaV0uYnJfYmxvY2tjb3VudCwKKwkJCQkJCW1hcHBbaV0uYnJfc3RhdGUpOworCQkJCX0KKwkJCX0KKwkJCVhGU19FUlJPUl9SRVBPUlQoInhmc19kYV9kb19idWYoMSkiLAorCQkJCQkgWEZTX0VSUkxFVkVMX0xPVywgbXApOworCQl9CisJCWdvdG8gZXhpdDA7CisJfQorCWlmIChjYWxsZXIgIT0gMyAmJiBubWFwID4gMSkgeworCQlicGxpc3QgPSBrbWVtX2FsbG9jKHNpemVvZigqYnBsaXN0KSAqIG5tYXAsIEtNX1NMRUVQKTsKKwkJbmJwbGlzdCA9IDA7CisJfSBlbHNlCisJCWJwbGlzdCA9IE5VTEw7CisJLyoKKwkgKiBUdXJuIHRoZSBtYXBwaW5nKHMpIGludG8gYnVmZmVyKHMpLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBubWFwOyBpKyspIHsKKwkJaW50CW5tYXBwZWQ7CisKKwkJbWFwcGVkYm5vID0gWEZTX0ZTQl9UT19EQUREUihtcCwgbWFwcFtpXS5icl9zdGFydGJsb2NrKTsKKwkJaWYgKGkgPT0gMCkKKwkJCSptYXBwZWRibm9wID0gbWFwcGVkYm5vOworCQlubWFwcGVkID0gKGludClYRlNfRlNCX1RPX0JCKG1wLCBtYXBwW2ldLmJyX2Jsb2NrY291bnQpOworCQlzd2l0Y2ggKGNhbGxlcikgeworCQljYXNlIDA6CisJCQlicCA9IHhmc190cmFuc19nZXRfYnVmKHRyYW5zLCBtcC0+bV9kZGV2X3RhcmdwLAorCQkJCW1hcHBlZGJubywgbm1hcHBlZCwgMCk7CisJCQllcnJvciA9IGJwID8gWEZTX0JVRl9HRVRFUlJPUihicCkgOiBYRlNfRVJST1IoRUlPKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisjaWZuZGVmIF9fS0VSTkVMX18KKwkJY2FzZSAyOgorI2VuZGlmCisJCQlicCA9IE5VTEw7CisJCQllcnJvciA9IHhmc190cmFuc19yZWFkX2J1ZihtcCwgdHJhbnMsIG1wLT5tX2RkZXZfdGFyZ3AsCisJCQkJbWFwcGVkYm5vLCBubWFwcGVkLCAwLCAmYnApOworCQkJYnJlYWs7CisjaWZkZWYgX19LRVJORUxfXworCQljYXNlIDM6CisJCQl4ZnNfYmFyZWFkKG1wLT5tX2RkZXZfdGFyZ3AsIG1hcHBlZGJubywgbm1hcHBlZCk7CisJCQllcnJvciA9IDA7CisJCQlicCA9IE5VTEw7CisJCQlicmVhazsKKyNlbmRpZgorCQl9CisJCWlmIChlcnJvcikgeworCQkJaWYgKGJwKQorCQkJCXhmc190cmFuc19icmVsc2UodHJhbnMsIGJwKTsKKwkJCWdvdG8gZXhpdDE7CisJCX0KKwkJaWYgKCFicCkKKwkJCWNvbnRpbnVlOworCQlpZiAoY2FsbGVyID09IDEpIHsKKwkJCWlmICh3aGljaGZvcmsgPT0gWEZTX0FUVFJfRk9SSykgeworCQkJCVhGU19CVUZfU0VUX1ZUWVBFX1JFRihicCwgQl9GU19BVFRSX0JUUkVFLAorCQkJCQkJWEZTX0FUVFJfQlRSRUVfUkVGKTsKKwkJCX0gZWxzZSB7CisJCQkJWEZTX0JVRl9TRVRfVlRZUEVfUkVGKGJwLCBCX0ZTX0RJUl9CVFJFRSwKKwkJCQkJCVhGU19ESVJfQlRSRUVfUkVGKTsKKwkJCX0KKwkJfQorCQlpZiAoYnBsaXN0KSB7CisJCQlicGxpc3RbbmJwbGlzdCsrXSA9IGJwOworCQl9CisJfQorCS8qCisJICogQnVpbGQgYSBkYWJ1ZiBzdHJ1Y3R1cmUuCisJICovCisJaWYgKGJwbGlzdCkgeworCQlyYnAgPSB4ZnNfZGFfYnVmX21ha2UobmJwbGlzdCwgYnBsaXN0LCByYSk7CisJfSBlbHNlIGlmIChicCkKKwkJcmJwID0geGZzX2RhX2J1Zl9tYWtlKDEsICZicCwgcmEpOworCWVsc2UKKwkJcmJwID0gTlVMTDsKKwkvKgorCSAqIEZvciByZWFkX2J1ZiwgY2hlY2sgdGhlIG1hZ2ljIG51bWJlci4KKwkgKi8KKwlpZiAoY2FsbGVyID09IDEpIHsKKwkJeGZzX2RpcjJfZGF0YV90CQkqZGF0YTsKKwkJeGZzX2RpcjJfZnJlZV90CQkqZnJlZTsKKwkJeGZzX2RhX2Jsa2luZm9fdAkqaW5mbzsKKwkJdWludAkJCW1hZ2ljLCBtYWdpYzE7CisKKwkJaW5mbyA9IHJicC0+ZGF0YTsKKwkJZGF0YSA9IHJicC0+ZGF0YTsKKwkJZnJlZSA9IHJicC0+ZGF0YTsKKwkJbWFnaWMgPSBJTlRfR0VUKGluZm8tPm1hZ2ljLCBBUkNIX0NPTlZFUlQpOworCQltYWdpYzEgPSBJTlRfR0VUKGRhdGEtPmhkci5tYWdpYywgQVJDSF9DT05WRVJUKTsKKwkJaWYgKHVubGlrZWx5KAorCQkgICAgWEZTX1RFU1RfRVJST1IoKG1hZ2ljICE9IFhGU19EQV9OT0RFX01BR0lDKSAmJgorCQkJCSAgIChtYWdpYyAhPSBYRlNfRElSX0xFQUZfTUFHSUMpICYmCisJCQkJICAgKG1hZ2ljICE9IFhGU19BVFRSX0xFQUZfTUFHSUMpICYmCisJCQkJICAgKG1hZ2ljICE9IFhGU19ESVIyX0xFQUYxX01BR0lDKSAmJgorCQkJCSAgIChtYWdpYyAhPSBYRlNfRElSMl9MRUFGTl9NQUdJQykgJiYKKwkJCQkgICAobWFnaWMxICE9IFhGU19ESVIyX0JMT0NLX01BR0lDKSAmJgorCQkJCSAgIChtYWdpYzEgIT0gWEZTX0RJUjJfREFUQV9NQUdJQykgJiYKKwkJCQkgICAoSU5UX0dFVChmcmVlLT5oZHIubWFnaWMsIEFSQ0hfQ09OVkVSVCkgIT0gWEZTX0RJUjJfRlJFRV9NQUdJQyksCisJCQkJbXAsIFhGU19FUlJUQUdfREFfUkVBRF9CVUYsCisJCQkJWEZTX1JBTkRPTV9EQV9SRUFEX0JVRikpKSB7CisJCQl4ZnNfYnVmdHJhY2UoIkRBIFJFQUQgRVJST1IiLCByYnAtPmJwc1swXSk7CisJCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGZzX2RhX2RvX2J1ZigyKSIsCisJCQkJCSAgICAgWEZTX0VSUkxFVkVMX0xPVywgbXAsIGluZm8pOworCQkJZXJyb3IgPSBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwkJCXhmc19kYV9icmVsc2UodHJhbnMsIHJicCk7CisJCQluYnBsaXN0ID0gMDsKKwkJCWdvdG8gZXhpdDE7CisJCX0KKwl9CisJaWYgKGJwbGlzdCkgeworCQlrbWVtX2ZyZWUoYnBsaXN0LCBzaXplb2YoKmJwbGlzdCkgKiBubWFwKTsKKwl9CisJaWYgKG1hcHAgIT0gJm1hcCkgeworCQlrbWVtX2ZyZWUobWFwcCwgc2l6ZW9mKCptYXBwKSAqIG5mc2IpOworCX0KKwlpZiAoYnBwKQorCQkqYnBwID0gcmJwOworCXJldHVybiAwOworZXhpdDE6CisJaWYgKGJwbGlzdCkgeworCQlmb3IgKGkgPSAwOyBpIDwgbmJwbGlzdDsgaSsrKQorCQkJeGZzX3RyYW5zX2JyZWxzZSh0cmFucywgYnBsaXN0W2ldKTsKKwkJa21lbV9mcmVlKGJwbGlzdCwgc2l6ZW9mKCpicGxpc3QpICogbm1hcCk7CisJfQorZXhpdDA6CisJaWYgKG1hcHAgIT0gJm1hcCkKKwkJa21lbV9mcmVlKG1hcHAsIHNpemVvZigqbWFwcCkgKiBuZnNiKTsKKwlpZiAoYnBwKQorCQkqYnBwID0gTlVMTDsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBHZXQgYSBidWZmZXIgZm9yIHRoZSBkaXIvYXR0ciBibG9jay4KKyAqLworaW50Cit4ZnNfZGFfZ2V0X2J1ZigKKwl4ZnNfdHJhbnNfdAkqdHJhbnMsCisJeGZzX2lub2RlX3QJKmRwLAorCXhmc19kYWJsa190CWJubywKKwl4ZnNfZGFkZHJfdAkJbWFwcGVkYm5vLAorCXhmc19kYWJ1Zl90CSoqYnBwLAorCWludAkJd2hpY2hmb3JrKQoreworCXJldHVybiB4ZnNfZGFfZG9fYnVmKHRyYW5zLCBkcCwgYm5vLCAmbWFwcGVkYm5vLCBicHAsIHdoaWNoZm9yaywgMCwKKwkJCQkJCSAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7Cit9CisKKy8qCisgKiBHZXQgYSBidWZmZXIgZm9yIHRoZSBkaXIvYXR0ciBibG9jaywgZmlsbCBpbiB0aGUgY29udGVudHMuCisgKi8KK2ludAoreGZzX2RhX3JlYWRfYnVmKAorCXhmc190cmFuc190CSp0cmFucywKKwl4ZnNfaW5vZGVfdAkqZHAsCisJeGZzX2RhYmxrX3QJYm5vLAorCXhmc19kYWRkcl90CQltYXBwZWRibm8sCisJeGZzX2RhYnVmX3QJKipicHAsCisJaW50CQl3aGljaGZvcmspCit7CisJcmV0dXJuIHhmc19kYV9kb19idWYodHJhbnMsIGRwLCBibm8sICZtYXBwZWRibm8sIGJwcCwgd2hpY2hmb3JrLCAxLAorCQkoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7Cit9CisKKy8qCisgKiBSZWFkYWhlYWQgdGhlIGRpci9hdHRyIGJsb2NrLgorICovCit4ZnNfZGFkZHJfdAoreGZzX2RhX3JlYWRhX2J1ZigKKwl4ZnNfdHJhbnNfdAkqdHJhbnMsCisJeGZzX2lub2RlX3QJKmRwLAorCXhmc19kYWJsa190CWJubywKKwlpbnQJCXdoaWNoZm9yaykKK3sKKwl4ZnNfZGFkZHJfdAkJcnZhbDsKKworCXJ2YWwgPSAtMTsKKwlpZiAoeGZzX2RhX2RvX2J1Zih0cmFucywgZHAsIGJubywgJnJ2YWwsIE5VTEwsIHdoaWNoZm9yaywgMywKKwkJCShpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKSkKKwkJcmV0dXJuIC0xOworCWVsc2UKKwkJcmV0dXJuIHJ2YWw7Cit9CisKKy8qCisgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZCB0byBob2xkIGkgZGlmZmVyZW50IHZhbHVlcy4KKyAqLwordWludAoreGZzX2RhX2xvZzJfcm91bmR1cCh1aW50IGkpCit7CisJdWludCBydmFsOworCisJZm9yIChydmFsID0gMDsgcnZhbCA8IE5CQlkgKiBzaXplb2YoaSk7IHJ2YWwrKykgeworCQlpZiAoKDEgPDwgcnZhbCkgPj0gaSkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4ocnZhbCk7Cit9CisKK2ttZW1fem9uZV90ICp4ZnNfZGFfc3RhdGVfem9uZTsJLyogYW5jaG9yIGZvciBzdGF0ZSBzdHJ1Y3Qgem9uZSAqLwora21lbV96b25lX3QgKnhmc19kYWJ1Zl96b25lOwkJLyogZGFidWYgem9uZSAqLworCisvKgorICogQWxsb2NhdGUgYSBkaXItc3RhdGUgc3RydWN0dXJlLgorICogV2UgZG9uJ3QgcHV0IHRoZW0gb24gdGhlIHN0YWNrIHNpbmNlIHRoZXkncmUgbGFyZ2UuCisgKi8KK3hmc19kYV9zdGF0ZV90ICoKK3hmc19kYV9zdGF0ZV9hbGxvYyh2b2lkKQoreworCXJldHVybiBrbWVtX3pvbmVfemFsbG9jKHhmc19kYV9zdGF0ZV96b25lLCBLTV9TTEVFUCk7Cit9CisKKy8qCisgKiBLaWxsIHRoZSBhbHRwYXRoIGNvbnRlbnRzIG9mIGEgZGEtc3RhdGUgc3RydWN0dXJlLgorICovCit2b2lkCit4ZnNfZGFfc3RhdGVfa2lsbF9hbHRwYXRoKHhmc19kYV9zdGF0ZV90ICpzdGF0ZSkKK3sKKwlpbnQJaTsKKworCWZvciAoaSA9IDA7IGkgPCBzdGF0ZS0+YWx0cGF0aC5hY3RpdmU7IGkrKykgeworCQlpZiAoc3RhdGUtPmFsdHBhdGguYmxrW2ldLmJwKSB7CisJCQlpZiAoc3RhdGUtPmFsdHBhdGguYmxrW2ldLmJwICE9IHN0YXRlLT5wYXRoLmJsa1tpXS5icCkKKwkJCQl4ZnNfZGFfYnVmX2RvbmUoc3RhdGUtPmFsdHBhdGguYmxrW2ldLmJwKTsKKwkJCXN0YXRlLT5hbHRwYXRoLmJsa1tpXS5icCA9IE5VTEw7CisJCX0KKwl9CisJc3RhdGUtPmFsdHBhdGguYWN0aXZlID0gMDsKK30KKworLyoKKyAqIEZyZWUgYSBkYS1zdGF0ZSBzdHJ1Y3R1cmUuCisgKi8KK3ZvaWQKK3hmc19kYV9zdGF0ZV9mcmVlKHhmc19kYV9zdGF0ZV90ICpzdGF0ZSkKK3sKKwlpbnQJaTsKKworCXhmc19kYV9zdGF0ZV9raWxsX2FsdHBhdGgoc3RhdGUpOworCWZvciAoaSA9IDA7IGkgPCBzdGF0ZS0+cGF0aC5hY3RpdmU7IGkrKykgeworCQlpZiAoc3RhdGUtPnBhdGguYmxrW2ldLmJwKQorCQkJeGZzX2RhX2J1Zl9kb25lKHN0YXRlLT5wYXRoLmJsa1tpXS5icCk7CisJfQorCWlmIChzdGF0ZS0+ZXh0cmF2YWxpZCAmJiBzdGF0ZS0+ZXh0cmFibGsuYnApCisJCXhmc19kYV9idWZfZG9uZShzdGF0ZS0+ZXh0cmFibGsuYnApOworI2lmZGVmIERFQlVHCisJbWVtc2V0KChjaGFyICopc3RhdGUsIDAsIHNpemVvZigqc3RhdGUpKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCWttZW1fem9uZV9mcmVlKHhmc19kYV9zdGF0ZV96b25lLCBzdGF0ZSk7Cit9CisKKyNpZmRlZiBYRlNfREFCVUZfREVCVUcKK3hmc19kYWJ1Zl90CSp4ZnNfZGFidWZfZ2xvYmFsX2xpc3Q7Citsb2NrX3QJCXhmc19kYWJ1Zl9nbG9iYWxfbG9jazsKKyNlbmRpZgorCisvKgorICogQ3JlYXRlIGEgZGFidWYuCisgKi8KKy8qIEFSR1NVU0VEICovCitTVEFUSUMgeGZzX2RhYnVmX3QgKgoreGZzX2RhX2J1Zl9tYWtlKGludCBuYnVmLCB4ZnNfYnVmX3QgKipicHMsIGluc3RfdCAqcmEpCit7CisJeGZzX2J1Zl90CSpicDsKKwl4ZnNfZGFidWZfdAkqZGFidWY7CisJaW50CQlpOworCWludAkJb2ZmOworCisJaWYgKG5idWYgPT0gMSkKKwkJZGFidWYgPSBrbWVtX3pvbmVfYWxsb2MoeGZzX2RhYnVmX3pvbmUsIEtNX1NMRUVQKTsKKwllbHNlCisJCWRhYnVmID0ga21lbV9hbGxvYyhYRlNfREFfQlVGX1NJWkUobmJ1ZiksIEtNX1NMRUVQKTsKKwlkYWJ1Zi0+ZGlydHkgPSAwOworI2lmZGVmIFhGU19EQUJVRl9ERUJVRworCWRhYnVmLT5yYSA9IHJhOworCWRhYnVmLT50YXJnZXQgPSBYRlNfQlVGX1RBUkdFVChicHNbMF0pOworCWRhYnVmLT5ibGtubyA9IFhGU19CVUZfQUREUihicHNbMF0pOworI2VuZGlmCisJaWYgKG5idWYgPT0gMSkgeworCQlkYWJ1Zi0+bmJ1ZiA9IDE7CisJCWJwID0gYnBzWzBdOworCQlkYWJ1Zi0+YmJjb3VudCA9IChzaG9ydClCVE9CQihYRlNfQlVGX0NPVU5UKGJwKSk7CisJCWRhYnVmLT5kYXRhID0gWEZTX0JVRl9QVFIoYnApOworCQlkYWJ1Zi0+YnBzWzBdID0gYnA7CisJfSBlbHNlIHsKKwkJZGFidWYtPm5idWYgPSBuYnVmOworCQlmb3IgKGkgPSAwLCBkYWJ1Zi0+YmJjb3VudCA9IDA7IGkgPCBuYnVmOyBpKyspIHsKKwkJCWRhYnVmLT5icHNbaV0gPSBicCA9IGJwc1tpXTsKKwkJCWRhYnVmLT5iYmNvdW50ICs9IEJUT0JCKFhGU19CVUZfQ09VTlQoYnApKTsKKwkJfQorCQlkYWJ1Zi0+ZGF0YSA9IGttZW1fYWxsb2MoQkJUT0IoZGFidWYtPmJiY291bnQpLCBLTV9TTEVFUCk7CisJCWZvciAoaSA9IG9mZiA9IDA7IGkgPCBuYnVmOyBpKyssIG9mZiArPSBYRlNfQlVGX0NPVU5UKGJwKSkgeworCQkJYnAgPSBicHNbaV07CisJCQltZW1jcHkoKGNoYXIgKilkYWJ1Zi0+ZGF0YSArIG9mZiwgWEZTX0JVRl9QVFIoYnApLAorCQkJCVhGU19CVUZfQ09VTlQoYnApKTsKKwkJfQorCX0KKyNpZmRlZiBYRlNfREFCVUZfREVCVUcKKwl7CisJCVNQTERFQ0wocyk7CisJCXhmc19kYWJ1Zl90CSpwOworCisJCXMgPSBtdXRleF9zcGlubG9jaygmeGZzX2RhYnVmX2dsb2JhbF9sb2NrKTsKKwkJZm9yIChwID0geGZzX2RhYnVmX2dsb2JhbF9saXN0OyBwOyBwID0gcC0+bmV4dCkgeworCQkJQVNTRVJUKHAtPmJsa25vICE9IGRhYnVmLT5ibGtubyB8fAorCQkJICAgICAgIHAtPnRhcmdldCAhPSBkYWJ1Zi0+dGFyZ2V0KTsKKwkJfQorCQlkYWJ1Zi0+cHJldiA9IE5VTEw7CisJCWlmICh4ZnNfZGFidWZfZ2xvYmFsX2xpc3QpCisJCQl4ZnNfZGFidWZfZ2xvYmFsX2xpc3QtPnByZXYgPSBkYWJ1ZjsKKwkJZGFidWYtPm5leHQgPSB4ZnNfZGFidWZfZ2xvYmFsX2xpc3Q7CisJCXhmc19kYWJ1Zl9nbG9iYWxfbGlzdCA9IGRhYnVmOworCQltdXRleF9zcGludW5sb2NrKCZ4ZnNfZGFidWZfZ2xvYmFsX2xvY2ssIHMpOworCX0KKyNlbmRpZgorCXJldHVybiBkYWJ1ZjsKK30KKworLyoKKyAqIFVuLWRpcnR5IGEgZGFidWYuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfZGFfYnVmX2NsZWFuKHhmc19kYWJ1Zl90ICpkYWJ1ZikKK3sKKwl4ZnNfYnVmX3QJKmJwOworCWludAkJaTsKKwlpbnQJCW9mZjsKKworCWlmIChkYWJ1Zi0+ZGlydHkpIHsKKwkJQVNTRVJUKGRhYnVmLT5uYnVmID4gMSk7CisJCWRhYnVmLT5kaXJ0eSA9IDA7CisJCWZvciAoaSA9IG9mZiA9IDA7IGkgPCBkYWJ1Zi0+bmJ1ZjsKKwkJCQlpKyssIG9mZiArPSBYRlNfQlVGX0NPVU5UKGJwKSkgeworCQkJYnAgPSBkYWJ1Zi0+YnBzW2ldOworCQkJbWVtY3B5KFhGU19CVUZfUFRSKGJwKSwgKGNoYXIgKilkYWJ1Zi0+ZGF0YSArIG9mZiwKKwkJCQlYRlNfQlVGX0NPVU5UKGJwKSk7CisJCX0KKwl9Cit9CisKKy8qCisgKiBSZWxlYXNlIGEgZGFidWYuCisgKi8KK3ZvaWQKK3hmc19kYV9idWZfZG9uZSh4ZnNfZGFidWZfdCAqZGFidWYpCit7CisJQVNTRVJUKGRhYnVmKTsKKwlBU1NFUlQoZGFidWYtPm5idWYgJiYgZGFidWYtPmRhdGEgJiYgZGFidWYtPmJiY291bnQgJiYgZGFidWYtPmJwc1swXSk7CisJaWYgKGRhYnVmLT5kaXJ0eSkKKwkJeGZzX2RhX2J1Zl9jbGVhbihkYWJ1Zik7CisJaWYgKGRhYnVmLT5uYnVmID4gMSkKKwkJa21lbV9mcmVlKGRhYnVmLT5kYXRhLCBCQlRPQihkYWJ1Zi0+YmJjb3VudCkpOworI2lmZGVmIFhGU19EQUJVRl9ERUJVRworCXsKKwkJU1BMREVDTChzKTsKKworCQlzID0gbXV0ZXhfc3BpbmxvY2soJnhmc19kYWJ1Zl9nbG9iYWxfbG9jayk7CisJCWlmIChkYWJ1Zi0+cHJldikKKwkJCWRhYnVmLT5wcmV2LT5uZXh0ID0gZGFidWYtPm5leHQ7CisJCWVsc2UKKwkJCXhmc19kYWJ1Zl9nbG9iYWxfbGlzdCA9IGRhYnVmLT5uZXh0OworCQlpZiAoZGFidWYtPm5leHQpCisJCQlkYWJ1Zi0+bmV4dC0+cHJldiA9IGRhYnVmLT5wcmV2OworCQltdXRleF9zcGludW5sb2NrKCZ4ZnNfZGFidWZfZ2xvYmFsX2xvY2ssIHMpOworCX0KKwltZW1zZXQoZGFidWYsIDAsIFhGU19EQV9CVUZfU0laRShkYWJ1Zi0+bmJ1ZikpOworI2VuZGlmCisJaWYgKGRhYnVmLT5uYnVmID09IDEpCisJCWttZW1fem9uZV9mcmVlKHhmc19kYWJ1Zl96b25lLCBkYWJ1Zik7CisJZWxzZQorCQlrbWVtX2ZyZWUoZGFidWYsIFhGU19EQV9CVUZfU0laRShkYWJ1Zi0+bmJ1ZikpOworfQorCisvKgorICogTG9nIHRyYW5zYWN0aW9uIGZyb20gYSBkYWJ1Zi4KKyAqLwordm9pZAoreGZzX2RhX2xvZ19idWYoeGZzX3RyYW5zX3QgKnRwLCB4ZnNfZGFidWZfdCAqZGFidWYsIHVpbnQgZmlyc3QsIHVpbnQgbGFzdCkKK3sKKwl4ZnNfYnVmX3QJKmJwOworCXVpbnQJCWY7CisJaW50CQlpOworCXVpbnQJCWw7CisJaW50CQlvZmY7CisKKwlBU1NFUlQoZGFidWYtPm5idWYgJiYgZGFidWYtPmRhdGEgJiYgZGFidWYtPmJiY291bnQgJiYgZGFidWYtPmJwc1swXSk7CisJaWYgKGRhYnVmLT5uYnVmID09IDEpIHsKKwkJQVNTRVJUKGRhYnVmLT5kYXRhID09ICh2b2lkICopWEZTX0JVRl9QVFIoZGFidWYtPmJwc1swXSkpOworCQl4ZnNfdHJhbnNfbG9nX2J1Zih0cCwgZGFidWYtPmJwc1swXSwgZmlyc3QsIGxhc3QpOworCQlyZXR1cm47CisJfQorCWRhYnVmLT5kaXJ0eSA9IDE7CisJQVNTRVJUKGZpcnN0IDw9IGxhc3QpOworCWZvciAoaSA9IG9mZiA9IDA7IGkgPCBkYWJ1Zi0+bmJ1ZjsgaSsrLCBvZmYgKz0gWEZTX0JVRl9DT1VOVChicCkpIHsKKwkJYnAgPSBkYWJ1Zi0+YnBzW2ldOworCQlmID0gb2ZmOworCQlsID0gZiArIFhGU19CVUZfQ09VTlQoYnApIC0gMTsKKwkJaWYgKGYgPCBmaXJzdCkKKwkJCWYgPSBmaXJzdDsKKwkJaWYgKGwgPiBsYXN0KQorCQkJbCA9IGxhc3Q7CisJCWlmIChmIDw9IGwpCisJCQl4ZnNfdHJhbnNfbG9nX2J1Zih0cCwgYnAsIGYgLSBvZmYsIGwgLSBvZmYpOworCQkvKgorCQkgKiBCX0RPTkUgaXMgc2V0IGJ5IHhmc190cmFuc19sb2cgYnVmLgorCQkgKiBJZiB3ZSBkb24ndCBzZXQgaXQgb24gYSBuZXcgYnVmZmVyIChnZXQgbm90IHJlYWQpCisJCSAqIHRoZW4gaWYgd2UgZG9uJ3QgcHV0IGFueXRoaW5nIGluIHRoZSBidWZmZXIgaXQgd29uJ3QKKwkJICogYmUgc2V0LCBhbmQgYXQgY29tbWl0IGl0IGl0IHJlbGVhc2VkIGludG8gdGhlIGNhY2hlLAorCQkgKiBhbmQgdGhlbiBhIHJlYWQgd2lsbCBmYWlsLgorCQkgKi8KKwkJZWxzZSBpZiAoIShYRlNfQlVGX0lTRE9ORShicCkpKQorCQkgIFhGU19CVUZfRE9ORShicCk7CisJfQorCUFTU0VSVChsYXN0IDwgb2ZmKTsKK30KKworLyoKKyAqIFJlbGVhc2UgZGFidWYgZnJvbSBhIHRyYW5zYWN0aW9uLgorICogSGF2ZSB0byBmcmVlIHVwIHRoZSBkYWJ1ZiBiZWZvcmUgdGhlIGJ1ZmZlcnMgYXJlIHJlbGVhc2VkLAorICogc2luY2UgdGhlIHN5bmNocm9uaXphdGlvbiBvbiB0aGUgZGFidWYgaXMgcmVhbGx5IHRoZSBsb2NrIG9uIHRoZSBidWZmZXIuCisgKi8KK3ZvaWQKK3hmc19kYV9icmVsc2UoeGZzX3RyYW5zX3QgKnRwLCB4ZnNfZGFidWZfdCAqZGFidWYpCit7CisJeGZzX2J1Zl90CSpicDsKKwl4ZnNfYnVmX3QJKipicGxpc3Q7CisJaW50CQlpOworCWludAkJbmJ1ZjsKKworCUFTU0VSVChkYWJ1Zi0+bmJ1ZiAmJiBkYWJ1Zi0+ZGF0YSAmJiBkYWJ1Zi0+YmJjb3VudCAmJiBkYWJ1Zi0+YnBzWzBdKTsKKwlpZiAoKG5idWYgPSBkYWJ1Zi0+bmJ1ZikgPT0gMSkgeworCQlicGxpc3QgPSAmYnA7CisJCWJwID0gZGFidWYtPmJwc1swXTsKKwl9IGVsc2UgeworCQlicGxpc3QgPSBrbWVtX2FsbG9jKG5idWYgKiBzaXplb2YoKmJwbGlzdCksIEtNX1NMRUVQKTsKKwkJbWVtY3B5KGJwbGlzdCwgZGFidWYtPmJwcywgbmJ1ZiAqIHNpemVvZigqYnBsaXN0KSk7CisJfQorCXhmc19kYV9idWZfZG9uZShkYWJ1Zik7CisJZm9yIChpID0gMDsgaSA8IG5idWY7IGkrKykKKwkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnBsaXN0W2ldKTsKKwlpZiAoYnBsaXN0ICE9ICZicCkKKwkJa21lbV9mcmVlKGJwbGlzdCwgbmJ1ZiAqIHNpemVvZigqYnBsaXN0KSk7Cit9CisKKy8qCisgKiBJbnZhbGlkYXRlIGRhYnVmIGZyb20gYSB0cmFuc2FjdGlvbi4KKyAqLwordm9pZAoreGZzX2RhX2JpbnZhbCh4ZnNfdHJhbnNfdCAqdHAsIHhmc19kYWJ1Zl90ICpkYWJ1ZikKK3sKKwl4ZnNfYnVmX3QJKmJwOworCXhmc19idWZfdAkqKmJwbGlzdDsKKwlpbnQJCWk7CisJaW50CQluYnVmOworCisJQVNTRVJUKGRhYnVmLT5uYnVmICYmIGRhYnVmLT5kYXRhICYmIGRhYnVmLT5iYmNvdW50ICYmIGRhYnVmLT5icHNbMF0pOworCWlmICgobmJ1ZiA9IGRhYnVmLT5uYnVmKSA9PSAxKSB7CisJCWJwbGlzdCA9ICZicDsKKwkJYnAgPSBkYWJ1Zi0+YnBzWzBdOworCX0gZWxzZSB7CisJCWJwbGlzdCA9IGttZW1fYWxsb2MobmJ1ZiAqIHNpemVvZigqYnBsaXN0KSwgS01fU0xFRVApOworCQltZW1jcHkoYnBsaXN0LCBkYWJ1Zi0+YnBzLCBuYnVmICogc2l6ZW9mKCpicGxpc3QpKTsKKwl9CisJeGZzX2RhX2J1Zl9kb25lKGRhYnVmKTsKKwlmb3IgKGkgPSAwOyBpIDwgbmJ1ZjsgaSsrKQorCQl4ZnNfdHJhbnNfYmludmFsKHRwLCBicGxpc3RbaV0pOworCWlmIChicGxpc3QgIT0gJmJwKQorCQlrbWVtX2ZyZWUoYnBsaXN0LCBuYnVmICogc2l6ZW9mKCpicGxpc3QpKTsKK30KKworLyoKKyAqIEdldCB0aGUgZmlyc3QgZGFkZHIgZnJvbSBhIGRhYnVmLgorICovCit4ZnNfZGFkZHJfdAoreGZzX2RhX2Jsa25vKHhmc19kYWJ1Zl90ICpkYWJ1ZikKK3sKKwlBU1NFUlQoZGFidWYtPm5idWYpOworCUFTU0VSVChkYWJ1Zi0+ZGF0YSk7CisJcmV0dXJuIFhGU19CVUZfQUREUihkYWJ1Zi0+YnBzWzBdKTsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGFfYnRyZWUuaCBiL2ZzL3hmcy94ZnNfZGFfYnRyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmM2OTlkCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19kYV9idHJlZS5oCkBAIC0wLDAgKzEsMzM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfREFfQlRSRUVfSF9fCisjZGVmaW5lCV9fWEZTX0RBX0JUUkVFX0hfXworCitzdHJ1Y3QgeGZzX2J1ZjsKK3N0cnVjdCB4ZnNfYm1hcF9mcmVlOworc3RydWN0IHhmc19pbm9kZTsKK3N0cnVjdCB4ZnNfbW91bnQ7CitzdHJ1Y3QgeGZzX3RyYW5zOworc3RydWN0IHpvbmU7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBEaXJlY3RvcnkgU3RydWN0dXJlIHdoZW4gZ3JlYXRlciB0aGFuIFhGU19MQlNJWkUobXApIGJ5dGVzLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgY29tbW9uIHRvIGJvdGggbGVhZiBub2RlcyBhbmQgbm9uLWxlYWYgbm9kZXMgaW4gdGhlIEJ0cmVlLgorICoKKyAqIElzIGlzIHVzZWQgdG8gbWFuYWdlIGEgZG91Ymx5IGxpbmtlZCBsaXN0IG9mIGFsbCBibG9ja3MgYXQgdGhlIHNhbWUKKyAqIGxldmVsIGluIHRoZSBCdHJlZSwgYW5kIHRvIGlkZW50aWZ5IHdoaWNoIHR5cGUgb2YgYmxvY2sgdGhpcyBpcy4KKyAqLworI2RlZmluZSBYRlNfREFfTk9ERV9NQUdJQwkweGZlYmUJLyogbWFnaWMgbnVtYmVyOiBub24tbGVhZiBibG9ja3MgKi8KKyNkZWZpbmUgWEZTX0RJUl9MRUFGX01BR0lDCTB4ZmVlYgkvKiBtYWdpYyBudW1iZXI6IGRpcmVjdG9yeSBsZWFmIGJsa3MgKi8KKyNkZWZpbmUgWEZTX0FUVFJfTEVBRl9NQUdJQwkweGZiZWUJLyogbWFnaWMgbnVtYmVyOiBhdHRyaWJ1dGUgbGVhZiBibGtzICovCisjZGVmaW5lCVhGU19ESVIyX0xFQUYxX01BR0lDCTB4ZDJmMQkvKiBtYWdpYyBudW1iZXI6IHYyIGRpcmxmIHNpbmdsZSBibGtzICovCisjZGVmaW5lCVhGU19ESVIyX0xFQUZOX01BR0lDCTB4ZDJmZgkvKiBtYWdpYyBudW1iZXI6IHYyIGRpcmxmIG11bHRpIGJsa3MgKi8KKworI2RlZmluZQlYRlNfRElSWF9MRUFGX01BR0lDKG1wKQlcCisJKFhGU19ESVJfSVNfVjEobXApID8gWEZTX0RJUl9MRUFGX01BR0lDIDogWEZTX0RJUjJfTEVBRk5fTUFHSUMpCisKK3R5cGVkZWYgc3RydWN0IHhmc19kYV9ibGtpbmZvIHsKKwl4ZnNfZGFibGtfdCBmb3J3OwkJCS8qIHByZXZpb3VzIGJsb2NrIGluIGxpc3QgKi8KKwl4ZnNfZGFibGtfdCBiYWNrOwkJCS8qIGZvbGxvd2luZyBibG9jayBpbiBsaXN0ICovCisJX191aW50MTZfdCBtYWdpYzsJCQkvKiB2YWxpZGl0eSBjaGVjayBvbiBibG9jayAqLworCV9fdWludDE2X3QgcGFkOwkJCQkvKiB1bnVzZWQgKi8KK30geGZzX2RhX2Jsa2luZm9fdDsKKworLyoKKyAqIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgcm9vdCBhbmQgaW50ZXJtZWRpYXRlIG5vZGVzIGluIHRoZSBCdHJlZS4KKyAqIFRoZSBsZWFmIG5vZGVzIGFyZSBkZWZpbmVkIGFib3ZlLgorICoKKyAqIEVudHJpZXMgYXJlIG5vdCBwYWNrZWQuCisgKgorICogU2luY2Ugd2UgaGF2ZSBkdXBsaWNhdGUga2V5cywgdXNlIGEgYmluYXJ5IHNlYXJjaCBidXQgYWx3YXlzIGZvbGxvdworICogYWxsIG1hdGNoIGluIHRoZSBibG9jaywgbm90IGp1c3QgdGhlIGZpcnN0IG1hdGNoIGZvdW5kLgorICovCisjZGVmaW5lCVhGU19EQV9OT0RFX01BWERFUFRICTUJLyogbWF4IGRlcHRoIG9mIEJ0cmVlICovCisKK3R5cGVkZWYgc3RydWN0IHhmc19kYV9pbnRub2RlIHsKKwlzdHJ1Y3QgeGZzX2RhX25vZGVfaGRyIHsJLyogY29uc3RhbnQtc3RydWN0dXJlIGhlYWRlciBibG9jayAqLworCQl4ZnNfZGFfYmxraW5mb190IGluZm87CS8qIGJsb2NrIHR5cGUsIGxpbmtzLCBldGMuICovCisJCV9fdWludDE2X3QgY291bnQ7CS8qIGNvdW50IG9mIGFjdGl2ZSBlbnRyaWVzICovCisJCV9fdWludDE2X3QgbGV2ZWw7CS8qIGxldmVsIGFib3ZlIGxlYXZlcyAobGVhZiA9PSAwKSAqLworCX0gaGRyOworCXN0cnVjdCB4ZnNfZGFfbm9kZV9lbnRyeSB7CisJCXhmc19kYWhhc2hfdCBoYXNodmFsOwkvKiBoYXNoIHZhbHVlIGZvciB0aGlzIGRlc2NlbmRhbnQgKi8KKwkJeGZzX2RhYmxrX3QgYmVmb3JlOwkvKiBCdHJlZSBibG9jayBiZWZvcmUgdGhpcyBrZXkgKi8KKwl9IGJ0cmVlWzFdOwkJCS8qIHZhcmlhYmxlIHNpemVkIGFycmF5IG9mIGtleXMgKi8KK30geGZzX2RhX2ludG5vZGVfdDsKK3R5cGVkZWYgc3RydWN0IHhmc19kYV9ub2RlX2hkciB4ZnNfZGFfbm9kZV9oZHJfdDsKK3R5cGVkZWYgc3RydWN0IHhmc19kYV9ub2RlX2VudHJ5IHhmc19kYV9ub2RlX2VudHJ5X3Q7CisKKyNkZWZpbmUgWEZTX0RBX01BWEhBU0gJKCh4ZnNfZGFoYXNoX3QpLTEpIC8qIGxhcmdlc3QgdmFsaWQgaGFzaCB2YWx1ZSAqLworCisvKgorICogTWFjcm9zIHVzZWQgYnkgZGlyZWN0b3J5IGNvZGUgdG8gaW50ZXJmYWNlIHRvIHRoZSBmaWxlc3lzdGVtLgorICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19MQlNJWkUpCitpbnQgeGZzX2xic2l6ZShzdHJ1Y3QgeGZzX21vdW50ICptcCk7CisjZGVmaW5lCVhGU19MQlNJWkUobXApCQkJeGZzX2xic2l6ZShtcCkKKyNlbHNlCisjZGVmaW5lCVhGU19MQlNJWkUobXApCSgobXApLT5tX3NiLnNiX2Jsb2Nrc2l6ZSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfTEJMT0cpCitpbnQgeGZzX2xibG9nKHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKKyNkZWZpbmUJWEZTX0xCTE9HKG1wKQkJCXhmc19sYmxvZyhtcCkKKyNlbHNlCisjZGVmaW5lCVhGU19MQkxPRyhtcCkJKChtcCktPm1fc2Iuc2JfYmxvY2tsb2cpCisjZW5kaWYKKworLyoKKyAqIE1hY3JvcyB1c2VkIGJ5IGRpcmVjdG9yeSBjb2RlIHRvIGludGVyZmFjZSB0byB0aGUga2VybmVsCisgKi8KKworLyoKKyAqIE1hY3JvcyB1c2VkIHRvIG1hbmlwdWxhdGUgZGlyZWN0b3J5IG9mZl90J3MKKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfREFfTUFLRV9CTk9FTlRSWSkKK19fdWludDMyX3QgeGZzX2RhX21ha2VfYm5vZW50cnkoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19kYWJsa190IGJubywKKwkJCQlpbnQgZW50cnkpOworI2RlZmluZQlYRlNfREFfTUFLRV9CTk9FTlRSWShtcCxibm8sZW50cnkpCVwKKwl4ZnNfZGFfbWFrZV9ibm9lbnRyeShtcCxibm8sZW50cnkpCisjZWxzZQorI2RlZmluZQlYRlNfREFfTUFLRV9CTk9FTlRSWShtcCxibm8sZW50cnkpIFwKKwkoKChibm8pIDw8IChtcCktPm1fZGlyY29va19lbG9nKSB8IChlbnRyeSkpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RBX01BS0VfQ09PS0lFKQoreGZzX29mZl90IHhmc19kYV9tYWtlX2Nvb2tpZShzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RhYmxrX3QgYm5vLCBpbnQgZW50cnksCisJCQkJeGZzX2RhaGFzaF90IGhhc2gpOworI2RlZmluZQlYRlNfREFfTUFLRV9DT09LSUUobXAsYm5vLGVudHJ5LGhhc2gpCVwKKwl4ZnNfZGFfbWFrZV9jb29raWUobXAsYm5vLGVudHJ5LGhhc2gpCisjZWxzZQorI2RlZmluZQlYRlNfREFfTUFLRV9DT09LSUUobXAsYm5vLGVudHJ5LGhhc2gpIFwKKwkoKCh4ZnNfb2ZmX3QpWEZTX0RBX01BS0VfQk5PRU5UUlkobXAsIGJubywgZW50cnkpIDw8IDMyKSB8IChoYXNoKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfREFfQ09PS0lFX0hBU0gpCit4ZnNfZGFoYXNoX3QgeGZzX2RhX2Nvb2tpZV9oYXNoKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfb2ZmX3QgY29va2llKTsKKyNkZWZpbmUJWEZTX0RBX0NPT0tJRV9IQVNIKG1wLGNvb2tpZSkJCXhmc19kYV9jb29raWVfaGFzaChtcCxjb29raWUpCisjZWxzZQorI2RlZmluZQlYRlNfREFfQ09PS0lFX0hBU0gobXAsY29va2llKQkoKHhmc19kYWhhc2hfdCkoY29va2llKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfREFfQ09PS0lFX0JOTykKK3hmc19kYWJsa190IHhmc19kYV9jb29raWVfYm5vKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfb2ZmX3QgY29va2llKTsKKyNkZWZpbmUJWEZTX0RBX0NPT0tJRV9CTk8obXAsY29va2llKQkJeGZzX2RhX2Nvb2tpZV9ibm8obXAsY29va2llKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0RBX0NPT0tJRV9CTk8obXAsY29va2llKSBcCisJKCgoeGZzX29mZl90KShjb29raWUpID4+IDMxKSA9PSAtMUxMID8gXAorCQkoeGZzX2RhYmxrX3QpMCA6IFwKKwkJKHhmc19kYWJsa190KSgoeGZzX29mZl90KShjb29raWUpID4+ICgobXApLT5tX2RpcmNvb2tfZWxvZyArIDMyKSkpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RBX0NPT0tJRV9FTlRSWSkKK2ludCB4ZnNfZGFfY29va2llX2VudHJ5KHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfb2ZmX3QgY29va2llKTsKKyNkZWZpbmUJWEZTX0RBX0NPT0tJRV9FTlRSWShtcCxjb29raWUpCQl4ZnNfZGFfY29va2llX2VudHJ5KG1wLGNvb2tpZSkKKyNlbHNlCisjZGVmaW5lCVhGU19EQV9DT09LSUVfRU5UUlkobXAsY29va2llKSBcCisJKCgoeGZzX29mZl90KShjb29raWUpID4+IDMxKSA9PSAtMUxMID8gXAorCQkoeGZzX2RhYmxrX3QpMCA6IFwKKwkJKHhmc19kYWJsa190KSgoKHhmc19vZmZfdCkoY29va2llKSA+PiAzMikgJiBcCisJCQkgICAgICAoKDEgPDwgKG1wKS0+bV9kaXJjb29rX2Vsb2cpIC0gMSkpKQorI2VuZGlmCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEJ0cmVlIHNlYXJjaGluZyBhbmQgbW9kaWZpY2F0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9ucy4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAqIFN0cnVjdHVyZSB0byBlYXNlIHBhc3NpbmcgYXJvdW5kIGNvbXBvbmVudCBuYW1lcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RhX2FyZ3MgeworCXVjaGFyX3QJCSpuYW1lOwkJLyogc3RyaW5nIChtYXliZSBub3QgTlVMTCB0ZXJtaW5hdGVkKSAqLworCWludAkJbmFtZWxlbjsJLyogbGVuZ3RoIG9mIHN0cmluZyAobWF5YmUgbm8gTlVMTCkgKi8KKwl1Y2hhcl90CQkqdmFsdWU7CQkvKiBzZXQgb2YgYnl0ZXMgKG1heWJlIGNvbnRhaW4gTlVMTHMpICovCisJaW50CQl2YWx1ZWxlbjsJLyogbGVuZ3RoIG9mIHZhbHVlICovCisJaW50CQlmbGFnczsJCS8qIGFyZ3VtZW50IGZsYWdzIChlZzogQVRUUl9OT0NSRUFURSkgKi8KKwl4ZnNfZGFoYXNoX3QJaGFzaHZhbDsJLyogaGFzaCB2YWx1ZSBvZiBuYW1lICovCisJeGZzX2lub190CWludW1iZXI7CS8qIGlucHV0L291dHB1dCBpbm9kZSBudW1iZXIgKi8KKwlzdHJ1Y3QgeGZzX2lub2RlICpkcDsJCS8qIGRpcmVjdG9yeSBpbm9kZSB0byBtYW5pcHVsYXRlICovCisJeGZzX2ZzYmxvY2tfdAkqZmlyc3RibG9jazsJLyogcHRyIHRvIGZpcnN0YmxvY2sgZm9yIGJtYXAgY2FsbHMgKi8KKwlzdHJ1Y3QgeGZzX2JtYXBfZnJlZSAqZmxpc3Q7CS8qIHB0ciB0byBmcmVlbGlzdCBmb3IgYm1hcF9maW5pc2ggKi8KKwlzdHJ1Y3QgeGZzX3RyYW5zICp0cmFuczsJLyogY3VycmVudCB0cmFucyAoY2hhbmdlcyBvdmVyIHRpbWUpICovCisJeGZzX2V4dGxlbl90CXRvdGFsOwkJLyogdG90YWwgYmxvY2tzIG5lZWRlZCwgZm9yIDFzdCBibWFwICovCisJaW50CQl3aGljaGZvcms7CS8qIGRhdGEgb3IgYXR0cmlidXRlIGZvcmsgKi8KKwl4ZnNfZGFibGtfdAlibGtubzsJCS8qIGJsa25vIG9mIGF0dHIgbGVhZiBvZiBpbnRlcmVzdCAqLworCWludAkJaW5kZXg7CQkvKiBpbmRleCBvZiBhdHRyIG9mIGludGVyZXN0IGluIGJsayAqLworCXhmc19kYWJsa190CXJtdGJsa25vOwkvKiByZW1vdGUgYXR0ciB2YWx1ZSBzdGFydGluZyBibGtubyAqLworCWludAkJcm10YmxrY250OwkvKiByZW1vdGUgYXR0ciB2YWx1ZSBibG9jayBjb3VudCAqLworCXhmc19kYWJsa190CWJsa25vMjsJCS8qIGJsa25vIG9mIDJuZCBhdHRyIGxlYWYgb2YgaW50ZXJlc3QgKi8KKwlpbnQJCWluZGV4MjsJCS8qIGluZGV4IG9mIDJuZCBhdHRyIGluIGJsayAqLworCXhmc19kYWJsa190CXJtdGJsa25vMjsJLyogcmVtb3RlIGF0dHIgdmFsdWUgc3RhcnRpbmcgYmxrbm8gKi8KKwlpbnQJCXJtdGJsa2NudDI7CS8qIHJlbW90ZSBhdHRyIHZhbHVlIGJsb2NrIGNvdW50ICovCisJdW5zaWduZWQgY2hhcglqdXN0Y2hlY2s7CS8qIFQvRjogY2hlY2sgZm9yIG9rIHdpdGggbm8gc3BhY2UgKi8KKwl1bnNpZ25lZCBjaGFyCXJlbmFtZTsJCS8qIFQvRjogdGhpcyBpcyBhbiBhdG9taWMgcmVuYW1lIG9wICovCisJdW5zaWduZWQgY2hhcglhZGRuYW1lOwkvKiBUL0Y6IHRoaXMgaXMgYW4gYWRkIG9wZXJhdGlvbiAqLworCXVuc2lnbmVkIGNoYXIJb2tub2VudDsJLyogVC9GOiBvayB0byByZXR1cm4gRU5PRU5ULCBlbHNlIGRpZSAqLworfSB4ZnNfZGFfYXJnc190OworCisvKgorICogU3RydWN0dXJlIHRvIGRlc2NyaWJlIGJ1ZmZlcihzKSBmb3IgYSBibG9jay4KKyAqIFRoaXMgaXMgbmVlZGVkIGluIHRoZSBkaXJlY3RvcnkgdmVyc2lvbiAyIGZvcm1hdCBjYXNlLCB3aGVuCisgKiBtdWx0aXBsZSBub24tY29udGlndW91cyBmc2Jsb2NrcyBtaWdodCBiZSBuZWVkZWQgdG8gY292ZXIgb25lCisgKiBsb2dpY2FsIGRpcmVjdG9yeSBibG9jay4KKyAqIElmIHRoZSBidWZmZXIgY291bnQgaXMgMSB0aGVuIHRoZSBkYXRhIHBvaW50ZXIgcG9pbnRzIHRvIHRoZQorICogc2FtZSBwbGFjZSBhcyB0aGUgYl9hZGRyIGZpZWxkIGZvciB0aGUgYnVmZmVyLCBlbHNlIHRvIGttZW1fYWxsb2NlZCBtZW1vcnkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19kYWJ1ZiB7CisJaW50CQluYnVmOwkJLyogbnVtYmVyIG9mIGJ1ZmZlciBwb2ludGVycyBwcmVzZW50ICovCisJc2hvcnQJCWRpcnR5OwkJLyogZGF0YSBuZWVkcyB0byBiZSBjb3BpZWQgYmFjayAqLworCXNob3J0CQliYmNvdW50OwkvKiBob3cgbGFyZ2UgaXMgZGF0YSBpbiBiYnMgKi8KKwl2b2lkCQkqZGF0YTsJCS8qIHBvaW50ZXIgZm9yIGJ1ZmZlcnMnIGRhdGEgKi8KKyNpZmRlZiBYRlNfREFCVUZfREVCVUcKKwlpbnN0X3QJCSpyYTsJCS8qIHJldHVybiBhZGRyZXNzIG9mIGNhbGxlciB0byBtYWtlICovCisJc3RydWN0IHhmc19kYWJ1ZiAqbmV4dDsJCS8qIG5leHQgaW4gZ2xvYmFsIGNoYWluICovCisJc3RydWN0IHhmc19kYWJ1ZiAqcHJldjsJCS8qIHByZXZpb3VzIGluIGdsb2JhbCBjaGFpbiAqLworCXN0cnVjdCB4ZnNfYnVmdGFyZyAqdGFyZ2V0OwkvKiBkZXZpY2UgZm9yIGJ1ZmZlciAqLworCXhmc19kYWRkcl90CWJsa25vOwkJLyogZGFkZHIgZmlyc3QgaW4gYnBzWzBdICovCisjZW5kaWYKKwlzdHJ1Y3QgeGZzX2J1ZgkqYnBzWzFdOwkvKiBhY3R1YWxseSBuYnVmIG9mIHRoZXNlICovCit9IHhmc19kYWJ1Zl90OworI2RlZmluZQlYRlNfREFfQlVGX1NJWkUobikJXAorCShzaXplb2YoeGZzX2RhYnVmX3QpICsgc2l6ZW9mKHN0cnVjdCB4ZnNfYnVmICopICogKChuKSAtIDEpKQorCisjaWZkZWYgWEZTX0RBQlVGX0RFQlVHCitleHRlcm4geGZzX2RhYnVmX3QJKnhmc19kYWJ1Zl9nbG9iYWxfbGlzdDsKKyNlbmRpZgorCisvKgorICogU3RvcmFnZSBmb3IgaG9sZGluZyBzdGF0ZSBkdXJpbmcgQnRyZWUgc2VhcmNoZXMgYW5kIHNwbGl0L2pvaW4gb3BzLgorICoKKyAqIE9ubHkgbmVlZCBzcGFjZSBmb3IgNSBpbnRlcm1lZGlhdGUgbm9kZXMuICBXaXRoIGEgbWluaW11bSBvZiA2Mi13YXkKKyAqIGZhbm91dCB0byB0aGUgQnRyZWUsIHdlIGNhbiBzdXBwb3J0IG92ZXIgOTAwIG1pbGxpb24gZGlyZWN0b3J5IGJsb2NrcywKKyAqIHdoaWNoIGlzIHNsaWdodGx5IG1vcmUgdGhhbiBlbm91Z2guCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19kYV9zdGF0ZV9ibGsgeworCXhmc19kYWJ1Zl90CSpicDsJCS8qIGJ1ZmZlciBjb250YWluaW5nIGJsb2NrICovCisJeGZzX2RhYmxrX3QJYmxrbm87CQkvKiBmaWxlc3lzdGVtIGJsa25vIG9mIGJ1ZmZlciAqLworCXhmc19kYWRkcl90CWRpc2tfYmxrbm87CS8qIG9uLWRpc2sgYmxrbm8gKGluIEJCcykgb2YgYnVmZmVyICovCisJaW50CQlpbmRleDsJCS8qIHJlbGV2YW50IGluZGV4IGludG8gYmxvY2sgKi8KKwl4ZnNfZGFoYXNoX3QJaGFzaHZhbDsJLyogbGFzdCBoYXNoIHZhbHVlIGluIGJsb2NrICovCisJaW50CQltYWdpYzsJCS8qIGJsaydzIG1hZ2ljIG51bWJlciwgaWU6IGJsayB0eXBlICovCit9IHhmc19kYV9zdGF0ZV9ibGtfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RhX3N0YXRlX3BhdGggeworCWludAkJCWFjdGl2ZTsJCS8qIG51bWJlciBvZiBhY3RpdmUgbGV2ZWxzICovCisJeGZzX2RhX3N0YXRlX2Jsa190CWJsa1tYRlNfREFfTk9ERV9NQVhERVBUSF07Cit9IHhmc19kYV9zdGF0ZV9wYXRoX3Q7CisKK3R5cGVkZWYgc3RydWN0IHhmc19kYV9zdGF0ZSB7CisJeGZzX2RhX2FyZ3NfdAkJKmFyZ3M7CQkvKiBmaWxlbmFtZSBhcmd1bWVudHMgKi8KKwlzdHJ1Y3QgeGZzX21vdW50CSptcDsJCS8qIGZpbGVzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl1bnNpZ25lZCBpbnQJCWJsb2Nrc2l6ZTsJLyogbG9naWNhbCBibG9jayBzaXplICovCisJdW5zaWduZWQgaW50CQlub2RlX2VudHM7CS8qIGhvdyBtYW55IGVudHJpZXMgaW4gZGFub2RlICovCisJeGZzX2RhX3N0YXRlX3BhdGhfdAlwYXRoOwkJLyogc2VhcmNoL3NwbGl0IHBhdGhzICovCisJeGZzX2RhX3N0YXRlX3BhdGhfdAlhbHRwYXRoOwkvKiBhbHRlcm5hdGUgcGF0aCBmb3Igam9pbiAqLworCXVuc2lnbmVkIGNoYXIJCWlubGVhZjsJCS8qIGluc2VydCBpbnRvIDEtPmxmLCAwLT5zcGxmICovCisJdW5zaWduZWQgY2hhcgkJZXh0cmF2YWxpZDsJLyogVC9GOiBleHRyYWJsayBpcyBpbiB1c2UgKi8KKwl1bnNpZ25lZCBjaGFyCQlleHRyYWFmdGVyOwkvKiBUL0Y6IGV4dHJhYmxrIGlzIGFmdGVyIG5ldyAqLworCXhmc19kYV9zdGF0ZV9ibGtfdAlleHRyYWJsazsJLyogZm9yIGRvdWJsZS1zcGxpdHMgb24gbGVhZnMgKi8KKwkJCQkJCS8qIGZvciBkaXJ2MiBleHRyYWJsayBpcyBkYXRhICovCit9IHhmc19kYV9zdGF0ZV90OworCisvKgorICogVXRpbGl0eSBtYWNyb3MgdG8gYWlkIGluIGxvZ2dpbmcgY2hhbmdlZCBzdHJ1Y3R1cmUgZmllbGRzLgorICovCisjZGVmaW5lIFhGU19EQV9MT0dPRkYoQkFTRSwgQUREUikJKChjaGFyICopKEFERFIpIC0gKGNoYXIgKikoQkFTRSkpCisjZGVmaW5lIFhGU19EQV9MT0dSQU5HRShCQVNFLCBBRERSLCBTSVpFKQlcCisJCSh1aW50KShYRlNfREFfTE9HT0ZGKEJBU0UsIEFERFIpKSwgXAorCQkodWludCkoWEZTX0RBX0xPR09GRihCQVNFLCBBRERSKSsoU0laRSktMSkKKworCisjaWZkZWYgX19LRVJORUxfXworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIHRoZSBrZXJuZWwuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgKiBSb3V0aW5lcyB1c2VkIGZvciBncm93aW5nIHRoZSBCdHJlZS4KKyAqLworaW50CXhmc19kYV9ub2RlX2NyZWF0ZSh4ZnNfZGFfYXJnc190ICphcmdzLCB4ZnNfZGFibGtfdCBibGtubywgaW50IGxldmVsLAorCQkJCQkgeGZzX2RhYnVmX3QgKipicHAsIGludCB3aGljaGZvcmspOworaW50CXhmc19kYV9zcGxpdCh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUpOworCisvKgorICogUm91dGluZXMgdXNlZCBmb3Igc2hyaW5raW5nIHRoZSBCdHJlZS4KKyAqLworaW50CXhmc19kYV9qb2luKHhmc19kYV9zdGF0ZV90ICpzdGF0ZSk7Cit2b2lkCXhmc19kYV9maXhoYXNocGF0aCh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUsCisJCQkJCSAgeGZzX2RhX3N0YXRlX3BhdGhfdCAqcGF0aF90b190b19maXgpOworCisvKgorICogUm91dGluZXMgdXNlZCBmb3IgZmluZGluZyB0aGluZ3MgaW4gdGhlIEJ0cmVlLgorICovCitpbnQJeGZzX2RhX25vZGVfbG9va3VwX2ludCh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUsIGludCAqcmVzdWx0KTsKK2ludAl4ZnNfZGFfcGF0aF9zaGlmdCh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUsIHhmc19kYV9zdGF0ZV9wYXRoX3QgKnBhdGgsCisJCQkJCSBpbnQgZm9yd2FyZCwgaW50IHJlbGVhc2UsIGludCAqcmVzdWx0KTsKKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICovCitpbnQJeGZzX2RhX2Jsa191bmxpbmsoeGZzX2RhX3N0YXRlX3QgKnN0YXRlLCB4ZnNfZGFfc3RhdGVfYmxrX3QgKmRyb3BfYmxrLAorCQkJCQkgeGZzX2RhX3N0YXRlX2Jsa190ICpzYXZlX2Jsayk7CitpbnQJeGZzX2RhX2Jsa19saW5rKHhmc19kYV9zdGF0ZV90ICpzdGF0ZSwgeGZzX2RhX3N0YXRlX2Jsa190ICpvbGRfYmxrLAorCQkJCSAgICAgICB4ZnNfZGFfc3RhdGVfYmxrX3QgKm5ld19ibGspOworCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqLworaW50CXhmc19kYV9ncm93X2lub2RlKHhmc19kYV9hcmdzX3QgKmFyZ3MsIHhmc19kYWJsa190ICpuZXdfYmxrbm8pOworaW50CXhmc19kYV9nZXRfYnVmKHN0cnVjdCB4ZnNfdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgeGZzX2lub2RlICpkcCwKKwkJCSAgICAgIHhmc19kYWJsa190IGJubywgeGZzX2RhZGRyX3QgbWFwcGVkYm5vLAorCQkJICAgICAgeGZzX2RhYnVmX3QgKipicCwgaW50IHdoaWNoZm9yayk7CitpbnQJeGZzX2RhX3JlYWRfYnVmKHN0cnVjdCB4ZnNfdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgeGZzX2lub2RlICpkcCwKKwkJCSAgICAgICB4ZnNfZGFibGtfdCBibm8sIHhmc19kYWRkcl90IG1hcHBlZGJubywKKwkJCSAgICAgICB4ZnNfZGFidWZfdCAqKmJwcCwgaW50IHdoaWNoZm9yayk7Cit4ZnNfZGFkZHJfdAl4ZnNfZGFfcmVhZGFfYnVmKHN0cnVjdCB4ZnNfdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgeGZzX2lub2RlICpkcCwKKwkJCXhmc19kYWJsa190IGJubywgaW50IHdoaWNoZm9yayk7CitpbnQJeGZzX2RhX3Nocmlua19pbm9kZSh4ZnNfZGFfYXJnc190ICphcmdzLCB4ZnNfZGFibGtfdCBkZWFkX2Jsa25vLAorCQkJCQkgIHhmc19kYWJ1Zl90ICpkZWFkX2J1Zik7CisKK3VpbnQgeGZzX2RhX2hhc2huYW1lKHVjaGFyX3QgKm5hbWVfc3RyaW5nLCBpbnQgbmFtZV9sZW5ndGgpOwordWludCB4ZnNfZGFfbG9nMl9yb3VuZHVwKHVpbnQgaSk7Cit4ZnNfZGFfc3RhdGVfdCAqeGZzX2RhX3N0YXRlX2FsbG9jKHZvaWQpOwordm9pZCB4ZnNfZGFfc3RhdGVfZnJlZSh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUpOwordm9pZCB4ZnNfZGFfc3RhdGVfa2lsbF9hbHRwYXRoKHhmc19kYV9zdGF0ZV90ICpzdGF0ZSk7CisKK3ZvaWQgeGZzX2RhX2J1Zl9kb25lKHhmc19kYWJ1Zl90ICpkYWJ1Zik7Cit2b2lkIHhmc19kYV9sb2dfYnVmKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCB4ZnNfZGFidWZfdCAqZGFidWYsIHVpbnQgZmlyc3QsCisJCQkgICB1aW50IGxhc3QpOwordm9pZCB4ZnNfZGFfYnJlbHNlKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCB4ZnNfZGFidWZfdCAqZGFidWYpOwordm9pZCB4ZnNfZGFfYmludmFsKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCB4ZnNfZGFidWZfdCAqZGFidWYpOworeGZzX2RhZGRyX3QgeGZzX2RhX2Jsa25vKHhmc19kYWJ1Zl90ICpkYWJ1Zik7CisKK2V4dGVybiBzdHJ1Y3Qga21lbV96b25lICp4ZnNfZGFfc3RhdGVfem9uZTsKKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZgkvKiBfX1hGU19EQV9CVFJFRV9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGZyYWcuYyBiL2ZzL3hmcy94ZnNfZGZyYWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGQ1NTFhCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19kZnJhZy5jCkBAIC0wLDAgKzEsMzg3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisjaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc190eXBlcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19hZy5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2JtYXAuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2l0YWJsZS5oIgorI2luY2x1ZGUgInhmc19kZnJhZy5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorI2luY2x1ZGUgInhmc19tYWMuaCIKKyNpbmNsdWRlICJ4ZnNfcncuaCIKKworLyoKKyAqIFN5c3NnaSBpbnRlcmZhY2UgZm9yIHN3YXBleHQKKyAqLworaW50Cit4ZnNfc3dhcGV4dCgKKwl4ZnNfc3dhcGV4dF90CV9fdXNlciAqc3hwKQoreworCXhmc19zd2FwZXh0X3QJc3g7CisJeGZzX2lub2RlX3QgICAgICppcD1OVUxMLCAqdGlwPU5VTEwsICppcHNbMl07CisJeGZzX3RyYW5zX3QgICAgICp0cDsKKwl4ZnNfbW91bnRfdCAgICAgKm1wOworCXhmc19ic3RhdF90CSpzYnA7CisJc3RydWN0IGZpbGUJKmZwID0gTlVMTCwgKnRmcCA9IE5VTEw7CisJdm5vZGVfdAkJKnZwLCAqdHZwOworCWJodl9kZXNjX3QgICAgICAqYmRwLCAqdGJkcDsKKwl2bl9iaHZfaGVhZF90ICAgKmJocCwgKnRiaHA7CisJdWludAkJbG9ja19mbGFncz0wOworCWludAkJaWxmX2ZpZWxkcywgdGlsZl9maWVsZHM7CisJaW50CQllcnJvciA9IDA7CisJeGZzX2lmb3JrX3QJdGVtcGlmLCAqaWZwLCAqdGlmcDsKKwlfX3VpbnQ2NF90CXRtcDsKKwlpbnQJCWFmb3JrYmxrcyA9IDA7CisJaW50CQl0YWZvcmtibGtzID0gMDsKKwlpbnQJCWxvY2tlZCA9IDA7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJnN4LCBzeHAsIHNpemVvZihzeCkpKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVGQVVMVCk7CisKKwkvKiBQdWxsIGluZm9ybWF0aW9uIGZvciB0aGUgdGFyZ2V0IGZkICovCisJaWYgKCgoZnAgPSBmZ2V0KChpbnQpc3guc3hfZmR0YXJnZXQpKSA9PSBOVUxMKSB8fAorCSAgICAoKHZwID0gTElOVkZTX0dFVF9WUChmcC0+Zl9kZW50cnktPmRfaW5vZGUpKSA9PSBOVUxMKSkgIHsKKwkJZXJyb3IgPSBYRlNfRVJST1IoRUlOVkFMKTsKKwkJZ290byBlcnJvcjA7CisJfQorCisJYmhwID0gVk5fQkhWX0hFQUQodnApOworCWJkcCA9IHZuX2Jodl9sb29rdXAoYmhwLCAmeGZzX3Zub2Rlb3BzKTsKKwlpZiAoYmRwID09IE5VTEwpIHsKKwkJZXJyb3IgPSBYRlNfRVJST1IoRUJBREYpOworCQlnb3RvIGVycm9yMDsKKwl9IGVsc2UgeworCQlpcCA9IFhGU19CSFZUT0koYmRwKTsKKwl9CisKKwlpZiAoKCh0ZnAgPSBmZ2V0KChpbnQpc3guc3hfZmR0bXApKSA9PSBOVUxMKSB8fAorCSAgICAoKHR2cCA9IExJTlZGU19HRVRfVlAodGZwLT5mX2RlbnRyeS0+ZF9pbm9kZSkpID09IE5VTEwpKSB7CisJCWVycm9yID0gWEZTX0VSUk9SKEVJTlZBTCk7CisJCWdvdG8gZXJyb3IwOworCX0KKworCXRiaHAgPSBWTl9CSFZfSEVBRCh0dnApOworCXRiZHAgPSB2bl9iaHZfbG9va3VwKHRiaHAsICZ4ZnNfdm5vZGVvcHMpOworCWlmICh0YmRwID09IE5VTEwpIHsKKwkJZXJyb3IgPSBYRlNfRVJST1IoRUJBREYpOworCQlnb3RvIGVycm9yMDsKKwl9IGVsc2UgeworCQl0aXAgPSBYRlNfQkhWVE9JKHRiZHApOworCX0KKworCWlmIChpcC0+aV9tb3VudCAhPSB0aXAtPmlfbW91bnQpIHsKKwkJZXJyb3IgPSAgWEZTX0VSUk9SKEVJTlZBTCk7CisJCWdvdG8gZXJyb3IwOworCX0KKworCWlmIChpcC0+aV9pbm8gPT0gdGlwLT5pX2lubykgeworCQllcnJvciA9ICBYRlNfRVJST1IoRUlOVkFMKTsKKwkJZ290byBlcnJvcjA7CisJfQorCisJbXAgPSBpcC0+aV9tb3VudDsKKworCXNicCA9ICZzeC5zeF9zdGF0OworCisJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKSB7CisJCWVycm9yID0gIFhGU19FUlJPUihFSU8pOworCQlnb3RvIGVycm9yMDsKKwl9CisKKwlsb2NrZWQgPSAxOworCisJLyogTG9jayBpbiBpX2lubyBvcmRlciAqLworCWlmIChpcC0+aV9pbm8gPCB0aXAtPmlfaW5vKSB7CisJCWlwc1swXSA9IGlwOworCQlpcHNbMV0gPSB0aXA7CisJfSBlbHNlIHsKKwkJaXBzWzBdID0gdGlwOworCQlpcHNbMV0gPSBpcDsKKwl9CisJbG9ja19mbGFncyA9IFhGU19JTE9DS19FWENMIHwgWEZTX0lPTE9DS19FWENMOworCXhmc19sb2NrX2lub2RlcyhpcHMsIDIsIDAsIGxvY2tfZmxhZ3MpOworCisJLyogQ2hlY2sgcGVybWlzc2lvbnMgKi8KKwllcnJvciA9IHhmc19pYWNjZXNzKGlwLCBTX0lXVVNSLCBOVUxMKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyb3IwOworCisJZXJyb3IgPSB4ZnNfaWFjY2Vzcyh0aXAsIFNfSVdVU1IsIE5VTEwpOworCWlmIChlcnJvcikKKwkJZ290byBlcnJvcjA7CisKKwkvKiBWZXJpZnkgdGhhdCBib3RoIGZpbGVzIGhhdmUgdGhlIHNhbWUgZm9ybWF0ICovCisJaWYgKChpcC0+aV9kLmRpX21vZGUgJiBTX0lGTVQpICE9ICh0aXAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSkgeworCQllcnJvciA9IFhGU19FUlJPUihFSU5WQUwpOworCQlnb3RvIGVycm9yMDsKKwl9CisKKwkvKiBWZXJpZnkgYm90aCBmaWxlcyBhcmUgZWl0aGVyIHJlYWwtdGltZSBvciBub24tcmVhbHRpbWUgKi8KKwlpZiAoKGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FKSAhPQorCSAgICAodGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JFQUxUSU1FKSkgeworCQllcnJvciA9IFhGU19FUlJPUihFSU5WQUwpOworCQlnb3RvIGVycm9yMDsKKwl9CisKKwkvKiBTaG91bGQgbmV2ZXIgZ2V0IGEgbG9jYWwgZm9ybWF0ICovCisJaWYgKGlwLT5pX2QuZGlfZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0xPQ0FMIHx8CisJICAgIHRpcC0+aV9kLmRpX2Zvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9MT0NBTCkgeworCQllcnJvciA9IFhGU19FUlJPUihFSU5WQUwpOworCQlnb3RvIGVycm9yMDsKKwl9CisKKwlpZiAoVk5fQ0FDSEVEKHR2cCkgIT0gMCkKKwkJeGZzX2ludmFsX2NhY2hlZF9wYWdlcyhYRlNfSVRPVih0aXApLCAmKHRpcC0+aV9pb2NvcmUpLAorCQkJCQkJKGxvZmZfdCkwLCAwLCAwKTsKKworCS8qIFZlcmlmeSBPX0RJUkVDVCBmb3IgZnRtcCAqLworCWlmIChWTl9DQUNIRUQodHZwKSAhPSAwKSB7CisJCWVycm9yID0gWEZTX0VSUk9SKEVJTlZBTCk7CisJCWdvdG8gZXJyb3IwOworCX0KKworCS8qIFZlcmlmeSBhbGwgZGF0YSBhcmUgYmVpbmcgc3dhcHBlZCAqLworCWlmIChzeC5zeF9vZmZzZXQgIT0gMCB8fAorCSAgICBzeC5zeF9sZW5ndGggIT0gaXAtPmlfZC5kaV9zaXplIHx8CisJICAgIHN4LnN4X2xlbmd0aCAhPSB0aXAtPmlfZC5kaV9zaXplKSB7CisJCWVycm9yID0gWEZTX0VSUk9SKEVGQVVMVCk7CisJCWdvdG8gZXJyb3IwOworCX0KKworCS8qCisJICogSWYgdGhlIHRhcmdldCBoYXMgZXh0ZW5kZWQgYXR0cmlidXRlcywgdGhlIHRtcCBmaWxlCisJICogbXVzdCBhbHNvIGluIG9yZGVyIHRvIGVuc3VyZSB0aGUgY29ycmVjdCBkYXRhIGZvcmsKKwkgKiBmb3JtYXQuCisJICovCisJaWYgKCBYRlNfSUZPUktfUShpcCkgIT0gWEZTX0lGT1JLX1EodGlwKSApIHsKKwkJZXJyb3IgPSBYRlNfRVJST1IoRUlOVkFMKTsKKwkJZ290byBlcnJvcjA7CisJfQorCisJLyoKKwkgKiBDb21wYXJlIHRoZSBjdXJyZW50IGNoYW5nZSAmIG1vZGlmeSB0aW1lcyB3aXRoIHRoYXQKKwkgKiBwYXNzZWQgaW4uICBJZiB0aGV5IGRpZmZlciwgd2UgYWJvcnQgdGhpcyBzd2FwLgorCSAqIFRoaXMgaXMgdGhlIG1lY2hhbmlzbSB1c2VkIHRvIGVuc3VyZSB0aGUgY2FsbGluZworCSAqIHByb2Nlc3MgdGhhdCB0aGUgZmlsZSB3YXMgbm90IGNoYW5nZWQgb3V0IGZyb20KKwkgKiB1bmRlciBpdC4KKwkgKi8KKwlpZiAoKHNicC0+YnNfY3RpbWUudHZfc2VjICE9IGlwLT5pX2QuZGlfY3RpbWUudF9zZWMpIHx8CisJICAgIChzYnAtPmJzX2N0aW1lLnR2X25zZWMgIT0gaXAtPmlfZC5kaV9jdGltZS50X25zZWMpIHx8CisJICAgIChzYnAtPmJzX210aW1lLnR2X3NlYyAhPSBpcC0+aV9kLmRpX210aW1lLnRfc2VjKSB8fAorCSAgICAoc2JwLT5ic19tdGltZS50dl9uc2VjICE9IGlwLT5pX2QuZGlfbXRpbWUudF9uc2VjKSkgeworCQllcnJvciA9IFhGU19FUlJPUihFQlVTWSk7CisJCWdvdG8gZXJyb3IwOworCX0KKworCS8qIFdlIG5lZWQgdG8gZmFpbCBpZiB0aGUgZmlsZSBpcyBtZW1vcnkgbWFwcGVkLiAgT25jZSB3ZSBoYXZlIHRvc3NlZAorCSAqIGFsbCBleGlzdGluZyBwYWdlcywgdGhlIHBhZ2UgZmF1bHQgd2lsbCBoYXZlIG5vIG9wdGlvbgorCSAqIGJ1dCB0byBnbyB0byB0aGUgZmlsZXN5c3RlbSBmb3IgcGFnZXMuIEJ5IG1ha2luZyB0aGUgcGFnZSBmYXVsdCBjYWxsCisJICogVk9QX1JFQUQgKG9yIHdyaXRlIGluIHRoZSBjYXNlIG9mIGF1dG9ncm93KSB0aGV5IGJsb2NrIG9uIHRoZSBpb2xvY2sKKwkgKiB1bnRpbCB3ZSBoYXZlIHN3aXRjaGVkIHRoZSBleHRlbnRzLgorCSAqLworCWlmIChWTl9NQVBQRUQodnApKSB7CisJCWVycm9yID0gWEZTX0VSUk9SKEVCVVNZKTsKKwkJZ290byBlcnJvcjA7CisJfQorCisJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwl4ZnNfaXVubG9jayh0aXAsIFhGU19JTE9DS19FWENMKTsKKworCS8qCisJICogVGhlcmUgaXMgYSByYWNlIGNvbmRpdGlvbiBoZXJlIHNpbmNlIHdlIGdhdmUgdXAgdGhlCisJICogaWxvY2suICBIb3dldmVyLCB0aGUgZGF0YSBmb3JrIHdpbGwgbm90IGNoYW5nZSBzaW5jZQorCSAqIHdlIGhhdmUgdGhlIGlvbG9jayAobG9ja2VkIGZvciB0cnVuY2F0aW9uIHRvbykgc28gd2UKKwkgKiBhcmUgc2FmZS4gIFdlIGRvbid0IHJlYWxseSBjYXJlIGlmIG5vbi1pbyByZWxhdGVkCisJICogZmllbGRzIGNoYW5nZS4KKwkgKi8KKworCVZPUF9UT1NTX1BBR0VTKHZwLCAwLCAtMSwgRklfUkVNQVBGKTsKKworCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfU1dBUEVYVCk7CisJaWYgKChlcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCAwLAorCQkJCSAgICAgWEZTX0lDSEFOR0VfTE9HX1JFUyhtcCksIDAsCisJCQkJICAgICAwLCAwKSkpIHsKKwkJeGZzX2l1bmxvY2soaXAsICBYRlNfSU9MT0NLX0VYQ0wpOworCQl4ZnNfaXVubG9jayh0aXAsIFhGU19JT0xPQ0tfRVhDTCk7CisJCXhmc190cmFuc19jYW5jZWwodHAsIDApOworCQlyZXR1cm4gZXJyb3I7CisJfQorCXhmc19sb2NrX2lub2RlcyhpcHMsIDIsIDAsIFhGU19JTE9DS19FWENMKTsKKworCS8qCisJICogQ291bnQgdGhlIG51bWJlciBvZiBleHRlbmRlZCBhdHRyaWJ1dGUgYmxvY2tzCisJICovCisJaWYgKCAoKFhGU19JRk9SS19RKGlwKSAhPSAwKSAmJiAoaXAtPmlfZC5kaV9hbmV4dGVudHMgPiAwKSkgJiYKKwkgICAgIChpcC0+aV9kLmRpX2Fmb3JtYXQgIT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpKSB7CisJCWVycm9yID0geGZzX2JtYXBfY291bnRfYmxvY2tzKHRwLCBpcCwgWEZTX0FUVFJfRk9SSywgJmFmb3JrYmxrcyk7CisJCWlmIChlcnJvcikgeworCQkJeGZzX2l1bmxvY2soaXAsICBsb2NrX2ZsYWdzKTsKKwkJCXhmc19pdW5sb2NrKHRpcCwgbG9ja19mbGFncyk7CisJCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCAwKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCX0KKwlpZiAoICgoWEZTX0lGT1JLX1EodGlwKSAhPSAwKSAmJiAodGlwLT5pX2QuZGlfYW5leHRlbnRzID4gMCkpICYmCisJICAgICAodGlwLT5pX2QuZGlfYWZvcm1hdCAhPSBYRlNfRElOT0RFX0ZNVF9MT0NBTCkpIHsKKwkJZXJyb3IgPSB4ZnNfYm1hcF9jb3VudF9ibG9ja3ModHAsIHRpcCwgWEZTX0FUVFJfRk9SSywKKwkJCSZ0YWZvcmtibGtzKTsKKwkJaWYgKGVycm9yKSB7CisJCQl4ZnNfaXVubG9jayhpcCwgIGxvY2tfZmxhZ3MpOworCQkJeGZzX2l1bmxvY2sodGlwLCBsb2NrX2ZsYWdzKTsKKwkJCXhmc190cmFuc19jYW5jZWwodHAsIDApOworCQkJcmV0dXJuIGVycm9yOworCQl9CisJfQorCisJLyoKKwkgKiBTd2FwIHRoZSBkYXRhIGZvcmtzIG9mIHRoZSBpbm9kZXMKKwkgKi8KKwlpZnAgPSAmaXAtPmlfZGY7CisJdGlmcCA9ICZ0aXAtPmlfZGY7CisJdGVtcGlmID0gKmlmcDsJLyogc3RydWN0IGNvcHkgKi8KKwkqaWZwID0gKnRpZnA7CS8qIHN0cnVjdCBjb3B5ICovCisJKnRpZnAgPSB0ZW1waWY7CS8qIHN0cnVjdCBjb3B5ICovCisKKwkvKgorCSAqIEZpeCB0aGUgb24tZGlzayBpbm9kZSB2YWx1ZXMKKwkgKi8KKwl0bXAgPSAoX191aW50NjRfdClpcC0+aV9kLmRpX25ibG9ja3M7CisJaXAtPmlfZC5kaV9uYmxvY2tzID0gdGlwLT5pX2QuZGlfbmJsb2NrcyAtIHRhZm9ya2Jsa3MgKyBhZm9ya2Jsa3M7CisJdGlwLT5pX2QuZGlfbmJsb2NrcyA9IHRtcCArIHRhZm9ya2Jsa3MgLSBhZm9ya2Jsa3M7CisKKwl0bXAgPSAoX191aW50NjRfdCkgaXAtPmlfZC5kaV9uZXh0ZW50czsKKwlpcC0+aV9kLmRpX25leHRlbnRzID0gdGlwLT5pX2QuZGlfbmV4dGVudHM7CisJdGlwLT5pX2QuZGlfbmV4dGVudHMgPSB0bXA7CisKKwl0bXAgPSAoX191aW50NjRfdCkgaXAtPmlfZC5kaV9mb3JtYXQ7CisJaXAtPmlfZC5kaV9mb3JtYXQgPSB0aXAtPmlfZC5kaV9mb3JtYXQ7CisJdGlwLT5pX2QuZGlfZm9ybWF0ID0gdG1wOworCisJaWxmX2ZpZWxkcyA9IFhGU19JTE9HX0NPUkU7CisKKwlzd2l0Y2goaXAtPmlfZC5kaV9mb3JtYXQpIHsKKwljYXNlIFhGU19ESU5PREVfRk1UX0VYVEVOVFM6CisJCS8qIElmIHRoZSBleHRlbnRzIGZpdCBpbiB0aGUgaW5vZGUsIGZpeCB0aGUKKwkJICogcG9pbnRlci4gIE90aGVyd2lzZSBpdCdzIGFscmVhZHkgTlVMTCBvcgorCQkgKiBwb2ludGluZyB0byB0aGUgZXh0ZW50LgorCQkgKi8KKwkJaWYgKGlwLT5pX2QuZGlfbmV4dGVudHMgPD0gWEZTX0lOTElORV9FWFRTKSB7CisJCQlpZnAtPmlmX3UxLmlmX2V4dGVudHMgPQorCQkJCWlmcC0+aWZfdTIuaWZfaW5saW5lX2V4dDsKKwkJfQorCQlpbGZfZmllbGRzIHw9IFhGU19JTE9HX0RFWFQ7CisJCWJyZWFrOworCWNhc2UgWEZTX0RJTk9ERV9GTVRfQlRSRUU6CisJCWlsZl9maWVsZHMgfD0gWEZTX0lMT0dfREJST09UOworCQlicmVhazsKKwl9CisKKwl0aWxmX2ZpZWxkcyA9IFhGU19JTE9HX0NPUkU7CisKKwlzd2l0Y2godGlwLT5pX2QuZGlfZm9ybWF0KSB7CisJY2FzZSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTOgorCQkvKiBJZiB0aGUgZXh0ZW50cyBmaXQgaW4gdGhlIGlub2RlLCBmaXggdGhlCisJCSAqIHBvaW50ZXIuICBPdGhlcndpc2UgaXQncyBhbHJlYWR5IE5VTEwgb3IKKwkJICogcG9pbnRpbmcgdG8gdGhlIGV4dGVudC4KKwkJICovCisJCWlmICh0aXAtPmlfZC5kaV9uZXh0ZW50cyA8PSBYRlNfSU5MSU5FX0VYVFMpIHsKKwkJCXRpZnAtPmlmX3UxLmlmX2V4dGVudHMgPQorCQkJCXRpZnAtPmlmX3UyLmlmX2lubGluZV9leHQ7CisJCX0KKwkJdGlsZl9maWVsZHMgfD0gWEZTX0lMT0dfREVYVDsKKwkJYnJlYWs7CisJY2FzZSBYRlNfRElOT0RFX0ZNVF9CVFJFRToKKwkJdGlsZl9maWVsZHMgfD0gWEZTX0lMT0dfREJST09UOworCQlicmVhazsKKwl9CisKKwkvKgorCSAqIEluY3JlbWVudCB2bm9kZSByZWYgY291bnRzIHNpbmNlIHhmc190cmFuc19jb21taXQgJgorCSAqIHhmc190cmFuc19jYW5jZWwgd2lsbCBib3RoIHVubG9jayB0aGUgaW5vZGVzIGFuZAorCSAqIGRlY3JlbWVudCB0aGUgYXNzb2NpYXRlZCByZWYgY291bnRzLgorCSAqLworCVZOX0hPTEQodnApOworCVZOX0hPTEQodHZwKTsKKworCXhmc190cmFuc19pam9pbih0cCwgaXAsIGxvY2tfZmxhZ3MpOworCXhmc190cmFuc19pam9pbih0cCwgdGlwLCBsb2NrX2ZsYWdzKTsKKworCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLCAgaWxmX2ZpZWxkcyk7CisJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgdGlwLCB0aWxmX2ZpZWxkcyk7CisKKwkvKgorCSAqIElmIHRoaXMgaXMgYSBzeW5jaHJvbm91cyBtb3VudCwgbWFrZSBzdXJlIHRoYXQgdGhlCisJICogdHJhbnNhY3Rpb24gZ29lcyB0byBkaXNrIGJlZm9yZSByZXR1cm5pbmcgdG8gdGhlIHVzZXIuCisJICovCisJaWYgKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX1dTWU5DKSB7CisJCXhmc190cmFuc19zZXRfc3luYyh0cCk7CisJfQorCisJZXJyb3IgPSB4ZnNfdHJhbnNfY29tbWl0KHRwLCBYRlNfVFJBTlNfU1dBUEVYVCwgTlVMTCk7CisKKwlmcHV0KGZwKTsKKwlmcHV0KHRmcCk7CisKKwlyZXR1cm4gZXJyb3I7CisKKyBlcnJvcjA6CisJaWYgKGxvY2tlZCkgeworCQl4ZnNfaXVubG9jayhpcCwgIGxvY2tfZmxhZ3MpOworCQl4ZnNfaXVubG9jayh0aXAsIGxvY2tfZmxhZ3MpOworCX0KKworCWlmIChmcCAhPSBOVUxMKSBmcHV0KGZwKTsKKwlpZiAodGZwICE9IE5VTEwpIGZwdXQodGZwKTsKKworCXJldHVybiBlcnJvcjsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGZyYWcuaCBiL2ZzL3hmcy94ZnNfZGZyYWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDQ4NjA1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19kZnJhZy5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19ERlJBR19IX18KKyNkZWZpbmUJX19YRlNfREZSQUdfSF9fCisKKy8qCisgKiBTdHJ1Y3R1cmUgcGFzc2VkIHRvIHhmc19zd2FwZXh0CisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeGZzX3N3YXBleHQKK3sKKwlfX2ludDY0X3QJc3hfdmVyc2lvbjsJLyogdmVyc2lvbiAqLworCV9faW50NjRfdAlzeF9mZHRhcmdldDsJLyogZmQgb2YgdGFyZ2V0IGZpbGUgKi8KKwlfX2ludDY0X3QJc3hfZmR0bXA7CS8qIGZkIG9mIHRtcCBmaWxlICovCisJeGZzX29mZl90CXN4X29mZnNldDsJLyogb2Zmc2V0IGludG8gZmlsZSAqLworCXhmc19vZmZfdAlzeF9sZW5ndGg7CS8qIGxlbmcgZnJvbSBvZmZzZXQgKi8KKwljaGFyCQlzeF9wYWRbMTZdOwkvKiBwYWQgc3BhY2UsIHVudXNlZCAqLworCXhmc19ic3RhdF90CXN4X3N0YXQ7CS8qIHN0YXQgb2YgdGFyZ2V0IGI0IGNvcHkgKi8KK30geGZzX3N3YXBleHRfdDsKKworLyoKKyAqIFZlcnNpb24gZmxhZworICovCisjZGVmaW5lIFhGU19TWF9WRVJTSU9OCQkwCisKKyNpZmRlZiBfX0tFUk5FTF9fCisvKgorICogUHJvdG90eXBlcyBmb3IgdmlzaWJsZSB4ZnNfZGZyYWcuYyByb3V0aW5lcy4KKyAqLworCisvKgorICogU3lzY2FsbCBpbnRlcmZhY2UgZm9yIHhmc19zd2FwZXh0CisgKi8KK2ludAl4ZnNfc3dhcGV4dChzdHJ1Y3QgeGZzX3N3YXBleHQgX191c2VyICpzeCk7CisKKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZgkvKiBfX1hGU19ERlJBR19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGlub2RlLmggYi9mcy94ZnMveGZzX2Rpbm9kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YzkzMmIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2Rpbm9kZS5oCkBAIC0wLDAgKzEsNDE4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfRElOT0RFX0hfXworI2RlZmluZQlfX1hGU19ESU5PREVfSF9fCisKK3N0cnVjdCB4ZnNfYnVmOworc3RydWN0IHhmc19tb3VudDsKKworI2RlZmluZQlYRlNfRElOT0RFX1ZFUlNJT05fMQkxCisjZGVmaW5lCVhGU19ESU5PREVfVkVSU0lPTl8yCTIKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJTk9ERV9HT09EX1ZFUlNJT04pCitpbnQgeGZzX2Rpbm9kZV9nb29kX3ZlcnNpb24oaW50IHYpOworI2RlZmluZSBYRlNfRElOT0RFX0dPT0RfVkVSU0lPTih2KQl4ZnNfZGlub2RlX2dvb2RfdmVyc2lvbih2KQorI2Vsc2UKKyNkZWZpbmUgWEZTX0RJTk9ERV9HT09EX1ZFUlNJT04odikJKCgodikgPT0gWEZTX0RJTk9ERV9WRVJTSU9OXzEpIHx8IFwKKwkJCQkJICgodikgPT0gWEZTX0RJTk9ERV9WRVJTSU9OXzIpKQorI2VuZGlmCisjZGVmaW5lCVhGU19ESU5PREVfTUFHSUMJMHg0OTRlCS8qICdJTicgKi8KKworLyoKKyAqIERpc2sgaW5vZGUgc3RydWN0dXJlLgorICogVGhpcyBpcyBqdXN0IHRoZSBoZWFkZXI7IHRoZSBpbm9kZSBpcyBleHBhbmRlZCB0byBmaWxsIGEgdmFyaWFibGUgc2l6ZQorICogd2l0aCB0aGUgbGFzdCBmaWVsZCBleHBhbmRpbmcuICBJdCBpcyBzcGxpdCBpbnRvIHRoZSBjb3JlIGFuZCAib3RoZXIiCisgKiBiZWNhdXNlIHdlIG9ubHkgbmVlZCB0aGUgY29yZSBwYXJ0IGluIHRoZSBpbi1jb3JlIGlub2RlLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfdGltZXN0YW1wIHsKKwlfX2ludDMyX3QJdF9zZWM7CQkvKiB0aW1lc3RhbXAgc2Vjb25kcyAqLworCV9faW50MzJfdAl0X25zZWM7CQkvKiB0aW1lc3RhbXAgbmFub3NlY29uZHMgKi8KK30geGZzX3RpbWVzdGFtcF90OworCisvKgorICogTm90ZTogQ29vcmRpbmF0ZSBjaGFuZ2VzIHRvIHRoaXMgc3RydWN0dXJlIHdpdGggdGhlIFhGU19ESV8qICNkZWZpbmVzCisgKiBiZWxvdyBhbmQgdGhlIG9mZnNldHMgdGFibGUgaW4geGZzX2lhbGxvY19sb2dfZGkoKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2Rpbm9kZV9jb3JlCit7CisJX191aW50MTZfdAlkaV9tYWdpYzsJLyogaW5vZGUgbWFnaWMgIyA9IFhGU19ESU5PREVfTUFHSUMgKi8KKwlfX3VpbnQxNl90CWRpX21vZGU7CS8qIG1vZGUgYW5kIHR5cGUgb2YgZmlsZSAqLworCV9faW50OF90CWRpX3ZlcnNpb247CS8qIGlub2RlIHZlcnNpb24gKi8KKwlfX2ludDhfdAlkaV9mb3JtYXQ7CS8qIGZvcm1hdCBvZiBkaV9jIGRhdGEgKi8KKwlfX3VpbnQxNl90CWRpX29ubGluazsJLyogb2xkIG51bWJlciBvZiBsaW5rcyB0byBmaWxlICovCisJX191aW50MzJfdAlkaV91aWQ7CQkvKiBvd25lcidzIHVzZXIgaWQgKi8KKwlfX3VpbnQzMl90CWRpX2dpZDsJCS8qIG93bmVyJ3MgZ3JvdXAgaWQgKi8KKwlfX3VpbnQzMl90CWRpX25saW5rOwkvKiBudW1iZXIgb2YgbGlua3MgdG8gZmlsZSAqLworCV9fdWludDE2X3QJZGlfcHJvamlkOwkvKiBvd25lcidzIHByb2plY3QgaWQgKi8KKwlfX3VpbnQ4X3QJZGlfcGFkWzhdOwkvKiB1bnVzZWQsIHplcm9lZCBzcGFjZSAqLworCV9fdWludDE2X3QJZGlfZmx1c2hpdGVyOwkvKiBpbmNyZW1lbnRlZCBvbiBmbHVzaCAqLworCXhmc190aW1lc3RhbXBfdAlkaV9hdGltZTsJLyogdGltZSBsYXN0IGFjY2Vzc2VkICovCisJeGZzX3RpbWVzdGFtcF90CWRpX210aW1lOwkvKiB0aW1lIGxhc3QgbW9kaWZpZWQgKi8KKwl4ZnNfdGltZXN0YW1wX3QJZGlfY3RpbWU7CS8qIHRpbWUgY3JlYXRlZC9pbm9kZSBtb2RpZmllZCAqLworCXhmc19mc2l6ZV90CWRpX3NpemU7CS8qIG51bWJlciBvZiBieXRlcyBpbiBmaWxlICovCisJeGZzX2RyZnNibm9fdAlkaV9uYmxvY2tzOwkvKiAjIG9mIGRpcmVjdCAmIGJ0cmVlIGJsb2NrcyB1c2VkICovCisJeGZzX2V4dGxlbl90CWRpX2V4dHNpemU7CS8qIGJhc2ljL21pbmltdW0gZXh0ZW50IHNpemUgZm9yIGZpbGUgKi8KKwl4ZnNfZXh0bnVtX3QJZGlfbmV4dGVudHM7CS8qIG51bWJlciBvZiBleHRlbnRzIGluIGRhdGEgZm9yayAqLworCXhmc19hZXh0bnVtX3QJZGlfYW5leHRlbnRzOwkvKiBudW1iZXIgb2YgZXh0ZW50cyBpbiBhdHRyaWJ1dGUgZm9yayovCisJX191aW50OF90CWRpX2ZvcmtvZmY7CS8qIGF0dHIgZm9yayBvZmZzLCA8PDMgZm9yIDY0YiBhbGlnbiAqLworCV9faW50OF90CWRpX2Fmb3JtYXQ7CS8qIGZvcm1hdCBvZiBhdHRyIGZvcmsncyBkYXRhICovCisJX191aW50MzJfdAlkaV9kbWV2bWFzazsJLyogRE1JRyBldmVudCBtYXNrICovCisJX191aW50MTZfdAlkaV9kbXN0YXRlOwkvKiBETUlHIHN0YXRlIGluZm8gKi8KKwlfX3VpbnQxNl90CWRpX2ZsYWdzOwkvKiByYW5kb20gZmxhZ3MsIFhGU19ESUZMQUdfLi4uICovCisJX191aW50MzJfdAlkaV9nZW47CQkvKiBnZW5lcmF0aW9uIG51bWJlciAqLworfSB4ZnNfZGlub2RlX2NvcmVfdDsKKworI2RlZmluZSBESV9NQVhfRkxVU0ggMHhmZmZmCisKK3R5cGVkZWYgc3RydWN0IHhmc19kaW5vZGUKK3sKKwl4ZnNfZGlub2RlX2NvcmVfdAlkaV9jb3JlOworCS8qCisJICogSW4gYWRkaW5nIGFueXRoaW5nIGJldHdlZW4gdGhlIGNvcmUgYW5kIHRoZSB1bmlvbiwgYmUKKwkgKiBzdXJlIHRvIHVwZGF0ZSB0aGUgbWFjcm9zIGxpa2UgWEZTX0xJVElOTyBiZWxvdyBhbmQKKwkgKiBYRlNfQk1BUF9SQkxPQ0tfRFNJWkUgaW4geGZzX2JtYXBfYnRyZWUuaC4KKwkgKi8KKwl4ZnNfYWdpbm9fdAkJZGlfbmV4dF91bmxpbmtlZDsvKiBhZ2kgdW5saW5rZWQgbGlzdCBwdHIgKi8KKwl1bmlvbiB7CisJCXhmc19ibWRyX2Jsb2NrX3QgZGlfYm1idDsJLyogYnRyZWUgcm9vdCBibG9jayAqLworCQl4ZnNfYm1idF9yZWNfMzJfdCBkaV9ibXhbMV07CS8qIGV4dGVudCBsaXN0ICovCisJCXhmc19kaXJfc2hvcnRmb3JtX3QgZGlfZGlyc2Y7CS8qIHNob3J0Zm9ybSBkaXJlY3RvcnkgKi8KKwkJeGZzX2RpcjJfc2ZfdAlkaV9kaXIyc2Y7CS8qIHNob3J0Zm9ybSBkaXJlY3RvcnkgdjIgKi8KKwkJY2hhcgkJZGlfY1sxXTsJLyogbG9jYWwgY29udGVudHMgKi8KKwkJeGZzX2Rldl90CWRpX2RldjsJCS8qIGRldmljZSBmb3IgU19JRkNIUi9TX0lGQkxLICovCisJCXV1aWRfdAkJZGlfbXV1aWQ7CS8qIG1vdW50IHBvaW50IHZhbHVlICovCisJCWNoYXIJCWRpX3N5bWxpbmtbMV07CS8qIGxvY2FsIHN5bWJvbGljIGxpbmsgKi8KKwl9CQlkaV91OworCXVuaW9uIHsKKwkJeGZzX2JtZHJfYmxvY2tfdCBkaV9hYm1idDsJLyogYnRyZWUgcm9vdCBibG9jayAqLworCQl4ZnNfYm1idF9yZWNfMzJfdCBkaV9hYm14WzFdOwkvKiBleHRlbnQgbGlzdCAqLworCQl4ZnNfYXR0cl9zaG9ydGZvcm1fdCBkaV9hdHRyc2Y7CS8qIHNob3J0Zm9ybSBhdHRyaWJ1dGUgbGlzdCAqLworCX0JCWRpX2E7Cit9IHhmc19kaW5vZGVfdDsKKworLyoKKyAqIFRoZSAzMiBiaXQgbGluayBjb3VudCBpbiB0aGUgaW5vZGUgdGhlb3JldGljYWxseSBtYXhlcyBvdXQgYXQgVUlOVF9NQVguCisgKiBTaW5jZSB0aGUgcGF0aGNvbmYgaW50ZXJmYWNlIGlzIHNpZ25lZCwgd2UgdXNlIDJeMzEgLSAxIGluc3RlYWQuCisgKiBUaGUgb2xkIGlub2RlIGZvcm1hdCBoYWQgYSAxNiBiaXQgbGluayBjb3VudCwgc28gaXRzIG1heGltdW0gaXMgVVNIUlRfTUFYLgorICovCisjZGVmaW5lCVhGU19NQVhMSU5LCQkoKDFVIDw8IDMxKSAtIDFVKQorI2RlZmluZQlYRlNfTUFYTElOS18xCQk2NTUzNVUKKworLyoKKyAqIEJpdCBuYW1lcyBmb3IgbG9nZ2luZyBkaXNrIGlub2RlcyBvbmx5CisgKi8KKyNkZWZpbmUJWEZTX0RJX01BR0lDCQkweDAwMDAwMDEKKyNkZWZpbmUJWEZTX0RJX01PREUJCTB4MDAwMDAwMgorI2RlZmluZQlYRlNfRElfVkVSU0lPTgkJMHgwMDAwMDA0CisjZGVmaW5lCVhGU19ESV9GT1JNQVQJCTB4MDAwMDAwOAorI2RlZmluZQlYRlNfRElfT05MSU5LCQkweDAwMDAwMTAKKyNkZWZpbmUJWEZTX0RJX1VJRAkJMHgwMDAwMDIwCisjZGVmaW5lCVhGU19ESV9HSUQJCTB4MDAwMDA0MAorI2RlZmluZQlYRlNfRElfTkxJTksJCTB4MDAwMDA4MAorI2RlZmluZQlYRlNfRElfUFJPSklECQkweDAwMDAxMDAKKyNkZWZpbmUJWEZTX0RJX1BBRAkJMHgwMDAwMjAwCisjZGVmaW5lCVhGU19ESV9BVElNRQkJMHgwMDAwNDAwCisjZGVmaW5lCVhGU19ESV9NVElNRQkJMHgwMDAwODAwCisjZGVmaW5lCVhGU19ESV9DVElNRQkJMHgwMDAxMDAwCisjZGVmaW5lCVhGU19ESV9TSVpFCQkweDAwMDIwMDAKKyNkZWZpbmUJWEZTX0RJX05CTE9DS1MJCTB4MDAwNDAwMAorI2RlZmluZQlYRlNfRElfRVhUU0laRQkJMHgwMDA4MDAwCisjZGVmaW5lCVhGU19ESV9ORVhURU5UUwkJMHgwMDEwMDAwCisjZGVmaW5lCVhGU19ESV9OQUVYVEVOVFMJMHgwMDIwMDAwCisjZGVmaW5lCVhGU19ESV9GT1JLT0ZGCQkweDAwNDAwMDAKKyNkZWZpbmUJWEZTX0RJX0FGT1JNQVQJCTB4MDA4MDAwMAorI2RlZmluZQlYRlNfRElfRE1FVk1BU0sJCTB4MDEwMDAwMAorI2RlZmluZQlYRlNfRElfRE1TVEFURQkJMHgwMjAwMDAwCisjZGVmaW5lCVhGU19ESV9GTEFHUwkJMHgwNDAwMDAwCisjZGVmaW5lCVhGU19ESV9HRU4JCTB4MDgwMDAwMAorI2RlZmluZQlYRlNfRElfTkVYVF9VTkxJTktFRAkweDEwMDAwMDAKKyNkZWZpbmUJWEZTX0RJX1UJCTB4MjAwMDAwMAorI2RlZmluZQlYRlNfRElfQQkJMHg0MDAwMDAwCisjZGVmaW5lCVhGU19ESV9OVU1fQklUUwkJMjcKKyNkZWZpbmUJWEZTX0RJX0FMTF9CSVRTCQkoKDEgPDwgWEZTX0RJX05VTV9CSVRTKSAtIDEpCisjZGVmaW5lCVhGU19ESV9DT1JFX0JJVFMJKFhGU19ESV9BTExfQklUUyAmIH4oWEZTX0RJX1V8WEZTX0RJX0EpKQorCisvKgorICogVmFsdWVzIGZvciBkaV9mb3JtYXQKKyAqLwordHlwZWRlZiBlbnVtIHhmc19kaW5vZGVfZm10Cit7CisJWEZTX0RJTk9ERV9GTVRfREVWLAkJLyogQ0hSLCBCTEs6IGRpX2RldiAqLworCVhGU19ESU5PREVfRk1UX0xPQ0FMLAkJLyogRElSLCBSRUc6IGRpX2MgKi8KKwkJCQkJLyogTE5LOiBkaV9zeW1saW5rICovCisJWEZTX0RJTk9ERV9GTVRfRVhURU5UUywJCS8qIERJUiwgUkVHLCBMTks6IGRpX2JteCAqLworCVhGU19ESU5PREVfRk1UX0JUUkVFLAkJLyogRElSLCBSRUcsIExOSzogZGlfYm1idCAqLworCVhGU19ESU5PREVfRk1UX1VVSUQJCS8qIE1OVDogZGlfdXVpZCAqLworfSB4ZnNfZGlub2RlX2ZtdF90OworCisvKgorICogSW5vZGUgbWluaW11bSBhbmQgbWF4aW11bSBzaXplcy4KKyAqLworI2RlZmluZQlYRlNfRElOT0RFX01JTl9MT0cJOAorI2RlZmluZQlYRlNfRElOT0RFX01BWF9MT0cJMTEKKyNkZWZpbmUJWEZTX0RJTk9ERV9NSU5fU0laRQkoMSA8PCBYRlNfRElOT0RFX01JTl9MT0cpCisjZGVmaW5lCVhGU19ESU5PREVfTUFYX1NJWkUJKDEgPDwgWEZTX0RJTk9ERV9NQVhfTE9HKQorCisvKgorICogSW5vZGUgc2l6ZSBmb3IgZ2l2ZW4gZnMuCisgKi8KKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0xJVElOTykKK2ludCB4ZnNfbGl0aW5vKHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKKyNkZWZpbmUJWEZTX0xJVElOTyhtcCkJCXhmc19saXRpbm8obXApCisjZWxzZQorI2RlZmluZQlYRlNfTElUSU5PKG1wKQkoKG1wKS0+bV9saXRpbm8pCisjZW5kaWYKKyNkZWZpbmUJWEZTX0JST09UX1NJWkVfQURKCVwKKwkoc2l6ZW9mKHhmc19ibWJ0X2Jsb2NrX3QpIC0gc2l6ZW9mKHhmc19ibWRyX2Jsb2NrX3QpKQorCisvKgorICogRm9yayBpZGVudGlmaWVycy4gIEhlcmUgc28gdXRpbGl0aWVzIGNhbiB1c2UgdGhlbSB3aXRob3V0IGluY2x1ZGluZworICogeGZzX2lub2RlLmguCisgKi8KKyNkZWZpbmUJWEZTX0RBVEFfRk9SSwkwCisjZGVmaW5lCVhGU19BVFRSX0ZPUksJMQorCisvKgorICogSW5vZGUgZGF0YSAmIGF0dHJpYnV0ZSBmb3JrIHNpemVzLCBwZXIgaW5vZGUuCisgKi8KKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0NGT1JLX1EpCitpbnQgeGZzX2Nmb3JrX3FfZGlzayh4ZnNfZGlub2RlX2NvcmVfdCAqZGNwKTsKK2ludCB4ZnNfY2ZvcmtfcSh4ZnNfZGlub2RlX2NvcmVfdCAqZGNwKTsKKyNkZWZpbmUJWEZTX0NGT1JLX1FfRElTSyhkY3ApICAgICAgICAgICAgICAgeGZzX2Nmb3JrX3FfZGlzayhkY3ApCisjZGVmaW5lCVhGU19DRk9SS19RKGRjcCkgICAgICAgICAgICAgICAgICAgIHhmc19jZm9ya19xKGRjcCkKKyNlbHNlCisjZGVmaW5lCVhGU19DRk9SS19RX0RJU0soZGNwKQkJICAgICgoZGNwKS0+ZGlfZm9ya29mZiAhPSAwKQorI2RlZmluZSBYRlNfQ0ZPUktfUShkY3ApICAgICAgICAgICAgICAgICAgICAoKGRjcCktPmRpX2ZvcmtvZmYgIT0gMCkKKworI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19DRk9SS19CT0ZGKQoraW50IHhmc19jZm9ya19ib2ZmX2Rpc2soeGZzX2Rpbm9kZV9jb3JlX3QgKmRjcCk7CitpbnQgeGZzX2Nmb3JrX2JvZmYoeGZzX2Rpbm9kZV9jb3JlX3QgKmRjcCk7CisjZGVmaW5lCVhGU19DRk9SS19CT0ZGX0RJU0soZGNwKQkgICAgeGZzX2Nmb3JrX2JvZmZfZGlzayhkY3ApCisjZGVmaW5lCVhGU19DRk9SS19CT0ZGKGRjcCkJICAgICAgICAgICAgeGZzX2Nmb3JrX2JvZmYoZGNwKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0NGT1JLX0JPRkZfRElTSyhkY3ApCSAgICAoKGludCkoSU5UX0dFVCgoZGNwKS0+ZGlfZm9ya29mZiwgQVJDSF9DT05WRVJUKSA8PCAzKSkKKyNkZWZpbmUgWEZTX0NGT1JLX0JPRkYoZGNwKSAgICAgICAgICAgICAgICAgKChpbnQpKChkY3ApLT5kaV9mb3Jrb2ZmIDw8IDMpKQorCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0NGT1JLX0RTSVpFKQoraW50IHhmc19jZm9ya19kc2l6ZV9kaXNrKHhmc19kaW5vZGVfY29yZV90ICpkY3AsIHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKK2ludCB4ZnNfY2ZvcmtfZHNpemUoeGZzX2Rpbm9kZV9jb3JlX3QgKmRjcCwgc3RydWN0IHhmc19tb3VudCAqbXApOworI2RlZmluZQlYRlNfQ0ZPUktfRFNJWkVfRElTSyhkY3AsbXApICAgICAgICB4ZnNfY2ZvcmtfZHNpemVfZGlzayhkY3AsbXApCisjZGVmaW5lCVhGU19DRk9SS19EU0laRShkY3AsbXApICAgICAgICAgICAgIHhmc19jZm9ya19kc2l6ZShkY3AsbXApCisjZWxzZQorI2RlZmluZQlYRlNfQ0ZPUktfRFNJWkVfRElTSyhkY3AsbXApIFwKKwkoWEZTX0NGT1JLX1FfRElTSyhkY3ApID8gWEZTX0NGT1JLX0JPRkZfRElTSyhkY3ApIDogWEZTX0xJVElOTyhtcCkpCisjZGVmaW5lIFhGU19DRk9SS19EU0laRShkY3AsbXApIFwKKwkoWEZTX0NGT1JLX1EoZGNwKSA/IFhGU19DRk9SS19CT0ZGKGRjcCkgOiBYRlNfTElUSU5PKG1wKSkKKworI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19DRk9SS19BU0laRSkKK2ludCB4ZnNfY2ZvcmtfYXNpemVfZGlzayh4ZnNfZGlub2RlX2NvcmVfdCAqZGNwLCBzdHJ1Y3QgeGZzX21vdW50ICptcCk7CitpbnQgeGZzX2Nmb3JrX2FzaXplKHhmc19kaW5vZGVfY29yZV90ICpkY3AsIHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKKyNkZWZpbmUJWEZTX0NGT1JLX0FTSVpFX0RJU0soZGNwLG1wKSAgICAgICAgeGZzX2Nmb3JrX2FzaXplX2Rpc2soZGNwLG1wKQorI2RlZmluZQlYRlNfQ0ZPUktfQVNJWkUoZGNwLG1wKSAgICAgICAgICAgICB4ZnNfY2ZvcmtfYXNpemUoZGNwLG1wKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0NGT1JLX0FTSVpFX0RJU0soZGNwLG1wKSBcCisJKFhGU19DRk9SS19RX0RJU0soZGNwKSA/IFhGU19MSVRJTk8obXApIC0gWEZTX0NGT1JLX0JPRkZfRElTSyhkY3ApIDogMCkKKyNkZWZpbmUgWEZTX0NGT1JLX0FTSVpFKGRjcCxtcCkgXAorCShYRlNfQ0ZPUktfUShkY3ApID8gWEZTX0xJVElOTyhtcCkgLSBYRlNfQ0ZPUktfQk9GRihkY3ApIDogMCkKKworI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19DRk9SS19TSVpFKQoraW50IHhmc19jZm9ya19zaXplX2Rpc2soeGZzX2Rpbm9kZV9jb3JlX3QgKmRjcCwgc3RydWN0IHhmc19tb3VudCAqbXAsIGludCB3KTsKK2ludCB4ZnNfY2Zvcmtfc2l6ZSh4ZnNfZGlub2RlX2NvcmVfdCAqZGNwLCBzdHJ1Y3QgeGZzX21vdW50ICptcCwgaW50IHcpOworI2RlZmluZQlYRlNfQ0ZPUktfU0laRV9ESVNLKGRjcCxtcCx3KSAgICAgICB4ZnNfY2Zvcmtfc2l6ZV9kaXNrKGRjcCxtcCx3KQorI2RlZmluZQlYRlNfQ0ZPUktfU0laRShkY3AsbXAsdykgICAgICAgICAgICB4ZnNfY2Zvcmtfc2l6ZShkY3AsbXAsdykKKyNlbHNlCisjZGVmaW5lCVhGU19DRk9SS19TSVpFX0RJU0soZGNwLG1wLHcpIFwKKwkoKHcpID09IFhGU19EQVRBX0ZPUksgPyBcCisJCVhGU19DRk9SS19EU0laRV9ESVNLKGRjcCwgbXApIDogXAorCSAJWEZTX0NGT1JLX0FTSVpFX0RJU0soZGNwLCBtcCkpCisjZGVmaW5lIFhGU19DRk9SS19TSVpFKGRjcCxtcCx3KSBcCisJKCh3KSA9PSBYRlNfREFUQV9GT1JLID8gXAorCQlYRlNfQ0ZPUktfRFNJWkUoZGNwLCBtcCkgOiBYRlNfQ0ZPUktfQVNJWkUoZGNwLCBtcCkpCisKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ERk9SS19EU0laRSkKK2ludCB4ZnNfZGZvcmtfZHNpemUoeGZzX2Rpbm9kZV90ICpkaXAsIHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKKyNkZWZpbmUJWEZTX0RGT1JLX0RTSVpFKGRpcCxtcCkgICAgICAgICAgICAgeGZzX2Rmb3JrX2RzaXplKGRpcCxtcCkKKyNlbHNlCisjZGVmaW5lIFhGU19ERk9SS19EU0laRShkaXAsbXApICAgICAgICAgICAgIFhGU19DRk9SS19EU0laRV9ESVNLKCYoZGlwKS0+ZGlfY29yZSwgbXApCisKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfREZPUktfQVNJWkUpCitpbnQgeGZzX2Rmb3JrX2FzaXplKHhmc19kaW5vZGVfdCAqZGlwLCBzdHJ1Y3QgeGZzX21vdW50ICptcCk7CisjZGVmaW5lCVhGU19ERk9SS19BU0laRShkaXAsbXApICAgICAgICAgICAgIHhmc19kZm9ya19hc2l6ZShkaXAsbXApCisjZWxzZQorI2RlZmluZSBYRlNfREZPUktfQVNJWkUoZGlwLG1wKSAgICAgICAgICAgICBYRlNfQ0ZPUktfQVNJWkVfRElTSygmKGRpcCktPmRpX2NvcmUsIG1wKQorCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RGT1JLX1NJWkUpCitpbnQgeGZzX2Rmb3JrX3NpemUoeGZzX2Rpbm9kZV90ICpkaXAsIHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBpbnQgdyk7CisjZGVmaW5lCVhGU19ERk9SS19TSVpFKGRpcCxtcCx3KSAgICAgICAgICAgIHhmc19kZm9ya19zaXplKGRpcCxtcCx3KQorI2Vsc2UKKyNkZWZpbmUJWEZTX0RGT1JLX1NJWkUoZGlwLG1wLHcpCSAgICBYRlNfQ0ZPUktfU0laRV9ESVNLKCYoZGlwKS0+ZGlfY29yZSwgbXAsIHcpCisKKyNlbmRpZgorCisvKgorICogTWFjcm9zIGZvciBhY2Nlc3NpbmcgcGVyLWZvcmsgZGlzayBpbm9kZSBpbmZvcm1hdGlvbi4KKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfREZPUktfUSkKK2ludCB4ZnNfZGZvcmtfcSh4ZnNfZGlub2RlX3QgKmRpcCk7CisjZGVmaW5lCVhGU19ERk9SS19RKGRpcCkJICAgICAgICAgICAgeGZzX2Rmb3JrX3EoZGlwKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0RGT1JLX1EoZGlwKSAgICAgICAgICAgICAgICAgICAgWEZTX0NGT1JLX1FfRElTSygmKGRpcCktPmRpX2NvcmUpCisKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfREZPUktfQk9GRikKK2ludCB4ZnNfZGZvcmtfYm9mZih4ZnNfZGlub2RlX3QgKmRpcCk7CisjZGVmaW5lCVhGU19ERk9SS19CT0ZGKGRpcCkJCSAgICB4ZnNfZGZvcmtfYm9mZihkaXApCisjZWxzZQorI2RlZmluZQlYRlNfREZPUktfQk9GRihkaXApCQkgICAgWEZTX0NGT1JLX0JPRkZfRElTSygmKGRpcCktPmRpX2NvcmUpCisKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfREZPUktfRFBUUikKK2NoYXIgKnhmc19kZm9ya19kcHRyKHhmc19kaW5vZGVfdCAqZGlwKTsKKyNkZWZpbmUJWEZTX0RGT1JLX0RQVFIoZGlwKQkgICAgICAgICAgICB4ZnNfZGZvcmtfZHB0cihkaXApCisjZWxzZQorI2RlZmluZQlYRlNfREZPUktfRFBUUihkaXApCQkgICAgKChkaXApLT5kaV91LmRpX2MpCisKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfREZPUktfQVBUUikKK2NoYXIgKnhmc19kZm9ya19hcHRyKHhmc19kaW5vZGVfdCAqZGlwKTsKKyNkZWZpbmUJWEZTX0RGT1JLX0FQVFIoZGlwKSAgICAgICAgICAgICAgICAgeGZzX2Rmb3JrX2FwdHIoZGlwKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0RGT1JLX0FQVFIoZGlwKQkJICAgICgoZGlwKS0+ZGlfdS5kaV9jICsgWEZTX0RGT1JLX0JPRkYoZGlwKSkKKworI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ERk9SS19QVFIpCitjaGFyICp4ZnNfZGZvcmtfcHRyKHhmc19kaW5vZGVfdCAqZGlwLCBpbnQgdyk7CisjZGVmaW5lCVhGU19ERk9SS19QVFIoZGlwLHcpICAgICAgICAgICAgICAgIHhmc19kZm9ya19wdHIoZGlwLHcpCisjZWxzZQorI2RlZmluZQlYRlNfREZPUktfUFRSKGRpcCx3KQlcCisJKCh3KSA9PSBYRlNfREFUQV9GT1JLID8gWEZTX0RGT1JLX0RQVFIoZGlwKSA6IFhGU19ERk9SS19BUFRSKGRpcCkpCisKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQ0ZPUktfRk9STUFUKQoraW50IHhmc19jZm9ya19mb3JtYXQoeGZzX2Rpbm9kZV9jb3JlX3QgKmRjcCwgaW50IHcpOworI2RlZmluZQlYRlNfQ0ZPUktfRk9STUFUKGRjcCx3KSAgICAgICAgICAgICB4ZnNfY2ZvcmtfZm9ybWF0KGRjcCx3KQorI2Vsc2UKKyNkZWZpbmUJWEZTX0NGT1JLX0ZPUk1BVChkY3AsdykgXAorCSgodykgPT0gWEZTX0RBVEFfRk9SSyA/IChkY3ApLT5kaV9mb3JtYXQgOiAoZGNwKS0+ZGlfYWZvcm1hdCkKKworI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19DRk9SS19GTVRfU0VUKQordm9pZCB4ZnNfY2ZvcmtfZm10X3NldCh4ZnNfZGlub2RlX2NvcmVfdCAqZGNwLCBpbnQgdywgaW50IG4pOworI2RlZmluZQlYRlNfQ0ZPUktfRk1UX1NFVChkY3AsdyxuKSAgICAgICAgICAgeGZzX2Nmb3JrX2ZtdF9zZXQoZGNwLHcsbikKKyNlbHNlCisjZGVmaW5lCVhGU19DRk9SS19GTVRfU0VUKGRjcCx3LG4pIFwKKwkoKHcpID09IFhGU19EQVRBX0ZPUksgPyBcCisJCSgoZGNwKS0+ZGlfZm9ybWF0ID0gKG4pKSA6IFwKKwkJKChkY3ApLT5kaV9hZm9ybWF0ID0gKG4pKSkKKworI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19DRk9SS19ORVhURU5UUykKK2ludCB4ZnNfY2ZvcmtfbmV4dGVudHNfZGlzayh4ZnNfZGlub2RlX2NvcmVfdCAqZGNwLCBpbnQgdyk7CitpbnQgeGZzX2Nmb3JrX25leHRlbnRzKHhmc19kaW5vZGVfY29yZV90ICpkY3AsIGludCB3KTsKKyNkZWZpbmUJWEZTX0NGT1JLX05FWFRFTlRTX0RJU0soZGNwLHcpICAgICAgIHhmc19jZm9ya19uZXh0ZW50c19kaXNrKGRjcCx3KQorI2RlZmluZQlYRlNfQ0ZPUktfTkVYVEVOVFMoZGNwLHcpICAgICAgICAgICAgeGZzX2Nmb3JrX25leHRlbnRzKGRjcCx3KQorI2Vsc2UKKyNkZWZpbmUJWEZTX0NGT1JLX05FWFRFTlRTX0RJU0soZGNwLHcpIFwKKwkoKHcpID09IFhGU19EQVRBX0ZPUksgPyBcCisJIAlJTlRfR0VUKChkY3ApLT5kaV9uZXh0ZW50cywgQVJDSF9DT05WRVJUKSA6IFwKKwkgCUlOVF9HRVQoKGRjcCktPmRpX2FuZXh0ZW50cywgQVJDSF9DT05WRVJUKSkKKyNkZWZpbmUgWEZTX0NGT1JLX05FWFRFTlRTKGRjcCx3KSBcCisJKCh3KSA9PSBYRlNfREFUQV9GT1JLID8gKGRjcCktPmRpX25leHRlbnRzIDogKGRjcCktPmRpX2FuZXh0ZW50cykKKworI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19DRk9SS19ORVhUX1NFVCkKK3ZvaWQgeGZzX2Nmb3JrX25leHRfc2V0KHhmc19kaW5vZGVfY29yZV90ICpkY3AsIGludCB3LCBpbnQgbik7CisjZGVmaW5lCVhGU19DRk9SS19ORVhUX1NFVChkY3AsdyxuKQkgICAgICAgIHhmc19jZm9ya19uZXh0X3NldChkY3AsdyxuKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0NGT1JLX05FWFRfU0VUKGRjcCx3LG4pIFwKKwkoKHcpID09IFhGU19EQVRBX0ZPUksgPyBcCisJCSgoZGNwKS0+ZGlfbmV4dGVudHMgPSAobikpIDogXAorCQkoKGRjcCktPmRpX2FuZXh0ZW50cyA9IChuKSkpCisKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ERk9SS19ORVhURU5UUykKK2ludCB4ZnNfZGZvcmtfbmV4dGVudHMoeGZzX2Rpbm9kZV90ICpkaXAsIGludCB3KTsKKyNkZWZpbmUJWEZTX0RGT1JLX05FWFRFTlRTKGRpcCx3KSB4ZnNfZGZvcmtfbmV4dGVudHMoZGlwLHcpCisjZWxzZQorI2RlZmluZQlYRlNfREZPUktfTkVYVEVOVFMoZGlwLHcpIFhGU19DRk9SS19ORVhURU5UU19ESVNLKCYoZGlwKS0+ZGlfY29yZSwgdykKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CVUZfVE9fRElOT0RFKQoreGZzX2Rpbm9kZV90ICp4ZnNfYnVmX3RvX2Rpbm9kZShzdHJ1Y3QgeGZzX2J1ZiAqYnApOworI2RlZmluZQlYRlNfQlVGX1RPX0RJTk9ERShicCkJeGZzX2J1Zl90b19kaW5vZGUoYnApCisjZWxzZQorI2RlZmluZQlYRlNfQlVGX1RPX0RJTk9ERShicCkJKCh4ZnNfZGlub2RlX3QgKikoWEZTX0JVRl9QVFIoYnApKSkKKyNlbmRpZgorCisvKgorICogVmFsdWVzIGZvciBkaV9mbGFncworICogVGhlcmUgc2hvdWxkIGJlIGEgb25lLXRvLW9uZSBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIHRoZXNlIGZsYWdzIGFuZCB0aGUKKyAqIFhGU19YRkxBR19zLgorICovCisjZGVmaW5lIFhGU19ESUZMQUdfUkVBTFRJTUVfQklUICAwCS8qIGZpbGUncyBibG9ja3MgY29tZSBmcm9tIHJ0IGFyZWEgKi8KKyNkZWZpbmUgWEZTX0RJRkxBR19QUkVBTExPQ19CSVQgIDEJLyogZmlsZSBzcGFjZSBoYXMgYmVlbiBwcmVhbGxvY2F0ZWQgKi8KKyNkZWZpbmUgWEZTX0RJRkxBR19ORVdSVEJNX0JJVCAgIDIJLyogZm9yIHJ0Yml0bWFwIGlub2RlLCBuZXcgZm9ybWF0ICovCisjZGVmaW5lIFhGU19ESUZMQUdfSU1NVVRBQkxFX0JJVCAzCS8qIGlub2RlIGlzIGltbXV0YWJsZSAqLworI2RlZmluZSBYRlNfRElGTEFHX0FQUEVORF9CSVQgICAgNAkvKiBpbm9kZSBpcyBhcHBlbmQtb25seSAqLworI2RlZmluZSBYRlNfRElGTEFHX1NZTkNfQklUICAgICAgNQkvKiBpbm9kZSBpcyB3cml0dGVuIHN5bmNocm9ub3VzbHkgKi8KKyNkZWZpbmUgWEZTX0RJRkxBR19OT0FUSU1FX0JJVCAgIDYJLyogZG8gbm90IHVwZGF0ZSBhdGltZSAqLworI2RlZmluZSBYRlNfRElGTEFHX05PRFVNUF9CSVQgICAgNwkvKiBkbyBub3QgZHVtcCAqLworI2RlZmluZSBYRlNfRElGTEFHX1JUSU5IRVJJVF9CSVQgOAkvKiBjcmVhdGUgd2l0aCByZWFsdGltZSBiaXQgc2V0ICovCisjZGVmaW5lIFhGU19ESUZMQUdfUFJPSklOSEVSSVRfQklUICA5CS8qIGNyZWF0ZSB3aXRoIHBhcmVudHMgcHJvamlkICovCisjZGVmaW5lIFhGU19ESUZMQUdfTk9TWU1MSU5LU19CSVQgIDEwCS8qIGRpc2FsbG93IHN5bWxpbmsgY3JlYXRpb24gKi8KKyNkZWZpbmUgWEZTX0RJRkxBR19SRUFMVElNRSAgICAgICgxIDw8IFhGU19ESUZMQUdfUkVBTFRJTUVfQklUKQorI2RlZmluZSBYRlNfRElGTEFHX1BSRUFMTE9DICAgICAgKDEgPDwgWEZTX0RJRkxBR19QUkVBTExPQ19CSVQpCisjZGVmaW5lIFhGU19ESUZMQUdfTkVXUlRCTSAgICAgICAoMSA8PCBYRlNfRElGTEFHX05FV1JUQk1fQklUKQorI2RlZmluZSBYRlNfRElGTEFHX0lNTVVUQUJMRSAgICAgKDEgPDwgWEZTX0RJRkxBR19JTU1VVEFCTEVfQklUKQorI2RlZmluZSBYRlNfRElGTEFHX0FQUEVORCAgICAgICAgKDEgPDwgWEZTX0RJRkxBR19BUFBFTkRfQklUKQorI2RlZmluZSBYRlNfRElGTEFHX1NZTkMgICAgICAgICAgKDEgPDwgWEZTX0RJRkxBR19TWU5DX0JJVCkKKyNkZWZpbmUgWEZTX0RJRkxBR19OT0FUSU1FICAgICAgICgxIDw8IFhGU19ESUZMQUdfTk9BVElNRV9CSVQpCisjZGVmaW5lIFhGU19ESUZMQUdfTk9EVU1QICAgICAgICAoMSA8PCBYRlNfRElGTEFHX05PRFVNUF9CSVQpCisjZGVmaW5lIFhGU19ESUZMQUdfUlRJTkhFUklUICAgICAoMSA8PCBYRlNfRElGTEFHX1JUSU5IRVJJVF9CSVQpCisjZGVmaW5lIFhGU19ESUZMQUdfUFJPSklOSEVSSVQgICAoMSA8PCBYRlNfRElGTEFHX1BST0pJTkhFUklUX0JJVCkKKyNkZWZpbmUgWEZTX0RJRkxBR19OT1NZTUxJTktTICAgICgxIDw8IFhGU19ESUZMQUdfTk9TWU1MSU5LU19CSVQpCisKKyNkZWZpbmUgWEZTX0RJRkxBR19BTlkgXAorCShYRlNfRElGTEFHX1JFQUxUSU1FIHwgWEZTX0RJRkxBR19QUkVBTExPQyB8IFhGU19ESUZMQUdfTkVXUlRCTSB8IFwKKwkgWEZTX0RJRkxBR19JTU1VVEFCTEUgfCBYRlNfRElGTEFHX0FQUEVORCB8IFhGU19ESUZMQUdfU1lOQyB8IFwKKwkgWEZTX0RJRkxBR19OT0FUSU1FIHwgWEZTX0RJRkxBR19OT0RVTVAgfCBYRlNfRElGTEFHX1JUSU5IRVJJVCB8IFwKKwkgWEZTX0RJRkxBR19QUk9KSU5IRVJJVCB8IFhGU19ESUZMQUdfTk9TWU1MSU5LUykKKworI2VuZGlmCS8qIF9fWEZTX0RJTk9ERV9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGlyLmMgYi9mcy94ZnMveGZzX2Rpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMzBiYzcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2Rpci5jCkBAIC0wLDAgKzEsMTIyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorCisjaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc190eXBlcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19hbGxvYy5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19ibWFwLmgiCisjaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9sZWFmLmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisKKy8qCisgKiB4ZnNfZGlyLmMKKyAqCisgKiBQcm92aWRlIHRoZSBleHRlcm5hbCBpbnRlcmZhY2VzIHRvIG1hbmFnZSBkaXJlY3Rvcmllcy4KKyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRnVuY3Rpb24gcHJvdG90eXBlcyBmb3IgdGhlIGtlcm5lbC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAqIEZ1bmN0aW9ucyBmb3IgdGhlIGRpcm9wcyBpbnRlcmZhY2VzLgorICovCitzdGF0aWMgdm9pZAl4ZnNfZGlyX21vdW50KHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKKworc3RhdGljIGludAl4ZnNfZGlyX2lzZW1wdHkoc3RydWN0IHhmc19pbm9kZSAqZHApOworCitzdGF0aWMgaW50CXhmc19kaXJfaW5pdChzdHJ1Y3QgeGZzX3RyYW5zICp0cmFucywKKwkJCSAgICAgc3RydWN0IHhmc19pbm9kZSAqZGlyLAorCQkJICAgICBzdHJ1Y3QgeGZzX2lub2RlICpwYXJlbnRfZGlyKTsKKworc3RhdGljIGludAl4ZnNfZGlyX2NyZWF0ZW5hbWUoc3RydWN0IHhmc190cmFucyAqdHJhbnMsCisJCQkJICAgc3RydWN0IHhmc19pbm9kZSAqZHAsCisJCQkJICAgY2hhciAqbmFtZV9zdHJpbmcsCisJCQkJICAgaW50IG5hbWVfbGVuLAorCQkJCSAgIHhmc19pbm9fdCBpbm9kZV9udW1iZXIsCisJCQkJICAgeGZzX2ZzYmxvY2tfdCAqZmlyc3RibG9jaywKKwkJCQkgICB4ZnNfYm1hcF9mcmVlX3QgKmZsaXN0LAorCQkJCSAgIHhmc19leHRsZW5fdCB0b3RhbCk7CisKK3N0YXRpYyBpbnQJeGZzX2Rpcl9sb29rdXAoc3RydWN0IHhmc190cmFucyAqdHAsCisJCQkgICAgICAgc3RydWN0IHhmc19pbm9kZSAqZHAsCisJCQkgICAgICAgY2hhciAqbmFtZV9zdHJpbmcsCisJCQkgICAgICAgaW50IG5hbWVfbGVuZ3RoLAorCQkJICAgICAgIHhmc19pbm9fdCAqaW5vZGVfbnVtYmVyKTsKKworc3RhdGljIGludAl4ZnNfZGlyX3JlbW92ZW5hbWUoc3RydWN0IHhmc190cmFucyAqdHJhbnMsCisJCQkJICAgc3RydWN0IHhmc19pbm9kZSAqZHAsCisJCQkJICAgY2hhciAqbmFtZV9zdHJpbmcsCisJCQkJICAgaW50IG5hbWVfbGVuZ3RoLAorCQkJCSAgIHhmc19pbm9fdCBpbm8sCisJCQkJICAgeGZzX2ZzYmxvY2tfdCAqZmlyc3RibG9jaywKKwkJCQkgICB4ZnNfYm1hcF9mcmVlX3QgKmZsaXN0LAorCQkJCSAgIHhmc19leHRsZW5fdCB0b3RhbCk7CisKK3N0YXRpYyBpbnQJeGZzX2Rpcl9nZXRkZW50cyhzdHJ1Y3QgeGZzX3RyYW5zICp0cCwKKwkJCQkgc3RydWN0IHhmc19pbm9kZSAqZHAsCisJCQkJIHN0cnVjdCB1aW8gKnVpb3AsCisJCQkJIGludCAqZW9mcCk7CisKK3N0YXRpYyBpbnQJeGZzX2Rpcl9yZXBsYWNlKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLAorCQkJCXN0cnVjdCB4ZnNfaW5vZGUgKmRwLAorCQkJCWNoYXIgKm5hbWVfc3RyaW5nLAorCQkJCWludCBuYW1lX2xlbmd0aCwKKwkJCQl4ZnNfaW5vX3QgaW5vZGVfbnVtYmVyLAorCQkJCXhmc19mc2Jsb2NrX3QgKmZpcnN0YmxvY2ssCisJCQkJeGZzX2JtYXBfZnJlZV90ICpmbGlzdCwKKwkJCQl4ZnNfZXh0bGVuX3QgdG90YWwpOworCitzdGF0aWMgaW50CXhmc19kaXJfY2FuZW50ZXIoc3RydWN0IHhmc190cmFucyAqdHAsCisJCQkJIHN0cnVjdCB4ZnNfaW5vZGUgKmRwLAorCQkJCSBjaGFyICpuYW1lX3N0cmluZywKKwkJCQkgaW50IG5hbWVfbGVuZ3RoKTsKKworc3RhdGljIGludAl4ZnNfZGlyX3Nob3J0Zm9ybV92YWxpZGF0ZV9vbmRpc2soeGZzX21vdW50X3QgKm1wLAorCQkJCQkJICB4ZnNfZGlub2RlX3QgKmRpcCk7CisKK3hmc19kaXJvcHNfdCB4ZnN2MV9kaXJvcHMgPSB7CisJLnhkX21vdW50CQkJPSB4ZnNfZGlyX21vdW50LAorCS54ZF9pc2VtcHR5CQkJPSB4ZnNfZGlyX2lzZW1wdHksCisJLnhkX2luaXQJCQk9IHhmc19kaXJfaW5pdCwKKwkueGRfY3JlYXRlbmFtZQkJCT0geGZzX2Rpcl9jcmVhdGVuYW1lLAorCS54ZF9sb29rdXAJCQk9IHhmc19kaXJfbG9va3VwLAorCS54ZF9yZW1vdmVuYW1lCQkJPSB4ZnNfZGlyX3JlbW92ZW5hbWUsCisJLnhkX2dldGRlbnRzCQkJPSB4ZnNfZGlyX2dldGRlbnRzLAorCS54ZF9yZXBsYWNlCQkJPSB4ZnNfZGlyX3JlcGxhY2UsCisJLnhkX2NhbmVudGVyCQkJPSB4ZnNfZGlyX2NhbmVudGVyLAorCS54ZF9zaG9ydGZvcm1fdmFsaWRhdGVfb25kaXNrCT0geGZzX2Rpcl9zaG9ydGZvcm1fdmFsaWRhdGVfb25kaXNrLAorCS54ZF9zaG9ydGZvcm1fdG9fc2luZ2xlCQk9IHhmc19kaXJfc2hvcnRmb3JtX3RvX2xlYWYsCit9OworCisvKgorICogSW50ZXJuYWwgcm91dGluZXMgd2hlbiBkaXJzaXplID09IFhGU19MQlNJWkUobXApLgorICovCitTVEFUSUMgaW50IHhmc19kaXJfbGVhZl9sb29rdXAoeGZzX2RhX2FyZ3NfdCAqYXJncyk7CitTVEFUSUMgaW50IHhmc19kaXJfbGVhZl9yZW1vdmVuYW1lKHhmc19kYV9hcmdzX3QgKmFyZ3MsIGludCAqbnVtYmVyX2VudHJpZXMsCisJCQkJCQkgaW50ICp0b3RhbF9uYW1lYnl0ZXMpOworU1RBVElDIGludCB4ZnNfZGlyX2xlYWZfZ2V0ZGVudHMoeGZzX3RyYW5zX3QgKnRyYW5zLCB4ZnNfaW5vZGVfdCAqZHAsCisJCQkJCSAgICAgdWlvX3QgKnVpbywgaW50ICplb2ZwLAorCQkJCQkgICAgIHhmc19kaXJlbnRfdCAqZGJwLAorCQkJCQkgICAgIHhmc19kaXJfcHV0X3QgcHV0KTsKK1NUQVRJQyBpbnQgeGZzX2Rpcl9sZWFmX3JlcGxhY2UoeGZzX2RhX2FyZ3NfdCAqYXJncyk7CisKKy8qCisgKiBJbnRlcm5hbCByb3V0aW5lcyB3aGVuIGRpcnNpemUgPiBYRlNfTEJTSVpFKG1wKS4KKyAqLworU1RBVElDIGludCB4ZnNfZGlyX25vZGVfYWRkbmFtZSh4ZnNfZGFfYXJnc190ICphcmdzKTsKK1NUQVRJQyBpbnQgeGZzX2Rpcl9ub2RlX2xvb2t1cCh4ZnNfZGFfYXJnc190ICphcmdzKTsKK1NUQVRJQyBpbnQgeGZzX2Rpcl9ub2RlX3JlbW92ZW5hbWUoeGZzX2RhX2FyZ3NfdCAqYXJncyk7CitTVEFUSUMgaW50IHhmc19kaXJfbm9kZV9nZXRkZW50cyh4ZnNfdHJhbnNfdCAqdHJhbnMsIHhmc19pbm9kZV90ICpkcCwKKwkJCQkJICAgICB1aW9fdCAqdWlvLCBpbnQgKmVvZnAsCisJCQkJCSAgICAgeGZzX2RpcmVudF90ICpkYnAsCisJCQkJCSAgICAgeGZzX2Rpcl9wdXRfdCBwdXQpOworU1RBVElDIGludCB4ZnNfZGlyX25vZGVfcmVwbGFjZSh4ZnNfZGFfYXJnc190ICphcmdzKTsKKworI2lmIGRlZmluZWQoWEZTX0RJUl9UUkFDRSkKK2t0cmFjZV90ICp4ZnNfZGlyX3RyYWNlX2J1ZjsKKyNlbmRpZgorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBPdmVyYWxsIGV4dGVybmFsIGludGVyZmFjZSByb3V0aW5lcy4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworeGZzX2RhaGFzaF90CXhmc19kaXJfaGFzaF9kb3QsIHhmc19kaXJfaGFzaF9kb3Rkb3Q7CisKKy8qCisgKiBPbmUtdGltZSBzdGFydHVwIHJvdXRpbmUgY2FsbGVkIGZyb20geGZzX2luaXQoKS4KKyAqLwordm9pZAoreGZzX2Rpcl9zdGFydHVwKHZvaWQpCit7CisJeGZzX2Rpcl9oYXNoX2RvdCA9IHhmc19kYV9oYXNobmFtZSgiLiIsIDEpOworCXhmc19kaXJfaGFzaF9kb3Rkb3QgPSB4ZnNfZGFfaGFzaG5hbWUoIi4uIiwgMik7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIGRpcmVjdG9yeS1yZWxhdGVkIGZpZWxkcyBpbiB0aGUgbW91bnQgc3RydWN0dXJlLgorICovCitzdGF0aWMgdm9pZAoreGZzX2Rpcl9tb3VudCh4ZnNfbW91bnRfdCAqbXApCit7CisJdWludCBzaG9ydGNvdW50LCBsZWFmY291bnQsIGNvdW50OworCisJbXAtPm1fZGlydmVyc2lvbiA9IDE7CisJc2hvcnRjb3VudCA9IChtcC0+bV9hdHRyb2Zmc2V0IC0gKHVpbnQpc2l6ZW9mKHhmc19kaXJfc2ZfaGRyX3QpKSAvCisJCSAgICAgKHVpbnQpc2l6ZW9mKHhmc19kaXJfc2ZfZW50cnlfdCk7CisJbGVhZmNvdW50ID0gKFhGU19MQlNJWkUobXApIC0gKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9oZHJfdCkpIC8KKwkJICAgICgodWludClzaXplb2YoeGZzX2Rpcl9sZWFmX2VudHJ5X3QpICsKKwkJICAgICAodWludClzaXplb2YoeGZzX2Rpcl9sZWFmX25hbWVfdCkpOworCWNvdW50ID0gc2hvcnRjb3VudCA+IGxlYWZjb3VudCA/IHNob3J0Y291bnQgOiBsZWFmY291bnQ7CisJbXAtPm1fZGlyY29va19lbG9nID0geGZzX2RhX2xvZzJfcm91bmR1cChjb3VudCArIDEpOworCUFTU0VSVChtcC0+bV9kaXJjb29rX2Vsb2cgPD0gbXAtPm1fc2Iuc2JfYmxvY2tsb2cpOworCW1wLT5tX2Rpcl9ub2RlX2VudHMgPSBtcC0+bV9hdHRyX25vZGVfZW50cyA9CisJCShYRlNfTEJTSVpFKG1wKSAtICh1aW50KXNpemVvZih4ZnNfZGFfbm9kZV9oZHJfdCkpIC8KKwkJKHVpbnQpc2l6ZW9mKHhmc19kYV9ub2RlX2VudHJ5X3QpOworCW1wLT5tX2Rpcl9tYWdpY3BjdCA9IChYRlNfTEJTSVpFKG1wKSAqIDM3KSAvIDEwMDsKKwltcC0+bV9kaXJibGtzaXplID0gbXAtPm1fc2Iuc2JfYmxvY2tzaXplOworCW1wLT5tX2RpcmJsa2ZzYnMgPSAxOworfQorCisvKgorICogUmV0dXJuIDEgaWYgZGlyZWN0b3J5IGNvbnRhaW5zIG9ubHkgIi4iIGFuZCAiLi4iLgorICovCitzdGF0aWMgaW50Cit4ZnNfZGlyX2lzZW1wdHkoeGZzX2lub2RlX3QgKmRwKQoreworCXhmc19kaXJfc2ZfaGRyX3QgKmhkcjsKKworCUFTU0VSVCgoZHAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSA9PSBTX0lGRElSKTsKKwlpZiAoZHAtPmlfZC5kaV9zaXplID09IDApCisJCXJldHVybigxKTsKKwlpZiAoZHAtPmlfZC5kaV9zaXplID4gWEZTX0lGT1JLX0RTSVpFKGRwKSkKKwkJcmV0dXJuKDApOworCWhkciA9ICh4ZnNfZGlyX3NmX2hkcl90ICopZHAtPmlfZGYuaWZfdTEuaWZfZGF0YTsKKwlyZXR1cm4oaGRyLT5jb3VudCA9PSAwKTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgYSBkaXJlY3Rvcnkgd2l0aCBpdHMgIi4iIGFuZCAiLi4iIGVudHJpZXMuCisgKi8KK3N0YXRpYyBpbnQKK3hmc19kaXJfaW5pdCh4ZnNfdHJhbnNfdCAqdHJhbnMsIHhmc19pbm9kZV90ICpkaXIsIHhmc19pbm9kZV90ICpwYXJlbnRfZGlyKQoreworCXhmc19kYV9hcmdzX3QgYXJnczsKKwlpbnQgZXJyb3I7CisKKwltZW1zZXQoKGNoYXIgKikmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKKwlhcmdzLmRwID0gZGlyOworCWFyZ3MudHJhbnMgPSB0cmFuczsKKworCUFTU0VSVCgoZGlyLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRkRJUik7CisJaWYgKChlcnJvciA9IHhmc19kaXJfaW5vX3ZhbGlkYXRlKHRyYW5zLT50X21vdW50cCwgcGFyZW50X2Rpci0+aV9pbm8pKSkKKwkJcmV0dXJuIGVycm9yOworCisJcmV0dXJuKHhmc19kaXJfc2hvcnRmb3JtX2NyZWF0ZSgmYXJncywgcGFyZW50X2Rpci0+aV9pbm8pKTsKK30KKworLyoKKyAqIEdlbmVyaWMgaGFuZGxlciByb3V0aW5lIHRvIGFkZCBhIG5hbWUgdG8gYSBkaXJlY3RvcnkuCisgKiBUcmFuc2l0aW9ucyBkaXJlY3RvcnkgZnJvbSBzaG9ydGZvcm0gdG8gQnRyZWUgYXMgbmVjZXNzYXJ5LgorICovCitzdGF0aWMgaW50CQkJCQkJCS8qIGVycm9yICovCit4ZnNfZGlyX2NyZWF0ZW5hbWUoeGZzX3RyYW5zX3QgKnRyYW5zLCB4ZnNfaW5vZGVfdCAqZHAsIGNoYXIgKm5hbWUsCisJCSAgIGludCBuYW1lbGVuLCB4ZnNfaW5vX3QgaW51bSwgeGZzX2ZzYmxvY2tfdCAqZmlyc3RibG9jaywKKwkJICAgeGZzX2JtYXBfZnJlZV90ICpmbGlzdCwgeGZzX2V4dGxlbl90IHRvdGFsKQoreworCXhmc19kYV9hcmdzX3QgYXJnczsKKwlpbnQgcmV0dmFsLCBuZXdzaXplLCBkb25lOworCisJQVNTRVJUKChkcC0+aV9kLmRpX21vZGUgJiBTX0lGTVQpID09IFNfSUZESVIpOworCisJaWYgKChyZXR2YWwgPSB4ZnNfZGlyX2lub192YWxpZGF0ZSh0cmFucy0+dF9tb3VudHAsIGludW0pKSkKKwkJcmV0dXJuIChyZXR2YWwpOworCisJWEZTX1NUQVRTX0lOQyh4c19kaXJfY3JlYXRlKTsKKwkvKgorCSAqIEZpbGwgaW4gdGhlIGFyZyBzdHJ1Y3R1cmUgZm9yIHRoaXMgcmVxdWVzdC4KKwkgKi8KKwlhcmdzLm5hbWUgPSBuYW1lOworCWFyZ3MubmFtZWxlbiA9IG5hbWVsZW47CisJYXJncy5oYXNodmFsID0geGZzX2RhX2hhc2huYW1lKG5hbWUsIG5hbWVsZW4pOworCWFyZ3MuaW51bWJlciA9IGludW07CisJYXJncy5kcCA9IGRwOworCWFyZ3MuZmlyc3RibG9jayA9IGZpcnN0YmxvY2s7CisJYXJncy5mbGlzdCA9IGZsaXN0OworCWFyZ3MudG90YWwgPSB0b3RhbDsKKwlhcmdzLndoaWNoZm9yayA9IFhGU19EQVRBX0ZPUks7CisJYXJncy50cmFucyA9IHRyYW5zOworCWFyZ3MuanVzdGNoZWNrID0gMDsKKwlhcmdzLmFkZG5hbWUgPSBhcmdzLm9rbm9lbnQgPSAxOworCisJLyoKKwkgKiBEZWNpZGUgb24gd2hhdCB3b3JrIHJvdXRpbmVzIHRvIGNhbGwgYmFzZWQgb24gdGhlIGlub2RlIHNpemUuCisJICovCisJZG9uZSA9IDA7CisJaWYgKGRwLT5pX2QuZGlfZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0xPQ0FMKSB7CisJCW5ld3NpemUgPSBYRlNfRElSX1NGX0VOVFNJWkVfQllOQU1FKGFyZ3MubmFtZWxlbik7CisJCWlmICgoZHAtPmlfZC5kaV9zaXplICsgbmV3c2l6ZSkgPD0gWEZTX0lGT1JLX0RTSVpFKGRwKSkgeworCQkJcmV0dmFsID0geGZzX2Rpcl9zaG9ydGZvcm1fYWRkbmFtZSgmYXJncyk7CisJCQlkb25lID0gMTsKKwkJfSBlbHNlIHsKKwkJCWlmICh0b3RhbCA9PSAwKQorCQkJCXJldHVybiBYRlNfRVJST1IoRU5PU1BDKTsKKwkJCXJldHZhbCA9IHhmc19kaXJfc2hvcnRmb3JtX3RvX2xlYWYoJmFyZ3MpOworCQkJZG9uZSA9IHJldHZhbCAhPSAwOworCQl9CisJfQorCWlmICghZG9uZSAmJiB4ZnNfYm1hcF9vbmVfYmxvY2soZHAsIFhGU19EQVRBX0ZPUkspKSB7CisJCXJldHZhbCA9IHhmc19kaXJfbGVhZl9hZGRuYW1lKCZhcmdzKTsKKwkJZG9uZSA9IHJldHZhbCAhPSBFTk9TUEM7CisJCWlmICghZG9uZSkgeworCQkJaWYgKHRvdGFsID09IDApCisJCQkJcmV0dXJuIFhGU19FUlJPUihFTk9TUEMpOworCQkJcmV0dmFsID0geGZzX2Rpcl9sZWFmX3RvX25vZGUoJmFyZ3MpOworCQkJZG9uZSA9IHJldHZhbCAhPSAwOworCQl9CisJfQorCWlmICghZG9uZSkgeworCQlyZXR2YWwgPSB4ZnNfZGlyX25vZGVfYWRkbmFtZSgmYXJncyk7CisJfQorCXJldHVybihyZXR2YWwpOworfQorCisvKgorICogR2VuZXJpYyBoYW5kbGVyIHJvdXRpbmUgdG8gY2hlY2sgaWYgYSBuYW1lIGNhbiBiZSBhZGRlZCB0byBhIGRpcmVjdG9yeSwKKyAqIHdpdGhvdXQgYWRkaW5nIGFueSBibG9ja3MgdG8gdGhlIGRpcmVjdG9yeS4KKyAqLworc3RhdGljIGludAkJCQkJCQkvKiBlcnJvciAqLworeGZzX2Rpcl9jYW5lbnRlcih4ZnNfdHJhbnNfdCAqdHJhbnMsIHhmc19pbm9kZV90ICpkcCwgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pCit7CisJeGZzX2RhX2FyZ3NfdCBhcmdzOworCWludCByZXR2YWwsIG5ld3NpemU7CisKKwlBU1NFUlQoKGRwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRkRJUik7CisJLyoKKwkgKiBGaWxsIGluIHRoZSBhcmcgc3RydWN0dXJlIGZvciB0aGlzIHJlcXVlc3QuCisJICovCisJYXJncy5uYW1lID0gbmFtZTsKKwlhcmdzLm5hbWVsZW4gPSBuYW1lbGVuOworCWFyZ3MuaGFzaHZhbCA9IHhmc19kYV9oYXNobmFtZShuYW1lLCBuYW1lbGVuKTsKKwlhcmdzLmludW1iZXIgPSAwOworCWFyZ3MuZHAgPSBkcDsKKwlhcmdzLmZpcnN0YmxvY2sgPSBOVUxMOworCWFyZ3MuZmxpc3QgPSBOVUxMOworCWFyZ3MudG90YWwgPSAwOworCWFyZ3Mud2hpY2hmb3JrID0gWEZTX0RBVEFfRk9SSzsKKwlhcmdzLnRyYW5zID0gdHJhbnM7CisJYXJncy5qdXN0Y2hlY2sgPSBhcmdzLmFkZG5hbWUgPSBhcmdzLm9rbm9lbnQgPSAxOworCisJLyoKKwkgKiBEZWNpZGUgb24gd2hhdCB3b3JrIHJvdXRpbmVzIHRvIGNhbGwgYmFzZWQgb24gdGhlIGlub2RlIHNpemUuCisJICovCisJaWYgKGRwLT5pX2QuZGlfZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0xPQ0FMKSB7CisJCW5ld3NpemUgPSBYRlNfRElSX1NGX0VOVFNJWkVfQllOQU1FKGFyZ3MubmFtZWxlbik7CisJCWlmICgoZHAtPmlfZC5kaV9zaXplICsgbmV3c2l6ZSkgPD0gWEZTX0lGT1JLX0RTSVpFKGRwKSkKKwkJCXJldHZhbCA9IDA7CisJCWVsc2UKKwkJCXJldHZhbCA9IFhGU19FUlJPUihFTk9TUEMpOworCX0gZWxzZSBpZiAoeGZzX2JtYXBfb25lX2Jsb2NrKGRwLCBYRlNfREFUQV9GT1JLKSkgeworCQlyZXR2YWwgPSB4ZnNfZGlyX2xlYWZfYWRkbmFtZSgmYXJncyk7CisJfSBlbHNlIHsKKwkJcmV0dmFsID0geGZzX2Rpcl9ub2RlX2FkZG5hbWUoJmFyZ3MpOworCX0KKwlyZXR1cm4ocmV0dmFsKTsKK30KKworLyoKKyAqIEdlbmVyaWMgaGFuZGxlciByb3V0aW5lIHRvIHJlbW92ZSBhIG5hbWUgZnJvbSBhIGRpcmVjdG9yeS4KKyAqIFRyYW5zaXRpb25zIGRpcmVjdG9yeSBmcm9tIEJ0cmVlIHRvIHNob3J0Zm9ybSBhcyBuZWNlc3NhcnkuCisgKi8KK3N0YXRpYyBpbnQJCQkJCQkJLyogZXJyb3IgKi8KK3hmc19kaXJfcmVtb3ZlbmFtZSh4ZnNfdHJhbnNfdCAqdHJhbnMsIHhmc19pbm9kZV90ICpkcCwgY2hhciAqbmFtZSwKKwkJICAgaW50IG5hbWVsZW4sIHhmc19pbm9fdCBpbm8sIHhmc19mc2Jsb2NrX3QgKmZpcnN0YmxvY2ssCisJCSAgIHhmc19ibWFwX2ZyZWVfdCAqZmxpc3QsIHhmc19leHRsZW5fdCB0b3RhbCkKK3sKKwl4ZnNfZGFfYXJnc190IGFyZ3M7CisJaW50IGNvdW50LCB0b3RhbGxlbiwgbmV3c2l6ZSwgcmV0dmFsOworCisJQVNTRVJUKChkcC0+aV9kLmRpX21vZGUgJiBTX0lGTVQpID09IFNfSUZESVIpOworCVhGU19TVEFUU19JTkMoeHNfZGlyX3JlbW92ZSk7CisJLyoKKwkgKiBGaWxsIGluIHRoZSBhcmcgc3RydWN0dXJlIGZvciB0aGlzIHJlcXVlc3QuCisJICovCisJYXJncy5uYW1lID0gbmFtZTsKKwlhcmdzLm5hbWVsZW4gPSBuYW1lbGVuOworCWFyZ3MuaGFzaHZhbCA9IHhmc19kYV9oYXNobmFtZShuYW1lLCBuYW1lbGVuKTsKKwlhcmdzLmludW1iZXIgPSBpbm87CisJYXJncy5kcCA9IGRwOworCWFyZ3MuZmlyc3RibG9jayA9IGZpcnN0YmxvY2s7CisJYXJncy5mbGlzdCA9IGZsaXN0OworCWFyZ3MudG90YWwgPSB0b3RhbDsKKwlhcmdzLndoaWNoZm9yayA9IFhGU19EQVRBX0ZPUks7CisJYXJncy50cmFucyA9IHRyYW5zOworCWFyZ3MuanVzdGNoZWNrID0gYXJncy5hZGRuYW1lID0gYXJncy5va25vZW50ID0gMDsKKworCS8qCisJICogRGVjaWRlIG9uIHdoYXQgd29yayByb3V0aW5lcyB0byBjYWxsIGJhc2VkIG9uIHRoZSBpbm9kZSBzaXplLgorCSAqLworCWlmIChkcC0+aV9kLmRpX2Zvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9MT0NBTCkgeworCQlyZXR2YWwgPSB4ZnNfZGlyX3Nob3J0Zm9ybV9yZW1vdmVuYW1lKCZhcmdzKTsKKwl9IGVsc2UgaWYgKHhmc19ibWFwX29uZV9ibG9jayhkcCwgWEZTX0RBVEFfRk9SSykpIHsKKwkJcmV0dmFsID0geGZzX2Rpcl9sZWFmX3JlbW92ZW5hbWUoJmFyZ3MsICZjb3VudCwgJnRvdGFsbGVuKTsKKwkJaWYgKHJldHZhbCA9PSAwKSB7CisJCQluZXdzaXplID0gWEZTX0RJUl9TRl9BTExGSVQoY291bnQsIHRvdGFsbGVuKTsKKwkJCWlmIChuZXdzaXplIDw9IFhGU19JRk9SS19EU0laRShkcCkpIHsKKwkJCQlyZXR2YWwgPSB4ZnNfZGlyX2xlYWZfdG9fc2hvcnRmb3JtKCZhcmdzKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXJldHZhbCA9IHhmc19kaXJfbm9kZV9yZW1vdmVuYW1lKCZhcmdzKTsKKwl9CisJcmV0dXJuKHJldHZhbCk7Cit9CisKK3N0YXRpYyBpbnQJCQkJCQkJLyogZXJyb3IgKi8KK3hmc19kaXJfbG9va3VwKHhmc190cmFuc190ICp0cmFucywgeGZzX2lub2RlX3QgKmRwLCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwKKwkJCQkgICB4ZnNfaW5vX3QgKmludW0pCit7CisJeGZzX2RhX2FyZ3NfdCBhcmdzOworCWludCByZXR2YWw7CisKKwlBU1NFUlQoKGRwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRkRJUik7CisKKwlYRlNfU1RBVFNfSU5DKHhzX2Rpcl9sb29rdXApOworCS8qCisJICogRmlsbCBpbiB0aGUgYXJnIHN0cnVjdHVyZSBmb3IgdGhpcyByZXF1ZXN0LgorCSAqLworCWFyZ3MubmFtZSA9IG5hbWU7CisJYXJncy5uYW1lbGVuID0gbmFtZWxlbjsKKwlhcmdzLmhhc2h2YWwgPSB4ZnNfZGFfaGFzaG5hbWUobmFtZSwgbmFtZWxlbik7CisJYXJncy5pbnVtYmVyID0gMDsKKwlhcmdzLmRwID0gZHA7CisJYXJncy5maXJzdGJsb2NrID0gTlVMTDsKKwlhcmdzLmZsaXN0ID0gTlVMTDsKKwlhcmdzLnRvdGFsID0gMDsKKwlhcmdzLndoaWNoZm9yayA9IFhGU19EQVRBX0ZPUks7CisJYXJncy50cmFucyA9IHRyYW5zOworCWFyZ3MuanVzdGNoZWNrID0gYXJncy5hZGRuYW1lID0gMDsKKwlhcmdzLm9rbm9lbnQgPSAxOworCisJLyoKKwkgKiBEZWNpZGUgb24gd2hhdCB3b3JrIHJvdXRpbmVzIHRvIGNhbGwgYmFzZWQgb24gdGhlIGlub2RlIHNpemUuCisJICovCisJaWYgKGRwLT5pX2QuZGlfZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0xPQ0FMKSB7CisJCXJldHZhbCA9IHhmc19kaXJfc2hvcnRmb3JtX2xvb2t1cCgmYXJncyk7CisJfSBlbHNlIGlmICh4ZnNfYm1hcF9vbmVfYmxvY2soZHAsIFhGU19EQVRBX0ZPUkspKSB7CisJCXJldHZhbCA9IHhmc19kaXJfbGVhZl9sb29rdXAoJmFyZ3MpOworCX0gZWxzZSB7CisJCXJldHZhbCA9IHhmc19kaXJfbm9kZV9sb29rdXAoJmFyZ3MpOworCX0KKwlpZiAocmV0dmFsID09IEVFWElTVCkKKwkJcmV0dmFsID0gMDsKKwkqaW51bSA9IGFyZ3MuaW51bWJlcjsKKwlyZXR1cm4ocmV0dmFsKTsKK30KKworLyoKKyAqIEltcGxlbWVudCByZWFkZGlyLgorICovCitzdGF0aWMgaW50CQkJCQkJCS8qIGVycm9yICovCit4ZnNfZGlyX2dldGRlbnRzKHhmc190cmFuc190ICp0cmFucywgeGZzX2lub2RlX3QgKmRwLCB1aW9fdCAqdWlvLCBpbnQgKmVvZnApCit7CisJeGZzX2RpcmVudF90ICpkYnA7CisJaW50ICBhbGlnbm1lbnQsIHJldHZhbDsKKwl4ZnNfZGlyX3B1dF90IHB1dDsKKworCVhGU19TVEFUU19JTkMoeHNfZGlyX2dldGRlbnRzKTsKKwlBU1NFUlQoKGRwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRkRJUik7CisKKwkvKgorCSAqIElmIG91ciBjYWxsZXIgaGFzIGdpdmVuIHVzIGEgc2luZ2xlIGNvbnRpZ3VvdXMgbWVtb3J5IGJ1ZmZlciwKKwkgKiBqdXN0IHdvcmsgZGlyZWN0bHkgd2l0aGluIHRoYXQgYnVmZmVyLiAgSWYgaXQncyBpbiB1c2VyIG1lbW9yeSwKKwkgKiBsb2NrIGl0IGRvd24gZmlyc3QuCisJICovCisJYWxpZ25tZW50ID0gc2l6ZW9mKHhmc19vZmZfdCkgLSAxOworCWlmICgodWlvLT51aW9faW92Y250ID09IDEpICYmCisJICAgICgoKF9fcHNpbnRfdCl1aW8tPnVpb19pb3ZbMF0uaW92X2Jhc2UgJiBhbGlnbm1lbnQpID09IDApICYmCisJICAgICgodWlvLT51aW9faW92WzBdLmlvdl9sZW4gJiBhbGlnbm1lbnQpID09IDApKSB7CisJCWRicCA9IE5VTEw7CisJCXB1dCA9IHhmc19kaXJfcHV0X2RpcmVudDY0X2RpcmVjdDsKKwl9IGVsc2UgeworCQlkYnAgPSBrbWVtX2FsbG9jKHNpemVvZigqZGJwKSArIE1BWE5BTUVMRU4sIEtNX1NMRUVQKTsKKwkJcHV0ID0geGZzX2Rpcl9wdXRfZGlyZW50NjRfdWlvOworCX0KKworCS8qCisJICogRGVjaWRlIG9uIHdoYXQgd29yayByb3V0aW5lcyB0byBjYWxsIGJhc2VkIG9uIHRoZSBpbm9kZSBzaXplLgorCSAqLworCSplb2ZwID0gMDsKKworCWlmIChkcC0+aV9kLmRpX2Zvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9MT0NBTCkgeworCQlyZXR2YWwgPSB4ZnNfZGlyX3Nob3J0Zm9ybV9nZXRkZW50cyhkcCwgdWlvLCBlb2ZwLCBkYnAsIHB1dCk7CisJfSBlbHNlIGlmICh4ZnNfYm1hcF9vbmVfYmxvY2soZHAsIFhGU19EQVRBX0ZPUkspKSB7CisJCXJldHZhbCA9IHhmc19kaXJfbGVhZl9nZXRkZW50cyh0cmFucywgZHAsIHVpbywgZW9mcCwgZGJwLCBwdXQpOworCX0gZWxzZSB7CisJCXJldHZhbCA9IHhmc19kaXJfbm9kZV9nZXRkZW50cyh0cmFucywgZHAsIHVpbywgZW9mcCwgZGJwLCBwdXQpOworCX0KKwlpZiAoZGJwICE9IE5VTEwpCisJCWttZW1fZnJlZShkYnAsIHNpemVvZigqZGJwKSArIE1BWE5BTUVMRU4pOworCisJcmV0dXJuKHJldHZhbCk7Cit9CisKK3N0YXRpYyBpbnQJCQkJCQkJLyogZXJyb3IgKi8KK3hmc19kaXJfcmVwbGFjZSh4ZnNfdHJhbnNfdCAqdHJhbnMsIHhmc19pbm9kZV90ICpkcCwgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sCisJCQkJICAgIHhmc19pbm9fdCBpbnVtLCB4ZnNfZnNibG9ja190ICpmaXJzdGJsb2NrLAorCQkJCSAgICB4ZnNfYm1hcF9mcmVlX3QgKmZsaXN0LCB4ZnNfZXh0bGVuX3QgdG90YWwpCit7CisJeGZzX2RhX2FyZ3NfdCBhcmdzOworCWludCByZXR2YWw7CisKKwlBU1NFUlQoKGRwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRkRJUik7CisKKwlpZiAoKHJldHZhbCA9IHhmc19kaXJfaW5vX3ZhbGlkYXRlKHRyYW5zLT50X21vdW50cCwgaW51bSkpKQorCQlyZXR1cm4gcmV0dmFsOworCisJLyoKKwkgKiBGaWxsIGluIHRoZSBhcmcgc3RydWN0dXJlIGZvciB0aGlzIHJlcXVlc3QuCisJICovCisJYXJncy5uYW1lID0gbmFtZTsKKwlhcmdzLm5hbWVsZW4gPSBuYW1lbGVuOworCWFyZ3MuaGFzaHZhbCA9IHhmc19kYV9oYXNobmFtZShuYW1lLCBuYW1lbGVuKTsKKwlhcmdzLmludW1iZXIgPSBpbnVtOworCWFyZ3MuZHAgPSBkcDsKKwlhcmdzLmZpcnN0YmxvY2sgPSBmaXJzdGJsb2NrOworCWFyZ3MuZmxpc3QgPSBmbGlzdDsKKwlhcmdzLnRvdGFsID0gdG90YWw7CisJYXJncy53aGljaGZvcmsgPSBYRlNfREFUQV9GT1JLOworCWFyZ3MudHJhbnMgPSB0cmFuczsKKwlhcmdzLmp1c3RjaGVjayA9IGFyZ3MuYWRkbmFtZSA9IGFyZ3Mub2tub2VudCA9IDA7CisKKwkvKgorCSAqIERlY2lkZSBvbiB3aGF0IHdvcmsgcm91dGluZXMgdG8gY2FsbCBiYXNlZCBvbiB0aGUgaW5vZGUgc2l6ZS4KKwkgKi8KKwlpZiAoZHAtPmlfZC5kaV9mb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpIHsKKwkJcmV0dmFsID0geGZzX2Rpcl9zaG9ydGZvcm1fcmVwbGFjZSgmYXJncyk7CisJfSBlbHNlIGlmICh4ZnNfYm1hcF9vbmVfYmxvY2soZHAsIFhGU19EQVRBX0ZPUkspKSB7CisJCXJldHZhbCA9IHhmc19kaXJfbGVhZl9yZXBsYWNlKCZhcmdzKTsKKwl9IGVsc2UgeworCQlyZXR2YWwgPSB4ZnNfZGlyX25vZGVfcmVwbGFjZSgmYXJncyk7CisJfQorCisJcmV0dXJuKHJldHZhbCk7Cit9CisKK3N0YXRpYyBpbnQKK3hmc19kaXJfc2hvcnRmb3JtX3ZhbGlkYXRlX29uZGlzayh4ZnNfbW91bnRfdCAqbXAsIHhmc19kaW5vZGVfdCAqZHApCit7CisJeGZzX2lub190CQlpbm87CisJaW50CQkJbmFtZWxlbl9zdW07CisJaW50CQkJY291bnQ7CisJeGZzX2Rpcl9zaG9ydGZvcm1fdAkqc2Y7CisJeGZzX2Rpcl9zZl9lbnRyeV90CSpzZmU7CisJaW50CQkJaTsKKworCisKKwlpZiAoKElOVF9HRVQoZHAtPmRpX2NvcmUuZGlfbW9kZSwgQVJDSF9DT05WRVJUKSAmIFNfSUZNVCkgIT0gU19JRkRJUikgeworCQlyZXR1cm4gMDsKKwl9CisJaWYgKElOVF9HRVQoZHAtPmRpX2NvcmUuZGlfZm9ybWF0LCBBUkNIX0NPTlZFUlQpICE9IFhGU19ESU5PREVfRk1UX0xPQ0FMKSB7CisJCXJldHVybiAwOworCX0KKwlpZiAoSU5UX0dFVChkcC0+ZGlfY29yZS5kaV9zaXplLCBBUkNIX0NPTlZFUlQpIDwgc2l6ZW9mKHNmLT5oZHIpKSB7CisJCXhmc19mc19jbW5fZXJyKENFX1dBUk4sIG1wLCAiSW52YWxpZCBzaG9ydGZvcm0gc2l6ZTogZHAgMHglcCIsCisJCQlkcCk7CisJCXJldHVybiAxOworCX0KKwlzZiA9ICh4ZnNfZGlyX3Nob3J0Zm9ybV90ICopKCZkcC0+ZGlfdS5kaV9kaXJzZik7CisJaW5vID0gWEZTX0dFVF9ESVJfSU5POChzZi0+aGRyLnBhcmVudCk7CisJaWYgKHhmc19kaXJfaW5vX3ZhbGlkYXRlKG1wLCBpbm8pKQorCQlyZXR1cm4gMTsKKworCWNvdW50ID0Jc2YtPmhkci5jb3VudDsKKwlpZiAoKGNvdW50IDwgMCkgfHwgKChjb3VudCAqIDEwKSA+IFhGU19MSVRJTk8obXApKSkgeworCQl4ZnNfZnNfY21uX2VycihDRV9XQVJOLCBtcCwKKwkJCSJJbnZhbGlkIHNob3J0Zm9ybSBjb3VudDogZHAgMHglcCIsIGRwKTsKKwkJcmV0dXJuKDEpOworCX0KKworCWlmIChjb3VudCA9PSAwKSB7CisJCXJldHVybiAwOworCX0KKworCW5hbWVsZW5fc3VtID0gMDsKKwlzZmUgPSAmc2YtPmxpc3RbMF07CisJZm9yIChpID0gc2YtPmhkci5jb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCWlubyA9IFhGU19HRVRfRElSX0lOTzgoc2ZlLT5pbnVtYmVyKTsKKwkJeGZzX2Rpcl9pbm9fdmFsaWRhdGUobXAsIGlubyk7CisJCWlmIChzZmUtPm5hbWVsZW4gPj0gWEZTX0xJVElOTyhtcCkpIHsKKwkJCXhmc19mc19jbW5fZXJyKENFX1dBUk4sIG1wLAorCQkJCSJJbnZhbGlkIHNob3J0Zm9ybSBuYW1lbGVuOiBkcCAweCVwIiwgZHApOworCQkJcmV0dXJuIDE7CisJCX0KKwkJbmFtZWxlbl9zdW0gKz0gc2ZlLT5uYW1lbGVuOworCQlzZmUgPSBYRlNfRElSX1NGX05FWFRFTlRSWShzZmUpOworCX0KKwlpZiAobmFtZWxlbl9zdW0gPj0gWEZTX0xJVElOTyhtcCkpIHsKKwkJeGZzX2ZzX2Ntbl9lcnIoQ0VfV0FSTiwgbXAsCisJCQkiSW52YWxpZCBzaG9ydGZvcm0gbmFtZWxlbjogZHAgMHglcCIsIGRwKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBFeHRlcm5hbCByb3V0aW5lcyB3aGVuIGRpcnNpemUgPT0gWEZTX0xCU0laRShkcC0+aV9tb3VudCkuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgKiBBZGQgYSBuYW1lIHRvIHRoZSBsZWFmIGRpcmVjdG9yeSBzdHJ1Y3R1cmUKKyAqIFRoaXMgaXMgdGhlIGV4dGVybmFsIHJvdXRpbmUuCisgKi8KK2ludAoreGZzX2Rpcl9sZWFmX2FkZG5hbWUoeGZzX2RhX2FyZ3NfdCAqYXJncykKK3sKKwlpbnQgaW5kZXgsIHJldHZhbDsKKwl4ZnNfZGFidWZfdCAqYnA7CisKKwlyZXR2YWwgPSB4ZnNfZGFfcmVhZF9idWYoYXJncy0+dHJhbnMsIGFyZ3MtPmRwLCAwLCAtMSwgJmJwLAorCQkJCQkgICAgICBYRlNfREFUQV9GT1JLKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4ocmV0dmFsKTsKKwlBU1NFUlQoYnAgIT0gTlVMTCk7CisKKwlyZXR2YWwgPSB4ZnNfZGlyX2xlYWZfbG9va3VwX2ludChicCwgYXJncywgJmluZGV4KTsKKwlpZiAocmV0dmFsID09IEVOT0VOVCkKKwkJcmV0dmFsID0geGZzX2Rpcl9sZWFmX2FkZChicCwgYXJncywgaW5kZXgpOworCXhmc19kYV9idWZfZG9uZShicCk7CisJcmV0dXJuKHJldHZhbCk7Cit9CisKKy8qCisgKiBSZW1vdmUgYSBuYW1lIGZyb20gdGhlIGxlYWYgZGlyZWN0b3J5IHN0cnVjdHVyZQorICogVGhpcyBpcyB0aGUgZXh0ZXJuYWwgcm91dGluZS4KKyAqLworU1RBVElDIGludAoreGZzX2Rpcl9sZWFmX3JlbW92ZW5hbWUoeGZzX2RhX2FyZ3NfdCAqYXJncywgaW50ICpjb3VudCwgaW50ICp0b3RhbGxlbikKK3sKKwl4ZnNfZGlyX2xlYWZibG9ja190ICpsZWFmOworCWludCBpbmRleCwgcmV0dmFsOworCXhmc19kYWJ1Zl90ICpicDsKKworCXJldHZhbCA9IHhmc19kYV9yZWFkX2J1ZihhcmdzLT50cmFucywgYXJncy0+ZHAsIDAsIC0xLCAmYnAsCisJCQkJCSAgICAgIFhGU19EQVRBX0ZPUkspOworCWlmIChyZXR2YWwpCisJCXJldHVybihyZXR2YWwpOworCUFTU0VSVChicCAhPSBOVUxMKTsKKwlsZWFmID0gYnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQobGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUl9MRUFGX01BR0lDKTsKKwlyZXR2YWwgPSB4ZnNfZGlyX2xlYWZfbG9va3VwX2ludChicCwgYXJncywgJmluZGV4KTsKKwlpZiAocmV0dmFsID09IEVFWElTVCkgeworCQkodm9pZCl4ZnNfZGlyX2xlYWZfcmVtb3ZlKGFyZ3MtPnRyYW5zLCBicCwgaW5kZXgpOworCQkqY291bnQgPSBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKTsKKwkJKnRvdGFsbGVuID0gSU5UX0dFVChsZWFmLT5oZHIubmFtZWJ5dGVzLCBBUkNIX0NPTlZFUlQpOworCQlyZXR2YWwgPSAwOworCX0KKwl4ZnNfZGFfYnVmX2RvbmUoYnApOworCXJldHVybihyZXR2YWwpOworfQorCisvKgorICogTG9vayB1cCBhIG5hbWUgaW4gYSBsZWFmIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuCisgKiBUaGlzIGlzIHRoZSBleHRlcm5hbCByb3V0aW5lLgorICovCitTVEFUSUMgaW50Cit4ZnNfZGlyX2xlYWZfbG9va3VwKHhmc19kYV9hcmdzX3QgKmFyZ3MpCit7CisJaW50IGluZGV4LCByZXR2YWw7CisJeGZzX2RhYnVmX3QgKmJwOworCisJcmV0dmFsID0geGZzX2RhX3JlYWRfYnVmKGFyZ3MtPnRyYW5zLCBhcmdzLT5kcCwgMCwgLTEsICZicCwKKwkJCQkJICAgICAgWEZTX0RBVEFfRk9SSyk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuKHJldHZhbCk7CisJQVNTRVJUKGJwICE9IE5VTEwpOworCXJldHZhbCA9IHhmc19kaXJfbGVhZl9sb29rdXBfaW50KGJwLCBhcmdzLCAmaW5kZXgpOworCXhmc19kYV9icmVsc2UoYXJncy0+dHJhbnMsIGJwKTsKKwlyZXR1cm4ocmV0dmFsKTsKK30KKworLyoKKyAqIENvcHkgb3V0IGRpcmVjdG9yeSBlbnRyaWVzIGZvciBnZXRkZW50cygpLCBmb3IgbGVhZiBkaXJlY3Rvcmllcy4KKyAqLworU1RBVElDIGludAoreGZzX2Rpcl9sZWFmX2dldGRlbnRzKHhmc190cmFuc190ICp0cmFucywgeGZzX2lub2RlX3QgKmRwLCB1aW9fdCAqdWlvLAorCQkJCSAgaW50ICplb2ZwLCB4ZnNfZGlyZW50X3QgKmRicCwgeGZzX2Rpcl9wdXRfdCBwdXQpCit7CisJeGZzX2RhYnVmX3QgKmJwOworCWludCByZXR2YWwsIGVvYjsKKworCXJldHZhbCA9IHhmc19kYV9yZWFkX2J1ZihkcC0+aV90cmFuc3AsIGRwLCAwLCAtMSwgJmJwLCBYRlNfREFUQV9GT1JLKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4ocmV0dmFsKTsKKwlBU1NFUlQoYnAgIT0gTlVMTCk7CisJcmV0dmFsID0geGZzX2Rpcl9sZWFmX2dldGRlbnRzX2ludChicCwgZHAsIDAsIHVpbywgJmVvYiwgZGJwLCBwdXQsIC0xKTsKKwl4ZnNfZGFfYnJlbHNlKHRyYW5zLCBicCk7CisJKmVvZnAgPSAoZW9iID09IDApOworCXJldHVybihyZXR2YWwpOworfQorCisvKgorICogTG9vayB1cCBhIG5hbWUgaW4gYSBsZWFmIGRpcmVjdG9yeSBzdHJ1Y3R1cmUsIHJlcGxhY2UgdGhlIGlub2RlIG51bWJlci4KKyAqIFRoaXMgaXMgdGhlIGV4dGVybmFsIHJvdXRpbmUuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19kaXJfbGVhZl9yZXBsYWNlKHhmc19kYV9hcmdzX3QgKmFyZ3MpCit7CisJaW50IGluZGV4LCByZXR2YWw7CisJeGZzX2RhYnVmX3QgKmJwOworCXhmc19pbm9fdCBpbnVtOworCXhmc19kaXJfbGVhZmJsb2NrX3QgKmxlYWY7CisJeGZzX2Rpcl9sZWFmX2VudHJ5X3QgKmVudHJ5OworCXhmc19kaXJfbGVhZl9uYW1lX3QgKm5hbWVzdDsKKworCWludW0gPSBhcmdzLT5pbnVtYmVyOworCXJldHZhbCA9IHhmc19kYV9yZWFkX2J1ZihhcmdzLT50cmFucywgYXJncy0+ZHAsIDAsIC0xLCAmYnAsCisJCQkJCSAgICAgIFhGU19EQVRBX0ZPUkspOworCWlmIChyZXR2YWwpCisJCXJldHVybihyZXR2YWwpOworCUFTU0VSVChicCAhPSBOVUxMKTsKKwlyZXR2YWwgPSB4ZnNfZGlyX2xlYWZfbG9va3VwX2ludChicCwgYXJncywgJmluZGV4KTsKKwlpZiAocmV0dmFsID09IEVFWElTVCkgeworCQlsZWFmID0gYnAtPmRhdGE7CisJCWVudHJ5ID0gJmxlYWYtPmVudHJpZXNbaW5kZXhdOworCQluYW1lc3QgPSBYRlNfRElSX0xFQUZfTkFNRVNUUlVDVChsZWFmLCBJTlRfR0VUKGVudHJ5LT5uYW1laWR4LCBBUkNIX0NPTlZFUlQpKTsKKwkJLyogWFhYIC0gcmVwbGFjZSBhc3NlcnQ/ICovCisJCVhGU19ESVJfU0ZfUFVUX0RJUklOTygmaW51bSwgJm5hbWVzdC0+aW51bWJlcik7CisJCXhmc19kYV9sb2dfYnVmKGFyZ3MtPnRyYW5zLCBicCwKKwkJICAgIFhGU19EQV9MT0dSQU5HRShsZWFmLCBuYW1lc3QsIHNpemVvZihuYW1lc3QtPmludW1iZXIpKSk7CisJCXhmc19kYV9idWZfZG9uZShicCk7CisJCXJldHZhbCA9IDA7CisJfSBlbHNlCisJCXhmc19kYV9icmVsc2UoYXJncy0+dHJhbnMsIGJwKTsKKwlyZXR1cm4ocmV0dmFsKTsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRXh0ZXJuYWwgcm91dGluZXMgd2hlbiBkaXJzaXplID4gWEZTX0xCU0laRShtcCkuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgKiBBZGQgYSBuYW1lIHRvIGEgQnRyZWUtZm9ybWF0IGRpcmVjdG9yeS4KKyAqCisgKiBUaGlzIHdpbGwgaW52b2x2ZSB3YWxraW5nIGRvd24gdGhlIEJ0cmVlLCBhbmQgbWF5IGludm9sdmUgc3BsaXR0aW5nCisgKiBsZWFmIG5vZGVzIGFuZCBldmVuIHNwbGl0dGluZyBpbnRlcm1lZGlhdGUgbm9kZXMgdXAgdG8gYW5kIGluY2x1ZGluZworICogdGhlIHJvb3Qgbm9kZSAoYSBzcGVjaWFsIGNhc2Ugb2YgYW4gaW50ZXJtZWRpYXRlIG5vZGUpLgorICovCitTVEFUSUMgaW50Cit4ZnNfZGlyX25vZGVfYWRkbmFtZSh4ZnNfZGFfYXJnc190ICphcmdzKQoreworCXhmc19kYV9zdGF0ZV90ICpzdGF0ZTsKKwl4ZnNfZGFfc3RhdGVfYmxrX3QgKmJsazsKKwlpbnQgcmV0dmFsLCBlcnJvcjsKKworCS8qCisJICogRmlsbCBpbiBidWNrZXQgb2YgYXJndW1lbnRzL3Jlc3VsdHMvY29udGV4dCB0byBjYXJyeSBhcm91bmQuCisJICovCisJc3RhdGUgPSB4ZnNfZGFfc3RhdGVfYWxsb2MoKTsKKwlzdGF0ZS0+YXJncyA9IGFyZ3M7CisJc3RhdGUtPm1wID0gYXJncy0+ZHAtPmlfbW91bnQ7CisJc3RhdGUtPmJsb2Nrc2l6ZSA9IHN0YXRlLT5tcC0+bV9zYi5zYl9ibG9ja3NpemU7CisJc3RhdGUtPm5vZGVfZW50cyA9IHN0YXRlLT5tcC0+bV9kaXJfbm9kZV9lbnRzOworCisJLyoKKwkgKiBTZWFyY2ggdG8gc2VlIGlmIG5hbWUgYWxyZWFkeSBleGlzdHMsIGFuZCBnZXQgYmFjayBhIHBvaW50ZXIKKwkgKiB0byB3aGVyZSBpdCBzaG91bGQgZ28uCisJICovCisJZXJyb3IgPSB4ZnNfZGFfbm9kZV9sb29rdXBfaW50KHN0YXRlLCAmcmV0dmFsKTsKKwlpZiAoZXJyb3IpCisJCXJldHZhbCA9IGVycm9yOworCWlmIChyZXR2YWwgIT0gRU5PRU5UKQorCQlnb3RvIGVycm9yOworCWJsayA9ICZzdGF0ZS0+cGF0aC5ibGtbIHN0YXRlLT5wYXRoLmFjdGl2ZS0xIF07CisJQVNTRVJUKGJsay0+bWFnaWMgPT0gWEZTX0RJUl9MRUFGX01BR0lDKTsKKwlyZXR2YWwgPSB4ZnNfZGlyX2xlYWZfYWRkKGJsay0+YnAsIGFyZ3MsIGJsay0+aW5kZXgpOworCWlmIChyZXR2YWwgPT0gMCkgeworCQkvKgorCQkgKiBBZGRpdGlvbiBzdWNjZWVkZWQsIHVwZGF0ZSBCdHJlZSBoYXNodmFscy4KKwkJICovCisJCWlmICghYXJncy0+anVzdGNoZWNrKQorCQkJeGZzX2RhX2ZpeGhhc2hwYXRoKHN0YXRlLCAmc3RhdGUtPnBhdGgpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIEFkZGl0aW9uIGZhaWxlZCwgc3BsaXQgYXMgbWFueSBCdHJlZSBlbGVtZW50cyBhcyByZXF1aXJlZC4KKwkJICovCisJCWlmIChhcmdzLT50b3RhbCA9PSAwKSB7CisJCQlBU1NFUlQocmV0dmFsID09IEVOT1NQQyk7CisJCQlnb3RvIGVycm9yOworCQl9CisJCXJldHZhbCA9IHhmc19kYV9zcGxpdChzdGF0ZSk7CisJfQorZXJyb3I6CisJeGZzX2RhX3N0YXRlX2ZyZWUoc3RhdGUpOworCisJcmV0dXJuKHJldHZhbCk7Cit9CisKKy8qCisgKiBSZW1vdmUgYSBuYW1lIGZyb20gYSBCLXRyZWUgZGlyZWN0b3J5LgorICoKKyAqIFRoaXMgd2lsbCBpbnZvbHZlIHdhbGtpbmcgZG93biB0aGUgQnRyZWUsIGFuZCBtYXkgaW52b2x2ZSBqb2luaW5nCisgKiBsZWFmIG5vZGVzIGFuZCBldmVuIGpvaW5pbmcgaW50ZXJtZWRpYXRlIG5vZGVzIHVwIHRvIGFuZCBpbmNsdWRpbmcKKyAqIHRoZSByb290IG5vZGUgKGEgc3BlY2lhbCBjYXNlIG9mIGFuIGludGVybWVkaWF0ZSBub2RlKS4KKyAqLworU1RBVElDIGludAoreGZzX2Rpcl9ub2RlX3JlbW92ZW5hbWUoeGZzX2RhX2FyZ3NfdCAqYXJncykKK3sKKwl4ZnNfZGFfc3RhdGVfdCAqc3RhdGU7CisJeGZzX2RhX3N0YXRlX2Jsa190ICpibGs7CisJaW50IHJldHZhbCwgZXJyb3I7CisKKwlzdGF0ZSA9IHhmc19kYV9zdGF0ZV9hbGxvYygpOworCXN0YXRlLT5hcmdzID0gYXJnczsKKwlzdGF0ZS0+bXAgPSBhcmdzLT5kcC0+aV9tb3VudDsKKwlzdGF0ZS0+YmxvY2tzaXplID0gc3RhdGUtPm1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZTsKKwlzdGF0ZS0+bm9kZV9lbnRzID0gc3RhdGUtPm1wLT5tX2Rpcl9ub2RlX2VudHM7CisKKwkvKgorCSAqIFNlYXJjaCB0byBzZWUgaWYgbmFtZSBleGlzdHMsIGFuZCBnZXQgYmFjayBhIHBvaW50ZXIgdG8gaXQuCisJICovCisJZXJyb3IgPSB4ZnNfZGFfbm9kZV9sb29rdXBfaW50KHN0YXRlLCAmcmV0dmFsKTsKKwlpZiAoZXJyb3IpCisJCXJldHZhbCA9IGVycm9yOworCWlmIChyZXR2YWwgIT0gRUVYSVNUKSB7CisJCXhmc19kYV9zdGF0ZV9mcmVlKHN0YXRlKTsKKwkJcmV0dXJuKHJldHZhbCk7CisJfQorCisJLyoKKwkgKiBSZW1vdmUgdGhlIG5hbWUgYW5kIHVwZGF0ZSB0aGUgaGFzaHZhbHMgaW4gdGhlIHRyZWUuCisJICovCisJYmxrID0gJnN0YXRlLT5wYXRoLmJsa1sgc3RhdGUtPnBhdGguYWN0aXZlLTEgXTsKKwlBU1NFUlQoYmxrLT5tYWdpYyA9PSBYRlNfRElSX0xFQUZfTUFHSUMpOworCXJldHZhbCA9IHhmc19kaXJfbGVhZl9yZW1vdmUoYXJncy0+dHJhbnMsIGJsay0+YnAsIGJsay0+aW5kZXgpOworCXhmc19kYV9maXhoYXNocGF0aChzdGF0ZSwgJnN0YXRlLT5wYXRoKTsKKworCS8qCisJICogQ2hlY2sgdG8gc2VlIGlmIHRoZSB0cmVlIG5lZWRzIHRvIGJlIGNvbGxhcHNlZC4KKwkgKi8KKwllcnJvciA9IDA7CisJaWYgKHJldHZhbCkgeworCQllcnJvciA9IHhmc19kYV9qb2luKHN0YXRlKTsKKwl9CisKKwl4ZnNfZGFfc3RhdGVfZnJlZShzdGF0ZSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4oZXJyb3IpOworCXJldHVybigwKTsKK30KKworLyoKKyAqIExvb2sgdXAgYSBmaWxlbmFtZSBpbiBhIGludCBkaXJlY3RvcnkuCisgKiBVc2UgYW4gaW50ZXJuYWwgcm91dGluZSB0byBhY3R1YWxseSBkbyBhbGwgdGhlIHdvcmsuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19kaXJfbm9kZV9sb29rdXAoeGZzX2RhX2FyZ3NfdCAqYXJncykKK3sKKwl4ZnNfZGFfc3RhdGVfdCAqc3RhdGU7CisJaW50IHJldHZhbCwgZXJyb3IsIGk7CisKKwlzdGF0ZSA9IHhmc19kYV9zdGF0ZV9hbGxvYygpOworCXN0YXRlLT5hcmdzID0gYXJnczsKKwlzdGF0ZS0+bXAgPSBhcmdzLT5kcC0+aV9tb3VudDsKKwlzdGF0ZS0+YmxvY2tzaXplID0gc3RhdGUtPm1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZTsKKwlzdGF0ZS0+bm9kZV9lbnRzID0gc3RhdGUtPm1wLT5tX2Rpcl9ub2RlX2VudHM7CisKKwkvKgorCSAqIFNlYXJjaCB0byBzZWUgaWYgbmFtZSBleGlzdHMsCisJICogYW5kIGdldCBiYWNrIGEgcG9pbnRlciB0byBpdC4KKwkgKi8KKwllcnJvciA9IHhmc19kYV9ub2RlX2xvb2t1cF9pbnQoc3RhdGUsICZyZXR2YWwpOworCWlmIChlcnJvcikgeworCQlyZXR2YWwgPSBlcnJvcjsKKwl9CisKKwkvKgorCSAqIElmIG5vdCBpbiBhIHRyYW5zYWN0aW9uLCB3ZSBoYXZlIHRvIHJlbGVhc2UgYWxsIHRoZSBidWZmZXJzLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBzdGF0ZS0+cGF0aC5hY3RpdmU7IGkrKykgeworCQl4ZnNfZGFfYnJlbHNlKGFyZ3MtPnRyYW5zLCBzdGF0ZS0+cGF0aC5ibGtbaV0uYnApOworCQlzdGF0ZS0+cGF0aC5ibGtbaV0uYnAgPSBOVUxMOworCX0KKworCXhmc19kYV9zdGF0ZV9mcmVlKHN0YXRlKTsKKwlyZXR1cm4ocmV0dmFsKTsKK30KKworU1RBVElDIGludAoreGZzX2Rpcl9ub2RlX2dldGRlbnRzKHhmc190cmFuc190ICp0cmFucywgeGZzX2lub2RlX3QgKmRwLCB1aW9fdCAqdWlvLAorCQkJCSAgaW50ICplb2ZwLCB4ZnNfZGlyZW50X3QgKmRicCwgeGZzX2Rpcl9wdXRfdCBwdXQpCit7CisJeGZzX2RhX2ludG5vZGVfdCAqbm9kZTsKKwl4ZnNfZGFfbm9kZV9lbnRyeV90ICpidHJlZTsKKwl4ZnNfZGlyX2xlYWZibG9ja190ICpsZWFmID0gTlVMTDsKKwl4ZnNfZGFibGtfdCBibm8sIG5leHRibm87CisJeGZzX2RhaGFzaF90IGNvb2toYXNoOworCXhmc19tb3VudF90ICptcDsKKwlpbnQgZXJyb3IsIGVvYiwgaTsKKwl4ZnNfZGFidWZfdCAqYnA7CisJeGZzX2RhZGRyX3QgbmV4dGRhOworCisJLyoKKwkgKiBQaWNrIHVwIG91ciBjb250ZXh0LgorCSAqLworCW1wID0gZHAtPmlfbW91bnQ7CisJYnAgPSBOVUxMOworCWJubyA9IFhGU19EQV9DT09LSUVfQk5PKG1wLCB1aW8tPnVpb19vZmZzZXQpOworCWNvb2toYXNoID0gWEZTX0RBX0NPT0tJRV9IQVNIKG1wLCB1aW8tPnVpb19vZmZzZXQpOworCisJeGZzX2Rpcl90cmFjZV9nX2R1KCJub2RlOiBzdGFydCIsIGRwLCB1aW8pOworCisJLyoKKwkgKiBSZS1maW5kIG91ciBwbGFjZSwgZXZlbiBpZiB3ZSdyZSBjb25mdXNlZCBhYm91dCB3aGF0IG91ciBwbGFjZSBpcy4KKwkgKgorCSAqIEZpcnN0IHdlIGNoZWNrIHRoZSBibG9jayBudW1iZXIgZnJvbSB0aGUgbWFnaWMgY29va2llLCBpdCBpcyBhCisJICogY2FjaGUgb2Ygd2hlcmUgd2UgZW5kZWQgbGFzdCB0aW1lLiAgSWYgd2UgZmluZCBhIGxlYWYgYmxvY2ssIGFuZAorCSAqIHRoZSBzdGFydGluZyBoYXNodmFsIGluIHRoYXQgYmxvY2sgaXMgbGVzcyB0aGFuIG91ciBkZXNpcmVkCisJICogaGFzaHZhbCwgdGhlbiB3ZSBydW4gd2l0aCBpdC4KKwkgKi8KKwlpZiAoYm5vID4gMCkgeworCQllcnJvciA9IHhmc19kYV9yZWFkX2J1Zih0cmFucywgZHAsIGJubywgLTIsICZicCwgWEZTX0RBVEFfRk9SSyk7CisJCWlmICgoZXJyb3IgIT0gMCkgJiYgKGVycm9yICE9IEVGU0NPUlJVUFRFRCkpCisJCQlyZXR1cm4oZXJyb3IpOworCQlpZiAoYnApCisJCQlsZWFmID0gYnAtPmRhdGE7CisJCWlmIChicCAmJiBJTlRfR0VUKGxlYWYtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpICE9IFhGU19ESVJfTEVBRl9NQUdJQykgeworCQkJeGZzX2Rpcl90cmFjZV9nX2R1Yigibm9kZTogYmxvY2sgbm90IGEgbGVhZiIsCisJCQkJCQkgICBkcCwgdWlvLCBibm8pOworCQkJeGZzX2RhX2JyZWxzZSh0cmFucywgYnApOworCQkJYnAgPSBOVUxMOworCQl9CisJCWlmIChicCAmJiBJTlRfR0VUKGxlYWYtPmVudHJpZXNbMF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSA+IGNvb2toYXNoKSB7CisJCQl4ZnNfZGlyX3RyYWNlX2dfZHViKCJub2RlOiBsZWFmIGhhc2ggdG9vIGxhcmdlIiwKKwkJCQkJCSAgIGRwLCB1aW8sIGJubyk7CisJCQl4ZnNfZGFfYnJlbHNlKHRyYW5zLCBicCk7CisJCQlicCA9IE5VTEw7CisJCX0KKwkJaWYgKGJwICYmCisJCSAgICBjb29raGFzaCA+IElOVF9HRVQobGVhZi0+ZW50cmllc1tJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAtIDFdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJCXhmc19kaXJfdHJhY2VfZ19kdWIoIm5vZGU6IGxlYWYgaGFzaCB0b28gc21hbGwiLAorCQkJCQkJICAgZHAsIHVpbywgYm5vKTsKKwkJCXhmc19kYV9icmVsc2UodHJhbnMsIGJwKTsKKwkJCWJwID0gTlVMTDsKKwkJfQorCX0KKworCS8qCisJICogSWYgd2UgZGlkIG5vdCBmaW5kIGEgbGVhZiBibG9jayBmcm9tIHRoZSBibG9ja25vIGluIHRoZSBjb29raWUsCisJICogb3Igd2UgdGhlcmUgd2FzIG5vIGJsb2Nrbm8gaW4gdGhlIGNvb2tpZSAoZWc6IGZpcnN0IHRpbWUgdGhydSksCisJICogdGhlIHdlIHN0YXJ0IGF0IHRoZSB0b3Agb2YgdGhlIEJ0cmVlIGFuZCByZS1maW5kIG91ciBoYXNodmFsLgorCSAqLworCWlmIChicCA9PSBOVUxMKSB7CisJCXhmc19kaXJfdHJhY2VfZ19kdSgibm9kZTogc3RhcnQgYXQgcm9vdCIgLCBkcCwgdWlvKTsKKwkJYm5vID0gMDsKKwkJZm9yICg7OykgeworCQkJZXJyb3IgPSB4ZnNfZGFfcmVhZF9idWYodHJhbnMsIGRwLCBibm8sIC0xLCAmYnAsCisJCQkJCQkgICAgICAgWEZTX0RBVEFfRk9SSyk7CisJCQlpZiAoZXJyb3IpCisJCQkJcmV0dXJuKGVycm9yKTsKKwkJCWlmIChicCA9PSBOVUxMKQorCQkJCXJldHVybihYRlNfRVJST1IoRUZTQ09SUlVQVEVEKSk7CisJCQlub2RlID0gYnAtPmRhdGE7CisJCQlpZiAoSU5UX0dFVChub2RlLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSAhPSBYRlNfREFfTk9ERV9NQUdJQykKKwkJCQlicmVhazsKKwkJCWJ0cmVlID0gJm5vZGUtPmJ0cmVlWzBdOworCQkJeGZzX2Rpcl90cmFjZV9nX2R1bigibm9kZTogbm9kZSBkZXRhaWwiLCBkcCwgdWlvLCBub2RlKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBJTlRfR0VUKG5vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKTsgYnRyZWUrKywgaSsrKSB7CisJCQkJaWYgKElOVF9HRVQoYnRyZWUtPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkgPj0gY29va2hhc2gpIHsKKwkJCQkJYm5vID0gSU5UX0dFVChidHJlZS0+YmVmb3JlLCBBUkNIX0NPTlZFUlQpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoaSA9PSBJTlRfR0VUKG5vZGUtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSkgeworCQkJCXhmc19kYV9icmVsc2UodHJhbnMsIGJwKTsKKwkJCQl4ZnNfZGlyX3RyYWNlX2dfZHUoIm5vZGU6IGhhc2ggYmV5b25kIEVPRiIsCisJCQkJCQkJICBkcCwgdWlvKTsKKwkJCQl1aW8tPnVpb19vZmZzZXQgPSBYRlNfREFfTUFLRV9DT09LSUUobXAsIDAsIDAsCisJCQkJCQkJICAgICBYRlNfREFfTUFYSEFTSCk7CisJCQkJKmVvZnAgPSAxOworCQkJCXJldHVybigwKTsKKwkJCX0KKwkJCXhmc19kaXJfdHJhY2VfZ19kdWIoIm5vZGU6IGdvaW5nIHRvIGJsb2NrIiwKKwkJCQkJCSAgIGRwLCB1aW8sIGJubyk7CisJCQl4ZnNfZGFfYnJlbHNlKHRyYW5zLCBicCk7CisJCX0KKwl9CisJQVNTRVJUKGNvb2toYXNoICE9IFhGU19EQV9NQVhIQVNIKTsKKworCS8qCisJICogV2UndmUgZHJvcHBlZCBkb3duIHRvIHRoZSAoZmlyc3QpIGxlYWYgYmxvY2sgdGhhdCBjb250YWlucyB0aGUKKwkgKiBoYXNodmFsIHdlIGFyZSBpbnRlcmVzdGVkIGluLiAgQ29udGludWUgcm9sbGluZyB1cHdhcmQgdGhydSB0aGUKKwkgKiBsZWFmIGJsb2NrcyB1bnRpbCB3ZSBmaWxsIHVwIG91ciBidWZmZXIuCisJICovCisJZm9yICg7OykgeworCQlsZWFmID0gYnAtPmRhdGE7CisJCWlmICh1bmxpa2VseShJTlRfR0VUKGxlYWYtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpICE9IFhGU19ESVJfTEVBRl9NQUdJQykpIHsKKwkJCXhmc19kaXJfdHJhY2VfZ19kdWwoIm5vZGU6IG5vdCBhIGxlYWYiLCBkcCwgdWlvLCBsZWFmKTsKKwkJCXhmc19kYV9icmVsc2UodHJhbnMsIGJwKTsKKwkJCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4ZnNfZGlyX25vZGVfZ2V0ZGVudHMoMSkiLAorCQkJCQkgICAgIFhGU19FUlJMRVZFTF9MT1csIG1wLCBsZWFmKTsKKwkJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwkJfQorCQl4ZnNfZGlyX3RyYWNlX2dfZHVsKCJub2RlOiBsZWFmIGRldGFpbCIsIGRwLCB1aW8sIGxlYWYpOworCQlpZiAoKG5leHRibm8gPSBJTlRfR0VUKGxlYWYtPmhkci5pbmZvLmZvcncsIEFSQ0hfQ09OVkVSVCkpKSB7CisJCQluZXh0ZGEgPSB4ZnNfZGFfcmVhZGFfYnVmKHRyYW5zLCBkcCwgbmV4dGJubywKKwkJCQkJCSAgWEZTX0RBVEFfRk9SSyk7CisJCX0gZWxzZQorCQkJbmV4dGRhID0gLTE7CisJCWVycm9yID0geGZzX2Rpcl9sZWFmX2dldGRlbnRzX2ludChicCwgZHAsIGJubywgdWlvLCAmZW9iLCBkYnAsCisJCQkJCQkgIHB1dCwgbmV4dGRhKTsKKwkJeGZzX2RhX2JyZWxzZSh0cmFucywgYnApOworCQlibm8gPSBuZXh0Ym5vOworCQlpZiAoZW9iKSB7CisJCQl4ZnNfZGlyX3RyYWNlX2dfZHViKCJub2RlOiBFLU8tQiIsIGRwLCB1aW8sIGJubyk7CisJCQkqZW9mcCA9IDA7CisJCQlyZXR1cm4oZXJyb3IpOworCQl9CisJCWlmIChibm8gPT0gMCkKKwkJCWJyZWFrOworCQllcnJvciA9IHhmc19kYV9yZWFkX2J1Zih0cmFucywgZHAsIGJubywgbmV4dGRhLCAmYnAsCisJCQkJCVhGU19EQVRBX0ZPUkspOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4oZXJyb3IpOworCQlpZiAodW5saWtlbHkoYnAgPT0gTlVMTCkpIHsKKwkJCVhGU19FUlJPUl9SRVBPUlQoInhmc19kaXJfbm9kZV9nZXRkZW50cygyKSIsCisJCQkJCSBYRlNfRVJSTEVWRUxfTE9XLCBtcCk7CisJCQlyZXR1cm4oWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCkpOworCQl9CisJfQorCSplb2ZwID0gMTsKKwl4ZnNfZGlyX3RyYWNlX2dfZHUoIm5vZGU6IEUtTy1GIiwgZHAsIHVpbyk7CisJcmV0dXJuKDApOworfQorCisvKgorICogTG9vayB1cCBhIGZpbGVuYW1lIGluIGFuIGludCBkaXJlY3RvcnksIHJlcGxhY2UgdGhlIGlub2RlIG51bWJlci4KKyAqIFVzZSBhbiBpbnRlcm5hbCByb3V0aW5lIHRvIGFjdHVhbGx5IGRvIHRoZSBsb29rdXAuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19kaXJfbm9kZV9yZXBsYWNlKHhmc19kYV9hcmdzX3QgKmFyZ3MpCit7CisJeGZzX2RhX3N0YXRlX3QgKnN0YXRlOworCXhmc19kYV9zdGF0ZV9ibGtfdCAqYmxrOworCXhmc19kaXJfbGVhZmJsb2NrX3QgKmxlYWY7CisJeGZzX2Rpcl9sZWFmX2VudHJ5X3QgKmVudHJ5OworCXhmc19kaXJfbGVhZl9uYW1lX3QgKm5hbWVzdDsKKwl4ZnNfaW5vX3QgaW51bTsKKwlpbnQgcmV0dmFsLCBlcnJvciwgaTsKKwl4ZnNfZGFidWZfdCAqYnA7CisKKwlzdGF0ZSA9IHhmc19kYV9zdGF0ZV9hbGxvYygpOworCXN0YXRlLT5hcmdzID0gYXJnczsKKwlzdGF0ZS0+bXAgPSBhcmdzLT5kcC0+aV9tb3VudDsKKwlzdGF0ZS0+YmxvY2tzaXplID0gc3RhdGUtPm1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZTsKKwlzdGF0ZS0+bm9kZV9lbnRzID0gc3RhdGUtPm1wLT5tX2Rpcl9ub2RlX2VudHM7CisJaW51bSA9IGFyZ3MtPmludW1iZXI7CisKKwkvKgorCSAqIFNlYXJjaCB0byBzZWUgaWYgbmFtZSBleGlzdHMsCisJICogYW5kIGdldCBiYWNrIGEgcG9pbnRlciB0byBpdC4KKwkgKi8KKwllcnJvciA9IHhmc19kYV9ub2RlX2xvb2t1cF9pbnQoc3RhdGUsICZyZXR2YWwpOworCWlmIChlcnJvcikgeworCQlyZXR2YWwgPSBlcnJvcjsKKwl9CisKKwlpZiAocmV0dmFsID09IEVFWElTVCkgeworCQlibGsgPSAmc3RhdGUtPnBhdGguYmxrW3N0YXRlLT5wYXRoLmFjdGl2ZSAtIDFdOworCQlBU1NFUlQoYmxrLT5tYWdpYyA9PSBYRlNfRElSX0xFQUZfTUFHSUMpOworCQlicCA9IGJsay0+YnA7CisJCWxlYWYgPSBicC0+ZGF0YTsKKwkJZW50cnkgPSAmbGVhZi0+ZW50cmllc1tibGstPmluZGV4XTsKKwkJbmFtZXN0ID0gWEZTX0RJUl9MRUFGX05BTUVTVFJVQ1QobGVhZiwgSU5UX0dFVChlbnRyeS0+bmFtZWlkeCwgQVJDSF9DT05WRVJUKSk7CisJCS8qIFhYWCAtIHJlcGxhY2UgYXNzZXJ0ID8gKi8KKwkJWEZTX0RJUl9TRl9QVVRfRElSSU5PKCZpbnVtLCAmbmFtZXN0LT5pbnVtYmVyKTsKKwkJeGZzX2RhX2xvZ19idWYoYXJncy0+dHJhbnMsIGJwLAorCQkgICAgWEZTX0RBX0xPR1JBTkdFKGxlYWYsIG5hbWVzdCwgc2l6ZW9mKG5hbWVzdC0+aW51bWJlcikpKTsKKwkJeGZzX2RhX2J1Zl9kb25lKGJwKTsKKwkJYmxrLT5icCA9IE5VTEw7CisJCXJldHZhbCA9IDA7CisJfSBlbHNlIHsKKwkJaSA9IHN0YXRlLT5wYXRoLmFjdGl2ZSAtIDE7CisJCXhmc19kYV9icmVsc2UoYXJncy0+dHJhbnMsIHN0YXRlLT5wYXRoLmJsa1tpXS5icCk7CisJCXN0YXRlLT5wYXRoLmJsa1tpXS5icCA9IE5VTEw7CisJfQorCWZvciAoaSA9IDA7IGkgPCBzdGF0ZS0+cGF0aC5hY3RpdmUgLSAxOyBpKyspIHsKKwkJeGZzX2RhX2JyZWxzZShhcmdzLT50cmFucywgc3RhdGUtPnBhdGguYmxrW2ldLmJwKTsKKwkJc3RhdGUtPnBhdGguYmxrW2ldLmJwID0gTlVMTDsKKwl9CisKKwl4ZnNfZGFfc3RhdGVfZnJlZShzdGF0ZSk7CisJcmV0dXJuKHJldHZhbCk7Cit9CisKKyNpZiBkZWZpbmVkKFhGU19ESVJfVFJBQ0UpCisvKgorICogQWRkIGEgdHJhY2UgYnVmZmVyIGVudHJ5IGZvciBhbiBpbm9kZSBhbmQgYSB1aW8uCisgKi8KK3ZvaWQKK3hmc19kaXJfdHJhY2VfZ19kdShjaGFyICp3aGVyZSwgeGZzX2lub2RlX3QgKmRwLCB1aW9fdCAqdWlvKQoreworCXhmc19kaXJfdHJhY2VfZW50ZXIoWEZTX0RJUl9LVFJBQ0VfR19EVSwgd2hlcmUsCisJCSAgICAgKHZvaWQgKilkcCwgKHZvaWQgKilkcC0+aV9tb3VudCwKKwkJICAgICAodm9pZCAqKSgodW5zaWduZWQgbG9uZykodWlvLT51aW9fb2Zmc2V0ID4+IDMyKSksCisJCSAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKHVpby0+dWlvX29mZnNldCAmIDB4RkZGRkZGRkYpKSwKKwkJICAgICAodm9pZCAqKSh1bnNpZ25lZCBsb25nKXVpby0+dWlvX3Jlc2lkLAorCQkgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworfQorCisvKgorICogQWRkIGEgdHJhY2UgYnVmZmVyIGVudHJ5IGZvciBhbiBpbm9kZSBhbmQgYSB1aW8uCisgKi8KK3ZvaWQKK3hmc19kaXJfdHJhY2VfZ19kdWIoY2hhciAqd2hlcmUsIHhmc19pbm9kZV90ICpkcCwgdWlvX3QgKnVpbywgeGZzX2RhYmxrX3QgYm5vKQoreworCXhmc19kaXJfdHJhY2VfZW50ZXIoWEZTX0RJUl9LVFJBQ0VfR19EVUIsIHdoZXJlLAorCQkgICAgICh2b2lkICopZHAsICh2b2lkICopZHAtPmlfbW91bnQsCisJCSAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKHVpby0+dWlvX29mZnNldCA+PiAzMikpLAorCQkgICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKSh1aW8tPnVpb19vZmZzZXQgJiAweEZGRkZGRkZGKSksCisJCSAgICAgKHZvaWQgKikodW5zaWduZWQgbG9uZyl1aW8tPnVpb19yZXNpZCwKKwkJICAgICAodm9pZCAqKSh1bnNpZ25lZCBsb25nKWJubywKKwkJICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKK30KKworLyoKKyAqIEFkZCBhIHRyYWNlIGJ1ZmZlciBlbnRyeSBmb3IgYW4gaW5vZGUgYW5kIGEgdWlvLgorICovCit2b2lkCit4ZnNfZGlyX3RyYWNlX2dfZHVuKGNoYXIgKndoZXJlLCB4ZnNfaW5vZGVfdCAqZHAsIHVpb190ICp1aW8sCisJCQl4ZnNfZGFfaW50bm9kZV90ICpub2RlKQoreworCWludAlsYXN0ID0gSU5UX0dFVChub2RlLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgLSAxOworCisJeGZzX2Rpcl90cmFjZV9lbnRlcihYRlNfRElSX0tUUkFDRV9HX0RVTiwgd2hlcmUsCisJCSAgICAgKHZvaWQgKilkcCwgKHZvaWQgKilkcC0+aV9tb3VudCwKKwkJICAgICAodm9pZCAqKSgodW5zaWduZWQgbG9uZykodWlvLT51aW9fb2Zmc2V0ID4+IDMyKSksCisJCSAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKHVpby0+dWlvX29mZnNldCAmIDB4RkZGRkZGRkYpKSwKKwkJICAgICAodm9pZCAqKSh1bnNpZ25lZCBsb25nKXVpby0+dWlvX3Jlc2lkLAorCQkgICAgICh2b2lkICopKHVuc2lnbmVkIGxvbmcpCisJCQlJTlRfR0VUKG5vZGUtPmhkci5pbmZvLmZvcncsIEFSQ0hfQ09OVkVSVCksCisJCSAgICAgKHZvaWQgKikodW5zaWduZWQgbG9uZykKKwkJCUlOVF9HRVQobm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpLAorCQkgICAgICh2b2lkICopKHVuc2lnbmVkIGxvbmcpCisJCQlJTlRfR0VUKG5vZGUtPmJ0cmVlWzBdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCksCisJCSAgICAgKHZvaWQgKikodW5zaWduZWQgbG9uZykKKwkJCUlOVF9HRVQobm9kZS0+YnRyZWVbbGFzdF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSwKKwkJICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKK30KKworLyoKKyAqIEFkZCBhIHRyYWNlIGJ1ZmZlciBlbnRyeSBmb3IgYW4gaW5vZGUgYW5kIGEgdWlvLgorICovCit2b2lkCit4ZnNfZGlyX3RyYWNlX2dfZHVsKGNoYXIgKndoZXJlLCB4ZnNfaW5vZGVfdCAqZHAsIHVpb190ICp1aW8sCisJCQl4ZnNfZGlyX2xlYWZibG9ja190ICpsZWFmKQoreworCWludAlsYXN0ID0gSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgLSAxOworCisJeGZzX2Rpcl90cmFjZV9lbnRlcihYRlNfRElSX0tUUkFDRV9HX0RVTCwgd2hlcmUsCisJCSAgICAgKHZvaWQgKilkcCwgKHZvaWQgKilkcC0+aV9tb3VudCwKKwkJICAgICAodm9pZCAqKSgodW5zaWduZWQgbG9uZykodWlvLT51aW9fb2Zmc2V0ID4+IDMyKSksCisJCSAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKHVpby0+dWlvX29mZnNldCAmIDB4RkZGRkZGRkYpKSwKKwkJICAgICAodm9pZCAqKSh1bnNpZ25lZCBsb25nKXVpby0+dWlvX3Jlc2lkLAorCQkgICAgICh2b2lkICopKHVuc2lnbmVkIGxvbmcpCisJCQlJTlRfR0VUKGxlYWYtPmhkci5pbmZvLmZvcncsIEFSQ0hfQ09OVkVSVCksCisJCSAgICAgKHZvaWQgKikodW5zaWduZWQgbG9uZykKKwkJCUlOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpLAorCQkgICAgICh2b2lkICopKHVuc2lnbmVkIGxvbmcpCisJCQlJTlRfR0VUKGxlYWYtPmVudHJpZXNbMF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSwKKwkJICAgICAodm9pZCAqKSh1bnNpZ25lZCBsb25nKQorCQkJSU5UX0dFVChsZWFmLT5lbnRyaWVzW2xhc3RdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCksCisJCSAgICAgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKKy8qCisgKiBBZGQgYSB0cmFjZSBidWZmZXIgZW50cnkgZm9yIGFuIGlub2RlIGFuZCBhIHVpby4KKyAqLwordm9pZAoreGZzX2Rpcl90cmFjZV9nX2R1ZShjaGFyICp3aGVyZSwgeGZzX2lub2RlX3QgKmRwLCB1aW9fdCAqdWlvLAorCQkJeGZzX2Rpcl9sZWFmX2VudHJ5X3QgKmVudHJ5KQoreworCXhmc19kaXJfdHJhY2VfZW50ZXIoWEZTX0RJUl9LVFJBQ0VfR19EVUUsIHdoZXJlLAorCQkgICAgICh2b2lkICopZHAsICh2b2lkICopZHAtPmlfbW91bnQsCisJCSAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKHVpby0+dWlvX29mZnNldCA+PiAzMikpLAorCQkgICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKSh1aW8tPnVpb19vZmZzZXQgJiAweEZGRkZGRkZGKSksCisJCSAgICAgKHZvaWQgKikodW5zaWduZWQgbG9uZyl1aW8tPnVpb19yZXNpZCwKKwkJICAgICAodm9pZCAqKSh1bnNpZ25lZCBsb25nKQorCQkJSU5UX0dFVChlbnRyeS0+aGFzaHZhbCwgQVJDSF9DT05WRVJUKSwKKwkJICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKK30KKworLyoKKyAqIEFkZCBhIHRyYWNlIGJ1ZmZlciBlbnRyeSBmb3IgYW4gaW5vZGUgYW5kIGEgdWlvLgorICovCit2b2lkCit4ZnNfZGlyX3RyYWNlX2dfZHVjKGNoYXIgKndoZXJlLCB4ZnNfaW5vZGVfdCAqZHAsIHVpb190ICp1aW8sIHhmc19vZmZfdCBjb29raWUpCit7CisJeGZzX2Rpcl90cmFjZV9lbnRlcihYRlNfRElSX0tUUkFDRV9HX0RVQywgd2hlcmUsCisJCSAgICAgKHZvaWQgKilkcCwgKHZvaWQgKilkcC0+aV9tb3VudCwKKwkJICAgICAodm9pZCAqKSgodW5zaWduZWQgbG9uZykodWlvLT51aW9fb2Zmc2V0ID4+IDMyKSksCisJCSAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKHVpby0+dWlvX29mZnNldCAmIDB4RkZGRkZGRkYpKSwKKwkJICAgICAodm9pZCAqKSh1bnNpZ25lZCBsb25nKXVpby0+dWlvX3Jlc2lkLAorCQkgICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKShjb29raWUgPj4gMzIpKSwKKwkJICAgICAodm9pZCAqKSgodW5zaWduZWQgbG9uZykoY29va2llICYgMHhGRkZGRkZGRikpLAorCQkgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworfQorCisvKgorICogQWRkIGEgdHJhY2UgYnVmZmVyIGVudHJ5IGZvciB0aGUgYXJndW1lbnRzIGdpdmVuIHRvIHRoZSByb3V0aW5lLAorICogZ2VuZXJpYyBmb3JtLgorICovCit2b2lkCit4ZnNfZGlyX3RyYWNlX2VudGVyKGludCB0eXBlLCBjaGFyICp3aGVyZSwKKwkJCXZvaWQgKiBhMCwgdm9pZCAqIGExLAorCQkJdm9pZCAqIGEyLCB2b2lkICogYTMsCisJCQl2b2lkICogYTQsIHZvaWQgKiBhNSwKKwkJCXZvaWQgKiBhNiwgdm9pZCAqIGE3LAorCQkJdm9pZCAqIGE4LCB2b2lkICogYTksCisJCQl2b2lkICogYTEwLCB2b2lkICogYTExKQoreworCUFTU0VSVCh4ZnNfZGlyX3RyYWNlX2J1Zik7CisJa3RyYWNlX2VudGVyKHhmc19kaXJfdHJhY2VfYnVmLCAodm9pZCAqKSh1bnNpZ25lZCBsb25nKXR5cGUsCisJCQkJCSh2b2lkICopd2hlcmUsCisJCQkJCSh2b2lkICopYTAsICh2b2lkICopYTEsICh2b2lkICopYTIsCisJCQkJCSh2b2lkICopYTMsICh2b2lkICopYTQsICh2b2lkICopYTUsCisJCQkJCSh2b2lkICopYTYsICh2b2lkICopYTcsICh2b2lkICopYTgsCisJCQkJCSh2b2lkICopYTksICh2b2lkICopYTEwLCAodm9pZCAqKWExMSwKKwkJCQkJTlVMTCwgTlVMTCk7Cit9CisjZW5kaWYJLyogWEZTX0RJUl9UUkFDRSAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXIuaCBiL2ZzL3hmcy94ZnNfZGlyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRiYzlmNQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfZGlyLmgKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19ESVJfSF9fCisjZGVmaW5lCV9fWEZTX0RJUl9IX18KKworLyoKKyAqIExhcmdlIGRpcmVjdG9yaWVzIGFyZSBzdHJ1Y3R1cmVkIGFyb3VuZCBCdHJlZXMgd2hlcmUgYWxsIHRoZSBkYXRhCisgKiBlbGVtZW50cyBhcmUgaW4gdGhlIGxlYWYgbm9kZXMuICBGaWxlbmFtZXMgYXJlIGhhc2hlZCBpbnRvIGFuIGludCwKKyAqIHRoZW4gdGhhdCBpbnQgaXMgdXNlZCBhcyB0aGUgaW5kZXggaW50byB0aGUgQnRyZWUuICBTaW5jZSB0aGUgaGFzaHZhbAorICogb2YgYSBmaWxlbmFtZSBtYXkgbm90IGJlIHVuaXF1ZSwgd2UgbWF5IGhhdmUgZHVwbGljYXRlIGtleXMuICBUaGUKKyAqIGludGVybmFsIGxpbmtzIGluIHRoZSBCdHJlZSBhcmUgbG9naWNhbCBibG9jayBvZmZzZXRzIGludG8gdGhlIGZpbGUuCisgKgorICogU21hbGwgZGlyZWN0b3JpZXMgdXNlIGEgZGlmZmVyZW50IGZvcm1hdCBhbmQgYXJlIHBhY2tlZCBhcyB0aWdodGx5CisgKiBhcyBwb3NzaWJsZSBzbyBhcyB0byBmaXQgaW50byB0aGUgbGl0ZXJhbCBhcmVhIG9mIHRoZSBpbm9kZS4KKyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRnVuY3Rpb24gcHJvdG90eXBlcyBmb3IgdGhlIGtlcm5lbC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RydWN0IHVpbzsKK3N0cnVjdCB4ZnNfYm1hcF9mcmVlOworc3RydWN0IHhmc19kYV9hcmdzOworc3RydWN0IHhmc19kaW5vZGU7CitzdHJ1Y3QgeGZzX2lub2RlOworc3RydWN0IHhmc19tb3VudDsKK3N0cnVjdCB4ZnNfdHJhbnM7CisKKy8qCisgKiBEaXJlY3RvcnkgZnVuY3Rpb24gdHlwZXMuCisgKiBQdXQgaW4gc3RydWN0dXJlcyAoeGZzX2Rpcm9wc190KSBmb3IgdjEgYW5kIHYyIGRpcmVjdG9yaWVzLgorICovCit0eXBlZGVmIHZvaWQJKCp4ZnNfZGlyX21vdW50X3QpKHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKK3R5cGVkZWYgaW50CSgqeGZzX2Rpcl9pc2VtcHR5X3QpKHN0cnVjdCB4ZnNfaW5vZGUgKmRwKTsKK3R5cGVkZWYgaW50CSgqeGZzX2Rpcl9pbml0X3QpKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLAorCQkJCSAgc3RydWN0IHhmc19pbm9kZSAqZHAsCisJCQkJICBzdHJ1Y3QgeGZzX2lub2RlICpwZHApOwordHlwZWRlZiBpbnQJKCp4ZnNfZGlyX2NyZWF0ZW5hbWVfdCkoc3RydWN0IHhmc190cmFucyAqdHAsCisJCQkJCXN0cnVjdCB4ZnNfaW5vZGUgKmRwLAorCQkJCQljaGFyICpuYW1lLAorCQkJCQlpbnQgbmFtZWxlbiwKKwkJCQkJeGZzX2lub190IGludW0sCisJCQkJCXhmc19mc2Jsb2NrX3QgKmZpcnN0LAorCQkJCQlzdHJ1Y3QgeGZzX2JtYXBfZnJlZSAqZmxpc3QsCisJCQkJCXhmc19leHRsZW5fdCB0b3RhbCk7Cit0eXBlZGVmIGludAkoKnhmc19kaXJfbG9va3VwX3QpKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLAorCQkJCSAgICBzdHJ1Y3QgeGZzX2lub2RlICpkcCwKKwkJCQkgICAgY2hhciAqbmFtZSwKKwkJCQkgICAgaW50IG5hbWVsZW4sCisJCQkJICAgIHhmc19pbm9fdCAqaW51bSk7Cit0eXBlZGVmIGludAkoKnhmc19kaXJfcmVtb3ZlbmFtZV90KShzdHJ1Y3QgeGZzX3RyYW5zICp0cCwKKwkJCQkJc3RydWN0IHhmc19pbm9kZSAqZHAsCisJCQkJCWNoYXIgKm5hbWUsCisJCQkJCWludCBuYW1lbGVuLAorCQkJCQl4ZnNfaW5vX3QgaW5vLAorCQkJCQl4ZnNfZnNibG9ja190ICpmaXJzdCwKKwkJCQkJc3RydWN0IHhmc19ibWFwX2ZyZWUgKmZsaXN0LAorCQkJCQl4ZnNfZXh0bGVuX3QgdG90YWwpOwordHlwZWRlZiBpbnQJKCp4ZnNfZGlyX2dldGRlbnRzX3QpKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLAorCQkJCSAgICAgIHN0cnVjdCB4ZnNfaW5vZGUgKmRwLAorCQkJCSAgICAgIHN0cnVjdCB1aW8gKnVpbywKKwkJCQkgICAgICBpbnQgKmVvZnApOwordHlwZWRlZiBpbnQJKCp4ZnNfZGlyX3JlcGxhY2VfdCkoc3RydWN0IHhmc190cmFucyAqdHAsCisJCQkJICAgICBzdHJ1Y3QgeGZzX2lub2RlICpkcCwKKwkJCQkgICAgIGNoYXIgKm5hbWUsCisJCQkJICAgICBpbnQgbmFtZWxlbiwKKwkJCQkgICAgIHhmc19pbm9fdCBpbnVtLAorCQkJCSAgICAgeGZzX2ZzYmxvY2tfdCAqZmlyc3QsCisJCQkJICAgICBzdHJ1Y3QgeGZzX2JtYXBfZnJlZSAqZmxpc3QsCisJCQkJICAgICB4ZnNfZXh0bGVuX3QgdG90YWwpOwordHlwZWRlZiBpbnQJKCp4ZnNfZGlyX2NhbmVudGVyX3QpKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLAorCQkJCSAgICAgIHN0cnVjdCB4ZnNfaW5vZGUgKmRwLAorCQkJCSAgICAgIGNoYXIgKm5hbWUsCisJCQkJICAgICAgaW50IG5hbWVsZW4pOwordHlwZWRlZiBpbnQJKCp4ZnNfZGlyX3Nob3J0Zm9ybV92YWxpZGF0ZV9vbmRpc2tfdCkoc3RydWN0IHhmc19tb3VudCAqbXAsCisJCQkJCQkgICAgICAgc3RydWN0IHhmc19kaW5vZGUgKmRpcCk7Cit0eXBlZGVmIGludAkoKnhmc19kaXJfc2hvcnRmb3JtX3RvX3NpbmdsZV90KShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlyb3BzIHsKKwl4ZnNfZGlyX21vdW50X3QJCQkJeGRfbW91bnQ7CisJeGZzX2Rpcl9pc2VtcHR5X3QJCQl4ZF9pc2VtcHR5OworCXhmc19kaXJfaW5pdF90CQkJCXhkX2luaXQ7CisJeGZzX2Rpcl9jcmVhdGVuYW1lX3QJCQl4ZF9jcmVhdGVuYW1lOworCXhmc19kaXJfbG9va3VwX3QJCQl4ZF9sb29rdXA7CisJeGZzX2Rpcl9yZW1vdmVuYW1lX3QJCQl4ZF9yZW1vdmVuYW1lOworCXhmc19kaXJfZ2V0ZGVudHNfdAkJCXhkX2dldGRlbnRzOworCXhmc19kaXJfcmVwbGFjZV90CQkJeGRfcmVwbGFjZTsKKwl4ZnNfZGlyX2NhbmVudGVyX3QJCQl4ZF9jYW5lbnRlcjsKKwl4ZnNfZGlyX3Nob3J0Zm9ybV92YWxpZGF0ZV9vbmRpc2tfdAl4ZF9zaG9ydGZvcm1fdmFsaWRhdGVfb25kaXNrOworCXhmc19kaXJfc2hvcnRmb3JtX3RvX3NpbmdsZV90CQl4ZF9zaG9ydGZvcm1fdG9fc2luZ2xlOworfSB4ZnNfZGlyb3BzX3Q7CisKKy8qCisgKiBPdmVyYWxsIGV4dGVybmFsIGludGVyZmFjZSByb3V0aW5lcy4KKyAqLwordm9pZAl4ZnNfZGlyX3N0YXJ0dXAodm9pZCk7CS8qIGNhbGxlZCBleGFjdGx5IG9uY2UgKi8KKworI2RlZmluZQlYRlNfRElSX01PVU5UKG1wKQlcCisJKChtcCktPm1fZGlyb3BzLnhkX21vdW50KG1wKSkKKyNkZWZpbmUJWEZTX0RJUl9JU0VNUFRZKG1wLGRwKQlcCisJKChtcCktPm1fZGlyb3BzLnhkX2lzZW1wdHkoZHApKQorI2RlZmluZQlYRlNfRElSX0lOSVQobXAsdHAsZHAscGRwKQlcCisJKChtcCktPm1fZGlyb3BzLnhkX2luaXQodHAsZHAscGRwKSkKKyNkZWZpbmUJWEZTX0RJUl9DUkVBVEVOQU1FKG1wLHRwLGRwLG5hbWUsbmFtZWxlbixpbnVtLGZpcnN0LGZsaXN0LHRvdGFsKSBcCisJKChtcCktPm1fZGlyb3BzLnhkX2NyZWF0ZW5hbWUodHAsZHAsbmFtZSxuYW1lbGVuLGludW0sZmlyc3QsZmxpc3QsXAorCQkJCSAgICAgIHRvdGFsKSkKKyNkZWZpbmUJWEZTX0RJUl9MT09LVVAobXAsdHAsZHAsbmFtZSxuYW1lbGVuLGludW0pCVwKKwkoKG1wKS0+bV9kaXJvcHMueGRfbG9va3VwKHRwLGRwLG5hbWUsbmFtZWxlbixpbnVtKSkKKyNkZWZpbmUJWEZTX0RJUl9SRU1PVkVOQU1FKG1wLHRwLGRwLG5hbWUsbmFtZWxlbixpbm8sZmlyc3QsZmxpc3QsdG90YWwpCVwKKwkoKG1wKS0+bV9kaXJvcHMueGRfcmVtb3ZlbmFtZSh0cCxkcCxuYW1lLG5hbWVsZW4saW5vLGZpcnN0LGZsaXN0LHRvdGFsKSkKKyNkZWZpbmUJWEZTX0RJUl9HRVRERU5UUyhtcCx0cCxkcCx1aW8sZW9mcCkJXAorCSgobXApLT5tX2Rpcm9wcy54ZF9nZXRkZW50cyh0cCxkcCx1aW8sZW9mcCkpCisjZGVmaW5lCVhGU19ESVJfUkVQTEFDRShtcCx0cCxkcCxuYW1lLG5hbWVsZW4saW51bSxmaXJzdCxmbGlzdCx0b3RhbCkJXAorCSgobXApLT5tX2Rpcm9wcy54ZF9yZXBsYWNlKHRwLGRwLG5hbWUsbmFtZWxlbixpbnVtLGZpcnN0LGZsaXN0LHRvdGFsKSkKKyNkZWZpbmUJWEZTX0RJUl9DQU5FTlRFUihtcCx0cCxkcCxuYW1lLG5hbWVsZW4pCVwKKwkoKG1wKS0+bV9kaXJvcHMueGRfY2FuZW50ZXIodHAsZHAsbmFtZSxuYW1lbGVuKSkKKyNkZWZpbmUJWEZTX0RJUl9TSE9SVEZPUk1fVkFMSURBVEVfT05ESVNLKG1wLGRpcCkJXAorCSgobXApLT5tX2Rpcm9wcy54ZF9zaG9ydGZvcm1fdmFsaWRhdGVfb25kaXNrKG1wLGRpcCkpCisjZGVmaW5lCVhGU19ESVJfU0hPUlRGT1JNX1RPX1NJTkdMRShtcCxhcmdzKQlcCisJKChtcCktPm1fZGlyb3BzLnhkX3Nob3J0Zm9ybV90b19zaW5nbGUoYXJncykpCisKKyNkZWZpbmUJWEZTX0RJUl9JU19WMShtcCkJKChtcCktPm1fZGlydmVyc2lvbiA9PSAxKQorZXh0ZXJuIHhmc19kaXJvcHNfdCB4ZnN2MV9kaXJvcHM7CisKKyNlbmRpZgkvKiBfX1hGU19ESVJfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RpcjIuYyBiL2ZzL3hmcy94ZnNfZGlyMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZmMwYTMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2RpcjIuYwpAQCAtMCwwICsxLDg1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworLyoKKyAqIFhGUyB2MiBkaXJlY3RvcnkgaW1wbG1lbnRhdGlvbi4KKyAqIFRvcC1sZXZlbCBhbmQgdXRpbGl0eSByb3V0aW5lcy4KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisKKyNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2FnLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19ibWFwLmgiCisjaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9sZWFmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfZGF0YS5oIgorI2luY2x1ZGUgInhmc19kaXIyX2xlYWYuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9ibG9jay5oIgorI2luY2x1ZGUgInhmc19kaXIyX25vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl90cmFjZS5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKKworLyoKKyAqIERlY2xhcmF0aW9ucyBmb3IgaW50ZXJmYWNlIHJvdXRpbmVzLgorICovCitzdGF0aWMgdm9pZAl4ZnNfZGlyMl9tb3VudCh4ZnNfbW91bnRfdCAqbXApOworc3RhdGljIGludAl4ZnNfZGlyMl9pc2VtcHR5KHhmc19pbm9kZV90ICpkcCk7CitzdGF0aWMgaW50CXhmc19kaXIyX2luaXQoeGZzX3RyYW5zX3QgKnRwLCB4ZnNfaW5vZGVfdCAqZHAsCisJCQkgICAgICB4ZnNfaW5vZGVfdCAqcGRwKTsKK3N0YXRpYyBpbnQJeGZzX2RpcjJfY3JlYXRlbmFtZSh4ZnNfdHJhbnNfdCAqdHAsIHhmc19pbm9kZV90ICpkcCwKKwkJCQkgICAgY2hhciAqbmFtZSwgaW50IG5hbWVsZW4sIHhmc19pbm9fdCBpbnVtLAorCQkJCSAgICB4ZnNfZnNibG9ja190ICpmaXJzdCwKKwkJCQkgICAgeGZzX2JtYXBfZnJlZV90ICpmbGlzdCwgeGZzX2V4dGxlbl90IHRvdGFsKTsKK3N0YXRpYyBpbnQJeGZzX2RpcjJfbG9va3VwKHhmc190cmFuc190ICp0cCwgeGZzX2lub2RlX3QgKmRwLCBjaGFyICpuYW1lLAorCQkJCWludCBuYW1lbGVuLCB4ZnNfaW5vX3QgKmludW0pOworc3RhdGljIGludAl4ZnNfZGlyMl9yZW1vdmVuYW1lKHhmc190cmFuc190ICp0cCwgeGZzX2lub2RlX3QgKmRwLAorCQkJCSAgICBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbiwgeGZzX2lub190IGlubywKKwkJCQkgICAgeGZzX2ZzYmxvY2tfdCAqZmlyc3QsCisJCQkJICAgIHhmc19ibWFwX2ZyZWVfdCAqZmxpc3QsIHhmc19leHRsZW5fdCB0b3RhbCk7CitzdGF0aWMgaW50CXhmc19kaXIyX2dldGRlbnRzKHhmc190cmFuc190ICp0cCwgeGZzX2lub2RlX3QgKmRwLCB1aW9fdCAqdWlvLAorCQkJCSAgaW50ICplb2ZwKTsKK3N0YXRpYyBpbnQJeGZzX2RpcjJfcmVwbGFjZSh4ZnNfdHJhbnNfdCAqdHAsIHhmc19pbm9kZV90ICpkcCwgY2hhciAqbmFtZSwKKwkJCQkgaW50IG5hbWVsZW4sIHhmc19pbm9fdCBpbnVtLAorCQkJCSB4ZnNfZnNibG9ja190ICpmaXJzdCwgeGZzX2JtYXBfZnJlZV90ICpmbGlzdCwKKwkJCQkgeGZzX2V4dGxlbl90IHRvdGFsKTsKK3N0YXRpYyBpbnQJeGZzX2RpcjJfY2FuZW50ZXIoeGZzX3RyYW5zX3QgKnRwLCB4ZnNfaW5vZGVfdCAqZHAsIGNoYXIgKm5hbWUsCisJCQkJICBpbnQgbmFtZWxlbik7CitzdGF0aWMgaW50CXhmc19kaXIyX3Nob3J0Zm9ybV92YWxpZGF0ZV9vbmRpc2soeGZzX21vdW50X3QgKm1wLAorCQkJCQkJICAgeGZzX2Rpbm9kZV90ICpkaXApOworCisvKgorICogVXRpbGl0eSByb3V0aW5lIGRlY2xhcmF0aW9ucy4KKyAqLworc3RhdGljIGludAl4ZnNfZGlyMl9wdXRfZGlyZW50NjRfZGlyZWN0KHhmc19kaXIyX3B1dF9hcmdzX3QgKnBhKTsKK3N0YXRpYyBpbnQJeGZzX2RpcjJfcHV0X2RpcmVudDY0X3Vpbyh4ZnNfZGlyMl9wdXRfYXJnc190ICpwYSk7CisKKy8qCisgKiBEaXJlY3Rvcnkgb3BlcmF0aW9ucyB2ZWN0b3IuCisgKi8KK3hmc19kaXJvcHNfdAl4ZnN2Ml9kaXJvcHMgPSB7CisJLnhkX21vdW50CQkJPSB4ZnNfZGlyMl9tb3VudCwKKwkueGRfaXNlbXB0eQkJCT0geGZzX2RpcjJfaXNlbXB0eSwKKwkueGRfaW5pdAkJCT0geGZzX2RpcjJfaW5pdCwKKwkueGRfY3JlYXRlbmFtZQkJCT0geGZzX2RpcjJfY3JlYXRlbmFtZSwKKwkueGRfbG9va3VwCQkJPSB4ZnNfZGlyMl9sb29rdXAsCisJLnhkX3JlbW92ZW5hbWUJCQk9IHhmc19kaXIyX3JlbW92ZW5hbWUsCisJLnhkX2dldGRlbnRzCQkJPSB4ZnNfZGlyMl9nZXRkZW50cywKKwkueGRfcmVwbGFjZQkJCT0geGZzX2RpcjJfcmVwbGFjZSwKKwkueGRfY2FuZW50ZXIJCQk9IHhmc19kaXIyX2NhbmVudGVyLAorCS54ZF9zaG9ydGZvcm1fdmFsaWRhdGVfb25kaXNrCT0geGZzX2RpcjJfc2hvcnRmb3JtX3ZhbGlkYXRlX29uZGlzaywKKwkueGRfc2hvcnRmb3JtX3RvX3NpbmdsZQkJPSB4ZnNfZGlyMl9zZl90b19ibG9jaywKK307CisKKy8qCisgKiBJbnRlcmZhY2Ugcm91dGluZXMuCisgKi8KKworLyoKKyAqIEluaXRpYWxpemUgZGlyZWN0b3J5LXJlbGF0ZWQgZmllbGRzIGluIHRoZSBtb3VudCBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyB2b2lkCit4ZnNfZGlyMl9tb3VudCgKKwl4ZnNfbW91bnRfdAkqbXApCQkvKiBmaWxlc3lzdGVtIG1vdW50IHBvaW50ICovCit7CisJbXAtPm1fZGlydmVyc2lvbiA9IDI7CisJQVNTRVJUKCgxIDw8IChtcC0+bV9zYi5zYl9ibG9ja2xvZyArIG1wLT5tX3NiLnNiX2RpcmJsa2xvZykpIDw9CisJICAgICAgIFhGU19NQVhfQkxPQ0tTSVpFKTsKKwltcC0+bV9kaXJibGtzaXplID0gMSA8PCAobXAtPm1fc2Iuc2JfYmxvY2tsb2cgKyBtcC0+bV9zYi5zYl9kaXJibGtsb2cpOworCW1wLT5tX2RpcmJsa2ZzYnMgPSAxIDw8IG1wLT5tX3NiLnNiX2RpcmJsa2xvZzsKKwltcC0+bV9kaXJkYXRhYmxrID0gWEZTX0RJUjJfREJfVE9fREEobXAsIFhGU19ESVIyX0RBVEFfRklSU1REQihtcCkpOworCW1wLT5tX2RpcmxlYWZibGsgPSBYRlNfRElSMl9EQl9UT19EQShtcCwgWEZTX0RJUjJfTEVBRl9GSVJTVERCKG1wKSk7CisJbXAtPm1fZGlyZnJlZWJsayA9IFhGU19ESVIyX0RCX1RPX0RBKG1wLCBYRlNfRElSMl9GUkVFX0ZJUlNUREIobXApKTsKKwltcC0+bV9hdHRyX25vZGVfZW50cyA9CisJCShtcC0+bV9zYi5zYl9ibG9ja3NpemUgLSAodWludClzaXplb2YoeGZzX2RhX25vZGVfaGRyX3QpKSAvCisJCSh1aW50KXNpemVvZih4ZnNfZGFfbm9kZV9lbnRyeV90KTsKKwltcC0+bV9kaXJfbm9kZV9lbnRzID0KKwkJKG1wLT5tX2RpcmJsa3NpemUgLSAodWludClzaXplb2YoeGZzX2RhX25vZGVfaGRyX3QpKSAvCisJCSh1aW50KXNpemVvZih4ZnNfZGFfbm9kZV9lbnRyeV90KTsKKwltcC0+bV9kaXJfbWFnaWNwY3QgPSAobXAtPm1fZGlyYmxrc2l6ZSAqIDM3KSAvIDEwMDsKK30KKworLyoKKyAqIFJldHVybiAxIGlmIGRpcmVjdG9yeSBjb250YWlucyBvbmx5ICIuIiBhbmQgIi4uIi4KKyAqLworc3RhdGljIGludAkJCQkvKiByZXR1cm4gY29kZSAqLworeGZzX2RpcjJfaXNlbXB0eSgKKwl4ZnNfaW5vZGVfdAkqZHApCQkvKiBpbmNvcmUgaW5vZGUgc3RydWN0dXJlICovCit7CisJeGZzX2RpcjJfc2ZfdAkqc2ZwOwkJLyogc2hvcnRmb3JtIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgKi8KKworCUFTU0VSVCgoZHAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSA9PSBTX0lGRElSKTsKKwkvKgorCSAqIE1pZ2h0IGhhcHBlbiBkdXJpbmcgc2h1dGRvd24uCisJICovCisJaWYgKGRwLT5pX2QuZGlfc2l6ZSA9PSAwKSB7CisJCXJldHVybiAxOworCX0KKwlpZiAoZHAtPmlfZC5kaV9zaXplID4gWEZTX0lGT1JLX0RTSVpFKGRwKSkKKwkJcmV0dXJuIDA7CisJc2ZwID0gKHhmc19kaXIyX3NmX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOworCXJldHVybiAhc2ZwLT5oZHIuY291bnQ7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIGEgZGlyZWN0b3J5IHdpdGggaXRzICIuIiBhbmQgIi4uIiBlbnRyaWVzLgorICovCitzdGF0aWMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9pbml0KAorCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfaW5vZGVfdAkqZHAsCQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCisJeGZzX2lub2RlX3QJKnBkcCkJCS8qIGluY29yZSBwYXJlbnQgZGlyZWN0b3J5IGlub2RlICovCit7CisJeGZzX2RhX2FyZ3NfdAlhcmdzOwkJLyogb3BlcmF0aW9uIGFyZ3VtZW50cyAqLworCWludAkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKworCW1lbXNldCgoY2hhciAqKSZhcmdzLCAwLCBzaXplb2YoYXJncykpOworCWFyZ3MuZHAgPSBkcDsKKwlhcmdzLnRyYW5zID0gdHA7CisJQVNTRVJUKChkcC0+aV9kLmRpX21vZGUgJiBTX0lGTVQpID09IFNfSUZESVIpOworCWlmICgoZXJyb3IgPSB4ZnNfZGlyX2lub192YWxpZGF0ZSh0cC0+dF9tb3VudHAsIHBkcC0+aV9pbm8pKSkgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCXJldHVybiB4ZnNfZGlyMl9zZl9jcmVhdGUoJmFyZ3MsIHBkcC0+aV9pbm8pOworfQorCisvKgorICBFbnRlciBhIG5hbWUgaW4gYSBkaXJlY3RvcnkuCisgKi8KK3N0YXRpYyBpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9jcmVhdGVuYW1lKAorCXhmc190cmFuc190CQkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2lub2RlX3QJCSpkcCwJCS8qIGluY29yZSBkaXJlY3RvcnkgaW5vZGUgKi8KKwljaGFyCQkJKm5hbWUsCQkvKiBuZXcgZW50cnkgbmFtZSAqLworCWludAkJCW5hbWVsZW4sCS8qIG5ldyBlbnRyeSBuYW1lIGxlbmd0aCAqLworCXhmc19pbm9fdAkJaW51bSwJCS8qIG5ldyBlbnRyeSBpbm9kZSBudW1iZXIgKi8KKwl4ZnNfZnNibG9ja190CQkqZmlyc3QsCQkvKiBibWFwJ3MgZmlyc3RibG9jayAqLworCXhmc19ibWFwX2ZyZWVfdAkJKmZsaXN0LAkJLyogYm1hcCdzIGZyZWVibG9jayBsaXN0ICovCisJeGZzX2V4dGxlbl90CQl0b3RhbCkJCS8qIGJtYXAncyB0b3RhbCBibG9jayBjb3VudCAqLworeworCXhmc19kYV9hcmdzX3QJCWFyZ3M7CQkvKiBvcGVyYXRpb24gYXJndW1lbnRzICovCisJaW50CQkJcnZhbDsJCS8qIHJldHVybiB2YWx1ZSAqLworCWludAkJCXY7CQkvKiB0eXBlLWNoZWNraW5nIHZhbHVlICovCisKKwlBU1NFUlQoKGRwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRkRJUik7CisJaWYgKChydmFsID0geGZzX2Rpcl9pbm9fdmFsaWRhdGUodHAtPnRfbW91bnRwLCBpbnVtKSkpIHsKKwkJcmV0dXJuIHJ2YWw7CisJfQorCVhGU19TVEFUU19JTkMoeHNfZGlyX2NyZWF0ZSk7CisJLyoKKwkgKiBGaWxsIGluIHRoZSBhcmcgc3RydWN0dXJlIGZvciB0aGlzIHJlcXVlc3QuCisJICovCisJYXJncy5uYW1lID0gbmFtZTsKKwlhcmdzLm5hbWVsZW4gPSBuYW1lbGVuOworCWFyZ3MuaGFzaHZhbCA9IHhmc19kYV9oYXNobmFtZShuYW1lLCBuYW1lbGVuKTsKKwlhcmdzLmludW1iZXIgPSBpbnVtOworCWFyZ3MuZHAgPSBkcDsKKwlhcmdzLmZpcnN0YmxvY2sgPSBmaXJzdDsKKwlhcmdzLmZsaXN0ID0gZmxpc3Q7CisJYXJncy50b3RhbCA9IHRvdGFsOworCWFyZ3Mud2hpY2hmb3JrID0gWEZTX0RBVEFfRk9SSzsKKwlhcmdzLnRyYW5zID0gdHA7CisJYXJncy5qdXN0Y2hlY2sgPSAwOworCWFyZ3MuYWRkbmFtZSA9IGFyZ3Mub2tub2VudCA9IDE7CisJLyoKKwkgKiBEZWNpZGUgb24gd2hhdCB3b3JrIHJvdXRpbmVzIHRvIGNhbGwgYmFzZWQgb24gdGhlIGlub2RlIHNpemUuCisJICovCisJaWYgKGRwLT5pX2QuZGlfZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0xPQ0FMKQorCQlydmFsID0geGZzX2RpcjJfc2ZfYWRkbmFtZSgmYXJncyk7CisJZWxzZSBpZiAoKHJ2YWwgPSB4ZnNfZGlyMl9pc2Jsb2NrKHRwLCBkcCwgJnYpKSkgeworCQlyZXR1cm4gcnZhbDsKKwl9IGVsc2UgaWYgKHYpCisJCXJ2YWwgPSB4ZnNfZGlyMl9ibG9ja19hZGRuYW1lKCZhcmdzKTsKKwllbHNlIGlmICgocnZhbCA9IHhmc19kaXIyX2lzbGVhZih0cCwgZHAsICZ2KSkpIHsKKwkJcmV0dXJuIHJ2YWw7CisJfSBlbHNlIGlmICh2KQorCQlydmFsID0geGZzX2RpcjJfbGVhZl9hZGRuYW1lKCZhcmdzKTsKKwllbHNlCisJCXJ2YWwgPSB4ZnNfZGlyMl9ub2RlX2FkZG5hbWUoJmFyZ3MpOworCXJldHVybiBydmFsOworfQorCisvKgorICogTG9va3VwIGEgbmFtZSBpbiBhIGRpcmVjdG9yeSwgZ2l2ZSBiYWNrIHRoZSBpbm9kZSBudW1iZXIuCisgKi8KK3N0YXRpYyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19kaXIyX2xvb2t1cCgKKwl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2lub2RlX3QJKmRwLAkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLworCWNoYXIJCSpuYW1lLAkJLyogbG9va3VwIG5hbWUgKi8KKwlpbnQJCW5hbWVsZW4sCS8qIGxvb2t1cCBuYW1lIGxlbmd0aCAqLworCXhmc19pbm9fdAkqaW51bSkJCS8qIG91dDogaW5vZGUgbnVtYmVyICovCit7CisJeGZzX2RhX2FyZ3NfdAlhcmdzOwkJLyogb3BlcmF0aW9uIGFyZ3VtZW50cyAqLworCWludAkJcnZhbDsJCS8qIHJldHVybiB2YWx1ZSAqLworCWludAkJdjsJCS8qIHR5cGUtY2hlY2tpbmcgdmFsdWUgKi8KKworCUFTU0VSVCgoZHAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSA9PSBTX0lGRElSKTsKKwlYRlNfU1RBVFNfSU5DKHhzX2Rpcl9sb29rdXApOworCisJLyoKKwkgKiBGaWxsIGluIHRoZSBhcmcgc3RydWN0dXJlIGZvciB0aGlzIHJlcXVlc3QuCisJICovCisJYXJncy5uYW1lID0gbmFtZTsKKwlhcmdzLm5hbWVsZW4gPSBuYW1lbGVuOworCWFyZ3MuaGFzaHZhbCA9IHhmc19kYV9oYXNobmFtZShuYW1lLCBuYW1lbGVuKTsKKwlhcmdzLmludW1iZXIgPSAwOworCWFyZ3MuZHAgPSBkcDsKKwlhcmdzLmZpcnN0YmxvY2sgPSBOVUxMOworCWFyZ3MuZmxpc3QgPSBOVUxMOworCWFyZ3MudG90YWwgPSAwOworCWFyZ3Mud2hpY2hmb3JrID0gWEZTX0RBVEFfRk9SSzsKKwlhcmdzLnRyYW5zID0gdHA7CisJYXJncy5qdXN0Y2hlY2sgPSBhcmdzLmFkZG5hbWUgPSAwOworCWFyZ3Mub2tub2VudCA9IDE7CisJLyoKKwkgKiBEZWNpZGUgb24gd2hhdCB3b3JrIHJvdXRpbmVzIHRvIGNhbGwgYmFzZWQgb24gdGhlIGlub2RlIHNpemUuCisJICovCisJaWYgKGRwLT5pX2QuZGlfZm9ybWF0ID09IFhGU19ESU5PREVfRk1UX0xPQ0FMKQorCQlydmFsID0geGZzX2RpcjJfc2ZfbG9va3VwKCZhcmdzKTsKKwllbHNlIGlmICgocnZhbCA9IHhmc19kaXIyX2lzYmxvY2sodHAsIGRwLCAmdikpKSB7CisJCXJldHVybiBydmFsOworCX0gZWxzZSBpZiAodikKKwkJcnZhbCA9IHhmc19kaXIyX2Jsb2NrX2xvb2t1cCgmYXJncyk7CisJZWxzZSBpZiAoKHJ2YWwgPSB4ZnNfZGlyMl9pc2xlYWYodHAsIGRwLCAmdikpKSB7CisJCXJldHVybiBydmFsOworCX0gZWxzZSBpZiAodikKKwkJcnZhbCA9IHhmc19kaXIyX2xlYWZfbG9va3VwKCZhcmdzKTsKKwllbHNlCisJCXJ2YWwgPSB4ZnNfZGlyMl9ub2RlX2xvb2t1cCgmYXJncyk7CisJaWYgKHJ2YWwgPT0gRUVYSVNUKQorCQlydmFsID0gMDsKKwlpZiAocnZhbCA9PSAwKQorCQkqaW51bSA9IGFyZ3MuaW51bWJlcjsKKwlyZXR1cm4gcnZhbDsKK30KKworLyoKKyAqIFJlbW92ZSBhbiBlbnRyeSBmcm9tIGEgZGlyZWN0b3J5LgorICovCitzdGF0aWMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9yZW1vdmVuYW1lKAorCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfaW5vZGVfdAkqZHAsCQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCisJY2hhcgkJKm5hbWUsCQkvKiBuYW1lIG9mIGVudHJ5IHRvIHJlbW92ZSAqLworCWludAkJbmFtZWxlbiwJLyogbmFtZSBsZW5ndGggb2YgZW50cnkgdG8gcmVtb3ZlICovCisJeGZzX2lub190CWlubywJCS8qIGlub2RlIG51bWJlciBvZiBlbnRyeSB0byByZW1vdmUgKi8KKwl4ZnNfZnNibG9ja190CSpmaXJzdCwJCS8qIGJtYXAncyBmaXJzdGJsb2NrICovCisJeGZzX2JtYXBfZnJlZV90CSpmbGlzdCwJCS8qIGJtYXAncyBmcmVlYmxvY2sgbGlzdCAqLworCXhmc19leHRsZW5fdAl0b3RhbCkJCS8qIGJtYXAncyB0b3RhbCBibG9jayBjb3VudCAqLworeworCXhmc19kYV9hcmdzX3QJYXJnczsJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KKwlpbnQJCXJ2YWw7CQkvKiByZXR1cm4gdmFsdWUgKi8KKwlpbnQJCXY7CQkvKiB0eXBlLWNoZWNraW5nIHZhbHVlICovCisKKwlBU1NFUlQoKGRwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRkRJUik7CisJWEZTX1NUQVRTX0lOQyh4c19kaXJfcmVtb3ZlKTsKKwkvKgorCSAqIEZpbGwgaW4gdGhlIGFyZyBzdHJ1Y3R1cmUgZm9yIHRoaXMgcmVxdWVzdC4KKwkgKi8KKwlhcmdzLm5hbWUgPSBuYW1lOworCWFyZ3MubmFtZWxlbiA9IG5hbWVsZW47CisJYXJncy5oYXNodmFsID0geGZzX2RhX2hhc2huYW1lKG5hbWUsIG5hbWVsZW4pOworCWFyZ3MuaW51bWJlciA9IGlubzsKKwlhcmdzLmRwID0gZHA7CisJYXJncy5maXJzdGJsb2NrID0gZmlyc3Q7CisJYXJncy5mbGlzdCA9IGZsaXN0OworCWFyZ3MudG90YWwgPSB0b3RhbDsKKwlhcmdzLndoaWNoZm9yayA9IFhGU19EQVRBX0ZPUks7CisJYXJncy50cmFucyA9IHRwOworCWFyZ3MuanVzdGNoZWNrID0gYXJncy5hZGRuYW1lID0gYXJncy5va25vZW50ID0gMDsKKwkvKgorCSAqIERlY2lkZSBvbiB3aGF0IHdvcmsgcm91dGluZXMgdG8gY2FsbCBiYXNlZCBvbiB0aGUgaW5vZGUgc2l6ZS4KKwkgKi8KKwlpZiAoZHAtPmlfZC5kaV9mb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpCisJCXJ2YWwgPSB4ZnNfZGlyMl9zZl9yZW1vdmVuYW1lKCZhcmdzKTsKKwllbHNlIGlmICgocnZhbCA9IHhmc19kaXIyX2lzYmxvY2sodHAsIGRwLCAmdikpKSB7CisJCXJldHVybiBydmFsOworCX0gZWxzZSBpZiAodikKKwkJcnZhbCA9IHhmc19kaXIyX2Jsb2NrX3JlbW92ZW5hbWUoJmFyZ3MpOworCWVsc2UgaWYgKChydmFsID0geGZzX2RpcjJfaXNsZWFmKHRwLCBkcCwgJnYpKSkgeworCQlyZXR1cm4gcnZhbDsKKwl9IGVsc2UgaWYgKHYpCisJCXJ2YWwgPSB4ZnNfZGlyMl9sZWFmX3JlbW92ZW5hbWUoJmFyZ3MpOworCWVsc2UKKwkJcnZhbCA9IHhmc19kaXIyX25vZGVfcmVtb3ZlbmFtZSgmYXJncyk7CisJcmV0dXJuIHJ2YWw7Cit9CisKKy8qCisgKiBSZWFkIGEgZGlyZWN0b3J5LgorICovCitzdGF0aWMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9nZXRkZW50cygKKwl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2lub2RlX3QJKmRwLAkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLworCXVpb190CQkqdWlvLAkJLyogY2FsbGVyJ3MgYnVmZmVyIGNvbnRyb2wgKi8KKwlpbnQJCSplb2ZwKQkJLyogb3V0OiBlb2YgcmVhY2hlZCAqLworeworCWludAkJYWxpZ25tZW50OwkvKiBhbGlnbm1lbnQgcmVxdWlyZWQgZm9yIEFCSSAqLworCXhmc19kaXJlbnRfdAkqZGJwOwkJLyogbWFsbG9jJ2VkIGJ1ZmZlciAqLworCXhmc19kaXIyX3B1dF90CXB1dDsJCS8qIGVudHJ5IGZvcm1hdHRpbmcgcm91dGluZSAqLworCWludAkJcnZhbDsJCS8qIHJldHVybiB2YWx1ZSAqLworCWludAkJdjsJCS8qIHR5cGUtY2hlY2tpbmcgdmFsdWUgKi8KKworCUFTU0VSVCgoZHAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSA9PSBTX0lGRElSKTsKKwlYRlNfU1RBVFNfSU5DKHhzX2Rpcl9nZXRkZW50cyk7CisJLyoKKwkgKiBJZiBvdXIgY2FsbGVyIGhhcyBnaXZlbiB1cyBhIHNpbmdsZSBjb250aWd1b3VzIGFsaWduZWQgbWVtb3J5IGJ1ZmZlciwKKwkgKiBqdXN0IHdvcmsgZGlyZWN0bHkgd2l0aGluIHRoYXQgYnVmZmVyLiAgSWYgaXQncyBpbiB1c2VyIG1lbW9yeSwKKwkgKiBsb2NrIGl0IGRvd24gZmlyc3QuCisJICovCisJYWxpZ25tZW50ID0gc2l6ZW9mKHhmc19vZmZfdCkgLSAxOworCWlmICgodWlvLT51aW9faW92Y250ID09IDEpICYmCisJICAgICgoKF9fcHNpbnRfdCl1aW8tPnVpb19pb3ZbMF0uaW92X2Jhc2UgJiBhbGlnbm1lbnQpID09IDApICYmCisJICAgICgodWlvLT51aW9faW92WzBdLmlvdl9sZW4gJiBhbGlnbm1lbnQpID09IDApKSB7CisJCWRicCA9IE5VTEw7CisJCXB1dCA9IHhmc19kaXIyX3B1dF9kaXJlbnQ2NF9kaXJlY3Q7CisJfSBlbHNlIHsKKwkJZGJwID0ga21lbV9hbGxvYyhzaXplb2YoKmRicCkgKyBNQVhOQU1FTEVOLCBLTV9TTEVFUCk7CisJCXB1dCA9IHhmc19kaXIyX3B1dF9kaXJlbnQ2NF91aW87CisJfQorCisJKmVvZnAgPSAwOworCS8qCisJICogRGVjaWRlIG9uIHdoYXQgd29yayByb3V0aW5lcyB0byBjYWxsIGJhc2VkIG9uIHRoZSBpbm9kZSBzaXplLgorCSAqLworCWlmIChkcC0+aV9kLmRpX2Zvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9MT0NBTCkKKwkJcnZhbCA9IHhmc19kaXIyX3NmX2dldGRlbnRzKGRwLCB1aW8sIGVvZnAsIGRicCwgcHV0KTsKKwllbHNlIGlmICgocnZhbCA9IHhmc19kaXIyX2lzYmxvY2sodHAsIGRwLCAmdikpKSB7CisJCTsKKwl9IGVsc2UgaWYgKHYpCisJCXJ2YWwgPSB4ZnNfZGlyMl9ibG9ja19nZXRkZW50cyh0cCwgZHAsIHVpbywgZW9mcCwgZGJwLCBwdXQpOworCWVsc2UKKwkJcnZhbCA9IHhmc19kaXIyX2xlYWZfZ2V0ZGVudHModHAsIGRwLCB1aW8sIGVvZnAsIGRicCwgcHV0KTsKKwlpZiAoZGJwICE9IE5VTEwpCisJCWttZW1fZnJlZShkYnAsIHNpemVvZigqZGJwKSArIE1BWE5BTUVMRU4pOworCXJldHVybiBydmFsOworfQorCisvKgorICogUmVwbGFjZSB0aGUgaW5vZGUgbnVtYmVyIG9mIGEgZGlyZWN0b3J5IGVudHJ5LgorICovCitzdGF0aWMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9yZXBsYWNlKAorCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfaW5vZGVfdAkqZHAsCQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCisJY2hhcgkJKm5hbWUsCQkvKiBuYW1lIG9mIGVudHJ5IHRvIHJlcGxhY2UgKi8KKwlpbnQJCW5hbWVsZW4sCS8qIG5hbWUgbGVuZ3RoIG9mIGVudHJ5IHRvIHJlcGxhY2UgKi8KKwl4ZnNfaW5vX3QJaW51bSwJCS8qIG5ldyBpbm9kZSBudW1iZXIgKi8KKwl4ZnNfZnNibG9ja190CSpmaXJzdCwJCS8qIGJtYXAncyBmaXJzdGJsb2NrICovCisJeGZzX2JtYXBfZnJlZV90CSpmbGlzdCwJCS8qIGJtYXAncyBmcmVlYmxvY2sgbGlzdCAqLworCXhmc19leHRsZW5fdAl0b3RhbCkJCS8qIGJtYXAncyB0b3RhbCBibG9jayBjb3VudCAqLworeworCXhmc19kYV9hcmdzX3QJYXJnczsJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KKwlpbnQJCXJ2YWw7CQkvKiByZXR1cm4gdmFsdWUgKi8KKwlpbnQJCXY7CQkvKiB0eXBlLWNoZWNraW5nIHZhbHVlICovCisKKwlBU1NFUlQoKGRwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRkRJUik7CisKKwlpZiAoKHJ2YWwgPSB4ZnNfZGlyX2lub192YWxpZGF0ZSh0cC0+dF9tb3VudHAsIGludW0pKSkgeworCQlyZXR1cm4gcnZhbDsKKwl9CisJLyoKKwkgKiBGaWxsIGluIHRoZSBhcmcgc3RydWN0dXJlIGZvciB0aGlzIHJlcXVlc3QuCisJICovCisJYXJncy5uYW1lID0gbmFtZTsKKwlhcmdzLm5hbWVsZW4gPSBuYW1lbGVuOworCWFyZ3MuaGFzaHZhbCA9IHhmc19kYV9oYXNobmFtZShuYW1lLCBuYW1lbGVuKTsKKwlhcmdzLmludW1iZXIgPSBpbnVtOworCWFyZ3MuZHAgPSBkcDsKKwlhcmdzLmZpcnN0YmxvY2sgPSBmaXJzdDsKKwlhcmdzLmZsaXN0ID0gZmxpc3Q7CisJYXJncy50b3RhbCA9IHRvdGFsOworCWFyZ3Mud2hpY2hmb3JrID0gWEZTX0RBVEFfRk9SSzsKKwlhcmdzLnRyYW5zID0gdHA7CisJYXJncy5qdXN0Y2hlY2sgPSBhcmdzLmFkZG5hbWUgPSBhcmdzLm9rbm9lbnQgPSAwOworCS8qCisJICogRGVjaWRlIG9uIHdoYXQgd29yayByb3V0aW5lcyB0byBjYWxsIGJhc2VkIG9uIHRoZSBpbm9kZSBzaXplLgorCSAqLworCWlmIChkcC0+aV9kLmRpX2Zvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9MT0NBTCkKKwkJcnZhbCA9IHhmc19kaXIyX3NmX3JlcGxhY2UoJmFyZ3MpOworCWVsc2UgaWYgKChydmFsID0geGZzX2RpcjJfaXNibG9jayh0cCwgZHAsICZ2KSkpIHsKKwkJcmV0dXJuIHJ2YWw7CisJfSBlbHNlIGlmICh2KQorCQlydmFsID0geGZzX2RpcjJfYmxvY2tfcmVwbGFjZSgmYXJncyk7CisJZWxzZSBpZiAoKHJ2YWwgPSB4ZnNfZGlyMl9pc2xlYWYodHAsIGRwLCAmdikpKSB7CisJCXJldHVybiBydmFsOworCX0gZWxzZSBpZiAodikKKwkJcnZhbCA9IHhmc19kaXIyX2xlYWZfcmVwbGFjZSgmYXJncyk7CisJZWxzZQorCQlydmFsID0geGZzX2RpcjJfbm9kZV9yZXBsYWNlKCZhcmdzKTsKKwlyZXR1cm4gcnZhbDsKK30KKworLyoKKyAqIFNlZSBpZiB0aGlzIGVudHJ5IGNhbiBiZSBhZGRlZCB0byB0aGUgZGlyZWN0b3J5IHdpdGhvdXQgYWxsb2NhdGluZyBzcGFjZS4KKyAqLworc3RhdGljIGludAkJCQkvKiBlcnJvciAqLworeGZzX2RpcjJfY2FuZW50ZXIoCisJeGZzX3RyYW5zX3QJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19pbm9kZV90CSpkcCwJCS8qIGluY29yZSBkaXJlY3RvcnkgaW5vZGUgKi8KKwljaGFyCQkqbmFtZSwJCS8qIG5hbWUgb2YgZW50cnkgdG8gYWRkICovCisJaW50CQluYW1lbGVuKQkvKiBuYW1lIGxlbmd0aCBvZiBlbnRyeSB0byBhZGQgKi8KK3sKKwl4ZnNfZGFfYXJnc190CWFyZ3M7CQkvKiBvcGVyYXRpb24gYXJndW1lbnRzICovCisJaW50CQlydmFsOwkJLyogcmV0dXJuIHZhbHVlICovCisJaW50CQl2OwkJLyogdHlwZS1jaGVja2luZyB2YWx1ZSAqLworCisJQVNTRVJUKChkcC0+aV9kLmRpX21vZGUgJiBTX0lGTVQpID09IFNfSUZESVIpOworCS8qCisJICogRmlsbCBpbiB0aGUgYXJnIHN0cnVjdHVyZSBmb3IgdGhpcyByZXF1ZXN0LgorCSAqLworCWFyZ3MubmFtZSA9IG5hbWU7CisJYXJncy5uYW1lbGVuID0gbmFtZWxlbjsKKwlhcmdzLmhhc2h2YWwgPSB4ZnNfZGFfaGFzaG5hbWUobmFtZSwgbmFtZWxlbik7CisJYXJncy5pbnVtYmVyID0gMDsKKwlhcmdzLmRwID0gZHA7CisJYXJncy5maXJzdGJsb2NrID0gTlVMTDsKKwlhcmdzLmZsaXN0ID0gTlVMTDsKKwlhcmdzLnRvdGFsID0gMDsKKwlhcmdzLndoaWNoZm9yayA9IFhGU19EQVRBX0ZPUks7CisJYXJncy50cmFucyA9IHRwOworCWFyZ3MuanVzdGNoZWNrID0gYXJncy5hZGRuYW1lID0gYXJncy5va25vZW50ID0gMTsKKwkvKgorCSAqIERlY2lkZSBvbiB3aGF0IHdvcmsgcm91dGluZXMgdG8gY2FsbCBiYXNlZCBvbiB0aGUgaW5vZGUgc2l6ZS4KKwkgKi8KKwlpZiAoZHAtPmlfZC5kaV9mb3JtYXQgPT0gWEZTX0RJTk9ERV9GTVRfTE9DQUwpCisJCXJ2YWwgPSB4ZnNfZGlyMl9zZl9hZGRuYW1lKCZhcmdzKTsKKwllbHNlIGlmICgocnZhbCA9IHhmc19kaXIyX2lzYmxvY2sodHAsIGRwLCAmdikpKSB7CisJCXJldHVybiBydmFsOworCX0gZWxzZSBpZiAodikKKwkJcnZhbCA9IHhmc19kaXIyX2Jsb2NrX2FkZG5hbWUoJmFyZ3MpOworCWVsc2UgaWYgKChydmFsID0geGZzX2RpcjJfaXNsZWFmKHRwLCBkcCwgJnYpKSkgeworCQlyZXR1cm4gcnZhbDsKKwl9IGVsc2UgaWYgKHYpCisJCXJ2YWwgPSB4ZnNfZGlyMl9sZWFmX2FkZG5hbWUoJmFyZ3MpOworCWVsc2UKKwkJcnZhbCA9IHhmc19kaXIyX25vZGVfYWRkbmFtZSgmYXJncyk7CisJcmV0dXJuIHJ2YWw7Cit9CisKKy8qCisgKiBEdW1teSByb3V0aW5lIGZvciBzaG9ydGZvcm0gaW5vZGUgdmFsaWRhdGlvbi4KKyAqIENhbid0IHJlYWxseSBkbyB0aGlzLgorICovCisvKiBBUkdTVVNFRCAqLworc3RhdGljIGludAkJCQkvKiBlcnJvciAqLworeGZzX2RpcjJfc2hvcnRmb3JtX3ZhbGlkYXRlX29uZGlzaygKKwl4ZnNfbW91bnRfdAkqbXAsCQkvKiBmaWxlc3lzdGVtIG1vdW50IHBvaW50ICovCisJeGZzX2Rpbm9kZV90CSpkaXApCQkvKiBvbmRpc2sgaW5vZGUgKi8KK3sKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKi8KKworLyoKKyAqIEFkZCBhIGJsb2NrIHRvIHRoZSBkaXJlY3RvcnkuCisgKiBUaGlzIHJvdXRpbmUgaXMgZm9yIGRhdGEgYW5kIGZyZWUgYmxvY2tzLCBub3QgbGVhZi9ub2RlIGJsb2NrcworICogd2hpY2ggYXJlIGhhbmRsZWQgYnkgeGZzX2RhX2dyb3dfaW5vZGUuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19kaXIyX2dyb3dfaW5vZGUoCisJeGZzX2RhX2FyZ3NfdAkqYXJncywJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KKwlpbnQJCXNwYWNlLAkJLyogdjIgZGlyJ3Mgc3BhY2UgWEZTX0RJUjJfeHh4X1NQQUNFICovCisJeGZzX2RpcjJfZGJfdAkqZGJwKQkJLyogb3V0OiBibG9jayBudW1iZXIgYWRkZWQgKi8KK3sKKwl4ZnNfZmlsZW9mZl90CWJubzsJCS8qIGRpcmVjdG9yeSBvZmZzZXQgb2YgbmV3IGJsb2NrICovCisJaW50CQljb3VudDsJCS8qIGNvdW50IG9mIGZpbGVzeXN0ZW0gYmxvY2tzICovCisJeGZzX2lub2RlX3QJKmRwOwkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLworCWludAkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwlpbnQJCWdvdDsJCS8qIGJsb2NrcyBhY3R1YWxseSBtYXBwZWQgKi8KKwlpbnQJCWk7CQkvKiB0ZW1wIG1hcHBpbmcgaW5kZXggKi8KKwl4ZnNfYm1idF9pcmVjX3QJbWFwOwkJLyogc2luZ2xlIHN0cnVjdHVyZSBmb3IgYm1hcCAqLworCWludAkJbWFwaTsJCS8qIG1hcHBpbmcgaW5kZXggKi8KKwl4ZnNfYm1idF9pcmVjX3QJKm1hcHA7CQkvKiBibWFwIG1hcHBpbmcgc3RydWN0dXJlKHMpICovCisJeGZzX21vdW50X3QJKm1wOwkJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLworCWludAkJbm1hcDsJCS8qIG51bWJlciBvZiBibWFwIGVudHJpZXMgKi8KKwl4ZnNfdHJhbnNfdAkqdHA7CQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisKKwl4ZnNfZGlyMl90cmFjZV9hcmdzX3MoImdyb3dfaW5vZGUiLCBhcmdzLCBzcGFjZSk7CisJZHAgPSBhcmdzLT5kcDsKKwl0cCA9IGFyZ3MtPnRyYW5zOworCW1wID0gZHAtPmlfbW91bnQ7CisJLyoKKwkgKiBTZXQgbG93ZXN0IHBvc3NpYmxlIGJsb2NrIGluIHRoZSBzcGFjZSByZXF1ZXN0ZWQuCisJICovCisJYm5vID0gWEZTX0JfVE9fRlNCVChtcCwgc3BhY2UgKiBYRlNfRElSMl9TUEFDRV9TSVpFKTsKKwljb3VudCA9IG1wLT5tX2RpcmJsa2ZzYnM7CisJLyoKKwkgKiBGaW5kIHRoZSBmaXJzdCBob2xlIGZvciBvdXIgYmxvY2suCisJICovCisJaWYgKChlcnJvciA9IHhmc19ibWFwX2ZpcnN0X3VudXNlZCh0cCwgZHAsIGNvdW50LCAmYm5vLCBYRlNfREFUQV9GT1JLKSkpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlubWFwID0gMTsKKwlBU1NFUlQoYXJncy0+Zmlyc3RibG9jayAhPSBOVUxMKTsKKwkvKgorCSAqIFRyeSBtYXBwaW5nIHRoZSBuZXcgYmxvY2sgY29udGlndW91c2x5IChvbmUgZXh0ZW50KS4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2JtYXBpKHRwLCBkcCwgYm5vLCBjb3VudCwKKwkJCVhGU19CTUFQSV9XUklURXxYRlNfQk1BUElfTUVUQURBVEF8WEZTX0JNQVBJX0NPTlRJRywKKwkJCWFyZ3MtPmZpcnN0YmxvY2ssIGFyZ3MtPnRvdGFsLCAmbWFwLCAmbm1hcCwKKwkJCWFyZ3MtPmZsaXN0KSkpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlBU1NFUlQobm1hcCA8PSAxKTsKKwkvKgorCSAqIEdvdCBpdCBpbiAxLgorCSAqLworCWlmIChubWFwID09IDEpIHsKKwkJbWFwcCA9ICZtYXA7CisJCW1hcGkgPSAxOworCX0KKwkvKgorCSAqIERpZG4ndCB3b3JrIGFuZCB0aGlzIGlzIGEgbXVsdGlwbGUtZnNiIGRpcmVjdG9yeSBibG9jay4KKwkgKiBUcnkgYWdhaW4gd2l0aCBjb250aWd1b3VzIGZsYWcgdHVybmVkIG9uLgorCSAqLworCWVsc2UgaWYgKG5tYXAgPT0gMCAmJiBjb3VudCA+IDEpIHsKKwkJeGZzX2ZpbGVvZmZfdAliOwkvKiBjdXJyZW50IGZpbGUgb2Zmc2V0ICovCisKKwkJLyoKKwkJICogU3BhY2UgZm9yIG1heGltdW0gbnVtYmVyIG9mIG1hcHBpbmdzLgorCQkgKi8KKwkJbWFwcCA9IGttZW1fYWxsb2Moc2l6ZW9mKCptYXBwKSAqIGNvdW50LCBLTV9TTEVFUCk7CisJCS8qCisJCSAqIEl0ZXJhdGUgdW50aWwgd2UgZ2V0IHRvIHRoZSBlbmQgb2Ygb3VyIGJsb2NrLgorCQkgKi8KKwkJZm9yIChiID0gYm5vLCBtYXBpID0gMDsgYiA8IGJubyArIGNvdW50OyApIHsKKwkJCWludAljOwkvKiBjdXJyZW50IGZzYiBjb3VudCAqLworCisJCQkvKgorCQkJICogQ2FuJ3QgbWFwIG1vcmUgdGhhbiBNQVhfTk1BUCBhdCBvbmNlLgorCQkJICovCisJCQlubWFwID0gTUlOKFhGU19CTUFQX01BWF9OTUFQLCBjb3VudCk7CisJCQljID0gKGludCkoYm5vICsgY291bnQgLSBiKTsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYm1hcGkodHAsIGRwLCBiLCBjLAorCQkJCQlYRlNfQk1BUElfV1JJVEV8WEZTX0JNQVBJX01FVEFEQVRBLAorCQkJCQlhcmdzLT5maXJzdGJsb2NrLCBhcmdzLT50b3RhbCwKKwkJCQkJJm1hcHBbbWFwaV0sICZubWFwLCBhcmdzLT5mbGlzdCkpKSB7CisJCQkJa21lbV9mcmVlKG1hcHAsIHNpemVvZigqbWFwcCkgKiBjb3VudCk7CisJCQkJcmV0dXJuIGVycm9yOworCQkJfQorCQkJaWYgKG5tYXAgPCAxKQorCQkJCWJyZWFrOworCQkJLyoKKwkJCSAqIEFkZCB0aGlzIGJ1bmNoIGludG8gb3VyIHRhYmxlLCBnbyB0byB0aGUgbmV4dCBvZmZzZXQuCisJCQkgKi8KKwkJCW1hcGkgKz0gbm1hcDsKKwkJCWIgPSBtYXBwW21hcGkgLSAxXS5icl9zdGFydG9mZiArCisJCQkgICAgbWFwcFttYXBpIC0gMV0uYnJfYmxvY2tjb3VudDsKKwkJfQorCX0KKwkvKgorCSAqIERpZG4ndCB3b3JrLgorCSAqLworCWVsc2UgeworCQltYXBpID0gMDsKKwkJbWFwcCA9IE5VTEw7CisJfQorCS8qCisJICogU2VlIGhvdyBtYW55IGZzYidzIHdlIGdvdC4KKwkgKi8KKwlmb3IgKGkgPSAwLCBnb3QgPSAwOyBpIDwgbWFwaTsgaSsrKQorCQlnb3QgKz0gbWFwcFtpXS5icl9ibG9ja2NvdW50OworCS8qCisJICogRGlkbid0IGdldCBlbm91Z2ggZnNiJ3MsIG9yIHRoZSBmaXJzdC9sYXN0IGJsb2NrJ3MgYXJlIHdyb25nLgorCSAqLworCWlmIChnb3QgIT0gY291bnQgfHwgbWFwcFswXS5icl9zdGFydG9mZiAhPSBibm8gfHwKKwkgICAgbWFwcFttYXBpIC0gMV0uYnJfc3RhcnRvZmYgKyBtYXBwW21hcGkgLSAxXS5icl9ibG9ja2NvdW50ICE9CisJICAgIGJubyArIGNvdW50KSB7CisJCWlmIChtYXBwICE9ICZtYXApCisJCQlrbWVtX2ZyZWUobWFwcCwgc2l6ZW9mKCptYXBwKSAqIGNvdW50KTsKKwkJcmV0dXJuIFhGU19FUlJPUihFTk9TUEMpOworCX0KKwkvKgorCSAqIERvbmUgd2l0aCB0aGUgdGVtcG9yYXJ5IG1hcHBpbmcgdGFibGUuCisJICovCisJaWYgKG1hcHAgIT0gJm1hcCkKKwkJa21lbV9mcmVlKG1hcHAsIHNpemVvZigqbWFwcCkgKiBjb3VudCk7CisJKmRicCA9IFhGU19ESVIyX0RBX1RPX0RCKG1wLCAoeGZzX2RhYmxrX3QpYm5vKTsKKwkvKgorCSAqIFVwZGF0ZSBmaWxlJ3Mgc2l6ZSBpZiB0aGlzIGlzIHRoZSBkYXRhIHNwYWNlIGFuZCBpdCBncmV3LgorCSAqLworCWlmIChzcGFjZSA9PSBYRlNfRElSMl9EQVRBX1NQQUNFKSB7CisJCXhmc19mc2l6ZV90CXNpemU7CQkvKiBkaXJlY3RvcnkgZmlsZSAoZGF0YSkgc2l6ZSAqLworCisJCXNpemUgPSBYRlNfRlNCX1RPX0IobXAsIGJubyArIGNvdW50KTsKKwkJaWYgKHNpemUgPiBkcC0+aV9kLmRpX3NpemUpIHsKKwkJCWRwLT5pX2QuZGlfc2l6ZSA9IHNpemU7CisJCQl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBkcCwgWEZTX0lMT0dfQ09SRSk7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZWUgaWYgdGhlIGRpcmVjdG9yeSBpcyBhIHNpbmdsZS1ibG9jayBmb3JtIGRpcmVjdG9yeS4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2RpcjJfaXNibG9jaygKKwl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2lub2RlX3QJKmRwLAkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLworCWludAkJKnZwKQkJLyogb3V0OiAxIGlzIGJsb2NrLCAwIGlzIG5vdCBibG9jayAqLworeworCXhmc19maWxlb2ZmX3QJbGFzdDsJCS8qIGxhc3QgZmlsZSBvZmZzZXQgKi8KKwl4ZnNfbW91bnRfdAkqbXA7CQkvKiBmaWxlc3lzdGVtIG1vdW50IHBvaW50ICovCisJaW50CQlydmFsOwkJLyogcmV0dXJuIHZhbHVlICovCisKKwltcCA9IGRwLT5pX21vdW50OworCWlmICgocnZhbCA9IHhmc19ibWFwX2xhc3Rfb2Zmc2V0KHRwLCBkcCwgJmxhc3QsIFhGU19EQVRBX0ZPUkspKSkgeworCQlyZXR1cm4gcnZhbDsKKwl9CisJcnZhbCA9IFhGU19GU0JfVE9fQihtcCwgbGFzdCkgPT0gbXAtPm1fZGlyYmxrc2l6ZTsKKwlBU1NFUlQocnZhbCA9PSAwIHx8IGRwLT5pX2QuZGlfc2l6ZSA9PSBtcC0+bV9kaXJibGtzaXplKTsKKwkqdnAgPSBydmFsOworCXJldHVybiAwOworfQorCisvKgorICogU2VlIGlmIHRoZSBkaXJlY3RvcnkgaXMgYSBzaW5nbGUtbGVhZiBmb3JtIGRpcmVjdG9yeS4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2RpcjJfaXNsZWFmKAorCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfaW5vZGVfdAkqZHAsCQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCisJaW50CQkqdnApCQkvKiBvdXQ6IDEgaXMgbGVhZiwgMCBpcyBub3QgbGVhZiAqLworeworCXhmc19maWxlb2ZmX3QJbGFzdDsJCS8qIGxhc3QgZmlsZSBvZmZzZXQgKi8KKwl4ZnNfbW91bnRfdAkqbXA7CQkvKiBmaWxlc3lzdGVtIG1vdW50IHBvaW50ICovCisJaW50CQlydmFsOwkJLyogcmV0dXJuIHZhbHVlICovCisKKwltcCA9IGRwLT5pX21vdW50OworCWlmICgocnZhbCA9IHhmc19ibWFwX2xhc3Rfb2Zmc2V0KHRwLCBkcCwgJmxhc3QsIFhGU19EQVRBX0ZPUkspKSkgeworCQlyZXR1cm4gcnZhbDsKKwl9CisJKnZwID0gbGFzdCA9PSBtcC0+bV9kaXJsZWFmYmxrICsgKDEgPDwgbXAtPm1fc2Iuc2JfZGlyYmxrbG9nKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEdldGRlbnRzIHB1dCByb3V0aW5lIGZvciA2NC1iaXQgQUJJLCBkaXJlY3QgZm9ybS4KKyAqLworc3RhdGljIGludAkJCQkJLyogZXJyb3IgKi8KK3hmc19kaXIyX3B1dF9kaXJlbnQ2NF9kaXJlY3QoCisJeGZzX2RpcjJfcHV0X2FyZ3NfdAkqcGEpCQkvKiBhcmd1bWVudCBidW5kbGUgKi8KK3sKKwl4ZnNfZGlyZW50X3QJCSppZGJwOwkJLyogZGlyZW50IHBvaW50ZXIgKi8KKwlpb3ZlY190CQkJKmlvdnA7CQkvKiBpbyB2ZWN0b3IgKi8KKwlpbnQJCQluYW1lbGVuOwkvKiBlbnRyeSBuYW1lIGxlbmd0aCAqLworCWludAkJCXJlY2xlbjsJCS8qIGVudHJ5IHRvdGFsIGxlbmd0aCAqLworCXVpb190CQkJKnVpbzsJCS8qIEkvTyBjb250cm9sICovCisKKwluYW1lbGVuID0gcGEtPm5hbWVsZW47CisJcmVjbGVuID0gRElSRU5UU0laRShuYW1lbGVuKTsKKwl1aW8gPSBwYS0+dWlvOworCS8qCisJICogV29uJ3QgZml0IGluIHRoZSByZW1haW5pbmcgc3BhY2UuCisJICovCisJaWYgKHJlY2xlbiA+IHVpby0+dWlvX3Jlc2lkKSB7CisJCXBhLT5kb25lID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCWlvdnAgPSB1aW8tPnVpb19pb3Y7CisJaWRicCA9ICh4ZnNfZGlyZW50X3QgKilpb3ZwLT5pb3ZfYmFzZTsKKwlpb3ZwLT5pb3ZfYmFzZSA9IChjaGFyICopaWRicCArIHJlY2xlbjsKKwlpb3ZwLT5pb3ZfbGVuIC09IHJlY2xlbjsKKwl1aW8tPnVpb19yZXNpZCAtPSByZWNsZW47CisJaWRicC0+ZF9yZWNsZW4gPSByZWNsZW47CisJaWRicC0+ZF9pbm8gPSBwYS0+aW5vOworCWlkYnAtPmRfb2ZmID0gcGEtPmNvb2s7CisJaWRicC0+ZF9uYW1lW25hbWVsZW5dID0gJ1wwJzsKKwlwYS0+ZG9uZSA9IDE7CisJbWVtY3B5KGlkYnAtPmRfbmFtZSwgcGEtPm5hbWUsIG5hbWVsZW4pOworCXJldHVybiAwOworfQorCisvKgorICogR2V0ZGVudHMgcHV0IHJvdXRpbmUgZm9yIDY0LWJpdCBBQkksIHVpbyBmb3JtLgorICovCitzdGF0aWMgaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2RpcjJfcHV0X2RpcmVudDY0X3VpbygKKwl4ZnNfZGlyMl9wdXRfYXJnc190CSpwYSkJCS8qIGFyZ3VtZW50IGJ1bmRsZSAqLworeworCXhmc19kaXJlbnRfdAkJKmlkYnA7CQkvKiBkaXJlbnQgcG9pbnRlciAqLworCWludAkJCW5hbWVsZW47CS8qIGVudHJ5IG5hbWUgbGVuZ3RoICovCisJaW50CQkJcmVjbGVuOwkJLyogZW50cnkgdG90YWwgbGVuZ3RoICovCisJaW50CQkJcnZhbDsJCS8qIHJldHVybiB2YWx1ZSAqLworCXVpb190CQkJKnVpbzsJCS8qIEkvTyBjb250cm9sICovCisKKwluYW1lbGVuID0gcGEtPm5hbWVsZW47CisJcmVjbGVuID0gRElSRU5UU0laRShuYW1lbGVuKTsKKwl1aW8gPSBwYS0+dWlvOworCS8qCisJICogV29uJ3QgZml0IGluIHRoZSByZW1haW5pbmcgc3BhY2UuCisJICovCisJaWYgKHJlY2xlbiA+IHVpby0+dWlvX3Jlc2lkKSB7CisJCXBhLT5kb25lID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCWlkYnAgPSBwYS0+ZGJwOworCWlkYnAtPmRfcmVjbGVuID0gcmVjbGVuOworCWlkYnAtPmRfaW5vID0gcGEtPmlubzsKKwlpZGJwLT5kX29mZiA9IHBhLT5jb29rOworCWlkYnAtPmRfbmFtZVtuYW1lbGVuXSA9ICdcMCc7CisJbWVtY3B5KGlkYnAtPmRfbmFtZSwgcGEtPm5hbWUsIG5hbWVsZW4pOworCXJ2YWwgPSB1aW9fcmVhZCgoY2FkZHJfdClpZGJwLCByZWNsZW4sIHVpbyk7CisJcGEtPmRvbmUgPSAocnZhbCA9PSAwKTsKKwlyZXR1cm4gcnZhbDsKK30KKworLyoKKyAqIFJlbW92ZSB0aGUgZ2l2ZW4gYmxvY2sgZnJvbSB0aGUgZGlyZWN0b3J5LgorICogVGhpcyByb3V0aW5lIGlzIHVzZWQgZm9yIGRhdGEgYW5kIGZyZWUgYmxvY2tzLCBsZWFmL25vZGUgYXJlIGRvbmUKKyAqIGJ5IHhmc19kYV9zaHJpbmtfaW5vZGUuCisgKi8KK2ludAoreGZzX2RpcjJfc2hyaW5rX2lub2RlKAorCXhmc19kYV9hcmdzX3QJKmFyZ3MsCQkvKiBvcGVyYXRpb24gYXJndW1lbnRzICovCisJeGZzX2RpcjJfZGJfdAlkYiwJCS8qIGRpcmVjdG9yeSBibG9jayBudW1iZXIgKi8KKwl4ZnNfZGFidWZfdAkqYnApCQkvKiBibG9jaydzIGJ1ZmZlciAqLworeworCXhmc19maWxlb2ZmX3QJYm5vOwkJLyogZGlyZWN0b3J5IGZpbGUgb2Zmc2V0ICovCisJeGZzX2RhYmxrX3QJZGE7CQkvKiBkaXJlY3RvcnkgZmlsZSBvZmZzZXQgKi8KKwlpbnQJCWRvbmU7CQkvKiBidW5tYXAgaXMgZmluaXNoZWQgKi8KKwl4ZnNfaW5vZGVfdAkqZHA7CQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCisJaW50CQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCXhmc19tb3VudF90CSptcDsJCS8qIGZpbGVzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl4ZnNfdHJhbnNfdAkqdHA7CQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisKKwl4ZnNfZGlyMl90cmFjZV9hcmdzX2RiKCJzaHJpbmtfaW5vZGUiLCBhcmdzLCBkYiwgYnApOworCWRwID0gYXJncy0+ZHA7CisJbXAgPSBkcC0+aV9tb3VudDsKKwl0cCA9IGFyZ3MtPnRyYW5zOworCWRhID0gWEZTX0RJUjJfREJfVE9fREEobXAsIGRiKTsKKwkvKgorCSAqIFVubWFwIHRoZSBmc2Jsb2NrKHMpLgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfYnVubWFwaSh0cCwgZHAsIGRhLCBtcC0+bV9kaXJibGtmc2JzLAorCQkJWEZTX0JNQVBJX01FVEFEQVRBLCAwLCBhcmdzLT5maXJzdGJsb2NrLCBhcmdzLT5mbGlzdCwKKwkJCSZkb25lKSkpIHsKKwkJLyoKKwkJICogRU5PU1BDIGFjdHVhbGx5IGNhbiBoYXBwZW4gaWYgd2UncmUgaW4gYSByZW1vdmVuYW1lIHdpdGgKKwkJICogbm8gc3BhY2UgcmVzZXJ2YXRpb24sIGFuZCB0aGUgcmVzdWx0aW5nIGJsb2NrIHJlbW92YWwKKwkJICogd291bGQgY2F1c2UgYSBibWFwIGJ0cmVlIHNwbGl0IG9yIGNvbnZlcnNpb24gZnJvbSBleHRlbnRzCisJCSAqIHRvIGJ0cmVlLiAgVGhpcyBjYW4gb25seSBoYXBwZW4gZm9yIHVuLWZyYWdtZW50ZWQKKwkJICogZGlyZWN0b3J5IGJsb2Nrcywgc2luY2UgeW91IG5lZWQgdG8gYmUgcHVuY2hpbmcgb3V0CisJCSAqIHRoZSBtaWRkbGUgb2YgYW4gZXh0ZW50LgorCQkgKiBJbiB0aGlzIGNhc2Ugd2UgbmVlZCB0byBsZWF2ZSB0aGUgYmxvY2sgaW4gdGhlIGZpbGUsCisJCSAqIGFuZCBub3QgYmludmFsIGl0LgorCQkgKiBTbyB0aGUgYmxvY2sgaGFzIHRvIGJlIGluIGEgY29uc2lzdGVudCBlbXB0eSBzdGF0ZQorCQkgKiBhbmQgYXBwcm9wcmlhdGVseSBsb2dnZWQuCisJCSAqIFdlIGRvbid0IGZyZWUgdXAgdGhlIGJ1ZmZlciwgdGhlIGNhbGxlciBjYW4gdGVsbCBpdAorCQkgKiBoYXNuJ3QgaGFwcGVuZWQgc2luY2UgaXQgZ290IGFuIGVycm9yIGJhY2suCisJCSAqLworCQlyZXR1cm4gZXJyb3I7CisJfQorCUFTU0VSVChkb25lKTsKKwkvKgorCSAqIEludmFsaWRhdGUgdGhlIGJ1ZmZlciBmcm9tIHRoZSB0cmFuc2FjdGlvbi4KKwkgKi8KKwl4ZnNfZGFfYmludmFsKHRwLCBicCk7CisJLyoKKwkgKiBJZiBpdCdzIG5vdCBhIGRhdGEgYmxvY2ssIHdlJ3JlIGRvbmUuCisJICovCisJaWYgKGRiID49IFhGU19ESVIyX0xFQUZfRklSU1REQihtcCkpCisJCXJldHVybiAwOworCS8qCisJICogSWYgdGhlIGJsb2NrIGlzbid0IHRoZSBsYXN0IG9uZSBpbiB0aGUgZGlyZWN0b3J5LCB3ZSdyZSBkb25lLgorCSAqLworCWlmIChkcC0+aV9kLmRpX3NpemUgPiBYRlNfRElSMl9EQl9PRkZfVE9fQllURShtcCwgZGIgKyAxLCAwKSkKKwkJcmV0dXJuIDA7CisJYm5vID0gZGE7CisJaWYgKChlcnJvciA9IHhmc19ibWFwX2xhc3RfYmVmb3JlKHRwLCBkcCwgJmJubywgWEZTX0RBVEFfRk9SSykpKSB7CisJCS8qCisJCSAqIFRoaXMgY2FuJ3QgcmVhbGx5IGhhcHBlbiB1bmxlc3MgdGhlcmUncyBrZXJuZWwgY29ycnVwdGlvbi4KKwkJICovCisJCXJldHVybiBlcnJvcjsKKwl9CisJaWYgKGRiID09IG1wLT5tX2RpcmRhdGFibGspCisJCUFTU0VSVChibm8gPT0gMCk7CisJZWxzZQorCQlBU1NFUlQoYm5vID4gMCk7CisJLyoKKwkgKiBTZXQgdGhlIHNpemUgdG8gdGhlIG5ldyBsYXN0IGJsb2NrLgorCSAqLworCWRwLT5pX2QuZGlfc2l6ZSA9IFhGU19GU0JfVE9fQihtcCwgYm5vKTsKKwl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBkcCwgWEZTX0lMT0dfQ09SRSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RpcjIuaCBiL2ZzL3hmcy94ZnNfZGlyMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNGZjN2YKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2RpcjIuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfRElSMl9IX18KKyNkZWZpbmUJX19YRlNfRElSMl9IX18KKworc3RydWN0IHVpbzsKK3N0cnVjdCB4ZnNfZGFidWY7CitzdHJ1Y3QgeGZzX2RhX2FyZ3M7CitzdHJ1Y3QgeGZzX2RpcjJfcHV0X2FyZ3M7CitzdHJ1Y3QgeGZzX2lub2RlOworc3RydWN0IHhmc190cmFuczsKKworLyoKKyAqIERpcmVjdG9yeSB2ZXJzaW9uIDIuCisgKiBUaGVyZSBhcmUgNCBwb3NzaWJsZSBmb3JtYXRzOgorICoJc2hvcnRmb3JtCisgKglzaW5nbGUgYmxvY2sgLSBkYXRhIHdpdGggZW1iZWRkZWQgbGVhZiBhdCB0aGUgZW5kCisgKgltdWx0aXBsZSBkYXRhIGJsb2Nrcywgc2luZ2xlIGxlYWYrZnJlZWluZGV4IGJsb2NrCisgKglkYXRhIGJsb2Nrcywgbm9kZSZsZWFmIGJsb2NrcyAoYnRyZWUpLCBmcmVlaW5kZXggYmxvY2tzCisgKgorICoJVGhlIHNob3J0Zm9ybSBmb3JtYXQgaXMgaW4geGZzX2RpcjJfc2YuaC4KKyAqCVRoZSBzaW5nbGUgYmxvY2sgZm9ybWF0IGlzIGluIHhmc19kaXIyX2Jsb2NrLmguCisgKglUaGUgZGF0YSBibG9jayBmb3JtYXQgaXMgaW4geGZzX2RpcjJfZGF0YS5oLgorICoJVGhlIGxlYWYgYW5kIGZyZWVpbmRleCBibG9jayBmb3JtYXRzIGFyZSBpbiB4ZnNfZGlyMl9sZWFmLmguCisgKglOb2RlIGJsb2NrcyBhcmUgdGhlIHNhbWUgYXMgdGhlIG90aGVyIHZlcnNpb24sIGluIHhmc19kYV9idHJlZS5oLgorICovCisKKy8qCisgKiBCeXRlIG9mZnNldCBpbiBkYXRhIGJsb2NrIGFuZCBzaG9ydGZvcm0gZW50cnkuCisgKi8KK3R5cGVkZWYJX191aW50MTZfdAl4ZnNfZGlyMl9kYXRhX29mZl90OworI2RlZmluZQlOVUxMREFUQU9GRgkweGZmZmZVCit0eXBlZGVmIHVpbnQJCXhmc19kaXIyX2RhdGFfYW9mZl90OwkvKiBhcmd1bWVudCBmb3JtICovCisKKy8qCisgKiBEaXJlY3RvcnkgYmxvY2sgbnVtYmVyIChsb2dpY2FsIGRpcmJsayBpbiBmaWxlKQorICovCit0eXBlZGVmCV9fdWludDMyX3QJeGZzX2RpcjJfZGJfdDsKKworLyoKKyAqIEJ5dGUgb2Zmc2V0IGluIGEgZGlyZWN0b3J5LgorICovCit0eXBlZGVmCXhmc19vZmZfdAkJeGZzX2RpcjJfb2ZmX3Q7CisKKy8qCisgKiBGb3IgZ2V0ZGVudHMsIGFyZ3VtZW50IHN0cnVjdCBmb3IgcHV0IHJvdXRpbmVzLgorICovCit0eXBlZGVmIGludCAoKnhmc19kaXIyX3B1dF90KShzdHJ1Y3QgeGZzX2RpcjJfcHV0X2FyZ3MgKnBhKTsKK3R5cGVkZWYgc3RydWN0IHhmc19kaXIyX3B1dF9hcmdzIHsKKwl4ZnNfb2ZmX3QJCWNvb2s7CQkvKiBjb29raWUgb2YgKG5leHQpIGVudHJ5ICovCisJeGZzX2ludGlub190CWlubzsJCS8qIGlub2RlIG51bWJlciAqLworCXN0cnVjdCB4ZnNfZGlyZW50CSpkYnA7CQkvKiBidWZmZXIgcG9pbnRlciAqLworCWNoYXIJCSpuYW1lOwkJLyogZGlyZWN0b3J5IGVudHJ5IG5hbWUgKi8KKwlpbnQJCW5hbWVsZW47CS8qIGxlbmd0aCBvZiBuYW1lICovCisJaW50CQlkb25lOwkJLyogb3V0cHV0OiBzZXQgaWYgdmFsdWUgd2FzIHN0b3JlZCAqLworCXhmc19kaXIyX3B1dF90CXB1dDsJCS8qIHB1dCBmdW5jdGlvbiBwdHIgKGkvbykgKi8KKwlzdHJ1Y3QgdWlvCSp1aW87CQkvKiB1aW8gY29udHJvbCBzdHJ1Y3R1cmUgKi8KK30geGZzX2RpcjJfcHV0X2FyZ3NfdDsKKworI2RlZmluZQlYRlNfRElSX0lTX1YyKG1wKQkoKG1wKS0+bV9kaXJ2ZXJzaW9uID09IDIpCitleHRlcm4geGZzX2Rpcm9wc190CXhmc3YyX2Rpcm9wczsKKworLyoKKyAqIE90aGVyIGludGVyZmFjZXMgdXNlZCBieSB0aGUgcmVzdCBvZiB0aGUgZGlyIHYyIGNvZGUuCisgKi8KK2V4dGVybiBpbnQKKwl4ZnNfZGlyMl9ncm93X2lub2RlKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywgaW50IHNwYWNlLAorCQkJICAgIHhmc19kaXIyX2RiX3QgKmRicCk7CisKK2V4dGVybiBpbnQKKwl4ZnNfZGlyMl9pc2Jsb2NrKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCBzdHJ1Y3QgeGZzX2lub2RlICpkcCwgaW50ICp2cCk7CisKK2V4dGVybiBpbnQKKwl4ZnNfZGlyMl9pc2xlYWYoc3RydWN0IHhmc190cmFucyAqdHAsIHN0cnVjdCB4ZnNfaW5vZGUgKmRwLCBpbnQgKnZwKTsKKworZXh0ZXJuIGludAorCXhmc19kaXIyX3Nocmlua19pbm9kZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsIHhmc19kaXIyX2RiX3QgZGIsCisJCQkgICAgICBzdHJ1Y3QgeGZzX2RhYnVmICpicCk7CisKKyNlbmRpZgkvKiBfX1hGU19ESVIyX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXIyX2Jsb2NrLmMgYi9mcy94ZnMveGZzX2RpcjJfYmxvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzRjNDBmCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19kaXIyX2Jsb2NrLmMKQEAgLTAsMCArMSwxMjQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisvKgorICogeGZzX2RpcjJfYmxvY2suYworICogWEZTIFYyIGRpcmVjdG9yeSBpbXBsZW1lbnRhdGlvbiwgc2luZ2xlLWJsb2NrIGZvcm0uCisgKiBTZWUgeGZzX2RpcjJfYmxvY2suaCBmb3IgdGhlIGZvcm1hdC4KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisKKyNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19kYV9idHJlZS5oIgorI2luY2x1ZGUgInhmc19kaXJfbGVhZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX2RhdGEuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9sZWFmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfYmxvY2suaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl90cmFjZS5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorCisvKgorICogTG9jYWwgZnVuY3Rpb24gcHJvdG90eXBlcy4KKyAqLworc3RhdGljIHZvaWQgeGZzX2RpcjJfYmxvY2tfbG9nX2xlYWYoeGZzX3RyYW5zX3QgKnRwLCB4ZnNfZGFidWZfdCAqYnAsIGludCBmaXJzdCwKKwkJCQkgICAgaW50IGxhc3QpOworc3RhdGljIHZvaWQgeGZzX2RpcjJfYmxvY2tfbG9nX3RhaWwoeGZzX3RyYW5zX3QgKnRwLCB4ZnNfZGFidWZfdCAqYnApOworc3RhdGljIGludCB4ZnNfZGlyMl9ibG9ja19sb29rdXBfaW50KHhmc19kYV9hcmdzX3QgKmFyZ3MsIHhmc19kYWJ1Zl90ICoqYnBwLAorCQkJCSAgICAgaW50ICplbnRubyk7CitzdGF0aWMgaW50IHhmc19kaXIyX2Jsb2NrX3NvcnQoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYik7CisKKy8qCisgKiBBZGQgYW4gZW50cnkgdG8gYSBibG9jayBkaXJlY3RvcnkuCisgKi8KK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9ibG9ja19hZGRuYW1lKAorCXhmc19kYV9hcmdzX3QJCSphcmdzKQkJLyogZGlyZWN0b3J5IG9wIGFyZ3VtZW50cyAqLworeworCXhmc19kaXIyX2RhdGFfZnJlZV90CSpiZjsJCS8qIGJlc3RmcmVlIHRhYmxlIGluIGJsb2NrICovCisJeGZzX2RpcjJfYmxvY2tfdAkqYmxvY2s7CQkvKiBkaXJlY3RvcnkgYmxvY2sgc3RydWN0dXJlICovCisJeGZzX2RpcjJfbGVhZl9lbnRyeV90CSpibHA7CQkvKiBibG9jayBsZWFmIGVudHJpZXMgKi8KKwl4ZnNfZGFidWZfdAkJKmJwOwkJLyogYnVmZmVyIGZvciBibG9jayAqLworCXhmc19kaXIyX2Jsb2NrX3RhaWxfdAkqYnRwOwkJLyogYmxvY2sgdGFpbCAqLworCWludAkJCWNvbXBhY3Q7CS8qIG5lZWQgdG8gY29tcGFjdCBsZWFmIGVudHMgKi8KKwl4ZnNfZGlyMl9kYXRhX2VudHJ5X3QJKmRlcDsJCS8qIGJsb2NrIGRhdGEgZW50cnkgKi8KKwl4ZnNfaW5vZGVfdAkJKmRwOwkJLyogZGlyZWN0b3J5IGlub2RlICovCisJeGZzX2RpcjJfZGF0YV91bnVzZWRfdAkqZHVwOwkJLyogYmxvY2sgdW51c2VkIGVudHJ5ICovCisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwl4ZnNfZGlyMl9kYXRhX3VudXNlZF90CSplbmRkdXA9TlVMTDsJLyogdW51c2VkIGF0IGVuZCBvZiBkYXRhICovCisJeGZzX2RhaGFzaF90CQloYXNoOwkJLyogaGFzaCB2YWx1ZSBvZiBmb3VuZCBlbnRyeSAqLworCWludAkJCWhpZ2g7CQkvKiBoaWdoIGluZGV4IGZvciBiaW5hcnkgc3JjaCAqLworCWludAkJCWhpZ2hzdGFsZTsJLyogaGlnaCBzdGFsZSBpbmRleCAqLworCWludAkJCWxmbG9naGlnaD0wOwkvKiBsYXN0IGZpbmFsIGxlYWYgdG8gbG9nICovCisJaW50CQkJbGZsb2dsb3c9MDsJLyogZmlyc3QgZmluYWwgbGVhZiB0byBsb2cgKi8KKwlpbnQJCQlsZW47CQkvKiBsZW5ndGggb2YgdGhlIG5ldyBlbnRyeSAqLworCWludAkJCWxvdzsJCS8qIGxvdyBpbmRleCBmb3IgYmluYXJ5IHNyY2ggKi8KKwlpbnQJCQlsb3dzdGFsZTsJLyogbG93IHN0YWxlIGluZGV4ICovCisJaW50CQkJbWlkPTA7CQkvKiBtaWRwb2ludCBmb3IgYmluYXJ5IHNyY2ggKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLworCWludAkJCW5lZWRsb2c7CS8qIG5lZWQgdG8gbG9nIGhlYWRlciAqLworCWludAkJCW5lZWRzY2FuOwkvKiBuZWVkIHRvIHJlc2NhbiBmcmVlc3BhY2UgKi8KKwl4ZnNfZGlyMl9kYXRhX29mZl90CSp0YWdwOwkJLyogcG9pbnRlciB0byB0YWcgdmFsdWUgKi8KKwl4ZnNfdHJhbnNfdAkJKnRwOwkJLyogdHJhbnNhY3Rpb24gc3RydWN0dXJlICovCisKKwl4ZnNfZGlyMl90cmFjZV9hcmdzKCJibG9ja19hZGRuYW1lIiwgYXJncyk7CisJZHAgPSBhcmdzLT5kcDsKKwl0cCA9IGFyZ3MtPnRyYW5zOworCW1wID0gZHAtPmlfbW91bnQ7CisJLyoKKwkgKiBSZWFkIHRoZSAob25lIGFuZCBvbmx5KSBkaXJlY3RvcnkgYmxvY2sgaW50byBkYWJ1ZiBicC4KKwkgKi8KKwlpZiAoKGVycm9yID0KKwkgICAgeGZzX2RhX3JlYWRfYnVmKHRwLCBkcCwgbXAtPm1fZGlyZGF0YWJsaywgLTEsICZicCwgWEZTX0RBVEFfRk9SSykpKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJQVNTRVJUKGJwICE9IE5VTEwpOworCWJsb2NrID0gYnAtPmRhdGE7CisJLyoKKwkgKiBDaGVjayB0aGUgbWFnaWMgbnVtYmVyLCBjb3JydXB0ZWQgaWYgd3JvbmcuCisJICovCisJaWYgKHVubGlrZWx5KElOVF9HRVQoYmxvY2stPmhkci5tYWdpYywgQVJDSF9DT05WRVJUKQorCQkJCQkJIT0gWEZTX0RJUjJfQkxPQ0tfTUFHSUMpKSB7CisJCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4ZnNfZGlyMl9ibG9ja19hZGRuYW1lIiwKKwkJCQkgICAgIFhGU19FUlJMRVZFTF9MT1csIG1wLCBibG9jayk7CisJCXhmc19kYV9icmVsc2UodHAsIGJwKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCX0KKwlsZW4gPSBYRlNfRElSMl9EQVRBX0VOVFNJWkUoYXJncy0+bmFtZWxlbik7CisJLyoKKwkgKiBTZXQgdXAgcG9pbnRlcnMgdG8gcGFydHMgb2YgdGhlIGJsb2NrLgorCSAqLworCWJmID0gYmxvY2stPmhkci5iZXN0ZnJlZTsKKwlidHAgPSBYRlNfRElSMl9CTE9DS19UQUlMX1AobXAsIGJsb2NrKTsKKwlibHAgPSBYRlNfRElSMl9CTE9DS19MRUFGX1AoYnRwKTsKKwkvKgorCSAqIE5vIHN0YWxlIGVudHJpZXM/ICBOZWVkIHNwYWNlIGZvciBlbnRyeSBhbmQgbmV3IGxlYWYuCisJICovCisJaWYgKCFidHAtPnN0YWxlKSB7CisJCS8qCisJCSAqIFRhZyBqdXN0IGJlZm9yZSB0aGUgZmlyc3QgbGVhZiBlbnRyeS4KKwkJICovCisJCXRhZ3AgPSAoeGZzX2RpcjJfZGF0YV9vZmZfdCAqKWJscCAtIDE7CisJCS8qCisJCSAqIERhdGEgb2JqZWN0IGp1c3QgYmVmb3JlIHRoZSBmaXJzdCBsZWFmIGVudHJ5LgorCQkgKi8KKwkJZW5kZHVwID0gKHhmc19kaXIyX2RhdGFfdW51c2VkX3QgKikoKGNoYXIgKilibG9jayArIElOVF9HRVQoKnRhZ3AsIEFSQ0hfQ09OVkVSVCkpOworCQkvKgorCQkgKiBJZiBpdCdzIG5vdCBmcmVlIHRoZW4gY2FuJ3QgZG8gdGhpcyBhZGQgd2l0aG91dCBjbGVhbmluZyB1cDoKKwkJICogdGhlIHNwYWNlIGJlZm9yZSB0aGUgZmlyc3QgbGVhZiBlbnRyeSBuZWVkcyB0byBiZSBmcmVlIHNvIGl0CisJCSAqIGNhbiBiZSBleHBhbmRlZCB0byBob2xkIHRoZSBwb2ludGVyIHRvIHRoZSBuZXcgZW50cnkuCisJCSAqLworCQlpZiAoSU5UX0dFVChlbmRkdXAtPmZyZWV0YWcsIEFSQ0hfQ09OVkVSVCkgIT0gWEZTX0RJUjJfREFUQV9GUkVFX1RBRykKKwkJCWR1cCA9IGVuZGR1cCA9IE5VTEw7CisJCS8qCisJCSAqIENoZWNrIG91dCB0aGUgYmlnZ2VzdCBmcmVlc3BhY2UgYW5kIHNlZSBpZiBpdCdzIHRoZSBzYW1lIG9uZS4KKwkJICovCisJCWVsc2UgeworCQkJZHVwID0gKHhmc19kaXIyX2RhdGFfdW51c2VkX3QgKikKKwkJCSAgICAgICgoY2hhciAqKWJsb2NrICsgSU5UX0dFVChiZlswXS5vZmZzZXQsIEFSQ0hfQ09OVkVSVCkpOworCQkJaWYgKGR1cCA9PSBlbmRkdXApIHsKKwkJCQkvKgorCQkJCSAqIEl0IGlzIHRoZSBiaWdnZXN0IGZyZWVzcGFjZSwgaXMgaXQgdG9vIHNtYWxsCisJCQkJICogdG8gaG9sZCB0aGUgbmV3IGxlYWYgdG9vPworCQkJCSAqLworCQkJCWlmIChJTlRfR0VUKGR1cC0+bGVuZ3RoLCBBUkNIX0NPTlZFUlQpIDwgbGVuICsgKHVpbnQpc2l6ZW9mKCpibHApKSB7CisJCQkJCS8qCisJCQkJCSAqIFllcywgd2UgdXNlIHRoZSBzZWNvbmQtbGFyZ2VzdAorCQkJCQkgKiBlbnRyeSBpbnN0ZWFkIGlmIGl0IHdvcmtzLgorCQkJCQkgKi8KKwkJCQkJaWYgKElOVF9HRVQoYmZbMV0ubGVuZ3RoLCBBUkNIX0NPTlZFUlQpID49IGxlbikKKwkJCQkJCWR1cCA9ICh4ZnNfZGlyMl9kYXRhX3VudXNlZF90ICopCisJCQkJCQkgICAgICAoKGNoYXIgKilibG9jayArCisJCQkJCQkgICAgICAgSU5UX0dFVChiZlsxXS5vZmZzZXQsIEFSQ0hfQ09OVkVSVCkpOworCQkJCQllbHNlCisJCQkJCQlkdXAgPSBOVUxMOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBOb3QgdGhlIHNhbWUgZnJlZSBlbnRyeSwKKwkJCQkgKiBqdXN0IGNoZWNrIGl0cyBsZW5ndGguCisJCQkJICovCisJCQkJaWYgKElOVF9HRVQoZHVwLT5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkgPCBsZW4pIHsKKwkJCQkJZHVwID0gTlVMTDsKKwkJCQl9CisJCQl9CisJCX0KKwkJY29tcGFjdCA9IDA7CisJfQorCS8qCisJICogSWYgdGhlcmUgYXJlIHN0YWxlIGVudHJpZXMgd2UnbGwgdXNlIG9uZSBmb3IgdGhlIGxlYWYuCisJICogSXMgdGhlIGJpZ2dlc3QgZW50cnkgZW5vdWdoIHRvIGF2b2lkIGNvbXBhY3Rpb24/CisJICovCisJZWxzZSBpZiAoSU5UX0dFVChiZlswXS5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkgPj0gbGVuKSB7CisJCWR1cCA9ICh4ZnNfZGlyMl9kYXRhX3VudXNlZF90ICopCisJCSAgICAgICgoY2hhciAqKWJsb2NrICsgSU5UX0dFVChiZlswXS5vZmZzZXQsIEFSQ0hfQ09OVkVSVCkpOworCQljb21wYWN0ID0gMDsKKwl9CisJLyoKKwkgKiBXaWxsIG5lZWQgdG8gY29tcGFjdCB0byBtYWtlIHRoaXMgd29yay4KKwkgKi8KKwllbHNlIHsKKwkJLyoKKwkJICogVGFnIGp1c3QgYmVmb3JlIHRoZSBmaXJzdCBsZWFmIGVudHJ5LgorCQkgKi8KKwkJdGFncCA9ICh4ZnNfZGlyMl9kYXRhX29mZl90ICopYmxwIC0gMTsKKwkJLyoKKwkJICogRGF0YSBvYmplY3QganVzdCBiZWZvcmUgdGhlIGZpcnN0IGxlYWYgZW50cnkuCisJCSAqLworCQlkdXAgPSAoeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqKSgoY2hhciAqKWJsb2NrICsgSU5UX0dFVCgqdGFncCwgQVJDSF9DT05WRVJUKSk7CisJCS8qCisJCSAqIElmIGl0J3Mgbm90IGZyZWUgdGhlbiB0aGUgZGF0YSB3aWxsIGdvIHdoZXJlIHRoZQorCQkgKiBsZWFmIGRhdGEgc3RhcnRzIG5vdywgaWYgaXQgd29ya3MgYXQgYWxsLgorCQkgKi8KKwkJaWYgKElOVF9HRVQoZHVwLT5mcmVldGFnLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0RBVEFfRlJFRV9UQUcpIHsKKwkJCWlmIChJTlRfR0VUKGR1cC0+bGVuZ3RoLCBBUkNIX0NPTlZFUlQpICsgKElOVF9HRVQoYnRwLT5zdGFsZSwgQVJDSF9DT05WRVJUKSAtIDEpICoKKwkJCSAgICAodWludClzaXplb2YoKmJscCkgPCBsZW4pCisJCQkJZHVwID0gTlVMTDsKKwkJfSBlbHNlIGlmICgoSU5UX0dFVChidHAtPnN0YWxlLCBBUkNIX0NPTlZFUlQpIC0gMSkgKiAodWludClzaXplb2YoKmJscCkgPCBsZW4pCisJCQlkdXAgPSBOVUxMOworCQllbHNlCisJCQlkdXAgPSAoeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqKWJscDsKKwkJY29tcGFjdCA9IDE7CisJfQorCS8qCisJICogSWYgdGhpcyBpc24ndCBhIHJlYWwgYWRkLCB3ZSdyZSBkb25lIHdpdGggdGhlIGJ1ZmZlci4KKwkgKi8KKwlpZiAoYXJncy0+anVzdGNoZWNrKQorCQl4ZnNfZGFfYnJlbHNlKHRwLCBicCk7CisJLyoKKwkgKiBJZiB3ZSBkb24ndCBoYXZlIHNwYWNlIGZvciB0aGUgbmV3IGVudHJ5ICYgbGVhZiAuLi4KKwkgKi8KKwlpZiAoIWR1cCkgeworCQkvKgorCQkgKiBOb3QgdHJ5aW5nIHRvIGFjdHVhbGx5IGRvIGFueXRoaW5nLCBvciBkb24ndCBoYXZlCisJCSAqIGEgc3BhY2UgcmVzZXJ2YXRpb246IHJldHVybiBuby1zcGFjZS4KKwkJICovCisJCWlmIChhcmdzLT5qdXN0Y2hlY2sgfHwgYXJncy0+dG90YWwgPT0gMCkKKwkJCXJldHVybiBYRlNfRVJST1IoRU5PU1BDKTsKKwkJLyoKKwkJICogQ29udmVydCB0byB0aGUgbmV4dCBsYXJnZXIgZm9ybWF0LgorCQkgKiBUaGVuIGFkZCB0aGUgbmV3IGVudHJ5IGluIHRoYXQgZm9ybWF0LgorCQkgKi8KKwkJZXJyb3IgPSB4ZnNfZGlyMl9ibG9ja190b19sZWFmKGFyZ3MsIGJwKTsKKwkJeGZzX2RhX2J1Zl9kb25lKGJwKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOworCQlyZXR1cm4geGZzX2RpcjJfbGVhZl9hZGRuYW1lKGFyZ3MpOworCX0KKwkvKgorCSAqIEp1c3QgY2hlY2tpbmcsIGFuZCBpdCB3b3VsZCB3b3JrLCBzbyBzYXkgc28uCisJICovCisJaWYgKGFyZ3MtPmp1c3RjaGVjaykKKwkJcmV0dXJuIDA7CisJbmVlZGxvZyA9IG5lZWRzY2FuID0gMDsKKwkvKgorCSAqIElmIG5lZWQgdG8gY29tcGFjdCB0aGUgbGVhZiBlbnRyaWVzLCBkbyBpdCBub3cuCisJICogTGVhdmUgdGhlIGhpZ2hlc3QtbnVtYmVyZWQgc3RhbGUgZW50cnkgc3RhbGUuCisJICogWFhYIHNob3VsZCBiZSB0aGUgb25lIGNsb3Nlc3QgdG8gbWlkIGJ1dCBtaWQgaXMgbm90IHlldCBjb21wdXRlZC4KKwkgKi8KKwlpZiAoY29tcGFjdCkgeworCQlpbnQJZnJvbWlkeDsJCS8qIHNvdXJjZSBsZWFmIGluZGV4ICovCisJCWludAl0b2lkeDsJCQkvKiB0YXJnZXQgbGVhZiBpbmRleCAqLworCisJCWZvciAoZnJvbWlkeCA9IHRvaWR4ID0gSU5UX0dFVChidHAtPmNvdW50LCBBUkNIX0NPTlZFUlQpIC0gMSwKKwkJCWhpZ2hzdGFsZSA9IGxmbG9naGlnaCA9IC0xOworCQkgICAgIGZyb21pZHggPj0gMDsKKwkJICAgICBmcm9taWR4LS0pIHsKKwkJCWlmIChJTlRfR0VUKGJscFtmcm9taWR4XS5hZGRyZXNzLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX05VTExfREFUQVBUUikgeworCQkJCWlmIChoaWdoc3RhbGUgPT0gLTEpCisJCQkJCWhpZ2hzdGFsZSA9IHRvaWR4OworCQkJCWVsc2UgeworCQkJCQlpZiAobGZsb2doaWdoID09IC0xKQorCQkJCQkJbGZsb2doaWdoID0gdG9pZHg7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKwkJCWlmIChmcm9taWR4IDwgdG9pZHgpCisJCQkJYmxwW3RvaWR4XSA9IGJscFtmcm9taWR4XTsKKwkJCXRvaWR4LS07CisJCX0KKwkJbGZsb2dsb3cgPSB0b2lkeCArIDEgLSAoSU5UX0dFVChidHAtPnN0YWxlLCBBUkNIX0NPTlZFUlQpIC0gMSk7CisJCWxmbG9naGlnaCAtPSBJTlRfR0VUKGJ0cC0+c3RhbGUsIEFSQ0hfQ09OVkVSVCkgLSAxOworCQlJTlRfTU9EKGJ0cC0+Y291bnQsIEFSQ0hfQ09OVkVSVCwgLShJTlRfR0VUKGJ0cC0+c3RhbGUsIEFSQ0hfQ09OVkVSVCkgLSAxKSk7CisJCXhmc19kaXIyX2RhdGFfbWFrZV9mcmVlKHRwLCBicCwKKwkJCSh4ZnNfZGlyMl9kYXRhX2FvZmZfdCkoKGNoYXIgKilibHAgLSAoY2hhciAqKWJsb2NrKSwKKwkJCSh4ZnNfZGlyMl9kYXRhX2FvZmZfdCkoKElOVF9HRVQoYnRwLT5zdGFsZSwgQVJDSF9DT05WRVJUKSAtIDEpICogc2l6ZW9mKCpibHApKSwKKwkJCSZuZWVkbG9nLCAmbmVlZHNjYW4pOworCQlibHAgKz0gSU5UX0dFVChidHAtPnN0YWxlLCBBUkNIX0NPTlZFUlQpIC0gMTsKKwkJSU5UX1NFVChidHAtPnN0YWxlLCBBUkNIX0NPTlZFUlQsIDEpOworCQkvKgorCQkgKiBJZiB3ZSBub3cgbmVlZCB0byByZWJ1aWxkIHRoZSBiZXN0ZnJlZSBtYXAsIGRvIHNvLgorCQkgKiBUaGlzIG5lZWRzIHRvIGhhcHBlbiBiZWZvcmUgdGhlIG5leHQgY2FsbCB0byB1c2VfZnJlZS4KKwkJICovCisJCWlmIChuZWVkc2NhbikgeworCQkJeGZzX2RpcjJfZGF0YV9mcmVlc2NhbihtcCwgKHhmc19kaXIyX2RhdGFfdCAqKWJsb2NrLAorCQkJCSZuZWVkbG9nLCBOVUxMKTsKKwkJCW5lZWRzY2FuID0gMDsKKwkJfQorCX0KKwkvKgorCSAqIFNldCBsZWFmIGxvZ2dpbmcgYm91bmRhcmllcyB0byBpbXBvc3NpYmxlIHN0YXRlLgorCSAqIEZvciB0aGUgbm8tc3RhbGUgY2FzZSB0aGV5J3JlIHNldCBleHBsaWNpdGx5LgorCSAqLworCWVsc2UgaWYgKElOVF9HRVQoYnRwLT5zdGFsZSwgQVJDSF9DT05WRVJUKSkgeworCQlsZmxvZ2xvdyA9IElOVF9HRVQoYnRwLT5jb3VudCwgQVJDSF9DT05WRVJUKTsKKwkJbGZsb2doaWdoID0gLTE7CisJfQorCS8qCisJICogRmluZCB0aGUgc2xvdCB0aGF0J3MgZmlyc3QgbG93ZXIgdGhhbiBvdXIgaGFzaCB2YWx1ZSwgLTEgaWYgbm9uZS4KKwkgKi8KKwlmb3IgKGxvdyA9IDAsIGhpZ2ggPSBJTlRfR0VUKGJ0cC0+Y291bnQsIEFSQ0hfQ09OVkVSVCkgLSAxOyBsb3cgPD0gaGlnaDsgKSB7CisJCW1pZCA9IChsb3cgKyBoaWdoKSA+PiAxOworCQlpZiAoKGhhc2ggPSBJTlRfR0VUKGJscFttaWRdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkpID09IGFyZ3MtPmhhc2h2YWwpCisJCQlicmVhazsKKwkJaWYgKGhhc2ggPCBhcmdzLT5oYXNodmFsKQorCQkJbG93ID0gbWlkICsgMTsKKwkJZWxzZQorCQkJaGlnaCA9IG1pZCAtIDE7CisJfQorCXdoaWxlIChtaWQgPj0gMCAmJiBJTlRfR0VUKGJscFttaWRdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkgPj0gYXJncy0+aGFzaHZhbCkgeworCQltaWQtLTsKKwl9CisJLyoKKwkgKiBObyBzdGFsZSBlbnRyaWVzLCB3aWxsIHVzZSBlbmRkdXAgc3BhY2UgdG8gaG9sZCBuZXcgbGVhZi4KKwkgKi8KKwlpZiAoIWJ0cC0+c3RhbGUpIHsKKwkJLyoKKwkJICogTWFyayB0aGUgc3BhY2UgbmVlZGVkIGZvciB0aGUgbmV3IGxlYWYgZW50cnksIG5vdyBpbiB1c2UuCisJCSAqLworCQl4ZnNfZGlyMl9kYXRhX3VzZV9mcmVlKHRwLCBicCwgZW5kZHVwLAorCQkJKHhmc19kaXIyX2RhdGFfYW9mZl90KQorCQkJKChjaGFyICopZW5kZHVwIC0gKGNoYXIgKilibG9jayArIElOVF9HRVQoZW5kZHVwLT5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkgLQorCQkJIHNpemVvZigqYmxwKSksCisJCQkoeGZzX2RpcjJfZGF0YV9hb2ZmX3Qpc2l6ZW9mKCpibHApLAorCQkJJm5lZWRsb2csICZuZWVkc2Nhbik7CisJCS8qCisJCSAqIFVwZGF0ZSB0aGUgdGFpbCAoZW50cnkgY291bnQpLgorCQkgKi8KKwkJSU5UX01PRChidHAtPmNvdW50LCBBUkNIX0NPTlZFUlQsICsxKTsKKwkJLyoKKwkJICogSWYgd2Ugbm93IG5lZWQgdG8gcmVidWlsZCB0aGUgYmVzdGZyZWUgbWFwLCBkbyBzby4KKwkJICogVGhpcyBuZWVkcyB0byBoYXBwZW4gYmVmb3JlIHRoZSBuZXh0IGNhbGwgdG8gdXNlX2ZyZWUuCisJCSAqLworCQlpZiAobmVlZHNjYW4pIHsKKwkJCXhmc19kaXIyX2RhdGFfZnJlZXNjYW4obXAsICh4ZnNfZGlyMl9kYXRhX3QgKilibG9jaywKKwkJCQkmbmVlZGxvZywgTlVMTCk7CisJCQluZWVkc2NhbiA9IDA7CisJCX0KKwkJLyoKKwkJICogQWRqdXN0IHBvaW50ZXIgdG8gdGhlIGZpcnN0IGxlYWYgZW50cnksIHdlJ3JlIGFib3V0IHRvIG1vdmUKKwkJICogdGhlIHRhYmxlIHVwIG9uZSB0byBvcGVuIHVwIHNwYWNlIGZvciB0aGUgbmV3IGxlYWYgZW50cnkuCisJCSAqIFRoZW4gYWRqdXN0IG91ciBpbmRleCB0byBtYXRjaC4KKwkJICovCisJCWJscC0tOworCQltaWQrKzsKKwkJaWYgKG1pZCkKKwkJCW1lbW1vdmUoYmxwLCAmYmxwWzFdLCBtaWQgKiBzaXplb2YoKmJscCkpOworCQlsZmxvZ2xvdyA9IDA7CisJCWxmbG9naGlnaCA9IG1pZDsKKwl9CisJLyoKKwkgKiBVc2UgYSBzdGFsZSBsZWFmIGZvciBvdXIgbmV3IGVudHJ5LgorCSAqLworCWVsc2UgeworCQlmb3IgKGxvd3N0YWxlID0gbWlkOworCQkgICAgIGxvd3N0YWxlID49IDAgJiYKKwkJCUlOVF9HRVQoYmxwW2xvd3N0YWxlXS5hZGRyZXNzLCBBUkNIX0NPTlZFUlQpICE9IFhGU19ESVIyX05VTExfREFUQVBUUjsKKwkJICAgICBsb3dzdGFsZS0tKQorCQkJY29udGludWU7CisJCWZvciAoaGlnaHN0YWxlID0gbWlkICsgMTsKKwkJICAgICBoaWdoc3RhbGUgPCBJTlRfR0VUKGJ0cC0+Y291bnQsIEFSQ0hfQ09OVkVSVCkgJiYKKwkJCUlOVF9HRVQoYmxwW2hpZ2hzdGFsZV0uYWRkcmVzcywgQVJDSF9DT05WRVJUKSAhPSBYRlNfRElSMl9OVUxMX0RBVEFQVFIgJiYKKwkJCShsb3dzdGFsZSA8IDAgfHwgbWlkIC0gbG93c3RhbGUgPiBoaWdoc3RhbGUgLSBtaWQpOworCQkgICAgIGhpZ2hzdGFsZSsrKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIE1vdmUgZW50cmllcyB0b3dhcmQgdGhlIGxvdy1udW1iZXJlZCBzdGFsZSBlbnRyeS4KKwkJICovCisJCWlmIChsb3dzdGFsZSA+PSAwICYmCisJCSAgICAoaGlnaHN0YWxlID09IElOVF9HRVQoYnRwLT5jb3VudCwgQVJDSF9DT05WRVJUKSB8fAorCQkgICAgIG1pZCAtIGxvd3N0YWxlIDw9IGhpZ2hzdGFsZSAtIG1pZCkpIHsKKwkJCWlmIChtaWQgLSBsb3dzdGFsZSkKKwkJCQltZW1tb3ZlKCZibHBbbG93c3RhbGVdLCAmYmxwW2xvd3N0YWxlICsgMV0sCisJCQkJCShtaWQgLSBsb3dzdGFsZSkgKiBzaXplb2YoKmJscCkpOworCQkJbGZsb2dsb3cgPSBNSU4obG93c3RhbGUsIGxmbG9nbG93KTsKKwkJCWxmbG9naGlnaCA9IE1BWChtaWQsIGxmbG9naGlnaCk7CisJCX0KKwkJLyoKKwkJICogTW92ZSBlbnRyaWVzIHRvd2FyZCB0aGUgaGlnaC1udW1iZXJlZCBzdGFsZSBlbnRyeS4KKwkJICovCisJCWVsc2UgeworCQkJQVNTRVJUKGhpZ2hzdGFsZSA8IElOVF9HRVQoYnRwLT5jb3VudCwgQVJDSF9DT05WRVJUKSk7CisJCQltaWQrKzsKKwkJCWlmIChoaWdoc3RhbGUgLSBtaWQpCisJCQkJbWVtbW92ZSgmYmxwW21pZCArIDFdLCAmYmxwW21pZF0sCisJCQkJCShoaWdoc3RhbGUgLSBtaWQpICogc2l6ZW9mKCpibHApKTsKKwkJCWxmbG9nbG93ID0gTUlOKG1pZCwgbGZsb2dsb3cpOworCQkJbGZsb2doaWdoID0gTUFYKGhpZ2hzdGFsZSwgbGZsb2doaWdoKTsKKwkJfQorCQlJTlRfTU9EKGJ0cC0+c3RhbGUsIEFSQ0hfQ09OVkVSVCwgLTEpOworCX0KKwkvKgorCSAqIFBvaW50IHRvIHRoZSBuZXcgZGF0YSBlbnRyeS4KKwkgKi8KKwlkZXAgPSAoeGZzX2RpcjJfZGF0YV9lbnRyeV90ICopZHVwOworCS8qCisJICogRmlsbCBpbiB0aGUgbGVhZiBlbnRyeS4KKwkgKi8KKwlJTlRfU0VUKGJscFttaWRdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCwgYXJncy0+aGFzaHZhbCk7CisJSU5UX1NFVChibHBbbWlkXS5hZGRyZXNzLCBBUkNIX0NPTlZFUlQsIFhGU19ESVIyX0JZVEVfVE9fREFUQVBUUihtcCwgKGNoYXIgKilkZXAgLSAoY2hhciAqKWJsb2NrKSk7CisJeGZzX2RpcjJfYmxvY2tfbG9nX2xlYWYodHAsIGJwLCBsZmxvZ2xvdywgbGZsb2doaWdoKTsKKwkvKgorCSAqIE1hcmsgc3BhY2UgZm9yIHRoZSBkYXRhIGVudHJ5IHVzZWQuCisJICovCisJeGZzX2RpcjJfZGF0YV91c2VfZnJlZSh0cCwgYnAsIGR1cCwKKwkJKHhmc19kaXIyX2RhdGFfYW9mZl90KSgoY2hhciAqKWR1cCAtIChjaGFyICopYmxvY2spLAorCQkoeGZzX2RpcjJfZGF0YV9hb2ZmX3QpbGVuLCAmbmVlZGxvZywgJm5lZWRzY2FuKTsKKwkvKgorCSAqIENyZWF0ZSB0aGUgbmV3IGRhdGEgZW50cnkuCisJICovCisJSU5UX1NFVChkZXAtPmludW1iZXIsIEFSQ0hfQ09OVkVSVCwgYXJncy0+aW51bWJlcik7CisJZGVwLT5uYW1lbGVuID0gYXJncy0+bmFtZWxlbjsKKwltZW1jcHkoZGVwLT5uYW1lLCBhcmdzLT5uYW1lLCBhcmdzLT5uYW1lbGVuKTsKKwl0YWdwID0gWEZTX0RJUjJfREFUQV9FTlRSWV9UQUdfUChkZXApOworCUlOVF9TRVQoKnRhZ3AsIEFSQ0hfQ09OVkVSVCwgKHhmc19kaXIyX2RhdGFfb2ZmX3QpKChjaGFyICopZGVwIC0gKGNoYXIgKilibG9jaykpOworCS8qCisJICogQ2xlYW4gdXAgdGhlIGJlc3RmcmVlIGFycmF5IGFuZCBsb2cgdGhlIGhlYWRlciwgdGFpbCwgYW5kIGVudHJ5LgorCSAqLworCWlmIChuZWVkc2NhbikKKwkJeGZzX2RpcjJfZGF0YV9mcmVlc2NhbihtcCwgKHhmc19kaXIyX2RhdGFfdCAqKWJsb2NrLCAmbmVlZGxvZywKKwkJCU5VTEwpOworCWlmIChuZWVkbG9nKQorCQl4ZnNfZGlyMl9kYXRhX2xvZ19oZWFkZXIodHAsIGJwKTsKKwl4ZnNfZGlyMl9ibG9ja19sb2dfdGFpbCh0cCwgYnApOworCXhmc19kaXIyX2RhdGFfbG9nX2VudHJ5KHRwLCBicCwgZGVwKTsKKwl4ZnNfZGlyMl9kYXRhX2NoZWNrKGRwLCBicCk7CisJeGZzX2RhX2J1Zl9kb25lKGJwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlYWRkaXIgZm9yIGJsb2NrIGRpcmVjdG9yaWVzLgorICovCitpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2RpcjJfYmxvY2tfZ2V0ZGVudHMoCisJeGZzX3RyYW5zX3QJCSp0cCwJCS8qIHRyYW5zYWN0aW9uIChOVUxMKSAqLworCXhmc19pbm9kZV90CQkqZHAsCQkvKiBpbmNvcmUgaW5vZGUgKi8KKwl1aW9fdAkJCSp1aW8sCQkvKiBjYWxsZXIncyBidWZmZXIgY29udHJvbCAqLworCWludAkJCSplb2ZwLAkJLyogZW9mIHJlYWNoZWQ/IChvdXQpICovCisJeGZzX2RpcmVudF90CQkqZGJwLAkJLyogY2FsbGVyJ3MgYnVmZmVyICovCisJeGZzX2RpcjJfcHV0X3QJCXB1dCkJCS8qIGFiaSdzIGZvcm1hdHRpbmcgZnVuY3Rpb24gKi8KK3sKKwl4ZnNfZGlyMl9ibG9ja190CSpibG9jazsJCS8qIGRpcmVjdG9yeSBibG9jayBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGFidWZfdAkJKmJwOwkJLyogYnVmZmVyIGZvciBibG9jayAqLworCXhmc19kaXIyX2Jsb2NrX3RhaWxfdAkqYnRwOwkJLyogYmxvY2sgdGFpbCAqLworCXhmc19kaXIyX2RhdGFfZW50cnlfdAkqZGVwOwkJLyogYmxvY2sgZGF0YSBlbnRyeSAqLworCXhmc19kaXIyX2RhdGFfdW51c2VkX3QJKmR1cDsJCS8qIGJsb2NrIHVudXNlZCBlbnRyeSAqLworCWNoYXIJCQkqZW5kcHRyOwkvKiBlbmQgb2YgdGhlIGRhdGEgZW50cmllcyAqLworCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJeGZzX21vdW50X3QJCSptcDsJCS8qIGZpbGVzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl4ZnNfZGlyMl9wdXRfYXJnc190CXA7CQkvKiBhcmcgcGFja2FnZSBmb3IgcHV0IHJ0biAqLworCWNoYXIJCQkqcHRyOwkJLyogY3VycmVudCBkYXRhIGVudHJ5ICovCisJaW50CQkJd2FudG9mZjsJLyogc3RhcnRpbmcgYmxvY2sgb2Zmc2V0ICovCisKKwltcCA9IGRwLT5pX21vdW50OworCS8qCisJICogSWYgdGhlIGJsb2NrIG51bWJlciBpbiB0aGUgb2Zmc2V0IGlzIG91dCBvZiByYW5nZSwgd2UncmUgZG9uZS4KKwkgKi8KKwlpZiAoWEZTX0RJUjJfREFUQVBUUl9UT19EQihtcCwgdWlvLT51aW9fb2Zmc2V0KSA+IG1wLT5tX2RpcmRhdGFibGspIHsKKwkJKmVvZnAgPSAxOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBDYW4ndCByZWFkIHRoZSBibG9jaywgZ2l2ZSB1cCwgZWxzZSBnZXQgZGFidWYgaW4gYnAuCisJICovCisJaWYgKChlcnJvciA9CisJICAgIHhmc19kYV9yZWFkX2J1Zih0cCwgZHAsIG1wLT5tX2RpcmRhdGFibGssIC0xLCAmYnAsIFhGU19EQVRBX0ZPUkspKSkgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCUFTU0VSVChicCAhPSBOVUxMKTsKKwkvKgorCSAqIEV4dHJhY3QgdGhlIGJ5dGUgb2Zmc2V0IHdlIHN0YXJ0IGF0IGZyb20gdGhlIHNlZWsgcG9pbnRlci4KKwkgKiBXZSdsbCBza2lwIGVudHJpZXMgYmVmb3JlIHRoaXMuCisJICovCisJd2FudG9mZiA9IFhGU19ESVIyX0RBVEFQVFJfVE9fT0ZGKG1wLCB1aW8tPnVpb19vZmZzZXQpOworCWJsb2NrID0gYnAtPmRhdGE7CisJeGZzX2RpcjJfZGF0YV9jaGVjayhkcCwgYnApOworCS8qCisJICogU2V0IHVwIHZhbHVlcyBmb3IgdGhlIGxvb3AuCisJICovCisJYnRwID0gWEZTX0RJUjJfQkxPQ0tfVEFJTF9QKG1wLCBibG9jayk7CisJcHRyID0gKGNoYXIgKilibG9jay0+dTsKKwllbmRwdHIgPSAoY2hhciAqKVhGU19ESVIyX0JMT0NLX0xFQUZfUChidHApOworCXAuZGJwID0gZGJwOworCXAucHV0ID0gcHV0OworCXAudWlvID0gdWlvOworCS8qCisJICogTG9vcCBvdmVyIHRoZSBkYXRhIHBvcnRpb24gb2YgdGhlIGJsb2NrLgorCSAqIEVhY2ggb2JqZWN0IGlzIGEgcmVhbCBlbnRyeSAoZGVwKSBvciBhbiB1bnVzZWQgb25lIChkdXApLgorCSAqLworCXdoaWxlIChwdHIgPCBlbmRwdHIpIHsKKwkJZHVwID0gKHhmc19kaXIyX2RhdGFfdW51c2VkX3QgKilwdHI7CisJCS8qCisJCSAqIFVudXNlZCwgc2tpcCBpdC4KKwkJICovCisJCWlmIChJTlRfR0VUKGR1cC0+ZnJlZXRhZywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9EQVRBX0ZSRUVfVEFHKSB7CisJCQlwdHIgKz0gSU5UX0dFVChkdXAtPmxlbmd0aCwgQVJDSF9DT05WRVJUKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZGVwID0gKHhmc19kaXIyX2RhdGFfZW50cnlfdCAqKXB0cjsKKworCQkvKgorCQkgKiBCdW1wIHBvaW50ZXIgZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbi4KKwkJICovCisJCXB0ciArPSBYRlNfRElSMl9EQVRBX0VOVFNJWkUoZGVwLT5uYW1lbGVuKTsKKwkJLyoKKwkJICogVGhlIGVudHJ5IGlzIGJlZm9yZSB0aGUgZGVzaXJlZCBzdGFydGluZyBwb2ludCwgc2tpcCBpdC4KKwkJICovCisJCWlmICgoY2hhciAqKWRlcCAtIChjaGFyICopYmxvY2sgPCB3YW50b2ZmKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIFNldCB1cCBhcmd1bWVudCBzdHJ1Y3R1cmUgZm9yIHB1dCByb3V0aW5lLgorCQkgKi8KKwkJcC5uYW1lbGVuID0gZGVwLT5uYW1lbGVuOworCisJCXAuY29vayA9IFhGU19ESVIyX0RCX09GRl9UT19EQVRBUFRSKG1wLCBtcC0+bV9kaXJkYXRhYmxrLAorCQkJCQkJICAgIHB0ciAtIChjaGFyICopYmxvY2spOworCQlwLmlubyA9IElOVF9HRVQoZGVwLT5pbnVtYmVyLCBBUkNIX0NPTlZFUlQpOworI2lmIFhGU19CSUdfSU5VTVMKKwkJcC5pbm8gKz0gbXAtPm1faW5vYWRkOworI2VuZGlmCisJCXAubmFtZSA9IChjaGFyICopZGVwLT5uYW1lOworCisJCS8qCisJCSAqIFB1dCB0aGUgZW50cnkgaW4gdGhlIGNhbGxlcidzIGJ1ZmZlci4KKwkJICovCisJCWVycm9yID0gcC5wdXQoJnApOworCisJCS8qCisJCSAqIElmIGl0IGRpZG4ndCBmaXQsIHNldCB0aGUgZmluYWwgb2Zmc2V0IHRvIGhlcmUgJiByZXR1cm4uCisJCSAqLworCQlpZiAoIXAuZG9uZSkgeworCQkJdWlvLT51aW9fb2Zmc2V0ID0KKwkJCQlYRlNfRElSMl9EQl9PRkZfVE9fREFUQVBUUihtcCwgbXAtPm1fZGlyZGF0YWJsaywKKwkJCQkJKGNoYXIgKilkZXAgLSAoY2hhciAqKWJsb2NrKTsKKwkJCXhmc19kYV9icmVsc2UodHAsIGJwKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCX0KKworCS8qCisJICogUmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBibG9jay4KKwkgKiBTZXQgdGhlIG9mZnNldCB0byBhIG5vbmV4aXN0ZW50IGJsb2NrIDEgYW5kIHJldHVybi4KKwkgKi8KKwkqZW9mcCA9IDE7CisKKwl1aW8tPnVpb19vZmZzZXQgPQorCQlYRlNfRElSMl9EQl9PRkZfVE9fREFUQVBUUihtcCwgbXAtPm1fZGlyZGF0YWJsayArIDEsIDApOworCisJeGZzX2RhX2JyZWxzZSh0cCwgYnApOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBMb2cgbGVhZiBlbnRyaWVzIGZyb20gdGhlIGJsb2NrLgorICovCitzdGF0aWMgdm9pZAoreGZzX2RpcjJfYmxvY2tfbG9nX2xlYWYoCisJeGZzX3RyYW5zX3QJCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHN0cnVjdHVyZSAqLworCXhmc19kYWJ1Zl90CQkqYnAsCQkvKiBibG9jayBidWZmZXIgKi8KKwlpbnQJCQlmaXJzdCwJCS8qIGluZGV4IG9mIGZpcnN0IGxvZ2dlZCBsZWFmICovCisJaW50CQkJbGFzdCkJCS8qIGluZGV4IG9mIGxhc3QgbG9nZ2VkIGxlYWYgKi8KK3sKKwl4ZnNfZGlyMl9ibG9ja190CSpibG9jazsJCS8qIGRpcmVjdG9yeSBibG9jayBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9sZWFmX2VudHJ5X3QJKmJscDsJCS8qIGJsb2NrIGxlYWYgZW50cmllcyAqLworCXhmc19kaXIyX2Jsb2NrX3RhaWxfdAkqYnRwOwkJLyogYmxvY2sgdGFpbCAqLworCXhmc19tb3VudF90CQkqbXA7CQkvKiBmaWxlc3lzdGVtIG1vdW50IHBvaW50ICovCisKKwltcCA9IHRwLT50X21vdW50cDsKKwlibG9jayA9IGJwLT5kYXRhOworCWJ0cCA9IFhGU19ESVIyX0JMT0NLX1RBSUxfUChtcCwgYmxvY2spOworCWJscCA9IFhGU19ESVIyX0JMT0NLX0xFQUZfUChidHApOworCXhmc19kYV9sb2dfYnVmKHRwLCBicCwgKHVpbnQpKChjaGFyICopJmJscFtmaXJzdF0gLSAoY2hhciAqKWJsb2NrKSwKKwkJKHVpbnQpKChjaGFyICopJmJscFtsYXN0ICsgMV0gLSAoY2hhciAqKWJsb2NrIC0gMSkpOworfQorCisvKgorICogTG9nIHRoZSBibG9jayB0YWlsLgorICovCitzdGF0aWMgdm9pZAoreGZzX2RpcjJfYmxvY2tfbG9nX3RhaWwoCisJeGZzX3RyYW5zX3QJCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHN0cnVjdHVyZSAqLworCXhmc19kYWJ1Zl90CQkqYnApCQkvKiBibG9jayBidWZmZXIgKi8KK3sKKwl4ZnNfZGlyMl9ibG9ja190CSpibG9jazsJCS8qIGRpcmVjdG9yeSBibG9jayBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9ibG9ja190YWlsX3QJKmJ0cDsJCS8qIGJsb2NrIHRhaWwgKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLworCisJbXAgPSB0cC0+dF9tb3VudHA7CisJYmxvY2sgPSBicC0+ZGF0YTsKKwlidHAgPSBYRlNfRElSMl9CTE9DS19UQUlMX1AobXAsIGJsb2NrKTsKKwl4ZnNfZGFfbG9nX2J1Zih0cCwgYnAsICh1aW50KSgoY2hhciAqKWJ0cCAtIChjaGFyICopYmxvY2spLAorCQkodWludCkoKGNoYXIgKikoYnRwICsgMSkgLSAoY2hhciAqKWJsb2NrIC0gMSkpOworfQorCisvKgorICogTG9vayB1cCBhbiBlbnRyeSBpbiB0aGUgYmxvY2suICBUaGlzIGlzIHRoZSBleHRlcm5hbCByb3V0aW5lLAorICogeGZzX2RpcjJfYmxvY2tfbG9va3VwX2ludCBkb2VzIHRoZSByZWFsIHdvcmsuCisgKi8KK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9ibG9ja19sb29rdXAoCisJeGZzX2RhX2FyZ3NfdAkJKmFyZ3MpCQkvKiBkaXIgbG9va3VwIGFyZ3VtZW50cyAqLworeworCXhmc19kaXIyX2Jsb2NrX3QJKmJsb2NrOwkJLyogYmxvY2sgc3RydWN0dXJlICovCisJeGZzX2RpcjJfbGVhZl9lbnRyeV90CSpibHA7CQkvKiBibG9jayBsZWFmIGVudHJpZXMgKi8KKwl4ZnNfZGFidWZfdAkJKmJwOwkJLyogYmxvY2sgYnVmZmVyICovCisJeGZzX2RpcjJfYmxvY2tfdGFpbF90CSpidHA7CQkvKiBibG9jayB0YWlsICovCisJeGZzX2RpcjJfZGF0YV9lbnRyeV90CSpkZXA7CQkvKiBibG9jayBkYXRhIGVudHJ5ICovCisJeGZzX2lub2RlX3QJCSpkcDsJCS8qIGluY29yZSBpbm9kZSAqLworCWludAkJCWVudDsJCS8qIGVudHJ5IGluZGV4ICovCisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLworCisJeGZzX2RpcjJfdHJhY2VfYXJncygiYmxvY2tfbG9va3VwIiwgYXJncyk7CisJLyoKKwkgKiBHZXQgdGhlIGJ1ZmZlciwgbG9vayB1cCB0aGUgZW50cnkuCisJICogSWYgbm90IGZvdW5kIChFTk9FTlQpIHRoZW4gcmV0dXJuLCBoYXZlIG5vIGJ1ZmZlci4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2RpcjJfYmxvY2tfbG9va3VwX2ludChhcmdzLCAmYnAsICZlbnQpKSkKKwkJcmV0dXJuIGVycm9yOworCWRwID0gYXJncy0+ZHA7CisJbXAgPSBkcC0+aV9tb3VudDsKKwlibG9jayA9IGJwLT5kYXRhOworCXhmc19kaXIyX2RhdGFfY2hlY2soZHAsIGJwKTsKKwlidHAgPSBYRlNfRElSMl9CTE9DS19UQUlMX1AobXAsIGJsb2NrKTsKKwlibHAgPSBYRlNfRElSMl9CTE9DS19MRUFGX1AoYnRwKTsKKwkvKgorCSAqIEdldCB0aGUgb2Zmc2V0IGZyb20gdGhlIGxlYWYgZW50cnksIHRvIHBvaW50IHRvIHRoZSBkYXRhLgorCSAqLworCWRlcCA9ICh4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgKikKKwkgICAgICAoKGNoYXIgKilibG9jayArIFhGU19ESVIyX0RBVEFQVFJfVE9fT0ZGKG1wLCBJTlRfR0VUKGJscFtlbnRdLmFkZHJlc3MsIEFSQ0hfQ09OVkVSVCkpKTsKKwkvKgorCSAqIEZpbGwgaW4gaW5vZGUgbnVtYmVyLCByZWxlYXNlIHRoZSBibG9jay4KKwkgKi8KKwlhcmdzLT5pbnVtYmVyID0gSU5UX0dFVChkZXAtPmludW1iZXIsIEFSQ0hfQ09OVkVSVCk7CisJeGZzX2RhX2JyZWxzZShhcmdzLT50cmFucywgYnApOworCXJldHVybiBYRlNfRVJST1IoRUVYSVNUKTsKK30KKworLyoKKyAqIEludGVybmFsIGJsb2NrIGxvb2t1cCByb3V0aW5lLgorICovCitzdGF0aWMgaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2RpcjJfYmxvY2tfbG9va3VwX2ludCgKKwl4ZnNfZGFfYXJnc190CQkqYXJncywJCS8qIGRpciBsb29rdXAgYXJndW1lbnRzICovCisJeGZzX2RhYnVmX3QJCSoqYnBwLAkJLyogcmV0dXJuZWQgYmxvY2sgYnVmZmVyICovCisJaW50CQkJKmVudG5vKQkJLyogcmV0dXJuZWQgZW50cnkgbnVtYmVyICovCit7CisJeGZzX2RpcjJfZGF0YXB0cl90CWFkZHI7CQkvKiBkYXRhIGVudHJ5IGFkZHJlc3MgKi8KKwl4ZnNfZGlyMl9ibG9ja190CSpibG9jazsJCS8qIGJsb2NrIHN0cnVjdHVyZSAqLworCXhmc19kaXIyX2xlYWZfZW50cnlfdAkqYmxwOwkJLyogYmxvY2sgbGVhZiBlbnRyaWVzICovCisJeGZzX2RhYnVmX3QJCSpicDsJCS8qIGJsb2NrIGJ1ZmZlciAqLworCXhmc19kaXIyX2Jsb2NrX3RhaWxfdAkqYnRwOwkJLyogYmxvY2sgdGFpbCAqLworCXhmc19kaXIyX2RhdGFfZW50cnlfdAkqZGVwOwkJLyogYmxvY2sgZGF0YSBlbnRyeSAqLworCXhmc19pbm9kZV90CQkqZHA7CQkvKiBpbmNvcmUgaW5vZGUgKi8KKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCXhmc19kYWhhc2hfdAkJaGFzaDsJCS8qIGZvdW5kIGhhc2ggdmFsdWUgKi8KKwlpbnQJCQloaWdoOwkJLyogYmluYXJ5IHNlYXJjaCBoaWdoIGluZGV4ICovCisJaW50CQkJbG93OwkJLyogYmluYXJ5IHNlYXJjaCBsb3cgaW5kZXggKi8KKwlpbnQJCQltaWQ7CQkvKiBiaW5hcnkgc2VhcmNoIGN1cnJlbnQgaWR4ICovCisJeGZzX21vdW50X3QJCSptcDsJCS8qIGZpbGVzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl4ZnNfdHJhbnNfdAkJKnRwOwkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCisJZHAgPSBhcmdzLT5kcDsKKwl0cCA9IGFyZ3MtPnRyYW5zOworCW1wID0gZHAtPmlfbW91bnQ7CisJLyoKKwkgKiBSZWFkIHRoZSBidWZmZXIsIHJldHVybiBlcnJvciBpZiB3ZSBjYW4ndCBnZXQgaXQuCisJICovCisJaWYgKChlcnJvciA9CisJICAgIHhmc19kYV9yZWFkX2J1Zih0cCwgZHAsIG1wLT5tX2RpcmRhdGFibGssIC0xLCAmYnAsIFhGU19EQVRBX0ZPUkspKSkgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCUFTU0VSVChicCAhPSBOVUxMKTsKKwlibG9jayA9IGJwLT5kYXRhOworCXhmc19kaXIyX2RhdGFfY2hlY2soZHAsIGJwKTsKKwlidHAgPSBYRlNfRElSMl9CTE9DS19UQUlMX1AobXAsIGJsb2NrKTsKKwlibHAgPSBYRlNfRElSMl9CTE9DS19MRUFGX1AoYnRwKTsKKwkvKgorCSAqIExvb3AgZG9pbmcgYSBiaW5hcnkgc2VhcmNoIGZvciBvdXIgaGFzaCB2YWx1ZS4KKwkgKiBGaW5kIG91ciBlbnRyeSwgRU5PRU5UIGlmIGl0J3Mgbm90IHRoZXJlLgorCSAqLworCWZvciAobG93ID0gMCwgaGlnaCA9IElOVF9HRVQoYnRwLT5jb3VudCwgQVJDSF9DT05WRVJUKSAtIDE7IDsgKSB7CisJCUFTU0VSVChsb3cgPD0gaGlnaCk7CisJCW1pZCA9IChsb3cgKyBoaWdoKSA+PiAxOworCQlpZiAoKGhhc2ggPSBJTlRfR0VUKGJscFttaWRdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkpID09IGFyZ3MtPmhhc2h2YWwpCisJCQlicmVhazsKKwkJaWYgKGhhc2ggPCBhcmdzLT5oYXNodmFsKQorCQkJbG93ID0gbWlkICsgMTsKKwkJZWxzZQorCQkJaGlnaCA9IG1pZCAtIDE7CisJCWlmIChsb3cgPiBoaWdoKSB7CisJCQlBU1NFUlQoYXJncy0+b2tub2VudCk7CisJCQl4ZnNfZGFfYnJlbHNlKHRwLCBicCk7CisJCQlyZXR1cm4gWEZTX0VSUk9SKEVOT0VOVCk7CisJCX0KKwl9CisJLyoKKwkgKiBCYWNrIHVwIHRvIHRoZSBmaXJzdCBvbmUgd2l0aCB0aGUgcmlnaHQgaGFzaCB2YWx1ZS4KKwkgKi8KKwl3aGlsZSAobWlkID4gMCAmJiBJTlRfR0VUKGJscFttaWQgLSAxXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpID09IGFyZ3MtPmhhc2h2YWwpIHsKKwkJbWlkLS07CisJfQorCS8qCisJICogTm93IGxvb3AgZm9yd2FyZCB0aHJvdWdoIGFsbCB0aGUgZW50cmllcyB3aXRoIHRoZQorCSAqIHJpZ2h0IGhhc2ggdmFsdWUgbG9va2luZyBmb3Igb3VyIG5hbWUuCisJICovCisJZG8geworCQlpZiAoKGFkZHIgPSBJTlRfR0VUKGJscFttaWRdLmFkZHJlc3MsIEFSQ0hfQ09OVkVSVCkpID09IFhGU19ESVIyX05VTExfREFUQVBUUikKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBHZXQgcG9pbnRlciB0byB0aGUgZW50cnkgZnJvbSB0aGUgbGVhZi4KKwkJICovCisJCWRlcCA9ICh4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgKikKKwkJCSgoY2hhciAqKWJsb2NrICsgWEZTX0RJUjJfREFUQVBUUl9UT19PRkYobXAsIGFkZHIpKTsKKwkJLyoKKwkJICogQ29tcGFyZSwgaWYgaXQncyByaWdodCBnaXZlIGJhY2sgYnVmZmVyICYgZW50cnkgbnVtYmVyLgorCQkgKi8KKwkJaWYgKGRlcC0+bmFtZWxlbiA9PSBhcmdzLT5uYW1lbGVuICYmCisJCSAgICBkZXAtPm5hbWVbMF0gPT0gYXJncy0+bmFtZVswXSAmJgorCQkgICAgbWVtY21wKGRlcC0+bmFtZSwgYXJncy0+bmFtZSwgYXJncy0+bmFtZWxlbikgPT0gMCkgeworCQkJKmJwcCA9IGJwOworCQkJKmVudG5vID0gbWlkOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IHdoaWxlICgrK21pZCA8IElOVF9HRVQoYnRwLT5jb3VudCwgQVJDSF9DT05WRVJUKSAmJiBJTlRfR0VUKGJscFttaWRdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkgPT0gaGFzaCk7CisJLyoKKwkgKiBObyBtYXRjaCwgcmVsZWFzZSB0aGUgYnVmZmVyIGFuZCByZXR1cm4gRU5PRU5ULgorCSAqLworCUFTU0VSVChhcmdzLT5va25vZW50KTsKKwl4ZnNfZGFfYnJlbHNlKHRwLCBicCk7CisJcmV0dXJuIFhGU19FUlJPUihFTk9FTlQpOworfQorCisvKgorICogUmVtb3ZlIGFuIGVudHJ5IGZyb20gYSBibG9jayBmb3JtYXQgZGlyZWN0b3J5LgorICogSWYgdGhhdCBtYWtlcyB0aGUgYmxvY2sgc21hbGwgZW5vdWdoIHRvIGZpdCBpbiBzaG9ydGZvcm0sIHRyYW5zZm9ybSBpdC4KKyAqLworaW50CQkJCQkJLyogZXJyb3IgKi8KK3hmc19kaXIyX2Jsb2NrX3JlbW92ZW5hbWUoCisJeGZzX2RhX2FyZ3NfdAkJKmFyZ3MpCQkvKiBkaXJlY3Rvcnkgb3BlcmF0aW9uIGFyZ3MgKi8KK3sKKwl4ZnNfZGlyMl9ibG9ja190CSpibG9jazsJCS8qIGJsb2NrIHN0cnVjdHVyZSAqLworCXhmc19kaXIyX2xlYWZfZW50cnlfdAkqYmxwOwkJLyogYmxvY2sgbGVhZiBwb2ludGVyICovCisJeGZzX2RhYnVmX3QJCSpicDsJCS8qIGJsb2NrIGJ1ZmZlciAqLworCXhmc19kaXIyX2Jsb2NrX3RhaWxfdAkqYnRwOwkJLyogYmxvY2sgdGFpbCAqLworCXhmc19kaXIyX2RhdGFfZW50cnlfdAkqZGVwOwkJLyogYmxvY2sgZGF0YSBlbnRyeSAqLworCXhmc19pbm9kZV90CQkqZHA7CQkvKiBpbmNvcmUgaW5vZGUgKi8KKwlpbnQJCQllbnQ7CQkvKiBibG9jayBsZWFmIGVudHJ5IGluZGV4ICovCisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLworCWludAkJCW5lZWRsb2c7CS8qIG5lZWQgdG8gbG9nIGJsb2NrIGhlYWRlciAqLworCWludAkJCW5lZWRzY2FuOwkvKiBuZWVkIHRvIGZpeHVwIGJlc3RmcmVlICovCisJeGZzX2RpcjJfc2ZfaGRyX3QJc2ZoOwkJLyogc2hvcnRmb3JtIGhlYWRlciAqLworCWludAkJCXNpemU7CQkvKiBzaG9ydGZvcm0gc2l6ZSAqLworCXhmc190cmFuc190CQkqdHA7CQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisKKwl4ZnNfZGlyMl90cmFjZV9hcmdzKCJibG9ja19yZW1vdmVuYW1lIiwgYXJncyk7CisJLyoKKwkgKiBMb29rIHVwIHRoZSBlbnRyeSBpbiB0aGUgYmxvY2suICBHZXRzIHRoZSBidWZmZXIgYW5kIGVudHJ5IGluZGV4LgorCSAqIEl0IHdpbGwgYWx3YXlzIGJlIHRoZXJlLCB0aGUgdm5vZGVvcHMgbGV2ZWwgZG9lcyBhIGxvb2t1cCBmaXJzdC4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2RpcjJfYmxvY2tfbG9va3VwX2ludChhcmdzLCAmYnAsICZlbnQpKSkgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCWRwID0gYXJncy0+ZHA7CisJdHAgPSBhcmdzLT50cmFuczsKKwltcCA9IGRwLT5pX21vdW50OworCWJsb2NrID0gYnAtPmRhdGE7CisJYnRwID0gWEZTX0RJUjJfQkxPQ0tfVEFJTF9QKG1wLCBibG9jayk7CisJYmxwID0gWEZTX0RJUjJfQkxPQ0tfTEVBRl9QKGJ0cCk7CisJLyoKKwkgKiBQb2ludCB0byB0aGUgZGF0YSBlbnRyeSB1c2luZyB0aGUgbGVhZiBlbnRyeS4KKwkgKi8KKwlkZXAgPSAoeGZzX2RpcjJfZGF0YV9lbnRyeV90ICopCisJICAgICAgKChjaGFyICopYmxvY2sgKyBYRlNfRElSMl9EQVRBUFRSX1RPX09GRihtcCwgSU5UX0dFVChibHBbZW50XS5hZGRyZXNzLCBBUkNIX0NPTlZFUlQpKSk7CisJLyoKKwkgKiBNYXJrIHRoZSBkYXRhIGVudHJ5J3Mgc3BhY2UgZnJlZS4KKwkgKi8KKwluZWVkbG9nID0gbmVlZHNjYW4gPSAwOworCXhmc19kaXIyX2RhdGFfbWFrZV9mcmVlKHRwLCBicCwKKwkJKHhmc19kaXIyX2RhdGFfYW9mZl90KSgoY2hhciAqKWRlcCAtIChjaGFyICopYmxvY2spLAorCQlYRlNfRElSMl9EQVRBX0VOVFNJWkUoZGVwLT5uYW1lbGVuKSwgJm5lZWRsb2csICZuZWVkc2Nhbik7CisJLyoKKwkgKiBGaXggdXAgdGhlIGJsb2NrIHRhaWwuCisJICovCisJSU5UX01PRChidHAtPnN0YWxlLCBBUkNIX0NPTlZFUlQsICsxKTsKKwl4ZnNfZGlyMl9ibG9ja19sb2dfdGFpbCh0cCwgYnApOworCS8qCisJICogUmVtb3ZlIHRoZSBsZWFmIGVudHJ5IGJ5IG1hcmtpbmcgaXQgc3RhbGUuCisJICovCisJSU5UX1NFVChibHBbZW50XS5hZGRyZXNzLCBBUkNIX0NPTlZFUlQsIFhGU19ESVIyX05VTExfREFUQVBUUik7CisJeGZzX2RpcjJfYmxvY2tfbG9nX2xlYWYodHAsIGJwLCBlbnQsIGVudCk7CisJLyoKKwkgKiBGaXggdXAgYmVzdGZyZWUsIGxvZyB0aGUgaGVhZGVyIGlmIG5lY2Vzc2FyeS4KKwkgKi8KKwlpZiAobmVlZHNjYW4pCisJCXhmc19kaXIyX2RhdGFfZnJlZXNjYW4obXAsICh4ZnNfZGlyMl9kYXRhX3QgKilibG9jaywgJm5lZWRsb2csCisJCQlOVUxMKTsKKwlpZiAobmVlZGxvZykKKwkJeGZzX2RpcjJfZGF0YV9sb2dfaGVhZGVyKHRwLCBicCk7CisJeGZzX2RpcjJfZGF0YV9jaGVjayhkcCwgYnApOworCS8qCisJICogU2VlIGlmIHRoZSBzaXplIGFzIGEgc2hvcnRmb3JtIGlzIGdvb2QgZW5vdWdoLgorCSAqLworCWlmICgoc2l6ZSA9IHhmc19kaXIyX2Jsb2NrX3Nmc2l6ZShkcCwgYmxvY2ssICZzZmgpKSA+CisJICAgIFhGU19JRk9SS19EU0laRShkcCkpIHsKKwkJeGZzX2RhX2J1Zl9kb25lKGJwKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogSWYgaXQgd29ya3MsIGRvIHRoZSBjb252ZXJzaW9uLgorCSAqLworCXJldHVybiB4ZnNfZGlyMl9ibG9ja190b19zZihhcmdzLCBicCwgc2l6ZSwgJnNmaCk7Cit9CisKKy8qCisgKiBSZXBsYWNlIGFuIGVudHJ5IGluIGEgVjIgYmxvY2sgZGlyZWN0b3J5LgorICogQ2hhbmdlIHRoZSBpbm9kZSBudW1iZXIgdG8gdGhlIG5ldyB2YWx1ZS4KKyAqLworaW50CQkJCQkJLyogZXJyb3IgKi8KK3hmc19kaXIyX2Jsb2NrX3JlcGxhY2UoCisJeGZzX2RhX2FyZ3NfdAkJKmFyZ3MpCQkvKiBkaXJlY3Rvcnkgb3BlcmF0aW9uIGFyZ3MgKi8KK3sKKwl4ZnNfZGlyMl9ibG9ja190CSpibG9jazsJCS8qIGJsb2NrIHN0cnVjdHVyZSAqLworCXhmc19kaXIyX2xlYWZfZW50cnlfdAkqYmxwOwkJLyogYmxvY2sgbGVhZiBlbnRyaWVzICovCisJeGZzX2RhYnVmX3QJCSpicDsJCS8qIGJsb2NrIGJ1ZmZlciAqLworCXhmc19kaXIyX2Jsb2NrX3RhaWxfdAkqYnRwOwkJLyogYmxvY2sgdGFpbCAqLworCXhmc19kaXIyX2RhdGFfZW50cnlfdAkqZGVwOwkJLyogYmxvY2sgZGF0YSBlbnRyeSAqLworCXhmc19pbm9kZV90CQkqZHA7CQkvKiBpbmNvcmUgaW5vZGUgKi8KKwlpbnQJCQllbnQ7CQkvKiBsZWFmIGVudHJ5IGluZGV4ICovCisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLworCisJeGZzX2RpcjJfdHJhY2VfYXJncygiYmxvY2tfcmVwbGFjZSIsIGFyZ3MpOworCS8qCisJICogTG9va3VwIHRoZSBlbnRyeSBpbiB0aGUgZGlyZWN0b3J5LiAgR2V0IGJ1ZmZlciBhbmQgZW50cnkgaW5kZXguCisJICogVGhpcyB3aWxsIGFsd2F5cyBzdWNjZWVkIHNpbmNlIHRoZSBjYWxsZXIgaGFzIGFscmVhZHkgZG9uZSBhIGxvb2t1cC4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2RpcjJfYmxvY2tfbG9va3VwX2ludChhcmdzLCAmYnAsICZlbnQpKSkgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCWRwID0gYXJncy0+ZHA7CisJbXAgPSBkcC0+aV9tb3VudDsKKwlibG9jayA9IGJwLT5kYXRhOworCWJ0cCA9IFhGU19ESVIyX0JMT0NLX1RBSUxfUChtcCwgYmxvY2spOworCWJscCA9IFhGU19ESVIyX0JMT0NLX0xFQUZfUChidHApOworCS8qCisJICogUG9pbnQgdG8gdGhlIGRhdGEgZW50cnkgd2UgbmVlZCB0byBjaGFuZ2UuCisJICovCisJZGVwID0gKHhmc19kaXIyX2RhdGFfZW50cnlfdCAqKQorCSAgICAgICgoY2hhciAqKWJsb2NrICsgWEZTX0RJUjJfREFUQVBUUl9UT19PRkYobXAsIElOVF9HRVQoYmxwW2VudF0uYWRkcmVzcywgQVJDSF9DT05WRVJUKSkpOworCUFTU0VSVChJTlRfR0VUKGRlcC0+aW51bWJlciwgQVJDSF9DT05WRVJUKSAhPSBhcmdzLT5pbnVtYmVyKTsKKwkvKgorCSAqIENoYW5nZSB0aGUgaW5vZGUgbnVtYmVyIHRvIHRoZSBuZXcgdmFsdWUuCisJICovCisJSU5UX1NFVChkZXAtPmludW1iZXIsIEFSQ0hfQ09OVkVSVCwgYXJncy0+aW51bWJlcik7CisJeGZzX2RpcjJfZGF0YV9sb2dfZW50cnkoYXJncy0+dHJhbnMsIGJwLCBkZXApOworCXhmc19kaXIyX2RhdGFfY2hlY2soZHAsIGJwKTsKKwl4ZnNfZGFfYnVmX2RvbmUoYnApOworCXJldHVybiAwOworfQorCisvKgorICogUXNvcnQgY29tcGFyaXNvbiByb3V0aW5lIGZvciB0aGUgYmxvY2sgbGVhZiBlbnRyaWVzLgorICovCitzdGF0aWMgaW50CQkJCQkvKiBzb3J0IG9yZGVyICovCit4ZnNfZGlyMl9ibG9ja19zb3J0KAorCWNvbnN0IHZvaWQJCQkqYSwJLyogZmlyc3QgbGVhZiBlbnRyeSAqLworCWNvbnN0IHZvaWQJCQkqYikJLyogc2Vjb25kIGxlYWYgZW50cnkgKi8KK3sKKwljb25zdCB4ZnNfZGlyMl9sZWFmX2VudHJ5X3QJKmxhOwkvKiBmaXJzdCBsZWFmIGVudHJ5ICovCisJY29uc3QgeGZzX2RpcjJfbGVhZl9lbnRyeV90CSpsYjsJLyogc2Vjb25kIGxlYWYgZW50cnkgKi8KKworCWxhID0gYTsKKwlsYiA9IGI7CisJcmV0dXJuIElOVF9HRVQobGEtPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkgPCBJTlRfR0VUKGxiLT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpID8gLTEgOgorCQkoSU5UX0dFVChsYS0+aGFzaHZhbCwgQVJDSF9DT05WRVJUKSA+IElOVF9HRVQobGItPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkgPyAxIDogMCk7Cit9CisKKy8qCisgKiBDb252ZXJ0IGEgVjIgbGVhZiBkaXJlY3RvcnkgdG8gYSBWMiBibG9jayBkaXJlY3RvcnkgaWYgcG9zc2libGUuCisgKi8KK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9sZWFmX3RvX2Jsb2NrKAorCXhmc19kYV9hcmdzX3QJCSphcmdzLAkJLyogb3BlcmF0aW9uIGFyZ3VtZW50cyAqLworCXhmc19kYWJ1Zl90CQkqbGJwLAkJLyogbGVhZiBidWZmZXIgKi8KKwl4ZnNfZGFidWZfdAkJKmRicCkJCS8qIGRhdGEgYnVmZmVyICovCit7CisJeGZzX2RpcjJfZGF0YV9vZmZfdAkqYmVzdHNwOwkvKiBsZWFmIGJlc3RzIHRhYmxlICovCisJeGZzX2RpcjJfYmxvY2tfdAkqYmxvY2s7CQkvKiBibG9jayBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9ibG9ja190YWlsX3QJKmJ0cDsJCS8qIGJsb2NrIHRhaWwgKi8KKwl4ZnNfaW5vZGVfdAkJKmRwOwkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLworCXhmc19kaXIyX2RhdGFfdW51c2VkX3QJKmR1cDsJCS8qIHVudXNlZCBkYXRhIGVudHJ5ICovCisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwlpbnQJCQlmcm9tOwkJLyogbGVhZiBmcm9tIGluZGV4ICovCisJeGZzX2RpcjJfbGVhZl90CQkqbGVhZjsJCS8qIGxlYWYgc3RydWN0dXJlICovCisJeGZzX2RpcjJfbGVhZl9lbnRyeV90CSpsZXA7CQkvKiBsZWFmIGVudHJ5ICovCisJeGZzX2RpcjJfbGVhZl90YWlsX3QJKmx0cDsJCS8qIGxlYWYgdGFpbCBzdHJ1Y3R1cmUgKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwlpbnQJCQluZWVkbG9nOwkvKiBuZWVkIHRvIGxvZyBkYXRhIGhlYWRlciAqLworCWludAkJCW5lZWRzY2FuOwkvKiBuZWVkIHRvIHNjYW4gZm9yIGJlc3RmcmVlICovCisJeGZzX2RpcjJfc2ZfaGRyX3QJc2ZoOwkJLyogc2hvcnRmb3JtIGhlYWRlciAqLworCWludAkJCXNpemU7CQkvKiBieXRlcyB1c2VkICovCisJeGZzX2RpcjJfZGF0YV9vZmZfdAkqdGFncDsJCS8qIGVuZCBvZiBlbnRyeSAodGFnKSAqLworCWludAkJCXRvOwkJLyogYmxvY2svbGVhZiB0byBpbmRleCAqLworCXhmc190cmFuc190CQkqdHA7CQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisKKwl4ZnNfZGlyMl90cmFjZV9hcmdzX2JiKCJsZWFmX3RvX2Jsb2NrIiwgYXJncywgbGJwLCBkYnApOworCWRwID0gYXJncy0+ZHA7CisJdHAgPSBhcmdzLT50cmFuczsKKwltcCA9IGRwLT5pX21vdW50OworCWxlYWYgPSBsYnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQobGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfTEVBRjFfTUFHSUMpOworCWx0cCA9IFhGU19ESVIyX0xFQUZfVEFJTF9QKG1wLCBsZWFmKTsKKwkvKgorCSAqIElmIHRoZXJlIGFyZSBkYXRhIGJsb2NrcyBvdGhlciB0aGFuIHRoZSBmaXJzdCBvbmUsIHRha2UgdGhpcworCSAqIG9wcG9ydHVuaXR5IHRvIHJlbW92ZSB0cmFpbGluZyBlbXB0eSBkYXRhIGJsb2NrcyB0aGF0IG1heSBoYXZlCisJICogYmVlbiBsZWZ0IGJlaGluZCBkdXJpbmcgbm8tc3BhY2UtcmVzZXJ2YXRpb24gb3BlcmF0aW9ucy4KKwkgKiBUaGVzZSB3aWxsIHNob3cgdXAgaW4gdGhlIGxlYWYgYmVzdHMgdGFibGUuCisJICovCisJd2hpbGUgKGRwLT5pX2QuZGlfc2l6ZSA+IG1wLT5tX2RpcmJsa3NpemUpIHsKKwkJYmVzdHNwID0gWEZTX0RJUjJfTEVBRl9CRVNUU19QKGx0cCk7CisJCWlmIChJTlRfR0VUKGJlc3RzcFtJTlRfR0VUKGx0cC0+YmVzdGNvdW50LCBBUkNIX0NPTlZFUlQpIC0gMV0sIEFSQ0hfQ09OVkVSVCkgPT0KKwkJICAgIG1wLT5tX2RpcmJsa3NpemUgLSAodWludClzaXplb2YoYmxvY2stPmhkcikpIHsKKwkJCWlmICgoZXJyb3IgPQorCQkJICAgIHhmc19kaXIyX2xlYWZfdHJpbV9kYXRhKGFyZ3MsIGxicCwKKwkJCQkgICAgKHhmc19kaXIyX2RiX3QpKElOVF9HRVQobHRwLT5iZXN0Y291bnQsIEFSQ0hfQ09OVkVSVCkgLSAxKSkpKQorCQkJCWdvdG8gb3V0OworCQl9IGVsc2UgeworCQkJZXJyb3IgPSAwOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJLyoKKwkgKiBSZWFkIHRoZSBkYXRhIGJsb2NrIGlmIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBpdCwgZ2l2ZSB1cCBpZiBpdCBmYWlscy4KKwkgKi8KKwlpZiAoZGJwID09IE5VTEwgJiYKKwkgICAgKGVycm9yID0geGZzX2RhX3JlYWRfYnVmKHRwLCBkcCwgbXAtPm1fZGlyZGF0YWJsaywgLTEsICZkYnAsCisJCSAgICBYRlNfREFUQV9GT1JLKSkpIHsKKwkJZ290byBvdXQ7CisJfQorCWJsb2NrID0gZGJwLT5kYXRhOworCUFTU0VSVChJTlRfR0VUKGJsb2NrLT5oZHIubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfREFUQV9NQUdJQyk7CisJLyoKKwkgKiBTaXplIG9mIHRoZSAibGVhZiIgYXJlYSBpbiB0aGUgYmxvY2suCisJICovCisJc2l6ZSA9ICh1aW50KXNpemVvZihibG9jay0+dGFpbCkgKworCSAgICAgICAodWludClzaXplb2YoKmxlcCkgKiAoSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgLSBJTlRfR0VUKGxlYWYtPmhkci5zdGFsZSwgQVJDSF9DT05WRVJUKSk7CisJLyoKKwkgKiBMb29rIGF0IHRoZSBsYXN0IGRhdGEgZW50cnkuCisJICovCisJdGFncCA9ICh4ZnNfZGlyMl9kYXRhX29mZl90ICopKChjaGFyICopYmxvY2sgKyBtcC0+bV9kaXJibGtzaXplKSAtIDE7CisJZHVwID0gKHhmc19kaXIyX2RhdGFfdW51c2VkX3QgKikoKGNoYXIgKilibG9jayArIElOVF9HRVQoKnRhZ3AsIEFSQ0hfQ09OVkVSVCkpOworCS8qCisJICogSWYgaXQncyBub3QgZnJlZSBvciBpcyB0b28gc2hvcnQgd2UgY2FuJ3QgZG8gaXQuCisJICovCisJaWYgKElOVF9HRVQoZHVwLT5mcmVldGFnLCBBUkNIX0NPTlZFUlQpICE9IFhGU19ESVIyX0RBVEFfRlJFRV9UQUcgfHwgSU5UX0dFVChkdXAtPmxlbmd0aCwgQVJDSF9DT05WRVJUKSA8IHNpemUpIHsKKwkJZXJyb3IgPSAwOworCQlnb3RvIG91dDsKKwl9CisJLyoKKwkgKiBTdGFydCBjb252ZXJ0aW5nIGl0IHRvIGJsb2NrIGZvcm0uCisJICovCisJSU5UX1NFVChibG9jay0+aGRyLm1hZ2ljLCBBUkNIX0NPTlZFUlQsIFhGU19ESVIyX0JMT0NLX01BR0lDKTsKKwluZWVkbG9nID0gMTsKKwluZWVkc2NhbiA9IDA7CisJLyoKKwkgKiBVc2UgdXAgdGhlIHNwYWNlIGF0IHRoZSBlbmQgb2YgdGhlIGJsb2NrIChibHAvYnRwKS4KKwkgKi8KKwl4ZnNfZGlyMl9kYXRhX3VzZV9mcmVlKHRwLCBkYnAsIGR1cCwgbXAtPm1fZGlyYmxrc2l6ZSAtIHNpemUsIHNpemUsCisJCSZuZWVkbG9nLCAmbmVlZHNjYW4pOworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgYmxvY2sgdGFpbC4KKwkgKi8KKwlidHAgPSBYRlNfRElSMl9CTE9DS19UQUlMX1AobXAsIGJsb2NrKTsKKwlJTlRfU0VUKGJ0cC0+Y291bnQsIEFSQ0hfQ09OVkVSVCwgSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgLSBJTlRfR0VUKGxlYWYtPmhkci5zdGFsZSwgQVJDSF9DT05WRVJUKSk7CisJYnRwLT5zdGFsZSA9IDA7CisJeGZzX2RpcjJfYmxvY2tfbG9nX3RhaWwodHAsIGRicCk7CisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBibG9jayBsZWFmIGFyZWEuICBXZSBjb21wYWN0IG91dCBzdGFsZSBlbnRyaWVzLgorCSAqLworCWxlcCA9IFhGU19ESVIyX0JMT0NLX0xFQUZfUChidHApOworCWZvciAoZnJvbSA9IHRvID0gMDsgZnJvbSA8IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOyBmcm9tKyspIHsKKwkJaWYgKElOVF9HRVQobGVhZi0+ZW50c1tmcm9tXS5hZGRyZXNzLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX05VTExfREFUQVBUUikKKwkJCWNvbnRpbnVlOworCQlsZXBbdG8rK10gPSBsZWFmLT5lbnRzW2Zyb21dOworCX0KKwlBU1NFUlQodG8gPT0gSU5UX0dFVChidHAtPmNvdW50LCBBUkNIX0NPTlZFUlQpKTsKKwl4ZnNfZGlyMl9ibG9ja19sb2dfbGVhZih0cCwgZGJwLCAwLCBJTlRfR0VUKGJ0cC0+Y291bnQsIEFSQ0hfQ09OVkVSVCkgLSAxKTsKKwkvKgorCSAqIFNjYW4gdGhlIGJlc3RmcmVlIGlmIHdlIG5lZWQgaXQgYW5kIGxvZyB0aGUgZGF0YSBibG9jayBoZWFkZXIuCisJICovCisJaWYgKG5lZWRzY2FuKQorCQl4ZnNfZGlyMl9kYXRhX2ZyZWVzY2FuKG1wLCAoeGZzX2RpcjJfZGF0YV90ICopYmxvY2ssICZuZWVkbG9nLAorCQkJTlVMTCk7CisJaWYgKG5lZWRsb2cpCisJCXhmc19kaXIyX2RhdGFfbG9nX2hlYWRlcih0cCwgZGJwKTsKKwkvKgorCSAqIFBpdGNoIHRoZSBvbGQgbGVhZiBibG9jay4KKwkgKi8KKwllcnJvciA9IHhmc19kYV9zaHJpbmtfaW5vZGUoYXJncywgbXAtPm1fZGlybGVhZmJsaywgbGJwKTsKKwlsYnAgPSBOVUxMOworCWlmIChlcnJvcikgeworCQlnb3RvIG91dDsKKwl9CisJLyoKKwkgKiBOb3cgc2VlIGlmIHRoZSByZXN1bHRpbmcgYmxvY2sgY2FuIGJlIHNocnVua2VuIHRvIHNob3J0Zm9ybS4KKwkgKi8KKwlpZiAoKHNpemUgPSB4ZnNfZGlyMl9ibG9ja19zZnNpemUoZHAsIGJsb2NrLCAmc2ZoKSkgPgorCSAgICBYRlNfSUZPUktfRFNJWkUoZHApKSB7CisJCWVycm9yID0gMDsKKwkJZ290byBvdXQ7CisJfQorCXJldHVybiB4ZnNfZGlyMl9ibG9ja190b19zZihhcmdzLCBkYnAsIHNpemUsICZzZmgpOworb3V0OgorCWlmIChsYnApCisJCXhmc19kYV9idWZfZG9uZShsYnApOworCWlmIChkYnApCisJCXhmc19kYV9idWZfZG9uZShkYnApOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIENvbnZlcnQgdGhlIHNob3J0Zm9ybSBkaXJlY3RvcnkgdG8gYmxvY2sgZm9ybS4KKyAqLworaW50CQkJCQkJLyogZXJyb3IgKi8KK3hmc19kaXIyX3NmX3RvX2Jsb2NrKAorCXhmc19kYV9hcmdzX3QJCSphcmdzKQkJLyogb3BlcmF0aW9uIGFyZ3VtZW50cyAqLworeworCXhmc19kaXIyX2RiX3QJCWJsa25vOwkJLyogZGlyLXJlbGF0aXZlIGJsb2NrICMgKDApICovCisJeGZzX2RpcjJfYmxvY2tfdAkqYmxvY2s7CQkvKiBibG9jayBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9sZWFmX2VudHJ5X3QJKmJscDsJCS8qIGJsb2NrIGxlYWYgZW50cmllcyAqLworCXhmc19kYWJ1Zl90CQkqYnA7CQkvKiBibG9jayBidWZmZXIgKi8KKwl4ZnNfZGlyMl9ibG9ja190YWlsX3QJKmJ0cDsJCS8qIGJsb2NrIHRhaWwgcG9pbnRlciAqLworCWNoYXIJCQkqYnVmOwkJLyogc2YgYnVmZmVyICovCisJaW50CQkJYnVmX2xlbjsKKwl4ZnNfZGlyMl9kYXRhX2VudHJ5X3QJKmRlcDsJCS8qIGRhdGEgZW50cnkgcG9pbnRlciAqLworCXhmc19pbm9kZV90CQkqZHA7CQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCisJaW50CQkJZHVtbXk7CQkvKiB0cmFzaCAqLworCXhmc19kaXIyX2RhdGFfdW51c2VkX3QJKmR1cDsJCS8qIHVudXNlZCBlbnRyeSBwb2ludGVyICovCisJaW50CQkJZW5kb2Zmc2V0OwkvKiBlbmQgb2YgZGF0YSBvYmplY3RzICovCisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwlpbnQJCQlpOwkJLyogaW5kZXggKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLworCWludAkJCW5lZWRsb2c7CS8qIG5lZWQgdG8gbG9nIGJsb2NrIGhlYWRlciAqLworCWludAkJCW5lZWRzY2FuOwkvKiBuZWVkIHRvIHNjYW4gYmxvY2sgZnJlZXNwYyAqLworCWludAkJCW5ld29mZnNldDsJLyogb2Zmc2V0IGZyb20gY3VycmVudCBlbnRyeSAqLworCWludAkJCW9mZnNldDsJCS8qIHRhcmdldCBibG9jayBvZmZzZXQgKi8KKwl4ZnNfZGlyMl9zZl9lbnRyeV90CSpzZmVwOwkJLyogc2YgZW50cnkgcG9pbnRlciAqLworCXhmc19kaXIyX3NmX3QJCSpzZnA7CQkvKiBzaG9ydGZvcm0gc3RydWN0dXJlICovCisJeGZzX2RpcjJfZGF0YV9vZmZfdAkqdGFncDsJCS8qIGVuZCBvZiBkYXRhIGVudHJ5ICovCisJeGZzX3RyYW5zX3QJCSp0cDsJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKworCXhmc19kaXIyX3RyYWNlX2FyZ3MoInNmX3RvX2Jsb2NrIiwgYXJncyk7CisJZHAgPSBhcmdzLT5kcDsKKwl0cCA9IGFyZ3MtPnRyYW5zOworCW1wID0gZHAtPmlfbW91bnQ7CisJQVNTRVJUKGRwLT5pX2RmLmlmX2ZsYWdzICYgWEZTX0lGSU5MSU5FKTsKKwkvKgorCSAqIEJvbWIgb3V0IGlmIHRoZSBzaG9ydGZvcm0gZGlyZWN0b3J5IGlzIHdheSB0b28gc2hvcnQuCisJICovCisJaWYgKGRwLT5pX2QuZGlfc2l6ZSA8IG9mZnNldG9mKHhmc19kaXIyX3NmX2hkcl90LCBwYXJlbnQpKSB7CisJCUFTU0VSVChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSk7CisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKwl9CisJQVNTRVJUKGRwLT5pX2RmLmlmX2J5dGVzID09IGRwLT5pX2QuZGlfc2l6ZSk7CisJQVNTRVJUKGRwLT5pX2RmLmlmX3UxLmlmX2RhdGEgIT0gTlVMTCk7CisJc2ZwID0gKHhmc19kaXIyX3NmX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOworCUFTU0VSVChkcC0+aV9kLmRpX3NpemUgPj0gWEZTX0RJUjJfU0ZfSERSX1NJWkUoc2ZwLT5oZHIuaThjb3VudCkpOworCS8qCisJICogQ29weSB0aGUgZGlyZWN0b3J5IGludG8gdGhlIHN0YWNrIGJ1ZmZlci4KKwkgKiBUaGVuIHBpdGNoIHRoZSBpbmNvcmUgaW5vZGUgZGF0YSBzbyB3ZSBjYW4gbWFrZSBleHRlbnRzLgorCSAqLworCisJYnVmX2xlbiA9IGRwLT5pX2RmLmlmX2J5dGVzOworCWJ1ZiA9IGttZW1fYWxsb2MoZHAtPmlfZGYuaWZfYnl0ZXMsIEtNX1NMRUVQKTsKKworCW1lbWNweShidWYsIHNmcCwgZHAtPmlfZGYuaWZfYnl0ZXMpOworCXhmc19pZGF0YV9yZWFsbG9jKGRwLCAtZHAtPmlfZGYuaWZfYnl0ZXMsIFhGU19EQVRBX0ZPUkspOworCWRwLT5pX2QuZGlfc2l6ZSA9IDA7CisJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgZHAsIFhGU19JTE9HX0NPUkUpOworCS8qCisJICogUmVzZXQgcG9pbnRlciAtIG9sZCBzZnAgaXMgZ29uZS4KKwkgKi8KKwlzZnAgPSAoeGZzX2RpcjJfc2ZfdCAqKWJ1ZjsKKwkvKgorCSAqIEFkZCBibG9jayAwIHRvIHRoZSBpbm9kZS4KKwkgKi8KKwllcnJvciA9IHhmc19kaXIyX2dyb3dfaW5vZGUoYXJncywgWEZTX0RJUjJfREFUQV9TUEFDRSwgJmJsa25vKTsKKwlpZiAoZXJyb3IpIHsKKwkJa21lbV9mcmVlKGJ1ZiwgYnVmX2xlbik7CisJCXJldHVybiBlcnJvcjsKKwl9CisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBkYXRhIGJsb2NrLgorCSAqLworCWVycm9yID0geGZzX2RpcjJfZGF0YV9pbml0KGFyZ3MsIGJsa25vLCAmYnApOworCWlmIChlcnJvcikgeworCQlrbWVtX2ZyZWUoYnVmLCBidWZfbGVuKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlibG9jayA9IGJwLT5kYXRhOworCUlOVF9TRVQoYmxvY2stPmhkci5tYWdpYywgQVJDSF9DT05WRVJULCBYRlNfRElSMl9CTE9DS19NQUdJQyk7CisJLyoKKwkgKiBDb21wdXRlIHNpemUgb2YgYmxvY2sgInRhaWwiIGFyZWEuCisJICovCisJaSA9ICh1aW50KXNpemVvZigqYnRwKSArCisJICAgIChJTlRfR0VUKHNmcC0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpICsgMikgKiAodWludClzaXplb2YoeGZzX2RpcjJfbGVhZl9lbnRyeV90KTsKKwkvKgorCSAqIFRoZSB3aG9sZSB0aGluZyBpcyBpbml0aWFsaXplZCB0byBmcmVlIGJ5IHRoZSBpbml0IHJvdXRpbmUuCisJICogU2F5IHdlJ3JlIHVzaW5nIHRoZSBsZWFmIGFuZCB0YWlsIGFyZWEuCisJICovCisJZHVwID0gKHhmc19kaXIyX2RhdGFfdW51c2VkX3QgKilibG9jay0+dTsKKwluZWVkbG9nID0gbmVlZHNjYW4gPSAwOworCXhmc19kaXIyX2RhdGFfdXNlX2ZyZWUodHAsIGJwLCBkdXAsIG1wLT5tX2RpcmJsa3NpemUgLSBpLCBpLCAmbmVlZGxvZywKKwkJJm5lZWRzY2FuKTsKKwlBU1NFUlQobmVlZHNjYW4gPT0gMCk7CisJLyoKKwkgKiBGaWxsIGluIHRoZSB0YWlsLgorCSAqLworCWJ0cCA9IFhGU19ESVIyX0JMT0NLX1RBSUxfUChtcCwgYmxvY2spOworCUlOVF9TRVQoYnRwLT5jb3VudCwgQVJDSF9DT05WRVJULCBJTlRfR0VUKHNmcC0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpICsgMik7CS8qIC4sIC4uICovCisJYnRwLT5zdGFsZSA9IDA7CisJYmxwID0gWEZTX0RJUjJfQkxPQ0tfTEVBRl9QKGJ0cCk7CisJZW5kb2Zmc2V0ID0gKHVpbnQpKChjaGFyICopYmxwIC0gKGNoYXIgKilibG9jayk7CisJLyoKKwkgKiBSZW1vdmUgdGhlIGZyZWVzcGFjZSwgd2UnbGwgbWFuYWdlIGl0LgorCSAqLworCXhmc19kaXIyX2RhdGFfdXNlX2ZyZWUodHAsIGJwLCBkdXAsCisJCSh4ZnNfZGlyMl9kYXRhX2FvZmZfdCkoKGNoYXIgKilkdXAgLSAoY2hhciAqKWJsb2NrKSwKKwkJSU5UX0dFVChkdXAtPmxlbmd0aCwgQVJDSF9DT05WRVJUKSwgJm5lZWRsb2csICZuZWVkc2Nhbik7CisJLyoKKwkgKiBDcmVhdGUgZW50cnkgZm9yIC4KKwkgKi8KKwlkZXAgPSAoeGZzX2RpcjJfZGF0YV9lbnRyeV90ICopCisJICAgICAgKChjaGFyICopYmxvY2sgKyBYRlNfRElSMl9EQVRBX0RPVF9PRkZTRVQpOworCUlOVF9TRVQoZGVwLT5pbnVtYmVyLCBBUkNIX0NPTlZFUlQsIGRwLT5pX2lubyk7CisJZGVwLT5uYW1lbGVuID0gMTsKKwlkZXAtPm5hbWVbMF0gPSAnLic7CisJdGFncCA9IFhGU19ESVIyX0RBVEFfRU5UUllfVEFHX1AoZGVwKTsKKwlJTlRfU0VUKCp0YWdwLCBBUkNIX0NPTlZFUlQsICh4ZnNfZGlyMl9kYXRhX29mZl90KSgoY2hhciAqKWRlcCAtIChjaGFyICopYmxvY2spKTsKKwl4ZnNfZGlyMl9kYXRhX2xvZ19lbnRyeSh0cCwgYnAsIGRlcCk7CisJSU5UX1NFVChibHBbMF0uaGFzaHZhbCwgQVJDSF9DT05WRVJULCB4ZnNfZGlyX2hhc2hfZG90KTsKKwlJTlRfU0VUKGJscFswXS5hZGRyZXNzLCBBUkNIX0NPTlZFUlQsIFhGU19ESVIyX0JZVEVfVE9fREFUQVBUUihtcCwgKGNoYXIgKilkZXAgLSAoY2hhciAqKWJsb2NrKSk7CisJLyoKKwkgKiBDcmVhdGUgZW50cnkgZm9yIC4uCisJICovCisJZGVwID0gKHhmc19kaXIyX2RhdGFfZW50cnlfdCAqKQorCQkoKGNoYXIgKilibG9jayArIFhGU19ESVIyX0RBVEFfRE9URE9UX09GRlNFVCk7CisJSU5UX1NFVChkZXAtPmludW1iZXIsIEFSQ0hfQ09OVkVSVCwgWEZTX0RJUjJfU0ZfR0VUX0lOVU1CRVIoc2ZwLCAmc2ZwLT5oZHIucGFyZW50KSk7CisJZGVwLT5uYW1lbGVuID0gMjsKKwlkZXAtPm5hbWVbMF0gPSBkZXAtPm5hbWVbMV0gPSAnLic7CisJdGFncCA9IFhGU19ESVIyX0RBVEFfRU5UUllfVEFHX1AoZGVwKTsKKwlJTlRfU0VUKCp0YWdwLCBBUkNIX0NPTlZFUlQsICh4ZnNfZGlyMl9kYXRhX29mZl90KSgoY2hhciAqKWRlcCAtIChjaGFyICopYmxvY2spKTsKKwl4ZnNfZGlyMl9kYXRhX2xvZ19lbnRyeSh0cCwgYnAsIGRlcCk7CisJSU5UX1NFVChibHBbMV0uaGFzaHZhbCwgQVJDSF9DT05WRVJULCB4ZnNfZGlyX2hhc2hfZG90ZG90KTsKKwlJTlRfU0VUKGJscFsxXS5hZGRyZXNzLCBBUkNIX0NPTlZFUlQsIFhGU19ESVIyX0JZVEVfVE9fREFUQVBUUihtcCwgKGNoYXIgKilkZXAgLSAoY2hhciAqKWJsb2NrKSk7CisJb2Zmc2V0ID0gWEZTX0RJUjJfREFUQV9GSVJTVF9PRkZTRVQ7CisJLyoKKwkgKiBMb29wIG92ZXIgZXhpc3RpbmcgZW50cmllcywgc3R1ZmYgdGhlbSBpbi4KKwkgKi8KKwlpZiAoKGkgPSAwKSA9PSBJTlRfR0VUKHNmcC0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpKQorCQlzZmVwID0gTlVMTDsKKwllbHNlCisJCXNmZXAgPSBYRlNfRElSMl9TRl9GSVJTVEVOVFJZKHNmcCk7CisJLyoKKwkgKiBOZWVkIHRvIHByZXNlcnZlIHRoZSBleGlzdGluZyBvZmZzZXQgdmFsdWVzIGluIHRoZSBzZiBkaXJlY3RvcnkuCisJICogSW5zZXJ0IGhvbGVzICh1bnVzZWQgZW50cmllcykgd2hlcmUgbmVjZXNzYXJ5LgorCSAqLworCXdoaWxlIChvZmZzZXQgPCBlbmRvZmZzZXQpIHsKKwkJLyoKKwkJICogc2ZlcCBpcyBudWxsIHdoZW4gd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUgbGlzdC4KKwkJICovCisJCWlmIChzZmVwID09IE5VTEwpCisJCQluZXdvZmZzZXQgPSBlbmRvZmZzZXQ7CisJCWVsc2UKKwkJCW5ld29mZnNldCA9IFhGU19ESVIyX1NGX0dFVF9PRkZTRVQoc2ZlcCk7CisJCS8qCisJCSAqIFRoZXJlIHNob3VsZCBiZSBhIGhvbGUgaGVyZSwgbWFrZSBvbmUuCisJCSAqLworCQlpZiAob2Zmc2V0IDwgbmV3b2Zmc2V0KSB7CisJCQlkdXAgPSAoeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqKQorCQkJICAgICAgKChjaGFyICopYmxvY2sgKyBvZmZzZXQpOworCQkJSU5UX1NFVChkdXAtPmZyZWV0YWcsIEFSQ0hfQ09OVkVSVCwgWEZTX0RJUjJfREFUQV9GUkVFX1RBRyk7CisJCQlJTlRfU0VUKGR1cC0+bGVuZ3RoLCBBUkNIX0NPTlZFUlQsIG5ld29mZnNldCAtIG9mZnNldCk7CisJCQlJTlRfU0VUKCpYRlNfRElSMl9EQVRBX1VOVVNFRF9UQUdfUChkdXApLCBBUkNIX0NPTlZFUlQsCisJCQkJKHhmc19kaXIyX2RhdGFfb2ZmX3QpCisJCQkJKChjaGFyICopZHVwIC0gKGNoYXIgKilibG9jaykpOworCQkJeGZzX2RpcjJfZGF0YV9sb2dfdW51c2VkKHRwLCBicCwgZHVwKTsKKwkJCSh2b2lkKXhmc19kaXIyX2RhdGFfZnJlZWluc2VydCgoeGZzX2RpcjJfZGF0YV90ICopYmxvY2ssCisJCQkJZHVwLCAmZHVtbXkpOworCQkJb2Zmc2V0ICs9IElOVF9HRVQoZHVwLT5sZW5ndGgsIEFSQ0hfQ09OVkVSVCk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKgorCQkgKiBDb3B5IGEgcmVhbCBlbnRyeS4KKwkJICovCisJCWRlcCA9ICh4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgKikoKGNoYXIgKilibG9jayArIG5ld29mZnNldCk7CisJCUlOVF9TRVQoZGVwLT5pbnVtYmVyLCBBUkNIX0NPTlZFUlQsIFhGU19ESVIyX1NGX0dFVF9JTlVNQkVSKHNmcCwKKwkJCQlYRlNfRElSMl9TRl9JTlVNQkVSUChzZmVwKSkpOworCQlkZXAtPm5hbWVsZW4gPSBzZmVwLT5uYW1lbGVuOworCQltZW1jcHkoZGVwLT5uYW1lLCBzZmVwLT5uYW1lLCBkZXAtPm5hbWVsZW4pOworCQl0YWdwID0gWEZTX0RJUjJfREFUQV9FTlRSWV9UQUdfUChkZXApOworCQlJTlRfU0VUKCp0YWdwLCBBUkNIX0NPTlZFUlQsICh4ZnNfZGlyMl9kYXRhX29mZl90KSgoY2hhciAqKWRlcCAtIChjaGFyICopYmxvY2spKTsKKwkJeGZzX2RpcjJfZGF0YV9sb2dfZW50cnkodHAsIGJwLCBkZXApOworCQlJTlRfU0VUKGJscFsyICsgaV0uaGFzaHZhbCwgQVJDSF9DT05WRVJULCB4ZnNfZGFfaGFzaG5hbWUoKGNoYXIgKilzZmVwLT5uYW1lLCBzZmVwLT5uYW1lbGVuKSk7CisJCUlOVF9TRVQoYmxwWzIgKyBpXS5hZGRyZXNzLCBBUkNIX0NPTlZFUlQsIFhGU19ESVIyX0JZVEVfVE9fREFUQVBUUihtcCwKKwkJCQkJCSAoY2hhciAqKWRlcCAtIChjaGFyICopYmxvY2spKTsKKwkJb2Zmc2V0ID0gKGludCkoKGNoYXIgKikodGFncCArIDEpIC0gKGNoYXIgKilibG9jayk7CisJCWlmICgrK2kgPT0gSU5UX0dFVChzZnAtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSkKKwkJCXNmZXAgPSBOVUxMOworCQllbHNlCisJCQlzZmVwID0gWEZTX0RJUjJfU0ZfTkVYVEVOVFJZKHNmcCwgc2ZlcCk7CisJfQorCS8qIERvbmUgd2l0aCB0aGUgdGVtcG9yYXJ5IGJ1ZmZlciAqLworCWttZW1fZnJlZShidWYsIGJ1Zl9sZW4pOworCS8qCisJICogU29ydCB0aGUgbGVhZiBlbnRyaWVzIGJ5IGhhc2ggdmFsdWUuCisJICovCisJcXNvcnQoYmxwLCBJTlRfR0VUKGJ0cC0+Y291bnQsIEFSQ0hfQ09OVkVSVCksIHNpemVvZigqYmxwKSwgeGZzX2RpcjJfYmxvY2tfc29ydCk7CisJLyoKKwkgKiBMb2cgdGhlIGxlYWYgZW50cnkgYXJlYSBhbmQgdGFpbC4KKwkgKiBBbHJlYWR5IGxvZ2dlZCB0aGUgaGVhZGVyIGluIGRhdGFfaW5pdCwgaWdub3JlIG5lZWRsb2cuCisJICovCisJQVNTRVJUKG5lZWRzY2FuID09IDApOworCXhmc19kaXIyX2Jsb2NrX2xvZ19sZWFmKHRwLCBicCwgMCwgSU5UX0dFVChidHAtPmNvdW50LCBBUkNIX0NPTlZFUlQpIC0gMSk7CisJeGZzX2RpcjJfYmxvY2tfbG9nX3RhaWwodHAsIGJwKTsKKwl4ZnNfZGlyMl9kYXRhX2NoZWNrKGRwLCBicCk7CisJeGZzX2RhX2J1Zl9kb25lKGJwKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGlyMl9ibG9jay5oIGIvZnMveGZzL3hmc19kaXIyX2Jsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE1NzhiOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfZGlyMl9ibG9jay5oCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19ESVIyX0JMT0NLX0hfXworI2RlZmluZQlfX1hGU19ESVIyX0JMT0NLX0hfXworCisvKgorICogeGZzX2RpcjJfYmxvY2suaAorICogRGlyZWN0b3J5IHZlcnNpb24gMiwgc2luZ2xlIGJsb2NrIGZvcm1hdCBzdHJ1Y3R1cmVzCisgKi8KKworc3RydWN0IHVpbzsKK3N0cnVjdCB4ZnNfZGFidWY7CitzdHJ1Y3QgeGZzX2RhX2FyZ3M7CitzdHJ1Y3QgeGZzX2RpcjJfZGF0YV9oZHI7CitzdHJ1Y3QgeGZzX2RpcjJfbGVhZl9lbnRyeTsKK3N0cnVjdCB4ZnNfaW5vZGU7CitzdHJ1Y3QgeGZzX21vdW50Oworc3RydWN0IHhmc190cmFuczsKKworLyoKKyAqIFRoZSBzaW5nbGUgYmxvY2sgZm9ybWF0IGlzIGFzIGZvbGxvd3M6CisgKiB4ZnNfZGlyMl9kYXRhX2hkcl90IHN0cnVjdHVyZQorICogeGZzX2RpcjJfZGF0YV9lbnRyeV90IGFuZCB4ZnNfZGlyMl9kYXRhX3VudXNlZF90IHN0cnVjdHVyZXMKKyAqIHhmc19kaXIyX2xlYWZfZW50cnlfdCBzdHJ1Y3R1cmVzCisgKiB4ZnNfZGlyMl9ibG9ja190YWlsX3Qgc3RydWN0dXJlCisgKi8KKworI2RlZmluZQlYRlNfRElSMl9CTE9DS19NQUdJQwkweDU4NDQzMjQyCS8qIFhEMkI6IGZvciBvbmUgYmxvY2sgZGlycyAqLworCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlyMl9ibG9ja190YWlsIHsKKwlfX3VpbnQzMl90CWNvdW50OwkJCS8qIGNvdW50IG9mIGxlYWYgZW50cmllcyAqLworCV9fdWludDMyX3QJc3RhbGU7CQkJLyogY291bnQgb2Ygc3RhbGUgbGYgZW50cmllcyAqLworfSB4ZnNfZGlyMl9ibG9ja190YWlsX3Q7CisKKy8qCisgKiBHZW5lcmljIHNpbmdsZS1ibG9jayBzdHJ1Y3R1cmUsIGZvciB4ZnNfZGIuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19kaXIyX2Jsb2NrIHsKKwl4ZnNfZGlyMl9kYXRhX2hkcl90CWhkcjsJCS8qIG1hZ2ljIFhGU19ESVIyX0JMT0NLX01BR0lDICovCisJeGZzX2RpcjJfZGF0YV91bmlvbl90CXVbMV07CisJeGZzX2RpcjJfbGVhZl9lbnRyeV90CWxlYWZbMV07CisJeGZzX2RpcjJfYmxvY2tfdGFpbF90CXRhaWw7Cit9IHhmc19kaXIyX2Jsb2NrX3Q7CisKKy8qCisgKiBQb2ludGVyIHRvIHRoZSBsZWFmIGhlYWRlciBlbWJlZGRlZCBpbiBhIGRhdGEgYmxvY2sgKDEtYmxvY2sgZm9ybWF0KQorICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVIyX0JMT0NLX1RBSUxfUCkKK3hmc19kaXIyX2Jsb2NrX3RhaWxfdCAqCit4ZnNfZGlyMl9ibG9ja190YWlsX3Aoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19kaXIyX2Jsb2NrX3QgKmJsb2NrKTsKKyNkZWZpbmUJWEZTX0RJUjJfQkxPQ0tfVEFJTF9QKG1wLGJsb2NrKQl4ZnNfZGlyMl9ibG9ja190YWlsX3AobXAsYmxvY2spCisjZWxzZQorI2RlZmluZQlYRlNfRElSMl9CTE9DS19UQUlMX1AobXAsYmxvY2spCVwKKwkoKCh4ZnNfZGlyMl9ibG9ja190YWlsX3QgKikoKGNoYXIgKikoYmxvY2spICsgKG1wKS0+bV9kaXJibGtzaXplKSkgLSAxKQorI2VuZGlmCisKKy8qCisgKiBQb2ludGVyIHRvIHRoZSBsZWFmIGVudHJpZXMgZW1iZWRkZWQgaW4gYSBkYXRhIGJsb2NrICgxLWJsb2NrIGZvcm1hdCkKKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9CTE9DS19MRUFGX1ApCitzdHJ1Y3QgeGZzX2RpcjJfbGVhZl9lbnRyeSAqeGZzX2RpcjJfYmxvY2tfbGVhZl9wKHhmc19kaXIyX2Jsb2NrX3RhaWxfdCAqYnRwKTsKKyNkZWZpbmUJWEZTX0RJUjJfQkxPQ0tfTEVBRl9QKGJ0cCkgXAorCXhmc19kaXIyX2Jsb2NrX2xlYWZfcChidHApCisjZWxzZQorI2RlZmluZQlYRlNfRElSMl9CTE9DS19MRUFGX1AoYnRwKQlcCisJKCgoc3RydWN0IHhmc19kaXIyX2xlYWZfZW50cnkgKikoYnRwKSkgLSBJTlRfR0VUKChidHApLT5jb3VudCwgQVJDSF9DT05WRVJUKSkKKyNlbmRpZgorCisvKgorICogRnVuY3Rpb24gZGVjbGFyYXRpb25zLgorICovCisKK2V4dGVybiBpbnQKKwl4ZnNfZGlyMl9ibG9ja19hZGRuYW1lKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CisKK2V4dGVybiBpbnQKKwl4ZnNfZGlyMl9ibG9ja19nZXRkZW50cyhzdHJ1Y3QgeGZzX3RyYW5zICp0cCwgc3RydWN0IHhmc19pbm9kZSAqZHAsCisJCQkJc3RydWN0IHVpbyAqdWlvLCBpbnQgKmVvZnAsIHN0cnVjdCB4ZnNfZGlyZW50ICpkYnAsCisJCQkJeGZzX2RpcjJfcHV0X3QgcHV0KTsKKworZXh0ZXJuIGludAorCXhmc19kaXIyX2Jsb2NrX2xvb2t1cChzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworCitleHRlcm4gaW50CisJeGZzX2RpcjJfYmxvY2tfcmVtb3ZlbmFtZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworCitleHRlcm4gaW50CisJeGZzX2RpcjJfYmxvY2tfcmVwbGFjZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworCitleHRlcm4gaW50CisJeGZzX2RpcjJfbGVhZl90b19ibG9jayhzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsIHN0cnVjdCB4ZnNfZGFidWYgKmxicCwKKwkJCSAgICAgICBzdHJ1Y3QgeGZzX2RhYnVmICpkYnApOworCitleHRlcm4gaW50CisJeGZzX2RpcjJfc2ZfdG9fYmxvY2soc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKKworI2VuZGlmCS8qIF9fWEZTX0RJUjJfQkxPQ0tfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2RpcjJfZGF0YS5jIGIvZnMveGZzL3hmc19kaXIyX2RhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjk4ODdhCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19kaXIyX2RhdGEuYwpAQCAtMCwwICsxLDg1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworLyoKKyAqIHhmc19kaXIyX2RhdGEuYworICogQ29yZSBkYXRhIGJsb2NrIGhhbmRsaW5nIHJvdXRpbmVzIGZvciBYRlMgVjIgZGlyZWN0b3JpZXMuCisgKiBTZWUgeGZzX2RpcjJfZGF0YS5oIGZvciBkYXRhIHN0cnVjdHVyZXMuCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorCisjaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc190eXBlcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9sZWFmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfZGF0YS5oIgorI2luY2x1ZGUgInhmc19kaXIyX2xlYWYuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9ibG9jay5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorCisjaWZkZWYgREVCVUcKKy8qCisgKiBDaGVjayB0aGUgY29uc2lzdGVuY3kgb2YgdGhlIGRhdGEgYmxvY2suCisgKiBUaGUgaW5wdXQgY2FuIGFsc28gYmUgYSBibG9jay1mb3JtYXQgZGlyZWN0b3J5LgorICogUG9wIGFuIGFzc2VydCBpZiB3ZSBmaW5kIGFueXRoaW5nIGJhZC4KKyAqLwordm9pZAoreGZzX2RpcjJfZGF0YV9jaGVjaygKKwl4ZnNfaW5vZGVfdAkJKmRwLAkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfZGFidWZfdAkJKmJwKQkJLyogZGF0YSBibG9jaydzIGJ1ZmZlciAqLworeworCXhmc19kaXIyX2RhdGFwdHJfdAlhZGRyOwkJLyogYWRkciBmb3IgbGVhZiBsb29rdXAgKi8KKwl4ZnNfZGlyMl9kYXRhX2ZyZWVfdAkqYmY7CQkvKiBiZXN0ZnJlZSB0YWJsZSAqLworCXhmc19kaXIyX2Jsb2NrX3RhaWxfdAkqYnRwPU5VTEw7CS8qIGJsb2NrIHRhaWwgKi8KKwlpbnQJCQljb3VudDsJCS8qIGNvdW50IG9mIGVudHJpZXMgZm91bmQgKi8KKwl4ZnNfZGlyMl9kYXRhX3QJCSpkOwkJLyogZGF0YSBibG9jayBwb2ludGVyICovCisJeGZzX2RpcjJfZGF0YV9lbnRyeV90CSpkZXA7CQkvKiBkYXRhIGVudHJ5ICovCisJeGZzX2RpcjJfZGF0YV9mcmVlX3QJKmRmcDsJCS8qIGJlc3RmcmVlIGVudHJ5ICovCisJeGZzX2RpcjJfZGF0YV91bnVzZWRfdAkqZHVwOwkJLyogdW51c2VkIGVudHJ5ICovCisJY2hhcgkJCSplbmRwOwkJLyogZW5kIG9mIHVzZWZ1bCBkYXRhICovCisJaW50CQkJZnJlZXNlZW47CS8qIG1hc2sgb2YgYmVzdGZyZWVzIHNlZW4gKi8KKwl4ZnNfZGFoYXNoX3QJCWhhc2g7CQkvKiBoYXNoIG9mIGN1cnJlbnQgbmFtZSAqLworCWludAkJCWk7CQkvKiBsZWFmIGluZGV4ICovCisJaW50CQkJbGFzdGZyZWU7CS8qIGxhc3QgZW50cnkgd2FzIHVudXNlZCAqLworCXhmc19kaXIyX2xlYWZfZW50cnlfdAkqbGVwPU5VTEw7CS8qIGJsb2NrIGxlYWYgZW50cmllcyAqLworCXhmc19tb3VudF90CQkqbXA7CQkvKiBmaWxlc3lzdGVtIG1vdW50IHBvaW50ICovCisJY2hhcgkJCSpwOwkJLyogY3VycmVudCBkYXRhIHBvc2l0aW9uICovCisJaW50CQkJc3RhbGU7CQkvKiBjb3VudCBvZiBzdGFsZSBsZWF2ZXMgKi8KKworCW1wID0gZHAtPmlfbW91bnQ7CisJZCA9IGJwLT5kYXRhOworCUFTU0VSVChJTlRfR0VUKGQtPmhkci5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9EQVRBX01BR0lDIHx8CisJICAgICAgIElOVF9HRVQoZC0+aGRyLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0JMT0NLX01BR0lDKTsKKwliZiA9IGQtPmhkci5iZXN0ZnJlZTsKKwlwID0gKGNoYXIgKilkLT51OworCWlmIChJTlRfR0VUKGQtPmhkci5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9CTE9DS19NQUdJQykgeworCQlidHAgPSBYRlNfRElSMl9CTE9DS19UQUlMX1AobXAsICh4ZnNfZGlyMl9ibG9ja190ICopZCk7CisJCWxlcCA9IFhGU19ESVIyX0JMT0NLX0xFQUZfUChidHApOworCQllbmRwID0gKGNoYXIgKilsZXA7CisJfSBlbHNlCisJCWVuZHAgPSAoY2hhciAqKWQgKyBtcC0+bV9kaXJibGtzaXplOworCWNvdW50ID0gbGFzdGZyZWUgPSBmcmVlc2VlbiA9IDA7CisJLyoKKwkgKiBBY2NvdW50IGZvciB6ZXJvIGJlc3RmcmVlIGVudHJpZXMuCisJICovCisJaWYgKCFiZlswXS5sZW5ndGgpIHsKKwkJQVNTRVJUKCFiZlswXS5vZmZzZXQpOworCQlmcmVlc2VlbiB8PSAxIDw8IDA7CisJfQorCWlmICghYmZbMV0ubGVuZ3RoKSB7CisJCUFTU0VSVCghYmZbMV0ub2Zmc2V0KTsKKwkJZnJlZXNlZW4gfD0gMSA8PCAxOworCX0KKwlpZiAoIWJmWzJdLmxlbmd0aCkgeworCQlBU1NFUlQoIWJmWzJdLm9mZnNldCk7CisJCWZyZWVzZWVuIHw9IDEgPDwgMjsKKwl9CisJQVNTRVJUKElOVF9HRVQoYmZbMF0ubGVuZ3RoLCBBUkNIX0NPTlZFUlQpID49IElOVF9HRVQoYmZbMV0ubGVuZ3RoLCBBUkNIX0NPTlZFUlQpKTsKKwlBU1NFUlQoSU5UX0dFVChiZlsxXS5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkgPj0gSU5UX0dFVChiZlsyXS5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkpOworCS8qCisJICogTG9vcCBvdmVyIHRoZSBkYXRhL3VudXNlZCBlbnRyaWVzLgorCSAqLworCXdoaWxlIChwIDwgZW5kcCkgeworCQlkdXAgPSAoeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqKXA7CisJCS8qCisJCSAqIElmIGl0J3MgdW51c2VkLCBsb29rIGZvciB0aGUgc3BhY2UgaW4gdGhlIGJlc3RmcmVlIHRhYmxlLgorCQkgKiBJZiB3ZSBmaW5kIGl0LCBhY2NvdW50IGZvciB0aGF0LCBlbHNlIG1ha2Ugc3VyZSBpdAorCQkgKiBkb2Vzbid0IG5lZWQgdG8gYmUgdGhlcmUuCisJCSAqLworCQlpZiAoSU5UX0dFVChkdXAtPmZyZWV0YWcsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfREFUQV9GUkVFX1RBRykgeworCQkJQVNTRVJUKGxhc3RmcmVlID09IDApOworCQkJQVNTRVJUKElOVF9HRVQoKlhGU19ESVIyX0RBVEFfVU5VU0VEX1RBR19QKGR1cCksIEFSQ0hfQ09OVkVSVCkgPT0KKwkJCSAgICAgICAoY2hhciAqKWR1cCAtIChjaGFyICopZCk7CisJCQlkZnAgPSB4ZnNfZGlyMl9kYXRhX2ZyZWVmaW5kKGQsIGR1cCk7CisJCQlpZiAoZGZwKSB7CisJCQkJaSA9IChpbnQpKGRmcCAtIGJmKTsKKwkJCQlBU1NFUlQoKGZyZWVzZWVuICYgKDEgPDwgaSkpID09IDApOworCQkJCWZyZWVzZWVuIHw9IDEgPDwgaTsKKwkJCX0gZWxzZQorCQkJCUFTU0VSVChJTlRfR0VUKGR1cC0+bGVuZ3RoLCBBUkNIX0NPTlZFUlQpIDw9IElOVF9HRVQoYmZbMl0ubGVuZ3RoLCBBUkNIX0NPTlZFUlQpKTsKKwkJCXAgKz0gSU5UX0dFVChkdXAtPmxlbmd0aCwgQVJDSF9DT05WRVJUKTsKKwkJCWxhc3RmcmVlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qCisJCSAqIEl0J3MgYSByZWFsIGVudHJ5LiAgVmFsaWRhdGUgdGhlIGZpZWxkcy4KKwkJICogSWYgdGhpcyBpcyBhIGJsb2NrIGRpcmVjdG9yeSB0aGVuIG1ha2Ugc3VyZSBpdCdzCisJCSAqIGluIHRoZSBsZWFmIHNlY3Rpb24gb2YgdGhlIGJsb2NrLgorCQkgKiBUaGUgbGluZWFyIHNlYXJjaCBpcyBjcnVkZSBidXQgdGhpcyBpcyBERUJVRyBjb2RlLgorCQkgKi8KKwkJZGVwID0gKHhmc19kaXIyX2RhdGFfZW50cnlfdCAqKXA7CisJCUFTU0VSVChkZXAtPm5hbWVsZW4gIT0gMCk7CisJCUFTU0VSVCh4ZnNfZGlyX2lub192YWxpZGF0ZShtcCwgSU5UX0dFVChkZXAtPmludW1iZXIsIEFSQ0hfQ09OVkVSVCkpID09IDApOworCQlBU1NFUlQoSU5UX0dFVCgqWEZTX0RJUjJfREFUQV9FTlRSWV9UQUdfUChkZXApLCBBUkNIX0NPTlZFUlQpID09CisJCSAgICAgICAoY2hhciAqKWRlcCAtIChjaGFyICopZCk7CisJCWNvdW50Kys7CisJCWxhc3RmcmVlID0gMDsKKwkJaWYgKElOVF9HRVQoZC0+aGRyLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0JMT0NLX01BR0lDKSB7CisJCQlhZGRyID0gWEZTX0RJUjJfREJfT0ZGX1RPX0RBVEFQVFIobXAsIG1wLT5tX2RpcmRhdGFibGssCisJCQkJKHhmc19kaXIyX2RhdGFfYW9mZl90KQorCQkJCSgoY2hhciAqKWRlcCAtIChjaGFyICopZCkpOworCQkJaGFzaCA9IHhmc19kYV9oYXNobmFtZSgoY2hhciAqKWRlcC0+bmFtZSwgZGVwLT5uYW1lbGVuKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBJTlRfR0VUKGJ0cC0+Y291bnQsIEFSQ0hfQ09OVkVSVCk7IGkrKykgeworCQkJCWlmIChJTlRfR0VUKGxlcFtpXS5hZGRyZXNzLCBBUkNIX0NPTlZFUlQpID09IGFkZHIgJiYKKwkJCQkgICAgSU5UX0dFVChsZXBbaV0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSA9PSBoYXNoKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCUFTU0VSVChpIDwgSU5UX0dFVChidHAtPmNvdW50LCBBUkNIX0NPTlZFUlQpKTsKKwkJfQorCQlwICs9IFhGU19ESVIyX0RBVEFfRU5UU0laRShkZXAtPm5hbWVsZW4pOworCX0KKwkvKgorCSAqIE5lZWQgdG8gaGF2ZSBzZWVuIGFsbCB0aGUgZW50cmllcyBhbmQgYWxsIHRoZSBiZXN0ZnJlZSBzbG90cy4KKwkgKi8KKwlBU1NFUlQoZnJlZXNlZW4gPT0gNyk7CisJaWYgKElOVF9HRVQoZC0+aGRyLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0JMT0NLX01BR0lDKSB7CisJCWZvciAoaSA9IHN0YWxlID0gMDsgaSA8IElOVF9HRVQoYnRwLT5jb3VudCwgQVJDSF9DT05WRVJUKTsgaSsrKSB7CisJCQlpZiAoSU5UX0dFVChsZXBbaV0uYWRkcmVzcywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9OVUxMX0RBVEFQVFIpCisJCQkJc3RhbGUrKzsKKwkJCWlmIChpID4gMCkKKwkJCQlBU1NFUlQoSU5UX0dFVChsZXBbaV0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSA+PSBJTlRfR0VUKGxlcFtpIC0gMV0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSk7CisJCX0KKwkJQVNTRVJUKGNvdW50ID09IElOVF9HRVQoYnRwLT5jb3VudCwgQVJDSF9DT05WRVJUKSAtIElOVF9HRVQoYnRwLT5zdGFsZSwgQVJDSF9DT05WRVJUKSk7CisJCUFTU0VSVChzdGFsZSA9PSBJTlRfR0VUKGJ0cC0+c3RhbGUsIEFSQ0hfQ09OVkVSVCkpOworCX0KK30KKyNlbmRpZgorCisvKgorICogR2l2ZW4gYSBkYXRhIGJsb2NrIGFuZCBhbiB1bnVzZWQgZW50cnkgZnJvbSB0aGF0IGJsb2NrLAorICogcmV0dXJuIHRoZSBiZXN0ZnJlZSBlbnRyeSBpZiBhbnkgdGhhdCBjb3JyZXNwb25kcyB0byBpdC4KKyAqLworeGZzX2RpcjJfZGF0YV9mcmVlX3QgKgoreGZzX2RpcjJfZGF0YV9mcmVlZmluZCgKKwl4ZnNfZGlyMl9kYXRhX3QJCSpkLAkJLyogZGF0YSBibG9jayAqLworCXhmc19kaXIyX2RhdGFfdW51c2VkX3QJKmR1cCkJCS8qIGRhdGEgdW51c2VkIGVudHJ5ICovCit7CisJeGZzX2RpcjJfZGF0YV9mcmVlX3QJKmRmcDsJCS8qIGJlc3RmcmVlIGVudHJ5ICovCisJeGZzX2RpcjJfZGF0YV9hb2ZmX3QJb2ZmOwkJLyogb2Zmc2V0IHZhbHVlIG5lZWRlZCAqLworI2lmIGRlZmluZWQoREVCVUcpICYmIGRlZmluZWQoX19LRVJORUxfXykKKwlpbnQJCQltYXRjaGVkOwkvKiBtYXRjaGVkIHRoZSB2YWx1ZSAqLworCWludAkJCXNlZW56ZXJvOwkvKiBzYXcgYSAwIGJlc3RmcmVlIGVudHJ5ICovCisjZW5kaWYKKworCW9mZiA9ICh4ZnNfZGlyMl9kYXRhX2FvZmZfdCkoKGNoYXIgKilkdXAgLSAoY2hhciAqKWQpOworI2lmIGRlZmluZWQoREVCVUcpICYmIGRlZmluZWQoX19LRVJORUxfXykKKwkvKgorCSAqIFZhbGlkYXRlIHNvbWUgY29uc2lzdGVuY3kgaW4gdGhlIGJlc3RmcmVlIHRhYmxlLgorCSAqIENoZWNrIG9yZGVyLCBub24tb3ZlcmxhcHBpbmcgZW50cmllcywgYW5kIGlmIHdlIGZpbmQgdGhlCisJICogb25lIHdlJ3JlIGxvb2tpbmcgZm9yIGl0IGhhcyB0byBiZSBleGFjdC4KKwkgKi8KKwlBU1NFUlQoSU5UX0dFVChkLT5oZHIubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfREFUQV9NQUdJQyB8fAorCSAgICAgICBJTlRfR0VUKGQtPmhkci5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9CTE9DS19NQUdJQyk7CisJZm9yIChkZnAgPSAmZC0+aGRyLmJlc3RmcmVlWzBdLCBzZWVuemVybyA9IG1hdGNoZWQgPSAwOworCSAgICAgZGZwIDwgJmQtPmhkci5iZXN0ZnJlZVtYRlNfRElSMl9EQVRBX0ZEX0NPVU5UXTsKKwkgICAgIGRmcCsrKSB7CisJCWlmICghZGZwLT5vZmZzZXQpIHsKKwkJCUFTU0VSVCghZGZwLT5sZW5ndGgpOworCQkJc2Vlbnplcm8gPSAxOworCQkJY29udGludWU7CisJCX0KKwkJQVNTRVJUKHNlZW56ZXJvID09IDApOworCQlpZiAoSU5UX0dFVChkZnAtPm9mZnNldCwgQVJDSF9DT05WRVJUKSA9PSBvZmYpIHsKKwkJCW1hdGNoZWQgPSAxOworCQkJQVNTRVJUKElOVF9HRVQoZGZwLT5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkgPT0gSU5UX0dFVChkdXAtPmxlbmd0aCwgQVJDSF9DT05WRVJUKSk7CisJCX0gZWxzZSBpZiAob2ZmIDwgSU5UX0dFVChkZnAtPm9mZnNldCwgQVJDSF9DT05WRVJUKSkKKwkJCUFTU0VSVChvZmYgKyBJTlRfR0VUKGR1cC0+bGVuZ3RoLCBBUkNIX0NPTlZFUlQpIDw9IElOVF9HRVQoZGZwLT5vZmZzZXQsIEFSQ0hfQ09OVkVSVCkpOworCQllbHNlCisJCQlBU1NFUlQoSU5UX0dFVChkZnAtPm9mZnNldCwgQVJDSF9DT05WRVJUKSArIElOVF9HRVQoZGZwLT5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkgPD0gb2ZmKTsKKwkJQVNTRVJUKG1hdGNoZWQgfHwgSU5UX0dFVChkZnAtPmxlbmd0aCwgQVJDSF9DT05WRVJUKSA+PSBJTlRfR0VUKGR1cC0+bGVuZ3RoLCBBUkNIX0NPTlZFUlQpKTsKKwkJaWYgKGRmcCA+ICZkLT5oZHIuYmVzdGZyZWVbMF0pCisJCQlBU1NFUlQoSU5UX0dFVChkZnBbLTFdLmxlbmd0aCwgQVJDSF9DT05WRVJUKSA+PSBJTlRfR0VUKGRmcFswXS5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkpOworCX0KKyNlbmRpZgorCS8qCisJICogSWYgdGhpcyBpcyBzbWFsbGVyIHRoYW4gdGhlIHNtYWxsZXN0IGJlc3RmcmVlIGVudHJ5LAorCSAqIGl0IGNhbid0IGJlIHRoZXJlIHNpbmNlIHRoZXkncmUgc29ydGVkLgorCSAqLworCWlmIChJTlRfR0VUKGR1cC0+bGVuZ3RoLCBBUkNIX0NPTlZFUlQpIDwgSU5UX0dFVChkLT5oZHIuYmVzdGZyZWVbWEZTX0RJUjJfREFUQV9GRF9DT1VOVCAtIDFdLmxlbmd0aCwgQVJDSF9DT05WRVJUKSkKKwkJcmV0dXJuIE5VTEw7CisJLyoKKwkgKiBMb29rIGF0IHRoZSB0aHJlZSBiZXN0ZnJlZSBlbnRyaWVzIGZvciBvdXIgZ3V5LgorCSAqLworCWZvciAoZGZwID0gJmQtPmhkci5iZXN0ZnJlZVswXTsKKwkgICAgIGRmcCA8ICZkLT5oZHIuYmVzdGZyZWVbWEZTX0RJUjJfREFUQV9GRF9DT1VOVF07CisJICAgICBkZnArKykgeworCQlpZiAoIWRmcC0+b2Zmc2V0KQorCQkJcmV0dXJuIE5VTEw7CisJCWlmIChJTlRfR0VUKGRmcC0+b2Zmc2V0LCBBUkNIX0NPTlZFUlQpID09IG9mZikKKwkJCXJldHVybiBkZnA7CisJfQorCS8qCisJICogRGlkbid0IGZpbmQgaXQuICBUaGlzIG9ubHkgaGFwcGVucyBpZiB0aGVyZSBhcmUgZHVwbGljYXRlIGxlbmd0aHMuCisJICovCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBJbnNlcnQgYW4gdW51c2VkLXNwYWNlIGVudHJ5IGludG8gdGhlIGJlc3RmcmVlIHRhYmxlLgorICovCit4ZnNfZGlyMl9kYXRhX2ZyZWVfdCAqCQkJCS8qIGVudHJ5IGluc2VydGVkICovCit4ZnNfZGlyMl9kYXRhX2ZyZWVpbnNlcnQoCisJeGZzX2RpcjJfZGF0YV90CQkqZCwJCS8qIGRhdGEgYmxvY2sgcG9pbnRlciAqLworCXhmc19kaXIyX2RhdGFfdW51c2VkX3QJKmR1cCwJCS8qIHVudXNlZCBzcGFjZSAqLworCWludAkJCSpsb2doZWFkKQkvKiBsb2cgdGhlIGRhdGEgaGVhZGVyIChvdXQpICovCit7CisJeGZzX2RpcjJfZGF0YV9mcmVlX3QJKmRmcDsJCS8qIGJlc3RmcmVlIHRhYmxlIHBvaW50ZXIgKi8KKwl4ZnNfZGlyMl9kYXRhX2ZyZWVfdAluZXc7CQkvKiBuZXcgYmVzdGZyZWUgZW50cnkgKi8KKworI2lmZGVmIF9fS0VSTkVMX18KKwlBU1NFUlQoSU5UX0dFVChkLT5oZHIubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfREFUQV9NQUdJQyB8fAorCSAgICAgICBJTlRfR0VUKGQtPmhkci5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9CTE9DS19NQUdJQyk7CisjZW5kaWYKKwlkZnAgPSBkLT5oZHIuYmVzdGZyZWU7CisJSU5UX0NPUFkobmV3Lmxlbmd0aCwgZHVwLT5sZW5ndGgsIEFSQ0hfQ09OVkVSVCk7CisJSU5UX1NFVChuZXcub2Zmc2V0LCBBUkNIX0NPTlZFUlQsICh4ZnNfZGlyMl9kYXRhX29mZl90KSgoY2hhciAqKWR1cCAtIChjaGFyICopZCkpOworCS8qCisJICogSW5zZXJ0IGF0IHBvc2l0aW9uIDAsIDEsIG9yIDI7IG9yIG5vdCBhdCBhbGwuCisJICovCisJaWYgKElOVF9HRVQobmV3Lmxlbmd0aCwgQVJDSF9DT05WRVJUKSA+IElOVF9HRVQoZGZwWzBdLmxlbmd0aCwgQVJDSF9DT05WRVJUKSkgeworCQlkZnBbMl0gPSBkZnBbMV07CisJCWRmcFsxXSA9IGRmcFswXTsKKwkJZGZwWzBdID0gbmV3OworCQkqbG9naGVhZCA9IDE7CisJCXJldHVybiAmZGZwWzBdOworCX0KKwlpZiAoSU5UX0dFVChuZXcubGVuZ3RoLCBBUkNIX0NPTlZFUlQpID4gSU5UX0dFVChkZnBbMV0ubGVuZ3RoLCBBUkNIX0NPTlZFUlQpKSB7CisJCWRmcFsyXSA9IGRmcFsxXTsKKwkJZGZwWzFdID0gbmV3OworCQkqbG9naGVhZCA9IDE7CisJCXJldHVybiAmZGZwWzFdOworCX0KKwlpZiAoSU5UX0dFVChuZXcubGVuZ3RoLCBBUkNIX0NPTlZFUlQpID4gSU5UX0dFVChkZnBbMl0ubGVuZ3RoLCBBUkNIX0NPTlZFUlQpKSB7CisJCWRmcFsyXSA9IG5ldzsKKwkJKmxvZ2hlYWQgPSAxOworCQlyZXR1cm4gJmRmcFsyXTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBSZW1vdmUgYSBiZXN0ZnJlZSBlbnRyeSBmcm9tIHRoZSB0YWJsZS4KKyAqLwordm9pZAoreGZzX2RpcjJfZGF0YV9mcmVlcmVtb3ZlKAorCXhmc19kaXIyX2RhdGFfdAkJKmQsCQkvKiBkYXRhIGJsb2NrIHBvaW50ZXIgKi8KKwl4ZnNfZGlyMl9kYXRhX2ZyZWVfdAkqZGZwLAkJLyogYmVzdGZyZWUgZW50cnkgcG9pbnRlciAqLworCWludAkJCSpsb2doZWFkKQkvKiBvdXQ6IGxvZyBkYXRhIGhlYWRlciAqLworeworI2lmZGVmIF9fS0VSTkVMX18KKwlBU1NFUlQoSU5UX0dFVChkLT5oZHIubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfREFUQV9NQUdJQyB8fAorCSAgICAgICBJTlRfR0VUKGQtPmhkci5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9CTE9DS19NQUdJQyk7CisjZW5kaWYKKwkvKgorCSAqIEl0J3MgdGhlIGZpcnN0IGVudHJ5LCBzbGlkZSB0aGUgbmV4dCAyIHVwLgorCSAqLworCWlmIChkZnAgPT0gJmQtPmhkci5iZXN0ZnJlZVswXSkgeworCQlkLT5oZHIuYmVzdGZyZWVbMF0gPSBkLT5oZHIuYmVzdGZyZWVbMV07CisJCWQtPmhkci5iZXN0ZnJlZVsxXSA9IGQtPmhkci5iZXN0ZnJlZVsyXTsKKwl9CisJLyoKKwkgKiBJdCdzIHRoZSBzZWNvbmQgZW50cnksIHNsaWRlIHRoZSAzcmQgZW50cnkgdXAuCisJICovCisJZWxzZSBpZiAoZGZwID09ICZkLT5oZHIuYmVzdGZyZWVbMV0pCisJCWQtPmhkci5iZXN0ZnJlZVsxXSA9IGQtPmhkci5iZXN0ZnJlZVsyXTsKKwkvKgorCSAqIE11c3QgYmUgdGhlIGxhc3QgZW50cnkuCisJICovCisJZWxzZQorCQlBU1NFUlQoZGZwID09ICZkLT5oZHIuYmVzdGZyZWVbMl0pOworCS8qCisJICogQ2xlYXIgdGhlIDNyZCBlbnRyeSwgbXVzdCBiZSB6ZXJvIG5vdy4KKwkgKi8KKwlkLT5oZHIuYmVzdGZyZWVbMl0ubGVuZ3RoID0gMDsKKwlkLT5oZHIuYmVzdGZyZWVbMl0ub2Zmc2V0ID0gMDsKKwkqbG9naGVhZCA9IDE7Cit9CisKKy8qCisgKiBHaXZlbiBhIGRhdGEgYmxvY2ssIHJlY29uc3RydWN0IGl0cyBiZXN0ZnJlZSBtYXAuCisgKi8KK3ZvaWQKK3hmc19kaXIyX2RhdGFfZnJlZXNjYW4oCisJeGZzX21vdW50X3QJCSptcCwJCS8qIGZpbGVzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl4ZnNfZGlyMl9kYXRhX3QJCSpkLAkJLyogZGF0YSBibG9jayBwb2ludGVyICovCisJaW50CQkJKmxvZ2hlYWQsCS8qIG91dDogbG9nIGRhdGEgaGVhZGVyICovCisJY2hhcgkJCSphZW5kcCkJCS8qIGluOiBjYWxsZXIncyBlbmRwICovCit7CisJeGZzX2RpcjJfYmxvY2tfdGFpbF90CSpidHA7CQkvKiBibG9jayB0YWlsICovCisJeGZzX2RpcjJfZGF0YV9lbnRyeV90CSpkZXA7CQkvKiBhY3RpdmUgZGF0YSBlbnRyeSAqLworCXhmc19kaXIyX2RhdGFfdW51c2VkX3QJKmR1cDsJCS8qIHVudXNlZCBkYXRhIGVudHJ5ICovCisJY2hhcgkJCSplbmRwOwkJLyogZW5kIG9mIGJsb2NrJ3MgZGF0YSAqLworCWNoYXIJCQkqcDsJCS8qIGN1cnJlbnQgZW50cnkgcG9pbnRlciAqLworCisjaWZkZWYgX19LRVJORUxfXworCUFTU0VSVChJTlRfR0VUKGQtPmhkci5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9EQVRBX01BR0lDIHx8CisJICAgICAgIElOVF9HRVQoZC0+aGRyLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0JMT0NLX01BR0lDKTsKKyNlbmRpZgorCS8qCisJICogU3RhcnQgYnkgY2xlYXJpbmcgdGhlIHRhYmxlLgorCSAqLworCW1lbXNldChkLT5oZHIuYmVzdGZyZWUsIDAsIHNpemVvZihkLT5oZHIuYmVzdGZyZWUpKTsKKwkqbG9naGVhZCA9IDE7CisJLyoKKwkgKiBTZXQgdXAgcG9pbnRlcnMuCisJICovCisJcCA9IChjaGFyICopZC0+dTsKKwlpZiAoYWVuZHApCisJCWVuZHAgPSBhZW5kcDsKKwllbHNlIGlmIChJTlRfR0VUKGQtPmhkci5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9CTE9DS19NQUdJQykgeworCQlidHAgPSBYRlNfRElSMl9CTE9DS19UQUlMX1AobXAsICh4ZnNfZGlyMl9ibG9ja190ICopZCk7CisJCWVuZHAgPSAoY2hhciAqKVhGU19ESVIyX0JMT0NLX0xFQUZfUChidHApOworCX0gZWxzZQorCQllbmRwID0gKGNoYXIgKilkICsgbXAtPm1fZGlyYmxrc2l6ZTsKKwkvKgorCSAqIExvb3Agb3ZlciB0aGUgYmxvY2sncyBlbnRyaWVzLgorCSAqLworCXdoaWxlIChwIDwgZW5kcCkgeworCQlkdXAgPSAoeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqKXA7CisJCS8qCisJCSAqIElmIGl0J3MgYSBmcmVlIGVudHJ5LCBpbnNlcnQgaXQuCisJCSAqLworCQlpZiAoSU5UX0dFVChkdXAtPmZyZWV0YWcsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfREFUQV9GUkVFX1RBRykgeworCQkJQVNTRVJUKChjaGFyICopZHVwIC0gKGNoYXIgKilkID09CisJCQkgICAgICAgSU5UX0dFVCgqWEZTX0RJUjJfREFUQV9VTlVTRURfVEFHX1AoZHVwKSwgQVJDSF9DT05WRVJUKSk7CisJCQl4ZnNfZGlyMl9kYXRhX2ZyZWVpbnNlcnQoZCwgZHVwLCBsb2doZWFkKTsKKwkJCXAgKz0gSU5UX0dFVChkdXAtPmxlbmd0aCwgQVJDSF9DT05WRVJUKTsKKwkJfQorCQkvKgorCQkgKiBGb3IgYWN0aXZlIGVudHJpZXMsIGNoZWNrIHRoZWlyIHRhZ3MgYW5kIHNraXAgdGhlbS4KKwkJICovCisJCWVsc2UgeworCQkJZGVwID0gKHhmc19kaXIyX2RhdGFfZW50cnlfdCAqKXA7CisJCQlBU1NFUlQoKGNoYXIgKilkZXAgLSAoY2hhciAqKWQgPT0KKwkJCSAgICAgICBJTlRfR0VUKCpYRlNfRElSMl9EQVRBX0VOVFJZX1RBR19QKGRlcCksIEFSQ0hfQ09OVkVSVCkpOworCQkJcCArPSBYRlNfRElSMl9EQVRBX0VOVFNJWkUoZGVwLT5uYW1lbGVuKTsKKwkJfQorCX0KK30KKworLyoKKyAqIEluaXRpYWxpemUgYSBkYXRhIGJsb2NrIGF0IHRoZSBnaXZlbiBibG9jayBudW1iZXIgaW4gdGhlIGRpcmVjdG9yeS4KKyAqIEdpdmUgYmFjayB0aGUgYnVmZmVyIGZvciB0aGUgY3JlYXRlZCBibG9jay4KKyAqLworaW50CQkJCQkJLyogZXJyb3IgKi8KK3hmc19kaXIyX2RhdGFfaW5pdCgKKwl4ZnNfZGFfYXJnc190CQkqYXJncywJCS8qIGRpcmVjdG9yeSBvcGVyYXRpb24gYXJncyAqLworCXhmc19kaXIyX2RiX3QJCWJsa25vLAkJLyogbG9naWNhbCBkaXIgYmxvY2sgbnVtYmVyICovCisJeGZzX2RhYnVmX3QJCSoqYnBwKQkJLyogb3V0cHV0IGJsb2NrIGJ1ZmZlciAqLworeworCXhmc19kYWJ1Zl90CQkqYnA7CQkvKiBibG9jayBidWZmZXIgKi8KKwl4ZnNfZGlyMl9kYXRhX3QJCSpkOwkJLyogcG9pbnRlciB0byBibG9jayAqLworCXhmc19pbm9kZV90CQkqZHA7CQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCisJeGZzX2RpcjJfZGF0YV91bnVzZWRfdAkqZHVwOwkJLyogdW51c2VkIGVudHJ5IHBvaW50ZXIgKi8KKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCWludAkJCWk7CQkvKiBiZXN0ZnJlZSBpbmRleCAqLworCXhmc19tb3VudF90CQkqbXA7CQkvKiBmaWxlc3lzdGVtIG1vdW50IHBvaW50ICovCisJeGZzX3RyYW5zX3QJCSp0cDsJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwlpbnQgICAgICAgICAgICAgICAgICAgICB0OyAgICAgICAgICAgICAgLyogdGVtcCAqLworCisJZHAgPSBhcmdzLT5kcDsKKwltcCA9IGRwLT5pX21vdW50OworCXRwID0gYXJncy0+dHJhbnM7CisJLyoKKwkgKiBHZXQgdGhlIGJ1ZmZlciBzZXQgdXAgZm9yIHRoZSBibG9jay4KKwkgKi8KKwllcnJvciA9IHhmc19kYV9nZXRfYnVmKHRwLCBkcCwgWEZTX0RJUjJfREJfVE9fREEobXAsIGJsa25vKSwgLTEsICZicCwKKwkJWEZTX0RBVEFfRk9SSyk7CisJaWYgKGVycm9yKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJQVNTRVJUKGJwICE9IE5VTEwpOworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgaGVhZGVyLgorCSAqLworCWQgPSBicC0+ZGF0YTsKKwlJTlRfU0VUKGQtPmhkci5tYWdpYywgQVJDSF9DT05WRVJULCBYRlNfRElSMl9EQVRBX01BR0lDKTsKKwlJTlRfU0VUKGQtPmhkci5iZXN0ZnJlZVswXS5vZmZzZXQsIEFSQ0hfQ09OVkVSVCwgKHhmc19kaXIyX2RhdGFfb2ZmX3Qpc2l6ZW9mKGQtPmhkcikpOworCWZvciAoaSA9IDE7IGkgPCBYRlNfRElSMl9EQVRBX0ZEX0NPVU5UOyBpKyspIHsKKwkJZC0+aGRyLmJlc3RmcmVlW2ldLmxlbmd0aCA9IDA7CisJCWQtPmhkci5iZXN0ZnJlZVtpXS5vZmZzZXQgPSAwOworCX0KKwkvKgorCSAqIFNldCB1cCBhbiB1bnVzZWQgZW50cnkgZm9yIHRoZSBibG9jaydzIGJvZHkuCisJICovCisJZHVwID0gJmQtPnVbMF0udW51c2VkOworCUlOVF9TRVQoZHVwLT5mcmVldGFnLCBBUkNIX0NPTlZFUlQsIFhGU19ESVIyX0RBVEFfRlJFRV9UQUcpOworCisJdD1tcC0+bV9kaXJibGtzaXplIC0gKHVpbnQpc2l6ZW9mKGQtPmhkcik7CisJSU5UX1NFVChkLT5oZHIuYmVzdGZyZWVbMF0ubGVuZ3RoLCBBUkNIX0NPTlZFUlQsIHQpOworCUlOVF9TRVQoZHVwLT5sZW5ndGgsIEFSQ0hfQ09OVkVSVCwgdCk7CisJSU5UX1NFVCgqWEZTX0RJUjJfREFUQV9VTlVTRURfVEFHX1AoZHVwKSwgQVJDSF9DT05WRVJULAorCQkoeGZzX2RpcjJfZGF0YV9vZmZfdCkoKGNoYXIgKilkdXAgLSAoY2hhciAqKWQpKTsKKwkvKgorCSAqIExvZyBpdCBhbmQgcmV0dXJuIGl0LgorCSAqLworCXhmc19kaXIyX2RhdGFfbG9nX2hlYWRlcih0cCwgYnApOworCXhmc19kaXIyX2RhdGFfbG9nX3VudXNlZCh0cCwgYnAsIGR1cCk7CisJKmJwcCA9IGJwOworCXJldHVybiAwOworfQorCisvKgorICogTG9nIGFuIGFjdGl2ZSBkYXRhIGVudHJ5IGZyb20gdGhlIGJsb2NrLgorICovCit2b2lkCit4ZnNfZGlyMl9kYXRhX2xvZ19lbnRyeSgKKwl4ZnNfdHJhbnNfdAkJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19kYWJ1Zl90CQkqYnAsCQkvKiBibG9jayBidWZmZXIgKi8KKwl4ZnNfZGlyMl9kYXRhX2VudHJ5X3QJKmRlcCkJCS8qIGRhdGEgZW50cnkgcG9pbnRlciAqLworeworCXhmc19kaXIyX2RhdGFfdAkJKmQ7CQkvKiBkYXRhIGJsb2NrIHBvaW50ZXIgKi8KKworCWQgPSBicC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChkLT5oZHIubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfREFUQV9NQUdJQyB8fAorCSAgICAgICBJTlRfR0VUKGQtPmhkci5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9CTE9DS19NQUdJQyk7CisJeGZzX2RhX2xvZ19idWYodHAsIGJwLCAodWludCkoKGNoYXIgKilkZXAgLSAoY2hhciAqKWQpLAorCQkodWludCkoKGNoYXIgKikoWEZTX0RJUjJfREFUQV9FTlRSWV9UQUdfUChkZXApICsgMSkgLQorCQkgICAgICAgKGNoYXIgKilkIC0gMSkpOworfQorCisvKgorICogTG9nIGEgZGF0YSBibG9jayBoZWFkZXIuCisgKi8KK3ZvaWQKK3hmc19kaXIyX2RhdGFfbG9nX2hlYWRlcigKKwl4ZnNfdHJhbnNfdAkJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19kYWJ1Zl90CQkqYnApCQkvKiBibG9jayBidWZmZXIgKi8KK3sKKwl4ZnNfZGlyMl9kYXRhX3QJCSpkOwkJLyogZGF0YSBibG9jayBwb2ludGVyICovCisKKwlkID0gYnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQoZC0+aGRyLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0RBVEFfTUFHSUMgfHwKKwkgICAgICAgSU5UX0dFVChkLT5oZHIubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfQkxPQ0tfTUFHSUMpOworCXhmc19kYV9sb2dfYnVmKHRwLCBicCwgKHVpbnQpKChjaGFyICopJmQtPmhkciAtIChjaGFyICopZCksCisJCSh1aW50KShzaXplb2YoZC0+aGRyKSAtIDEpKTsKK30KKworLyoKKyAqIExvZyBhIGRhdGEgdW51c2VkIGVudHJ5LgorICovCit2b2lkCit4ZnNfZGlyMl9kYXRhX2xvZ191bnVzZWQoCisJeGZzX3RyYW5zX3QJCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfZGFidWZfdAkJKmJwLAkJLyogYmxvY2sgYnVmZmVyICovCisJeGZzX2RpcjJfZGF0YV91bnVzZWRfdAkqZHVwKQkJLyogZGF0YSB1bnVzZWQgcG9pbnRlciAqLworeworCXhmc19kaXIyX2RhdGFfdAkJKmQ7CQkvKiBkYXRhIGJsb2NrIHBvaW50ZXIgKi8KKworCWQgPSBicC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChkLT5oZHIubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfREFUQV9NQUdJQyB8fAorCSAgICAgICBJTlRfR0VUKGQtPmhkci5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9CTE9DS19NQUdJQyk7CisJLyoKKwkgKiBMb2cgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHVudXNlZCBlbnRyeS4KKwkgKi8KKwl4ZnNfZGFfbG9nX2J1Zih0cCwgYnAsICh1aW50KSgoY2hhciAqKWR1cCAtIChjaGFyICopZCksCisJCSh1aW50KSgoY2hhciAqKSZkdXAtPmxlbmd0aCArIHNpemVvZihkdXAtPmxlbmd0aCkgLQorCQkgICAgICAgMSAtIChjaGFyICopZCkpOworCS8qCisJICogTG9nIHRoZSBlbmQgKHRhZykgb2YgdGhlIHVudXNlZCBlbnRyeS4KKwkgKi8KKwl4ZnNfZGFfbG9nX2J1Zih0cCwgYnAsCisJCSh1aW50KSgoY2hhciAqKVhGU19ESVIyX0RBVEFfVU5VU0VEX1RBR19QKGR1cCkgLSAoY2hhciAqKWQpLAorCQkodWludCkoKGNoYXIgKilYRlNfRElSMl9EQVRBX1VOVVNFRF9UQUdfUChkdXApIC0gKGNoYXIgKilkICsKKwkJICAgICAgIHNpemVvZih4ZnNfZGlyMl9kYXRhX29mZl90KSAtIDEpKTsKK30KKworLyoKKyAqIE1ha2UgYSBieXRlIHJhbmdlIGluIHRoZSBkYXRhIGJsb2NrIHVudXNlZC4KKyAqIEl0cyBjdXJyZW50IGNvbnRlbnRzIGFyZSB1bmltcG9ydGFudC4KKyAqLwordm9pZAoreGZzX2RpcjJfZGF0YV9tYWtlX2ZyZWUoCisJeGZzX3RyYW5zX3QJCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfZGFidWZfdAkJKmJwLAkJLyogYmxvY2sgYnVmZmVyICovCisJeGZzX2RpcjJfZGF0YV9hb2ZmX3QJb2Zmc2V0LAkJLyogc3RhcnRpbmcgYnl0ZSBvZmZzZXQgKi8KKwl4ZnNfZGlyMl9kYXRhX2FvZmZfdAlsZW4sCQkvKiBsZW5ndGggaW4gYnl0ZXMgKi8KKwlpbnQJCQkqbmVlZGxvZ3AsCS8qIG91dDogbG9nIGhlYWRlciAqLworCWludAkJCSpuZWVkc2NhbnApCS8qIG91dDogcmVnZW4gYmVzdGZyZWUgKi8KK3sKKwl4ZnNfZGlyMl9kYXRhX3QJCSpkOwkJLyogZGF0YSBibG9jayBwb2ludGVyICovCisJeGZzX2RpcjJfZGF0YV9mcmVlX3QJKmRmcDsJCS8qIGJlc3RmcmVlIHBvaW50ZXIgKi8KKwljaGFyCQkJKmVuZHB0cjsJLyogZW5kIG9mIGRhdGEgYXJlYSAqLworCXhmc19tb3VudF90CQkqbXA7CQkvKiBmaWxlc3lzdGVtIG1vdW50IHBvaW50ICovCisJaW50CQkJbmVlZHNjYW47CS8qIG5lZWQgdG8gcmVnZW4gYmVzdGZyZWUgKi8KKwl4ZnNfZGlyMl9kYXRhX3VudXNlZF90CSpuZXdkdXA7CS8qIG5ldyB1bnVzZWQgZW50cnkgKi8KKwl4ZnNfZGlyMl9kYXRhX3VudXNlZF90CSpwb3N0ZHVwOwkvKiB1bnVzZWQgZW50cnkgYWZ0ZXIgdXMgKi8KKwl4ZnNfZGlyMl9kYXRhX3VudXNlZF90CSpwcmV2ZHVwOwkvKiB1bnVzZWQgZW50cnkgYmVmb3JlIHVzICovCisKKwltcCA9IHRwLT50X21vdW50cDsKKwlkID0gYnAtPmRhdGE7CisJLyoKKwkgKiBGaWd1cmUgb3V0IHdoZXJlIHRoZSBlbmQgb2YgdGhlIGRhdGEgYXJlYSBpcy4KKwkgKi8KKwlpZiAoSU5UX0dFVChkLT5oZHIubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfREFUQV9NQUdJQykKKwkJZW5kcHRyID0gKGNoYXIgKilkICsgbXAtPm1fZGlyYmxrc2l6ZTsKKwllbHNlIHsKKwkJeGZzX2RpcjJfYmxvY2tfdGFpbF90CSpidHA7CS8qIGJsb2NrIHRhaWwgKi8KKworCQlBU1NFUlQoSU5UX0dFVChkLT5oZHIubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfQkxPQ0tfTUFHSUMpOworCQlidHAgPSBYRlNfRElSMl9CTE9DS19UQUlMX1AobXAsICh4ZnNfZGlyMl9ibG9ja190ICopZCk7CisJCWVuZHB0ciA9IChjaGFyICopWEZTX0RJUjJfQkxPQ0tfTEVBRl9QKGJ0cCk7CisJfQorCS8qCisJICogSWYgdGhpcyBpc24ndCB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrLCB0aGVuIGJhY2sgdXAgdG8KKwkgKiB0aGUgcHJldmlvdXMgZW50cnkgYW5kIHNlZSBpZiBpdCdzIGZyZWUuCisJICovCisJaWYgKG9mZnNldCA+IHNpemVvZihkLT5oZHIpKSB7CisJCXhmc19kaXIyX2RhdGFfb2ZmX3QJKnRhZ3A7CS8qIHRhZyBqdXN0IGJlZm9yZSB1cyAqLworCisJCXRhZ3AgPSAoeGZzX2RpcjJfZGF0YV9vZmZfdCAqKSgoY2hhciAqKWQgKyBvZmZzZXQpIC0gMTsKKwkJcHJldmR1cCA9ICh4ZnNfZGlyMl9kYXRhX3VudXNlZF90ICopKChjaGFyICopZCArIElOVF9HRVQoKnRhZ3AsIEFSQ0hfQ09OVkVSVCkpOworCQlpZiAoSU5UX0dFVChwcmV2ZHVwLT5mcmVldGFnLCBBUkNIX0NPTlZFUlQpICE9IFhGU19ESVIyX0RBVEFfRlJFRV9UQUcpCisJCQlwcmV2ZHVwID0gTlVMTDsKKwl9IGVsc2UKKwkJcHJldmR1cCA9IE5VTEw7CisJLyoKKwkgKiBJZiB0aGlzIGlzbid0IHRoZSBlbmQgb2YgdGhlIGJsb2NrLCBzZWUgaWYgdGhlIGVudHJ5IGFmdGVyCisJICogdXMgaXMgZnJlZS4KKwkgKi8KKwlpZiAoKGNoYXIgKilkICsgb2Zmc2V0ICsgbGVuIDwgZW5kcHRyKSB7CisJCXBvc3RkdXAgPQorCQkJKHhmc19kaXIyX2RhdGFfdW51c2VkX3QgKikoKGNoYXIgKilkICsgb2Zmc2V0ICsgbGVuKTsKKwkJaWYgKElOVF9HRVQocG9zdGR1cC0+ZnJlZXRhZywgQVJDSF9DT05WRVJUKSAhPSBYRlNfRElSMl9EQVRBX0ZSRUVfVEFHKQorCQkJcG9zdGR1cCA9IE5VTEw7CisJfSBlbHNlCisJCXBvc3RkdXAgPSBOVUxMOworCUFTU0VSVCgqbmVlZHNjYW5wID09IDApOworCW5lZWRzY2FuID0gMDsKKwkvKgorCSAqIFByZXZpb3VzIGFuZCBmb2xsb3dpbmcgZW50cmllcyBhcmUgYm90aCBmcmVlLAorCSAqIG1lcmdlIGV2ZXJ5dGhpbmcgaW50byBhIHNpbmdsZSBmcmVlIGVudHJ5LgorCSAqLworCWlmIChwcmV2ZHVwICYmIHBvc3RkdXApIHsKKwkJeGZzX2RpcjJfZGF0YV9mcmVlX3QJKmRmcDI7CS8qIGFub3RoZXIgYmVzdGZyZWUgcG9pbnRlciAqLworCisJCS8qCisJCSAqIFNlZSBpZiBwcmV2ZHVwIGFuZC9vciBwb3N0ZHVwIGFyZSBpbiBiZXN0ZnJlZSB0YWJsZS4KKwkJICovCisJCWRmcCA9IHhmc19kaXIyX2RhdGFfZnJlZWZpbmQoZCwgcHJldmR1cCk7CisJCWRmcDIgPSB4ZnNfZGlyMl9kYXRhX2ZyZWVmaW5kKGQsIHBvc3RkdXApOworCQkvKgorCQkgKiBXZSBuZWVkIGEgcmVzY2FuIHVubGVzcyB0aGVyZSBhcmUgZXhhY3RseSAyIGZyZWUgZW50cmllcworCQkgKiBuYW1lbHkgb3VyIHR3by4gIFRoZW4gd2Uga25vdyB3aGF0J3MgaGFwcGVuaW5nLCBvdGhlcndpc2UKKwkJICogc2luY2UgdGhlIHRoaXJkIGJlc3RmcmVlIGlzIHRoZXJlLCB0aGVyZSBtaWdodCBiZSBtb3JlCisJCSAqIGVudHJpZXMuCisJCSAqLworCQluZWVkc2NhbiA9IGQtPmhkci5iZXN0ZnJlZVsyXS5sZW5ndGg7CisJCS8qCisJCSAqIEZpeCB1cCB0aGUgbmV3IGJpZyBmcmVlc3BhY2UuCisJCSAqLworCQlJTlRfTU9EKHByZXZkdXAtPmxlbmd0aCwgQVJDSF9DT05WRVJULCBsZW4gKyBJTlRfR0VUKHBvc3RkdXAtPmxlbmd0aCwgQVJDSF9DT05WRVJUKSk7CisJCUlOVF9TRVQoKlhGU19ESVIyX0RBVEFfVU5VU0VEX1RBR19QKHByZXZkdXApLCBBUkNIX0NPTlZFUlQsCisJCQkoeGZzX2RpcjJfZGF0YV9vZmZfdCkoKGNoYXIgKilwcmV2ZHVwIC0gKGNoYXIgKilkKSk7CisJCXhmc19kaXIyX2RhdGFfbG9nX3VudXNlZCh0cCwgYnAsIHByZXZkdXApOworCQlpZiAoIW5lZWRzY2FuKSB7CisJCQkvKgorCQkJICogSGFzIHRvIGJlIHRoZSBjYXNlIHRoYXQgZW50cmllcyAwIGFuZCAxIGFyZQorCQkJICogZGZwIGFuZCBkZnAyIChkb24ndCBrbm93IHdoaWNoIGlzIHdoaWNoKSwgYW5kCisJCQkgKiBlbnRyeSAyIGlzIGVtcHR5LgorCQkJICogUmVtb3ZlIGVudHJ5IDEgZmlyc3QgdGhlbiBlbnRyeSAwLgorCQkJICovCisJCQlBU1NFUlQoZGZwICYmIGRmcDIpOworCQkJaWYgKGRmcCA9PSAmZC0+aGRyLmJlc3RmcmVlWzFdKSB7CisJCQkJZGZwID0gJmQtPmhkci5iZXN0ZnJlZVswXTsKKwkJCQlBU1NFUlQoZGZwMiA9PSBkZnApOworCQkJCWRmcDIgPSAmZC0+aGRyLmJlc3RmcmVlWzFdOworCQkJfQorCQkJeGZzX2RpcjJfZGF0YV9mcmVlcmVtb3ZlKGQsIGRmcDIsIG5lZWRsb2dwKTsKKwkJCXhmc19kaXIyX2RhdGFfZnJlZXJlbW92ZShkLCBkZnAsIG5lZWRsb2dwKTsKKwkJCS8qCisJCQkgKiBOb3cgaW5zZXJ0IHRoZSBuZXcgZW50cnkuCisJCQkgKi8KKwkJCWRmcCA9IHhmc19kaXIyX2RhdGFfZnJlZWluc2VydChkLCBwcmV2ZHVwLCBuZWVkbG9ncCk7CisJCQlBU1NFUlQoZGZwID09ICZkLT5oZHIuYmVzdGZyZWVbMF0pOworCQkJQVNTRVJUKElOVF9HRVQoZGZwLT5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkgPT0gSU5UX0dFVChwcmV2ZHVwLT5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkpOworCQkJQVNTRVJUKCFkZnBbMV0ubGVuZ3RoKTsKKwkJCUFTU0VSVCghZGZwWzJdLmxlbmd0aCk7CisJCX0KKwl9CisJLyoKKwkgKiBUaGUgZW50cnkgYmVmb3JlIHVzIGlzIGZyZWUsIG1lcmdlIHdpdGggaXQuCisJICovCisJZWxzZSBpZiAocHJldmR1cCkgeworCQlkZnAgPSB4ZnNfZGlyMl9kYXRhX2ZyZWVmaW5kKGQsIHByZXZkdXApOworCQlJTlRfTU9EKHByZXZkdXAtPmxlbmd0aCwgQVJDSF9DT05WRVJULCBsZW4pOworCQlJTlRfU0VUKCpYRlNfRElSMl9EQVRBX1VOVVNFRF9UQUdfUChwcmV2ZHVwKSwgQVJDSF9DT05WRVJULAorCQkJKHhmc19kaXIyX2RhdGFfb2ZmX3QpKChjaGFyICopcHJldmR1cCAtIChjaGFyICopZCkpOworCQl4ZnNfZGlyMl9kYXRhX2xvZ191bnVzZWQodHAsIGJwLCBwcmV2ZHVwKTsKKwkJLyoKKwkJICogSWYgdGhlIHByZXZpb3VzIGVudHJ5IHdhcyBpbiB0aGUgdGFibGUsIHRoZSBuZXcgZW50cnkKKwkJICogaXMgbG9uZ2VyLCBzbyBpdCB3aWxsIGJlIGluIHRoZSB0YWJsZSB0b28uICBSZW1vdmUKKwkJICogdGhlIG9sZCBvbmUgYW5kIGFkZCB0aGUgbmV3IG9uZS4KKwkJICovCisJCWlmIChkZnApIHsKKwkJCXhmc19kaXIyX2RhdGFfZnJlZXJlbW92ZShkLCBkZnAsIG5lZWRsb2dwKTsKKwkJCSh2b2lkKXhmc19kaXIyX2RhdGFfZnJlZWluc2VydChkLCBwcmV2ZHVwLCBuZWVkbG9ncCk7CisJCX0KKwkJLyoKKwkJICogT3RoZXJ3aXNlIHdlIG5lZWQgYSBzY2FuIGlmIHRoZSBuZXcgZW50cnkgaXMgYmlnIGVub3VnaC4KKwkJICovCisJCWVsc2UKKwkJCW5lZWRzY2FuID0gSU5UX0dFVChwcmV2ZHVwLT5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkgPiBJTlRfR0VUKGQtPmhkci5iZXN0ZnJlZVsyXS5sZW5ndGgsIEFSQ0hfQ09OVkVSVCk7CisJfQorCS8qCisJICogVGhlIGZvbGxvd2luZyBlbnRyeSBpcyBmcmVlLCBtZXJnZSB3aXRoIGl0LgorCSAqLworCWVsc2UgaWYgKHBvc3RkdXApIHsKKwkJZGZwID0geGZzX2RpcjJfZGF0YV9mcmVlZmluZChkLCBwb3N0ZHVwKTsKKwkJbmV3ZHVwID0gKHhmc19kaXIyX2RhdGFfdW51c2VkX3QgKikoKGNoYXIgKilkICsgb2Zmc2V0KTsKKwkJSU5UX1NFVChuZXdkdXAtPmZyZWV0YWcsIEFSQ0hfQ09OVkVSVCwgWEZTX0RJUjJfREFUQV9GUkVFX1RBRyk7CisJCUlOVF9TRVQobmV3ZHVwLT5sZW5ndGgsIEFSQ0hfQ09OVkVSVCwgbGVuICsgSU5UX0dFVChwb3N0ZHVwLT5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkpOworCQlJTlRfU0VUKCpYRlNfRElSMl9EQVRBX1VOVVNFRF9UQUdfUChuZXdkdXApLCBBUkNIX0NPTlZFUlQsCisJCQkoeGZzX2RpcjJfZGF0YV9vZmZfdCkoKGNoYXIgKiluZXdkdXAgLSAoY2hhciAqKWQpKTsKKwkJeGZzX2RpcjJfZGF0YV9sb2dfdW51c2VkKHRwLCBicCwgbmV3ZHVwKTsKKwkJLyoKKwkJICogSWYgdGhlIGZvbGxvd2luZyBlbnRyeSB3YXMgaW4gdGhlIHRhYmxlLCB0aGUgbmV3IGVudHJ5CisJCSAqIGlzIGxvbmdlciwgc28gaXQgd2lsbCBiZSBpbiB0aGUgdGFibGUgdG9vLiAgUmVtb3ZlCisJCSAqIHRoZSBvbGQgb25lIGFuZCBhZGQgdGhlIG5ldyBvbmUuCisJCSAqLworCQlpZiAoZGZwKSB7CisJCQl4ZnNfZGlyMl9kYXRhX2ZyZWVyZW1vdmUoZCwgZGZwLCBuZWVkbG9ncCk7CisJCQkodm9pZCl4ZnNfZGlyMl9kYXRhX2ZyZWVpbnNlcnQoZCwgbmV3ZHVwLCBuZWVkbG9ncCk7CisJCX0KKwkJLyoKKwkJICogT3RoZXJ3aXNlIHdlIG5lZWQgYSBzY2FuIGlmIHRoZSBuZXcgZW50cnkgaXMgYmlnIGVub3VnaC4KKwkJICovCisJCWVsc2UKKwkJCW5lZWRzY2FuID0gSU5UX0dFVChuZXdkdXAtPmxlbmd0aCwgQVJDSF9DT05WRVJUKSA+IElOVF9HRVQoZC0+aGRyLmJlc3RmcmVlWzJdLmxlbmd0aCwgQVJDSF9DT05WRVJUKTsKKwl9CisJLyoKKwkgKiBOZWl0aGVyIG5laWdoYm9yIGlzIGZyZWUuICBNYWtlIGEgbmV3IGVudHJ5LgorCSAqLworCWVsc2UgeworCQluZXdkdXAgPSAoeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqKSgoY2hhciAqKWQgKyBvZmZzZXQpOworCQlJTlRfU0VUKG5ld2R1cC0+ZnJlZXRhZywgQVJDSF9DT05WRVJULCBYRlNfRElSMl9EQVRBX0ZSRUVfVEFHKTsKKwkJSU5UX1NFVChuZXdkdXAtPmxlbmd0aCwgQVJDSF9DT05WRVJULCBsZW4pOworCQlJTlRfU0VUKCpYRlNfRElSMl9EQVRBX1VOVVNFRF9UQUdfUChuZXdkdXApLCBBUkNIX0NPTlZFUlQsCisJCQkoeGZzX2RpcjJfZGF0YV9vZmZfdCkoKGNoYXIgKiluZXdkdXAgLSAoY2hhciAqKWQpKTsKKwkJeGZzX2RpcjJfZGF0YV9sb2dfdW51c2VkKHRwLCBicCwgbmV3ZHVwKTsKKwkJKHZvaWQpeGZzX2RpcjJfZGF0YV9mcmVlaW5zZXJ0KGQsIG5ld2R1cCwgbmVlZGxvZ3ApOworCX0KKwkqbmVlZHNjYW5wID0gbmVlZHNjYW47Cit9CisKKy8qCisgKiBUYWtlIGEgYnl0ZSByYW5nZSBvdXQgb2YgYW4gZXhpc3RpbmcgdW51c2VkIHNwYWNlIGFuZCBtYWtlIGl0IHVuLWZyZWUuCisgKi8KK3ZvaWQKK3hmc19kaXIyX2RhdGFfdXNlX2ZyZWUoCisJeGZzX3RyYW5zX3QJCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfZGFidWZfdAkJKmJwLAkJLyogZGF0YSBibG9jayBidWZmZXIgKi8KKwl4ZnNfZGlyMl9kYXRhX3VudXNlZF90CSpkdXAsCQkvKiB1bnVzZWQgZW50cnkgKi8KKwl4ZnNfZGlyMl9kYXRhX2FvZmZfdAlvZmZzZXQsCQkvKiBzdGFydGluZyBvZmZzZXQgdG8gdXNlICovCisJeGZzX2RpcjJfZGF0YV9hb2ZmX3QJbGVuLAkJLyogbGVuZ3RoIHRvIHVzZSAqLworCWludAkJCSpuZWVkbG9ncCwJLyogb3V0OiBuZWVkIHRvIGxvZyBoZWFkZXIgKi8KKwlpbnQJCQkqbmVlZHNjYW5wKQkvKiBvdXQ6IG5lZWQgcmVnZW4gYmVzdGZyZWUgKi8KK3sKKwl4ZnNfZGlyMl9kYXRhX3QJCSpkOwkJLyogZGF0YSBibG9jayAqLworCXhmc19kaXIyX2RhdGFfZnJlZV90CSpkZnA7CQkvKiBiZXN0ZnJlZSBwb2ludGVyICovCisJaW50CQkJbWF0Y2hiYWNrOwkvKiBtYXRjaGVzIGVuZCBvZiBmcmVlc3BhY2UgKi8KKwlpbnQJCQltYXRjaGZyb250OwkvKiBtYXRjaGVzIHN0YXJ0IG9mIGZyZWVzcGFjZSAqLworCWludAkJCW5lZWRzY2FuOwkvKiBuZWVkIHRvIHJlZ2VuIGJlc3RmcmVlICovCisJeGZzX2RpcjJfZGF0YV91bnVzZWRfdAkqbmV3ZHVwOwkvKiBuZXcgdW51c2VkIGVudHJ5ICovCisJeGZzX2RpcjJfZGF0YV91bnVzZWRfdAkqbmV3ZHVwMjsJLyogYW5vdGhlciBuZXcgdW51c2VkIGVudHJ5ICovCisJaW50CQkJb2xkbGVuOwkJLyogb2xkIHVudXNlZCBlbnRyeSdzIGxlbmd0aCAqLworCisJZCA9IGJwLT5kYXRhOworCUFTU0VSVChJTlRfR0VUKGQtPmhkci5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9EQVRBX01BR0lDIHx8CisJICAgICAgIElOVF9HRVQoZC0+aGRyLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0JMT0NLX01BR0lDKTsKKwlBU1NFUlQoSU5UX0dFVChkdXAtPmZyZWV0YWcsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfREFUQV9GUkVFX1RBRyk7CisJQVNTRVJUKG9mZnNldCA+PSAoY2hhciAqKWR1cCAtIChjaGFyICopZCk7CisJQVNTRVJUKG9mZnNldCArIGxlbiA8PSAoY2hhciAqKWR1cCArIElOVF9HRVQoZHVwLT5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkgLSAoY2hhciAqKWQpOworCUFTU0VSVCgoY2hhciAqKWR1cCAtIChjaGFyICopZCA9PSBJTlRfR0VUKCpYRlNfRElSMl9EQVRBX1VOVVNFRF9UQUdfUChkdXApLCBBUkNIX0NPTlZFUlQpKTsKKwkvKgorCSAqIExvb2sgdXAgdGhlIGVudHJ5IGluIHRoZSBiZXN0ZnJlZSB0YWJsZS4KKwkgKi8KKwlkZnAgPSB4ZnNfZGlyMl9kYXRhX2ZyZWVmaW5kKGQsIGR1cCk7CisJb2xkbGVuID0gSU5UX0dFVChkdXAtPmxlbmd0aCwgQVJDSF9DT05WRVJUKTsKKwlBU1NFUlQoZGZwIHx8IG9sZGxlbiA8PSBJTlRfR0VUKGQtPmhkci5iZXN0ZnJlZVsyXS5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkpOworCS8qCisJICogQ2hlY2sgZm9yIGFsaWdubWVudCB3aXRoIGZyb250IGFuZCBiYWNrIG9mIHRoZSBlbnRyeS4KKwkgKi8KKwltYXRjaGZyb250ID0gKGNoYXIgKilkdXAgLSAoY2hhciAqKWQgPT0gb2Zmc2V0OworCW1hdGNoYmFjayA9IChjaGFyICopZHVwICsgb2xkbGVuIC0gKGNoYXIgKilkID09IG9mZnNldCArIGxlbjsKKwlBU1NFUlQoKm5lZWRzY2FucCA9PSAwKTsKKwluZWVkc2NhbiA9IDA7CisJLyoKKwkgKiBJZiB3ZSBtYXRjaGVkIGl0IGV4YWN0bHkgd2UganVzdCBuZWVkIHRvIGdldCByaWQgb2YgaXQgZnJvbQorCSAqIHRoZSBiZXN0ZnJlZSB0YWJsZS4KKwkgKi8KKwlpZiAobWF0Y2hmcm9udCAmJiBtYXRjaGJhY2spIHsKKwkJaWYgKGRmcCkgeworCQkJbmVlZHNjYW4gPSBkLT5oZHIuYmVzdGZyZWVbMl0ub2Zmc2V0OworCQkJaWYgKCFuZWVkc2NhbikKKwkJCQl4ZnNfZGlyMl9kYXRhX2ZyZWVyZW1vdmUoZCwgZGZwLCBuZWVkbG9ncCk7CisJCX0KKwl9CisJLyoKKwkgKiBXZSBtYXRjaCB0aGUgZmlyc3QgcGFydCBvZiB0aGUgZW50cnkuCisJICogTWFrZSBhIG5ldyBlbnRyeSB3aXRoIHRoZSByZW1haW5pbmcgZnJlZXNwYWNlLgorCSAqLworCWVsc2UgaWYgKG1hdGNoZnJvbnQpIHsKKwkJbmV3ZHVwID0gKHhmc19kaXIyX2RhdGFfdW51c2VkX3QgKikoKGNoYXIgKilkICsgb2Zmc2V0ICsgbGVuKTsKKwkJSU5UX1NFVChuZXdkdXAtPmZyZWV0YWcsIEFSQ0hfQ09OVkVSVCwgWEZTX0RJUjJfREFUQV9GUkVFX1RBRyk7CisJCUlOVF9TRVQobmV3ZHVwLT5sZW5ndGgsIEFSQ0hfQ09OVkVSVCwgb2xkbGVuIC0gbGVuKTsKKwkJSU5UX1NFVCgqWEZTX0RJUjJfREFUQV9VTlVTRURfVEFHX1AobmV3ZHVwKSwgQVJDSF9DT05WRVJULAorCQkJKHhmc19kaXIyX2RhdGFfb2ZmX3QpKChjaGFyICopbmV3ZHVwIC0gKGNoYXIgKilkKSk7CisJCXhmc19kaXIyX2RhdGFfbG9nX3VudXNlZCh0cCwgYnAsIG5ld2R1cCk7CisJCS8qCisJCSAqIElmIGl0IHdhcyBpbiB0aGUgdGFibGUsIHJlbW92ZSBpdCBhbmQgYWRkIHRoZSBuZXcgb25lLgorCQkgKi8KKwkJaWYgKGRmcCkgeworCQkJeGZzX2RpcjJfZGF0YV9mcmVlcmVtb3ZlKGQsIGRmcCwgbmVlZGxvZ3ApOworCQkJZGZwID0geGZzX2RpcjJfZGF0YV9mcmVlaW5zZXJ0KGQsIG5ld2R1cCwgbmVlZGxvZ3ApOworCQkJQVNTRVJUKGRmcCAhPSBOVUxMKTsKKwkJCUFTU0VSVChJTlRfR0VUKGRmcC0+bGVuZ3RoLCBBUkNIX0NPTlZFUlQpID09IElOVF9HRVQobmV3ZHVwLT5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkpOworCQkJQVNTRVJUKElOVF9HRVQoZGZwLT5vZmZzZXQsIEFSQ0hfQ09OVkVSVCkgPT0gKGNoYXIgKiluZXdkdXAgLSAoY2hhciAqKWQpOworCQkJLyoKKwkJCSAqIElmIHdlIGdvdCBpbnNlcnRlZCBhdCB0aGUgbGFzdCBzbG90LAorCQkJICogdGhhdCBtZWFucyB3ZSBkb24ndCBrbm93IGlmIHRoZXJlIHdhcyBhIGJldHRlcgorCQkJICogY2hvaWNlIGZvciB0aGUgbGFzdCBzbG90LCBvciBub3QuICBSZXNjYW4uCisJCQkgKi8KKwkJCW5lZWRzY2FuID0gZGZwID09ICZkLT5oZHIuYmVzdGZyZWVbMl07CisJCX0KKwl9CisJLyoKKwkgKiBXZSBtYXRjaCB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBlbnRyeS4KKwkgKiBUcmltIHRoZSBhbGxvY2F0ZWQgc3BhY2Ugb2ZmIHRoZSB0YWlsIG9mIHRoZSBlbnRyeS4KKwkgKi8KKwllbHNlIGlmIChtYXRjaGJhY2spIHsKKwkJbmV3ZHVwID0gZHVwOworCQlJTlRfU0VUKG5ld2R1cC0+bGVuZ3RoLCBBUkNIX0NPTlZFUlQsICh4ZnNfZGlyMl9kYXRhX29mZl90KQorCQkJKCgoY2hhciAqKWQgKyBvZmZzZXQpIC0gKGNoYXIgKiluZXdkdXApKTsKKwkJSU5UX1NFVCgqWEZTX0RJUjJfREFUQV9VTlVTRURfVEFHX1AobmV3ZHVwKSwgQVJDSF9DT05WRVJULAorCQkJKHhmc19kaXIyX2RhdGFfb2ZmX3QpKChjaGFyICopbmV3ZHVwIC0gKGNoYXIgKilkKSk7CisJCXhmc19kaXIyX2RhdGFfbG9nX3VudXNlZCh0cCwgYnAsIG5ld2R1cCk7CisJCS8qCisJCSAqIElmIGl0IHdhcyBpbiB0aGUgdGFibGUsIHJlbW92ZSBpdCBhbmQgYWRkIHRoZSBuZXcgb25lLgorCQkgKi8KKwkJaWYgKGRmcCkgeworCQkJeGZzX2RpcjJfZGF0YV9mcmVlcmVtb3ZlKGQsIGRmcCwgbmVlZGxvZ3ApOworCQkJZGZwID0geGZzX2RpcjJfZGF0YV9mcmVlaW5zZXJ0KGQsIG5ld2R1cCwgbmVlZGxvZ3ApOworCQkJQVNTRVJUKGRmcCAhPSBOVUxMKTsKKwkJCUFTU0VSVChJTlRfR0VUKGRmcC0+bGVuZ3RoLCBBUkNIX0NPTlZFUlQpID09IElOVF9HRVQobmV3ZHVwLT5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkpOworCQkJQVNTRVJUKElOVF9HRVQoZGZwLT5vZmZzZXQsIEFSQ0hfQ09OVkVSVCkgPT0gKGNoYXIgKiluZXdkdXAgLSAoY2hhciAqKWQpOworCQkJLyoKKwkJCSAqIElmIHdlIGdvdCBpbnNlcnRlZCBhdCB0aGUgbGFzdCBzbG90LAorCQkJICogdGhhdCBtZWFucyB3ZSBkb24ndCBrbm93IGlmIHRoZXJlIHdhcyBhIGJldHRlcgorCQkJICogY2hvaWNlIGZvciB0aGUgbGFzdCBzbG90LCBvciBub3QuICBSZXNjYW4uCisJCQkgKi8KKwkJCW5lZWRzY2FuID0gZGZwID09ICZkLT5oZHIuYmVzdGZyZWVbMl07CisJCX0KKwl9CisJLyoKKwkgKiBQb2tpbmcgb3V0IHRoZSBtaWRkbGUgb2YgYW4gZW50cnkuCisJICogTWFrZSB0d28gbmV3IGVudHJpZXMuCisJICovCisJZWxzZSB7CisJCW5ld2R1cCA9IGR1cDsKKwkJSU5UX1NFVChuZXdkdXAtPmxlbmd0aCwgQVJDSF9DT05WRVJULCAoeGZzX2RpcjJfZGF0YV9vZmZfdCkKKwkJCSgoKGNoYXIgKilkICsgb2Zmc2V0KSAtIChjaGFyICopbmV3ZHVwKSk7CisJCUlOVF9TRVQoKlhGU19ESVIyX0RBVEFfVU5VU0VEX1RBR19QKG5ld2R1cCksIEFSQ0hfQ09OVkVSVCwKKwkJCSh4ZnNfZGlyMl9kYXRhX29mZl90KSgoY2hhciAqKW5ld2R1cCAtIChjaGFyICopZCkpOworCQl4ZnNfZGlyMl9kYXRhX2xvZ191bnVzZWQodHAsIGJwLCBuZXdkdXApOworCQluZXdkdXAyID0gKHhmc19kaXIyX2RhdGFfdW51c2VkX3QgKikoKGNoYXIgKilkICsgb2Zmc2V0ICsgbGVuKTsKKwkJSU5UX1NFVChuZXdkdXAyLT5mcmVldGFnLCBBUkNIX0NPTlZFUlQsIFhGU19ESVIyX0RBVEFfRlJFRV9UQUcpOworCQlJTlRfU0VUKG5ld2R1cDItPmxlbmd0aCwgQVJDSF9DT05WRVJULCBvbGRsZW4gLSBsZW4gLSBJTlRfR0VUKG5ld2R1cC0+bGVuZ3RoLCBBUkNIX0NPTlZFUlQpKTsKKwkJSU5UX1NFVCgqWEZTX0RJUjJfREFUQV9VTlVTRURfVEFHX1AobmV3ZHVwMiksIEFSQ0hfQ09OVkVSVCwKKwkJCSh4ZnNfZGlyMl9kYXRhX29mZl90KSgoY2hhciAqKW5ld2R1cDIgLSAoY2hhciAqKWQpKTsKKwkJeGZzX2RpcjJfZGF0YV9sb2dfdW51c2VkKHRwLCBicCwgbmV3ZHVwMik7CisJCS8qCisJCSAqIElmIHRoZSBvbGQgZW50cnkgd2FzIGluIHRoZSB0YWJsZSwgd2UgbmVlZCB0byBzY2FuCisJCSAqIGlmIHRoZSAzcmQgZW50cnkgd2FzIHZhbGlkLCBzaW5jZSB0aGVzZSBlbnRyaWVzCisJCSAqIGFyZSBzbWFsbGVyIHRoYW4gdGhlIG9sZCBvbmUuCisJCSAqIElmIHdlIGRvbid0IG5lZWQgdG8gc2NhbiB0aGF0IG1lYW5zIHRoZXJlIHdlcmUgMSBvciAyCisJCSAqIGVudHJpZXMgaW4gdGhlIHRhYmxlLCBhbmQgcmVtb3ZpbmcgdGhlIG9sZCBhbmQgYWRkaW5nCisJCSAqIHRoZSAyIG5ldyB3aWxsIHdvcmsuCisJCSAqLworCQlpZiAoZGZwKSB7CisJCQluZWVkc2NhbiA9IGQtPmhkci5iZXN0ZnJlZVsyXS5sZW5ndGg7CisJCQlpZiAoIW5lZWRzY2FuKSB7CisJCQkJeGZzX2RpcjJfZGF0YV9mcmVlcmVtb3ZlKGQsIGRmcCwgbmVlZGxvZ3ApOworCQkJCSh2b2lkKXhmc19kaXIyX2RhdGFfZnJlZWluc2VydChkLCBuZXdkdXAsCisJCQkJCW5lZWRsb2dwKTsKKwkJCQkodm9pZCl4ZnNfZGlyMl9kYXRhX2ZyZWVpbnNlcnQoZCwgbmV3ZHVwMiwKKwkJCQkJbmVlZGxvZ3ApOworCQkJfQorCQl9CisJfQorCSpuZWVkc2NhbnAgPSBuZWVkc2NhbjsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGlyMl9kYXRhLmggYi9mcy94ZnMveGZzX2RpcjJfZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMDIyOTQKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2RpcjJfZGF0YS5oCkBAIC0wLDAgKzEsMjMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfRElSMl9EQVRBX0hfXworI2RlZmluZQlfX1hGU19ESVIyX0RBVEFfSF9fCisKKy8qCisgKiBEaXJlY3RvcnkgZm9ybWF0IDIsIGRhdGEgYmxvY2sgc3RydWN0dXJlcy4KKyAqLworCitzdHJ1Y3QgeGZzX2RhYnVmOworc3RydWN0IHhmc19kYV9hcmdzOworc3RydWN0IHhmc19pbm9kZTsKK3N0cnVjdCB4ZnNfdHJhbnM7CisKKy8qCisgKiBDb25zdGFudHMuCisgKi8KKyNkZWZpbmUJWEZTX0RJUjJfREFUQV9NQUdJQwkweDU4NDQzMjQ0CS8qIFhEMkQ6IGZvciBtdWx0aWJsb2NrIGRpcnMgKi8KKyNkZWZpbmUJWEZTX0RJUjJfREFUQV9BTElHTl9MT0cJMwkJLyogaS5lLiwgOCBieXRlcyAqLworI2RlZmluZQlYRlNfRElSMl9EQVRBX0FMSUdOCSgxIDw8IFhGU19ESVIyX0RBVEFfQUxJR05fTE9HKQorI2RlZmluZQlYRlNfRElSMl9EQVRBX0ZSRUVfVEFHCTB4ZmZmZgorI2RlZmluZQlYRlNfRElSMl9EQVRBX0ZEX0NPVU5UCTMKKworLyoKKyAqIERpcmVjdG9yeSBhZGRyZXNzIHNwYWNlIGRpdmlkZWQgaW50byBzZWN0aW9ucywKKyAqIHNwYWNlcyBzZXBhcmF0ZWQgYnkgMzJnYi4KKyAqLworI2RlZmluZQlYRlNfRElSMl9TUEFDRV9TSVpFCSgxVUxMIDw8ICgzMiArIFhGU19ESVIyX0RBVEFfQUxJR05fTE9HKSkKKyNkZWZpbmUJWEZTX0RJUjJfREFUQV9TUEFDRQkwCisjZGVmaW5lCVhGU19ESVIyX0RBVEFfT0ZGU0VUCShYRlNfRElSMl9EQVRBX1NQQUNFICogWEZTX0RJUjJfU1BBQ0VfU0laRSkKKyNkZWZpbmUJWEZTX0RJUjJfREFUQV9GSVJTVERCKG1wKQlcCisJWEZTX0RJUjJfQllURV9UT19EQihtcCwgWEZTX0RJUjJfREFUQV9PRkZTRVQpCisKKy8qCisgKiBPZmZzZXRzIG9mIC4gYW5kIC4uIGluIGRhdGEgc3BhY2UgKGFsd2F5cyBibG9jayAwKQorICovCisjZGVmaW5lCVhGU19ESVIyX0RBVEFfRE9UX09GRlNFVAlcCisJKCh4ZnNfZGlyMl9kYXRhX2FvZmZfdClzaXplb2YoeGZzX2RpcjJfZGF0YV9oZHJfdCkpCisjZGVmaW5lCVhGU19ESVIyX0RBVEFfRE9URE9UX09GRlNFVAlcCisJKFhGU19ESVIyX0RBVEFfRE9UX09GRlNFVCArIFhGU19ESVIyX0RBVEFfRU5UU0laRSgxKSkKKyNkZWZpbmUJWEZTX0RJUjJfREFUQV9GSVJTVF9PRkZTRVQJCVwKKwkoWEZTX0RJUjJfREFUQV9ET1RET1RfT0ZGU0VUICsgWEZTX0RJUjJfREFUQV9FTlRTSVpFKDIpKQorCisvKgorICogU3RydWN0dXJlcy4KKyAqLworCisvKgorICogRGVzY3JpYmUgYSBmcmVlIGFyZWEgaW4gdGhlIGRhdGEgYmxvY2suCisgKiBUaGUgZnJlZXNwYWNlIHdpbGwgYmUgZm9ybWF0dGVkIGFzIGEgeGZzX2RpcjJfZGF0YV91bnVzZWRfdC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RpcjJfZGF0YV9mcmVlIHsKKwl4ZnNfZGlyMl9kYXRhX29mZl90CW9mZnNldDsJCS8qIHN0YXJ0IG9mIGZyZWVzcGFjZSAqLworCXhmc19kaXIyX2RhdGFfb2ZmX3QJbGVuZ3RoOwkJLyogbGVuZ3RoIG9mIGZyZWVzcGFjZSAqLworfSB4ZnNfZGlyMl9kYXRhX2ZyZWVfdDsKKworLyoKKyAqIEhlYWRlciBmb3IgdGhlIGRhdGEgYmxvY2tzLgorICogQWx3YXlzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBkaXJlY3Rvcnktc2l6ZWQgYmxvY2suCisgKiBUaGUgY29kZSBrbm93cyB0aGF0IFhGU19ESVIyX0RBVEFfRkRfQ09VTlQgaXMgMy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RpcjJfZGF0YV9oZHIgeworCV9fdWludDMyX3QJCW1hZ2ljOwkJLyogWEZTX0RJUjJfREFUQV9NQUdJQyAqLworCQkJCQkJLyogb3IgWEZTX0RJUjJfQkxPQ0tfTUFHSUMgKi8KKwl4ZnNfZGlyMl9kYXRhX2ZyZWVfdAliZXN0ZnJlZVtYRlNfRElSMl9EQVRBX0ZEX0NPVU5UXTsKK30geGZzX2RpcjJfZGF0YV9oZHJfdDsKKworLyoKKyAqIEFjdGl2ZSBlbnRyeSBpbiBhIGRhdGEgYmxvY2suICBBbGlnbmVkIHRvIDggYnl0ZXMuCisgKiBUYWcgYXBwZWFycyBhcyB0aGUgbGFzdCAyIGJ5dGVzLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlyMl9kYXRhX2VudHJ5IHsKKwl4ZnNfaW5vX3QJCWludW1iZXI7CS8qIGlub2RlIG51bWJlciAqLworCV9fdWludDhfdAkJbmFtZWxlbjsJLyogbmFtZSBsZW5ndGggKi8KKwlfX3VpbnQ4X3QJCW5hbWVbMV07CS8qIG5hbWUgYnl0ZXMsIG5vIG51bGwgKi8KKwkJCQkJCS8qIHZhcmlhYmxlIG9mZnNldCAqLworCXhmc19kaXIyX2RhdGFfb2ZmX3QJdGFnOwkJLyogc3RhcnRpbmcgb2Zmc2V0IG9mIHVzICovCit9IHhmc19kaXIyX2RhdGFfZW50cnlfdDsKKworLyoKKyAqIFVudXNlZCBlbnRyeSBpbiBhIGRhdGEgYmxvY2suICBBbGlnbmVkIHRvIDggYnl0ZXMuCisgKiBUYWcgYXBwZWFycyBhcyB0aGUgbGFzdCAyIGJ5dGVzLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlyMl9kYXRhX3VudXNlZCB7CisJX191aW50MTZfdAkJZnJlZXRhZzsJLyogWEZTX0RJUjJfREFUQV9GUkVFX1RBRyAqLworCXhmc19kaXIyX2RhdGFfb2ZmX3QJbGVuZ3RoOwkJLyogdG90YWwgZnJlZSBsZW5ndGggKi8KKwkJCQkJCS8qIHZhcmlhYmxlIG9mZnNldCAqLworCXhmc19kaXIyX2RhdGFfb2ZmX3QJdGFnOwkJLyogc3RhcnRpbmcgb2Zmc2V0IG9mIHVzICovCit9IHhmc19kaXIyX2RhdGFfdW51c2VkX3Q7CisKK3R5cGVkZWYgdW5pb24geworCXhmc19kaXIyX2RhdGFfZW50cnlfdAllbnRyeTsKKwl4ZnNfZGlyMl9kYXRhX3VudXNlZF90CXVudXNlZDsKK30geGZzX2RpcjJfZGF0YV91bmlvbl90OworCisvKgorICogR2VuZXJpYyBkYXRhIGJsb2NrIHN0cnVjdHVyZSwgZm9yIHhmc19kYi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RpcjJfZGF0YSB7CisJeGZzX2RpcjJfZGF0YV9oZHJfdAloZHI7CQkvKiBtYWdpYyBYRlNfRElSMl9EQVRBX01BR0lDICovCisJeGZzX2RpcjJfZGF0YV91bmlvbl90CXVbMV07Cit9IHhmc19kaXIyX2RhdGFfdDsKKworLyoKKyAqIE1hY3Jvcy4KKyAqLworCisvKgorICogU2l6ZSBvZiBhIGRhdGEgZW50cnkuCisgKi8KKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUjJfREFUQV9FTlRTSVpFKQoraW50IHhmc19kaXIyX2RhdGFfZW50c2l6ZShpbnQgbik7CisjZGVmaW5lIFhGU19ESVIyX0RBVEFfRU5UU0laRShuKQl4ZnNfZGlyMl9kYXRhX2VudHNpemUobikKKyNlbHNlCisjZGVmaW5lCVhGU19ESVIyX0RBVEFfRU5UU0laRShuKQlcCisJKChpbnQpKHJvdW5kdXAob2Zmc2V0b2YoeGZzX2RpcjJfZGF0YV9lbnRyeV90LCBuYW1lWzBdKSArIChuKSArIFwKKwkJICh1aW50KXNpemVvZih4ZnNfZGlyMl9kYXRhX29mZl90KSwgWEZTX0RJUjJfREFUQV9BTElHTikpKQorI2VuZGlmCisKKy8qCisgKiBQb2ludGVyIHRvIGFuIGVudHJ5J3MgdGFnIHdvcmQuCisgKi8KKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUjJfREFUQV9FTlRSWV9UQUdfUCkKK3hmc19kaXIyX2RhdGFfb2ZmX3QgKnhmc19kaXIyX2RhdGFfZW50cnlfdGFnX3AoeGZzX2RpcjJfZGF0YV9lbnRyeV90ICpkZXApOworI2RlZmluZQlYRlNfRElSMl9EQVRBX0VOVFJZX1RBR19QKGRlcCkJeGZzX2RpcjJfZGF0YV9lbnRyeV90YWdfcChkZXApCisjZWxzZQorI2RlZmluZQlYRlNfRElSMl9EQVRBX0VOVFJZX1RBR19QKGRlcCkJXAorCSgoeGZzX2RpcjJfZGF0YV9vZmZfdCAqKVwKKwkgKChjaGFyICopKGRlcCkgKyBYRlNfRElSMl9EQVRBX0VOVFNJWkUoKGRlcCktPm5hbWVsZW4pIC0gXAorCSAgKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2RhdGFfb2ZmX3QpKSkKKyNlbmRpZgorCisvKgorICogUG9pbnRlciB0byBhIGZyZWVzcGFjZSdzIHRhZyB3b3JkLgorICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVIyX0RBVEFfVU5VU0VEX1RBR19QKQoreGZzX2RpcjJfZGF0YV9vZmZfdCAqeGZzX2RpcjJfZGF0YV91bnVzZWRfdGFnX3AoeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqZHVwKTsKKyNkZWZpbmUJWEZTX0RJUjJfREFUQV9VTlVTRURfVEFHX1AoZHVwKSBcCisJeGZzX2RpcjJfZGF0YV91bnVzZWRfdGFnX3AoZHVwKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0RJUjJfREFUQV9VTlVTRURfVEFHX1AoZHVwKQlcCisJKCh4ZnNfZGlyMl9kYXRhX29mZl90ICopXAorCSAoKGNoYXIgKikoZHVwKSArIElOVF9HRVQoKGR1cCktPmxlbmd0aCwgQVJDSF9DT05WRVJUKSBcCisJCQktICh1aW50KXNpemVvZih4ZnNfZGlyMl9kYXRhX29mZl90KSkpCisjZW5kaWYKKworLyoKKyAqIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KKyAqLworCisjaWZkZWYgREVCVUcKK2V4dGVybiB2b2lkCisJeGZzX2RpcjJfZGF0YV9jaGVjayhzdHJ1Y3QgeGZzX2lub2RlICpkcCwgc3RydWN0IHhmc19kYWJ1ZiAqYnApOworI2Vsc2UKKyNkZWZpbmUJeGZzX2RpcjJfZGF0YV9jaGVjayhkcCxicCkKKyNlbmRpZgorCitleHRlcm4geGZzX2RpcjJfZGF0YV9mcmVlX3QgKgorCXhmc19kaXIyX2RhdGFfZnJlZWZpbmQoeGZzX2RpcjJfZGF0YV90ICpkLAorCQkJICAgICAgIHhmc19kaXIyX2RhdGFfdW51c2VkX3QgKmR1cCk7CisKK2V4dGVybiB4ZnNfZGlyMl9kYXRhX2ZyZWVfdCAqCisJeGZzX2RpcjJfZGF0YV9mcmVlaW5zZXJ0KHhmc19kaXIyX2RhdGFfdCAqZCwKKwkJCQkgeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqZHVwLCBpbnQgKmxvZ2hlYWQpOworCitleHRlcm4gdm9pZAorCXhmc19kaXIyX2RhdGFfZnJlZXJlbW92ZSh4ZnNfZGlyMl9kYXRhX3QgKmQsCisJCQkJIHhmc19kaXIyX2RhdGFfZnJlZV90ICpkZnAsIGludCAqbG9naGVhZCk7CisKK2V4dGVybiB2b2lkCisJeGZzX2RpcjJfZGF0YV9mcmVlc2NhbihzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RpcjJfZGF0YV90ICpkLAorCQkJICAgICAgIGludCAqbG9naGVhZCwgY2hhciAqYWVuZHApOworCitleHRlcm4gaW50CisJeGZzX2RpcjJfZGF0YV9pbml0KHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywgeGZzX2RpcjJfZGJfdCBibGtubywKKwkJCSAgIHN0cnVjdCB4ZnNfZGFidWYgKipicHApOworCitleHRlcm4gdm9pZAorCXhmc19kaXIyX2RhdGFfbG9nX2VudHJ5KHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCBzdHJ1Y3QgeGZzX2RhYnVmICpicCwKKwkJCQl4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgKmRlcCk7CisKK2V4dGVybiB2b2lkCisJeGZzX2RpcjJfZGF0YV9sb2dfaGVhZGVyKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCBzdHJ1Y3QgeGZzX2RhYnVmICpicCk7CisKK2V4dGVybiB2b2lkCisJeGZzX2RpcjJfZGF0YV9sb2dfdW51c2VkKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCBzdHJ1Y3QgeGZzX2RhYnVmICpicCwKKwkJCQkgeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqZHVwKTsKKworZXh0ZXJuIHZvaWQKKwl4ZnNfZGlyMl9kYXRhX21ha2VfZnJlZShzdHJ1Y3QgeGZzX3RyYW5zICp0cCwgc3RydWN0IHhmc19kYWJ1ZiAqYnAsCisJCQkJeGZzX2RpcjJfZGF0YV9hb2ZmX3Qgb2Zmc2V0LAorCQkJCXhmc19kaXIyX2RhdGFfYW9mZl90IGxlbiwgaW50ICpuZWVkbG9ncCwKKwkJCQlpbnQgKm5lZWRzY2FucCk7CisKK2V4dGVybiB2b2lkCisJeGZzX2RpcjJfZGF0YV91c2VfZnJlZShzdHJ1Y3QgeGZzX3RyYW5zICp0cCwgc3RydWN0IHhmc19kYWJ1ZiAqYnAsCisJCQkgICAgICAgeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqZHVwLAorCQkJICAgICAgIHhmc19kaXIyX2RhdGFfYW9mZl90IG9mZnNldCwKKwkJCSAgICAgICB4ZnNfZGlyMl9kYXRhX2FvZmZfdCBsZW4sIGludCAqbmVlZGxvZ3AsCisJCQkgICAgICAgaW50ICpuZWVkc2NhbnApOworCisjZW5kaWYJLyogX19YRlNfRElSMl9EQVRBX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXIyX2xlYWYuYyBiL2ZzL3hmcy94ZnNfZGlyMl9sZWFmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYyZDFlOAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfZGlyMl9sZWFmLmMKQEAgLTAsMCArMSwxODk2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisvKgorICogeGZzX2RpcjJfbGVhZi5jCisgKiBYRlMgZGlyZWN0b3J5IHZlcnNpb24gMiBpbXBsZW1lbnRhdGlvbiAtIHNpbmdsZSBsZWFmIGZvcm0KKyAqIHNlZSB4ZnNfZGlyMl9sZWFmLmggZm9yIGRhdGEgc3RydWN0dXJlcy4KKyAqIFRoZXNlIGRpcmVjdG9yaWVzIGhhdmUgbXVsdGlwbGUgWEZTX0RJUjJfREFUQSBibG9ja3MgYW5kIG9uZQorICogWEZTX0RJUjJfTEVBRjEgYmxvY2sgY29udGFpbmluZyB0aGUgaGFzaCB0YWJsZSBhbmQgZnJlZXNwYWNlIG1hcC4KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisKKyNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2FnLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcC5oIgorI2luY2x1ZGUgInhmc19kYV9idHJlZS5oIgorI2luY2x1ZGUgInhmc19kaXIyX2RhdGEuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9sZWFmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfYmxvY2suaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9ub2RlLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfdHJhY2UuaCIKKyNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCisKKy8qCisgKiBMb2NhbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCisgKi8KKyNpZmRlZiBERUJVRworc3RhdGljIHZvaWQgeGZzX2RpcjJfbGVhZl9jaGVjayh4ZnNfaW5vZGVfdCAqZHAsIHhmc19kYWJ1Zl90ICpicCk7CisjZWxzZQorI2RlZmluZQl4ZnNfZGlyMl9sZWFmX2NoZWNrKGRwLCBicCkKKyNlbmRpZgorc3RhdGljIGludCB4ZnNfZGlyMl9sZWFmX2xvb2t1cF9pbnQoeGZzX2RhX2FyZ3NfdCAqYXJncywgeGZzX2RhYnVmX3QgKipsYnBwLAorCQkJCSAgICBpbnQgKmluZGV4cCwgeGZzX2RhYnVmX3QgKipkYnBwKTsKKworLyoKKyAqIENvbnZlcnQgYSBibG9jayBmb3JtIGRpcmVjdG9yeSB0byBhIGxlYWYgZm9ybSBkaXJlY3RvcnkuCisgKi8KK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9ibG9ja190b19sZWFmKAorCXhmc19kYV9hcmdzX3QJCSphcmdzLAkJLyogb3BlcmF0aW9uIGFyZ3VtZW50cyAqLworCXhmc19kYWJ1Zl90CQkqZGJwKQkJLyogaW5wdXQgYmxvY2sncyBidWZmZXIgKi8KK3sKKwl4ZnNfZGlyMl9kYXRhX29mZl90CSpiZXN0c3A7CS8qIGxlYWYncyBiZXN0c3AgZW50cmllcyAqLworCXhmc19kYWJsa190CQlibGtubzsJCS8qIGxlYWYgYmxvY2sncyBibm8gKi8KKwl4ZnNfZGlyMl9ibG9ja190CSpibG9jazsJCS8qIGJsb2NrIHN0cnVjdHVyZSAqLworCXhmc19kaXIyX2xlYWZfZW50cnlfdAkqYmxwOwkJLyogYmxvY2sncyBsZWFmIGVudHJpZXMgKi8KKwl4ZnNfZGlyMl9ibG9ja190YWlsX3QJKmJ0cDsJCS8qIGJsb2NrJ3MgdGFpbCAqLworCXhmc19pbm9kZV90CQkqZHA7CQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gY29kZSAqLworCXhmc19kYWJ1Zl90CQkqbGJwOwkJLyogbGVhZiBibG9jaydzIGJ1ZmZlciAqLworCXhmc19kaXIyX2RiX3QJCWxkYjsJCS8qIGxlYWYgYmxvY2sncyBibm8gKi8KKwl4ZnNfZGlyMl9sZWFmX3QJCSpsZWFmOwkJLyogbGVhZiBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9sZWFmX3RhaWxfdAkqbHRwOwkJLyogbGVhZidzIHRhaWwgKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLworCWludAkJCW5lZWRsb2c7CS8qIG5lZWQgdG8gbG9nIGJsb2NrIGhlYWRlciAqLworCWludAkJCW5lZWRzY2FuOwkvKiBuZWVkIHRvIHJlc2NhbiBiZXN0ZnJlZSAqLworCXhmc190cmFuc190CQkqdHA7CQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisKKwl4ZnNfZGlyMl90cmFjZV9hcmdzX2IoImJsb2NrX3RvX2xlYWYiLCBhcmdzLCBkYnApOworCWRwID0gYXJncy0+ZHA7CisJbXAgPSBkcC0+aV9tb3VudDsKKwl0cCA9IGFyZ3MtPnRyYW5zOworCS8qCisJICogQWRkIHRoZSBsZWFmIGJsb2NrIHRvIHRoZSBpbm9kZS4KKwkgKiBUaGlzIGludGVyZmFjZSB3aWxsIG9ubHkgcHV0IGJsb2NrcyBpbiB0aGUgbGVhZi9ub2RlIHJhbmdlLgorCSAqIFNpbmNlIHRoYXQncyBlbXB0eSBub3csIHdlJ2xsIGdldCB0aGUgcm9vdCAoYmxvY2sgMCBpbiByYW5nZSkuCisJICovCisJaWYgKChlcnJvciA9IHhmc19kYV9ncm93X2lub2RlKGFyZ3MsICZibGtubykpKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJbGRiID0gWEZTX0RJUjJfREFfVE9fREIobXAsIGJsa25vKTsKKwlBU1NFUlQobGRiID09IFhGU19ESVIyX0xFQUZfRklSU1REQihtcCkpOworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgbGVhZiBibG9jaywgZ2V0IGEgYnVmZmVyIGZvciBpdC4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2RpcjJfbGVhZl9pbml0KGFyZ3MsIGxkYiwgJmxicCwgWEZTX0RJUjJfTEVBRjFfTUFHSUMpKSkgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCUFTU0VSVChsYnAgIT0gTlVMTCk7CisJbGVhZiA9IGxicC0+ZGF0YTsKKwlibG9jayA9IGRicC0+ZGF0YTsKKwl4ZnNfZGlyMl9kYXRhX2NoZWNrKGRwLCBkYnApOworCWJ0cCA9IFhGU19ESVIyX0JMT0NLX1RBSUxfUChtcCwgYmxvY2spOworCWJscCA9IFhGU19ESVIyX0JMT0NLX0xFQUZfUChidHApOworCS8qCisJICogU2V0IHRoZSBjb3VudHMgaW4gdGhlIGxlYWYgaGVhZGVyLgorCSAqLworCUlOVF9DT1BZKGxlYWYtPmhkci5jb3VudCwgYnRwLT5jb3VudCwgQVJDSF9DT05WRVJUKTsgLyogSU5UXzogdHlwZSBjaGFuZ2UgKi8KKwlJTlRfQ09QWShsZWFmLT5oZHIuc3RhbGUsIGJ0cC0+c3RhbGUsIEFSQ0hfQ09OVkVSVCk7IC8qIElOVF86IHR5cGUgY2hhbmdlICovCisJLyoKKwkgKiBDb3VsZCBjb21wYWN0IHRoZXNlIGJ1dCBJIHRoaW5rIHdlIGFsd2F5cyBkbyB0aGUgY29udmVyc2lvbgorCSAqIGFmdGVyIHNxdWVlemluZyBvdXQgc3RhbGUgZW50cmllcy4KKwkgKi8KKwltZW1jcHkobGVhZi0+ZW50cywgYmxwLCBJTlRfR0VUKGJ0cC0+Y291bnQsIEFSQ0hfQ09OVkVSVCkgKiBzaXplb2YoeGZzX2RpcjJfbGVhZl9lbnRyeV90KSk7CisJeGZzX2RpcjJfbGVhZl9sb2dfZW50cyh0cCwgbGJwLCAwLCBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAtIDEpOworCW5lZWRzY2FuID0gMDsKKwluZWVkbG9nID0gMTsKKwkvKgorCSAqIE1ha2UgdGhlIHNwYWNlIGZvcm1lcmx5IG9jY3VwaWVkIGJ5IHRoZSBsZWFmIGVudHJpZXMgYW5kIGJsb2NrCisJICogdGFpbCBiZSBmcmVlLgorCSAqLworCXhmc19kaXIyX2RhdGFfbWFrZV9mcmVlKHRwLCBkYnAsCisJCSh4ZnNfZGlyMl9kYXRhX2FvZmZfdCkoKGNoYXIgKilibHAgLSAoY2hhciAqKWJsb2NrKSwKKwkJKHhmc19kaXIyX2RhdGFfYW9mZl90KSgoY2hhciAqKWJsb2NrICsgbXAtPm1fZGlyYmxrc2l6ZSAtCisJCQkJICAgICAgIChjaGFyICopYmxwKSwKKwkJJm5lZWRsb2csICZuZWVkc2Nhbik7CisJLyoKKwkgKiBGaXggdXAgdGhlIGJsb2NrIGhlYWRlciwgbWFrZSBpdCBhIGRhdGEgYmxvY2suCisJICovCisJSU5UX1NFVChibG9jay0+aGRyLm1hZ2ljLCBBUkNIX0NPTlZFUlQsIFhGU19ESVIyX0RBVEFfTUFHSUMpOworCWlmIChuZWVkc2NhbikKKwkJeGZzX2RpcjJfZGF0YV9mcmVlc2NhbihtcCwgKHhmc19kaXIyX2RhdGFfdCAqKWJsb2NrLCAmbmVlZGxvZywKKwkJCU5VTEwpOworCS8qCisJICogU2V0IHVwIGxlYWYgdGFpbCBhbmQgYmVzdHMgdGFibGUuCisJICovCisJbHRwID0gWEZTX0RJUjJfTEVBRl9UQUlMX1AobXAsIGxlYWYpOworCUlOVF9TRVQobHRwLT5iZXN0Y291bnQsIEFSQ0hfQ09OVkVSVCwgMSk7CisJYmVzdHNwID0gWEZTX0RJUjJfTEVBRl9CRVNUU19QKGx0cCk7CisJSU5UX0NPUFkoYmVzdHNwWzBdLCBibG9jay0+aGRyLmJlc3RmcmVlWzBdLmxlbmd0aCwgQVJDSF9DT05WRVJUKTsKKwkvKgorCSAqIExvZyB0aGUgZGF0YSBoZWFkZXIgYW5kIGxlYWYgYmVzdHMgdGFibGUuCisJICovCisJaWYgKG5lZWRsb2cpCisJCXhmc19kaXIyX2RhdGFfbG9nX2hlYWRlcih0cCwgZGJwKTsKKwl4ZnNfZGlyMl9sZWFmX2NoZWNrKGRwLCBsYnApOworCXhmc19kaXIyX2RhdGFfY2hlY2soZHAsIGRicCk7CisJeGZzX2RpcjJfbGVhZl9sb2dfYmVzdHModHAsIGxicCwgMCwgMCk7CisJeGZzX2RhX2J1Zl9kb25lKGxicCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBZGQgYW4gZW50cnkgdG8gYSBsZWFmIGZvcm0gZGlyZWN0b3J5LgorICovCitpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2RpcjJfbGVhZl9hZGRuYW1lKAorCXhmc19kYV9hcmdzX3QJCSphcmdzKQkJLyogb3BlcmF0aW9uIGFyZ3VtZW50cyAqLworeworCXhmc19kaXIyX2RhdGFfb2ZmX3QJKmJlc3RzcDsJLyogZnJlZXNwYWNlIHRhYmxlIGluIGxlYWYgKi8KKwlpbnQJCQljb21wYWN0OwkvKiBuZWVkIHRvIGNvbXBhY3QgbGVhdmVzICovCisJeGZzX2RpcjJfZGF0YV90CQkqZGF0YTsJCS8qIGRhdGEgYmxvY2sgc3RydWN0dXJlICovCisJeGZzX2RhYnVmX3QJCSpkYnA7CQkvKiBkYXRhIGJsb2NrIGJ1ZmZlciAqLworCXhmc19kaXIyX2RhdGFfZW50cnlfdAkqZGVwOwkJLyogZGF0YSBibG9jayBlbnRyeSAqLworCXhmc19pbm9kZV90CQkqZHA7CQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCisJeGZzX2RpcjJfZGF0YV91bnVzZWRfdAkqZHVwOwkJLyogZGF0YSB1bnVzZWQgZW50cnkgKi8KKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCWludAkJCWdyb3duOwkJLyogYWxsb2NhdGVkIG5ldyBkYXRhIGJsb2NrICovCisJaW50CQkJaGlnaHN0YWxlOwkvKiBpbmRleCBvZiBuZXh0IHN0YWxlIGxlYWYgKi8KKwlpbnQJCQlpOwkJLyogdGVtcG9yYXJ5LCBpbmRleCAqLworCWludAkJCWluZGV4OwkJLyogbGVhZiB0YWJsZSBwb3NpdGlvbiAqLworCXhmc19kYWJ1Zl90CQkqbGJwOwkJLyogbGVhZidzIGJ1ZmZlciAqLworCXhmc19kaXIyX2xlYWZfdAkJKmxlYWY7CQkvKiBsZWFmIHN0cnVjdHVyZSAqLworCWludAkJCWxlbmd0aDsJCS8qIGxlbmd0aCBvZiBuZXcgZW50cnkgKi8KKwl4ZnNfZGlyMl9sZWFmX2VudHJ5X3QJKmxlcDsJCS8qIGxlYWYgZW50cnkgdGFibGUgcG9pbnRlciAqLworCWludAkJCWxmbG9nbG93OwkvKiBsb3cgbGVhZiBsb2dnaW5nIGluZGV4ICovCisJaW50CQkJbGZsb2doaWdoOwkvKiBoaWdoIGxlYWYgbG9nZ2luZyBpbmRleCAqLworCWludAkJCWxvd3N0YWxlOwkvKiBpbmRleCBvZiBwcmV2IHN0YWxlIGxlYWYgKi8KKwl4ZnNfZGlyMl9sZWFmX3RhaWxfdAkqbHRwOwkJLyogbGVhZiB0YWlsIHBvaW50ZXIgKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLworCWludAkJCW5lZWRieXRlczsJLyogbGVhZiBibG9jayBieXRlcyBuZWVkZWQgKi8KKwlpbnQJCQluZWVkbG9nOwkvKiBuZWVkIHRvIGxvZyBkYXRhIGhlYWRlciAqLworCWludAkJCW5lZWRzY2FuOwkvKiBuZWVkIHRvIHJlc2NhbiBkYXRhIGZyZWUgKi8KKwl4ZnNfZGlyMl9kYXRhX29mZl90CSp0YWdwOwkJLyogZW5kIG9mIGRhdGEgZW50cnkgKi8KKwl4ZnNfdHJhbnNfdAkJKnRwOwkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19kaXIyX2RiX3QJCXVzZV9ibG9jazsJLyogZGF0YSBibG9jayBudW1iZXIgKi8KKworCXhmc19kaXIyX3RyYWNlX2FyZ3MoImxlYWZfYWRkbmFtZSIsIGFyZ3MpOworCWRwID0gYXJncy0+ZHA7CisJdHAgPSBhcmdzLT50cmFuczsKKwltcCA9IGRwLT5pX21vdW50OworCS8qCisJICogUmVhZCB0aGUgbGVhZiBibG9jay4KKwkgKi8KKwllcnJvciA9IHhmc19kYV9yZWFkX2J1Zih0cCwgZHAsIG1wLT5tX2RpcmxlYWZibGssIC0xLCAmbGJwLAorCQlYRlNfREFUQV9GT1JLKTsKKwlpZiAoZXJyb3IpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlBU1NFUlQobGJwICE9IE5VTEwpOworCS8qCisJICogTG9vayB1cCB0aGUgZW50cnkgYnkgaGFzaCB2YWx1ZSBhbmQgbmFtZS4KKwkgKiBXZSBrbm93IGl0J3Mgbm90IHRoZXJlLCBvdXIgY2FsbGVyIGhhcyBhbHJlYWR5IGRvbmUgYSBsb29rdXAuCisJICogU28gdGhlIGluZGV4IGlzIG9mIHRoZSBlbnRyeSB0byBpbnNlcnQgaW4gZnJvbnQgb2YuCisJICogQnV0IGlmIHRoZXJlIGFyZSBkdXAgaGFzaCB2YWx1ZXMgdGhlIGluZGV4IGlzIG9mIHRoZSBmaXJzdCBvZiB0aG9zZS4KKwkgKi8KKwlpbmRleCA9IHhmc19kaXIyX2xlYWZfc2VhcmNoX2hhc2goYXJncywgbGJwKTsKKwlsZWFmID0gbGJwLT5kYXRhOworCWx0cCA9IFhGU19ESVIyX0xFQUZfVEFJTF9QKG1wLCBsZWFmKTsKKwliZXN0c3AgPSBYRlNfRElSMl9MRUFGX0JFU1RTX1AobHRwKTsKKwlsZW5ndGggPSBYRlNfRElSMl9EQVRBX0VOVFNJWkUoYXJncy0+bmFtZWxlbik7CisJLyoKKwkgKiBTZWUgaWYgdGhlcmUgYXJlIGFueSBlbnRyaWVzIHdpdGggdGhlIHNhbWUgaGFzaCB2YWx1ZQorCSAqIGFuZCBzcGFjZSBpbiB0aGVpciBibG9jayBmb3IgdGhlIG5ldyBlbnRyeS4KKwkgKiBUaGlzIGlzIGdvb2QgYmVjYXVzZSBpdCBwdXRzIG11bHRpcGxlIHNhbWUtaGFzaCB2YWx1ZSBlbnRyaWVzCisJICogaW4gYSBkYXRhIGJsb2NrLCBpbXByb3ZpbmcgdGhlIGxvb2t1cCBvZiB0aG9zZSBlbnRyaWVzLgorCSAqLworCWZvciAodXNlX2Jsb2NrID0gLTEsIGxlcCA9ICZsZWFmLT5lbnRzW2luZGV4XTsKKwkgICAgIGluZGV4IDwgSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgJiYgSU5UX0dFVChsZXAtPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkgPT0gYXJncy0+aGFzaHZhbDsKKwkgICAgIGluZGV4KyssIGxlcCsrKSB7CisJCWlmIChJTlRfR0VUKGxlcC0+YWRkcmVzcywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9OVUxMX0RBVEFQVFIpCisJCQljb250aW51ZTsKKwkJaSA9IFhGU19ESVIyX0RBVEFQVFJfVE9fREIobXAsIElOVF9HRVQobGVwLT5hZGRyZXNzLCBBUkNIX0NPTlZFUlQpKTsKKwkJQVNTRVJUKGkgPCBJTlRfR0VUKGx0cC0+YmVzdGNvdW50LCBBUkNIX0NPTlZFUlQpKTsKKwkJQVNTRVJUKElOVF9HRVQoYmVzdHNwW2ldLCBBUkNIX0NPTlZFUlQpICE9IE5VTExEQVRBT0ZGKTsKKwkJaWYgKElOVF9HRVQoYmVzdHNwW2ldLCBBUkNIX0NPTlZFUlQpID49IGxlbmd0aCkgeworCQkJdXNlX2Jsb2NrID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCS8qCisJICogRGlkbid0IGZpbmQgYSBibG9jayB5ZXQsIGxpbmVhciBzZWFyY2ggYWxsIHRoZSBkYXRhIGJsb2Nrcy4KKwkgKi8KKwlpZiAodXNlX2Jsb2NrID09IC0xKSB7CisJCWZvciAoaSA9IDA7IGkgPCBJTlRfR0VUKGx0cC0+YmVzdGNvdW50LCBBUkNIX0NPTlZFUlQpOyBpKyspIHsKKwkJCS8qCisJCQkgKiBSZW1lbWJlciBhIGJsb2NrIHdlIHNlZSB0aGF0J3MgbWlzc2luZy4KKwkJCSAqLworCQkJaWYgKElOVF9HRVQoYmVzdHNwW2ldLCBBUkNIX0NPTlZFUlQpID09IE5VTExEQVRBT0ZGICYmIHVzZV9ibG9jayA9PSAtMSkKKwkJCQl1c2VfYmxvY2sgPSBpOworCQkJZWxzZSBpZiAoSU5UX0dFVChiZXN0c3BbaV0sIEFSQ0hfQ09OVkVSVCkgPj0gbGVuZ3RoKSB7CisJCQkJdXNlX2Jsb2NrID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwkvKgorCSAqIEhvdyBtYW55IGJ5dGVzIGRvIHdlIG5lZWQgaW4gdGhlIGxlYWYgYmxvY2s/CisJICovCisJbmVlZGJ5dGVzID0KKwkJKGxlYWYtPmhkci5zdGFsZSA/IDAgOiAodWludClzaXplb2YobGVhZi0+ZW50c1swXSkpICsKKwkJKHVzZV9ibG9jayAhPSAtMSA/IDAgOiAodWludClzaXplb2YobGVhZi0+YmVzdHNbMF0pKTsKKwkvKgorCSAqIE5vdyBraWxsIHVzZV9ibG9jayBpZiBpdCByZWZlcnMgdG8gYSBtaXNzaW5nIGJsb2NrLCBzbyB3ZQorCSAqIGNhbiB1c2UgaXQgYXMgYW4gaW5kaWNhdGlvbiBvZiBhbGxvY2F0aW9uIG5lZWRlZC4KKwkgKi8KKwlpZiAodXNlX2Jsb2NrICE9IC0xICYmIElOVF9HRVQoYmVzdHNwW3VzZV9ibG9ja10sIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTERBVEFPRkYpCisJCXVzZV9ibG9jayA9IC0xOworCS8qCisJICogSWYgd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggZnJlZSBieXRlcyBidXQgd2UgY2FuIG1ha2UgZW5vdWdoCisJICogYnkgY29tcGFjdGluZyBvdXQgc3RhbGUgZW50cmllcywgd2UnbGwgZG8gdGhhdC4KKwkgKi8KKwlpZiAoKGNoYXIgKiliZXN0c3AgLSAoY2hhciAqKSZsZWFmLT5lbnRzW0lOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpXSA8IG5lZWRieXRlcyAmJgorCSAgICBJTlRfR0VUKGxlYWYtPmhkci5zdGFsZSwgQVJDSF9DT05WRVJUKSA+IDEpIHsKKwkJY29tcGFjdCA9IDE7CisJfQorCS8qCisJICogT3RoZXJ3aXNlIGlmIHdlIGRvbid0IGhhdmUgZW5vdWdoIGZyZWUgYnl0ZXMgd2UgbmVlZCB0bworCSAqIGNvbnZlcnQgdG8gbm9kZSBmb3JtLgorCSAqLworCWVsc2UgaWYgKChjaGFyICopYmVzdHNwIC0gKGNoYXIgKikmbGVhZi0+ZW50c1tJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKV0gPAorCQkgbmVlZGJ5dGVzKSB7CisJCS8qCisJCSAqIEp1c3QgY2hlY2tpbmcgb3Igbm8gc3BhY2UgcmVzZXJ2YXRpb24sIGdpdmUgdXAuCisJCSAqLworCQlpZiAoYXJncy0+anVzdGNoZWNrIHx8IGFyZ3MtPnRvdGFsID09IDApIHsKKwkJCXhmc19kYV9icmVsc2UodHAsIGxicCk7CisJCQlyZXR1cm4gWEZTX0VSUk9SKEVOT1NQQyk7CisJCX0KKwkJLyoKKwkJICogQ29udmVydCB0byBub2RlIGZvcm0uCisJCSAqLworCQllcnJvciA9IHhmc19kaXIyX2xlYWZfdG9fbm9kZShhcmdzLCBsYnApOworCQl4ZnNfZGFfYnVmX2RvbmUobGJwKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOworCQkvKgorCQkgKiBUaGVuIGFkZCB0aGUgbmV3IGVudHJ5LgorCQkgKi8KKwkJcmV0dXJuIHhmc19kaXIyX25vZGVfYWRkbmFtZShhcmdzKTsKKwl9CisJLyoKKwkgKiBPdGhlcndpc2UgaXQgd2lsbCBmaXQgd2l0aG91dCBjb21wYWN0aW9uLgorCSAqLworCWVsc2UKKwkJY29tcGFjdCA9IDA7CisJLyoKKwkgKiBJZiBqdXN0IGNoZWNraW5nLCB0aGVuIGl0IHdpbGwgZml0IHVubGVzcyB3ZSBuZWVkZWQgdG8gYWxsb2NhdGUKKwkgKiBhIG5ldyBkYXRhIGJsb2NrLgorCSAqLworCWlmIChhcmdzLT5qdXN0Y2hlY2spIHsKKwkJeGZzX2RhX2JyZWxzZSh0cCwgbGJwKTsKKwkJcmV0dXJuIHVzZV9ibG9jayA9PSAtMSA/IFhGU19FUlJPUihFTk9TUEMpIDogMDsKKwl9CisJLyoKKwkgKiBJZiBubyBhbGxvY2F0aW9ucyBhcmUgYWxsb3dlZCwgcmV0dXJuIG5vdyBiZWZvcmUgd2UndmUKKwkgKiBjaGFuZ2VkIGFueXRoaW5nLgorCSAqLworCWlmIChhcmdzLT50b3RhbCA9PSAwICYmIHVzZV9ibG9jayA9PSAtMSkgeworCQl4ZnNfZGFfYnJlbHNlKHRwLCBsYnApOworCQlyZXR1cm4gWEZTX0VSUk9SKEVOT1NQQyk7CisJfQorCS8qCisJICogTmVlZCB0byBjb21wYWN0IHRoZSBsZWFmIGVudHJpZXMsIHJlbW92aW5nIHN0YWxlIG9uZXMuCisJICogTGVhdmUgb25lIHN0YWxlIGVudHJ5IGJlaGluZCAtIHRoZSBvbmUgY2xvc2VzdCB0byBvdXIKKwkgKiBpbnNlcnRpb24gaW5kZXggLSBhbmQgd2UnbGwgc2hpZnQgdGhhdCBvbmUgdG8gb3VyIGluc2VydGlvbgorCSAqIHBvaW50IGxhdGVyLgorCSAqLworCWlmIChjb21wYWN0KSB7CisJCXhmc19kaXIyX2xlYWZfY29tcGFjdF94MShsYnAsICZpbmRleCwgJmxvd3N0YWxlLCAmaGlnaHN0YWxlLAorCQkJJmxmbG9nbG93LCAmbGZsb2doaWdoKTsKKwl9CisJLyoKKwkgKiBUaGVyZSBhcmUgc3RhbGUgZW50cmllcywgc28gd2UnbGwgbmVlZCBsb2ctbG93IGFuZCBsb2ctaGlnaAorCSAqIGltcG9zc2libHkgYmFkIHZhbHVlcyBsYXRlci4KKwkgKi8KKwllbHNlIGlmIChJTlRfR0VUKGxlYWYtPmhkci5zdGFsZSwgQVJDSF9DT05WRVJUKSkgeworCQlsZmxvZ2xvdyA9IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOworCQlsZmxvZ2hpZ2ggPSAtMTsKKwl9CisJLyoKKwkgKiBJZiB0aGVyZSB3YXMgbm8gZGF0YSBibG9jayBzcGFjZSBmb3VuZCwgd2UgbmVlZCB0byBhbGxvY2F0ZQorCSAqIGEgbmV3IG9uZS4KKwkgKi8KKwlpZiAodXNlX2Jsb2NrID09IC0xKSB7CisJCS8qCisJCSAqIEFkZCB0aGUgbmV3IGRhdGEgYmxvY2suCisJCSAqLworCQlpZiAoKGVycm9yID0geGZzX2RpcjJfZ3Jvd19pbm9kZShhcmdzLCBYRlNfRElSMl9EQVRBX1NQQUNFLAorCQkJCSZ1c2VfYmxvY2spKSkgeworCQkJeGZzX2RhX2JyZWxzZSh0cCwgbGJwKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQkvKgorCQkgKiBJbml0aWFsaXplIHRoZSBibG9jay4KKwkJICovCisJCWlmICgoZXJyb3IgPSB4ZnNfZGlyMl9kYXRhX2luaXQoYXJncywgdXNlX2Jsb2NrLCAmZGJwKSkpIHsKKwkJCXhmc19kYV9icmVsc2UodHAsIGxicCk7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJLyoKKwkJICogSWYgd2UncmUgYWRkaW5nIGEgbmV3IGRhdGEgYmxvY2sgb24gdGhlIGVuZCB3ZSBuZWVkIHRvCisJCSAqIGV4dGVuZCB0aGUgYmVzdHMgdGFibGUuICBDb3B5IGl0IHVwIG9uZSBlbnRyeS4KKwkJICovCisJCWlmICh1c2VfYmxvY2sgPj0gSU5UX0dFVChsdHAtPmJlc3Rjb3VudCwgQVJDSF9DT05WRVJUKSkgeworCQkJYmVzdHNwLS07CisJCQltZW1tb3ZlKCZiZXN0c3BbMF0sICZiZXN0c3BbMV0sCisJCQkJSU5UX0dFVChsdHAtPmJlc3Rjb3VudCwgQVJDSF9DT05WRVJUKSAqIHNpemVvZihiZXN0c3BbMF0pKTsKKwkJCUlOVF9NT0QobHRwLT5iZXN0Y291bnQsIEFSQ0hfQ09OVkVSVCwgKzEpOworCQkJeGZzX2RpcjJfbGVhZl9sb2dfdGFpbCh0cCwgbGJwKTsKKwkJCXhmc19kaXIyX2xlYWZfbG9nX2Jlc3RzKHRwLCBsYnAsIDAsIElOVF9HRVQobHRwLT5iZXN0Y291bnQsIEFSQ0hfQ09OVkVSVCkgLSAxKTsKKwkJfQorCQkvKgorCQkgKiBJZiB3ZSdyZSBmaWxsaW5nIGluIGEgcHJldmlvdXNseSBlbXB0eSBibG9jayBqdXN0IGxvZyBpdC4KKwkJICovCisJCWVsc2UKKwkJCXhmc19kaXIyX2xlYWZfbG9nX2Jlc3RzKHRwLCBsYnAsIHVzZV9ibG9jaywgdXNlX2Jsb2NrKTsKKwkJZGF0YSA9IGRicC0+ZGF0YTsKKwkJSU5UX0NPUFkoYmVzdHNwW3VzZV9ibG9ja10sIGRhdGEtPmhkci5iZXN0ZnJlZVswXS5sZW5ndGgsIEFSQ0hfQ09OVkVSVCk7CisJCWdyb3duID0gMTsKKwl9CisJLyoKKwkgKiBBbHJlYWR5IGhhZCBzcGFjZSBpbiBzb21lIGRhdGEgYmxvY2suCisJICogSnVzdCByZWFkIHRoYXQgb25lIGluLgorCSAqLworCWVsc2UgeworCQlpZiAoKGVycm9yID0KKwkJICAgIHhmc19kYV9yZWFkX2J1Zih0cCwgZHAsIFhGU19ESVIyX0RCX1RPX0RBKG1wLCB1c2VfYmxvY2spLAorCQkJICAgIC0xLCAmZGJwLCBYRlNfREFUQV9GT1JLKSkpIHsKKwkJCXhmc19kYV9icmVsc2UodHAsIGxicCk7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJZGF0YSA9IGRicC0+ZGF0YTsKKwkJZ3Jvd24gPSAwOworCX0KKwl4ZnNfZGlyMl9kYXRhX2NoZWNrKGRwLCBkYnApOworCS8qCisJICogUG9pbnQgdG8gdGhlIGJpZ2dlc3QgZnJlZXNwYWNlIGluIG91ciBkYXRhIGJsb2NrLgorCSAqLworCWR1cCA9ICh4ZnNfZGlyMl9kYXRhX3VudXNlZF90ICopCisJICAgICAgKChjaGFyICopZGF0YSArIElOVF9HRVQoZGF0YS0+aGRyLmJlc3RmcmVlWzBdLm9mZnNldCwgQVJDSF9DT05WRVJUKSk7CisJQVNTRVJUKElOVF9HRVQoZHVwLT5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkgPj0gbGVuZ3RoKTsKKwluZWVkc2NhbiA9IG5lZWRsb2cgPSAwOworCS8qCisJICogTWFyayB0aGUgaW5pdGlhbCBwYXJ0IG9mIG91ciBmcmVlc3BhY2UgaW4gdXNlIGZvciB0aGUgbmV3IGVudHJ5LgorCSAqLworCXhmc19kaXIyX2RhdGFfdXNlX2ZyZWUodHAsIGRicCwgZHVwLAorCQkoeGZzX2RpcjJfZGF0YV9hb2ZmX3QpKChjaGFyICopZHVwIC0gKGNoYXIgKilkYXRhKSwgbGVuZ3RoLAorCQkmbmVlZGxvZywgJm5lZWRzY2FuKTsKKwkvKgorCSAqIEluaXRpYWxpemUgb3VyIG5ldyBlbnRyeSAoYXQgbGFzdCkuCisJICovCisJZGVwID0gKHhmc19kaXIyX2RhdGFfZW50cnlfdCAqKWR1cDsKKwlJTlRfU0VUKGRlcC0+aW51bWJlciwgQVJDSF9DT05WRVJULCBhcmdzLT5pbnVtYmVyKTsKKwlkZXAtPm5hbWVsZW4gPSBhcmdzLT5uYW1lbGVuOworCW1lbWNweShkZXAtPm5hbWUsIGFyZ3MtPm5hbWUsIGRlcC0+bmFtZWxlbik7CisJdGFncCA9IFhGU19ESVIyX0RBVEFfRU5UUllfVEFHX1AoZGVwKTsKKwlJTlRfU0VUKCp0YWdwLCBBUkNIX0NPTlZFUlQsICh4ZnNfZGlyMl9kYXRhX29mZl90KSgoY2hhciAqKWRlcCAtIChjaGFyICopZGF0YSkpOworCS8qCisJICogTmVlZCB0byBzY2FuIGZpeCB1cCB0aGUgYmVzdGZyZWUgdGFibGUuCisJICovCisJaWYgKG5lZWRzY2FuKQorCQl4ZnNfZGlyMl9kYXRhX2ZyZWVzY2FuKG1wLCBkYXRhLCAmbmVlZGxvZywgTlVMTCk7CisJLyoKKwkgKiBOZWVkIHRvIGxvZyB0aGUgZGF0YSBibG9jaydzIGhlYWRlci4KKwkgKi8KKwlpZiAobmVlZGxvZykKKwkJeGZzX2RpcjJfZGF0YV9sb2dfaGVhZGVyKHRwLCBkYnApOworCXhmc19kaXIyX2RhdGFfbG9nX2VudHJ5KHRwLCBkYnAsIGRlcCk7CisJLyoKKwkgKiBJZiB0aGUgYmVzdHMgdGFibGUgbmVlZHMgdG8gYmUgY2hhbmdlZCwgZG8gaXQuCisJICogTG9nIHRoZSBjaGFuZ2UgdW5sZXNzIHdlJ3ZlIGFscmVhZHkgZG9uZSB0aGF0LgorCSAqLworCWlmIChJTlRfR0VUKGJlc3RzcFt1c2VfYmxvY2tdLCBBUkNIX0NPTlZFUlQpICE9IElOVF9HRVQoZGF0YS0+aGRyLmJlc3RmcmVlWzBdLmxlbmd0aCwgQVJDSF9DT05WRVJUKSkgeworCQlJTlRfQ09QWShiZXN0c3BbdXNlX2Jsb2NrXSwgZGF0YS0+aGRyLmJlc3RmcmVlWzBdLmxlbmd0aCwgQVJDSF9DT05WRVJUKTsKKwkJaWYgKCFncm93bikKKwkJCXhmc19kaXIyX2xlYWZfbG9nX2Jlc3RzKHRwLCBsYnAsIHVzZV9ibG9jaywgdXNlX2Jsb2NrKTsKKwl9CisJLyoKKwkgKiBOb3cgd2UgbmVlZCB0byBtYWtlIHJvb20gdG8gaW5zZXJ0IHRoZSBsZWFmIGVudHJ5LgorCSAqIElmIHRoZXJlIGFyZSBubyBzdGFsZSBlbnRyaWVzLCB3ZSBqdXN0IGluc2VydCBhIGhvbGUgYXQgaW5kZXguCisJICovCisJaWYgKCFsZWFmLT5oZHIuc3RhbGUpIHsKKwkJLyoKKwkJICogbGVwIGlzIHN0aWxsIGdvb2QgYXMgdGhlIGluZGV4IGxlYWYgZW50cnkuCisJCSAqLworCQlpZiAoaW5kZXggPCBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSkKKwkJCW1lbW1vdmUobGVwICsgMSwgbGVwLAorCQkJCShJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAtIGluZGV4KSAqIHNpemVvZigqbGVwKSk7CisJCS8qCisJCSAqIFJlY29yZCBsb3cgYW5kIGhpZ2ggbG9nZ2luZyBpbmRpY2VzIGZvciB0aGUgbGVhZi4KKwkJICovCisJCWxmbG9nbG93ID0gaW5kZXg7CisJCWxmbG9naGlnaCA9IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOworCQlJTlRfTU9EKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJULCArMSk7CisJfQorCS8qCisJICogVGhlcmUgYXJlIHN0YWxlIGVudHJpZXMuCisJICogV2Ugd2lsbCB1c2Ugb25lIG9mIHRoZW0gZm9yIHRoZSBuZXcgZW50cnkuCisJICogSXQncyBwcm9iYWJseSBub3QgYXQgdGhlIHJpZ2h0IGxvY2F0aW9uLCBzbyB3ZSdsbCBoYXZlIHRvCisJICogc2hpZnQgc29tZSB1cCBvciBkb3duIGZpcnN0LgorCSAqLworCWVsc2UgeworCQkvKgorCQkgKiBJZiB3ZSBkaWRuJ3QgY29tcGFjdCBiZWZvcmUsIHdlIG5lZWQgdG8gZmluZCB0aGUgbmVhcmVzdAorCQkgKiBzdGFsZSBlbnRyaWVzIGJlZm9yZSBhbmQgYWZ0ZXIgb3VyIGluc2VydGlvbiBwb2ludC4KKwkJICovCisJCWlmIChjb21wYWN0ID09IDApIHsKKwkJCS8qCisJCQkgKiBGaW5kIHRoZSBmaXJzdCBzdGFsZSBlbnRyeSBiZWZvcmUgdGhlIGluc2VydGlvbgorCQkJICogcG9pbnQsIGlmIGFueS4KKwkJCSAqLworCQkJZm9yIChsb3dzdGFsZSA9IGluZGV4IC0gMTsKKwkJCSAgICAgbG93c3RhbGUgPj0gMCAmJgorCQkJCUlOVF9HRVQobGVhZi0+ZW50c1tsb3dzdGFsZV0uYWRkcmVzcywgQVJDSF9DT05WRVJUKSAhPQorCQkJCVhGU19ESVIyX05VTExfREFUQVBUUjsKKwkJCSAgICAgbG93c3RhbGUtLSkKKwkJCQljb250aW51ZTsKKwkJCS8qCisJCQkgKiBGaW5kIHRoZSBuZXh0IHN0YWxlIGVudHJ5IGF0IG9yIGFmdGVyIHRoZSBpbnNlcnRpb24KKwkJCSAqIHBvaW50LCBpZiBhbnkuICAgU3RvcCBpZiB3ZSBnbyBzbyBmYXIgdGhhdCB0aGUKKwkJCSAqIGxvd3N0YWxlIGVudHJ5IHdvdWxkIGJlIGJldHRlci4KKwkJCSAqLworCQkJZm9yIChoaWdoc3RhbGUgPSBpbmRleDsKKwkJCSAgICAgaGlnaHN0YWxlIDwgSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgJiYKKwkJCQlJTlRfR0VUKGxlYWYtPmVudHNbaGlnaHN0YWxlXS5hZGRyZXNzLCBBUkNIX0NPTlZFUlQpICE9CisJCQkJWEZTX0RJUjJfTlVMTF9EQVRBUFRSICYmCisJCQkJKGxvd3N0YWxlIDwgMCB8fAorCQkJCSBpbmRleCAtIGxvd3N0YWxlIC0gMSA+PSBoaWdoc3RhbGUgLSBpbmRleCk7CisJCQkgICAgIGhpZ2hzdGFsZSsrKQorCQkJCWNvbnRpbnVlOworCQl9CisJCS8qCisJCSAqIElmIHRoZSBsb3cgb25lIGlzIGJldHRlciwgdXNlIGl0LgorCQkgKi8KKwkJaWYgKGxvd3N0YWxlID49IDAgJiYKKwkJICAgIChoaWdoc3RhbGUgPT0gSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgfHwKKwkJICAgICBpbmRleCAtIGxvd3N0YWxlIC0gMSA8IGhpZ2hzdGFsZSAtIGluZGV4KSkgeworCQkJQVNTRVJUKGluZGV4IC0gbG93c3RhbGUgLSAxID49IDApOworCQkJQVNTRVJUKElOVF9HRVQobGVhZi0+ZW50c1tsb3dzdGFsZV0uYWRkcmVzcywgQVJDSF9DT05WRVJUKSA9PQorCQkJICAgICAgIFhGU19ESVIyX05VTExfREFUQVBUUik7CisJCQkvKgorCQkJICogQ29weSBlbnRyaWVzIHVwIHRvIGNvdmVyIHRoZSBzdGFsZSBlbnRyeQorCQkJICogYW5kIG1ha2Ugcm9vbSBmb3IgdGhlIG5ldyBlbnRyeS4KKwkJCSAqLworCQkJaWYgKGluZGV4IC0gbG93c3RhbGUgLSAxID4gMCkKKwkJCQltZW1tb3ZlKCZsZWFmLT5lbnRzW2xvd3N0YWxlXSwKKwkJCQkJJmxlYWYtPmVudHNbbG93c3RhbGUgKyAxXSwKKwkJCQkJKGluZGV4IC0gbG93c3RhbGUgLSAxKSAqIHNpemVvZigqbGVwKSk7CisJCQlsZXAgPSAmbGVhZi0+ZW50c1tpbmRleCAtIDFdOworCQkJbGZsb2dsb3cgPSBNSU4obG93c3RhbGUsIGxmbG9nbG93KTsKKwkJCWxmbG9naGlnaCA9IE1BWChpbmRleCAtIDEsIGxmbG9naGlnaCk7CisJCX0KKwkJLyoKKwkJICogVGhlIGhpZ2ggb25lIGlzIGJldHRlciwgc28gdXNlIHRoYXQgb25lLgorCQkgKi8KKwkJZWxzZSB7CisJCQlBU1NFUlQoaGlnaHN0YWxlIC0gaW5kZXggPj0gMCk7CisJCQlBU1NFUlQoSU5UX0dFVChsZWFmLT5lbnRzW2hpZ2hzdGFsZV0uYWRkcmVzcywgQVJDSF9DT05WRVJUKSA9PQorCQkJICAgICAgIFhGU19ESVIyX05VTExfREFUQVBUUik7CisJCQkvKgorCQkJICogQ29weSBlbnRyaWVzIGRvd24gdG8gY29wdmVyIHRoZSBzdGFsZSBlbnRyeQorCQkJICogYW5kIG1ha2Ugcm9vbSBmb3IgdGhlIG5ldyBlbnRyeS4KKwkJCSAqLworCQkJaWYgKGhpZ2hzdGFsZSAtIGluZGV4ID4gMCkKKwkJCQltZW1tb3ZlKCZsZWFmLT5lbnRzW2luZGV4ICsgMV0sCisJCQkJCSZsZWFmLT5lbnRzW2luZGV4XSwKKwkJCQkJKGhpZ2hzdGFsZSAtIGluZGV4KSAqIHNpemVvZigqbGVwKSk7CisJCQlsZXAgPSAmbGVhZi0+ZW50c1tpbmRleF07CisJCQlsZmxvZ2xvdyA9IE1JTihpbmRleCwgbGZsb2dsb3cpOworCQkJbGZsb2doaWdoID0gTUFYKGhpZ2hzdGFsZSwgbGZsb2doaWdoKTsKKwkJfQorCQlJTlRfTU9EKGxlYWYtPmhkci5zdGFsZSwgQVJDSF9DT05WRVJULCAtMSk7CisJfQorCS8qCisJICogRmlsbCBpbiB0aGUgbmV3IGxlYWYgZW50cnkuCisJICovCisJSU5UX1NFVChsZXAtPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCwgYXJncy0+aGFzaHZhbCk7CisJSU5UX1NFVChsZXAtPmFkZHJlc3MsIEFSQ0hfQ09OVkVSVCwgWEZTX0RJUjJfREJfT0ZGX1RPX0RBVEFQVFIobXAsIHVzZV9ibG9jaywgSU5UX0dFVCgqdGFncCwgQVJDSF9DT05WRVJUKSkpOworCS8qCisJICogTG9nIHRoZSBsZWFmIGZpZWxkcyBhbmQgZ2l2ZSB1cCB0aGUgYnVmZmVycy4KKwkgKi8KKwl4ZnNfZGlyMl9sZWFmX2xvZ19oZWFkZXIodHAsIGxicCk7CisJeGZzX2RpcjJfbGVhZl9sb2dfZW50cyh0cCwgbGJwLCBsZmxvZ2xvdywgbGZsb2doaWdoKTsKKwl4ZnNfZGlyMl9sZWFmX2NoZWNrKGRwLCBsYnApOworCXhmc19kYV9idWZfZG9uZShsYnApOworCXhmc19kaXIyX2RhdGFfY2hlY2soZHAsIGRicCk7CisJeGZzX2RhX2J1Zl9kb25lKGRicCk7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBERUJVRworLyoKKyAqIENoZWNrIHRoZSBpbnRlcm5hbCBjb25zaXN0ZW5jeSBvZiBhIGxlYWYxIGJsb2NrLgorICogUG9wIGFuIGFzc2VydCBpZiBzb21ldGhpbmcgaXMgd3JvbmcuCisgKi8KK3ZvaWQKK3hmc19kaXIyX2xlYWZfY2hlY2soCisJeGZzX2lub2RlX3QJCSpkcCwJCS8qIGluY29yZSBkaXJlY3RvcnkgaW5vZGUgKi8KKwl4ZnNfZGFidWZfdAkJKmJwKQkJLyogbGVhZidzIGJ1ZmZlciAqLworeworCWludAkJCWk7CQkvKiBsZWFmIGluZGV4ICovCisJeGZzX2RpcjJfbGVhZl90CQkqbGVhZjsJCS8qIGxlYWYgc3RydWN0dXJlICovCisJeGZzX2RpcjJfbGVhZl90YWlsX3QJKmx0cDsJCS8qIGxlYWYgdGFpbCBwb2ludGVyICovCisJeGZzX21vdW50X3QJCSptcDsJCS8qIGZpbGVzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwlpbnQJCQlzdGFsZTsJCS8qIGNvdW50IG9mIHN0YWxlIGxlYXZlcyAqLworCisJbGVhZiA9IGJwLT5kYXRhOworCW1wID0gZHAtPmlfbW91bnQ7CisJQVNTRVJUKElOVF9HRVQobGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfTEVBRjFfTUFHSUMpOworCS8qCisJICogVGhpcyB2YWx1ZSBpcyBub3QgcmVzdHJpY3RpdmUgZW5vdWdoLgorCSAqIFNob3VsZCBmYWN0b3IgaW4gdGhlIHNpemUgb2YgdGhlIGJlc3RzIHRhYmxlIGFzIHdlbGwuCisJICogV2UgY2FuIGRlZHVjZSBhIHZhbHVlIGZvciB0aGF0IGZyb20gZGlfc2l6ZS4KKwkgKi8KKwlBU1NFUlQoSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgPD0gWEZTX0RJUjJfTUFYX0xFQUZfRU5UUyhtcCkpOworCWx0cCA9IFhGU19ESVIyX0xFQUZfVEFJTF9QKG1wLCBsZWFmKTsKKwkvKgorCSAqIExlYXZlcyBhbmQgYmVzdHMgZG9uJ3Qgb3ZlcmxhcC4KKwkgKi8KKwlBU1NFUlQoKGNoYXIgKikmbGVhZi0+ZW50c1tJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKV0gPD0KKwkgICAgICAgKGNoYXIgKilYRlNfRElSMl9MRUFGX0JFU1RTX1AobHRwKSk7CisJLyoKKwkgKiBDaGVjayBoYXNoIHZhbHVlIG9yZGVyLCBjb3VudCBzdGFsZSBlbnRyaWVzLgorCSAqLworCWZvciAoaSA9IHN0YWxlID0gMDsgaSA8IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOyBpKyspIHsKKwkJaWYgKGkgKyAxIDwgSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkpCisJCQlBU1NFUlQoSU5UX0dFVChsZWFmLT5lbnRzW2ldLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkgPD0KKwkJCSAgICAgICBJTlRfR0VUKGxlYWYtPmVudHNbaSArIDFdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkpOworCQlpZiAoSU5UX0dFVChsZWFmLT5lbnRzW2ldLmFkZHJlc3MsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfTlVMTF9EQVRBUFRSKQorCQkJc3RhbGUrKzsKKwl9CisJQVNTRVJUKElOVF9HRVQobGVhZi0+aGRyLnN0YWxlLCBBUkNIX0NPTlZFUlQpID09IHN0YWxlKTsKK30KKyNlbmRpZgkvKiBERUJVRyAqLworCisvKgorICogQ29tcGFjdCBvdXQgYW55IHN0YWxlIGVudHJpZXMgaW4gdGhlIGxlYWYuCisgKiBMb2cgdGhlIGhlYWRlciBhbmQgY2hhbmdlZCBsZWFmIGVudHJpZXMsIGlmIGFueS4KKyAqLwordm9pZAoreGZzX2RpcjJfbGVhZl9jb21wYWN0KAorCXhmc19kYV9hcmdzX3QJKmFyZ3MsCQkvKiBvcGVyYXRpb24gYXJndW1lbnRzICovCisJeGZzX2RhYnVmX3QJKmJwKQkJLyogbGVhZiBidWZmZXIgKi8KK3sKKwlpbnQJCWZyb207CQkvKiBzb3VyY2UgbGVhZiBpbmRleCAqLworCXhmc19kaXIyX2xlYWZfdAkqbGVhZjsJCS8qIGxlYWYgc3RydWN0dXJlICovCisJaW50CQlsb2dsb3c7CQkvKiBmaXJzdCBsZWFmIGVudHJ5IHRvIGxvZyAqLworCWludAkJdG87CQkvKiB0YXJnZXQgbGVhZiBpbmRleCAqLworCisJbGVhZiA9IGJwLT5kYXRhOworCWlmICghbGVhZi0+aGRyLnN0YWxlKSB7CisJCXJldHVybjsKKwl9CisJLyoKKwkgKiBDb21wcmVzcyBvdXQgdGhlIHN0YWxlIGVudHJpZXMgaW4gcGxhY2UuCisJICovCisJZm9yIChmcm9tID0gdG8gPSAwLCBsb2dsb3cgPSAtMTsgZnJvbSA8IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOyBmcm9tKyspIHsKKwkJaWYgKElOVF9HRVQobGVhZi0+ZW50c1tmcm9tXS5hZGRyZXNzLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX05VTExfREFUQVBUUikKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBPbmx5IGFjdHVhbGx5IGNvcHkgdGhlIGVudHJpZXMgdGhhdCBhcmUgZGlmZmVyZW50LgorCQkgKi8KKwkJaWYgKGZyb20gPiB0bykgeworCQkJaWYgKGxvZ2xvdyA9PSAtMSkKKwkJCQlsb2dsb3cgPSB0bzsKKwkJCWxlYWYtPmVudHNbdG9dID0gbGVhZi0+ZW50c1tmcm9tXTsKKwkJfQorCQl0bysrOworCX0KKwkvKgorCSAqIFVwZGF0ZSBhbmQgbG9nIHRoZSBoZWFkZXIsIGxvZyB0aGUgbGVhZiBlbnRyaWVzLgorCSAqLworCUFTU0VSVChJTlRfR0VUKGxlYWYtPmhkci5zdGFsZSwgQVJDSF9DT05WRVJUKSA9PSBmcm9tIC0gdG8pOworCUlOVF9NT0QobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQsIC0oSU5UX0dFVChsZWFmLT5oZHIuc3RhbGUsIEFSQ0hfQ09OVkVSVCkpKTsKKwlsZWFmLT5oZHIuc3RhbGUgPSAwOworCXhmc19kaXIyX2xlYWZfbG9nX2hlYWRlcihhcmdzLT50cmFucywgYnApOworCWlmIChsb2dsb3cgIT0gLTEpCisJCXhmc19kaXIyX2xlYWZfbG9nX2VudHMoYXJncy0+dHJhbnMsIGJwLCBsb2dsb3csIHRvIC0gMSk7Cit9CisKKy8qCisgKiBDb21wYWN0IHRoZSBsZWFmIGVudHJpZXMsIHJlbW92aW5nIHN0YWxlIG9uZXMuCisgKiBMZWF2ZSBvbmUgc3RhbGUgZW50cnkgYmVoaW5kIC0gdGhlIG9uZSBjbG9zZXN0IHRvIG91cgorICogaW5zZXJ0aW9uIGluZGV4IC0gYW5kIHRoZSBjYWxsZXIgd2lsbCBzaGlmdCB0aGF0IG9uZSB0byBvdXIgaW5zZXJ0aW9uCisgKiBwb2ludCBsYXRlci4KKyAqIFJldHVybiBuZXcgaW5zZXJ0aW9uIGluZGV4LCB3aGVyZSB0aGUgcmVtYWluaW5nIHN0YWxlIGVudHJ5IGlzLAorICogYW5kIGxlYWYgbG9nZ2luZyBpbmRpY2VzLgorICovCit2b2lkCit4ZnNfZGlyMl9sZWFmX2NvbXBhY3RfeDEoCisJeGZzX2RhYnVmX3QJKmJwLAkJLyogbGVhZiBidWZmZXIgKi8KKwlpbnQJCSppbmRleHAsCS8qIGluc2VydGlvbiBpbmRleCAqLworCWludAkJKmxvd3N0YWxlcCwJLyogb3V0OiBzdGFsZSBlbnRyeSBiZWZvcmUgdXMgKi8KKwlpbnQJCSpoaWdoc3RhbGVwLAkvKiBvdXQ6IHN0YWxlIGVudHJ5IGFmdGVyIHVzICovCisJaW50CQkqbG93bG9ncCwJLyogb3V0OiBsb3cgbG9nIGluZGV4ICovCisJaW50CQkqaGlnaGxvZ3ApCS8qIG91dDogaGlnaCBsb2cgaW5kZXggKi8KK3sKKwlpbnQJCWZyb207CQkvKiBzb3VyY2UgY29weSBpbmRleCAqLworCWludAkJaGlnaHN0YWxlOwkvKiBzdGFsZSBlbnRyeSBhdC9hZnRlciBpbmRleCAqLworCWludAkJaW5kZXg7CQkvKiBpbnNlcnRpb24gaW5kZXggKi8KKwlpbnQJCWtlZXBzdGFsZTsJLyogc291cmNlIGluZGV4IG9mIGtlcHQgc3RhbGUgKi8KKwl4ZnNfZGlyMl9sZWFmX3QJKmxlYWY7CQkvKiBsZWFmIHN0cnVjdHVyZSAqLworCWludAkJbG93c3RhbGU7CS8qIHN0YWxlIGVudHJ5IGJlZm9yZSBpbmRleCAqLworCWludAkJbmV3aW5kZXg9MDsJLyogbmV3IGluc2VydGlvbiBpbmRleCAqLworCWludAkJdG87CQkvKiBkZXN0aW5hdGlvbiBjb3B5IGluZGV4ICovCisKKwlsZWFmID0gYnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQobGVhZi0+aGRyLnN0YWxlLCBBUkNIX0NPTlZFUlQpID4gMSk7CisJaW5kZXggPSAqaW5kZXhwOworCS8qCisJICogRmluZCB0aGUgZmlyc3Qgc3RhbGUgZW50cnkgYmVmb3JlIG91ciBpbmRleCwgaWYgYW55LgorCSAqLworCWZvciAobG93c3RhbGUgPSBpbmRleCAtIDE7CisJICAgICBsb3dzdGFsZSA+PSAwICYmCisJCUlOVF9HRVQobGVhZi0+ZW50c1tsb3dzdGFsZV0uYWRkcmVzcywgQVJDSF9DT05WRVJUKSAhPSBYRlNfRElSMl9OVUxMX0RBVEFQVFI7CisJICAgICBsb3dzdGFsZS0tKQorCQljb250aW51ZTsKKwkvKgorCSAqIEZpbmQgdGhlIGZpcnN0IHN0YWxlIGVudHJ5IGF0IG9yIGFmdGVyIG91ciBpbmRleCwgaWYgYW55LgorCSAqIFN0b3AgaWYgdGhlIGFuc3dlciB3b3VsZCBiZSB3b3JzZSB0aGFuIGxvd3N0YWxlLgorCSAqLworCWZvciAoaGlnaHN0YWxlID0gaW5kZXg7CisJICAgICBoaWdoc3RhbGUgPCBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAmJgorCQlJTlRfR0VUKGxlYWYtPmVudHNbaGlnaHN0YWxlXS5hZGRyZXNzLCBBUkNIX0NPTlZFUlQpICE9IFhGU19ESVIyX05VTExfREFUQVBUUiAmJgorCQkobG93c3RhbGUgPCAwIHx8IGluZGV4IC0gbG93c3RhbGUgPiBoaWdoc3RhbGUgLSBpbmRleCk7CisJICAgICBoaWdoc3RhbGUrKykKKwkJY29udGludWU7CisJLyoKKwkgKiBQaWNrIHRoZSBiZXR0ZXIgb2YgbG93c3RhbGUgYW5kIGhpZ2hzdGFsZS4KKwkgKi8KKwlpZiAobG93c3RhbGUgPj0gMCAmJgorCSAgICAoaGlnaHN0YWxlID09IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpIHx8CisJICAgICBpbmRleCAtIGxvd3N0YWxlIDw9IGhpZ2hzdGFsZSAtIGluZGV4KSkKKwkJa2VlcHN0YWxlID0gbG93c3RhbGU7CisJZWxzZQorCQlrZWVwc3RhbGUgPSBoaWdoc3RhbGU7CisJLyoKKwkgKiBDb3B5IHRoZSBlbnRyaWVzIGluIHBsYWNlLCByZW1vdmluZyBhbGwgdGhlIHN0YWxlIGVudHJpZXMKKwkgKiBleGNlcHQga2VlcHN0YWxlLgorCSAqLworCWZvciAoZnJvbSA9IHRvID0gMDsgZnJvbSA8IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOyBmcm9tKyspIHsKKwkJLyoKKwkJICogTm90aWNlIHRoZSBuZXcgdmFsdWUgb2YgaW5kZXguCisJCSAqLworCQlpZiAoaW5kZXggPT0gZnJvbSkKKwkJCW5ld2luZGV4ID0gdG87CisJCWlmIChmcm9tICE9IGtlZXBzdGFsZSAmJgorCQkgICAgSU5UX0dFVChsZWFmLT5lbnRzW2Zyb21dLmFkZHJlc3MsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfTlVMTF9EQVRBUFRSKSB7CisJCQlpZiAoZnJvbSA9PSB0bykKKwkJCQkqbG93bG9ncCA9IHRvOworCQkJY29udGludWU7CisJCX0KKwkJLyoKKwkJICogUmVjb3JkIHRoZSBuZXcga2VlcHN0YWxlIHZhbHVlIGZvciB0aGUgaW5zZXJ0aW9uLgorCQkgKi8KKwkJaWYgKGZyb20gPT0ga2VlcHN0YWxlKQorCQkJbG93c3RhbGUgPSBoaWdoc3RhbGUgPSB0bzsKKwkJLyoKKwkJICogQ29weSBvbmx5IHRoZSBlbnRyaWVzIHRoYXQgaGF2ZSBtb3ZlZC4KKwkJICovCisJCWlmIChmcm9tID4gdG8pCisJCQlsZWFmLT5lbnRzW3RvXSA9IGxlYWYtPmVudHNbZnJvbV07CisJCXRvKys7CisJfQorCUFTU0VSVChmcm9tID4gdG8pOworCS8qCisJICogSWYgdGhlIGluc2VydGlvbiBwb2ludCB3YXMgcGFzdCB0aGUgbGFzdCBlbnRyeSwKKwkgKiBzZXQgdGhlIG5ldyBpbnNlcnRpb24gcG9pbnQgYWNjb3JkaW5nbHkuCisJICovCisJaWYgKGluZGV4ID09IGZyb20pCisJCW5ld2luZGV4ID0gdG87CisJKmluZGV4cCA9IG5ld2luZGV4OworCS8qCisJICogQWRqdXN0IHRoZSBsZWFmIGhlYWRlciB2YWx1ZXMuCisJICovCisJSU5UX01PRChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCwgLShmcm9tIC0gdG8pKTsKKwlJTlRfU0VUKGxlYWYtPmhkci5zdGFsZSwgQVJDSF9DT05WRVJULCAxKTsKKwkvKgorCSAqIFJlbWVtYmVyIHRoZSBsb3cvaGlnaCBzdGFsZSB2YWx1ZSBvbmx5IGluIHRoZSAicmlnaHQiCisJICogZGlyZWN0aW9uLgorCSAqLworCWlmIChsb3dzdGFsZSA+PSBuZXdpbmRleCkKKwkJbG93c3RhbGUgPSAtMTsKKwllbHNlCisJCWhpZ2hzdGFsZSA9IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOworCSpoaWdobG9ncCA9IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpIC0gMTsKKwkqbG93c3RhbGVwID0gbG93c3RhbGU7CisJKmhpZ2hzdGFsZXAgPSBoaWdoc3RhbGU7Cit9CisKKy8qCisgKiBHZXRkZW50cyAocmVhZGRpcikgZm9yIGxlYWYgYW5kIG5vZGUgZGlyZWN0b3JpZXMuCisgKiBUaGlzIHJlYWRzIHRoZSBkYXRhIGJsb2NrcyBvbmx5LCBzbyBpcyB0aGUgc2FtZSBmb3IgYm90aCBmb3Jtcy4KKyAqLworaW50CQkJCQkJLyogZXJyb3IgKi8KK3hmc19kaXIyX2xlYWZfZ2V0ZGVudHMoCisJeGZzX3RyYW5zX3QJCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfaW5vZGVfdAkJKmRwLAkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLworCXVpb190CQkJKnVpbywJCS8qIEkvTyBjb250cm9sICYgdmVjdG9ycyAqLworCWludAkJCSplb2ZwLAkJLyogb3V0OiByZWFjaGVkIGVuZCBvZiBkaXIgKi8KKwl4ZnNfZGlyZW50X3QJCSpkYnAsCQkvKiBjYWxsZXIncyBidWZmZXIgKi8KKwl4ZnNfZGlyMl9wdXRfdAkJcHV0KQkJLyogQUJJIGZvcm1hdHRpbmcgcm91dGluZSAqLworeworCXhmc19kYWJ1Zl90CQkqYnA7CQkvKiBkYXRhIGJsb2NrIGJ1ZmZlciAqLworCWludAkJCWJ5dGVvZmY7CS8qIG9mZnNldCBpbiBjdXJyZW50IGJsb2NrICovCisJeGZzX2RpcjJfZGJfdAkJY3VyZGI7CQkvKiBkYiBmb3IgY3VycmVudCBibG9jayAqLworCXhmc19kaXIyX29mZl90CQljdXJvZmY7CQkvKiBjdXJyZW50IG92ZXJhbGwgb2Zmc2V0ICovCisJeGZzX2RpcjJfZGF0YV90CQkqZGF0YTsJCS8qIGRhdGEgYmxvY2sgc3RydWN0dXJlICovCisJeGZzX2RpcjJfZGF0YV9lbnRyeV90CSpkZXA7CQkvKiBkYXRhIGVudHJ5ICovCisJeGZzX2RpcjJfZGF0YV91bnVzZWRfdAkqZHVwOwkJLyogdW51c2VkIGVudHJ5ICovCisJaW50CQkJZW9mOwkJLyogcmVhY2hlZCBlbmQgb2YgZGlyZWN0b3J5ICovCisJaW50CQkJZXJyb3I9MDsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCWludAkJCWk7CQkvKiB0ZW1wb3JhcnkgbG9vcCBpbmRleCAqLworCWludAkJCWo7CQkvKiB0ZW1wb3JhcnkgbG9vcCBpbmRleCAqLworCWludAkJCWxlbmd0aDsJCS8qIHRlbXBvcmFyeSBsZW5ndGggdmFsdWUgKi8KKwl4ZnNfYm1idF9pcmVjX3QJCSptYXA7CQkvKiBtYXAgdmVjdG9yIGZvciBibG9ja3MgKi8KKwl4ZnNfZXh0bGVuX3QJCW1hcF9ibG9ja3M7CS8qIG51bWJlciBvZiBmc2JzIGluIG1hcCAqLworCXhmc19kYWJsa190CQltYXBfb2ZmOwkvKiBsYXN0IG1hcHBlZCBmaWxlIG9mZnNldCAqLworCWludAkJCW1hcF9zaXplOwkvKiB0b3RhbCBlbnRyaWVzIGluICptYXAgKi8KKwlpbnQJCQltYXBfdmFsaWQ7CS8qIHZhbGlkIGVudHJpZXMgaW4gKm1hcCAqLworCXhmc19tb3VudF90CQkqbXA7CQkvKiBmaWxlc3lzdGVtIG1vdW50IHBvaW50ICovCisJeGZzX2RpcjJfb2ZmX3QJCW5ld29mZjsJCS8qIG5ldyBjdXJvZmYgYWZ0ZXIgbmV3IGJsayAqLworCWludAkJCW5tYXA7CQkvKiBtYXBwaW5ncyB0byBhc2sgeGZzX2JtYXBpICovCisJeGZzX2RpcjJfcHV0X2FyZ3NfdAlwOwkJLyogZm9ybWF0dGluZyBhcmcgYnVuZGxlICovCisJY2hhcgkJCSpwdHI9TlVMTDsJCS8qIHBvaW50ZXIgdG8gY3VycmVudCBkYXRhICovCisJaW50CQkJcmFfY3VycmVudDsJLyogbnVtYmVyIG9mIHJlYWQtYWhlYWQgYmxrcyAqLworCWludAkJCXJhX2luZGV4OwkvKiAqbWFwIGluZGV4IGZvciByZWFkLWFoZWFkICovCisJaW50CQkJcmFfb2Zmc2V0OwkvKiBtYXAgZW50cnkgb2Zmc2V0IGZvciByYSAqLworCWludAkJCXJhX3dhbnQ7CS8qIHJlYWRhaGVhZCBjb3VudCB3YW50ZWQgKi8KKworCS8qCisJICogSWYgdGhlIG9mZnNldCBpcyBhdCBvciBwYXN0IHRoZSBsYXJnZXN0IGFsbG93ZWQgdmFsdWUsCisJICogZ2l2ZSB1cCByaWdodCBhd2F5LCByZXR1cm4gZW9mLgorCSAqLworCWlmICh1aW8tPnVpb19vZmZzZXQgPj0gWEZTX0RJUjJfTUFYX0RBVEFQVFIpIHsKKwkJKmVvZnAgPSAxOworCQlyZXR1cm4gMDsKKwl9CisJbXAgPSBkcC0+aV9tb3VudDsKKwkvKgorCSAqIFNldHVwIGZvcm1hdHRpbmcgYXJndW1lbnRzLgorCSAqLworCXAuZGJwID0gZGJwOworCXAucHV0ID0gcHV0OworCXAudWlvID0gdWlvOworCS8qCisJICogU2V0IHVwIHRvIGJtYXAgYSBudW1iZXIgb2YgYmxvY2tzIGJhc2VkIG9uIHRoZSBjYWxsZXIncworCSAqIGJ1ZmZlciBzaXplLCB0aGUgZGlyZWN0b3J5IGJsb2NrIHNpemUsIGFuZCB0aGUgZmlsZXN5c3RlbQorCSAqIGJsb2NrIHNpemUuCisJICovCisJbWFwX3NpemUgPQorCQlob3dtYW55KHVpby0+dWlvX3Jlc2lkICsgbXAtPm1fZGlyYmxrc2l6ZSwKKwkJCW1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSk7CisJbWFwID0ga21lbV9hbGxvYyhtYXBfc2l6ZSAqIHNpemVvZigqbWFwKSwgS01fU0xFRVApOworCW1hcF92YWxpZCA9IHJhX2luZGV4ID0gcmFfb2Zmc2V0ID0gcmFfY3VycmVudCA9IG1hcF9ibG9ja3MgPSAwOworCWJwID0gTlVMTDsKKwllb2YgPSAxOworCS8qCisJICogSW5zaWRlIHRoZSBsb29wIHdlIGtlZXAgdGhlIG1haW4gb2Zmc2V0IHZhbHVlIGFzIGEgYnl0ZSBvZmZzZXQKKwkgKiBpbiB0aGUgZGlyZWN0b3J5IGZpbGUuCisJICovCisJY3Vyb2ZmID0gWEZTX0RJUjJfREFUQVBUUl9UT19CWVRFKG1wLCB1aW8tPnVpb19vZmZzZXQpOworCS8qCisJICogRm9yY2UgdGhpcyBjb252ZXJzaW9uIHRocm91Z2ggZGIgc28gd2UgdHJ1bmNhdGUgdGhlIG9mZnNldAorCSAqIGRvd24gdG8gZ2V0IHRoZSBzdGFydCBvZiB0aGUgZGF0YSBibG9jay4KKwkgKi8KKwltYXBfb2ZmID0gWEZTX0RJUjJfREJfVE9fREEobXAsIFhGU19ESVIyX0JZVEVfVE9fREIobXAsIGN1cm9mZikpOworCS8qCisJICogTG9vcCBvdmVyIGRpcmVjdG9yeSBlbnRyaWVzIHVudGlsIHdlIHJlYWNoIHRoZSBlbmQgb2Zmc2V0LgorCSAqIEdldCBtb3JlIGJsb2NrcyBhbmQgcmVhZGFoZWFkIGFzIG5lY2Vzc2FyeS4KKwkgKi8KKwl3aGlsZSAoY3Vyb2ZmIDwgWEZTX0RJUjJfTEVBRl9PRkZTRVQpIHsKKwkJLyoKKwkJICogSWYgd2UgaGF2ZSBubyBidWZmZXIsIG9yIHdlJ3JlIG9mZiB0aGUgZW5kIG9mIHRoZQorCQkgKiBjdXJyZW50IGJ1ZmZlciwgbmVlZCB0byBnZXQgYW5vdGhlciBvbmUuCisJCSAqLworCQlpZiAoIWJwIHx8IHB0ciA+PSAoY2hhciAqKWJwLT5kYXRhICsgbXAtPm1fZGlyYmxrc2l6ZSkgeworCQkJLyoKKwkJCSAqIElmIHdlIGhhdmUgYSBidWZmZXIsIHdlIG5lZWQgdG8gcmVsZWFzZSBpdCBhbmQKKwkJCSAqIHRha2UgaXQgb3V0IG9mIHRoZSBtYXBwaW5nLgorCQkJICovCisJCQlpZiAoYnApIHsKKwkJCQl4ZnNfZGFfYnJlbHNlKHRwLCBicCk7CisJCQkJYnAgPSBOVUxMOworCQkJCW1hcF9ibG9ja3MgLT0gbXAtPm1fZGlyYmxrZnNiczsKKwkJCQkvKgorCQkJCSAqIExvb3AgdG8gZ2V0IHJpZCBvZiB0aGUgZXh0ZW50cyBmb3IgdGhlCisJCQkJICogZGlyZWN0b3J5IGJsb2NrLgorCQkJCSAqLworCQkJCWZvciAoaSA9IG1wLT5tX2RpcmJsa2ZzYnM7IGkgPiAwOyApIHsKKwkJCQkJaiA9IE1JTigoaW50KW1hcC0+YnJfYmxvY2tjb3VudCwgaSk7CisJCQkJCW1hcC0+YnJfYmxvY2tjb3VudCAtPSBqOworCQkJCQltYXAtPmJyX3N0YXJ0YmxvY2sgKz0gajsKKwkJCQkJbWFwLT5icl9zdGFydG9mZiArPSBqOworCQkJCQkvKgorCQkJCQkgKiBJZiBtYXBwaW5nIGlzIGRvbmUsIHBpdGNoIGl0IGZyb20KKwkJCQkJICogdGhlIHRhYmxlLgorCQkJCQkgKi8KKwkJCQkJaWYgKCFtYXAtPmJyX2Jsb2NrY291bnQgJiYgLS1tYXBfdmFsaWQpCisJCQkJCQltZW1tb3ZlKCZtYXBbMF0sICZtYXBbMV0sCisJCQkJCQkJc2l6ZW9mKG1hcFswXSkgKgorCQkJCQkJCW1hcF92YWxpZCk7CisJCQkJCWkgLT0gajsKKwkJCQl9CisJCQl9CisJCQkvKgorCQkJICogUmVjYWxjdWxhdGUgdGhlIHJlYWRhaGVhZCBibG9ja3Mgd2FudGVkLgorCQkJICovCisJCQlyYV93YW50ID0gaG93bWFueSh1aW8tPnVpb19yZXNpZCArIG1wLT5tX2RpcmJsa3NpemUsCisJCQkJCSAgbXAtPm1fc2Iuc2JfYmxvY2tzaXplKSAtIDE7CisJCQkvKgorCQkJICogSWYgd2UgZG9uJ3QgaGF2ZSBhcyBtYW55IGFzIHdlIHdhbnQsIGFuZCB3ZSBoYXZlbid0CisJCQkgKiBydW4gb3V0IG9mIGRhdGEgYmxvY2tzLCBnZXQgc29tZSBtb3JlIG1hcHBpbmdzLgorCQkJICovCisJCQlpZiAoMSArIHJhX3dhbnQgPiBtYXBfYmxvY2tzICYmCisJCQkgICAgbWFwX29mZiA8CisJCQkgICAgWEZTX0RJUjJfQllURV9UT19EQShtcCwgWEZTX0RJUjJfTEVBRl9PRkZTRVQpKSB7CisJCQkJLyoKKwkJCQkgKiBHZXQgbW9yZSBibWFwcywgZmlsbCBpbiBhZnRlciB0aGUgb25lcworCQkJCSAqIHdlIGFscmVhZHkgaGF2ZSBpbiB0aGUgdGFibGUuCisJCQkJICovCisJCQkJbm1hcCA9IG1hcF9zaXplIC0gbWFwX3ZhbGlkOworCQkJCWVycm9yID0geGZzX2JtYXBpKHRwLCBkcCwKKwkJCQkJbWFwX29mZiwKKwkJCQkJWEZTX0RJUjJfQllURV9UT19EQShtcCwKKwkJCQkJCVhGU19ESVIyX0xFQUZfT0ZGU0VUKSAtIG1hcF9vZmYsCisJCQkJCVhGU19CTUFQSV9NRVRBREFUQSwgTlVMTCwgMCwKKwkJCQkJJm1hcFttYXBfdmFsaWRdLCAmbm1hcCwgTlVMTCk7CisJCQkJLyoKKwkJCQkgKiBEb24ndCBrbm93IGlmIHdlIHNob3VsZCBpZ25vcmUgdGhpcyBvcgorCQkJCSAqIHRyeSB0byByZXR1cm4gYW4gZXJyb3IuCisJCQkJICogVGhlIHRyb3VibGUgd2l0aCByZXR1cm5pbmcgZXJyb3JzCisJCQkJICogaXMgdGhhdCByZWFkZGlyIHdpbGwganVzdCBzdG9wIHdpdGhvdXQKKwkJCQkgKiBhY3R1YWxseSBwYXNzaW5nIHRoZSBlcnJvciB0aHJvdWdoLgorCQkJCSAqLworCQkJCWlmIChlcnJvcikKKwkJCQkJYnJlYWs7CS8qIFhYWCAqLworCQkJCS8qCisJCQkJICogSWYgd2UgZ290IGFsbCB0aGUgbWFwcGluZ3Mgd2UgYXNrZWQgZm9yLAorCQkJCSAqIHNldCB0aGUgZmluYWwgbWFwIG9mZnNldCBiYXNlZCBvbiB0aGUKKwkJCQkgKiBsYXN0IGJtYXAgdmFsdWUgcmVjZWl2ZWQuCisJCQkJICogT3RoZXJ3aXNlLCB3ZSd2ZSByZWFjaGVkIHRoZSBlbmQuCisJCQkJICovCisJCQkJaWYgKG5tYXAgPT0gbWFwX3NpemUgLSBtYXBfdmFsaWQpCisJCQkJCW1hcF9vZmYgPQorCQkJCQltYXBbbWFwX3ZhbGlkICsgbm1hcCAtIDFdLmJyX3N0YXJ0b2ZmICsKKwkJCQkJbWFwW21hcF92YWxpZCArIG5tYXAgLSAxXS5icl9ibG9ja2NvdW50OworCQkJCWVsc2UKKwkJCQkJbWFwX29mZiA9CisJCQkJCQlYRlNfRElSMl9CWVRFX1RPX0RBKG1wLAorCQkJCQkJCVhGU19ESVIyX0xFQUZfT0ZGU0VUKTsKKwkJCQkvKgorCQkJCSAqIExvb2sgZm9yIGhvbGVzIGluIHRoZSBtYXBwaW5nLCBhbmQKKwkJCQkgKiBlbGltaW5hdGUgdGhlbS4gIENvdW50IHVwIHRoZSB2YWxpZCBibG9ja3MuCisJCQkJICovCisJCQkJZm9yIChpID0gbWFwX3ZhbGlkOyBpIDwgbWFwX3ZhbGlkICsgbm1hcDsgKSB7CisJCQkJCWlmIChtYXBbaV0uYnJfc3RhcnRibG9jayA9PQorCQkJCQkgICAgSE9MRVNUQVJUQkxPQ0spIHsKKwkJCQkJCW5tYXAtLTsKKwkJCQkJCWxlbmd0aCA9IG1hcF92YWxpZCArIG5tYXAgLSBpOworCQkJCQkJaWYgKGxlbmd0aCkKKwkJCQkJCQltZW1tb3ZlKCZtYXBbaV0sCisJCQkJCQkJCSZtYXBbaSArIDFdLAorCQkJCQkJCQlzaXplb2YobWFwW2ldKSAqCisJCQkJCQkJCWxlbmd0aCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQltYXBfYmxvY2tzICs9CisJCQkJCQkJbWFwW2ldLmJyX2Jsb2NrY291bnQ7CisJCQkJCQlpKys7CisJCQkJCX0KKwkJCQl9CisJCQkJbWFwX3ZhbGlkICs9IG5tYXA7CisJCQl9CisJCQkvKgorCQkJICogTm8gdmFsaWQgbWFwcGluZ3MsIHNvIG5vIG1vcmUgZGF0YSBibG9ja3MuCisJCQkgKi8KKwkJCWlmICghbWFwX3ZhbGlkKSB7CisJCQkJY3Vyb2ZmID0gWEZTX0RJUjJfREFfVE9fQllURShtcCwgbWFwX29mZik7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKgorCQkJICogUmVhZCB0aGUgZGlyZWN0b3J5IGJsb2NrIHN0YXJ0aW5nIGF0IHRoZSBmaXJzdAorCQkJICogbWFwcGluZy4KKwkJCSAqLworCQkJY3VyZGIgPSBYRlNfRElSMl9EQV9UT19EQihtcCwgbWFwLT5icl9zdGFydG9mZik7CisJCQllcnJvciA9IHhmc19kYV9yZWFkX2J1Zih0cCwgZHAsIG1hcC0+YnJfc3RhcnRvZmYsCisJCQkJbWFwLT5icl9ibG9ja2NvdW50ID49IG1wLT5tX2RpcmJsa2ZzYnMgPworCQkJCSAgICBYRlNfRlNCX1RPX0RBRERSKG1wLCBtYXAtPmJyX3N0YXJ0YmxvY2spIDoKKwkJCQkgICAgLTEsCisJCQkJJmJwLCBYRlNfREFUQV9GT1JLKTsKKwkJCS8qCisJCQkgKiBTaG91bGQganVzdCBza2lwIG92ZXIgdGhlIGRhdGEgYmxvY2sgaW5zdGVhZAorCQkJICogb2YgZ2l2aW5nIHVwLgorCQkJICovCisJCQlpZiAoZXJyb3IpCisJCQkJYnJlYWs7CS8qIFhYWCAqLworCQkJLyoKKwkJCSAqIEFkanVzdCB0aGUgY3VycmVudCBhbW91bnQgb2YgcmVhZC1haGVhZDogd2UganVzdAorCQkJICogcmVhZCBhIGJsb2NrIHRoYXQgd2FzIHByZXZpb3VzbHkgcmEuCisJCQkgKi8KKwkJCWlmIChyYV9jdXJyZW50KQorCQkJCXJhX2N1cnJlbnQgLT0gbXAtPm1fZGlyYmxrZnNiczsKKwkJCS8qCisJCQkgKiBEbyB3ZSBuZWVkIG1vcmUgcmVhZGFoZWFkPworCQkJICovCisJCQlmb3IgKHJhX2luZGV4ID0gcmFfb2Zmc2V0ID0gaSA9IDA7CisJCQkgICAgIHJhX3dhbnQgPiByYV9jdXJyZW50ICYmIGkgPCBtYXBfYmxvY2tzOworCQkJICAgICBpICs9IG1wLT5tX2RpcmJsa2ZzYnMpIHsKKwkJCQlBU1NFUlQocmFfaW5kZXggPCBtYXBfdmFsaWQpOworCQkJCS8qCisJCQkJICogUmVhZC1haGVhZCBhIGNvbnRpZ3VvdXMgZGlyZWN0b3J5IGJsb2NrLgorCQkJCSAqLworCQkJCWlmIChpID4gcmFfY3VycmVudCAmJgorCQkJCSAgICBtYXBbcmFfaW5kZXhdLmJyX2Jsb2NrY291bnQgPj0KKwkJCQkgICAgbXAtPm1fZGlyYmxrZnNicykgeworCQkJCQl4ZnNfYmFyZWFkKG1wLT5tX2RkZXZfdGFyZ3AsCisJCQkJCQlYRlNfRlNCX1RPX0RBRERSKG1wLAorCQkJCQkJICAgbWFwW3JhX2luZGV4XS5icl9zdGFydGJsb2NrICsKKwkJCQkJCSAgIHJhX29mZnNldCksCisJCQkJCQkoaW50KUJUT0JCKG1wLT5tX2RpcmJsa3NpemUpKTsKKwkJCQkJcmFfY3VycmVudCA9IGk7CisJCQkJfQorCQkJCS8qCisJCQkJICogUmVhZC1haGVhZCBhIG5vbi1jb250aWd1b3VzIGRpcmVjdG9yeSBibG9jay4KKwkJCQkgKiBUaGlzIGRvZXNuJ3QgdXNlIG91ciBtYXBwaW5nLCBidXQgdGhpcworCQkJCSAqIGlzIGEgdmVyeSByYXJlIGNhc2UuCisJCQkJICovCisJCQkJZWxzZSBpZiAoaSA+IHJhX2N1cnJlbnQpIHsKKwkJCQkJKHZvaWQpeGZzX2RhX3JlYWRhX2J1Zih0cCwgZHAsCisJCQkJCQltYXBbcmFfaW5kZXhdLmJyX3N0YXJ0b2ZmICsKKwkJCQkJCXJhX29mZnNldCwgWEZTX0RBVEFfRk9SSyk7CisJCQkJCXJhX2N1cnJlbnQgPSBpOworCQkJCX0KKwkJCQkvKgorCQkJCSAqIEFkdmFuY2Ugb2Zmc2V0IHRocm91Z2ggdGhlIG1hcHBpbmcgdGFibGUuCisJCQkJICovCisJCQkJZm9yIChqID0gMDsgaiA8IG1wLT5tX2RpcmJsa2ZzYnM7IGorKykgeworCQkJCQkvKgorCQkJCQkgKiBUaGUgcmVzdCBvZiB0aGlzIGV4dGVudCBidXQgbm90CisJCQkJCSAqIG1vcmUgdGhhbiBhIGRpciBibG9jay4KKwkJCQkJICovCisJCQkJCWxlbmd0aCA9IE1JTihtcC0+bV9kaXJibGtmc2JzLAorCQkJCQkJKGludCkobWFwW3JhX2luZGV4XS5icl9ibG9ja2NvdW50IC0KKwkJCQkJCXJhX29mZnNldCkpOworCQkJCQlqICs9IGxlbmd0aDsKKwkJCQkJcmFfb2Zmc2V0ICs9IGxlbmd0aDsKKwkJCQkJLyoKKwkJCQkJICogQWR2YW5jZSB0byB0aGUgbmV4dCBtYXBwaW5nIGlmCisJCQkJCSAqIHRoaXMgb25lIGlzIHVzZWQgdXAuCisJCQkJCSAqLworCQkJCQlpZiAocmFfb2Zmc2V0ID09CisJCQkJCSAgICBtYXBbcmFfaW5kZXhdLmJyX2Jsb2NrY291bnQpIHsKKwkJCQkJCXJhX29mZnNldCA9IDA7CisJCQkJCQlyYV9pbmRleCsrOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJLyoKKwkJCSAqIEhhdmluZyBkb25lIGEgcmVhZCwgd2UgbmVlZCB0byBzZXQgYSBuZXcgb2Zmc2V0LgorCQkJICovCisJCQluZXdvZmYgPSBYRlNfRElSMl9EQl9PRkZfVE9fQllURShtcCwgY3VyZGIsIDApOworCQkJLyoKKwkJCSAqIFN0YXJ0IG9mIHRoZSBjdXJyZW50IGJsb2NrLgorCQkJICovCisJCQlpZiAoY3Vyb2ZmIDwgbmV3b2ZmKQorCQkJCWN1cm9mZiA9IG5ld29mZjsKKwkJCS8qCisJCQkgKiBNYWtlIHN1cmUgd2UncmUgaW4gdGhlIHJpZ2h0IGJsb2NrLgorCQkJICovCisJCQllbHNlIGlmIChjdXJvZmYgPiBuZXdvZmYpCisJCQkJQVNTRVJUKFhGU19ESVIyX0JZVEVfVE9fREIobXAsIGN1cm9mZikgPT0KKwkJCQkgICAgICAgY3VyZGIpOworCQkJZGF0YSA9IGJwLT5kYXRhOworCQkJeGZzX2RpcjJfZGF0YV9jaGVjayhkcCwgYnApOworCQkJLyoKKwkJCSAqIEZpbmQgb3VyIHBvc2l0aW9uIGluIHRoZSBibG9jay4KKwkJCSAqLworCQkJcHRyID0gKGNoYXIgKikmZGF0YS0+dTsKKwkJCWJ5dGVvZmYgPSBYRlNfRElSMl9CWVRFX1RPX09GRihtcCwgY3Vyb2ZmKTsKKwkJCS8qCisJCQkgKiBTa2lwIHBhc3QgdGhlIGhlYWRlci4KKwkJCSAqLworCQkJaWYgKGJ5dGVvZmYgPT0gMCkKKwkJCQljdXJvZmYgKz0gKHVpbnQpc2l6ZW9mKGRhdGEtPmhkcik7CisJCQkvKgorCQkJICogU2tpcCBwYXN0IGVudHJpZXMgdW50aWwgd2UgcmVhY2ggb3VyIG9mZnNldC4KKwkJCSAqLworCQkJZWxzZSB7CisJCQkJd2hpbGUgKChjaGFyICopcHRyIC0gKGNoYXIgKilkYXRhIDwgYnl0ZW9mZikgeworCQkJCQlkdXAgPSAoeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqKXB0cjsKKworCQkJCQlpZiAoSU5UX0dFVChkdXAtPmZyZWV0YWcsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCSAgPT0gWEZTX0RJUjJfREFUQV9GUkVFX1RBRykgeworCisJCQkJCQlsZW5ndGggPSBJTlRfR0VUKGR1cC0+bGVuZ3RoLAorCQkJCQkJCQkgQVJDSF9DT05WRVJUKTsKKwkJCQkJCXB0ciArPSBsZW5ndGg7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQlkZXAgPSAoeGZzX2RpcjJfZGF0YV9lbnRyeV90ICopcHRyOworCQkJCQlsZW5ndGggPQorCQkJCQkgICBYRlNfRElSMl9EQVRBX0VOVFNJWkUoZGVwLT5uYW1lbGVuKTsKKwkJCQkJcHRyICs9IGxlbmd0aDsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBOb3cgc2V0IG91ciByZWFsIG9mZnNldC4KKwkJCQkgKi8KKwkJCQljdXJvZmYgPQorCQkJCQlYRlNfRElSMl9EQl9PRkZfVE9fQllURShtcCwKKwkJCQkJICAgIFhGU19ESVIyX0JZVEVfVE9fREIobXAsIGN1cm9mZiksCisJCQkJCSAgICAoY2hhciAqKXB0ciAtIChjaGFyICopZGF0YSk7CisJCQkJaWYgKHB0ciA+PSAoY2hhciAqKWRhdGEgKyBtcC0+bV9kaXJibGtzaXplKSB7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKwkJfQorCQkvKgorCQkgKiBXZSBoYXZlIGEgcG9pbnRlciB0byBhbiBlbnRyeS4KKwkJICogSXMgaXQgYSBsaXZlIG9uZT8KKwkJICovCisJCWR1cCA9ICh4ZnNfZGlyMl9kYXRhX3VudXNlZF90ICopcHRyOworCQkvKgorCQkgKiBObywgaXQncyB1bnVzZWQsIHNraXAgb3ZlciBpdC4KKwkJICovCisJCWlmIChJTlRfR0VUKGR1cC0+ZnJlZXRhZywgQVJDSF9DT05WRVJUKQorCQkJCQkJPT0gWEZTX0RJUjJfREFUQV9GUkVFX1RBRykgeworCQkJbGVuZ3RoID0gSU5UX0dFVChkdXAtPmxlbmd0aCwgQVJDSF9DT05WRVJUKTsKKwkJCXB0ciArPSBsZW5ndGg7CisJCQljdXJvZmYgKz0gbGVuZ3RoOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBDb3B5IHRoZSBlbnRyeSBpbnRvIHRoZSBwdXRhcmdzLCBhbmQgdHJ5IGZvcm1hdHRpbmcgaXQuCisJCSAqLworCQlkZXAgPSAoeGZzX2RpcjJfZGF0YV9lbnRyeV90ICopcHRyOworCisJCXAubmFtZWxlbiA9IGRlcC0+bmFtZWxlbjsKKworCQlsZW5ndGggPSBYRlNfRElSMl9EQVRBX0VOVFNJWkUocC5uYW1lbGVuKTsKKworCQlwLmNvb2sgPSBYRlNfRElSMl9CWVRFX1RPX0RBVEFQVFIobXAsIGN1cm9mZiArIGxlbmd0aCk7CisKKwkJcC5pbm8gPSBJTlRfR0VUKGRlcC0+aW51bWJlciwgQVJDSF9DT05WRVJUKTsKKyNpZiBYRlNfQklHX0lOVU1TCisJCXAuaW5vICs9IG1wLT5tX2lub2FkZDsKKyNlbmRpZgorCQlwLm5hbWUgPSAoY2hhciAqKWRlcC0+bmFtZTsKKworCQllcnJvciA9IHAucHV0KCZwKTsKKworCQkvKgorCQkgKiBXb24ndCBmaXQuICBSZXR1cm4gdG8gY2FsbGVyLgorCQkgKi8KKwkJaWYgKCFwLmRvbmUpIHsKKwkJCWVvZiA9IDA7CisJCQlicmVhazsKKwkJfQorCQkvKgorCQkgKiBBZHZhbmNlIHRvIG5leHQgZW50cnkgaW4gdGhlIGJsb2NrLgorCQkgKi8KKwkJcHRyICs9IGxlbmd0aDsKKwkJY3Vyb2ZmICs9IGxlbmd0aDsKKwl9CisKKwkvKgorCSAqIEFsbCBkb25lLiAgU2V0IG91dHB1dCBvZmZzZXQgdmFsdWUgdG8gY3VycmVudCBvZmZzZXQuCisJICovCisJKmVvZnAgPSBlb2Y7CisJaWYgKGN1cm9mZiA+IFhGU19ESVIyX0RBVEFQVFJfVE9fQllURShtcCwgWEZTX0RJUjJfTUFYX0RBVEFQVFIpKQorCQl1aW8tPnVpb19vZmZzZXQgPSBYRlNfRElSMl9NQVhfREFUQVBUUjsKKwllbHNlCisJCXVpby0+dWlvX29mZnNldCA9IFhGU19ESVIyX0JZVEVfVE9fREFUQVBUUihtcCwgY3Vyb2ZmKTsKKwlrbWVtX2ZyZWUobWFwLCBtYXBfc2l6ZSAqIHNpemVvZigqbWFwKSk7CisJaWYgKGJwKQorCQl4ZnNfZGFfYnJlbHNlKHRwLCBicCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogSW5pdGlhbGl6ZSBhIG5ldyBsZWFmIGJsb2NrLCBsZWFmMSBvciBsZWFmbiBtYWdpYyBhY2NlcHRlZC4KKyAqLworaW50Cit4ZnNfZGlyMl9sZWFmX2luaXQoCisJeGZzX2RhX2FyZ3NfdAkJKmFyZ3MsCQkvKiBvcGVyYXRpb24gYXJndW1lbnRzICovCisJeGZzX2RpcjJfZGJfdAkJYm5vLAkJLyogZGlyZWN0b3J5IGJsb2NrIG51bWJlciAqLworCXhmc19kYWJ1Zl90CQkqKmJwcCwJCS8qIG91dDogbGVhZiBidWZmZXIgKi8KKwlpbnQJCQltYWdpYykJCS8qIG1hZ2ljIG51bWJlciBmb3IgYmxvY2sgKi8KK3sKKwl4ZnNfZGFidWZfdAkJKmJwOwkJLyogbGVhZiBidWZmZXIgKi8KKwl4ZnNfaW5vZGVfdAkJKmRwOwkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLworCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIGNvZGUgKi8KKwl4ZnNfZGlyMl9sZWFmX3QJCSpsZWFmOwkJLyogbGVhZiBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9sZWFmX3RhaWxfdAkqbHRwOwkJLyogbGVhZiB0YWlsIHN0cnVjdHVyZSAqLworCXhmc19tb3VudF90CQkqbXA7CQkvKiBmaWxlc3lzdGVtIG1vdW50IHBvaW50ICovCisJeGZzX3RyYW5zX3QJCSp0cDsJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKworCWRwID0gYXJncy0+ZHA7CisJQVNTRVJUKGRwICE9IE5VTEwpOworCXRwID0gYXJncy0+dHJhbnM7CisJbXAgPSBkcC0+aV9tb3VudDsKKwlBU1NFUlQoYm5vID49IFhGU19ESVIyX0xFQUZfRklSU1REQihtcCkgJiYKKwkgICAgICAgYm5vIDwgWEZTX0RJUjJfRlJFRV9GSVJTVERCKG1wKSk7CisJLyoKKwkgKiBHZXQgdGhlIGJ1ZmZlciBmb3IgdGhlIGJsb2NrLgorCSAqLworCWVycm9yID0geGZzX2RhX2dldF9idWYodHAsIGRwLCBYRlNfRElSMl9EQl9UT19EQShtcCwgYm5vKSwgLTEsICZicCwKKwkJWEZTX0RBVEFfRk9SSyk7CisJaWYgKGVycm9yKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJQVNTRVJUKGJwICE9IE5VTEwpOworCWxlYWYgPSBicC0+ZGF0YTsKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIGhlYWRlci4KKwkgKi8KKwlJTlRfU0VUKGxlYWYtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQsIG1hZ2ljKTsKKwlsZWFmLT5oZHIuaW5mby5mb3J3ID0gMDsKKwlsZWFmLT5oZHIuaW5mby5iYWNrID0gMDsKKwlsZWFmLT5oZHIuY291bnQgPSAwOworCWxlYWYtPmhkci5zdGFsZSA9IDA7CisJeGZzX2RpcjJfbGVhZl9sb2dfaGVhZGVyKHRwLCBicCk7CisJLyoKKwkgKiBJZiBpdCdzIGEgbGVhZi1mb3JtYXQgZGlyZWN0b3J5IGluaXRpYWxpemUgdGhlIHRhaWwuCisJICogSW4gdGhpcyBjYXNlIG91ciBjYWxsZXIgaGFzIHRoZSByZWFsIGJlc3RzIHRhYmxlIHRvIGNvcHkgaW50bworCSAqIHRoZSBibG9jay4KKwkgKi8KKwlpZiAobWFnaWMgPT0gWEZTX0RJUjJfTEVBRjFfTUFHSUMpIHsKKwkJbHRwID0gWEZTX0RJUjJfTEVBRl9UQUlMX1AobXAsIGxlYWYpOworCQlsdHAtPmJlc3Rjb3VudCA9IDA7CisJCXhmc19kaXIyX2xlYWZfbG9nX3RhaWwodHAsIGJwKTsKKwl9CisJKmJwcCA9IGJwOworCXJldHVybiAwOworfQorCisvKgorICogTG9nIHRoZSBiZXN0cyBlbnRyaWVzIGluZGljYXRlZCBmcm9tIGEgbGVhZjEgYmxvY2suCisgKi8KK3ZvaWQKK3hmc19kaXIyX2xlYWZfbG9nX2Jlc3RzKAorCXhmc190cmFuc190CQkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2RhYnVmX3QJCSpicCwJCS8qIGxlYWYgYnVmZmVyICovCisJaW50CQkJZmlyc3QsCQkvKiBmaXJzdCBlbnRyeSB0byBsb2cgKi8KKwlpbnQJCQlsYXN0KQkJLyogbGFzdCBlbnRyeSB0byBsb2cgKi8KK3sKKwl4ZnNfZGlyMl9kYXRhX29mZl90CSpmaXJzdGI7CS8qIHBvaW50ZXIgdG8gZmlyc3QgZW50cnkgKi8KKwl4ZnNfZGlyMl9kYXRhX29mZl90CSpsYXN0YjsJCS8qIHBvaW50ZXIgdG8gbGFzdCBlbnRyeSAqLworCXhmc19kaXIyX2xlYWZfdAkJKmxlYWY7CQkvKiBsZWFmIHN0cnVjdHVyZSAqLworCXhmc19kaXIyX2xlYWZfdGFpbF90CSpsdHA7CQkvKiBsZWFmIHRhaWwgc3RydWN0dXJlICovCisKKwlsZWFmID0gYnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQobGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfTEVBRjFfTUFHSUMpOworCWx0cCA9IFhGU19ESVIyX0xFQUZfVEFJTF9QKHRwLT50X21vdW50cCwgbGVhZik7CisJZmlyc3RiID0gWEZTX0RJUjJfTEVBRl9CRVNUU19QKGx0cCkgKyBmaXJzdDsKKwlsYXN0YiA9IFhGU19ESVIyX0xFQUZfQkVTVFNfUChsdHApICsgbGFzdDsKKwl4ZnNfZGFfbG9nX2J1Zih0cCwgYnAsICh1aW50KSgoY2hhciAqKWZpcnN0YiAtIChjaGFyICopbGVhZiksCisJCSh1aW50KSgoY2hhciAqKWxhc3RiIC0gKGNoYXIgKilsZWFmICsgc2l6ZW9mKCpsYXN0YikgLSAxKSk7Cit9CisKKy8qCisgKiBMb2cgdGhlIGxlYWYgZW50cmllcyBpbmRpY2F0ZWQgZnJvbSBhIGxlYWYxIG9yIGxlYWZuIGJsb2NrLgorICovCit2b2lkCit4ZnNfZGlyMl9sZWFmX2xvZ19lbnRzKAorCXhmc190cmFuc190CQkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2RhYnVmX3QJCSpicCwJCS8qIGxlYWYgYnVmZmVyICovCisJaW50CQkJZmlyc3QsCQkvKiBmaXJzdCBlbnRyeSB0byBsb2cgKi8KKwlpbnQJCQlsYXN0KQkJLyogbGFzdCBlbnRyeSB0byBsb2cgKi8KK3sKKwl4ZnNfZGlyMl9sZWFmX2VudHJ5X3QJKmZpcnN0bGVwOwkvKiBwb2ludGVyIHRvIGZpcnN0IGVudHJ5ICovCisJeGZzX2RpcjJfbGVhZl9lbnRyeV90CSpsYXN0bGVwOwkvKiBwb2ludGVyIHRvIGxhc3QgZW50cnkgKi8KKwl4ZnNfZGlyMl9sZWFmX3QJCSpsZWFmOwkJLyogbGVhZiBzdHJ1Y3R1cmUgKi8KKworCWxlYWYgPSBicC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChsZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9MRUFGMV9NQUdJQyB8fAorCSAgICAgICBJTlRfR0VUKGxlYWYtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0xFQUZOX01BR0lDKTsKKwlmaXJzdGxlcCA9ICZsZWFmLT5lbnRzW2ZpcnN0XTsKKwlsYXN0bGVwID0gJmxlYWYtPmVudHNbbGFzdF07CisJeGZzX2RhX2xvZ19idWYodHAsIGJwLCAodWludCkoKGNoYXIgKilmaXJzdGxlcCAtIChjaGFyICopbGVhZiksCisJCSh1aW50KSgoY2hhciAqKWxhc3RsZXAgLSAoY2hhciAqKWxlYWYgKyBzaXplb2YoKmxhc3RsZXApIC0gMSkpOworfQorCisvKgorICogTG9nIHRoZSBoZWFkZXIgb2YgdGhlIGxlYWYxIG9yIGxlYWZuIGJsb2NrLgorICovCit2b2lkCit4ZnNfZGlyMl9sZWFmX2xvZ19oZWFkZXIoCisJeGZzX3RyYW5zX3QJCSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfZGFidWZfdAkJKmJwKQkJLyogbGVhZiBidWZmZXIgKi8KK3sKKwl4ZnNfZGlyMl9sZWFmX3QJCSpsZWFmOwkJLyogbGVhZiBzdHJ1Y3R1cmUgKi8KKworCWxlYWYgPSBicC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChsZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9MRUFGMV9NQUdJQyB8fAorCSAgICAgICBJTlRfR0VUKGxlYWYtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0xFQUZOX01BR0lDKTsKKwl4ZnNfZGFfbG9nX2J1Zih0cCwgYnAsICh1aW50KSgoY2hhciAqKSZsZWFmLT5oZHIgLSAoY2hhciAqKWxlYWYpLAorCQkodWludCkoc2l6ZW9mKGxlYWYtPmhkcikgLSAxKSk7Cit9CisKKy8qCisgKiBMb2cgdGhlIHRhaWwgb2YgdGhlIGxlYWYxIGJsb2NrLgorICovCit2b2lkCit4ZnNfZGlyMl9sZWFmX2xvZ190YWlsKAorCXhmc190cmFuc190CQkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2RhYnVmX3QJCSpicCkJCS8qIGxlYWYgYnVmZmVyICovCit7CisJeGZzX2RpcjJfbGVhZl90CQkqbGVhZjsJCS8qIGxlYWYgc3RydWN0dXJlICovCisJeGZzX2RpcjJfbGVhZl90YWlsX3QJKmx0cDsJCS8qIGxlYWYgdGFpbCBzdHJ1Y3R1cmUgKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLworCisJbXAgPSB0cC0+dF9tb3VudHA7CisJbGVhZiA9IGJwLT5kYXRhOworCUFTU0VSVChJTlRfR0VUKGxlYWYtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0xFQUYxX01BR0lDKTsKKwlsdHAgPSBYRlNfRElSMl9MRUFGX1RBSUxfUChtcCwgbGVhZik7CisJeGZzX2RhX2xvZ19idWYodHAsIGJwLCAodWludCkoKGNoYXIgKilsdHAgLSAoY2hhciAqKWxlYWYpLAorCQkodWludCkobXAtPm1fZGlyYmxrc2l6ZSAtIDEpKTsKK30KKworLyoKKyAqIExvb2sgdXAgdGhlIGVudHJ5IHJlZmVycmVkIHRvIGJ5IGFyZ3MgaW4gdGhlIGxlYWYgZm9ybWF0IGRpcmVjdG9yeS4KKyAqIE1vc3Qgb2YgdGhlIHdvcmsgaXMgZG9uZSBieSB0aGUgeGZzX2RpcjJfbGVhZl9sb29rdXBfaW50IHJvdXRpbmUgd2hpY2gKKyAqIGlzIGFsc28gdXNlZCBieSB0aGUgbm9kZS1mb3JtYXQgY29kZS4KKyAqLworaW50Cit4ZnNfZGlyMl9sZWFmX2xvb2t1cCgKKwl4ZnNfZGFfYXJnc190CQkqYXJncykJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KK3sKKwl4ZnNfZGFidWZfdAkJKmRicDsJCS8qIGRhdGEgYmxvY2sgYnVmZmVyICovCisJeGZzX2RpcjJfZGF0YV9lbnRyeV90CSpkZXA7CQkvKiBkYXRhIGJsb2NrIGVudHJ5ICovCisJeGZzX2lub2RlX3QJCSpkcDsJCS8qIGluY29yZSBkaXJlY3RvcnkgaW5vZGUgKi8KKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiBjb2RlICovCisJaW50CQkJaW5kZXg7CQkvKiBmb3VuZCBlbnRyeSBpbmRleCAqLworCXhmc19kYWJ1Zl90CQkqbGJwOwkJLyogbGVhZiBidWZmZXIgKi8KKwl4ZnNfZGlyMl9sZWFmX3QJCSpsZWFmOwkJLyogbGVhZiBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9sZWFmX2VudHJ5X3QJKmxlcDsJCS8qIGxlYWYgZW50cnkgKi8KKwl4ZnNfdHJhbnNfdAkJKnRwOwkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCisJeGZzX2RpcjJfdHJhY2VfYXJncygibGVhZl9sb29rdXAiLCBhcmdzKTsKKwkvKgorCSAqIExvb2sgdXAgbmFtZSBpbiB0aGUgbGVhZiBibG9jaywgcmV0dXJuaW5nIGJvdGggYnVmZmVycyBhbmQgaW5kZXguCisJICovCisJaWYgKChlcnJvciA9IHhmc19kaXIyX2xlYWZfbG9va3VwX2ludChhcmdzLCAmbGJwLCAmaW5kZXgsICZkYnApKSkgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCXRwID0gYXJncy0+dHJhbnM7CisJZHAgPSBhcmdzLT5kcDsKKwl4ZnNfZGlyMl9sZWFmX2NoZWNrKGRwLCBsYnApOworCWxlYWYgPSBsYnAtPmRhdGE7CisJLyoKKwkgKiBHZXQgdG8gdGhlIGxlYWYgZW50cnkgYW5kIGNvbnRhaW5lZCBkYXRhIGVudHJ5IGFkZHJlc3MuCisJICovCisJbGVwID0gJmxlYWYtPmVudHNbaW5kZXhdOworCS8qCisJICogUG9pbnQgdG8gdGhlIGRhdGEgZW50cnkuCisJICovCisJZGVwID0gKHhmc19kaXIyX2RhdGFfZW50cnlfdCAqKQorCSAgICAgICgoY2hhciAqKWRicC0+ZGF0YSArCisJICAgICAgIFhGU19ESVIyX0RBVEFQVFJfVE9fT0ZGKGRwLT5pX21vdW50LCBJTlRfR0VUKGxlcC0+YWRkcmVzcywgQVJDSF9DT05WRVJUKSkpOworCS8qCisJICogUmV0dXJuIHRoZSBmb3VuZCBpbm9kZSBudW1iZXIuCisJICovCisJYXJncy0+aW51bWJlciA9IElOVF9HRVQoZGVwLT5pbnVtYmVyLCBBUkNIX0NPTlZFUlQpOworCXhmc19kYV9icmVsc2UodHAsIGRicCk7CisJeGZzX2RhX2JyZWxzZSh0cCwgbGJwKTsKKwlyZXR1cm4gWEZTX0VSUk9SKEVFWElTVCk7Cit9CisKKy8qCisgKiBMb29rIHVwIG5hbWUvaGFzaCBpbiB0aGUgbGVhZiBibG9jay4KKyAqIEZpbGwgaW4gaW5kZXhwIHdpdGggdGhlIGZvdW5kIGluZGV4LCBhbmQgZGJwcCB3aXRoIHRoZSBkYXRhIGJ1ZmZlci4KKyAqIElmIG5vdCBmb3VuZCBkYnBwIHdpbGwgYmUgTlVMTCwgYW5kIEVOT0VOVCBjb21lcyBiYWNrLgorICogbGJwcCB3aWxsIGFsd2F5cyBiZSBmaWxsZWQgaW4gd2l0aCB0aGUgbGVhZiBidWZmZXIgdW5sZXNzIHRoZXJlJ3MgYW4gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9sZWFmX2xvb2t1cF9pbnQoCisJeGZzX2RhX2FyZ3NfdAkJKmFyZ3MsCQkvKiBvcGVyYXRpb24gYXJndW1lbnRzICovCisJeGZzX2RhYnVmX3QJCSoqbGJwcCwJCS8qIG91dDogbGVhZiBidWZmZXIgKi8KKwlpbnQJCQkqaW5kZXhwLAkvKiBvdXQ6IGluZGV4IGluIGxlYWYgYmxvY2sgKi8KKwl4ZnNfZGFidWZfdAkJKipkYnBwKQkJLyogb3V0OiBkYXRhIGJ1ZmZlciAqLworeworCXhmc19kaXIyX2RiX3QJCWN1cmRiOwkJLyogY3VycmVudCBkYXRhIGJsb2NrIG51bWJlciAqLworCXhmc19kYWJ1Zl90CQkqZGJwOwkJLyogZGF0YSBidWZmZXIgKi8KKwl4ZnNfZGlyMl9kYXRhX2VudHJ5X3QJKmRlcDsJCS8qIGRhdGEgZW50cnkgKi8KKwl4ZnNfaW5vZGVfdAkJKmRwOwkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLworCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIGNvZGUgKi8KKwlpbnQJCQlpbmRleDsJCS8qIGluZGV4IGluIGxlYWYgYmxvY2sgKi8KKwl4ZnNfZGFidWZfdAkJKmxicDsJCS8qIGxlYWYgYnVmZmVyICovCisJeGZzX2RpcjJfbGVhZl9lbnRyeV90CSpsZXA7CQkvKiBsZWFmIGVudHJ5ICovCisJeGZzX2RpcjJfbGVhZl90CQkqbGVhZjsJCS8qIGxlYWYgc3RydWN0dXJlICovCisJeGZzX21vdW50X3QJCSptcDsJCS8qIGZpbGVzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl4ZnNfZGlyMl9kYl90CQluZXdkYjsJCS8qIG5ldyBkYXRhIGJsb2NrIG51bWJlciAqLworCXhmc190cmFuc190CQkqdHA7CQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisKKwlkcCA9IGFyZ3MtPmRwOworCXRwID0gYXJncy0+dHJhbnM7CisJbXAgPSBkcC0+aV9tb3VudDsKKwkvKgorCSAqIFJlYWQgdGhlIGxlYWYgYmxvY2sgaW50byB0aGUgYnVmZmVyLgorCSAqLworCWlmICgoZXJyb3IgPQorCSAgICB4ZnNfZGFfcmVhZF9idWYodHAsIGRwLCBtcC0+bV9kaXJsZWFmYmxrLCAtMSwgJmxicCwKKwkJICAgIFhGU19EQVRBX0ZPUkspKSkgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCSpsYnBwID0gbGJwOworCWxlYWYgPSBsYnAtPmRhdGE7CisJeGZzX2RpcjJfbGVhZl9jaGVjayhkcCwgbGJwKTsKKwkvKgorCSAqIExvb2sgZm9yIHRoZSBmaXJzdCBsZWFmIGVudHJ5IHdpdGggb3VyIGhhc2ggdmFsdWUuCisJICovCisJaW5kZXggPSB4ZnNfZGlyMl9sZWFmX3NlYXJjaF9oYXNoKGFyZ3MsIGxicCk7CisJLyoKKwkgKiBMb29wIG92ZXIgYWxsIHRoZSBlbnRyaWVzIHdpdGggdGhlIHJpZ2h0IGhhc2ggdmFsdWUKKwkgKiBsb29raW5nIHRvIG1hdGNoIHRoZSBuYW1lLgorCSAqLworCWZvciAobGVwID0gJmxlYWYtPmVudHNbaW5kZXhdLCBkYnAgPSBOVUxMLCBjdXJkYiA9IC0xOworCSAgICAgaW5kZXggPCBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAmJiBJTlRfR0VUKGxlcC0+aGFzaHZhbCwgQVJDSF9DT05WRVJUKSA9PSBhcmdzLT5oYXNodmFsOworCSAgICAgbGVwKyssIGluZGV4KyspIHsKKwkJLyoKKwkJICogU2tpcCBvdmVyIHN0YWxlIGxlYWYgZW50cmllcy4KKwkJICovCisJCWlmIChJTlRfR0VUKGxlcC0+YWRkcmVzcywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9OVUxMX0RBVEFQVFIpCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogR2V0IHRoZSBuZXcgZGF0YSBibG9jayBudW1iZXIuCisJCSAqLworCQluZXdkYiA9IFhGU19ESVIyX0RBVEFQVFJfVE9fREIobXAsIElOVF9HRVQobGVwLT5hZGRyZXNzLCBBUkNIX0NPTlZFUlQpKTsKKwkJLyoKKwkJICogSWYgaXQncyBub3QgdGhlIHNhbWUgYXMgdGhlIG9sZCBkYXRhIGJsb2NrIG51bWJlciwKKwkJICogbmVlZCB0byBwaXRjaCB0aGUgb2xkIG9uZSBhbmQgcmVhZCB0aGUgbmV3IG9uZS4KKwkJICovCisJCWlmIChuZXdkYiAhPSBjdXJkYikgeworCQkJaWYgKGRicCkKKwkJCQl4ZnNfZGFfYnJlbHNlKHRwLCBkYnApOworCQkJaWYgKChlcnJvciA9CisJCQkgICAgeGZzX2RhX3JlYWRfYnVmKHRwLCBkcCwKKwkJCQkgICAgWEZTX0RJUjJfREJfVE9fREEobXAsIG5ld2RiKSwgLTEsICZkYnAsCisJCQkJICAgIFhGU19EQVRBX0ZPUkspKSkgeworCQkJCXhmc19kYV9icmVsc2UodHAsIGxicCk7CisJCQkJcmV0dXJuIGVycm9yOworCQkJfQorCQkJeGZzX2RpcjJfZGF0YV9jaGVjayhkcCwgZGJwKTsKKwkJCWN1cmRiID0gbmV3ZGI7CisJCX0KKwkJLyoKKwkJICogUG9pbnQgdG8gdGhlIGRhdGEgZW50cnkuCisJCSAqLworCQlkZXAgPSAoeGZzX2RpcjJfZGF0YV9lbnRyeV90ICopCisJCSAgICAgICgoY2hhciAqKWRicC0+ZGF0YSArCisJCSAgICAgICBYRlNfRElSMl9EQVRBUFRSX1RPX09GRihtcCwgSU5UX0dFVChsZXAtPmFkZHJlc3MsIEFSQ0hfQ09OVkVSVCkpKTsKKwkJLyoKKwkJICogSWYgaXQgbWF0Y2hlcyB0aGVuIHJldHVybiBpdC4KKwkJICovCisJCWlmIChkZXAtPm5hbWVsZW4gPT0gYXJncy0+bmFtZWxlbiAmJgorCQkgICAgZGVwLT5uYW1lWzBdID09IGFyZ3MtPm5hbWVbMF0gJiYKKwkJICAgIG1lbWNtcChkZXAtPm5hbWUsIGFyZ3MtPm5hbWUsIGFyZ3MtPm5hbWVsZW4pID09IDApIHsKKwkJCSpkYnBwID0gZGJwOworCQkJKmluZGV4cCA9IGluZGV4OworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJLyoKKwkgKiBObyBtYXRjaCBmb3VuZCwgcmV0dXJuIEVOT0VOVC4KKwkgKi8KKwlBU1NFUlQoYXJncy0+b2tub2VudCk7CisJaWYgKGRicCkKKwkJeGZzX2RhX2JyZWxzZSh0cCwgZGJwKTsKKwl4ZnNfZGFfYnJlbHNlKHRwLCBsYnApOworCXJldHVybiBYRlNfRVJST1IoRU5PRU5UKTsKK30KKworLyoKKyAqIFJlbW92ZSBhbiBlbnRyeSBmcm9tIGEgbGVhZiBmb3JtYXQgZGlyZWN0b3J5LgorICovCitpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2RpcjJfbGVhZl9yZW1vdmVuYW1lKAorCXhmc19kYV9hcmdzX3QJCSphcmdzKQkJLyogb3BlcmF0aW9uIGFyZ3VtZW50cyAqLworeworCXhmc19kaXIyX2RhdGFfb2ZmX3QJKmJlc3RzcDsJLyogbGVhZiBibG9jayBiZXN0IGZyZWVzcGFjZSAqLworCXhmc19kaXIyX2RhdGFfdAkJKmRhdGE7CQkvKiBkYXRhIGJsb2NrIHN0cnVjdHVyZSAqLworCXhmc19kaXIyX2RiX3QJCWRiOwkJLyogZGF0YSBibG9jayBudW1iZXIgKi8KKwl4ZnNfZGFidWZfdAkJKmRicDsJCS8qIGRhdGEgYmxvY2sgYnVmZmVyICovCisJeGZzX2RpcjJfZGF0YV9lbnRyeV90CSpkZXA7CQkvKiBkYXRhIGVudHJ5IHN0cnVjdHVyZSAqLworCXhmc19pbm9kZV90CQkqZHA7CQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gY29kZSAqLworCXhmc19kaXIyX2RiX3QJCWk7CQkvKiB0ZW1wb3JhcnkgZGF0YSBibG9jayAjICovCisJaW50CQkJaW5kZXg7CQkvKiBpbmRleCBpbnRvIGxlYWYgZW50cmllcyAqLworCXhmc19kYWJ1Zl90CQkqbGJwOwkJLyogbGVhZiBidWZmZXIgKi8KKwl4ZnNfZGlyMl9sZWFmX3QJCSpsZWFmOwkJLyogbGVhZiBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9sZWFmX2VudHJ5X3QJKmxlcDsJCS8qIGxlYWYgZW50cnkgKi8KKwl4ZnNfZGlyMl9sZWFmX3RhaWxfdAkqbHRwOwkJLyogbGVhZiB0YWlsIHN0cnVjdHVyZSAqLworCXhmc19tb3VudF90CQkqbXA7CQkvKiBmaWxlc3lzdGVtIG1vdW50IHBvaW50ICovCisJaW50CQkJbmVlZGxvZzsJLyogbmVlZCB0byBsb2cgZGF0YSBoZWFkZXIgKi8KKwlpbnQJCQluZWVkc2NhbjsJLyogbmVlZCB0byByZXNjYW4gZGF0YSBmcmVlcyAqLworCXhmc19kaXIyX2RhdGFfb2ZmX3QJb2xkYmVzdDsJLyogb2xkIHZhbHVlIG9mIGJlc3QgZnJlZSAqLworCXhmc190cmFuc190CQkqdHA7CQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisKKwl4ZnNfZGlyMl90cmFjZV9hcmdzKCJsZWFmX3JlbW92ZW5hbWUiLCBhcmdzKTsKKwkvKgorCSAqIExvb2t1cCB0aGUgbGVhZiBlbnRyeSwgZ2V0IHRoZSBsZWFmIGFuZCBkYXRhIGJsb2NrcyByZWFkIGluLgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfZGlyMl9sZWFmX2xvb2t1cF9pbnQoYXJncywgJmxicCwgJmluZGV4LCAmZGJwKSkpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlkcCA9IGFyZ3MtPmRwOworCXRwID0gYXJncy0+dHJhbnM7CisJbXAgPSBkcC0+aV9tb3VudDsKKwlsZWFmID0gbGJwLT5kYXRhOworCWRhdGEgPSBkYnAtPmRhdGE7CisJeGZzX2RpcjJfZGF0YV9jaGVjayhkcCwgZGJwKTsKKwkvKgorCSAqIFBvaW50IHRvIHRoZSBsZWFmIGVudHJ5LCB1c2UgdGhhdCB0byBwb2ludCB0byB0aGUgZGF0YSBlbnRyeS4KKwkgKi8KKwlsZXAgPSAmbGVhZi0+ZW50c1tpbmRleF07CisJZGIgPSBYRlNfRElSMl9EQVRBUFRSX1RPX0RCKG1wLCBJTlRfR0VUKGxlcC0+YWRkcmVzcywgQVJDSF9DT05WRVJUKSk7CisJZGVwID0gKHhmc19kaXIyX2RhdGFfZW50cnlfdCAqKQorCSAgICAgICgoY2hhciAqKWRhdGEgKyBYRlNfRElSMl9EQVRBUFRSX1RPX09GRihtcCwgSU5UX0dFVChsZXAtPmFkZHJlc3MsIEFSQ0hfQ09OVkVSVCkpKTsKKwluZWVkc2NhbiA9IG5lZWRsb2cgPSAwOworCW9sZGJlc3QgPSBJTlRfR0VUKGRhdGEtPmhkci5iZXN0ZnJlZVswXS5sZW5ndGgsIEFSQ0hfQ09OVkVSVCk7CisJbHRwID0gWEZTX0RJUjJfTEVBRl9UQUlMX1AobXAsIGxlYWYpOworCWJlc3RzcCA9IFhGU19ESVIyX0xFQUZfQkVTVFNfUChsdHApOworCUFTU0VSVChJTlRfR0VUKGJlc3RzcFtkYl0sIEFSQ0hfQ09OVkVSVCkgPT0gb2xkYmVzdCk7CisJLyoKKwkgKiBNYXJrIHRoZSBmb3JtZXIgZGF0YSBlbnRyeSB1bnVzZWQuCisJICovCisJeGZzX2RpcjJfZGF0YV9tYWtlX2ZyZWUodHAsIGRicCwKKwkJKHhmc19kaXIyX2RhdGFfYW9mZl90KSgoY2hhciAqKWRlcCAtIChjaGFyICopZGF0YSksCisJCVhGU19ESVIyX0RBVEFfRU5UU0laRShkZXAtPm5hbWVsZW4pLCAmbmVlZGxvZywgJm5lZWRzY2FuKTsKKwkvKgorCSAqIFdlIGp1c3QgbWFyayB0aGUgbGVhZiBlbnRyeSBzdGFsZSBieSBwdXR0aW5nIGEgbnVsbCBpbiBpdC4KKwkgKi8KKwlJTlRfTU9EKGxlYWYtPmhkci5zdGFsZSwgQVJDSF9DT05WRVJULCArMSk7CisJeGZzX2RpcjJfbGVhZl9sb2dfaGVhZGVyKHRwLCBsYnApOworCUlOVF9TRVQobGVwLT5hZGRyZXNzLCBBUkNIX0NPTlZFUlQsIFhGU19ESVIyX05VTExfREFUQVBUUik7CisJeGZzX2RpcjJfbGVhZl9sb2dfZW50cyh0cCwgbGJwLCBpbmRleCwgaW5kZXgpOworCS8qCisJICogU2NhbiB0aGUgZnJlZXNwYWNlIGluIHRoZSBkYXRhIGJsb2NrIGFnYWluIGlmIG5lY2Vzc2FyeSwKKwkgKiBsb2cgdGhlIGRhdGEgYmxvY2sgaGVhZGVyIGlmIG5lY2Vzc2FyeS4KKwkgKi8KKwlpZiAobmVlZHNjYW4pCisJCXhmc19kaXIyX2RhdGFfZnJlZXNjYW4obXAsIGRhdGEsICZuZWVkbG9nLCBOVUxMKTsKKwlpZiAobmVlZGxvZykKKwkJeGZzX2RpcjJfZGF0YV9sb2dfaGVhZGVyKHRwLCBkYnApOworCS8qCisJICogSWYgdGhlIGxvbmdlc3QgZnJlZXNwYWNlIGluIHRoZSBkYXRhIGJsb2NrIGhhcyBjaGFuZ2VkLAorCSAqIHB1dCB0aGUgbmV3IHZhbHVlIGluIHRoZSBiZXN0cyB0YWJsZSBhbmQgbG9nIHRoYXQuCisJICovCisJaWYgKElOVF9HRVQoZGF0YS0+aGRyLmJlc3RmcmVlWzBdLmxlbmd0aCwgQVJDSF9DT05WRVJUKSAhPSBvbGRiZXN0KSB7CisJCUlOVF9DT1BZKGJlc3RzcFtkYl0sIGRhdGEtPmhkci5iZXN0ZnJlZVswXS5sZW5ndGgsIEFSQ0hfQ09OVkVSVCk7CisJCXhmc19kaXIyX2xlYWZfbG9nX2Jlc3RzKHRwLCBsYnAsIGRiLCBkYik7CisJfQorCXhmc19kaXIyX2RhdGFfY2hlY2soZHAsIGRicCk7CisJLyoKKwkgKiBJZiB0aGUgZGF0YSBibG9jayBpcyBub3cgZW1wdHkgdGhlbiBnZXQgcmlkIG9mIHRoZSBkYXRhIGJsb2NrLgorCSAqLworCWlmIChJTlRfR0VUKGRhdGEtPmhkci5iZXN0ZnJlZVswXS5sZW5ndGgsIEFSQ0hfQ09OVkVSVCkgPT0KKwkgICAgbXAtPm1fZGlyYmxrc2l6ZSAtICh1aW50KXNpemVvZihkYXRhLT5oZHIpKSB7CisJCUFTU0VSVChkYiAhPSBtcC0+bV9kaXJkYXRhYmxrKTsKKwkJaWYgKChlcnJvciA9IHhmc19kaXIyX3Nocmlua19pbm9kZShhcmdzLCBkYiwgZGJwKSkpIHsKKwkJCS8qCisJCQkgKiBOb3BlLCBjYW4ndCBnZXQgcmlkIG9mIGl0IGJlY2F1c2UgaXQgY2F1c2VkCisJCQkgKiBhbGxvY2F0aW9uIG9mIGEgYm1hcCBidHJlZSBibG9jayB0byBkbyBzby4KKwkJCSAqIEp1c3QgZ28gb24sIHJldHVybmluZyBzdWNjZXNzLCBsZWF2aW5nIHRoZQorCQkJICogZW1wdHkgYmxvY2sgaW4gcGxhY2UuCisJCQkgKi8KKwkJCWlmIChlcnJvciA9PSBFTk9TUEMgJiYgYXJncy0+dG90YWwgPT0gMCkgeworCQkJCXhmc19kYV9idWZfZG9uZShkYnApOworCQkJCWVycm9yID0gMDsKKwkJCX0KKwkJCXhmc19kaXIyX2xlYWZfY2hlY2soZHAsIGxicCk7CisJCQl4ZnNfZGFfYnVmX2RvbmUobGJwKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQlkYnAgPSBOVUxMOworCQkvKgorCQkgKiBJZiB0aGlzIGlzIHRoZSBsYXN0IGRhdGEgYmxvY2sgdGhlbiBjb21wYWN0IHRoZQorCQkgKiBiZXN0cyB0YWJsZSBieSBnZXR0aW5nIHJpZCBvZiBlbnRyaWVzLgorCQkgKi8KKwkJaWYgKGRiID09IElOVF9HRVQobHRwLT5iZXN0Y291bnQsIEFSQ0hfQ09OVkVSVCkgLSAxKSB7CisJCQkvKgorCQkJICogTG9vayBmb3IgdGhlIGxhc3QgYWN0aXZlIGVudHJ5IChpKS4KKwkJCSAqLworCQkJZm9yIChpID0gZGIgLSAxOyBpID4gMDsgaS0tKSB7CisJCQkJaWYgKElOVF9HRVQoYmVzdHNwW2ldLCBBUkNIX0NPTlZFUlQpICE9IE5VTExEQVRBT0ZGKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCS8qCisJCQkgKiBDb3B5IHRoZSB0YWJsZSBkb3duIHNvIGluYWN0aXZlIGVudHJpZXMgYXQgdGhlCisJCQkgKiBlbmQgYXJlIHJlbW92ZWQuCisJCQkgKi8KKwkJCW1lbW1vdmUoJmJlc3RzcFtkYiAtIGldLCBiZXN0c3AsCisJCQkJKElOVF9HRVQobHRwLT5iZXN0Y291bnQsIEFSQ0hfQ09OVkVSVCkgLSAoZGIgLSBpKSkgKiBzaXplb2YoKmJlc3RzcCkpOworCQkJSU5UX01PRChsdHAtPmJlc3Rjb3VudCwgQVJDSF9DT05WRVJULCAtKGRiIC0gaSkpOworCQkJeGZzX2RpcjJfbGVhZl9sb2dfdGFpbCh0cCwgbGJwKTsKKwkJCXhmc19kaXIyX2xlYWZfbG9nX2Jlc3RzKHRwLCBsYnAsIDAsIElOVF9HRVQobHRwLT5iZXN0Y291bnQsIEFSQ0hfQ09OVkVSVCkgLSAxKTsKKwkJfSBlbHNlCisJCQlJTlRfU0VUKGJlc3RzcFtkYl0sIEFSQ0hfQ09OVkVSVCwgTlVMTERBVEFPRkYpOworCX0KKwkvKgorCSAqIElmIHRoZSBkYXRhIGJsb2NrIHdhcyBub3QgdGhlIGZpcnN0IG9uZSwgZHJvcCBpdC4KKwkgKi8KKwllbHNlIGlmIChkYiAhPSBtcC0+bV9kaXJkYXRhYmxrICYmIGRicCAhPSBOVUxMKSB7CisJCXhmc19kYV9idWZfZG9uZShkYnApOworCQlkYnAgPSBOVUxMOworCX0KKwl4ZnNfZGlyMl9sZWFmX2NoZWNrKGRwLCBsYnApOworCS8qCisJICogU2VlIGlmIHdlIGNhbiBjb252ZXJ0IHRvIGJsb2NrIGZvcm0uCisJICovCisJcmV0dXJuIHhmc19kaXIyX2xlYWZfdG9fYmxvY2soYXJncywgbGJwLCBkYnApOworfQorCisvKgorICogUmVwbGFjZSB0aGUgaW5vZGUgbnVtYmVyIGluIGEgbGVhZiBmb3JtYXQgZGlyZWN0b3J5IGVudHJ5LgorICovCitpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2RpcjJfbGVhZl9yZXBsYWNlKAorCXhmc19kYV9hcmdzX3QJCSphcmdzKQkJLyogb3BlcmF0aW9uIGFyZ3VtZW50cyAqLworeworCXhmc19kYWJ1Zl90CQkqZGJwOwkJLyogZGF0YSBibG9jayBidWZmZXIgKi8KKwl4ZnNfZGlyMl9kYXRhX2VudHJ5X3QJKmRlcDsJCS8qIGRhdGEgYmxvY2sgZW50cnkgKi8KKwl4ZnNfaW5vZGVfdAkJKmRwOwkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLworCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIGNvZGUgKi8KKwlpbnQJCQlpbmRleDsJCS8qIGluZGV4IG9mIGxlYWYgZW50cnkgKi8KKwl4ZnNfZGFidWZfdAkJKmxicDsJCS8qIGxlYWYgYnVmZmVyICovCisJeGZzX2RpcjJfbGVhZl90CQkqbGVhZjsJCS8qIGxlYWYgc3RydWN0dXJlICovCisJeGZzX2RpcjJfbGVhZl9lbnRyeV90CSpsZXA7CQkvKiBsZWFmIGVudHJ5ICovCisJeGZzX3RyYW5zX3QJCSp0cDsJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKworCXhmc19kaXIyX3RyYWNlX2FyZ3MoImxlYWZfcmVwbGFjZSIsIGFyZ3MpOworCS8qCisJICogTG9vayB1cCB0aGUgZW50cnkuCisJICovCisJaWYgKChlcnJvciA9IHhmc19kaXIyX2xlYWZfbG9va3VwX2ludChhcmdzLCAmbGJwLCAmaW5kZXgsICZkYnApKSkgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCWRwID0gYXJncy0+ZHA7CisJbGVhZiA9IGxicC0+ZGF0YTsKKwkvKgorCSAqIFBvaW50IHRvIHRoZSBsZWFmIGVudHJ5LCBnZXQgZGF0YSBhZGRyZXNzIGZyb20gaXQuCisJICovCisJbGVwID0gJmxlYWYtPmVudHNbaW5kZXhdOworCS8qCisJICogUG9pbnQgdG8gdGhlIGRhdGEgZW50cnkuCisJICovCisJZGVwID0gKHhmc19kaXIyX2RhdGFfZW50cnlfdCAqKQorCSAgICAgICgoY2hhciAqKWRicC0+ZGF0YSArCisJICAgICAgIFhGU19ESVIyX0RBVEFQVFJfVE9fT0ZGKGRwLT5pX21vdW50LCBJTlRfR0VUKGxlcC0+YWRkcmVzcywgQVJDSF9DT05WRVJUKSkpOworCUFTU0VSVChhcmdzLT5pbnVtYmVyICE9IElOVF9HRVQoZGVwLT5pbnVtYmVyLCBBUkNIX0NPTlZFUlQpKTsKKwkvKgorCSAqIFB1dCB0aGUgbmV3IGlub2RlIG51bWJlciBpbiwgbG9nIGl0LgorCSAqLworCUlOVF9TRVQoZGVwLT5pbnVtYmVyLCBBUkNIX0NPTlZFUlQsIGFyZ3MtPmludW1iZXIpOworCXRwID0gYXJncy0+dHJhbnM7CisJeGZzX2RpcjJfZGF0YV9sb2dfZW50cnkodHAsIGRicCwgZGVwKTsKKwl4ZnNfZGFfYnVmX2RvbmUoZGJwKTsKKwl4ZnNfZGlyMl9sZWFmX2NoZWNrKGRwLCBsYnApOworCXhmc19kYV9icmVsc2UodHAsIGxicCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXR1cm4gaW5kZXggaW4gdGhlIGxlYWYgYmxvY2sgKGxicCkgd2hpY2ggaXMgZWl0aGVyIHRoZSBmaXJzdAorICogb25lIHdpdGggdGhpcyBoYXNoIHZhbHVlLCBvciBpZiB0aGVyZSBhcmUgbm9uZSwgdGhlIGluc2VydCBwb2ludAorICogZm9yIHRoYXQgaGFzaCB2YWx1ZS4KKyAqLworaW50CQkJCQkJLyogaW5kZXggdmFsdWUgKi8KK3hmc19kaXIyX2xlYWZfc2VhcmNoX2hhc2goCisJeGZzX2RhX2FyZ3NfdAkJKmFyZ3MsCQkvKiBvcGVyYXRpb24gYXJndW1lbnRzICovCisJeGZzX2RhYnVmX3QJCSpsYnApCQkvKiBsZWFmIGJ1ZmZlciAqLworeworCXhmc19kYWhhc2hfdAkJaGFzaD0wOwkJLyogaGFzaCBmcm9tIHRoaXMgZW50cnkgKi8KKwl4ZnNfZGFoYXNoX3QJCWhhc2h3YW50OwkvKiBoYXNoIHZhbHVlIGxvb2tpbmcgZm9yICovCisJaW50CQkJaGlnaDsJCS8qIGhpZ2ggbGVhZiBpbmRleCAqLworCWludAkJCWxvdzsJCS8qIGxvdyBsZWFmIGluZGV4ICovCisJeGZzX2RpcjJfbGVhZl90CQkqbGVhZjsJCS8qIGxlYWYgc3RydWN0dXJlICovCisJeGZzX2RpcjJfbGVhZl9lbnRyeV90CSpsZXA7CQkvKiBsZWFmIGVudHJ5ICovCisJaW50CQkJbWlkPTA7CQkvKiBjdXJyZW50IGxlYWYgaW5kZXggKi8KKworCWxlYWYgPSBsYnAtPmRhdGE7CisjaWZuZGVmIF9fS0VSTkVMX18KKwlpZiAoIWxlYWYtPmhkci5jb3VudCkKKwkJcmV0dXJuIDA7CisjZW5kaWYKKwkvKgorCSAqIE5vdGUsIHRoZSB0YWJsZSBjYW5ub3QgYmUgZW1wdHksIHNvIHdlIGhhdmUgdG8gZ28gdGhyb3VnaCB0aGUgbG9vcC4KKwkgKiBCaW5hcnkgc2VhcmNoIHRoZSBsZWFmIGVudHJpZXMgbG9va2luZyBmb3Igb3VyIGhhc2ggdmFsdWUuCisJICovCisJZm9yIChsZXAgPSBsZWFmLT5lbnRzLCBsb3cgPSAwLCBoaWdoID0gSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgLSAxLAorCQloYXNod2FudCA9IGFyZ3MtPmhhc2h2YWw7CisJICAgICBsb3cgPD0gaGlnaDsgKSB7CisJCW1pZCA9IChsb3cgKyBoaWdoKSA+PiAxOworCQlpZiAoKGhhc2ggPSBJTlRfR0VUKGxlcFttaWRdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkpID09IGhhc2h3YW50KQorCQkJYnJlYWs7CisJCWlmIChoYXNoIDwgaGFzaHdhbnQpCisJCQlsb3cgPSBtaWQgKyAxOworCQllbHNlCisJCQloaWdoID0gbWlkIC0gMTsKKwl9CisJLyoKKwkgKiBGb3VuZCBvbmUsIGJhY2sgdXAgdGhyb3VnaCBhbGwgdGhlIGVxdWFsIGhhc2ggdmFsdWVzLgorCSAqLworCWlmIChoYXNoID09IGhhc2h3YW50KSB7CisJCXdoaWxlIChtaWQgPiAwICYmIElOVF9HRVQobGVwW21pZCAtIDFdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkgPT0gaGFzaHdhbnQpIHsKKwkJCW1pZC0tOworCQl9CisJfQorCS8qCisJICogTmVlZCB0byBwb2ludCB0byBhbiBlbnRyeSBoaWdoZXIgdGhhbiBvdXJzLgorCSAqLworCWVsc2UgaWYgKGhhc2ggPCBoYXNod2FudCkKKwkJbWlkKys7CisJcmV0dXJuIG1pZDsKK30KKworLyoKKyAqIFRyaW0gb2ZmIGEgdHJhaWxpbmcgZGF0YSBibG9jay4gIFdlIGtub3cgaXQncyBlbXB0eSBzaW5jZSB0aGUgbGVhZgorICogZnJlZXNwYWNlIHRhYmxlIHNheXMgc28uCisgKi8KK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9sZWFmX3RyaW1fZGF0YSgKKwl4ZnNfZGFfYXJnc190CQkqYXJncywJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KKwl4ZnNfZGFidWZfdAkJKmxicCwJCS8qIGxlYWYgYnVmZmVyICovCisJeGZzX2RpcjJfZGJfdAkJZGIpCQkvKiBkYXRhIGJsb2NrIG51bWJlciAqLworeworCXhmc19kaXIyX2RhdGFfb2ZmX3QJKmJlc3RzcDsJLyogbGVhZiBiZXN0cyB0YWJsZSAqLworI2lmZGVmIERFQlVHCisJeGZzX2RpcjJfZGF0YV90CQkqZGF0YTsJCS8qIGRhdGEgYmxvY2sgc3RydWN0dXJlICovCisjZW5kaWYKKwl4ZnNfZGFidWZfdAkJKmRicDsJCS8qIGRhdGEgYmxvY2sgYnVmZmVyICovCisJeGZzX2lub2RlX3QJCSpkcDsJCS8qIGluY29yZSBkaXJlY3RvcnkgaW5vZGUgKi8KKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCXhmc19kaXIyX2xlYWZfdAkJKmxlYWY7CQkvKiBsZWFmIHN0cnVjdHVyZSAqLworCXhmc19kaXIyX2xlYWZfdGFpbF90CSpsdHA7CQkvKiBsZWFmIHRhaWwgc3RydWN0dXJlICovCisJeGZzX21vdW50X3QJCSptcDsJCS8qIGZpbGVzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl4ZnNfdHJhbnNfdAkJKnRwOwkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCisJZHAgPSBhcmdzLT5kcDsKKwltcCA9IGRwLT5pX21vdW50OworCXRwID0gYXJncy0+dHJhbnM7CisJLyoKKwkgKiBSZWFkIHRoZSBvZmZlbmRpbmcgZGF0YSBibG9jay4gIFdlIG5lZWQgaXRzIGJ1ZmZlci4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2RhX3JlYWRfYnVmKHRwLCBkcCwgWEZTX0RJUjJfREJfVE9fREEobXAsIGRiKSwgLTEsICZkYnAsCisJCQlYRlNfREFUQV9GT1JLKSkpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKyNpZmRlZiBERUJVRworCWRhdGEgPSBkYnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQoZGF0YS0+aGRyLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0RBVEFfTUFHSUMpOworI2VuZGlmCisJLyogdGhpcyBzZWVtcyB0byBiZSBhbiBlcnJvcgorCSAqIGRhdGEgaXMgb25seSB2YWxpZCBpZiBERUJVRyBpcyBkZWZpbmVkPworCSAqIFJNQyAwOS8wOC8xOTk5CisJICovCisKKwlsZWFmID0gbGJwLT5kYXRhOworCWx0cCA9IFhGU19ESVIyX0xFQUZfVEFJTF9QKG1wLCBsZWFmKTsKKwlBU1NFUlQoSU5UX0dFVChkYXRhLT5oZHIuYmVzdGZyZWVbMF0ubGVuZ3RoLCBBUkNIX0NPTlZFUlQpID09CisJICAgICAgIG1wLT5tX2RpcmJsa3NpemUgLSAodWludClzaXplb2YoZGF0YS0+aGRyKSk7CisJQVNTRVJUKGRiID09IElOVF9HRVQobHRwLT5iZXN0Y291bnQsIEFSQ0hfQ09OVkVSVCkgLSAxKTsKKwkvKgorCSAqIEdldCByaWQgb2YgdGhlIGRhdGEgYmxvY2suCisJICovCisJaWYgKChlcnJvciA9IHhmc19kaXIyX3Nocmlua19pbm9kZShhcmdzLCBkYiwgZGJwKSkpIHsKKwkJQVNTRVJUKGVycm9yICE9IEVOT1NQQyk7CisJCXhmc19kYV9icmVsc2UodHAsIGRicCk7CisJCXJldHVybiBlcnJvcjsKKwl9CisJLyoKKwkgKiBFbGltaW5hdGUgdGhlIGxhc3QgYmVzdHMgZW50cnkgZnJvbSB0aGUgdGFibGUuCisJICovCisJYmVzdHNwID0gWEZTX0RJUjJfTEVBRl9CRVNUU19QKGx0cCk7CisJSU5UX01PRChsdHAtPmJlc3Rjb3VudCwgQVJDSF9DT05WRVJULCAtMSk7CisJbWVtbW92ZSgmYmVzdHNwWzFdLCAmYmVzdHNwWzBdLCBJTlRfR0VUKGx0cC0+YmVzdGNvdW50LCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpiZXN0c3ApKTsKKwl4ZnNfZGlyMl9sZWFmX2xvZ190YWlsKHRwLCBsYnApOworCXhmc19kaXIyX2xlYWZfbG9nX2Jlc3RzKHRwLCBsYnAsIDAsIElOVF9HRVQobHRwLT5iZXN0Y291bnQsIEFSQ0hfQ09OVkVSVCkgLSAxKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENvbnZlcnQgbm9kZSBmb3JtIGRpcmVjdG9yeSB0byBsZWFmIGZvcm0gZGlyZWN0b3J5LgorICogVGhlIHJvb3Qgb2YgdGhlIG5vZGUgZm9ybSBkaXIgbmVlZHMgdG8gYWxyZWFkeSBiZSBhIExFQUZOIGJsb2NrLgorICogSnVzdCByZXR1cm4gaWYgd2UgY2FuJ3QgZG8gYW55dGhpbmcuCisgKi8KK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9ub2RlX3RvX2xlYWYoCisJeGZzX2RhX3N0YXRlX3QJCSpzdGF0ZSkJCS8qIGRpcmVjdG9yeSBvcGVyYXRpb24gc3RhdGUgKi8KK3sKKwl4ZnNfZGFfYXJnc190CQkqYXJnczsJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KKwl4ZnNfaW5vZGVfdAkJKmRwOwkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLworCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIGNvZGUgKi8KKwl4ZnNfZGFidWZfdAkJKmZicDsJCS8qIGJ1ZmZlciBmb3IgZnJlZXNwYWNlIGJsb2NrICovCisJeGZzX2ZpbGVvZmZfdAkJZm87CQkvKiBmcmVlc3BhY2UgZmlsZSBvZmZzZXQgKi8KKwl4ZnNfZGlyMl9mcmVlX3QJCSpmcmVlOwkJLyogZnJlZXNwYWNlIHN0cnVjdHVyZSAqLworCXhmc19kYWJ1Zl90CQkqbGJwOwkJLyogYnVmZmVyIGZvciBsZWFmIGJsb2NrICovCisJeGZzX2RpcjJfbGVhZl90YWlsX3QJKmx0cDsJCS8qIHRhaWwgb2YgbGVhZiBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9sZWFmX3QJCSpsZWFmOwkJLyogbGVhZiBzdHJ1Y3R1cmUgKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLworCWludAkJCXJ2YWw7CQkvKiBzdWNjZXNzZnVsIGZyZWUgdHJpbT8gKi8KKwl4ZnNfdHJhbnNfdAkJKnRwOwkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCisJLyoKKwkgKiBUaGVyZSdzIG1vcmUgdGhhbiBhIGxlYWYgbGV2ZWwgaW4gdGhlIGJ0cmVlLCBzbyB0aGVyZSBtdXN0CisJICogYmUgbXVsdGlwbGUgbGVhZm4gYmxvY2tzLiAgR2l2ZSB1cC4KKwkgKi8KKwlpZiAoc3RhdGUtPnBhdGguYWN0aXZlID4gMSkKKwkJcmV0dXJuIDA7CisJYXJncyA9IHN0YXRlLT5hcmdzOworCXhmc19kaXIyX3RyYWNlX2FyZ3MoIm5vZGVfdG9fbGVhZiIsIGFyZ3MpOworCW1wID0gc3RhdGUtPm1wOworCWRwID0gYXJncy0+ZHA7CisJdHAgPSBhcmdzLT50cmFuczsKKwkvKgorCSAqIEdldCB0aGUgbGFzdCBvZmZzZXQgaW4gdGhlIGZpbGUuCisJICovCisJaWYgKChlcnJvciA9IHhmc19ibWFwX2xhc3Rfb2Zmc2V0KHRwLCBkcCwgJmZvLCBYRlNfREFUQV9GT1JLKSkpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlmbyAtPSBtcC0+bV9kaXJibGtmc2JzOworCS8qCisJICogSWYgdGhlcmUgYXJlIGZyZWVzcGFjZSBibG9ja3Mgb3RoZXIgdGhhbiB0aGUgZmlyc3Qgb25lLAorCSAqIHRha2UgdGhpcyBvcHBvcnR1bml0eSB0byByZW1vdmUgdHJhaWxpbmcgZW1wdHkgZnJlZXNwYWNlIGJsb2NrcworCSAqIHRoYXQgbWF5IGhhdmUgYmVlbiBsZWZ0IGJlaGluZCBkdXJpbmcgbm8tc3BhY2UtcmVzZXJ2YXRpb24KKwkgKiBvcGVyYXRpb25zLgorCSAqLworCXdoaWxlIChmbyA+IG1wLT5tX2RpcmZyZWVibGspIHsKKwkJaWYgKChlcnJvciA9IHhmc19kaXIyX25vZGVfdHJpbV9mcmVlKGFyZ3MsIGZvLCAmcnZhbCkpKSB7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJaWYgKHJ2YWwpCisJCQlmbyAtPSBtcC0+bV9kaXJibGtmc2JzOworCQllbHNlCisJCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBOb3cgZmluZCB0aGUgYmxvY2sganVzdCBiZWZvcmUgdGhlIGZyZWVzcGFjZSBibG9jay4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2JtYXBfbGFzdF9iZWZvcmUodHAsIGRwLCAmZm8sIFhGU19EQVRBX0ZPUkspKSkgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCS8qCisJICogSWYgaXQncyBub3QgdGhlIHNpbmdsZSBsZWFmIGJsb2NrLCBnaXZlIHVwLgorCSAqLworCWlmIChYRlNfRlNCX1RPX0IobXAsIGZvKSA+IFhGU19ESVIyX0xFQUZfT0ZGU0VUICsgbXAtPm1fZGlyYmxrc2l6ZSkKKwkJcmV0dXJuIDA7CisJbGJwID0gc3RhdGUtPnBhdGguYmxrWzBdLmJwOworCWxlYWYgPSBsYnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQobGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfTEVBRk5fTUFHSUMpOworCS8qCisJICogUmVhZCB0aGUgZnJlZXNwYWNlIGJsb2NrLgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfZGFfcmVhZF9idWYodHAsIGRwLCBtcC0+bV9kaXJmcmVlYmxrLCAtMSwgJmZicCwKKwkJCVhGU19EQVRBX0ZPUkspKSkgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCWZyZWUgPSBmYnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQoZnJlZS0+aGRyLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0ZSRUVfTUFHSUMpOworCUFTU0VSVCghZnJlZS0+aGRyLmZpcnN0ZGIpOworCS8qCisJICogTm93IHNlZSBpZiB0aGUgbGVhZm4gYW5kIGZyZWUgZGF0YSB3aWxsIGZpdCBpbiBhIGxlYWYxLgorCSAqIElmIG5vdCwgcmVsZWFzZSB0aGUgYnVmZmVyIGFuZCBnaXZlIHVwLgorCSAqLworCWlmICgodWludClzaXplb2YobGVhZi0+aGRyKSArCisJICAgIChJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAtIElOVF9HRVQobGVhZi0+aGRyLnN0YWxlLCBBUkNIX0NPTlZFUlQpKSAqICh1aW50KXNpemVvZihsZWFmLT5lbnRzWzBdKSArCisJICAgIElOVF9HRVQoZnJlZS0+aGRyLm52YWxpZCwgQVJDSF9DT05WRVJUKSAqICh1aW50KXNpemVvZihsZWFmLT5iZXN0c1swXSkgKworCSAgICAodWludClzaXplb2YobGVhZi0+dGFpbCkgPgorCSAgICBtcC0+bV9kaXJibGtzaXplKSB7CisJCXhmc19kYV9icmVsc2UodHAsIGZicCk7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIElmIHRoZSBsZWFmIGhhcyBhbnkgc3RhbGUgZW50cmllcyBpbiBpdCwgY29tcHJlc3MgdGhlbSBvdXQuCisJICogVGhlIGNvbXBhY3Qgcm91dGluZSB3aWxsIGxvZyB0aGUgaGVhZGVyLgorCSAqLworCWlmIChJTlRfR0VUKGxlYWYtPmhkci5zdGFsZSwgQVJDSF9DT05WRVJUKSkKKwkJeGZzX2RpcjJfbGVhZl9jb21wYWN0KGFyZ3MsIGxicCk7CisJZWxzZQorCQl4ZnNfZGlyMl9sZWFmX2xvZ19oZWFkZXIodHAsIGxicCk7CisJSU5UX1NFVChsZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJULCBYRlNfRElSMl9MRUFGMV9NQUdJQyk7CisJLyoKKwkgKiBTZXQgdXAgdGhlIGxlYWYgdGFpbCBmcm9tIHRoZSBmcmVlc3BhY2UgYmxvY2suCisJICovCisJbHRwID0gWEZTX0RJUjJfTEVBRl9UQUlMX1AobXAsIGxlYWYpOworCUlOVF9DT1BZKGx0cC0+YmVzdGNvdW50LCBmcmVlLT5oZHIubnZhbGlkLCBBUkNIX0NPTlZFUlQpOworCS8qCisJICogU2V0IHVwIHRoZSBsZWFmIGJlc3RzIHRhYmxlLgorCSAqLworCW1lbWNweShYRlNfRElSMl9MRUFGX0JFU1RTX1AobHRwKSwgZnJlZS0+YmVzdHMsCisJCUlOVF9HRVQobHRwLT5iZXN0Y291bnQsIEFSQ0hfQ09OVkVSVCkgKiBzaXplb2YobGVhZi0+YmVzdHNbMF0pKTsKKwl4ZnNfZGlyMl9sZWFmX2xvZ19iZXN0cyh0cCwgbGJwLCAwLCBJTlRfR0VUKGx0cC0+YmVzdGNvdW50LCBBUkNIX0NPTlZFUlQpIC0gMSk7CisJeGZzX2RpcjJfbGVhZl9sb2dfdGFpbCh0cCwgbGJwKTsKKwl4ZnNfZGlyMl9sZWFmX2NoZWNrKGRwLCBsYnApOworCS8qCisJICogR2V0IHJpZCBvZiB0aGUgZnJlZXNwYWNlIGJsb2NrLgorCSAqLworCWVycm9yID0geGZzX2RpcjJfc2hyaW5rX2lub2RlKGFyZ3MsIFhGU19ESVIyX0ZSRUVfRklSU1REQihtcCksIGZicCk7CisJaWYgKGVycm9yKSB7CisJCS8qCisJCSAqIFRoaXMgY2FuJ3QgZmFpbCBoZXJlIGJlY2F1c2UgaXQgY2FuIG9ubHkgaGFwcGVuIHdoZW4KKwkJICogcHVuY2hpbmcgb3V0IHRoZSBtaWRkbGUgb2YgYW4gZXh0ZW50LCBhbmQgdGhpcyBpcyBhbgorCQkgKiBpc29sYXRlZCBibG9jay4KKwkJICovCisJCUFTU0VSVChlcnJvciAhPSBFTk9TUEMpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCWZicCA9IE5VTEw7CisJLyoKKwkgKiBOb3cgc2VlIGlmIHdlIGNhbiBjb252ZXJ0IHRoZSBzaW5nbGUtbGVhZiBkaXJlY3RvcnkKKwkgKiBkb3duIHRvIGEgYmxvY2sgZm9ybSBkaXJlY3RvcnkuCisJICogVGhpcyByb3V0aW5lIGFsd2F5cyBraWxscyB0aGUgZGFidWYgZm9yIHRoZSBsZWFmLCBzbworCSAqIGVsaW1pbmF0ZSBpdCBmcm9tIHRoZSBwYXRoLgorCSAqLworCWVycm9yID0geGZzX2RpcjJfbGVhZl90b19ibG9jayhhcmdzLCBsYnAsIE5VTEwpOworCXN0YXRlLT5wYXRoLmJsa1swXS5icCA9IE5VTEw7CisJcmV0dXJuIGVycm9yOworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXIyX2xlYWYuaCBiL2ZzL3hmcy94ZnNfZGlyMl9sZWFmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YyMGVlZQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfZGlyMl9sZWFmLmgKQEAgLTAsMCArMSwzNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX0RJUjJfTEVBRl9IX18KKyNkZWZpbmUJX19YRlNfRElSMl9MRUFGX0hfXworCisvKgorICogRGlyZWN0b3J5IHZlcnNpb24gMiwgbGVhZiBibG9jayBzdHJ1Y3R1cmVzLgorICovCisKK3N0cnVjdCB1aW87CitzdHJ1Y3QgeGZzX2RhYnVmOworc3RydWN0IHhmc19kYV9hcmdzOworc3RydWN0IHhmc19pbm9kZTsKK3N0cnVjdCB4ZnNfbW91bnQ7CitzdHJ1Y3QgeGZzX3RyYW5zOworCisvKgorICogQ29uc3RhbnRzLgorICovCisKKy8qCisgKiBPZmZzZXQgb2YgdGhlIGxlYWYvbm9kZSBzcGFjZS4gIEZpcnN0IGJsb2NrIGluIHRoaXMgc3BhY2UKKyAqIGlzIHRoZSBidHJlZSByb290LgorICovCisjZGVmaW5lCVhGU19ESVIyX0xFQUZfU1BBQ0UJMQorI2RlZmluZQlYRlNfRElSMl9MRUFGX09GRlNFVAkoWEZTX0RJUjJfTEVBRl9TUEFDRSAqIFhGU19ESVIyX1NQQUNFX1NJWkUpCisjZGVmaW5lCVhGU19ESVIyX0xFQUZfRklSU1REQihtcCkJXAorCVhGU19ESVIyX0JZVEVfVE9fREIobXAsIFhGU19ESVIyX0xFQUZfT0ZGU0VUKQorCisvKgorICogVHlwZXMuCisgKi8KKworLyoKKyAqIE9mZnNldCBpbiBkYXRhIHNwYWNlIG9mIGEgZGF0YSBlbnRyeS4KKyAqLwordHlwZWRlZglfX3VpbnQzMl90CXhmc19kaXIyX2RhdGFwdHJfdDsKKyNkZWZpbmUJWEZTX0RJUjJfTUFYX0RBVEFQVFIJKCh4ZnNfZGlyMl9kYXRhcHRyX3QpMHhmZmZmZmZmZikKKyNkZWZpbmUJWEZTX0RJUjJfTlVMTF9EQVRBUFRSCSgoeGZzX2RpcjJfZGF0YXB0cl90KTApCisKKy8qCisgKiBTdHJ1Y3R1cmVzLgorICovCisKKy8qCisgKiBMZWFmIGJsb2NrIGhlYWRlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RpcjJfbGVhZl9oZHIgeworCXhmc19kYV9ibGtpbmZvX3QJaW5mbzsJCS8qIGhlYWRlciBmb3IgZGEgcm91dGluZXMgKi8KKwlfX3VpbnQxNl90CQljb3VudDsJCS8qIGNvdW50IG9mIGVudHJpZXMgKi8KKwlfX3VpbnQxNl90CQlzdGFsZTsJCS8qIGNvdW50IG9mIHN0YWxlIGVudHJpZXMgKi8KK30geGZzX2RpcjJfbGVhZl9oZHJfdDsKKworLyoKKyAqIExlYWYgYmxvY2sgZW50cnkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19kaXIyX2xlYWZfZW50cnkgeworCXhmc19kYWhhc2hfdAkJaGFzaHZhbDsJLyogaGFzaCB2YWx1ZSBvZiBuYW1lICovCisJeGZzX2RpcjJfZGF0YXB0cl90CWFkZHJlc3M7CS8qIGFkZHJlc3Mgb2YgZGF0YSBlbnRyeSAqLworfSB4ZnNfZGlyMl9sZWFmX2VudHJ5X3Q7CisKKy8qCisgKiBMZWFmIGJsb2NrIHRhaWwuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19kaXIyX2xlYWZfdGFpbCB7CisJX191aW50MzJfdAkJYmVzdGNvdW50OworfSB4ZnNfZGlyMl9sZWFmX3RhaWxfdDsKKworLyoKKyAqIExlYWYgYmxvY2suCisgKiBiZXN0cyBhbmQgdGFpbCBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgYmxvY2sgZm9yIHNpbmdsZS1sZWFmIG9ubHkKKyAqIChtYWdpYyA9IFhGU19ESVIyX0xFQUYxX01BR0lDIG5vdCBYRlNfRElSMl9MRUFGTl9NQUdJQykuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19kaXIyX2xlYWYgeworCXhmc19kaXIyX2xlYWZfaGRyX3QJaGRyOwkJLyogbGVhZiBoZWFkZXIgKi8KKwl4ZnNfZGlyMl9sZWFmX2VudHJ5X3QJZW50c1sxXTsJLyogZW50cmllcyAqLworCQkJCQkJLyogLi4uICovCisJeGZzX2RpcjJfZGF0YV9vZmZfdAliZXN0c1sxXTsJLyogYmVzdCBmcmVlIGNvdW50cyAqLworCXhmc19kaXIyX2xlYWZfdGFpbF90CXRhaWw7CQkvKiBsZWFmIHRhaWwgKi8KK30geGZzX2RpcjJfbGVhZl90OworCisvKgorICogTWFjcm9zLgorICogVGhlIERCIGJsb2NrcyBhcmUgbG9naWNhbCBkaXJlY3RvcnkgYmxvY2sgbnVtYmVycywgbm90IGZpbGVzeXN0ZW0gYmxvY2tzLgorICovCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUjJfTUFYX0xFQUZfRU5UUykKK2ludAoreGZzX2RpcjJfbWF4X2xlYWZfZW50cyhzdHJ1Y3QgeGZzX21vdW50ICptcCk7CisjZGVmaW5lCVhGU19ESVIyX01BWF9MRUFGX0VOVFMobXApCVwKKwl4ZnNfZGlyMl9tYXhfbGVhZl9lbnRzKG1wKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0RJUjJfTUFYX0xFQUZfRU5UUyhtcCkJXAorCSgoaW50KSgoKG1wKS0+bV9kaXJibGtzaXplIC0gKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2xlYWZfaGRyX3QpKSAvIFwKKwkgICAgICAgKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2xlYWZfZW50cnlfdCkpKQorI2VuZGlmCisKKy8qCisgKiBHZXQgYWRkcmVzcyBvZiB0aGUgYmVzdGNvdW50IGZpZWxkIGluIHRoZSBzaW5nbGUtbGVhZiBibG9jay4KKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9MRUFGX1RBSUxfUCkKK3hmc19kaXIyX2xlYWZfdGFpbF90ICoKK3hmc19kaXIyX2xlYWZfdGFpbF9wKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGlyMl9sZWFmX3QgKmxwKTsKKyNkZWZpbmUJWEZTX0RJUjJfTEVBRl9UQUlMX1AobXAsbHApCVwKKwl4ZnNfZGlyMl9sZWFmX3RhaWxfcChtcCwgbHApCisjZWxzZQorI2RlZmluZQlYRlNfRElSMl9MRUFGX1RBSUxfUChtcCxscCkJXAorCSgoeGZzX2RpcjJfbGVhZl90YWlsX3QgKilcCisJICgoY2hhciAqKShscCkgKyAobXApLT5tX2RpcmJsa3NpemUgLSBcCisJICAodWludClzaXplb2YoeGZzX2RpcjJfbGVhZl90YWlsX3QpKSkKKyNlbmRpZgorCisvKgorICogR2V0IGFkZHJlc3Mgb2YgdGhlIGJlc3RzIGFycmF5IGluIHRoZSBzaW5nbGUtbGVhZiBibG9jay4KKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9MRUFGX0JFU1RTX1ApCit4ZnNfZGlyMl9kYXRhX29mZl90ICoKK3hmc19kaXIyX2xlYWZfYmVzdHNfcCh4ZnNfZGlyMl9sZWFmX3RhaWxfdCAqbHRwKTsKKyNkZWZpbmUJWEZTX0RJUjJfTEVBRl9CRVNUU19QKGx0cCkJeGZzX2RpcjJfbGVhZl9iZXN0c19wKGx0cCkKKyNlbHNlCisjZGVmaW5lCVhGU19ESVIyX0xFQUZfQkVTVFNfUChsdHApCVwKKwkoKHhmc19kaXIyX2RhdGFfb2ZmX3QgKikobHRwKSAtIElOVF9HRVQoKGx0cCktPmJlc3Rjb3VudCwgQVJDSF9DT05WRVJUKSkKKyNlbmRpZgorCisvKgorICogQ29udmVydCBkYXRhcHRyIHRvIGJ5dGUgaW4gZmlsZSBzcGFjZQorICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVIyX0RBVEFQVFJfVE9fQllURSkKK3hmc19kaXIyX29mZl90Cit4ZnNfZGlyMl9kYXRhcHRyX3RvX2J5dGUoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19kaXIyX2RhdGFwdHJfdCBkcCk7CisjZGVmaW5lCVhGU19ESVIyX0RBVEFQVFJfVE9fQllURShtcCxkcCkJeGZzX2RpcjJfZGF0YXB0cl90b19ieXRlKG1wLCBkcCkKKyNlbHNlCisjZGVmaW5lCVhGU19ESVIyX0RBVEFQVFJfVE9fQllURShtcCxkcCkJXAorCSgoeGZzX2RpcjJfb2ZmX3QpKGRwKSA8PCBYRlNfRElSMl9EQVRBX0FMSUdOX0xPRykKKyNlbmRpZgorCisvKgorICogQ29udmVydCBieXRlIGluIGZpbGUgc3BhY2UgdG8gZGF0YXB0ci4gIEl0IGhhZCBiZXR0ZXIgYmUgYWxpZ25lZC4KKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9CWVRFX1RPX0RBVEFQVFIpCit4ZnNfZGlyMl9kYXRhcHRyX3QKK3hmc19kaXIyX2J5dGVfdG9fZGF0YXB0cihzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RpcjJfb2ZmX3QgYnkpOworI2RlZmluZQlYRlNfRElSMl9CWVRFX1RPX0RBVEFQVFIobXAsYnkpCXhmc19kaXIyX2J5dGVfdG9fZGF0YXB0cihtcCxieSkKKyNlbHNlCisjZGVmaW5lCVhGU19ESVIyX0JZVEVfVE9fREFUQVBUUihtcCxieSkJXAorCSgoeGZzX2RpcjJfZGF0YXB0cl90KSgoYnkpID4+IFhGU19ESVIyX0RBVEFfQUxJR05fTE9HKSkKKyNlbmRpZgorCisvKgorICogQ29udmVydCBkYXRhcHRyIHRvIGEgYmxvY2sgbnVtYmVyCisgKi8KKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUjJfREFUQVBUUl9UT19EQikKK3hmc19kaXIyX2RiX3QKK3hmc19kaXIyX2RhdGFwdHJfdG9fZGIoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19kaXIyX2RhdGFwdHJfdCBkcCk7CisjZGVmaW5lCVhGU19ESVIyX0RBVEFQVFJfVE9fREIobXAsZHApCXhmc19kaXIyX2RhdGFwdHJfdG9fZGIobXAsIGRwKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0RJUjJfREFUQVBUUl9UT19EQihtcCxkcCkJXAorCVhGU19ESVIyX0JZVEVfVE9fREIobXAsIFhGU19ESVIyX0RBVEFQVFJfVE9fQllURShtcCwgZHApKQorI2VuZGlmCisKKy8qCisgKiBDb252ZXJ0IGRhdGFwdHIgdG8gYSBieXRlIG9mZnNldCBpbiBhIGJsb2NrCisgKi8KKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUjJfREFUQVBUUl9UT19PRkYpCit4ZnNfZGlyMl9kYXRhX2FvZmZfdAoreGZzX2RpcjJfZGF0YXB0cl90b19vZmYoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19kaXIyX2RhdGFwdHJfdCBkcCk7CisjZGVmaW5lCVhGU19ESVIyX0RBVEFQVFJfVE9fT0ZGKG1wLGRwKQl4ZnNfZGlyMl9kYXRhcHRyX3RvX29mZihtcCwgZHApCisjZWxzZQorI2RlZmluZQlYRlNfRElSMl9EQVRBUFRSX1RPX09GRihtcCxkcCkJXAorCVhGU19ESVIyX0JZVEVfVE9fT0ZGKG1wLCBYRlNfRElSMl9EQVRBUFRSX1RPX0JZVEUobXAsIGRwKSkKKyNlbmRpZgorCisvKgorICogQ29udmVydCBibG9jayBhbmQgb2Zmc2V0IHRvIGJ5dGUgaW4gc3BhY2UKKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9EQl9PRkZfVE9fQllURSkKK3hmc19kaXIyX29mZl90Cit4ZnNfZGlyMl9kYl9vZmZfdG9fYnl0ZShzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RpcjJfZGJfdCBkYiwKKwkJCXhmc19kaXIyX2RhdGFfYW9mZl90IG8pOworI2RlZmluZQlYRlNfRElSMl9EQl9PRkZfVE9fQllURShtcCxkYixvKQlcCisJeGZzX2RpcjJfZGJfb2ZmX3RvX2J5dGUobXAsIGRiLCBvKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0RJUjJfREJfT0ZGX1RPX0JZVEUobXAsZGIsbykJXAorCSgoKHhmc19kaXIyX29mZl90KShkYikgPDwgXAorCSAoKG1wKS0+bV9zYi5zYl9ibG9ja2xvZyArIChtcCktPm1fc2Iuc2JfZGlyYmxrbG9nKSkgKyAobykpCisjZW5kaWYKKworLyoKKyAqIENvbnZlcnQgYnl0ZSBpbiBzcGFjZSB0byAoREIpIGJsb2NrCisgKi8KKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUjJfQllURV9UT19EQikKK3hmc19kaXIyX2RiX3QgeGZzX2RpcjJfYnl0ZV90b19kYihzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RpcjJfb2ZmX3QgYnkpOworI2RlZmluZQlYRlNfRElSMl9CWVRFX1RPX0RCKG1wLGJ5KQl4ZnNfZGlyMl9ieXRlX3RvX2RiKG1wLCBieSkKKyNlbHNlCisjZGVmaW5lCVhGU19ESVIyX0JZVEVfVE9fREIobXAsYnkpCVwKKwkoKHhmc19kaXIyX2RiX3QpKChieSkgPj4gXAorCQkJICgobXApLT5tX3NiLnNiX2Jsb2NrbG9nICsgKG1wKS0+bV9zYi5zYl9kaXJibGtsb2cpKSkKKyNlbmRpZgorCisvKgorICogQ29udmVydCBieXRlIGluIHNwYWNlIHRvIChEQSkgYmxvY2sKKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9CWVRFX1RPX0RBKQoreGZzX2RhYmxrX3QgeGZzX2RpcjJfYnl0ZV90b19kYShzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RpcjJfb2ZmX3QgYnkpOworI2RlZmluZQlYRlNfRElSMl9CWVRFX1RPX0RBKG1wLGJ5KQl4ZnNfZGlyMl9ieXRlX3RvX2RhKG1wLCBieSkKKyNlbHNlCisjZGVmaW5lCVhGU19ESVIyX0JZVEVfVE9fREEobXAsYnkpCVwKKwlYRlNfRElSMl9EQl9UT19EQShtcCwgWEZTX0RJUjJfQllURV9UT19EQihtcCwgYnkpKQorI2VuZGlmCisKKy8qCisgKiBDb252ZXJ0IGJ5dGUgaW4gc3BhY2UgdG8gb2Zmc2V0IGluIGEgYmxvY2sKKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9CWVRFX1RPX09GRikKK3hmc19kaXIyX2RhdGFfYW9mZl90Cit4ZnNfZGlyMl9ieXRlX3RvX29mZihzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RpcjJfb2ZmX3QgYnkpOworI2RlZmluZQlYRlNfRElSMl9CWVRFX1RPX09GRihtcCxieSkJeGZzX2RpcjJfYnl0ZV90b19vZmYobXAsIGJ5KQorI2Vsc2UKKyNkZWZpbmUJWEZTX0RJUjJfQllURV9UT19PRkYobXAsYnkpCVwKKwkoKHhmc19kaXIyX2RhdGFfYW9mZl90KSgoYnkpICYgXAorCQkJCSgoMSA8PCAoKG1wKS0+bV9zYi5zYl9ibG9ja2xvZyArIFwKKwkJCQkJKG1wKS0+bV9zYi5zYl9kaXJibGtsb2cpKSAtIDEpKSkKKyNlbmRpZgorCisvKgorICogQ29udmVydCBibG9jayBhbmQgb2Zmc2V0IHRvIGRhdGFwdHIKKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9EQl9PRkZfVE9fREFUQVBUUikKK3hmc19kaXIyX2RhdGFwdHJfdAoreGZzX2RpcjJfZGJfb2ZmX3RvX2RhdGFwdHIoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19kaXIyX2RiX3QgZGIsCisJCQkgICB4ZnNfZGlyMl9kYXRhX2FvZmZfdCBvKTsKKyNkZWZpbmUJWEZTX0RJUjJfREJfT0ZGX1RPX0RBVEFQVFIobXAsZGIsbykJXAorCXhmc19kaXIyX2RiX29mZl90b19kYXRhcHRyKG1wLCBkYiwgbykKKyNlbHNlCisjZGVmaW5lCVhGU19ESVIyX0RCX09GRl9UT19EQVRBUFRSKG1wLGRiLG8pCVwKKwlYRlNfRElSMl9CWVRFX1RPX0RBVEFQVFIobXAsIFhGU19ESVIyX0RCX09GRl9UT19CWVRFKG1wLCBkYiwgbykpCisjZW5kaWYKKworLyoKKyAqIENvbnZlcnQgYmxvY2sgKERCKSB0byBibG9jayAoZGFibGspCisgKi8KKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUjJfREJfVE9fREEpCit4ZnNfZGFibGtfdCB4ZnNfZGlyMl9kYl90b19kYShzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RpcjJfZGJfdCBkYik7CisjZGVmaW5lCVhGU19ESVIyX0RCX1RPX0RBKG1wLGRiKQl4ZnNfZGlyMl9kYl90b19kYShtcCwgZGIpCisjZWxzZQorI2RlZmluZQlYRlNfRElSMl9EQl9UT19EQShtcCxkYikJXAorCSgoeGZzX2RhYmxrX3QpKChkYikgPDwgKG1wKS0+bV9zYi5zYl9kaXJibGtsb2cpKQorI2VuZGlmCisKKy8qCisgKiBDb252ZXJ0IGJsb2NrIChkYWJsaykgdG8gYmxvY2sgKERCKQorICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVIyX0RBX1RPX0RCKQoreGZzX2RpcjJfZGJfdCB4ZnNfZGlyMl9kYV90b19kYihzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RhYmxrX3QgZGEpOworI2RlZmluZQlYRlNfRElSMl9EQV9UT19EQihtcCxkYSkJeGZzX2RpcjJfZGFfdG9fZGIobXAsIGRhKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0RJUjJfREFfVE9fREIobXAsZGEpCVwKKwkoKHhmc19kaXIyX2RiX3QpKChkYSkgPj4gKG1wKS0+bV9zYi5zYl9kaXJibGtsb2cpKQorI2VuZGlmCisKKy8qCisgKiBDb252ZXJ0IGJsb2NrIChkYWJsaykgdG8gYnl0ZSBvZmZzZXQgaW4gc3BhY2UKKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9EQV9UT19CWVRFKQoreGZzX2RpcjJfb2ZmX3QgeGZzX2RpcjJfZGFfdG9fYnl0ZShzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RhYmxrX3QgZGEpOworI2RlZmluZSBYRlNfRElSMl9EQV9UT19CWVRFKG1wLGRhKQl4ZnNfZGlyMl9kYV90b19ieXRlKG1wLCBkYSkKKyNlbHNlCisjZGVmaW5lCVhGU19ESVIyX0RBX1RPX0JZVEUobXAsZGEpCVwKKwlYRlNfRElSMl9EQl9PRkZfVE9fQllURShtcCwgWEZTX0RJUjJfREFfVE9fREIobXAsIGRhKSwgMCkKKyNlbmRpZgorCisvKgorICogRnVuY3Rpb24gZGVjbGFyYXRpb25zLgorICovCisKK2V4dGVybiBpbnQKKwl4ZnNfZGlyMl9ibG9ja190b19sZWFmKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywgc3RydWN0IHhmc19kYWJ1ZiAqZGJwKTsKKworZXh0ZXJuIGludAorCXhmc19kaXIyX2xlYWZfYWRkbmFtZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworCitleHRlcm4gdm9pZAorCXhmc19kaXIyX2xlYWZfY29tcGFjdChzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsIHN0cnVjdCB4ZnNfZGFidWYgKmJwKTsKKworZXh0ZXJuIHZvaWQKKwl4ZnNfZGlyMl9sZWFmX2NvbXBhY3RfeDEoc3RydWN0IHhmc19kYWJ1ZiAqYnAsIGludCAqaW5kZXhwLAorCQkJCSBpbnQgKmxvd3N0YWxlcCwgaW50ICpoaWdoc3RhbGVwLCBpbnQgKmxvd2xvZ3AsCisJCQkJIGludCAqaGlnaGxvZ3ApOworCitleHRlcm4gaW50CisJeGZzX2RpcjJfbGVhZl9nZXRkZW50cyhzdHJ1Y3QgeGZzX3RyYW5zICp0cCwgc3RydWN0IHhmc19pbm9kZSAqZHAsCisJCQkgICAgICAgc3RydWN0IHVpbyAqdWlvLCBpbnQgKmVvZnAsIHN0cnVjdCB4ZnNfZGlyZW50ICpkYnAsCisJCQkgICAgICAgeGZzX2RpcjJfcHV0X3QgcHV0KTsKKworZXh0ZXJuIGludAorCXhmc19kaXIyX2xlYWZfaW5pdChzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsIHhmc19kaXIyX2RiX3QgYm5vLAorCQkJICAgc3RydWN0IHhmc19kYWJ1ZiAqKmJwcCwgaW50IG1hZ2ljKTsKKworZXh0ZXJuIHZvaWQKKwl4ZnNfZGlyMl9sZWFmX2xvZ19lbnRzKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCBzdHJ1Y3QgeGZzX2RhYnVmICpicCwKKwkJCSAgICAgICBpbnQgZmlyc3QsIGludCBsYXN0KTsKKworZXh0ZXJuIHZvaWQKKwl4ZnNfZGlyMl9sZWFmX2xvZ19iZXN0cyhzdHJ1Y3QgeGZzX3RyYW5zICp0cCwgc3RydWN0IHhmc19kYWJ1ZiAqYnAsCisJCQkJaW50IGZpcnN0LCBpbnQgbGFzdCk7CisKK2V4dGVybiB2b2lkCisJeGZzX2RpcjJfbGVhZl9sb2dfaGVhZGVyKHN0cnVjdCB4ZnNfdHJhbnMgKnRwLCBzdHJ1Y3QgeGZzX2RhYnVmICpicCk7CisKK2V4dGVybiB2b2lkCisJeGZzX2RpcjJfbGVhZl9sb2dfdGFpbChzdHJ1Y3QgeGZzX3RyYW5zICp0cCwgc3RydWN0IHhmc19kYWJ1ZiAqYnApOworCitleHRlcm4gaW50CisJeGZzX2RpcjJfbGVhZl9sb29rdXAoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKKworZXh0ZXJuIGludAorCXhmc19kaXIyX2xlYWZfcmVtb3ZlbmFtZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworCitleHRlcm4gaW50CisJeGZzX2RpcjJfbGVhZl9yZXBsYWNlKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CisKK2V4dGVybiBpbnQKKwl4ZnNfZGlyMl9sZWFmX3NlYXJjaF9oYXNoKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywKKwkJCQkgIHN0cnVjdCB4ZnNfZGFidWYgKmxicCk7CitleHRlcm4gaW50CisJeGZzX2RpcjJfbGVhZl90cmltX2RhdGEoc3RydWN0IHhmc19kYV9hcmdzICphcmdzLCBzdHJ1Y3QgeGZzX2RhYnVmICpsYnAsCQkJCXhmc19kaXIyX2RiX3QgZGIpOworCitleHRlcm4gaW50CisJeGZzX2RpcjJfbm9kZV90b19sZWFmKHN0cnVjdCB4ZnNfZGFfc3RhdGUgKnN0YXRlKTsKKworI2VuZGlmCS8qIF9fWEZTX0RJUjJfTEVBRl9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGlyMl9ub2RlLmMgYi9mcy94ZnMveGZzX2RpcjJfbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NjE1ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2RpcjJfbm9kZS5jCkBAIC0wLDAgKzEsMjAyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA0IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworLyoKKyAqIHhmc19kaXIyX25vZGUuYworICogWEZTIGRpcmVjdG9yeSBpbXBsZW1lbnRhdGlvbiwgdmVyc2lvbiAyLCBub2RlIGZvcm0gZmlsZXMKKyAqIFNlZSBkYXRhIHN0cnVjdHVyZXMgaW4geGZzX2RpcjJfbm9kZS5oIGFuZCB4ZnNfZGFfYnRyZWUuaC4KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisKKyNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcC5oIgorI2luY2x1ZGUgInhmc19kYV9idHJlZS5oIgorI2luY2x1ZGUgInhmc19kaXIyX2RhdGEuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9sZWFmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfYmxvY2suaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9ub2RlLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfdHJhY2UuaCIKKyNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKKworLyoKKyAqIEZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4KKyAqLworc3RhdGljIHZvaWQgeGZzX2RpcjJfZnJlZV9sb2dfaGVhZGVyKHhmc190cmFuc190ICp0cCwgeGZzX2RhYnVmX3QgKmJwKTsKK3N0YXRpYyBpbnQgeGZzX2RpcjJfbGVhZm5fYWRkKHhmc19kYWJ1Zl90ICpicCwgeGZzX2RhX2FyZ3NfdCAqYXJncywgaW50IGluZGV4KTsKKyNpZmRlZiBERUJVRworc3RhdGljIHZvaWQgeGZzX2RpcjJfbGVhZm5fY2hlY2soeGZzX2lub2RlX3QgKmRwLCB4ZnNfZGFidWZfdCAqYnApOworI2Vsc2UKKyNkZWZpbmUJeGZzX2RpcjJfbGVhZm5fY2hlY2soZHAsIGJwKQorI2VuZGlmCitzdGF0aWMgdm9pZCB4ZnNfZGlyMl9sZWFmbl9tb3ZlZW50cyh4ZnNfZGFfYXJnc190ICphcmdzLCB4ZnNfZGFidWZfdCAqYnBfcywKKwkJCQkgICAgaW50IHN0YXJ0X3MsIHhmc19kYWJ1Zl90ICpicF9kLCBpbnQgc3RhcnRfZCwKKwkJCQkgICAgaW50IGNvdW50KTsKK3N0YXRpYyB2b2lkIHhmc19kaXIyX2xlYWZuX3JlYmFsYW5jZSh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUsCisJCQkJICAgICB4ZnNfZGFfc3RhdGVfYmxrX3QgKmJsazEsCisJCQkJICAgICB4ZnNfZGFfc3RhdGVfYmxrX3QgKmJsazIpOworc3RhdGljIGludCB4ZnNfZGlyMl9sZWFmbl9yZW1vdmUoeGZzX2RhX2FyZ3NfdCAqYXJncywgeGZzX2RhYnVmX3QgKmJwLAorCQkJCSBpbnQgaW5kZXgsIHhmc19kYV9zdGF0ZV9ibGtfdCAqZGJsaywKKwkJCQkgaW50ICpydmFsKTsKK3N0YXRpYyBpbnQgeGZzX2RpcjJfbm9kZV9hZGRuYW1lX2ludCh4ZnNfZGFfYXJnc190ICphcmdzLAorCQkJCSAgICAgeGZzX2RhX3N0YXRlX2Jsa190ICpmYmxrKTsKKworLyoKKyAqIExvZyBlbnRyaWVzIGZyb20gYSBmcmVlc3BhY2UgYmxvY2suCisgKi8KK3ZvaWQKK3hmc19kaXIyX2ZyZWVfbG9nX2Jlc3RzKAorCXhmc190cmFuc190CQkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2RhYnVmX3QJCSpicCwJCS8qIGZyZWVzcGFjZSBidWZmZXIgKi8KKwlpbnQJCQlmaXJzdCwJCS8qIGZpcnN0IGVudHJ5IHRvIGxvZyAqLworCWludAkJCWxhc3QpCQkvKiBsYXN0IGVudHJ5IHRvIGxvZyAqLworeworCXhmc19kaXIyX2ZyZWVfdAkJKmZyZWU7CQkvKiBmcmVlc3BhY2Ugc3RydWN0dXJlICovCisKKwlmcmVlID0gYnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQoZnJlZS0+aGRyLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0ZSRUVfTUFHSUMpOworCXhmc19kYV9sb2dfYnVmKHRwLCBicCwKKwkJKHVpbnQpKChjaGFyICopJmZyZWUtPmJlc3RzW2ZpcnN0XSAtIChjaGFyICopZnJlZSksCisJCSh1aW50KSgoY2hhciAqKSZmcmVlLT5iZXN0c1tsYXN0XSAtIChjaGFyICopZnJlZSArCisJCSAgICAgICBzaXplb2YoZnJlZS0+YmVzdHNbMF0pIC0gMSkpOworfQorCisvKgorICogTG9nIGhlYWRlciBmcm9tIGEgZnJlZXNwYWNlIGJsb2NrLgorICovCitzdGF0aWMgdm9pZAoreGZzX2RpcjJfZnJlZV9sb2dfaGVhZGVyKAorCXhmc190cmFuc190CQkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2RhYnVmX3QJCSpicCkJCS8qIGZyZWVzcGFjZSBidWZmZXIgKi8KK3sKKwl4ZnNfZGlyMl9mcmVlX3QJCSpmcmVlOwkJLyogZnJlZXNwYWNlIHN0cnVjdHVyZSAqLworCisJZnJlZSA9IGJwLT5kYXRhOworCUFTU0VSVChJTlRfR0VUKGZyZWUtPmhkci5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9GUkVFX01BR0lDKTsKKwl4ZnNfZGFfbG9nX2J1Zih0cCwgYnAsICh1aW50KSgoY2hhciAqKSZmcmVlLT5oZHIgLSAoY2hhciAqKWZyZWUpLAorCQkodWludCkoc2l6ZW9mKHhmc19kaXIyX2ZyZWVfaGRyX3QpIC0gMSkpOworfQorCisvKgorICogQ29udmVydCBhIGxlYWYtZm9ybWF0IGRpcmVjdG9yeSB0byBhIG5vZGUtZm9ybWF0IGRpcmVjdG9yeS4KKyAqIFdlIG5lZWQgdG8gY2hhbmdlIHRoZSBtYWdpYyBudW1iZXIgb2YgdGhlIGxlYWYgYmxvY2ssIGFuZCBjb3B5CisgKiB0aGUgZnJlZXNwYWNlIHRhYmxlIG91dCBvZiB0aGUgbGVhZiBibG9jayBpbnRvIGl0cyBvd24gYmxvY2suCisgKi8KK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9sZWFmX3RvX25vZGUoCisJeGZzX2RhX2FyZ3NfdAkJKmFyZ3MsCQkvKiBvcGVyYXRpb24gYXJndW1lbnRzICovCisJeGZzX2RhYnVmX3QJCSpsYnApCQkvKiBsZWFmIGJ1ZmZlciAqLworeworCXhmc19pbm9kZV90CQkqZHA7CQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCisJaW50CQkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwl4ZnNfZGFidWZfdAkJKmZicDsJCS8qIGZyZWVzcGFjZSBidWZmZXIgKi8KKwl4ZnNfZGlyMl9kYl90CQlmZGI7CQkvKiBmcmVlc3BhY2UgYmxvY2sgbnVtYmVyICovCisJeGZzX2RpcjJfZnJlZV90CQkqZnJlZTsJCS8qIGZyZWVzcGFjZSBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9kYXRhX29mZl90CSpmcm9tOwkJLyogcG9pbnRlciB0byBmcmVlc3BhY2UgZW50cnkgKi8KKwlpbnQJCQlpOwkJLyogbGVhZiBmcmVlc3BhY2UgaW5kZXggKi8KKwl4ZnNfZGlyMl9sZWFmX3QJCSpsZWFmOwkJLyogbGVhZiBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9sZWFmX3RhaWxfdAkqbHRwOwkJLyogbGVhZiB0YWlsIHN0cnVjdHVyZSAqLworCXhmc19tb3VudF90CQkqbXA7CQkvKiBmaWxlc3lzdGVtIG1vdW50IHBvaW50ICovCisJaW50CQkJbjsJCS8qIGNvdW50IG9mIGxpdmUgZnJlZXNwYyBlbnRzICovCisJeGZzX2RpcjJfZGF0YV9vZmZfdAlvZmY7CQkvKiBmcmVlc3BhY2UgZW50cnkgdmFsdWUgKi8KKwl4ZnNfZGlyMl9kYXRhX29mZl90CSp0bzsJCS8qIHBvaW50ZXIgdG8gZnJlZXNwYWNlIGVudHJ5ICovCisJeGZzX3RyYW5zX3QJCSp0cDsJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKworCXhmc19kaXIyX3RyYWNlX2FyZ3NfYigibGVhZl90b19ub2RlIiwgYXJncywgbGJwKTsKKwlkcCA9IGFyZ3MtPmRwOworCW1wID0gZHAtPmlfbW91bnQ7CisJdHAgPSBhcmdzLT50cmFuczsKKwkvKgorCSAqIEFkZCBhIGZyZWVzcGFjZSBibG9jayB0byB0aGUgZGlyZWN0b3J5LgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfZGlyMl9ncm93X2lub2RlKGFyZ3MsIFhGU19ESVIyX0ZSRUVfU1BBQ0UsICZmZGIpKSkgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCUFTU0VSVChmZGIgPT0gWEZTX0RJUjJfRlJFRV9GSVJTVERCKG1wKSk7CisJLyoKKwkgKiBHZXQgdGhlIGJ1ZmZlciBmb3IgdGhlIG5ldyBmcmVlc3BhY2UgYmxvY2suCisJICovCisJaWYgKChlcnJvciA9IHhmc19kYV9nZXRfYnVmKHRwLCBkcCwgWEZTX0RJUjJfREJfVE9fREEobXAsIGZkYiksIC0xLCAmZmJwLAorCQkJWEZTX0RBVEFfRk9SSykpKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJQVNTRVJUKGZicCAhPSBOVUxMKTsKKwlmcmVlID0gZmJwLT5kYXRhOworCWxlYWYgPSBsYnAtPmRhdGE7CisJbHRwID0gWEZTX0RJUjJfTEVBRl9UQUlMX1AobXAsIGxlYWYpOworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgZnJlZXNwYWNlIGJsb2NrIGhlYWRlci4KKwkgKi8KKwlJTlRfU0VUKGZyZWUtPmhkci5tYWdpYywgQVJDSF9DT05WRVJULCBYRlNfRElSMl9GUkVFX01BR0lDKTsKKwlmcmVlLT5oZHIuZmlyc3RkYiA9IDA7CisJQVNTRVJUKElOVF9HRVQobHRwLT5iZXN0Y291bnQsIEFSQ0hfQ09OVkVSVCkgPD0gKHVpbnQpZHAtPmlfZC5kaV9zaXplIC8gbXAtPm1fZGlyYmxrc2l6ZSk7CisJSU5UX0NPUFkoZnJlZS0+aGRyLm52YWxpZCwgbHRwLT5iZXN0Y291bnQsIEFSQ0hfQ09OVkVSVCk7CisJLyoKKwkgKiBDb3B5IGZyZWVzcGFjZSBlbnRyaWVzIGZyb20gdGhlIGxlYWYgYmxvY2sgdG8gdGhlIG5ldyBibG9jay4KKwkgKiBDb3VudCBhY3RpdmUgZW50cmllcy4KKwkgKi8KKwlmb3IgKGkgPSBuID0gMCwgZnJvbSA9IFhGU19ESVIyX0xFQUZfQkVTVFNfUChsdHApLCB0byA9IGZyZWUtPmJlc3RzOworCSAgICAgaSA8IElOVF9HRVQobHRwLT5iZXN0Y291bnQsIEFSQ0hfQ09OVkVSVCk7IGkrKywgZnJvbSsrLCB0bysrKSB7CisJCWlmICgob2ZmID0gSU5UX0dFVCgqZnJvbSwgQVJDSF9DT05WRVJUKSkgIT0gTlVMTERBVEFPRkYpCisJCQluKys7CisJCUlOVF9TRVQoKnRvLCBBUkNIX0NPTlZFUlQsIG9mZik7CisJfQorCUlOVF9TRVQoZnJlZS0+aGRyLm51c2VkLCBBUkNIX0NPTlZFUlQsIG4pOworCUlOVF9TRVQobGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCwgWEZTX0RJUjJfTEVBRk5fTUFHSUMpOworCS8qCisJICogTG9nIGV2ZXJ5dGhpbmcuCisJICovCisJeGZzX2RpcjJfbGVhZl9sb2dfaGVhZGVyKHRwLCBsYnApOworCXhmc19kaXIyX2ZyZWVfbG9nX2hlYWRlcih0cCwgZmJwKTsKKwl4ZnNfZGlyMl9mcmVlX2xvZ19iZXN0cyh0cCwgZmJwLCAwLCBJTlRfR0VUKGZyZWUtPmhkci5udmFsaWQsIEFSQ0hfQ09OVkVSVCkgLSAxKTsKKwl4ZnNfZGFfYnVmX2RvbmUoZmJwKTsKKwl4ZnNfZGlyMl9sZWFmbl9jaGVjayhkcCwgbGJwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEFkZCBhIGxlYWYgZW50cnkgdG8gYSBsZWFmIGJsb2NrIGluIGEgbm9kZS1mb3JtIGRpcmVjdG9yeS4KKyAqIFRoZSBvdGhlciB3b3JrIG5lY2Vzc2FyeSBpcyBkb25lIGZyb20gdGhlIGNhbGxlci4KKyAqLworc3RhdGljIGludAkJCQkJLyogZXJyb3IgKi8KK3hmc19kaXIyX2xlYWZuX2FkZCgKKwl4ZnNfZGFidWZfdAkJKmJwLAkJLyogbGVhZiBidWZmZXIgKi8KKwl4ZnNfZGFfYXJnc190CQkqYXJncywJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KKwlpbnQJCQlpbmRleCkJCS8qIGluc2VydGlvbiBwdCBmb3IgbmV3IGVudHJ5ICovCit7CisJaW50CQkJY29tcGFjdDsJLyogY29tcGFjdGluZyBzdGFsZSBsZWF2ZXMgKi8KKwl4ZnNfaW5vZGVfdAkJKmRwOwkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLworCWludAkJCWhpZ2hzdGFsZTsJLyogbmV4dCBzdGFsZSBlbnRyeSAqLworCXhmc19kaXIyX2xlYWZfdAkJKmxlYWY7CQkvKiBsZWFmIHN0cnVjdHVyZSAqLworCXhmc19kaXIyX2xlYWZfZW50cnlfdAkqbGVwOwkJLyogbGVhZiBlbnRyeSAqLworCWludAkJCWxmbG9naGlnaDsJLyogaGlnaCBsZWFmIGVudHJ5IGxvZ2dpbmcgKi8KKwlpbnQJCQlsZmxvZ2xvdzsJLyogbG93IGxlYWYgZW50cnkgbG9nZ2luZyAqLworCWludAkJCWxvd3N0YWxlOwkvKiBwcmV2aW91cyBzdGFsZSBlbnRyeSAqLworCXhmc19tb3VudF90CQkqbXA7CQkvKiBmaWxlc3lzdGVtIG1vdW50IHBvaW50ICovCisJeGZzX3RyYW5zX3QJCSp0cDsJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKworCXhmc19kaXIyX3RyYWNlX2FyZ3Nfc2IoImxlYWZuX2FkZCIsIGFyZ3MsIGluZGV4LCBicCk7CisJZHAgPSBhcmdzLT5kcDsKKwltcCA9IGRwLT5pX21vdW50OworCXRwID0gYXJncy0+dHJhbnM7CisJbGVhZiA9IGJwLT5kYXRhOworCisJLyoKKwkgKiBRdWljayBjaGVjayBqdXN0IHRvIG1ha2Ugc3VyZSB3ZSBhcmUgbm90IGdvaW5nIHRvIGluZGV4CisJICogaW50byBvdGhlciBwZW9wbGVzIG1lbW9yeQorCSAqLworCWlmIChpbmRleCA8IDApCisJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKworCS8qCisJICogSWYgdGhlcmUgYXJlIGFscmVhZHkgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxlYWYgZW50cmllcyBpbgorCSAqIHRoZSBibG9jaywgaWYgdGhlcmUgYXJlIG5vIHN0YWxlIGVudHJpZXMgaXQgd29uJ3QgZml0LgorCSAqIENhbGxlciB3aWxsIGRvIGEgc3BsaXQuICBJZiB0aGVyZSBhcmUgc3RhbGUgZW50cmllcyB3ZSdsbCBkbworCSAqIGEgY29tcGFjdC4KKwkgKi8KKworCWlmIChJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9NQVhfTEVBRl9FTlRTKG1wKSkgeworCQlpZiAoIWxlYWYtPmhkci5zdGFsZSkKKwkJCXJldHVybiBYRlNfRVJST1IoRU5PU1BDKTsKKwkJY29tcGFjdCA9IElOVF9HRVQobGVhZi0+aGRyLnN0YWxlLCBBUkNIX0NPTlZFUlQpID4gMTsKKwl9IGVsc2UKKwkJY29tcGFjdCA9IDA7CisJQVNTRVJUKGluZGV4ID09IDAgfHwgSU5UX0dFVChsZWFmLT5lbnRzW2luZGV4IC0gMV0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSA8PSBhcmdzLT5oYXNodmFsKTsKKwlBU1NFUlQoaW5kZXggPT0gSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgfHwKKwkgICAgICAgSU5UX0dFVChsZWFmLT5lbnRzW2luZGV4XS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpID49IGFyZ3MtPmhhc2h2YWwpOworCisJaWYgKGFyZ3MtPmp1c3RjaGVjaykKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIENvbXBhY3Qgb3V0IGFsbCBidXQgb25lIHN0YWxlIGxlYWYgZW50cnkuICBMZWF2ZXMgYmVoaW5kCisJICogdGhlIGVudHJ5IGNsb3Nlc3QgdG8gaW5kZXguCisJICovCisJaWYgKGNvbXBhY3QpIHsKKwkJeGZzX2RpcjJfbGVhZl9jb21wYWN0X3gxKGJwLCAmaW5kZXgsICZsb3dzdGFsZSwgJmhpZ2hzdGFsZSwKKwkJCSZsZmxvZ2xvdywgJmxmbG9naGlnaCk7CisJfQorCS8qCisJICogU2V0IGltcG9zc2libGUgbG9nZ2luZyBpbmRpY2VzIGZvciB0aGlzIGNhc2UuCisJICovCisJZWxzZSBpZiAobGVhZi0+aGRyLnN0YWxlKSB7CisJCWxmbG9nbG93ID0gSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJCWxmbG9naGlnaCA9IC0xOworCX0KKwkvKgorCSAqIE5vIHN0YWxlIGVudHJpZXMsIGp1c3QgaW5zZXJ0IGEgc3BhY2UgZm9yIHRoZSBuZXcgZW50cnkuCisJICovCisJaWYgKCFsZWFmLT5oZHIuc3RhbGUpIHsKKwkJbGVwID0gJmxlYWYtPmVudHNbaW5kZXhdOworCQlpZiAoaW5kZXggPCBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSkKKwkJCW1lbW1vdmUobGVwICsgMSwgbGVwLAorCQkJCShJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAtIGluZGV4KSAqIHNpemVvZigqbGVwKSk7CisJCWxmbG9nbG93ID0gaW5kZXg7CisJCWxmbG9naGlnaCA9IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOworCQlJTlRfTU9EKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJULCArMSk7CisJfQorCS8qCisJICogVGhlcmUgYXJlIHN0YWxlIGVudHJpZXMuICBXZSdsbCB1c2Ugb25lIGZvciB0aGUgbmV3IGVudHJ5LgorCSAqLworCWVsc2UgeworCQkvKgorCQkgKiBJZiB3ZSBkaWRuJ3QgZG8gYSBjb21wYWN0IHRoZW4gd2UgbmVlZCB0byBmaWd1cmUgb3V0CisJCSAqIHdoaWNoIHN0YWxlIGVudHJ5IHdpbGwgYmUgdXNlZC4KKwkJICovCisJCWlmIChjb21wYWN0ID09IDApIHsKKwkJCS8qCisJCQkgKiBGaW5kIGZpcnN0IHN0YWxlIGVudHJ5IGJlZm9yZSBvdXIgaW5zZXJ0aW9uIHBvaW50LgorCQkJICovCisJCQlmb3IgKGxvd3N0YWxlID0gaW5kZXggLSAxOworCQkJICAgICBsb3dzdGFsZSA+PSAwICYmCisJCQkJSU5UX0dFVChsZWFmLT5lbnRzW2xvd3N0YWxlXS5hZGRyZXNzLCBBUkNIX0NPTlZFUlQpICE9CisJCQkJWEZTX0RJUjJfTlVMTF9EQVRBUFRSOworCQkJICAgICBsb3dzdGFsZS0tKQorCQkJCWNvbnRpbnVlOworCQkJLyoKKwkJCSAqIEZpbmQgbmV4dCBzdGFsZSBlbnRyeSBhZnRlciBpbnNlcnRpb24gcG9pbnQuCisJCQkgKiBTdG9wIGxvb2tpbmcgaWYgdGhlIGFuc3dlciB3b3VsZCBiZSB3b3JzZSB0aGFuCisJCQkgKiBsb3dzdGFsZSBhbHJlYWR5IGZvdW5kLgorCQkJICovCisJCQlmb3IgKGhpZ2hzdGFsZSA9IGluZGV4OworCQkJICAgICBoaWdoc3RhbGUgPCBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAmJgorCQkJCUlOVF9HRVQobGVhZi0+ZW50c1toaWdoc3RhbGVdLmFkZHJlc3MsIEFSQ0hfQ09OVkVSVCkgIT0KKwkJCQlYRlNfRElSMl9OVUxMX0RBVEFQVFIgJiYKKwkJCQkobG93c3RhbGUgPCAwIHx8CisJCQkJIGluZGV4IC0gbG93c3RhbGUgLSAxID49IGhpZ2hzdGFsZSAtIGluZGV4KTsKKwkJCSAgICAgaGlnaHN0YWxlKyspCisJCQkJY29udGludWU7CisJCX0KKwkJLyoKKwkJICogVXNpbmcgdGhlIGxvdyBzdGFsZSBlbnRyeS4KKwkJICogU2hpZnQgZW50cmllcyB1cCB0b3dhcmQgdGhlIHN0YWxlIHNsb3QuCisJCSAqLworCQlpZiAobG93c3RhbGUgPj0gMCAmJgorCQkgICAgKGhpZ2hzdGFsZSA9PSBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSB8fAorCQkgICAgIGluZGV4IC0gbG93c3RhbGUgLSAxIDwgaGlnaHN0YWxlIC0gaW5kZXgpKSB7CisJCQlBU1NFUlQoSU5UX0dFVChsZWFmLT5lbnRzW2xvd3N0YWxlXS5hZGRyZXNzLCBBUkNIX0NPTlZFUlQpID09CisJCQkgICAgICAgWEZTX0RJUjJfTlVMTF9EQVRBUFRSKTsKKwkJCUFTU0VSVChpbmRleCAtIGxvd3N0YWxlIC0gMSA+PSAwKTsKKwkJCWlmIChpbmRleCAtIGxvd3N0YWxlIC0gMSA+IDApCisJCQkJbWVtbW92ZSgmbGVhZi0+ZW50c1tsb3dzdGFsZV0sCisJCQkJCSZsZWFmLT5lbnRzW2xvd3N0YWxlICsgMV0sCisJCQkJCShpbmRleCAtIGxvd3N0YWxlIC0gMSkgKiBzaXplb2YoKmxlcCkpOworCQkJbGVwID0gJmxlYWYtPmVudHNbaW5kZXggLSAxXTsKKwkJCWxmbG9nbG93ID0gTUlOKGxvd3N0YWxlLCBsZmxvZ2xvdyk7CisJCQlsZmxvZ2hpZ2ggPSBNQVgoaW5kZXggLSAxLCBsZmxvZ2hpZ2gpOworCQl9CisJCS8qCisJCSAqIFVzaW5nIHRoZSBoaWdoIHN0YWxlIGVudHJ5LgorCQkgKiBTaGlmdCBlbnRyaWVzIGRvd24gdG93YXJkIHRoZSBzdGFsZSBzbG90LgorCQkgKi8KKwkJZWxzZSB7CisJCQlBU1NFUlQoSU5UX0dFVChsZWFmLT5lbnRzW2hpZ2hzdGFsZV0uYWRkcmVzcywgQVJDSF9DT05WRVJUKSA9PQorCQkJICAgICAgIFhGU19ESVIyX05VTExfREFUQVBUUik7CisJCQlBU1NFUlQoaGlnaHN0YWxlIC0gaW5kZXggPj0gMCk7CisJCQlpZiAoaGlnaHN0YWxlIC0gaW5kZXggPiAwKQorCQkJCW1lbW1vdmUoJmxlYWYtPmVudHNbaW5kZXggKyAxXSwKKwkJCQkJJmxlYWYtPmVudHNbaW5kZXhdLAorCQkJCQkoaGlnaHN0YWxlIC0gaW5kZXgpICogc2l6ZW9mKCpsZXApKTsKKwkJCWxlcCA9ICZsZWFmLT5lbnRzW2luZGV4XTsKKwkJCWxmbG9nbG93ID0gTUlOKGluZGV4LCBsZmxvZ2xvdyk7CisJCQlsZmxvZ2hpZ2ggPSBNQVgoaGlnaHN0YWxlLCBsZmxvZ2hpZ2gpOworCQl9CisJCUlOVF9NT0QobGVhZi0+aGRyLnN0YWxlLCBBUkNIX0NPTlZFUlQsIC0xKTsKKwl9CisJLyoKKwkgKiBJbnNlcnQgdGhlIG5ldyBlbnRyeSwgbG9nIGV2ZXJ5dGhpbmcuCisJICovCisJSU5UX1NFVChsZXAtPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCwgYXJncy0+aGFzaHZhbCk7CisJSU5UX1NFVChsZXAtPmFkZHJlc3MsIEFSQ0hfQ09OVkVSVCwgWEZTX0RJUjJfREJfT0ZGX1RPX0RBVEFQVFIobXAsIGFyZ3MtPmJsa25vLCBhcmdzLT5pbmRleCkpOworCXhmc19kaXIyX2xlYWZfbG9nX2hlYWRlcih0cCwgYnApOworCXhmc19kaXIyX2xlYWZfbG9nX2VudHModHAsIGJwLCBsZmxvZ2xvdywgbGZsb2doaWdoKTsKKwl4ZnNfZGlyMl9sZWFmbl9jaGVjayhkcCwgYnApOworCXJldHVybiAwOworfQorCisjaWZkZWYgREVCVUcKKy8qCisgKiBDaGVjayBpbnRlcm5hbCBjb25zaXN0ZW5jeSBvZiBhIGxlYWZuIGJsb2NrLgorICovCit2b2lkCit4ZnNfZGlyMl9sZWFmbl9jaGVjaygKKwl4ZnNfaW5vZGVfdAkqZHAsCQkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLworCXhmc19kYWJ1Zl90CSpicCkJCQkvKiBsZWFmIGJ1ZmZlciAqLworeworCWludAkJaTsJCQkvKiBsZWFmIGluZGV4ICovCisJeGZzX2RpcjJfbGVhZl90CSpsZWFmOwkJCS8qIGxlYWYgc3RydWN0dXJlICovCisJeGZzX21vdW50X3QJKm1wOwkJCS8qIGZpbGVzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwlpbnQJCXN0YWxlOwkJCS8qIGNvdW50IG9mIHN0YWxlIGxlYXZlcyAqLworCisJbGVhZiA9IGJwLT5kYXRhOworCW1wID0gZHAtPmlfbW91bnQ7CisJQVNTRVJUKElOVF9HRVQobGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfTEVBRk5fTUFHSUMpOworCUFTU0VSVChJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSA8PSBYRlNfRElSMl9NQVhfTEVBRl9FTlRTKG1wKSk7CisJZm9yIChpID0gc3RhbGUgPSAwOyBpIDwgSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7IGkrKykgeworCQlpZiAoaSArIDEgPCBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSkgeworCQkJQVNTRVJUKElOVF9HRVQobGVhZi0+ZW50c1tpXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpIDw9CisJCQkgICAgICAgSU5UX0dFVChsZWFmLT5lbnRzW2kgKyAxXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpKTsKKwkJfQorCQlpZiAoSU5UX0dFVChsZWFmLT5lbnRzW2ldLmFkZHJlc3MsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfTlVMTF9EQVRBUFRSKQorCQkJc3RhbGUrKzsKKwl9CisJQVNTRVJUKElOVF9HRVQobGVhZi0+aGRyLnN0YWxlLCBBUkNIX0NPTlZFUlQpID09IHN0YWxlKTsKK30KKyNlbmRpZgkvKiBERUJVRyAqLworCisvKgorICogUmV0dXJuIHRoZSBsYXN0IGhhc2ggdmFsdWUgaW4gdGhlIGxlYWYuCisgKiBTdGFsZSBlbnRyaWVzIGFyZSBvay4KKyAqLworeGZzX2RhaGFzaF90CQkJCQkvKiBoYXNoIHZhbHVlICovCit4ZnNfZGlyMl9sZWFmbl9sYXN0aGFzaCgKKwl4ZnNfZGFidWZfdAkqYnAsCQkJLyogbGVhZiBidWZmZXIgKi8KKwlpbnQJCSpjb3VudCkJCQkvKiBjb3VudCBvZiBlbnRyaWVzIGluIGxlYWYgKi8KK3sKKwl4ZnNfZGlyMl9sZWFmX3QJKmxlYWY7CQkJLyogbGVhZiBzdHJ1Y3R1cmUgKi8KKworCWxlYWYgPSBicC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChsZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9MRUFGTl9NQUdJQyk7CisJaWYgKGNvdW50KQorCQkqY291bnQgPSBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKTsKKwlpZiAoIWxlYWYtPmhkci5jb3VudCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIElOVF9HRVQobGVhZi0+ZW50c1tJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAtIDFdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCk7Cit9CisKKy8qCisgKiBMb29rIHVwIGEgbGVhZiBlbnRyeSBpbiBhIG5vZGUtZm9ybWF0IGxlYWYgYmxvY2suCisgKiBJZiB0aGlzIGlzIGFuIGFkZG5hbWUgdGhlbiB0aGUgZXh0cmFibGsgaW4gc3RhdGUgaXMgYSBmcmVlc3BhY2UgYmxvY2ssCisgKiBvdGhlcndpc2UgaXQncyBhIGRhdGEgYmxvY2suCisgKi8KK2ludAoreGZzX2RpcjJfbGVhZm5fbG9va3VwX2ludCgKKwl4ZnNfZGFidWZfdAkJKmJwLAkJLyogbGVhZiBidWZmZXIgKi8KKwl4ZnNfZGFfYXJnc190CQkqYXJncywJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KKwlpbnQJCQkqaW5kZXhwLAkvKiBvdXQ6IGxlYWYgZW50cnkgaW5kZXggKi8KKwl4ZnNfZGFfc3RhdGVfdAkJKnN0YXRlKQkJLyogc3RhdGUgdG8gZmlsbCBpbiAqLworeworCXhmc19kYWJ1Zl90CQkqY3VyYnA7CQkvKiBjdXJyZW50IGRhdGEvZnJlZSBidWZmZXIgKi8KKwl4ZnNfZGlyMl9kYl90CQljdXJkYjsJCS8qIGN1cnJlbnQgZGF0YSBibG9jayBudW1iZXIgKi8KKwl4ZnNfZGlyMl9kYl90CQljdXJmZGI7CQkvKiBjdXJyZW50IGZyZWUgYmxvY2sgbnVtYmVyICovCisJeGZzX2RpcjJfZGF0YV9lbnRyeV90CSpkZXA7CQkvKiBkYXRhIGJsb2NrIGVudHJ5ICovCisJeGZzX2lub2RlX3QJCSpkcDsJCS8qIGluY29yZSBkaXJlY3RvcnkgaW5vZGUgKi8KKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCWludAkJCWZpOwkJLyogZnJlZSBlbnRyeSBpbmRleCAqLworCXhmc19kaXIyX2ZyZWVfdAkJKmZyZWU9TlVMTDsJLyogZnJlZSBibG9jayBzdHJ1Y3R1cmUgKi8KKwlpbnQJCQlpbmRleDsJCS8qIGxlYWYgZW50cnkgaW5kZXggKi8KKwl4ZnNfZGlyMl9sZWFmX3QJCSpsZWFmOwkJLyogbGVhZiBzdHJ1Y3R1cmUgKi8KKwlpbnQJCQlsZW5ndGg9MDsJLyogbGVuZ3RoIG9mIG5ldyBkYXRhIGVudHJ5ICovCisJeGZzX2RpcjJfbGVhZl9lbnRyeV90CSpsZXA7CQkvKiBsZWFmIGVudHJ5ICovCisJeGZzX21vdW50X3QJCSptcDsJCS8qIGZpbGVzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl4ZnNfZGlyMl9kYl90CQluZXdkYjsJCS8qIG5ldyBkYXRhIGJsb2NrIG51bWJlciAqLworCXhmc19kaXIyX2RiX3QJCW5ld2ZkYjsJCS8qIG5ldyBmcmVlIGJsb2NrIG51bWJlciAqLworCXhmc190cmFuc190CQkqdHA7CQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisKKwlkcCA9IGFyZ3MtPmRwOworCXRwID0gYXJncy0+dHJhbnM7CisJbXAgPSBkcC0+aV9tb3VudDsKKwlsZWFmID0gYnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQobGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfTEVBRk5fTUFHSUMpOworI2lmZGVmIF9fS0VSTkVMX18KKwlBU1NFUlQoSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgPiAwKTsKKyNlbmRpZgorCXhmc19kaXIyX2xlYWZuX2NoZWNrKGRwLCBicCk7CisJLyoKKwkgKiBMb29rIHVwIHRoZSBoYXNoIHZhbHVlIGluIHRoZSBsZWFmIGVudHJpZXMuCisJICovCisJaW5kZXggPSB4ZnNfZGlyMl9sZWFmX3NlYXJjaF9oYXNoKGFyZ3MsIGJwKTsKKwkvKgorCSAqIERvIHdlIGhhdmUgYSBidWZmZXIgY29taW5nIGluPworCSAqLworCWlmIChzdGF0ZS0+ZXh0cmF2YWxpZCkKKwkJY3VyYnAgPSBzdGF0ZS0+ZXh0cmFibGsuYnA7CisJZWxzZQorCQljdXJicCA9IE5VTEw7CisJLyoKKwkgKiBGb3IgYWRkbmFtZSwgaXQncyBhIGZyZWUgYmxvY2sgYnVmZmVyLCBnZXQgdGhlIGJsb2NrIG51bWJlci4KKwkgKi8KKwlpZiAoYXJncy0+YWRkbmFtZSkgeworCQljdXJmZGIgPSBjdXJicCA/IHN0YXRlLT5leHRyYWJsay5ibGtubyA6IC0xOworCQljdXJkYiA9IC0xOworCQlsZW5ndGggPSBYRlNfRElSMl9EQVRBX0VOVFNJWkUoYXJncy0+bmFtZWxlbik7CisJCWlmICgoZnJlZSA9IChjdXJicCA/IGN1cmJwLT5kYXRhIDogTlVMTCkpKQorCQkJQVNTRVJUKElOVF9HRVQoZnJlZS0+aGRyLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0ZSRUVfTUFHSUMpOworCX0KKwkvKgorCSAqIEZvciBvdGhlcnMsIGl0J3MgYSBkYXRhIGJsb2NrIGJ1ZmZlciwgZ2V0IHRoZSBibG9jayBudW1iZXIuCisJICovCisJZWxzZSB7CisJCWN1cmZkYiA9IC0xOworCQljdXJkYiA9IGN1cmJwID8gc3RhdGUtPmV4dHJhYmxrLmJsa25vIDogLTE7CisJfQorCS8qCisJICogTG9vcCBvdmVyIGxlYWYgZW50cmllcyB3aXRoIHRoZSByaWdodCBoYXNoIHZhbHVlLgorCSAqLworCWZvciAobGVwID0gJmxlYWYtPmVudHNbaW5kZXhdOworCSAgICAgaW5kZXggPCBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAmJiBJTlRfR0VUKGxlcC0+aGFzaHZhbCwgQVJDSF9DT05WRVJUKSA9PSBhcmdzLT5oYXNodmFsOworCSAgICAgbGVwKyssIGluZGV4KyspIHsKKwkJLyoKKwkJICogU2tpcCBzdGFsZSBsZWFmIGVudHJpZXMuCisJCSAqLworCQlpZiAoSU5UX0dFVChsZXAtPmFkZHJlc3MsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfTlVMTF9EQVRBUFRSKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIFB1bGwgdGhlIGRhdGEgYmxvY2sgbnVtYmVyIGZyb20gdGhlIGVudHJ5LgorCQkgKi8KKwkJbmV3ZGIgPSBYRlNfRElSMl9EQVRBUFRSX1RPX0RCKG1wLCBJTlRfR0VUKGxlcC0+YWRkcmVzcywgQVJDSF9DT05WRVJUKSk7CisJCS8qCisJCSAqIEZvciBhZGRuYW1lLCB3ZSdyZSBsb29raW5nIGZvciBhIHBsYWNlIHRvIHB1dCB0aGUgbmV3IGVudHJ5LgorCQkgKiBXZSB3YW50IHRvIHVzZSBhIGRhdGEgYmxvY2sgd2l0aCBhbiBlbnRyeSBvZiBlcXVhbAorCQkgKiBoYXNoIHZhbHVlIHRvIG91cnMgaWYgdGhlcmUgaXMgb25lIHdpdGggcm9vbS4KKwkJICovCisJCWlmIChhcmdzLT5hZGRuYW1lKSB7CisJCQkvKgorCQkJICogSWYgdGhpcyBibG9jayBpc24ndCB0aGUgZGF0YSBibG9jayB3ZSBhbHJlYWR5IGhhdmUKKwkJCSAqIGluIGhhbmQsIHRha2UgYSBsb29rIGF0IGl0LgorCQkJICovCisJCQlpZiAobmV3ZGIgIT0gY3VyZGIpIHsKKwkJCQljdXJkYiA9IG5ld2RiOworCQkJCS8qCisJCQkJICogQ29udmVydCB0aGUgZGF0YSBibG9jayB0byB0aGUgZnJlZSBibG9jaworCQkJCSAqIGhvbGRpbmcgaXRzIGZyZWVzcGFjZSBpbmZvcm1hdGlvbi4KKwkJCQkgKi8KKwkJCQluZXdmZGIgPSBYRlNfRElSMl9EQl9UT19GREIobXAsIG5ld2RiKTsKKwkJCQkvKgorCQkJCSAqIElmIGl0J3Mgbm90IHRoZSBvbmUgd2UgaGF2ZSBpbiBoYW5kLAorCQkJCSAqIHJlYWQgaXQgaW4uCisJCQkJICovCisJCQkJaWYgKG5ld2ZkYiAhPSBjdXJmZGIpIHsKKwkJCQkJLyoKKwkJCQkJICogSWYgd2UgaGFkIG9uZSBiZWZvcmUsIGRyb3AgaXQuCisJCQkJCSAqLworCQkJCQlpZiAoY3VyYnApCisJCQkJCQl4ZnNfZGFfYnJlbHNlKHRwLCBjdXJicCk7CisJCQkJCS8qCisJCQkJCSAqIFJlYWQgdGhlIGZyZWUgYmxvY2suCisJCQkJCSAqLworCQkJCQlpZiAoKGVycm9yID0geGZzX2RhX3JlYWRfYnVmKHRwLCBkcCwKKwkJCQkJCQlYRlNfRElSMl9EQl9UT19EQShtcCwKKwkJCQkJCQkJbmV3ZmRiKSwKKwkJCQkJCQktMSwgJmN1cmJwLAorCQkJCQkJCVhGU19EQVRBX0ZPUkspKSkgeworCQkJCQkJcmV0dXJuIGVycm9yOworCQkJCQl9CisJCQkJCWN1cmZkYiA9IG5ld2ZkYjsKKwkJCQkJZnJlZSA9IGN1cmJwLT5kYXRhOworCQkJCQlBU1NFUlQoSU5UX0dFVChmcmVlLT5oZHIubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0KKwkJCQkJICAgICAgIFhGU19ESVIyX0ZSRUVfTUFHSUMpOworCQkJCQlBU1NFUlQoKElOVF9HRVQoZnJlZS0+aGRyLmZpcnN0ZGIsIEFSQ0hfQ09OVkVSVCkgJQorCQkJCQkJWEZTX0RJUjJfTUFYX0ZSRUVfQkVTVFMobXApKSA9PQorCQkJCQkgICAgICAgMCk7CisJCQkJCUFTU0VSVChJTlRfR0VUKGZyZWUtPmhkci5maXJzdGRiLCBBUkNIX0NPTlZFUlQpIDw9IGN1cmRiKTsKKwkJCQkJQVNTRVJUKGN1cmRiIDwKKwkJCQkJICAgICAgIElOVF9HRVQoZnJlZS0+aGRyLmZpcnN0ZGIsIEFSQ0hfQ09OVkVSVCkgKworCQkJCQkgICAgICAgSU5UX0dFVChmcmVlLT5oZHIubnZhbGlkLCBBUkNIX0NPTlZFUlQpKTsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBHZXQgdGhlIGluZGV4IGZvciBvdXIgZW50cnkuCisJCQkJICovCisJCQkJZmkgPSBYRlNfRElSMl9EQl9UT19GRElOREVYKG1wLCBjdXJkYik7CisJCQkJLyoKKwkJCQkgKiBJZiBpdCBoYXMgcm9vbSwgcmV0dXJuIGl0LgorCQkJCSAqLworCQkJCWlmICh1bmxpa2VseShJTlRfR0VUKGZyZWUtPmJlc3RzW2ZpXSwgQVJDSF9DT05WRVJUKSA9PSBOVUxMREFUQU9GRikpIHsKKwkJCQkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX2RpcjJfbGVhZm5fbG9va3VwX2ludCIsCisJCQkJCQkJIFhGU19FUlJMRVZFTF9MT1csIG1wKTsKKwkJCQkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCQkJCX0KKwkJCQlpZiAoSU5UX0dFVChmcmVlLT5iZXN0c1tmaV0sIEFSQ0hfQ09OVkVSVCkgPj0gbGVuZ3RoKSB7CisJCQkJCSppbmRleHAgPSBpbmRleDsKKwkJCQkJc3RhdGUtPmV4dHJhdmFsaWQgPSAxOworCQkJCQlzdGF0ZS0+ZXh0cmFibGsuYnAgPSBjdXJicDsKKwkJCQkJc3RhdGUtPmV4dHJhYmxrLmJsa25vID0gY3VyZmRiOworCQkJCQlzdGF0ZS0+ZXh0cmFibGsuaW5kZXggPSBmaTsKKwkJCQkJc3RhdGUtPmV4dHJhYmxrLm1hZ2ljID0KKwkJCQkJCVhGU19ESVIyX0ZSRUVfTUFHSUM7CisJCQkJCUFTU0VSVChhcmdzLT5va25vZW50KTsKKwkJCQkJcmV0dXJuIFhGU19FUlJPUihFTk9FTlQpOworCQkJCX0KKwkJCX0KKwkJfQorCQkvKgorCQkgKiBOb3QgYWRkaW5nIGEgbmV3IGVudHJ5LCBzbyB3ZSByZWFsbHkgd2FudCB0byBmaW5kCisJCSAqIHRoZSBuYW1lIGdpdmVuIHRvIHVzLgorCQkgKi8KKwkJZWxzZSB7CisJCQkvKgorCQkJICogSWYgaXQncyBhIGRpZmZlcmVudCBkYXRhIGJsb2NrLCBnbyBnZXQgaXQuCisJCQkgKi8KKwkJCWlmIChuZXdkYiAhPSBjdXJkYikgeworCQkJCS8qCisJCQkJICogSWYgd2UgaGFkIGEgYmxvY2sgYmVmb3JlLCBkcm9wIGl0LgorCQkJCSAqLworCQkJCWlmIChjdXJicCkKKwkJCQkJeGZzX2RhX2JyZWxzZSh0cCwgY3VyYnApOworCQkJCS8qCisJCQkJICogUmVhZCB0aGUgZGF0YSBibG9jay4KKwkJCQkgKi8KKwkJCQlpZiAoKGVycm9yID0KKwkJCQkgICAgeGZzX2RhX3JlYWRfYnVmKHRwLCBkcCwKKwkJCQkJICAgIFhGU19ESVIyX0RCX1RPX0RBKG1wLCBuZXdkYiksIC0xLAorCQkJCQkgICAgJmN1cmJwLCBYRlNfREFUQV9GT1JLKSkpIHsKKwkJCQkJcmV0dXJuIGVycm9yOworCQkJCX0KKwkJCQl4ZnNfZGlyMl9kYXRhX2NoZWNrKGRwLCBjdXJicCk7CisJCQkJY3VyZGIgPSBuZXdkYjsKKwkJCX0KKwkJCS8qCisJCQkgKiBQb2ludCB0byB0aGUgZGF0YSBlbnRyeS4KKwkJCSAqLworCQkJZGVwID0gKHhmc19kaXIyX2RhdGFfZW50cnlfdCAqKQorCQkJICAgICAgKChjaGFyICopY3VyYnAtPmRhdGEgKworCQkJICAgICAgIFhGU19ESVIyX0RBVEFQVFJfVE9fT0ZGKG1wLCBJTlRfR0VUKGxlcC0+YWRkcmVzcywgQVJDSF9DT05WRVJUKSkpOworCQkJLyoKKwkJCSAqIENvbXBhcmUgdGhlIGVudHJ5LCByZXR1cm4gaXQgaWYgaXQgbWF0Y2hlcy4KKwkJCSAqLworCQkJaWYgKGRlcC0+bmFtZWxlbiA9PSBhcmdzLT5uYW1lbGVuICYmCisJCQkgICAgZGVwLT5uYW1lWzBdID09IGFyZ3MtPm5hbWVbMF0gJiYKKwkJCSAgICBtZW1jbXAoZGVwLT5uYW1lLCBhcmdzLT5uYW1lLCBhcmdzLT5uYW1lbGVuKSA9PSAwKSB7CisJCQkJYXJncy0+aW51bWJlciA9IElOVF9HRVQoZGVwLT5pbnVtYmVyLCBBUkNIX0NPTlZFUlQpOworCQkJCSppbmRleHAgPSBpbmRleDsKKwkJCQlzdGF0ZS0+ZXh0cmF2YWxpZCA9IDE7CisJCQkJc3RhdGUtPmV4dHJhYmxrLmJwID0gY3VyYnA7CisJCQkJc3RhdGUtPmV4dHJhYmxrLmJsa25vID0gY3VyZGI7CisJCQkJc3RhdGUtPmV4dHJhYmxrLmluZGV4ID0KKwkJCQkJKGludCkoKGNoYXIgKilkZXAgLQorCQkJCQkgICAgICAoY2hhciAqKWN1cmJwLT5kYXRhKTsKKwkJCQlzdGF0ZS0+ZXh0cmFibGsubWFnaWMgPSBYRlNfRElSMl9EQVRBX01BR0lDOworCQkJCXJldHVybiBYRlNfRVJST1IoRUVYSVNUKTsKKwkJCX0KKwkJfQorCX0KKwkvKgorCSAqIERpZG4ndCBmaW5kIGEgbWF0Y2guCisJICogSWYgd2UgYXJlIGhvbGRpbmcgYSBidWZmZXIsIGdpdmUgaXQgYmFjayBpbiBjYXNlIG91ciBjYWxsZXIKKwkgKiBmaW5kcyBpdCB1c2VmdWwuCisJICovCisJaWYgKChzdGF0ZS0+ZXh0cmF2YWxpZCA9IChjdXJicCAhPSBOVUxMKSkpIHsKKwkJc3RhdGUtPmV4dHJhYmxrLmJwID0gY3VyYnA7CisJCXN0YXRlLT5leHRyYWJsay5pbmRleCA9IC0xOworCQkvKgorCQkgKiBGb3IgYWRkbmFtZSwgZ2l2aW5nIGJhY2sgYSBmcmVlIGJsb2NrLgorCQkgKi8KKwkJaWYgKGFyZ3MtPmFkZG5hbWUpIHsKKwkJCXN0YXRlLT5leHRyYWJsay5ibGtubyA9IGN1cmZkYjsKKwkJCXN0YXRlLT5leHRyYWJsay5tYWdpYyA9IFhGU19ESVIyX0ZSRUVfTUFHSUM7CisJCX0KKwkJLyoKKwkJICogRm9yIG90aGVyIGNhbGxlcnMsIGdpdmluZyBiYWNrIGEgZGF0YSBibG9jay4KKwkJICovCisJCWVsc2UgeworCQkJc3RhdGUtPmV4dHJhYmxrLmJsa25vID0gY3VyZGI7CisJCQlzdGF0ZS0+ZXh0cmFibGsubWFnaWMgPSBYRlNfRElSMl9EQVRBX01BR0lDOworCQl9CisJfQorCS8qCisJICogUmV0dXJuIHRoZSBmaW5hbCBpbmRleCwgdGhhdCB3aWxsIGJlIHRoZSBpbnNlcnRpb24gcG9pbnQuCisJICovCisJKmluZGV4cCA9IGluZGV4OworCUFTU0VSVChpbmRleCA9PSBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSB8fCBhcmdzLT5va25vZW50KTsKKwlyZXR1cm4gWEZTX0VSUk9SKEVOT0VOVCk7Cit9CisKKy8qCisgKiBNb3ZlIGNvdW50IGxlYWYgZW50cmllcyBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbiBsZWFmLgorICogTG9nIGVudHJpZXMgYW5kIGhlYWRlcnMuICBTdGFsZSBlbnRyaWVzIGFyZSBwcmVzZXJ2ZWQuCisgKi8KK3N0YXRpYyB2b2lkCit4ZnNfZGlyMl9sZWFmbl9tb3ZlZW50cygKKwl4ZnNfZGFfYXJnc190CSphcmdzLAkJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KKwl4ZnNfZGFidWZfdAkqYnBfcywJCQkvKiBzb3VyY2UgbGVhZiBidWZmZXIgKi8KKwlpbnQJCXN0YXJ0X3MsCQkvKiBzb3VyY2UgbGVhZiBpbmRleCAqLworCXhmc19kYWJ1Zl90CSpicF9kLAkJCS8qIGRlc3RpbmF0aW9uIGxlYWYgYnVmZmVyICovCisJaW50CQlzdGFydF9kLAkJLyogZGVzdGluYXRpb24gbGVhZiBpbmRleCAqLworCWludAkJY291bnQpCQkJLyogY291bnQgb2YgbGVhdmVzIHRvIGNvcHkgKi8KK3sKKwl4ZnNfZGlyMl9sZWFmX3QJKmxlYWZfZDsJCS8qIGRlc3RpbmF0aW9uIGxlYWYgc3RydWN0dXJlICovCisJeGZzX2RpcjJfbGVhZl90CSpsZWFmX3M7CQkvKiBzb3VyY2UgbGVhZiBzdHJ1Y3R1cmUgKi8KKwlpbnQJCXN0YWxlOwkJCS8qIGNvdW50IHN0YWxlIGxlYXZlcyBjb3BpZWQgKi8KKwl4ZnNfdHJhbnNfdAkqdHA7CQkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCisJeGZzX2RpcjJfdHJhY2VfYXJnc19iaWJpaSgibGVhZm5fbW92ZWVudHMiLCBhcmdzLCBicF9zLCBzdGFydF9zLCBicF9kLAorCQlzdGFydF9kLCBjb3VudCk7CisJLyoKKwkgKiBTaWxlbnRseSByZXR1cm4gaWYgbm90aGluZyB0byBkby4KKwkgKi8KKwlpZiAoY291bnQgPT0gMCkgeworCQlyZXR1cm47CisJfQorCXRwID0gYXJncy0+dHJhbnM7CisJbGVhZl9zID0gYnBfcy0+ZGF0YTsKKwlsZWFmX2QgPSBicF9kLT5kYXRhOworCS8qCisJICogSWYgdGhlIGRlc3RpbmF0aW9uIGluZGV4IGlzIG5vdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50CisJICogZGVzdGluYXRpb24gbGVhZiBlbnRyaWVzLCBvcGVuIHVwIGEgaG9sZSBpbiB0aGUgZGVzdGluYXRpb24KKwkgKiB0byBob2xkIHRoZSBuZXcgZW50cmllcy4KKwkgKi8KKwlpZiAoc3RhcnRfZCA8IElOVF9HRVQobGVhZl9kLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJbWVtbW92ZSgmbGVhZl9kLT5lbnRzW3N0YXJ0X2QgKyBjb3VudF0sICZsZWFmX2QtPmVudHNbc3RhcnRfZF0sCisJCQkoSU5UX0dFVChsZWFmX2QtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAtIHN0YXJ0X2QpICoKKwkJCXNpemVvZih4ZnNfZGlyMl9sZWFmX2VudHJ5X3QpKTsKKwkJeGZzX2RpcjJfbGVhZl9sb2dfZW50cyh0cCwgYnBfZCwgc3RhcnRfZCArIGNvdW50LAorCQkJY291bnQgKyBJTlRfR0VUKGxlYWZfZC0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpIC0gMSk7CisJfQorCS8qCisJICogSWYgdGhlIHNvdXJjZSBoYXMgc3RhbGUgbGVhdmVzLCBjb3VudCB0aGUgb25lcyBpbiB0aGUgY29weSByYW5nZQorCSAqIHNvIHdlIGNhbiB1cGRhdGUgdGhlIGhlYWRlciBjb3JyZWN0bHkuCisJICovCisJaWYgKGxlYWZfcy0+aGRyLnN0YWxlKSB7CisJCWludAlpOwkJCS8qIHRlbXAgbGVhZiBpbmRleCAqLworCisJCWZvciAoaSA9IHN0YXJ0X3MsIHN0YWxlID0gMDsgaSA8IHN0YXJ0X3MgKyBjb3VudDsgaSsrKSB7CisJCQlpZiAoSU5UX0dFVChsZWFmX3MtPmVudHNbaV0uYWRkcmVzcywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9OVUxMX0RBVEFQVFIpCisJCQkJc3RhbGUrKzsKKwkJfQorCX0gZWxzZQorCQlzdGFsZSA9IDA7CisJLyoKKwkgKiBDb3B5IHRoZSBsZWFmIGVudHJpZXMgZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24uCisJICovCisJbWVtY3B5KCZsZWFmX2QtPmVudHNbc3RhcnRfZF0sICZsZWFmX3MtPmVudHNbc3RhcnRfc10sCisJCWNvdW50ICogc2l6ZW9mKHhmc19kaXIyX2xlYWZfZW50cnlfdCkpOworCXhmc19kaXIyX2xlYWZfbG9nX2VudHModHAsIGJwX2QsIHN0YXJ0X2QsIHN0YXJ0X2QgKyBjb3VudCAtIDEpOworCS8qCisJICogSWYgdGhlcmUgYXJlIHNvdXJjZSBlbnRyaWVzIGFmdGVyIHRoZSBvbmVzIHdlIGNvcGllZCwKKwkgKiBkZWxldGUgdGhlIG9uZXMgd2UgY29waWVkIGJ5IHNsaWRpbmcgdGhlIG5leHQgb25lcyBkb3duLgorCSAqLworCWlmIChzdGFydF9zICsgY291bnQgPCBJTlRfR0VUKGxlYWZfcy0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpKSB7CisJCW1lbW1vdmUoJmxlYWZfcy0+ZW50c1tzdGFydF9zXSwgJmxlYWZfcy0+ZW50c1tzdGFydF9zICsgY291bnRdLAorCQkJY291bnQgKiBzaXplb2YoeGZzX2RpcjJfbGVhZl9lbnRyeV90KSk7CisJCXhmc19kaXIyX2xlYWZfbG9nX2VudHModHAsIGJwX3MsIHN0YXJ0X3MsIHN0YXJ0X3MgKyBjb3VudCAtIDEpOworCX0KKwkvKgorCSAqIFVwZGF0ZSB0aGUgaGVhZGVycyBhbmQgbG9nIHRoZW0uCisJICovCisJSU5UX01PRChsZWFmX3MtPmhkci5jb3VudCwgQVJDSF9DT05WRVJULCAtKGNvdW50KSk7CisJSU5UX01PRChsZWFmX3MtPmhkci5zdGFsZSwgQVJDSF9DT05WRVJULCAtKHN0YWxlKSk7CisJSU5UX01PRChsZWFmX2QtPmhkci5jb3VudCwgQVJDSF9DT05WRVJULCBjb3VudCk7CisJSU5UX01PRChsZWFmX2QtPmhkci5zdGFsZSwgQVJDSF9DT05WRVJULCBzdGFsZSk7CisJeGZzX2RpcjJfbGVhZl9sb2dfaGVhZGVyKHRwLCBicF9zKTsKKwl4ZnNfZGlyMl9sZWFmX2xvZ19oZWFkZXIodHAsIGJwX2QpOworCXhmc19kaXIyX2xlYWZuX2NoZWNrKGFyZ3MtPmRwLCBicF9zKTsKKwl4ZnNfZGlyMl9sZWFmbl9jaGVjayhhcmdzLT5kcCwgYnBfZCk7Cit9CisKKy8qCisgKiBEZXRlcm1pbmUgdGhlIHNvcnQgb3JkZXIgb2YgdHdvIGxlYWYgYmxvY2tzLgorICogUmV0dXJucyAxIGlmIGJvdGggYXJlIHZhbGlkIGFuZCBsZWFmMiBzaG91bGQgYmUgYmVmb3JlIGxlYWYxLCBlbHNlIDAuCisgKi8KK2ludAkJCQkJCS8qIHNvcnQgb3JkZXIgKi8KK3hmc19kaXIyX2xlYWZuX29yZGVyKAorCXhmc19kYWJ1Zl90CSpsZWFmMV9icCwJCS8qIGxlYWYxIGJ1ZmZlciAqLworCXhmc19kYWJ1Zl90CSpsZWFmMl9icCkJCS8qIGxlYWYyIGJ1ZmZlciAqLworeworCXhmc19kaXIyX2xlYWZfdAkqbGVhZjE7CQkJLyogbGVhZjEgc3RydWN0dXJlICovCisJeGZzX2RpcjJfbGVhZl90CSpsZWFmMjsJCQkvKiBsZWFmMiBzdHJ1Y3R1cmUgKi8KKworCWxlYWYxID0gbGVhZjFfYnAtPmRhdGE7CisJbGVhZjIgPSBsZWFmMl9icC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChsZWFmMS0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfTEVBRk5fTUFHSUMpOworCUFTU0VSVChJTlRfR0VUKGxlYWYyLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9MRUFGTl9NQUdJQyk7CisJaWYgKElOVF9HRVQobGVhZjEtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSA+IDAgJiYKKwkgICAgSU5UX0dFVChsZWFmMi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpID4gMCAmJgorCSAgICAoSU5UX0dFVChsZWFmMi0+ZW50c1swXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpIDwgSU5UX0dFVChsZWFmMS0+ZW50c1swXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpIHx8CisJICAgICBJTlRfR0VUKGxlYWYyLT5lbnRzW0lOVF9HRVQobGVhZjItPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAtIDFdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkgPAorCSAgICAgSU5UX0dFVChsZWFmMS0+ZW50c1tJTlRfR0VUKGxlYWYxLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgLSAxXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWJhbGFuY2UgbGVhZiBlbnRyaWVzIGJldHdlZW4gdHdvIGxlYWYgYmxvY2tzLgorICogVGhpcyBpcyBhY3R1YWxseSBvbmx5IGNhbGxlZCB3aGVuIHRoZSBzZWNvbmQgYmxvY2sgaXMgbmV3LAorICogdGhvdWdoIHRoZSBjb2RlIGRlYWxzIHdpdGggdGhlIGdlbmVyYWwgY2FzZS4KKyAqIEEgbmV3IGVudHJ5IHdpbGwgYmUgaW5zZXJ0ZWQgaW4gb25lIG9mIHRoZSBibG9ja3MsIGFuZCB0aGF0CisgKiBlbnRyeSBpcyB0YWtlbiBpbnRvIGFjY291bnQgd2hlbiBiYWxhbmNpbmcuCisgKi8KK3N0YXRpYyB2b2lkCit4ZnNfZGlyMl9sZWFmbl9yZWJhbGFuY2UoCisJeGZzX2RhX3N0YXRlX3QJCSpzdGF0ZSwJCS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19kYV9zdGF0ZV9ibGtfdAkqYmxrMSwJCS8qIGZpcnN0IGJ0cmVlIGJsb2NrICovCisJeGZzX2RhX3N0YXRlX2Jsa190CSpibGsyKQkJLyogc2Vjb25kIGJ0cmVlIGJsb2NrICovCit7CisJeGZzX2RhX2FyZ3NfdAkJKmFyZ3M7CQkvKiBvcGVyYXRpb24gYXJndW1lbnRzICovCisJaW50CQkJY291bnQ7CQkvKiBjb3VudCAoJiBkaXJlY3Rpb24pIGxlYXZlcyAqLworCWludAkJCWlzbGVmdDsJCS8qIG5ldyBnb2VzIGluIGxlZnQgbGVhZiAqLworCXhmc19kaXIyX2xlYWZfdAkJKmxlYWYxOwkJLyogZmlyc3QgbGVhZiBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9sZWFmX3QJCSpsZWFmMjsJCS8qIHNlY29uZCBsZWFmIHN0cnVjdHVyZSAqLworCWludAkJCW1pZDsJCS8qIG1pZHBvaW50IGxlYWYgaW5kZXggKi8KKyNpZmRlZiBERUJVRworCWludAkJCW9sZHN0YWxlOwkvKiBvbGQgY291bnQgb2Ygc3RhbGUgbGVhdmVzICovCisjZW5kaWYKKwlpbnQJCQlvbGRzdW07CQkvKiBvbGQgdG90YWwgbGVhZiBjb3VudCAqLworCWludAkJCXN3YXA7CQkvKiBzd2FwcGVkIGxlYWYgYmxvY2tzICovCisKKwlhcmdzID0gc3RhdGUtPmFyZ3M7CisJLyoKKwkgKiBJZiB0aGUgYmxvY2sgb3JkZXIgaXMgd3JvbmcsIHN3YXAgdGhlIGFyZ3VtZW50cy4KKwkgKi8KKwlpZiAoKHN3YXAgPSB4ZnNfZGlyMl9sZWFmbl9vcmRlcihibGsxLT5icCwgYmxrMi0+YnApKSkgeworCQl4ZnNfZGFfc3RhdGVfYmxrX3QJKnRtcDsJLyogdGVtcCBmb3IgYmxvY2sgc3dhcCAqLworCisJCXRtcCA9IGJsazE7CisJCWJsazEgPSBibGsyOworCQlibGsyID0gdG1wOworCX0KKwlsZWFmMSA9IGJsazEtPmJwLT5kYXRhOworCWxlYWYyID0gYmxrMi0+YnAtPmRhdGE7CisJb2xkc3VtID0gSU5UX0dFVChsZWFmMS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpICsgSU5UX0dFVChsZWFmMi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOworI2lmZGVmIERFQlVHCisJb2xkc3RhbGUgPSBJTlRfR0VUKGxlYWYxLT5oZHIuc3RhbGUsIEFSQ0hfQ09OVkVSVCkgKyBJTlRfR0VUKGxlYWYyLT5oZHIuc3RhbGUsIEFSQ0hfQ09OVkVSVCk7CisjZW5kaWYKKwltaWQgPSBvbGRzdW0gPj4gMTsKKwkvKgorCSAqIElmIHRoZSBvbGQgbGVhZiBjb3VudCB3YXMgb2RkIHRoZW4gdGhlIG5ldyBvbmUgd2lsbCBiZSBldmVuLAorCSAqIHNvIHdlIG5lZWQgdG8gZGl2aWRlIHRoZSBuZXcgY291bnQgZXZlbmx5LgorCSAqLworCWlmIChvbGRzdW0gJiAxKSB7CisJCXhmc19kYWhhc2hfdAltaWRoYXNoOwkvKiBtaWRkbGUgZW50cnkgaGFzaCB2YWx1ZSAqLworCisJCWlmIChtaWQgPj0gSU5UX0dFVChsZWFmMS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpKQorCQkJbWlkaGFzaCA9IElOVF9HRVQobGVhZjItPmVudHNbbWlkIC0gSU5UX0dFVChsZWFmMS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpOworCQllbHNlCisJCQltaWRoYXNoID0gSU5UX0dFVChsZWFmMS0+ZW50c1ttaWRdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCk7CisJCWlzbGVmdCA9IGFyZ3MtPmhhc2h2YWwgPD0gbWlkaGFzaDsKKwl9CisJLyoKKwkgKiBJZiB0aGUgb2xkIGNvdW50IGlzIGV2ZW4gdGhlbiB0aGUgbmV3IGNvdW50IGlzIG9kZCwgc28gdGhlcmUncworCSAqIG5vIHByZWZlcnJlZCBzaWRlIGZvciB0aGUgbmV3IGVudHJ5LgorCSAqIFBpY2sgdGhlIGxlZnQgb25lLgorCSAqLworCWVsc2UKKwkJaXNsZWZ0ID0gMTsKKwkvKgorCSAqIENhbGN1bGF0ZSBtb3ZlZCBlbnRyeSBjb3VudC4gIFBvc2l0aXZlIG1lYW5zIGxlZnQtdG8tcmlnaHQsCisJICogbmVnYXRpdmUgbWVhbnMgcmlnaHQtdG8tbGVmdC4gIFRoZW4gbW92ZSB0aGUgZW50cmllcy4KKwkgKi8KKwljb3VudCA9IElOVF9HRVQobGVhZjEtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAtIG1pZCArIChpc2xlZnQgPT0gMCk7CisJaWYgKGNvdW50ID4gMCkKKwkJeGZzX2RpcjJfbGVhZm5fbW92ZWVudHMoYXJncywgYmxrMS0+YnAsCisJCQlJTlRfR0VUKGxlYWYxLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgLSBjb3VudCwgYmxrMi0+YnAsIDAsIGNvdW50KTsKKwllbHNlIGlmIChjb3VudCA8IDApCisJCXhmc19kaXIyX2xlYWZuX21vdmVlbnRzKGFyZ3MsIGJsazItPmJwLCAwLCBibGsxLT5icCwKKwkJCUlOVF9HRVQobGVhZjEtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSwgY291bnQpOworCUFTU0VSVChJTlRfR0VUKGxlYWYxLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgKyBJTlRfR0VUKGxlYWYyLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgPT0gb2xkc3VtKTsKKwlBU1NFUlQoSU5UX0dFVChsZWFmMS0+aGRyLnN0YWxlLCBBUkNIX0NPTlZFUlQpICsgSU5UX0dFVChsZWFmMi0+aGRyLnN0YWxlLCBBUkNIX0NPTlZFUlQpID09IG9sZHN0YWxlKTsKKwkvKgorCSAqIE1hcmsgd2hldGhlciB3ZSdyZSBpbnNlcnRpbmcgaW50byB0aGUgb2xkIG9yIG5ldyBsZWFmLgorCSAqLworCWlmIChJTlRfR0VUKGxlYWYxLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgPCBJTlRfR0VUKGxlYWYyLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkpCisJCXN0YXRlLT5pbmxlYWYgPSBzd2FwOworCWVsc2UgaWYgKElOVF9HRVQobGVhZjEtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSA+IElOVF9HRVQobGVhZjItPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSkKKwkJc3RhdGUtPmlubGVhZiA9ICFzd2FwOworCWVsc2UKKwkJc3RhdGUtPmlubGVhZiA9CisJCQlzd2FwIF4gKGJsazEtPmluZGV4IDw9IElOVF9HRVQobGVhZjEtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSk7CisJLyoKKwkgKiBBZGp1c3QgdGhlIGV4cGVjdGVkIGluZGV4IGZvciBpbnNlcnRpb24uCisJICovCisJaWYgKCFzdGF0ZS0+aW5sZWFmKQorCQlibGsyLT5pbmRleCA9IGJsazEtPmluZGV4IC0gSU5UX0dFVChsZWFmMS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOworCQorCS8qIAorCSAqIEZpbmFsbHkgc2FuaXR5IGNoZWNrIGp1c3QgdG8gbWFrZSBzdXJlIHdlIGFyZSBub3QgcmV0dXJuaW5nIGEgbmVnYXRpdmUgaW5kZXggCisJICovCisJaWYoYmxrMi0+aW5kZXggPCAwKSB7CisJCXN0YXRlLT5pbmxlYWYgPSAxOworCQlibGsyLT5pbmRleCA9IDA7CisJCWNtbl9lcnIoQ0VfQUxFUlQsCisJCQkieGZzX2RpcjJfbGVhZm5fcmViYWxhbmNlOiBwaWNrZWQgdGhlIHdyb25nIGxlYWY/IHJldmVydGluZyBvcmlnbmFsIGxlYWY6ICIKKwkJCSJibGsxLT5pbmRleCAlZFxuIiwKKwkJCWJsazEtPmluZGV4KTsKKwl9Cit9CisKKy8qCisgKiBSZW1vdmUgYW4gZW50cnkgZnJvbSBhIG5vZGUgZGlyZWN0b3J5LgorICogVGhpcyByZW1vdmVzIHRoZSBsZWFmIGVudHJ5IGFuZCB0aGUgZGF0YSBlbnRyeSwKKyAqIGFuZCB1cGRhdGVzIHRoZSBmcmVlIGJsb2NrIGlmIG5lY2Vzc2FyeS4KKyAqLworc3RhdGljIGludAkJCQkJLyogZXJyb3IgKi8KK3hmc19kaXIyX2xlYWZuX3JlbW92ZSgKKwl4ZnNfZGFfYXJnc190CQkqYXJncywJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KKwl4ZnNfZGFidWZfdAkJKmJwLAkJLyogbGVhZiBidWZmZXIgKi8KKwlpbnQJCQlpbmRleCwJCS8qIGxlYWYgZW50cnkgaW5kZXggKi8KKwl4ZnNfZGFfc3RhdGVfYmxrX3QJKmRibGssCQkvKiBkYXRhIGJsb2NrICovCisJaW50CQkJKnJ2YWwpCQkvKiByZXN1bHRpbmcgYmxvY2sgbmVlZHMgam9pbiAqLworeworCXhmc19kaXIyX2RhdGFfdAkJKmRhdGE7CQkvKiBkYXRhIGJsb2NrIHN0cnVjdHVyZSAqLworCXhmc19kaXIyX2RiX3QJCWRiOwkJLyogZGF0YSBibG9jayBudW1iZXIgKi8KKwl4ZnNfZGFidWZfdAkJKmRicDsJCS8qIGRhdGEgYmxvY2sgYnVmZmVyICovCisJeGZzX2RpcjJfZGF0YV9lbnRyeV90CSpkZXA7CQkvKiBkYXRhIGJsb2NrIGVudHJ5ICovCisJeGZzX2lub2RlX3QJCSpkcDsJCS8qIGluY29yZSBkaXJlY3RvcnkgaW5vZGUgKi8KKwl4ZnNfZGlyMl9sZWFmX3QJCSpsZWFmOwkJLyogbGVhZiBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9sZWFmX2VudHJ5X3QJKmxlcDsJCS8qIGxlYWYgZW50cnkgKi8KKwlpbnQJCQlsb25nZXN0OwkvKiBsb25nZXN0IGRhdGEgZnJlZSBlbnRyeSAqLworCWludAkJCW9mZjsJCS8qIGRhdGEgYmxvY2sgZW50cnkgb2Zmc2V0ICovCisJeGZzX21vdW50X3QJCSptcDsJCS8qIGZpbGVzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwlpbnQJCQluZWVkbG9nOwkvKiBuZWVkIHRvIGxvZyBkYXRhIGhlYWRlciAqLworCWludAkJCW5lZWRzY2FuOwkvKiBuZWVkIHRvIHJlc2NhbiBkYXRhIGZyZWVzICovCisJeGZzX3RyYW5zX3QJCSp0cDsJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKworCXhmc19kaXIyX3RyYWNlX2FyZ3Nfc2IoImxlYWZuX3JlbW92ZSIsIGFyZ3MsIGluZGV4LCBicCk7CisJZHAgPSBhcmdzLT5kcDsKKwl0cCA9IGFyZ3MtPnRyYW5zOworCW1wID0gZHAtPmlfbW91bnQ7CisJbGVhZiA9IGJwLT5kYXRhOworCUFTU0VSVChJTlRfR0VUKGxlYWYtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0xFQUZOX01BR0lDKTsKKwkvKgorCSAqIFBvaW50IHRvIHRoZSBlbnRyeSB3ZSdyZSByZW1vdmluZy4KKwkgKi8KKwlsZXAgPSAmbGVhZi0+ZW50c1tpbmRleF07CisJLyoKKwkgKiBFeHRyYWN0IHRoZSBkYXRhIGJsb2NrIGFuZCBvZmZzZXQgZnJvbSB0aGUgZW50cnkuCisJICovCisJZGIgPSBYRlNfRElSMl9EQVRBUFRSX1RPX0RCKG1wLCBJTlRfR0VUKGxlcC0+YWRkcmVzcywgQVJDSF9DT05WRVJUKSk7CisJQVNTRVJUKGRibGstPmJsa25vID09IGRiKTsKKwlvZmYgPSBYRlNfRElSMl9EQVRBUFRSX1RPX09GRihtcCwgSU5UX0dFVChsZXAtPmFkZHJlc3MsIEFSQ0hfQ09OVkVSVCkpOworCUFTU0VSVChkYmxrLT5pbmRleCA9PSBvZmYpOworCS8qCisJICogS2lsbCB0aGUgbGVhZiBlbnRyeSBieSBtYXJraW5nIGl0IHN0YWxlLgorCSAqIExvZyB0aGUgbGVhZiBibG9jayBjaGFuZ2VzLgorCSAqLworCUlOVF9NT0QobGVhZi0+aGRyLnN0YWxlLCBBUkNIX0NPTlZFUlQsICsxKTsKKwl4ZnNfZGlyMl9sZWFmX2xvZ19oZWFkZXIodHAsIGJwKTsKKwlJTlRfU0VUKGxlcC0+YWRkcmVzcywgQVJDSF9DT05WRVJULCBYRlNfRElSMl9OVUxMX0RBVEFQVFIpOworCXhmc19kaXIyX2xlYWZfbG9nX2VudHModHAsIGJwLCBpbmRleCwgaW5kZXgpOworCS8qCisJICogTWFrZSB0aGUgZGF0YSBlbnRyeSBmcmVlLiAgS2VlcCB0cmFjayBvZiB0aGUgbG9uZ2VzdCBmcmVlc3BhY2UKKwkgKiBpbiB0aGUgZGF0YSBibG9jayBpbiBjYXNlIGl0IGNoYW5nZXMuCisJICovCisJZGJwID0gZGJsay0+YnA7CisJZGF0YSA9IGRicC0+ZGF0YTsKKwlkZXAgPSAoeGZzX2RpcjJfZGF0YV9lbnRyeV90ICopKChjaGFyICopZGF0YSArIG9mZik7CisJbG9uZ2VzdCA9IElOVF9HRVQoZGF0YS0+aGRyLmJlc3RmcmVlWzBdLmxlbmd0aCwgQVJDSF9DT05WRVJUKTsKKwluZWVkbG9nID0gbmVlZHNjYW4gPSAwOworCXhmc19kaXIyX2RhdGFfbWFrZV9mcmVlKHRwLCBkYnAsIG9mZiwKKwkJWEZTX0RJUjJfREFUQV9FTlRTSVpFKGRlcC0+bmFtZWxlbiksICZuZWVkbG9nLCAmbmVlZHNjYW4pOworCS8qCisJICogUmVzY2FuIHRoZSBkYXRhIGJsb2NrIGZyZWVzcGFjZXMgZm9yIGJlc3RmcmVlLgorCSAqIExvZyB0aGUgZGF0YSBibG9jayBoZWFkZXIgaWYgbmVlZGVkLgorCSAqLworCWlmIChuZWVkc2NhbikKKwkJeGZzX2RpcjJfZGF0YV9mcmVlc2NhbihtcCwgZGF0YSwgJm5lZWRsb2csIE5VTEwpOworCWlmIChuZWVkbG9nKQorCQl4ZnNfZGlyMl9kYXRhX2xvZ19oZWFkZXIodHAsIGRicCk7CisJeGZzX2RpcjJfZGF0YV9jaGVjayhkcCwgZGJwKTsKKwkvKgorCSAqIElmIHRoZSBsb25nZXN0IGRhdGEgYmxvY2sgZnJlZXNwYWNlIGNoYW5nZXMsIG5lZWQgdG8gdXBkYXRlCisJICogdGhlIGNvcnJlc3BvbmRpbmcgZnJlZWJsb2NrIGVudHJ5LgorCSAqLworCWlmIChsb25nZXN0IDwgSU5UX0dFVChkYXRhLT5oZHIuYmVzdGZyZWVbMF0ubGVuZ3RoLCBBUkNIX0NPTlZFUlQpKSB7CisJCWludAkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwkJeGZzX2RhYnVmX3QJKmZicDsJCS8qIGZyZWVibG9jayBidWZmZXIgKi8KKwkJeGZzX2RpcjJfZGJfdAlmZGI7CQkvKiBmcmVlYmxvY2sgYmxvY2sgbnVtYmVyICovCisJCWludAkJZmluZGV4OwkJLyogaW5kZXggaW4gZnJlZWJsb2NrIGVudHJpZXMgKi8KKwkJeGZzX2RpcjJfZnJlZV90CSpmcmVlOwkJLyogZnJlZWJsb2NrIHN0cnVjdHVyZSAqLworCQlpbnQJCWxvZ2ZyZWU7CS8qIG5lZWQgdG8gbG9nIGZyZWUgZW50cnkgKi8KKworCQkvKgorCQkgKiBDb252ZXJ0IHRoZSBkYXRhIGJsb2NrIG51bWJlciB0byBhIGZyZWUgYmxvY2ssCisJCSAqIHJlYWQgaW4gdGhlIGZyZWUgYmxvY2suCisJCSAqLworCQlmZGIgPSBYRlNfRElSMl9EQl9UT19GREIobXAsIGRiKTsKKwkJaWYgKChlcnJvciA9IHhmc19kYV9yZWFkX2J1Zih0cCwgZHAsIFhGU19ESVIyX0RCX1RPX0RBKG1wLCBmZGIpLAorCQkJCS0xLCAmZmJwLCBYRlNfREFUQV9GT1JLKSkpIHsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQlmcmVlID0gZmJwLT5kYXRhOworCQlBU1NFUlQoSU5UX0dFVChmcmVlLT5oZHIubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfRlJFRV9NQUdJQyk7CisJCUFTU0VSVChJTlRfR0VUKGZyZWUtPmhkci5maXJzdGRiLCBBUkNIX0NPTlZFUlQpID09CisJCSAgICAgICBYRlNfRElSMl9NQVhfRlJFRV9CRVNUUyhtcCkgKgorCQkgICAgICAgKGZkYiAtIFhGU19ESVIyX0ZSRUVfRklSU1REQihtcCkpKTsKKwkJLyoKKwkJICogQ2FsY3VsYXRlIHdoaWNoIGVudHJ5IHdlIG5lZWQgdG8gZml4LgorCQkgKi8KKwkJZmluZGV4ID0gWEZTX0RJUjJfREJfVE9fRkRJTkRFWChtcCwgZGIpOworCQlsb25nZXN0ID0gSU5UX0dFVChkYXRhLT5oZHIuYmVzdGZyZWVbMF0ubGVuZ3RoLCBBUkNIX0NPTlZFUlQpOworCQkvKgorCQkgKiBJZiB0aGUgZGF0YSBibG9jayBpcyBub3cgZW1wdHkgd2UgY2FuIGdldCByaWQgb2YgaXQKKwkJICogKHVzdWFsbHkpLgorCQkgKi8KKwkJaWYgKGxvbmdlc3QgPT0gbXAtPm1fZGlyYmxrc2l6ZSAtICh1aW50KXNpemVvZihkYXRhLT5oZHIpKSB7CisJCQkvKgorCQkJICogVHJ5IHRvIHB1bmNoIG91dCB0aGUgZGF0YSBibG9jay4KKwkJCSAqLworCQkJZXJyb3IgPSB4ZnNfZGlyMl9zaHJpbmtfaW5vZGUoYXJncywgZGIsIGRicCk7CisJCQlpZiAoZXJyb3IgPT0gMCkgeworCQkJCWRibGstPmJwID0gTlVMTDsKKwkJCQlkYXRhID0gTlVMTDsKKwkJCX0KKwkJCS8qCisJCQkgKiBXZSBjYW4gZ2V0IEVOT1NQQyBpZiB0aGVyZSdzIG5vIHNwYWNlIHJlc2VydmF0aW9uLgorCQkJICogSW4gdGhpcyBjYXNlIGp1c3QgZHJvcCB0aGUgYnVmZmVyIGFuZCBzb21lIG9uZSBlbHNlCisJCQkgKiB3aWxsIGV2ZW50dWFsbHkgZ2V0IHJpZCBvZiB0aGUgZW1wdHkgYmxvY2suCisJCQkgKi8KKwkJCWVsc2UgaWYgKGVycm9yID09IEVOT1NQQyAmJiBhcmdzLT50b3RhbCA9PSAwKQorCQkJCXhmc19kYV9idWZfZG9uZShkYnApOworCQkJZWxzZQorCQkJCXJldHVybiBlcnJvcjsKKwkJfQorCQkvKgorCQkgKiBJZiB3ZSBnb3QgcmlkIG9mIHRoZSBkYXRhIGJsb2NrLCB3ZSBjYW4gZWxpbWluYXRlIHRoYXQgZW50cnkKKwkJICogaW4gdGhlIGZyZWUgYmxvY2suCisJCSAqLworCQlpZiAoZGF0YSA9PSBOVUxMKSB7CisJCQkvKgorCQkJICogT25lIGxlc3MgdXNlZCBlbnRyeSBpbiB0aGUgZnJlZSB0YWJsZS4KKwkJCSAqLworCQkJSU5UX01PRChmcmVlLT5oZHIubnVzZWQsIEFSQ0hfQ09OVkVSVCwgLTEpOworCQkJeGZzX2RpcjJfZnJlZV9sb2dfaGVhZGVyKHRwLCBmYnApOworCQkJLyoKKwkJCSAqIElmIHRoaXMgd2FzIHRoZSBsYXN0IGVudHJ5IGluIHRoZSB0YWJsZSwgd2UgY2FuCisJCQkgKiB0cmltIHRoZSB0YWJsZSBzaXplIGJhY2suICBUaGVyZSBtaWdodCBiZSBvdGhlcgorCQkJICogZW50cmllcyBhdCB0aGUgZW5kIHJlZmVycmluZyB0byBub24tZXhpc3RlbnQKKwkJCSAqIGRhdGEgYmxvY2tzLCBnZXQgdGhvc2UgdG9vLgorCQkJICovCisJCQlpZiAoZmluZGV4ID09IElOVF9HRVQoZnJlZS0+aGRyLm52YWxpZCwgQVJDSF9DT05WRVJUKSAtIDEpIHsKKwkJCQlpbnQJaTsJCS8qIGZyZWUgZW50cnkgaW5kZXggKi8KKworCQkJCWZvciAoaSA9IGZpbmRleCAtIDE7CisJCQkJICAgICBpID49IDAgJiYgSU5UX0dFVChmcmVlLT5iZXN0c1tpXSwgQVJDSF9DT05WRVJUKSA9PSBOVUxMREFUQU9GRjsKKwkJCQkgICAgIGktLSkKKwkJCQkJY29udGludWU7CisJCQkJSU5UX1NFVChmcmVlLT5oZHIubnZhbGlkLCBBUkNIX0NPTlZFUlQsIGkgKyAxKTsKKwkJCQlsb2dmcmVlID0gMDsKKwkJCX0KKwkJCS8qCisJCQkgKiBOb3QgdGhlIGxhc3QgZW50cnksIGp1c3QgcHVuY2ggaXQgb3V0LgorCQkJICovCisJCQllbHNlIHsKKwkJCQlJTlRfU0VUKGZyZWUtPmJlc3RzW2ZpbmRleF0sIEFSQ0hfQ09OVkVSVCwgTlVMTERBVEFPRkYpOworCQkJCWxvZ2ZyZWUgPSAxOworCQkJfQorCQkJLyoKKwkJCSAqIElmIHRoZXJlIGFyZSBubyB1c2VmdWwgZW50cmllcyBsZWZ0IGluIHRoZSBibG9jaywKKwkJCSAqIGdldCByaWQgb2YgdGhlIGJsb2NrIGlmIHdlIGNhbi4KKwkJCSAqLworCQkJaWYgKCFmcmVlLT5oZHIubnVzZWQpIHsKKwkJCQllcnJvciA9IHhmc19kaXIyX3Nocmlua19pbm9kZShhcmdzLCBmZGIsIGZicCk7CisJCQkJaWYgKGVycm9yID09IDApIHsKKwkJCQkJZmJwID0gTlVMTDsKKwkJCQkJbG9nZnJlZSA9IDA7CisJCQkJfSBlbHNlIGlmIChlcnJvciAhPSBFTk9TUEMgfHwgYXJncy0+dG90YWwgIT0gMCkKKwkJCQkJcmV0dXJuIGVycm9yOworCQkJCS8qCisJCQkJICogSXQncyBwb3NzaWJsZSB0byBnZXQgRU5PU1BDIGlmIHRoZXJlIGlzIG5vCisJCQkJICogc3BhY2UgcmVzZXJ2YXRpb24uICBJbiB0aGlzIGNhc2Ugc29tZSBvbmUKKwkJCQkgKiBlbHNlIHdpbGwgZXZlbnR1YWxseSBnZXQgcmlkIG9mIHRoaXMgYmxvY2suCisJCQkJICovCisJCQl9CisJCX0KKwkJLyoKKwkJICogRGF0YSBibG9jayBpcyBub3QgZW1wdHksIGp1c3Qgc2V0IHRoZSBmcmVlIGVudHJ5IHRvCisJCSAqIHRoZSBuZXcgdmFsdWUuCisJCSAqLworCQllbHNlIHsKKwkJCUlOVF9TRVQoZnJlZS0+YmVzdHNbZmluZGV4XSwgQVJDSF9DT05WRVJULCBsb25nZXN0KTsKKwkJCWxvZ2ZyZWUgPSAxOworCQl9CisJCS8qCisJCSAqIExvZyB0aGUgZnJlZSBlbnRyeSB0aGF0IGNoYW5nZWQsIHVubGVzcyB3ZSBnb3QgcmlkIG9mIGl0LgorCQkgKi8KKwkJaWYgKGxvZ2ZyZWUpCisJCQl4ZnNfZGlyMl9mcmVlX2xvZ19iZXN0cyh0cCwgZmJwLCBmaW5kZXgsIGZpbmRleCk7CisJCS8qCisJCSAqIERyb3AgdGhlIGJ1ZmZlciBpZiB3ZSBzdGlsbCBoYXZlIGl0LgorCQkgKi8KKwkJaWYgKGZicCkKKwkJCXhmc19kYV9idWZfZG9uZShmYnApOworCX0KKwl4ZnNfZGlyMl9sZWFmbl9jaGVjayhkcCwgYnApOworCS8qCisJICogUmV0dXJuIGluZGljYXRpb24gb2Ygd2hldGhlciB0aGlzIGxlYWYgYmxvY2sgaXMgZW10cHkgZW5vdWdoCisJICogdG8ganVzdGlmeSB0cnlpbmcgdG8gam9pbiBpdCB3aXRoIGEgbmVpZ2hib3IuCisJICovCisJKnJ2YWwgPQorCQkoKHVpbnQpc2l6ZW9mKGxlYWYtPmhkcikgKworCQkgKHVpbnQpc2l6ZW9mKGxlYWYtPmVudHNbMF0pICoKKwkJIChJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAtIElOVF9HRVQobGVhZi0+aGRyLnN0YWxlLCBBUkNIX0NPTlZFUlQpKSkgPAorCQltcC0+bV9kaXJfbWFnaWNwY3Q7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTcGxpdCB0aGUgbGVhZiBlbnRyaWVzIGluIHRoZSBvbGQgYmxvY2sgaW50byBvbGQgYW5kIG5ldyBibG9ja3MuCisgKi8KK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9sZWFmbl9zcGxpdCgKKwl4ZnNfZGFfc3RhdGVfdAkJKnN0YXRlLAkJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2RhX3N0YXRlX2Jsa190CSpvbGRibGssCS8qIG9yaWdpbmFsIGJsb2NrICovCisJeGZzX2RhX3N0YXRlX2Jsa190CSpuZXdibGspCS8qIG5ld2x5IGNyZWF0ZWQgYmxvY2sgKi8KK3sKKwl4ZnNfZGFfYXJnc190CQkqYXJnczsJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KKwl4ZnNfZGFibGtfdAkJYmxrbm87CQkvKiBuZXcgbGVhZiBibG9jayBudW1iZXIgKi8KKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCXhmc19tb3VudF90CQkqbXA7CQkvKiBmaWxlc3lzdGVtIG1vdW50IHBvaW50ICovCisKKwkvKgorCSAqIEFsbG9jYXRlIHNwYWNlIGZvciBhIG5ldyBsZWFmIG5vZGUuCisJICovCisJYXJncyA9IHN0YXRlLT5hcmdzOworCW1wID0gYXJncy0+ZHAtPmlfbW91bnQ7CisJQVNTRVJUKGFyZ3MgIT0gTlVMTCk7CisJQVNTRVJUKG9sZGJsay0+bWFnaWMgPT0gWEZTX0RJUjJfTEVBRk5fTUFHSUMpOworCWVycm9yID0geGZzX2RhX2dyb3dfaW5vZGUoYXJncywgJmJsa25vKTsKKwlpZiAoZXJyb3IpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIG5ldyBsZWFmIGJsb2NrLgorCSAqLworCWVycm9yID0geGZzX2RpcjJfbGVhZl9pbml0KGFyZ3MsIFhGU19ESVIyX0RBX1RPX0RCKG1wLCBibGtubyksCisJCSZuZXdibGstPmJwLCBYRlNfRElSMl9MRUFGTl9NQUdJQyk7CisJaWYgKGVycm9yKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJbmV3YmxrLT5ibGtubyA9IGJsa25vOworCW5ld2Jsay0+bWFnaWMgPSBYRlNfRElSMl9MRUFGTl9NQUdJQzsKKwkvKgorCSAqIFJlYmFsYW5jZSB0aGUgZW50cmllcyBhY3Jvc3MgdGhlIHR3byBsZWF2ZXMsIGxpbmsgdGhlIG5ldworCSAqIGJsb2NrIGludG8gdGhlIGxlYXZlcy4KKwkgKi8KKwl4ZnNfZGlyMl9sZWFmbl9yZWJhbGFuY2Uoc3RhdGUsIG9sZGJsaywgbmV3YmxrKTsKKwllcnJvciA9IHhmc19kYV9ibGtfbGluayhzdGF0ZSwgb2xkYmxrLCBuZXdibGspOworCWlmIChlcnJvcikgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCS8qCisJICogSW5zZXJ0IHRoZSBuZXcgZW50cnkgaW4gdGhlIGNvcnJlY3QgYmxvY2suCisJICovCisJaWYgKHN0YXRlLT5pbmxlYWYpCisJCWVycm9yID0geGZzX2RpcjJfbGVhZm5fYWRkKG9sZGJsay0+YnAsIGFyZ3MsIG9sZGJsay0+aW5kZXgpOworCWVsc2UKKwkJZXJyb3IgPSB4ZnNfZGlyMl9sZWFmbl9hZGQobmV3YmxrLT5icCwgYXJncywgbmV3YmxrLT5pbmRleCk7CisJLyoKKwkgKiBVcGRhdGUgbGFzdCBoYXNodmFsIGluIGVhY2ggYmxvY2sgc2luY2Ugd2UgYWRkZWQgdGhlIG5hbWUuCisJICovCisJb2xkYmxrLT5oYXNodmFsID0geGZzX2RpcjJfbGVhZm5fbGFzdGhhc2gob2xkYmxrLT5icCwgTlVMTCk7CisJbmV3YmxrLT5oYXNodmFsID0geGZzX2RpcjJfbGVhZm5fbGFzdGhhc2gobmV3YmxrLT5icCwgTlVMTCk7CisJeGZzX2RpcjJfbGVhZm5fY2hlY2soYXJncy0+ZHAsIG9sZGJsay0+YnApOworCXhmc19kaXIyX2xlYWZuX2NoZWNrKGFyZ3MtPmRwLCBuZXdibGstPmJwKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBDaGVjayBhIGxlYWYgYmxvY2sgYW5kIGl0cyBuZWlnaGJvcnMgdG8gc2VlIGlmIHRoZSBibG9jayBzaG91bGQgYmUKKyAqIGNvbGxhcHNlZCBpbnRvIG9uZSBvciB0aGUgb3RoZXIgbmVpZ2hib3IuICBBbHdheXMga2VlcCB0aGUgYmxvY2sKKyAqIHdpdGggdGhlIHNtYWxsZXIgYmxvY2sgbnVtYmVyLgorICogSWYgdGhlIGN1cnJlbnQgYmxvY2sgaXMgb3ZlciA1MCUgZnVsbCwgZG9uJ3QgdHJ5IHRvIGpvaW4gaXQsIHJldHVybiAwLgorICogSWYgdGhlIGJsb2NrIGlzIGVtcHR5LCBmaWxsIGluIHRoZSBzdGF0ZSBzdHJ1Y3R1cmUgYW5kIHJldHVybiAyLgorICogSWYgaXQgY2FuIGJlIGNvbGxhcHNlZCwgZmlsbCBpbiB0aGUgc3RhdGUgc3RydWN0dXJlIGFuZCByZXR1cm4gMS4KKyAqIElmIG5vdGhpbmcgY2FuIGJlIGRvbmUsIHJldHVybiAwLgorICovCitpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2RpcjJfbGVhZm5fdG9vc21hbGwoCisJeGZzX2RhX3N0YXRlX3QJCSpzdGF0ZSwJCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJCSphY3Rpb24pCS8qIHJlc3VsdGluZyBhY3Rpb24gdG8gdGFrZSAqLworeworCXhmc19kYV9zdGF0ZV9ibGtfdAkqYmxrOwkJLyogbGVhZiBibG9jayAqLworCXhmc19kYWJsa190CQlibGtubzsJCS8qIGxlYWYgYmxvY2sgbnVtYmVyICovCisJeGZzX2RhYnVmX3QJCSpicDsJCS8qIGxlYWYgYnVmZmVyICovCisJaW50CQkJYnl0ZXM7CQkvKiBieXRlcyBpbiB1c2UgKi8KKwlpbnQJCQljb3VudDsJCS8qIGxlYWYgbGl2ZSBlbnRyeSBjb3VudCAqLworCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJaW50CQkJZm9yd2FyZDsJLyogc2libGluZyBibG9jayBkaXJlY3Rpb24gKi8KKwlpbnQJCQlpOwkJLyogc2libGluZyBjb3VudGVyICovCisJeGZzX2RhX2Jsa2luZm9fdAkqaW5mbzsJCS8qIGxlYWYgYmxvY2sgaGVhZGVyICovCisJeGZzX2RpcjJfbGVhZl90CQkqbGVhZjsJCS8qIGxlYWYgc3RydWN0dXJlICovCisJaW50CQkJcnZhbDsJCS8qIHJlc3VsdCBmcm9tIHBhdGhfc2hpZnQgKi8KKworCS8qCisJICogQ2hlY2sgZm9yIHRoZSBkZWdlbmVyYXRlIGNhc2Ugb2YgdGhlIGJsb2NrIGJlaW5nIG92ZXIgNTAlIGZ1bGwuCisJICogSWYgc28sIGl0J3Mgbm90IHdvcnRoIGV2ZW4gbG9va2luZyB0byBzZWUgaWYgd2UgbWlnaHQgYmUgYWJsZQorCSAqIHRvIGNvYWxlc2NlIHdpdGggYSBzaWJsaW5nLgorCSAqLworCWJsayA9ICZzdGF0ZS0+cGF0aC5ibGtbc3RhdGUtPnBhdGguYWN0aXZlIC0gMV07CisJaW5mbyA9IGJsay0+YnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQoaW5mby0+bWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfTEVBRk5fTUFHSUMpOworCWxlYWYgPSAoeGZzX2RpcjJfbGVhZl90ICopaW5mbzsKKwljb3VudCA9IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpIC0gSU5UX0dFVChsZWFmLT5oZHIuc3RhbGUsIEFSQ0hfQ09OVkVSVCk7CisJYnl0ZXMgPSAodWludClzaXplb2YobGVhZi0+aGRyKSArIGNvdW50ICogKHVpbnQpc2l6ZW9mKGxlYWYtPmVudHNbMF0pOworCWlmIChieXRlcyA+IChzdGF0ZS0+YmxvY2tzaXplID4+IDEpKSB7CisJCS8qCisJCSAqIEJsayBvdmVyIDUwJSwgZG9uJ3QgdHJ5IHRvIGpvaW4uCisJCSAqLworCQkqYWN0aW9uID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogQ2hlY2sgZm9yIHRoZSBkZWdlbmVyYXRlIGNhc2Ugb2YgdGhlIGJsb2NrIGJlaW5nIGVtcHR5LgorCSAqIElmIHRoZSBibG9jayBpcyBlbXB0eSwgd2UnbGwgc2ltcGx5IGRlbGV0ZSBpdCwgbm8gbmVlZCB0bworCSAqIGNvYWxlc2NlIGl0IHdpdGggYSBzaWJsaW5nIGJsb2NrLiAgV2UgY2hvb3NlIChhcmJpdHJhcmlseSkKKwkgKiB0byBtZXJnZSB3aXRoIHRoZSBmb3J3YXJkIGJsb2NrIHVubGVzcyBpdCBpcyBOVUxMLgorCSAqLworCWlmIChjb3VudCA9PSAwKSB7CisJCS8qCisJCSAqIE1ha2UgYWx0cGF0aCBwb2ludCB0byB0aGUgYmxvY2sgd2Ugd2FudCB0byBrZWVwIGFuZAorCQkgKiBwYXRoIHBvaW50IHRvIHRoZSBibG9jayB3ZSB3YW50IHRvIGRyb3AgKHRoaXMgb25lKS4KKwkJICovCisJCWZvcndhcmQgPSBpbmZvLT5mb3J3OworCQltZW1jcHkoJnN0YXRlLT5hbHRwYXRoLCAmc3RhdGUtPnBhdGgsIHNpemVvZihzdGF0ZS0+cGF0aCkpOworCQllcnJvciA9IHhmc19kYV9wYXRoX3NoaWZ0KHN0YXRlLCAmc3RhdGUtPmFsdHBhdGgsIGZvcndhcmQsIDAsCisJCQkmcnZhbCk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwkJKmFjdGlvbiA9IHJ2YWwgPyAyIDogMDsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogRXhhbWluZSBlYWNoIHNpYmxpbmcgYmxvY2sgdG8gc2VlIGlmIHdlIGNhbiBjb2FsZXNjZSB3aXRoCisJICogYXQgbGVhc3QgMjUlIGZyZWUgc3BhY2UgdG8gc3BhcmUuICBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQKKwkgKiB3aGV0aGVyIHRvIG1lcmdlIHdpdGggdGhlIGZvcndhcmQgb3IgdGhlIGJhY2t3YXJkIGJsb2NrLgorCSAqIFdlIHByZWZlciBjb2FsZXNjaW5nIHdpdGggdGhlIGxvd2VyIG51bWJlcmVkIHNpYmxpbmcgc28gYXMKKwkgKiB0byBzaHJpbmsgYSBkaXJlY3Rvcnkgb3ZlciB0aW1lLgorCSAqLworCWZvcndhcmQgPSBJTlRfR0VUKGluZm8tPmZvcncsIEFSQ0hfQ09OVkVSVCkgPCBJTlRfR0VUKGluZm8tPmJhY2ssIEFSQ0hfQ09OVkVSVCk7CisJZm9yIChpID0gMCwgYnAgPSBOVUxMOyBpIDwgMjsgZm9yd2FyZCA9ICFmb3J3YXJkLCBpKyspIHsKKwkJYmxrbm8gPSBmb3J3YXJkID9JTlRfR0VUKCBpbmZvLT5mb3J3LCBBUkNIX0NPTlZFUlQpIDogSU5UX0dFVChpbmZvLT5iYWNrLCBBUkNIX0NPTlZFUlQpOworCQlpZiAoYmxrbm8gPT0gMCkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBSZWFkIHRoZSBzaWJsaW5nIGxlYWYgYmxvY2suCisJCSAqLworCQlpZiAoKGVycm9yID0KKwkJICAgIHhmc19kYV9yZWFkX2J1ZihzdGF0ZS0+YXJncy0+dHJhbnMsIHN0YXRlLT5hcmdzLT5kcCwgYmxrbm8sCisJCQkgICAgLTEsICZicCwgWEZTX0RBVEFfRk9SSykpKSB7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJQVNTRVJUKGJwICE9IE5VTEwpOworCQkvKgorCQkgKiBDb3VudCBieXRlcyBpbiB0aGUgdHdvIGJsb2NrcyBjb21iaW5lZC4KKwkJICovCisJCWxlYWYgPSAoeGZzX2RpcjJfbGVhZl90ICopaW5mbzsKKwkJY291bnQgPSBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAtIElOVF9HRVQobGVhZi0+aGRyLnN0YWxlLCBBUkNIX0NPTlZFUlQpOworCQlieXRlcyA9IHN0YXRlLT5ibG9ja3NpemUgLSAoc3RhdGUtPmJsb2Nrc2l6ZSA+PiAyKTsKKwkJbGVhZiA9IGJwLT5kYXRhOworCQlBU1NFUlQoSU5UX0dFVChsZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSMl9MRUFGTl9NQUdJQyk7CisJCWNvdW50ICs9IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpIC0gSU5UX0dFVChsZWFmLT5oZHIuc3RhbGUsIEFSQ0hfQ09OVkVSVCk7CisJCWJ5dGVzIC09IGNvdW50ICogKHVpbnQpc2l6ZW9mKGxlYWYtPmVudHNbMF0pOworCQkvKgorCQkgKiBGaXRzIHdpdGggYXQgbGVhc3QgMjUlIHRvIHNwYXJlLgorCQkgKi8KKwkJaWYgKGJ5dGVzID49IDApCisJCQlicmVhazsKKwkJeGZzX2RhX2JyZWxzZShzdGF0ZS0+YXJncy0+dHJhbnMsIGJwKTsKKwl9CisJLyoKKwkgKiBEaWRuJ3QgbGlrZSBlaXRoZXIgYmxvY2ssIGdpdmUgdXAuCisJICovCisJaWYgKGkgPj0gMikgeworCQkqYWN0aW9uID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogRG9uZSB3aXRoIHRoZSBzaWJsaW5nIGxlYWYgYmxvY2sgaGVyZSwgZHJvcCB0aGUgZGFidWYKKwkgKiBzbyBwYXRoX3NoaWZ0IGNhbiBnZXQgaXQuCisJICovCisJeGZzX2RhX2J1Zl9kb25lKGJwKTsKKwkvKgorCSAqIE1ha2UgYWx0cGF0aCBwb2ludCB0byB0aGUgYmxvY2sgd2Ugd2FudCB0byBrZWVwICh0aGUgbG93ZXIKKwkgKiBudW1iZXJlZCBibG9jaykgYW5kIHBhdGggcG9pbnQgdG8gdGhlIGJsb2NrIHdlIHdhbnQgdG8gZHJvcC4KKwkgKi8KKwltZW1jcHkoJnN0YXRlLT5hbHRwYXRoLCAmc3RhdGUtPnBhdGgsIHNpemVvZihzdGF0ZS0+cGF0aCkpOworCWlmIChibGtubyA8IGJsay0+Ymxrbm8pCisJCWVycm9yID0geGZzX2RhX3BhdGhfc2hpZnQoc3RhdGUsICZzdGF0ZS0+YWx0cGF0aCwgZm9yd2FyZCwgMCwKKwkJCSZydmFsKTsKKwllbHNlCisJCWVycm9yID0geGZzX2RhX3BhdGhfc2hpZnQoc3RhdGUsICZzdGF0ZS0+cGF0aCwgZm9yd2FyZCwgMCwKKwkJCSZydmFsKTsKKwlpZiAoZXJyb3IpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKwkqYWN0aW9uID0gcnZhbCA/IDAgOiAxOworCXJldHVybiAwOworfQorCisvKgorICogTW92ZSBhbGwgdGhlIGxlYWYgZW50cmllcyBmcm9tIGRyb3BfYmxrIHRvIHNhdmVfYmxrLgorICogVGhpcyBpcyBkb25lIGFzIHBhcnQgb2YgYSBqb2luIG9wZXJhdGlvbi4KKyAqLwordm9pZAoreGZzX2RpcjJfbGVhZm5fdW5iYWxhbmNlKAorCXhmc19kYV9zdGF0ZV90CQkqc3RhdGUsCQkvKiBjdXJzb3IgKi8KKwl4ZnNfZGFfc3RhdGVfYmxrX3QJKmRyb3BfYmxrLAkvKiBkZWFkIGJsb2NrICovCisJeGZzX2RhX3N0YXRlX2Jsa190CSpzYXZlX2JsaykJLyogc3Vydml2aW5nIGJsb2NrICovCit7CisJeGZzX2RhX2FyZ3NfdAkJKmFyZ3M7CQkvKiBvcGVyYXRpb24gYXJndW1lbnRzICovCisJeGZzX2RpcjJfbGVhZl90CQkqZHJvcF9sZWFmOwkvKiBkZWFkIGxlYWYgc3RydWN0dXJlICovCisJeGZzX2RpcjJfbGVhZl90CQkqc2F2ZV9sZWFmOwkvKiBzdXJ2aXZpbmcgbGVhZiBzdHJ1Y3R1cmUgKi8KKworCWFyZ3MgPSBzdGF0ZS0+YXJnczsKKwlBU1NFUlQoZHJvcF9ibGstPm1hZ2ljID09IFhGU19ESVIyX0xFQUZOX01BR0lDKTsKKwlBU1NFUlQoc2F2ZV9ibGstPm1hZ2ljID09IFhGU19ESVIyX0xFQUZOX01BR0lDKTsKKwlkcm9wX2xlYWYgPSBkcm9wX2Jsay0+YnAtPmRhdGE7CisJc2F2ZV9sZWFmID0gc2F2ZV9ibGstPmJwLT5kYXRhOworCUFTU0VSVChJTlRfR0VUKGRyb3BfbGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfTEVBRk5fTUFHSUMpOworCUFTU0VSVChJTlRfR0VUKHNhdmVfbGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfTEVBRk5fTUFHSUMpOworCS8qCisJICogSWYgdGhlcmUgYXJlIGFueSBzdGFsZSBsZWFmIGVudHJpZXMsIHRha2UgdGhpcyBvcHBvcnR1bml0eQorCSAqIHRvIHB1cmdlIHRoZW0uCisJICovCisJaWYgKElOVF9HRVQoZHJvcF9sZWFmLT5oZHIuc3RhbGUsIEFSQ0hfQ09OVkVSVCkpCisJCXhmc19kaXIyX2xlYWZfY29tcGFjdChhcmdzLCBkcm9wX2Jsay0+YnApOworCWlmIChJTlRfR0VUKHNhdmVfbGVhZi0+aGRyLnN0YWxlLCBBUkNIX0NPTlZFUlQpKQorCQl4ZnNfZGlyMl9sZWFmX2NvbXBhY3QoYXJncywgc2F2ZV9ibGstPmJwKTsKKwkvKgorCSAqIE1vdmUgdGhlIGVudHJpZXMgZnJvbSBkcm9wIHRvIHRoZSBhcHByb3ByaWF0ZSBlbmQgb2Ygc2F2ZS4KKwkgKi8KKwlkcm9wX2Jsay0+aGFzaHZhbCA9IElOVF9HRVQoZHJvcF9sZWFmLT5lbnRzW0lOVF9HRVQoZHJvcF9sZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgLSAxXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpOworCWlmICh4ZnNfZGlyMl9sZWFmbl9vcmRlcihzYXZlX2Jsay0+YnAsIGRyb3BfYmxrLT5icCkpCisJCXhmc19kaXIyX2xlYWZuX21vdmVlbnRzKGFyZ3MsIGRyb3BfYmxrLT5icCwgMCwgc2F2ZV9ibGstPmJwLCAwLAorCQkJSU5UX0dFVChkcm9wX2xlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSk7CisJZWxzZQorCQl4ZnNfZGlyMl9sZWFmbl9tb3ZlZW50cyhhcmdzLCBkcm9wX2Jsay0+YnAsIDAsIHNhdmVfYmxrLT5icCwKKwkJCUlOVF9HRVQoc2F2ZV9sZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCksIElOVF9HRVQoZHJvcF9sZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkpOworCXNhdmVfYmxrLT5oYXNodmFsID0gSU5UX0dFVChzYXZlX2xlYWYtPmVudHNbSU5UX0dFVChzYXZlX2xlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAtIDFdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCk7CisJeGZzX2RpcjJfbGVhZm5fY2hlY2soYXJncy0+ZHAsIHNhdmVfYmxrLT5icCk7Cit9CisKKy8qCisgKiBUb3AtbGV2ZWwgbm9kZSBmb3JtIGRpcmVjdG9yeSBhZGRuYW1lIHJvdXRpbmUuCisgKi8KK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9ub2RlX2FkZG5hbWUoCisJeGZzX2RhX2FyZ3NfdAkJKmFyZ3MpCQkvKiBvcGVyYXRpb24gYXJndW1lbnRzICovCit7CisJeGZzX2RhX3N0YXRlX2Jsa190CSpibGs7CQkvKiBsZWFmIGJsb2NrIGZvciBpbnNlcnQgKi8KKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCWludAkJCXJ2YWw7CQkvKiBzdWItcmV0dXJuIHZhbHVlICovCisJeGZzX2RhX3N0YXRlX3QJCSpzdGF0ZTsJCS8qIGJ0cmVlIGN1cnNvciAqLworCisJeGZzX2RpcjJfdHJhY2VfYXJncygibm9kZV9hZGRuYW1lIiwgYXJncyk7CisJLyoKKwkgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgc3RhdGUgKGJ0cmVlIGN1cnNvcikuCisJICovCisJc3RhdGUgPSB4ZnNfZGFfc3RhdGVfYWxsb2MoKTsKKwlzdGF0ZS0+YXJncyA9IGFyZ3M7CisJc3RhdGUtPm1wID0gYXJncy0+ZHAtPmlfbW91bnQ7CisJc3RhdGUtPmJsb2Nrc2l6ZSA9IHN0YXRlLT5tcC0+bV9kaXJibGtzaXplOworCXN0YXRlLT5ub2RlX2VudHMgPSBzdGF0ZS0+bXAtPm1fZGlyX25vZGVfZW50czsKKwkvKgorCSAqIExvb2sgdXAgdGhlIG5hbWUuICBXZSdyZSBub3Qgc3VwcG9zZWQgdG8gZmluZCBpdCwgYnV0CisJICogdGhpcyBnaXZlcyB1cyB0aGUgaW5zZXJ0aW9uIHBvaW50LgorCSAqLworCWVycm9yID0geGZzX2RhX25vZGVfbG9va3VwX2ludChzdGF0ZSwgJnJ2YWwpOworCWlmIChlcnJvcikKKwkJcnZhbCA9IGVycm9yOworCWlmIChydmFsICE9IEVOT0VOVCkgeworCQlnb3RvIGRvbmU7CisJfQorCS8qCisJICogQWRkIHRoZSBkYXRhIGVudHJ5IHRvIGEgZGF0YSBibG9jay4KKwkgKiBFeHRyYXZhbGlkIGlzIHNldCB0byBhIGZyZWVibG9jayBmb3VuZCBieSBsb29rdXAuCisJICovCisJcnZhbCA9IHhmc19kaXIyX25vZGVfYWRkbmFtZV9pbnQoYXJncywKKwkJc3RhdGUtPmV4dHJhdmFsaWQgPyAmc3RhdGUtPmV4dHJhYmxrIDogTlVMTCk7CisJaWYgKHJ2YWwpIHsKKwkJZ290byBkb25lOworCX0KKwlibGsgPSAmc3RhdGUtPnBhdGguYmxrW3N0YXRlLT5wYXRoLmFjdGl2ZSAtIDFdOworCUFTU0VSVChibGstPm1hZ2ljID09IFhGU19ESVIyX0xFQUZOX01BR0lDKTsKKwkvKgorCSAqIEFkZCB0aGUgbmV3IGxlYWYgZW50cnkuCisJICovCisJcnZhbCA9IHhmc19kaXIyX2xlYWZuX2FkZChibGstPmJwLCBhcmdzLCBibGstPmluZGV4KTsKKwlpZiAocnZhbCA9PSAwKSB7CisJCS8qCisJCSAqIEl0IHdvcmtlZCwgZml4IHRoZSBoYXNoIHZhbHVlcyB1cCB0aGUgYnRyZWUuCisJCSAqLworCQlpZiAoIWFyZ3MtPmp1c3RjaGVjaykKKwkJCXhmc19kYV9maXhoYXNocGF0aChzdGF0ZSwgJnN0YXRlLT5wYXRoKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBJdCBkaWRuJ3Qgd29yaywgd2UgbmVlZCB0byBzcGxpdCB0aGUgbGVhZiBibG9jay4KKwkJICovCisJCWlmIChhcmdzLT50b3RhbCA9PSAwKSB7CisJCQlBU1NFUlQocnZhbCA9PSBFTk9TUEMpOworCQkJZ290byBkb25lOworCQl9CisJCS8qCisJCSAqIFNwbGl0IHRoZSBsZWFmIGJsb2NrIGFuZCBpbnNlcnQgdGhlIG5ldyBlbnRyeS4KKwkJICovCisJCXJ2YWwgPSB4ZnNfZGFfc3BsaXQoc3RhdGUpOworCX0KK2RvbmU6CisJeGZzX2RhX3N0YXRlX2ZyZWUoc3RhdGUpOworCXJldHVybiBydmFsOworfQorCisvKgorICogQWRkIHRoZSBkYXRhIGVudHJ5IGZvciBhIG5vZGUtZm9ybWF0IGRpcmVjdG9yeSBuYW1lIGFkZGl0aW9uLgorICogVGhlIGxlYWYgZW50cnkgaXMgYWRkZWQgaW4geGZzX2RpcjJfbGVhZm5fYWRkLgorICogV2UgbWF5IGVudGVyIHdpdGggYSBmcmVlc3BhY2UgYmxvY2sgdGhhdCB0aGUgbG9va3VwIGZvdW5kLgorICovCitzdGF0aWMgaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2RpcjJfbm9kZV9hZGRuYW1lX2ludCgKKwl4ZnNfZGFfYXJnc190CQkqYXJncywJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KKwl4ZnNfZGFfc3RhdGVfYmxrX3QJKmZibGspCQkvKiBvcHRpb25hbCBmcmVlc3BhY2UgYmxvY2sgKi8KK3sKKwl4ZnNfZGlyMl9kYXRhX3QJCSpkYXRhOwkJLyogZGF0YSBibG9jayBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9kYl90CQlkYm5vOwkJLyogZGF0YSBibG9jayBudW1iZXIgKi8KKwl4ZnNfZGFidWZfdAkJKmRicDsJCS8qIGRhdGEgYmxvY2sgYnVmZmVyICovCisJeGZzX2RpcjJfZGF0YV9lbnRyeV90CSpkZXA7CQkvKiBkYXRhIGVudHJ5IHBvaW50ZXIgKi8KKwl4ZnNfaW5vZGVfdAkJKmRwOwkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLworCXhmc19kaXIyX2RhdGFfdW51c2VkX3QJKmR1cDsJCS8qIGRhdGEgdW51c2VkIGVudHJ5IHBvaW50ZXIgKi8KKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCXhmc19kaXIyX2RiX3QJCWZibm87CQkvKiBmcmVlc3BhY2UgYmxvY2sgbnVtYmVyICovCisJeGZzX2RhYnVmX3QJCSpmYnA7CQkvKiBmcmVlc3BhY2UgYnVmZmVyICovCisJaW50CQkJZmluZGV4OwkJLyogZnJlZXNwYWNlIGVudHJ5IGluZGV4ICovCisJeGZzX2RpcjJfZnJlZV90CQkqZnJlZT1OVUxMOwkvKiBmcmVlc3BhY2UgYmxvY2sgc3RydWN0dXJlICovCisJeGZzX2RpcjJfZGJfdAkJaWZibm87CQkvKiBpbml0aWFsIGZyZWVzcGFjZSBibG9jayBubyAqLworCXhmc19kaXIyX2RiX3QJCWxhc3RmYm5vPTA7CS8qIGhpZ2hlc3QgZnJlZXNwYWNlIGJsb2NrIG5vICovCisJaW50CQkJbGVuZ3RoOwkJLyogbGVuZ3RoIG9mIHRoZSBuZXcgZW50cnkgKi8KKwlpbnQJCQlsb2dmcmVlOwkvKiBuZWVkIHRvIGxvZyBmcmVlIGVudHJ5ICovCisJeGZzX21vdW50X3QJCSptcDsJCS8qIGZpbGVzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwlpbnQJCQluZWVkbG9nOwkvKiBuZWVkIHRvIGxvZyBkYXRhIGhlYWRlciAqLworCWludAkJCW5lZWRzY2FuOwkvKiBuZWVkIHRvIHJlc2NhbiBkYXRhIGZyZWVzICovCisJeGZzX2RpcjJfZGF0YV9vZmZfdAkqdGFncDsJCS8qIGRhdGEgZW50cnkgdGFnIHBvaW50ZXIgKi8KKwl4ZnNfdHJhbnNfdAkJKnRwOwkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCisJZHAgPSBhcmdzLT5kcDsKKwltcCA9IGRwLT5pX21vdW50OworCXRwID0gYXJncy0+dHJhbnM7CisJbGVuZ3RoID0gWEZTX0RJUjJfREFUQV9FTlRTSVpFKGFyZ3MtPm5hbWVsZW4pOworCS8qCisJICogSWYgd2UgY2FtZSBpbiB3aXRoIGEgZnJlZXNwYWNlIGJsb2NrIHRoYXQgbWVhbnMgdGhhdCBsb29rdXAKKwkgKiBmb3VuZCBhbiBlbnRyeSB3aXRoIG91ciBoYXNoIHZhbHVlLiAgVGhpcyBpcyB0aGUgZnJlZXNwYWNlCisJICogYmxvY2sgZm9yIHRoYXQgZGF0YSBlbnRyeS4KKwkgKi8KKwlpZiAoZmJsaykgeworCQlmYnAgPSBmYmxrLT5icDsKKwkJLyoKKwkJICogUmVtZW1iZXIgaW5pdGlhbCBmcmVlc3BhY2UgYmxvY2sgbnVtYmVyLgorCQkgKi8KKwkJaWZibm8gPSBmYmxrLT5ibGtubzsKKwkJZnJlZSA9IGZicC0+ZGF0YTsKKwkJQVNTRVJUKElOVF9HRVQoZnJlZS0+aGRyLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0ZSRUVfTUFHSUMpOworCQlmaW5kZXggPSBmYmxrLT5pbmRleDsKKwkJLyoKKwkJICogVGhpcyBtZWFucyB0aGUgZnJlZSBlbnRyeSBzaG93ZWQgdGhhdCB0aGUgZGF0YSBibG9jayBoYWQKKwkJICogc3BhY2UgZm9yIG91ciBlbnRyeSwgc28gd2UgcmVtZW1iZXJlZCBpdC4KKwkJICogVXNlIHRoYXQgZGF0YSBibG9jay4KKwkJICovCisJCWlmIChmaW5kZXggPj0gMCkgeworCQkJQVNTRVJUKGZpbmRleCA8IElOVF9HRVQoZnJlZS0+aGRyLm52YWxpZCwgQVJDSF9DT05WRVJUKSk7CisJCQlBU1NFUlQoSU5UX0dFVChmcmVlLT5iZXN0c1tmaW5kZXhdLCBBUkNIX0NPTlZFUlQpICE9IE5VTExEQVRBT0ZGKTsKKwkJCUFTU0VSVChJTlRfR0VUKGZyZWUtPmJlc3RzW2ZpbmRleF0sIEFSQ0hfQ09OVkVSVCkgPj0gbGVuZ3RoKTsKKwkJCWRibm8gPSBJTlRfR0VUKGZyZWUtPmhkci5maXJzdGRiLCBBUkNIX0NPTlZFUlQpICsgZmluZGV4OworCQl9CisJCS8qCisJCSAqIFRoZSBkYXRhIGJsb2NrIGxvb2tlZCBhdCBkaWRuJ3QgaGF2ZSBlbm91Z2ggcm9vbS4KKwkJICogV2UnbGwgc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZnJlZXNwYWNlIGVudHJpZXMuCisJCSAqLworCQllbHNlIHsKKwkJCWRibm8gPSAtMTsKKwkJCWZpbmRleCA9IDA7CisJCX0KKwl9CisJLyoKKwkgKiBEaWRuJ3QgY29tZSBpbiB3aXRoIGEgZnJlZXNwYWNlIGJsb2NrLCBzbyBkb24ndCBoYXZlIGEgZGF0YSBibG9jay4KKwkgKi8KKwllbHNlIHsKKwkJaWZibm8gPSBkYm5vID0gLTE7CisJCWZicCA9IE5VTEw7CisJCWZpbmRleCA9IDA7CisJfQorCS8qCisJICogSWYgd2UgZG9uJ3QgaGF2ZSBhIGRhdGEgYmxvY2sgeWV0LCB3ZSdyZSBnb2luZyB0byBzY2FuIHRoZQorCSAqIGZyZWVzcGFjZSBibG9ja3MgbG9va2luZyBmb3Igb25lLiAgRmlndXJlIG91dCB3aGF0IHRoZQorCSAqIGhpZ2hlc3QgZnJlZXNwYWNlIGJsb2NrIG51bWJlciBpcy4KKwkgKi8KKwlpZiAoZGJubyA9PSAtMSkgeworCQl4ZnNfZmlsZW9mZl90CWZvOwkJLyogZnJlZXNwYWNlIGJsb2NrIG51bWJlciAqLworCisJCWlmICgoZXJyb3IgPSB4ZnNfYm1hcF9sYXN0X29mZnNldCh0cCwgZHAsICZmbywgWEZTX0RBVEFfRk9SSykpKQorCQkJcmV0dXJuIGVycm9yOworCQlsYXN0ZmJubyA9IFhGU19ESVIyX0RBX1RPX0RCKG1wLCAoeGZzX2RhYmxrX3QpZm8pOworCQlmYm5vID0gaWZibm87CisJfQorCS8qCisJICogV2hpbGUgd2UgaGF2ZW4ndCBpZGVudGlmaWVkIGEgZGF0YSBibG9jaywgc2VhcmNoIHRoZSBmcmVlYmxvY2sKKwkgKiBkYXRhIGZvciBhIGdvb2QgZGF0YSBibG9jay4gIElmIHdlIGZpbmQgYSBudWxsIGZyZWVibG9jayBlbnRyeSwKKwkgKiBpbmRpY2F0aW5nIGEgaG9sZSBpbiB0aGUgZGF0YSBibG9ja3MsIHJlbWVtYmVyIHRoYXQuCisJICovCisJd2hpbGUgKGRibm8gPT0gLTEpIHsKKwkJLyoKKwkJICogSWYgd2UgZG9uJ3QgaGF2ZSBhIGZyZWVibG9jayBpbiBoYW5kLCBnZXQgdGhlIG5leHQgb25lLgorCQkgKi8KKwkJaWYgKGZicCA9PSBOVUxMKSB7CisJCQkvKgorCQkJICogSGFwcGVucyB0aGUgZmlyc3QgdGltZSB0aHJvdWdoIHVubGVzcyBsb29rdXAgZ2F2ZQorCQkJICogdXMgYSBmcmVlc3BhY2UgYmxvY2sgdG8gc3RhcnQgd2l0aC4KKwkJCSAqLworCQkJaWYgKCsrZmJubyA9PSAwKQorCQkJCWZibm8gPSBYRlNfRElSMl9GUkVFX0ZJUlNUREIobXApOworCQkJLyoKKwkJCSAqIElmIGl0J3MgaWZibm8gd2UgYWxyZWFkeSBsb29rZWQgYXQgaXQuCisJCQkgKi8KKwkJCWlmIChmYm5vID09IGlmYm5vKQorCQkJCWZibm8rKzsKKwkJCS8qCisJCQkgKiBJZiBpdCdzIG9mZiB0aGUgZW5kIHdlJ3JlIGRvbmUuCisJCQkgKi8KKwkJCWlmIChmYm5vID49IGxhc3RmYm5vKQorCQkJCWJyZWFrOworCQkJLyoKKwkJCSAqIFJlYWQgdGhlIGJsb2NrLiAgVGhlcmUgY2FuIGJlIGhvbGVzIGluIHRoZQorCQkJICogZnJlZXNwYWNlIGJsb2Nrcywgc28gdGhpcyBtaWdodCBub3Qgc3VjY2VlZC4KKwkJCSAqIFRoaXMgc2hvdWxkIGJlIHJlYWxseSByYXJlLCBzbyB0aGVyZSdzIG5vIHJlYXNvbgorCQkJICogdG8gYXZvaWQgaXQuCisJCQkgKi8KKwkJCWlmICgoZXJyb3IgPSB4ZnNfZGFfcmVhZF9idWYodHAsIGRwLAorCQkJCQlYRlNfRElSMl9EQl9UT19EQShtcCwgZmJubyksIC0yLCAmZmJwLAorCQkJCQlYRlNfREFUQV9GT1JLKSkpIHsKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQl9CisJCQlpZiAodW5saWtlbHkoZmJwID09IE5VTEwpKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlmcmVlID0gZmJwLT5kYXRhOworCQkJQVNTRVJUKElOVF9HRVQoZnJlZS0+aGRyLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVIyX0ZSRUVfTUFHSUMpOworCQkJZmluZGV4ID0gMDsKKwkJfQorCQkvKgorCQkgKiBMb29rIGF0IHRoZSBjdXJyZW50IGZyZWUgZW50cnkuICBJcyBpdCBnb29kIGVub3VnaD8KKwkJICovCisJCWlmIChJTlRfR0VUKGZyZWUtPmJlc3RzW2ZpbmRleF0sIEFSQ0hfQ09OVkVSVCkgIT0gTlVMTERBVEFPRkYgJiYKKwkJICAgIElOVF9HRVQoZnJlZS0+YmVzdHNbZmluZGV4XSwgQVJDSF9DT05WRVJUKSA+PSBsZW5ndGgpCisJCQlkYm5vID0gSU5UX0dFVChmcmVlLT5oZHIuZmlyc3RkYiwgQVJDSF9DT05WRVJUKSArIGZpbmRleDsKKwkJZWxzZSB7CisJCQkvKgorCQkJICogQXJlIHdlIGRvbmUgd2l0aCB0aGUgZnJlZWJsb2NrPworCQkJICovCisJCQlpZiAoKytmaW5kZXggPT0gSU5UX0dFVChmcmVlLT5oZHIubnZhbGlkLCBBUkNIX0NPTlZFUlQpKSB7CisJCQkJLyoKKwkJCQkgKiBEcm9wIHRoZSBibG9jay4KKwkJCQkgKi8KKwkJCQl4ZnNfZGFfYnJlbHNlKHRwLCBmYnApOworCQkJCWZicCA9IE5VTEw7CisJCQkJaWYgKGZibGsgJiYgZmJsay0+YnApCisJCQkJCWZibGstPmJwID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KKwkvKgorCSAqIElmIHdlIGRvbid0IGhhdmUgYSBkYXRhIGJsb2NrLCB3ZSBuZWVkIHRvIGFsbG9jYXRlIG9uZSBhbmQgbWFrZQorCSAqIHRoZSBmcmVlc3BhY2UgZW50cmllcyByZWZlciB0byBpdC4KKwkgKi8KKwlpZiAodW5saWtlbHkoZGJubyA9PSAtMSkpIHsKKwkJLyoKKwkJICogTm90IGFsbG93ZWQgdG8gYWxsb2NhdGUsIHJldHVybiBmYWlsdXJlLgorCQkgKi8KKwkJaWYgKGFyZ3MtPmp1c3RjaGVjayB8fCBhcmdzLT50b3RhbCA9PSAwKSB7CisJCQkvKgorCQkJICogRHJvcCB0aGUgZnJlZXNwYWNlIGJ1ZmZlciB1bmxlc3MgaXQgY2FtZSBmcm9tIG91cgorCQkJICogY2FsbGVyLgorCQkJICovCisJCQlpZiAoKGZibGsgPT0gTlVMTCB8fCBmYmxrLT5icCA9PSBOVUxMKSAmJiBmYnAgIT0gTlVMTCkKKwkJCQl4ZnNfZGFfYnVmX2RvbmUoZmJwKTsKKwkJCXJldHVybiBYRlNfRVJST1IoRU5PU1BDKTsKKwkJfQorCQkvKgorCQkgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgbmV3IGRhdGEgYmxvY2suCisJCSAqLworCQlpZiAodW5saWtlbHkoKGVycm9yID0geGZzX2RpcjJfZ3Jvd19pbm9kZShhcmdzLAorCQkJCQkJCSBYRlNfRElSMl9EQVRBX1NQQUNFLAorCQkJCQkJCSAmZGJubykpIHx8CisJCSAgICAoZXJyb3IgPSB4ZnNfZGlyMl9kYXRhX2luaXQoYXJncywgZGJubywgJmRicCkpKSkgeworCQkJLyoKKwkJCSAqIERyb3AgdGhlIGZyZWVzcGFjZSBidWZmZXIgdW5sZXNzIGl0IGNhbWUgZnJvbSBvdXIKKwkJCSAqIGNhbGxlci4KKwkJCSAqLworCQkJaWYgKChmYmxrID09IE5VTEwgfHwgZmJsay0+YnAgPT0gTlVMTCkgJiYgZmJwICE9IE5VTEwpCisJCQkJeGZzX2RhX2J1Zl9kb25lKGZicCk7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJLyoKKwkJICogSWYgKHNvbWVob3cpIHdlIGhhdmUgYSBmcmVlc3BhY2UgYmxvY2ssIGdldCByaWQgb2YgaXQuCisJCSAqLworCQlpZiAoZmJwKQorCQkJeGZzX2RhX2JyZWxzZSh0cCwgZmJwKTsKKwkJaWYgKGZibGsgJiYgZmJsay0+YnApCisJCQlmYmxrLT5icCA9IE5VTEw7CisKKwkJLyoKKwkJICogR2V0IHRoZSBmcmVlc3BhY2UgYmxvY2sgY29ycmVzcG9uZGluZyB0byB0aGUgZGF0YSBibG9jaworCQkgKiB0aGF0IHdhcyBqdXN0IGFsbG9jYXRlZC4KKwkJICovCisJCWZibm8gPSBYRlNfRElSMl9EQl9UT19GREIobXAsIGRibm8pOworCQlpZiAodW5saWtlbHkoZXJyb3IgPSB4ZnNfZGFfcmVhZF9idWYodHAsIGRwLAorCQkJCVhGU19ESVIyX0RCX1RPX0RBKG1wLCBmYm5vKSwgLTIsICZmYnAsCisJCQkJWEZTX0RBVEFfRk9SSykpKSB7CisJCQl4ZnNfZGFfYnVmX2RvbmUoZGJwKTsKKwkJCXJldHVybiBlcnJvcjsKKyAgCQl9CisJCS8qCisJCSAqIElmIHRoZXJlIHdhc24ndCBhIGZyZWVzcGFjZSBibG9jaywgdGhlIHJlYWQgd2lsbAorCQkgKiByZXR1cm4gYSBOVUxMIGZicC4gIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgbmV3IG9uZS4KKwkJICovCisJCWlmKCBmYnAgPT0gTlVMTCApIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfZGlyMl9ncm93X2lub2RlKGFyZ3MsIFhGU19ESVIyX0ZSRUVfU1BBQ0UsCisJCQkJCQkJJmZibm8pKSkgeworCQkJCXJldHVybiBlcnJvcjsKKwkJCX0KKworCQkJaWYgKHVubGlrZWx5KFhGU19ESVIyX0RCX1RPX0ZEQihtcCwgZGJubykgIT0gZmJubykpIHsKKwkJCQljbW5fZXJyKENFX0FMRVJULAorCQkJCQkieGZzX2RpcjJfbm9kZV9hZGRuYW1lX2ludDogZGlyIGlubyAiCisJCQkJCSIlbGx1IG5lZWRlZCBmcmVlc3AgYmxvY2sgJWxsZCBmb3JcbiIKKwkJCQkJIiAgZGF0YSBibG9jayAlbGxkLCBnb3QgJWxsZFxuIgorCQkJCQkiICBpZmJubyAlbGx1IGxhc3RmYm5vICVkXG4iLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWRwLT5pX2lubywKKwkJCQkJKGxvbmcgbG9uZylYRlNfRElSMl9EQl9UT19GREIobXAsIGRibm8pLAorCQkJCQkobG9uZyBsb25nKWRibm8sIChsb25nIGxvbmcpZmJubywKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylpZmJubywgbGFzdGZibm8pOworCQkJCWlmIChmYmxrKSB7CisJCQkJCWNtbl9lcnIoQ0VfQUxFUlQsCisJCQkJCQkiIGZibGsgMHglcCBibGtubyAlbGx1ICIKKwkJCQkJCSJpbmRleCAlZCBtYWdpYyAweCV4XG4iLAorCQkJCQkJZmJsaywKKwkJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpZmJsay0+Ymxrbm8sCisJCQkJCQlmYmxrLT5pbmRleCwKKwkJCQkJCWZibGstPm1hZ2ljKTsKKwkJCQl9IGVsc2UgeworCQkJCQljbW5fZXJyKENFX0FMRVJULAorCQkJCQkJIiAuLi4gZmJsayBpcyBOVUxMXG4iKTsKKwkJCQl9CisJCQkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX2RpcjJfbm9kZV9hZGRuYW1lX2ludCIsCisJCQkJCQkgWEZTX0VSUkxFVkVMX0xPVywgbXApOworCQkJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIEdldCBhIGJ1ZmZlciBmb3IgdGhlIG5ldyBibG9jay4KKwkJCSAqLworCQkJaWYgKChlcnJvciA9IHhmc19kYV9nZXRfYnVmKHRwLCBkcCwKKwkJCQkJCSAgIFhGU19ESVIyX0RCX1RPX0RBKG1wLCBmYm5vKSwKKwkJCQkJCSAgIC0xLCAmZmJwLCBYRlNfREFUQV9GT1JLKSkpIHsKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQl9CisJCQlBU1NFUlQoZmJwICE9IE5VTEwpOworCisJCQkvKgorCQkJICogSW5pdGlhbGl6ZSB0aGUgbmV3IGJsb2NrIHRvIGJlIGVtcHR5LCBhbmQgcmVtZW1iZXIKKwkJCSAqIGl0cyBmaXJzdCBzbG90IGFzIG91ciBlbXB0eSBzbG90LgorCQkJICovCisJCQlmcmVlID0gZmJwLT5kYXRhOworCQkJSU5UX1NFVChmcmVlLT5oZHIubWFnaWMsIEFSQ0hfQ09OVkVSVCwgWEZTX0RJUjJfRlJFRV9NQUdJQyk7CisJCQlJTlRfU0VUKGZyZWUtPmhkci5maXJzdGRiLCBBUkNIX0NPTlZFUlQsCisJCQkJKGZibm8gLSBYRlNfRElSMl9GUkVFX0ZJUlNUREIobXApKSAqCisJCQkJWEZTX0RJUjJfTUFYX0ZSRUVfQkVTVFMobXApKTsKKwkJCWZyZWUtPmhkci5udmFsaWQgPSAwOworCQkJZnJlZS0+aGRyLm51c2VkID0gMDsKKwkJfSBlbHNlIHsKKwkJCWZyZWUgPSBmYnAtPmRhdGE7CisJCQlBU1NFUlQoSU5UX0dFVChmcmVlLT5oZHIubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfRlJFRV9NQUdJQyk7CisJCX0KKworCQkvKgorCQkgKiBTZXQgdGhlIGZyZWVzcGFjZSBibG9jayBpbmRleCBmcm9tIHRoZSBkYXRhIGJsb2NrIG51bWJlci4KKwkJICovCisJCWZpbmRleCA9IFhGU19ESVIyX0RCX1RPX0ZESU5ERVgobXAsIGRibm8pOworCQkvKgorCQkgKiBJZiBpdCdzIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgZW50cmllcyBpbiB0aGUKKwkJICogZnJlZXNwYWNlIGJsb2NrLCBleHRlbmQgdGhhdCB0YWJsZS4KKwkJICovCisJCWlmIChmaW5kZXggPj0gSU5UX0dFVChmcmVlLT5oZHIubnZhbGlkLCBBUkNIX0NPTlZFUlQpKSB7CisJCQlBU1NFUlQoZmluZGV4IDwgWEZTX0RJUjJfTUFYX0ZSRUVfQkVTVFMobXApKTsKKwkJCUlOVF9TRVQoZnJlZS0+aGRyLm52YWxpZCwgQVJDSF9DT05WRVJULCBmaW5kZXggKyAxKTsKKwkJCS8qCisJCQkgKiBUYWcgbmV3IGVudHJ5IHNvIG51c2VkIHdpbGwgZ28gdXAuCisJCQkgKi8KKwkJCUlOVF9TRVQoZnJlZS0+YmVzdHNbZmluZGV4XSwgQVJDSF9DT05WRVJULCBOVUxMREFUQU9GRik7CisJCX0KKwkJLyoKKwkJICogSWYgdGhpcyBlbnRyeSB3YXMgZm9yIGFuIGVtcHR5IGRhdGEgYmxvY2sKKwkJICogKHRoaXMgc2hvdWxkIGFsd2F5cyBiZSB0cnVlKSB0aGVuIHVwZGF0ZSB0aGUgaGVhZGVyLgorCQkgKi8KKwkJaWYgKElOVF9HRVQoZnJlZS0+YmVzdHNbZmluZGV4XSwgQVJDSF9DT05WRVJUKSA9PSBOVUxMREFUQU9GRikgeworCQkJSU5UX01PRChmcmVlLT5oZHIubnVzZWQsIEFSQ0hfQ09OVkVSVCwgKzEpOworCQkJeGZzX2RpcjJfZnJlZV9sb2dfaGVhZGVyKHRwLCBmYnApOworCQl9CisJCS8qCisJCSAqIFVwZGF0ZSB0aGUgcmVhbCB2YWx1ZSBpbiB0aGUgdGFibGUuCisJCSAqIFdlIGhhdmVuJ3QgYWxsb2NhdGVkIHRoZSBkYXRhIGVudHJ5IHlldCBzbyB0aGlzIHdpbGwKKwkJICogY2hhbmdlIGFnYWluLgorCQkgKi8KKwkJZGF0YSA9IGRicC0+ZGF0YTsKKwkJSU5UX0NPUFkoZnJlZS0+YmVzdHNbZmluZGV4XSwgZGF0YS0+aGRyLmJlc3RmcmVlWzBdLmxlbmd0aCwgQVJDSF9DT05WRVJUKTsKKwkJbG9nZnJlZSA9IDE7CisJfQorCS8qCisJICogV2UgaGFkIGEgZGF0YSBibG9jayBzbyB3ZSBkb24ndCBoYXZlIHRvIG1ha2UgYSBuZXcgb25lLgorCSAqLworCWVsc2UgeworCQkvKgorCQkgKiBJZiBqdXN0IGNoZWNraW5nLCB3ZSBzdWNjZWVkZWQuCisJCSAqLworCQlpZiAoYXJncy0+anVzdGNoZWNrKSB7CisJCQlpZiAoKGZibGsgPT0gTlVMTCB8fCBmYmxrLT5icCA9PSBOVUxMKSAmJiBmYnAgIT0gTlVMTCkKKwkJCQl4ZnNfZGFfYnVmX2RvbmUoZmJwKTsKKwkJCXJldHVybiAwOworCQl9CisJCS8qCisJCSAqIFJlYWQgdGhlIGRhdGEgYmxvY2sgaW4uCisJCSAqLworCQlpZiAodW5saWtlbHkoCisJCSAgICBlcnJvciA9IHhmc19kYV9yZWFkX2J1Zih0cCwgZHAsIFhGU19ESVIyX0RCX1RPX0RBKG1wLCBkYm5vKSwKKwkJCQktMSwgJmRicCwgWEZTX0RBVEFfRk9SSykpKSB7CisJCQlpZiAoKGZibGsgPT0gTlVMTCB8fCBmYmxrLT5icCA9PSBOVUxMKSAmJiBmYnAgIT0gTlVMTCkKKwkJCQl4ZnNfZGFfYnVmX2RvbmUoZmJwKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQlkYXRhID0gZGJwLT5kYXRhOworCQlsb2dmcmVlID0gMDsKKwl9CisJQVNTRVJUKElOVF9HRVQoZGF0YS0+aGRyLmJlc3RmcmVlWzBdLmxlbmd0aCwgQVJDSF9DT05WRVJUKSA+PSBsZW5ndGgpOworCS8qCisJICogUG9pbnQgdG8gdGhlIGV4aXN0aW5nIHVudXNlZCBzcGFjZS4KKwkgKi8KKwlkdXAgPSAoeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqKQorCSAgICAgICgoY2hhciAqKWRhdGEgKyBJTlRfR0VUKGRhdGEtPmhkci5iZXN0ZnJlZVswXS5vZmZzZXQsIEFSQ0hfQ09OVkVSVCkpOworCW5lZWRzY2FuID0gbmVlZGxvZyA9IDA7CisJLyoKKwkgKiBNYXJrIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSB1bnVzZWQgc3BhY2UsIGludXNlIGZvciB1cy4KKwkgKi8KKwl4ZnNfZGlyMl9kYXRhX3VzZV9mcmVlKHRwLCBkYnAsIGR1cCwKKwkJKHhmc19kaXIyX2RhdGFfYW9mZl90KSgoY2hhciAqKWR1cCAtIChjaGFyICopZGF0YSksIGxlbmd0aCwKKwkJJm5lZWRsb2csICZuZWVkc2Nhbik7CisJLyoKKwkgKiBGaWxsIGluIHRoZSBuZXcgZW50cnkgYW5kIGxvZyBpdC4KKwkgKi8KKwlkZXAgPSAoeGZzX2RpcjJfZGF0YV9lbnRyeV90ICopZHVwOworCUlOVF9TRVQoZGVwLT5pbnVtYmVyLCBBUkNIX0NPTlZFUlQsIGFyZ3MtPmludW1iZXIpOworCWRlcC0+bmFtZWxlbiA9IGFyZ3MtPm5hbWVsZW47CisJbWVtY3B5KGRlcC0+bmFtZSwgYXJncy0+bmFtZSwgZGVwLT5uYW1lbGVuKTsKKwl0YWdwID0gWEZTX0RJUjJfREFUQV9FTlRSWV9UQUdfUChkZXApOworCUlOVF9TRVQoKnRhZ3AsIEFSQ0hfQ09OVkVSVCwgKHhmc19kaXIyX2RhdGFfb2ZmX3QpKChjaGFyICopZGVwIC0gKGNoYXIgKilkYXRhKSk7CisJeGZzX2RpcjJfZGF0YV9sb2dfZW50cnkodHAsIGRicCwgZGVwKTsKKwkvKgorCSAqIFJlc2NhbiB0aGUgYmxvY2sgZm9yIGJlc3RmcmVlIGlmIG5lZWRlZC4KKwkgKi8KKwlpZiAobmVlZHNjYW4pCisJCXhmc19kaXIyX2RhdGFfZnJlZXNjYW4obXAsIGRhdGEsICZuZWVkbG9nLCBOVUxMKTsKKwkvKgorCSAqIExvZyB0aGUgZGF0YSBibG9jayBoZWFkZXIgaWYgbmVlZGVkLgorCSAqLworCWlmIChuZWVkbG9nKQorCQl4ZnNfZGlyMl9kYXRhX2xvZ19oZWFkZXIodHAsIGRicCk7CisJLyoKKwkgKiBJZiB0aGUgZnJlZXNwYWNlIGVudHJ5IGlzIG5vdyB3cm9uZywgdXBkYXRlIGl0LgorCSAqLworCWlmIChJTlRfR0VUKGZyZWUtPmJlc3RzW2ZpbmRleF0sIEFSQ0hfQ09OVkVSVCkgIT0gSU5UX0dFVChkYXRhLT5oZHIuYmVzdGZyZWVbMF0ubGVuZ3RoLCBBUkNIX0NPTlZFUlQpKSB7CisJCUlOVF9DT1BZKGZyZWUtPmJlc3RzW2ZpbmRleF0sIGRhdGEtPmhkci5iZXN0ZnJlZVswXS5sZW5ndGgsIEFSQ0hfQ09OVkVSVCk7CisJCWxvZ2ZyZWUgPSAxOworCX0KKwkvKgorCSAqIExvZyB0aGUgZnJlZXNwYWNlIGVudHJ5IGlmIG5lZWRlZC4KKwkgKi8KKwlpZiAobG9nZnJlZSkKKwkJeGZzX2RpcjJfZnJlZV9sb2dfYmVzdHModHAsIGZicCwgZmluZGV4LCBmaW5kZXgpOworCS8qCisJICogSWYgdGhlIGNhbGxlciBkaWRuJ3QgaGFuZCB1cyB0aGUgZnJlZXNwYWNlIGJsb2NrLCBkcm9wIGl0LgorCSAqLworCWlmICgoZmJsayA9PSBOVUxMIHx8IGZibGstPmJwID09IE5VTEwpICYmIGZicCAhPSBOVUxMKQorCQl4ZnNfZGFfYnVmX2RvbmUoZmJwKTsKKwkvKgorCSAqIFJldHVybiB0aGUgZGF0YSBibG9jayBhbmQgb2Zmc2V0IGluIGFyZ3MsIHRoZW4gZHJvcCB0aGUgZGF0YSBibG9jay4KKwkgKi8KKwlhcmdzLT5ibGtubyA9ICh4ZnNfZGFibGtfdClkYm5vOworCWFyZ3MtPmluZGV4ID0gSU5UX0dFVCgqdGFncCwgQVJDSF9DT05WRVJUKTsKKwl4ZnNfZGFfYnVmX2RvbmUoZGJwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIExvb2t1cCBhbiBlbnRyeSBpbiBhIG5vZGUtZm9ybWF0IGRpcmVjdG9yeS4KKyAqIEFsbCB0aGUgcmVhbCB3b3JrIGhhcHBlbnMgaW4geGZzX2RhX25vZGVfbG9va3VwX2ludC4KKyAqIFRoZSBvbmx5IHJlYWwgb3V0cHV0IGlzIHRoZSBpbm9kZSBudW1iZXIgb2YgdGhlIGVudHJ5LgorICovCitpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2RpcjJfbm9kZV9sb29rdXAoCisJeGZzX2RhX2FyZ3NfdAkqYXJncykJCQkvKiBvcGVyYXRpb24gYXJndW1lbnRzICovCit7CisJaW50CQllcnJvcjsJCQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwlpbnQJCWk7CQkJLyogYnRyZWUgbGV2ZWwgKi8KKwlpbnQJCXJ2YWw7CQkJLyogb3BlcmF0aW9uIHJldHVybiB2YWx1ZSAqLworCXhmc19kYV9zdGF0ZV90CSpzdGF0ZTsJCQkvKiBidHJlZSBjdXJzb3IgKi8KKworCXhmc19kaXIyX3RyYWNlX2FyZ3MoIm5vZGVfbG9va3VwIiwgYXJncyk7CisJLyoKKwkgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgYnRyZWUgY3Vyc29yLgorCSAqLworCXN0YXRlID0geGZzX2RhX3N0YXRlX2FsbG9jKCk7CisJc3RhdGUtPmFyZ3MgPSBhcmdzOworCXN0YXRlLT5tcCA9IGFyZ3MtPmRwLT5pX21vdW50OworCXN0YXRlLT5ibG9ja3NpemUgPSBzdGF0ZS0+bXAtPm1fZGlyYmxrc2l6ZTsKKwlzdGF0ZS0+bm9kZV9lbnRzID0gc3RhdGUtPm1wLT5tX2Rpcl9ub2RlX2VudHM7CisJLyoKKwkgKiBGaWxsIGluIHRoZSBwYXRoIHRvIHRoZSBlbnRyeSBpbiB0aGUgY3Vyc29yLgorCSAqLworCWVycm9yID0geGZzX2RhX25vZGVfbG9va3VwX2ludChzdGF0ZSwgJnJ2YWwpOworCWlmIChlcnJvcikKKwkJcnZhbCA9IGVycm9yOworCS8qCisJICogUmVsZWFzZSB0aGUgYnRyZWUgYmxvY2tzIGFuZCBsZWFmIGJsb2NrLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBzdGF0ZS0+cGF0aC5hY3RpdmU7IGkrKykgeworCQl4ZnNfZGFfYnJlbHNlKGFyZ3MtPnRyYW5zLCBzdGF0ZS0+cGF0aC5ibGtbaV0uYnApOworCQlzdGF0ZS0+cGF0aC5ibGtbaV0uYnAgPSBOVUxMOworCX0KKwkvKgorCSAqIFJlbGVhc2UgdGhlIGRhdGEgYmxvY2sgaWYgd2UgaGF2ZSBpdC4KKwkgKi8KKwlpZiAoc3RhdGUtPmV4dHJhdmFsaWQgJiYgc3RhdGUtPmV4dHJhYmxrLmJwKSB7CisJCXhmc19kYV9icmVsc2UoYXJncy0+dHJhbnMsIHN0YXRlLT5leHRyYWJsay5icCk7CisJCXN0YXRlLT5leHRyYWJsay5icCA9IE5VTEw7CisJfQorCXhmc19kYV9zdGF0ZV9mcmVlKHN0YXRlKTsKKwlyZXR1cm4gcnZhbDsKK30KKworLyoKKyAqIFJlbW92ZSBhbiBlbnRyeSBmcm9tIGEgbm9kZS1mb3JtYXQgZGlyZWN0b3J5LgorICovCitpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2RpcjJfbm9kZV9yZW1vdmVuYW1lKAorCXhmc19kYV9hcmdzX3QJCSphcmdzKQkJLyogb3BlcmF0aW9uIGFyZ3VtZW50cyAqLworeworCXhmc19kYV9zdGF0ZV9ibGtfdAkqYmxrOwkJLyogbGVhZiBibG9jayAqLworCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJaW50CQkJcnZhbDsJCS8qIG9wZXJhdGlvbiByZXR1cm4gdmFsdWUgKi8KKwl4ZnNfZGFfc3RhdGVfdAkJKnN0YXRlOwkJLyogYnRyZWUgY3Vyc29yICovCisKKwl4ZnNfZGlyMl90cmFjZV9hcmdzKCJub2RlX3JlbW92ZW5hbWUiLCBhcmdzKTsKKwkvKgorCSAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBidHJlZSBjdXJzb3IuCisJICovCisJc3RhdGUgPSB4ZnNfZGFfc3RhdGVfYWxsb2MoKTsKKwlzdGF0ZS0+YXJncyA9IGFyZ3M7CisJc3RhdGUtPm1wID0gYXJncy0+ZHAtPmlfbW91bnQ7CisJc3RhdGUtPmJsb2Nrc2l6ZSA9IHN0YXRlLT5tcC0+bV9kaXJibGtzaXplOworCXN0YXRlLT5ub2RlX2VudHMgPSBzdGF0ZS0+bXAtPm1fZGlyX25vZGVfZW50czsKKwkvKgorCSAqIExvb2sgdXAgdGhlIGVudHJ5IHdlJ3JlIGRlbGV0aW5nLCBzZXQgdXAgdGhlIGN1cnNvci4KKwkgKi8KKwllcnJvciA9IHhmc19kYV9ub2RlX2xvb2t1cF9pbnQoc3RhdGUsICZydmFsKTsKKwlpZiAoZXJyb3IpIHsKKwkJcnZhbCA9IGVycm9yOworCX0KKwkvKgorCSAqIERpZG4ndCBmaW5kIGl0LCB1cHBlciBsYXllciBzY3Jld2VkIHVwLgorCSAqLworCWlmIChydmFsICE9IEVFWElTVCkgeworCQl4ZnNfZGFfc3RhdGVfZnJlZShzdGF0ZSk7CisJCXJldHVybiBydmFsOworCX0KKwlibGsgPSAmc3RhdGUtPnBhdGguYmxrW3N0YXRlLT5wYXRoLmFjdGl2ZSAtIDFdOworCUFTU0VSVChibGstPm1hZ2ljID09IFhGU19ESVIyX0xFQUZOX01BR0lDKTsKKwlBU1NFUlQoc3RhdGUtPmV4dHJhdmFsaWQpOworCS8qCisJICogUmVtb3ZlIHRoZSBsZWFmIGFuZCBkYXRhIGVudHJpZXMuCisJICogRXh0cmFibGsgcmVmZXJzIHRvIHRoZSBkYXRhIGJsb2NrLgorCSAqLworCWVycm9yID0geGZzX2RpcjJfbGVhZm5fcmVtb3ZlKGFyZ3MsIGJsay0+YnAsIGJsay0+aW5kZXgsCisJCSZzdGF0ZS0+ZXh0cmFibGssICZydmFsKTsKKwlpZiAoZXJyb3IpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKwkvKgorCSAqIEZpeCB0aGUgaGFzaCB2YWx1ZXMgdXAgdGhlIGJ0cmVlLgorCSAqLworCXhmc19kYV9maXhoYXNocGF0aChzdGF0ZSwgJnN0YXRlLT5wYXRoKTsKKwkvKgorCSAqIElmIHdlIG5lZWQgdG8gam9pbiBsZWFmIGJsb2NrcywgZG8gaXQuCisJICovCisJaWYgKHJ2YWwgJiYgc3RhdGUtPnBhdGguYWN0aXZlID4gMSkKKwkJZXJyb3IgPSB4ZnNfZGFfam9pbihzdGF0ZSk7CisJLyoKKwkgKiBJZiBubyBlcnJvcnMgc28gZmFyLCB0cnkgY29udmVyc2lvbiB0byBsZWFmIGZvcm1hdC4KKwkgKi8KKwlpZiAoIWVycm9yKQorCQllcnJvciA9IHhmc19kaXIyX25vZGVfdG9fbGVhZihzdGF0ZSk7CisJeGZzX2RhX3N0YXRlX2ZyZWUoc3RhdGUpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIFJlcGxhY2UgYW4gZW50cnkncyBpbm9kZSBudW1iZXIgaW4gYSBub2RlLWZvcm1hdCBkaXJlY3RvcnkuCisgKi8KK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9ub2RlX3JlcGxhY2UoCisJeGZzX2RhX2FyZ3NfdAkJKmFyZ3MpCQkvKiBvcGVyYXRpb24gYXJndW1lbnRzICovCit7CisJeGZzX2RhX3N0YXRlX2Jsa190CSpibGs7CQkvKiBsZWFmIGJsb2NrICovCisJeGZzX2RpcjJfZGF0YV90CQkqZGF0YTsJCS8qIGRhdGEgYmxvY2sgc3RydWN0dXJlICovCisJeGZzX2RpcjJfZGF0YV9lbnRyeV90CSpkZXA7CQkvKiBkYXRhIGVudHJ5IGNoYW5nZWQgKi8KKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCWludAkJCWk7CQkvKiBidHJlZSBsZXZlbCAqLworCXhmc19pbm9fdAkJaW51bTsJCS8qIG5ldyBpbm9kZSBudW1iZXIgKi8KKwl4ZnNfZGlyMl9sZWFmX3QJCSpsZWFmOwkJLyogbGVhZiBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9sZWFmX2VudHJ5X3QJKmxlcDsJCS8qIGxlYWYgZW50cnkgYmVpbmcgY2hhbmdlZCAqLworCWludAkJCXJ2YWw7CQkvKiBpbnRlcm5hbCByZXR1cm4gdmFsdWUgKi8KKwl4ZnNfZGFfc3RhdGVfdAkJKnN0YXRlOwkJLyogYnRyZWUgY3Vyc29yICovCisKKwl4ZnNfZGlyMl90cmFjZV9hcmdzKCJub2RlX3JlcGxhY2UiLCBhcmdzKTsKKwkvKgorCSAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBidHJlZSBjdXJzb3IuCisJICovCisJc3RhdGUgPSB4ZnNfZGFfc3RhdGVfYWxsb2MoKTsKKwlzdGF0ZS0+YXJncyA9IGFyZ3M7CisJc3RhdGUtPm1wID0gYXJncy0+ZHAtPmlfbW91bnQ7CisJc3RhdGUtPmJsb2Nrc2l6ZSA9IHN0YXRlLT5tcC0+bV9kaXJibGtzaXplOworCXN0YXRlLT5ub2RlX2VudHMgPSBzdGF0ZS0+bXAtPm1fZGlyX25vZGVfZW50czsKKwlpbnVtID0gYXJncy0+aW51bWJlcjsKKwkvKgorCSAqIExvb2t1cCB0aGUgZW50cnkgdG8gY2hhbmdlIGluIHRoZSBidHJlZS4KKwkgKi8KKwllcnJvciA9IHhmc19kYV9ub2RlX2xvb2t1cF9pbnQoc3RhdGUsICZydmFsKTsKKwlpZiAoZXJyb3IpIHsKKwkJcnZhbCA9IGVycm9yOworCX0KKwkvKgorCSAqIEl0IHNob3VsZCBiZSBmb3VuZCwgc2luY2UgdGhlIHZub2Rlb3BzIGxheWVyIGhhcyBsb29rZWQgaXQgdXAKKwkgKiBhbmQgbG9ja2VkIGl0LiAgQnV0IHBhcmFub2lhIGlzIGdvb2QuCisJICovCisJaWYgKHJ2YWwgPT0gRUVYSVNUKSB7CisJCS8qCisJCSAqIEZpbmQgdGhlIGxlYWYgZW50cnkuCisJCSAqLworCQlibGsgPSAmc3RhdGUtPnBhdGguYmxrW3N0YXRlLT5wYXRoLmFjdGl2ZSAtIDFdOworCQlBU1NFUlQoYmxrLT5tYWdpYyA9PSBYRlNfRElSMl9MRUFGTl9NQUdJQyk7CisJCWxlYWYgPSBibGstPmJwLT5kYXRhOworCQlsZXAgPSAmbGVhZi0+ZW50c1tibGstPmluZGV4XTsKKwkJQVNTRVJUKHN0YXRlLT5leHRyYXZhbGlkKTsKKwkJLyoKKwkJICogUG9pbnQgdG8gdGhlIGRhdGEgZW50cnkuCisJCSAqLworCQlkYXRhID0gc3RhdGUtPmV4dHJhYmxrLmJwLT5kYXRhOworCQlBU1NFUlQoSU5UX0dFVChkYXRhLT5oZHIubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfREFUQV9NQUdJQyk7CisJCWRlcCA9ICh4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgKikKKwkJICAgICAgKChjaGFyICopZGF0YSArCisJCSAgICAgICBYRlNfRElSMl9EQVRBUFRSX1RPX09GRihzdGF0ZS0+bXAsIElOVF9HRVQobGVwLT5hZGRyZXNzLCBBUkNIX0NPTlZFUlQpKSk7CisJCUFTU0VSVChpbnVtICE9IElOVF9HRVQoZGVwLT5pbnVtYmVyLCBBUkNIX0NPTlZFUlQpKTsKKwkJLyoKKwkJICogRmlsbCBpbiB0aGUgbmV3IGlub2RlIG51bWJlciBhbmQgbG9nIHRoZSBlbnRyeS4KKwkJICovCisJCUlOVF9TRVQoZGVwLT5pbnVtYmVyLCBBUkNIX0NPTlZFUlQsIGludW0pOworCQl4ZnNfZGlyMl9kYXRhX2xvZ19lbnRyeShhcmdzLT50cmFucywgc3RhdGUtPmV4dHJhYmxrLmJwLCBkZXApOworCQlydmFsID0gMDsKKwl9CisJLyoKKwkgKiBEaWRuJ3QgZmluZCBpdCwgYW5kIHdlJ3JlIGhvbGRpbmcgYSBkYXRhIGJsb2NrLiAgRHJvcCBpdC4KKwkgKi8KKwllbHNlIGlmIChzdGF0ZS0+ZXh0cmF2YWxpZCkgeworCQl4ZnNfZGFfYnJlbHNlKGFyZ3MtPnRyYW5zLCBzdGF0ZS0+ZXh0cmFibGsuYnApOworCQlzdGF0ZS0+ZXh0cmFibGsuYnAgPSBOVUxMOworCX0KKwkvKgorCSAqIFJlbGVhc2UgYWxsIHRoZSBidWZmZXJzIGluIHRoZSBjdXJzb3IuCisJICovCisJZm9yIChpID0gMDsgaSA8IHN0YXRlLT5wYXRoLmFjdGl2ZTsgaSsrKSB7CisJCXhmc19kYV9icmVsc2UoYXJncy0+dHJhbnMsIHN0YXRlLT5wYXRoLmJsa1tpXS5icCk7CisJCXN0YXRlLT5wYXRoLmJsa1tpXS5icCA9IE5VTEw7CisJfQorCXhmc19kYV9zdGF0ZV9mcmVlKHN0YXRlKTsKKwlyZXR1cm4gcnZhbDsKK30KKworLyoKKyAqIFRyaW0gb2ZmIGEgdHJhaWxpbmcgZW1wdHkgZnJlZXNwYWNlIGJsb2NrLgorICogUmV0dXJuIChpbiBydmFscCkgMSBpZiB3ZSBkaWQgaXQsIDAgaWYgbm90LgorICovCitpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2RpcjJfbm9kZV90cmltX2ZyZWUoCisJeGZzX2RhX2FyZ3NfdAkJKmFyZ3MsCQkvKiBvcGVyYXRpb24gYXJndW1lbnRzICovCisJeGZzX2ZpbGVvZmZfdAkJZm8sCQkvKiBmcmVlIGJsb2NrIG51bWJlciAqLworCWludAkJCSpydmFscCkJCS8qIG91dDogZGlkIHNvbWV0aGluZyAqLworeworCXhmc19kYWJ1Zl90CQkqYnA7CQkvKiBmcmVlc3BhY2UgYnVmZmVyICovCisJeGZzX2lub2RlX3QJCSpkcDsJCS8qIGluY29yZSBkaXJlY3RvcnkgaW5vZGUgKi8KKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiBjb2RlICovCisJeGZzX2RpcjJfZnJlZV90CQkqZnJlZTsJCS8qIGZyZWVzcGFjZSBzdHJ1Y3R1cmUgKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc190cmFuc190CQkqdHA7CQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisKKwlkcCA9IGFyZ3MtPmRwOworCW1wID0gZHAtPmlfbW91bnQ7CisJdHAgPSBhcmdzLT50cmFuczsKKwkvKgorCSAqIFJlYWQgdGhlIGZyZWVzcGFjZSBibG9jay4KKwkgKi8KKwlpZiAodW5saWtlbHkoZXJyb3IgPSB4ZnNfZGFfcmVhZF9idWYodHAsIGRwLCAoeGZzX2RhYmxrX3QpZm8sIC0yLCAmYnAsCisJCQlYRlNfREFUQV9GT1JLKSkpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCS8qCisJICogVGhlcmUgY2FuIGJlIGhvbGVzIGluIGZyZWVzcGFjZS4gIElmIGZvIGlzIGEgaG9sZSwgdGhlcmUncworCSAqIG5vdGhpbmcgdG8gZG8uCisJICovCisJaWYgKGJwID09IE5VTEwpIHsKKwkJcmV0dXJuIDA7CisJfQorCWZyZWUgPSBicC0+ZGF0YTsKKwlBU1NFUlQoSU5UX0dFVChmcmVlLT5oZHIubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfRlJFRV9NQUdJQyk7CisJLyoKKwkgKiBJZiB0aGVyZSBhcmUgdXNlZCBlbnRyaWVzLCB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uCisJICovCisJaWYgKElOVF9HRVQoZnJlZS0+aGRyLm51c2VkLCBBUkNIX0NPTlZFUlQpID4gMCkgeworCQl4ZnNfZGFfYnJlbHNlKHRwLCBicCk7CisJCSpydmFscCA9IDA7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIEJsb3cgdGhlIGJsb2NrIGF3YXkuCisJICovCisJaWYgKChlcnJvciA9CisJICAgIHhmc19kaXIyX3Nocmlua19pbm9kZShhcmdzLCBYRlNfRElSMl9EQV9UT19EQihtcCwgKHhmc19kYWJsa190KWZvKSwKKwkJICAgIGJwKSkpIHsKKwkJLyoKKwkJICogQ2FuJ3QgZmFpbCB3aXRoIEVOT1NQQyBzaW5jZSB0aGF0IG9ubHkgaGFwcGVucyB3aXRoIG5vCisJCSAqIHNwYWNlIHJlc2VydmF0aW9uLCB3aGVuIGJyZWFraW5nIHVwIGFuIGV4dGVudCBpbnRvIHR3bworCQkgKiBwaWVjZXMuICBUaGlzIGlzIHRoZSBsYXN0IGJsb2NrIG9mIGFuIGV4dGVudC4KKwkJICovCisJCUFTU0VSVChlcnJvciAhPSBFTk9TUEMpOworCQl4ZnNfZGFfYnJlbHNlKHRwLCBicCk7CisJCXJldHVybiBlcnJvcjsKKwl9CisJLyoKKwkgKiBSZXR1cm4gdGhhdCB3ZSBzdWNjZWVkZWQuCisJICovCisJKnJ2YWxwID0gMTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGlyMl9ub2RlLmggYi9mcy94ZnMveGZzX2RpcjJfbm9kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZGI0MjAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2RpcjJfbm9kZS5oCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfRElSMl9OT0RFX0hfXworI2RlZmluZQlfX1hGU19ESVIyX05PREVfSF9fCisKKy8qCisgKiBEaXJlY3RvcnkgdmVyc2lvbiAyLCBidHJlZSBub2RlIGZvcm1hdCBzdHJ1Y3R1cmVzCisgKi8KKworc3RydWN0IHVpbzsKK3N0cnVjdCB4ZnNfZGFidWY7CitzdHJ1Y3QgeGZzX2RhX2FyZ3M7CitzdHJ1Y3QgeGZzX2RhX3N0YXRlOworc3RydWN0IHhmc19kYV9zdGF0ZV9ibGs7CitzdHJ1Y3QgeGZzX2lub2RlOworc3RydWN0IHhmc190cmFuczsKKworLyoKKyAqIENvbnN0YW50cy4KKyAqLworCisvKgorICogT2Zmc2V0IG9mIHRoZSBmcmVlc3BhY2UgaW5kZXguCisgKi8KKyNkZWZpbmUJWEZTX0RJUjJfRlJFRV9TUEFDRQkyCisjZGVmaW5lCVhGU19ESVIyX0ZSRUVfT0ZGU0VUCShYRlNfRElSMl9GUkVFX1NQQUNFICogWEZTX0RJUjJfU1BBQ0VfU0laRSkKKyNkZWZpbmUJWEZTX0RJUjJfRlJFRV9GSVJTVERCKG1wKQlcCisJWEZTX0RJUjJfQllURV9UT19EQihtcCwgWEZTX0RJUjJfRlJFRV9PRkZTRVQpCisKKyNkZWZpbmUJWEZTX0RJUjJfRlJFRV9NQUdJQwkweDU4NDQzMjQ2CS8qIFhEMkYgKi8KKworLyoKKyAqIFN0cnVjdHVyZXMuCisgKi8KK3R5cGVkZWYJc3RydWN0IHhmc19kaXIyX2ZyZWVfaGRyIHsKKwlfX3VpbnQzMl90CQltYWdpYzsJCS8qIFhGU19ESVIyX0ZSRUVfTUFHSUMgKi8KKwlfX2ludDMyX3QJCWZpcnN0ZGI7CS8qIGRiIG9mIGZpcnN0IGVudHJ5ICovCisJX19pbnQzMl90CQludmFsaWQ7CQkvKiBjb3VudCBvZiB2YWxpZCBlbnRyaWVzICovCisJX19pbnQzMl90CQludXNlZDsJCS8qIGNvdW50IG9mIHVzZWQgZW50cmllcyAqLworfSB4ZnNfZGlyMl9mcmVlX2hkcl90OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlyMl9mcmVlIHsKKwl4ZnNfZGlyMl9mcmVlX2hkcl90CWhkcjsJCS8qIGJsb2NrIGhlYWRlciAqLworCXhmc19kaXIyX2RhdGFfb2ZmX3QJYmVzdHNbMV07CS8qIGJlc3QgZnJlZSBjb3VudHMgKi8KKwkJCQkJCS8qIHVudXNlZCBlbnRyaWVzIGFyZSAtMSAqLworfSB4ZnNfZGlyMl9mcmVlX3Q7CisjZGVmaW5lCVhGU19ESVIyX01BWF9GUkVFX0JFU1RTKG1wKQlcCisJKCgobXApLT5tX2RpcmJsa3NpemUgLSAodWludClzaXplb2YoeGZzX2RpcjJfZnJlZV9oZHJfdCkpIC8gXAorCSAodWludClzaXplb2YoeGZzX2RpcjJfZGF0YV9vZmZfdCkpCisKKy8qCisgKiBNYWNyb3MuCisgKi8KKworLyoKKyAqIENvbnZlcnQgZGF0YSBzcGFjZSBkYiB0byB0aGUgY29ycmVzcG9uZGluZyBmcmVlIGRiLgorICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVIyX0RCX1RPX0ZEQikKK3hmc19kaXIyX2RiX3QKK3hmc19kaXIyX2RiX3RvX2ZkYihzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RpcjJfZGJfdCBkYik7CisjZGVmaW5lCVhGU19ESVIyX0RCX1RPX0ZEQihtcCxkYikJeGZzX2RpcjJfZGJfdG9fZmRiKG1wLCBkYikKKyNlbHNlCisjZGVmaW5lCVhGU19ESVIyX0RCX1RPX0ZEQihtcCxkYikJXAorCShYRlNfRElSMl9GUkVFX0ZJUlNUREIobXApICsgKGRiKSAvIFhGU19ESVIyX01BWF9GUkVFX0JFU1RTKG1wKSkKKyNlbmRpZgorCisvKgorICogQ29udmVydCBkYXRhIHNwYWNlIGRiIHRvIHRoZSBjb3JyZXNwb25kaW5nIGluZGV4IGluIGEgZnJlZSBkYi4KKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9EQl9UT19GRElOREVYKQoraW50Cit4ZnNfZGlyMl9kYl90b19mZGluZGV4KHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGlyMl9kYl90IGRiKTsKKyNkZWZpbmUJWEZTX0RJUjJfREJfVE9fRkRJTkRFWChtcCxkYikJeGZzX2RpcjJfZGJfdG9fZmRpbmRleChtcCwgZGIpCisjZWxzZQorI2RlZmluZQlYRlNfRElSMl9EQl9UT19GRElOREVYKG1wLGRiKQkoKGRiKSAlIFhGU19ESVIyX01BWF9GUkVFX0JFU1RTKG1wKSkKKyNlbmRpZgorCisvKgorICogRnVuY3Rpb25zLgorICovCisKK2V4dGVybiB2b2lkCisJeGZzX2RpcjJfZnJlZV9sb2dfYmVzdHMoc3RydWN0IHhmc190cmFucyAqdHAsIHN0cnVjdCB4ZnNfZGFidWYgKmJwLAorCQkJCWludCBmaXJzdCwgaW50IGxhc3QpOworCitleHRlcm4gaW50CisJeGZzX2RpcjJfbGVhZl90b19ub2RlKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywgc3RydWN0IHhmc19kYWJ1ZiAqbGJwKTsKKworZXh0ZXJuIHhmc19kYWhhc2hfdAorCXhmc19kaXIyX2xlYWZuX2xhc3RoYXNoKHN0cnVjdCB4ZnNfZGFidWYgKmJwLCBpbnQgKmNvdW50KTsKKworZXh0ZXJuIGludAorCXhmc19kaXIyX2xlYWZuX2xvb2t1cF9pbnQoc3RydWN0IHhmc19kYWJ1ZiAqYnAsCisJCQkJICBzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsIGludCAqaW5kZXhwLAorCQkJCSAgc3RydWN0IHhmc19kYV9zdGF0ZSAqc3RhdGUpOworCitleHRlcm4gaW50CisJeGZzX2RpcjJfbGVhZm5fb3JkZXIoc3RydWN0IHhmc19kYWJ1ZiAqbGVhZjFfYnAsCisJCQkgICAgIHN0cnVjdCB4ZnNfZGFidWYgKmxlYWYyX2JwKTsKKworZXh0ZXJuIGludAorCXhmc19kaXIyX2xlYWZuX3NwbGl0KHN0cnVjdCB4ZnNfZGFfc3RhdGUgKnN0YXRlLAorCQkJICAgICBzdHJ1Y3QgeGZzX2RhX3N0YXRlX2JsayAqb2xkYmxrLAorCQkJICAgICBzdHJ1Y3QgeGZzX2RhX3N0YXRlX2JsayAqbmV3YmxrKTsKKworZXh0ZXJuIGludAorCXhmc19kaXIyX2xlYWZuX3Rvb3NtYWxsKHN0cnVjdCB4ZnNfZGFfc3RhdGUgKnN0YXRlLCBpbnQgKmFjdGlvbik7CisKK2V4dGVybiB2b2lkCisJeGZzX2RpcjJfbGVhZm5fdW5iYWxhbmNlKHN0cnVjdCB4ZnNfZGFfc3RhdGUgKnN0YXRlLAorCQkJCSBzdHJ1Y3QgeGZzX2RhX3N0YXRlX2JsayAqZHJvcF9ibGssCisJCQkJIHN0cnVjdCB4ZnNfZGFfc3RhdGVfYmxrICpzYXZlX2Jsayk7CisKK2V4dGVybiBpbnQKKwl4ZnNfZGlyMl9ub2RlX2FkZG5hbWUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKKworZXh0ZXJuIGludAorCXhmc19kaXIyX25vZGVfbG9va3VwKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CisKK2V4dGVybiBpbnQKKwl4ZnNfZGlyMl9ub2RlX3JlbW92ZW5hbWUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKKworZXh0ZXJuIGludAorCXhmc19kaXIyX25vZGVfcmVwbGFjZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworCitleHRlcm4gaW50CisJeGZzX2RpcjJfbm9kZV90cmltX2ZyZWUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzLCB4ZnNfZmlsZW9mZl90IGZvLAorCQkJCWludCAqcnZhbHApOworCisjZW5kaWYJLyogX19YRlNfRElSMl9OT0RFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXIyX3NmLmMgYi9mcy94ZnMveGZzX2RpcjJfc2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmJjNjE2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19kaXIyX3NmLmMKQEAgLTAsMCArMSwxMzE3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisvKgorICogeGZzX2RpcjJfc2YuYworICogU2hvcnRmb3JtIGRpcmVjdG9yeSBpbXBsZW1lbnRhdGlvbiBmb3IgdjIgZGlyZWN0b3JpZXMuCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorCisjaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc190eXBlcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlX2l0ZW0uaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfZGFfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX2xlYWYuaCIKKyNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9kYXRhLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfbGVhZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX2Jsb2NrLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfdHJhY2UuaCIKKworLyoKKyAqIFByb3RvdHlwZXMgZm9yIGludGVybmFsIGZ1bmN0aW9ucy4KKyAqLworc3RhdGljIHZvaWQgeGZzX2RpcjJfc2ZfYWRkbmFtZV9lYXN5KHhmc19kYV9hcmdzX3QgKmFyZ3MsCisJCQkJICAgICB4ZnNfZGlyMl9zZl9lbnRyeV90ICpzZmVwLAorCQkJCSAgICAgeGZzX2RpcjJfZGF0YV9hb2ZmX3Qgb2Zmc2V0LAorCQkJCSAgICAgaW50IG5ld19pc2l6ZSk7CitzdGF0aWMgdm9pZCB4ZnNfZGlyMl9zZl9hZGRuYW1lX2hhcmQoeGZzX2RhX2FyZ3NfdCAqYXJncywgaW50IG9iamNoYW5nZSwKKwkJCQkgICAgIGludCBuZXdfaXNpemUpOworc3RhdGljIGludCB4ZnNfZGlyMl9zZl9hZGRuYW1lX3BpY2soeGZzX2RhX2FyZ3NfdCAqYXJncywgaW50IG9iamNoYW5nZSwKKwkJCQkgICAgeGZzX2RpcjJfc2ZfZW50cnlfdCAqKnNmZXBwLAorCQkJCSAgICB4ZnNfZGlyMl9kYXRhX2FvZmZfdCAqb2Zmc2V0cCk7CisjaWZkZWYgREVCVUcKK3N0YXRpYyB2b2lkIHhmc19kaXIyX3NmX2NoZWNrKHhmc19kYV9hcmdzX3QgKmFyZ3MpOworI2Vsc2UKKyNkZWZpbmUJeGZzX2RpcjJfc2ZfY2hlY2soYXJncykKKyNlbmRpZiAvKiBERUJVRyAqLworI2lmIFhGU19CSUdfSU5VTVMKK3N0YXRpYyB2b2lkIHhmc19kaXIyX3NmX3RvaW5vNCh4ZnNfZGFfYXJnc190ICphcmdzKTsKK3N0YXRpYyB2b2lkIHhmc19kaXIyX3NmX3RvaW5vOCh4ZnNfZGFfYXJnc190ICphcmdzKTsKKyNlbmRpZiAvKiBYRlNfQklHX0lOVU1TICovCisKKy8qCisgKiBHaXZlbiBhIGJsb2NrIGRpcmVjdG9yeSAoZHAvYmxvY2spLCBjYWxjdWxhdGUgaXRzIHNpemUgYXMgYSBzaG9ydGZvcm0gKHNmKQorICogZGlyZWN0b3J5IGFuZCBhIGhlYWRlciBmb3IgdGhlIHNmIGRpcmVjdG9yeSwgaWYgaXQgd2lsbCBmaXQgaXQgdGhlCisgKiBzcGFjZSBjdXJyZW50bHkgcHJlc2VudCBpbiB0aGUgaW5vZGUuICBJZiBpdCB3b24ndCBmaXQsIHRoZSBvdXRwdXQKKyAqIHNpemUgaXMgdG9vIGJpZyAoYnV0IG5vdCBhY2N1cmF0ZSkuCisgKi8KK2ludAkJCQkJCS8qIHNpemUgZm9yIHNmIGZvcm0gKi8KK3hmc19kaXIyX2Jsb2NrX3Nmc2l6ZSgKKwl4ZnNfaW5vZGVfdAkJKmRwLAkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwl4ZnNfZGlyMl9ibG9ja190CSpibG9jaywJCS8qIGJsb2NrIGRpcmVjdG9yeSBkYXRhICovCisJeGZzX2RpcjJfc2ZfaGRyX3QJKnNmaHApCQkvKiBvdXRwdXQ6IGhlYWRlciBmb3Igc2YgZm9ybSAqLworeworCXhmc19kaXIyX2RhdGFwdHJfdAlhZGRyOwkJLyogZGF0YSBlbnRyeSBhZGRyZXNzICovCisJeGZzX2RpcjJfbGVhZl9lbnRyeV90CSpibHA7CQkvKiBsZWFmIGFyZWEgb2YgdGhlIGJsb2NrICovCisJeGZzX2RpcjJfYmxvY2tfdGFpbF90CSpidHA7CQkvKiB0YWlsIGFyZWEgb2YgdGhlIGJsb2NrICovCisJaW50CQkJY291bnQ7CQkvKiBzaG9ydGZvcm0gZW50cnkgY291bnQgKi8KKwl4ZnNfZGlyMl9kYXRhX2VudHJ5X3QJKmRlcDsJCS8qIGRhdGEgZW50cnkgaW4gdGhlIGJsb2NrICovCisJaW50CQkJaTsJCS8qIGJsb2NrIGVudHJ5IGluZGV4ICovCisJaW50CQkJaThjb3VudDsJLyogY291bnQgb2YgYmlnLWlub2RlIGVudHJpZXMgKi8KKwlpbnQJCQlpc2RvdDsJCS8qIGVudHJ5IGlzICIuIiAqLworCWludAkJCWlzZG90ZG90OwkvKiBlbnRyeSBpcyAiLi4iICovCisJeGZzX21vdW50X3QJCSptcDsJCS8qIG1vdW50IHN0cnVjdHVyZSBwb2ludGVyICovCisJaW50CQkJbmFtZWxlbjsJLyogdG90YWwgbmFtZSBieXRlcyAqLworCXhmc19pbm9fdAkJcGFyZW50OwkJLyogcGFyZW50IGlub2RlIG51bWJlciAqLworCWludAkJCXNpemU9MDsJCS8qIHRvdGFsIGNvbXB1dGVkIHNpemUgKi8KKworCW1wID0gZHAtPmlfbW91bnQ7CisKKwljb3VudCA9IGk4Y291bnQgPSBuYW1lbGVuID0gMDsKKwlidHAgPSBYRlNfRElSMl9CTE9DS19UQUlMX1AobXAsIGJsb2NrKTsKKwlibHAgPSBYRlNfRElSMl9CTE9DS19MRUFGX1AoYnRwKTsKKworCS8qCisJICogSXRlcmF0ZSBvdmVyIHRoZSBibG9jaydzIGRhdGEgZW50cmllcyBieSB1c2luZyB0aGUgbGVhZiBwb2ludGVycy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgSU5UX0dFVChidHAtPmNvdW50LCBBUkNIX0NPTlZFUlQpOyBpKyspIHsKKwkJaWYgKChhZGRyID0gSU5UX0dFVChibHBbaV0uYWRkcmVzcywgQVJDSF9DT05WRVJUKSkgPT0gWEZTX0RJUjJfTlVMTF9EQVRBUFRSKQorCQkJY29udGludWU7CisJCS8qCisJCSAqIENhbGN1bGF0ZSB0aGUgcG9pbnRlciB0byB0aGUgZW50cnkgYXQgaGFuZC4KKwkJICovCisJCWRlcCA9ICh4ZnNfZGlyMl9kYXRhX2VudHJ5X3QgKikKKwkJICAgICAgKChjaGFyICopYmxvY2sgKyBYRlNfRElSMl9EQVRBUFRSX1RPX09GRihtcCwgYWRkcikpOworCQkvKgorCQkgKiBEZXRlY3QgLiBhbmQgLi4sIHNvIHdlIGNhbiBzcGVjaWFsLWNhc2UgdGhlbS4KKwkJICogLiBpcyBub3QgaW5jbHVkZWQgaW4gc2YgZGlyZWN0b3JpZXMuCisJCSAqIC4uIGlzIGluY2x1ZGVkIGJ5IGp1c3QgdGhlIHBhcmVudCBpbm9kZSBudW1iZXIuCisJCSAqLworCQlpc2RvdCA9IGRlcC0+bmFtZWxlbiA9PSAxICYmIGRlcC0+bmFtZVswXSA9PSAnLic7CisJCWlzZG90ZG90ID0KKwkJCWRlcC0+bmFtZWxlbiA9PSAyICYmCisJCQlkZXAtPm5hbWVbMF0gPT0gJy4nICYmIGRlcC0+bmFtZVsxXSA9PSAnLic7CisjaWYgWEZTX0JJR19JTlVNUworCQlpZiAoIWlzZG90KQorCQkJaThjb3VudCArPSBJTlRfR0VUKGRlcC0+aW51bWJlciwgQVJDSF9DT05WRVJUKSA+IFhGU19ESVIyX01BWF9TSE9SVF9JTlVNOworI2VuZGlmCisJCWlmICghaXNkb3QgJiYgIWlzZG90ZG90KSB7CisJCQljb3VudCsrOworCQkJbmFtZWxlbiArPSBkZXAtPm5hbWVsZW47CisJCX0gZWxzZSBpZiAoaXNkb3Rkb3QpCisJCQlwYXJlbnQgPSBJTlRfR0VUKGRlcC0+aW51bWJlciwgQVJDSF9DT05WRVJUKTsKKwkJLyoKKwkJICogQ2FsY3VsYXRlIHRoZSBuZXcgc2l6ZSwgc2VlIGlmIHdlIHNob3VsZCBnaXZlIHVwIHlldC4KKwkJICovCisJCXNpemUgPSBYRlNfRElSMl9TRl9IRFJfU0laRShpOGNvdW50KSArCQkvKiBoZWFkZXIgKi8KKwkJICAgICAgIGNvdW50ICsJCQkJCS8qIG5hbWVsZW4gKi8KKwkJICAgICAgIGNvdW50ICogKHVpbnQpc2l6ZW9mKHhmc19kaXIyX3NmX29mZl90KSArIC8qIG9mZnNldCAqLworCQkgICAgICAgbmFtZWxlbiArCQkJCS8qIG5hbWUgKi8KKwkJICAgICAgIChpOGNvdW50ID8JCQkJLyogaW51bWJlciAqLworCQkJCSh1aW50KXNpemVvZih4ZnNfZGlyMl9pbm84X3QpICogY291bnQgOgorCQkJCSh1aW50KXNpemVvZih4ZnNfZGlyMl9pbm80X3QpICogY291bnQpOworCQlpZiAoc2l6ZSA+IFhGU19JRk9SS19EU0laRShkcCkpCisJCQlyZXR1cm4gc2l6ZTsJCS8qIHNpemUgdmFsdWUgaXMgYSBmYWlsdXJlICovCisJfQorCS8qCisJICogQ3JlYXRlIHRoZSBvdXRwdXQgaGVhZGVyLCBpZiBpdCB3b3JrZWQuCisJICovCisJc2ZocC0+Y291bnQgPSBjb3VudDsKKwlzZmhwLT5pOGNvdW50ID0gaThjb3VudDsKKwlYRlNfRElSMl9TRl9QVVRfSU5VTUJFUigoeGZzX2RpcjJfc2ZfdCAqKXNmaHAsICZwYXJlbnQsICZzZmhwLT5wYXJlbnQpOworCXJldHVybiBzaXplOworfQorCisvKgorICogQ29udmVydCBhIGJsb2NrIGZvcm1hdCBkaXJlY3RvcnkgdG8gc2hvcnRmb3JtLgorICogQ2FsbGVyIGhhcyBhbHJlYWR5IGNoZWNrZWQgdGhhdCBpdCB3aWxsIGZpdCwgYW5kIGJ1aWx0IHVzIGEgaGVhZGVyLgorICovCitpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2RpcjJfYmxvY2tfdG9fc2YoCisJeGZzX2RhX2FyZ3NfdAkJKmFyZ3MsCQkvKiBvcGVyYXRpb24gYXJndW1lbnRzICovCisJeGZzX2RhYnVmX3QJCSpicCwJCS8qIGJsb2NrIGJ1ZmZlciAqLworCWludAkJCXNpemUsCQkvKiBzaG9ydGZvcm0gZGlyZWN0b3J5IHNpemUgKi8KKwl4ZnNfZGlyMl9zZl9oZHJfdAkqc2ZocCkJCS8qIHNob3J0Zm9ybSBkaXJlY3RvcnkgaGRyICovCit7CisJeGZzX2RpcjJfYmxvY2tfdAkqYmxvY2s7CQkvKiBibG9jayBzdHJ1Y3R1cmUgKi8KKwl4ZnNfZGlyMl9ibG9ja190YWlsX3QJKmJ0cDsJCS8qIGJsb2NrIHRhaWwgcG9pbnRlciAqLworCXhmc19kaXIyX2RhdGFfZW50cnlfdAkqZGVwOwkJLyogZGF0YSBlbnRyeSBwb2ludGVyICovCisJeGZzX2lub2RlX3QJCSpkcDsJCS8qIGluY29yZSBkaXJlY3RvcnkgaW5vZGUgKi8KKwl4ZnNfZGlyMl9kYXRhX3VudXNlZF90CSpkdXA7CQkvKiB1bnVzZWQgZGF0YSBwb2ludGVyICovCisJY2hhcgkJCSplbmRwdHI7CS8qIGVuZCBvZiBkYXRhIGVudHJpZXMgKi8KKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCWludAkJCWxvZ2ZsYWdzOwkvKiBpbm9kZSBsb2dnaW5nIGZsYWdzICovCisJeGZzX21vdW50X3QJCSptcDsJCS8qIGZpbGVzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwljaGFyCQkJKnB0cjsJCS8qIGN1cnJlbnQgZGF0YSBwb2ludGVyICovCisJeGZzX2RpcjJfc2ZfZW50cnlfdAkqc2ZlcDsJCS8qIHNob3J0Zm9ybSBlbnRyeSAqLworCXhmc19kaXIyX3NmX3QJCSpzZnA7CQkvKiBzaG9ydGZvcm0gc3RydWN0dXJlICovCisJeGZzX2lub190ICAgICAgICAgICAgICAgdGVtcDsKKworCXhmc19kaXIyX3RyYWNlX2FyZ3Nfc2IoImJsb2NrX3RvX3NmIiwgYXJncywgc2l6ZSwgYnApOworCWRwID0gYXJncy0+ZHA7CisJbXAgPSBkcC0+aV9tb3VudDsKKworCS8qCisJICogTWFrZSBhIGNvcHkgb2YgdGhlIGJsb2NrIGRhdGEsIHNvIHdlIGNhbiBzaHJpbmsgdGhlIGlub2RlCisJICogYW5kIGFkZCBsb2NhbCBkYXRhLgorCSAqLworCWJsb2NrID0ga21lbV9hbGxvYyhtcC0+bV9kaXJibGtzaXplLCBLTV9TTEVFUCk7CisJbWVtY3B5KGJsb2NrLCBicC0+ZGF0YSwgbXAtPm1fZGlyYmxrc2l6ZSk7CisJbG9nZmxhZ3MgPSBYRlNfSUxPR19DT1JFOworCWlmICgoZXJyb3IgPSB4ZnNfZGlyMl9zaHJpbmtfaW5vZGUoYXJncywgbXAtPm1fZGlyZGF0YWJsaywgYnApKSkgeworCQlBU1NFUlQoZXJyb3IgIT0gRU5PU1BDKTsKKwkJZ290byBvdXQ7CisJfQorCS8qCisJICogVGhlIGJ1ZmZlciBpcyBub3cgdW5jb25kaXRpb25hbGx5IGdvbmUsIHdoZXRoZXIKKwkgKiB4ZnNfZGlyMl9zaHJpbmtfaW5vZGUgd29ya2VkIG9yIG5vdC4KKwkgKgorCSAqIENvbnZlcnQgdGhlIGlub2RlIHRvIGxvY2FsIGZvcm1hdC4KKwkgKi8KKwlkcC0+aV9kZi5pZl9mbGFncyAmPSB+WEZTX0lGRVhURU5UUzsKKwlkcC0+aV9kZi5pZl9mbGFncyB8PSBYRlNfSUZJTkxJTkU7CisJZHAtPmlfZC5kaV9mb3JtYXQgPSBYRlNfRElOT0RFX0ZNVF9MT0NBTDsKKwlBU1NFUlQoZHAtPmlfZGYuaWZfYnl0ZXMgPT0gMCk7CisJeGZzX2lkYXRhX3JlYWxsb2MoZHAsIHNpemUsIFhGU19EQVRBX0ZPUkspOworCWxvZ2ZsYWdzIHw9IFhGU19JTE9HX0REQVRBOworCS8qCisJICogQ29weSB0aGUgaGVhZGVyIGludG8gdGhlIG5ld2x5IGFsbG9jYXRlIGxvY2FsIHNwYWNlLgorCSAqLworCXNmcCA9ICh4ZnNfZGlyMl9zZl90ICopZHAtPmlfZGYuaWZfdTEuaWZfZGF0YTsKKwltZW1jcHkoc2ZwLCBzZmhwLCBYRlNfRElSMl9TRl9IRFJfU0laRShzZmhwLT5pOGNvdW50KSk7CisJZHAtPmlfZC5kaV9zaXplID0gc2l6ZTsKKwkvKgorCSAqIFNldCB1cCB0byBsb29wIG92ZXIgdGhlIGJsb2NrJ3MgZW50cmllcy4KKwkgKi8KKwlidHAgPSBYRlNfRElSMl9CTE9DS19UQUlMX1AobXAsIGJsb2NrKTsKKwlwdHIgPSAoY2hhciAqKWJsb2NrLT51OworCWVuZHB0ciA9IChjaGFyICopWEZTX0RJUjJfQkxPQ0tfTEVBRl9QKGJ0cCk7CisJc2ZlcCA9IFhGU19ESVIyX1NGX0ZJUlNURU5UUlkoc2ZwKTsKKwkvKgorCSAqIExvb3Agb3ZlciB0aGUgYWN0aXZlIGFuZCB1bnVzZWQgZW50cmllcy4KKwkgKiBTdG9wIHdoZW4gd2UgcmVhY2ggdGhlIGxlYWYvdGFpbCBwb3J0aW9uIG9mIHRoZSBibG9jay4KKwkgKi8KKwl3aGlsZSAocHRyIDwgZW5kcHRyKSB7CisJCS8qCisJCSAqIElmIGl0J3MgdW51c2VkLCBqdXN0IHNraXAgb3ZlciBpdC4KKwkJICovCisJCWR1cCA9ICh4ZnNfZGlyMl9kYXRhX3VudXNlZF90ICopcHRyOworCQlpZiAoSU5UX0dFVChkdXAtPmZyZWV0YWcsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUjJfREFUQV9GUkVFX1RBRykgeworCQkJcHRyICs9IElOVF9HRVQoZHVwLT5sZW5ndGgsIEFSQ0hfQ09OVkVSVCk7CisJCQljb250aW51ZTsKKwkJfQorCQlkZXAgPSAoeGZzX2RpcjJfZGF0YV9lbnRyeV90ICopcHRyOworCQkvKgorCQkgKiBTa2lwIC4KKwkJICovCisJCWlmIChkZXAtPm5hbWVsZW4gPT0gMSAmJiBkZXAtPm5hbWVbMF0gPT0gJy4nKQorCQkJQVNTRVJUKElOVF9HRVQoZGVwLT5pbnVtYmVyLCBBUkNIX0NPTlZFUlQpID09IGRwLT5pX2lubyk7CisJCS8qCisJCSAqIFNraXAgLi4sIGJ1dCBtYWtlIHN1cmUgdGhlIGlub2RlIG51bWJlciBpcyByaWdodC4KKwkJICovCisJCWVsc2UgaWYgKGRlcC0+bmFtZWxlbiA9PSAyICYmCisJCQkgZGVwLT5uYW1lWzBdID09ICcuJyAmJiBkZXAtPm5hbWVbMV0gPT0gJy4nKQorCQkJQVNTRVJUKElOVF9HRVQoZGVwLT5pbnVtYmVyLCBBUkNIX0NPTlZFUlQpID09CisJCQkgICAgICAgWEZTX0RJUjJfU0ZfR0VUX0lOVU1CRVIoc2ZwLCAmc2ZwLT5oZHIucGFyZW50KSk7CisJCS8qCisJCSAqIE5vcm1hbCBlbnRyeSwgY29weSBpdCBpbnRvIHNob3J0Zm9ybS4KKwkJICovCisJCWVsc2UgeworCQkJc2ZlcC0+bmFtZWxlbiA9IGRlcC0+bmFtZWxlbjsKKwkJCVhGU19ESVIyX1NGX1BVVF9PRkZTRVQoc2ZlcCwKKwkJCQkoeGZzX2RpcjJfZGF0YV9hb2ZmX3QpCisJCQkJKChjaGFyICopZGVwIC0gKGNoYXIgKilibG9jaykpOworCQkJbWVtY3B5KHNmZXAtPm5hbWUsIGRlcC0+bmFtZSwgZGVwLT5uYW1lbGVuKTsKKwkJCXRlbXA9SU5UX0dFVChkZXAtPmludW1iZXIsIEFSQ0hfQ09OVkVSVCk7CisJCQlYRlNfRElSMl9TRl9QVVRfSU5VTUJFUihzZnAsICZ0ZW1wLAorCQkJCVhGU19ESVIyX1NGX0lOVU1CRVJQKHNmZXApKTsKKwkJCXNmZXAgPSBYRlNfRElSMl9TRl9ORVhURU5UUlkoc2ZwLCBzZmVwKTsKKwkJfQorCQlwdHIgKz0gWEZTX0RJUjJfREFUQV9FTlRTSVpFKGRlcC0+bmFtZWxlbik7CisJfQorCUFTU0VSVCgoY2hhciAqKXNmZXAgLSAoY2hhciAqKXNmcCA9PSBzaXplKTsKKwl4ZnNfZGlyMl9zZl9jaGVjayhhcmdzKTsKK291dDoKKwl4ZnNfdHJhbnNfbG9nX2lub2RlKGFyZ3MtPnRyYW5zLCBkcCwgbG9nZmxhZ3MpOworCWttZW1fZnJlZShibG9jaywgbXAtPm1fZGlyYmxrc2l6ZSk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogQWRkIGEgbmFtZSB0byBhIHNob3J0Zm9ybSBkaXJlY3RvcnkuCisgKiBUaGVyZSBhcmUgdHdvIGFsZ29yaXRobXMsICJlYXN5IiBhbmQgImhhcmQiIHdoaWNoIHdlIGRlY2lkZSBvbgorICogYmVmb3JlIGNoYW5naW5nIGFueXRoaW5nLgorICogQ29udmVydCB0byBibG9jayBmb3JtIGlmIG5lY2Vzc2FyeSwgaWYgdGhlIG5ldyBlbnRyeSB3b24ndCBmaXQuCisgKi8KK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9zZl9hZGRuYW1lKAorCXhmc19kYV9hcmdzX3QJCSphcmdzKQkJLyogb3BlcmF0aW9uIGFyZ3VtZW50cyAqLworeworCWludAkJCWFkZF9lbnRzaXplOwkvKiBzaXplIG9mIHRoZSBuZXcgZW50cnkgKi8KKwl4ZnNfaW5vZGVfdAkJKmRwOwkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLworCWludAkJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJaW50CQkJaW5jcl9pc2l6ZTsJLyogdG90YWwgY2hhbmdlIGluIHNpemUgKi8KKwlpbnQJCQluZXdfaXNpemU7CS8qIGRpX3NpemUgYWZ0ZXIgYWRkaW5nIG5hbWUgKi8KKwlpbnQJCQlvYmpjaGFuZ2U7CS8qIGNoYW5naW5nIHRvIDgtYnl0ZSBpbm9kZXMgKi8KKwl4ZnNfZGlyMl9kYXRhX2FvZmZfdAlvZmZzZXQ7CQkvKiBvZmZzZXQgZm9yIG5ldyBlbnRyeSAqLworCWludAkJCW9sZF9pc2l6ZTsJLyogZGlfc2l6ZSBiZWZvcmUgYWRkaW5nIG5hbWUgKi8KKwlpbnQJCQlwaWNrOwkJLyogd2hpY2ggYWxnb3JpdGhtIHRvIHVzZSAqLworCXhmc19kaXIyX3NmX3QJCSpzZnA7CQkvKiBzaG9ydGZvcm0gc3RydWN0dXJlICovCisJeGZzX2RpcjJfc2ZfZW50cnlfdAkqc2ZlcDsJCS8qIHNob3J0Zm9ybSBlbnRyeSAqLworCisJeGZzX2RpcjJfdHJhY2VfYXJncygic2ZfYWRkbmFtZSIsIGFyZ3MpOworCUFTU0VSVCh4ZnNfZGlyMl9zZl9sb29rdXAoYXJncykgPT0gRU5PRU5UKTsKKwlkcCA9IGFyZ3MtPmRwOworCUFTU0VSVChkcC0+aV9kZi5pZl9mbGFncyAmIFhGU19JRklOTElORSk7CisJLyoKKwkgKiBNYWtlIHN1cmUgdGhlIHNob3J0Zm9ybSB2YWx1ZSBoYXMgc29tZSBvZiBpdHMgaGVhZGVyLgorCSAqLworCWlmIChkcC0+aV9kLmRpX3NpemUgPCBvZmZzZXRvZih4ZnNfZGlyMl9zZl9oZHJfdCwgcGFyZW50KSkgeworCQlBU1NFUlQoWEZTX0ZPUkNFRF9TSFVURE9XTihkcC0+aV9tb3VudCkpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJfQorCUFTU0VSVChkcC0+aV9kZi5pZl9ieXRlcyA9PSBkcC0+aV9kLmRpX3NpemUpOworCUFTU0VSVChkcC0+aV9kZi5pZl91MS5pZl9kYXRhICE9IE5VTEwpOworCXNmcCA9ICh4ZnNfZGlyMl9zZl90ICopZHAtPmlfZGYuaWZfdTEuaWZfZGF0YTsKKwlBU1NFUlQoZHAtPmlfZC5kaV9zaXplID49IFhGU19ESVIyX1NGX0hEUl9TSVpFKHNmcC0+aGRyLmk4Y291bnQpKTsKKwkvKgorCSAqIENvbXB1dGUgZW50cnkgKGFuZCBjaGFuZ2UgaW4pIHNpemUuCisJICovCisJYWRkX2VudHNpemUgPSBYRlNfRElSMl9TRl9FTlRTSVpFX0JZTkFNRShzZnAsIGFyZ3MtPm5hbWVsZW4pOworCWluY3JfaXNpemUgPSBhZGRfZW50c2l6ZTsKKwlvYmpjaGFuZ2UgPSAwOworI2lmIFhGU19CSUdfSU5VTVMKKwkvKgorCSAqIERvIHdlIGhhdmUgdG8gY2hhbmdlIHRvIDggYnl0ZSBpbm9kZXM/CisJICovCisJaWYgKGFyZ3MtPmludW1iZXIgPiBYRlNfRElSMl9NQVhfU0hPUlRfSU5VTSAmJiBzZnAtPmhkci5pOGNvdW50ID09IDApIHsKKwkJLyoKKwkJICogWWVzLCBhZGp1c3QgdGhlIGVudHJ5IHNpemUgYW5kIHRoZSB0b3RhbCBzaXplLgorCQkgKi8KKwkJYWRkX2VudHNpemUgKz0KKwkJCSh1aW50KXNpemVvZih4ZnNfZGlyMl9pbm84X3QpIC0KKwkJCSh1aW50KXNpemVvZih4ZnNfZGlyMl9pbm80X3QpOworCQlpbmNyX2lzaXplICs9CisJCQkoc2ZwLT5oZHIuY291bnQgKyAyKSAqCisJCQkoKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2lubzhfdCkgLQorCQkJICh1aW50KXNpemVvZih4ZnNfZGlyMl9pbm80X3QpKTsKKwkJb2JqY2hhbmdlID0gMTsKKwl9CisjZW5kaWYKKwlvbGRfaXNpemUgPSAoaW50KWRwLT5pX2QuZGlfc2l6ZTsKKwluZXdfaXNpemUgPSBvbGRfaXNpemUgKyBpbmNyX2lzaXplOworCS8qCisJICogV29uJ3QgZml0IGFzIHNob3J0Zm9ybSBhbnkgbW9yZSAoZHVlIHRvIHNpemUpLAorCSAqIG9yIHRoZSBwaWNrIHJvdXRpbmUgc2F5cyBpdCB3b24ndCAoZHVlIHRvIG9mZnNldCB2YWx1ZXMpLgorCSAqLworCWlmIChuZXdfaXNpemUgPiBYRlNfSUZPUktfRFNJWkUoZHApIHx8CisJICAgIChwaWNrID0KKwkgICAgIHhmc19kaXIyX3NmX2FkZG5hbWVfcGljayhhcmdzLCBvYmpjaGFuZ2UsICZzZmVwLCAmb2Zmc2V0KSkgPT0gMCkgeworCQkvKgorCQkgKiBKdXN0IGNoZWNraW5nIG9yIG5vIHNwYWNlIHJlc2VydmF0aW9uLCBpdCBkb2Vzbid0IGZpdC4KKwkJICovCisJCWlmIChhcmdzLT5qdXN0Y2hlY2sgfHwgYXJncy0+dG90YWwgPT0gMCkKKwkJCXJldHVybiBYRlNfRVJST1IoRU5PU1BDKTsKKwkJLyoKKwkJICogQ29udmVydCB0byBibG9jayBmb3JtIHRoZW4gYWRkIHRoZSBuYW1lLgorCQkgKi8KKwkJZXJyb3IgPSB4ZnNfZGlyMl9zZl90b19ibG9jayhhcmdzKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOworCQlyZXR1cm4geGZzX2RpcjJfYmxvY2tfYWRkbmFtZShhcmdzKTsKKwl9CisJLyoKKwkgKiBKdXN0IGNoZWNraW5nLCBpdCBmaXRzLgorCSAqLworCWlmIChhcmdzLT5qdXN0Y2hlY2spCisJCXJldHVybiAwOworCS8qCisJICogRG8gaXQgdGhlIGVhc3kgd2F5IC0ganVzdCBhZGQgaXQgYXQgdGhlIGVuZC4KKwkgKi8KKwlpZiAocGljayA9PSAxKQorCQl4ZnNfZGlyMl9zZl9hZGRuYW1lX2Vhc3koYXJncywgc2ZlcCwgb2Zmc2V0LCBuZXdfaXNpemUpOworCS8qCisJICogRG8gaXQgdGhlIGhhcmQgd2F5IC0gbG9vayBmb3IgYSBwbGFjZSB0byBpbnNlcnQgdGhlIG5ldyBlbnRyeS4KKwkgKiBDb252ZXJ0IHRvIDggYnl0ZSBpbm9kZSBudW1iZXJzIGZpcnN0IGlmIG5lY2Vzc2FyeS4KKwkgKi8KKwllbHNlIHsKKwkJQVNTRVJUKHBpY2sgPT0gMik7CisjaWYgWEZTX0JJR19JTlVNUworCQlpZiAob2JqY2hhbmdlKQorCQkJeGZzX2RpcjJfc2ZfdG9pbm84KGFyZ3MpOworI2VuZGlmCisJCXhmc19kaXIyX3NmX2FkZG5hbWVfaGFyZChhcmdzLCBvYmpjaGFuZ2UsIG5ld19pc2l6ZSk7CisJfQorCXhmc190cmFuc19sb2dfaW5vZGUoYXJncy0+dHJhbnMsIGRwLCBYRlNfSUxPR19DT1JFIHwgWEZTX0lMT0dfRERBVEEpOworCXJldHVybiAwOworfQorCisvKgorICogQWRkIHRoZSBuZXcgZW50cnkgdGhlICJlYXN5IiB3YXkuCisgKiBUaGlzIGlzIGNvcHlpbmcgdGhlIG9sZCBkaXJlY3RvcnkgYW5kIGFkZGluZyB0aGUgbmV3IGVudHJ5IGF0IHRoZSBlbmQuCisgKiBTaW5jZSBpdCdzIHNvcnRlZCBieSAib2Zmc2V0IiB3ZSBuZWVkIHJvb20gYWZ0ZXIgdGhlIGxhc3Qgb2Zmc2V0CisgKiB0aGF0J3MgYWxyZWFkeSB0aGVyZSwgYW5kIHRoZW4gcm9vbSB0byBjb252ZXJ0IHRvIGEgYmxvY2sgZGlyZWN0b3J5LgorICogVGhpcyBpcyBhbHJlYWR5IGNoZWNrZWQgYnkgdGhlIHBpY2sgcm91dGluZS4KKyAqLworc3RhdGljIHZvaWQKK3hmc19kaXIyX3NmX2FkZG5hbWVfZWFzeSgKKwl4ZnNfZGFfYXJnc190CQkqYXJncywJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KKwl4ZnNfZGlyMl9zZl9lbnRyeV90CSpzZmVwLAkJLyogcG9pbnRlciB0byBuZXcgZW50cnkgKi8KKwl4ZnNfZGlyMl9kYXRhX2FvZmZfdAlvZmZzZXQsCQkvKiBvZmZzZXQgdG8gdXNlIGZvciBuZXcgZW50ICovCisJaW50CQkJbmV3X2lzaXplKQkvKiBuZXcgZGlyZWN0b3J5IHNpemUgKi8KK3sKKwlpbnQJCQlieXRlb2ZmOwkvKiBieXRlIG9mZnNldCBpbiBzZiBkaXIgKi8KKwl4ZnNfaW5vZGVfdAkJKmRwOwkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLworCXhmc19kaXIyX3NmX3QJCSpzZnA7CQkvKiBzaG9ydGZvcm0gc3RydWN0dXJlICovCisKKwlkcCA9IGFyZ3MtPmRwOworCisJc2ZwID0gKHhmc19kaXIyX3NmX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOworCWJ5dGVvZmYgPSAoaW50KSgoY2hhciAqKXNmZXAgLSAoY2hhciAqKXNmcCk7CisJLyoKKwkgKiBHcm93IHRoZSBpbi1pbm9kZSBzcGFjZS4KKwkgKi8KKwl4ZnNfaWRhdGFfcmVhbGxvYyhkcCwgWEZTX0RJUjJfU0ZfRU5UU0laRV9CWU5BTUUoc2ZwLCBhcmdzLT5uYW1lbGVuKSwKKwkJWEZTX0RBVEFfRk9SSyk7CisJLyoKKwkgKiBOZWVkIHRvIHNldCB1cCBhZ2FpbiBkdWUgdG8gcmVhbGxvYyBvZiB0aGUgaW5vZGUgZGF0YS4KKwkgKi8KKwlzZnAgPSAoeGZzX2RpcjJfc2ZfdCAqKWRwLT5pX2RmLmlmX3UxLmlmX2RhdGE7CisJc2ZlcCA9ICh4ZnNfZGlyMl9zZl9lbnRyeV90ICopKChjaGFyICopc2ZwICsgYnl0ZW9mZik7CisJLyoKKwkgKiBGaWxsIGluIHRoZSBuZXcgZW50cnkuCisJICovCisJc2ZlcC0+bmFtZWxlbiA9IGFyZ3MtPm5hbWVsZW47CisJWEZTX0RJUjJfU0ZfUFVUX09GRlNFVChzZmVwLCBvZmZzZXQpOworCW1lbWNweShzZmVwLT5uYW1lLCBhcmdzLT5uYW1lLCBzZmVwLT5uYW1lbGVuKTsKKwlYRlNfRElSMl9TRl9QVVRfSU5VTUJFUihzZnAsICZhcmdzLT5pbnVtYmVyLAorCQlYRlNfRElSMl9TRl9JTlVNQkVSUChzZmVwKSk7CisJLyoKKwkgKiBVcGRhdGUgdGhlIGhlYWRlciBhbmQgaW5vZGUuCisJICovCisJc2ZwLT5oZHIuY291bnQrKzsKKyNpZiBYRlNfQklHX0lOVU1TCisJaWYgKGFyZ3MtPmludW1iZXIgPiBYRlNfRElSMl9NQVhfU0hPUlRfSU5VTSkKKwkJc2ZwLT5oZHIuaThjb3VudCsrOworI2VuZGlmCisJZHAtPmlfZC5kaV9zaXplID0gbmV3X2lzaXplOworCXhmc19kaXIyX3NmX2NoZWNrKGFyZ3MpOworfQorCisvKgorICogQWRkIHRoZSBuZXcgZW50cnkgdGhlICJoYXJkIiB3YXkuCisgKiBUaGUgY2FsbGVyIGhhcyBhbHJlYWR5IGNvbnZlcnRlZCB0byA4IGJ5dGUgaW5vZGUgbnVtYmVycyBpZiBuZWNlc3NhcnksCisgKiBpbiB3aGljaCBjYXNlIHdlIG5lZWQgdG8gbGVhdmUgdGhlIGk4Y291bnQgYXQgMS4KKyAqIEZpbmQgYSBob2xlIHRoYXQgdGhlIG5ldyBlbnRyeSB3aWxsIGZpdCBpbnRvLCBhbmQgY29weQorICogdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGVudHJpZXMsIHRoZSBuZXcgZW50cnksIGFuZCB0aGUgbGFzdCBwYXJ0IG9mCisgKiB0aGUgZW50cmllcy4KKyAqLworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkCit4ZnNfZGlyMl9zZl9hZGRuYW1lX2hhcmQoCisJeGZzX2RhX2FyZ3NfdAkJKmFyZ3MsCQkvKiBvcGVyYXRpb24gYXJndW1lbnRzICovCisJaW50CQkJb2JqY2hhbmdlLAkvKiBjaGFuZ2luZyBpbm9kZSBudW1iZXIgc2l6ZSAqLworCWludAkJCW5ld19pc2l6ZSkJLyogbmV3IGRpcmVjdG9yeSBzaXplICovCit7CisJaW50CQkJYWRkX2RhdGFzaXplOwkvKiBkYXRhIHNpemUgbmVlZCBmb3IgbmV3IGVudCAqLworCWNoYXIJCQkqYnVmOwkJLyogYnVmZmVyIGZvciBvbGQgKi8KKwl4ZnNfaW5vZGVfdAkJKmRwOwkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLworCWludAkJCWVvZjsJCS8qIHJlYWNoZWQgZW5kIG9mIG9sZCBkaXIgKi8KKwlpbnQJCQluYnl0ZXM7CQkvKiB0ZW1wIGZvciBieXRlIGNvcGllcyAqLworCXhmc19kaXIyX2RhdGFfYW9mZl90CW5ld19vZmZzZXQ7CS8qIG5leHQgb2Zmc2V0IHZhbHVlICovCisJeGZzX2RpcjJfZGF0YV9hb2ZmX3QJb2Zmc2V0OwkJLyogY3VycmVudCBvZmZzZXQgdmFsdWUgKi8KKwlpbnQJCQlvbGRfaXNpemU7CS8qIHByZXZpb3VzIGRpX3NpemUgKi8KKwl4ZnNfZGlyMl9zZl9lbnRyeV90CSpvbGRzZmVwOwkvKiBlbnRyeSBpbiBvcmlnaW5hbCBkaXIgKi8KKwl4ZnNfZGlyMl9zZl90CQkqb2xkc2ZwOwkvKiBvcmlnaW5hbCBzaG9ydGZvcm0gZGlyICovCisJeGZzX2RpcjJfc2ZfZW50cnlfdAkqc2ZlcDsJCS8qIGVudHJ5IGluIG5ldyBkaXIgKi8KKwl4ZnNfZGlyMl9zZl90CQkqc2ZwOwkJLyogbmV3IHNob3J0Zm9ybSBkaXIgKi8KKworCS8qCisJICogQ29weSB0aGUgb2xkIGRpcmVjdG9yeSB0byB0aGUgc3RhY2sgYnVmZmVyLgorCSAqLworCWRwID0gYXJncy0+ZHA7CisKKwlzZnAgPSAoeGZzX2RpcjJfc2ZfdCAqKWRwLT5pX2RmLmlmX3UxLmlmX2RhdGE7CisJb2xkX2lzaXplID0gKGludClkcC0+aV9kLmRpX3NpemU7CisJYnVmID0ga21lbV9hbGxvYyhvbGRfaXNpemUsIEtNX1NMRUVQKTsKKwlvbGRzZnAgPSAoeGZzX2RpcjJfc2ZfdCAqKWJ1ZjsKKwltZW1jcHkob2xkc2ZwLCBzZnAsIG9sZF9pc2l6ZSk7CisJLyoKKwkgKiBMb29wIG92ZXIgdGhlIG9sZCBkaXJlY3RvcnkgZmluZGluZyB0aGUgcGxhY2Ugd2UncmUgZ29pbmcKKwkgKiB0byBpbnNlcnQgdGhlIG5ldyBlbnRyeS4KKwkgKiBJZiBpdCdzIGdvaW5nIHRvIGVuZCB1cCBhdCB0aGUgZW5kIHRoZW4gb2xkc2ZlcCB3aWxsIHBvaW50IHRoZXJlLgorCSAqLworCWZvciAob2Zmc2V0ID0gWEZTX0RJUjJfREFUQV9GSVJTVF9PRkZTRVQsCisJICAgICAgb2xkc2ZlcCA9IFhGU19ESVIyX1NGX0ZJUlNURU5UUlkob2xkc2ZwKSwKKwkgICAgICBhZGRfZGF0YXNpemUgPSBYRlNfRElSMl9EQVRBX0VOVFNJWkUoYXJncy0+bmFtZWxlbiksCisJICAgICAgZW9mID0gKGNoYXIgKilvbGRzZmVwID09ICZidWZbb2xkX2lzaXplXTsKKwkgICAgICFlb2Y7CisJICAgICBvZmZzZXQgPSBuZXdfb2Zmc2V0ICsgWEZTX0RJUjJfREFUQV9FTlRTSVpFKG9sZHNmZXAtPm5hbWVsZW4pLAorCSAgICAgIG9sZHNmZXAgPSBYRlNfRElSMl9TRl9ORVhURU5UUlkob2xkc2ZwLCBvbGRzZmVwKSwKKwkgICAgICBlb2YgPSAoY2hhciAqKW9sZHNmZXAgPT0gJmJ1ZltvbGRfaXNpemVdKSB7CisJCW5ld19vZmZzZXQgPSBYRlNfRElSMl9TRl9HRVRfT0ZGU0VUKG9sZHNmZXApOworCQlpZiAob2Zmc2V0ICsgYWRkX2RhdGFzaXplIDw9IG5ld19vZmZzZXQpCisJCQlicmVhazsKKwl9CisJLyoKKwkgKiBHZXQgcmlkIG9mIHRoZSBvbGQgZGlyZWN0b3J5LCB0aGVuIGFsbG9jYXRlIHNwYWNlIGZvcgorCSAqIHRoZSBuZXcgb25lLiAgV2UgZG8gdGhpcyBzbyB4ZnNfaWRhdGFfcmVhbGxvYyB3b24ndCBjb3B5CisJICogdGhlIGRhdGEuCisJICovCisJeGZzX2lkYXRhX3JlYWxsb2MoZHAsIC1vbGRfaXNpemUsIFhGU19EQVRBX0ZPUkspOworCXhmc19pZGF0YV9yZWFsbG9jKGRwLCBuZXdfaXNpemUsIFhGU19EQVRBX0ZPUkspOworCS8qCisJICogUmVzZXQgdGhlIHBvaW50ZXIgc2luY2UgdGhlIGJ1ZmZlciB3YXMgcmVhbGxvY2F0ZWQuCisJICovCisJc2ZwID0gKHhmc19kaXIyX3NmX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOworCS8qCisJICogQ29weSB0aGUgZmlyc3QgcGFydCBvZiB0aGUgZGlyZWN0b3J5LCBpbmNsdWRpbmcgdGhlIGhlYWRlci4KKwkgKi8KKwluYnl0ZXMgPSAoaW50KSgoY2hhciAqKW9sZHNmZXAgLSAoY2hhciAqKW9sZHNmcCk7CisJbWVtY3B5KHNmcCwgb2xkc2ZwLCBuYnl0ZXMpOworCXNmZXAgPSAoeGZzX2RpcjJfc2ZfZW50cnlfdCAqKSgoY2hhciAqKXNmcCArIG5ieXRlcyk7CisJLyoKKwkgKiBGaWxsIGluIHRoZSBuZXcgZW50cnksIGFuZCB1cGRhdGUgdGhlIGhlYWRlciBjb3VudHMuCisJICovCisJc2ZlcC0+bmFtZWxlbiA9IGFyZ3MtPm5hbWVsZW47CisJWEZTX0RJUjJfU0ZfUFVUX09GRlNFVChzZmVwLCBvZmZzZXQpOworCW1lbWNweShzZmVwLT5uYW1lLCBhcmdzLT5uYW1lLCBzZmVwLT5uYW1lbGVuKTsKKwlYRlNfRElSMl9TRl9QVVRfSU5VTUJFUihzZnAsICZhcmdzLT5pbnVtYmVyLAorCQlYRlNfRElSMl9TRl9JTlVNQkVSUChzZmVwKSk7CisJc2ZwLT5oZHIuY291bnQrKzsKKyNpZiBYRlNfQklHX0lOVU1TCisJaWYgKGFyZ3MtPmludW1iZXIgPiBYRlNfRElSMl9NQVhfU0hPUlRfSU5VTSAmJiAhb2JqY2hhbmdlKQorCQlzZnAtPmhkci5pOGNvdW50Kys7CisjZW5kaWYKKwkvKgorCSAqIElmIHRoZXJlJ3MgbW9yZSBsZWZ0IHRvIGNvcHksIGRvIHRoYXQuCisJICovCisJaWYgKCFlb2YpIHsKKwkJc2ZlcCA9IFhGU19ESVIyX1NGX05FWFRFTlRSWShzZnAsIHNmZXApOworCQltZW1jcHkoc2ZlcCwgb2xkc2ZlcCwgb2xkX2lzaXplIC0gbmJ5dGVzKTsKKwl9CisJa21lbV9mcmVlKGJ1Ziwgb2xkX2lzaXplKTsKKwlkcC0+aV9kLmRpX3NpemUgPSBuZXdfaXNpemU7CisJeGZzX2RpcjJfc2ZfY2hlY2soYXJncyk7Cit9CisKKy8qCisgKiBEZWNpZGUgaWYgdGhlIG5ldyBlbnRyeSB3aWxsIGZpdCBhdCBhbGwuCisgKiBJZiBpdCB3aWxsIGZpdCwgcGljayBiZXR3ZWVuIGFkZGluZyB0aGUgbmV3IGVudHJ5IHRvIHRoZSBlbmQgKGVhc3kpCisgKiBvciBzb21ld2hlcmUgZWxzZSAoaGFyZCkuCisgKiBSZXR1cm4gMCAod29uJ3QgZml0KSwgMSAoZWFzeSksIDIgKGhhcmQpLgorICovCisvKkFSR1NVU0VEKi8KK3N0YXRpYyBpbnQJCQkJCS8qIHBpY2sgcmVzdWx0ICovCit4ZnNfZGlyMl9zZl9hZGRuYW1lX3BpY2soCisJeGZzX2RhX2FyZ3NfdAkJKmFyZ3MsCQkvKiBvcGVyYXRpb24gYXJndW1lbnRzICovCisJaW50CQkJb2JqY2hhbmdlLAkvKiBpbm9kZSAjIHNpemUgY2hhbmdlcyAqLworCXhmc19kaXIyX3NmX2VudHJ5X3QJKipzZmVwcCwJLyogb3V0KDEpOiBuZXcgZW50cnkgcHRyICovCisJeGZzX2RpcjJfZGF0YV9hb2ZmX3QJKm9mZnNldHApCS8qIG91dCgxKTogbmV3IG9mZnNldCAqLworeworCXhmc19pbm9kZV90CQkqZHA7CQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCisJaW50CQkJaG9sZWZpdDsJLyogZm91bmQgaG9sZSBpdCB3aWxsIGZpdCBpbiAqLworCWludAkJCWk7CQkvKiBlbnRyeSBudW1iZXIgKi8KKwl4ZnNfbW91bnRfdAkJKm1wOwkJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc19kaXIyX2RhdGFfYW9mZl90CW9mZnNldDsJCS8qIGRhdGEgYmxvY2sgb2Zmc2V0ICovCisJeGZzX2RpcjJfc2ZfZW50cnlfdAkqc2ZlcDsJCS8qIHNob3J0Zm9ybSBlbnRyeSAqLworCXhmc19kaXIyX3NmX3QJCSpzZnA7CQkvKiBzaG9ydGZvcm0gc3RydWN0dXJlICovCisJaW50CQkJc2l6ZTsJCS8qIGVudHJ5J3MgZGF0YSBzaXplICovCisJaW50CQkJdXNlZDsJCS8qIGRhdGEgYnl0ZXMgdXNlZCAqLworCisJZHAgPSBhcmdzLT5kcDsKKwltcCA9IGRwLT5pX21vdW50OworCisJc2ZwID0gKHhmc19kaXIyX3NmX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOworCXNpemUgPSBYRlNfRElSMl9EQVRBX0VOVFNJWkUoYXJncy0+bmFtZWxlbik7CisJb2Zmc2V0ID0gWEZTX0RJUjJfREFUQV9GSVJTVF9PRkZTRVQ7CisJc2ZlcCA9IFhGU19ESVIyX1NGX0ZJUlNURU5UUlkoc2ZwKTsKKwlob2xlZml0ID0gMDsKKwkvKgorCSAqIExvb3Agb3ZlciBzZiBlbnRyaWVzLgorCSAqIEtlZXAgdHJhY2sgb2YgZGF0YSBvZmZzZXQgYW5kIHdoZXRoZXIgd2UndmUgc2VlbiBhIHBsYWNlCisJICogdG8gaW5zZXJ0IHRoZSBuZXcgZW50cnkuCisJICovCisJZm9yIChpID0gMDsgaSA8IHNmcC0+aGRyLmNvdW50OyBpKyspIHsKKwkJaWYgKCFob2xlZml0KQorCQkJaG9sZWZpdCA9IG9mZnNldCArIHNpemUgPD0gWEZTX0RJUjJfU0ZfR0VUX09GRlNFVChzZmVwKTsKKwkJb2Zmc2V0ID0gWEZTX0RJUjJfU0ZfR0VUX09GRlNFVChzZmVwKSArCisJCQkgWEZTX0RJUjJfREFUQV9FTlRTSVpFKHNmZXAtPm5hbWVsZW4pOworCQlzZmVwID0gWEZTX0RJUjJfU0ZfTkVYVEVOVFJZKHNmcCwgc2ZlcCk7CisJfQorCS8qCisJICogQ2FsY3VsYXRlIGRhdGEgYnl0ZXMgdXNlZCBleGNsdWRpbmcgdGhlIG5ldyBlbnRyeSwgaWYgdGhpcworCSAqIHdhcyBhIGRhdGEgYmxvY2sgKGJsb2NrIGZvcm0gZGlyZWN0b3J5KS4KKwkgKi8KKwl1c2VkID0gb2Zmc2V0ICsKKwkgICAgICAgKHNmcC0+aGRyLmNvdW50ICsgMykgKiAodWludClzaXplb2YoeGZzX2RpcjJfbGVhZl9lbnRyeV90KSArCisJICAgICAgICh1aW50KXNpemVvZih4ZnNfZGlyMl9ibG9ja190YWlsX3QpOworCS8qCisJICogSWYgaXQgd29uJ3QgZml0IGluIGEgYmxvY2sgZm9ybSB0aGVuIHdlIGNhbid0IGluc2VydCBpdCwKKwkgKiB3ZSdsbCBnbyBiYWNrLCBjb252ZXJ0IHRvIGJsb2NrLCB0aGVuIHRyeSB0aGUgaW5zZXJ0IGFuZCBjb252ZXJ0CisJICogdG8gbGVhZi4KKwkgKi8KKwlpZiAodXNlZCArIChob2xlZml0ID8gMCA6IHNpemUpID4gbXAtPm1fZGlyYmxrc2l6ZSkKKwkJcmV0dXJuIDA7CisJLyoKKwkgKiBJZiBjaGFuZ2luZyB0aGUgaW5vZGUgbnVtYmVyIHNpemUsIGRvIGl0IHRoZSBoYXJkIHdheS4KKwkgKi8KKyNpZiBYRlNfQklHX0lOVU1TCisJaWYgKG9iamNoYW5nZSkgeworCQlyZXR1cm4gMjsKKwl9CisjZWxzZQorCUFTU0VSVChvYmpjaGFuZ2UgPT0gMCk7CisjZW5kaWYKKwkvKgorCSAqIElmIGl0IHdvbid0IGZpdCBhdCB0aGUgZW5kIHRoZW4gZG8gaXQgdGhlIGhhcmQgd2F5ICh1c2UgdGhlIGhvbGUpLgorCSAqLworCWlmICh1c2VkICsgc2l6ZSA+IG1wLT5tX2RpcmJsa3NpemUpCisJCXJldHVybiAyOworCS8qCisJICogRG8gaXQgdGhlIGVhc3kgd2F5LgorCSAqLworCSpzZmVwcCA9IHNmZXA7CisJKm9mZnNldHAgPSBvZmZzZXQ7CisJcmV0dXJuIDE7Cit9CisKKyNpZmRlZiBERUJVRworLyoKKyAqIENoZWNrIGNvbnNpc3RlbmN5IG9mIHNob3J0Zm9ybSBkaXJlY3RvcnksIGFzc2VydCBpZiBiYWQuCisgKi8KK3N0YXRpYyB2b2lkCit4ZnNfZGlyMl9zZl9jaGVjaygKKwl4ZnNfZGFfYXJnc190CQkqYXJncykJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KK3sKKwl4ZnNfaW5vZGVfdAkJKmRwOwkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLworCWludAkJCWk7CQkvKiBlbnRyeSBudW1iZXIgKi8KKwlpbnQJCQlpOGNvdW50OwkvKiBudW1iZXIgb2YgYmlnIGlub2RlI3MgKi8KKwl4ZnNfaW5vX3QJCWlubzsJCS8qIGVudHJ5IGlub2RlIG51bWJlciAqLworCWludAkJCW9mZnNldDsJCS8qIGRhdGEgb2Zmc2V0ICovCisJeGZzX2RpcjJfc2ZfZW50cnlfdAkqc2ZlcDsJCS8qIHNob3J0Zm9ybSBkaXIgZW50cnkgKi8KKwl4ZnNfZGlyMl9zZl90CQkqc2ZwOwkJLyogc2hvcnRmb3JtIHN0cnVjdHVyZSAqLworCisJZHAgPSBhcmdzLT5kcDsKKworCXNmcCA9ICh4ZnNfZGlyMl9zZl90ICopZHAtPmlfZGYuaWZfdTEuaWZfZGF0YTsKKwlvZmZzZXQgPSBYRlNfRElSMl9EQVRBX0ZJUlNUX09GRlNFVDsKKwlpbm8gPSBYRlNfRElSMl9TRl9HRVRfSU5VTUJFUihzZnAsICZzZnAtPmhkci5wYXJlbnQpOworCWk4Y291bnQgPSBpbm8gPiBYRlNfRElSMl9NQVhfU0hPUlRfSU5VTTsKKworCWZvciAoaSA9IDAsIHNmZXAgPSBYRlNfRElSMl9TRl9GSVJTVEVOVFJZKHNmcCk7CisJICAgICBpIDwgc2ZwLT5oZHIuY291bnQ7CisJICAgICBpKyssIHNmZXAgPSBYRlNfRElSMl9TRl9ORVhURU5UUlkoc2ZwLCBzZmVwKSkgeworCQlBU1NFUlQoWEZTX0RJUjJfU0ZfR0VUX09GRlNFVChzZmVwKSA+PSBvZmZzZXQpOworCQlpbm8gPSBYRlNfRElSMl9TRl9HRVRfSU5VTUJFUihzZnAsIFhGU19ESVIyX1NGX0lOVU1CRVJQKHNmZXApKTsKKwkJaThjb3VudCArPSBpbm8gPiBYRlNfRElSMl9NQVhfU0hPUlRfSU5VTTsKKwkJb2Zmc2V0ID0KKwkJCVhGU19ESVIyX1NGX0dFVF9PRkZTRVQoc2ZlcCkgKworCQkJWEZTX0RJUjJfREFUQV9FTlRTSVpFKHNmZXAtPm5hbWVsZW4pOworCX0KKwlBU1NFUlQoaThjb3VudCA9PSBzZnAtPmhkci5pOGNvdW50KTsKKwlBU1NFUlQoWEZTX0JJR19JTlVNUyB8fCBpOGNvdW50ID09IDApOworCUFTU0VSVCgoY2hhciAqKXNmZXAgLSAoY2hhciAqKXNmcCA9PSBkcC0+aV9kLmRpX3NpemUpOworCUFTU0VSVChvZmZzZXQgKworCSAgICAgICAoc2ZwLT5oZHIuY291bnQgKyAyKSAqICh1aW50KXNpemVvZih4ZnNfZGlyMl9sZWFmX2VudHJ5X3QpICsKKwkgICAgICAgKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2Jsb2NrX3RhaWxfdCkgPD0KKwkgICAgICAgZHAtPmlfbW91bnQtPm1fZGlyYmxrc2l6ZSk7Cit9CisjZW5kaWYJLyogREVCVUcgKi8KKworLyoKKyAqIENyZWF0ZSBhIG5ldyAoc2hvcnRmb3JtKSBkaXJlY3RvcnkuCisgKi8KK2ludAkJCQkJLyogZXJyb3IsIGFsd2F5cyAwICovCit4ZnNfZGlyMl9zZl9jcmVhdGUoCisJeGZzX2RhX2FyZ3NfdAkqYXJncywJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KKwl4ZnNfaW5vX3QJcGlubykJCS8qIHBhcmVudCBpbm9kZSBudW1iZXIgKi8KK3sKKwl4ZnNfaW5vZGVfdAkqZHA7CQkvKiBpbmNvcmUgZGlyZWN0b3J5IGlub2RlICovCisJaW50CQlpOGNvdW50OwkvKiBwYXJlbnQgaW5vZGUgaXMgYW4gOC1ieXRlIG51bWJlciAqLworCXhmc19kaXIyX3NmX3QJKnNmcDsJCS8qIHNob3J0Zm9ybSBzdHJ1Y3R1cmUgKi8KKwlpbnQJCXNpemU7CQkvKiBkaXJlY3Rvcnkgc2l6ZSAqLworCisJeGZzX2RpcjJfdHJhY2VfYXJnc19pKCJzZl9jcmVhdGUiLCBhcmdzLCBwaW5vKTsKKwlkcCA9IGFyZ3MtPmRwOworCisJQVNTRVJUKGRwICE9IE5VTEwpOworCUFTU0VSVChkcC0+aV9kLmRpX3NpemUgPT0gMCk7CisJLyoKKwkgKiBJZiBpdCdzIGN1cnJlbnRseSBhIHplcm8tbGVuZ3RoIGV4dGVudCBmaWxlLAorCSAqIGNvbnZlcnQgaXQgdG8gbG9jYWwgZm9ybWF0LgorCSAqLworCWlmIChkcC0+aV9kLmRpX2Zvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTKSB7CisJCWRwLT5pX2RmLmlmX2ZsYWdzICY9IH5YRlNfSUZFWFRFTlRTOwkvKiBqdXN0IGluIGNhc2UgKi8KKwkJZHAtPmlfZC5kaV9mb3JtYXQgPSBYRlNfRElOT0RFX0ZNVF9MT0NBTDsKKwkJeGZzX3RyYW5zX2xvZ19pbm9kZShhcmdzLT50cmFucywgZHAsIFhGU19JTE9HX0NPUkUpOworCQlkcC0+aV9kZi5pZl9mbGFncyB8PSBYRlNfSUZJTkxJTkU7CisJfQorCUFTU0VSVChkcC0+aV9kZi5pZl9mbGFncyAmIFhGU19JRklOTElORSk7CisJQVNTRVJUKGRwLT5pX2RmLmlmX2J5dGVzID09IDApOworCWk4Y291bnQgPSBwaW5vID4gWEZTX0RJUjJfTUFYX1NIT1JUX0lOVU07CisJc2l6ZSA9IFhGU19ESVIyX1NGX0hEUl9TSVpFKGk4Y291bnQpOworCS8qCisJICogTWFrZSBhIGJ1ZmZlciBmb3IgdGhlIGRhdGEuCisJICovCisJeGZzX2lkYXRhX3JlYWxsb2MoZHAsIHNpemUsIFhGU19EQVRBX0ZPUkspOworCS8qCisJICogRmlsbCBpbiB0aGUgaGVhZGVyLAorCSAqLworCXNmcCA9ICh4ZnNfZGlyMl9zZl90ICopZHAtPmlfZGYuaWZfdTEuaWZfZGF0YTsKKwlzZnAtPmhkci5pOGNvdW50ID0gaThjb3VudDsKKwkvKgorCSAqIE5vdyBjYW4gcHV0IGluIHRoZSBpbm9kZSBudW1iZXIsIHNpbmNlIGk4Y291bnQgaXMgc2V0LgorCSAqLworCVhGU19ESVIyX1NGX1BVVF9JTlVNQkVSKHNmcCwgJnBpbm8sICZzZnAtPmhkci5wYXJlbnQpOworCXNmcC0+aGRyLmNvdW50ID0gMDsKKwlkcC0+aV9kLmRpX3NpemUgPSBzaXplOworCXhmc19kaXIyX3NmX2NoZWNrKGFyZ3MpOworCXhmc190cmFuc19sb2dfaW5vZGUoYXJncy0+dHJhbnMsIGRwLCBYRlNfSUxPR19DT1JFIHwgWEZTX0lMT0dfRERBVEEpOworCXJldHVybiAwOworfQorCitpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2RpcjJfc2ZfZ2V0ZGVudHMoCisJeGZzX2lub2RlX3QJCSpkcCwJCS8qIGluY29yZSBkaXJlY3RvcnkgaW5vZGUgKi8KKwl1aW9fdAkJCSp1aW8sCQkvKiBjYWxsZXIncyBidWZmZXIgY29udHJvbCAqLworCWludAkJCSplb2ZwLAkJLyogZW9mIHJlYWNoZWQ/IChvdXQpICovCisJeGZzX2RpcmVudF90CQkqZGJwLAkJLyogY2FsbGVyJ3MgYnVmZmVyICovCisJeGZzX2RpcjJfcHV0X3QJCXB1dCkJCS8qIGFiaSdzIGZvcm1hdHRpbmcgZnVuY3Rpb24gKi8KK3sKKwlpbnQJCQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCWludAkJCWk7CQkvKiBzaG9ydGZvcm0gZW50cnkgbnVtYmVyICovCisJeGZzX21vdW50X3QJCSptcDsJCS8qIGZpbGVzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl4ZnNfZGlyMl9kYXRhcHRyX3QJb2ZmOwkJLyogY3VycmVudCBlbnRyeSdzIG9mZnNldCAqLworCXhmc19kaXIyX3B1dF9hcmdzX3QJcDsJCS8qIGFyZyBwYWNrYWdlIGZvciBwdXQgcnRuICovCisJeGZzX2RpcjJfc2ZfZW50cnlfdAkqc2ZlcDsJCS8qIHNob3J0Zm9ybSBkaXJlY3RvcnkgZW50cnkgKi8KKwl4ZnNfZGlyMl9zZl90CQkqc2ZwOwkJLyogc2hvcnRmb3JtIHN0cnVjdHVyZSAqLworCXhmc19vZmZfdAkJCWRpcl9vZmZzZXQ7CisKKwltcCA9IGRwLT5pX21vdW50OworCisJQVNTRVJUKGRwLT5pX2RmLmlmX2ZsYWdzICYgWEZTX0lGSU5MSU5FKTsKKwkvKgorCSAqIEdpdmUgdXAgaWYgdGhlIGRpcmVjdG9yeSBpcyB3YXkgdG9vIHNob3J0LgorCSAqLworCWlmIChkcC0+aV9kLmRpX3NpemUgPCBvZmZzZXRvZih4ZnNfZGlyMl9zZl9oZHJfdCwgcGFyZW50KSkgeworCQlBU1NFUlQoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJfQorCisJZGlyX29mZnNldCA9IHVpby0+dWlvX29mZnNldDsKKworCUFTU0VSVChkcC0+aV9kZi5pZl9ieXRlcyA9PSBkcC0+aV9kLmRpX3NpemUpOworCUFTU0VSVChkcC0+aV9kZi5pZl91MS5pZl9kYXRhICE9IE5VTEwpOworCisJc2ZwID0gKHhmc19kaXIyX3NmX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOworCisJQVNTRVJUKGRwLT5pX2QuZGlfc2l6ZSA+PSBYRlNfRElSMl9TRl9IRFJfU0laRShzZnAtPmhkci5pOGNvdW50KSk7CisKKwkvKgorCSAqIElmIHRoZSBibG9jayBudW1iZXIgaW4gdGhlIG9mZnNldCBpcyBvdXQgb2YgcmFuZ2UsIHdlJ3JlIGRvbmUuCisJICovCisJaWYgKFhGU19ESVIyX0RBVEFQVFJfVE9fREIobXAsIGRpcl9vZmZzZXQpID4gbXAtPm1fZGlyZGF0YWJsaykgeworCQkqZW9mcCA9IDE7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogU2V0IHVwIHB1dGFyZ3Mgc3RydWN0dXJlLgorCSAqLworCXAuZGJwID0gZGJwOworCXAucHV0ID0gcHV0OworCXAudWlvID0gdWlvOworCS8qCisJICogUHV0IC4gZW50cnkgdW5sZXNzIHdlJ3JlIHN0YXJ0aW5nIHBhc3QgaXQuCisJICovCisJaWYgKGRpcl9vZmZzZXQgPD0KKwkJICAgIFhGU19ESVIyX0RCX09GRl9UT19EQVRBUFRSKG1wLCBtcC0+bV9kaXJkYXRhYmxrLAorCQkJCQkgICAgICAgWEZTX0RJUjJfREFUQV9ET1RfT0ZGU0VUKSkgeworCQlwLmNvb2sgPSBYRlNfRElSMl9EQl9PRkZfVE9fREFUQVBUUihtcCwgMCwKKwkJCQkJCVhGU19ESVIyX0RBVEFfRE9URE9UX09GRlNFVCk7CisJCXAuaW5vID0gZHAtPmlfaW5vOworI2lmIFhGU19CSUdfSU5VTVMKKwkJcC5pbm8gKz0gbXAtPm1faW5vYWRkOworI2VuZGlmCisJCXAubmFtZSA9ICIuIjsKKwkJcC5uYW1lbGVuID0gMTsKKworCQllcnJvciA9IHAucHV0KCZwKTsKKworCQlpZiAoIXAuZG9uZSkgeworCQkJdWlvLT51aW9fb2Zmc2V0ID0KKwkJCQlYRlNfRElSMl9EQl9PRkZfVE9fREFUQVBUUihtcCwgbXAtPm1fZGlyZGF0YWJsaywKKwkJCQkJCVhGU19ESVIyX0RBVEFfRE9UX09GRlNFVCk7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwl9CisKKwkvKgorCSAqIFB1dCAuLiBlbnRyeSB1bmxlc3Mgd2UncmUgc3RhcnRpbmcgcGFzdCBpdC4KKwkgKi8KKwlpZiAoZGlyX29mZnNldCA8PQorCQkgICAgWEZTX0RJUjJfREJfT0ZGX1RPX0RBVEFQVFIobXAsIG1wLT5tX2RpcmRhdGFibGssCisJCQkJCSAgICAgICBYRlNfRElSMl9EQVRBX0RPVERPVF9PRkZTRVQpKSB7CisJCXAuY29vayA9IFhGU19ESVIyX0RCX09GRl9UT19EQVRBUFRSKG1wLCBtcC0+bV9kaXJkYXRhYmxrLAorCQkJCQkJWEZTX0RJUjJfREFUQV9GSVJTVF9PRkZTRVQpOworCQlwLmlubyA9IFhGU19ESVIyX1NGX0dFVF9JTlVNQkVSKHNmcCwgJnNmcC0+aGRyLnBhcmVudCk7CisjaWYgWEZTX0JJR19JTlVNUworCQlwLmlubyArPSBtcC0+bV9pbm9hZGQ7CisjZW5kaWYKKwkJcC5uYW1lID0gIi4uIjsKKwkJcC5uYW1lbGVuID0gMjsKKworCQllcnJvciA9IHAucHV0KCZwKTsKKworCQlpZiAoIXAuZG9uZSkgeworCQkJdWlvLT51aW9fb2Zmc2V0ID0KKwkJCQlYRlNfRElSMl9EQl9PRkZfVE9fREFUQVBUUihtcCwgbXAtPm1fZGlyZGF0YWJsaywKKwkJCQkJWEZTX0RJUjJfREFUQV9ET1RET1RfT0ZGU0VUKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCX0KKworCS8qCisJICogTG9vcCB3aGlsZSB0aGVyZSBhcmUgbW9yZSBlbnRyaWVzIGFuZCBwdXQnaW5nIHdvcmtzLgorCSAqLworCWZvciAoaSA9IDAsIHNmZXAgPSBYRlNfRElSMl9TRl9GSVJTVEVOVFJZKHNmcCk7CisJCSAgICAgaSA8IHNmcC0+aGRyLmNvdW50OworCQkJICAgICBpKyssIHNmZXAgPSBYRlNfRElSMl9TRl9ORVhURU5UUlkoc2ZwLCBzZmVwKSkgeworCisJCW9mZiA9IFhGU19ESVIyX0RCX09GRl9UT19EQVRBUFRSKG1wLCBtcC0+bV9kaXJkYXRhYmxrLAorCQkJCVhGU19ESVIyX1NGX0dFVF9PRkZTRVQoc2ZlcCkpOworCisJCWlmIChkaXJfb2Zmc2V0ID4gb2ZmKQorCQkJY29udGludWU7CisKKwkJcC5uYW1lbGVuID0gc2ZlcC0+bmFtZWxlbjsKKworCQlwLmNvb2sgPSBYRlNfRElSMl9EQl9PRkZfVE9fREFUQVBUUihtcCwgbXAtPm1fZGlyZGF0YWJsaywKKwkJCVhGU19ESVIyX1NGX0dFVF9PRkZTRVQoc2ZlcCkgKworCQkJWEZTX0RJUjJfREFUQV9FTlRTSVpFKHAubmFtZWxlbikpOworCisJCXAuaW5vID0gWEZTX0RJUjJfU0ZfR0VUX0lOVU1CRVIoc2ZwLCBYRlNfRElSMl9TRl9JTlVNQkVSUChzZmVwKSk7CisjaWYgWEZTX0JJR19JTlVNUworCQlwLmlubyArPSBtcC0+bV9pbm9hZGQ7CisjZW5kaWYKKwkJcC5uYW1lID0gKGNoYXIgKilzZmVwLT5uYW1lOworCisJCWVycm9yID0gcC5wdXQoJnApOworCisJCWlmICghcC5kb25lKSB7CisJCQl1aW8tPnVpb19vZmZzZXQgPSBvZmY7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwl9CisKKwkvKgorCSAqIFRoZXkgYWxsIGZpdC4KKwkgKi8KKwkqZW9mcCA9IDE7CisKKwl1aW8tPnVpb19vZmZzZXQgPQorCQlYRlNfRElSMl9EQl9PRkZfVE9fREFUQVBUUihtcCwgbXAtPm1fZGlyZGF0YWJsayArIDEsIDApOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBMb29rdXAgYW4gZW50cnkgaW4gYSBzaG9ydGZvcm0gZGlyZWN0b3J5LgorICogUmV0dXJucyBFRVhJU1QgaWYgZm91bmQsIEVOT0VOVCBpZiBub3QgZm91bmQuCisgKi8KK2ludAkJCQkJCS8qIGVycm9yICovCit4ZnNfZGlyMl9zZl9sb29rdXAoCisJeGZzX2RhX2FyZ3NfdAkJKmFyZ3MpCQkvKiBvcGVyYXRpb24gYXJndW1lbnRzICovCit7CisJeGZzX2lub2RlX3QJCSpkcDsJCS8qIGluY29yZSBkaXJlY3RvcnkgaW5vZGUgKi8KKwlpbnQJCQlpOwkJLyogZW50cnkgaW5kZXggKi8KKwl4ZnNfZGlyMl9zZl9lbnRyeV90CSpzZmVwOwkJLyogc2hvcnRmb3JtIGRpcmVjdG9yeSBlbnRyeSAqLworCXhmc19kaXIyX3NmX3QJCSpzZnA7CQkvKiBzaG9ydGZvcm0gc3RydWN0dXJlICovCisKKwl4ZnNfZGlyMl90cmFjZV9hcmdzKCJzZl9sb29rdXAiLCBhcmdzKTsKKwl4ZnNfZGlyMl9zZl9jaGVjayhhcmdzKTsKKwlkcCA9IGFyZ3MtPmRwOworCisJQVNTRVJUKGRwLT5pX2RmLmlmX2ZsYWdzICYgWEZTX0lGSU5MSU5FKTsKKwkvKgorCSAqIEJhaWwgb3V0IGlmIHRoZSBkaXJlY3RvcnkgaXMgd2F5IHRvbyBzaG9ydC4KKwkgKi8KKwlpZiAoZHAtPmlfZC5kaV9zaXplIDwgb2Zmc2V0b2YoeGZzX2RpcjJfc2ZfaGRyX3QsIHBhcmVudCkpIHsKKwkJQVNTRVJUKFhGU19GT1JDRURfU0hVVERPV04oZHAtPmlfbW91bnQpKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCX0KKwlBU1NFUlQoZHAtPmlfZGYuaWZfYnl0ZXMgPT0gZHAtPmlfZC5kaV9zaXplKTsKKwlBU1NFUlQoZHAtPmlfZGYuaWZfdTEuaWZfZGF0YSAhPSBOVUxMKTsKKwlzZnAgPSAoeGZzX2RpcjJfc2ZfdCAqKWRwLT5pX2RmLmlmX3UxLmlmX2RhdGE7CisJQVNTRVJUKGRwLT5pX2QuZGlfc2l6ZSA+PSBYRlNfRElSMl9TRl9IRFJfU0laRShzZnAtPmhkci5pOGNvdW50KSk7CisJLyoKKwkgKiBTcGVjaWFsIGNhc2UgZm9yIC4KKwkgKi8KKwlpZiAoYXJncy0+bmFtZWxlbiA9PSAxICYmIGFyZ3MtPm5hbWVbMF0gPT0gJy4nKSB7CisJCWFyZ3MtPmludW1iZXIgPSBkcC0+aV9pbm87CisJCXJldHVybiBYRlNfRVJST1IoRUVYSVNUKTsKKwl9CisJLyoKKwkgKiBTcGVjaWFsIGNhc2UgZm9yIC4uCisJICovCisJaWYgKGFyZ3MtPm5hbWVsZW4gPT0gMiAmJgorCSAgICBhcmdzLT5uYW1lWzBdID09ICcuJyAmJiBhcmdzLT5uYW1lWzFdID09ICcuJykgeworCQlhcmdzLT5pbnVtYmVyID0gWEZTX0RJUjJfU0ZfR0VUX0lOVU1CRVIoc2ZwLCAmc2ZwLT5oZHIucGFyZW50KTsKKwkJcmV0dXJuIFhGU19FUlJPUihFRVhJU1QpOworCX0KKwkvKgorCSAqIExvb3Agb3ZlciBhbGwgdGhlIGVudHJpZXMgdHJ5aW5nIHRvIG1hdGNoIG91cnMuCisJICovCisJZm9yIChpID0gMCwgc2ZlcCA9IFhGU19ESVIyX1NGX0ZJUlNURU5UUlkoc2ZwKTsKKwkgICAgIGkgPCBzZnAtPmhkci5jb3VudDsKKwkgICAgIGkrKywgc2ZlcCA9IFhGU19ESVIyX1NGX05FWFRFTlRSWShzZnAsIHNmZXApKSB7CisJCWlmIChzZmVwLT5uYW1lbGVuID09IGFyZ3MtPm5hbWVsZW4gJiYKKwkJICAgIHNmZXAtPm5hbWVbMF0gPT0gYXJncy0+bmFtZVswXSAmJgorCQkgICAgbWVtY21wKGFyZ3MtPm5hbWUsIHNmZXAtPm5hbWUsIGFyZ3MtPm5hbWVsZW4pID09IDApIHsKKwkJCWFyZ3MtPmludW1iZXIgPQorCQkJCVhGU19ESVIyX1NGX0dFVF9JTlVNQkVSKHNmcCwKKwkJCQkJWEZTX0RJUjJfU0ZfSU5VTUJFUlAoc2ZlcCkpOworCQkJcmV0dXJuIFhGU19FUlJPUihFRVhJU1QpOworCQl9CisJfQorCS8qCisJICogRGlkbid0IGZpbmQgaXQuCisJICovCisJQVNTRVJUKGFyZ3MtPm9rbm9lbnQpOworCXJldHVybiBYRlNfRVJST1IoRU5PRU5UKTsKK30KKworLyoKKyAqIFJlbW92ZSBhbiBlbnRyeSBmcm9tIGEgc2hvcnRmb3JtIGRpcmVjdG9yeS4KKyAqLworaW50CQkJCQkJLyogZXJyb3IgKi8KK3hmc19kaXIyX3NmX3JlbW92ZW5hbWUoCisJeGZzX2RhX2FyZ3NfdAkJKmFyZ3MpCit7CisJaW50CQkJYnl0ZW9mZjsJLyogb2Zmc2V0IG9mIHJlbW92ZWQgZW50cnkgKi8KKwl4ZnNfaW5vZGVfdAkJKmRwOwkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLworCWludAkJCWVudHNpemU7CS8qIHRoaXMgZW50cnkncyBzaXplICovCisJaW50CQkJaTsJCS8qIHNob3J0Zm9ybSBlbnRyeSBpbmRleCAqLworCWludAkJCW5ld3NpemU7CS8qIG5ldyBpbm9kZSBzaXplICovCisJaW50CQkJb2xkc2l6ZTsJLyogb2xkIGlub2RlIHNpemUgKi8KKwl4ZnNfZGlyMl9zZl9lbnRyeV90CSpzZmVwOwkJLyogc2hvcnRmb3JtIGRpcmVjdG9yeSBlbnRyeSAqLworCXhmc19kaXIyX3NmX3QJCSpzZnA7CQkvKiBzaG9ydGZvcm0gc3RydWN0dXJlICovCisKKwl4ZnNfZGlyMl90cmFjZV9hcmdzKCJzZl9yZW1vdmVuYW1lIiwgYXJncyk7CisJZHAgPSBhcmdzLT5kcDsKKworCUFTU0VSVChkcC0+aV9kZi5pZl9mbGFncyAmIFhGU19JRklOTElORSk7CisJb2xkc2l6ZSA9IChpbnQpZHAtPmlfZC5kaV9zaXplOworCS8qCisJICogQmFpbCBvdXQgaWYgdGhlIGRpcmVjdG9yeSBpcyB3YXkgdG9vIHNob3J0LgorCSAqLworCWlmIChvbGRzaXplIDwgb2Zmc2V0b2YoeGZzX2RpcjJfc2ZfaGRyX3QsIHBhcmVudCkpIHsKKwkJQVNTRVJUKFhGU19GT1JDRURfU0hVVERPV04oZHAtPmlfbW91bnQpKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCX0KKwlBU1NFUlQoZHAtPmlfZGYuaWZfYnl0ZXMgPT0gb2xkc2l6ZSk7CisJQVNTRVJUKGRwLT5pX2RmLmlmX3UxLmlmX2RhdGEgIT0gTlVMTCk7CisJc2ZwID0gKHhmc19kaXIyX3NmX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOworCUFTU0VSVChvbGRzaXplID49IFhGU19ESVIyX1NGX0hEUl9TSVpFKHNmcC0+aGRyLmk4Y291bnQpKTsKKwkvKgorCSAqIExvb3Agb3ZlciB0aGUgb2xkIGRpcmVjdG9yeSBlbnRyaWVzLgorCSAqIEZpbmQgdGhlIG9uZSB3ZSdyZSBkZWxldGluZy4KKwkgKi8KKwlmb3IgKGkgPSAwLCBzZmVwID0gWEZTX0RJUjJfU0ZfRklSU1RFTlRSWShzZnApOworCSAgICAgaSA8IHNmcC0+aGRyLmNvdW50OworCSAgICAgaSsrLCBzZmVwID0gWEZTX0RJUjJfU0ZfTkVYVEVOVFJZKHNmcCwgc2ZlcCkpIHsKKwkJaWYgKHNmZXAtPm5hbWVsZW4gPT0gYXJncy0+bmFtZWxlbiAmJgorCQkgICAgc2ZlcC0+bmFtZVswXSA9PSBhcmdzLT5uYW1lWzBdICYmCisJCSAgICBtZW1jbXAoc2ZlcC0+bmFtZSwgYXJncy0+bmFtZSwgYXJncy0+bmFtZWxlbikgPT0gMCkgeworCQkJQVNTRVJUKFhGU19ESVIyX1NGX0dFVF9JTlVNQkVSKHNmcCwKKwkJCQkJWEZTX0RJUjJfU0ZfSU5VTUJFUlAoc2ZlcCkpID09CisJCQkJYXJncy0+aW51bWJlcik7CisJCQlicmVhazsKKwkJfQorCX0KKwkvKgorCSAqIERpZG4ndCBmaW5kIGl0LgorCSAqLworCWlmIChpID09IHNmcC0+aGRyLmNvdW50KSB7CisJCXJldHVybiBYRlNfRVJST1IoRU5PRU5UKTsKKwl9CisJLyoKKwkgKiBDYWxjdWxhdGUgc2l6ZXMuCisJICovCisJYnl0ZW9mZiA9IChpbnQpKChjaGFyICopc2ZlcCAtIChjaGFyICopc2ZwKTsKKwllbnRzaXplID0gWEZTX0RJUjJfU0ZfRU5UU0laRV9CWU5BTUUoc2ZwLCBhcmdzLT5uYW1lbGVuKTsKKwluZXdzaXplID0gb2xkc2l6ZSAtIGVudHNpemU7CisJLyoKKwkgKiBDb3B5IHRoZSBwYXJ0IGlmIGFueSBhZnRlciB0aGUgcmVtb3ZlZCBlbnRyeSwgc2xpZGluZyBpdCBkb3duLgorCSAqLworCWlmIChieXRlb2ZmICsgZW50c2l6ZSA8IG9sZHNpemUpCisJCW1lbW1vdmUoKGNoYXIgKilzZnAgKyBieXRlb2ZmLCAoY2hhciAqKXNmcCArIGJ5dGVvZmYgKyBlbnRzaXplLAorCQkJb2xkc2l6ZSAtIChieXRlb2ZmICsgZW50c2l6ZSkpOworCS8qCisJICogRml4IHVwIHRoZSBoZWFkZXIgYW5kIGZpbGUgc2l6ZS4KKwkgKi8KKwlzZnAtPmhkci5jb3VudC0tOworCWRwLT5pX2QuZGlfc2l6ZSA9IG5ld3NpemU7CisJLyoKKwkgKiBSZWFsbG9jYXRlLCBtYWtpbmcgaXQgc21hbGxlci4KKwkgKi8KKwl4ZnNfaWRhdGFfcmVhbGxvYyhkcCwgbmV3c2l6ZSAtIG9sZHNpemUsIFhGU19EQVRBX0ZPUkspOworCXNmcCA9ICh4ZnNfZGlyMl9zZl90ICopZHAtPmlfZGYuaWZfdTEuaWZfZGF0YTsKKyNpZiBYRlNfQklHX0lOVU1TCisJLyoKKwkgKiBBcmUgd2UgY2hhbmdpbmcgaW5vZGUgbnVtYmVyIHNpemU/CisJICovCisJaWYgKGFyZ3MtPmludW1iZXIgPiBYRlNfRElSMl9NQVhfU0hPUlRfSU5VTSkgeworCQlpZiAoc2ZwLT5oZHIuaThjb3VudCA9PSAxKQorCQkJeGZzX2RpcjJfc2ZfdG9pbm80KGFyZ3MpOworCQllbHNlCisJCQlzZnAtPmhkci5pOGNvdW50LS07CisJfQorI2VuZGlmCisJeGZzX2RpcjJfc2ZfY2hlY2soYXJncyk7CisJeGZzX3RyYW5zX2xvZ19pbm9kZShhcmdzLT50cmFucywgZHAsIFhGU19JTE9HX0NPUkUgfCBYRlNfSUxPR19EREFUQSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXBsYWNlIHRoZSBpbm9kZSBudW1iZXIgb2YgYW4gZW50cnkgaW4gYSBzaG9ydGZvcm0gZGlyZWN0b3J5LgorICovCitpbnQJCQkJCQkvKiBlcnJvciAqLworeGZzX2RpcjJfc2ZfcmVwbGFjZSgKKwl4ZnNfZGFfYXJnc190CQkqYXJncykJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KK3sKKwl4ZnNfaW5vZGVfdAkJKmRwOwkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLworCWludAkJCWk7CQkvKiBlbnRyeSBpbmRleCAqLworI2lmIFhGU19CSUdfSU5VTVMgfHwgZGVmaW5lZChERUJVRykKKwl4ZnNfaW5vX3QJCWlubz0wOwkJLyogZW50cnkgb2xkIGlub2RlIG51bWJlciAqLworI2VuZGlmCisjaWYgWEZTX0JJR19JTlVNUworCWludAkJCWk4ZWxldmF0ZWQ7CS8qIHNmX3RvaW5vOCBzZXQgaThjb3VudD0xICovCisjZW5kaWYKKwl4ZnNfZGlyMl9zZl9lbnRyeV90CSpzZmVwOwkJLyogc2hvcnRmb3JtIGRpcmVjdG9yeSBlbnRyeSAqLworCXhmc19kaXIyX3NmX3QJCSpzZnA7CQkvKiBzaG9ydGZvcm0gc3RydWN0dXJlICovCisKKwl4ZnNfZGlyMl90cmFjZV9hcmdzKCJzZl9yZXBsYWNlIiwgYXJncyk7CisJZHAgPSBhcmdzLT5kcDsKKworCUFTU0VSVChkcC0+aV9kZi5pZl9mbGFncyAmIFhGU19JRklOTElORSk7CisJLyoKKwkgKiBCYWlsIG91dCBpZiB0aGUgc2hvcnRmb3JtIGRpcmVjdG9yeSBpcyB3YXkgdG9vIHNtYWxsLgorCSAqLworCWlmIChkcC0+aV9kLmRpX3NpemUgPCBvZmZzZXRvZih4ZnNfZGlyMl9zZl9oZHJfdCwgcGFyZW50KSkgeworCQlBU1NFUlQoWEZTX0ZPUkNFRF9TSFVURE9XTihkcC0+aV9tb3VudCkpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJfQorCUFTU0VSVChkcC0+aV9kZi5pZl9ieXRlcyA9PSBkcC0+aV9kLmRpX3NpemUpOworCUFTU0VSVChkcC0+aV9kZi5pZl91MS5pZl9kYXRhICE9IE5VTEwpOworCXNmcCA9ICh4ZnNfZGlyMl9zZl90ICopZHAtPmlfZGYuaWZfdTEuaWZfZGF0YTsKKwlBU1NFUlQoZHAtPmlfZC5kaV9zaXplID49IFhGU19ESVIyX1NGX0hEUl9TSVpFKHNmcC0+aGRyLmk4Y291bnQpKTsKKyNpZiBYRlNfQklHX0lOVU1TCisJLyoKKwkgKiBOZXcgaW5vZGUgbnVtYmVyIGlzIGxhcmdlLCBhbmQgbmVlZCB0byBjb252ZXJ0IHRvIDgtYnl0ZSBpbm9kZXMuCisJICovCisJaWYgKGFyZ3MtPmludW1iZXIgPiBYRlNfRElSMl9NQVhfU0hPUlRfSU5VTSAmJiBzZnAtPmhkci5pOGNvdW50ID09IDApIHsKKwkJaW50CWVycm9yOwkJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCQlpbnQJbmV3c2l6ZTsJCS8qIG5ldyBpbm9kZSBzaXplICovCisKKwkJbmV3c2l6ZSA9CisJCQlkcC0+aV9kZi5pZl9ieXRlcyArCisJCQkoc2ZwLT5oZHIuY291bnQgKyAxKSAqCisJCQkoKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2lubzhfdCkgLQorCQkJICh1aW50KXNpemVvZih4ZnNfZGlyMl9pbm80X3QpKTsKKwkJLyoKKwkJICogV29uJ3QgZml0IGFzIHNob3J0Zm9ybSwgY29udmVydCB0byBibG9jayB0aGVuIGRvIHJlcGxhY2UuCisJCSAqLworCQlpZiAobmV3c2l6ZSA+IFhGU19JRk9SS19EU0laRShkcCkpIHsKKwkJCWVycm9yID0geGZzX2RpcjJfc2ZfdG9fYmxvY2soYXJncyk7CisJCQlpZiAoZXJyb3IpIHsKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQl9CisJCQlyZXR1cm4geGZzX2RpcjJfYmxvY2tfcmVwbGFjZShhcmdzKTsKKwkJfQorCQkvKgorCQkgKiBTdGlsbCBmaXRzLCBjb252ZXJ0IHRvIDgtYnl0ZSBub3cuCisJCSAqLworCQl4ZnNfZGlyMl9zZl90b2lubzgoYXJncyk7CisJCWk4ZWxldmF0ZWQgPSAxOworCQlzZnAgPSAoeGZzX2RpcjJfc2ZfdCAqKWRwLT5pX2RmLmlmX3UxLmlmX2RhdGE7CisJfSBlbHNlCisJCWk4ZWxldmF0ZWQgPSAwOworI2VuZGlmCisJQVNTRVJUKGFyZ3MtPm5hbWVsZW4gIT0gMSB8fCBhcmdzLT5uYW1lWzBdICE9ICcuJyk7CisJLyoKKwkgKiBSZXBsYWNlIC4uJ3MgZW50cnkuCisJICovCisJaWYgKGFyZ3MtPm5hbWVsZW4gPT0gMiAmJgorCSAgICBhcmdzLT5uYW1lWzBdID09ICcuJyAmJiBhcmdzLT5uYW1lWzFdID09ICcuJykgeworI2lmIFhGU19CSUdfSU5VTVMgfHwgZGVmaW5lZChERUJVRykKKwkJaW5vID0gWEZTX0RJUjJfU0ZfR0VUX0lOVU1CRVIoc2ZwLCAmc2ZwLT5oZHIucGFyZW50KTsKKwkJQVNTRVJUKGFyZ3MtPmludW1iZXIgIT0gaW5vKTsKKyNlbmRpZgorCQlYRlNfRElSMl9TRl9QVVRfSU5VTUJFUihzZnAsICZhcmdzLT5pbnVtYmVyLCAmc2ZwLT5oZHIucGFyZW50KTsKKwl9CisJLyoKKwkgKiBOb3JtYWwgZW50cnksIGxvb2sgZm9yIHRoZSBuYW1lLgorCSAqLworCWVsc2UgeworCQlmb3IgKGkgPSAwLCBzZmVwID0gWEZTX0RJUjJfU0ZfRklSU1RFTlRSWShzZnApOworCQkgICAgIGkgPCBzZnAtPmhkci5jb3VudDsKKwkJICAgICBpKyssIHNmZXAgPSBYRlNfRElSMl9TRl9ORVhURU5UUlkoc2ZwLCBzZmVwKSkgeworCQkJaWYgKHNmZXAtPm5hbWVsZW4gPT0gYXJncy0+bmFtZWxlbiAmJgorCQkJICAgIHNmZXAtPm5hbWVbMF0gPT0gYXJncy0+bmFtZVswXSAmJgorCQkJICAgIG1lbWNtcChhcmdzLT5uYW1lLCBzZmVwLT5uYW1lLCBhcmdzLT5uYW1lbGVuKSA9PSAwKSB7CisjaWYgWEZTX0JJR19JTlVNUyB8fCBkZWZpbmVkKERFQlVHKQorCQkJCWlubyA9IFhGU19ESVIyX1NGX0dFVF9JTlVNQkVSKHNmcCwKKwkJCQkJWEZTX0RJUjJfU0ZfSU5VTUJFUlAoc2ZlcCkpOworCQkJCUFTU0VSVChhcmdzLT5pbnVtYmVyICE9IGlubyk7CisjZW5kaWYKKwkJCQlYRlNfRElSMl9TRl9QVVRfSU5VTUJFUihzZnAsICZhcmdzLT5pbnVtYmVyLAorCQkJCQlYRlNfRElSMl9TRl9JTlVNQkVSUChzZmVwKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJLyoKKwkJICogRGlkbid0IGZpbmQgaXQuCisJCSAqLworCQlpZiAoaSA9PSBzZnAtPmhkci5jb3VudCkgeworCQkJQVNTRVJUKGFyZ3MtPm9rbm9lbnQpOworI2lmIFhGU19CSUdfSU5VTVMKKwkJCWlmIChpOGVsZXZhdGVkKQorCQkJCXhmc19kaXIyX3NmX3RvaW5vNChhcmdzKTsKKyNlbmRpZgorCQkJcmV0dXJuIFhGU19FUlJPUihFTk9FTlQpOworCQl9CisJfQorI2lmIFhGU19CSUdfSU5VTVMKKwkvKgorCSAqIFNlZSBpZiB0aGUgb2xkIG51bWJlciB3YXMgbGFyZ2UsIHRoZSBuZXcgbnVtYmVyIGlzIHNtYWxsLgorCSAqLworCWlmIChpbm8gPiBYRlNfRElSMl9NQVhfU0hPUlRfSU5VTSAmJgorCSAgICBhcmdzLT5pbnVtYmVyIDw9IFhGU19ESVIyX01BWF9TSE9SVF9JTlVNKSB7CisJCS8qCisJCSAqIEFuZCB0aGUgb2xkIGNvdW50IHdhcyBvbmUsIHNvIG5lZWQgdG8gY29udmVydCB0byBzbWFsbC4KKwkJICovCisJCWlmIChzZnAtPmhkci5pOGNvdW50ID09IDEpCisJCQl4ZnNfZGlyMl9zZl90b2lubzQoYXJncyk7CisJCWVsc2UKKwkJCXNmcC0+aGRyLmk4Y291bnQtLTsKKwl9CisJLyoKKwkgKiBTZWUgaWYgdGhlIG9sZCBudW1iZXIgd2FzIHNtYWxsLCB0aGUgbmV3IG51bWJlciBpcyBsYXJnZS4KKwkgKi8KKwlpZiAoaW5vIDw9IFhGU19ESVIyX01BWF9TSE9SVF9JTlVNICYmCisJICAgIGFyZ3MtPmludW1iZXIgPiBYRlNfRElSMl9NQVhfU0hPUlRfSU5VTSkgeworCQkvKgorCQkgKiBhZGQgdG8gdGhlIGk4Y291bnQgdW5sZXNzIHdlIGp1c3QgY29udmVydGVkIHRvIDgtYnl0ZQorCQkgKiBpbm9kZXMgKHdoaWNoIGRvZXMgYW4gaW1wbGllZCBpOGNvdW50ID0gMSkKKwkJICovCisJCUFTU0VSVChzZnAtPmhkci5pOGNvdW50ICE9IDApOworCQlpZiAoIWk4ZWxldmF0ZWQpCisJCQlzZnAtPmhkci5pOGNvdW50Kys7CisJfQorI2VuZGlmCisJeGZzX2RpcjJfc2ZfY2hlY2soYXJncyk7CisJeGZzX3RyYW5zX2xvZ19pbm9kZShhcmdzLT50cmFucywgZHAsIFhGU19JTE9HX0REQVRBKTsKKwlyZXR1cm4gMDsKK30KKworI2lmIFhGU19CSUdfSU5VTVMKKy8qCisgKiBDb252ZXJ0IGZyb20gOC1ieXRlIGlub2RlIG51bWJlcnMgdG8gNC1ieXRlIGlub2RlIG51bWJlcnMuCisgKiBUaGUgbGFzdCA4LWJ5dGUgaW5vZGUgbnVtYmVyIGlzIGdvbmUsIGJ1dCB0aGUgY291bnQgaXMgc3RpbGwgMS4KKyAqLworc3RhdGljIHZvaWQKK3hmc19kaXIyX3NmX3RvaW5vNCgKKwl4ZnNfZGFfYXJnc190CQkqYXJncykJCS8qIG9wZXJhdGlvbiBhcmd1bWVudHMgKi8KK3sKKwljaGFyCQkJKmJ1ZjsJCS8qIG9sZCBkaXIncyBidWZmZXIgKi8KKwl4ZnNfaW5vZGVfdAkJKmRwOwkJLyogaW5jb3JlIGRpcmVjdG9yeSBpbm9kZSAqLworCWludAkJCWk7CQkvKiBlbnRyeSBpbmRleCAqLworCXhmc19pbm9fdAkJaW5vOwkJLyogZW50cnkgaW5vZGUgbnVtYmVyICovCisJaW50CQkJbmV3c2l6ZTsJLyogbmV3IGlub2RlIHNpemUgKi8KKwl4ZnNfZGlyMl9zZl9lbnRyeV90CSpvbGRzZmVwOwkvKiBvbGQgc2YgZW50cnkgKi8KKwl4ZnNfZGlyMl9zZl90CQkqb2xkc2ZwOwkvKiBvbGQgc2YgZGlyZWN0b3J5ICovCisJaW50CQkJb2xkc2l6ZTsJLyogb2xkIGlub2RlIHNpemUgKi8KKwl4ZnNfZGlyMl9zZl9lbnRyeV90CSpzZmVwOwkJLyogbmV3IHNmIGVudHJ5ICovCisJeGZzX2RpcjJfc2ZfdAkJKnNmcDsJCS8qIG5ldyBzZiBkaXJlY3RvcnkgKi8KKworCXhmc19kaXIyX3RyYWNlX2FyZ3MoInNmX3RvaW5vNCIsIGFyZ3MpOworCWRwID0gYXJncy0+ZHA7CisKKwkvKgorCSAqIENvcHkgdGhlIG9sZCBkaXJlY3RvcnkgdG8gdGhlIGJ1ZmZlci4KKwkgKiBUaGVuIG51a2UgaXQgZnJvbSB0aGUgaW5vZGUsIGFuZCBhZGQgdGhlIG5ldyBidWZmZXIgdG8gdGhlIGlub2RlLgorCSAqIERvbid0IHdhbnQgeGZzX2lkYXRhX3JlYWxsb2MgY29weWluZyB0aGUgZGF0YSBoZXJlLgorCSAqLworCW9sZHNpemUgPSBkcC0+aV9kZi5pZl9ieXRlczsKKwlidWYgPSBrbWVtX2FsbG9jKG9sZHNpemUsIEtNX1NMRUVQKTsKKwlvbGRzZnAgPSAoeGZzX2RpcjJfc2ZfdCAqKWRwLT5pX2RmLmlmX3UxLmlmX2RhdGE7CisJQVNTRVJUKG9sZHNmcC0+aGRyLmk4Y291bnQgPT0gMSk7CisJbWVtY3B5KGJ1Ziwgb2xkc2ZwLCBvbGRzaXplKTsKKwkvKgorCSAqIENvbXB1dGUgdGhlIG5ldyBpbm9kZSBzaXplLgorCSAqLworCW5ld3NpemUgPQorCQlvbGRzaXplIC0KKwkJKG9sZHNmcC0+aGRyLmNvdW50ICsgMSkgKgorCQkoKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2lubzhfdCkgLSAodWludClzaXplb2YoeGZzX2RpcjJfaW5vNF90KSk7CisJeGZzX2lkYXRhX3JlYWxsb2MoZHAsIC1vbGRzaXplLCBYRlNfREFUQV9GT1JLKTsKKwl4ZnNfaWRhdGFfcmVhbGxvYyhkcCwgbmV3c2l6ZSwgWEZTX0RBVEFfRk9SSyk7CisJLyoKKwkgKiBSZXNldCBvdXIgcG9pbnRlcnMsIHRoZSBkYXRhIGhhcyBtb3ZlZC4KKwkgKi8KKwlvbGRzZnAgPSAoeGZzX2RpcjJfc2ZfdCAqKWJ1ZjsKKwlzZnAgPSAoeGZzX2RpcjJfc2ZfdCAqKWRwLT5pX2RmLmlmX3UxLmlmX2RhdGE7CisJLyoKKwkgKiBGaWxsIGluIHRoZSBuZXcgaGVhZGVyLgorCSAqLworCXNmcC0+aGRyLmNvdW50ID0gb2xkc2ZwLT5oZHIuY291bnQ7CisJc2ZwLT5oZHIuaThjb3VudCA9IDA7CisJaW5vID0gWEZTX0RJUjJfU0ZfR0VUX0lOVU1CRVIob2xkc2ZwLCAmb2xkc2ZwLT5oZHIucGFyZW50KTsKKwlYRlNfRElSMl9TRl9QVVRfSU5VTUJFUihzZnAsICZpbm8sICZzZnAtPmhkci5wYXJlbnQpOworCS8qCisJICogQ29weSB0aGUgZW50cmllcyBmaWVsZCBieSBmaWVsZC4KKwkgKi8KKwlmb3IgKGkgPSAwLCBzZmVwID0gWEZTX0RJUjJfU0ZfRklSU1RFTlRSWShzZnApLAorCQkgICAgb2xkc2ZlcCA9IFhGU19ESVIyX1NGX0ZJUlNURU5UUlkob2xkc2ZwKTsKKwkgICAgIGkgPCBzZnAtPmhkci5jb3VudDsKKwkgICAgIGkrKywgc2ZlcCA9IFhGU19ESVIyX1NGX05FWFRFTlRSWShzZnAsIHNmZXApLAorCQkgIG9sZHNmZXAgPSBYRlNfRElSMl9TRl9ORVhURU5UUlkob2xkc2ZwLCBvbGRzZmVwKSkgeworCQlzZmVwLT5uYW1lbGVuID0gb2xkc2ZlcC0+bmFtZWxlbjsKKwkJc2ZlcC0+b2Zmc2V0ID0gb2xkc2ZlcC0+b2Zmc2V0OworCQltZW1jcHkoc2ZlcC0+bmFtZSwgb2xkc2ZlcC0+bmFtZSwgc2ZlcC0+bmFtZWxlbik7CisJCWlubyA9IFhGU19ESVIyX1NGX0dFVF9JTlVNQkVSKG9sZHNmcCwKKwkJCVhGU19ESVIyX1NGX0lOVU1CRVJQKG9sZHNmZXApKTsKKwkJWEZTX0RJUjJfU0ZfUFVUX0lOVU1CRVIoc2ZwLCAmaW5vLCBYRlNfRElSMl9TRl9JTlVNQkVSUChzZmVwKSk7CisJfQorCS8qCisJICogQ2xlYW4gdXAgdGhlIGlub2RlLgorCSAqLworCWttZW1fZnJlZShidWYsIG9sZHNpemUpOworCWRwLT5pX2QuZGlfc2l6ZSA9IG5ld3NpemU7CisJeGZzX3RyYW5zX2xvZ19pbm9kZShhcmdzLT50cmFucywgZHAsIFhGU19JTE9HX0NPUkUgfCBYRlNfSUxPR19EREFUQSk7Cit9CisKKy8qCisgKiBDb252ZXJ0IGZyb20gNC1ieXRlIGlub2RlIG51bWJlcnMgdG8gOC1ieXRlIGlub2RlIG51bWJlcnMuCisgKiBUaGUgbmV3IDgtYnl0ZSBpbm9kZSBudW1iZXIgaXMgbm90IHRoZXJlIHlldCwgd2UgbGVhdmUgd2l0aCB0aGUKKyAqIGNvdW50IDEgYnV0IG5vIGNvcnJlc3BvbmRpbmcgZW50cnkuCisgKi8KK3N0YXRpYyB2b2lkCit4ZnNfZGlyMl9zZl90b2lubzgoCisJeGZzX2RhX2FyZ3NfdAkJKmFyZ3MpCQkvKiBvcGVyYXRpb24gYXJndW1lbnRzICovCit7CisJY2hhcgkJCSpidWY7CQkvKiBvbGQgZGlyJ3MgYnVmZmVyICovCisJeGZzX2lub2RlX3QJCSpkcDsJCS8qIGluY29yZSBkaXJlY3RvcnkgaW5vZGUgKi8KKwlpbnQJCQlpOwkJLyogZW50cnkgaW5kZXggKi8KKwl4ZnNfaW5vX3QJCWlubzsJCS8qIGVudHJ5IGlub2RlIG51bWJlciAqLworCWludAkJCW5ld3NpemU7CS8qIG5ldyBpbm9kZSBzaXplICovCisJeGZzX2RpcjJfc2ZfZW50cnlfdAkqb2xkc2ZlcDsJLyogb2xkIHNmIGVudHJ5ICovCisJeGZzX2RpcjJfc2ZfdAkJKm9sZHNmcDsJLyogb2xkIHNmIGRpcmVjdG9yeSAqLworCWludAkJCW9sZHNpemU7CS8qIG9sZCBpbm9kZSBzaXplICovCisJeGZzX2RpcjJfc2ZfZW50cnlfdAkqc2ZlcDsJCS8qIG5ldyBzZiBlbnRyeSAqLworCXhmc19kaXIyX3NmX3QJCSpzZnA7CQkvKiBuZXcgc2YgZGlyZWN0b3J5ICovCisKKwl4ZnNfZGlyMl90cmFjZV9hcmdzKCJzZl90b2lubzgiLCBhcmdzKTsKKwlkcCA9IGFyZ3MtPmRwOworCisJLyoKKwkgKiBDb3B5IHRoZSBvbGQgZGlyZWN0b3J5IHRvIHRoZSBidWZmZXIuCisJICogVGhlbiBudWtlIGl0IGZyb20gdGhlIGlub2RlLCBhbmQgYWRkIHRoZSBuZXcgYnVmZmVyIHRvIHRoZSBpbm9kZS4KKwkgKiBEb24ndCB3YW50IHhmc19pZGF0YV9yZWFsbG9jIGNvcHlpbmcgdGhlIGRhdGEgaGVyZS4KKwkgKi8KKwlvbGRzaXplID0gZHAtPmlfZGYuaWZfYnl0ZXM7CisJYnVmID0ga21lbV9hbGxvYyhvbGRzaXplLCBLTV9TTEVFUCk7CisJb2xkc2ZwID0gKHhmc19kaXIyX3NmX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOworCUFTU0VSVChvbGRzZnAtPmhkci5pOGNvdW50ID09IDApOworCW1lbWNweShidWYsIG9sZHNmcCwgb2xkc2l6ZSk7CisJLyoKKwkgKiBDb21wdXRlIHRoZSBuZXcgaW5vZGUgc2l6ZS4KKwkgKi8KKwluZXdzaXplID0KKwkJb2xkc2l6ZSArCisJCShvbGRzZnAtPmhkci5jb3VudCArIDEpICoKKwkJKCh1aW50KXNpemVvZih4ZnNfZGlyMl9pbm84X3QpIC0gKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2lubzRfdCkpOworCXhmc19pZGF0YV9yZWFsbG9jKGRwLCAtb2xkc2l6ZSwgWEZTX0RBVEFfRk9SSyk7CisJeGZzX2lkYXRhX3JlYWxsb2MoZHAsIG5ld3NpemUsIFhGU19EQVRBX0ZPUkspOworCS8qCisJICogUmVzZXQgb3VyIHBvaW50ZXJzLCB0aGUgZGF0YSBoYXMgbW92ZWQuCisJICovCisJb2xkc2ZwID0gKHhmc19kaXIyX3NmX3QgKilidWY7CisJc2ZwID0gKHhmc19kaXIyX3NmX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOworCS8qCisJICogRmlsbCBpbiB0aGUgbmV3IGhlYWRlci4KKwkgKi8KKwlzZnAtPmhkci5jb3VudCA9IG9sZHNmcC0+aGRyLmNvdW50OworCXNmcC0+aGRyLmk4Y291bnQgPSAxOworCWlubyA9IFhGU19ESVIyX1NGX0dFVF9JTlVNQkVSKG9sZHNmcCwgJm9sZHNmcC0+aGRyLnBhcmVudCk7CisJWEZTX0RJUjJfU0ZfUFVUX0lOVU1CRVIoc2ZwLCAmaW5vLCAmc2ZwLT5oZHIucGFyZW50KTsKKwkvKgorCSAqIENvcHkgdGhlIGVudHJpZXMgZmllbGQgYnkgZmllbGQuCisJICovCisJZm9yIChpID0gMCwgc2ZlcCA9IFhGU19ESVIyX1NGX0ZJUlNURU5UUlkoc2ZwKSwKKwkJICAgIG9sZHNmZXAgPSBYRlNfRElSMl9TRl9GSVJTVEVOVFJZKG9sZHNmcCk7CisJICAgICBpIDwgc2ZwLT5oZHIuY291bnQ7CisJICAgICBpKyssIHNmZXAgPSBYRlNfRElSMl9TRl9ORVhURU5UUlkoc2ZwLCBzZmVwKSwKKwkJICBvbGRzZmVwID0gWEZTX0RJUjJfU0ZfTkVYVEVOVFJZKG9sZHNmcCwgb2xkc2ZlcCkpIHsKKwkJc2ZlcC0+bmFtZWxlbiA9IG9sZHNmZXAtPm5hbWVsZW47CisJCXNmZXAtPm9mZnNldCA9IG9sZHNmZXAtPm9mZnNldDsKKwkJbWVtY3B5KHNmZXAtPm5hbWUsIG9sZHNmZXAtPm5hbWUsIHNmZXAtPm5hbWVsZW4pOworCQlpbm8gPSBYRlNfRElSMl9TRl9HRVRfSU5VTUJFUihvbGRzZnAsCisJCQlYRlNfRElSMl9TRl9JTlVNQkVSUChvbGRzZmVwKSk7CisJCVhGU19ESVIyX1NGX1BVVF9JTlVNQkVSKHNmcCwgJmlubywgWEZTX0RJUjJfU0ZfSU5VTUJFUlAoc2ZlcCkpOworCX0KKwkvKgorCSAqIENsZWFuIHVwIHRoZSBpbm9kZS4KKwkgKi8KKwlrbWVtX2ZyZWUoYnVmLCBvbGRzaXplKTsKKwlkcC0+aV9kLmRpX3NpemUgPSBuZXdzaXplOworCXhmc190cmFuc19sb2dfaW5vZGUoYXJncy0+dHJhbnMsIGRwLCBYRlNfSUxPR19DT1JFIHwgWEZTX0lMT0dfRERBVEEpOworfQorI2VuZGlmCS8qIFhGU19CSUdfSU5VTVMgKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGlyMl9zZi5oIGIvZnMveGZzL3hmc19kaXIyX3NmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFjNmY1YQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfZGlyMl9zZi5oCkBAIC0wLDAgKzEsMjQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19ESVIyX1NGX0hfXworI2RlZmluZQlfX1hGU19ESVIyX1NGX0hfXworCisvKgorICogRGlyZWN0b3J5IGxheW91dCB3aGVuIHN0b3JlZCBpbnRlcm5hbCB0byBhbiBpbm9kZS4KKyAqCisgKiBTbWFsbCBkaXJlY3RvcmllcyBhcmUgcGFja2VkIGFzIHRpZ2h0bHkgYXMgcG9zc2libGUgc28gYXMgdG8KKyAqIGZpdCBpbnRvIHRoZSBsaXRlcmFsIGFyZWEgb2YgdGhlIGlub2RlLgorICovCisKK3N0cnVjdCB1aW87CitzdHJ1Y3QgeGZzX2RhYnVmOworc3RydWN0IHhmc19kYV9hcmdzOworc3RydWN0IHhmc19kaXIyX2Jsb2NrOworc3RydWN0IHhmc19pbm9kZTsKK3N0cnVjdCB4ZnNfbW91bnQ7CitzdHJ1Y3QgeGZzX3RyYW5zOworCisvKgorICogTWF4aW11bSBzaXplIG9mIGEgc2hvcnRmb3JtIGRpcmVjdG9yeS4KKyAqLworI2RlZmluZQlYRlNfRElSMl9TRl9NQVhfU0laRQlcCisJKFhGU19ESU5PREVfTUFYX1NJWkUgLSAodWludClzaXplb2YoeGZzX2Rpbm9kZV9jb3JlX3QpIC0gXAorCSAodWludClzaXplb2YoeGZzX2FnaW5vX3QpKQorCisvKgorICogSW5vZGUgbnVtYmVyIHN0b3JlZCBhcyA4IDgtYml0IHZhbHVlcy4KKyAqLwordHlwZWRlZglzdHJ1Y3QgeyBfX3VpbnQ4X3QgaVs4XTsgfSB4ZnNfZGlyMl9pbm84X3Q7CisKKy8qCisgKiBJbm9kZSBudW1iZXIgc3RvcmVkIGFzIDQgOC1iaXQgdmFsdWVzLgorICogV29ya3MgYSBsb3Qgb2YgdGhlIHRpbWUsIHdoZW4gYWxsIHRoZSBpbm9kZSBudW1iZXJzIGluIGEgZGlyZWN0b3J5CisgKiBmaXQgaW4gMzIgYml0cy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeyBfX3VpbnQ4X3QgaVs0XTsgfSB4ZnNfZGlyMl9pbm80X3Q7CisKK3R5cGVkZWYgdW5pb24geworCXhmc19kaXIyX2lubzhfdAlpODsKKwl4ZnNfZGlyMl9pbm80X3QJaTQ7Cit9IHhmc19kaXIyX2lub3VfdDsKKyNkZWZpbmUJWEZTX0RJUjJfTUFYX1NIT1JUX0lOVU0JKCh4ZnNfaW5vX3QpMHhmZmZmZmZmZlVMTCkKKworLyoKKyAqIE5vcm1hbGl6ZWQgb2Zmc2V0IChpbiBhIGRhdGEgYmxvY2spIG9mIHRoZSBlbnRyeSwgcmVhbGx5IHhmc19kaXIyX2RhdGFfb2ZmX3QuCisgKiBPbmx5IG5lZWQgMTYgYml0cywgdGhpcyBpcyB0aGUgYnl0ZSBvZmZzZXQgaW50byB0aGUgc2luZ2xlIGJsb2NrIGZvcm0uCisgKi8KK3R5cGVkZWYgc3RydWN0IHsgX191aW50OF90IGlbMl07IH0geGZzX2RpcjJfc2Zfb2ZmX3Q7CisKKy8qCisgKiBUaGUgcGFyZW50IGRpcmVjdG9yeSBoYXMgYSBkZWRpY2F0ZWQgZmllbGQsIGFuZCB0aGUgc2VsZi1wb2ludGVyIG11c3QKKyAqIGJlIGNhbGN1bGF0ZWQgb24gdGhlIGZseS4KKyAqCisgKiBFbnRyaWVzIGFyZSBwYWNrZWQgdG93YXJkIHRoZSB0b3AgYXMgdGlnaHRseSBhcyBwb3NzaWJsZS4gIFRoZSBoZWFkZXIKKyAqIGFuZCB0aGUgZWxlbWVudHMgbXVzdCBiZSBtZW1jcHknZCBvdXQgaW50byBhIHdvcmsgYXJlYSB0byBnZXQgY29ycmVjdAorICogYWxpZ25tZW50IGZvciB0aGUgaW5vZGUgbnVtYmVyIGZpZWxkcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RpcjJfc2ZfaGRyIHsKKwlfX3VpbnQ4X3QJCWNvdW50OwkJLyogY291bnQgb2YgZW50cmllcyAqLworCV9fdWludDhfdAkJaThjb3VudDsJLyogY291bnQgb2YgOC1ieXRlIGlub2RlICNzICovCisJeGZzX2RpcjJfaW5vdV90CQlwYXJlbnQ7CQkvKiBwYXJlbnQgZGlyIGlub2RlIG51bWJlciAqLworfSB4ZnNfZGlyMl9zZl9oZHJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RpcjJfc2ZfZW50cnkgeworCV9fdWludDhfdAkJbmFtZWxlbjsJLyogYWN0dWFsIG5hbWUgbGVuZ3RoICovCisJeGZzX2RpcjJfc2Zfb2ZmX3QJb2Zmc2V0OwkJLyogc2F2ZWQgb2Zmc2V0ICovCisJX191aW50OF90CQluYW1lWzFdOwkvKiBuYW1lLCB2YXJpYWJsZSBzaXplICovCisJeGZzX2RpcjJfaW5vdV90CQlpbnVtYmVyOwkvKiBpbm9kZSBudW1iZXIsIHZhci4gb2Zmc2V0ICovCit9IHhmc19kaXIyX3NmX2VudHJ5X3Q7CisKK3R5cGVkZWYgc3RydWN0IHhmc19kaXIyX3NmIHsKKwl4ZnNfZGlyMl9zZl9oZHJfdAloZHI7CQkvKiBzaG9ydGZvcm0gaGVhZGVyICovCisJeGZzX2RpcjJfc2ZfZW50cnlfdAlsaXN0WzFdOwkvKiBzaG9ydGZvcm0gZW50cmllcyAqLworfSB4ZnNfZGlyMl9zZl90OworCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVIyX1NGX0hEUl9TSVpFKQoraW50IHhmc19kaXIyX3NmX2hkcl9zaXplKGludCBpOGNvdW50KTsKKyNkZWZpbmUJWEZTX0RJUjJfU0ZfSERSX1NJWkUoaThjb3VudCkJeGZzX2RpcjJfc2ZfaGRyX3NpemUoaThjb3VudCkKKyNlbHNlCisjZGVmaW5lCVhGU19ESVIyX1NGX0hEUl9TSVpFKGk4Y291bnQpCVwKKwkoKHVpbnQpc2l6ZW9mKHhmc19kaXIyX3NmX2hkcl90KSAtIFwKKwkgKChpOGNvdW50KSA9PSAwKSAqIFwKKwkgKCh1aW50KXNpemVvZih4ZnNfZGlyMl9pbm84X3QpIC0gKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2lubzRfdCkpKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUjJfU0ZfSU5VTUJFUlApCit4ZnNfZGlyMl9pbm91X3QgKnhmc19kaXIyX3NmX2ludW1iZXJwKHhmc19kaXIyX3NmX2VudHJ5X3QgKnNmZXApOworI2RlZmluZQlYRlNfRElSMl9TRl9JTlVNQkVSUChzZmVwKQl4ZnNfZGlyMl9zZl9pbnVtYmVycChzZmVwKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0RJUjJfU0ZfSU5VTUJFUlAoc2ZlcCkJXAorCSgoeGZzX2RpcjJfaW5vdV90ICopJihzZmVwKS0+bmFtZVsoc2ZlcCktPm5hbWVsZW5dKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUjJfU0ZfR0VUX0lOVU1CRVIpCit4ZnNfaW50aW5vX3QgeGZzX2RpcjJfc2ZfZ2V0X2ludW1iZXIoeGZzX2RpcjJfc2ZfdCAqc2ZwLCB4ZnNfZGlyMl9pbm91X3QgKmZyb20pOworI2RlZmluZQlYRlNfRElSMl9TRl9HRVRfSU5VTUJFUihzZnAsIGZyb20pCVwKKwl4ZnNfZGlyMl9zZl9nZXRfaW51bWJlcihzZnAsIGZyb20pCisKKyNlbHNlCisjZGVmaW5lCVhGU19ESVIyX1NGX0dFVF9JTlVNQkVSKHNmcCwgZnJvbSkJXAorCSgoc2ZwKS0+aGRyLmk4Y291bnQgPT0gMCA/IFwKKwkJKHhmc19pbnRpbm9fdClYRlNfR0VUX0RJUl9JTk80KChmcm9tKS0+aTQpIDogXAorCQkoeGZzX2ludGlub190KVhGU19HRVRfRElSX0lOTzgoKGZyb20pLT5pOCkpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9TRl9QVVRfSU5VTUJFUikKK3ZvaWQgeGZzX2RpcjJfc2ZfcHV0X2ludW1iZXIoeGZzX2RpcjJfc2ZfdCAqc2ZwLCB4ZnNfaW5vX3QgKmZyb20sCisJCQkJICAgICB4ZnNfZGlyMl9pbm91X3QgKnRvKTsKKyNkZWZpbmUJWEZTX0RJUjJfU0ZfUFVUX0lOVU1CRVIoc2ZwLGZyb20sdG8pCVwKKwl4ZnNfZGlyMl9zZl9wdXRfaW51bWJlcihzZnAsZnJvbSx0bykKKyNlbHNlCisjZGVmaW5lCVhGU19ESVIyX1NGX1BVVF9JTlVNQkVSKHNmcCxmcm9tLHRvKQlcCisJaWYgKChzZnApLT5oZHIuaThjb3VudCA9PSAwKSB7IFwKKwkJWEZTX1BVVF9ESVJfSU5PNCgqKGZyb20pLCAodG8pLT5pNCk7IFwKKwl9IGVsc2UgeyBcCisJCVhGU19QVVRfRElSX0lOTzgoKihmcm9tKSwgKHRvKS0+aTgpOyBcCisJfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUjJfU0ZfR0VUX09GRlNFVCkKK3hmc19kaXIyX2RhdGFfYW9mZl90IHhmc19kaXIyX3NmX2dldF9vZmZzZXQoeGZzX2RpcjJfc2ZfZW50cnlfdCAqc2ZlcCk7CisjZGVmaW5lCVhGU19ESVIyX1NGX0dFVF9PRkZTRVQoc2ZlcCkJXAorCXhmc19kaXIyX3NmX2dldF9vZmZzZXQoc2ZlcCkKKyNlbHNlCisjZGVmaW5lCVhGU19ESVIyX1NGX0dFVF9PRkZTRVQoc2ZlcCkJXAorCUlOVF9HRVRfVU5BTElHTkVEXzE2X0JFKCYoc2ZlcCktPm9mZnNldC5pKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUjJfU0ZfUFVUX09GRlNFVCkKK3ZvaWQgeGZzX2RpcjJfc2ZfcHV0X29mZnNldCh4ZnNfZGlyMl9zZl9lbnRyeV90ICpzZmVwLAorCQkJCSAgICB4ZnNfZGlyMl9kYXRhX2FvZmZfdCBvZmYpOworI2RlZmluZQlYRlNfRElSMl9TRl9QVVRfT0ZGU0VUKHNmZXAsb2ZmKSBcCisJeGZzX2RpcjJfc2ZfcHV0X29mZnNldChzZmVwLG9mZikKKyNlbHNlCisjZGVmaW5lCVhGU19ESVIyX1NGX1BVVF9PRkZTRVQoc2ZlcCxvZmYpCVwKKwlJTlRfU0VUX1VOQUxJR05FRF8xNl9CRSgmKHNmZXApLT5vZmZzZXQuaSxvZmYpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9TRl9FTlRTSVpFX0JZTkFNRSkKK2ludCB4ZnNfZGlyMl9zZl9lbnRzaXplX2J5bmFtZSh4ZnNfZGlyMl9zZl90ICpzZnAsIGludCBsZW4pOworI2RlZmluZSBYRlNfRElSMl9TRl9FTlRTSVpFX0JZTkFNRShzZnAsbGVuKQlcCisJeGZzX2RpcjJfc2ZfZW50c2l6ZV9ieW5hbWUoc2ZwLGxlbikKKyNlbHNlCisjZGVmaW5lIFhGU19ESVIyX1NGX0VOVFNJWkVfQllOQU1FKHNmcCxsZW4pCS8qIHNwYWNlIGEgbmFtZSB1c2VzICovIFwKKwkoKHVpbnQpc2l6ZW9mKHhmc19kaXIyX3NmX2VudHJ5X3QpIC0gMSArIChsZW4pIC0gXAorCSAoKHNmcCktPmhkci5pOGNvdW50ID09IDApICogXAorCSAoKHVpbnQpc2l6ZW9mKHhmc19kaXIyX2lubzhfdCkgLSAodWludClzaXplb2YoeGZzX2RpcjJfaW5vNF90KSkpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSMl9TRl9FTlRTSVpFX0JZRU5UUlkpCitpbnQgeGZzX2RpcjJfc2ZfZW50c2l6ZV9ieWVudHJ5KHhmc19kaXIyX3NmX3QgKnNmcCwgeGZzX2RpcjJfc2ZfZW50cnlfdCAqc2ZlcCk7CisjZGVmaW5lIFhGU19ESVIyX1NGX0VOVFNJWkVfQllFTlRSWShzZnAsc2ZlcCkJXAorCXhmc19kaXIyX3NmX2VudHNpemVfYnllbnRyeShzZnAsc2ZlcCkKKyNlbHNlCisjZGVmaW5lIFhGU19ESVIyX1NGX0VOVFNJWkVfQllFTlRSWShzZnAsc2ZlcCkJLyogc3BhY2UgYW4gZW50cnkgdXNlcyAqLyBcCisJKCh1aW50KXNpemVvZih4ZnNfZGlyMl9zZl9lbnRyeV90KSAtIDEgKyAoc2ZlcCktPm5hbWVsZW4gLSBcCisJICgoc2ZwKS0+aGRyLmk4Y291bnQgPT0gMCkgKiBcCisJICgodWludClzaXplb2YoeGZzX2RpcjJfaW5vOF90KSAtICh1aW50KXNpemVvZih4ZnNfZGlyMl9pbm80X3QpKSkKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVIyX1NGX0ZJUlNURU5UUlkpCit4ZnNfZGlyMl9zZl9lbnRyeV90ICp4ZnNfZGlyMl9zZl9maXJzdGVudHJ5KHhmc19kaXIyX3NmX3QgKnNmcCk7CisjZGVmaW5lIFhGU19ESVIyX1NGX0ZJUlNURU5UUlkoc2ZwKQl4ZnNfZGlyMl9zZl9maXJzdGVudHJ5KHNmcCkKKyNlbHNlCisjZGVmaW5lIFhGU19ESVIyX1NGX0ZJUlNURU5UUlkoc2ZwKQkvKiBmaXJzdCBlbnRyeSBpbiBzdHJ1Y3QgKi8gXAorCSgoeGZzX2RpcjJfc2ZfZW50cnlfdCAqKSBcCisJICgoY2hhciAqKShzZnApICsgWEZTX0RJUjJfU0ZfSERSX1NJWkUoc2ZwLT5oZHIuaThjb3VudCkpKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUjJfU0ZfTkVYVEVOVFJZKQoreGZzX2RpcjJfc2ZfZW50cnlfdCAqeGZzX2RpcjJfc2ZfbmV4dGVudHJ5KHhmc19kaXIyX3NmX3QgKnNmcCwKKwkJCQkJICAgeGZzX2RpcjJfc2ZfZW50cnlfdCAqc2ZlcCk7CisjZGVmaW5lIFhGU19ESVIyX1NGX05FWFRFTlRSWShzZnAsc2ZlcCkJCXhmc19kaXIyX3NmX25leHRlbnRyeShzZnAsc2ZlcCkKKyNlbHNlCisjZGVmaW5lIFhGU19ESVIyX1NGX05FWFRFTlRSWShzZnAsc2ZlcCkJCS8qIG5leHQgZW50cnkgaW4gc3RydWN0ICovIFwKKwkoKHhmc19kaXIyX3NmX2VudHJ5X3QgKikgXAorCQkoKGNoYXIgKikoc2ZlcCkgKyBYRlNfRElSMl9TRl9FTlRTSVpFX0JZRU5UUlkoc2ZwLHNmZXApKSkKKyNlbmRpZgorCisvKgorICogRnVuY3Rpb25zLgorICovCisKK2V4dGVybiBpbnQKKwl4ZnNfZGlyMl9ibG9ja19zZnNpemUoc3RydWN0IHhmc19pbm9kZSAqZHAsCisJCQkgICAgICBzdHJ1Y3QgeGZzX2RpcjJfYmxvY2sgKmJsb2NrLAorCQkJICAgICAgeGZzX2RpcjJfc2ZfaGRyX3QgKnNmaHApOworCitleHRlcm4gaW50CisJeGZzX2RpcjJfYmxvY2tfdG9fc2Yoc3RydWN0IHhmc19kYV9hcmdzICphcmdzLCBzdHJ1Y3QgeGZzX2RhYnVmICpicCwKKwkJCSAgICAgaW50IHNpemUsIHhmc19kaXIyX3NmX2hkcl90ICpzZmhwKTsKKworZXh0ZXJuIGludAorCXhmc19kaXIyX3NmX2FkZG5hbWUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKKworZXh0ZXJuIGludAorCXhmc19kaXIyX3NmX2NyZWF0ZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsIHhmc19pbm9fdCBwaW5vKTsKKworZXh0ZXJuIGludAorCXhmc19kaXIyX3NmX2dldGRlbnRzKHN0cnVjdCB4ZnNfaW5vZGUgKmRwLCBzdHJ1Y3QgdWlvICp1aW8sIGludCAqZW9mcCwKKwkJCSAgICAgc3RydWN0IHhmc19kaXJlbnQgKmRicCwgeGZzX2RpcjJfcHV0X3QgcHV0KTsKKworZXh0ZXJuIGludAorCXhmc19kaXIyX3NmX2xvb2t1cChzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworCitleHRlcm4gaW50CisJeGZzX2RpcjJfc2ZfcmVtb3ZlbmFtZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworCitleHRlcm4gaW50CisJeGZzX2RpcjJfc2ZfcmVwbGFjZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworCisjZW5kaWYJLyogX19YRlNfRElSMl9TRl9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGlyMl90cmFjZS5jIGIvZnMveGZzL3hmc19kaXIyX3RyYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ2NDE3MwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfZGlyMl90cmFjZS5jCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisvKgorICogeGZzX2RpcjJfdHJhY2UuYworICogVHJhY2luZyBmb3IgeGZzIHYyIGRpcmVjdG9yaWVzLgorICovCisjaW5jbHVkZSAieGZzLmgiCisKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfdHJhY2UuaCIKKworI2lmZGVmIFhGU19ESVIyX1RSQUNFCitrdHJhY2VfdAkqeGZzX2RpcjJfdHJhY2VfYnVmOworCisvKgorICogRW50ZXIgc29tZXRoaW5nIGluIHRoZSB0cmFjZSBidWZmZXJzLgorICovCitzdGF0aWMgdm9pZAoreGZzX2RpcjJfdHJhY2VfZW50ZXIoCisJeGZzX2lub2RlX3QJKmRwLAorCWludAkJdHlwZSwKKwljaGFyCQkqd2hlcmUsCisJY2hhcgkJKm5hbWUsCisJaW50CQluYW1lbGVuLAorCXZvaWQJCSphMCwKKwl2b2lkCQkqYTEsCisJdm9pZAkJKmEyLAorCXZvaWQJCSphMywKKwl2b2lkCQkqYTQsCisJdm9pZAkJKmE1LAorCXZvaWQJCSphNiwKKwl2b2lkCQkqYTcpCit7CisJdm9pZAkJKm5bNV07CisKKwlBU1NFUlQoeGZzX2RpcjJfdHJhY2VfYnVmKTsKKwlBU1NFUlQoZHAtPmlfZGlyX3RyYWNlKTsKKwlpZiAobmFtZSkKKwkJbWVtY3B5KG4sIG5hbWUsIG1pbigoaW50KXNpemVvZihuKSwgbmFtZWxlbikpOworCWVsc2UKKwkJbWVtc2V0KChjaGFyICopbiwgMCwgc2l6ZW9mKG4pKTsKKwlrdHJhY2VfZW50ZXIoeGZzX2RpcjJfdHJhY2VfYnVmLAorCQkodm9pZCAqKShsb25nKXR5cGUsICh2b2lkICopd2hlcmUsCisJCSh2b2lkICopYTAsICh2b2lkICopYTEsICh2b2lkICopYTIsICh2b2lkICopYTMsCisJCSh2b2lkICopYTQsICh2b2lkICopYTUsICh2b2lkICopYTYsICh2b2lkICopYTcsCisJCSh2b2lkICopKGxvbmcpbmFtZWxlbiwKKwkJKHZvaWQgKiluWzBdLCAodm9pZCAqKW5bMV0sICh2b2lkICopblsyXSwKKwkJKHZvaWQgKiluWzNdLCAodm9pZCAqKW5bNF0pOworCWt0cmFjZV9lbnRlcihkcC0+aV9kaXJfdHJhY2UsCisJCSh2b2lkICopKGxvbmcpdHlwZSwgKHZvaWQgKil3aGVyZSwKKwkJKHZvaWQgKilhMCwgKHZvaWQgKilhMSwgKHZvaWQgKilhMiwgKHZvaWQgKilhMywKKwkJKHZvaWQgKilhNCwgKHZvaWQgKilhNSwgKHZvaWQgKilhNiwgKHZvaWQgKilhNywKKwkJKHZvaWQgKikobG9uZyluYW1lbGVuLAorCQkodm9pZCAqKW5bMF0sICh2b2lkICopblsxXSwgKHZvaWQgKiluWzJdLAorCQkodm9pZCAqKW5bM10sICh2b2lkICopbls0XSk7Cit9CisKK3ZvaWQKK3hmc19kaXIyX3RyYWNlX2FyZ3MoCisJY2hhcgkJKndoZXJlLAorCXhmc19kYV9hcmdzX3QJKmFyZ3MpCit7CisJeGZzX2RpcjJfdHJhY2VfZW50ZXIoYXJncy0+ZHAsIFhGU19ESVIyX0tUUkFDRV9BUkdTLCB3aGVyZSwKKwkJKGNoYXIgKilhcmdzLT5uYW1lLCAoaW50KWFyZ3MtPm5hbWVsZW4sCisJCSh2b2lkICopKHVuc2lnbmVkIGxvbmcpYXJncy0+aGFzaHZhbCwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKGFyZ3MtPmludW1iZXIgPj4gMzIpKSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKGFyZ3MtPmludW1iZXIgJiAweEZGRkZGRkZGKSksCisJCSh2b2lkICopYXJncy0+ZHAsICh2b2lkICopYXJncy0+dHJhbnMsCisJCSh2b2lkICopKHVuc2lnbmVkIGxvbmcpYXJncy0+anVzdGNoZWNrLCBOVUxMLCBOVUxMKTsKK30KKwordm9pZAoreGZzX2RpcjJfdHJhY2VfYXJnc19iKAorCWNoYXIJCSp3aGVyZSwKKwl4ZnNfZGFfYXJnc190CSphcmdzLAorCXhmc19kYWJ1Zl90CSpicCkKK3sKKwl4ZnNfZGlyMl90cmFjZV9lbnRlcihhcmdzLT5kcCwgWEZTX0RJUjJfS1RSQUNFX0FSR1NfQiwgd2hlcmUsCisJCShjaGFyICopYXJncy0+bmFtZSwgKGludClhcmdzLT5uYW1lbGVuLAorCQkodm9pZCAqKSh1bnNpZ25lZCBsb25nKWFyZ3MtPmhhc2h2YWwsCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKShhcmdzLT5pbnVtYmVyID4+IDMyKSksCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKShhcmdzLT5pbnVtYmVyICYgMHhGRkZGRkZGRikpLAorCQkodm9pZCAqKWFyZ3MtPmRwLCAodm9pZCAqKWFyZ3MtPnRyYW5zLAorCQkodm9pZCAqKSh1bnNpZ25lZCBsb25nKWFyZ3MtPmp1c3RjaGVjaywKKwkJKHZvaWQgKikoYnAgPyBicC0+YnBzWzBdIDogTlVMTCksIE5VTEwpOworfQorCit2b2lkCit4ZnNfZGlyMl90cmFjZV9hcmdzX2JiKAorCWNoYXIJCSp3aGVyZSwKKwl4ZnNfZGFfYXJnc190CSphcmdzLAorCXhmc19kYWJ1Zl90CSpsYnAsCisJeGZzX2RhYnVmX3QJKmRicCkKK3sKKwl4ZnNfZGlyMl90cmFjZV9lbnRlcihhcmdzLT5kcCwgWEZTX0RJUjJfS1RSQUNFX0FSR1NfQkIsIHdoZXJlLAorCQkoY2hhciAqKWFyZ3MtPm5hbWUsIChpbnQpYXJncy0+bmFtZWxlbiwKKwkJKHZvaWQgKikodW5zaWduZWQgbG9uZylhcmdzLT5oYXNodmFsLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoYXJncy0+aW51bWJlciA+PiAzMikpLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoYXJncy0+aW51bWJlciAmIDB4RkZGRkZGRkYpKSwKKwkJKHZvaWQgKilhcmdzLT5kcCwgKHZvaWQgKilhcmdzLT50cmFucywKKwkJKHZvaWQgKikodW5zaWduZWQgbG9uZylhcmdzLT5qdXN0Y2hlY2ssCisJCSh2b2lkICopKGxicCA/IGxicC0+YnBzWzBdIDogTlVMTCksCisJCSh2b2lkICopKGRicCA/IGRicC0+YnBzWzBdIDogTlVMTCkpOworfQorCit2b2lkCit4ZnNfZGlyMl90cmFjZV9hcmdzX2JpYmlpKAorCWNoYXIJCSp3aGVyZSwKKwl4ZnNfZGFfYXJnc190CSphcmdzLAorCXhmc19kYWJ1Zl90CSpicywKKwlpbnQJCXNzLAorCXhmc19kYWJ1Zl90CSpiZCwKKwlpbnQJCXNkLAorCWludAkJYykKK3sKKwl4ZnNfYnVmX3QJKmJwYnMgPSBicyA/IGJzLT5icHNbMF0gOiBOVUxMOworCXhmc19idWZfdAkqYnBiZCA9IGJkID8gYmQtPmJwc1swXSA6IE5VTEw7CisKKwl4ZnNfZGlyMl90cmFjZV9lbnRlcihhcmdzLT5kcCwgWEZTX0RJUjJfS1RSQUNFX0FSR1NfQklCSUksIHdoZXJlLAorCQkoY2hhciAqKWFyZ3MtPm5hbWUsIChpbnQpYXJncy0+bmFtZWxlbiwKKwkJKHZvaWQgKilhcmdzLT5kcCwgKHZvaWQgKilhcmdzLT50cmFucywKKwkJKHZvaWQgKilicGJzLCAodm9pZCAqKShsb25nKXNzLCAodm9pZCAqKWJwYmQsICh2b2lkICopKGxvbmcpc2QsCisJCSh2b2lkICopKGxvbmcpYywgTlVMTCk7Cit9CisKK3ZvaWQKK3hmc19kaXIyX3RyYWNlX2FyZ3NfZGIoCisJY2hhcgkJKndoZXJlLAorCXhmc19kYV9hcmdzX3QJKmFyZ3MsCisJeGZzX2RpcjJfZGJfdAlkYiwKKwl4ZnNfZGFidWZfdAkqYnApCit7CisJeGZzX2J1Zl90CSpkYnAgPSBicCA/IGJwLT5icHNbMF0gOiBOVUxMOworCisJeGZzX2RpcjJfdHJhY2VfZW50ZXIoYXJncy0+ZHAsIFhGU19ESVIyX0tUUkFDRV9BUkdTX0RCLCB3aGVyZSwKKwkJKGNoYXIgKilhcmdzLT5uYW1lLCAoaW50KWFyZ3MtPm5hbWVsZW4sCisJCSh2b2lkICopKHVuc2lnbmVkIGxvbmcpYXJncy0+aGFzaHZhbCwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKGFyZ3MtPmludW1iZXIgPj4gMzIpKSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKGFyZ3MtPmludW1iZXIgJiAweEZGRkZGRkZGKSksCisJCSh2b2lkICopYXJncy0+ZHAsICh2b2lkICopYXJncy0+dHJhbnMsCisJCSh2b2lkICopKHVuc2lnbmVkIGxvbmcpYXJncy0+anVzdGNoZWNrLCAodm9pZCAqKShsb25nKWRiLAorCQkodm9pZCAqKWRicCk7Cit9CisKK3ZvaWQKK3hmc19kaXIyX3RyYWNlX2FyZ3NfaSgKKwljaGFyCQkqd2hlcmUsCisJeGZzX2RhX2FyZ3NfdAkqYXJncywKKwl4ZnNfaW5vX3QJaSkKK3sKKwl4ZnNfZGlyMl90cmFjZV9lbnRlcihhcmdzLT5kcCwgWEZTX0RJUjJfS1RSQUNFX0FSR1NfSSwgd2hlcmUsCisJCShjaGFyICopYXJncy0+bmFtZSwgKGludClhcmdzLT5uYW1lbGVuLAorCQkodm9pZCAqKSh1bnNpZ25lZCBsb25nKWFyZ3MtPmhhc2h2YWwsCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKShhcmdzLT5pbnVtYmVyID4+IDMyKSksCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKShhcmdzLT5pbnVtYmVyICYgMHhGRkZGRkZGRikpLAorCQkodm9pZCAqKWFyZ3MtPmRwLCAodm9pZCAqKWFyZ3MtPnRyYW5zLAorCQkodm9pZCAqKSh1bnNpZ25lZCBsb25nKWFyZ3MtPmp1c3RjaGVjaywKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKGkgPj4gMzIpKSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKGkgJiAweEZGRkZGRkZGKSkpOworfQorCit2b2lkCit4ZnNfZGlyMl90cmFjZV9hcmdzX3MoCisJY2hhcgkJKndoZXJlLAorCXhmc19kYV9hcmdzX3QJKmFyZ3MsCisJaW50CQlzKQoreworCXhmc19kaXIyX3RyYWNlX2VudGVyKGFyZ3MtPmRwLCBYRlNfRElSMl9LVFJBQ0VfQVJHU19TLCB3aGVyZSwKKwkJKGNoYXIgKilhcmdzLT5uYW1lLCAoaW50KWFyZ3MtPm5hbWVsZW4sCisJCSh2b2lkICopKHVuc2lnbmVkIGxvbmcpYXJncy0+aGFzaHZhbCwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKGFyZ3MtPmludW1iZXIgPj4gMzIpKSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKGFyZ3MtPmludW1iZXIgJiAweEZGRkZGRkZGKSksCisJCSh2b2lkICopYXJncy0+ZHAsICh2b2lkICopYXJncy0+dHJhbnMsCisJCSh2b2lkICopKHVuc2lnbmVkIGxvbmcpYXJncy0+anVzdGNoZWNrLCAodm9pZCAqKShsb25nKXMsIE5VTEwpOworfQorCit2b2lkCit4ZnNfZGlyMl90cmFjZV9hcmdzX3NiKAorCWNoYXIJCSp3aGVyZSwKKwl4ZnNfZGFfYXJnc190CSphcmdzLAorCWludAkJcywKKwl4ZnNfZGFidWZfdAkqYnApCit7CisJeGZzX2J1Zl90CSpkYnAgPSBicCA/IGJwLT5icHNbMF0gOiBOVUxMOworCisJeGZzX2RpcjJfdHJhY2VfZW50ZXIoYXJncy0+ZHAsIFhGU19ESVIyX0tUUkFDRV9BUkdTX1NCLCB3aGVyZSwKKwkJKGNoYXIgKilhcmdzLT5uYW1lLCAoaW50KWFyZ3MtPm5hbWVsZW4sCisJCSh2b2lkICopKHVuc2lnbmVkIGxvbmcpYXJncy0+aGFzaHZhbCwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKGFyZ3MtPmludW1iZXIgPj4gMzIpKSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKGFyZ3MtPmludW1iZXIgJiAweEZGRkZGRkZGKSksCisJCSh2b2lkICopYXJncy0+ZHAsICh2b2lkICopYXJncy0+dHJhbnMsCisJCSh2b2lkICopKHVuc2lnbmVkIGxvbmcpYXJncy0+anVzdGNoZWNrLCAodm9pZCAqKShsb25nKXMsCisJCSh2b2lkICopZGJwKTsKK30KKyNlbmRpZgkvKiBYRlNfRElSMl9UUkFDRSAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXIyX3RyYWNlLmggYi9mcy94ZnMveGZzX2RpcjJfdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTE3OGJmCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19kaXIyX3RyYWNlLmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX0RJUjJfVFJBQ0VfSF9fCisjZGVmaW5lIF9fWEZTX0RJUjJfVFJBQ0VfSF9fCisKKy8qCisgKiBUcmFjaW5nIGZvciB4ZnMgdjIgZGlyZWN0b3JpZXMuCisgKi8KKworI2lmIGRlZmluZWQoWEZTX0RJUjJfVFJBQ0UpCisKK3N0cnVjdCBrdHJhY2U7CitzdHJ1Y3QgeGZzX2RhYnVmOworc3RydWN0IHhmc19kYV9hcmdzOworCisjZGVmaW5lCVhGU19ESVIyX0dUUkFDRV9TSVpFCQk0MDk2CS8qIGdsb2JhbCBidWZmZXIgKi8KKyNkZWZpbmUJWEZTX0RJUjJfS1RSQUNFX1NJWkUJCTMyCS8qIHBlci1pbm9kZSBidWZmZXIgKi8KK2V4dGVybiBzdHJ1Y3Qga3RyYWNlICp4ZnNfZGlyMl90cmFjZV9idWY7CisKKyNkZWZpbmUJWEZTX0RJUjJfS1RSQUNFX0FSR1MJCTEJLyogYXJncyBvbmx5ICovCisjZGVmaW5lCVhGU19ESVIyX0tUUkFDRV9BUkdTX0IJCTIJLyogYXJncyArIGJ1ZmZlciAqLworI2RlZmluZQlYRlNfRElSMl9LVFJBQ0VfQVJHU19CQgkJMwkvKiBhcmdzICsgMiBidWZmZXJzICovCisjZGVmaW5lCVhGU19ESVIyX0tUUkFDRV9BUkdTX0RCCQk0CS8qIGFyZ3MsIGRiLCBidWZmZXIgKi8KKyNkZWZpbmUJWEZTX0RJUjJfS1RSQUNFX0FSR1NfSQkJNQkvKiBhcmdzLCBpbnVtICovCisjZGVmaW5lCVhGU19ESVIyX0tUUkFDRV9BUkdTX1MJCTYJLyogYXJncywgaW50ICovCisjZGVmaW5lCVhGU19ESVIyX0tUUkFDRV9BUkdTX1NCCQk3CS8qIGFyZ3MsIGludCwgYnVmZmVyICovCisjZGVmaW5lCVhGU19ESVIyX0tUUkFDRV9BUkdTX0JJQklJCTgJLyogYXJncywgYnVmL2ludC9idWYvaW50L2ludCAqLworCit2b2lkIHhmc19kaXIyX3RyYWNlX2FyZ3MoY2hhciAqd2hlcmUsIHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7Cit2b2lkIHhmc19kaXIyX3RyYWNlX2FyZ3NfYihjaGFyICp3aGVyZSwgc3RydWN0IHhmc19kYV9hcmdzICphcmdzLAorCQkJICAgc3RydWN0IHhmc19kYWJ1ZiAqYnApOwordm9pZCB4ZnNfZGlyMl90cmFjZV9hcmdzX2JiKGNoYXIgKndoZXJlLCBzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsCisJCQkgICAgc3RydWN0IHhmc19kYWJ1ZiAqbGJwLCBzdHJ1Y3QgeGZzX2RhYnVmICpkYnApOwordm9pZCB4ZnNfZGlyMl90cmFjZV9hcmdzX2JpYmlpKGNoYXIgKndoZXJlLCBzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsCisJCQkgICAgICAgc3RydWN0IHhmc19kYWJ1ZiAqYnMsIGludCBzcywKKwkJCSAgICAgICBzdHJ1Y3QgeGZzX2RhYnVmICpiZCwgaW50IHNkLCBpbnQgYyk7Cit2b2lkIHhmc19kaXIyX3RyYWNlX2FyZ3NfZGIoY2hhciAqd2hlcmUsIHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywKKwkJCSAgICB4ZnNfZGlyMl9kYl90IGRiLCBzdHJ1Y3QgeGZzX2RhYnVmICpicCk7Cit2b2lkIHhmc19kaXIyX3RyYWNlX2FyZ3NfaShjaGFyICp3aGVyZSwgc3RydWN0IHhmc19kYV9hcmdzICphcmdzLCB4ZnNfaW5vX3QgaSk7Cit2b2lkIHhmc19kaXIyX3RyYWNlX2FyZ3NfcyhjaGFyICp3aGVyZSwgc3RydWN0IHhmc19kYV9hcmdzICphcmdzLCBpbnQgcyk7Cit2b2lkIHhmc19kaXIyX3RyYWNlX2FyZ3Nfc2IoY2hhciAqd2hlcmUsIHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywgaW50IHMsCisJCQkgICAgc3RydWN0IHhmc19kYWJ1ZiAqYnApOworCisjZWxzZQkvKiBYRlNfRElSMl9UUkFDRSAqLworCisjZGVmaW5lCXhmc19kaXIyX3RyYWNlX2FyZ3Mod2hlcmUsIGFyZ3MpCisjZGVmaW5lCXhmc19kaXIyX3RyYWNlX2FyZ3NfYih3aGVyZSwgYXJncywgYnApCisjZGVmaW5lCXhmc19kaXIyX3RyYWNlX2FyZ3NfYmIod2hlcmUsIGFyZ3MsIGxicCwgZGJwKQorI2RlZmluZQl4ZnNfZGlyMl90cmFjZV9hcmdzX2JpYmlpKHdoZXJlLCBhcmdzLCBicywgc3MsIGJkLCBzZCwgYykKKyNkZWZpbmUJeGZzX2RpcjJfdHJhY2VfYXJnc19kYih3aGVyZSwgYXJncywgZGIsIGJwKQorI2RlZmluZQl4ZnNfZGlyMl90cmFjZV9hcmdzX2kod2hlcmUsIGFyZ3MsIGkpCisjZGVmaW5lCXhmc19kaXIyX3RyYWNlX2FyZ3Nfcyh3aGVyZSwgYXJncywgcykKKyNkZWZpbmUJeGZzX2RpcjJfdHJhY2VfYXJnc19zYih3aGVyZSwgYXJncywgcywgYnApCisKKyNlbmRpZgkvKiBYRlNfRElSMl9UUkFDRSAqLworCisjZW5kaWYJLyogX19YRlNfRElSMl9UUkFDRV9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZGlyX2xlYWYuYyBiL2ZzL3hmcy94ZnNfZGlyX2xlYWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTcwMThkCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19kaXJfbGVhZi5jCkBAIC0wLDAgKzEsMjIzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworLyoKKyAqIHhmc19kaXJfbGVhZi5jCisgKgorICogR1JPVDogZmlndXJlIG91dCBob3cgdG8gcmVjb3ZlciBncmFjZWZ1bGx5IHdoZW4gYm1hcCByZXR1cm5zIEVOT1NQQy4KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisKKyNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlX2l0ZW0uaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcC5oIgorI2luY2x1ZGUgInhmc19kYV9idHJlZS5oIgorI2luY2x1ZGUgInhmc19kaXJfbGVhZi5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorCisvKgorICogeGZzX2Rpcl9sZWFmLmMKKyAqCisgKiBSb3V0aW5lcyB0byBpbXBsZW1lbnQgbGVhZiBibG9ja3Mgb2YgZGlyZWN0b3JpZXMgYXMgQnRyZWVzIG9mIGhhc2hlZCBuYW1lcy4KKyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRnVuY3Rpb24gcHJvdG90eXBlcyBmb3IgdGhlIGtlcm5lbC4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAqIFJvdXRpbmVzIHVzZWQgZm9yIGdyb3dpbmcgdGhlIEJ0cmVlLgorICovCitTVEFUSUMgdm9pZCB4ZnNfZGlyX2xlYWZfYWRkX3dvcmsoeGZzX2RhYnVmX3QgKmxlYWZfYnVmZmVyLCB4ZnNfZGFfYXJnc190ICphcmdzLAorCQkJCQkgICAgICBpbnQgaW5zZXJ0aW9uX2luZGV4LAorCQkJCQkgICAgICBpbnQgZnJlZW1hcF9pbmRleCk7CitTVEFUSUMgaW50IHhmc19kaXJfbGVhZl9jb21wYWN0KHhmc190cmFuc190ICp0cmFucywgeGZzX2RhYnVmX3QgKmxlYWZfYnVmZmVyLAorCQkJCQkgICAgaW50IG11c3RoYXZlLCBpbnQganVzdGNoZWNrKTsKK1NUQVRJQyB2b2lkIHhmc19kaXJfbGVhZl9yZWJhbGFuY2UoeGZzX2RhX3N0YXRlX3QgKnN0YXRlLAorCQkJCQkJICB4ZnNfZGFfc3RhdGVfYmxrX3QgKmJsazEsCisJCQkJCQkgIHhmc19kYV9zdGF0ZV9ibGtfdCAqYmxrMik7CitTVEFUSUMgaW50IHhmc19kaXJfbGVhZl9maWd1cmVfYmFsYW5jZSh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUsCisJCQkJCSAgeGZzX2RhX3N0YXRlX2Jsa190ICpsZWFmX2Jsa18xLAorCQkJCQkgIHhmc19kYV9zdGF0ZV9ibGtfdCAqbGVhZl9ibGtfMiwKKwkJCQkJICBpbnQgKm51bWJlcl9lbnRyaWVzX2luX2JsazEsCisJCQkJCSAgaW50ICpudW1iZXJfbmFtZWJ5dGVzX2luX2JsazEpOworCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqLworU1RBVElDIHZvaWQgeGZzX2Rpcl9sZWFmX21vdmVlbnRzKHhmc19kaXJfbGVhZmJsb2NrX3QgKnNyY19sZWFmLAorCQkJCQkgICAgICBpbnQgc3JjX3N0YXJ0LAorCQkJCQkgICAgICB4ZnNfZGlyX2xlYWZibG9ja190ICpkc3RfbGVhZiwKKwkJCQkJICAgICAgaW50IGRzdF9zdGFydCwgaW50IG1vdmVfY291bnQsCisJCQkJCSAgICAgIHhmc19tb3VudF90ICptcCk7CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEV4dGVybmFsIHJvdXRpbmVzIHdoZW4gZGlyc2l6ZSA8IFhGU19JRk9SS19EU0laRShkcCkuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworLyoKKyAqIFZhbGlkYXRlIGEgZ2l2ZW4gaW5vZGUgbnVtYmVyLgorICovCitpbnQKK3hmc19kaXJfaW5vX3ZhbGlkYXRlKHhmc19tb3VudF90ICptcCwgeGZzX2lub190IGlubykKK3sKKwl4ZnNfYWdibG9ja190CWFnYmxrbm87CisJeGZzX2FnaW5vX3QJYWdpbm87CisJeGZzX2FnbnVtYmVyX3QJYWdubzsKKwlpbnQJCWlub19vazsKKwlpbnQJCWlvZmY7CisKKwlhZ25vID0gWEZTX0lOT19UT19BR05PKG1wLCBpbm8pOworCWFnYmxrbm8gPSBYRlNfSU5PX1RPX0FHQk5PKG1wLCBpbm8pOworCWlvZmYgPSBYRlNfSU5PX1RPX09GRlNFVChtcCwgaW5vKTsKKwlhZ2lubyA9IFhGU19PRkZCTk9fVE9fQUdJTk8obXAsIGFnYmxrbm8sIGlvZmYpOworCWlub19vayA9CisJCWFnbm8gPCBtcC0+bV9zYi5zYl9hZ2NvdW50ICYmCisJCWFnYmxrbm8gPCBtcC0+bV9zYi5zYl9hZ2Jsb2NrcyAmJgorCQlhZ2Jsa25vICE9IDAgJiYKKwkJaW9mZiA8ICgxIDw8IG1wLT5tX3NiLnNiX2lub3BibG9nKSAmJgorCQlYRlNfQUdJTk9fVE9fSU5PKG1wLCBhZ25vLCBhZ2lubykgPT0gaW5vOworCWlmICh1bmxpa2VseShYRlNfVEVTVF9FUlJPUighaW5vX29rLCBtcCwgWEZTX0VSUlRBR19ESVJfSU5PX1ZBTElEQVRFLAorCQkJWEZTX1JBTkRPTV9ESVJfSU5PX1ZBTElEQVRFKSkpIHsKKwkJeGZzX2ZzX2Ntbl9lcnIoQ0VfV0FSTiwgbXAsICJJbnZhbGlkIGlub2RlIG51bWJlciAweCVMeCIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgaW5vKTsKKwkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX2Rpcl9pbm9fdmFsaWRhdGUiLCBYRlNfRVJSTEVWRUxfTE9XLCBtcCk7CisJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDcmVhdGUgdGhlIGluaXRpYWwgY29udGVudHMgb2YgYSBzaG9ydGZvcm0gZGlyZWN0b3J5LgorICovCitpbnQKK3hmc19kaXJfc2hvcnRmb3JtX2NyZWF0ZSh4ZnNfZGFfYXJnc190ICphcmdzLCB4ZnNfaW5vX3QgcGFyZW50KQoreworCXhmc19kaXJfc2ZfaGRyX3QgKmhkcjsKKwl4ZnNfaW5vZGVfdCAqZHA7CisKKwlkcCA9IGFyZ3MtPmRwOworCUFTU0VSVChkcCAhPSBOVUxMKTsKKwlBU1NFUlQoZHAtPmlfZC5kaV9zaXplID09IDApOworCWlmIChkcC0+aV9kLmRpX2Zvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTKSB7CisJCWRwLT5pX2RmLmlmX2ZsYWdzICY9IH5YRlNfSUZFWFRFTlRTOwkvKiBqdXN0IGluIGNhc2UgKi8KKwkJZHAtPmlfZC5kaV9mb3JtYXQgPSBYRlNfRElOT0RFX0ZNVF9MT0NBTDsKKwkJeGZzX3RyYW5zX2xvZ19pbm9kZShhcmdzLT50cmFucywgZHAsIFhGU19JTE9HX0NPUkUpOworCQlkcC0+aV9kZi5pZl9mbGFncyB8PSBYRlNfSUZJTkxJTkU7CisJfQorCUFTU0VSVChkcC0+aV9kZi5pZl9mbGFncyAmIFhGU19JRklOTElORSk7CisJQVNTRVJUKGRwLT5pX2RmLmlmX2J5dGVzID09IDApOworCXhmc19pZGF0YV9yZWFsbG9jKGRwLCBzaXplb2YoKmhkciksIFhGU19EQVRBX0ZPUkspOworCWhkciA9ICh4ZnNfZGlyX3NmX2hkcl90ICopZHAtPmlfZGYuaWZfdTEuaWZfZGF0YTsKKwlYRlNfRElSX1NGX1BVVF9ESVJJTk8oJnBhcmVudCwgJmhkci0+cGFyZW50KTsKKworCWhkci0+Y291bnQgPSAwOworCWRwLT5pX2QuZGlfc2l6ZSA9IHNpemVvZigqaGRyKTsKKwl4ZnNfdHJhbnNfbG9nX2lub2RlKGFyZ3MtPnRyYW5zLCBkcCwgWEZTX0lMT0dfQ09SRSB8IFhGU19JTE9HX0REQVRBKTsKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBBZGQgYSBuYW1lIHRvIHRoZSBzaG9ydGZvcm0gZGlyZWN0b3J5IHN0cnVjdHVyZS4KKyAqIE92ZXJmbG93IGZyb20gdGhlIGlub2RlIGhhcyBhbHJlYWR5IGJlZW4gY2hlY2tlZCBmb3IuCisgKi8KK2ludAoreGZzX2Rpcl9zaG9ydGZvcm1fYWRkbmFtZSh4ZnNfZGFfYXJnc190ICphcmdzKQoreworCXhmc19kaXJfc2hvcnRmb3JtX3QgKnNmOworCXhmc19kaXJfc2ZfZW50cnlfdCAqc2ZlOworCWludCBpLCBvZmZzZXQsIHNpemU7CisJeGZzX2lub2RlX3QgKmRwOworCisJZHAgPSBhcmdzLT5kcDsKKwlBU1NFUlQoZHAtPmlfZGYuaWZfZmxhZ3MgJiBYRlNfSUZJTkxJTkUpOworCS8qCisJICogQ2F0Y2ggdGhlIGNhc2Ugd2hlcmUgdGhlIGNvbnZlcnNpb24gZnJvbSBzaG9ydGZvcm0gdG8gbGVhZgorCSAqIGZhaWxlZCBwYXJ0IHdheSB0aHJvdWdoLgorCSAqLworCWlmIChkcC0+aV9kLmRpX3NpemUgPCBzaXplb2YoeGZzX2Rpcl9zZl9oZHJfdCkpIHsKKwkJQVNTRVJUKFhGU19GT1JDRURfU0hVVERPV04oZHAtPmlfbW91bnQpKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCX0KKwlBU1NFUlQoZHAtPmlfZGYuaWZfYnl0ZXMgPT0gZHAtPmlfZC5kaV9zaXplKTsKKwlBU1NFUlQoZHAtPmlfZGYuaWZfdTEuaWZfZGF0YSAhPSBOVUxMKTsKKwlzZiA9ICh4ZnNfZGlyX3Nob3J0Zm9ybV90ICopZHAtPmlfZGYuaWZfdTEuaWZfZGF0YTsKKwlzZmUgPSAmc2YtPmxpc3RbMF07CisJZm9yIChpID0gSU5UX0dFVChzZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpLTE7IGkgPj0gMDsgaS0tKSB7CisJCWlmIChzZmUtPm5hbWVsZW4gPT0gYXJncy0+bmFtZWxlbiAmJgorCQkgICAgYXJncy0+bmFtZVswXSA9PSBzZmUtPm5hbWVbMF0gJiYKKwkJICAgIG1lbWNtcChhcmdzLT5uYW1lLCBzZmUtPm5hbWUsIGFyZ3MtPm5hbWVsZW4pID09IDApCisJCQlyZXR1cm4oWEZTX0VSUk9SKEVFWElTVCkpOworCQlzZmUgPSBYRlNfRElSX1NGX05FWFRFTlRSWShzZmUpOworCX0KKworCW9mZnNldCA9IChpbnQpKChjaGFyICopc2ZlIC0gKGNoYXIgKilzZik7CisJc2l6ZSA9IFhGU19ESVJfU0ZfRU5UU0laRV9CWU5BTUUoYXJncy0+bmFtZWxlbik7CisJeGZzX2lkYXRhX3JlYWxsb2MoZHAsIHNpemUsIFhGU19EQVRBX0ZPUkspOworCXNmID0gKHhmc19kaXJfc2hvcnRmb3JtX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOworCXNmZSA9ICh4ZnNfZGlyX3NmX2VudHJ5X3QgKikoKGNoYXIgKilzZiArIG9mZnNldCk7CisKKwlYRlNfRElSX1NGX1BVVF9ESVJJTk8oJmFyZ3MtPmludW1iZXIsICZzZmUtPmludW1iZXIpOworCXNmZS0+bmFtZWxlbiA9IGFyZ3MtPm5hbWVsZW47CisJbWVtY3B5KHNmZS0+bmFtZSwgYXJncy0+bmFtZSwgc2ZlLT5uYW1lbGVuKTsKKwlJTlRfTU9EKHNmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCwgKzEpOworCisJZHAtPmlfZC5kaV9zaXplICs9IHNpemU7CisJeGZzX3RyYW5zX2xvZ19pbm9kZShhcmdzLT50cmFucywgZHAsIFhGU19JTE9HX0NPUkUgfCBYRlNfSUxPR19EREFUQSk7CisKKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBSZW1vdmUgYSBuYW1lIGZyb20gdGhlIHNob3J0Zm9ybSBkaXJlY3Rvcnkgc3RydWN0dXJlLgorICovCitpbnQKK3hmc19kaXJfc2hvcnRmb3JtX3JlbW92ZW5hbWUoeGZzX2RhX2FyZ3NfdCAqYXJncykKK3sKKwl4ZnNfZGlyX3Nob3J0Zm9ybV90ICpzZjsKKwl4ZnNfZGlyX3NmX2VudHJ5X3QgKnNmZTsKKwlpbnQgYmFzZSwgc2l6ZSA9IDAsIGk7CisJeGZzX2lub2RlX3QgKmRwOworCisJZHAgPSBhcmdzLT5kcDsKKwlBU1NFUlQoZHAtPmlfZGYuaWZfZmxhZ3MgJiBYRlNfSUZJTkxJTkUpOworCS8qCisJICogQ2F0Y2ggdGhlIGNhc2Ugd2hlcmUgdGhlIGNvbnZlcnNpb24gZnJvbSBzaG9ydGZvcm0gdG8gbGVhZgorCSAqIGZhaWxlZCBwYXJ0IHdheSB0aHJvdWdoLgorCSAqLworCWlmIChkcC0+aV9kLmRpX3NpemUgPCBzaXplb2YoeGZzX2Rpcl9zZl9oZHJfdCkpIHsKKwkJQVNTRVJUKFhGU19GT1JDRURfU0hVVERPV04oZHAtPmlfbW91bnQpKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCX0KKwlBU1NFUlQoZHAtPmlfZGYuaWZfYnl0ZXMgPT0gZHAtPmlfZC5kaV9zaXplKTsKKwlBU1NFUlQoZHAtPmlfZGYuaWZfdTEuaWZfZGF0YSAhPSBOVUxMKTsKKwliYXNlID0gc2l6ZW9mKHhmc19kaXJfc2ZfaGRyX3QpOworCXNmID0gKHhmc19kaXJfc2hvcnRmb3JtX3QgKilkcC0+aV9kZi5pZl91MS5pZl9kYXRhOworCXNmZSA9ICZzZi0+bGlzdFswXTsKKwlmb3IgKGkgPSBJTlRfR0VUKHNmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCktMTsgaSA+PSAwOyBpLS0pIHsKKwkJc2l6ZSA9IFhGU19ESVJfU0ZfRU5UU0laRV9CWUVOVFJZKHNmZSk7CisJCWlmIChzZmUtPm5hbWVsZW4gPT0gYXJncy0+bmFtZWxlbiAmJgorCQkgICAgc2ZlLT5uYW1lWzBdID09IGFyZ3MtPm5hbWVbMF0gJiYKKwkJICAgIG1lbWNtcChzZmUtPm5hbWUsIGFyZ3MtPm5hbWUsIGFyZ3MtPm5hbWVsZW4pID09IDApCisJCQlicmVhazsKKwkJYmFzZSArPSBzaXplOworCQlzZmUgPSBYRlNfRElSX1NGX05FWFRFTlRSWShzZmUpOworCX0KKwlpZiAoaSA8IDApIHsKKwkJQVNTRVJUKGFyZ3MtPm9rbm9lbnQpOworCQlyZXR1cm4oWEZTX0VSUk9SKEVOT0VOVCkpOworCX0KKworCWlmICgoYmFzZSArIHNpemUpICE9IGRwLT5pX2QuZGlfc2l6ZSkgeworCQltZW1tb3ZlKCYoKGNoYXIgKilzZilbYmFzZV0sICYoKGNoYXIgKilzZilbYmFzZStzaXplXSwKKwkJCQkJICAgICAgZHAtPmlfZC5kaV9zaXplIC0gKGJhc2Urc2l6ZSkpOworCX0KKwlJTlRfTU9EKHNmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCwgLTEpOworCisJeGZzX2lkYXRhX3JlYWxsb2MoZHAsIC1zaXplLCBYRlNfREFUQV9GT1JLKTsKKwlkcC0+aV9kLmRpX3NpemUgLT0gc2l6ZTsKKwl4ZnNfdHJhbnNfbG9nX2lub2RlKGFyZ3MtPnRyYW5zLCBkcCwgWEZTX0lMT0dfQ09SRSB8IFhGU19JTE9HX0REQVRBKTsKKworCXJldHVybigwKTsKK30KKworLyoKKyAqIExvb2sgdXAgYSBuYW1lIGluIGEgc2hvcnRmb3JtIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuCisgKi8KK2ludAoreGZzX2Rpcl9zaG9ydGZvcm1fbG9va3VwKHhmc19kYV9hcmdzX3QgKmFyZ3MpCit7CisJeGZzX2Rpcl9zaG9ydGZvcm1fdCAqc2Y7CisJeGZzX2Rpcl9zZl9lbnRyeV90ICpzZmU7CisJaW50IGk7CisJeGZzX2lub2RlX3QgKmRwOworCisJZHAgPSBhcmdzLT5kcDsKKwlBU1NFUlQoZHAtPmlfZGYuaWZfZmxhZ3MgJiBYRlNfSUZJTkxJTkUpOworCS8qCisJICogQ2F0Y2ggdGhlIGNhc2Ugd2hlcmUgdGhlIGNvbnZlcnNpb24gZnJvbSBzaG9ydGZvcm0gdG8gbGVhZgorCSAqIGZhaWxlZCBwYXJ0IHdheSB0aHJvdWdoLgorCSAqLworCWlmIChkcC0+aV9kLmRpX3NpemUgPCBzaXplb2YoeGZzX2Rpcl9zZl9oZHJfdCkpIHsKKwkJQVNTRVJUKFhGU19GT1JDRURfU0hVVERPV04oZHAtPmlfbW91bnQpKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCX0KKwlBU1NFUlQoZHAtPmlfZGYuaWZfYnl0ZXMgPT0gZHAtPmlfZC5kaV9zaXplKTsKKwlBU1NFUlQoZHAtPmlfZGYuaWZfdTEuaWZfZGF0YSAhPSBOVUxMKTsKKwlzZiA9ICh4ZnNfZGlyX3Nob3J0Zm9ybV90ICopZHAtPmlfZGYuaWZfdTEuaWZfZGF0YTsKKwlpZiAoYXJncy0+bmFtZWxlbiA9PSAyICYmCisJICAgIGFyZ3MtPm5hbWVbMF0gPT0gJy4nICYmIGFyZ3MtPm5hbWVbMV0gPT0gJy4nKSB7CisJCVhGU19ESVJfU0ZfR0VUX0RJUklOTygmc2YtPmhkci5wYXJlbnQsICZhcmdzLT5pbnVtYmVyKTsKKwkJcmV0dXJuKFhGU19FUlJPUihFRVhJU1QpKTsKKwl9CisJaWYgKGFyZ3MtPm5hbWVsZW4gPT0gMSAmJiBhcmdzLT5uYW1lWzBdID09ICcuJykgeworCQlhcmdzLT5pbnVtYmVyID0gZHAtPmlfaW5vOworCQlyZXR1cm4oWEZTX0VSUk9SKEVFWElTVCkpOworCX0KKwlzZmUgPSAmc2YtPmxpc3RbMF07CisJZm9yIChpID0gSU5UX0dFVChzZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpLTE7IGkgPj0gMDsgaS0tKSB7CisJCWlmIChzZmUtPm5hbWVsZW4gPT0gYXJncy0+bmFtZWxlbiAmJgorCQkgICAgc2ZlLT5uYW1lWzBdID09IGFyZ3MtPm5hbWVbMF0gJiYKKwkJICAgIG1lbWNtcChhcmdzLT5uYW1lLCBzZmUtPm5hbWUsIGFyZ3MtPm5hbWVsZW4pID09IDApIHsKKwkJCVhGU19ESVJfU0ZfR0VUX0RJUklOTygmc2ZlLT5pbnVtYmVyLCAmYXJncy0+aW51bWJlcik7CisJCQlyZXR1cm4oWEZTX0VSUk9SKEVFWElTVCkpOworCQl9CisJCXNmZSA9IFhGU19ESVJfU0ZfTkVYVEVOVFJZKHNmZSk7CisJfQorCUFTU0VSVChhcmdzLT5va25vZW50KTsKKwlyZXR1cm4oWEZTX0VSUk9SKEVOT0VOVCkpOworfQorCisvKgorICogQ29udmVydCBmcm9tIHVzaW5nIHRoZSBzaG9ydGZvcm0gdG8gdGhlIGxlYWYuCisgKi8KK2ludAoreGZzX2Rpcl9zaG9ydGZvcm1fdG9fbGVhZih4ZnNfZGFfYXJnc190ICppYXJncykKK3sKKwl4ZnNfaW5vZGVfdCAqZHA7CisJeGZzX2Rpcl9zaG9ydGZvcm1fdCAqc2Y7CisJeGZzX2Rpcl9zZl9lbnRyeV90ICpzZmU7CisJeGZzX2RhX2FyZ3NfdCBhcmdzOworCXhmc19pbm9fdCBpbnVtYmVyOworCWNoYXIgKnRtcGJ1ZmZlcjsKKwlpbnQgcmV0dmFsLCBpLCBzaXplOworCXhmc19kYWJsa190IGJsa25vOworCXhmc19kYWJ1Zl90ICpicDsKKworCWRwID0gaWFyZ3MtPmRwOworCS8qCisJICogQ2F0Y2ggdGhlIGNhc2Ugd2hlcmUgdGhlIGNvbnZlcnNpb24gZnJvbSBzaG9ydGZvcm0gdG8gbGVhZgorCSAqIGZhaWxlZCBwYXJ0IHdheSB0aHJvdWdoLgorCSAqLworCWlmIChkcC0+aV9kLmRpX3NpemUgPCBzaXplb2YoeGZzX2Rpcl9zZl9oZHJfdCkpIHsKKwkJQVNTRVJUKFhGU19GT1JDRURfU0hVVERPV04oZHAtPmlfbW91bnQpKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCX0KKwlBU1NFUlQoZHAtPmlfZGYuaWZfYnl0ZXMgPT0gZHAtPmlfZC5kaV9zaXplKTsKKwlBU1NFUlQoZHAtPmlfZGYuaWZfdTEuaWZfZGF0YSAhPSBOVUxMKTsKKwlzaXplID0gZHAtPmlfZGYuaWZfYnl0ZXM7CisJdG1wYnVmZmVyID0ga21lbV9hbGxvYyhzaXplLCBLTV9TTEVFUCk7CisJQVNTRVJUKHRtcGJ1ZmZlciAhPSBOVUxMKTsKKworCW1lbWNweSh0bXBidWZmZXIsIGRwLT5pX2RmLmlmX3UxLmlmX2RhdGEsIHNpemUpOworCisJc2YgPSAoeGZzX2Rpcl9zaG9ydGZvcm1fdCAqKXRtcGJ1ZmZlcjsKKwlYRlNfRElSX1NGX0dFVF9ESVJJTk8oJnNmLT5oZHIucGFyZW50LCAmaW51bWJlcik7CisKKwl4ZnNfaWRhdGFfcmVhbGxvYyhkcCwgLXNpemUsIFhGU19EQVRBX0ZPUkspOworCWRwLT5pX2QuZGlfc2l6ZSA9IDA7CisJeGZzX3RyYW5zX2xvZ19pbm9kZShpYXJncy0+dHJhbnMsIGRwLCBYRlNfSUxPR19DT1JFKTsKKwlyZXR2YWwgPSB4ZnNfZGFfZ3Jvd19pbm9kZShpYXJncywgJmJsa25vKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dDsKKworCUFTU0VSVChibGtubyA9PSAwKTsKKwlyZXR2YWwgPSB4ZnNfZGlyX2xlYWZfY3JlYXRlKGlhcmdzLCBibGtubywgJmJwKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dDsKKwl4ZnNfZGFfYnVmX2RvbmUoYnApOworCisJYXJncy5uYW1lID0gIi4iOworCWFyZ3MubmFtZWxlbiA9IDE7CisJYXJncy5oYXNodmFsID0geGZzX2Rpcl9oYXNoX2RvdDsKKwlhcmdzLmludW1iZXIgPSBkcC0+aV9pbm87CisJYXJncy5kcCA9IGRwOworCWFyZ3MuZmlyc3RibG9jayA9IGlhcmdzLT5maXJzdGJsb2NrOworCWFyZ3MuZmxpc3QgPSBpYXJncy0+Zmxpc3Q7CisJYXJncy50b3RhbCA9IGlhcmdzLT50b3RhbDsKKwlhcmdzLndoaWNoZm9yayA9IFhGU19EQVRBX0ZPUks7CisJYXJncy50cmFucyA9IGlhcmdzLT50cmFuczsKKwlhcmdzLmp1c3RjaGVjayA9IDA7CisJYXJncy5hZGRuYW1lID0gYXJncy5va25vZW50ID0gMTsKKwlyZXR2YWwgPSB4ZnNfZGlyX2xlYWZfYWRkbmFtZSgmYXJncyk7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXQ7CisKKwlhcmdzLm5hbWUgPSAiLi4iOworCWFyZ3MubmFtZWxlbiA9IDI7CisJYXJncy5oYXNodmFsID0geGZzX2Rpcl9oYXNoX2RvdGRvdDsKKwlhcmdzLmludW1iZXIgPSBpbnVtYmVyOworCXJldHZhbCA9IHhmc19kaXJfbGVhZl9hZGRuYW1lKCZhcmdzKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dDsKKworCXNmZSA9ICZzZi0+bGlzdFswXTsKKwlmb3IgKGkgPSAwOyBpIDwgSU5UX0dFVChzZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOyBpKyspIHsKKwkJYXJncy5uYW1lID0gKGNoYXIgKikoc2ZlLT5uYW1lKTsKKwkJYXJncy5uYW1lbGVuID0gc2ZlLT5uYW1lbGVuOworCQlhcmdzLmhhc2h2YWwgPSB4ZnNfZGFfaGFzaG5hbWUoKGNoYXIgKikoc2ZlLT5uYW1lKSwKKwkJCQkJICAgICAgIHNmZS0+bmFtZWxlbik7CisJCVhGU19ESVJfU0ZfR0VUX0RJUklOTygmc2ZlLT5pbnVtYmVyLCAmYXJncy5pbnVtYmVyKTsKKwkJcmV0dmFsID0geGZzX2Rpcl9sZWFmX2FkZG5hbWUoJmFyZ3MpOworCQlpZiAocmV0dmFsKQorCQkJZ290byBvdXQ7CisJCXNmZSA9IFhGU19ESVJfU0ZfTkVYVEVOVFJZKHNmZSk7CisJfQorCXJldHZhbCA9IDA7CisKK291dDoKKwlrbWVtX2ZyZWUodG1wYnVmZmVyLCBzaXplKTsKKwlyZXR1cm4ocmV0dmFsKTsKK30KKworU1RBVElDIGludAoreGZzX2Rpcl9zaG9ydGZvcm1fY29tcGFyZShjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworCXhmc19kaXJfc2Zfc29ydF90ICpzYSwgKnNiOworCisJc2EgPSAoeGZzX2Rpcl9zZl9zb3J0X3QgKilhOworCXNiID0gKHhmc19kaXJfc2Zfc29ydF90ICopYjsKKwlpZiAoc2EtPmhhc2ggPCBzYi0+aGFzaCkKKwkJcmV0dXJuIC0xOworCWVsc2UgaWYgKHNhLT5oYXNoID4gc2ItPmhhc2gpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIHNhLT5lbnRubyAtIHNiLT5lbnRubzsKK30KKworLyoKKyAqIENvcHkgb3V0IGRpcmVjdG9yeSBlbnRyaWVzIGZvciBnZXRkZW50cygpLCBmb3Igc2hvcnRmb3JtIGRpcmVjdG9yaWVzLgorICovCisvKkFSR1NVU0VEKi8KK2ludAoreGZzX2Rpcl9zaG9ydGZvcm1fZ2V0ZGVudHMoeGZzX2lub2RlX3QgKmRwLCB1aW9fdCAqdWlvLCBpbnQgKmVvZnAsCisJCQkJICAgICAgIHhmc19kaXJlbnRfdCAqZGJwLCB4ZnNfZGlyX3B1dF90IHB1dCkKK3sKKwl4ZnNfZGlyX3Nob3J0Zm9ybV90ICpzZjsKKwl4ZnNfZGlyX3NmX2VudHJ5X3QgKnNmZTsKKwlpbnQgcmV0dmFsLCBpLCBzYnNpemUsIG5zYnVmLCBsYXN0cmVzaWQ9MCwgd2FudF9lbnRubzsKKwl4ZnNfbW91bnRfdCAqbXA7CisJeGZzX2RhaGFzaF90IGNvb2toYXNoLCBoYXNoOworCXhmc19kaXJfcHV0X2FyZ3NfdCBwOworCXhmc19kaXJfc2Zfc29ydF90ICpzYnVmLCAqc2JwOworCisJbXAgPSBkcC0+aV9tb3VudDsKKwlzZiA9ICh4ZnNfZGlyX3Nob3J0Zm9ybV90ICopZHAtPmlfZGYuaWZfdTEuaWZfZGF0YTsKKwljb29raGFzaCA9IFhGU19EQV9DT09LSUVfSEFTSChtcCwgdWlvLT51aW9fb2Zmc2V0KTsKKwl3YW50X2VudG5vID0gWEZTX0RBX0NPT0tJRV9FTlRSWShtcCwgdWlvLT51aW9fb2Zmc2V0KTsKKwluc2J1ZiA9IElOVF9HRVQoc2YtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSArIDI7CisJc2JzaXplID0gKG5zYnVmICsgMSkgKiBzaXplb2YoKnNidWYpOworCXNicCA9IHNidWYgPSBrbWVtX2FsbG9jKHNic2l6ZSwgS01fU0xFRVApOworCisJeGZzX2Rpcl90cmFjZV9nX2R1KCJzZjogc3RhcnQiLCBkcCwgdWlvKTsKKworCS8qCisJICogQ29sbGVjdCBhbGwgdGhlIGVudHJpZXMgaW50byB0aGUgYnVmZmVyLgorCSAqIEVudHJ5IDAgaXMgLgorCSAqLworCXNicC0+ZW50bm8gPSAwOworCXNicC0+c2Vxbm8gPSAwOworCXNicC0+aGFzaCA9IHhmc19kaXJfaGFzaF9kb3Q7CisJc2JwLT5pbm8gPSBkcC0+aV9pbm87CisJc2JwLT5uYW1lID0gIi4iOworCXNicC0+bmFtZWxlbiA9IDE7CisJc2JwKys7CisKKwkvKgorCSAqIEVudHJ5IDEgaXMgLi4KKwkgKi8KKwlzYnAtPmVudG5vID0gMTsKKwlzYnAtPnNlcW5vID0gMDsKKwlzYnAtPmhhc2ggPSB4ZnNfZGlyX2hhc2hfZG90ZG90OworCXNicC0+aW5vID0gWEZTX0dFVF9ESVJfSU5POChzZi0+aGRyLnBhcmVudCk7CisJc2JwLT5uYW1lID0gIi4uIjsKKwlzYnAtPm5hbWVsZW4gPSAyOworCXNicCsrOworCisJLyoKKwkgKiBTY2FuIHRoZSBkaXJlY3RvcnkgZGF0YSBmb3IgdGhlIHJlc3Qgb2YgdGhlIGVudHJpZXMuCisJICovCisJZm9yIChpID0gMCwgc2ZlID0gJnNmLT5saXN0WzBdOworCQkJaSA8IElOVF9HRVQoc2YtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKTsgaSsrKSB7CisKKwkJaWYgKHVubGlrZWx5KAorCQkgICAgKChjaGFyICopc2ZlIDwgKGNoYXIgKilzZikgfHwKKwkJICAgICgoY2hhciAqKXNmZSA+PSAoKGNoYXIgKilzZiArIGRwLT5pX2RmLmlmX2J5dGVzKSkpKSB7CisJCQl4ZnNfZGlyX3RyYWNlX2dfZHUoInNmOiBjb3JydXB0ZWQiLCBkcCwgdWlvKTsKKwkJCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4ZnNfZGlyX3Nob3J0Zm9ybV9nZXRkZW50cyIsCisJCQkJCSAgICAgWEZTX0VSUkxFVkVMX0xPVywgbXAsIHNmZSk7CisJCQlrbWVtX2ZyZWUoc2J1Ziwgc2JzaXplKTsKKwkJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwkJfQorCisJCXNicC0+ZW50bm8gPSBpICsgMjsKKwkJc2JwLT5zZXFubyA9IDA7CisJCXNicC0+aGFzaCA9IHhmc19kYV9oYXNobmFtZSgoY2hhciAqKXNmZS0+bmFtZSwgc2ZlLT5uYW1lbGVuKTsKKwkJc2JwLT5pbm8gPSBYRlNfR0VUX0RJUl9JTk84KHNmZS0+aW51bWJlcik7CisJCXNicC0+bmFtZSA9IChjaGFyICopc2ZlLT5uYW1lOworCQlzYnAtPm5hbWVsZW4gPSBzZmUtPm5hbWVsZW47CisJCXNmZSA9IFhGU19ESVJfU0ZfTkVYVEVOVFJZKHNmZSk7CisJCXNicCsrOworCX0KKworCS8qCisJICogU29ydCB0aGUgZW50cmllcyBvbiBoYXNoIHRoZW4gZW50bm8uCisJICovCisJcXNvcnQoc2J1ZiwgbnNidWYsIHNpemVvZigqc2J1ZiksIHhmc19kaXJfc2hvcnRmb3JtX2NvbXBhcmUpOworCS8qCisJICogU3R1ZmYgaW4gbGFzdCBlbnRyeS4KKwkgKi8KKwlzYnAtPmVudG5vID0gbnNidWY7CisJc2JwLT5oYXNoID0gWEZTX0RBX01BWEhBU0g7CisJc2JwLT5zZXFubyA9IDA7CisJLyoKKwkgKiBGaWd1cmUgb3V0IHRoZSBzZXF1ZW5jZSBudW1iZXJzIGluIGNhc2UgdGhlcmUncyBhIGhhc2ggZHVwbGljYXRlLgorCSAqLworCWZvciAoaGFzaCA9IHNidWYtPmhhc2gsIHNicCA9IHNidWYgKyAxOworCQkJCXNicCA8ICZzYnVmW25zYnVmICsgMV07IHNicCsrKSB7CisJCWlmIChzYnAtPmhhc2ggPT0gaGFzaCkKKwkJCXNicC0+c2Vxbm8gPSBzYnBbLTFdLnNlcW5vICsgMTsKKwkJZWxzZQorCQkJaGFzaCA9IHNicC0+aGFzaDsKKwl9CisKKwkvKgorCSAqIFNldCB1cCBwdXQgcm91dGluZS4KKwkgKi8KKwlwLmRicCA9IGRicDsKKwlwLnB1dCA9IHB1dDsKKwlwLnVpbyA9IHVpbzsKKworCS8qCisJICogRmluZCBvdXIgcGxhY2UuCisJICovCisJZm9yIChzYnAgPSBzYnVmOyBzYnAgPCAmc2J1Zltuc2J1ZiArIDFdOyBzYnArKykgeworCQlpZiAoc2JwLT5oYXNoID4gY29va2hhc2ggfHwKKwkJICAgIChzYnAtPmhhc2ggPT0gY29va2hhc2ggJiYgc2JwLT5zZXFubyA+PSB3YW50X2VudG5vKSkKKwkJCWJyZWFrOworCX0KKworCS8qCisJICogRGlkIHdlIGZhaWwgdG8gZmluZCBhbnl0aGluZz8gIFdlIHN0b3AgYXQgdGhlIGxhc3QgZW50cnksCisJICogdGhlIG9uZSB3ZSBwdXQgbWF4aGFzaCBpbnRvLgorCSAqLworCWlmIChzYnAgPT0gJnNidWZbbnNidWZdKSB7CisJCWttZW1fZnJlZShzYnVmLCBzYnNpemUpOworCQl4ZnNfZGlyX3RyYWNlX2dfZHUoInNmOiBoYXNoIGJleW9uZCBlbmQiLCBkcCwgdWlvKTsKKwkJdWlvLT51aW9fb2Zmc2V0ID0gWEZTX0RBX01BS0VfQ09PS0lFKG1wLCAwLCAwLCBYRlNfREFfTUFYSEFTSCk7CisJCSplb2ZwID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBMb29wIHB1dHRpbmcgZW50cmllcyBpbnRvIHRoZSB1c2VyIGJ1ZmZlci4KKwkgKi8KKwl3aGlsZSAoc2JwIDwgJnNidWZbbnNidWZdKSB7CisJCS8qCisJCSAqIFNhdmUgdGhlIGZpcnN0IHJlc2lkIGluIGEgcnVuIG9mIGVxdWFsLWhhc2h2YWwgZW50cmllcworCQkgKiBzbyB0aGF0IHdlIGNhbiBiYWNrIHRoZW0gb3V0IGlmIHRoZXkgZG9uJ3QgYWxsIGZpdC4KKwkJICovCisJCWlmIChzYnAtPnNlcW5vID09IDAgfHwgc2JwID09IHNidWYpCisJCQlsYXN0cmVzaWQgPSB1aW8tPnVpb19yZXNpZDsKKwkJWEZTX1BVVF9DT09LSUUocC5jb29rLCBtcCwgMCwgc2JwWzFdLnNlcW5vLCBzYnBbMV0uaGFzaCk7CisJCXAuaW5vID0gc2JwLT5pbm87CisjaWYgWEZTX0JJR19JTlVNUworCQlwLmlubyArPSBtcC0+bV9pbm9hZGQ7CisjZW5kaWYKKwkJcC5uYW1lID0gc2JwLT5uYW1lOworCQlwLm5hbWVsZW4gPSBzYnAtPm5hbWVsZW47CisJCXJldHZhbCA9IHAucHV0KCZwKTsKKwkJaWYgKCFwLmRvbmUpIHsKKwkJCXVpby0+dWlvX29mZnNldCA9CisJCQkJWEZTX0RBX01BS0VfQ09PS0lFKG1wLCAwLCAwLCBzYnAtPmhhc2gpOworCQkJa21lbV9mcmVlKHNidWYsIHNic2l6ZSk7CisJCQl1aW8tPnVpb19yZXNpZCA9IGxhc3RyZXNpZDsKKwkJCXhmc19kaXJfdHJhY2VfZ19kdSgic2Y6IEUtTy1CIiwgZHAsIHVpbyk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCXNicCsrOworCX0KKwlrbWVtX2ZyZWUoc2J1Ziwgc2JzaXplKTsKKwl1aW8tPnVpb19vZmZzZXQgPSBwLmNvb2subzsKKwkqZW9mcCA9IDE7CisJeGZzX2Rpcl90cmFjZV9nX2R1KCJzZjogRS1PLUYiLCBkcCwgdWlvKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIExvb2sgdXAgYSBuYW1lIGluIGEgc2hvcnRmb3JtIGRpcmVjdG9yeSBzdHJ1Y3R1cmUsIHJlcGxhY2UgdGhlIGlub2RlIG51bWJlci4KKyAqLworaW50Cit4ZnNfZGlyX3Nob3J0Zm9ybV9yZXBsYWNlKHhmc19kYV9hcmdzX3QgKmFyZ3MpCit7CisJeGZzX2Rpcl9zaG9ydGZvcm1fdCAqc2Y7CisJeGZzX2Rpcl9zZl9lbnRyeV90ICpzZmU7CisJeGZzX2lub2RlX3QgKmRwOworCWludCBpOworCisJZHAgPSBhcmdzLT5kcDsKKwlBU1NFUlQoZHAtPmlfZGYuaWZfZmxhZ3MgJiBYRlNfSUZJTkxJTkUpOworCS8qCisJICogQ2F0Y2ggdGhlIGNhc2Ugd2hlcmUgdGhlIGNvbnZlcnNpb24gZnJvbSBzaG9ydGZvcm0gdG8gbGVhZgorCSAqIGZhaWxlZCBwYXJ0IHdheSB0aHJvdWdoLgorCSAqLworCWlmIChkcC0+aV9kLmRpX3NpemUgPCBzaXplb2YoeGZzX2Rpcl9zZl9oZHJfdCkpIHsKKwkJQVNTRVJUKFhGU19GT1JDRURfU0hVVERPV04oZHAtPmlfbW91bnQpKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCX0KKwlBU1NFUlQoZHAtPmlfZGYuaWZfYnl0ZXMgPT0gZHAtPmlfZC5kaV9zaXplKTsKKwlBU1NFUlQoZHAtPmlfZGYuaWZfdTEuaWZfZGF0YSAhPSBOVUxMKTsKKwlzZiA9ICh4ZnNfZGlyX3Nob3J0Zm9ybV90ICopZHAtPmlfZGYuaWZfdTEuaWZfZGF0YTsKKwlpZiAoYXJncy0+bmFtZWxlbiA9PSAyICYmCisJICAgIGFyZ3MtPm5hbWVbMF0gPT0gJy4nICYmIGFyZ3MtPm5hbWVbMV0gPT0gJy4nKSB7CisJCS8qIFhYWCAtIHJlcGxhY2UgYXNzZXJ0PyAqLworCQlYRlNfRElSX1NGX1BVVF9ESVJJTk8oJmFyZ3MtPmludW1iZXIsICZzZi0+aGRyLnBhcmVudCk7CisJCXhmc190cmFuc19sb2dfaW5vZGUoYXJncy0+dHJhbnMsIGRwLCBYRlNfSUxPR19EREFUQSk7CisJCXJldHVybigwKTsKKwl9CisJQVNTRVJUKGFyZ3MtPm5hbWVsZW4gIT0gMSB8fCBhcmdzLT5uYW1lWzBdICE9ICcuJyk7CisJc2ZlID0gJnNmLT5saXN0WzBdOworCWZvciAoaSA9IElOVF9HRVQoc2YtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKS0xOyBpID49IDA7IGktLSkgeworCQlpZiAoc2ZlLT5uYW1lbGVuID09IGFyZ3MtPm5hbWVsZW4gJiYKKwkJICAgIHNmZS0+bmFtZVswXSA9PSBhcmdzLT5uYW1lWzBdICYmCisJCSAgICBtZW1jbXAoYXJncy0+bmFtZSwgc2ZlLT5uYW1lLCBhcmdzLT5uYW1lbGVuKSA9PSAwKSB7CisJCQlBU1NFUlQobWVtY21wKChjaGFyICopJmFyZ3MtPmludW1iZXIsCisJCQkJKGNoYXIgKikmc2ZlLT5pbnVtYmVyLCBzaXplb2YoeGZzX2lub190KSkpOworCQkJWEZTX0RJUl9TRl9QVVRfRElSSU5PKCZhcmdzLT5pbnVtYmVyLCAmc2ZlLT5pbnVtYmVyKTsKKwkJCXhmc190cmFuc19sb2dfaW5vZGUoYXJncy0+dHJhbnMsIGRwLCBYRlNfSUxPR19EREFUQSk7CisJCQlyZXR1cm4oMCk7CisJCX0KKwkJc2ZlID0gWEZTX0RJUl9TRl9ORVhURU5UUlkoc2ZlKTsKKwl9CisJQVNTRVJUKGFyZ3MtPm9rbm9lbnQpOworCXJldHVybihYRlNfRVJST1IoRU5PRU5UKSk7Cit9CisKKy8qCisgKiBDb252ZXJ0IGEgbGVhZiBkaXJlY3RvcnkgdG8gc2hvcnRmb3JtIHN0cnVjdHVyZQorICovCitpbnQKK3hmc19kaXJfbGVhZl90b19zaG9ydGZvcm0oeGZzX2RhX2FyZ3NfdCAqaWFyZ3MpCit7CisJeGZzX2Rpcl9sZWFmYmxvY2tfdCAqbGVhZjsKKwl4ZnNfZGlyX2xlYWZfaGRyX3QgKmhkcjsKKwl4ZnNfZGlyX2xlYWZfZW50cnlfdCAqZW50cnk7CisJeGZzX2Rpcl9sZWFmX25hbWVfdCAqbmFtZXN0OworCXhmc19kYV9hcmdzX3QgYXJnczsKKwl4ZnNfaW5vZGVfdCAqZHA7CisJeGZzX2lub190IHBhcmVudDsKKwljaGFyICp0bXBidWZmZXI7CisJaW50IHJldHZhbCwgaTsKKwl4ZnNfZGFidWZfdCAqYnA7CisKKwlkcCA9IGlhcmdzLT5kcDsKKwl0bXBidWZmZXIgPSBrbWVtX2FsbG9jKFhGU19MQlNJWkUoZHAtPmlfbW91bnQpLCBLTV9TTEVFUCk7CisJQVNTRVJUKHRtcGJ1ZmZlciAhPSBOVUxMKTsKKworCXJldHZhbCA9IHhmc19kYV9yZWFkX2J1ZihpYXJncy0+dHJhbnMsIGlhcmdzLT5kcCwgMCwgLTEsICZicCwKKwkJCQkJICAgICAgIFhGU19EQVRBX0ZPUkspOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0OworCUFTU0VSVChicCAhPSBOVUxMKTsKKwltZW1jcHkodG1wYnVmZmVyLCBicC0+ZGF0YSwgWEZTX0xCU0laRShkcC0+aV9tb3VudCkpOworCWxlYWYgPSAoeGZzX2Rpcl9sZWFmYmxvY2tfdCAqKXRtcGJ1ZmZlcjsKKwlBU1NFUlQoSU5UX0dFVChsZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSX0xFQUZfTUFHSUMpOworCW1lbXNldChicC0+ZGF0YSwgMCwgWEZTX0xCU0laRShkcC0+aV9tb3VudCkpOworCisJLyoKKwkgKiBGaW5kIGFuZCBzcGVjaWFsIGNhc2UgdGhlIHBhcmVudCBpbm9kZSBudW1iZXIKKwkgKi8KKwloZHIgPSAmbGVhZi0+aGRyOworCWVudHJ5ID0gJmxlYWYtPmVudHJpZXNbMF07CisJZm9yIChpID0gSU5UX0dFVChoZHItPmNvdW50LCBBUkNIX0NPTlZFUlQpLTE7IGkgPj0gMDsgZW50cnkrKywgaS0tKSB7CisJCW5hbWVzdCA9IFhGU19ESVJfTEVBRl9OQU1FU1RSVUNUKGxlYWYsIElOVF9HRVQoZW50cnktPm5hbWVpZHgsIEFSQ0hfQ09OVkVSVCkpOworCQlpZiAoKGVudHJ5LT5uYW1lbGVuID09IDIpICYmCisJCSAgICAobmFtZXN0LT5uYW1lWzBdID09ICcuJykgJiYKKwkJICAgIChuYW1lc3QtPm5hbWVbMV0gPT0gJy4nKSkgeworCQkJWEZTX0RJUl9TRl9HRVRfRElSSU5PKCZuYW1lc3QtPmludW1iZXIsICZwYXJlbnQpOworCQkJZW50cnktPm5hbWVpZHggPSAwOworCQl9IGVsc2UgaWYgKChlbnRyeS0+bmFtZWxlbiA9PSAxKSAmJiAobmFtZXN0LT5uYW1lWzBdID09ICcuJykpIHsKKwkJCWVudHJ5LT5uYW1laWR4ID0gMDsKKwkJfQorCX0KKwlyZXR2YWwgPSB4ZnNfZGFfc2hyaW5rX2lub2RlKGlhcmdzLCAwLCBicCk7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXQ7CisJcmV0dmFsID0geGZzX2Rpcl9zaG9ydGZvcm1fY3JlYXRlKGlhcmdzLCBwYXJlbnQpOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBDb3B5IHRoZSByZXN0IG9mIHRoZSBmaWxlbmFtZXMKKwkgKi8KKwllbnRyeSA9ICZsZWFmLT5lbnRyaWVzWzBdOworCWFyZ3MuZHAgPSBkcDsKKwlhcmdzLmZpcnN0YmxvY2sgPSBpYXJncy0+Zmlyc3RibG9jazsKKwlhcmdzLmZsaXN0ID0gaWFyZ3MtPmZsaXN0OworCWFyZ3MudG90YWwgPSBpYXJncy0+dG90YWw7CisJYXJncy53aGljaGZvcmsgPSBYRlNfREFUQV9GT1JLOworCWFyZ3MudHJhbnMgPSBpYXJncy0+dHJhbnM7CisJYXJncy5qdXN0Y2hlY2sgPSAwOworCWFyZ3MuYWRkbmFtZSA9IGFyZ3Mub2tub2VudCA9IDE7CisJZm9yIChpID0gMDsgaSA8IElOVF9HRVQoaGRyLT5jb3VudCwgQVJDSF9DT05WRVJUKTsgZW50cnkrKywgaSsrKSB7CisJCWlmICghZW50cnktPm5hbWVpZHgpCisJCQljb250aW51ZTsKKwkJbmFtZXN0ID0gWEZTX0RJUl9MRUFGX05BTUVTVFJVQ1QobGVhZiwgSU5UX0dFVChlbnRyeS0+bmFtZWlkeCwgQVJDSF9DT05WRVJUKSk7CisJCWFyZ3MubmFtZSA9IChjaGFyICopKG5hbWVzdC0+bmFtZSk7CisJCWFyZ3MubmFtZWxlbiA9IGVudHJ5LT5uYW1lbGVuOworCQlhcmdzLmhhc2h2YWwgPSBJTlRfR0VUKGVudHJ5LT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpOworCQlYRlNfRElSX1NGX0dFVF9ESVJJTk8oJm5hbWVzdC0+aW51bWJlciwgJmFyZ3MuaW51bWJlcik7CisJCXhmc19kaXJfc2hvcnRmb3JtX2FkZG5hbWUoJmFyZ3MpOworCX0KKworb3V0OgorCWttZW1fZnJlZSh0bXBidWZmZXIsIFhGU19MQlNJWkUoZHAtPmlfbW91bnQpKTsKKwlyZXR1cm4ocmV0dmFsKTsKK30KKworLyoKKyAqIENvbnZlcnQgZnJvbSB1c2luZyBhIHNpbmdsZSBsZWFmIHRvIGEgcm9vdCBub2RlIGFuZCBhIGxlYWYuCisgKi8KK2ludAoreGZzX2Rpcl9sZWFmX3RvX25vZGUoeGZzX2RhX2FyZ3NfdCAqYXJncykKK3sKKwl4ZnNfZGlyX2xlYWZibG9ja190ICpsZWFmOworCXhmc19kYV9pbnRub2RlX3QgKm5vZGU7CisJeGZzX2lub2RlX3QgKmRwOworCXhmc19kYWJ1Zl90ICpicDEsICpicDI7CisJeGZzX2RhYmxrX3QgYmxrbm87CisJaW50IHJldHZhbDsKKworCWRwID0gYXJncy0+ZHA7CisJcmV0dmFsID0geGZzX2RhX2dyb3dfaW5vZGUoYXJncywgJmJsa25vKTsKKwlBU1NFUlQoYmxrbm8gPT0gMSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuKHJldHZhbCk7CisJcmV0dmFsID0geGZzX2RhX3JlYWRfYnVmKGFyZ3MtPnRyYW5zLCBhcmdzLT5kcCwgMCwgLTEsICZicDEsCisJCQkJCSAgICAgIFhGU19EQVRBX0ZPUkspOworCWlmIChyZXR2YWwpCisJCXJldHVybihyZXR2YWwpOworCUFTU0VSVChicDEgIT0gTlVMTCk7CisJcmV0dmFsID0geGZzX2RhX2dldF9idWYoYXJncy0+dHJhbnMsIGFyZ3MtPmRwLCAxLCAtMSwgJmJwMiwKKwkJCQkJICAgICBYRlNfREFUQV9GT1JLKTsKKwlpZiAocmV0dmFsKSB7CisJCXhmc19kYV9idWZfZG9uZShicDEpOworCQlyZXR1cm4ocmV0dmFsKTsKKwl9CisJQVNTRVJUKGJwMiAhPSBOVUxMKTsKKwltZW1jcHkoYnAyLT5kYXRhLCBicDEtPmRhdGEsIFhGU19MQlNJWkUoZHAtPmlfbW91bnQpKTsKKwl4ZnNfZGFfYnVmX2RvbmUoYnAxKTsKKwl4ZnNfZGFfbG9nX2J1ZihhcmdzLT50cmFucywgYnAyLCAwLCBYRlNfTEJTSVpFKGRwLT5pX21vdW50KSAtIDEpOworCisJLyoKKwkgKiBTZXQgdXAgdGhlIG5ldyByb290IG5vZGUuCisJICovCisJcmV0dmFsID0geGZzX2RhX25vZGVfY3JlYXRlKGFyZ3MsIDAsIDEsICZicDEsIFhGU19EQVRBX0ZPUkspOworCWlmIChyZXR2YWwpIHsKKwkJeGZzX2RhX2J1Zl9kb25lKGJwMik7CisJCXJldHVybihyZXR2YWwpOworCX0KKwlub2RlID0gYnAxLT5kYXRhOworCWxlYWYgPSBicDItPmRhdGE7CisJQVNTRVJUKElOVF9HRVQobGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUl9MRUFGX01BR0lDKTsKKwlJTlRfU0VUKG5vZGUtPmJ0cmVlWzBdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCwgSU5UX0dFVChsZWFmLT5lbnRyaWVzWyBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKS0xIF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSk7CisJeGZzX2RhX2J1Zl9kb25lKGJwMik7CisJSU5UX1NFVChub2RlLT5idHJlZVswXS5iZWZvcmUsIEFSQ0hfQ09OVkVSVCwgYmxrbm8pOworCUlOVF9TRVQobm9kZS0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQsIDEpOworCXhmc19kYV9sb2dfYnVmKGFyZ3MtPnRyYW5zLCBicDEsCisJCVhGU19EQV9MT0dSQU5HRShub2RlLCAmbm9kZS0+YnRyZWVbMF0sIHNpemVvZihub2RlLT5idHJlZVswXSkpKTsKKwl4ZnNfZGFfYnVmX2RvbmUoYnAxKTsKKworCXJldHVybihyZXR2YWwpOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSb3V0aW5lcyB1c2VkIGZvciBncm93aW5nIHRoZSBCdHJlZS4KKyAqPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoKKyAqIENyZWF0ZSB0aGUgaW5pdGlhbCBjb250ZW50cyBvZiBhIGxlYWYgZGlyZWN0b3J5CisgKiBvciBhIGxlYWYgaW4gYSBub2RlIGRpcmVjdG9yeS4KKyAqLworaW50Cit4ZnNfZGlyX2xlYWZfY3JlYXRlKHhmc19kYV9hcmdzX3QgKmFyZ3MsIHhmc19kYWJsa190IGJsa25vLCB4ZnNfZGFidWZfdCAqKmJwcCkKK3sKKwl4ZnNfZGlyX2xlYWZibG9ja190ICpsZWFmOworCXhmc19kaXJfbGVhZl9oZHJfdCAqaGRyOworCXhmc19pbm9kZV90ICpkcDsKKwl4ZnNfZGFidWZfdCAqYnA7CisJaW50IHJldHZhbDsKKworCWRwID0gYXJncy0+ZHA7CisJQVNTRVJUKGRwICE9IE5VTEwpOworCXJldHZhbCA9IHhmc19kYV9nZXRfYnVmKGFyZ3MtPnRyYW5zLCBkcCwgYmxrbm8sIC0xLCAmYnAsIFhGU19EQVRBX0ZPUkspOworCWlmIChyZXR2YWwpCisJCXJldHVybihyZXR2YWwpOworCUFTU0VSVChicCAhPSBOVUxMKTsKKwlsZWFmID0gYnAtPmRhdGE7CisJbWVtc2V0KChjaGFyICopbGVhZiwgMCwgWEZTX0xCU0laRShkcC0+aV9tb3VudCkpOworCWhkciA9ICZsZWFmLT5oZHI7CisJSU5UX1NFVChoZHItPmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCwgWEZTX0RJUl9MRUFGX01BR0lDKTsKKwlJTlRfU0VUKGhkci0+Zmlyc3R1c2VkLCBBUkNIX0NPTlZFUlQsIFhGU19MQlNJWkUoZHAtPmlfbW91bnQpKTsKKwlpZiAoIWhkci0+Zmlyc3R1c2VkKQorCQlJTlRfU0VUKGhkci0+Zmlyc3R1c2VkLCBBUkNIX0NPTlZFUlQsIFhGU19MQlNJWkUoZHAtPmlfbW91bnQpIC0gMSk7CisJSU5UX1NFVChoZHItPmZyZWVtYXBbMF0uYmFzZSwgQVJDSF9DT05WRVJULCBzaXplb2YoeGZzX2Rpcl9sZWFmX2hkcl90KSk7CisJSU5UX1NFVChoZHItPmZyZWVtYXBbMF0uc2l6ZSwgQVJDSF9DT05WRVJULCBJTlRfR0VUKGhkci0+Zmlyc3R1c2VkLCBBUkNIX0NPTlZFUlQpIC0gSU5UX0dFVChoZHItPmZyZWVtYXBbMF0uYmFzZSwgQVJDSF9DT05WRVJUKSk7CisKKwl4ZnNfZGFfbG9nX2J1ZihhcmdzLT50cmFucywgYnAsIDAsIFhGU19MQlNJWkUoZHAtPmlfbW91bnQpIC0gMSk7CisKKwkqYnBwID0gYnA7CisJcmV0dXJuKDApOworfQorCisvKgorICogU3BsaXQgdGhlIGxlYWYgbm9kZSwgcmViYWxhbmNlLCB0aGVuIGFkZCB0aGUgbmV3IGVudHJ5LgorICovCitpbnQKK3hmc19kaXJfbGVhZl9zcGxpdCh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUsIHhmc19kYV9zdGF0ZV9ibGtfdCAqb2xkYmxrLAorCQkJCSAgeGZzX2RhX3N0YXRlX2Jsa190ICpuZXdibGspCit7CisJeGZzX2RhYmxrX3QgYmxrbm87CisJeGZzX2RhX2FyZ3NfdCAqYXJnczsKKwlpbnQgZXJyb3I7CisKKwkvKgorCSAqIEFsbG9jYXRlIHNwYWNlIGZvciBhIG5ldyBsZWFmIG5vZGUuCisJICovCisJYXJncyA9IHN0YXRlLT5hcmdzOworCUFTU0VSVChhcmdzICE9IE5VTEwpOworCUFTU0VSVChvbGRibGstPm1hZ2ljID09IFhGU19ESVJfTEVBRl9NQUdJQyk7CisJZXJyb3IgPSB4ZnNfZGFfZ3Jvd19pbm9kZShhcmdzLCAmYmxrbm8pOworCWlmIChlcnJvcikKKwkJcmV0dXJuKGVycm9yKTsKKwllcnJvciA9IHhmc19kaXJfbGVhZl9jcmVhdGUoYXJncywgYmxrbm8sICZuZXdibGstPmJwKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybihlcnJvcik7CisJbmV3YmxrLT5ibGtubyA9IGJsa25vOworCW5ld2Jsay0+bWFnaWMgPSBYRlNfRElSX0xFQUZfTUFHSUM7CisKKwkvKgorCSAqIFJlYmFsYW5jZSB0aGUgZW50cmllcyBhY3Jvc3MgdGhlIHR3byBsZWF2ZXMuCisJICovCisJeGZzX2Rpcl9sZWFmX3JlYmFsYW5jZShzdGF0ZSwgb2xkYmxrLCBuZXdibGspOworCWVycm9yID0geGZzX2RhX2Jsa19saW5rKHN0YXRlLCBvbGRibGssIG5ld2Jsayk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4oZXJyb3IpOworCisJLyoKKwkgKiBJbnNlcnQgdGhlIG5ldyBlbnRyeSBpbiB0aGUgY29ycmVjdCBibG9jay4KKwkgKi8KKwlpZiAoc3RhdGUtPmlubGVhZikgeworCQllcnJvciA9IHhmc19kaXJfbGVhZl9hZGQob2xkYmxrLT5icCwgYXJncywgb2xkYmxrLT5pbmRleCk7CisJfSBlbHNlIHsKKwkJZXJyb3IgPSB4ZnNfZGlyX2xlYWZfYWRkKG5ld2Jsay0+YnAsIGFyZ3MsIG5ld2Jsay0+aW5kZXgpOworCX0KKworCS8qCisJICogVXBkYXRlIGxhc3QgaGFzaHZhbCBpbiBlYWNoIGJsb2NrIHNpbmNlIHdlIGFkZGVkIHRoZSBuYW1lLgorCSAqLworCW9sZGJsay0+aGFzaHZhbCA9IHhmc19kaXJfbGVhZl9sYXN0aGFzaChvbGRibGstPmJwLCBOVUxMKTsKKwluZXdibGstPmhhc2h2YWwgPSB4ZnNfZGlyX2xlYWZfbGFzdGhhc2gobmV3YmxrLT5icCwgTlVMTCk7CisJcmV0dXJuKGVycm9yKTsKK30KKworLyoKKyAqIEFkZCBhIG5hbWUgdG8gdGhlIGxlYWYgZGlyZWN0b3J5IHN0cnVjdHVyZS4KKyAqCisgKiBNdXN0IHRha2UgaW50byBhY2NvdW50IGZyYWdtZW50ZWQgbGVhdmVzIGFuZCBsZWF2ZXMgd2hlcmUgc3BhY2VtYXAgaGFzCisgKiBsb3N0IHNvbWUgZnJlZXNwYWNlIGluZm9ybWF0aW9uIChpZTogaG9sZXMpLgorICovCitpbnQKK3hmc19kaXJfbGVhZl9hZGQoeGZzX2RhYnVmX3QgKmJwLCB4ZnNfZGFfYXJnc190ICphcmdzLCBpbnQgaW5kZXgpCit7CisJeGZzX2Rpcl9sZWFmYmxvY2tfdCAqbGVhZjsKKwl4ZnNfZGlyX2xlYWZfaGRyX3QgKmhkcjsKKwl4ZnNfZGlyX2xlYWZfbWFwX3QgKm1hcDsKKwlpbnQgdGFibGVzaXplLCBlbnRzaXplLCBzdW0sIGksIHRtcCwgZXJyb3I7CisKKwlsZWFmID0gYnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQobGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUl9MRUFGX01BR0lDKTsKKwlBU1NFUlQoKGluZGV4ID49IDApICYmIChpbmRleCA8PSBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSkpOworCWhkciA9ICZsZWFmLT5oZHI7CisJZW50c2l6ZSA9IFhGU19ESVJfTEVBRl9FTlRTSVpFX0JZTkFNRShhcmdzLT5uYW1lbGVuKTsKKworCS8qCisJICogU2VhcmNoIHRocm91Z2ggZnJlZW1hcCBmb3IgZmlyc3QtZml0IG9uIG5ldyBuYW1lIGxlbmd0aC4KKwkgKiAobWF5IG5lZWQgdG8gZmlndXJlIGluIHNpemUgb2YgZW50cnkgc3RydWN0IHRvbykKKwkgKi8KKwl0YWJsZXNpemUgPSAoSU5UX0dFVChoZHItPmNvdW50LCBBUkNIX0NPTlZFUlQpICsgMSkgKiAodWludClzaXplb2YoeGZzX2Rpcl9sZWFmX2VudHJ5X3QpCisJCQkrICh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfaGRyX3QpOworCW1hcCA9ICZoZHItPmZyZWVtYXBbWEZTX0RJUl9MRUFGX01BUFNJWkUtMV07CisJZm9yIChzdW0gPSAwLCBpID0gWEZTX0RJUl9MRUFGX01BUFNJWkUtMTsgaSA+PSAwOyBtYXAtLSwgaS0tKSB7CisJCWlmICh0YWJsZXNpemUgPiBJTlRfR0VUKGhkci0+Zmlyc3R1c2VkLCBBUkNIX0NPTlZFUlQpKSB7CisJCQlzdW0gKz0gSU5UX0dFVChtYXAtPnNpemUsIEFSQ0hfQ09OVkVSVCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIW1hcC0+c2l6ZSkKKwkJCWNvbnRpbnVlOwkvKiBubyBzcGFjZSBpbiB0aGlzIG1hcCAqLworCQl0bXAgPSBlbnRzaXplOworCQlpZiAoSU5UX0dFVChtYXAtPmJhc2UsIEFSQ0hfQ09OVkVSVCkgPCBJTlRfR0VUKGhkci0+Zmlyc3R1c2VkLCBBUkNIX0NPTlZFUlQpKQorCQkJdG1wICs9ICh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfZW50cnlfdCk7CisJCWlmIChJTlRfR0VUKG1hcC0+c2l6ZSwgQVJDSF9DT05WRVJUKSA+PSB0bXApIHsKKwkJCWlmICghYXJncy0+anVzdGNoZWNrKQorCQkJCXhmc19kaXJfbGVhZl9hZGRfd29yayhicCwgYXJncywgaW5kZXgsIGkpOworCQkJcmV0dXJuKDApOworCQl9CisJCXN1bSArPSBJTlRfR0VUKG1hcC0+c2l6ZSwgQVJDSF9DT05WRVJUKTsKKwl9CisKKwkvKgorCSAqIElmIHRoZXJlIGFyZSBubyBob2xlcyBpbiB0aGUgYWRkcmVzcyBzcGFjZSBvZiB0aGUgYmxvY2ssCisJICogYW5kIHdlIGRvbid0IGhhdmUgZW5vdWdoIGZyZWVzcGFjZSwgdGhlbiBjb21wYWN0aW9uIHdpbGwgZG8gdXMKKwkgKiBubyBnb29kIGFuZCB3ZSBzaG91bGQganVzdCBnaXZlIHVwLgorCSAqLworCWlmICghaGRyLT5ob2xlcyAmJiAoc3VtIDwgZW50c2l6ZSkpCisJCXJldHVybihYRlNfRVJST1IoRU5PU1BDKSk7CisKKwkvKgorCSAqIENvbXBhY3QgdGhlIGVudHJpZXMgdG8gY29hbGVzY2UgZnJlZSBzcGFjZS4KKwkgKiBQYXNzIHRoZSBqdXN0Y2hlY2sgZmxhZyBzbyB0aGUgY2hlY2tpbmcgcGFzcyBjYW4gcmV0dXJuCisJICogYW4gZXJyb3IsIHdpdGhvdXQgY2hhbmdpbmcgYW55dGhpbmcsIGlmIGl0IHdvbid0IGZpdC4KKwkgKi8KKwllcnJvciA9IHhmc19kaXJfbGVhZl9jb21wYWN0KGFyZ3MtPnRyYW5zLCBicCwKKwkJCWFyZ3MtPnRvdGFsID09IDAgPworCQkJCWVudHNpemUgKworCQkJCSh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfZW50cnlfdCkgOiAwLAorCQkJYXJncy0+anVzdGNoZWNrKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybihlcnJvcik7CisJLyoKKwkgKiBBZnRlciBjb21wYWN0aW9uLCB0aGUgYmxvY2sgaXMgZ3VhcmFudGVlZCB0byBoYXZlIG9ubHkgb25lCisJICogZnJlZSByZWdpb24sIGluIGZyZWVtYXBbMF0uICBJZiBpdCBpcyBub3QgYmlnIGVub3VnaCwgZ2l2ZSB1cC4KKwkgKi8KKwlpZiAoSU5UX0dFVChoZHItPmZyZWVtYXBbMF0uc2l6ZSwgQVJDSF9DT05WRVJUKSA8CisJICAgIChlbnRzaXplICsgKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9lbnRyeV90KSkpCisJCXJldHVybihYRlNfRVJST1IoRU5PU1BDKSk7CisKKwlpZiAoIWFyZ3MtPmp1c3RjaGVjaykKKwkJeGZzX2Rpcl9sZWFmX2FkZF93b3JrKGJwLCBhcmdzLCBpbmRleCwgMCk7CisJcmV0dXJuKDApOworfQorCisvKgorICogQWRkIGEgbmFtZSB0byBhIGxlYWYgZGlyZWN0b3J5IHN0cnVjdHVyZS4KKyAqLworU1RBVElDIHZvaWQKK3hmc19kaXJfbGVhZl9hZGRfd29yayh4ZnNfZGFidWZfdCAqYnAsIHhmc19kYV9hcmdzX3QgKmFyZ3MsIGludCBpbmRleCwKKwkJICAgICAgaW50IG1hcGluZGV4KQoreworCXhmc19kaXJfbGVhZmJsb2NrX3QgKmxlYWY7CisJeGZzX2Rpcl9sZWFmX2hkcl90ICpoZHI7CisJeGZzX2Rpcl9sZWFmX2VudHJ5X3QgKmVudHJ5OworCXhmc19kaXJfbGVhZl9uYW1lX3QgKm5hbWVzdDsKKwl4ZnNfZGlyX2xlYWZfbWFwX3QgKm1hcDsKKwkvKiBSRUZFUkVOQ0VEICovCisJeGZzX21vdW50X3QgKm1wOworCWludCB0bXAsIGk7CisKKwlsZWFmID0gYnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQobGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUl9MRUFGX01BR0lDKTsKKwloZHIgPSAmbGVhZi0+aGRyOworCUFTU0VSVCgobWFwaW5kZXggPj0gMCkgJiYgKG1hcGluZGV4IDwgWEZTX0RJUl9MRUFGX01BUFNJWkUpKTsKKwlBU1NFUlQoKGluZGV4ID49IDApICYmIChpbmRleCA8PSBJTlRfR0VUKGhkci0+Y291bnQsIEFSQ0hfQ09OVkVSVCkpKTsKKworCS8qCisJICogRm9yY2Ugb3BlbiBzb21lIHNwYWNlIGluIHRoZSBlbnRyeSBhcnJheSBhbmQgZmlsbCBpdCBpbi4KKwkgKi8KKwllbnRyeSA9ICZsZWFmLT5lbnRyaWVzW2luZGV4XTsKKwlpZiAoaW5kZXggPCBJTlRfR0VUKGhkci0+Y291bnQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJdG1wICA9IElOVF9HRVQoaGRyLT5jb3VudCwgQVJDSF9DT05WRVJUKSAtIGluZGV4OworCQl0bXAgKj0gKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9lbnRyeV90KTsKKwkJbWVtbW92ZShlbnRyeSArIDEsIGVudHJ5LCB0bXApOworCQl4ZnNfZGFfbG9nX2J1ZihhcmdzLT50cmFucywgYnAsCisJCSAgICBYRlNfREFfTE9HUkFOR0UobGVhZiwgZW50cnksIHRtcCArICh1aW50KXNpemVvZigqZW50cnkpKSk7CisJfQorCUlOVF9NT0QoaGRyLT5jb3VudCwgQVJDSF9DT05WRVJULCArMSk7CisKKwkvKgorCSAqIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgbmV3IHN0cmluZyAoYXQgdGhlIGVuZCBvZiB0aGUgcnVuKS4KKwkgKi8KKwltYXAgPSAmaGRyLT5mcmVlbWFwW21hcGluZGV4XTsKKwltcCA9IGFyZ3MtPnRyYW5zLT50X21vdW50cDsKKwlBU1NFUlQoSU5UX0dFVChtYXAtPmJhc2UsIEFSQ0hfQ09OVkVSVCkgPCBYRlNfTEJTSVpFKG1wKSk7CisJQVNTRVJUKElOVF9HRVQobWFwLT5zaXplLCBBUkNIX0NPTlZFUlQpID49IFhGU19ESVJfTEVBRl9FTlRTSVpFX0JZTkFNRShhcmdzLT5uYW1lbGVuKSk7CisJQVNTRVJUKElOVF9HRVQobWFwLT5zaXplLCBBUkNIX0NPTlZFUlQpIDwgWEZTX0xCU0laRShtcCkpOworCUlOVF9NT0QobWFwLT5zaXplLCBBUkNIX0NPTlZFUlQsIC0oWEZTX0RJUl9MRUFGX0VOVFNJWkVfQllOQU1FKGFyZ3MtPm5hbWVsZW4pKSk7CisJSU5UX1NFVChlbnRyeS0+bmFtZWlkeCwgQVJDSF9DT05WRVJULCBJTlRfR0VUKG1hcC0+YmFzZSwgQVJDSF9DT05WRVJUKSArIElOVF9HRVQobWFwLT5zaXplLCBBUkNIX0NPTlZFUlQpKTsKKwlJTlRfU0VUKGVudHJ5LT5oYXNodmFsLCBBUkNIX0NPTlZFUlQsIGFyZ3MtPmhhc2h2YWwpOworCWVudHJ5LT5uYW1lbGVuID0gYXJncy0+bmFtZWxlbjsKKwl4ZnNfZGFfbG9nX2J1ZihhcmdzLT50cmFucywgYnAsCisJICAgIFhGU19EQV9MT0dSQU5HRShsZWFmLCBlbnRyeSwgc2l6ZW9mKCplbnRyeSkpKTsKKworCS8qCisJICogQ29weSB0aGUgc3RyaW5nIGFuZCBpbm9kZSBudW1iZXIgaW50byB0aGUgbmV3IHNwYWNlLgorCSAqLworCW5hbWVzdCA9IFhGU19ESVJfTEVBRl9OQU1FU1RSVUNUKGxlYWYsIElOVF9HRVQoZW50cnktPm5hbWVpZHgsIEFSQ0hfQ09OVkVSVCkpOworCVhGU19ESVJfU0ZfUFVUX0RJUklOTygmYXJncy0+aW51bWJlciwgJm5hbWVzdC0+aW51bWJlcik7CisJbWVtY3B5KG5hbWVzdC0+bmFtZSwgYXJncy0+bmFtZSwgYXJncy0+bmFtZWxlbik7CisJeGZzX2RhX2xvZ19idWYoYXJncy0+dHJhbnMsIGJwLAorCSAgICBYRlNfREFfTE9HUkFOR0UobGVhZiwgbmFtZXN0LCBYRlNfRElSX0xFQUZfRU5UU0laRV9CWUVOVFJZKGVudHJ5KSkpOworCisJLyoKKwkgKiBVcGRhdGUgdGhlIGNvbnRyb2wgaW5mbyBmb3IgdGhpcyBsZWFmIG5vZGUKKwkgKi8KKwlpZiAoSU5UX0dFVChlbnRyeS0+bmFtZWlkeCwgQVJDSF9DT05WRVJUKSA8IElOVF9HRVQoaGRyLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCkpCisJCUlOVF9DT1BZKGhkci0+Zmlyc3R1c2VkLCBlbnRyeS0+bmFtZWlkeCwgQVJDSF9DT05WRVJUKTsKKwlBU1NFUlQoSU5UX0dFVChoZHItPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJUKSA+PSAoKElOVF9HRVQoaGRyLT5jb3VudCwgQVJDSF9DT05WRVJUKSpzaXplb2YoKmVudHJ5KSkrc2l6ZW9mKCpoZHIpKSk7CisJdG1wID0gKElOVF9HRVQoaGRyLT5jb3VudCwgQVJDSF9DT05WRVJUKS0xKSAqICh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfZW50cnlfdCkKKwkJCSsgKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9oZHJfdCk7CisJbWFwID0gJmhkci0+ZnJlZW1hcFswXTsKKwlmb3IgKGkgPSAwOyBpIDwgWEZTX0RJUl9MRUFGX01BUFNJWkU7IG1hcCsrLCBpKyspIHsKKwkJaWYgKElOVF9HRVQobWFwLT5iYXNlLCBBUkNIX0NPTlZFUlQpID09IHRtcCkgeworCQkJSU5UX01PRChtYXAtPmJhc2UsIEFSQ0hfQ09OVkVSVCwgKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9lbnRyeV90KSk7CisJCQlJTlRfTU9EKG1hcC0+c2l6ZSwgQVJDSF9DT05WRVJULCAtKCh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfZW50cnlfdCkpKTsKKwkJfQorCX0KKwlJTlRfTU9EKGhkci0+bmFtZWJ5dGVzLCBBUkNIX0NPTlZFUlQsIGFyZ3MtPm5hbWVsZW4pOworCXhmc19kYV9sb2dfYnVmKGFyZ3MtPnRyYW5zLCBicCwKKwkJWEZTX0RBX0xPR1JBTkdFKGxlYWYsIGhkciwgc2l6ZW9mKCpoZHIpKSk7Cit9CisKKy8qCisgKiBHYXJiYWdlIGNvbGxlY3QgYSBsZWFmIGRpcmVjdG9yeSBibG9jayBieSBjb3B5aW5nIGl0IHRvIGEgbmV3IGJ1ZmZlci4KKyAqLworU1RBVElDIGludAoreGZzX2Rpcl9sZWFmX2NvbXBhY3QoeGZzX3RyYW5zX3QgKnRyYW5zLCB4ZnNfZGFidWZfdCAqYnAsIGludCBtdXN0aGF2ZSwKKwkJICAgICBpbnQganVzdGNoZWNrKQoreworCXhmc19kaXJfbGVhZmJsb2NrX3QgKmxlYWZfcywgKmxlYWZfZDsKKwl4ZnNfZGlyX2xlYWZfaGRyX3QgKmhkcl9zLCAqaGRyX2Q7CisJeGZzX21vdW50X3QgKm1wOworCWNoYXIgKnRtcGJ1ZmZlcjsKKwljaGFyICp0bXBidWZmZXIyPU5VTEw7CisJaW50IHJ2YWw7CisJaW50IGxic2l6ZTsKKworCW1wID0gdHJhbnMtPnRfbW91bnRwOworCWxic2l6ZSA9IFhGU19MQlNJWkUobXApOworCXRtcGJ1ZmZlciA9IGttZW1fYWxsb2MobGJzaXplLCBLTV9TTEVFUCk7CisJQVNTRVJUKHRtcGJ1ZmZlciAhPSBOVUxMKTsKKwltZW1jcHkodG1wYnVmZmVyLCBicC0+ZGF0YSwgbGJzaXplKTsKKworCS8qCisJICogTWFrZSBhIHNlY29uZCBjb3B5IGluIGNhc2UgeGZzX2Rpcl9sZWFmX21vdmVlbnRzKCkKKwkgKiBiZWxvdyBkZXN0cm95cyB0aGUgb3JpZ2luYWwuCisJICovCisJaWYgKG11c3RoYXZlIHx8IGp1c3RjaGVjaykgeworCQl0bXBidWZmZXIyID0ga21lbV9hbGxvYyhsYnNpemUsIEtNX1NMRUVQKTsKKwkJbWVtY3B5KHRtcGJ1ZmZlcjIsIGJwLT5kYXRhLCBsYnNpemUpOworCX0KKwltZW1zZXQoYnAtPmRhdGEsIDAsIGxic2l6ZSk7CisKKwkvKgorCSAqIENvcHkgYmFzaWMgaW5mb3JtYXRpb24KKwkgKi8KKwlsZWFmX3MgPSAoeGZzX2Rpcl9sZWFmYmxvY2tfdCAqKXRtcGJ1ZmZlcjsKKwlsZWFmX2QgPSBicC0+ZGF0YTsKKwloZHJfcyA9ICZsZWFmX3MtPmhkcjsKKwloZHJfZCA9ICZsZWFmX2QtPmhkcjsKKwloZHJfZC0+aW5mbyA9IGhkcl9zLT5pbmZvOwkvKiBzdHJ1Y3QgY29weSAqLworCUlOVF9TRVQoaGRyX2QtPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJULCBsYnNpemUpOworCWlmICghaGRyX2QtPmZpcnN0dXNlZCkKKwkJSU5UX1NFVChoZHJfZC0+Zmlyc3R1c2VkLCBBUkNIX0NPTlZFUlQsIGxic2l6ZSAtIDEpOworCWhkcl9kLT5uYW1lYnl0ZXMgPSAwOworCWhkcl9kLT5jb3VudCA9IDA7CisJaGRyX2QtPmhvbGVzID0gMDsKKwlJTlRfU0VUKGhkcl9kLT5mcmVlbWFwWzBdLmJhc2UsIEFSQ0hfQ09OVkVSVCwgc2l6ZW9mKHhmc19kaXJfbGVhZl9oZHJfdCkpOworCUlOVF9TRVQoaGRyX2QtPmZyZWVtYXBbMF0uc2l6ZSwgQVJDSF9DT05WRVJULCBJTlRfR0VUKGhkcl9kLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCkgLSBJTlRfR0VUKGhkcl9kLT5mcmVlbWFwWzBdLmJhc2UsIEFSQ0hfQ09OVkVSVCkpOworCisJLyoKKwkgKiBDb3B5IGFsbCBlbnRyeSdzIGluIHRoZSBzYW1lIChzb3J0ZWQpIG9yZGVyLAorCSAqIGJ1dCBhbGxvY2F0ZSBmaWxlbmFtZXMgcGFja2VkIGFuZCBpbiBzZXF1ZW5jZS4KKwkgKiBUaGlzIGNoYW5nZXMgdGhlIHNvdXJjZSAobGVhZl9zKSBhcyB3ZWxsLgorCSAqLworCXhmc19kaXJfbGVhZl9tb3ZlZW50cyhsZWFmX3MsIDAsIGxlYWZfZCwgMCwgKGludClJTlRfR0VUKGhkcl9zLT5jb3VudCwgQVJDSF9DT05WRVJUKSwgbXApOworCisJaWYgKG11c3RoYXZlICYmIElOVF9HRVQoaGRyX2QtPmZyZWVtYXBbMF0uc2l6ZSwgQVJDSF9DT05WRVJUKSA8IG11c3RoYXZlKQorCQlydmFsID0gWEZTX0VSUk9SKEVOT1NQQyk7CisJZWxzZQorCQlydmFsID0gMDsKKworCWlmIChqdXN0Y2hlY2sgfHwgcnZhbCA9PSBFTk9TUEMpIHsKKwkJQVNTRVJUKHRtcGJ1ZmZlcjIpOworCQltZW1jcHkoYnAtPmRhdGEsIHRtcGJ1ZmZlcjIsIGxic2l6ZSk7CisJfSBlbHNlIHsKKwkJeGZzX2RhX2xvZ19idWYodHJhbnMsIGJwLCAwLCBsYnNpemUgLSAxKTsKKwl9CisKKwlrbWVtX2ZyZWUodG1wYnVmZmVyLCBsYnNpemUpOworCWlmIChtdXN0aGF2ZSB8fCBqdXN0Y2hlY2spCisJCWttZW1fZnJlZSh0bXBidWZmZXIyLCBsYnNpemUpOworCXJldHVybihydmFsKTsKK30KKworLyoKKyAqIFJlZGlzdHJpYnV0ZSB0aGUgZGlyZWN0b3J5IGVudHJpZXMgYmV0d2VlbiB0d28gbGVhZiBub2RlcywKKyAqIHRha2luZyBpbnRvIGFjY291bnQgdGhlIHNpemUgb2YgdGhlIG5ldyBlbnRyeS4KKyAqCisgKiBOT1RFOiBpZiBuZXcgYmxvY2sgaXMgZW1wdHksIHRoZW4gaXQgd2lsbCBnZXQgdGhlIHVwcGVyIGhhbGYgb2Ygb2xkIGJsb2NrLgorICovCitTVEFUSUMgdm9pZAoreGZzX2Rpcl9sZWFmX3JlYmFsYW5jZSh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUsIHhmc19kYV9zdGF0ZV9ibGtfdCAqYmxrMSwKKwkJCQkgICAgICB4ZnNfZGFfc3RhdGVfYmxrX3QgKmJsazIpCit7CisJeGZzX2RhX3N0YXRlX2Jsa190ICp0bXBfYmxrOworCXhmc19kaXJfbGVhZmJsb2NrX3QgKmxlYWYxLCAqbGVhZjI7CisJeGZzX2Rpcl9sZWFmX2hkcl90ICpoZHIxLCAqaGRyMjsKKwlpbnQgY291bnQsIHRvdGFsbGVuLCBtYXgsIHNwYWNlLCBzd2FwOworCisJLyoKKwkgKiBTZXQgdXAgZW52aXJvbm1lbnQuCisJICovCisJQVNTRVJUKGJsazEtPm1hZ2ljID09IFhGU19ESVJfTEVBRl9NQUdJQyk7CisJQVNTRVJUKGJsazItPm1hZ2ljID09IFhGU19ESVJfTEVBRl9NQUdJQyk7CisJbGVhZjEgPSBibGsxLT5icC0+ZGF0YTsKKwlsZWFmMiA9IGJsazItPmJwLT5kYXRhOworCUFTU0VSVChJTlRfR0VUKGxlYWYxLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSX0xFQUZfTUFHSUMpOworCUFTU0VSVChJTlRfR0VUKGxlYWYyLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSX0xFQUZfTUFHSUMpOworCisJLyoKKwkgKiBDaGVjayBvcmRlcmluZyBvZiBibG9ja3MsIHJldmVyc2UgaWYgaXQgbWFrZXMgdGhpbmdzIHNpbXBsZXIuCisJICovCisJc3dhcCA9IDA7CisJaWYgKHhmc19kaXJfbGVhZl9vcmRlcihibGsxLT5icCwgYmxrMi0+YnApKSB7CisJCXRtcF9ibGsgPSBibGsxOworCQlibGsxID0gYmxrMjsKKwkJYmxrMiA9IHRtcF9ibGs7CisJCWxlYWYxID0gYmxrMS0+YnAtPmRhdGE7CisJCWxlYWYyID0gYmxrMi0+YnAtPmRhdGE7CisJCXN3YXAgPSAxOworCX0KKwloZHIxID0gJmxlYWYxLT5oZHI7CisJaGRyMiA9ICZsZWFmMi0+aGRyOworCisJLyoKKwkgKiBFeGFtaW5lIGVudHJpZXMgdW50aWwgd2UgcmVkdWNlIHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlIGluCisJICogYnl0ZSB1c2FnZSBiZXR3ZWVuIHRoZSB0d28gYmxvY2tzIHRvIGEgbWluaW11bS4gIFRoZW4gZ2V0CisJICogdGhlIGRpcmVjdGlvbiB0byBjb3B5IGFuZCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIG1vdmUuCisJICovCisJc3RhdGUtPmlubGVhZiA9IHhmc19kaXJfbGVhZl9maWd1cmVfYmFsYW5jZShzdGF0ZSwgYmxrMSwgYmxrMiwKKwkJCQkJCQkgICAmY291bnQsICZ0b3RhbGxlbik7CisJaWYgKHN3YXApCisJCXN0YXRlLT5pbmxlYWYgPSAhc3RhdGUtPmlubGVhZjsKKworCS8qCisJICogTW92ZSBhbnkgZW50cmllcyByZXF1aXJlZCBmcm9tIGxlYWYgdG8gbGVhZjoKKwkgKi8KKwlpZiAoY291bnQgPCBJTlRfR0VUKGhkcjEtPmNvdW50LCBBUkNIX0NPTlZFUlQpKSB7CisJCS8qCisJCSAqIEZpZ3VyZSB0aGUgdG90YWwgYnl0ZXMgdG8gYmUgYWRkZWQgdG8gdGhlIGRlc3RpbmF0aW9uIGxlYWYuCisJCSAqLworCQljb3VudCA9IElOVF9HRVQoaGRyMS0+Y291bnQsIEFSQ0hfQ09OVkVSVCkgLSBjb3VudDsJLyogbnVtYmVyIGVudHJpZXMgYmVpbmcgbW92ZWQgKi8KKwkJc3BhY2UgID0gSU5UX0dFVChoZHIxLT5uYW1lYnl0ZXMsIEFSQ0hfQ09OVkVSVCkgLSB0b3RhbGxlbjsKKwkJc3BhY2UgKz0gY291bnQgKiAoKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9uYW1lX3QpLTEpOworCQlzcGFjZSArPSBjb3VudCAqICh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfZW50cnlfdCk7CisKKwkJLyoKKwkJICogbGVhZjIgaXMgdGhlIGRlc3RpbmF0aW9uLCBjb21wYWN0IGl0IGlmIGl0IGxvb2tzIHRpZ2h0LgorCQkgKi8KKwkJbWF4ICA9IElOVF9HRVQoaGRyMi0+Zmlyc3R1c2VkLCBBUkNIX0NPTlZFUlQpIC0gKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9oZHJfdCk7CisJCW1heCAtPSBJTlRfR0VUKGhkcjItPmNvdW50LCBBUkNIX0NPTlZFUlQpICogKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9lbnRyeV90KTsKKwkJaWYgKHNwYWNlID4gbWF4KSB7CisJCQl4ZnNfZGlyX2xlYWZfY29tcGFjdChzdGF0ZS0+YXJncy0+dHJhbnMsIGJsazItPmJwLAorCQkJCQkJCQkgMCwgMCk7CisJCX0KKworCQkvKgorCQkgKiBNb3ZlIGhpZ2ggZW50cmllcyBmcm9tIGxlYWYxIHRvIGxvdyBlbmQgb2YgbGVhZjIuCisJCSAqLworCQl4ZnNfZGlyX2xlYWZfbW92ZWVudHMobGVhZjEsIElOVF9HRVQoaGRyMS0+Y291bnQsIEFSQ0hfQ09OVkVSVCkgLSBjb3VudCwKKwkJCQkJICAgICBsZWFmMiwgMCwgY291bnQsIHN0YXRlLT5tcCk7CisKKwkJeGZzX2RhX2xvZ19idWYoc3RhdGUtPmFyZ3MtPnRyYW5zLCBibGsxLT5icCwgMCwKKwkJCQkJCSAgIHN0YXRlLT5ibG9ja3NpemUtMSk7CisJCXhmc19kYV9sb2dfYnVmKHN0YXRlLT5hcmdzLT50cmFucywgYmxrMi0+YnAsIDAsCisJCQkJCQkgICBzdGF0ZS0+YmxvY2tzaXplLTEpOworCisJfSBlbHNlIGlmIChjb3VudCA+IElOVF9HRVQoaGRyMS0+Y291bnQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJLyoKKwkJICogRmlndXJlIHRoZSB0b3RhbCBieXRlcyB0byBiZSBhZGRlZCB0byB0aGUgZGVzdGluYXRpb24gbGVhZi4KKwkJICovCisJCWNvdW50IC09IElOVF9HRVQoaGRyMS0+Y291bnQsIEFSQ0hfQ09OVkVSVCk7CQkvKiBudW1iZXIgZW50cmllcyBiZWluZyBtb3ZlZCAqLworCQlzcGFjZSAgPSB0b3RhbGxlbiAtIElOVF9HRVQoaGRyMS0+bmFtZWJ5dGVzLCBBUkNIX0NPTlZFUlQpOworCQlzcGFjZSArPSBjb3VudCAqICgodWludClzaXplb2YoeGZzX2Rpcl9sZWFmX25hbWVfdCktMSk7CisJCXNwYWNlICs9IGNvdW50ICogKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9lbnRyeV90KTsKKworCQkvKgorCQkgKiBsZWFmMSBpcyB0aGUgZGVzdGluYXRpb24sIGNvbXBhY3QgaXQgaWYgaXQgbG9va3MgdGlnaHQuCisJCSAqLworCQltYXggID0gSU5UX0dFVChoZHIxLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCkgLSAodWludClzaXplb2YoeGZzX2Rpcl9sZWFmX2hkcl90KTsKKwkJbWF4IC09IElOVF9HRVQoaGRyMS0+Y291bnQsIEFSQ0hfQ09OVkVSVCkgKiAodWludClzaXplb2YoeGZzX2Rpcl9sZWFmX2VudHJ5X3QpOworCQlpZiAoc3BhY2UgPiBtYXgpIHsKKwkJCXhmc19kaXJfbGVhZl9jb21wYWN0KHN0YXRlLT5hcmdzLT50cmFucywgYmxrMS0+YnAsCisJCQkJCQkJCSAwLCAwKTsKKwkJfQorCisJCS8qCisJCSAqIE1vdmUgbG93IGVudHJpZXMgZnJvbSBsZWFmMiB0byBoaWdoIGVuZCBvZiBsZWFmMS4KKwkJICovCisJCXhmc19kaXJfbGVhZl9tb3ZlZW50cyhsZWFmMiwgMCwgbGVhZjEsIChpbnQpSU5UX0dFVChoZHIxLT5jb3VudCwgQVJDSF9DT05WRVJUKSwKKwkJCQkJICAgICBjb3VudCwgc3RhdGUtPm1wKTsKKworCQl4ZnNfZGFfbG9nX2J1ZihzdGF0ZS0+YXJncy0+dHJhbnMsIGJsazEtPmJwLCAwLAorCQkJCQkJICAgc3RhdGUtPmJsb2Nrc2l6ZS0xKTsKKwkJeGZzX2RhX2xvZ19idWYoc3RhdGUtPmFyZ3MtPnRyYW5zLCBibGsyLT5icCwgMCwKKwkJCQkJCSAgIHN0YXRlLT5ibG9ja3NpemUtMSk7CisJfQorCisJLyoKKwkgKiBDb3B5IG91dCBsYXN0IGhhc2h2YWwgaW4gZWFjaCBibG9jayBmb3IgQi10cmVlIGNvZGUuCisJICovCisJYmxrMS0+aGFzaHZhbCA9IElOVF9HRVQobGVhZjEtPmVudHJpZXNbIElOVF9HRVQobGVhZjEtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKS0xIF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKTsKKwlibGsyLT5oYXNodmFsID0gSU5UX0dFVChsZWFmMi0+ZW50cmllc1sgSU5UX0dFVChsZWFmMi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpLTEgXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpOworCisJLyoKKwkgKiBBZGp1c3QgdGhlIGV4cGVjdGVkIGluZGV4IGZvciBpbnNlcnRpb24uCisJICogR1JPVDogdGhpcyBkb2Vzbid0IHdvcmsgdW5sZXNzIGJsazIgd2FzIG9yaWdpbmFsbHkgZW1wdHkuCisJICovCisJaWYgKCFzdGF0ZS0+aW5sZWFmKSB7CisJCWJsazItPmluZGV4ID0gYmxrMS0+aW5kZXggLSBJTlRfR0VUKGxlYWYxLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJfQorfQorCisvKgorICogRXhhbWluZSBlbnRyaWVzIHVudGlsIHdlIHJlZHVjZSB0aGUgYWJzb2x1dGUgZGlmZmVyZW5jZSBpbgorICogYnl0ZSB1c2FnZSBiZXR3ZWVuIHRoZSB0d28gYmxvY2tzIHRvIGEgbWluaW11bS4KKyAqIEdST1Q6IElzIHRoaXMgcmVhbGx5IG5lY2Vzc2FyeT8gIFdpdGggb3RoZXIgdGhhbiBhIDUxMiBieXRlIGJsb2Nrc2l6ZSwKKyAqIEdST1Q6IHRoZXJlIHdpbGwgYWx3YXlzIGJlIGVub3VnaCByb29tIGluIGVpdGhlciBibG9jayBmb3IgYSBuZXcgZW50cnkuCisgKiBHUk9UOiBEbyBhIGRvdWJsZS1zcGxpdCBmb3IgdGhpcyBjYXNlPworICovCitTVEFUSUMgaW50Cit4ZnNfZGlyX2xlYWZfZmlndXJlX2JhbGFuY2UoeGZzX2RhX3N0YXRlX3QgKnN0YXRlLAorCQkJCQkgICB4ZnNfZGFfc3RhdGVfYmxrX3QgKmJsazEsCisJCQkJCSAgIHhmc19kYV9zdGF0ZV9ibGtfdCAqYmxrMiwKKwkJCQkJICAgaW50ICpjb3VudGFyZywgaW50ICpuYW1lYnl0ZXNhcmcpCit7CisJeGZzX2Rpcl9sZWFmYmxvY2tfdCAqbGVhZjEsICpsZWFmMjsKKwl4ZnNfZGlyX2xlYWZfaGRyX3QgKmhkcjEsICpoZHIyOworCXhmc19kaXJfbGVhZl9lbnRyeV90ICplbnRyeTsKKwlpbnQgY291bnQsIG1heCwgdG90YWxsZW4sIGhhbGY7CisJaW50IGxhc3RkZWx0YSwgZm91bmRpdCwgdG1wOworCisJLyoKKwkgKiBTZXQgdXAgZW52aXJvbm1lbnQuCisJICovCisJbGVhZjEgPSBibGsxLT5icC0+ZGF0YTsKKwlsZWFmMiA9IGJsazItPmJwLT5kYXRhOworCWhkcjEgPSAmbGVhZjEtPmhkcjsKKwloZHIyID0gJmxlYWYyLT5oZHI7CisJZm91bmRpdCA9IDA7CisJdG90YWxsZW4gPSAwOworCisJLyoKKwkgKiBFeGFtaW5lIGVudHJpZXMgdW50aWwgd2UgcmVkdWNlIHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlIGluCisJICogYnl0ZSB1c2FnZSBiZXR3ZWVuIHRoZSB0d28gYmxvY2tzIHRvIGEgbWluaW11bS4KKwkgKi8KKwltYXggPSBJTlRfR0VUKGhkcjEtPmNvdW50LCBBUkNIX0NPTlZFUlQpICsgSU5UX0dFVChoZHIyLT5jb3VudCwgQVJDSF9DT05WRVJUKTsKKwloYWxmICA9IChtYXgrMSkgKiAodWludCkoc2l6ZW9mKCplbnRyeSkrc2l6ZW9mKHhmc19kaXJfbGVhZl9lbnRyeV90KS0xKTsKKwloYWxmICs9IElOVF9HRVQoaGRyMS0+bmFtZWJ5dGVzLCBBUkNIX0NPTlZFUlQpICsgSU5UX0dFVChoZHIyLT5uYW1lYnl0ZXMsIEFSQ0hfQ09OVkVSVCkgKyBzdGF0ZS0+YXJncy0+bmFtZWxlbjsKKwloYWxmIC89IDI7CisJbGFzdGRlbHRhID0gc3RhdGUtPmJsb2Nrc2l6ZTsKKwllbnRyeSA9ICZsZWFmMS0+ZW50cmllc1swXTsKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBtYXg7IGVudHJ5KyssIGNvdW50KyspIHsKKworI2RlZmluZSBYRlNfRElSX0FCUyhBKQkoKChBKSA8IDApID8gLShBKSA6IChBKSkKKwkJLyoKKwkJICogVGhlIG5ldyBlbnRyeSBpcyBpbiB0aGUgZmlyc3QgYmxvY2ssIGFjY291bnQgZm9yIGl0LgorCQkgKi8KKwkJaWYgKGNvdW50ID09IGJsazEtPmluZGV4KSB7CisJCQl0bXAgPSB0b3RhbGxlbiArICh1aW50KXNpemVvZigqZW50cnkpCisJCQkJKyBYRlNfRElSX0xFQUZfRU5UU0laRV9CWU5BTUUoc3RhdGUtPmFyZ3MtPm5hbWVsZW4pOworCQkJaWYgKFhGU19ESVJfQUJTKGhhbGYgLSB0bXApID4gbGFzdGRlbHRhKQorCQkJCWJyZWFrOworCQkJbGFzdGRlbHRhID0gWEZTX0RJUl9BQlMoaGFsZiAtIHRtcCk7CisJCQl0b3RhbGxlbiA9IHRtcDsKKwkJCWZvdW5kaXQgPSAxOworCQl9CisKKwkJLyoKKwkJICogV3JhcCBhcm91bmQgaW50byB0aGUgc2Vjb25kIGJsb2NrIGlmIG5lY2Vzc2FyeS4KKwkJICovCisJCWlmIChjb3VudCA9PSBJTlRfR0VUKGhkcjEtPmNvdW50LCBBUkNIX0NPTlZFUlQpKSB7CisJCQlsZWFmMSA9IGxlYWYyOworCQkJZW50cnkgPSAmbGVhZjEtPmVudHJpZXNbMF07CisJCX0KKworCQkvKgorCQkgKiBGaWd1cmUgb3V0IGlmIG5leHQgbGVhZiBlbnRyeSB3b3VsZCBiZSB0b28gbXVjaC4KKwkJICovCisJCXRtcCA9IHRvdGFsbGVuICsgKHVpbnQpc2l6ZW9mKCplbnRyeSkKKwkJCQkrIFhGU19ESVJfTEVBRl9FTlRTSVpFX0JZRU5UUlkoZW50cnkpOworCQlpZiAoWEZTX0RJUl9BQlMoaGFsZiAtIHRtcCkgPiBsYXN0ZGVsdGEpCisJCQlicmVhazsKKwkJbGFzdGRlbHRhID0gWEZTX0RJUl9BQlMoaGFsZiAtIHRtcCk7CisJCXRvdGFsbGVuID0gdG1wOworI3VuZGVmIFhGU19ESVJfQUJTCisJfQorCisJLyoKKwkgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBuYW1lYnl0ZXMgdGhhdCB3aWxsIGVuZCB1cCBpbiBsb3dlciBibG9jay4KKwkgKiBJZiBuZXcgZW50cnkgbm90IGluIGxvd2VyIGJsb2NrLCBmaXggdXAgdGhlIGNvdW50LgorCSAqLworCXRvdGFsbGVuIC09CisJCWNvdW50ICogKHVpbnQpKHNpemVvZigqZW50cnkpK3NpemVvZih4ZnNfZGlyX2xlYWZfZW50cnlfdCktMSk7CisJaWYgKGZvdW5kaXQpIHsKKwkJdG90YWxsZW4gLT0gKHNpemVvZigqZW50cnkpK3NpemVvZih4ZnNfZGlyX2xlYWZfZW50cnlfdCktMSkgKworCQkJICAgIHN0YXRlLT5hcmdzLT5uYW1lbGVuOworCX0KKworCSpjb3VudGFyZyA9IGNvdW50OworCSpuYW1lYnl0ZXNhcmcgPSB0b3RhbGxlbjsKKwlyZXR1cm4oZm91bmRpdCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSb3V0aW5lcyB1c2VkIGZvciBzaHJpbmtpbmcgdGhlIEJ0cmVlLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICogQ2hlY2sgYSBsZWFmIGJsb2NrIGFuZCBpdHMgbmVpZ2hib3JzIHRvIHNlZSBpZiB0aGUgYmxvY2sgc2hvdWxkIGJlCisgKiBjb2xsYXBzZWQgaW50byBvbmUgb3IgdGhlIG90aGVyIG5laWdoYm9yLiAgQWx3YXlzIGtlZXAgdGhlIGJsb2NrCisgKiB3aXRoIHRoZSBzbWFsbGVyIGJsb2NrIG51bWJlci4KKyAqIElmIHRoZSBjdXJyZW50IGJsb2NrIGlzIG92ZXIgNTAlIGZ1bGwsIGRvbid0IHRyeSB0byBqb2luIGl0LCByZXR1cm4gMC4KKyAqIElmIHRoZSBibG9jayBpcyBlbXB0eSwgZmlsbCBpbiB0aGUgc3RhdGUgc3RydWN0dXJlIGFuZCByZXR1cm4gMi4KKyAqIElmIGl0IGNhbiBiZSBjb2xsYXBzZWQsIGZpbGwgaW4gdGhlIHN0YXRlIHN0cnVjdHVyZSBhbmQgcmV0dXJuIDEuCisgKiBJZiBub3RoaW5nIGNhbiBiZSBkb25lLCByZXR1cm4gMC4KKyAqLworaW50Cit4ZnNfZGlyX2xlYWZfdG9vc21hbGwoeGZzX2RhX3N0YXRlX3QgKnN0YXRlLCBpbnQgKmFjdGlvbikKK3sKKwl4ZnNfZGlyX2xlYWZibG9ja190ICpsZWFmOworCXhmc19kYV9zdGF0ZV9ibGtfdCAqYmxrOworCXhmc19kYV9ibGtpbmZvX3QgKmluZm87CisJaW50IGNvdW50LCBieXRlcywgZm9yd2FyZCwgZXJyb3IsIHJldHZhbCwgaTsKKwl4ZnNfZGFibGtfdCBibGtubzsKKwl4ZnNfZGFidWZfdCAqYnA7CisKKwkvKgorCSAqIENoZWNrIGZvciB0aGUgZGVnZW5lcmF0ZSBjYXNlIG9mIHRoZSBibG9jayBiZWluZyBvdmVyIDUwJSBmdWxsLgorCSAqIElmIHNvLCBpdCdzIG5vdCB3b3J0aCBldmVuIGxvb2tpbmcgdG8gc2VlIGlmIHdlIG1pZ2h0IGJlIGFibGUKKwkgKiB0byBjb2FsZXNjZSB3aXRoIGEgc2libGluZy4KKwkgKi8KKwlibGsgPSAmc3RhdGUtPnBhdGguYmxrWyBzdGF0ZS0+cGF0aC5hY3RpdmUtMSBdOworCWluZm8gPSBibGstPmJwLT5kYXRhOworCUFTU0VSVChJTlRfR0VUKGluZm8tPm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVJfTEVBRl9NQUdJQyk7CisJbGVhZiA9ICh4ZnNfZGlyX2xlYWZibG9ja190ICopaW5mbzsKKwljb3VudCA9IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOworCWJ5dGVzID0gKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9oZHJfdCkgKworCQljb3VudCAqICh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfZW50cnlfdCkgKworCQljb3VudCAqICgodWludClzaXplb2YoeGZzX2Rpcl9sZWFmX25hbWVfdCktMSkgKworCQlJTlRfR0VUKGxlYWYtPmhkci5uYW1lYnl0ZXMsIEFSQ0hfQ09OVkVSVCk7CisJaWYgKGJ5dGVzID4gKHN0YXRlLT5ibG9ja3NpemUgPj4gMSkpIHsKKwkJKmFjdGlvbiA9IDA7CS8qIGJsayBvdmVyIDUwJSwgZG9uJ3QgdHJ5IHRvIGpvaW4gKi8KKwkJcmV0dXJuKDApOworCX0KKworCS8qCisJICogQ2hlY2sgZm9yIHRoZSBkZWdlbmVyYXRlIGNhc2Ugb2YgdGhlIGJsb2NrIGJlaW5nIGVtcHR5LgorCSAqIElmIHRoZSBibG9jayBpcyBlbXB0eSwgd2UnbGwgc2ltcGx5IGRlbGV0ZSBpdCwgbm8gbmVlZCB0bworCSAqIGNvYWxlc2NlIGl0IHdpdGggYSBzaWJsaW5nIGJsb2NrLiAgV2UgY2hvb3NlIChhcmlidHJhcmlseSkKKwkgKiB0byBtZXJnZSB3aXRoIHRoZSBmb3J3YXJkIGJsb2NrIHVubGVzcyBpdCBpcyBOVUxMLgorCSAqLworCWlmIChjb3VudCA9PSAwKSB7CisJCS8qCisJCSAqIE1ha2UgYWx0cGF0aCBwb2ludCB0byB0aGUgYmxvY2sgd2Ugd2FudCB0byBrZWVwIGFuZAorCQkgKiBwYXRoIHBvaW50IHRvIHRoZSBibG9jayB3ZSB3YW50IHRvIGRyb3AgKHRoaXMgb25lKS4KKwkJICovCisJCWZvcndhcmQgPSBpbmZvLT5mb3J3OworCQltZW1jcHkoJnN0YXRlLT5hbHRwYXRoLCAmc3RhdGUtPnBhdGgsIHNpemVvZihzdGF0ZS0+cGF0aCkpOworCQllcnJvciA9IHhmc19kYV9wYXRoX3NoaWZ0KHN0YXRlLCAmc3RhdGUtPmFsdHBhdGgsIGZvcndhcmQsCisJCQkJCQkgMCwgJnJldHZhbCk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybihlcnJvcik7CisJCWlmIChyZXR2YWwpIHsKKwkJCSphY3Rpb24gPSAwOworCQl9IGVsc2UgeworCQkJKmFjdGlvbiA9IDI7CisJCX0KKwkJcmV0dXJuKDApOworCX0KKworCS8qCisJICogRXhhbWluZSBlYWNoIHNpYmxpbmcgYmxvY2sgdG8gc2VlIGlmIHdlIGNhbiBjb2FsZXNjZSB3aXRoCisJICogYXQgbGVhc3QgMjUlIGZyZWUgc3BhY2UgdG8gc3BhcmUuICBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQKKwkgKiB3aGV0aGVyIHRvIG1lcmdlIHdpdGggdGhlIGZvcndhcmQgb3IgdGhlIGJhY2t3YXJkIGJsb2NrLgorCSAqIFdlIHByZWZlciBjb2FsZXNjaW5nIHdpdGggdGhlIGxvd2VyIG51bWJlcmVkIHNpYmxpbmcgc28gYXMKKwkgKiB0byBzaHJpbmsgYSBkaXJlY3Rvcnkgb3ZlciB0aW1lLgorCSAqLworCWZvcndhcmQgPSAoSU5UX0dFVChpbmZvLT5mb3J3LCBBUkNIX0NPTlZFUlQpIDwgSU5UX0dFVChpbmZvLT5iYWNrLCBBUkNIX0NPTlZFUlQpKTsJLyogc3RhcnQgd2l0aCBzbWFsbGVyIGJsayBudW0gKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjsgZm9yd2FyZCA9ICFmb3J3YXJkLCBpKyspIHsKKwkJaWYgKGZvcndhcmQpCisJCQlibGtubyA9IElOVF9HRVQoaW5mby0+Zm9ydywgQVJDSF9DT05WRVJUKTsKKwkJZWxzZQorCQkJYmxrbm8gPSBJTlRfR0VUKGluZm8tPmJhY2ssIEFSQ0hfQ09OVkVSVCk7CisJCWlmIChibGtubyA9PSAwKQorCQkJY29udGludWU7CisJCWVycm9yID0geGZzX2RhX3JlYWRfYnVmKHN0YXRlLT5hcmdzLT50cmFucywgc3RhdGUtPmFyZ3MtPmRwLAorCQkJCQkJCSAgICBibGtubywgLTEsICZicCwKKwkJCQkJCQkgICAgWEZTX0RBVEFfRk9SSyk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybihlcnJvcik7CisJCUFTU0VSVChicCAhPSBOVUxMKTsKKworCQlsZWFmID0gKHhmc19kaXJfbGVhZmJsb2NrX3QgKilpbmZvOworCQljb3VudCAgPSBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKTsKKwkJYnl0ZXMgID0gc3RhdGUtPmJsb2Nrc2l6ZSAtIChzdGF0ZS0+YmxvY2tzaXplPj4yKTsKKwkJYnl0ZXMgLT0gSU5UX0dFVChsZWFmLT5oZHIubmFtZWJ5dGVzLCBBUkNIX0NPTlZFUlQpOworCQlsZWFmID0gYnAtPmRhdGE7CisJCUFTU0VSVChJTlRfR0VUKGxlYWYtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVJfTEVBRl9NQUdJQyk7CisJCWNvdW50ICs9IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOworCQlieXRlcyAtPSBJTlRfR0VUKGxlYWYtPmhkci5uYW1lYnl0ZXMsIEFSQ0hfQ09OVkVSVCk7CisJCWJ5dGVzIC09IGNvdW50ICogKCh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfbmFtZV90KSAtIDEpOworCQlieXRlcyAtPSBjb3VudCAqICh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfZW50cnlfdCk7CisJCWJ5dGVzIC09ICh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfaGRyX3QpOworCQlpZiAoYnl0ZXMgPj0gMCkKKwkJCWJyZWFrOwkvKiBmaXRzIHdpdGggYXQgbGVhc3QgMjUlIHRvIHNwYXJlICovCisKKwkJeGZzX2RhX2JyZWxzZShzdGF0ZS0+YXJncy0+dHJhbnMsIGJwKTsKKwl9CisJaWYgKGkgPj0gMikgeworCQkqYWN0aW9uID0gMDsKKwkJcmV0dXJuKDApOworCX0KKwl4ZnNfZGFfYnVmX2RvbmUoYnApOworCisJLyoKKwkgKiBNYWtlIGFsdHBhdGggcG9pbnQgdG8gdGhlIGJsb2NrIHdlIHdhbnQgdG8ga2VlcCAodGhlIGxvd2VyCisJICogbnVtYmVyZWQgYmxvY2spIGFuZCBwYXRoIHBvaW50IHRvIHRoZSBibG9jayB3ZSB3YW50IHRvIGRyb3AuCisJICovCisJbWVtY3B5KCZzdGF0ZS0+YWx0cGF0aCwgJnN0YXRlLT5wYXRoLCBzaXplb2Yoc3RhdGUtPnBhdGgpKTsKKwlpZiAoYmxrbm8gPCBibGstPmJsa25vKSB7CisJCWVycm9yID0geGZzX2RhX3BhdGhfc2hpZnQoc3RhdGUsICZzdGF0ZS0+YWx0cGF0aCwgZm9yd2FyZCwKKwkJCQkJCSAwLCAmcmV0dmFsKTsKKwl9IGVsc2UgeworCQllcnJvciA9IHhmc19kYV9wYXRoX3NoaWZ0KHN0YXRlLCAmc3RhdGUtPnBhdGgsIGZvcndhcmQsCisJCQkJCQkgMCwgJnJldHZhbCk7CisJfQorCWlmIChlcnJvcikKKwkJcmV0dXJuKGVycm9yKTsKKwlpZiAocmV0dmFsKSB7CisJCSphY3Rpb24gPSAwOworCX0gZWxzZSB7CisJCSphY3Rpb24gPSAxOworCX0KKwlyZXR1cm4oMCk7Cit9CisKKy8qCisgKiBSZW1vdmUgYSBuYW1lIGZyb20gdGhlIGxlYWYgZGlyZWN0b3J5IHN0cnVjdHVyZS4KKyAqCisgKiBSZXR1cm4gMSBpZiBsZWFmIGlzIGxlc3MgdGhhbiAzNyUgZnVsbCwgMCBpZiA+PSAzNyUgZnVsbC4KKyAqIElmIHR3byBsZWF2ZXMgYXJlIDM3JSBmdWxsLCB3aGVuIGNvbWJpbmVkIHRoZXkgd2lsbCBsZWF2ZSAyNSUgZnJlZS4KKyAqLworaW50Cit4ZnNfZGlyX2xlYWZfcmVtb3ZlKHhmc190cmFuc190ICp0cmFucywgeGZzX2RhYnVmX3QgKmJwLCBpbnQgaW5kZXgpCit7CisJeGZzX2Rpcl9sZWFmYmxvY2tfdCAqbGVhZjsKKwl4ZnNfZGlyX2xlYWZfaGRyX3QgKmhkcjsKKwl4ZnNfZGlyX2xlYWZfbWFwX3QgKm1hcDsKKwl4ZnNfZGlyX2xlYWZfZW50cnlfdCAqZW50cnk7CisJeGZzX2Rpcl9sZWFmX25hbWVfdCAqbmFtZXN0OworCWludCBiZWZvcmUsIGFmdGVyLCBzbWFsbGVzdCwgZW50c2l6ZTsKKwlpbnQgdGFibGVzaXplLCB0bXAsIGk7CisJeGZzX21vdW50X3QgKm1wOworCisJbGVhZiA9IGJwLT5kYXRhOworCUFTU0VSVChJTlRfR0VUKGxlYWYtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVJfTEVBRl9NQUdJQyk7CisJaGRyID0gJmxlYWYtPmhkcjsKKwltcCA9IHRyYW5zLT50X21vdW50cDsKKwlBU1NFUlQoKElOVF9HRVQoaGRyLT5jb3VudCwgQVJDSF9DT05WRVJUKSA+IDApICYmIChJTlRfR0VUKGhkci0+Y291bnQsIEFSQ0hfQ09OVkVSVCkgPCAoWEZTX0xCU0laRShtcCkvOCkpKTsKKwlBU1NFUlQoKGluZGV4ID49IDApICYmIChpbmRleCA8IElOVF9HRVQoaGRyLT5jb3VudCwgQVJDSF9DT05WRVJUKSkpOworCUFTU0VSVChJTlRfR0VUKGhkci0+Zmlyc3R1c2VkLCBBUkNIX0NPTlZFUlQpID49ICgoSU5UX0dFVChoZHItPmNvdW50LCBBUkNIX0NPTlZFUlQpKnNpemVvZigqZW50cnkpKStzaXplb2YoKmhkcikpKTsKKwllbnRyeSA9ICZsZWFmLT5lbnRyaWVzW2luZGV4XTsKKwlBU1NFUlQoSU5UX0dFVChlbnRyeS0+bmFtZWlkeCwgQVJDSF9DT05WRVJUKSA+PSBJTlRfR0VUKGhkci0+Zmlyc3R1c2VkLCBBUkNIX0NPTlZFUlQpKTsKKwlBU1NFUlQoSU5UX0dFVChlbnRyeS0+bmFtZWlkeCwgQVJDSF9DT05WRVJUKSA8IFhGU19MQlNJWkUobXApKTsKKworCS8qCisJICogU2NhbiB0aHJvdWdoIGZyZWUgcmVnaW9uIHRhYmxlOgorCSAqICAgIGNoZWNrIGZvciBhZGphY2VuY3kgb2YgZnJlZSdkIGVudHJ5IHdpdGggYW4gZXhpc3Rpbmcgb25lLAorCSAqICAgIGZpbmQgc21hbGxlc3QgZnJlZSByZWdpb24gaW4gY2FzZSB3ZSBuZWVkIHRvIHJlcGxhY2UgaXQsCisJICogICAgYWRqdXN0IGFueSBtYXAgdGhhdCBib3JkZXJzIHRoZSBlbnRyeSB0YWJsZSwKKwkgKi8KKwl0YWJsZXNpemUgPSBJTlRfR0VUKGhkci0+Y291bnQsIEFSQ0hfQ09OVkVSVCkgKiAodWludClzaXplb2YoeGZzX2Rpcl9sZWFmX2VudHJ5X3QpCisJCQkrICh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfaGRyX3QpOworCW1hcCA9ICZoZHItPmZyZWVtYXBbMF07CisJdG1wID0gSU5UX0dFVChtYXAtPnNpemUsIEFSQ0hfQ09OVkVSVCk7CisJYmVmb3JlID0gYWZ0ZXIgPSAtMTsKKwlzbWFsbGVzdCA9IFhGU19ESVJfTEVBRl9NQVBTSVpFIC0gMTsKKwllbnRzaXplID0gWEZTX0RJUl9MRUFGX0VOVFNJWkVfQllFTlRSWShlbnRyeSk7CisJZm9yIChpID0gMDsgaSA8IFhGU19ESVJfTEVBRl9NQVBTSVpFOyBtYXArKywgaSsrKSB7CisJCUFTU0VSVChJTlRfR0VUKG1hcC0+YmFzZSwgQVJDSF9DT05WRVJUKSA8IFhGU19MQlNJWkUobXApKTsKKwkJQVNTRVJUKElOVF9HRVQobWFwLT5zaXplLCBBUkNIX0NPTlZFUlQpIDwgWEZTX0xCU0laRShtcCkpOworCQlpZiAoSU5UX0dFVChtYXAtPmJhc2UsIEFSQ0hfQ09OVkVSVCkgPT0gdGFibGVzaXplKSB7CisJCQlJTlRfTU9EKG1hcC0+YmFzZSwgQVJDSF9DT05WRVJULCAtKCh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfZW50cnlfdCkpKTsKKwkJCUlOVF9NT0QobWFwLT5zaXplLCBBUkNIX0NPTlZFUlQsICh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfZW50cnlfdCkpOworCQl9CisKKwkJaWYgKChJTlRfR0VUKG1hcC0+YmFzZSwgQVJDSF9DT05WRVJUKSArIElOVF9HRVQobWFwLT5zaXplLCBBUkNIX0NPTlZFUlQpKSA9PSBJTlRfR0VUKGVudHJ5LT5uYW1laWR4LCBBUkNIX0NPTlZFUlQpKSB7CisJCQliZWZvcmUgPSBpOworCQl9IGVsc2UgaWYgKElOVF9HRVQobWFwLT5iYXNlLCBBUkNIX0NPTlZFUlQpID09IChJTlRfR0VUKGVudHJ5LT5uYW1laWR4LCBBUkNIX0NPTlZFUlQpICsgZW50c2l6ZSkpIHsKKwkJCWFmdGVyID0gaTsKKwkJfSBlbHNlIGlmIChJTlRfR0VUKG1hcC0+c2l6ZSwgQVJDSF9DT05WRVJUKSA8IHRtcCkgeworCQkJdG1wID0gSU5UX0dFVChtYXAtPnNpemUsIEFSQ0hfQ09OVkVSVCk7CisJCQlzbWFsbGVzdCA9IGk7CisJCX0KKwl9CisKKwkvKgorCSAqIENvYWxlc2NlIGFkamFjZW50IGZyZWVtYXAgcmVnaW9ucywKKwkgKiBvciByZXBsYWNlIHRoZSBzbWFsbGVzdCByZWdpb24uCisJICovCisJaWYgKChiZWZvcmUgPj0gMCkgfHwgKGFmdGVyID49IDApKSB7CisJCWlmICgoYmVmb3JlID49IDApICYmIChhZnRlciA+PSAwKSkgeworCQkJbWFwID0gJmhkci0+ZnJlZW1hcFtiZWZvcmVdOworCQkJSU5UX01PRChtYXAtPnNpemUsIEFSQ0hfQ09OVkVSVCwgZW50c2l6ZSk7CisJCQlJTlRfTU9EKG1hcC0+c2l6ZSwgQVJDSF9DT05WRVJULCBJTlRfR0VUKGhkci0+ZnJlZW1hcFthZnRlcl0uc2l6ZSwgQVJDSF9DT05WRVJUKSk7CisJCQloZHItPmZyZWVtYXBbYWZ0ZXJdLmJhc2UgPSAwOworCQkJaGRyLT5mcmVlbWFwW2FmdGVyXS5zaXplID0gMDsKKwkJfSBlbHNlIGlmIChiZWZvcmUgPj0gMCkgeworCQkJbWFwID0gJmhkci0+ZnJlZW1hcFtiZWZvcmVdOworCQkJSU5UX01PRChtYXAtPnNpemUsIEFSQ0hfQ09OVkVSVCwgZW50c2l6ZSk7CisJCX0gZWxzZSB7CisJCQltYXAgPSAmaGRyLT5mcmVlbWFwW2FmdGVyXTsKKwkJCUlOVF9DT1BZKG1hcC0+YmFzZSwgZW50cnktPm5hbWVpZHgsIEFSQ0hfQ09OVkVSVCk7CisJCQlJTlRfTU9EKG1hcC0+c2l6ZSwgQVJDSF9DT05WRVJULCBlbnRzaXplKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIFJlcGxhY2Ugc21hbGxlc3QgcmVnaW9uIChpZiBpdCBpcyBzbWFsbGVyIHRoYW4gZnJlZSdkIGVudHJ5KQorCQkgKi8KKwkJbWFwID0gJmhkci0+ZnJlZW1hcFtzbWFsbGVzdF07CisJCWlmIChJTlRfR0VUKG1hcC0+c2l6ZSwgQVJDSF9DT05WRVJUKSA8IGVudHNpemUpIHsKKwkJCUlOVF9DT1BZKG1hcC0+YmFzZSwgZW50cnktPm5hbWVpZHgsIEFSQ0hfQ09OVkVSVCk7CisJCQlJTlRfU0VUKG1hcC0+c2l6ZSwgQVJDSF9DT05WRVJULCBlbnRzaXplKTsKKwkJfQorCX0KKworCS8qCisJICogRGlkIHdlIHJlbW92ZSB0aGUgZmlyc3QgZW50cnk/CisJICovCisJaWYgKElOVF9HRVQoZW50cnktPm5hbWVpZHgsIEFSQ0hfQ09OVkVSVCkgPT0gSU5UX0dFVChoZHItPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJUKSkKKwkJc21hbGxlc3QgPSAxOworCWVsc2UKKwkJc21hbGxlc3QgPSAwOworCisJLyoKKwkgKiBDb21wcmVzcyB0aGUgcmVtYWluaW5nIGVudHJpZXMgYW5kIHplcm8gb3V0IHRoZSByZW1vdmVkIHN0dWZmLgorCSAqLworCW5hbWVzdCA9IFhGU19ESVJfTEVBRl9OQU1FU1RSVUNUKGxlYWYsIElOVF9HRVQoZW50cnktPm5hbWVpZHgsIEFSQ0hfQ09OVkVSVCkpOworCW1lbXNldCgoY2hhciAqKW5hbWVzdCwgMCwgZW50c2l6ZSk7CisJeGZzX2RhX2xvZ19idWYodHJhbnMsIGJwLCBYRlNfREFfTE9HUkFOR0UobGVhZiwgbmFtZXN0LCBlbnRzaXplKSk7CisKKwlJTlRfTU9EKGhkci0+bmFtZWJ5dGVzLCBBUkNIX0NPTlZFUlQsIC0oZW50cnktPm5hbWVsZW4pKTsKKwl0bXAgPSAoSU5UX0dFVChoZHItPmNvdW50LCBBUkNIX0NPTlZFUlQpIC0gaW5kZXgpICogKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9lbnRyeV90KTsKKwltZW1tb3ZlKGVudHJ5LCBlbnRyeSArIDEsIHRtcCk7CisJSU5UX01PRChoZHItPmNvdW50LCBBUkNIX0NPTlZFUlQsIC0xKTsKKwl4ZnNfZGFfbG9nX2J1Zih0cmFucywgYnAsCisJICAgIFhGU19EQV9MT0dSQU5HRShsZWFmLCBlbnRyeSwgdG1wICsgKHVpbnQpc2l6ZW9mKCplbnRyeSkpKTsKKwllbnRyeSA9ICZsZWFmLT5lbnRyaWVzW0lOVF9HRVQoaGRyLT5jb3VudCwgQVJDSF9DT05WRVJUKV07CisJbWVtc2V0KChjaGFyICopZW50cnksIDAsIHNpemVvZih4ZnNfZGlyX2xlYWZfZW50cnlfdCkpOworCisJLyoKKwkgKiBJZiB3ZSByZW1vdmVkIHRoZSBmaXJzdCBlbnRyeSwgcmUtZmluZCB0aGUgZmlyc3QgdXNlZCBieXRlCisJICogaW4gdGhlIG5hbWUgYXJlYS4gIE5vdGUgdGhhdCBpZiB0aGUgZW50cnkgd2FzIHRoZSAiZmlyc3R1c2VkIiwKKwkgKiB0aGVuIHdlIGRvbid0IGhhdmUgYSAiaG9sZSIgaW4gb3VyIGJsb2NrIHJlc3VsdGluZyBmcm9tCisJICogcmVtb3ZpbmcgdGhlIG5hbWUuCisJICovCisJaWYgKHNtYWxsZXN0KSB7CisJCXRtcCA9IFhGU19MQlNJWkUobXApOworCQllbnRyeSA9ICZsZWFmLT5lbnRyaWVzWzBdOworCQlmb3IgKGkgPSBJTlRfR0VUKGhkci0+Y291bnQsIEFSQ0hfQ09OVkVSVCktMTsgaSA+PSAwOyBlbnRyeSsrLCBpLS0pIHsKKwkJCUFTU0VSVChJTlRfR0VUKGVudHJ5LT5uYW1laWR4LCBBUkNIX0NPTlZFUlQpID49IElOVF9HRVQoaGRyLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCkpOworCQkJQVNTRVJUKElOVF9HRVQoZW50cnktPm5hbWVpZHgsIEFSQ0hfQ09OVkVSVCkgPCBYRlNfTEJTSVpFKG1wKSk7CisJCQlpZiAoSU5UX0dFVChlbnRyeS0+bmFtZWlkeCwgQVJDSF9DT05WRVJUKSA8IHRtcCkKKwkJCQl0bXAgPSBJTlRfR0VUKGVudHJ5LT5uYW1laWR4LCBBUkNIX0NPTlZFUlQpOworCQl9CisJCUlOVF9TRVQoaGRyLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCwgdG1wKTsKKwkJaWYgKCFoZHItPmZpcnN0dXNlZCkKKwkJCUlOVF9TRVQoaGRyLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCwgdG1wIC0gMSk7CisJfSBlbHNlIHsKKwkJaGRyLT5ob2xlcyA9IDE7CQkvKiBtYXJrIGFzIG5lZWRpbmcgY29tcGFjdGlvbiAqLworCX0KKworCXhmc19kYV9sb2dfYnVmKHRyYW5zLCBicCwgWEZTX0RBX0xPR1JBTkdFKGxlYWYsIGhkciwgc2l6ZW9mKCpoZHIpKSk7CisKKwkvKgorCSAqIENoZWNrIGlmIGxlYWYgaXMgbGVzcyB0aGFuIDUwJSBmdWxsLCBjYWxsZXIgbWF5IHdhbnQgdG8KKwkgKiAiam9pbiIgdGhlIGxlYWYgd2l0aCBhIHNpYmxpbmcgaWYgc28uCisJICovCisJdG1wICA9ICh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfaGRyX3QpOworCXRtcCArPSBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSAqICh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfZW50cnlfdCk7CisJdG1wICs9IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpICogKCh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfbmFtZV90KSAtIDEpOworCXRtcCArPSBJTlRfR0VUKGxlYWYtPmhkci5uYW1lYnl0ZXMsIEFSQ0hfQ09OVkVSVCk7CisJaWYgKHRtcCA8IG1wLT5tX2Rpcl9tYWdpY3BjdCkKKwkJcmV0dXJuKDEpOwkJCS8qIGxlYWYgaXMgPCAzNyUgZnVsbCAqLworCXJldHVybigwKTsKK30KKworLyoKKyAqIE1vdmUgYWxsIHRoZSBkaXJlY3RvcnkgZW50cmllcyBmcm9tIGRyb3BfbGVhZiBpbnRvIHNhdmVfbGVhZi4KKyAqLwordm9pZAoreGZzX2Rpcl9sZWFmX3VuYmFsYW5jZSh4ZnNfZGFfc3RhdGVfdCAqc3RhdGUsIHhmc19kYV9zdGF0ZV9ibGtfdCAqZHJvcF9ibGssCisJCQkJICAgICAgeGZzX2RhX3N0YXRlX2Jsa190ICpzYXZlX2JsaykKK3sKKwl4ZnNfZGlyX2xlYWZibG9ja190ICpkcm9wX2xlYWYsICpzYXZlX2xlYWYsICp0bXBfbGVhZjsKKwl4ZnNfZGlyX2xlYWZfaGRyX3QgKmRyb3BfaGRyLCAqc2F2ZV9oZHIsICp0bXBfaGRyOworCXhmc19tb3VudF90ICptcDsKKwljaGFyICp0bXBidWZmZXI7CisKKwkvKgorCSAqIFNldCB1cCBlbnZpcm9ubWVudC4KKwkgKi8KKwltcCA9IHN0YXRlLT5tcDsKKwlBU1NFUlQoZHJvcF9ibGstPm1hZ2ljID09IFhGU19ESVJfTEVBRl9NQUdJQyk7CisJQVNTRVJUKHNhdmVfYmxrLT5tYWdpYyA9PSBYRlNfRElSX0xFQUZfTUFHSUMpOworCWRyb3BfbGVhZiA9IGRyb3BfYmxrLT5icC0+ZGF0YTsKKwlzYXZlX2xlYWYgPSBzYXZlX2Jsay0+YnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQoZHJvcF9sZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSX0xFQUZfTUFHSUMpOworCUFTU0VSVChJTlRfR0VUKHNhdmVfbGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUl9MRUFGX01BR0lDKTsKKwlkcm9wX2hkciA9ICZkcm9wX2xlYWYtPmhkcjsKKwlzYXZlX2hkciA9ICZzYXZlX2xlYWYtPmhkcjsKKworCS8qCisJICogU2F2ZSBsYXN0IGhhc2h2YWwgZnJvbSBkeWluZyBibG9jayBmb3IgbGF0ZXIgQnRyZWUgZml4dXAuCisJICovCisJZHJvcF9ibGstPmhhc2h2YWwgPSBJTlRfR0VUKGRyb3BfbGVhZi0+ZW50cmllc1sgZHJvcF9sZWFmLT5oZHIuY291bnQtMSBdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCk7CisKKwkvKgorCSAqIENoZWNrIGlmIHdlIG5lZWQgYSB0ZW1wIGJ1ZmZlciwgb3IgY2FuIHdlIGRvIGl0IGluIHBsYWNlLgorCSAqIE5vdGUgdGhhdCB3ZSBkb24ndCBjaGVjayAibGVhZiIgZm9yIGhvbGVzIGJlY2F1c2Ugd2Ugd2lsbAorCSAqIGFsd2F5cyBiZSBkcm9wcGluZyBpdCwgdG9vc21hbGwoKSBkZWNpZGVkIHRoYXQgZm9yIHVzIGFscmVhZHkuCisJICovCisJaWYgKHNhdmVfaGRyLT5ob2xlcyA9PSAwKSB7CisJCS8qCisJCSAqIGRlc3QgbGVhZiBoYXMgbm8gaG9sZXMsIHNvIHdlIGFkZCB0aGVyZS4gIE1heSBuZWVkCisJCSAqIHRvIG1ha2Ugc29tZSByb29tIGluIHRoZSBlbnRyeSBhcnJheS4KKwkJICovCisJCWlmICh4ZnNfZGlyX2xlYWZfb3JkZXIoc2F2ZV9ibGstPmJwLCBkcm9wX2Jsay0+YnApKSB7CisJCQl4ZnNfZGlyX2xlYWZfbW92ZWVudHMoZHJvcF9sZWFmLCAwLCBzYXZlX2xlYWYsIDAsCisJCQkJCQkgKGludClJTlRfR0VUKGRyb3BfaGRyLT5jb3VudCwgQVJDSF9DT05WRVJUKSwgbXApOworCQl9IGVsc2UgeworCQkJeGZzX2Rpcl9sZWFmX21vdmVlbnRzKGRyb3BfbGVhZiwgMCwKKwkJCQkJICAgICAgc2F2ZV9sZWFmLCBJTlRfR0VUKHNhdmVfaGRyLT5jb3VudCwgQVJDSF9DT05WRVJUKSwKKwkJCQkJICAgICAgKGludClJTlRfR0VUKGRyb3BfaGRyLT5jb3VudCwgQVJDSF9DT05WRVJUKSwgbXApOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogRGVzdGluYXRpb24gaGFzIGhvbGVzLCBzbyB3ZSBtYWtlIGEgdGVtcG9yYXJ5IGNvcHkKKwkJICogb2YgdGhlIGxlYWYgYW5kIGFkZCB0aGVtIGJvdGggdG8gdGhhdC4KKwkJICovCisJCXRtcGJ1ZmZlciA9IGttZW1fYWxsb2Moc3RhdGUtPmJsb2Nrc2l6ZSwgS01fU0xFRVApOworCQlBU1NFUlQodG1wYnVmZmVyICE9IE5VTEwpOworCQltZW1zZXQodG1wYnVmZmVyLCAwLCBzdGF0ZS0+YmxvY2tzaXplKTsKKwkJdG1wX2xlYWYgPSAoeGZzX2Rpcl9sZWFmYmxvY2tfdCAqKXRtcGJ1ZmZlcjsKKwkJdG1wX2hkciA9ICZ0bXBfbGVhZi0+aGRyOworCQl0bXBfaGRyLT5pbmZvID0gc2F2ZV9oZHItPmluZm87CS8qIHN0cnVjdCBjb3B5ICovCisJCXRtcF9oZHItPmNvdW50ID0gMDsKKwkJSU5UX1NFVCh0bXBfaGRyLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCwgc3RhdGUtPmJsb2Nrc2l6ZSk7CisJCWlmICghdG1wX2hkci0+Zmlyc3R1c2VkKQorCQkJSU5UX1NFVCh0bXBfaGRyLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCwgc3RhdGUtPmJsb2Nrc2l6ZSAtIDEpOworCQl0bXBfaGRyLT5uYW1lYnl0ZXMgPSAwOworCQlpZiAoeGZzX2Rpcl9sZWFmX29yZGVyKHNhdmVfYmxrLT5icCwgZHJvcF9ibGstPmJwKSkgeworCQkJeGZzX2Rpcl9sZWFmX21vdmVlbnRzKGRyb3BfbGVhZiwgMCwgdG1wX2xlYWYsIDAsCisJCQkJCQkgKGludClJTlRfR0VUKGRyb3BfaGRyLT5jb3VudCwgQVJDSF9DT05WRVJUKSwgbXApOworCQkJeGZzX2Rpcl9sZWFmX21vdmVlbnRzKHNhdmVfbGVhZiwgMCwKKwkJCQkJICAgICAgdG1wX2xlYWYsIElOVF9HRVQodG1wX2xlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSwKKwkJCQkJICAgICAgKGludClJTlRfR0VUKHNhdmVfaGRyLT5jb3VudCwgQVJDSF9DT05WRVJUKSwgbXApOworCQl9IGVsc2UgeworCQkJeGZzX2Rpcl9sZWFmX21vdmVlbnRzKHNhdmVfbGVhZiwgMCwgdG1wX2xlYWYsIDAsCisJCQkJCQkgKGludClJTlRfR0VUKHNhdmVfaGRyLT5jb3VudCwgQVJDSF9DT05WRVJUKSwgbXApOworCQkJeGZzX2Rpcl9sZWFmX21vdmVlbnRzKGRyb3BfbGVhZiwgMCwKKwkJCQkJICAgICAgdG1wX2xlYWYsIElOVF9HRVQodG1wX2xlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSwKKwkJCQkJICAgICAgKGludClJTlRfR0VUKGRyb3BfaGRyLT5jb3VudCwgQVJDSF9DT05WRVJUKSwgbXApOworCQl9CisJCW1lbWNweShzYXZlX2xlYWYsIHRtcF9sZWFmLCBzdGF0ZS0+YmxvY2tzaXplKTsKKwkJa21lbV9mcmVlKHRtcGJ1ZmZlciwgc3RhdGUtPmJsb2Nrc2l6ZSk7CisJfQorCisJeGZzX2RhX2xvZ19idWYoc3RhdGUtPmFyZ3MtPnRyYW5zLCBzYXZlX2Jsay0+YnAsIDAsCisJCQkJCSAgIHN0YXRlLT5ibG9ja3NpemUgLSAxKTsKKworCS8qCisJICogQ29weSBvdXQgbGFzdCBoYXNodmFsIGluIGVhY2ggYmxvY2sgZm9yIEItdHJlZSBjb2RlLgorCSAqLworCXNhdmVfYmxrLT5oYXNodmFsID0gSU5UX0dFVChzYXZlX2xlYWYtPmVudHJpZXNbIElOVF9HRVQoc2F2ZV9sZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCktMSBdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSb3V0aW5lcyB1c2VkIGZvciBmaW5kaW5nIHRoaW5ncyBpbiB0aGUgQnRyZWUuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgKiBMb29rIHVwIGEgbmFtZSBpbiBhIGxlYWYgZGlyZWN0b3J5IHN0cnVjdHVyZS4KKyAqIFRoaXMgaXMgdGhlIGludGVybmFsIHJvdXRpbmUsIGl0IHVzZXMgdGhlIGNhbGxlcidzIGJ1ZmZlci4KKyAqCisgKiBOb3RlIHRoYXQgZHVwbGljYXRlIGtleXMgYXJlIGFsbG93ZWQsIGJ1dCBvbmx5IGNoZWNrIHdpdGhpbiB0aGUKKyAqIGN1cnJlbnQgbGVhZiBub2RlLiAgVGhlIEJ0cmVlIGNvZGUgbXVzdCBjaGVjayBpbiBhZGphY2VudCBsZWFmIG5vZGVzLgorICoKKyAqIFJldHVybiBpbiAqaW5kZXggdGhlIGluZGV4IGludG8gdGhlIGVudHJ5W10gYXJyYXkgb2YgZWl0aGVyIHRoZSBmb3VuZAorICogZW50cnksIG9yIHdoZXJlIHRoZSBlbnRyeSBzaG91bGQgaGF2ZSBiZWVuIChpbnNlcnQgYmVmb3JlIHRoYXQgZW50cnkpLgorICoKKyAqIERvbid0IGNoYW5nZSB0aGUgYXJncy0+aW51bWJlciB1bmxlc3Mgd2UgZmluZCB0aGUgZmlsZW5hbWUuCisgKi8KK2ludAoreGZzX2Rpcl9sZWFmX2xvb2t1cF9pbnQoeGZzX2RhYnVmX3QgKmJwLCB4ZnNfZGFfYXJnc190ICphcmdzLCBpbnQgKmluZGV4KQoreworCXhmc19kaXJfbGVhZmJsb2NrX3QgKmxlYWY7CisJeGZzX2Rpcl9sZWFmX2VudHJ5X3QgKmVudHJ5OworCXhmc19kaXJfbGVhZl9uYW1lX3QgKm5hbWVzdDsKKwlpbnQgcHJvYmUsIHNwYW47CisJeGZzX2RhaGFzaF90IGhhc2h2YWw7CisKKwlsZWFmID0gYnAtPmRhdGE7CisJQVNTRVJUKElOVF9HRVQobGVhZi0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUl9MRUFGX01BR0lDKTsKKwlBU1NFUlQoSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgPCAoWEZTX0xCU0laRShhcmdzLT5kcC0+aV9tb3VudCkvOCkpOworCisJLyoKKwkgKiBCaW5hcnkgc2VhcmNoLiAgKG5vdGU6IHNtYWxsIGJsb2NrcyB3aWxsIHNraXAgdGhpcyBsb29wKQorCSAqLworCWhhc2h2YWwgPSBhcmdzLT5oYXNodmFsOworCXByb2JlID0gc3BhbiA9IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpIC8gMjsKKwlmb3IgKGVudHJ5ID0gJmxlYWYtPmVudHJpZXNbcHJvYmVdOyBzcGFuID4gNDsKKwkJICAgZW50cnkgPSAmbGVhZi0+ZW50cmllc1twcm9iZV0pIHsKKwkJc3BhbiAvPSAyOworCQlpZiAoSU5UX0dFVChlbnRyeS0+aGFzaHZhbCwgQVJDSF9DT05WRVJUKSA8IGhhc2h2YWwpCisJCQlwcm9iZSArPSBzcGFuOworCQllbHNlIGlmIChJTlRfR0VUKGVudHJ5LT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpID4gaGFzaHZhbCkKKwkJCXByb2JlIC09IHNwYW47CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKwlBU1NFUlQoKHByb2JlID49IDApICYmIFwKKwkgICAgICAgKCghbGVhZi0+aGRyLmNvdW50KSB8fCAocHJvYmUgPCBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSkpKTsKKwlBU1NFUlQoKHNwYW4gPD0gNCkgfHwgKElOVF9HRVQoZW50cnktPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkgPT0gaGFzaHZhbCkpOworCisJLyoKKwkgKiBTaW5jZSB3ZSBtYXkgaGF2ZSBkdXBsaWNhdGUgaGFzaHZhbCdzLCBmaW5kIHRoZSBmaXJzdCBtYXRjaGluZworCSAqIGhhc2h2YWwgaW4gdGhlIGxlYWYuCisJICovCisJd2hpbGUgKChwcm9iZSA+IDApICYmIChJTlRfR0VUKGVudHJ5LT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpID49IGhhc2h2YWwpKSB7CisJCWVudHJ5LS07CisJCXByb2JlLS07CisJfQorCXdoaWxlICgocHJvYmUgPCBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSkgJiYgKElOVF9HRVQoZW50cnktPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkgPCBoYXNodmFsKSkgeworCQllbnRyeSsrOworCQlwcm9iZSsrOworCX0KKwlpZiAoKHByb2JlID09IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpKSB8fCAoSU5UX0dFVChlbnRyeS0+aGFzaHZhbCwgQVJDSF9DT05WRVJUKSAhPSBoYXNodmFsKSkgeworCQkqaW5kZXggPSBwcm9iZTsKKwkJQVNTRVJUKGFyZ3MtPm9rbm9lbnQpOworCQlyZXR1cm4oWEZTX0VSUk9SKEVOT0VOVCkpOworCX0KKworCS8qCisJICogRHVwbGljYXRlIGtleXMgbWF5IGJlIHByZXNlbnQsIHNvIHNlYXJjaCBhbGwgb2YgdGhlbSBmb3IgYSBtYXRjaC4KKwkgKi8KKwl3aGlsZSAoKHByb2JlIDwgSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkpICYmIChJTlRfR0VUKGVudHJ5LT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpID09IGhhc2h2YWwpKSB7CisJCW5hbWVzdCA9IFhGU19ESVJfTEVBRl9OQU1FU1RSVUNUKGxlYWYsIElOVF9HRVQoZW50cnktPm5hbWVpZHgsIEFSQ0hfQ09OVkVSVCkpOworCQlpZiAoZW50cnktPm5hbWVsZW4gPT0gYXJncy0+bmFtZWxlbiAmJgorCQkgICAgbmFtZXN0LT5uYW1lWzBdID09IGFyZ3MtPm5hbWVbMF0gJiYKKwkJICAgIG1lbWNtcChhcmdzLT5uYW1lLCBuYW1lc3QtPm5hbWUsIGFyZ3MtPm5hbWVsZW4pID09IDApIHsKKwkJCVhGU19ESVJfU0ZfR0VUX0RJUklOTygmbmFtZXN0LT5pbnVtYmVyLCAmYXJncy0+aW51bWJlcik7CisJCQkqaW5kZXggPSBwcm9iZTsKKwkJCXJldHVybihYRlNfRVJST1IoRUVYSVNUKSk7CisJCX0KKwkJZW50cnkrKzsKKwkJcHJvYmUrKzsKKwl9CisJKmluZGV4ID0gcHJvYmU7CisJQVNTRVJUKHByb2JlID09IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpIHx8IGFyZ3MtPm9rbm9lbnQpOworCXJldHVybihYRlNfRVJST1IoRU5PRU5UKSk7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICogTW92ZSB0aGUgaW5kaWNhdGVkIGVudHJpZXMgZnJvbSBvbmUgbGVhZiB0byBhbm90aGVyLgorICogTk9URTogdGhpcyByb3V0aW5lIG1vZGlmaWVzIGJvdGggc291cmNlIGFuZCBkZXN0aW5hdGlvbiBsZWF2ZXMuCisgKi8KKy8qIEFSR1NVU0VEICovCitTVEFUSUMgdm9pZAoreGZzX2Rpcl9sZWFmX21vdmVlbnRzKHhmc19kaXJfbGVhZmJsb2NrX3QgKmxlYWZfcywgaW50IHN0YXJ0X3MsCisJCSAgICAgIHhmc19kaXJfbGVhZmJsb2NrX3QgKmxlYWZfZCwgaW50IHN0YXJ0X2QsCisJCSAgICAgIGludCBjb3VudCwgeGZzX21vdW50X3QgKm1wKQoreworCXhmc19kaXJfbGVhZl9oZHJfdCAqaGRyX3MsICpoZHJfZDsKKwl4ZnNfZGlyX2xlYWZfZW50cnlfdCAqZW50cnlfcywgKmVudHJ5X2Q7CisJaW50IHRtcCwgaTsKKworCS8qCisJICogQ2hlY2sgZm9yIG5vdGhpbmcgdG8gZG8uCisJICovCisJaWYgKGNvdW50ID09IDApCisJCXJldHVybjsKKworCS8qCisJICogU2V0IHVwIGVudmlyb25tZW50LgorCSAqLworCUFTU0VSVChJTlRfR0VUKGxlYWZfcy0+aGRyLmluZm8ubWFnaWMsIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0RJUl9MRUFGX01BR0lDKTsKKwlBU1NFUlQoSU5UX0dFVChsZWFmX2QtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVJfTEVBRl9NQUdJQyk7CisJaGRyX3MgPSAmbGVhZl9zLT5oZHI7CisJaGRyX2QgPSAmbGVhZl9kLT5oZHI7CisJQVNTRVJUKChJTlRfR0VUKGhkcl9zLT5jb3VudCwgQVJDSF9DT05WRVJUKSA+IDApICYmIChJTlRfR0VUKGhkcl9zLT5jb3VudCwgQVJDSF9DT05WRVJUKSA8IChYRlNfTEJTSVpFKG1wKS84KSkpOworCUFTU0VSVChJTlRfR0VUKGhkcl9zLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCkgPj0KKwkJKChJTlRfR0VUKGhkcl9zLT5jb3VudCwgQVJDSF9DT05WRVJUKSpzaXplb2YoKmVudHJ5X3MpKStzaXplb2YoKmhkcl9zKSkpOworCUFTU0VSVChJTlRfR0VUKGhkcl9kLT5jb3VudCwgQVJDSF9DT05WRVJUKSA8IChYRlNfTEJTSVpFKG1wKS84KSk7CisJQVNTRVJUKElOVF9HRVQoaGRyX2QtPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJUKSA+PQorCQkoKElOVF9HRVQoaGRyX2QtPmNvdW50LCBBUkNIX0NPTlZFUlQpKnNpemVvZigqZW50cnlfZCkpK3NpemVvZigqaGRyX2QpKSk7CisKKwlBU1NFUlQoc3RhcnRfcyA8IElOVF9HRVQoaGRyX3MtPmNvdW50LCBBUkNIX0NPTlZFUlQpKTsKKwlBU1NFUlQoc3RhcnRfZCA8PSBJTlRfR0VUKGhkcl9kLT5jb3VudCwgQVJDSF9DT05WRVJUKSk7CisJQVNTRVJUKGNvdW50IDw9IElOVF9HRVQoaGRyX3MtPmNvdW50LCBBUkNIX0NPTlZFUlQpKTsKKworCS8qCisJICogTW92ZSB0aGUgZW50cmllcyBpbiB0aGUgZGVzdGluYXRpb24gbGVhZiB1cCB0byBtYWtlIGEgaG9sZT8KKwkgKi8KKwlpZiAoc3RhcnRfZCA8IElOVF9HRVQoaGRyX2QtPmNvdW50LCBBUkNIX0NPTlZFUlQpKSB7CisJCXRtcCAgPSBJTlRfR0VUKGhkcl9kLT5jb3VudCwgQVJDSF9DT05WRVJUKSAtIHN0YXJ0X2Q7CisJCXRtcCAqPSAodWludClzaXplb2YoeGZzX2Rpcl9sZWFmX2VudHJ5X3QpOworCQllbnRyeV9zID0gJmxlYWZfZC0+ZW50cmllc1tzdGFydF9kXTsKKwkJZW50cnlfZCA9ICZsZWFmX2QtPmVudHJpZXNbc3RhcnRfZCArIGNvdW50XTsKKwkJbWVtY3B5KGVudHJ5X2QsIGVudHJ5X3MsIHRtcCk7CisJfQorCisJLyoKKwkgKiBDb3B5IGFsbCBlbnRyeSdzIGluIHRoZSBzYW1lIChzb3J0ZWQpIG9yZGVyLAorCSAqIGJ1dCBhbGxvY2F0ZSBmaWxlbmFtZXMgcGFja2VkIGFuZCBpbiBzZXF1ZW5jZS4KKwkgKi8KKwllbnRyeV9zID0gJmxlYWZfcy0+ZW50cmllc1tzdGFydF9zXTsKKwllbnRyeV9kID0gJmxlYWZfZC0+ZW50cmllc1tzdGFydF9kXTsKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGVudHJ5X3MrKywgZW50cnlfZCsrLCBpKyspIHsKKwkJQVNTRVJUKElOVF9HRVQoZW50cnlfcy0+bmFtZWlkeCwgQVJDSF9DT05WRVJUKSA+PSBJTlRfR0VUKGhkcl9zLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCkpOworCQl0bXAgPSBYRlNfRElSX0xFQUZfRU5UU0laRV9CWUVOVFJZKGVudHJ5X3MpOworCQlJTlRfTU9EKGhkcl9kLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCwgLSh0bXApKTsKKwkJZW50cnlfZC0+aGFzaHZhbCA9IGVudHJ5X3MtPmhhc2h2YWw7IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCisJCUlOVF9DT1BZKGVudHJ5X2QtPm5hbWVpZHgsIGhkcl9kLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCk7CisJCWVudHJ5X2QtPm5hbWVsZW4gPSBlbnRyeV9zLT5uYW1lbGVuOworCQlBU1NFUlQoSU5UX0dFVChlbnRyeV9kLT5uYW1laWR4LCBBUkNIX0NPTlZFUlQpICsgdG1wIDw9IFhGU19MQlNJWkUobXApKTsKKwkJbWVtY3B5KFhGU19ESVJfTEVBRl9OQU1FU1RSVUNUKGxlYWZfZCwgSU5UX0dFVChlbnRyeV9kLT5uYW1laWR4LCBBUkNIX0NPTlZFUlQpKSwKKwkJICAgICAgIFhGU19ESVJfTEVBRl9OQU1FU1RSVUNUKGxlYWZfcywgSU5UX0dFVChlbnRyeV9zLT5uYW1laWR4LCBBUkNIX0NPTlZFUlQpKSwgdG1wKTsKKwkJQVNTRVJUKElOVF9HRVQoZW50cnlfcy0+bmFtZWlkeCwgQVJDSF9DT05WRVJUKSArIHRtcCA8PSBYRlNfTEJTSVpFKG1wKSk7CisJCW1lbXNldCgoY2hhciAqKVhGU19ESVJfTEVBRl9OQU1FU1RSVUNUKGxlYWZfcywgSU5UX0dFVChlbnRyeV9zLT5uYW1laWR4LCBBUkNIX0NPTlZFUlQpKSwKKwkJICAgICAgMCwgdG1wKTsKKwkJSU5UX01PRChoZHJfcy0+bmFtZWJ5dGVzLCBBUkNIX0NPTlZFUlQsIC0oZW50cnlfZC0+bmFtZWxlbikpOworCQlJTlRfTU9EKGhkcl9kLT5uYW1lYnl0ZXMsIEFSQ0hfQ09OVkVSVCwgZW50cnlfZC0+bmFtZWxlbik7CisJCUlOVF9NT0QoaGRyX3MtPmNvdW50LCBBUkNIX0NPTlZFUlQsIC0xKTsKKwkJSU5UX01PRChoZHJfZC0+Y291bnQsIEFSQ0hfQ09OVkVSVCwgKzEpOworCQl0bXAgID0gSU5UX0dFVChoZHJfZC0+Y291bnQsIEFSQ0hfQ09OVkVSVCkgKiAodWludClzaXplb2YoeGZzX2Rpcl9sZWFmX2VudHJ5X3QpCisJCQkJKyAodWludClzaXplb2YoeGZzX2Rpcl9sZWFmX2hkcl90KTsKKwkJQVNTRVJUKElOVF9HRVQoaGRyX2QtPmZpcnN0dXNlZCwgQVJDSF9DT05WRVJUKSA+PSB0bXApOworCisJfQorCisJLyoKKwkgKiBaZXJvIG91dCB0aGUgZW50cmllcyB3ZSBqdXN0IGNvcGllZC4KKwkgKi8KKwlpZiAoc3RhcnRfcyA9PSBJTlRfR0VUKGhkcl9zLT5jb3VudCwgQVJDSF9DT05WRVJUKSkgeworCQl0bXAgPSBjb3VudCAqICh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfZW50cnlfdCk7CisJCWVudHJ5X3MgPSAmbGVhZl9zLT5lbnRyaWVzW3N0YXJ0X3NdOworCQlBU1NFUlQoKGNoYXIgKillbnRyeV9zICsgdG1wIDw9IChjaGFyICopbGVhZl9zICsgWEZTX0xCU0laRShtcCkpOworCQltZW1zZXQoKGNoYXIgKillbnRyeV9zLCAwLCB0bXApOworCX0gZWxzZSB7CisJCS8qCisJCSAqIE1vdmUgdGhlIHJlbWFpbmluZyBlbnRyaWVzIGRvd24gdG8gZmlsbCB0aGUgaG9sZSwKKwkJICogdGhlbiB6ZXJvIHRoZSBlbnRyaWVzIGF0IHRoZSB0b3AuCisJCSAqLworCQl0bXAgID0gSU5UX0dFVChoZHJfcy0+Y291bnQsIEFSQ0hfQ09OVkVSVCkgLSBjb3VudDsKKwkJdG1wICo9ICh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfZW50cnlfdCk7CisJCWVudHJ5X3MgPSAmbGVhZl9zLT5lbnRyaWVzW3N0YXJ0X3MgKyBjb3VudF07CisJCWVudHJ5X2QgPSAmbGVhZl9zLT5lbnRyaWVzW3N0YXJ0X3NdOworCQltZW1jcHkoZW50cnlfZCwgZW50cnlfcywgdG1wKTsKKworCQl0bXAgPSBjb3VudCAqICh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfZW50cnlfdCk7CisJCWVudHJ5X3MgPSAmbGVhZl9zLT5lbnRyaWVzW0lOVF9HRVQoaGRyX3MtPmNvdW50LCBBUkNIX0NPTlZFUlQpXTsKKwkJQVNTRVJUKChjaGFyICopZW50cnlfcyArIHRtcCA8PSAoY2hhciAqKWxlYWZfcyArIFhGU19MQlNJWkUobXApKTsKKwkJbWVtc2V0KChjaGFyICopZW50cnlfcywgMCwgdG1wKTsKKwl9CisKKwkvKgorCSAqIEZpbGwgaW4gdGhlIGZyZWVtYXAgaW5mb3JtYXRpb24KKwkgKi8KKwlJTlRfU0VUKGhkcl9kLT5mcmVlbWFwWzBdLmJhc2UsIEFSQ0hfQ09OVkVSVCwgKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9oZHJfdCkpOworCUlOVF9NT0QoaGRyX2QtPmZyZWVtYXBbMF0uYmFzZSwgQVJDSF9DT05WRVJULCBJTlRfR0VUKGhkcl9kLT5jb3VudCwgQVJDSF9DT05WRVJUKSAqICh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfZW50cnlfdCkpOworCUlOVF9TRVQoaGRyX2QtPmZyZWVtYXBbMF0uc2l6ZSwgQVJDSF9DT05WRVJULCBJTlRfR0VUKGhkcl9kLT5maXJzdHVzZWQsIEFSQ0hfQ09OVkVSVCkgLSBJTlRfR0VUKGhkcl9kLT5mcmVlbWFwWzBdLmJhc2UsIEFSQ0hfQ09OVkVSVCkpOworCUlOVF9TRVQoaGRyX2QtPmZyZWVtYXBbMV0uYmFzZSwgQVJDSF9DT05WRVJULCAoaGRyX2QtPmZyZWVtYXBbMl0uYmFzZSA9IDApKTsKKwlJTlRfU0VUKGhkcl9kLT5mcmVlbWFwWzFdLnNpemUsIEFSQ0hfQ09OVkVSVCwgKGhkcl9kLT5mcmVlbWFwWzJdLnNpemUgPSAwKSk7CisJaGRyX3MtPmhvbGVzID0gMTsJLyogbGVhZiBtYXkgbm90IGJlIGNvbXBhY3QgKi8KK30KKworLyoKKyAqIENvbXBhcmUgdHdvIGxlYWYgYmxvY2tzICJvcmRlciIuCisgKi8KK2ludAoreGZzX2Rpcl9sZWFmX29yZGVyKHhmc19kYWJ1Zl90ICpsZWFmMV9icCwgeGZzX2RhYnVmX3QgKmxlYWYyX2JwKQoreworCXhmc19kaXJfbGVhZmJsb2NrX3QgKmxlYWYxLCAqbGVhZjI7CisKKwlsZWFmMSA9IGxlYWYxX2JwLT5kYXRhOworCWxlYWYyID0gbGVhZjJfYnAtPmRhdGE7CisJQVNTRVJUKChJTlRfR0VUKGxlYWYxLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSX0xFQUZfTUFHSUMpICYmCisJICAgICAgIChJTlRfR0VUKGxlYWYyLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElSX0xFQUZfTUFHSUMpKTsKKwlpZiAoKElOVF9HRVQobGVhZjEtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKSA+IDApICYmIChJTlRfR0VUKGxlYWYyLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkgPiAwKSAmJgorCSAgICAoKElOVF9HRVQobGVhZjItPmVudHJpZXNbIDAgXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpIDwKKwkgICAgICBJTlRfR0VUKGxlYWYxLT5lbnRyaWVzWyAwIF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSkgfHwKKwkgICAgIChJTlRfR0VUKGxlYWYyLT5lbnRyaWVzWyBJTlRfR0VUKGxlYWYyLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCktMSBdLmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkgPAorCSAgICAgIElOVF9HRVQobGVhZjEtPmVudHJpZXNbIElOVF9HRVQobGVhZjEtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKS0xIF0uaGFzaHZhbCwgQVJDSF9DT05WRVJUKSkpKSB7CisJCXJldHVybigxKTsKKwl9CisJcmV0dXJuKDApOworfQorCisvKgorICogUGljayB1cCB0aGUgbGFzdCBoYXNodmFsdWUgZnJvbSBhIGxlYWYgYmxvY2suCisgKi8KK3hmc19kYWhhc2hfdAoreGZzX2Rpcl9sZWFmX2xhc3RoYXNoKHhmc19kYWJ1Zl90ICpicCwgaW50ICpjb3VudCkKK3sKKwl4ZnNfZGlyX2xlYWZibG9ja190ICpsZWFmOworCisJbGVhZiA9IGJwLT5kYXRhOworCUFTU0VSVChJTlRfR0VUKGxlYWYtPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESVJfTEVBRl9NQUdJQyk7CisJaWYgKGNvdW50KQorCQkqY291bnQgPSBJTlRfR0VUKGxlYWYtPmhkci5jb3VudCwgQVJDSF9DT05WRVJUKTsKKwlpZiAoIWxlYWYtPmhkci5jb3VudCkKKwkJcmV0dXJuKDApOworCXJldHVybihJTlRfR0VUKGxlYWYtPmVudHJpZXNbIElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpLTEgXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpKTsKK30KKworLyoKKyAqIENvcHkgb3V0IGRpcmVjdG9yeSBlbnRyaWVzIGZvciBnZXRkZW50cygpLCBmb3IgbGVhZiBkaXJlY3Rvcmllcy4KKyAqLworaW50Cit4ZnNfZGlyX2xlYWZfZ2V0ZGVudHNfaW50KAorCXhmc19kYWJ1Zl90CSpicCwKKwl4ZnNfaW5vZGVfdAkqZHAsCisJeGZzX2RhYmxrX3QJYm5vLAorCXVpb190CQkqdWlvLAorCWludAkJKmVvYnAsCisJeGZzX2RpcmVudF90CSpkYnAsCisJeGZzX2Rpcl9wdXRfdAlwdXQsCisJeGZzX2RhZGRyX3QJCW5leHRkYSkKK3sKKwl4ZnNfZGlyX2xlYWZibG9ja190CSpsZWFmOworCXhmc19kaXJfbGVhZl9lbnRyeV90CSplbnRyeTsKKwl4ZnNfZGlyX2xlYWZfbmFtZV90CSpuYW1lc3Q7CisJaW50CQkJZW50bm8sIHdhbnRfZW50bm8sIGksIG5leHRlbnRubzsKKwl4ZnNfbW91bnRfdAkJKm1wOworCXhmc19kYWhhc2hfdAkJY29va2hhc2g7CisJeGZzX2RhaGFzaF90CQluZXh0aGFzaCA9IDA7CisjaWYgKEJJVFNfUEVSX0xPTkcgPT0gMzIpCisJeGZzX2RhaGFzaF90CQlsYXN0aGFzaCA9IFhGU19EQV9NQVhIQVNIOworI2VuZGlmCisJeGZzX2Rpcl9wdXRfYXJnc190CXA7CisKKwltcCA9IGRwLT5pX21vdW50OworCWxlYWYgPSBicC0+ZGF0YTsKKwlpZiAoSU5UX0dFVChsZWFmLT5oZHIuaW5mby5tYWdpYywgQVJDSF9DT05WRVJUKSAhPSBYRlNfRElSX0xFQUZfTUFHSUMpIHsKKwkJKmVvYnAgPSAxOworCQlyZXR1cm4oWEZTX0VSUk9SKEVOT0VOVCkpOwkvKiBYWFggd3JvbmcgY29kZSAqLworCX0KKworCXdhbnRfZW50bm8gPSBYRlNfREFfQ09PS0lFX0VOVFJZKG1wLCB1aW8tPnVpb19vZmZzZXQpOworCisJY29va2hhc2ggPSBYRlNfREFfQ09PS0lFX0hBU0gobXAsIHVpby0+dWlvX29mZnNldCk7CisKKwl4ZnNfZGlyX3RyYWNlX2dfZHVsKCJsZWFmOiBzdGFydCIsIGRwLCB1aW8sIGxlYWYpOworCisJLyoKKwkgKiBSZS1maW5kIG91ciBwbGFjZS4KKwkgKi8KKwlmb3IgKGkgPSBlbnRubyA9IDAsIGVudHJ5ID0gJmxlYWYtPmVudHJpZXNbMF07CisJCSAgICAgaSA8IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOworCQkJICAgICBlbnRyeSsrLCBpKyspIHsKKworCQluYW1lc3QgPSBYRlNfRElSX0xFQUZfTkFNRVNUUlVDVChsZWFmLAorCQkJCSAgICBJTlRfR0VUKGVudHJ5LT5uYW1laWR4LCBBUkNIX0NPTlZFUlQpKTsKKworCQlpZiAodW5saWtlbHkoCisJCSAgICAoKGNoYXIgKiluYW1lc3QgPCAoY2hhciAqKWxlYWYpIHx8CisJCSAgICAoKGNoYXIgKiluYW1lc3QgPj0gKGNoYXIgKilsZWFmICsgWEZTX0xCU0laRShtcCkpKSkgeworCQkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhmc19kaXJfbGVhZl9nZXRkZW50c19pbnQoMSkiLAorCQkJCQkgICAgIFhGU19FUlJMRVZFTF9MT1csIG1wLCBsZWFmKTsKKwkJCXhmc19kaXJfdHJhY2VfZ19kdSgibGVhZjogY29ycnVwdGVkIiwgZHAsIHVpbyk7CisJCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJCX0KKwkJaWYgKElOVF9HRVQoZW50cnktPmhhc2h2YWwsIEFSQ0hfQ09OVkVSVCkgPj0gY29va2hhc2gpIHsKKwkJCWlmICggICBlbnRubyA8IHdhbnRfZW50bm8KKwkJCSAgICAmJiBJTlRfR0VUKGVudHJ5LT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpCisJCQkJCQkJPT0gY29va2hhc2gpIHsKKwkJCQkvKgorCQkJCSAqIFRyeWluZyB0byBnZXQgdG8gYSBwYXJ0aWN1bGFyIG9mZnNldCBpbiBhCisJCQkJICogcnVuIG9mIGVxdWFsLWhhc2h2YWwgZW50cmllcy4KKwkJCQkgKi8KKwkJCQllbnRubysrOworCQkJfSBlbHNlIGlmICggICB3YW50X2VudG5vID4gMAorCQkJCSAgICYmIGVudG5vID09IHdhbnRfZW50bm8KKwkJCQkgICAmJiBJTlRfR0VUKGVudHJ5LT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpCisJCQkJCQkJPT0gY29va2hhc2gpIHsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJZW50bm8gPSAwOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKGkgPT0gSU5UX0dFVChsZWFmLT5oZHIuY291bnQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJeGZzX2Rpcl90cmFjZV9nX2R1KCJsZWFmOiBoYXNoIG5vdCBmb3VuZCIsIGRwLCB1aW8pOworCQlpZiAoIUlOVF9HRVQobGVhZi0+aGRyLmluZm8uZm9ydywgQVJDSF9DT05WRVJUKSkKKwkJCXVpby0+dWlvX29mZnNldCA9CisJCQkJWEZTX0RBX01BS0VfQ09PS0lFKG1wLCAwLCAwLCBYRlNfREFfTUFYSEFTSCk7CisJCS8qCisJCSAqIERvbid0IHNldCB1aW9fb2Zmc2V0IGlmIHRoZXJlJ3MgYW5vdGhlciBibG9jazoKKwkJICogdGhlIG5vZGUgY29kZSB3aWxsIGJlIHNldHRpbmcgdWlvX29mZnNldCBhbnl3YXkuCisJCSAqLworCQkqZW9icCA9IDA7CisJCXJldHVybigwKTsKKwl9CisJeGZzX2Rpcl90cmFjZV9nX2R1ZSgibGVhZjogaGFzaCBmb3VuZCIsIGRwLCB1aW8sIGVudHJ5KTsKKworCXAuZGJwID0gZGJwOworCXAucHV0ID0gcHV0OworCXAudWlvID0gdWlvOworCisJLyoKKwkgKiBXZSdyZSBzeW5jaHJvbml6ZWQsIHN0YXJ0IGNvcHlpbmcgZW50cmllcyBvdXQgdG8gdGhlIHVzZXIuCisJICovCisJZm9yICg7IGVudG5vID49IDAgJiYgaSA8IElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpOworCQkJICAgICBlbnRyeSsrLCBpKyssIChlbnRubyA9IG5leHRlbnRubykpIHsKKwkJaW50IGxhc3RyZXNpZD0wLCByZXR2YWw7CisJCXhmc19kaXJjb29rX3QgbGFzdG9mZnNldDsKKwkJeGZzX2RhaGFzaF90IHRoaXNoYXNoOworCisJCS8qCisJCSAqIENoZWNrIGZvciBhIGRhbWFnZWQgZGlyZWN0b3J5IGxlYWYgYmxvY2sgYW5kIHBpY2sgdXAKKwkJICogdGhlIGlub2RlIG51bWJlciBmcm9tIHRoaXMgZW50cnkuCisJCSAqLworCQluYW1lc3QgPSBYRlNfRElSX0xFQUZfTkFNRVNUUlVDVChsZWFmLAorCQkJCSAgICBJTlRfR0VUKGVudHJ5LT5uYW1laWR4LCBBUkNIX0NPTlZFUlQpKTsKKworCQlpZiAodW5saWtlbHkoCisJCSAgICAoKGNoYXIgKiluYW1lc3QgPCAoY2hhciAqKWxlYWYpIHx8CisJCSAgICAoKGNoYXIgKiluYW1lc3QgPj0gKGNoYXIgKilsZWFmICsgWEZTX0xCU0laRShtcCkpKSkgeworCQkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhmc19kaXJfbGVhZl9nZXRkZW50c19pbnQoMikiLAorCQkJCQkgICAgIFhGU19FUlJMRVZFTF9MT1csIG1wLCBsZWFmKTsKKwkJCXhmc19kaXJfdHJhY2VfZ19kdSgibGVhZjogY29ycnVwdGVkIiwgZHAsIHVpbyk7CisJCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJCX0KKworCQl4ZnNfZGlyX3RyYWNlX2dfZHVjKCJsZWFmOiBtaWRkbGUgY29va2llICAiLAorCQkJCQkJICAgZHAsIHVpbywgcC5jb29rLm8pOworCisJCWlmIChpIDwgKElOVF9HRVQobGVhZi0+aGRyLmNvdW50LCBBUkNIX0NPTlZFUlQpIC0gMSkpIHsKKwkJCW5leHRoYXNoID0gSU5UX0dFVChlbnRyeVsxXS5oYXNodmFsLCBBUkNIX0NPTlZFUlQpOworCisJCQlpZiAobmV4dGhhc2ggPT0gSU5UX0dFVChlbnRyeS0+aGFzaHZhbCwgQVJDSF9DT05WRVJUKSkKKwkJCQluZXh0ZW50bm8gPSBlbnRubyArIDE7CisJCQllbHNlCisJCQkJbmV4dGVudG5vID0gMDsKKwkJCVhGU19QVVRfQ09PS0lFKHAuY29vaywgbXAsIGJubywgbmV4dGVudG5vLCBuZXh0aGFzaCk7CisJCQl4ZnNfZGlyX3RyYWNlX2dfZHVjKCJsZWFmOiBtaWRkbGUgY29va2llICAiLAorCQkJCQkJICAgZHAsIHVpbywgcC5jb29rLm8pOworCisJCX0gZWxzZSBpZiAoKHRoaXNoYXNoID0gSU5UX0dFVChsZWFmLT5oZHIuaW5mby5mb3J3LAorCQkJCQkJCUFSQ0hfQ09OVkVSVCkpKSB7CisJCQl4ZnNfZGFidWZfdCAqYnAyOworCQkJeGZzX2Rpcl9sZWFmYmxvY2tfdCAqbGVhZjI7CisKKwkJCUFTU0VSVChuZXh0ZGEgIT0gLTEpOworCisJCQlyZXR2YWwgPSB4ZnNfZGFfcmVhZF9idWYoZHAtPmlfdHJhbnNwLCBkcCwgdGhpc2hhc2gsCisJCQkJCQkgbmV4dGRhLCAmYnAyLCBYRlNfREFUQV9GT1JLKTsKKwkJCWlmIChyZXR2YWwpCisJCQkJcmV0dXJuKHJldHZhbCk7CisKKwkJCUFTU0VSVChicDIgIT0gTlVMTCk7CisKKwkJCWxlYWYyID0gYnAyLT5kYXRhOworCisJCQlpZiAodW5saWtlbHkoCisJCQkgICAgICAgKElOVF9HRVQobGVhZjItPmhkci5pbmZvLm1hZ2ljLCBBUkNIX0NPTlZFUlQpCisJCQkJCQkhPSBYRlNfRElSX0xFQUZfTUFHSUMpCisJCQkgICAgfHwgKElOVF9HRVQobGVhZjItPmhkci5pbmZvLmJhY2ssIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCSE9IGJubykpKSB7CS8qIEdST1QgKi8KKwkJCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGZzX2Rpcl9sZWFmX2dldGRlbnRzX2ludCgzKSIsCisJCQkJCQkgICAgIFhGU19FUlJMRVZFTF9MT1csIG1wLAorCQkJCQkJICAgICBsZWFmMik7CisJCQkJeGZzX2RhX2JyZWxzZShkcC0+aV90cmFuc3AsIGJwMik7CisKKwkJCQlyZXR1cm4oWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCkpOworCQkJfQorCisJCQluZXh0aGFzaCA9IElOVF9HRVQobGVhZjItPmVudHJpZXNbMF0uaGFzaHZhbCwKKwkJCQkJCQkJQVJDSF9DT05WRVJUKTsKKwkJCW5leHRlbnRubyA9IC0xOworCQkJWEZTX1BVVF9DT09LSUUocC5jb29rLCBtcCwgdGhpc2hhc2gsIDAsIG5leHRoYXNoKTsKKwkJCXhmc19kYV9icmVsc2UoZHAtPmlfdHJhbnNwLCBicDIpOworCQkJeGZzX2Rpcl90cmFjZV9nX2R1YygibGVhZjogbmV4dCBibGsgY29va2llIiwKKwkJCQkJCSAgIGRwLCB1aW8sIHAuY29vay5vKTsKKwkJfSBlbHNlIHsKKwkJCW5leHRlbnRubyA9IC0xOworCQkJWEZTX1BVVF9DT09LSUUocC5jb29rLCBtcCwgMCwgMCwgWEZTX0RBX01BWEhBU0gpOworCQl9CisKKwkJLyoKKwkJICogU2F2ZSBvZmYgdGhlIGNvb2tpZSBzbyB3ZSBjYW4gZmFsbCBiYWNrIHNob3VsZCB0aGUKKwkJICogJ3B1dCcgaW50byB0aGUgb3V0Z29pbmcgYnVmZmVyIGZhaWxzLiAgVG8gaGFuZGxlIGEgcnVuCisJCSAqIG9mIGVxdWFsLWhhc2h2YWxzLCB0aGUgb2ZmX3Qgc3RydWN0dXJlIG9uIDY0Yml0CisJCSAqIGJ1aWxkcyBoYXMgZW50bm8gYnVpbHQgaW50byB0aGUgY29va2llIHRvIElEIHRoZQorCQkgKiBlbnRyeS4gIE9uIDMyYml0IGJ1aWxkcywgd2Ugb25seSBoYXZlIHNwYWNlIGZvciB0aGUKKwkJICogaGFzaHZhbCBzbyB3ZSBjYW4ndCBJRCBzcGVjaWZpYyBlbnRyaWVzIHdpdGhpbiBhIGdyb3VwCisJCSAqIG9mIHNhbWUgaGFzaHZhbCBlbnRyaWVzLiAgIEZvciB0aGlzLCBsYXN0b2Zmc2V0IGlzIHNldAorCQkgKiB0byB0aGUgZmlyc3QgaW4gdGhlIHJ1biBvZiBlcXVhbCBoYXNodmFscyBzbyB3ZSBkb24ndAorCQkgKiBpbmNsdWRlIGFueSBlbnRyaWVzIHVubGVzcyB3ZSBjYW4gaW5jbHVkZSBhbGwgZW50cmllcworCQkgKiB0aGF0IHNoYXJlIHRoZSBzYW1lIGhhc2h2YWwuICBIb3BlZnVsbHkgdGhlIGJ1ZmZlcgorCQkgKiBwcm92aWRlZCBpcyBiaWcgZW5vdWdoIHRvIGhhbmRsZSBpdCAoc2VlIHB2NzYzNTE3KS4KKwkJICovCisjaWYgKEJJVFNfUEVSX0xPTkcgPT0gMzIpCisJCWlmICgodGhpc2hhc2ggPSBJTlRfR0VUKGVudHJ5LT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpKQorCQkJCQkJCQkhPSBsYXN0aGFzaCkgeworCQkJWEZTX1BVVF9DT09LSUUobGFzdG9mZnNldCwgbXAsIGJubywgZW50bm8sIHRoaXNoYXNoKTsKKwkJCWxhc3RyZXNpZCA9IHVpby0+dWlvX3Jlc2lkOworCQkJbGFzdGhhc2ggPSB0aGlzaGFzaDsKKwkJfSBlbHNlIHsKKwkJCXhmc19kaXJfdHJhY2VfZ19kdWMoImxlYWY6IERVUCBDT09LSUVTLCBza2lwcGVkIiwKKwkJCQkJCSAgIGRwLCB1aW8sIHAuY29vay5vKTsKKwkJfQorI2Vsc2UKKwkJdGhpc2hhc2ggPSBJTlRfR0VUKGVudHJ5LT5oYXNodmFsLCBBUkNIX0NPTlZFUlQpOworCQlYRlNfUFVUX0NPT0tJRShsYXN0b2Zmc2V0LCBtcCwgYm5vLCBlbnRubywgdGhpc2hhc2gpOworCQlsYXN0cmVzaWQgPSB1aW8tPnVpb19yZXNpZDsKKyNlbmRpZiAvKiBCSVRTX1BFUl9MT05HID09IDMyICovCisKKwkJLyoKKwkJICogUHV0IHRoZSBjdXJyZW50IGVudHJ5IGludG8gdGhlIG91dGdvaW5nIGJ1ZmZlci4gIElmIHdlIGZhaWwKKwkJICogdGhlbiByZXN0b3JlIHRoZSBVSU8gdG8gdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBjdXJyZW50CisJCSAqIHJ1biBvZiBlcXVhbC1oYXNodmFsIGVudHJpZXMgKHByb2JhYmx5IG9uZSAxIGVudHJ5IGxvbmcpLgorCQkgKi8KKwkJcC5pbm8gPSBYRlNfR0VUX0RJUl9JTk84KG5hbWVzdC0+aW51bWJlcik7CisjaWYgWEZTX0JJR19JTlVNUworCQlwLmlubyArPSBtcC0+bV9pbm9hZGQ7CisjZW5kaWYKKwkJcC5uYW1lID0gKGNoYXIgKiluYW1lc3QtPm5hbWU7CisJCXAubmFtZWxlbiA9IGVudHJ5LT5uYW1lbGVuOworCisJCXJldHZhbCA9IHAucHV0KCZwKTsKKworCQlpZiAoIXAuZG9uZSkgeworCQkJdWlvLT51aW9fb2Zmc2V0ID0gbGFzdG9mZnNldC5vOworCQkJdWlvLT51aW9fcmVzaWQgPSBsYXN0cmVzaWQ7CisKKwkJCSplb2JwID0gMTsKKworCQkJeGZzX2Rpcl90cmFjZV9nX2R1KCJsZWFmOiBFLU8tQiIsIGRwLCB1aW8pOworCisJCQlyZXR1cm4ocmV0dmFsKTsKKwkJfQorCX0KKworCXVpby0+dWlvX29mZnNldCA9IHAuY29vay5vOworCisJKmVvYnAgPSAwOworCisJeGZzX2Rpcl90cmFjZV9nX2R1KCJsZWFmOiBFLU8tRiIsIGRwLCB1aW8pOworCisJcmV0dXJuKDApOworfQorCisvKgorICogRm9ybWF0IGEgZGlyZW50NjQgc3RydWN0dXJlIGFuZCBjb3B5IGl0IG91dCB0aGUgdGhlIHVzZXIncyBidWZmZXIuCisgKi8KK2ludAoreGZzX2Rpcl9wdXRfZGlyZW50NjRfZGlyZWN0KHhmc19kaXJfcHV0X2FyZ3NfdCAqcGEpCit7CisJaW92ZWNfdCAqaW92cDsKKwlpbnQgcmVjbGVuLCBuYW1lbGVuOworCXhmc19kaXJlbnRfdCAqaWRicDsKKwl1aW9fdCAqdWlvOworCisJbmFtZWxlbiA9IHBhLT5uYW1lbGVuOworCXJlY2xlbiA9IERJUkVOVFNJWkUobmFtZWxlbik7CisJdWlvID0gcGEtPnVpbzsKKwlpZiAocmVjbGVuID4gdWlvLT51aW9fcmVzaWQpIHsKKwkJcGEtPmRvbmUgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJaW92cCA9IHVpby0+dWlvX2lvdjsKKwlpZGJwID0gKHhmc19kaXJlbnRfdCAqKWlvdnAtPmlvdl9iYXNlOworCWlvdnAtPmlvdl9iYXNlID0gKGNoYXIgKilpZGJwICsgcmVjbGVuOworCWlvdnAtPmlvdl9sZW4gLT0gcmVjbGVuOworCXVpby0+dWlvX3Jlc2lkIC09IHJlY2xlbjsKKwlpZGJwLT5kX3JlY2xlbiA9IHJlY2xlbjsKKwlpZGJwLT5kX2lubyA9IHBhLT5pbm87CisJaWRicC0+ZF9vZmYgPSBwYS0+Y29vay5vOworCWlkYnAtPmRfbmFtZVtuYW1lbGVuXSA9ICdcMCc7CisJcGEtPmRvbmUgPSAxOworCW1lbWNweShpZGJwLT5kX25hbWUsIHBhLT5uYW1lLCBuYW1lbGVuKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZvcm1hdCBhIGRpcmVudDY0IHN0cnVjdHVyZSBhbmQgY29weSBpdCBvdXQgdGhlIHRoZSB1c2VyJ3MgYnVmZmVyLgorICovCitpbnQKK3hmc19kaXJfcHV0X2RpcmVudDY0X3Vpbyh4ZnNfZGlyX3B1dF9hcmdzX3QgKnBhKQoreworCWludAkJcmV0dmFsLCByZWNsZW4sIG5hbWVsZW47CisJeGZzX2RpcmVudF90CSppZGJwOworCXVpb190CQkqdWlvOworCisJbmFtZWxlbiA9IHBhLT5uYW1lbGVuOworCXJlY2xlbiA9IERJUkVOVFNJWkUobmFtZWxlbik7CisJdWlvID0gcGEtPnVpbzsKKwlpZiAocmVjbGVuID4gdWlvLT51aW9fcmVzaWQpIHsKKwkJcGEtPmRvbmUgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJaWRicCA9IHBhLT5kYnA7CisJaWRicC0+ZF9yZWNsZW4gPSByZWNsZW47CisJaWRicC0+ZF9pbm8gPSBwYS0+aW5vOworCWlkYnAtPmRfb2ZmID0gcGEtPmNvb2subzsKKwlpZGJwLT5kX25hbWVbbmFtZWxlbl0gPSAnXDAnOworCW1lbWNweShpZGJwLT5kX25hbWUsIHBhLT5uYW1lLCBuYW1lbGVuKTsKKwlyZXR2YWwgPSB1aW9fcmVhZCgoY2FkZHJfdClpZGJwLCByZWNsZW4sIHVpbyk7CisJcGEtPmRvbmUgPSAocmV0dmFsID09IDApOworCXJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2Rpcl9sZWFmLmggYi9mcy94ZnMveGZzX2Rpcl9sZWFmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBkNjhkMwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfZGlyX2xlYWYuaApAQCAtMCwwICsxLDI0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfRElSX0xFQUZfSF9fCisjZGVmaW5lCV9fWEZTX0RJUl9MRUFGX0hfXworCisvKgorICogRGlyZWN0b3J5IGxheW91dCwgaW50ZXJuYWwgc3RydWN0dXJlLCBhY2Nlc3MgbWFjcm9zLCBldGMuCisgKgorICogTGFyZ2UgZGlyZWN0b3JpZXMgYXJlIHN0cnVjdHVyZWQgYXJvdW5kIEJ0cmVlcyB3aGVyZSBhbGwgdGhlIGRhdGEKKyAqIGVsZW1lbnRzIGFyZSBpbiB0aGUgbGVhZiBub2Rlcy4gIEZpbGVuYW1lcyBhcmUgaGFzaGVkIGludG8gYW4gaW50LAorICogdGhlbiB0aGF0IGludCBpcyB1c2VkIGFzIHRoZSBpbmRleCBpbnRvIHRoZSBCdHJlZS4gIFNpbmNlIHRoZSBoYXNodmFsCisgKiBvZiBhIGZpbGVuYW1lIG1heSBub3QgYmUgdW5pcXVlLCB3ZSBtYXkgaGF2ZSBkdXBsaWNhdGUga2V5cy4gIFRoZQorICogaW50ZXJuYWwgbGlua3MgaW4gdGhlIEJ0cmVlIGFyZSBsb2dpY2FsIGJsb2NrIG9mZnNldHMgaW50byB0aGUgZmlsZS4KKyAqLworCitzdHJ1Y3QgdWlvOworc3RydWN0IHhmc19ibWFwX2ZyZWU7CitzdHJ1Y3QgeGZzX2RhYnVmOworc3RydWN0IHhmc19kYV9hcmdzOworc3RydWN0IHhmc19kYV9zdGF0ZTsKK3N0cnVjdCB4ZnNfZGFfc3RhdGVfYmxrOworc3RydWN0IHhmc19kaXJfcHV0X2FyZ3M7CitzdHJ1Y3QgeGZzX2lub2RlOworc3RydWN0IHhmc19tb3VudDsKK3N0cnVjdCB4ZnNfdHJhbnM7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBEaXJlY3RvcnkgU3RydWN0dXJlIHdoZW4gZXF1YWwgdG8gWEZTX0xCU0laRShtcCkgYnl0ZXMuCisgKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qCisgKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGxlYWYgbm9kZXMgaW4gdGhlIEJ0cmVlLgorICoKKyAqIFN0cnVjdCBsZWFmX2VudHJ5J3MgYXJlIHBhY2tlZCBmcm9tIHRoZSB0b3AuICBOYW1lcyBncm93IGZyb20gdGhlIGJvdHRvbQorICogYnV0IGFyZSBub3QgcGFja2VkLiAgVGhlIGZyZWVtYXAgY29udGFpbnMgcnVuLWxlbmd0aC1lbmNvZGVkIGVudHJpZXMKKyAqIGZvciB0aGUgZnJlZSBieXRlcyBhZnRlciB0aGUgbGVhZl9lbnRyeSdzLCBidXQgb25seSB0aGUgTiBsYXJnZXN0IHN1Y2gsCisgKiBzbWFsbGVyIHJ1bnMgYXJlIGRyb3BwZWQuICBXaGVuIHRoZSBmcmVlbWFwIGRvZXNuJ3Qgc2hvdyBlbm91Z2ggc3BhY2UKKyAqIGZvciBhbiBhbGxvY2F0aW9uLCB3ZSBjb21wYWN0IHRoZSBuYW1lbGlzdCBhcmVhIGFuZCB0cnkgYWdhaW4uICBJZiB3ZQorICogc3RpbGwgZG9uJ3QgaGF2ZSBlbm91Z2ggc3BhY2UsIHRoZW4gd2UgaGF2ZSB0byBzcGxpdCB0aGUgYmxvY2suCisgKgorICogU2luY2Ugd2UgaGF2ZSBkdXBsaWNhdGUgaGFzaCBrZXlzLCBmb3IgZWFjaCBrZXkgdGhhdCBtYXRjaGVzLCBjb21wYXJlCisgKiB0aGUgYWN0dWFsIHN0cmluZy4gIFRoZSByb290IGFuZCBpbnRlcm1lZGlhdGUgbm9kZSBzZWFyY2ggYWx3YXlzIHRha2VzCisgKiB0aGUgZmlyc3QtaW4tdGhlLWJsb2NrIGtleSBtYXRjaCBmb3VuZCwgc28gd2Ugc2hvdWxkIG9ubHkgaGF2ZSB0byB3b3JrCisgKiAiZm9ydyJhcmQuICBJZiBub25lIG1hdGNoZXMsIGNvbnRpbnVlIHdpdGggdGhlICJmb3J3ImFyZCBsZWFmIG5vZGVzCisgKiB1bnRpbCB0aGUgaGFzaCBrZXkgY2hhbmdlcyBvciB0aGUgZmlsZW5hbWUgaXMgZm91bmQuCisgKgorICogVGhlIHBhcmVudCBkaXJlY3RvcnkgYW5kIHRoZSBzZWxmLXBvaW50ZXIgYXJlIGV4cGxpY2l0bHkgcmVwcmVzZW50ZWQKKyAqIChpZTogdGhlcmUgYXJlIGVudHJpZXMgZm9yICIuIiBhbmQgIi4uIikuCisgKgorICogTm90ZSB0aGF0IHRoZSBjb3VudCBiZWluZyBhIF9fdWludDE2X3QgbGltaXRzIHVzIHRvIHNvbWV0aGluZyBsaWtlIGEKKyAqIGJsb2Nrc2l6ZSBvZiAxLjNNQiBpbiB0aGUgZmFjZSBvZiB3b3JzdCBjYXNlIChzaG9ydCkgZmlsZW5hbWVzLgorICovCisjZGVmaW5lIFhGU19ESVJfTEVBRl9NQVBTSVpFCTMJLyogaG93IG1hbnkgZnJlZXNwYWNlIHNsb3RzICovCisKK3R5cGVkZWYgc3RydWN0IHhmc19kaXJfbGVhZmJsb2NrIHsKKwlzdHJ1Y3QgeGZzX2Rpcl9sZWFmX2hkciB7CS8qIGNvbnN0YW50LXN0cnVjdHVyZSBoZWFkZXIgYmxvY2sgKi8KKwkJeGZzX2RhX2Jsa2luZm9fdCBpbmZvOwkvKiBibG9jayB0eXBlLCBsaW5rcywgZXRjLiAqLworCQlfX3VpbnQxNl90IGNvdW50OwkvKiBjb3VudCBvZiBhY3RpdmUgbGVhZl9lbnRyeSdzICovCisJCV9fdWludDE2X3QgbmFtZWJ5dGVzOwkvKiBudW0gYnl0ZXMgb2YgbmFtZSBzdHJpbmdzIHN0b3JlZCAqLworCQlfX3VpbnQxNl90IGZpcnN0dXNlZDsJLyogZmlyc3QgdXNlZCBieXRlIGluIG5hbWUgYXJlYSAqLworCQlfX3VpbnQ4X3QgIGhvbGVzOwkvKiAhPSAwIGlmIGJsayBuZWVkcyBjb21wYWN0aW9uICovCisJCV9fdWludDhfdCAgcGFkMTsKKwkJc3RydWN0IHhmc19kaXJfbGVhZl9tYXAgey8qIFJMRSBtYXAgb2YgZnJlZSBieXRlcyAqLworCQkJX191aW50MTZfdCBiYXNlOyAvKiBiYXNlIG9mIGZyZWUgcmVnaW9uICovCisJCQlfX3VpbnQxNl90IHNpemU7IC8qIHJ1biBsZW5ndGggb2YgZnJlZSByZWdpb24gKi8KKwkJfSBmcmVlbWFwW1hGU19ESVJfTEVBRl9NQVBTSVpFXTsgLyogTiBsYXJnZXN0IGZyZWUgcmVnaW9ucyAqLworCX0gaGRyOworCXN0cnVjdCB4ZnNfZGlyX2xlYWZfZW50cnkgewkvKiBzb3J0ZWQgb24ga2V5LCBub3QgbmFtZSAqLworCQl4ZnNfZGFoYXNoX3QgaGFzaHZhbDsJLyogaGFzaCB2YWx1ZSBvZiBuYW1lICovCisJCV9fdWludDE2X3QgbmFtZWlkeDsJLyogaW5kZXggaW50byBidWZmZXIgb2YgbmFtZSAqLworCQlfX3VpbnQ4X3QgbmFtZWxlbjsJLyogbGVuZ3RoIG9mIG5hbWUgc3RyaW5nICovCisJCV9fdWludDhfdCBwYWQyOworCX0gZW50cmllc1sxXTsJCQkvKiB2YXIgc2l6ZWQgYXJyYXkgKi8KKwlzdHJ1Y3QgeGZzX2Rpcl9sZWFmX25hbWUgeworCQl4ZnNfZGlyX2lub190IGludW1iZXI7CS8qIGlub2RlIG51bWJlciBmb3IgdGhpcyBrZXkgKi8KKwkJX191aW50OF90IG5hbWVbMV07CS8qIG5hbWUgc3RyaW5nIGl0c2VsZiAqLworCX0gbmFtZWxpc3RbMV07CQkJLyogZ3Jvd3MgZnJvbSBib3R0b20gb2YgYnVmICovCit9IHhmc19kaXJfbGVhZmJsb2NrX3Q7Cit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlyX2xlYWZfaGRyIHhmc19kaXJfbGVhZl9oZHJfdDsKK3R5cGVkZWYgc3RydWN0IHhmc19kaXJfbGVhZl9tYXAgeGZzX2Rpcl9sZWFmX21hcF90OwordHlwZWRlZiBzdHJ1Y3QgeGZzX2Rpcl9sZWFmX2VudHJ5IHhmc19kaXJfbGVhZl9lbnRyeV90OwordHlwZWRlZiBzdHJ1Y3QgeGZzX2Rpcl9sZWFmX25hbWUgeGZzX2Rpcl9sZWFmX25hbWVfdDsKKworLyoKKyAqIExlbmd0aCBvZiBuYW1lIGZvciB3aGljaCBhIDUxMi1ieXRlIGJsb2NrIGZpbGVzeXN0ZW0KKyAqIGNhbiBnZXQgYSBkb3VibGUgc3BsaXQuCisgKi8KKyNkZWZpbmUJWEZTX0RJUl9MRUFGX0NBTl9ET1VCTEVfU1BMSVRfTEVOCVwKKwkoNTEyIC0gKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9oZHJfdCkgLSBcCisJICh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfZW50cnlfdCkgKiAyIC0gXAorCSAodWludClzaXplb2YoeGZzX2Rpcl9sZWFmX25hbWVfdCkgKiAyIC0gKE1BWE5BTUVMRU4gLSAyKSArIDEgKyAxKQorCit0eXBlZGVmIGludCAoKnhmc19kaXJfcHV0X3QpKHN0cnVjdCB4ZnNfZGlyX3B1dF9hcmdzICpwYSk7CisKK3R5cGVkZWYgdW5pb24geworCXhmc19vZmZfdAkJbzsJCS8qIG9mZnNldCAoY29va2llKSAqLworCS8qCisJICogV2F0Y2ggdGhlIG9yZGVyIGhlcmUgKGVuZGlhbi1uZXNzIGRlcGVuZGVudCkuCisJICovCisJc3RydWN0IHsKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisJCXhmc19kYWhhc2hfdAloOwkvKiBoYXNoIHZhbHVlICovCisJCV9fdWludDMyX3QJYmU7CS8qIGJsb2NrIGFuZCBlbnRyeSAqLworI2Vsc2UJLyogX19CWVRFX09SREVSID09IF9fQklHX0VORElBTiAqLworCQlfX3VpbnQzMl90CWJlOwkvKiBibG9jayBhbmQgZW50cnkgKi8KKwkJeGZzX2RhaGFzaF90CWg7CS8qIGhhc2ggdmFsdWUgKi8KKyNlbmRpZgkvKiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOICovCisJfSBzOworfSB4ZnNfZGlyY29va190OworCisjZGVmaW5lCVhGU19QVVRfQ09PS0lFKGMsbXAsYm5vLGVudHJ5LGhhc2gpCVwKKwkoKGMpLnMuYmUgPSBYRlNfREFfTUFLRV9CTk9FTlRSWShtcCwgYm5vLCBlbnRyeSksIChjKS5zLmggPSAoaGFzaCkpCisKK3R5cGVkZWYgc3RydWN0IHhmc19kaXJfcHV0X2FyZ3MKK3sKKwl4ZnNfZGlyY29va190CWNvb2s7CQkvKiBjb29raWUgb2YgKG5leHQpIGVudHJ5ICovCisJeGZzX2ludGlub190CWlubzsJCS8qIGlub2RlIG51bWJlciAqLworCXN0cnVjdCB4ZnNfZGlyZW50CSpkYnA7CQkvKiBidWZmZXIgcG9pbnRlciAqLworCWNoYXIJCSpuYW1lOwkJLyogZGlyZWN0b3J5IGVudHJ5IG5hbWUgKi8KKwlpbnQJCW5hbWVsZW47CS8qIGxlbmd0aCBvZiBuYW1lICovCisJaW50CQlkb25lOwkJLyogb3V0cHV0OiBzZXQgaWYgdmFsdWUgd2FzIHN0b3JlZCAqLworCXhmc19kaXJfcHV0X3QJcHV0OwkJLyogcHV0IGZ1bmN0aW9uIHB0ciAoaS9vKSAqLworCXN0cnVjdCB1aW8JKnVpbzsJCS8qIHVpbyBjb250cm9sIHN0cnVjdHVyZSAqLworfSB4ZnNfZGlyX3B1dF9hcmdzX3Q7CisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUl9MRUFGX0VOVFNJWkVfQllOQU1FKQoraW50IHhmc19kaXJfbGVhZl9lbnRzaXplX2J5bmFtZShpbnQgbGVuKTsKKyNkZWZpbmUgWEZTX0RJUl9MRUFGX0VOVFNJWkVfQllOQU1FKGxlbikJeGZzX2Rpcl9sZWFmX2VudHNpemVfYnluYW1lKGxlbikKKyNlbHNlCisjZGVmaW5lIFhGU19ESVJfTEVBRl9FTlRTSVpFX0JZTkFNRShsZW4pCS8qIHNwYWNlIGEgbmFtZSB3aWxsIHVzZSAqLyBcCisJKCh1aW50KXNpemVvZih4ZnNfZGlyX2xlYWZfbmFtZV90KS0xICsgbGVuKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVJfTEVBRl9FTlRTSVpFX0JZRU5UUlkpCitpbnQgeGZzX2Rpcl9sZWFmX2VudHNpemVfYnllbnRyeSh4ZnNfZGlyX2xlYWZfZW50cnlfdCAqZW50cnkpOworI2RlZmluZSBYRlNfRElSX0xFQUZfRU5UU0laRV9CWUVOVFJZKGVudHJ5KQlcCisJeGZzX2Rpcl9sZWFmX2VudHNpemVfYnllbnRyeShlbnRyeSkKKyNlbHNlCisjZGVmaW5lIFhGU19ESVJfTEVBRl9FTlRTSVpFX0JZRU5UUlkoZW50cnkpCS8qIHNwYWNlIGFuIGVudHJ5IHdpbGwgdXNlICovIFwKKwkoKHVpbnQpc2l6ZW9mKHhmc19kaXJfbGVhZl9uYW1lX3QpLTEgKyAoZW50cnkpLT5uYW1lbGVuKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVJfTEVBRl9OQU1FU1RSVUNUKQoreGZzX2Rpcl9sZWFmX25hbWVfdCAqCit4ZnNfZGlyX2xlYWZfbmFtZXN0cnVjdCh4ZnNfZGlyX2xlYWZibG9ja190ICpsZWFmcCwgaW50IG9mZnNldCk7CisjZGVmaW5lIFhGU19ESVJfTEVBRl9OQU1FU1RSVUNUKGxlYWZwLG9mZnNldCkJXAorCXhmc19kaXJfbGVhZl9uYW1lc3RydWN0KGxlYWZwLG9mZnNldCkKKyNlbHNlCisjZGVmaW5lIFhGU19ESVJfTEVBRl9OQU1FU1RSVUNUKGxlYWZwLG9mZnNldCkJLyogcG9pbnQgdG8gbmFtZSBzdHJ1Y3QgKi8gXAorCSgoeGZzX2Rpcl9sZWFmX25hbWVfdCAqKSYoKGNoYXIgKikobGVhZnApKVtvZmZzZXRdKQorI2VuZGlmCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGdW5jdGlvbiBwcm90b3R5cGVzIGZvciB0aGUga2VybmVsLgorICo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKgorICogSW50ZXJuYWwgcm91dGluZXMgd2hlbiBkaXJzaXplIDwgWEZTX0xJVElOTyhtcCkuCisgKi8KK2ludCB4ZnNfZGlyX3Nob3J0Zm9ybV9jcmVhdGUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzLCB4ZnNfaW5vX3QgcGFyZW50KTsKK2ludCB4ZnNfZGlyX3Nob3J0Zm9ybV9hZGRuYW1lKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CitpbnQgeGZzX2Rpcl9zaG9ydGZvcm1fbG9va3VwKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CitpbnQgeGZzX2Rpcl9zaG9ydGZvcm1fdG9fbGVhZihzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworaW50IHhmc19kaXJfc2hvcnRmb3JtX3JlbW92ZW5hbWUoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKK2ludCB4ZnNfZGlyX3Nob3J0Zm9ybV9nZXRkZW50cyhzdHJ1Y3QgeGZzX2lub2RlICpkcCwgc3RydWN0IHVpbyAqdWlvLCBpbnQgKmVvZnAsCisJCQkJICAgICAgc3RydWN0IHhmc19kaXJlbnQgKmRicCwgeGZzX2Rpcl9wdXRfdCBwdXQpOworaW50IHhmc19kaXJfc2hvcnRmb3JtX3JlcGxhY2Uoc3RydWN0IHhmc19kYV9hcmdzICphcmdzKTsKKworLyoKKyAqIEludGVybmFsIHJvdXRpbmVzIHdoZW4gZGlyc2l6ZSA9PSBYRlNfTEJTSVpFKG1wKS4KKyAqLworaW50IHhmc19kaXJfbGVhZl90b19ub2RlKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncyk7CitpbnQgeGZzX2Rpcl9sZWFmX3RvX3Nob3J0Zm9ybShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworCisvKgorICogUm91dGluZXMgdXNlZCBmb3IgZ3Jvd2luZyB0aGUgQnRyZWUuCisgKi8KK2ludAl4ZnNfZGlyX2xlYWZfY3JlYXRlKHN0cnVjdCB4ZnNfZGFfYXJncyAqYXJncywgeGZzX2RhYmxrX3Qgd2hpY2hfYmxvY2ssCisJCQkJICAgc3RydWN0IHhmc19kYWJ1ZiAqKmJwcCk7CitpbnQJeGZzX2Rpcl9sZWFmX3NwbGl0KHN0cnVjdCB4ZnNfZGFfc3RhdGUgKnN0YXRlLAorCQkJCSAgc3RydWN0IHhmc19kYV9zdGF0ZV9ibGsgKm9sZGJsaywKKwkJCQkgIHN0cnVjdCB4ZnNfZGFfc3RhdGVfYmxrICpuZXdibGspOworaW50CXhmc19kaXJfbGVhZl9hZGQoc3RydWN0IHhmc19kYWJ1ZiAqbGVhZl9idWZmZXIsCisJCQkJc3RydWN0IHhmc19kYV9hcmdzICphcmdzLCBpbnQgaW5zZXJ0aW9uX2luZGV4KTsKK2ludAl4ZnNfZGlyX2xlYWZfYWRkbmFtZShzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MpOworaW50CXhmc19kaXJfbGVhZl9sb29rdXBfaW50KHN0cnVjdCB4ZnNfZGFidWYgKmxlYWZfYnVmZmVyLAorCQkJCSAgICAgICBzdHJ1Y3QgeGZzX2RhX2FyZ3MgKmFyZ3MsCisJCQkJICAgICAgIGludCAqaW5kZXhfZm91bmRfYXQpOworaW50CXhmc19kaXJfbGVhZl9yZW1vdmUoc3RydWN0IHhmc190cmFucyAqdHJhbnMsCisJCQkJICAgc3RydWN0IHhmc19kYWJ1ZiAqbGVhZl9idWZmZXIsCisJCQkJICAgaW50IGluZGV4X3RvX3JlbW92ZSk7CitpbnQJeGZzX2Rpcl9sZWFmX2dldGRlbnRzX2ludChzdHJ1Y3QgeGZzX2RhYnVmICpicCwgc3RydWN0IHhmc19pbm9kZSAqZHAsCisJCQkJCSB4ZnNfZGFibGtfdCBibm8sIHN0cnVjdCB1aW8gKnVpbywKKwkJCQkJIGludCAqZW9icCwgc3RydWN0IHhmc19kaXJlbnQgKmRicCwKKwkJCQkJIHhmc19kaXJfcHV0X3QgcHV0LCB4ZnNfZGFkZHJfdCBuZXh0ZGEpOworCisvKgorICogUm91dGluZXMgdXNlZCBmb3Igc2hyaW5raW5nIHRoZSBCdHJlZS4KKyAqLworaW50CXhmc19kaXJfbGVhZl90b29zbWFsbChzdHJ1Y3QgeGZzX2RhX3N0YXRlICpzdGF0ZSwgaW50ICpyZXR2YWwpOwordm9pZAl4ZnNfZGlyX2xlYWZfdW5iYWxhbmNlKHN0cnVjdCB4ZnNfZGFfc3RhdGUgKnN0YXRlLAorCQkJCQkgICAgIHN0cnVjdCB4ZnNfZGFfc3RhdGVfYmxrICpkcm9wX2JsaywKKwkJCQkJICAgICBzdHJ1Y3QgeGZzX2RhX3N0YXRlX2JsayAqc2F2ZV9ibGspOworCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqLwordWludAl4ZnNfZGlyX2xlYWZfbGFzdGhhc2goc3RydWN0IHhmc19kYWJ1ZiAqYnAsIGludCAqY291bnQpOworaW50CXhmc19kaXJfbGVhZl9vcmRlcihzdHJ1Y3QgeGZzX2RhYnVmICpsZWFmMV9icCwKKwkJCQkgIHN0cnVjdCB4ZnNfZGFidWYgKmxlYWYyX2JwKTsKK2ludAl4ZnNfZGlyX3B1dF9kaXJlbnQ2NF9kaXJlY3QoeGZzX2Rpcl9wdXRfYXJnc190ICpwYSk7CitpbnQJeGZzX2Rpcl9wdXRfZGlyZW50NjRfdWlvKHhmc19kaXJfcHV0X2FyZ3NfdCAqcGEpOworaW50CXhmc19kaXJfaW5vX3ZhbGlkYXRlKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfaW5vX3QgaW5vKTsKKworCisvKgorICogR2xvYmFsIGRhdGEuCisgKi8KK2V4dGVybiB4ZnNfZGFoYXNoX3QJeGZzX2Rpcl9oYXNoX2RvdCwgeGZzX2Rpcl9oYXNoX2RvdGRvdDsKKworI2VuZGlmIC8qIF9fWEZTX0RJUl9MRUFGX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kaXJfc2YuaCBiL2ZzL3hmcy94ZnNfZGlyX3NmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYxYmNmYwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfZGlyX3NmLmgKQEAgLTAsMCArMSwxNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19ESVJfU0ZfSF9fCisjZGVmaW5lCV9fWEZTX0RJUl9TRl9IX18KKworLyoKKyAqIERpcmVjdG9yeSBsYXlvdXQgd2hlbiBzdG9yZWQgaW50ZXJuYWwgdG8gYW4gaW5vZGUuCisgKgorICogU21hbGwgZGlyZWN0b3JpZXMgYXJlIHBhY2tlZCBhcyB0aWdodGx5IGFzIHBvc3NpYmxlIHNvIGFzIHRvCisgKiBmaXQgaW50byB0aGUgbGl0ZXJhbCBhcmVhIG9mIHRoZSBpbm9kZS4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7IF9fdWludDhfdCBpW3NpemVvZih4ZnNfaW5vX3QpXTsgfSB4ZnNfZGlyX2lub190OworCisvKgorICogVGhlIHBhcmVudCBkaXJlY3RvcnkgaGFzIGEgZGVkaWNhdGVkIGZpZWxkLCBhbmQgdGhlIHNlbGYtcG9pbnRlciBtdXN0CisgKiBiZSBjYWxjdWxhdGVkIG9uIHRoZSBmbHkuCisgKgorICogRW50cmllcyBhcmUgcGFja2VkIHRvd2FyZCB0aGUgdG9wIGFzIHRpZ2h0IGFzIHBvc3NpYmxlLiAgVGhlIGhlYWRlcgorICogYW5kIHRoZSBlbGVtZW50cyBtdWNoIGJlIG1lbWNweSdkIG91dCBpbnRvIGEgd29yayBhcmVhIHRvIGdldCBjb3JyZWN0CisgKiBhbGlnbm1lbnQgZm9yIHRoZSBpbm9kZSBudW1iZXIgZmllbGRzLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlyX3Nob3J0Zm9ybSB7CisJc3RydWN0IHhmc19kaXJfc2ZfaGRyIHsJCS8qIGNvbnN0YW50LXN0cnVjdHVyZSBoZWFkZXIgYmxvY2sgKi8KKwkJeGZzX2Rpcl9pbm9fdCBwYXJlbnQ7CS8qIHBhcmVudCBkaXIgaW5vZGUgbnVtYmVyICovCisJCV9fdWludDhfdCBjb3VudDsJLyogY291bnQgb2YgYWN0aXZlIGVudHJpZXMgKi8KKwl9IGhkcjsKKwlzdHJ1Y3QgeGZzX2Rpcl9zZl9lbnRyeSB7CisJCXhmc19kaXJfaW5vX3QgaW51bWJlcjsJLyogcmVmZXJlbmNlZCBpbm9kZSBudW1iZXIgKi8KKwkJX191aW50OF90IG5hbWVsZW47CS8qIGFjdHVhbCBsZW5ndGggb2YgbmFtZSAobm8gTlVMTCkgKi8KKwkJX191aW50OF90IG5hbWVbMV07CS8qIG5hbWUgKi8KKwl9IGxpc3RbMV07CQkJLyogdmFyaWFibGUgc2l6ZWQgYXJyYXkgKi8KK30geGZzX2Rpcl9zaG9ydGZvcm1fdDsKK3R5cGVkZWYgc3RydWN0IHhmc19kaXJfc2ZfaGRyIHhmc19kaXJfc2ZfaGRyX3Q7Cit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlyX3NmX2VudHJ5IHhmc19kaXJfc2ZfZW50cnlfdDsKKworLyoKKyAqIFdlIGdlbmVyYXRlIHRoaXMgdGhlbiBzb3J0IGl0LCBzbyB0aGF0IHJlYWRkaXJzIGFyZSByZXR1cm5lZCBpbgorICogaGFzaC1vcmRlci4gIEVsc2Ugc2Vla2RpciB3b24ndCB3b3JrLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZGlyX3NmX3NvcnQgeworCV9fdWludDhfdAllbnRubzsJCS8qIC49MCwgLi49MSwgZWxzZSBlbnRyeSMgKyAyICovCisJX191aW50OF90CXNlcW5vOwkJLyogc2VxdWVuY2UgIyB3aXRoIHNhbWUgaGFzaCB2YWx1ZSAqLworCV9fdWludDhfdAluYW1lbGVuOwkvKiBsZW5ndGggb2YgbmFtZSB2YWx1ZSAobm8gbnVsbCkgKi8KKwl4ZnNfZGFoYXNoX3QJaGFzaDsJCS8qIHRoaXMgZW50cnkncyBoYXNoIHZhbHVlICovCisJeGZzX2ludGlub190CWlubzsJCS8qIHRoaXMgZW50cnkncyBpbm9kZSBudW1iZXIgKi8KKwljaGFyCQkqbmFtZTsJCS8qIG5hbWUgdmFsdWUsIHBvaW50ZXIgaW50byBidWZmZXIgKi8KK30geGZzX2Rpcl9zZl9zb3J0X3Q7CisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUl9TRl9HRVRfRElSSU5PKQordm9pZCB4ZnNfZGlyX3NmX2dldF9kaXJpbm8oeGZzX2Rpcl9pbm9fdCAqZnJvbSwgeGZzX2lub190ICp0byk7CisjZGVmaW5lCVhGU19ESVJfU0ZfR0VUX0RJUklOTyhmcm9tLHRvKQkJICAgIHhmc19kaXJfc2ZfZ2V0X2Rpcmlubyhmcm9tLCB0bykKKyNlbHNlCisjZGVmaW5lCVhGU19ESVJfU0ZfR0VUX0RJUklOTyhmcm9tLHRvKQkJICAgICgqKHRvKSA9IFhGU19HRVRfRElSX0lOTzgoKmZyb20pKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19ESVJfU0ZfUFVUX0RJUklOTykKK3ZvaWQgeGZzX2Rpcl9zZl9wdXRfZGlyaW5vKHhmc19pbm9fdCAqZnJvbSwgeGZzX2Rpcl9pbm9fdCAqdG8pOworI2RlZmluZQlYRlNfRElSX1NGX1BVVF9ESVJJTk8oZnJvbSx0bykgICAgeGZzX2Rpcl9zZl9wdXRfZGlyaW5vKGZyb20sIHRvKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0RJUl9TRl9QVVRfRElSSU5PKGZyb20sdG8pICAgIFhGU19QVVRfRElSX0lOTzgoKihmcm9tKSwgKih0bykpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUl9TRl9FTlRTSVpFX0JZTkFNRSkKK2ludCB4ZnNfZGlyX3NmX2VudHNpemVfYnluYW1lKGludCBsZW4pOworI2RlZmluZSBYRlNfRElSX1NGX0VOVFNJWkVfQllOQU1FKGxlbikJCXhmc19kaXJfc2ZfZW50c2l6ZV9ieW5hbWUobGVuKQorI2Vsc2UKKyNkZWZpbmUgWEZTX0RJUl9TRl9FTlRTSVpFX0JZTkFNRShsZW4pCQkvKiBzcGFjZSBhIG5hbWUgdXNlcyAqLyBcCisJKCh1aW50KXNpemVvZih4ZnNfZGlyX3NmX2VudHJ5X3QpLTEgKyAobGVuKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSX1NGX0VOVFNJWkVfQllFTlRSWSkKK2ludCB4ZnNfZGlyX3NmX2VudHNpemVfYnllbnRyeSh4ZnNfZGlyX3NmX2VudHJ5X3QgKnNmZXApOworI2RlZmluZSBYRlNfRElSX1NGX0VOVFNJWkVfQllFTlRSWShzZmVwKQl4ZnNfZGlyX3NmX2VudHNpemVfYnllbnRyeShzZmVwKQorI2Vsc2UKKyNkZWZpbmUgWEZTX0RJUl9TRl9FTlRTSVpFX0JZRU5UUlkoc2ZlcCkJLyogc3BhY2UgYW4gZW50cnkgdXNlcyAqLyBcCisJKCh1aW50KXNpemVvZih4ZnNfZGlyX3NmX2VudHJ5X3QpLTEgKyAoc2ZlcCktPm5hbWVsZW4pCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RJUl9TRl9ORVhURU5UUlkpCit4ZnNfZGlyX3NmX2VudHJ5X3QgKnhmc19kaXJfc2ZfbmV4dGVudHJ5KHhmc19kaXJfc2ZfZW50cnlfdCAqc2ZlcCk7CisjZGVmaW5lIFhGU19ESVJfU0ZfTkVYVEVOVFJZKHNmZXApCQl4ZnNfZGlyX3NmX25leHRlbnRyeShzZmVwKQorI2Vsc2UKKyNkZWZpbmUgWEZTX0RJUl9TRl9ORVhURU5UUlkoc2ZlcCkJCS8qIG5leHQgZW50cnkgaW4gc3RydWN0ICovIFwKKwkoKHhmc19kaXJfc2ZfZW50cnlfdCAqKSBcCisJCSgoY2hhciAqKShzZmVwKSArIFhGU19ESVJfU0ZfRU5UU0laRV9CWUVOVFJZKHNmZXApKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfRElSX1NGX0FMTEZJVCkKK2ludCB4ZnNfZGlyX3NmX2FsbGZpdChpbnQgY291bnQsIGludCB0b3RhbGxlbik7CisjZGVmaW5lIFhGU19ESVJfU0ZfQUxMRklUKGNvdW50LHRvdGFsbGVuKQlcCisJeGZzX2Rpcl9zZl9hbGxmaXQoY291bnQsdG90YWxsZW4pCisjZWxzZQorI2RlZmluZSBYRlNfRElSX1NGX0FMTEZJVChjb3VudCx0b3RhbGxlbikJLyogd2lsbCBhbGwgZW50cmllcyBmaXQ/ICovIFwKKwkoKHVpbnQpc2l6ZW9mKHhmc19kaXJfc2ZfaGRyX3QpICsgXAorCSAgICAgICAoKHVpbnQpc2l6ZW9mKHhmc19kaXJfc2ZfZW50cnlfdCktMSkqKGNvdW50KSArICh0b3RhbGxlbikpCisjZW5kaWYKKworI2lmIGRlZmluZWQoWEZTX0RJUl9UUkFDRSkKKworLyoKKyAqIEtlcm5lbCB0cmFjaW5nIHN1cHBvcnQgZm9yIGRpcmVjdG9yaWVzLgorICovCitzdHJ1Y3QgdWlvOworc3RydWN0IHhmc19pbm9kZTsKK3N0cnVjdCB4ZnNfZGFfaW50bm9kZTsKK3N0cnVjdCB4ZnNfZGlub2RlOworc3RydWN0IHhmc19kaXJfbGVhZmJsb2NrOworc3RydWN0IHhmc19kaXJfbGVhZl9lbnRyeTsKKworI2RlZmluZQlYRlNfRElSX1RSQUNFX1NJWkUJNDA5NgkvKiBzaXplIG9mIGdsb2JhbCB0cmFjZSBidWZmZXIgKi8KK2V4dGVybiBrdHJhY2VfdAkqeGZzX2Rpcl90cmFjZV9idWY7CisKKy8qCisgKiBUcmFjZSByZWNvcmQgdHlwZXMuCisgKi8KKyNkZWZpbmUJWEZTX0RJUl9LVFJBQ0VfR19EVQkxCS8qIGRwLCB1aW8gKi8KKyNkZWZpbmUJWEZTX0RJUl9LVFJBQ0VfR19EVUIJMgkvKiBkcCwgdWlvLCBibm8gKi8KKyNkZWZpbmUJWEZTX0RJUl9LVFJBQ0VfR19EVU4JMwkvKiBkcCwgdWlvLCBub2RlICovCisjZGVmaW5lCVhGU19ESVJfS1RSQUNFX0dfRFVMCTQJLyogZHAsIHVpbywgbGVhZiAqLworI2RlZmluZQlYRlNfRElSX0tUUkFDRV9HX0RVRQk1CS8qIGRwLCB1aW8sIGxlYWYgZW50cnkgKi8KKyNkZWZpbmUJWEZTX0RJUl9LVFJBQ0VfR19EVUMJNgkvKiBkcCwgdWlvLCBjb29raWUgKi8KKwordm9pZCB4ZnNfZGlyX3RyYWNlX2dfZHUoY2hhciAqd2hlcmUsIHN0cnVjdCB4ZnNfaW5vZGUgKmRwLCBzdHJ1Y3QgdWlvICp1aW8pOwordm9pZCB4ZnNfZGlyX3RyYWNlX2dfZHViKGNoYXIgKndoZXJlLCBzdHJ1Y3QgeGZzX2lub2RlICpkcCwgc3RydWN0IHVpbyAqdWlvLAorCQkJICAgICAgeGZzX2RhYmxrX3QgYm5vKTsKK3ZvaWQgeGZzX2Rpcl90cmFjZV9nX2R1bihjaGFyICp3aGVyZSwgc3RydWN0IHhmc19pbm9kZSAqZHAsIHN0cnVjdCB1aW8gKnVpbywKKwkJCSAgICAgIHN0cnVjdCB4ZnNfZGFfaW50bm9kZSAqbm9kZSk7Cit2b2lkIHhmc19kaXJfdHJhY2VfZ19kdWwoY2hhciAqd2hlcmUsIHN0cnVjdCB4ZnNfaW5vZGUgKmRwLCBzdHJ1Y3QgdWlvICp1aW8sCisJCQkgICAgICBzdHJ1Y3QgeGZzX2Rpcl9sZWFmYmxvY2sgKmxlYWYpOwordm9pZCB4ZnNfZGlyX3RyYWNlX2dfZHVlKGNoYXIgKndoZXJlLCBzdHJ1Y3QgeGZzX2lub2RlICpkcCwgc3RydWN0IHVpbyAqdWlvLAorCQkJICAgICAgc3RydWN0IHhmc19kaXJfbGVhZl9lbnRyeSAqZW50cnkpOwordm9pZCB4ZnNfZGlyX3RyYWNlX2dfZHVjKGNoYXIgKndoZXJlLCBzdHJ1Y3QgeGZzX2lub2RlICpkcCwgc3RydWN0IHVpbyAqdWlvLAorCQkJICAgICAgeGZzX29mZl90IGNvb2tpZSk7Cit2b2lkIHhmc19kaXJfdHJhY2VfZW50ZXIoaW50IHR5cGUsIGNoYXIgKndoZXJlLAorCQkJICAgICB2b2lkICphMCwgdm9pZCAqYTEsIHZvaWQgKmEyLCB2b2lkICphMywKKwkJCSAgICAgdm9pZCAqYTQsIHZvaWQgKmE1LCB2b2lkICphNiwgdm9pZCAqYTcsCisJCQkgICAgIHZvaWQgKmE4LCB2b2lkICphOSwgdm9pZCAqYTEwLCB2b2lkICphMTEpOworI2Vsc2UKKyNkZWZpbmUJeGZzX2Rpcl90cmFjZV9nX2R1KHcsZCx1KQorI2RlZmluZQl4ZnNfZGlyX3RyYWNlX2dfZHViKHcsZCx1LGIpCisjZGVmaW5lCXhmc19kaXJfdHJhY2VfZ19kdW4odyxkLHUsbikKKyNkZWZpbmUJeGZzX2Rpcl90cmFjZV9nX2R1bCh3LGQsdSxsKQorI2RlZmluZQl4ZnNfZGlyX3RyYWNlX2dfZHVlKHcsZCx1LGUpCisjZGVmaW5lCXhmc19kaXJfdHJhY2VfZ19kdWModyxkLHUsYykKKyNlbmRpZiAvKiBERUJVRyAqLworCisjZW5kaWYJLyogX19YRlNfRElSX1NGX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19kbWFwaS5oIGIvZnMveGZzL3hmc19kbWFwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1YWUzZTYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2RtYXBpLmgKQEAgLTAsMCArMSwyMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX0RNQVBJX0hfXworI2RlZmluZSBfX1hGU19ETUFQSV9IX18KKworLyoJVmFsdWVzIHVzZWQgdG8gZGVmaW5lIHRoZSBvbi1kaXNrIHZlcnNpb24gb2YgZG1fYXR0cm5hbWVfdC4gQWxsCisgKglvbi1kaXNrIGF0dHJpYnV0ZSBuYW1lcyBzdGFydCB3aXRoIHRoZSA4LWJ5dGUgc3RyaW5nICJTR0lfRE1JXyIuCisgKgorICogICAgICBJbiB0aGUgb24tZGlzayBpbm9kZSwgRE1BUEkgYXR0cmlidXRlIG5hbWVzIGNvbnNpc3Qgb2YgdGhlIHVzZXItcHJvdmlkZWQKKyAqICAgICAgbmFtZSB3aXRoIHRoZSBETUFUVFJfUFJFRklYU1RSSU5HIHByZS1wZW5kZWQuICBUaGlzIHN0cmluZyBtdXN0IE5FVkVSIGJlCisgKiAgICAgIGNoYW5nZWQuCisgKi8KKworI2RlZmluZSBETUFUVFJfUFJFRklYTEVOCTgKKyNkZWZpbmUgRE1BVFRSX1BSRUZJWFNUUklORwkiU0dJX0RNSV8iCisKK3R5cGVkZWYgZW51bSB7CisJRE1fRVZFTlRfSU5WQUxJRAk9IC0xLAorCURNX0VWRU5UX0NBTkNFTAkJPSAwLAkJLyogbm90IHN1cHBvcnRlZCAqLworCURNX0VWRU5UX01PVU5UCQk9IDEsCisJRE1fRVZFTlRfUFJFVU5NT1VOVAk9IDIsCisJRE1fRVZFTlRfVU5NT1VOVAk9IDMsCisJRE1fRVZFTlRfREVCVVQJCT0gNCwJCS8qIG5vdCBzdXBwb3J0ZWQgKi8KKwlETV9FVkVOVF9DUkVBVEUJCT0gNSwKKwlETV9FVkVOVF9DTE9TRQkJPSA2LAkJLyogbm90IHN1cHBvcnRlZCAqLworCURNX0VWRU5UX1BPU1RDUkVBVEUJPSA3LAorCURNX0VWRU5UX1JFTU9WRQkJPSA4LAorCURNX0VWRU5UX1BPU1RSRU1PVkUJPSA5LAorCURNX0VWRU5UX1JFTkFNRQkJPSAxMCwKKwlETV9FVkVOVF9QT1NUUkVOQU1FCT0gMTEsCisJRE1fRVZFTlRfTElOSwkJPSAxMiwKKwlETV9FVkVOVF9QT1NUTElOSwk9IDEzLAorCURNX0VWRU5UX1NZTUxJTksJPSAxNCwKKwlETV9FVkVOVF9QT1NUU1lNTElOSwk9IDE1LAorCURNX0VWRU5UX1JFQUQJCT0gMTYsCisJRE1fRVZFTlRfV1JJVEUJCT0gMTcsCisJRE1fRVZFTlRfVFJVTkNBVEUJPSAxOCwKKwlETV9FVkVOVF9BVFRSSUJVVEUJPSAxOSwKKwlETV9FVkVOVF9ERVNUUk9ZCT0gMjAsCisJRE1fRVZFTlRfTk9TUEFDRQk9IDIxLAorCURNX0VWRU5UX1VTRVIJCT0gMjIsCisJRE1fRVZFTlRfTUFYCQk9IDIzCit9IGRtX2V2ZW50dHlwZV90OworI2RlZmluZSBIQVZFX0RNX0VWRU5UVFlQRV9UCisKK3R5cGVkZWYgZW51bSB7CisJRE1fUklHSFRfTlVMTCwKKwlETV9SSUdIVF9TSEFSRUQsCisJRE1fUklHSFRfRVhDTAorfSBkbV9yaWdodF90OworI2RlZmluZSBIQVZFX0RNX1JJR0hUX1QKKworLyogRGVmaW5lcyBmb3IgZGV0ZXJtaW5pbmcgaWYgYW4gZXZlbnQgbWVzc2FnZSBzaG91bGQgYmUgc2VudC4gKi8KKyNkZWZpbmUJRE1fRVZFTlRfRU5BQkxFRCh2ZnNwLCBpcCwgZXZlbnQpICggXAorCXVubGlrZWx5ICgodmZzcCktPnZmc19mbGFnICYgVkZTX0RNSSkgJiYgXAorCQkoICgoaXApLT5pX2QuZGlfZG1ldm1hc2sgJiAoMSA8PCBldmVudCkpIHx8IFwKKwkJICAoKGlwKS0+aV9tb3VudC0+bV9kbWV2bWFzayAmICgxIDw8IGV2ZW50KSkgKSBcCisJKQorCisjZGVmaW5lCURNX0VWRU5UX0VOQUJMRURfSU8odmZzcCwgaW8sIGV2ZW50KSAoIFwKKwl1bmxpa2VseSAoKHZmc3ApLT52ZnNfZmxhZyAmIFZGU19ETUkpICYmIFwKKwkJKCAoKGlvKS0+aW9fZG1ldm1hc2sgJiAoMSA8PCBldmVudCkpIHx8IFwKKwkJICAoKGlvKS0+aW9fbW91bnQtPm1fZG1ldm1hc2sgJiAoMSA8PCBldmVudCkpICkgXAorCSkKKworI2RlZmluZSBETV9YRlNfVkFMSURfRlNfRVZFTlRTCQkoIFwKKwkoMSA8PCBETV9FVkVOVF9QUkVVTk1PVU5UKQl8IFwKKwkoMSA8PCBETV9FVkVOVF9VTk1PVU5UKQkJfCBcCisJKDEgPDwgRE1fRVZFTlRfTk9TUEFDRSkJCXwgXAorCSgxIDw8IERNX0VWRU5UX0RFQlVUKQkJfCBcCisJKDEgPDwgRE1fRVZFTlRfQ1JFQVRFKQkJfCBcCisJKDEgPDwgRE1fRVZFTlRfUE9TVENSRUFURSkJfCBcCisJKDEgPDwgRE1fRVZFTlRfUkVNT1ZFKQkJfCBcCisJKDEgPDwgRE1fRVZFTlRfUE9TVFJFTU9WRSkJfCBcCisJKDEgPDwgRE1fRVZFTlRfUkVOQU1FKQkJfCBcCisJKDEgPDwgRE1fRVZFTlRfUE9TVFJFTkFNRSkJfCBcCisJKDEgPDwgRE1fRVZFTlRfTElOSykJCXwgXAorCSgxIDw8IERNX0VWRU5UX1BPU1RMSU5LKQl8IFwKKwkoMSA8PCBETV9FVkVOVF9TWU1MSU5LKQkJfCBcCisJKDEgPDwgRE1fRVZFTlRfUE9TVFNZTUxJTkspCXwgXAorCSgxIDw8IERNX0VWRU5UX0FUVFJJQlVURSkJfCBcCisJKDEgPDwgRE1fRVZFTlRfREVTVFJPWSkJCSkKKworLyogRXZlbnRzIHZhbGlkIGluIGRtX3NldF9ldmVudGxpc3QoKSB3aGVuIGNhbGxlZCB3aXRoIGEgZmlsZSBoYW5kbGUgZm9yCisgICBhIHJlZ3VsYXIgZmlsZSBvciBhIHN5bWxpbmsuICBUaGVzZSBldmVudHMgYXJlIHBlcnNpc3RlbnQuCisqLworCisjZGVmaW5lCURNX1hGU19WQUxJRF9GSUxFX0VWRU5UUwkoIFwKKwkoMSA8PCBETV9FVkVOVF9BVFRSSUJVVEUpCXwgXAorCSgxIDw8IERNX0VWRU5UX0RFU1RST1kpCQkpCisKKy8qIEV2ZW50cyB2YWxpZCBpbiBkbV9zZXRfZXZlbnRsaXN0KCkgd2hlbiBjYWxsZWQgd2l0aCBhIGZpbGUgaGFuZGxlIGZvcgorICAgYSBkaXJlY3RvcnkuICBUaGVzZSBldmVudHMgYXJlIHBlcnNpc3RlbnQuCisqLworCisjZGVmaW5lCURNX1hGU19WQUxJRF9ESVJFQ1RPUllfRVZFTlRTCSggXAorCSgxIDw8IERNX0VWRU5UX0NSRUFURSkJCXwgXAorCSgxIDw8IERNX0VWRU5UX1BPU1RDUkVBVEUpCXwgXAorCSgxIDw8IERNX0VWRU5UX1JFTU9WRSkJCXwgXAorCSgxIDw8IERNX0VWRU5UX1BPU1RSRU1PVkUpCXwgXAorCSgxIDw8IERNX0VWRU5UX1JFTkFNRSkJCXwgXAorCSgxIDw8IERNX0VWRU5UX1BPU1RSRU5BTUUpCXwgXAorCSgxIDw8IERNX0VWRU5UX0xJTkspCQl8IFwKKwkoMSA8PCBETV9FVkVOVF9QT1NUTElOSykJfCBcCisJKDEgPDwgRE1fRVZFTlRfU1lNTElOSykJCXwgXAorCSgxIDw8IERNX0VWRU5UX1BPU1RTWU1MSU5LKQl8IFwKKwkoMSA8PCBETV9FVkVOVF9BVFRSSUJVVEUpCXwgXAorCSgxIDw8IERNX0VWRU5UX0RFU1RST1kpCQkpCisKKy8qIEV2ZW50cyBzdXBwb3J0ZWQgYnkgdGhlIFhGUyBmaWxlc3lzdGVtLiAqLworI2RlZmluZQlETV9YRlNfU1VQUE9SVEVEX0VWRU5UUwkJKCBcCisJKDEgPDwgRE1fRVZFTlRfTU9VTlQpCQl8IFwKKwkoMSA8PCBETV9FVkVOVF9QUkVVTk1PVU5UKQl8IFwKKwkoMSA8PCBETV9FVkVOVF9VTk1PVU5UKQkJfCBcCisJKDEgPDwgRE1fRVZFTlRfTk9TUEFDRSkJCXwgXAorCSgxIDw8IERNX0VWRU5UX0NSRUFURSkJCXwgXAorCSgxIDw8IERNX0VWRU5UX1BPU1RDUkVBVEUpCXwgXAorCSgxIDw8IERNX0VWRU5UX1JFTU9WRSkJCXwgXAorCSgxIDw8IERNX0VWRU5UX1BPU1RSRU1PVkUpCXwgXAorCSgxIDw8IERNX0VWRU5UX1JFTkFNRSkJCXwgXAorCSgxIDw8IERNX0VWRU5UX1BPU1RSRU5BTUUpCXwgXAorCSgxIDw8IERNX0VWRU5UX0xJTkspCQl8IFwKKwkoMSA8PCBETV9FVkVOVF9QT1NUTElOSykJfCBcCisJKDEgPDwgRE1fRVZFTlRfU1lNTElOSykJCXwgXAorCSgxIDw8IERNX0VWRU5UX1BPU1RTWU1MSU5LKQl8IFwKKwkoMSA8PCBETV9FVkVOVF9SRUFEKQkJfCBcCisJKDEgPDwgRE1fRVZFTlRfV1JJVEUpCQl8IFwKKwkoMSA8PCBETV9FVkVOVF9UUlVOQ0FURSkJfCBcCisJKDEgPDwgRE1fRVZFTlRfQVRUUklCVVRFKQl8IFwKKwkoMSA8PCBETV9FVkVOVF9ERVNUUk9ZKQkJKQorCisKKy8qCisgKglEZWZpbml0aW9ucyB1c2VkIGZvciB0aGUgZmxhZ3MgZmllbGQgb24gZG1fc2VuZF8qX2V2ZW50KCkuCisgKi8KKworI2RlZmluZSBETV9GTEFHU19OREVMQVkJCTB4MDAxCS8qIHJldHVybiBFQUdBSU4gYWZ0ZXIgZG1fcGVuZGluZygpICovCisjZGVmaW5lIERNX0ZMQUdTX1VOV0FOVEVECTB4MDAyCS8qIGV2ZW50IG5vdCBpbiBmc3lzIGRtX2V2ZW50c2V0X3QgKi8KKyNkZWZpbmUgRE1fRkxBR1NfSVNFTQkJMHgwMDQJLyogdGhyZWFkIGhvbGRzIGlfc2VtICovCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFIDwgS0VSTkVMX1ZFUlNJT04oMiw2LDApCisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID4gS0VSTkVMX1ZFUlNJT04oMiw0LDIxKQorLyogaV9hbGxvY19zZW0gd2FzIGFkZGVkIGluIDIuNC4yMi1wcmUxICovCisjZGVmaW5lIERNX0ZMQUdTX0lBTExPQ1NFTV9SRAkweDAxMAkvKiB0aHJlYWQgaG9sZHMgaV9hbGxvY19zZW0gcmQgKi8KKyNkZWZpbmUgRE1fRkxBR1NfSUFMTE9DU0VNX1dSCTB4MDIwCS8qIHRocmVhZCBob2xkcyBpX2FsbG9jX3NlbSB3ciAqLworI2VuZGlmCisjZW5kaWYKKworLyoKKyAqCUJhc2VkIG9uIElPX0lTRElSRUNULCBkZWNpZGUgd2hpY2ggaV8gZmxhZyBpcyBzZXQuCisgKi8KKyNpZmRlZiBETV9GTEFHU19JQUxMT0NTRU1fUkQKKyNkZWZpbmUgRE1fU0VNX0ZMQUdfUkQoaW9mbGFncykgKCgoaW9mbGFncykgJiBJT19JU0RJUkVDVCkgPyBcCisJCQkgICAgICBETV9GTEFHU19JQUxMT0NTRU1fUkQgOiBETV9GTEFHU19JU0VNKQorI2RlZmluZSBETV9TRU1fRkxBR19XUgkoRE1fRkxBR1NfSUFMTE9DU0VNX1dSIHwgRE1fRkxBR1NfSVNFTSkKKyNlbHNlCisjZGVmaW5lIERNX1NFTV9GTEFHX1JEKGlvZmxhZ3MpICgoKGlvZmxhZ3MpICYgSU9fSVNESVJFQ1QpID8gXAorCQkJICAgICAgMCA6IERNX0ZMQUdTX0lTRU0pCisjZGVmaW5lIERNX1NFTV9GTEFHX1dSCShETV9GTEFHU19JU0VNKQorI2VuZGlmCisKKy8qCisgKglNYWNyb3MgdG8gdHVybiBjYWxsZXIgc3BlY2lmaWVkIGRlbGF5L2Jsb2NrIGZsYWdzIGludG8KKyAqCWRtX3NlbmRfeHh4eF9ldmVudCBmbGFnIERNX0ZMQUdTX05ERUxBWS4KKyAqLworCisjZGVmaW5lIEZJTFBfREVMQVlfRkxBRyhmaWxwKSAoKGZpbHAtPmZfZmxhZ3MmKE9fTkRFTEFZfE9fTk9OQkxPQ0spKSA/IFwKKwkJCURNX0ZMQUdTX05ERUxBWSA6IDApCisjZGVmaW5lIEFUX0RFTEFZX0ZMQUcoZikgKChmJkFUVFJfTk9OQkxPQ0spID8gRE1fRkxBR1NfTkRFTEFZIDogMCkKKworCitleHRlcm4gc3RydWN0IGJodl92ZnNvcHMgeGZzX2Rtb3BzOworCisjaWZkZWYgQ09ORklHX1hGU19ETUFQSQordm9pZCB4ZnNfZG1faW5pdChzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqKTsKK3ZvaWQgeGZzX2RtX2V4aXQoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKik7CisjZGVmaW5lIFhGU19ETV9JTklUKGZzdHlwZSkJeGZzX2RtX2luaXQoZnN0eXBlKQorI2RlZmluZSBYRlNfRE1fRVhJVChmc3R5cGUpCXhmc19kbV9leGl0KGZzdHlwZSkKKyNlbHNlCisjZGVmaW5lIFhGU19ETV9JTklUKGZzdHlwZSkKKyNkZWZpbmUgWEZTX0RNX0VYSVQoZnN0eXBlKQorI2VuZGlmCisKKyNlbmRpZiAgLyogX19YRlNfRE1BUElfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2Rtb3BzLmMgYi9mcy94ZnMveGZzX2Rtb3BzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VjNTRiYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfZG1vcHMuYwpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLgkgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2luY2x1ZGUgInhmcy5oIgorCisjaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc190eXBlcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19hZy5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorCit4ZnNfZG1vcHNfdAl4ZnNfZG1jb3JlX3N0dWIgPSB7CisJLnhmc19zZW5kX2RhdGEJCT0gKHhmc19zZW5kX2RhdGFfdClmc19ub3N5cywKKwkueGZzX3NlbmRfbW1hcAkJPSAoeGZzX3NlbmRfbW1hcF90KWZzX25vZXJyLAorCS54ZnNfc2VuZF9kZXN0cm95CT0gKHhmc19zZW5kX2Rlc3Ryb3lfdClmc19ub3N5cywKKwkueGZzX3NlbmRfbmFtZXNwCT0gKHhmc19zZW5kX25hbWVzcF90KWZzX25vc3lzLAorCS54ZnNfc2VuZF91bm1vdW50CT0gKHhmc19zZW5kX3VubW91bnRfdClmc19ub3ZhbCwKK307CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2Vycm9yLmMgYi9mcy94ZnMveGZzX2Vycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJlMWRlYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfZXJyb3IuYwpAQCAtMCwwICsxLDMyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorCisjaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc190eXBlcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX3V0aWxzLmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisKKyNpZmRlZiBERUJVRworCitpbnQJeGZzX2V0cmFwW1hGU19FUlJPUl9OVFJBUF0gPSB7CisJMCwKK307CisKK2ludAoreGZzX2Vycm9yX3RyYXAoaW50IGUpCit7CisJaW50IGk7CisKKwlpZiAoIWUpCisJCXJldHVybiAwOworCWZvciAoaSA9IDA7IGkgPCBYRlNfRVJST1JfTlRSQVA7IGkrKykgeworCQlpZiAoeGZzX2V0cmFwW2ldID09IDApCisJCQlicmVhazsKKwkJaWYgKGUgIT0geGZzX2V0cmFwW2ldKQorCQkJY29udGludWU7CisJCWNtbl9lcnIoQ0VfTk9URSwgInhmc19lcnJvcl90cmFwOiBlcnJvciAlZCIsIGUpOworCQlkZWJ1Z19zdG9wX2FsbF9jcHVzKCh2b2lkICopLTFMTCk7CisJCUJVRygpOworCQlicmVhazsKKwl9CisJcmV0dXJuIGU7Cit9CisjZW5kaWYKKworI2lmIChkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKElORFVDRV9JT19FUlJPUikpCisKK2ludAl4ZnNfZXRlc3RbWEZTX05VTV9JTkpFQ1RfRVJST1JdOworaW50NjRfdAl4ZnNfZXRlc3RfZnNpZFtYRlNfTlVNX0lOSkVDVF9FUlJPUl07CitjaGFyICoJeGZzX2V0ZXN0X2ZzbmFtZVtYRlNfTlVNX0lOSkVDVF9FUlJPUl07CisKK3ZvaWQKK3hmc19lcnJvcl90ZXN0X2luaXQodm9pZCkKK3sKKwltZW1zZXQoeGZzX2V0ZXN0LCAwLCBzaXplb2YoeGZzX2V0ZXN0KSk7CisJbWVtc2V0KHhmc19ldGVzdF9mc2lkLCAwLCBzaXplb2YoeGZzX2V0ZXN0X2ZzaWQpKTsKKwltZW1zZXQoeGZzX2V0ZXN0X2ZzbmFtZSwgMCwgc2l6ZW9mKHhmc19ldGVzdF9mc25hbWUpKTsKK30KKworaW50Cit4ZnNfZXJyb3JfdGVzdChpbnQgZXJyb3JfdGFnLCBpbnQgKmZzaWRwLCBjaGFyICpleHByZXNzaW9uLAorCSAgICAgICBpbnQgbGluZSwgY2hhciAqZmlsZSwgdW5zaWduZWQgbG9uZyByYW5kZmFjdG9yKQoreworCWludCBpOworCWludDY0X3QgZnNpZDsKKworCWlmIChyYW5kb20oKSAlIHJhbmRmYWN0b3IpCisJCXJldHVybiAwOworCisJbWVtY3B5KCZmc2lkLCBmc2lkcCwgc2l6ZW9mKHhmc19mc2lkX3QpKTsKKworCWZvciAoaSA9IDA7IGkgPCBYRlNfTlVNX0lOSkVDVF9FUlJPUjsgaSsrKSAgeworCQlpZiAoeGZzX2V0ZXN0W2ldID09IGVycm9yX3RhZyAmJiB4ZnNfZXRlc3RfZnNpZFtpXSA9PSBmc2lkKSB7CisJCQljbW5fZXJyKENFX1dBUk4sCisJIkluamVjdGluZyBlcnJvciAoJXMpIGF0IGZpbGUgJXMsIGxpbmUgJWQsIG9uIGZpbGVzeXN0ZW0gXCIlc1wiIiwKKwkJCQlleHByZXNzaW9uLCBmaWxlLCBsaW5lLCB4ZnNfZXRlc3RfZnNuYW1lW2ldKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludAoreGZzX2Vycm9ydGFnX2FkZChpbnQgZXJyb3JfdGFnLCB4ZnNfbW91bnRfdCAqbXApCit7CisJaW50IGk7CisJaW50IGxlbjsKKwlpbnQ2NF90IGZzaWQ7CisKKwltZW1jcHkoJmZzaWQsIG1wLT5tX2ZpeGVkZnNpZCwgc2l6ZW9mKHhmc19mc2lkX3QpKTsKKworCWZvciAoaSA9IDA7IGkgPCBYRlNfTlVNX0lOSkVDVF9FUlJPUjsgaSsrKSAgeworCQlpZiAoeGZzX2V0ZXN0X2ZzaWRbaV0gPT0gZnNpZCAmJiB4ZnNfZXRlc3RbaV0gPT0gZXJyb3JfdGFnKSB7CisJCQljbW5fZXJyKENFX1dBUk4sICJYRlMgZXJyb3IgdGFnICMlZCBvbiIsIGVycm9yX3RhZyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBYRlNfTlVNX0lOSkVDVF9FUlJPUjsgaSsrKSAgeworCQlpZiAoeGZzX2V0ZXN0W2ldID09IDApIHsKKwkJCWNtbl9lcnIoQ0VfV0FSTiwgIlR1cm5lZCBvbiBYRlMgZXJyb3IgdGFnICMlZCIsCisJCQkJZXJyb3JfdGFnKTsKKwkJCXhmc19ldGVzdFtpXSA9IGVycm9yX3RhZzsKKwkJCXhmc19ldGVzdF9mc2lkW2ldID0gZnNpZDsKKwkJCWxlbiA9IHN0cmxlbihtcC0+bV9mc25hbWUpOworCQkJeGZzX2V0ZXN0X2ZzbmFtZVtpXSA9IGttZW1fYWxsb2MobGVuICsgMSwgS01fU0xFRVApOworCQkJc3RyY3B5KHhmc19ldGVzdF9mc25hbWVbaV0sIG1wLT5tX2ZzbmFtZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWNtbl9lcnIoQ0VfV0FSTiwgImVycm9yIHRhZyBvdmVyZmxvdywgdG9vIG1hbnkgdHVybmVkIG9uIik7CisKKwlyZXR1cm4gMTsKK30KKworaW50Cit4ZnNfZXJyb3J0YWdfY2xlYXIoaW50IGVycm9yX3RhZywgeGZzX21vdW50X3QgKm1wKQoreworCWludCBpOworCWludDY0X3QgZnNpZDsKKworCW1lbWNweSgmZnNpZCwgbXAtPm1fZml4ZWRmc2lkLCBzaXplb2YoeGZzX2ZzaWRfdCkpOworCisJZm9yIChpID0gMDsgaSA8IFhGU19OVU1fSU5KRUNUX0VSUk9SOyBpKyspIHsKKwkJaWYgKHhmc19ldGVzdF9mc2lkW2ldID09IGZzaWQgJiYgeGZzX2V0ZXN0W2ldID09IGVycm9yX3RhZykgeworCQkJeGZzX2V0ZXN0W2ldID0gMDsKKwkJCXhmc19ldGVzdF9mc2lkW2ldID0gMExMOworCQkJa21lbV9mcmVlKHhmc19ldGVzdF9mc25hbWVbaV0sCisJCQkJICBzdHJsZW4oeGZzX2V0ZXN0X2ZzbmFtZVtpXSkgKyAxKTsKKwkJCXhmc19ldGVzdF9mc25hbWVbaV0gPSBOVUxMOworCQkJY21uX2VycihDRV9XQVJOLCAiQ2xlYXJlZCBYRlMgZXJyb3IgdGFnICMlZCIsCisJCQkJZXJyb3JfdGFnKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJY21uX2VycihDRV9XQVJOLCAiWEZTIGVycm9yIHRhZyAlZCBub3Qgb24iLCBlcnJvcl90YWcpOworCisJcmV0dXJuIDE7Cit9CisKK2ludAoreGZzX2Vycm9ydGFnX2NsZWFyYWxsX3Vtb3VudChpbnQ2NF90IGZzaWQsIGNoYXIgKmZzbmFtZSwgaW50IGxvdWQpCit7CisJaW50IGk7CisJaW50IGNsZWFyZWQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IFhGU19OVU1fSU5KRUNUX0VSUk9SOyBpKyspIHsKKwkJaWYgKChmc2lkID09IDBMTCB8fCB4ZnNfZXRlc3RfZnNpZFtpXSA9PSBmc2lkKSAmJgorCQkgICAgIHhmc19ldGVzdFtpXSAhPSAwKSB7CisJCQljbGVhcmVkID0gMTsKKwkJCWNtbl9lcnIoQ0VfV0FSTiwgIkNsZWFyaW5nIFhGUyBlcnJvciB0YWcgIyVkIiwKKwkJCQl4ZnNfZXRlc3RbaV0pOworCQkJeGZzX2V0ZXN0W2ldID0gMDsKKwkJCXhmc19ldGVzdF9mc2lkW2ldID0gMExMOworCQkJa21lbV9mcmVlKHhmc19ldGVzdF9mc25hbWVbaV0sCisJCQkJICBzdHJsZW4oeGZzX2V0ZXN0X2ZzbmFtZVtpXSkgKyAxKTsKKwkJCXhmc19ldGVzdF9mc25hbWVbaV0gPSBOVUxMOworCQl9CisJfQorCisJaWYgKGxvdWQgfHwgY2xlYXJlZCkKKwkJY21uX2VycihDRV9XQVJOLAorCQkJIkNsZWFyZWQgYWxsIFhGUyBlcnJvciB0YWdzIGZvciBmaWxlc3lzdGVtIFwiJXNcIiIsCisJCQlmc25hbWUpOworCisJcmV0dXJuIDA7Cit9CisKK2ludAoreGZzX2Vycm9ydGFnX2NsZWFyYWxsKHhmc19tb3VudF90ICptcCkKK3sKKwlpbnQ2NF90IGZzaWQ7CisKKwltZW1jcHkoJmZzaWQsIG1wLT5tX2ZpeGVkZnNpZCwgc2l6ZW9mKHhmc19mc2lkX3QpKTsKKworCXJldHVybiB4ZnNfZXJyb3J0YWdfY2xlYXJhbGxfdW1vdW50KGZzaWQsIG1wLT5tX2ZzbmFtZSwgMSk7Cit9CisjZW5kaWYgLyogREVCVUcgfHwgSU5EVUNFX0lPX0VSUk9SICovCisKK3N0YXRpYyB2b2lkCit4ZnNfZnNfdmNtbl9lcnIoaW50IGxldmVsLCB4ZnNfbW91bnRfdCAqbXAsIGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKK3sKKwlpZiAobXAgIT0gTlVMTCkgeworCQljaGFyCSpuZXdmbXQ7CisJCWludAlsZW4gPSAxNiArIG1wLT5tX2ZzbmFtZV9sZW4gKyBzdHJsZW4oZm10KTsKKworCQluZXdmbXQgPSBrbWVtX2FsbG9jKGxlbiwgS01fU0xFRVApOworCQlzcHJpbnRmKG5ld2ZtdCwgIkZpbGVzeXN0ZW0gXCIlc1wiOiAlcyIsIG1wLT5tX2ZzbmFtZSwgZm10KTsKKwkJaWNtbl9lcnIobGV2ZWwsIG5ld2ZtdCwgYXApOworCQlrbWVtX2ZyZWUobmV3Zm10LCBsZW4pOworCX0gZWxzZSB7CisJCWljbW5fZXJyKGxldmVsLCBmbXQsIGFwKTsKKwl9Cit9CisKK3ZvaWQKK3hmc19mc19jbW5fZXJyKGludCBsZXZlbCwgeGZzX21vdW50X3QgKm1wLCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCisJdmFfc3RhcnQoYXAsIGZtdCk7CisJeGZzX2ZzX3ZjbW5fZXJyKGxldmVsLCBtcCwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKK30KKwordm9pZAoreGZzX2Ntbl9lcnIoaW50IHBhbmljX3RhZywgaW50IGxldmVsLCB4ZnNfbW91bnRfdCAqbXAsIGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKyNpZmRlZiBERUJVRworCXhmc19wYW5pY19tYXNrIHw9IFhGU19QVEFHX1NIVVRET1dOX0NPUlJVUFQ7CisjZW5kaWYKKworCWlmICh4ZnNfcGFuaWNfbWFzayAmJiAoeGZzX3BhbmljX21hc2sgJiBwYW5pY190YWcpCisJICAgICYmIChsZXZlbCAmIENFX0FMRVJUKSkgeworCQlsZXZlbCAmPSB+Q0VfQUxFUlQ7CisJCWxldmVsIHw9IENFX1BBTklDOworCQljbW5fZXJyKENFX0FMRVJULCAiWEZTOiBUcmFuc2Zvcm1pbmcgYW4gYWxlcnQgaW50byBhIEJVRy4iKTsKKwl9CisJdmFfc3RhcnQoYXAsIGZtdCk7CisJeGZzX2ZzX3ZjbW5fZXJyKGxldmVsLCBtcCwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKK30KKwordm9pZAoreGZzX2Vycm9yX3JlcG9ydCgKKwljaGFyCQkqdGFnLAorCWludAkJbGV2ZWwsCisJeGZzX21vdW50X3QJKm1wLAorCWNoYXIJCSpmbmFtZSwKKwlpbnQJCWxpbmVudW0sCisJaW5zdF90CQkqcmEpCit7CisJaWYgKGxldmVsIDw9IHhmc19lcnJvcl9sZXZlbCkgeworCQl4ZnNfY21uX2VycihYRlNfUFRBR19FUlJPUl9SRVBPUlQsCisJCQkgICAgQ0VfQUxFUlQsIG1wLAorCQkiWEZTIGludGVybmFsIGVycm9yICVzIGF0IGxpbmUgJWQgb2YgZmlsZSAlcy4gIENhbGxlciAweCVwXG4iLAorCQkJICAgIHRhZywgbGluZW51bSwgZm5hbWUsIHJhKTsKKworCQl4ZnNfc3RhY2tfdHJhY2UoKTsKKwl9Cit9CisKK3ZvaWQKK3hmc19oZXhfZHVtcCh2b2lkICpwLCBpbnQgbGVuZ3RoKQoreworCV9fdWludDhfdCAqdWlwID0gKF9fdWludDhfdCopcDsKKwlpbnQJaTsKKwljaGFyCXNidWZbMTI4XSwgKnM7CisKKwlzID0gc2J1ZjsKKwkqcyA9ICdcMCc7CisJZm9yIChpPTA7IGk8bGVuZ3RoOyBpKyssIHVpcCsrKSB7CisJCWlmICgoaSAlIDE2KSA9PSAwKSB7CisJCQlpZiAoKnMgIT0gJ1wwJykKKwkJCQljbW5fZXJyKENFX0FMRVJULCAiJXNcbiIsIHNidWYpOworCQkJcyA9IHNidWY7CisJCQlzcHJpbnRmKHMsICIweCV4OiAiLCBpKTsKKwkJCXdoaWxlKCAqcyAhPSAnXDAnKQorCQkJCXMrKzsKKwkJfQorCQlzcHJpbnRmKHMsICIlMDJ4ICIsICp1aXApOworCisJCS8qCisJCSAqIHRoZSBrZXJuZWwgc3ByaW50ZiBpcyBhIHZvaWQ7IHVzZXIgc3ByaW50ZiByZXR1cm5zCisJCSAqIHRoZSBzcHJpbnRmJ2VkIHN0cmluZydzIGxlbmd0aC4gIEZpbmQgdGhlIG5ldyBlbmQtCisJCSAqIG9mLXN0cmluZworCQkgKi8KKwkJd2hpbGUoICpzICE9ICdcMCcpCisJCQlzKys7CisJfQorCWNtbl9lcnIoQ0VfQUxFUlQsICIlc1xuIiwgc2J1Zik7Cit9CisKK3ZvaWQKK3hmc19jb3JydXB0aW9uX2Vycm9yKAorCWNoYXIJCSp0YWcsCisJaW50CQlsZXZlbCwKKwl4ZnNfbW91bnRfdAkqbXAsCisJdm9pZAkJKnAsCisJY2hhcgkJKmZuYW1lLAorCWludAkJbGluZW51bSwKKwlpbnN0X3QJCSpyYSkKK3sKKwlpZiAobGV2ZWwgPD0geGZzX2Vycm9yX2xldmVsKQorCQl4ZnNfaGV4X2R1bXAocCwgMTYpOworCXhmc19lcnJvcl9yZXBvcnQodGFnLCBsZXZlbCwgbXAsIGZuYW1lLCBsaW5lbnVtLCByYSk7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2Vycm9yLmggYi9mcy94ZnMveGZzX2Vycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjMDUzNQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfZXJyb3IuaApAQCAtMCwwICsxLDE5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYJX19YRlNfRVJST1JfSF9fCisjZGVmaW5lCV9fWEZTX0VSUk9SX0hfXworCisjZGVmaW5lIHByZGV2KGZtdCx0YXJnLGFyZ3MuLi4pIFwKKwlwcmludGsoIlhGUzogZGV2aWNlICVzLSAiIGZtdCAiXG4iLCBYRlNfQlVGVEFSR19OQU1FKHRhcmcpLCAjIyBhcmdzKQorCisjZGVmaW5lIFhGU19FUkVDT1ZFUgkxCS8qIEZhaWx1cmUgdG8gcmVjb3ZlciBsb2cgKi8KKyNkZWZpbmUgWEZTX0VMT0dTVEFUCTIJLyogRmFpbHVyZSB0byBzdGF0IGxvZyBpbiB1c2VyIHNwYWNlICovCisjZGVmaW5lIFhGU19FTk9MT0dTUEFDRQkzCS8qIFJlc2VydmF0aW9uIHRvbyBsYXJnZSAqLworI2RlZmluZSBYRlNfRU5PVFNVUAk0CS8qIE9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkICovCisjZGVmaW5lCVhGU19FTk9MU04JNQkvKiBDYW4ndCBmaW5kIHRoZSBsc24geW91IGFza2VkIGZvciAqLworI2RlZmluZSBYRlNfRU5PVEZPVU5ECTYKKyNkZWZpbmUgWEZTX0VOT1RYRlMJNwkvKiBOb3QgWEZTIGZpbGVzeXN0ZW0gKi8KKworI2lmZGVmIERFQlVHCisjZGVmaW5lCVhGU19FUlJPUl9OVFJBUAkxMAorZXh0ZXJuIGludAl4ZnNfZXRyYXBbWEZTX0VSUk9SX05UUkFQXTsKK2V4dGVybiBpbnQJeGZzX2Vycm9yX3RyYXAoaW50KTsKKyNkZWZpbmUJWEZTX0VSUk9SKGUpCXhmc19lcnJvcl90cmFwKGUpCisjZWxzZQorI2RlZmluZQlYRlNfRVJST1IoZSkJKGUpCisjZW5kaWYKKworc3RydWN0IHhmc19tb3VudDsKKworZXh0ZXJuIHZvaWQKK3hmc19lcnJvcl9yZXBvcnQoCisJY2hhcgkJKnRhZywKKwlpbnQJCWxldmVsLAorCXN0cnVjdCB4ZnNfbW91bnQgKm1wLAorCWNoYXIJCSpmbmFtZSwKKwlpbnQJCWxpbmVudW0sCisJaW5zdF90CQkqcmEpOworCitleHRlcm4gdm9pZAoreGZzX2NvcnJ1cHRpb25fZXJyb3IoCisJY2hhcgkJKnRhZywKKwlpbnQJCWxldmVsLAorCXN0cnVjdCB4ZnNfbW91bnQgKm1wLAorCXZvaWQJCSpwLAorCWNoYXIJCSpmbmFtZSwKKwlpbnQJCWxpbmVudW0sCisJaW5zdF90CQkqcmEpOworCitleHRlcm4gdm9pZAoreGZzX2hleF9kdW1wKHZvaWQgKnAsIGludCBsZW5ndGgpOworCisjZGVmaW5lCVhGU19FUlJPUl9SRVBPUlQoZSwgbHZsLCBtcCkJXAorCXhmc19lcnJvcl9yZXBvcnQoZSwgbHZsLCBtcCwgX19GSUxFX18sIF9fTElORV9fLCBfX3JldHVybl9hZGRyZXNzKQorI2RlZmluZQlYRlNfQ09SUlVQVElPTl9FUlJPUihlLCBsdmwsIG1wLCBtZW0pCVwKKwl4ZnNfY29ycnVwdGlvbl9lcnJvcihlLCBsdmwsIG1wLCBtZW0sIFwKKwkJCSAgICAgX19GSUxFX18sIF9fTElORV9fLCBfX3JldHVybl9hZGRyZXNzKQorCisjZGVmaW5lIFhGU19FUlJMRVZFTF9PRkYJMAorI2RlZmluZSBYRlNfRVJSTEVWRUxfTE9XCTEKKyNkZWZpbmUgWEZTX0VSUkxFVkVMX0hJR0gJNQorCisvKgorICogZXJyb3IgaW5qZWN0aW9uIHRhZ3MgLSB0aGUgbGFiZWxzIGNhbiBiZSBhbnl0aGluZyB5b3Ugd2FudAorICogYnV0IGVhY2ggdGFnIHNob3VsZCBoYXZlIGl0cyBvd24gdW5pcXVlIG51bWJlcgorICovCisKKyNkZWZpbmUgWEZTX0VSUlRBR19OT0VSUk9SCQkJCTAKKyNkZWZpbmUgWEZTX0VSUlRBR19JRkxVU0hfMQkJCQkxCisjZGVmaW5lIFhGU19FUlJUQUdfSUZMVVNIXzIJCQkJMgorI2RlZmluZSBYRlNfRVJSVEFHX0lGTFVTSF8zCQkJCTMKKyNkZWZpbmUgWEZTX0VSUlRBR19JRkxVU0hfNAkJCQk0CisjZGVmaW5lIFhGU19FUlJUQUdfSUZMVVNIXzUJCQkJNQorI2RlZmluZSBYRlNfRVJSVEFHX0lGTFVTSF82CQkJCTYKKyNkZWZpbmUJWEZTX0VSUlRBR19EQV9SRUFEX0JVRgkJCQk3CisjZGVmaW5lCVhGU19FUlJUQUdfQlRSRUVfQ0hFQ0tfTEJMT0NLCQkJOAorI2RlZmluZQlYRlNfRVJSVEFHX0JUUkVFX0NIRUNLX1NCTE9DSwkJCTkKKyNkZWZpbmUJWEZTX0VSUlRBR19BTExPQ19SRUFEX0FHRgkJCTEwCisjZGVmaW5lCVhGU19FUlJUQUdfSUFMTE9DX1JFQURfQUdJCQkJMTEKKyNkZWZpbmUJWEZTX0VSUlRBR19JVE9CUF9JTk9UT0JQCQkJMTIKKyNkZWZpbmUJWEZTX0VSUlRBR19JVU5MSU5LCQkJCTEzCisjZGVmaW5lCVhGU19FUlJUQUdfSVVOTElOS19SRU1PVkUJCQkxNAorI2RlZmluZQlYRlNfRVJSVEFHX0RJUl9JTk9fVkFMSURBVEUJCQkxNQorI2RlZmluZSBYRlNfRVJSVEFHX0JVTEtTVEFUX1JFQURfQ0hVTksJCQkxNgorI2RlZmluZSBYRlNfRVJSVEFHX0lPRE9ORV9JT0VSUgkJCQkxNworI2RlZmluZSBYRlNfRVJSVEFHX1NUUkFUUkVBRF9JT0VSUgkJCTE4CisjZGVmaW5lIFhGU19FUlJUQUdfU1RSQVRDTVBMX0lPRVJSCQkJMTkKKyNkZWZpbmUgWEZTX0VSUlRBR19ESU9XUklURV9JT0VSUgkJCTIwCisjZGVmaW5lIFhGU19FUlJUQUdfQk1BUElGT1JNQVQJCQkJMjEKKyNkZWZpbmUgWEZTX0VSUlRBR19NQVgJCQkJCTIyCisKKy8qCisgKiBSYW5kb20gZmFjdG9ycyBmb3IgYWJvdmUgdGFncywgMSBtZWFucyBhbHdheXMsIDIgbWVhbnMgMS8yIHRpbWUsIGV0Yy4KKyAqLworI2RlZmluZSBYRlNfUkFORE9NX0RFRkFVTFQJCQkJMTAwCisjZGVmaW5lIFhGU19SQU5ET01fSUZMVVNIXzEJCQkJWEZTX1JBTkRPTV9ERUZBVUxUCisjZGVmaW5lIFhGU19SQU5ET01fSUZMVVNIXzIJCQkJWEZTX1JBTkRPTV9ERUZBVUxUCisjZGVmaW5lIFhGU19SQU5ET01fSUZMVVNIXzMJCQkJWEZTX1JBTkRPTV9ERUZBVUxUCisjZGVmaW5lIFhGU19SQU5ET01fSUZMVVNIXzQJCQkJWEZTX1JBTkRPTV9ERUZBVUxUCisjZGVmaW5lIFhGU19SQU5ET01fSUZMVVNIXzUJCQkJWEZTX1JBTkRPTV9ERUZBVUxUCisjZGVmaW5lIFhGU19SQU5ET01fSUZMVVNIXzYJCQkJWEZTX1JBTkRPTV9ERUZBVUxUCisjZGVmaW5lIFhGU19SQU5ET01fREFfUkVBRF9CVUYJCQkJWEZTX1JBTkRPTV9ERUZBVUxUCisjZGVmaW5lIFhGU19SQU5ET01fQlRSRUVfQ0hFQ0tfTEJMT0NLCQkJKFhGU19SQU5ET01fREVGQVVMVC80KQorI2RlZmluZSBYRlNfUkFORE9NX0JUUkVFX0NIRUNLX1NCTE9DSwkJCVhGU19SQU5ET01fREVGQVVMVAorI2RlZmluZSBYRlNfUkFORE9NX0FMTE9DX1JFQURfQUdGCQkJWEZTX1JBTkRPTV9ERUZBVUxUCisjZGVmaW5lIFhGU19SQU5ET01fSUFMTE9DX1JFQURfQUdJCQkJWEZTX1JBTkRPTV9ERUZBVUxUCisjZGVmaW5lIFhGU19SQU5ET01fSVRPQlBfSU5PVE9CUAkJCVhGU19SQU5ET01fREVGQVVMVAorI2RlZmluZSBYRlNfUkFORE9NX0lVTkxJTksJCQkJWEZTX1JBTkRPTV9ERUZBVUxUCisjZGVmaW5lIFhGU19SQU5ET01fSVVOTElOS19SRU1PVkUJCQlYRlNfUkFORE9NX0RFRkFVTFQKKyNkZWZpbmUgWEZTX1JBTkRPTV9ESVJfSU5PX1ZBTElEQVRFCQkJWEZTX1JBTkRPTV9ERUZBVUxUCisjZGVmaW5lIFhGU19SQU5ET01fQlVMS1NUQVRfUkVBRF9DSFVOSwkJCVhGU19SQU5ET01fREVGQVVMVAorI2RlZmluZSBYRlNfUkFORE9NX0lPRE9ORV9JT0VSUgkJCQkoWEZTX1JBTkRPTV9ERUZBVUxULzEwKQorI2RlZmluZSBYRlNfUkFORE9NX1NUUkFUUkVBRF9JT0VSUgkJCShYRlNfUkFORE9NX0RFRkFVTFQvMTApCisjZGVmaW5lIFhGU19SQU5ET01fU1RSQVRDTVBMX0lPRVJSCQkJKFhGU19SQU5ET01fREVGQVVMVC8xMCkKKyNkZWZpbmUgWEZTX1JBTkRPTV9ESU9XUklURV9JT0VSUgkJCShYRlNfUkFORE9NX0RFRkFVTFQvMTApCisjZGVmaW5lCVhGU19SQU5ET01fQk1BUElGT1JNQVQJCQkJWEZTX1JBTkRPTV9ERUZBVUxUCisKKyNpZiAoZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChJTkRVQ0VfSU9fRVJST1IpKQorZXh0ZXJuIGludAl4ZnNfZXJyb3JfdGVzdChpbnQsIGludCAqLCBjaGFyICosIGludCwgY2hhciAqLCB1bnNpZ25lZCBsb25nKTsKK3ZvaWQgeGZzX2Vycm9yX3Rlc3RfaW5pdCh2b2lkKTsKKworI2RlZmluZQlYRlNfTlVNX0lOSkVDVF9FUlJPUgkJCQkxMAorCisjaWZkZWYgX19BTlNJX0NQUF9fCisjZGVmaW5lIFhGU19URVNUX0VSUk9SKGV4cHIsIG1wLCB0YWcsIHJmKQkJXAorCSgoZXhwcikgfHwgXAorCSB4ZnNfZXJyb3JfdGVzdCgodGFnKSwgKG1wKS0+bV9maXhlZGZzaWQsICNleHByLCBfX0xJTkVfXywgX19GSUxFX18sIFwKKwkJCSAocmYpKSkKKyNlbHNlCisjZGVmaW5lIFhGU19URVNUX0VSUk9SKGV4cHIsIG1wLCB0YWcsIHJmKQkJXAorCSgoZXhwcikgfHwgXAorCSB4ZnNfZXJyb3JfdGVzdCgodGFnKSwgKG1wKS0+bV9maXhlZGZzaWQsICJleHByIiwgX19MSU5FX18sIF9fRklMRV9fLCBcCisJCQkocmYpKSkKKyNlbmRpZiAvKiBfX0FOU0lfQ1BQX18gKi8KKworaW50CQl4ZnNfZXJyb3J0YWdfYWRkKGludCBlcnJvcl90YWcsIHhmc19tb3VudF90ICptcCk7CitpbnQJCXhmc19lcnJvcnRhZ19jbGVhcihpbnQgZXJyb3JfdGFnLCB4ZnNfbW91bnRfdCAqbXApOworCitpbnQJCXhmc19lcnJvcnRhZ19jbGVhcmFsbCh4ZnNfbW91bnRfdCAqbXApOworaW50CQl4ZnNfZXJyb3J0YWdfY2xlYXJhbGxfdW1vdW50KGludDY0X3QgZnNpZCwgY2hhciAqZnNuYW1lLAorCQkJCQkJaW50IGxvdWQpOworI2Vsc2UKKyNkZWZpbmUgWEZTX1RFU1RfRVJST1IoZXhwciwgbXAsIHRhZywgcmYpCShleHByKQorI2RlZmluZSB4ZnNfZXJyb3J0YWdfYWRkKHRhZywgbXApCQkoRU5PU1lTKQorI2RlZmluZSB4ZnNfZXJyb3J0YWdfY2xlYXJhbGwobXApCQkoRU5PU1lTKQorI2VuZGlmIC8qIChERUJVRyB8fCBJTkRVQ0VfSU9fRVJST1IpICovCisKKy8qCisgKiBYRlMgcGFuaWMgdGFncyAtLSBhbGxvdyBhIGNhbGwgdG8geGZzX2Ntbl9lcnIoKSBiZSB0dXJuZWQgaW50bworICoJCQlhIHBhbmljIGJ5IHNldHRpbmcgeGZzX3BhbmljX21hc2sgaW4gYQorICoJCQlzeXNjdGwuICB1cGRhdGUgeGZzX21heFtYRlNfUEFSQU1dIGlmCisgKgkJCW1vcmUgYXJlIGFkZGVkLgorICovCisjZGVmaW5lCQlYRlNfTk9fUFRBRwkJCTAKKyNkZWZpbmUJCVhGU19QVEFHX0lGTFVTSAkJCTB4MDAwMDAwMDEKKyNkZWZpbmUJCVhGU19QVEFHX0xPR1JFUwkJCTB4MDAwMDAwMDIKKyNkZWZpbmUJCVhGU19QVEFHX0FJTERFTEVURQkJMHgwMDAwMDAwNAorI2RlZmluZQkJWEZTX1BUQUdfRVJST1JfUkVQT1JUCQkweDAwMDAwMDA4CisjZGVmaW5lCQlYRlNfUFRBR19TSFVURE9XTl9DT1JSVVBUCTB4MDAwMDAwMTAKKyNkZWZpbmUJCVhGU19QVEFHX1NIVVRET1dOX0lPRVJST1IJMHgwMDAwMDAyMAorI2RlZmluZQkJWEZTX1BUQUdfU0hVVERPV05fTE9HRVJST1IJMHgwMDAwMDA0MAorCitzdHJ1Y3QgeGZzX21vdW50OworLyogUFJJTlRGTElLRTQgKi8KK3ZvaWQJCXhmc19jbW5fZXJyKGludCBwYW5pY190YWcsIGludCBsZXZlbCwgc3RydWN0IHhmc19tb3VudCAqbXAsCisJCQkgICAgY2hhciAqZm10LCAuLi4pOworLyogUFJJTlRGTElLRTMgKi8KK3ZvaWQJCXhmc19mc19jbW5fZXJyKGludCBsZXZlbCwgc3RydWN0IHhmc19tb3VudCAqbXAsIGNoYXIgKmZtdCwgLi4uKTsKKworI2VuZGlmCS8qIF9fWEZTX0VSUk9SX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19leHRmcmVlX2l0ZW0uYyBiL2ZzL3hmcy94ZnNfZXh0ZnJlZV9pdGVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVhZmQ1YgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfZXh0ZnJlZV9pdGVtLmMKQEAgLTAsMCArMSw2NjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKy8qCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB4ZnNfZWZpX2xvZ19pdGVtCisgKiBhbmQgeGZzX2VmZF9sb2dfaXRlbSBpdGVtcy4KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisKKyNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc190cmFuc19wcml2LmgiCisjaW5jbHVkZSAieGZzX2V4dGZyZWVfaXRlbS5oIgorCisKK2ttZW1fem9uZV90CSp4ZnNfZWZpX3pvbmU7CitrbWVtX3pvbmVfdAkqeGZzX2VmZF96b25lOworCitTVEFUSUMgdm9pZAl4ZnNfZWZpX2l0ZW1fdW5sb2NrKHhmc19lZmlfbG9nX2l0ZW1fdCAqKTsKK1NUQVRJQyB2b2lkCXhmc19lZmlfaXRlbV9hYm9ydCh4ZnNfZWZpX2xvZ19pdGVtX3QgKik7CitTVEFUSUMgdm9pZAl4ZnNfZWZkX2l0ZW1fYWJvcnQoeGZzX2VmZF9sb2dfaXRlbV90ICopOworCisKKworLyoKKyAqIFRoaXMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGlvdmVjcyBuZWVkZWQgdG8gbG9nIHRoZSBnaXZlbiBlZmkgaXRlbS4KKyAqIFdlIG9ubHkgbmVlZCAxIGlvdmVjIGZvciBhbiBlZmkgaXRlbS4gIEl0IGp1c3QgbG9ncyB0aGUgZWZpX2xvZ19mb3JtYXQKKyAqIHN0cnVjdHVyZS4KKyAqLworLypBUkdTVVNFRCovCitTVEFUSUMgdWludAoreGZzX2VmaV9pdGVtX3NpemUoeGZzX2VmaV9sb2dfaXRlbV90ICplZmlwKQoreworCXJldHVybiAxOworfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgdG8gZmlsbCBpbiB0aGUgdmVjdG9yIG9mIGxvZyBpb3ZlY3MgZm9yIHRoZQorICogZ2l2ZW4gZWZpIGxvZyBpdGVtLiBXZSB1c2Ugb25seSAxIGlvdmVjLCBhbmQgd2UgcG9pbnQgdGhhdAorICogYXQgdGhlIGVmaV9sb2dfZm9ybWF0IHN0cnVjdHVyZSBlbWJlZGRlZCBpbiB0aGUgZWZpIGl0ZW0uCisgKiBJdCBpcyBhdCB0aGlzIHBvaW50IHRoYXQgd2UgYXNzZXJ0IHRoYXQgYWxsIG9mIHRoZSBleHRlbnQKKyAqIHNsb3RzIGluIHRoZSBlZmkgaXRlbSBoYXZlIGJlZW4gZmlsbGVkLgorICovCitTVEFUSUMgdm9pZAoreGZzX2VmaV9pdGVtX2Zvcm1hdCh4ZnNfZWZpX2xvZ19pdGVtX3QJKmVmaXAsCisJCSAgICB4ZnNfbG9nX2lvdmVjX3QJKmxvZ192ZWN0b3IpCit7CisJdWludAlzaXplOworCisJQVNTRVJUKGVmaXAtPmVmaV9uZXh0X2V4dGVudCA9PSBlZmlwLT5lZmlfZm9ybWF0LmVmaV9uZXh0ZW50cyk7CisKKwllZmlwLT5lZmlfZm9ybWF0LmVmaV90eXBlID0gWEZTX0xJX0VGSTsKKworCXNpemUgPSBzaXplb2YoeGZzX2VmaV9sb2dfZm9ybWF0X3QpOworCXNpemUgKz0gKGVmaXAtPmVmaV9mb3JtYXQuZWZpX25leHRlbnRzIC0gMSkgKiBzaXplb2YoeGZzX2V4dGVudF90KTsKKwllZmlwLT5lZmlfZm9ybWF0LmVmaV9zaXplID0gMTsKKworCWxvZ192ZWN0b3ItPmlfYWRkciA9ICh4ZnNfY2FkZHJfdCkmKGVmaXAtPmVmaV9mb3JtYXQpOworCWxvZ192ZWN0b3ItPmlfbGVuID0gc2l6ZTsKKwlBU1NFUlQoc2l6ZSA+PSBzaXplb2YoeGZzX2VmaV9sb2dfZm9ybWF0X3QpKTsKK30KKworCisvKgorICogUGlubmluZyBoYXMgbm8gbWVhbmluZyBmb3IgYW4gZWZpIGl0ZW0sIHNvIGp1c3QgcmV0dXJuLgorICovCisvKkFSR1NVU0VEKi8KK1NUQVRJQyB2b2lkCit4ZnNfZWZpX2l0ZW1fcGluKHhmc19lZmlfbG9nX2l0ZW1fdCAqZWZpcCkKK3sKKwlyZXR1cm47Cit9CisKKworLyoKKyAqIFdoaWxlIEVGSXMgY2Fubm90IHJlYWxseSBiZSBwaW5uZWQsIHRoZSB1bnBpbiBvcGVyYXRpb24gaXMgdGhlCisgKiBsYXN0IHBsYWNlIGF0IHdoaWNoIHRoZSBFRkkgaXMgbWFuaXB1bGF0ZWQgZHVyaW5nIGEgdHJhbnNhY3Rpb24uCisgKiBIZXJlIHdlIGNvb3JkaW5hdGUgd2l0aCB4ZnNfZWZpX2NhbmNlbCgpIHRvIGRldGVybWluZSB3aG8gZ2V0cyB0bworICogZnJlZSB0aGUgRUZJLgorICovCisvKkFSR1NVU0VEKi8KK1NUQVRJQyB2b2lkCit4ZnNfZWZpX2l0ZW1fdW5waW4oeGZzX2VmaV9sb2dfaXRlbV90ICplZmlwLCBpbnQgc3RhbGUpCit7CisJaW50CQluZXh0czsKKwlpbnQJCXNpemU7CisJeGZzX21vdW50X3QJKm1wOworCVNQTERFQ0wocyk7CisKKwltcCA9IGVmaXAtPmVmaV9pdGVtLmxpX21vdW50cDsKKwlBSUxfTE9DSyhtcCwgcyk7CisJaWYgKGVmaXAtPmVmaV9mbGFncyAmIFhGU19FRklfQ0FOQ0VMRUQpIHsKKwkJLyoKKwkJICogeGZzX3RyYW5zX2RlbGV0ZV9haWwoKSBkcm9wcyB0aGUgQUlMIGxvY2suCisJCSAqLworCQl4ZnNfdHJhbnNfZGVsZXRlX2FpbChtcCwgKHhmc19sb2dfaXRlbV90ICopZWZpcCwgcyk7CisKKwkJbmV4dHMgPSBlZmlwLT5lZmlfZm9ybWF0LmVmaV9uZXh0ZW50czsKKwkJaWYgKG5leHRzID4gWEZTX0VGSV9NQVhfRkFTVF9FWFRFTlRTKSB7CisJCQlzaXplID0gc2l6ZW9mKHhmc19lZmlfbG9nX2l0ZW1fdCk7CisJCQlzaXplICs9IChuZXh0cyAtIDEpICogc2l6ZW9mKHhmc19leHRlbnRfdCk7CisJCQlrbWVtX2ZyZWUoZWZpcCwgc2l6ZSk7CisJCX0gZWxzZSB7CisJCQlrbWVtX3pvbmVfZnJlZSh4ZnNfZWZpX3pvbmUsIGVmaXApOworCQl9CisJfSBlbHNlIHsKKwkJZWZpcC0+ZWZpX2ZsYWdzIHw9IFhGU19FRklfQ09NTUlUVEVEOworCQlBSUxfVU5MT0NLKG1wLCBzKTsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBsaWtlIHVucGluIG9ubHkgd2UgaGF2ZSB0byBhbHNvIGNsZWFyIHRoZSB4YWN0aW9uIGRlc2NyaXB0b3IKKyAqIHBvaW50aW5nIHRoZSBsb2cgaXRlbSBpZiB3ZSBmcmVlIHRoZSBpdGVtLiAgVGhpcyByb3V0aW5lIGR1cGxpY2F0ZXMKKyAqIHVucGluIGJlY2F1c2UgZWZpX2ZsYWdzIGlzIHByb3RlY3RlZCBieSB0aGUgQUlMIGxvY2suICBGcmVlaW5nCisgKiB0aGUgZGVzY3JpcHRvciBhbmQgdGhlbiBjYWxsaW5nIHVucGluIHdvdWxkIGZvcmNlIHVzIHRvIGRyb3AgdGhlIEFJTAorICogbG9jayB3aGljaCB3b3VsZCBvcGVuIHVwIGEgcmFjZSBjb25kaXRpb24uCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfZWZpX2l0ZW1fdW5waW5fcmVtb3ZlKHhmc19lZmlfbG9nX2l0ZW1fdCAqZWZpcCwgeGZzX3RyYW5zX3QgKnRwKQoreworCWludAkJbmV4dHM7CisJaW50CQlzaXplOworCXhmc19tb3VudF90CSptcDsKKwl4ZnNfbG9nX2l0ZW1fZGVzY190CSpsaWRwOworCVNQTERFQ0wocyk7CisKKwltcCA9IGVmaXAtPmVmaV9pdGVtLmxpX21vdW50cDsKKwlBSUxfTE9DSyhtcCwgcyk7CisJaWYgKGVmaXAtPmVmaV9mbGFncyAmIFhGU19FRklfQ0FOQ0VMRUQpIHsKKwkJLyoKKwkJICogZnJlZSB0aGUgeGFjdGlvbiBkZXNjcmlwdG9yIHBvaW50aW5nIHRvIHRoaXMgaXRlbQorCQkgKi8KKwkJbGlkcCA9IHhmc190cmFuc19maW5kX2l0ZW0odHAsICh4ZnNfbG9nX2l0ZW1fdCAqKSBlZmlwKTsKKwkJeGZzX3RyYW5zX2ZyZWVfaXRlbSh0cCwgbGlkcCk7CisJCS8qCisJCSAqIHB1bGwgdGhlIGl0ZW0gb2ZmIHRoZSBBSUwuCisJCSAqIHhmc190cmFuc19kZWxldGVfYWlsKCkgZHJvcHMgdGhlIEFJTCBsb2NrLgorCQkgKi8KKwkJeGZzX3RyYW5zX2RlbGV0ZV9haWwobXAsICh4ZnNfbG9nX2l0ZW1fdCAqKWVmaXAsIHMpOworCQkvKgorCQkgKiBub3cgZnJlZSB0aGUgaXRlbSBpdHNlbGYKKwkJICovCisJCW5leHRzID0gZWZpcC0+ZWZpX2Zvcm1hdC5lZmlfbmV4dGVudHM7CisJCWlmIChuZXh0cyA+IFhGU19FRklfTUFYX0ZBU1RfRVhURU5UUykgeworCQkJc2l6ZSA9IHNpemVvZih4ZnNfZWZpX2xvZ19pdGVtX3QpOworCQkJc2l6ZSArPSAobmV4dHMgLSAxKSAqIHNpemVvZih4ZnNfZXh0ZW50X3QpOworCQkJa21lbV9mcmVlKGVmaXAsIHNpemUpOworCQl9IGVsc2UgeworCQkJa21lbV96b25lX2ZyZWUoeGZzX2VmaV96b25lLCBlZmlwKTsKKwkJfQorCX0gZWxzZSB7CisJCWVmaXAtPmVmaV9mbGFncyB8PSBYRlNfRUZJX0NPTU1JVFRFRDsKKwkJQUlMX1VOTE9DSyhtcCwgcyk7CisJfQorCisJcmV0dXJuOworfQorCisvKgorICogRWZpIGl0ZW1zIGhhdmUgbm8gbG9ja2luZyBvciBwdXNoaW5nLiAgSG93ZXZlciwgc2luY2UgRUZJcyBhcmUKKyAqIHB1bGxlZCBmcm9tIHRoZSBBSUwgd2hlbiB0aGVpciBjb3JyZXNwb25kaW5nIEVGRHMgYXJlIGNvbW1pdHRlZAorICogdG8gZGlzaywgdGhlaXIgc2l0dWF0aW9uIGlzIHZlcnkgc2ltaWxhciB0byBiZWluZyBwaW5uZWQuICBSZXR1cm4KKyAqIFhGU19JVEVNX1BJTk5FRCBzbyB0aGF0IHRoZSBjYWxsZXIgd2lsbCBldmVudHVhbGx5IGZsdXNoIHRoZSBsb2cuCisgKiBUaGlzIHNob3VsZCBoZWxwIGluIGdldHRpbmcgdGhlIEVGSSBvdXQgb2YgdGhlIEFJTC4KKyAqLworLypBUkdTVVNFRCovCitTVEFUSUMgdWludAoreGZzX2VmaV9pdGVtX3RyeWxvY2soeGZzX2VmaV9sb2dfaXRlbV90ICplZmlwKQoreworCXJldHVybiBYRlNfSVRFTV9QSU5ORUQ7Cit9CisKKy8qCisgKiBFZmkgaXRlbXMgaGF2ZSBubyBsb2NraW5nLCBzbyBqdXN0IHJldHVybi4KKyAqLworLypBUkdTVVNFRCovCitTVEFUSUMgdm9pZAoreGZzX2VmaV9pdGVtX3VubG9jayh4ZnNfZWZpX2xvZ19pdGVtX3QgKmVmaXApCit7CisJaWYgKGVmaXAtPmVmaV9pdGVtLmxpX2ZsYWdzICYgWEZTX0xJX0FCT1JURUQpCisJCXhmc19lZmlfaXRlbV9hYm9ydChlZmlwKTsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBUaGUgRUZJIGlzIGxvZ2dlZCBvbmx5IG9uY2UgYW5kIGNhbm5vdCBiZSBtb3ZlZCBpbiB0aGUgbG9nLCBzbworICogc2ltcGx5IHJldHVybiB0aGUgbHNuIGF0IHdoaWNoIGl0J3MgYmVlbiBsb2dnZWQuICBUaGUgY2FuY2VsZWQKKyAqIGZsYWcgaXMgbm90IHBhaWQgYW55IGF0dGVudGlvbiBoZXJlLiAgQ2hlY2tpbmcgZm9yIHRoYXQgaXMgZGVsYXllZAorICogdW50aWwgdGhlIEVGSSBpcyB1bnBpbm5lZC4KKyAqLworLypBUkdTVVNFRCovCitTVEFUSUMgeGZzX2xzbl90Cit4ZnNfZWZpX2l0ZW1fY29tbWl0dGVkKHhmc19lZmlfbG9nX2l0ZW1fdCAqZWZpcCwgeGZzX2xzbl90IGxzbikKK3sKKwlyZXR1cm4gbHNuOworfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgdHJhbnNhY3Rpb24gbG9nZ2luZyB0aGUgRUZJIGlzIGFib3J0ZWQuCisgKiBGcmVlIHVwIHRoZSBFRkkgYW5kIHJldHVybi4gIE5vIG5lZWQgdG8gY2xlYW4gdXAgdGhlIHNsb3QgZm9yCisgKiB0aGUgaXRlbSBpbiB0aGUgdHJhbnNhY3Rpb24uICBUaGF0IHdhcyBkb25lIGJ5IHRoZSB1bnBpbiBjb2RlCisgKiB3aGljaCBpcyBjYWxsZWQgcHJpb3IgdG8gdGhpcyByb3V0aW5lIGluIHRoZSBhYm9ydC9mcy1zaHV0ZG93biBwYXRoLgorICovCitTVEFUSUMgdm9pZAoreGZzX2VmaV9pdGVtX2Fib3J0KHhmc19lZmlfbG9nX2l0ZW1fdCAqZWZpcCkKK3sKKwlpbnQJbmV4dHM7CisJaW50CXNpemU7CisKKwluZXh0cyA9IGVmaXAtPmVmaV9mb3JtYXQuZWZpX25leHRlbnRzOworCWlmIChuZXh0cyA+IFhGU19FRklfTUFYX0ZBU1RfRVhURU5UUykgeworCQlzaXplID0gc2l6ZW9mKHhmc19lZmlfbG9nX2l0ZW1fdCk7CisJCXNpemUgKz0gKG5leHRzIC0gMSkgKiBzaXplb2YoeGZzX2V4dGVudF90KTsKKwkJa21lbV9mcmVlKGVmaXAsIHNpemUpOworCX0gZWxzZSB7CisJCWttZW1fem9uZV9mcmVlKHhmc19lZmlfem9uZSwgZWZpcCk7CisJfQorCXJldHVybjsKK30KKworLyoKKyAqIFRoZXJlIGlzbid0IG11Y2ggeW91IGNhbiBkbyB0byBwdXNoIG9uIGFuIGVmaSBpdGVtLiAgSXQgaXMgc2ltcGx5CisgKiBzdHVjayB3YWl0aW5nIGZvciBhbGwgb2YgaXRzIGNvcnJlc3BvbmRpbmcgZWZkIGl0ZW1zIHRvIGJlCisgKiBjb21taXR0ZWQgdG8gZGlzay4KKyAqLworLypBUkdTVVNFRCovCitTVEFUSUMgdm9pZAoreGZzX2VmaV9pdGVtX3B1c2goeGZzX2VmaV9sb2dfaXRlbV90ICplZmlwKQoreworCXJldHVybjsKK30KKworLyoKKyAqIFRoZSBFRkkgZGVwZW5kZW5jeSB0cmFja2luZyBvcCBkb2Vzbid0IGRvIHNxdWF0LiAgSXQgY2FuJ3QgYmVjYXVzZQorICogaXQgZG9lc24ndCBrbm93IHdoZXJlIHRoZSBmcmVlIGV4dGVudCBpcyBjb21pbmcgZnJvbS4gIFRoZSBkZXBlbmRlbmN5CisgKiB0cmFja2luZyBoYXMgdG8gYmUgaGFuZGxlZCBieSB0aGUgImVuY2xvc2luZyIgbWV0YWRhdGEgb2JqZWN0LiAgRm9yCisgKiBleGFtcGxlLCBmb3IgaW5vZGVzLCB0aGUgaW5vZGUgaXMgbG9ja2VkIHRocm91Z2hvdXQgdGhlIGV4dGVudCBmcmVlaW5nCisgKiBzbyB0aGUgZGVwZW5kZW5jeSBzaG91bGQgYmUgcmVjb3JkZWQgdGhlcmUuCisgKi8KKy8qQVJHU1VTRUQqLworU1RBVElDIHZvaWQKK3hmc19lZmlfaXRlbV9jb21taXR0aW5nKHhmc19lZmlfbG9nX2l0ZW1fdCAqZWZpcCwgeGZzX2xzbl90IGxzbikKK3sKKwlyZXR1cm47Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBvcHMgdmVjdG9yIHNoYXJlZCBieSBhbGwgZWZpIGxvZyBpdGVtcy4KKyAqLworc3RydWN0IHhmc19pdGVtX29wcyB4ZnNfZWZpX2l0ZW1fb3BzID0geworCS5pb3Bfc2l6ZQk9ICh1aW50KCopKHhmc19sb2dfaXRlbV90KikpeGZzX2VmaV9pdGVtX3NpemUsCisJLmlvcF9mb3JtYXQJPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCosIHhmc19sb2dfaW92ZWNfdCopKQorCQkJCQl4ZnNfZWZpX2l0ZW1fZm9ybWF0LAorCS5pb3BfcGluCT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfZWZpX2l0ZW1fcGluLAorCS5pb3BfdW5waW4JPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCosIGludCkpeGZzX2VmaV9pdGVtX3VucGluLAorCS5pb3BfdW5waW5fcmVtb3ZlID0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqLCB4ZnNfdHJhbnNfdCAqKSkKKwkJCQkJeGZzX2VmaV9pdGVtX3VucGluX3JlbW92ZSwKKwkuaW9wX3RyeWxvY2sJPSAodWludCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19lZmlfaXRlbV90cnlsb2NrLAorCS5pb3BfdW5sb2NrCT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfZWZpX2l0ZW1fdW5sb2NrLAorCS5pb3BfY29tbWl0dGVkCT0gKHhmc19sc25fdCgqKSh4ZnNfbG9nX2l0ZW1fdCosIHhmc19sc25fdCkpCisJCQkJCXhmc19lZmlfaXRlbV9jb21taXR0ZWQsCisJLmlvcF9wdXNoCT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfZWZpX2l0ZW1fcHVzaCwKKwkuaW9wX2Fib3J0CT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfZWZpX2l0ZW1fYWJvcnQsCisJLmlvcF9wdXNoYnVmCT0gTlVMTCwKKwkuaW9wX2NvbW1pdHRpbmcgPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCosIHhmc19sc25fdCkpCisJCQkJCXhmc19lZmlfaXRlbV9jb21taXR0aW5nCit9OworCisKKy8qCisgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhbiBlZmkgaXRlbSB3aXRoIHRoZSBnaXZlbiBudW1iZXIgb2YgZXh0ZW50cy4KKyAqLworeGZzX2VmaV9sb2dfaXRlbV90ICoKK3hmc19lZmlfaW5pdCh4ZnNfbW91bnRfdAkqbXAsCisJICAgICB1aW50CQluZXh0ZW50cykKKworeworCXhmc19lZmlfbG9nX2l0ZW1fdAkqZWZpcDsKKwl1aW50CQkJc2l6ZTsKKworCUFTU0VSVChuZXh0ZW50cyA+IDApOworCWlmIChuZXh0ZW50cyA+IFhGU19FRklfTUFYX0ZBU1RfRVhURU5UUykgeworCQlzaXplID0gKHVpbnQpKHNpemVvZih4ZnNfZWZpX2xvZ19pdGVtX3QpICsKKwkJCSgobmV4dGVudHMgLSAxKSAqIHNpemVvZih4ZnNfZXh0ZW50X3QpKSk7CisJCWVmaXAgPSAoeGZzX2VmaV9sb2dfaXRlbV90KilrbWVtX3phbGxvYyhzaXplLCBLTV9TTEVFUCk7CisJfSBlbHNlIHsKKwkJZWZpcCA9ICh4ZnNfZWZpX2xvZ19pdGVtX3QqKWttZW1fem9uZV96YWxsb2MoeGZzX2VmaV96b25lLAorCQkJCQkJCSAgICAgS01fU0xFRVApOworCX0KKworCWVmaXAtPmVmaV9pdGVtLmxpX3R5cGUgPSBYRlNfTElfRUZJOworCWVmaXAtPmVmaV9pdGVtLmxpX29wcyA9ICZ4ZnNfZWZpX2l0ZW1fb3BzOworCWVmaXAtPmVmaV9pdGVtLmxpX21vdW50cCA9IG1wOworCWVmaXAtPmVmaV9mb3JtYXQuZWZpX25leHRlbnRzID0gbmV4dGVudHM7CisJZWZpcC0+ZWZpX2Zvcm1hdC5lZmlfaWQgPSAoX19wc2ludF90KSh2b2lkKillZmlwOworCisJcmV0dXJuIChlZmlwKTsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBlZmQgaXRlbSBjb2RlIGJlbG93IHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0bworICogdGhlIGdpdmVuIGVmaSBpdGVtLiAgRWFjaCBlZmQgY2FsbHMgdGhpcyB3aXRoIHRoZSBudW1iZXIgb2YKKyAqIGV4dGVudHMgdGhhdCBpdCBoYXMgbG9nZ2VkLCBhbmQgd2hlbiB0aGUgc3VtIG9mIHRoZXNlIHJlYWNoZXMKKyAqIHRoZSB0b3RhbCBudW1iZXIgb2YgZXh0ZW50cyBsb2dnZWQgYnkgdGhpcyBlZmkgaXRlbSB3ZSBjYW4gZnJlZQorICogdGhlIGVmaSBpdGVtLgorICoKKyAqIEZyZWVpbmcgdGhlIGVmaSBpdGVtIHJlcXVpcmVzIHRoYXQgd2UgcmVtb3ZlIGl0IGZyb20gdGhlIEFJTC4KKyAqIFdlJ2xsIHVzZSB0aGUgQUlMIGxvY2sgdG8gcHJvdGVjdCBvdXIgY291bnRlcnMgYXMgd2VsbCBhcworICogdGhlIHJlbW92YWwgZnJvbSB0aGUgQUlMLgorICovCit2b2lkCit4ZnNfZWZpX3JlbGVhc2UoeGZzX2VmaV9sb2dfaXRlbV90CSplZmlwLAorCQl1aW50CQkJbmV4dGVudHMpCit7CisJeGZzX21vdW50X3QJKm1wOworCWludAkJZXh0ZW50c19sZWZ0OworCXVpbnQJCXNpemU7CisJaW50CQluZXh0czsKKwlTUExERUNMKHMpOworCisJbXAgPSBlZmlwLT5lZmlfaXRlbS5saV9tb3VudHA7CisJQVNTRVJUKGVmaXAtPmVmaV9uZXh0X2V4dGVudCA+IDApOworCUFTU0VSVChlZmlwLT5lZmlfZmxhZ3MgJiBYRlNfRUZJX0NPTU1JVFRFRCk7CisKKwlBSUxfTE9DSyhtcCwgcyk7CisJQVNTRVJUKGVmaXAtPmVmaV9uZXh0X2V4dGVudCA+PSBuZXh0ZW50cyk7CisJZWZpcC0+ZWZpX25leHRfZXh0ZW50IC09IG5leHRlbnRzOworCWV4dGVudHNfbGVmdCA9IGVmaXAtPmVmaV9uZXh0X2V4dGVudDsKKwlpZiAoZXh0ZW50c19sZWZ0ID09IDApIHsKKwkJLyoKKwkJICogeGZzX3RyYW5zX2RlbGV0ZV9haWwoKSBkcm9wcyB0aGUgQUlMIGxvY2suCisJCSAqLworCQl4ZnNfdHJhbnNfZGVsZXRlX2FpbChtcCwgKHhmc19sb2dfaXRlbV90ICopZWZpcCwgcyk7CisJfSBlbHNlIHsKKwkJQUlMX1VOTE9DSyhtcCwgcyk7CisJfQorCisJaWYgKGV4dGVudHNfbGVmdCA9PSAwKSB7CisJCW5leHRzID0gZWZpcC0+ZWZpX2Zvcm1hdC5lZmlfbmV4dGVudHM7CisJCWlmIChuZXh0cyA+IFhGU19FRklfTUFYX0ZBU1RfRVhURU5UUykgeworCQkJc2l6ZSA9IHNpemVvZih4ZnNfZWZpX2xvZ19pdGVtX3QpOworCQkJc2l6ZSArPSAobmV4dHMgLSAxKSAqIHNpemVvZih4ZnNfZXh0ZW50X3QpOworCQkJa21lbV9mcmVlKGVmaXAsIHNpemUpOworCQl9IGVsc2UgeworCQkJa21lbV96b25lX2ZyZWUoeGZzX2VmaV96b25lLCBlZmlwKTsKKwkJfQorCX0KK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIHRyYW5zYWN0aW9uIHRoYXQgc2hvdWxkIGJlIGNvbW1pdHRpbmcgdGhlCisgKiBFRkQgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gRUZJIGlzIGFib3J0ZWQuICBUaGUgY29tbWl0dGVkIGFuZAorICogY2FuY2VsZWQgZmxhZ3MgYXJlIHVzZWQgdG8gY29vcmRpbmF0ZSB0aGUgZnJlZWluZyBvZiB0aGUgRUZJIGFuZAorICogdGhlIHJlZmVyZW5jZXMgYnkgdGhlIHRyYW5zYWN0aW9uIHRoYXQgY29tbWl0dGVkIGl0LgorICovCitTVEFUSUMgdm9pZAoreGZzX2VmaV9jYW5jZWwoCisJeGZzX2VmaV9sb2dfaXRlbV90CSplZmlwKQoreworCWludAkJbmV4dHM7CisJaW50CQlzaXplOworCXhmc19tb3VudF90CSptcDsKKwlTUExERUNMKHMpOworCisJbXAgPSBlZmlwLT5lZmlfaXRlbS5saV9tb3VudHA7CisJQUlMX0xPQ0sobXAsIHMpOworCWlmIChlZmlwLT5lZmlfZmxhZ3MgJiBYRlNfRUZJX0NPTU1JVFRFRCkgeworCQkvKgorCQkgKiB4ZnNfdHJhbnNfZGVsZXRlX2FpbCgpIGRyb3BzIHRoZSBBSUwgbG9jay4KKwkJICovCisJCXhmc190cmFuc19kZWxldGVfYWlsKG1wLCAoeGZzX2xvZ19pdGVtX3QgKillZmlwLCBzKTsKKworCQluZXh0cyA9IGVmaXAtPmVmaV9mb3JtYXQuZWZpX25leHRlbnRzOworCQlpZiAobmV4dHMgPiBYRlNfRUZJX01BWF9GQVNUX0VYVEVOVFMpIHsKKwkJCXNpemUgPSBzaXplb2YoeGZzX2VmaV9sb2dfaXRlbV90KTsKKwkJCXNpemUgKz0gKG5leHRzIC0gMSkgKiBzaXplb2YoeGZzX2V4dGVudF90KTsKKwkJCWttZW1fZnJlZShlZmlwLCBzaXplKTsKKwkJfSBlbHNlIHsKKwkJCWttZW1fem9uZV9mcmVlKHhmc19lZmlfem9uZSwgZWZpcCk7CisJCX0KKwl9IGVsc2UgeworCQllZmlwLT5lZmlfZmxhZ3MgfD0gWEZTX0VGSV9DQU5DRUxFRDsKKwkJQUlMX1VOTE9DSyhtcCwgcyk7CisJfQorCisJcmV0dXJuOworfQorCisKKworCisKKy8qCisgKiBUaGlzIHJldHVybnMgdGhlIG51bWJlciBvZiBpb3ZlY3MgbmVlZGVkIHRvIGxvZyB0aGUgZ2l2ZW4gZWZkIGl0ZW0uCisgKiBXZSBvbmx5IG5lZWQgMSBpb3ZlYyBmb3IgYW4gZWZkIGl0ZW0uICBJdCBqdXN0IGxvZ3MgdGhlIGVmZF9sb2dfZm9ybWF0CisgKiBzdHJ1Y3R1cmUuCisgKi8KKy8qQVJHU1VTRUQqLworU1RBVElDIHVpbnQKK3hmc19lZmRfaXRlbV9zaXplKHhmc19lZmRfbG9nX2l0ZW1fdCAqZWZkcCkKK3sKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHRvIGZpbGwgaW4gdGhlIHZlY3RvciBvZiBsb2cgaW92ZWNzIGZvciB0aGUKKyAqIGdpdmVuIGVmZCBsb2cgaXRlbS4gV2UgdXNlIG9ubHkgMSBpb3ZlYywgYW5kIHdlIHBvaW50IHRoYXQKKyAqIGF0IHRoZSBlZmRfbG9nX2Zvcm1hdCBzdHJ1Y3R1cmUgZW1iZWRkZWQgaW4gdGhlIGVmZCBpdGVtLgorICogSXQgaXMgYXQgdGhpcyBwb2ludCB0aGF0IHdlIGFzc2VydCB0aGF0IGFsbCBvZiB0aGUgZXh0ZW50CisgKiBzbG90cyBpbiB0aGUgZWZkIGl0ZW0gaGF2ZSBiZWVuIGZpbGxlZC4KKyAqLworU1RBVElDIHZvaWQKK3hmc19lZmRfaXRlbV9mb3JtYXQoeGZzX2VmZF9sb2dfaXRlbV90CSplZmRwLAorCQkgICAgeGZzX2xvZ19pb3ZlY190CSpsb2dfdmVjdG9yKQoreworCXVpbnQJc2l6ZTsKKworCUFTU0VSVChlZmRwLT5lZmRfbmV4dF9leHRlbnQgPT0gZWZkcC0+ZWZkX2Zvcm1hdC5lZmRfbmV4dGVudHMpOworCisJZWZkcC0+ZWZkX2Zvcm1hdC5lZmRfdHlwZSA9IFhGU19MSV9FRkQ7CisKKwlzaXplID0gc2l6ZW9mKHhmc19lZmRfbG9nX2Zvcm1hdF90KTsKKwlzaXplICs9IChlZmRwLT5lZmRfZm9ybWF0LmVmZF9uZXh0ZW50cyAtIDEpICogc2l6ZW9mKHhmc19leHRlbnRfdCk7CisJZWZkcC0+ZWZkX2Zvcm1hdC5lZmRfc2l6ZSA9IDE7CisKKwlsb2dfdmVjdG9yLT5pX2FkZHIgPSAoeGZzX2NhZGRyX3QpJihlZmRwLT5lZmRfZm9ybWF0KTsKKwlsb2dfdmVjdG9yLT5pX2xlbiA9IHNpemU7CisJQVNTRVJUKHNpemUgPj0gc2l6ZW9mKHhmc19lZmRfbG9nX2Zvcm1hdF90KSk7Cit9CisKKworLyoKKyAqIFBpbm5pbmcgaGFzIG5vIG1lYW5pbmcgZm9yIGFuIGVmZCBpdGVtLCBzbyBqdXN0IHJldHVybi4KKyAqLworLypBUkdTVVNFRCovCitTVEFUSUMgdm9pZAoreGZzX2VmZF9pdGVtX3Bpbih4ZnNfZWZkX2xvZ19pdGVtX3QgKmVmZHApCit7CisJcmV0dXJuOworfQorCisKKy8qCisgKiBTaW5jZSBwaW5uaW5nIGhhcyBubyBtZWFuaW5nIGZvciBhbiBlZmQgaXRlbSwgdW5waW5uaW5nIGRvZXMKKyAqIG5vdCBlaXRoZXIuCisgKi8KKy8qQVJHU1VTRUQqLworU1RBVElDIHZvaWQKK3hmc19lZmRfaXRlbV91bnBpbih4ZnNfZWZkX2xvZ19pdGVtX3QgKmVmZHAsIGludCBzdGFsZSkKK3sKKwlyZXR1cm47Cit9CisKKy8qQVJHU1VTRUQqLworU1RBVElDIHZvaWQKK3hmc19lZmRfaXRlbV91bnBpbl9yZW1vdmUoeGZzX2VmZF9sb2dfaXRlbV90ICplZmRwLCB4ZnNfdHJhbnNfdCAqdHApCit7CisJcmV0dXJuOworfQorCisvKgorICogRWZkIGl0ZW1zIGhhdmUgbm8gbG9ja2luZywgc28ganVzdCByZXR1cm4gc3VjY2Vzcy4KKyAqLworLypBUkdTVVNFRCovCitTVEFUSUMgdWludAoreGZzX2VmZF9pdGVtX3RyeWxvY2soeGZzX2VmZF9sb2dfaXRlbV90ICplZmRwKQoreworCXJldHVybiBYRlNfSVRFTV9MT0NLRUQ7Cit9CisKKy8qCisgKiBFZmQgaXRlbXMgaGF2ZSBubyBsb2NraW5nIG9yIHB1c2hpbmcsIHNvIHJldHVybiBmYWlsdXJlCisgKiBzbyB0aGF0IHRoZSBjYWxsZXIgZG9lc24ndCBib3RoZXIgd2l0aCB1cy4KKyAqLworLypBUkdTVVNFRCovCitTVEFUSUMgdm9pZAoreGZzX2VmZF9pdGVtX3VubG9jayh4ZnNfZWZkX2xvZ19pdGVtX3QgKmVmZHApCit7CisJaWYgKGVmZHAtPmVmZF9pdGVtLmxpX2ZsYWdzICYgWEZTX0xJX0FCT1JURUQpCisJCXhmc19lZmRfaXRlbV9hYm9ydChlZmRwKTsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBXaGVuIHRoZSBlZmQgaXRlbSBpcyBjb21taXR0ZWQgdG8gZGlzaywgYWxsIHdlIG5lZWQgdG8gZG8KKyAqIGlzIGRlbGV0ZSBvdXIgcmVmZXJlbmNlIHRvIG91ciBwYXJ0bmVyIGVmaSBpdGVtIGFuZCB0aGVuCisgKiBmcmVlIG91cnNlbHZlcy4gIFNpbmNlIHdlJ3JlIGZyZWVpbmcgb3Vyc2VsdmVzIHdlIG11c3QKKyAqIHJldHVybiAtMSB0byBrZWVwIHRoZSB0cmFuc2FjdGlvbiBjb2RlIGZyb20gZnVydGhlciByZWZlcmVuY2luZworICogdGhpcyBpdGVtLgorICovCisvKkFSR1NVU0VEKi8KK1NUQVRJQyB4ZnNfbHNuX3QKK3hmc19lZmRfaXRlbV9jb21taXR0ZWQoeGZzX2VmZF9sb2dfaXRlbV90ICplZmRwLCB4ZnNfbHNuX3QgbHNuKQoreworCXVpbnQJc2l6ZTsKKwlpbnQJbmV4dHM7CisKKwkvKgorCSAqIElmIHdlIGdvdCBhIGxvZyBJL08gZXJyb3IsIGl0J3MgYWx3YXlzIHRoZSBjYXNlIHRoYXQgdGhlIExSIHdpdGggdGhlCisJICogRUZJIGdvdCB1bnBpbm5lZCBhbmQgZnJlZWQgYmVmb3JlIHRoZSBFRkQgZ290IGFib3J0ZWQuCisJICovCisJaWYgKChlZmRwLT5lZmRfaXRlbS5saV9mbGFncyAmIFhGU19MSV9BQk9SVEVEKSA9PSAwKQorCQl4ZnNfZWZpX3JlbGVhc2UoZWZkcC0+ZWZkX2VmaXAsIGVmZHAtPmVmZF9mb3JtYXQuZWZkX25leHRlbnRzKTsKKworCW5leHRzID0gZWZkcC0+ZWZkX2Zvcm1hdC5lZmRfbmV4dGVudHM7CisJaWYgKG5leHRzID4gWEZTX0VGRF9NQVhfRkFTVF9FWFRFTlRTKSB7CisJCXNpemUgPSBzaXplb2YoeGZzX2VmZF9sb2dfaXRlbV90KTsKKwkJc2l6ZSArPSAobmV4dHMgLSAxKSAqIHNpemVvZih4ZnNfZXh0ZW50X3QpOworCQlrbWVtX2ZyZWUoZWZkcCwgc2l6ZSk7CisJfSBlbHNlIHsKKwkJa21lbV96b25lX2ZyZWUoeGZzX2VmZF96b25lLCBlZmRwKTsKKwl9CisKKwlyZXR1cm4gKHhmc19sc25fdCktMTsKK30KKworLyoKKyAqIFRoZSB0cmFuc2FjdGlvbiBvZiB3aGljaCB0aGlzIEVGRCBpcyBhIHBhcnQgaGFzIGJlZW4gYWJvcnRlZC4KKyAqIEluZm9ybSBpdHMgY29tcGFuaW9uIEVGSSBvZiB0aGlzIGZhY3QgYW5kIHRoZW4gY2xlYW4gdXAgYWZ0ZXIKKyAqIG91cnNlbHZlcy4gIE5vIG5lZWQgdG8gY2xlYW4gdXAgdGhlIHNsb3QgZm9yIHRoZSBpdGVtIGluIHRoZQorICogdHJhbnNhY3Rpb24uICBUaGF0IHdhcyBkb25lIGJ5IHRoZSB1bnBpbiBjb2RlIHdoaWNoIGlzIGNhbGxlZAorICogcHJpb3IgdG8gdGhpcyByb3V0aW5lIGluIHRoZSBhYm9ydC9mcy1zaHV0ZG93biBwYXRoLgorICovCitTVEFUSUMgdm9pZAoreGZzX2VmZF9pdGVtX2Fib3J0KHhmc19lZmRfbG9nX2l0ZW1fdCAqZWZkcCkKK3sKKwlpbnQJbmV4dHM7CisJaW50CXNpemU7CisKKwkvKgorCSAqIElmIHdlIGdvdCBhIGxvZyBJL08gZXJyb3IsIGl0J3MgYWx3YXlzIHRoZSBjYXNlIHRoYXQgdGhlIExSIHdpdGggdGhlCisJICogRUZJIGdvdCB1bnBpbm5lZCBhbmQgZnJlZWQgYmVmb3JlIHRoZSBFRkQgZ290IGFib3J0ZWQuIFNvIGRvbid0CisJICogcmVmZXJlbmNlIHRoZSBFRkkgYXQgYWxsIGluIHRoYXQgY2FzZS4KKwkgKi8KKwlpZiAoKGVmZHAtPmVmZF9pdGVtLmxpX2ZsYWdzICYgWEZTX0xJX0FCT1JURUQpID09IDApCisJCXhmc19lZmlfY2FuY2VsKGVmZHAtPmVmZF9lZmlwKTsKKworCW5leHRzID0gZWZkcC0+ZWZkX2Zvcm1hdC5lZmRfbmV4dGVudHM7CisJaWYgKG5leHRzID4gWEZTX0VGRF9NQVhfRkFTVF9FWFRFTlRTKSB7CisJCXNpemUgPSBzaXplb2YoeGZzX2VmZF9sb2dfaXRlbV90KTsKKwkJc2l6ZSArPSAobmV4dHMgLSAxKSAqIHNpemVvZih4ZnNfZXh0ZW50X3QpOworCQlrbWVtX2ZyZWUoZWZkcCwgc2l6ZSk7CisJfSBlbHNlIHsKKwkJa21lbV96b25lX2ZyZWUoeGZzX2VmZF96b25lLCBlZmRwKTsKKwl9CisJcmV0dXJuOworfQorCisvKgorICogVGhlcmUgaXNuJ3QgbXVjaCB5b3UgY2FuIGRvIHRvIHB1c2ggb24gYW4gZWZkIGl0ZW0uICBJdCBpcyBzaW1wbHkKKyAqIHN0dWNrIHdhaXRpbmcgZm9yIHRoZSBsb2cgdG8gYmUgZmx1c2hlZCB0byBkaXNrLgorICovCisvKkFSR1NVU0VEKi8KK1NUQVRJQyB2b2lkCit4ZnNfZWZkX2l0ZW1fcHVzaCh4ZnNfZWZkX2xvZ19pdGVtX3QgKmVmZHApCit7CisJcmV0dXJuOworfQorCisvKgorICogVGhlIEVGRCBkZXBlbmRlbmN5IHRyYWNraW5nIG9wIGRvZXNuJ3QgZG8gc3F1YXQuICBJdCBjYW4ndCBiZWNhdXNlCisgKiBpdCBkb2Vzbid0IGtub3cgd2hlcmUgdGhlIGZyZWUgZXh0ZW50IGlzIGNvbWluZyBmcm9tLiAgVGhlIGRlcGVuZGVuY3kKKyAqIHRyYWNraW5nIGhhcyB0byBiZSBoYW5kbGVkIGJ5IHRoZSAiZW5jbG9zaW5nIiBtZXRhZGF0YSBvYmplY3QuICBGb3IKKyAqIGV4YW1wbGUsIGZvciBpbm9kZXMsIHRoZSBpbm9kZSBpcyBsb2NrZWQgdGhyb3VnaG91dCB0aGUgZXh0ZW50IGZyZWVpbmcKKyAqIHNvIHRoZSBkZXBlbmRlbmN5IHNob3VsZCBiZSByZWNvcmRlZCB0aGVyZS4KKyAqLworLypBUkdTVVNFRCovCitTVEFUSUMgdm9pZAoreGZzX2VmZF9pdGVtX2NvbW1pdHRpbmcoeGZzX2VmZF9sb2dfaXRlbV90ICplZmlwLCB4ZnNfbHNuX3QgbHNuKQoreworCXJldHVybjsKK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIG9wcyB2ZWN0b3Igc2hhcmVkIGJ5IGFsbCBlZmQgbG9nIGl0ZW1zLgorICovCitzdHJ1Y3QgeGZzX2l0ZW1fb3BzIHhmc19lZmRfaXRlbV9vcHMgPSB7CisJLmlvcF9zaXplCT0gKHVpbnQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfZWZkX2l0ZW1fc2l6ZSwKKwkuaW9wX2Zvcm1hdAk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KiwgeGZzX2xvZ19pb3ZlY190KikpCisJCQkJCXhmc19lZmRfaXRlbV9mb3JtYXQsCisJLmlvcF9waW4JPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19lZmRfaXRlbV9waW4sCisJLmlvcF91bnBpbgk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KiwgaW50KSl4ZnNfZWZkX2l0ZW1fdW5waW4sCisJLmlvcF91bnBpbl9yZW1vdmUgPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCosIHhmc190cmFuc190KikpCisJCQkJCXhmc19lZmRfaXRlbV91bnBpbl9yZW1vdmUsCisJLmlvcF90cnlsb2NrCT0gKHVpbnQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfZWZkX2l0ZW1fdHJ5bG9jaywKKwkuaW9wX3VubG9jawk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KikpeGZzX2VmZF9pdGVtX3VubG9jaywKKwkuaW9wX2NvbW1pdHRlZAk9ICh4ZnNfbHNuX3QoKikoeGZzX2xvZ19pdGVtX3QqLCB4ZnNfbHNuX3QpKQorCQkJCQl4ZnNfZWZkX2l0ZW1fY29tbWl0dGVkLAorCS5pb3BfcHVzaAk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KikpeGZzX2VmZF9pdGVtX3B1c2gsCisJLmlvcF9hYm9ydAk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KikpeGZzX2VmZF9pdGVtX2Fib3J0LAorCS5pb3BfcHVzaGJ1Zgk9IE5VTEwsCisJLmlvcF9jb21taXR0aW5nID0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqLCB4ZnNfbHNuX3QpKQorCQkJCQl4ZnNfZWZkX2l0ZW1fY29tbWl0dGluZworfTsKKworCisvKgorICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYW4gZWZkIGl0ZW0gd2l0aCB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGV4dGVudHMuCisgKi8KK3hmc19lZmRfbG9nX2l0ZW1fdCAqCit4ZnNfZWZkX2luaXQoeGZzX21vdW50X3QJKm1wLAorCSAgICAgeGZzX2VmaV9sb2dfaXRlbV90CSplZmlwLAorCSAgICAgdWludAkJbmV4dGVudHMpCisKK3sKKwl4ZnNfZWZkX2xvZ19pdGVtX3QJKmVmZHA7CisJdWludAkJCXNpemU7CisKKwlBU1NFUlQobmV4dGVudHMgPiAwKTsKKwlpZiAobmV4dGVudHMgPiBYRlNfRUZEX01BWF9GQVNUX0VYVEVOVFMpIHsKKwkJc2l6ZSA9ICh1aW50KShzaXplb2YoeGZzX2VmZF9sb2dfaXRlbV90KSArCisJCQkoKG5leHRlbnRzIC0gMSkgKiBzaXplb2YoeGZzX2V4dGVudF90KSkpOworCQllZmRwID0gKHhmc19lZmRfbG9nX2l0ZW1fdCopa21lbV96YWxsb2Moc2l6ZSwgS01fU0xFRVApOworCX0gZWxzZSB7CisJCWVmZHAgPSAoeGZzX2VmZF9sb2dfaXRlbV90KilrbWVtX3pvbmVfemFsbG9jKHhmc19lZmRfem9uZSwKKwkJCQkJCQkgICAgIEtNX1NMRUVQKTsKKwl9CisKKwllZmRwLT5lZmRfaXRlbS5saV90eXBlID0gWEZTX0xJX0VGRDsKKwllZmRwLT5lZmRfaXRlbS5saV9vcHMgPSAmeGZzX2VmZF9pdGVtX29wczsKKwllZmRwLT5lZmRfaXRlbS5saV9tb3VudHAgPSBtcDsKKwllZmRwLT5lZmRfZWZpcCA9IGVmaXA7CisJZWZkcC0+ZWZkX2Zvcm1hdC5lZmRfbmV4dGVudHMgPSBuZXh0ZW50czsKKwllZmRwLT5lZmRfZm9ybWF0LmVmZF9lZmlfaWQgPSBlZmlwLT5lZmlfZm9ybWF0LmVmaV9pZDsKKworCXJldHVybiAoZWZkcCk7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2V4dGZyZWVfaXRlbS5oIGIvZnMveGZzL3hmc19leHRmcmVlX2l0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTIyZDYxCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19leHRmcmVlX2l0ZW0uaApAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmCV9fWEZTX0VYVEZSRUVfSVRFTV9IX18KKyNkZWZpbmUJX19YRlNfRVhURlJFRV9JVEVNX0hfXworCitzdHJ1Y3QgeGZzX21vdW50Oworc3RydWN0IGttZW1fem9uZTsKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2V4dGVudCB7CisJeGZzX2Rmc2Jub190CWV4dF9zdGFydDsKKwl4ZnNfZXh0bGVuX3QJZXh0X2xlbjsKK30geGZzX2V4dGVudF90OworCisvKgorICogVGhpcyBpcyB0aGUgc3RydWN0dXJlIHVzZWQgdG8gbGF5IG91dCBhbiBlZmkgbG9nIGl0ZW0gaW4gdGhlCisgKiBsb2cuICBUaGUgZWZpX2V4dGVudHMgZmllbGQgaXMgYSB2YXJpYWJsZSBzaXplIGFycmF5IHdob3NlCisgKiBzaXplIGlzIGdpdmVuIGJ5IGVmaV9uZXh0ZW50cy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2VmaV9sb2dfZm9ybWF0IHsKKwl1bnNpZ25lZCBzaG9ydAkJZWZpX3R5cGU7CS8qIGVmaSBsb2cgaXRlbSB0eXBlICovCisJdW5zaWduZWQgc2hvcnQJCWVmaV9zaXplOwkvKiBzaXplIG9mIHRoaXMgaXRlbSAqLworCXVpbnQJCQllZmlfbmV4dGVudHM7CS8qICMgZXh0ZW50cyB0byBmcmVlICovCisJX191aW50NjRfdAkJZWZpX2lkOwkJLyogZWZpIGlkZW50aWZpZXIgKi8KKwl4ZnNfZXh0ZW50X3QJCWVmaV9leHRlbnRzWzFdOwkvKiBhcnJheSBvZiBleHRlbnRzIHRvIGZyZWUgKi8KK30geGZzX2VmaV9sb2dfZm9ybWF0X3Q7CisKKy8qCisgKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgdXNlZCB0byBsYXkgb3V0IGFuIGVmZCBsb2cgaXRlbSBpbiB0aGUKKyAqIGxvZy4gIFRoZSBlZmRfZXh0ZW50cyBhcnJheSBpcyBhIHZhcmlhYmxlIHNpemUgYXJyYXkgd2hvc2UKKyAqIHNpemUgaXMgZ2l2ZW4gYnkgZWZkX25leHRlbnRzOworICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZWZkX2xvZ19mb3JtYXQgeworCXVuc2lnbmVkIHNob3J0CQllZmRfdHlwZTsJLyogZWZkIGxvZyBpdGVtIHR5cGUgKi8KKwl1bnNpZ25lZCBzaG9ydAkJZWZkX3NpemU7CS8qIHNpemUgb2YgdGhpcyBpdGVtICovCisJdWludAkJCWVmZF9uZXh0ZW50czsJLyogIyBvZiBleHRlbnRzIGZyZWVkICovCisJX191aW50NjRfdAkJZWZkX2VmaV9pZDsJLyogaWQgb2YgY29ycmVzcG9uZGluZyBlZmkgKi8KKwl4ZnNfZXh0ZW50X3QJCWVmZF9leHRlbnRzWzFdOwkvKiBhcnJheSBvZiBleHRlbnRzIGZyZWVkICovCit9IHhmc19lZmRfbG9nX2Zvcm1hdF90OworCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qCisgKiBNYXggbnVtYmVyIG9mIGV4dGVudHMgaW4gZmFzdCBhbGxvY2F0aW9uIHBhdGguCisgKi8KKyNkZWZpbmUJWEZTX0VGSV9NQVhfRkFTVF9FWFRFTlRTCTE2CisKKy8qCisgKiBEZWZpbmUgRUZJIGZsYWdzLgorICovCisjZGVmaW5lCVhGU19FRklfUkVDT1ZFUkVECTB4MQorI2RlZmluZQlYRlNfRUZJX0NPTU1JVFRFRAkweDIKKyNkZWZpbmUJWEZTX0VGSV9DQU5DRUxFRAkweDQKKworLyoKKyAqIFRoaXMgaXMgdGhlICJleHRlbnQgZnJlZSBpbnRlbnRpb24iIGxvZyBpdGVtLiAgSXQgaXMgdXNlZAorICogdG8gbG9nIHRoZSBmYWN0IHRoYXQgc29tZSBleHRlbnRzIG5lZWQgdG8gYmUgZnJlZS4gIEl0IGlzCisgKiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlICJleHRlbnQgZnJlZSBkb25lIiBsb2cgaXRlbQorICogZGVzY3JpYmVkIGJlbG93LgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZWZpX2xvZ19pdGVtIHsKKwl4ZnNfbG9nX2l0ZW1fdAkJZWZpX2l0ZW07CisJdWludAkJCWVmaV9mbGFnczsJLyogbWlzYyBmbGFncyAqLworCXVpbnQJCQllZmlfbmV4dF9leHRlbnQ7CisJeGZzX2VmaV9sb2dfZm9ybWF0X3QJZWZpX2Zvcm1hdDsKK30geGZzX2VmaV9sb2dfaXRlbV90OworCisvKgorICogVGhpcyBpcyB0aGUgImV4dGVudCBmcmVlIGRvbmUiIGxvZyBpdGVtLiAgSXQgaXMgdXNlZCB0byBsb2cKKyAqIHRoZSBmYWN0IHRoYXQgc29tZSBleHRlbnRzIGVhcmxpZXIgbWVudGlvbmVkIGluIGFuIGVmaSBpdGVtCisgKiBoYXZlIGJlZW4gZnJlZWQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19lZmRfbG9nX2l0ZW0geworCXhmc19sb2dfaXRlbV90CQllZmRfaXRlbTsKKwl4ZnNfZWZpX2xvZ19pdGVtX3QJKmVmZF9lZmlwOworCXVpbnQJCQllZmRfbmV4dF9leHRlbnQ7CisJeGZzX2VmZF9sb2dfZm9ybWF0X3QJZWZkX2Zvcm1hdDsKK30geGZzX2VmZF9sb2dfaXRlbV90OworCisvKgorICogTWF4IG51bWJlciBvZiBleHRlbnRzIGluIGZhc3QgYWxsb2NhdGlvbiBwYXRoLgorICovCisjZGVmaW5lCVhGU19FRkRfTUFYX0ZBU1RfRVhURU5UUwkxNgorCitleHRlcm4gc3RydWN0IGttZW1fem9uZQkqeGZzX2VmaV96b25lOworZXh0ZXJuIHN0cnVjdCBrbWVtX3pvbmUJKnhmc19lZmRfem9uZTsKKworeGZzX2VmaV9sb2dfaXRlbV90CSp4ZnNfZWZpX2luaXQoc3RydWN0IHhmc19tb3VudCAqLCB1aW50KTsKK3hmc19lZmRfbG9nX2l0ZW1fdAkqeGZzX2VmZF9pbml0KHN0cnVjdCB4ZnNfbW91bnQgKiwgeGZzX2VmaV9sb2dfaXRlbV90ICosCisJCQkJICAgICAgdWludCk7CisKKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZgkvKiBfX1hGU19FWFRGUkVFX0lURU1fSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2ZzLmggYi9mcy94ZnMveGZzX2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVlODQ0MwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfZnMuaApAQCAtMCwwICsxLDUyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMTk5NS0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIuMSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4JIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LAorICogVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19GU19IX18KKyNkZWZpbmUgX19YRlNfRlNfSF9fCisKKy8qCisgKiBTR0kncyBYRlMgZmlsZXN5c3RlbSdzIG1ham9yIHN0dWZmIChjb25zdGFudHMsIHN0cnVjdHVyZXMpCisgKi8KKworI2RlZmluZSBYRlNfTkFNRQkieGZzIgorCisvKgorICogRGlyZWN0IEkvTyBhdHRyaWJ1dGUgcmVjb3JkIHVzZWQgd2l0aCBYRlNfSU9DX0RJT0lORk8KKyAqIGRfbWluaW9zeiBpcyB0aGUgbWluIHhmZXIgc2l6ZSwgeGZlciBzaXplIG11bHRpcGxlIGFuZCBmaWxlIHNlZWsgb2Zmc2V0CisgKiBhbGlnbm1lbnQuCisgKi8KKyNpZm5kZWYgSEFWRV9ESU9BVFRSCitzdHJ1Y3QgZGlvYXR0ciB7CisJX191MzIJCWRfbWVtOwkJLyogZGF0YSBidWZmZXIgbWVtb3J5IGFsaWdubWVudCAqLworCV9fdTMyCQlkX21pbmlvc3o7CS8qIG1pbiB4ZmVyIHNpemUJCSovCisJX191MzIJCWRfbWF4aW9zejsJLyogbWF4IHhmZXIgc2l6ZQkJKi8KK307CisjZW5kaWYKKworLyoKKyAqIFN0cnVjdHVyZSBmb3IgWEZTX0lPQ19GU0dFVFhBVFRSW0FdIGFuZCBYRlNfSU9DX0ZTU0VUWEFUVFIuCisgKi8KKyNpZm5kZWYgSEFWRV9GU1hBVFRSCitzdHJ1Y3QgZnN4YXR0ciB7CisJX191MzIJCWZzeF94ZmxhZ3M7CS8qIHhmbGFncyBmaWVsZCB2YWx1ZSAoZ2V0L3NldCkgKi8KKwlfX3UzMgkJZnN4X2V4dHNpemU7CS8qIGV4dHNpemUgZmllbGQgdmFsdWUgKGdldC9zZXQpKi8KKwlfX3UzMgkJZnN4X25leHRlbnRzOwkvKiBuZXh0ZW50cyBmaWVsZCB2YWx1ZSAoZ2V0KQkqLworCXVuc2lnbmVkIGNoYXIJZnN4X3BhZFsxNl07Cit9OworI2VuZGlmCisKKy8qCisgKiBGbGFncyBmb3IgdGhlIGJzX3hmbGFncy9mc3hfeGZsYWdzIGZpZWxkCisgKiBUaGVyZSBzaG91bGQgYmUgYSBvbmUtdG8tb25lIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gdGhlc2UgZmxhZ3MgYW5kIHRoZQorICogWEZTX0RJRkxBR19zLgorICovCisjZGVmaW5lIFhGU19YRkxBR19SRUFMVElNRQkweDAwMDAwMDAxCS8qIGRhdGEgaW4gcmVhbHRpbWUgdm9sdW1lICovCisjZGVmaW5lIFhGU19YRkxBR19QUkVBTExPQwkweDAwMDAwMDAyCS8qIHByZWFsbG9jYXRlZCBmaWxlIGV4dGVudHMgKi8KKyNkZWZpbmUgWEZTX1hGTEFHX0lNTVVUQUJMRQkweDAwMDAwMDA4CS8qIGZpbGUgY2Fubm90IGJlIG1vZGlmaWVkICovCisjZGVmaW5lIFhGU19YRkxBR19BUFBFTkQJMHgwMDAwMDAxMAkvKiBhbGwgd3JpdGVzIGFwcGVuZCAqLworI2RlZmluZSBYRlNfWEZMQUdfU1lOQwkJMHgwMDAwMDAyMAkvKiBhbGwgd3JpdGVzIHN5bmNocm9ub3VzICovCisjZGVmaW5lIFhGU19YRkxBR19OT0FUSU1FCTB4MDAwMDAwNDAJLyogZG8gbm90IHVwZGF0ZSBhY2Nlc3MgdGltZSAqLworI2RlZmluZSBYRlNfWEZMQUdfTk9EVU1QCTB4MDAwMDAwODAJLyogZG8gbm90IGluY2x1ZGUgaW4gYmFja3VwcyAqLworI2RlZmluZSBYRlNfWEZMQUdfUlRJTkhFUklUCTB4MDAwMDAxMDAJLyogY3JlYXRlIHdpdGggcnQgYml0IHNldCAqLworI2RlZmluZSBYRlNfWEZMQUdfUFJPSklOSEVSSVQJMHgwMDAwMDIwMAkvKiBjcmVhdGUgd2l0aCBwYXJlbnRzIHByb2ppZCAqLworI2RlZmluZSBYRlNfWEZMQUdfTk9TWU1MSU5LUwkweDAwMDAwNDAwCS8qIGRpc2FsbG93IHN5bWxpbmsgY3JlYXRpb24gKi8KKyNkZWZpbmUgWEZTX1hGTEFHX0hBU0FUVFIJMHg4MDAwMDAwMAkvKiBubyBESUZMQUcgZm9yIHRoaXMJKi8KKworLyoKKyAqIFN0cnVjdHVyZSBmb3IgWEZTX0lPQ19HRVRCTUFQLgorICogT24gaW5wdXQsIGZpbGwgaW4gYm12X29mZnNldCBhbmQgYm12X2xlbmd0aCBvZiB0aGUgZmlyc3Qgc3RydWN0dXJlCisgKiB0byBpbmRpY2F0ZSB0aGUgYXJlYSBvZiBpbnRlcmVzdCBpbiB0aGUgZmlsZSwgYW5kIGJtdl9lbnRyeSB3aXRoIHRoZQorICogbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzIGdpdmVuLiAgVGhlIGZpcnN0IHN0cnVjdHVyZSBpcyB1cGRhdGVkIG9uCisgKiByZXR1cm4gdG8gZ2l2ZSB0aGUgb2Zmc2V0IGFuZCBsZW5ndGggZm9yIHRoZSBuZXh0IGNhbGwuCisgKi8KKyNpZm5kZWYgSEFWRV9HRVRCTUFQCitzdHJ1Y3QgZ2V0Ym1hcCB7CisJX19zNjQJCWJtdl9vZmZzZXQ7CS8qIGZpbGUgb2Zmc2V0IG9mIHNlZ21lbnQgaW4gYmxvY2tzICovCisJX19zNjQJCWJtdl9ibG9jazsJLyogc3RhcnRpbmcgYmxvY2sgKDY0LWJpdCBkYWRkcl90KSAgKi8KKwlfX3M2NAkJYm12X2xlbmd0aDsJLyogbGVuZ3RoIG9mIHNlZ21lbnQsIGJsb2NrcwkgICAgKi8KKwlfX3MzMgkJYm12X2NvdW50OwkvKiAjIG9mIGVudHJpZXMgaW4gYXJyYXkgaW5jbC4gMXN0ICAqLworCV9fczMyCQlibXZfZW50cmllczsJLyogIyBvZiBlbnRyaWVzIGZpbGxlZCBpbiAob3V0cHV0KSAgKi8KK307CisjZW5kaWYKKworLyoKKyAqCVN0cnVjdHVyZSBmb3IgWEZTX0lPQ19HRVRCTUFQWC4JIEZpZWxkcyBibXZfb2Zmc2V0IHRocm91Z2ggYm12X2VudHJpZXMKKyAqCWFyZSB1c2VkIGV4YWN0bHkgYXMgaW4gdGhlIGdldGJtYXAgc3RydWN0dXJlLiAgVGhlIGdldGJtYXB4IHN0cnVjdHVyZQorICoJaGFzIGFkZGl0aW9uYWwgYm12X2lmbGFncyBhbmQgYm12X29mbGFncyBmaWVsZHMuIFRoZSBibXZfaWZsYWdzIGZpZWxkCisgKglpcyBvbmx5IHVzZWQgZm9yIHRoZSBmaXJzdCBzdHJ1Y3R1cmUuICBJdCBjb250YWlucyBpbnB1dCBmbGFncworICoJc3BlY2lmeWluZyBYRlNfSU9DX0dFVEJNQVBYIGFjdGlvbnMuICBUaGUgYm12X29mbGFncyBmaWVsZCBpcyBmaWxsZWQKKyAqCWluIGJ5IHRoZSBYRlNfSU9DX0dFVEJNQVBYIGNvbW1hbmQgZm9yIGVhY2ggcmV0dXJuZWQgc3RydWN0dXJlIGFmdGVyCisgKgl0aGUgZmlyc3QuCisgKi8KKyNpZm5kZWYgSEFWRV9HRVRCTUFQWAorc3RydWN0IGdldGJtYXB4IHsKKwlfX3M2NAkJYm12X29mZnNldDsJLyogZmlsZSBvZmZzZXQgb2Ygc2VnbWVudCBpbiBibG9ja3MgKi8KKwlfX3M2NAkJYm12X2Jsb2NrOwkvKiBzdGFydGluZyBibG9jayAoNjQtYml0IGRhZGRyX3QpICAqLworCV9fczY0CQlibXZfbGVuZ3RoOwkvKiBsZW5ndGggb2Ygc2VnbWVudCwgYmxvY2tzCSAgICAqLworCV9fczMyCQlibXZfY291bnQ7CS8qICMgb2YgZW50cmllcyBpbiBhcnJheSBpbmNsLiAxc3QgICovCisJX19zMzIJCWJtdl9lbnRyaWVzOwkvKiAjIG9mIGVudHJpZXMgZmlsbGVkIGluIChvdXRwdXQpLiAqLworCV9fczMyCQlibXZfaWZsYWdzOwkvKiBpbnB1dCBmbGFncyAoMXN0IHN0cnVjdHVyZSkJICAgICovCisJX19zMzIJCWJtdl9vZmxhZ3M7CS8qIG91dHB1dCBmbGFncyAoYWZ0ZXIgMXN0IHN0cnVjdHVyZSkqLworCV9fczMyCQlibXZfdW51c2VkMTsJLyogZnV0dXJlIHVzZQkJCSAgICAqLworCV9fczMyCQlibXZfdW51c2VkMjsJLyogZnV0dXJlIHVzZQkJCSAgICAqLworfTsKKyNlbmRpZgorCisvKglibXZfaWZsYWdzIHZhbHVlcyAtIHNldCBieSBYRlNfSU9DX0dFVEJNQVBYIGNhbGxlci4JKi8KKyNkZWZpbmUgQk1WX0lGX0FUVFJGT1JLCQkweDEJLyogcmV0dXJuIGF0dHIgZm9yayByYXRoZXIgdGhhbiBkYXRhICovCisjZGVmaW5lIEJNVl9JRl9OT19ETUFQSV9SRUFECTB4MgkvKiBEbyBub3QgZ2VuZXJhdGUgRE1BUEkgcmVhZCBldmVudCAgKi8KKyNkZWZpbmUgQk1WX0lGX1BSRUFMTE9DCQkweDQJLyogcnRuIHN0YXR1cyBCTVZfT0ZfUFJFQUxMT0MgaWYgcmVxICovCisjZGVmaW5lIEJNVl9JRl9WQUxJRAkoQk1WX0lGX0FUVFJGT1JLfEJNVl9JRl9OT19ETUFQSV9SRUFEfEJNVl9JRl9QUkVBTExPQykKKyNpZmRlZiBfX0tFUk5FTF9fCisjZGVmaW5lIEJNVl9JRl9FWFRFTkRFRCAweDQwMDAwMDAwCS8qIGdldHBtYXB4IGlmIHNldCAqLworI2VuZGlmCisKKy8qCWJtdl9vZmxhZ3MgdmFsdWVzIC0gcmV0dXJuZWQgZm9yIGZvciBlYWNoIG5vbi1oZWFkZXIgc2VnbWVudCAqLworI2RlZmluZSBCTVZfT0ZfUFJFQUxMT0MJCTB4MQkvKiBzZWdtZW50ID0gdW53cml0dGVuIHByZS1hbGxvY2F0aW9uICovCisKKy8qCUNvbnZlcnQgZ2V0Ym1hcCA8LT4gZ2V0Ym1hcHggLSBtb3ZlIGZpZWxkcyBmcm9tIHAxIHRvIHAyLiAqLworI2RlZmluZSBHRVRCTUFQX0NPTlZFUlQocDEscDIpIHsJXAorCXAyLmJtdl9vZmZzZXQgPSBwMS5ibXZfb2Zmc2V0OwlcCisJcDIuYm12X2Jsb2NrID0gcDEuYm12X2Jsb2NrOwlcCisJcDIuYm12X2xlbmd0aCA9IHAxLmJtdl9sZW5ndGg7CVwKKwlwMi5ibXZfY291bnQgPSBwMS5ibXZfY291bnQ7CVwKKwlwMi5ibXZfZW50cmllcyA9IHAxLmJtdl9lbnRyaWVzOyAgfQorCisKKy8qCisgKiBTdHJ1Y3R1cmUgZm9yIFhGU19JT0NfRlNTRVRETS4KKyAqIEZvciB1c2UgYnkgYmFja3VwIGFuZCByZXN0b3JlIHByb2dyYW1zIHRvIHNldCB0aGUgWEZTIG9uLWRpc2sgaW5vZGUKKyAqIGZpZWxkcyBkaV9kbWV2bWFzayBhbmQgZGlfZG1zdGF0ZS4gIFRoZXNlIG11c3QgYmUgc2V0IHRvIGV4YWN0bHkgYW5kCisgKiBvbmx5IHZhbHVlcyBwcmV2aW91c2x5IG9idGFpbmVkIHZpYSB4ZnNfYnVsa3N0YXQhICAoU3BlY2lmaWNhbGx5IHRoZQorICogeGZzX2JzdGF0X3QgZmllbGRzIGJzX2RtZXZtYXNrIGFuZCBic19kbXN0YXRlLikKKyAqLworI2lmbmRlZiBIQVZFX0ZTRE1JREFUQQorc3RydWN0IGZzZG1pZGF0YSB7CisJX191MzIJCWZzZF9kbWV2bWFzazsJLyogY29ycmVzcG9uZHMgdG8gZGlfZG1ldm1hc2sgKi8KKwlfX3UxNgkJZnNkX3BhZGRpbmc7CisJX191MTYJCWZzZF9kbXN0YXRlOwkvKiBjb3JyZXNwb25kcyB0byBkaV9kbXN0YXRlICAqLworfTsKKyNlbmRpZgorCisvKgorICogRmlsZSBzZWdtZW50IGxvY2tpbmcgc2V0IGRhdGEgdHlwZSBmb3IgNjQgYml0IGFjY2Vzcy4KKyAqIEFsc28gdXNlZCBmb3IgYWxsIHRoZSBSRVNWL0ZSRUUgaW50ZXJmYWNlcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2Zsb2NrNjQgeworCV9fczE2CQlsX3R5cGU7CisJX19zMTYJCWxfd2hlbmNlOworCV9fczY0CQlsX3N0YXJ0OworCV9fczY0CQlsX2xlbjsJCS8qIGxlbiA9PSAwIG1lYW5zIHVudGlsIGVuZCBvZiBmaWxlICovCisJX19zMzIJCWxfc3lzaWQ7CisJX191MzIJCWxfcGlkOworCV9fczMyCQlsX3BhZFs0XTsJLyogcmVzZXJ2ZSBhcmVhCQkJICAgICovCit9IHhmc19mbG9jazY0X3Q7CisKKy8qCisgKiBPdXRwdXQgZm9yIFhGU19JT0NfRlNHRU9NRVRSWV9WMQorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZnNvcF9nZW9tX3YxIHsKKwlfX3UzMgkJYmxvY2tzaXplOwkvKiBmaWxlc3lzdGVtIChkYXRhKSBibG9jayBzaXplICovCisJX191MzIJCXJ0ZXh0c2l6ZTsJLyogcmVhbHRpbWUgZXh0ZW50IHNpemUJCSovCisJX191MzIJCWFnYmxvY2tzOwkvKiBmc2Jsb2NrcyBpbiBhbiBBRwkJKi8KKwlfX3UzMgkJYWdjb3VudDsJLyogbnVtYmVyIG9mIGFsbG9jYXRpb24gZ3JvdXBzCSovCisJX191MzIJCWxvZ2Jsb2NrczsJLyogZnNibG9ja3MgaW4gdGhlIGxvZwkJKi8KKwlfX3UzMgkJc2VjdHNpemU7CS8qIChkYXRhKSBzZWN0b3Igc2l6ZSwgYnl0ZXMJKi8KKwlfX3UzMgkJaW5vZGVzaXplOwkvKiBpbm9kZSBzaXplIGluIGJ5dGVzCQkqLworCV9fdTMyCQlpbWF4cGN0OwkvKiBtYXggYWxsb3dlZCBpbm9kZSBzcGFjZSglKQkqLworCV9fdTY0CQlkYXRhYmxvY2tzOwkvKiBmc2Jsb2NrcyBpbiBkYXRhIHN1YnZvbHVtZQkqLworCV9fdTY0CQlydGJsb2NrczsJLyogZnNibG9ja3MgaW4gcmVhbHRpbWUgc3Vidm9sCSovCisJX191NjQJCXJ0ZXh0ZW50czsJLyogcnQgZXh0ZW50cyBpbiByZWFsdGltZSBzdWJ2b2wqLworCV9fdTY0CQlsb2dzdGFydDsJLyogc3RhcnRpbmcgZnNibG9jayBvZiB0aGUgbG9nCSovCisJdW5zaWduZWQgY2hhcgl1dWlkWzE2XTsJLyogdW5pcXVlIGlkIG9mIHRoZSBmaWxlc3lzdGVtCSovCisJX191MzIJCXN1bml0OwkJLyogc3RyaXBlIHVuaXQsIGZzYmxvY2tzCSovCisJX191MzIJCXN3aWR0aDsJCS8qIHN0cmlwZSB3aWR0aCwgZnNibG9ja3MJKi8KKwlfX3MzMgkJdmVyc2lvbjsJLyogc3RydWN0dXJlIHZlcnNpb24JCSovCisJX191MzIJCWZsYWdzOwkJLyogc3VwZXJibG9jayB2ZXJzaW9uIGZsYWdzCSovCisJX191MzIJCWxvZ3NlY3RzaXplOwkvKiBsb2cgc2VjdG9yIHNpemUsIGJ5dGVzCSovCisJX191MzIJCXJ0c2VjdHNpemU7CS8qIHJlYWx0aW1lIHNlY3RvciBzaXplLCBieXRlcwkqLworCV9fdTMyCQlkaXJibG9ja3NpemU7CS8qIGRpcmVjdG9yeSBibG9jayBzaXplLCBieXRlcwkqLworfSB4ZnNfZnNvcF9nZW9tX3YxX3Q7CisKKy8qCisgKiBPdXRwdXQgZm9yIFhGU19JT0NfRlNHRU9NRVRSWQorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfZnNvcF9nZW9tIHsKKwlfX3UzMgkJYmxvY2tzaXplOwkvKiBmaWxlc3lzdGVtIChkYXRhKSBibG9jayBzaXplICovCisJX191MzIJCXJ0ZXh0c2l6ZTsJLyogcmVhbHRpbWUgZXh0ZW50IHNpemUJCSovCisJX191MzIJCWFnYmxvY2tzOwkvKiBmc2Jsb2NrcyBpbiBhbiBBRwkJKi8KKwlfX3UzMgkJYWdjb3VudDsJLyogbnVtYmVyIG9mIGFsbG9jYXRpb24gZ3JvdXBzCSovCisJX191MzIJCWxvZ2Jsb2NrczsJLyogZnNibG9ja3MgaW4gdGhlIGxvZwkJKi8KKwlfX3UzMgkJc2VjdHNpemU7CS8qIChkYXRhKSBzZWN0b3Igc2l6ZSwgYnl0ZXMJKi8KKwlfX3UzMgkJaW5vZGVzaXplOwkvKiBpbm9kZSBzaXplIGluIGJ5dGVzCQkqLworCV9fdTMyCQlpbWF4cGN0OwkvKiBtYXggYWxsb3dlZCBpbm9kZSBzcGFjZSglKQkqLworCV9fdTY0CQlkYXRhYmxvY2tzOwkvKiBmc2Jsb2NrcyBpbiBkYXRhIHN1YnZvbHVtZQkqLworCV9fdTY0CQlydGJsb2NrczsJLyogZnNibG9ja3MgaW4gcmVhbHRpbWUgc3Vidm9sCSovCisJX191NjQJCXJ0ZXh0ZW50czsJLyogcnQgZXh0ZW50cyBpbiByZWFsdGltZSBzdWJ2b2wqLworCV9fdTY0CQlsb2dzdGFydDsJLyogc3RhcnRpbmcgZnNibG9jayBvZiB0aGUgbG9nCSovCisJdW5zaWduZWQgY2hhcgl1dWlkWzE2XTsJLyogdW5pcXVlIGlkIG9mIHRoZSBmaWxlc3lzdGVtCSovCisJX191MzIJCXN1bml0OwkJLyogc3RyaXBlIHVuaXQsIGZzYmxvY2tzCSovCisJX191MzIJCXN3aWR0aDsJCS8qIHN0cmlwZSB3aWR0aCwgZnNibG9ja3MJKi8KKwlfX3MzMgkJdmVyc2lvbjsJLyogc3RydWN0dXJlIHZlcnNpb24JCSovCisJX191MzIJCWZsYWdzOwkJLyogc3VwZXJibG9jayB2ZXJzaW9uIGZsYWdzCSovCisJX191MzIJCWxvZ3NlY3RzaXplOwkvKiBsb2cgc2VjdG9yIHNpemUsIGJ5dGVzCSovCisJX191MzIJCXJ0c2VjdHNpemU7CS8qIHJlYWx0aW1lIHNlY3RvciBzaXplLCBieXRlcwkqLworCV9fdTMyCQlkaXJibG9ja3NpemU7CS8qIGRpcmVjdG9yeSBibG9jayBzaXplLCBieXRlcwkqLworCV9fdTMyCQlsb2dzdW5pdDsJLyogbG9nIHN0cmlwZSB1bml0LCBieXRlcyAqLworfSB4ZnNfZnNvcF9nZW9tX3Q7CisKKy8qIE91dHB1dCBmb3IgWEZTX0ZTX0NPVU5UUyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2Zzb3BfY291bnRzIHsKKwlfX3U2NAlmcmVlZGF0YTsJLyogZnJlZSBkYXRhIHNlY3Rpb24gYmxvY2tzICovCisJX191NjQJZnJlZXJ0eDsJLyogZnJlZSBydCBleHRlbnRzICovCisJX191NjQJZnJlZWlubzsJLyogZnJlZSBpbm9kZXMgKi8KKwlfX3U2NAlhbGxvY2lubzsJLyogdG90YWwgYWxsb2NhdGVkIGlub2RlcyAqLworfSB4ZnNfZnNvcF9jb3VudHNfdDsKKworLyogSW5wdXQvT3V0cHV0IGZvciBYRlNfR0VUX1JFU0JMS1MgYW5kIFhGU19TRVRfUkVTQkxLUyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2Zzb3BfcmVzYmxrcyB7CisJX191NjQgIHJlc2Jsa3M7CisJX191NjQgIHJlc2Jsa3NfYXZhaWw7Cit9IHhmc19mc29wX3Jlc2Jsa3NfdDsKKworI2RlZmluZSBYRlNfRlNPUF9HRU9NX1ZFUlNJT04JMAorCisjZGVmaW5lIFhGU19GU09QX0dFT01fRkxBR1NfQVRUUgkweDAwMDEJLyogYXR0cmlidXRlcyBpbiB1c2UJKi8KKyNkZWZpbmUgWEZTX0ZTT1BfR0VPTV9GTEFHU19OTElOSwkweDAwMDIJLyogMzItYml0IG5saW5rIHZhbHVlcwkqLworI2RlZmluZSBYRlNfRlNPUF9HRU9NX0ZMQUdTX1FVT1RBCTB4MDAwNAkvKiBxdW90YXMgZW5hYmxlZAkqLworI2RlZmluZSBYRlNfRlNPUF9HRU9NX0ZMQUdTX0lBTElHTgkweDAwMDgJLyogaW5vZGUgYWxpZ25tZW50CSovCisjZGVmaW5lIFhGU19GU09QX0dFT01fRkxBR1NfREFMSUdOCTB4MDAxMAkvKiBsYXJnZSBkYXRhIGFsaWdubWVudCAqLworI2RlZmluZSBYRlNfRlNPUF9HRU9NX0ZMQUdTX1NIQVJFRAkweDAwMjAJLyogcmVhZC1vbmx5IHNoYXJlZAkqLworI2RlZmluZSBYRlNfRlNPUF9HRU9NX0ZMQUdTX0VYVEZMRwkweDAwNDAJLyogc3BlY2lhbCBleHRlbnQgZmxhZwkqLworI2RlZmluZSBYRlNfRlNPUF9HRU9NX0ZMQUdTX0RJUlYyCTB4MDA4MAkvKiBkaXJlY3RvcnkgdmVyc2lvbiAyCSovCisjZGVmaW5lIFhGU19GU09QX0dFT01fRkxBR1NfTE9HVjIJMHgwMTAwCS8qIGxvZyBmb3JtYXQgdmVyc2lvbiAyCSovCisjZGVmaW5lIFhGU19GU09QX0dFT01fRkxBR1NfU0VDVE9SCTB4MDIwMAkvKiBzZWN0b3Igc2l6ZXMgPjFCQgkqLworCisKKy8qCisgKiBNaW5pbXVtIGFuZCBtYXhpbXVtIHNpemVzIG5lZWQgZm9yIGdyb3d0aCBjaGVja3MKKyAqLworI2RlZmluZSBYRlNfTUlOX0FHX0JMT0NLUwk2NAorI2RlZmluZSBYRlNfTUlOX0xPR19CTE9DS1MJNTEyCisjZGVmaW5lIFhGU19NQVhfTE9HX0JMT0NLUwkoNjQgKiAxMDI0KQorI2RlZmluZSBYRlNfTUlOX0xPR19CWVRFUwkoMjU2ICogMTAyNCkKKyNkZWZpbmUgWEZTX01BWF9MT0dfQllURVMJKDEyOCAqIDEwMjQgKiAxMDI0KQorCisvKgorICogU3RydWN0dXJlcyBmb3IgWEZTX0lPQ19GU0dST1dGU0RBVEEsIFhGU19JT0NfRlNHUk9XRlNMT0cgJiBYRlNfSU9DX0ZTR1JPV0ZTUlQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2dyb3dmc19kYXRhIHsKKwlfX3U2NAkJbmV3YmxvY2tzOwkvKiBuZXcgZGF0YSBzdWJ2b2wgc2l6ZSwgZnNibG9ja3MgKi8KKwlfX3UzMgkJaW1heHBjdDsJLyogbmV3IGlub2RlIHNwYWNlIHBlcmNlbnRhZ2UgbGltaXQgKi8KK30geGZzX2dyb3dmc19kYXRhX3Q7CisKK3R5cGVkZWYgc3RydWN0IHhmc19ncm93ZnNfbG9nIHsKKwlfX3UzMgkJbmV3YmxvY2tzOwkvKiBuZXcgbG9nIHNpemUsIGZzYmxvY2tzICovCisJX191MzIJCWlzaW50OwkJLyogMSBpZiBuZXcgbG9nIGlzIGludGVybmFsICovCit9IHhmc19ncm93ZnNfbG9nX3Q7CisKK3R5cGVkZWYgc3RydWN0IHhmc19ncm93ZnNfcnQgeworCV9fdTY0CQluZXdibG9ja3M7CS8qIG5ldyByZWFsdGltZSBzaXplLCBmc2Jsb2NrcyAqLworCV9fdTMyCQlleHRzaXplOwkvKiBuZXcgcmVhbHRpbWUgZXh0ZW50IHNpemUsIGZzYmxvY2tzICovCit9IHhmc19ncm93ZnNfcnRfdDsKKworCisvKgorICogU3RydWN0dXJlcyByZXR1cm5lZCBmcm9tIGlvY3RsIFhGU19JT0NfRlNCVUxLU1RBVCAmIFhGU19JT0NfRlNCVUxLU1RBVF9TSU5HTEUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2JzdGltZSB7CisJdGltZV90CQl0dl9zZWM7CQkvKiBzZWNvbmRzCQkqLworCV9fczMyCQl0dl9uc2VjOwkvKiBhbmQgbmFub3NlY29uZHMJKi8KK30geGZzX2JzdGltZV90OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfYnN0YXQgeworCV9fdTY0CQlic19pbm87CQkvKiBpbm9kZSBudW1iZXIJCQkqLworCV9fdTE2CQlic19tb2RlOwkvKiB0eXBlIGFuZCBtb2RlCQkqLworCV9fdTE2CQlic19ubGluazsJLyogbnVtYmVyIG9mIGxpbmtzCQkqLworCV9fdTMyCQlic191aWQ7CQkvKiB1c2VyIGlkCQkJKi8KKwlfX3UzMgkJYnNfZ2lkOwkJLyogZ3JvdXAgaWQJCQkqLworCV9fdTMyCQlic19yZGV2OwkvKiBkZXZpY2UgdmFsdWUJCQkqLworCV9fczMyCQlic19ibGtzaXplOwkvKiBibG9jayBzaXplCQkJKi8KKwlfX3M2NAkJYnNfc2l6ZTsJLyogZmlsZSBzaXplCQkJKi8KKwl4ZnNfYnN0aW1lX3QJYnNfYXRpbWU7CS8qIGFjY2VzcyB0aW1lCQkJKi8KKwl4ZnNfYnN0aW1lX3QJYnNfbXRpbWU7CS8qIG1vZGlmeSB0aW1lCQkJKi8KKwl4ZnNfYnN0aW1lX3QJYnNfY3RpbWU7CS8qIGlub2RlIGNoYW5nZSB0aW1lCQkqLworCWludDY0X3QJCWJzX2Jsb2NrczsJLyogbnVtYmVyIG9mIGJsb2NrcwkJKi8KKwlfX3UzMgkJYnNfeGZsYWdzOwkvKiBleHRlbmRlZCBmbGFncwkJKi8KKwlfX3MzMgkJYnNfZXh0c2l6ZTsJLyogZXh0ZW50IHNpemUJCQkqLworCV9fczMyCQlic19leHRlbnRzOwkvKiBudW1iZXIgb2YgZXh0ZW50cwkJKi8KKwlfX3UzMgkJYnNfZ2VuOwkJLyogZ2VuZXJhdGlvbiBjb3VudAkJKi8KKwlfX3UxNgkJYnNfcHJvamlkOwkvKiBwcm9qZWN0IGlkCQkJKi8KKwl1bnNpZ25lZCBjaGFyCWJzX3BhZFsxNF07CS8qIHBhZCBzcGFjZSwgdW51c2VkCQkqLworCV9fdTMyCQlic19kbWV2bWFzazsJLyogRE1JRyBldmVudCBtYXNrCQkqLworCV9fdTE2CQlic19kbXN0YXRlOwkvKiBETUlHIHN0YXRlIGluZm8JCSovCisJX191MTYJCWJzX2FleHRlbnRzOwkvKiBhdHRyaWJ1dGUgbnVtYmVyIG9mIGV4dGVudHMJKi8KK30geGZzX2JzdGF0X3Q7CisKKy8qCisgKiBUaGUgdXNlci1sZXZlbCBCdWxrU3RhdCBSZXF1ZXN0IGludGVyZmFjZSBzdHJ1Y3R1cmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19mc29wX2J1bGtyZXEgeworCV9fdTY0CQlfX3VzZXIgKmxhc3RpcDsJLyogbGFzdCBpbm9kZSAjIHBvaW50ZXIJCSovCisJX19zMzIJCWljb3VudDsJCS8qIGNvdW50IG9mIGVudHJpZXMgaW4gYnVmZmVyCSovCisJdm9pZAkJX191c2VyICp1YnVmZmVyOy8qIHVzZXIgYnVmZmVyIGZvciBpbm9kZSBkZXNjLgkqLworCV9fczMyCQlfX3VzZXIgKm9jb3VudDsJLyogb3V0cHV0IGNvdW50IHBvaW50ZXIJCSovCit9IHhmc19mc29wX2J1bGtyZXFfdDsKKworCisvKgorICogU3RydWN0dXJlcyByZXR1cm5lZCBmcm9tIHhmc19pbnVtYmVycyByb3V0aW5lIChYRlNfSU9DX0ZTSU5VTUJFUlMpLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfaW5vZ3JwIHsKKwlfX3U2NAkJeGlfc3RhcnRpbm87CS8qIHN0YXJ0aW5nIGlub2RlIG51bWJlcgkqLworCV9fczMyCQl4aV9hbGxvY2NvdW50OwkvKiAjIGJpdHMgc2V0IGluIGFsbG9jbWFzawkqLworCV9fdTY0CQl4aV9hbGxvY21hc2s7CS8qIG1hc2sgb2YgYWxsb2NhdGVkIGlub2RlcwkqLworfSB4ZnNfaW5vZ3JwX3Q7CisKKworLyoKKyAqIEVycm9yIGluamVjdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2Vycm9yX2luamVjdGlvbiB7CisJX19zMzIJCWZkOworCV9fczMyCQllcnJ0YWc7Cit9IHhmc19lcnJvcl9pbmplY3Rpb25fdDsKKworCisvKgorICogVGhlIHVzZXItbGV2ZWwgSGFuZGxlIFJlcXVlc3QgaW50ZXJmYWNlIHN0cnVjdHVyZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2Zzb3BfaGFuZGxlcmVxIHsKKwlfX3UzMgkJZmQ7CQkvKiBmZCBmb3IgRkRfVE9fSEFORExFCQkqLworCXZvaWQJCV9fdXNlciAqcGF0aDsJLyogdXNlciBwYXRobmFtZQkJKi8KKwlfX3UzMgkJb2ZsYWdzOwkJLyogb3BlbiBmbGFncwkJCSovCisJdm9pZAkJX191c2VyICppaGFuZGxlOy8qIHVzZXIgc3VwcGxpZWQgaGFuZGxlCQkqLworCV9fdTMyCQlpaGFuZGxlbjsJLyogdXNlciBzdXBwbGllZCBsZW5ndGgJCSovCisJdm9pZAkJX191c2VyICpvaGFuZGxlOy8qIHVzZXIgYnVmZmVyIGZvciBoYW5kbGUJKi8KKwlfX3UzMgkJX191c2VyICpvaGFuZGxlbjsvKiB1c2VyIGJ1ZmZlciBsZW5ndGgJCSovCit9IHhmc19mc29wX2hhbmRsZXJlcV90OworCisvKgorICogQ29tcG91bmQgc3RydWN0dXJlcyBmb3IgcGFzc2luZyBhcmdzIHRocm91Z2ggSGFuZGxlIFJlcXVlc3QgaW50ZXJmYWNlcworICogeGZzX2Zzc2V0ZG1fYnlfaGFuZGxlLCB4ZnNfYXR0cmxpc3RfYnlfaGFuZGxlLCB4ZnNfYXR0cm11bHRpX2J5X2hhbmRsZQorICogLSBpb2N0bHM6IFhGU19JT0NfRlNTRVRETV9CWV9IQU5ETEUsIFhGU19JT0NfQVRUUkxJU1RfQllfSEFORExFLCBhbmQKKyAqCSAgICAgWEZTX0lPQ19BVFRSTVVMVElfQllfSEFORExFCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2Zzb3Bfc2V0ZG1faGFuZGxlcmVxIHsKKwlzdHJ1Y3QgeGZzX2Zzb3BfaGFuZGxlcmVxCWhyZXE7CS8qIGhhbmRsZSBpbmZvcm1hdGlvbgkqLworCXN0cnVjdCBmc2RtaWRhdGEJCV9fdXNlciAqZGF0YTsJLyogRE1BUEkgZGF0YQkqLworfSB4ZnNfZnNvcF9zZXRkbV9oYW5kbGVyZXFfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2F0dHJsaXN0X2N1cnNvciB7CisJX191MzIJCW9wYXF1ZVs0XTsKK30geGZzX2F0dHJsaXN0X2N1cnNvcl90OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfZnNvcF9hdHRybGlzdF9oYW5kbGVyZXEgeworCXN0cnVjdCB4ZnNfZnNvcF9oYW5kbGVyZXEJaHJlcTsgLyogaGFuZGxlIGludGVyZmFjZSBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgeGZzX2F0dHJsaXN0X2N1cnNvcglwb3M7IC8qIG9wYXF1ZSBjb29raWUsIGxpc3Qgb2Zmc2V0ICovCisJX191MzIJCQkJZmxhZ3M7CS8qIHdoaWNoIG5hbWVzcGFjZSB0byB1c2UgKi8KKwlfX3UzMgkJCQlidWZsZW47CS8qIGxlbmd0aCBvZiBidWZmZXIgc3VwcGxpZWQgKi8KKwl2b2lkCQkJCV9fdXNlciAqYnVmZmVyOwkvKiByZXR1cm5lZCBuYW1lcyAqLworfSB4ZnNfZnNvcF9hdHRybGlzdF9oYW5kbGVyZXFfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2F0dHJfbXVsdGlvcCB7CisJX191MzIJCWFtX29wY29kZTsKKwlfX3MzMgkJYW1fZXJyb3I7CisJdm9pZAkJX191c2VyICphbV9hdHRybmFtZTsKKwl2b2lkCQlfX3VzZXIgKmFtX2F0dHJ2YWx1ZTsKKwlfX3UzMgkJYW1fbGVuZ3RoOworCV9fdTMyCQlhbV9mbGFnczsKK30geGZzX2F0dHJfbXVsdGlvcF90OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfZnNvcF9hdHRybXVsdGlfaGFuZGxlcmVxIHsKKwlzdHJ1Y3QgeGZzX2Zzb3BfaGFuZGxlcmVxCWhyZXE7IC8qIGhhbmRsZSBpbnRlcmZhY2Ugc3RydWN0dXJlICovCisJX191MzIJCQkJb3Bjb3VudDsvKiBjb3VudCBvZiBmb2xsb3dpbmcgbXVsdGlvcCAqLworCXN0cnVjdCB4ZnNfYXR0cl9tdWx0aW9wCQlfX3VzZXIgKm9wczsgLyogYXR0cl9tdWx0aSBkYXRhICovCit9IHhmc19mc29wX2F0dHJtdWx0aV9oYW5kbGVyZXFfdDsKKworLyoKKyAqIHBlciBtYWNoaW5lIHVuaXF1ZSBmaWxlc3lzdGVtIGlkZW50aWZpZXIgdHlwZXMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHsgX191MzIgdmFsWzJdOyB9IHhmc19mc2lkX3Q7IC8qIGZpbGUgc3lzdGVtIGlkIHR5cGUgKi8KKworCisjaWZuZGVmIEhBVkVfRklECisjZGVmaW5lIE1BWEZJRFNaCTQ2CisKK3R5cGVkZWYgc3RydWN0IGZpZCB7CisJX191MTYJCWZpZF9sZW47CQkvKiBsZW5ndGggb2YgZGF0YSBpbiBieXRlcyAqLworCXVuc2lnbmVkIGNoYXIJZmlkX2RhdGFbTUFYRklEU1pdOwkvKiBkYXRhIChmaWRfbGVuIHdvcnRoKSAgKi8KK30gZmlkX3Q7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2ZpZCB7CisJX191MTYJeGZzX2ZpZF9sZW47CQkvKiBsZW5ndGggb2YgcmVtYWluZGVyCSovCisJX191MTYJeGZzX2ZpZF9wYWQ7CisJX191MzIJeGZzX2ZpZF9nZW47CQkvKiBnZW5lcmF0aW9uIG51bWJlcgkqLworCV9fdTY0CXhmc19maWRfaW5vOwkJLyogNjQgYml0cyBpbm9kZSBudW1iZXIgKi8KK30geGZzX2ZpZF90OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfZmlkMiB7CisJX191MTYJZmlkX2xlbjsJLyogbGVuZ3RoIG9mIHJlbWFpbmRlciAqLworCV9fdTE2CWZpZF9wYWQ7CS8qIHBhZGRpbmcsIG11c3QgYmUgemVybyAqLworCV9fdTMyCWZpZF9nZW47CS8qIGdlbmVyYXRpb24gbnVtYmVyICovCisJX191NjQJZmlkX2lubzsJLyogaW5vZGUgbnVtYmVyICovCit9IHhmc19maWQyX3Q7CisKK3R5cGVkZWYgc3RydWN0IHhmc19oYW5kbGUgeworCXVuaW9uIHsKKwkJX19zNjQJICAgIGFsaWduOwkvKiBmb3JjZSBhbGlnbm1lbnQgb2YgaGFfZmlkCSAqLworCQl4ZnNfZnNpZF90ICBfaGFfZnNpZDsJLyogdW5pcXVlIGZpbGUgc3lzdGVtIGlkZW50aWZpZXIgKi8KKwl9IGhhX3U7CisJeGZzX2ZpZF90CWhhX2ZpZDsJCS8qIGZpbGUgc3lzdGVtIHNwZWNpZmljIGZpbGUgSUQJICovCit9IHhmc19oYW5kbGVfdDsKKyNkZWZpbmUgaGFfZnNpZCBoYV91Ll9oYV9mc2lkCisKKyNkZWZpbmUgWEZTX0hTSVpFKGhhbmRsZSkJKCgoY2hhciAqKSAmKGhhbmRsZSkuaGFfZmlkLnhmc19maWRfcGFkCSBcCisJCQkJIC0gKGNoYXIgKikgJihoYW5kbGUpKQkJCSAgXAorCQkJCSArIChoYW5kbGUpLmhhX2ZpZC54ZnNfZmlkX2xlbikKKworI2RlZmluZSBYRlNfSEFORExFX0NNUChoMSwgaDIpCW1lbWNtcChoMSwgaDIsIHNpemVvZih4ZnNfaGFuZGxlX3QpKQorCisjZGVmaW5lIEZTSFNJWkUJCXNpemVvZihmc2lkX3QpCisKKy8qIAorICogRmxhZ3MgZm9yIGdvaW5nIGRvd24gb3BlcmF0aW9uCisgKi8KKyNkZWZpbmUgWEZTX0ZTT1BfR09JTkdfRkxBR1NfREVGQVVMVAkJMHgwCS8qIGdvaW5nIGRvd24gKi8KKyNkZWZpbmUgWEZTX0ZTT1BfR09JTkdfRkxBR1NfTE9HRkxVU0gJCTB4MQkvKiBmbHVzaCBsb2cgYnV0IG5vdCBkYXRhICovCisjZGVmaW5lIFhGU19GU09QX0dPSU5HX0ZMQUdTX05PTE9HRkxVU0gJCTB4MgkvKiBkb24ndCBmbHVzaCBsb2cgbm9yIGRhdGEgKi8KKworLyoKKyAqIGlvY3RsIGNvbW1hbmRzIHRoYXQgYXJlIHVzZWQgYnkgTGludXggZmlsZXN5c3RlbXMKKyAqLworI2RlZmluZSBYRlNfSU9DX0dFVFhGTEFHUwlfSU9SKCdmJywgMSwgbG9uZykKKyNkZWZpbmUgWEZTX0lPQ19TRVRYRkxBR1MJX0lPVygnZicsIDIsIGxvbmcpCisjZGVmaW5lIFhGU19JT0NfR0VUVkVSU0lPTglfSU9SKCd2JywgMSwgbG9uZykKKworLyoKKyAqIGlvY3RsIGNvbW1hbmRzIHRoYXQgcmVwbGFjZSBJUklYIGZjbnRsKCkncworICogRm9yICdkb2N1bWVudGF0aW9uJyBwdXJwb3NlZCBtb3JlIHRoYW4gYW55dGhpbmcgZWxzZSwKKyAqIHRoZSAiY21kICMiIGZpZWxkIHJlZmxlY3RzIHRoZSBJUklYIGZjbnRsIG51bWJlci4KKyAqLworI2RlZmluZSBYRlNfSU9DX0FMTE9DU1AJCV9JT1cgKCdYJywgMTAsIHN0cnVjdCB4ZnNfZmxvY2s2NCkKKyNkZWZpbmUgWEZTX0lPQ19GUkVFU1AJCV9JT1cgKCdYJywgMTEsIHN0cnVjdCB4ZnNfZmxvY2s2NCkKKyNkZWZpbmUgWEZTX0lPQ19ESU9JTkZPCQlfSU9SICgnWCcsIDMwLCBzdHJ1Y3QgZGlvYXR0cikKKyNkZWZpbmUgWEZTX0lPQ19GU0dFVFhBVFRSCV9JT1IgKCdYJywgMzEsIHN0cnVjdCBmc3hhdHRyKQorI2RlZmluZSBYRlNfSU9DX0ZTU0VUWEFUVFIJX0lPVyAoJ1gnLCAzMiwgc3RydWN0IGZzeGF0dHIpCisjZGVmaW5lIFhGU19JT0NfQUxMT0NTUDY0CV9JT1cgKCdYJywgMzYsIHN0cnVjdCB4ZnNfZmxvY2s2NCkKKyNkZWZpbmUgWEZTX0lPQ19GUkVFU1A2NAlfSU9XICgnWCcsIDM3LCBzdHJ1Y3QgeGZzX2Zsb2NrNjQpCisjZGVmaW5lIFhGU19JT0NfR0VUQk1BUAkJX0lPV1IoJ1gnLCAzOCwgc3RydWN0IGdldGJtYXApCisjZGVmaW5lIFhGU19JT0NfRlNTRVRETQkJX0lPVyAoJ1gnLCAzOSwgc3RydWN0IGZzZG1pZGF0YSkKKyNkZWZpbmUgWEZTX0lPQ19SRVNWU1AJCV9JT1cgKCdYJywgNDAsIHN0cnVjdCB4ZnNfZmxvY2s2NCkKKyNkZWZpbmUgWEZTX0lPQ19VTlJFU1ZTUAlfSU9XICgnWCcsIDQxLCBzdHJ1Y3QgeGZzX2Zsb2NrNjQpCisjZGVmaW5lIFhGU19JT0NfUkVTVlNQNjQJX0lPVyAoJ1gnLCA0Miwgc3RydWN0IHhmc19mbG9jazY0KQorI2RlZmluZSBYRlNfSU9DX1VOUkVTVlNQNjQJX0lPVyAoJ1gnLCA0Mywgc3RydWN0IHhmc19mbG9jazY0KQorI2RlZmluZSBYRlNfSU9DX0dFVEJNQVBBCV9JT1dSKCdYJywgNDQsIHN0cnVjdCBnZXRibWFwKQorI2RlZmluZSBYRlNfSU9DX0ZTR0VUWEFUVFJBCV9JT1IgKCdYJywgNDUsIHN0cnVjdCBmc3hhdHRyKQorLyoJWEZTX0lPQ19TRVRCSU9TSVpFIC0tLS0gZGVwcmVjYXRlZCA0NgkgICAqLworLyoJWEZTX0lPQ19HRVRCSU9TSVpFIC0tLS0gZGVwcmVjYXRlZCA0NwkgICAqLworI2RlZmluZSBYRlNfSU9DX0dFVEJNQVBYCV9JT1dSKCdYJywgNTYsIHN0cnVjdCBnZXRibWFwKQorCisvKgorICogaW9jdGwgY29tbWFuZHMgdGhhdCByZXBsYWNlIElSSVggc3lzc2dpKCkncworICovCisjZGVmaW5lIFhGU19JT0NfRlNHRU9NRVRSWV9WMQkgICAgIF9JT1IgKCdYJywgMTAwLCBzdHJ1Y3QgeGZzX2Zzb3BfZ2VvbV92MSkKKyNkZWZpbmUgWEZTX0lPQ19GU0JVTEtTVEFUCSAgICAgX0lPV1IoJ1gnLCAxMDEsIHN0cnVjdCB4ZnNfZnNvcF9idWxrcmVxKQorI2RlZmluZSBYRlNfSU9DX0ZTQlVMS1NUQVRfU0lOR0xFICAgIF9JT1dSKCdYJywgMTAyLCBzdHJ1Y3QgeGZzX2Zzb3BfYnVsa3JlcSkKKyNkZWZpbmUgWEZTX0lPQ19GU0lOVU1CRVJTCSAgICAgX0lPV1IoJ1gnLCAxMDMsIHN0cnVjdCB4ZnNfZnNvcF9idWxrcmVxKQorI2RlZmluZSBYRlNfSU9DX1BBVEhfVE9fRlNIQU5ETEUgICAgIF9JT1dSKCdYJywgMTA0LCBzdHJ1Y3QgeGZzX2Zzb3BfaGFuZGxlcmVxKQorI2RlZmluZSBYRlNfSU9DX1BBVEhfVE9fSEFORExFCSAgICAgX0lPV1IoJ1gnLCAxMDUsIHN0cnVjdCB4ZnNfZnNvcF9oYW5kbGVyZXEpCisjZGVmaW5lIFhGU19JT0NfRkRfVE9fSEFORExFCSAgICAgX0lPV1IoJ1gnLCAxMDYsIHN0cnVjdCB4ZnNfZnNvcF9oYW5kbGVyZXEpCisjZGVmaW5lIFhGU19JT0NfT1BFTl9CWV9IQU5ETEUJICAgICBfSU9XUignWCcsIDEwNywgc3RydWN0IHhmc19mc29wX2hhbmRsZXJlcSkKKyNkZWZpbmUgWEZTX0lPQ19SRUFETElOS19CWV9IQU5ETEUgICBfSU9XUignWCcsIDEwOCwgc3RydWN0IHhmc19mc29wX2hhbmRsZXJlcSkKKyNkZWZpbmUgWEZTX0lPQ19TV0FQRVhUCQkgICAgIF9JT1dSKCdYJywgMTA5LCBzdHJ1Y3QgeGZzX3N3YXBleHQpCisjZGVmaW5lIFhGU19JT0NfRlNHUk9XRlNEQVRBCSAgICAgX0lPVyAoJ1gnLCAxMTAsIHN0cnVjdCB4ZnNfZ3Jvd2ZzX2RhdGEpCisjZGVmaW5lIFhGU19JT0NfRlNHUk9XRlNMT0cJICAgICBfSU9XICgnWCcsIDExMSwgc3RydWN0IHhmc19ncm93ZnNfbG9nKQorI2RlZmluZSBYRlNfSU9DX0ZTR1JPV0ZTUlQJICAgICBfSU9XICgnWCcsIDExMiwgc3RydWN0IHhmc19ncm93ZnNfcnQpCisjZGVmaW5lIFhGU19JT0NfRlNDT1VOVFMJICAgICBfSU9SICgnWCcsIDExMywgc3RydWN0IHhmc19mc29wX2NvdW50cykKKyNkZWZpbmUgWEZTX0lPQ19TRVRfUkVTQkxLUwkgICAgIF9JT1dSKCdYJywgMTE0LCBzdHJ1Y3QgeGZzX2Zzb3BfcmVzYmxrcykKKyNkZWZpbmUgWEZTX0lPQ19HRVRfUkVTQkxLUwkgICAgIF9JT1IgKCdYJywgMTE1LCBzdHJ1Y3QgeGZzX2Zzb3BfcmVzYmxrcykKKyNkZWZpbmUgWEZTX0lPQ19FUlJPUl9JTkpFQ1RJT04JICAgICBfSU9XICgnWCcsIDExNiwgc3RydWN0IHhmc19lcnJvcl9pbmplY3Rpb24pCisjZGVmaW5lIFhGU19JT0NfRVJST1JfQ0xFQVJBTEwJICAgICBfSU9XICgnWCcsIDExNywgc3RydWN0IHhmc19lcnJvcl9pbmplY3Rpb24pCisvKglYRlNfSU9DX0FUVFJDVExfQllfSEFORExFIC0tIGRlcHJlY2F0ZWQgMTE4CSAqLworI2RlZmluZSBYRlNfSU9DX0ZSRUVaRQkJICAgICBfSU9XUignWCcsIDExOSwgaW50KQorI2RlZmluZSBYRlNfSU9DX1RIQVcJCSAgICAgX0lPV1IoJ1gnLCAxMjAsIGludCkKKyNkZWZpbmUgWEZTX0lPQ19GU1NFVERNX0JZX0hBTkRMRSAgICBfSU9XICgnWCcsIDEyMSwgc3RydWN0IHhmc19mc29wX3NldGRtX2hhbmRsZXJlcSkKKyNkZWZpbmUgWEZTX0lPQ19BVFRSTElTVF9CWV9IQU5ETEUgICBfSU9XICgnWCcsIDEyMiwgc3RydWN0IHhmc19mc29wX2F0dHJsaXN0X2hhbmRsZXJlcSkKKyNkZWZpbmUgWEZTX0lPQ19BVFRSTVVMVElfQllfSEFORExFICBfSU9XICgnWCcsIDEyMywgc3RydWN0IHhmc19mc29wX2F0dHJtdWx0aV9oYW5kbGVyZXEpCisjZGVmaW5lIFhGU19JT0NfRlNHRU9NRVRSWQkgICAgIF9JT1IgKCdYJywgMTI0LCBzdHJ1Y3QgeGZzX2Zzb3BfZ2VvbSkKKyNkZWZpbmUgWEZTX0lPQ19HT0lOR0RPV04JICAgICBfSU9SICgnWCcsIDEyNSwgX191aW50MzJfdCkKKy8qCVhGU19JT0NfR0VURlNVVUlEIC0tLS0tLS0tLS0gZGVwcmVjYXRlZCAxNDAJICovCisKKworI2lmbmRlZiBIQVZFX0JCTUFDUk9TCisvKgorICogQmxvY2sgSS9PIHBhcmFtZXRlcml6YXRpb24uCUEgYmFzaWMgYmxvY2sgKEJCKSBpcyB0aGUgbG93ZXN0IHNpemUgb2YKKyAqIGZpbGVzeXN0ZW0gYWxsb2NhdGlvbiwgYW5kIG11c3QgZXF1YWwgNTEyLiAgTGVuZ3RoIHVuaXRzIGdpdmVuIHRvIGJpbworICogcm91dGluZXMgYXJlIGluIEJCJ3MuCisgKi8KKyNkZWZpbmUgQkJTSElGVAkJOQorI2RlZmluZSBCQlNJWkUJCSgxPDxCQlNISUZUKQorI2RlZmluZSBCQk1BU0sJCShCQlNJWkUtMSkKKyNkZWZpbmUgQlRPQkIoYnl0ZXMpCSgoKF9fdTY0KShieXRlcykgKyBCQlNJWkUgLSAxKSA+PiBCQlNISUZUKQorI2RlZmluZSBCVE9CQlQoYnl0ZXMpCSgoX191NjQpKGJ5dGVzKSA+PiBCQlNISUZUKQorI2RlZmluZSBCQlRPQihiYnMpCSgoYmJzKSA8PCBCQlNISUZUKQorI2VuZGlmCisKKyNlbmRpZgkvKiBfX1hGU19GU19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZnNvcHMuYyBiL2ZzL3hmcy94ZnNfZnNvcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTIxMzA1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19mc29wcy5jCkBAIC0wLDAgKzEsNjE2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisjaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc190eXBlcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2Zzb3BzLmgiCisjaW5jbHVkZSAieGZzX2l0YWJsZS5oIgorI2luY2x1ZGUgInhmc19ydy5oIgorI2luY2x1ZGUgInhmc19yZWZjYWNoZS5oIgorI2luY2x1ZGUgInhmc190cmFuc19zcGFjZS5oIgorI2luY2x1ZGUgInhmc19ydGFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgorCisvKgorICogRmlsZSBzeXN0ZW0gb3BlcmF0aW9ucworICovCisKK2ludAoreGZzX2ZzX2dlb21ldHJ5KAorCXhmc19tb3VudF90CQkqbXAsCisJeGZzX2Zzb3BfZ2VvbV90CQkqZ2VvLAorCWludAkJCW5ld192ZXJzaW9uKQoreworCWdlby0+YmxvY2tzaXplID0gbXAtPm1fc2Iuc2JfYmxvY2tzaXplOworCWdlby0+cnRleHRzaXplID0gbXAtPm1fc2Iuc2JfcmV4dHNpemU7CisJZ2VvLT5hZ2Jsb2NrcyA9IG1wLT5tX3NiLnNiX2FnYmxvY2tzOworCWdlby0+YWdjb3VudCA9IG1wLT5tX3NiLnNiX2FnY291bnQ7CisJZ2VvLT5sb2dibG9ja3MgPSBtcC0+bV9zYi5zYl9sb2dibG9ja3M7CisJZ2VvLT5zZWN0c2l6ZSA9IG1wLT5tX3NiLnNiX3NlY3RzaXplOworCWdlby0+aW5vZGVzaXplID0gbXAtPm1fc2Iuc2JfaW5vZGVzaXplOworCWdlby0+aW1heHBjdCA9IG1wLT5tX3NiLnNiX2ltYXhfcGN0OworCWdlby0+ZGF0YWJsb2NrcyA9IG1wLT5tX3NiLnNiX2RibG9ja3M7CisJZ2VvLT5ydGJsb2NrcyA9IG1wLT5tX3NiLnNiX3JibG9ja3M7CisJZ2VvLT5ydGV4dGVudHMgPSBtcC0+bV9zYi5zYl9yZXh0ZW50czsKKwlnZW8tPmxvZ3N0YXJ0ID0gbXAtPm1fc2Iuc2JfbG9nc3RhcnQ7CisJQVNTRVJUKHNpemVvZihnZW8tPnV1aWQpPT1zaXplb2YobXAtPm1fc2Iuc2JfdXVpZCkpOworCW1lbWNweShnZW8tPnV1aWQsICZtcC0+bV9zYi5zYl91dWlkLCBzaXplb2YobXAtPm1fc2Iuc2JfdXVpZCkpOworCWlmIChuZXdfdmVyc2lvbiA+PSAyKSB7CisJCWdlby0+c3VuaXQgPSBtcC0+bV9zYi5zYl91bml0OworCQlnZW8tPnN3aWR0aCA9IG1wLT5tX3NiLnNiX3dpZHRoOworCX0KKwlpZiAobmV3X3ZlcnNpb24gPj0gMykgeworCQlnZW8tPnZlcnNpb24gPSBYRlNfRlNPUF9HRU9NX1ZFUlNJT047CisJCWdlby0+ZmxhZ3MgPQorCQkJKFhGU19TQl9WRVJTSU9OX0hBU0FUVFIoJm1wLT5tX3NiKSA/CisJCQkJWEZTX0ZTT1BfR0VPTV9GTEFHU19BVFRSIDogMCkgfAorCQkJKFhGU19TQl9WRVJTSU9OX0hBU05MSU5LKCZtcC0+bV9zYikgPworCQkJCVhGU19GU09QX0dFT01fRkxBR1NfTkxJTksgOiAwKSB8CisJCQkoWEZTX1NCX1ZFUlNJT05fSEFTUVVPVEEoJm1wLT5tX3NiKSA/CisJCQkJWEZTX0ZTT1BfR0VPTV9GTEFHU19RVU9UQSA6IDApIHwKKwkJCShYRlNfU0JfVkVSU0lPTl9IQVNBTElHTigmbXAtPm1fc2IpID8KKwkJCQlYRlNfRlNPUF9HRU9NX0ZMQUdTX0lBTElHTiA6IDApIHwKKwkJCShYRlNfU0JfVkVSU0lPTl9IQVNEQUxJR04oJm1wLT5tX3NiKSA/CisJCQkJWEZTX0ZTT1BfR0VPTV9GTEFHU19EQUxJR04gOiAwKSB8CisJCQkoWEZTX1NCX1ZFUlNJT05fSEFTU0hBUkVEKCZtcC0+bV9zYikgPworCQkJCVhGU19GU09QX0dFT01fRkxBR1NfU0hBUkVEIDogMCkgfAorCQkJKFhGU19TQl9WRVJTSU9OX0hBU0VYVEZMR0JJVCgmbXAtPm1fc2IpID8KKwkJCQlYRlNfRlNPUF9HRU9NX0ZMQUdTX0VYVEZMRyA6IDApIHwKKwkJCShYRlNfU0JfVkVSU0lPTl9IQVNESVJWMigmbXAtPm1fc2IpID8KKwkJCQlYRlNfRlNPUF9HRU9NX0ZMQUdTX0RJUlYyIDogMCkgfAorCQkJKFhGU19TQl9WRVJTSU9OX0hBU1NFQ1RPUigmbXAtPm1fc2IpID8KKwkJCQlYRlNfRlNPUF9HRU9NX0ZMQUdTX1NFQ1RPUiA6IDApOworCQlnZW8tPmxvZ3NlY3RzaXplID0gWEZTX1NCX1ZFUlNJT05fSEFTU0VDVE9SKCZtcC0+bV9zYikgPworCQkJCW1wLT5tX3NiLnNiX2xvZ3NlY3RzaXplIDogQkJTSVpFOworCQlnZW8tPnJ0c2VjdHNpemUgPSBtcC0+bV9zYi5zYl9ibG9ja3NpemU7CisJCWdlby0+ZGlyYmxvY2tzaXplID0gbXAtPm1fZGlyYmxrc2l6ZTsKKwl9CisJaWYgKG5ld192ZXJzaW9uID49IDQpIHsKKwkJZ2VvLT5mbGFncyB8PQorCQkJKFhGU19TQl9WRVJTSU9OX0hBU0xPR1YyKCZtcC0+bV9zYikgPworCQkJCVhGU19GU09QX0dFT01fRkxBR1NfTE9HVjIgOiAwKTsKKwkJZ2VvLT5sb2dzdW5pdCA9IG1wLT5tX3NiLnNiX2xvZ3N1bml0OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoreGZzX2dyb3dmc19kYXRhX3ByaXZhdGUoCisJeGZzX21vdW50X3QJCSptcCwJCS8qIG1vdW50IHBvaW50IGZvciBmaWxlc3lzdGVtICovCisJeGZzX2dyb3dmc19kYXRhX3QJKmluKQkJLyogZ3Jvd2ZzIGRhdGEgaW5wdXQgc3RydWN0ICovCit7CisJeGZzX2FnZl90CQkqYWdmOworCXhmc19hZ2lfdAkJKmFnaTsKKwl4ZnNfYWdudW1iZXJfdAkJYWdubzsKKwl4ZnNfZXh0bGVuX3QJCWFnc2l6ZTsKKwl4ZnNfZXh0bGVuX3QJCXRtcHNpemU7CisJeGZzX2FsbG9jX3JlY190CQkqYXJlYzsKKwl4ZnNfYnRyZWVfc2Jsb2NrX3QJKmJsb2NrOworCXhmc19idWZfdAkJKmJwOworCWludAkJCWJ1Y2tldDsKKwlpbnQJCQlkcGN0OworCWludAkJCWVycm9yOworCXhmc19hZ251bWJlcl90CQluYWdjb3VudDsKKwl4ZnNfYWdudW1iZXJfdAkJbmFnaW1heCA9IDA7CisJeGZzX3Jmc2Jsb2NrX3QJCW5iLCBuYl9tb2Q7CisJeGZzX3Jmc2Jsb2NrX3QJCW5ldzsKKwl4ZnNfcmZzYmxvY2tfdAkJbmZyZWU7CisJeGZzX2FnbnVtYmVyX3QJCW9hZ2NvdW50OworCWludAkJCXBjdDsKKwl4ZnNfc2JfdAkJKnNicDsKKwl4ZnNfdHJhbnNfdAkJKnRwOworCisJbmIgPSBpbi0+bmV3YmxvY2tzOworCXBjdCA9IGluLT5pbWF4cGN0OworCWlmIChuYiA8IG1wLT5tX3NiLnNiX2RibG9ja3MgfHwgcGN0IDwgMCB8fCBwY3QgPiAxMDApCisJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKwlkcGN0ID0gcGN0IC0gbXAtPm1fc2Iuc2JfaW1heF9wY3Q7CisJZXJyb3IgPSB4ZnNfcmVhZF9idWYobXAsIG1wLT5tX2RkZXZfdGFyZ3AsCisJCQlYRlNfRlNCX1RPX0JCKG1wLCBuYikgLSBYRlNfRlNTX1RPX0JCKG1wLCAxKSwKKwkJCVhGU19GU1NfVE9fQkIobXAsIDEpLCAwLCAmYnApOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCUFTU0VSVChicCk7CisJeGZzX2J1Zl9yZWxzZShicCk7CisKKwluZXcgPSBuYjsJLyogdXNlIG5ldyBhcyBhIHRlbXBvcmFyeSBoZXJlICovCisJbmJfbW9kID0gZG9fZGl2KG5ldywgbXAtPm1fc2Iuc2JfYWdibG9ja3MpOworCW5hZ2NvdW50ID0gbmV3ICsgKG5iX21vZCAhPSAwKTsKKwlpZiAobmJfbW9kICYmIG5iX21vZCA8IFhGU19NSU5fQUdfQkxPQ0tTKSB7CisJCW5hZ2NvdW50LS07CisJCW5iID0gbmFnY291bnQgKiBtcC0+bV9zYi5zYl9hZ2Jsb2NrczsKKwkJaWYgKG5iIDwgbXAtPm1fc2Iuc2JfZGJsb2NrcykKKwkJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKwl9CisJbmV3ID0gbmIgLSBtcC0+bV9zYi5zYl9kYmxvY2tzOworCW9hZ2NvdW50ID0gbXAtPm1fc2Iuc2JfYWdjb3VudDsKKwlpZiAobmFnY291bnQgPiBvYWdjb3VudCkgeworCQlkb3duX3dyaXRlKCZtcC0+bV9wZXJhZ2xvY2spOworCQltcC0+bV9wZXJhZyA9IGttZW1fcmVhbGxvYyhtcC0+bV9wZXJhZywKKwkJCXNpemVvZih4ZnNfcGVyYWdfdCkgKiBuYWdjb3VudCwKKwkJCXNpemVvZih4ZnNfcGVyYWdfdCkgKiBvYWdjb3VudCwKKwkJCUtNX1NMRUVQKTsKKwkJbWVtc2V0KCZtcC0+bV9wZXJhZ1tvYWdjb3VudF0sIDAsCisJCQkobmFnY291bnQgLSBvYWdjb3VudCkgKiBzaXplb2YoeGZzX3BlcmFnX3QpKTsKKwkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UXzMyQklUSU5PREVTOworCQluYWdpbWF4ID0geGZzX2luaXRpYWxpemVfcGVyYWcobXAsIG5hZ2NvdW50KTsKKwkJdXBfd3JpdGUoJm1wLT5tX3BlcmFnbG9jayk7CisJfQorCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfR1JPV0ZTKTsKKwlpZiAoKGVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIFhGU19HUk9XRlNfU1BBQ0VfUkVTKG1wKSwKKwkJCVhGU19HUk9XREFUQV9MT0dfUkVTKG1wKSwgMCwgMCwgMCkpKSB7CisJCXhmc190cmFuc19jYW5jZWwodHAsIDApOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJbmZyZWUgPSAwOworCWZvciAoYWdubyA9IG5hZ2NvdW50IC0gMTsgYWdubyA+PSBvYWdjb3VudDsgYWduby0tLCBuZXcgLT0gYWdzaXplKSB7CisJCS8qCisJCSAqIEFHIGZyZWVsaXN0IGhlYWRlciBibG9jaworCQkgKi8KKwkJYnAgPSB4ZnNfYnVmX2dldChtcC0+bV9kZGV2X3RhcmdwLAorCQkJCSAgWEZTX0FHX0RBRERSKG1wLCBhZ25vLCBYRlNfQUdGX0RBRERSKG1wKSksCisJCQkJICBYRlNfRlNTX1RPX0JCKG1wLCAxKSwgMCk7CisJCWFnZiA9IFhGU19CVUZfVE9fQUdGKGJwKTsKKwkJbWVtc2V0KGFnZiwgMCwgbXAtPm1fc2Iuc2Jfc2VjdHNpemUpOworCQlJTlRfU0VUKGFnZi0+YWdmX21hZ2ljbnVtLCBBUkNIX0NPTlZFUlQsIFhGU19BR0ZfTUFHSUMpOworCQlJTlRfU0VUKGFnZi0+YWdmX3ZlcnNpb25udW0sIEFSQ0hfQ09OVkVSVCwgWEZTX0FHRl9WRVJTSU9OKTsKKwkJSU5UX1NFVChhZ2YtPmFnZl9zZXFubywgQVJDSF9DT05WRVJULCBhZ25vKTsKKwkJaWYgKGFnbm8gPT0gbmFnY291bnQgLSAxKQorCQkJYWdzaXplID0KKwkJCQluYiAtCisJCQkJKGFnbm8gKiAoeGZzX3Jmc2Jsb2NrX3QpbXAtPm1fc2Iuc2JfYWdibG9ja3MpOworCQllbHNlCisJCQlhZ3NpemUgPSBtcC0+bV9zYi5zYl9hZ2Jsb2NrczsKKwkJSU5UX1NFVChhZ2YtPmFnZl9sZW5ndGgsIEFSQ0hfQ09OVkVSVCwgYWdzaXplKTsKKwkJSU5UX1NFVChhZ2YtPmFnZl9yb290c1tYRlNfQlROVU1fQk5PaV0sIEFSQ0hfQ09OVkVSVCwKKwkJCVhGU19CTk9fQkxPQ0sobXApKTsKKwkJSU5UX1NFVChhZ2YtPmFnZl9yb290c1tYRlNfQlROVU1fQ05UaV0sIEFSQ0hfQ09OVkVSVCwKKwkJCVhGU19DTlRfQkxPQ0sobXApKTsKKwkJSU5UX1NFVChhZ2YtPmFnZl9sZXZlbHNbWEZTX0JUTlVNX0JOT2ldLCBBUkNIX0NPTlZFUlQsIDEpOworCQlJTlRfU0VUKGFnZi0+YWdmX2xldmVsc1tYRlNfQlROVU1fQ05UaV0sIEFSQ0hfQ09OVkVSVCwgMSk7CisJCWFnZi0+YWdmX2ZsZmlyc3QgPSAwOworCQlJTlRfU0VUKGFnZi0+YWdmX2ZsbGFzdCwgQVJDSF9DT05WRVJULCBYRlNfQUdGTF9TSVpFKG1wKSAtIDEpOworCQlhZ2YtPmFnZl9mbGNvdW50ID0gMDsKKwkJdG1wc2l6ZSA9IGFnc2l6ZSAtIFhGU19QUkVBTExPQ19CTE9DS1MobXApOworCQlJTlRfU0VUKGFnZi0+YWdmX2ZyZWVibGtzLCBBUkNIX0NPTlZFUlQsIHRtcHNpemUpOworCQlJTlRfU0VUKGFnZi0+YWdmX2xvbmdlc3QsIEFSQ0hfQ09OVkVSVCwgdG1wc2l6ZSk7CisJCWVycm9yID0geGZzX2J3cml0ZShtcCwgYnApOworCQlpZiAoZXJyb3IpIHsKKwkJCWdvdG8gZXJyb3IwOworCQl9CisJCS8qCisJCSAqIEFHIGlub2RlIGhlYWRlciBibG9jaworCQkgKi8KKwkJYnAgPSB4ZnNfYnVmX2dldChtcC0+bV9kZGV2X3RhcmdwLAorCQkJCSAgWEZTX0FHX0RBRERSKG1wLCBhZ25vLCBYRlNfQUdJX0RBRERSKG1wKSksCisJCQkJICBYRlNfRlNTX1RPX0JCKG1wLCAxKSwgMCk7CisJCWFnaSA9IFhGU19CVUZfVE9fQUdJKGJwKTsKKwkJbWVtc2V0KGFnaSwgMCwgbXAtPm1fc2Iuc2Jfc2VjdHNpemUpOworCQlJTlRfU0VUKGFnaS0+YWdpX21hZ2ljbnVtLCBBUkNIX0NPTlZFUlQsIFhGU19BR0lfTUFHSUMpOworCQlJTlRfU0VUKGFnaS0+YWdpX3ZlcnNpb25udW0sIEFSQ0hfQ09OVkVSVCwgWEZTX0FHSV9WRVJTSU9OKTsKKwkJSU5UX1NFVChhZ2ktPmFnaV9zZXFubywgQVJDSF9DT05WRVJULCBhZ25vKTsKKwkJSU5UX1NFVChhZ2ktPmFnaV9sZW5ndGgsIEFSQ0hfQ09OVkVSVCwgYWdzaXplKTsKKwkJYWdpLT5hZ2lfY291bnQgPSAwOworCQlJTlRfU0VUKGFnaS0+YWdpX3Jvb3QsIEFSQ0hfQ09OVkVSVCwgWEZTX0lCVF9CTE9DSyhtcCkpOworCQlJTlRfU0VUKGFnaS0+YWdpX2xldmVsLCBBUkNIX0NPTlZFUlQsIDEpOworCQlhZ2ktPmFnaV9mcmVlY291bnQgPSAwOworCQlJTlRfU0VUKGFnaS0+YWdpX25ld2lubywgQVJDSF9DT05WRVJULCBOVUxMQUdJTk8pOworCQlJTlRfU0VUKGFnaS0+YWdpX2RpcmlubywgQVJDSF9DT05WRVJULCBOVUxMQUdJTk8pOworCQlmb3IgKGJ1Y2tldCA9IDA7IGJ1Y2tldCA8IFhGU19BR0lfVU5MSU5LRURfQlVDS0VUUzsgYnVja2V0KyspCisJCQlJTlRfU0VUKGFnaS0+YWdpX3VubGlua2VkW2J1Y2tldF0sIEFSQ0hfQ09OVkVSVCwKKwkJCQlOVUxMQUdJTk8pOworCQllcnJvciA9IHhmc19id3JpdGUobXAsIGJwKTsKKwkJaWYgKGVycm9yKSB7CisJCQlnb3RvIGVycm9yMDsKKwkJfQorCQkvKgorCQkgKiBCTk8gYnRyZWUgcm9vdCBibG9jaworCQkgKi8KKwkJYnAgPSB4ZnNfYnVmX2dldChtcC0+bV9kZGV2X3RhcmdwLAorCQkJWEZTX0FHQl9UT19EQUREUihtcCwgYWdubywgWEZTX0JOT19CTE9DSyhtcCkpLAorCQkJQlRPQkIobXAtPm1fc2Iuc2JfYmxvY2tzaXplKSwgMCk7CisJCWJsb2NrID0gWEZTX0JVRl9UT19TQkxPQ0soYnApOworCQltZW1zZXQoYmxvY2ssIDAsIG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSk7CisJCUlOVF9TRVQoYmxvY2stPmJiX21hZ2ljLCBBUkNIX0NPTlZFUlQsIFhGU19BQlRCX01BR0lDKTsKKwkJYmxvY2stPmJiX2xldmVsID0gMDsKKwkJSU5UX1NFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCAxKTsKKwkJSU5UX1NFVChibG9jay0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJULCBOVUxMQUdCTE9DSyk7CisJCUlOVF9TRVQoYmxvY2stPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQsIE5VTExBR0JMT0NLKTsKKwkJYXJlYyA9IFhGU19CVFJFRV9SRUNfQUREUihtcC0+bV9zYi5zYl9ibG9ja3NpemUsIHhmc19hbGxvYywKKwkJCWJsb2NrLCAxLCBtcC0+bV9hbGxvY19teHJbMF0pOworCQlJTlRfU0VUKGFyZWMtPmFyX3N0YXJ0YmxvY2ssIEFSQ0hfQ09OVkVSVCwKKwkJCVhGU19QUkVBTExPQ19CTE9DS1MobXApKTsKKwkJSU5UX1NFVChhcmVjLT5hcl9ibG9ja2NvdW50LCBBUkNIX0NPTlZFUlQsCisJCQlhZ3NpemUgLSBJTlRfR0VUKGFyZWMtPmFyX3N0YXJ0YmxvY2ssIEFSQ0hfQ09OVkVSVCkpOworCQllcnJvciA9IHhmc19id3JpdGUobXAsIGJwKTsKKwkJaWYgKGVycm9yKSB7CisJCQlnb3RvIGVycm9yMDsKKwkJfQorCQkvKgorCQkgKiBDTlQgYnRyZWUgcm9vdCBibG9jaworCQkgKi8KKwkJYnAgPSB4ZnNfYnVmX2dldChtcC0+bV9kZGV2X3RhcmdwLAorCQkJWEZTX0FHQl9UT19EQUREUihtcCwgYWdubywgWEZTX0NOVF9CTE9DSyhtcCkpLAorCQkJQlRPQkIobXAtPm1fc2Iuc2JfYmxvY2tzaXplKSwgMCk7CisJCWJsb2NrID0gWEZTX0JVRl9UT19TQkxPQ0soYnApOworCQltZW1zZXQoYmxvY2ssIDAsIG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSk7CisJCUlOVF9TRVQoYmxvY2stPmJiX21hZ2ljLCBBUkNIX0NPTlZFUlQsIFhGU19BQlRDX01BR0lDKTsKKwkJYmxvY2stPmJiX2xldmVsID0gMDsKKwkJSU5UX1NFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCAxKTsKKwkJSU5UX1NFVChibG9jay0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJULCBOVUxMQUdCTE9DSyk7CisJCUlOVF9TRVQoYmxvY2stPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQsIE5VTExBR0JMT0NLKTsKKwkJYXJlYyA9IFhGU19CVFJFRV9SRUNfQUREUihtcC0+bV9zYi5zYl9ibG9ja3NpemUsIHhmc19hbGxvYywKKwkJCWJsb2NrLCAxLCBtcC0+bV9hbGxvY19teHJbMF0pOworCQlJTlRfU0VUKGFyZWMtPmFyX3N0YXJ0YmxvY2ssIEFSQ0hfQ09OVkVSVCwKKwkJCVhGU19QUkVBTExPQ19CTE9DS1MobXApKTsKKwkJSU5UX1NFVChhcmVjLT5hcl9ibG9ja2NvdW50LCBBUkNIX0NPTlZFUlQsCisJCQlhZ3NpemUgLSBJTlRfR0VUKGFyZWMtPmFyX3N0YXJ0YmxvY2ssIEFSQ0hfQ09OVkVSVCkpOworCQluZnJlZSArPSBJTlRfR0VUKGFyZWMtPmFyX2Jsb2NrY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJCWVycm9yID0geGZzX2J3cml0ZShtcCwgYnApOworCQlpZiAoZXJyb3IpIHsKKwkJCWdvdG8gZXJyb3IwOworCQl9CisJCS8qCisJCSAqIElOTyBidHJlZSByb290IGJsb2NrCisJCSAqLworCQlicCA9IHhmc19idWZfZ2V0KG1wLT5tX2RkZXZfdGFyZ3AsCisJCQlYRlNfQUdCX1RPX0RBRERSKG1wLCBhZ25vLCBYRlNfSUJUX0JMT0NLKG1wKSksCisJCQlCVE9CQihtcC0+bV9zYi5zYl9ibG9ja3NpemUpLCAwKTsKKwkJYmxvY2sgPSBYRlNfQlVGX1RPX1NCTE9DSyhicCk7CisJCW1lbXNldChibG9jaywgMCwgbXAtPm1fc2Iuc2JfYmxvY2tzaXplKTsKKwkJSU5UX1NFVChibG9jay0+YmJfbWFnaWMsIEFSQ0hfQ09OVkVSVCwgWEZTX0lCVF9NQUdJQyk7CisJCWJsb2NrLT5iYl9sZXZlbCA9IDA7CisJCWJsb2NrLT5iYl9udW1yZWNzID0gMDsKKwkJSU5UX1NFVChibG9jay0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJULCBOVUxMQUdCTE9DSyk7CisJCUlOVF9TRVQoYmxvY2stPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQsIE5VTExBR0JMT0NLKTsKKwkJZXJyb3IgPSB4ZnNfYndyaXRlKG1wLCBicCk7CisJCWlmIChlcnJvcikgeworCQkJZ290byBlcnJvcjA7CisJCX0KKwl9CisJeGZzX3RyYW5zX2FnYmxvY2tzX2RlbHRhKHRwLCBuZnJlZSk7CisJLyoKKwkgKiBUaGVyZSBhcmUgbmV3IGJsb2NrcyBpbiB0aGUgb2xkIGxhc3QgYS5nLgorCSAqLworCWlmIChuZXcpIHsKKwkJLyoKKwkJICogQ2hhbmdlIHRoZSBhZ2kgbGVuZ3RoLgorCQkgKi8KKwkJZXJyb3IgPSB4ZnNfaWFsbG9jX3JlYWRfYWdpKG1wLCB0cCwgYWdubywgJmJwKTsKKwkJaWYgKGVycm9yKSB7CisJCQlnb3RvIGVycm9yMDsKKwkJfQorCQlBU1NFUlQoYnApOworCQlhZ2kgPSBYRlNfQlVGX1RPX0FHSShicCk7CisJCUlOVF9NT0QoYWdpLT5hZ2lfbGVuZ3RoLCBBUkNIX0NPTlZFUlQsIG5ldyk7CisJCUFTU0VSVChuYWdjb3VudCA9PSBvYWdjb3VudCB8fAorCQkgICAgICAgSU5UX0dFVChhZ2ktPmFnaV9sZW5ndGgsIEFSQ0hfQ09OVkVSVCkgPT0KKwkJCQltcC0+bV9zYi5zYl9hZ2Jsb2Nrcyk7CisJCXhmc19pYWxsb2NfbG9nX2FnaSh0cCwgYnAsIFhGU19BR0lfTEVOR1RIKTsKKwkJLyoKKwkJICogQ2hhbmdlIGFnZiBsZW5ndGguCisJCSAqLworCQllcnJvciA9IHhmc19hbGxvY19yZWFkX2FnZihtcCwgdHAsIGFnbm8sIDAsICZicCk7CisJCWlmIChlcnJvcikgeworCQkJZ290byBlcnJvcjA7CisJCX0KKwkJQVNTRVJUKGJwKTsKKwkJYWdmID0gWEZTX0JVRl9UT19BR0YoYnApOworCQlJTlRfTU9EKGFnZi0+YWdmX2xlbmd0aCwgQVJDSF9DT05WRVJULCBuZXcpOworCQlBU1NFUlQoSU5UX0dFVChhZ2YtPmFnZl9sZW5ndGgsIEFSQ0hfQ09OVkVSVCkgPT0KKwkJCQlJTlRfR0VUKGFnaS0+YWdpX2xlbmd0aCwgQVJDSF9DT05WRVJUKSk7CisJCS8qCisJCSAqIEZyZWUgdGhlIG5ldyBzcGFjZS4KKwkJICovCisJCWVycm9yID0geGZzX2ZyZWVfZXh0ZW50KHRwLCBYRlNfQUdCX1RPX0ZTQihtcCwgYWdubywKKwkJCUlOVF9HRVQoYWdmLT5hZ2ZfbGVuZ3RoLCBBUkNIX0NPTlZFUlQpIC0gbmV3KSwgbmV3KTsKKwkJaWYgKGVycm9yKSB7CisJCQlnb3RvIGVycm9yMDsKKwkJfQorCX0KKwlpZiAobmFnY291bnQgPiBvYWdjb3VudCkKKwkJeGZzX3RyYW5zX21vZF9zYih0cCwgWEZTX1RSQU5TX1NCX0FHQ09VTlQsIG5hZ2NvdW50IC0gb2FnY291bnQpOworCWlmIChuYiA+IG1wLT5tX3NiLnNiX2RibG9ja3MpCisJCXhmc190cmFuc19tb2Rfc2IodHAsIFhGU19UUkFOU19TQl9EQkxPQ0tTLAorCQkJCSBuYiAtIG1wLT5tX3NiLnNiX2RibG9ja3MpOworCWlmIChuZnJlZSkKKwkJeGZzX3RyYW5zX21vZF9zYih0cCwgWEZTX1RSQU5TX1NCX0ZEQkxPQ0tTLCBuZnJlZSk7CisJaWYgKGRwY3QpCisJCXhmc190cmFuc19tb2Rfc2IodHAsIFhGU19UUkFOU19TQl9JTUFYUENULCBkcGN0KTsKKwllcnJvciA9IHhmc190cmFuc19jb21taXQodHAsIDAsIE5VTEwpOworCWlmIChlcnJvcikgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCS8qIE5ldyBhbGxvY2F0aW9uIGdyb3VwcyBmdWxseSBpbml0aWFsaXplZCwgc28gdXBkYXRlIG1vdW50IHN0cnVjdCAqLworCWlmIChuYWdpbWF4KQorCQltcC0+bV9tYXhhZ2kgPSBuYWdpbWF4OworCWlmIChtcC0+bV9zYi5zYl9pbWF4X3BjdCkgeworCQlfX3VpbnQ2NF90IGljb3VudCA9IG1wLT5tX3NiLnNiX2RibG9ja3MgKiBtcC0+bV9zYi5zYl9pbWF4X3BjdDsKKwkJZG9fZGl2KGljb3VudCwgMTAwKTsKKwkJbXAtPm1fbWF4aWNvdW50ID0gaWNvdW50IDw8IG1wLT5tX3NiLnNiX2lub3BibG9nOworCX0gZWxzZQorCQltcC0+bV9tYXhpY291bnQgPSAwOworCWZvciAoYWdubyA9IDE7IGFnbm8gPCBuYWdjb3VudDsgYWdubysrKSB7CisJCWVycm9yID0geGZzX3JlYWRfYnVmKG1wLCBtcC0+bV9kZGV2X3RhcmdwLAorCQkJCSAgWEZTX0FHQl9UT19EQUREUihtcCwgYWdubywgWEZTX1NCX0JMT0NLKG1wKSksCisJCQkJICBYRlNfRlNTX1RPX0JCKG1wLCAxKSwgMCwgJmJwKTsKKwkJaWYgKGVycm9yKSB7CisJCQl4ZnNfZnNfY21uX2VycihDRV9XQVJOLCBtcCwKKwkJCSJlcnJvciAlZCByZWFkaW5nIHNlY29uZGFyeSBzdXBlcmJsb2NrIGZvciBhZyAlZCIsCisJCQkJZXJyb3IsIGFnbm8pOworCQkJYnJlYWs7CisJCX0KKwkJc2JwID0gWEZTX0JVRl9UT19TQlAoYnApOworCQl4ZnNfeGxhdGVzYihzYnAsICZtcC0+bV9zYiwgLTEsIFhGU19TQl9BTExfQklUUyk7CisJCS8qCisJCSAqIElmIHdlIGdldCBhbiBlcnJvciB3cml0aW5nIG91dCB0aGUgYWx0ZXJuYXRlIHN1cGVyYmxvY2tzLAorCQkgKiBqdXN0IGlzc3VlIGEgd2FybmluZyBhbmQgY29udGludWUuICBUaGUgcmVhbCB3b3JrIGlzCisJCSAqIGFscmVhZHkgZG9uZSBhbmQgY29tbWl0dGVkLgorCQkgKi8KKwkJaWYgKCEoZXJyb3IgPSB4ZnNfYndyaXRlKG1wLCBicCkpKSB7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIHsKKwkJCXhmc19mc19jbW5fZXJyKENFX1dBUk4sIG1wLAorCQkid3JpdGUgZXJyb3IgJWQgdXBkYXRpbmcgc2Vjb25kYXJ5IHN1cGVyYmxvY2sgZm9yIGFnICVkIiwKKwkJCQllcnJvciwgYWdubyk7CisJCQlicmVhazsgLyogbm8gcG9pbnQgaW4gY29udGludWluZyAqLworCQl9CisJfQorCXJldHVybiAwOworCisgZXJyb3IwOgorCXhmc190cmFuc19jYW5jZWwodHAsIFhGU19UUkFOU19BQk9SVCk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50Cit4ZnNfZ3Jvd2ZzX2xvZ19wcml2YXRlKAorCXhmc19tb3VudF90CQkqbXAsCS8qIG1vdW50IHBvaW50IGZvciBmaWxlc3lzdGVtICovCisJeGZzX2dyb3dmc19sb2dfdAkqaW4pCS8qIGdyb3dmcyBsb2cgaW5wdXQgc3RydWN0ICovCit7CisJeGZzX2V4dGxlbl90CQluYjsKKworCW5iID0gaW4tPm5ld2Jsb2NrczsKKwlpZiAobmIgPCBYRlNfTUlOX0xPR19CTE9DS1MgfHwgbmIgPCBYRlNfQl9UT19GU0IobXAsIFhGU19NSU5fTE9HX0JZVEVTKSkKKwkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCWlmIChuYiA9PSBtcC0+bV9zYi5zYl9sb2dibG9ja3MgJiYKKwkgICAgaW4tPmlzaW50ID09IChtcC0+bV9zYi5zYl9sb2dzdGFydCAhPSAwKSkKKwkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCS8qCisJICogTW92aW5nIHRoZSBsb2cgaXMgaGFyZCwgbmVlZCBuZXcgaW50ZXJmYWNlcyB0byBzeW5jCisJICogdGhlIGxvZyBmaXJzdCwgaG9sZCBvZmYgYWxsIGFjdGl2aXR5IHdoaWxlIG1vdmluZyBpdC4KKwkgKiBDYW4gaGF2ZSBzaG9ydGVyIG9yIGxvbmdlciBsb2cgaW4gdGhlIHNhbWUgc3BhY2UsCisJICogb3IgdHJhbnNmb3JtIGludGVybmFsIHRvIGV4dGVybmFsIGxvZyBvciB2aWNlIHZlcnNhLgorCSAqLworCXJldHVybiBYRlNfRVJST1IoRU5PU1lTKTsKK30KKworLyoKKyAqIHByb3RlY3RlZCB2ZXJzaW9ucyBvZiBncm93ZnMgZnVuY3Rpb24gYWNxdWlyZSBhbmQgcmVsZWFzZSBsb2NrcyBvbiB0aGUgbW91bnQKKyAqIHBvaW50IC0gZXhwb3J0ZWQgdGhyb3VnaCBpb2N0bHM6IFhGU19JT0NfRlNHUk9XRlNEQVRBLCBYRlNfSU9DX0ZTR1JPV0ZTTE9HLAorICogWEZTX0lPQ19GU0dST1dGU1JUCisgKi8KKworCitpbnQKK3hmc19ncm93ZnNfZGF0YSgKKwl4ZnNfbW91bnRfdAkJKm1wLAorCXhmc19ncm93ZnNfZGF0YV90CSppbikKK3sKKwlpbnQgZXJyb3I7CisJaWYgKCFjcHNlbWEoJm1wLT5tX2dyb3dsb2NrKSkKKwkJcmV0dXJuIFhGU19FUlJPUihFV09VTERCTE9DSyk7CisJZXJyb3IgPSB4ZnNfZ3Jvd2ZzX2RhdGFfcHJpdmF0ZShtcCwgaW4pOworCXZzZW1hKCZtcC0+bV9ncm93bG9jayk7CisJcmV0dXJuIGVycm9yOworfQorCitpbnQKK3hmc19ncm93ZnNfbG9nKAorCXhmc19tb3VudF90CQkqbXAsCisJeGZzX2dyb3dmc19sb2dfdAkqaW4pCit7CisJaW50IGVycm9yOworCWlmICghY3BzZW1hKCZtcC0+bV9ncm93bG9jaykpCisJCXJldHVybiBYRlNfRVJST1IoRVdPVUxEQkxPQ0spOworCWVycm9yID0geGZzX2dyb3dmc19sb2dfcHJpdmF0ZShtcCwgaW4pOworCXZzZW1hKCZtcC0+bV9ncm93bG9jayk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogZXhwb3J0ZWQgdGhyb3VnaCBpb2N0bCBYRlNfSU9DX0ZTQ09VTlRTCisgKi8KKworaW50Cit4ZnNfZnNfY291bnRzKAorCXhmc19tb3VudF90CQkqbXAsCisJeGZzX2Zzb3BfY291bnRzX3QJKmNudCkKK3sKKwl1bnNpZ25lZCBsb25nCXM7CisKKwlzID0gWEZTX1NCX0xPQ0sobXApOworCWNudC0+ZnJlZWRhdGEgPSBtcC0+bV9zYi5zYl9mZGJsb2NrczsKKwljbnQtPmZyZWVydHggPSBtcC0+bV9zYi5zYl9mcmV4dGVudHM7CisJY250LT5mcmVlaW5vID0gbXAtPm1fc2Iuc2JfaWZyZWU7CisJY250LT5hbGxvY2lubyA9IG1wLT5tX3NiLnNiX2ljb3VudDsKKwlYRlNfU0JfVU5MT0NLKG1wLCBzKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGV4cG9ydGVkIHRocm91Z2ggaW9jdGwgWEZTX0lPQ19TRVRfUkVTQkxLUyAmIFhGU19JT0NfR0VUX1JFU0JMS1MKKyAqCisgKiB4ZnNfcmVzZXJ2ZV9ibG9ja3MgaXMgY2FsbGVkIHRvIHNldCBtX3Jlc2Jsa3MKKyAqIGluIHRoZSBpbi1jb3JlIG1vdW50IHRhYmxlLiBUaGUgbnVtYmVyIG9mIHVudXNlZCByZXNlcnZlZCBibG9ja3MKKyAqIGlzIGtlcHQgaW4gbV9yZXNibHNfYXZhaWwuCisgKgorICogUmVzZXJ2ZSB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBibG9ja3MgaWYgYXZhaWxhYmxlLiBPdGhlcndpc2UgcmV0dXJuCisgKiBhcyBtYW55IGFzIHBvc3NpYmxlIHRvIHNhdGlzZnkgdGhlIHJlcXVlc3QuIFRoZSBhY3R1YWwgbnVtYmVyCisgKiByZXNlcnZlZCBhcmUgcmV0dXJuZWQgaW4gb3V0dmFsCisgKgorICogQSBudWxsIGludmFsIHBvaW50ZXIgaW5kaWNhdGVzIHRoYXQgb25seSB0aGUgY3VycmVudCByZXNlcnZlZCBibG9ja3MKKyAqIGF2YWlsYWJsZSAgc2hvdWxkICBiZSByZXR1cm5lZCBubyBzZXR0aW5ncyBhcmUgY2hhbmdlZC4KKyAqLworCitpbnQKK3hmc19yZXNlcnZlX2Jsb2NrcygKKwl4ZnNfbW91bnRfdCAgICAgICAgICAgICAqbXAsCisJX191aW50NjRfdCAgICAgICAgICAgICAgKmludmFsLAorCXhmc19mc29wX3Jlc2Jsa3NfdCAgICAgICpvdXR2YWwpCit7CisJX19pbnQ2NF90CQlsY291bnRlciwgZGVsdGE7CisJX191aW50NjRfdAkJcmVxdWVzdDsKKwl1bnNpZ25lZCBsb25nCQlzOworCisJLyogSWYgaW52YWwgaXMgbnVsbCwgcmVwb3J0IGN1cnJlbnQgdmFsdWVzIGFuZCByZXR1cm4gKi8KKworCWlmIChpbnZhbCA9PSAoX191aW50NjRfdCAqKU5VTEwpIHsKKwkJb3V0dmFsLT5yZXNibGtzID0gbXAtPm1fcmVzYmxrczsKKwkJb3V0dmFsLT5yZXNibGtzX2F2YWlsID0gbXAtPm1fcmVzYmxrc19hdmFpbDsKKwkJcmV0dXJuKDApOworCX0KKworCXJlcXVlc3QgPSAqaW52YWw7CisJcyA9IFhGU19TQl9MT0NLKG1wKTsKKworCS8qCisJICogSWYgb3VyIHByZXZpb3VzIHJlc2VydmF0aW9uIHdhcyBsYXJnZXIgdGhhbiB0aGUgY3VycmVudCB2YWx1ZSwKKwkgKiB0aGVuIG1vdmUgYW55IHVudXNlZCBibG9ja3MgYmFjayB0byB0aGUgZnJlZSBwb29sLgorCSAqLworCisJaWYgKG1wLT5tX3Jlc2Jsa3MgPiByZXF1ZXN0KSB7CisJCWxjb3VudGVyID0gbXAtPm1fcmVzYmxrc19hdmFpbCAtIHJlcXVlc3Q7CisJCWlmIChsY291bnRlciAgPiAwKSB7CQkvKiByZWxlYXNlIHVudXNlZCBibG9ja3MgKi8KKwkJCW1wLT5tX3NiLnNiX2ZkYmxvY2tzICs9IGxjb3VudGVyOworCQkJbXAtPm1fcmVzYmxrc19hdmFpbCAtPSBsY291bnRlcjsKKwkJfQorCQltcC0+bV9yZXNibGtzID0gcmVxdWVzdDsKKwl9IGVsc2UgeworCQlkZWx0YSA9IHJlcXVlc3QgLSBtcC0+bV9yZXNibGtzOworCQlsY291bnRlciA9IG1wLT5tX3NiLnNiX2ZkYmxvY2tzIC0gZGVsdGE7CisJCWlmIChsY291bnRlciA8IDApIHsKKwkJCS8qIFdlIGNhbid0IHNhdGlzZnkgdGhlIHJlcXVlc3QsIGp1c3QgZ2V0IHdoYXQgd2UgY2FuICovCisJCQltcC0+bV9yZXNibGtzICs9IG1wLT5tX3NiLnNiX2ZkYmxvY2tzOworCQkJbXAtPm1fcmVzYmxrc19hdmFpbCArPSBtcC0+bV9zYi5zYl9mZGJsb2NrczsKKwkJCW1wLT5tX3NiLnNiX2ZkYmxvY2tzID0gMDsKKwkJfSBlbHNlIHsKKwkJCW1wLT5tX3NiLnNiX2ZkYmxvY2tzID0gbGNvdW50ZXI7CisJCQltcC0+bV9yZXNibGtzID0gcmVxdWVzdDsKKwkJCW1wLT5tX3Jlc2Jsa3NfYXZhaWwgKz0gZGVsdGE7CisJCX0KKwl9CisKKwlvdXR2YWwtPnJlc2Jsa3MgPSBtcC0+bV9yZXNibGtzOworCW91dHZhbC0+cmVzYmxrc19hdmFpbCA9IG1wLT5tX3Jlc2Jsa3NfYXZhaWw7CisJWEZTX1NCX1VOTE9DSyhtcCwgcyk7CisJcmV0dXJuKDApOworfQorCit2b2lkCit4ZnNfZnNfbG9nX2R1bW15KHhmc19tb3VudF90ICptcCkKK3sKKwl4ZnNfdHJhbnNfdCAqdHA7CisJeGZzX2lub2RlX3QgKmlwOworCisKKwl0cCA9IF94ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19EVU1NWTEpOworCWF0b21pY19pbmMoJm1wLT5tX2FjdGl2ZV90cmFucyk7CisJaWYgKHhmc190cmFuc19yZXNlcnZlKHRwLCAwLCBYRlNfSUNIQU5HRV9MT0dfUkVTKG1wKSwgMCwgMCwgMCkpIHsKKwkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgMCk7CisJCXJldHVybjsKKwl9CisKKwlpcCA9IG1wLT5tX3Jvb3RpcDsKKwl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKworCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKKwl4ZnNfdHJhbnNfaWhvbGQodHAsIGlwKTsKKwl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CisJeGZzX3RyYW5zX3NldF9zeW5jKHRwKTsKKwl4ZnNfdHJhbnNfY29tbWl0KHRwLCAwLCBOVUxMKTsKKworCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7Cit9CisKK2ludAoreGZzX2ZzX2dvaW5nZG93bigKKwl4ZnNfbW91bnRfdAkqbXAsCisJX191aW50MzJfdAlpbmZsYWdzKQoreworCXN3aXRjaCAoaW5mbGFncykgeworCWNhc2UgWEZTX0ZTT1BfR09JTkdfRkxBR1NfREVGQVVMVDogeworCQlzdHJ1Y3QgdmZzICp2ZnNwID0gWEZTX01UT1ZGUyhtcCk7CisJCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBmcmVlemVfYmRldih2ZnNwLT52ZnNfc3VwZXItPnNfYmRldik7CisKKwkJaWYgKHNiKSB7CisJCQl4ZnNfZm9yY2Vfc2h1dGRvd24obXAsIFhGU19GT1JDRV9VTU9VTlQpOworCQkJdGhhd19iZGV2KHNiLT5zX2JkZXYsIHNiKTsKKwkJfQorCQorCQlicmVhazsKKwl9CisJY2FzZSBYRlNfRlNPUF9HT0lOR19GTEFHU19MT0dGTFVTSDoKKwkJeGZzX2ZvcmNlX3NodXRkb3duKG1wLCBYRlNfRk9SQ0VfVU1PVU5UKTsKKwkJYnJlYWs7CisJY2FzZSBYRlNfRlNPUF9HT0lOR19GTEFHU19OT0xPR0ZMVVNIOgorCQl4ZnNfZm9yY2Vfc2h1dGRvd24obXAsIFhGU19GT1JDRV9VTU9VTlR8WEZTX0xPR19JT19FUlJPUik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZnNvcHMuaCBiL2ZzL3hmcy94ZnNfZnNvcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjE0ODYxCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19mc29wcy5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMSBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX0ZTT1BTX0hfXworI2RlZmluZQlfX1hGU19GU09QU19IX18KKworaW50Cit4ZnNfZnNfZ2VvbWV0cnkoCisJeGZzX21vdW50X3QJCSptcCwKKwl4ZnNfZnNvcF9nZW9tX3QJCSpnZW8sCisJaW50CQkJbmV3X3ZlcnNpb24pOworCitpbnQKK3hmc19ncm93ZnNfZGF0YSgKKwl4ZnNfbW91bnRfdAkJKm1wLAorCXhmc19ncm93ZnNfZGF0YV90CSppbik7CisKK2ludAoreGZzX2dyb3dmc19sb2coCisJeGZzX21vdW50X3QJCSptcCwKKwl4ZnNfZ3Jvd2ZzX2xvZ190CSppbik7CisKK2ludAoreGZzX2ZzX2NvdW50cygKKwl4ZnNfbW91bnRfdAkJKm1wLAorCXhmc19mc29wX2NvdW50c190CSpjbnQpOworCitpbnQKK3hmc19yZXNlcnZlX2Jsb2NrcygKKwl4ZnNfbW91bnRfdAkJKm1wLAorCV9fdWludDY0X3QJCSppbnZhbCwKKwl4ZnNfZnNvcF9yZXNibGtzX3QJKm91dHZhbCk7CisKK2ludAoreGZzX2ZzX2dvaW5nZG93bigKKwl4ZnNfbW91bnRfdAkJKm1wLAorCV9fdWludDMyX3QJCWluZmxhZ3MpOworCisjZW5kaWYJLyogX19YRlNfRlNPUFNfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lhbGxvYy5jIGIvZnMveGZzL3hmc19pYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTVmZWU5Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19pYWxsb2MuYwpAQCAtMCwwICsxLDE0MDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKworI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jLmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgorI2luY2x1ZGUgInhmc19ydGFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisjaW5jbHVkZSAieGZzX2JtYXAuaCIKKworLyoKKyAqIExvZyBzcGVjaWZpZWQgZmllbGRzIGZvciB0aGUgaW5vZGUgZ2l2ZW4gYnkgYnAgYW5kIG9mZi4KKyAqLworU1RBVElDIHZvaWQKK3hmc19pYWxsb2NfbG9nX2RpKAorCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfYnVmX3QJKmJwLAkJLyogaW5vZGUgYnVmZmVyICovCisJaW50CQlvZmYsCQkvKiBpbmRleCBvZiBpbm9kZSBpbiBidWZmZXIgKi8KKwlpbnQJCWZpZWxkcykJCS8qIGJpdG1hc2sgb2YgZmllbGRzIHRvIGxvZyAqLworeworCWludAkJCWZpcnN0OwkJLyogZmlyc3QgYnl0ZSBudW1iZXIgKi8KKwlpbnQJCQlpb2Zmc2V0OwkvKiBvZmYgaW4gYnl0ZXMgKi8KKwlpbnQJCQlsYXN0OwkJLyogbGFzdCBieXRlIG51bWJlciAqLworCXhmc19tb3VudF90CQkqbXA7CQkvKiBtb3VudCBwb2ludCBzdHJ1Y3R1cmUgKi8KKwlzdGF0aWMgY29uc3Qgc2hvcnQJb2Zmc2V0c1tdID0gewkvKiBmaWVsZCBvZmZzZXRzICovCisJCQkJCQkvKiBrZWVwIGluIHN5bmMgd2l0aCBiaXRzICovCisJCW9mZnNldG9mKHhmc19kaW5vZGVfY29yZV90LCBkaV9tYWdpYyksCisJCW9mZnNldG9mKHhmc19kaW5vZGVfY29yZV90LCBkaV9tb2RlKSwKKwkJb2Zmc2V0b2YoeGZzX2Rpbm9kZV9jb3JlX3QsIGRpX3ZlcnNpb24pLAorCQlvZmZzZXRvZih4ZnNfZGlub2RlX2NvcmVfdCwgZGlfZm9ybWF0KSwKKwkJb2Zmc2V0b2YoeGZzX2Rpbm9kZV9jb3JlX3QsIGRpX29ubGluayksCisJCW9mZnNldG9mKHhmc19kaW5vZGVfY29yZV90LCBkaV91aWQpLAorCQlvZmZzZXRvZih4ZnNfZGlub2RlX2NvcmVfdCwgZGlfZ2lkKSwKKwkJb2Zmc2V0b2YoeGZzX2Rpbm9kZV9jb3JlX3QsIGRpX25saW5rKSwKKwkJb2Zmc2V0b2YoeGZzX2Rpbm9kZV9jb3JlX3QsIGRpX3Byb2ppZCksCisJCW9mZnNldG9mKHhmc19kaW5vZGVfY29yZV90LCBkaV9wYWQpLAorCQlvZmZzZXRvZih4ZnNfZGlub2RlX2NvcmVfdCwgZGlfYXRpbWUpLAorCQlvZmZzZXRvZih4ZnNfZGlub2RlX2NvcmVfdCwgZGlfbXRpbWUpLAorCQlvZmZzZXRvZih4ZnNfZGlub2RlX2NvcmVfdCwgZGlfY3RpbWUpLAorCQlvZmZzZXRvZih4ZnNfZGlub2RlX2NvcmVfdCwgZGlfc2l6ZSksCisJCW9mZnNldG9mKHhmc19kaW5vZGVfY29yZV90LCBkaV9uYmxvY2tzKSwKKwkJb2Zmc2V0b2YoeGZzX2Rpbm9kZV9jb3JlX3QsIGRpX2V4dHNpemUpLAorCQlvZmZzZXRvZih4ZnNfZGlub2RlX2NvcmVfdCwgZGlfbmV4dGVudHMpLAorCQlvZmZzZXRvZih4ZnNfZGlub2RlX2NvcmVfdCwgZGlfYW5leHRlbnRzKSwKKwkJb2Zmc2V0b2YoeGZzX2Rpbm9kZV9jb3JlX3QsIGRpX2ZvcmtvZmYpLAorCQlvZmZzZXRvZih4ZnNfZGlub2RlX2NvcmVfdCwgZGlfYWZvcm1hdCksCisJCW9mZnNldG9mKHhmc19kaW5vZGVfY29yZV90LCBkaV9kbWV2bWFzayksCisJCW9mZnNldG9mKHhmc19kaW5vZGVfY29yZV90LCBkaV9kbXN0YXRlKSwKKwkJb2Zmc2V0b2YoeGZzX2Rpbm9kZV9jb3JlX3QsIGRpX2ZsYWdzKSwKKwkJb2Zmc2V0b2YoeGZzX2Rpbm9kZV9jb3JlX3QsIGRpX2dlbiksCisJCW9mZnNldG9mKHhmc19kaW5vZGVfdCwgZGlfbmV4dF91bmxpbmtlZCksCisJCW9mZnNldG9mKHhmc19kaW5vZGVfdCwgZGlfdSksCisJCW9mZnNldG9mKHhmc19kaW5vZGVfdCwgZGlfYSksCisJCXNpemVvZih4ZnNfZGlub2RlX3QpCisJfTsKKworCisJQVNTRVJUKG9mZnNldG9mKHhmc19kaW5vZGVfdCwgZGlfY29yZSkgPT0gMCk7CisJQVNTRVJUKChmaWVsZHMgJiAoWEZTX0RJX1V8WEZTX0RJX0EpKSA9PSAwKTsKKwltcCA9IHRwLT50X21vdW50cDsKKwkvKgorCSAqIEdldCB0aGUgaW5vZGUtcmVsYXRpdmUgZmlyc3QgYW5kIGxhc3QgYnl0ZXMgZm9yIHRoZXNlIGZpZWxkcworCSAqLworCXhmc19idHJlZV9vZmZzZXRzKGZpZWxkcywgb2Zmc2V0cywgWEZTX0RJX05VTV9CSVRTLCAmZmlyc3QsICZsYXN0KTsKKwkvKgorCSAqIENvbnZlcnQgdG8gYnVmZmVyIG9mZnNldHMgYW5kIGxvZyBpdC4KKwkgKi8KKwlpb2Zmc2V0ID0gb2ZmIDw8IG1wLT5tX3NiLnNiX2lub2RlbG9nOworCWZpcnN0ICs9IGlvZmZzZXQ7CisJbGFzdCArPSBpb2Zmc2V0OworCXhmc190cmFuc19sb2dfYnVmKHRwLCBicCwgZmlyc3QsIGxhc3QpOworfQorCisvKgorICogQWxsb2NhdGlvbiBncm91cCBsZXZlbCBmdW5jdGlvbnMuCisgKi8KKworLyoKKyAqIEFsbG9jYXRlIG5ldyBpbm9kZXMgaW4gdGhlIGFsbG9jYXRpb24gZ3JvdXAgc3BlY2lmaWVkIGJ5IGFnYnAuCisgKiBSZXR1cm4gMCBmb3Igc3VjY2VzcywgZWxzZSBlcnJvciBjb2RlLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yIGNvZGUgb3IgMCAqLworeGZzX2lhbGxvY19hZ19hbGxvYygKKwl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2J1Zl90CSphZ2JwLAkJLyogYWxsb2MgZ3JvdXAgYnVmZmVyICovCisJaW50CQkqYWxsb2MpCit7CisJeGZzX2FnaV90CSphZ2k7CQkvKiBhbGxvY2F0aW9uIGdyb3VwIGhlYWRlciAqLworCXhmc19hbGxvY19hcmdfdAlhcmdzOwkJLyogYWxsb2NhdGlvbiBhcmd1bWVudCBzdHJ1Y3R1cmUgKi8KKwlpbnQJCWJsa3NfcGVyX2NsdXN0ZXI7ICAvKiBmcyBibG9ja3MgcGVyIGlub2RlIGNsdXN0ZXIgKi8KKwl4ZnNfYnRyZWVfY3VyX3QJKmN1cjsJCS8qIGlub2RlIGJ0cmVlIGN1cnNvciAqLworCXhmc19kYWRkcl90CWQ7CQkvKiBkaXNrIGFkZHIgb2YgYnVmZmVyICovCisJaW50CQllcnJvcjsKKwl4ZnNfYnVmX3QJKmZidWY7CQkvKiBuZXcgZnJlZSBpbm9kZXMnIGJ1ZmZlciAqLworCXhmc19kaW5vZGVfdAkqZnJlZTsJCS8qIG5ldyBmcmVlIGlub2RlIHN0cnVjdHVyZSAqLworCWludAkJaTsJCS8qIGlub2RlIGNvdW50ZXIgKi8KKwlpbnQJCWo7CQkvKiBibG9jayBjb3VudGVyICovCisJaW50CQluYnVmczsJCS8qIG51bSBidWZzIG9mIG5ldyBpbm9kZXMgKi8KKwl4ZnNfYWdpbm9fdAluZXdpbm87CQkvKiBuZXcgZmlyc3QgaW5vZGUncyBudW1iZXIgKi8KKwl4ZnNfYWdpbm9fdAluZXdsZW47CQkvKiBuZXcgbnVtYmVyIG9mIGlub2RlcyAqLworCWludAkJbmlub2RlczsJLyogbnVtIGlub2RlcyBwZXIgYnVmICovCisJeGZzX2FnaW5vX3QJdGhpc2lubzsJLyogY3VycmVudCBpbm9kZSBudW1iZXIsIGZvciBsb29wICovCisJaW50CQl2ZXJzaW9uOwkvKiBpbm9kZSB2ZXJzaW9uIG51bWJlciB0byB1c2UgKi8KKwlpbnQJCWlzYWxpZ25lZDsJLyogaW5vZGUgYWxsb2NhdGlvbiBhdCBzdHJpcGUgdW5pdCAqLworCQkJCQkvKiBib3VuZGFyeSAqLworCXhmc19kaW5vZGVfY29yZV90IGRpYzsgICAgICAgICAgLyogYSBkaW5vZGVfY29yZSB0byBjb3B5IHRvIG5ldyAqLworCQkJCQkvKiBpbm9kZXMgKi8KKworCWFyZ3MudHAgPSB0cDsKKwlhcmdzLm1wID0gdHAtPnRfbW91bnRwOworCisJLyoKKwkgKiBMb2NraW5nIHdpbGwgZW5zdXJlIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0d28gY2FsbGVycyBpbiBoZXJlCisJICogYXQgb25lIHRpbWUuCisJICovCisJbmV3bGVuID0gWEZTX0lBTExPQ19JTk9ERVMoYXJncy5tcCk7CisJaWYgKGFyZ3MubXAtPm1fbWF4aWNvdW50ICYmCisJICAgIGFyZ3MubXAtPm1fc2Iuc2JfaWNvdW50ICsgbmV3bGVuID4gYXJncy5tcC0+bV9tYXhpY291bnQpCisJCXJldHVybiBYRlNfRVJST1IoRU5PU1BDKTsKKwlhcmdzLm1pbmxlbiA9IGFyZ3MubWF4bGVuID0gWEZTX0lBTExPQ19CTE9DS1MoYXJncy5tcCk7CisJLyoKKwkgKiBTZXQgdGhlIGFsaWdubWVudCBmb3IgdGhlIGFsbG9jYXRpb24uCisJICogSWYgc3RyaXBlIGFsaWdubWVudCBpcyB0dXJuZWQgb24gdGhlbiBhbGlnbiBhdCBzdHJpcGUgdW5pdAorCSAqIGJvdW5kYXJ5LgorCSAqIElmIHRoZSBjbHVzdGVyIHNpemUgaXMgc21hbGxlciB0aGFuIGEgZmlsZXN5c3RlbSBibG9jaworCSAqIHRoZW4gd2UncmUgZG9pbmcgSS9PIGZvciBpbm9kZXMgaW4gZmlsZXN5c3RlbSBibG9jayBzaXplIHBpZWNlcywKKwkgKiBzbyBkb24ndCBuZWVkIGFsaWdubWVudCBhbnl3YXkuCisJICovCisJaXNhbGlnbmVkID0gMDsKKwlpZiAoYXJncy5tcC0+bV9zaW5vYWxpZ24pIHsKKwkJQVNTRVJUKCEoYXJncy5tcC0+bV9mbGFncyAmIFhGU19NT1VOVF9OT0FMSUdOKSk7CisJCWFyZ3MuYWxpZ25tZW50ID0gYXJncy5tcC0+bV9kYWxpZ247CisJCWlzYWxpZ25lZCA9IDE7CisJfSBlbHNlIGlmIChYRlNfU0JfVkVSU0lPTl9IQVNBTElHTigmYXJncy5tcC0+bV9zYikgJiYKKwkgICAgYXJncy5tcC0+bV9zYi5zYl9pbm9hbGlnbm10ID49CisJICAgIFhGU19CX1RPX0ZTQlQoYXJncy5tcCwgWEZTX0lOT0RFX0NMVVNURVJfU0laRShhcmdzLm1wKSkpCisJCWFyZ3MuYWxpZ25tZW50ID0gYXJncy5tcC0+bV9zYi5zYl9pbm9hbGlnbm10OworCWVsc2UKKwkJYXJncy5hbGlnbm1lbnQgPSAxOworCWFnaSA9IFhGU19CVUZfVE9fQUdJKGFnYnApOworCS8qCisJICogTmVlZCB0byBmaWd1cmUgb3V0IHdoZXJlIHRvIGFsbG9jYXRlIHRoZSBpbm9kZSBibG9ja3MuCisJICogSWRlYWxseSB0aGV5IHNob3VsZCBiZSBzcGFjZWQgb3V0IHRocm91Z2ggdGhlIGEuZy4KKwkgKiBGb3Igbm93LCBqdXN0IGFsbG9jYXRlIGJsb2NrcyB1cCBmcm9udC4KKwkgKi8KKwlhcmdzLmFnYm5vID0gSU5UX0dFVChhZ2ktPmFnaV9yb290LCBBUkNIX0NPTlZFUlQpOworCWFyZ3MuZnNibm8gPSBYRlNfQUdCX1RPX0ZTQihhcmdzLm1wLCBJTlRfR0VUKGFnaS0+YWdpX3NlcW5vLCBBUkNIX0NPTlZFUlQpLAorCQkJCSAgICBhcmdzLmFnYm5vKTsKKwkvKgorCSAqIEFsbG9jYXRlIGEgZml4ZWQtc2l6ZSBleHRlbnQgb2YgaW5vZGVzLgorCSAqLworCWFyZ3MudHlwZSA9IFhGU19BTExPQ1RZUEVfTkVBUl9CTk87CisJYXJncy5tb2QgPSBhcmdzLnRvdGFsID0gYXJncy53YXNkZWwgPSBhcmdzLmlzZmwgPSBhcmdzLnVzZXJkYXRhID0KKwkJYXJncy5taW5hbGlnbnNsb3AgPSAwOworCWFyZ3MucHJvZCA9IDE7CisJLyoKKwkgKiBBbGxvdyBzcGFjZSBmb3IgdGhlIGlub2RlIGJ0cmVlIHRvIHNwbGl0LgorCSAqLworCWFyZ3MubWlubGVmdCA9IFhGU19JTl9NQVhMRVZFTFMoYXJncy5tcCkgLSAxOworCWlmICgoZXJyb3IgPSB4ZnNfYWxsb2NfdmV4dGVudCgmYXJncykpKQorCQlyZXR1cm4gZXJyb3I7CisKKwkvKgorCSAqIElmIHN0cmlwZSBhbGlnbm1lbnQgaXMgdHVybmVkIG9uLCB0aGVuIHRyeSBhZ2FpbiB3aXRoIGNsdXN0ZXIKKwkgKiBhbGlnbm1lbnQuCisJICovCisJaWYgKGlzYWxpZ25lZCAmJiBhcmdzLmZzYm5vID09IE5VTExGU0JMT0NLKSB7CisJCWFyZ3MudHlwZSA9IFhGU19BTExPQ1RZUEVfTkVBUl9CTk87CisJCWFyZ3MuYWdibm8gPSBJTlRfR0VUKGFnaS0+YWdpX3Jvb3QsIEFSQ0hfQ09OVkVSVCk7CisJCWFyZ3MuZnNibm8gPSBYRlNfQUdCX1RPX0ZTQihhcmdzLm1wLAorCQkJCUlOVF9HRVQoYWdpLT5hZ2lfc2Vxbm8sIEFSQ0hfQ09OVkVSVCksIGFyZ3MuYWdibm8pOworCQlpZiAoWEZTX1NCX1ZFUlNJT05fSEFTQUxJR04oJmFyZ3MubXAtPm1fc2IpICYmCisJCQlhcmdzLm1wLT5tX3NiLnNiX2lub2FsaWdubXQgPj0KKwkJCVhGU19CX1RPX0ZTQlQoYXJncy5tcCwgWEZTX0lOT0RFX0NMVVNURVJfU0laRShhcmdzLm1wKSkpCisJCQkJYXJncy5hbGlnbm1lbnQgPSBhcmdzLm1wLT5tX3NiLnNiX2lub2FsaWdubXQ7CisJCWVsc2UKKwkJCWFyZ3MuYWxpZ25tZW50ID0gMTsKKwkJaWYgKChlcnJvciA9IHhmc19hbGxvY192ZXh0ZW50KCZhcmdzKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJfQorCisJaWYgKGFyZ3MuZnNibm8gPT0gTlVMTEZTQkxPQ0spIHsKKwkJKmFsbG9jID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCUFTU0VSVChhcmdzLmxlbiA9PSBhcmdzLm1pbmxlbik7CisJLyoKKwkgKiBDb252ZXJ0IHRoZSByZXN1bHRzLgorCSAqLworCW5ld2lubyA9IFhGU19PRkZCTk9fVE9fQUdJTk8oYXJncy5tcCwgYXJncy5hZ2JubywgMCk7CisJLyoKKwkgKiBMb29wIG92ZXIgdGhlIG5ldyBibG9jayhzKSwgZmlsbGluZyBpbiB0aGUgaW5vZGVzLgorCSAqIEZvciBzbWFsbCBibG9jayBzaXplcywgbWFuaXB1bGF0ZSB0aGUgaW5vZGVzIGluIGJ1ZmZlcnMKKwkgKiB3aGljaCBhcmUgbXVsdGlwbGVzIG9mIHRoZSBibG9ja3Mgc2l6ZS4KKwkgKi8KKwlpZiAoYXJncy5tcC0+bV9zYi5zYl9ibG9ja3NpemUgPj0gWEZTX0lOT0RFX0NMVVNURVJfU0laRShhcmdzLm1wKSkgeworCQlibGtzX3Blcl9jbHVzdGVyID0gMTsKKwkJbmJ1ZnMgPSAoaW50KWFyZ3MubGVuOworCQluaW5vZGVzID0gYXJncy5tcC0+bV9zYi5zYl9pbm9wYmxvY2s7CisJfSBlbHNlIHsKKwkJYmxrc19wZXJfY2x1c3RlciA9IFhGU19JTk9ERV9DTFVTVEVSX1NJWkUoYXJncy5tcCkgLworCQkJCSAgIGFyZ3MubXAtPm1fc2Iuc2JfYmxvY2tzaXplOworCQluYnVmcyA9IChpbnQpYXJncy5sZW4gLyBibGtzX3Blcl9jbHVzdGVyOworCQluaW5vZGVzID0gYmxrc19wZXJfY2x1c3RlciAqIGFyZ3MubXAtPm1fc2Iuc2JfaW5vcGJsb2NrOworCX0KKwkvKgorCSAqIEZpZ3VyZSBvdXQgd2hhdCB2ZXJzaW9uIG51bWJlciB0byB1c2UgaW4gdGhlIGlub2RlcyB3ZSBjcmVhdGUuCisJICogSWYgdGhlIHN1cGVyYmxvY2sgdmVyc2lvbiBoYXMgY2F1Z2h0IHVwIHRvIHRoZSBvbmUgdGhhdCBzdXBwb3J0cworCSAqIHRoZSBuZXcgaW5vZGUgZm9ybWF0LCB0aGVuIHVzZSB0aGUgbmV3IGlub2RlIHZlcnNpb24uICBPdGhlcndpc2UKKwkgKiB1c2UgdGhlIG9sZCB2ZXJzaW9uIHNvIHRoYXQgb2xkIGtlcm5lbHMgd2lsbCBjb250aW51ZSB0byBiZQorCSAqIGFibGUgdG8gdXNlIHRoZSBmaWxlIHN5c3RlbS4KKwkgKi8KKwlpZiAoWEZTX1NCX1ZFUlNJT05fSEFTTkxJTksoJmFyZ3MubXAtPm1fc2IpKQorCQl2ZXJzaW9uID0gWEZTX0RJTk9ERV9WRVJTSU9OXzI7CisJZWxzZQorCQl2ZXJzaW9uID0gWEZTX0RJTk9ERV9WRVJTSU9OXzE7CisKKwltZW1zZXQoJmRpYywgMCwgc2l6ZW9mKHhmc19kaW5vZGVfY29yZV90KSk7CisJSU5UX1NFVChkaWMuZGlfbWFnaWMsIEFSQ0hfQ09OVkVSVCwgWEZTX0RJTk9ERV9NQUdJQyk7CisJSU5UX1NFVChkaWMuZGlfdmVyc2lvbiwgQVJDSF9DT05WRVJULCB2ZXJzaW9uKTsKKworCWZvciAoaiA9IDA7IGogPCBuYnVmczsgaisrKSB7CisJCS8qCisJCSAqIEdldCB0aGUgYmxvY2suCisJCSAqLworCQlkID0gWEZTX0FHQl9UT19EQUREUihhcmdzLm1wLCBJTlRfR0VUKGFnaS0+YWdpX3NlcW5vLCBBUkNIX0NPTlZFUlQpLAorCQkJCSAgICAgYXJncy5hZ2JubyArIChqICogYmxrc19wZXJfY2x1c3RlcikpOworCQlmYnVmID0geGZzX3RyYW5zX2dldF9idWYodHAsIGFyZ3MubXAtPm1fZGRldl90YXJncCwgZCwKKwkJCQkJIGFyZ3MubXAtPm1fYnNpemUgKiBibGtzX3Blcl9jbHVzdGVyLAorCQkJCQkgWEZTX0JVRl9MT0NLKTsKKwkJQVNTRVJUKGZidWYpOworCQlBU1NFUlQoIVhGU19CVUZfR0VURVJST1IoZmJ1ZikpOworCQkvKgorCQkgKiBMb29wIG92ZXIgdGhlIGlub2RlcyBpbiB0aGlzIGJ1ZmZlci4KKwkJICovCisKKwkJZm9yIChpID0gMDsgaSA8IG5pbm9kZXM7IGkrKykgeworCQkJZnJlZSA9IFhGU19NQUtFX0lQVFIoYXJncy5tcCwgZmJ1ZiwgaSk7CisJCQltZW1jcHkoJihmcmVlLT5kaV9jb3JlKSwgJmRpYywgc2l6ZW9mKHhmc19kaW5vZGVfY29yZV90KSk7CisJCQlJTlRfU0VUKGZyZWUtPmRpX25leHRfdW5saW5rZWQsIEFSQ0hfQ09OVkVSVCwgTlVMTEFHSU5PKTsKKwkJCXhmc19pYWxsb2NfbG9nX2RpKHRwLCBmYnVmLCBpLAorCQkJCVhGU19ESV9DT1JFX0JJVFMgfCBYRlNfRElfTkVYVF9VTkxJTktFRCk7CisJCX0KKwkJeGZzX3RyYW5zX2lub2RlX2FsbG9jX2J1Zih0cCwgZmJ1Zik7CisJfQorCUlOVF9NT0QoYWdpLT5hZ2lfY291bnQsIEFSQ0hfQ09OVkVSVCwgbmV3bGVuKTsKKwlJTlRfTU9EKGFnaS0+YWdpX2ZyZWVjb3VudCwgQVJDSF9DT05WRVJULCBuZXdsZW4pOworCWRvd25fcmVhZCgmYXJncy5tcC0+bV9wZXJhZ2xvY2spOworCWFyZ3MubXAtPm1fcGVyYWdbSU5UX0dFVChhZ2ktPmFnaV9zZXFubywgQVJDSF9DT05WRVJUKV0ucGFnaV9mcmVlY291bnQgKz0gbmV3bGVuOworCXVwX3JlYWQoJmFyZ3MubXAtPm1fcGVyYWdsb2NrKTsKKwlJTlRfU0VUKGFnaS0+YWdpX25ld2lubywgQVJDSF9DT05WRVJULCBuZXdpbm8pOworCS8qCisJICogSW5zZXJ0IHJlY29yZHMgZGVzY3JpYmluZyB0aGUgbmV3IGlub2RlIGNodW5rIGludG8gdGhlIGJ0cmVlLgorCSAqLworCWN1ciA9IHhmc19idHJlZV9pbml0X2N1cnNvcihhcmdzLm1wLCB0cCwgYWdicCwKKwkJCUlOVF9HRVQoYWdpLT5hZ2lfc2Vxbm8sIEFSQ0hfQ09OVkVSVCksCisJCQlYRlNfQlROVU1fSU5PLCAoeGZzX2lub2RlX3QgKikwLCAwKTsKKwlmb3IgKHRoaXNpbm8gPSBuZXdpbm87CisJICAgICB0aGlzaW5vIDwgbmV3aW5vICsgbmV3bGVuOworCSAgICAgdGhpc2lubyArPSBYRlNfSU5PREVTX1BFUl9DSFVOSykgeworCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2xvb2t1cF9lcShjdXIsIHRoaXNpbm8sCisJCQkJWEZTX0lOT0RFU19QRVJfQ0hVTkssIFhGU19JTk9CVF9BTExfRlJFRSwgJmkpKSkgeworCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY3VyLCBYRlNfQlRSRUVfRVJST1IpOworCQkJcmV0dXJuIGVycm9yOworCQl9CisJCUFTU0VSVChpID09IDApOworCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2luc2VydChjdXIsICZpKSkpIHsKKwkJCXhmc19idHJlZV9kZWxfY3Vyc29yKGN1ciwgWEZTX0JUUkVFX0VSUk9SKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQlBU1NFUlQoaSA9PSAxKTsKKwl9CisJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY3VyLCBYRlNfQlRSRUVfTk9FUlJPUik7CisJLyoKKwkgKiBMb2cgYWxsb2NhdGlvbiBncm91cCBoZWFkZXIgZmllbGRzCisJICovCisJeGZzX2lhbGxvY19sb2dfYWdpKHRwLCBhZ2JwLAorCQlYRlNfQUdJX0NPVU5UIHwgWEZTX0FHSV9GUkVFQ09VTlQgfCBYRlNfQUdJX05FV0lOTyk7CisJLyoKKwkgKiBNb2RpZnkvbG9nIHN1cGVyYmxvY2sgdmFsdWVzIGZvciBpbm9kZSBjb3VudCBhbmQgaW5vZGUgZnJlZSBjb3VudC4KKwkgKi8KKwl4ZnNfdHJhbnNfbW9kX3NiKHRwLCBYRlNfVFJBTlNfU0JfSUNPVU5ULCAobG9uZyluZXdsZW4pOworCXhmc190cmFuc19tb2Rfc2IodHAsIFhGU19UUkFOU19TQl9JRlJFRSwgKGxvbmcpbmV3bGVuKTsKKwkqYWxsb2MgPSAxOworCXJldHVybiAwOworfQorCitTVEFUSUMgX19pbmxpbmUgeGZzX2FnbnVtYmVyX3QKK3hmc19pYWxsb2NfbmV4dF9hZygKKwl4ZnNfbW91bnRfdAkqbXApCit7CisJeGZzX2FnbnVtYmVyX3QJYWdubzsKKworCXNwaW5fbG9jaygmbXAtPm1fYWdpcm90b3JfbG9jayk7CisJYWdubyA9IG1wLT5tX2FnaXJvdG9yOworCWlmICgrK21wLT5tX2FnaXJvdG9yID09IG1wLT5tX21heGFnaSkKKwkJbXAtPm1fYWdpcm90b3IgPSAwOworCXNwaW5fdW5sb2NrKCZtcC0+bV9hZ2lyb3Rvcl9sb2NrKTsKKworCXJldHVybiBhZ25vOworfQorCisvKgorICogU2VsZWN0IGFuIGFsbG9jYXRpb24gZ3JvdXAgdG8gbG9vayBmb3IgYSBmcmVlIGlub2RlIGluLCBiYXNlZCBvbiB0aGUgcGFyZW50CisgKiBpbm9kZSBhbmQgdGhlbiBtb2RlLiAgUmV0dXJuIHRoZSBhbGxvY2F0aW9uIGdyb3VwIGJ1ZmZlci4KKyAqLworU1RBVElDIHhmc19idWZfdCAqCQkJLyogYWxsb2NhdGlvbiBncm91cCBidWZmZXIgKi8KK3hmc19pYWxsb2NfYWdfc2VsZWN0KAorCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfaW5vX3QJcGFyZW50LAkJLyogcGFyZW50IGRpcmVjdG9yeSBpbm9kZSBudW1iZXIgKi8KKwltb2RlX3QJCW1vZGUsCQkvKiBiaXRzIHNldCB0byBpbmRpY2F0ZSBmaWxlIHR5cGUgKi8KKwlpbnQJCW9rYWxsb2MpCS8qIG9rIHRvIGFsbG9jYXRlIG1vcmUgc3BhY2UgKi8KK3sKKwl4ZnNfYnVmX3QJKmFnYnA7CQkvKiBhbGxvY2F0aW9uIGdyb3VwIGhlYWRlciBidWZmZXIgKi8KKwl4ZnNfYWdudW1iZXJfdAlhZ2NvdW50OwkvKiBudW1iZXIgb2YgYWcncyBpbiB0aGUgZmlsZXN5c3RlbSAqLworCXhmc19hZ251bWJlcl90CWFnbm87CQkvKiBjdXJyZW50IGFnIG51bWJlciAqLworCWludAkJZmxhZ3M7CQkvKiBhbGxvYyBidWZmZXIgbG9ja2luZyBmbGFncyAqLworCXhmc19leHRsZW5fdAlpbmVlZDsJCS8qIGJsb2NrcyBuZWVkZWQgZm9yIGlub2RlIGFsbG9jYXRpb24gKi8KKwl4ZnNfZXh0bGVuX3QJbG9uZ2VzdCA9IDA7CS8qIGxvbmdlc3QgZXh0ZW50IGF2YWlsYWJsZSAqLworCXhmc19tb3VudF90CSptcDsJCS8qIG1vdW50IHBvaW50IHN0cnVjdHVyZSAqLworCWludAkJbmVlZHNwYWNlOwkvKiBmaWxlIG1vZGUgaW1wbGllcyBzcGFjZSBhbGxvY2F0ZWQgKi8KKwl4ZnNfcGVyYWdfdAkqcGFnOwkJLyogcGVyIGFsbG9jYXRpb24gZ3JvdXAgZGF0YSAqLworCXhmc19hZ251bWJlcl90CXBhZ25vOwkJLyogcGFyZW50IChzdGFydGluZykgYWcgbnVtYmVyICovCisKKwkvKgorCSAqIEZpbGVzIG9mIHRoZXNlIHR5cGVzIG5lZWQgYXQgbGVhc3Qgb25lIGJsb2NrIGlmIGxlbmd0aCA+IDAKKwkgKiAoYW5kIHRoZXkgd29uJ3QgZml0IGluIHRoZSBpbm9kZSwgYnV0IHRoYXQncyBoYXJkIHRvIGZpZ3VyZSBvdXQpLgorCSAqLworCW5lZWRzcGFjZSA9IFNfSVNESVIobW9kZSkgfHwgU19JU1JFRyhtb2RlKSB8fCBTX0lTTE5LKG1vZGUpOworCW1wID0gdHAtPnRfbW91bnRwOworCWFnY291bnQgPSBtcC0+bV9tYXhhZ2k7CisJaWYgKFNfSVNESVIobW9kZSkpCisJCXBhZ25vID0geGZzX2lhbGxvY19uZXh0X2FnKG1wKTsKKwllbHNlIHsKKwkJcGFnbm8gPSBYRlNfSU5PX1RPX0FHTk8obXAsIHBhcmVudCk7CisJCWlmIChwYWdubyA+PSBhZ2NvdW50KQorCQkJcGFnbm8gPSAwOworCX0KKwlBU1NFUlQocGFnbm8gPCBhZ2NvdW50KTsKKwkvKgorCSAqIExvb3AgdGhyb3VnaCBhbGxvY2F0aW9uIGdyb3VwcywgbG9va2luZyBmb3Igb25lIHdpdGggYSBsaXR0bGUKKwkgKiBmcmVlIHNwYWNlIGluIGl0LiAgTm90ZSB3ZSBkb24ndCBsb29rIGZvciBmcmVlIGlub2RlcywgZXhhY3RseS4KKwkgKiBJbnN0ZWFkLCB3ZSBpbmNsdWRlIHdoZXRoZXIgdGhlcmUgaXMgYSBuZWVkIHRvIGFsbG9jYXRlIGlub2RlcworCSAqIHRvIG1lYW4gdGhhdCBibG9ja3MgbXVzdCBiZSBhbGxvY2F0ZWQgZm9yIHRoZW0sCisJICogaWYgbm9uZSBhcmUgY3VycmVudGx5IGZyZWUuCisJICovCisJYWdubyA9IHBhZ25vOworCWZsYWdzID0gWEZTX0FMTE9DX0ZMQUdfVFJZTE9DSzsKKwlkb3duX3JlYWQoJm1wLT5tX3BlcmFnbG9jayk7CisJZm9yICg7OykgeworCQlwYWcgPSAmbXAtPm1fcGVyYWdbYWdub107CisJCWlmICghcGFnLT5wYWdpX2luaXQpIHsKKwkJCWlmICh4ZnNfaWFsbG9jX3JlYWRfYWdpKG1wLCB0cCwgYWdubywgJmFnYnApKSB7CisJCQkJYWdicCA9IE5VTEw7CisJCQkJZ290byBuZXh0YWc7CisJCQl9CisJCX0gZWxzZQorCQkJYWdicCA9IE5VTEw7CisKKwkJaWYgKCFwYWctPnBhZ2lfaW5vZGVvaykgeworCQkJeGZzX2lhbGxvY19uZXh0X2FnKG1wKTsKKwkJCWdvdG8gdW5sb2NrX25leHRhZzsKKwkJfQorCisJCS8qCisJCSAqIElzIHRoZXJlIGVub3VnaCBmcmVlIHNwYWNlIGZvciB0aGUgZmlsZSBwbHVzIGEgYmxvY2sKKwkJICogb2YgaW5vZGVzIChpZiB3ZSBuZWVkIHRvIGFsbG9jYXRlIHNvbWUpPworCQkgKi8KKwkJaW5lZWQgPSBwYWctPnBhZ2lfZnJlZWNvdW50ID8gMCA6IFhGU19JQUxMT0NfQkxPQ0tTKG1wKTsKKwkJaWYgKGluZWVkICYmICFwYWctPnBhZ2ZfaW5pdCkgeworCQkJaWYgKGFnYnAgPT0gTlVMTCAmJgorCQkJICAgIHhmc19pYWxsb2NfcmVhZF9hZ2kobXAsIHRwLCBhZ25vLCAmYWdicCkpIHsKKwkJCQlhZ2JwID0gTlVMTDsKKwkJCQlnb3RvIG5leHRhZzsKKwkJCX0KKwkJCSh2b2lkKXhmc19hbGxvY19wYWdmX2luaXQobXAsIHRwLCBhZ25vLCBmbGFncyk7CisJCX0KKwkJaWYgKCFpbmVlZCB8fCBwYWctPnBhZ2ZfaW5pdCkgeworCQkJaWYgKGluZWVkICYmICEobG9uZ2VzdCA9IHBhZy0+cGFnZl9sb25nZXN0KSkKKwkJCQlsb25nZXN0ID0gcGFnLT5wYWdmX2ZsY291bnQgPiAwOworCQkJaWYgKCFpbmVlZCB8fAorCQkJICAgIChwYWctPnBhZ2ZfZnJlZWJsa3MgPj0gbmVlZHNwYWNlICsgaW5lZWQgJiYKKwkJCSAgICAgbG9uZ2VzdCA+PSBpbmVlZCAmJgorCQkJICAgICBva2FsbG9jKSkgeworCQkJCWlmIChhZ2JwID09IE5VTEwgJiYKKwkJCQkgICAgeGZzX2lhbGxvY19yZWFkX2FnaShtcCwgdHAsIGFnbm8sICZhZ2JwKSkgeworCQkJCQlhZ2JwID0gTlVMTDsKKwkJCQkJZ290byBuZXh0YWc7CisJCQkJfQorCQkJCXVwX3JlYWQoJm1wLT5tX3BlcmFnbG9jayk7CisJCQkJcmV0dXJuIGFnYnA7CisJCQl9CisJCX0KK3VubG9ja19uZXh0YWc6CisJCWlmIChhZ2JwKQorCQkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYWdicCk7CituZXh0YWc6CisJCS8qCisJCSAqIE5vIHBvaW50IGluIGl0ZXJhdGluZyBvdmVyIHRoZSByZXN0LCBpZiB3ZSdyZSBzaHV0dGluZworCQkgKiBkb3duLgorCQkgKi8KKwkJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKSB7CisJCQl1cF9yZWFkKCZtcC0+bV9wZXJhZ2xvY2spOworCQkJcmV0dXJuICh4ZnNfYnVmX3QgKikwOworCQl9CisJCWFnbm8rKzsKKwkJaWYgKGFnbm8gPj0gYWdjb3VudCkKKwkJCWFnbm8gPSAwOworCQlpZiAoYWdubyA9PSBwYWdubykgeworCQkJaWYgKGZsYWdzID09IDApIHsKKwkJCQl1cF9yZWFkKCZtcC0+bV9wZXJhZ2xvY2spOworCQkJCXJldHVybiAoeGZzX2J1Zl90ICopMDsKKwkJCX0KKwkJCWZsYWdzID0gMDsKKwkJfQorCX0KK30KKworLyoKKyAqIFZpc2libGUgaW5vZGUgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCisgKi8KKworLyoKKyAqIEFsbG9jYXRlIGFuIGlub2RlIG9uIGRpc2suCisgKiBNb2RlIGlzIHVzZWQgdG8gdGVsbCB3aGV0aGVyIHRoZSBuZXcgaW5vZGUgd2lsbCBuZWVkIHNwYWNlLCBhbmQgd2hldGhlcgorICogaXQgaXMgYSBkaXJlY3RvcnkuCisgKgorICogVGhlIGFyZ3VtZW50cyBJT19hZ2JwIGFuZCBhbGxvY19kb25lIGFyZSBkZWZpbmVkIHRvIHdvcmsgd2l0aGluCisgKiB0aGUgY29uc3RyYWludCBvZiBvbmUgYWxsb2NhdGlvbiBwZXIgdHJhbnNhY3Rpb24uCisgKiB4ZnNfZGlhbGxvYygpIGlzIGRlc2lnbmVkIHRvIGJlIGNhbGxlZCB0d2ljZSBpZiBpdCBoYXMgdG8gZG8gYW4KKyAqIGFsbG9jYXRpb24gdG8gbWFrZSBtb3JlIGZyZWUgaW5vZGVzLiAgT24gdGhlIGZpcnN0IGNhbGwsCisgKiBJT19hZ2JwIHNob3VsZCBiZSBzZXQgdG8gTlVMTC4gSWYgYW4gaW5vZGUgaXMgYXZhaWxhYmxlLAorICogaS5lLiwgeGZzX2RpYWxsb2MoKSBkaWQgbm90IG5lZWQgdG8gZG8gYW4gYWxsb2NhdGlvbiwgYW4gaW5vZGUKKyAqIG51bWJlciBpcyByZXR1cm5lZC4gIEluIHRoaXMgY2FzZSwgSU9fYWdicCB3b3VsZCBiZSBzZXQgdG8gdGhlCisgKiBjdXJyZW50IGFnX2J1ZiBhbmQgYWxsb2NfZG9uZSBzZXQgdG8gZmFsc2UuCisgKiBJZiBhbiBhbGxvY2F0aW9uIG5lZWRlZCB0byBiZSBkb25lLCB4ZnNfZGlhbGxvYyB3b3VsZCByZXR1cm4KKyAqIHRoZSBjdXJyZW50IGFnX2J1ZiBpbiBJT19hZ2JwIGFuZCBzZXQgYWxsb2NfZG9uZSB0byB0cnVlLgorICogVGhlIGNhbGxlciBzaG91bGQgdGhlbiBjb21taXQgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24sIGFsbG9jYXRlIGEgbmV3CisgKiB0cmFuc2FjdGlvbiwgYW5kIGNhbGwgeGZzX2RpYWxsb2MoKSBhZ2FpbiwgcGFzc2luZyBpbiB0aGUgcHJldmlvdXMKKyAqIHZhbHVlIG9mIElPX2FnYnAuICBJT19hZ2JwIHNob3VsZCBiZSBoZWxkIGFjcm9zcyB0aGUgdHJhbnNhY3Rpb25zLgorICogU2luY2UgdGhlIGFnYnAgaXMgbG9ja2VkIGFjcm9zcyB0aGUgdHdvIGNhbGxzLCB0aGUgc2Vjb25kIGNhbGwgaXMKKyAqIGd1YXJhbnRlZWQgdG8gaGF2ZSBhIGZyZWUgaW5vZGUgYXZhaWxhYmxlLgorICoKKyAqIE9uY2Ugd2Ugc3VjY2Vzc2Z1bGx5IHBpY2sgYW4gaW5vZGUgaXRzIG51bWJlciBpcyByZXR1cm5lZCBhbmQgdGhlCisgKiBvbi1kaXNrIGRhdGEgc3RydWN0dXJlcyBhcmUgdXBkYXRlZC4gIFRoZSBpbm9kZSBpdHNlbGYgaXMgbm90IHJlYWQKKyAqIGluLCBzaW5jZSBkb2luZyBzbyB3b3VsZCBicmVhayBvcmRlcmluZyBjb25zdHJhaW50cyB3aXRoIHhmc19yZWNsYWltLgorICovCitpbnQKK3hmc19kaWFsbG9jKAorCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfaW5vX3QJcGFyZW50LAkJLyogcGFyZW50IGlub2RlIChkaXJlY3RvcnkpICovCisJbW9kZV90CQltb2RlLAkJLyogbW9kZSBiaXRzIGZvciBuZXcgaW5vZGUgKi8KKwlpbnQJCW9rYWxsb2MsCS8qIG9rIHRvIGFsbG9jYXRlIG1vcmUgc3BhY2UgKi8KKwl4ZnNfYnVmX3QJKipJT19hZ2JwLAkvKiBpbi9vdXQgYWcgaGVhZGVyJ3MgYnVmZmVyICovCisJYm9vbGVhbl90CSphbGxvY19kb25lLAkvKiB0cnVlIGlmIHdlIG5lZWRlZCB0byByZXBsZW5pc2gKKwkJCQkJICAgaW5vZGUgZnJlZWxpc3QgKi8KKwl4ZnNfaW5vX3QJKmlub3ApCQkvKiBpbm9kZSBudW1iZXIgYWxsb2NhdGVkICovCit7CisJeGZzX2FnbnVtYmVyX3QJYWdjb3VudDsJLyogbnVtYmVyIG9mIGFsbG9jYXRpb24gZ3JvdXBzICovCisJeGZzX2J1Zl90CSphZ2JwOwkJLyogYWxsb2NhdGlvbiBncm91cCBoZWFkZXIncyBidWZmZXIgKi8KKwl4ZnNfYWdudW1iZXJfdAlhZ25vOwkJLyogYWxsb2NhdGlvbiBncm91cCBudW1iZXIgKi8KKwl4ZnNfYWdpX3QJKmFnaTsJCS8qIGFsbG9jYXRpb24gZ3JvdXAgaGVhZGVyIHN0cnVjdHVyZSAqLworCXhmc19idHJlZV9jdXJfdAkqY3VyOwkJLyogaW5vZGUgYWxsb2NhdGlvbiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCWVycm9yOwkJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJaW50CQlpOwkJLyogcmVzdWx0IGNvZGUgKi8KKwlpbnQJCWlhbGxvY2VkOwkvKiBpbm9kZSBhbGxvY2F0aW9uIHN0YXR1cyAqLworCWludAkJbm9yb29tID0gMDsJLyogbm8gc3BhY2UgZm9yIGlub2RlIGJsayBhbGxvY2F0aW9uICovCisJeGZzX2lub190CWlubzsJCS8qIGZzLXJlbGF0aXZlIGlub2RlIHRvIGJlIHJldHVybmVkICovCisJLyogUkVGRVJFTkNFRCAqLworCWludAkJajsJCS8qIHJlc3VsdCBjb2RlICovCisJeGZzX21vdW50X3QJKm1wOwkJLyogZmlsZSBzeXN0ZW0gbW91bnQgc3RydWN0dXJlICovCisJaW50CQlvZmZzZXQ7CQkvKiBpbmRleCBvZiBpbm9kZSBpbiBjaHVuayAqLworCXhmc19hZ2lub190CXBhZ2lubzsJCS8qIHBhcmVudCdzIGEuZy4gcmVsYXRpdmUgaW5vZGUgIyAqLworCXhmc19hZ251bWJlcl90CXBhZ25vOwkJLyogcGFyZW50J3MgYWxsb2NhdGlvbiBncm91cCBudW1iZXIgKi8KKwl4ZnNfaW5vYnRfcmVjX3QJcmVjOwkJLyogaW5vZGUgYWxsb2NhdGlvbiByZWNvcmQgKi8KKwl4ZnNfYWdudW1iZXJfdAl0YWdubzsJCS8qIHRlc3RpbmcgYWxsb2NhdGlvbiBncm91cCBudW1iZXIgKi8KKwl4ZnNfYnRyZWVfY3VyX3QJKnRjdXI7CQkvKiB0ZW1wIGN1cnNvciAqLworCXhmc19pbm9idF9yZWNfdAl0cmVjOwkJLyogdGVtcCBpbm9kZSBhbGxvY2F0aW9uIHJlY29yZCAqLworCisKKwlpZiAoKklPX2FnYnAgPT0gTlVMTCkgeworCQkvKgorCQkgKiBXZSBkbyBub3QgaGF2ZSBhbiBhZ2JwLCBzbyBzZWxlY3QgYW4gaW5pdGlhbCBhbGxvY2F0aW9uCisJCSAqIGdyb3VwIGZvciBpbm9kZSBhbGxvY2F0aW9uLgorCQkgKi8KKwkJYWdicCA9IHhmc19pYWxsb2NfYWdfc2VsZWN0KHRwLCBwYXJlbnQsIG1vZGUsIG9rYWxsb2MpOworCQkvKgorCQkgKiBDb3VsZG4ndCBmaW5kIGFuIGFsbG9jYXRpb24gZ3JvdXAgc2F0aXNmeWluZyB0aGUKKwkJICogY3JpdGVyaWEsIGdpdmUgdXAuCisJCSAqLworCQlpZiAoIWFnYnApIHsKKwkJCSppbm9wID0gTlVMTEZTSU5POworCQkJcmV0dXJuIDA7CisJCX0KKwkJYWdpID0gWEZTX0JVRl9UT19BR0koYWdicCk7CisJCUFTU0VSVChJTlRfR0VUKGFnaS0+YWdpX21hZ2ljbnVtLCBBUkNIX0NPTlZFUlQpID09IFhGU19BR0lfTUFHSUMpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIENvbnRpbnVlIHdoZXJlIHdlIGxlZnQgb2ZmIGJlZm9yZS4gIEluIHRoaXMgY2FzZSwgd2UKKwkJICoga25vdyB0aGF0IHRoZSBhbGxvY2F0aW9uIGdyb3VwIGhhcyBmcmVlIGlub2Rlcy4KKwkJICovCisJCWFnYnAgPSAqSU9fYWdicDsKKwkJYWdpID0gWEZTX0JVRl9UT19BR0koYWdicCk7CisJCUFTU0VSVChJTlRfR0VUKGFnaS0+YWdpX21hZ2ljbnVtLCBBUkNIX0NPTlZFUlQpID09IFhGU19BR0lfTUFHSUMpOworCQlBU1NFUlQoSU5UX0dFVChhZ2ktPmFnaV9mcmVlY291bnQsIEFSQ0hfQ09OVkVSVCkgPiAwKTsKKwl9CisJbXAgPSB0cC0+dF9tb3VudHA7CisJYWdjb3VudCA9IG1wLT5tX3NiLnNiX2FnY291bnQ7CisJYWdubyA9IElOVF9HRVQoYWdpLT5hZ2lfc2Vxbm8sIEFSQ0hfQ09OVkVSVCk7CisJdGFnbm8gPSBhZ25vOworCXBhZ25vID0gWEZTX0lOT19UT19BR05PKG1wLCBwYXJlbnQpOworCXBhZ2lubyA9IFhGU19JTk9fVE9fQUdJTk8obXAsIHBhcmVudCk7CisKKwkvKgorCSAqIElmIHdlIGhhdmUgYWxyZWFkeSBoaXQgdGhlIGNlaWxpbmcgb2YgaW5vZGUgYmxvY2tzIHRoZW4gY2xlYXIKKwkgKiBva2FsbG9jIHNvIHdlIHNjYW4gYWxsIGF2YWlsYWJsZSBhZ2kgc3RydWN0dXJlcyBmb3IgYSBmcmVlCisJICogaW5vZGUuCisJICovCisKKwlpZiAobXAtPm1fbWF4aWNvdW50ICYmCisJICAgIG1wLT5tX3NiLnNiX2ljb3VudCArIFhGU19JQUxMT0NfSU5PREVTKG1wKSA+IG1wLT5tX21heGljb3VudCkgeworCQlub3Jvb20gPSAxOworCQlva2FsbG9jID0gMDsKKwl9CisKKwkvKgorCSAqIExvb3AgdW50aWwgd2UgZmluZCBhbiBhbGxvY2F0aW9uIGdyb3VwIHRoYXQgZWl0aGVyIGhhcyBmcmVlIGlub2RlcworCSAqIG9yIGluIHdoaWNoIHdlIGNhbiBhbGxvY2F0ZSBzb21lIGlub2Rlcy4gIEl0ZXJhdGUgdGhyb3VnaCB0aGUKKwkgKiBhbGxvY2F0aW9uIGdyb3VwcyB1cHdhcmQsIHdyYXBwaW5nIGF0IHRoZSBlbmQuCisJICovCisJKmFsbG9jX2RvbmUgPSBCX0ZBTFNFOworCXdoaWxlICghYWdpLT5hZ2lfZnJlZWNvdW50KSB7CisJCS8qCisJCSAqIERvbid0IGRvIGFueXRoaW5nIGlmIHdlJ3JlIG5vdCBzdXBwb3NlZCB0byBhbGxvY2F0ZQorCQkgKiBhbnkgYmxvY2tzLCBqdXN0IGdvIG9uIHRvIHRoZSBuZXh0IGFnLgorCQkgKi8KKwkJaWYgKG9rYWxsb2MpIHsKKwkJCS8qCisJCQkgKiBUcnkgdG8gYWxsb2NhdGUgc29tZSBuZXcgaW5vZGVzIGluIHRoZSBhbGxvY2F0aW9uCisJCQkgKiBncm91cC4KKwkJCSAqLworCQkJaWYgKChlcnJvciA9IHhmc19pYWxsb2NfYWdfYWxsb2ModHAsIGFnYnAsICZpYWxsb2NlZCkpKSB7CisJCQkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYWdicCk7CisJCQkJaWYgKGVycm9yID09IEVOT1NQQykgeworCQkJCQkqaW5vcCA9IE5VTExGU0lOTzsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfSBlbHNlCisJCQkJCXJldHVybiBlcnJvcjsKKwkJCX0KKwkJCWlmIChpYWxsb2NlZCkgeworCQkJCS8qCisJCQkJICogV2Ugc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZCBzb21lIGlub2RlcywgcmV0dXJuCisJCQkJICogdGhlIGN1cnJlbnQgY29udGV4dCB0byB0aGUgY2FsbGVyIHNvIHRoYXQgaXQKKwkJCQkgKiBjYW4gY29tbWl0IHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGFuZCBjYWxsCisJCQkJICogdXMgYWdhaW4gd2hlcmUgd2UgbGVmdCBvZmYuCisJCQkJICovCisJCQkJQVNTRVJUKElOVF9HRVQoYWdpLT5hZ2lfZnJlZWNvdW50LCBBUkNIX0NPTlZFUlQpID4gMCk7CisJCQkJKmFsbG9jX2RvbmUgPSBCX1RSVUU7CisJCQkJKklPX2FnYnAgPSBhZ2JwOworCQkJCSppbm9wID0gTlVMTEZTSU5POworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJCS8qCisJCSAqIElmIGl0IGZhaWxlZCwgZ2l2ZSB1cCBvbiB0aGlzIGFnLgorCQkgKi8KKwkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYWdicCk7CisJCS8qCisJCSAqIEdvIG9uIHRvIHRoZSBuZXh0IGFnOiBnZXQgaXRzIGFnIGhlYWRlci4KKwkJICovCituZXh0YWc6CisJCWlmICgrK3RhZ25vID09IGFnY291bnQpCisJCQl0YWdubyA9IDA7CisJCWlmICh0YWdubyA9PSBhZ25vKSB7CisJCQkqaW5vcCA9IE5VTExGU0lOTzsKKwkJCXJldHVybiBub3Jvb20gPyBFTk9TUEMgOiAwOworCQl9CisJCWRvd25fcmVhZCgmbXAtPm1fcGVyYWdsb2NrKTsKKwkJaWYgKG1wLT5tX3BlcmFnW3RhZ25vXS5wYWdpX2lub2Rlb2sgPT0gMCkgeworCQkJdXBfcmVhZCgmbXAtPm1fcGVyYWdsb2NrKTsKKwkJCWdvdG8gbmV4dGFnOworCQl9CisJCWVycm9yID0geGZzX2lhbGxvY19yZWFkX2FnaShtcCwgdHAsIHRhZ25vLCAmYWdicCk7CisJCXVwX3JlYWQoJm1wLT5tX3BlcmFnbG9jayk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gbmV4dGFnOworCQlhZ2kgPSBYRlNfQlVGX1RPX0FHSShhZ2JwKTsKKwkJQVNTRVJUKElOVF9HRVQoYWdpLT5hZ2lfbWFnaWNudW0sIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0FHSV9NQUdJQyk7CisJfQorCS8qCisJICogSGVyZSB3aXRoIGFuIGFsbG9jYXRpb24gZ3JvdXAgdGhhdCBoYXMgYSBmcmVlIGlub2RlLgorCSAqIFJlc2V0IGFnbm8gc2luY2Ugd2UgbWF5IGhhdmUgY2hvc2VuIGEgbmV3IGFnIGluIHRoZQorCSAqIGxvb3AgYWJvdmUuCisJICovCisJYWdubyA9IHRhZ25vOworCSpJT19hZ2JwID0gTlVMTDsKKwljdXIgPSB4ZnNfYnRyZWVfaW5pdF9jdXJzb3IobXAsIHRwLCBhZ2JwLCBJTlRfR0VUKGFnaS0+YWdpX3NlcW5vLCBBUkNIX0NPTlZFUlQpLAorCQkJCSAgICBYRlNfQlROVU1fSU5PLCAoeGZzX2lub2RlX3QgKikwLCAwKTsKKwkvKgorCSAqIElmIHBhZ2lubyBpcyAwICh0aGlzIGlzIHRoZSByb290IGlub2RlIGFsbG9jYXRpb24pIHVzZSBuZXdpbm8uCisJICogVGhpcyBtdXN0IHdvcmsgYmVjYXVzZSB3ZSd2ZSBqdXN0IGFsbG9jYXRlZCBzb21lLgorCSAqLworCWlmICghcGFnaW5vKQorCQlwYWdpbm8gPSBJTlRfR0VUKGFnaS0+YWdpX25ld2lubywgQVJDSF9DT05WRVJUKTsKKyNpZmRlZiBERUJVRworCWlmIChjdXItPmJjX25sZXZlbHMgPT0gMSkgeworCQlpbnQJZnJlZWNvdW50ID0gMDsKKworCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2xvb2t1cF9nZShjdXIsIDAsIDAsIDAsICZpKSkpCisJCQlnb3RvIGVycm9yMDsKKwkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCQlkbyB7CisJCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2dldF9yZWMoY3VyLCAmcmVjLmlyX3N0YXJ0aW5vLAorCQkJCQkmcmVjLmlyX2ZyZWVjb3VudCwgJnJlYy5pcl9mcmVlLCAmaSkpKQorCQkJCWdvdG8gZXJyb3IwOworCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCQkJZnJlZWNvdW50ICs9IHJlYy5pcl9mcmVlY291bnQ7CisJCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2luY3JlbWVudChjdXIsIDAsICZpKSkpCisJCQkJZ290byBlcnJvcjA7CisJCX0gd2hpbGUgKGkgPT0gMSk7CisKKwkJQVNTRVJUKGZyZWVjb3VudCA9PSBJTlRfR0VUKGFnaS0+YWdpX2ZyZWVjb3VudCwgQVJDSF9DT05WRVJUKSB8fAorCQkgICAgICAgWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpOworCX0KKyNlbmRpZgorCS8qCisJICogSWYgaW4gdGhlIHNhbWUgYS5nLiBhcyB0aGUgcGFyZW50LCB0cnkgdG8gZ2V0IG5lYXIgdGhlIHBhcmVudC4KKwkgKi8KKwlpZiAocGFnbm8gPT0gYWdubykgeworCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2xvb2t1cF9sZShjdXIsIHBhZ2lubywgMCwgMCwgJmkpKSkKKwkJCWdvdG8gZXJyb3IwOworCQlpZiAoaSAhPSAwICYmCisJCSAgICAoZXJyb3IgPSB4ZnNfaW5vYnRfZ2V0X3JlYyhjdXIsICZyZWMuaXJfc3RhcnRpbm8sCisJCQkgICAgJnJlYy5pcl9mcmVlY291bnQsICZyZWMuaXJfZnJlZSwgJmopKSA9PSAwICYmCisJCSAgICBqID09IDEgJiYKKwkJICAgIHJlYy5pcl9mcmVlY291bnQgPiAwKSB7CisJCQkvKgorCQkJICogRm91bmQgYSBmcmVlIGlub2RlIGluIHRoZSBzYW1lIGNodW5rCisJCQkgKiBhcyBwYXJlbnQsIGRvbmUuCisJCQkgKi8KKwkJfQorCQkvKgorCQkgKiBJbiB0aGUgc2FtZSBhLmcuIGFzIHBhcmVudCwgYnV0IHBhcmVudCdzIGNodW5rIGlzIGZ1bGwuCisJCSAqLworCQllbHNlIHsKKwkJCWludAlkb25lbGVmdDsJLyogZG9uZSwgdG8gdGhlIGxlZnQgKi8KKwkJCWludAlkb25lcmlnaHQ7CS8qIGRvbmUsIHRvIHRoZSByaWdodCAqLworCisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBlcnJvcjA7CisJCQlBU1NFUlQoaSA9PSAxKTsKKwkJCUFTU0VSVChqID09IDEpOworCQkJLyoKKwkJCSAqIER1cGxpY2F0ZSB0aGUgY3Vyc29yLCBzZWFyY2ggbGVmdCAmIHJpZ2h0CisJCQkgKiBzaW11bHRhbmVvdXNseS4KKwkJCSAqLworCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9kdXBfY3Vyc29yKGN1ciwgJnRjdXIpKSkKKwkJCQlnb3RvIGVycm9yMDsKKwkJCS8qCisJCQkgKiBTZWFyY2ggbGVmdCB3aXRoIHRjdXIsIGJhY2sgdXAgMSByZWNvcmQuCisJCQkgKi8KKwkJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfZGVjcmVtZW50KHRjdXIsIDAsICZpKSkpCisJCQkJZ290byBlcnJvcjE7CisJCQlkb25lbGVmdCA9ICFpOworCQkJaWYgKCFkb25lbGVmdCkgeworCQkJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfZ2V0X3JlYyh0Y3VyLAorCQkJCQkJJnRyZWMuaXJfc3RhcnRpbm8sCisJCQkJCQkmdHJlYy5pcl9mcmVlY291bnQsCisJCQkJCQkmdHJlYy5pcl9mcmVlLCAmaSkpKQorCQkJCQlnb3RvIGVycm9yMTsKKwkJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMSk7CisJCQl9CisJCQkvKgorCQkJICogU2VhcmNoIHJpZ2h0IHdpdGggY3VyLCBnbyBmb3J3YXJkIDEgcmVjb3JkLgorCQkJICovCisJCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2luY3JlbWVudChjdXIsIDAsICZpKSkpCisJCQkJZ290byBlcnJvcjE7CisJCQlkb25lcmlnaHQgPSAhaTsKKwkJCWlmICghZG9uZXJpZ2h0KSB7CisJCQkJaWYgKChlcnJvciA9IHhmc19pbm9idF9nZXRfcmVjKGN1ciwKKwkJCQkJCSZyZWMuaXJfc3RhcnRpbm8sCisJCQkJCQkmcmVjLmlyX2ZyZWVjb3VudCwKKwkJCQkJCSZyZWMuaXJfZnJlZSwgJmkpKSkKKwkJCQkJZ290byBlcnJvcjE7CisJCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjEpOworCQkJfQorCQkJLyoKKwkJCSAqIExvb3AgdW50aWwgd2UgZmluZCB0aGUgY2xvc2VzdCBpbm9kZSBjaHVuaworCQkJICogd2l0aCBhIGZyZWUgb25lLgorCQkJICovCisJCQl3aGlsZSAoIWRvbmVsZWZ0IHx8ICFkb25lcmlnaHQpIHsKKwkJCQlpbnQJdXNlbGVmdDsgIC8qIHVzaW5nIGxlZnQgaW5vZGUKKwkJCQkJCSAgICAgY2h1bmsgdGhpcyB0aW1lICovCisKKwkJCQkvKgorCQkJCSAqIEZpZ3VyZSBvdXQgd2hpY2ggYmxvY2sgaXMgY2xvc2VyLAorCQkJCSAqIGlmIGJvdGggYXJlIHZhbGlkLgorCQkJCSAqLworCQkJCWlmICghZG9uZWxlZnQgJiYgIWRvbmVyaWdodCkKKwkJCQkJdXNlbGVmdCA9CisJCQkJCQlwYWdpbm8gLQorCQkJCQkJKHRyZWMuaXJfc3RhcnRpbm8gKworCQkJCQkJIFhGU19JTk9ERVNfUEVSX0NIVU5LIC0gMSkgPAorCQkJCQkJIHJlYy5pcl9zdGFydGlubyAtIHBhZ2lubzsKKwkJCQllbHNlCisJCQkJCXVzZWxlZnQgPSAhZG9uZWxlZnQ7CisJCQkJLyoKKwkJCQkgKiBJZiBjaGVja2luZyB0aGUgbGVmdCwgZG9lcyBpdCBoYXZlCisJCQkJICogZnJlZSBpbm9kZXM/CisJCQkJICovCisJCQkJaWYgKHVzZWxlZnQgJiYgdHJlYy5pcl9mcmVlY291bnQpIHsKKwkJCQkJLyoKKwkJCQkJICogWWVzLCBzZXQgaXQgdXAgYXMgdGhlIGNodW5rIHRvIHVzZS4KKwkJCQkJICovCisJCQkJCXJlYyA9IHRyZWM7CisJCQkJCXhmc19idHJlZV9kZWxfY3Vyc29yKGN1ciwKKwkJCQkJCVhGU19CVFJFRV9OT0VSUk9SKTsKKwkJCQkJY3VyID0gdGN1cjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8qCisJCQkJICogSWYgY2hlY2tpbmcgdGhlIHJpZ2h0LCBkb2VzIGl0IGhhdmUKKwkJCQkgKiBmcmVlIGlub2Rlcz8KKwkJCQkgKi8KKwkJCQlpZiAoIXVzZWxlZnQgJiYgcmVjLmlyX2ZyZWVjb3VudCkgeworCQkJCQkvKgorCQkJCQkgKiBZZXMsIGl0J3MgYWxyZWFkeSBzZXQgdXAuCisJCQkJCSAqLworCQkJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcih0Y3VyLAorCQkJCQkJWEZTX0JUUkVFX05PRVJST1IpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBJZiB1c2VkIHRoZSBsZWZ0LCBnZXQgYW5vdGhlciBvbmUKKwkJCQkgKiBmdXJ0aGVyIGxlZnQuCisJCQkJICovCisJCQkJaWYgKHVzZWxlZnQpIHsKKwkJCQkJaWYgKChlcnJvciA9IHhmc19pbm9idF9kZWNyZW1lbnQodGN1ciwgMCwKKwkJCQkJCQkmaSkpKQorCQkJCQkJZ290byBlcnJvcjE7CisJCQkJCWRvbmVsZWZ0ID0gIWk7CisJCQkJCWlmICghZG9uZWxlZnQpIHsKKwkJCQkJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfZ2V0X3JlYygKKwkJCQkJCQkgICAgdGN1ciwKKwkJCQkJCQkgICAgJnRyZWMuaXJfc3RhcnRpbm8sCisJCQkJCQkJICAgICZ0cmVjLmlyX2ZyZWVjb3VudCwKKwkJCQkJCQkgICAgJnRyZWMuaXJfZnJlZSwgJmkpKSkKKwkJCQkJCQlnb3RvIGVycm9yMTsKKwkJCQkJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwKKwkJCQkJCQllcnJvcjEpOworCQkJCQl9CisJCQkJfQorCQkJCS8qCisJCQkJICogSWYgdXNlZCB0aGUgcmlnaHQsIGdldCBhbm90aGVyIG9uZQorCQkJCSAqIGZ1cnRoZXIgcmlnaHQuCisJCQkJICovCisJCQkJZWxzZSB7CisJCQkJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfaW5jcmVtZW50KGN1ciwgMCwKKwkJCQkJCQkmaSkpKQorCQkJCQkJZ290byBlcnJvcjE7CisJCQkJCWRvbmVyaWdodCA9ICFpOworCQkJCQlpZiAoIWRvbmVyaWdodCkgeworCQkJCQkJaWYgKChlcnJvciA9IHhmc19pbm9idF9nZXRfcmVjKAorCQkJCQkJCSAgICBjdXIsCisJCQkJCQkJICAgICZyZWMuaXJfc3RhcnRpbm8sCisJCQkJCQkJICAgICZyZWMuaXJfZnJlZWNvdW50LAorCQkJCQkJCSAgICAmcmVjLmlyX2ZyZWUsICZpKSkpCisJCQkJCQkJZ290byBlcnJvcjE7CisJCQkJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsCisJCQkJCQkJZXJyb3IxKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCUFTU0VSVCghZG9uZWxlZnQgfHwgIWRvbmVyaWdodCk7CisJCX0KKwl9CisJLyoKKwkgKiBJbiBhIGRpZmZlcmVudCBhLmcuIGZyb20gdGhlIHBhcmVudC4KKwkgKiBTZWUgaWYgdGhlIG1vc3QgcmVjZW50bHkgYWxsb2NhdGVkIGJsb2NrIGhhcyBhbnkgZnJlZS4KKwkgKi8KKwllbHNlIGlmIChJTlRfR0VUKGFnaS0+YWdpX25ld2lubywgQVJDSF9DT05WRVJUKSAhPSBOVUxMQUdJTk8pIHsKKwkJaWYgKChlcnJvciA9IHhmc19pbm9idF9sb29rdXBfZXEoY3VyLAorCQkJCUlOVF9HRVQoYWdpLT5hZ2lfbmV3aW5vLCBBUkNIX0NPTlZFUlQpLCAwLCAwLCAmaSkpKQorCQkJZ290byBlcnJvcjA7CisJCWlmIChpID09IDEgJiYKKwkJICAgIChlcnJvciA9IHhmc19pbm9idF9nZXRfcmVjKGN1ciwgJnJlYy5pcl9zdGFydGlubywKKwkJCSAgICAmcmVjLmlyX2ZyZWVjb3VudCwgJnJlYy5pcl9mcmVlLCAmaikpID09IDAgJiYKKwkJICAgIGogPT0gMSAmJgorCQkgICAgcmVjLmlyX2ZyZWVjb3VudCA+IDApIHsKKwkJCS8qCisJCQkgKiBUaGUgbGFzdCBjaHVuayBhbGxvY2F0ZWQgaW4gdGhlIGdyb3VwIHN0aWxsIGhhcworCQkJICogYSBmcmVlIGlub2RlLgorCQkJICovCisJCX0KKwkJLyoKKwkJICogTm9uZSBsZWZ0IGluIHRoZSBsYXN0IGdyb3VwLCBzZWFyY2ggdGhlIHdob2xlIGEuZy4KKwkJICovCisJCWVsc2UgeworCQkJaWYgKGVycm9yKQorCQkJCWdvdG8gZXJyb3IwOworCQkJaWYgKChlcnJvciA9IHhmc19pbm9idF9sb29rdXBfZ2UoY3VyLCAwLCAwLCAwLCAmaSkpKQorCQkJCWdvdG8gZXJyb3IwOworCQkJQVNTRVJUKGkgPT0gMSk7CisJCQlmb3IgKDs7KSB7CisJCQkJaWYgKChlcnJvciA9IHhmc19pbm9idF9nZXRfcmVjKGN1ciwKKwkJCQkJCSZyZWMuaXJfc3RhcnRpbm8sCisJCQkJCQkmcmVjLmlyX2ZyZWVjb3VudCwgJnJlYy5pcl9mcmVlLAorCQkJCQkJJmkpKSkKKwkJCQkJZ290byBlcnJvcjA7CisJCQkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCQkJCWlmIChyZWMuaXJfZnJlZWNvdW50ID4gMCkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKChlcnJvciA9IHhmc19pbm9idF9pbmNyZW1lbnQoY3VyLCAwLCAmaSkpKQorCQkJCQlnb3RvIGVycm9yMDsKKwkJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCQl9CisJCX0KKwl9CisJb2Zmc2V0ID0gWEZTX0lBTExPQ19GSU5EX0ZSRUUoJnJlYy5pcl9mcmVlKTsKKwlBU1NFUlQob2Zmc2V0ID49IDApOworCUFTU0VSVChvZmZzZXQgPCBYRlNfSU5PREVTX1BFUl9DSFVOSyk7CisJQVNTRVJUKChYRlNfQUdJTk9fVE9fT0ZGU0VUKG1wLCByZWMuaXJfc3RhcnRpbm8pICUKKwkJCQkgICBYRlNfSU5PREVTX1BFUl9DSFVOSykgPT0gMCk7CisJaW5vID0gWEZTX0FHSU5PX1RPX0lOTyhtcCwgYWdubywgcmVjLmlyX3N0YXJ0aW5vICsgb2Zmc2V0KTsKKwlYRlNfSU5PQlRfQ0xSX0ZSRUUoJnJlYywgb2Zmc2V0KTsKKwlyZWMuaXJfZnJlZWNvdW50LS07CisJaWYgKChlcnJvciA9IHhmc19pbm9idF91cGRhdGUoY3VyLCByZWMuaXJfc3RhcnRpbm8sIHJlYy5pcl9mcmVlY291bnQsCisJCQlyZWMuaXJfZnJlZSkpKQorCQlnb3RvIGVycm9yMDsKKwlJTlRfTU9EKGFnaS0+YWdpX2ZyZWVjb3VudCwgQVJDSF9DT05WRVJULCAtMSk7CisJeGZzX2lhbGxvY19sb2dfYWdpKHRwLCBhZ2JwLCBYRlNfQUdJX0ZSRUVDT1VOVCk7CisJZG93bl9yZWFkKCZtcC0+bV9wZXJhZ2xvY2spOworCW1wLT5tX3BlcmFnW3RhZ25vXS5wYWdpX2ZyZWVjb3VudC0tOworCXVwX3JlYWQoJm1wLT5tX3BlcmFnbG9jayk7CisjaWZkZWYgREVCVUcKKwlpZiAoY3VyLT5iY19ubGV2ZWxzID09IDEpIHsKKwkJaW50CWZyZWVjb3VudCA9IDA7CisKKwkJaWYgKChlcnJvciA9IHhmc19pbm9idF9sb29rdXBfZ2UoY3VyLCAwLCAwLCAwLCAmaSkpKQorCQkJZ290byBlcnJvcjA7CisJCWRvIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfZ2V0X3JlYyhjdXIsICZyZWMuaXJfc3RhcnRpbm8sCisJCQkJCSZyZWMuaXJfZnJlZWNvdW50LCAmcmVjLmlyX2ZyZWUsICZpKSkpCisJCQkJZ290byBlcnJvcjA7CisJCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCQlmcmVlY291bnQgKz0gcmVjLmlyX2ZyZWVjb3VudDsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfaW5jcmVtZW50KGN1ciwgMCwgJmkpKSkKKwkJCQlnb3RvIGVycm9yMDsKKwkJfSB3aGlsZSAoaSA9PSAxKTsKKwkJQVNTRVJUKGZyZWVjb3VudCA9PSBJTlRfR0VUKGFnaS0+YWdpX2ZyZWVjb3VudCwgQVJDSF9DT05WRVJUKSB8fAorCQkgICAgICAgWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpOworCX0KKyNlbmRpZgorCXhmc19idHJlZV9kZWxfY3Vyc29yKGN1ciwgWEZTX0JUUkVFX05PRVJST1IpOworCXhmc190cmFuc19tb2Rfc2IodHAsIFhGU19UUkFOU19TQl9JRlJFRSwgLTEpOworCSppbm9wID0gaW5vOworCXJldHVybiAwOworZXJyb3IxOgorCXhmc19idHJlZV9kZWxfY3Vyc29yKHRjdXIsIFhGU19CVFJFRV9FUlJPUik7CitlcnJvcjA6CisJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY3VyLCBYRlNfQlRSRUVfRVJST1IpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIEZyZWUgZGlzayBpbm9kZS4gIENhcmVmdWxseSBhdm9pZHMgdG91Y2hpbmcgdGhlIGluY29yZSBpbm9kZSwgYWxsCisgKiBtYW5pcHVsYXRpb25zIGluY29yZSBhcmUgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5LgorICogVGhlIG9uLWRpc2sgaW5vZGUgaXMgbm90IGNoYW5nZWQgYnkgdGhpcyBvcGVyYXRpb24sIG9ubHkgdGhlCisgKiBidHJlZSAoZnJlZSBpbm9kZSBtYXNrKSBpcyBjaGFuZ2VkLgorICovCitpbnQKK3hmc19kaWZyZWUoCisJeGZzX3RyYW5zX3QJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19pbm9fdAlpbm9kZSwJCS8qIGlub2RlIHRvIGJlIGZyZWVkICovCisJeGZzX2JtYXBfZnJlZV90CSpmbGlzdCwJCS8qIGV4dGVudHMgdG8gZnJlZSAqLworCWludAkJKmRlbGV0ZSwJLyogc2V0IGlmIGlub2RlIGNsdXN0ZXIgd2FzIGRlbGV0ZWQgKi8KKwl4ZnNfaW5vX3QJKmZpcnN0X2lubykJLyogZmlyc3QgaW5vZGUgaW4gZGVsZXRlZCBjbHVzdGVyICovCit7CisJLyogUkVGRVJFTkNFRCAqLworCXhmc19hZ2Jsb2NrX3QJYWdibm87CS8qIGJsb2NrIG51bWJlciBjb250YWluaW5nIGlub2RlICovCisJeGZzX2J1Zl90CSphZ2JwOwkvKiBidWZmZXIgY29udGFpbmluZyBhbGxvY2F0aW9uIGdyb3VwIGhlYWRlciAqLworCXhmc19hZ2lub190CWFnaW5vOwkvKiBpbm9kZSBudW1iZXIgcmVsYXRpdmUgdG8gYWxsb2NhdGlvbiBncm91cCAqLworCXhmc19hZ251bWJlcl90CWFnbm87CS8qIGFsbG9jYXRpb24gZ3JvdXAgbnVtYmVyICovCisJeGZzX2FnaV90CSphZ2k7CS8qIGFsbG9jYXRpb24gZ3JvdXAgaGVhZGVyICovCisJeGZzX2J0cmVlX2N1cl90CSpjdXI7CS8qIGlub2RlIGJ0cmVlIGN1cnNvciAqLworCWludAkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCWludAkJaTsJLyogcmVzdWx0IGNvZGUgKi8KKwlpbnQJCWlsZW47CS8qIGlub2RlcyBpbiBhbiBpbm9kZSBjbHVzdGVyICovCisJeGZzX21vdW50X3QJKm1wOwkvKiBtb3VudCBzdHJ1Y3R1cmUgZm9yIGZpbGVzeXN0ZW0gKi8KKwlpbnQJCW9mZjsJLyogb2Zmc2V0IG9mIGlub2RlIGluIGlub2RlIGNodW5rICovCisJeGZzX2lub2J0X3JlY190CXJlYzsJLyogYnRyZWUgcmVjb3JkICovCisKKwltcCA9IHRwLT50X21vdW50cDsKKworCS8qCisJICogQnJlYWsgdXAgaW5vZGUgbnVtYmVyIGludG8gaXRzIGNvbXBvbmVudHMuCisJICovCisJYWdubyA9IFhGU19JTk9fVE9fQUdOTyhtcCwgaW5vZGUpOworCWlmIChhZ25vID49IG1wLT5tX3NiLnNiX2FnY291bnQpICB7CisJCWNtbl9lcnIoQ0VfV0FSTiwKKwkJCSJ4ZnNfZGlmcmVlOiBhZ25vID49IG1wLT5tX3NiLnNiX2FnY291bnQgKCVkID49ICVkKSBvbiAlcy4gIFJldHVybmluZyBFSU5WQUwuIiwKKwkJCWFnbm8sIG1wLT5tX3NiLnNiX2FnY291bnQsIG1wLT5tX2ZzbmFtZSk7CisJCUFTU0VSVCgwKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCX0KKwlhZ2lubyA9IFhGU19JTk9fVE9fQUdJTk8obXAsIGlub2RlKTsKKwlpZiAoaW5vZGUgIT0gWEZTX0FHSU5PX1RPX0lOTyhtcCwgYWdubywgYWdpbm8pKSAgeworCQljbW5fZXJyKENFX1dBUk4sCisJCQkieGZzX2RpZnJlZTogaW5vZGUgIT0gWEZTX0FHSU5PX1RPX0lOTygpICglZCAhPSAlZCkgb24gJXMuICBSZXR1cm5pbmcgRUlOVkFMLiIsCisJCQlpbm9kZSwgWEZTX0FHSU5PX1RPX0lOTyhtcCwgYWdubywgYWdpbm8pLCBtcC0+bV9mc25hbWUpOworCQlBU1NFUlQoMCk7CisJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKwl9CisJYWdibm8gPSBYRlNfQUdJTk9fVE9fQUdCTk8obXAsIGFnaW5vKTsKKwlpZiAoYWdibm8gPj0gbXAtPm1fc2Iuc2JfYWdibG9ja3MpICB7CisJCWNtbl9lcnIoQ0VfV0FSTiwKKwkJCSJ4ZnNfZGlmcmVlOiBhZ2JubyA+PSBtcC0+bV9zYi5zYl9hZ2Jsb2NrcyAoJWQgPj0gJWQpIG9uICVzLiAgUmV0dXJuaW5nIEVJTlZBTC4iLAorCQkJYWdibm8sIG1wLT5tX3NiLnNiX2FnYmxvY2tzLCBtcC0+bV9mc25hbWUpOworCQlBU1NFUlQoMCk7CisJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKwl9CisJLyoKKwkgKiBHZXQgdGhlIGFsbG9jYXRpb24gZ3JvdXAgaGVhZGVyLgorCSAqLworCWRvd25fcmVhZCgmbXAtPm1fcGVyYWdsb2NrKTsKKwllcnJvciA9IHhmc19pYWxsb2NfcmVhZF9hZ2kobXAsIHRwLCBhZ25vLCAmYWdicCk7CisJdXBfcmVhZCgmbXAtPm1fcGVyYWdsb2NrKTsKKwlpZiAoZXJyb3IpIHsKKwkJY21uX2VycihDRV9XQVJOLAorCQkJInhmc19kaWZyZWU6IHhmc19pYWxsb2NfcmVhZF9hZ2koKSByZXR1cm5lZCBhbiBlcnJvciAlZCBvbiAlcy4gIFJldHVybmluZyBlcnJvci4iLAorCQkJZXJyb3IsIG1wLT5tX2ZzbmFtZSk7CisJCXJldHVybiBlcnJvcjsKKwl9CisJYWdpID0gWEZTX0JVRl9UT19BR0koYWdicCk7CisJQVNTRVJUKElOVF9HRVQoYWdpLT5hZ2lfbWFnaWNudW0sIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0FHSV9NQUdJQyk7CisJQVNTRVJUKGFnYm5vIDwgSU5UX0dFVChhZ2ktPmFnaV9sZW5ndGgsIEFSQ0hfQ09OVkVSVCkpOworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgY3Vyc29yLgorCSAqLworCWN1ciA9IHhmc19idHJlZV9pbml0X2N1cnNvcihtcCwgdHAsIGFnYnAsIGFnbm8sIFhGU19CVE5VTV9JTk8sCisJCSh4ZnNfaW5vZGVfdCAqKTAsIDApOworI2lmZGVmIERFQlVHCisJaWYgKGN1ci0+YmNfbmxldmVscyA9PSAxKSB7CisJCWludCBmcmVlY291bnQgPSAwOworCisJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfbG9va3VwX2dlKGN1ciwgMCwgMCwgMCwgJmkpKSkKKwkJCWdvdG8gZXJyb3IwOworCQlkbyB7CisJCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2dldF9yZWMoY3VyLCAmcmVjLmlyX3N0YXJ0aW5vLAorCQkJCQkmcmVjLmlyX2ZyZWVjb3VudCwgJnJlYy5pcl9mcmVlLCAmaSkpKQorCQkJCWdvdG8gZXJyb3IwOworCQkJaWYgKGkpIHsKKwkJCQlmcmVlY291bnQgKz0gcmVjLmlyX2ZyZWVjb3VudDsKKwkJCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2luY3JlbWVudChjdXIsIDAsICZpKSkpCisJCQkJCWdvdG8gZXJyb3IwOworCQkJfQorCQl9IHdoaWxlIChpID09IDEpOworCQlBU1NFUlQoZnJlZWNvdW50ID09IElOVF9HRVQoYWdpLT5hZ2lfZnJlZWNvdW50LCBBUkNIX0NPTlZFUlQpIHx8CisJCSAgICAgICBYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSk7CisJfQorI2VuZGlmCisJLyoKKwkgKiBMb29rIGZvciB0aGUgZW50cnkgZGVzY3JpYmluZyB0aGlzIGlub2RlLgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfbG9va3VwX2xlKGN1ciwgYWdpbm8sIDAsIDAsICZpKSkpIHsKKwkJY21uX2VycihDRV9XQVJOLAorCQkJInhmc19kaWZyZWU6IHhmc19pbm9idF9sb29rdXBfbGUgcmV0dXJuZWQoKSAgYW4gZXJyb3IgJWQgb24gJXMuICBSZXR1cm5pbmcgZXJyb3IuIiwKKwkJCWVycm9yLCBtcC0+bV9mc25hbWUpOworCQlnb3RvIGVycm9yMDsKKwl9CisJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfZ2V0X3JlYyhjdXIsICZyZWMuaXJfc3RhcnRpbm8sICZyZWMuaXJfZnJlZWNvdW50LAorCQkJJnJlYy5pcl9mcmVlLCAmaSkpKSB7CisJCWNtbl9lcnIoQ0VfV0FSTiwKKwkJCSJ4ZnNfZGlmcmVlOiB4ZnNfaW5vYnRfZ2V0X3JlYygpICByZXR1cm5lZCBhbiBlcnJvciAlZCBvbiAlcy4gIFJldHVybmluZyBlcnJvci4iLAorCQkJZXJyb3IsIG1wLT5tX2ZzbmFtZSk7CisJCWdvdG8gZXJyb3IwOworCX0KKwlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJLyoKKwkgKiBHZXQgdGhlIG9mZnNldCBpbiB0aGUgaW5vZGUgY2h1bmsuCisJICovCisJb2ZmID0gYWdpbm8gLSByZWMuaXJfc3RhcnRpbm87CisJQVNTRVJUKG9mZiA+PSAwICYmIG9mZiA8IFhGU19JTk9ERVNfUEVSX0NIVU5LKTsKKwlBU1NFUlQoIVhGU19JTk9CVF9JU19GUkVFKCZyZWMsIG9mZikpOworCS8qCisJICogTWFyayB0aGUgaW5vZGUgZnJlZSAmIGluY3JlbWVudCB0aGUgY291bnQuCisJICovCisJWEZTX0lOT0JUX1NFVF9GUkVFKCZyZWMsIG9mZik7CisJcmVjLmlyX2ZyZWVjb3VudCsrOworCisJLyoKKwkgKiBXaGVuIGFuIGlub2RlIGNsdXN0ZXIgaXMgZnJlZSwgaXQgYmVjb21lcyBlbGdpYmxlIGZvciByZW1vdmFsCisJICovCisJaWYgKChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9JREVMRVRFKSAmJgorCSAgICAocmVjLmlyX2ZyZWVjb3VudCA9PSBYRlNfSUFMTE9DX0lOT0RFUyhtcCkpKSB7CisKKwkJKmRlbGV0ZSA9IDE7CisJCSpmaXJzdF9pbm8gPSBYRlNfQUdJTk9fVE9fSU5PKG1wLCBhZ25vLCByZWMuaXJfc3RhcnRpbm8pOworCisJCS8qCisJCSAqIFJlbW92ZSB0aGUgaW5vZGUgY2x1c3RlciBmcm9tIHRoZSBBR0kgQitUcmVlLCBhZGp1c3QgdGhlCisJCSAqIEFHSSBhbmQgU3VwZXJibG9jayBpbm9kZSBjb3VudHMsIGFuZCBtYXJrIHRoZSBkaXNrIHNwYWNlCisJCSAqIHRvIGJlIGZyZWVkIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIGNvbW1pdHRlZC4KKwkJICovCisJCWlsZW4gPSBYRlNfSUFMTE9DX0lOT0RFUyhtcCk7CisJCUlOVF9NT0QoYWdpLT5hZ2lfY291bnQsIEFSQ0hfQ09OVkVSVCwgLWlsZW4pOworCQlJTlRfTU9EKGFnaS0+YWdpX2ZyZWVjb3VudCwgQVJDSF9DT05WRVJULCAtKGlsZW4gLSAxKSk7CisJCXhmc19pYWxsb2NfbG9nX2FnaSh0cCwgYWdicCwgWEZTX0FHSV9DT1VOVCB8IFhGU19BR0lfRlJFRUNPVU5UKTsKKwkJZG93bl9yZWFkKCZtcC0+bV9wZXJhZ2xvY2spOworCQltcC0+bV9wZXJhZ1thZ25vXS5wYWdpX2ZyZWVjb3VudCAtPSBpbGVuIC0gMTsKKwkJdXBfcmVhZCgmbXAtPm1fcGVyYWdsb2NrKTsKKwkJeGZzX3RyYW5zX21vZF9zYih0cCwgWEZTX1RSQU5TX1NCX0lDT1VOVCwgLWlsZW4pOworCQl4ZnNfdHJhbnNfbW9kX3NiKHRwLCBYRlNfVFJBTlNfU0JfSUZSRUUsIC0oaWxlbiAtIDEpKTsKKworCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2RlbGV0ZShjdXIsICZpKSkpIHsKKwkJCWNtbl9lcnIoQ0VfV0FSTiwgInhmc19kaWZyZWU6IHhmc19pbm9idF9kZWxldGUgcmV0dXJuZWQgYW4gZXJyb3IgJWQgb24gJXMuXG4iLAorCQkJCWVycm9yLCBtcC0+bV9mc25hbWUpOworCQkJZ290byBlcnJvcjA7CisJCX0KKworCQl4ZnNfYm1hcF9hZGRfZnJlZShYRlNfQUdCX1RPX0ZTQihtcCwKKwkJCQlhZ25vLCBYRlNfSU5PX1RPX0FHQk5PKG1wLHJlYy5pcl9zdGFydGlubykpLAorCQkJCVhGU19JQUxMT0NfQkxPQ0tTKG1wKSwgZmxpc3QsIG1wKTsKKwl9IGVsc2UgeworCQkqZGVsZXRlID0gMDsKKworCQlpZiAoKGVycm9yID0geGZzX2lub2J0X3VwZGF0ZShjdXIsIHJlYy5pcl9zdGFydGlubywgcmVjLmlyX2ZyZWVjb3VudCwgcmVjLmlyX2ZyZWUpKSkgeworCQkJY21uX2VycihDRV9XQVJOLAorCQkJCSJ4ZnNfZGlmcmVlOiB4ZnNfaW5vYnRfdXBkYXRlKCkgIHJldHVybmVkIGFuIGVycm9yICVkIG9uICVzLiAgUmV0dXJuaW5nIGVycm9yLiIsCisJCQkJZXJyb3IsIG1wLT5tX2ZzbmFtZSk7CisJCQlnb3RvIGVycm9yMDsKKwkJfQorCQkvKiAKKwkJICogQ2hhbmdlIHRoZSBpbm9kZSBmcmVlIGNvdW50cyBhbmQgbG9nIHRoZSBhZy9zYiBjaGFuZ2VzLgorCQkgKi8KKwkJSU5UX01PRChhZ2ktPmFnaV9mcmVlY291bnQsIEFSQ0hfQ09OVkVSVCwgMSk7CisJCXhmc19pYWxsb2NfbG9nX2FnaSh0cCwgYWdicCwgWEZTX0FHSV9GUkVFQ09VTlQpOworCQlkb3duX3JlYWQoJm1wLT5tX3BlcmFnbG9jayk7CisJCW1wLT5tX3BlcmFnW2Fnbm9dLnBhZ2lfZnJlZWNvdW50Kys7CisJCXVwX3JlYWQoJm1wLT5tX3BlcmFnbG9jayk7CisJCXhmc190cmFuc19tb2Rfc2IodHAsIFhGU19UUkFOU19TQl9JRlJFRSwgMSk7CisJfQorCisjaWZkZWYgREVCVUcKKwlpZiAoY3VyLT5iY19ubGV2ZWxzID09IDEpIHsKKwkJaW50IGZyZWVjb3VudCA9IDA7CisKKwkJaWYgKChlcnJvciA9IHhmc19pbm9idF9sb29rdXBfZ2UoY3VyLCAwLCAwLCAwLCAmaSkpKQorCQkJZ290byBlcnJvcjA7CisJCWRvIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfZ2V0X3JlYyhjdXIsCisJCQkJCSZyZWMuaXJfc3RhcnRpbm8sCisJCQkJCSZyZWMuaXJfZnJlZWNvdW50LAorCQkJCQkmcmVjLmlyX2ZyZWUsICZpKSkpCisJCQkJZ290byBlcnJvcjA7CisJCQlpZiAoaSkgeworCQkJCWZyZWVjb3VudCArPSByZWMuaXJfZnJlZWNvdW50OworCQkJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfaW5jcmVtZW50KGN1ciwgMCwgJmkpKSkKKwkJCQkJZ290byBlcnJvcjA7CisJCQl9CisJCX0gd2hpbGUgKGkgPT0gMSk7CisJCUFTU0VSVChmcmVlY291bnQgPT0gSU5UX0dFVChhZ2ktPmFnaV9mcmVlY291bnQsIEFSQ0hfQ09OVkVSVCkgfHwKKwkJICAgICAgIFhGU19GT1JDRURfU0hVVERPV04obXApKTsKKwl9CisjZW5kaWYKKwl4ZnNfYnRyZWVfZGVsX2N1cnNvcihjdXIsIFhGU19CVFJFRV9OT0VSUk9SKTsKKwlyZXR1cm4gMDsKKworZXJyb3IwOgorCXhmc19idHJlZV9kZWxfY3Vyc29yKGN1ciwgWEZTX0JUUkVFX0VSUk9SKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSBpbm9kZSBpbiBibm8vb2ZmLCBmb3IgbWFwcGluZyBpdCBpbnRvIGEgYnVmZmVyLgorICovCisvKkFSR1NVU0VEKi8KK2ludAoreGZzX2RpbG9jYXRlKAorCXhmc19tb3VudF90CSptcCwJLyogZmlsZSBzeXN0ZW0gbW91bnQgc3RydWN0dXJlICovCisJeGZzX3RyYW5zX3QJKnRwLAkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2lub190CWlubywJLyogaW5vZGUgdG8gbG9jYXRlICovCisJeGZzX2ZzYmxvY2tfdAkqYm5vLAkvKiBvdXRwdXQ6IGJsb2NrIGNvbnRhaW5pbmcgaW5vZGUgKi8KKwlpbnQJCSpsZW4sCS8qIG91dHB1dDogbnVtIGJsb2NrcyBpbiBpbm9kZSBjbHVzdGVyICovCisJaW50CQkqb2ZmLAkvKiBvdXRwdXQ6IGluZGV4IGluIGJsb2NrIG9mIGlub2RlICovCisJdWludAkJZmxhZ3MpCS8qIGZsYWdzIGNvbmNlcm5pbmcgaW5vZGUgbG9va3VwICovCit7CisJeGZzX2FnYmxvY2tfdAlhZ2JubzsJLyogYmxvY2sgbnVtYmVyIG9mIGlub2RlIGluIHRoZSBhbGxvYyBncm91cCAqLworCXhmc19idWZfdAkqYWdicDsJLyogYWdpIGJ1ZmZlciAqLworCXhmc19hZ2lub190CWFnaW5vOwkvKiBpbm9kZSBudW1iZXIgd2l0aGluIGFsbG9jIGdyb3VwICovCisJeGZzX2FnbnVtYmVyX3QJYWdubzsJLyogYWxsb2NhdGlvbiBncm91cCBudW1iZXIgKi8KKwlpbnQJCWJsa3NfcGVyX2NsdXN0ZXI7IC8qIG51bSBibG9ja3MgcGVyIGlub2RlIGNsdXN0ZXIgKi8KKwl4ZnNfYWdibG9ja190CWNodW5rX2FnYm5vOwkvKiBmaXJzdCBibG9jayBpbiBpbm9kZSBjaHVuayAqLworCXhmc19hZ2lub190CWNodW5rX2FnaW5vOwkvKiBmaXJzdCBhZ2lubyBpbiBpbm9kZSBjaHVuayAqLworCV9faW50MzJfdAljaHVua19jbnQ7CS8qIGNvdW50IG9mIGZyZWUgaW5vZGVzIGluIGNodW5rICovCisJeGZzX2lub2ZyZWVfdAljaHVua19mcmVlOwkvKiBtYXNrIG9mIGZyZWUgaW5vZGVzIGluIGNodW5rICovCisJeGZzX2FnYmxvY2tfdAljbHVzdGVyX2FnYm5vOwkvKiBmaXJzdCBibG9jayBpbiBpbm9kZSBjbHVzdGVyICovCisJeGZzX2J0cmVlX2N1cl90CSpjdXI7CS8qIGlub2RlIGJ0cmVlIGN1cnNvciAqLworCWludAkJZXJyb3I7CS8qIGVycm9yIGNvZGUgKi8KKwlpbnQJCWk7CS8qIHRlbXAgc3RhdGUgKi8KKwlpbnQJCW9mZnNldDsJLyogaW5kZXggb2YgaW5vZGUgaW4gaXRzIGJ1ZmZlciAqLworCWludAkJb2Zmc2V0X2FnYm5vOwkvKiBibGtzIGZyb20gY2h1bmsgc3RhcnQgdG8gaW5vZGUgKi8KKworCUFTU0VSVChpbm8gIT0gTlVMTEZTSU5PKTsKKwkvKgorCSAqIFNwbGl0IHVwIHRoZSBpbm9kZSBudW1iZXIgaW50byBpdHMgcGFydHMuCisJICovCisJYWdubyA9IFhGU19JTk9fVE9fQUdOTyhtcCwgaW5vKTsKKwlhZ2lubyA9IFhGU19JTk9fVE9fQUdJTk8obXAsIGlubyk7CisJYWdibm8gPSBYRlNfQUdJTk9fVE9fQUdCTk8obXAsIGFnaW5vKTsKKwlpZiAoYWdubyA+PSBtcC0+bV9zYi5zYl9hZ2NvdW50IHx8IGFnYm5vID49IG1wLT5tX3NiLnNiX2FnYmxvY2tzIHx8CisJICAgIGlubyAhPSBYRlNfQUdJTk9fVE9fSU5PKG1wLCBhZ25vLCBhZ2lubykpIHsKKyNpZmRlZiBERUJVRworCQlpZiAoYWdubyA+PSBtcC0+bV9zYi5zYl9hZ2NvdW50KSB7CisJCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbXAsCisJCQkJCSJ4ZnNfZGlsb2NhdGU6IGFnbm8gKCVkKSA+PSAiCisJCQkJCSJtcC0+bV9zYi5zYl9hZ2NvdW50ICglZCkiLAorCQkJCQlhZ25vLCAgbXAtPm1fc2Iuc2JfYWdjb3VudCk7CisJCX0KKwkJaWYgKGFnYm5vID49IG1wLT5tX3NiLnNiX2FnYmxvY2tzKSB7CisJCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbXAsCisJCQkJCSJ4ZnNfZGlsb2NhdGU6IGFnYm5vICgweCVsbHgpID49ICIKKwkJCQkJIm1wLT5tX3NiLnNiX2FnYmxvY2tzICgweCVseCkiLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKSBhZ2JubywKKwkJCQkJKHVuc2lnbmVkIGxvbmcpIG1wLT5tX3NiLnNiX2FnYmxvY2tzKTsKKwkJfQorCQlpZiAoaW5vICE9IFhGU19BR0lOT19UT19JTk8obXAsIGFnbm8sIGFnaW5vKSkgeworCQkJeGZzX2ZzX2Ntbl9lcnIoQ0VfQUxFUlQsIG1wLAorCQkJCQkieGZzX2RpbG9jYXRlOiBpbm8gKDB4JWxseCkgIT0gIgorCQkJCQkiWEZTX0FHSU5PX1RPX0lOTyhtcCwgYWdubywgYWdpbm8pICIKKwkJCQkJIigweCVsbHgpIiwKKwkJCQkJaW5vLCBYRlNfQUdJTk9fVE9fSU5PKG1wLCBhZ25vLCBhZ2lubykpOworCQl9CisjZW5kaWYgLyogREVCVUcgKi8KKwkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCX0KKwlpZiAoKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSA+PSBYRlNfSU5PREVfQ0xVU1RFUl9TSVpFKG1wKSkgfHwKKwkgICAgIShmbGFncyAmIFhGU19JTUFQX0xPT0tVUCkpIHsKKwkJb2Zmc2V0ID0gWEZTX0lOT19UT19PRkZTRVQobXAsIGlubyk7CisJCUFTU0VSVChvZmZzZXQgPCBtcC0+bV9zYi5zYl9pbm9wYmxvY2spOworCQkqYm5vID0gWEZTX0FHQl9UT19GU0IobXAsIGFnbm8sIGFnYm5vKTsKKwkJKm9mZiA9IG9mZnNldDsKKwkJKmxlbiA9IDE7CisJCXJldHVybiAwOworCX0KKwlibGtzX3Blcl9jbHVzdGVyID0gWEZTX0lOT0RFX0NMVVNURVJfU0laRShtcCkgPj4gbXAtPm1fc2Iuc2JfYmxvY2tsb2c7CisJaWYgKCpibm8gIT0gTlVMTEZTQkxPQ0spIHsKKwkJb2Zmc2V0ID0gWEZTX0lOT19UT19PRkZTRVQobXAsIGlubyk7CisJCUFTU0VSVChvZmZzZXQgPCBtcC0+bV9zYi5zYl9pbm9wYmxvY2spOworCQljbHVzdGVyX2FnYm5vID0gWEZTX0ZTQl9UT19BR0JOTyhtcCwgKmJubyk7CisJCSpvZmYgPSAoKGFnYm5vIC0gY2x1c3Rlcl9hZ2JubykgKiBtcC0+bV9zYi5zYl9pbm9wYmxvY2spICsKKwkJCW9mZnNldDsKKwkJKmxlbiA9IGJsa3NfcGVyX2NsdXN0ZXI7CisJCXJldHVybiAwOworCX0KKwlpZiAobXAtPm1faW5vYWxpZ25fbWFzaykgeworCQlvZmZzZXRfYWdibm8gPSBhZ2JubyAmIG1wLT5tX2lub2FsaWduX21hc2s7CisJCWNodW5rX2FnYm5vID0gYWdibm8gLSBvZmZzZXRfYWdibm87CisJfSBlbHNlIHsKKwkJZG93bl9yZWFkKCZtcC0+bV9wZXJhZ2xvY2spOworCQllcnJvciA9IHhmc19pYWxsb2NfcmVhZF9hZ2kobXAsIHRwLCBhZ25vLCAmYWdicCk7CisJCXVwX3JlYWQoJm1wLT5tX3BlcmFnbG9jayk7CisJCWlmIChlcnJvcikgeworI2lmZGVmIERFQlVHCisJCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbXAsICJ4ZnNfZGlsb2NhdGU6ICIKKwkJCQkJInhmc19pYWxsb2NfcmVhZF9hZ2koKSByZXR1cm5lZCAiCisJCQkJCSJlcnJvciAlZCwgYWdubyAlZCIsCisJCQkJCWVycm9yLCBhZ25vKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCQkJcmV0dXJuIGVycm9yOworCQl9CisJCWN1ciA9IHhmc19idHJlZV9pbml0X2N1cnNvcihtcCwgdHAsIGFnYnAsIGFnbm8sIFhGU19CVE5VTV9JTk8sCisJCQkoeGZzX2lub2RlX3QgKikwLCAwKTsKKwkJaWYgKChlcnJvciA9IHhmc19pbm9idF9sb29rdXBfbGUoY3VyLCBhZ2lubywgMCwgMCwgJmkpKSkgeworI2lmZGVmIERFQlVHCisJCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbXAsICJ4ZnNfZGlsb2NhdGU6ICIKKwkJCQkJInhmc19pbm9idF9sb29rdXBfbGUoKSBmYWlsZWQiKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCQkJZ290byBlcnJvcjA7CisJCX0KKwkJaWYgKChlcnJvciA9IHhmc19pbm9idF9nZXRfcmVjKGN1ciwgJmNodW5rX2FnaW5vLCAmY2h1bmtfY250LAorCQkJCSZjaHVua19mcmVlLCAmaSkpKSB7CisjaWZkZWYgREVCVUcKKwkJCXhmc19mc19jbW5fZXJyKENFX0FMRVJULCBtcCwgInhmc19kaWxvY2F0ZTogIgorCQkJCQkieGZzX2lub2J0X2dldF9yZWMoKSBmYWlsZWQiKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCQkJZ290byBlcnJvcjA7CisJCX0KKwkJaWYgKGkgPT0gMCkgeworI2lmZGVmIERFQlVHCisJCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbXAsICJ4ZnNfZGlsb2NhdGU6ICIKKwkJCQkJInhmc19pbm9idF9nZXRfcmVjKCkgZmFpbGVkIik7CisjZW5kaWYgLyogREVCVUcgKi8KKwkJCWVycm9yID0gWEZTX0VSUk9SKEVJTlZBTCk7CisJCX0KKwkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYWdicCk7CisJCXhmc19idHJlZV9kZWxfY3Vyc29yKGN1ciwgWEZTX0JUUkVFX05PRVJST1IpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJCWNodW5rX2FnYm5vID0gWEZTX0FHSU5PX1RPX0FHQk5PKG1wLCBjaHVua19hZ2lubyk7CisJCW9mZnNldF9hZ2JubyA9IGFnYm5vIC0gY2h1bmtfYWdibm87CisJfQorCUFTU0VSVChhZ2JubyA+PSBjaHVua19hZ2Jubyk7CisJY2x1c3Rlcl9hZ2JubyA9IGNodW5rX2FnYm5vICsKKwkJKChvZmZzZXRfYWdibm8gLyBibGtzX3Blcl9jbHVzdGVyKSAqIGJsa3NfcGVyX2NsdXN0ZXIpOworCW9mZnNldCA9ICgoYWdibm8gLSBjbHVzdGVyX2FnYm5vKSAqIG1wLT5tX3NiLnNiX2lub3BibG9jaykgKworCQlYRlNfSU5PX1RPX09GRlNFVChtcCwgaW5vKTsKKwkqYm5vID0gWEZTX0FHQl9UT19GU0IobXAsIGFnbm8sIGNsdXN0ZXJfYWdibm8pOworCSpvZmYgPSBvZmZzZXQ7CisJKmxlbiA9IGJsa3NfcGVyX2NsdXN0ZXI7CisJcmV0dXJuIDA7CitlcnJvcjA6CisJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYWdicCk7CisJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY3VyLCBYRlNfQlRSRUVfRVJST1IpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIENvbXB1dGUgYW5kIGZpbGwgaW4gdmFsdWUgb2YgbV9pbl9tYXhsZXZlbHMuCisgKi8KK3ZvaWQKK3hmc19pYWxsb2NfY29tcHV0ZV9tYXhsZXZlbHMoCisJeGZzX21vdW50X3QJKm1wKQkJLyogZmlsZSBzeXN0ZW0gbW91bnQgc3RydWN0dXJlICovCit7CisJaW50CQlsZXZlbDsKKwl1aW50CQltYXhibG9ja3M7CisJdWludAkJbWF4bGVhZmVudHM7CisJaW50CQltaW5sZWFmcmVjczsKKwlpbnQJCW1pbm5vZGVyZWNzOworCisJbWF4bGVhZmVudHMgPSAoMUxMIDw8IFhGU19JTk9fQUdJTk9fQklUUyhtcCkpID4+CisJCVhGU19JTk9ERVNfUEVSX0NIVU5LX0xPRzsKKwltaW5sZWFmcmVjcyA9IG1wLT5tX2FsbG9jX21uclswXTsKKwltaW5ub2RlcmVjcyA9IG1wLT5tX2FsbG9jX21uclsxXTsKKwltYXhibG9ja3MgPSAobWF4bGVhZmVudHMgKyBtaW5sZWFmcmVjcyAtIDEpIC8gbWlubGVhZnJlY3M7CisJZm9yIChsZXZlbCA9IDE7IG1heGJsb2NrcyA+IDE7IGxldmVsKyspCisJCW1heGJsb2NrcyA9IChtYXhibG9ja3MgKyBtaW5ub2RlcmVjcyAtIDEpIC8gbWlubm9kZXJlY3M7CisJbXAtPm1faW5fbWF4bGV2ZWxzID0gbGV2ZWw7Cit9CisKKy8qCisgKiBMb2cgc3BlY2lmaWVkIGZpZWxkcyBmb3IgdGhlIGFnIGhkciAoaW5vZGUgc2VjdGlvbikKKyAqLwordm9pZAoreGZzX2lhbGxvY19sb2dfYWdpKAorCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfYnVmX3QJKmJwLAkJLyogYWxsb2NhdGlvbiBncm91cCBoZWFkZXIgYnVmZmVyICovCisJaW50CQlmaWVsZHMpCQkvKiBiaXRtYXNrIG9mIGZpZWxkcyB0byBsb2cgKi8KK3sKKwlpbnQJCQlmaXJzdDsJCS8qIGZpcnN0IGJ5dGUgbnVtYmVyICovCisJaW50CQkJbGFzdDsJCS8qIGxhc3QgYnl0ZSBudW1iZXIgKi8KKwlzdGF0aWMgY29uc3Qgc2hvcnQJb2Zmc2V0c1tdID0gewkvKiBmaWVsZCBzdGFydGluZyBvZmZzZXRzICovCisJCQkJCS8qIGtlZXAgaW4gc3luYyB3aXRoIGJpdCBkZWZpbml0aW9ucyAqLworCQlvZmZzZXRvZih4ZnNfYWdpX3QsIGFnaV9tYWdpY251bSksCisJCW9mZnNldG9mKHhmc19hZ2lfdCwgYWdpX3ZlcnNpb25udW0pLAorCQlvZmZzZXRvZih4ZnNfYWdpX3QsIGFnaV9zZXFubyksCisJCW9mZnNldG9mKHhmc19hZ2lfdCwgYWdpX2xlbmd0aCksCisJCW9mZnNldG9mKHhmc19hZ2lfdCwgYWdpX2NvdW50KSwKKwkJb2Zmc2V0b2YoeGZzX2FnaV90LCBhZ2lfcm9vdCksCisJCW9mZnNldG9mKHhmc19hZ2lfdCwgYWdpX2xldmVsKSwKKwkJb2Zmc2V0b2YoeGZzX2FnaV90LCBhZ2lfZnJlZWNvdW50KSwKKwkJb2Zmc2V0b2YoeGZzX2FnaV90LCBhZ2lfbmV3aW5vKSwKKwkJb2Zmc2V0b2YoeGZzX2FnaV90LCBhZ2lfZGlyaW5vKSwKKwkJb2Zmc2V0b2YoeGZzX2FnaV90LCBhZ2lfdW5saW5rZWQpLAorCQlzaXplb2YoeGZzX2FnaV90KQorCX07CisjaWZkZWYgREVCVUcKKwl4ZnNfYWdpX3QJCSphZ2k7CS8qIGFsbG9jYXRpb24gZ3JvdXAgaGVhZGVyICovCisKKwlhZ2kgPSBYRlNfQlVGX1RPX0FHSShicCk7CisJQVNTRVJUKElOVF9HRVQoYWdpLT5hZ2lfbWFnaWNudW0sIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0FHSV9NQUdJQyk7CisjZW5kaWYKKwkvKgorCSAqIENvbXB1dGUgYnl0ZSBvZmZzZXRzIGZvciB0aGUgZmlyc3QgYW5kIGxhc3QgZmllbGRzLgorCSAqLworCXhmc19idHJlZV9vZmZzZXRzKGZpZWxkcywgb2Zmc2V0cywgWEZTX0FHSV9OVU1fQklUUywgJmZpcnN0LCAmbGFzdCk7CisJLyoKKwkgKiBMb2cgdGhlIGFsbG9jYXRpb24gZ3JvdXAgaW5vZGUgaGVhZGVyIGJ1ZmZlci4KKwkgKi8KKwl4ZnNfdHJhbnNfbG9nX2J1Zih0cCwgYnAsIGZpcnN0LCBsYXN0KTsKK30KKworLyoKKyAqIFJlYWQgaW4gdGhlIGFsbG9jYXRpb24gZ3JvdXAgaGVhZGVyIChpbm9kZSBhbGxvY2F0aW9uIHNlY3Rpb24pCisgKi8KK2ludAoreGZzX2lhbGxvY19yZWFkX2FnaSgKKwl4ZnNfbW91bnRfdAkqbXAsCQkvKiBmaWxlIHN5c3RlbSBtb3VudCBzdHJ1Y3R1cmUgKi8KKwl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2FnbnVtYmVyX3QJYWdubywJCS8qIGFsbG9jYXRpb24gZ3JvdXAgbnVtYmVyICovCisJeGZzX2J1Zl90CSoqYnBwKQkJLyogYWxsb2NhdGlvbiBncm91cCBoZHIgYnVmICovCit7CisJeGZzX2FnaV90CSphZ2k7CQkvKiBhbGxvY2F0aW9uIGdyb3VwIGhlYWRlciAqLworCWludAkJYWdpX29rOwkJLyogYWdpIGlzIGNvbnNpc3RlbnQgKi8KKwl4ZnNfYnVmX3QJKmJwOwkJLyogYWxsb2NhdGlvbiBncm91cCBoZHIgYnVmICovCisJeGZzX3BlcmFnX3QJKnBhZzsJCS8qIHBlciBhbGxvY2F0aW9uIGdyb3VwIGRhdGEgKi8KKwlpbnQJCWVycm9yOworCisJQVNTRVJUKGFnbm8gIT0gTlVMTEFHTlVNQkVSKTsKKwllcnJvciA9IHhmc190cmFuc19yZWFkX2J1ZigKKwkJCW1wLCB0cCwgbXAtPm1fZGRldl90YXJncCwKKwkJCVhGU19BR19EQUREUihtcCwgYWdubywgWEZTX0FHSV9EQUREUihtcCkpLAorCQkJWEZTX0ZTU19UT19CQihtcCwgMSksIDAsICZicCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisJQVNTRVJUKGJwICYmICFYRlNfQlVGX0dFVEVSUk9SKGJwKSk7CisKKwkvKgorCSAqIFZhbGlkYXRlIHRoZSBtYWdpYyBudW1iZXIgb2YgdGhlIGFnaSBibG9jay4KKwkgKi8KKwlhZ2kgPSBYRlNfQlVGX1RPX0FHSShicCk7CisJYWdpX29rID0KKwkJSU5UX0dFVChhZ2ktPmFnaV9tYWdpY251bSwgQVJDSF9DT05WRVJUKSA9PSBYRlNfQUdJX01BR0lDICYmCisJCVhGU19BR0lfR09PRF9WRVJTSU9OKAorCQkJSU5UX0dFVChhZ2ktPmFnaV92ZXJzaW9ubnVtLCBBUkNIX0NPTlZFUlQpKTsKKwlpZiAodW5saWtlbHkoWEZTX1RFU1RfRVJST1IoIWFnaV9vaywgbXAsIFhGU19FUlJUQUdfSUFMTE9DX1JFQURfQUdJLAorCQkJWEZTX1JBTkRPTV9JQUxMT0NfUkVBRF9BR0kpKSkgeworCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGZzX2lhbGxvY19yZWFkX2FnaSIsIFhGU19FUlJMRVZFTF9MT1csCisJCQkJICAgICBtcCwgYWdpKTsKKwkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOworCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJfQorCXBhZyA9ICZtcC0+bV9wZXJhZ1thZ25vXTsKKwlpZiAoIXBhZy0+cGFnaV9pbml0KSB7CisJCXBhZy0+cGFnaV9mcmVlY291bnQgPSBJTlRfR0VUKGFnaS0+YWdpX2ZyZWVjb3VudCwgQVJDSF9DT05WRVJUKTsKKwkJcGFnLT5wYWdpX2luaXQgPSAxOworCX0gZWxzZSB7CisJCS8qCisJCSAqIEl0J3MgcG9zc2libGUgZm9yIHRoZXNlIHRvIGJlIG91dCBvZiBzeW5jIGlmCisJCSAqIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIGEgZm9yY2VkIHNodXRkb3duLgorCQkgKi8KKwkJQVNTRVJUKHBhZy0+cGFnaV9mcmVlY291bnQgPT0KKwkJCQlJTlRfR0VUKGFnaS0+YWdpX2ZyZWVjb3VudCwgQVJDSF9DT05WRVJUKQorCQkJfHwgWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpOworCX0KKworI2lmZGVmIERFQlVHCisJeworCQlpbnQJaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgWEZTX0FHSV9VTkxJTktFRF9CVUNLRVRTOyBpKyspCisJCQlBU1NFUlQoYWdpLT5hZ2lfdW5saW5rZWRbaV0pOworCX0KKyNlbmRpZgorCisJWEZTX0JVRl9TRVRfVlRZUEVfUkVGKGJwLCBCX0ZTX0FHSSwgWEZTX0FHSV9SRUYpOworCSpicHAgPSBicDsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaWFsbG9jLmggYi9mcy94ZnMveGZzX2lhbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNmQwMDEKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2lhbGxvYy5oCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfSUFMTE9DX0hfXworI2RlZmluZQlfX1hGU19JQUxMT0NfSF9fCisKK3N0cnVjdCB4ZnNfYnVmOworc3RydWN0IHhmc19kaW5vZGU7CitzdHJ1Y3QgeGZzX21vdW50Oworc3RydWN0IHhmc190cmFuczsKKworLyoKKyAqIEFsbG9jYXRpb24gcGFyYW1ldGVycyBmb3IgaW5vZGUgYWxsb2NhdGlvbi4KKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSUFMTE9DX0lOT0RFUykKK2ludCB4ZnNfaWFsbG9jX2lub2RlcyhzdHJ1Y3QgeGZzX21vdW50ICptcCk7CisjZGVmaW5lCVhGU19JQUxMT0NfSU5PREVTKG1wKQl4ZnNfaWFsbG9jX2lub2RlcyhtcCkKKyNlbHNlCisjZGVmaW5lCVhGU19JQUxMT0NfSU5PREVTKG1wKQkoKG1wKS0+bV9pYWxsb2NfaW5vcykKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSUFMTE9DX0JMT0NLUykKK3hmc19leHRsZW5fdCB4ZnNfaWFsbG9jX2Jsb2NrcyhzdHJ1Y3QgeGZzX21vdW50ICptcCk7CisjZGVmaW5lCVhGU19JQUxMT0NfQkxPQ0tTKG1wKQl4ZnNfaWFsbG9jX2Jsb2NrcyhtcCkKKyNlbHNlCisjZGVmaW5lCVhGU19JQUxMT0NfQkxPQ0tTKG1wKQkoKG1wKS0+bV9pYWxsb2NfYmxrcykKKyNlbmRpZgorCisvKgorICogRm9yIHNtYWxsIGJsb2NrIGZpbGUgc3lzdGVtcywgbW92ZSBpbm9kZXMgaW4gY2x1c3RlcnMgb2YgdGhpcyBzaXplLgorICogV2hlbiB3ZSBkb24ndCBoYXZlIGEgbG90IG9mIG1lbW9yeSwgaG93ZXZlciwgd2UgZ28gYSBiaXQgc21hbGxlcgorICogdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgQUdJIGFuZCBpYWxsb2MgYnRyZWUgYmxvY2tzIHdlIG5lZWQgdG8ga2VlcAorICogYXJvdW5kIGZvciB4ZnNfZGlsb2NhdGUoKS4gIFdlIGNob29zZSB3aGljaCBvbmUgdG8gdXNlIGluCisgKiB4ZnNfbW91bnRfaW50KCkuCisgKi8KKyNkZWZpbmUJWEZTX0lOT0RFX0JJR19DTFVTVEVSX1NJWkUJODE5MgorI2RlZmluZQlYRlNfSU5PREVfU01BTExfQ0xVU1RFUl9TSVpFCTQwOTYKKyNkZWZpbmUJWEZTX0lOT0RFX0NMVVNURVJfU0laRShtcCkJKG1wKS0+bV9pbm9kZV9jbHVzdGVyX3NpemUKKworLyoKKyAqIE1ha2UgYW4gaW5vZGUgcG9pbnRlciBvdXQgb2YgdGhlIGJ1ZmZlci9vZmZzZXQuCisgKi8KKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX01BS0VfSVBUUikKK3N0cnVjdCB4ZnNfZGlub2RlICp4ZnNfbWFrZV9pcHRyKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBzdHJ1Y3QgeGZzX2J1ZiAqYiwgaW50IG8pOworI2RlZmluZQlYRlNfTUFLRV9JUFRSKG1wLGIsbykJCXhmc19tYWtlX2lwdHIobXAsYixvKQorI2Vsc2UKKyNkZWZpbmUJWEZTX01BS0VfSVBUUihtcCxiLG8pIFwKKwkoKHhmc19kaW5vZGVfdCAqKSh4ZnNfYnVmX29mZnNldChiLCAobykgPDwgKG1wKS0+bV9zYi5zYl9pbm9kZWxvZykpKQorI2VuZGlmCisKKy8qCisgKiBGaW5kIGEgZnJlZSAoc2V0KSBiaXQgaW4gdGhlIGlub2RlIGJpdG1hc2suCisgKi8KKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lBTExPQ19GSU5EX0ZSRUUpCitpbnQgeGZzX2lhbGxvY19maW5kX2ZyZWUoeGZzX2lub2ZyZWVfdCAqZnApOworI2RlZmluZQlYRlNfSUFMTE9DX0ZJTkRfRlJFRShmcCkJeGZzX2lhbGxvY19maW5kX2ZyZWUoZnApCisjZWxzZQorI2RlZmluZQlYRlNfSUFMTE9DX0ZJTkRfRlJFRShmcCkJeGZzX2xvd2JpdDY0KCooZnApKQorI2VuZGlmCisKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoKKyAqIFByb3RvdHlwZXMgZm9yIHZpc2libGUgeGZzX2lhbGxvYy5jIHJvdXRpbmVzLgorICovCisKKy8qCisgKiBBbGxvY2F0ZSBhbiBpbm9kZSBvbiBkaXNrLgorICogTW9kZSBpcyB1c2VkIHRvIHRlbGwgd2hldGhlciB0aGUgbmV3IGlub2RlIHdpbGwgbmVlZCBzcGFjZSwgYW5kIHdoZXRoZXIKKyAqIGl0IGlzIGEgZGlyZWN0b3J5LgorICoKKyAqIFRvIHdvcmsgd2l0aGluIHRoZSBjb25zdHJhaW50IG9mIG9uZSBhbGxvY2F0aW9uIHBlciB0cmFuc2FjdGlvbiwKKyAqIHhmc19kaWFsbG9jKCkgaXMgZGVzaWduZWQgdG8gYmUgY2FsbGVkIHR3aWNlIGlmIGl0IGhhcyB0byBkbyBhbgorICogYWxsb2NhdGlvbiB0byBtYWtlIG1vcmUgZnJlZSBpbm9kZXMuICBJZiBhbiBpbm9kZSBpcworICogYXZhaWxhYmxlIHdpdGhvdXQgYW4gYWxsb2NhdGlvbiwgYWdicCB3b3VsZCBiZSBzZXQgdG8gdGhlIGN1cnJlbnQKKyAqIGFnYnAgYW5kIGFsbG9jX2RvbmUgc2V0IHRvIGZhbHNlLgorICogSWYgYW4gYWxsb2NhdGlvbiBuZWVkZWQgdG8gYmUgZG9uZSwgYWdicCB3b3VsZCBiZSBzZXQgdG8gdGhlCisgKiBpbm9kZSBoZWFkZXIgb2YgdGhlIGFsbG9jYXRpb24gZ3JvdXAgYW5kIGFsbG9jX2RvbmUgc2V0IHRvIHRydWUuCisgKiBUaGUgY2FsbGVyIHNob3VsZCB0aGVuIGNvbW1pdCB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBhbmQgYWxsb2NhdGUgYSBuZXcKKyAqIHRyYW5zYWN0aW9uLiAgeGZzX2RpYWxsb2MoKSBzaG91bGQgdGhlbiBiZSBjYWxsZWQgYWdhaW4gd2l0aAorICogdGhlIGFnYnAgdmFsdWUgcmV0dXJuZWQgZnJvbSB0aGUgcHJldmlvdXMgY2FsbC4KKyAqCisgKiBPbmNlIHdlIHN1Y2Nlc3NmdWxseSBwaWNrIGFuIGlub2RlIGl0cyBudW1iZXIgaXMgcmV0dXJuZWQgYW5kIHRoZQorICogb24tZGlzayBkYXRhIHN0cnVjdHVyZXMgYXJlIHVwZGF0ZWQuICBUaGUgaW5vZGUgaXRzZWxmIGlzIG5vdCByZWFkCisgKiBpbiwgc2luY2UgZG9pbmcgc28gd291bGQgYnJlYWsgb3JkZXJpbmcgY29uc3RyYWludHMgd2l0aCB4ZnNfcmVjbGFpbS4KKyAqCisgKiAqYWdicCBzaG91bGQgYmUgc2V0IHRvIE5VTEwgb24gdGhlIGZpcnN0IGNhbGwsICphbGxvY19kb25lIHNldCB0byBGQUxTRS4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2RpYWxsb2MoCisJc3RydWN0IHhmc190cmFucyAqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2lub190CXBhcmVudCwJCS8qIHBhcmVudCBpbm9kZSAoZGlyZWN0b3J5KSAqLworCW1vZGVfdAkJbW9kZSwJCS8qIG1vZGUgYml0cyBmb3IgbmV3IGlub2RlICovCisJaW50CQlva2FsbG9jLAkvKiBvayB0byBhbGxvY2F0ZSBtb3JlIHNwYWNlICovCisJc3RydWN0IHhmc19idWYJKiphZ2JwLAkJLyogYnVmIGZvciBhLmcuIGlub2RlIGhlYWRlciAqLworCWJvb2xlYW5fdAkqYWxsb2NfZG9uZSwJLyogYW4gYWxsb2NhdGlvbiB3YXMgZG9uZSB0byByZXBsZW5pc2gKKwkJCQkJICAgdGhlIGZyZWUgaW5vZGVzICovCisJeGZzX2lub190CSppbm9wKTsJCS8qIGlub2RlIG51bWJlciBhbGxvY2F0ZWQgKi8KKworLyoKKyAqIEZyZWUgZGlzayBpbm9kZS4gIENhcmVmdWxseSBhdm9pZHMgdG91Y2hpbmcgdGhlIGluY29yZSBpbm9kZSwgYWxsCisgKiBtYW5pcHVsYXRpb25zIGluY29yZSBhcmUgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5LgorICogVGhlIG9uLWRpc2sgaW5vZGUgaXMgbm90IGNoYW5nZWQgYnkgdGhpcyBvcGVyYXRpb24sIG9ubHkgdGhlCisgKiBidHJlZSAoZnJlZSBpbm9kZSBtYXNrKSBpcyBjaGFuZ2VkLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfZGlmcmVlKAorCXN0cnVjdCB4ZnNfdHJhbnMgKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19pbm9fdAlpbm9kZSwJCS8qIGlub2RlIHRvIGJlIGZyZWVkICovCisJc3RydWN0IHhmc19ibWFwX2ZyZWUgKmZsaXN0LAkvKiBleHRlbnRzIHRvIGZyZWUgKi8KKwlpbnQJCSpkZWxldGUsCS8qIHNldCBpZiBpbm9kZSBjbHVzdGVyIHdhcyBkZWxldGVkICovCisJeGZzX2lub190CSpmaXJzdF9pbm8pOwkvKiBmaXJzdCBpbm9kZSBpbiBkZWxldGVkIGNsdXN0ZXIgKi8KKworLyoKKyAqIFJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhlIGlub2RlIGluIGJuby9sZW4vb2ZmLAorICogZm9yIG1hcHBpbmcgaXQgaW50byBhIGJ1ZmZlci4KKyAqLworaW50Cit4ZnNfZGlsb2NhdGUoCisJc3RydWN0IHhmc19tb3VudCAqbXAsCQkvKiBmaWxlIHN5c3RlbSBtb3VudCBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgeGZzX3RyYW5zICp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfaW5vX3QJaW5vLAkJLyogaW5vZGUgdG8gbG9jYXRlICovCisJeGZzX2ZzYmxvY2tfdAkqYm5vLAkJLyogb3V0cHV0OiBibG9jayBjb250YWluaW5nIGlub2RlICovCisJaW50CQkqbGVuLAkJLyogb3V0cHV0OiBudW0gYmxvY2tzIGluIGNsdXN0ZXIqLworCWludAkJKm9mZiwJCS8qIG91dHB1dDogaW5kZXggaW4gYmxvY2sgb2YgaW5vZGUgKi8KKwl1aW50CQlmbGFncyk7CQkvKiBmbGFncyBmb3IgaW5vZGUgYnRyZWUgbG9va3VwICovCisKKy8qCisgKiBDb21wdXRlIGFuZCBmaWxsIGluIHZhbHVlIG9mIG1faW5fbWF4bGV2ZWxzLgorICovCit2b2lkCit4ZnNfaWFsbG9jX2NvbXB1dGVfbWF4bGV2ZWxzKAorCXN0cnVjdCB4ZnNfbW91bnQgKm1wKTsJCS8qIGZpbGUgc3lzdGVtIG1vdW50IHN0cnVjdHVyZSAqLworCisvKgorICogTG9nIHNwZWNpZmllZCBmaWVsZHMgZm9yIHRoZSBhZyBoZHIgKGlub2RlIHNlY3Rpb24pCisgKi8KK3ZvaWQKK3hmc19pYWxsb2NfbG9nX2FnaSgKKwlzdHJ1Y3QgeGZzX3RyYW5zICp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwlzdHJ1Y3QgeGZzX2J1ZgkqYnAsCQkvKiBhbGxvY2F0aW9uIGdyb3VwIGhlYWRlciBidWZmZXIgKi8KKwlpbnQJCWZpZWxkcyk7CS8qIGJpdG1hc2sgb2YgZmllbGRzIHRvIGxvZyAqLworCisvKgorICogUmVhZCBpbiB0aGUgYWxsb2NhdGlvbiBncm91cCBoZWFkZXIgKGlub2RlIGFsbG9jYXRpb24gc2VjdGlvbikKKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2lhbGxvY19yZWFkX2FnaSgKKwlzdHJ1Y3QgeGZzX21vdW50ICptcCwJCS8qIGZpbGUgc3lzdGVtIG1vdW50IHN0cnVjdHVyZSAqLworCXN0cnVjdCB4ZnNfdHJhbnMgKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19hZ251bWJlcl90CWFnbm8sCQkvKiBhbGxvY2F0aW9uIGdyb3VwIG51bWJlciAqLworCXN0cnVjdCB4ZnNfYnVmCSoqYnBwKTsJCS8qIGFsbG9jYXRpb24gZ3JvdXAgaGRyIGJ1ZiAqLworCisjZW5kaWYJLyogX19LRVJORUxfXyAqLworCisjZW5kaWYJLyogX19YRlNfSUFMTE9DX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pYWxsb2NfYnRyZWUuYyBiL2ZzL3hmcy94ZnNfaWFsbG9jX2J0cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ0ZGFlYwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfaWFsbG9jX2J0cmVlLmMKQEAgLTAsMCArMSwyMDk0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisKKyNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2FnLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKKworLyoKKyAqIElub2RlIGFsbG9jYXRpb24gbWFuYWdlbWVudCBmb3IgWEZTLgorICovCisKKy8qCisgKiBQcm90b3R5cGVzIGZvciBpbnRlcm5hbCBmdW5jdGlvbnMuCisgKi8KKworU1RBVElDIHZvaWQgeGZzX2lub2J0X2xvZ19ibG9jayh4ZnNfdHJhbnNfdCAqLCB4ZnNfYnVmX3QgKiwgaW50KTsKK1NUQVRJQyB2b2lkIHhmc19pbm9idF9sb2dfa2V5cyh4ZnNfYnRyZWVfY3VyX3QgKiwgeGZzX2J1Zl90ICosIGludCwgaW50KTsKK1NUQVRJQyB2b2lkIHhmc19pbm9idF9sb2dfcHRycyh4ZnNfYnRyZWVfY3VyX3QgKiwgeGZzX2J1Zl90ICosIGludCwgaW50KTsKK1NUQVRJQyB2b2lkIHhmc19pbm9idF9sb2dfcmVjcyh4ZnNfYnRyZWVfY3VyX3QgKiwgeGZzX2J1Zl90ICosIGludCwgaW50KTsKK1NUQVRJQyBpbnQgeGZzX2lub2J0X2xzaGlmdCh4ZnNfYnRyZWVfY3VyX3QgKiwgaW50LCBpbnQgKik7CitTVEFUSUMgaW50IHhmc19pbm9idF9uZXdyb290KHhmc19idHJlZV9jdXJfdCAqLCBpbnQgKik7CitTVEFUSUMgaW50IHhmc19pbm9idF9yc2hpZnQoeGZzX2J0cmVlX2N1cl90ICosIGludCwgaW50ICopOworU1RBVElDIGludCB4ZnNfaW5vYnRfc3BsaXQoeGZzX2J0cmVlX2N1cl90ICosIGludCwgeGZzX2FnYmxvY2tfdCAqLAorCQl4ZnNfaW5vYnRfa2V5X3QgKiwgeGZzX2J0cmVlX2N1cl90ICoqLCBpbnQgKik7CitTVEFUSUMgaW50IHhmc19pbm9idF91cGRrZXkoeGZzX2J0cmVlX2N1cl90ICosIHhmc19pbm9idF9rZXlfdCAqLCBpbnQpOworCisvKgorICogSW50ZXJuYWwgZnVuY3Rpb25zLgorICovCisKKy8qCisgKiBTaW5nbGUgbGV2ZWwgb2YgdGhlIHhmc19pbm9idF9kZWxldGUgcmVjb3JkIGRlbGV0aW9uIHJvdXRpbmUuCisgKiBEZWxldGUgcmVjb3JkIHBvaW50ZWQgdG8gYnkgY3VyL2xldmVsLgorICogUmVtb3ZlIHRoZSByZWNvcmQgZnJvbSBpdHMgYmxvY2sgdGhlbiByZWJhbGFuY2UgdGhlIHRyZWUuCisgKiBSZXR1cm4gMCBmb3IgZXJyb3IsIDEgZm9yIGRvbmUsIDIgdG8gZ28gb24gdG8gdGhlIG5leHQgbGV2ZWwuCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19pbm9idF9kZWxyZWMoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCQlsZXZlbCwJLyogbGV2ZWwgcmVtb3ZpbmcgcmVjb3JkIGZyb20gKi8KKwlpbnQJCQkqc3RhdCkJLyogZmFpbC9kb25lL2dvLW9uICovCit7CisJeGZzX2J1Zl90CQkqYWdicDsJLyogYnVmZmVyIGZvciBhLmcuIGlub2RlIGhlYWRlciAqLworCXhmc19tb3VudF90CQkqbXA7CS8qIG1vdW50IHN0cnVjdHVyZSAqLworCXhmc19hZ2lfdAkJKmFnaTsJLyogYWxsb2NhdGlvbiBncm91cCBpbm9kZSBoZWFkZXIgKi8KKwl4ZnNfaW5vYnRfYmxvY2tfdAkqYmxvY2s7CS8qIGJ0cmVlIGJsb2NrIHJlY29yZC9rZXkgbGl2ZXMgaW4gKi8KKwl4ZnNfYWdibG9ja190CQlibm87CS8qIGJ0cmVlIGJsb2NrIG51bWJlciAqLworCXhmc19idWZfdAkJKmJwOwkvKiBidWZmZXIgZm9yIGJsb2NrICovCisJaW50CQkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCWludAkJCWk7CS8qIGxvb3AgaW5kZXggKi8KKwl4ZnNfaW5vYnRfa2V5X3QJCWtleTsJLyoga3AgcG9pbnRzIGhlcmUgaWYgYmxvY2sgaXMgbGV2ZWwgMCAqLworCXhmc19pbm9idF9rZXlfdAkJKmtwID0gTlVMTDsJLyogcG9pbnRlciB0byBidHJlZSBrZXlzICovCisJeGZzX2FnYmxvY2tfdAkJbGJubzsJLyogbGVmdCBibG9jaydzIGJsb2NrIG51bWJlciAqLworCXhmc19idWZfdAkJKmxicDsJLyogbGVmdCBibG9jaydzIGJ1ZmZlciBwb2ludGVyICovCisJeGZzX2lub2J0X2Jsb2NrX3QJKmxlZnQ7CS8qIGxlZnQgYnRyZWUgYmxvY2sgKi8KKwl4ZnNfaW5vYnRfa2V5X3QJCSpsa3A7CS8qIGxlZnQgYmxvY2sga2V5IHBvaW50ZXIgKi8KKwl4ZnNfaW5vYnRfcHRyX3QJCSpscHA7CS8qIGxlZnQgYmxvY2sgYWRkcmVzcyBwb2ludGVyICovCisJaW50CQkJbHJlY3MgPSAwOwkvKiBudW1iZXIgb2YgcmVjb3JkcyBpbiBsZWZ0IGJsb2NrICovCisJeGZzX2lub2J0X3JlY190CQkqbHJwOwkvKiBsZWZ0IGJsb2NrIHJlY29yZCBwb2ludGVyICovCisJeGZzX2lub2J0X3B0cl90CQkqcHAgPSBOVUxMOwkvKiBwb2ludGVyIHRvIGJ0cmVlIGFkZHJlc3NlcyAqLworCWludAkJCXB0cjsJLyogaW5kZXggaW4gYnRyZWUgYmxvY2sgZm9yIHRoaXMgcmVjICovCisJeGZzX2FnYmxvY2tfdAkJcmJubzsJLyogcmlnaHQgYmxvY2sncyBibG9jayBudW1iZXIgKi8KKwl4ZnNfYnVmX3QJCSpyYnA7CS8qIHJpZ2h0IGJsb2NrJ3MgYnVmZmVyIHBvaW50ZXIgKi8KKwl4ZnNfaW5vYnRfYmxvY2tfdAkqcmlnaHQ7CS8qIHJpZ2h0IGJ0cmVlIGJsb2NrICovCisJeGZzX2lub2J0X2tleV90CQkqcmtwOwkvKiByaWdodCBibG9jayBrZXkgcG9pbnRlciAqLworCXhmc19pbm9idF9yZWNfdAkJKnJwOwkvKiBwb2ludGVyIHRvIGJ0cmVlIHJlY29yZHMgKi8KKwl4ZnNfaW5vYnRfcHRyX3QJCSpycHA7CS8qIHJpZ2h0IGJsb2NrIGFkZHJlc3MgcG9pbnRlciAqLworCWludAkJCXJyZWNzID0gMDsJLyogbnVtYmVyIG9mIHJlY29yZHMgaW4gcmlnaHQgYmxvY2sgKi8KKwlpbnQJCQludW1yZWNzOworCXhmc19pbm9idF9yZWNfdAkJKnJycDsJLyogcmlnaHQgYmxvY2sgcmVjb3JkIHBvaW50ZXIgKi8KKwl4ZnNfYnRyZWVfY3VyX3QJCSp0Y3VyOwkvKiB0ZW1wb3JhcnkgYnRyZWUgY3Vyc29yICovCisKKwltcCA9IGN1ci0+YmNfbXA7CisKKwkvKgorCSAqIEdldCB0aGUgaW5kZXggb2YgdGhlIGVudHJ5IGJlaW5nIGRlbGV0ZWQsIGNoZWNrIGZvciBub3RoaW5nIHRoZXJlLgorCSAqLworCXB0ciA9IGN1ci0+YmNfcHRyc1tsZXZlbF07CisJaWYgKHB0ciA9PSAwKSB7CisJCSpzdGF0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBHZXQgdGhlIGJ1ZmZlciAmIGJsb2NrIGNvbnRhaW5pbmcgdGhlIHJlY29yZCBvciBrZXkvcHRyLgorCSAqLworCWJwID0gY3VyLT5iY19idWZzW2xldmVsXTsKKwlibG9jayA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0soYnApOworI2lmZGVmIERFQlVHCisJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBibG9jaywgbGV2ZWwsIGJwKSkpCisJCXJldHVybiBlcnJvcjsKKyNlbmRpZgorCS8qCisJICogRmFpbCBpZiB3ZSdyZSBvZmYgdGhlIGVuZCBvZiB0aGUgYmxvY2suCisJICovCisKKwludW1yZWNzID0gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKKwlpZiAocHRyID4gbnVtcmVjcykgeworCQkqc3RhdCA9IDA7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIEl0J3MgYSBub25sZWFmLiAgRXhjaXNlIHRoZSBrZXkgYW5kIHB0ciBiZWluZyBkZWxldGVkLCBieQorCSAqIHNsaWRpbmcgdGhlIGVudHJpZXMgcGFzdCB0aGVtIGRvd24gb25lLgorCSAqIExvZyB0aGUgY2hhbmdlZCBhcmVhcyBvZiB0aGUgYmxvY2suCisJICovCisJaWYgKGxldmVsID4gMCkgeworCQlrcCA9IFhGU19JTk9CVF9LRVlfQUREUihibG9jaywgMSwgY3VyKTsKKwkJcHAgPSBYRlNfSU5PQlRfUFRSX0FERFIoYmxvY2ssIDEsIGN1cik7CisjaWZkZWYgREVCVUcKKwkJZm9yIChpID0gcHRyOyBpIDwgbnVtcmVjczsgaSsrKSB7CisJCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NwdHIoY3VyLCBJTlRfR0VUKHBwW2ldLCBBUkNIX0NPTlZFUlQpLCBsZXZlbCkpKQorCQkJCXJldHVybiBlcnJvcjsKKwkJfQorI2VuZGlmCisJCWlmIChwdHIgPCBudW1yZWNzKSB7CisJCQltZW1tb3ZlKCZrcFtwdHIgLSAxXSwgJmtwW3B0cl0sCisJCQkJKG51bXJlY3MgLSBwdHIpICogc2l6ZW9mKCprcCkpOworCQkJbWVtbW92ZSgmcHBbcHRyIC0gMV0sICZwcFtwdHJdLAorCQkJCShudW1yZWNzIC0gcHRyKSAqIHNpemVvZigqa3ApKTsKKwkJCXhmc19pbm9idF9sb2dfa2V5cyhjdXIsIGJwLCBwdHIsIG51bXJlY3MgLSAxKTsKKwkJCXhmc19pbm9idF9sb2dfcHRycyhjdXIsIGJwLCBwdHIsIG51bXJlY3MgLSAxKTsKKwkJfQorCX0KKwkvKgorCSAqIEl0J3MgYSBsZWFmLiAgRXhjaXNlIHRoZSByZWNvcmQgYmVpbmcgZGVsZXRlZCwgYnkgc2xpZGluZyB0aGUKKwkgKiBlbnRyaWVzIHBhc3QgaXQgZG93biBvbmUuICBMb2cgdGhlIGNoYW5nZWQgYXJlYXMgb2YgdGhlIGJsb2NrLgorCSAqLworCWVsc2UgeworCQlycCA9IFhGU19JTk9CVF9SRUNfQUREUihibG9jaywgMSwgY3VyKTsKKwkJaWYgKHB0ciA8IG51bXJlY3MpIHsKKwkJCW1lbW1vdmUoJnJwW3B0ciAtIDFdLCAmcnBbcHRyXSwKKwkJCQkobnVtcmVjcyAtIHB0cikgKiBzaXplb2YoKnJwKSk7CisJCQl4ZnNfaW5vYnRfbG9nX3JlY3MoY3VyLCBicCwgcHRyLCBudW1yZWNzIC0gMSk7CisJCX0KKwkJLyoKKwkJICogSWYgaXQncyB0aGUgZmlyc3QgcmVjb3JkIGluIHRoZSBibG9jaywgd2UnbGwgbmVlZCBhIGtleQorCQkgKiBzdHJ1Y3R1cmUgdG8gcGFzcyB1cCB0byB0aGUgbmV4dCBsZXZlbCAodXBka2V5KS4KKwkJICovCisJCWlmIChwdHIgPT0gMSkgeworCQkJa2V5LmlyX3N0YXJ0aW5vID0gcnAtPmlyX3N0YXJ0aW5vOworCQkJa3AgPSAma2V5OworCQl9CisJfQorCS8qCisJICogRGVjcmVtZW50IGFuZCBsb2cgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBibG9jay4KKwkgKi8KKwludW1yZWNzLS07CisJSU5UX1NFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCBudW1yZWNzKTsKKwl4ZnNfaW5vYnRfbG9nX2Jsb2NrKGN1ci0+YmNfdHAsIGJwLCBYRlNfQkJfTlVNUkVDUyk7CisJLyoKKwkgKiBJcyB0aGlzIHRoZSByb290IGxldmVsPyAgSWYgc28sIHdlJ3JlIGFsbW9zdCBkb25lLgorCSAqLworCWlmIChsZXZlbCA9PSBjdXItPmJjX25sZXZlbHMgLSAxKSB7CisJCS8qCisJCSAqIElmIHRoaXMgaXMgdGhlIHJvb3QgbGV2ZWwsCisJCSAqIGFuZCB0aGVyZSdzIG9ubHkgb25lIGVudHJ5IGxlZnQsCisJCSAqIGFuZCBpdCdzIE5PVCB0aGUgbGVhZiBsZXZlbCwKKwkJICogdGhlbiB3ZSBjYW4gZ2V0IHJpZCBvZiB0aGlzIGxldmVsLgorCQkgKi8KKwkJaWYgKG51bXJlY3MgPT0gMSAmJiBsZXZlbCA+IDApIHsKKwkJCWFnYnAgPSBjdXItPmJjX3ByaXZhdGUuaS5hZ2JwOworCQkJYWdpID0gWEZTX0JVRl9UT19BR0koYWdicCk7CisJCQkvKgorCQkJICogcHAgaXMgc3RpbGwgc2V0IHRvIHRoZSBmaXJzdCBwb2ludGVyIGluIHRoZSBibG9jay4KKwkJCSAqIE1ha2UgaXQgdGhlIG5ldyByb290IG9mIHRoZSBidHJlZS4KKwkJCSAqLworCQkJYm5vID0gSU5UX0dFVChhZ2ktPmFnaV9yb290LCBBUkNIX0NPTlZFUlQpOworCQkJYWdpLT5hZ2lfcm9vdCA9ICpwcDsKKwkJCUlOVF9NT0QoYWdpLT5hZ2lfbGV2ZWwsIEFSQ0hfQ09OVkVSVCwgLTEpOworCQkJLyoKKwkJCSAqIEZyZWUgdGhlIGJsb2NrLgorCQkJICovCisJCQlpZiAoKGVycm9yID0geGZzX2ZyZWVfZXh0ZW50KGN1ci0+YmNfdHAsCisJCQkJWEZTX0FHQl9UT19GU0IobXAsIGN1ci0+YmNfcHJpdmF0ZS5pLmFnbm8sIGJubyksIDEpKSkKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQl4ZnNfdHJhbnNfYmludmFsKGN1ci0+YmNfdHAsIGJwKTsKKwkJCXhmc19pYWxsb2NfbG9nX2FnaShjdXItPmJjX3RwLCBhZ2JwLAorCQkJCVhGU19BR0lfUk9PVCB8IFhGU19BR0lfTEVWRUwpOworCQkJLyoKKwkJCSAqIFVwZGF0ZSB0aGUgY3Vyc29yIHNvIHRoZXJlJ3Mgb25lIGZld2VyIGxldmVsLgorCQkJICovCisJCQljdXItPmJjX2J1ZnNbbGV2ZWxdID0gTlVMTDsKKwkJCWN1ci0+YmNfbmxldmVscy0tOworCQl9IGVsc2UgaWYgKGxldmVsID4gMCAmJgorCQkJICAgKGVycm9yID0geGZzX2lub2J0X2RlY3JlbWVudChjdXIsIGxldmVsLCAmaSkpKQorCQkJcmV0dXJuIGVycm9yOworCQkqc3RhdCA9IDE7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIElmIHdlIGRlbGV0ZWQgdGhlIGxlZnRtb3N0IGVudHJ5IGluIHRoZSBibG9jaywgdXBkYXRlIHRoZQorCSAqIGtleSB2YWx1ZXMgYWJvdmUgdXMgaW4gdGhlIHRyZWUuCisJICovCisJaWYgKHB0ciA9PSAxICYmIChlcnJvciA9IHhmc19pbm9idF91cGRrZXkoY3VyLCBrcCwgbGV2ZWwgKyAxKSkpCisJCXJldHVybiBlcnJvcjsKKwkvKgorCSAqIElmIHRoZSBudW1iZXIgb2YgcmVjb3JkcyByZW1haW5pbmcgaW4gdGhlIGJsb2NrIGlzIGF0IGxlYXN0CisJICogdGhlIG1pbmltdW0sIHdlJ3JlIGRvbmUuCisJICovCisJaWYgKG51bXJlY3MgPj0gWEZTX0lOT0JUX0JMT0NLX01JTlJFQ1MobGV2ZWwsIGN1cikpIHsKKwkJaWYgKGxldmVsID4gMCAmJgorCQkgICAgKGVycm9yID0geGZzX2lub2J0X2RlY3JlbWVudChjdXIsIGxldmVsLCAmaSkpKQorCQkJcmV0dXJuIGVycm9yOworCQkqc3RhdCA9IDE7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIE90aGVyd2lzZSwgd2UgaGF2ZSB0byBtb3ZlIHNvbWUgcmVjb3JkcyBhcm91bmQgdG8ga2VlcCB0aGUKKwkgKiB0cmVlIGJhbGFuY2VkLiAgTG9vayBhdCB0aGUgbGVmdCBhbmQgcmlnaHQgc2libGluZyBibG9ja3MgdG8KKwkgKiBzZWUgaWYgd2UgY2FuIHJlLWJhbGFuY2UgYnkgbW92aW5nIG9ubHkgb25lIHJlY29yZC4KKwkgKi8KKwlyYm5vID0gSU5UX0dFVChibG9jay0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCk7CisJbGJubyA9IElOVF9HRVQoYmxvY2stPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCk7CisJYm5vID0gTlVMTEFHQkxPQ0s7CisJQVNTRVJUKHJibm8gIT0gTlVMTEFHQkxPQ0sgfHwgbGJubyAhPSBOVUxMQUdCTE9DSyk7CisJLyoKKwkgKiBEdXBsaWNhdGUgdGhlIGN1cnNvciBzbyBvdXIgYnRyZWUgbWFuaXB1bGF0aW9ucyBoZXJlIHdvbid0CisJICogZGlzcnVwdCB0aGUgbmV4dCBsZXZlbCB1cC4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX2R1cF9jdXJzb3IoY3VyLCAmdGN1cikpKQorCQlyZXR1cm4gZXJyb3I7CisJLyoKKwkgKiBJZiB0aGVyZSdzIGEgcmlnaHQgc2libGluZywgc2VlIGlmIGl0J3Mgb2sgdG8gc2hpZnQgYW4gZW50cnkKKwkgKiBvdXQgb2YgaXQuCisJICovCisJaWYgKHJibm8gIT0gTlVMTEFHQkxPQ0spIHsKKwkJLyoKKwkJICogTW92ZSB0aGUgdGVtcCBjdXJzb3IgdG8gdGhlIGxhc3QgZW50cnkgaW4gdGhlIG5leHQgYmxvY2suCisJCSAqIEFjdHVhbGx5IGFueSBlbnRyeSBidXQgdGhlIGZpcnN0IHdvdWxkIHN1ZmZpY2UuCisJCSAqLworCQlpID0geGZzX2J0cmVlX2xhc3RyZWModGN1ciwgbGV2ZWwpOworCQlYRlNfV0FOVF9DT1JSVVBURURfR09UTyhpID09IDEsIGVycm9yMCk7CisJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfaW5jcmVtZW50KHRjdXIsIGxldmVsLCAmaSkpKQorCQkJZ290byBlcnJvcjA7CisJCVhGU19XQU5UX0NPUlJVUFRFRF9HT1RPKGkgPT0gMSwgZXJyb3IwKTsKKwkJaSA9IHhmc19idHJlZV9sYXN0cmVjKHRjdXIsIGxldmVsKTsKKwkJWEZTX1dBTlRfQ09SUlVQVEVEX0dPVE8oaSA9PSAxLCBlcnJvcjApOworCQkvKgorCQkgKiBHcmFiIGEgcG9pbnRlciB0byB0aGUgYmxvY2suCisJCSAqLworCQlyYnAgPSB0Y3VyLT5iY19idWZzW2xldmVsXTsKKwkJcmlnaHQgPSBYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKHJicCk7CisjaWZkZWYgREVCVUcKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCByaWdodCwgbGV2ZWwsIHJicCkpKQorCQkJZ290byBlcnJvcjA7CisjZW5kaWYKKwkJLyoKKwkJICogR3JhYiB0aGUgY3VycmVudCBibG9jayBudW1iZXIsIGZvciBmdXR1cmUgdXNlLgorCQkgKi8KKwkJYm5vID0gSU5UX0dFVChyaWdodC0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJUKTsKKwkJLyoKKwkJICogSWYgcmlnaHQgYmxvY2sgaXMgZnVsbCBlbm91Z2ggc28gdGhhdCByZW1vdmluZyBvbmUgZW50cnkKKwkJICogd29uJ3QgbWFrZSBpdCB0b28gZW1wdHksIGFuZCBsZWZ0LXNoaWZ0aW5nIGFuIGVudHJ5IG91dAorCQkgKiBvZiByaWdodCB0byB1cyB3b3Jrcywgd2UncmUgZG9uZS4KKwkJICovCisJCWlmIChJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIC0gMSA+PQorCQkgICAgIFhGU19JTk9CVF9CTE9DS19NSU5SRUNTKGxldmVsLCBjdXIpKSB7CisJCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2xzaGlmdCh0Y3VyLCBsZXZlbCwgJmkpKSkKKwkJCQlnb3RvIGVycm9yMDsKKwkJCWlmIChpKSB7CisJCQkJQVNTRVJUKElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgPj0KKwkJCQkgICAgICAgWEZTX0lOT0JUX0JMT0NLX01JTlJFQ1MobGV2ZWwsIGN1cikpOworCQkJCXhmc19idHJlZV9kZWxfY3Vyc29yKHRjdXIsCisJCQkJCQkgICAgIFhGU19CVFJFRV9OT0VSUk9SKTsKKwkJCQlpZiAobGV2ZWwgPiAwICYmCisJCQkJICAgIChlcnJvciA9IHhmc19pbm9idF9kZWNyZW1lbnQoY3VyLCBsZXZlbCwKKwkJCQkJCSZpKSkpCisJCQkJCXJldHVybiBlcnJvcjsKKwkJCQkqc3RhdCA9IDE7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkJLyoKKwkJICogT3RoZXJ3aXNlLCBncmFiIHRoZSBudW1iZXIgb2YgcmVjb3JkcyBpbiByaWdodCBmb3IKKwkJICogZnV0dXJlIHJlZmVyZW5jZSwgYW5kIGZpeCB1cCB0aGUgdGVtcCBjdXJzb3IgdG8gcG9pbnQKKwkJICogdG8gb3VyIGJsb2NrIGFnYWluIChsYXN0IHJlY29yZCkuCisJCSAqLworCQlycmVjcyA9IElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7CisJCWlmIChsYm5vICE9IE5VTExBR0JMT0NLKSB7CisJCQl4ZnNfYnRyZWVfZmlyc3RyZWModGN1ciwgbGV2ZWwpOworCQkJaWYgKChlcnJvciA9IHhmc19pbm9idF9kZWNyZW1lbnQodGN1ciwgbGV2ZWwsICZpKSkpCisJCQkJZ290byBlcnJvcjA7CisJCX0KKwl9CisJLyoKKwkgKiBJZiB0aGVyZSdzIGEgbGVmdCBzaWJsaW5nLCBzZWUgaWYgaXQncyBvayB0byBzaGlmdCBhbiBlbnRyeQorCSAqIG91dCBvZiBpdC4KKwkgKi8KKwlpZiAobGJubyAhPSBOVUxMQUdCTE9DSykgeworCQkvKgorCQkgKiBNb3ZlIHRoZSB0ZW1wIGN1cnNvciB0byB0aGUgZmlyc3QgZW50cnkgaW4gdGhlCisJCSAqIHByZXZpb3VzIGJsb2NrLgorCQkgKi8KKwkJeGZzX2J0cmVlX2ZpcnN0cmVjKHRjdXIsIGxldmVsKTsKKwkJaWYgKChlcnJvciA9IHhmc19pbm9idF9kZWNyZW1lbnQodGN1ciwgbGV2ZWwsICZpKSkpCisJCQlnb3RvIGVycm9yMDsKKwkJeGZzX2J0cmVlX2ZpcnN0cmVjKHRjdXIsIGxldmVsKTsKKwkJLyoKKwkJICogR3JhYiBhIHBvaW50ZXIgdG8gdGhlIGJsb2NrLgorCQkgKi8KKwkJbGJwID0gdGN1ci0+YmNfYnVmc1tsZXZlbF07CisJCWxlZnQgPSBYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKGxicCk7CisjaWZkZWYgREVCVUcKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBsZWZ0LCBsZXZlbCwgbGJwKSkpCisJCQlnb3RvIGVycm9yMDsKKyNlbmRpZgorCQkvKgorCQkgKiBHcmFiIHRoZSBjdXJyZW50IGJsb2NrIG51bWJlciwgZm9yIGZ1dHVyZSB1c2UuCisJCSAqLworCQlibm8gPSBJTlRfR0VUKGxlZnQtPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpOworCQkvKgorCQkgKiBJZiBsZWZ0IGJsb2NrIGlzIGZ1bGwgZW5vdWdoIHNvIHRoYXQgcmVtb3Zpbmcgb25lIGVudHJ5CisJCSAqIHdvbid0IG1ha2UgaXQgdG9vIGVtcHR5LCBhbmQgcmlnaHQtc2hpZnRpbmcgYW4gZW50cnkgb3V0CisJCSAqIG9mIGxlZnQgdG8gdXMgd29ya3MsIHdlJ3JlIGRvbmUuCisJCSAqLworCQlpZiAoSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIC0gMSA+PQorCQkgICAgIFhGU19JTk9CVF9CTE9DS19NSU5SRUNTKGxldmVsLCBjdXIpKSB7CisJCQlpZiAoKGVycm9yID0geGZzX2lub2J0X3JzaGlmdCh0Y3VyLCBsZXZlbCwgJmkpKSkKKwkJCQlnb3RvIGVycm9yMDsKKwkJCWlmIChpKSB7CisJCQkJQVNTRVJUKElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgPj0KKwkJCQkgICAgICAgWEZTX0lOT0JUX0JMT0NLX01JTlJFQ1MobGV2ZWwsIGN1cikpOworCQkJCXhmc19idHJlZV9kZWxfY3Vyc29yKHRjdXIsCisJCQkJCQkgICAgIFhGU19CVFJFRV9OT0VSUk9SKTsKKwkJCQlpZiAobGV2ZWwgPT0gMCkKKwkJCQkJY3VyLT5iY19wdHJzWzBdKys7CisJCQkJKnN0YXQgPSAxOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJCS8qCisJCSAqIE90aGVyd2lzZSwgZ3JhYiB0aGUgbnVtYmVyIG9mIHJlY29yZHMgaW4gcmlnaHQgZm9yCisJCSAqIGZ1dHVyZSByZWZlcmVuY2UuCisJCSAqLworCQlscmVjcyA9IElOVF9HRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKKwl9CisJLyoKKwkgKiBEZWxldGUgdGhlIHRlbXAgY3Vyc29yLCB3ZSdyZSBkb25lIHdpdGggaXQuCisJICovCisJeGZzX2J0cmVlX2RlbF9jdXJzb3IodGN1ciwgWEZTX0JUUkVFX05PRVJST1IpOworCS8qCisJICogSWYgaGVyZSwgd2UgbmVlZCB0byBkbyBhIGpvaW4gdG8ga2VlcCB0aGUgdHJlZSBiYWxhbmNlZC4KKwkgKi8KKwlBU1NFUlQoYm5vICE9IE5VTExBR0JMT0NLKTsKKwkvKgorCSAqIFNlZSBpZiB3ZSBjYW4gam9pbiB3aXRoIHRoZSBsZWZ0IG5laWdoYm9yIGJsb2NrLgorCSAqLworCWlmIChsYm5vICE9IE5VTExBR0JMT0NLICYmCisJICAgIGxyZWNzICsgbnVtcmVjcyA8PSBYRlNfSU5PQlRfQkxPQ0tfTUFYUkVDUyhsZXZlbCwgY3VyKSkgeworCQkvKgorCQkgKiBTZXQgInJpZ2h0IiB0byBiZSB0aGUgc3RhcnRpbmcgYmxvY2ssCisJCSAqICJsZWZ0IiB0byBiZSB0aGUgbGVmdCBuZWlnaGJvci4KKwkJICovCisJCXJibm8gPSBibm87CisJCXJpZ2h0ID0gYmxvY2s7CisJCXJyZWNzID0gSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKTsKKwkJcmJwID0gYnA7CisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZzKG1wLCBjdXItPmJjX3RwLAorCQkJCWN1ci0+YmNfcHJpdmF0ZS5pLmFnbm8sIGxibm8sIDAsICZsYnAsCisJCQkJWEZTX0lOT19CVFJFRV9SRUYpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJbGVmdCA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0sobGJwKTsKKwkJbHJlY3MgPSBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgbGVmdCwgbGV2ZWwsIGxicCkpKQorCQkJcmV0dXJuIGVycm9yOworCX0KKwkvKgorCSAqIElmIHRoYXQgd29uJ3Qgd29yaywgc2VlIGlmIHdlIGNhbiBqb2luIHdpdGggdGhlIHJpZ2h0IG5laWdoYm9yIGJsb2NrLgorCSAqLworCWVsc2UgaWYgKHJibm8gIT0gTlVMTEFHQkxPQ0sgJiYKKwkJIHJyZWNzICsgbnVtcmVjcyA8PSBYRlNfSU5PQlRfQkxPQ0tfTUFYUkVDUyhsZXZlbCwgY3VyKSkgeworCQkvKgorCQkgKiBTZXQgImxlZnQiIHRvIGJlIHRoZSBzdGFydGluZyBibG9jaywKKwkJICogInJpZ2h0IiB0byBiZSB0aGUgcmlnaHQgbmVpZ2hib3IuCisJCSAqLworCQlsYm5vID0gYm5vOworCQlsZWZ0ID0gYmxvY2s7CisJCWxyZWNzID0gSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOworCQlsYnAgPSBicDsKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZnMobXAsIGN1ci0+YmNfdHAsCisJCQkJY3VyLT5iY19wcml2YXRlLmkuYWdubywgcmJubywgMCwgJnJicCwKKwkJCQlYRlNfSU5PX0JUUkVFX1JFRikpKQorCQkJcmV0dXJuIGVycm9yOworCQlyaWdodCA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0socmJwKTsKKwkJcnJlY3MgPSBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIHJpZ2h0LCBsZXZlbCwgcmJwKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJfQorCS8qCisJICogT3RoZXJ3aXNlLCB3ZSBjYW4ndCBmaXggdGhlIGltYmFsYW5jZS4KKwkgKiBKdXN0IHJldHVybi4gIFRoaXMgaXMgcHJvYmFibHkgYSBsb2dpYyBlcnJvciwgYnV0IGl0J3Mgbm90IGZhdGFsLgorCSAqLworCWVsc2UgeworCQlpZiAobGV2ZWwgPiAwICYmIChlcnJvciA9IHhmc19pbm9idF9kZWNyZW1lbnQoY3VyLCBsZXZlbCwgJmkpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJKnN0YXQgPSAxOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBXZSdyZSBub3cgZ29pbmcgdG8gam9pbiAibGVmdCIgYW5kICJyaWdodCIgYnkgbW92aW5nIGFsbCB0aGUgc3R1ZmYKKwkgKiBpbiAicmlnaHQiIHRvICJsZWZ0IiBhbmQgZGVsZXRpbmcgInJpZ2h0Ii4KKwkgKi8KKwlpZiAobGV2ZWwgPiAwKSB7CisJCS8qCisJCSAqIEl0J3MgYSBub24tbGVhZi4gIE1vdmUga2V5cyBhbmQgcG9pbnRlcnMuCisJCSAqLworCQlsa3AgPSBYRlNfSU5PQlRfS0VZX0FERFIobGVmdCwgbHJlY3MgKyAxLCBjdXIpOworCQlscHAgPSBYRlNfSU5PQlRfUFRSX0FERFIobGVmdCwgbHJlY3MgKyAxLCBjdXIpOworCQlya3AgPSBYRlNfSU5PQlRfS0VZX0FERFIocmlnaHQsIDEsIGN1cik7CisJCXJwcCA9IFhGU19JTk9CVF9QVFJfQUREUihyaWdodCwgMSwgY3VyKTsKKyNpZmRlZiBERUJVRworCQlmb3IgKGkgPSAwOyBpIDwgcnJlY3M7IGkrKykgeworCQkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgSU5UX0dFVChycHBbaV0sIEFSQ0hfQ09OVkVSVCksIGxldmVsKSkpCisJCQkJcmV0dXJuIGVycm9yOworCQl9CisjZW5kaWYKKwkJbWVtY3B5KGxrcCwgcmtwLCBycmVjcyAqIHNpemVvZigqbGtwKSk7CisJCW1lbWNweShscHAsIHJwcCwgcnJlY3MgKiBzaXplb2YoKmxwcCkpOworCQl4ZnNfaW5vYnRfbG9nX2tleXMoY3VyLCBsYnAsIGxyZWNzICsgMSwgbHJlY3MgKyBycmVjcyk7CisJCXhmc19pbm9idF9sb2dfcHRycyhjdXIsIGxicCwgbHJlY3MgKyAxLCBscmVjcyArIHJyZWNzKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBJdCdzIGEgbGVhZi4gIE1vdmUgcmVjb3Jkcy4KKwkJICovCisJCWxycCA9IFhGU19JTk9CVF9SRUNfQUREUihsZWZ0LCBscmVjcyArIDEsIGN1cik7CisJCXJycCA9IFhGU19JTk9CVF9SRUNfQUREUihyaWdodCwgMSwgY3VyKTsKKwkJbWVtY3B5KGxycCwgcnJwLCBycmVjcyAqIHNpemVvZigqbHJwKSk7CisJCXhmc19pbm9idF9sb2dfcmVjcyhjdXIsIGxicCwgbHJlY3MgKyAxLCBscmVjcyArIHJyZWNzKTsKKwl9CisJLyoKKwkgKiBJZiB3ZSBqb2luZWQgd2l0aCB0aGUgbGVmdCBuZWlnaGJvciwgc2V0IHRoZSBidWZmZXIgaW4gdGhlCisJICogY3Vyc29yIHRvIHRoZSBsZWZ0IGJsb2NrLCBhbmQgZml4IHVwIHRoZSBpbmRleC4KKwkgKi8KKwlpZiAoYnAgIT0gbGJwKSB7CisJCXhmc19idHJlZV9zZXRidWYoY3VyLCBsZXZlbCwgbGJwKTsKKwkJY3VyLT5iY19wdHJzW2xldmVsXSArPSBscmVjczsKKwl9CisJLyoKKwkgKiBJZiB3ZSBqb2luZWQgd2l0aCB0aGUgcmlnaHQgbmVpZ2hib3IgYW5kIHRoZXJlJ3MgYSBsZXZlbCBhYm92ZQorCSAqIHVzLCBpbmNyZW1lbnQgdGhlIGN1cnNvciBhdCB0aGF0IGxldmVsLgorCSAqLworCWVsc2UgaWYgKGxldmVsICsgMSA8IGN1ci0+YmNfbmxldmVscyAmJgorCQkgKGVycm9yID0geGZzX2FsbG9jX2luY3JlbWVudChjdXIsIGxldmVsICsgMSwgJmkpKSkKKwkJcmV0dXJuIGVycm9yOworCS8qCisJICogRml4IHVwIHRoZSBudW1iZXIgb2YgcmVjb3JkcyBpbiB0aGUgc3Vydml2aW5nIGJsb2NrLgorCSAqLworCWxyZWNzICs9IHJyZWNzOworCUlOVF9TRVQobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCBscmVjcyk7CisJLyoKKwkgKiBGaXggdXAgdGhlIHJpZ2h0IGJsb2NrIHBvaW50ZXIgaW4gdGhlIHN1cnZpdmluZyBibG9jaywgYW5kIGxvZyBpdC4KKwkgKi8KKwlsZWZ0LT5iYl9yaWdodHNpYiA9IHJpZ2h0LT5iYl9yaWdodHNpYjsKKwl4ZnNfaW5vYnRfbG9nX2Jsb2NrKGN1ci0+YmNfdHAsIGxicCwgWEZTX0JCX05VTVJFQ1MgfCBYRlNfQkJfUklHSFRTSUIpOworCS8qCisJICogSWYgdGhlcmUgaXMgYSByaWdodCBzaWJsaW5nIG5vdywgbWFrZSBpdCBwb2ludCB0byB0aGUKKwkgKiByZW1haW5pbmcgYmxvY2suCisJICovCisJaWYgKElOVF9HRVQobGVmdC0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCkgIT0gTlVMTEFHQkxPQ0spIHsKKwkJeGZzX2lub2J0X2Jsb2NrX3QJKnJyYmxvY2s7CisJCXhmc19idWZfdAkJKnJyYnA7CisKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZnMobXAsIGN1ci0+YmNfdHAsCisJCQkJY3VyLT5iY19wcml2YXRlLmkuYWdubywgSU5UX0dFVChsZWZ0LT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSwgMCwKKwkJCQkmcnJicCwgWEZTX0lOT19CVFJFRV9SRUYpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJcnJibG9jayA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0socnJicCk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgcnJibG9jaywgbGV2ZWwsIHJyYnApKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJSU5UX1NFVChycmJsb2NrLT5iYl9sZWZ0c2liLCBBUkNIX0NPTlZFUlQsIGxibm8pOworCQl4ZnNfaW5vYnRfbG9nX2Jsb2NrKGN1ci0+YmNfdHAsIHJyYnAsIFhGU19CQl9MRUZUU0lCKTsKKwl9CisJLyoKKwkgKiBGcmVlIHRoZSBkZWxldGluZyBibG9jay4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2ZyZWVfZXh0ZW50KGN1ci0+YmNfdHAsIFhGU19BR0JfVE9fRlNCKG1wLAorCQkJCSAgICAgY3VyLT5iY19wcml2YXRlLmkuYWdubywgcmJubyksIDEpKSkKKwkJcmV0dXJuIGVycm9yOworCXhmc190cmFuc19iaW52YWwoY3VyLT5iY190cCwgcmJwKTsKKwkvKgorCSAqIFJlYWRqdXN0IHRoZSBwdHIgYXQgdGhpcyBsZXZlbCBpZiBpdCdzIG5vdCBhIGxlYWYsIHNpbmNlIGl0J3MKKwkgKiBzdGlsbCBwb2ludGluZyBhdCB0aGUgZGVsZXRpb24gcG9pbnQsIHdoaWNoIG1ha2VzIHRoZSBjdXJzb3IKKwkgKiBpbmNvbnNpc3RlbnQuICBJZiB0aGlzIG1ha2VzIHRoZSBwdHIgMCwgdGhlIGNhbGxlciBmaXhlcyBpdCB1cC4KKwkgKiBXZSBjYW4ndCB1c2UgZGVjcmVtZW50IGJlY2F1c2UgaXQgd291bGQgY2hhbmdlIHRoZSBuZXh0IGxldmVsIHVwLgorCSAqLworCWlmIChsZXZlbCA+IDApCisJCWN1ci0+YmNfcHRyc1tsZXZlbF0tLTsKKwkvKgorCSAqIFJldHVybiB2YWx1ZSBtZWFucyB0aGUgbmV4dCBsZXZlbCB1cCBoYXMgc29tZXRoaW5nIHRvIGRvLgorCSAqLworCSpzdGF0ID0gMjsKKwlyZXR1cm4gMDsKKworZXJyb3IwOgorCXhmc19idHJlZV9kZWxfY3Vyc29yKHRjdXIsIFhGU19CVFJFRV9FUlJPUik7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogSW5zZXJ0IG9uZSByZWNvcmQvbGV2ZWwuICBSZXR1cm4gaW5mb3JtYXRpb24gdG8gdGhlIGNhbGxlcgorICogYWxsb3dpbmcgdGhlIG5leHQgbGV2ZWwgdXAgdG8gcHJvY2VlZCBpZiBuZWNlc3NhcnkuCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19pbm9idF9pbnNyZWMoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCQlsZXZlbCwJLyogbGV2ZWwgdG8gaW5zZXJ0IHJlY29yZCBhdCAqLworCXhmc19hZ2Jsb2NrX3QJCSpibm9wLAkvKiBpL286IGJsb2NrIG51bWJlciBpbnNlcnRlZCAqLworCXhmc19pbm9idF9yZWNfdAkJKnJlY3AsCS8qIGkvbzogcmVjb3JkIGRhdGEgaW5zZXJ0ZWQgKi8KKwl4ZnNfYnRyZWVfY3VyX3QJCSoqY3VycCwJLyogb3V0cHV0OiBuZXcgY3Vyc29yIHJlcGxhY2luZyBjdXIgKi8KKwlpbnQJCQkqc3RhdCkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJeGZzX2lub2J0X2Jsb2NrX3QJKmJsb2NrOwkvKiBidHJlZSBibG9jayByZWNvcmQva2V5IGxpdmVzIGluICovCisJeGZzX2J1Zl90CQkqYnA7CS8qIGJ1ZmZlciBmb3IgYmxvY2sgKi8KKwlpbnQJCQllcnJvcjsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJaW50CQkJaTsJLyogbG9vcCBpbmRleCAqLworCXhmc19pbm9idF9rZXlfdAkJa2V5OwkvKiBrZXkgdmFsdWUgYmVpbmcgaW5zZXJ0ZWQgKi8KKwl4ZnNfaW5vYnRfa2V5X3QJCSprcD1OVUxMOwkvKiBwb2ludGVyIHRvIGJ0cmVlIGtleXMgKi8KKwl4ZnNfYWdibG9ja190CQluYm5vOwkvKiBibG9jayBudW1iZXIgb2YgYWxsb2NhdGVkIGJsb2NrICovCisJeGZzX2J0cmVlX2N1cl90CQkqbmN1cjsJLyogbmV3IGN1cnNvciB0byBiZSB1c2VkIGF0IG5leHQgbHZsICovCisJeGZzX2lub2J0X2tleV90CQlua2V5OwkvKiBuZXcga2V5IHZhbHVlLCBmcm9tIHNwbGl0ICovCisJeGZzX2lub2J0X3JlY190CQlucmVjOwkvKiBuZXcgcmVjb3JkIHZhbHVlLCBmb3IgY2FsbGVyICovCisJaW50CQkJbnVtcmVjczsKKwlpbnQJCQlvcHRyOwkvKiBvbGQgcHRyIHZhbHVlICovCisJeGZzX2lub2J0X3B0cl90CQkqcHA7CS8qIHBvaW50ZXIgdG8gYnRyZWUgYWRkcmVzc2VzICovCisJaW50CQkJcHRyOwkvKiBpbmRleCBpbiBidHJlZSBibG9jayBmb3IgdGhpcyByZWMgKi8KKwl4ZnNfaW5vYnRfcmVjX3QJCSpycD1OVUxMOwkvKiBwb2ludGVyIHRvIGJ0cmVlIHJlY29yZHMgKi8KKworCS8qCisJICogSWYgd2UgbWFkZSBpdCB0byB0aGUgcm9vdCBsZXZlbCwgYWxsb2NhdGUgYSBuZXcgcm9vdCBibG9jaworCSAqIGFuZCB3ZSdyZSBkb25lLgorCSAqLworCWlmIChsZXZlbCA+PSBjdXItPmJjX25sZXZlbHMpIHsKKwkJZXJyb3IgPSB4ZnNfaW5vYnRfbmV3cm9vdChjdXIsICZpKTsKKwkJKmJub3AgPSBOVUxMQUdCTE9DSzsKKwkJKnN0YXQgPSBpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCS8qCisJICogTWFrZSBhIGtleSBvdXQgb2YgdGhlIHJlY29yZCBkYXRhIHRvIGJlIGluc2VydGVkLCBhbmQgc2F2ZSBpdC4KKwkgKi8KKwlrZXkuaXJfc3RhcnRpbm8gPSByZWNwLT5pcl9zdGFydGlubzsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KKwlvcHRyID0gcHRyID0gY3VyLT5iY19wdHJzW2xldmVsXTsKKwkvKgorCSAqIElmIHdlJ3JlIG9mZiB0aGUgbGVmdCBlZGdlLCByZXR1cm4gZmFpbHVyZS4KKwkgKi8KKwlpZiAocHRyID09IDApIHsKKwkJKnN0YXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBHZXQgcG9pbnRlcnMgdG8gdGhlIGJ0cmVlIGJ1ZmZlciBhbmQgYmxvY2suCisJICovCisJYnAgPSBjdXItPmJjX2J1ZnNbbGV2ZWxdOworCWJsb2NrID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhicCk7CisJbnVtcmVjcyA9IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7CisjaWZkZWYgREVCVUcKKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGJsb2NrLCBsZXZlbCwgYnApKSkKKwkJcmV0dXJuIGVycm9yOworCS8qCisJICogQ2hlY2sgdGhhdCB0aGUgbmV3IGVudHJ5IGlzIGJlaW5nIGluc2VydGVkIGluIHRoZSByaWdodCBwbGFjZS4KKwkgKi8KKwlpZiAocHRyIDw9IG51bXJlY3MpIHsKKwkJaWYgKGxldmVsID09IDApIHsKKwkJCXJwID0gWEZTX0lOT0JUX1JFQ19BRERSKGJsb2NrLCBwdHIsIGN1cik7CisJCQl4ZnNfYnRyZWVfY2hlY2tfcmVjKGN1ci0+YmNfYnRudW0sIHJlY3AsIHJwKTsKKwkJfSBlbHNlIHsKKwkJCWtwID0gWEZTX0lOT0JUX0tFWV9BRERSKGJsb2NrLCBwdHIsIGN1cik7CisJCQl4ZnNfYnRyZWVfY2hlY2tfa2V5KGN1ci0+YmNfYnRudW0sICZrZXksIGtwKTsKKwkJfQorCX0KKyNlbmRpZgorCW5ibm8gPSBOVUxMQUdCTE9DSzsKKwluY3VyID0gKHhmc19idHJlZV9jdXJfdCAqKTA7CisJLyoKKwkgKiBJZiB0aGUgYmxvY2sgaXMgZnVsbCwgd2UgY2FuJ3QgaW5zZXJ0IHRoZSBuZXcgZW50cnkgdW50aWwgd2UKKwkgKiBtYWtlIHRoZSBibG9jayB1bi1mdWxsLgorCSAqLworCWlmIChudW1yZWNzID09IFhGU19JTk9CVF9CTE9DS19NQVhSRUNTKGxldmVsLCBjdXIpKSB7CisJCS8qCisJCSAqIEZpcnN0LCB0cnkgc2hpZnRpbmcgYW4gZW50cnkgdG8gdGhlIHJpZ2h0IG5laWdoYm9yLgorCQkgKi8KKwkJaWYgKChlcnJvciA9IHhmc19pbm9idF9yc2hpZnQoY3VyLCBsZXZlbCwgJmkpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJaWYgKGkpIHsKKwkJCS8qIG5vdGhpbmcgKi8KKwkJfQorCQkvKgorCQkgKiBOZXh0LCB0cnkgc2hpZnRpbmcgYW4gZW50cnkgdG8gdGhlIGxlZnQgbmVpZ2hib3IuCisJCSAqLworCQllbHNlIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfbHNoaWZ0KGN1ciwgbGV2ZWwsICZpKSkpCisJCQkJcmV0dXJuIGVycm9yOworCQkJaWYgKGkpIHsKKwkJCQlvcHRyID0gcHRyID0gY3VyLT5iY19wdHJzW2xldmVsXTsKKwkJCX0gZWxzZSB7CisJCQkJLyoKKwkJCQkgKiBOZXh0LCB0cnkgc3BsaXR0aW5nIHRoZSBjdXJyZW50IGJsb2NrCisJCQkJICogaW4gaGFsZi4gSWYgdGhpcyB3b3JrcyB3ZSBoYXZlIHRvCisJCQkJICogcmUtc2V0IG91ciB2YXJpYWJsZXMgYmVjYXVzZQorCQkJCSAqIHdlIGNvdWxkIGJlIGluIGEgZGlmZmVyZW50IGJsb2NrIG5vdy4KKwkJCQkgKi8KKwkJCQlpZiAoKGVycm9yID0geGZzX2lub2J0X3NwbGl0KGN1ciwgbGV2ZWwsICZuYm5vLAorCQkJCQkJJm5rZXksICZuY3VyLCAmaSkpKQorCQkJCQlyZXR1cm4gZXJyb3I7CisJCQkJaWYgKGkpIHsKKwkJCQkJYnAgPSBjdXItPmJjX2J1ZnNbbGV2ZWxdOworCQkJCQlibG9jayA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0soYnApOworI2lmZGVmIERFQlVHCisJCQkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwKKwkJCQkJCQlibG9jaywgbGV2ZWwsIGJwKSkpCisJCQkJCQlyZXR1cm4gZXJyb3I7CisjZW5kaWYKKwkJCQkJcHRyID0gY3VyLT5iY19wdHJzW2xldmVsXTsKKwkJCQkJbnJlYy5pcl9zdGFydGlubyA9IG5rZXkuaXJfc3RhcnRpbm87IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCisJCQkJfSBlbHNlIHsKKwkJCQkJLyoKKwkJCQkJICogT3RoZXJ3aXNlIHRoZSBpbnNlcnQgZmFpbHMuCisJCQkJCSAqLworCQkJCQkqc3RhdCA9IDA7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGVyZSdzIHJvb20gZm9yIG91ciBuZXcgZW50cnkgaW4gdGhlIGJsb2NrCisJICogd2UncmUgcG9pbnRpbmcgYXQuCisJICovCisJbnVtcmVjcyA9IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCk7CisJaWYgKGxldmVsID4gMCkgeworCQkvKgorCQkgKiBJdCdzIGEgbm9uLWxlYWYgZW50cnkuICBNYWtlIGEgaG9sZSBmb3IgdGhlIG5ldyBkYXRhCisJCSAqIGluIHRoZSBrZXkgYW5kIHB0ciByZWdpb25zIG9mIHRoZSBibG9jay4KKwkJICovCisJCWtwID0gWEZTX0lOT0JUX0tFWV9BRERSKGJsb2NrLCAxLCBjdXIpOworCQlwcCA9IFhGU19JTk9CVF9QVFJfQUREUihibG9jaywgMSwgY3VyKTsKKyNpZmRlZiBERUJVRworCQlmb3IgKGkgPSBudW1yZWNzOyBpID49IHB0cjsgaS0tKSB7CisJCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NwdHIoY3VyLCBJTlRfR0VUKHBwW2kgLSAxXSwgQVJDSF9DT05WRVJUKSwgbGV2ZWwpKSkKKwkJCQlyZXR1cm4gZXJyb3I7CisJCX0KKyNlbmRpZgorCQltZW1tb3ZlKCZrcFtwdHJdLCAma3BbcHRyIC0gMV0sCisJCQkobnVtcmVjcyAtIHB0ciArIDEpICogc2l6ZW9mKCprcCkpOworCQltZW1tb3ZlKCZwcFtwdHJdLCAmcHBbcHRyIC0gMV0sCisJCQkobnVtcmVjcyAtIHB0ciArIDEpICogc2l6ZW9mKCpwcCkpOworCQkvKgorCQkgKiBOb3cgc3R1ZmYgdGhlIG5ldyBkYXRhIGluLCBidW1wIG51bXJlY3MgYW5kIGxvZyB0aGUgbmV3IGRhdGEuCisJCSAqLworI2lmZGVmIERFQlVHCisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsICpibm9wLCBsZXZlbCkpKQorCQkJcmV0dXJuIGVycm9yOworI2VuZGlmCisJCWtwW3B0ciAtIDFdID0ga2V5OyAvKiBJTlRfOiBzdHJ1Y3QgY29weSAqLworCQlJTlRfU0VUKHBwW3B0ciAtIDFdLCBBUkNIX0NPTlZFUlQsICpibm9wKTsKKwkJbnVtcmVjcysrOworCQlJTlRfU0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIG51bXJlY3MpOworCQl4ZnNfaW5vYnRfbG9nX2tleXMoY3VyLCBicCwgcHRyLCBudW1yZWNzKTsKKwkJeGZzX2lub2J0X2xvZ19wdHJzKGN1ciwgYnAsIHB0ciwgbnVtcmVjcyk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogSXQncyBhIGxlYWYgZW50cnkuICBNYWtlIGEgaG9sZSBmb3IgdGhlIG5ldyByZWNvcmQuCisJCSAqLworCQlycCA9IFhGU19JTk9CVF9SRUNfQUREUihibG9jaywgMSwgY3VyKTsKKwkJbWVtbW92ZSgmcnBbcHRyXSwgJnJwW3B0ciAtIDFdLAorCQkJKG51bXJlY3MgLSBwdHIgKyAxKSAqIHNpemVvZigqcnApKTsKKwkJLyoKKwkJICogTm93IHN0dWZmIHRoZSBuZXcgcmVjb3JkIGluLCBidW1wIG51bXJlY3MKKwkJICogYW5kIGxvZyB0aGUgbmV3IGRhdGEuCisJCSAqLworCQlycFtwdHIgLSAxXSA9ICpyZWNwOyAvKiBJTlRfOiBzdHJ1Y3QgY29weSAqLworCQludW1yZWNzKys7CisJCUlOVF9TRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCwgbnVtcmVjcyk7CisJCXhmc19pbm9idF9sb2dfcmVjcyhjdXIsIGJwLCBwdHIsIG51bXJlY3MpOworCX0KKwkvKgorCSAqIExvZyB0aGUgbmV3IG51bWJlciBvZiByZWNvcmRzIGluIHRoZSBidHJlZSBoZWFkZXIuCisJICovCisJeGZzX2lub2J0X2xvZ19ibG9jayhjdXItPmJjX3RwLCBicCwgWEZTX0JCX05VTVJFQ1MpOworI2lmZGVmIERFQlVHCisJLyoKKwkgKiBDaGVjayB0aGF0IHRoZSBrZXkvcmVjb3JkIGlzIGluIHRoZSByaWdodCBwbGFjZSwgbm93LgorCSAqLworCWlmIChwdHIgPCBudW1yZWNzKSB7CisJCWlmIChsZXZlbCA9PSAwKQorCQkJeGZzX2J0cmVlX2NoZWNrX3JlYyhjdXItPmJjX2J0bnVtLCBycCArIHB0ciAtIDEsCisJCQkJcnAgKyBwdHIpOworCQllbHNlCisJCQl4ZnNfYnRyZWVfY2hlY2tfa2V5KGN1ci0+YmNfYnRudW0sIGtwICsgcHRyIC0gMSwKKwkJCQlrcCArIHB0cik7CisJfQorI2VuZGlmCisJLyoKKwkgKiBJZiB3ZSBpbnNlcnRlZCBhdCB0aGUgc3RhcnQgb2YgYSBibG9jaywgdXBkYXRlIHRoZSBwYXJlbnRzJyBrZXlzLgorCSAqLworCWlmIChvcHRyID09IDEgJiYgKGVycm9yID0geGZzX2lub2J0X3VwZGtleShjdXIsICZrZXksIGxldmVsICsgMSkpKQorCQlyZXR1cm4gZXJyb3I7CisJLyoKKwkgKiBSZXR1cm4gdGhlIG5ldyBibG9jayBudW1iZXIsIGlmIGFueS4KKwkgKiBJZiB0aGVyZSBpcyBvbmUsIGdpdmUgYmFjayBhIHJlY29yZCB2YWx1ZSBhbmQgYSBjdXJzb3IgdG9vLgorCSAqLworCSpibm9wID0gbmJubzsKKwlpZiAobmJubyAhPSBOVUxMQUdCTE9DSykgeworCQkqcmVjcCA9IG5yZWM7IC8qIElOVF86IHN0cnVjdCBjb3B5ICovCisJCSpjdXJwID0gbmN1cjsKKwl9CisJKnN0YXQgPSAxOworCXJldHVybiAwOworfQorCisvKgorICogTG9nIGhlYWRlciBmaWVsZHMgZnJvbSBhIGJ0cmVlIGJsb2NrLgorICovCitTVEFUSUMgdm9pZAoreGZzX2lub2J0X2xvZ19ibG9jaygKKwl4ZnNfdHJhbnNfdAkJKnRwLAkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX2J1Zl90CQkqYnAsCS8qIGJ1ZmZlciBjb250YWluaW5nIGJ0cmVlIGJsb2NrICovCisJaW50CQkJZmllbGRzKQkvKiBtYXNrIG9mIGZpZWxkczogWEZTX0JCXy4uLiAqLworeworCWludAkJCWZpcnN0OwkvKiBmaXJzdCBieXRlIG9mZnNldCBsb2dnZWQgKi8KKwlpbnQJCQlsYXN0OwkvKiBsYXN0IGJ5dGUgb2Zmc2V0IGxvZ2dlZCAqLworCXN0YXRpYyBjb25zdCBzaG9ydAlvZmZzZXRzW10gPSB7CS8qIHRhYmxlIG9mIG9mZnNldHMgKi8KKwkJb2Zmc2V0b2YoeGZzX2lub2J0X2Jsb2NrX3QsIGJiX21hZ2ljKSwKKwkJb2Zmc2V0b2YoeGZzX2lub2J0X2Jsb2NrX3QsIGJiX2xldmVsKSwKKwkJb2Zmc2V0b2YoeGZzX2lub2J0X2Jsb2NrX3QsIGJiX251bXJlY3MpLAorCQlvZmZzZXRvZih4ZnNfaW5vYnRfYmxvY2tfdCwgYmJfbGVmdHNpYiksCisJCW9mZnNldG9mKHhmc19pbm9idF9ibG9ja190LCBiYl9yaWdodHNpYiksCisJCXNpemVvZih4ZnNfaW5vYnRfYmxvY2tfdCkKKwl9OworCisJeGZzX2J0cmVlX29mZnNldHMoZmllbGRzLCBvZmZzZXRzLCBYRlNfQkJfTlVNX0JJVFMsICZmaXJzdCwgJmxhc3QpOworCXhmc190cmFuc19sb2dfYnVmKHRwLCBicCwgZmlyc3QsIGxhc3QpOworfQorCisvKgorICogTG9nIGtleXMgZnJvbSBhIGJ0cmVlIGJsb2NrIChub25sZWFmKS4KKyAqLworU1RBVElDIHZvaWQKK3hmc19pbm9idF9sb2dfa2V5cygKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19idWZfdAkJKmJwLAkvKiBidWZmZXIgY29udGFpbmluZyBidHJlZSBibG9jayAqLworCWludAkJCWtmaXJzdCwJLyogaW5kZXggb2YgZmlyc3Qga2V5IHRvIGxvZyAqLworCWludAkJCWtsYXN0KQkvKiBpbmRleCBvZiBsYXN0IGtleSB0byBsb2cgKi8KK3sKKwl4ZnNfaW5vYnRfYmxvY2tfdAkqYmxvY2s7CS8qIGJ0cmVlIGJsb2NrIHRvIGxvZyBmcm9tICovCisJaW50CQkJZmlyc3Q7CS8qIGZpcnN0IGJ5dGUgb2Zmc2V0IGxvZ2dlZCAqLworCXhmc19pbm9idF9rZXlfdAkJKmtwOwkvKiBrZXkgcG9pbnRlciBpbiBidHJlZSBibG9jayAqLworCWludAkJCWxhc3Q7CS8qIGxhc3QgYnl0ZSBvZmZzZXQgbG9nZ2VkICovCisKKwlibG9jayA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0soYnApOworCWtwID0gWEZTX0lOT0JUX0tFWV9BRERSKGJsb2NrLCAxLCBjdXIpOworCWZpcnN0ID0gKGludCkoKHhmc19jYWRkcl90KSZrcFtrZmlyc3QgLSAxXSAtICh4ZnNfY2FkZHJfdClibG9jayk7CisJbGFzdCA9IChpbnQpKCgoeGZzX2NhZGRyX3QpJmtwW2tsYXN0XSAtIDEpIC0gKHhmc19jYWRkcl90KWJsb2NrKTsKKwl4ZnNfdHJhbnNfbG9nX2J1ZihjdXItPmJjX3RwLCBicCwgZmlyc3QsIGxhc3QpOworfQorCisvKgorICogTG9nIGJsb2NrIHBvaW50ZXIgZmllbGRzIGZyb20gYSBidHJlZSBibG9jayAobm9ubGVhZikuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfaW5vYnRfbG9nX3B0cnMoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfYnVmX3QJCSpicCwJLyogYnVmZmVyIGNvbnRhaW5pbmcgYnRyZWUgYmxvY2sgKi8KKwlpbnQJCQlwZmlyc3QsCS8qIGluZGV4IG9mIGZpcnN0IHBvaW50ZXIgdG8gbG9nICovCisJaW50CQkJcGxhc3QpCS8qIGluZGV4IG9mIGxhc3QgcG9pbnRlciB0byBsb2cgKi8KK3sKKwl4ZnNfaW5vYnRfYmxvY2tfdAkqYmxvY2s7CS8qIGJ0cmVlIGJsb2NrIHRvIGxvZyBmcm9tICovCisJaW50CQkJZmlyc3Q7CS8qIGZpcnN0IGJ5dGUgb2Zmc2V0IGxvZ2dlZCAqLworCWludAkJCWxhc3Q7CS8qIGxhc3QgYnl0ZSBvZmZzZXQgbG9nZ2VkICovCisJeGZzX2lub2J0X3B0cl90CQkqcHA7CS8qIGJsb2NrLXBvaW50ZXIgcG9pbnRlciBpbiBidHJlZSBibGsgKi8KKworCWJsb2NrID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhicCk7CisJcHAgPSBYRlNfSU5PQlRfUFRSX0FERFIoYmxvY2ssIDEsIGN1cik7CisJZmlyc3QgPSAoaW50KSgoeGZzX2NhZGRyX3QpJnBwW3BmaXJzdCAtIDFdIC0gKHhmc19jYWRkcl90KWJsb2NrKTsKKwlsYXN0ID0gKGludCkoKCh4ZnNfY2FkZHJfdCkmcHBbcGxhc3RdIC0gMSkgLSAoeGZzX2NhZGRyX3QpYmxvY2spOworCXhmc190cmFuc19sb2dfYnVmKGN1ci0+YmNfdHAsIGJwLCBmaXJzdCwgbGFzdCk7Cit9CisKKy8qCisgKiBMb2cgcmVjb3JkcyBmcm9tIGEgYnRyZWUgYmxvY2sgKGxlYWYpLgorICovCitTVEFUSUMgdm9pZAoreGZzX2lub2J0X2xvZ19yZWNzKAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2J1Zl90CQkqYnAsCS8qIGJ1ZmZlciBjb250YWluaW5nIGJ0cmVlIGJsb2NrICovCisJaW50CQkJcmZpcnN0LAkvKiBpbmRleCBvZiBmaXJzdCByZWNvcmQgdG8gbG9nICovCisJaW50CQkJcmxhc3QpCS8qIGluZGV4IG9mIGxhc3QgcmVjb3JkIHRvIGxvZyAqLworeworCXhmc19pbm9idF9ibG9ja190CSpibG9jazsJLyogYnRyZWUgYmxvY2sgdG8gbG9nIGZyb20gKi8KKwlpbnQJCQlmaXJzdDsJLyogZmlyc3QgYnl0ZSBvZmZzZXQgbG9nZ2VkICovCisJaW50CQkJbGFzdDsJLyogbGFzdCBieXRlIG9mZnNldCBsb2dnZWQgKi8KKwl4ZnNfaW5vYnRfcmVjX3QJCSpycDsJLyogcmVjb3JkIHBvaW50ZXIgZm9yIGJ0cmVlIGJsb2NrICovCisKKwlibG9jayA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0soYnApOworCXJwID0gWEZTX0lOT0JUX1JFQ19BRERSKGJsb2NrLCAxLCBjdXIpOworCWZpcnN0ID0gKGludCkoKHhmc19jYWRkcl90KSZycFtyZmlyc3QgLSAxXSAtICh4ZnNfY2FkZHJfdClibG9jayk7CisJbGFzdCA9IChpbnQpKCgoeGZzX2NhZGRyX3QpJnJwW3JsYXN0XSAtIDEpIC0gKHhmc19jYWRkcl90KWJsb2NrKTsKKwl4ZnNfdHJhbnNfbG9nX2J1ZihjdXItPmJjX3RwLCBicCwgZmlyc3QsIGxhc3QpOworfQorCisvKgorICogTG9va3VwIHRoZSByZWNvcmQuICBUaGUgY3Vyc29yIGlzIG1hZGUgdG8gcG9pbnQgdG8gaXQsIGJhc2VkIG9uIGRpci4KKyAqIFJldHVybiAwIGlmIGNhbid0IGZpbmQgYW55IHN1Y2ggcmVjb3JkLCAxIGZvciBzdWNjZXNzLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfaW5vYnRfbG9va3VwKAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2xvb2t1cF90CQlkaXIsCS8qIDw9LCA9PSwgb3IgPj0gKi8KKwlpbnQJCQkqc3RhdCkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJeGZzX2FnYmxvY2tfdAkJYWdibm87CS8qIGEuZy4gcmVsYXRpdmUgYnRyZWUgYmxvY2sgbnVtYmVyICovCisJeGZzX2FnbnVtYmVyX3QJCWFnbm87CS8qIGFsbG9jYXRpb24gZ3JvdXAgbnVtYmVyICovCisJeGZzX2lub2J0X2Jsb2NrX3QJKmJsb2NrPU5VTEw7CS8qIGN1cnJlbnQgYnRyZWUgYmxvY2sgKi8KKwlfX2ludDY0X3QJCWRpZmY7CS8qIGRpZmZlcmVuY2UgZm9yIHRoZSBjdXJyZW50IGtleSAqLworCWludAkJCWVycm9yOwkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwlpbnQJCQlrZXlubz0wOwkvKiBjdXJyZW50IGtleSBudW1iZXIgKi8KKwlpbnQJCQlsZXZlbDsJLyogbGV2ZWwgaW4gdGhlIGJ0cmVlICovCisJeGZzX21vdW50X3QJCSptcDsJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKworCS8qCisJICogR2V0IHRoZSBhbGxvY2F0aW9uIGdyb3VwIGhlYWRlciwgYW5kIHRoZSByb290IGJsb2NrIG51bWJlci4KKwkgKi8KKwltcCA9IGN1ci0+YmNfbXA7CisJeworCQl4ZnNfYWdpX3QJKmFnaTsJLyogYS5nLiBpbm9kZSBoZWFkZXIgKi8KKworCQlhZ2kgPSBYRlNfQlVGX1RPX0FHSShjdXItPmJjX3ByaXZhdGUuaS5hZ2JwKTsKKwkJYWdubyA9IElOVF9HRVQoYWdpLT5hZ2lfc2Vxbm8sIEFSQ0hfQ09OVkVSVCk7CisJCWFnYm5vID0gSU5UX0dFVChhZ2ktPmFnaV9yb290LCBBUkNIX0NPTlZFUlQpOworCX0KKwkvKgorCSAqIEl0ZXJhdGUgb3ZlciBlYWNoIGxldmVsIGluIHRoZSBidHJlZSwgc3RhcnRpbmcgYXQgdGhlIHJvb3QuCisJICogRm9yIGVhY2ggbGV2ZWwgYWJvdmUgdGhlIGxlYXZlcywgZmluZCB0aGUga2V5IHdlIG5lZWQsIGJhc2VkCisJICogb24gdGhlIGxvb2t1cCByZWNvcmQsIHRoZW4gZm9sbG93IHRoZSBjb3JyZXNwb25kaW5nIGJsb2NrCisJICogcG9pbnRlciBkb3duIHRvIHRoZSBuZXh0IGxldmVsLgorCSAqLworCWZvciAobGV2ZWwgPSBjdXItPmJjX25sZXZlbHMgLSAxLCBkaWZmID0gMTsgbGV2ZWwgPj0gMDsgbGV2ZWwtLSkgeworCQl4ZnNfYnVmX3QJKmJwOwkvKiBidWZmZXIgcG9pbnRlciBmb3IgYnRyZWUgYmxvY2sgKi8KKwkJeGZzX2RhZGRyX3QJZDsJLyogZGlzayBhZGRyZXNzIG9mIGJ0cmVlIGJsb2NrICovCisKKwkJLyoKKwkJICogR2V0IHRoZSBkaXNrIGFkZHJlc3Mgd2UncmUgbG9va2luZyBmb3IuCisJCSAqLworCQlkID0gWEZTX0FHQl9UT19EQUREUihtcCwgYWdubywgYWdibm8pOworCQkvKgorCQkgKiBJZiB0aGUgb2xkIGJ1ZmZlciBhdCB0aGlzIGxldmVsIGlzIGZvciBhIGRpZmZlcmVudCBibG9jaywKKwkJICogdGhyb3cgaXQgYXdheSwgb3RoZXJ3aXNlIGp1c3QgdXNlIGl0LgorCQkgKi8KKwkJYnAgPSBjdXItPmJjX2J1ZnNbbGV2ZWxdOworCQlpZiAoYnAgJiYgWEZTX0JVRl9BRERSKGJwKSAhPSBkKQorCQkJYnAgPSAoeGZzX2J1Zl90ICopMDsKKwkJaWYgKCFicCkgeworCQkJLyoKKwkJCSAqIE5lZWQgdG8gZ2V0IGEgbmV3IGJ1ZmZlci4gIFJlYWQgaXQsIHRoZW4KKwkJCSAqIHNldCBpdCBpbiB0aGUgY3Vyc29yLCByZWxlYXNpbmcgdGhlIG9sZCBvbmUuCisJCQkgKi8KKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfcmVhZF9idWZzKG1wLCBjdXItPmJjX3RwLAorCQkJCQlhZ25vLCBhZ2JubywgMCwgJmJwLCBYRlNfSU5PX0JUUkVFX1JFRikpKQorCQkJCXJldHVybiBlcnJvcjsKKwkJCXhmc19idHJlZV9zZXRidWYoY3VyLCBsZXZlbCwgYnApOworCQkJLyoKKwkJCSAqIFBvaW50IHRvIHRoZSBidHJlZSBibG9jaywgbm93IHRoYXQgd2UgaGF2ZSB0aGUgYnVmZmVyCisJCQkgKi8KKwkJCWJsb2NrID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhicCk7CisJCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGJsb2NrLCBsZXZlbCwKKwkJCQkJYnApKSkKKwkJCQlyZXR1cm4gZXJyb3I7CisJCX0gZWxzZQorCQkJYmxvY2sgPSBYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKGJwKTsKKwkJLyoKKwkJICogSWYgd2UgYWxyZWFkeSBoYWQgYSBrZXkgbWF0Y2ggYXQgYSBoaWdoZXIgbGV2ZWwsIHdlIGtub3cKKwkJICogd2UgbmVlZCB0byB1c2UgdGhlIGZpcnN0IGVudHJ5IGluIHRoaXMgYmxvY2suCisJCSAqLworCQlpZiAoZGlmZiA9PSAwKQorCQkJa2V5bm8gPSAxOworCQkvKgorCQkgKiBPdGhlcndpc2Ugd2UgbmVlZCB0byBzZWFyY2ggdGhpcyBibG9jay4gIERvIGEgYmluYXJ5IHNlYXJjaC4KKwkJICovCisJCWVsc2UgeworCQkJaW50CQloaWdoOwkvKiBoaWdoIGVudHJ5IG51bWJlciAqLworCQkJeGZzX2lub2J0X2tleV90CSpra2Jhc2U9TlVMTDsvKiBiYXNlIG9mIGtleXMgaW4gYmxvY2sgKi8KKwkJCXhmc19pbm9idF9yZWNfdAkqa3JiYXNlPU5VTEw7LyogYmFzZSBvZiByZWNvcmRzIGluIGJsb2NrICovCisJCQlpbnQJCWxvdzsJLyogbG93IGVudHJ5IG51bWJlciAqLworCisJCQkvKgorCQkJICogR2V0IGEgcG9pbnRlciB0byBrZXlzIG9yIHJlY29yZHMuCisJCQkgKi8KKwkJCWlmIChsZXZlbCA+IDApCisJCQkJa2tiYXNlID0gWEZTX0lOT0JUX0tFWV9BRERSKGJsb2NrLCAxLCBjdXIpOworCQkJZWxzZQorCQkJCWtyYmFzZSA9IFhGU19JTk9CVF9SRUNfQUREUihibG9jaywgMSwgY3VyKTsKKwkJCS8qCisJCQkgKiBTZXQgbG93IGFuZCBoaWdoIGVudHJ5IG51bWJlcnMsIDEtYmFzZWQuCisJCQkgKi8KKwkJCWxvdyA9IDE7CisJCQlpZiAoIShoaWdoID0gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkpIHsKKwkJCQkvKgorCQkJCSAqIElmIHRoZSBibG9jayBpcyBlbXB0eSwgdGhlIHRyZWUgbXVzdAorCQkJCSAqIGJlIGFuIGVtcHR5IGxlYWYuCisJCQkJICovCisJCQkJQVNTRVJUKGxldmVsID09IDAgJiYgY3VyLT5iY19ubGV2ZWxzID09IDEpOworCQkJCWN1ci0+YmNfcHRyc1swXSA9IGRpciAhPSBYRlNfTE9PS1VQX0xFOworCQkJCSpzdGF0ID0gMDsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCS8qCisJCQkgKiBCaW5hcnkgc2VhcmNoIHRoZSBibG9jay4KKwkJCSAqLworCQkJd2hpbGUgKGxvdyA8PSBoaWdoKSB7CisJCQkJeGZzX2FnaW5vX3QJc3RhcnRpbm87CS8qIGtleSB2YWx1ZSAqLworCisJCQkJLyoKKwkJCQkgKiBrZXlubyBpcyBhdmVyYWdlIG9mIGxvdyBhbmQgaGlnaC4KKwkJCQkgKi8KKwkJCQlrZXlubyA9IChsb3cgKyBoaWdoKSA+PiAxOworCQkJCS8qCisJCQkJICogR2V0IHN0YXJ0aW5vLgorCQkJCSAqLworCQkJCWlmIChsZXZlbCA+IDApIHsKKwkJCQkJeGZzX2lub2J0X2tleV90CSpra3A7CisKKwkJCQkJa2twID0ga2tiYXNlICsga2V5bm8gLSAxOworCQkJCQlzdGFydGlubyA9IElOVF9HRVQoa2twLT5pcl9zdGFydGlubywgQVJDSF9DT05WRVJUKTsKKwkJCQl9IGVsc2UgeworCQkJCQl4ZnNfaW5vYnRfcmVjX3QJKmtycDsKKworCQkJCQlrcnAgPSBrcmJhc2UgKyBrZXlubyAtIDE7CisJCQkJCXN0YXJ0aW5vID0gSU5UX0dFVChrcnAtPmlyX3N0YXJ0aW5vLCBBUkNIX0NPTlZFUlQpOworCQkJCX0KKwkJCQkvKgorCQkJCSAqIENvbXB1dGUgZGlmZmVyZW5jZSB0byBnZXQgbmV4dCBkaXJlY3Rpb24uCisJCQkJICovCisJCQkJZGlmZiA9IChfX2ludDY0X3QpCisJCQkJCXN0YXJ0aW5vIC0gY3VyLT5iY19yZWMuaS5pcl9zdGFydGlubzsKKwkJCQkvKgorCQkJCSAqIExlc3MgdGhhbiwgbW92ZSByaWdodC4KKwkJCQkgKi8KKwkJCQlpZiAoZGlmZiA8IDApCisJCQkJCWxvdyA9IGtleW5vICsgMTsKKwkJCQkvKgorCQkJCSAqIEdyZWF0ZXIgdGhhbiwgbW92ZSBsZWZ0LgorCQkJCSAqLworCQkJCWVsc2UgaWYgKGRpZmYgPiAwKQorCQkJCQloaWdoID0ga2V5bm8gLSAxOworCQkJCS8qCisJCQkJICogRXF1YWwsIHdlJ3JlIGRvbmUuCisJCQkJICovCisJCQkJZWxzZQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkvKgorCQkgKiBJZiB0aGVyZSBhcmUgbW9yZSBsZXZlbHMsIHNldCB1cCBmb3IgdGhlIG5leHQgbGV2ZWwKKwkJICogYnkgZ2V0dGluZyB0aGUgYmxvY2sgbnVtYmVyIGFuZCBmaWxsaW5nIGluIHRoZSBjdXJzb3IuCisJCSAqLworCQlpZiAobGV2ZWwgPiAwKSB7CisJCQkvKgorCQkJICogSWYgd2UgbW92ZWQgbGVmdCwgbmVlZCB0aGUgcHJldmlvdXMga2V5IG51bWJlciwKKwkJCSAqIHVubGVzcyB0aGVyZSBpc24ndCBvbmUuCisJCQkgKi8KKwkJCWlmIChkaWZmID4gMCAmJiAtLWtleW5vIDwgMSkKKwkJCQlrZXlubyA9IDE7CisJCQlhZ2JubyA9IElOVF9HRVQoKlhGU19JTk9CVF9QVFJfQUREUihibG9jaywga2V5bm8sIGN1ciksIEFSQ0hfQ09OVkVSVCk7CisjaWZkZWYgREVCVUcKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsIGFnYm5vLCBsZXZlbCkpKQorCQkJCXJldHVybiBlcnJvcjsKKyNlbmRpZgorCQkJY3VyLT5iY19wdHJzW2xldmVsXSA9IGtleW5vOworCQl9CisJfQorCS8qCisJICogRG9uZSB3aXRoIHRoZSBzZWFyY2guCisJICogU2VlIGlmIHdlIG5lZWQgdG8gYWRqdXN0IHRoZSByZXN1bHRzLgorCSAqLworCWlmIChkaXIgIT0gWEZTX0xPT0tVUF9MRSAmJiBkaWZmIDwgMCkgeworCQlrZXlubysrOworCQkvKgorCQkgKiBJZiBnZSBzZWFyY2ggYW5kIHdlIHdlbnQgb2ZmIHRoZSBlbmQgb2YgdGhlIGJsb2NrLCBidXQgaXQncworCQkgKiBub3QgdGhlIGxhc3QgYmxvY2ssIHdlJ3JlIGluIHRoZSB3cm9uZyBibG9jay4KKwkJICovCisJCWlmIChkaXIgPT0gWEZTX0xPT0tVUF9HRSAmJgorCQkgICAga2V5bm8gPiBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICYmCisJCSAgICBJTlRfR0VUKGJsb2NrLT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKSAhPSBOVUxMQUdCTE9DSykgeworCQkJaW50CWk7CisKKwkJCWN1ci0+YmNfcHRyc1swXSA9IGtleW5vOworCQkJaWYgKChlcnJvciA9IHhmc19pbm9idF9pbmNyZW1lbnQoY3VyLCAwLCAmaSkpKQorCQkJCXJldHVybiBlcnJvcjsKKwkJCUFTU0VSVChpID09IDEpOworCQkJKnN0YXQgPSAxOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJZWxzZSBpZiAoZGlyID09IFhGU19MT09LVVBfTEUgJiYgZGlmZiA+IDApCisJCWtleW5vLS07CisJY3VyLT5iY19wdHJzWzBdID0ga2V5bm87CisJLyoKKwkgKiBSZXR1cm4gaWYgd2Ugc3VjY2VlZGVkIG9yIG5vdC4KKwkgKi8KKwlpZiAoa2V5bm8gPT0gMCB8fCBrZXlubyA+IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpCisJCSpzdGF0ID0gMDsKKwllbHNlCisJCSpzdGF0ID0gKChkaXIgIT0gWEZTX0xPT0tVUF9FUSkgfHwgKGRpZmYgPT0gMCkpOworCXJldHVybiAwOworfQorCisvKgorICogTW92ZSAxIHJlY29yZCBsZWZ0IGZyb20gY3VyL2xldmVsIGlmIHBvc3NpYmxlLgorICogVXBkYXRlIGN1ciB0byByZWZsZWN0IHRoZSBuZXcgcGF0aC4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX2lub2J0X2xzaGlmdCgKKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJCWxldmVsLAkvKiBsZXZlbCB0byBzaGlmdCByZWNvcmQgb24gKi8KKwlpbnQJCQkqc3RhdCkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJaW50CQkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworI2lmZGVmIERFQlVHCisJaW50CQkJaTsJLyogbG9vcCBpbmRleCAqLworI2VuZGlmCisJeGZzX2lub2J0X2tleV90CQlrZXk7CS8qIGtleSB2YWx1ZSBmb3IgbGVhZiBsZXZlbCB1cHdhcmQgKi8KKwl4ZnNfYnVmX3QJCSpsYnA7CS8qIGJ1ZmZlciBmb3IgbGVmdCBuZWlnaGJvciBibG9jayAqLworCXhmc19pbm9idF9ibG9ja190CSpsZWZ0OwkvKiBsZWZ0IG5laWdoYm9yIGJ0cmVlIGJsb2NrICovCisJeGZzX2lub2J0X2tleV90CQkqbGtwPU5VTEw7CS8qIGtleSBwb2ludGVyIGZvciBsZWZ0IGJsb2NrICovCisJeGZzX2lub2J0X3B0cl90CQkqbHBwOwkvKiBhZGRyZXNzIHBvaW50ZXIgZm9yIGxlZnQgYmxvY2sgKi8KKwl4ZnNfaW5vYnRfcmVjX3QJCSpscnA9TlVMTDsJLyogcmVjb3JkIHBvaW50ZXIgZm9yIGxlZnQgYmxvY2sgKi8KKwlpbnQJCQlucmVjOwkvKiBuZXcgbnVtYmVyIG9mIGxlZnQgYmxvY2sgZW50cmllcyAqLworCXhmc19idWZfdAkJKnJicDsJLyogYnVmZmVyIGZvciByaWdodCAoY3VycmVudCkgYmxvY2sgKi8KKwl4ZnNfaW5vYnRfYmxvY2tfdAkqcmlnaHQ7CS8qIHJpZ2h0IChjdXJyZW50KSBidHJlZSBibG9jayAqLworCXhmc19pbm9idF9rZXlfdAkJKnJrcD1OVUxMOwkvKiBrZXkgcG9pbnRlciBmb3IgcmlnaHQgYmxvY2sgKi8KKwl4ZnNfaW5vYnRfcHRyX3QJCSpycHA9TlVMTDsJLyogYWRkcmVzcyBwb2ludGVyIGZvciByaWdodCBibG9jayAqLworCXhmc19pbm9idF9yZWNfdAkJKnJycD1OVUxMOwkvKiByZWNvcmQgcG9pbnRlciBmb3IgcmlnaHQgYmxvY2sgKi8KKworCS8qCisJICogU2V0IHVwIHZhcmlhYmxlcyBmb3IgdGhpcyBibG9jayBhcyAicmlnaHQiLgorCSAqLworCXJicCA9IGN1ci0+YmNfYnVmc1tsZXZlbF07CisJcmlnaHQgPSBYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKHJicCk7CisjaWZkZWYgREVCVUcKKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIHJpZ2h0LCBsZXZlbCwgcmJwKSkpCisJCXJldHVybiBlcnJvcjsKKyNlbmRpZgorCS8qCisJICogSWYgd2UndmUgZ290IG5vIGxlZnQgc2libGluZyB0aGVuIHdlIGNhbid0IHNoaWZ0IGFuIGVudHJ5IGxlZnQuCisJICovCisJaWYgKElOVF9HRVQocmlnaHQtPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTEFHQkxPQ0spIHsKKwkJKnN0YXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBJZiB0aGUgY3Vyc29yIGVudHJ5IGlzIHRoZSBvbmUgdGhhdCB3b3VsZCBiZSBtb3ZlZCwgZG9uJ3QKKwkgKiBkbyBpdC4uLiBpdCdzIHRvbyBjb21wbGljYXRlZC4KKwkgKi8KKwlpZiAoY3VyLT5iY19wdHJzW2xldmVsXSA8PSAxKSB7CisJCSpzdGF0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogU2V0IHVwIHRoZSBsZWZ0IG5laWdoYm9yIGFzICJsZWZ0Ii4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmcyhjdXItPmJjX21wLCBjdXItPmJjX3RwLAorCQkJY3VyLT5iY19wcml2YXRlLmkuYWdubywgSU5UX0dFVChyaWdodC0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJUKSwgMCwgJmxicCwKKwkJCVhGU19JTk9fQlRSRUVfUkVGKSkpCisJCXJldHVybiBlcnJvcjsKKwlsZWZ0ID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhsYnApOworCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgbGVmdCwgbGV2ZWwsIGxicCkpKQorCQlyZXR1cm4gZXJyb3I7CisJLyoKKwkgKiBJZiBpdCdzIGZ1bGwsIGl0IGNhbid0IHRha2UgYW5vdGhlciBlbnRyeS4KKwkgKi8KKwlpZiAoSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpID09IFhGU19JTk9CVF9CTE9DS19NQVhSRUNTKGxldmVsLCBjdXIpKSB7CisJCSpzdGF0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCW5yZWMgPSBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKyAxOworCS8qCisJICogSWYgbm9uLWxlYWYsIGNvcHkgYSBrZXkgYW5kIGEgcHRyIHRvIHRoZSBsZWZ0IGJsb2NrLgorCSAqLworCWlmIChsZXZlbCA+IDApIHsKKwkJbGtwID0gWEZTX0lOT0JUX0tFWV9BRERSKGxlZnQsIG5yZWMsIGN1cik7CisJCXJrcCA9IFhGU19JTk9CVF9LRVlfQUREUihyaWdodCwgMSwgY3VyKTsKKwkJKmxrcCA9ICpya3A7CisJCXhmc19pbm9idF9sb2dfa2V5cyhjdXIsIGxicCwgbnJlYywgbnJlYyk7CisJCWxwcCA9IFhGU19JTk9CVF9QVFJfQUREUihsZWZ0LCBucmVjLCBjdXIpOworCQlycHAgPSBYRlNfSU5PQlRfUFRSX0FERFIocmlnaHQsIDEsIGN1cik7CisjaWZkZWYgREVCVUcKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zcHRyKGN1ciwgSU5UX0dFVCgqcnBwLCBBUkNIX0NPTlZFUlQpLCBsZXZlbCkpKQorCQkJcmV0dXJuIGVycm9yOworI2VuZGlmCisJCSpscHAgPSAqcnBwOyAvKiBJTlRfOiBuby1jaGFuZ2UgY29weSAqLworCQl4ZnNfaW5vYnRfbG9nX3B0cnMoY3VyLCBsYnAsIG5yZWMsIG5yZWMpOworCX0KKwkvKgorCSAqIElmIGxlYWYsIGNvcHkgYSByZWNvcmQgdG8gdGhlIGxlZnQgYmxvY2suCisJICovCisJZWxzZSB7CisJCWxycCA9IFhGU19JTk9CVF9SRUNfQUREUihsZWZ0LCBucmVjLCBjdXIpOworCQlycnAgPSBYRlNfSU5PQlRfUkVDX0FERFIocmlnaHQsIDEsIGN1cik7CisJCSpscnAgPSAqcnJwOworCQl4ZnNfaW5vYnRfbG9nX3JlY3MoY3VyLCBsYnAsIG5yZWMsIG5yZWMpOworCX0KKwkvKgorCSAqIEJ1bXAgYW5kIGxvZyBsZWZ0J3MgbnVtcmVjcywgZGVjcmVtZW50IGFuZCBsb2cgcmlnaHQncyBudW1yZWNzLgorCSAqLworCUlOVF9NT0QobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCArMSk7CisJeGZzX2lub2J0X2xvZ19ibG9jayhjdXItPmJjX3RwLCBsYnAsIFhGU19CQl9OVU1SRUNTKTsKKyNpZmRlZiBERUJVRworCWlmIChsZXZlbCA+IDApCisJCXhmc19idHJlZV9jaGVja19rZXkoY3VyLT5iY19idG51bSwgbGtwIC0gMSwgbGtwKTsKKwllbHNlCisJCXhmc19idHJlZV9jaGVja19yZWMoY3VyLT5iY19idG51bSwgbHJwIC0gMSwgbHJwKTsKKyNlbmRpZgorCUlOVF9NT0QocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCwgLTEpOworCXhmc19pbm9idF9sb2dfYmxvY2soY3VyLT5iY190cCwgcmJwLCBYRlNfQkJfTlVNUkVDUyk7CisJLyoKKwkgKiBTbGlkZSB0aGUgY29udGVudHMgb2YgcmlnaHQgZG93biBvbmUgZW50cnkuCisJICovCisJaWYgKGxldmVsID4gMCkgeworI2lmZGVmIERFQlVHCisJCWZvciAoaSA9IDA7IGkgPCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOyBpKyspIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsIElOVF9HRVQocnBwW2kgKyAxXSwgQVJDSF9DT05WRVJUKSwKKwkJCQkJbGV2ZWwpKSkKKwkJCQlyZXR1cm4gZXJyb3I7CisJCX0KKyNlbmRpZgorCQltZW1tb3ZlKHJrcCwgcmtwICsgMSwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAqIHNpemVvZigqcmtwKSk7CisJCW1lbW1vdmUocnBwLCBycHAgKyAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpycHApKTsKKwkJeGZzX2lub2J0X2xvZ19rZXlzKGN1ciwgcmJwLCAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKTsKKwkJeGZzX2lub2J0X2xvZ19wdHJzKGN1ciwgcmJwLCAxLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpKTsKKwl9IGVsc2UgeworCQltZW1tb3ZlKHJycCwgcnJwICsgMSwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAqIHNpemVvZigqcnJwKSk7CisJCXhmc19pbm9idF9sb2dfcmVjcyhjdXIsIHJicCwgMSwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSk7CisJCWtleS5pcl9zdGFydGlubyA9IHJycC0+aXJfc3RhcnRpbm87IC8qIElOVF86IGRpcmVjdCBjb3B5ICovCisJCXJrcCA9ICZrZXk7CisJfQorCS8qCisJICogVXBkYXRlIHRoZSBwYXJlbnQga2V5IHZhbHVlcyBvZiByaWdodC4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2lub2J0X3VwZGtleShjdXIsIHJrcCwgbGV2ZWwgKyAxKSkpCisJCXJldHVybiBlcnJvcjsKKwkvKgorCSAqIFNsaWRlIHRoZSBjdXJzb3IgdmFsdWUgbGVmdCBvbmUuCisJICovCisJY3VyLT5iY19wdHJzW2xldmVsXS0tOworCSpzdGF0ID0gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEFsbG9jYXRlIGEgbmV3IHJvb3QgYmxvY2ssIGZpbGwgaXQgaW4uCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19pbm9idF9uZXdyb290KAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkJKnN0YXQpCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworeworCXhmc19hZ2lfdAkJKmFnaTsJLyogYS5nLiBpbm9kZSBoZWFkZXIgKi8KKwl4ZnNfYWxsb2NfYXJnX3QJCWFyZ3M7CS8qIGFsbG9jYXRpb24gYXJndW1lbnQgc3RydWN0dXJlICovCisJeGZzX2lub2J0X2Jsb2NrX3QJKmJsb2NrOwkvKiBvbmUgaGFsZiBvZiB0aGUgb2xkIHJvb3QgYmxvY2sgKi8KKwl4ZnNfYnVmX3QJCSpicDsJLyogYnVmZmVyIGNvbnRhaW5pbmcgYmxvY2sgKi8KKwlpbnQJCQllcnJvcjsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJeGZzX2lub2J0X2tleV90CQkqa3A7CS8qIGJ0cmVlIGtleSBwb2ludGVyICovCisJeGZzX2FnYmxvY2tfdAkJbGJubzsJLyogbGVmdCBibG9jayBudW1iZXIgKi8KKwl4ZnNfYnVmX3QJCSpsYnA7CS8qIGxlZnQgYnVmZmVyIHBvaW50ZXIgKi8KKwl4ZnNfaW5vYnRfYmxvY2tfdAkqbGVmdDsJLyogbGVmdCBidHJlZSBibG9jayAqLworCXhmc19idWZfdAkJKm5icDsJLyogbmV3IChyb290KSBidWZmZXIgKi8KKwl4ZnNfaW5vYnRfYmxvY2tfdAkqbmV3OwkvKiBuZXcgKHJvb3QpIGJ0cmVlIGJsb2NrICovCisJaW50CQkJbnB0cjsJLyogbmV3IHZhbHVlIGZvciBrZXkgaW5kZXgsIDEgb3IgMiAqLworCXhmc19pbm9idF9wdHJfdAkJKnBwOwkvKiBidHJlZSBhZGRyZXNzIHBvaW50ZXIgKi8KKwl4ZnNfYWdibG9ja190CQlyYm5vOwkvKiByaWdodCBibG9jayBudW1iZXIgKi8KKwl4ZnNfYnVmX3QJCSpyYnA7CS8qIHJpZ2h0IGJ1ZmZlciBwb2ludGVyICovCisJeGZzX2lub2J0X2Jsb2NrX3QJKnJpZ2h0OwkvKiByaWdodCBidHJlZSBibG9jayAqLworCXhmc19pbm9idF9yZWNfdAkJKnJwOwkvKiBidHJlZSByZWNvcmQgcG9pbnRlciAqLworCisJQVNTRVJUKGN1ci0+YmNfbmxldmVscyA8IFhGU19JTl9NQVhMRVZFTFMoY3VyLT5iY19tcCkpOworCisJLyoKKwkgKiBHZXQgYSBibG9jayAmIGEgYnVmZmVyLgorCSAqLworCWFnaSA9IFhGU19CVUZfVE9fQUdJKGN1ci0+YmNfcHJpdmF0ZS5pLmFnYnApOworCWFyZ3MudHAgPSBjdXItPmJjX3RwOworCWFyZ3MubXAgPSBjdXItPmJjX21wOworCWFyZ3MuZnNibm8gPSBYRlNfQUdCX1RPX0ZTQihhcmdzLm1wLCBjdXItPmJjX3ByaXZhdGUuaS5hZ25vLAorCQlJTlRfR0VUKGFnaS0+YWdpX3Jvb3QsIEFSQ0hfQ09OVkVSVCkpOworCWFyZ3MubW9kID0gYXJncy5taW5sZWZ0ID0gYXJncy5hbGlnbm1lbnQgPSBhcmdzLnRvdGFsID0gYXJncy53YXNkZWwgPQorCQlhcmdzLmlzZmwgPSBhcmdzLnVzZXJkYXRhID0gYXJncy5taW5hbGlnbnNsb3AgPSAwOworCWFyZ3MubWlubGVuID0gYXJncy5tYXhsZW4gPSBhcmdzLnByb2QgPSAxOworCWFyZ3MudHlwZSA9IFhGU19BTExPQ1RZUEVfTkVBUl9CTk87CisJaWYgKChlcnJvciA9IHhmc19hbGxvY192ZXh0ZW50KCZhcmdzKSkpCisJCXJldHVybiBlcnJvcjsKKwkvKgorCSAqIE5vbmUgYXZhaWxhYmxlLCB3ZSBmYWlsLgorCSAqLworCWlmIChhcmdzLmZzYm5vID09IE5VTExGU0JMT0NLKSB7CisJCSpzdGF0ID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCUFTU0VSVChhcmdzLmxlbiA9PSAxKTsKKwluYnAgPSB4ZnNfYnRyZWVfZ2V0X2J1ZnMoYXJncy5tcCwgYXJncy50cCwgYXJncy5hZ25vLCBhcmdzLmFnYm5vLCAwKTsKKwluZXcgPSBYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKG5icCk7CisJLyoKKwkgKiBTZXQgdGhlIHJvb3QgZGF0YSBpbiB0aGUgYS5nLiBpbm9kZSBzdHJ1Y3R1cmUuCisJICovCisJSU5UX1NFVChhZ2ktPmFnaV9yb290LCBBUkNIX0NPTlZFUlQsIGFyZ3MuYWdibm8pOworCUlOVF9NT0QoYWdpLT5hZ2lfbGV2ZWwsIEFSQ0hfQ09OVkVSVCwgMSk7CisJeGZzX2lhbGxvY19sb2dfYWdpKGFyZ3MudHAsIGN1ci0+YmNfcHJpdmF0ZS5pLmFnYnAsCisJCVhGU19BR0lfUk9PVCB8IFhGU19BR0lfTEVWRUwpOworCS8qCisJICogQXQgdGhlIHByZXZpb3VzIHJvb3QgbGV2ZWwgdGhlcmUgYXJlIG5vdyB0d28gYmxvY2tzOiB0aGUgb2xkCisJICogcm9vdCwgYW5kIHRoZSBuZXcgYmxvY2sgZ2VuZXJhdGVkIHdoZW4gaXQgd2FzIHNwbGl0LgorCSAqIFdlIGRvbid0IGtub3cgd2hpY2ggb25lIHRoZSBjdXJzb3IgaXMgcG9pbnRpbmcgYXQsIHNvIHdlCisJICogc2V0IHVwIHZhcmlhYmxlcyAibGVmdCIgYW5kICJyaWdodCIgZm9yIGVhY2ggY2FzZS4KKwkgKi8KKwlicCA9IGN1ci0+YmNfYnVmc1tjdXItPmJjX25sZXZlbHMgLSAxXTsKKwlibG9jayA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0soYnApOworI2lmZGVmIERFQlVHCisJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBibG9jaywgY3VyLT5iY19ubGV2ZWxzIC0gMSwgYnApKSkKKwkJcmV0dXJuIGVycm9yOworI2VuZGlmCisJaWYgKElOVF9HRVQoYmxvY2stPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpICE9IE5VTExBR0JMT0NLKSB7CisJCS8qCisJCSAqIE91ciBibG9jayBpcyBsZWZ0LCBwaWNrIHVwIHRoZSByaWdodCBibG9jay4KKwkJICovCisJCWxicCA9IGJwOworCQlsYm5vID0gWEZTX0RBRERSX1RPX0FHQk5PKGFyZ3MubXAsIFhGU19CVUZfQUREUihsYnApKTsKKwkJbGVmdCA9IGJsb2NrOworCQlyYm5vID0gSU5UX0dFVChsZWZ0LT5iYl9yaWdodHNpYiwgQVJDSF9DT05WRVJUKTsKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZnMoYXJncy5tcCwgYXJncy50cCwgYXJncy5hZ25vLAorCQkJCXJibm8sIDAsICZyYnAsIFhGU19JTk9fQlRSRUVfUkVGKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCWJwID0gcmJwOworCQlyaWdodCA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0socmJwKTsKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCByaWdodCwKKwkJCQljdXItPmJjX25sZXZlbHMgLSAxLCByYnApKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJbnB0ciA9IDE7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogT3VyIGJsb2NrIGlzIHJpZ2h0LCBwaWNrIHVwIHRoZSBsZWZ0IGJsb2NrLgorCQkgKi8KKwkJcmJwID0gYnA7CisJCXJibm8gPSBYRlNfREFERFJfVE9fQUdCTk8oYXJncy5tcCwgWEZTX0JVRl9BRERSKHJicCkpOworCQlyaWdodCA9IGJsb2NrOworCQlsYm5vID0gSU5UX0dFVChyaWdodC0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJUKTsKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZnMoYXJncy5tcCwgYXJncy50cCwgYXJncy5hZ25vLAorCQkJCWxibm8sIDAsICZsYnAsIFhGU19JTk9fQlRSRUVfUkVGKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCWJwID0gbGJwOworCQlsZWZ0ID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhsYnApOworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGxlZnQsCisJCQkJY3VyLT5iY19ubGV2ZWxzIC0gMSwgbGJwKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCW5wdHIgPSAyOworCX0KKwkvKgorCSAqIEZpbGwgaW4gdGhlIG5ldyBibG9jaydzIGJ0cmVlIGhlYWRlciBhbmQgbG9nIGl0LgorCSAqLworCUlOVF9TRVQobmV3LT5iYl9tYWdpYywgQVJDSF9DT05WRVJULCB4ZnNfbWFnaWNzW2N1ci0+YmNfYnRudW1dKTsKKwlJTlRfU0VUKG5ldy0+YmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCwgKF9fdWludDE2X3QpY3VyLT5iY19ubGV2ZWxzKTsKKwlJTlRfU0VUKG5ldy0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCAyKTsKKwlJTlRfU0VUKG5ldy0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJULCBOVUxMQUdCTE9DSyk7CisJSU5UX1NFVChuZXctPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQsIE5VTExBR0JMT0NLKTsKKwl4ZnNfaW5vYnRfbG9nX2Jsb2NrKGFyZ3MudHAsIG5icCwgWEZTX0JCX0FMTF9CSVRTKTsKKwlBU1NFUlQobGJubyAhPSBOVUxMQUdCTE9DSyAmJiByYm5vICE9IE5VTExBR0JMT0NLKTsKKwkvKgorCSAqIEZpbGwgaW4gdGhlIGtleSBkYXRhIGluIHRoZSBuZXcgcm9vdC4KKwkgKi8KKwlrcCA9IFhGU19JTk9CVF9LRVlfQUREUihuZXcsIDEsIGN1cik7CisJaWYgKElOVF9HRVQobGVmdC0+YmJfbGV2ZWwsIEFSQ0hfQ09OVkVSVCkgPiAwKSB7CisJCWtwWzBdID0gKlhGU19JTk9CVF9LRVlfQUREUihsZWZ0LCAxLCBjdXIpOyAvKiBJTlRfOiBzdHJ1Y3QgY29weSAqLworCQlrcFsxXSA9ICpYRlNfSU5PQlRfS0VZX0FERFIocmlnaHQsIDEsIGN1cik7IC8qIElOVF86IHN0cnVjdCBjb3B5ICovCisJfSBlbHNlIHsKKwkJcnAgPSBYRlNfSU5PQlRfUkVDX0FERFIobGVmdCwgMSwgY3VyKTsKKwkJSU5UX0NPUFkoa3BbMF0uaXJfc3RhcnRpbm8sIHJwLT5pcl9zdGFydGlubywgQVJDSF9DT05WRVJUKTsKKwkJcnAgPSBYRlNfSU5PQlRfUkVDX0FERFIocmlnaHQsIDEsIGN1cik7CisJCUlOVF9DT1BZKGtwWzFdLmlyX3N0YXJ0aW5vLCBycC0+aXJfc3RhcnRpbm8sIEFSQ0hfQ09OVkVSVCk7CisJfQorCXhmc19pbm9idF9sb2dfa2V5cyhjdXIsIG5icCwgMSwgMik7CisJLyoKKwkgKiBGaWxsIGluIHRoZSBwb2ludGVyIGRhdGEgaW4gdGhlIG5ldyByb290LgorCSAqLworCXBwID0gWEZTX0lOT0JUX1BUUl9BRERSKG5ldywgMSwgY3VyKTsKKwlJTlRfU0VUKHBwWzBdLCBBUkNIX0NPTlZFUlQsIGxibm8pOworCUlOVF9TRVQocHBbMV0sIEFSQ0hfQ09OVkVSVCwgcmJubyk7CisJeGZzX2lub2J0X2xvZ19wdHJzKGN1ciwgbmJwLCAxLCAyKTsKKwkvKgorCSAqIEZpeCB1cCB0aGUgY3Vyc29yLgorCSAqLworCXhmc19idHJlZV9zZXRidWYoY3VyLCBjdXItPmJjX25sZXZlbHMsIG5icCk7CisJY3VyLT5iY19wdHJzW2N1ci0+YmNfbmxldmVsc10gPSBucHRyOworCWN1ci0+YmNfbmxldmVscysrOworCSpzdGF0ID0gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE1vdmUgMSByZWNvcmQgcmlnaHQgZnJvbSBjdXIvbGV2ZWwgaWYgcG9zc2libGUuCisgKiBVcGRhdGUgY3VyIHRvIHJlZmxlY3QgdGhlIG5ldyBwYXRoLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfaW5vYnRfcnNoaWZ0KAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkJbGV2ZWwsCS8qIGxldmVsIHRvIHNoaWZ0IHJlY29yZCBvbiAqLworCWludAkJCSpzdGF0KQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK3sKKwlpbnQJCQllcnJvcjsJLyogZXJyb3IgcmV0dXJuIHZhbHVlICovCisJaW50CQkJaTsJLyogbG9vcCBpbmRleCAqLworCXhmc19pbm9idF9rZXlfdAkJa2V5OwkvKiBrZXkgdmFsdWUgZm9yIGxlYWYgbGV2ZWwgdXB3YXJkICovCisJeGZzX2J1Zl90CQkqbGJwOwkvKiBidWZmZXIgZm9yIGxlZnQgKGN1cnJlbnQpIGJsb2NrICovCisJeGZzX2lub2J0X2Jsb2NrX3QJKmxlZnQ7CS8qIGxlZnQgKGN1cnJlbnQpIGJ0cmVlIGJsb2NrICovCisJeGZzX2lub2J0X2tleV90CQkqbGtwOwkvKiBrZXkgcG9pbnRlciBmb3IgbGVmdCBibG9jayAqLworCXhmc19pbm9idF9wdHJfdAkJKmxwcDsJLyogYWRkcmVzcyBwb2ludGVyIGZvciBsZWZ0IGJsb2NrICovCisJeGZzX2lub2J0X3JlY190CQkqbHJwOwkvKiByZWNvcmQgcG9pbnRlciBmb3IgbGVmdCBibG9jayAqLworCXhmc19idWZfdAkJKnJicDsJLyogYnVmZmVyIGZvciByaWdodCBuZWlnaGJvciBibG9jayAqLworCXhmc19pbm9idF9ibG9ja190CSpyaWdodDsJLyogcmlnaHQgbmVpZ2hib3IgYnRyZWUgYmxvY2sgKi8KKwl4ZnNfaW5vYnRfa2V5X3QJCSpya3A7CS8qIGtleSBwb2ludGVyIGZvciByaWdodCBibG9jayAqLworCXhmc19pbm9idF9wdHJfdAkJKnJwcDsJLyogYWRkcmVzcyBwb2ludGVyIGZvciByaWdodCBibG9jayAqLworCXhmc19pbm9idF9yZWNfdAkJKnJycD1OVUxMOwkvKiByZWNvcmQgcG9pbnRlciBmb3IgcmlnaHQgYmxvY2sgKi8KKwl4ZnNfYnRyZWVfY3VyX3QJCSp0Y3VyOwkvKiB0ZW1wb3JhcnkgY3Vyc29yICovCisKKwkvKgorCSAqIFNldCB1cCB2YXJpYWJsZXMgZm9yIHRoaXMgYmxvY2sgYXMgImxlZnQiLgorCSAqLworCWxicCA9IGN1ci0+YmNfYnVmc1tsZXZlbF07CisJbGVmdCA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0sobGJwKTsKKyNpZmRlZiBERUJVRworCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgbGVmdCwgbGV2ZWwsIGxicCkpKQorCQlyZXR1cm4gZXJyb3I7CisjZW5kaWYKKwkvKgorCSAqIElmIHdlJ3ZlIGdvdCBubyByaWdodCBzaWJsaW5nIHRoZW4gd2UgY2FuJ3Qgc2hpZnQgYW4gZW50cnkgcmlnaHQuCisJICovCisJaWYgKElOVF9HRVQobGVmdC0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTEFHQkxPQ0spIHsKKwkJKnN0YXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBJZiB0aGUgY3Vyc29yIGVudHJ5IGlzIHRoZSBvbmUgdGhhdCB3b3VsZCBiZSBtb3ZlZCwgZG9uJ3QKKwkgKiBkbyBpdC4uLiBpdCdzIHRvbyBjb21wbGljYXRlZC4KKwkgKi8KKwlpZiAoY3VyLT5iY19wdHJzW2xldmVsXSA+PSBJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJKnN0YXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBTZXQgdXAgdGhlIHJpZ2h0IG5laWdoYm9yIGFzICJyaWdodCIuCisJICovCisJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZnMoY3VyLT5iY19tcCwgY3VyLT5iY190cCwKKwkJCWN1ci0+YmNfcHJpdmF0ZS5pLmFnbm8sIElOVF9HRVQobGVmdC0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCksIDAsICZyYnAsCisJCQlYRlNfSU5PX0JUUkVFX1JFRikpKQorCQlyZXR1cm4gZXJyb3I7CisJcmlnaHQgPSBYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKHJicCk7CisJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCByaWdodCwgbGV2ZWwsIHJicCkpKQorCQlyZXR1cm4gZXJyb3I7CisJLyoKKwkgKiBJZiBpdCdzIGZ1bGwsIGl0IGNhbid0IHRha2UgYW5vdGhlciBlbnRyeS4KKwkgKi8KKwlpZiAoSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSA9PSBYRlNfSU5PQlRfQkxPQ0tfTUFYUkVDUyhsZXZlbCwgY3VyKSkgeworCQkqc3RhdCA9IDA7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIE1ha2UgYSBob2xlIGF0IHRoZSBzdGFydCBvZiB0aGUgcmlnaHQgbmVpZ2hib3IgYmxvY2ssIHRoZW4KKwkgKiBjb3B5IHRoZSBsYXN0IGxlZnQgYmxvY2sgZW50cnkgdG8gdGhlIGhvbGUuCisJICovCisJaWYgKGxldmVsID4gMCkgeworCQlsa3AgPSBYRlNfSU5PQlRfS0VZX0FERFIobGVmdCwgSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpLCBjdXIpOworCQlscHAgPSBYRlNfSU5PQlRfUFRSX0FERFIobGVmdCwgSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpLCBjdXIpOworCQlya3AgPSBYRlNfSU5PQlRfS0VZX0FERFIocmlnaHQsIDEsIGN1cik7CisJCXJwcCA9IFhGU19JTk9CVF9QVFJfQUREUihyaWdodCwgMSwgY3VyKTsKKyNpZmRlZiBERUJVRworCQlmb3IgKGkgPSBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsIElOVF9HRVQocnBwW2ldLCBBUkNIX0NPTlZFUlQpLCBsZXZlbCkpKQorCQkJCXJldHVybiBlcnJvcjsKKwkJfQorI2VuZGlmCisJCW1lbW1vdmUocmtwICsgMSwgcmtwLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpya3ApKTsKKwkJbWVtbW92ZShycHAgKyAxLCBycHAsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKiBzaXplb2YoKnJwcCkpOworI2lmZGVmIERFQlVHCisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsIElOVF9HRVQoKmxwcCwgQVJDSF9DT05WRVJUKSwgbGV2ZWwpKSkKKwkJCXJldHVybiBlcnJvcjsKKyNlbmRpZgorCQkqcmtwID0gKmxrcDsgLyogSU5UXzogbm8gY2hhbmdlIGNvcHkgKi8KKwkJKnJwcCA9ICpscHA7IC8qIElOVF86IG5vIGNoYW5nZSBjb3B5ICovCisJCXhmc19pbm9idF9sb2dfa2V5cyhjdXIsIHJicCwgMSwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSArIDEpOworCQl4ZnNfaW5vYnRfbG9nX3B0cnMoY3VyLCByYnAsIDEsIElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKyAxKTsKKwl9IGVsc2UgeworCQlscnAgPSBYRlNfSU5PQlRfUkVDX0FERFIobGVmdCwgSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpLCBjdXIpOworCQlycnAgPSBYRlNfSU5PQlRfUkVDX0FERFIocmlnaHQsIDEsIGN1cik7CisJCW1lbW1vdmUocnJwICsgMSwgcnJwLCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICogc2l6ZW9mKCpycnApKTsKKwkJKnJycCA9ICpscnA7CisJCXhmc19pbm9idF9sb2dfcmVjcyhjdXIsIHJicCwgMSwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSArIDEpOworCQlrZXkuaXJfc3RhcnRpbm8gPSBycnAtPmlyX3N0YXJ0aW5vOyAvKiBJTlRfOiBkaXJlY3QgY29weSAqLworCQlya3AgPSAma2V5OworCX0KKwkvKgorCSAqIERlY3JlbWVudCBhbmQgbG9nIGxlZnQncyBudW1yZWNzLCBidW1wIGFuZCBsb2cgcmlnaHQncyBudW1yZWNzLgorCSAqLworCUlOVF9NT0QobGVmdC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJULCAtMSk7CisJeGZzX2lub2J0X2xvZ19ibG9jayhjdXItPmJjX3RwLCBsYnAsIFhGU19CQl9OVU1SRUNTKTsKKwlJTlRfTU9EKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsICsxKTsKKyNpZmRlZiBERUJVRworCWlmIChsZXZlbCA+IDApCisJCXhmc19idHJlZV9jaGVja19rZXkoY3VyLT5iY19idG51bSwgcmtwLCBya3AgKyAxKTsKKwllbHNlCisJCXhmc19idHJlZV9jaGVja19yZWMoY3VyLT5iY19idG51bSwgcnJwLCBycnAgKyAxKTsKKyNlbmRpZgorCXhmc19pbm9idF9sb2dfYmxvY2soY3VyLT5iY190cCwgcmJwLCBYRlNfQkJfTlVNUkVDUyk7CisJLyoKKwkgKiBVc2luZyBhIHRlbXBvcmFyeSBjdXJzb3IsIHVwZGF0ZSB0aGUgcGFyZW50IGtleSB2YWx1ZXMgb2YgdGhlCisJICogYmxvY2sgb24gdGhlIHJpZ2h0LgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfZHVwX2N1cnNvcihjdXIsICZ0Y3VyKSkpCisJCXJldHVybiBlcnJvcjsKKwl4ZnNfYnRyZWVfbGFzdHJlYyh0Y3VyLCBsZXZlbCk7CisJaWYgKChlcnJvciA9IHhmc19pbm9idF9pbmNyZW1lbnQodGN1ciwgbGV2ZWwsICZpKSkgfHwKKwkgICAgKGVycm9yID0geGZzX2lub2J0X3VwZGtleSh0Y3VyLCBya3AsIGxldmVsICsgMSkpKSB7CisJCXhmc19idHJlZV9kZWxfY3Vyc29yKHRjdXIsIFhGU19CVFJFRV9FUlJPUik7CisJCXJldHVybiBlcnJvcjsKKwl9CisJeGZzX2J0cmVlX2RlbF9jdXJzb3IodGN1ciwgWEZTX0JUUkVFX05PRVJST1IpOworCSpzdGF0ID0gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNwbGl0IGN1ci9sZXZlbCBibG9jayBpbiBoYWxmLgorICogUmV0dXJuIG5ldyBibG9jayBudW1iZXIgYW5kIGl0cyBmaXJzdCByZWNvcmQgKHRvIGJlIGluc2VydGVkIGludG8gcGFyZW50KS4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX2lub2J0X3NwbGl0KAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkJbGV2ZWwsCS8qIGxldmVsIHRvIHNwbGl0ICovCisJeGZzX2FnYmxvY2tfdAkJKmJub3AsCS8qIG91dHB1dDogYmxvY2sgbnVtYmVyIGFsbG9jYXRlZCAqLworCXhmc19pbm9idF9rZXlfdAkJKmtleXAsCS8qIG91dHB1dDogZmlyc3Qga2V5IG9mIG5ldyBibG9jayAqLworCXhmc19idHJlZV9jdXJfdAkJKipjdXJwLAkvKiBvdXRwdXQ6IG5ldyBjdXJzb3IgKi8KKwlpbnQJCQkqc3RhdCkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJeGZzX2FsbG9jX2FyZ190CQlhcmdzOwkvKiBhbGxvY2F0aW9uIGFyZ3VtZW50IHN0cnVjdHVyZSAqLworCWludAkJCWVycm9yOwkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwlpbnQJCQlpOwkvKiBsb29wIGluZGV4L3JlY29yZCBudW1iZXIgKi8KKwl4ZnNfYWdibG9ja190CQlsYm5vOwkvKiBsZWZ0IChjdXJyZW50KSBibG9jayBudW1iZXIgKi8KKwl4ZnNfYnVmX3QJCSpsYnA7CS8qIGJ1ZmZlciBmb3IgbGVmdCBibG9jayAqLworCXhmc19pbm9idF9ibG9ja190CSpsZWZ0OwkvKiBsZWZ0IChjdXJyZW50KSBidHJlZSBibG9jayAqLworCXhmc19pbm9idF9rZXlfdAkJKmxrcDsJLyogbGVmdCBidHJlZSBrZXkgcG9pbnRlciAqLworCXhmc19pbm9idF9wdHJfdAkJKmxwcDsJLyogbGVmdCBidHJlZSBhZGRyZXNzIHBvaW50ZXIgKi8KKwl4ZnNfaW5vYnRfcmVjX3QJCSpscnA7CS8qIGxlZnQgYnRyZWUgcmVjb3JkIHBvaW50ZXIgKi8KKwl4ZnNfYnVmX3QJCSpyYnA7CS8qIGJ1ZmZlciBmb3IgcmlnaHQgYmxvY2sgKi8KKwl4ZnNfaW5vYnRfYmxvY2tfdAkqcmlnaHQ7CS8qIHJpZ2h0IChuZXcpIGJ0cmVlIGJsb2NrICovCisJeGZzX2lub2J0X2tleV90CQkqcmtwOwkvKiByaWdodCBidHJlZSBrZXkgcG9pbnRlciAqLworCXhmc19pbm9idF9wdHJfdAkJKnJwcDsJLyogcmlnaHQgYnRyZWUgYWRkcmVzcyBwb2ludGVyICovCisJeGZzX2lub2J0X3JlY190CQkqcnJwOwkvKiByaWdodCBidHJlZSByZWNvcmQgcG9pbnRlciAqLworCisJLyoKKwkgKiBTZXQgdXAgbGVmdCBibG9jayAoY3VycmVudCBvbmUpLgorCSAqLworCWxicCA9IGN1ci0+YmNfYnVmc1tsZXZlbF07CisJYXJncy50cCA9IGN1ci0+YmNfdHA7CisJYXJncy5tcCA9IGN1ci0+YmNfbXA7CisJbGJubyA9IFhGU19EQUREUl9UT19BR0JOTyhhcmdzLm1wLCBYRlNfQlVGX0FERFIobGJwKSk7CisJLyoKKwkgKiBBbGxvY2F0ZSB0aGUgbmV3IGJsb2NrLgorCSAqIElmIHdlIGNhbid0IGRvIGl0LCB3ZSdyZSB0b2FzdC4gIEdpdmUgdXAuCisJICovCisJYXJncy5mc2JubyA9IFhGU19BR0JfVE9fRlNCKGFyZ3MubXAsIGN1ci0+YmNfcHJpdmF0ZS5pLmFnbm8sIGxibm8pOworCWFyZ3MubW9kID0gYXJncy5taW5sZWZ0ID0gYXJncy5hbGlnbm1lbnQgPSBhcmdzLnRvdGFsID0gYXJncy53YXNkZWwgPQorCQlhcmdzLmlzZmwgPSBhcmdzLnVzZXJkYXRhID0gYXJncy5taW5hbGlnbnNsb3AgPSAwOworCWFyZ3MubWlubGVuID0gYXJncy5tYXhsZW4gPSBhcmdzLnByb2QgPSAxOworCWFyZ3MudHlwZSA9IFhGU19BTExPQ1RZUEVfTkVBUl9CTk87CisJaWYgKChlcnJvciA9IHhmc19hbGxvY192ZXh0ZW50KCZhcmdzKSkpCisJCXJldHVybiBlcnJvcjsKKwlpZiAoYXJncy5mc2JubyA9PSBOVUxMRlNCTE9DSykgeworCQkqc3RhdCA9IDA7CisJCXJldHVybiAwOworCX0KKwlBU1NFUlQoYXJncy5sZW4gPT0gMSk7CisJcmJwID0geGZzX2J0cmVlX2dldF9idWZzKGFyZ3MubXAsIGFyZ3MudHAsIGFyZ3MuYWdubywgYXJncy5hZ2JubywgMCk7CisJLyoKKwkgKiBTZXQgdXAgdGhlIG5ldyBibG9jayBhcyAicmlnaHQiLgorCSAqLworCXJpZ2h0ID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhyYnApOworCS8qCisJICogIkxlZnQiIGlzIHRoZSBjdXJyZW50IChhY2NvcmRpbmcgdG8gdGhlIGN1cnNvcikgYmxvY2suCisJICovCisJbGVmdCA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0sobGJwKTsKKyNpZmRlZiBERUJVRworCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgbGVmdCwgbGV2ZWwsIGxicCkpKQorCQlyZXR1cm4gZXJyb3I7CisjZW5kaWYKKwkvKgorCSAqIEZpbGwgaW4gdGhlIGJ0cmVlIGhlYWRlciBmb3IgdGhlIG5ldyBibG9jay4KKwkgKi8KKwlJTlRfU0VUKHJpZ2h0LT5iYl9tYWdpYywgQVJDSF9DT05WRVJULCB4ZnNfbWFnaWNzW2N1ci0+YmNfYnRudW1dKTsKKwlyaWdodC0+YmJfbGV2ZWwgPSBsZWZ0LT5iYl9sZXZlbDsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KKwlJTlRfU0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIChfX3VpbnQxNl90KShJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgLyAyKSk7CisJLyoKKwkgKiBNYWtlIHN1cmUgdGhhdCBpZiB0aGVyZSdzIGFuIG9kZCBudW1iZXIgb2YgZW50cmllcyBub3csIHRoYXQKKwkgKiBlYWNoIG5ldyBibG9jayB3aWxsIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGVudHJpZXMuCisJICovCisJaWYgKChJTlRfR0VUKGxlZnQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgJiAxKSAmJgorCSAgICBjdXItPmJjX3B0cnNbbGV2ZWxdIDw9IElOVF9HRVQocmlnaHQtPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkgKyAxKQorCQlJTlRfTU9EKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsICsxKTsKKwlpID0gSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpIC0gSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSArIDE7CisJLyoKKwkgKiBGb3Igbm9uLWxlYWYgYmxvY2tzLCBjb3B5IGtleXMgYW5kIGFkZHJlc3NlcyBvdmVyIHRvIHRoZSBuZXcgYmxvY2suCisJICovCisJaWYgKGxldmVsID4gMCkgeworCQlsa3AgPSBYRlNfSU5PQlRfS0VZX0FERFIobGVmdCwgaSwgY3VyKTsKKwkJbHBwID0gWEZTX0lOT0JUX1BUUl9BRERSKGxlZnQsIGksIGN1cik7CisJCXJrcCA9IFhGU19JTk9CVF9LRVlfQUREUihyaWdodCwgMSwgY3VyKTsKKwkJcnBwID0gWEZTX0lOT0JUX1BUUl9BRERSKHJpZ2h0LCAxLCBjdXIpOworI2lmZGVmIERFQlVHCisJCWZvciAoaSA9IDA7IGkgPCBJTlRfR0VUKHJpZ2h0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOyBpKyspIHsKKwkJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc3B0cihjdXIsIElOVF9HRVQobHBwW2ldLCBBUkNIX0NPTlZFUlQpLCBsZXZlbCkpKQorCQkJCXJldHVybiBlcnJvcjsKKwkJfQorI2VuZGlmCisJCW1lbWNweShya3AsIGxrcCwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAqIHNpemVvZigqcmtwKSk7CisJCW1lbWNweShycHAsIGxwcCwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAqIHNpemVvZigqcnBwKSk7CisJCXhmc19pbm9idF9sb2dfa2V5cyhjdXIsIHJicCwgMSwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSk7CisJCXhmc19pbm9idF9sb2dfcHRycyhjdXIsIHJicCwgMSwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSk7CisJCSprZXlwID0gKnJrcDsKKwl9CisJLyoKKwkgKiBGb3IgbGVhZiBibG9ja3MsIGNvcHkgcmVjb3JkcyBvdmVyIHRvIHRoZSBuZXcgYmxvY2suCisJICovCisJZWxzZSB7CisJCWxycCA9IFhGU19JTk9CVF9SRUNfQUREUihsZWZ0LCBpLCBjdXIpOworCQlycnAgPSBYRlNfSU5PQlRfUkVDX0FERFIocmlnaHQsIDEsIGN1cik7CisJCW1lbWNweShycnAsIGxycCwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSAqIHNpemVvZigqcnJwKSk7CisJCXhmc19pbm9idF9sb2dfcmVjcyhjdXIsIHJicCwgMSwgSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSk7CisJCWtleXAtPmlyX3N0YXJ0aW5vID0gcnJwLT5pcl9zdGFydGlubzsgLyogSU5UXzogZGlyZWN0IGNvcHkgKi8KKwl9CisJLyoKKwkgKiBGaW5kIHRoZSBsZWZ0IGJsb2NrIG51bWJlciBieSBsb29raW5nIGluIHRoZSBidWZmZXIuCisJICogQWRqdXN0IG51bXJlY3MsIHNpYmxpbmcgcG9pbnRlcnMuCisJICovCisJSU5UX01PRChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQsIC0oSU5UX0dFVChyaWdodC0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSkpOworCXJpZ2h0LT5iYl9yaWdodHNpYiA9IGxlZnQtPmJiX3JpZ2h0c2liOyAvKiBJTlRfOiBkaXJlY3QgY29weSAqLworCUlOVF9TRVQobGVmdC0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCwgYXJncy5hZ2Jubyk7CisJSU5UX1NFVChyaWdodC0+YmJfbGVmdHNpYiwgQVJDSF9DT05WRVJULCBsYm5vKTsKKwl4ZnNfaW5vYnRfbG9nX2Jsb2NrKGFyZ3MudHAsIHJicCwgWEZTX0JCX0FMTF9CSVRTKTsKKwl4ZnNfaW5vYnRfbG9nX2Jsb2NrKGFyZ3MudHAsIGxicCwgWEZTX0JCX05VTVJFQ1MgfCBYRlNfQkJfUklHSFRTSUIpOworCS8qCisJICogSWYgdGhlcmUncyBhIGJsb2NrIHRvIHRoZSBuZXcgYmxvY2sncyByaWdodCwgbWFrZSB0aGF0IGJsb2NrCisJICogcG9pbnQgYmFjayB0byByaWdodCBpbnN0ZWFkIG9mIHRvIGxlZnQuCisJICovCisJaWYgKElOVF9HRVQocmlnaHQtPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpICE9IE5VTExBR0JMT0NLKSB7CisJCXhmc19pbm9idF9ibG9ja190CSpycmJsb2NrOwkvKiByciBidHJlZSBibG9jayAqLworCQl4ZnNfYnVmX3QJCSpycmJwOwkJLyogYnVmZmVyIGZvciBycmJsb2NrICovCisKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZnMoYXJncy5tcCwgYXJncy50cCwgYXJncy5hZ25vLAorCQkJCUlOVF9HRVQocmlnaHQtPmJiX3JpZ2h0c2liLCBBUkNIX0NPTlZFUlQpLCAwLCAmcnJicCwKKwkJCQlYRlNfSU5PX0JUUkVFX1JFRikpKQorCQkJcmV0dXJuIGVycm9yOworCQlycmJsb2NrID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhycmJwKTsKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBycmJsb2NrLCBsZXZlbCwgcnJicCkpKQorCQkJcmV0dXJuIGVycm9yOworCQlJTlRfU0VUKHJyYmxvY2stPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCwgYXJncy5hZ2Jubyk7CisJCXhmc19pbm9idF9sb2dfYmxvY2soYXJncy50cCwgcnJicCwgWEZTX0JCX0xFRlRTSUIpOworCX0KKwkvKgorCSAqIElmIHRoZSBjdXJzb3IgaXMgcmVhbGx5IGluIHRoZSByaWdodCBibG9jaywgbW92ZSBpdCB0aGVyZS4KKwkgKiBJZiBpdCdzIGp1c3QgcG9pbnRpbmcgcGFzdCB0aGUgbGFzdCBlbnRyeSBpbiBsZWZ0LCB0aGVuIHdlJ2xsCisJICogaW5zZXJ0IHRoZXJlLCBzbyBkb24ndCBjaGFuZ2UgYW55dGhpbmcgaW4gdGhhdCBjYXNlLgorCSAqLworCWlmIChjdXItPmJjX3B0cnNbbGV2ZWxdID4gSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpICsgMSkgeworCQl4ZnNfYnRyZWVfc2V0YnVmKGN1ciwgbGV2ZWwsIHJicCk7CisJCWN1ci0+YmNfcHRyc1tsZXZlbF0gLT0gSU5UX0dFVChsZWZ0LT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOworCX0KKwkvKgorCSAqIElmIHRoZXJlIGFyZSBtb3JlIGxldmVscywgd2UnbGwgbmVlZCBhbm90aGVyIGN1cnNvciB3aGljaCByZWZlcnMKKwkgKiB0aGUgcmlnaHQgYmxvY2ssIG5vIG1hdHRlciB3aGVyZSB0aGlzIGN1cnNvciB3YXMuCisJICovCisJaWYgKGxldmVsICsgMSA8IGN1ci0+YmNfbmxldmVscykgeworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2R1cF9jdXJzb3IoY3VyLCBjdXJwKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCSgqY3VycCktPmJjX3B0cnNbbGV2ZWwgKyAxXSsrOworCX0KKwkqYm5vcCA9IGFyZ3MuYWdibm87CisJKnN0YXQgPSAxOworCXJldHVybiAwOworfQorCisvKgorICogVXBkYXRlIGtleXMgYXQgYWxsIGxldmVscyBmcm9tIGhlcmUgdG8gdGhlIHJvb3QgYWxvbmcgdGhlIGN1cnNvcidzIHBhdGguCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19pbm9idF91cGRrZXkoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfaW5vYnRfa2V5X3QJCSprZXlwLAkvKiBuZXcga2V5IHZhbHVlIHRvIHVwZGF0ZSB0byAqLworCWludAkJCWxldmVsKQkvKiBzdGFydGluZyBsZXZlbCBmb3IgdXBkYXRlICovCit7CisJaW50CQkJcHRyOwkvKiBpbmRleCBvZiBrZXkgaW4gYmxvY2sgKi8KKworCS8qCisJICogR28gdXAgdGhlIHRyZWUgZnJvbSB0aGlzIGxldmVsIHRvd2FyZCB0aGUgcm9vdC4KKwkgKiBBdCBlYWNoIGxldmVsLCB1cGRhdGUgdGhlIGtleSB2YWx1ZSB0byB0aGUgdmFsdWUgaW5wdXQuCisJICogU3RvcCB3aGVuIHdlIHJlYWNoIGEgbGV2ZWwgd2hlcmUgdGhlIGN1cnNvciBpc24ndCBwb2ludGluZworCSAqIGF0IHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgYmxvY2suCisJICovCisJZm9yIChwdHIgPSAxOyBwdHIgPT0gMSAmJiBsZXZlbCA8IGN1ci0+YmNfbmxldmVsczsgbGV2ZWwrKykgeworCQl4ZnNfYnVmX3QJCSpicDsJLyogYnVmZmVyIGZvciBibG9jayAqLworCQl4ZnNfaW5vYnRfYmxvY2tfdAkqYmxvY2s7CS8qIGJ0cmVlIGJsb2NrICovCisjaWZkZWYgREVCVUcKKwkJaW50CQkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworI2VuZGlmCisJCXhmc19pbm9idF9rZXlfdAkJKmtwOwkvKiBwdHIgdG8gYnRyZWUgYmxvY2sga2V5cyAqLworCisJCWJwID0gY3VyLT5iY19idWZzW2xldmVsXTsKKwkJYmxvY2sgPSBYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKGJwKTsKKyNpZmRlZiBERUJVRworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGJsb2NrLCBsZXZlbCwgYnApKSkKKwkJCXJldHVybiBlcnJvcjsKKyNlbmRpZgorCQlwdHIgPSBjdXItPmJjX3B0cnNbbGV2ZWxdOworCQlrcCA9IFhGU19JTk9CVF9LRVlfQUREUihibG9jaywgcHRyLCBjdXIpOworCQkqa3AgPSAqa2V5cDsKKwkJeGZzX2lub2J0X2xvZ19rZXlzKGN1ciwgYnAsIHB0ciwgcHRyKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBFeHRlcm5hbGx5IHZpc2libGUgcm91dGluZXMuCisgKi8KKworLyoKKyAqIERlY3JlbWVudCBjdXJzb3IgYnkgb25lIHJlY29yZCBhdCB0aGUgbGV2ZWwuCisgKiBGb3Igbm9uemVybyBsZXZlbHMgdGhlIGxlYWYtd2FyZCBpbmZvcm1hdGlvbiBpcyB1bnRvdWNoZWQuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19pbm9idF9kZWNyZW1lbnQoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCQlsZXZlbCwJLyogbGV2ZWwgaW4gYnRyZWUsIDAgaXMgbGVhZiAqLworCWludAkJCSpzdGF0KQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK3sKKwl4ZnNfaW5vYnRfYmxvY2tfdAkqYmxvY2s7CS8qIGJ0cmVlIGJsb2NrICovCisJaW50CQkJZXJyb3I7CisJaW50CQkJbGV2OwkvKiBidHJlZSBsZXZlbCAqLworCisJQVNTRVJUKGxldmVsIDwgY3VyLT5iY19ubGV2ZWxzKTsKKwkvKgorCSAqIFJlYWQtYWhlYWQgdG8gdGhlIGxlZnQgYXQgdGhpcyBsZXZlbC4KKwkgKi8KKwl4ZnNfYnRyZWVfcmVhZGFoZWFkKGN1ciwgbGV2ZWwsIFhGU19CVENVUl9MRUZUUkEpOworCS8qCisJICogRGVjcmVtZW50IHRoZSBwdHIgYXQgdGhpcyBsZXZlbC4gIElmIHdlJ3JlIHN0aWxsIGluIHRoZSBibG9jaworCSAqIHRoZW4gd2UncmUgZG9uZS4KKwkgKi8KKwlpZiAoLS1jdXItPmJjX3B0cnNbbGV2ZWxdID4gMCkgeworCQkqc3RhdCA9IDE7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIEdldCBhIHBvaW50ZXIgdG8gdGhlIGJ0cmVlIGJsb2NrLgorCSAqLworCWJsb2NrID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhjdXItPmJjX2J1ZnNbbGV2ZWxdKTsKKyNpZmRlZiBERUJVRworCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgYmxvY2ssIGxldmVsLAorCQkJY3VyLT5iY19idWZzW2xldmVsXSkpKQorCQlyZXR1cm4gZXJyb3I7CisjZW5kaWYKKwkvKgorCSAqIElmIHdlIGp1c3Qgd2VudCBvZmYgdGhlIGxlZnQgZWRnZSBvZiB0aGUgdHJlZSwgcmV0dXJuIGZhaWx1cmUuCisJICovCisJaWYgKElOVF9HRVQoYmxvY2stPmJiX2xlZnRzaWIsIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTEFHQkxPQ0spIHsKKwkJKnN0YXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBNYXJjaCB1cCB0aGUgdHJlZSBkZWNyZW1lbnRpbmcgcG9pbnRlcnMuCisJICogU3RvcCB3aGVuIHdlIGRvbid0IGdvIG9mZiB0aGUgbGVmdCBlZGdlIG9mIGEgYmxvY2suCisJICovCisJZm9yIChsZXYgPSBsZXZlbCArIDE7IGxldiA8IGN1ci0+YmNfbmxldmVsczsgbGV2KyspIHsKKwkJaWYgKC0tY3VyLT5iY19wdHJzW2xldl0gPiAwKQorCQkJYnJlYWs7CisJCS8qCisJCSAqIFJlYWQtYWhlYWQgdGhlIGxlZnQgYmxvY2ssIHdlJ3JlIGdvaW5nIHRvIHJlYWQgaXQKKwkJICogaW4gdGhlIG5leHQgbG9vcC4KKwkJICovCisJCXhmc19idHJlZV9yZWFkYWhlYWQoY3VyLCBsZXYsIFhGU19CVENVUl9MRUZUUkEpOworCX0KKwkvKgorCSAqIElmIHdlIHdlbnQgb2ZmIHRoZSByb290IHRoZW4gd2UgYXJlIHNlcmlvdXNseSBjb25mdXNlZC4KKwkgKi8KKwlBU1NFUlQobGV2IDwgY3VyLT5iY19ubGV2ZWxzKTsKKwkvKgorCSAqIE5vdyB3YWxrIGJhY2sgZG93biB0aGUgdHJlZSwgZml4aW5nIHVwIHRoZSBjdXJzb3IncyBidWZmZXIKKwkgKiBwb2ludGVycyBhbmQga2V5IG51bWJlcnMuCisJICovCisJZm9yIChibG9jayA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0soY3VyLT5iY19idWZzW2xldl0pOyBsZXYgPiBsZXZlbDsgKSB7CisJCXhmc19hZ2Jsb2NrX3QJYWdibm87CS8qIGJsb2NrIG51bWJlciBvZiBidHJlZSBibG9jayAqLworCQl4ZnNfYnVmX3QJKmJwOwkvKiBidWZmZXIgY29udGFpbmluZyBidHJlZSBibG9jayAqLworCisJCWFnYm5vID0gSU5UX0dFVCgqWEZTX0lOT0JUX1BUUl9BRERSKGJsb2NrLCBjdXItPmJjX3B0cnNbbGV2XSwgY3VyKSwgQVJDSF9DT05WRVJUKTsKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9yZWFkX2J1ZnMoY3VyLT5iY19tcCwgY3VyLT5iY190cCwKKwkJCQljdXItPmJjX3ByaXZhdGUuaS5hZ25vLCBhZ2JubywgMCwgJmJwLAorCQkJCVhGU19JTk9fQlRSRUVfUkVGKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJCWxldi0tOworCQl4ZnNfYnRyZWVfc2V0YnVmKGN1ciwgbGV2LCBicCk7CisJCWJsb2NrID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhicCk7CisJCWlmICgoZXJyb3IgPSB4ZnNfYnRyZWVfY2hlY2tfc2Jsb2NrKGN1ciwgYmxvY2ssIGxldiwgYnApKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJY3VyLT5iY19wdHJzW2xldl0gPSBJTlRfR0VUKGJsb2NrLT5iYl9udW1yZWNzLCBBUkNIX0NPTlZFUlQpOworCX0KKwkqc3RhdCA9IDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEZWxldGUgdGhlIHJlY29yZCBwb2ludGVkIHRvIGJ5IGN1ci4KKyAqIFRoZSBjdXJzb3IgcmVmZXJzIHRvIHRoZSBwbGFjZSB3aGVyZSB0aGUgcmVjb3JkIHdhcyAoY291bGQgYmUgaW5zZXJ0ZWQpCisgKiB3aGVuIHRoZSBvcGVyYXRpb24gcmV0dXJucy4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2lub2J0X2RlbGV0ZSgKKwl4ZnNfYnRyZWVfY3VyX3QJKmN1ciwJCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJKnN0YXQpCQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK3sKKwlpbnQJCWVycm9yOworCWludAkJaTsJCS8qIHJlc3VsdCBjb2RlICovCisJaW50CQlsZXZlbDsJCS8qIGJ0cmVlIGxldmVsICovCisKKwkvKgorCSAqIEdvIHVwIHRoZSB0cmVlLCBzdGFydGluZyBhdCBsZWFmIGxldmVsLgorCSAqIElmIDIgaXMgcmV0dXJuZWQgdGhlbiBhIGpvaW4gd2FzIGRvbmU7IGdvIHRvIHRoZSBuZXh0IGxldmVsLgorCSAqIE90aGVyd2lzZSB3ZSBhcmUgZG9uZS4KKwkgKi8KKwlmb3IgKGxldmVsID0gMCwgaSA9IDI7IGkgPT0gMjsgbGV2ZWwrKykgeworCQlpZiAoKGVycm9yID0geGZzX2lub2J0X2RlbHJlYyhjdXIsIGxldmVsLCAmaSkpKQorCQkJcmV0dXJuIGVycm9yOworCX0KKwlpZiAoaSA9PSAwKSB7CisJCWZvciAobGV2ZWwgPSAxOyBsZXZlbCA8IGN1ci0+YmNfbmxldmVsczsgbGV2ZWwrKykgeworCQkJaWYgKGN1ci0+YmNfcHRyc1tsZXZlbF0gPT0gMCkgeworCQkJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfZGVjcmVtZW50KGN1ciwgbGV2ZWwsICZpKSkpCisJCQkJCXJldHVybiBlcnJvcjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwkqc3RhdCA9IGk7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIEdldCB0aGUgZGF0YSBmcm9tIHRoZSBwb2ludGVkLXRvIHJlY29yZC4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2lub2J0X2dldF9yZWMoCisJeGZzX2J0cmVlX2N1cl90CQkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfYWdpbm9fdAkJKmlubywJLyogb3V0cHV0OiBzdGFydGluZyBpbm9kZSBvZiBjaHVuayAqLworCV9faW50MzJfdAkJKmZjbnQsCS8qIG91dHB1dDogbnVtYmVyIG9mIGZyZWUgaW5vZGVzICovCisJeGZzX2lub2ZyZWVfdAkJKmZyZWUsCS8qIG91dHB1dDogZnJlZSBpbm9kZSBtYXNrICovCisJaW50CQkJKnN0YXQpCS8qIG91dHB1dDogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJeGZzX2lub2J0X2Jsb2NrX3QJKmJsb2NrOwkvKiBidHJlZSBibG9jayAqLworCXhmc19idWZfdAkJKmJwOwkvKiBidWZmZXIgY29udGFpbmluZyBidHJlZSBibG9jayAqLworI2lmZGVmIERFQlVHCisJaW50CQkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworI2VuZGlmCisJaW50CQkJcHRyOwkvKiByZWNvcmQgbnVtYmVyICovCisJeGZzX2lub2J0X3JlY190CQkqcmVjOwkvKiByZWNvcmQgZGF0YSAqLworCisJYnAgPSBjdXItPmJjX2J1ZnNbMF07CisJcHRyID0gY3VyLT5iY19wdHJzWzBdOworCWJsb2NrID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhicCk7CisjaWZkZWYgREVCVUcKKwlpZiAoKGVycm9yID0geGZzX2J0cmVlX2NoZWNrX3NibG9jayhjdXIsIGJsb2NrLCAwLCBicCkpKQorCQlyZXR1cm4gZXJyb3I7CisjZW5kaWYKKwkvKgorCSAqIE9mZiB0aGUgcmlnaHQgZW5kIG9yIGxlZnQgZW5kLCByZXR1cm4gZmFpbHVyZS4KKwkgKi8KKwlpZiAocHRyID4gSU5UX0dFVChibG9jay0+YmJfbnVtcmVjcywgQVJDSF9DT05WRVJUKSB8fCBwdHIgPD0gMCkgeworCQkqc3RhdCA9IDA7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIFBvaW50IHRvIHRoZSByZWNvcmQgYW5kIGV4dHJhY3QgaXRzIGRhdGEuCisJICovCisJcmVjID0gWEZTX0lOT0JUX1JFQ19BRERSKGJsb2NrLCBwdHIsIGN1cik7CisJKmlubyA9IElOVF9HRVQocmVjLT5pcl9zdGFydGlubywgQVJDSF9DT05WRVJUKTsKKwkqZmNudCA9IElOVF9HRVQocmVjLT5pcl9mcmVlY291bnQsIEFSQ0hfQ09OVkVSVCk7CisJKmZyZWUgPSBJTlRfR0VUKHJlYy0+aXJfZnJlZSwgQVJDSF9DT05WRVJUKTsKKwkqc3RhdCA9IDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJbmNyZW1lbnQgY3Vyc29yIGJ5IG9uZSByZWNvcmQgYXQgdGhlIGxldmVsLgorICogRm9yIG5vbnplcm8gbGV2ZWxzIHRoZSBsZWFmLXdhcmQgaW5mb3JtYXRpb24gaXMgdW50b3VjaGVkLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfaW5vYnRfaW5jcmVtZW50KAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkJbGV2ZWwsCS8qIGxldmVsIGluIGJ0cmVlLCAwIGlzIGxlYWYgKi8KKwlpbnQJCQkqc3RhdCkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJeGZzX2lub2J0X2Jsb2NrX3QJKmJsb2NrOwkvKiBidHJlZSBibG9jayAqLworCXhmc19idWZfdAkJKmJwOwkvKiBidWZmZXIgY29udGFpbmluZyBidHJlZSBibG9jayAqLworCWludAkJCWVycm9yOwkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwlpbnQJCQlsZXY7CS8qIGJ0cmVlIGxldmVsICovCisKKwlBU1NFUlQobGV2ZWwgPCBjdXItPmJjX25sZXZlbHMpOworCS8qCisJICogUmVhZC1haGVhZCB0byB0aGUgcmlnaHQgYXQgdGhpcyBsZXZlbC4KKwkgKi8KKwl4ZnNfYnRyZWVfcmVhZGFoZWFkKGN1ciwgbGV2ZWwsIFhGU19CVENVUl9SSUdIVFJBKTsKKwkvKgorCSAqIEdldCBhIHBvaW50ZXIgdG8gdGhlIGJ0cmVlIGJsb2NrLgorCSAqLworCWJwID0gY3VyLT5iY19idWZzW2xldmVsXTsKKwlibG9jayA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0soYnApOworI2lmZGVmIERFQlVHCisJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBibG9jaywgbGV2ZWwsIGJwKSkpCisJCXJldHVybiBlcnJvcjsKKyNlbmRpZgorCS8qCisJICogSW5jcmVtZW50IHRoZSBwdHIgYXQgdGhpcyBsZXZlbC4gIElmIHdlJ3JlIHN0aWxsIGluIHRoZSBibG9jaworCSAqIHRoZW4gd2UncmUgZG9uZS4KKwkgKi8KKwlpZiAoKytjdXItPmJjX3B0cnNbbGV2ZWxdIDw9IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJKnN0YXQgPSAxOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBJZiB3ZSBqdXN0IHdlbnQgb2ZmIHRoZSByaWdodCBlZGdlIG9mIHRoZSB0cmVlLCByZXR1cm4gZmFpbHVyZS4KKwkgKi8KKwlpZiAoSU5UX0dFVChibG9jay0+YmJfcmlnaHRzaWIsIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTEFHQkxPQ0spIHsKKwkJKnN0YXQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBNYXJjaCB1cCB0aGUgdHJlZSBpbmNyZW1lbnRpbmcgcG9pbnRlcnMuCisJICogU3RvcCB3aGVuIHdlIGRvbid0IGdvIG9mZiB0aGUgcmlnaHQgZWRnZSBvZiBhIGJsb2NrLgorCSAqLworCWZvciAobGV2ID0gbGV2ZWwgKyAxOyBsZXYgPCBjdXItPmJjX25sZXZlbHM7IGxldisrKSB7CisJCWJwID0gY3VyLT5iY19idWZzW2xldl07CisJCWJsb2NrID0gWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhicCk7CisjaWZkZWYgREVCVUcKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBibG9jaywgbGV2LCBicCkpKQorCQkJcmV0dXJuIGVycm9yOworI2VuZGlmCisJCWlmICgrK2N1ci0+YmNfcHRyc1tsZXZdIDw9IElOVF9HRVQoYmxvY2stPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpCisJCQlicmVhazsKKwkJLyoKKwkJICogUmVhZC1haGVhZCB0aGUgcmlnaHQgYmxvY2ssIHdlJ3JlIGdvaW5nIHRvIHJlYWQgaXQKKwkJICogaW4gdGhlIG5leHQgbG9vcC4KKwkJICovCisJCXhmc19idHJlZV9yZWFkYWhlYWQoY3VyLCBsZXYsIFhGU19CVENVUl9SSUdIVFJBKTsKKwl9CisJLyoKKwkgKiBJZiB3ZSB3ZW50IG9mZiB0aGUgcm9vdCB0aGVuIHdlIGFyZSBzZXJpb3VzbHkgY29uZnVzZWQuCisJICovCisJQVNTRVJUKGxldiA8IGN1ci0+YmNfbmxldmVscyk7CisJLyoKKwkgKiBOb3cgd2FsayBiYWNrIGRvd24gdGhlIHRyZWUsIGZpeGluZyB1cCB0aGUgY3Vyc29yJ3MgYnVmZmVyCisJICogcG9pbnRlcnMgYW5kIGtleSBudW1iZXJzLgorCSAqLworCWZvciAoYnAgPSBjdXItPmJjX2J1ZnNbbGV2XSwgYmxvY2sgPSBYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKGJwKTsKKwkgICAgIGxldiA+IGxldmVsOyApIHsKKwkJeGZzX2FnYmxvY2tfdAlhZ2JubzsJLyogYmxvY2sgbnVtYmVyIG9mIGJ0cmVlIGJsb2NrICovCisKKwkJYWdibm8gPSBJTlRfR0VUKCpYRlNfSU5PQlRfUFRSX0FERFIoYmxvY2ssIGN1ci0+YmNfcHRyc1tsZXZdLCBjdXIpLCBBUkNIX0NPTlZFUlQpOworCQlpZiAoKGVycm9yID0geGZzX2J0cmVlX3JlYWRfYnVmcyhjdXItPmJjX21wLCBjdXItPmJjX3RwLAorCQkJCWN1ci0+YmNfcHJpdmF0ZS5pLmFnbm8sIGFnYm5vLCAwLCAmYnAsCisJCQkJWEZTX0lOT19CVFJFRV9SRUYpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJbGV2LS07CisJCXhmc19idHJlZV9zZXRidWYoY3VyLCBsZXYsIGJwKTsKKwkJYmxvY2sgPSBYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKGJwKTsKKwkJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBibG9jaywgbGV2LCBicCkpKQorCQkJcmV0dXJuIGVycm9yOworCQljdXItPmJjX3B0cnNbbGV2XSA9IDE7CisJfQorCSpzdGF0ID0gMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEluc2VydCB0aGUgY3VycmVudCByZWNvcmQgYXQgdGhlIHBvaW50IHJlZmVyZW5jZWQgYnkgY3VyLgorICogVGhlIGN1cnNvciBtYXkgYmUgaW5jb25zaXN0ZW50IG9uIHJldHVybiBpZiBzcGxpdHMgaGF2ZSBiZWVuIGRvbmUuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19pbm9idF9pbnNlcnQoCisJeGZzX2J0cmVlX2N1cl90CSpjdXIsCQkvKiBidHJlZSBjdXJzb3IgKi8KKwlpbnQJCSpzdGF0KQkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJaW50CQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCWludAkJaTsJCS8qIHJlc3VsdCB2YWx1ZSwgMCBmb3IgZmFpbHVyZSAqLworCWludAkJbGV2ZWw7CQkvKiBjdXJyZW50IGxldmVsIG51bWJlciBpbiBidHJlZSAqLworCXhmc19hZ2Jsb2NrX3QJbmJubzsJCS8qIG5ldyBibG9jayBudW1iZXIgKHNwbGl0IHJlc3VsdCkgKi8KKwl4ZnNfYnRyZWVfY3VyX3QJKm5jdXI7CQkvKiBuZXcgY3Vyc29yIChzcGxpdCByZXN1bHQpICovCisJeGZzX2lub2J0X3JlY190CW5yZWM7CQkvKiByZWNvcmQgYmVpbmcgaW5zZXJ0ZWQgdGhpcyBsZXZlbCAqLworCXhmc19idHJlZV9jdXJfdAkqcGN1cjsJCS8qIHByZXZpb3VzIGxldmVsJ3MgY3Vyc29yICovCisKKwlsZXZlbCA9IDA7CisJbmJubyA9IE5VTExBR0JMT0NLOworCUlOVF9TRVQobnJlYy5pcl9zdGFydGlubywgQVJDSF9DT05WRVJULCBjdXItPmJjX3JlYy5pLmlyX3N0YXJ0aW5vKTsKKwlJTlRfU0VUKG5yZWMuaXJfZnJlZWNvdW50LCBBUkNIX0NPTlZFUlQsIGN1ci0+YmNfcmVjLmkuaXJfZnJlZWNvdW50KTsKKwlJTlRfU0VUKG5yZWMuaXJfZnJlZSwgQVJDSF9DT05WRVJULCBjdXItPmJjX3JlYy5pLmlyX2ZyZWUpOworCW5jdXIgPSAoeGZzX2J0cmVlX2N1cl90ICopMDsKKwlwY3VyID0gY3VyOworCS8qCisJICogTG9vcCBnb2luZyB1cCB0aGUgdHJlZSwgc3RhcnRpbmcgYXQgdGhlIGxlYWYgbGV2ZWwuCisJICogU3RvcCB3aGVuIHdlIGRvbid0IGdldCBhIHNwbGl0IGJsb2NrLCB0aGF0IG11c3QgbWVhbiB0aGF0CisJICogdGhlIGluc2VydCBpcyBmaW5pc2hlZCB3aXRoIHRoaXMgbGV2ZWwuCisJICovCisJZG8geworCQkvKgorCQkgKiBJbnNlcnQgbnJlYy9uYm5vIGludG8gdGhpcyBsZXZlbCBvZiB0aGUgdHJlZS4KKwkJICogTm90ZSBpZiB3ZSBmYWlsLCBuYm5vIHdpbGwgYmUgbnVsbC4KKwkJICovCisJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfaW5zcmVjKHBjdXIsIGxldmVsKyssICZuYm5vLCAmbnJlYywgJm5jdXIsCisJCQkJJmkpKSkgeworCQkJaWYgKHBjdXIgIT0gY3VyKQorCQkJCXhmc19idHJlZV9kZWxfY3Vyc29yKHBjdXIsIFhGU19CVFJFRV9FUlJPUik7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJLyoKKwkJICogU2VlIGlmIHRoZSBjdXJzb3Igd2UganVzdCB1c2VkIGlzIHRyYXNoLgorCQkgKiBDYW4ndCB0cmFzaCB0aGUgY2FsbGVyJ3MgY3Vyc29yLCBidXQgb3RoZXJ3aXNlIHdlIHNob3VsZAorCQkgKiBpZiBuY3VyIGlzIGEgbmV3IGN1cnNvciBvciB3ZSdyZSBhYm91dCB0byBiZSBkb25lLgorCQkgKi8KKwkJaWYgKHBjdXIgIT0gY3VyICYmIChuY3VyIHx8IG5ibm8gPT0gTlVMTEFHQkxPQ0spKSB7CisJCQljdXItPmJjX25sZXZlbHMgPSBwY3VyLT5iY19ubGV2ZWxzOworCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IocGN1ciwgWEZTX0JUUkVFX05PRVJST1IpOworCQl9CisJCS8qCisJCSAqIElmIHdlIGdvdCBhIG5ldyBjdXJzb3IsIHN3aXRjaCB0byBpdC4KKwkJICovCisJCWlmIChuY3VyKSB7CisJCQlwY3VyID0gbmN1cjsKKwkJCW5jdXIgPSAoeGZzX2J0cmVlX2N1cl90ICopMDsKKwkJfQorCX0gd2hpbGUgKG5ibm8gIT0gTlVMTEFHQkxPQ0spOworCSpzdGF0ID0gaTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIExvb2t1cCB0aGUgcmVjb3JkIGVxdWFsIHRvIGlubyBpbiB0aGUgYnRyZWUgZ2l2ZW4gYnkgY3VyLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfaW5vYnRfbG9va3VwX2VxKAorCXhmc19idHJlZV9jdXJfdAkqY3VyLAkJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2FnaW5vX3QJaW5vLAkJLyogc3RhcnRpbmcgaW5vZGUgb2YgY2h1bmsgKi8KKwlfX2ludDMyX3QJZmNudCwJCS8qIGZyZWUgaW5vZGUgY291bnQgKi8KKwl4ZnNfaW5vZnJlZV90CWZyZWUsCQkvKiBmcmVlIGlub2RlIG1hc2sgKi8KKwlpbnQJCSpzdGF0KQkJLyogc3VjY2Vzcy9mYWlsdXJlICovCit7CisJY3VyLT5iY19yZWMuaS5pcl9zdGFydGlubyA9IGlubzsKKwljdXItPmJjX3JlYy5pLmlyX2ZyZWVjb3VudCA9IGZjbnQ7CisJY3VyLT5iY19yZWMuaS5pcl9mcmVlID0gZnJlZTsKKwlyZXR1cm4geGZzX2lub2J0X2xvb2t1cChjdXIsIFhGU19MT09LVVBfRVEsIHN0YXQpOworfQorCisvKgorICogTG9va3VwIHRoZSBmaXJzdCByZWNvcmQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGlubworICogaW4gdGhlIGJ0cmVlIGdpdmVuIGJ5IGN1ci4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2lub2J0X2xvb2t1cF9nZSgKKwl4ZnNfYnRyZWVfY3VyX3QJKmN1ciwJCS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19hZ2lub190CWlubywJCS8qIHN0YXJ0aW5nIGlub2RlIG9mIGNodW5rICovCisJX19pbnQzMl90CWZjbnQsCQkvKiBmcmVlIGlub2RlIGNvdW50ICovCisJeGZzX2lub2ZyZWVfdAlmcmVlLAkJLyogZnJlZSBpbm9kZSBtYXNrICovCisJaW50CQkqc3RhdCkJCS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworeworCWN1ci0+YmNfcmVjLmkuaXJfc3RhcnRpbm8gPSBpbm87CisJY3VyLT5iY19yZWMuaS5pcl9mcmVlY291bnQgPSBmY250OworCWN1ci0+YmNfcmVjLmkuaXJfZnJlZSA9IGZyZWU7CisJcmV0dXJuIHhmc19pbm9idF9sb29rdXAoY3VyLCBYRlNfTE9PS1VQX0dFLCBzdGF0KTsKK30KKworLyoKKyAqIExvb2t1cCB0aGUgZmlyc3QgcmVjb3JkIGxlc3MgdGhhbiBvciBlcXVhbCB0byBpbm8KKyAqIGluIHRoZSBidHJlZSBnaXZlbiBieSBjdXIuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19pbm9idF9sb29rdXBfbGUoCisJeGZzX2J0cmVlX2N1cl90CSpjdXIsCQkvKiBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfYWdpbm9fdAlpbm8sCQkvKiBzdGFydGluZyBpbm9kZSBvZiBjaHVuayAqLworCV9faW50MzJfdAlmY250LAkJLyogZnJlZSBpbm9kZSBjb3VudCAqLworCXhmc19pbm9mcmVlX3QJZnJlZSwJCS8qIGZyZWUgaW5vZGUgbWFzayAqLworCWludAkJKnN0YXQpCQkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KK3sKKwljdXItPmJjX3JlYy5pLmlyX3N0YXJ0aW5vID0gaW5vOworCWN1ci0+YmNfcmVjLmkuaXJfZnJlZWNvdW50ID0gZmNudDsKKwljdXItPmJjX3JlYy5pLmlyX2ZyZWUgPSBmcmVlOworCXJldHVybiB4ZnNfaW5vYnRfbG9va3VwKGN1ciwgWEZTX0xPT0tVUF9MRSwgc3RhdCk7Cit9CisKKy8qCisgKiBVcGRhdGUgdGhlIHJlY29yZCByZWZlcnJlZCB0byBieSBjdXIsIHRvIHRoZSB2YWx1ZSBnaXZlbgorICogYnkgW2lubywgZmNudCwgZnJlZV0uCisgKiBUaGlzIGVpdGhlciB3b3JrcyAocmV0dXJuIDApIG9yIGdldHMgYW4gRUZTQ09SUlVQVEVEIGVycm9yLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfaW5vYnRfdXBkYXRlKAorCXhmc19idHJlZV9jdXJfdAkJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2FnaW5vX3QJCWlubywJLyogc3RhcnRpbmcgaW5vZGUgb2YgY2h1bmsgKi8KKwlfX2ludDMyX3QJCWZjbnQsCS8qIGZyZWUgaW5vZGUgY291bnQgKi8KKwl4ZnNfaW5vZnJlZV90CQlmcmVlKQkvKiBmcmVlIGlub2RlIG1hc2sgKi8KK3sKKwl4ZnNfaW5vYnRfYmxvY2tfdAkqYmxvY2s7CS8qIGJ0cmVlIGJsb2NrIHRvIHVwZGF0ZSAqLworCXhmc19idWZfdAkJKmJwOwkvKiBidWZmZXIgY29udGFpbmluZyBidHJlZSBibG9jayAqLworCWludAkJCWVycm9yOwkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwlpbnQJCQlwdHI7CS8qIGN1cnJlbnQgcmVjb3JkIG51bWJlciAodXBkYXRpbmcpICovCisJeGZzX2lub2J0X3JlY190CQkqcnA7CS8qIHBvaW50ZXIgdG8gdXBkYXRlZCByZWNvcmQgKi8KKworCS8qCisJICogUGljayB1cCB0aGUgY3VycmVudCBibG9jay4KKwkgKi8KKwlicCA9IGN1ci0+YmNfYnVmc1swXTsKKwlibG9jayA9IFhGU19CVUZfVE9fSU5PQlRfQkxPQ0soYnApOworI2lmZGVmIERFQlVHCisJaWYgKChlcnJvciA9IHhmc19idHJlZV9jaGVja19zYmxvY2soY3VyLCBibG9jaywgMCwgYnApKSkKKwkJcmV0dXJuIGVycm9yOworI2VuZGlmCisJLyoKKwkgKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIHJlYyB0byBiZSB1cGRhdGVkLgorCSAqLworCXB0ciA9IGN1ci0+YmNfcHRyc1swXTsKKwlycCA9IFhGU19JTk9CVF9SRUNfQUREUihibG9jaywgcHRyLCBjdXIpOworCS8qCisJICogRmlsbCBpbiB0aGUgbmV3IGNvbnRlbnRzIGFuZCBsb2cgdGhlbS4KKwkgKi8KKwlJTlRfU0VUKHJwLT5pcl9zdGFydGlubywgQVJDSF9DT05WRVJULCBpbm8pOworCUlOVF9TRVQocnAtPmlyX2ZyZWVjb3VudCwgQVJDSF9DT05WRVJULCBmY250KTsKKwlJTlRfU0VUKHJwLT5pcl9mcmVlLCBBUkNIX0NPTlZFUlQsIGZyZWUpOworCXhmc19pbm9idF9sb2dfcmVjcyhjdXIsIGJwLCBwdHIsIHB0cik7CisJLyoKKwkgKiBVcGRhdGluZyBmaXJzdCByZWNvcmQgaW4gbGVhZi4gUGFzcyBuZXcga2V5IHZhbHVlIHVwIHRvIG91ciBwYXJlbnQuCisJICovCisJaWYgKHB0ciA9PSAxKSB7CisJCXhmc19pbm9idF9rZXlfdAlrZXk7CS8qIGtleSBjb250YWluaW5nIFtpbm9dICovCisKKwkJSU5UX1NFVChrZXkuaXJfc3RhcnRpbm8sIEFSQ0hfQ09OVkVSVCwgaW5vKTsKKwkJaWYgKChlcnJvciA9IHhmc19pbm9idF91cGRrZXkoY3VyLCAma2V5LCAxKSkpCisJCQlyZXR1cm4gZXJyb3I7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pYWxsb2NfYnRyZWUuaCBiL2ZzL3hmcy94ZnNfaWFsbG9jX2J0cmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAzYzRkMQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfaWFsbG9jX2J0cmVlLmgKQEAgLTAsMCArMSwzMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19JQUxMT0NfQlRSRUVfSF9fCisjZGVmaW5lCV9fWEZTX0lBTExPQ19CVFJFRV9IX18KKworLyoKKyAqIElub2RlIG1hcCBvbi1kaXNrIHN0cnVjdHVyZXMKKyAqLworCitzdHJ1Y3QgeGZzX2J1ZjsKK3N0cnVjdCB4ZnNfYnRyZWVfY3VyOworc3RydWN0IHhmc19idHJlZV9zYmxvY2s7CitzdHJ1Y3QgeGZzX21vdW50OworCisvKgorICogVGhlcmUgaXMgYSBidHJlZSBmb3IgdGhlIGlub2RlIG1hcCBwZXIgYWxsb2NhdGlvbiBncm91cC4KKyAqLworI2RlZmluZQlYRlNfSUJUX01BR0lDCTB4NDk0MTQyNTQJLyogJ0lBQlQnICovCisKK3R5cGVkZWYJX191aW50NjRfdAl4ZnNfaW5vZnJlZV90OworI2RlZmluZQlYRlNfSU5PREVTX1BFUl9DSFVOSwkoTkJCWSAqIHNpemVvZih4ZnNfaW5vZnJlZV90KSkKKyNkZWZpbmUJWEZTX0lOT0RFU19QRVJfQ0hVTktfTE9HCShYRlNfTkJCWUxPRyArIDMpCisjZGVmaW5lCVhGU19JTk9CVF9BTExfRlJFRQkoKHhmc19pbm9mcmVlX3QpLTEpCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lOT0JUX01BU0tOKQoreGZzX2lub2ZyZWVfdCB4ZnNfaW5vYnRfbWFza24oaW50IGksIGludCBuKTsKKyNkZWZpbmUJWEZTX0lOT0JUX01BU0tOKGksbikJCXhmc19pbm9idF9tYXNrbihpLG4pCisjZWxzZQorI2RlZmluZQlYRlNfSU5PQlRfTUFTS04oaSxuKQlcCisJKCgoKG4pID49IFhGU19JTk9ERVNfUEVSX0NIVU5LID8gXAorCQkoeGZzX2lub2ZyZWVfdCkwIDogKCh4ZnNfaW5vZnJlZV90KTEgPDwgKG4pKSkgLSAxKSA8PCAoaSkpCisjZW5kaWYKKworLyoKKyAqIERhdGEgcmVjb3JkIHN0cnVjdHVyZQorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfaW5vYnRfcmVjCit7CisJeGZzX2FnaW5vX3QJaXJfc3RhcnRpbm87CS8qIHN0YXJ0aW5nIGlub2RlIG51bWJlciAqLworCV9faW50MzJfdAlpcl9mcmVlY291bnQ7CS8qIGNvdW50IG9mIGZyZWUgaW5vZGVzIChzZXQgYml0cykgKi8KKwl4ZnNfaW5vZnJlZV90CWlyX2ZyZWU7CS8qIGZyZWUgaW5vZGUgbWFzayAqLworfSB4ZnNfaW5vYnRfcmVjX3Q7CisKKy8qCisgKiBLZXkgc3RydWN0dXJlCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19pbm9idF9rZXkKK3sKKwl4ZnNfYWdpbm9fdAlpcl9zdGFydGlubzsJLyogc3RhcnRpbmcgaW5vZGUgbnVtYmVyICovCit9IHhmc19pbm9idF9rZXlfdDsKKwordHlwZWRlZiB4ZnNfYWdibG9ja190IHhmc19pbm9idF9wdHJfdDsJLyogYnRyZWUgcG9pbnRlciB0eXBlICovCisJCQkJCS8qIGJ0cmVlIGJsb2NrIGhlYWRlciB0eXBlICovCit0eXBlZGVmCXN0cnVjdCB4ZnNfYnRyZWVfc2Jsb2NrIHhmc19pbm9idF9ibG9ja190OworCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CVUZfVE9fSU5PQlRfQkxPQ0spCit4ZnNfaW5vYnRfYmxvY2tfdCAqeGZzX2J1Zl90b19pbm9idF9ibG9jayhzdHJ1Y3QgeGZzX2J1ZiAqYnApOworI2RlZmluZQlYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKGJwKQl4ZnNfYnVmX3RvX2lub2J0X2Jsb2NrKGJwKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0JVRl9UT19JTk9CVF9CTE9DSyhicCkgKCh4ZnNfaW5vYnRfYmxvY2tfdCAqKShYRlNfQlVGX1BUUihicCkpKQorI2VuZGlmCisKKy8qCisgKiBCaXQgbWFuaXB1bGF0aW9ucyBmb3IgaXJfZnJlZS4KKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSU5PQlRfTUFTSykKK3hmc19pbm9mcmVlX3QgeGZzX2lub2J0X21hc2soaW50IGkpOworI2RlZmluZQlYRlNfSU5PQlRfTUFTSyhpKQkJeGZzX2lub2J0X21hc2soaSkKKyNlbHNlCisjZGVmaW5lCVhGU19JTk9CVF9NQVNLKGkpCQkoKHhmc19pbm9mcmVlX3QpMSA8PCAoaSkpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lOT0JUX0lTX0ZSRUUpCitpbnQgeGZzX2lub2J0X2lzX2ZyZWUoeGZzX2lub2J0X3JlY190ICpycCwgaW50IGkpOworI2RlZmluZQlYRlNfSU5PQlRfSVNfRlJFRShycCxpKQl4ZnNfaW5vYnRfaXNfZnJlZShycCxpKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0lOT0JUX0lTX0ZSRUUocnAsaSkJKCgocnApLT5pcl9mcmVlICYgWEZTX0lOT0JUX01BU0soaSkpICE9IDApCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lOT0JUX1NFVF9GUkVFKQordm9pZCB4ZnNfaW5vYnRfc2V0X2ZyZWUoeGZzX2lub2J0X3JlY190ICpycCwgaW50IGkpOworI2RlZmluZQlYRlNfSU5PQlRfU0VUX0ZSRUUocnAsaSkJeGZzX2lub2J0X3NldF9mcmVlKHJwLGkpCisjZWxzZQorI2RlZmluZQlYRlNfSU5PQlRfU0VUX0ZSRUUocnAsaSkJKChycCktPmlyX2ZyZWUgfD0gWEZTX0lOT0JUX01BU0soaSkpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lOT0JUX0NMUl9GUkVFKQordm9pZCB4ZnNfaW5vYnRfY2xyX2ZyZWUoeGZzX2lub2J0X3JlY190ICpycCwgaW50IGkpOworI2RlZmluZQlYRlNfSU5PQlRfQ0xSX0ZSRUUocnAsaSkJeGZzX2lub2J0X2Nscl9mcmVlKHJwLGkpCisjZWxzZQorI2RlZmluZQlYRlNfSU5PQlRfQ0xSX0ZSRUUocnAsaSkJKChycCktPmlyX2ZyZWUgJj0gflhGU19JTk9CVF9NQVNLKGkpKQorI2VuZGlmCisKKy8qCisgKiBSZWFsIGJsb2NrIHN0cnVjdHVyZXMgaGF2ZSBhIHNpemUgZXF1YWwgdG8gdGhlIGRpc2sgYmxvY2sgc2l6ZS4KKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSU5PQlRfQkxPQ0tfU0laRSkKK2ludCB4ZnNfaW5vYnRfYmxvY2tfc2l6ZShpbnQgbGV2LCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyKTsKKyNkZWZpbmUJWEZTX0lOT0JUX0JMT0NLX1NJWkUobGV2LGN1cikJeGZzX2lub2J0X2Jsb2NrX3NpemUobGV2LGN1cikKKyNlbHNlCisjZGVmaW5lCVhGU19JTk9CVF9CTE9DS19TSVpFKGxldixjdXIpCSgxIDw8IChjdXIpLT5iY19ibG9ja2xvZykKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JTk9CVF9CTE9DS19NQVhSRUNTKQoraW50IHhmc19pbm9idF9ibG9ja19tYXhyZWNzKGludCBsZXYsIHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIpOworI2RlZmluZQlYRlNfSU5PQlRfQkxPQ0tfTUFYUkVDUyhsZXYsY3VyKQl4ZnNfaW5vYnRfYmxvY2tfbWF4cmVjcyhsZXYsY3VyKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0lOT0JUX0JMT0NLX01BWFJFQ1MobGV2LGN1cikJXAorCSgoY3VyKS0+YmNfbXAtPm1faW5vYnRfbXhyW2xldiAhPSAwXSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSU5PQlRfQkxPQ0tfTUlOUkVDUykKK2ludCB4ZnNfaW5vYnRfYmxvY2tfbWlucmVjcyhpbnQgbGV2LCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyKTsKKyNkZWZpbmUJWEZTX0lOT0JUX0JMT0NLX01JTlJFQ1MobGV2LGN1cikJeGZzX2lub2J0X2Jsb2NrX21pbnJlY3MobGV2LGN1cikKKyNlbHNlCisjZGVmaW5lCVhGU19JTk9CVF9CTE9DS19NSU5SRUNTKGxldixjdXIpCVwKKwkoKGN1ciktPmJjX21wLT5tX2lub2J0X21ucltsZXYgIT0gMF0pCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSU5PQlRfSVNfTEFTVF9SRUMpCitpbnQgeGZzX2lub2J0X2lzX2xhc3RfcmVjKHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIpOworI2RlZmluZQlYRlNfSU5PQlRfSVNfTEFTVF9SRUMoY3VyKQl4ZnNfaW5vYnRfaXNfbGFzdF9yZWMoY3VyKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0lOT0JUX0lTX0xBU1RfUkVDKGN1cikJXAorCSgoY3VyKS0+YmNfcHRyc1swXSA9PSBcCisJCUlOVF9HRVQoWEZTX0JVRl9UT19JTk9CVF9CTE9DSygoY3VyKS0+YmNfYnVmc1swXSktPmJiX251bXJlY3MsIEFSQ0hfQ09OVkVSVCkpCisjZW5kaWYKKworLyoKKyAqIE1heGltdW0gbnVtYmVyIG9mIGlub2RlIGJ0cmVlIGxldmVscy4KKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSU5fTUFYTEVWRUxTKQoraW50IHhmc19pbl9tYXhsZXZlbHMoc3RydWN0IHhmc19tb3VudCAqbXApOworI2RlZmluZQlYRlNfSU5fTUFYTEVWRUxTKG1wKQkJeGZzX2luX21heGxldmVscyhtcCkKKyNlbHNlCisjZGVmaW5lCVhGU19JTl9NQVhMRVZFTFMobXApCQkoKG1wKS0+bV9pbl9tYXhsZXZlbHMpCisjZW5kaWYKKworLyoKKyAqIGJsb2NrIG51bWJlcnMgaW4gdGhlIEFHLgorICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JQlRfQkxPQ0spCit4ZnNfYWdibG9ja190IHhmc19pYnRfYmxvY2soc3RydWN0IHhmc19tb3VudCAqbXApOworI2RlZmluZQlYRlNfSUJUX0JMT0NLKG1wKQkJeGZzX2lidF9ibG9jayhtcCkKKyNlbHNlCisjZGVmaW5lCVhGU19JQlRfQkxPQ0sobXApCSgoeGZzX2FnYmxvY2tfdCkoWEZTX0NOVF9CTE9DSyhtcCkgKyAxKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfUFJFQUxMT0NfQkxPQ0tTKQoreGZzX2FnYmxvY2tfdCB4ZnNfcHJlYWxsb2NfYmxvY2tzKHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKKyNkZWZpbmUJWEZTX1BSRUFMTE9DX0JMT0NLUyhtcCkJCXhmc19wcmVhbGxvY19ibG9ja3MobXApCisjZWxzZQorI2RlZmluZQlYRlNfUFJFQUxMT0NfQkxPQ0tTKG1wKQkoKHhmc19hZ2Jsb2NrX3QpKFhGU19JQlRfQkxPQ0sobXApICsgMSkpCisjZW5kaWYKKworLyoKKyAqIFJlY29yZCwga2V5LCBhbmQgcG9pbnRlciBhZGRyZXNzIG1hY3JvcyBmb3IgYnRyZWUgYmxvY2tzLgorICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JTk9CVF9SRUNfQUREUikKK3hmc19pbm9idF9yZWNfdCAqCit4ZnNfaW5vYnRfcmVjX2FkZHIoeGZzX2lub2J0X2Jsb2NrX3QgKmJiLCBpbnQgaSwgc3RydWN0IHhmc19idHJlZV9jdXIgKmN1cik7CisjZGVmaW5lCVhGU19JTk9CVF9SRUNfQUREUihiYixpLGN1cikJeGZzX2lub2J0X3JlY19hZGRyKGJiLGksY3VyKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0lOT0JUX1JFQ19BRERSKGJiLGksY3VyKQlcCisJWEZTX0JUUkVFX1JFQ19BRERSKFhGU19JTk9CVF9CTE9DS19TSVpFKDAsY3VyKSwgeGZzX2lub2J0LCBiYiwgaSwgXAorCQlYRlNfSU5PQlRfQkxPQ0tfTUFYUkVDUygwLCBjdXIpKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lOT0JUX0tFWV9BRERSKQoreGZzX2lub2J0X2tleV90ICoKK3hmc19pbm9idF9rZXlfYWRkcih4ZnNfaW5vYnRfYmxvY2tfdCAqYmIsIGludCBpLCBzdHJ1Y3QgeGZzX2J0cmVlX2N1ciAqY3VyKTsKKyNkZWZpbmUJWEZTX0lOT0JUX0tFWV9BRERSKGJiLGksY3VyKQl4ZnNfaW5vYnRfa2V5X2FkZHIoYmIsaSxjdXIpCisjZWxzZQorI2RlZmluZQlYRlNfSU5PQlRfS0VZX0FERFIoYmIsaSxjdXIpCVwKKwlYRlNfQlRSRUVfS0VZX0FERFIoWEZTX0lOT0JUX0JMT0NLX1NJWkUoMSxjdXIpLCB4ZnNfaW5vYnQsIGJiLCBpLCBcCisJCVhGU19JTk9CVF9CTE9DS19NQVhSRUNTKDEsIGN1cikpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSU5PQlRfUFRSX0FERFIpCit4ZnNfaW5vYnRfcHRyX3QgKgoreGZzX2lub2J0X3B0cl9hZGRyKHhmc19pbm9idF9ibG9ja190ICpiYiwgaW50IGksIHN0cnVjdCB4ZnNfYnRyZWVfY3VyICpjdXIpOworI2RlZmluZQlYRlNfSU5PQlRfUFRSX0FERFIoYmIsaSxjdXIpCXhmc19pbm9idF9wdHJfYWRkcihiYixpLGN1cikKKyNlbHNlCisjZGVmaW5lCVhGU19JTk9CVF9QVFJfQUREUihiYixpLGN1cikJXAorCVhGU19CVFJFRV9QVFJfQUREUihYRlNfSU5PQlRfQkxPQ0tfU0laRSgxLGN1ciksIHhmc19pbm9idCwgYmIsIGksIFwKKwkJWEZTX0lOT0JUX0JMT0NLX01BWFJFQ1MoMSwgY3VyKSkKKyNlbmRpZgorCisvKgorICogUHJvdG90eXBlcyBmb3IgZXh0ZXJuYWxseSB2aXNpYmxlIHJvdXRpbmVzLgorICovCisKKy8qCisgKiBEZWNyZW1lbnQgY3Vyc29yIGJ5IG9uZSByZWNvcmQgYXQgdGhlIGxldmVsLgorICogRm9yIG5vbnplcm8gbGV2ZWxzIHRoZSBsZWFmLXdhcmQgaW5mb3JtYXRpb24gaXMgdW50b3VjaGVkLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfaW5vYnRfZGVjcmVtZW50KAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJCWxldmVsLAkvKiBsZXZlbCBpbiBidHJlZSwgMCBpcyBsZWFmICovCisJaW50CQkJKnN0YXQpOyAvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KKworLyoKKyAqIERlbGV0ZSB0aGUgcmVjb3JkIHBvaW50ZWQgdG8gYnkgY3VyLgorICogVGhlIGN1cnNvciByZWZlcnMgdG8gdGhlIHBsYWNlIHdoZXJlIHRoZSByZWNvcmQgd2FzIChjb3VsZCBiZSBpbnNlcnRlZCkKKyAqIHdoZW4gdGhlIG9wZXJhdGlvbiByZXR1cm5zLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfaW5vYnRfZGVsZXRlKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJCSpzdGF0KTsJLyogc3VjY2Vzcy9mYWlsdXJlICovCisKKy8qCisgKiBHZXQgdGhlIGRhdGEgZnJvbSB0aGUgcG9pbnRlZC10byByZWNvcmQuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19pbm9idF9nZXRfcmVjKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19hZ2lub190CQkqaW5vLAkvKiBvdXRwdXQ6IHN0YXJ0aW5nIGlub2RlIG9mIGNodW5rICovCisJX19pbnQzMl90CQkqZmNudCwJLyogb3V0cHV0OiBudW1iZXIgb2YgZnJlZSBpbm9kZXMgKi8KKwl4ZnNfaW5vZnJlZV90CQkqZnJlZSwJLyogb3V0cHV0OiBmcmVlIGlub2RlIG1hc2sgKi8KKwlpbnQJCQkqc3RhdCk7CS8qIG91dHB1dDogc3VjY2Vzcy9mYWlsdXJlICovCisKKy8qCisgKiBJbmNyZW1lbnQgY3Vyc29yIGJ5IG9uZSByZWNvcmQgYXQgdGhlIGxldmVsLgorICogRm9yIG5vbnplcm8gbGV2ZWxzIHRoZSBsZWFmLXdhcmQgaW5mb3JtYXRpb24gaXMgdW50b3VjaGVkLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfaW5vYnRfaW5jcmVtZW50KAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCWludAkJCWxldmVsLAkvKiBsZXZlbCBpbiBidHJlZSwgMCBpcyBsZWFmICovCisJaW50CQkJKnN0YXQpOwkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KKworLyoKKyAqIEluc2VydCB0aGUgY3VycmVudCByZWNvcmQgYXQgdGhlIHBvaW50IHJlZmVyZW5jZWQgYnkgY3VyLgorICogVGhlIGN1cnNvciBtYXkgYmUgaW5jb25zaXN0ZW50IG9uIHJldHVybiBpZiBzcGxpdHMgaGF2ZSBiZWVuIGRvbmUuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19pbm9idF9pbnNlcnQoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJaW50CQkJKnN0YXQpOwkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KKworLyoKKyAqIExvb2t1cCB0aGUgcmVjb3JkIGVxdWFsIHRvIGlubyBpbiB0aGUgYnRyZWUgZ2l2ZW4gYnkgY3VyLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfaW5vYnRfbG9va3VwX2VxKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19hZ2lub190CQlpbm8sCS8qIHN0YXJ0aW5nIGlub2RlIG9mIGNodW5rICovCisJX19pbnQzMl90CQlmY250LAkvKiBmcmVlIGlub2RlIGNvdW50ICovCisJeGZzX2lub2ZyZWVfdAkJZnJlZSwJLyogZnJlZSBpbm9kZSBtYXNrICovCisJaW50CQkJKnN0YXQpOwkvKiBzdWNjZXNzL2ZhaWx1cmUgKi8KKworLyoKKyAqIExvb2t1cCB0aGUgZmlyc3QgcmVjb3JkIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBpbm8KKyAqIGluIHRoZSBidHJlZSBnaXZlbiBieSBjdXIuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19pbm9idF9sb29rdXBfZ2UoCisJc3RydWN0IHhmc19idHJlZV9jdXIJKmN1ciwJLyogYnRyZWUgY3Vyc29yICovCisJeGZzX2FnaW5vX3QJCWlubywJLyogc3RhcnRpbmcgaW5vZGUgb2YgY2h1bmsgKi8KKwlfX2ludDMyX3QJCWZjbnQsCS8qIGZyZWUgaW5vZGUgY291bnQgKi8KKwl4ZnNfaW5vZnJlZV90CQlmcmVlLAkvKiBmcmVlIGlub2RlIG1hc2sgKi8KKwlpbnQJCQkqc3RhdCk7CS8qIHN1Y2Nlc3MvZmFpbHVyZSAqLworCisvKgorICogTG9va3VwIHRoZSBmaXJzdCByZWNvcmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGlubworICogaW4gdGhlIGJ0cmVlIGdpdmVuIGJ5IGN1ci4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX2lub2J0X2xvb2t1cF9sZSgKKwlzdHJ1Y3QgeGZzX2J0cmVlX2N1cgkqY3VyLAkvKiBidHJlZSBjdXJzb3IgKi8KKwl4ZnNfYWdpbm9fdAkJaW5vLAkvKiBzdGFydGluZyBpbm9kZSBvZiBjaHVuayAqLworCV9faW50MzJfdAkJZmNudCwJLyogZnJlZSBpbm9kZSBjb3VudCAqLworCXhmc19pbm9mcmVlX3QJCWZyZWUsCS8qIGZyZWUgaW5vZGUgbWFzayAqLworCWludAkJCSpzdGF0KTsJLyogc3VjY2Vzcy9mYWlsdXJlICovCisKKy8qCisgKiBVcGRhdGUgdGhlIHJlY29yZCByZWZlcnJlZCB0byBieSBjdXIsIHRvIHRoZSB2YWx1ZSBnaXZlbgorICogYnkgW2lubywgZmNudCwgZnJlZV0uCisgKiBUaGlzIGVpdGhlciB3b3JrcyAocmV0dXJuIDApIG9yIGdldHMgYW4gRUZTQ09SUlVQVEVEIGVycm9yLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfaW5vYnRfdXBkYXRlKAorCXN0cnVjdCB4ZnNfYnRyZWVfY3VyCSpjdXIsCS8qIGJ0cmVlIGN1cnNvciAqLworCXhmc19hZ2lub190CQlpbm8sCS8qIHN0YXJ0aW5nIGlub2RlIG9mIGNodW5rICovCisJX19pbnQzMl90CQlmY250LAkvKiBmcmVlIGlub2RlIGNvdW50ICovCisJeGZzX2lub2ZyZWVfdAkJZnJlZSk7CS8qIGZyZWUgaW5vZGUgbWFzayAqLworCisjZW5kaWYJLyogX19YRlNfSUFMTE9DX0JUUkVFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pZ2V0LmMgYi9mcy94ZnMveGZzX2lnZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTBiYTFkCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19pZ2V0LmMKQEAgLTAsMCArMSwxMDIyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDUgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisKKyNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2FnLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvYy5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19xdW90YS5oIgorI2luY2x1ZGUgInhmc191dGlscy5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKKworLyoKKyAqIEluaXRpYWxpemUgdGhlIGlub2RlIGhhc2ggdGFibGUgZm9yIHRoZSBuZXdseSBtb3VudGVkIGZpbGUgc3lzdGVtLgorICogQ2hvb3NlIGFuIGluaXRpYWwgdGFibGUgc2l6ZSBiYXNlZCBvbiB1c2VyIHNwZWNpZmllZCB2YWx1ZSwgZWxzZQorICogdXNlIGEgc2ltcGxlIGFsZ29yaXRobSB1c2luZyB0aGUgbWF4aW11bSBudW1iZXIgb2YgaW5vZGVzIGFzIGFuCisgKiBpbmRpY2F0b3IgZm9yIHRhYmxlIHNpemUsIGFuZCBjbGFtcCBpdCBiZXR3ZWVuIG9uZSBhbmQgc29tZSBsYXJnZQorICogbnVtYmVyIG9mIHBhZ2VzLgorICovCit2b2lkCit4ZnNfaWhhc2hfaW5pdCh4ZnNfbW91bnRfdCAqbXApCit7CisJX191aW50NjRfdAlpY291bnQ7CisJdWludAkJaSwgZmxhZ3MgPSBLTV9TTEVFUCB8IEtNX01BWUZBSUw7CisKKwlpZiAoIW1wLT5tX2loc2l6ZSkgeworCQlpY291bnQgPSBtcC0+bV9tYXhpY291bnQgPyBtcC0+bV9tYXhpY291bnQgOgorCQkJIChtcC0+bV9zYi5zYl9kYmxvY2tzIDw8IG1wLT5tX3NiLnNiX2lub3BibG9nKTsKKwkJbXAtPm1faWhzaXplID0gMSA8PCBtYXhfdCh1aW50LCA4LAorCQkJCQkoeGZzX2hpZ2hiaXQ2NChpY291bnQpICsgMSkgLyAyKTsKKwkJbXAtPm1faWhzaXplID0gbWluX3QodWludCwgbXAtPm1faWhzaXplLAorCQkJCQkoNjQgKiBOQlBQKSAvIHNpemVvZih4ZnNfaWhhc2hfdCkpOworCX0KKworCXdoaWxlICghKG1wLT5tX2loYXNoID0gKHhmc19paGFzaF90ICopa21lbV96YWxsb2MobXAtPm1faWhzaXplICoKKwkJCQkJCXNpemVvZih4ZnNfaWhhc2hfdCksIGZsYWdzKSkpIHsKKwkJaWYgKChtcC0+bV9paHNpemUgPj49IDEpIDw9IE5CUFApCisJCQlmbGFncyA9IEtNX1NMRUVQOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgbXAtPm1faWhzaXplOyBpKyspIHsKKwkJcndsb2NrX2luaXQoJihtcC0+bV9paGFzaFtpXS5paF9sb2NrKSk7CisJfQorfQorCisvKgorICogRnJlZSB1cCBzdHJ1Y3R1cmVzIGFsbG9jYXRlZCBieSB4ZnNfaWhhc2hfaW5pdCwgYXQgdW5tb3VudCB0aW1lLgorICovCit2b2lkCit4ZnNfaWhhc2hfZnJlZSh4ZnNfbW91bnRfdCAqbXApCit7CisJa21lbV9mcmVlKG1wLT5tX2loYXNoLCBtcC0+bV9paHNpemUqc2l6ZW9mKHhmc19paGFzaF90KSk7CisJbXAtPm1faWhhc2ggPSBOVUxMOworfQorCisvKgorICogSW5pdGlhbGl6ZSB0aGUgaW5vZGUgY2x1c3RlciBoYXNoIHRhYmxlIGZvciB0aGUgbmV3bHkgbW91bnRlZCBmaWxlIHN5c3RlbS4KKyAqIEl0cyBzaXplIGlzIGRlcml2ZWQgZnJvbSB0aGUgaWhhc2ggdGFibGUgc2l6ZS4KKyAqLwordm9pZAoreGZzX2NoYXNoX2luaXQoeGZzX21vdW50X3QgKm1wKQoreworCXVpbnQJaTsKKworCW1wLT5tX2Noc2l6ZSA9IG1heF90KHVpbnQsIDEsIG1wLT5tX2loc2l6ZSAvCisJCQkgKFhGU19JTk9ERV9DTFVTVEVSX1NJWkUobXApID4+IG1wLT5tX3NiLnNiX2lub2RlbG9nKSk7CisJbXAtPm1fY2hzaXplID0gbWluX3QodWludCwgbXAtPm1fY2hzaXplLCBtcC0+bV9paHNpemUpOworCW1wLT5tX2NoYXNoID0gKHhmc19jaGFzaF90ICopa21lbV96YWxsb2MobXAtPm1fY2hzaXplCisJCQkJCQkgKiBzaXplb2YoeGZzX2NoYXNoX3QpLAorCQkJCQkJIEtNX1NMRUVQKTsKKwlmb3IgKGkgPSAwOyBpIDwgbXAtPm1fY2hzaXplOyBpKyspIHsKKwkJc3BpbmxvY2tfaW5pdCgmbXAtPm1fY2hhc2hbaV0uY2hfbG9jaywieGZzaGFzaCIpOworCX0KK30KKworLyoKKyAqIEZyZWUgdXAgc3RydWN0dXJlcyBhbGxvY2F0ZWQgYnkgeGZzX2NoYXNoX2luaXQsIGF0IHVubW91bnQgdGltZS4KKyAqLwordm9pZAoreGZzX2NoYXNoX2ZyZWUoeGZzX21vdW50X3QgKm1wKQoreworCWludAlpOworCisJZm9yIChpID0gMDsgaSA8IG1wLT5tX2Noc2l6ZTsgaSsrKSB7CisJCXNwaW5sb2NrX2Rlc3Ryb3koJm1wLT5tX2NoYXNoW2ldLmNoX2xvY2spOworCX0KKworCWttZW1fZnJlZShtcC0+bV9jaGFzaCwgbXAtPm1fY2hzaXplKnNpemVvZih4ZnNfY2hhc2hfdCkpOworCW1wLT5tX2NoYXNoID0gTlVMTDsKK30KKworLyoKKyAqIExvb2sgdXAgYW4gaW5vZGUgYnkgbnVtYmVyIGluIHRoZSBnaXZlbiBmaWxlIHN5c3RlbS4KKyAqIFRoZSBpbm9kZSBpcyBsb29rZWQgdXAgaW4gdGhlIGhhc2ggdGFibGUgZm9yIHRoZSBmaWxlIHN5c3RlbQorICogcmVwcmVzZW50ZWQgYnkgdGhlIG1vdW50IHBvaW50IHBhcmFtZXRlciBtcC4gIEVhY2ggYnVja2V0IG9mCisgKiB0aGUgaGFzaCB0YWJsZSBpcyBndWFyZGVkIGJ5IGFuIGluZGl2aWR1YWwgc2VtYXBob3JlLgorICoKKyAqIElmIHRoZSBpbm9kZSBpcyBmb3VuZCBpbiB0aGUgaGFzaCB0YWJsZSwgaXRzIGNvcnJlc3BvbmRpbmcgdm5vZGUKKyAqIGlzIG9idGFpbmVkIHdpdGggYSBjYWxsIHRvIHZuX2dldCgpLiAgVGhpcyBjYWxsIHRha2VzIGNhcmUgb2YKKyAqIGNvb3JkaW5hdGlvbiB3aXRoIHRoZSByZWNsYW1hdGlvbiBvZiB0aGUgaW5vZGUgYW5kIHZub2RlLiAgTm90ZQorICogdGhhdCB0aGUgdm1hcCBzdHJ1Y3R1cmUgaXMgZmlsbGVkIGluIHdoaWxlIGhvbGRpbmcgdGhlIGhhc2ggbG9jay4KKyAqIFRoaXMgZ2l2ZXMgdXMgdGhlIHN0YXRlIG9mIHRoZSBpbm9kZS92bm9kZSB3aGVuIHdlIGZvdW5kIGl0IGFuZAorICogaXMgdXNlZCBmb3IgY29vcmRpbmF0aW9uIGluIHZuX2dldCgpLgorICoKKyAqIElmIGl0IGlzIG5vdCBpbiBjb3JlLCByZWFkIGl0IGluIGZyb20gdGhlIGZpbGUgc3lzdGVtJ3MgZGV2aWNlIGFuZAorICogYWRkIHRoZSBpbm9kZSBpbnRvIHRoZSBoYXNoIHRhYmxlLgorICoKKyAqIFRoZSBpbm9kZSBpcyBsb2NrZWQgYWNjb3JkaW5nIHRvIHRoZSB2YWx1ZSBvZiB0aGUgbG9ja19mbGFncyBwYXJhbWV0ZXIuCisgKiBUaGlzIGZsYWcgcGFyYW1ldGVyIGluZGljYXRlcyBob3cgYW5kIGlmIHRoZSBpbm9kZSdzIElPIGxvY2sgYW5kIGlub2RlIGxvY2sKKyAqIHNob3VsZCBiZSB0YWtlbi4KKyAqCisgKiBtcCAtLSB0aGUgbW91bnQgcG9pbnQgc3RydWN0dXJlIGZvciB0aGUgY3VycmVudCBmaWxlIHN5c3RlbS4gIEl0IHBvaW50cworICogICAgICAgdG8gdGhlIGlub2RlIGhhc2ggdGFibGUuCisgKiB0cCAtLSBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gaWYgdGhlcmUgaXMgb25lLiAgVGhpcyBpcworICogICAgICAgc2ltcGx5IHBhc3NlZCB0aHJvdWdoIHRvIHRoZSB4ZnNfaXJlYWQoKSBjYWxsLgorICogaW5vIC0tIHRoZSBudW1iZXIgb2YgdGhlIGlub2RlIGRlc2lyZWQuICBUaGlzIGlzIHRoZSB1bmlxdWUgaWRlbnRpZmllcgorICogICAgICAgIHdpdGhpbiB0aGUgZmlsZSBzeXN0ZW0gZm9yIHRoZSBpbm9kZSBiZWluZyByZXF1ZXN0ZWQuCisgKiBsb2NrX2ZsYWdzIC0tIGZsYWdzIGluZGljYXRpbmcgaG93IHRvIGxvY2sgdGhlIGlub2RlLiAgU2VlIHRoZSBjb21tZW50CisgKgkJIGZvciB4ZnNfaWxvY2soKSBmb3IgYSBsaXN0IG9mIHZhbGlkIHZhbHVlcy4KKyAqIGJubyAtLSB0aGUgYmxvY2sgbnVtYmVyIHN0YXJ0aW5nIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgaW5vZGUsCisgKgkgIGlmIGtub3duIChhcyBieSBidWxrc3RhdCksIGVsc2UgMC4KKyAqLworU1RBVElDIGludAoreGZzX2lnZXRfY29yZSgKKwl2bm9kZV90CQkqdnAsCisJeGZzX21vdW50X3QJKm1wLAorCXhmc190cmFuc190CSp0cCwKKwl4ZnNfaW5vX3QJaW5vLAorCXVpbnQJCWZsYWdzLAorCXVpbnQJCWxvY2tfZmxhZ3MsCisJeGZzX2lub2RlX3QJKippcHAsCisJeGZzX2RhZGRyX3QJYm5vKQoreworCXhmc19paGFzaF90CSppaDsKKwl4ZnNfaW5vZGVfdAkqaXA7CisJeGZzX2lub2RlX3QJKmlxOworCXZub2RlX3QJCSppbm9kZV92cDsKKwl1bG9uZwkJdmVyc2lvbjsKKwlpbnQJCWVycm9yOworCS8qIFJFRkVSRU5DRUQgKi8KKwl4ZnNfY2hhc2hfdAkqY2g7CisJeGZzX2NoYXNobGlzdF90CSpjaGwsICpjaGxuZXc7CisJU1BMREVDTChzKTsKKworCisJaWggPSBYRlNfSUhBU0gobXAsIGlubyk7CisKK2FnYWluOgorCXJlYWRfbG9jaygmaWgtPmloX2xvY2spOworCisJZm9yIChpcCA9IGloLT5paF9uZXh0OyBpcCAhPSBOVUxMOyBpcCA9IGlwLT5pX25leHQpIHsKKwkJaWYgKGlwLT5pX2lubyA9PSBpbm8pIHsKKwkJCS8qCisJCQkgKiBJZiBJTkVXIGlzIHNldCB0aGlzIGlub2RlIGlzIGJlaW5nIHNldCB1cAorCQkJICogd2UgbmVlZCB0byBwYXVzZSBhbmQgdHJ5IGFnYWluLgorCQkJICovCisJCQlpZiAoaXAtPmlfZmxhZ3MgJiBYRlNfSU5FVykgeworCQkJCXJlYWRfdW5sb2NrKCZpaC0+aWhfbG9jayk7CisJCQkJZGVsYXkoMSk7CisJCQkJWEZTX1NUQVRTX0lOQyh4c19pZ19mcmVjeWNsZSk7CisKKwkJCQlnb3RvIGFnYWluOworCQkJfQorCisJCQlpbm9kZV92cCA9IFhGU19JVE9WX05VTEwoaXApOworCQkJaWYgKGlub2RlX3ZwID09IE5VTEwpIHsKKwkJCQkvKgorCQkJCSAqIElmIElSRUNMQUlNIGlzIHNldCB0aGlzIGlub2RlIGlzCisJCQkJICogb24gaXRzIHdheSBvdXQgb2YgdGhlIHN5c3RlbSwKKwkJCQkgKiB3ZSBuZWVkIHRvIHBhdXNlIGFuZCB0cnkgYWdhaW4uCisJCQkJICovCisJCQkJaWYgKGlwLT5pX2ZsYWdzICYgWEZTX0lSRUNMQUlNKSB7CisJCQkJCXJlYWRfdW5sb2NrKCZpaC0+aWhfbG9jayk7CisJCQkJCWRlbGF5KDEpOworCQkJCQlYRlNfU1RBVFNfSU5DKHhzX2lnX2ZyZWN5Y2xlKTsKKworCQkJCQlnb3RvIGFnYWluOworCQkJCX0KKworCQkJCXZuX3RyYWNlX2V4aXQodnAsICJ4ZnNfaWdldC5hbGxvYyIsCisJCQkJCShpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKworCQkJCVhGU19TVEFUU19JTkMoeHNfaWdfZm91bmQpOworCisJCQkJaXAtPmlfZmxhZ3MgJj0gflhGU19JUkVDTEFJTUFCTEU7CisJCQkJcmVhZF91bmxvY2soJmloLT5paF9sb2NrKTsKKworCQkJCVhGU19NT1VOVF9JTE9DSyhtcCk7CisJCQkJbGlzdF9kZWxfaW5pdCgmaXAtPmlfcmVjbGFpbSk7CisJCQkJWEZTX01PVU5UX0lVTkxPQ0sobXApOworCisJCQkJZ290byBmaW5pc2hfaW5vZGU7CisKKwkJCX0gZWxzZSBpZiAodnAgIT0gaW5vZGVfdnApIHsKKwkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gTElOVkZTX0dFVF9JUChpbm9kZV92cCk7CisKKwkJCQkvKiBUaGUgaW5vZGUgaXMgYmVpbmcgdG9ybiBkb3duLCBwYXVzZSBhbmQKKwkJCQkgKiB0cnkgYWdhaW4uCisJCQkJICovCisJCQkJaWYgKGlub2RlLT5pX3N0YXRlICYgKElfRlJFRUlORyB8IElfQ0xFQVIpKSB7CisJCQkJCXJlYWRfdW5sb2NrKCZpaC0+aWhfbG9jayk7CisJCQkJCWRlbGF5KDEpOworCQkJCQlYRlNfU1RBVFNfSU5DKHhzX2lnX2ZyZWN5Y2xlKTsKKworCQkJCQlnb3RvIGFnYWluOworCQkJCX0KKy8qIENoYW5jZXMgYXJlIHRoZSBvdGhlciB2bm9kZSAodGhlIG9uZSBpbiB0aGUgaW5vZGUpIGlzIGJlaW5nIHRvcm4KKyAqIGRvd24gcmlnaHQgbm93LCBhbmQgd2UgbGFuZGVkIG9uIHRvcCBvZiBpdC4gUXVlc3Rpb24gaXMsIHdoYXQgZG8KKyAqIHdlIGRvPyBVbmhvb2sgdGhlIG9sZCBpbm9kZSBhbmQgaG9vayB1cCB0aGUgbmV3IG9uZT8KKyAqLworCQkJCWNtbl9lcnIoQ0VfUEFOSUMsCisJCQkieGZzX2lnZXRfY29yZTogYW1iaWd1b3VzIHZuczogdnAvMHglcCwgaW52cC8weCVwIiwKKwkJCQkJCWlub2RlX3ZwLCB2cCk7CisJCQl9CisKKwkJCXJlYWRfdW5sb2NrKCZpaC0+aWhfbG9jayk7CisKKwkJCVhGU19TVEFUU19JTkMoeHNfaWdfZm91bmQpOworCitmaW5pc2hfaW5vZGU6CisJCQlpZiAoaXAtPmlfZC5kaV9tb2RlID09IDApIHsKKwkJCQlpZiAoIShmbGFncyAmIElHRVRfQ1JFQVRFKSkKKwkJCQkJcmV0dXJuIEVOT0VOVDsKKwkJCQl4ZnNfaW9jb3JlX2lub2RlX3JlaW5pdChpcCk7CisJCQl9CisJCisJCQlpZiAobG9ja19mbGFncyAhPSAwKQorCQkJCXhmc19pbG9jayhpcCwgbG9ja19mbGFncyk7CisKKwkJCWlwLT5pX2ZsYWdzICY9IH5YRlNfSVNUQUxFOworCisJCQl2bl90cmFjZV9leGl0KHZwLCAieGZzX2lnZXQuZm91bmQiLAorCQkJCQkJKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCQkJZ290byByZXR1cm5faXA7CisJCX0KKwl9CisKKwkvKgorCSAqIElub2RlIGNhY2hlIG1pc3M6IHNhdmUgdGhlIGhhc2ggY2hhaW4gdmVyc2lvbiBzdGFtcCBhbmQgdW5sb2NrCisJICogdGhlIGNoYWluLCBzbyB3ZSBkb24ndCBkZWFkbG9jayBpbiB2bl9hbGxvYy4KKwkgKi8KKwlYRlNfU1RBVFNfSU5DKHhzX2lnX21pc3NlZCk7CisKKwl2ZXJzaW9uID0gaWgtPmloX3ZlcnNpb247CisKKwlyZWFkX3VubG9jaygmaWgtPmloX2xvY2spOworCisJLyoKKwkgKiBSZWFkIHRoZSBkaXNrIGlub2RlIGF0dHJpYnV0ZXMgaW50byBhIG5ldyBpbm9kZSBzdHJ1Y3R1cmUgYW5kIGdldAorCSAqIGEgbmV3IHZub2RlIGZvciBpdC4gVGhpcyBzaG91bGQgYWxzbyBpbml0aWFsaXplIGlfaW5vIGFuZCBpX21vdW50LgorCSAqLworCWVycm9yID0geGZzX2lyZWFkKG1wLCB0cCwgaW5vLCAmaXAsIGJubyk7CisJaWYgKGVycm9yKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwl2bl90cmFjZV9leGl0KHZwLCAieGZzX2lnZXQuYWxsb2MiLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisKKwl4ZnNfaW5vZGVfbG9ja19pbml0KGlwLCB2cCk7CisJeGZzX2lvY29yZV9pbm9kZV9pbml0KGlwKTsKKworCWlmIChsb2NrX2ZsYWdzICE9IDApIHsKKwkJeGZzX2lsb2NrKGlwLCBsb2NrX2ZsYWdzKTsKKwl9CisJCQorCWlmICgoaXAtPmlfZC5kaV9tb2RlID09IDApICYmICEoZmxhZ3MgJiBJR0VUX0NSRUFURSkpIHsKKwkJeGZzX2lkZXN0cm95KGlwKTsKKwkJcmV0dXJuIEVOT0VOVDsKKwl9CisKKwkvKgorCSAqIFB1dCBpcCBvbiBpdHMgaGFzaCBjaGFpbiwgdW5sZXNzIHNvbWVvbmUgZWxzZSBoYXNoZWQgYSBkdXBsaWNhdGUKKwkgKiBhZnRlciB3ZSByZWxlYXNlZCB0aGUgaGFzaCBsb2NrLgorCSAqLworCXdyaXRlX2xvY2soJmloLT5paF9sb2NrKTsKKworCWlmIChpaC0+aWhfdmVyc2lvbiAhPSB2ZXJzaW9uKSB7CisJCWZvciAoaXEgPSBpaC0+aWhfbmV4dDsgaXEgIT0gTlVMTDsgaXEgPSBpcS0+aV9uZXh0KSB7CisJCQlpZiAoaXEtPmlfaW5vID09IGlubykgeworCQkJCXdyaXRlX3VubG9jaygmaWgtPmloX2xvY2spOworCQkJCXhmc19pZGVzdHJveShpcCk7CisKKwkJCQlYRlNfU1RBVFNfSU5DKHhzX2lnX2R1cCk7CisJCQkJZ290byBhZ2FpbjsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogVGhlc2UgdmFsdWVzIF9tdXN0XyBiZSBzZXQgYmVmb3JlIHJlbGVhc2luZyBpaGxvY2shCisJICovCisJaXAtPmlfaGFzaCA9IGloOworCWlmICgoaXEgPSBpaC0+aWhfbmV4dCkpIHsKKwkJaXEtPmlfcHJldnAgPSAmaXAtPmlfbmV4dDsKKwl9CisJaXAtPmlfbmV4dCA9IGlxOworCWlwLT5pX3ByZXZwID0gJmloLT5paF9uZXh0OworCWloLT5paF9uZXh0ID0gaXA7CisJaXAtPmlfdWRxdW90ID0gaXAtPmlfZ2RxdW90ID0gTlVMTDsKKwlpaC0+aWhfdmVyc2lvbisrOworCWlwLT5pX2ZsYWdzIHw9IFhGU19JTkVXOworCisJd3JpdGVfdW5sb2NrKCZpaC0+aWhfbG9jayk7CisKKwkvKgorCSAqIHB1dCBpcCBvbiBpdHMgY2x1c3RlcidzIGhhc2ggY2hhaW4KKwkgKi8KKwlBU1NFUlQoaXAtPmlfY2hhc2ggPT0gTlVMTCAmJiBpcC0+aV9jcHJldiA9PSBOVUxMICYmCisJICAgICAgIGlwLT5pX2NuZXh0ID09IE5VTEwpOworCisJY2hsbmV3ID0gTlVMTDsKKwljaCA9IFhGU19DSEFTSChtcCwgaXAtPmlfYmxrbm8pOworIGNobHJlZG86CisJcyA9IG11dGV4X3NwaW5sb2NrKCZjaC0+Y2hfbG9jayk7CisJZm9yIChjaGwgPSBjaC0+Y2hfbGlzdDsgY2hsICE9IE5VTEw7IGNobCA9IGNobC0+Y2hsX25leHQpIHsKKwkJaWYgKGNobC0+Y2hsX2Jsa25vID09IGlwLT5pX2Jsa25vKSB7CisKKwkJCS8qIGluc2VydCB0aGlzIGlub2RlIGludG8gdGhlIGRvdWJseS1saW5rZWQgbGlzdAorCQkJICogd2hlcmUgY2hsIHBvaW50cyAqLworCQkJaWYgKChpcSA9IGNobC0+Y2hsX2lwKSkgeworCQkJCWlwLT5pX2NwcmV2ID0gaXEtPmlfY3ByZXY7CisJCQkJaXEtPmlfY3ByZXYtPmlfY25leHQgPSBpcDsKKwkJCQlpcS0+aV9jcHJldiA9IGlwOworCQkJCWlwLT5pX2NuZXh0ID0gaXE7CisJCQl9IGVsc2UgeworCQkJCWlwLT5pX2NuZXh0ID0gaXA7CisJCQkJaXAtPmlfY3ByZXYgPSBpcDsKKwkJCX0KKwkJCWNobC0+Y2hsX2lwID0gaXA7CisJCQlpcC0+aV9jaGFzaCA9IGNobDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogbm8gaGFzaCBsaXN0IGZvdW5kIGZvciB0aGlzIGJsb2NrOyBhZGQgYSBuZXcgaGFzaCBsaXN0ICovCisJaWYgKGNobCA9PSBOVUxMKSAgeworCQlpZiAoY2hsbmV3ID09IE5VTEwpIHsKKwkJCW11dGV4X3NwaW51bmxvY2soJmNoLT5jaF9sb2NrLCBzKTsKKwkJCUFTU0VSVCh4ZnNfY2hhc2hsaXN0X3pvbmUgIT0gTlVMTCk7CisJCQljaGxuZXcgPSAoeGZzX2NoYXNobGlzdF90ICopCisJCQkJCWttZW1fem9uZV9hbGxvYyh4ZnNfY2hhc2hsaXN0X3pvbmUsCisJCQkJCQlLTV9TTEVFUCk7CisJCQlBU1NFUlQoY2hsbmV3ICE9IE5VTEwpOworCQkJZ290byBjaGxyZWRvOworCQl9IGVsc2UgeworCQkJaXAtPmlfY25leHQgPSBpcDsKKwkJCWlwLT5pX2NwcmV2ID0gaXA7CisJCQlpcC0+aV9jaGFzaCA9IGNobG5ldzsKKwkJCWNobG5ldy0+Y2hsX2lwID0gaXA7CisJCQljaGxuZXctPmNobF9ibGtubyA9IGlwLT5pX2Jsa25vOworCQkJY2hsbmV3LT5jaGxfbmV4dCA9IGNoLT5jaF9saXN0OworCQkJY2gtPmNoX2xpc3QgPSBjaGxuZXc7CisJCQljaGxuZXcgPSBOVUxMOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGNobG5ldyAhPSBOVUxMKSB7CisJCQlrbWVtX3pvbmVfZnJlZSh4ZnNfY2hhc2hsaXN0X3pvbmUsIGNobG5ldyk7CisJCX0KKwl9CisKKwltdXRleF9zcGludW5sb2NrKCZjaC0+Y2hfbG9jaywgcyk7CisKKworCS8qCisJICogTGluayBpcCB0byBpdHMgbW91bnQgYW5kIHRocmVhZCBpdCBvbiB0aGUgbW91bnQncyBpbm9kZSBsaXN0LgorCSAqLworCVhGU19NT1VOVF9JTE9DSyhtcCk7CisJaWYgKChpcSA9IG1wLT5tX2lub2RlcykpIHsKKwkJQVNTRVJUKGlxLT5pX21wcmV2LT5pX21uZXh0ID09IGlxKTsKKwkJaXAtPmlfbXByZXYgPSBpcS0+aV9tcHJldjsKKwkJaXEtPmlfbXByZXYtPmlfbW5leHQgPSBpcDsKKwkJaXEtPmlfbXByZXYgPSBpcDsKKwkJaXAtPmlfbW5leHQgPSBpcTsKKwl9IGVsc2UgeworCQlpcC0+aV9tbmV4dCA9IGlwOworCQlpcC0+aV9tcHJldiA9IGlwOworCX0KKwltcC0+bV9pbm9kZXMgPSBpcDsKKworCVhGU19NT1VOVF9JVU5MT0NLKG1wKTsKKworIHJldHVybl9pcDoKKwlBU1NFUlQoaXAtPmlfZGYuaWZfZXh0X21heCA9PQorCSAgICAgICBYRlNfSUZPUktfRFNJWkUoaXApIC8gc2l6ZW9mKHhmc19ibWJ0X3JlY190KSk7CisKKwlBU1NFUlQoKChpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19SRUFMVElNRSkgIT0gMCkgPT0KKwkgICAgICAgKChpcC0+aV9pb2NvcmUuaW9fZmxhZ3MgJiBYRlNfSU9DT1JFX1JUKSAhPSAwKSk7CisKKwkqaXBwID0gaXA7CisKKwkvKgorCSAqIElmIHdlIGhhdmUgYSByZWFsIHR5cGUgZm9yIGFuIG9uLWRpc2sgaW5vZGUsIHdlIGNhbiBzZXQgb3BzKCZ1bmxvY2spCisJICogbm93LgkgSWYgaXQncyBhIG5ldyBpbm9kZSBiZWluZyBjcmVhdGVkLCB4ZnNfaWFsbG9jIHdpbGwgaGFuZGxlIGl0LgorCSAqLworCVZGU19JTklUX1ZOT0RFKFhGU19NVE9WRlMobXApLCB2cCwgWEZTX0lUT0JIVihpcCksIDEpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFRoZSAnbm9ybWFsJyBpbnRlcm5hbCB4ZnNfaWdldCwgaWYgbmVlZGVkIGl0IHdpbGwKKyAqICdhbGxvY2F0ZScsIG9yICdnZXQnLCB0aGUgdm5vZGUuCisgKi8KK2ludAoreGZzX2lnZXQoCisJeGZzX21vdW50X3QJKm1wLAorCXhmc190cmFuc190CSp0cCwKKwl4ZnNfaW5vX3QJaW5vLAorCXVpbnQJCWZsYWdzLAorCXVpbnQJCWxvY2tfZmxhZ3MsCisJeGZzX2lub2RlX3QJKippcHAsCisJeGZzX2RhZGRyX3QJYm5vKQoreworCXN0cnVjdCBpbm9kZQkqaW5vZGU7CisJdm5vZGVfdAkJKnZwID0gTlVMTDsKKwlpbnQJCWVycm9yOworCityZXRyeToKKwlYRlNfU1RBVFNfSU5DKHhzX2lnX2F0dGVtcHRzKTsKKworCWlmICgoaW5vZGUgPSBpZ2V0X2xvY2tlZChYRlNfTVRPVkZTKG1wKS0+dmZzX3N1cGVyLCBpbm8pKSkgeworCQliaHZfZGVzY190CSpiZHA7CisJCXhmc19pbm9kZV90CSppcDsKKwkJaW50CQluZXdub2RlOworCisJCXZwID0gTElOVkZTX0dFVF9WUChpbm9kZSk7CisJCWlmIChpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSB7Citpbm9kZV9hbGxvY2F0ZToKKwkJCXZuX2luaXRpYWxpemUoaW5vZGUpOworCQkJZXJyb3IgPSB4ZnNfaWdldF9jb3JlKHZwLCBtcCwgdHAsIGlubywgZmxhZ3MsCisJCQkJCWxvY2tfZmxhZ3MsIGlwcCwgYm5vKTsKKwkJCWlmIChlcnJvcikgeworCQkJCXZuX21hcmtfYmFkKHZwKTsKKwkJCQlpZiAoaW5vZGUtPmlfc3RhdGUgJiBJX05FVykKKwkJCQkJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CisJCQkJaXB1dChpbm9kZSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBUaGVzZSBhcmUgdHJ1ZSBpZiB0aGUgaW5vZGUgaXMgaW4gaW5hY3RpdmUgb3IKKwkJCSAqIHJlY2xhaW0uIFRoZSBsaW51eCBpbm9kZSBpcyBhYm91dCB0byBnbyBhd2F5LAorCQkJICogd2FpdCBmb3IgdGhhdCBwYXRoIHRvIGZpbmlzaCwgYW5kIHRyeSBhZ2Fpbi4KKwkJCSAqLworCQkJaWYgKHZwLT52X2ZsYWcgJiAoVklOQUNUIHwgVlJFQ0xNKSkgeworCQkJCXZuX3dhaXQodnApOworCQkJCWlwdXQoaW5vZGUpOworCQkJCWdvdG8gcmV0cnk7CisJCQl9CisKKwkJCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpKSB7CisJCQkJaXB1dChpbm9kZSk7CisJCQkJcmV0dXJuIEVJTzsKKwkJCX0KKworCQkJYmRwID0gdm5fYmh2X2xvb2t1cChWTl9CSFZfSEVBRCh2cCksICZ4ZnNfdm5vZGVvcHMpOworCQkJaWYgKGJkcCA9PSBOVUxMKSB7CisJCQkJWEZTX1NUQVRTX0lOQyh4c19pZ19kdXApOworCQkJCWdvdG8gaW5vZGVfYWxsb2NhdGU7CisJCQl9CisJCQlpcCA9IFhGU19CSFZUT0koYmRwKTsKKwkJCWlmIChsb2NrX2ZsYWdzICE9IDApCisJCQkJeGZzX2lsb2NrKGlwLCBsb2NrX2ZsYWdzKTsKKwkJCW5ld25vZGUgPSAoaXAtPmlfZC5kaV9tb2RlID09IDApOworCQkJaWYgKG5ld25vZGUpCisJCQkJeGZzX2lvY29yZV9pbm9kZV9yZWluaXQoaXApOworCQkJWEZTX1NUQVRTX0lOQyh4c19pZ19mb3VuZCk7CisJCQkqaXBwID0gaXA7CisJCQllcnJvciA9IDA7CisJCX0KKwl9IGVsc2UKKwkJZXJyb3IgPSBFTk9NRU07CS8qIElmIHdlIGdvdCBubyBpbm9kZSB3ZSBhcmUgb3V0IG9mIG1lbW9yeSAqLworCisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogRG8gdGhlIHNldHVwIGZvciB0aGUgdmFyaW91cyBsb2NrcyB3aXRoaW4gdGhlIGluY29yZSBpbm9kZS4KKyAqLwordm9pZAoreGZzX2lub2RlX2xvY2tfaW5pdCgKKwl4ZnNfaW5vZGVfdAkqaXAsCisJdm5vZGVfdAkJKnZwKQoreworCW1ybG9ja19pbml0KCZpcC0+aV9sb2NrLCBNUkxPQ0tfQUxMT1dfRVFVQUxfUFJJfE1STE9DS19CQVJSSUVSLAorCQkgICAgICJ4ZnNpbm8iLCAobG9uZyl2cC0+dl9udW1iZXIpOworCW1ybG9ja19pbml0KCZpcC0+aV9pb2xvY2ssIE1STE9DS19CQVJSSUVSLCAieGZzaW8iLCB2cC0+dl9udW1iZXIpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmlwLT5pX2lwaW5fd2FpdCk7CisJYXRvbWljX3NldCgmaXAtPmlfcGluY291bnQsIDApOworCWluaXRfc2VtYSgmaXAtPmlfZmxvY2ssIDEsICJ4ZnNmaW5vIiwgdnAtPnZfbnVtYmVyKTsKK30KKworLyoKKyAqIExvb2sgZm9yIHRoZSBpbm9kZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBpbm8gaW4gdGhlIGhhc2ggdGFibGUuCisgKiBJZiBpdCBpcyB0aGVyZSBhbmQgaXRzIGlfdHJhbnNwIHBvaW50ZXIgbWF0Y2hlcyB0cCwgcmV0dXJuIGl0LgorICogT3RoZXJ3aXNlLCByZXR1cm4gTlVMTC4KKyAqLworeGZzX2lub2RlX3QgKgoreGZzX2lub2RlX2luY29yZSh4ZnNfbW91bnRfdAkqbXAsCisJCSB4ZnNfaW5vX3QJaW5vLAorCQkgeGZzX3RyYW5zX3QJKnRwKQoreworCXhmc19paGFzaF90CSppaDsKKwl4ZnNfaW5vZGVfdAkqaXA7CisKKwlpaCA9IFhGU19JSEFTSChtcCwgaW5vKTsKKwlyZWFkX2xvY2soJmloLT5paF9sb2NrKTsKKwlmb3IgKGlwID0gaWgtPmloX25leHQ7IGlwICE9IE5VTEw7IGlwID0gaXAtPmlfbmV4dCkgeworCQlpZiAoaXAtPmlfaW5vID09IGlubykgeworCQkJLyoKKwkJCSAqIElmIHdlIGZpbmQgaXQgYW5kIHRwIG1hdGNoZXMsIHJldHVybiBpdC4KKwkJCSAqIE90aGVyd2lzZSBicmVhayBmcm9tIHRoZSBsb29wIGFuZCByZXR1cm4KKwkJCSAqIE5VTEwuCisJCQkgKi8KKwkJCWlmIChpcC0+aV90cmFuc3AgPT0gdHApIHsKKwkJCQlyZWFkX3VubG9jaygmaWgtPmloX2xvY2spOworCQkJCXJldHVybiAoaXApOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisJcmVhZF91bmxvY2soJmloLT5paF9sb2NrKTsKKwlyZXR1cm4gKE5VTEwpOworfQorCisvKgorICogRGVjcmVtZW50IHJlZmVyZW5jZSBjb3VudCBvZiBhbiBpbm9kZSBzdHJ1Y3R1cmUgYW5kIHVubG9jayBpdC4KKyAqCisgKiBpcCAtLSB0aGUgaW5vZGUgYmVpbmcgcmVsZWFzZWQKKyAqIGxvY2tfZmxhZ3MgLS0gdGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSBpbm9kZSdzIGxvY2tzIHRvIGJlCisgKiAgICAgICB0byBiZSByZWxlYXNlZC4gIFNlZSB0aGUgY29tbWVudCBvbiB4ZnNfaXVubG9jaygpIGZvciBhIGxpc3QKKyAqCSBvZiB2YWxpZCB2YWx1ZXMuCisgKi8KK3ZvaWQKK3hmc19pcHV0KHhmc19pbm9kZV90CSppcCwKKwkgdWludAkJbG9ja19mbGFncykKK3sKKwl2bm9kZV90CSp2cCA9IFhGU19JVE9WKGlwKTsKKworCXZuX3RyYWNlX2VudHJ5KHZwLCAieGZzX2lwdXQiLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisKKwl4ZnNfaXVubG9jayhpcCwgbG9ja19mbGFncyk7CisKKwlWTl9SRUxFKHZwKTsKK30KKworLyoKKyAqIFNwZWNpYWwgaXB1dCBmb3IgYnJhbmQtbmV3IGlub2RlcyB0aGF0IGFyZSBzdGlsbCBsb2NrZWQKKyAqLwordm9pZAoreGZzX2lwdXRfbmV3KHhmc19pbm9kZV90CSppcCwKKwkgICAgIHVpbnQJCWxvY2tfZmxhZ3MpCit7CisJdm5vZGVfdAkJKnZwID0gWEZTX0lUT1YoaXApOworCXN0cnVjdCBpbm9kZQkqaW5vZGUgPSBMSU5WRlNfR0VUX0lQKHZwKTsKKworCXZuX3RyYWNlX2VudHJ5KHZwLCAieGZzX2lwdXRfbmV3IiwgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCisJaWYgKChpcC0+aV9kLmRpX21vZGUgPT0gMCkpIHsKKwkJQVNTRVJUKCEoaXAtPmlfZmxhZ3MgJiBYRlNfSVJFQ0xBSU1BQkxFKSk7CisJCXZuX21hcmtfYmFkKHZwKTsKKwl9CisJaWYgKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpCisJCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOworCWlmIChsb2NrX2ZsYWdzKQorCQl4ZnNfaXVubG9jayhpcCwgbG9ja19mbGFncyk7CisJVk5fUkVMRSh2cCk7Cit9CisKKworLyoKKyAqIFRoaXMgcm91dGluZSBlbWJvZGllcyB0aGUgcGFydCBvZiB0aGUgcmVjbGFpbSBjb2RlIHRoYXQgcHVsbHMKKyAqIHRoZSBpbm9kZSBmcm9tIHRoZSBpbm9kZSBoYXNoIHRhYmxlIGFuZCB0aGUgbW91bnQgc3RydWN0dXJlJ3MKKyAqIGlub2RlIGxpc3QuCisgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIHhmc19yZWNsYWltKCkuCisgKi8KK3ZvaWQKK3hmc19pcmVjbGFpbSh4ZnNfaW5vZGVfdCAqaXApCit7CisJdm5vZGVfdAkJKnZwOworCisJLyoKKwkgKiBSZW1vdmUgZnJvbSBvbGQgaGFzaCBsaXN0IGFuZCBtb3VudCBsaXN0LgorCSAqLworCVhGU19TVEFUU19JTkMoeHNfaWdfcmVjbGFpbXMpOworCisJeGZzX2lleHRyYWN0KGlwKTsKKworCS8qCisJICogSGVyZSB3ZSBkbyBhIHNwdXJpb3VzIGlub2RlIGxvY2sgaW4gb3JkZXIgdG8gY29vcmRpbmF0ZSB3aXRoCisJICogeGZzX3N5bmMoKS4gIFRoaXMgaXMgYmVjYXVzZSB4ZnNfc3luYygpIHJlZmVyZW5jZXMgdGhlIGlub2RlcworCSAqIGluIHRoZSBtb3VudCBsaXN0IHdpdGhvdXQgdGFraW5nIHJlZmVyZW5jZXMgb24gdGhlIGNvcnJlc3BvbmRpbmcKKwkgKiB2bm9kZXMuICBXZSBtYWtlIHRoYXQgT0sgaGVyZSBieSBlbnN1cmluZyB0aGF0IHdlIHdhaXQgdW50aWwKKwkgKiB0aGUgaW5vZGUgaXMgdW5sb2NrZWQgaW4geGZzX3N5bmMoKSBiZWZvcmUgd2UgZ28gYWhlYWQgYW5kCisJICogZnJlZSBpdC4gIFdlIGdldCBib3RoIHRoZSByZWd1bGFyIGxvY2sgYW5kIHRoZSBpbyBsb2NrIGJlY2F1c2UKKwkgKiB0aGUgeGZzX3N5bmMoKSBjb2RlIG1heSBuZWVkIHRvIGRyb3AgdGhlIHJlZ3VsYXIgb25lIGJ1dCB3aWxsCisJICogc3RpbGwgaG9sZCB0aGUgaW8gbG9jay4KKwkgKi8KKwl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMIHwgWEZTX0lPTE9DS19FWENMKTsKKworCS8qCisJICogUmVsZWFzZSBkcXVvdHMgKGFuZCB0aGVpciByZWZlcmVuY2VzKSBpZiBhbnkuIEFuIGlub2RlIG1heSBlc2NhcGUKKwkgKiB4ZnNfaW5hY3RpdmUgYW5kIGdldCBoZXJlIHZpYSB2bl9hbGxvYy0+dm5fcmVjbGFpbSBwYXRoLgorCSAqLworCVhGU19RTV9EUURFVEFDSChpcC0+aV9tb3VudCwgaXApOworCisJLyoKKwkgKiBQdWxsIG91ciBiZWhhdmlvciBkZXNjcmlwdG9yIGZyb20gdGhlIHZub2RlIGNoYWluLgorCSAqLworCXZwID0gWEZTX0lUT1ZfTlVMTChpcCk7CisJaWYgKHZwKSB7CisJCXZuX2Jodl9yZW1vdmUoVk5fQkhWX0hFQUQodnApLCBYRlNfSVRPQkhWKGlwKSk7CisJfQorCisJLyoKKwkgKiBGcmVlIGFsbCBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbm9kZS4KKwkgKi8KKwl4ZnNfaWRlc3Ryb3koaXApOworfQorCisvKgorICogVGhpcyByb3V0aW5lIHJlbW92ZXMgYW4gYWJvdXQtdG8tYmUtZGVzdHJveWVkIGlub2RlIGZyb20KKyAqIGFsbCBvZiB0aGUgbGlzdHMgaW4gd2hpY2ggaXQgaXMgbG9jYXRlZCB3aXRoIHRoZSBleGNlcHRpb24KKyAqIG9mIHRoZSBiZWhhdmlvciBjaGFpbi4KKyAqLwordm9pZAoreGZzX2lleHRyYWN0KAorCXhmc19pbm9kZV90CSppcCkKK3sKKwl4ZnNfaWhhc2hfdAkqaWg7CisJeGZzX2lub2RlX3QJKmlxOworCXhmc19tb3VudF90CSptcDsKKwl4ZnNfY2hhc2hfdAkqY2g7CisJeGZzX2NoYXNobGlzdF90ICpjaGwsICpjaG07CisJU1BMREVDTChzKTsKKworCWloID0gaXAtPmlfaGFzaDsKKwl3cml0ZV9sb2NrKCZpaC0+aWhfbG9jayk7CisJaWYgKChpcSA9IGlwLT5pX25leHQpKSB7CisJCWlxLT5pX3ByZXZwID0gaXAtPmlfcHJldnA7CisJfQorCSppcC0+aV9wcmV2cCA9IGlxOworCXdyaXRlX3VubG9jaygmaWgtPmloX2xvY2spOworCisJLyoKKwkgKiBSZW1vdmUgZnJvbSBjbHVzdGVyIGhhc2ggbGlzdAorCSAqICAgMSkgZGVsZXRlIHRoZSBjaGFzaGxpc3QgaWYgdGhpcyBpcyB0aGUgbGFzdCBpbm9kZSBvbiB0aGUgY2hhc2hsaXN0CisJICogICAyKSB1bmNoYWluIGZyb20gbGlzdCBvZiBpbm9kZXMKKwkgKiAgIDMpIHBvaW50IGNoYXNobGlzdC0+Y2hsX2lwIHRvICdjaGxfbmV4dCcgaWYgdG8gdGhpcyBpbm9kZS4KKwkgKi8KKwltcCA9IGlwLT5pX21vdW50OworCWNoID0gWEZTX0NIQVNIKG1wLCBpcC0+aV9ibGtubyk7CisJcyA9IG11dGV4X3NwaW5sb2NrKCZjaC0+Y2hfbG9jayk7CisKKwlpZiAoaXAtPmlfY25leHQgPT0gaXApIHsKKwkJLyogTGFzdCBpbm9kZSBvbiBjaGFzaGxpc3QgKi8KKwkJQVNTRVJUKGlwLT5pX2NuZXh0ID09IGlwICYmIGlwLT5pX2NwcmV2ID09IGlwKTsKKwkJQVNTRVJUKGlwLT5pX2NoYXNoICE9IE5VTEwpOworCQljaG09TlVMTDsKKwkJZm9yIChjaGwgPSBjaC0+Y2hfbGlzdDsgY2hsICE9IE5VTEw7IGNobCA9IGNobC0+Y2hsX25leHQpIHsKKwkJCWlmIChjaGwtPmNobF9ibGtubyA9PSBpcC0+aV9ibGtubykgeworCQkJCWlmIChjaG0gPT0gTlVMTCkgeworCQkJCQkvKiBmaXJzdCBpdGVtIG9uIHRoZSBsaXN0ICovCisJCQkJCWNoLT5jaF9saXN0ID0gY2hsLT5jaGxfbmV4dDsKKwkJCQl9IGVsc2UgeworCQkJCQljaG0tPmNobF9uZXh0ID0gY2hsLT5jaGxfbmV4dDsKKwkJCQl9CisJCQkJa21lbV96b25lX2ZyZWUoeGZzX2NoYXNobGlzdF96b25lLCBjaGwpOworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlBU1NFUlQoY2hsLT5jaGxfaXAgIT0gaXApOworCQkJCWNobSA9IGNobDsKKwkJCX0KKwkJfQorCQlBU1NFUlRfQUxXQVlTKGNobCAhPSBOVUxMKTsKKyAgICAgICB9IGVsc2UgeworCQkvKiBkZWxldGUgb25lIGlub2RlIGZyb20gYSBub24tZW1wdHkgbGlzdCAqLworCQlpcSA9IGlwLT5pX2NuZXh0OworCQlpcS0+aV9jcHJldiA9IGlwLT5pX2NwcmV2OworCQlpcC0+aV9jcHJldi0+aV9jbmV4dCA9IGlxOworCQlpZiAoaXAtPmlfY2hhc2gtPmNobF9pcCA9PSBpcCkgeworCQkJaXAtPmlfY2hhc2gtPmNobF9pcCA9IGlxOworCQl9CisJCWlwLT5pX2NoYXNoID0gX19yZXR1cm5fYWRkcmVzczsKKwkJaXAtPmlfY3ByZXYgPSBfX3JldHVybl9hZGRyZXNzOworCQlpcC0+aV9jbmV4dCA9IF9fcmV0dXJuX2FkZHJlc3M7CisJfQorCW11dGV4X3NwaW51bmxvY2soJmNoLT5jaF9sb2NrLCBzKTsKKworCS8qCisJICogUmVtb3ZlIGZyb20gbW91bnQncyBpbm9kZSBsaXN0LgorCSAqLworCVhGU19NT1VOVF9JTE9DSyhtcCk7CisJQVNTRVJUKChpcC0+aV9tbmV4dCAhPSBOVUxMKSAmJiAoaXAtPmlfbXByZXYgIT0gTlVMTCkpOworCWlxID0gaXAtPmlfbW5leHQ7CisJaXEtPmlfbXByZXYgPSBpcC0+aV9tcHJldjsKKwlpcC0+aV9tcHJldi0+aV9tbmV4dCA9IGlxOworCisJLyoKKwkgKiBGaXggdXAgdGhlIGhlYWQgcG9pbnRlciBpZiBpdCBwb2ludHMgdG8gdGhlIGlub2RlIGJlaW5nIGRlbGV0ZWQuCisJICovCisJaWYgKG1wLT5tX2lub2RlcyA9PSBpcCkgeworCQlpZiAoaXAgPT0gaXEpIHsKKwkJCW1wLT5tX2lub2RlcyA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQltcC0+bV9pbm9kZXMgPSBpcTsKKwkJfQorCX0KKworCS8qIERlYWwgd2l0aCB0aGUgZGVsZXRlZCBpbm9kZXMgbGlzdCAqLworCWxpc3RfZGVsX2luaXQoJmlwLT5pX3JlY2xhaW0pOworCisJbXAtPm1faXJlY2xhaW1zKys7CisJWEZTX01PVU5UX0lVTkxPQ0sobXApOworfQorCisvKgorICogVGhpcyBpcyBhIHdyYXBwZXIgcm91dGluZSBhcm91bmQgdGhlIHhmc19pbG9jaygpIHJvdXRpbmUKKyAqIHVzZWQgdG8gY2VudHJhbGl6ZSBzb21lIGdydW5neSBjb2RlLiAgSXQgaXMgdXNlZCBpbiBwbGFjZXMKKyAqIHRoYXQgd2lzaCB0byBsb2NrIHRoZSBpbm9kZSBzb2xlbHkgZm9yIHJlYWRpbmcgdGhlIGV4dGVudHMuCisgKiBUaGUgcmVhc29uIHRoZXNlIHBsYWNlcyBjYW4ndCBqdXN0IGNhbGwgeGZzX2lsb2NrKFNIQVJFRCkKKyAqIGlzIHRoYXQgdGhlIGlub2RlIGxvY2sgYWxzbyBndWFyZHMgdG8gYnJpbmdpbmcgaW4gb2YgdGhlCisgKiBleHRlbnRzIGZyb20gZGlzayBmb3IgYSBmaWxlIGluIGItdHJlZSBmb3JtYXQuICBJZiB0aGUgaW5vZGUKKyAqIGlzIGluIGItdHJlZSBmb3JtYXQsIHRoZW4gd2UgbmVlZCB0byBsb2NrIHRoZSBpbm9kZSBleGNsdXNpdmVseQorICogdW50aWwgdGhlIGV4dGVudHMgYXJlIHJlYWQgaW4uICBMb2NraW5nIGl0IGV4Y2x1c2l2ZWx5IGFsbAorICogdGhlIHRpbWUgd291bGQgbGltaXQgb3VyIHBhcmFsbGVsaXNtIHVubmVjZXNzYXJpbHksIHRob3VnaC4KKyAqIFdoYXQgd2UgZG8gaW5zdGVhZCBpcyBjaGVjayB0byBzZWUgaWYgdGhlIGV4dGVudHMgaGF2ZSBiZWVuCisgKiByZWFkIGluIHlldCwgYW5kIG9ubHkgbG9jayB0aGUgaW5vZGUgZXhjbHVzaXZlbHkgaWYgdGhleQorICogaGF2ZSBub3QuCisgKgorICogVGhlIGZ1bmN0aW9uIHJldHVybnMgYSB2YWx1ZSB3aGljaCBzaG91bGQgYmUgZ2l2ZW4gdG8gdGhlCisgKiBjb3JyZXNwb25kaW5nIHhmc19pdW5sb2NrX21hcF9zaGFyZWQoKS4gIFRoaXMgdmFsdWUgaXMKKyAqIHRoZSBtb2RlIGluIHdoaWNoIHRoZSBsb2NrIHdhcyBhY3R1YWxseSB0YWtlbi4KKyAqLwordWludAoreGZzX2lsb2NrX21hcF9zaGFyZWQoCisJeGZzX2lub2RlX3QJKmlwKQoreworCXVpbnQJbG9ja19tb2RlOworCisJaWYgKChpcC0+aV9kLmRpX2Zvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9CVFJFRSkgJiYKKwkgICAgKChpcC0+aV9kZi5pZl9mbGFncyAmIFhGU19JRkVYVEVOVFMpID09IDApKSB7CisJCWxvY2tfbW9kZSA9IFhGU19JTE9DS19FWENMOworCX0gZWxzZSB7CisJCWxvY2tfbW9kZSA9IFhGU19JTE9DS19TSEFSRUQ7CisJfQorCisJeGZzX2lsb2NrKGlwLCBsb2NrX21vZGUpOworCisJcmV0dXJuIGxvY2tfbW9kZTsKK30KKworLyoKKyAqIFRoaXMgaXMgc2ltcGx5IHRoZSB1bmxvY2sgcm91dGluZSB0byBnbyB3aXRoIHhmc19pbG9ja19tYXBfc2hhcmVkKCkuCisgKiBBbGwgaXQgZG9lcyBpcyBjYWxsIHhmc19pdW5sb2NrKCkgd2l0aCB0aGUgZ2l2ZW4gbG9ja19tb2RlLgorICovCit2b2lkCit4ZnNfaXVubG9ja19tYXBfc2hhcmVkKAorCXhmc19pbm9kZV90CSppcCwKKwl1bnNpZ25lZCBpbnQJbG9ja19tb2RlKQoreworCXhmc19pdW5sb2NrKGlwLCBsb2NrX21vZGUpOworfQorCisvKgorICogVGhlIHhmcyBpbm9kZSBjb250YWlucyAyIGxvY2tzOiBhIG11bHRpLXJlYWRlciBsb2NrIGNhbGxlZCB0aGUKKyAqIGlfaW9sb2NrIGFuZCBhIG11bHRpLXJlYWRlciBsb2NrIGNhbGxlZCB0aGUgaV9sb2NrLiAgVGhpcyByb3V0aW5lCisgKiBhbGxvd3MgZWl0aGVyIG9yIGJvdGggb2YgdGhlIGxvY2tzIHRvIGJlIG9idGFpbmVkLgorICoKKyAqIFRoZSAyIGxvY2tzIHNob3VsZCBhbHdheXMgYmUgb3JkZXJlZCBzbyB0aGF0IHRoZSBJTyBsb2NrIGlzCisgKiBvYnRhaW5lZCBmaXJzdCBpbiBvcmRlciB0byBwcmV2ZW50IGRlYWRsb2NrLgorICoKKyAqIGlwIC0tIHRoZSBpbm9kZSBiZWluZyBsb2NrZWQKKyAqIGxvY2tfZmxhZ3MgLS0gdGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSBpbm9kZSdzIGxvY2tzCisgKiAgICAgICB0byBiZSBsb2NrZWQuICBJdCBjYW4gYmU6CisgKgkJWEZTX0lPTE9DS19TSEFSRUQsCisgKgkJWEZTX0lPTE9DS19FWENMLAorICoJCVhGU19JTE9DS19TSEFSRUQsCisgKgkJWEZTX0lMT0NLX0VYQ0wsCisgKgkJWEZTX0lPTE9DS19TSEFSRUQgfCBYRlNfSUxPQ0tfU0hBUkVELAorICoJCVhGU19JT0xPQ0tfU0hBUkVEIHwgWEZTX0lMT0NLX0VYQ0wsCisgKgkJWEZTX0lPTE9DS19FWENMIHwgWEZTX0lMT0NLX1NIQVJFRCwKKyAqCQlYRlNfSU9MT0NLX0VYQ0wgfCBYRlNfSUxPQ0tfRVhDTAorICovCit2b2lkCit4ZnNfaWxvY2soeGZzX2lub2RlX3QJKmlwLAorCSAgdWludAkJbG9ja19mbGFncykKK3sKKwkvKgorCSAqIFlvdSBjYW4ndCBzZXQgYm90aCBTSEFSRUQgYW5kIEVYQ0wgZm9yIHRoZSBzYW1lIGxvY2ssCisJICogYW5kIG9ubHkgWEZTX0lPTE9DS19TSEFSRUQsIFhGU19JT0xPQ0tfRVhDTCwgWEZTX0lMT0NLX1NIQVJFRCwKKwkgKiBhbmQgWEZTX0lMT0NLX0VYQ0wgYXJlIHZhbGlkIHZhbHVlcyB0byBzZXQgaW4gbG9ja19mbGFncy4KKwkgKi8KKwlBU1NFUlQoKGxvY2tfZmxhZ3MgJiAoWEZTX0lPTE9DS19TSEFSRUQgfCBYRlNfSU9MT0NLX0VYQ0wpKSAhPQorCSAgICAgICAoWEZTX0lPTE9DS19TSEFSRUQgfCBYRlNfSU9MT0NLX0VYQ0wpKTsKKwlBU1NFUlQoKGxvY2tfZmxhZ3MgJiAoWEZTX0lMT0NLX1NIQVJFRCB8IFhGU19JTE9DS19FWENMKSkgIT0KKwkgICAgICAgKFhGU19JTE9DS19TSEFSRUQgfCBYRlNfSUxPQ0tfRVhDTCkpOworCUFTU0VSVCgobG9ja19mbGFncyAmIH5YRlNfTE9DS19NQVNLKSA9PSAwKTsKKworCWlmIChsb2NrX2ZsYWdzICYgWEZTX0lPTE9DS19FWENMKSB7CisJCW1ydXBkYXRlKCZpcC0+aV9pb2xvY2spOworCX0gZWxzZSBpZiAobG9ja19mbGFncyAmIFhGU19JT0xPQ0tfU0hBUkVEKSB7CisJCW1yYWNjZXNzKCZpcC0+aV9pb2xvY2spOworCX0KKwlpZiAobG9ja19mbGFncyAmIFhGU19JTE9DS19FWENMKSB7CisJCW1ydXBkYXRlKCZpcC0+aV9sb2NrKTsKKwl9IGVsc2UgaWYgKGxvY2tfZmxhZ3MgJiBYRlNfSUxPQ0tfU0hBUkVEKSB7CisJCW1yYWNjZXNzKCZpcC0+aV9sb2NrKTsKKwl9CisJeGZzX2lsb2NrX3RyYWNlKGlwLCAxLCBsb2NrX2ZsYWdzLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7Cit9CisKKy8qCisgKiBUaGlzIGlzIGp1c3QgbGlrZSB4ZnNfaWxvY2soKSwgZXhjZXB0IHRoYXQgdGhlIGNhbGxlcgorICogaXMgZ3VhcmFudGVlZCBub3QgdG8gc2xlZXAuICBJdCByZXR1cm5zIDEgaWYgaXQgZ2V0cworICogdGhlIHJlcXVlc3RlZCBsb2NrcyBhbmQgMCBvdGhlcndpc2UuICBJZiB0aGUgSU8gbG9jayBpcworICogb2J0YWluZWQgYnV0IHRoZSBpbm9kZSBsb2NrIGNhbm5vdCBiZSwgdGhlbiB0aGUgSU8gbG9jaworICogaXMgZHJvcHBlZCBiZWZvcmUgcmV0dXJuaW5nLgorICoKKyAqIGlwIC0tIHRoZSBpbm9kZSBiZWluZyBsb2NrZWQKKyAqIGxvY2tfZmxhZ3MgLS0gdGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSBpbm9kZSdzIGxvY2tzIHRvIGJlCisgKiAgICAgICB0byBiZSBsb2NrZWQuICBTZWUgdGhlIGNvbW1lbnQgZm9yIHhmc19pbG9jaygpIGZvciBhIGxpc3QKKyAqCSBvZiB2YWxpZCB2YWx1ZXMuCisgKgorICovCitpbnQKK3hmc19pbG9ja19ub3dhaXQoeGZzX2lub2RlX3QJKmlwLAorCQkgdWludAkJbG9ja19mbGFncykKK3sKKwlpbnQJaW9sb2NrZWQ7CisJaW50CWlsb2NrZWQ7CisKKwkvKgorCSAqIFlvdSBjYW4ndCBzZXQgYm90aCBTSEFSRUQgYW5kIEVYQ0wgZm9yIHRoZSBzYW1lIGxvY2ssCisJICogYW5kIG9ubHkgWEZTX0lPTE9DS19TSEFSRUQsIFhGU19JT0xPQ0tfRVhDTCwgWEZTX0lMT0NLX1NIQVJFRCwKKwkgKiBhbmQgWEZTX0lMT0NLX0VYQ0wgYXJlIHZhbGlkIHZhbHVlcyB0byBzZXQgaW4gbG9ja19mbGFncy4KKwkgKi8KKwlBU1NFUlQoKGxvY2tfZmxhZ3MgJiAoWEZTX0lPTE9DS19TSEFSRUQgfCBYRlNfSU9MT0NLX0VYQ0wpKSAhPQorCSAgICAgICAoWEZTX0lPTE9DS19TSEFSRUQgfCBYRlNfSU9MT0NLX0VYQ0wpKTsKKwlBU1NFUlQoKGxvY2tfZmxhZ3MgJiAoWEZTX0lMT0NLX1NIQVJFRCB8IFhGU19JTE9DS19FWENMKSkgIT0KKwkgICAgICAgKFhGU19JTE9DS19TSEFSRUQgfCBYRlNfSUxPQ0tfRVhDTCkpOworCUFTU0VSVCgobG9ja19mbGFncyAmIH5YRlNfTE9DS19NQVNLKSA9PSAwKTsKKworCWlvbG9ja2VkID0gMDsKKwlpZiAobG9ja19mbGFncyAmIFhGU19JT0xPQ0tfRVhDTCkgeworCQlpb2xvY2tlZCA9IG1ydHJ5dXBkYXRlKCZpcC0+aV9pb2xvY2spOworCQlpZiAoIWlvbG9ja2VkKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZSBpZiAobG9ja19mbGFncyAmIFhGU19JT0xPQ0tfU0hBUkVEKSB7CisJCWlvbG9ja2VkID0gbXJ0cnlhY2Nlc3MoJmlwLT5pX2lvbG9jayk7CisJCWlmICghaW9sb2NrZWQpIHsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWlmIChsb2NrX2ZsYWdzICYgWEZTX0lMT0NLX0VYQ0wpIHsKKwkJaWxvY2tlZCA9IG1ydHJ5dXBkYXRlKCZpcC0+aV9sb2NrKTsKKwkJaWYgKCFpbG9ja2VkKSB7CisJCQlpZiAoaW9sb2NrZWQpIHsKKwkJCQltcnVubG9jaygmaXAtPmlfaW9sb2NrKTsKKwkJCX0KKwkJCXJldHVybiAwOworCQl9CisJfSBlbHNlIGlmIChsb2NrX2ZsYWdzICYgWEZTX0lMT0NLX1NIQVJFRCkgeworCQlpbG9ja2VkID0gbXJ0cnlhY2Nlc3MoJmlwLT5pX2xvY2spOworCQlpZiAoIWlsb2NrZWQpIHsKKwkJCWlmIChpb2xvY2tlZCkgeworCQkJCW1ydW5sb2NrKCZpcC0+aV9pb2xvY2spOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJeGZzX2lsb2NrX3RyYWNlKGlwLCAyLCBsb2NrX2ZsYWdzLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiB4ZnNfaXVubG9jaygpIGlzIHVzZWQgdG8gZHJvcCB0aGUgaW5vZGUgbG9ja3MgYWNxdWlyZWQgd2l0aAorICogeGZzX2lsb2NrKCkgYW5kIHhmc19pbG9ja19ub3dhaXQoKS4gIFRoZSBjYWxsZXIgbXVzdCBwYXNzCisgKiBpbiB0aGUgZmxhZ3MgZ2l2ZW4gdG8geGZzX2lsb2NrKCkgb3IgeGZzX2lsb2NrX25vd2FpdCgpIHNvCisgKiB0aGF0IHdlIGtub3cgd2hpY2ggbG9ja3MgdG8gZHJvcC4KKyAqCisgKiBpcCAtLSB0aGUgaW5vZGUgYmVpbmcgdW5sb2NrZWQKKyAqIGxvY2tfZmxhZ3MgLS0gdGhpcyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSBpbm9kZSdzIGxvY2tzIHRvIGJlCisgKiAgICAgICB0byBiZSB1bmxvY2tlZC4gIFNlZSB0aGUgY29tbWVudCBmb3IgeGZzX2lsb2NrKCkgZm9yIGEgbGlzdAorICoJIG9mIHZhbGlkIHZhbHVlcyBmb3IgdGhpcyBwYXJhbWV0ZXIuCisgKgorICovCit2b2lkCit4ZnNfaXVubG9jayh4ZnNfaW5vZGVfdAkqaXAsCisJICAgIHVpbnQJbG9ja19mbGFncykKK3sKKwkvKgorCSAqIFlvdSBjYW4ndCBzZXQgYm90aCBTSEFSRUQgYW5kIEVYQ0wgZm9yIHRoZSBzYW1lIGxvY2ssCisJICogYW5kIG9ubHkgWEZTX0lPTE9DS19TSEFSRUQsIFhGU19JT0xPQ0tfRVhDTCwgWEZTX0lMT0NLX1NIQVJFRCwKKwkgKiBhbmQgWEZTX0lMT0NLX0VYQ0wgYXJlIHZhbGlkIHZhbHVlcyB0byBzZXQgaW4gbG9ja19mbGFncy4KKwkgKi8KKwlBU1NFUlQoKGxvY2tfZmxhZ3MgJiAoWEZTX0lPTE9DS19TSEFSRUQgfCBYRlNfSU9MT0NLX0VYQ0wpKSAhPQorCSAgICAgICAoWEZTX0lPTE9DS19TSEFSRUQgfCBYRlNfSU9MT0NLX0VYQ0wpKTsKKwlBU1NFUlQoKGxvY2tfZmxhZ3MgJiAoWEZTX0lMT0NLX1NIQVJFRCB8IFhGU19JTE9DS19FWENMKSkgIT0KKwkgICAgICAgKFhGU19JTE9DS19TSEFSRUQgfCBYRlNfSUxPQ0tfRVhDTCkpOworCUFTU0VSVCgobG9ja19mbGFncyAmIH4oWEZTX0xPQ0tfTUFTSyB8IFhGU19JVU5MT0NLX05PTk9USUZZKSkgPT0gMCk7CisJQVNTRVJUKGxvY2tfZmxhZ3MgIT0gMCk7CisKKwlpZiAobG9ja19mbGFncyAmIChYRlNfSU9MT0NLX1NIQVJFRCB8IFhGU19JT0xPQ0tfRVhDTCkpIHsKKwkJQVNTRVJUKCEobG9ja19mbGFncyAmIFhGU19JT0xPQ0tfU0hBUkVEKSB8fAorCQkgICAgICAgKGlzbXJsb2NrZWQoJmlwLT5pX2lvbG9jaywgTVJfQUNDRVNTKSkpOworCQlBU1NFUlQoIShsb2NrX2ZsYWdzICYgWEZTX0lPTE9DS19FWENMKSB8fAorCQkgICAgICAgKGlzbXJsb2NrZWQoJmlwLT5pX2lvbG9jaywgTVJfVVBEQVRFKSkpOworCQltcnVubG9jaygmaXAtPmlfaW9sb2NrKTsKKwl9CisKKwlpZiAobG9ja19mbGFncyAmIChYRlNfSUxPQ0tfU0hBUkVEIHwgWEZTX0lMT0NLX0VYQ0wpKSB7CisJCUFTU0VSVCghKGxvY2tfZmxhZ3MgJiBYRlNfSUxPQ0tfU0hBUkVEKSB8fAorCQkgICAgICAgKGlzbXJsb2NrZWQoJmlwLT5pX2xvY2ssIE1SX0FDQ0VTUykpKTsKKwkJQVNTRVJUKCEobG9ja19mbGFncyAmIFhGU19JTE9DS19FWENMKSB8fAorCQkgICAgICAgKGlzbXJsb2NrZWQoJmlwLT5pX2xvY2ssIE1SX1VQREFURSkpKTsKKwkJbXJ1bmxvY2soJmlwLT5pX2xvY2spOworCisJCS8qCisJCSAqIExldCB0aGUgQUlMIGtub3cgdGhhdCB0aGlzIGl0ZW0gaGFzIGJlZW4gdW5sb2NrZWQgaW4gY2FzZQorCQkgKiBpdCBpcyBpbiB0aGUgQUlMIGFuZCBhbnlvbmUgaXMgd2FpdGluZyBvbiBpdC4gIERvbid0IGRvCisJCSAqIHRoaXMgaWYgdGhlIGNhbGxlciBoYXMgYXNrZWQgdXMgbm90IHRvLgorCQkgKi8KKwkJaWYgKCEobG9ja19mbGFncyAmIFhGU19JVU5MT0NLX05PTk9USUZZKSAmJgorCQkgICAgIGlwLT5pX2l0ZW1wICE9IE5VTEwpIHsKKwkJCXhmc190cmFuc191bmxvY2tlZF9pdGVtKGlwLT5pX21vdW50LAorCQkJCQkJKHhmc19sb2dfaXRlbV90KikoaXAtPmlfaXRlbXApKTsKKwkJfQorCX0KKwl4ZnNfaWxvY2tfdHJhY2UoaXAsIDMsIGxvY2tfZmxhZ3MsIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKK30KKworLyoKKyAqIGdpdmUgdXAgd3JpdGUgbG9ja3MuICB0aGUgaS9vIGxvY2sgY2Fubm90IGJlIGhlbGQgbmVzdGVkCisgKiBpZiBpdCBpcyBiZWluZyBkZW1vdGVkLgorICovCit2b2lkCit4ZnNfaWxvY2tfZGVtb3RlKHhmc19pbm9kZV90CSppcCwKKwkJIHVpbnQJCWxvY2tfZmxhZ3MpCit7CisJQVNTRVJUKGxvY2tfZmxhZ3MgJiAoWEZTX0lPTE9DS19FWENMfFhGU19JTE9DS19FWENMKSk7CisJQVNTRVJUKChsb2NrX2ZsYWdzICYgfihYRlNfSU9MT0NLX0VYQ0x8WEZTX0lMT0NLX0VYQ0wpKSA9PSAwKTsKKworCWlmIChsb2NrX2ZsYWdzICYgWEZTX0lMT0NLX0VYQ0wpIHsKKwkJQVNTRVJUKGlzbXJsb2NrZWQoJmlwLT5pX2xvY2ssIE1SX1VQREFURSkpOworCQltcmRlbW90ZSgmaXAtPmlfbG9jayk7CisJfQorCWlmIChsb2NrX2ZsYWdzICYgWEZTX0lPTE9DS19FWENMKSB7CisJCUFTU0VSVChpc21ybG9ja2VkKCZpcC0+aV9pb2xvY2ssIE1SX1VQREFURSkpOworCQltcmRlbW90ZSgmaXAtPmlfaW9sb2NrKTsKKwl9Cit9CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIHRocmVlIHJvdXRpbmVzIHNpbXBseSBtYW5hZ2UgdGhlIGlfZmxvY2sKKyAqIHNlbWFwaG9yZSBlbWJlZGRlZCBpbiB0aGUgaW5vZGUuICBUaGlzIHNlbWFwaG9yZSBzeW5jaHJvbml6ZXMKKyAqIHByb2Nlc3NlcyBhdHRlbXB0aW5nIHRvIGZsdXNoIHRoZSBpbi1jb3JlIGlub2RlIGJhY2sgdG8gZGlzay4KKyAqLwordm9pZAoreGZzX2lmbG9jayh4ZnNfaW5vZGVfdCAqaXApCit7CisJcHNlbWEoJihpcC0+aV9mbG9jayksIFBJTk9EfFBMVFdBSVQpOworfQorCitpbnQKK3hmc19pZmxvY2tfbm93YWl0KHhmc19pbm9kZV90ICppcCkKK3sKKwlyZXR1cm4gKGNwc2VtYSgmKGlwLT5pX2Zsb2NrKSkpOworfQorCit2b2lkCit4ZnNfaWZ1bmxvY2soeGZzX2lub2RlX3QgKmlwKQoreworCUFTU0VSVCh2YWx1c2VtYSgmKGlwLT5pX2Zsb2NrKSkgPD0gMCk7CisJdnNlbWEoJihpcC0+aV9mbG9jaykpOworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pbWFwLmggYi9mcy94ZnMveGZzX2ltYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzg1MDY0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19pbWFwLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX0lNQVBfSF9fCisjZGVmaW5lCV9fWEZTX0lNQVBfSF9fCisKKy8qCisgKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgcGFzc2VkIHRvIHhmc19pbWFwKCkgdG8gbWFwCisgKiBhbiBpbm9kZSBudW1iZXIgdG8gaXRzIG9uIGRpc2sgbG9jYXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19pbWFwIHsKKwl4ZnNfZGFkZHJfdAlpbV9ibGtubzsJLyogc3RhcnRpbmcgQkIgb2YgaW5vZGUgY2h1bmsgKi8KKwl1aW50CQlpbV9sZW47CQkvKiBsZW5ndGggaW4gQkJzIG9mIGlub2RlIGNodW5rICovCisJeGZzX2FnYmxvY2tfdAlpbV9hZ2Jsa25vOwkvKiBsb2dpY2FsIGJsb2NrIG9mIGlub2RlIGNodW5rIGluIGFnICovCisJdXNob3J0CQlpbV9pb2Zmc2V0OwkvKiBpbm9kZSBvZmZzZXQgaW4gYmxvY2sgaW4gImlub2RlcyIgKi8KKwl1c2hvcnQJCWltX2JvZmZzZXQ7CS8qIGlub2RlIG9mZnNldCBpbiBibG9jayBpbiBieXRlcyAqLworfSB4ZnNfaW1hcF90OworCisjaWZkZWYgX19LRVJORUxfXworc3RydWN0IHhmc19tb3VudDsKK3N0cnVjdCB4ZnNfdHJhbnM7CitpbnQJeGZzX2ltYXAoc3RydWN0IHhmc19tb3VudCAqLCBzdHJ1Y3QgeGZzX3RyYW5zICosIHhmc19pbm9fdCwKKwkJIHhmc19pbWFwX3QgKiwgdWludCk7CisjZW5kaWYKKworI2VuZGlmCS8qIF9fWEZTX0lNQVBfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lub2RlLmMgYi9mcy94ZnMveGZzX2lub2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNjNjMyYQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfaW5vZGUuYwpAQCAtMCwwICsxLDM4NzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKyNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zX3ByaXYuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaW1hcC5oIgorI2luY2x1ZGUgInhmc19hbGxvYy5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19ibWFwLmgiCisjaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCisjaW5jbHVkZSAieGZzX3J3LmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgorI2luY2x1ZGUgInhmc191dGlscy5oIgorI2luY2x1ZGUgInhmc19kaXIyX3RyYWNlLmgiCisjaW5jbHVkZSAieGZzX3F1b3RhLmgiCisjaW5jbHVkZSAieGZzX21hYy5oIgorI2luY2x1ZGUgInhmc19hY2wuaCIKKworCitrbWVtX3pvbmVfdCAqeGZzX2lmb3JrX3pvbmU7CitrbWVtX3pvbmVfdCAqeGZzX2lub2RlX3pvbmU7CitrbWVtX3pvbmVfdCAqeGZzX2NoYXNobGlzdF96b25lOworCisvKgorICogVXNlZCBpbiB4ZnNfaXRydW5jYXRlKCkuICBUaGlzIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBleHRlbnRzCisgKiBmcmVlZCBmcm9tIGEgZmlsZSBpbiBhIHNpbmdsZSB0cmFuc2FjdGlvbi4KKyAqLworI2RlZmluZQlYRlNfSVRSVU5DX01BWF9FWFRFTlRTCTIKKworU1RBVElDIGludCB4ZnNfaWZsdXNoX2ludCh4ZnNfaW5vZGVfdCAqLCB4ZnNfYnVmX3QgKik7CitTVEFUSUMgaW50IHhmc19pZm9ybWF0X2xvY2FsKHhmc19pbm9kZV90ICosIHhmc19kaW5vZGVfdCAqLCBpbnQsIGludCk7CitTVEFUSUMgaW50IHhmc19pZm9ybWF0X2V4dGVudHMoeGZzX2lub2RlX3QgKiwgeGZzX2Rpbm9kZV90ICosIGludCk7CitTVEFUSUMgaW50IHhmc19pZm9ybWF0X2J0cmVlKHhmc19pbm9kZV90ICosIHhmc19kaW5vZGVfdCAqLCBpbnQpOworCisKKyNpZmRlZiBERUJVRworLyoKKyAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBleHRlbnRzIGluIHRoZSBnaXZlbiBtZW1vcnkgYnVmZmVyCisgKiBhcmUgdmFsaWQuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfdmFsaWRhdGVfZXh0ZW50cygKKwl4ZnNfYm1idF9yZWNfdAkJKmVwLAorCWludAkJCW5yZWNzLAorCWludAkJCWRpc2ssCisJeGZzX2V4bnRmbXRfdAkJZm10KQoreworCXhmc19ibWJ0X2lyZWNfdAkJaXJlYzsKKwl4ZnNfYm1idF9yZWNfdAkJcmVjOworCWludAkJCWk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJlY3M7IGkrKykgeworCQlyZWMubDAgPSBnZXRfdW5hbGlnbmVkKChfX3VpbnQ2NF90KikmZXAtPmwwKTsKKwkJcmVjLmwxID0gZ2V0X3VuYWxpZ25lZCgoX191aW50NjRfdCopJmVwLT5sMSk7CisJCWlmIChkaXNrKQorCQkJeGZzX2JtYnRfZGlza19nZXRfYWxsKCZyZWMsICZpcmVjKTsKKwkJZWxzZQorCQkJeGZzX2JtYnRfZ2V0X2FsbCgmcmVjLCAmaXJlYyk7CisJCWlmIChmbXQgPT0gWEZTX0VYVEZNVF9OT1NUQVRFKQorCQkJQVNTRVJUKGlyZWMuYnJfc3RhdGUgPT0gWEZTX0VYVF9OT1JNKTsKKwkJZXArKzsKKwl9Cit9CisjZWxzZSAvKiBERUJVRyAqLworI2RlZmluZSB4ZnNfdmFsaWRhdGVfZXh0ZW50cyhlcCwgbnJlY3MsIGRpc2ssIGZtdCkKKyNlbmRpZiAvKiBERUJVRyAqLworCisvKgorICogQ2hlY2sgdGhhdCBub25lIG9mIHRoZSBpbm9kZSdzIGluIHRoZSBidWZmZXIgaGF2ZSBhIG5leHQKKyAqIHVubGlua2VkIGZpZWxkIG9mIDAuCisgKi8KKyNpZiBkZWZpbmVkKERFQlVHKQordm9pZAoreGZzX2lub2JwX2NoZWNrKAorCXhmc19tb3VudF90CSptcCwKKwl4ZnNfYnVmX3QJKmJwKQoreworCWludAkJaTsKKwlpbnQJCWo7CisJeGZzX2Rpbm9kZV90CSpkaXA7CisKKwlqID0gbXAtPm1faW5vZGVfY2x1c3Rlcl9zaXplID4+IG1wLT5tX3NiLnNiX2lub2RlbG9nOworCisJZm9yIChpID0gMDsgaSA8IGo7IGkrKykgeworCQlkaXAgPSAoeGZzX2Rpbm9kZV90ICopeGZzX2J1Zl9vZmZzZXQoYnAsCisJCQkJCWkgKiBtcC0+bV9zYi5zYl9pbm9kZXNpemUpOworCQlpZiAoIWRpcC0+ZGlfbmV4dF91bmxpbmtlZCkgIHsKKwkJCXhmc19mc19jbW5fZXJyKENFX0FMRVJULCBtcCwKKwkJCQkiRGV0ZWN0ZWQgYSBib2d1cyB6ZXJvIG5leHRfdW5saW5rZWQgZmllbGQgaW4gaW5jb3JlIGlub2RlIGJ1ZmZlciAweCVwLiAgQWJvdXQgdG8gcG9wIGFuIEFTU0VSVC4iLAorCQkJCWJwKTsKKwkJCUFTU0VSVChkaXAtPmRpX25leHRfdW5saW5rZWQpOworCQl9CisJfQorfQorI2VuZGlmCisKKy8qCisgKiBjYWxsZWQgZnJvbSBid3JpdGUgb24geGZzIGlub2RlIGJ1ZmZlcnMKKyAqLwordm9pZAoreGZzX2lub2JwX2J3Y2hlY2soeGZzX2J1Zl90ICpicCkKK3sKKwl4ZnNfbW91bnRfdAkqbXA7CisJaW50CQlpOworCWludAkJajsKKwl4ZnNfZGlub2RlX3QJKmRpcDsKKworCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURTMoYnAsIHZvaWQgKikgIT0gTlVMTCk7CisKKwltcCA9IFhGU19CVUZfRlNQUklWQVRFMyhicCwgeGZzX21vdW50X3QgKik7CisKKworCWogPSBtcC0+bV9pbm9kZV9jbHVzdGVyX3NpemUgPj4gbXAtPm1fc2Iuc2JfaW5vZGVsb2c7CisKKwlmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSAgeworCQlkaXAgPSAoeGZzX2Rpbm9kZV90ICopIHhmc19idWZfb2Zmc2V0KGJwLAorCQkJCQkJaSAqIG1wLT5tX3NiLnNiX2lub2Rlc2l6ZSk7CisJCWlmIChJTlRfR0VUKGRpcC0+ZGlfY29yZS5kaV9tYWdpYywgQVJDSF9DT05WRVJUKSAhPSBYRlNfRElOT0RFX01BR0lDKSB7CisJCQljbW5fZXJyKENFX1dBUk4sCisiQmFkIG1hZ2ljICMgMHgleCBpbiBYRlMgaW5vZGUgYnVmZmVyIDB4JUx4LCBzdGFydGluZyBibG9ja25vICVMZCwgb2Zmc2V0IDB4JXgiLAorCQkJCUlOVF9HRVQoZGlwLT5kaV9jb3JlLmRpX21hZ2ljLCBBUkNIX0NPTlZFUlQpLAorCQkJCShfX3VpbnQ2NF90KShfX3BzdW5zaWduZWRfdCkgYnAsCisJCQkJKF9faW50NjRfdCkgWEZTX0JVRl9BRERSKGJwKSwKKwkJCQl4ZnNfYnVmX29mZnNldChicCwgaSAqIG1wLT5tX3NiLnNiX2lub2Rlc2l6ZSkpOworCQkJeGZzX2ZzX2Ntbl9lcnIoQ0VfV0FSTiwgbXAsCisJCQkJImNvcnJ1cHQsIHVubW91bnQgYW5kIHJ1biB4ZnNfcmVwYWlyIik7CisJCX0KKwkJaWYgKCFkaXAtPmRpX25leHRfdW5saW5rZWQpICB7CisJCQljbW5fZXJyKENFX1dBUk4sCisiQmFkIG5leHRfdW5saW5rZWQgZmllbGQgKDApIGluIFhGUyBpbm9kZSBidWZmZXIgMHglcCwgc3RhcnRpbmcgYmxvY2tubyAlTGQsIG9mZnNldCAweCV4IiwKKwkJCQkoX191aW50NjRfdCkoX19wc3Vuc2lnbmVkX3QpIGJwLAorCQkJCShfX2ludDY0X3QpIFhGU19CVUZfQUREUihicCksCisJCQkJeGZzX2J1Zl9vZmZzZXQoYnAsIGkgKiBtcC0+bV9zYi5zYl9pbm9kZXNpemUpKTsKKwkJCXhmc19mc19jbW5fZXJyKENFX1dBUk4sIG1wLAorCQkJCSJjb3JydXB0LCB1bm1vdW50IGFuZCBydW4geGZzX3JlcGFpciIpOworCQl9CisJfQorCisJcmV0dXJuOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBtYXAgYW4gaW5vZGUgbnVtYmVyIHdpdGhpbiBhIGZpbGUKKyAqIHN5c3RlbSB0byB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIG9uLWRpc2sgdmVyc2lvbiBvZiB0aGUKKyAqIGlub2RlLiAgSXQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZQorICogb24tZGlzayBpbm9kZSBpbiB0aGUgYnBwIHBhcmFtZXRlciwgYW5kIGluIHRoZSBkaXAgcGFyYW1ldGVyCisgKiBpdCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgb24tZGlzayBpbm9kZSB3aXRoaW4gdGhhdCBidWZmZXIuCisgKgorICogSWYgYSBub24temVybyBlcnJvciBpcyByZXR1cm5lZCwgdGhlbiB0aGUgY29udGVudHMgb2YgYnBwIGFuZAorICogZGlwcCBhcmUgdW5kZWZpbmVkLgorICoKKyAqIFVzZSB4ZnNfaW1hcCgpIHRvIGRldGVybWluZSB0aGUgc2l6ZSBhbmQgbG9jYXRpb24gb2YgdGhlCisgKiBidWZmZXIgdG8gcmVhZCBmcm9tIGRpc2suCisgKi8KK2ludAoreGZzX2lub3RvYnAoCisJeGZzX21vdW50X3QJKm1wLAorCXhmc190cmFuc190CSp0cCwKKwl4ZnNfaW5vX3QJaW5vLAorCXhmc19kaW5vZGVfdAkqKmRpcHAsCisJeGZzX2J1Zl90CSoqYnBwLAorCWludAkJKm9mZnNldCkKK3sKKwlpbnQJCWRpX29rOworCXhmc19pbWFwX3QJaW1hcDsKKwl4ZnNfYnVmX3QJKmJwOworCWludAkJZXJyb3I7CisJeGZzX2Rpbm9kZV90CSpkaXA7CisKKwkvKgorCSAqIENhbGwgdGhlIHNwYWNlIG1hbmFnbWVudCBjb2RlIHRvIGZpbmQgdGhlIGxvY2F0aW9uIG9mIHRoZQorCSAqIGlub2RlIG9uIGRpc2suCisJICovCisJaW1hcC5pbV9ibGtubyA9IDA7CisJZXJyb3IgPSB4ZnNfaW1hcChtcCwgdHAsIGlubywgJmltYXAsIFhGU19JTUFQX0xPT0tVUCk7CisJaWYgKGVycm9yICE9IDApIHsKKwkJY21uX2VycihDRV9XQVJOLAorCSJ4ZnNfaW5vdG9icDogeGZzX2ltYXAoKSAgcmV0dXJuZWQgYW4gIgorCSJlcnJvciAlZCBvbiAlcy4gIFJldHVybmluZyBlcnJvci4iLCBlcnJvciwgbXAtPm1fZnNuYW1lKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCS8qCisJICogSWYgdGhlIGlub2RlIG51bWJlciBtYXBzIHRvIGEgYmxvY2sgb3V0c2lkZSB0aGUgYm91bmRzIG9mIHRoZQorCSAqIGZpbGUgc3lzdGVtIHRoZW4gcmV0dXJuIE5VTEwgcmF0aGVyIHRoYW4gY2FsbGluZyByZWFkX2J1ZgorCSAqIGFuZCBwYW5pY2luZyB3aGVuIHdlIGdldCBhbiBlcnJvciBmcm9tIHRoZSBkcml2ZXIuCisJICovCisJaWYgKChpbWFwLmltX2Jsa25vICsgaW1hcC5pbV9sZW4pID4KKwkgICAgWEZTX0ZTQl9UT19CQihtcCwgbXAtPm1fc2Iuc2JfZGJsb2NrcykpIHsKKwkJY21uX2VycihDRV9XQVJOLAorCSJ4ZnNfaW5vdG9icDogaW5vZGUgbnVtYmVyICglZCArICVkKSBtYXBzIHRvIGEgYmxvY2sgb3V0c2lkZSB0aGUgYm91bmRzICIKKwkib2YgdGhlIGZpbGUgc3lzdGVtICVzLiAgUmV0dXJuaW5nIEVJTlZBTC4iLAorCQkJaW1hcC5pbV9ibGtubywgaW1hcC5pbV9sZW4sbXAtPm1fZnNuYW1lKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCX0KKworCS8qCisJICogUmVhZCBpbiB0aGUgYnVmZmVyLiAgSWYgdHAgaXMgTlVMTCwgeGZzX3RyYW5zX3JlYWRfYnVmKCkgd2lsbAorCSAqIGRlZmF1bHQgdG8ganVzdCBhIHJlYWRfYnVmKCkgY2FsbC4KKwkgKi8KKwllcnJvciA9IHhmc190cmFuc19yZWFkX2J1ZihtcCwgdHAsIG1wLT5tX2RkZXZfdGFyZ3AsIGltYXAuaW1fYmxrbm8sCisJCQkJICAgKGludClpbWFwLmltX2xlbiwgWEZTX0JVRl9MT0NLLCAmYnApOworCisJaWYgKGVycm9yKSB7CisJCWNtbl9lcnIoQ0VfV0FSTiwKKwkieGZzX2lub3RvYnA6IHhmc190cmFuc19yZWFkX2J1ZigpICByZXR1cm5lZCBhbiAiCisJImVycm9yICVkIG9uICVzLiAgUmV0dXJuaW5nIGVycm9yLiIsIGVycm9yLCBtcC0+bV9mc25hbWUpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCWRpcCA9ICh4ZnNfZGlub2RlX3QgKil4ZnNfYnVmX29mZnNldChicCwgMCk7CisJZGlfb2sgPQorCQlJTlRfR0VUKGRpcC0+ZGlfY29yZS5kaV9tYWdpYywgQVJDSF9DT05WRVJUKSA9PSBYRlNfRElOT0RFX01BR0lDICYmCisJCVhGU19ESU5PREVfR09PRF9WRVJTSU9OKElOVF9HRVQoZGlwLT5kaV9jb3JlLmRpX3ZlcnNpb24sIEFSQ0hfQ09OVkVSVCkpOworCWlmICh1bmxpa2VseShYRlNfVEVTVF9FUlJPUighZGlfb2ssIG1wLCBYRlNfRVJSVEFHX0lUT0JQX0lOT1RPQlAsCisJCQlYRlNfUkFORE9NX0lUT0JQX0lOT1RPQlApKSkgeworCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGZzX2lub3RvYnAiLCBYRlNfRVJSTEVWRUxfTE9XLCBtcCwgZGlwKTsKKwkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOworCQljbW5fZXJyKENFX1dBUk4sCisJInhmc19pbm90b2JwOiBYRlNfVEVTVF9FUlJPUigpICByZXR1cm5lZCBhbiAiCisJImVycm9yIG9uICVzLiAgUmV0dXJuaW5nIEVGU0NPUlJVUFRFRC4iLCAgbXAtPm1fZnNuYW1lKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCX0KKworCXhmc19pbm9icF9jaGVjayhtcCwgYnApOworCisJLyoKKwkgKiBTZXQgKmRpcHAgdG8gcG9pbnQgdG8gdGhlIG9uLWRpc2sgaW5vZGUgaW4gdGhlIGJ1ZmZlci4KKwkgKi8KKwkqZGlwcCA9ICh4ZnNfZGlub2RlX3QgKil4ZnNfYnVmX29mZnNldChicCwgaW1hcC5pbV9ib2Zmc2V0KTsKKwkqYnBwID0gYnA7CisJKm9mZnNldCA9IGltYXAuaW1fYm9mZnNldDsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBtYXAgYW4gaW5vZGUgdG8gdGhlIGJ1ZmZlciBjb250YWluaW5nCisgKiB0aGUgb24tZGlzayB2ZXJzaW9uIG9mIHRoZSBpbm9kZS4gIEl0IHJldHVybnMgYSBwb2ludGVyIHRvIHRoZQorICogYnVmZmVyIGNvbnRhaW5pbmcgdGhlIG9uLWRpc2sgaW5vZGUgaW4gdGhlIGJwcCBwYXJhbWV0ZXIsIGFuZCBpbgorICogdGhlIGRpcCBwYXJhbWV0ZXIgaXQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG9uLWRpc2sgaW5vZGUgd2l0aGluCisgKiB0aGF0IGJ1ZmZlci4KKyAqCisgKiBJZiBhIG5vbi16ZXJvIGVycm9yIGlzIHJldHVybmVkLCB0aGVuIHRoZSBjb250ZW50cyBvZiBicHAgYW5kCisgKiBkaXBwIGFyZSB1bmRlZmluZWQuCisgKgorICogSWYgdGhlIGlub2RlIGlzIG5ldyBhbmQgaGFzIG5vdCB5ZXQgYmVlbiBpbml0aWFsaXplZCwgdXNlIHhmc19pbWFwKCkKKyAqIHRvIGRldGVybWluZSB0aGUgc2l6ZSBhbmQgbG9jYXRpb24gb2YgdGhlIGJ1ZmZlciB0byByZWFkIGZyb20gZGlzay4KKyAqIElmIHRoZSBpbm9kZSBoYXMgYWxyZWFkeSBiZWVuIG1hcHBlZCB0byBpdHMgYnVmZmVyIGFuZCByZWFkIGluIG9uY2UsCisgKiB0aGVuIHVzZSB0aGUgbWFwcGluZyBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gdGhlIGlub2RlIHJhdGhlciB0aGFuCisgKiBjYWxsaW5nIHhmc19pbWFwKCkuICBUaGlzIGFsbG93cyB1cyB0byBhdm9pZCB0aGUgb3ZlcmhlYWQgb2YgbG9va2luZworICogYXQgdGhlIGlub2RlIGJ0cmVlIGZvciBzbWFsbCBibG9jayBmaWxlIHN5c3RlbXMgKHNlZSB4ZnNfZGlsb2NhdGUoKSkuCisgKiBXZSBjYW4gdGVsbCB3aGV0aGVyIHRoZSBpbm9kZSBoYXMgYmVlbiBtYXBwZWQgaW4gYmVmb3JlIGJ5IGNvbXBhcmluZworICogaXRzIGRpc2sgYmxvY2sgYWRkcmVzcyB0byAwLiAgT25seSB1bmluaXRpYWxpemVkIGlub2RlcyB3aWxsIGhhdmUKKyAqIDAgZm9yIHRoZSBkaXNrIGJsb2NrIGFkZHJlc3MuCisgKi8KK2ludAoreGZzX2l0b2JwKAorCXhmc19tb3VudF90CSptcCwKKwl4ZnNfdHJhbnNfdAkqdHAsCisJeGZzX2lub2RlX3QJKmlwLAorCXhmc19kaW5vZGVfdAkqKmRpcHAsCisJeGZzX2J1Zl90CSoqYnBwLAorCXhmc19kYWRkcl90CWJubykKK3sKKwl4ZnNfYnVmX3QJKmJwOworCWludAkJZXJyb3I7CisJeGZzX2ltYXBfdAlpbWFwOworI2lmZGVmIF9fS0VSTkVMX18KKwlpbnQJCWk7CisJaW50CQluaTsKKyNlbmRpZgorCisJaWYgKGlwLT5pX2Jsa25vID09ICh4ZnNfZGFkZHJfdCkwKSB7CisJCS8qCisJCSAqIENhbGwgdGhlIHNwYWNlIG1hbmFnZW1lbnQgY29kZSB0byBmaW5kIHRoZSBsb2NhdGlvbiBvZiB0aGUKKwkJICogaW5vZGUgb24gZGlzay4KKwkJICovCisJCWltYXAuaW1fYmxrbm8gPSBibm87CisJCWVycm9yID0geGZzX2ltYXAobXAsIHRwLCBpcC0+aV9pbm8sICZpbWFwLCBYRlNfSU1BUF9MT09LVVApOworCQlpZiAoZXJyb3IgIT0gMCkgeworCQkJcmV0dXJuIGVycm9yOworCQl9CisKKwkJLyoKKwkJICogSWYgdGhlIGlub2RlIG51bWJlciBtYXBzIHRvIGEgYmxvY2sgb3V0c2lkZSB0aGUgYm91bmRzCisJCSAqIG9mIHRoZSBmaWxlIHN5c3RlbSB0aGVuIHJldHVybiBOVUxMIHJhdGhlciB0aGFuIGNhbGxpbmcKKwkJICogcmVhZF9idWYgYW5kIHBhbmljaW5nIHdoZW4gd2UgZ2V0IGFuIGVycm9yIGZyb20gdGhlCisJCSAqIGRyaXZlci4KKwkJICovCisJCWlmICgoaW1hcC5pbV9ibGtubyArIGltYXAuaW1fbGVuKSA+CisJCSAgICBYRlNfRlNCX1RPX0JCKG1wLCBtcC0+bV9zYi5zYl9kYmxvY2tzKSkgeworI2lmZGVmIERFQlVHCisJCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbXAsICJ4ZnNfaXRvYnA6ICIKKwkJCQkJIihpbWFwLmltX2Jsa25vICgweCVsbHgpICIKKwkJCQkJIisgaW1hcC5pbV9sZW4gKDB4JWxseCkpID4gIgorCQkJCQkiIFhGU19GU0JfVE9fQkIobXAsICIKKwkJCQkJIm1wLT5tX3NiLnNiX2RibG9ja3MpICgweCVsbHgpIiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgaW1hcC5pbV9ibGtubywKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgaW1hcC5pbV9sZW4sCisJCQkJCVhGU19GU0JfVE9fQkIobXAsIG1wLT5tX3NiLnNiX2RibG9ja3MpKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCQkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCQl9CisKKwkJLyoKKwkJICogRmlsbCBpbiB0aGUgZmllbGRzIGluIHRoZSBpbm9kZSB0aGF0IHdpbGwgYmUgdXNlZCB0bworCQkgKiBtYXAgdGhlIGlub2RlIHRvIGl0cyBidWZmZXIgZnJvbSBub3cgb24uCisJCSAqLworCQlpcC0+aV9ibGtubyA9IGltYXAuaW1fYmxrbm87CisJCWlwLT5pX2xlbiA9IGltYXAuaW1fbGVuOworCQlpcC0+aV9ib2Zmc2V0ID0gaW1hcC5pbV9ib2Zmc2V0OworCX0gZWxzZSB7CisJCS8qCisJCSAqIFdlJ3ZlIGFscmVhZHkgbWFwcGVkIHRoZSBpbm9kZSBvbmNlLCBzbyBqdXN0IHVzZSB0aGUKKwkJICogbWFwcGluZyB0aGF0IHdlIHNhdmVkIHRoZSBmaXJzdCB0aW1lLgorCQkgKi8KKwkJaW1hcC5pbV9ibGtubyA9IGlwLT5pX2Jsa25vOworCQlpbWFwLmltX2xlbiA9IGlwLT5pX2xlbjsKKwkJaW1hcC5pbV9ib2Zmc2V0ID0gaXAtPmlfYm9mZnNldDsKKwl9CisJQVNTRVJUKGJubyA9PSAwIHx8IGJubyA9PSBpbWFwLmltX2Jsa25vKTsKKworCS8qCisJICogUmVhZCBpbiB0aGUgYnVmZmVyLiAgSWYgdHAgaXMgTlVMTCwgeGZzX3RyYW5zX3JlYWRfYnVmKCkgd2lsbAorCSAqIGRlZmF1bHQgdG8ganVzdCBhIHJlYWRfYnVmKCkgY2FsbC4KKwkgKi8KKwllcnJvciA9IHhmc190cmFuc19yZWFkX2J1ZihtcCwgdHAsIG1wLT5tX2RkZXZfdGFyZ3AsIGltYXAuaW1fYmxrbm8sCisJCQkJICAgKGludClpbWFwLmltX2xlbiwgWEZTX0JVRl9MT0NLLCAmYnApOworCisJaWYgKGVycm9yKSB7CisjaWZkZWYgREVCVUcKKwkJeGZzX2ZzX2Ntbl9lcnIoQ0VfQUxFUlQsIG1wLCAieGZzX2l0b2JwOiAiCisJCQkJInhmc190cmFuc19yZWFkX2J1ZigpIHJldHVybmVkIGVycm9yICVkLCAiCisJCQkJImltYXAuaW1fYmxrbm8gMHglbGx4LCBpbWFwLmltX2xlbiAweCVsbHgiLAorCQkJCWVycm9yLCAodW5zaWduZWQgbG9uZyBsb25nKSBpbWFwLmltX2Jsa25vLAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIGltYXAuaW1fbGVuKTsKKyNlbmRpZiAvKiBERUJVRyAqLworCQlyZXR1cm4gZXJyb3I7CisJfQorI2lmZGVmIF9fS0VSTkVMX18KKwkvKgorCSAqIFZhbGlkYXRlIHRoZSBtYWdpYyBudW1iZXIgYW5kIHZlcnNpb24gb2YgZXZlcnkgaW5vZGUgaW4gdGhlIGJ1ZmZlcgorCSAqIChpZiBERUJVRyBrZXJuZWwpIG9yIHRoZSBmaXJzdCBpbm9kZSBpbiB0aGUgYnVmZmVyLCBvdGhlcndpc2UuCisJICovCisjaWZkZWYgREVCVUcKKwluaSA9IEJCVE9CKGltYXAuaW1fbGVuKSA+PiBtcC0+bV9zYi5zYl9pbm9kZWxvZzsKKyNlbHNlCisJbmkgPSAxOworI2VuZGlmCisJZm9yIChpID0gMDsgaSA8IG5pOyBpKyspIHsKKwkJaW50CQlkaV9vazsKKwkJeGZzX2Rpbm9kZV90CSpkaXA7CisKKwkJZGlwID0gKHhmc19kaW5vZGVfdCAqKXhmc19idWZfb2Zmc2V0KGJwLAorCQkJCQkoaSA8PCBtcC0+bV9zYi5zYl9pbm9kZWxvZykpOworCQlkaV9vayA9IElOVF9HRVQoZGlwLT5kaV9jb3JlLmRpX21hZ2ljLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESU5PREVfTUFHSUMgJiYKKwkJCSAgICBYRlNfRElOT0RFX0dPT0RfVkVSU0lPTihJTlRfR0VUKGRpcC0+ZGlfY29yZS5kaV92ZXJzaW9uLCBBUkNIX0NPTlZFUlQpKTsKKwkJaWYgKHVubGlrZWx5KFhGU19URVNUX0VSUk9SKCFkaV9vaywgbXAsIFhGU19FUlJUQUdfSVRPQlBfSU5PVE9CUCwKKwkJCQkgWEZTX1JBTkRPTV9JVE9CUF9JTk9UT0JQKSkpIHsKKyNpZmRlZiBERUJVRworCQkJcHJkZXYoImJhZCBpbm9kZSBtYWdpYy92c24gZGFkZHIgJWxsZCAjJWQgKG1hZ2ljPSV4KSIsCisJCQkJbXAtPm1fZGRldl90YXJncCwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKWltYXAuaW1fYmxrbm8sIGksCisJCQkJSU5UX0dFVChkaXAtPmRpX2NvcmUuZGlfbWFnaWMsIEFSQ0hfQ09OVkVSVCkpOworI2VuZGlmCisJCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGZzX2l0b2JwIiwgWEZTX0VSUkxFVkVMX0hJR0gsCisJCQkJCSAgICAgbXAsIGRpcCk7CisJCQl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBicCk7CisJCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJCX0KKwl9CisjZW5kaWYJLyogX19LRVJORUxfXyAqLworCisJeGZzX2lub2JwX2NoZWNrKG1wLCBicCk7CisKKwkvKgorCSAqIE1hcmsgdGhlIGJ1ZmZlciBhcyBhbiBpbm9kZSBidWZmZXIgbm93IHRoYXQgaXQgbG9va3MgZ29vZAorCSAqLworCVhGU19CVUZfU0VUX1ZUWVBFKGJwLCBCX0ZTX0lOTyk7CisKKwkvKgorCSAqIFNldCAqZGlwcCB0byBwb2ludCB0byB0aGUgb24tZGlzayBpbm9kZSBpbiB0aGUgYnVmZmVyLgorCSAqLworCSpkaXBwID0gKHhmc19kaW5vZGVfdCAqKXhmc19idWZfb2Zmc2V0KGJwLCBpbWFwLmltX2JvZmZzZXQpOworCSpicHAgPSBicDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE1vdmUgaW5vZGUgdHlwZSBhbmQgaW5vZGUgZm9ybWF0IHNwZWNpZmljIGluZm9ybWF0aW9uIGZyb20gdGhlCisgKiBvbi1kaXNrIGlub2RlIHRvIHRoZSBpbi1jb3JlIGlub2RlLiAgRm9yIGZpZm9zLCBkZXZzLCBhbmQgc29ja2V0cworICogdGhpcyBtZWFucyBzZXQgaWZfcmRldiB0byB0aGUgcHJvcGVyIHZhbHVlLiAgRm9yIGZpbGVzLCBkaXJlY3RvcmllcywKKyAqIGFuZCBzeW1saW5rcyB0aGlzIG1lYW5zIHRvIGJyaW5nIGluIHRoZSBpbi1saW5lIGRhdGEgb3IgZXh0ZW50CisgKiBwb2ludGVycy4gIEZvciBhIGZpbGUgaW4gQi10cmVlIGZvcm1hdCwgb25seSB0aGUgcm9vdCBpcyBpbW1lZGlhdGVseQorICogYnJvdWdodCBpbi1jb3JlLiAgVGhlIHJlc3Qgd2lsbCBiZSBpbi1saW5lZCBpbiBpZl9leHRlbnRzIHdoZW4gaXQKKyAqIGlzIGZpcnN0IHJlZmVyZW5jZWQgKHNlZSB4ZnNfaXJlYWRfZXh0ZW50cygpKS4KKyAqLworU1RBVElDIGludAoreGZzX2lmb3JtYXQoCisJeGZzX2lub2RlX3QJCSppcCwKKwl4ZnNfZGlub2RlX3QJCSpkaXApCit7CisJeGZzX2F0dHJfc2hvcnRmb3JtX3QJKmF0cDsKKwlpbnQJCQlzaXplOworCWludAkJCWVycm9yOworCXhmc19mc2l6ZV90ICAgICAgICAgICAgIGRpX3NpemU7CisJaXAtPmlfZGYuaWZfZXh0X21heCA9CisJCVhGU19JRk9SS19EU0laRShpcCkgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpOworCWVycm9yID0gMDsKKworCWlmICh1bmxpa2VseSgKKwkgICAgSU5UX0dFVChkaXAtPmRpX2NvcmUuZGlfbmV4dGVudHMsIEFSQ0hfQ09OVkVSVCkgKworCQlJTlRfR0VUKGRpcC0+ZGlfY29yZS5kaV9hbmV4dGVudHMsIEFSQ0hfQ09OVkVSVCkgPgorCSAgICBJTlRfR0VUKGRpcC0+ZGlfY29yZS5kaV9uYmxvY2tzLCBBUkNIX0NPTlZFUlQpKSkgeworCQl4ZnNfZnNfY21uX2VycihDRV9XQVJOLCBpcC0+aV9tb3VudCwKKwkJCSJjb3JydXB0IGRpbm9kZSAlTHUsIGV4dGVudCB0b3RhbCA9ICVkLCBuYmxvY2tzID0gJUx1LiIKKwkJCSIgIFVubW91bnQgYW5kIHJ1biB4ZnNfcmVwYWlyLiIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWlwLT5pX2lubywKKwkJCShpbnQpKElOVF9HRVQoZGlwLT5kaV9jb3JlLmRpX25leHRlbnRzLCBBUkNIX0NPTlZFUlQpCisJCQkgICAgKyBJTlRfR0VUKGRpcC0+ZGlfY29yZS5kaV9hbmV4dGVudHMsIEFSQ0hfQ09OVkVSVCkpLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykKKwkJCUlOVF9HRVQoZGlwLT5kaV9jb3JlLmRpX25ibG9ja3MsIEFSQ0hfQ09OVkVSVCkpOworCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGZzX2lmb3JtYXQoMSkiLCBYRlNfRVJSTEVWRUxfTE9XLAorCQkJCSAgICAgaXAtPmlfbW91bnQsIGRpcCk7CisJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwl9CisKKwlpZiAodW5saWtlbHkoSU5UX0dFVChkaXAtPmRpX2NvcmUuZGlfZm9ya29mZiwgQVJDSF9DT05WRVJUKSA+IGlwLT5pX21vdW50LT5tX3NiLnNiX2lub2Rlc2l6ZSkpIHsKKwkJeGZzX2ZzX2Ntbl9lcnIoQ0VfV0FSTiwgaXAtPmlfbW91bnQsCisJCQkiY29ycnVwdCBkaW5vZGUgJUx1LCBmb3Jrb2ZmID0gMHgleC4iCisJCQkiICBVbm1vdW50IGFuZCBydW4geGZzX3JlcGFpci4iLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylpcC0+aV9pbm8sCisJCQkoaW50KShJTlRfR0VUKGRpcC0+ZGlfY29yZS5kaV9mb3Jrb2ZmLCBBUkNIX0NPTlZFUlQpKSk7CisJCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4ZnNfaWZvcm1hdCgyKSIsIFhGU19FUlJMRVZFTF9MT1csCisJCQkJICAgICBpcC0+aV9tb3VudCwgZGlwKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCX0KKworCXN3aXRjaCAoaXAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSB7CisJY2FzZSBTX0lGSUZPOgorCWNhc2UgU19JRkNIUjoKKwljYXNlIFNfSUZCTEs6CisJY2FzZSBTX0lGU09DSzoKKwkJaWYgKHVubGlrZWx5KElOVF9HRVQoZGlwLT5kaV9jb3JlLmRpX2Zvcm1hdCwgQVJDSF9DT05WRVJUKSAhPSBYRlNfRElOT0RFX0ZNVF9ERVYpKSB7CisJCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGZzX2lmb3JtYXQoMykiLCBYRlNfRVJSTEVWRUxfTE9XLAorCQkJCQkgICAgICBpcC0+aV9tb3VudCwgZGlwKTsKKwkJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwkJfQorCQlpcC0+aV9kLmRpX3NpemUgPSAwOworCQlpcC0+aV9kZi5pZl91Mi5pZl9yZGV2ID0gSU5UX0dFVChkaXAtPmRpX3UuZGlfZGV2LCBBUkNIX0NPTlZFUlQpOworCQlicmVhazsKKworCWNhc2UgU19JRlJFRzoKKwljYXNlIFNfSUZMTks6CisJY2FzZSBTX0lGRElSOgorCQlzd2l0Y2ggKElOVF9HRVQoZGlwLT5kaV9jb3JlLmRpX2Zvcm1hdCwgQVJDSF9DT05WRVJUKSkgeworCQljYXNlIFhGU19ESU5PREVfRk1UX0xPQ0FMOgorCQkJLyoKKwkJCSAqIG5vIGxvY2FsIHJlZ3VsYXIgZmlsZXMgeWV0CisJCQkgKi8KKwkJCWlmICh1bmxpa2VseSgoSU5UX0dFVChkaXAtPmRpX2NvcmUuZGlfbW9kZSwgQVJDSF9DT05WRVJUKSAmIFNfSUZNVCkgPT0gU19JRlJFRykpIHsKKwkJCQl4ZnNfZnNfY21uX2VycihDRV9XQVJOLCBpcC0+aV9tb3VudCwKKwkJCQkJImNvcnJ1cHQgaW5vZGUgKGxvY2FsIGZvcm1hdCBmb3IgcmVndWxhciBmaWxlKSAlTHUuICBVbm1vdW50IGFuZCBydW4geGZzX3JlcGFpci4iLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKSBpcC0+aV9pbm8pOworCQkJCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4ZnNfaWZvcm1hdCg0KSIsCisJCQkJCQkgICAgIFhGU19FUlJMRVZFTF9MT1csCisJCQkJCQkgICAgIGlwLT5pX21vdW50LCBkaXApOworCQkJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwkJCX0KKworCQkJZGlfc2l6ZSA9IElOVF9HRVQoZGlwLT5kaV9jb3JlLmRpX3NpemUsIEFSQ0hfQ09OVkVSVCk7CisJCQlpZiAodW5saWtlbHkoZGlfc2l6ZSA+IFhGU19ERk9SS19EU0laRShkaXAsIGlwLT5pX21vdW50KSkpIHsKKwkJCQl4ZnNfZnNfY21uX2VycihDRV9XQVJOLCBpcC0+aV9tb3VudCwKKwkJCQkJImNvcnJ1cHQgaW5vZGUgJUx1IChiYWQgc2l6ZSAlTGQgZm9yIGxvY2FsIGlub2RlKS4gIFVubW91bnQgYW5kIHJ1biB4ZnNfcmVwYWlyLiIsCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIGlwLT5pX2lubywKKwkJCQkJKGxvbmcgbG9uZykgZGlfc2l6ZSk7CisJCQkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhmc19pZm9ybWF0KDUpIiwKKwkJCQkJCSAgICAgWEZTX0VSUkxFVkVMX0xPVywKKwkJCQkJCSAgICAgaXAtPmlfbW91bnQsIGRpcCk7CisJCQkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCQkJfQorCisJCQlzaXplID0gKGludClkaV9zaXplOworCQkJZXJyb3IgPSB4ZnNfaWZvcm1hdF9sb2NhbChpcCwgZGlwLCBYRlNfREFUQV9GT1JLLCBzaXplKTsKKwkJCWJyZWFrOworCQljYXNlIFhGU19ESU5PREVfRk1UX0VYVEVOVFM6CisJCQllcnJvciA9IHhmc19pZm9ybWF0X2V4dGVudHMoaXAsIGRpcCwgWEZTX0RBVEFfRk9SSyk7CisJCQlicmVhazsKKwkJY2FzZSBYRlNfRElOT0RFX0ZNVF9CVFJFRToKKwkJCWVycm9yID0geGZzX2lmb3JtYXRfYnRyZWUoaXAsIGRpcCwgWEZTX0RBVEFfRk9SSyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCVhGU19FUlJPUl9SRVBPUlQoInhmc19pZm9ybWF0KDYpIiwgWEZTX0VSUkxFVkVMX0xPVywKKwkJCQkJIGlwLT5pX21vdW50KTsKKwkJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVhGU19FUlJPUl9SRVBPUlQoInhmc19pZm9ybWF0KDcpIiwgWEZTX0VSUkxFVkVMX0xPVywgaXAtPmlfbW91bnQpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJfQorCWlmIChlcnJvcikgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCWlmICghWEZTX0RGT1JLX1EoZGlwKSkKKwkJcmV0dXJuIDA7CisJQVNTRVJUKGlwLT5pX2FmcCA9PSBOVUxMKTsKKwlpcC0+aV9hZnAgPSBrbWVtX3pvbmVfemFsbG9jKHhmc19pZm9ya196b25lLCBLTV9TTEVFUCk7CisJaXAtPmlfYWZwLT5pZl9leHRfbWF4ID0KKwkJWEZTX0lGT1JLX0FTSVpFKGlwKSAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCk7CisJc3dpdGNoIChJTlRfR0VUKGRpcC0+ZGlfY29yZS5kaV9hZm9ybWF0LCBBUkNIX0NPTlZFUlQpKSB7CisJY2FzZSBYRlNfRElOT0RFX0ZNVF9MT0NBTDoKKwkJYXRwID0gKHhmc19hdHRyX3Nob3J0Zm9ybV90ICopWEZTX0RGT1JLX0FQVFIoZGlwKTsKKwkJc2l6ZSA9IChpbnQpSU5UX0dFVChhdHAtPmhkci50b3RzaXplLCBBUkNIX0NPTlZFUlQpOworCQllcnJvciA9IHhmc19pZm9ybWF0X2xvY2FsKGlwLCBkaXAsIFhGU19BVFRSX0ZPUkssIHNpemUpOworCQlicmVhazsKKwljYXNlIFhGU19ESU5PREVfRk1UX0VYVEVOVFM6CisJCWVycm9yID0geGZzX2lmb3JtYXRfZXh0ZW50cyhpcCwgZGlwLCBYRlNfQVRUUl9GT1JLKTsKKwkJYnJlYWs7CisJY2FzZSBYRlNfRElOT0RFX0ZNVF9CVFJFRToKKwkJZXJyb3IgPSB4ZnNfaWZvcm1hdF9idHJlZShpcCwgZGlwLCBYRlNfQVRUUl9GT1JLKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyb3IgPSBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwkJYnJlYWs7CisJfQorCWlmIChlcnJvcikgeworCQlrbWVtX3pvbmVfZnJlZSh4ZnNfaWZvcmtfem9uZSwgaXAtPmlfYWZwKTsKKwkJaXAtPmlfYWZwID0gTlVMTDsKKwkJeGZzX2lkZXN0cm95X2ZvcmsoaXAsIFhGU19EQVRBX0ZPUkspOworCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBUaGUgZmlsZSBpcyBpbi1saW5lZCBpbiB0aGUgb24tZGlzayBpbm9kZS4KKyAqIElmIGl0IGZpdHMgaW50byBpZl9pbmxpbmVfZGF0YSwgdGhlbiBjb3B5CisgKiBpdCB0aGVyZSwgb3RoZXJ3aXNlIGFsbG9jYXRlIGEgYnVmZmVyIGZvciBpdAorICogYW5kIGNvcHkgdGhlIGRhdGEgdGhlcmUuICBFaXRoZXIgd2F5LCBzZXQKKyAqIGlmX2RhdGEgdG8gcG9pbnQgYXQgdGhlIGRhdGEuCisgKiBJZiB3ZSBhbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdGhlIGRhdGEsIG1ha2UKKyAqIHN1cmUgdGhhdCBpdHMgc2l6ZSBpcyBhIG11bHRpcGxlIG9mIDQgYW5kCisgKiByZWNvcmQgdGhlIHJlYWwgc2l6ZSBpbiBpX3JlYWxfYnl0ZXMuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19pZm9ybWF0X2xvY2FsKAorCXhmc19pbm9kZV90CSppcCwKKwl4ZnNfZGlub2RlX3QJKmRpcCwKKwlpbnQJCXdoaWNoZm9yaywKKwlpbnQJCXNpemUpCit7CisJeGZzX2lmb3JrX3QJKmlmcDsKKwlpbnQJCXJlYWxfc2l6ZTsKKworCS8qCisJICogSWYgdGhlIHNpemUgaXMgdW5yZWFzb25hYmxlLCB0aGVuIHNvbWV0aGluZworCSAqIGlzIHdyb25nIGFuZCB3ZSBqdXN0IGJhaWwgb3V0IHJhdGhlciB0aGFuIGNyYXNoIGluCisJICoga21lbV9hbGxvYygpIG9yIG1lbWNweSgpIGJlbG93LgorCSAqLworCWlmICh1bmxpa2VseShzaXplID4gWEZTX0RGT1JLX1NJWkUoZGlwLCBpcC0+aV9tb3VudCwgd2hpY2hmb3JrKSkpIHsKKwkJeGZzX2ZzX2Ntbl9lcnIoQ0VfV0FSTiwgaXAtPmlfbW91bnQsCisJCQkiY29ycnVwdCBpbm9kZSAlTHUgKGJhZCBzaXplICVkIGZvciBsb2NhbCBmb3JrLCBzaXplID0gJWQpLiAgVW5tb3VudCBhbmQgcnVuIHhmc19yZXBhaXIuIiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIGlwLT5pX2lubywgc2l6ZSwKKwkJCVhGU19ERk9SS19TSVpFKGRpcCwgaXAtPmlfbW91bnQsIHdoaWNoZm9yaykpOworCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGZzX2lmb3JtYXRfbG9jYWwiLCBYRlNfRVJSTEVWRUxfTE9XLAorCQkJCSAgICAgaXAtPmlfbW91bnQsIGRpcCk7CisJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwl9CisJaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgd2hpY2hmb3JrKTsKKwlyZWFsX3NpemUgPSAwOworCWlmIChzaXplID09IDApCisJCWlmcC0+aWZfdTEuaWZfZGF0YSA9IE5VTEw7CisJZWxzZSBpZiAoc2l6ZSA8PSBzaXplb2YoaWZwLT5pZl91Mi5pZl9pbmxpbmVfZGF0YSkpCisJCWlmcC0+aWZfdTEuaWZfZGF0YSA9IGlmcC0+aWZfdTIuaWZfaW5saW5lX2RhdGE7CisJZWxzZSB7CisJCXJlYWxfc2l6ZSA9IHJvdW5kdXAoc2l6ZSwgNCk7CisJCWlmcC0+aWZfdTEuaWZfZGF0YSA9IGttZW1fYWxsb2MocmVhbF9zaXplLCBLTV9TTEVFUCk7CisJfQorCWlmcC0+aWZfYnl0ZXMgPSBzaXplOworCWlmcC0+aWZfcmVhbF9ieXRlcyA9IHJlYWxfc2l6ZTsKKwlpZiAoc2l6ZSkKKwkJbWVtY3B5KGlmcC0+aWZfdTEuaWZfZGF0YSwgWEZTX0RGT1JLX1BUUihkaXAsIHdoaWNoZm9yayksIHNpemUpOworCWlmcC0+aWZfZmxhZ3MgJj0gflhGU19JRkVYVEVOVFM7CisJaWZwLT5pZl9mbGFncyB8PSBYRlNfSUZJTkxJTkU7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGUgZmlsZSBjb25zaXN0cyBvZiBhIHNldCBvZiBleHRlbnRzIGFsbAorICogb2Ygd2hpY2ggZml0IGludG8gdGhlIG9uLWRpc2sgaW5vZGUuCisgKiBJZiB0aGVyZSBhcmUgZmV3IGVub3VnaCBleHRlbnRzIHRvIGZpdCBpbnRvCisgKiB0aGUgaWZfaW5saW5lX2V4dCwgdGhlbiBjb3B5IHRoZW0gdGhlcmUuCisgKiBPdGhlcndpc2UgYWxsb2NhdGUgYSBidWZmZXIgZm9yIHRoZW0gYW5kIGNvcHkKKyAqIHRoZW0gaW50byBpdC4gIEVpdGhlciB3YXksIHNldCBpZl9leHRlbnRzCisgKiB0byBwb2ludCBhdCB0aGUgZXh0ZW50cy4KKyAqLworU1RBVElDIGludAoreGZzX2lmb3JtYXRfZXh0ZW50cygKKwl4ZnNfaW5vZGVfdAkqaXAsCisJeGZzX2Rpbm9kZV90CSpkaXAsCisJaW50CQl3aGljaGZvcmspCit7CisJeGZzX2JtYnRfcmVjX3QJKmVwLCAqZHA7CisJeGZzX2lmb3JrX3QJKmlmcDsKKwlpbnQJCW5leDsKKwlpbnQJCXJlYWxfc2l6ZTsKKwlpbnQJCXNpemU7CisJaW50CQlpOworCisJaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgd2hpY2hmb3JrKTsKKwluZXggPSBYRlNfREZPUktfTkVYVEVOVFMoZGlwLCB3aGljaGZvcmspOworCXNpemUgPSBuZXggKiAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpOworCisJLyoKKwkgKiBJZiB0aGUgbnVtYmVyIG9mIGV4dGVudHMgaXMgdW5yZWFzb25hYmxlLCB0aGVuIHNvbWV0aGluZworCSAqIGlzIHdyb25nIGFuZCB3ZSBqdXN0IGJhaWwgb3V0IHJhdGhlciB0aGFuIGNyYXNoIGluCisJICoga21lbV9hbGxvYygpIG9yIG1lbWNweSgpIGJlbG93LgorCSAqLworCWlmICh1bmxpa2VseShzaXplIDwgMCB8fCBzaXplID4gWEZTX0RGT1JLX1NJWkUoZGlwLCBpcC0+aV9tb3VudCwgd2hpY2hmb3JrKSkpIHsKKwkJeGZzX2ZzX2Ntbl9lcnIoQ0VfV0FSTiwgaXAtPmlfbW91bnQsCisJCQkiY29ycnVwdCBpbm9kZSAlTHUgKChhKWV4dGVudHMgPSAlZCkuICBVbm1vdW50IGFuZCBydW4geGZzX3JlcGFpci4iLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgaXAtPmlfaW5vLCBuZXgpOworCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGZzX2lmb3JtYXRfZXh0ZW50cygxKSIsIFhGU19FUlJMRVZFTF9MT1csCisJCQkJICAgICBpcC0+aV9tb3VudCwgZGlwKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCX0KKworCXJlYWxfc2l6ZSA9IDA7CisJaWYgKG5leCA9PSAwKQorCQlpZnAtPmlmX3UxLmlmX2V4dGVudHMgPSBOVUxMOworCWVsc2UgaWYgKG5leCA8PSBYRlNfSU5MSU5FX0VYVFMpCisJCWlmcC0+aWZfdTEuaWZfZXh0ZW50cyA9IGlmcC0+aWZfdTIuaWZfaW5saW5lX2V4dDsKKwllbHNlIHsKKwkJaWZwLT5pZl91MS5pZl9leHRlbnRzID0ga21lbV9hbGxvYyhzaXplLCBLTV9TTEVFUCk7CisJCUFTU0VSVChpZnAtPmlmX3UxLmlmX2V4dGVudHMgIT0gTlVMTCk7CisJCXJlYWxfc2l6ZSA9IHNpemU7CisJfQorCWlmcC0+aWZfYnl0ZXMgPSBzaXplOworCWlmcC0+aWZfcmVhbF9ieXRlcyA9IHJlYWxfc2l6ZTsKKwlpZiAoc2l6ZSkgeworCQlkcCA9ICh4ZnNfYm1idF9yZWNfdCAqKSBYRlNfREZPUktfUFRSKGRpcCwgd2hpY2hmb3JrKTsKKwkJeGZzX3ZhbGlkYXRlX2V4dGVudHMoZHAsIG5leCwgMSwgWEZTX0VYVEZNVF9JTk9ERShpcCkpOworCQllcCA9IGlmcC0+aWZfdTEuaWZfZXh0ZW50czsKKwkJZm9yIChpID0gMDsgaSA8IG5leDsgaSsrLCBlcCsrLCBkcCsrKSB7CisJCQllcC0+bDAgPSBJTlRfR0VUKGdldF91bmFsaWduZWQoKF9fdWludDY0X3QqKSZkcC0+bDApLAorCQkJCQkJCQlBUkNIX0NPTlZFUlQpOworCQkJZXAtPmwxID0gSU5UX0dFVChnZXRfdW5hbGlnbmVkKChfX3VpbnQ2NF90KikmZHAtPmwxKSwKKwkJCQkJCQkJQVJDSF9DT05WRVJUKTsKKwkJfQorCQl4ZnNfYm1hcF90cmFjZV9leGxpc3QoInhmc19pZm9ybWF0X2V4dGVudHMiLCBpcCwgbmV4LAorCQkJd2hpY2hmb3JrKTsKKwkJaWYgKHdoaWNoZm9yayAhPSBYRlNfREFUQV9GT1JLIHx8CisJCQlYRlNfRVhURk1UX0lOT0RFKGlwKSA9PSBYRlNfRVhURk1UX05PU1RBVEUpCisJCQkJaWYgKHVubGlrZWx5KHhmc19jaGVja19ub3N0YXRlX2V4dGVudHMoCisJCQkJICAgIGlmcC0+aWZfdTEuaWZfZXh0ZW50cywgbmV4KSkpIHsKKwkJCQkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX2lmb3JtYXRfZXh0ZW50cygyKSIsCisJCQkJCQkJIFhGU19FUlJMRVZFTF9MT1csCisJCQkJCQkJIGlwLT5pX21vdW50KTsKKwkJCQkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCQkJCX0KKwl9CisJaWZwLT5pZl9mbGFncyB8PSBYRlNfSUZFWFRFTlRTOworCXJldHVybiAwOworfQorCisvKgorICogVGhlIGZpbGUgaGFzIHRvbyBtYW55IGV4dGVudHMgdG8gZml0IGludG8KKyAqIHRoZSBpbm9kZSwgc28gdGhleSBhcmUgaW4gQi10cmVlIGZvcm1hdC4KKyAqIEFsbG9jYXRlIGEgYnVmZmVyIGZvciB0aGUgcm9vdCBvZiB0aGUgQi10cmVlCisgKiBhbmQgY29weSB0aGUgcm9vdCBpbnRvIGl0LiAgVGhlIGlfZXh0ZW50cworICogZmllbGQgd2lsbCByZW1haW4gTlVMTCB1bnRpbCBhbGwgb2YgdGhlCisgKiBleHRlbnRzIGFyZSByZWFkIGluICh3aGVuIHRoZXkgYXJlIG5lZWRlZCkuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19pZm9ybWF0X2J0cmVlKAorCXhmc19pbm9kZV90CQkqaXAsCisJeGZzX2Rpbm9kZV90CQkqZGlwLAorCWludAkJCXdoaWNoZm9yaykKK3sKKwl4ZnNfYm1kcl9ibG9ja190CSpkZnA7CisJeGZzX2lmb3JrX3QJCSppZnA7CisJLyogUkVGRVJFTkNFRCAqLworCWludAkJCW5yZWNzOworCWludAkJCXNpemU7CisKKwlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOworCWRmcCA9ICh4ZnNfYm1kcl9ibG9ja190ICopWEZTX0RGT1JLX1BUUihkaXAsIHdoaWNoZm9yayk7CisJc2l6ZSA9IFhGU19CTUFQX0JST09UX1NQQUNFKGRmcCk7CisJbnJlY3MgPSBYRlNfQk1BUF9CUk9PVF9OVU1SRUNTKGRmcCk7CisKKwkvKgorCSAqIGJsb3cgb3V0IGlmIC0tIGZvcmsgaGFzIGxlc3MgZXh0ZW50cyB0aGFuIGNhbiBmaXQgaW4KKwkgKiBmb3JrIChmb3JrIHNob3VsZG4ndCBiZSBhIGJ0cmVlIGZvcm1hdCksIHJvb3QgYnRyZWUKKwkgKiBibG9jayBoYXMgbW9yZSByZWNvcmRzIHRoYW4gY2FuIGZpdCBpbnRvIHRoZSBmb3JrLAorCSAqIG9yIHRoZSBudW1iZXIgb2YgZXh0ZW50cyBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZgorCSAqIGJsb2Nrcy4KKwkgKi8KKwlpZiAodW5saWtlbHkoWEZTX0lGT1JLX05FWFRFTlRTKGlwLCB3aGljaGZvcmspIDw9IGlmcC0+aWZfZXh0X21heAorCSAgICB8fCBYRlNfQk1EUl9TUEFDRV9DQUxDKG5yZWNzKSA+CisJCQlYRlNfREZPUktfU0laRShkaXAsIGlwLT5pX21vdW50LCB3aGljaGZvcmspCisJICAgIHx8IFhGU19JRk9SS19ORVhURU5UUyhpcCwgd2hpY2hmb3JrKSA+IGlwLT5pX2QuZGlfbmJsb2NrcykpIHsKKwkJeGZzX2ZzX2Ntbl9lcnIoQ0VfV0FSTiwgaXAtPmlfbW91bnQsCisJCQkiY29ycnVwdCBpbm9kZSAlTHUgKGJ0cmVlKS4gIFVubW91bnQgYW5kIHJ1biB4ZnNfcmVwYWlyLiIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKSBpcC0+aV9pbm8pOworCQlYRlNfRVJST1JfUkVQT1JUKCJ4ZnNfaWZvcm1hdF9idHJlZSIsIFhGU19FUlJMRVZFTF9MT1csCisJCQkJIGlwLT5pX21vdW50KTsKKwkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCX0KKworCWlmcC0+aWZfYnJvb3RfYnl0ZXMgPSBzaXplOworCWlmcC0+aWZfYnJvb3QgPSBrbWVtX2FsbG9jKHNpemUsIEtNX1NMRUVQKTsKKwlBU1NFUlQoaWZwLT5pZl9icm9vdCAhPSBOVUxMKTsKKwkvKgorCSAqIENvcHkgYW5kIGNvbnZlcnQgZnJvbSB0aGUgb24tZGlzayBzdHJ1Y3R1cmUKKwkgKiB0byB0aGUgaW4tbWVtb3J5IHN0cnVjdHVyZS4KKwkgKi8KKwl4ZnNfYm1kcl90b19ibWJ0KGRmcCwgWEZTX0RGT1JLX1NJWkUoZGlwLCBpcC0+aV9tb3VudCwgd2hpY2hmb3JrKSwKKwkJaWZwLT5pZl9icm9vdCwgc2l6ZSk7CisJaWZwLT5pZl9mbGFncyAmPSB+WEZTX0lGRVhURU5UUzsKKwlpZnAtPmlmX2ZsYWdzIHw9IFhGU19JRkJST09UOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB4ZnNfeGxhdGVfZGlub2RlX2NvcmUgLSB0cmFuc2xhdGUgYW4geGZzX2lub2RlX2NvcmVfdCBiZXR3ZWVuIG9uZGlzaworICogYW5kIG5hdGl2ZSBmb3JtYXQKKyAqCisgKiBidWYgID0gb24tZGlzayByZXByZXNlbnRhdGlvbgorICogZGlwICA9IG5hdGl2ZSByZXByZXNlbnRhdGlvbgorICogZGlyICA9IGRpcmVjdGlvbiAtICt2ZSAtPiBkaXNrIHRvIG5hdGl2ZQorICogICAgICAgICAgICAgICAgICAgIC12ZSAtPiBuYXRpdmUgdG8gZGlzaworICovCit2b2lkCit4ZnNfeGxhdGVfZGlub2RlX2NvcmUoCisJeGZzX2NhZGRyX3QJCWJ1ZiwKKwl4ZnNfZGlub2RlX2NvcmVfdAkqZGlwLAorCWludAkJCWRpcikKK3sKKwl4ZnNfZGlub2RlX2NvcmVfdAkqYnVmX2NvcmUgPSAoeGZzX2Rpbm9kZV9jb3JlX3QgKilidWY7CisJeGZzX2Rpbm9kZV9jb3JlX3QJKm1lbV9jb3JlID0gKHhmc19kaW5vZGVfY29yZV90ICopZGlwOworCXhmc19hcmNoX3QJCWFyY2ggPSBBUkNIX0NPTlZFUlQ7CisKKwlBU1NFUlQoZGlyKTsKKworCUlOVF9YTEFURShidWZfY29yZS0+ZGlfbWFnaWMsIG1lbV9jb3JlLT5kaV9tYWdpYywgZGlyLCBhcmNoKTsKKwlJTlRfWExBVEUoYnVmX2NvcmUtPmRpX21vZGUsIG1lbV9jb3JlLT5kaV9tb2RlLCBkaXIsIGFyY2gpOworCUlOVF9YTEFURShidWZfY29yZS0+ZGlfdmVyc2lvbiwJbWVtX2NvcmUtPmRpX3ZlcnNpb24sIGRpciwgYXJjaCk7CisJSU5UX1hMQVRFKGJ1Zl9jb3JlLT5kaV9mb3JtYXQsIG1lbV9jb3JlLT5kaV9mb3JtYXQsIGRpciwgYXJjaCk7CisJSU5UX1hMQVRFKGJ1Zl9jb3JlLT5kaV9vbmxpbmssIG1lbV9jb3JlLT5kaV9vbmxpbmssIGRpciwgYXJjaCk7CisJSU5UX1hMQVRFKGJ1Zl9jb3JlLT5kaV91aWQsIG1lbV9jb3JlLT5kaV91aWQsIGRpciwgYXJjaCk7CisJSU5UX1hMQVRFKGJ1Zl9jb3JlLT5kaV9naWQsIG1lbV9jb3JlLT5kaV9naWQsIGRpciwgYXJjaCk7CisJSU5UX1hMQVRFKGJ1Zl9jb3JlLT5kaV9ubGluaywgbWVtX2NvcmUtPmRpX25saW5rLCBkaXIsIGFyY2gpOworCUlOVF9YTEFURShidWZfY29yZS0+ZGlfcHJvamlkLCBtZW1fY29yZS0+ZGlfcHJvamlkLCBkaXIsIGFyY2gpOworCisJaWYgKGRpciA+IDApIHsKKwkJbWVtY3B5KG1lbV9jb3JlLT5kaV9wYWQsIGJ1Zl9jb3JlLT5kaV9wYWQsCisJCQlzaXplb2YoYnVmX2NvcmUtPmRpX3BhZCkpOworCX0gZWxzZSB7CisJCW1lbWNweShidWZfY29yZS0+ZGlfcGFkLCBtZW1fY29yZS0+ZGlfcGFkLAorCQkJc2l6ZW9mKGJ1Zl9jb3JlLT5kaV9wYWQpKTsKKwl9CisKKwlJTlRfWExBVEUoYnVmX2NvcmUtPmRpX2ZsdXNoaXRlciwgbWVtX2NvcmUtPmRpX2ZsdXNoaXRlciwgZGlyLCBhcmNoKTsKKworCUlOVF9YTEFURShidWZfY29yZS0+ZGlfYXRpbWUudF9zZWMsIG1lbV9jb3JlLT5kaV9hdGltZS50X3NlYywKKwkJCWRpciwgYXJjaCk7CisJSU5UX1hMQVRFKGJ1Zl9jb3JlLT5kaV9hdGltZS50X25zZWMsIG1lbV9jb3JlLT5kaV9hdGltZS50X25zZWMsCisJCQlkaXIsIGFyY2gpOworCUlOVF9YTEFURShidWZfY29yZS0+ZGlfbXRpbWUudF9zZWMsIG1lbV9jb3JlLT5kaV9tdGltZS50X3NlYywKKwkJCWRpciwgYXJjaCk7CisJSU5UX1hMQVRFKGJ1Zl9jb3JlLT5kaV9tdGltZS50X25zZWMsIG1lbV9jb3JlLT5kaV9tdGltZS50X25zZWMsCisJCQlkaXIsIGFyY2gpOworCUlOVF9YTEFURShidWZfY29yZS0+ZGlfY3RpbWUudF9zZWMsIG1lbV9jb3JlLT5kaV9jdGltZS50X3NlYywKKwkJCWRpciwgYXJjaCk7CisJSU5UX1hMQVRFKGJ1Zl9jb3JlLT5kaV9jdGltZS50X25zZWMsIG1lbV9jb3JlLT5kaV9jdGltZS50X25zZWMsCisJCQlkaXIsIGFyY2gpOworCUlOVF9YTEFURShidWZfY29yZS0+ZGlfc2l6ZSwgbWVtX2NvcmUtPmRpX3NpemUsIGRpciwgYXJjaCk7CisJSU5UX1hMQVRFKGJ1Zl9jb3JlLT5kaV9uYmxvY2tzLCBtZW1fY29yZS0+ZGlfbmJsb2NrcywgZGlyLCBhcmNoKTsKKwlJTlRfWExBVEUoYnVmX2NvcmUtPmRpX2V4dHNpemUsIG1lbV9jb3JlLT5kaV9leHRzaXplLCBkaXIsIGFyY2gpOworCUlOVF9YTEFURShidWZfY29yZS0+ZGlfbmV4dGVudHMsIG1lbV9jb3JlLT5kaV9uZXh0ZW50cywgZGlyLCBhcmNoKTsKKwlJTlRfWExBVEUoYnVmX2NvcmUtPmRpX2FuZXh0ZW50cywgbWVtX2NvcmUtPmRpX2FuZXh0ZW50cywgZGlyLCBhcmNoKTsKKwlJTlRfWExBVEUoYnVmX2NvcmUtPmRpX2ZvcmtvZmYsIG1lbV9jb3JlLT5kaV9mb3Jrb2ZmLCBkaXIsIGFyY2gpOworCUlOVF9YTEFURShidWZfY29yZS0+ZGlfYWZvcm1hdCwgbWVtX2NvcmUtPmRpX2Fmb3JtYXQsIGRpciwgYXJjaCk7CisJSU5UX1hMQVRFKGJ1Zl9jb3JlLT5kaV9kbWV2bWFzaywgbWVtX2NvcmUtPmRpX2RtZXZtYXNrLCBkaXIsIGFyY2gpOworCUlOVF9YTEFURShidWZfY29yZS0+ZGlfZG1zdGF0ZSwgbWVtX2NvcmUtPmRpX2Rtc3RhdGUsIGRpciwgYXJjaCk7CisJSU5UX1hMQVRFKGJ1Zl9jb3JlLT5kaV9mbGFncywgbWVtX2NvcmUtPmRpX2ZsYWdzLCBkaXIsIGFyY2gpOworCUlOVF9YTEFURShidWZfY29yZS0+ZGlfZ2VuLCBtZW1fY29yZS0+ZGlfZ2VuLCBkaXIsIGFyY2gpOworfQorCitTVEFUSUMgdWludAorX3hmc19kaWMyeGZsYWdzKAorCXhmc19kaW5vZGVfY29yZV90CSpkaWMsCisJX191aW50MTZfdAkJZGlfZmxhZ3MpCit7CisJdWludAkJCWZsYWdzID0gMDsKKworCWlmIChkaV9mbGFncyAmIFhGU19ESUZMQUdfQU5ZKSB7CisJCWlmIChkaV9mbGFncyAmIFhGU19ESUZMQUdfUkVBTFRJTUUpCisJCQlmbGFncyB8PSBYRlNfWEZMQUdfUkVBTFRJTUU7CisJCWlmIChkaV9mbGFncyAmIFhGU19ESUZMQUdfUFJFQUxMT0MpCisJCQlmbGFncyB8PSBYRlNfWEZMQUdfUFJFQUxMT0M7CisJCWlmIChkaV9mbGFncyAmIFhGU19ESUZMQUdfSU1NVVRBQkxFKQorCQkJZmxhZ3MgfD0gWEZTX1hGTEFHX0lNTVVUQUJMRTsKKwkJaWYgKGRpX2ZsYWdzICYgWEZTX0RJRkxBR19BUFBFTkQpCisJCQlmbGFncyB8PSBYRlNfWEZMQUdfQVBQRU5EOworCQlpZiAoZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1NZTkMpCisJCQlmbGFncyB8PSBYRlNfWEZMQUdfU1lOQzsKKwkJaWYgKGRpX2ZsYWdzICYgWEZTX0RJRkxBR19OT0FUSU1FKQorCQkJZmxhZ3MgfD0gWEZTX1hGTEFHX05PQVRJTUU7CisJCWlmIChkaV9mbGFncyAmIFhGU19ESUZMQUdfTk9EVU1QKQorCQkJZmxhZ3MgfD0gWEZTX1hGTEFHX05PRFVNUDsKKwkJaWYgKGRpX2ZsYWdzICYgWEZTX0RJRkxBR19SVElOSEVSSVQpCisJCQlmbGFncyB8PSBYRlNfWEZMQUdfUlRJTkhFUklUOworCQlpZiAoZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1BST0pJTkhFUklUKQorCQkJZmxhZ3MgfD0gWEZTX1hGTEFHX1BST0pJTkhFUklUOworCQlpZiAoZGlfZmxhZ3MgJiBYRlNfRElGTEFHX05PU1lNTElOS1MpCisJCQlmbGFncyB8PSBYRlNfWEZMQUdfTk9TWU1MSU5LUzsKKwl9CisKKwlyZXR1cm4gZmxhZ3M7Cit9CisKK3VpbnQKK3hmc19pcDJ4ZmxhZ3MoCisJeGZzX2lub2RlX3QJCSppcCkKK3sKKwl4ZnNfZGlub2RlX2NvcmVfdAkqZGljID0gJmlwLT5pX2Q7CisKKwlyZXR1cm4gX3hmc19kaWMyeGZsYWdzKGRpYywgZGljLT5kaV9mbGFncykgfAorCQkoWEZTX0NGT1JLX1EoZGljKSA/IFhGU19YRkxBR19IQVNBVFRSIDogMCk7Cit9CisKK3VpbnQKK3hmc19kaWMyeGZsYWdzKAorCXhmc19kaW5vZGVfY29yZV90CSpkaWMpCit7CisJcmV0dXJuIF94ZnNfZGljMnhmbGFncyhkaWMsIElOVF9HRVQoZGljLT5kaV9mbGFncywgQVJDSF9DT05WRVJUKSkgfAorCQkoWEZTX0NGT1JLX1FfRElTSyhkaWMpID8gWEZTX1hGTEFHX0hBU0FUVFIgOiAwKTsKK30KKworLyoKKyAqIEdpdmVuIGEgbW91bnQgc3RydWN0dXJlIGFuZCBhbiBpbm9kZSBudW1iZXIsIHJldHVybiBhIHBvaW50ZXIKKyAqIHRvIGEgbmV3bHkgYWxsb2NhdGVkIGluLWNvcmUgaW5vZGUgY29yZXNwb25kaW5nIHRvIHRoZSBnaXZlbgorICogaW5vZGUgbnVtYmVyLgorICoKKyAqIEluaXRpYWxpemUgdGhlIGlub2RlJ3MgYXR0cmlidXRlcyBhbmQgZXh0ZW50IHBvaW50ZXJzIGlmIGl0CisgKiBhbHJlYWR5IGhhcyB0aGVtIChpdCB3aWxsIG5vdCBpZiB0aGUgaW5vZGUgaGFzIG5vIGxpbmtzKS4KKyAqLworaW50Cit4ZnNfaXJlYWQoCisJeGZzX21vdW50X3QJKm1wLAorCXhmc190cmFuc190CSp0cCwKKwl4ZnNfaW5vX3QJaW5vLAorCXhmc19pbm9kZV90CSoqaXBwLAorCXhmc19kYWRkcl90CWJubykKK3sKKwl4ZnNfYnVmX3QJKmJwOworCXhmc19kaW5vZGVfdAkqZGlwOworCXhmc19pbm9kZV90CSppcDsKKwlpbnQJCWVycm9yOworCisJQVNTRVJUKHhmc19pbm9kZV96b25lICE9IE5VTEwpOworCisJaXAgPSBrbWVtX3pvbmVfemFsbG9jKHhmc19pbm9kZV96b25lLCBLTV9TTEVFUCk7CisJaXAtPmlfaW5vID0gaW5vOworCWlwLT5pX21vdW50ID0gbXA7CisKKwkvKgorCSAqIEdldCBwb2ludGVyJ3MgdG8gdGhlIG9uLWRpc2sgaW5vZGUgYW5kIHRoZSBidWZmZXIgY29udGFpbmluZyBpdC4KKwkgKiBJZiB0aGUgaW5vZGUgbnVtYmVyIHJlZmVycyB0byBhIGJsb2NrIG91dHNpZGUgdGhlIGZpbGUgc3lzdGVtCisJICogdGhlbiB4ZnNfaXRvYnAoKSB3aWxsIHJldHVybiBOVUxMLiAgSW4gdGhpcyBjYXNlIHdlIHNob3VsZAorCSAqIHJldHVybiBOVUxMIGFzIHdlbGwuICBTZXQgaV9ibGtubyB0byAwIHNvIHRoYXQgeGZzX2l0b2JwKCkgd2lsbAorCSAqIGtub3cgdGhhdCB0aGlzIGlzIGEgbmV3IGluY29yZSBpbm9kZS4KKwkgKi8KKwllcnJvciA9IHhmc19pdG9icChtcCwgdHAsIGlwLCAmZGlwLCAmYnAsIGJubyk7CisKKwlpZiAoZXJyb3IgIT0gMCkgeworCQlrbWVtX3pvbmVfZnJlZSh4ZnNfaW5vZGVfem9uZSwgaXApOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJLyoKKwkgKiBJbml0aWFsaXplIGlub2RlJ3MgdHJhY2UgYnVmZmVycy4KKwkgKiBEbyB0aGlzIGJlZm9yZSB4ZnNfaWZvcm1hdCBpbiBjYXNlIGl0IGFkZHMgZW50cmllcy4KKwkgKi8KKyNpZmRlZiBYRlNfQk1BUF9UUkFDRQorCWlwLT5pX3h0cmFjZSA9IGt0cmFjZV9hbGxvYyhYRlNfQk1BUF9LVFJBQ0VfU0laRSwgS01fU0xFRVApOworI2VuZGlmCisjaWZkZWYgWEZTX0JNQlRfVFJBQ0UKKwlpcC0+aV9idHJhY2UgPSBrdHJhY2VfYWxsb2MoWEZTX0JNQlRfS1RSQUNFX1NJWkUsIEtNX1NMRUVQKTsKKyNlbmRpZgorI2lmZGVmIFhGU19SV19UUkFDRQorCWlwLT5pX3J3dHJhY2UgPSBrdHJhY2VfYWxsb2MoWEZTX1JXX0tUUkFDRV9TSVpFLCBLTV9TTEVFUCk7CisjZW5kaWYKKyNpZmRlZiBYRlNfSUxPQ0tfVFJBQ0UKKwlpcC0+aV9sb2NrX3RyYWNlID0ga3RyYWNlX2FsbG9jKFhGU19JTE9DS19LVFJBQ0VfU0laRSwgS01fU0xFRVApOworI2VuZGlmCisjaWZkZWYgWEZTX0RJUjJfVFJBQ0UKKwlpcC0+aV9kaXJfdHJhY2UgPSBrdHJhY2VfYWxsb2MoWEZTX0RJUjJfS1RSQUNFX1NJWkUsIEtNX1NMRUVQKTsKKyNlbmRpZgorCisJLyoKKwkgKiBJZiB3ZSBnb3Qgc29tZXRoaW5nIHRoYXQgaXNuJ3QgYW4gaW5vZGUgaXQgbWVhbnMgc29tZW9uZQorCSAqIChuZnMgb3IgZG1pKSBoYXMgYSBzdGFsZSBoYW5kbGUuCisJICovCisJaWYgKElOVF9HRVQoZGlwLT5kaV9jb3JlLmRpX21hZ2ljLCBBUkNIX0NPTlZFUlQpICE9IFhGU19ESU5PREVfTUFHSUMpIHsKKwkJa21lbV96b25lX2ZyZWUoeGZzX2lub2RlX3pvbmUsIGlwKTsKKwkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOworI2lmZGVmIERFQlVHCisJCXhmc19mc19jbW5fZXJyKENFX0FMRVJULCBtcCwgInhmc19pcmVhZDogIgorCQkJCSJkaXAtPmRpX2NvcmUuZGlfbWFnaWMgKDB4JXgpICE9ICIKKwkJCQkiWEZTX0RJTk9ERV9NQUdJQyAoMHgleCkiLAorCQkJCUlOVF9HRVQoZGlwLT5kaV9jb3JlLmRpX21hZ2ljLCBBUkNIX0NPTlZFUlQpLAorCQkJCVhGU19ESU5PREVfTUFHSUMpOworI2VuZGlmIC8qIERFQlVHICovCisJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBvbi1kaXNrIGlub2RlIGlzIGFscmVhZHkgbGlua2VkIHRvIGEgZGlyZWN0b3J5CisJICogZW50cnksIGNvcHkgYWxsIG9mIHRoZSBpbm9kZSBpbnRvIHRoZSBpbi1jb3JlIGlub2RlLgorCSAqIHhmc19pZm9ybWF0KCkgaGFuZGxlcyBjb3B5aW5nIGluIHRoZSBpbm9kZSBmb3JtYXQKKwkgKiBzcGVjaWZpYyBpbmZvcm1hdGlvbi4KKwkgKiBPdGhlcndpc2UsIGp1c3QgZ2V0IHRoZSB0cnVseSBwZXJtYW5lbnQgaW5mb3JtYXRpb24uCisJICovCisJaWYgKGRpcC0+ZGlfY29yZS5kaV9tb2RlKSB7CisJCXhmc194bGF0ZV9kaW5vZGVfY29yZSgoeGZzX2NhZGRyX3QpJmRpcC0+ZGlfY29yZSwKKwkJICAgICAmKGlwLT5pX2QpLCAxKTsKKwkJZXJyb3IgPSB4ZnNfaWZvcm1hdChpcCwgZGlwKTsKKwkJaWYgKGVycm9yKSAgeworCQkJa21lbV96b25lX2ZyZWUoeGZzX2lub2RlX3pvbmUsIGlwKTsKKwkJCXhmc190cmFuc19icmVsc2UodHAsIGJwKTsKKyNpZmRlZiBERUJVRworCQkJeGZzX2ZzX2Ntbl9lcnIoQ0VfQUxFUlQsIG1wLCAieGZzX2lyZWFkOiAiCisJCQkJCSJ4ZnNfaWZvcm1hdCgpIHJldHVybmVkIGVycm9yICVkIiwKKwkJCQkJZXJyb3IpOworI2VuZGlmIC8qIERFQlVHICovCisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwl9IGVsc2UgeworCQlpcC0+aV9kLmRpX21hZ2ljID0gSU5UX0dFVChkaXAtPmRpX2NvcmUuZGlfbWFnaWMsIEFSQ0hfQ09OVkVSVCk7CisJCWlwLT5pX2QuZGlfdmVyc2lvbiA9IElOVF9HRVQoZGlwLT5kaV9jb3JlLmRpX3ZlcnNpb24sIEFSQ0hfQ09OVkVSVCk7CisJCWlwLT5pX2QuZGlfZ2VuID0gSU5UX0dFVChkaXAtPmRpX2NvcmUuZGlfZ2VuLCBBUkNIX0NPTlZFUlQpOworCQlpcC0+aV9kLmRpX2ZsdXNoaXRlciA9IElOVF9HRVQoZGlwLT5kaV9jb3JlLmRpX2ZsdXNoaXRlciwgQVJDSF9DT05WRVJUKTsKKwkJLyoKKwkJICogTWFrZSBzdXJlIHRvIHB1bGwgaW4gdGhlIG1vZGUgaGVyZSBhcyB3ZWxsIGluCisJCSAqIGNhc2UgdGhlIGlub2RlIGlzIHJlbGVhc2VkIHdpdGhvdXQgYmVpbmcgdXNlZC4KKwkJICogVGhpcyBlbnN1cmVzIHRoYXQgeGZzX2luYWN0aXZlKCkgd2lsbCBzZWUgdGhhdAorCQkgKiB0aGUgaW5vZGUgaXMgYWxyZWFkeSBmcmVlIGFuZCBub3QgdHJ5IHRvIG1lc3MKKwkJICogd2l0aCB0aGUgdW5pbml0aWFsaXplZCBwYXJ0IG9mIGl0LgorCQkgKi8KKwkJaXAtPmlfZC5kaV9tb2RlID0gMDsKKwkJLyoKKwkJICogSW5pdGlhbGl6ZSB0aGUgcGVyLWZvcmsgbWluaW1hIGFuZCBtYXhpbWEgZm9yIGEgbmV3CisJCSAqIGlub2RlIGhlcmUuICB4ZnNfaWZvcm1hdCB3aWxsIGRvIGl0IGZvciBvbGQgaW5vZGVzLgorCQkgKi8KKwkJaXAtPmlfZGYuaWZfZXh0X21heCA9CisJCQlYRlNfSUZPUktfRFNJWkUoaXApIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KTsKKwl9CisKKwlJTklUX0xJU1RfSEVBRCgmaXAtPmlfcmVjbGFpbSk7CisKKwkvKgorCSAqIFRoZSBpbm9kZSBmb3JtYXQgY2hhbmdlZCB3aGVuIHdlIG1vdmVkIHRoZSBsaW5rIGNvdW50IGFuZAorCSAqIG1hZGUgaXQgMzIgYml0cyBsb25nLiAgSWYgdGhpcyBpcyBhbiBvbGQgZm9ybWF0IGlub2RlLAorCSAqIGNvbnZlcnQgaXQgaW4gbWVtb3J5IHRvIGxvb2sgbGlrZSBhIG5ldyBvbmUuICBJZiBpdCBnZXRzCisJICogZmx1c2hlZCB0byBkaXNrIHdlIHdpbGwgY29udmVydCBiYWNrIGJlZm9yZSBmbHVzaGluZyBvcgorCSAqIGxvZ2dpbmcgaXQuICBXZSB6ZXJvIG91dCB0aGUgbmV3IHByb2ppZCBmaWVsZCBhbmQgdGhlIG9sZCBsaW5rCisJICogY291bnQgZmllbGQuICBXZSdsbCBoYW5kbGUgY2xlYXJpbmcgdGhlIHBhZCBmaWVsZCAodGhlIHJlbWFpbnMKKwkgKiBvZiB0aGUgb2xkIHV1aWQgZmllbGQpIHdoZW4gd2UgYWN0dWFsbHkgY29udmVydCB0aGUgaW5vZGUgdG8KKwkgKiB0aGUgbmV3IGZvcm1hdC4gV2UgZG9uJ3QgY2hhbmdlIHRoZSB2ZXJzaW9uIG51bWJlciBzbyB0aGF0IHdlCisJICogY2FuIGRpc3Rpbmd1aXNoIHRoaXMgZnJvbSBhIHJlYWwgbmV3IGZvcm1hdCBpbm9kZS4KKwkgKi8KKwlpZiAoaXAtPmlfZC5kaV92ZXJzaW9uID09IFhGU19ESU5PREVfVkVSU0lPTl8xKSB7CisJCWlwLT5pX2QuZGlfbmxpbmsgPSBpcC0+aV9kLmRpX29ubGluazsKKwkJaXAtPmlfZC5kaV9vbmxpbmsgPSAwOworCQlpcC0+aV9kLmRpX3Byb2ppZCA9IDA7CisJfQorCisJaXAtPmlfZGVsYXllZF9ibGtzID0gMDsKKworCS8qCisJICogTWFyayB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGlub2RlIGFzIHNvbWV0aGluZyB0byBrZWVwCisJICogYXJvdW5kIGZvciBhIHdoaWxlLiAgVGhpcyBoZWxwcyB0byBrZWVwIHJlY2VudGx5IGFjY2Vzc2VkCisJICogbWV0YS1kYXRhIGluLWNvcmUgbG9uZ2VyLgorCSAqLworCSBYRlNfQlVGX1NFVF9SRUYoYnAsIFhGU19JTk9fUkVGKTsKKworCS8qCisJICogVXNlIHhmc190cmFuc19icmVsc2UoKSB0byByZWxlYXNlIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUKKwkgKiBvbi1kaXNrIGlub2RlLCBiZWNhdXNlIGl0IHdhcyBhY3F1aXJlZCB3aXRoIHhmc190cmFuc19yZWFkX2J1ZigpCisJICogaW4geGZzX2l0b2JwKCkgYWJvdmUuICBJZiB0cCBpcyBOVUxMLCB0aGlzIGlzIGp1c3QgYSBub3JtYWwKKwkgKiBicmVsc2UoKS4gIElmIHdlJ3JlIHdpdGhpbiBhIHRyYW5zYWN0aW9uLCB0aGVuIHhmc190cmFuc19icmVsc2UoKQorCSAqIHdpbGwgb25seSByZWxlYXNlIHRoZSBidWZmZXIgaWYgaXQgaXMgbm90IGRpcnR5IHdpdGhpbiB0aGUKKwkgKiB0cmFuc2FjdGlvbi4gIEl0IHdpbGwgYmUgT0sgdG8gcmVsZWFzZSB0aGUgYnVmZmVyIGluIHRoaXMgY2FzZSwKKwkgKiBiZWNhdXNlIGlub2RlcyBvbiBkaXNrIGFyZSBuZXZlciBkZXN0cm95ZWQgYW5kIHdlIHdpbGwgYmUKKwkgKiBsb2NraW5nIHRoZSBuZXcgaW4tY29yZSBpbm9kZSBiZWZvcmUgcHV0dGluZyBpdCBpbiB0aGUgaGFzaAorCSAqIHRhYmxlIHdoZXJlIG90aGVyIHByb2Nlc3NlcyBjYW4gZmluZCBpdC4gIFRodXMgd2UgZG9uJ3QgaGF2ZQorCSAqIHRvIHdvcnJ5IGFib3V0IHRoZSBpbm9kZSBiZWluZyBjaGFuZ2VkIGp1c3QgYmVjYXVzZSB3ZSByZWxlYXNlZAorCSAqIHRoZSBidWZmZXIuCisJICovCisJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOworCSppcHAgPSBpcDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlYWQgaW4gZXh0ZW50cyBmcm9tIGEgYnRyZWUtZm9ybWF0IGlub2RlLgorICogQWxsb2NhdGUgYW5kIGZpbGwgaW4gaWZfZXh0ZW50cy4gIFJlYWwgd29yayBpcyBkb25lIGluIHhmc19ibWFwLmMuCisgKi8KK2ludAoreGZzX2lyZWFkX2V4dGVudHMoCisJeGZzX3RyYW5zX3QJKnRwLAorCXhmc19pbm9kZV90CSppcCwKKwlpbnQJCXdoaWNoZm9yaykKK3sKKwlpbnQJCWVycm9yOworCXhmc19pZm9ya190CSppZnA7CisJc2l6ZV90CQlzaXplOworCisJaWYgKHVubGlrZWx5KFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykgIT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUpKSB7CisJCVhGU19FUlJPUl9SRVBPUlQoInhmc19pcmVhZF9leHRlbnRzIiwgWEZTX0VSUkxFVkVMX0xPVywKKwkJCQkgaXAtPmlfbW91bnQpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJfQorCXNpemUgPSBYRlNfSUZPUktfTkVYVEVOVFMoaXAsIHdoaWNoZm9yaykgKiAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpOworCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7CisJLyoKKwkgKiBXZSBrbm93IHRoYXQgdGhlIHNpemUgaXMgdmFsaWQgKGl0J3MgY2hlY2tlZCBpbiBpZm9ybWF0X2J0cmVlKQorCSAqLworCWlmcC0+aWZfdTEuaWZfZXh0ZW50cyA9IGttZW1fYWxsb2Moc2l6ZSwgS01fU0xFRVApOworCUFTU0VSVChpZnAtPmlmX3UxLmlmX2V4dGVudHMgIT0gTlVMTCk7CisJaWZwLT5pZl9sYXN0ZXggPSBOVUxMRVhUTlVNOworCWlmcC0+aWZfYnl0ZXMgPSBpZnAtPmlmX3JlYWxfYnl0ZXMgPSAoaW50KXNpemU7CisJaWZwLT5pZl9mbGFncyB8PSBYRlNfSUZFWFRFTlRTOworCWVycm9yID0geGZzX2JtYXBfcmVhZF9leHRlbnRzKHRwLCBpcCwgd2hpY2hmb3JrKTsKKwlpZiAoZXJyb3IpIHsKKwkJa21lbV9mcmVlKGlmcC0+aWZfdTEuaWZfZXh0ZW50cywgc2l6ZSk7CisJCWlmcC0+aWZfdTEuaWZfZXh0ZW50cyA9IE5VTEw7CisJCWlmcC0+aWZfYnl0ZXMgPSBpZnAtPmlmX3JlYWxfYnl0ZXMgPSAwOworCQlpZnAtPmlmX2ZsYWdzICY9IH5YRlNfSUZFWFRFTlRTOworCQlyZXR1cm4gZXJyb3I7CisJfQorCXhmc192YWxpZGF0ZV9leHRlbnRzKCh4ZnNfYm1idF9yZWNfdCAqKWlmcC0+aWZfdTEuaWZfZXh0ZW50cywKKwkJWEZTX0lGT1JLX05FWFRFTlRTKGlwLCB3aGljaGZvcmspLCAwLCBYRlNfRVhURk1UX0lOT0RFKGlwKSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBhbiBpbm9kZSBvbiBkaXNrIGFuZCByZXR1cm4gYSBjb3B5IG9mIGl0cyBpbi1jb3JlIHZlcnNpb24uCisgKiBUaGUgaW4tY29yZSBpbm9kZSBpcyBsb2NrZWQgZXhjbHVzaXZlbHkuICBTZXQgbW9kZSwgbmxpbmssIGFuZCByZGV2CisgKiBhcHByb3ByaWF0ZWx5IHdpdGhpbiB0aGUgaW5vZGUuICBUaGUgdWlkIGFuZCBnaWQgZm9yIHRoZSBpbm9kZSBhcmUKKyAqIHNldCBhY2NvcmRpbmcgdG8gdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBjcmVkIHN0cnVjdHVyZS4KKyAqCisgKiBVc2UgeGZzX2RpYWxsb2MoKSB0byBhbGxvY2F0ZSB0aGUgb24tZGlzayBpbm9kZS4gSWYgeGZzX2RpYWxsb2MoKQorICogaGFzIGEgZnJlZSBpbm9kZSBhdmFpbGFibGUsIGNhbGwgeGZzX2lnZXQoKQorICogdG8gb2J0YWluIHRoZSBpbi1jb3JlIHZlcnNpb24gb2YgdGhlIGFsbG9jYXRlZCBpbm9kZS4gIEZpbmFsbHksCisgKiBmaWxsIGluIHRoZSBpbm9kZSBhbmQgbG9nIGl0cyBpbml0aWFsIGNvbnRlbnRzLiAgSW4gdGhpcyBjYXNlLAorICogaWFsbG9jX2NvbnRleHQgd291bGQgYmUgc2V0IHRvIE5VTEwgYW5kIGNhbGxfYWdhaW4gc2V0IHRvIGZhbHNlLgorICoKKyAqIElmIHhmc19kaWFsbG9jKCkgZG9lcyBub3QgaGF2ZSBhbiBhdmFpbGFibGUgaW5vZGUsCisgKiBpdCB3aWxsIHJlcGxlbmlzaCBpdHMgc3VwcGx5IGJ5IGRvaW5nIGFuIGFsbG9jYXRpb24uIFNpbmNlIHdlIGNhbgorICogb25seSBkbyBvbmUgYWxsb2NhdGlvbiB3aXRoaW4gYSB0cmFuc2FjdGlvbiB3aXRob3V0IGRlYWRsb2Nrcywgd2UKKyAqIG11c3QgY29tbWl0IHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGJlZm9yZSByZXR1cm5pbmcgdGhlIGlub2RlIGl0c2VsZi4KKyAqIEluIHRoaXMgY2FzZSwgdGhlcmVmb3JlLCB3ZSB3aWxsIHNldCBjYWxsX2FnYWluIHRvIHRydWUgYW5kIHJldHVybi4KKyAqIFRoZSBjYWxsZXIgc2hvdWxkIHRoZW4gY29tbWl0IHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uLCBzdGFydCBhIG5ldworICogdHJhbnNhY3Rpb24sIGFuZCBjYWxsIHhmc19pYWxsb2MoKSBhZ2FpbiB0byBhY3R1YWxseSBnZXQgdGhlIGlub2RlLgorICoKKyAqIFRvIGVuc3VyZSB0aGF0IHNvbWUgb3RoZXIgcHJvY2VzcyBkb2VzIG5vdCBncmFiIHRoZSBpbm9kZSB0aGF0CisgKiB3YXMgYWxsb2NhdGVkIGR1cmluZyB0aGUgZmlyc3QgY2FsbCB0byB4ZnNfaWFsbG9jKCksIHRoaXMgcm91dGluZQorICogYWxzbyByZXR1cm5zIHRoZSBbbG9ja2VkXSBicCBwb2ludGluZyB0byB0aGUgaGVhZCBvZiB0aGUgZnJlZWxpc3QKKyAqIGFzIGlhbGxvY19jb250ZXh0LiAgVGhlIGNhbGxlciBzaG91bGQgaG9sZCB0aGlzIGJ1ZmZlciBhY3Jvc3MKKyAqIHRoZSBjb21taXQgYW5kIHBhc3MgaXQgYmFjayBpbnRvIHRoaXMgcm91dGluZSBvbiB0aGUgc2Vjb25kIGNhbGwuCisgKi8KK2ludAoreGZzX2lhbGxvYygKKwl4ZnNfdHJhbnNfdAkqdHAsCisJeGZzX2lub2RlX3QJKnBpcCwKKwltb2RlX3QJCW1vZGUsCisJbmxpbmtfdAkJbmxpbmssCisJeGZzX2Rldl90CXJkZXYsCisJY3JlZF90CQkqY3IsCisJeGZzX3ByaWRfdAlwcmlkLAorCWludAkJb2thbGxvYywKKwl4ZnNfYnVmX3QJKippYWxsb2NfY29udGV4dCwKKwlib29sZWFuX3QJKmNhbGxfYWdhaW4sCisJeGZzX2lub2RlX3QJKippcHApCit7CisJeGZzX2lub190CWlubzsKKwl4ZnNfaW5vZGVfdAkqaXA7CisJdm5vZGVfdAkJKnZwOworCXVpbnQJCWZsYWdzOworCWludAkJZXJyb3I7CisKKwkvKgorCSAqIENhbGwgdGhlIHNwYWNlIG1hbmFnZW1lbnQgY29kZSB0byBwaWNrCisJICogdGhlIG9uLWRpc2sgaW5vZGUgdG8gYmUgYWxsb2NhdGVkLgorCSAqLworCWVycm9yID0geGZzX2RpYWxsb2ModHAsIHBpcC0+aV9pbm8sIG1vZGUsIG9rYWxsb2MsCisJCQkgICAgaWFsbG9jX2NvbnRleHQsIGNhbGxfYWdhaW4sICZpbm8pOworCWlmIChlcnJvciAhPSAwKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJaWYgKCpjYWxsX2FnYWluIHx8IGlubyA9PSBOVUxMRlNJTk8pIHsKKwkJKmlwcCA9IE5VTEw7CisJCXJldHVybiAwOworCX0KKwlBU1NFUlQoKmlhbGxvY19jb250ZXh0ID09IE5VTEwpOworCisJLyoKKwkgKiBHZXQgdGhlIGluLWNvcmUgaW5vZGUgd2l0aCB0aGUgbG9jayBoZWxkIGV4Y2x1c2l2ZWx5LgorCSAqIFRoaXMgaXMgYmVjYXVzZSB3ZSdyZSBzZXR0aW5nIGZpZWxkcyBoZXJlIHdlIG5lZWQKKwkgKiB0byBwcmV2ZW50IG90aGVycyBmcm9tIGxvb2tpbmcgYXQgdW50aWwgd2UncmUgZG9uZS4KKwkgKi8KKwllcnJvciA9IHhmc190cmFuc19pZ2V0KHRwLT50X21vdW50cCwgdHAsIGlubywKKwkJCUlHRVRfQ1JFQVRFLCBYRlNfSUxPQ0tfRVhDTCwgJmlwKTsKKwlpZiAoZXJyb3IgIT0gMCkgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCUFTU0VSVChpcCAhPSBOVUxMKTsKKworCXZwID0gWEZTX0lUT1YoaXApOworCXZwLT52X3R5cGUgPSBJRlRPVlQobW9kZSk7CisJaXAtPmlfZC5kaV9tb2RlID0gKF9fdWludDE2X3QpbW9kZTsKKwlpcC0+aV9kLmRpX29ubGluayA9IDA7CisJaXAtPmlfZC5kaV9ubGluayA9IG5saW5rOworCUFTU0VSVChpcC0+aV9kLmRpX25saW5rID09IG5saW5rKTsKKwlpcC0+aV9kLmRpX3VpZCA9IGN1cnJlbnRfZnN1aWQoY3IpOworCWlwLT5pX2QuZGlfZ2lkID0gY3VycmVudF9mc2dpZChjcik7CisJaXAtPmlfZC5kaV9wcm9qaWQgPSBwcmlkOworCW1lbXNldCgmKGlwLT5pX2QuZGlfcGFkWzBdKSwgMCwgc2l6ZW9mKGlwLT5pX2QuZGlfcGFkKSk7CisKKwkvKgorCSAqIElmIHRoZSBzdXBlcmJsb2NrIHZlcnNpb24gaXMgdXAgdG8gd2hlcmUgd2Ugc3VwcG9ydCBuZXcgZm9ybWF0CisJICogaW5vZGVzIGFuZCB0aGlzIGlzIGN1cnJlbnRseSBhbiBvbGQgZm9ybWF0IGlub2RlLCB0aGVuIGNoYW5nZQorCSAqIHRoZSBpbm9kZSB2ZXJzaW9uIG51bWJlciBub3cuICBUaGlzIHdheSB3ZSBvbmx5IGRvIHRoZSBjb252ZXJzaW9uCisJICogaGVyZSByYXRoZXIgdGhhbiBoZXJlIGFuZCBpbiB0aGUgZmx1c2gvbG9nZ2luZyBjb2RlLgorCSAqLworCWlmIChYRlNfU0JfVkVSU0lPTl9IQVNOTElOSygmdHAtPnRfbW91bnRwLT5tX3NiKSAmJgorCSAgICBpcC0+aV9kLmRpX3ZlcnNpb24gPT0gWEZTX0RJTk9ERV9WRVJTSU9OXzEpIHsKKwkJaXAtPmlfZC5kaV92ZXJzaW9uID0gWEZTX0RJTk9ERV9WRVJTSU9OXzI7CisJCS8qCisJCSAqIFdlJ3ZlIGFscmVhZHkgemVyb2VkIHRoZSBvbGQgbGluayBjb3VudCwgdGhlIHByb2ppZCBmaWVsZCwKKwkJICogYW5kIHRoZSBwYWQgZmllbGQuCisJCSAqLworCX0KKworCS8qCisJICogUHJvamVjdCBpZHMgd29uJ3QgYmUgc3RvcmVkIG9uIGRpc2sgaWYgd2UgYXJlIHVzaW5nIGEgdmVyc2lvbiAxIGlub2RlLgorCSAqLworCWlmICggKHByaWQgIT0gMCkgJiYgKGlwLT5pX2QuZGlfdmVyc2lvbiA9PSBYRlNfRElOT0RFX1ZFUlNJT05fMSkpCisJCXhmc19idW1wX2lub192ZXJzMih0cCwgaXApOworCisJaWYgKFhGU19JTkhFUklUX0dJRChwaXAsIHZwLT52X3Zmc3ApKSB7CisJCWlwLT5pX2QuZGlfZ2lkID0gcGlwLT5pX2QuZGlfZ2lkOworCQlpZiAoKHBpcC0+aV9kLmRpX21vZGUgJiBTX0lTR0lEKSAmJiAobW9kZSAmIFNfSUZNVCkgPT0gU19JRkRJUikgeworCQkJaXAtPmlfZC5kaV9tb2RlIHw9IFNfSVNHSUQ7CisJCX0KKwl9CisKKwkvKgorCSAqIElmIHRoZSBncm91cCBJRCBvZiB0aGUgbmV3IGZpbGUgZG9lcyBub3QgbWF0Y2ggdGhlIGVmZmVjdGl2ZSBncm91cAorCSAqIElEIG9yIG9uZSBvZiB0aGUgc3VwcGxlbWVudGFyeSBncm91cCBJRHMsIHRoZSBTX0lTR0lEIGJpdCBpcyBjbGVhcmVkCisJICogKGFuZCBvbmx5IGlmIHRoZSBpcml4X3NnaWRfaW5oZXJpdCBjb21wYXRpYmlsaXR5IHZhcmlhYmxlIGlzIHNldCkuCisJICovCisJaWYgKChpcml4X3NnaWRfaW5oZXJpdCkgJiYKKwkgICAgKGlwLT5pX2QuZGlfbW9kZSAmIFNfSVNHSUQpICYmCisJICAgICghaW5fZ3JvdXBfcCgoZ2lkX3QpaXAtPmlfZC5kaV9naWQpKSkgeworCQlpcC0+aV9kLmRpX21vZGUgJj0gflNfSVNHSUQ7CisJfQorCisJaXAtPmlfZC5kaV9zaXplID0gMDsKKwlpcC0+aV9kLmRpX25leHRlbnRzID0gMDsKKwlBU1NFUlQoaXAtPmlfZC5kaV9uYmxvY2tzID09IDApOworCXhmc19pY2hndGltZShpcCwgWEZTX0lDSEdUSU1FX0NIR3xYRlNfSUNIR1RJTUVfQUNDfFhGU19JQ0hHVElNRV9NT0QpOworCS8qCisJICogZGlfZ2VuIHdpbGwgaGF2ZSBiZWVuIHRha2VuIGNhcmUgb2YgaW4geGZzX2lyZWFkLgorCSAqLworCWlwLT5pX2QuZGlfZXh0c2l6ZSA9IDA7CisJaXAtPmlfZC5kaV9kbWV2bWFzayA9IDA7CisJaXAtPmlfZC5kaV9kbXN0YXRlID0gMDsKKwlpcC0+aV9kLmRpX2ZsYWdzID0gMDsKKwlmbGFncyA9IFhGU19JTE9HX0NPUkU7CisJc3dpdGNoIChtb2RlICYgU19JRk1UKSB7CisJY2FzZSBTX0lGSUZPOgorCWNhc2UgU19JRkNIUjoKKwljYXNlIFNfSUZCTEs6CisJY2FzZSBTX0lGU09DSzoKKwkJaXAtPmlfZC5kaV9mb3JtYXQgPSBYRlNfRElOT0RFX0ZNVF9ERVY7CisJCWlwLT5pX2RmLmlmX3UyLmlmX3JkZXYgPSByZGV2OworCQlpcC0+aV9kZi5pZl9mbGFncyA9IDA7CisJCWZsYWdzIHw9IFhGU19JTE9HX0RFVjsKKwkJYnJlYWs7CisJY2FzZSBTX0lGUkVHOgorCWNhc2UgU19JRkRJUjoKKwkJaWYgKHVubGlrZWx5KHBpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19BTlkpKSB7CisJCQlpZiAocGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX1JUSU5IRVJJVCkgeworCQkJCWlmICgobW9kZSAmIFNfSUZNVCkgPT0gU19JRkRJUikgeworCQkJCQlpcC0+aV9kLmRpX2ZsYWdzIHw9IFhGU19ESUZMQUdfUlRJTkhFUklUOworCQkJCX0gZWxzZSB7CisJCQkJCWlwLT5pX2QuZGlfZmxhZ3MgfD0gWEZTX0RJRkxBR19SRUFMVElNRTsKKwkJCQkJaXAtPmlfaW9jb3JlLmlvX2ZsYWdzIHw9IFhGU19JT0NPUkVfUlQ7CisJCQkJfQorCQkJfQorCQkJaWYgKChwaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfTk9BVElNRSkgJiYKKwkJCSAgICB4ZnNfaW5oZXJpdF9ub2F0aW1lKQorCQkJCWlwLT5pX2QuZGlfZmxhZ3MgfD0gWEZTX0RJRkxBR19OT0FUSU1FOworCQkJaWYgKChwaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfTk9EVU1QKSAmJgorCQkJICAgIHhmc19pbmhlcml0X25vZHVtcCkKKwkJCQlpcC0+aV9kLmRpX2ZsYWdzIHw9IFhGU19ESUZMQUdfTk9EVU1QOworCQkJaWYgKChwaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfU1lOQykgJiYKKwkJCSAgICB4ZnNfaW5oZXJpdF9zeW5jKQorCQkJCWlwLT5pX2QuZGlfZmxhZ3MgfD0gWEZTX0RJRkxBR19TWU5DOworCQkJaWYgKChwaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfTk9TWU1MSU5LUykgJiYKKwkJCSAgICB4ZnNfaW5oZXJpdF9ub3N5bWxpbmtzKQorCQkJCWlwLT5pX2QuZGlfZmxhZ3MgfD0gWEZTX0RJRkxBR19OT1NZTUxJTktTOworCQl9CisJCS8qIEZBTExUSFJPVUdIICovCisJY2FzZSBTX0lGTE5LOgorCQlpcC0+aV9kLmRpX2Zvcm1hdCA9IFhGU19ESU5PREVfRk1UX0VYVEVOVFM7CisJCWlwLT5pX2RmLmlmX2ZsYWdzID0gWEZTX0lGRVhURU5UUzsKKwkJaXAtPmlfZGYuaWZfYnl0ZXMgPSBpcC0+aV9kZi5pZl9yZWFsX2J5dGVzID0gMDsKKwkJaXAtPmlfZGYuaWZfdTEuaWZfZXh0ZW50cyA9IE5VTEw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUFTU0VSVCgwKTsKKwl9CisJLyoKKwkgKiBBdHRyaWJ1dGUgZm9yayBzZXR0aW5ncyBmb3IgbmV3IGlub2RlLgorCSAqLworCWlwLT5pX2QuZGlfYWZvcm1hdCA9IFhGU19ESU5PREVfRk1UX0VYVEVOVFM7CisJaXAtPmlfZC5kaV9hbmV4dGVudHMgPSAwOworCisJLyoKKwkgKiBMb2cgdGhlIG5ldyB2YWx1ZXMgc3R1ZmZlZCBpbnRvIHRoZSBpbm9kZS4KKwkgKi8KKwl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgZmxhZ3MpOworCisJLyogbm93IHRoYXQgd2UgaGF2ZSBhIHZfdHlwZSB3ZSBjYW4gc2V0IExpbnV4IGlub2RlIG9wcyAoJiB1bmxvY2spICovCisJVkZTX0lOSVRfVk5PREUoWEZTX01UT1ZGUyh0cC0+dF9tb3VudHApLCB2cCwgWEZTX0lUT0JIVihpcCksIDEpOworCisJKmlwcCA9IGlwOworCXJldHVybiAwOworfQorCisvKgorICogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgdGhlcmUgYXJlIG5vIGJsb2NrcyBhbGxvY2F0ZWQgdG8gdGhlCisgKiBmaWxlIGJleW9uZCB0aGUgc2l6ZSBvZiB0aGUgZmlsZS4gIFdlIGRvbid0IGNoZWNrIHRoaXMgZm9yCisgKiBmaWxlcyB3aXRoIGZpeGVkIHNpemUgZXh0ZW50cyBvciByZWFsIHRpbWUgZXh0ZW50cywgYnV0IHdlCisgKiBhdCBsZWFzdCBkbyBpdCBmb3IgcmVndWxhciBmaWxlcy4KKyAqLworI2lmZGVmIERFQlVHCit2b2lkCit4ZnNfaXNpemVfY2hlY2soCisJeGZzX21vdW50X3QJKm1wLAorCXhmc19pbm9kZV90CSppcCwKKwl4ZnNfZnNpemVfdAlpc2l6ZSkKK3sKKwl4ZnNfZmlsZW9mZl90CW1hcF9maXJzdDsKKwlpbnQJCW5pbWFwczsKKwl4ZnNfYm1idF9pcmVjX3QJaW1hcHNbMl07CisKKwlpZiAoKGlwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgIT0gU19JRlJFRykKKwkJcmV0dXJuOworCisJaWYgKCBpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19SRUFMVElNRSApCisJCXJldHVybjsKKworCW5pbWFwcyA9IDI7CisJbWFwX2ZpcnN0ID0gWEZTX0JfVE9fRlNCKG1wLCAoeGZzX3Vmc2l6ZV90KWlzaXplKTsKKwkvKgorCSAqIFRoZSBmaWxlc3lzdGVtIGNvdWxkIGJlIHNodXR0aW5nIGRvd24sIHNvIGJtYXBpIG1heSByZXR1cm4KKwkgKiBhbiBlcnJvci4KKwkgKi8KKwlpZiAoeGZzX2JtYXBpKE5VTEwsIGlwLCBtYXBfZmlyc3QsCisJCQkgKFhGU19CX1RPX0ZTQihtcCwKKwkJCQkgICAgICAgKHhmc191ZnNpemVfdClYRlNfTUFYSU9GRlNFVChtcCkpIC0KKwkJCSAgbWFwX2ZpcnN0KSwKKwkJCSBYRlNfQk1BUElfRU5USVJFLCBOVUxMLCAwLCBpbWFwcywgJm5pbWFwcywKKwkJCSBOVUxMKSkKKwkgICAgcmV0dXJuOworCUFTU0VSVChuaW1hcHMgPT0gMSk7CisJQVNTRVJUKGltYXBzWzBdLmJyX3N0YXJ0YmxvY2sgPT0gSE9MRVNUQVJUQkxPQ0spOworfQorI2VuZGlmCS8qIERFQlVHICovCisKKy8qCisgKiBDYWxjdWxhdGUgdGhlIGxhc3QgcG9zc2libGUgYnVmZmVyZWQgYnl0ZSBpbiBhIGZpbGUuICBUaGlzIG11c3QKKyAqIGluY2x1ZGUgZGF0YSB0aGF0IHdhcyBidWZmZXJlZCBiZXlvbmQgdGhlIEVPRiBieSB0aGUgd3JpdGUgY29kZS4KKyAqIFRoaXMgYWxzbyBuZWVkcyB0byBkZWFsIHdpdGggb3ZlcmZsb3dpbmcgdGhlIHhmc19mc2l6ZV90IHR5cGUKKyAqIHdoaWNoIGNhbiBoYXBwZW4gZm9yIHNpemVzIG5lYXIgdGhlIGxpbWl0LgorICoKKyAqIFdlIGFsc28gbmVlZCB0byB0YWtlIGludG8gYWNjb3VudCBhbnkgYmxvY2tzIGJleW9uZCB0aGUgRU9GLiAgSXQKKyAqIG1heSBiZSB0aGUgY2FzZSB0aGF0IHRoZXkgd2VyZSBidWZmZXJlZCBieSBhIHdyaXRlIHdoaWNoIGZhaWxlZC4KKyAqIEluIHRoYXQgY2FzZSB0aGUgcGFnZXMgd2lsbCBzdGlsbCBiZSBpbiBtZW1vcnksIGJ1dCB0aGUgaW5vZGUgc2l6ZQorICogd2lsbCBuZXZlciBoYXZlIGJlZW4gdXBkYXRlZC4KKyAqLworeGZzX2ZzaXplX3QKK3hmc19maWxlX2xhc3RfYnl0ZSgKKwl4ZnNfaW5vZGVfdAkqaXApCit7CisJeGZzX21vdW50X3QJKm1wOworCXhmc19mc2l6ZV90CWxhc3RfYnl0ZTsKKwl4ZnNfZmlsZW9mZl90CWxhc3RfYmxvY2s7CisJeGZzX2ZpbGVvZmZfdAlzaXplX2xhc3RfYmxvY2s7CisJaW50CQllcnJvcjsKKworCUFTU0VSVChpc21ybG9ja2VkKCYoaXAtPmlfaW9sb2NrKSwgTVJfVVBEQVRFIHwgTVJfQUNDRVNTKSk7CisKKwltcCA9IGlwLT5pX21vdW50OworCS8qCisJICogT25seSBjaGVjayBmb3IgYmxvY2tzIGJleW9uZCB0aGUgRU9GIGlmIHRoZSBleHRlbnRzIGhhdmUKKwkgKiBiZWVuIHJlYWQgaW4uICBUaGlzIGVsaW1pbmF0ZXMgdGhlIG5lZWQgZm9yIHRoZSBpbm9kZSBsb2NrLAorCSAqIGFuZCBpdCBhbHNvIHNhdmVzIHVzIGZyb20gbG9va2luZyB3aGVuIGl0IHJlYWxseSBpc24ndAorCSAqIG5lY2Vzc2FyeS4KKwkgKi8KKwlpZiAoaXAtPmlfZGYuaWZfZmxhZ3MgJiBYRlNfSUZFWFRFTlRTKSB7CisJCWVycm9yID0geGZzX2JtYXBfbGFzdF9vZmZzZXQoTlVMTCwgaXAsICZsYXN0X2Jsb2NrLAorCQkJWEZTX0RBVEFfRk9SSyk7CisJCWlmIChlcnJvcikgeworCQkJbGFzdF9ibG9jayA9IDA7CisJCX0KKwl9IGVsc2UgeworCQlsYXN0X2Jsb2NrID0gMDsKKwl9CisJc2l6ZV9sYXN0X2Jsb2NrID0gWEZTX0JfVE9fRlNCKG1wLCAoeGZzX3Vmc2l6ZV90KWlwLT5pX2QuZGlfc2l6ZSk7CisJbGFzdF9ibG9jayA9IFhGU19GSUxFT0ZGX01BWChsYXN0X2Jsb2NrLCBzaXplX2xhc3RfYmxvY2spOworCisJbGFzdF9ieXRlID0gWEZTX0ZTQl9UT19CKG1wLCBsYXN0X2Jsb2NrKTsKKwlpZiAobGFzdF9ieXRlIDwgMCkgeworCQlyZXR1cm4gWEZTX01BWElPRkZTRVQobXApOworCX0KKwlsYXN0X2J5dGUgKz0gKDEgPDwgbXAtPm1fd3JpdGVpb19sb2cpOworCWlmIChsYXN0X2J5dGUgPCAwKSB7CisJCXJldHVybiBYRlNfTUFYSU9GRlNFVChtcCk7CisJfQorCXJldHVybiBsYXN0X2J5dGU7Cit9CisKKyNpZiBkZWZpbmVkKFhGU19SV19UUkFDRSkKK1NUQVRJQyB2b2lkCit4ZnNfaXRydW5jX3RyYWNlKAorCWludAkJdGFnLAorCXhmc19pbm9kZV90CSppcCwKKwlpbnQJCWZsYWcsCisJeGZzX2ZzaXplX3QJbmV3X3NpemUsCisJeGZzX29mZl90CXRvc3Nfc3RhcnQsCisJeGZzX29mZl90CXRvc3NfZmluaXNoKQoreworCWlmIChpcC0+aV9yd3RyYWNlID09IE5VTEwpIHsKKwkJcmV0dXJuOworCX0KKworCWt0cmFjZV9lbnRlcihpcC0+aV9yd3RyYWNlLAorCQkgICAgICh2b2lkKikoKGxvbmcpdGFnKSwKKwkJICAgICAodm9pZCopaXAsCisJCSAgICAgKHZvaWQqKSh1bnNpZ25lZCBsb25nKSgoaXAtPmlfZC5kaV9zaXplID4+IDMyKSAmIDB4ZmZmZmZmZmYpLAorCQkgICAgICh2b2lkKikodW5zaWduZWQgbG9uZykoaXAtPmlfZC5kaV9zaXplICYgMHhmZmZmZmZmZiksCisJCSAgICAgKHZvaWQqKSgobG9uZylmbGFnKSwKKwkJICAgICAodm9pZCopKHVuc2lnbmVkIGxvbmcpKChuZXdfc2l6ZSA+PiAzMikgJiAweGZmZmZmZmZmKSwKKwkJICAgICAodm9pZCopKHVuc2lnbmVkIGxvbmcpKG5ld19zaXplICYgMHhmZmZmZmZmZiksCisJCSAgICAgKHZvaWQqKSh1bnNpZ25lZCBsb25nKSgodG9zc19zdGFydCA+PiAzMikgJiAweGZmZmZmZmZmKSwKKwkJICAgICAodm9pZCopKHVuc2lnbmVkIGxvbmcpKHRvc3Nfc3RhcnQgJiAweGZmZmZmZmZmKSwKKwkJICAgICAodm9pZCopKHVuc2lnbmVkIGxvbmcpKCh0b3NzX2ZpbmlzaCA+PiAzMikgJiAweGZmZmZmZmZmKSwKKwkJICAgICAodm9pZCopKHVuc2lnbmVkIGxvbmcpKHRvc3NfZmluaXNoICYgMHhmZmZmZmZmZiksCisJCSAgICAgKHZvaWQqKSh1bnNpZ25lZCBsb25nKWN1cnJlbnRfY3B1KCksCisJCSAgICAgKHZvaWQqKTAsCisJCSAgICAgKHZvaWQqKTAsCisJCSAgICAgKHZvaWQqKTAsCisJCSAgICAgKHZvaWQqKTApOworfQorI2Vsc2UKKyNkZWZpbmUJeGZzX2l0cnVuY190cmFjZSh0YWcsIGlwLCBmbGFnLCBuZXdfc2l6ZSwgdG9zc19zdGFydCwgdG9zc19maW5pc2gpCisjZW5kaWYKKworLyoKKyAqIFN0YXJ0IHRoZSB0cnVuY2F0aW9uIG9mIHRoZSBmaWxlIHRvIG5ld19zaXplLiAgVGhlIG5ldyBzaXplCisgKiBtdXN0IGJlIHNtYWxsZXIgdGhhbiB0aGUgY3VycmVudCBzaXplLiAgVGhpcyByb3V0aW5lIHdpbGwKKyAqIGNsZWFyIHRoZSBidWZmZXIgYW5kIHBhZ2UgY2FjaGVzIG9mIGZpbGUgZGF0YSBpbiB0aGUgcmVtb3ZlZAorICogcmFuZ2UsIGFuZCB4ZnNfaXRydW5jYXRlX2ZpbmlzaCgpIHdpbGwgcmVtb3ZlIHRoZSB1bmRlcmx5aW5nCisgKiBkaXNrIGJsb2Nrcy4KKyAqCisgKiBUaGUgaW5vZGUgbXVzdCBoYXZlIGl0cyBJL08gbG9jayBsb2NrZWQgRVhDTFVTSVZFTFksIGFuZCBpdAorICogbXVzdCBOT1QgaGF2ZSB0aGUgaW5vZGUgbG9jayBoZWxkIGF0IGFsbC4gIFRoaXMgaXMgYmVjYXVzZSB3ZSdyZQorICogY2FsbGluZyBpbnRvIHRoZSBidWZmZXIvcGFnZSBjYWNoZSBjb2RlIGFuZCB3ZSBjYW4ndCBob2xkIHRoZQorICogaW5vZGUgbG9jayB3aGVuIHdlIGRvIHNvLgorICoKKyAqIFRoZSBmbGFncyBwYXJhbWV0ZXIgY2FuIGhhdmUgZWl0aGVyIHRoZSB2YWx1ZSBYRlNfSVRSVU5DX0RFRklOSVRFCisgKiBvciBYRlNfSVRSVU5DX01BWUJFLiAgVGhlIFhGU19JVFJVTkNfTUFZQkUgdmFsdWUgc2hvdWxkIGJlIHVzZWQKKyAqIGluIHRoZSBjYXNlIHRoYXQgdGhlIGNhbGxlciBpcyBsb2NraW5nIHRoaW5ncyBvdXQgb2Ygb3JkZXIgYW5kCisgKiBtYXkgbm90IGJlIGFibGUgdG8gY2FsbCB4ZnNfaXRydW5jYXRlX2ZpbmlzaCgpIHdpdGggdGhlIGlub2RlIGxvY2sKKyAqIGhlbGQgd2l0aG91dCBkcm9wcGluZyB0aGUgSS9PIGxvY2suICBJZiB0aGUgY2FsbGVyIG11c3QgZHJvcCB0aGUKKyAqIEkvTyBsb2NrIGJlZm9yZSBjYWxsaW5nIHhmc19pdHJ1bmNhdGVfZmluaXNoKCksIHRoZW4geGZzX2l0cnVuY2F0ZV9zdGFydCgpCisgKiBtdXN0IGJlIGNhbGxlZCBhZ2FpbiB3aXRoIGFsbCB0aGUgc2FtZSByZXN0cmljdGlvbnMgYXMgdGhlIGluaXRpYWwKKyAqIGNhbGwuCisgKi8KK3ZvaWQKK3hmc19pdHJ1bmNhdGVfc3RhcnQoCisJeGZzX2lub2RlX3QJKmlwLAorCXVpbnQJCWZsYWdzLAorCXhmc19mc2l6ZV90CW5ld19zaXplKQoreworCXhmc19mc2l6ZV90CWxhc3RfYnl0ZTsKKwl4ZnNfb2ZmX3QJdG9zc19zdGFydDsKKwl4ZnNfbW91bnRfdAkqbXA7CisJdm5vZGVfdAkJKnZwOworCisJQVNTRVJUKGlzbXJsb2NrZWQoJmlwLT5pX2lvbG9jaywgTVJfVVBEQVRFKSAhPSAwKTsKKwlBU1NFUlQoKG5ld19zaXplID09IDApIHx8IChuZXdfc2l6ZSA8PSBpcC0+aV9kLmRpX3NpemUpKTsKKwlBU1NFUlQoKGZsYWdzID09IFhGU19JVFJVTkNfREVGSU5JVEUpIHx8CisJICAgICAgIChmbGFncyA9PSBYRlNfSVRSVU5DX01BWUJFKSk7CisKKwltcCA9IGlwLT5pX21vdW50OworCXZwID0gWEZTX0lUT1YoaXApOworCS8qCisJICogQ2FsbCBWT1BfVE9TU19QQUdFUygpIG9yIFZPUF9GTFVTSElOVkFMX1BBR0VTKCkgdG8gZ2V0IHJpZCBvZiBwYWdlcyBhbmQgYnVmZmVycworCSAqIG92ZXJsYXBwaW5nIHRoZSByZWdpb24gYmVpbmcgcmVtb3ZlZC4gIFdlIGhhdmUgdG8gdXNlCisJICogdGhlIGxlc3MgZWZmaWNpZW50IFZPUF9GTFVTSElOVkFMX1BBR0VTKCkgaW4gdGhlIGNhc2UgdGhhdCB0aGUKKwkgKiBjYWxsZXIgbWF5IG5vdCBiZSBhYmxlIHRvIGZpbmlzaCB0aGUgdHJ1bmNhdGUgd2l0aG91dAorCSAqIGRyb3BwaW5nIHRoZSBpbm9kZSdzIEkvTyBsb2NrLiAgTWFrZSBzdXJlCisJICogdG8gY2F0Y2ggYW55IHBhZ2VzIGJyb3VnaHQgaW4gYnkgYnVmZmVycyBvdmVybGFwcGluZworCSAqIHRoZSBFT0YgYnkgc2VhcmNoaW5nIG91dCBiZXlvbmQgdGhlIGlzaXplIGJ5IG91cgorCSAqIGJsb2NrIHNpemUuIFdlIHJvdW5kIG5ld19zaXplIHVwIHRvIGEgYmxvY2sgYm91bmRhcnkKKwkgKiBzbyB0aGF0IHdlIGRvbid0IHRvc3MgdGhpbmdzIG9uIHRoZSBzYW1lIGJsb2NrIGFzCisJICogbmV3X3NpemUgYnV0IGJlZm9yZSBpdC4KKwkgKgorCSAqIEJlZm9yZSBjYWxsaW5nIFZPUF9UT1NTX1BBR0VTKCkgb3IgVk9QX0ZMVVNISU5WQUxfUEFHRVMoKSwgbWFrZSBzdXJlIHRvCisJICogY2FsbCByZW1hcGYoKSBvdmVyIHRoZSBzYW1lIHJlZ2lvbiBpZiB0aGUgZmlsZSBpcyBtYXBwZWQuCisJICogVGhpcyBmcmVlcyB1cCBtYXBwZWQgZmlsZSByZWZlcmVuY2VzIHRvIHRoZSBwYWdlcyBpbiB0aGUKKwkgKiBnaXZlbiByYW5nZSBhbmQgZm9yIHRoZSBWT1BfRkxVU0hJTlZBTF9QQUdFUygpIGNhc2UgaXQgZW5zdXJlcworCSAqIHRoYXQgd2UgZ2V0IHRoZSBsYXRlc3QgbWFwcGVkIGNoYW5nZXMgZmx1c2hlZCBvdXQuCisJICovCisJdG9zc19zdGFydCA9IFhGU19CX1RPX0ZTQihtcCwgKHhmc191ZnNpemVfdCluZXdfc2l6ZSk7CisJdG9zc19zdGFydCA9IFhGU19GU0JfVE9fQihtcCwgdG9zc19zdGFydCk7CisJaWYgKHRvc3Nfc3RhcnQgPCAwKSB7CisJCS8qCisJCSAqIFRoZSBwbGFjZSB0byBzdGFydCB0b3NzaW5nIGlzIGJleW9uZCBvdXIgbWF4aW11bQorCQkgKiBmaWxlIHNpemUsIHNvIHRoZXJlIGlzIG5vIHdheSB0aGF0IHRoZSBkYXRhIGV4dGVuZGVkCisJCSAqIG91dCB0aGVyZS4KKwkJICovCisJCXJldHVybjsKKwl9CisJbGFzdF9ieXRlID0geGZzX2ZpbGVfbGFzdF9ieXRlKGlwKTsKKwl4ZnNfaXRydW5jX3RyYWNlKFhGU19JVFJVTkNfU1RBUlQsIGlwLCBmbGFncywgbmV3X3NpemUsIHRvc3Nfc3RhcnQsCisJCQkgbGFzdF9ieXRlKTsKKwlpZiAobGFzdF9ieXRlID4gdG9zc19zdGFydCkgeworCQlpZiAoZmxhZ3MgJiBYRlNfSVRSVU5DX0RFRklOSVRFKSB7CisJCQlWT1BfVE9TU19QQUdFUyh2cCwgdG9zc19zdGFydCwgLTEsIEZJX1JFTUFQRl9MT0NLRUQpOworCQl9IGVsc2UgeworCQkJVk9QX0ZMVVNISU5WQUxfUEFHRVModnAsIHRvc3Nfc3RhcnQsIC0xLCBGSV9SRU1BUEZfTE9DS0VEKTsKKwkJfQorCX0KKworI2lmZGVmIERFQlVHCisJaWYgKG5ld19zaXplID09IDApIHsKKwkJQVNTRVJUKFZOX0NBQ0hFRCh2cCkgPT0gMCk7CisJfQorI2VuZGlmCit9CisKKy8qCisgKiBTaHJpbmsgdGhlIGZpbGUgdG8gdGhlIGdpdmVuIG5ld19zaXplLiAgVGhlIG5ldworICogc2l6ZSBtdXN0IGJlIHNtYWxsZXIgdGhhbiB0aGUgY3VycmVudCBzaXplLgorICogVGhpcyB3aWxsIGZyZWUgdXAgdGhlIHVuZGVybHlpbmcgYmxvY2tzCisgKiBpbiB0aGUgcmVtb3ZlZCByYW5nZSBhZnRlciBhIGNhbGwgdG8geGZzX2l0cnVuY2F0ZV9zdGFydCgpCisgKiBvciB4ZnNfYXRydW5jYXRlX3N0YXJ0KCkuCisgKgorICogVGhlIHRyYW5zYWN0aW9uIHBhc3NlZCB0byB0aGlzIHJvdXRpbmUgbXVzdCBoYXZlIG1hZGUKKyAqIGEgcGVybWFuZW50IGxvZyByZXNlcnZhdGlvbiBvZiBhdCBsZWFzdCBYRlNfSVRSVU5DQVRFX0xPR19SRVMuCisgKiBUaGlzIHJvdXRpbmUgbWF5IGNvbW1pdCB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24gYW5kCisgKiBzdGFydCBuZXcgb25lcywgc28gbWFrZSBzdXJlIGV2ZXJ5dGhpbmcgaW52b2x2ZWQgaW4KKyAqIHRoZSB0cmFuc2FjdGlvbiBpcyB0aWR5IGJlZm9yZSBjYWxsaW5nIGhlcmUuCisgKiBTb21lIHRyYW5zYWN0aW9uIHdpbGwgYmUgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciB0byBiZQorICogY29tbWl0dGVkLiAgVGhlIGluY29taW5nIHRyYW5zYWN0aW9uIG11c3QgYWxyZWFkeSBpbmNsdWRlCisgKiB0aGUgaW5vZGUsIGFuZCBib3RoIGlub2RlIGxvY2tzIG11c3QgYmUgaGVsZCBleGNsdXNpdmVseS4KKyAqIFRoZSBpbm9kZSBtdXN0IGFsc28gYmUgImhlbGQiIHdpdGhpbiB0aGUgdHJhbnNhY3Rpb24uICBPbgorICogcmV0dXJuIHRoZSBpbm9kZSB3aWxsIGJlICJoZWxkIiB3aXRoaW4gdGhlIHJldHVybmVkIHRyYW5zYWN0aW9uLgorICogVGhpcyByb3V0aW5lIGRvZXMgTk9UIHJlcXVpcmUgYW55IGRpc2sgc3BhY2UgdG8gYmUgcmVzZXJ2ZWQKKyAqIGZvciBpdCB3aXRoaW4gdGhlIHRyYW5zYWN0aW9uLgorICoKKyAqIFRoZSBmb3JrIHBhcmFtZXRlciBtdXN0IGJlIGVpdGhlciB4ZnNfYXR0cl9mb3JrIG9yIHhmc19kYXRhX2ZvcmssCisgKiBhbmQgaXQgaW5kaWNhdGVzIHRoZSBmb3JrIHdoaWNoIGlzIHRvIGJlIHRydW5jYXRlZC4gIEZvciB0aGUKKyAqIGF0dHJpYnV0ZSBmb3JrIHdlIG9ubHkgc3VwcG9ydCB0cnVuY2F0aW9uIHRvIHNpemUgMC4KKyAqCisgKiBXZSB1c2UgdGhlIHN5bmMgcGFyYW1ldGVyIHRvIGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoZSBmaXJzdAorICogdHJhbnNhY3Rpb24gd2UgcGVyZm9ybSBtaWdodCBoYXZlIHRvIGJlIHN5bmNocm9ub3VzLiAgRm9yIHRoZSBhdHRyIGZvcmssCisgKiBpdCBuZWVkcyB0byBiZSBzbyBpZiB0aGUgdW5saW5rIG9mIHRoZSBpbm9kZSBpcyBub3QgeWV0IGtub3duIHRvIGJlCisgKiBwZXJtYW5lbnQgaW4gdGhlIGxvZy4gIFRoaXMga2VlcHMgdXMgZnJvbSBmcmVlaW5nIGFuZCByZXVzaW5nIHRoZQorICogYmxvY2tzIG9mIHRoZSBhdHRyaWJ1dGUgZm9yayBiZWZvcmUgdGhlIHVubGluayBvZiB0aGUgaW5vZGUgYmVjb21lcworICogcGVybWFuZW50LgorICoKKyAqIEZvciB0aGUgZGF0YSBmb3JrLCB3ZSBub3JtYWxseSBoYXZlIHRvIHJ1biBzeW5jaHJvbm91c2x5IGlmIHdlJ3JlCisgKiBiZWluZyBjYWxsZWQgb3V0IG9mIHRoZSBpbmFjdGl2ZSBwYXRoIG9yIHdlJ3JlIGJlaW5nIGNhbGxlZAorICogb3V0IG9mIHRoZSBjcmVhdGUgcGF0aCB3aGVyZSB3ZSdyZSB0cnVuY2F0aW5nIGFuIGV4aXN0aW5nIGZpbGUuCisgKiBFaXRoZXIgd2F5LCB0aGUgdHJ1bmNhdGUgbmVlZHMgdG8gYmUgc3luYyBzbyBibG9ja3MgZG9uJ3QgcmVhcHBlYXIKKyAqIGluIHRoZSBmaWxlIHdpdGggYWx0ZXJlZCBkYXRhIGluIGNhc2Ugb2YgYSBjcmFzaC4gIHdzeW5jIGZpbGVzeXN0ZW1zCisgKiBjYW4gcnVuIHRoZSBmaXJzdCBjYXNlIGFzeW5jIGJlY2F1c2UgYW55dGhpbmcgdGhhdCBzaHJpbmtzIHRoZSBpbm9kZQorICogaGFzIHRvIHJ1biBzeW5jIHNvIGJ5IHRoZSB0aW1lIHdlJ3JlIGNhbGxlZCBoZXJlIGZyb20gaW5hY3RpdmUsIHRoZQorICogaW5vZGUgc2l6ZSBpcyBwZXJtYW5lbnRseSBzZXQgdG8gMC4KKyAqCisgKiBDYWxscyBmcm9tIHRoZSB0cnVuY2F0ZSBwYXRoIGFsd2F5cyBuZWVkIHRvIGJlIHN5bmMgdW5sZXNzIHdlJ3JlCisgKiBpbiBhIHdzeW5jIGZpbGVzeXN0ZW0gYW5kIHRoZSBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gdW5saW5rZWQuCisgKgorICogVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY29ycmVjdGx5IHNldHRpbmcgdGhlIHN5bmMgcGFyYW1ldGVyLgorICogSXQgZ2V0cyB0b28gaGFyZCBmb3IgdXMgdG8gZ3Vlc3MgaGVyZSB3aGljaCBwYXRoIHdlJ3JlIGJlaW5nIGNhbGxlZAorICogb3V0IG9mIGp1c3QgYmFzZWQgb24gaW5vZGUgc3RhdGUuCisgKi8KK2ludAoreGZzX2l0cnVuY2F0ZV9maW5pc2goCisJeGZzX3RyYW5zX3QJKip0cCwKKwl4ZnNfaW5vZGVfdAkqaXAsCisJeGZzX2ZzaXplX3QJbmV3X3NpemUsCisJaW50CQlmb3JrLAorCWludAkJc3luYykKK3sKKwl4ZnNfZnNibG9ja190CWZpcnN0X2Jsb2NrOworCXhmc19maWxlb2ZmX3QJZmlyc3RfdW5tYXBfYmxvY2s7CisJeGZzX2ZpbGVvZmZfdAlsYXN0X2Jsb2NrOworCXhmc19maWxibGtzX3QJdW5tYXBfbGVuPTA7CisJeGZzX21vdW50X3QJKm1wOworCXhmc190cmFuc190CSpudHA7CisJaW50CQlkb25lOworCWludAkJY29tbWl0dGVkOworCXhmc19ibWFwX2ZyZWVfdAlmcmVlX2xpc3Q7CisJaW50CQllcnJvcjsKKworCUFTU0VSVChpc21ybG9ja2VkKCZpcC0+aV9pb2xvY2ssIE1SX1VQREFURSkgIT0gMCk7CisJQVNTRVJUKGlzbXJsb2NrZWQoJmlwLT5pX2xvY2ssIE1SX1VQREFURSkgIT0gMCk7CisJQVNTRVJUKChuZXdfc2l6ZSA9PSAwKSB8fCAobmV3X3NpemUgPD0gaXAtPmlfZC5kaV9zaXplKSk7CisJQVNTRVJUKCp0cCAhPSBOVUxMKTsKKwlBU1NFUlQoKCp0cCktPnRfZmxhZ3MgJiBYRlNfVFJBTlNfUEVSTV9MT0dfUkVTKTsKKwlBU1NFUlQoaXAtPmlfdHJhbnNwID09ICp0cCk7CisJQVNTRVJUKGlwLT5pX2l0ZW1wICE9IE5VTEwpOworCUFTU0VSVChpcC0+aV9pdGVtcC0+aWxpX2ZsYWdzICYgWEZTX0lMSV9IT0xEKTsKKworCisJbnRwID0gKnRwOworCW1wID0gKG50cCktPnRfbW91bnRwOworCUFTU0VSVCghIFhGU19OT1RfRFFBVFRBQ0hFRChtcCwgaXApKTsKKworCS8qCisJICogV2Ugb25seSBzdXBwb3J0IHRydW5jYXRpbmcgdGhlIGVudGlyZSBhdHRyaWJ1dGUgZm9yay4KKwkgKi8KKwlpZiAoZm9yayA9PSBYRlNfQVRUUl9GT1JLKSB7CisJCW5ld19zaXplID0gMExMOworCX0KKwlmaXJzdF91bm1hcF9ibG9jayA9IFhGU19CX1RPX0ZTQihtcCwgKHhmc191ZnNpemVfdCluZXdfc2l6ZSk7CisJeGZzX2l0cnVuY190cmFjZShYRlNfSVRSVU5DX0ZJTklTSDEsIGlwLCAwLCBuZXdfc2l6ZSwgMCwgMCk7CisJLyoKKwkgKiBUaGUgZmlyc3QgdGhpbmcgd2UgZG8gaXMgc2V0IHRoZSBzaXplIHRvIG5ld19zaXplIHBlcm1hbmVudGx5CisJICogb24gZGlzay4gIFRoaXMgd2F5IHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgYW55b25lIGV2ZXIKKwkgKiBiZWluZyBhYmxlIHRvIGxvb2sgYXQgdGhlIGRhdGEgYmVpbmcgZnJlZWQgZXZlbiBpbiB0aGUgZmFjZQorCSAqIG9mIGEgY3Jhc2guICBXaGF0IHdlJ3JlIGdldHRpbmcgYXJvdW5kIGhlcmUgaXMgdGhlIGNhc2Ugd2hlcmUKKwkgKiB3ZSBmcmVlIGEgYmxvY2ssIGl0IGlzIGFsbG9jYXRlZCB0byBhbm90aGVyIGZpbGUsIGl0IGlzIHdyaXR0ZW4KKwkgKiB0bywgYW5kIHRoZW4gd2UgY3Jhc2guICBJZiB0aGUgbmV3IGRhdGEgZ2V0cyB3cml0dGVuIHRvIHRoZQorCSAqIGZpbGUgYnV0IHRoZSBsb2cgYnVmZmVycyBjb250YWluaW5nIHRoZSBmcmVlIGFuZCByZWFsbG9jYXRpb24KKwkgKiBkb24ndCwgdGhlbiB3ZSdkIGVuZCB1cCB3aXRoIGdhcmJhZ2UgaW4gdGhlIGJsb2NrcyBiZWluZyBmcmVlZC4KKwkgKiBBcyBsb25nIGFzIHdlIG1ha2UgdGhlIG5ld19zaXplIHBlcm1hbmVudCBiZWZvcmUgYWN0dWFsbHkKKwkgKiBmcmVlaW5nIGFueSBibG9ja3MgaXQgZG9lc24ndCBtYXR0ZXIgaWYgdGhleSBnZXQgd3JpdHR0ZW4gdG8uCisJICoKKwkgKiBUaGUgY2FsbGVycyBtdXN0IHNpZ25hbCBpbnRvIHVzIHdoZXRoZXIgb3Igbm90IHRoZSBzaXplCisJICogc2V0dGluZyBoZXJlIG11c3QgYmUgc3luY2hyb25vdXMuICBUaGVyZSBhcmUgYSBmZXcgY2FzZXMKKwkgKiB3aGVyZSBpdCBkb2Vzbid0IGhhdmUgdG8gYmUgc3luY2hyb25vdXMuICBUaG9zZSBjYXNlcworCSAqIG9jY3VyIGlmIHRoZSBmaWxlIGlzIHVubGlua2VkIGFuZCB3ZSBrbm93IHRoZSB1bmxpbmsgaXMKKwkgKiBwZXJtYW5lbnQgb3IgaWYgdGhlIGJsb2NrcyBiZWluZyB0cnVuY2F0ZWQgYXJlIGd1YXJhbnRlZWQKKwkgKiB0byBiZSBiZXlvbmQgdGhlIGlub2RlIGVvZiAocmVnYXJkbGVzcyBvZiB0aGUgbGluayBjb3VudCkKKwkgKiBhbmQgdGhlIGVvZiB2YWx1ZSBpcyBwZXJtYW5lbnQuICBCb3RoIG9mIHRoZXNlIGNhc2VzIG9jY3VyCisJICogb25seSBvbiB3c3luYy1tb3VudGVkIGZpbGVzeXN0ZW1zLiAgSW4gdGhvc2UgY2FzZXMsIHdlJ3JlCisJICogZ3VhcmFudGVlZCB0aGF0IG5vIHVzZXIgd2lsbCBldmVyIHNlZSB0aGUgZGF0YSBpbiB0aGUgYmxvY2tzCisJICogdGhhdCBhcmUgYmVpbmcgdHJ1bmNhdGVkIHNvIHRoZSB0cnVuY2F0ZSBjYW4gcnVuIGFzeW5jLgorCSAqIEluIHRoZSBmcmVlIGJleW9uZCBlb2YgY2FzZSwgdGhlIGZpbGUgbWF5IHdpbmQgdXAgd2l0aAorCSAqIG1vcmUgYmxvY2tzIGFsbG9jYXRlZCB0byBpdCB0aGFuIGl0IG5lZWRzIGlmIHdlIGNyYXNoCisJICogYW5kIHRoYXQgd29uJ3QgZ2V0IGZpeGVkIHVudGlsIHRoZSBuZXh0IHRpbWUgdGhlIGZpbGUKKwkgKiBpcyByZS1vcGVuZWQgYW5kIGNsb3NlZCBidXQgdGhhdCdzIG9rIGFzIHRoYXQgc2hvdWxkbid0CisJICogYmUgdG9vIG1hbnkgYmxvY2tzLgorCSAqCisJICogSG93ZXZlciwgd2UgY2FuJ3QganVzdCBtYWtlIGFsbCB3c3luYyB4YWN0aW9ucyBydW4gYXN5bmMKKwkgKiBiZWNhdXNlIHRoZXJlJ3Mgb25lIGNhbGwgb3V0IG9mIHRoZSBjcmVhdGUgcGF0aCB0aGF0IG5lZWRzCisJICogdG8gcnVuIHN5bmMgd2hlcmUgaXQncyB0cnVuY2F0aW5nIGFuIGV4aXN0aW5nIGZpbGUgdG8gc2l6ZQorCSAqIDAgd2hvc2Ugc2l6ZSBpcyA+IDAuCisJICoKKwkgKiBJdCdzIHByb2JhYmx5IHBvc3NpYmxlIHRvIGNvbWUgdXAgd2l0aCBhIHRlc3QgaW4gdGhpcworCSAqIHJvdXRpbmUgdGhhdCB3b3VsZCBjb3JyZWN0bHkgZGlzdGluZ3Vpc2ggYWxsIHRoZSBhYm92ZQorCSAqIGNhc2VzIGZyb20gdGhlIHZhbHVlcyBvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBhbmQgdGhlCisJICogaW5vZGUgc3RhdGUgYnV0IGZvciBzYW5pdHkncyBzYWtlLCBJJ3ZlIGRlY2lkZWQgdG8gbGV0IHRoZQorCSAqIGxheWVycyBhYm92ZSBqdXN0IHRlbGwgdXMuICBJdCdzIHNpbXBsZXIgdG8gY29ycmVjdGx5IGZpZ3VyZQorCSAqIG91dCBpbiB0aGUgbGF5ZXIgYWJvdmUgZXhhY3RseSB1bmRlciB3aGF0IGNvbmRpdGlvbnMgd2UKKwkgKiBjYW4gcnVuIGFzeW5jIGFuZCBJIHRoaW5rIGl0J3MgZWFzaWVyIGZvciBvdGhlcnMgcmVhZCBhbmQKKwkgKiBmb2xsb3cgdGhlIGxvZ2ljIGluIGNhc2Ugc29tZXRoaW5nIGhhcyB0byBiZSBjaGFuZ2VkLgorCSAqIGNzY29wZSBpcyB5b3VyIGZyaWVuZCAtLSByY2MuCisJICoKKwkgKiBUaGUgYXR0cmlidXRlIGZvcmsgaXMgbXVjaCBzaW1wbGVyLgorCSAqCisJICogRm9yIHRoZSBhdHRyaWJ1dGUgZm9yayB3ZSBhbGxvdyB0aGUgY2FsbGVyIHRvIHRlbGwgdXMgd2hldGhlcgorCSAqIHRoZSB1bmxpbmsgb2YgdGhlIGlub2RlIHRoYXQgbGVkIHRvIHRoaXMgY2FsbCBpcyB5ZXQgcGVybWFuZW50CisJICogaW4gdGhlIG9uIGRpc2sgbG9nLiAgSWYgaXQgaXMgbm90IGFuZCB3ZSB3aWxsIGJlIGZyZWVpbmcgZXh0ZW50cworCSAqIGluIHRoaXMgaW5vZGUgdGhlbiB3ZSBtYWtlIHRoZSBmaXJzdCB0cmFuc2FjdGlvbiBzeW5jaHJvbm91cworCSAqIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB1bmxpbmsgaXMgcGVybWFuZW50IGJ5IHRoZSB0aW1lIHdlIGZyZWUKKwkgKiB0aGUgYmxvY2tzLgorCSAqLworCWlmIChmb3JrID09IFhGU19EQVRBX0ZPUkspIHsKKwkJaWYgKGlwLT5pX2QuZGlfbmV4dGVudHMgPiAwKSB7CisJCQlpcC0+aV9kLmRpX3NpemUgPSBuZXdfc2l6ZTsKKwkJCXhmc190cmFuc19sb2dfaW5vZGUobnRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CisJCX0KKwl9IGVsc2UgaWYgKHN5bmMpIHsKKwkJQVNTRVJUKCEobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfV1NZTkMpKTsKKwkJaWYgKGlwLT5pX2QuZGlfYW5leHRlbnRzID4gMCkKKwkJCXhmc190cmFuc19zZXRfc3luYyhudHApOworCX0KKwlBU1NFUlQoZm9yayA9PSBYRlNfREFUQV9GT1JLIHx8CisJCShmb3JrID09IFhGU19BVFRSX0ZPUksgJiYKKwkJCSgoc3luYyAmJiAhKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX1dTWU5DKSkgfHwKKwkJCSAoc3luYyA9PSAwICYmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9XU1lOQykpKSkpOworCisJLyoKKwkgKiBTaW5jZSBpdCBpcyBwb3NzaWJsZSBmb3Igc3BhY2UgdG8gYmVjb21lIGFsbG9jYXRlZCBiZXlvbmQKKwkgKiB0aGUgZW5kIG9mIHRoZSBmaWxlIChpbiBhIGNyYXNoIHdoZXJlIHRoZSBzcGFjZSBpcyBhbGxvY2F0ZWQKKwkgKiBidXQgdGhlIGlub2RlIHNpemUgaXMgbm90IHlldCB1cGRhdGVkKSwgc2ltcGx5IHJlbW92ZSBhbnkKKwkgKiBibG9ja3Mgd2hpY2ggc2hvdyB1cCBiZXR3ZWVuIHRoZSBuZXcgRU9GIGFuZCB0aGUgbWF4aW11bQorCSAqIHBvc3NpYmxlIGZpbGUgc2l6ZS4gIElmIHRoZSBmaXJzdCBibG9jayB0byBiZSByZW1vdmVkIGlzCisJICogYmV5b25kIHRoZSBtYXhpbXVtIGZpbGUgc2l6ZSAoaWUgaXQgaXMgdGhlIHNhbWUgYXMgbGFzdF9ibG9jayksCisJICogdGhlbiB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLgorCSAqLworCWxhc3RfYmxvY2sgPSBYRlNfQl9UT19GU0IobXAsICh4ZnNfdWZzaXplX3QpWEZTX01BWElPRkZTRVQobXApKTsKKwlBU1NFUlQoZmlyc3RfdW5tYXBfYmxvY2sgPD0gbGFzdF9ibG9jayk7CisJZG9uZSA9IDA7CisJaWYgKGxhc3RfYmxvY2sgPT0gZmlyc3RfdW5tYXBfYmxvY2spIHsKKwkJZG9uZSA9IDE7CisJfSBlbHNlIHsKKwkJdW5tYXBfbGVuID0gbGFzdF9ibG9jayAtIGZpcnN0X3VubWFwX2Jsb2NrICsgMTsKKwl9CisJd2hpbGUgKCFkb25lKSB7CisJCS8qCisJCSAqIEZyZWUgdXAgdXAgdG8gWEZTX0lUUlVOQ19NQVhfRVhURU5UUy4gIHhmc19idW5tYXBpKCkKKwkJICogd2lsbCB0ZWxsIHVzIHdoZXRoZXIgaXQgZnJlZWQgdGhlIGVudGlyZSByYW5nZSBvcgorCQkgKiBub3QuICBJZiB0aGlzIGlzIGEgc3luY2hyb25vdXMgbW91bnQgKHdzeW5jKSwKKwkJICogdGhlbiB3ZSBjYW4gdGVsbCBidW5tYXBpIHRvIGtlZXAgYWxsIHRoZQorCQkgKiB0cmFuc2FjdGlvbnMgYXN5bmNocm9ub3VzIHNpbmNlIHRoZSB1bmxpbmsKKwkJICogdHJhbnNhY3Rpb24gdGhhdCBtYWRlIHRoaXMgaW5vZGUgaW5hY3RpdmUgaGFzCisJCSAqIGFscmVhZHkgaGl0IHRoZSBkaXNrLiAgVGhlcmUncyBubyBkYW5nZXIgb2YKKwkJICogdGhlIGZyZWVkIGJsb2NrcyBiZWluZyByZXVzZWQsIHRoZXJlIGJlaW5nIGEKKwkJICogY3Jhc2gsIGFuZCB0aGUgcmV1c2VkIGJsb2NrcyBzdWRkZW5seSByZWFwcGVhcmluZworCQkgKiBpbiB0aGlzIGZpbGUgd2l0aCBnYXJiYWdlIGluIHRoZW0gb25jZSByZWNvdmVyeQorCQkgKiBydW5zLgorCQkgKi8KKwkJWEZTX0JNQVBfSU5JVCgmZnJlZV9saXN0LCAmZmlyc3RfYmxvY2spOworCQllcnJvciA9IHhmc19idW5tYXBpKG50cCwgaXAsIGZpcnN0X3VubWFwX2Jsb2NrLAorCQkJCSAgICB1bm1hcF9sZW4sCisJCQkJICAgIFhGU19CTUFQSV9BRkxBRyhmb3JrKSB8CisJCQkJICAgICAgKHN5bmMgPyAwIDogWEZTX0JNQVBJX0FTWU5DKSwKKwkJCQkgICAgWEZTX0lUUlVOQ19NQVhfRVhURU5UUywKKwkJCQkgICAgJmZpcnN0X2Jsb2NrLCAmZnJlZV9saXN0LCAmZG9uZSk7CisJCWlmIChlcnJvcikgeworCQkJLyoKKwkJCSAqIElmIHRoZSBidW5tYXBpIGNhbGwgZW5jb3VudGVycyBhbiBlcnJvciwKKwkJCSAqIHJldHVybiB0byB0aGUgY2FsbGVyIHdoZXJlIHRoZSB0cmFuc2FjdGlvbgorCQkJICogY2FuIGJlIHByb3Blcmx5IGFib3J0ZWQuICBXZSBqdXN0IG5lZWQgdG8KKwkJCSAqIG1ha2Ugc3VyZSB3ZSdyZSBub3QgaG9sZGluZyBhbnkgcmVzb3VyY2VzCisJCQkgKiB0aGF0IHdlIHdlcmUgbm90IHdoZW4gd2UgY2FtZSBpbi4KKwkJCSAqLworCQkJeGZzX2JtYXBfY2FuY2VsKCZmcmVlX2xpc3QpOworCQkJcmV0dXJuIGVycm9yOworCQl9CisKKwkJLyoKKwkJICogRHVwbGljYXRlIHRoZSB0cmFuc2FjdGlvbiB0aGF0IGhhcyB0aGUgcGVybWFuZW50CisJCSAqIHJlc2VydmF0aW9uIGFuZCBjb21taXQgdGhlIG9sZCB0cmFuc2FjdGlvbi4KKwkJICovCisJCWVycm9yID0geGZzX2JtYXBfZmluaXNoKHRwLCAmZnJlZV9saXN0LCBmaXJzdF9ibG9jaywKKwkJCQkJJmNvbW1pdHRlZCk7CisJCW50cCA9ICp0cDsKKwkJaWYgKGVycm9yKSB7CisJCQkvKgorCQkJICogSWYgdGhlIGJtYXAgZmluaXNoIGNhbGwgZW5jb3VudGVycyBhbiBlcnJvciwKKwkJCSAqIHJldHVybiB0byB0aGUgY2FsbGVyIHdoZXJlIHRoZSB0cmFuc2FjdGlvbgorCQkJICogY2FuIGJlIHByb3Blcmx5IGFib3J0ZWQuICBXZSBqdXN0IG5lZWQgdG8KKwkJCSAqIG1ha2Ugc3VyZSB3ZSdyZSBub3QgaG9sZGluZyBhbnkgcmVzb3VyY2VzCisJCQkgKiB0aGF0IHdlIHdlcmUgbm90IHdoZW4gd2UgY2FtZSBpbi4KKwkJCSAqCisJCQkgKiBBYm9ydGluZyBmcm9tIHRoaXMgcG9pbnQgbWlnaHQgbG9zZSBzb21lCisJCQkgKiBibG9ja3MgaW4gdGhlIGZpbGUgc3lzdGVtLCBidXQgb2ggd2VsbC4KKwkJCSAqLworCQkJeGZzX2JtYXBfY2FuY2VsKCZmcmVlX2xpc3QpOworCQkJaWYgKGNvbW1pdHRlZCkgeworCQkJCS8qCisJCQkJICogSWYgdGhlIHBhc3NlZCBpbiB0cmFuc2FjdGlvbiBjb21taXR0ZWQKKwkJCQkgKiBpbiB4ZnNfYm1hcF9maW5pc2goKSwgdGhlbiB3ZSB3YW50IHRvCisJCQkJICogYWRkIHRoZSBpbm9kZSB0byB0aGlzIG9uZSBiZWZvcmUgcmV0dXJuaW5nLgorCQkJCSAqIFRoaXMga2VlcHMgdGhpbmdzIHNpbXBsZSBmb3IgdGhlIGhpZ2hlcgorCQkJCSAqIGxldmVsIGNvZGUsIGJlY2F1c2UgaXQgYWx3YXlzIGtub3dzIHRoYXQKKwkJCQkgKiB0aGUgaW5vZGUgaXMgbG9ja2VkIGFuZCBoZWxkIGluIHRoZQorCQkJCSAqIHRyYW5zYWN0aW9uIHRoYXQgcmV0dXJucyB0byBpdCB3aGV0aGVyCisJCQkJICogZXJyb3JzIG9jY3VyIG9yIG5vdC4gIFdlIGRvbid0IG1hcmsgdGhlCisJCQkJICogaW5vZGUgZGlydHkgc28gdGhhdCB0aGlzIHRyYW5zYWN0aW9uIGNhbgorCQkJCSAqIGJlIGVhc2lseSBhYm9ydGVkIGlmIHBvc3NpYmxlLgorCQkJCSAqLworCQkJCXhmc190cmFuc19pam9pbihudHAsIGlwLAorCQkJCQlYRlNfSUxPQ0tfRVhDTCB8IFhGU19JT0xPQ0tfRVhDTCk7CisJCQkJeGZzX3RyYW5zX2lob2xkKG50cCwgaXApOworCQkJfQorCQkJcmV0dXJuIGVycm9yOworCQl9CisKKwkJaWYgKGNvbW1pdHRlZCkgeworCQkJLyoKKwkJCSAqIFRoZSBmaXJzdCB4YWN0IHdhcyBjb21taXR0ZWQsCisJCQkgKiBzbyBhZGQgdGhlIGlub2RlIHRvIHRoZSBuZXcgb25lLgorCQkJICogTWFyayBpdCBkaXJ0eSBzbyBpdCB3aWxsIGJlIGxvZ2dlZAorCQkJICogYW5kIG1vdmVkIGZvcndhcmQgaW4gdGhlIGxvZyBhcworCQkJICogcGFydCBvZiBldmVyeSBjb21taXQuCisJCQkgKi8KKwkJCXhmc190cmFuc19pam9pbihudHAsIGlwLAorCQkJCQlYRlNfSUxPQ0tfRVhDTCB8IFhGU19JT0xPQ0tfRVhDTCk7CisJCQl4ZnNfdHJhbnNfaWhvbGQobnRwLCBpcCk7CisJCQl4ZnNfdHJhbnNfbG9nX2lub2RlKG50cCwgaXAsIFhGU19JTE9HX0NPUkUpOworCQl9CisJCW50cCA9IHhmc190cmFuc19kdXAobnRwKTsKKwkJKHZvaWQpIHhmc190cmFuc19jb21taXQoKnRwLCAwLCBOVUxMKTsKKwkJKnRwID0gbnRwOworCQllcnJvciA9IHhmc190cmFuc19yZXNlcnZlKG50cCwgMCwgWEZTX0lUUlVOQ0FURV9MT0dfUkVTKG1wKSwgMCwKKwkJCQkJICBYRlNfVFJBTlNfUEVSTV9MT0dfUkVTLAorCQkJCQkgIFhGU19JVFJVTkNBVEVfTE9HX0NPVU5UKTsKKwkJLyoKKwkJICogQWRkIHRoZSBpbm9kZSBiZWluZyB0cnVuY2F0ZWQgdG8gdGhlIG5leHQgY2hhaW5lZAorCQkgKiB0cmFuc2FjdGlvbi4KKwkJICovCisJCXhmc190cmFuc19pam9pbihudHAsIGlwLCBYRlNfSUxPQ0tfRVhDTCB8IFhGU19JT0xPQ0tfRVhDTCk7CisJCXhmc190cmFuc19paG9sZChudHAsIGlwKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIChlcnJvcik7CisJfQorCS8qCisJICogT25seSB1cGRhdGUgdGhlIHNpemUgaW4gdGhlIGNhc2Ugb2YgdGhlIGRhdGEgZm9yaywgYnV0CisJICogYWx3YXlzIHJlLWxvZyB0aGUgaW5vZGUgc28gdGhhdCBvdXIgcGVybWFuZW50IHRyYW5zYWN0aW9uCisJICogY2FuIGtlZXAgb24gcm9sbGluZyBpdCBmb3J3YXJkIGluIHRoZSBsb2cuCisJICovCisJaWYgKGZvcmsgPT0gWEZTX0RBVEFfRk9SSykgeworCQl4ZnNfaXNpemVfY2hlY2sobXAsIGlwLCBuZXdfc2l6ZSk7CisJCWlwLT5pX2QuZGlfc2l6ZSA9IG5ld19zaXplOworCX0KKwl4ZnNfdHJhbnNfbG9nX2lub2RlKG50cCwgaXAsIFhGU19JTE9HX0NPUkUpOworCUFTU0VSVCgobmV3X3NpemUgIT0gMCkgfHwKKwkgICAgICAgKGZvcmsgPT0gWEZTX0FUVFJfRk9SSykgfHwKKwkgICAgICAgKGlwLT5pX2RlbGF5ZWRfYmxrcyA9PSAwKSk7CisJQVNTRVJUKChuZXdfc2l6ZSAhPSAwKSB8fAorCSAgICAgICAoZm9yayA9PSBYRlNfQVRUUl9GT1JLKSB8fAorCSAgICAgICAoaXAtPmlfZC5kaV9uZXh0ZW50cyA9PSAwKSk7CisJeGZzX2l0cnVuY190cmFjZShYRlNfSVRSVU5DX0ZJTklTSDIsIGlwLCAwLCBuZXdfc2l6ZSwgMCwgMCk7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIHhmc19pZ3Jvd19zdGFydAorICoKKyAqIERvIHRoZSBmaXJzdCBwYXJ0IG9mIGdyb3dpbmcgYSBmaWxlOiB6ZXJvIGFueSBkYXRhIGluIHRoZSBsYXN0CisgKiBibG9jayB0aGF0IGlzIGJleW9uZCB0aGUgb2xkIEVPRi4gIFdlIG5lZWQgdG8gZG8gdGhpcyBiZWZvcmUKKyAqIHRoZSBpbm9kZSBpcyBqb2luZWQgdG8gdGhlIHRyYW5zYWN0aW9uIHRvIG1vZGlmeSB0aGUgaV9zaXplLgorICogVGhhdCB3YXkgd2UgY2FuIGRyb3AgdGhlIGlub2RlIGxvY2sgYW5kIGNhbGwgaW50byB0aGUgYnVmZmVyCisgKiBjYWNoZSB0byBnZXQgdGhlIGJ1ZmZlciBtYXBwaW5nIHRoZSBFT0YuCisgKi8KK2ludAoreGZzX2lncm93X3N0YXJ0KAorCXhmc19pbm9kZV90CSppcCwKKwl4ZnNfZnNpemVfdAluZXdfc2l6ZSwKKwljcmVkX3QJCSpjcmVkcCkKK3sKKwl4ZnNfZnNpemVfdAlpc2l6ZTsKKwlpbnQJCWVycm9yOworCisJQVNTRVJUKGlzbXJsb2NrZWQoJihpcC0+aV9sb2NrKSwgTVJfVVBEQVRFKSAhPSAwKTsKKwlBU1NFUlQoaXNtcmxvY2tlZCgmKGlwLT5pX2lvbG9jayksIE1SX1VQREFURSkgIT0gMCk7CisJQVNTRVJUKG5ld19zaXplID4gaXAtPmlfZC5kaV9zaXplKTsKKworCWVycm9yID0gMDsKKwlpc2l6ZSA9IGlwLT5pX2QuZGlfc2l6ZTsKKwkvKgorCSAqIFplcm8gYW55IHBhZ2VzIHRoYXQgbWF5IGhhdmUgYmVlbiBjcmVhdGVkIGJ5CisJICogeGZzX3dyaXRlX2ZpbGUoKSBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgZmlsZQorCSAqIGFuZCBhbnkgYmxvY2tzIGJldHdlZW4gdGhlIG9sZCBhbmQgbmV3IGZpbGUgc2l6ZXMuCisJICovCisJZXJyb3IgPSB4ZnNfemVyb19lb2YoWEZTX0lUT1YoaXApLCAmaXAtPmlfaW9jb3JlLCBuZXdfc2l6ZSwgaXNpemUsCisJCQkJbmV3X3NpemUpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIHhmc19pZ3Jvd19maW5pc2gKKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGV4dGVuZCB0aGUgc2l6ZSBvZiBhIGZpbGUuCisgKiBUaGUgaW5vZGUgbXVzdCBoYXZlIGJvdGggdGhlIGlvbG9jayBhbmQgdGhlIGlsb2NrIGxvY2tlZAorICogZm9yIHVwZGF0ZSBhbmQgaXQgbXVzdCBiZSBhIHBhcnQgb2YgdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24uCisgKiBUaGUgeGZzX2lncm93X3N0YXJ0KCkgZnVuY3Rpb24gbXVzdCBoYXZlIGJlZW4gY2FsbGVkIHByZXZpb3VzbHkuCisgKiBJZiB0aGUgY2hhbmdlX2ZsYWcgaXMgbm90IHplcm8sIHRoZSBpbm9kZSBjaGFuZ2UgdGltZXN0YW1wIHdpbGwKKyAqIGJlIHVwZGF0ZWQuCisgKi8KK3ZvaWQKK3hmc19pZ3Jvd19maW5pc2goCisJeGZzX3RyYW5zX3QJKnRwLAorCXhmc19pbm9kZV90CSppcCwKKwl4ZnNfZnNpemVfdAluZXdfc2l6ZSwKKwlpbnQJCWNoYW5nZV9mbGFnKQoreworCUFTU0VSVChpc21ybG9ja2VkKCYoaXAtPmlfbG9jayksIE1SX1VQREFURSkgIT0gMCk7CisJQVNTRVJUKGlzbXJsb2NrZWQoJihpcC0+aV9pb2xvY2spLCBNUl9VUERBVEUpICE9IDApOworCUFTU0VSVChpcC0+aV90cmFuc3AgPT0gdHApOworCUFTU0VSVChuZXdfc2l6ZSA+IGlwLT5pX2QuZGlfc2l6ZSk7CisKKwkvKgorCSAqIFVwZGF0ZSB0aGUgZmlsZSBzaXplLiAgVXBkYXRlIHRoZSBpbm9kZSBjaGFuZ2UgdGltZXN0YW1wCisJICogaWYgY2hhbmdlX2ZsYWcgc2V0LgorCSAqLworCWlwLT5pX2QuZGlfc2l6ZSA9IG5ld19zaXplOworCWlmIChjaGFuZ2VfZmxhZykKKwkJeGZzX2ljaGd0aW1lKGlwLCBYRlNfSUNIR1RJTUVfQ0hHKTsKKwl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CisKK30KKworCisvKgorICogVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgaW5vZGUncyBsaW5rIGNvdW50IGdvZXMgdG8gMC4KKyAqIFdlIHBsYWNlIHRoZSBvbi1kaXNrIGlub2RlIG9uIGEgbGlzdCBpbiB0aGUgQUdJLiAgSXQKKyAqIHdpbGwgYmUgcHVsbGVkIGZyb20gdGhpcyBsaXN0IHdoZW4gdGhlIGlub2RlIGlzIGZyZWVkLgorICovCitpbnQKK3hmc19pdW5saW5rKAorCXhmc190cmFuc190CSp0cCwKKwl4ZnNfaW5vZGVfdAkqaXApCit7CisJeGZzX21vdW50X3QJKm1wOworCXhmc19hZ2lfdAkqYWdpOworCXhmc19kaW5vZGVfdAkqZGlwOworCXhmc19idWZfdAkqYWdpYnA7CisJeGZzX2J1Zl90CSppYnA7CisJeGZzX2FnbnVtYmVyX3QJYWdubzsKKwl4ZnNfZGFkZHJfdAlhZ2RhZGRyOworCXhmc19hZ2lub190CWFnaW5vOworCXNob3J0CQlidWNrZXRfaW5kZXg7CisJaW50CQlvZmZzZXQ7CisJaW50CQllcnJvcjsKKwlpbnQJCWFnaV9vazsKKworCUFTU0VSVChpcC0+aV9kLmRpX25saW5rID09IDApOworCUFTU0VSVChpcC0+aV9kLmRpX21vZGUgIT0gMCk7CisJQVNTRVJUKGlwLT5pX3RyYW5zcCA9PSB0cCk7CisKKwltcCA9IHRwLT50X21vdW50cDsKKworCWFnbm8gPSBYRlNfSU5PX1RPX0FHTk8obXAsIGlwLT5pX2lubyk7CisJYWdkYWRkciA9IFhGU19BR19EQUREUihtcCwgYWdubywgWEZTX0FHSV9EQUREUihtcCkpOworCisJLyoKKwkgKiBHZXQgdGhlIGFnaSBidWZmZXIgZmlyc3QuICBJdCBlbnN1cmVzIGxvY2sgb3JkZXJpbmcKKwkgKiBvbiB0aGUgbGlzdC4KKwkgKi8KKwllcnJvciA9IHhmc190cmFuc19yZWFkX2J1ZihtcCwgdHAsIG1wLT5tX2RkZXZfdGFyZ3AsIGFnZGFkZHIsCisJCQkJICAgWEZTX0ZTU19UT19CQihtcCwgMSksIDAsICZhZ2licCk7CisJaWYgKGVycm9yKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJLyoKKwkgKiBWYWxpZGF0ZSB0aGUgbWFnaWMgbnVtYmVyIG9mIHRoZSBhZ2kgYmxvY2suCisJICovCisJYWdpID0gWEZTX0JVRl9UT19BR0koYWdpYnApOworCWFnaV9vayA9CisJCUlOVF9HRVQoYWdpLT5hZ2lfbWFnaWNudW0sIEFSQ0hfQ09OVkVSVCkgPT0gWEZTX0FHSV9NQUdJQyAmJgorCQlYRlNfQUdJX0dPT0RfVkVSU0lPTihJTlRfR0VUKGFnaS0+YWdpX3ZlcnNpb25udW0sIEFSQ0hfQ09OVkVSVCkpOworCWlmICh1bmxpa2VseShYRlNfVEVTVF9FUlJPUighYWdpX29rLCBtcCwgWEZTX0VSUlRBR19JVU5MSU5LLAorCQkJWEZTX1JBTkRPTV9JVU5MSU5LKSkpIHsKKwkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhmc19pdW5saW5rIiwgWEZTX0VSUkxFVkVMX0xPVywgbXAsIGFnaSk7CisJCXhmc190cmFuc19icmVsc2UodHAsIGFnaWJwKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCX0KKwkvKgorCSAqIEdldCB0aGUgaW5kZXggaW50byB0aGUgYWdpIGhhc2ggdGFibGUgZm9yIHRoZQorCSAqIGxpc3QgdGhpcyBpbm9kZSB3aWxsIGdvIG9uLgorCSAqLworCWFnaW5vID0gWEZTX0lOT19UT19BR0lOTyhtcCwgaXAtPmlfaW5vKTsKKwlBU1NFUlQoYWdpbm8gIT0gMCk7CisJYnVja2V0X2luZGV4ID0gYWdpbm8gJSBYRlNfQUdJX1VOTElOS0VEX0JVQ0tFVFM7CisJQVNTRVJUKGFnaS0+YWdpX3VubGlua2VkW2J1Y2tldF9pbmRleF0pOworCUFTU0VSVChJTlRfR0VUKGFnaS0+YWdpX3VubGlua2VkW2J1Y2tldF9pbmRleF0sIEFSQ0hfQ09OVkVSVCkgIT0gYWdpbm8pOworCisJaWYgKElOVF9HRVQoYWdpLT5hZ2lfdW5saW5rZWRbYnVja2V0X2luZGV4XSwgQVJDSF9DT05WRVJUKSAhPSBOVUxMQUdJTk8pIHsKKwkJLyoKKwkJICogVGhlcmUgaXMgYWxyZWFkeSBhbm90aGVyIGlub2RlIGluIHRoZSBidWNrZXQgd2UgbmVlZAorCQkgKiB0byBhZGQgb3Vyc2VsdmVzIHRvLiAgQWRkIHVzIGF0IHRoZSBmcm9udCBvZiB0aGUgbGlzdC4KKwkJICogSGVyZSB3ZSBwdXQgdGhlIGhlYWQgcG9pbnRlciBpbnRvIG91ciBuZXh0IHBvaW50ZXIsCisJCSAqIGFuZCB0aGVuIHdlIGZhbGwgdGhyb3VnaCB0byBwb2ludCB0aGUgaGVhZCBhdCB1cy4KKwkJICovCisJCWVycm9yID0geGZzX2l0b2JwKG1wLCB0cCwgaXAsICZkaXAsICZpYnAsIDApOworCQlpZiAoZXJyb3IpIHsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQlBU1NFUlQoSU5UX0dFVChkaXAtPmRpX25leHRfdW5saW5rZWQsIEFSQ0hfQ09OVkVSVCkgPT0gTlVMTEFHSU5PKTsKKwkJQVNTRVJUKGRpcC0+ZGlfbmV4dF91bmxpbmtlZCk7CisJCS8qIGJvdGggb24tZGlzaywgZG9uJ3QgZW5kaWFuIGZsaXAgdHdpY2UgKi8KKwkJZGlwLT5kaV9uZXh0X3VubGlua2VkID0gYWdpLT5hZ2lfdW5saW5rZWRbYnVja2V0X2luZGV4XTsKKwkJb2Zmc2V0ID0gaXAtPmlfYm9mZnNldCArCisJCQlvZmZzZXRvZih4ZnNfZGlub2RlX3QsIGRpX25leHRfdW5saW5rZWQpOworCQl4ZnNfdHJhbnNfaW5vZGVfYnVmKHRwLCBpYnApOworCQl4ZnNfdHJhbnNfbG9nX2J1Zih0cCwgaWJwLCBvZmZzZXQsCisJCQkJICAob2Zmc2V0ICsgc2l6ZW9mKHhmc19hZ2lub190KSAtIDEpKTsKKwkJeGZzX2lub2JwX2NoZWNrKG1wLCBpYnApOworCX0KKworCS8qCisJICogUG9pbnQgdGhlIGJ1Y2tldCBoZWFkIHBvaW50ZXIgYXQgdGhlIGlub2RlIGJlaW5nIGluc2VydGVkLgorCSAqLworCUFTU0VSVChhZ2lubyAhPSAwKTsKKwlJTlRfU0VUKGFnaS0+YWdpX3VubGlua2VkW2J1Y2tldF9pbmRleF0sIEFSQ0hfQ09OVkVSVCwgYWdpbm8pOworCW9mZnNldCA9IG9mZnNldG9mKHhmc19hZ2lfdCwgYWdpX3VubGlua2VkKSArCisJCShzaXplb2YoeGZzX2FnaW5vX3QpICogYnVja2V0X2luZGV4KTsKKwl4ZnNfdHJhbnNfbG9nX2J1Zih0cCwgYWdpYnAsIG9mZnNldCwKKwkJCSAgKG9mZnNldCArIHNpemVvZih4ZnNfYWdpbm9fdCkgLSAxKSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQdWxsIHRoZSBvbi1kaXNrIGlub2RlIGZyb20gdGhlIEFHSSB1bmxpbmtlZCBsaXN0LgorICovCitTVEFUSUMgaW50Cit4ZnNfaXVubGlua19yZW1vdmUoCisJeGZzX3RyYW5zX3QJKnRwLAorCXhmc19pbm9kZV90CSppcCkKK3sKKwl4ZnNfaW5vX3QJbmV4dF9pbm87CisJeGZzX21vdW50X3QJKm1wOworCXhmc19hZ2lfdAkqYWdpOworCXhmc19kaW5vZGVfdAkqZGlwOworCXhmc19idWZfdAkqYWdpYnA7CisJeGZzX2J1Zl90CSppYnA7CisJeGZzX2FnbnVtYmVyX3QJYWdubzsKKwl4ZnNfZGFkZHJfdAlhZ2RhZGRyOworCXhmc19hZ2lub190CWFnaW5vOworCXhmc19hZ2lub190CW5leHRfYWdpbm87CisJeGZzX2J1Zl90CSpsYXN0X2licDsKKwl4ZnNfZGlub2RlX3QJKmxhc3RfZGlwOworCXNob3J0CQlidWNrZXRfaW5kZXg7CisJaW50CQlvZmZzZXQsIGxhc3Rfb2Zmc2V0OworCWludAkJZXJyb3I7CisJaW50CQlhZ2lfb2s7CisKKwkvKgorCSAqIEZpcnN0IHB1bGwgdGhlIG9uLWRpc2sgaW5vZGUgZnJvbSB0aGUgQUdJIHVubGlua2VkIGxpc3QuCisJICovCisJbXAgPSB0cC0+dF9tb3VudHA7CisKKwlhZ25vID0gWEZTX0lOT19UT19BR05PKG1wLCBpcC0+aV9pbm8pOworCWFnZGFkZHIgPSBYRlNfQUdfREFERFIobXAsIGFnbm8sIFhGU19BR0lfREFERFIobXApKTsKKworCS8qCisJICogR2V0IHRoZSBhZ2kgYnVmZmVyIGZpcnN0LiAgSXQgZW5zdXJlcyBsb2NrIG9yZGVyaW5nCisJICogb24gdGhlIGxpc3QuCisJICovCisJZXJyb3IgPSB4ZnNfdHJhbnNfcmVhZF9idWYobXAsIHRwLCBtcC0+bV9kZGV2X3RhcmdwLCBhZ2RhZGRyLAorCQkJCSAgIFhGU19GU1NfVE9fQkIobXAsIDEpLCAwLCAmYWdpYnApOworCWlmIChlcnJvcikgeworCQljbW5fZXJyKENFX1dBUk4sCisJCQkieGZzX2l1bmxpbmtfcmVtb3ZlOiB4ZnNfdHJhbnNfcmVhZF9idWYoKSAgcmV0dXJuZWQgYW4gZXJyb3IgJWQgb24gJXMuICBSZXR1cm5pbmcgZXJyb3IuIiwKKwkJCWVycm9yLCBtcC0+bV9mc25hbWUpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCS8qCisJICogVmFsaWRhdGUgdGhlIG1hZ2ljIG51bWJlciBvZiB0aGUgYWdpIGJsb2NrLgorCSAqLworCWFnaSA9IFhGU19CVUZfVE9fQUdJKGFnaWJwKTsKKwlhZ2lfb2sgPQorCQlJTlRfR0VUKGFnaS0+YWdpX21hZ2ljbnVtLCBBUkNIX0NPTlZFUlQpID09IFhGU19BR0lfTUFHSUMgJiYKKwkJWEZTX0FHSV9HT09EX1ZFUlNJT04oSU5UX0dFVChhZ2ktPmFnaV92ZXJzaW9ubnVtLCBBUkNIX0NPTlZFUlQpKTsKKwlpZiAodW5saWtlbHkoWEZTX1RFU1RfRVJST1IoIWFnaV9vaywgbXAsIFhGU19FUlJUQUdfSVVOTElOS19SRU1PVkUsCisJCQlYRlNfUkFORE9NX0lVTkxJTktfUkVNT1ZFKSkpIHsKKwkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhmc19pdW5saW5rX3JlbW92ZSIsIFhGU19FUlJMRVZFTF9MT1csCisJCQkJICAgICBtcCwgYWdpKTsKKwkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYWdpYnApOworCQljbW5fZXJyKENFX1dBUk4sCisJCQkieGZzX2l1bmxpbmtfcmVtb3ZlOiBYRlNfVEVTVF9FUlJPUigpICByZXR1cm5lZCBhbiBlcnJvciBvbiAlcy4gIFJldHVybmluZyBFRlNDT1JSVVBURUQuIiwKKwkJCSBtcC0+bV9mc25hbWUpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJfQorCS8qCisJICogR2V0IHRoZSBpbmRleCBpbnRvIHRoZSBhZ2kgaGFzaCB0YWJsZSBmb3IgdGhlCisJICogbGlzdCB0aGlzIGlub2RlIHdpbGwgZ28gb24uCisJICovCisJYWdpbm8gPSBYRlNfSU5PX1RPX0FHSU5PKG1wLCBpcC0+aV9pbm8pOworCUFTU0VSVChhZ2lubyAhPSAwKTsKKwlidWNrZXRfaW5kZXggPSBhZ2lubyAlIFhGU19BR0lfVU5MSU5LRURfQlVDS0VUUzsKKwlBU1NFUlQoSU5UX0dFVChhZ2ktPmFnaV91bmxpbmtlZFtidWNrZXRfaW5kZXhdLCBBUkNIX0NPTlZFUlQpICE9IE5VTExBR0lOTyk7CisJQVNTRVJUKGFnaS0+YWdpX3VubGlua2VkW2J1Y2tldF9pbmRleF0pOworCisJaWYgKElOVF9HRVQoYWdpLT5hZ2lfdW5saW5rZWRbYnVja2V0X2luZGV4XSwgQVJDSF9DT05WRVJUKSA9PSBhZ2lubykgeworCQkvKgorCQkgKiBXZSdyZSBhdCB0aGUgaGVhZCBvZiB0aGUgbGlzdC4gIEdldCB0aGUgaW5vZGUncworCQkgKiBvbi1kaXNrIGJ1ZmZlciB0byBzZWUgaWYgdGhlcmUgaXMgYW55b25lIGFmdGVyIHVzCisJCSAqIG9uIHRoZSBsaXN0LiAgT25seSBtb2RpZnkgb3VyIG5leHQgcG9pbnRlciBpZiBpdAorCQkgKiBpcyBub3QgYWxyZWFkeSBOVUxMQUdJTk8uICBUaGlzIHNhdmVzIHVzIHRoZSBvdmVyaGVhZAorCQkgKiBvZiBkZWFsaW5nIHdpdGggdGhlIGJ1ZmZlciB3aGVuIHRoZXJlIGlzIG5vIG5lZWQgdG8KKwkJICogY2hhbmdlIGl0LgorCQkgKi8KKwkJZXJyb3IgPSB4ZnNfaXRvYnAobXAsIHRwLCBpcCwgJmRpcCwgJmlicCwgMCk7CisJCWlmIChlcnJvcikgeworCQkJY21uX2VycihDRV9XQVJOLAorCQkJCSJ4ZnNfaXVubGlua19yZW1vdmU6IHhmc19pdG9icCgpICByZXR1cm5lZCBhbiBlcnJvciAlZCBvbiAlcy4gIFJldHVybmluZyBlcnJvci4iLAorCQkJCWVycm9yLCBtcC0+bV9mc25hbWUpOworCQkJcmV0dXJuIGVycm9yOworCQl9CisJCW5leHRfYWdpbm8gPSBJTlRfR0VUKGRpcC0+ZGlfbmV4dF91bmxpbmtlZCwgQVJDSF9DT05WRVJUKTsKKwkJQVNTRVJUKG5leHRfYWdpbm8gIT0gMCk7CisJCWlmIChuZXh0X2FnaW5vICE9IE5VTExBR0lOTykgeworCQkJSU5UX1NFVChkaXAtPmRpX25leHRfdW5saW5rZWQsIEFSQ0hfQ09OVkVSVCwgTlVMTEFHSU5PKTsKKwkJCW9mZnNldCA9IGlwLT5pX2JvZmZzZXQgKworCQkJCW9mZnNldG9mKHhmc19kaW5vZGVfdCwgZGlfbmV4dF91bmxpbmtlZCk7CisJCQl4ZnNfdHJhbnNfaW5vZGVfYnVmKHRwLCBpYnApOworCQkJeGZzX3RyYW5zX2xvZ19idWYodHAsIGlicCwgb2Zmc2V0LAorCQkJCQkgIChvZmZzZXQgKyBzaXplb2YoeGZzX2FnaW5vX3QpIC0gMSkpOworCQkJeGZzX2lub2JwX2NoZWNrKG1wLCBpYnApOworCQl9IGVsc2UgeworCQkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgaWJwKTsKKwkJfQorCQkvKgorCQkgKiBQb2ludCB0aGUgYnVja2V0IGhlYWQgcG9pbnRlciBhdCB0aGUgbmV4dCBpbm9kZS4KKwkJICovCisJCUFTU0VSVChuZXh0X2FnaW5vICE9IDApOworCQlBU1NFUlQobmV4dF9hZ2lubyAhPSBhZ2lubyk7CisJCUlOVF9TRVQoYWdpLT5hZ2lfdW5saW5rZWRbYnVja2V0X2luZGV4XSwgQVJDSF9DT05WRVJULCBuZXh0X2FnaW5vKTsKKwkJb2Zmc2V0ID0gb2Zmc2V0b2YoeGZzX2FnaV90LCBhZ2lfdW5saW5rZWQpICsKKwkJCShzaXplb2YoeGZzX2FnaW5vX3QpICogYnVja2V0X2luZGV4KTsKKwkJeGZzX3RyYW5zX2xvZ19idWYodHAsIGFnaWJwLCBvZmZzZXQsCisJCQkJICAob2Zmc2V0ICsgc2l6ZW9mKHhmc19hZ2lub190KSAtIDEpKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBXZSBuZWVkIHRvIHNlYXJjaCB0aGUgbGlzdCBmb3IgdGhlIGlub2RlIGJlaW5nIGZyZWVkLgorCQkgKi8KKwkJbmV4dF9hZ2lubyA9IElOVF9HRVQoYWdpLT5hZ2lfdW5saW5rZWRbYnVja2V0X2luZGV4XSwgQVJDSF9DT05WRVJUKTsKKwkJbGFzdF9pYnAgPSBOVUxMOworCQl3aGlsZSAobmV4dF9hZ2lubyAhPSBhZ2lubykgeworCQkJLyoKKwkJCSAqIElmIHRoZSBsYXN0IGlub2RlIHdhc24ndCB0aGUgb25lIHBvaW50aW5nIHRvCisJCQkgKiB1cywgdGhlbiByZWxlYXNlIGl0cyBidWZmZXIgc2luY2Ugd2UncmUgbm90CisJCQkgKiBnb2luZyB0byBkbyBhbnl0aGluZyB3aXRoIGl0LgorCQkJICovCisJCQlpZiAobGFzdF9pYnAgIT0gTlVMTCkgeworCQkJCXhmc190cmFuc19icmVsc2UodHAsIGxhc3RfaWJwKTsKKwkJCX0KKwkJCW5leHRfaW5vID0gWEZTX0FHSU5PX1RPX0lOTyhtcCwgYWdubywgbmV4dF9hZ2lubyk7CisJCQllcnJvciA9IHhmc19pbm90b2JwKG1wLCB0cCwgbmV4dF9pbm8sICZsYXN0X2RpcCwKKwkJCQkJICAgICZsYXN0X2licCwgJmxhc3Rfb2Zmc2V0KTsKKwkJCWlmIChlcnJvcikgeworCQkJCWNtbl9lcnIoQ0VfV0FSTiwKKwkJCSJ4ZnNfaXVubGlua19yZW1vdmU6IHhmc19pbm90b2JwKCkgIHJldHVybmVkIGFuIGVycm9yICVkIG9uICVzLiAgUmV0dXJuaW5nIGVycm9yLiIsCisJCQkJCWVycm9yLCBtcC0+bV9mc25hbWUpOworCQkJCXJldHVybiBlcnJvcjsKKwkJCX0KKwkJCW5leHRfYWdpbm8gPSBJTlRfR0VUKGxhc3RfZGlwLT5kaV9uZXh0X3VubGlua2VkLCBBUkNIX0NPTlZFUlQpOworCQkJQVNTRVJUKG5leHRfYWdpbm8gIT0gTlVMTEFHSU5PKTsKKwkJCUFTU0VSVChuZXh0X2FnaW5vICE9IDApOworCQl9CisJCS8qCisJCSAqIE5vdyBsYXN0X2licCBwb2ludHMgdG8gdGhlIGJ1ZmZlciBwcmV2aW91cyB0byB1cyBvbgorCQkgKiB0aGUgdW5saW5rZWQgbGlzdC4gIFB1bGwgdXMgZnJvbSB0aGUgbGlzdC4KKwkJICovCisJCWVycm9yID0geGZzX2l0b2JwKG1wLCB0cCwgaXAsICZkaXAsICZpYnAsIDApOworCQlpZiAoZXJyb3IpIHsKKwkJCWNtbl9lcnIoQ0VfV0FSTiwKKwkJCQkieGZzX2l1bmxpbmtfcmVtb3ZlOiB4ZnNfaXRvYnAoKSAgcmV0dXJuZWQgYW4gZXJyb3IgJWQgb24gJXMuICBSZXR1cm5pbmcgZXJyb3IuIiwKKwkJCQllcnJvciwgbXAtPm1fZnNuYW1lKTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQluZXh0X2FnaW5vID0gSU5UX0dFVChkaXAtPmRpX25leHRfdW5saW5rZWQsIEFSQ0hfQ09OVkVSVCk7CisJCUFTU0VSVChuZXh0X2FnaW5vICE9IDApOworCQlBU1NFUlQobmV4dF9hZ2lubyAhPSBhZ2lubyk7CisJCWlmIChuZXh0X2FnaW5vICE9IE5VTExBR0lOTykgeworCQkJSU5UX1NFVChkaXAtPmRpX25leHRfdW5saW5rZWQsIEFSQ0hfQ09OVkVSVCwgTlVMTEFHSU5PKTsKKwkJCW9mZnNldCA9IGlwLT5pX2JvZmZzZXQgKworCQkJCW9mZnNldG9mKHhmc19kaW5vZGVfdCwgZGlfbmV4dF91bmxpbmtlZCk7CisJCQl4ZnNfdHJhbnNfaW5vZGVfYnVmKHRwLCBpYnApOworCQkJeGZzX3RyYW5zX2xvZ19idWYodHAsIGlicCwgb2Zmc2V0LAorCQkJCQkgIChvZmZzZXQgKyBzaXplb2YoeGZzX2FnaW5vX3QpIC0gMSkpOworCQkJeGZzX2lub2JwX2NoZWNrKG1wLCBpYnApOworCQl9IGVsc2UgeworCQkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgaWJwKTsKKwkJfQorCQkvKgorCQkgKiBQb2ludCB0aGUgcHJldmlvdXMgaW5vZGUgb24gdGhlIGxpc3QgdG8gdGhlIG5leHQgaW5vZGUuCisJCSAqLworCQlJTlRfU0VUKGxhc3RfZGlwLT5kaV9uZXh0X3VubGlua2VkLCBBUkNIX0NPTlZFUlQsIG5leHRfYWdpbm8pOworCQlBU1NFUlQobmV4dF9hZ2lubyAhPSAwKTsKKwkJb2Zmc2V0ID0gbGFzdF9vZmZzZXQgKyBvZmZzZXRvZih4ZnNfZGlub2RlX3QsIGRpX25leHRfdW5saW5rZWQpOworCQl4ZnNfdHJhbnNfaW5vZGVfYnVmKHRwLCBsYXN0X2licCk7CisJCXhmc190cmFuc19sb2dfYnVmKHRwLCBsYXN0X2licCwgb2Zmc2V0LAorCQkJCSAgKG9mZnNldCArIHNpemVvZih4ZnNfYWdpbm9fdCkgLSAxKSk7CisJCXhmc19pbm9icF9jaGVjayhtcCwgbGFzdF9pYnApOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IHhmc19pbm9kZV9jbGVhbih4ZnNfaW5vZGVfdCAqaXApCit7CisJcmV0dXJuICgoKGlwLT5pX2l0ZW1wID09IE5VTEwpIHx8CisJCSEoaXAtPmlfaXRlbXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmIFhGU19JTE9HX0FMTCkpICYmCisJCShpcC0+aV91cGRhdGVfY29yZSA9PSAwKSk7Cit9CisKK3ZvaWQKK3hmc19pZnJlZV9jbHVzdGVyKAorCXhmc19pbm9kZV90CSpmcmVlX2lwLAorCXhmc190cmFuc190CSp0cCwKKwl4ZnNfaW5vX3QJaW51bSkKK3sKKwl4ZnNfbW91bnRfdAkJKm1wID0gZnJlZV9pcC0+aV9tb3VudDsKKwlpbnQJCQlibGtzX3Blcl9jbHVzdGVyOworCWludAkJCW5idWZzOworCWludAkJCW5pbm9kZXM7CisJaW50CQkJaSwgaiwgZm91bmQsIHByZV9mbHVzaGVkOworCXhmc19kYWRkcl90CQlibGtubzsKKwl4ZnNfYnVmX3QJCSpicDsKKwl4ZnNfaWhhc2hfdAkJKmloOworCXhmc19pbm9kZV90CQkqaXAsICoqaXBfZm91bmQ7CisJeGZzX2lub2RlX2xvZ19pdGVtX3QJKmlpcDsKKwl4ZnNfbG9nX2l0ZW1fdAkJKmxpcDsKKwlTUExERUNMKHMpOworCisJaWYgKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSA+PSBYRlNfSU5PREVfQ0xVU1RFUl9TSVpFKG1wKSkgeworCQlibGtzX3Blcl9jbHVzdGVyID0gMTsKKwkJbmlub2RlcyA9IG1wLT5tX3NiLnNiX2lub3BibG9jazsKKwkJbmJ1ZnMgPSBYRlNfSUFMTE9DX0JMT0NLUyhtcCk7CisJfSBlbHNlIHsKKwkJYmxrc19wZXJfY2x1c3RlciA9IFhGU19JTk9ERV9DTFVTVEVSX1NJWkUobXApIC8KKwkJCQkJbXAtPm1fc2Iuc2JfYmxvY2tzaXplOworCQluaW5vZGVzID0gYmxrc19wZXJfY2x1c3RlciAqIG1wLT5tX3NiLnNiX2lub3BibG9jazsKKwkJbmJ1ZnMgPSBYRlNfSUFMTE9DX0JMT0NLUyhtcCkgLyBibGtzX3Blcl9jbHVzdGVyOworCX0KKworCWlwX2ZvdW5kID0ga21lbV9hbGxvYyhuaW5vZGVzICogc2l6ZW9mKHhmc19pbm9kZV90ICopLCBLTV9OT0ZTKTsKKworCWZvciAoaiA9IDA7IGogPCBuYnVmczsgaisrLCBpbnVtICs9IG5pbm9kZXMpIHsKKwkJYmxrbm8gPSBYRlNfQUdCX1RPX0RBRERSKG1wLCBYRlNfSU5PX1RPX0FHTk8obXAsIGludW0pLAorCQkJCQkgWEZTX0lOT19UT19BR0JOTyhtcCwgaW51bSkpOworCisKKwkJLyoKKwkJICogTG9vayBmb3IgZWFjaCBpbm9kZSBpbiBtZW1vcnkgYW5kIGF0dGVtcHQgdG8gbG9jayBpdCwKKwkJICogd2UgY2FuIGJlIHJhY2luZyB3aXRoIGZsdXNoIGFuZCB0YWlsIHB1c2hpbmcgaGVyZS4KKwkJICogYW55IGlub2RlIHdlIGdldCB0aGUgbG9ja3Mgb24sIGFkZCB0byBhbiBhcnJheSBvZgorCQkgKiBpbm9kZSBpdGVtcyB0byBwcm9jZXNzIGxhdGVyLgorCQkgKgorCQkgKiBUaGUgZ2V0IHRoZSBidWZmZXIgbG9jaywgd2UgY291bGQgYmVhdCBhIGZsdXNoCisJCSAqIG9yIHRhaWwgcHVzaGluZyB0aHJlYWQgdG8gdGhlIGxvY2sgaGVyZSwgaW4gd2hpY2gKKwkJICogY2FzZSB0aGV5IHdpbGwgZ28gbG9va2luZyBmb3IgdGhlIGlub2RlIGJ1ZmZlcgorCQkgKiBhbmQgZmFpbCwgd2UgbmVlZCBzb21lIG90aGVyIGZvcm0gb2YgaW50ZXJsb2NrCisJCSAqIGhlcmUuCisJCSAqLworCQlmb3VuZCA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBuaW5vZGVzOyBpKyspIHsKKwkJCWloID0gWEZTX0lIQVNIKG1wLCBpbnVtICsgaSk7CisJCQlyZWFkX2xvY2soJmloLT5paF9sb2NrKTsKKwkJCWZvciAoaXAgPSBpaC0+aWhfbmV4dDsgaXAgIT0gTlVMTDsgaXAgPSBpcC0+aV9uZXh0KSB7CisJCQkJaWYgKGlwLT5pX2lubyA9PSBpbnVtICsgaSkKKwkJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIElub2RlIG5vdCBpbiBtZW1vcnkgb3Igd2UgZm91bmQgaXQgYWxyZWFkeSwKKwkJCSAqIG5vdGhpbmcgdG8gZG8KKwkJCSAqLworCQkJaWYgKCFpcCB8fCAoaXAtPmlfZmxhZ3MgJiBYRlNfSVNUQUxFKSkgeworCQkJCXJlYWRfdW5sb2NrKCZpaC0+aWhfbG9jayk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmICh4ZnNfaW5vZGVfY2xlYW4oaXApKSB7CisJCQkJcmVhZF91bmxvY2soJmloLT5paF9sb2NrKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogSWYgd2UgY2FuIGdldCB0aGUgbG9ja3MgdGhlbiBhZGQgaXQgdG8gdGhlCisJCQkgKiBsaXN0LCBvdGhlcndpc2UgYnkgdGhlIHRpbWUgd2UgZ2V0IHRoZSBicCBsb2NrCisJCQkgKiBiZWxvdyBpdCB3aWxsIGFscmVhZHkgYmUgYXR0YWNoZWQgdG8gdGhlCisJCQkgKiBpbm9kZSBidWZmZXIuCisJCQkgKi8KKworCQkJLyogVGhpcyBpbm9kZSB3aWxsIGFscmVhZHkgYmUgbG9ja2VkIC0gYnkgdXMsIGxldHMKKwkJCSAqIGtlZXAgaXQgdGhhdCB3YXkuCisJCQkgKi8KKworCQkJaWYgKGlwID09IGZyZWVfaXApIHsKKwkJCQlpZiAoeGZzX2lmbG9ja19ub3dhaXQoaXApKSB7CisJCQkJCWlwLT5pX2ZsYWdzIHw9IFhGU19JU1RBTEU7CisKKwkJCQkJaWYgKHhmc19pbm9kZV9jbGVhbihpcCkpIHsKKwkJCQkJCXhmc19pZnVubG9jayhpcCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpcF9mb3VuZFtmb3VuZCsrXSA9IGlwOworCQkJCQl9CisJCQkJfQorCQkJCXJlYWRfdW5sb2NrKCZpaC0+aWhfbG9jayk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmICh4ZnNfaWxvY2tfbm93YWl0KGlwLCBYRlNfSUxPQ0tfRVhDTCkpIHsKKwkJCQlpZiAoeGZzX2lmbG9ja19ub3dhaXQoaXApKSB7CisJCQkJCWlwLT5pX2ZsYWdzIHw9IFhGU19JU1RBTEU7CisKKwkJCQkJaWYgKHhmc19pbm9kZV9jbGVhbihpcCkpIHsKKwkJCQkJCXhmc19pZnVubG9jayhpcCk7CisJCQkJCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQkJCQl9IGVsc2UgeworCQkJCQkJaXBfZm91bmRbZm91bmQrK10gPSBpcDsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCQkJfQorCQkJfQorCisJCQlyZWFkX3VubG9jaygmaWgtPmloX2xvY2spOworCQl9CisKKwkJYnAgPSB4ZnNfdHJhbnNfZ2V0X2J1Zih0cCwgbXAtPm1fZGRldl90YXJncCwgYmxrbm8sIAorCQkJCQltcC0+bV9ic2l6ZSAqIGJsa3NfcGVyX2NsdXN0ZXIsCisJCQkJCVhGU19CVUZfTE9DSyk7CisKKwkJcHJlX2ZsdXNoZWQgPSAwOworCQlsaXAgPSBYRlNfQlVGX0ZTUFJJVkFURShicCwgeGZzX2xvZ19pdGVtX3QgKik7CisJCXdoaWxlIChsaXApIHsKKwkJCWlmIChsaXAtPmxpX3R5cGUgPT0gWEZTX0xJX0lOT0RFKSB7CisJCQkJaWlwID0gKHhmc19pbm9kZV9sb2dfaXRlbV90ICopbGlwOworCQkJCUFTU0VSVChpaXAtPmlsaV9sb2dnZWQgPT0gMSk7CisJCQkJbGlwLT5saV9jYiA9ICh2b2lkKCopKHhmc19idWZfdCoseGZzX2xvZ19pdGVtX3QqKSkgeGZzX2lzdGFsZV9kb25lOworCQkJCUFJTF9MT0NLKG1wLHMpOworCQkJCWlpcC0+aWxpX2ZsdXNoX2xzbiA9IGlpcC0+aWxpX2l0ZW0ubGlfbHNuOworCQkJCUFJTF9VTkxPQ0sobXAsIHMpOworCQkJCWlpcC0+aWxpX2lub2RlLT5pX2ZsYWdzIHw9IFhGU19JU1RBTEU7CisJCQkJcHJlX2ZsdXNoZWQrKzsKKwkJCX0KKwkJCWxpcCA9IGxpcC0+bGlfYmlvX2xpc3Q7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgZm91bmQ7IGkrKykgeworCQkJaXAgPSBpcF9mb3VuZFtpXTsKKwkJCWlpcCA9IGlwLT5pX2l0ZW1wOworCisJCQlpZiAoIWlpcCkgeworCQkJCWlwLT5pX3VwZGF0ZV9jb3JlID0gMDsKKwkJCQl4ZnNfaWZ1bmxvY2soaXApOworCQkJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlpcC0+aWxpX2xhc3RfZmllbGRzID0gaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHM7CisJCQlpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyA9IDA7CisJCQlpaXAtPmlsaV9sb2dnZWQgPSAxOworCQkJQUlMX0xPQ0sobXAscyk7CisJCQlpaXAtPmlsaV9mbHVzaF9sc24gPSBpaXAtPmlsaV9pdGVtLmxpX2xzbjsKKwkJCUFJTF9VTkxPQ0sobXAsIHMpOworCisJCQl4ZnNfYnVmX2F0dGFjaF9pb2RvbmUoYnAsCisJCQkJKHZvaWQoKikoeGZzX2J1Zl90Kix4ZnNfbG9nX2l0ZW1fdCopKQorCQkJCXhmc19pc3RhbGVfZG9uZSwgKHhmc19sb2dfaXRlbV90ICopaWlwKTsKKwkJCWlmIChpcCAhPSBmcmVlX2lwKSB7CisJCQkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwkJCX0KKwkJfQorCisJCWlmIChmb3VuZCB8fCBwcmVfZmx1c2hlZCkKKwkJCXhmc190cmFuc19zdGFsZV9pbm9kZV9idWYodHAsIGJwKTsKKwkJeGZzX3RyYW5zX2JpbnZhbCh0cCwgYnApOworCX0KKworCWttZW1fZnJlZShpcF9mb3VuZCwgbmlub2RlcyAqIHNpemVvZih4ZnNfaW5vZGVfdCAqKSk7Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB0byByZXR1cm4gYW4gaW5vZGUgdG8gdGhlIGlub2RlIGZyZWUgbGlzdC4KKyAqIFRoZSBpbm9kZSBzaG91bGQgYWxyZWFkeSBiZSB0cnVuY2F0ZWQgdG8gMCBsZW5ndGggYW5kIGhhdmUKKyAqIG5vIHBhZ2VzIGFzc29jaWF0ZWQgd2l0aCBpdC4gIFRoaXMgcm91dGluZSBhbHNvIGFzc3VtZXMgdGhhdAorICogdGhlIGlub2RlIGlzIGFscmVhZHkgYSBwYXJ0IG9mIHRoZSB0cmFuc2FjdGlvbi4KKyAqCisgKiBUaGUgb24tZGlzayBjb3B5IG9mIHRoZSBpbm9kZSB3aWxsIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgbGlzdAorICogb2YgdW5saW5rZWQgaW5vZGVzIGluIHRoZSBBR0kuIFdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBpbm9kZSBmcm9tCisgKiB0aGF0IGxpc3QgYXRvbWljYWxseSB3aXRoIHJlc3BlY3QgdG8gZnJlZWluZyBpdCBoZXJlLgorICovCitpbnQKK3hmc19pZnJlZSgKKwl4ZnNfdHJhbnNfdAkqdHAsCisJeGZzX2lub2RlX3QJKmlwLAorCXhmc19ibWFwX2ZyZWVfdAkqZmxpc3QpCit7CisJaW50CQkJZXJyb3I7CisJaW50CQkJZGVsZXRlOworCXhmc19pbm9fdAkJZmlyc3RfaW5vOworCisJQVNTRVJUKGlzbXJsb2NrZWQoJmlwLT5pX2xvY2ssIE1SX1VQREFURSkpOworCUFTU0VSVChpcC0+aV90cmFuc3AgPT0gdHApOworCUFTU0VSVChpcC0+aV9kLmRpX25saW5rID09IDApOworCUFTU0VSVChpcC0+aV9kLmRpX25leHRlbnRzID09IDApOworCUFTU0VSVChpcC0+aV9kLmRpX2FuZXh0ZW50cyA9PSAwKTsKKwlBU1NFUlQoKGlwLT5pX2QuZGlfc2l6ZSA9PSAwKSB8fAorCSAgICAgICAoKGlwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgIT0gU19JRlJFRykpOworCUFTU0VSVChpcC0+aV9kLmRpX25ibG9ja3MgPT0gMCk7CisKKwkvKgorCSAqIFB1bGwgdGhlIG9uLWRpc2sgaW5vZGUgZnJvbSB0aGUgQUdJIHVubGlua2VkIGxpc3QuCisJICovCisJZXJyb3IgPSB4ZnNfaXVubGlua19yZW1vdmUodHAsIGlwKTsKKwlpZiAoZXJyb3IgIT0gMCkgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJZXJyb3IgPSB4ZnNfZGlmcmVlKHRwLCBpcC0+aV9pbm8sIGZsaXN0LCAmZGVsZXRlLCAmZmlyc3RfaW5vKTsKKwlpZiAoZXJyb3IgIT0gMCkgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCWlwLT5pX2QuZGlfbW9kZSA9IDA7CQkvKiBtYXJrIGluY29yZSBpbm9kZSBhcyBmcmVlICovCisJaXAtPmlfZC5kaV9mbGFncyA9IDA7CisJaXAtPmlfZC5kaV9kbWV2bWFzayA9IDA7CisJaXAtPmlfZC5kaV9mb3Jrb2ZmID0gMDsJCS8qIG1hcmsgdGhlIGF0dHIgZm9yayBub3QgaW4gdXNlICovCisJaXAtPmlfZGYuaWZfZXh0X21heCA9CisJCVhGU19JRk9SS19EU0laRShpcCkgLyAodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpOworCWlwLT5pX2QuZGlfZm9ybWF0ID0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUzsKKwlpcC0+aV9kLmRpX2Fmb3JtYXQgPSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTOworCS8qCisJICogQnVtcCB0aGUgZ2VuZXJhdGlvbiBjb3VudCBzbyBubyBvbmUgd2lsbCBiZSBjb25mdXNlZAorCSAqIGJ5IHJlaW5jYXJuYXRpb25zIG9mIHRoaXMgaW5vZGUuCisJICovCisJaXAtPmlfZC5kaV9nZW4rKzsKKwl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CisKKwlpZiAoZGVsZXRlKSB7CisJCXhmc19pZnJlZV9jbHVzdGVyKGlwLCB0cCwgZmlyc3RfaW5vKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlYWxsb2NhdGUgdGhlIHNwYWNlIGZvciBpZl9icm9vdCBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIHJlY29yZHMKKyAqIGJlaW5nIGFkZGVkIG9yIGRlbGV0ZWQgYXMgaW5kaWNhdGVkIGluIHJlY19kaWZmLiAgTW92ZSB0aGUgcmVjb3JkcworICogYW5kIHBvaW50ZXJzIGluIGlmX2Jyb290IHRvIGZpdCB0aGUgbmV3IHNpemUuICBXaGVuIHNocmlua2luZyB0aGlzCisgKiB3aWxsIGVsaW1pbmF0ZSBob2xlcyBiZXR3ZWVuIHRoZSByZWNvcmRzIGFuZCBwb2ludGVycyBjcmVhdGVkIGJ5CisgKiB0aGUgY2FsbGVyLiAgV2hlbiBncm93aW5nIHRoaXMgd2lsbCBjcmVhdGUgaG9sZXMgdG8gYmUgZmlsbGVkIGluCisgKiBieSB0aGUgY2FsbGVyLgorICoKKyAqIFRoZSBjYWxsZXIgbXVzdCBub3QgcmVxdWVzdCB0byBhZGQgbW9yZSByZWNvcmRzIHRoYW4gd291bGQgZml0IGluCisgKiB0aGUgb24tZGlzayBpbm9kZSByb290LiAgSWYgdGhlIGlmX2Jyb290IGlzIGN1cnJlbnRseSBOVUxMLCB0aGVuCisgKiBpZiB3ZSBhZGRpbmcgcmVjb3JkcyBvbmUgd2lsbCBiZSBhbGxvY2F0ZWQuICBUaGUgY2FsbGVyIG11c3QgYWxzbworICogbm90IHJlcXVlc3QgdGhhdCB0aGUgbnVtYmVyIG9mIHJlY29yZHMgZ28gYmVsb3cgemVybywgYWx0aG91Z2gKKyAqIGl0IGNhbiBnbyB0byB6ZXJvLgorICoKKyAqIGlwIC0tIHRoZSBpbm9kZSB3aG9zZSBpZl9icm9vdCBhcmVhIGlzIGNoYW5naW5nCisgKiBleHRfZGlmZiAtLSB0aGUgY2hhbmdlIGluIHRoZSBudW1iZXIgb2YgcmVjb3JkcywgcG9zaXRpdmUgb3IgbmVnYXRpdmUsCisgKgkgcmVxdWVzdGVkIGZvciB0aGUgaWZfYnJvb3QgYXJyYXkuCisgKi8KK3ZvaWQKK3hmc19pcm9vdF9yZWFsbG9jKAorCXhmc19pbm9kZV90CQkqaXAsCisJaW50CQkJcmVjX2RpZmYsCisJaW50CQkJd2hpY2hmb3JrKQoreworCWludAkJCWN1cl9tYXg7CisJeGZzX2lmb3JrX3QJCSppZnA7CisJeGZzX2JtYnRfYmxvY2tfdAkqbmV3X2Jyb290OworCWludAkJCW5ld19tYXg7CisJc2l6ZV90CQkJbmV3X3NpemU7CisJY2hhcgkJCSpucDsKKwljaGFyCQkJKm9wOworCisJLyoKKwkgKiBIYW5kbGUgdGhlIGRlZ2VuZXJhdGUgY2FzZSBxdWlldGx5LgorCSAqLworCWlmIChyZWNfZGlmZiA9PSAwKSB7CisJCXJldHVybjsKKwl9CisKKwlpZnAgPSBYRlNfSUZPUktfUFRSKGlwLCB3aGljaGZvcmspOworCWlmIChyZWNfZGlmZiA+IDApIHsKKwkJLyoKKwkJICogSWYgdGhlcmUgd2Fzbid0IGFueSBtZW1vcnkgYWxsb2NhdGVkIGJlZm9yZSwganVzdAorCQkgKiBhbGxvY2F0ZSBpdCBub3cgYW5kIGdldCBvdXQuCisJCSAqLworCQlpZiAoaWZwLT5pZl9icm9vdF9ieXRlcyA9PSAwKSB7CisJCQluZXdfc2l6ZSA9IChzaXplX3QpWEZTX0JNQVBfQlJPT1RfU1BBQ0VfQ0FMQyhyZWNfZGlmZik7CisJCQlpZnAtPmlmX2Jyb290ID0gKHhmc19ibWJ0X2Jsb2NrX3QqKWttZW1fYWxsb2MobmV3X3NpemUsCisJCQkJCQkJCSAgICAgS01fU0xFRVApOworCQkJaWZwLT5pZl9icm9vdF9ieXRlcyA9IChpbnQpbmV3X3NpemU7CisJCQlyZXR1cm47CisJCX0KKworCQkvKgorCQkgKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGFuIGV4aXN0aW5nIGlmX2Jyb290LCB0aGVuIHdlIG5lZWQKKwkJICogdG8gcmVhbGxvYygpIGl0IGFuZCBzaGlmdCB0aGUgcG9pbnRlcnMgdG8gdGhlaXIgbmV3CisJCSAqIGxvY2F0aW9uLiAgVGhlIHJlY29yZHMgZG9uJ3QgY2hhbmdlIGxvY2F0aW9uIGJlY2F1c2UKKwkJICogdGhleSBhcmUga2VwdCBidXR0ZWQgdXAgYWdhaW5zdCB0aGUgYnRyZWUgYmxvY2sgaGVhZGVyLgorCQkgKi8KKwkJY3VyX21heCA9IFhGU19CTUFQX0JST09UX01BWFJFQ1MoaWZwLT5pZl9icm9vdF9ieXRlcyk7CisJCW5ld19tYXggPSBjdXJfbWF4ICsgcmVjX2RpZmY7CisJCW5ld19zaXplID0gKHNpemVfdClYRlNfQk1BUF9CUk9PVF9TUEFDRV9DQUxDKG5ld19tYXgpOworCQlpZnAtPmlmX2Jyb290ID0gKHhmc19ibWJ0X2Jsb2NrX3QgKikKKwkJICBrbWVtX3JlYWxsb2MoaWZwLT5pZl9icm9vdCwKKwkJCQluZXdfc2l6ZSwKKwkJCQkoc2l6ZV90KVhGU19CTUFQX0JST09UX1NQQUNFX0NBTEMoY3VyX21heCksIC8qIG9sZCBzaXplICovCisJCQkJS01fU0xFRVApOworCQlvcCA9IChjaGFyICopWEZTX0JNQVBfQlJPT1RfUFRSX0FERFIoaWZwLT5pZl9icm9vdCwgMSwKKwkJCQkJCSAgICAgIGlmcC0+aWZfYnJvb3RfYnl0ZXMpOworCQlucCA9IChjaGFyICopWEZTX0JNQVBfQlJPT1RfUFRSX0FERFIoaWZwLT5pZl9icm9vdCwgMSwKKwkJCQkJCSAgICAgIChpbnQpbmV3X3NpemUpOworCQlpZnAtPmlmX2Jyb290X2J5dGVzID0gKGludCluZXdfc2l6ZTsKKwkJQVNTRVJUKGlmcC0+aWZfYnJvb3RfYnl0ZXMgPD0KKwkJCVhGU19JRk9SS19TSVpFKGlwLCB3aGljaGZvcmspICsgWEZTX0JST09UX1NJWkVfQURKKTsKKwkJbWVtbW92ZShucCwgb3AsIGN1cl9tYXggKiAodWludClzaXplb2YoeGZzX2Rmc2Jub190KSk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIHJlY19kaWZmIGlzIGxlc3MgdGhhbiAwLiAgSW4gdGhpcyBjYXNlLCB3ZSBhcmUgc2hyaW5raW5nIHRoZQorCSAqIGlmX2Jyb290IGJ1ZmZlci4gIEl0IG11c3QgYWxyZWFkeSBleGlzdC4gIElmIHdlIGdvIHRvIHplcm8KKwkgKiByZWNvcmRzLCBqdXN0IGdldCByaWQgb2YgdGhlIHJvb3QgYW5kIGNsZWFyIHRoZSBzdGF0dXMgYml0LgorCSAqLworCUFTU0VSVCgoaWZwLT5pZl9icm9vdCAhPSBOVUxMKSAmJiAoaWZwLT5pZl9icm9vdF9ieXRlcyA+IDApKTsKKwljdXJfbWF4ID0gWEZTX0JNQVBfQlJPT1RfTUFYUkVDUyhpZnAtPmlmX2Jyb290X2J5dGVzKTsKKwluZXdfbWF4ID0gY3VyX21heCArIHJlY19kaWZmOworCUFTU0VSVChuZXdfbWF4ID49IDApOworCWlmIChuZXdfbWF4ID4gMCkKKwkJbmV3X3NpemUgPSAoc2l6ZV90KVhGU19CTUFQX0JST09UX1NQQUNFX0NBTEMobmV3X21heCk7CisJZWxzZQorCQluZXdfc2l6ZSA9IDA7CisJaWYgKG5ld19zaXplID4gMCkgeworCQluZXdfYnJvb3QgPSAoeGZzX2JtYnRfYmxvY2tfdCAqKWttZW1fYWxsb2MobmV3X3NpemUsIEtNX1NMRUVQKTsKKwkJLyoKKwkJICogRmlyc3QgY29weSBvdmVyIHRoZSBidHJlZSBibG9jayBoZWFkZXIuCisJCSAqLworCQltZW1jcHkobmV3X2Jyb290LCBpZnAtPmlmX2Jyb290LCBzaXplb2YoeGZzX2JtYnRfYmxvY2tfdCkpOworCX0gZWxzZSB7CisJCW5ld19icm9vdCA9IE5VTEw7CisJCWlmcC0+aWZfZmxhZ3MgJj0gflhGU19JRkJST09UOworCX0KKworCS8qCisJICogT25seSBjb3B5IHRoZSByZWNvcmRzIGFuZCBwb2ludGVycyBpZiB0aGVyZSBhcmUgYW55LgorCSAqLworCWlmIChuZXdfbWF4ID4gMCkgeworCQkvKgorCQkgKiBGaXJzdCBjb3B5IHRoZSByZWNvcmRzLgorCQkgKi8KKwkJb3AgPSAoY2hhciAqKVhGU19CTUFQX0JST09UX1JFQ19BRERSKGlmcC0+aWZfYnJvb3QsIDEsCisJCQkJCQkgICAgIGlmcC0+aWZfYnJvb3RfYnl0ZXMpOworCQlucCA9IChjaGFyICopWEZTX0JNQVBfQlJPT1RfUkVDX0FERFIobmV3X2Jyb290LCAxLAorCQkJCQkJICAgICAoaW50KW5ld19zaXplKTsKKwkJbWVtY3B5KG5wLCBvcCwgbmV3X21heCAqICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCkpOworCisJCS8qCisJCSAqIFRoZW4gY29weSB0aGUgcG9pbnRlcnMuCisJCSAqLworCQlvcCA9IChjaGFyICopWEZTX0JNQVBfQlJPT1RfUFRSX0FERFIoaWZwLT5pZl9icm9vdCwgMSwKKwkJCQkJCSAgICAgaWZwLT5pZl9icm9vdF9ieXRlcyk7CisJCW5wID0gKGNoYXIgKilYRlNfQk1BUF9CUk9PVF9QVFJfQUREUihuZXdfYnJvb3QsIDEsCisJCQkJCQkgICAgIChpbnQpbmV3X3NpemUpOworCQltZW1jcHkobnAsIG9wLCBuZXdfbWF4ICogKHVpbnQpc2l6ZW9mKHhmc19kZnNibm9fdCkpOworCX0KKwlrbWVtX2ZyZWUoaWZwLT5pZl9icm9vdCwgaWZwLT5pZl9icm9vdF9ieXRlcyk7CisJaWZwLT5pZl9icm9vdCA9IG5ld19icm9vdDsKKwlpZnAtPmlmX2Jyb290X2J5dGVzID0gKGludCluZXdfc2l6ZTsKKwlBU1NFUlQoaWZwLT5pZl9icm9vdF9ieXRlcyA8PQorCQlYRlNfSUZPUktfU0laRShpcCwgd2hpY2hmb3JrKSArIFhGU19CUk9PVF9TSVpFX0FESik7CisJcmV0dXJuOworfQorCisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBhbW91bnQgb2Ygc3BhY2UgbmVlZGVkIGZvciBpZl9leHRlbnRzCisgKiBpcyBpbmNyZWFzZWQgb3IgZGVjcmVhc2VkLiAgVGhlIGNoYW5nZSBpbiBzaXplIGlzIGluZGljYXRlZCBieQorICogdGhlIG51bWJlciBvZiBleHRlbnRzIHRoYXQgbmVlZCB0byBiZSBhZGRlZCBvciBkZWxldGVkIGluIHRoZQorICogZXh0X2RpZmYgcGFyYW1ldGVyLgorICoKKyAqIElmIHRoZSBhbW91bnQgb2Ygc3BhY2UgbmVlZGVkIGhhcyBkZWNyZWFzZWQgYmVsb3cgdGhlIHNpemUgb2YgdGhlCisgKiBpbmxpbmUgYnVmZmVyLCB0aGVuIHN3aXRjaCB0byB1c2luZyB0aGUgaW5saW5lIGJ1ZmZlci4gIE90aGVyd2lzZSwKKyAqIHVzZSBrbWVtX3JlYWxsb2MoKSBvciBrbWVtX2FsbG9jKCkgdG8gYWRqdXN0IHRoZSBzaXplIG9mIHRoZSBidWZmZXIKKyAqIHRvIHdoYXQgaXMgbmVlZGVkLgorICoKKyAqIGlwIC0tIHRoZSBpbm9kZSB3aG9zZSBpZl9leHRlbnRzIGFyZWEgaXMgY2hhbmdpbmcKKyAqIGV4dF9kaWZmIC0tIHRoZSBjaGFuZ2UgaW4gdGhlIG51bWJlciBvZiBleHRlbnRzLCBwb3NpdGl2ZSBvciBuZWdhdGl2ZSwKKyAqCSByZXF1ZXN0ZWQgZm9yIHRoZSBpZl9leHRlbnRzIGFycmF5LgorICovCit2b2lkCit4ZnNfaWV4dF9yZWFsbG9jKAorCXhmc19pbm9kZV90CSppcCwKKwlpbnQJCWV4dF9kaWZmLAorCWludAkJd2hpY2hmb3JrKQoreworCWludAkJYnl0ZV9kaWZmOworCXhmc19pZm9ya190CSppZnA7CisJaW50CQluZXdfc2l6ZTsKKwl1aW50CQlybmV3X3NpemU7CisKKwlpZiAoZXh0X2RpZmYgPT0gMCkgeworCQlyZXR1cm47CisJfQorCisJaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgd2hpY2hmb3JrKTsKKwlieXRlX2RpZmYgPSBleHRfZGlmZiAqICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCk7CisJbmV3X3NpemUgPSAoaW50KWlmcC0+aWZfYnl0ZXMgKyBieXRlX2RpZmY7CisJQVNTRVJUKG5ld19zaXplID49IDApOworCisJaWYgKG5ld19zaXplID09IDApIHsKKwkJaWYgKGlmcC0+aWZfdTEuaWZfZXh0ZW50cyAhPSBpZnAtPmlmX3UyLmlmX2lubGluZV9leHQpIHsKKwkJCUFTU0VSVChpZnAtPmlmX3JlYWxfYnl0ZXMgIT0gMCk7CisJCQlrbWVtX2ZyZWUoaWZwLT5pZl91MS5pZl9leHRlbnRzLCBpZnAtPmlmX3JlYWxfYnl0ZXMpOworCQl9CisJCWlmcC0+aWZfdTEuaWZfZXh0ZW50cyA9IE5VTEw7CisJCXJuZXdfc2l6ZSA9IDA7CisJfSBlbHNlIGlmIChuZXdfc2l6ZSA8PSBzaXplb2YoaWZwLT5pZl91Mi5pZl9pbmxpbmVfZXh0KSkgeworCQkvKgorCQkgKiBJZiB0aGUgdmFsaWQgZXh0ZW50cyBjYW4gZml0IGluIGlmX2lubGluZV9leHQsCisJCSAqIGNvcHkgdGhlbSBmcm9tIHRoZSBtYWxsb2MnZCB2ZWN0b3IgYW5kIGZyZWUgaXQuCisJCSAqLworCQlpZiAoaWZwLT5pZl91MS5pZl9leHRlbnRzICE9IGlmcC0+aWZfdTIuaWZfaW5saW5lX2V4dCkgeworCQkJLyoKKwkJCSAqIEZvciBub3csIGVtcHR5IGZpbGVzIGFyZSBmb3JtYXQgRVhURU5UUywKKwkJCSAqIHNvIHRoZSBpZl9leHRlbnRzIHBvaW50ZXIgaXMgbnVsbC4KKwkJCSAqLworCQkJaWYgKGlmcC0+aWZfdTEuaWZfZXh0ZW50cykgeworCQkJCW1lbWNweShpZnAtPmlmX3UyLmlmX2lubGluZV9leHQsCisJCQkJCWlmcC0+aWZfdTEuaWZfZXh0ZW50cywgbmV3X3NpemUpOworCQkJCWttZW1fZnJlZShpZnAtPmlmX3UxLmlmX2V4dGVudHMsCisJCQkJCSAgaWZwLT5pZl9yZWFsX2J5dGVzKTsKKwkJCX0KKwkJCWlmcC0+aWZfdTEuaWZfZXh0ZW50cyA9IGlmcC0+aWZfdTIuaWZfaW5saW5lX2V4dDsKKwkJfQorCQlybmV3X3NpemUgPSAwOworCX0gZWxzZSB7CisJCXJuZXdfc2l6ZSA9IG5ld19zaXplOworCQlpZiAoKHJuZXdfc2l6ZSAmIChybmV3X3NpemUgLSAxKSkgIT0gMCkKKwkJCXJuZXdfc2l6ZSA9IHhmc19pcm91bmR1cChybmV3X3NpemUpOworCQkvKgorCQkgKiBTdHVjayB3aXRoIG1hbGxvYy9yZWFsbG9jLgorCQkgKi8KKwkJaWYgKGlmcC0+aWZfdTEuaWZfZXh0ZW50cyA9PSBpZnAtPmlmX3UyLmlmX2lubGluZV9leHQpIHsKKwkJCWlmcC0+aWZfdTEuaWZfZXh0ZW50cyA9ICh4ZnNfYm1idF9yZWNfdCAqKQorCQkJCWttZW1fYWxsb2Mocm5ld19zaXplLCBLTV9TTEVFUCk7CisJCQltZW1jcHkoaWZwLT5pZl91MS5pZl9leHRlbnRzLCBpZnAtPmlmX3UyLmlmX2lubGluZV9leHQsCisJCQkgICAgICBzaXplb2YoaWZwLT5pZl91Mi5pZl9pbmxpbmVfZXh0KSk7CisJCX0gZWxzZSBpZiAocm5ld19zaXplICE9IGlmcC0+aWZfcmVhbF9ieXRlcykgeworCQkJaWZwLT5pZl91MS5pZl9leHRlbnRzID0gKHhmc19ibWJ0X3JlY190ICopCisJCQkgIGttZW1fcmVhbGxvYyhpZnAtPmlmX3UxLmlmX2V4dGVudHMsCisJCQkJCXJuZXdfc2l6ZSwKKwkJCQkJaWZwLT5pZl9yZWFsX2J5dGVzLAorCQkJCQlLTV9OT0ZTKTsKKwkJfQorCX0KKwlpZnAtPmlmX3JlYWxfYnl0ZXMgPSBybmV3X3NpemU7CisJaWZwLT5pZl9ieXRlcyA9IG5ld19zaXplOworfQorCisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBhbW91bnQgb2Ygc3BhY2UgbmVlZGVkIGZvciBpZl9kYXRhCisgKiBpcyBpbmNyZWFzZWQgb3IgZGVjcmVhc2VkLiAgVGhlIGNoYW5nZSBpbiBzaXplIGlzIGluZGljYXRlZCBieQorICogdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IG5lZWQgdG8gYmUgYWRkZWQgb3IgZGVsZXRlZCBpbiB0aGUKKyAqIGJ5dGVfZGlmZiBwYXJhbWV0ZXIuCisgKgorICogSWYgdGhlIGFtb3VudCBvZiBzcGFjZSBuZWVkZWQgaGFzIGRlY3JlYXNlZCBiZWxvdyB0aGUgc2l6ZSBvZiB0aGUKKyAqIGlubGluZSBidWZmZXIsIHRoZW4gc3dpdGNoIHRvIHVzaW5nIHRoZSBpbmxpbmUgYnVmZmVyLiAgT3RoZXJ3aXNlLAorICogdXNlIGttZW1fcmVhbGxvYygpIG9yIGttZW1fYWxsb2MoKSB0byBhZGp1c3QgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlcgorICogdG8gd2hhdCBpcyBuZWVkZWQuCisgKgorICogaXAgLS0gdGhlIGlub2RlIHdob3NlIGlmX2RhdGEgYXJlYSBpcyBjaGFuZ2luZworICogYnl0ZV9kaWZmIC0tIHRoZSBjaGFuZ2UgaW4gdGhlIG51bWJlciBvZiBieXRlcywgcG9zaXRpdmUgb3IgbmVnYXRpdmUsCisgKgkgcmVxdWVzdGVkIGZvciB0aGUgaWZfZGF0YSBhcnJheS4KKyAqLwordm9pZAoreGZzX2lkYXRhX3JlYWxsb2MoCisJeGZzX2lub2RlX3QJKmlwLAorCWludAkJYnl0ZV9kaWZmLAorCWludAkJd2hpY2hmb3JrKQoreworCXhmc19pZm9ya190CSppZnA7CisJaW50CQluZXdfc2l6ZTsKKwlpbnQJCXJlYWxfc2l6ZTsKKworCWlmIChieXRlX2RpZmYgPT0gMCkgeworCQlyZXR1cm47CisJfQorCisJaWZwID0gWEZTX0lGT1JLX1BUUihpcCwgd2hpY2hmb3JrKTsKKwluZXdfc2l6ZSA9IChpbnQpaWZwLT5pZl9ieXRlcyArIGJ5dGVfZGlmZjsKKwlBU1NFUlQobmV3X3NpemUgPj0gMCk7CisKKwlpZiAobmV3X3NpemUgPT0gMCkgeworCQlpZiAoaWZwLT5pZl91MS5pZl9kYXRhICE9IGlmcC0+aWZfdTIuaWZfaW5saW5lX2RhdGEpIHsKKwkJCWttZW1fZnJlZShpZnAtPmlmX3UxLmlmX2RhdGEsIGlmcC0+aWZfcmVhbF9ieXRlcyk7CisJCX0KKwkJaWZwLT5pZl91MS5pZl9kYXRhID0gTlVMTDsKKwkJcmVhbF9zaXplID0gMDsKKwl9IGVsc2UgaWYgKG5ld19zaXplIDw9IHNpemVvZihpZnAtPmlmX3UyLmlmX2lubGluZV9kYXRhKSkgeworCQkvKgorCQkgKiBJZiB0aGUgdmFsaWQgZXh0ZW50cy9kYXRhIGNhbiBmaXQgaW4gaWZfaW5saW5lX2V4dC9kYXRhLAorCQkgKiBjb3B5IHRoZW0gZnJvbSB0aGUgbWFsbG9jJ2QgdmVjdG9yIGFuZCBmcmVlIGl0LgorCQkgKi8KKwkJaWYgKGlmcC0+aWZfdTEuaWZfZGF0YSA9PSBOVUxMKSB7CisJCQlpZnAtPmlmX3UxLmlmX2RhdGEgPSBpZnAtPmlmX3UyLmlmX2lubGluZV9kYXRhOworCQl9IGVsc2UgaWYgKGlmcC0+aWZfdTEuaWZfZGF0YSAhPSBpZnAtPmlmX3UyLmlmX2lubGluZV9kYXRhKSB7CisJCQlBU1NFUlQoaWZwLT5pZl9yZWFsX2J5dGVzICE9IDApOworCQkJbWVtY3B5KGlmcC0+aWZfdTIuaWZfaW5saW5lX2RhdGEsIGlmcC0+aWZfdTEuaWZfZGF0YSwKKwkJCSAgICAgIG5ld19zaXplKTsKKwkJCWttZW1fZnJlZShpZnAtPmlmX3UxLmlmX2RhdGEsIGlmcC0+aWZfcmVhbF9ieXRlcyk7CisJCQlpZnAtPmlmX3UxLmlmX2RhdGEgPSBpZnAtPmlmX3UyLmlmX2lubGluZV9kYXRhOworCQl9CisJCXJlYWxfc2l6ZSA9IDA7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogU3R1Y2sgd2l0aCBtYWxsb2MvcmVhbGxvYy4KKwkJICogRm9yIGlubGluZSBkYXRhLCB0aGUgdW5kZXJseWluZyBidWZmZXIgbXVzdCBiZQorCQkgKiBhIG11bHRpcGxlIG9mIDQgYnl0ZXMgaW4gc2l6ZSBzbyB0aGF0IGl0IGNhbiBiZQorCQkgKiBsb2dnZWQgYW5kIHN0YXkgb24gd29yZCBib3VuZGFyaWVzLiAgV2UgZW5mb3JjZQorCQkgKiB0aGF0IGhlcmUuCisJCSAqLworCQlyZWFsX3NpemUgPSByb3VuZHVwKG5ld19zaXplLCA0KTsKKwkJaWYgKGlmcC0+aWZfdTEuaWZfZGF0YSA9PSBOVUxMKSB7CisJCQlBU1NFUlQoaWZwLT5pZl9yZWFsX2J5dGVzID09IDApOworCQkJaWZwLT5pZl91MS5pZl9kYXRhID0ga21lbV9hbGxvYyhyZWFsX3NpemUsIEtNX1NMRUVQKTsKKwkJfSBlbHNlIGlmIChpZnAtPmlmX3UxLmlmX2RhdGEgIT0gaWZwLT5pZl91Mi5pZl9pbmxpbmVfZGF0YSkgeworCQkJLyoKKwkJCSAqIE9ubHkgZG8gdGhlIHJlYWxsb2MgaWYgdGhlIHVuZGVybHlpbmcgc2l6ZQorCQkJICogaXMgcmVhbGx5IGNoYW5naW5nLgorCQkJICovCisJCQlpZiAoaWZwLT5pZl9yZWFsX2J5dGVzICE9IHJlYWxfc2l6ZSkgeworCQkJCWlmcC0+aWZfdTEuaWZfZGF0YSA9CisJCQkJCWttZW1fcmVhbGxvYyhpZnAtPmlmX3UxLmlmX2RhdGEsCisJCQkJCQkJcmVhbF9zaXplLAorCQkJCQkJCWlmcC0+aWZfcmVhbF9ieXRlcywKKwkJCQkJCQlLTV9TTEVFUCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlBU1NFUlQoaWZwLT5pZl9yZWFsX2J5dGVzID09IDApOworCQkJaWZwLT5pZl91MS5pZl9kYXRhID0ga21lbV9hbGxvYyhyZWFsX3NpemUsIEtNX1NMRUVQKTsKKwkJCW1lbWNweShpZnAtPmlmX3UxLmlmX2RhdGEsIGlmcC0+aWZfdTIuaWZfaW5saW5lX2RhdGEsCisJCQkJaWZwLT5pZl9ieXRlcyk7CisJCX0KKwl9CisJaWZwLT5pZl9yZWFsX2J5dGVzID0gcmVhbF9zaXplOworCWlmcC0+aWZfYnl0ZXMgPSBuZXdfc2l6ZTsKKwlBU1NFUlQoaWZwLT5pZl9ieXRlcyA8PSBYRlNfSUZPUktfU0laRShpcCwgd2hpY2hmb3JrKSk7Cit9CisKKworCisKKy8qCisgKiBNYXAgaW5vZGUgdG8gZGlzayBibG9jayBhbmQgb2Zmc2V0LgorICoKKyAqIG1wIC0tIHRoZSBtb3VudCBwb2ludCBzdHJ1Y3R1cmUgZm9yIHRoZSBjdXJyZW50IGZpbGUgc3lzdGVtCisgKiB0cCAtLSB0aGUgY3VycmVudCB0cmFuc2FjdGlvbgorICogaW5vIC0tIHRoZSBpbm9kZSBudW1iZXIgb2YgdGhlIGlub2RlIHRvIGJlIGxvY2F0ZWQKKyAqIGltYXAgLS0gdGhpcyBzdHJ1Y3R1cmUgaXMgZmlsbGVkIGluIHdpdGggdGhlIGluZm9ybWF0aW9uIG5lY2Vzc2FyeQorICoJIHRvIHJldHJpZXZlIHRoZSBnaXZlbiBpbm9kZSBmcm9tIGRpc2sKKyAqIGZsYWdzIC0tIGZsYWdzIHRvIHBhc3MgdG8geGZzX2RpbG9jYXRlIGluZGljYXRpbmcgd2hldGhlciBvciBub3QKKyAqCSBsb29rdXBzIGluIHRoZSBpbm9kZSBidHJlZSB3ZXJlIE9LIG9yIG5vdAorICovCitpbnQKK3hmc19pbWFwKAorCXhmc19tb3VudF90CSptcCwKKwl4ZnNfdHJhbnNfdAkqdHAsCisJeGZzX2lub190CWlubywKKwl4ZnNfaW1hcF90CSppbWFwLAorCXVpbnQJCWZsYWdzKQoreworCXhmc19mc2Jsb2NrX3QJZnNibm87CisJaW50CQlsZW47CisJaW50CQlvZmY7CisJaW50CQllcnJvcjsKKworCWZzYm5vID0gaW1hcC0+aW1fYmxrbm8gPworCQlYRlNfREFERFJfVE9fRlNCKG1wLCBpbWFwLT5pbV9ibGtubykgOiBOVUxMRlNCTE9DSzsKKwllcnJvciA9IHhmc19kaWxvY2F0ZShtcCwgdHAsIGlubywgJmZzYm5vLCAmbGVuLCAmb2ZmLCBmbGFncyk7CisJaWYgKGVycm9yICE9IDApIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlpbWFwLT5pbV9ibGtubyA9IFhGU19GU0JfVE9fREFERFIobXAsIGZzYm5vKTsKKwlpbWFwLT5pbV9sZW4gPSBYRlNfRlNCX1RPX0JCKG1wLCBsZW4pOworCWltYXAtPmltX2FnYmxrbm8gPSBYRlNfRlNCX1RPX0FHQk5PKG1wLCBmc2Jubyk7CisJaW1hcC0+aW1faW9mZnNldCA9ICh1c2hvcnQpb2ZmOworCWltYXAtPmltX2JvZmZzZXQgPSAodXNob3J0KShvZmYgPDwgbXAtPm1fc2Iuc2JfaW5vZGVsb2cpOworCXJldHVybiAwOworfQorCit2b2lkCit4ZnNfaWRlc3Ryb3lfZm9yaygKKwl4ZnNfaW5vZGVfdAkqaXAsCisJaW50CQl3aGljaGZvcmspCit7CisJeGZzX2lmb3JrX3QJKmlmcDsKKworCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7CisJaWYgKGlmcC0+aWZfYnJvb3QgIT0gTlVMTCkgeworCQlrbWVtX2ZyZWUoaWZwLT5pZl9icm9vdCwgaWZwLT5pZl9icm9vdF9ieXRlcyk7CisJCWlmcC0+aWZfYnJvb3QgPSBOVUxMOworCX0KKworCS8qCisJICogSWYgdGhlIGZvcm1hdCBpcyBsb2NhbCwgdGhlbiB3ZSBjYW4ndCBoYXZlIGFuIGV4dGVudHMKKwkgKiBhcnJheSBzbyBqdXN0IGxvb2sgZm9yIGFuIGlubGluZSBkYXRhIGFycmF5LiAgSWYgd2UncmUKKwkgKiBub3QgbG9jYWwgdGhlbiB3ZSBtYXkgb3IgbWF5IG5vdCBoYXZlIGFuIGV4dGVudHMgbGlzdCwKKwkgKiBzbyBjaGVjayBhbmQgZnJlZSBpdCB1cCBpZiB3ZSBkby4KKwkgKi8KKwlpZiAoWEZTX0lGT1JLX0ZPUk1BVChpcCwgd2hpY2hmb3JrKSA9PSBYRlNfRElOT0RFX0ZNVF9MT0NBTCkgeworCQlpZiAoKGlmcC0+aWZfdTEuaWZfZGF0YSAhPSBpZnAtPmlmX3UyLmlmX2lubGluZV9kYXRhKSAmJgorCQkgICAgKGlmcC0+aWZfdTEuaWZfZGF0YSAhPSBOVUxMKSkgeworCQkJQVNTRVJUKGlmcC0+aWZfcmVhbF9ieXRlcyAhPSAwKTsKKwkJCWttZW1fZnJlZShpZnAtPmlmX3UxLmlmX2RhdGEsIGlmcC0+aWZfcmVhbF9ieXRlcyk7CisJCQlpZnAtPmlmX3UxLmlmX2RhdGEgPSBOVUxMOworCQkJaWZwLT5pZl9yZWFsX2J5dGVzID0gMDsKKwkJfQorCX0gZWxzZSBpZiAoKGlmcC0+aWZfZmxhZ3MgJiBYRlNfSUZFWFRFTlRTKSAmJgorCQkgICAoaWZwLT5pZl91MS5pZl9leHRlbnRzICE9IE5VTEwpICYmCisJCSAgIChpZnAtPmlmX3UxLmlmX2V4dGVudHMgIT0gaWZwLT5pZl91Mi5pZl9pbmxpbmVfZXh0KSkgeworCQlBU1NFUlQoaWZwLT5pZl9yZWFsX2J5dGVzICE9IDApOworCQlrbWVtX2ZyZWUoaWZwLT5pZl91MS5pZl9leHRlbnRzLCBpZnAtPmlmX3JlYWxfYnl0ZXMpOworCQlpZnAtPmlmX3UxLmlmX2V4dGVudHMgPSBOVUxMOworCQlpZnAtPmlmX3JlYWxfYnl0ZXMgPSAwOworCX0KKwlBU1NFUlQoaWZwLT5pZl91MS5pZl9leHRlbnRzID09IE5VTEwgfHwKKwkgICAgICAgaWZwLT5pZl91MS5pZl9leHRlbnRzID09IGlmcC0+aWZfdTIuaWZfaW5saW5lX2V4dCk7CisJQVNTRVJUKGlmcC0+aWZfcmVhbF9ieXRlcyA9PSAwKTsKKwlpZiAod2hpY2hmb3JrID09IFhGU19BVFRSX0ZPUkspIHsKKwkJa21lbV96b25lX2ZyZWUoeGZzX2lmb3JrX3pvbmUsIGlwLT5pX2FmcCk7CisJCWlwLT5pX2FmcCA9IE5VTEw7CisJfQorfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgZnJlZSBhbGwgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggYW4gaW5vZGUuCisgKiBJdCBtdXN0IGZyZWUgdGhlIGlub2RlIGl0c2VsZiBhbmQgYW55IGJ1ZmZlcnMgYWxsb2NhdGVkIGZvcgorICogaWZfZXh0ZW50cy9pZl9kYXRhIGFuZCBpZl9icm9vdC4gIEl0IG11c3QgYWxzbyBmcmVlIHRoZSBsb2NrCisgKiBhc3NvY2lhdGVkIHdpdGggdGhlIGlub2RlLgorICovCit2b2lkCit4ZnNfaWRlc3Ryb3koCisJeGZzX2lub2RlX3QJKmlwKQoreworCisJc3dpdGNoIChpcC0+aV9kLmRpX21vZGUgJiBTX0lGTVQpIHsKKwljYXNlIFNfSUZSRUc6CisJY2FzZSBTX0lGRElSOgorCWNhc2UgU19JRkxOSzoKKwkJeGZzX2lkZXN0cm95X2ZvcmsoaXAsIFhGU19EQVRBX0ZPUkspOworCQlicmVhazsKKwl9CisJaWYgKGlwLT5pX2FmcCkKKwkJeGZzX2lkZXN0cm95X2ZvcmsoaXAsIFhGU19BVFRSX0ZPUkspOworCW1yZnJlZSgmaXAtPmlfbG9jayk7CisJbXJmcmVlKCZpcC0+aV9pb2xvY2spOworCWZyZWVzZW1hKCZpcC0+aV9mbG9jayk7CisjaWZkZWYgWEZTX0JNQVBfVFJBQ0UKKwlrdHJhY2VfZnJlZShpcC0+aV94dHJhY2UpOworI2VuZGlmCisjaWZkZWYgWEZTX0JNQlRfVFJBQ0UKKwlrdHJhY2VfZnJlZShpcC0+aV9idHJhY2UpOworI2VuZGlmCisjaWZkZWYgWEZTX1JXX1RSQUNFCisJa3RyYWNlX2ZyZWUoaXAtPmlfcnd0cmFjZSk7CisjZW5kaWYKKyNpZmRlZiBYRlNfSUxPQ0tfVFJBQ0UKKwlrdHJhY2VfZnJlZShpcC0+aV9sb2NrX3RyYWNlKTsKKyNlbmRpZgorI2lmZGVmIFhGU19ESVIyX1RSQUNFCisJa3RyYWNlX2ZyZWUoaXAtPmlfZGlyX3RyYWNlKTsKKyNlbmRpZgorCWlmIChpcC0+aV9pdGVtcCkgeworCQkvKiBYWFhkcGQgc2hvdWxkIGJlIGFibGUgdG8gYXNzZXJ0IHRoaXMgYnV0IHNodXRkb3duCisJCSAqIGlzIGxlYXZpbmcgdGhlIEFJTCBiZWhpbmQuICovCisJCUFTU0VSVCgoKGlwLT5pX2l0ZW1wLT5pbGlfaXRlbS5saV9mbGFncyAmIFhGU19MSV9JTl9BSUwpID09IDApIHx8CisJCSAgICAgICBYRlNfRk9SQ0VEX1NIVVRET1dOKGlwLT5pX21vdW50KSk7CisJCXhmc19pbm9kZV9pdGVtX2Rlc3Ryb3koaXApOworCX0KKwlrbWVtX3pvbmVfZnJlZSh4ZnNfaW5vZGVfem9uZSwgaXApOworfQorCisKKy8qCisgKiBJbmNyZW1lbnQgdGhlIHBpbiBjb3VudCBvZiB0aGUgZ2l2ZW4gYnVmZmVyLgorICogVGhpcyB2YWx1ZSBpcyBwcm90ZWN0ZWQgYnkgaXBpbmxvY2sgc3BpbmxvY2sgaW4gdGhlIG1vdW50IHN0cnVjdHVyZS4KKyAqLwordm9pZAoreGZzX2lwaW4oCisJeGZzX2lub2RlX3QJKmlwKQoreworCUFTU0VSVChpc21ybG9ja2VkKCZpcC0+aV9sb2NrLCBNUl9VUERBVEUpKTsKKworCWF0b21pY19pbmMoJmlwLT5pX3BpbmNvdW50KTsKK30KKworLyoKKyAqIERlY3JlbWVudCB0aGUgcGluIGNvdW50IG9mIHRoZSBnaXZlbiBpbm9kZSwgYW5kIHdha2UgdXAKKyAqIGFueW9uZSBpbiB4ZnNfaXdhaXRfdW5waW4oKSBpZiB0aGUgY291bnQgZ29lcyB0byAwLiAgVGhlCisgKiBpbm9kZSBtdXN0IGhhdmUgYmVlbiBwcmV2aW91bHN5IHBpbm5lZCB3aXRoIGEgY2FsbCB0byB4ZnNfaXBpbigpLgorICovCit2b2lkCit4ZnNfaXVucGluKAorCXhmc19pbm9kZV90CSppcCkKK3sKKwlBU1NFUlQoYXRvbWljX3JlYWQoJmlwLT5pX3BpbmNvdW50KSA+IDApOworCisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmlwLT5pX3BpbmNvdW50KSkgeworCQl2bm9kZV90CSp2cCA9IFhGU19JVE9WX05VTEwoaXApOworCisJCS8qIG1ha2Ugc3luYyBjb21lIGJhY2sgYW5kIGZsdXNoIHRoaXMgaW5vZGUgKi8KKwkJaWYgKHZwKSB7CisJCQlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gTElOVkZTX0dFVF9JUCh2cCk7CisKKwkJCWlmICghKGlub2RlLT5pX3N0YXRlICYgSV9ORVcpKQorCQkJCW1hcmtfaW5vZGVfZGlydHlfc3luYyhpbm9kZSk7CisJCX0KKworCQl3YWtlX3VwKCZpcC0+aV9pcGluX3dhaXQpOworCX0KK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHRvIHdhaXQgZm9yIHRoZSBnaXZlbiBpbm9kZSB0byBiZSB1bnBpbm5lZC4KKyAqIEl0IHdpbGwgc2xlZXAgdW50aWwgdGhpcyBoYXBwZW5zLiAgVGhlIGNhbGxlciBtdXN0IGhhdmUgdGhlCisgKiBpbm9kZSBsb2NrZWQgaW4gYXQgbGVhc3Qgc2hhcmVkIG1vZGUgc28gdGhhdCB0aGUgYnVmZmVyIGNhbm5vdAorICogYmUgc3Vic2VxdWVudGx5IHBpbm5lZCBvbmNlIHNvbWVvbmUgaXMgd2FpdGluZyBmb3IgaXQgdG8gYmUKKyAqIHVucGlubmVkLgorICovCit2b2lkCit4ZnNfaXVucGluX3dhaXQoCisJeGZzX2lub2RlX3QJKmlwKQoreworCXhmc19pbm9kZV9sb2dfaXRlbV90CSppaXA7CisJeGZzX2xzbl90CWxzbjsKKworCUFTU0VSVChpc21ybG9ja2VkKCZpcC0+aV9sb2NrLCBNUl9VUERBVEUgfCBNUl9BQ0NFU1MpKTsKKworCWlmIChhdG9taWNfcmVhZCgmaXAtPmlfcGluY291bnQpID09IDApIHsKKwkJcmV0dXJuOworCX0KKworCWlpcCA9IGlwLT5pX2l0ZW1wOworCWlmIChpaXAgJiYgaWlwLT5pbGlfbGFzdF9sc24pIHsKKwkJbHNuID0gaWlwLT5pbGlfbGFzdF9sc247CisJfSBlbHNlIHsKKwkJbHNuID0gKHhmc19sc25fdCkwOworCX0KKworCS8qCisJICogR2l2ZSB0aGUgbG9nIGEgcHVzaCBzbyB3ZSBkb24ndCB3YWl0IGhlcmUgdG9vIGxvbmcuCisJICovCisJeGZzX2xvZ19mb3JjZShpcC0+aV9tb3VudCwgbHNuLCBYRlNfTE9HX0ZPUkNFKTsKKworCXdhaXRfZXZlbnQoaXAtPmlfaXBpbl93YWl0LCAoYXRvbWljX3JlYWQoJmlwLT5pX3BpbmNvdW50KSA9PSAwKSk7Cit9CisKKworLyoKKyAqIHhmc19pZXh0ZW50c19jb3B5KCkKKyAqCisgKiBUaGlzIGlzIGNhbGxlZCB0byBjb3B5IHRoZSBSRUFMIGV4dGVudHMgKGFzIG9wcG9zZWQgdG8gdGhlIGRlbGF5ZWQKKyAqIGFsbG9jYXRpb24gZXh0ZW50cykgZnJvbSB0aGUgaW5vZGUgaW50byB0aGUgZ2l2ZW4gYnVmZmVyLiAgSXQKKyAqIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgaW50byB0aGUgYnVmZmVyLgorICoKKyAqIElmIHRoZXJlIGFyZSBubyBkZWxheWVkIGFsbG9jYXRpb24gZXh0ZW50cywgdGhlbiB3ZSBjYW4ganVzdAorICogbWVtY3B5KCkgdGhlIGV4dGVudHMgaW50byB0aGUgYnVmZmVyLiAgT3RoZXJ3aXNlLCB3ZSBuZWVkIHRvCisgKiBleGFtaW5lIGVhY2ggZXh0ZW50IGluIHR1cm4gYW5kIHNraXAgdGhvc2Ugd2hpY2ggYXJlIGRlbGF5ZWQuCisgKi8KK2ludAoreGZzX2lleHRlbnRzX2NvcHkoCisJeGZzX2lub2RlX3QJCSppcCwKKwl4ZnNfYm1idF9yZWNfdAkJKmJ1ZmZlciwKKwlpbnQJCQl3aGljaGZvcmspCit7CisJaW50CQkJY29waWVkOworCXhmc19ibWJ0X3JlY190CQkqZGVzdF9lcDsKKwl4ZnNfYm1idF9yZWNfdAkJKmVwOworI2lmZGVmIFhGU19CTUFQX1RSQUNFCisJc3RhdGljIGNoYXIJCWZuYW1lW10gPSAieGZzX2lleHRlbnRzX2NvcHkiOworI2VuZGlmCisJaW50CQkJaTsKKwl4ZnNfaWZvcmtfdAkJKmlmcDsKKwlpbnQJCQlucmVjczsKKwl4ZnNfZnNibG9ja190CQlzdGFydF9ibG9jazsKKworCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7CisJQVNTRVJUKGlzbXJsb2NrZWQoJmlwLT5pX2xvY2ssIE1SX1VQREFURXxNUl9BQ0NFU1MpKTsKKwlBU1NFUlQoaWZwLT5pZl9ieXRlcyA+IDApOworCisJbnJlY3MgPSBpZnAtPmlmX2J5dGVzIC8gKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KTsKKwl4ZnNfYm1hcF90cmFjZV9leGxpc3QoZm5hbWUsIGlwLCBucmVjcywgd2hpY2hmb3JrKTsKKwlBU1NFUlQobnJlY3MgPiAwKTsKKworCS8qCisJICogVGhlcmUgYXJlIHNvbWUgZGVsYXllZCBhbGxvY2F0aW9uIGV4dGVudHMgaW4gdGhlCisJICogaW5vZGUsIHNvIGNvcHkgdGhlIGV4dGVudHMgb25lIGF0IGEgdGltZSBhbmQgc2tpcAorCSAqIHRoZSBkZWxheWVkIG9uZXMuICBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZQorCSAqIG5vbi1kZWxheWVkIGV4dGVudC4KKwkgKi8KKwllcCA9IGlmcC0+aWZfdTEuaWZfZXh0ZW50czsKKwlkZXN0X2VwID0gYnVmZmVyOworCWNvcGllZCA9IDA7CisJZm9yIChpID0gMDsgaSA8IG5yZWNzOyBpKyspIHsKKwkJc3RhcnRfYmxvY2sgPSB4ZnNfYm1idF9nZXRfc3RhcnRibG9jayhlcCk7CisJCWlmIChJU05VTExTVEFSVEJMT0NLKHN0YXJ0X2Jsb2NrKSkgeworCQkJLyoKKwkJCSAqIEl0J3MgYSBkZWxheWVkIGFsbG9jYXRpb24gZXh0ZW50LCBzbyBza2lwIGl0LgorCQkJICovCisJCQllcCsrOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBUcmFuc2xhdGUgdG8gb24gZGlzayBmb3JtYXQgKi8KKwkJcHV0X3VuYWxpZ25lZChJTlRfR0VUKGVwLT5sMCwgQVJDSF9DT05WRVJUKSwKKwkJCSAgICAgIChfX3VpbnQ2NF90KikmZGVzdF9lcC0+bDApOworCQlwdXRfdW5hbGlnbmVkKElOVF9HRVQoZXAtPmwxLCBBUkNIX0NPTlZFUlQpLAorCQkJICAgICAgKF9fdWludDY0X3QqKSZkZXN0X2VwLT5sMSk7CisJCWRlc3RfZXArKzsKKwkJZXArKzsKKwkJY29waWVkKys7CisJfQorCUFTU0VSVChjb3BpZWQgIT0gMCk7CisJeGZzX3ZhbGlkYXRlX2V4dGVudHMoYnVmZmVyLCBjb3BpZWQsIDEsIFhGU19FWFRGTVRfSU5PREUoaXApKTsKKworCXJldHVybiAoY29waWVkICogKHVpbnQpc2l6ZW9mKHhmc19ibWJ0X3JlY190KSk7Cit9CisKKy8qCisgKiBFYWNoIG9mIHRoZSBmb2xsb3dpbmcgY2FzZXMgc3RvcmVzIGRhdGEgaW50byB0aGUgc2FtZSByZWdpb24KKyAqIG9mIHRoZSBvbi1kaXNrIGlub2RlLCBzbyBvbmx5IG9uZSBvZiB0aGVtIGNhbiBiZSB2YWxpZCBhdAorICogYW55IGdpdmVuIHRpbWUuIFdoaWxlIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgY29uZmxpY3RpbmcgZm9ybWF0cworICogYW5kIGxvZyBmbGFncywgZS5nLiBoYXZpbmcgWEZTX0lMT0dfP0RBVEEgc2V0IHdoZW4gdGhlIGZvcmsgaXMKKyAqIGluIEVYVEVOVFMgZm9ybWF0LCB0aGlzIGNhbiBvbmx5IGhhcHBlbiB3aGVuIHRoZSBmb3JrIGhhcworICogY2hhbmdlZCBmb3JtYXRzIGFmdGVyIGJlaW5nIG1vZGlmaWVkIGJ1dCBiZWZvcmUgYmVpbmcgZmx1c2hlZC4KKyAqIEluIHRoZXNlIGNhc2VzLCB0aGUgZm9ybWF0IGFsd2F5cyB0YWtlcyBwcmVjZWRlbmNlLCBiZWNhdXNlIHRoZQorICogZm9ybWF0IGluZGljYXRlcyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgZm9yay4KKyAqLworLypBUkdTVVNFRCovCitTVEFUSUMgaW50Cit4ZnNfaWZsdXNoX2ZvcmsoCisJeGZzX2lub2RlX3QJCSppcCwKKwl4ZnNfZGlub2RlX3QJCSpkaXAsCisJeGZzX2lub2RlX2xvZ19pdGVtX3QJKmlpcCwKKwlpbnQJCQl3aGljaGZvcmssCisJeGZzX2J1Zl90CQkqYnApCit7CisJY2hhcgkJCSpjcDsKKwl4ZnNfaWZvcmtfdAkJKmlmcDsKKwl4ZnNfbW91bnRfdAkJKm1wOworI2lmZGVmIFhGU19UUkFOU19ERUJVRworCWludAkJCWZpcnN0OworI2VuZGlmCisJc3RhdGljIGNvbnN0IHNob3J0CWJyb290ZmxhZ1syXSA9CisJCXsgWEZTX0lMT0dfREJST09ULCBYRlNfSUxPR19BQlJPT1QgfTsKKwlzdGF0aWMgY29uc3Qgc2hvcnQJZGF0YWZsYWdbMl0gPQorCQl7IFhGU19JTE9HX0REQVRBLCBYRlNfSUxPR19BREFUQSB9OworCXN0YXRpYyBjb25zdCBzaG9ydAlleHRmbGFnWzJdID0KKwkJeyBYRlNfSUxPR19ERVhULCBYRlNfSUxPR19BRVhUIH07CisKKwlpZiAoaWlwID09IE5VTEwpCisJCXJldHVybiAwOworCWlmcCA9IFhGU19JRk9SS19QVFIoaXAsIHdoaWNoZm9yayk7CisJLyoKKwkgKiBUaGlzIGNhbiBoYXBwZW4gaWYgd2UgZ2F2ZSB1cCBpbiBpZm9ybWF0IGluIGFuIGVycm9yIHBhdGgsCisJICogZm9yIHRoZSBhdHRyaWJ1dGUgZm9yay4KKwkgKi8KKwlpZiAoaWZwID09IE5VTEwpIHsKKwkJQVNTRVJUKHdoaWNoZm9yayA9PSBYRlNfQVRUUl9GT1JLKTsKKwkJcmV0dXJuIDA7CisJfQorCWNwID0gWEZTX0RGT1JLX1BUUihkaXAsIHdoaWNoZm9yayk7CisJbXAgPSBpcC0+aV9tb3VudDsKKwlzd2l0Y2ggKFhGU19JRk9SS19GT1JNQVQoaXAsIHdoaWNoZm9yaykpIHsKKwljYXNlIFhGU19ESU5PREVfRk1UX0xPQ0FMOgorCQlpZiAoKGlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICYgZGF0YWZsYWdbd2hpY2hmb3JrXSkgJiYKKwkJICAgIChpZnAtPmlmX2J5dGVzID4gMCkpIHsKKwkJCUFTU0VSVChpZnAtPmlmX3UxLmlmX2RhdGEgIT0gTlVMTCk7CisJCQlBU1NFUlQoaWZwLT5pZl9ieXRlcyA8PSBYRlNfSUZPUktfU0laRShpcCwgd2hpY2hmb3JrKSk7CisJCQltZW1jcHkoY3AsIGlmcC0+aWZfdTEuaWZfZGF0YSwgaWZwLT5pZl9ieXRlcyk7CisJCX0KKwkJaWYgKHdoaWNoZm9yayA9PSBYRlNfREFUQV9GT1JLKSB7CisJCQlpZiAodW5saWtlbHkoWEZTX0RJUl9TSE9SVEZPUk1fVkFMSURBVEVfT05ESVNLKG1wLCBkaXApKSkgeworCQkJCVhGU19FUlJPUl9SRVBPUlQoInhmc19pZmx1c2hfZm9yayIsCisJCQkJCQkgWEZTX0VSUkxFVkVMX0xPVywgbXApOworCQkJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKworCWNhc2UgWEZTX0RJTk9ERV9GTVRfRVhURU5UUzoKKwkJQVNTRVJUKChpZnAtPmlmX2ZsYWdzICYgWEZTX0lGRVhURU5UUykgfHwKKwkJICAgICAgICEoaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJiBleHRmbGFnW3doaWNoZm9ya10pKTsKKwkJQVNTRVJUKChpZnAtPmlmX3UxLmlmX2V4dGVudHMgIT0gTlVMTCkgfHwgKGlmcC0+aWZfYnl0ZXMgPT0gMCkpOworCQlBU1NFUlQoKGlmcC0+aWZfdTEuaWZfZXh0ZW50cyA9PSBOVUxMKSB8fCAoaWZwLT5pZl9ieXRlcyA+IDApKTsKKwkJaWYgKChpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmIGV4dGZsYWdbd2hpY2hmb3JrXSkgJiYKKwkJICAgIChpZnAtPmlmX2J5dGVzID4gMCkpIHsKKwkJCUFTU0VSVChYRlNfSUZPUktfTkVYVEVOVFMoaXAsIHdoaWNoZm9yaykgPiAwKTsKKwkJCSh2b2lkKXhmc19pZXh0ZW50c19jb3B5KGlwLCAoeGZzX2JtYnRfcmVjX3QgKiljcCwKKwkJCQl3aGljaGZvcmspOworCQl9CisJCWJyZWFrOworCisJY2FzZSBYRlNfRElOT0RFX0ZNVF9CVFJFRToKKwkJaWYgKChpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmIGJyb290ZmxhZ1t3aGljaGZvcmtdKSAmJgorCQkgICAgKGlmcC0+aWZfYnJvb3RfYnl0ZXMgPiAwKSkgeworCQkJQVNTRVJUKGlmcC0+aWZfYnJvb3QgIT0gTlVMTCk7CisJCQlBU1NFUlQoaWZwLT5pZl9icm9vdF9ieXRlcyA8PQorCQkJICAgICAgIChYRlNfSUZPUktfU0laRShpcCwgd2hpY2hmb3JrKSArCisJCQkJWEZTX0JST09UX1NJWkVfQURKKSk7CisJCQl4ZnNfYm1idF90b19ibWRyKGlmcC0+aWZfYnJvb3QsIGlmcC0+aWZfYnJvb3RfYnl0ZXMsCisJCQkJKHhmc19ibWRyX2Jsb2NrX3QgKiljcCwKKwkJCQlYRlNfREZPUktfU0laRShkaXAsIG1wLCB3aGljaGZvcmspKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgWEZTX0RJTk9ERV9GTVRfREVWOgorCQlpZiAoaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJiBYRlNfSUxPR19ERVYpIHsKKwkJCUFTU0VSVCh3aGljaGZvcmsgPT0gWEZTX0RBVEFfRk9SSyk7CisJCQlJTlRfU0VUKGRpcC0+ZGlfdS5kaV9kZXYsIEFSQ0hfQ09OVkVSVCwgaXAtPmlfZGYuaWZfdTIuaWZfcmRldik7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFhGU19ESU5PREVfRk1UX1VVSUQ6CisJCWlmIChpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmIFhGU19JTE9HX1VVSUQpIHsKKwkJCUFTU0VSVCh3aGljaGZvcmsgPT0gWEZTX0RBVEFfRk9SSyk7CisJCQltZW1jcHkoJmRpcC0+ZGlfdS5kaV9tdXVpZCwgJmlwLT5pX2RmLmlmX3UyLmlmX3V1aWQsCisJCQkJc2l6ZW9mKHV1aWRfdCkpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQVNTRVJUKDApOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHhmc19pZmx1c2goKSB3aWxsIHdyaXRlIGEgbW9kaWZpZWQgaW5vZGUncyBjaGFuZ2VzIG91dCB0byB0aGUKKyAqIGlub2RlJ3Mgb24gZGlzayBob21lLiAgVGhlIGNhbGxlciBtdXN0IGhhdmUgdGhlIGlub2RlIGxvY2sgaGVsZAorICogaW4gYXQgbGVhc3Qgc2hhcmVkIG1vZGUgYW5kIHRoZSBpbm9kZSBmbHVzaCBzZW1hcGhvcmUgbXVzdCBiZQorICogaGVsZCBhcyB3ZWxsLiAgVGhlIGlub2RlIGxvY2sgd2lsbCBzdGlsbCBiZSBoZWxkIHVwb24gcmV0dXJuIGZyb20KKyAqIHRoZSBjYWxsIGFuZCB0aGUgY2FsbGVyIGlzIGZyZWUgdG8gdW5sb2NrIGl0LgorICogVGhlIGlub2RlIGZsdXNoIGxvY2sgd2lsbCBiZSB1bmxvY2tlZCB3aGVuIHRoZSBpbm9kZSByZWFjaGVzIHRoZSBkaXNrLgorICogVGhlIGZsYWdzIGluZGljYXRlIGhvdyB0aGUgaW5vZGUncyBidWZmZXIgc2hvdWxkIGJlIHdyaXR0ZW4gb3V0LgorICovCitpbnQKK3hmc19pZmx1c2goCisJeGZzX2lub2RlX3QJCSppcCwKKwl1aW50CQkJZmxhZ3MpCit7CisJeGZzX2lub2RlX2xvZ19pdGVtX3QJKmlpcDsKKwl4ZnNfYnVmX3QJCSpicDsKKwl4ZnNfZGlub2RlX3QJCSpkaXA7CisJeGZzX21vdW50X3QJCSptcDsKKwlpbnQJCQllcnJvcjsKKwkvKiBSRUZFUkVOQ0VEICovCisJeGZzX2NoYXNoX3QJCSpjaDsKKwl4ZnNfaW5vZGVfdAkJKmlxOworCWludAkJCWNsY291bnQ7CS8qIGNvdW50IG9mIGlub2RlcyBjbHVzdGVyZWQgKi8KKwlpbnQJCQlidWZ3YXNkZWx3cmk7CisJZW51bSB7IElOVF9ERUxXUkkgPSAoMSA8PCAwKSwgSU5UX0FTWU5DID0gKDEgPDwgMSkgfTsKKwlTUExERUNMKHMpOworCisJWEZTX1NUQVRTX0lOQyh4c19pZmx1c2hfY291bnQpOworCisJQVNTRVJUKGlzbXJsb2NrZWQoJmlwLT5pX2xvY2ssIE1SX1VQREFURXxNUl9BQ0NFU1MpKTsKKwlBU1NFUlQodmFsdXNlbWEoJmlwLT5pX2Zsb2NrKSA8PSAwKTsKKwlBU1NFUlQoaXAtPmlfZC5kaV9mb3JtYXQgIT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUgfHwKKwkgICAgICAgaXAtPmlfZC5kaV9uZXh0ZW50cyA+IGlwLT5pX2RmLmlmX2V4dF9tYXgpOworCisJaWlwID0gaXAtPmlfaXRlbXA7CisJbXAgPSBpcC0+aV9tb3VudDsKKworCS8qCisJICogSWYgdGhlIGlub2RlIGlzbid0IGRpcnR5LCB0aGVuIGp1c3QgcmVsZWFzZSB0aGUgaW5vZGUKKwkgKiBmbHVzaCBsb2NrIGFuZCBkbyBub3RoaW5nLgorCSAqLworCWlmICgoaXAtPmlfdXBkYXRlX2NvcmUgPT0gMCkgJiYKKwkgICAgKChpaXAgPT0gTlVMTCkgfHwgIShpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmIFhGU19JTE9HX0FMTCkpKSB7CisJCUFTU0VSVCgoaWlwICE9IE5VTEwpID8KKwkJCSAhKGlpcC0+aWxpX2l0ZW0ubGlfZmxhZ3MgJiBYRlNfTElfSU5fQUlMKSA6IDEpOworCQl4ZnNfaWZ1bmxvY2soaXApOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIFdlIGNhbid0IGZsdXNoIHRoZSBpbm9kZSB1bnRpbCBpdCBpcyB1bnBpbm5lZCwgc28KKwkgKiB3YWl0IGZvciBpdC4gIFdlIGtub3cgbm9vbmUgbmV3IGNhbiBwaW4gaXQsIGJlY2F1c2UKKwkgKiB3ZSBhcmUgaG9sZGluZyB0aGUgaW5vZGUgbG9jayBzaGFyZWQgYW5kIHlvdSBuZWVkCisJICogdG8gaG9sZCBpdCBleGNsdXNpdmVseSB0byBwaW4gdGhlIGlub2RlLgorCSAqLworCXhmc19pdW5waW5fd2FpdChpcCk7CisKKwkvKgorCSAqIFRoaXMgbWF5IGhhdmUgYmVlbiB1bnBpbm5lZCBiZWNhdXNlIHRoZSBmaWxlc3lzdGVtIGlzIHNodXR0aW5nCisJICogZG93biBmb3JjaWJseS4gSWYgdGhhdCdzIHRoZSBjYXNlIHdlIG11c3Qgbm90IHdyaXRlIHRoaXMgaW5vZGUKKwkgKiB0byBkaXNrLCBiZWNhdXNlIHRoZSBsb2cgcmVjb3JkIGRpZG4ndCBtYWtlIGl0IHRvIGRpc2shCisJICovCisJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKSB7CisJCWlwLT5pX3VwZGF0ZV9jb3JlID0gMDsKKwkJaWYgKGlpcCkKKwkJCWlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzID0gMDsKKwkJeGZzX2lmdW5sb2NrKGlwKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCX0KKworCS8qCisJICogR2V0IHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgb24tZGlzayBpbm9kZS4KKwkgKi8KKwllcnJvciA9IHhmc19pdG9icChtcCwgTlVMTCwgaXAsICZkaXAsICZicCwgMCk7CisJaWYgKGVycm9yICE9IDApIHsKKwkJeGZzX2lmdW5sb2NrKGlwKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCS8qCisJICogRGVjaWRlIGhvdyBidWZmZXIgd2lsbCBiZSBmbHVzaGVkIG91dC4gIFRoaXMgaXMgZG9uZSBiZWZvcmUKKwkgKiB0aGUgY2FsbCB0byB4ZnNfaWZsdXNoX2ludCBiZWNhdXNlIHRoaXMgZmllbGQgaXMgemVyb2VkIGJ5IGl0LgorCSAqLworCWlmIChpaXAgIT0gTlVMTCAmJiBpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAhPSAwKSB7CisJCS8qCisJCSAqIEZsdXNoIG91dCB0aGUgaW5vZGUgYnVmZmVyIGFjY29yZGluZyB0byB0aGUgZGlyZWN0aW9ucworCQkgKiBvZiB0aGUgY2FsbGVyLiAgSW4gdGhlIGNhc2VzIHdoZXJlIHRoZSBjYWxsZXIgaGFzIGdpdmVuCisJCSAqIHVzIGEgY2hvaWNlIGNob29zZSB0aGUgbm9uLWRlbHdyaSBjYXNlLiAgVGhpcyBpcyBiZWNhdXNlCisJCSAqIHRoZSBpbm9kZSBpcyBpbiB0aGUgQUlMIGFuZCB3ZSBuZWVkIHRvIGdldCBpdCBvdXQgc29vbi4KKwkJICovCisJCXN3aXRjaCAoZmxhZ3MpIHsKKwkJY2FzZSBYRlNfSUZMVVNIX1NZTkM6CisJCWNhc2UgWEZTX0lGTFVTSF9ERUxXUklfRUxTRV9TWU5DOgorCQkJZmxhZ3MgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgWEZTX0lGTFVTSF9BU1lOQzoKKwkJY2FzZSBYRlNfSUZMVVNIX0RFTFdSSV9FTFNFX0FTWU5DOgorCQkJZmxhZ3MgPSBJTlRfQVNZTkM7CisJCQlicmVhazsKKwkJY2FzZSBYRlNfSUZMVVNIX0RFTFdSSToKKwkJCWZsYWdzID0gSU5UX0RFTFdSSTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKDApOworCQkJZmxhZ3MgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlzd2l0Y2ggKGZsYWdzKSB7CisJCWNhc2UgWEZTX0lGTFVTSF9ERUxXUklfRUxTRV9TWU5DOgorCQljYXNlIFhGU19JRkxVU0hfREVMV1JJX0VMU0VfQVNZTkM6CisJCWNhc2UgWEZTX0lGTFVTSF9ERUxXUkk6CisJCQlmbGFncyA9IElOVF9ERUxXUkk7CisJCQlicmVhazsKKwkJY2FzZSBYRlNfSUZMVVNIX0FTWU5DOgorCQkJZmxhZ3MgPSBJTlRfQVNZTkM7CisJCQlicmVhazsKKwkJY2FzZSBYRlNfSUZMVVNIX1NZTkM6CisJCQlmbGFncyA9IDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFTU0VSVCgwKTsKKwkJCWZsYWdzID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyoKKwkgKiBGaXJzdCBmbHVzaCBvdXQgdGhlIGlub2RlIHRoYXQgeGZzX2lmbHVzaCB3YXMgY2FsbGVkIHdpdGguCisJICovCisJZXJyb3IgPSB4ZnNfaWZsdXNoX2ludChpcCwgYnApOworCWlmIChlcnJvcikgeworCQlnb3RvIGNvcnJ1cHRfb3V0OworCX0KKworCS8qCisJICogaW5vZGUgY2x1c3RlcmluZzoKKwkgKiBzZWUgaWYgb3RoZXIgaW5vZGVzIGNhbiBiZSBnYXRoZXJlZCBpbnRvIHRoaXMgd3JpdGUKKwkgKi8KKworCWlwLT5pX2NoYXNoLT5jaGxfYnVmID0gYnA7CisKKwljaCA9IFhGU19DSEFTSChtcCwgaXAtPmlfYmxrbm8pOworCXMgPSBtdXRleF9zcGlubG9jaygmY2gtPmNoX2xvY2spOworCisJY2xjb3VudCA9IDA7CisJZm9yIChpcSA9IGlwLT5pX2NuZXh0OyBpcSAhPSBpcDsgaXEgPSBpcS0+aV9jbmV4dCkgeworCQkvKgorCQkgKiBEbyBhbiB1bi1wcm90ZWN0ZWQgY2hlY2sgdG8gc2VlIGlmIHRoZSBpbm9kZSBpcyBkaXJ0eSBhbmQKKwkJICogaXMgYSBjYW5kaWRhdGUgZm9yIGZsdXNoaW5nLiAgVGhlc2UgY2hlY2tzIHdpbGwgYmUgcmVwZWF0ZWQKKwkJICogbGF0ZXIgYWZ0ZXIgdGhlIGFwcHJvcHJpYXRlIGxvY2tzIGFyZSBhY3F1aXJlZC4KKwkJICovCisJCWlpcCA9IGlxLT5pX2l0ZW1wOworCQlpZiAoKGlxLT5pX3VwZGF0ZV9jb3JlID09IDApICYmCisJCSAgICAoKGlpcCA9PSBOVUxMKSB8fAorCQkgICAgICEoaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJiBYRlNfSUxPR19BTEwpKSAmJgorCQkgICAgICB4ZnNfaXBpbmNvdW50KGlxKSA9PSAwKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIFRyeSB0byBnZXQgbG9ja3MuICBJZiBhbnkgYXJlIHVuYXZhaWxhYmxlLAorCQkgKiB0aGVuIHRoaXMgaW5vZGUgY2Fubm90IGJlIGZsdXNoZWQgYW5kIGlzIHNraXBwZWQuCisJCSAqLworCisJCS8qIGdldCBpbm9kZSBsb2NrcyAoanVzdCBpX2xvY2spICovCisJCWlmICh4ZnNfaWxvY2tfbm93YWl0KGlxLCBYRlNfSUxPQ0tfU0hBUkVEKSkgeworCQkJLyogZ2V0IGlub2RlIGZsdXNoIGxvY2sgKi8KKwkJCWlmICh4ZnNfaWZsb2NrX25vd2FpdChpcSkpIHsKKwkJCQkvKiBjaGVjayBpZiBwaW5uZWQgKi8KKwkJCQlpZiAoeGZzX2lwaW5jb3VudChpcSkgPT0gMCkgeworCQkJCQkvKiBhcnJpdmluZyBoZXJlIG1lYW5zIHRoYXQKKwkJCQkJICogdGhpcyBpbm9kZSBjYW4gYmUgZmx1c2hlZC4KKwkJCQkJICogZmlyc3QgcmUtY2hlY2sgdGhhdCBpdCdzCisJCQkJCSAqIGRpcnR5CisJCQkJCSAqLworCQkJCQlpaXAgPSBpcS0+aV9pdGVtcDsKKwkJCQkJaWYgKChpcS0+aV91cGRhdGVfY29yZSAhPSAwKXx8CisJCQkJCSAgICAoKGlpcCAhPSBOVUxMKSAmJgorCQkJCQkgICAgIChpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmIFhGU19JTE9HX0FMTCkpKSB7CisJCQkJCQljbGNvdW50Kys7CisJCQkJCQllcnJvciA9IHhmc19pZmx1c2hfaW50KGlxLCBicCk7CisJCQkJCQlpZiAoZXJyb3IpIHsKKwkJCQkJCQl4ZnNfaXVubG9jayhpcSwKKwkJCQkJCQkJICAgIFhGU19JTE9DS19TSEFSRUQpOworCQkJCQkJCWdvdG8gY2x1c3Rlcl9jb3JydXB0X291dDsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXhmc19pZnVubG9jayhpcSk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQl4ZnNfaWZ1bmxvY2soaXEpOworCQkJCX0KKwkJCX0KKwkJCXhmc19pdW5sb2NrKGlxLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKwkJfQorCX0KKwltdXRleF9zcGludW5sb2NrKCZjaC0+Y2hfbG9jaywgcyk7CisKKwlpZiAoY2xjb3VudCkgeworCQlYRlNfU1RBVFNfSU5DKHhzX2ljbHVzdGVyX2ZsdXNoY250KTsKKwkJWEZTX1NUQVRTX0FERCh4c19pY2x1c3Rlcl9mbHVzaGlub2RlLCBjbGNvdW50KTsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBidWZmZXIgaXMgcGlubmVkIHRoZW4gcHVzaCBvbiB0aGUgbG9nIHNvIHdlIHdvbid0CisJICogZ2V0IHN0dWNrIHdhaXRpbmcgaW4gdGhlIHdyaXRlIGZvciB0b28gbG9uZy4KKwkgKi8KKwlpZiAoWEZTX0JVRl9JU1BJTk5FRChicCkpeworCQl4ZnNfbG9nX2ZvcmNlKG1wLCAoeGZzX2xzbl90KTAsIFhGU19MT0dfRk9SQ0UpOworCX0KKworCWlmIChmbGFncyAmIElOVF9ERUxXUkkpIHsKKwkJeGZzX2Jkd3JpdGUobXAsIGJwKTsKKwl9IGVsc2UgaWYgKGZsYWdzICYgSU5UX0FTWU5DKSB7CisJCXhmc19iYXdyaXRlKG1wLCBicCk7CisJfSBlbHNlIHsKKwkJZXJyb3IgPSB4ZnNfYndyaXRlKG1wLCBicCk7CisJfQorCXJldHVybiBlcnJvcjsKKworY29ycnVwdF9vdXQ6CisJeGZzX2J1Zl9yZWxzZShicCk7CisJeGZzX2ZvcmNlX3NodXRkb3duKG1wLCBYRlNfQ09SUlVQVF9JTkNPUkUpOworCXhmc19pZmx1c2hfYWJvcnQoaXApOworCS8qCisJICogVW5sb2NrcyB0aGUgZmx1c2ggbG9jaworCSAqLworCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKworY2x1c3Rlcl9jb3JydXB0X291dDoKKwkvKiBDb3JydXB0aW9uIGRldGVjdGVkIGluIHRoZSBjbHVzdGVyaW5nIGxvb3AuICBJbnZhbGlkYXRlIHRoZQorCSAqIGlub2RlIGJ1ZmZlciBhbmQgc2h1dCBkb3duIHRoZSBmaWxlc3lzdGVtLgorCSAqLworCW11dGV4X3NwaW51bmxvY2soJmNoLT5jaF9sb2NrLCBzKTsKKworCS8qCisJICogQ2xlYW4gdXAgdGhlIGJ1ZmZlci4gIElmIGl0IHdhcyBCX0RFTFdSSSwganVzdCByZWxlYXNlIGl0IC0tCisJICogYnJlbHNlIGNhbiBoYW5kbGUgaXQgd2l0aCBubyBwcm9ibGVtcy4gIElmIG5vdCwgc2h1dCBkb3duIHRoZQorCSAqIGZpbGVzeXN0ZW0gYmVmb3JlIHJlbGVhc2luZyB0aGUgYnVmZmVyLgorCSAqLworCWlmICgoYnVmd2FzZGVsd3JpPSBYRlNfQlVGX0lTREVMQVlXUklURShicCkpKSB7CisJCXhmc19idWZfcmVsc2UoYnApOworCX0KKworCXhmc19mb3JjZV9zaHV0ZG93bihtcCwgWEZTX0NPUlJVUFRfSU5DT1JFKTsKKworCWlmKCFidWZ3YXNkZWx3cmkpICB7CisJCS8qCisJCSAqIEp1c3QgbGlrZSBpbmNvcmVfcmVsc2U6IGlmIHdlIGhhdmUgYl9pb2RvbmUgZnVuY3Rpb25zLAorCQkgKiBtYXJrIHRoZSBidWZmZXIgYXMgYW4gZXJyb3IgYW5kIGNhbGwgdGhlbS4gIE90aGVyd2lzZQorCQkgKiBtYXJrIGl0IGFzIHN0YWxlIGFuZCBicmVsc2UuCisJCSAqLworCQlpZiAoWEZTX0JVRl9JT0RPTkVfRlVOQyhicCkpIHsKKwkJCVhGU19CVUZfQ0xSX0JEU1RSQVRfRlVOQyhicCk7CisJCQlYRlNfQlVGX1VORE9ORShicCk7CisJCQlYRlNfQlVGX1NUQUxFKGJwKTsKKwkJCVhGU19CVUZfU0hVVChicCk7CisJCQlYRlNfQlVGX0VSUk9SKGJwLEVJTyk7CisJCQl4ZnNfYmlvZG9uZShicCk7CisJCX0gZWxzZSB7CisJCQlYRlNfQlVGX1NUQUxFKGJwKTsKKwkJCXhmc19idWZfcmVsc2UoYnApOworCQl9CisJfQorCisJeGZzX2lmbHVzaF9hYm9ydChpcSk7CisJLyoKKwkgKiBVbmxvY2tzIHRoZSBmbHVzaCBsb2NrCisJICovCisJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworfQorCisKK1NUQVRJQyBpbnQKK3hmc19pZmx1c2hfaW50KAorCXhmc19pbm9kZV90CQkqaXAsCisJeGZzX2J1Zl90CQkqYnApCit7CisJeGZzX2lub2RlX2xvZ19pdGVtX3QJKmlpcDsKKwl4ZnNfZGlub2RlX3QJCSpkaXA7CisJeGZzX21vdW50X3QJCSptcDsKKyNpZmRlZiBYRlNfVFJBTlNfREVCVUcKKwlpbnQJCQlmaXJzdDsKKyNlbmRpZgorCVNQTERFQ0wocyk7CisKKwlBU1NFUlQoaXNtcmxvY2tlZCgmaXAtPmlfbG9jaywgTVJfVVBEQVRFfE1SX0FDQ0VTUykpOworCUFTU0VSVCh2YWx1c2VtYSgmaXAtPmlfZmxvY2spIDw9IDApOworCUFTU0VSVChpcC0+aV9kLmRpX2Zvcm1hdCAhPSBYRlNfRElOT0RFX0ZNVF9CVFJFRSB8fAorCSAgICAgICBpcC0+aV9kLmRpX25leHRlbnRzID4gaXAtPmlfZGYuaWZfZXh0X21heCk7CisKKwlpaXAgPSBpcC0+aV9pdGVtcDsKKwltcCA9IGlwLT5pX21vdW50OworCisKKwkvKgorCSAqIElmIHRoZSBpbm9kZSBpc24ndCBkaXJ0eSwgdGhlbiBqdXN0IHJlbGVhc2UgdGhlIGlub2RlCisJICogZmx1c2ggbG9jayBhbmQgZG8gbm90aGluZy4KKwkgKi8KKwlpZiAoKGlwLT5pX3VwZGF0ZV9jb3JlID09IDApICYmCisJICAgICgoaWlwID09IE5VTEwpIHx8ICEoaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJiBYRlNfSUxPR19BTEwpKSkgeworCQl4ZnNfaWZ1bmxvY2soaXApOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBzZXQgKmRpcCA9IGlub2RlJ3MgcGxhY2UgaW4gdGhlIGJ1ZmZlciAqLworCWRpcCA9ICh4ZnNfZGlub2RlX3QgKil4ZnNfYnVmX29mZnNldChicCwgaXAtPmlfYm9mZnNldCk7CisKKwkvKgorCSAqIENsZWFyIGlfdXBkYXRlX2NvcmUgYmVmb3JlIGNvcHlpbmcgb3V0IHRoZSBkYXRhLgorCSAqIFRoaXMgaXMgZm9yIGNvb3JkaW5hdGlvbiB3aXRoIG91ciB0aW1lc3RhbXAgdXBkYXRlcworCSAqIHRoYXQgZG9uJ3QgaG9sZCB0aGUgaW5vZGUgbG9jay4gVGhleSB3aWxsIGFsd2F5cworCSAqIHVwZGF0ZSB0aGUgdGltZXN0YW1wcyBCRUZPUkUgc2V0dGluZyBpX3VwZGF0ZV9jb3JlLAorCSAqIHNvIGlmIHdlIGNsZWFyIGlfdXBkYXRlX2NvcmUgYWZ0ZXIgdGhleSBzZXQgaXQgd2UKKwkgKiBhcmUgZ3VhcmFudGVlZCB0byBzZWUgdGhlaXIgdXBkYXRlcyB0byB0aGUgdGltZXN0YW1wcy4KKwkgKiBJIGJlbGlldmUgdGhhdCB0aGlzIGRlcGVuZHMgb24gc3Ryb25nbHkgb3JkZXJlZCBtZW1vcnkKKwkgKiBzZW1hbnRpY3MsIGJ1dCB3ZSBoYXZlIHRoYXQuICBXZSB1c2UgdGhlIFNZTkNIUk9OSVpFCisJICogbWFjcm8gdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNvbXBpbGVyIGRvZXMgbm90IHJlb3JkZXIKKwkgKiB0aGUgaV91cGRhdGVfY29yZSBhY2Nlc3MgYmVsb3cgdGhlIGRhdGEgY29weSBiZWxvdy4KKwkgKi8KKwlpcC0+aV91cGRhdGVfY29yZSA9IDA7CisJU1lOQ0hST05JWkUoKTsKKworCWlmIChYRlNfVEVTVF9FUlJPUihJTlRfR0VUKGRpcC0+ZGlfY29yZS5kaV9tYWdpYyxBUkNIX0NPTlZFUlQpICE9IFhGU19ESU5PREVfTUFHSUMsCisJCQkgICAgICAgbXAsIFhGU19FUlJUQUdfSUZMVVNIXzEsIFhGU19SQU5ET01fSUZMVVNIXzEpKSB7CisJCXhmc19jbW5fZXJyKFhGU19QVEFHX0lGTFVTSCwgQ0VfQUxFUlQsIG1wLAorCQkgICAgInhmc19pZmx1c2g6IEJhZCBpbm9kZSAlTHUgbWFnaWMgbnVtYmVyIDB4JXgsIHB0ciAweCVwIiwKKwkJCWlwLT5pX2lubywgKGludCkgSU5UX0dFVChkaXAtPmRpX2NvcmUuZGlfbWFnaWMsIEFSQ0hfQ09OVkVSVCksIGRpcCk7CisJCWdvdG8gY29ycnVwdF9vdXQ7CisJfQorCWlmIChYRlNfVEVTVF9FUlJPUihpcC0+aV9kLmRpX21hZ2ljICE9IFhGU19ESU5PREVfTUFHSUMsCisJCQkJbXAsIFhGU19FUlJUQUdfSUZMVVNIXzIsIFhGU19SQU5ET01fSUZMVVNIXzIpKSB7CisJCXhmc19jbW5fZXJyKFhGU19QVEFHX0lGTFVTSCwgQ0VfQUxFUlQsIG1wLAorCQkJInhmc19pZmx1c2g6IEJhZCBpbm9kZSAlTHUsIHB0ciAweCVwLCBtYWdpYyBudW1iZXIgMHgleCIsCisJCQlpcC0+aV9pbm8sIGlwLCBpcC0+aV9kLmRpX21hZ2ljKTsKKwkJZ290byBjb3JydXB0X291dDsKKwl9CisJaWYgKChpcC0+aV9kLmRpX21vZGUgJiBTX0lGTVQpID09IFNfSUZSRUcpIHsKKwkJaWYgKFhGU19URVNUX0VSUk9SKAorCQkgICAgKGlwLT5pX2QuZGlfZm9ybWF0ICE9IFhGU19ESU5PREVfRk1UX0VYVEVOVFMpICYmCisJCSAgICAoaXAtPmlfZC5kaV9mb3JtYXQgIT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUpLAorCQkgICAgbXAsIFhGU19FUlJUQUdfSUZMVVNIXzMsIFhGU19SQU5ET01fSUZMVVNIXzMpKSB7CisJCQl4ZnNfY21uX2VycihYRlNfUFRBR19JRkxVU0gsIENFX0FMRVJULCBtcCwKKwkJCQkieGZzX2lmbHVzaDogQmFkIHJlZ3VsYXIgaW5vZGUgJUx1LCBwdHIgMHglcCIsCisJCQkJaXAtPmlfaW5vLCBpcCk7CisJCQlnb3RvIGNvcnJ1cHRfb3V0OworCQl9CisJfSBlbHNlIGlmICgoaXAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSA9PSBTX0lGRElSKSB7CisJCWlmIChYRlNfVEVTVF9FUlJPUigKKwkJICAgIChpcC0+aV9kLmRpX2Zvcm1hdCAhPSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTKSAmJgorCQkgICAgKGlwLT5pX2QuZGlfZm9ybWF0ICE9IFhGU19ESU5PREVfRk1UX0JUUkVFKSAmJgorCQkgICAgKGlwLT5pX2QuZGlfZm9ybWF0ICE9IFhGU19ESU5PREVfRk1UX0xPQ0FMKSwKKwkJICAgIG1wLCBYRlNfRVJSVEFHX0lGTFVTSF80LCBYRlNfUkFORE9NX0lGTFVTSF80KSkgeworCQkJeGZzX2Ntbl9lcnIoWEZTX1BUQUdfSUZMVVNILCBDRV9BTEVSVCwgbXAsCisJCQkJInhmc19pZmx1c2g6IEJhZCBkaXJlY3RvcnkgaW5vZGUgJUx1LCBwdHIgMHglcCIsCisJCQkJaXAtPmlfaW5vLCBpcCk7CisJCQlnb3RvIGNvcnJ1cHRfb3V0OworCQl9CisJfQorCWlmIChYRlNfVEVTVF9FUlJPUihpcC0+aV9kLmRpX25leHRlbnRzICsgaXAtPmlfZC5kaV9hbmV4dGVudHMgPgorCQkJCWlwLT5pX2QuZGlfbmJsb2NrcywgbXAsIFhGU19FUlJUQUdfSUZMVVNIXzUsCisJCQkJWEZTX1JBTkRPTV9JRkxVU0hfNSkpIHsKKwkJeGZzX2Ntbl9lcnIoWEZTX1BUQUdfSUZMVVNILCBDRV9BTEVSVCwgbXAsCisJCQkieGZzX2lmbHVzaDogZGV0ZWN0ZWQgY29ycnVwdCBpbmNvcmUgaW5vZGUgJUx1LCB0b3RhbCBleHRlbnRzID0gJWQsIG5ibG9ja3MgPSAlTGQsIHB0ciAweCVwIiwKKwkJCWlwLT5pX2lubywKKwkJCWlwLT5pX2QuZGlfbmV4dGVudHMgKyBpcC0+aV9kLmRpX2FuZXh0ZW50cywKKwkJCWlwLT5pX2QuZGlfbmJsb2NrcywKKwkJCWlwKTsKKwkJZ290byBjb3JydXB0X291dDsKKwl9CisJaWYgKFhGU19URVNUX0VSUk9SKGlwLT5pX2QuZGlfZm9ya29mZiA+IG1wLT5tX3NiLnNiX2lub2Rlc2l6ZSwKKwkJCQltcCwgWEZTX0VSUlRBR19JRkxVU0hfNiwgWEZTX1JBTkRPTV9JRkxVU0hfNikpIHsKKwkJeGZzX2Ntbl9lcnIoWEZTX1BUQUdfSUZMVVNILCBDRV9BTEVSVCwgbXAsCisJCQkieGZzX2lmbHVzaDogYmFkIGlub2RlICVMdSwgZm9ya29mZiAweCV4LCBwdHIgMHglcCIsCisJCQlpcC0+aV9pbm8sIGlwLT5pX2QuZGlfZm9ya29mZiwgaXApOworCQlnb3RvIGNvcnJ1cHRfb3V0OworCX0KKwkvKgorCSAqIGJ1bXAgdGhlIGZsdXNoIGl0ZXJhdGlvbiBjb3VudCwgdXNlZCB0byBkZXRlY3QgZmx1c2hlcyB3aGljaAorCSAqIHBvc3RkYXRlIGEgbG9nIHJlY29yZCBkdXJpbmcgcmVjb3ZlcnkuCisJICovCisKKwlpcC0+aV9kLmRpX2ZsdXNoaXRlcisrOworCisJLyoKKwkgKiBDb3B5IHRoZSBkaXJ0eSBwYXJ0cyBvZiB0aGUgaW5vZGUgaW50byB0aGUgb24tZGlzaworCSAqIGlub2RlLiAgV2UgYWx3YXlzIGNvcHkgb3V0IHRoZSBjb3JlIG9mIHRoZSBpbm9kZSwKKwkgKiBiZWNhdXNlIGlmIHRoZSBpbm9kZSBpcyBkaXJ0eSBhdCBhbGwgdGhlIGNvcmUgbXVzdAorCSAqIGJlLgorCSAqLworCXhmc194bGF0ZV9kaW5vZGVfY29yZSgoeGZzX2NhZGRyX3QpJihkaXAtPmRpX2NvcmUpLCAmKGlwLT5pX2QpLCAtMSk7CisKKwkvKiBXcmFwLCB3ZSBuZXZlciBsZXQgdGhlIGxvZyBwdXQgb3V0IERJX01BWF9GTFVTSCAqLworCWlmIChpcC0+aV9kLmRpX2ZsdXNoaXRlciA9PSBESV9NQVhfRkxVU0gpCisJCWlwLT5pX2QuZGlfZmx1c2hpdGVyID0gMDsKKworCS8qCisJICogSWYgdGhpcyBpcyByZWFsbHkgYW4gb2xkIGZvcm1hdCBpbm9kZSBhbmQgdGhlIHN1cGVyYmxvY2sgdmVyc2lvbgorCSAqIGhhcyBub3QgYmVlbiB1cGRhdGVkIHRvIHN1cHBvcnQgb25seSBuZXcgZm9ybWF0IGlub2RlcywgdGhlbgorCSAqIGNvbnZlcnQgYmFjayB0byB0aGUgb2xkIGlub2RlIGZvcm1hdC4gIElmIHRoZSBzdXBlcmJsb2NrIHZlcnNpb24KKwkgKiBoYXMgYmVlbiB1cGRhdGVkLCB0aGVuIG1ha2UgdGhlIGNvbnZlcnNpb24gcGVybWFuZW50LgorCSAqLworCUFTU0VSVChpcC0+aV9kLmRpX3ZlcnNpb24gPT0gWEZTX0RJTk9ERV9WRVJTSU9OXzEgfHwKKwkgICAgICAgWEZTX1NCX1ZFUlNJT05fSEFTTkxJTksoJm1wLT5tX3NiKSk7CisJaWYgKGlwLT5pX2QuZGlfdmVyc2lvbiA9PSBYRlNfRElOT0RFX1ZFUlNJT05fMSkgeworCQlpZiAoIVhGU19TQl9WRVJTSU9OX0hBU05MSU5LKCZtcC0+bV9zYikpIHsKKwkJCS8qCisJCQkgKiBDb252ZXJ0IGl0IGJhY2suCisJCQkgKi8KKwkJCUFTU0VSVChpcC0+aV9kLmRpX25saW5rIDw9IFhGU19NQVhMSU5LXzEpOworCQkJSU5UX1NFVChkaXAtPmRpX2NvcmUuZGlfb25saW5rLCBBUkNIX0NPTlZFUlQsIGlwLT5pX2QuZGlfbmxpbmspOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFRoZSBzdXBlcmJsb2NrIHZlcnNpb24gaGFzIGFscmVhZHkgYmVlbiBidW1wZWQsCisJCQkgKiBzbyBqdXN0IG1ha2UgdGhlIGNvbnZlcnNpb24gdG8gdGhlIG5ldyBpbm9kZQorCQkJICogZm9ybWF0IHBlcm1hbmVudC4KKwkJCSAqLworCQkJaXAtPmlfZC5kaV92ZXJzaW9uID0gWEZTX0RJTk9ERV9WRVJTSU9OXzI7CisJCQlJTlRfU0VUKGRpcC0+ZGlfY29yZS5kaV92ZXJzaW9uLCBBUkNIX0NPTlZFUlQsIFhGU19ESU5PREVfVkVSU0lPTl8yKTsKKwkJCWlwLT5pX2QuZGlfb25saW5rID0gMDsKKwkJCWRpcC0+ZGlfY29yZS5kaV9vbmxpbmsgPSAwOworCQkJbWVtc2V0KCYoaXAtPmlfZC5kaV9wYWRbMF0pLCAwLCBzaXplb2YoaXAtPmlfZC5kaV9wYWQpKTsKKwkJCW1lbXNldCgmKGRpcC0+ZGlfY29yZS5kaV9wYWRbMF0pLCAwLAorCQkJICAgICAgc2l6ZW9mKGRpcC0+ZGlfY29yZS5kaV9wYWQpKTsKKwkJCUFTU0VSVChpcC0+aV9kLmRpX3Byb2ppZCA9PSAwKTsKKwkJfQorCX0KKworCWlmICh4ZnNfaWZsdXNoX2ZvcmsoaXAsIGRpcCwgaWlwLCBYRlNfREFUQV9GT1JLLCBicCkgPT0gRUZTQ09SUlVQVEVEKSB7CisJCWdvdG8gY29ycnVwdF9vdXQ7CisJfQorCisJaWYgKFhGU19JRk9SS19RKGlwKSkgeworCQkvKgorCQkgKiBUaGUgb25seSBlcnJvciBmcm9tIHhmc19pZmx1c2hfZm9yayBpcyBvbiB0aGUgZGF0YSBmb3JrLgorCQkgKi8KKwkJKHZvaWQpIHhmc19pZmx1c2hfZm9yayhpcCwgZGlwLCBpaXAsIFhGU19BVFRSX0ZPUkssIGJwKTsKKwl9CisJeGZzX2lub2JwX2NoZWNrKG1wLCBicCk7CisKKwkvKgorCSAqIFdlJ3ZlIHJlY29yZGVkIGV2ZXJ5dGhpbmcgbG9nZ2VkIGluIHRoZSBpbm9kZSwgc28gd2UnZAorCSAqIGxpa2UgdG8gY2xlYXIgdGhlIGlsZl9maWVsZHMgYml0cyBzbyB3ZSBkb24ndCBsb2cgYW5kCisJICogZmx1c2ggdGhpbmdzIHVubmVjZXNzYXJpbHkuICBIb3dldmVyLCB3ZSBjYW4ndCBzdG9wCisJICogbG9nZ2luZyBhbGwgdGhpcyBpbmZvcm1hdGlvbiB1bnRpbCB0aGUgZGF0YSB3ZSd2ZSBjb3BpZWQKKwkgKiBpbnRvIHRoZSBkaXNrIGJ1ZmZlciBpcyB3cml0dGVuIHRvIGRpc2suICBJZiB3ZSBkaWQgd2UgbWlnaHQKKwkgKiBvdmVyd3JpdGUgdGhlIGNvcHkgb2YgdGhlIGlub2RlIGluIHRoZSBsb2cgd2l0aCBhbGwgdGhlCisJICogZGF0YSBhZnRlciByZS1sb2dnaW5nIG9ubHkgcGFydCBvZiBpdCwgYW5kIGluIHRoZSBmYWNlIG9mCisJICogYSBjcmFzaCB3ZSB3b3VsZG4ndCBoYXZlIGFsbCB0aGUgZGF0YSB3ZSBuZWVkIHRvIHJlY292ZXIuCisJICoKKwkgKiBXaGF0IHdlIGRvIGlzIG1vdmUgdGhlIGJpdHMgdG8gdGhlIGlsaV9sYXN0X2ZpZWxkcyBmaWVsZC4KKwkgKiBXaGVuIGxvZ2dpbmcgdGhlIGlub2RlLCB0aGVzZSBiaXRzIGFyZSBtb3ZlZCBiYWNrIHRvIHRoZQorCSAqIGlsZl9maWVsZHMgZmllbGQuICBJbiB0aGUgeGZzX2lmbHVzaF9kb25lKCkgcm91dGluZSB3ZQorCSAqIGNsZWFyIGlsaV9sYXN0X2ZpZWxkcywgc2luY2Ugd2Uga25vdyB0aGF0IHRoZSBpbmZvcm1hdGlvbgorCSAqIHRob3NlIGJpdHMgcmVwcmVzZW50IGlzIHBlcm1hbmVudGx5IG9uIGRpc2suICBBcyBsb25nIGFzCisJICogdGhlIGZsdXNoIGNvbXBsZXRlcyBiZWZvcmUgdGhlIGlub2RlIGlzIGxvZ2dlZCBhZ2FpbiwgdGhlbgorCSAqIGJvdGggaWxmX2ZpZWxkcyBhbmQgaWxpX2xhc3RfZmllbGRzIHdpbGwgYmUgY2xlYXJlZC4KKwkgKgorCSAqIFdlIGNhbiBwbGF5IHdpdGggdGhlIGlsZl9maWVsZHMgYml0cyBoZXJlLCBiZWNhdXNlIHRoZSBpbm9kZQorCSAqIGxvY2sgbXVzdCBiZSBoZWxkIGV4Y2x1c2l2ZWx5IGluIG9yZGVyIHRvIHNldCBiaXRzIHRoZXJlCisJICogYW5kIHRoZSBmbHVzaCBsb2NrIHByb3RlY3RzIHRoZSBpbGlfbGFzdF9maWVsZHMgYml0cy4KKwkgKiBTZXQgaWxpX2xvZ2dlZCBzbyB0aGUgZmx1c2ggZG9uZQorCSAqIHJvdXRpbmUgY2FuIHRlbGwgd2hldGhlciBvciBub3QgdG8gbG9vayBpbiB0aGUgQUlMLgorCSAqIEFsc28sIHN0b3JlIHRoZSBjdXJyZW50IExTTiBvZiB0aGUgaW5vZGUgc28gdGhhdCB3ZSBjYW4gdGVsbAorCSAqIHdoZXRoZXIgdGhlIGl0ZW0gaGFzIG1vdmVkIGluIHRoZSBBSUwgZnJvbSB4ZnNfaWZsdXNoX2RvbmUoKS4KKwkgKiBJbiBvcmRlciB0byByZWFkIHRoZSBsc24gd2UgbmVlZCB0aGUgQUlMIGxvY2ssIGJlY2F1c2UKKwkgKiBpdCBpcyBhIDY0IGJpdCB2YWx1ZSB0aGF0IGNhbm5vdCBiZSByZWFkIGF0b21pY2FsbHkuCisJICovCisJaWYgKGlpcCAhPSBOVUxMICYmIGlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICE9IDApIHsKKwkJaWlwLT5pbGlfbGFzdF9maWVsZHMgPSBpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkczsKKwkJaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgPSAwOworCQlpaXAtPmlsaV9sb2dnZWQgPSAxOworCisJCUFTU0VSVChzaXplb2YoeGZzX2xzbl90KSA9PSA4KTsJLyogZG9uJ3QgbG9jayBpZiBpdCBzaHJpbmtzICovCisJCUFJTF9MT0NLKG1wLHMpOworCQlpaXAtPmlsaV9mbHVzaF9sc24gPSBpaXAtPmlsaV9pdGVtLmxpX2xzbjsKKwkJQUlMX1VOTE9DSyhtcCwgcyk7CisKKwkJLyoKKwkJICogQXR0YWNoIHRoZSBmdW5jdGlvbiB4ZnNfaWZsdXNoX2RvbmUgdG8gdGhlIGlub2RlJ3MKKwkJICogYnVmZmVyLiAgVGhpcyB3aWxsIHJlbW92ZSB0aGUgaW5vZGUgZnJvbSB0aGUgQUlMCisJCSAqIGFuZCB1bmxvY2sgdGhlIGlub2RlJ3MgZmx1c2ggbG9jayB3aGVuIHRoZSBpbm9kZSBpcworCQkgKiBjb21wbGV0ZWx5IHdyaXR0ZW4gdG8gZGlzay4KKwkJICovCisJCXhmc19idWZfYXR0YWNoX2lvZG9uZShicCwgKHZvaWQoKikoeGZzX2J1Zl90Kix4ZnNfbG9nX2l0ZW1fdCopKQorCQkJCSAgICAgIHhmc19pZmx1c2hfZG9uZSwgKHhmc19sb2dfaXRlbV90ICopaWlwKTsKKworCQlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHZvaWQgKikgIT0gTlVMTCk7CisJCUFTU0VSVChYRlNfQlVGX0lPRE9ORV9GVU5DKGJwKSAhPSBOVUxMKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBXZSdyZSBmbHVzaGluZyBhbiBpbm9kZSB3aGljaCBpcyBub3QgaW4gdGhlIEFJTCBhbmQgaGFzCisJCSAqIG5vdCBiZWVuIGxvZ2dlZCBidXQgaGFzIGlfdXBkYXRlX2NvcmUgc2V0LiAgRm9yIHRoaXMKKwkJICogY2FzZSB3ZSBjYW4gdXNlIGEgQl9ERUxXUkkgZmx1c2ggYW5kIGltbWVkaWF0ZWx5IGRyb3AKKwkJICogdGhlIGlub2RlIGZsdXNoIGxvY2sgYmVjYXVzZSB3ZSBjYW4gYXZvaWQgdGhlIHdob2xlCisJCSAqIEFJTCBzdGF0ZSB0aGluZy4gIEl0J3MgT0sgdG8gZHJvcCB0aGUgZmx1c2ggbG9jayBub3csCisJCSAqIGJlY2F1c2Ugd2UndmUgYWxyZWFkeSBsb2NrZWQgdGhlIGJ1ZmZlciBhbmQgdG8gZG8gYW55dGhpbmcKKwkJICogeW91IHJlYWxseSBuZWVkIGJvdGguCisJCSAqLworCQlpZiAoaWlwICE9IE5VTEwpIHsKKwkJCUFTU0VSVChpaXAtPmlsaV9sb2dnZWQgPT0gMCk7CisJCQlBU1NFUlQoaWlwLT5pbGlfbGFzdF9maWVsZHMgPT0gMCk7CisJCQlBU1NFUlQoKGlpcC0+aWxpX2l0ZW0ubGlfZmxhZ3MgJiBYRlNfTElfSU5fQUlMKSA9PSAwKTsKKwkJfQorCQl4ZnNfaWZ1bmxvY2soaXApOworCX0KKworCXJldHVybiAwOworCitjb3JydXB0X291dDoKKwlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7Cit9CisKKworLyoKKyAqIEZsdXNoIGFsbCBpbmFjdGl2ZSBpbm9kZXMgaW4gbXAuICBSZXR1cm4gdHJ1ZSBpZiBubyB1c2VyIHJlZmVyZW5jZXMKKyAqIHdlcmUgZm91bmQsIGZhbHNlIG90aGVyd2lzZS4KKyAqLworaW50Cit4ZnNfaWZsdXNoX2FsbCgKKwl4ZnNfbW91bnRfdAkqbXAsCisJaW50CQlmbGFnKQoreworCWludAkJYnVzeTsKKwlpbnQJCWRvbmU7CisJaW50CQlwdXJnZWQ7CisJeGZzX2lub2RlX3QJKmlwOworCXZtYXBfdAkJdm1hcDsKKwl2bm9kZV90CQkqdnA7CisKKwlidXN5ID0gZG9uZSA9IDA7CisJd2hpbGUgKCFkb25lKSB7CisJCXB1cmdlZCA9IDA7CisJCVhGU19NT1VOVF9JTE9DSyhtcCk7CisJCWlwID0gbXAtPm1faW5vZGVzOworCQlpZiAoaXAgPT0gTlVMTCkgeworCQkJYnJlYWs7CisJCX0KKwkJZG8geworCQkJLyogTWFrZSBzdXJlIHdlIHNraXAgbWFya2VycyBpbnNlcnRlZCBieSBzeW5jICovCisJCQlpZiAoaXAtPmlfbW91bnQgPT0gTlVMTCkgeworCQkJCWlwID0gaXAtPmlfbW5leHQ7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qCisJCQkgKiBJdCdzIHVwIHRvIG91ciBjYWxsZXIgdG8gcHVyZ2UgdGhlIHJvb3QKKwkJCSAqIGFuZCBxdW90YSB2bm9kZXMgbGF0ZXIuCisJCQkgKi8KKwkJCXZwID0gWEZTX0lUT1ZfTlVMTChpcCk7CisKKwkJCWlmICghdnApIHsKKwkJCQlYRlNfTU9VTlRfSVVOTE9DSyhtcCk7CisJCQkJeGZzX2ZpbmlzaF9yZWNsYWltKGlwLCAwLCBYRlNfSUZMVVNIX0FTWU5DKTsKKwkJCQlwdXJnZWQgPSAxOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAodm5fY291bnQodnApICE9IDApIHsKKwkJCQlpZiAodm5fY291bnQodnApID09IDEgJiYKKwkJCQkgICAgKGlwID09IG1wLT5tX3Jvb3RpcCB8fAorCQkJCSAgICAgKG1wLT5tX3F1b3RhaW5mbyAmJgorCQkJCSAgICAgIChpcC0+aV9pbm8gPT0gbXAtPm1fc2Iuc2JfdXF1b3Rpbm8gfHwKKwkJCQkgICAgICAgaXAtPmlfaW5vID09IG1wLT5tX3NiLnNiX2dxdW90aW5vKSkpKSB7CisKKwkJCQkJaXAgPSBpcC0+aV9tbmV4dDsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWlmICghKGZsYWcgJiBYRlNfRkxVU0hfQUxMKSkgeworCQkJCQlidXN5ID0gMTsKKwkJCQkJZG9uZSA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvKgorCQkJCSAqIElnbm9yZSBidXN5IGlub2RlcyBidXQgY29udGludWUgZmx1c2hpbmcKKwkJCQkgKiBvdGhlcnMuCisJCQkJICovCisJCQkJaXAgPSBpcC0+aV9tbmV4dDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qCisJCQkgKiBTYW1wbGUgdnAgbWFwcGluZyB3aGlsZSBob2xkaW5nIG1wIGxvY2tlZCBvbiBNUAorCQkJICogc3lzdGVtcywgc28gd2UgZG9uJ3QgcHVyZ2UgYSByZWNsYWltZWQgb3IKKwkJCSAqIG5vbmV4aXN0ZW50IHZub2RlLiAgV2UgYnJlYWsgZnJvbSB0aGUgbG9vcAorCQkJICogc2luY2Ugd2Uga25vdyB0aGF0IHdlIG1vZGlmeQorCQkJICogaXQgYnkgcHVsbGluZyBvdXJzZWx2ZXMgZnJvbSBpdCBpbiB4ZnNfcmVjbGFpbSgpCisJCQkgKiBjYWxsZWQgdmlhIHZuX3B1cmdlKCkgYmVsb3cuICBTZXQgaXAgdG8gdGhlIG5leHQKKwkJCSAqIGVudHJ5IGluIHRoZSBsaXN0IGFueXdheSBzbyB3ZSdsbCBrbm93IGJlbG93CisJCQkgKiB3aGV0aGVyIHdlIHJlYWNoZWQgdGhlIGVuZCBvciBub3QuCisJCQkgKi8KKwkJCVZNQVAodnAsIHZtYXApOworCQkJWEZTX01PVU5UX0lVTkxPQ0sobXApOworCisJCQl2bl9wdXJnZSh2cCwgJnZtYXApOworCisJCQlwdXJnZWQgPSAxOworCQkJYnJlYWs7CisJCX0gd2hpbGUgKGlwICE9IG1wLT5tX2lub2Rlcyk7CisJCS8qCisJCSAqIFdlIG5lZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB3aGVuIHdlIGV4aXQgdGhlIGxvb3AKKwkJICogYWZ0ZXIgYSBwdXJnZSBhbmQgd2hlbiB3ZSBzaW1wbHkgaGl0IHRoZSBlbmQgb2YgdGhlCisJCSAqIGxpc3QuICBXZSBjYW4ndCB1c2UgdGhlIChpcCA9PSBtcC0+bV9pbm9kZXMpIHRlc3QsCisJCSAqIGJlY2F1c2Ugd2hlbiB3ZSBwdXJnZSBhbiBpbm9kZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpc3QKKwkJICogdGhlIG5leHQgaW5vZGUgb24gdGhlIGxpc3QgYmVjb21lcyBtcC0+bV9pbm9kZXMuICBUaGF0CisJCSAqIHdvdWxkIGNhdXNlIHN1Y2ggYSB0ZXN0IHRvIGJhaWwgb3V0IGVhcmx5LiAgVGhlIHB1cmdlZAorCQkgKiB2YXJpYWJsZSB0ZWxscyB1cyBob3cgd2UgZ290IG91dCBvZiB0aGUgbG9vcC4KKwkJICovCisJCWlmICghcHVyZ2VkKSB7CisJCQlkb25lID0gMTsKKwkJfQorCX0KKwlYRlNfTU9VTlRfSVVOTE9DSyhtcCk7CisJcmV0dXJuICFidXN5OworfQorCisKKy8qCisgKiB4ZnNfaWFjY2VzczogY2hlY2sgYWNjZXNzaWJpbGl0eSBvZiBpbm9kZSBmb3IgbW9kZS4KKyAqLworaW50Cit4ZnNfaWFjY2VzcygKKwl4ZnNfaW5vZGVfdAkqaXAsCisJbW9kZV90CQltb2RlLAorCWNyZWRfdAkJKmNyKQoreworCWludAkJZXJyb3I7CisJbW9kZV90CQlvcmdtb2RlID0gbW9kZTsKKwlzdHJ1Y3QgaW5vZGUJKmlub2RlID0gTElOVkZTX0dFVF9JUChYRlNfSVRPVihpcCkpOworCisJaWYgKG1vZGUgJiBTX0lXVVNSKSB7CisJCXVtb2RlX3QJCWltb2RlID0gaW5vZGUtPmlfbW9kZTsKKworCQlpZiAoSVNfUkRPTkxZKGlub2RlKSAmJgorCQkgICAgKFNfSVNSRUcoaW1vZGUpIHx8IFNfSVNESVIoaW1vZGUpIHx8IFNfSVNMTksoaW1vZGUpKSkKKwkJCXJldHVybiBYRlNfRVJST1IoRVJPRlMpOworCisJCWlmIChJU19JTU1VVEFCTEUoaW5vZGUpKQorCQkJcmV0dXJuIFhGU19FUlJPUihFQUNDRVMpOworCX0KKworCS8qCisJICogSWYgdGhlcmUncyBhbiBBY2Nlc3MgQ29udHJvbCBMaXN0IGl0J3MgdXNlZCBpbnN0ZWFkIG9mCisJICogdGhlIG1vZGUgYml0cy4KKwkgKi8KKwlpZiAoKGVycm9yID0gX0FDTF9YRlNfSUFDQ0VTUyhpcCwgbW9kZSwgY3IpKSAhPSAtMSkKKwkJcmV0dXJuIGVycm9yID8gWEZTX0VSUk9SKGVycm9yKSA6IDA7CisKKwlpZiAoY3VycmVudF9mc3VpZChjcikgIT0gaXAtPmlfZC5kaV91aWQpIHsKKwkJbW9kZSA+Pj0gMzsKKwkJaWYgKCFpbl9ncm91cF9wKChnaWRfdClpcC0+aV9kLmRpX2dpZCkpCisJCQltb2RlID4+PSAzOworCX0KKworCS8qCisJICogSWYgdGhlIERBQ3MgYXJlIG9rIHdlIGRvbid0IG5lZWQgYW55IGNhcGFiaWxpdHkgY2hlY2suCisJICovCisJaWYgKChpcC0+aV9kLmRpX21vZGUgJiBtb2RlKSA9PSBtb2RlKQorCQlyZXR1cm4gMDsKKwkvKgorCSAqIFJlYWQvd3JpdGUgREFDcyBhcmUgYWx3YXlzIG92ZXJyaWRhYmxlLgorCSAqIEV4ZWN1dGFibGUgREFDcyBhcmUgb3ZlcnJpZGFibGUgaWYgYXQgbGVhc3Qgb25lIGV4ZWMgYml0IGlzIHNldC4KKwkgKi8KKwlpZiAoIShvcmdtb2RlICYgU19JWFVTUikgfHwKKwkgICAgKGlub2RlLT5pX21vZGUgJiBTX0lYVUdPKSB8fCBTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQlpZiAoY2FwYWJsZV9jcmVkKGNyLCBDQVBfREFDX09WRVJSSURFKSkKKwkJCXJldHVybiAwOworCisJaWYgKChvcmdtb2RlID09IFNfSVJVU1IpIHx8CisJICAgIChTX0lTRElSKGlub2RlLT5pX21vZGUpICYmICghKG9yZ21vZGUgJiBTX0lXVVNSKSkpKSB7CisJCWlmIChjYXBhYmxlX2NyZWQoY3IsIENBUF9EQUNfUkVBRF9TRUFSQ0gpKQorCQkJcmV0dXJuIDA7CisjaWZkZWYJTk9JU0UKKwkJY21uX2VycihDRV9OT1RFLCAiSWNrOiBtb2RlPSVvLCBvcmdtb2RlPSVvIiwgbW9kZSwgb3JnbW9kZSk7CisjZW5kaWYJLyogTk9JU0UgKi8KKwkJcmV0dXJuIFhGU19FUlJPUihFQUNDRVMpOworCX0KKwlyZXR1cm4gWEZTX0VSUk9SKEVBQ0NFUyk7Cit9CisKKy8qCisgKiB4ZnNfaXJvdW5kdXA6IHJvdW5kIHVwIGFyZ3VtZW50IHRvIG5leHQgcG93ZXIgb2YgdHdvCisgKi8KK3VpbnQKK3hmc19pcm91bmR1cCgKKwl1aW50CXYpCit7CisJaW50IGk7CisJdWludCBtOworCisJaWYgKCh2ICYgKHYgLSAxKSkgPT0gMCkKKwkJcmV0dXJuIHY7CisJQVNTRVJUKCh2ICYgMHg4MDAwMDAwMCkgPT0gMCk7CisJaWYgKCh2ICYgKHYgKyAxKSkgPT0gMCkKKwkJcmV0dXJuIHYgKyAxOworCWZvciAoaSA9IDAsIG0gPSAxOyBpIDwgMzE7IGkrKywgbSA8PD0gMSkgeworCQlpZiAodiAmIG0pCisJCQljb250aW51ZTsKKwkJdiB8PSBtOworCQlpZiAoKHYgJiAodiArIDEpKSA9PSAwKQorCQkJcmV0dXJuIHYgKyAxOworCX0KKwlBU1NFUlQoMCk7CisJcmV0dXJuKCAwICk7Cit9CisKKy8qCisgKiBDaGFuZ2UgdGhlIHJlcXVlc3RlZCB0aW1lc3RhbXAgaW4gdGhlIGdpdmVuIGlub2RlLgorICogV2UgZG9uJ3QgbG9jayBhY3Jvc3MgdGltZXN0YW1wIHVwZGF0ZXMsIGFuZCB3ZSBkb24ndCBsb2cgdGhlbSBidXQKKyAqIHdlIGRvIHJlY29yZCB0aGUgZmFjdCB0aGF0IHRoZXJlIGlzIGRpcnR5IGluZm9ybWF0aW9uIGluIGNvcmUuCisgKgorICogTk9URSAtLSBjYWxsZXJzIE1VU1QgY29tYmluZSBYRlNfSUNIR1RJTUVfTU9EIG9yIFhGU19JQ0hHVElNRV9DSEcKKyAqCQl3aXRoIFhGU19JQ0hHVElNRV9BQ0MgdG8gYmUgc3VyZSB0aGF0IGFjY2VzcyB0aW1lCisgKgkJdXBkYXRlIHdpbGwgdGFrZS4gIENhbGxpbmcgZmlyc3Qgd2l0aCBYRlNfSUNIR1RJTUVfQUNDCisgKgkJYW5kIHRoZW4gWEZTX0lDSEdUSU1FX01PRCBtYXkgZmFpbCB0byBtb2RpZnkgdGhlIGFjY2VzcworICoJCXRpbWVzdGFtcCBpZiB0aGUgZmlsZXN5c3RlbSBpcyBtb3VudGVkIG5vYWNjdG0uCisgKi8KK3ZvaWQKK3hmc19pY2hndGltZSh4ZnNfaW5vZGVfdCAqaXAsCisJICAgICBpbnQgZmxhZ3MpCit7CisJdGltZXNwZWNfdAl0djsKKwl2bm9kZV90CQkqdnAgPSBYRlNfSVRPVihpcCk7CisJc3RydWN0IGlub2RlCSppbm9kZSA9IExJTlZGU19HRVRfSVAodnApOworCisJLyoKKwkgKiBXZSdyZSBub3Qgc3VwcG9zZWQgdG8gY2hhbmdlIHRpbWVzdGFtcHMgaW4gcmVhZG9ubHktbW91bnRlZAorCSAqIGZpbGVzeXN0ZW1zLiAgVGhyb3cgaXQgYXdheSBpZiBhbnlvbmUgYXNrcyB1cy4KKwkgKi8KKwlpZiAodW5saWtlbHkodnAtPnZfdmZzcC0+dmZzX2ZsYWcgJiBWRlNfUkRPTkxZKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBEb24ndCB1cGRhdGUgYWNjZXNzIHRpbWVzdGFtcHMgb24gcmVhZHMgaWYgbW91bnRlZCAibm9hdGltZSIKKwkgKiBUaHJvdyBpdCBhd2F5IGlmIGFueW9uZSBhc2tzIHVzLgorCSAqLworCWlmICgoaXAtPmlfbW91bnQtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfTk9BVElNRSB8fCBJU19OT0FUSU1FKGlub2RlKSkgJiYKKwkgICAgKChmbGFncyAmIChYRlNfSUNIR1RJTUVfQUNDfFhGU19JQ0hHVElNRV9NT0R8WEZTX0lDSEdUSU1FX0NIRykpCisJCQk9PSBYRlNfSUNIR1RJTUVfQUNDKSkKKwkJcmV0dXJuOworCisJbmFub3RpbWUoJnR2KTsKKwlpZiAoZmxhZ3MgJiBYRlNfSUNIR1RJTUVfTU9EKSB7CisJCVZOX01USU1FU0VUKHZwLCAmdHYpOworCQlpcC0+aV9kLmRpX210aW1lLnRfc2VjID0gKF9faW50MzJfdCl0di50dl9zZWM7CisJCWlwLT5pX2QuZGlfbXRpbWUudF9uc2VjID0gKF9faW50MzJfdCl0di50dl9uc2VjOworCX0KKwlpZiAoZmxhZ3MgJiBYRlNfSUNIR1RJTUVfQUNDKSB7CisJCVZOX0FUSU1FU0VUKHZwLCAmdHYpOworCQlpcC0+aV9kLmRpX2F0aW1lLnRfc2VjID0gKF9faW50MzJfdCl0di50dl9zZWM7CisJCWlwLT5pX2QuZGlfYXRpbWUudF9uc2VjID0gKF9faW50MzJfdCl0di50dl9uc2VjOworCX0KKwlpZiAoZmxhZ3MgJiBYRlNfSUNIR1RJTUVfQ0hHKSB7CisJCVZOX0NUSU1FU0VUKHZwLCAmdHYpOworCQlpcC0+aV9kLmRpX2N0aW1lLnRfc2VjID0gKF9faW50MzJfdCl0di50dl9zZWM7CisJCWlwLT5pX2QuZGlfY3RpbWUudF9uc2VjID0gKF9faW50MzJfdCl0di50dl9uc2VjOworCX0KKworCS8qCisJICogV2UgdXBkYXRlIHRoZSBpX3VwZGF0ZV9jb3JlIGZpZWxkIF9hZnRlcl8gY2hhbmdpbmcKKwkgKiB0aGUgdGltZXN0YW1wcyBpbiBvcmRlciB0byBjb29yZGluYXRlIHByb3Blcmx5IHdpdGgKKwkgKiB4ZnNfaWZsdXNoKCkgc28gdGhhdCB3ZSBkb24ndCBsb3NlIHRpbWVzdGFtcCB1cGRhdGVzLgorCSAqIFRoaXMga2VlcHMgdXMgZnJvbSBoYXZpbmcgdG8gaG9sZCB0aGUgaW5vZGUgbG9jaworCSAqIHdoaWxlIGRvaW5nIHRoaXMuICBXZSB1c2UgdGhlIFNZTkNIUk9OSVpFIG1hY3JvIHRvCisJICogZW5zdXJlIHRoYXQgdGhlIGNvbXBpbGVyIGRvZXMgbm90IHJlb3JkZXIgdGhlIHVwZGF0ZQorCSAqIG9mIGlfdXBkYXRlX2NvcmUgYWJvdmUgdGhlIHRpbWVzdGFtcCB1cGRhdGVzIGFib3ZlLgorCSAqLworCVNZTkNIUk9OSVpFKCk7CisJaXAtPmlfdXBkYXRlX2NvcmUgPSAxOworCWlmICghKGlub2RlLT5pX3N0YXRlICYgSV9MT0NLKSkKKwkJbWFya19pbm9kZV9kaXJ0eV9zeW5jKGlub2RlKTsKK30KKworI2lmZGVmIFhGU19JTE9DS19UUkFDRQora3RyYWNlX3QJKnhmc19pbG9ja190cmFjZV9idWY7CisKK3ZvaWQKK3hmc19pbG9ja190cmFjZSh4ZnNfaW5vZGVfdCAqaXAsIGludCBsb2NrLCB1bnNpZ25lZCBpbnQgbG9ja2ZsYWdzLCBpbnN0X3QgKnJhKQoreworCWt0cmFjZV9lbnRlcihpcC0+aV9sb2NrX3RyYWNlLAorCQkgICAgICh2b2lkICopaXAsCisJCSAgICAgKHZvaWQgKikodW5zaWduZWQgbG9uZylsb2NrLCAvKiAxID0gTE9DSywgMz1VTkxPQ0ssIGV0YyAqLworCQkgICAgICh2b2lkICopKHVuc2lnbmVkIGxvbmcpbG9ja2ZsYWdzLCAvKiBYRlNfSUxPQ0tfRVhDTCBldGMgKi8KKwkJICAgICAodm9pZCAqKXJhLAkJLyogY2FsbGVyIG9mIGlsb2NrICovCisJCSAgICAgKHZvaWQgKikodW5zaWduZWQgbG9uZyljdXJyZW50X2NwdSgpLAorCQkgICAgICh2b2lkICopKHVuc2lnbmVkIGxvbmcpY3VycmVudF9waWQoKSwKKwkJICAgICBOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pbm9kZS5oIGIvZnMveGZzL3hmc19pbm9kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1M2IxY2MKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2lub2RlLmgKQEAgLTAsMCArMSw1NTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmCV9fWEZTX0lOT0RFX0hfXworI2RlZmluZQlfX1hGU19JTk9ERV9IX18KKworLyoKKyAqIEZpbGUgaW5jb3JlIGV4dGVudCBpbmZvcm1hdGlvbiwgcHJlc2VudCBmb3IgZWFjaCBvZiBkYXRhICYgYXR0ciBmb3Jrcy4KKyAqLworI2RlZmluZQlYRlNfSU5MSU5FX0VYVFMJMgorI2RlZmluZQlYRlNfSU5MSU5FX0RBVEEJMzIKK3R5cGVkZWYgc3RydWN0IHhmc19pZm9yayB7CisJaW50CQkJaWZfYnl0ZXM7CS8qIGJ5dGVzIGluIGlmX3UxICovCisJaW50CQkJaWZfcmVhbF9ieXRlczsJLyogYnl0ZXMgYWxsb2NhdGVkIGluIGlmX3UxICovCisJeGZzX2JtYnRfYmxvY2tfdAkqaWZfYnJvb3Q7CS8qIGZpbGUncyBpbmNvcmUgYnRyZWUgcm9vdCAqLworCXNob3J0CQkJaWZfYnJvb3RfYnl0ZXM7CS8qIGJ5dGVzIGFsbG9jYXRlZCBmb3Igcm9vdCAqLworCXVuc2lnbmVkIGNoYXIJCWlmX2ZsYWdzOwkvKiBwZXItZm9yayBmbGFncyAqLworCXVuc2lnbmVkIGNoYXIJCWlmX2V4dF9tYXg7CS8qIG1heCAjIG9mIGV4dGVudCByZWNvcmRzICovCisJeGZzX2V4dG51bV90CQlpZl9sYXN0ZXg7CS8qIGxhc3QgaWZfZXh0ZW50cyB1c2VkICovCisJdW5pb24geworCQl4ZnNfYm1idF9yZWNfdAkqaWZfZXh0ZW50czsJLyogbGluZWFyIG1hcCBmaWxlIGV4dHMgKi8KKwkJY2hhcgkJKmlmX2RhdGE7CS8qIGlubGluZSBmaWxlIGRhdGEgKi8KKwl9IGlmX3UxOworCXVuaW9uIHsKKwkJeGZzX2JtYnRfcmVjX3QJaWZfaW5saW5lX2V4dFtYRlNfSU5MSU5FX0VYVFNdOworCQkJCQkJLyogdmVyeSBzbWFsbCBmaWxlIGV4dGVudHMgKi8KKwkJY2hhcgkJaWZfaW5saW5lX2RhdGFbWEZTX0lOTElORV9EQVRBXTsKKwkJCQkJCS8qIHZlcnkgc21hbGwgZmlsZSBkYXRhICovCisJCXhmc19kZXZfdAlpZl9yZGV2OwkvKiBkZXYgbnVtYmVyIGlmIHNwZWNpYWwgKi8KKwkJdXVpZF90CQlpZl91dWlkOwkvKiBtb3VudCBwb2ludCB2YWx1ZSAqLworCX0gaWZfdTI7Cit9IHhmc19pZm9ya190OworCisvKgorICogRmxhZ3MgZm9yIHhmc19pY2hndGltZSgpLgorICovCisjZGVmaW5lCVhGU19JQ0hHVElNRV9NT0QJMHgxCS8qIGRhdGEgZm9yayBtb2RpZmljYXRpb24gdGltZXN0YW1wICovCisjZGVmaW5lCVhGU19JQ0hHVElNRV9BQ0MJMHgyCS8qIGRhdGEgZm9yayBhY2Nlc3MgdGltZXN0YW1wICovCisjZGVmaW5lCVhGU19JQ0hHVElNRV9DSEcJMHg0CS8qIGlub2RlIGZpZWxkIGNoYW5nZSB0aW1lc3RhbXAgKi8KKworLyoKKyAqIFBlci1mb3JrIGluY29yZSBpbm9kZSBmbGFncy4KKyAqLworI2RlZmluZQlYRlNfSUZJTkxJTkUJMHgwMDAxCS8qIElubGluZSBkYXRhIGlzIHJlYWQgaW4gKi8KKyNkZWZpbmUJWEZTX0lGRVhURU5UUwkweDAwMDIJLyogQWxsIGV4dGVudCBwb2ludGVycyBhcmUgcmVhZCBpbiAqLworI2RlZmluZQlYRlNfSUZCUk9PVAkweDAwMDQJLyogaV9icm9vdCBwb2ludHMgdG8gdGhlIGJtYXAgYi10cmVlIHJvb3QgKi8KKworLyoKKyAqIEZsYWdzIGZvciB4ZnNfaW1hcCgpIGFuZCB4ZnNfZGlsb2NhdGUoKS4KKyAqLworI2RlZmluZQlYRlNfSU1BUF9MT09LVVAJCTB4MQorCisvKgorICogTWF4aW11bSBudW1iZXIgb2YgZXh0ZW50IHBvaW50ZXJzIGluIGlmX3UxLmlmX2V4dGVudHMuCisgKi8KKyNkZWZpbmUJWEZTX01BWF9JTkNPUkVfRVhURU5UUwkzMjc2OAorCisKKyNpZmRlZiBfX0tFUk5FTF9fCitzdHJ1Y3QgYmh2X2Rlc2M7CitzdHJ1Y3QgY3JlZDsKK3N0cnVjdCBrdHJhY2U7CitzdHJ1Y3Qgdm5vZGU7CitzdHJ1Y3QgeGZzX2J1ZjsKK3N0cnVjdCB4ZnNfYm1hcF9mcmVlOworc3RydWN0IHhmc19ibWJ0X2lyZWM7CitzdHJ1Y3QgeGZzX2JtYnRfYmxvY2s7CitzdHJ1Y3QgeGZzX2lub2RlOworc3RydWN0IHhmc19pbm9kZV9sb2dfaXRlbTsKK3N0cnVjdCB4ZnNfbW91bnQ7CitzdHJ1Y3QgeGZzX3RyYW5zOworc3RydWN0IHhmc19kcXVvdDsKKworI2lmIGRlZmluZWQoWEZTX0lMT0NLX1RSQUNFKQorI2RlZmluZSBYRlNfSUxPQ0tfS1RSQUNFX1NJWkUJMzIKK2V4dGVybiBrdHJhY2VfdCAqeGZzX2lsb2NrX3RyYWNlX2J1ZjsKK2V4dGVybiB2b2lkIHhmc19pbG9ja190cmFjZShzdHJ1Y3QgeGZzX2lub2RlICosIGludCwgdW5zaWduZWQgaW50LCBpbnN0X3QgKik7CisjZWxzZQorI2RlZmluZQl4ZnNfaWxvY2tfdHJhY2UoaSxuLGYscmEpCisjZW5kaWYKKworLyoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gY29tbXVuaWNhdGUgd2hpY2ggZXh0ZW50cyBvZiBhIGZpbGUKKyAqIHdlcmUgaG9sZXMgd2hlbiBhIHdyaXRlIHN0YXJ0ZWQgZnJvbSB4ZnNfd3JpdGVfZmlsZSgpIHRvCisgKiB4ZnNfc3RyYXRfcmVhZCgpLiAgVGhpcyBpcyBuZWNlc3Nhcnkgc28gdGhhdCB3ZSBjYW4ga25vdyB3aGljaAorICogYmxvY2tzIG5lZWQgdG8gYmUgemVyb2VkIHdoZW4gdGhleSBhcmUgcmVhZCBpbiBpbiB4ZnNfc3RyYXRfcmVhZCgpCisgKiBpZiB0aGV5IHdlcmVuXCd0IGFsbG9jYXRlZCB3aGVuIHRoZSBidWZmZXIgZ2l2ZW4gdG8geGZzX3N0cmF0X3JlYWQoKQorICogd2FzIG1hcHBlZC4KKyAqCisgKiBXZSBrZWVwIGEgbGlzdCBvZiB0aGVzZSBhdHRhY2hlZCB0byB0aGUgaW5vZGUuICBUaGUgbGlzdCBpcworICogcHJvdGVjdGVkIGJ5IHRoZSBpbm9kZSBsb2NrIGFuZCB0aGUgZmFjdCB0aGF0IHRoZSBpbyBsb2NrIGlzCisgKiBoZWxkIGV4Y2x1c2l2ZWx5IGJ5IHdyaXRlcnMuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19nYXAgeworCXN0cnVjdCB4ZnNfZ2FwCSp4Z19uZXh0OworCXhmc19maWxlb2ZmX3QJeGdfb2Zmc2V0X2ZzYjsKKwl4ZnNfZXh0bGVuX3QJeGdfY291bnRfZnNiOworfSB4ZnNfZ2FwX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRtX2F0dHJzX3MgeworCV9fdWludDMyX3QJZGFfZG1ldm1hc2s7CS8qIERNSUcgZXZlbnQgbWFzayAqLworCV9fdWludDE2X3QJZGFfZG1zdGF0ZTsJLyogRE1JRyBzdGF0ZSBpbmZvICovCisJX191aW50MTZfdAlkYV9wYWQ7CQkvKiBETUlHIGV4dHJhIHBhZGRpbmcgKi8KK30gZG1fYXR0cnNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2lvY29yZSB7CisJdm9pZAkJCSppb19vYmo7CS8qIHBvaW50ZXIgdG8gY29udGFpbmVyCisJCQkJCQkgKiBpbm9kZSBvciBkY3h2biBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgeGZzX21vdW50CSppb19tb3VudDsJLyogZnMgbW91bnQgc3RydWN0IHB0ciAqLworI2lmZGVmIERFQlVHCisJbXJsb2NrX3QJCSppb19sb2NrOwkvKiBpbm9kZSBJTyBsb2NrICovCisJbXJsb2NrX3QJCSppb19pb2xvY2s7CS8qIGlub2RlIElPIGxvY2sgKi8KKyNlbmRpZgorCisJLyogSS9PIHN0YXRlICovCisJeGZzX2ZzaXplX3QJCWlvX25ld19zaXplOwkvKiBzeiB3aGVuIHdyaXRlIGNvbXBsZXRlcyAqLworCisJLyogTWlzY2VsbGFuZW91cyBzdGF0ZS4gKi8KKwl1bnNpZ25lZCBpbnQJCWlvX2ZsYWdzOwkvKiBJTyByZWxhdGVkIGZsYWdzICovCisKKwkvKiBETUFQSSBzdGF0ZSAqLworCWRtX2F0dHJzX3QJCWlvX2RtYXR0cnM7CisKK30geGZzX2lvY29yZV90OworCisjZGVmaW5lICAgICAgICBpb19kbWV2bWFzayAgICAgaW9fZG1hdHRycy5kYV9kbWV2bWFzaworI2RlZmluZSAgICAgICAgaW9fZG1zdGF0ZSAgICAgIGlvX2RtYXR0cnMuZGFfZG1zdGF0ZQorCisjZGVmaW5lIFhGU19JT19JTk9ERShpbykJKCh4ZnNfaW5vZGVfdCAqKSAoKGlvKS0+aW9fb2JqKSkKKyNkZWZpbmUgWEZTX0lPX0RDWFZOKGlvKQkoKGRjeHZuX3QgKikgKChpbyktPmlvX29iaikpCisKKy8qCisgKiBGbGFncyBpbiB0aGUgZmxhZ3MgZmllbGQKKyAqLworCisjZGVmaW5lIFhGU19JT0NPUkVfUlQJCTB4MQorCisvKgorICogeGZzX2lvY29yZSBwcm90b3R5cGVzCisgKi8KKworZXh0ZXJuIHZvaWQgeGZzX2lvY29yZV9pbm9kZV9pbml0KHN0cnVjdCB4ZnNfaW5vZGUgKik7CitleHRlcm4gdm9pZCB4ZnNfaW9jb3JlX2lub2RlX3JlaW5pdChzdHJ1Y3QgeGZzX2lub2RlICopOworCisKKy8qCisgKiBUaGlzIGlzIHRoZSB0eXBlIHVzZWQgaW4gdGhlIHhmcyBpbm9kZSBoYXNoIHRhYmxlLgorICogQW4gYXJyYXkgb2YgdGhlc2UgaXMgYWxsb2NhdGVkIGZvciBlYWNoIG1vdW50ZWQKKyAqIGZpbGUgc3lzdGVtIHRvIGhhc2ggdGhlIGlub2RlcyBmb3IgdGhhdCBmaWxlIHN5c3RlbS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2loYXNoIHsKKwlzdHJ1Y3QgeGZzX2lub2RlCSppaF9uZXh0OworCXJ3bG9ja190CQlpaF9sb2NrOworCXVpbnQJCQlpaF92ZXJzaW9uOworfSB4ZnNfaWhhc2hfdDsKKworI2RlZmluZSBYRlNfSUhBU0gobXAsaW5vKSAoKG1wKS0+bV9paGFzaCArICgoKHVpbnQpKGlubykpICUgKG1wKS0+bV9paHNpemUpKQorCisvKgorICogVGhpcyBpcyB0aGUgeGZzIGlub2RlIGNsdXN0ZXIgaGFzaC4gIFRoaXMgaGFzaCBpcyB1c2VkIGJ5IHhmc19pZmx1c2ggdG8KKyAqIGZpbmQgaW5vZGVzIHRoYXQgc2hhcmUgYSBjbHVzdGVyIGFuZCBjYW4gYmUgZmx1c2hlZCB0byBkaXNrIGF0IHRoZSBzYW1lCisgKiB0aW1lLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfY2hhc2hsaXN0IHsKKwlzdHJ1Y3QgeGZzX2NoYXNobGlzdAkqY2hsX25leHQ7CisJc3RydWN0IHhmc19pbm9kZQkqY2hsX2lwOworCXhmc19kYWRkcl90CQljaGxfYmxrbm87CS8qIHN0YXJ0aW5nIGJsb2NrIG51bWJlciBvZgorCQkJCQkJICogdGhlIGNsdXN0ZXIgKi8KKwlzdHJ1Y3QgeGZzX2J1ZgkJKmNobF9idWY7CS8qIHRoZSBpbm9kZSBidWZmZXIgKi8KK30geGZzX2NoYXNobGlzdF90OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfY2hhc2ggeworCXhmc19jaGFzaGxpc3RfdAkJKmNoX2xpc3Q7CisJbG9ja190CQkJY2hfbG9jazsKK30geGZzX2NoYXNoX3Q7CisKKyNkZWZpbmUgWEZTX0NIQVNIKG1wLGJsaykgKChtcCktPm1fY2hhc2ggKyAoKCh1aW50KWJsaykgJSAobXApLT5tX2Noc2l6ZSkpCisKKworLyoKKyAqIFRoaXMgaXMgdGhlIHhmcyBpbi1jb3JlIGlub2RlIHN0cnVjdHVyZS4KKyAqIE1vc3Qgb2YgdGhlIG9uLWRpc2sgaW5vZGUgaXMgZW1iZWRkZWQgaW4gdGhlIGlfZCBmaWVsZC4KKyAqCisgKiBUaGUgZXh0ZW50IHBvaW50ZXJzL2lubGluZSBmaWxlIHNwYWNlLCBob3dldmVyLCBhcmUgbWFuYWdlZAorICogc2VwYXJhdGVseS4gIFRoZSBtZW1vcnkgZm9yIHRoaXMgaW5mb3JtYXRpb24gaXMgcG9pbnRlZCB0byBieQorICogdGhlIGlmX3UxIHVuaW9ucyBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgdGhlIGRhdGEuCisgKiBUaGlzIGlzIHVzZWQgdG8gbGluZWFyaXplIHRoZSBhcnJheSBvZiBleHRlbnRzIGZvciBmYXN0IGluLWNvcmUKKyAqIGFjY2Vzcy4gIFRoaXMgaXMgdXNlZCB1bnRpbCB0aGUgZmlsZSdzIG51bWJlciBvZiBleHRlbnRzCisgKiBzdXJwYXNzZXMgWEZTX01BWF9JTkNPUkVfRVhURU5UUywgYXQgd2hpY2ggcG9pbnQgYWxsIGV4dGVudCBwb2ludGVycworICogYXJlIGFjY2Vzc2VkIHRocm91Z2ggdGhlIGJ1ZmZlciBjYWNoZS4KKyAqCisgKiBPdGhlciBzdGF0ZSBrZXB0IGluIHRoZSBpbi1jb3JlIGlub2RlIGlzIHVzZWQgZm9yIGlkZW50aWZpY2F0aW9uLAorICogbG9ja2luZywgdHJhbnNhY3Rpb25hbCB1cGRhdGluZywgZXRjIG9mIHRoZSBpbm9kZS4KKyAqCisgKiBHZW5lcmFsbHksIHdlIGRvIG5vdCB3YW50IHRvIGhvbGQgdGhlIGlfcmxvY2sgd2hpbGUgaG9sZGluZyB0aGUKKyAqIGlfaWxvY2suIEhpZXJhcmNoeSBpcyBpX2lvbG9jayBmb2xsb3dlZCBieSBpX3Jsb2NrLgorICoKKyAqIHhmc19pcHRyX3QgY29udGFpbnMgYWxsIHRoZSBpbm9kZSBmaWVsZHMgdXB0byBhbmQgaW5jbHVkaW5nIHRoZQorICogaV9tbmV4dCBhbmQgaV9tcHJldiBmaWVsZHMsIGl0IGlzIHVzZWQgYXMgYSBtYXJrZXIgaW4gdGhlIGlub2RlCisgKiBjaGFpbiBvZmYgdGhlIG1vdW50IHN0cnVjdHVyZSBieSB4ZnNfc3luYyBjYWxscy4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJc3RydWN0IHhmc19paGFzaAkqaXBfaGFzaDsJLyogcG9pbnRlciB0byBoYXNoIGhlYWRlciAqLworCXN0cnVjdCB4ZnNfaW5vZGUJKmlwX25leHQ7CS8qIGlub2RlIGhhc2ggbGluayBmb3J3ICovCisJc3RydWN0IHhmc19pbm9kZQkqaXBfbW5leHQ7CS8qIG5leHQgaW5vZGUgaW4gbW91bnQgbGlzdCAqLworCXN0cnVjdCB4ZnNfaW5vZGUJKmlwX21wcmV2OwkvKiBwdHIgdG8gcHJldiBpbm9kZSAqLworCXN0cnVjdCB4ZnNfaW5vZGUJKippcF9wcmV2cDsJLyogcHRyIHRvIHByZXYgaV9uZXh0ICovCisJc3RydWN0IHhmc19tb3VudAkqaXBfbW91bnQ7CS8qIGZzIG1vdW50IHN0cnVjdCBwdHIgKi8KK30geGZzX2lwdHJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2lub2RlIHsKKwkvKiBJbm9kZSBsaW5raW5nIGFuZCBpZGVudGlmaWNhdGlvbiBpbmZvcm1hdGlvbi4gKi8KKwlzdHJ1Y3QgeGZzX2loYXNoCSppX2hhc2g7CS8qIHBvaW50ZXIgdG8gaGFzaCBoZWFkZXIgKi8KKwlzdHJ1Y3QgeGZzX2lub2RlCSppX25leHQ7CS8qIGlub2RlIGhhc2ggbGluayBmb3J3ICovCisJc3RydWN0IHhmc19pbm9kZQkqaV9tbmV4dDsJLyogbmV4dCBpbm9kZSBpbiBtb3VudCBsaXN0ICovCisJc3RydWN0IHhmc19pbm9kZQkqaV9tcHJldjsJLyogcHRyIHRvIHByZXYgaW5vZGUgKi8KKwlzdHJ1Y3QgeGZzX2lub2RlCSoqaV9wcmV2cDsJLyogcHRyIHRvIHByZXYgaV9uZXh0ICovCisJc3RydWN0IHhmc19tb3VudAkqaV9tb3VudDsJLyogZnMgbW91bnQgc3RydWN0IHB0ciAqLworCXN0cnVjdCBsaXN0X2hlYWQJaV9yZWNsYWltOwkvKiByZWNsYWltIGxpc3QgKi8KKwlzdHJ1Y3QgYmh2X2Rlc2MJCWlfYmh2X2Rlc2M7CS8qIGlub2RlIGJlaGF2aW9yIGRlc2NyaXB0b3IqLworCXN0cnVjdCB4ZnNfZHF1b3QJKmlfdWRxdW90OwkvKiB1c2VyIGRxdW90ICovCisJc3RydWN0IHhmc19kcXVvdAkqaV9nZHF1b3Q7CS8qIGdyb3VwIGRxdW90ICovCisKKwkvKiBJbm9kZSBsb2NhdGlvbiBzdHVmZiAqLworCXhmc19pbm9fdAkJaV9pbm87CQkvKiBpbm9kZSBudW1iZXIgKGFnbm8vYWdpbm8pKi8KKwl4ZnNfZGFkZHJfdAkJaV9ibGtubzsJLyogYmxrbm8gb2YgaW5vZGUgYnVmZmVyICovCisJdXNob3J0CQkJaV9sZW47CQkvKiBsZW4gb2YgaW5vZGUgYnVmZmVyICovCisJdXNob3J0CQkJaV9ib2Zmc2V0OwkvKiBvZmYgb2YgaW5vZGUgaW4gYnVmZmVyICovCisKKwkvKiBFeHRlbnQgaW5mb3JtYXRpb24uICovCisJeGZzX2lmb3JrX3QJCSppX2FmcDsJCS8qIGF0dHJpYnV0ZSBmb3JrIHBvaW50ZXIgKi8KKwl4ZnNfaWZvcmtfdAkJaV9kZjsJCS8qIGRhdGEgZm9yayAqLworCisJLyogVHJhbnNhY3Rpb24gYW5kIGxvY2tpbmcgaW5mb3JtYXRpb24uICovCisJc3RydWN0IHhmc190cmFucwkqaV90cmFuc3A7CS8qIHB0ciB0byBvd25pbmcgdHJhbnNhY3Rpb24qLworCXN0cnVjdCB4ZnNfaW5vZGVfbG9nX2l0ZW0gKmlfaXRlbXA7CS8qIGxvZ2dpbmcgaW5mb3JtYXRpb24gKi8KKwltcmxvY2tfdAkJaV9sb2NrOwkJLyogaW5vZGUgbG9jayAqLworCW1ybG9ja190CQlpX2lvbG9jazsJLyogaW5vZGUgSU8gbG9jayAqLworCXNlbWFfdAkJCWlfZmxvY2s7CS8qIGlub2RlIGZsdXNoIGxvY2sgKi8KKwlhdG9taWNfdAkJaV9waW5jb3VudDsJLyogaW5vZGUgcGluIGNvdW50ICovCisJd2FpdF9xdWV1ZV9oZWFkX3QJaV9pcGluX3dhaXQ7CS8qIGlub2RlIHBpbm5pbmcgd2FpdCBxdWV1ZSAqLworI2lmZGVmIEhBVkVfUkVGQ0FDSEUKKwlzdHJ1Y3QgeGZzX2lub2RlCSoqaV9yZWZjYWNoZTsJLyogcHRyIHRvIGVudHJ5IGluIHJlZiBjYWNoZSAqLworCXN0cnVjdCB4ZnNfaW5vZGUJKmlfcmVsZWFzZTsJLyogaW5vZGUgdG8gdW5yZWYgKi8KKyNlbmRpZgorCS8qIEkvTyBzdGF0ZSAqLworCXhmc19pb2NvcmVfdAkJaV9pb2NvcmU7CS8qIEkvTyBjb3JlICovCisKKwkvKiBNaXNjZWxsYW5lb3VzIHN0YXRlLiAqLworCXVuc2lnbmVkIHNob3J0CQlpX2ZsYWdzOwkvKiBzZWUgZGVmaW5lZCBmbGFncyBiZWxvdyAqLworCXVuc2lnbmVkIGNoYXIJCWlfdXBkYXRlX2NvcmU7CS8qIHRpbWVzdGFtcHMvc2l6ZSBpcyBkaXJ0eSAqLworCXVuc2lnbmVkIGNoYXIJCWlfdXBkYXRlX3NpemU7CS8qIGRpX3NpemUgZmllbGQgaXMgZGlydHkgKi8KKwl1bnNpZ25lZCBpbnQJCWlfZ2VuOwkJLyogZ2VuZXJhdGlvbiBjb3VudCAqLworCXVuc2lnbmVkIGludAkJaV9kZWxheWVkX2Jsa3M7CS8qIGNvdW50IG9mIGRlbGF5IGFsbG9jIGJsa3MgKi8KKworCXhmc19kaW5vZGVfY29yZV90CWlfZDsJCS8qIG1vc3Qgb2Ygb25kaXNrIGlub2RlICovCisJeGZzX2NoYXNobGlzdF90CQkqaV9jaGFzaDsJLyogY2x1c3RlciBoYXNoIGxpc3QgaGVhZGVyICovCisJc3RydWN0IHhmc19pbm9kZQkqaV9jbmV4dDsJLyogY2x1c3RlciBoYXNoIGxpbmsgZm9yd2FyZCAqLworCXN0cnVjdCB4ZnNfaW5vZGUJKmlfY3ByZXY7CS8qIGNsdXN0ZXIgaGFzaCBsaW5rIGJhY2t3YXJkICovCisKKwkvKiBUcmFjZSBidWZmZXJzIHBlciBpbm9kZS4gKi8KKyNpZmRlZiBYRlNfQk1BUF9UUkFDRQorCXN0cnVjdCBrdHJhY2UJCSppX3h0cmFjZTsJLyogaW5vZGUgZXh0ZW50IGxpc3QgdHJhY2UgKi8KKyNlbmRpZgorI2lmZGVmIFhGU19CTUJUX1RSQUNFCisJc3RydWN0IGt0cmFjZQkJKmlfYnRyYWNlOwkvKiBpbm9kZSBibWFwIGJ0cmVlIHRyYWNlICovCisjZW5kaWYKKyNpZmRlZiBYRlNfUldfVFJBQ0UKKwlzdHJ1Y3Qga3RyYWNlCQkqaV9yd3RyYWNlOwkvKiBpbm9kZSByZWFkL3dyaXRlIHRyYWNlICovCisjZW5kaWYKKyNpZmRlZiBYRlNfSUxPQ0tfVFJBQ0UKKwlzdHJ1Y3Qga3RyYWNlCQkqaV9sb2NrX3RyYWNlOwkvKiBpbm9kZSBsb2NrL3VubG9jayB0cmFjZSAqLworI2VuZGlmCisjaWZkZWYgWEZTX0RJUjJfVFJBQ0UKKwlzdHJ1Y3Qga3RyYWNlCQkqaV9kaXJfdHJhY2U7CS8qIGlub2RlIGRpcmVjdG9yeSB0cmFjZSAqLworI2VuZGlmCit9IHhmc19pbm9kZV90OworCisjZW5kaWYJLyogX19LRVJORUxfXyAqLworCisKKy8qCisgKiBGb3JrIGhhbmRsaW5nLgorICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JRk9SS19QVFIpCit4ZnNfaWZvcmtfdCAqeGZzX2lmb3JrX3B0cih4ZnNfaW5vZGVfdCAqaXAsIGludCB3KTsKKyNkZWZpbmUJWEZTX0lGT1JLX1BUUihpcCx3KQkJeGZzX2lmb3JrX3B0cihpcCx3KQorI2Vsc2UKKyNkZWZpbmUJWEZTX0lGT1JLX1BUUihpcCx3KSAgICgodykgPT0gWEZTX0RBVEFfRk9SSyA/ICYoaXApLT5pX2RmIDogKGlwKS0+aV9hZnApCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lGT1JLX1EpCitpbnQgeGZzX2lmb3JrX3EoeGZzX2lub2RlX3QgKmlwKTsKKyNkZWZpbmUJWEZTX0lGT1JLX1EoaXApCQkJeGZzX2lmb3JrX3EoaXApCisjZWxzZQorI2RlZmluZQlYRlNfSUZPUktfUShpcCkJCQlYRlNfQ0ZPUktfUSgmKGlwKS0+aV9kKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JRk9SS19EU0laRSkKK2ludCB4ZnNfaWZvcmtfZHNpemUoeGZzX2lub2RlX3QgKmlwKTsKKyNkZWZpbmUJWEZTX0lGT1JLX0RTSVpFKGlwKQkJeGZzX2lmb3JrX2RzaXplKGlwKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0lGT1JLX0RTSVpFKGlwKQkJWEZTX0NGT1JLX0RTSVpFKCZpcC0+aV9kLCBpcC0+aV9tb3VudCkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSUZPUktfQVNJWkUpCitpbnQgeGZzX2lmb3JrX2FzaXplKHhmc19pbm9kZV90ICppcCk7CisjZGVmaW5lCVhGU19JRk9SS19BU0laRShpcCkJCXhmc19pZm9ya19hc2l6ZShpcCkKKyNlbHNlCisjZGVmaW5lCVhGU19JRk9SS19BU0laRShpcCkJCVhGU19DRk9SS19BU0laRSgmaXAtPmlfZCwgaXAtPmlfbW91bnQpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lGT1JLX1NJWkUpCitpbnQgeGZzX2lmb3JrX3NpemUoeGZzX2lub2RlX3QgKmlwLCBpbnQgdyk7CisjZGVmaW5lCVhGU19JRk9SS19TSVpFKGlwLHcpCQl4ZnNfaWZvcmtfc2l6ZShpcCx3KQorI2Vsc2UKKyNkZWZpbmUJWEZTX0lGT1JLX1NJWkUoaXAsdykJCVhGU19DRk9SS19TSVpFKCZpcC0+aV9kLCBpcC0+aV9tb3VudCwgdykKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSUZPUktfRk9STUFUKQoraW50IHhmc19pZm9ya19mb3JtYXQoeGZzX2lub2RlX3QgKmlwLCBpbnQgdyk7CisjZGVmaW5lCVhGU19JRk9SS19GT1JNQVQoaXAsdykJCXhmc19pZm9ya19mb3JtYXQoaXAsdykKKyNlbHNlCisjZGVmaW5lCVhGU19JRk9SS19GT1JNQVQoaXAsdykJCVhGU19DRk9SS19GT1JNQVQoJmlwLT5pX2QsIHcpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lGT1JLX0ZNVF9TRVQpCit2b2lkIHhmc19pZm9ya19mbXRfc2V0KHhmc19pbm9kZV90ICppcCwgaW50IHcsIGludCBuKTsKKyNkZWZpbmUJWEZTX0lGT1JLX0ZNVF9TRVQoaXAsdyxuKQl4ZnNfaWZvcmtfZm10X3NldChpcCx3LG4pCisjZWxzZQorI2RlZmluZQlYRlNfSUZPUktfRk1UX1NFVChpcCx3LG4pCVhGU19DRk9SS19GTVRfU0VUKCZpcC0+aV9kLCB3LCBuKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JRk9SS19ORVhURU5UUykKK2ludCB4ZnNfaWZvcmtfbmV4dGVudHMoeGZzX2lub2RlX3QgKmlwLCBpbnQgdyk7CisjZGVmaW5lCVhGU19JRk9SS19ORVhURU5UUyhpcCx3KQl4ZnNfaWZvcmtfbmV4dGVudHMoaXAsdykKKyNlbHNlCisjZGVmaW5lCVhGU19JRk9SS19ORVhURU5UUyhpcCx3KQlYRlNfQ0ZPUktfTkVYVEVOVFMoJmlwLT5pX2QsIHcpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lGT1JLX05FWFRfU0VUKQordm9pZCB4ZnNfaWZvcmtfbmV4dF9zZXQoeGZzX2lub2RlX3QgKmlwLCBpbnQgdywgaW50IG4pOworI2RlZmluZQlYRlNfSUZPUktfTkVYVF9TRVQoaXAsdyxuKQl4ZnNfaWZvcmtfbmV4dF9zZXQoaXAsdyxuKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0lGT1JLX05FWFRfU0VUKGlwLHcsbikJWEZTX0NGT1JLX05FWFRfU0VUKCZpcC0+aV9kLCB3LCBuKQorI2VuZGlmCisKKworI2lmZGVmIF9fS0VSTkVMX18KKworLyoKKyAqIEluLWNvcmUgaW5vZGUgZmxhZ3MuCisgKi8KKyNkZWZpbmUgWEZTX0lHUklPCTB4MDAwMSAgLyogaW5vZGUgdXNlZCBmb3IgZ3VhcmFudGVlZCByYXRlIGkvbyAqLworI2RlZmluZSBYRlNfSVVJT1NaCTB4MDAwMiAgLyogaW5vZGUgaS9vIHNpemVzIGhhdmUgYmVlbiBleHBsaWNpdGx5IHNldCAqLworI2RlZmluZSBYRlNfSVFVSUVTQ0UgICAgMHgwMDA0ICAvKiB3ZSBoYXZlIHN0YXJ0ZWQgcXVpZXNjaW5nIGZvciB0aGlzIGlub2RlICovCisjZGVmaW5lIFhGU19JUkVDTEFJTSAgICAweDAwMDggIC8qIHdlIGhhdmUgc3RhcnRlZCByZWNsYWltaW5nIHRoaXMgaW5vZGUgICAgKi8KKyNkZWZpbmUgWEZTX0lTVEFMRQkweDAwMTAJLyogaW5vZGUgaGFzIGJlZW4gc3RhbGVkICovCisjZGVmaW5lIFhGU19JUkVDTEFJTUFCTEUgMHgwMDIwIC8qIGlub2RlIGNhbiBiZSByZWNsYWltZWQgKi8KKyNkZWZpbmUgWEZTX0lORVcJMHgwMDQwCisKKy8qCisgKiBGbGFncyBmb3IgaW5vZGUgbG9ja2luZy4KKyAqLworI2RlZmluZQlYRlNfSU9MT0NLX0VYQ0wJCTB4MDAxCisjZGVmaW5lCVhGU19JT0xPQ0tfU0hBUkVECTB4MDAyCisjZGVmaW5lCVhGU19JTE9DS19FWENMCQkweDAwNAorI2RlZmluZQlYRlNfSUxPQ0tfU0hBUkVECTB4MDA4CisjZGVmaW5lCVhGU19JVU5MT0NLX05PTk9USUZZCTB4MDEwCisjZGVmaW5lIFhGU19FWFRFTlRfVE9LRU5fUkQJMHgwNDAKKyNkZWZpbmUgWEZTX1NJWkVfVE9LRU5fUkQJMHgwODAKKyNkZWZpbmUgWEZTX0VYVFNJWkVfUkQJCShYRlNfRVhURU5UX1RPS0VOX1JEfFhGU19TSVpFX1RPS0VOX1JEKQorI2RlZmluZSBYRlNfV0lMTExFTkQJCTB4MTAwCS8qIEFsd2F5cyBhY3F1aXJlIHRva2VucyBmb3IgbGVuZGluZyAqLworI2RlZmluZSBYRlNfRVhURU5UX1RPS0VOX1dSCShYRlNfRVhURU5UX1RPS0VOX1JEIHwgWEZTX1dJTExMRU5EKQorI2RlZmluZSBYRlNfU0laRV9UT0tFTl9XUiAgICAgICAoWEZTX1NJWkVfVE9LRU5fUkQgfCBYRlNfV0lMTExFTkQpCisjZGVmaW5lIFhGU19FWFRTSVpFX1dSCQkoWEZTX0VYVFNJWkVfUkQgfCBYRlNfV0lMTExFTkQpCisKKworI2RlZmluZSBYRlNfTE9DS19NQVNLCVwKKwkoWEZTX0lPTE9DS19FWENMIHwgWEZTX0lPTE9DS19TSEFSRUQgfCBYRlNfSUxPQ0tfRVhDTCB8IFwKKwkgWEZTX0lMT0NLX1NIQVJFRCB8IFhGU19FWFRFTlRfVE9LRU5fUkQgfCBYRlNfU0laRV9UT0tFTl9SRCB8IFwKKwkgWEZTX1dJTExMRU5EKQorCisvKgorICogRmxhZ3MgZm9yIHhmc19pZmx1c2goKQorICovCisjZGVmaW5lCVhGU19JRkxVU0hfREVMV1JJX0VMU0VfU1lOQwkxCisjZGVmaW5lCVhGU19JRkxVU0hfREVMV1JJX0VMU0VfQVNZTkMJMgorI2RlZmluZQlYRlNfSUZMVVNIX1NZTkMJCQkzCisjZGVmaW5lCVhGU19JRkxVU0hfQVNZTkMJCTQKKyNkZWZpbmUJWEZTX0lGTFVTSF9ERUxXUkkJCTUKKworLyoKKyAqIEZsYWdzIGZvciB4ZnNfaWZsdXNoX2FsbC4KKyAqLworI2RlZmluZQlYRlNfRkxVU0hfQUxMCQkweDEKKworLyoKKyAqIEZsYWdzIGZvciB4ZnNfaXRydW5jYXRlX3N0YXJ0KCkuCisgKi8KKyNkZWZpbmUJWEZTX0lUUlVOQ19ERUZJTklURQkweDEKKyNkZWZpbmUJWEZTX0lUUlVOQ19NQVlCRQkweDIKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSVRPVikKK3N0cnVjdCB2bm9kZSAqeGZzX2l0b3YoeGZzX2lub2RlX3QgKmlwKTsKKyNkZWZpbmUJWEZTX0lUT1YoaXApCQl4ZnNfaXRvdihpcCkKKyNlbHNlCisjZGVmaW5lCVhGU19JVE9WKGlwKQkJQkhWX1RPX1ZOT0RFKFhGU19JVE9CSFYoaXApKQorI2VuZGlmCisjZGVmaW5lCVhGU19JVE9WX05VTEwoaXApCUJIVl9UT19WTk9ERV9OVUxMKFhGU19JVE9CSFYoaXApKQorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSVRPQkhWKQorc3RydWN0IGJodl9kZXNjICp4ZnNfaXRvYmh2KHhmc19pbm9kZV90ICppcCk7CisjZGVmaW5lCVhGU19JVE9CSFYoaXApCQl4ZnNfaXRvYmh2KGlwKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0lUT0JIVihpcCkJCSgoc3RydWN0IGJodl9kZXNjICopKCYoKGlwKS0+aV9iaHZfZGVzYykpKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19CSFZUT0kpCit4ZnNfaW5vZGVfdCAqeGZzX2JodnRvaShzdHJ1Y3QgYmh2X2Rlc2MgKmJodnApOworI2RlZmluZQlYRlNfQkhWVE9JKGJodnApCXhmc19iaHZ0b2koYmh2cCkKKyNlbHNlCisjZGVmaW5lCVhGU19CSFZUT0koYmh2cCkJXAorCSgoeGZzX2lub2RlX3QgKikoKGNoYXIgKikoYmh2cCkgLSBcCisJCQkgKGNoYXIgKikmKCgoeGZzX2lub2RlX3QgKikwKS0+aV9iaHZfZGVzYykpKQorI2VuZGlmCisKKyNkZWZpbmUgQkhWX0lTX1hGUyhiZHApCQkoQkhWX09QUyhiZHApID09ICZ4ZnNfdm5vZGVvcHMpCisKKy8qCisgKiBGb3IgbXVsdGlwbGUgZ3JvdXBzIHN1cHBvcnQ6IGlmIFNfSVNHSUQgYml0IGlzIHNldCBpbiB0aGUgcGFyZW50CisgKiBkaXJlY3RvcnksIGdyb3VwIG9mIG5ldyBmaWxlIGlzIHNldCB0byB0aGF0IG9mIHRoZSBwYXJlbnQsIGFuZAorICogbmV3IHN1YmRpcmVjdG9yeSBnZXRzIFNfSVNHSUQgYml0IGZyb20gcGFyZW50LgorICovCisjZGVmaW5lIFhGU19JTkhFUklUX0dJRChwaXAsIHZmc3ApCVwKKwkoKCh2ZnNwKS0+dmZzX2ZsYWcgJiBWRlNfR1JQSUQpIHx8ICgocGlwKS0+aV9kLmRpX21vZGUgJiBTX0lTR0lEKSkKKworLyoKKyAqIHhmc19pZ2V0LmMgcHJvdG90eXBlcy4KKyAqLworCisjZGVmaW5lIElHRVRfQ1JFQVRFCTEKKwordm9pZAkJeGZzX2loYXNoX2luaXQoc3RydWN0IHhmc19tb3VudCAqKTsKK3ZvaWQJCXhmc19paGFzaF9mcmVlKHN0cnVjdCB4ZnNfbW91bnQgKik7Cit2b2lkCQl4ZnNfY2hhc2hfaW5pdChzdHJ1Y3QgeGZzX21vdW50ICopOwordm9pZAkJeGZzX2NoYXNoX2ZyZWUoc3RydWN0IHhmc19tb3VudCAqKTsKK3hmc19pbm9kZV90CSp4ZnNfaW5vZGVfaW5jb3JlKHN0cnVjdCB4ZnNfbW91bnQgKiwgeGZzX2lub190LAorCQkJCSAgc3RydWN0IHhmc190cmFucyAqKTsKK3ZvaWQgICAgICAgICAgICB4ZnNfaW5vZGVfbG9ja19pbml0KHhmc19pbm9kZV90ICosIHN0cnVjdCB2bm9kZSAqKTsKK2ludAkJeGZzX2lnZXQoc3RydWN0IHhmc19tb3VudCAqLCBzdHJ1Y3QgeGZzX3RyYW5zICosIHhmc19pbm9fdCwKKwkJCSB1aW50LCB1aW50LCB4ZnNfaW5vZGVfdCAqKiwgeGZzX2RhZGRyX3QpOwordm9pZAkJeGZzX2lwdXQoeGZzX2lub2RlX3QgKiwgdWludCk7Cit2b2lkCQl4ZnNfaXB1dF9uZXcoeGZzX2lub2RlX3QgKiwgdWludCk7Cit2b2lkCQl4ZnNfaWxvY2soeGZzX2lub2RlX3QgKiwgdWludCk7CitpbnQJCXhmc19pbG9ja19ub3dhaXQoeGZzX2lub2RlX3QgKiwgdWludCk7Cit2b2lkCQl4ZnNfaXVubG9jayh4ZnNfaW5vZGVfdCAqLCB1aW50KTsKK3ZvaWQJCXhmc19pbG9ja19kZW1vdGUoeGZzX2lub2RlX3QgKiwgdWludCk7Cit2b2lkCQl4ZnNfaWZsb2NrKHhmc19pbm9kZV90ICopOworaW50CQl4ZnNfaWZsb2NrX25vd2FpdCh4ZnNfaW5vZGVfdCAqKTsKK3VpbnQJCXhmc19pbG9ja19tYXBfc2hhcmVkKHhmc19pbm9kZV90ICopOwordm9pZAkJeGZzX2l1bmxvY2tfbWFwX3NoYXJlZCh4ZnNfaW5vZGVfdCAqLCB1aW50KTsKK3ZvaWQJCXhmc19pZnVubG9jayh4ZnNfaW5vZGVfdCAqKTsKK3ZvaWQJCXhmc19pcmVjbGFpbSh4ZnNfaW5vZGVfdCAqKTsKK2ludAkJeGZzX2ZpbmlzaF9yZWNsYWltKHhmc19pbm9kZV90ICosIGludCwgaW50KTsKK2ludAkJeGZzX2ZpbmlzaF9yZWNsYWltX2FsbChzdHJ1Y3QgeGZzX21vdW50ICosIGludCk7CisKKy8qCisgKiB4ZnNfaW5vZGUuYyBwcm90b3R5cGVzLgorICovCitpbnQJCXhmc19pbm90b2JwKHN0cnVjdCB4ZnNfbW91bnQgKiwgc3RydWN0IHhmc190cmFucyAqLCB4ZnNfaW5vX3QsCisJCQkgICAgeGZzX2Rpbm9kZV90ICoqLCBzdHJ1Y3QgeGZzX2J1ZiAqKiwgaW50ICopOworaW50CQl4ZnNfaXRvYnAoc3RydWN0IHhmc19tb3VudCAqLCBzdHJ1Y3QgeGZzX3RyYW5zICosCisJCQkgIHhmc19pbm9kZV90ICosIHhmc19kaW5vZGVfdCAqKiwgc3RydWN0IHhmc19idWYgKiosCisJCQkgIHhmc19kYWRkcl90KTsKK2ludAkJeGZzX2lyZWFkKHN0cnVjdCB4ZnNfbW91bnQgKiwgc3RydWN0IHhmc190cmFucyAqLCB4ZnNfaW5vX3QsCisJCQkgIHhmc19pbm9kZV90ICoqLCB4ZnNfZGFkZHJfdCk7CitpbnQJCXhmc19pcmVhZF9leHRlbnRzKHN0cnVjdCB4ZnNfdHJhbnMgKiwgeGZzX2lub2RlX3QgKiwgaW50KTsKK2ludAkJeGZzX2lhbGxvYyhzdHJ1Y3QgeGZzX3RyYW5zICosIHhmc19pbm9kZV90ICosIG1vZGVfdCwgbmxpbmtfdCwKKwkJCSAgIHhmc19kZXZfdCwgc3RydWN0IGNyZWQgKiwgeGZzX3ByaWRfdCwgaW50LAorCQkJICAgc3RydWN0IHhmc19idWYgKiosIGJvb2xlYW5fdCAqLCB4ZnNfaW5vZGVfdCAqKik7Cit2b2lkCQl4ZnNfeGxhdGVfZGlub2RlX2NvcmUoeGZzX2NhZGRyX3QsIHN0cnVjdCB4ZnNfZGlub2RlX2NvcmUgKiwKKwkJCQkJaW50KTsKK3VpbnQJCXhmc19pcDJ4ZmxhZ3Moc3RydWN0IHhmc19pbm9kZSAqKTsKK3VpbnQJCXhmc19kaWMyeGZsYWdzKHN0cnVjdCB4ZnNfZGlub2RlX2NvcmUgKik7CitpbnQJCXhmc19pZnJlZShzdHJ1Y3QgeGZzX3RyYW5zICosIHhmc19pbm9kZV90ICosCisJCQkgICBzdHJ1Y3QgeGZzX2JtYXBfZnJlZSAqKTsKK3ZvaWQJCXhmc19pdHJ1bmNhdGVfc3RhcnQoeGZzX2lub2RlX3QgKiwgdWludCwgeGZzX2ZzaXplX3QpOworaW50CQl4ZnNfaXRydW5jYXRlX2ZpbmlzaChzdHJ1Y3QgeGZzX3RyYW5zICoqLCB4ZnNfaW5vZGVfdCAqLAorCQkJCSAgICAgeGZzX2ZzaXplX3QsIGludCwgaW50KTsKK2ludAkJeGZzX2l1bmxpbmsoc3RydWN0IHhmc190cmFucyAqLCB4ZnNfaW5vZGVfdCAqKTsKK2ludAkJeGZzX2lncm93X3N0YXJ0KHhmc19pbm9kZV90ICosIHhmc19mc2l6ZV90LCBzdHJ1Y3QgY3JlZCAqKTsKK3ZvaWQJCXhmc19pZ3Jvd19maW5pc2goc3RydWN0IHhmc190cmFucyAqLCB4ZnNfaW5vZGVfdCAqLAorCQkJCSB4ZnNfZnNpemVfdCwgaW50KTsKKwordm9pZAkJeGZzX2lkZXN0cm95X2ZvcmsoeGZzX2lub2RlX3QgKiwgaW50KTsKK3ZvaWQJCXhmc19pZGVzdHJveSh4ZnNfaW5vZGVfdCAqKTsKK3ZvaWQJCXhmc19pZGF0YV9yZWFsbG9jKHhmc19pbm9kZV90ICosIGludCwgaW50KTsKK3ZvaWQJCXhmc19pZXh0cmFjdCh4ZnNfaW5vZGVfdCAqKTsKK3ZvaWQJCXhmc19pZXh0X3JlYWxsb2MoeGZzX2lub2RlX3QgKiwgaW50LCBpbnQpOwordm9pZAkJeGZzX2lyb290X3JlYWxsb2MoeGZzX2lub2RlX3QgKiwgaW50LCBpbnQpOwordm9pZAkJeGZzX2lwaW4oeGZzX2lub2RlX3QgKik7Cit2b2lkCQl4ZnNfaXVucGluKHhmc19pbm9kZV90ICopOworaW50CQl4ZnNfaWV4dGVudHNfY29weSh4ZnNfaW5vZGVfdCAqLCB4ZnNfYm1idF9yZWNfdCAqLCBpbnQpOworaW50CQl4ZnNfaWZsdXNoKHhmc19pbm9kZV90ICosIHVpbnQpOworaW50CQl4ZnNfaWZsdXNoX2FsbChzdHJ1Y3QgeGZzX21vdW50ICosIGludCk7CitpbnQJCXhmc19pYWNjZXNzKHhmc19pbm9kZV90ICosIG1vZGVfdCwgY3JlZF90ICopOwordWludAkJeGZzX2lyb3VuZHVwKHVpbnQpOwordm9pZAkJeGZzX2ljaGd0aW1lKHhmc19pbm9kZV90ICosIGludCk7Cit4ZnNfZnNpemVfdAl4ZnNfZmlsZV9sYXN0X2J5dGUoeGZzX2lub2RlX3QgKik7Cit2b2lkCQl4ZnNfbG9ja19pbm9kZXMoeGZzX2lub2RlX3QgKiosIGludCwgaW50LCB1aW50KTsKKworI2RlZmluZSB4ZnNfaXBpbmNvdW50KGlwKQkoKHVuc2lnbmVkIGludCkgYXRvbWljX3JlYWQoJmlwLT5pX3BpbmNvdW50KSkKKworI2lmZGVmIERFQlVHCit2b2lkCQl4ZnNfaXNpemVfY2hlY2soc3RydWN0IHhmc19tb3VudCAqLCB4ZnNfaW5vZGVfdCAqLCB4ZnNfZnNpemVfdCk7CisjZWxzZQkvKiBERUJVRyAqLworI2RlZmluZSB4ZnNfaXNpemVfY2hlY2sobXAsIGlwLCBpc2l6ZSkKKyNlbmRpZgkvKiBERUJVRyAqLworCisjaWYgZGVmaW5lZChERUJVRykKK3ZvaWQJCXhmc19pbm9icF9jaGVjayhzdHJ1Y3QgeGZzX21vdW50ICosIHN0cnVjdCB4ZnNfYnVmICopOworI2Vsc2UKKyNkZWZpbmUJeGZzX2lub2JwX2NoZWNrKG1wLCBicCkKKyNlbmRpZiAvKiBERUJVRyAqLworCitleHRlcm4gc3RydWN0IGttZW1fem9uZQkqeGZzX2NoYXNobGlzdF96b25lOworZXh0ZXJuIHN0cnVjdCBrbWVtX3pvbmUJKnhmc19pZm9ya196b25lOworZXh0ZXJuIHN0cnVjdCBrbWVtX3pvbmUJKnhmc19pbm9kZV96b25lOworZXh0ZXJuIHN0cnVjdCBrbWVtX3pvbmUJKnhmc19pbGlfem9uZTsKK2V4dGVybiBzdHJ1Y3Qgdm5vZGVvcHMJeGZzX3Zub2Rlb3BzOworCisjZW5kaWYJLyogX19LRVJORUxfXyAqLworCisjZW5kaWYJLyogX19YRlNfSU5PREVfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lub2RlX2l0ZW0uYyBiL2ZzL3hmcy94ZnNfaW5vZGVfaXRlbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2OGNiMTgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2lub2RlX2l0ZW0uYwpAQCAtMCwwICsxLDEwOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKy8qCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB4ZnNfaW5vZGVfbG9nX2l0ZW0uCisgKiBJdCBjb250YWlucyB0aGUgaXRlbSBvcGVyYXRpb25zIHVzZWQgdG8gbWFuaXB1bGF0ZSB0aGUgaW5vZGUgbG9nCisgKiBpdGVtcyBhcyB3ZWxsIGFzIHV0aWxpdHkgcm91dGluZXMgdXNlZCBieSB0aGUgaW5vZGUgc3BlY2lmaWMKKyAqIHRyYW5zYWN0aW9uIHJvdXRpbmVzLgorICovCisjaW5jbHVkZSAieGZzLmgiCisjaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc190eXBlcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19idWZfaXRlbS5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc190cmFuc19wcml2LmgiCisjaW5jbHVkZSAieGZzX2FnLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvYy5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZV9pdGVtLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX3J3LmgiCisKKwora21lbV96b25lX3QJKnhmc19pbGlfem9uZTsJCS8qIGlub2RlIGxvZyBpdGVtIHpvbmUgKi8KKworLyoKKyAqIFRoaXMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGlvdmVjcyBuZWVkZWQgdG8gbG9nIHRoZSBnaXZlbiBpbm9kZSBpdGVtLgorICoKKyAqIFdlIG5lZWQgb25lIGlvdmVjIGZvciB0aGUgaW5vZGUgbG9nIGZvcm1hdCBzdHJ1Y3R1cmUsIG9uZSBmb3IgdGhlCisgKiBpbm9kZSBjb3JlLCBhbmQgcG9zc2libHkgb25lIGZvciB0aGUgaW5vZGUgZGF0YS9leHRlbnRzL2ItdHJlZSByb290CisgKiBhbmQgb25lIGZvciB0aGUgaW5vZGUgYXR0cmlidXRlIGRhdGEvZXh0ZW50cy9iLXRyZWUgcm9vdC4KKyAqLworU1RBVElDIHVpbnQKK3hmc19pbm9kZV9pdGVtX3NpemUoCisJeGZzX2lub2RlX2xvZ19pdGVtX3QJKmlpcCkKK3sKKwl1aW50CQludmVjczsKKwl4ZnNfaW5vZGVfdAkqaXA7CisKKwlpcCA9IGlpcC0+aWxpX2lub2RlOworCW52ZWNzID0gMjsKKworCS8qCisJICogT25seSBsb2cgdGhlIGRhdGEvZXh0ZW50cy9iLXRyZWUgcm9vdCBpZiB0aGVyZSBpcyBzb21ldGhpbmcKKwkgKiBsZWZ0IHRvIGxvZy4KKwkgKi8KKwlpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyB8PSBYRlNfSUxPR19DT1JFOworCisJc3dpdGNoIChpcC0+aV9kLmRpX2Zvcm1hdCkgeworCWNhc2UgWEZTX0RJTk9ERV9GTVRfRVhURU5UUzoKKwkJaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJj0KKwkJCX4oWEZTX0lMT0dfRERBVEEgfCBYRlNfSUxPR19EQlJPT1QgfAorCQkJICBYRlNfSUxPR19ERVYgfCBYRlNfSUxPR19VVUlEKTsKKwkJaWYgKChpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmIFhGU19JTE9HX0RFWFQpICYmCisJCSAgICAoaXAtPmlfZC5kaV9uZXh0ZW50cyA+IDApICYmCisJCSAgICAoaXAtPmlfZGYuaWZfYnl0ZXMgPiAwKSkgeworCQkJQVNTRVJUKGlwLT5pX2RmLmlmX3UxLmlmX2V4dGVudHMgIT0gTlVMTCk7CisJCQludmVjcysrOworCQl9IGVsc2UgeworCQkJaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJj0gflhGU19JTE9HX0RFWFQ7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFhGU19ESU5PREVfRk1UX0JUUkVFOgorCQlBU1NFUlQoaXAtPmlfZGYuaWZfZXh0X21heCA9PQorCQkgICAgICAgWEZTX0lGT1JLX0RTSVpFKGlwKSAvICh1aW50KXNpemVvZih4ZnNfYm1idF9yZWNfdCkpOworCQlpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmPQorCQkJfihYRlNfSUxPR19EREFUQSB8IFhGU19JTE9HX0RFWFQgfAorCQkJICBYRlNfSUxPR19ERVYgfCBYRlNfSUxPR19VVUlEKTsKKwkJaWYgKChpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmIFhGU19JTE9HX0RCUk9PVCkgJiYKKwkJICAgIChpcC0+aV9kZi5pZl9icm9vdF9ieXRlcyA+IDApKSB7CisJCQlBU1NFUlQoaXAtPmlfZGYuaWZfYnJvb3QgIT0gTlVMTCk7CisJCQludmVjcysrOworCQl9IGVsc2UgeworCQkJQVNTRVJUKCEoaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJgorCQkJCSBYRlNfSUxPR19EQlJPT1QpKTsKKyNpZmRlZiBYRlNfVFJBTlNfREVCVUcKKwkJCWlmIChpaXAtPmlsaV9yb290X3NpemUgPiAwKSB7CisJCQkJQVNTRVJUKGlpcC0+aWxpX3Jvb3Rfc2l6ZSA9PQorCQkJCSAgICAgICBpcC0+aV9kZi5pZl9icm9vdF9ieXRlcyk7CisJCQkJQVNTRVJUKG1lbWNtcChpaXAtPmlsaV9vcmlnX3Jvb3QsCisJCQkJCSAgICBpcC0+aV9kZi5pZl9icm9vdCwKKwkJCQkJICAgIGlpcC0+aWxpX3Jvb3Rfc2l6ZSkgPT0gMCk7CisJCQl9IGVsc2UgeworCQkJCUFTU0VSVChpcC0+aV9kZi5pZl9icm9vdF9ieXRlcyA9PSAwKTsKKwkJCX0KKyNlbmRpZgorCQkJaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJj0gflhGU19JTE9HX0RCUk9PVDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgWEZTX0RJTk9ERV9GTVRfTE9DQUw6CisJCWlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICY9CisJCQl+KFhGU19JTE9HX0RFWFQgfCBYRlNfSUxPR19EQlJPT1QgfAorCQkJICBYRlNfSUxPR19ERVYgfCBYRlNfSUxPR19VVUlEKTsKKwkJaWYgKChpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmIFhGU19JTE9HX0REQVRBKSAmJgorCQkgICAgKGlwLT5pX2RmLmlmX2J5dGVzID4gMCkpIHsKKwkJCUFTU0VSVChpcC0+aV9kZi5pZl91MS5pZl9kYXRhICE9IE5VTEwpOworCQkJQVNTRVJUKGlwLT5pX2QuZGlfc2l6ZSA+IDApOworCQkJbnZlY3MrKzsKKwkJfSBlbHNlIHsKKwkJCWlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICY9IH5YRlNfSUxPR19EREFUQTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgWEZTX0RJTk9ERV9GTVRfREVWOgorCQlpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmPQorCQkJfihYRlNfSUxPR19EREFUQSB8IFhGU19JTE9HX0RCUk9PVCB8CisJCQkgIFhGU19JTE9HX0RFWFQgfCBYRlNfSUxPR19VVUlEKTsKKwkJYnJlYWs7CisKKwljYXNlIFhGU19ESU5PREVfRk1UX1VVSUQ6CisJCWlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICY9CisJCQl+KFhGU19JTE9HX0REQVRBIHwgWEZTX0lMT0dfREJST09UIHwKKwkJCSAgWEZTX0lMT0dfREVYVCB8IFhGU19JTE9HX0RFVik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQVNTRVJUKDApOworCQlicmVhazsKKwl9CisKKwkvKgorCSAqIElmIHRoZXJlIGFyZSBubyBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGZpbGUsCisJICogdGhlbiB0aGVyZSBjYW5ub3QgYmUgYW55dGhpbmcgbW9yZSB0byBsb2cuCisJICogQ2xlYXIgYWxsIGF0dHJpYnV0ZS1yZWxhdGVkIGxvZyBmbGFncy4KKwkgKi8KKwlpZiAoIVhGU19JRk9SS19RKGlwKSkgeworCQlpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmPQorCQkJfihYRlNfSUxPR19BREFUQSB8IFhGU19JTE9HX0FCUk9PVCB8IFhGU19JTE9HX0FFWFQpOworCQlyZXR1cm4gbnZlY3M7CisJfQorCisJLyoKKwkgKiBMb2cgYW55IG5lY2Vzc2FyeSBhdHRyaWJ1dGUgZGF0YS4KKwkgKi8KKwlzd2l0Y2ggKGlwLT5pX2QuZGlfYWZvcm1hdCkgeworCWNhc2UgWEZTX0RJTk9ERV9GTVRfRVhURU5UUzoKKwkJaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJj0KKwkJCX4oWEZTX0lMT0dfQURBVEEgfCBYRlNfSUxPR19BQlJPT1QpOworCQlpZiAoKGlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICYgWEZTX0lMT0dfQUVYVCkgJiYKKwkJICAgIChpcC0+aV9kLmRpX2FuZXh0ZW50cyA+IDApICYmCisJCSAgICAoaXAtPmlfYWZwLT5pZl9ieXRlcyA+IDApKSB7CisJCQlBU1NFUlQoaXAtPmlfYWZwLT5pZl91MS5pZl9leHRlbnRzICE9IE5VTEwpOworCQkJbnZlY3MrKzsKKwkJfSBlbHNlIHsKKwkJCWlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICY9IH5YRlNfSUxPR19BRVhUOworCQl9CisJCWJyZWFrOworCisJY2FzZSBYRlNfRElOT0RFX0ZNVF9CVFJFRToKKwkJaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJj0KKwkJCX4oWEZTX0lMT0dfQURBVEEgfCBYRlNfSUxPR19BRVhUKTsKKwkJaWYgKChpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmIFhGU19JTE9HX0FCUk9PVCkgJiYKKwkJICAgIChpcC0+aV9hZnAtPmlmX2Jyb290X2J5dGVzID4gMCkpIHsKKwkJCUFTU0VSVChpcC0+aV9hZnAtPmlmX2Jyb290ICE9IE5VTEwpOworCQkJbnZlY3MrKzsKKwkJfSBlbHNlIHsKKwkJCWlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICY9IH5YRlNfSUxPR19BQlJPT1Q7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFhGU19ESU5PREVfRk1UX0xPQ0FMOgorCQlpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmPQorCQkJfihYRlNfSUxPR19BRVhUIHwgWEZTX0lMT0dfQUJST09UKTsKKwkJaWYgKChpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmIFhGU19JTE9HX0FEQVRBKSAmJgorCQkgICAgKGlwLT5pX2FmcC0+aWZfYnl0ZXMgPiAwKSkgeworCQkJQVNTRVJUKGlwLT5pX2FmcC0+aWZfdTEuaWZfZGF0YSAhPSBOVUxMKTsKKwkJCW52ZWNzKys7CisJCX0gZWxzZSB7CisJCQlpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmPSB+WEZTX0lMT0dfQURBVEE7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlBU1NFUlQoMCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiBudmVjczsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHRvIGZpbGwgaW4gdGhlIHZlY3RvciBvZiBsb2cgaW92ZWNzIGZvciB0aGUKKyAqIGdpdmVuIGlub2RlIGxvZyBpdGVtLiAgSXQgZmlsbHMgdGhlIGZpcnN0IGl0ZW0gd2l0aCBhbiBpbm9kZQorICogbG9nIGZvcm1hdCBzdHJ1Y3R1cmUsIHRoZSBzZWNvbmQgd2l0aCB0aGUgb24tZGlzayBpbm9kZSBzdHJ1Y3R1cmUsCisgKiBhbmQgYSBwb3NzaWJsZSB0aGlyZCBhbmQvb3IgZm91cnRoIHdpdGggdGhlIGlub2RlIGRhdGEvZXh0ZW50cy9iLXRyZWUKKyAqIHJvb3QgYW5kIGlub2RlIGF0dHJpYnV0ZXMgZGF0YS9leHRlbnRzL2ItdHJlZSByb290LgorICovCitTVEFUSUMgdm9pZAoreGZzX2lub2RlX2l0ZW1fZm9ybWF0KAorCXhmc19pbm9kZV9sb2dfaXRlbV90CSppaXAsCisJeGZzX2xvZ19pb3ZlY190CQkqbG9nX3ZlY3RvcikKK3sKKwl1aW50CQkJbnZlY3M7CisJeGZzX2xvZ19pb3ZlY190CQkqdmVjcDsKKwl4ZnNfaW5vZGVfdAkJKmlwOworCXNpemVfdAkJCWRhdGFfYnl0ZXM7CisJeGZzX2JtYnRfcmVjX3QJCSpleHRfYnVmZmVyOworCWludAkJCW5yZWNzOworCXhmc19tb3VudF90CQkqbXA7CisKKwlpcCA9IGlpcC0+aWxpX2lub2RlOworCXZlY3AgPSBsb2dfdmVjdG9yOworCisJdmVjcC0+aV9hZGRyID0gKHhmc19jYWRkcl90KSZpaXAtPmlsaV9mb3JtYXQ7CisJdmVjcC0+aV9sZW4gID0gc2l6ZW9mKHhmc19pbm9kZV9sb2dfZm9ybWF0X3QpOworCXZlY3ArKzsKKwludmVjcwkgICAgID0gMTsKKworCS8qCisJICogQ2xlYXIgaV91cGRhdGVfY29yZSBpZiB0aGUgdGltZXN0YW1wcyAob3IgYW55IG90aGVyCisJICogbm9uLXRyYW5zYWN0aW9uYWwgbW9kaWZpY2F0aW9uKSBuZWVkIGZsdXNoaW5nL2xvZ2dpbmcKKwkgKiBhbmQgd2UncmUgYWJvdXQgdG8gbG9nIHRoZW0gd2l0aCB0aGUgcmVzdCBvZiB0aGUgY29yZS4KKwkgKgorCSAqIFRoaXMgaXMgdGhlIHNhbWUgbG9naWMgYXMgeGZzX2lmbHVzaCgpIGJ1dCB0aGlzIGNvZGUgY2FuJ3QKKwkgKiBydW4gYXQgdGhlIHNhbWUgdGltZSBhcyB4ZnNfaWZsdXNoIGJlY2F1c2Ugd2UncmUgaW4gY29tbWl0CisJICogcHJvY2Vzc2luZyBoZXJlIGFuZCBzbyB3ZSBoYXZlIHRoZSBpbm9kZSBsb2NrIGhlbGQgaW4KKwkgKiBleGNsdXNpdmUgbW9kZS4gIEFsdGhvdWdoIGl0IGRvZXNuJ3QgcmVhbGx5IG1hdHRlcgorCSAqIGZvciB0aGUgdGltZXN0YW1wcyBpZiBib3RoIHJvdXRpbmVzIHdlcmUgdG8gZ3JhYiB0aGUKKwkgKiB0aW1lc3RhbXBzIG9yIG5vdC4gIFRoYXQgd291bGQgYmUgb2suCisJICoKKwkgKiBXZSBjbGVhciBpX3VwZGF0ZV9jb3JlIGJlZm9yZSBjb3B5aW5nIG91dCB0aGUgZGF0YS4KKwkgKiBUaGlzIGlzIGZvciBjb29yZGluYXRpb24gd2l0aCBvdXIgdGltZXN0YW1wIHVwZGF0ZXMKKwkgKiB0aGF0IGRvbid0IGhvbGQgdGhlIGlub2RlIGxvY2suIFRoZXkgd2lsbCBhbHdheXMKKwkgKiB1cGRhdGUgdGhlIHRpbWVzdGFtcHMgQkVGT1JFIHNldHRpbmcgaV91cGRhdGVfY29yZSwKKwkgKiBzbyBpZiB3ZSBjbGVhciBpX3VwZGF0ZV9jb3JlIGFmdGVyIHRoZXkgc2V0IGl0IHdlCisJICogYXJlIGd1YXJhbnRlZWQgdG8gc2VlIHRoZWlyIHVwZGF0ZXMgdG8gdGhlIHRpbWVzdGFtcHMKKwkgKiBlaXRoZXIgaGVyZS4gIExpa2V3aXNlLCBpZiB0aGV5IHNldCBpdCBhZnRlciB3ZSBjbGVhciBpdAorCSAqIGhlcmUsIHdlJ2xsIHNlZSBpdCBlaXRoZXIgb24gdGhlIG5leHQgY29tbWl0IG9mIHRoaXMKKwkgKiBpbm9kZSBvciB0aGUgbmV4dCB0aW1lIHRoZSBpbm9kZSBnZXRzIGZsdXNoZWQgdmlhCisJICogeGZzX2lmbHVzaCgpLiAgVGhpcyBkZXBlbmRzIG9uIHN0cm9uZ2x5IG9yZGVyZWQgbWVtb3J5CisJICogc2VtYW50aWNzLCBidXQgd2UgaGF2ZSB0aGF0LiAgV2UgdXNlIHRoZSBTWU5DSFJPTklaRQorCSAqIG1hY3JvIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBjb21waWxlciBkb2VzIG5vdCByZW9yZGVyCisJICogdGhlIGlfdXBkYXRlX2NvcmUgYWNjZXNzIGJlbG93IHRoZSBkYXRhIGNvcHkgYmVsb3cuCisJICovCisJaWYgKGlwLT5pX3VwZGF0ZV9jb3JlKSAgeworCQlpcC0+aV91cGRhdGVfY29yZSA9IDA7CisJCVNZTkNIUk9OSVpFKCk7CisJfQorCisJLyoKKwkgKiBXZSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHJlLW9yZGVyaW5nIGhlcmUgYmVjYXVzZQorCSAqIHRoZSB1cGRhdGVfc2l6ZSBmaWVsZCBpcyBwcm90ZWN0ZWQgYnkgdGhlIGlub2RlIGxvY2sKKwkgKiBhbmQgd2UgaGF2ZSB0aGF0IGhlbGQgaW4gZXhjbHVzaXZlIG1vZGUuCisJICovCisJaWYgKGlwLT5pX3VwZGF0ZV9zaXplKQorCQlpcC0+aV91cGRhdGVfc2l6ZSA9IDA7CisKKwl2ZWNwLT5pX2FkZHIgPSAoeGZzX2NhZGRyX3QpJmlwLT5pX2Q7CisJdmVjcC0+aV9sZW4gID0gc2l6ZW9mKHhmc19kaW5vZGVfY29yZV90KTsKKwl2ZWNwKys7CisJbnZlY3MrKzsKKwlpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyB8PSBYRlNfSUxPR19DT1JFOworCisJLyoKKwkgKiBJZiB0aGlzIGlzIHJlYWxseSBhbiBvbGQgZm9ybWF0IGlub2RlLCB0aGVuIHdlIG5lZWQgdG8KKwkgKiBsb2cgaXQgYXMgc3VjaC4gIFRoaXMgbWVhbnMgdGhhdCB3ZSBoYXZlIHRvIGNvcHkgdGhlIGxpbmsKKwkgKiBjb3VudCBmcm9tIHRoZSBuZXcgZmllbGQgdG8gdGhlIG9sZC4gIFdlIGRvbid0IGhhdmUgdG8gd29ycnkKKwkgKiBhYm91dCB0aGUgbmV3IGZpZWxkcywgYmVjYXVzZSBub3RoaW5nIHRydXN0cyB0aGVtIGFzIGxvbmcgYXMKKwkgKiB0aGUgb2xkIGlub2RlIHZlcnNpb24gbnVtYmVyIGlzIHRoZXJlLiAgSWYgdGhlIHN1cGVyYmxvY2sgYWxyZWFkeQorCSAqIGhhcyBhIG5ldyB2ZXJzaW9uIG51bWJlciwgdGhlbiB3ZSBkb24ndCBib3RoZXIgY29udmVydGluZyBiYWNrLgorCSAqLworCW1wID0gaXAtPmlfbW91bnQ7CisJQVNTRVJUKGlwLT5pX2QuZGlfdmVyc2lvbiA9PSBYRlNfRElOT0RFX1ZFUlNJT05fMSB8fAorCSAgICAgICBYRlNfU0JfVkVSU0lPTl9IQVNOTElOSygmbXAtPm1fc2IpKTsKKwlpZiAoaXAtPmlfZC5kaV92ZXJzaW9uID09IFhGU19ESU5PREVfVkVSU0lPTl8xKSB7CisJCWlmICghWEZTX1NCX1ZFUlNJT05fSEFTTkxJTksoJm1wLT5tX3NiKSkgeworCQkJLyoKKwkJCSAqIENvbnZlcnQgaXQgYmFjay4KKwkJCSAqLworCQkJQVNTRVJUKGlwLT5pX2QuZGlfbmxpbmsgPD0gWEZTX01BWExJTktfMSk7CisJCQlpcC0+aV9kLmRpX29ubGluayA9IGlwLT5pX2QuZGlfbmxpbms7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogVGhlIHN1cGVyYmxvY2sgdmVyc2lvbiBoYXMgYWxyZWFkeSBiZWVuIGJ1bXBlZCwKKwkJCSAqIHNvIGp1c3QgbWFrZSB0aGUgY29udmVyc2lvbiB0byB0aGUgbmV3IGlub2RlCisJCQkgKiBmb3JtYXQgcGVybWFuZW50LgorCQkJICovCisJCQlpcC0+aV9kLmRpX3ZlcnNpb24gPSBYRlNfRElOT0RFX1ZFUlNJT05fMjsKKwkJCWlwLT5pX2QuZGlfb25saW5rID0gMDsKKwkJCW1lbXNldCgmKGlwLT5pX2QuZGlfcGFkWzBdKSwgMCwgc2l6ZW9mKGlwLT5pX2QuZGlfcGFkKSk7CisJCX0KKwl9CisKKwlzd2l0Y2ggKGlwLT5pX2QuZGlfZm9ybWF0KSB7CisJY2FzZSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTOgorCQlBU1NFUlQoIShpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmCisJCQkgKFhGU19JTE9HX0REQVRBIHwgWEZTX0lMT0dfREJST09UIHwKKwkJCSAgWEZTX0lMT0dfREVWIHwgWEZTX0lMT0dfVVVJRCkpKTsKKwkJaWYgKGlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICYgWEZTX0lMT0dfREVYVCkgeworCQkJQVNTRVJUKGlwLT5pX2RmLmlmX2J5dGVzID4gMCk7CisJCQlBU1NFUlQoaXAtPmlfZGYuaWZfdTEuaWZfZXh0ZW50cyAhPSBOVUxMKTsKKwkJCUFTU0VSVChpcC0+aV9kLmRpX25leHRlbnRzID4gMCk7CisJCQlBU1NFUlQoaWlwLT5pbGlfZXh0ZW50c19idWYgPT0gTlVMTCk7CisJCQlucmVjcyA9IGlwLT5pX2RmLmlmX2J5dGVzIC8KKwkJCQkodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpOworCQkJQVNTRVJUKG5yZWNzID4gMCk7CisjaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorCQkJaWYgKG5yZWNzID09IGlwLT5pX2QuZGlfbmV4dGVudHMpIHsKKwkJCQkvKgorCQkJCSAqIFRoZXJlIGFyZSBubyBkZWxheWVkIGFsbG9jYXRpb24KKwkJCQkgKiBleHRlbnRzLCBzbyBqdXN0IHBvaW50IHRvIHRoZQorCQkJCSAqIHJlYWwgZXh0ZW50cyBhcnJheS4KKwkJCQkgKi8KKwkJCQl2ZWNwLT5pX2FkZHIgPQorCQkJCQkoY2hhciAqKShpcC0+aV9kZi5pZl91MS5pZl9leHRlbnRzKTsKKwkJCQl2ZWNwLT5pX2xlbiA9IGlwLT5pX2RmLmlmX2J5dGVzOworCQkJfSBlbHNlCisjZW5kaWYKKwkJCXsKKwkJCQkvKgorCQkJCSAqIFRoZXJlIGFyZSBkZWxheWVkIGFsbG9jYXRpb24gZXh0ZW50cworCQkJCSAqIGluIHRoZSBpbm9kZSwgb3Igd2UgbmVlZCB0byBjb252ZXJ0CisJCQkJICogdGhlIGV4dGVudHMgdG8gb24gZGlzayBmb3JtYXQuCisJCQkJICogVXNlIHhmc19pZXh0ZW50c19jb3B5KCkKKwkJCQkgKiB0byBjb3B5IG9ubHkgdGhlIHJlYWwgZXh0ZW50cyBpbnRvCisJCQkJICogYSBzZXBhcmF0ZSBidWZmZXIuICBXZSdsbCBmcmVlIHRoZQorCQkJCSAqIGJ1ZmZlciBpbiB0aGUgdW5sb2NrIHJvdXRpbmUuCisJCQkJICovCisJCQkJZXh0X2J1ZmZlciA9IGttZW1fYWxsb2MoaXAtPmlfZGYuaWZfYnl0ZXMsCisJCQkJCUtNX1NMRUVQKTsKKwkJCQlpaXAtPmlsaV9leHRlbnRzX2J1ZiA9IGV4dF9idWZmZXI7CisJCQkJdmVjcC0+aV9hZGRyID0gKHhmc19jYWRkcl90KWV4dF9idWZmZXI7CisJCQkJdmVjcC0+aV9sZW4gPSB4ZnNfaWV4dGVudHNfY29weShpcCwgZXh0X2J1ZmZlciwKKwkJCQkJCVhGU19EQVRBX0ZPUkspOworCQkJfQorCQkJQVNTRVJUKHZlY3AtPmlfbGVuIDw9IGlwLT5pX2RmLmlmX2J5dGVzKTsKKwkJCWlpcC0+aWxpX2Zvcm1hdC5pbGZfZHNpemUgPSB2ZWNwLT5pX2xlbjsKKwkJCXZlY3ArKzsKKwkJCW52ZWNzKys7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFhGU19ESU5PREVfRk1UX0JUUkVFOgorCQlBU1NFUlQoIShpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmCisJCQkgKFhGU19JTE9HX0REQVRBIHwgWEZTX0lMT0dfREVYVCB8CisJCQkgIFhGU19JTE9HX0RFViB8IFhGU19JTE9HX1VVSUQpKSk7CisJCWlmIChpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmIFhGU19JTE9HX0RCUk9PVCkgeworCQkJQVNTRVJUKGlwLT5pX2RmLmlmX2Jyb290X2J5dGVzID4gMCk7CisJCQlBU1NFUlQoaXAtPmlfZGYuaWZfYnJvb3QgIT0gTlVMTCk7CisJCQl2ZWNwLT5pX2FkZHIgPSAoeGZzX2NhZGRyX3QpaXAtPmlfZGYuaWZfYnJvb3Q7CisJCQl2ZWNwLT5pX2xlbiA9IGlwLT5pX2RmLmlmX2Jyb290X2J5dGVzOworCQkJdmVjcCsrOworCQkJbnZlY3MrKzsKKwkJCWlpcC0+aWxpX2Zvcm1hdC5pbGZfZHNpemUgPSBpcC0+aV9kZi5pZl9icm9vdF9ieXRlczsKKwkJfQorCQlicmVhazsKKworCWNhc2UgWEZTX0RJTk9ERV9GTVRfTE9DQUw6CisJCUFTU0VSVCghKGlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICYKKwkJCSAoWEZTX0lMT0dfREJST09UIHwgWEZTX0lMT0dfREVYVCB8CisJCQkgIFhGU19JTE9HX0RFViB8IFhGU19JTE9HX1VVSUQpKSk7CisJCWlmIChpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmIFhGU19JTE9HX0REQVRBKSB7CisJCQlBU1NFUlQoaXAtPmlfZGYuaWZfYnl0ZXMgPiAwKTsKKwkJCUFTU0VSVChpcC0+aV9kZi5pZl91MS5pZl9kYXRhICE9IE5VTEwpOworCQkJQVNTRVJUKGlwLT5pX2QuZGlfc2l6ZSA+IDApOworCisJCQl2ZWNwLT5pX2FkZHIgPSAoeGZzX2NhZGRyX3QpaXAtPmlfZGYuaWZfdTEuaWZfZGF0YTsKKwkJCS8qCisJCQkgKiBSb3VuZCBpX2J5dGVzIHVwIHRvIGEgd29yZCBib3VuZGFyeS4KKwkJCSAqIFRoZSB1bmRlcmx5aW5nIG1lbW9yeSBpcyBndWFyYW50ZWVkIHRvCisJCQkgKiB0byBiZSB0aGVyZSBieSB4ZnNfaWRhdGFfcmVhbGxvYygpLgorCQkJICovCisJCQlkYXRhX2J5dGVzID0gcm91bmR1cChpcC0+aV9kZi5pZl9ieXRlcywgNCk7CisJCQlBU1NFUlQoKGlwLT5pX2RmLmlmX3JlYWxfYnl0ZXMgPT0gMCkgfHwKKwkJCSAgICAgICAoaXAtPmlfZGYuaWZfcmVhbF9ieXRlcyA9PSBkYXRhX2J5dGVzKSk7CisJCQl2ZWNwLT5pX2xlbiA9IChpbnQpZGF0YV9ieXRlczsKKwkJCXZlY3ArKzsKKwkJCW52ZWNzKys7CisJCQlpaXAtPmlsaV9mb3JtYXQuaWxmX2RzaXplID0gKHVuc2lnbmVkKWRhdGFfYnl0ZXM7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFhGU19ESU5PREVfRk1UX0RFVjoKKwkJQVNTRVJUKCEoaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJgorCQkJIChYRlNfSUxPR19EQlJPT1QgfCBYRlNfSUxPR19ERVhUIHwKKwkJCSAgWEZTX0lMT0dfRERBVEEgfCBYRlNfSUxPR19VVUlEKSkpOworCQlpZiAoaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJiBYRlNfSUxPR19ERVYpIHsKKwkJCWlpcC0+aWxpX2Zvcm1hdC5pbGZfdS5pbGZ1X3JkZXYgPQorCQkJCWlwLT5pX2RmLmlmX3UyLmlmX3JkZXY7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFhGU19ESU5PREVfRk1UX1VVSUQ6CisJCUFTU0VSVCghKGlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICYKKwkJCSAoWEZTX0lMT0dfREJST09UIHwgWEZTX0lMT0dfREVYVCB8CisJCQkgIFhGU19JTE9HX0REQVRBIHwgWEZTX0lMT0dfREVWKSkpOworCQlpZiAoaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJiBYRlNfSUxPR19VVUlEKSB7CisJCQlpaXAtPmlsaV9mb3JtYXQuaWxmX3UuaWxmdV91dWlkID0KKwkJCQlpcC0+aV9kZi5pZl91Mi5pZl91dWlkOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQVNTRVJUKDApOworCQlicmVhazsKKwl9CisKKwkvKgorCSAqIElmIHRoZXJlIGFyZSBubyBhdHRyaWJ1dGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZSwKKwkgKiB0aGVuIHdlJ3JlIGRvbmUuCisJICogQXNzZXJ0IHRoYXQgbm8gYXR0cmlidXRlLXJlbGF0ZWQgbG9nIGZsYWdzIGFyZSBzZXQuCisJICovCisJaWYgKCFYRlNfSUZPUktfUShpcCkpIHsKKwkJQVNTRVJUKG52ZWNzID09IGlpcC0+aWxpX2l0ZW0ubGlfZGVzYy0+bGlkX3NpemUpOworCQlpaXAtPmlsaV9mb3JtYXQuaWxmX3NpemUgPSBudmVjczsKKwkJQVNTRVJUKCEoaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJgorCQkJIChYRlNfSUxPR19BREFUQSB8IFhGU19JTE9HX0FCUk9PVCB8IFhGU19JTE9HX0FFWFQpKSk7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKGlwLT5pX2QuZGlfYWZvcm1hdCkgeworCWNhc2UgWEZTX0RJTk9ERV9GTVRfRVhURU5UUzoKKwkJQVNTRVJUKCEoaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJgorCQkJIChYRlNfSUxPR19BREFUQSB8IFhGU19JTE9HX0FCUk9PVCkpKTsKKwkJaWYgKGlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICYgWEZTX0lMT0dfQUVYVCkgeworCQkJQVNTRVJUKGlwLT5pX2FmcC0+aWZfYnl0ZXMgPiAwKTsKKwkJCUFTU0VSVChpcC0+aV9hZnAtPmlmX3UxLmlmX2V4dGVudHMgIT0gTlVMTCk7CisJCQlBU1NFUlQoaXAtPmlfZC5kaV9hbmV4dGVudHMgPiAwKTsKKyNpZmRlZiBERUJVRworCQkJbnJlY3MgPSBpcC0+aV9hZnAtPmlmX2J5dGVzIC8KKwkJCQkodWludClzaXplb2YoeGZzX2JtYnRfcmVjX3QpOworI2VuZGlmCisJCQlBU1NFUlQobnJlY3MgPiAwKTsKKwkJCUFTU0VSVChucmVjcyA9PSBpcC0+aV9kLmRpX2FuZXh0ZW50cyk7CisjaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorCQkJLyoKKwkJCSAqIFRoZXJlIGFyZSBub3QgZGVsYXllZCBhbGxvY2F0aW9uIGV4dGVudHMKKwkJCSAqIGZvciBhdHRyaWJ1dGVzLCBzbyBqdXN0IHBvaW50IGF0IHRoZSBhcnJheS4KKwkJCSAqLworCQkJdmVjcC0+aV9hZGRyID0gKGNoYXIgKikoaXAtPmlfYWZwLT5pZl91MS5pZl9leHRlbnRzKTsKKwkJCXZlY3AtPmlfbGVuID0gaXAtPmlfYWZwLT5pZl9ieXRlczsKKyNlbHNlCisJCQlBU1NFUlQoaWlwLT5pbGlfYWV4dGVudHNfYnVmID09IE5VTEwpOworCQkJLyoKKwkJCSAqIE5lZWQgdG8gZW5kaWFuIGZsaXAgYmVmb3JlIGxvZ2dpbmcKKwkJCSAqLworCQkJZXh0X2J1ZmZlciA9IGttZW1fYWxsb2MoaXAtPmlfYWZwLT5pZl9ieXRlcywKKwkJCQlLTV9TTEVFUCk7CisJCQlpaXAtPmlsaV9hZXh0ZW50c19idWYgPSBleHRfYnVmZmVyOworCQkJdmVjcC0+aV9hZGRyID0gKHhmc19jYWRkcl90KWV4dF9idWZmZXI7CisJCQl2ZWNwLT5pX2xlbiA9IHhmc19pZXh0ZW50c19jb3B5KGlwLCBleHRfYnVmZmVyLAorCQkJCQlYRlNfQVRUUl9GT1JLKTsKKyNlbmRpZgorCQkJaWlwLT5pbGlfZm9ybWF0LmlsZl9hc2l6ZSA9IHZlY3AtPmlfbGVuOworCQkJdmVjcCsrOworCQkJbnZlY3MrKzsKKwkJfQorCQlicmVhazsKKworCWNhc2UgWEZTX0RJTk9ERV9GTVRfQlRSRUU6CisJCUFTU0VSVCghKGlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICYKKwkJCSAoWEZTX0lMT0dfQURBVEEgfCBYRlNfSUxPR19BRVhUKSkpOworCQlpZiAoaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJiBYRlNfSUxPR19BQlJPT1QpIHsKKwkJCUFTU0VSVChpcC0+aV9hZnAtPmlmX2Jyb290X2J5dGVzID4gMCk7CisJCQlBU1NFUlQoaXAtPmlfYWZwLT5pZl9icm9vdCAhPSBOVUxMKTsKKwkJCXZlY3AtPmlfYWRkciA9ICh4ZnNfY2FkZHJfdClpcC0+aV9hZnAtPmlmX2Jyb290OworCQkJdmVjcC0+aV9sZW4gPSBpcC0+aV9hZnAtPmlmX2Jyb290X2J5dGVzOworCQkJdmVjcCsrOworCQkJbnZlY3MrKzsKKwkJCWlpcC0+aWxpX2Zvcm1hdC5pbGZfYXNpemUgPSBpcC0+aV9hZnAtPmlmX2Jyb290X2J5dGVzOworCQl9CisJCWJyZWFrOworCisJY2FzZSBYRlNfRElOT0RFX0ZNVF9MT0NBTDoKKwkJQVNTRVJUKCEoaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJgorCQkJIChYRlNfSUxPR19BQlJPT1QgfCBYRlNfSUxPR19BRVhUKSkpOworCQlpZiAoaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgJiBYRlNfSUxPR19BREFUQSkgeworCQkJQVNTRVJUKGlwLT5pX2FmcC0+aWZfYnl0ZXMgPiAwKTsKKwkJCUFTU0VSVChpcC0+aV9hZnAtPmlmX3UxLmlmX2RhdGEgIT0gTlVMTCk7CisKKwkJCXZlY3AtPmlfYWRkciA9ICh4ZnNfY2FkZHJfdClpcC0+aV9hZnAtPmlmX3UxLmlmX2RhdGE7CisJCQkvKgorCQkJICogUm91bmQgaV9ieXRlcyB1cCB0byBhIHdvcmQgYm91bmRhcnkuCisJCQkgKiBUaGUgdW5kZXJseWluZyBtZW1vcnkgaXMgZ3VhcmFudGVlZCB0bworCQkJICogdG8gYmUgdGhlcmUgYnkgeGZzX2lkYXRhX3JlYWxsb2MoKS4KKwkJCSAqLworCQkJZGF0YV9ieXRlcyA9IHJvdW5kdXAoaXAtPmlfYWZwLT5pZl9ieXRlcywgNCk7CisJCQlBU1NFUlQoKGlwLT5pX2FmcC0+aWZfcmVhbF9ieXRlcyA9PSAwKSB8fAorCQkJICAgICAgIChpcC0+aV9hZnAtPmlmX3JlYWxfYnl0ZXMgPT0gZGF0YV9ieXRlcykpOworCQkJdmVjcC0+aV9sZW4gPSAoaW50KWRhdGFfYnl0ZXM7CisJCQl2ZWNwKys7CisJCQludmVjcysrOworCQkJaWlwLT5pbGlfZm9ybWF0LmlsZl9hc2l6ZSA9ICh1bnNpZ25lZClkYXRhX2J5dGVzOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQVNTRVJUKDApOworCQlicmVhazsKKwl9CisKKwlBU1NFUlQobnZlY3MgPT0gaWlwLT5pbGlfaXRlbS5saV9kZXNjLT5saWRfc2l6ZSk7CisJaWlwLT5pbGlfZm9ybWF0LmlsZl9zaXplID0gbnZlY3M7Cit9CisKKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHRvIHBpbiB0aGUgaW5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbm9kZSBsb2cKKyAqIGl0ZW0gaW4gbWVtb3J5IHNvIGl0IGNhbm5vdCBiZSB3cml0dGVuIG91dC4gIERvIHRoaXMgYnkgY2FsbGluZworICogeGZzX2lwaW4oKSB0byBidW1wIHRoZSBwaW4gY291bnQgaW4gdGhlIGlub2RlIHdoaWxlIGhvbGRpbmcgdGhlCisgKiBpbm9kZSBwaW4gbG9jay4KKyAqLworU1RBVElDIHZvaWQKK3hmc19pbm9kZV9pdGVtX3BpbigKKwl4ZnNfaW5vZGVfbG9nX2l0ZW1fdAkqaWlwKQoreworCUFTU0VSVChpc21ybG9ja2VkKCYoaWlwLT5pbGlfaW5vZGUtPmlfbG9jayksIE1SX1VQREFURSkpOworCXhmc19pcGluKGlpcC0+aWxpX2lub2RlKTsKK30KKworCisvKgorICogVGhpcyBpcyBjYWxsZWQgdG8gdW5waW4gdGhlIGlub2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5vZGUgbG9nCisgKiBpdGVtIHdoaWNoIHdhcyBwcmV2aW91c2x5IHBpbm5lZCB3aXRoIGEgY2FsbCB0byB4ZnNfaW5vZGVfaXRlbV9waW4oKS4KKyAqIEp1c3QgY2FsbCB4ZnNfaXVucGluKCkgb24gdGhlIGlub2RlIHRvIGRvIHRoaXMuCisgKi8KKy8qIEFSR1NVU0VEICovCitTVEFUSUMgdm9pZAoreGZzX2lub2RlX2l0ZW1fdW5waW4oCisJeGZzX2lub2RlX2xvZ19pdGVtX3QJKmlpcCwKKwlpbnQJCQlzdGFsZSkKK3sKKwl4ZnNfaXVucGluKGlpcC0+aWxpX2lub2RlKTsKK30KKworLyogQVJHU1VTRUQgKi8KK1NUQVRJQyB2b2lkCit4ZnNfaW5vZGVfaXRlbV91bnBpbl9yZW1vdmUoCisJeGZzX2lub2RlX2xvZ19pdGVtX3QJKmlpcCwKKwl4ZnNfdHJhbnNfdAkJKnRwKQoreworCXhmc19pdW5waW4oaWlwLT5pbGlfaW5vZGUpOworfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgdG8gYXR0ZW1wdCB0byBsb2NrIHRoZSBpbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhpcworICogaW5vZGUgbG9nIGl0ZW0sIGluIHByZXBhcmF0aW9uIGZvciB0aGUgcHVzaCByb3V0aW5lIHdoaWNoIGRvZXMgdGhlIGFjdHVhbAorICogaWZsdXNoLiAgRG9uJ3Qgc2xlZXAgb24gdGhlIGlub2RlIGxvY2sgb3IgdGhlIGZsdXNoIGxvY2suCisgKgorICogSWYgdGhlIGZsdXNoIGxvY2sgaXMgYWxyZWFkeSBoZWxkLCBpbmRpY2F0aW5nIHRoYXQgdGhlIGlub2RlIGhhcworICogYmVlbiBvciBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBmbHVzaGVkLCB0aGVuIChpZGVhbGx5KSB3ZSdkIGxpa2UgdG8KKyAqIHNlZSBpZiB0aGUgaW5vZGUncyBidWZmZXIgaXMgc3RpbGwgaW5jb3JlLCBhbmQgaWYgc28gZ2l2ZSBpdCBhIG51ZGdlLgorICogV2UgZGVsYXkgZG9pbmcgc28gdW50aWwgdGhlIHB1c2hidWYgcm91dGluZSwgdGhvdWdoLCB0byBhdm9pZCBob2xkaW5nCisgKiB0aGUgQUlMIGxvY2sgYWNyb3NzIGEgY2FsbCB0byB0aGUgYmxhY2tob2xlIHdoaWNoIGlzIHRoZSBidWZmZXJjYWNoZS4KKyAqIEFsc28gd2UgZG9uJ3Qgd2FudCB0byBzbGVlcCBpbiBhbnkgZGV2aWNlIHN0cmF0ZWd5IHJvdXRpbmVzLCB3aGljaCBjYW4gaGFwcGVuCisgKiBpZiB3ZSBkbyB0aGUgc3Vic2VxdWVudCBiYXdyaXRlIGluIGhlcmUuCisgKi8KK1NUQVRJQyB1aW50Cit4ZnNfaW5vZGVfaXRlbV90cnlsb2NrKAorCXhmc19pbm9kZV9sb2dfaXRlbV90CSppaXApCit7CisJcmVnaXN0ZXIgeGZzX2lub2RlX3QJKmlwOworCisJaXAgPSBpaXAtPmlsaV9pbm9kZTsKKworCWlmICh4ZnNfaXBpbmNvdW50KGlwKSA+IDApIHsKKwkJcmV0dXJuIFhGU19JVEVNX1BJTk5FRDsKKwl9CisKKwlpZiAoIXhmc19pbG9ja19ub3dhaXQoaXAsIFhGU19JTE9DS19TSEFSRUQpKSB7CisJCXJldHVybiBYRlNfSVRFTV9MT0NLRUQ7CisJfQorCisJaWYgKCF4ZnNfaWZsb2NrX25vd2FpdChpcCkpIHsKKwkJLyoKKwkJICogSWYgc29tZW9uZSBlbHNlIGlzbid0IGFscmVhZHkgdHJ5aW5nIHRvIHB1c2ggdGhlIGlub2RlCisJCSAqIGJ1ZmZlciwgd2UgZ2V0IHRvIGRvIGl0LgorCQkgKi8KKwkJaWYgKGlpcC0+aWxpX3B1c2hidWZfZmxhZyA9PSAwKSB7CisJCQlpaXAtPmlsaV9wdXNoYnVmX2ZsYWcgPSAxOworI2lmZGVmIERFQlVHCisJCQlpaXAtPmlsaV9wdXNoX293bmVyID0gZ2V0X3RocmVhZF9pZCgpOworI2VuZGlmCisJCQkvKgorCQkJICogSW5vZGUgaXMgbGVmdCBsb2NrZWQgaW4gc2hhcmVkIG1vZGUuCisJCQkgKiBQdXNoYnVmIHJvdXRpbmUgZ2V0cyB0byB1bmxvY2sgaXQuCisJCQkgKi8KKwkJCXJldHVybiBYRlNfSVRFTV9QVVNIQlVGOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFdlIGhvbGQgdGhlIEFJTF9MT0NLLCBzbyB3ZSBtdXN0IHNwZWNpZnkgdGhlCisJCQkgKiBOT05PVElGWSBmbGFnIHNvIHRoYXQgd2Ugd29uJ3QgZG91YmxlIHRyaXAuCisJCQkgKi8KKwkJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEfFhGU19JVU5MT0NLX05PTk9USUZZKTsKKwkJCXJldHVybiBYRlNfSVRFTV9GTFVTSElORzsKKwkJfQorCQkvKiBOT1RSRUFDSEVEICovCisJfQorCisJLyogU3RhbGUgaXRlbXMgc2hvdWxkIGZvcmNlIG91dCB0aGUgaWNsb2cgKi8KKwlpZiAoaXAtPmlfZmxhZ3MgJiBYRlNfSVNUQUxFKSB7CisJCXhmc19pZnVubG9jayhpcCk7CisJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEfFhGU19JVU5MT0NLX05PTk9USUZZKTsKKwkJcmV0dXJuIFhGU19JVEVNX1BJTk5FRDsKKwl9CisKKyNpZmRlZiBERUJVRworCWlmICghWEZTX0ZPUkNFRF9TSFVURE9XTihpcC0+aV9tb3VudCkpIHsKKwkJQVNTRVJUKGlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICE9IDApOworCQlBU1NFUlQoaWlwLT5pbGlfbG9nZ2VkID09IDApOworCQlBU1NFUlQoaWlwLT5pbGlfaXRlbS5saV9mbGFncyAmIFhGU19MSV9JTl9BSUwpOworCX0KKyNlbmRpZgorCXJldHVybiBYRlNfSVRFTV9TVUNDRVNTOworfQorCisvKgorICogVW5sb2NrIHRoZSBpbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGlub2RlIGxvZyBpdGVtLgorICogQ2xlYXIgdGhlIGZpZWxkcyBvZiB0aGUgaW5vZGUgYW5kIGlub2RlIGxvZyBpdGVtIHRoYXQKKyAqIGFyZSBzcGVjaWZpYyB0byB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4gIElmIHRoZQorICogaG9sZCBmbGFncyBpcyBzZXQsIGRvIG5vdCB1bmxvY2sgdGhlIGlub2RlLgorICovCitTVEFUSUMgdm9pZAoreGZzX2lub2RlX2l0ZW1fdW5sb2NrKAorCXhmc19pbm9kZV9sb2dfaXRlbV90CSppaXApCit7CisJdWludAkJaG9sZDsKKwl1aW50CQlpb2xvY2tlZDsKKwl1aW50CQlsb2NrX2ZsYWdzOworCXhmc19pbm9kZV90CSppcDsKKworCUFTU0VSVChpaXAgIT0gTlVMTCk7CisJQVNTRVJUKGlpcC0+aWxpX2lub2RlLT5pX2l0ZW1wICE9IE5VTEwpOworCUFTU0VSVChpc21ybG9ja2VkKCYoaWlwLT5pbGlfaW5vZGUtPmlfbG9jayksIE1SX1VQREFURSkpOworCUFTU0VSVCgoIShpaXAtPmlsaV9pbm9kZS0+aV9pdGVtcC0+aWxpX2ZsYWdzICYKKwkJICBYRlNfSUxJX0lPTE9DS0VEX0VYQ0wpKSB8fAorCSAgICAgICBpc21ybG9ja2VkKCYoaWlwLT5pbGlfaW5vZGUtPmlfaW9sb2NrKSwgTVJfVVBEQVRFKSk7CisJQVNTRVJUKCghKGlpcC0+aWxpX2lub2RlLT5pX2l0ZW1wLT5pbGlfZmxhZ3MgJgorCQkgIFhGU19JTElfSU9MT0NLRURfU0hBUkVEKSkgfHwKKwkgICAgICAgaXNtcmxvY2tlZCgmKGlpcC0+aWxpX2lub2RlLT5pX2lvbG9jayksIE1SX0FDQ0VTUykpOworCS8qCisJICogQ2xlYXIgdGhlIHRyYW5zYWN0aW9uIHBvaW50ZXIgaW4gdGhlIGlub2RlLgorCSAqLworCWlwID0gaWlwLT5pbGlfaW5vZGU7CisJaXAtPmlfdHJhbnNwID0gTlVMTDsKKworCS8qCisJICogSWYgdGhlIGlub2RlIG5lZWRlZCBhIHNlcGFyYXRlIGJ1ZmZlciB3aXRoIHdoaWNoIHRvIGxvZworCSAqIGl0cyBleHRlbnRzLCB0aGVuIGZyZWUgaXQgbm93LgorCSAqLworCWlmIChpaXAtPmlsaV9leHRlbnRzX2J1ZiAhPSBOVUxMKSB7CisJCUFTU0VSVChpcC0+aV9kLmRpX2Zvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTKTsKKwkJQVNTRVJUKGlwLT5pX2QuZGlfbmV4dGVudHMgPiAwKTsKKwkJQVNTRVJUKGlpcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICYgWEZTX0lMT0dfREVYVCk7CisJCUFTU0VSVChpcC0+aV9kZi5pZl9ieXRlcyA+IDApOworCQlrbWVtX2ZyZWUoaWlwLT5pbGlfZXh0ZW50c19idWYsIGlwLT5pX2RmLmlmX2J5dGVzKTsKKwkJaWlwLT5pbGlfZXh0ZW50c19idWYgPSBOVUxMOworCX0KKwlpZiAoaWlwLT5pbGlfYWV4dGVudHNfYnVmICE9IE5VTEwpIHsKKwkJQVNTRVJUKGlwLT5pX2QuZGlfYWZvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTKTsKKwkJQVNTRVJUKGlwLT5pX2QuZGlfYW5leHRlbnRzID4gMCk7CisJCUFTU0VSVChpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmIFhGU19JTE9HX0FFWFQpOworCQlBU1NFUlQoaXAtPmlfYWZwLT5pZl9ieXRlcyA+IDApOworCQlrbWVtX2ZyZWUoaWlwLT5pbGlfYWV4dGVudHNfYnVmLCBpcC0+aV9hZnAtPmlmX2J5dGVzKTsKKwkJaWlwLT5pbGlfYWV4dGVudHNfYnVmID0gTlVMTDsKKwl9CisKKwkvKgorCSAqIEZpZ3VyZSBvdXQgaWYgd2Ugc2hvdWxkIHVubG9jayB0aGUgaW5vZGUgb3Igbm90LgorCSAqLworCWhvbGQgPSBpaXAtPmlsaV9mbGFncyAmIFhGU19JTElfSE9MRDsKKworCS8qCisJICogQmVmb3JlIGNsZWFyaW5nIG91dCB0aGUgZmxhZ3MsIHJlbWVtYmVyIHdoZXRoZXIgd2UKKwkgKiBhcmUgaG9sZGluZyB0aGUgaW5vZGUncyBJTyBsb2NrLgorCSAqLworCWlvbG9ja2VkID0gaWlwLT5pbGlfZmxhZ3MgJiBYRlNfSUxJX0lPTE9DS0VEX0FOWTsKKworCS8qCisJICogQ2xlYXIgb3V0IHRoZSBmaWVsZHMgb2YgdGhlIGlub2RlIGxvZyBpdGVtIHBhcnRpY3VsYXIKKwkgKiB0byB0aGUgY3VycmVudCB0cmFuc2FjdGlvbi4KKwkgKi8KKwlpaXAtPmlsaV9pbG9ja19yZWN1ciA9IDA7CisJaWlwLT5pbGlfaW9sb2NrX3JlY3VyID0gMDsKKwlpaXAtPmlsaV9mbGFncyA9IDA7CisKKwkvKgorCSAqIFVubG9jayB0aGUgaW5vZGUgaWYgWEZTX0lMSV9IT0xEIHdhcyBub3Qgc2V0LgorCSAqLworCWlmICghaG9sZCkgeworCQlsb2NrX2ZsYWdzID0gWEZTX0lMT0NLX0VYQ0w7CisJCWlmIChpb2xvY2tlZCAmIFhGU19JTElfSU9MT0NLRURfRVhDTCkgeworCQkJbG9ja19mbGFncyB8PSBYRlNfSU9MT0NLX0VYQ0w7CisJCX0gZWxzZSBpZiAoaW9sb2NrZWQgJiBYRlNfSUxJX0lPTE9DS0VEX1NIQVJFRCkgeworCQkJbG9ja19mbGFncyB8PSBYRlNfSU9MT0NLX1NIQVJFRDsKKwkJfQorCQl4ZnNfaXB1dChpaXAtPmlsaV9pbm9kZSwgbG9ja19mbGFncyk7CisJfQorfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgdG8gZmluZCBvdXQgd2hlcmUgdGhlIG9sZGVzdCBhY3RpdmUgY29weSBvZiB0aGUKKyAqIGlub2RlIGxvZyBpdGVtIGluIHRoZSBvbiBkaXNrIGxvZyByZXNpZGVzIG5vdyB0aGF0IHRoZSBsYXN0IGxvZworICogd3JpdGUgb2YgaXQgY29tcGxldGVkIGF0IHRoZSBnaXZlbiBsc24uICBTaW5jZSB3ZSBhbHdheXMgcmUtbG9nCisgKiBhbGwgZGlydHkgZGF0YSBpbiBhbiBpbm9kZSwgdGhlIGxhdGVzdCBjb3B5IGluIHRoZSBvbiBkaXNrIGxvZworICogaXMgdGhlIG9ubHkgb25lIHRoYXQgbWF0dGVycy4gIFRoZXJlZm9yZSwgc2ltcGx5IHJldHVybiB0aGUKKyAqIGdpdmVuIGxzbi4KKyAqLworLypBUkdTVVNFRCovCitTVEFUSUMgeGZzX2xzbl90Cit4ZnNfaW5vZGVfaXRlbV9jb21taXR0ZWQoCisJeGZzX2lub2RlX2xvZ19pdGVtX3QJKmlpcCwKKwl4ZnNfbHNuX3QJCWxzbikKK3sKKwlyZXR1cm4gKGxzbik7Cit9CisKKy8qCisgKiBUaGUgdHJhbnNhY3Rpb24gd2l0aCB0aGUgaW5vZGUgbG9ja2VkIGhhcyBhYm9ydGVkLiAgVGhlIGlub2RlCisgKiBtdXN0IG5vdCBiZSBkaXJ0eSB3aXRoaW4gdGhlIHRyYW5zYWN0aW9uICh1bmxlc3Mgd2UncmUgZm9yY2libHkKKyAqIHNodXR0aW5nIGRvd24pLiAgV2Ugc2ltcGx5IHVubG9jayBqdXN0IGFzIGlmIHRoZSB0cmFuc2FjdGlvbgorICogaGFkIGJlZW4gY2FuY2VsbGVkLgorICovCitTVEFUSUMgdm9pZAoreGZzX2lub2RlX2l0ZW1fYWJvcnQoCisJeGZzX2lub2RlX2xvZ19pdGVtX3QJKmlpcCkKK3sKKwl4ZnNfaW5vZGVfaXRlbV91bmxvY2soaWlwKTsKKwlyZXR1cm47Cit9CisKKworLyoKKyAqIFRoaXMgZ2V0cyBjYWxsZWQgYnkgeGZzX3RyYW5zX3B1c2hfYWlsKCksIHdoZW4gSU9QX1RSWUxPQ0sKKyAqIGZhaWxlZCB0byBnZXQgdGhlIGlub2RlIGZsdXNoIGxvY2sgYnV0IGRpZCBnZXQgdGhlIGlub2RlIGxvY2tlZCBTSEFSRUQuCisgKiBIZXJlIHdlJ3JlIHRyeWluZyB0byBzZWUgaWYgdGhlIGlub2RlIGJ1ZmZlciBpcyBpbmNvcmUsIGFuZCBpZiBzbyB3aGV0aGVyIGl0J3MKKyAqIG1hcmtlZCBkZWxheWVkIHdyaXRlLiBJZiB0aGF0J3MgdGhlIGNhc2UsIHdlJ2xsIGluaXRpYXRlIGEgYmF3cml0ZSBvbiB0aGF0CisgKiBidWZmZXIgdG8gZXhwZWRpdGUgdGhlIHByb2Nlc3MuCisgKgorICogV2UgYXJlbid0IGhvbGRpbmcgdGhlIEFJTF9MT0NLIChvciB0aGUgZmx1c2ggbG9jaykgd2hlbiB0aGlzIGdldHMgY2FsbGVkLAorICogc28gaXQgaXMgaW5oZXJlbnRseSByYWNlLXkuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfaW5vZGVfaXRlbV9wdXNoYnVmKAorCXhmc19pbm9kZV9sb2dfaXRlbV90CSppaXApCit7CisJeGZzX2lub2RlX3QJKmlwOworCXhmc19tb3VudF90CSptcDsKKwl4ZnNfYnVmX3QJKmJwOworCXVpbnQJCWRvcHVzaDsKKworCWlwID0gaWlwLT5pbGlfaW5vZGU7CisKKwlBU1NFUlQoaXNtcmxvY2tlZCgmKGlwLT5pX2xvY2spLCBNUl9BQ0NFU1MpKTsKKworCS8qCisJICogVGhlIGlsaV9wdXNoYnVmX2ZsYWcga2VlcHMgb3RoZXJzIGZyb20KKwkgKiB0cnlpbmcgdG8gZHVwbGljYXRlIG91ciBlZmZvcnQuCisJICovCisJQVNTRVJUKGlpcC0+aWxpX3B1c2hidWZfZmxhZyAhPSAwKTsKKwlBU1NFUlQoaWlwLT5pbGlfcHVzaF9vd25lciA9PSBnZXRfdGhyZWFkX2lkKCkpOworCisJLyoKKwkgKiBJZiBmbHVzaGxvY2sgaXNuJ3QgbG9ja2VkIGFueW1vcmUsIGNoYW5jZXMgYXJlIHRoYXQgdGhlCisJICogaW5vZGUgZmx1c2ggY29tcGxldGVkIGFuZCB0aGUgaW5vZGUgd2FzIHRha2VuIG9mZiB0aGUgQUlMLgorCSAqIFNvLCBqdXN0IGdldCBvdXQuCisJICovCisJaWYgKCh2YWx1c2VtYSgmKGlwLT5pX2Zsb2NrKSkgPiAwKSAgfHwKKwkgICAgKChpaXAtPmlsaV9pdGVtLmxpX2ZsYWdzICYgWEZTX0xJX0lOX0FJTCkgPT0gMCkpIHsKKwkJaWlwLT5pbGlfcHVzaGJ1Zl9mbGFnID0gMDsKKwkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOworCQlyZXR1cm47CisJfQorCisJbXAgPSBpcC0+aV9tb3VudDsKKwlicCA9IHhmc19pbmNvcmUobXAtPm1fZGRldl90YXJncCwgaWlwLT5pbGlfZm9ybWF0LmlsZl9ibGtubywKKwkJICAgIGlpcC0+aWxpX2Zvcm1hdC5pbGZfbGVuLCBYRlNfSU5DT1JFX1RSWUxPQ0spOworCisJaWYgKGJwICE9IE5VTEwpIHsKKwkJaWYgKFhGU19CVUZfSVNERUxBWVdSSVRFKGJwKSkgeworCQkJLyoKKwkJCSAqIFdlIHdlcmUgcmFjaW5nIHdpdGggaWZsdXNoIGJlY2F1c2Ugd2UgZG9uJ3QgaG9sZAorCQkJICogdGhlIEFJTF9MT0NLIG9yIHRoZSBmbHVzaCBsb2NrLiBIb3dldmVyLCBhdCB0aGlzIHBvaW50LAorCQkJICogd2UgaGF2ZSB0aGUgYnVmZmVyLCBhbmQgd2Uga25vdyB0aGF0IGl0J3MgZGlydHkuCisJCQkgKiBTbywgaXQncyBwb3NzaWJsZSB0aGF0IGlmbHVzaCByYWNlZCB3aXRoIHVzLCBhbmQKKwkJCSAqIHRoaXMgaXRlbSBpcyBhbHJlYWR5IHRha2VuIG9mZiB0aGUgQUlMLgorCQkJICogSWYgbm90LCB3ZSBjYW4gZmx1c2ggaXQgYXN5bmMuCisJCQkgKi8KKwkJCWRvcHVzaCA9ICgoaWlwLT5pbGlfaXRlbS5saV9mbGFncyAmIFhGU19MSV9JTl9BSUwpICYmCisJCQkJICAodmFsdXNlbWEoJihpcC0+aV9mbG9jaykpIDw9IDApKTsKKwkJCWlpcC0+aWxpX3B1c2hidWZfZmxhZyA9IDA7CisJCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisJCQl4ZnNfYnVmdHJhY2UoIklOT0RFIElURU0gUFVTSCIsIGJwKTsKKwkJCWlmIChYRlNfQlVGX0lTUElOTkVEKGJwKSkgeworCQkJCXhmc19sb2dfZm9yY2UobXAsICh4ZnNfbHNuX3QpMCwKKwkJCQkJICAgICAgWEZTX0xPR19GT1JDRSk7CisJCQl9CisJCQlpZiAoZG9wdXNoKSB7CisJCQkJeGZzX2Jhd3JpdGUobXAsIGJwKTsKKwkJCX0gZWxzZSB7CisJCQkJeGZzX2J1Zl9yZWxzZShicCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpaXAtPmlsaV9wdXNoYnVmX2ZsYWcgPSAwOworCQkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOworCQkJeGZzX2J1Zl9yZWxzZShicCk7CisJCX0KKwkJcmV0dXJuOworCX0KKwkvKgorCSAqIFdlIGhhdmUgdG8gYmUgY2FyZWZ1bCBhYm91dCByZXNldHRpbmcgcHVzaGJ1ZiBmbGFnIHRvbyBlYXJseSAoYWJvdmUpLgorCSAqIEV2ZW4gdGhvdWdoIGluIHRoZW9yeSB3ZSBjYW4gZG8gaXQgYXMgc29vbiBhcyB3ZSBoYXZlIHRoZSBidWZsb2NrLAorCSAqIHdlIGRvbid0IHdhbnQgb3RoZXJzIHRvIGJlIGRvaW5nIHdvcmsgbmVlZGxlc3NseS4gVGhleSdsbCBjb21lIHRvCisJICogdGhpcyBmdW5jdGlvbiB0aGlua2luZyB0aGF0IHB1c2hpbmcgdGhlIGJ1ZmZlciBpcyB0aGVpcgorCSAqIHJlc3BvbnNpYmlsaXR5IG9ubHkgdG8gZmluZCB0aGF0IHRoZSBidWZmZXIgaXMgc3RpbGwgbG9ja2VkIGJ5CisJICogYW5vdGhlciBkb2luZyB0aGUgc2FtZSB0aGluZworCSAqLworCWlpcC0+aWxpX3B1c2hidWZfZmxhZyA9IDA7CisJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOworCXJldHVybjsKK30KKworCisvKgorICogVGhpcyBpcyBjYWxsZWQgdG8gYXN5bmNocm9ub3VzbHkgd3JpdGUgdGhlIGlub2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgKiBpbm9kZSBsb2cgaXRlbSBvdXQgdG8gZGlzay4gVGhlIGlub2RlIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gbG9ja2VkIGJ5CisgKiBhIHN1Y2Nlc3NmdWwgY2FsbCB0byB4ZnNfaW5vZGVfaXRlbV90cnlsb2NrKCkuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfaW5vZGVfaXRlbV9wdXNoKAorCXhmc19pbm9kZV9sb2dfaXRlbV90CSppaXApCit7CisJeGZzX2lub2RlX3QJKmlwOworCisJaXAgPSBpaXAtPmlsaV9pbm9kZTsKKworCUFTU0VSVChpc21ybG9ja2VkKCYoaXAtPmlfbG9jayksIE1SX0FDQ0VTUykpOworCUFTU0VSVCh2YWx1c2VtYSgmKGlwLT5pX2Zsb2NrKSkgPD0gMCk7CisJLyoKKwkgKiBTaW5jZSB3ZSB3ZXJlIGFibGUgdG8gbG9jayB0aGUgaW5vZGUncyBmbHVzaCBsb2NrIGFuZAorCSAqIHdlIGZvdW5kIGl0IG9uIHRoZSBBSUwsIHRoZSBpbm9kZSBtdXN0IGJlIGRpcnR5LiAgVGhpcworCSAqIGlzIGJlY2F1c2UgdGhlIGlub2RlIGlzIHJlbW92ZWQgZnJvbSB0aGUgQUlMIHdoaWxlIHN0aWxsCisJICogaG9sZGluZyB0aGUgZmx1c2ggbG9jayBpbiB4ZnNfaWZsdXNoX2RvbmUoKS4gIFRodXMsIGlmCisJICogd2UgZm91bmQgaXQgaW4gdGhlIEFJTCBhbmQgd2VyZSBhYmxlIHRvIG9idGFpbiB0aGUgZmx1c2gKKwkgKiBsb2NrIHdpdGhvdXQgc2xlZXBpbmcsIHRoZW4gdGhlcmUgbXVzdCBub3QgaGF2ZSBiZWVuCisJICogYW55b25lIGluIHRoZSBwcm9jZXNzIG9mIGZsdXNoaW5nIHRoZSBpbm9kZS4KKwkgKi8KKwlBU1NFUlQoWEZTX0ZPUkNFRF9TSFVURE9XTihpcC0+aV9tb3VudCkgfHwKKwkgICAgICAgaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgIT0gMCk7CisKKwkvKgorCSAqIFdyaXRlIG91dCB0aGUgaW5vZGUuICBUaGUgY29tcGxldGlvbiByb3V0aW5lICgnaWZsdXNoX2RvbmUnKSB3aWxsCisJICogcHVsbCBpdCBmcm9tIHRoZSBBSUwsIG1hcmsgaXQgY2xlYW4sIHVubG9jayB0aGUgZmx1c2ggbG9jay4KKwkgKi8KKwkodm9pZCkgeGZzX2lmbHVzaChpcCwgWEZTX0lGTFVTSF9BU1lOQyk7CisJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOworCisJcmV0dXJuOworfQorCisvKgorICogWFhYIHJjYyAtIHRoaXMgb25lIHJlYWxseSBoYXMgdG8gZG8gc29tZXRoaW5nLiAgUHJvYmFibHkgbmVlZHMKKyAqIHRvIHN0YW1wIGluIGEgbmV3IGZpZWxkIGluIHRoZSBpbmNvcmUgaW5vZGUuCisgKi8KKy8qIEFSR1NVU0VEICovCitTVEFUSUMgdm9pZAoreGZzX2lub2RlX2l0ZW1fY29tbWl0dGluZygKKwl4ZnNfaW5vZGVfbG9nX2l0ZW1fdAkqaWlwLAorCXhmc19sc25fdAkJbHNuKQoreworCWlpcC0+aWxpX2xhc3RfbHNuID0gbHNuOworCXJldHVybjsKK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIG9wcyB2ZWN0b3Igc2hhcmVkIGJ5IGFsbCBidWYgbG9nIGl0ZW1zLgorICovCitzdHJ1Y3QgeGZzX2l0ZW1fb3BzIHhmc19pbm9kZV9pdGVtX29wcyA9IHsKKwkuaW9wX3NpemUJPSAodWludCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19pbm9kZV9pdGVtX3NpemUsCisJLmlvcF9mb3JtYXQJPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCosIHhmc19sb2dfaW92ZWNfdCopKQorCQkJCQl4ZnNfaW5vZGVfaXRlbV9mb3JtYXQsCisJLmlvcF9waW4JPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19pbm9kZV9pdGVtX3BpbiwKKwkuaW9wX3VucGluCT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqLCBpbnQpKXhmc19pbm9kZV9pdGVtX3VucGluLAorCS5pb3BfdW5waW5fcmVtb3ZlID0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqLCB4ZnNfdHJhbnNfdCopKQorCQkJCQl4ZnNfaW5vZGVfaXRlbV91bnBpbl9yZW1vdmUsCisJLmlvcF90cnlsb2NrCT0gKHVpbnQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfaW5vZGVfaXRlbV90cnlsb2NrLAorCS5pb3BfdW5sb2NrCT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfaW5vZGVfaXRlbV91bmxvY2ssCisJLmlvcF9jb21taXR0ZWQJPSAoeGZzX2xzbl90KCopKHhmc19sb2dfaXRlbV90KiwgeGZzX2xzbl90KSkKKwkJCQkJeGZzX2lub2RlX2l0ZW1fY29tbWl0dGVkLAorCS5pb3BfcHVzaAk9ICh2b2lkKCopKHhmc19sb2dfaXRlbV90KikpeGZzX2lub2RlX2l0ZW1fcHVzaCwKKwkuaW9wX2Fib3J0CT0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqKSl4ZnNfaW5vZGVfaXRlbV9hYm9ydCwKKwkuaW9wX3B1c2hidWYJPSAodm9pZCgqKSh4ZnNfbG9nX2l0ZW1fdCopKXhmc19pbm9kZV9pdGVtX3B1c2hidWYsCisJLmlvcF9jb21taXR0aW5nID0gKHZvaWQoKikoeGZzX2xvZ19pdGVtX3QqLCB4ZnNfbHNuX3QpKQorCQkJCQl4ZnNfaW5vZGVfaXRlbV9jb21taXR0aW5nCit9OworCisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBpbm9kZSBsb2cgaXRlbSBmb3IgYSBuZXdseSBhbGxvY2F0ZWQgKGluLWNvcmUpIGlub2RlLgorICovCit2b2lkCit4ZnNfaW5vZGVfaXRlbV9pbml0KAorCXhmc19pbm9kZV90CSppcCwKKwl4ZnNfbW91bnRfdAkqbXApCit7CisJeGZzX2lub2RlX2xvZ19pdGVtX3QJKmlpcDsKKworCUFTU0VSVChpcC0+aV9pdGVtcCA9PSBOVUxMKTsKKwlpaXAgPSBpcC0+aV9pdGVtcCA9IGttZW1fem9uZV96YWxsb2MoeGZzX2lsaV96b25lLCBLTV9TTEVFUCk7CisKKwlpaXAtPmlsaV9pdGVtLmxpX3R5cGUgPSBYRlNfTElfSU5PREU7CisJaWlwLT5pbGlfaXRlbS5saV9vcHMgPSAmeGZzX2lub2RlX2l0ZW1fb3BzOworCWlpcC0+aWxpX2l0ZW0ubGlfbW91bnRwID0gbXA7CisJaWlwLT5pbGlfaW5vZGUgPSBpcDsKKworCS8qCisJICAgV2UgaGF2ZSB6ZXJvZWQgbWVtb3J5LiBObyBuZWVkIC4uLgorCSAgIGlpcC0+aWxpX2V4dGVudHNfYnVmID0gTlVMTDsKKwkgICBpaXAtPmlsaV9wdXNoYnVmX2ZsYWcgPSAwOworCSAqLworCisJaWlwLT5pbGlfZm9ybWF0LmlsZl90eXBlID0gWEZTX0xJX0lOT0RFOworCWlpcC0+aWxpX2Zvcm1hdC5pbGZfaW5vID0gaXAtPmlfaW5vOworCWlpcC0+aWxpX2Zvcm1hdC5pbGZfYmxrbm8gPSBpcC0+aV9ibGtubzsKKwlpaXAtPmlsaV9mb3JtYXQuaWxmX2xlbiA9IGlwLT5pX2xlbjsKKwlpaXAtPmlsaV9mb3JtYXQuaWxmX2JvZmZzZXQgPSBpcC0+aV9ib2Zmc2V0OworfQorCisvKgorICogRnJlZSB0aGUgaW5vZGUgbG9nIGl0ZW0gYW5kIGFueSBtZW1vcnkgaGFuZ2luZyBvZmYgb2YgaXQuCisgKi8KK3ZvaWQKK3hmc19pbm9kZV9pdGVtX2Rlc3Ryb3koCisJeGZzX2lub2RlX3QJKmlwKQoreworI2lmZGVmIFhGU19UUkFOU19ERUJVRworCWlmIChpcC0+aV9pdGVtcC0+aWxpX3Jvb3Rfc2l6ZSAhPSAwKSB7CisJCWttZW1fZnJlZShpcC0+aV9pdGVtcC0+aWxpX29yaWdfcm9vdCwKKwkJCSAgaXAtPmlfaXRlbXAtPmlsaV9yb290X3NpemUpOworCX0KKyNlbmRpZgorCWttZW1fem9uZV9mcmVlKHhmc19pbGlfem9uZSwgaXAtPmlfaXRlbXApOworfQorCisKKy8qCisgKiBUaGlzIGlzIHRoZSBpbm9kZSBmbHVzaGluZyBJL08gY29tcGxldGlvbiByb3V0aW5lLiAgSXQgaXMgY2FsbGVkCisgKiBmcm9tIGludGVycnVwdCBsZXZlbCB3aGVuIHRoZSBidWZmZXIgY29udGFpbmluZyB0aGUgaW5vZGUgaXMKKyAqIGZsdXNoZWQgdG8gZGlzay4gIEl0IGlzIHJlc3BvbnNpYmxlIGZvciByZW1vdmluZyB0aGUgaW5vZGUgaXRlbQorICogZnJvbSB0aGUgQUlMIGlmIGl0IGhhcyBub3QgYmVlbiByZS1sb2dnZWQsIGFuZCB1bmxvY2tpbmcgdGhlIGlub2RlJ3MKKyAqIGZsdXNoIGxvY2suCisgKi8KKy8qQVJHU1VTRUQqLwordm9pZAoreGZzX2lmbHVzaF9kb25lKAorCXhmc19idWZfdAkJKmJwLAorCXhmc19pbm9kZV9sb2dfaXRlbV90CSppaXApCit7CisJeGZzX2lub2RlX3QJKmlwOworCVNQTERFQ0wocyk7CisKKwlpcCA9IGlpcC0+aWxpX2lub2RlOworCisJLyoKKwkgKiBXZSBvbmx5IHdhbnQgdG8gcHVsbCB0aGUgaXRlbSBmcm9tIHRoZSBBSUwgaWYgaXQgaXMKKwkgKiBhY3R1YWxseSB0aGVyZSBhbmQgaXRzIGxvY2F0aW9uIGluIHRoZSBsb2cgaGFzIG5vdAorCSAqIGNoYW5nZWQgc2luY2Ugd2Ugc3RhcnRlZCB0aGUgZmx1c2guICBUaHVzLCB3ZSBvbmx5IGJvdGhlcgorCSAqIGlmIHRoZSBpbGlfbG9nZ2VkIGZsYWcgaXMgc2V0IGFuZCB0aGUgaW5vZGUncyBsc24gaGFzIG5vdAorCSAqIGNoYW5nZWQuICBGaXJzdCB3ZSBjaGVjayB0aGUgbHNuIG91dHNpZGUKKwkgKiB0aGUgbG9jayBzaW5jZSBpdCdzIGNoZWFwZXIsIGFuZCB0aGVuIHdlIHJlY2hlY2sgd2hpbGUKKwkgKiBob2xkaW5nIHRoZSBsb2NrIGJlZm9yZSByZW1vdmluZyB0aGUgaW5vZGUgZnJvbSB0aGUgQUlMLgorCSAqLworCWlmIChpaXAtPmlsaV9sb2dnZWQgJiYKKwkgICAgKGlpcC0+aWxpX2l0ZW0ubGlfbHNuID09IGlpcC0+aWxpX2ZsdXNoX2xzbikpIHsKKwkJQUlMX0xPQ0soaXAtPmlfbW91bnQsIHMpOworCQlpZiAoaWlwLT5pbGlfaXRlbS5saV9sc24gPT0gaWlwLT5pbGlfZmx1c2hfbHNuKSB7CisJCQkvKgorCQkJICogeGZzX3RyYW5zX2RlbGV0ZV9haWwoKSBkcm9wcyB0aGUgQUlMIGxvY2suCisJCQkgKi8KKwkJCXhmc190cmFuc19kZWxldGVfYWlsKGlwLT5pX21vdW50LAorCQkJCQkgICAgICh4ZnNfbG9nX2l0ZW1fdCopaWlwLCBzKTsKKwkJfSBlbHNlIHsKKwkJCUFJTF9VTkxPQ0soaXAtPmlfbW91bnQsIHMpOworCQl9CisJfQorCisJaWlwLT5pbGlfbG9nZ2VkID0gMDsKKworCS8qCisJICogQ2xlYXIgdGhlIGlsaV9sYXN0X2ZpZWxkcyBiaXRzIG5vdyB0aGF0IHdlIGtub3cgdGhhdCB0aGUKKwkgKiBkYXRhIGNvcnJlc3BvbmRpbmcgdG8gdGhlbSBpcyBzYWZlbHkgb24gZGlzay4KKwkgKi8KKwlpaXAtPmlsaV9sYXN0X2ZpZWxkcyA9IDA7CisKKwkvKgorCSAqIFJlbGVhc2UgdGhlIGlub2RlJ3MgZmx1c2ggbG9jayBzaW5jZSB3ZSdyZSBkb25lIHdpdGggaXQuCisJICovCisJeGZzX2lmdW5sb2NrKGlwKTsKKworCXJldHVybjsKK30KKworLyoKKyAqIFRoaXMgaXMgdGhlIGlub2RlIGZsdXNoaW5nIGFib3J0IHJvdXRpbmUuICBJdCBpcyBjYWxsZWQKKyAqIGZyb20geGZzX2lmbHVzaCB3aGVuIHRoZSBmaWxlc3lzdGVtIGlzIHNodXR0aW5nIGRvd24gdG8gY2xlYW4KKyAqIHVwIHRoZSBpbm9kZSBzdGF0ZS4KKyAqIEl0IGlzIHJlc3BvbnNpYmxlIGZvciByZW1vdmluZyB0aGUgaW5vZGUgaXRlbQorICogZnJvbSB0aGUgQUlMIGlmIGl0IGhhcyBub3QgYmVlbiByZS1sb2dnZWQsIGFuZCB1bmxvY2tpbmcgdGhlIGlub2RlJ3MKKyAqIGZsdXNoIGxvY2suCisgKi8KK3ZvaWQKK3hmc19pZmx1c2hfYWJvcnQoCisJeGZzX2lub2RlX3QJCSppcCkKK3sKKwl4ZnNfaW5vZGVfbG9nX2l0ZW1fdAkqaWlwOworCXhmc19tb3VudF90CQkqbXA7CisJU1BMREVDTChzKTsKKworCWlpcCA9IGlwLT5pX2l0ZW1wOworCW1wID0gaXAtPmlfbW91bnQ7CisJaWYgKGlpcCkgeworCQlpZiAoaWlwLT5pbGlfaXRlbS5saV9mbGFncyAmIFhGU19MSV9JTl9BSUwpIHsKKwkJCUFJTF9MT0NLKG1wLCBzKTsKKwkJCWlmIChpaXAtPmlsaV9pdGVtLmxpX2ZsYWdzICYgWEZTX0xJX0lOX0FJTCkgeworCQkJCS8qCisJCQkJICogeGZzX3RyYW5zX2RlbGV0ZV9haWwoKSBkcm9wcyB0aGUgQUlMIGxvY2suCisJCQkJICovCisJCQkJeGZzX3RyYW5zX2RlbGV0ZV9haWwobXAsICh4ZnNfbG9nX2l0ZW1fdCAqKWlpcCwKKwkJCQkJcyk7CisJCQl9IGVsc2UKKwkJCQlBSUxfVU5MT0NLKG1wLCBzKTsKKwkJfQorCQlpaXAtPmlsaV9sb2dnZWQgPSAwOworCQkvKgorCQkgKiBDbGVhciB0aGUgaWxpX2xhc3RfZmllbGRzIGJpdHMgbm93IHRoYXQgd2Uga25vdyB0aGF0IHRoZQorCQkgKiBkYXRhIGNvcnJlc3BvbmRpbmcgdG8gdGhlbSBpcyBzYWZlbHkgb24gZGlzay4KKwkJICovCisJCWlpcC0+aWxpX2xhc3RfZmllbGRzID0gMDsKKwkJLyoKKwkJICogQ2xlYXIgdGhlIGlub2RlIGxvZ2dpbmcgZmllbGRzIHNvIG5vIG1vcmUgZmx1c2hlcyBhcmUKKwkJICogYXR0ZW1wdGVkLgorCQkgKi8KKwkJaWlwLT5pbGlfZm9ybWF0LmlsZl9maWVsZHMgPSAwOworCX0KKwkvKgorCSAqIFJlbGVhc2UgdGhlIGlub2RlJ3MgZmx1c2ggbG9jayBzaW5jZSB3ZSdyZSBkb25lIHdpdGggaXQuCisJICovCisJeGZzX2lmdW5sb2NrKGlwKTsKK30KKwordm9pZAoreGZzX2lzdGFsZV9kb25lKAorCXhmc19idWZfdAkJKmJwLAorCXhmc19pbm9kZV9sb2dfaXRlbV90CSppaXApCit7CisJeGZzX2lmbHVzaF9hYm9ydChpaXAtPmlsaV9pbm9kZSk7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lub2RlX2l0ZW0uaCBiL2ZzL3hmcy94ZnNfaW5vZGVfaXRlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4Nzc1ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2lub2RlX2l0ZW0uaApAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmCV9fWEZTX0lOT0RFX0lURU1fSF9fCisjZGVmaW5lCV9fWEZTX0lOT0RFX0lURU1fSF9fCisKKy8qCisgKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgdXNlZCB0byBsYXkgb3V0IGFuIGlub2RlIGxvZyBpdGVtIGluIHRoZQorICogbG9nLiAgVGhlIHNpemUgb2YgdGhlIGlubGluZSBkYXRhL2V4dGVudHMvYi10cmVlIHJvb3QgdG8gYmUgbG9nZ2VkCisgKiAoaWYgYW55KSBpcyBpbmRpY2F0ZWQgaW4gdGhlIGlsZl9kc2l6ZSBmaWVsZC4gIENoYW5nZXMgdG8gdGhpcyBzdHJ1Y3R1cmUKKyAqIG11c3QgYmUgYWRkZWQgb24gdG8gdGhlIGVuZC4KKyAqCisgKiBDb252ZW50aW9uIGZvciBuYW1pbmcgaW5vZGUgbG9nIGl0ZW0gdmVyc2lvbnMgOiAgVGhlIGN1cnJlbnQgdmVyc2lvbgorICogaXMgYWx3YXlzIG5hbWVkIFhGU19MSV9JTk9ERS4gIFdoZW4gYW4gaW5vZGUgbG9nIGl0ZW0gZ2V0cyBzdXBlcnNlZGVkLAorICogYWRkIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBJUklYIHRoYXQgd2lsbCBnZW5lcmF0ZSBsb2dzIHdpdGggdGhhdCBpdGVtCisgKiB0byB0aGUgdmVyc2lvbiBuYW1lLgorICoKKyAqIC1WZXJzaW9uIDEgb2YgdGhpcyBzdHJ1Y3R1cmUgKFhGU19MSV81XzNfSU5PREUpIGluY2x1ZGVkIHVwIHRvIHRoZSBmaXJzdAorICoJdW5pb24gKGlsZl91KSBmaWVsZC4gIFRoaXMgd2FzIHJlbGVhc2VkIHdpdGggSVJJWCA1LjMtWEZTLgorICogLVZlcnNpb24gMiBvZiB0aGlzIHN0cnVjdHVyZSAoWEZTX0xJXzZfMV9JTk9ERSkgaXMgY3VycmVudGx5IHRoZSBlbnRpcmUKKyAqCXN0cnVjdHVyZS4gIFRoaXMgd2FzIHJlbGVhc2VkIHdpdGggSVJJWCA2LjAuMS1YRlMgYW5kIElSSVggNi4xLgorICogLVZlcnNpb24gMyBvZiB0aGlzIHN0cnVjdHVyZSAoWEZTX0xJX0lOT0RFKSBpcyB0aGUgc2FtZSBhcyB2ZXJzaW9uIDIKKyAqCXNvIGEgbmV3IHN0cnVjdHVyZSBkZWZpbml0aW9uIHdhc24ndCBuZWNlc3NhcnkuICBIb3dldmVyLCB3ZSBoYWQKKyAqCXRvIGFkZCBhIG5ldyB0eXBlIGJlY2F1c2UgdGhlIGlub2RlIGNsdXN0ZXIgc2l6ZSBjaGFuZ2VkIGZyb20gNEsKKyAqCXRvIDhLIGFuZCB0aGUgdmVyc2lvbiBudW1iZXIgaGFkIHRvIGJlIHJldid2ZWQgdG8ga2VlcCBvbGRlciBrZXJuZWxzCisgKglmcm9tIHRyeWluZyB0byByZWNvdmVyIGxvZ3Mgd2l0aCB0aGUgOEsgYnVmZmVycyBpbiB0aGVtLiAgVGhlIGxvZ2dpbmcKKyAqCWNvZGUgY2FuIGhhbmRsZSByZWNvdmVyeSBvbiBkaWZmZXJlbnQtc2l6ZWQgY2x1c3RlcnMgbm93IHNvIGhvcGVmdWxseQorICoJdGhpcydsbCBiZSB0aGUgbGFzdCB0aW1lIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSBpbm9kZSBsb2cgaXRlbSBqdXN0CisgKglmb3IgYSBjaGFuZ2UgaW4gdGhlIGlub2RlIGNsdXN0ZXIgc2l6ZS4gIFRoaXMgbmV3IHZlcnNpb24gd2FzCisgKglyZWxlYXNlZCB3aXRoIElSSVggNi4yLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfaW5vZGVfbG9nX2Zvcm1hdCB7CisJdW5zaWduZWQgc2hvcnQJCWlsZl90eXBlOwkvKiBpbm9kZSBsb2cgaXRlbSB0eXBlICovCisJdW5zaWduZWQgc2hvcnQJCWlsZl9zaXplOwkvKiBzaXplIG9mIHRoaXMgaXRlbSAqLworCXVpbnQJCQlpbGZfZmllbGRzOwkvKiBmbGFncyBmb3IgZmllbGRzIGxvZ2dlZCAqLworCXVzaG9ydAkJCWlsZl9hc2l6ZTsJLyogc2l6ZSBvZiBhdHRyIGQvZXh0L3Jvb3QgKi8KKwl1c2hvcnQJCQlpbGZfZHNpemU7CS8qIHNpemUgb2YgZGF0YS9leHQvcm9vdCAqLworCXhmc19pbm9fdAkJaWxmX2lubzsJLyogaW5vZGUgbnVtYmVyICovCisJdW5pb24geworCQl4ZnNfZGV2X3QJaWxmdV9yZGV2OwkvKiByZGV2IHZhbHVlIGZvciBkZXYgaW5vZGUqLworCQl1dWlkX3QJCWlsZnVfdXVpZDsJLyogbW91bnQgcG9pbnQgdmFsdWUgKi8KKwl9IGlsZl91OworCV9faW50NjRfdAkJaWxmX2Jsa25vOwkvKiBibGtubyBvZiBpbm9kZSBidWZmZXIgKi8KKwlpbnQJCQlpbGZfbGVuOwkvKiBsZW4gb2YgaW5vZGUgYnVmZmVyICovCisJaW50CQkJaWxmX2JvZmZzZXQ7CS8qIG9mZiBvZiBpbm9kZSBpbiBidWZmZXIgKi8KK30geGZzX2lub2RlX2xvZ19mb3JtYXRfdDsKKworLyogSW5pdGlhbCB2ZXJzaW9uIHNoaXBwZWQgd2l0aCBJUklYIDUuMy1YRlMgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19pbm9kZV9sb2dfZm9ybWF0X3YxIHsKKwl1bnNpZ25lZCBzaG9ydAkJaWxmX3R5cGU7CS8qIGlub2RlIGxvZyBpdGVtIHR5cGUgKi8KKwl1bnNpZ25lZCBzaG9ydAkJaWxmX3NpemU7CS8qIHNpemUgb2YgdGhpcyBpdGVtICovCisJdWludAkJCWlsZl9maWVsZHM7CS8qIGZsYWdzIGZvciBmaWVsZHMgbG9nZ2VkICovCisJdWludAkJCWlsZl9kc2l6ZTsJLyogc2l6ZSBvZiBkYXRhL2V4dC9yb290ICovCisJeGZzX2lub190CQlpbGZfaW5vOwkvKiBpbm9kZSBudW1iZXIgKi8KKwl1bmlvbiB7CisJCXhmc19kZXZfdAlpbGZ1X3JkZXY7CS8qIHJkZXYgdmFsdWUgZm9yIGRldiBpbm9kZSovCisJCXV1aWRfdAkJaWxmdV91dWlkOwkvKiBtb3VudCBwb2ludCB2YWx1ZSAqLworCX0gaWxmX3U7Cit9IHhmc19pbm9kZV9sb2dfZm9ybWF0X3RfdjE7CisKKy8qCisgKiBGbGFncyBmb3IgeGZzX3RyYW5zX2xvZ19pbm9kZSBmbGFncyBmaWVsZC4KKyAqLworI2RlZmluZQlYRlNfSUxPR19DT1JFCTB4MDAxCS8qIGxvZyBzdGFuZGFyZCBpbm9kZSBmaWVsZHMgKi8KKyNkZWZpbmUJWEZTX0lMT0dfRERBVEEJMHgwMDIJLyogbG9nIGlfZGYuaWZfZGF0YSAqLworI2RlZmluZQlYRlNfSUxPR19ERVhUCTB4MDA0CS8qIGxvZyBpX2RmLmlmX2V4dGVudHMgKi8KKyNkZWZpbmUJWEZTX0lMT0dfREJST09UCTB4MDA4CS8qIGxvZyBpX2RmLmlfYnJvb3QgKi8KKyNkZWZpbmUJWEZTX0lMT0dfREVWCTB4MDEwCS8qIGxvZyB0aGUgZGV2IGZpZWxkICovCisjZGVmaW5lCVhGU19JTE9HX1VVSUQJMHgwMjAJLyogbG9nIHRoZSB1dWlkIGZpZWxkICovCisjZGVmaW5lCVhGU19JTE9HX0FEQVRBCTB4MDQwCS8qIGxvZyBpX2FmLmlmX2RhdGEgKi8KKyNkZWZpbmUJWEZTX0lMT0dfQUVYVAkweDA4MAkvKiBsb2cgaV9hZi5pZl9leHRlbnRzICovCisjZGVmaW5lCVhGU19JTE9HX0FCUk9PVAkweDEwMAkvKiBsb2cgaV9hZi5pX2Jyb290ICovCisKKyNkZWZpbmUJWEZTX0lMT0dfTk9OQ09SRQkoWEZTX0lMT0dfRERBVEEgfCBYRlNfSUxPR19ERVhUIHwgXAorCQkJCSBYRlNfSUxPR19EQlJPT1QgfCBYRlNfSUxPR19ERVYgfCBcCisJCQkJIFhGU19JTE9HX1VVSUQgfCBYRlNfSUxPR19BREFUQSB8IFwKKwkJCQkgWEZTX0lMT0dfQUVYVCB8IFhGU19JTE9HX0FCUk9PVCkKKworI2RlZmluZQlYRlNfSUxPR19ERk9SSwkJKFhGU19JTE9HX0REQVRBIHwgWEZTX0lMT0dfREVYVCB8IFwKKwkJCQkgWEZTX0lMT0dfREJST09UKQorCisjZGVmaW5lCVhGU19JTE9HX0FGT1JLCQkoWEZTX0lMT0dfQURBVEEgfCBYRlNfSUxPR19BRVhUIHwgXAorCQkJCSBYRlNfSUxPR19BQlJPT1QpCisKKyNkZWZpbmUJWEZTX0lMT0dfQUxMCQkoWEZTX0lMT0dfQ09SRSB8IFhGU19JTE9HX0REQVRBIHwgXAorCQkJCSBYRlNfSUxPR19ERVhUIHwgWEZTX0lMT0dfREJST09UIHwgXAorCQkJCSBYRlNfSUxPR19ERVYgfCBYRlNfSUxPR19VVUlEIHwgXAorCQkJCSBYRlNfSUxPR19BREFUQSB8IFhGU19JTE9HX0FFWFQgfCBcCisJCQkJIFhGU19JTE9HX0FCUk9PVCkKKworI2RlZmluZQlYRlNfSUxJX0hPTEQJCTB4MQorI2RlZmluZQlYRlNfSUxJX0lPTE9DS0VEX0VYQ0wJMHgyCisjZGVmaW5lCVhGU19JTElfSU9MT0NLRURfU0hBUkVECTB4NAorCisjZGVmaW5lCVhGU19JTElfSU9MT0NLRURfQU5ZICAgKFhGU19JTElfSU9MT0NLRURfRVhDTCB8IFhGU19JTElfSU9MT0NLRURfU0hBUkVEKQorCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKK3N0cnVjdCB4ZnNfYnVmOworc3RydWN0IHhmc19ibWJ0X3JlY182NDsKK3N0cnVjdCB4ZnNfaW5vZGU7CitzdHJ1Y3QgeGZzX21vdW50OworCisKK3R5cGVkZWYgc3RydWN0IHhmc19pbm9kZV9sb2dfaXRlbSB7CisJeGZzX2xvZ19pdGVtX3QJCWlsaV9pdGVtOwkgICAvKiBjb21tb24gcG9ydGlvbiAqLworCXN0cnVjdCB4ZnNfaW5vZGUJKmlsaV9pbm9kZTsJICAgLyogaW5vZGUgcHRyICovCisJeGZzX2xzbl90CQlpbGlfZmx1c2hfbHNuOwkgICAvKiBsc24gYXQgbGFzdCBmbHVzaCAqLworCXhmc19sc25fdAkJaWxpX2xhc3RfbHNuOwkgICAvKiBsc24gYXQgbGFzdCB0cmFuc2FjdGlvbiAqLworCXVuc2lnbmVkIHNob3J0CQlpbGlfaWxvY2tfcmVjdXI7ICAgLyogbG9jayByZWN1cnNpb24gY291bnQgKi8KKwl1bnNpZ25lZCBzaG9ydAkJaWxpX2lvbG9ja19yZWN1cjsgIC8qIGxvY2sgcmVjdXJzaW9uIGNvdW50ICovCisJdW5zaWduZWQgc2hvcnQJCWlsaV9mbGFnczsJICAgLyogbWlzYyBmbGFncyAqLworCXVuc2lnbmVkIHNob3J0CQlpbGlfbG9nZ2VkOwkgICAvKiBmbHVzaGVkIGxvZ2dlZCBkYXRhICovCisJdW5zaWduZWQgaW50CQlpbGlfbGFzdF9maWVsZHM7ICAgLyogZmllbGRzIHdoZW4gZmx1c2hlZCAqLworCXN0cnVjdCB4ZnNfYm1idF9yZWNfNjQJKmlsaV9leHRlbnRzX2J1ZjsgIC8qIGFycmF5IG9mIGxvZ2dlZAorCQkJCQkJICAgICAgZGF0YSBleHRzICovCisJc3RydWN0IHhmc19ibWJ0X3JlY182NAkqaWxpX2FleHRlbnRzX2J1ZjsgLyogYXJyYXkgb2YgbG9nZ2VkCisJCQkJCQkgICAgICBhdHRyIGV4dHMgKi8KKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBpbGlfcHVzaGJ1Zl9mbGFnOyAgLyogb25lIGJpdCB1c2VkIGluIHB1c2hfYWlsICovCisKKyNpZmRlZiBERUJVRworCXVpbnQ2NF90ICAgICAgICAgICAgICAgIGlsaV9wdXNoX293bmVyOyAgICAvKiBvbmUgd2hvIHNldHMgcHVzaGJ1Zl9mbGFnCisJCQkJCQkgICAgICBhYm92ZSBnZXRzIHRvIHB1c2ggdGhlIGJ1ZiAqLworI2VuZGlmCisjaWZkZWYgWEZTX1RSQU5TX0RFQlVHCisJaW50CQkJaWxpX3Jvb3Rfc2l6ZTsKKwljaGFyCQkJKmlsaV9vcmlnX3Jvb3Q7CisjZW5kaWYKKwl4ZnNfaW5vZGVfbG9nX2Zvcm1hdF90CWlsaV9mb3JtYXQ7CSAgIC8qIGxvZ2dlZCBzdHJ1Y3R1cmUgKi8KK30geGZzX2lub2RlX2xvZ19pdGVtX3Q7CisKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSUxPR19GREFUQSkKK2ludCB4ZnNfaWxvZ19mZGF0YShpbnQgdyk7CisjZGVmaW5lCVhGU19JTE9HX0ZEQVRBKHcpCXhmc19pbG9nX2ZkYXRhKHcpCisjZWxzZQorI2RlZmluZQlYRlNfSUxPR19GREFUQSh3KQlcCisJKCh3KSA9PSBYRlNfREFUQV9GT1JLID8gWEZTX0lMT0dfRERBVEEgOiBYRlNfSUxPR19BREFUQSkKKyNlbmRpZgorCisjZW5kaWYJLyogX19LRVJORUxfXyAqLworCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JTE9HX0ZCUk9PVCkKK2ludCB4ZnNfaWxvZ19mYnJvb3QoaW50IHcpOworI2RlZmluZQlYRlNfSUxPR19GQlJPT1QodykJeGZzX2lsb2dfZmJyb290KHcpCisjZWxzZQorI2RlZmluZQlYRlNfSUxPR19GQlJPT1QodykJXAorCSgodykgPT0gWEZTX0RBVEFfRk9SSyA/IFhGU19JTE9HX0RCUk9PVCA6IFhGU19JTE9HX0FCUk9PVCkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSUxPR19GRVhUKQoraW50IHhmc19pbG9nX2ZleHQoaW50IHcpOworI2RlZmluZQlYRlNfSUxPR19GRVhUKHcpCXhmc19pbG9nX2ZleHQodykKKyNlbHNlCisjZGVmaW5lCVhGU19JTE9HX0ZFWFQodykJXAorCSgodykgPT0gWEZTX0RBVEFfRk9SSyA/IFhGU19JTE9HX0RFWFQgOiBYRlNfSUxPR19BRVhUKQorI2VuZGlmCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKK3ZvaWQJeGZzX2lub2RlX2l0ZW1faW5pdChzdHJ1Y3QgeGZzX2lub2RlICosIHN0cnVjdCB4ZnNfbW91bnQgKik7Cit2b2lkCXhmc19pbm9kZV9pdGVtX2Rlc3Ryb3koc3RydWN0IHhmc19pbm9kZSAqKTsKK3ZvaWQJeGZzX2lmbHVzaF9kb25lKHN0cnVjdCB4ZnNfYnVmICosIHhmc19pbm9kZV9sb2dfaXRlbV90ICopOwordm9pZAl4ZnNfaXN0YWxlX2RvbmUoc3RydWN0IHhmc19idWYgKiwgeGZzX2lub2RlX2xvZ19pdGVtX3QgKik7Cit2b2lkCXhmc19pZmx1c2hfYWJvcnQoc3RydWN0IHhmc19pbm9kZSAqKTsKKworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmCS8qIF9fWEZTX0lOT0RFX0lURU1fSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2ludW0uaCBiL2ZzL3hmcy94ZnNfaW51bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYWYyZDUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2ludW0uaApAQCAtMCwwICsxLDE3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfSU5VTV9IX18KKyNkZWZpbmUJX19YRlNfSU5VTV9IX18KKworLyoKKyAqIElub2RlIG51bWJlciBmb3JtYXQ6CisgKiBsb3cgaW5vcGJsb2cgYml0cyAtIG9mZnNldCBpbiBibG9jaworICogbmV4dCBhZ2Jsa2xvZyBiaXRzIC0gYmxvY2sgbnVtYmVyIGluIGFnCisgKiBuZXh0IGFnbm9fbG9nIGJpdHMgLSBhZyBudW1iZXIKKyAqIGhpZ2ggYWdub19sb2ctYWdibGtsb2ctaW5vcGJsb2cgYml0cyAtIDAKKyAqLworCit0eXBlZGVmCV9fdWludDMyX3QJeGZzX2FnaW5vX3Q7CS8qIHdpdGhpbiBhbGxvY2F0aW9uIGdycCBpbm9kZSBudW1iZXIgKi8KKworLyoKKyAqIFVzZWZ1bCBpbm9kZSBiaXRzIGZvciB0aGlzIGtlcm5lbC4KKyAqIFVzZWQgaW4gc29tZSBwbGFjZXMgd2hlcmUgaGF2aW5nIDY0LWJpdHMgaW4gdGhlIDMyLWJpdCBrZXJuZWxzCisgKiBjb3N0cyB0b28gbXVjaC4KKyAqLworI2lmIFhGU19CSUdfSU5VTVMKK3R5cGVkZWYJeGZzX2lub190CXhmc19pbnRpbm9fdDsKKyNlbHNlCit0eXBlZGVmCV9fdWludDMyX3QJeGZzX2ludGlub190OworI2VuZGlmCisKKyNkZWZpbmUJTlVMTEZTSU5PCSgoeGZzX2lub190KS0xKQorI2RlZmluZQlOVUxMQUdJTk8JKCh4ZnNfYWdpbm9fdCktMSkKKworc3RydWN0IHhmc19tb3VudDsKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSU5PX01BU0spCitfX3VpbnQzMl90IHhmc19pbm9fbWFzayhpbnQgayk7CisjZGVmaW5lCVhGU19JTk9fTUFTSyhrKQkJCXhmc19pbm9fbWFzayhrKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0lOT19NQVNLKGspCSgoX191aW50MzJfdCkoKDFVTEwgPDwgKGspKSAtIDEpKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JTk9fT0ZGU0VUX0JJVFMpCitpbnQgeGZzX2lub19vZmZzZXRfYml0cyhzdHJ1Y3QgeGZzX21vdW50ICptcCk7CisjZGVmaW5lCVhGU19JTk9fT0ZGU0VUX0JJVFMobXApCQl4ZnNfaW5vX29mZnNldF9iaXRzKG1wKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0lOT19PRkZTRVRfQklUUyhtcCkJKChtcCktPm1fc2Iuc2JfaW5vcGJsb2cpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lOT19BR0JOT19CSVRTKQoraW50IHhmc19pbm9fYWdibm9fYml0cyhzdHJ1Y3QgeGZzX21vdW50ICptcCk7CisjZGVmaW5lCVhGU19JTk9fQUdCTk9fQklUUyhtcCkJCXhmc19pbm9fYWdibm9fYml0cyhtcCkKKyNlbHNlCisjZGVmaW5lCVhGU19JTk9fQUdCTk9fQklUUyhtcCkJKChtcCktPm1fc2Iuc2JfYWdibGtsb2cpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lOT19BR0lOT19CSVRTKQoraW50IHhmc19pbm9fYWdpbm9fYml0cyhzdHJ1Y3QgeGZzX21vdW50ICptcCk7CisjZGVmaW5lCVhGU19JTk9fQUdJTk9fQklUUyhtcCkJCXhmc19pbm9fYWdpbm9fYml0cyhtcCkKKyNlbHNlCisjZGVmaW5lCVhGU19JTk9fQUdJTk9fQklUUyhtcCkJCSgobXApLT5tX2FnaW5vX2xvZykKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSU5PX0FHTk9fQklUUykKK2ludCB4ZnNfaW5vX2Fnbm9fYml0cyhzdHJ1Y3QgeGZzX21vdW50ICptcCk7CisjZGVmaW5lCVhGU19JTk9fQUdOT19CSVRTKG1wKQkJeGZzX2lub19hZ25vX2JpdHMobXApCisjZWxzZQorI2RlZmluZQlYRlNfSU5PX0FHTk9fQklUUyhtcCkJKChtcCktPm1fYWdub19sb2cpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lOT19CSVRTKQoraW50IHhmc19pbm9fYml0cyhzdHJ1Y3QgeGZzX21vdW50ICptcCk7CisjZGVmaW5lCVhGU19JTk9fQklUUyhtcCkJCXhmc19pbm9fYml0cyhtcCkKKyNlbHNlCisjZGVmaW5lCVhGU19JTk9fQklUUyhtcCkJKFhGU19JTk9fQUdOT19CSVRTKG1wKSArIFhGU19JTk9fQUdJTk9fQklUUyhtcCkpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSU5PX1RPX0FHTk8pCit4ZnNfYWdudW1iZXJfdCB4ZnNfaW5vX3RvX2Fnbm8oc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19pbm9fdCBpKTsKKyNkZWZpbmUJWEZTX0lOT19UT19BR05PKG1wLGkpCQl4ZnNfaW5vX3RvX2Fnbm8obXAsaSkKKyNlbHNlCisjZGVmaW5lCVhGU19JTk9fVE9fQUdOTyhtcCxpKQlcCisJKCh4ZnNfYWdudW1iZXJfdCkoKGkpID4+IFhGU19JTk9fQUdJTk9fQklUUyhtcCkpKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JTk9fVE9fQUdJTk8pCit4ZnNfYWdpbm9fdCB4ZnNfaW5vX3RvX2FnaW5vKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfaW5vX3QgaSk7CisjZGVmaW5lCVhGU19JTk9fVE9fQUdJTk8obXAsaSkJCXhmc19pbm9fdG9fYWdpbm8obXAsaSkKKyNlbHNlCisjZGVmaW5lCVhGU19JTk9fVE9fQUdJTk8obXAsaSkJXAorCSgoeGZzX2FnaW5vX3QpKGkpICYgWEZTX0lOT19NQVNLKFhGU19JTk9fQUdJTk9fQklUUyhtcCkpKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19JTk9fVE9fQUdCTk8pCit4ZnNfYWdibG9ja190IHhmc19pbm9fdG9fYWdibm8oc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19pbm9fdCBpKTsKKyNkZWZpbmUJWEZTX0lOT19UT19BR0JOTyhtcCxpKQkJeGZzX2lub190b19hZ2JubyhtcCxpKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0lOT19UT19BR0JOTyhtcCxpKQlcCisJKCgoeGZzX2FnYmxvY2tfdCkoaSkgPj4gWEZTX0lOT19PRkZTRVRfQklUUyhtcCkpICYgXAorCSBYRlNfSU5PX01BU0soWEZTX0lOT19BR0JOT19CSVRTKG1wKSkpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0lOT19UT19PRkZTRVQpCitpbnQgeGZzX2lub190b19vZmZzZXQoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19pbm9fdCBpKTsKKyNkZWZpbmUJWEZTX0lOT19UT19PRkZTRVQobXAsaSkJCXhmc19pbm9fdG9fb2Zmc2V0KG1wLGkpCisjZWxzZQorI2RlZmluZQlYRlNfSU5PX1RPX09GRlNFVChtcCxpKQlcCisJKChpbnQpKGkpICYgWEZTX0lOT19NQVNLKFhGU19JTk9fT0ZGU0VUX0JJVFMobXApKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfSU5PX1RPX0ZTQikKK3hmc19mc2Jsb2NrX3QgeGZzX2lub190b19mc2Ioc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19pbm9fdCBpKTsKKyNkZWZpbmUJWEZTX0lOT19UT19GU0IobXAsaSkJCXhmc19pbm9fdG9fZnNiKG1wLGkpCisjZWxzZQorI2RlZmluZQlYRlNfSU5PX1RPX0ZTQihtcCxpKQlcCisJWEZTX0FHQl9UT19GU0IobXAsIFhGU19JTk9fVE9fQUdOTyhtcCxpKSwgWEZTX0lOT19UT19BR0JOTyhtcCxpKSkKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19BR0lOT19UT19JTk8pCit4ZnNfaW5vX3QKK3hmc19hZ2lub190b19pbm8oc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19hZ251bWJlcl90IGEsIHhmc19hZ2lub190IGkpOworI2RlZmluZQlYRlNfQUdJTk9fVE9fSU5PKG1wLGEsaSkJeGZzX2FnaW5vX3RvX2lubyhtcCxhLGkpCisjZWxzZQorI2RlZmluZQlYRlNfQUdJTk9fVE9fSU5PKG1wLGEsaSkJXAorCSgoKHhmc19pbm9fdCkoYSkgPDwgWEZTX0lOT19BR0lOT19CSVRTKG1wKSkgfCAoaSkpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0FHSU5PX1RPX0FHQk5PKQoreGZzX2FnYmxvY2tfdCB4ZnNfYWdpbm9fdG9fYWdibm8oc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19hZ2lub190IGkpOworI2RlZmluZQlYRlNfQUdJTk9fVE9fQUdCTk8obXAsaSkJeGZzX2FnaW5vX3RvX2FnYm5vKG1wLGkpCisjZWxzZQorI2RlZmluZQlYRlNfQUdJTk9fVE9fQUdCTk8obXAsaSkJKChpKSA+PiBYRlNfSU5PX09GRlNFVF9CSVRTKG1wKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQUdJTk9fVE9fT0ZGU0VUKQoraW50IHhmc19hZ2lub190b19vZmZzZXQoc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19hZ2lub190IGkpOworI2RlZmluZQlYRlNfQUdJTk9fVE9fT0ZGU0VUKG1wLGkpCXhmc19hZ2lub190b19vZmZzZXQobXAsaSkKKyNlbHNlCisjZGVmaW5lCVhGU19BR0lOT19UT19PRkZTRVQobXAsaSkJXAorCSgoaSkgJiBYRlNfSU5PX01BU0soWEZTX0lOT19PRkZTRVRfQklUUyhtcCkpKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX09GRkJOT19UT19BR0lOTykKK3hmc19hZ2lub190IHhmc19vZmZibm9fdG9fYWdpbm8oc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19hZ2Jsb2NrX3QgYiwgaW50IG8pOworI2RlZmluZQlYRlNfT0ZGQk5PX1RPX0FHSU5PKG1wLGIsbykJeGZzX29mZmJub190b19hZ2lubyhtcCxiLG8pCisjZWxzZQorI2RlZmluZQlYRlNfT0ZGQk5PX1RPX0FHSU5PKG1wLGIsbykJXAorCSgoeGZzX2FnaW5vX3QpKCgoYikgPDwgWEZTX0lOT19PRkZTRVRfQklUUyhtcCkpIHwgKG8pKSkKKyNlbmRpZgorCisjaWYgWEZTX0JJR19JTlVNUworI2RlZmluZQlYRlNfTUFYSU5VTUJFUgkJKCh4ZnNfaW5vX3QpKCgxVUxMIDw8IDU2KSAtIDFVTEwpKQorI2RlZmluZQlYRlNfSU5PNjRfT0ZGU0VUCSgoeGZzX2lub190KSgxVUxMIDw8IDMyKSkKKyNlbHNlCisjZGVmaW5lCVhGU19NQVhJTlVNQkVSCQkoKHhmc19pbm9fdCkoKDFVTEwgPDwgMzIpIC0gMVVMTCkpCisjZW5kaWYKKyNkZWZpbmUJWEZTX01BWElOVU1CRVJfMzIJKCh4ZnNfaW5vX3QpKCgxVUxMIDw8IDMyKSAtIDFVTEwpKQorCisjZW5kaWYJLyogX19YRlNfSU5VTV9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfaW9jb3JlLmMgYi9mcy94ZnMveGZzX2lvY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNGVjNDkKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2lvY29yZS5jCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisjaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc190eXBlcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19hZy5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19pdGFibGUuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlX2l0ZW0uaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcC5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKKyNpbmNsdWRlICJ4ZnNfcncuaCIKKyNpbmNsdWRlICJ4ZnNfcXVvdGEuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnNfc3BhY2UuaCIKKyNpbmNsdWRlICJ4ZnNfaW9tYXAuaCIKKworCitTVEFUSUMgeGZzX2ZzaXplX3QKK3hmc19zaXplX2ZuKAorCXhmc19pbm9kZV90CQkqaXApCit7CisJcmV0dXJuIChpcC0+aV9kLmRpX3NpemUpOworfQorCitTVEFUSUMgaW50Cit4ZnNfaW9pbml0KAorCXN0cnVjdCB2ZnMJCSp2ZnNwLAorCXN0cnVjdCB4ZnNfbW91bnRfYXJncwkqbW50YXJncywKKwlpbnQJCQlmbGFncykKK3sKKwlyZXR1cm4geGZzX21vdW50ZnModmZzcCwgWEZTX1ZGU1RPTSh2ZnNwKSwgZmxhZ3MpOworfQorCit4ZnNfaW9vcHNfdAl4ZnNfaW9jb3JlX3hmcyA9IHsKKwkueGZzX2lvaW5pdAkJPSAoeGZzX2lvaW5pdF90KSB4ZnNfaW9pbml0LAorCS54ZnNfYm1hcGlfZnVuYwkJPSAoeGZzX2JtYXBpX3QpIHhmc19ibWFwaSwKKwkueGZzX2JtYXBfZW9mX2Z1bmMJPSAoeGZzX2JtYXBfZW9mX3QpIHhmc19ibWFwX2VvZiwKKwkueGZzX2lvbWFwX3dyaXRlX2RpcmVjdCA9CisJCQkoeGZzX2lvbWFwX3dyaXRlX2RpcmVjdF90KSB4ZnNfaW9tYXBfd3JpdGVfZGlyZWN0LAorCS54ZnNfaW9tYXBfd3JpdGVfZGVsYXkgPQorCQkJKHhmc19pb21hcF93cml0ZV9kZWxheV90KSB4ZnNfaW9tYXBfd3JpdGVfZGVsYXksCisJLnhmc19pb21hcF93cml0ZV9hbGxvY2F0ZSA9CisJCQkoeGZzX2lvbWFwX3dyaXRlX2FsbG9jYXRlX3QpIHhmc19pb21hcF93cml0ZV9hbGxvY2F0ZSwKKwkueGZzX2lvbWFwX3dyaXRlX3Vud3JpdHRlbiA9CisJCQkoeGZzX2lvbWFwX3dyaXRlX3Vud3JpdHRlbl90KSB4ZnNfaW9tYXBfd3JpdGVfdW53cml0dGVuLAorCS54ZnNfaWxvY2sJCT0gKHhmc19sb2NrX3QpIHhmc19pbG9jaywKKwkueGZzX2xja19tYXBfc2hhcmVkCT0gKHhmc19sY2tfbWFwX3NoYXJlZF90KSB4ZnNfaWxvY2tfbWFwX3NoYXJlZCwKKwkueGZzX2lsb2NrX2RlbW90ZQk9ICh4ZnNfbG9ja19kZW1vdGVfdCkgeGZzX2lsb2NrX2RlbW90ZSwKKwkueGZzX2lsb2NrX25vd2FpdAk9ICh4ZnNfbG9ja19ub3dhaXRfdCkgeGZzX2lsb2NrX25vd2FpdCwKKwkueGZzX3VubG9jawkJPSAoeGZzX3VubGtfdCkgeGZzX2l1bmxvY2ssCisJLnhmc19zaXplX2Z1bmMJCT0gKHhmc19zaXplX3QpIHhmc19zaXplX2ZuLAorCS54ZnNfaW9kb25lCQk9ICh4ZnNfaW9kb25lX3QpIGZzX25vZXJyLAorfTsKKwordm9pZAoreGZzX2lvY29yZV9pbm9kZV9yZWluaXQoCisJeGZzX2lub2RlX3QJKmlwKQoreworCXhmc19pb2NvcmVfdAkqaW8gPSAmaXAtPmlfaW9jb3JlOworCisJaW8tPmlvX2ZsYWdzID0gMDsKKwlpZiAoaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUkVBTFRJTUUpCisJCWlvLT5pb19mbGFncyB8PSBYRlNfSU9DT1JFX1JUOworCWlvLT5pb19kbWV2bWFzayA9IGlwLT5pX2QuZGlfZG1ldm1hc2s7CisJaW8tPmlvX2Rtc3RhdGUgPSBpcC0+aV9kLmRpX2Rtc3RhdGU7Cit9CisKK3ZvaWQKK3hmc19pb2NvcmVfaW5vZGVfaW5pdCgKKwl4ZnNfaW5vZGVfdAkqaXApCit7CisJeGZzX2lvY29yZV90CSppbyA9ICZpcC0+aV9pb2NvcmU7CisJeGZzX21vdW50X3QJKm1wID0gaXAtPmlfbW91bnQ7CisKKwlpby0+aW9fbW91bnQgPSBtcDsKKyNpZmRlZiBERUJVRworCWlvLT5pb19sb2NrID0gJmlwLT5pX2xvY2s7CisJaW8tPmlvX2lvbG9jayA9ICZpcC0+aV9pb2xvY2s7CisjZW5kaWYKKworCWlvLT5pb19vYmogPSAodm9pZCAqKWlwOworCisJeGZzX2lvY29yZV9pbm9kZV9yZWluaXQoaXApOworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pb21hcC5jIGIvZnMveGZzL3hmc19pb21hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MjZlOGYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2lvbWFwLmMKQEAgLTAsMCArMSwxMDAwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLgkgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisKKyNpbmNsdWRlICJ4ZnNfZnMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfcXVvdGEuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2JtYXAuaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCisjaW5jbHVkZSAieGZzX3J0YWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKKyNpbmNsdWRlICJ4ZnNfaXRhYmxlLmgiCisjaW5jbHVkZSAieGZzX3J3LmgiCisjaW5jbHVkZSAieGZzX2FjbC5oIgorI2luY2x1ZGUgInhmc19jYXAuaCIKKyNpbmNsdWRlICJ4ZnNfbWFjLmgiCisjaW5jbHVkZSAieGZzX2F0dHIuaCIKKyNpbmNsdWRlICJ4ZnNfYnVmX2l0ZW0uaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnNfc3BhY2UuaCIKKyNpbmNsdWRlICJ4ZnNfdXRpbHMuaCIKKyNpbmNsdWRlICJ4ZnNfaW9tYXAuaCIKKworI2lmIGRlZmluZWQoWEZTX1JXX1RSQUNFKQordm9pZAoreGZzX2lvbWFwX2VudGVyX3RyYWNlKAorCWludAkJdGFnLAorCXhmc19pb2NvcmVfdAkqaW8sCisJeGZzX29mZl90CW9mZnNldCwKKwlzc2l6ZV90CQljb3VudCkKK3sKKwl4ZnNfaW5vZGVfdAkqaXAgPSBYRlNfSU9fSU5PREUoaW8pOworCisJaWYgKCFpcC0+aV9yd3RyYWNlKQorCQlyZXR1cm47CisKKwlrdHJhY2VfZW50ZXIoaXAtPmlfcnd0cmFjZSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpdGFnKSwKKwkJKHZvaWQgKilpcCwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKChpcC0+aV9kLmRpX3NpemUgPj4gMzIpICYgMHhmZmZmZmZmZikpLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoaXAtPmlfZC5kaV9zaXplICYgMHhmZmZmZmZmZikpLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoKG9mZnNldCA+PiAzMikgJiAweGZmZmZmZmZmKSksCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKShvZmZzZXQgJiAweGZmZmZmZmZmKSksCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKWNvdW50KSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKChpby0+aW9fbmV3X3NpemUgPj4gMzIpICYgMHhmZmZmZmZmZikpLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoaW8tPmlvX25ld19zaXplICYgMHhmZmZmZmZmZikpLAorCQkodm9pZCAqKU5VTEwsCisJCSh2b2lkICopTlVMTCwKKwkJKHZvaWQgKilOVUxMLAorCQkodm9pZCAqKU5VTEwsCisJCSh2b2lkICopTlVMTCwKKwkJKHZvaWQgKilOVUxMLAorCQkodm9pZCAqKU5VTEwpOworfQorCit2b2lkCit4ZnNfaW9tYXBfbWFwX3RyYWNlKAorCWludAkJdGFnLAorCXhmc19pb2NvcmVfdAkqaW8sCisJeGZzX29mZl90CW9mZnNldCwKKwlzc2l6ZV90CQljb3VudCwKKwl4ZnNfaW9tYXBfdAkqaW9tYXBwLAorCXhmc19ibWJ0X2lyZWNfdAkqaW1hcHAsCisJaW50CQlmbGFncykKK3sKKwl4ZnNfaW5vZGVfdAkqaXAgPSBYRlNfSU9fSU5PREUoaW8pOworCisJaWYgKCFpcC0+aV9yd3RyYWNlKQorCQlyZXR1cm47CisKKwlrdHJhY2VfZW50ZXIoaXAtPmlfcnd0cmFjZSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpdGFnKSwKKwkJKHZvaWQgKilpcCwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKChpcC0+aV9kLmRpX3NpemUgPj4gMzIpICYgMHhmZmZmZmZmZikpLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoaXAtPmlfZC5kaV9zaXplICYgMHhmZmZmZmZmZikpLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoKG9mZnNldCA+PiAzMikgJiAweGZmZmZmZmZmKSksCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKShvZmZzZXQgJiAweGZmZmZmZmZmKSksCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKWNvdW50KSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpZmxhZ3MpLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoKGlvbWFwcC0+aW9tYXBfb2Zmc2V0ID4+IDMyKSAmIDB4ZmZmZmZmZmYpKSwKKwkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpKGlvbWFwcC0+aW9tYXBfb2Zmc2V0ICYgMHhmZmZmZmZmZikpLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoaW9tYXBwLT5pb21hcF9kZWx0YSkpLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoaW9tYXBwLT5pb21hcF9ic2l6ZSkpLAorCQkodm9pZCAqKSgodW5zaWduZWQgbG9uZykoaW9tYXBwLT5pb21hcF9ibikpLAorCQkodm9pZCAqKShfX3BzaW50X3QpKGltYXBwLT5icl9zdGFydG9mZiksCisJCSh2b2lkICopKCh1bnNpZ25lZCBsb25nKShpbWFwcC0+YnJfYmxvY2tjb3VudCkpLAorCQkodm9pZCAqKShfX3BzaW50X3QpKGltYXBwLT5icl9zdGFydGJsb2NrKSk7Cit9CisjZWxzZQorI2RlZmluZSB4ZnNfaW9tYXBfZW50ZXJfdHJhY2UodGFnLCBpbywgb2Zmc2V0LCBjb3VudCkKKyNkZWZpbmUgeGZzX2lvbWFwX21hcF90cmFjZSh0YWcsIGlvLCBvZmZzZXQsIGNvdW50LCBpb21hcHAsIGltYXBwLCBmbGFncykKKyNlbmRpZgorCisjZGVmaW5lIFhGU19XUklURUlPX0FMSUdOKG1wLG9mZikJKCgob2ZmKSA+PiBtcC0+bV93cml0ZWlvX2xvZykgXAorCQkJCQkJPDwgbXAtPm1fd3JpdGVpb19sb2cpCisjZGVmaW5lIFhGU19TVFJBVF9XUklURV9JTUFQUwkyCisjZGVmaW5lIFhGU19XUklURV9JTUFQUwkJWEZTX0JNQVBfTUFYX05NQVAKKworU1RBVElDIGludAoreGZzX2ltYXBfdG9fYm1hcCgKKwl4ZnNfaW9jb3JlX3QJKmlvLAorCXhmc19vZmZfdAlvZmZzZXQsCisJeGZzX2JtYnRfaXJlY190ICppbWFwLAorCXhmc19pb21hcF90CSppb21hcHAsCisJaW50CQlpbWFwcywJCQkvKiBOdW1iZXIgb2YgaW1hcCBlbnRyaWVzICovCisJaW50CQlpb21hcHMsCQkJLyogTnVtYmVyIG9mIGlvbWFwIGVudHJpZXMgKi8KKwlpbnQJCWZsYWdzKQoreworCXhmc19tb3VudF90CSptcDsKKwl4ZnNfZnNpemVfdAluaXNpemU7CisJaW50CQlwYm07CisJeGZzX2ZzYmxvY2tfdAlzdGFydF9ibG9jazsKKworCW1wID0gaW8tPmlvX21vdW50OworCW5pc2l6ZSA9IFhGU19TSVpFKG1wLCBpbyk7CisJaWYgKGlvLT5pb19uZXdfc2l6ZSA+IG5pc2l6ZSkKKwkJbmlzaXplID0gaW8tPmlvX25ld19zaXplOworCisJZm9yIChwYm0gPSAwOyBpbWFwcyAmJiBwYm0gPCBpb21hcHM7IGltYXBzLS0sIGlvbWFwcCsrLCBpbWFwKyssIHBibSsrKSB7CisJCWlvbWFwcC0+aW9tYXBfb2Zmc2V0ID0gWEZTX0ZTQl9UT19CKG1wLCBpbWFwLT5icl9zdGFydG9mZik7CisJCWlvbWFwcC0+aW9tYXBfZGVsdGEgPSBvZmZzZXQgLSBpb21hcHAtPmlvbWFwX29mZnNldDsKKwkJaW9tYXBwLT5pb21hcF9ic2l6ZSA9IFhGU19GU0JfVE9fQihtcCwgaW1hcC0+YnJfYmxvY2tjb3VudCk7CisJCWlvbWFwcC0+aW9tYXBfZmxhZ3MgPSBmbGFnczsKKworCQlpZiAoaW8tPmlvX2ZsYWdzICYgWEZTX0lPQ09SRV9SVCkgeworCQkJaW9tYXBwLT5pb21hcF9mbGFncyB8PSBJT01BUF9SRUFMVElNRTsKKwkJCWlvbWFwcC0+aW9tYXBfdGFyZ2V0ID0gbXAtPm1fcnRkZXZfdGFyZ3A7CisJCX0gZWxzZSB7CisJCQlpb21hcHAtPmlvbWFwX3RhcmdldCA9IG1wLT5tX2RkZXZfdGFyZ3A7CisJCX0KKwkJc3RhcnRfYmxvY2sgPSBpbWFwLT5icl9zdGFydGJsb2NrOworCQlpZiAoc3RhcnRfYmxvY2sgPT0gSE9MRVNUQVJUQkxPQ0spIHsKKwkJCWlvbWFwcC0+aW9tYXBfYm4gPSBJT01BUF9EQUREUl9OVUxMOworCQkJaW9tYXBwLT5pb21hcF9mbGFncyB8PSBJT01BUF9IT0xFOworCQl9IGVsc2UgaWYgKHN0YXJ0X2Jsb2NrID09IERFTEFZU1RBUlRCTE9DSykgeworCQkJaW9tYXBwLT5pb21hcF9ibiA9IElPTUFQX0RBRERSX05VTEw7CisJCQlpb21hcHAtPmlvbWFwX2ZsYWdzIHw9IElPTUFQX0RFTEFZOworCQl9IGVsc2UgeworCQkJaW9tYXBwLT5pb21hcF9ibiA9IFhGU19GU0JfVE9fREJfSU8oaW8sIHN0YXJ0X2Jsb2NrKTsKKwkJCWlmIChJU1VOV1JJVFRFTihpbWFwKSkKKwkJCQlpb21hcHAtPmlvbWFwX2ZsYWdzIHw9IElPTUFQX1VOV1JJVFRFTjsKKwkJfQorCisJCWlmICgoaW9tYXBwLT5pb21hcF9vZmZzZXQgKyBpb21hcHAtPmlvbWFwX2JzaXplKSA+PSBuaXNpemUpIHsKKwkJCWlvbWFwcC0+aW9tYXBfZmxhZ3MgfD0gSU9NQVBfRU9GOworCQl9CisKKwkJb2Zmc2V0ICs9IGlvbWFwcC0+aW9tYXBfYnNpemUgLSBpb21hcHAtPmlvbWFwX2RlbHRhOworCX0KKwlyZXR1cm4gcGJtOwkvKiBSZXR1cm4gdGhlIG51bWJlciBmaWxsZWQgKi8KK30KKworaW50Cit4ZnNfaW9tYXAoCisJeGZzX2lvY29yZV90CSppbywKKwl4ZnNfb2ZmX3QJb2Zmc2V0LAorCXNzaXplX3QJCWNvdW50LAorCWludAkJZmxhZ3MsCisJeGZzX2lvbWFwX3QJKmlvbWFwcCwKKwlpbnQJCSpuaW9tYXBzKQoreworCXhmc19tb3VudF90CSptcCA9IGlvLT5pb19tb3VudDsKKwl4ZnNfZmlsZW9mZl90CW9mZnNldF9mc2IsIGVuZF9mc2I7CisJaW50CQllcnJvciA9IDA7CisJaW50CQlsb2NrbW9kZSA9IDA7CisJeGZzX2JtYnRfaXJlY190CWltYXA7CisJaW50CQluaW1hcHMgPSAxOworCWludAkJYm1hcGlfZmxhZ3MgPSAwOworCWludAkJaW9tYXBfZmxhZ3MgPSAwOworCisJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisKKwlzd2l0Y2ggKGZsYWdzICYKKwkJKEJNQVBJX1JFQUQgfCBCTUFQSV9XUklURSB8IEJNQVBJX0FMTE9DQVRFIHwKKwkJIEJNQVBJX1VOV1JJVFRFTiB8IEJNQVBJX0RFVklDRSkpIHsKKwljYXNlIEJNQVBJX1JFQUQ6CisJCXhmc19pb21hcF9lbnRlcl90cmFjZShYRlNfSU9NQVBfUkVBRF9FTlRFUiwgaW8sIG9mZnNldCwgY291bnQpOworCQlsb2NrbW9kZSA9IFhGU19MQ0tfTUFQX1NIQVJFRChtcCwgaW8pOworCQlibWFwaV9mbGFncyA9IFhGU19CTUFQSV9FTlRJUkU7CisJCWlmIChmbGFncyAmIEJNQVBJX0lHTlNUQVRFKQorCQkJYm1hcGlfZmxhZ3MgfD0gWEZTX0JNQVBJX0lHU1RBVEU7CisJCWJyZWFrOworCWNhc2UgQk1BUElfV1JJVEU6CisJCXhmc19pb21hcF9lbnRlcl90cmFjZShYRlNfSU9NQVBfV1JJVEVfRU5URVIsIGlvLCBvZmZzZXQsIGNvdW50KTsKKwkJbG9ja21vZGUgPSBYRlNfSUxPQ0tfRVhDTHxYRlNfRVhUU0laRV9XUjsKKwkJYm1hcGlfZmxhZ3MgPSAwOworCQlYRlNfSUxPQ0sobXAsIGlvLCBsb2NrbW9kZSk7CisJCWJyZWFrOworCWNhc2UgQk1BUElfQUxMT0NBVEU6CisJCXhmc19pb21hcF9lbnRlcl90cmFjZShYRlNfSU9NQVBfQUxMT0NfRU5URVIsIGlvLCBvZmZzZXQsIGNvdW50KTsKKwkJbG9ja21vZGUgPSBYRlNfSUxPQ0tfU0hBUkVEfFhGU19FWFRTSVpFX1JEOworCQlibWFwaV9mbGFncyA9IFhGU19CTUFQSV9FTlRJUkU7CisJCS8qIEF0dGVtcHQgbm9uLWJsb2NraW5nIGxvY2sgKi8KKwkJaWYgKGZsYWdzICYgQk1BUElfVFJZTE9DSykgeworCQkJaWYgKCFYRlNfSUxPQ0tfTk9XQUlUKG1wLCBpbywgbG9ja21vZGUpKQorCQkJCXJldHVybiBYRlNfRVJST1IoRUFHQUlOKTsKKwkJfSBlbHNlIHsKKwkJCVhGU19JTE9DSyhtcCwgaW8sIGxvY2ttb2RlKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEJNQVBJX1VOV1JJVFRFTjoKKwkJZ290byBwaGFzZTI7CisJY2FzZSBCTUFQSV9ERVZJQ0U6CisJCWxvY2ttb2RlID0gWEZTX0xDS19NQVBfU0hBUkVEKG1wLCBpbyk7CisJCWlvbWFwcC0+aW9tYXBfdGFyZ2V0ID0gaW8tPmlvX2ZsYWdzICYgWEZTX0lPQ09SRV9SVCA/CisJCQltcC0+bV9ydGRldl90YXJncCA6IG1wLT5tX2RkZXZfdGFyZ3A7CisJCWVycm9yID0gMDsKKwkJKm5pb21hcHMgPSAxOworCQlnb3RvIG91dDsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwlBU1NFUlQob2Zmc2V0IDw9IG1wLT5tX21heGlvZmZzZXQpOworCWlmICgoeGZzX2ZzaXplX3Qpb2Zmc2V0ICsgY291bnQgPiBtcC0+bV9tYXhpb2Zmc2V0KQorCQljb3VudCA9IG1wLT5tX21heGlvZmZzZXQgLSBvZmZzZXQ7CisJZW5kX2ZzYiA9IFhGU19CX1RPX0ZTQihtcCwgKHhmc191ZnNpemVfdClvZmZzZXQgKyBjb3VudCk7CisJb2Zmc2V0X2ZzYiA9IFhGU19CX1RPX0ZTQlQobXAsIG9mZnNldCk7CisKKwllcnJvciA9IFhGU19CTUFQSShtcCwgTlVMTCwgaW8sIG9mZnNldF9mc2IsCisJCQkoeGZzX2ZpbGJsa3NfdCkoZW5kX2ZzYiAtIG9mZnNldF9mc2IpLAorCQkJYm1hcGlfZmxhZ3MsICBOVUxMLCAwLCAmaW1hcCwKKwkJCSZuaW1hcHMsIE5VTEwpOworCisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKworcGhhc2UyOgorCXN3aXRjaCAoZmxhZ3MgJiAoQk1BUElfV1JJVEV8Qk1BUElfQUxMT0NBVEV8Qk1BUElfVU5XUklUVEVOKSkgeworCWNhc2UgQk1BUElfV1JJVEU6CisJCS8qIElmIHdlIGZvdW5kIGFuIGV4dGVudCwgcmV0dXJuIGl0ICovCisJCWlmIChuaW1hcHMgJiYgKGltYXAuYnJfc3RhcnRibG9jayAhPSBIT0xFU1RBUlRCTE9DSykpIHsKKwkJCXhmc19pb21hcF9tYXBfdHJhY2UoWEZTX0lPTUFQX1dSSVRFX01BUCwgaW8sCisJCQkJCW9mZnNldCwgY291bnQsIGlvbWFwcCwgJmltYXAsIGZsYWdzKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGZsYWdzICYgKEJNQVBJX0RJUkVDVHxCTUFQSV9NTUFQKSkgeworCQkJZXJyb3IgPSBYRlNfSU9NQVBfV1JJVEVfRElSRUNUKG1wLCBpbywgb2Zmc2V0LAorCQkJCQljb3VudCwgZmxhZ3MsICZpbWFwLCAmbmltYXBzLCBuaW1hcHMpOworCQl9IGVsc2UgeworCQkJZXJyb3IgPSBYRlNfSU9NQVBfV1JJVEVfREVMQVkobXAsIGlvLCBvZmZzZXQsIGNvdW50LAorCQkJCQlmbGFncywgJmltYXAsICZuaW1hcHMpOworCQl9CisJCWlmICghZXJyb3IpIHsKKwkJCXhmc19pb21hcF9tYXBfdHJhY2UoWEZTX0lPTUFQX0FMTE9DX01BUCwgaW8sCisJCQkJCW9mZnNldCwgY291bnQsIGlvbWFwcCwgJmltYXAsIGZsYWdzKTsKKwkJfQorCQlpb21hcF9mbGFncyA9IElPTUFQX05FVzsKKwkJYnJlYWs7CisJY2FzZSBCTUFQSV9BTExPQ0FURToKKwkJLyogSWYgd2UgZm91bmQgYW4gZXh0ZW50LCByZXR1cm4gaXQgKi8KKwkJWEZTX0lVTkxPQ0sobXAsIGlvLCBsb2NrbW9kZSk7CisJCWxvY2ttb2RlID0gMDsKKworCQlpZiAobmltYXBzICYmICFJU05VTExTVEFSVEJMT0NLKGltYXAuYnJfc3RhcnRibG9jaykpIHsKKwkJCXhmc19pb21hcF9tYXBfdHJhY2UoWEZTX0lPTUFQX1dSSVRFX01BUCwgaW8sCisJCQkJCW9mZnNldCwgY291bnQsIGlvbWFwcCwgJmltYXAsIGZsYWdzKTsKKwkJCWJyZWFrOworCQl9CisKKwkJZXJyb3IgPSBYRlNfSU9NQVBfV1JJVEVfQUxMT0NBVEUobXAsIGlvLCAmaW1hcCwgJm5pbWFwcyk7CisJCWJyZWFrOworCWNhc2UgQk1BUElfVU5XUklUVEVOOgorCQlsb2NrbW9kZSA9IDA7CisJCWVycm9yID0gWEZTX0lPTUFQX1dSSVRFX1VOV1JJVFRFTihtcCwgaW8sIG9mZnNldCwgY291bnQpOworCQluaW1hcHMgPSAwOworCQlicmVhazsKKwl9CisKKwlpZiAobmltYXBzKSB7CisJCSpuaW9tYXBzID0geGZzX2ltYXBfdG9fYm1hcChpbywgb2Zmc2V0LCAmaW1hcCwKKwkJCQkJICAgIGlvbWFwcCwgbmltYXBzLCAqbmlvbWFwcywgaW9tYXBfZmxhZ3MpOworCX0gZWxzZSBpZiAobmlvbWFwcykgeworCQkqbmlvbWFwcyA9IDA7CisJfQorCitvdXQ6CisJaWYgKGxvY2ttb2RlKQorCQlYRlNfSVVOTE9DSyhtcCwgaW8sIGxvY2ttb2RlKTsKKwlyZXR1cm4gWEZTX0VSUk9SKGVycm9yKTsKK30KKworU1RBVElDIGludAoreGZzX2ZsdXNoX3NwYWNlKAorCXhmc19pbm9kZV90CSppcCwKKwlpbnQJCSpmc3luY2VkLAorCWludAkJKmlvZmxhZ3MpCit7CisJc3dpdGNoICgqZnN5bmNlZCkgeworCWNhc2UgMDoKKwkJaWYgKGlwLT5pX2RlbGF5ZWRfYmxrcykgeworCQkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwkJCXhmc19mbHVzaF9pbm9kZShpcCk7CisJCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwkJCSpmc3luY2VkID0gMTsKKwkJfSBlbHNlIHsKKwkJCSppb2ZsYWdzIHw9IEJNQVBJX1NZTkM7CisJCQkqZnN5bmNlZCA9IDI7CisJCX0KKwkJcmV0dXJuIDA7CisJY2FzZSAxOgorCQkqZnN5bmNlZCA9IDI7CisJCSppb2ZsYWdzIHw9IEJNQVBJX1NZTkM7CisJCXJldHVybiAwOworCWNhc2UgMjoKKwkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwkJeGZzX2ZsdXNoX2RldmljZShpcCk7CisJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQkqZnN5bmNlZCA9IDM7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworaW50Cit4ZnNfaW9tYXBfd3JpdGVfZGlyZWN0KAorCXhmc19pbm9kZV90CSppcCwKKwlsb2ZmX3QJCW9mZnNldCwKKwlzaXplX3QJCWNvdW50LAorCWludAkJZmxhZ3MsCisJeGZzX2JtYnRfaXJlY190ICpyZXRfaW1hcCwKKwlpbnQJCSpubWFwcywKKwlpbnQJCWZvdW5kKQoreworCXhmc19tb3VudF90CSptcCA9IGlwLT5pX21vdW50OworCXhmc19pb2NvcmVfdAkqaW8gPSAmaXAtPmlfaW9jb3JlOworCXhmc19maWxlb2ZmX3QJb2Zmc2V0X2ZzYjsKKwl4ZnNfZmlsZW9mZl90CWxhc3RfZnNiOworCXhmc19maWxibGtzX3QJY291bnRfZnNiOworCXhmc19mc2l6ZV90CWlzaXplOworCXhmc19mc2Jsb2NrX3QJZmlyc3Rmc2I7CisJaW50CQluaW1hcHMsIG1hcHM7CisJaW50CQllcnJvcjsKKwlpbnQJCWJtYXBpX2ZsYWc7CisJaW50CQlydDsKKwl4ZnNfdHJhbnNfdAkqdHA7CisJeGZzX2JtYnRfaXJlY190IGltYXBbWEZTX1dSSVRFX0lNQVBTXSwgKmltYXBwOworCXhmc19ibWFwX2ZyZWVfdCBmcmVlX2xpc3Q7CisJaW50CQlhZW9mOworCXhmc19maWxibGtzX3QJZGF0YWJsb2NrczsKKwlpbnQJCWNvbW1pdHRlZDsKKwlpbnQJCW51bXJ0ZXh0ZW50czsKKwl1aW50CQlyZXNibGtzOworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhhdCB0aGUgZHF1b3RzIGFyZSB0aGVyZS4gVGhpcyBkb2Vzbid0IGhvbGQKKwkgKiB0aGUgaWxvY2sgYWNyb3NzIGEgZGlzayByZWFkLgorCSAqLworCWVycm9yID0gWEZTX1FNX0RRQVRUQUNIKGlwLT5pX21vdW50LCBpcCwgWEZTX1FNT1BUX0lMT0NLRUQpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIFhGU19FUlJPUihlcnJvcik7CisKKwltYXBzID0gbWluKFhGU19XUklURV9JTUFQUywgKm5tYXBzKTsKKwluaW1hcHMgPSBtYXBzOworCisJaXNpemUgPSBpcC0+aV9kLmRpX3NpemU7CisJYWVvZiA9IChvZmZzZXQgKyBjb3VudCkgPiBpc2l6ZTsKKworCWlmIChpby0+aW9fbmV3X3NpemUgPiBpc2l6ZSkKKwkJaXNpemUgPSBpby0+aW9fbmV3X3NpemU7CisKKwlvZmZzZXRfZnNiID0gWEZTX0JfVE9fRlNCVChtcCwgb2Zmc2V0KTsKKwlsYXN0X2ZzYiA9IFhGU19CX1RPX0ZTQihtcCwgKCh4ZnNfdWZzaXplX3QpKG9mZnNldCArIGNvdW50KSkpOworCWNvdW50X2ZzYiA9IGxhc3RfZnNiIC0gb2Zmc2V0X2ZzYjsKKwlpZiAoZm91bmQgJiYgKHJldF9pbWFwLT5icl9zdGFydGJsb2NrID09IEhPTEVTVEFSVEJMT0NLKSkgeworCQl4ZnNfZmlsZW9mZl90CW1hcF9sYXN0X2ZzYjsKKworCQltYXBfbGFzdF9mc2IgPSByZXRfaW1hcC0+YnJfYmxvY2tjb3VudCArIHJldF9pbWFwLT5icl9zdGFydG9mZjsKKworCQlpZiAobWFwX2xhc3RfZnNiIDwgbGFzdF9mc2IpIHsKKwkJCWxhc3RfZnNiID0gbWFwX2xhc3RfZnNiOworCQkJY291bnRfZnNiID0gbGFzdF9mc2IgLSBvZmZzZXRfZnNiOworCQl9CisJCUFTU0VSVChjb3VudF9mc2IgPiAwKTsKKwl9CisKKwkvKgorCSAqIGRldGVybWluZSBpZiByZXNlcnZpbmcgc3BhY2Ugb24KKwkgKiB0aGUgZGF0YSBvciByZWFsdGltZSBwYXJ0aXRpb24uCisJICovCisJaWYgKChydCA9IFhGU19JU19SRUFMVElNRV9JTk9ERShpcCkpKSB7CisJCWludAlzYnJ0ZXh0c2l6ZSwgaXBydGV4dHNpemU7CisKKwkJc2JydGV4dHNpemUgPSBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKKwkJaXBydGV4dHNpemUgPQorCQkJaXAtPmlfZC5kaV9leHRzaXplID8gaXAtPmlfZC5kaV9leHRzaXplIDogc2JydGV4dHNpemU7CisJCW51bXJ0ZXh0ZW50cyA9IChjb3VudF9mc2IgKyBpcHJ0ZXh0c2l6ZSAtIDEpOworCQlkb19kaXYobnVtcnRleHRlbnRzLCBzYnJ0ZXh0c2l6ZSk7CisJCWRhdGFibG9ja3MgPSAwOworCX0gZWxzZSB7CisJCWRhdGFibG9ja3MgPSBjb3VudF9mc2I7CisJCW51bXJ0ZXh0ZW50cyA9IDA7CisJfQorCisJLyoKKwkgKiBhbGxvY2F0ZSBhbmQgc2V0dXAgdGhlIHRyYW5zYWN0aW9uCisJICovCisJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwl0cCA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX0RJT1NUUkFUKTsKKworCXJlc2Jsa3MgPSBYRlNfRElPU1RSQVRfU1BBQ0VfUkVTKG1wLCBkYXRhYmxvY2tzKTsKKworCWVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIHJlc2Jsa3MsCisJCQlYRlNfV1JJVEVfTE9HX1JFUyhtcCksIG51bXJ0ZXh0ZW50cywKKwkJCVhGU19UUkFOU19QRVJNX0xPR19SRVMsCisJCQlYRlNfV1JJVEVfTE9HX0NPVU5UKTsKKworCS8qCisJICogY2hlY2sgZm9yIHJ1bm5pbmcgb3V0IG9mIHNwYWNlCisJICovCisJaWYgKGVycm9yKQorCQkvKgorCQkgKiBGcmVlIHRoZSB0cmFuc2FjdGlvbiBzdHJ1Y3R1cmUuCisJCSAqLworCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCAwKTsKKworCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCisJaWYgKGVycm9yKQorCQlnb3RvIGVycm9yX291dDsgLyogRG9uJ3QgcmV0dXJuIGluIGFib3ZlIGlmIC4uIHRyYW5zIC4uLAorCQkJCQluZWVkIGxvY2sgdG8gcmV0dXJuICovCisKKwlpZiAoWEZTX1RSQU5TX1JFU0VSVkVfQkxLUVVPVEEobXAsIHRwLCBpcCwgcmVzYmxrcykpIHsKKwkJZXJyb3IgPSAoRURRVU9UKTsKKwkJZ290byBlcnJvcjE7CisJfQorCW5pbWFwcyA9IDE7CisKKwlibWFwaV9mbGFnID0gWEZTX0JNQVBJX1dSSVRFOworCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKKwl4ZnNfdHJhbnNfaWhvbGQodHAsIGlwKTsKKworCWlmICghKGZsYWdzICYgQk1BUElfTU1BUCkgJiYgKG9mZnNldCA8IGlwLT5pX2QuZGlfc2l6ZSB8fCBydCkpCisJCWJtYXBpX2ZsYWcgfD0gWEZTX0JNQVBJX1BSRUFMTE9DOworCisJLyoKKwkgKiBpc3N1ZSB0aGUgYm1hcGkoKSBjYWxsIHRvIGFsbG9jYXRlIHRoZSBibG9ja3MKKwkgKi8KKwlYRlNfQk1BUF9JTklUKCZmcmVlX2xpc3QsICZmaXJzdGZzYik7CisJaW1hcHAgPSAmaW1hcFswXTsKKwllcnJvciA9IHhmc19ibWFwaSh0cCwgaXAsIG9mZnNldF9mc2IsIGNvdW50X2ZzYiwKKwkJYm1hcGlfZmxhZywgJmZpcnN0ZnNiLCAwLCBpbWFwcCwgJm5pbWFwcywgJmZyZWVfbGlzdCk7CisJaWYgKGVycm9yKSB7CisJCWdvdG8gZXJyb3IwOworCX0KKworCS8qCisJICogY29tcGxldGUgdGhlIHRyYW5zYWN0aW9uCisJICovCisKKwllcnJvciA9IHhmc19ibWFwX2ZpbmlzaCgmdHAsICZmcmVlX2xpc3QsIGZpcnN0ZnNiLCAmY29tbWl0dGVkKTsKKwlpZiAoZXJyb3IpIHsKKwkJZ290byBlcnJvcjA7CisJfQorCisJZXJyb3IgPSB4ZnNfdHJhbnNfY29tbWl0KHRwLCBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTLCBOVUxMKTsKKwlpZiAoZXJyb3IpIHsKKwkJZ290byBlcnJvcl9vdXQ7CisJfQorCisJLyogY29weSBhbnkgbWFwcyB0byBjYWxsZXIncyBhcnJheSBhbmQgcmV0dXJuIGFueSBlcnJvci4gKi8KKwlpZiAobmltYXBzID09IDApIHsKKwkJZXJyb3IgPSAoRU5PU1BDKTsKKwkJZ290byBlcnJvcl9vdXQ7CisJfQorCisJKnJldF9pbWFwID0gaW1hcFswXTsKKwkqbm1hcHMgPSAxOworCWlmICggIShpby0+aW9fZmxhZ3MgJiBYRlNfSU9DT1JFX1JUKSAgJiYgIXJldF9pbWFwLT5icl9zdGFydGJsb2NrKSB7CisgICAgICAgICAgICAgICAgY21uX2VycihDRV9QQU5JQywiQWNjZXNzIHRvIGJsb2NrIHplcm86ICBmcyA8JXM+IGlub2RlOiAlbGxkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdGFydF9ibG9jayA6ICVsbHggc3RhcnRfb2ZmIDogJWxseCBibGtjbnQgOiAlbGx4ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJleHRlbnQtc3RhdGUgOiAleCBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAoaXAtPmlfbW91bnQpLT5tX2ZzbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpaXAtPmlfaW5vLAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0X2ltYXAtPmJyX3N0YXJ0YmxvY2ssIHJldF9pbWFwLT5icl9zdGFydG9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldF9pbWFwLT5icl9ibG9ja2NvdW50LHJldF9pbWFwLT5icl9zdGF0ZSk7CisgICAgICAgIH0KKwlyZXR1cm4gMDsKKworIGVycm9yMDoJLyogQ2FuY2VsIGJtYXAsIHVubG9jayBpbm9kZSwgYW5kIGNhbmNlbCB0cmFucyAqLworCXhmc19ibWFwX2NhbmNlbCgmZnJlZV9saXN0KTsKKworIGVycm9yMToJLyogSnVzdCBjYW5jZWwgdHJhbnNhY3Rpb24gKi8KKwl4ZnNfdHJhbnNfY2FuY2VsKHRwLCBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTIHwgWEZTX1RSQU5TX0FCT1JUKTsKKwkqbm1hcHMgPSAwOwkvKiBub3RoaW5nIHNldC11cCBoZXJlICovCisKK2Vycm9yX291dDoKKwlyZXR1cm4gWEZTX0VSUk9SKGVycm9yKTsKK30KKworaW50Cit4ZnNfaW9tYXBfd3JpdGVfZGVsYXkoCisJeGZzX2lub2RlX3QJKmlwLAorCWxvZmZfdAkJb2Zmc2V0LAorCXNpemVfdAkJY291bnQsCisJaW50CQlpb2ZsYWcsCisJeGZzX2JtYnRfaXJlY190ICpyZXRfaW1hcCwKKwlpbnQJCSpubWFwcykKK3sKKwl4ZnNfbW91bnRfdAkqbXAgPSBpcC0+aV9tb3VudDsKKwl4ZnNfaW9jb3JlX3QJKmlvID0gJmlwLT5pX2lvY29yZTsKKwl4ZnNfZmlsZW9mZl90CW9mZnNldF9mc2I7CisJeGZzX2ZpbGVvZmZfdAlsYXN0X2ZzYjsKKwl4ZnNfZnNpemVfdAlpc2l6ZTsKKwl4ZnNfZnNibG9ja190CWZpcnN0YmxvY2s7CisJaW50CQluaW1hcHM7CisJaW50CQllcnJvcjsKKwl4ZnNfYm1idF9pcmVjX3QgaW1hcFtYRlNfV1JJVEVfSU1BUFNdOworCWludAkJYWVvZjsKKwlpbnQJCWZzeW5jZWQgPSAwOworCisJQVNTRVJUKGlzbXJsb2NrZWQoJmlwLT5pX2xvY2ssIE1SX1VQREFURSkgIT0gMCk7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBkcXVvdHMgYXJlIHRoZXJlLiBUaGlzIGRvZXNuJ3QgaG9sZAorCSAqIHRoZSBpbG9jayBhY3Jvc3MgYSBkaXNrIHJlYWQuCisJICovCisKKwllcnJvciA9IFhGU19RTV9EUUFUVEFDSChtcCwgaXAsIFhGU19RTU9QVF9JTE9DS0VEKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBYRlNfRVJST1IoZXJyb3IpOworCityZXRyeToKKwlpc2l6ZSA9IGlwLT5pX2QuZGlfc2l6ZTsKKwlpZiAoaW8tPmlvX25ld19zaXplID4gaXNpemUpIHsKKwkJaXNpemUgPSBpby0+aW9fbmV3X3NpemU7CisJfQorCisJYWVvZiA9IDA7CisJb2Zmc2V0X2ZzYiA9IFhGU19CX1RPX0ZTQlQobXAsIG9mZnNldCk7CisJbGFzdF9mc2IgPSBYRlNfQl9UT19GU0IobXAsICgoeGZzX3Vmc2l6ZV90KShvZmZzZXQgKyBjb3VudCkpKTsKKwkvKgorCSAqIElmIHRoZSBjYWxsZXIgaXMgZG9pbmcgYSB3cml0ZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLAorCSAqIHRoZW4gZXh0ZW5kIHRoZSBhbGxvY2F0aW9uIChhbmQgdGhlIGJ1ZmZlciB1c2VkIGZvciB0aGUgd3JpdGUpCisJICogb3V0IHRvIHRoZSBmaWxlIHN5c3RlbSdzIHdyaXRlIGlvc2l6ZS4gIFdlIGNsZWFuIHVwIGFueSBleHRyYQorCSAqIHNwYWNlIGxlZnQgb3ZlciB3aGVuIHRoZSBmaWxlIGlzIGNsb3NlZCBpbiB4ZnNfaW5hY3RpdmUoKS4KKwkgKgorCSAqIEZvciBzeW5jIHdyaXRlcywgd2UgYXJlIGZsdXNoaW5nIGRlbGF5ZWQgYWxsb2NhdGUgc3BhY2UgdG8KKwkgKiB0cnkgdG8gbWFrZSBhZGRpdGlvbmFsIHNwYWNlIGF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbiBuZWFyCisJICogdGhlIGZpbGVzeXN0ZW0gZnVsbCBib3VuZGFyeSAtIHByZWFsbG9jYXRpb24gaHVydHMgaW4gdGhhdAorCSAqIHNpdHVhdGlvbiwgb2YgY291cnNlLgorCSAqLworCWlmICghKGlvZmxhZyAmIEJNQVBJX1NZTkMpICYmICgob2Zmc2V0ICsgY291bnQpID4gaXAtPmlfZC5kaV9zaXplKSkgeworCQl4ZnNfb2ZmX3QJYWxpZ25lZF9vZmZzZXQ7CisJCXhmc19maWxibGtzX3QgICBjb3VudF9mc2I7CisJCXVuc2lnbmVkIGludAlpb3NpemU7CisJCXhmc19maWxlb2ZmX3QJaW9hbGlnbjsKKwkJaW50CQluOworCQl4ZnNfZmlsZW9mZl90ICAgc3RhcnRfZnNiOworCisJCS8qCisJCSAqIElmIHRoZXJlIGFyZSBhbnkgcmVhbCBibG9ja3MgcGFzdCBlb2YsIHRoZW4gZG9uJ3QKKwkJICogZG8gYW55IHNwZWN1bGF0aXZlIGFsbG9jYXRpb24uCisJCSAqLworCQlzdGFydF9mc2IgPSBYRlNfQl9UT19GU0JUKG1wLAorCQkJCQkoKHhmc191ZnNpemVfdCkob2Zmc2V0ICsgY291bnQgLSAxKSkpOworCQljb3VudF9mc2IgPSBYRlNfQl9UT19GU0IobXAsICh4ZnNfdWZzaXplX3QpWEZTX01BWElPRkZTRVQobXApKTsKKwkJd2hpbGUgKGNvdW50X2ZzYiA+IDApIHsKKwkJCW5pbWFwcyA9IFhGU19XUklURV9JTUFQUzsKKwkJCWVycm9yID0gWEZTX0JNQVBJKG1wLCBOVUxMLCBpbywgc3RhcnRfZnNiLCBjb3VudF9mc2IsCisJCQkJCTAsICZmaXJzdGJsb2NrLCAwLCBpbWFwLCAmbmltYXBzLCBOVUxMKTsKKwkJCWlmIChlcnJvcikgeworCQkJCXJldHVybiBlcnJvcjsKKwkJCX0KKwkJCWZvciAobiA9IDA7IG4gPCBuaW1hcHM7IG4rKykgeworCQkJCWlmICggIShpby0+aW9fZmxhZ3MgJiBYRlNfSU9DT1JFX1JUKSAgJiYgCisJCQkJCSFpbWFwW25dLmJyX3N0YXJ0YmxvY2spIHsKKwkJCQkJY21uX2VycihDRV9QQU5JQywiQWNjZXNzIHRvIGJsb2NrICIKKwkJCQkJCSJ6ZXJvOiAgZnMgPCVzPiBpbm9kZTogJWxsZCAiCisJCQkJCQkic3RhcnRfYmxvY2sgOiAlbGx4IHN0YXJ0X29mZiAiCisJCQkJCQkiOiAlbGx4IGJsa2NudCA6ICVsbHggIgorCQkJCQkJImV4dGVudC1zdGF0ZSA6ICV4IFxuIiwKKwkJCQkJCShpcC0+aV9tb3VudCktPm1fZnNuYW1lLAorCQkJCQkJKGxvbmcgbG9uZylpcC0+aV9pbm8sCisJCQkJCQlpbWFwW25dLmJyX3N0YXJ0YmxvY2ssCisJCQkJCQlpbWFwW25dLmJyX3N0YXJ0b2ZmLAorCQkJCQkJaW1hcFtuXS5icl9ibG9ja2NvdW50LAorCQkJCQkJaW1hcFtuXS5icl9zdGF0ZSk7CisgICAgICAgIAkJCX0KKwkJCQlpZiAoKGltYXBbbl0uYnJfc3RhcnRibG9jayAhPSBIT0xFU1RBUlRCTE9DSykgJiYKKwkJCQkgICAgKGltYXBbbl0uYnJfc3RhcnRibG9jayAhPSBERUxBWVNUQVJUQkxPQ0spKSB7CisJCQkJCWdvdG8gd3JpdGVfbWFwOworCQkJCX0KKwkJCQlzdGFydF9mc2IgKz0gaW1hcFtuXS5icl9ibG9ja2NvdW50OworCQkJCWNvdW50X2ZzYiAtPSBpbWFwW25dLmJyX2Jsb2NrY291bnQ7CisJCQl9CisJCX0KKwkJaW9zaXplID0gbXAtPm1fd3JpdGVpb19ibG9ja3M7CisJCWFsaWduZWRfb2Zmc2V0ID0gWEZTX1dSSVRFSU9fQUxJR04obXAsIChvZmZzZXQgKyBjb3VudCAtIDEpKTsKKwkJaW9hbGlnbiA9IFhGU19CX1RPX0ZTQlQobXAsIGFsaWduZWRfb2Zmc2V0KTsKKwkJbGFzdF9mc2IgPSBpb2FsaWduICsgaW9zaXplOworCQlhZW9mID0gMTsKKwl9Cit3cml0ZV9tYXA6CisJbmltYXBzID0gWEZTX1dSSVRFX0lNQVBTOworCWZpcnN0YmxvY2sgPSBOVUxMRlNCTE9DSzsKKworCS8qCisJICogSWYgbW91bnRlZCB3aXRoIHRoZSAiLW8gc3dhbGxvYyIgb3B0aW9uLCByb3VuZHVwIHRoZSBhbGxvY2F0aW9uCisJICogcmVxdWVzdCB0byBhIHN0cmlwZSB3aWR0aCBib3VuZGFyeSBpZiB0aGUgZmlsZSBzaXplIGlzID49CisJICogc3RyaXBlIHdpZHRoIGFuZCB3ZSBhcmUgYWxsb2NhdGluZyBwYXN0IHRoZSBhbGxvY2F0aW9uIGVvZi4KKwkgKi8KKwlpZiAoIShpby0+aW9fZmxhZ3MgJiBYRlNfSU9DT1JFX1JUKSAmJiBtcC0+bV9zd2lkdGggCisJICAgICYmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9TV0FMTE9DKQorCSAgICAmJiAoaXNpemUgPj0gWEZTX0ZTQl9UT19CKG1wLCBtcC0+bV9zd2lkdGgpKSAmJiBhZW9mKSB7CisJCWludCBlb2Y7CisJCXhmc19maWxlb2ZmX3QgbmV3X2xhc3RfZnNiOworCisJCW5ld19sYXN0X2ZzYiA9IHJvdW5kdXBfNjQobGFzdF9mc2IsIG1wLT5tX3N3aWR0aCk7CisJCWVycm9yID0geGZzX2JtYXBfZW9mKGlwLCBuZXdfbGFzdF9mc2IsIFhGU19EQVRBX0ZPUkssICZlb2YpOworCQlpZiAoZXJyb3IpIHsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQlpZiAoZW9mKSB7CisJCQlsYXN0X2ZzYiA9IG5ld19sYXN0X2ZzYjsKKwkJfQorCS8qCisJICogUm91bmR1cCB0aGUgYWxsb2NhdGlvbiByZXF1ZXN0IHRvIGEgc3RyaXBlIHVuaXQgKG1fZGFsaWduKSBib3VuZGFyeQorCSAqIGlmIHRoZSBmaWxlIHNpemUgaXMgPj0gc3RyaXBlIHVuaXQgc2l6ZSwgYW5kIHdlIGFyZSBhbGxvY2F0aW5nIHBhc3QKKwkgKiB0aGUgYWxsb2NhdGlvbiBlb2YuCisJICovCisJfSBlbHNlIGlmICghKGlvLT5pb19mbGFncyAmIFhGU19JT0NPUkVfUlQpICYmIG1wLT5tX2RhbGlnbiAmJgorCQkgICAoaXNpemUgPj0gWEZTX0ZTQl9UT19CKG1wLCBtcC0+bV9kYWxpZ24pKSAmJiBhZW9mKSB7CisJCWludCBlb2Y7CisJCXhmc19maWxlb2ZmX3QgbmV3X2xhc3RfZnNiOworCQluZXdfbGFzdF9mc2IgPSByb3VuZHVwXzY0KGxhc3RfZnNiLCBtcC0+bV9kYWxpZ24pOworCQllcnJvciA9IHhmc19ibWFwX2VvZihpcCwgbmV3X2xhc3RfZnNiLCBYRlNfREFUQV9GT1JLLCAmZW9mKTsKKwkJaWYgKGVycm9yKSB7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJaWYgKGVvZikgeworCQkJbGFzdF9mc2IgPSBuZXdfbGFzdF9mc2I7CisJCX0KKwkvKgorCSAqIFJvdW5kIHVwIHRoZSBhbGxvY2F0aW9uIHJlcXVlc3QgdG8gYSByZWFsLXRpbWUgZXh0ZW50IGJvdW5kYXJ5CisJICogaWYgdGhlIGZpbGUgaXMgb24gdGhlIHJlYWwtdGltZSBzdWJ2b2x1bWUuCisJICovCisJfSBlbHNlIGlmIChpby0+aW9fZmxhZ3MgJiBYRlNfSU9DT1JFX1JUICYmIGFlb2YpIHsKKwkJaW50IGVvZjsKKwkJeGZzX2ZpbGVvZmZfdCBuZXdfbGFzdF9mc2I7CisKKwkJbmV3X2xhc3RfZnNiID0gcm91bmR1cF82NChsYXN0X2ZzYiwgbXAtPm1fc2Iuc2JfcmV4dHNpemUpOworCQllcnJvciA9IFhGU19CTUFQX0VPRihtcCwgaW8sIG5ld19sYXN0X2ZzYiwgWEZTX0RBVEFfRk9SSywgJmVvZik7CisJCWlmIChlcnJvcikgeworCQkJcmV0dXJuIGVycm9yOworCQl9CisJCWlmIChlb2YpCisJCQlsYXN0X2ZzYiA9IG5ld19sYXN0X2ZzYjsKKwl9CisJZXJyb3IgPSB4ZnNfYm1hcGkoTlVMTCwgaXAsIG9mZnNldF9mc2IsCisJCQkgICh4ZnNfZmlsYmxrc190KShsYXN0X2ZzYiAtIG9mZnNldF9mc2IpLAorCQkJICBYRlNfQk1BUElfREVMQVkgfCBYRlNfQk1BUElfV1JJVEUgfAorCQkJICBYRlNfQk1BUElfRU5USVJFLCAmZmlyc3RibG9jaywgMSwgaW1hcCwKKwkJCSAgJm5pbWFwcywgTlVMTCk7CisJLyoKKwkgKiBUaGlzIGNhbiBiZSBFRFFVT1QsIGlmIG5pbWFwcyA9PSAwCisJICovCisJaWYgKGVycm9yICYmIChlcnJvciAhPSBFTk9TUEMpKSB7CisJCXJldHVybiBYRlNfRVJST1IoZXJyb3IpOworCX0KKwkvKgorCSAqIElmIGJtYXBpIHJldHVybmVkIHVzIG5vdGhpbmcsIGFuZCBpZiB3ZSBkaWRuJ3QgZ2V0IGJhY2sgRURRVU9ULAorCSAqIHRoZW4gd2UgbXVzdCBoYXZlIHJ1biBvdXQgb2Ygc3BhY2UuCisJICovCisJaWYgKG5pbWFwcyA9PSAwKSB7CisJCXhmc19pb21hcF9lbnRlcl90cmFjZShYRlNfSU9NQVBfV1JJVEVfTk9TUEFDRSwKKwkJCQkJaW8sIG9mZnNldCwgY291bnQpOworCQlpZiAoeGZzX2ZsdXNoX3NwYWNlKGlwLCAmZnN5bmNlZCwgJmlvZmxhZykpCisJCQlyZXR1cm4gWEZTX0VSUk9SKEVOT1NQQyk7CisKKwkJZXJyb3IgPSAwOworCQlnb3RvIHJldHJ5OworCX0KKworCSpyZXRfaW1hcCA9IGltYXBbMF07CisJKm5tYXBzID0gMTsKKwlpZiAoICEoaW8tPmlvX2ZsYWdzICYgWEZTX0lPQ09SRV9SVCkgICYmICFyZXRfaW1hcC0+YnJfc3RhcnRibG9jaykgeworCQljbW5fZXJyKENFX1BBTklDLCJBY2Nlc3MgdG8gYmxvY2sgemVybzogIGZzIDwlcz4gaW5vZGU6ICVsbGQgIgorICAgICAgICAgICAgICAgICAgICAgICAgInN0YXJ0X2Jsb2NrIDogJWxseCBzdGFydF9vZmYgOiAlbGx4IGJsa2NudCA6ICVsbHggIgorICAgICAgICAgICAgICAgICAgICAgICAgImV4dGVudC1zdGF0ZSA6ICV4IFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpcC0+aV9tb3VudCktPm1fZnNuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylpcC0+aV9pbm8sCisgICAgICAgICAgICAgICAgICAgICAgICByZXRfaW1hcC0+YnJfc3RhcnRibG9jaywgcmV0X2ltYXAtPmJyX3N0YXJ0b2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0X2ltYXAtPmJyX2Jsb2NrY291bnQscmV0X2ltYXAtPmJyX3N0YXRlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQYXNzIGluIGEgZGVsYXllZCBhbGxvY2F0ZSBleHRlbnQsIGNvbnZlcnQgaXQgdG8gcmVhbCBleHRlbnRzOworICogcmV0dXJuIHRvIHRoZSBjYWxsZXIgdGhlIGV4dGVudCB3ZSBjcmVhdGUgd2hpY2ggbWFwcyBvbiB0b3Agb2YKKyAqIHRoZSBvcmlnaW5hdGluZyBjYWxsZXJzIHJlcXVlc3QuCisgKgorICogQ2FsbGVkIHdpdGhvdXQgYSBsb2NrIG9uIHRoZSBpbm9kZS4KKyAqLworaW50Cit4ZnNfaW9tYXBfd3JpdGVfYWxsb2NhdGUoCisJeGZzX2lub2RlX3QJKmlwLAorCXhmc19ibWJ0X2lyZWNfdCAqbWFwLAorCWludAkJKnJldG1hcCkKK3sKKwl4ZnNfbW91bnRfdAkqbXAgPSBpcC0+aV9tb3VudDsKKwl4ZnNfaW9jb3JlX3QgICAgKmlvID0gJmlwLT5pX2lvY29yZTsKKwl4ZnNfZmlsZW9mZl90CW9mZnNldF9mc2IsIGxhc3RfYmxvY2s7CisJeGZzX2ZpbGVvZmZfdAllbmRfZnNiLCBtYXBfc3RhcnRfZnNiOworCXhmc19mc2Jsb2NrX3QJZmlyc3RfYmxvY2s7CisJeGZzX2JtYXBfZnJlZV90CWZyZWVfbGlzdDsKKwl4ZnNfZmlsYmxrc190CWNvdW50X2ZzYjsKKwl4ZnNfYm1idF9pcmVjX3QJaW1hcFtYRlNfU1RSQVRfV1JJVEVfSU1BUFNdOworCXhmc190cmFuc190CSp0cDsKKwlpbnQJCWksIG5pbWFwcywgY29tbWl0dGVkOworCWludAkJZXJyb3IgPSAwOworCWludAkJbnJlczsKKworCSpyZXRtYXAgPSAwOworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhhdCB0aGUgZHF1b3RzIGFyZSB0aGVyZS4KKwkgKi8KKwlpZiAoKGVycm9yID0gWEZTX1FNX0RRQVRUQUNIKG1wLCBpcCwgMCkpKQorCQlyZXR1cm4gWEZTX0VSUk9SKGVycm9yKTsKKworCW9mZnNldF9mc2IgPSBtYXAtPmJyX3N0YXJ0b2ZmOworCWNvdW50X2ZzYiA9IG1hcC0+YnJfYmxvY2tjb3VudDsKKwltYXBfc3RhcnRfZnNiID0gb2Zmc2V0X2ZzYjsKKworCVhGU19TVEFUU19BREQoeHNfeHN0cmF0X2J5dGVzLCBYRlNfRlNCX1RPX0IobXAsIGNvdW50X2ZzYikpOworCisJd2hpbGUgKGNvdW50X2ZzYiAhPSAwKSB7CisJCS8qCisJCSAqIFNldCB1cCBhIHRyYW5zYWN0aW9uIHdpdGggd2hpY2ggdG8gYWxsb2NhdGUgdGhlCisJCSAqIGJhY2tpbmcgc3RvcmUgZm9yIHRoZSBmaWxlLiAgRG8gYWxsb2NhdGlvbnMgaW4gYQorCQkgKiBsb29wIHVudGlsIHdlIGdldCBzb21lIHNwYWNlIGluIHRoZSByYW5nZSB3ZSBhcmUKKwkJICogaW50ZXJlc3RlZCBpbi4gIFRoZSBvdGhlciBzcGFjZSB0aGF0IG1pZ2h0IGJlIGFsbG9jYXRlZAorCQkgKiBpcyBpbiB0aGUgZGVsYXllZCBhbGxvY2F0aW9uIGV4dGVudCBvbiB3aGljaCB3ZSBzaXQKKwkJICogYnV0IGJlZm9yZSBvdXIgYnVmZmVyIHN0YXJ0cy4KKwkJICovCisKKwkJbmltYXBzID0gMDsKKwkJd2hpbGUgKG5pbWFwcyA9PSAwKSB7CisJCQl0cCA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX1NUUkFUX1dSSVRFKTsKKwkJCW5yZXMgPSBYRlNfRVhURU5UQUREX1NQQUNFX1JFUyhtcCwgWEZTX0RBVEFfRk9SSyk7CisJCQllcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCBucmVzLAorCQkJCQlYRlNfV1JJVEVfTE9HX1JFUyhtcCksCisJCQkJCTAsIFhGU19UUkFOU19QRVJNX0xPR19SRVMsCisJCQkJCVhGU19XUklURV9MT0dfQ09VTlQpOworCQkJaWYgKGVycm9yID09IEVOT1NQQykgeworCQkJCWVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsCisJCQkJCQlYRlNfV1JJVEVfTE9HX1JFUyhtcCksCisJCQkJCQkwLAorCQkJCQkJWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywKKwkJCQkJCVhGU19XUklURV9MT0dfQ09VTlQpOworCQkJfQorCQkJaWYgKGVycm9yKSB7CisJCQkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgMCk7CisJCQkJcmV0dXJuIFhGU19FUlJPUihlcnJvcik7CisJCQl9CisJCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwkJCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKKwkJCXhmc190cmFuc19paG9sZCh0cCwgaXApOworCisJCQlYRlNfQk1BUF9JTklUKCZmcmVlX2xpc3QsICZmaXJzdF9ibG9jayk7CisKKwkJCW5pbWFwcyA9IFhGU19TVFJBVF9XUklURV9JTUFQUzsKKwkJCS8qCisJCQkgKiBFbnN1cmUgd2UgZG9uJ3QgZ28gYmV5b25kIGVvZiAtIGl0IGlzIHBvc3NpYmxlCisJCQkgKiB0aGUgZXh0ZW50cyBjaGFuZ2VkIHNpbmNlIHdlIGRpZCB0aGUgcmVhZCBjYWxsLAorCQkJICogd2UgZHJvcHBlZCB0aGUgaWxvY2sgaW4gdGhlIGludGVyaW0uCisJCQkgKi8KKworCQkJZW5kX2ZzYiA9IFhGU19CX1RPX0ZTQihtcCwgaXAtPmlfZC5kaV9zaXplKTsKKwkJCXhmc19ibWFwX2xhc3Rfb2Zmc2V0KE5VTEwsIGlwLCAmbGFzdF9ibG9jaywKKwkJCQlYRlNfREFUQV9GT1JLKTsKKwkJCWxhc3RfYmxvY2sgPSBYRlNfRklMRU9GRl9NQVgobGFzdF9ibG9jaywgZW5kX2ZzYik7CisJCQlpZiAoKG1hcF9zdGFydF9mc2IgKyBjb3VudF9mc2IpID4gbGFzdF9ibG9jaykgeworCQkJCWNvdW50X2ZzYiA9IGxhc3RfYmxvY2sgLSBtYXBfc3RhcnRfZnNiOworCQkJCWlmIChjb3VudF9mc2IgPT0gMCkgeworCQkJCQllcnJvciA9IEVBR0FJTjsKKwkJCQkJZ290byB0cmFuc19jYW5jZWw7CisJCQkJfQorCQkJfQorCisJCQkvKiBHbyBnZXQgdGhlIGFjdHVhbCBibG9ja3MgKi8KKwkJCWVycm9yID0geGZzX2JtYXBpKHRwLCBpcCwgbWFwX3N0YXJ0X2ZzYiwgY291bnRfZnNiLAorCQkJCQlYRlNfQk1BUElfV1JJVEUsICZmaXJzdF9ibG9jaywgMSwKKwkJCQkJaW1hcCwgJm5pbWFwcywgJmZyZWVfbGlzdCk7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byB0cmFuc19jYW5jZWw7CisKKwkJCWVycm9yID0geGZzX2JtYXBfZmluaXNoKCZ0cCwgJmZyZWVfbGlzdCwKKwkJCQkJZmlyc3RfYmxvY2ssICZjb21taXR0ZWQpOworCQkJaWYgKGVycm9yKQorCQkJCWdvdG8gdHJhbnNfY2FuY2VsOworCisJCQllcnJvciA9IHhmc190cmFuc19jb21taXQodHAsCisJCQkJCVhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMsIE5VTEwpOworCQkJaWYgKGVycm9yKQorCQkJCWdvdG8gZXJyb3IwOworCisJCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQl9CisKKwkJLyoKKwkJICogU2VlIGlmIHdlIHdlcmUgYWJsZSB0byBhbGxvY2F0ZSBhbiBleHRlbnQgdGhhdAorCQkgKiBjb3ZlcnMgYXQgbGVhc3QgcGFydCBvZiB0aGUgY2FsbGVycyByZXF1ZXN0CisJCSAqLworCisJCWZvciAoaSA9IDA7IGkgPCBuaW1hcHM7IGkrKykgeworCQkJaWYgKCAhKGlvLT5pb19mbGFncyAmIFhGU19JT0NPUkVfUlQpICAmJiAKKwkJCQkhaW1hcFtpXS5icl9zdGFydGJsb2NrKSB7CisJCQkJY21uX2VycihDRV9QQU5JQywiQWNjZXNzIHRvIGJsb2NrIHplcm86ICAiCisJCQkJCSJmcyA8JXM+IGlub2RlOiAlbGxkICIKKwkJCQkJInN0YXJ0X2Jsb2NrIDogJWxseCBzdGFydF9vZmYgOiAlbGx4ICIgCisJCQkJCSJibGtjbnQgOiAlbGx4IGV4dGVudC1zdGF0ZSA6ICV4IFxuIiwKKwkJCQkJKGlwLT5pX21vdW50KS0+bV9mc25hbWUsCisJCQkJCShsb25nIGxvbmcpaXAtPmlfaW5vLAorCQkJCQlpbWFwW2ldLmJyX3N0YXJ0YmxvY2ssCisJCQkJCWltYXBbaV0uYnJfc3RhcnRvZmYsCisJCQkJICAgICAgICBpbWFwW2ldLmJyX2Jsb2NrY291bnQsaW1hcFtpXS5icl9zdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCQlpZiAoKG1hcC0+YnJfc3RhcnRvZmYgPj0gaW1hcFtpXS5icl9zdGFydG9mZikgJiYKKwkJCSAgICAobWFwLT5icl9zdGFydG9mZiA8IChpbWFwW2ldLmJyX3N0YXJ0b2ZmICsKKwkJCQkJCSBpbWFwW2ldLmJyX2Jsb2NrY291bnQpKSkgeworCQkJCSptYXAgPSBpbWFwW2ldOworCQkJCSpyZXRtYXAgPSAxOworCQkJCVhGU19TVEFUU19JTkMoeHNfeHN0cmF0X3F1aWNrKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWNvdW50X2ZzYiAtPSBpbWFwW2ldLmJyX2Jsb2NrY291bnQ7CisJCX0KKworCQkvKiBTbyBmYXIgd2UgaGF2ZSBub3QgbWFwcGVkIHRoZSByZXF1ZXN0ZWQgcGFydCBvZiB0aGUKKwkJICogZmlsZSwganVzdCBzdXJyb3VuZGluZyBkYXRhLCB0cnkgYWdhaW4uCisJCSAqLworCQluaW1hcHMtLTsKKwkJb2Zmc2V0X2ZzYiA9IGltYXBbbmltYXBzXS5icl9zdGFydG9mZiArCisJCQkgICAgIGltYXBbbmltYXBzXS5icl9ibG9ja2NvdW50OworCQltYXBfc3RhcnRfZnNiID0gb2Zmc2V0X2ZzYjsKKwl9CisKK3RyYW5zX2NhbmNlbDoKKwl4ZnNfYm1hcF9jYW5jZWwoJmZyZWVfbGlzdCk7CisJeGZzX3RyYW5zX2NhbmNlbCh0cCwgWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUyB8IFhGU19UUkFOU19BQk9SVCk7CitlcnJvcjA6CisJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwlyZXR1cm4gWEZTX0VSUk9SKGVycm9yKTsKK30KKworaW50Cit4ZnNfaW9tYXBfd3JpdGVfdW53cml0dGVuKAorCXhmc19pbm9kZV90CSppcCwKKwlsb2ZmX3QJCW9mZnNldCwKKwlzaXplX3QJCWNvdW50KQoreworCXhmc19tb3VudF90CSptcCA9IGlwLT5pX21vdW50OworCXhmc19pb2NvcmVfdCAgICAqaW8gPSAmaXAtPmlfaW9jb3JlOworCXhmc190cmFuc190CSp0cDsKKwl4ZnNfZmlsZW9mZl90CW9mZnNldF9mc2I7CisJeGZzX2ZpbGJsa3NfdAljb3VudF9mc2I7CisJeGZzX2ZpbGJsa3NfdAludW1ibGtzX2ZzYjsKKwl4ZnNfYm1idF9pcmVjX3QJaW1hcDsKKwlpbnQJCWNvbW1pdHRlZDsKKwlpbnQJCWVycm9yOworCWludAkJbnJlczsKKwlpbnQJCW5pbWFwczsKKwl4ZnNfZnNibG9ja190CWZpcnN0ZnNiOworCXhmc19ibWFwX2ZyZWVfdAlmcmVlX2xpc3Q7CisKKwl4ZnNfaW9tYXBfZW50ZXJfdHJhY2UoWEZTX0lPTUFQX1VOV1JJVFRFTiwKKwkJCQkmaXAtPmlfaW9jb3JlLCBvZmZzZXQsIGNvdW50KTsKKworCW9mZnNldF9mc2IgPSBYRlNfQl9UT19GU0JUKG1wLCBvZmZzZXQpOworCWNvdW50X2ZzYiA9IFhGU19CX1RPX0ZTQihtcCwgKHhmc191ZnNpemVfdClvZmZzZXQgKyBjb3VudCk7CisJY291bnRfZnNiID0gKHhmc19maWxibGtzX3QpKGNvdW50X2ZzYiAtIG9mZnNldF9mc2IpOworCisJZG8geworCQlucmVzID0gWEZTX0RJT1NUUkFUX1NQQUNFX1JFUyhtcCwgMCk7CisKKwkJLyoKKwkJICogc2V0IHVwIGEgdHJhbnNhY3Rpb24gdG8gY29udmVydCB0aGUgcmFuZ2Ugb2YgZXh0ZW50cworCQkgKiBmcm9tIHVud3JpdHRlbiB0byByZWFsLiBEbyBhbGxvY2F0aW9ucyBpbiBhIGxvb3AgdW50aWwKKwkJICogd2UgaGF2ZSBjb3ZlcmVkIHRoZSByYW5nZSBwYXNzZWQgaW4uCisJCSAqLworCisJCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfU1RSQVRfV1JJVEUpOworCQllcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCBucmVzLAorCQkJCVhGU19XUklURV9MT0dfUkVTKG1wKSwgMCwKKwkJCQlYRlNfVFJBTlNfUEVSTV9MT0dfUkVTLAorCQkJCVhGU19XUklURV9MT0dfQ09VTlQpOworCQlpZiAoZXJyb3IpIHsKKwkJCXhmc190cmFuc19jYW5jZWwodHAsIDApOworCQkJZ290byBlcnJvcjA7CisJCX0KKworCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQl4ZnNfdHJhbnNfaWhvbGQodHAsIGlwKTsKKworCQkvKgorCQkgKiBNb2RpZnkgdGhlIHVud3JpdHRlbiBleHRlbnQgc3RhdGUgb2YgdGhlIGJ1ZmZlci4KKwkJICovCisJCVhGU19CTUFQX0lOSVQoJmZyZWVfbGlzdCwgJmZpcnN0ZnNiKTsKKwkJbmltYXBzID0gMTsKKwkJZXJyb3IgPSB4ZnNfYm1hcGkodHAsIGlwLCBvZmZzZXRfZnNiLCBjb3VudF9mc2IsCisJCQkJICBYRlNfQk1BUElfV1JJVEUsICZmaXJzdGZzYiwKKwkJCQkgIDEsICZpbWFwLCAmbmltYXBzLCAmZnJlZV9saXN0KTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBlcnJvcl9vbl9ibWFwaV90cmFuc2FjdGlvbjsKKworCQllcnJvciA9IHhmc19ibWFwX2ZpbmlzaCgmKHRwKSwgJihmcmVlX2xpc3QpLAorCQkJCWZpcnN0ZnNiLCAmY29tbWl0dGVkKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBlcnJvcl9vbl9ibWFwaV90cmFuc2FjdGlvbjsKKworCQllcnJvciA9IHhmc190cmFuc19jb21taXQodHAsIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMsIE5VTEwpOworCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGVycm9yMDsKKwkJCisJCWlmICggIShpby0+aW9fZmxhZ3MgJiBYRlNfSU9DT1JFX1JUKSAgJiYgIWltYXAuYnJfc3RhcnRibG9jaykgeworCQkJY21uX2VycihDRV9QQU5JQywiQWNjZXNzIHRvIGJsb2NrIHplcm86ICBmcyA8JXM+ICIKKwkJCQkiaW5vZGU6ICVsbGQgc3RhcnRfYmxvY2sgOiAlbGx4IHN0YXJ0X29mZiA6ICIKKwkJCQkiJWxseCBibGtjbnQgOiAlbGx4IGV4dGVudC1zdGF0ZSA6ICV4IFxuIiwKKwkJCQkoaXAtPmlfbW91bnQpLT5tX2ZzbmFtZSwKKwkJCQkobG9uZyBsb25nKWlwLT5pX2lubywKKwkJCQlpbWFwLmJyX3N0YXJ0YmxvY2ssaW1hcC5icl9zdGFydG9mZiwKKwkJCQlpbWFwLmJyX2Jsb2NrY291bnQsaW1hcC5icl9zdGF0ZSk7CisgICAgICAgIAl9CisKKwkJaWYgKChudW1ibGtzX2ZzYiA9IGltYXAuYnJfYmxvY2tjb3VudCkgPT0gMCkgeworCQkJLyoKKwkJCSAqIFRoZSBudW1ibGtzX2ZzYiB2YWx1ZSBzaG91bGQgYWx3YXlzIGdldAorCQkJICogc21hbGxlciwgb3RoZXJ3aXNlIHRoZSBsb29wIGlzIHN0dWNrLgorCQkJICovCisJCQlBU1NFUlQoaW1hcC5icl9ibG9ja2NvdW50KTsKKwkJCWJyZWFrOworCQl9CisJCW9mZnNldF9mc2IgKz0gbnVtYmxrc19mc2I7CisJCWNvdW50X2ZzYiAtPSBudW1ibGtzX2ZzYjsKKwl9IHdoaWxlIChjb3VudF9mc2IgPiAwKTsKKworCXJldHVybiAwOworCitlcnJvcl9vbl9ibWFwaV90cmFuc2FjdGlvbjoKKwl4ZnNfYm1hcF9jYW5jZWwoJmZyZWVfbGlzdCk7CisJeGZzX3RyYW5zX2NhbmNlbCh0cCwgKFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMgfCBYRlNfVFJBTlNfQUJPUlQpKTsKKwl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworZXJyb3IwOgorCXJldHVybiBYRlNfRVJST1IoZXJyb3IpOworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pb21hcC5oIGIvZnMveGZzL3hmc19pb21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYzkxMDgKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX2lvbWFwLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMsMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKworCisjaWZuZGVmIF9fWEZTX0lPTUFQX0hfXworI2RlZmluZSBfX1hGU19JT01BUF9IX18KKworI2RlZmluZSBJT01BUF9EQUREUl9OVUxMICgoeGZzX2RhZGRyX3QpICgtMUxMKSkKKworCit0eXBlZGVmIGVudW0gewkJCQkvKiBpb21hcF9mbGFncyB2YWx1ZXMgKi8KKwlJT01BUF9FT0YgPQkJMHgwMSwJLyogbWFwcGluZyBjb250YWlucyBFT0YgICAqLworCUlPTUFQX0hPTEUgPQkJMHgwMiwJLyogbWFwcGluZyBjb3ZlcnMgYSBob2xlICAqLworCUlPTUFQX0RFTEFZID0JCTB4MDQsCS8qIG1hcHBpbmcgY292ZXJzIGRlbGFsbG9jIHJlZ2lvbiAgKi8KKwlJT01BUF9SRUFMVElNRSA9CTB4MTAsCS8qIG1hcHBpbmcgb24gdGhlIHJlYWx0aW1lIGRldmljZSAgKi8KKwlJT01BUF9VTldSSVRURU4gPQkweDIwLAkvKiBtYXBwaW5nIGNvdmVycyBhbGxvY2F0ZWQgKi8KKwkJCQkJLyogYnV0IHVuaW5pdGlhbGl6ZWQgZmlsZSBkYXRhICAqLworCUlPTUFQX05FVyA9CQkweDQwCS8qIGp1c3QgYWxsb2NhdGUgKi8KK30gaW9tYXBfZmxhZ3NfdDsKKwordHlwZWRlZiBlbnVtIHsKKwkvKiBiYXNlIGV4dGVudCBtYW5pcHVsYXRpb24gY2FsbHMgKi8KKwlCTUFQSV9SRUFEID0gKDEgPDwgMCksCQkvKiByZWFkIGV4dGVudHMgKi8KKwlCTUFQSV9XUklURSA9ICgxIDw8IDEpLAkJLyogY3JlYXRlIGV4dGVudHMgKi8KKwlCTUFQSV9BTExPQ0FURSA9ICgxIDw8IDIpLAkvKiBkZWxheWVkIGFsbG9jYXRlIHRvIHJlYWwgZXh0ZW50cyAqLworCUJNQVBJX1VOV1JJVFRFTiAgPSAoMSA8PCAzKSwJLyogdW53cml0dGVuIGV4dGVudHMgdG8gcmVhbCBleHRlbnRzICovCisJLyogbW9kaWZpZXJzICovCisJQk1BUElfSUdOU1RBVEUgPSAoMSA8PCA0KSwJLyogaWdub3JlIHVud3JpdHRlbiBzdGF0ZSBvbiByZWFkICovCisJQk1BUElfRElSRUNUID0gKDEgPDwgNSksCQkvKiBkaXJlY3QgaW5zdGVhZCBvZiBidWZmZXJlZCB3cml0ZSAqLworCUJNQVBJX01NQVAgPSAoMSA8PCA2KSwJCS8qIGFsbG9jYXRlIGZvciBtbWFwIHdyaXRlICovCisJQk1BUElfU1lOQyA9ICgxIDw8IDcpLAkJLyogc3luYyB3cml0ZSB0byBmbHVzaCBkZWxhbGxvYyBzcGFjZSAqLworCUJNQVBJX1RSWUxPQ0sgPSAoMSA8PCA4KSwJLyogbm9uLWJsb2NraW5nIHJlcXVlc3QgKi8KKwlCTUFQSV9ERVZJQ0UgPSAoMSA8PCA5KSwJLyogd2Ugb25seSB3YW50IHRvIGtub3cgdGhlIGRldmljZSAqLworfSBibWFwaV9mbGFnc190OworCisKKy8qCisgKiB4ZnNfaW9tYXBfdDogIEZpbGUgc3lzdGVtIEkvTyBtYXAKKyAqCisgKiBUaGUgaW9tYXBfYm4gZmllbGQgaXMgZXhwcmVzc2VkIGluIDUxMi1ieXRlIGJsb2NrcywgYW5kIGlzIHdoZXJlIHRoZSAKKyAqIG1hcHBpbmcgc3RhcnRzIG9uIGRpc2suCisgKgorICogVGhlIGlvbWFwX29mZnNldCwgaW9tYXBfYnNpemUgYW5kIGlvbWFwX2RlbHRhIGZpZWxkcyBhcmUgaW4gYnl0ZXMuCisgKiBpb21hcF9vZmZzZXQgaXMgdGhlIG9mZnNldCBvZiB0aGUgbWFwcGluZyBpbiB0aGUgZmlsZSBpdHNlbGYuCisgKiBpb21hcF9ic2l6ZSBpcyB0aGUgc2l6ZSBvZiB0aGUgbWFwcGluZywgIGlvbWFwX2RlbHRhIGlzIHRoZSAKKyAqIGRlc2lyZWQgZGF0YSdzIG9mZnNldCBpbnRvIHRoZSBtYXBwaW5nLCBnaXZlbiB0aGUgb2Zmc2V0IHN1cHBsaWVkIAorICogdG8gdGhlIGZpbGUgSS9PIG1hcCByb3V0aW5lLgorICoKKyAqIFdoZW4gYSByZXF1ZXN0IGlzIG1hZGUgdG8gcmVhZCBiZXlvbmQgdGhlIGxvZ2ljYWwgZW5kIG9mIHRoZSBvYmplY3QsCisgKiBpb21hcF9zaXplIG1heSBiZSBzZXQgdG8gMCwgYnV0IGlvbWFwX29mZnNldCBhbmQgaW9tYXBfbGVuZ3RoIHNob3VsZCBiZSBzZXQKKyAqIHRvIHRoZSBhY3R1YWwgYW1vdW50IG9mIHVuZGVybHlpbmcgc3RvcmFnZSB0aGF0IGhhcyBiZWVuIGFsbG9jYXRlZCwgaWYgYW55LgorICovCisKK3R5cGVkZWYgc3RydWN0IHhmc19pb21hcCB7CisJeGZzX2RhZGRyX3QJCWlvbWFwX2JuOwkvKiBmaXJzdCA1MTJiIGJsayBvZiBtYXBwaW5nICovCisJeGZzX2J1ZnRhcmdfdAkJKmlvbWFwX3RhcmdldDsKKwlsb2ZmX3QJCQlpb21hcF9vZmZzZXQ7CS8qIG9mZnNldCBvZiBtYXBwaW5nLCBieXRlcyAqLworCWxvZmZfdAkJCWlvbWFwX2JzaXplOwkvKiBzaXplIG9mIG1hcHBpbmcsIGJ5dGVzICovCisJc2l6ZV90CQkJaW9tYXBfZGVsdGE7CS8qIG9mZnNldCBpbnRvIG1hcHBpbmcsIGJ5dGVzICovCisJaW9tYXBfZmxhZ3NfdAkJaW9tYXBfZmxhZ3M7Cit9IHhmc19pb21hcF90OworCitzdHJ1Y3QgeGZzX2lvY29yZTsKK3N0cnVjdCB4ZnNfaW5vZGU7CitzdHJ1Y3QgeGZzX2JtYnRfaXJlYzsKKworZXh0ZXJuIGludCB4ZnNfaW9tYXAoc3RydWN0IHhmc19pb2NvcmUgKiwgeGZzX29mZl90LCBzc2l6ZV90LCBpbnQsCisJCSAgICAgc3RydWN0IHhmc19pb21hcCAqLCBpbnQgKik7CitleHRlcm4gaW50IHhmc19pb21hcF93cml0ZV9kaXJlY3Qoc3RydWN0IHhmc19pbm9kZSAqLCBsb2ZmX3QsIHNpemVfdCwKKwkJCQkgIGludCwgc3RydWN0IHhmc19ibWJ0X2lyZWMgKiwgaW50ICosIGludCk7CitleHRlcm4gaW50IHhmc19pb21hcF93cml0ZV9kZWxheShzdHJ1Y3QgeGZzX2lub2RlICosIGxvZmZfdCwgc2l6ZV90LCBpbnQsCisJCQkJIHN0cnVjdCB4ZnNfYm1idF9pcmVjICosIGludCAqKTsKK2V4dGVybiBpbnQgeGZzX2lvbWFwX3dyaXRlX2FsbG9jYXRlKHN0cnVjdCB4ZnNfaW5vZGUgKiwKKwkJCQlzdHJ1Y3QgeGZzX2JtYnRfaXJlYyAqLCBpbnQgKik7CitleHRlcm4gaW50IHhmc19pb21hcF93cml0ZV91bndyaXR0ZW4oc3RydWN0IHhmc19pbm9kZSAqLCBsb2ZmX3QsIHNpemVfdCk7CisKKyNlbmRpZiAvKiBfX1hGU19JT01BUF9IX18qLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19pdGFibGUuYyBiL2ZzL3hmcy94ZnNfaXRhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZiYzhkMwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfaXRhYmxlLmMKQEAgLTAsMCArMSw4NTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKyNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2FnLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvYy5oIgorI2luY2x1ZGUgInhmc19pdGFibGUuaCIKKyNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKKworI2lmbmRlZiBIQVZFX1VTRVJBQ0MKKyNkZWZpbmUgdXNlcmFjYyh1YnVmZmVyLCBzaXplLCBmbGFncywgZm9vKSAoMCkKKyNkZWZpbmUgdW51c2VyYWNjKHVidWZmZXIsIHNpemUsIGZsYWdzKQorI2VuZGlmCisKK1NUQVRJQyBpbnQKK3hmc19idWxrc3RhdF9vbmVfaWdldCgKKwl4ZnNfbW91bnRfdAkqbXAsCQkvKiBtb3VudCBwb2ludCBmb3IgZmlsZXN5c3RlbSAqLworCXhmc19pbm9fdAlpbm8sCQkvKiBpbm9kZSBudW1iZXIgdG8gZ2V0IGRhdGEgZm9yICovCisJeGZzX2RhZGRyX3QJYm5vLAkJLyogc3RhcnRpbmcgYm5vIG9mIGlub2RlIGNsdXN0ZXIgKi8KKwl4ZnNfYnN0YXRfdAkqYnVmLAkJLyogcmV0dXJuIGJ1ZmZlciAqLworCWludAkJKnN0YXQpCQkvKiBCVUxLU1RBVF9SVl8uLi4gKi8KK3sKKwl4ZnNfZGlub2RlX2NvcmVfdCAqZGljOwkJLyogZGlub2RlIGNvcmUgaW5mbyBwb2ludGVyICovCisJeGZzX2lub2RlX3QJKmlwOwkJLyogaW5jb3JlIGlub2RlIHBvaW50ZXIgKi8KKwlpbnQJCWVycm9yOworCisJZXJyb3IgPSB4ZnNfaWdldChtcCwgTlVMTCwgaW5vLCAwLCBYRlNfSUxPQ0tfU0hBUkVELCAmaXAsIGJubyk7CisJaWYgKGVycm9yKSB7CisJCSpzdGF0ID0gQlVMS1NUQVRfUlZfTk9USElORzsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCUFTU0VSVChpcCAhPSBOVUxMKTsKKwlBU1NFUlQoaXAtPmlfYmxrbm8gIT0gKHhmc19kYWRkcl90KTApOworCWlmIChpcC0+aV9kLmRpX21vZGUgPT0gMCkgeworCQkqc3RhdCA9IEJVTEtTVEFUX1JWX05PVEhJTkc7CisJCWVycm9yID0gWEZTX0VSUk9SKEVOT0VOVCk7CisJCWdvdG8gb3V0X2lwdXQ7CisJfQorCisJZGljID0gJmlwLT5pX2Q7CisKKwkvKiB4ZnNfaWdldCByZXR1cm5zIHRoZSBmb2xsb3dpbmcgd2l0aG91dCBuZWVkaW5nCisJICogZnVydGhlciBjaGFuZ2UuCisJICovCisJYnVmLT5ic19ubGluayA9IGRpYy0+ZGlfbmxpbms7CisJYnVmLT5ic19wcm9qaWQgPSBkaWMtPmRpX3Byb2ppZDsKKwlidWYtPmJzX2lubyA9IGlubzsKKwlidWYtPmJzX21vZGUgPSBkaWMtPmRpX21vZGU7CisJYnVmLT5ic191aWQgPSBkaWMtPmRpX3VpZDsKKwlidWYtPmJzX2dpZCA9IGRpYy0+ZGlfZ2lkOworCWJ1Zi0+YnNfc2l6ZSA9IGRpYy0+ZGlfc2l6ZTsKKwlidWYtPmJzX2F0aW1lLnR2X3NlYyA9IGRpYy0+ZGlfYXRpbWUudF9zZWM7CisJYnVmLT5ic19hdGltZS50dl9uc2VjID0gZGljLT5kaV9hdGltZS50X25zZWM7CisJYnVmLT5ic19tdGltZS50dl9zZWMgPSBkaWMtPmRpX210aW1lLnRfc2VjOworCWJ1Zi0+YnNfbXRpbWUudHZfbnNlYyA9IGRpYy0+ZGlfbXRpbWUudF9uc2VjOworCWJ1Zi0+YnNfY3RpbWUudHZfc2VjID0gZGljLT5kaV9jdGltZS50X3NlYzsKKwlidWYtPmJzX2N0aW1lLnR2X25zZWMgPSBkaWMtPmRpX2N0aW1lLnRfbnNlYzsKKwlidWYtPmJzX3hmbGFncyA9IHhmc19pcDJ4ZmxhZ3MoaXApOworCWJ1Zi0+YnNfZXh0c2l6ZSA9IGRpYy0+ZGlfZXh0c2l6ZSA8PCBtcC0+bV9zYi5zYl9ibG9ja2xvZzsKKwlidWYtPmJzX2V4dGVudHMgPSBkaWMtPmRpX25leHRlbnRzOworCWJ1Zi0+YnNfZ2VuID0gZGljLT5kaV9nZW47CisJbWVtc2V0KGJ1Zi0+YnNfcGFkLCAwLCBzaXplb2YoYnVmLT5ic19wYWQpKTsKKwlidWYtPmJzX2RtZXZtYXNrID0gZGljLT5kaV9kbWV2bWFzazsKKwlidWYtPmJzX2Rtc3RhdGUgPSBkaWMtPmRpX2Rtc3RhdGU7CisJYnVmLT5ic19hZXh0ZW50cyA9IGRpYy0+ZGlfYW5leHRlbnRzOworCisJc3dpdGNoIChkaWMtPmRpX2Zvcm1hdCkgeworCWNhc2UgWEZTX0RJTk9ERV9GTVRfREVWOgorCQlidWYtPmJzX3JkZXYgPSBpcC0+aV9kZi5pZl91Mi5pZl9yZGV2OworCQlidWYtPmJzX2Jsa3NpemUgPSBCTEtERVZfSU9TSVpFOworCQlidWYtPmJzX2Jsb2NrcyA9IDA7CisJCWJyZWFrOworCWNhc2UgWEZTX0RJTk9ERV9GTVRfTE9DQUw6CisJY2FzZSBYRlNfRElOT0RFX0ZNVF9VVUlEOgorCQlidWYtPmJzX3JkZXYgPSAwOworCQlidWYtPmJzX2Jsa3NpemUgPSBtcC0+bV9zYi5zYl9ibG9ja3NpemU7CisJCWJ1Zi0+YnNfYmxvY2tzID0gMDsKKwkJYnJlYWs7CisJY2FzZSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTOgorCWNhc2UgWEZTX0RJTk9ERV9GTVRfQlRSRUU6CisJCWJ1Zi0+YnNfcmRldiA9IDA7CisJCWJ1Zi0+YnNfYmxrc2l6ZSA9IG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZTsKKwkJYnVmLT5ic19ibG9ja3MgPSBkaWMtPmRpX25ibG9ja3MgKyBpcC0+aV9kZWxheWVkX2Jsa3M7CisJCWJyZWFrOworCX0KKworIG91dF9pcHV0OgorCXhmc19pcHV0KGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK1NUQVRJQyBpbnQKK3hmc19idWxrc3RhdF9vbmVfZGlub2RlKAorCXhmc19tb3VudF90CSptcCwJCS8qIG1vdW50IHBvaW50IGZvciBmaWxlc3lzdGVtICovCisJeGZzX2lub190CWlubywJCS8qIGlub2RlIG51bWJlciB0byBnZXQgZGF0YSBmb3IgKi8KKwl4ZnNfZGlub2RlX3QJKmRpcCwJCS8qIGRpbm9kZSBpbm9kZSBwb2ludGVyICovCisJeGZzX2JzdGF0X3QJKmJ1ZikJCS8qIHJldHVybiBidWZmZXIgKi8KK3sKKwl4ZnNfZGlub2RlX2NvcmVfdCAqZGljOwkJLyogZGlub2RlIGNvcmUgaW5mbyBwb2ludGVyICovCisKKwlkaWMgPSAmZGlwLT5kaV9jb3JlOworCisJLyoKKwkgKiBUaGUgaW5vZGUgZm9ybWF0IGNoYW5nZWQgd2hlbiB3ZSBtb3ZlZCB0aGUgbGluayBjb3VudCBhbmQKKwkgKiBtYWRlIGl0IDMyIGJpdHMgbG9uZy4gIElmIHRoaXMgaXMgYW4gb2xkIGZvcm1hdCBpbm9kZSwKKwkgKiBjb252ZXJ0IGl0IGluIG1lbW9yeSB0byBsb29rIGxpa2UgYSBuZXcgb25lLiAgSWYgaXQgZ2V0cworCSAqIGZsdXNoZWQgdG8gZGlzayB3ZSB3aWxsIGNvbnZlcnQgYmFjayBiZWZvcmUgZmx1c2hpbmcgb3IKKwkgKiBsb2dnaW5nIGl0LiAgV2UgemVybyBvdXQgdGhlIG5ldyBwcm9qaWQgZmllbGQgYW5kIHRoZSBvbGQgbGluaworCSAqIGNvdW50IGZpZWxkLiAgV2UnbGwgaGFuZGxlIGNsZWFyaW5nIHRoZSBwYWQgZmllbGQgKHRoZSByZW1haW5zCisJICogb2YgdGhlIG9sZCB1dWlkIGZpZWxkKSB3aGVuIHdlIGFjdHVhbGx5IGNvbnZlcnQgdGhlIGlub2RlIHRvCisJICogdGhlIG5ldyBmb3JtYXQuIFdlIGRvbid0IGNoYW5nZSB0aGUgdmVyc2lvbiBudW1iZXIgc28gdGhhdCB3ZQorCSAqIGNhbiBkaXN0aW5ndWlzaCB0aGlzIGZyb20gYSByZWFsIG5ldyBmb3JtYXQgaW5vZGUuCisJICovCisJaWYgKElOVF9HRVQoZGljLT5kaV92ZXJzaW9uLCBBUkNIX0NPTlZFUlQpID09IFhGU19ESU5PREVfVkVSU0lPTl8xKSB7CisJCWJ1Zi0+YnNfbmxpbmsgPSBJTlRfR0VUKGRpYy0+ZGlfb25saW5rLCBBUkNIX0NPTlZFUlQpOworCQlidWYtPmJzX3Byb2ppZCA9IDA7CisJfSBlbHNlIHsKKwkJYnVmLT5ic19ubGluayA9IElOVF9HRVQoZGljLT5kaV9ubGluaywgQVJDSF9DT05WRVJUKTsKKwkJYnVmLT5ic19wcm9qaWQgPSBJTlRfR0VUKGRpYy0+ZGlfcHJvamlkLCBBUkNIX0NPTlZFUlQpOworCX0KKworCWJ1Zi0+YnNfaW5vID0gaW5vOworCWJ1Zi0+YnNfbW9kZSA9IElOVF9HRVQoZGljLT5kaV9tb2RlLCBBUkNIX0NPTlZFUlQpOworCWJ1Zi0+YnNfdWlkID0gSU5UX0dFVChkaWMtPmRpX3VpZCwgQVJDSF9DT05WRVJUKTsKKwlidWYtPmJzX2dpZCA9IElOVF9HRVQoZGljLT5kaV9naWQsIEFSQ0hfQ09OVkVSVCk7CisJYnVmLT5ic19zaXplID0gSU5UX0dFVChkaWMtPmRpX3NpemUsIEFSQ0hfQ09OVkVSVCk7CisJYnVmLT5ic19hdGltZS50dl9zZWMgPSBJTlRfR0VUKGRpYy0+ZGlfYXRpbWUudF9zZWMsIEFSQ0hfQ09OVkVSVCk7CisJYnVmLT5ic19hdGltZS50dl9uc2VjID0gSU5UX0dFVChkaWMtPmRpX2F0aW1lLnRfbnNlYywgQVJDSF9DT05WRVJUKTsKKwlidWYtPmJzX210aW1lLnR2X3NlYyA9IElOVF9HRVQoZGljLT5kaV9tdGltZS50X3NlYywgQVJDSF9DT05WRVJUKTsKKwlidWYtPmJzX210aW1lLnR2X25zZWMgPSBJTlRfR0VUKGRpYy0+ZGlfbXRpbWUudF9uc2VjLCBBUkNIX0NPTlZFUlQpOworCWJ1Zi0+YnNfY3RpbWUudHZfc2VjID0gSU5UX0dFVChkaWMtPmRpX2N0aW1lLnRfc2VjLCBBUkNIX0NPTlZFUlQpOworCWJ1Zi0+YnNfY3RpbWUudHZfbnNlYyA9IElOVF9HRVQoZGljLT5kaV9jdGltZS50X25zZWMsIEFSQ0hfQ09OVkVSVCk7CisJYnVmLT5ic194ZmxhZ3MgPSB4ZnNfZGljMnhmbGFncyhkaWMpOworCWJ1Zi0+YnNfZXh0c2l6ZSA9IElOVF9HRVQoZGljLT5kaV9leHRzaXplLCBBUkNIX0NPTlZFUlQpIDw8IG1wLT5tX3NiLnNiX2Jsb2NrbG9nOworCWJ1Zi0+YnNfZXh0ZW50cyA9IElOVF9HRVQoZGljLT5kaV9uZXh0ZW50cywgQVJDSF9DT05WRVJUKTsKKwlidWYtPmJzX2dlbiA9IElOVF9HRVQoZGljLT5kaV9nZW4sIEFSQ0hfQ09OVkVSVCk7CisJbWVtc2V0KGJ1Zi0+YnNfcGFkLCAwLCBzaXplb2YoYnVmLT5ic19wYWQpKTsKKwlidWYtPmJzX2RtZXZtYXNrID0gSU5UX0dFVChkaWMtPmRpX2RtZXZtYXNrLCBBUkNIX0NPTlZFUlQpOworCWJ1Zi0+YnNfZG1zdGF0ZSA9IElOVF9HRVQoZGljLT5kaV9kbXN0YXRlLCBBUkNIX0NPTlZFUlQpOworCWJ1Zi0+YnNfYWV4dGVudHMgPSBJTlRfR0VUKGRpYy0+ZGlfYW5leHRlbnRzLCBBUkNIX0NPTlZFUlQpOworCisJc3dpdGNoIChJTlRfR0VUKGRpYy0+ZGlfZm9ybWF0LCBBUkNIX0NPTlZFUlQpKSB7CisJY2FzZSBYRlNfRElOT0RFX0ZNVF9ERVY6CisJCWJ1Zi0+YnNfcmRldiA9IElOVF9HRVQoZGlwLT5kaV91LmRpX2RldiwgQVJDSF9DT05WRVJUKTsKKwkJYnVmLT5ic19ibGtzaXplID0gQkxLREVWX0lPU0laRTsKKwkJYnVmLT5ic19ibG9ja3MgPSAwOworCQlicmVhazsKKwljYXNlIFhGU19ESU5PREVfRk1UX0xPQ0FMOgorCWNhc2UgWEZTX0RJTk9ERV9GTVRfVVVJRDoKKwkJYnVmLT5ic19yZGV2ID0gMDsKKwkJYnVmLT5ic19ibGtzaXplID0gbXAtPm1fc2Iuc2JfYmxvY2tzaXplOworCQlidWYtPmJzX2Jsb2NrcyA9IDA7CisJCWJyZWFrOworCWNhc2UgWEZTX0RJTk9ERV9GTVRfRVhURU5UUzoKKwljYXNlIFhGU19ESU5PREVfRk1UX0JUUkVFOgorCQlidWYtPmJzX3JkZXYgPSAwOworCQlidWYtPmJzX2Jsa3NpemUgPSBtcC0+bV9zYi5zYl9ibG9ja3NpemU7CisJCWJ1Zi0+YnNfYmxvY2tzID0gSU5UX0dFVChkaWMtPmRpX25ibG9ja3MsIEFSQ0hfQ09OVkVSVCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogUmV0dXJuIHN0YXQgaW5mb3JtYXRpb24gZm9yIG9uZSBpbm9kZS4KKyAqIFJldHVybiAwIGlmIG9rLCBlbHNlIGVycm5vLgorICovCitpbnQJCSAgICAgICAJCS8qIGVycm9yIHN0YXR1cyAqLworeGZzX2J1bGtzdGF0X29uZSgKKwl4ZnNfbW91bnRfdAkqbXAsCQkvKiBtb3VudCBwb2ludCBmb3IgZmlsZXN5c3RlbSAqLworCXhmc19pbm9fdAlpbm8sCQkvKiBpbm9kZSBudW1iZXIgdG8gZ2V0IGRhdGEgZm9yICovCisJdm9pZAkJX191c2VyICpidWZmZXIsCS8qIGJ1ZmZlciB0byBwbGFjZSBvdXRwdXQgaW4gKi8KKwlpbnQJCXVic2l6ZSwJCS8qIHNpemUgb2YgYnVmZmVyICovCisJdm9pZAkJKnByaXZhdGVfZGF0YSwJLyogbXkgcHJpdmF0ZSBkYXRhICovCisJeGZzX2RhZGRyX3QJYm5vLAkJLyogc3RhcnRpbmcgYm5vIG9mIGlub2RlIGNsdXN0ZXIgKi8KKwlpbnQJCSp1YnVzZWQsCS8qIGJ5dGVzIHVzZWQgYnkgbWUgKi8KKwl2b2lkCQkqZGlidWZmLAkvKiBvbi1kaXNrIGlub2RlIGJ1ZmZlciAqLworCWludAkJKnN0YXQpCQkvKiBCVUxLU1RBVF9SVl8uLi4gKi8KK3sKKwl4ZnNfYnN0YXRfdAkqYnVmOwkJLyogcmV0dXJuIGJ1ZmZlciAqLworCWludAkJZXJyb3IgPSAwOwkvKiBlcnJvciB2YWx1ZSAqLworCXhmc19kaW5vZGVfdAkqZGlwOwkJLyogZGlub2RlIGlub2RlIHBvaW50ZXIgKi8KKworCWRpcCA9ICh4ZnNfZGlub2RlX3QgKilkaWJ1ZmY7CisKKwlpZiAoIWJ1ZmZlciB8fCBpbm8gPT0gbXAtPm1fc2Iuc2JfcmJtaW5vIHx8IGlubyA9PSBtcC0+bV9zYi5zYl9yc3VtaW5vIHx8CisJICAgIChYRlNfU0JfVkVSU0lPTl9IQVNRVU9UQSgmbXAtPm1fc2IpICYmCisJICAgICAoaW5vID09IG1wLT5tX3NiLnNiX3VxdW90aW5vIHx8IGlubyA9PSBtcC0+bV9zYi5zYl9ncXVvdGlubykpKSB7CisJCSpzdGF0ID0gQlVMS1NUQVRfUlZfTk9USElORzsKKwkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCX0KKwlpZiAodWJzaXplIDwgc2l6ZW9mKCpidWYpKSB7CisJCSpzdGF0ID0gQlVMS1NUQVRfUlZfTk9USElORzsKKwkJcmV0dXJuIFhGU19FUlJPUihFTk9NRU0pOworCX0KKworCWJ1ZiA9IGttZW1fYWxsb2Moc2l6ZW9mKCpidWYpLCBLTV9TTEVFUCk7CisKKwlpZiAoZGlwID09IE5VTEwpIHsKKwkJLyogV2UncmUgbm90IGJlaW5nIHBhc3NlZCBhIHBvaW50ZXIgdG8gYSBkaW5vZGUuICBUaGlzIGhhcHBlbnMKKwkJICogaWYgQlVMS1NUQVRfRkdfSUdFVCBpcyBzZWxlY3RlZC4gIERvIHRoZSBpZ2V0LgorCQkgKi8KKwkJZXJyb3IgPSB4ZnNfYnVsa3N0YXRfb25lX2lnZXQobXAsIGlubywgYm5vLCBidWYsIHN0YXQpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIG91dF9mcmVlOworCX0gZWxzZSB7CisJCXhmc19idWxrc3RhdF9vbmVfZGlub2RlKG1wLCBpbm8sIGRpcCwgYnVmKTsKKwl9CisKKwlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgYnVmLCBzaXplb2YoKmJ1ZikpKSAgeworCQkqc3RhdCA9IEJVTEtTVEFUX1JWX05PVEhJTkc7CisJCWVycm9yID0gIEVGQVVMVDsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwkqc3RhdCA9IEJVTEtTVEFUX1JWX0RJRE9ORTsKKwlpZiAodWJ1c2VkKQorCQkqdWJ1c2VkID0gc2l6ZW9mKCpidWYpOworCisgb3V0X2ZyZWU6CisJa21lbV9mcmVlKGJ1Ziwgc2l6ZW9mKCpidWYpKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBSZXR1cm4gc3RhdCBpbmZvcm1hdGlvbiBpbiBidWxrIChieS1pbm9kZSkgZm9yIHRoZSBmaWxlc3lzdGVtLgorICovCitpbnQJCQkJCS8qIGVycm9yIHN0YXR1cyAqLworeGZzX2J1bGtzdGF0KAorCXhmc19tb3VudF90CQkqbXAsCS8qIG1vdW50IHBvaW50IGZvciBmaWxlc3lzdGVtICovCisJeGZzX2lub190CQkqbGFzdGlub3AsIC8qIGxhc3QgaW5vZGUgcmV0dXJuZWQgKi8KKwlpbnQJCQkqdWJjb3VudHAsIC8qIHNpemUgb2YgYnVmZmVyL2NvdW50IHJldHVybmVkICovCisJYnVsa3N0YXRfb25lX3BmCQlmb3JtYXR0ZXIsIC8qIGZ1bmMgdGhhdCdkIGZpbGwgYSBzaW5nbGUgYnVmICovCisJdm9pZAkJCSpwcml2YXRlX2RhdGEsLyogcHJpdmF0ZSBkYXRhIGZvciBmb3JtYXR0ZXIgKi8KKwlzaXplX3QJCQlzdGF0c3RydWN0X3NpemUsIC8qIHNpemVvZiBzdHJ1Y3QgZmlsbGluZyAqLworCWNoYXIJCQlfX3VzZXIgKnVidWZmZXIsIC8qIGJ1ZmZlciB3aXRoIGlub2RlIHN0YXRzICovCisJaW50CQkJZmxhZ3MsCS8qIGRlZmluZWQgaW4geGZzX2l0YWJsZS5oICovCisJaW50CQkJKmRvbmUpCS8qIDEgaWYgdGhlcmUncmUgbW9yZSBzdGF0cyB0byBnZXQgKi8KK3sKKwl4ZnNfYWdibG9ja190CQlhZ2Jubz0wOy8qIGFsbG9jYXRpb24gZ3JvdXAgYmxvY2sgbnVtYmVyICovCisJeGZzX2J1Zl90CQkqYWdicDsJLyogYWdpIGhlYWRlciBidWZmZXIgKi8KKwl4ZnNfYWdpX3QJCSphZ2k7CS8qIGFnaSBoZWFkZXIgZGF0YSAqLworCXhmc19hZ2lub190CQlhZ2lubzsJLyogaW5vZGUgIyBpbiBhbGxvY2F0aW9uIGdyb3VwICovCisJeGZzX2FnbnVtYmVyX3QJCWFnbm87CS8qIGFsbG9jYXRpb24gZ3JvdXAgbnVtYmVyICovCisJeGZzX2RhZGRyX3QJCWJubzsJLyogaW5vZGUgY2x1c3RlciBzdGFydCBkYWRkciAqLworCWludAkJCWNodW5raWR4OyAvKiBjdXJyZW50IGluZGV4IGludG8gaW5vZGUgY2h1bmsgKi8KKwlpbnQJCQljbHVzdGlkeDsgLyogY3VycmVudCBpbmRleCBpbnRvIGlub2RlIGNsdXN0ZXIgKi8KKwl4ZnNfYnRyZWVfY3VyX3QJCSpjdXI7CS8qIGJ0cmVlIGN1cnNvciBmb3IgaWFsbG9jIGJ0cmVlICovCisJaW50CQkJZW5kX29mX2FnOyAvKiBzZXQgaWYgd2UndmUgc2VlbiB0aGUgYWcgZW5kICovCisJaW50CQkJZXJyb3I7CS8qIGVycm9yIGNvZGUgKi8KKwlpbnQgICAgICAgICAgICAgICAgICAgICBmbXRlcnJvcjsvKiBidWxrc3RhdCBmb3JtYXR0ZXIgcmVzdWx0ICovCisJX19pbnQzMl90CQlnY250OwkvKiBjdXJyZW50IGJ0cmVlIHJlYydzIGNvdW50ICovCisJeGZzX2lub2ZyZWVfdAkJZ2ZyZWU7CS8qIGN1cnJlbnQgYnRyZWUgcmVjJ3MgZnJlZSBtYXNrICovCisJeGZzX2FnaW5vX3QJCWdpbm87CS8qIGN1cnJlbnQgYnRyZWUgcmVjJ3Mgc3RhcnQgaW5vZGUgKi8KKwlpbnQJCQlpOwkvKiBsb29wIGluZGV4ICovCisJaW50CQkJaWNvdW50OwkvKiBjb3VudCBvZiBpbm9kZXMgZ29vZCBpbiBpcmJ1ZiAqLworCXhmc19pbm9fdAkJaW5vOwkvKiBpbm9kZSBudW1iZXIgKGZpbGVzeXN0ZW0pICovCisJeGZzX2lub2J0X3JlY190CQkqaXJicDsJLyogY3VycmVudCBpcmVjIGJ1ZmZlciBwb2ludGVyICovCisJeGZzX2lub2J0X3JlY190CQkqaXJidWY7CS8qIHN0YXJ0IG9mIGlyZWMgYnVmZmVyICovCisJeGZzX2lub2J0X3JlY190CQkqaXJidWZlbmQ7IC8qIGVuZCBvZiBnb29kIGlyZWMgYnVmZmVyIGVudHJpZXMgKi8KKwl4ZnNfaW5vX3QJCWxhc3Rpbm89MDsgLyogbGFzdCBpbm9kZSBudW1iZXIgcmV0dXJuZWQgKi8KKwlpbnQJCQluYmNsdXN0ZXI7IC8qICMgb2YgYmxvY2tzIGluIGEgY2x1c3RlciAqLworCWludAkJCW5pY2x1c3RlcjsgLyogIyBvZiBpbm9kZXMgaW4gYSBjbHVzdGVyICovCisJaW50CQkJbmltYXNrOwkvKiBtYXNrIGZvciBpbm9kZSBjbHVzdGVycyAqLworCWludAkJCW5pcmJ1ZjsJLyogc2l6ZSBvZiBpcmJ1ZiAqLworCWludAkJCXJ2YWw7CS8qIHJldHVybiB2YWx1ZSBlcnJvciBjb2RlICovCisJaW50CQkJdG1wOwkvKiByZXN1bHQgdmFsdWUgZnJvbSBidHJlZSBjYWxscyAqLworCWludAkJCXViY291bnQ7IC8qIHNpemUgb2YgdXNlcidzIGJ1ZmZlciAqLworCWludAkJCXVibGVmdDsJLyogYnl0ZXMgbGVmdCBpbiB1c2VyJ3MgYnVmZmVyICovCisJY2hhcgkJCV9fdXNlciAqdWJ1ZnA7CS8qIHBvaW50ZXIgaW50byB1c2VyJ3MgYnVmZmVyICovCisJaW50CQkJdWJlbGVtOwkvKiBzcGFjZXMgdXNlZCBpbiB1c2VyJ3MgYnVmZmVyICovCisJaW50CQkJdWJ1c2VkOwkvKiBieXRlcyB1c2VkIGJ5IGZvcm1hdHRlciAqLworCXhmc19idWZfdAkJKmJwOwkvKiBwdHIgdG8gb24tZGlzayBpbm9kZSBjbHVzdGVyIGJ1ZiAqLworCXhmc19kaW5vZGVfdAkJKmRpcDsJLyogcHRyIGludG8gYnAgZm9yIHNwZWNpZmljIGlub2RlICovCisJeGZzX2lub2RlX3QJCSppcDsJLyogcHRyIHRvIGluLWNvcmUgaW5vZGUgc3RydWN0ICovCisKKwkvKgorCSAqIEdldCB0aGUgbGFzdCBpbm9kZSB2YWx1ZSwgc2VlIGlmIHRoZXJlJ3Mgbm90aGluZyB0byBkby4KKwkgKi8KKwlpbm8gPSAoeGZzX2lub190KSpsYXN0aW5vcDsKKwlkaXAgPSBOVUxMOworCWFnbm8gPSBYRlNfSU5PX1RPX0FHTk8obXAsIGlubyk7CisJYWdpbm8gPSBYRlNfSU5PX1RPX0FHSU5PKG1wLCBpbm8pOworCWlmIChhZ25vID49IG1wLT5tX3NiLnNiX2FnY291bnQgfHwKKwkgICAgaW5vICE9IFhGU19BR0lOT19UT19JTk8obXAsIGFnbm8sIGFnaW5vKSkgeworCQkqZG9uZSA9IDE7CisJCSp1YmNvdW50cCA9IDA7CisJCXJldHVybiAwOworCX0KKwl1YmNvdW50ID0gKnViY291bnRwOyAvKiBzdGF0c3RydWN0J3MgKi8KKwl1YmxlZnQgPSB1YmNvdW50ICogc3RhdHN0cnVjdF9zaXplOyAvKiBieXRlcyAqLworCSp1YmNvdW50cCA9IHViZWxlbSA9IDA7CisJKmRvbmUgPSAwOworCWZtdGVycm9yID0gMDsKKwl1YnVmcCA9IHVidWZmZXI7CisJbmljbHVzdGVyID0gbXAtPm1fc2Iuc2JfYmxvY2tzaXplID49IFhGU19JTk9ERV9DTFVTVEVSX1NJWkUobXApID8KKwkJbXAtPm1fc2Iuc2JfaW5vcGJsb2NrIDoKKwkJKFhGU19JTk9ERV9DTFVTVEVSX1NJWkUobXApID4+IG1wLT5tX3NiLnNiX2lub2RlbG9nKTsKKwluaW1hc2sgPSB+KG5pY2x1c3RlciAtIDEpOworCW5iY2x1c3RlciA9IG5pY2x1c3RlciA+PiBtcC0+bV9zYi5zYl9pbm9wYmxvZzsKKwkvKgorCSAqIExvY2sgZG93biB0aGUgdXNlcidzIGJ1ZmZlci4gSWYgYSBidWZmZXIgd2FzIG5vdCBzZW50LCBhcyBpbiB0aGUgY2FzZQorCSAqIGRpc2sgcXVvdGEgY29kZSBjYWxscyBoZXJlLCB3ZSBza2lwIHRoaXMuCisJICovCisJaWYgKHVidWZmZXIgJiYKKwkgICAgKGVycm9yID0gdXNlcmFjYyh1YnVmZmVyLCB1YmNvdW50ICogc3RhdHN0cnVjdF9zaXplLAorCQkJKEJfUkVBRHxCX1BIWVMpLCBOVUxMKSkpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKwkvKgorCSAqIEFsbG9jYXRlIGEgcGFnZS1zaXplZCBidWZmZXIgZm9yIGlub2RlIGJ0cmVlIHJlY29yZHMuCisJICogV2UgY291bGQgdHJ5IGFsbG9jYXRpbmcgc29tZXRoaW5nIHNtYWxsZXIsIGJ1dCBmb3Igbm9ybWFsCisJICogY2FsbHMgd2UnbGwgYWx3YXlzIChwb3RlbnRpYWxseSkgbmVlZCB0aGUgd2hvbGUgcGFnZS4KKwkgKi8KKwlpcmJ1ZiA9IGttZW1fYWxsb2MoTkJQQywgS01fU0xFRVApOworCW5pcmJ1ZiA9IE5CUEMgLyBzaXplb2YoKmlyYnVmKTsKKwkvKgorCSAqIExvb3Agb3ZlciB0aGUgYWxsb2NhdGlvbiBncm91cHMsIHN0YXJ0aW5nIGZyb20gdGhlIGxhc3QKKwkgKiBpbm9kZSByZXR1cm5lZDsgMCBtZWFucyBzdGFydCBvZiB0aGUgYWxsb2NhdGlvbiBncm91cC4KKwkgKi8KKwlydmFsID0gMDsKKwl3aGlsZSAodWJsZWZ0ID49IHN0YXRzdHJ1Y3Rfc2l6ZSAmJiBhZ25vIDwgbXAtPm1fc2Iuc2JfYWdjb3VudCkgeworCQlicCA9IE5VTEw7CisJCWRvd25fcmVhZCgmbXAtPm1fcGVyYWdsb2NrKTsKKwkJZXJyb3IgPSB4ZnNfaWFsbG9jX3JlYWRfYWdpKG1wLCBOVUxMLCBhZ25vLCAmYWdicCk7CisJCXVwX3JlYWQoJm1wLT5tX3BlcmFnbG9jayk7CisJCWlmIChlcnJvcikgeworCQkJLyoKKwkJCSAqIFNraXAgdGhpcyBhbGxvY2F0aW9uIGdyb3VwIGFuZCBnbyB0byB0aGUgbmV4dCBvbmUuCisJCQkgKi8KKwkJCWFnbm8rKzsKKwkJCWFnaW5vID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWFnaSA9IFhGU19CVUZfVE9fQUdJKGFnYnApOworCQkvKgorCQkgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIGJ0cmVlIGN1cnNvciBmb3IgaWFsbG9jIGJ0cmVlLgorCQkgKi8KKwkJY3VyID0geGZzX2J0cmVlX2luaXRfY3Vyc29yKG1wLCBOVUxMLCBhZ2JwLCBhZ25vLCBYRlNfQlROVU1fSU5PLAorCQkJKHhmc19pbm9kZV90ICopMCwgMCk7CisJCWlyYnAgPSBpcmJ1ZjsKKwkJaXJidWZlbmQgPSBpcmJ1ZiArIG5pcmJ1ZjsKKwkJZW5kX29mX2FnID0gMDsKKwkJLyoKKwkJICogSWYgd2UncmUgcmV0dXJuaW5nIGluIHRoZSBtaWRkbGUgb2YgYW4gYWxsb2NhdGlvbiBncm91cCwKKwkJICogd2UgbmVlZCB0byBnZXQgdGhlIHJlbWFpbmRlciBvZiB0aGUgY2h1bmsgd2UncmUgaW4uCisJCSAqLworCQlpZiAoYWdpbm8gPiAwKSB7CisJCQkvKgorCQkJICogTG9va3VwIHRoZSBpbm9kZSBjaHVuayB0aGF0IHRoaXMgaW5vZGUgbGl2ZXMgaW4uCisJCQkgKi8KKwkJCWVycm9yID0geGZzX2lub2J0X2xvb2t1cF9sZShjdXIsIGFnaW5vLCAwLCAwLCAmdG1wKTsKKwkJCWlmICghZXJyb3IgJiYJLyogbm8gSS9PIGVycm9yICovCisJCQkgICAgdG1wICYmCS8qIGxvb2t1cCBzdWNjZWVkZWQgKi8KKwkJCQkJLyogZ290IHRoZSByZWNvcmQsIHNob3VsZCBhbHdheXMgd29yayAqLworCQkJICAgICEoZXJyb3IgPSB4ZnNfaW5vYnRfZ2V0X3JlYyhjdXIsICZnaW5vLCAmZ2NudCwKKwkJCQkgICAgJmdmcmVlLCAmaSkpICYmCisJCQkgICAgaSA9PSAxICYmCisJCQkJCS8qIHRoaXMgaXMgdGhlIHJpZ2h0IGNodW5rICovCisJCQkgICAgYWdpbm8gPCBnaW5vICsgWEZTX0lOT0RFU19QRVJfQ0hVTksgJiYKKwkJCQkJLyogbGFzdGlubyB3YXMgbm90IGxhc3QgaW4gY2h1bmsgKi8KKwkJCSAgICAoY2h1bmtpZHggPSBhZ2lubyAtIGdpbm8gKyAxKSA8CisJCQkJICAgIFhGU19JTk9ERVNfUEVSX0NIVU5LICYmCisJCQkJCS8qIHRoZXJlIGFyZSBzb21lIGxlZnQgYWxsb2NhdGVkICovCisJCQkgICAgWEZTX0lOT0JUX01BU0tOKGNodW5raWR4LAorCQkJCSAgICBYRlNfSU5PREVTX1BFUl9DSFVOSyAtIGNodW5raWR4KSAmIH5nZnJlZSkgeworCQkJCS8qCisJCQkJICogR3JhYiB0aGUgY2h1bmsgcmVjb3JkLiAgTWFyayBhbGwgdGhlCisJCQkJICogdW5pbnRlcmVzdGluZyBpbm9kZXMgKGJlY2F1c2UgdGhleSdyZQorCQkJCSAqIGJlZm9yZSBvdXIgc3RhcnQgcG9pbnQpIGZyZWUuCisJCQkJICovCisJCQkJZm9yIChpID0gMDsgaSA8IGNodW5raWR4OyBpKyspIHsKKwkJCQkJaWYgKFhGU19JTk9CVF9NQVNLKGkpICYgfmdmcmVlKQorCQkJCQkJZ2NudCsrOworCQkJCX0KKwkJCQlnZnJlZSB8PSBYRlNfSU5PQlRfTUFTS04oMCwgY2h1bmtpZHgpOworCQkJCUlOVF9TRVQoaXJicC0+aXJfc3RhcnRpbm8sIEFSQ0hfQ09OVkVSVCwgZ2lubyk7CisJCQkJSU5UX1NFVChpcmJwLT5pcl9mcmVlY291bnQsIEFSQ0hfQ09OVkVSVCwgZ2NudCk7CisJCQkJSU5UX1NFVChpcmJwLT5pcl9mcmVlLCBBUkNIX0NPTlZFUlQsIGdmcmVlKTsKKwkJCQlpcmJwKys7CisJCQkJYWdpbm8gPSBnaW5vICsgWEZTX0lOT0RFU19QRVJfQ0hVTks7CisJCQkJaWNvdW50ID0gWEZTX0lOT0RFU19QRVJfQ0hVTksgLSBnY250OworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIElmIGFueSBvZiB0aG9zZSB0ZXN0cyBmYWlsZWQsIGJ1bXAgdGhlCisJCQkJICogaW5vZGUgbnVtYmVyIChqdXN0IGluIGNhc2UpLgorCQkJCSAqLworCQkJCWFnaW5vKys7CisJCQkJaWNvdW50ID0gMDsKKwkJCX0KKwkJCS8qCisJCQkgKiBJbiBhbnkgY2FzZSwgaW5jcmVtZW50IHRvIHRoZSBuZXh0IHJlY29yZC4KKwkJCSAqLworCQkJaWYgKCFlcnJvcikKKwkJCQllcnJvciA9IHhmc19pbm9idF9pbmNyZW1lbnQoY3VyLCAwLCAmdG1wKTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBTdGFydCBvZiBhZy4gIExvb2t1cCB0aGUgZmlyc3QgaW5vZGUgY2h1bmsuCisJCQkgKi8KKwkJCWVycm9yID0geGZzX2lub2J0X2xvb2t1cF9nZShjdXIsIDAsIDAsIDAsICZ0bXApOworCQkJaWNvdW50ID0gMDsKKwkJfQorCQkvKgorCQkgKiBMb29wIHRocm91Z2ggaW5vZGUgYnRyZWUgcmVjb3JkcyBpbiB0aGlzIGFnLAorCQkgKiB1bnRpbCB3ZSBydW4gb3V0IG9mIGlub2RlcyBvciBzcGFjZSBpbiB0aGUgYnVmZmVyLgorCQkgKi8KKwkJd2hpbGUgKGlyYnAgPCBpcmJ1ZmVuZCAmJiBpY291bnQgPCB1YmNvdW50KSB7CisJCQkvKgorCQkJICogTG9vcCBhcyBsb25nIGFzIHdlJ3JlIHVuYWJsZSB0byByZWFkIHRoZQorCQkJICogaW5vZGUgYnRyZWUuCisJCQkgKi8KKwkJCXdoaWxlIChlcnJvcikgeworCQkJCWFnaW5vICs9IFhGU19JTk9ERVNfUEVSX0NIVU5LOworCQkJCWlmIChYRlNfQUdJTk9fVE9fQUdCTk8obXAsIGFnaW5vKSA+PQorCQkJCQkJSU5UX0dFVChhZ2ktPmFnaV9sZW5ndGgsIEFSQ0hfQ09OVkVSVCkpCisJCQkJCWJyZWFrOworCQkJCWVycm9yID0geGZzX2lub2J0X2xvb2t1cF9nZShjdXIsIGFnaW5vLCAwLCAwLAorCQkJCQkJCSAgICAmdG1wKTsKKwkJCX0KKwkJCS8qCisJCQkgKiBJZiByYW4gb2ZmIHRoZSBlbmQgb2YgdGhlIGFnIGVpdGhlciB3aXRoIGFuIGVycm9yLAorCQkJICogb3IgdGhlIG5vcm1hbCB3YXksIHNldCBlbmQgYW5kIHN0b3AgY29sbGVjdGluZy4KKwkJCSAqLworCQkJaWYgKGVycm9yIHx8CisJCQkgICAgKGVycm9yID0geGZzX2lub2J0X2dldF9yZWMoY3VyLCAmZ2lubywgJmdjbnQsCisJCQkJICAgICZnZnJlZSwgJmkpKSB8fAorCQkJICAgIGkgPT0gMCkgeworCQkJCWVuZF9vZl9hZyA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKgorCQkJICogSWYgdGhpcyBjaHVuayBoYXMgYW55IGFsbG9jYXRlZCBpbm9kZXMsIHNhdmUgaXQuCisJCQkgKi8KKwkJCWlmIChnY250IDwgWEZTX0lOT0RFU19QRVJfQ0hVTkspIHsKKwkJCQlJTlRfU0VUKGlyYnAtPmlyX3N0YXJ0aW5vLCBBUkNIX0NPTlZFUlQsIGdpbm8pOworCQkJCUlOVF9TRVQoaXJicC0+aXJfZnJlZWNvdW50LCBBUkNIX0NPTlZFUlQsIGdjbnQpOworCQkJCUlOVF9TRVQoaXJicC0+aXJfZnJlZSwgQVJDSF9DT05WRVJULCBnZnJlZSk7CisJCQkJaXJicCsrOworCQkJCWljb3VudCArPSBYRlNfSU5PREVTX1BFUl9DSFVOSyAtIGdjbnQ7CisJCQl9CisJCQkvKgorCQkJICogU2V0IGFnaW5vIHRvIGFmdGVyIHRoaXMgY2h1bmsgYW5kIGJ1bXAgdGhlIGN1cnNvci4KKwkJCSAqLworCQkJYWdpbm8gPSBnaW5vICsgWEZTX0lOT0RFU19QRVJfQ0hVTks7CisJCQllcnJvciA9IHhmc19pbm9idF9pbmNyZW1lbnQoY3VyLCAwLCAmdG1wKTsKKwkJfQorCQkvKgorCQkgKiBEcm9wIHRoZSBidHJlZSBidWZmZXJzIGFuZCB0aGUgYWdpIGJ1ZmZlci4KKwkJICogV2UgY2FuJ3QgaG9sZCBhbnkgb2YgdGhlIGxvY2tzIHRoZXNlIHJlcHJlc2VudAorCQkgKiB3aGVuIGNhbGxpbmcgaWdldC4KKwkJICovCisJCXhmc19idHJlZV9kZWxfY3Vyc29yKGN1ciwgWEZTX0JUUkVFX05PRVJST1IpOworCQl4ZnNfYnVmX3JlbHNlKGFnYnApOworCQkvKgorCQkgKiBOb3cgZm9ybWF0IGFsbCB0aGUgZ29vZCBpbm9kZXMgaW50byB0aGUgdXNlcidzIGJ1ZmZlci4KKwkJICovCisJCWlyYnVmZW5kID0gaXJicDsKKwkJZm9yIChpcmJwID0gaXJidWY7CisJCSAgICAgaXJicCA8IGlyYnVmZW5kICYmIHVibGVmdCA+PSBzdGF0c3RydWN0X3NpemU7IGlyYnArKykgeworCQkJLyoKKwkJCSAqIFJlYWQtYWhlYWQgdGhlIG5leHQgY2h1bmsncyB3b3J0aCBvZiBpbm9kZXMuCisJCQkgKi8KKwkJCWlmICgmaXJicFsxXSA8IGlyYnVmZW5kKSB7CisJCQkJLyoKKwkJCQkgKiBMb29wIG92ZXIgYWxsIGNsdXN0ZXJzIGluIHRoZSBuZXh0IGNodW5rLgorCQkJCSAqIERvIGEgcmVhZGFoZWFkIGlmIHRoZXJlIGFyZSBhbnkgYWxsb2NhdGVkCisJCQkJICogaW5vZGVzIGluIHRoYXQgY2x1c3Rlci4KKwkJCQkgKi8KKwkJCQlmb3IgKGFnYm5vID0gWEZTX0FHSU5PX1RPX0FHQk5PKG1wLAorCQkJCQkJCUlOVF9HRVQoaXJicFsxXS5pcl9zdGFydGlubywgQVJDSF9DT05WRVJUKSksCisJCQkJICAgICBjaHVua2lkeCA9IDA7CisJCQkJICAgICBjaHVua2lkeCA8IFhGU19JTk9ERVNfUEVSX0NIVU5LOworCQkJCSAgICAgY2h1bmtpZHggKz0gbmljbHVzdGVyLAorCQkJCSAgICAgYWdibm8gKz0gbmJjbHVzdGVyKSB7CisJCQkJCWlmIChYRlNfSU5PQlRfTUFTS04oY2h1bmtpZHgsCisJCQkJCQkJICAgIG5pY2x1c3RlcikgJgorCQkJCQkgICAgfihJTlRfR0VUKGlyYnBbMV0uaXJfZnJlZSwgQVJDSF9DT05WRVJUKSkpCisJCQkJCQl4ZnNfYnRyZWVfcmVhZGFfYnVmcyhtcCwgYWdubywKKwkJCQkJCQlhZ2JubywgbmJjbHVzdGVyKTsKKwkJCQl9CisJCQl9CisJCQkvKgorCQkJICogTm93IHByb2Nlc3MgdGhpcyBjaHVuayBvZiBpbm9kZXMuCisJCQkgKi8KKwkJCWZvciAoYWdpbm8gPSBJTlRfR0VUKGlyYnAtPmlyX3N0YXJ0aW5vLCBBUkNIX0NPTlZFUlQpLCBjaHVua2lkeCA9IDAsIGNsdXN0aWR4ID0gMDsKKwkJCSAgICAgdWJsZWZ0ID4gMCAmJgorCQkJCUlOVF9HRVQoaXJicC0+aXJfZnJlZWNvdW50LCBBUkNIX0NPTlZFUlQpIDwgWEZTX0lOT0RFU19QRVJfQ0hVTks7CisJCQkgICAgIGNodW5raWR4KyssIGNsdXN0aWR4KyssIGFnaW5vKyspIHsKKwkJCQlBU1NFUlQoY2h1bmtpZHggPCBYRlNfSU5PREVTX1BFUl9DSFVOSyk7CisJCQkJLyoKKwkJCQkgKiBSZWNvbXB1dGUgYWdibm8gaWYgdGhpcyBpcyB0aGUKKwkJCQkgKiBmaXJzdCBpbm9kZSBvZiB0aGUgY2x1c3Rlci4KKwkJCQkgKgorCQkJCSAqIENhcmVmdWwgd2l0aCBjbHVzdGlkeC4gICBUaGVyZSBjYW4gYmUKKwkJCQkgKiBtdWx0cGxlIGNsdXN0ZXJzIHBlciBjaHVuaywgYSBzaW5nbGUKKwkJCQkgKiBjbHVzdGVyIHBlciBjaHVuayBvciBhIGNsdXN0ZXIgdGhhdCBoYXMKKwkJCQkgKiBpbm9kZXMgcmVwcmVzZW50ZWQgZnJvbSBzZXZlcmFsIGRpZmZlcmVudAorCQkJCSAqIGNodW5rcyAoaWYgYmxvY2tzaXplIGlzIGxhcmdlKS4KKwkJCQkgKgorCQkJCSAqIEJlY2F1c2Ugb2YgdGhpcywgdGhlIHN0YXJ0aW5nIGNsdXN0aWR4IGlzCisJCQkJICogaW5pdGlhbGl6ZWQgdG8gemVybyBpbiB0aGlzIGxvb3AgYnV0IG11c3QKKwkJCQkgKiBsYXRlciBiZSByZXNldCBhZnRlciByZWFkaW5nIGluIHRoZSBjbHVzdGVyCisJCQkJICogYnVmZmVyLgorCQkJCSAqLworCQkJCWlmICgoY2h1bmtpZHggJiAobmljbHVzdGVyIC0gMSkpID09IDApIHsKKwkJCQkJYWdibm8gPSBYRlNfQUdJTk9fVE9fQUdCTk8obXAsCisJCQkJCQkJSU5UX0dFVChpcmJwLT5pcl9zdGFydGlubywgQVJDSF9DT05WRVJUKSkgKworCQkJCQkJKChjaHVua2lkeCAmIG5pbWFzaykgPj4KKwkJCQkJCSBtcC0+bV9zYi5zYl9pbm9wYmxvZyk7CisKKwkJCQkJaWYgKGZsYWdzICYgQlVMS1NUQVRfRkdfUVVJQ0spIHsKKwkJCQkJCWlubyA9IFhGU19BR0lOT19UT19JTk8obXAsIGFnbm8sCisJCQkJCQkJCSAgICAgICBhZ2lubyk7CisJCQkJCQlibm8gPSBYRlNfQUdCX1RPX0RBRERSKG1wLCBhZ25vLAorCQkJCQkJCQkgICAgICAgYWdibm8pOworCisJCQkJCQkvKgorCQkJCQkJICogR2V0IHRoZSBpbm9kZSBjbHVzdGVyIGJ1ZmZlcgorCQkJCQkJICovCisJCQkJCQlBU1NFUlQoeGZzX2lub2RlX3pvbmUgIT0gTlVMTCk7CisJCQkJCQlpcCA9IGttZW1fem9uZV96YWxsb2MoeGZzX2lub2RlX3pvbmUsCisJCQkJCQkJCSAgICAgIEtNX1NMRUVQKTsKKwkJCQkJCWlwLT5pX2lubyA9IGlubzsKKwkJCQkJCWlwLT5pX21vdW50ID0gbXA7CisJCQkJCQlpZiAoYnApCisJCQkJCQkJeGZzX2J1Zl9yZWxzZShicCk7CisJCQkJCQllcnJvciA9IHhmc19pdG9icChtcCwgTlVMTCwgaXAsCisJCQkJCQkJCSAgJmRpcCwgJmJwLCBibm8pOworCQkJCQkJaWYgKCFlcnJvcikKKwkJCQkJCQljbHVzdGlkeCA9IGlwLT5pX2JvZmZzZXQgLyBtcC0+bV9zYi5zYl9pbm9kZXNpemU7CisJCQkJCQlrbWVtX3pvbmVfZnJlZSh4ZnNfaW5vZGVfem9uZSwgaXApOworCQkJCQkJaWYgKFhGU19URVNUX0VSUk9SKGVycm9yICE9IDAsCisJCQkJCQkJCSAgIG1wLCBYRlNfRVJSVEFHX0JVTEtTVEFUX1JFQURfQ0hVTkssCisJCQkJCQkJCSAgIFhGU19SQU5ET01fQlVMS1NUQVRfUkVBRF9DSFVOSykpIHsKKwkJCQkJCQlicCA9IE5VTEw7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBTa2lwIGlmIHRoaXMgaW5vZGUgaXMgZnJlZS4KKwkJCQkgKi8KKwkJCQlpZiAoWEZTX0lOT0JUX01BU0soY2h1bmtpZHgpICYgSU5UX0dFVChpcmJwLT5pcl9mcmVlLCBBUkNIX0NPTlZFUlQpKQorCQkJCQljb250aW51ZTsKKwkJCQkvKgorCQkJCSAqIENvdW50IHVzZWQgaW5vZGVzIGFzIGZyZWUgc28gd2UgY2FuIHRlbGwKKwkJCQkgKiB3aGVuIHRoZSBjaHVuayBpcyB1c2VkIHVwLgorCQkJCSAqLworCQkJCUlOVF9NT0QoaXJicC0+aXJfZnJlZWNvdW50LCBBUkNIX0NPTlZFUlQsICsxKTsKKwkJCQlpbm8gPSBYRlNfQUdJTk9fVE9fSU5PKG1wLCBhZ25vLCBhZ2lubyk7CisJCQkJYm5vID0gWEZTX0FHQl9UT19EQUREUihtcCwgYWdubywgYWdibm8pOworCQkJCWlmIChmbGFncyAmIEJVTEtTVEFUX0ZHX1FVSUNLKSB7CisJCQkJCWRpcCA9ICh4ZnNfZGlub2RlX3QgKil4ZnNfYnVmX29mZnNldChicCwKKwkJCQkJICAgICAgKGNsdXN0aWR4IDw8IG1wLT5tX3NiLnNiX2lub2RlbG9nKSk7CisKKwkJCQkJaWYgKElOVF9HRVQoZGlwLT5kaV9jb3JlLmRpX21hZ2ljLCBBUkNIX0NPTlZFUlQpCisJCQkJCQkgICAgIT0gWEZTX0RJTk9ERV9NQUdJQworCQkJCQkgICAgfHwgIVhGU19ESU5PREVfR09PRF9WRVJTSU9OKAorCQkJCQkJICAgIElOVF9HRVQoZGlwLT5kaV9jb3JlLmRpX3ZlcnNpb24sIEFSQ0hfQ09OVkVSVCkpKQorCQkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJLyoKKwkJCQkgKiBHZXQgdGhlIGlub2RlIGFuZCBmaWxsIGluIGEgc2luZ2xlIGJ1ZmZlci4KKwkJCQkgKiBCVUxLU1RBVF9GR19RVUlDSyB1c2VzIGRpcCB0byBmaWxsIGl0IGluLgorCQkJCSAqIEJVTEtTVEFUX0ZHX0lHRVQgdXNlcyBpZ2V0cy4KKwkJCQkgKiBTZWU6IHhmc19idWxrc3RhdF9vbmUgJiB4ZnNfZG1fYnVsa3N0YXRfb25lLgorCQkJCSAqIFRoaXMgaXMgYWxzbyB1c2VkIHRvIGNvdW50IGlub2Rlcy9ibGtzLCBldGMKKwkJCQkgKiBpbiB4ZnNfcW1fcXVvdGFjaGVjay4KKwkJCQkgKi8KKwkJCQl1YnVzZWQgPSBzdGF0c3RydWN0X3NpemU7CisJCQkJZXJyb3IgPSBmb3JtYXR0ZXIobXAsIGlubywgdWJ1ZnAsCisJCQkJCQl1YmxlZnQsIHByaXZhdGVfZGF0YSwKKwkJCQkJCWJubywgJnVidXNlZCwgZGlwLCAmZm10ZXJyb3IpOworCQkJCWlmIChmbXRlcnJvciA9PSBCVUxLU1RBVF9SVl9OT1RISU5HKSB7CisJCQkJCWlmIChlcnJvciA9PSBFTk9NRU0pCisJCQkJCQl1YmxlZnQgPSAwOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKGZtdGVycm9yID09IEJVTEtTVEFUX1JWX0dJVkVVUCkgeworCQkJCQl1YmxlZnQgPSAwOworCQkJCQlBU1NFUlQoZXJyb3IpOworCQkJCQlydmFsID0gZXJyb3I7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAodWJ1ZnApCisJCQkJCXVidWZwICs9IHVidXNlZDsKKwkJCQl1YmxlZnQgLT0gdWJ1c2VkOworCQkJCXViZWxlbSsrOworCQkJCWxhc3Rpbm8gPSBpbm87CisJCQl9CisJCX0KKworCQlpZiAoYnApCisJCQl4ZnNfYnVmX3JlbHNlKGJwKTsKKworCQkvKgorCQkgKiBTZXQgdXAgZm9yIHRoZSBuZXh0IGxvb3AgaXRlcmF0aW9uLgorCQkgKi8KKwkJaWYgKHVibGVmdCA+IDApIHsKKwkJCWlmIChlbmRfb2ZfYWcpIHsKKwkJCQlhZ25vKys7CisJCQkJYWdpbm8gPSAwOworCQkJfSBlbHNlCisJCQkJYWdpbm8gPSBYRlNfSU5PX1RPX0FHSU5PKG1wLCBsYXN0aW5vKTsKKwkJfSBlbHNlCisJCQlicmVhazsKKwl9CisJLyoKKwkgKiBEb25lLCB3ZSdyZSBlaXRoZXIgb3V0IG9mIGZpbGVzeXN0ZW0gb3Igc3BhY2UgdG8gcHV0IHRoZSBkYXRhLgorCSAqLworCWttZW1fZnJlZShpcmJ1ZiwgTkJQQyk7CisJaWYgKHVidWZmZXIpCisJCXVudXNlcmFjYyh1YnVmZmVyLCB1YmNvdW50ICogc3RhdHN0cnVjdF9zaXplLCAoQl9SRUFEfEJfUEhZUykpOworCSp1YmNvdW50cCA9IHViZWxlbTsKKwlpZiAoYWdubyA+PSBtcC0+bV9zYi5zYl9hZ2NvdW50KSB7CisJCS8qCisJCSAqIElmIHdlIHJhbiBvdXQgb2YgZmlsZXN5c3RlbSwgbWFyayBsYXN0aW5vIGFzIG9mZgorCQkgKiB0aGUgZW5kIG9mIHRoZSBmaWxlc3lzdGVtLCBzbyB0aGUgbmV4dCBjYWxsCisJCSAqIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5LgorCQkgKi8KKwkJKmxhc3Rpbm9wID0gKHhmc19pbm9fdClYRlNfQUdJTk9fVE9fSU5PKG1wLCBhZ25vLCAwKTsKKwkJKmRvbmUgPSAxOworCX0gZWxzZQorCQkqbGFzdGlub3AgPSAoeGZzX2lub190KWxhc3Rpbm87CisKKwlyZXR1cm4gcnZhbDsKK30KKworLyoKKyAqIFJldHVybiBzdGF0IGluZm9ybWF0aW9uIGluIGJ1bGsgKGJ5LWlub2RlKSBmb3IgdGhlIGZpbGVzeXN0ZW0uCisgKiBTcGVjaWFsIGNhc2UgZm9yIG5vbi1zZXF1ZW50aWFsIG9uZSBpbm9kZSBidWxrc3RhdC4KKyAqLworaW50CQkJCQkvKiBlcnJvciBzdGF0dXMgKi8KK3hmc19idWxrc3RhdF9zaW5nbGUoCisJeGZzX21vdW50X3QJCSptcCwJLyogbW91bnQgcG9pbnQgZm9yIGZpbGVzeXN0ZW0gKi8KKwl4ZnNfaW5vX3QJCSpsYXN0aW5vcCwgLyogaW5vZGUgdG8gcmV0dXJuICovCisJY2hhcgkJCV9fdXNlciAqYnVmZmVyLCAvKiBidWZmZXIgd2l0aCBpbm9kZSBzdGF0cyAqLworCWludAkJCSpkb25lKQkvKiAxIGlmIHRoZXJlJ3JlIG1vcmUgc3RhdHMgdG8gZ2V0ICovCit7CisJaW50CQkJY291bnQ7CS8qIGNvdW50IHZhbHVlIGZvciBidWxrc3RhdCBjYWxsICovCisJaW50CQkJZXJyb3I7CS8qIHJldHVybiB2YWx1ZSAqLworCXhmc19pbm9fdAkJaW5vOwkvKiBmaWxlc3lzdGVtIGlub2RlIG51bWJlciAqLworCWludAkJCXJlczsJLyogcmVzdWx0IGZyb20gYnMxICovCisKKwkvKgorCSAqIG5vdGUgdGhhdCByZXF1ZXN0aW5nIHZhbGlkIGlub2RlIG51bWJlcnMgd2hpY2ggYXJlIG5vdCBhbGxvY2F0ZWQKKwkgKiB0byBpbm9kZXMgd2lsbCBtb3N0IGxpa2VseSBjYXVzZSB4ZnNfaXRvYnAgdG8gZ2VuZXJhdGUgd2FybmluZworCSAqIG1lc3NhZ2VzIGFib3V0IGJhZCBtYWdpYyBudW1iZXJzLiBUaGlzIGlzIG9rLiBUaGUgZmFjdCB0aGF0CisJICogdGhlIGlub2RlIGlzbid0IGFjdHVhbGx5IGFuIGlub2RlIGlzIGhhbmRsZWQgYnkgdGhlCisJICogZXJyb3IgY2hlY2sgYmVsb3cuIERvbmUgdGhpcyB3YXkgdG8gbWFrZSB0aGUgdXN1YWwgY2FzZSBmYXN0ZXIKKwkgKiBhdCB0aGUgZXhwZW5zZSBvZiB0aGUgZXJyb3IgY2FzZS4KKwkgKi8KKworCWlubyA9ICh4ZnNfaW5vX3QpKmxhc3Rpbm9wOworCWVycm9yID0geGZzX2J1bGtzdGF0X29uZShtcCwgaW5vLCBidWZmZXIsIHNpemVvZih4ZnNfYnN0YXRfdCksCisJCQkJIE5VTEwsIDAsIE5VTEwsIE5VTEwsICZyZXMpOworCWlmIChlcnJvcikgeworCQkvKgorCQkgKiBTcGVjaWFsIGNhc2Ugd2F5IGZhaWxlZCwgZG8gaXQgdGhlICJsb25nIiB3YXkKKwkJICogdG8gc2VlIGlmIHRoYXQgd29ya3MuCisJCSAqLworCQkoKmxhc3Rpbm9wKS0tOworCQljb3VudCA9IDE7CisJCWlmICh4ZnNfYnVsa3N0YXQobXAsIGxhc3Rpbm9wLCAmY291bnQsIHhmc19idWxrc3RhdF9vbmUsCisJCQkJTlVMTCwgc2l6ZW9mKHhmc19ic3RhdF90KSwgYnVmZmVyLAorCQkJCUJVTEtTVEFUX0ZHX0lHRVQsIGRvbmUpKQorCQkJcmV0dXJuIGVycm9yOworCQlpZiAoY291bnQgPT0gMCB8fCAoeGZzX2lub190KSpsYXN0aW5vcCAhPSBpbm8pCisJCQlyZXR1cm4gZXJyb3IgPT0gRUZTQ09SUlVQVEVEID8KKwkJCQlYRlNfRVJST1IoRUlOVkFMKSA6IGVycm9yOworCQllbHNlCisJCQlyZXR1cm4gMDsKKwl9CisJKmRvbmUgPSAwOworCXJldHVybiAwOworfQorCisvKgorICogUmV0dXJuIGlub2RlIG51bWJlciB0YWJsZSBmb3IgdGhlIGZpbGVzeXN0ZW0uCisgKi8KK2ludAkJCQkJLyogZXJyb3Igc3RhdHVzICovCit4ZnNfaW51bWJlcnMoCisJeGZzX21vdW50X3QJKm1wLAkJLyogbW91bnQgcG9pbnQgZm9yIGZpbGVzeXN0ZW0gKi8KKwl4ZnNfaW5vX3QJKmxhc3Rpbm8sCS8qIGxhc3QgaW5vZGUgcmV0dXJuZWQgKi8KKwlpbnQJCSpjb3VudCwJCS8qIHNpemUgb2YgYnVmZmVyL2NvdW50IHJldHVybmVkICovCisJeGZzX2lub2dycF90CV9fdXNlciAqdWJ1ZmZlcikvKiBidWZmZXIgd2l0aCBpbm9kZSBkZXNjcmlwdGlvbnMgKi8KK3sKKwl4ZnNfYnVmX3QJKmFnYnA7CisJeGZzX2FnaW5vX3QJYWdpbm87CisJeGZzX2FnbnVtYmVyX3QJYWdubzsKKwlpbnQJCWJjb3VudDsKKwl4ZnNfaW5vZ3JwX3QJKmJ1ZmZlcjsKKwlpbnQJCWJ1ZmlkeDsKKwl4ZnNfYnRyZWVfY3VyX3QJKmN1cjsKKwlpbnQJCWVycm9yOworCV9faW50MzJfdAlnY250OworCXhmc19pbm9mcmVlX3QJZ2ZyZWU7CisJeGZzX2FnaW5vX3QJZ2lubzsKKwlpbnQJCWk7CisJeGZzX2lub190CWlubzsKKwlpbnQJCWxlZnQ7CisJaW50CQl0bXA7CisKKwlpbm8gPSAoeGZzX2lub190KSpsYXN0aW5vOworCWFnbm8gPSBYRlNfSU5PX1RPX0FHTk8obXAsIGlubyk7CisJYWdpbm8gPSBYRlNfSU5PX1RPX0FHSU5PKG1wLCBpbm8pOworCWxlZnQgPSAqY291bnQ7CisJKmNvdW50ID0gMDsKKwliY291bnQgPSBNSU4obGVmdCwgKGludCkoTkJQUCAvIHNpemVvZigqYnVmZmVyKSkpOworCWJ1ZmZlciA9IGttZW1fYWxsb2MoYmNvdW50ICogc2l6ZW9mKCpidWZmZXIpLCBLTV9TTEVFUCk7CisJZXJyb3IgPSBidWZpZHggPSAwOworCWN1ciA9IE5VTEw7CisJYWdicCA9IE5VTEw7CisJd2hpbGUgKGxlZnQgPiAwICYmIGFnbm8gPCBtcC0+bV9zYi5zYl9hZ2NvdW50KSB7CisJCWlmIChhZ2JwID09IE5VTEwpIHsKKwkJCWRvd25fcmVhZCgmbXAtPm1fcGVyYWdsb2NrKTsKKwkJCWVycm9yID0geGZzX2lhbGxvY19yZWFkX2FnaShtcCwgTlVMTCwgYWdubywgJmFnYnApOworCQkJdXBfcmVhZCgmbXAtPm1fcGVyYWdsb2NrKTsKKwkJCWlmIChlcnJvcikgeworCQkJCS8qCisJCQkJICogSWYgd2UgY2FuJ3QgcmVhZCB0aGUgQUdJIG9mIHRoaXMgYWcsCisJCQkJICogdGhlbiBqdXN0IHNraXAgdG8gdGhlIG5leHQgb25lLgorCQkJCSAqLworCQkJCUFTU0VSVChjdXIgPT0gTlVMTCk7CisJCQkJYWdicCA9IE5VTEw7CisJCQkJYWdubysrOworCQkJCWFnaW5vID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWN1ciA9IHhmc19idHJlZV9pbml0X2N1cnNvcihtcCwgTlVMTCwgYWdicCwgYWdubywKKwkJCQlYRlNfQlROVU1fSU5PLCAoeGZzX2lub2RlX3QgKikwLCAwKTsKKwkJCWVycm9yID0geGZzX2lub2J0X2xvb2t1cF9nZShjdXIsIGFnaW5vLCAwLCAwLCAmdG1wKTsKKwkJCWlmIChlcnJvcikgeworCQkJCXhmc19idHJlZV9kZWxfY3Vyc29yKGN1ciwgWEZTX0JUUkVFX0VSUk9SKTsKKwkJCQljdXIgPSBOVUxMOworCQkJCXhmc19idWZfcmVsc2UoYWdicCk7CisJCQkJYWdicCA9IE5VTEw7CisJCQkJLyoKKwkJCQkgKiBNb3ZlIHVwIHRoZSB0aGUgbGFzdCBpbm9kZSBpbiB0aGUgY3VycmVudAorCQkJCSAqIGNodW5rLiAgVGhlIGxvb2t1cF9nZSB3aWxsIGFsd2F5cyBnZXQKKwkJCQkgKiB1cyB0aGUgZmlyc3QgaW5vZGUgaW4gdGhlIG5leHQgY2h1bmsuCisJCQkJICovCisJCQkJYWdpbm8gKz0gWEZTX0lOT0RFU19QRVJfQ0hVTksgLSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCWlmICgoZXJyb3IgPSB4ZnNfaW5vYnRfZ2V0X3JlYyhjdXIsICZnaW5vLCAmZ2NudCwgJmdmcmVlLAorCQkJJmkpKSB8fAorCQkgICAgaSA9PSAwKSB7CisJCQl4ZnNfYnVmX3JlbHNlKGFnYnApOworCQkJYWdicCA9IE5VTEw7CisJCQl4ZnNfYnRyZWVfZGVsX2N1cnNvcihjdXIsIFhGU19CVFJFRV9OT0VSUk9SKTsKKwkJCWN1ciA9IE5VTEw7CisJCQlhZ25vKys7CisJCQlhZ2lubyA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCQlhZ2lubyA9IGdpbm8gKyBYRlNfSU5PREVTX1BFUl9DSFVOSyAtIDE7CisJCWJ1ZmZlcltidWZpZHhdLnhpX3N0YXJ0aW5vID0gWEZTX0FHSU5PX1RPX0lOTyhtcCwgYWdubywgZ2lubyk7CisJCWJ1ZmZlcltidWZpZHhdLnhpX2FsbG9jY291bnQgPSBYRlNfSU5PREVTX1BFUl9DSFVOSyAtIGdjbnQ7CisJCWJ1ZmZlcltidWZpZHhdLnhpX2FsbG9jbWFzayA9IH5nZnJlZTsKKwkJYnVmaWR4Kys7CisJCWxlZnQtLTsKKwkJaWYgKGJ1ZmlkeCA9PSBiY291bnQpIHsKKwkJCWlmIChjb3B5X3RvX3VzZXIodWJ1ZmZlciwgYnVmZmVyLAorCQkJCQlidWZpZHggKiBzaXplb2YoKmJ1ZmZlcikpKSB7CisJCQkJZXJyb3IgPSBYRlNfRVJST1IoRUZBVUxUKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXVidWZmZXIgKz0gYnVmaWR4OworCQkJKmNvdW50ICs9IGJ1ZmlkeDsKKwkJCWJ1ZmlkeCA9IDA7CisJCX0KKwkJaWYgKGxlZnQpIHsKKwkJCWVycm9yID0geGZzX2lub2J0X2luY3JlbWVudChjdXIsIDAsICZ0bXApOworCQkJaWYgKGVycm9yKSB7CisJCQkJeGZzX2J0cmVlX2RlbF9jdXJzb3IoY3VyLCBYRlNfQlRSRUVfRVJST1IpOworCQkJCWN1ciA9IE5VTEw7CisJCQkJeGZzX2J1Zl9yZWxzZShhZ2JwKTsKKwkJCQlhZ2JwID0gTlVMTDsKKwkJCQkvKgorCQkJCSAqIFRoZSBhZ2lubyB2YWx1ZSBoYXMgYWxyZWFkeSBiZWVuIGJ1bXBlZC4KKwkJCQkgKiBKdXN0IHRyeSB0byBza2lwIHVwIHRvIGl0LgorCQkJCSAqLworCQkJCWFnaW5vICs9IFhGU19JTk9ERVNfUEVSX0NIVU5LOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJfQorCWlmICghZXJyb3IpIHsKKwkJaWYgKGJ1ZmlkeCkgeworCQkJaWYgKGNvcHlfdG9fdXNlcih1YnVmZmVyLCBidWZmZXIsCisJCQkJCWJ1ZmlkeCAqIHNpemVvZigqYnVmZmVyKSkpCisJCQkJZXJyb3IgPSBYRlNfRVJST1IoRUZBVUxUKTsKKwkJCWVsc2UKKwkJCQkqY291bnQgKz0gYnVmaWR4OworCQl9CisJCSpsYXN0aW5vID0gWEZTX0FHSU5PX1RPX0lOTyhtcCwgYWdubywgYWdpbm8pOworCX0KKwlrbWVtX2ZyZWUoYnVmZmVyLCBiY291bnQgKiBzaXplb2YoKmJ1ZmZlcikpOworCWlmIChjdXIpCisJCXhmc19idHJlZV9kZWxfY3Vyc29yKGN1ciwgKGVycm9yID8gWEZTX0JUUkVFX0VSUk9SIDoKKwkJCQkJICAgWEZTX0JUUkVFX05PRVJST1IpKTsKKwlpZiAoYWdicCkKKwkJeGZzX2J1Zl9yZWxzZShhZ2JwKTsKKwlyZXR1cm4gZXJyb3I7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2l0YWJsZS5oIGIvZnMveGZzL3hmc19pdGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmU5ZDE4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19pdGFibGUuaApAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAxIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfSVRBQkxFX0hfXworI2RlZmluZQlfX1hGU19JVEFCTEVfSF9fCisKKy8qCisgKiB4ZnNfYnVsa3N0YXQoKSBpcyB1c2VkIHRvIGZpbGwgaW4geGZzX2JzdGF0IHN0cnVjdHVyZXMgYXMgd2VsbCBhcyBkbV9zdGF0CisgKiBzdHJ1Y3R1cmVzIChieSB0aGUgZG1pIGxpYnJhcnkpLiBUaGlzIGlzIGEgcG9pbnRlciB0byBhIGZvcm1hdHRlciBmdW5jdGlvbgorICogdGhhdCB3aWxsIGlnZXQgdGhlIGlub2RlIGFuZCBmaWxsIGluIHRoZSBhcHByb3ByaWF0ZSBzdHJ1Y3R1cmUuCisgKiBzZWUgeGZzX2J1bGtzdGF0X29uZSgpIGFuZCB4ZnNfZG1fYnVsa3N0YXRfb25lKCkgaW4gZG1hcGlfeGZzLmMKKyAqLwordHlwZWRlZiBpbnQgKCpidWxrc3RhdF9vbmVfcGYpKHN0cnVjdCB4ZnNfbW91bnQJKm1wLAorCQkJICAgICAgIHhmc19pbm9fdAlpbm8sCisJCQkgICAgICAgdm9pZAkJX191c2VyICpidWZmZXIsCisJCQkgICAgICAgaW50CQl1YnNpemUsCisJCQkgICAgICAgdm9pZAkJKnByaXZhdGVfZGF0YSwKKwkJCSAgICAgICB4ZnNfZGFkZHJfdAlibm8sCisJCQkgICAgICAgaW50CQkqdWJ1c2VkLAorCQkJICAgICAgIHZvaWQJCSpkaXAsCisJCQkgICAgICAgaW50CQkqc3RhdCk7CisKKy8qCisgKiBWYWx1ZXMgZm9yIHN0YXQgcmV0dXJuIHZhbHVlLgorICovCisjZGVmaW5lCUJVTEtTVEFUX1JWX05PVEhJTkcJMAorI2RlZmluZQlCVUxLU1RBVF9SVl9ESURPTkUJMQorI2RlZmluZQlCVUxLU1RBVF9SVl9HSVZFVVAJMgorCisvKgorICogVmFsdWVzIGZvciBidWxrc3RhdCBmbGFnIGFyZ3VtZW50LgorICovCisjZGVmaW5lCUJVTEtTVEFUX0ZHX0lHRVQJMHgxCS8qIEdvIHRocm91Z2ggdGhlIGJ1ZmZlciBjYWNoZSAqLworI2RlZmluZQlCVUxLU1RBVF9GR19RVUlDSwkweDIJLyogTm8gaWdldCwgd2FsayB0aGUgZGlub2RlIGNsdXN0ZXIgKi8KKyNkZWZpbmUgQlVMS1NUQVRfRkdfVkZTTE9DS0VECTB4NAkvKiBBbHJlYWR5IGhhdmUgdmZzIGxvY2sgKi8KKworLyoKKyAqIFJldHVybiBzdGF0IGluZm9ybWF0aW9uIGluIGJ1bGsgKGJ5LWlub2RlKSBmb3IgdGhlIGZpbGVzeXN0ZW0uCisgKi8KK2ludAkJCQkJLyogZXJyb3Igc3RhdHVzICovCit4ZnNfYnVsa3N0YXQoCisJeGZzX21vdW50X3QJKm1wLAkJLyogbW91bnQgcG9pbnQgZm9yIGZpbGVzeXN0ZW0gKi8KKwl4ZnNfaW5vX3QJKmxhc3Rpbm8sCS8qIGxhc3QgaW5vZGUgcmV0dXJuZWQgKi8KKwlpbnQJCSpjb3VudCwJCS8qIHNpemUgb2YgYnVmZmVyL2NvdW50IHJldHVybmVkICovCisJYnVsa3N0YXRfb25lX3BmIGZvcm1hdHRlciwJLyogZnVuYyB0aGF0J2QgZmlsbCBhIHNpbmdsZSBidWYgKi8KKwl2b2lkCQkqcHJpdmF0ZV9kYXRhLAkvKiBwcml2YXRlIGRhdGEgZm9yIGZvcm1hdHRlciAqLworCXNpemVfdAkJc3RhdHN0cnVjdF9zaXplLC8qIHNpemVvZiBzdHJ1Y3QgdGhhdCB3ZSdyZSBmaWxsaW5nICovCisJY2hhcgkJX191c2VyICp1YnVmZmVyLC8qIGJ1ZmZlciB3aXRoIGlub2RlIHN0YXRzICovCisJaW50CQlmbGFncywJCS8qIGZsYWcgdG8gY29udHJvbCBhY2Nlc3MgbWV0aG9kICovCisJaW50CQkqZG9uZSk7CQkvKiAxIGlmIHRoZXJlJ3JlIG1vcmUgc3RhdHMgdG8gZ2V0ICovCisKK2ludAoreGZzX2J1bGtzdGF0X3NpbmdsZSgKKwl4ZnNfbW91bnRfdAkJKm1wLAorCXhmc19pbm9fdAkJKmxhc3Rpbm9wLAorCWNoYXIJCQlfX3VzZXIgKmJ1ZmZlciwKKwlpbnQJCQkqZG9uZSk7CisKK2ludAoreGZzX2J1bGtzdGF0X29uZSgKKwl4ZnNfbW91bnRfdAkJKm1wLAorCXhmc19pbm9fdAkJaW5vLAorCXZvaWQJCQlfX3VzZXIgKmJ1ZmZlciwKKwlpbnQJCQl1YnNpemUsCisJdm9pZAkJCSpwcml2YXRlX2RhdGEsCisJeGZzX2RhZGRyX3QJCWJubywKKwlpbnQJCQkqdWJ1c2VkLAorCXZvaWQJCQkqZGlidWZmLAorCWludAkJCSpzdGF0KTsKKworaW50CQkJCQkvKiBlcnJvciBzdGF0dXMgKi8KK3hmc19pbnVtYmVycygKKwl4ZnNfbW91bnRfdAkJKm1wLAkvKiBtb3VudCBwb2ludCBmb3IgZmlsZXN5c3RlbSAqLworCXhmc19pbm9fdAkJKmxhc3QsCS8qIGxhc3QgaW5vZGUgcmV0dXJuZWQgKi8KKwlpbnQJCQkqY291bnQsCS8qIHNpemUgb2YgYnVmZmVyL2NvdW50IHJldHVybmVkICovCisJeGZzX2lub2dycF90CQlfX3VzZXIgKmJ1ZmZlcik7LyogYnVmZmVyIHdpdGggaW5vZGUgaW5mbyAqLworCisjZW5kaWYJLyogX19YRlNfSVRBQkxFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19sb2cuYyBiL2ZzL3hmcy94ZnNfbG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkyZDVmYgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfbG9nLmMKQEAgLTAsMCArMSwzNTYwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisvKgorICogSGlnaCBsZXZlbCBpbnRlcmZhY2Ugcm91dGluZXMgZm9yIGxvZyBtYW5hZ2VyCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19hZy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisjaW5jbHVkZSAieGZzX2xvZ19wcml2LmgiCisjaW5jbHVkZSAieGZzX2J1Zl9pdGVtLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2xvZ19yZWNvdmVyLmgiCisjaW5jbHVkZSAieGZzX2JpdC5oIgorI2luY2x1ZGUgInhmc19ydy5oIgorI2luY2x1ZGUgInhmc190cmFuc19wcml2LmgiCisKKworI2RlZmluZSB4bG9nX3dyaXRlX2Fkdl9jbnQocHRyLCBsZW4sIG9mZiwgYnl0ZXMpIFwKKwl7IChwdHIpICs9IChieXRlcyk7IFwKKwkgIChsZW4pIC09IChieXRlcyk7IFwKKwkgIChvZmYpICs9IChieXRlcyk7fQorCisvKiBMb2NhbCBtaXNjZWxsYW5lb3VzIGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KK1NUQVRJQyBpbnQJIHhsb2dfYmRzdHJhdF9jYihzdHJ1Y3QgeGZzX2J1ZiAqKTsKK1NUQVRJQyBpbnQJIHhsb2dfY29tbWl0X3JlY29yZCh4ZnNfbW91bnRfdCAqbXAsIHhsb2dfdGlja2V0X3QgKnRpY2tldCwKKwkJCQkgICAgeGxvZ19pbl9jb3JlX3QgKiosIHhmc19sc25fdCAqKTsKK1NUQVRJQyB4bG9nX3QgKiAgeGxvZ19hbGxvY19sb2coeGZzX21vdW50X3QJKm1wLAorCQkJCXhmc19idWZ0YXJnX3QJKmxvZ190YXJnZXQsCisJCQkJeGZzX2RhZGRyX3QJYmxrX29mZnNldCwKKwkJCQlpbnQJCW51bV9iYmxrcyk7CitTVEFUSUMgaW50CSB4bG9nX3NwYWNlX2xlZnQoeGxvZ190ICpsb2csIGludCBjeWNsZSwgaW50IGJ5dGVzKTsKK1NUQVRJQyBpbnQJIHhsb2dfc3luYyh4bG9nX3QgKmxvZywgeGxvZ19pbl9jb3JlX3QgKmljbG9nKTsKK1NUQVRJQyB2b2lkCSB4bG9nX3VuYWxsb2NfbG9nKHhsb2dfdCAqbG9nKTsKK1NUQVRJQyBpbnQJIHhsb2dfd3JpdGUoeGZzX21vdW50X3QgKm1wLCB4ZnNfbG9nX2lvdmVjX3QgcmVnaW9uW10sCisJCQkgICAgaW50IG5lbnRyaWVzLCB4ZnNfbG9nX3RpY2tldF90IHRpYywKKwkJCSAgICB4ZnNfbHNuX3QgKnN0YXJ0X2xzbiwKKwkJCSAgICB4bG9nX2luX2NvcmVfdCAqKmNvbW1pdF9pY2xvZywKKwkJCSAgICB1aW50IGZsYWdzKTsKKworLyogbG9jYWwgc3RhdGUgbWFjaGluZSBmdW5jdGlvbnMgKi8KK1NUQVRJQyB2b2lkIHhsb2dfc3RhdGVfZG9uZV9zeW5jaW5nKHhsb2dfaW5fY29yZV90ICppY2xvZywgaW50KTsKK1NUQVRJQyB2b2lkIHhsb2dfc3RhdGVfZG9fY2FsbGJhY2soeGxvZ190ICpsb2csaW50IGFib3J0ZWQsIHhsb2dfaW5fY29yZV90ICppY2xvZyk7CitTVEFUSUMgaW50ICB4bG9nX3N0YXRlX2dldF9pY2xvZ19zcGFjZSh4bG9nX3QJCSpsb2csCisJCQkJICAgICAgIGludAkJbGVuLAorCQkJCSAgICAgICB4bG9nX2luX2NvcmVfdAkqKmljbG9nLAorCQkJCSAgICAgICB4bG9nX3RpY2tldF90CSp0aWNrZXQsCisJCQkJICAgICAgIGludAkJKmNvbnRpbnVlZF93cml0ZSwKKwkJCQkgICAgICAgaW50CQkqbG9nb2Zmc2V0cCk7CitTVEFUSUMgdm9pZCB4bG9nX3N0YXRlX3B1dF90aWNrZXQoeGxvZ190CSpsb2csCisJCQkJICB4bG9nX3RpY2tldF90ICp0aWMpOworU1RBVElDIGludCAgeGxvZ19zdGF0ZV9yZWxlYXNlX2ljbG9nKHhsb2dfdAkJKmxvZywKKwkJCQkgICAgIHhsb2dfaW5fY29yZV90CSppY2xvZyk7CitTVEFUSUMgdm9pZCB4bG9nX3N0YXRlX3N3aXRjaF9pY2xvZ3MoeGxvZ190CQkqbG9nLAorCQkJCSAgICAgeGxvZ19pbl9jb3JlX3QgKmljbG9nLAorCQkJCSAgICAgaW50CQlldmVudHVhbF9zaXplKTsKK1NUQVRJQyBpbnQgIHhsb2dfc3RhdGVfc3luYyh4bG9nX3QgKmxvZywgeGZzX2xzbl90IGxzbiwgdWludCBmbGFncyk7CitTVEFUSUMgaW50ICB4bG9nX3N0YXRlX3N5bmNfYWxsKHhsb2dfdCAqbG9nLCB1aW50IGZsYWdzKTsKK1NUQVRJQyB2b2lkIHhsb2dfc3RhdGVfd2FudF9zeW5jKHhsb2dfdAkqbG9nLCB4bG9nX2luX2NvcmVfdCAqaWNsb2cpOworCisvKiBsb2NhbCBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSBncmFudCBoZWFkICovCitTVEFUSUMgaW50ICB4bG9nX2dyYW50X2xvZ19zcGFjZSh4bG9nX3QJCSpsb2csCisJCQkJIHhsb2dfdGlja2V0X3QJKnh0aWMpOworU1RBVElDIHZvaWQgeGxvZ19ncmFudF9wdXNoX2FpbCh4ZnNfbW91bnRfdAkqbXAsCisJCQkJaW50CQluZWVkX2J5dGVzKTsKK1NUQVRJQyB2b2lkIHhsb2dfcmVncmFudF9yZXNlcnZlX2xvZ19zcGFjZSh4bG9nX3QJICpsb2csCisJCQkJCSAgIHhsb2dfdGlja2V0X3QgKnRpY2tldCk7CitTVEFUSUMgaW50IHhsb2dfcmVncmFudF93cml0ZV9sb2dfc3BhY2UoeGxvZ190CQkqbG9nLAorCQkJCQkgeGxvZ190aWNrZXRfdCAgKnRpY2tldCk7CitTVEFUSUMgdm9pZCB4bG9nX3VuZ3JhbnRfbG9nX3NwYWNlKHhsb2dfdAkgKmxvZywKKwkJCQkgICB4bG9nX3RpY2tldF90ICp0aWNrZXQpOworCisKKy8qIGxvY2FsIHRpY2tldCBmdW5jdGlvbnMgKi8KK1NUQVRJQyB2b2lkCQl4bG9nX3N0YXRlX3RpY2tldF9hbGxvYyh4bG9nX3QgKmxvZyk7CitTVEFUSUMgeGxvZ190aWNrZXRfdAkqeGxvZ190aWNrZXRfZ2V0KHhsb2dfdCAqbG9nLAorCQkJCQkgaW50CXVuaXRfYnl0ZXMsCisJCQkJCSBpbnQJY291bnQsCisJCQkJCSBjaGFyCWNsaWVudGlkLAorCQkJCQkgdWludAlmbGFncyk7CitTVEFUSUMgdm9pZAkJeGxvZ190aWNrZXRfcHV0KHhsb2dfdCAqbG9nLCB4bG9nX3RpY2tldF90ICp0aWNrZXQpOworCisvKiBsb2NhbCBkZWJ1ZyBmdW5jdGlvbnMgKi8KKyNpZiBkZWZpbmVkKERFQlVHKSAmJiAhZGVmaW5lZChYTE9HX05PTE9HKQorU1RBVElDIHZvaWQJeGxvZ192ZXJpZnlfZGVzdF9wdHIoeGxvZ190ICpsb2csIF9fcHNpbnRfdCBwdHIpOworU1RBVElDIHZvaWQJeGxvZ192ZXJpZnlfZ3JhbnRfaGVhZCh4bG9nX3QgKmxvZywgaW50IGVxdWFscyk7CitTVEFUSUMgdm9pZAl4bG9nX3ZlcmlmeV9pY2xvZyh4bG9nX3QgKmxvZywgeGxvZ19pbl9jb3JlX3QgKmljbG9nLAorCQkJCSAgaW50IGNvdW50LCBib29sZWFuX3Qgc3luY2luZyk7CitTVEFUSUMgdm9pZAl4bG9nX3ZlcmlmeV90YWlsX2xzbih4bG9nX3QgKmxvZywgeGxvZ19pbl9jb3JlX3QgKmljbG9nLAorCQkJCSAgICAgeGZzX2xzbl90IHRhaWxfbHNuKTsKKyNlbHNlCisjZGVmaW5lIHhsb2dfdmVyaWZ5X2Rlc3RfcHRyKGEsYikKKyNkZWZpbmUgeGxvZ192ZXJpZnlfZ3JhbnRfaGVhZChhLGIpCisjZGVmaW5lIHhsb2dfdmVyaWZ5X2ljbG9nKGEsYixjLGQpCisjZGVmaW5lIHhsb2dfdmVyaWZ5X3RhaWxfbHNuKGEsYixjKQorI2VuZGlmCisKK2ludAkJeGxvZ19pY2xvZ3NfZW1wdHkoeGxvZ190ICpsb2cpOworCisjaWZkZWYgREVCVUcKK2ludCB4bG9nX2RvX2Vycm9yID0gMDsKK2ludCB4bG9nX3JlcV9udW0gID0gMDsKK2ludCB4bG9nX2Vycm9yX21vZCA9IDMzOworI2VuZGlmCisKKyNkZWZpbmUgWExPR19GT1JDRURfU0hVVERPV04obG9nKQkobG9nLT5sX2ZsYWdzICYgWExPR19JT19FUlJPUikKKworLyoKKyAqIDAgPT4gZGlzYWJsZSBsb2cgbWFuYWdlcgorICogMSA9PiBlbmFibGUgbG9nIG1hbmFnZXIKKyAqIDIgPT4gZW5hYmxlIGxvZyBtYW5hZ2VyIGFuZCBsb2cgZGVidWdnaW5nCisgKi8KKyNpZiBkZWZpbmVkKFhMT0dfTk9MT0cpIHx8IGRlZmluZWQoREVCVUcpCitpbnQgICB4bG9nX2RlYnVnID0gMTsKK3hmc19idWZ0YXJnX3QgKnhsb2dfdGFyZ2V0OworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFhGU19MT0dfVFJBQ0UpCisKK3ZvaWQKK3hsb2dfdHJhY2VfbG9nZ3JhbnQoeGxvZ190ICpsb2csIHhsb2dfdGlja2V0X3QgKnRpYywgeGZzX2NhZGRyX3Qgc3RyaW5nKQoreworCWlmICghIGxvZy0+bF9ncmFudF90cmFjZSkgeworCQlsb2ctPmxfZ3JhbnRfdHJhY2UgPSBrdHJhY2VfYWxsb2MoMTAyNCwgS01fTk9TTEVFUCk7CisJCWlmICghIGxvZy0+bF9ncmFudF90cmFjZSkKKwkJCXJldHVybjsKKwl9CisKKwlrdHJhY2VfZW50ZXIobG9nLT5sX2dyYW50X3RyYWNlLAorCQkgICAgICh2b2lkICopdGljLAorCQkgICAgICh2b2lkICopbG9nLT5sX3Jlc2VydmVfaGVhZHEsCisJCSAgICAgKHZvaWQgKilsb2ctPmxfd3JpdGVfaGVhZHEsCisJCSAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpbG9nLT5sX2dyYW50X3Jlc2VydmVfY3ljbGUpLAorCQkgICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKWxvZy0+bF9ncmFudF9yZXNlcnZlX2J5dGVzKSwKKwkJICAgICAodm9pZCAqKSgodW5zaWduZWQgbG9uZylsb2ctPmxfZ3JhbnRfd3JpdGVfY3ljbGUpLAorCQkgICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKWxvZy0+bF9ncmFudF93cml0ZV9ieXRlcyksCisJCSAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpbG9nLT5sX2N1cnJfY3ljbGUpLAorCQkgICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKWxvZy0+bF9jdXJyX2Jsb2NrKSwKKwkJICAgICAodm9pZCAqKSgodW5zaWduZWQgbG9uZylDWUNMRV9MU04obG9nLT5sX3RhaWxfbHNuKSksCisJCSAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpQkxPQ0tfTFNOKGxvZy0+bF90YWlsX2xzbikpLAorCQkgICAgICh2b2lkICopc3RyaW5nLAorCQkgICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKTEzKSwKKwkJICAgICAodm9pZCAqKSgodW5zaWduZWQgbG9uZykxNCksCisJCSAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpMTUpLAorCQkgICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKTE2KSk7Cit9CisKK3ZvaWQKK3hsb2dfdHJhY2VfaWNsb2coeGxvZ19pbl9jb3JlX3QgKmljbG9nLCB1aW50IHN0YXRlKQoreworCXBpZF90IHBpZDsKKworCXBpZCA9IGN1cnJlbnRfcGlkKCk7CisKKwlpZiAoIWljbG9nLT5pY190cmFjZSkKKwkJaWNsb2ctPmljX3RyYWNlID0ga3RyYWNlX2FsbG9jKDI1NiwgS01fU0xFRVApOworCWt0cmFjZV9lbnRlcihpY2xvZy0+aWNfdHJhY2UsCisJCSAgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpc3RhdGUpLAorCQkgICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKXBpZCksCisJCSAgICAgKHZvaWQgKikwLAorCQkgICAgICh2b2lkICopMCwKKwkJICAgICAodm9pZCAqKTAsCisJCSAgICAgKHZvaWQgKikwLAorCQkgICAgICh2b2lkICopMCwKKwkJICAgICAodm9pZCAqKTAsCisJCSAgICAgKHZvaWQgKikwLAorCQkgICAgICh2b2lkICopMCwKKwkJICAgICAodm9pZCAqKTAsCisJCSAgICAgKHZvaWQgKikwLAorCQkgICAgICh2b2lkICopMCwKKwkJICAgICAodm9pZCAqKTAsCisJCSAgICAgKHZvaWQgKikwLAorCQkgICAgICh2b2lkICopMCk7Cit9CisKKyNlbHNlCisjZGVmaW5lCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLHRpYyxzdHJpbmcpCisjZGVmaW5lCXhsb2dfdHJhY2VfaWNsb2coaWNsb2csc3RhdGUpCisjZW5kaWYgLyogWEZTX0xPR19UUkFDRSAqLworCisvKgorICogTk9URVM6CisgKgorICoJMS4gY3VycmJsb2NrIGZpZWxkIGdldHMgdXBkYXRlZCBhdCBzdGFydHVwIGFuZCBhZnRlciBpbi1jb3JlIGxvZ3MKKyAqCQltYXJrZWQgYXMgd2l0aCBXQU5UX1NZTkMuCisgKi8KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbiBhIHVzZXIgb2YgYSBsb2cgbWFuYWdlciB0aWNrZXQgaXMgZG9uZSB3aXRoCisgKiB0aGUgcmVzZXJ2YXRpb24uICBJZiB0aGUgdGlja2V0IHdhcyBldmVyIHVzZWQsIHRoZW4gYSBjb21taXQgcmVjb3JkIGZvcgorICogdGhlIGFzc29jaWF0ZWQgdHJhbnNhY3Rpb24gaXMgd3JpdHRlbiBvdXQgYXMgYSBsb2cgb3BlcmF0aW9uIGhlYWRlciB3aXRoCisgKiBubyBkYXRhLiAgVGhlIGZsYWcgWExPR19USUNfSU5JVEVEIGlzIHNldCB3aGVuIHRoZSBmaXJzdCB3cml0ZSBvY2N1cnMgd2l0aAorICogYSBnaXZlbiB0aWNrZXQuICBJZiB0aGUgdGlja2V0IHdhcyBvbmUgd2l0aCBhIHBlcm1hbmVudCByZXNlcnZhdGlvbiwgdGhlbgorICogYSBmZXcgb3BlcmF0aW9ucyBhcmUgZG9uZSBkaWZmZXJlbnRseS4gIFBlcm1hbmVudCByZXNlcnZhdGlvbiB0aWNrZXRzIGJ5CisgKiBkZWZhdWx0IGRvbid0IHJlbGVhc2UgdGhlIHJlc2VydmF0aW9uLiAgVGhleSBqdXN0IGNvbW1pdCB0aGUgY3VycmVudAorICogdHJhbnNhY3Rpb24gd2l0aCB0aGUgYmVsaWVmIHRoYXQgdGhlIHJlc2VydmF0aW9uIGlzIHN0aWxsIG5lZWRlZC4gIEEgZmxhZworICogbXVzdCBiZSBwYXNzZWQgaW4gYmVmb3JlIHBlcm1hbmVudCByZXNlcnZhdGlvbnMgYXJlIGFjdHVhbGx5IHJlbGVhc2VkLgorICogV2hlbiB0aGVzZSB0eXBlIG9mIHRpY2tldHMgYXJlIG5vdCByZWxlYXNlZCwgdGhleSBuZWVkIHRvIGJlIHNldCBpbnRvCisgKiB0aGUgaW5pdGVkIHN0YXRlIGFnYWluLiAgQnkgZG9pbmcgdGhpcywgYSBzdGFydCByZWNvcmQgd2lsbCBiZSB3cml0dGVuCisgKiBvdXQgd2hlbiB0aGUgbmV4dCB3cml0ZSBvY2N1cnMuCisgKi8KK3hmc19sc25fdAoreGZzX2xvZ19kb25lKHhmc19tb3VudF90CSptcCwKKwkgICAgIHhmc19sb2dfdGlja2V0X3QJeHRpYywKKwkgICAgIHZvaWQJCSoqaWNsb2csCisJICAgICB1aW50CQlmbGFncykKK3sKKwl4bG9nX3QJCSpsb2cgICAgPSBtcC0+bV9sb2c7CisJeGxvZ190aWNrZXRfdAkqdGlja2V0ID0gKHhmc19sb2dfdGlja2V0X3QpIHh0aWM7CisJeGZzX2xzbl90CWxzbgk9IDA7CisKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKFhMT0dfTk9MT0cpCisJaWYgKCF4bG9nX2RlYnVnICYmIHhsb2dfdGFyZ2V0ID09IGxvZy0+bF90YXJnKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorCisJaWYgKFhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykgfHwKKwkgICAgLyoKKwkgICAgICogSWYgbm90aGluZyB3YXMgZXZlciB3cml0dGVuLCBkb24ndCB3cml0ZSBvdXQgY29tbWl0IHJlY29yZC4KKwkgICAgICogSWYgd2UgZ2V0IGFuIGVycm9yLCBqdXN0IGNvbnRpbnVlIGFuZCBnaXZlIGJhY2sgdGhlIGxvZyB0aWNrZXQuCisJICAgICAqLworCSAgICAoKCh0aWNrZXQtPnRfZmxhZ3MgJiBYTE9HX1RJQ19JTklURUQpID09IDApICYmCisJICAgICAoeGxvZ19jb21taXRfcmVjb3JkKG1wLCB0aWNrZXQsCisJCQkJICh4bG9nX2luX2NvcmVfdCAqKilpY2xvZywgJmxzbikpKSkgeworCQlsc24gPSAoeGZzX2xzbl90KSAtMTsKKwkJaWYgKHRpY2tldC0+dF9mbGFncyAmIFhMT0dfVElDX1BFUk1fUkVTRVJWKSB7CisJCQlmbGFncyB8PSBYRlNfTE9HX1JFTF9QRVJNX1JFU0VSVjsKKwkJfQorCX0KKworCisJaWYgKCh0aWNrZXQtPnRfZmxhZ3MgJiBYTE9HX1RJQ19QRVJNX1JFU0VSVikgPT0gMCB8fAorCSAgICAoZmxhZ3MgJiBYRlNfTE9HX1JFTF9QRVJNX1JFU0VSVikpIHsKKwkJLyoKKwkJICogUmVsZWFzZSB0aWNrZXQgaWYgbm90IHBlcm1hbmVudCByZXNlcnZhdGlvbiBvciBhIHNwZWNpZmMKKwkJICogcmVxdWVzdCBoYXMgYmVlbiBtYWRlIHRvIHJlbGVhc2UgYSBwZXJtYW5lbnQgcmVzZXJ2YXRpb24uCisJCSAqLworCQl4bG9nX3VuZ3JhbnRfbG9nX3NwYWNlKGxvZywgdGlja2V0KTsKKwkJeGxvZ19zdGF0ZV9wdXRfdGlja2V0KGxvZywgdGlja2V0KTsKKwl9IGVsc2UgeworCQl4bG9nX3JlZ3JhbnRfcmVzZXJ2ZV9sb2dfc3BhY2UobG9nLCB0aWNrZXQpOworCX0KKworCS8qIElmIHRoaXMgdGlja2V0IHdhcyBhIHBlcm1hbmVudCByZXNlcnZhdGlvbiBhbmQgd2UgYXJlbid0CisJICogdHJ5aW5nIHRvIHJlbGVhc2UgaXQsIHJlc2V0IHRoZSBpbml0ZWQgZmxhZ3M7IHNvIG5leHQgdGltZQorCSAqIHdlIHdyaXRlLCBhIHN0YXJ0IHJlY29yZCB3aWxsIGJlIHdyaXR0ZW4gb3V0LgorCSAqLworCWlmICgodGlja2V0LT50X2ZsYWdzICYgWExPR19USUNfUEVSTV9SRVNFUlYpICYmCisJICAgIChmbGFncyAmIFhGU19MT0dfUkVMX1BFUk1fUkVTRVJWKSA9PSAwKQorCQl0aWNrZXQtPnRfZmxhZ3MgfD0gWExPR19USUNfSU5JVEVEOworCisJcmV0dXJuIGxzbjsKK30JLyogeGZzX2xvZ19kb25lICovCisKKworLyoKKyAqIEZvcmNlIHRoZSBpbi1jb3JlIGxvZyB0byBkaXNrLiAgSWYgZmxhZ3MgPT0gWEZTX0xPR19TWU5DLAorICoJdGhlIGZvcmNlIGlzIGRvbmUgc3luY2hyb25vdXNseS4KKyAqCisgKiBBc3luY2hyb25vdXMgZm9yY2VzIGFyZSBpbXBsZW1lbnRlZCBieSBzZXR0aW5nIHRoZSBXQU5UX1NZTkMKKyAqIGJpdCBpbiB0aGUgYXBwcm9wcmlhdGUgaW4tY29yZSBsb2cgYW5kIHRoZW4gcmV0dXJuaW5nLgorICoKKyAqIFN5bmNocm9ub3VzIGZvcmNlcyBhcmUgaW1wbGVtZW50ZWQgd2l0aCBhIHNlbWFwaG9yZS4gIEFsbCBjYWxsZXJzCisgKiB0byBmb3JjZSBhIGdpdmVuIGxzbiB0byBkaXNrIHdpbGwgd2FpdCBvbiBhIHNlbWFwaG9yZSBhdHRhY2hlZCB0byB0aGUKKyAqIHNwZWNpZmljIGluLWNvcmUgbG9nLiAgV2hlbiBnaXZlbiBpbi1jb3JlIGxvZyBmaW5hbGx5IGNvbXBsZXRlcyBpdHMKKyAqIHdyaXRlIHRvIGRpc2ssIHRoYXQgdGhyZWFkIHdpbGwgd2FrZSB1cCBhbGwgdGhyZWFkcyB3YWl0aW5nIG9uIHRoZQorICogc2VtYXBob3JlLgorICovCitpbnQKK3hmc19sb2dfZm9yY2UoeGZzX21vdW50X3QgKm1wLAorCSAgICAgIHhmc19sc25fdAkgIGxzbiwKKwkgICAgICB1aW50CSAgZmxhZ3MpCit7CisJaW50CXJ2YWw7CisJeGxvZ190ICpsb2cgPSBtcC0+bV9sb2c7CisKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKFhMT0dfTk9MT0cpCisJaWYgKCF4bG9nX2RlYnVnICYmIHhsb2dfdGFyZ2V0ID09IGxvZy0+bF90YXJnKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorCisJQVNTRVJUKGZsYWdzICYgWEZTX0xPR19GT1JDRSk7CisKKwlYRlNfU1RBVFNfSU5DKHhzX2xvZ19mb3JjZSk7CisKKwlpZiAoKGxvZy0+bF9mbGFncyAmIFhMT0dfSU9fRVJST1IpID09IDApIHsKKwkJaWYgKGxzbiA9PSAwKQorCQkJcnZhbCA9IHhsb2dfc3RhdGVfc3luY19hbGwobG9nLCBmbGFncyk7CisJCWVsc2UKKwkJCXJ2YWwgPSB4bG9nX3N0YXRlX3N5bmMobG9nLCBsc24sIGZsYWdzKTsKKwl9IGVsc2UgeworCQlydmFsID0gWEZTX0VSUk9SKEVJTyk7CisJfQorCisJcmV0dXJuIHJ2YWw7CisKK30JLyogeGZzX2xvZ19mb3JjZSAqLworCisvKgorICogQXR0YWNoZXMgYSBuZXcgaWNsb2cgSS9PIGNvbXBsZXRpb24gY2FsbGJhY2sgcm91dGluZSBkdXJpbmcKKyAqIHRyYW5zYWN0aW9uIGNvbW1pdC4gIElmIHRoZSBsb2cgaXMgaW4gZXJyb3Igc3RhdGUsIGEgbm9uLXplcm8KKyAqIHJldHVybiBjb2RlIGlzIGhhbmRlZCBiYWNrIGFuZCB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvcgorICogZXhlY3V0aW5nIHRoZSBjYWxsYmFjayBhdCBhbiBhcHByb3ByaWF0ZSB0aW1lLgorICovCitpbnQKK3hmc19sb2dfbm90aWZ5KHhmc19tb3VudF90CSAgKm1wLAkJLyogbW91bnQgb2YgcGFydGl0aW9uICovCisJICAgICAgIHZvaWQJCSAgKmljbG9nX2huZGwsCS8qIGljbG9nIHRvIGhhbmcgY2FsbGJhY2sgb2ZmICovCisJICAgICAgIHhmc19sb2dfY2FsbGJhY2tfdCAqY2IpCit7CisJeGxvZ190ICpsb2cgPSBtcC0+bV9sb2c7CisJeGxvZ19pbl9jb3JlX3QJICAqaWNsb2cgPSAoeGxvZ19pbl9jb3JlX3QgKilpY2xvZ19obmRsOworCWludAlhYm9ydGZsZywgc3BsOworCisjaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChYTE9HX05PTE9HKQorCWlmICgheGxvZ19kZWJ1ZyAmJiB4bG9nX3RhcmdldCA9PSBsb2ctPmxfdGFyZykKKwkJcmV0dXJuIDA7CisjZW5kaWYKKwljYi0+Y2JfbmV4dCA9IE5VTEw7CisJc3BsID0gTE9HX0xPQ0sobG9nKTsKKwlhYm9ydGZsZyA9IChpY2xvZy0+aWNfc3RhdGUgJiBYTE9HX1NUQVRFX0lPRVJST1IpOworCWlmICghYWJvcnRmbGcpIHsKKwkJQVNTRVJUX0FMV0FZUygoaWNsb2ctPmljX3N0YXRlID09IFhMT0dfU1RBVEVfQUNUSVZFKSB8fAorCQkJICAgICAgKGljbG9nLT5pY19zdGF0ZSA9PSBYTE9HX1NUQVRFX1dBTlRfU1lOQykpOworCQljYi0+Y2JfbmV4dCA9IE5VTEw7CisJCSooaWNsb2ctPmljX2NhbGxiYWNrX3RhaWwpID0gY2I7CisJCWljbG9nLT5pY19jYWxsYmFja190YWlsID0gJihjYi0+Y2JfbmV4dCk7CisJfQorCUxPR19VTkxPQ0sobG9nLCBzcGwpOworCXJldHVybiBhYm9ydGZsZzsKK30JLyogeGZzX2xvZ19ub3RpZnkgKi8KKworaW50Cit4ZnNfbG9nX3JlbGVhc2VfaWNsb2coeGZzX21vdW50X3QgKm1wLAorCQkgICAgICB2b2lkCSAgKmljbG9nX2huZGwpCit7CisJeGxvZ190ICpsb2cgPSBtcC0+bV9sb2c7CisJeGxvZ19pbl9jb3JlX3QJICAqaWNsb2cgPSAoeGxvZ19pbl9jb3JlX3QgKilpY2xvZ19obmRsOworCisJaWYgKHhsb2dfc3RhdGVfcmVsZWFzZV9pY2xvZyhsb2csIGljbG9nKSkgeworCQl4ZnNfZm9yY2Vfc2h1dGRvd24obXAsIFhGU19MT0dfSU9fRVJST1IpOworCQlyZXR1cm4oRUlPKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICAxLiBSZXNlcnZlIGFuIGFtb3VudCBvZiBvbi1kaXNrIGxvZyBzcGFjZSBhbmQgcmV0dXJuIGEgdGlja2V0IGNvcnJlc3BvbmRpbmcKKyAqCXRvIHRoZSByZXNlcnZhdGlvbi4KKyAqICAyLiBQb3RlbnRpYWxseSwgcHVzaCBidWZmZXJzIGF0IHRhaWwgb2YgbG9nIHRvIGRpc2suCisgKgorICogRWFjaCByZXNlcnZhdGlvbiBpcyBnb2luZyB0byByZXNlcnZlIGV4dHJhIHNwYWNlIGZvciBhIGxvZyByZWNvcmQgaGVhZGVyLgorICogV2hlbiB3cml0ZXMgaGFwcGVuIHRvIHRoZSBvbi1kaXNrIGxvZywgd2UgZG9uJ3Qgc3VidHJhY3QgdGhlIGxlbmd0aCBvZiB0aGUKKyAqIGxvZyByZWNvcmQgaGVhZGVyIGZyb20gYW55IHJlc2VydmF0aW9uLiAgQnkgd2FzdGluZyBzcGFjZSBpbiBlYWNoCisgKiByZXNlcnZhdGlvbiwgd2UgcHJldmVudCBvdmVyIGFsbG9jYXRpb24gcHJvYmxlbXMuCisgKi8KK2ludAoreGZzX2xvZ19yZXNlcnZlKHhmc19tb3VudF90CSAqbXAsCisJCWludAkJIHVuaXRfYnl0ZXMsCisJCWludAkJIGNudCwKKwkJeGZzX2xvZ190aWNrZXRfdCAqdGlja2V0LAorCQlfX3VpbnQ4X3QJIGNsaWVudCwKKwkJdWludAkJIGZsYWdzKQoreworCXhsb2dfdAkJKmxvZyA9IG1wLT5tX2xvZzsKKwl4bG9nX3RpY2tldF90CSppbnRlcm5hbF90aWNrZXQ7CisJaW50CQlyZXR2YWw7CisKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKFhMT0dfTk9MT0cpCisJaWYgKCF4bG9nX2RlYnVnICYmIHhsb2dfdGFyZ2V0ID09IGxvZy0+bF90YXJnKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorCXJldHZhbCA9IDA7CisJQVNTRVJUKGNsaWVudCA9PSBYRlNfVFJBTlNBQ1RJT04gfHwgY2xpZW50ID09IFhGU19MT0cpOworCUFTU0VSVCgoZmxhZ3MgJiBYRlNfTE9HX05PU0xFRVApID09IDApOworCisJaWYgKFhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykpCisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKworCVhGU19TVEFUU19JTkMoeHNfdHJ5X2xvZ3NwYWNlKTsKKworCWlmICgqdGlja2V0ICE9IE5VTEwpIHsKKwkJQVNTRVJUKGZsYWdzICYgWEZTX0xPR19QRVJNX1JFU0VSVik7CisJCWludGVybmFsX3RpY2tldCA9ICh4bG9nX3RpY2tldF90ICopKnRpY2tldDsKKwkJeGxvZ19ncmFudF9wdXNoX2FpbChtcCwgaW50ZXJuYWxfdGlja2V0LT50X3VuaXRfcmVzKTsKKwkJcmV0dmFsID0geGxvZ19yZWdyYW50X3dyaXRlX2xvZ19zcGFjZShsb2csIGludGVybmFsX3RpY2tldCk7CisJfSBlbHNlIHsKKwkJLyogbWF5IHNsZWVwIGlmIG5lZWQgdG8gYWxsb2NhdGUgbW9yZSB0aWNrZXRzICovCisJCWludGVybmFsX3RpY2tldCA9IHhsb2dfdGlja2V0X2dldChsb2csIHVuaXRfYnl0ZXMsIGNudCwKKwkJCQkJCSAgY2xpZW50LCBmbGFncyk7CisJCSp0aWNrZXQgPSBpbnRlcm5hbF90aWNrZXQ7CisJCXhsb2dfZ3JhbnRfcHVzaF9haWwobXAsCisJCQkJICAgIChpbnRlcm5hbF90aWNrZXQtPnRfdW5pdF9yZXMgKgorCQkJCSAgICAgaW50ZXJuYWxfdGlja2V0LT50X2NudCkpOworCQlyZXR2YWwgPSB4bG9nX2dyYW50X2xvZ19zcGFjZShsb2csIGludGVybmFsX3RpY2tldCk7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30JLyogeGZzX2xvZ19yZXNlcnZlICovCisKKworLyoKKyAqIE1vdW50IGEgbG9nIGZpbGVzeXN0ZW0KKyAqCisgKiBtcAkJLSB1YmlxdWl0b3VzIHhmcyBtb3VudCBwb2ludCBzdHJ1Y3R1cmUKKyAqIGxvZ190YXJnZXQJLSBidWZ0YXJnIG9mIG9uLWRpc2sgbG9nIGRldmljZQorICogYmxrX29mZnNldAktIFN0YXJ0IGJsb2NrICMgd2hlcmUgYmxvY2sgc2l6ZSBpcyA1MTIgYnl0ZXMgKEJCU0laRSkKKyAqIG51bV9iYmxvY2tzCS0gTnVtYmVyIG9mIEJCU0laRSBibG9ja3MgaW4gb24tZGlzayBsb2cKKyAqCisgKiBSZXR1cm4gZXJyb3Igb3IgemVyby4KKyAqLworaW50Cit4ZnNfbG9nX21vdW50KHhmc19tb3VudF90CSptcCwKKwkgICAgICB4ZnNfYnVmdGFyZ190CSpsb2dfdGFyZ2V0LAorCSAgICAgIHhmc19kYWRkcl90CWJsa19vZmZzZXQsCisJICAgICAgaW50CQludW1fYmJsa3MpCit7CisJaWYgKCEobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfTk9SRUNPVkVSWSkpCisJCWNtbl9lcnIoQ0VfTk9URSwgIlhGUyBtb3VudGluZyBmaWxlc3lzdGVtICVzIiwgbXAtPm1fZnNuYW1lKTsKKwllbHNlIHsKKwkJY21uX2VycihDRV9OT1RFLAorCQkJIiFNb3VudGluZyBmaWxlc3lzdGVtIFwiJXNcIiBpbiBuby1yZWNvdmVyeSBtb2RlLiAgRmlsZXN5c3RlbSB3aWxsIGJlIGluY29uc2lzdGVudC4iLAorCQkJbXAtPm1fZnNuYW1lKTsKKwkJQVNTRVJUKFhGU19NVE9WRlMobXApLT52ZnNfZmxhZyAmIFZGU19SRE9OTFkpOworCX0KKworCW1wLT5tX2xvZyA9IHhsb2dfYWxsb2NfbG9nKG1wLCBsb2dfdGFyZ2V0LCBibGtfb2Zmc2V0LCBudW1fYmJsa3MpOworCisjaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChYTE9HX05PTE9HKQorCWlmICgheGxvZ19kZWJ1ZykgeworCQljbW5fZXJyKENFX05PVEUsICJsb2cgZGV2OiAlcyIsIFhGU19CVUZUQVJHX05BTUUobG9nX3RhcmdldCkpOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKwkvKgorCSAqIHNraXAgbG9nIHJlY292ZXJ5IG9uIGEgbm9yZWNvdmVyeSBtb3VudC4gIHByZXRlbmQgaXQgYWxsCisJICoganVzdCB3b3JrZWQuCisJICovCisJaWYgKCEobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfTk9SRUNPVkVSWSkpIHsKKwkJaW50CWVycm9yOworCQl2ZnNfdAkqdmZzcCA9IFhGU19NVE9WRlMobXApOworCQlpbnQJcmVhZG9ubHkgPSAodmZzcC0+dmZzX2ZsYWcgJiBWRlNfUkRPTkxZKTsKKworCQlpZiAocmVhZG9ubHkpCisJCQl2ZnNwLT52ZnNfZmxhZyAmPSB+VkZTX1JET05MWTsKKworCQllcnJvciA9IHhsb2dfcmVjb3ZlcihtcC0+bV9sb2csIHJlYWRvbmx5KTsKKworCQlpZiAocmVhZG9ubHkpCisJCQl2ZnNwLT52ZnNfZmxhZyB8PSBWRlNfUkRPTkxZOworCQlpZiAoZXJyb3IpIHsKKwkJCWNtbl9lcnIoQ0VfV0FSTiwgIlhGUzogbG9nIG1vdW50L3JlY292ZXJ5IGZhaWxlZDogZXJyb3IgJWQiLCBlcnJvcik7CisJCQl4bG9nX3VuYWxsb2NfbG9nKG1wLT5tX2xvZyk7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwl9CisKKwkvKiBOb3JtYWwgdHJhbnNhY3Rpb25zIGNhbiBub3cgb2NjdXIgKi8KKwltcC0+bV9sb2ctPmxfZmxhZ3MgJj0gflhMT0dfQUNUSVZFX1JFQ09WRVJZOworCisJLyogRW5kIG1vdW50aW5nIG1lc3NhZ2UgaW4geGZzX2xvZ19tb3VudF9maW5pc2ggKi8KKwlyZXR1cm4gMDsKK30JLyogeGZzX2xvZ19tb3VudCAqLworCisvKgorICogRmluaXNoIHRoZSByZWNvdmVyeSBvZiB0aGUgZmlsZSBzeXN0ZW0uICBUaGlzIGlzIHNlcGFyYXRlIGZyb20KKyAqIHRoZSB4ZnNfbG9nX21vdW50KCkgY2FsbCwgYmVjYXVzZSBpdCBkZXBlbmRzIG9uIHRoZSBjb2RlIGluCisgKiB4ZnNfbW91bnRmcygpIHRvIHJlYWQgaW4gdGhlIHJvb3QgYW5kIHJlYWwtdGltZSBiaXRtYXAgaW5vZGVzCisgKiBiZXR3ZWVuIGNhbGxpbmcgeGZzX2xvZ19tb3VudCgpIGFuZCBoZXJlLgorICoKKyAqIG1wCQktIHViaXF1aXRvdXMgeGZzIG1vdW50IHBvaW50IHN0cnVjdHVyZQorICovCitpbnQKK3hmc19sb2dfbW91bnRfZmluaXNoKHhmc19tb3VudF90ICptcCwgaW50IG1mc2lfZmxhZ3MpCit7CisJaW50CWVycm9yOworCisJaWYgKCEobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfTk9SRUNPVkVSWSkpCisJCWVycm9yID0geGxvZ19yZWNvdmVyX2ZpbmlzaChtcC0+bV9sb2csIG1mc2lfZmxhZ3MpOworCWVsc2UgeworCQllcnJvciA9IDA7CisJCUFTU0VSVChYRlNfTVRPVkZTKG1wKS0+dmZzX2ZsYWcgJiBWRlNfUkRPTkxZKTsKKwl9CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBVbm1vdW50IHByb2Nlc3NpbmcgZm9yIHRoZSBsb2cuCisgKi8KK2ludAoreGZzX2xvZ191bm1vdW50KHhmc19tb3VudF90ICptcCkKK3sKKwlpbnQJCWVycm9yOworCisJZXJyb3IgPSB4ZnNfbG9nX3VubW91bnRfd3JpdGUobXApOworCXhmc19sb2dfdW5tb3VudF9kZWFsbG9jKG1wKTsKKwlyZXR1cm4gKGVycm9yKTsKK30KKworLyoKKyAqIEZpbmFsIGxvZyB3cml0ZXMgYXMgcGFydCBvZiB1bm1vdW50LgorICoKKyAqIE1hcmsgdGhlIGZpbGVzeXN0ZW0gY2xlYW4gYXMgdW5tb3VudCBoYXBwZW5zLiAgTm90ZSB0aGF0IGR1cmluZyByZWxvY2F0aW9uCisgKiB0aGlzIHJvdXRpbmUgbmVlZHMgdG8gYmUgZXhlY3V0ZWQgYXMgcGFydCBvZiBzb3VyY2UtYmFnIHdoaWxlIHRoZQorICogZGVhbGxvY2F0aW9uIG11c3Qgbm90IGJlIGRvbmUgdW50aWwgc291cmNlLWVuZC4KKyAqLworCisvKgorICogVW5tb3VudCByZWNvcmQgdXNlZCB0byBoYXZlIGEgc3RyaW5nICJVbm1vdW50IGZpbGVzeXN0ZW0tLSIgaW4gdGhlCisgKiBkYXRhIHNlY3Rpb24gd2hlcmUgdGhlICJVbiIgd2FzIHJlYWxseSBhIG1hZ2ljIG51bWJlciAoWExPR19VTk1PVU5UX1RZUEUpLgorICogV2UganVzdCB3cml0ZSB0aGUgbWFnaWMgbnVtYmVyIG5vdyBzaW5jZSB0aGF0IHBhcnRpY3VsYXIgZmllbGQgaXNuJ3QKKyAqIGN1cnJlbnRseSBhcmNoaXRlY3R1cmUgY29udmVydGVkIGFuZCAiblVtb3VudCIgaXMgYSBiaXQgZm9vLgorICogQXMgZmFyIGFzIEkga25vdywgdGhlcmUgd2VyZW4ndCBhbnkgZGVwZW5kZW5jaWVzIG9uIHRoZSBvbGQgYmVoYXZpb3VyLgorICovCisKK2ludAoreGZzX2xvZ191bm1vdW50X3dyaXRlKHhmc19tb3VudF90ICptcCkKK3sKKwl4bG9nX3QJCSAqbG9nID0gbXAtPm1fbG9nOworCXhsb2dfaW5fY29yZV90CSAqaWNsb2c7CisjaWZkZWYgREVCVUcKKwl4bG9nX2luX2NvcmVfdAkgKmZpcnN0X2ljbG9nOworI2VuZGlmCisJeGZzX2xvZ19pb3ZlY190ICByZWdbMV07CisJeGZzX2xvZ190aWNrZXRfdCB0aWMgPSBOVUxMOworCXhmc19sc25fdAkgbHNuOworCWludAkJIGVycm9yOworCVNQTERFQ0wocyk7CisKKwkvKiB0aGUgZGF0YSBzZWN0aW9uIG11c3QgYmUgMzIgYml0IHNpemUgYWxpZ25lZCAqLworCXN0cnVjdCB7CisJICAgIF9fdWludDE2X3QgbWFnaWM7CisJICAgIF9fdWludDE2X3QgcGFkMTsKKwkgICAgX191aW50MzJfdCBwYWQyOyAvKiBtYXkgYXMgd2VsbCBtYWtlIGl0IDY0IGJpdHMgKi8KKwl9IG1hZ2ljID0geyBYTE9HX1VOTU9VTlRfVFlQRSwgMCwgMCB9OworCisjaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChYTE9HX05PTE9HKQorCWlmICgheGxvZ19kZWJ1ZyAmJiB4bG9nX3RhcmdldCA9PSBsb2ctPmxfdGFyZykKKwkJcmV0dXJuIDA7CisjZW5kaWYKKworCS8qCisJICogRG9uJ3Qgd3JpdGUgb3V0IHVubW91bnQgcmVjb3JkIG9uIHJlYWQtb25seSBtb3VudHMuCisJICogT3IsIGlmIHdlIGFyZSBkb2luZyBhIGZvcmNlZCB1bW91bnQgKHR5cGljYWxseSBiZWNhdXNlIG9mIElPIGVycm9ycykuCisJICovCisJaWYgKFhGU19NVE9WRlMobXApLT52ZnNfZmxhZyAmIFZGU19SRE9OTFkpCisJCXJldHVybiAwOworCisJeGZzX2xvZ19mb3JjZShtcCwgMCwgWEZTX0xPR19GT1JDRXxYRlNfTE9HX1NZTkMpOworCisjaWZkZWYgREVCVUcKKwlmaXJzdF9pY2xvZyA9IGljbG9nID0gbG9nLT5sX2ljbG9nOworCWRvIHsKKwkJaWYgKCEoaWNsb2ctPmljX3N0YXRlICYgWExPR19TVEFURV9JT0VSUk9SKSkgeworCQkJQVNTRVJUKGljbG9nLT5pY19zdGF0ZSAmIFhMT0dfU1RBVEVfQUNUSVZFKTsKKwkJCUFTU0VSVChpY2xvZy0+aWNfb2Zmc2V0ID09IDApOworCQl9CisJCWljbG9nID0gaWNsb2ctPmljX25leHQ7CisJfSB3aGlsZSAoaWNsb2cgIT0gZmlyc3RfaWNsb2cpOworI2VuZGlmCisJaWYgKCEgKFhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykpKSB7CisJCXJlZ1swXS5pX2FkZHIgPSAodm9pZCopJm1hZ2ljOworCQlyZWdbMF0uaV9sZW4gID0gc2l6ZW9mKG1hZ2ljKTsKKworCQllcnJvciA9IHhmc19sb2dfcmVzZXJ2ZShtcCwgNjAwLCAxLCAmdGljLCBYRlNfTE9HLCAwKTsKKwkJaWYgKCFlcnJvcikgeworCQkJLyogcmVtb3ZlIGluaXRlZCBmbGFnICovCisJCQkoKHhsb2dfdGlja2V0X3QgKil0aWMpLT50X2ZsYWdzID0gMDsKKwkJCWVycm9yID0geGxvZ193cml0ZShtcCwgcmVnLCAxLCB0aWMsICZsc24sCisJCQkJCSAgIE5VTEwsIFhMT0dfVU5NT1VOVF9UUkFOUyk7CisJCQkvKgorCQkJICogQXQgdGhpcyBwb2ludCwgd2UncmUgdW1vdW50aW5nIGFueXdheSwKKwkJCSAqIHNvIHRoZXJlJ3Mgbm8gcG9pbnQgaW4gdHJhbnNpdGlvbmluZyBsb2cgc3RhdGUKKwkJCSAqIHRvIElPRVJST1IuIEp1c3QgY29udGludWUuLi4KKwkJCSAqLworCQl9CisKKwkJaWYgKGVycm9yKSB7CisJCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbXAsCisJCQkJInhmc19sb2dfdW5tb3VudDogdW5tb3VudCByZWNvcmQgZmFpbGVkIik7CisJCX0KKworCisJCXMgPSBMT0dfTE9DSyhsb2cpOworCQlpY2xvZyA9IGxvZy0+bF9pY2xvZzsKKwkJaWNsb2ctPmljX3JlZmNudCsrOworCQlMT0dfVU5MT0NLKGxvZywgcyk7CisJCXhsb2dfc3RhdGVfd2FudF9zeW5jKGxvZywgaWNsb2cpOworCQkodm9pZCkgeGxvZ19zdGF0ZV9yZWxlYXNlX2ljbG9nKGxvZywgaWNsb2cpOworCisJCXMgPSBMT0dfTE9DSyhsb2cpOworCQlpZiAoIShpY2xvZy0+aWNfc3RhdGUgPT0gWExPR19TVEFURV9BQ1RJVkUgfHwKKwkJICAgICAgaWNsb2ctPmljX3N0YXRlID09IFhMT0dfU1RBVEVfRElSVFkpKSB7CisJCQlpZiAoIVhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykpIHsKKwkJCQlzdl93YWl0KCZpY2xvZy0+aWNfZm9yY2VzZW1hLCBQTUVNLAorCQkJCQkmbG9nLT5sX2ljbG9nbG9jaywgcyk7CisJCQl9IGVsc2UgeworCQkJCUxPR19VTkxPQ0sobG9nLCBzKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCUxPR19VTkxPQ0sobG9nLCBzKTsKKwkJfQorCQlpZiAodGljKQorCQkJeGxvZ19zdGF0ZV9wdXRfdGlja2V0KGxvZywgdGljKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBXZSdyZSBhbHJlYWR5IGluIGZvcmNlZF9zaHV0ZG93biBtb2RlLCBjb3VsZG4ndAorCQkgKiBldmVuIGF0dGVtcHQgdG8gd3JpdGUgb3V0IHRoZSB1bm1vdW50IHRyYW5zYWN0aW9uLgorCQkgKgorCQkgKiBHbyB0aHJvdWdoIHRoZSBtb3Rpb25zIG9mIHN5bmMnaW5nIGFuZCByZWxlYXNpbmcKKwkJICogdGhlIGljbG9nLCBldmVuIHRob3VnaCBubyBJL08gd2lsbCBhY3R1YWxseSBoYXBwZW4sCisJCSAqIHdlIG5lZWQgdG8gd2FpdCBmb3Igb3RoZXIgbG9nIEkvTydzIHRoYXQgbWF5IGFscmVhZHkKKwkJICogYmUgaW4gcHJvZ3Jlc3MuICBEbyB0aGlzIGFzIGEgc2VwYXJhdGUgc2VjdGlvbiBvZgorCQkgKiBjb2RlIHNvIHdlJ2xsIGtub3cgaWYgd2UgZXZlciBnZXQgc3R1Y2sgaGVyZSB0aGF0CisJCSAqIHdlJ3JlIGluIHRoaXMgb2RkIHNpdHVhdGlvbiBvZiB0cnlpbmcgdG8gdW5tb3VudAorCQkgKiBhIGZpbGUgc3lzdGVtIHRoYXQgd2VudCBpbnRvIGZvcmNlZF9zaHV0ZG93biBhcworCQkgKiB0aGUgcmVzdWx0IG9mIGFuIHVubW91bnQuLgorCQkgKi8KKwkJcyA9IExPR19MT0NLKGxvZyk7CisJCWljbG9nID0gbG9nLT5sX2ljbG9nOworCQlpY2xvZy0+aWNfcmVmY250Kys7CisJCUxPR19VTkxPQ0sobG9nLCBzKTsKKworCQl4bG9nX3N0YXRlX3dhbnRfc3luYyhsb2csIGljbG9nKTsKKwkJKHZvaWQpIHhsb2dfc3RhdGVfcmVsZWFzZV9pY2xvZyhsb2csIGljbG9nKTsKKworCQlzID0gTE9HX0xPQ0sobG9nKTsKKworCQlpZiAoICEgKCAgIGljbG9nLT5pY19zdGF0ZSA9PSBYTE9HX1NUQVRFX0FDVElWRQorCQkJfHwgaWNsb2ctPmljX3N0YXRlID09IFhMT0dfU1RBVEVfRElSVFkKKwkJCXx8IGljbG9nLT5pY19zdGF0ZSA9PSBYTE9HX1NUQVRFX0lPRVJST1IpICkgeworCisJCQkJc3Zfd2FpdCgmaWNsb2ctPmljX2ZvcmNlc2VtYSwgUE1FTSwKKwkJCQkJJmxvZy0+bF9pY2xvZ2xvY2ssIHMpOworCQl9IGVsc2UgeworCQkJTE9HX1VOTE9DSyhsb2csIHMpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CS8qIHhmc19sb2dfdW5tb3VudF93cml0ZSAqLworCisvKgorICogRGVhbGxvY2F0ZSBsb2cgc3RydWN0dXJlcyBmb3IgdW5tb3VudC9yZWxvY2F0aW9uLgorICovCit2b2lkCit4ZnNfbG9nX3VubW91bnRfZGVhbGxvYyh4ZnNfbW91bnRfdCAqbXApCit7CisJeGxvZ191bmFsbG9jX2xvZyhtcC0+bV9sb2cpOworfQorCisvKgorICogV3JpdGUgcmVnaW9uIHZlY3RvcnMgdG8gbG9nLiAgVGhlIHdyaXRlIGhhcHBlbnMgdXNpbmcgdGhlIHNwYWNlIHJlc2VydmF0aW9uCisgKiBvZiB0aGUgdGlja2V0ICh0aWMpLiAgSXQgaXMgbm90IGEgcmVxdWlyZW1lbnQgdGhhdCBhbGwgd3JpdGVzIGZvciBhIGdpdmVuCisgKiB0cmFuc2FjdGlvbiBvY2N1ciB3aXRoIG9uZSBjYWxsIHRvIHhmc19sb2dfd3JpdGUoKS4KKyAqLworaW50Cit4ZnNfbG9nX3dyaXRlKHhmc19tb3VudF90ICoJbXAsCisJICAgICAgeGZzX2xvZ19pb3ZlY190CXJlZ1tdLAorCSAgICAgIGludAkJbmVudHJpZXMsCisJICAgICAgeGZzX2xvZ190aWNrZXRfdAl0aWMsCisJICAgICAgeGZzX2xzbl90CQkqc3RhcnRfbHNuKQoreworCWludAllcnJvcjsKKwl4bG9nX3QgKmxvZyA9IG1wLT5tX2xvZzsKKworI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoWExPR19OT0xPRykKKwlpZiAoIXhsb2dfZGVidWcgJiYgeGxvZ190YXJnZXQgPT0gbG9nLT5sX3RhcmcpIHsKKwkJKnN0YXJ0X2xzbiA9IDA7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCWlmIChYTE9HX0ZPUkNFRF9TSFVURE9XTihsb2cpKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisKKwlpZiAoKGVycm9yID0geGxvZ193cml0ZShtcCwgcmVnLCBuZW50cmllcywgdGljLCBzdGFydF9sc24sIE5VTEwsIDApKSkgeworCQl4ZnNfZm9yY2Vfc2h1dGRvd24obXAsIFhGU19MT0dfSU9fRVJST1IpOworCX0KKwlyZXR1cm4gKGVycm9yKTsKK30JLyogeGZzX2xvZ193cml0ZSAqLworCisKK3ZvaWQKK3hmc19sb2dfbW92ZV90YWlsKHhmc19tb3VudF90CSptcCwKKwkJICB4ZnNfbHNuX3QJdGFpbF9sc24pCit7CisJeGxvZ190aWNrZXRfdAkqdGljOworCXhsb2dfdAkJKmxvZyA9IG1wLT5tX2xvZzsKKwlpbnQJCW5lZWRfYnl0ZXMsIGZyZWVfYnl0ZXMsIGN5Y2xlLCBieXRlczsKKwlTUExERUNMKHMpOworCisjaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChYTE9HX05PTE9HKQorCWlmICgheGxvZ19kZWJ1ZyAmJiB4bG9nX3RhcmdldCA9PSBsb2ctPmxfdGFyZykKKwkJcmV0dXJuOworI2VuZGlmCisJLyogWFhYc3VwIHRtcCAqLworCWlmIChYTE9HX0ZPUkNFRF9TSFVURE9XTihsb2cpKQorCQlyZXR1cm47CisJQVNTRVJUKCFYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSk7CisKKwlpZiAodGFpbF9sc24gPT0gMCkgeworCQkvKiBuZWVkZWQgc2luY2Ugc3luY19sc24gaXMgNjQgYml0cyAqLworCQlzID0gTE9HX0xPQ0sobG9nKTsKKwkJdGFpbF9sc24gPSBsb2ctPmxfbGFzdF9zeW5jX2xzbjsKKwkJTE9HX1VOTE9DSyhsb2csIHMpOworCX0KKworCXMgPSBHUkFOVF9MT0NLKGxvZyk7CisKKwkvKiBBbHNvIGFuIGludmFsaWQgbHNuLiAgMSBpbXBsaWVzIHRoYXQgd2UgYXJlbid0IHBhc3NpbmcgaW4gYSB2YWxpZAorCSAqIHRhaWxfbHNuLgorCSAqLworCWlmICh0YWlsX2xzbiAhPSAxKSB7CisJCWxvZy0+bF90YWlsX2xzbiA9IHRhaWxfbHNuOworCX0KKworCWlmICgodGljID0gbG9nLT5sX3dyaXRlX2hlYWRxKSkgeworI2lmZGVmIERFQlVHCisJCWlmIChsb2ctPmxfZmxhZ3MgJiBYTE9HX0FDVElWRV9SRUNPVkVSWSkKKwkJCXBhbmljKCJSZWNvdmVyeSBwcm9ibGVtIik7CisjZW5kaWYKKwkJY3ljbGUgPSBsb2ctPmxfZ3JhbnRfd3JpdGVfY3ljbGU7CisJCWJ5dGVzID0gbG9nLT5sX2dyYW50X3dyaXRlX2J5dGVzOworCQlmcmVlX2J5dGVzID0geGxvZ19zcGFjZV9sZWZ0KGxvZywgY3ljbGUsIGJ5dGVzKTsKKwkJZG8geworCQkJQVNTRVJUKHRpYy0+dF9mbGFncyAmIFhMT0dfVElDX1BFUk1fUkVTRVJWKTsKKworCQkJaWYgKGZyZWVfYnl0ZXMgPCB0aWMtPnRfdW5pdF9yZXMgJiYgdGFpbF9sc24gIT0gMSkKKwkJCQlicmVhazsKKwkJCXRhaWxfbHNuID0gMDsKKwkJCWZyZWVfYnl0ZXMgLT0gdGljLT50X3VuaXRfcmVzOworCQkJc3Zfc2lnbmFsKCZ0aWMtPnRfc2VtYSk7CisJCQl0aWMgPSB0aWMtPnRfbmV4dDsKKwkJfSB3aGlsZSAodGljICE9IGxvZy0+bF93cml0ZV9oZWFkcSk7CisJfQorCWlmICgodGljID0gbG9nLT5sX3Jlc2VydmVfaGVhZHEpKSB7CisjaWZkZWYgREVCVUcKKwkJaWYgKGxvZy0+bF9mbGFncyAmIFhMT0dfQUNUSVZFX1JFQ09WRVJZKQorCQkJcGFuaWMoIlJlY292ZXJ5IHByb2JsZW0iKTsKKyNlbmRpZgorCQljeWNsZSA9IGxvZy0+bF9ncmFudF9yZXNlcnZlX2N5Y2xlOworCQlieXRlcyA9IGxvZy0+bF9ncmFudF9yZXNlcnZlX2J5dGVzOworCQlmcmVlX2J5dGVzID0geGxvZ19zcGFjZV9sZWZ0KGxvZywgY3ljbGUsIGJ5dGVzKTsKKwkJZG8geworCQkJaWYgKHRpYy0+dF9mbGFncyAmIFhMT0dfVElDX1BFUk1fUkVTRVJWKQorCQkJCW5lZWRfYnl0ZXMgPSB0aWMtPnRfdW5pdF9yZXMqdGljLT50X2NudDsKKwkJCWVsc2UKKwkJCQluZWVkX2J5dGVzID0gdGljLT50X3VuaXRfcmVzOworCQkJaWYgKGZyZWVfYnl0ZXMgPCBuZWVkX2J5dGVzICYmIHRhaWxfbHNuICE9IDEpCisJCQkJYnJlYWs7CisJCQl0YWlsX2xzbiA9IDA7CisJCQlmcmVlX2J5dGVzIC09IG5lZWRfYnl0ZXM7CisJCQlzdl9zaWduYWwoJnRpYy0+dF9zZW1hKTsKKwkJCXRpYyA9IHRpYy0+dF9uZXh0OworCQl9IHdoaWxlICh0aWMgIT0gbG9nLT5sX3Jlc2VydmVfaGVhZHEpOworCX0KKwlHUkFOVF9VTkxPQ0sobG9nLCBzKTsKK30JLyogeGZzX2xvZ19tb3ZlX3RhaWwgKi8KKworLyoKKyAqIERldGVybWluZSBpZiB3ZSBoYXZlIGEgdHJhbnNhY3Rpb24gdGhhdCBoYXMgZ29uZSB0byBkaXNrCisgKiB0aGF0IG5lZWRzIHRvIGJlIGNvdmVyZWQuIExvZyBhY3Rpdml0eSBuZWVkcyB0byBiZSBpZGxlIChubyBBSUwgYW5kCisgKiBub3RoaW5nIGluIHRoZSBpY2xvZ3MpLiBBbmQsIHdlIG5lZWQgdG8gYmUgaW4gdGhlIHJpZ2h0IHN0YXRlIGluZGljYXRpbmcKKyAqIHNvbWV0aGluZyBoYXMgZ29uZSBvdXQuCisgKi8KK2ludAoreGZzX2xvZ19uZWVkX2NvdmVyZWQoeGZzX21vdW50X3QgKm1wKQoreworCVNQTERFQ0wocyk7CisJaW50CQluZWVkZWQgPSAwLCBnZW47CisJeGxvZ190CQkqbG9nID0gbXAtPm1fbG9nOworCXZmc190CQkqdmZzcCA9IFhGU19NVE9WRlMobXApOworCisJaWYgKGZzX2Zyb3plbih2ZnNwKSB8fCBYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSB8fAorCSAgICAodmZzcC0+dmZzX2ZsYWcgJiBWRlNfUkRPTkxZKSkKKwkJcmV0dXJuIDA7CisKKwlzID0gTE9HX0xPQ0sobG9nKTsKKwlpZiAoKChsb2ctPmxfY292ZXJlZF9zdGF0ZSA9PSBYTE9HX1NUQVRFX0NPVkVSX05FRUQpIHx8CisJCShsb2ctPmxfY292ZXJlZF9zdGF0ZSA9PSBYTE9HX1NUQVRFX0NPVkVSX05FRUQyKSkKKwkJCSYmICF4ZnNfdHJhbnNfZmlyc3RfYWlsKG1wLCAmZ2VuKQorCQkJJiYgeGxvZ19pY2xvZ3NfZW1wdHkobG9nKSkgeworCQlpZiAobG9nLT5sX2NvdmVyZWRfc3RhdGUgPT0gWExPR19TVEFURV9DT1ZFUl9ORUVEKQorCQkJbG9nLT5sX2NvdmVyZWRfc3RhdGUgPSBYTE9HX1NUQVRFX0NPVkVSX0RPTkU7CisJCWVsc2UgeworCQkJQVNTRVJUKGxvZy0+bF9jb3ZlcmVkX3N0YXRlID09IFhMT0dfU1RBVEVfQ09WRVJfTkVFRDIpOworCQkJbG9nLT5sX2NvdmVyZWRfc3RhdGUgPSBYTE9HX1NUQVRFX0NPVkVSX0RPTkUyOworCQl9CisJCW5lZWRlZCA9IDE7CisJfQorCUxPR19VTkxPQ0sobG9nLCBzKTsKKwlyZXR1cm4obmVlZGVkKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCWxvY2FsIHJvdXRpbmVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qIHhmc190cmFuc190YWlsX2FpbCByZXR1cm5zIDAgd2hlbiB0aGVyZSBpcyBub3RoaW5nIGluIHRoZSBsaXN0LgorICogVGhlIGxvZyBtYW5hZ2VyIG11c3Qga2VlcCB0cmFjayBvZiB0aGUgbGFzdCBMUiB3aGljaCB3YXMgY29tbWl0dGVkCisgKiB0byBkaXNrLiAgVGhlIGxzbiBvZiB0aGlzIExSIHdpbGwgYmVjb21lIHRoZSBuZXcgdGFpbF9sc24gd2hlbmV2ZXIKKyAqIHhmc190cmFuc190YWlsX2FpbCByZXR1cm5zIDAuICBJZiB3ZSBkb24ndCBkbyB0aGlzLCB3ZSBydW4gaW50bworICogdGhlIHNpdHVhdGlvbiB3aGVyZSBzdHVmZiBjb3VsZCBiZSB3cml0dGVuIGludG8gdGhlIGxvZyBidXQgbm90aGluZworICogd2FzIGV2ZXIgaW4gdGhlIEFJTCB3aGVuIGFza2VkLiAgRXZlbnR1YWxseSwgd2UgcGFuaWMgc2luY2UgdGhlCisgKiB0YWlsIGhpdHMgdGhlIGhlYWQuCisgKgorICogV2UgbWF5IGJlIGhvbGRpbmcgdGhlIGxvZyBpY2xvZyBsb2NrIHVwb24gZW50ZXJpbmcgdGhpcyByb3V0aW5lLgorICovCit4ZnNfbHNuX3QKK3hsb2dfYXNzaWduX3RhaWxfbHNuKHhmc19tb3VudF90ICptcCkKK3sKKwl4ZnNfbHNuX3QgdGFpbF9sc247CisJU1BMREVDTChzKTsKKwl4bG9nX3QJICAqbG9nID0gbXAtPm1fbG9nOworCisJdGFpbF9sc24gPSB4ZnNfdHJhbnNfdGFpbF9haWwobXApOworCXMgPSBHUkFOVF9MT0NLKGxvZyk7CisJaWYgKHRhaWxfbHNuICE9IDApIHsKKwkJbG9nLT5sX3RhaWxfbHNuID0gdGFpbF9sc247CisJfSBlbHNlIHsKKwkJdGFpbF9sc24gPSBsb2ctPmxfdGFpbF9sc24gPSBsb2ctPmxfbGFzdF9zeW5jX2xzbjsKKwl9CisJR1JBTlRfVU5MT0NLKGxvZywgcyk7CisKKwlyZXR1cm4gdGFpbF9sc247Cit9CS8qIHhsb2dfYXNzaWduX3RhaWxfbHNuICovCisKKworLyoKKyAqIFJldHVybiB0aGUgc3BhY2UgaW4gdGhlIGxvZyBiZXR3ZWVuIHRoZSB0YWlsIGFuZCB0aGUgaGVhZC4gIFRoZSBoZWFkCisgKiBpcyBwYXNzZWQgaW4gdGhlIGN5Y2xlL2J5dGVzIGZvcm1hbCBwYXJtcy4gIEluIHRoZSBzcGVjaWFsIGNhc2Ugd2hlcmUKKyAqIHRoZSByZXNlcnZlIGhlYWQgaGFzIHdyYXBwZWQgcGFzc2VkIHRoZSB0YWlsLCB0aGlzIGNhbGN1bGF0aW9uIGlzIG5vCisgKiBsb25nZXIgdmFsaWQuICBJbiB0aGlzIGNhc2UsIGp1c3QgcmV0dXJuIDAgd2hpY2ggbWVhbnMgdGhlcmUgaXMgbm8gc3BhY2UKKyAqIGluIHRoZSBsb2cuICBUaGlzIHdvcmtzIGZvciBhbGwgcGxhY2VzIHdoZXJlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkCisgKiB3aXRoIHRoZSByZXNlcnZlIGhlYWQuICBPZiBjb3Vyc2UsIGlmIHRoZSB3cml0ZSBoZWFkIHdlcmUgdG8gZXZlcgorICogd3JhcCB0aGUgdGFpbCwgd2Ugc2hvdWxkIGJsb3cgdXAuICBSYXRoZXIgdGhhbiBjYXRjaCB0aGlzIGNhc2UgaGVyZSwKKyAqIHdlIGRlcGVuZCBvbiBvdGhlciBBU1NFUlRpb25zIGluIG90aGVyIHBhcnRzIG9mIHRoZSBjb2RlLiAgIFhYWG1pa2VuCisgKgorICogVGhpcyBjb2RlIGFsc28gaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSB0aGUgcmVzZXJ2YXRpb24gaGVhZCBpcyBiZWhpbmQKKyAqIHRoZSB0YWlsLiAgVGhlIGRldGFpbHMgb2YgdGhpcyBjYXNlIGFyZSBkZXNjcmliZWQgYmVsb3csIGJ1dCB0aGUgZW5kCisgKiByZXN1bHQgaXMgdGhhdCB3ZSByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGxvZyBhcyB0aGUgYW1vdW50IG9mIHNwYWNlIGxlZnQuCisgKi8KK2ludAoreGxvZ19zcGFjZV9sZWZ0KHhsb2dfdCAqbG9nLCBpbnQgY3ljbGUsIGludCBieXRlcykKK3sKKwlpbnQgZnJlZV9ieXRlczsKKwlpbnQgdGFpbF9ieXRlczsKKwlpbnQgdGFpbF9jeWNsZTsKKworCXRhaWxfYnl0ZXMgPSBCQlRPQihCTE9DS19MU04obG9nLT5sX3RhaWxfbHNuKSk7CisJdGFpbF9jeWNsZSA9IENZQ0xFX0xTTihsb2ctPmxfdGFpbF9sc24pOworCWlmICgodGFpbF9jeWNsZSA9PSBjeWNsZSkgJiYgKGJ5dGVzID49IHRhaWxfYnl0ZXMpKSB7CisJCWZyZWVfYnl0ZXMgPSBsb2ctPmxfbG9nc2l6ZSAtIChieXRlcyAtIHRhaWxfYnl0ZXMpOworCX0gZWxzZSBpZiAoKHRhaWxfY3ljbGUgKyAxKSA8IGN5Y2xlKSB7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAodGFpbF9jeWNsZSA8IGN5Y2xlKSB7CisJCUFTU0VSVCh0YWlsX2N5Y2xlID09IChjeWNsZSAtIDEpKTsKKwkJZnJlZV9ieXRlcyA9IHRhaWxfYnl0ZXMgLSBieXRlczsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBUaGUgcmVzZXJ2YXRpb24gaGVhZCBpcyBiZWhpbmQgdGhlIHRhaWwuCisJCSAqIEluIHRoaXMgY2FzZSB3ZSBqdXN0IHdhbnQgdG8gcmV0dXJuIHRoZSBzaXplIG9mIHRoZQorCQkgKiBsb2cgYXMgdGhlIGFtb3VudCBvZiBzcGFjZSBsZWZ0LgorCQkgKi8KKwkJeGZzX2ZzX2Ntbl9lcnIoQ0VfQUxFUlQsIGxvZy0+bF9tcCwKKwkJCSJ4bG9nX3NwYWNlX2xlZnQ6IGhlYWQgYmVoaW5kIHRhaWxcbiIKKwkJCSIgIHRhaWxfY3ljbGUgPSAlZCwgdGFpbF9ieXRlcyA9ICVkXG4iCisJCQkiICBHSCAgIGN5Y2xlID0gJWQsIEdIICAgYnl0ZXMgPSAlZCIsCisJCQl0YWlsX2N5Y2xlLCB0YWlsX2J5dGVzLCBjeWNsZSwgYnl0ZXMpOworCQlBU1NFUlQoMCk7CisJCWZyZWVfYnl0ZXMgPSBsb2ctPmxfbG9nc2l6ZTsKKwl9CisJcmV0dXJuIGZyZWVfYnl0ZXM7Cit9CS8qIHhsb2dfc3BhY2VfbGVmdCAqLworCisKKy8qCisgKiBMb2cgZnVuY3Rpb24gd2hpY2ggaXMgY2FsbGVkIHdoZW4gYW4gaW8gY29tcGxldGVzLgorICoKKyAqIFRoZSBsb2cgbWFuYWdlciBuZWVkcyBpdHMgb3duIHJvdXRpbmUsIGluIG9yZGVyIHRvIGNvbnRyb2wgd2hhdAorICogaGFwcGVucyB3aXRoIHRoZSBidWZmZXIgYWZ0ZXIgdGhlIHdyaXRlIGNvbXBsZXRlcy4KKyAqLwordm9pZAoreGxvZ19pb2RvbmUoeGZzX2J1Zl90ICpicCkKK3sKKwl4bG9nX2luX2NvcmVfdAkqaWNsb2c7CisJeGxvZ190CQkqbDsKKwlpbnQJCWFib3J0ZWQ7CisKKwlpY2xvZyA9IFhGU19CVUZfRlNQUklWQVRFKGJwLCB4bG9nX2luX2NvcmVfdCAqKTsKKwlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUyKGJwLCB1bnNpZ25lZCBsb25nKSA9PSAodW5zaWduZWQgbG9uZykgMik7CisJWEZTX0JVRl9TRVRfRlNQUklWQVRFMihicCwgKHVuc2lnbmVkIGxvbmcpMSk7CisJYWJvcnRlZCA9IDA7CisKKwkvKgorCSAqIFNvbWUgdmVyc2lvbnMgb2YgY3BwIGJhcmYgb24gdGhlIHJlY3Vyc2l2ZSBkZWZpbml0aW9uIG9mCisJICogaWNfbG9nIC0+IGhpY19maWVsZHMuaWNfbG9nIGFuZCBleHBhbmQgaWNfbG9nIHR3aWNlIHdoZW4KKwkgKiBpdCBpcyBwYXNzZWQgdGhyb3VnaCB0d28gbWFjcm9zLiAgV29ya2Fyb3VuZCBicm9rZW4gY3BwLgorCSAqLworCWwgPSBpY2xvZy0+aWNfbG9nOworCisJLyoKKwkgKiBSYWNlIHRvIHNodXRkb3duIHRoZSBmaWxlc3lzdGVtIGlmIHdlIHNlZSBhbiBlcnJvci4KKwkgKi8KKwlpZiAoWEZTX1RFU1RfRVJST1IoKFhGU19CVUZfR0VURVJST1IoYnApKSwgbC0+bF9tcCwKKwkJCVhGU19FUlJUQUdfSU9ET05FX0lPRVJSLCBYRlNfUkFORE9NX0lPRE9ORV9JT0VSUikpIHsKKwkJeGZzX2lvZXJyb3JfYWxlcnQoInhsb2dfaW9kb25lIiwgbC0+bF9tcCwgYnAsIFhGU19CVUZfQUREUihicCkpOworCQlYRlNfQlVGX1NUQUxFKGJwKTsKKwkJeGZzX2ZvcmNlX3NodXRkb3duKGwtPmxfbXAsIFhGU19MT0dfSU9fRVJST1IpOworCQkvKgorCQkgKiBUaGlzIGZsYWcgd2lsbCBiZSBwcm9wYWdhdGVkIHRvIHRoZSB0cmFucy1jb21taXR0ZWQKKwkJICogY2FsbGJhY2sgcm91dGluZXMgdG8gbGV0IHRoZW0ga25vdyB0aGF0IHRoZSBsb2ctY29tbWl0CisJCSAqIGRpZG4ndCBzdWNjZWVkLgorCQkgKi8KKwkJYWJvcnRlZCA9IFhGU19MSV9BQk9SVEVEOworCX0gZWxzZSBpZiAoaWNsb2ctPmljX3N0YXRlICYgWExPR19TVEFURV9JT0VSUk9SKSB7CisJCWFib3J0ZWQgPSBYRlNfTElfQUJPUlRFRDsKKwl9CisJeGxvZ19zdGF0ZV9kb25lX3N5bmNpbmcoaWNsb2csIGFib3J0ZWQpOworCWlmICghKFhGU19CVUZfSVNBU1lOQyhicCkpKSB7CisJCS8qCisJCSAqIENvcnJlc3BvbmRpbmcgcHNlbWEoKSB3aWxsIGJlIGRvbmUgaW4gYndyaXRlKCkuICBJZiB3ZSBkb24ndAorCQkgKiB2c2VtYSgpIGhlcmUsIHBhbmljLgorCQkgKi8KKwkJWEZTX0JVRl9WX0lPRE9ORVNFTUEoYnApOworCX0KK30JLyogeGxvZ19pb2RvbmUgKi8KKworLyoKKyAqIFRoZSBiZHN0cmF0IGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBsb2cgYnVmcy4gVGhpcyBnaXZlcyB1cyBhIGNlbnRyYWwKKyAqIHBsYWNlIHRvIHRyYXAgYnVmcyBpbiBjYXNlIHdlIGdldCBoaXQgYnkgYSBsb2cgSS9PIGVycm9yIGFuZCBuZWVkIHRvCisgKiBzaHV0ZG93bi4gQWN0dWFsbHksIGluIHByYWN0aWNlLCBldmVuIHdoZW4gd2UgZGlkbid0IGdldCBhIGxvZyBlcnJvciwKKyAqIHdlIHRyYW5zaXRpb24gdGhlIGljbG9ncyB0byBJT0VSUk9SIHN0YXRlICphZnRlciogZmx1c2hpbmcgYWxsIGV4aXN0aW5nCisgKiBpY2xvZ3MgdG8gZGlzay4gVGhpcyBpcyBiZWNhdXNlIHdlIGRvbid0IHdhbnQgYW55bW9yZSBuZXcgdHJhbnNhY3Rpb25zIHRvIGJlCisgKiBzdGFydGVkIG9yIGNvbXBsZXRlZCBhZnRlcndhcmRzLgorICovCitTVEFUSUMgaW50Cit4bG9nX2Jkc3RyYXRfY2Ioc3RydWN0IHhmc19idWYgKmJwKQoreworCXhsb2dfaW5fY29yZV90ICppY2xvZzsKKworCWljbG9nID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhsb2dfaW5fY29yZV90ICopOworCisJaWYgKChpY2xvZy0+aWNfc3RhdGUgJiBYTE9HX1NUQVRFX0lPRVJST1IpID09IDApIHsKKwkgIC8qIG5vdGUgZm9yIGlyaXggYnN0cmF0IHdpbGwgbmVlZCAgc3RydWN0IGJkZXZzdyBwYXNzZWQKKwkgICAqIEZpeCB0aGUgZm9sbG93aW5nIG1hY3JvIGlmIHRoZSBjb2RlIGV2ZXIgaXMgbWVyZ2VkCisJICAgKi8KKwkgICAgWEZTX2Jkc3RyYXQoYnApOworCQlyZXR1cm4gMDsKKwl9CisKKwl4ZnNfYnVmdHJhY2UoIlhMT0dfX0JEU1RSQVQgSU9FUlJPUiIsIGJwKTsKKwlYRlNfQlVGX0VSUk9SKGJwLCBFSU8pOworCVhGU19CVUZfU1RBTEUoYnApOworCXhmc19iaW9kb25lKGJwKTsKKwlyZXR1cm4gKFhGU19FUlJPUihFSU8pKTsKKworCit9CisKKy8qCisgKiBSZXR1cm4gc2l6ZSBvZiBlYWNoIGluLWNvcmUgbG9nIHJlY29yZCBidWZmZXIuCisgKgorICogTG93IG1lbW9yeSBtYWNoaW5lcyBvbmx5IGdldCAyIDE2S0IgYnVmZmVycy4gIFdlIGRvbid0IHdhbnQgdG8gd2FzdGUKKyAqIG1lbW9yeSBoZXJlLiAgSG93ZXZlciwgYWxsIG90aGVyIG1hY2hpbmVzIGdldCBhdCBsZWFzdCAyIDMyS0IgYnVmZmVycy4KKyAqIFRoZSBudW1iZXIgaXMgaGFyZCBjb2RlZCBiZWNhdXNlIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIG1pbmltdW0KKyAqIG1lbW9yeSBzaXplLCBqdXN0IDMyTUIgc3lzdGVtcy4KKyAqCisgKiBJZiB0aGUgZmlsZXN5c3RlbSBibG9ja3NpemUgaXMgdG9vIGxhcmdlLCB3ZSBtYXkgbmVlZCB0byBjaG9vc2UgYQorICogbGFyZ2VyIHNpemUgc2luY2UgdGhlIGRpcmVjdG9yeSBjb2RlIGN1cnJlbnRseSBsb2dzIGVudGlyZSBibG9ja3MuCisgKi8KKworU1RBVElDIHZvaWQKK3hsb2dfZ2V0X2ljbG9nX2J1ZmZlcl9zaXplKHhmc19tb3VudF90CSptcCwKKwkJCSAgIHhsb2dfdAkqbG9nKQoreworCWludCBzaXplOworCWludCB4aGRyczsKKworI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoWExPR19OT0xPRykKKwkvKgorCSAqIFdoZW4gbG9nYnVmcyA9PSAwLCBzb21lb25lIGhhcyBkaXNhYmxlZCB0aGUgbG9nIGZyb20gdGhlIEZTVEFCCisJICogZmlsZS4gIFRoaXMgaXMgbm90IGEgZG9jdW1lbnRlZCBmZWF0dXJlLiAgV2UgbmVlZCB0byBzZXQgeGxvZ19kZWJ1ZworCSAqIHRvIHplcm8gKHRoaXMgZGVhY3RpdmF0ZXMgdGhlIGxvZykgYW5kIHNldCB4bG9nX3RhcmdldCB0byB0aGUKKwkgKiBhcHByb3ByaWF0ZSBkZXZpY2UuICBPbmx5IG9uZSBmaWxlc3lzdGVtIG1heSBiZSBhZmZlY3RlZCBhcyBzdWNoCisJICogc2luY2UgdGhpcyBpcyBqdXN0IGEgcGVyZm9ybWFuY2UgaGFjayB0byB0ZXN0IHdoYXQgd2UgbWlnaHQgYmUgYWJsZQorCSAqIHRvIGdldCBpZiB0aGUgbG9nIHdlcmUgbm90IHByZXNlbnQuCisJICovCisJaWYgKG1wLT5tX2xvZ2J1ZnMgPT0gMCkgeworCQl4bG9nX2RlYnVnID0gMDsKKwkJeGxvZ190YXJnZXQgPSBsb2ctPmxfdGFyZzsKKwkJbG9nLT5sX2ljbG9nX2J1ZnMgPSBYTE9HX01JTl9JQ0xPR1M7CisJfSBlbHNlCisjZW5kaWYKKwl7CisJCS8qCisJCSAqIFRoaXMgaXMgdGhlIG5vcm1hbCBwYXRoLiAgSWYgbV9sb2didWZzID09IC0xLCB0aGVuIHRoZQorCQkgKiBhZG1pbiBoYXMgY2hvc2VuIHRvIHVzZSB0aGUgc3lzdGVtIGRlZmF1bHRzIGZvciBsb2didWZmZXJzLgorCQkgKi8KKwkJaWYgKG1wLT5tX2xvZ2J1ZnMgPT0gLTEpIHsgCisJCQlpZiAoeGZzX3BoeXNtZW0gPD0gYnRvYygxMjgqMTAyNCoxMDI0KSkgeyAKKwkJCQlsb2ctPmxfaWNsb2dfYnVmcyA9IFhMT0dfTUlOX0lDTE9HUzsgCisJCQl9IGVsc2UgaWYgKHhmc19waHlzbWVtIDw9IGJ0b2MoNDAwKjEwMjQqMTAyNCkpIHsgCisJCQkJbG9nLT5sX2ljbG9nX2J1ZnMgPSBYTE9HX01FRF9JQ0xPR1M7IAorCQkJfSBlbHNlIHsKKwkJCQkvKiAyNTZLIHdpdGggMzJLIGJ1ZnMgKi8KKwkJCQlsb2ctPmxfaWNsb2dfYnVmcyA9IFhMT0dfTUFYX0lDTE9HUzsKKwkJCX0KKwkJfSBlbHNlCisJCQlsb2ctPmxfaWNsb2dfYnVmcyA9IG1wLT5tX2xvZ2J1ZnM7CisKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKFhMT0dfTk9MT0cpCisJCS8qIFdlIGFyZSByZWFjdGl2YXRpbmcgYSBmaWxlc3lzdGVtIGFmdGVyIGl0IHdhcyBpbmFjdGl2ZSAqLworCQlpZiAobG9nLT5sX3RhcmcgPT0geGxvZ190YXJnZXQpIHsKKwkJCXhsb2dfdGFyZ2V0ID0gTlVMTDsKKwkJCXhsb2dfZGVidWcgPSAxOworCQl9CisjZW5kaWYKKwl9CisKKwkvKgorCSAqIEJ1ZmZlciBzaXplIHBhc3NlZCBpbiBmcm9tIG1vdW50IHN5c3RlbSBjYWxsLgorCSAqLworCWlmIChtcC0+bV9sb2dic2l6ZSAhPSAtMSkgeworCQlzaXplID0gbG9nLT5sX2ljbG9nX3NpemUgPSBtcC0+bV9sb2dic2l6ZTsKKwkJbG9nLT5sX2ljbG9nX3NpemVfbG9nID0gMDsKKwkJd2hpbGUgKHNpemUgIT0gMSkgeworCQkJbG9nLT5sX2ljbG9nX3NpemVfbG9nKys7CisJCQlzaXplID4+PSAxOworCQl9CisKKwkJaWYgKFhGU19TQl9WRVJTSU9OX0hBU0xPR1YyKCZtcC0+bV9zYikpIHsKKwkJCS8qICMgaGVhZGVycyA9IHNpemUgLyAzMksKKwkJCSAqIG9uZSBoZWFkZXIgaG9sZHMgY3ljbGVzIGZyb20gMzJLIG9mIGRhdGEKKwkJCSAqLworCisJCQl4aGRycyA9IG1wLT5tX2xvZ2JzaXplIC8gWExPR19IRUFERVJfQ1lDTEVfU0laRTsKKwkJCWlmIChtcC0+bV9sb2dic2l6ZSAlIFhMT0dfSEVBREVSX0NZQ0xFX1NJWkUpCisJCQkJeGhkcnMrKzsKKwkJCWxvZy0+bF9pY2xvZ19oc2l6ZSA9IHhoZHJzIDw8IEJCU0hJRlQ7CisJCQlsb2ctPmxfaWNsb2dfaGVhZHMgPSB4aGRyczsKKwkJfSBlbHNlIHsKKwkJCUFTU0VSVChtcC0+bV9sb2dic2l6ZSA8PSBYTE9HX0JJR19SRUNPUkRfQlNJWkUpOworCQkJbG9nLT5sX2ljbG9nX2hzaXplID0gQkJTSVpFOworCQkJbG9nLT5sX2ljbG9nX2hlYWRzID0gMTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBTcGVjaWFsIGNhc2UgbWFjaGluZXMgdGhhdCBoYXZlIGxlc3MgdGhhbiAzMk1CIG9mIG1lbW9yeS4KKwkgKiBBbGwgbWFjaGluZXMgd2l0aCBtb3JlIG1lbW9yeSB1c2UgMzJLQiBidWZmZXJzLgorCSAqLworCWlmICh4ZnNfcGh5c21lbSA8PSBidG9jKDMyKjEwMjQqMTAyNCkpIHsKKwkJLyogRG9uJ3QgY2hhbmdlOyBtaW4gY29uZmlndXJhdGlvbiAqLworCQlsb2ctPmxfaWNsb2dfc2l6ZSA9IFhMT0dfUkVDT1JEX0JTSVpFOwkJLyogMTZrICovCisJCWxvZy0+bF9pY2xvZ19zaXplX2xvZyA9IFhMT0dfUkVDT1JEX0JTSElGVDsKKwl9IGVsc2UgeworCQlsb2ctPmxfaWNsb2dfc2l6ZSA9IFhMT0dfQklHX1JFQ09SRF9CU0laRTsJLyogMzJrICovCisJCWxvZy0+bF9pY2xvZ19zaXplX2xvZyA9IFhMT0dfQklHX1JFQ09SRF9CU0hJRlQ7CisJfQorCisJLyogdGhlIGRlZmF1bHQgbG9nIHNpemUgaXMgMTZrIG9yIDMyayB3aGljaCBpcyBvbmUgaGVhZGVyIHNlY3RvciAqLworCWxvZy0+bF9pY2xvZ19oc2l6ZSA9IEJCU0laRTsKKwlsb2ctPmxfaWNsb2dfaGVhZHMgPSAxOworCisJLyoKKwkgKiBGb3IgMTZLQiwgd2UgdXNlIDMgMzJLQiBidWZmZXJzLiAgRm9yIDMyS0IgYmxvY2sgc2l6ZXMsIHdlIHVzZQorCSAqIDQgMzJLQiBidWZmZXJzLiAgRm9yIDY0S0IgYmxvY2sgc2l6ZXMsIHdlIHVzZSA4IDMyS0IgYnVmZmVycy4KKwkgKi8KKwlpZiAobXAtPm1fc2Iuc2JfYmxvY2tzaXplID49IDE2KjEwMjQpIHsKKwkJbG9nLT5sX2ljbG9nX3NpemUgPSBYTE9HX0JJR19SRUNPUkRfQlNJWkU7CisJCWxvZy0+bF9pY2xvZ19zaXplX2xvZyA9IFhMT0dfQklHX1JFQ09SRF9CU0hJRlQ7CisJCWlmIChtcC0+bV9sb2didWZzID09IC0xKSB7CisJCQlzd2l0Y2ggKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSkgeworCQkJICAgIGNhc2UgMTYqMTAyNDoJCQkvKiAxNiBLQiAqLworCQkJCWxvZy0+bF9pY2xvZ19idWZzID0gMzsKKwkJCQlicmVhazsKKwkJCSAgICBjYXNlIDMyKjEwMjQ6CQkJLyogMzIgS0IgKi8KKwkJCQlsb2ctPmxfaWNsb2dfYnVmcyA9IDQ7CisJCQkJYnJlYWs7CisJCQkgICAgY2FzZSA2NCoxMDI0OgkJCS8qIDY0IEtCICovCisJCQkJbG9nLT5sX2ljbG9nX2J1ZnMgPSA4OworCQkJCWJyZWFrOworCQkJICAgIGRlZmF1bHQ6CisJCQkJeGxvZ19wYW5pYygiWEZTOiBJbnZhbGlkIGJsb2Nrc2l6ZSIpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQkvKiB4bG9nX2dldF9pY2xvZ19idWZmZXJfc2l6ZSAqLworCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaW5pdGlhbGl6ZXMgc29tZSBvZiB0aGUgbG9nIHN0cnVjdHVyZSBmb3IgYSBnaXZlbiBtb3VudCBwb2ludC4KKyAqIEl0cyBwcmltYXJ5IHB1cnBvc2UgaXMgdG8gZmlsbCBpbiBlbm91Z2gsIHNvIHJlY292ZXJ5IGNhbiBvY2N1ci4gIEhvd2V2ZXIsCisgKiBzb21lIG90aGVyIHN0dWZmIG1heSBiZSBmaWxsZWQgaW4gdG9vLgorICovCitTVEFUSUMgeGxvZ190ICoKK3hsb2dfYWxsb2NfbG9nKHhmc19tb3VudF90CSptcCwKKwkgICAgICAgeGZzX2J1ZnRhcmdfdAkqbG9nX3RhcmdldCwKKwkgICAgICAgeGZzX2RhZGRyX3QJYmxrX29mZnNldCwKKwkgICAgICAgaW50CQludW1fYmJsa3MpCit7CisJeGxvZ190CQkJKmxvZzsKKwl4bG9nX3JlY19oZWFkZXJfdAkqaGVhZDsKKwl4bG9nX2luX2NvcmVfdAkJKippY2xvZ3A7CisJeGxvZ19pbl9jb3JlX3QJCSppY2xvZywgKnByZXZfaWNsb2c9TlVMTDsKKwl4ZnNfYnVmX3QJCSpicDsKKwlpbnQJCQlpOworCWludAkJCWljbG9nc2l6ZTsKKworCWxvZyA9ICh4bG9nX3QgKilrbWVtX3phbGxvYyhzaXplb2YoeGxvZ190KSwgS01fU0xFRVApOworCisJbG9nLT5sX21wCSAgID0gbXA7CisJbG9nLT5sX3RhcmcJICAgPSBsb2dfdGFyZ2V0OworCWxvZy0+bF9sb2dzaXplICAgICA9IEJCVE9CKG51bV9iYmxrcyk7CisJbG9nLT5sX2xvZ0JCc3RhcnQgID0gYmxrX29mZnNldDsKKwlsb2ctPmxfbG9nQkJzaXplICAgPSBudW1fYmJsa3M7CisJbG9nLT5sX2NvdmVyZWRfc3RhdGUgPSBYTE9HX1NUQVRFX0NPVkVSX0lETEU7CisJbG9nLT5sX2ZsYWdzCSAgIHw9IFhMT0dfQUNUSVZFX1JFQ09WRVJZOworCisJbG9nLT5sX3ByZXZfYmxvY2sgID0gLTE7CisJQVNTSUdOX0FOWV9MU05fSE9TVChsb2ctPmxfdGFpbF9sc24sIDEsIDApOworCS8qIGxvZy0+bF90YWlsX2xzbiA9IDB4MTAwMDAwMDAwTEw7IGN5Y2xlID0gMTsgY3VycmVudCBibG9jayA9IDAgKi8KKwlsb2ctPmxfbGFzdF9zeW5jX2xzbiA9IGxvZy0+bF90YWlsX2xzbjsKKwlsb2ctPmxfY3Vycl9jeWNsZSAgPSAxOwkgICAgLyogMCBpcyBiYWQgc2luY2UgdGhpcyBpcyBpbml0aWFsIHZhbHVlICovCisJbG9nLT5sX2dyYW50X3Jlc2VydmVfY3ljbGUgPSAxOworCWxvZy0+bF9ncmFudF93cml0ZV9jeWNsZSA9IDE7CisKKwlpZiAoWEZTX1NCX1ZFUlNJT05fSEFTU0VDVE9SKCZtcC0+bV9zYikpIHsKKwkJbG9nLT5sX3NlY3RiYl9sb2cgPSBtcC0+bV9zYi5zYl9sb2dzZWN0bG9nIC0gQkJTSElGVDsKKwkJQVNTRVJUKGxvZy0+bF9zZWN0YmJfbG9nIDw9IG1wLT5tX3NlY3RiYl9sb2cpOworCQkvKiBmb3IgbGFyZ2VyIHNlY3RvciBzaXplcywgbXVzdCBoYXZlIHYyIG9yIGV4dGVybmFsIGxvZyAqLworCQlBU1NFUlQobG9nLT5sX3NlY3RiYl9sb2cgPT0gMCB8fAorCQkJbG9nLT5sX2xvZ0JCc3RhcnQgPT0gMCB8fAorCQkJWEZTX1NCX1ZFUlNJT05fSEFTTE9HVjIoJm1wLT5tX3NiKSk7CisJCUFTU0VSVChtcC0+bV9zYi5zYl9sb2dzZWN0bG9nID49IEJCU0hJRlQpOworCX0KKwlsb2ctPmxfc2VjdGJiX21hc2sgPSAoMSA8PCBsb2ctPmxfc2VjdGJiX2xvZykgLSAxOworCisJeGxvZ19nZXRfaWNsb2dfYnVmZmVyX3NpemUobXAsIGxvZyk7CisKKwlicCA9IHhmc19idWZfZ2V0X2VtcHR5KGxvZy0+bF9pY2xvZ19zaXplLCBtcC0+bV9sb2dkZXZfdGFyZ3ApOworCVhGU19CVUZfU0VUX0lPRE9ORV9GVU5DKGJwLCB4bG9nX2lvZG9uZSk7CisJWEZTX0JVRl9TRVRfQkRTVFJBVF9GVU5DKGJwLCB4bG9nX2Jkc3RyYXRfY2IpOworCVhGU19CVUZfU0VUX0ZTUFJJVkFURTIoYnAsICh1bnNpZ25lZCBsb25nKTEpOworCUFTU0VSVChYRlNfQlVGX0lTQlVTWShicCkpOworCUFTU0VSVChYRlNfQlVGX1ZBTFVTRU1BKGJwKSA8PSAwKTsKKwlsb2ctPmxfeGJ1ZiA9IGJwOworCisJc3BpbmxvY2tfaW5pdCgmbG9nLT5sX2ljbG9nbG9jaywgImljbG9nIik7CisJc3BpbmxvY2tfaW5pdCgmbG9nLT5sX2dyYW50X2xvY2ssICJncmhlYWRfaWNsb2ciKTsKKwlpbml0bnNlbWEoJmxvZy0+bF9mbHVzaHNlbWEsIDAsICJpYy1mbHVzaCIpOworCXhsb2dfc3RhdGVfdGlja2V0X2FsbG9jKGxvZyk7ICAvKiB3YWl0IHVudGlsIGFmdGVyIGljbG9nbG9jayBpbml0ZWQgKi8KKworCS8qIGxvZyByZWNvcmQgc2l6ZSBtdXN0IGJlIG11bHRpcGxlIG9mIEJCU0laRTsgc2VlIHhsb2dfcmVjX2hlYWRlcl90ICovCisJQVNTRVJUKChYRlNfQlVGX1NJWkUoYnApICYgQkJNQVNLKSA9PSAwKTsKKworCWljbG9ncCA9ICZsb2ctPmxfaWNsb2c7CisJLyoKKwkgKiBUaGUgYW1vdW50IG9mIG1lbW9yeSB0byBhbGxvY2F0ZSBmb3IgdGhlIGljbG9nIHN0cnVjdHVyZSBpcworCSAqIHJhdGhlciBmdW5reSBkdWUgdG8gdGhlIHdheSB0aGUgc3RydWN0dXJlIGlzIGRlZmluZWQuICBJdCBpcworCSAqIGRvbmUgdGhpcyB3YXkgc28gdGhhdCB3ZSBjYW4gdXNlIGRpZmZlcmVudCBzaXplcyBmb3IgbWFjaGluZXMKKwkgKiB3aXRoIGRpZmZlcmVudCBhbW91bnRzIG9mIG1lbW9yeS4gIFNlZSB0aGUgZGVmaW5pdGlvbiBvZgorCSAqIHhsb2dfaW5fY29yZV90IGluIHhmc19sb2dfcHJpdi5oIGZvciBkZXRhaWxzLgorCSAqLworCWljbG9nc2l6ZSA9IGxvZy0+bF9pY2xvZ19zaXplOworCUFTU0VSVChsb2ctPmxfaWNsb2dfc2l6ZSA+PSA0MDk2KTsKKwlmb3IgKGk9MDsgaSA8IGxvZy0+bF9pY2xvZ19idWZzOyBpKyspIHsKKwkJKmljbG9ncCA9ICh4bG9nX2luX2NvcmVfdCAqKQorCQkJICBrbWVtX3phbGxvYyhzaXplb2YoeGxvZ19pbl9jb3JlX3QpLCBLTV9TTEVFUCk7CisJCWljbG9nID0gKmljbG9ncDsKKwkJaWNsb2ctPmhpY19kYXRhID0gKHhsb2dfaW5fY29yZV8yX3QgKikKKwkJCSAga21lbV96YWxsb2MoaWNsb2dzaXplLCBLTV9TTEVFUCk7CisKKwkJaWNsb2ctPmljX3ByZXYgPSBwcmV2X2ljbG9nOworCQlwcmV2X2ljbG9nID0gaWNsb2c7CisJCWxvZy0+bF9pY2xvZ19iYWtbaV0gPSAoeGZzX2NhZGRyX3QpJihpY2xvZy0+aWNfaGVhZGVyKTsKKworCQloZWFkID0gJmljbG9nLT5pY19oZWFkZXI7CisJCW1lbXNldChoZWFkLCAwLCBzaXplb2YoeGxvZ19yZWNfaGVhZGVyX3QpKTsKKwkJSU5UX1NFVChoZWFkLT5oX21hZ2ljbm8sIEFSQ0hfQ09OVkVSVCwgWExPR19IRUFERVJfTUFHSUNfTlVNKTsKKwkJSU5UX1NFVChoZWFkLT5oX3ZlcnNpb24sIEFSQ0hfQ09OVkVSVCwKKwkJCVhGU19TQl9WRVJTSU9OX0hBU0xPR1YyKCZsb2ctPmxfbXAtPm1fc2IpID8gMiA6IDEpOworCQlJTlRfU0VUKGhlYWQtPmhfc2l6ZSwgQVJDSF9DT05WRVJULCBsb2ctPmxfaWNsb2dfc2l6ZSk7CisJCS8qIG5ldyBmaWVsZHMgKi8KKwkJSU5UX1NFVChoZWFkLT5oX2ZtdCwgQVJDSF9DT05WRVJULCBYTE9HX0ZNVCk7CisJCW1lbWNweSgmaGVhZC0+aF9mc191dWlkLCAmbXAtPm1fc2Iuc2JfdXVpZCwgc2l6ZW9mKHV1aWRfdCkpOworCisJCWJwID0geGZzX2J1Zl9nZXRfZW1wdHkobG9nLT5sX2ljbG9nX3NpemUsIG1wLT5tX2xvZ2Rldl90YXJncCk7CisJCVhGU19CVUZfU0VUX0lPRE9ORV9GVU5DKGJwLCB4bG9nX2lvZG9uZSk7CisJCVhGU19CVUZfU0VUX0JEU1RSQVRfRlVOQyhicCwgeGxvZ19iZHN0cmF0X2NiKTsKKwkJWEZTX0JVRl9TRVRfRlNQUklWQVRFMihicCwgKHVuc2lnbmVkIGxvbmcpMSk7CisJCWljbG9nLT5pY19icCA9IGJwOworCisJCWljbG9nLT5pY19zaXplID0gWEZTX0JVRl9TSVpFKGJwKSAtIGxvZy0+bF9pY2xvZ19oc2l6ZTsKKwkJaWNsb2ctPmljX3N0YXRlID0gWExPR19TVEFURV9BQ1RJVkU7CisJCWljbG9nLT5pY19sb2cgPSBsb2c7CisJCWljbG9nLT5pY19jYWxsYmFja190YWlsID0gJihpY2xvZy0+aWNfY2FsbGJhY2spOworCQlpY2xvZy0+aWNfZGF0YXAgPSAoY2hhciAqKWljbG9nLT5oaWNfZGF0YSArIGxvZy0+bF9pY2xvZ19oc2l6ZTsKKworCQlBU1NFUlQoWEZTX0JVRl9JU0JVU1koaWNsb2ctPmljX2JwKSk7CisJCUFTU0VSVChYRlNfQlVGX1ZBTFVTRU1BKGljbG9nLT5pY19icCkgPD0gMCk7CisJCXN2X2luaXQoJmljbG9nLT5pY19mb3JjZXNlbWEsIFNWX0RFRkFVTFQsICJpY2xvZy1mb3JjZSIpOworCQlzdl9pbml0KCZpY2xvZy0+aWNfd3JpdGVzZW1hLCBTVl9ERUZBVUxULCAiaWNsb2ctd3JpdGUiKTsKKworCQlpY2xvZ3AgPSAmaWNsb2ctPmljX25leHQ7CisJfQorCSppY2xvZ3AgPSBsb2ctPmxfaWNsb2c7CQkJLyogY29tcGxldGUgcmluZyAqLworCWxvZy0+bF9pY2xvZy0+aWNfcHJldiA9IHByZXZfaWNsb2c7CS8qIHJlLXdyaXRlIDFzdCBwcmV2IHB0ciAqLworCisJcmV0dXJuIGxvZzsKK30JLyogeGxvZ19hbGxvY19sb2cgKi8KKworCisvKgorICogV3JpdGUgb3V0IHRoZSBjb21taXQgcmVjb3JkIG9mIGEgdHJhbnNhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbgorICogdGlja2V0LiAgUmV0dXJuIHRoZSBsc24gb2YgdGhlIGNvbW1pdCByZWNvcmQuCisgKi8KK1NUQVRJQyBpbnQKK3hsb2dfY29tbWl0X3JlY29yZCh4ZnNfbW91bnRfdCAgKm1wLAorCQkgICB4bG9nX3RpY2tldF90ICp0aWNrZXQsCisJCSAgIHhsb2dfaW5fY29yZV90ICoqaWNsb2csCisJCSAgIHhmc19sc25fdAkqY29tbWl0bHNucCkKK3sKKwlpbnQJCWVycm9yOworCXhmc19sb2dfaW92ZWNfdAlyZWdbMV07CisKKwlyZWdbMF0uaV9hZGRyID0gTlVMTDsKKwlyZWdbMF0uaV9sZW4gPSAwOworCisJQVNTRVJUX0FMV0FZUyhpY2xvZyk7CisJaWYgKChlcnJvciA9IHhsb2dfd3JpdGUobXAsIHJlZywgMSwgdGlja2V0LCBjb21taXRsc25wLAorCQkJICAgICAgIGljbG9nLCBYTE9HX0NPTU1JVF9UUkFOUykpKSB7CisJCXhmc19mb3JjZV9zaHV0ZG93bihtcCwgWEZTX0xPR19JT19FUlJPUik7CisJfQorCXJldHVybiAoZXJyb3IpOworfQkvKiB4bG9nX2NvbW1pdF9yZWNvcmQgKi8KKworCisvKgorICogUHVzaCBvbiB0aGUgYnVmZmVyIGNhY2hlIGNvZGUgaWYgd2UgZXZlciB1c2UgbW9yZSB0aGFuIDc1JSBvZiB0aGUgb24tZGlzaworICogbG9nIHNwYWNlLiAgVGhpcyBjb2RlIHB1c2hlcyBvbiB0aGUgbHNuIHdoaWNoIHdvdWxkIHN1cHBvc2VkbHkgZnJlZSB1cAorICogdGhlIDI1JSB3aGljaCB3ZSB3YW50IHRvIGxlYXZlIGZyZWUuICBXZSBtYXkgbmVlZCB0byBhZG9wdCBhIHBvbGljeSB3aGljaAorICogcHVzaGVzIG9uIGFuIGxzbiB3aGljaCBpcyBmdXJ0aGVyIGFsb25nIGluIHRoZSBsb2cgb25jZSB3ZSByZWFjaCB0aGUgaGlnaAorICogd2F0ZXIgbWFyay4gIEluIHRoaXMgbWFubmVyLCB3ZSB3b3VsZCBiZSBjcmVhdGluZyBhIGxvdyB3YXRlciBtYXJrLgorICovCit2b2lkCit4bG9nX2dyYW50X3B1c2hfYWlsKHhmc19tb3VudF90CSptcCwKKwkJICAgIGludAkJbmVlZF9ieXRlcykKK3sKKyAgICB4bG9nX3QJKmxvZyA9IG1wLT5tX2xvZzsJLyogcG9pbnRlciB0byB0aGUgbG9nICovCisgICAgeGZzX2xzbl90CXRhaWxfbHNuOwkJLyogbHNuIG9mIHRoZSBsb2cgdGFpbCAqLworICAgIHhmc19sc25fdAl0aHJlc2hvbGRfbHNuID0gMDsJLyogbHNuIHdlJ2QgbGlrZSB0byBiZSBhdCAqLworICAgIGludAkJZnJlZV9ibG9ja3M7CQkvKiBmcmVlIGJsb2NrcyBsZWZ0IHRvIHdyaXRlIHRvICovCisgICAgaW50CQlmcmVlX2J5dGVzOwkJLyogZnJlZSBieXRlcyBsZWZ0IHRvIHdyaXRlIHRvICovCisgICAgaW50CQl0aHJlc2hvbGRfYmxvY2s7CS8qIGJsb2NrIGluIGxzbiB3ZSdkIGxpa2UgdG8gYmUgYXQgKi8KKyAgICBpbnQJCXRocmVzaG9sZF9jeWNsZTsJLyogbHNuIGN5Y2xlIHdlJ2QgbGlrZSB0byBiZSBhdCAqLworICAgIGludAkJZnJlZV90aHJlc2hvbGQ7CisgICAgU1BMREVDTChzKTsKKworICAgIEFTU0VSVChCVE9CQihuZWVkX2J5dGVzKSA8IGxvZy0+bF9sb2dCQnNpemUpOworCisgICAgcyA9IEdSQU5UX0xPQ0sobG9nKTsKKyAgICBmcmVlX2J5dGVzID0geGxvZ19zcGFjZV9sZWZ0KGxvZywKKwkJCQkgbG9nLT5sX2dyYW50X3Jlc2VydmVfY3ljbGUsCisJCQkJIGxvZy0+bF9ncmFudF9yZXNlcnZlX2J5dGVzKTsKKyAgICB0YWlsX2xzbiA9IGxvZy0+bF90YWlsX2xzbjsKKyAgICBmcmVlX2Jsb2NrcyA9IEJUT0JCVChmcmVlX2J5dGVzKTsKKworICAgIC8qCisgICAgICogU2V0IHRoZSB0aHJlc2hvbGQgZm9yIHRoZSBtaW5pbXVtIG51bWJlciBvZiBmcmVlIGJsb2NrcyBpbiB0aGUKKyAgICAgKiBsb2cgdG8gdGhlIG1heGltdW0gb2Ygd2hhdCB0aGUgY2FsbGVyIG5lZWRzLCBvbmUgcXVhcnRlciBvZiB0aGUKKyAgICAgKiBsb2csIGFuZCAyNTYgYmxvY2tzLgorICAgICAqLworICAgIGZyZWVfdGhyZXNob2xkID0gQlRPQkIobmVlZF9ieXRlcyk7CisgICAgZnJlZV90aHJlc2hvbGQgPSBNQVgoZnJlZV90aHJlc2hvbGQsIChsb2ctPmxfbG9nQkJzaXplID4+IDIpKTsKKyAgICBmcmVlX3RocmVzaG9sZCA9IE1BWChmcmVlX3RocmVzaG9sZCwgMjU2KTsKKyAgICBpZiAoZnJlZV9ibG9ja3MgPCBmcmVlX3RocmVzaG9sZCkgeworCXRocmVzaG9sZF9ibG9jayA9IEJMT0NLX0xTTih0YWlsX2xzbikgKyBmcmVlX3RocmVzaG9sZDsKKwl0aHJlc2hvbGRfY3ljbGUgPSBDWUNMRV9MU04odGFpbF9sc24pOworCWlmICh0aHJlc2hvbGRfYmxvY2sgPj0gbG9nLT5sX2xvZ0JCc2l6ZSkgeworCSAgICB0aHJlc2hvbGRfYmxvY2sgLT0gbG9nLT5sX2xvZ0JCc2l6ZTsKKwkgICAgdGhyZXNob2xkX2N5Y2xlICs9IDE7CisJfQorCUFTU0lHTl9BTllfTFNOX0hPU1QodGhyZXNob2xkX2xzbiwgdGhyZXNob2xkX2N5Y2xlLAorCQkgICAgICAgdGhyZXNob2xkX2Jsb2NrKTsKKworCS8qIERvbid0IHBhc3MgaW4gYW4gbHNuIGdyZWF0ZXIgdGhhbiB0aGUgbHNuIG9mIHRoZSBsYXN0CisJICogbG9nIHJlY29yZCBrbm93biB0byBiZSBvbiBkaXNrLgorCSAqLworCWlmIChYRlNfTFNOX0NNUCh0aHJlc2hvbGRfbHNuLCBsb2ctPmxfbGFzdF9zeW5jX2xzbikgPiAwKQorCSAgICB0aHJlc2hvbGRfbHNuID0gbG9nLT5sX2xhc3Rfc3luY19sc247CisgICAgfQorICAgIEdSQU5UX1VOTE9DSyhsb2csIHMpOworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIHRyYW5zYWN0aW9uIGxheWVyIHRvIGtpY2sgdGhlIGRpcnR5IGJ1ZmZlcnMgb3V0IHRvCisgICAgICogZGlzayBhc3luY2hyb25vdXNseS4gTm8gcG9pbnQgaW4gdHJ5aW5nIHRvIGRvIHRoaXMgaWYKKyAgICAgKiB0aGUgZmlsZXN5c3RlbSBpcyBzaHV0dGluZyBkb3duLgorICAgICAqLworICAgIGlmICh0aHJlc2hvbGRfbHNuICYmCisJIVhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykpCisJICAgIHhmc190cmFuc19wdXNoX2FpbChtcCwgdGhyZXNob2xkX2xzbik7Cit9CS8qIHhsb2dfZ3JhbnRfcHVzaF9haWwgKi8KKworCisvKgorICogRmx1c2ggb3V0IHRoZSBpbi1jb3JlIGxvZyAoaWNsb2cpIHRvIHRoZSBvbi1kaXNrIGxvZyBpbiBhbiBhc3luY2hyb25vdXMgCisgKiBmYXNoaW9uLiAgUHJldmlvdXNseSwgd2Ugc2hvdWxkIGhhdmUgbW92ZWQgdGhlIGN1cnJlbnQgaWNsb2cKKyAqIHB0ciBpbiB0aGUgbG9nIHRvIHBvaW50IHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBpY2xvZy4gIFRoaXMgYWxsb3dzIGZ1cnRoZXIKKyAqIHdyaXRlIHRvIGNvbnRpbnVlIHdoaWxlIHRoaXMgY29kZSBzeW5jcyBvdXQgYW4gaWNsb2cgcmVhZHkgdG8gZ28uCisgKiBCZWZvcmUgYW4gaW4tY29yZSBsb2cgY2FuIGJlIHdyaXR0ZW4gb3V0LCB0aGUgZGF0YSBzZWN0aW9uIG11c3QgYmUgc2Nhbm5lZAorICogdG8gc2F2ZSBhd2F5IHRoZSAxc3Qgd29yZCBvZiBlYWNoIEJCU0laRSBibG9jayBpbnRvIHRoZSBoZWFkZXIuICBXZSByZXBsYWNlCisgKiBpdCB3aXRoIHRoZSBjdXJyZW50IGN5Y2xlIGNvdW50LiAgRWFjaCBCQlNJWkUgYmxvY2sgaXMgdGFnZ2VkIHdpdGggdGhlCisgKiBjeWNsZSBjb3VudCBiZWNhdXNlIHRoZXJlIGluIGFuIGltcGxpY2l0IGFzc3VtcHRpb24gdGhhdCBkcml2ZXMgd2lsbAorICogZ3VhcmFudGVlIHRoYXQgZW50aXJlIDUxMiBieXRlIGJsb2NrcyBnZXQgd3JpdHRlbiBhdCBvbmNlLiAgSW4gb3RoZXIgd29yZHMsCisgKiB3ZSBjYW4ndCBoYXZlIHBhcnQgb2YgYSA1MTIgYnl0ZSBibG9jayB3cml0dGVuIGFuZCBwYXJ0IG5vdCB3cml0dGVuLiAgQnkKKyAqIHRhZ2dpbmcgZWFjaCBibG9jaywgd2Ugd2lsbCBrbm93IHdoaWNoIGJsb2NrcyBhcmUgdmFsaWQgd2hlbiByZWNvdmVyaW5nCisgKiBhZnRlciBhbiB1bmNsZWFuIHNodXRkb3duLgorICoKKyAqIFRoaXMgcm91dGluZSBpcyBzaW5nbGUgdGhyZWFkZWQgb24gdGhlIGljbG9nLiAgTm8gb3RoZXIgdGhyZWFkIGNhbiBiZSBpbgorICogdGhpcyByb3V0aW5lIHdpdGggdGhlIHNhbWUgaWNsb2cuICBDaGFuZ2luZyBjb250ZW50cyBvZiBpY2xvZyBjYW4gdGhlcmUtCisgKiBmb3JlIGJlIGRvbmUgd2l0aG91dCBncmFiYmluZyB0aGUgc3RhdGUgbWFjaGluZSBsb2NrLiAgVXBkYXRpbmcgdGhlIGdsb2JhbAorICogbG9nIHdpbGwgcmVxdWlyZSBncmFiYmluZyB0aGUgbG9jayB0aG91Z2guCisgKgorICogVGhlIGVudGlyZSBsb2cgbWFuYWdlciB1c2VzIGEgbG9naWNhbCBibG9jayBudW1iZXJpbmcgc2NoZW1lLiAgT25seQorICogbG9nX3N5bmMgKGFuZCB0aGVuIG9ubHkgYndyaXRlKCkpIGtub3cgYWJvdXQgdGhlIGZhY3QgdGhhdCB0aGUgbG9nIG1heQorICogbm90IHN0YXJ0IHdpdGggYmxvY2sgemVybyBvbiBhIGdpdmVuIGRldmljZS4gIFRoZSBsb2cgYmxvY2sgc3RhcnQgb2Zmc2V0CisgKiBpcyBhZGRlZCBpbW1lZGlhdGVseSBiZWZvcmUgY2FsbGluZyBid3JpdGUoKS4KKyAqLworCitpbnQKK3hsb2dfc3luYyh4bG9nX3QJCSpsb2csCisJICB4bG9nX2luX2NvcmVfdAkqaWNsb2cpCit7CisJeGZzX2NhZGRyX3QJZHB0cjsJCS8qIHBvaW50ZXIgdG8gYnl0ZSBzaXplZCBlbGVtZW50ICovCisJeGZzX2J1Zl90CSpicDsKKwlpbnQJCWksIG9wczsKKwl1aW50CQljb3VudDsJCS8qIGJ5dGUgY291bnQgb2YgYndyaXRlICovCisJdWludAkJY291bnRfaW5pdDsJLyogaW5pdGlhbCBjb3VudCBiZWZvcmUgcm91bmR1cCAqLworCWludAkJcm91bmRvZmY7ICAgICAgIC8qIHJvdW5kb2ZmIHRvIEJCIG9yIHN0cmlwZSAqLworCWludAkJc3BsaXQgPSAwOwkvKiBzcGxpdCB3cml0ZSBpbnRvIHR3byByZWdpb25zICovCisJaW50CQllcnJvcjsKKwlTUExERUNMKHMpOworCWludAkJdjIgPSBYRlNfU0JfVkVSU0lPTl9IQVNMT0dWMigmbG9nLT5sX21wLT5tX3NiKTsKKworCVhGU19TVEFUU19JTkMoeHNfbG9nX3dyaXRlcyk7CisJQVNTRVJUKGljbG9nLT5pY19yZWZjbnQgPT0gMCk7CisKKwkvKiBBZGQgZm9yIExSIGhlYWRlciAqLworCWNvdW50X2luaXQgPSBsb2ctPmxfaWNsb2dfaHNpemUgKyBpY2xvZy0+aWNfb2Zmc2V0OworCisJLyogUm91bmQgb3V0IHRoZSBsb2cgd3JpdGUgc2l6ZSAqLworCWlmICh2MiAmJiBsb2ctPmxfbXAtPm1fc2Iuc2JfbG9nc3VuaXQgPiAxKSB7CisJCS8qIHdlIGhhdmUgYSB2MiBzdHJpcGUgdW5pdCB0byB1c2UgKi8KKwkJY291bnQgPSBYTE9HX0xTVU5JVFRPQihsb2csIFhMT0dfQlRPTFNVTklUKGxvZywgY291bnRfaW5pdCkpOworCX0gZWxzZSB7CisJCWNvdW50ID0gQkJUT0IoQlRPQkIoY291bnRfaW5pdCkpOworCX0KKwlyb3VuZG9mZiA9IGNvdW50IC0gY291bnRfaW5pdDsKKwlBU1NFUlQocm91bmRvZmYgPj0gMCk7CisJQVNTRVJUKCh2MiAmJiBsb2ctPmxfbXAtPm1fc2Iuc2JfbG9nc3VuaXQgPiAxICYmIAorICAgICAgICAgICAgICAgIHJvdW5kb2ZmIDwgbG9nLT5sX21wLT5tX3NiLnNiX2xvZ3N1bml0KQorCQl8fCAKKwkJKGxvZy0+bF9tcC0+bV9zYi5zYl9sb2dzdW5pdCA8PSAxICYmIAorCQkgcm91bmRvZmYgPCBCQlRPQigxKSkpOworCisJLyogbW92ZSBncmFudCBoZWFkcyBieSByb3VuZG9mZiBpbiBzeW5jICovCisJcyA9IEdSQU5UX0xPQ0sobG9nKTsKKwlYTE9HX0dSQU5UX0FERF9TUEFDRShsb2csIHJvdW5kb2ZmLCAndycpOworCVhMT0dfR1JBTlRfQUREX1NQQUNFKGxvZywgcm91bmRvZmYsICdyJyk7CisJR1JBTlRfVU5MT0NLKGxvZywgcyk7CisKKwkvKiBwdXQgY3ljbGUgbnVtYmVyIGluIGV2ZXJ5IGJsb2NrICovCisJeGxvZ19wYWNrX2RhdGEobG9nLCBpY2xvZywgcm91bmRvZmYpOyAKKworCS8qIHJlYWwgYnl0ZSBsZW5ndGggKi8KKwlpZiAodjIpIHsKKwkJSU5UX1NFVChpY2xvZy0+aWNfaGVhZGVyLmhfbGVuLCAKKwkJCUFSQ0hfQ09OVkVSVCwKKwkJCWljbG9nLT5pY19vZmZzZXQgKyByb3VuZG9mZik7CisJfSBlbHNlIHsKKwkJSU5UX1NFVChpY2xvZy0+aWNfaGVhZGVyLmhfbGVuLCBBUkNIX0NPTlZFUlQsIGljbG9nLT5pY19vZmZzZXQpOworCX0KKworCS8qIHB1dCBvcHMgY291bnQgaW4gY29ycmVjdCBvcmRlciAqLworCW9wcyA9IGljbG9nLT5pY19oZWFkZXIuaF9udW1fbG9nb3BzOworCUlOVF9TRVQoaWNsb2ctPmljX2hlYWRlci5oX251bV9sb2dvcHMsIEFSQ0hfQ09OVkVSVCwgb3BzKTsKKworCWJwCSAgICA9IGljbG9nLT5pY19icDsKKwlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUyKGJwLCB1bnNpZ25lZCBsb25nKSA9PSAodW5zaWduZWQgbG9uZykxKTsKKwlYRlNfQlVGX1NFVF9GU1BSSVZBVEUyKGJwLCAodW5zaWduZWQgbG9uZykyKTsKKwlYRlNfQlVGX1NFVF9BRERSKGJwLCBCTE9DS19MU04oSU5UX0dFVChpY2xvZy0+aWNfaGVhZGVyLmhfbHNuLCBBUkNIX0NPTlZFUlQpKSk7CisKKwlYRlNfU1RBVFNfQUREKHhzX2xvZ19ibG9ja3MsIEJUT0JCKGNvdW50KSk7CisKKwkvKiBEbyB3ZSBuZWVkIHRvIHNwbGl0IHRoaXMgd3JpdGUgaW50byAyIHBhcnRzPyAqLworCWlmIChYRlNfQlVGX0FERFIoYnApICsgQlRPQkIoY291bnQpID4gbG9nLT5sX2xvZ0JCc2l6ZSkgeworCQlzcGxpdCA9IGNvdW50IC0gKEJCVE9CKGxvZy0+bF9sb2dCQnNpemUgLSBYRlNfQlVGX0FERFIoYnApKSk7CisJCWNvdW50ID0gQkJUT0IobG9nLT5sX2xvZ0JCc2l6ZSAtIFhGU19CVUZfQUREUihicCkpOworCQlpY2xvZy0+aWNfYndyaXRlY250ID0gMjsJLyogc3BsaXQgaW50byAyIHdyaXRlcyAqLworCX0gZWxzZSB7CisJCWljbG9nLT5pY19id3JpdGVjbnQgPSAxOworCX0KKwlYRlNfQlVGX1NFVF9QVFIoYnAsICh4ZnNfY2FkZHJfdCkgJihpY2xvZy0+aWNfaGVhZGVyKSwgY291bnQpOworCVhGU19CVUZfU0VUX0ZTUFJJVkFURShicCwgaWNsb2cpOwkvKiBzYXZlIGZvciBsYXRlciAqLworCVhGU19CVUZfQlVTWShicCk7CisJWEZTX0JVRl9BU1lOQyhicCk7CisJLyoKKwkgKiBEbyBhIGRpc2sgd3JpdGUgY2FjaGUgZmx1c2ggZm9yIHRoZSBsb2cgYmxvY2suCisJICogVGhpcyBpcyBhIGJpdCBvZiBhIHNsZWRnZWhhbW1lciwgaXQgd291bGQgYmUgYmV0dGVyCisJICogdG8gdXNlIGEgdGFnIGJhcnJpZXIgaGVyZSB0aGF0IGp1c3QgcHJldmVudHMgcmVvcmRlcmluZy4KKwkgKiBJdCBtYXkgbm90IGJlIG5lZWRlZCB0byBmbHVzaCB0aGUgZmlyc3Qgc3BsaXQgYmxvY2sgaW4gdGhlIGxvZyB3cmFwCisJICogY2FzZSwgYnV0IGRvIGl0IGFueXdheXMgdG8gYmUgc2FmZSAtQUsKKwkgKi8KKwlpZiAoIShsb2ctPmxfbXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfTk9MT0dGTFVTSCkpCisJCVhGU19CVUZfRkxVU0goYnApOworCisJQVNTRVJUKFhGU19CVUZfQUREUihicCkgPD0gbG9nLT5sX2xvZ0JCc2l6ZS0xKTsKKwlBU1NFUlQoWEZTX0JVRl9BRERSKGJwKSArIEJUT0JCKGNvdW50KSA8PSBsb2ctPmxfbG9nQkJzaXplKTsKKworCXhsb2dfdmVyaWZ5X2ljbG9nKGxvZywgaWNsb2csIGNvdW50LCBCX1RSVUUpOworCisJLyogYWNjb3VudCBmb3IgbG9nIHdoaWNoIGRvZXNuJ3Qgc3RhcnQgYXQgYmxvY2sgIzAgKi8KKwlYRlNfQlVGX1NFVF9BRERSKGJwLCBYRlNfQlVGX0FERFIoYnApICsgbG9nLT5sX2xvZ0JCc3RhcnQpOworCS8qCisJICogRG9uJ3QgY2FsbCB4ZnNfYndyaXRlIGhlcmUuIFdlIGRvIGxvZy1zeW5jcyBldmVuIHdoZW4gdGhlIGZpbGVzeXN0ZW0KKwkgKiBpcyBzaHV0dGluZyBkb3duLgorCSAqLworCVhGU19CVUZfV1JJVEUoYnApOworCisJaWYgKChlcnJvciA9IFhGU19id3JpdGUoYnApKSkgeworCQl4ZnNfaW9lcnJvcl9hbGVydCgieGxvZ19zeW5jIiwgbG9nLT5sX21wLCBicCwKKwkJCQkgIFhGU19CVUZfQUREUihicCkpOworCQlyZXR1cm4gKGVycm9yKTsKKwl9CisJaWYgKHNwbGl0KSB7CisJCWJwCQk9IGljbG9nLT5pY19sb2ctPmxfeGJ1ZjsKKwkJQVNTRVJUKFhGU19CVUZfRlNQUklWQVRFMihicCwgdW5zaWduZWQgbG9uZykgPT0KKwkJCQkJCQkodW5zaWduZWQgbG9uZykxKTsKKwkJWEZTX0JVRl9TRVRfRlNQUklWQVRFMihicCwgKHVuc2lnbmVkIGxvbmcpMik7CisJCVhGU19CVUZfU0VUX0FERFIoYnAsIDApOwkgICAgIC8qIGxvZ2ljYWwgMCAqLworCQlYRlNfQlVGX1NFVF9QVFIoYnAsICh4ZnNfY2FkZHJfdCkoKF9fcHNpbnRfdCkmKGljbG9nLT5pY19oZWFkZXIpKworCQkJCQkgICAgKF9fcHNpbnRfdCljb3VudCksIHNwbGl0KTsKKwkJWEZTX0JVRl9TRVRfRlNQUklWQVRFKGJwLCBpY2xvZyk7CisJCVhGU19CVUZfQlVTWShicCk7CisJCVhGU19CVUZfQVNZTkMoYnApOworCQlpZiAoIShsb2ctPmxfbXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfTk9MT0dGTFVTSCkpCisJCQlYRlNfQlVGX0ZMVVNIKGJwKTsKKwkJZHB0ciA9IFhGU19CVUZfUFRSKGJwKTsKKwkJLyoKKwkJICogQnVtcCB0aGUgY3ljbGUgbnVtYmVycyBhdCB0aGUgc3RhcnQgb2YgZWFjaCBibG9jaworCQkgKiBzaW5jZSB0aGlzIHBhcnQgb2YgdGhlIGJ1ZmZlciBpcyBhdCB0aGUgc3RhcnQgb2YKKwkJICogYSBuZXcgY3ljbGUuICBXYXRjaCBvdXQgZm9yIHRoZSBoZWFkZXIgbWFnaWMgbnVtYmVyCisJCSAqIGNhc2UsIHRob3VnaC4KKwkJICovCisJCWZvciAoaT0wOyBpPHNwbGl0OyBpICs9IEJCU0laRSkgeworCQkJSU5UX01PRCgqKHVpbnQgKilkcHRyLCBBUkNIX0NPTlZFUlQsICsxKTsKKwkJCWlmIChJTlRfR0VUKCoodWludCAqKWRwdHIsIEFSQ0hfQ09OVkVSVCkgPT0gWExPR19IRUFERVJfTUFHSUNfTlVNKQorCQkJCUlOVF9NT0QoKih1aW50ICopZHB0ciwgQVJDSF9DT05WRVJULCArMSk7CisJCQlkcHRyICs9IEJCU0laRTsKKwkJfQorCisJCUFTU0VSVChYRlNfQlVGX0FERFIoYnApIDw9IGxvZy0+bF9sb2dCQnNpemUtMSk7CisJCUFTU0VSVChYRlNfQlVGX0FERFIoYnApICsgQlRPQkIoY291bnQpIDw9IGxvZy0+bF9sb2dCQnNpemUpOworCisJCS8qIGFjY291bnQgZm9yIGludGVybmFsIGxvZyB3aGljaCBkb2VzJ3Qgc3RhcnQgYXQgYmxvY2sgIzAgKi8KKwkJWEZTX0JVRl9TRVRfQUREUihicCwgWEZTX0JVRl9BRERSKGJwKSArIGxvZy0+bF9sb2dCQnN0YXJ0KTsKKwkJWEZTX0JVRl9XUklURShicCk7CisJCWlmICgoZXJyb3IgPSBYRlNfYndyaXRlKGJwKSkpIHsKKwkJCXhmc19pb2Vycm9yX2FsZXJ0KCJ4bG9nX3N5bmMgKHNwbGl0KSIsIGxvZy0+bF9tcCwKKwkJCQkJICBicCwgWEZTX0JVRl9BRERSKGJwKSk7CisJCQlyZXR1cm4gKGVycm9yKTsKKwkJfQorCX0KKwlyZXR1cm4gKDApOworfQkvKiB4bG9nX3N5bmMgKi8KKworCisvKgorICogVW5hbGxvY2F0ZSBhIGxvZyBzdHJ1Y3R1cmUKKyAqLwordm9pZAoreGxvZ191bmFsbG9jX2xvZyh4bG9nX3QgKmxvZykKK3sKKwl4bG9nX2luX2NvcmVfdAkqaWNsb2csICpuZXh0X2ljbG9nOworCXhsb2dfdGlja2V0X3QJKnRpYywgKm5leHRfdGljOworCWludAkJaTsKKworCisJaWNsb2cgPSBsb2ctPmxfaWNsb2c7CisJZm9yIChpPTA7IGk8bG9nLT5sX2ljbG9nX2J1ZnM7IGkrKykgeworCQlzdl9kZXN0cm95KCZpY2xvZy0+aWNfZm9yY2VzZW1hKTsKKwkJc3ZfZGVzdHJveSgmaWNsb2ctPmljX3dyaXRlc2VtYSk7CisJCXhmc19idWZfZnJlZShpY2xvZy0+aWNfYnApOworI2lmZGVmIFhGU19MT0dfVFJBQ0UKKwkJaWYgKGljbG9nLT5pY190cmFjZSAhPSBOVUxMKSB7CisJCQlrdHJhY2VfZnJlZShpY2xvZy0+aWNfdHJhY2UpOworCQl9CisjZW5kaWYKKwkJbmV4dF9pY2xvZyA9IGljbG9nLT5pY19uZXh0OworCQlrbWVtX2ZyZWUoaWNsb2ctPmhpY19kYXRhLCBsb2ctPmxfaWNsb2dfc2l6ZSk7CisJCWttZW1fZnJlZShpY2xvZywgc2l6ZW9mKHhsb2dfaW5fY29yZV90KSk7CisJCWljbG9nID0gbmV4dF9pY2xvZzsKKwl9CisJZnJlZXNlbWEoJmxvZy0+bF9mbHVzaHNlbWEpOworCXNwaW5sb2NrX2Rlc3Ryb3koJmxvZy0+bF9pY2xvZ2xvY2spOworCXNwaW5sb2NrX2Rlc3Ryb3koJmxvZy0+bF9ncmFudF9sb2NrKTsKKworCS8qIFhYWHN1cCB0YWtlIGEgbG9vayBhdCB0aGlzIGFnYWluLiAqLworCWlmICgobG9nLT5sX3RpY2tldF9jbnQgIT0gbG9nLT5sX3RpY2tldF90Y250KSAgJiYKKwkgICAgIVhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykpIHsKKwkJeGZzX2ZzX2Ntbl9lcnIoQ0VfV0FSTiwgbG9nLT5sX21wLAorCQkJInhsb2dfdW5hbGxvY19sb2c6IChjbnQ6ICVkLCB0b3RhbDogJWQpIiwKKwkJCWxvZy0+bF90aWNrZXRfY250LCBsb2ctPmxfdGlja2V0X3RjbnQpOworCQkvKiBBU1NFUlQobG9nLT5sX3RpY2tldF9jbnQgPT0gbG9nLT5sX3RpY2tldF90Y250KTsgKi8KKworCX0gZWxzZSB7CisJCXRpYyA9IGxvZy0+bF91bm1vdW50X2ZyZWU7CisJCXdoaWxlICh0aWMpIHsKKwkJCW5leHRfdGljID0gdGljLT50X25leHQ7CisJCQlrbWVtX2ZyZWUodGljLCBOQlBQKTsKKwkJCXRpYyA9IG5leHRfdGljOworCQl9CisJfQorCXhmc19idWZfZnJlZShsb2ctPmxfeGJ1Zik7CisjaWZkZWYgWEZTX0xPR19UUkFDRQorCWlmIChsb2ctPmxfdHJhY2UgIT0gTlVMTCkgeworCQlrdHJhY2VfZnJlZShsb2ctPmxfdHJhY2UpOworCX0KKwlpZiAobG9nLT5sX2dyYW50X3RyYWNlICE9IE5VTEwpIHsKKwkJa3RyYWNlX2ZyZWUobG9nLT5sX2dyYW50X3RyYWNlKTsKKwl9CisjZW5kaWYKKwlsb2ctPmxfbXAtPm1fbG9nID0gTlVMTDsKKwlrbWVtX2ZyZWUobG9nLCBzaXplb2YoeGxvZ190KSk7Cit9CS8qIHhsb2dfdW5hbGxvY19sb2cgKi8KKworLyoKKyAqIFVwZGF0ZSBjb3VudGVycyBhdG9taWNhbGx5IG5vdyB0aGF0IG1lbWNweSBpcyBkb25lLgorICovCisvKiBBUkdTVVNFRCAqLworc3RhdGljIGlubGluZSB2b2lkCit4bG9nX3N0YXRlX2ZpbmlzaF9jb3B5KHhsb2dfdAkJKmxvZywKKwkJICAgICAgIHhsb2dfaW5fY29yZV90CSppY2xvZywKKwkJICAgICAgIGludAkJcmVjb3JkX2NudCwKKwkJICAgICAgIGludAkJY29weV9ieXRlcykKK3sKKwlTUExERUNMKHMpOworCisJcyA9IExPR19MT0NLKGxvZyk7CisKKwlpY2xvZy0+aWNfaGVhZGVyLmhfbnVtX2xvZ29wcyArPSByZWNvcmRfY250OworCWljbG9nLT5pY19vZmZzZXQgKz0gY29weV9ieXRlczsKKworCUxPR19VTkxPQ0sobG9nLCBzKTsKK30JLyogeGxvZ19zdGF0ZV9maW5pc2hfY29weSAqLworCisKKworCisvKgorICogV3JpdGUgc29tZSByZWdpb24gb3V0IHRvIGluLWNvcmUgbG9nCisgKgorICogVGhpcyB3aWxsIGJlIGNhbGxlZCB3aGVuIHdyaXRpbmcgZXh0ZXJuYWxseSBwcm92aWRlZCByZWdpb25zIG9yIHdoZW4KKyAqIHdyaXRpbmcgb3V0IGEgY29tbWl0IHJlY29yZCBmb3IgYSBnaXZlbiB0cmFuc2FjdGlvbi4KKyAqCisgKiBHZW5lcmFsIGFsZ29yaXRobToKKyAqCTEuIEZpbmQgdG90YWwgbGVuZ3RoIG9mIHRoaXMgd3JpdGUuICBUaGlzIG1heSBpbmNsdWRlIGFkZGluZyB0byB0aGUKKyAqCQlsZW5ndGhzIHBhc3NlZCBpbi4KKyAqCTIuIENoZWNrIHdoZXRoZXIgd2UgdmlvbGF0ZSB0aGUgdGlja2V0cyByZXNlcnZhdGlvbi4KKyAqCTMuIFdoaWxlIHdyaXRpbmcgdG8gdGhpcyBpY2xvZworICoJICAgIEEuIFJlc2VydmUgYXMgbXVjaCBzcGFjZSBpbiB0aGlzIGljbG9nIGFzIGNhbiBnZXQKKyAqCSAgICBCLiBJZiB0aGlzIGlzIGZpcnN0IHdyaXRlLCBzYXZlIGF3YXkgc3RhcnQgbHNuCisgKgkgICAgQy4gV2hpbGUgd3JpdGluZyB0aGlzIHJlZ2lvbjoKKyAqCQkxLiBJZiBmaXJzdCB3cml0ZSBvZiB0cmFuc2FjdGlvbiwgd3JpdGUgc3RhcnQgcmVjb3JkCisgKgkJMi4gV3JpdGUgbG9nIG9wZXJhdGlvbiBoZWFkZXIgKGhlYWRlciBwZXIgcmVnaW9uKQorICoJCTMuIEZpbmQgb3V0IGlmIHdlIGNhbiBmaXQgZW50aXJlIHJlZ2lvbiBpbnRvIHRoaXMgaWNsb2cKKyAqCQk0LiBQb3RlbnRpYWxseSwgdmVyaWZ5IGRlc3RpbmF0aW9uIG1lbWNweSBwdHIKKyAqCQk1LiBNZW1jcHkgKHBhcnRpYWwpIHJlZ2lvbgorICoJCTYuIElmIHBhcnRpYWwgY29weSwgcmVsZWFzZSBpY2xvZzsgb3RoZXJ3aXNlLCBjb250aW51ZQorICoJCQljb3B5aW5nIG1vcmUgcmVnaW9ucyBpbnRvIGN1cnJlbnQgaWNsb2cKKyAqCTQuIE1hcmsgd2FudCBzeW5jIGJpdCAoaW4gc2ltdWxhdGlvbiBtb2RlKQorICoJNS4gUmVsZWFzZSBpY2xvZyBmb3IgcG90ZW50aWFsIGZsdXNoIHRvIG9uLWRpc2sgbG9nLgorICoKKyAqIEVSUk9SUzoKKyAqIDEuCVBhbmljIGlmIHJlc2VydmF0aW9uIGlzIG92ZXJydW4uICBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gc2luY2UKKyAqCXJlc2VydmF0aW9uIGFtb3VudHMgYXJlIGdlbmVyYXRlZCBpbnRlcm5hbCB0byB0aGUgZmlsZXN5c3RlbS4KKyAqIE5PVEVTOgorICogMS4gVGlja2V0cyBhcmUgc2luZ2xlIHRocmVhZGVkIGRhdGEgc3RydWN0dXJlcy4KKyAqIDIuIFRoZSBYTE9HX0VORF9UUkFOUyAmIFhMT0dfQ09OVElOVUVfVFJBTlMgZmxhZ3MgYXJlIHBhc3NlZCBkb3duIHRvIHRoZQorICoJc3luY2luZyByb3V0aW5lLiAgV2hlbiBhIHNpbmdsZSBsb2dfd3JpdGUgcmVnaW9uIG5lZWRzIHRvIHNwYW4KKyAqCW11bHRpcGxlIGluLWNvcmUgbG9ncywgdGhlIFhMT0dfQ09OVElOVUVfVFJBTlMgYml0IHNob3VsZCBiZSBzZXQKKyAqCW9uIGFsbCBsb2cgb3BlcmF0aW9uIHdyaXRlcyB3aGljaCBkb24ndCBjb250YWluIHRoZSBlbmQgb2YgdGhlCisgKglyZWdpb24uICBUaGUgWExPR19FTkRfVFJBTlMgYml0IGlzIHVzZWQgZm9yIHRoZSBpbi1jb3JlIGxvZworICoJb3BlcmF0aW9uIHdoaWNoIGNvbnRhaW5zIHRoZSBlbmQgb2YgdGhlIGNvbnRpbnVlZCBsb2dfd3JpdGUgcmVnaW9uLgorICogMy4gV2hlbiB4bG9nX3N0YXRlX2dldF9pY2xvZ19zcGFjZSgpIGdyYWJzIHRoZSByZXN0IG9mIHRoZSBjdXJyZW50IGljbG9nLAorICoJd2UgZG9uJ3QgcmVhbGx5IGtub3cgZXhhY3RseSBob3cgbXVjaCBzcGFjZSB3aWxsIGJlIHVzZWQuICBBcyBhIHJlc3VsdCwKKyAqCXdlIGRvbid0IHVwZGF0ZSBpY19vZmZzZXQgdW50aWwgdGhlIGVuZCB3aGVuIHdlIGtub3cgZXhhY3RseSBob3cgbWFueQorICoJYnl0ZXMgaGF2ZSBiZWVuIHdyaXR0ZW4gb3V0LgorICovCitpbnQKK3hsb2dfd3JpdGUoeGZzX21vdW50X3QgKgltcCwKKwkgICB4ZnNfbG9nX2lvdmVjX3QJcmVnW10sCisJICAgaW50CQkJbmVudHJpZXMsCisJICAgeGZzX2xvZ190aWNrZXRfdAl0aWMsCisJICAgeGZzX2xzbl90CQkqc3RhcnRfbHNuLAorCSAgIHhsb2dfaW5fY29yZV90CSoqY29tbWl0X2ljbG9nLAorCSAgIHVpbnQJCQlmbGFncykKK3sKKyAgICB4bG9nX3QJICAgICAqbG9nICAgID0gbXAtPm1fbG9nOworICAgIHhsb2dfdGlja2V0X3QgICAgKnRpY2tldCA9ICh4bG9nX3RpY2tldF90ICopdGljOworICAgIHhsb2dfb3BfaGVhZGVyX3QgKmxvZ29wX2hlYWQ7ICAgIC8qIHB0ciB0byBsb2cgb3BlcmF0aW9uIGhlYWRlciAqLworICAgIHhsb2dfaW5fY29yZV90ICAgKmljbG9nOwkgICAgIC8qIHB0ciB0byBjdXJyZW50IGluLWNvcmUgbG9nICovCisgICAgX19wc2ludF90CSAgICAgcHRyOwkgICAgIC8qIGNvcHkgYWRkcmVzcyBpbnRvIGRhdGEgcmVnaW9uICovCisgICAgaW50CQkgICAgIGxlbjsJICAgICAvKiAjIHhsb2dfd3JpdGUoKSBieXRlcyAyIHN0aWxsIGNvcHkgKi8KKyAgICBpbnQJCSAgICAgaW5kZXg7CSAgICAgLyogcmVnaW9uIGluZGV4IGN1cnJlbnRseSBjb3B5aW5nICovCisgICAgaW50CQkgICAgIGxvZ19vZmZzZXQ7ICAgICAvKiBvZmZzZXQgKGZyb20gMCkgaW50byBkYXRhIHJlZ2lvbiAqLworICAgIGludAkJICAgICBzdGFydF9yZWNfY29weTsgLyogIyBieXRlcyB0byBjb3B5IGZvciBzdGFydCByZWNvcmQgKi8KKyAgICBpbnQJCSAgICAgcGFydGlhbF9jb3B5OyAgIC8qIGRpZCB3ZSBzcGxpdCBhIHJlZ2lvbj8gKi8KKyAgICBpbnQJCSAgICAgcGFydGlhbF9jb3B5X2xlbjsvKiAjIGJ5dGVzIGNvcGllZCBpZiBzcGxpdCByZWdpb24gKi8KKyAgICBpbnQJCSAgICAgbmVlZF9jb3B5OwkgICAgIC8qICMgYnl0ZXMgbmVlZCB0byBtZW1jcHkgdGhpcyByZWdpb24gKi8KKyAgICBpbnQJCSAgICAgY29weV9sZW47CSAgICAgLyogIyBieXRlcyBhY3R1YWxseSBtZW1jcHknaW5nICovCisgICAgaW50CQkgICAgIGNvcHlfb2ZmOwkgICAgIC8qICMgYnl0ZXMgZnJvbSBlbnRyeSBzdGFydCAqLworICAgIGludAkJICAgICBjb250d3I7CSAgICAgLyogY29udGludWVkIHdyaXRlIG9mIGluLWNvcmUgbG9nPyAqLworICAgIGludAkJICAgICBlcnJvcjsKKyAgICBpbnQJCSAgICAgcmVjb3JkX2NudCA9IDAsIGRhdGFfY250ID0gMDsKKworICAgIHBhcnRpYWxfY29weV9sZW4gPSBwYXJ0aWFsX2NvcHkgPSAwOworCisgICAgLyogQ2FsY3VsYXRlIHBvdGVudGlhbCBtYXhpbXVtIHNwYWNlLiAgRWFjaCByZWdpb24gZ2V0cyBpdHMgb3duCisgICAgICogeGxvZ19vcF9oZWFkZXJfdCBhbmQgbWF5IG5lZWQgdG8gYmUgZG91YmxlIHdvcmQgYWxpZ25lZC4KKyAgICAgKi8KKyAgICBsZW4gPSAwOworICAgIGlmICh0aWNrZXQtPnRfZmxhZ3MgJiBYTE9HX1RJQ19JTklURUQpICAgICAvKiBhY2N0IGZvciBzdGFydCByZWMgb2YgeGFjdCAqLworCWxlbiArPSBzaXplb2YoeGxvZ19vcF9oZWFkZXJfdCk7CisKKyAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBuZW50cmllczsgaW5kZXgrKykgeworCWxlbiArPSBzaXplb2YoeGxvZ19vcF9oZWFkZXJfdCk7CSAgICAvKiBlYWNoIHJlZ2lvbiBnZXRzID49IDEgKi8KKwlsZW4gKz0gcmVnW2luZGV4XS5pX2xlbjsKKyAgICB9CisgICAgY29udHdyID0gKnN0YXJ0X2xzbiA9IDA7CisKKyAgICBpZiAodGlja2V0LT50X2N1cnJfcmVzIDwgbGVuKSB7CisjaWZkZWYgREVCVUcKKwl4bG9nX3BhbmljKAorCQkieGZzX2xvZ193cml0ZTogcmVzZXJ2YXRpb24gcmFuIG91dC4gTmVlZCB0byB1cCByZXNlcnZhdGlvbiIpOworI2Vsc2UKKwkvKiBDdXN0b21lciBjb25maWd1cmFibGUgcGFuaWMgKi8KKwl4ZnNfY21uX2VycihYRlNfUFRBR19MT0dSRVMsIENFX0FMRVJULCBtcCwKKwkJInhmc19sb2dfd3JpdGU6IHJlc2VydmF0aW9uIHJhbiBvdXQuIE5lZWQgdG8gdXAgcmVzZXJ2YXRpb24iKTsKKwkvKiBJZiB3ZSBkaWQgbm90IHBhbmljLCBzaHV0ZG93biB0aGUgZmlsZXN5c3RlbSAqLworCXhmc19mb3JjZV9zaHV0ZG93bihtcCwgWEZTX0NPUlJVUFRfSU5DT1JFKTsKKyNlbmRpZgorICAgIH0gZWxzZQorCXRpY2tldC0+dF9jdXJyX3JlcyAtPSBsZW47CisKKyAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBuZW50cmllczsgKSB7CisJaWYgKChlcnJvciA9IHhsb2dfc3RhdGVfZ2V0X2ljbG9nX3NwYWNlKGxvZywgbGVuLCAmaWNsb2csIHRpY2tldCwKKwkJCQkJICAgICAgICZjb250d3IsICZsb2dfb2Zmc2V0KSkpCisJCXJldHVybiAoZXJyb3IpOworCisJQVNTRVJUKGxvZ19vZmZzZXQgPD0gaWNsb2ctPmljX3NpemUgLSAxKTsKKwlwdHIgPSAoX19wc2ludF90KSAoKGNoYXIgKilpY2xvZy0+aWNfZGF0YXArbG9nX29mZnNldCk7CisKKwkvKiBzdGFydF9sc24gaXMgdGhlIGZpcnN0IGxzbiB3cml0dGVuIHRvLiBUaGF0J3MgYWxsIHdlIG5lZWQuICovCisJaWYgKCEgKnN0YXJ0X2xzbikKKwkgICAgKnN0YXJ0X2xzbiA9IElOVF9HRVQoaWNsb2ctPmljX2hlYWRlci5oX2xzbiwgQVJDSF9DT05WRVJUKTsKKworCS8qIFRoaXMgbG9vcCB3cml0ZXMgb3V0IGFzIG1hbnkgcmVnaW9ucyBhcyBjYW4gZml0IGluIHRoZSBhbW91bnQKKwkgKiBvZiBzcGFjZSB3aGljaCB3YXMgYWxsb2NhdGVkIGJ5IHhsb2dfc3RhdGVfZ2V0X2ljbG9nX3NwYWNlKCkuCisJICovCisJd2hpbGUgKGluZGV4IDwgbmVudHJpZXMpIHsKKwkgICAgQVNTRVJUKHJlZ1tpbmRleF0uaV9sZW4gJSBzaXplb2YoX19pbnQzMl90KSA9PSAwKTsKKwkgICAgQVNTRVJUKChfX3BzaW50X3QpcHRyICUgc2l6ZW9mKF9faW50MzJfdCkgPT0gMCk7CisJICAgIHN0YXJ0X3JlY19jb3B5ID0gMDsKKworCSAgICAvKiBJZiBmaXJzdCB3cml0ZSBmb3IgdHJhbnNhY3Rpb24sIGluc2VydCBzdGFydCByZWNvcmQuCisJICAgICAqIFdlIGNhbid0IGJlIHRyeWluZyB0byBjb21taXQgaWYgd2UgYXJlIGluaXRlZC4gIFdlIGNhbid0CisJICAgICAqIGhhdmUgYW55ICJwYXJ0aWFsX2NvcHkiIGlmIHdlIGFyZSBpbml0ZWQuCisJICAgICAqLworCSAgICBpZiAodGlja2V0LT50X2ZsYWdzICYgWExPR19USUNfSU5JVEVEKSB7CisJCWxvZ29wX2hlYWQJCT0gKHhsb2dfb3BfaGVhZGVyX3QgKilwdHI7CisJCUlOVF9TRVQobG9nb3BfaGVhZC0+b2hfdGlkLCBBUkNIX0NPTlZFUlQsIHRpY2tldC0+dF90aWQpOworCQlsb2dvcF9oZWFkLT5vaF9jbGllbnRpZCA9IHRpY2tldC0+dF9jbGllbnRpZDsKKwkJbG9nb3BfaGVhZC0+b2hfbGVuCT0gMDsKKwkJbG9nb3BfaGVhZC0+b2hfZmxhZ3MgICAgPSBYTE9HX1NUQVJUX1RSQU5TOworCQlsb2dvcF9oZWFkLT5vaF9yZXMyCT0gMDsKKwkJdGlja2V0LT50X2ZsYWdzCQkmPSB+WExPR19USUNfSU5JVEVEOwkvKiBjbGVhciBiaXQgKi8KKwkJcmVjb3JkX2NudCsrOworCisJCXN0YXJ0X3JlY19jb3B5ID0gc2l6ZW9mKHhsb2dfb3BfaGVhZGVyX3QpOworCQl4bG9nX3dyaXRlX2Fkdl9jbnQocHRyLCBsZW4sIGxvZ19vZmZzZXQsIHN0YXJ0X3JlY19jb3B5KTsKKwkgICAgfQorCisJICAgIC8qIENvcHkgbG9nIG9wZXJhdGlvbiBoZWFkZXIgZGlyZWN0bHkgaW50byBkYXRhIHNlY3Rpb24gKi8KKwkgICAgbG9nb3BfaGVhZAkJCT0gKHhsb2dfb3BfaGVhZGVyX3QgKilwdHI7CisJICAgIElOVF9TRVQobG9nb3BfaGVhZC0+b2hfdGlkLCBBUkNIX0NPTlZFUlQsIHRpY2tldC0+dF90aWQpOworCSAgICBsb2dvcF9oZWFkLT5vaF9jbGllbnRpZAk9IHRpY2tldC0+dF9jbGllbnRpZDsKKwkgICAgbG9nb3BfaGVhZC0+b2hfcmVzMgkJPSAwOworCisJICAgIC8qIGhlYWRlciBjb3BpZWQgZGlyZWN0bHkgKi8KKwkgICAgeGxvZ193cml0ZV9hZHZfY250KHB0ciwgbGVuLCBsb2dfb2Zmc2V0LCBzaXplb2YoeGxvZ19vcF9oZWFkZXJfdCkpOworCisJICAgIC8qIGFyZSB3ZSBjb3B5aW5nIGEgY29tbWl0IG9yIHVubW91bnQgcmVjb3JkPyAqLworCSAgICBsb2dvcF9oZWFkLT5vaF9mbGFncyA9IGZsYWdzOworCisJICAgIC8qCisJICAgICAqIFdlJ3ZlIHNlZW4gbG9ncyBjb3JydXB0ZWQgd2l0aCBiYWQgdHJhbnNhY3Rpb24gY2xpZW50CisJICAgICAqIGlkcy4gIFRoaXMgbWFrZXMgc3VyZSB0aGF0IFhGUyBkb2Vzbid0IGdlbmVyYXRlIHRoZW0gb24uCisJICAgICAqIFR1cm4gdGhpcyBpbnRvIGFuIEVJTyBhbmQgc2h1dCBkb3duIHRoZSBmaWxlc3lzdGVtLgorCSAgICAgKi8KKwkgICAgc3dpdGNoIChsb2dvcF9oZWFkLT5vaF9jbGllbnRpZCkgIHsKKwkgICAgY2FzZSBYRlNfVFJBTlNBQ1RJT046CisJICAgIGNhc2UgWEZTX1ZPTFVNRToKKwkgICAgY2FzZSBYRlNfTE9HOgorCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJeGZzX2ZzX2Ntbl9lcnIoQ0VfV0FSTiwgbXAsCisJCSAgICAiQmFkIFhGUyB0cmFuc2FjdGlvbiBjbGllbnRpZCAweCV4IGluIHRpY2tldCAweCVwIiwKKwkJICAgIGxvZ29wX2hlYWQtPm9oX2NsaWVudGlkLCB0aWMpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJICAgIH0KKworCSAgICAvKiBQYXJ0aWFsIHdyaXRlIGxhc3QgdGltZT8gPT4gKHBhcnRpYWxfY29weSAhPSAwKQorCSAgICAgKiBuZWVkX2NvcHkgaXMgdGhlIGFtb3VudCB3ZSdkIGxpa2UgdG8gY29weSBpZiBldmVyeXRoaW5nIGNvdWxkCisJICAgICAqIGZpdCBpbiB0aGUgY3VycmVudCBtZW1jcHkuCisJICAgICAqLworCSAgICBuZWVkX2NvcHkgPQlyZWdbaW5kZXhdLmlfbGVuIC0gcGFydGlhbF9jb3B5X2xlbjsKKworCSAgICBjb3B5X29mZiA9IHBhcnRpYWxfY29weV9sZW47CisJICAgIGlmIChuZWVkX2NvcHkgPD0gaWNsb2ctPmljX3NpemUgLSBsb2dfb2Zmc2V0KSB7IC8qY29tcGxldGUgd3JpdGUgKi8KKwkJSU5UX1NFVChsb2dvcF9oZWFkLT5vaF9sZW4sIEFSQ0hfQ09OVkVSVCwgY29weV9sZW4gPSBuZWVkX2NvcHkpOworCQlpZiAocGFydGlhbF9jb3B5KQorCQkgICAgbG9nb3BfaGVhZC0+b2hfZmxhZ3N8PSAoWExPR19FTkRfVFJBTlN8WExPR19XQVNfQ09OVF9UUkFOUyk7CisJCXBhcnRpYWxfY29weV9sZW4gPSBwYXJ0aWFsX2NvcHkgPSAwOworCSAgICB9IGVsc2UgewkJCQkJICAgIC8qIHBhcnRpYWwgd3JpdGUgKi8KKwkJY29weV9sZW4gPSBpY2xvZy0+aWNfc2l6ZSAtIGxvZ19vZmZzZXQ7CisJCUlOVF9TRVQobG9nb3BfaGVhZC0+b2hfbGVuLCBBUkNIX0NPTlZFUlQsIGNvcHlfbGVuKTsKKwkJbG9nb3BfaGVhZC0+b2hfZmxhZ3MgfD0gWExPR19DT05USU5VRV9UUkFOUzsKKwkJaWYgKHBhcnRpYWxfY29weSkKKwkJCWxvZ29wX2hlYWQtPm9oX2ZsYWdzIHw9IFhMT0dfV0FTX0NPTlRfVFJBTlM7CisJCXBhcnRpYWxfY29weV9sZW4gKz0gY29weV9sZW47CisJCXBhcnRpYWxfY29weSsrOworCQlsZW4gKz0gc2l6ZW9mKHhsb2dfb3BfaGVhZGVyX3QpOyAvKiBmcm9tIHNwbGl0dGluZyBvZiByZWdpb24gKi8KKwkJLyogYWNjb3VudCBmb3IgbmV3IGxvZyBvcCBoZWFkZXIgKi8KKwkJdGlja2V0LT50X2N1cnJfcmVzIC09IHNpemVvZih4bG9nX29wX2hlYWRlcl90KTsKKwkgICAgfQorCSAgICB4bG9nX3ZlcmlmeV9kZXN0X3B0cihsb2csIHB0cik7CisKKwkgICAgLyogY29weSByZWdpb24gKi8KKwkgICAgQVNTRVJUKGNvcHlfbGVuID49IDApOworCSAgICBtZW1jcHkoKHhmc19jYWRkcl90KXB0ciwgcmVnW2luZGV4XS5pX2FkZHIgKyBjb3B5X29mZiwgY29weV9sZW4pOworCSAgICB4bG9nX3dyaXRlX2Fkdl9jbnQocHRyLCBsZW4sIGxvZ19vZmZzZXQsIGNvcHlfbGVuKTsKKworCSAgICAvKiBtYWtlIGNvcHlfbGVuIHRvdGFsIGJ5dGVzIGNvcGllZCwgaW5jbHVkaW5nIGhlYWRlcnMgKi8KKwkgICAgY29weV9sZW4gKz0gc3RhcnRfcmVjX2NvcHkgKyBzaXplb2YoeGxvZ19vcF9oZWFkZXJfdCk7CisJICAgIHJlY29yZF9jbnQrKzsKKwkgICAgZGF0YV9jbnQgKz0gY29udHdyID8gY29weV9sZW4gOiAwOworCSAgICBpZiAocGFydGlhbF9jb3B5KSB7CQkJLyogY29waWVkIHBhcnRpYWwgcmVnaW9uICovCisJCSAgICAvKiBhbHJlYWR5IG1hcmtlZCBXQU5UX1NZTkMgYnkgeGxvZ19zdGF0ZV9nZXRfaWNsb2dfc3BhY2UgKi8KKwkJICAgIHhsb2dfc3RhdGVfZmluaXNoX2NvcHkobG9nLCBpY2xvZywgcmVjb3JkX2NudCwgZGF0YV9jbnQpOworCQkgICAgcmVjb3JkX2NudCA9IGRhdGFfY250ID0gMDsKKwkJICAgIGlmICgoZXJyb3IgPSB4bG9nX3N0YXRlX3JlbGVhc2VfaWNsb2cobG9nLCBpY2xvZykpKQorCQkJICAgIHJldHVybiAoZXJyb3IpOworCQkgICAgYnJlYWs7CQkJLyogZG9uJ3QgaW5jcmVtZW50IGluZGV4ICovCisJICAgIH0gZWxzZSB7CQkJCS8qIGNvcGllZCBlbnRpcmUgcmVnaW9uICovCisJCWluZGV4Kys7CisJCXBhcnRpYWxfY29weV9sZW4gPSBwYXJ0aWFsX2NvcHkgPSAwOworCisJCWlmIChpY2xvZy0+aWNfc2l6ZSAtIGxvZ19vZmZzZXQgPD0gc2l6ZW9mKHhsb2dfb3BfaGVhZGVyX3QpKSB7CisJCSAgICB4bG9nX3N0YXRlX2ZpbmlzaF9jb3B5KGxvZywgaWNsb2csIHJlY29yZF9jbnQsIGRhdGFfY250KTsKKwkJICAgIHJlY29yZF9jbnQgPSBkYXRhX2NudCA9IDA7CisJCSAgICB4bG9nX3N0YXRlX3dhbnRfc3luYyhsb2csIGljbG9nKTsKKwkJICAgIGlmIChjb21taXRfaWNsb2cpIHsKKwkJCUFTU0VSVChmbGFncyAmIFhMT0dfQ09NTUlUX1RSQU5TKTsKKwkJCSpjb21taXRfaWNsb2cgPSBpY2xvZzsKKwkJICAgIH0gZWxzZSBpZiAoKGVycm9yID0geGxvZ19zdGF0ZV9yZWxlYXNlX2ljbG9nKGxvZywgaWNsb2cpKSkKKwkJCSAgIHJldHVybiAoZXJyb3IpOworCQkgICAgaWYgKGluZGV4ID09IG5lbnRyaWVzKQorCQkJICAgIHJldHVybiAwOwkJLyogd2UgYXJlIGRvbmUgKi8KKwkJICAgIGVsc2UKKwkJCSAgICBicmVhazsKKwkJfQorCSAgICB9IC8qIGlmIChwYXJ0aWFsX2NvcHkpICovCisJfSAvKiB3aGlsZSAoaW5kZXggPCBuZW50cmllcykgKi8KKyAgICB9IC8qIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG5lbnRyaWVzOyApICovCisgICAgQVNTRVJUKGxlbiA9PSAwKTsKKworICAgIHhsb2dfc3RhdGVfZmluaXNoX2NvcHkobG9nLCBpY2xvZywgcmVjb3JkX2NudCwgZGF0YV9jbnQpOworICAgIGlmIChjb21taXRfaWNsb2cpIHsKKwlBU1NFUlQoZmxhZ3MgJiBYTE9HX0NPTU1JVF9UUkFOUyk7CisJKmNvbW1pdF9pY2xvZyA9IGljbG9nOworCXJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gKHhsb2dfc3RhdGVfcmVsZWFzZV9pY2xvZyhsb2csIGljbG9nKSk7Cit9CS8qIHhsb2dfd3JpdGUgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkJU3RhdGUgTWFjaGluZSBmdW5jdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKiBDbGVhbiBpY2xvZ3Mgc3RhcnRpbmcgZnJvbSB0aGUgaGVhZC4gIFRoaXMgb3JkZXJpbmcgbXVzdCBiZQorICogbWFpbnRhaW5lZCwgc28gYW4gaWNsb2cgZG9lc24ndCBiZWNvbWUgQUNUSVZFIGJleW9uZCBvbmUgdGhhdAorICogaXMgU1lOQ0lORy4gIFRoaXMgaXMgYWxzbyByZXF1aXJlZCB0byBtYWludGFpbiB0aGUgbm90aW9uIHRoYXQgd2UgdXNlCisgKiBhIGNvdW50aW5nIHNlbWFwaG9yZSB0byBob2xkIG9mZiB3b3VsZCBiZSB3cml0ZXJzIHRvIHRoZSBsb2cgd2hlbiBldmVyeQorICogaWNsb2cgaXMgdHJ5aW5nIHRvIHN5bmMgdG8gZGlzay4KKyAqCisgKiBTdGF0ZSBDaGFuZ2U6IERJUlRZIC0+IEFDVElWRQorICovCit2b2lkCit4bG9nX3N0YXRlX2NsZWFuX2xvZyh4bG9nX3QgKmxvZykKK3sKKwl4bG9nX2luX2NvcmVfdAkqaWNsb2c7CisJaW50IGNoYW5nZWQgPSAwOworCisJaWNsb2cgPSBsb2ctPmxfaWNsb2c7CisJZG8geworCQlpZiAoaWNsb2ctPmljX3N0YXRlID09IFhMT0dfU1RBVEVfRElSVFkpIHsKKwkJCWljbG9nLT5pY19zdGF0ZQk9IFhMT0dfU1RBVEVfQUNUSVZFOworCQkJaWNsb2ctPmljX29mZnNldCAgICAgICA9IDA7CisJCQlpY2xvZy0+aWNfY2FsbGJhY2sJPSBOVUxMOyAgIC8qIGRvbid0IG5lZWQgdG8gZnJlZSAqLworCQkJLyoKKwkJCSAqIElmIHRoZSBudW1iZXIgb2Ygb3BzIGluIHRoaXMgaWNsb2cgaW5kaWNhdGUgaXQganVzdAorCQkJICogY29udGFpbnMgdGhlIGR1bW15IHRyYW5zYWN0aW9uLCB3ZSBjYW4KKwkJCSAqIGNoYW5nZSBzdGF0ZSBpbnRvIElETEUgKHRoZSBzZWNvbmQgdGltZSBhcm91bmQpLgorCQkJICogT3RoZXJ3aXNlIHdlIHNob3VsZCBjaGFuZ2UgdGhlIHN0YXRlIGludG8KKwkJCSAqIE5FRUQgYSBkdW1teS4KKwkJCSAqIFdlIGRvbid0IG5lZWQgdG8gY292ZXIgdGhlIGR1bW15LgorCQkJICovCisJCQlpZiAoIWNoYW5nZWQgJiYKKwkJCSAgIChJTlRfR0VUKGljbG9nLT5pY19oZWFkZXIuaF9udW1fbG9nb3BzLCBBUkNIX0NPTlZFUlQpID09IFhMT0dfQ09WRVJfT1BTKSkgeworCQkJCWNoYW5nZWQgPSAxOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIFdlIGhhdmUgdHdvIGRpcnR5IGljbG9ncyBzbyBzdGFydCBvdmVyCisJCQkJICogVGhpcyBjb3VsZCBhbHNvIGJlIG51bSBvZiBvcHMgaW5kaWNhdGVzCisJCQkJICogdGhpcyBpcyBub3QgdGhlIGR1bW15IGdvaW5nIG91dC4KKwkJCQkgKi8KKwkJCQljaGFuZ2VkID0gMjsKKwkJCX0KKwkJCWljbG9nLT5pY19oZWFkZXIuaF9udW1fbG9nb3BzID0gMDsKKwkJCW1lbXNldChpY2xvZy0+aWNfaGVhZGVyLmhfY3ljbGVfZGF0YSwgMCwKKwkJCSAgICAgIHNpemVvZihpY2xvZy0+aWNfaGVhZGVyLmhfY3ljbGVfZGF0YSkpOworCQkJaWNsb2ctPmljX2hlYWRlci5oX2xzbiA9IDA7CisJCX0gZWxzZSBpZiAoaWNsb2ctPmljX3N0YXRlID09IFhMT0dfU1RBVEVfQUNUSVZFKQorCQkJLyogZG8gbm90aGluZyAqLzsKKwkJZWxzZQorCQkJYnJlYWs7CS8qIHN0b3AgY2xlYW5pbmcgKi8KKwkJaWNsb2cgPSBpY2xvZy0+aWNfbmV4dDsKKwl9IHdoaWxlIChpY2xvZyAhPSBsb2ctPmxfaWNsb2cpOworCisJLyogbG9nIGlzIGxvY2tlZCB3aGVuIHdlIGFyZSBjYWxsZWQgKi8KKwkvKgorCSAqIENoYW5nZSBzdGF0ZSBmb3IgdGhlIGR1bW15IGxvZyByZWNvcmRpbmcuCisJICogV2UgdXN1YWxseSBnbyB0byBORUVELiBCdXQgd2UgZ28gdG8gTkVFRDIgaWYgdGhlIGNoYW5nZWQgaW5kaWNhdGVzCisJICogd2UgYXJlIGRvbmUgd3JpdGluZyB0aGUgZHVtbXkgcmVjb3JkLgorCSAqIElmIHdlIGFyZSBkb25lIHdpdGggdGhlIHNlY29uZCBkdW1teSByZWNvcmVkIChET05FMiksIHRoZW4KKwkgKiB3ZSBnbyB0byBJRExFLgorCSAqLworCWlmIChjaGFuZ2VkKSB7CisJCXN3aXRjaCAobG9nLT5sX2NvdmVyZWRfc3RhdGUpIHsKKwkJY2FzZSBYTE9HX1NUQVRFX0NPVkVSX0lETEU6CisJCWNhc2UgWExPR19TVEFURV9DT1ZFUl9ORUVEOgorCQljYXNlIFhMT0dfU1RBVEVfQ09WRVJfTkVFRDI6CisJCQlsb2ctPmxfY292ZXJlZF9zdGF0ZSA9IFhMT0dfU1RBVEVfQ09WRVJfTkVFRDsKKwkJCWJyZWFrOworCisJCWNhc2UgWExPR19TVEFURV9DT1ZFUl9ET05FOgorCQkJaWYgKGNoYW5nZWQgPT0gMSkKKwkJCQlsb2ctPmxfY292ZXJlZF9zdGF0ZSA9IFhMT0dfU1RBVEVfQ09WRVJfTkVFRDI7CisJCQllbHNlCisJCQkJbG9nLT5sX2NvdmVyZWRfc3RhdGUgPSBYTE9HX1NUQVRFX0NPVkVSX05FRUQ7CisJCQlicmVhazsKKworCQljYXNlIFhMT0dfU1RBVEVfQ09WRVJfRE9ORTI6CisJCQlpZiAoY2hhbmdlZCA9PSAxKQorCQkJCWxvZy0+bF9jb3ZlcmVkX3N0YXRlID0gWExPR19TVEFURV9DT1ZFUl9JRExFOworCQkJZWxzZQorCQkJCWxvZy0+bF9jb3ZlcmVkX3N0YXRlID0gWExPR19TVEFURV9DT1ZFUl9ORUVEOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCUFTU0VSVCgwKTsKKwkJfQorCX0KK30JLyogeGxvZ19zdGF0ZV9jbGVhbl9sb2cgKi8KKworU1RBVElDIHhmc19sc25fdAoreGxvZ19nZXRfbG93ZXN0X2xzbigKKwl4bG9nX3QJCSpsb2cpCit7CisJeGxvZ19pbl9jb3JlX3QgICpsc25fbG9nOworCXhmc19sc25fdAlsb3dlc3RfbHNuLCBsc247CisKKwlsc25fbG9nID0gbG9nLT5sX2ljbG9nOworCWxvd2VzdF9sc24gPSAwOworCWRvIHsKKwkgICAgaWYgKCEobHNuX2xvZy0+aWNfc3RhdGUgJiAoWExPR19TVEFURV9BQ1RJVkV8WExPR19TVEFURV9ESVJUWSkpKSB7CisJCWxzbiA9IElOVF9HRVQobHNuX2xvZy0+aWNfaGVhZGVyLmhfbHNuLCBBUkNIX0NPTlZFUlQpOworCQlpZiAoKGxzbiAmJiAhbG93ZXN0X2xzbikgfHwKKwkJICAgIChYRlNfTFNOX0NNUChsc24sIGxvd2VzdF9sc24pIDwgMCkpIHsKKwkJCWxvd2VzdF9sc24gPSBsc247CisJCX0KKwkgICAgfQorCSAgICBsc25fbG9nID0gbHNuX2xvZy0+aWNfbmV4dDsKKwl9IHdoaWxlIChsc25fbG9nICE9IGxvZy0+bF9pY2xvZyk7CisJcmV0dXJuKGxvd2VzdF9sc24pOworfQorCisKK1NUQVRJQyB2b2lkCit4bG9nX3N0YXRlX2RvX2NhbGxiYWNrKAorCXhsb2dfdAkJKmxvZywKKwlpbnQJCWFib3J0ZWQsCisJeGxvZ19pbl9jb3JlX3QJKmNpY2xvZykKK3sKKwl4bG9nX2luX2NvcmVfdAkgICAqaWNsb2c7CisJeGxvZ19pbl9jb3JlX3QJICAgKmZpcnN0X2ljbG9nOwkvKiB1c2VkIHRvIGtub3cgd2hlbiB3ZSd2ZQorCQkJCQkJICogcHJvY2Vzc2VkIGFsbCBpY2xvZ3Mgb25jZSAqLworCXhmc19sb2dfY2FsbGJhY2tfdCAqY2IsICpjYl9uZXh0OworCWludAkJICAgZmx1c2hjbnQgPSAwOworCXhmc19sc25fdAkgICBsb3dlc3RfbHNuOworCWludAkJICAgaW9lcnJvcnM7CS8qIGNvdW50ZXI6IGljbG9ncyB3aXRoIGVycm9ycyAqLworCWludAkJICAgbG9vcGRpZGNhbGxiYWNrczsgLyogZmxhZzogaW5uZXIgbG9vcCBkaWQgY2FsbGJhY2tzKi8KKwlpbnQJCSAgIGZ1bmNkaWRjYWxsYmFja3M7IC8qIGZsYWc6IGZ1bmN0aW9uIGRpZCBjYWxsYmFja3MgKi8KKwlpbnQJCSAgIHJlcGVhdHM7CS8qIGZvciBpc3N1aW5nIGNvbnNvbGUgd2FybmluZ3MgaWYKKwkJCQkJICogbG9vcGluZyB0b28gbWFueSB0aW1lcyAqLworCVNQTERFQ0wocyk7CisKKwlzID0gTE9HX0xPQ0sobG9nKTsKKwlmaXJzdF9pY2xvZyA9IGljbG9nID0gbG9nLT5sX2ljbG9nOworCWlvZXJyb3JzID0gMDsKKwlmdW5jZGlkY2FsbGJhY2tzID0gMDsKKwlyZXBlYXRzID0gMDsKKworCWRvIHsKKwkJLyoKKwkJICogU2NhbiBhbGwgaWNsb2dzIHN0YXJ0aW5nIHdpdGggdGhlIG9uZSBwb2ludGVkIHRvIGJ5IHRoZQorCQkgKiBsb2cuICBSZXNldCB0aGlzIHN0YXJ0aW5nIHBvaW50IGVhY2ggdGltZSB0aGUgbG9nIGlzCisJCSAqIHVubG9ja2VkIChkdXJpbmcgY2FsbGJhY2tzKS4KKwkJICoKKwkJICogS2VlcCBsb29waW5nIHRocm91Z2ggaWNsb2dzIHVudGlsIG9uZSBmdWxsIHBhc3MgaXMgbWFkZQorCQkgKiB3aXRob3V0IHJ1bm5pbmcgYW55IGNhbGxiYWNrcy4KKwkJICovCisJCWZpcnN0X2ljbG9nID0gbG9nLT5sX2ljbG9nOworCQlpY2xvZyA9IGxvZy0+bF9pY2xvZzsKKwkJbG9vcGRpZGNhbGxiYWNrcyA9IDA7CisJCXJlcGVhdHMrKzsKKworCQlkbyB7CisKKwkJCS8qIHNraXAgYWxsIGljbG9ncyBpbiB0aGUgQUNUSVZFICYgRElSVFkgc3RhdGVzICovCisJCQlpZiAoaWNsb2ctPmljX3N0YXRlICYKKwkJCSAgICAoWExPR19TVEFURV9BQ1RJVkV8WExPR19TVEFURV9ESVJUWSkpIHsKKwkJCQlpY2xvZyA9IGljbG9nLT5pY19uZXh0OworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKgorCQkJICogQmV0d2VlbiBtYXJraW5nIGEgZmlsZXN5c3RlbSBTSFVURE9XTiBhbmQgc3RvcHBpbmcKKwkJCSAqIHRoZSBsb2csIHdlIGRvIGZsdXNoIGFsbCBpY2xvZ3MgdG8gZGlzayAoaWYgdGhlcmUKKwkJCSAqIHdhc24ndCBhIGxvZyBJL08gZXJyb3IpLiBTbywgd2UgZG8gd2FudCB0aGluZ3MgdG8KKwkJCSAqIGdvIHNtb290aGx5IGluIGNhc2Ugb2YganVzdCBhIFNIVVRET1dOICB3L28gYQorCQkJICogTE9HX0lPX0VSUk9SLgorCQkJICovCisJCQlpZiAoIShpY2xvZy0+aWNfc3RhdGUgJiBYTE9HX1NUQVRFX0lPRVJST1IpKSB7CisJCQkJLyoKKwkJCQkgKiBDYW4gb25seSBwZXJmb3JtIGNhbGxiYWNrcyBpbiBvcmRlci4gIFNpbmNlCisJCQkJICogdGhpcyBpY2xvZyBpcyBub3QgaW4gdGhlIERPTkVfU1lOQy8KKwkJCQkgKiBET19DQUxMQkFDSyBzdGF0ZSwgd2Ugc2tpcCB0aGUgcmVzdCBhbmQKKwkJCQkgKiBqdXN0IHRyeSB0byBjbGVhbiB1cC4gIElmIHdlIHNldCBvdXIgaWNsb2cKKwkJCQkgKiB0byBET19DQUxMQkFDSywgd2Ugd2lsbCBub3QgcHJvY2VzcyBpdCB3aGVuCisJCQkJICogd2UgcmV0cnkgc2luY2UgYSBwcmV2aW91cyBpY2xvZyBpcyBpbiB0aGUKKwkJCQkgKiBDQUxMQkFDSyBhbmQgdGhlIHN0YXRlIGNhbm5vdCBjaGFuZ2Ugc2luY2UKKwkJCQkgKiB3ZSBhcmUgaG9sZGluZyB0aGUgTE9HX0xPQ0suCisJCQkJICovCisJCQkJaWYgKCEoaWNsb2ctPmljX3N0YXRlICYKKwkJCQkJKFhMT0dfU1RBVEVfRE9ORV9TWU5DIHwKKwkJCQkJCSBYTE9HX1NUQVRFX0RPX0NBTExCQUNLKSkpIHsKKwkJCQkJaWYgKGNpY2xvZyAmJiAoY2ljbG9nLT5pY19zdGF0ZSA9PQorCQkJCQkJCVhMT0dfU1RBVEVfRE9ORV9TWU5DKSkgeworCQkJCQkJY2ljbG9nLT5pY19zdGF0ZSA9IFhMT0dfU1RBVEVfRE9fQ0FMTEJBQ0s7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCS8qCisJCQkJICogV2Ugbm93IGhhdmUgYW4gaWNsb2cgdGhhdCBpcyBpbiBlaXRoZXIgdGhlCisJCQkJICogRE9fQ0FMTEJBQ0sgb3IgRE9ORV9TWU5DIHN0YXRlcy4gVGhlIG90aGVyCisJCQkJICogc3RhdGVzIChXQU5UX1NZTkMsIFNZTkNJTkcsIG9yIENBTExCQUNLIHdlcmUKKwkJCQkgKiBjYXVnaHQgYnkgdGhlIGFib3ZlIGlmIGFuZCBhcmUgZ29pbmcgdG8KKwkJCQkgKiBjbGVhbiAoaS5lLiB3ZSBhcmVuJ3QgZG9pbmcgdGhlaXIgY2FsbGJhY2tzKQorCQkJCSAqIHNlZSB0aGUgYWJvdmUgaWYuCisJCQkJICovCisKKwkJCQkvKgorCQkJCSAqIFdlIHdpbGwgZG8gb25lIG1vcmUgY2hlY2sgaGVyZSB0byBzZWUgaWYgd2UKKwkJCQkgKiBoYXZlIGNoYXNlZCBvdXIgdGFpbCBhcm91bmQuCisJCQkJICovCisKKwkJCQlsb3dlc3RfbHNuID0geGxvZ19nZXRfbG93ZXN0X2xzbihsb2cpOworCQkJCWlmIChsb3dlc3RfbHNuICYmICgKKwkJCQkJWEZTX0xTTl9DTVAoCisJCQkJCQlsb3dlc3RfbHNuLAorCQkJCQkJSU5UX0dFVChpY2xvZy0+aWNfaGVhZGVyLmhfbHNuLCBBUkNIX0NPTlZFUlQpCisJCQkJCSk8MCkpIHsKKwkJCQkJaWNsb2cgPSBpY2xvZy0+aWNfbmV4dDsKKwkJCQkJY29udGludWU7IC8qIExlYXZlIHRoaXMgaWNsb2cgZm9yCisJCQkJCQkgICAqIGFub3RoZXIgdGhyZWFkICovCisJCQkJfQorCisJCQkJaWNsb2ctPmljX3N0YXRlID0gWExPR19TVEFURV9DQUxMQkFDSzsKKworCQkJCUxPR19VTkxPQ0sobG9nLCBzKTsKKworCQkJCS8qIGxfbGFzdF9zeW5jX2xzbiBmaWVsZCBwcm90ZWN0ZWQgYnkKKwkJCQkgKiBHUkFOVF9MT0NLLiBEb24ndCB3b3JyeSBhYm91dCBpY2xvZydzIGxzbi4KKwkJCQkgKiBObyBvbmUgZWxzZSBjYW4gYmUgaGVyZSBleGNlcHQgdXMuCisJCQkJICovCisJCQkJcyA9IEdSQU5UX0xPQ0sobG9nKTsKKwkJCQlBU1NFUlQoWEZTX0xTTl9DTVAoCisJCQkJCQlsb2ctPmxfbGFzdF9zeW5jX2xzbiwKKwkJCQkJCUlOVF9HRVQoaWNsb2ctPmljX2hlYWRlci5oX2xzbiwgQVJDSF9DT05WRVJUKQorCQkJCQkpPD0wKTsKKwkJCQlsb2ctPmxfbGFzdF9zeW5jX2xzbiA9IElOVF9HRVQoaWNsb2ctPmljX2hlYWRlci5oX2xzbiwgQVJDSF9DT05WRVJUKTsKKwkJCQlHUkFOVF9VTkxPQ0sobG9nLCBzKTsKKworCQkJCS8qCisJCQkJICogS2VlcCBwcm9jZXNzaW5nIGVudHJpZXMgaW4gdGhlIGNhbGxiYWNrIGxpc3QKKwkJCQkgKiB1bnRpbCB3ZSBjb21lIGFyb3VuZCBhbmQgaXQgaXMgZW1wdHkuICBXZQorCQkJCSAqIG5lZWQgdG8gYXRvbWljYWxseSBzZWUgdGhhdCB0aGUgbGlzdCBpcworCQkJCSAqIGVtcHR5IGFuZCBjaGFuZ2UgdGhlIHN0YXRlIHRvIERJUlRZIHNvIHRoYXQKKwkJCQkgKiB3ZSBkb24ndCBtaXNzIGFueSBtb3JlIGNhbGxiYWNrcyBiZWluZyBhZGRlZC4KKwkJCQkgKi8KKwkJCQlzID0gTE9HX0xPQ0sobG9nKTsKKwkJCX0gZWxzZSB7CisJCQkJaW9lcnJvcnMrKzsKKwkJCX0KKwkJCWNiID0gaWNsb2ctPmljX2NhbGxiYWNrOworCisJCQl3aGlsZSAoY2IgIT0gMCkgeworCQkJCWljbG9nLT5pY19jYWxsYmFja190YWlsID0gJihpY2xvZy0+aWNfY2FsbGJhY2spOworCQkJCWljbG9nLT5pY19jYWxsYmFjayA9IE5VTEw7CisJCQkJTE9HX1VOTE9DSyhsb2csIHMpOworCisJCQkJLyogcGVyZm9ybSBjYWxsYmFja3MgaW4gdGhlIG9yZGVyIGdpdmVuICovCisJCQkJZm9yICg7IGNiICE9IDA7IGNiID0gY2JfbmV4dCkgeworCQkJCQljYl9uZXh0ID0gY2ItPmNiX25leHQ7CisJCQkJCWNiLT5jYl9mdW5jKGNiLT5jYl9hcmcsIGFib3J0ZWQpOworCQkJCX0KKwkJCQlzID0gTE9HX0xPQ0sobG9nKTsKKwkJCQljYiA9IGljbG9nLT5pY19jYWxsYmFjazsKKwkJCX0KKworCQkJbG9vcGRpZGNhbGxiYWNrcysrOworCQkJZnVuY2RpZGNhbGxiYWNrcysrOworCisJCQlBU1NFUlQoaWNsb2ctPmljX2NhbGxiYWNrID09IDApOworCQkJaWYgKCEoaWNsb2ctPmljX3N0YXRlICYgWExPR19TVEFURV9JT0VSUk9SKSkKKwkJCQlpY2xvZy0+aWNfc3RhdGUgPSBYTE9HX1NUQVRFX0RJUlRZOworCisJCQkvKgorCQkJICogVHJhbnNpdGlvbiBmcm9tIERJUlRZIHRvIEFDVElWRSBpZiBhcHBsaWNhYmxlLgorCQkJICogTk9QIGlmIFNUQVRFX0lPRVJST1IuCisJCQkgKi8KKwkJCXhsb2dfc3RhdGVfY2xlYW5fbG9nKGxvZyk7CisKKwkJCS8qIHdha2UgdXAgdGhyZWFkcyB3YWl0aW5nIGluIHhmc19sb2dfZm9yY2UoKSAqLworCQkJc3ZfYnJvYWRjYXN0KCZpY2xvZy0+aWNfZm9yY2VzZW1hKTsKKworCQkJaWNsb2cgPSBpY2xvZy0+aWNfbmV4dDsKKwkJfSB3aGlsZSAoZmlyc3RfaWNsb2cgIT0gaWNsb2cpOworCQlpZiAocmVwZWF0cyAmJiAocmVwZWF0cyAlIDEwKSA9PSAwKSB7CisJCQl4ZnNfZnNfY21uX2VycihDRV9XQVJOLCBsb2ctPmxfbXAsCisJCQkJInhsb2dfc3RhdGVfZG9fY2FsbGJhY2s6IGxvb3BpbmcgJWQiLCByZXBlYXRzKTsKKwkJfQorCX0gd2hpbGUgKCFpb2Vycm9ycyAmJiBsb29wZGlkY2FsbGJhY2tzKTsKKworCS8qCisJICogbWFrZSBvbmUgbGFzdCBnYXNwIGF0dGVtcHQgdG8gc2VlIGlmIGljbG9ncyBhcmUgYmVpbmcgbGVmdCBpbgorCSAqIGxpbWJvLi4KKwkgKi8KKyNpZmRlZiBERUJVRworCWlmIChmdW5jZGlkY2FsbGJhY2tzKSB7CisJCWZpcnN0X2ljbG9nID0gaWNsb2cgPSBsb2ctPmxfaWNsb2c7CisJCWRvIHsKKwkJCUFTU0VSVChpY2xvZy0+aWNfc3RhdGUgIT0gWExPR19TVEFURV9ET19DQUxMQkFDSyk7CisJCQkvKgorCQkJICogVGVybWluYXRlIHRoZSBsb29wIGlmIGljbG9ncyBhcmUgZm91bmQgaW4gc3RhdGVzCisJCQkgKiB3aGljaCB3aWxsIGNhdXNlIG90aGVyIHRocmVhZHMgdG8gY2xlYW4gdXAgaWNsb2dzLgorCQkJICoKKwkJCSAqIFNZTkNJTkcgLSBpL28gY29tcGxldGlvbiB3aWxsIGdvIHRocm91Z2ggbG9ncworCQkJICogRE9ORV9TWU5DIC0gaW50ZXJydXB0IHRocmVhZCBzaG91bGQgYmUgd2FpdGluZyBmb3IKKwkJCSAqICAgICAgICAgICAgICBMT0dfTE9DSworCQkJICogSU9FUlJPUiAtIGdpdmUgdXAgaG9wZSBhbGwgeWUgd2hvIGVudGVyIGhlcmUKKwkJCSAqLworCQkJaWYgKGljbG9nLT5pY19zdGF0ZSA9PSBYTE9HX1NUQVRFX1dBTlRfU1lOQyB8fAorCQkJICAgIGljbG9nLT5pY19zdGF0ZSA9PSBYTE9HX1NUQVRFX1NZTkNJTkcgfHwKKwkJCSAgICBpY2xvZy0+aWNfc3RhdGUgPT0gWExPR19TVEFURV9ET05FX1NZTkMgfHwKKwkJCSAgICBpY2xvZy0+aWNfc3RhdGUgPT0gWExPR19TVEFURV9JT0VSUk9SICkKKwkJCQlicmVhazsKKwkJCWljbG9nID0gaWNsb2ctPmljX25leHQ7CisJCX0gd2hpbGUgKGZpcnN0X2ljbG9nICE9IGljbG9nKTsKKwl9CisjZW5kaWYKKworCWlmIChsb2ctPmxfaWNsb2ctPmljX3N0YXRlICYgKFhMT0dfU1RBVEVfQUNUSVZFfFhMT0dfU1RBVEVfSU9FUlJPUikpIHsKKwkJZmx1c2hjbnQgPSBsb2ctPmxfZmx1c2hjbnQ7CisJCWxvZy0+bF9mbHVzaGNudCA9IDA7CisJfQorCUxPR19VTkxPQ0sobG9nLCBzKTsKKwl3aGlsZSAoZmx1c2hjbnQtLSkKKwkJdnNlbWEoJmxvZy0+bF9mbHVzaHNlbWEpOworfQkvKiB4bG9nX3N0YXRlX2RvX2NhbGxiYWNrICovCisKKworLyoKKyAqIEZpbmlzaCB0cmFuc2l0aW9uaW5nIHRoaXMgaWNsb2cgdG8gdGhlIGRpcnR5IHN0YXRlLgorICoKKyAqIE1ha2Ugc3VyZSB0aGF0IHdlIGNvbXBsZXRlbHkgZXhlY3V0ZSB0aGlzIHJvdXRpbmUgb25seSB3aGVuIHRoaXMgaXMKKyAqIHRoZSBsYXN0IGNhbGwgdG8gdGhlIGljbG9nLiAgVGhlcmUgaXMgYSBnb29kIGNoYW5jZSB0aGF0IGljbG9nIGZsdXNoZXMsCisgKiB3aGVuIHdlIHJlYWNoIHRoZSBlbmQgb2YgdGhlIHBoeXNpY2FsIGxvZywgZ2V0IHR1cm5lZCBpbnRvIDIgc2VwYXJhdGUKKyAqIGNhbGxzIHRvIGJ3cml0ZS4gIEhlbmNlLCBvbmUgaWNsb2cgZmx1c2ggY291bGQgZ2VuZXJhdGUgdHdvIGNhbGxzIHRvIHRoaXMKKyAqIHJvdXRpbmUuICBCeSB1c2luZyB0aGUgcmVmZXJlbmNlIGNvdW50IGJ3cml0ZWNudCwgd2UgZ3VhcmFudGVlIHRoYXQgb25seQorICogdGhlIHNlY29uZCBjb21wbGV0aW9uIGdvZXMgdGhyb3VnaC4KKyAqCisgKiBDYWxsYmFja3MgY291bGQgdGFrZSB0aW1lLCBzbyB0aGV5IGFyZSBkb25lIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoZQorICogZ2xvYmFsIHN0YXRlIG1hY2hpbmUgbG9nIGxvY2suICBBc3N1bWUgdGhhdCB0aGUgY2FsbHMgdG8gY3ZzZW1hIHdvbid0CisgKiB0YWtlIGEgbG9uZyB0aW1lLiAgQXQgbGVhc3Qgd2Uga25vdyBpdCB3b24ndCBzbGVlcC4KKyAqLwordm9pZAoreGxvZ19zdGF0ZV9kb25lX3N5bmNpbmcoCisJeGxvZ19pbl9jb3JlX3QJKmljbG9nLAorCWludAkJYWJvcnRlZCkKK3sKKwl4bG9nX3QJCSAgICpsb2cgPSBpY2xvZy0+aWNfbG9nOworCVNQTERFQ0wocyk7CisKKwlzID0gTE9HX0xPQ0sobG9nKTsKKworCUFTU0VSVChpY2xvZy0+aWNfc3RhdGUgPT0gWExPR19TVEFURV9TWU5DSU5HIHx8CisJICAgICAgIGljbG9nLT5pY19zdGF0ZSA9PSBYTE9HX1NUQVRFX0lPRVJST1IpOworCUFTU0VSVChpY2xvZy0+aWNfcmVmY250ID09IDApOworCUFTU0VSVChpY2xvZy0+aWNfYndyaXRlY250ID09IDEgfHwgaWNsb2ctPmljX2J3cml0ZWNudCA9PSAyKTsKKworCisJLyoKKwkgKiBJZiB3ZSBnb3QgYW4gZXJyb3IsIGVpdGhlciBvbiB0aGUgZmlyc3QgYnVmZmVyLCBvciBpbiB0aGUgY2FzZSBvZgorCSAqIHNwbGl0IGxvZyB3cml0ZXMsIG9uIHRoZSBzZWNvbmQsIHdlIG1hcmsgQUxMIGljbG9ncyBTVEFURV9JT0VSUk9SLAorCSAqIGFuZCBub25lIHNob3VsZCBldmVyIGJlIGF0dGVtcHRlZCB0byBiZSB3cml0dGVuIHRvIGRpc2sKKwkgKiBhZ2Fpbi4KKwkgKi8KKwlpZiAoaWNsb2ctPmljX3N0YXRlICE9IFhMT0dfU1RBVEVfSU9FUlJPUikgeworCQlpZiAoLS1pY2xvZy0+aWNfYndyaXRlY250ID09IDEpIHsKKwkJCUxPR19VTkxPQ0sobG9nLCBzKTsKKwkJCXJldHVybjsKKwkJfQorCQlpY2xvZy0+aWNfc3RhdGUgPSBYTE9HX1NUQVRFX0RPTkVfU1lOQzsKKwl9CisKKwkvKgorCSAqIFNvbWVvbmUgY291bGQgYmUgc2xlZXBpbmcgcHJpb3IgdG8gd3JpdGluZyBvdXQgdGhlIG5leHQKKwkgKiBpY2xvZyBidWZmZXIsIHdlIHdha2UgdGhlbSBhbGwsIG9uZSB3aWxsIGdldCB0byBkbyB0aGUKKwkgKiBJL08sIHRoZSBvdGhlcnMgZ2V0IHRvIHdhaXQgZm9yIHRoZSByZXN1bHQuCisJICovCisJc3ZfYnJvYWRjYXN0KCZpY2xvZy0+aWNfd3JpdGVzZW1hKTsKKwlMT0dfVU5MT0NLKGxvZywgcyk7CisJeGxvZ19zdGF0ZV9kb19jYWxsYmFjayhsb2csIGFib3J0ZWQsIGljbG9nKTsJLyogYWxzbyBjbGVhbnMgbG9nICovCit9CS8qIHhsb2dfc3RhdGVfZG9uZV9zeW5jaW5nICovCisKKworLyoKKyAqIElmIHRoZSBoZWFkIG9mIHRoZSBpbi1jb3JlIGxvZyByaW5nIGlzIG5vdCAoQUNUSVZFIG9yIERJUlRZKSwgdGhlbiB3ZSBtdXN0CisgKiBzbGVlcC4gIFRoZSBmbHVzaCBzZW1hcGhvcmUgaXMgc2V0IHRvIHRoZSBudW1iZXIgb2YgaW4tY29yZSBidWZmZXJzIGFuZAorICogZGVjcmVtZW50ZWQgYXJvdW5kIGRpc2sgc3luY2luZy4gIFRoZXJlZm9yZSwgaWYgYWxsIGJ1ZmZlcnMgYXJlIHN5bmNpbmcsCisgKiB0aGlzIHNlbWFwaG9yZSB3aWxsIGNhdXNlIG5ldyB3cml0ZXMgdG8gc2xlZXAgdW50aWwgYSBzeW5jIGNvbXBsZXRlcy4KKyAqIE90aGVyd2lzZSwgdGhpcyBjb2RlIGp1c3QgZG9lcyBwKCkgZm9sbG93ZWQgYnkgdigpLiAgVGhpcyBhcHByb3hpbWF0ZXMKKyAqIGEgc2xlZXAvd2FrZXVwIGV4Y2VwdCB3ZSBjYW4ndCByYWNlLgorICoKKyAqIFRoZSBpbi1jb3JlIGxvZ3MgYXJlIHVzZWQgaW4gYSBjaXJjdWxhciBmYXNoaW9uLiBUaGV5IGFyZSBub3QgdXNlZAorICogb3V0LW9mLW9yZGVyIGV2ZW4gd2hlbiBhbiBpY2xvZyBwYXN0IHRoZSBoZWFkIGlzIGZyZWUuCisgKgorICogcmV0dXJuOgorICoJKiBsb2dfb2Zmc2V0IHdoZXJlIHhsb2dfd3JpdGUoKSBjYW4gc3RhcnQgd3JpdGluZyBpbnRvIHRoZSBpbi1jb3JlCisgKgkJbG9nJ3MgZGF0YSBzcGFjZS4KKyAqCSogaW4tY29yZSBsb2cgcG9pbnRlciB0byB3aGljaCB4bG9nX3dyaXRlKCkgc2hvdWxkIHdyaXRlLgorICoJKiBib29sZWFuIGluZGljYXRpbmcgdGhpcyBpcyBhIGNvbnRpbnVlZCB3cml0ZSB0byBhbiBpbi1jb3JlIGxvZy4KKyAqCQlJZiB0aGlzIGlzIHRoZSBsYXN0IHdyaXRlLCB0aGVuIHRoZSBpbi1jb3JlIGxvZydzIG9mZnNldCBmaWVsZAorICoJCW5lZWRzIHRvIGJlIGluY3JlbWVudGVkLCBkZXBlbmRpbmcgb24gdGhlIGFtb3VudCBvZiBkYXRhIHdoaWNoCisgKgkJaXMgY29waWVkLgorICovCitpbnQKK3hsb2dfc3RhdGVfZ2V0X2ljbG9nX3NwYWNlKHhsb2dfdAkgICpsb2csCisJCQkgICBpbnQJCSAgbGVuLAorCQkJICAgeGxvZ19pbl9jb3JlX3QgKippY2xvZ3AsCisJCQkgICB4bG9nX3RpY2tldF90ICAqdGlja2V0LAorCQkJICAgaW50CQkgICpjb250aW51ZWRfd3JpdGUsCisJCQkgICBpbnQJCSAgKmxvZ29mZnNldHApCit7CisJU1BMREVDTChzKTsKKwlpbnQJCSAgbG9nX29mZnNldDsKKwl4bG9nX3JlY19oZWFkZXJfdCAqaGVhZDsKKwl4bG9nX2luX2NvcmVfdAkgICppY2xvZzsKKwlpbnQJCSAgZXJyb3I7CisKK3Jlc3RhcnQ6CisJcyA9IExPR19MT0NLKGxvZyk7CisJaWYgKFhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykpIHsKKwkJTE9HX1VOTE9DSyhsb2csIHMpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJfQorCisJaWNsb2cgPSBsb2ctPmxfaWNsb2c7CisJaWYgKCEgKGljbG9nLT5pY19zdGF0ZSA9PSBYTE9HX1NUQVRFX0FDVElWRSkpIHsKKwkJbG9nLT5sX2ZsdXNoY250Kys7CisJCUxPR19VTkxPQ0sobG9nLCBzKTsKKwkJeGxvZ190cmFjZV9pY2xvZyhpY2xvZywgWExPR19UUkFDRV9TTEVFUF9GTFVTSCk7CisJCVhGU19TVEFUU19JTkMoeHNfbG9nX25vaWNsb2dzKTsKKwkJLyogRW5zdXJlIHRoYXQgbG9nIHdyaXRlcyBoYXBwZW4gKi8KKwkJcHNlbWEoJmxvZy0+bF9mbHVzaHNlbWEsIFBJTk9EKTsKKwkJZ290byByZXN0YXJ0OworCX0KKwlBU1NFUlQoaWNsb2ctPmljX3N0YXRlID09IFhMT0dfU1RBVEVfQUNUSVZFKTsKKwloZWFkID0gJmljbG9nLT5pY19oZWFkZXI7CisKKwlpY2xvZy0+aWNfcmVmY250Kys7CQkJLyogcHJldmVudHMgc3luYyAqLworCWxvZ19vZmZzZXQgPSBpY2xvZy0+aWNfb2Zmc2V0OworCisJLyogT24gdGhlIDFzdCB3cml0ZSB0byBhbiBpY2xvZywgZmlndXJlIG91dCBsc24uICBUaGlzIHdvcmtzCisJICogaWYgaWNsb2dzIG1hcmtlZCBYTE9HX1NUQVRFX1dBTlRfU1lOQyBhbHdheXMgd3JpdGUgb3V0IHdoYXQgdGhleSBhcmUKKwkgKiBjb21taXR0aW5nIHRvLiAgSWYgdGhlIG9mZnNldCBpcyBzZXQsIHRoYXQncyBob3cgbWFueSBibG9ja3MKKwkgKiBtdXN0IGJlIHdyaXR0ZW4uCisJICovCisJaWYgKGxvZ19vZmZzZXQgPT0gMCkgeworCQl0aWNrZXQtPnRfY3Vycl9yZXMgLT0gbG9nLT5sX2ljbG9nX2hzaXplOworCQlJTlRfU0VUKGhlYWQtPmhfY3ljbGUsIEFSQ0hfQ09OVkVSVCwgbG9nLT5sX2N1cnJfY3ljbGUpOworCQlBU1NJR05fTFNOKGhlYWQtPmhfbHNuLCBsb2cpOworCQlBU1NFUlQobG9nLT5sX2N1cnJfYmxvY2sgPj0gMCk7CisJfQorCisJLyogSWYgdGhlcmUgaXMgZW5vdWdoIHJvb20gdG8gd3JpdGUgZXZlcnl0aGluZywgdGhlbiBkbyBpdC4gIE90aGVyd2lzZSwKKwkgKiBjbGFpbSB0aGUgcmVzdCBvZiB0aGUgcmVnaW9uIGFuZCBtYWtlIHN1cmUgdGhlIFhMT0dfU1RBVEVfV0FOVF9TWU5DCisJICogYml0IGlzIG9uLCBzbyB0aGlzIHdpbGwgZ2V0IGZsdXNoZWQgb3V0LiAgRG9uJ3QgdXBkYXRlIGljX29mZnNldAorCSAqIHVudGlsIHlvdSBrbm93IGV4YWN0bHkgaG93IG1hbnkgYnl0ZXMgZ2V0IGNvcGllZC4gIFRoZXJlZm9yZSwgd2FpdAorCSAqIHVudGlsIGxhdGVyIHRvIHVwZGF0ZSBpY19vZmZzZXQuCisJICoKKwkgKiB4bG9nX3dyaXRlKCkgYWxnb3JpdGhtIGFzc3VtZXMgdGhhdCBhdCBsZWFzdCAyIHhsb2dfb3BfaGVhZGVyX3QncworCSAqIGNhbiBmaXQgaW50byByZW1haW5pbmcgZGF0YSBzZWN0aW9uLgorCSAqLworCWlmIChpY2xvZy0+aWNfc2l6ZSAtIGljbG9nLT5pY19vZmZzZXQgPCAyKnNpemVvZih4bG9nX29wX2hlYWRlcl90KSkgeworCQl4bG9nX3N0YXRlX3N3aXRjaF9pY2xvZ3MobG9nLCBpY2xvZywgaWNsb2ctPmljX3NpemUpOworCisJCS8qIElmIEknbSB0aGUgb25seSBvbmUgd3JpdGluZyB0byB0aGlzIGljbG9nLCBzeW5jIGl0IHRvIGRpc2sgKi8KKwkJaWYgKGljbG9nLT5pY19yZWZjbnQgPT0gMSkgeworCQkJTE9HX1VOTE9DSyhsb2csIHMpOworCQkJaWYgKChlcnJvciA9IHhsb2dfc3RhdGVfcmVsZWFzZV9pY2xvZyhsb2csIGljbG9nKSkpCisJCQkJcmV0dXJuIChlcnJvcik7CisJCX0gZWxzZSB7CisJCQlpY2xvZy0+aWNfcmVmY250LS07CisJCQlMT0dfVU5MT0NLKGxvZywgcyk7CisJCX0KKwkJZ290byByZXN0YXJ0OworCX0KKworCS8qIERvIHdlIGhhdmUgZW5vdWdoIHJvb20gdG8gd3JpdGUgdGhlIGZ1bGwgYW1vdW50IGluIHRoZSByZW1haW5kZXIKKwkgKiBvZiB0aGlzIGljbG9nPyAgT3IgbXVzdCB3ZSBjb250aW51ZSBhIHdyaXRlIG9uIHRoZSBuZXh0IGljbG9nIGFuZAorCSAqIG1hcmsgdGhpcyBpY2xvZyBhcyBjb21wbGV0ZWx5IHRha2VuPyAgSW4gdGhlIGNhc2Ugd2hlcmUgd2Ugc3dpdGNoCisJICogaWNsb2dzICh0byBtYXJrIGl0IHRha2VuKSwgdGhpcyBwYXJ0aWN1bGFyIGljbG9nIHdpbGwgcmVsZWFzZS9zeW5jCisJICogdG8gZGlzayBpbiB4bG9nX3dyaXRlKCkuCisJICovCisJaWYgKGxlbiA8PSBpY2xvZy0+aWNfc2l6ZSAtIGljbG9nLT5pY19vZmZzZXQpIHsKKwkJKmNvbnRpbnVlZF93cml0ZSA9IDA7CisJCWljbG9nLT5pY19vZmZzZXQgKz0gbGVuOworCX0gZWxzZSB7CisJCSpjb250aW51ZWRfd3JpdGUgPSAxOworCQl4bG9nX3N0YXRlX3N3aXRjaF9pY2xvZ3MobG9nLCBpY2xvZywgaWNsb2ctPmljX3NpemUpOworCX0KKwkqaWNsb2dwID0gaWNsb2c7CisKKwlBU1NFUlQoaWNsb2ctPmljX29mZnNldCA8PSBpY2xvZy0+aWNfc2l6ZSk7CisJTE9HX1VOTE9DSyhsb2csIHMpOworCisJKmxvZ29mZnNldHAgPSBsb2dfb2Zmc2V0OworCXJldHVybiAwOworfQkvKiB4bG9nX3N0YXRlX2dldF9pY2xvZ19zcGFjZSAqLworCisvKgorICogQXRvbWljYWxseSBnZXQgdGhlIGxvZyBzcGFjZSByZXF1aXJlZCBmb3IgYSBsb2cgdGlja2V0LgorICoKKyAqIE9uY2UgYSB0aWNrZXQgZ2V0cyBwdXQgb250byB0aGUgcmVzZXJ2ZXEsIGl0IHdpbGwgb25seSByZXR1cm4gYWZ0ZXIKKyAqIHRoZSBuZWVkZWQgcmVzZXJ2YXRpb24gaXMgc2F0aXNmaWVkLgorICovCitTVEFUSUMgaW50Cit4bG9nX2dyYW50X2xvZ19zcGFjZSh4bG9nX3QJICAgKmxvZywKKwkJICAgICB4bG9nX3RpY2tldF90ICp0aWMpCit7CisJaW50CQkgZnJlZV9ieXRlczsKKwlpbnQJCSBuZWVkX2J5dGVzOworCVNQTERFQ0wocyk7CisjaWZkZWYgREVCVUcKKwl4ZnNfbHNuX3QJIHRhaWxfbHNuOworI2VuZGlmCisKKworI2lmZGVmIERFQlVHCisJaWYgKGxvZy0+bF9mbGFncyAmIFhMT0dfQUNUSVZFX1JFQ09WRVJZKQorCQlwYW5pYygiZ3JhbnQgUmVjb3ZlcnkgcHJvYmxlbSIpOworI2VuZGlmCisKKwkvKiBJcyB0aGVyZSBzcGFjZSBvciBkbyB3ZSBuZWVkIHRvIHNsZWVwPyAqLworCXMgPSBHUkFOVF9MT0NLKGxvZyk7CisJeGxvZ190cmFjZV9sb2dncmFudChsb2csIHRpYywgInhsb2dfZ3JhbnRfbG9nX3NwYWNlOiBlbnRlciIpOworCisJLyogc29tZXRoaW5nIGlzIGFscmVhZHkgc2xlZXBpbmc7IGluc2VydCBuZXcgdHJhbnNhY3Rpb24gYXQgZW5kICovCisJaWYgKGxvZy0+bF9yZXNlcnZlX2hlYWRxKSB7CisJCVhMT0dfSU5TX1RJQ0tFVFEobG9nLT5sX3Jlc2VydmVfaGVhZHEsIHRpYyk7CisJCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLCB0aWMsCisJCQkJICAgICJ4bG9nX2dyYW50X2xvZ19zcGFjZTogc2xlZXAgMSIpOworCQkvKgorCQkgKiBHb3R0YSBjaGVjayB0aGlzIGJlZm9yZSBnb2luZyB0byBzbGVlcCwgd2hpbGUgd2UncmUKKwkJICogaG9sZGluZyB0aGUgZ3JhbnQgbG9jay4KKwkJICovCisJCWlmIChYTE9HX0ZPUkNFRF9TSFVURE9XTihsb2cpKQorCQkJZ290byBlcnJvcl9yZXR1cm47CisKKwkJWEZTX1NUQVRTX0lOQyh4c19zbGVlcF9sb2dzcGFjZSk7CisJCXN2X3dhaXQoJnRpYy0+dF9zZW1hLCBQSU5PRHxQTFRXQUlULCAmbG9nLT5sX2dyYW50X2xvY2ssIHMpOworCQkvKgorCQkgKiBJZiB3ZSBnb3QgYW4gZXJyb3IsIGFuZCB0aGUgZmlsZXN5c3RlbSBpcyBzaHV0dGluZyBkb3duLAorCQkgKiB3ZSdsbCBjYXRjaCBpdCBkb3duIGJlbG93LiBTbyBqdXN0IGNvbnRpbnVlLi4uCisJCSAqLworCQl4bG9nX3RyYWNlX2xvZ2dyYW50KGxvZywgdGljLAorCQkJCSAgICAieGxvZ19ncmFudF9sb2dfc3BhY2U6IHdha2UgMSIpOworCQlzID0gR1JBTlRfTE9DSyhsb2cpOworCX0KKwlpZiAodGljLT50X2ZsYWdzICYgWEZTX0xPR19QRVJNX1JFU0VSVikKKwkJbmVlZF9ieXRlcyA9IHRpYy0+dF91bml0X3Jlcyp0aWMtPnRfb2NudDsKKwllbHNlCisJCW5lZWRfYnl0ZXMgPSB0aWMtPnRfdW5pdF9yZXM7CisKK3JlZG86CisJaWYgKFhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCisJZnJlZV9ieXRlcyA9IHhsb2dfc3BhY2VfbGVmdChsb2csIGxvZy0+bF9ncmFudF9yZXNlcnZlX2N5Y2xlLAorCQkJCSAgICAgbG9nLT5sX2dyYW50X3Jlc2VydmVfYnl0ZXMpOworCWlmIChmcmVlX2J5dGVzIDwgbmVlZF9ieXRlcykgeworCQlpZiAoKHRpYy0+dF9mbGFncyAmIFhMT0dfVElDX0lOX1EpID09IDApCisJCQlYTE9HX0lOU19USUNLRVRRKGxvZy0+bF9yZXNlcnZlX2hlYWRxLCB0aWMpOworCQl4bG9nX3RyYWNlX2xvZ2dyYW50KGxvZywgdGljLAorCQkJCSAgICAieGxvZ19ncmFudF9sb2dfc3BhY2U6IHNsZWVwIDIiKTsKKwkJWEZTX1NUQVRTX0lOQyh4c19zbGVlcF9sb2dzcGFjZSk7CisJCXN2X3dhaXQoJnRpYy0+dF9zZW1hLCBQSU5PRHxQTFRXQUlULCAmbG9nLT5sX2dyYW50X2xvY2ssIHMpOworCisJCWlmIChYTE9HX0ZPUkNFRF9TSFVURE9XTihsb2cpKSB7CisJCQlzID0gR1JBTlRfTE9DSyhsb2cpOworCQkJZ290byBlcnJvcl9yZXR1cm47CisJCX0KKworCQl4bG9nX3RyYWNlX2xvZ2dyYW50KGxvZywgdGljLAorCQkJCSAgICAieGxvZ19ncmFudF9sb2dfc3BhY2U6IHdha2UgMiIpOworCQl4bG9nX2dyYW50X3B1c2hfYWlsKGxvZy0+bF9tcCwgbmVlZF9ieXRlcyk7CisJCXMgPSBHUkFOVF9MT0NLKGxvZyk7CisJCWdvdG8gcmVkbzsKKwl9IGVsc2UgaWYgKHRpYy0+dF9mbGFncyAmIFhMT0dfVElDX0lOX1EpCisJCVhMT0dfREVMX1RJQ0tFVFEobG9nLT5sX3Jlc2VydmVfaGVhZHEsIHRpYyk7CisKKwkvKiB3ZSd2ZSBnb3QgZW5vdWdoIHNwYWNlICovCisJWExPR19HUkFOVF9BRERfU1BBQ0UobG9nLCBuZWVkX2J5dGVzLCAndycpOworCVhMT0dfR1JBTlRfQUREX1NQQUNFKGxvZywgbmVlZF9ieXRlcywgJ3InKTsKKyNpZmRlZiBERUJVRworCXRhaWxfbHNuID0gbG9nLT5sX3RhaWxfbHNuOworCS8qCisJICogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBncmFudCB3cml0ZSBoZWFkIGRpZG4ndCBqdXN0IG92ZXIgbGFwIHRoZQorCSAqIHRhaWwuICBJZiB0aGUgY3ljbGVzIGFyZSB0aGUgc2FtZSwgd2UgY2FuJ3QgYmUgb3ZlcmxhcHBpbmcuCisJICogT3RoZXJ3aXNlLCBtYWtlIHN1cmUgdGhhdCB0aGUgY3ljbGVzIGRpZmZlciBieSBleGFjdGx5IG9uZSBhbmQKKwkgKiBjaGVjayB0aGUgYnl0ZSBjb3VudC4KKwkgKi8KKwlpZiAoQ1lDTEVfTFNOKHRhaWxfbHNuKSAhPSBsb2ctPmxfZ3JhbnRfd3JpdGVfY3ljbGUpIHsKKwkJQVNTRVJUKGxvZy0+bF9ncmFudF93cml0ZV9jeWNsZS0xID09IENZQ0xFX0xTTih0YWlsX2xzbikpOworCQlBU1NFUlQobG9nLT5sX2dyYW50X3dyaXRlX2J5dGVzIDw9IEJCVE9CKEJMT0NLX0xTTih0YWlsX2xzbikpKTsKKwl9CisjZW5kaWYKKwl4bG9nX3RyYWNlX2xvZ2dyYW50KGxvZywgdGljLCAieGxvZ19ncmFudF9sb2dfc3BhY2U6IGV4aXQiKTsKKwl4bG9nX3ZlcmlmeV9ncmFudF9oZWFkKGxvZywgMSk7CisJR1JBTlRfVU5MT0NLKGxvZywgcyk7CisJcmV0dXJuIDA7CisKKyBlcnJvcl9yZXR1cm46CisJaWYgKHRpYy0+dF9mbGFncyAmIFhMT0dfVElDX0lOX1EpCisJCVhMT0dfREVMX1RJQ0tFVFEobG9nLT5sX3Jlc2VydmVfaGVhZHEsIHRpYyk7CisJeGxvZ190cmFjZV9sb2dncmFudChsb2csIHRpYywgInhsb2dfZ3JhbnRfbG9nX3NwYWNlOiBlcnJfcmV0Iik7CisJLyoKKwkgKiBJZiB3ZSBhcmUgZmFpbGluZywgbWFrZSBzdXJlIHRoZSB0aWNrZXQgZG9lc24ndCBoYXZlIGFueQorCSAqIGN1cnJlbnQgcmVzZXJ2YXRpb25zLiBXZSBkb24ndCB3YW50IHRvIGFkZCB0aGlzIGJhY2sgd2hlbgorCSAqIHRoZSB0aWNrZXQvdHJhbnNhY3Rpb24gZ2V0cyBjYW5jZWxsZWQuCisJICovCisJdGljLT50X2N1cnJfcmVzID0gMDsKKwl0aWMtPnRfY250ID0gMDsgLyogdW5ncmFudCB3aWxsIGdpdmUgYmFjayB1bml0X3JlcyAqIHRfY250LiAqLworCUdSQU5UX1VOTE9DSyhsb2csIHMpOworCXJldHVybiBYRlNfRVJST1IoRUlPKTsKK30JLyogeGxvZ19ncmFudF9sb2dfc3BhY2UgKi8KKworCisvKgorICogUmVwbGVuaXNoIHRoZSBieXRlIHJlc2VydmF0aW9uIHJlcXVpcmVkIGJ5IG1vdmluZyB0aGUgZ3JhbnQgd3JpdGUgaGVhZC4KKyAqCisgKgorICovCitTVEFUSUMgaW50Cit4bG9nX3JlZ3JhbnRfd3JpdGVfbG9nX3NwYWNlKHhsb2dfdAkgICAqbG9nLAorCQkJICAgICB4bG9nX3RpY2tldF90ICp0aWMpCit7CisJU1BMREVDTChzKTsKKwlpbnQJCWZyZWVfYnl0ZXMsIG5lZWRfYnl0ZXM7CisJeGxvZ190aWNrZXRfdAkqbnRpYzsKKyNpZmRlZiBERUJVRworCXhmc19sc25fdAl0YWlsX2xzbjsKKyNlbmRpZgorCisJdGljLT50X2N1cnJfcmVzID0gdGljLT50X3VuaXRfcmVzOworCisJaWYgKHRpYy0+dF9jbnQgPiAwKQorCQlyZXR1cm4gKDApOworCisjaWZkZWYgREVCVUcKKwlpZiAobG9nLT5sX2ZsYWdzICYgWExPR19BQ1RJVkVfUkVDT1ZFUlkpCisJCXBhbmljKCJyZWdyYW50IFJlY292ZXJ5IHByb2JsZW0iKTsKKyNlbmRpZgorCisJcyA9IEdSQU5UX0xPQ0sobG9nKTsKKwl4bG9nX3RyYWNlX2xvZ2dyYW50KGxvZywgdGljLCAieGxvZ19yZWdyYW50X3dyaXRlX2xvZ19zcGFjZTogZW50ZXIiKTsKKworCWlmIChYTE9HX0ZPUkNFRF9TSFVURE9XTihsb2cpKQorCQlnb3RvIGVycm9yX3JldHVybjsKKworCS8qIElmIHRoZXJlIGFyZSBvdGhlciB3YWl0ZXJzIG9uIHRoZSBxdWV1ZSB0aGVuIGdpdmUgdGhlbSBhCisJICogY2hhbmNlIGF0IGxvZ3NwYWNlIGJlZm9yZSB1cy4gV2FrZSB1cCB0aGUgZmlyc3Qgd2FpdGVycywKKwkgKiBpZiB3ZSBkbyBub3Qgd2FrZSB1cCBhbGwgdGhlIHdhaXRlcnMgdGhlbiBnbyB0byBzbGVlcCB3YWl0aW5nCisJICogZm9yIG1vcmUgZnJlZSBzcGFjZSwgb3RoZXJ3aXNlIHRyeSB0byBnZXQgc29tZSBzcGFjZSBmb3IKKwkgKiB0aGlzIHRyYW5zYWN0aW9uLgorCSAqLworCisJaWYgKChudGljID0gbG9nLT5sX3dyaXRlX2hlYWRxKSkgeworCQlmcmVlX2J5dGVzID0geGxvZ19zcGFjZV9sZWZ0KGxvZywgbG9nLT5sX2dyYW50X3dyaXRlX2N5Y2xlLAorCQkJCQkgICAgIGxvZy0+bF9ncmFudF93cml0ZV9ieXRlcyk7CisJCWRvIHsKKwkJCUFTU0VSVChudGljLT50X2ZsYWdzICYgWExPR19USUNfUEVSTV9SRVNFUlYpOworCisJCQlpZiAoZnJlZV9ieXRlcyA8IG50aWMtPnRfdW5pdF9yZXMpCisJCQkJYnJlYWs7CisJCQlmcmVlX2J5dGVzIC09IG50aWMtPnRfdW5pdF9yZXM7CisJCQlzdl9zaWduYWwoJm50aWMtPnRfc2VtYSk7CisJCQludGljID0gbnRpYy0+dF9uZXh0OworCQl9IHdoaWxlIChudGljICE9IGxvZy0+bF93cml0ZV9oZWFkcSk7CisKKwkJaWYgKG50aWMgIT0gbG9nLT5sX3dyaXRlX2hlYWRxKSB7CisJCQlpZiAoKHRpYy0+dF9mbGFncyAmIFhMT0dfVElDX0lOX1EpID09IDApCisJCQkJWExPR19JTlNfVElDS0VUUShsb2ctPmxfd3JpdGVfaGVhZHEsIHRpYyk7CisKKwkJCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLCB0aWMsCisJCQkJICAgICJ4bG9nX3JlZ3JhbnRfd3JpdGVfbG9nX3NwYWNlOiBzbGVlcCAxIik7CisJCQlYRlNfU1RBVFNfSU5DKHhzX3NsZWVwX2xvZ3NwYWNlKTsKKwkJCXN2X3dhaXQoJnRpYy0+dF9zZW1hLCBQSU5PRHxQTFRXQUlULAorCQkJCSZsb2ctPmxfZ3JhbnRfbG9jaywgcyk7CisKKwkJCS8qIElmIHdlJ3JlIHNodXR0aW5nIGRvd24sIHRoaXMgdGljIGlzIGFscmVhZHkKKwkJCSAqIG9mZiB0aGUgcXVldWUgKi8KKwkJCWlmIChYTE9HX0ZPUkNFRF9TSFVURE9XTihsb2cpKSB7CisJCQkJcyA9IEdSQU5UX0xPQ0sobG9nKTsKKwkJCQlnb3RvIGVycm9yX3JldHVybjsKKwkJCX0KKworCQkJeGxvZ190cmFjZV9sb2dncmFudChsb2csIHRpYywKKwkJCQkgICAgInhsb2dfcmVncmFudF93cml0ZV9sb2dfc3BhY2U6IHdha2UgMSIpOworCQkJeGxvZ19ncmFudF9wdXNoX2FpbChsb2ctPmxfbXAsIHRpYy0+dF91bml0X3Jlcyk7CisJCQlzID0gR1JBTlRfTE9DSyhsb2cpOworCQl9CisJfQorCisJbmVlZF9ieXRlcyA9IHRpYy0+dF91bml0X3JlczsKKworcmVkbzoKKwlpZiAoWExPR19GT1JDRURfU0hVVERPV04obG9nKSkKKwkJZ290byBlcnJvcl9yZXR1cm47CisKKwlmcmVlX2J5dGVzID0geGxvZ19zcGFjZV9sZWZ0KGxvZywgbG9nLT5sX2dyYW50X3dyaXRlX2N5Y2xlLAorCQkJCSAgICAgbG9nLT5sX2dyYW50X3dyaXRlX2J5dGVzKTsKKwlpZiAoZnJlZV9ieXRlcyA8IG5lZWRfYnl0ZXMpIHsKKwkJaWYgKCh0aWMtPnRfZmxhZ3MgJiBYTE9HX1RJQ19JTl9RKSA9PSAwKQorCQkJWExPR19JTlNfVElDS0VUUShsb2ctPmxfd3JpdGVfaGVhZHEsIHRpYyk7CisJCVhGU19TVEFUU19JTkMoeHNfc2xlZXBfbG9nc3BhY2UpOworCQlzdl93YWl0KCZ0aWMtPnRfc2VtYSwgUElOT0R8UExUV0FJVCwgJmxvZy0+bF9ncmFudF9sb2NrLCBzKTsKKworCQkvKiBJZiB3ZSdyZSBzaHV0dGluZyBkb3duLCB0aGlzIHRpYyBpcyBhbHJlYWR5IG9mZiB0aGUgcXVldWUgKi8KKwkJaWYgKFhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykpIHsKKwkJCXMgPSBHUkFOVF9MT0NLKGxvZyk7CisJCQlnb3RvIGVycm9yX3JldHVybjsKKwkJfQorCisJCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLCB0aWMsCisJCQkJICAgICJ4bG9nX3JlZ3JhbnRfd3JpdGVfbG9nX3NwYWNlOiB3YWtlIDIiKTsKKwkJeGxvZ19ncmFudF9wdXNoX2FpbChsb2ctPmxfbXAsIG5lZWRfYnl0ZXMpOworCQlzID0gR1JBTlRfTE9DSyhsb2cpOworCQlnb3RvIHJlZG87CisJfSBlbHNlIGlmICh0aWMtPnRfZmxhZ3MgJiBYTE9HX1RJQ19JTl9RKQorCQlYTE9HX0RFTF9USUNLRVRRKGxvZy0+bF93cml0ZV9oZWFkcSwgdGljKTsKKworCVhMT0dfR1JBTlRfQUREX1NQQUNFKGxvZywgbmVlZF9ieXRlcywgJ3cnKTsgLyogd2UndmUgZ290IGVub3VnaCBzcGFjZSAqLworI2lmZGVmIERFQlVHCisJdGFpbF9sc24gPSBsb2ctPmxfdGFpbF9sc247CisJaWYgKENZQ0xFX0xTTih0YWlsX2xzbikgIT0gbG9nLT5sX2dyYW50X3dyaXRlX2N5Y2xlKSB7CisJCUFTU0VSVChsb2ctPmxfZ3JhbnRfd3JpdGVfY3ljbGUtMSA9PSBDWUNMRV9MU04odGFpbF9sc24pKTsKKwkJQVNTRVJUKGxvZy0+bF9ncmFudF93cml0ZV9ieXRlcyA8PSBCQlRPQihCTE9DS19MU04odGFpbF9sc24pKSk7CisJfQorI2VuZGlmCisKKwl4bG9nX3RyYWNlX2xvZ2dyYW50KGxvZywgdGljLCAieGxvZ19yZWdyYW50X3dyaXRlX2xvZ19zcGFjZTogZXhpdCIpOworCXhsb2dfdmVyaWZ5X2dyYW50X2hlYWQobG9nLCAxKTsKKwlHUkFOVF9VTkxPQ0sobG9nLCBzKTsKKwlyZXR1cm4gKDApOworCisKKyBlcnJvcl9yZXR1cm46CisJaWYgKHRpYy0+dF9mbGFncyAmIFhMT0dfVElDX0lOX1EpCisJCVhMT0dfREVMX1RJQ0tFVFEobG9nLT5sX3Jlc2VydmVfaGVhZHEsIHRpYyk7CisJeGxvZ190cmFjZV9sb2dncmFudChsb2csIHRpYywgInhsb2dfcmVncmFudF93cml0ZV9sb2dfc3BhY2U6IGVycl9yZXQiKTsKKwkvKgorCSAqIElmIHdlIGFyZSBmYWlsaW5nLCBtYWtlIHN1cmUgdGhlIHRpY2tldCBkb2Vzbid0IGhhdmUgYW55CisJICogY3VycmVudCByZXNlcnZhdGlvbnMuIFdlIGRvbid0IHdhbnQgdG8gYWRkIHRoaXMgYmFjayB3aGVuCisJICogdGhlIHRpY2tldC90cmFuc2FjdGlvbiBnZXRzIGNhbmNlbGxlZC4KKwkgKi8KKwl0aWMtPnRfY3Vycl9yZXMgPSAwOworCXRpYy0+dF9jbnQgPSAwOyAvKiB1bmdyYW50IHdpbGwgZ2l2ZSBiYWNrIHVuaXRfcmVzICogdF9jbnQuICovCisJR1JBTlRfVU5MT0NLKGxvZywgcyk7CisJcmV0dXJuIFhGU19FUlJPUihFSU8pOworfQkvKiB4bG9nX3JlZ3JhbnRfd3JpdGVfbG9nX3NwYWNlICovCisKKworLyogVGhlIGZpcnN0IGNudC0xIHRpbWVzIHRocm91Z2ggaGVyZSB3ZSBkb24ndCBuZWVkIHRvCisgKiBtb3ZlIHRoZSBncmFudCB3cml0ZSBoZWFkIGJlY2F1c2UgdGhlIHBlcm1hbmVudAorICogcmVzZXJ2YXRpb24gaGFzIHJlc2VydmVkIGNudCB0aW1lcyB0aGUgdW5pdCBhbW91bnQuCisgKiBSZWxlYXNlIHBhcnQgb2YgY3VycmVudCBwZXJtYW5lbnQgdW5pdCByZXNlcnZhdGlvbiBhbmQKKyAqIHJlc2V0IGN1cnJlbnQgcmVzZXJ2YXRpb24gdG8gYmUgb25lIHVuaXRzIHdvcnRoLiAgQWxzbworICogbW92ZSBncmFudCByZXNlcnZhdGlvbiBoZWFkIGZvcndhcmQuCisgKi8KK1NUQVRJQyB2b2lkCit4bG9nX3JlZ3JhbnRfcmVzZXJ2ZV9sb2dfc3BhY2UoeGxvZ190CSAgICAgKmxvZywKKwkJCSAgICAgICB4bG9nX3RpY2tldF90ICp0aWNrZXQpCit7CisJU1BMREVDTChzKTsKKworCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLCB0aWNrZXQsCisJCQkgICAgInhsb2dfcmVncmFudF9yZXNlcnZlX2xvZ19zcGFjZTogZW50ZXIiKTsKKwlpZiAodGlja2V0LT50X2NudCA+IDApCisJCXRpY2tldC0+dF9jbnQtLTsKKworCXMgPSBHUkFOVF9MT0NLKGxvZyk7CisJWExPR19HUkFOVF9TVUJfU1BBQ0UobG9nLCB0aWNrZXQtPnRfY3Vycl9yZXMsICd3Jyk7CisJWExPR19HUkFOVF9TVUJfU1BBQ0UobG9nLCB0aWNrZXQtPnRfY3Vycl9yZXMsICdyJyk7CisJdGlja2V0LT50X2N1cnJfcmVzID0gdGlja2V0LT50X3VuaXRfcmVzOworCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLCB0aWNrZXQsCisJCQkgICAgInhsb2dfcmVncmFudF9yZXNlcnZlX2xvZ19zcGFjZTogc3ViIGN1cnJlbnQgcmVzIik7CisJeGxvZ192ZXJpZnlfZ3JhbnRfaGVhZChsb2csIDEpOworCisJLyoganVzdCByZXR1cm4gaWYgd2Ugc3RpbGwgaGF2ZSBzb21lIG9mIHRoZSBwcmUtcmVzZXJ2ZWQgc3BhY2UgKi8KKwlpZiAodGlja2V0LT50X2NudCA+IDApIHsKKwkJR1JBTlRfVU5MT0NLKGxvZywgcyk7CisJCXJldHVybjsKKwl9CisKKwlYTE9HX0dSQU5UX0FERF9TUEFDRShsb2csIHRpY2tldC0+dF91bml0X3JlcywgJ3InKTsKKwl4bG9nX3RyYWNlX2xvZ2dyYW50KGxvZywgdGlja2V0LAorCQkJICAgICJ4bG9nX3JlZ3JhbnRfcmVzZXJ2ZV9sb2dfc3BhY2U6IGV4aXQiKTsKKwl4bG9nX3ZlcmlmeV9ncmFudF9oZWFkKGxvZywgMCk7CisJR1JBTlRfVU5MT0NLKGxvZywgcyk7CisJdGlja2V0LT50X2N1cnJfcmVzID0gdGlja2V0LT50X3VuaXRfcmVzOworfQkvKiB4bG9nX3JlZ3JhbnRfcmVzZXJ2ZV9sb2dfc3BhY2UgKi8KKworCisvKgorICogR2l2ZSBiYWNrIHRoZSBzcGFjZSBsZWZ0IGZyb20gYSByZXNlcnZhdGlvbi4KKyAqCisgKiBBbGwgdGhlIGluZm9ybWF0aW9uIHdlIG5lZWQgdG8gbWFrZSBhIGNvcnJlY3QgZGV0ZXJtaW5hdGlvbiBvZiBzcGFjZSBsZWZ0CisgKiBpcyBwcmVzZW50LiAgRm9yIG5vbi1wZXJtYW5lbnQgcmVzZXJ2YXRpb25zLCB0aGluZ3MgYXJlIHF1aXRlIGVhc3kuICBUaGUKKyAqIGNvdW50IHNob3VsZCBoYXZlIGJlZW4gZGVjcmVtZW50ZWQgdG8gemVyby4gIFdlIG9ubHkgbmVlZCB0byBkZWFsIHdpdGggdGhlCisgKiBzcGFjZSByZW1haW5pbmcgaW4gdGhlIGN1cnJlbnQgcmVzZXJ2YXRpb24gcGFydCBvZiB0aGUgdGlja2V0LiAgSWYgdGhlCisgKiB0aWNrZXQgY29udGFpbnMgYSBwZXJtYW5lbnQgcmVzZXJ2YXRpb24sIHRoZXJlIG1heSBiZSBsZWZ0IG92ZXIgc3BhY2Ugd2hpY2gKKyAqIG5lZWRzIHRvIGJlIHJlbGVhc2VkLiAgQSBjb3VudCBvZiBOIG1lYW5zIHRoYXQgTi0xIHJlZmlsbHMgb2YgdGhlIGN1cnJlbnQKKyAqIHJlc2VydmF0aW9uIGNhbiBiZSBkb25lIGJlZm9yZSB3ZSBuZWVkIHRvIGFzayBmb3IgbW9yZSBzcGFjZS4gIFRoZSBmaXJzdAorICogb25lIGdvZXMgdG8gZmlsbCB1cCB0aGUgZmlyc3QgY3VycmVudCByZXNlcnZhdGlvbi4gIE9uY2Ugd2UgcnVuIG91dCBvZgorICogc3BhY2UsIHRoZSBjb3VudCB3aWxsIHN0YXkgYXQgemVybyBhbmQgdGhlIG9ubHkgc3BhY2UgcmVtYWluaW5nIHdpbGwgYmUKKyAqIGluIHRoZSBjdXJyZW50IHJlc2VydmF0aW9uIGZpZWxkLgorICovCitTVEFUSUMgdm9pZAoreGxvZ191bmdyYW50X2xvZ19zcGFjZSh4bG9nX3QJICAgICAqbG9nLAorCQkgICAgICAgeGxvZ190aWNrZXRfdCAqdGlja2V0KQoreworCVNQTERFQ0wocyk7CisKKwlpZiAodGlja2V0LT50X2NudCA+IDApCisJCXRpY2tldC0+dF9jbnQtLTsKKworCXMgPSBHUkFOVF9MT0NLKGxvZyk7CisJeGxvZ190cmFjZV9sb2dncmFudChsb2csIHRpY2tldCwgInhsb2dfdW5ncmFudF9sb2dfc3BhY2U6IGVudGVyIik7CisKKwlYTE9HX0dSQU5UX1NVQl9TUEFDRShsb2csIHRpY2tldC0+dF9jdXJyX3JlcywgJ3cnKTsKKwlYTE9HX0dSQU5UX1NVQl9TUEFDRShsb2csIHRpY2tldC0+dF9jdXJyX3JlcywgJ3InKTsKKworCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLCB0aWNrZXQsICJ4bG9nX3VuZ3JhbnRfbG9nX3NwYWNlOiBzdWIgY3VycmVudCIpOworCisJLyogSWYgdGhpcyBpcyBhIHBlcm1hbmVudCByZXNlcnZhdGlvbiB0aWNrZXQsIHdlIG1heSBiZSBhYmxlIHRvIGZyZWUKKwkgKiB1cCBtb3JlIHNwYWNlIGJhc2VkIG9uIHRoZSByZW1haW5pbmcgY291bnQuCisJICovCisJaWYgKHRpY2tldC0+dF9jbnQgPiAwKSB7CisJCUFTU0VSVCh0aWNrZXQtPnRfZmxhZ3MgJiBYTE9HX1RJQ19QRVJNX1JFU0VSVik7CisJCVhMT0dfR1JBTlRfU1VCX1NQQUNFKGxvZywgdGlja2V0LT50X3VuaXRfcmVzKnRpY2tldC0+dF9jbnQsJ3cnKTsKKwkJWExPR19HUkFOVF9TVUJfU1BBQ0UobG9nLCB0aWNrZXQtPnRfdW5pdF9yZXMqdGlja2V0LT50X2NudCwncicpOworCX0KKworCXhsb2dfdHJhY2VfbG9nZ3JhbnQobG9nLCB0aWNrZXQsICJ4bG9nX3VuZ3JhbnRfbG9nX3NwYWNlOiBleGl0Iik7CisJeGxvZ192ZXJpZnlfZ3JhbnRfaGVhZChsb2csIDEpOworCUdSQU5UX1VOTE9DSyhsb2csIHMpOworCXhmc19sb2dfbW92ZV90YWlsKGxvZy0+bF9tcCwgMSk7Cit9CS8qIHhsb2dfdW5ncmFudF9sb2dfc3BhY2UgKi8KKworCisvKgorICogQXRvbWljYWxseSBwdXQgYmFjayB1c2VkIHRpY2tldC4KKyAqLwordm9pZAoreGxvZ19zdGF0ZV9wdXRfdGlja2V0KHhsb2dfdAkgICAgKmxvZywKKwkJICAgICAgeGxvZ190aWNrZXRfdCAqdGljKQoreworCXVuc2lnbmVkIGxvbmcgczsKKworCXMgPSBMT0dfTE9DSyhsb2cpOworCXhsb2dfdGlja2V0X3B1dChsb2csIHRpYyk7CisJTE9HX1VOTE9DSyhsb2csIHMpOworfQkvKiB4bG9nX3N0YXRlX3B1dF90aWNrZXQgKi8KKworLyoKKyAqIEZsdXNoIGljbG9nIHRvIGRpc2sgaWYgdGhpcyBpcyB0aGUgbGFzdCByZWZlcmVuY2UgdG8gdGhlIGdpdmVuIGljbG9nIGFuZAorICogdGhlIFdBTlRfU1lOQyBiaXQgaXMgc2V0LgorICoKKyAqIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBlbnRlcmVkLCB0aGUgaWNsb2cgaXMgbm90IG5lY2Vzc2FyaWx5IGluIHRoZQorICogV0FOVF9TWU5DIHN0YXRlLiAgSXQgbWF5IGJlIHNpdHRpbmcgYXJvdW5kIHdhaXRpbmcgdG8gZ2V0IGZpbGxlZC4KKyAqCisgKgorICovCitpbnQKK3hsb2dfc3RhdGVfcmVsZWFzZV9pY2xvZyh4bG9nX3QJCSpsb2csCisJCQkgeGxvZ19pbl9jb3JlX3QJKmljbG9nKQoreworCVNQTERFQ0wocyk7CisJaW50CQlzeW5jID0gMDsJLyogZG8gd2Ugc3luYz8gKi8KKworCXhsb2dfYXNzaWduX3RhaWxfbHNuKGxvZy0+bF9tcCk7CisKKwlzID0gTE9HX0xPQ0sobG9nKTsKKworCWlmIChpY2xvZy0+aWNfc3RhdGUgJiBYTE9HX1NUQVRFX0lPRVJST1IpIHsKKwkJTE9HX1VOTE9DSyhsb2csIHMpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJfQorCisJQVNTRVJUKGljbG9nLT5pY19yZWZjbnQgPiAwKTsKKwlBU1NFUlQoaWNsb2ctPmljX3N0YXRlID09IFhMT0dfU1RBVEVfQUNUSVZFIHx8CisJICAgICAgIGljbG9nLT5pY19zdGF0ZSA9PSBYTE9HX1NUQVRFX1dBTlRfU1lOQyk7CisKKwlpZiAoLS1pY2xvZy0+aWNfcmVmY250ID09IDAgJiYKKwkgICAgaWNsb2ctPmljX3N0YXRlID09IFhMT0dfU1RBVEVfV0FOVF9TWU5DKSB7CisJCXN5bmMrKzsKKwkJaWNsb2ctPmljX3N0YXRlID0gWExPR19TVEFURV9TWU5DSU5HOworCQlJTlRfU0VUKGljbG9nLT5pY19oZWFkZXIuaF90YWlsX2xzbiwgQVJDSF9DT05WRVJULCBsb2ctPmxfdGFpbF9sc24pOworCQl4bG9nX3ZlcmlmeV90YWlsX2xzbihsb2csIGljbG9nLCBsb2ctPmxfdGFpbF9sc24pOworCQkvKiBjeWNsZSBpbmNyZW1lbnRlZCB3aGVuIGluY3JlbWVudGluZyBjdXJyX2Jsb2NrICovCisJfQorCisJTE9HX1VOTE9DSyhsb2csIHMpOworCisJLyoKKwkgKiBXZSBsZXQgdGhlIGxvZyBsb2NrIGdvLCBzbyBpdCdzIHBvc3NpYmxlIHRoYXQgd2UgaGl0IGEgbG9nIEkvTworCSAqIGVycm9yIG9yIHNvbWVvdGhlciBTSFVURE9XTiBjb25kaXRpb24gdGhhdCBtYXJrcyB0aGUgaWNsb2cKKwkgKiBhcyBYTE9HX1NUQVRFX0lPRVJST1IgYmVmb3JlIHRoZSBid3JpdGUuIEhvd2V2ZXIsIHdlIGtub3cgdGhhdAorCSAqIHRoaXMgaWNsb2cgaGFzIGNvbnNpc3RlbnQgZGF0YSwgc28gd2UgaWdub3JlIElPRVJST1IKKwkgKiBmbGFncyBhZnRlciB0aGlzIHBvaW50LgorCSAqLworCWlmIChzeW5jKSB7CisJCXJldHVybiB4bG9nX3N5bmMobG9nLCBpY2xvZyk7CisJfQorCXJldHVybiAoMCk7CisKK30JLyogeGxvZ19zdGF0ZV9yZWxlYXNlX2ljbG9nICovCisKKworLyoKKyAqIFRoaXMgcm91dGluZSB3aWxsIG1hcmsgdGhlIGN1cnJlbnQgaWNsb2cgaW4gdGhlIHJpbmcgYXMgV0FOVF9TWU5DCisgKiBhbmQgbW92ZSB0aGUgY3VycmVudCBpY2xvZyBwb2ludGVyIHRvIHRoZSBuZXh0IGljbG9nIGluIHRoZSByaW5nLgorICogV2hlbiB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20geGxvZ19zdGF0ZV9nZXRfaWNsb2dfc3BhY2UoKSwgdGhlCisgKiBleGFjdCBzaXplIG9mIHRoZSBpY2xvZyBoYXMgbm90IHlldCBiZWVuIGRldGVybWluZWQuICBBbGwgd2Uga25vdyBpcworICogdGhhdCBldmVyeSBkYXRhIGJsb2NrLiAgV2UgaGF2ZSBydW4gb3V0IG9mIHNwYWNlIGluIHRoaXMgbG9nIHJlY29yZC4KKyAqLworU1RBVElDIHZvaWQKK3hsb2dfc3RhdGVfc3dpdGNoX2ljbG9ncyh4bG9nX3QJCSpsb2csCisJCQkgeGxvZ19pbl9jb3JlX3QgKmljbG9nLAorCQkJIGludAkJZXZlbnR1YWxfc2l6ZSkKK3sKKwlBU1NFUlQoaWNsb2ctPmljX3N0YXRlID09IFhMT0dfU1RBVEVfQUNUSVZFKTsKKwlpZiAoIWV2ZW50dWFsX3NpemUpCisJCWV2ZW50dWFsX3NpemUgPSBpY2xvZy0+aWNfb2Zmc2V0OworCWljbG9nLT5pY19zdGF0ZSA9IFhMT0dfU1RBVEVfV0FOVF9TWU5DOworCUlOVF9TRVQoaWNsb2ctPmljX2hlYWRlci5oX3ByZXZfYmxvY2ssIEFSQ0hfQ09OVkVSVCwgbG9nLT5sX3ByZXZfYmxvY2spOworCWxvZy0+bF9wcmV2X2Jsb2NrID0gbG9nLT5sX2N1cnJfYmxvY2s7CisJbG9nLT5sX3ByZXZfY3ljbGUgPSBsb2ctPmxfY3Vycl9jeWNsZTsKKworCS8qIHJvbGwgbG9nPzogaWNfb2Zmc2V0IGNoYW5nZWQgbGF0ZXIgKi8KKwlsb2ctPmxfY3Vycl9ibG9jayArPSBCVE9CQihldmVudHVhbF9zaXplKStCVE9CQihsb2ctPmxfaWNsb2dfaHNpemUpOworCisJLyogUm91bmQgdXAgdG8gbmV4dCBsb2ctc3VuaXQgKi8KKwlpZiAoWEZTX1NCX1ZFUlNJT05fSEFTTE9HVjIoJmxvZy0+bF9tcC0+bV9zYikgJiYKKwkgICAgbG9nLT5sX21wLT5tX3NiLnNiX2xvZ3N1bml0ID4gMSkgeworCQlfX3VpbnQzMl90IHN1bml0X2JiID0gQlRPQkIobG9nLT5sX21wLT5tX3NiLnNiX2xvZ3N1bml0KTsKKwkJbG9nLT5sX2N1cnJfYmxvY2sgPSByb3VuZHVwKGxvZy0+bF9jdXJyX2Jsb2NrLCBzdW5pdF9iYik7CisJfQorCisJaWYgKGxvZy0+bF9jdXJyX2Jsb2NrID49IGxvZy0+bF9sb2dCQnNpemUpIHsKKwkJbG9nLT5sX2N1cnJfY3ljbGUrKzsKKwkJaWYgKGxvZy0+bF9jdXJyX2N5Y2xlID09IFhMT0dfSEVBREVSX01BR0lDX05VTSkKKwkJCWxvZy0+bF9jdXJyX2N5Y2xlKys7CisJCWxvZy0+bF9jdXJyX2Jsb2NrIC09IGxvZy0+bF9sb2dCQnNpemU7CisJCUFTU0VSVChsb2ctPmxfY3Vycl9ibG9jayA+PSAwKTsKKwl9CisJQVNTRVJUKGljbG9nID09IGxvZy0+bF9pY2xvZyk7CisJbG9nLT5sX2ljbG9nID0gaWNsb2ctPmljX25leHQ7Cit9CS8qIHhsb2dfc3RhdGVfc3dpdGNoX2ljbG9ncyAqLworCisKKy8qCisgKiBXcml0ZSBvdXQgYWxsIGRhdGEgaW4gdGhlIGluLWNvcmUgbG9nIGFzIG9mIHRoaXMgZXhhY3QgbW9tZW50IGluIHRpbWUuCisgKgorICogRGF0YSBtYXkgYmUgd3JpdHRlbiB0byB0aGUgaW4tY29yZSBsb2cgZHVyaW5nIHRoaXMgY2FsbC4gIEhvd2V2ZXIsCisgKiB3ZSBkb24ndCBndWFyYW50ZWUgdGhpcyBkYXRhIHdpbGwgYmUgd3JpdHRlbiBvdXQuICBBIGNoYW5nZSBmcm9tIHBhc3QKKyAqIGltcGxlbWVudGF0aW9uIG1lYW5zIHRoaXMgcm91dGluZSB3aWxsICpub3QqIHdyaXRlIG91dCB6ZXJvIGxlbmd0aCBMUnMuCisgKgorICogQmFzaWNhbGx5LCB3ZSB0cnkgYW5kIHBlcmZvcm0gYW4gaW50ZWxsaWdlbnQgc2NhbiBvZiB0aGUgaW4tY29yZSBsb2dzLgorICogSWYgd2UgZGV0ZXJtaW5lIHRoZXJlIGlzIG5vIGZsdXNoYWJsZSBkYXRhLCB3ZSBqdXN0IHJldHVybi4gIFRoZXJlIGlzIG5vCisgKiBmbHVzaGFibGUgZGF0YSBpZjoKKyAqCisgKgkxLiB0aGUgY3VycmVudCBpY2xvZyBpcyBhY3RpdmUgYW5kIGhhcyBubyBkYXRhOyB0aGUgcHJldmlvdXMgaWNsb2cKKyAqCQlpcyBpbiB0aGUgYWN0aXZlIG9yIGRpcnR5IHN0YXRlLgorICoJMi4gdGhlIGN1cnJlbnQgaWNsb2cgaXMgZHJpdHksIGFuZCB0aGUgcHJldmlvdXMgaWNsb2cgaXMgaW4gdGhlCisgKgkJYWN0aXZlIG9yIGRpcnR5IHN0YXRlLgorICoKKyAqIFdlIG1heSBzbGVlcCAoY2FsbCBwc2VtYSkgaWY6CisgKgorICoJMS4gdGhlIGN1cnJlbnQgaWNsb2cgaXMgbm90IGluIHRoZSBhY3RpdmUgbm9yIGRpcnR5IHN0YXRlLgorICoJMi4gdGhlIGN1cnJlbnQgaWNsb2cgZGlydHksIGFuZCB0aGUgcHJldmlvdXMgaWNsb2cgaXMgbm90IGluIHRoZQorICoJCWFjdGl2ZSBub3IgZGlydHkgc3RhdGUuCisgKgkzLiB0aGUgY3VycmVudCBpY2xvZyBpcyBhY3RpdmUsIGFuZCB0aGVyZSBpcyBhbm90aGVyIHRocmVhZCB3cml0aW5nCisgKgkJdG8gdGhpcyBwYXJ0aWN1bGFyIGljbG9nLgorICoJNC4gYSkgdGhlIGN1cnJlbnQgaWNsb2cgaXMgYWN0aXZlIGFuZCBoYXMgbm8gb3RoZXIgd3JpdGVycworICoJICAgYikgd2hlbiB3ZSByZXR1cm4gZnJvbSBmbHVzaGluZyBvdXQgdGhpcyBpY2xvZywgaXQgaXMgc3RpbGwKKyAqCQlub3QgaW4gdGhlIGFjdGl2ZSBub3IgZGlydHkgc3RhdGUuCisgKi8KK1NUQVRJQyBpbnQKK3hsb2dfc3RhdGVfc3luY19hbGwoeGxvZ190ICpsb2csIHVpbnQgZmxhZ3MpCit7CisJeGxvZ19pbl9jb3JlX3QJKmljbG9nOworCXhmc19sc25fdAlsc247CisJU1BMREVDTChzKTsKKworCXMgPSBMT0dfTE9DSyhsb2cpOworCisJaWNsb2cgPSBsb2ctPmxfaWNsb2c7CisJaWYgKGljbG9nLT5pY19zdGF0ZSAmIFhMT0dfU1RBVEVfSU9FUlJPUikgeworCQlMT0dfVU5MT0NLKGxvZywgcyk7CisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKwl9CisKKwkvKiBJZiB0aGUgaGVhZCBpY2xvZyBpcyBub3QgYWN0aXZlIG5vciBkaXJ0eSwgd2UganVzdCBhdHRhY2gKKwkgKiBvdXJzZWx2ZXMgdG8gdGhlIGhlYWQgYW5kIGdvIHRvIHNsZWVwLgorCSAqLworCWlmIChpY2xvZy0+aWNfc3RhdGUgPT0gWExPR19TVEFURV9BQ1RJVkUgfHwKKwkgICAgaWNsb2ctPmljX3N0YXRlID09IFhMT0dfU1RBVEVfRElSVFkpIHsKKwkJLyoKKwkJICogSWYgdGhlIGhlYWQgaXMgZGlydHkgb3IgKGFjdGl2ZSBhbmQgZW1wdHkpLCB0aGVuCisJCSAqIHdlIG5lZWQgdG8gbG9vayBhdCB0aGUgcHJldmlvdXMgaWNsb2cuICBJZiB0aGUgcHJldmlvdXMKKwkJICogaWNsb2cgaXMgYWN0aXZlIG9yIGRpcnR5IHdlIGFyZSBkb25lLiAgVGhlcmUgaXMgbm90aGluZworCQkgKiB0byBzeW5jIG91dC4gIE90aGVyd2lzZSwgd2UgYXR0YWNoIG91cnNlbHZlcyB0byB0aGUKKwkJICogcHJldmlvdXMgaWNsb2cgYW5kIGdvIHRvIHNsZWVwLgorCQkgKi8KKwkJaWYgKGljbG9nLT5pY19zdGF0ZSA9PSBYTE9HX1NUQVRFX0RJUlRZIHx8CisJCSAgICAoaWNsb2ctPmljX3JlZmNudCA9PSAwICYmIGljbG9nLT5pY19vZmZzZXQgPT0gMCkpIHsKKwkJCWljbG9nID0gaWNsb2ctPmljX3ByZXY7CisJCQlpZiAoaWNsb2ctPmljX3N0YXRlID09IFhMT0dfU1RBVEVfQUNUSVZFIHx8CisJCQkgICAgaWNsb2ctPmljX3N0YXRlID09IFhMT0dfU1RBVEVfRElSVFkpCisJCQkJZ290byBub19zbGVlcDsKKwkJCWVsc2UKKwkJCQlnb3RvIG1heWJlX3NsZWVwOworCQl9IGVsc2UgeworCQkJaWYgKGljbG9nLT5pY19yZWZjbnQgPT0gMCkgeworCQkJCS8qIFdlIGFyZSB0aGUgb25seSBvbmUgd2l0aCBhY2Nlc3MgdG8gdGhpcworCQkJCSAqIGljbG9nLiAgRmx1c2ggaXQgb3V0IG5vdy4gIFRoZXJlIHNob3VsZAorCQkJCSAqIGJlIGEgcm91bmRvZmYgb2YgemVybyB0byBzaG93IHRoYXQgc29tZW9uZQorCQkJCSAqIGhhcyBhbHJlYWR5IHRha2VuIGNhcmUgb2YgdGhlIHJvdW5kb2ZmIGZyb20KKwkJCQkgKiB0aGUgcHJldmlvdXMgc3luYy4KKwkJCQkgKi8KKwkJCQlpY2xvZy0+aWNfcmVmY250Kys7CisJCQkJbHNuID0gSU5UX0dFVChpY2xvZy0+aWNfaGVhZGVyLmhfbHNuLCBBUkNIX0NPTlZFUlQpOworCQkJCXhsb2dfc3RhdGVfc3dpdGNoX2ljbG9ncyhsb2csIGljbG9nLCAwKTsKKwkJCQlMT0dfVU5MT0NLKGxvZywgcyk7CisKKwkJCQlpZiAoeGxvZ19zdGF0ZV9yZWxlYXNlX2ljbG9nKGxvZywgaWNsb2cpKQorCQkJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJCQkJcyA9IExPR19MT0NLKGxvZyk7CisJCQkJaWYgKElOVF9HRVQoaWNsb2ctPmljX2hlYWRlci5oX2xzbiwgQVJDSF9DT05WRVJUKSA9PSBsc24gJiYKKwkJCQkgICAgaWNsb2ctPmljX3N0YXRlICE9IFhMT0dfU1RBVEVfRElSVFkpCisJCQkJCWdvdG8gbWF5YmVfc2xlZXA7CisJCQkJZWxzZQorCQkJCQlnb3RvIG5vX3NsZWVwOworCQkJfSBlbHNlIHsKKwkJCQkvKiBTb21lb25lIGVsc2UgaXMgd3JpdGluZyB0byB0aGlzIGljbG9nLgorCQkJCSAqIFVzZSBpdHMgY2FsbCB0byBmbHVzaCBvdXQgdGhlIGRhdGEuICBIb3dldmVyLAorCQkJCSAqIHRoZSBvdGhlciB0aHJlYWQgbWF5IG5vdCBmb3JjZSBvdXQgdGhpcyBMUiwKKwkJCQkgKiBzbyB3ZSBtYXJrIGl0IFdBTlRfU1lOQy4KKwkJCQkgKi8KKwkJCQl4bG9nX3N0YXRlX3N3aXRjaF9pY2xvZ3MobG9nLCBpY2xvZywgMCk7CisJCQkJZ290byBtYXliZV9zbGVlcDsKKwkJCX0KKwkJfQorCX0KKworCS8qIEJ5IHRoZSB0aW1lIHdlIGNvbWUgYXJvdW5kIGFnYWluLCB0aGUgaWNsb2cgY291bGQndmUgYmVlbiBmaWxsZWQKKwkgKiB3aGljaCB3b3VsZCBnaXZlIGl0IGFub3RoZXIgbHNuLiAgSWYgd2UgaGF2ZSBhIG5ldyBsc24sIGp1c3QKKwkgKiByZXR1cm4gYmVjYXVzZSB0aGUgcmVsZXZhbnQgZGF0YSBoYXMgYmVlbiBmbHVzaGVkLgorCSAqLworbWF5YmVfc2xlZXA6CisJaWYgKGZsYWdzICYgWEZTX0xPR19TWU5DKSB7CisJCS8qCisJCSAqIFdlIG11c3QgY2hlY2sgaWYgd2UncmUgc2h1dHRpbmcgZG93biBoZXJlLCBiZWZvcmUKKwkJICogd2Ugd2FpdCwgd2hpbGUgd2UncmUgaG9sZGluZyB0aGUgTE9HX0xPQ0suCisJCSAqIFRoZW4gd2UgY2hlY2sgYWdhaW4gYWZ0ZXIgd2FraW5nIHVwLCBpbiBjYXNlIG91cgorCQkgKiBzbGVlcCB3YXMgZGlzdHVyYmVkIGJ5IGEgYmFkIG5ld3MuCisJCSAqLworCQlpZiAoaWNsb2ctPmljX3N0YXRlICYgWExPR19TVEFURV9JT0VSUk9SKSB7CisJCQlMT0dfVU5MT0NLKGxvZywgcyk7CisJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJCX0KKwkJWEZTX1NUQVRTX0lOQyh4c19sb2dfZm9yY2Vfc2xlZXApOworCQlzdl93YWl0KCZpY2xvZy0+aWNfZm9yY2VzZW1hLCBQSU5PRCwgJmxvZy0+bF9pY2xvZ2xvY2ssIHMpOworCQkvKgorCQkgKiBObyBuZWVkIHRvIGdyYWIgdGhlIGxvZyBsb2NrIGhlcmUgc2luY2Ugd2UncmUKKwkJICogb25seSBkZWNpZGluZyB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gRUlPCisJCSAqIGFuZCB0aGUgbWVtb3J5IHJlYWQgc2hvdWxkIGJlIGF0b21pYy4KKwkJICovCisJCWlmIChpY2xvZy0+aWNfc3RhdGUgJiBYTE9HX1NUQVRFX0lPRVJST1IpCisJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisKKwl9IGVsc2UgeworCitub19zbGVlcDoKKwkJTE9HX1VOTE9DSyhsb2csIHMpOworCX0KKwlyZXR1cm4gMDsKK30JLyogeGxvZ19zdGF0ZV9zeW5jX2FsbCAqLworCisKKy8qCisgKiBVc2VkIGJ5IGNvZGUgd2hpY2ggaW1wbGVtZW50cyBzeW5jaHJvbm91cyBsb2cgZm9yY2VzLgorICoKKyAqIEZpbmQgaW4tY29yZSBsb2cgd2l0aCBsc24uCisgKglJZiBpdCBpcyBpbiB0aGUgRElSVFkgc3RhdGUsIGp1c3QgcmV0dXJuLgorICoJSWYgaXQgaXMgaW4gdGhlIEFDVElWRSBzdGF0ZSwgbW92ZSB0aGUgaW4tY29yZSBsb2cgaW50byB0aGUgV0FOVF9TWU5DCisgKgkJc3RhdGUgYW5kIGdvIHRvIHNsZWVwIG9yIHJldHVybi4KKyAqCUlmIGl0IGlzIGluIGFueSBvdGhlciBzdGF0ZSwgZ28gdG8gc2xlZXAgb3IgcmV0dXJuLgorICoKKyAqIElmIGZpbGVzeXN0ZW0gYWN0aXZpdHkgZ29lcyB0byB6ZXJvLCB0aGUgaWNsb2cgd2lsbCBnZXQgZmx1c2hlZCBvbmx5IGJ5CisgKiBiZGZsdXNoKCkuCisgKi8KK2ludAoreGxvZ19zdGF0ZV9zeW5jKHhsb2dfdAkgICpsb2csCisJCXhmc19sc25fdCBsc24sCisJCXVpbnQJICBmbGFncykKK3sKKyAgICB4bG9nX2luX2NvcmVfdAkqaWNsb2c7CisgICAgaW50CQkJYWxyZWFkeV9zbGVwdCA9IDA7CisgICAgU1BMREVDTChzKTsKKworCit0cnlfYWdhaW46CisgICAgcyA9IExPR19MT0NLKGxvZyk7CisgICAgaWNsb2cgPSBsb2ctPmxfaWNsb2c7CisKKyAgICBpZiAoaWNsb2ctPmljX3N0YXRlICYgWExPR19TVEFURV9JT0VSUk9SKSB7CisJICAgIExPR19VTkxPQ0sobG9nLCBzKTsKKwkgICAgcmV0dXJuIFhGU19FUlJPUihFSU8pOworICAgIH0KKworICAgIGRvIHsKKwlpZiAoSU5UX0dFVChpY2xvZy0+aWNfaGVhZGVyLmhfbHNuLCBBUkNIX0NPTlZFUlQpICE9IGxzbikgeworCSAgICBpY2xvZyA9IGljbG9nLT5pY19uZXh0OworCSAgICBjb250aW51ZTsKKwl9CisKKwlpZiAoaWNsb2ctPmljX3N0YXRlID09IFhMT0dfU1RBVEVfRElSVFkpIHsKKwkJTE9HX1VOTE9DSyhsb2csIHMpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoaWNsb2ctPmljX3N0YXRlID09IFhMT0dfU1RBVEVfQUNUSVZFKSB7CisJCS8qCisJCSAqIFdlIHNsZWVwIGhlcmUgaWYgd2UgaGF2ZW4ndCBhbHJlYWR5IHNsZXB0IChlLmcuCisJCSAqIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UndmUgbG9va2VkIGF0IHRoZSBjb3JyZWN0CisJCSAqIGljbG9nIGJ1ZikgYW5kIHRoZSBidWZmZXIgYmVmb3JlIHVzIGlzIGdvaW5nIHRvCisJCSAqIGJlIHN5bmMnZWQuIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCBpZiB3ZQorCQkgKiBhcmUgZG9pbmcgc3luYyB0cmFuc2FjdGlvbnMgaGVyZSwgYnkgd2FpdGluZyBmb3IKKwkJICogdGhlIHByZXZpb3VzIEkvTyB0byBjb21wbGV0ZSwgd2UgY2FuIGFsbG93IGEgZmV3CisJCSAqIG1vcmUgdHJhbnNhY3Rpb25zIGludG8gdGhpcyBpY2xvZyBiZWZvcmUgd2UgY2xvc2UKKwkJICogaXQgZG93bi4KKwkJICoKKwkJICogT3RoZXJ3aXNlLCB3ZSBtYXJrIHRoZSBidWZmZXIgV0FOVF9TWU5DLCBhbmQgYnVtcAorCQkgKiB1cCB0aGUgcmVmY250IHNvIHdlIGNhbiByZWxlYXNlIHRoZSBsb2cgKHdoaWNoIGRyb3BzCisJCSAqIHRoZSByZWYgY291bnQpLiAgVGhlIHN0YXRlIHN3aXRjaCBrZWVwcyBuZXcgdHJhbnNhY3Rpb24KKwkJICogY29tbWl0cyBmcm9tIHVzaW5nIHRoaXMgYnVmZmVyLiAgV2hlbiB0aGUgY3VycmVudCBjb21taXRzCisJCSAqIGZpbmlzaCB3cml0aW5nIGludG8gdGhlIGJ1ZmZlciwgdGhlIHJlZmNvdW50IHdpbGwgZHJvcCB0bworCQkgKiB6ZXJvIGFuZCB0aGUgYnVmZmVyIHdpbGwgZ28gb3V0IHRoZW4uCisJCSAqLworCQlpZiAoIWFscmVhZHlfc2xlcHQgJiYKKwkJICAgIChpY2xvZy0+aWNfcHJldi0+aWNfc3RhdGUgJiAoWExPR19TVEFURV9XQU5UX1NZTkMgfAorCQkJCQkJIFhMT0dfU1RBVEVfU1lOQ0lORykpKSB7CisJCQlBU1NFUlQoIShpY2xvZy0+aWNfc3RhdGUgJiBYTE9HX1NUQVRFX0lPRVJST1IpKTsKKwkJCVhGU19TVEFUU19JTkMoeHNfbG9nX2ZvcmNlX3NsZWVwKTsKKwkJCXN2X3dhaXQoJmljbG9nLT5pY19wcmV2LT5pY193cml0ZXNlbWEsIFBTV1AsCisJCQkJJmxvZy0+bF9pY2xvZ2xvY2ssIHMpOworCQkJYWxyZWFkeV9zbGVwdCA9IDE7CisJCQlnb3RvIHRyeV9hZ2FpbjsKKwkJfSBlbHNlIHsKKwkJCWljbG9nLT5pY19yZWZjbnQrKzsKKwkJCXhsb2dfc3RhdGVfc3dpdGNoX2ljbG9ncyhsb2csIGljbG9nLCAwKTsKKwkJCUxPR19VTkxPQ0sobG9nLCBzKTsKKwkJCWlmICh4bG9nX3N0YXRlX3JlbGVhc2VfaWNsb2cobG9nLCBpY2xvZykpCisJCQkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCQkJcyA9IExPR19MT0NLKGxvZyk7CisJCX0KKwl9CisKKwlpZiAoKGZsYWdzICYgWEZTX0xPR19TWU5DKSAmJiAvKiBzbGVlcCAqLworCSAgICAhKGljbG9nLT5pY19zdGF0ZSAmIChYTE9HX1NUQVRFX0FDVElWRSB8IFhMT0dfU1RBVEVfRElSVFkpKSkgeworCisJCS8qCisJCSAqIERvbid0IHdhaXQgb24gdGhlIGZvcmNlc2VtYSBpZiB3ZSBrbm93IHRoYXQgd2UndmUKKwkJICogZ290dGVuIGEgbG9nIHdyaXRlIGVycm9yLgorCQkgKi8KKwkJaWYgKGljbG9nLT5pY19zdGF0ZSAmIFhMT0dfU1RBVEVfSU9FUlJPUikgeworCQkJTE9HX1VOTE9DSyhsb2csIHMpOworCQkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCQl9CisJCVhGU19TVEFUU19JTkMoeHNfbG9nX2ZvcmNlX3NsZWVwKTsKKwkJc3Zfd2FpdCgmaWNsb2ctPmljX2ZvcmNlc2VtYSwgUFNXUCwgJmxvZy0+bF9pY2xvZ2xvY2ssIHMpOworCQkvKgorCQkgKiBObyBuZWVkIHRvIGdyYWIgdGhlIGxvZyBsb2NrIGhlcmUgc2luY2Ugd2UncmUKKwkJICogb25seSBkZWNpZGluZyB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gRUlPCisJCSAqIGFuZCB0aGUgbWVtb3J5IHJlYWQgc2hvdWxkIGJlIGF0b21pYy4KKwkJICovCisJCWlmIChpY2xvZy0+aWNfc3RhdGUgJiBYTE9HX1NUQVRFX0lPRVJST1IpCisJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJfSBlbHNlIHsJCS8qIGp1c3QgcmV0dXJuICovCisJCUxPR19VTkxPQ0sobG9nLCBzKTsKKwl9CisJcmV0dXJuIDA7CisKKyAgICB9IHdoaWxlIChpY2xvZyAhPSBsb2ctPmxfaWNsb2cpOworCisgICAgTE9HX1VOTE9DSyhsb2csIHMpOworICAgIHJldHVybiAoMCk7Cit9CS8qIHhsb2dfc3RhdGVfc3luYyAqLworCisKKy8qCisgKiBDYWxsZWQgd2hlbiB3ZSB3YW50IHRvIG1hcmsgdGhlIGN1cnJlbnQgaWNsb2cgYXMgYmVpbmcgcmVhZHkgdG8gc3luYyB0bworICogZGlzay4KKyAqLwordm9pZAoreGxvZ19zdGF0ZV93YW50X3N5bmMoeGxvZ190ICpsb2csIHhsb2dfaW5fY29yZV90ICppY2xvZykKK3sKKwlTUExERUNMKHMpOworCisJcyA9IExPR19MT0NLKGxvZyk7CisKKwlpZiAoaWNsb2ctPmljX3N0YXRlID09IFhMT0dfU1RBVEVfQUNUSVZFKSB7CisJCXhsb2dfc3RhdGVfc3dpdGNoX2ljbG9ncyhsb2csIGljbG9nLCAwKTsKKwl9IGVsc2UgeworCQlBU1NFUlQoaWNsb2ctPmljX3N0YXRlICYKKwkJCShYTE9HX1NUQVRFX1dBTlRfU1lOQ3xYTE9HX1NUQVRFX0lPRVJST1IpKTsKKwl9CisKKwlMT0dfVU5MT0NLKGxvZywgcyk7Cit9CS8qIHhsb2dfc3RhdGVfd2FudF9zeW5jICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkJVElDS0VUIGZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qCisgKglBbGdvcml0aG0gZG9lc24ndCB0YWtlIGludG8gYWNjb3VudCBwYWdlIHNpemUuIDstKAorICovCitTVEFUSUMgdm9pZAoreGxvZ19zdGF0ZV90aWNrZXRfYWxsb2MoeGxvZ190ICpsb2cpCit7CisJeGxvZ190aWNrZXRfdAkqdF9saXN0OworCXhsb2dfdGlja2V0X3QJKm5leHQ7CisJeGZzX2NhZGRyX3QJYnVmOworCXVpbnQJCWkgPSAoTkJQUCAvIHNpemVvZih4bG9nX3RpY2tldF90KSkgLSAyOworCVNQTERFQ0wocyk7CisKKwkvKgorCSAqIFRoZSBrbWVtX3phbGxvYyBtYXkgc2xlZXAsIHNvIHdlIHNob3VsZG4ndCBiZSBob2xkaW5nIHRoZQorCSAqIGdsb2JhbCBsb2NrLiAgWFhYbWlrZW46IG1heSB3YW50IHRvIHVzZSB6b25lIGFsbG9jYXRvci4KKwkgKi8KKwlidWYgPSAoeGZzX2NhZGRyX3QpIGttZW1femFsbG9jKE5CUFAsIEtNX1NMRUVQKTsKKworCXMgPSBMT0dfTE9DSyhsb2cpOworCisJLyogQXR0YWNoIDFzdCB0aWNrZXQgdG8gUSwgc28gd2UgY2FuIGtlZXAgdHJhY2sgb2YgYWxsb2NhdGVkIG1lbW9yeSAqLworCXRfbGlzdCA9ICh4bG9nX3RpY2tldF90ICopYnVmOworCXRfbGlzdC0+dF9uZXh0ID0gbG9nLT5sX3VubW91bnRfZnJlZTsKKwlsb2ctPmxfdW5tb3VudF9mcmVlID0gdF9saXN0Kys7CisJbG9nLT5sX3RpY2tldF9jbnQrKzsKKwlsb2ctPmxfdGlja2V0X3RjbnQrKzsKKworCS8qIE5leHQgdGlja2V0IGJlY29tZXMgZmlyc3QgdGlja2V0IGF0dGFjaGVkIHRvIHRpY2tldCBmcmVlIGxpc3QgKi8KKwlpZiAobG9nLT5sX2ZyZWVsaXN0ICE9IE5VTEwpIHsKKwkJQVNTRVJUKGxvZy0+bF90YWlsICE9IE5VTEwpOworCQlsb2ctPmxfdGFpbC0+dF9uZXh0ID0gdF9saXN0OworCX0gZWxzZSB7CisJCWxvZy0+bF9mcmVlbGlzdCA9IHRfbGlzdDsKKwl9CisJbG9nLT5sX3RpY2tldF9jbnQrKzsKKwlsb2ctPmxfdGlja2V0X3RjbnQrKzsKKworCS8qIEN5Y2xlIHRocm91Z2ggcmVzdCBvZiBhbGxvYydlZCBtZW1vcnksIGJ1aWxkaW5nIHVwIGZyZWUgUSAqLworCWZvciAoIDsgaSA+IDA7IGktLSkgeworCQluZXh0ID0gdF9saXN0ICsgMTsKKwkJdF9saXN0LT50X25leHQgPSBuZXh0OworCQl0X2xpc3QgPSBuZXh0OworCQlsb2ctPmxfdGlja2V0X2NudCsrOworCQlsb2ctPmxfdGlja2V0X3RjbnQrKzsKKwl9CisJdF9saXN0LT50X25leHQgPSBOVUxMOworCWxvZy0+bF90YWlsID0gdF9saXN0OworCUxPR19VTkxPQ0sobG9nLCBzKTsKK30JLyogeGxvZ19zdGF0ZV90aWNrZXRfYWxsb2MgKi8KKworCisvKgorICogUHV0IHRpY2tldCBpbnRvIGZyZWUgbGlzdAorICoKKyAqIEFzc3VtcHRpb246IGxvZyBsb2NrIGlzIGhlbGQgYXJvdW5kIHRoaXMgY2FsbC4KKyAqLworU1RBVElDIHZvaWQKK3hsb2dfdGlja2V0X3B1dCh4bG9nX3QJCSpsb2csCisJCXhsb2dfdGlja2V0X3QJKnRpY2tldCkKK3sKKwlzdl9kZXN0cm95KCZ0aWNrZXQtPnRfc2VtYSk7CisKKwkvKgorCSAqIERvbid0IHRoaW5rIGNhY2hpbmcgd2lsbCBtYWtlIHRoYXQgbXVjaCBkaWZmZXJlbmNlLiAgSXQncworCSAqIG1vcmUgaW1wb3J0YW50IHRvIG1ha2UgZGVidWcgZWFzaWVyLgorCSAqLworI2lmIDAKKwkvKiByZWFsIGNvZGUgd2lsbCB3YW50IHRvIHVzZSBMSUZPIGZvciBjYWNoaW5nICovCisJdGlja2V0LT50X25leHQgPSBsb2ctPmxfZnJlZWxpc3Q7CisJbG9nLT5sX2ZyZWVsaXN0ID0gdGlja2V0OworCS8qIG5vIG5lZWQgdG8gY2xlYXIgZmllbGRzICovCisjZWxzZQorCS8qIFdoZW4gd2UgZGVidWcsIGl0IGlzIGVhc2llciBpZiB0aWNrZXRzIGFyZSBjeWNsZWQgKi8KKwl0aWNrZXQtPnRfbmV4dCAgICAgPSBOVUxMOworCWlmIChsb2ctPmxfdGFpbCAhPSAwKSB7CisJCWxvZy0+bF90YWlsLT50X25leHQgPSB0aWNrZXQ7CisJfSBlbHNlIHsKKwkJQVNTRVJUKGxvZy0+bF9mcmVlbGlzdCA9PSAwKTsKKwkJbG9nLT5sX2ZyZWVsaXN0ID0gdGlja2V0OworCX0KKwlsb2ctPmxfdGFpbAkgICAgPSB0aWNrZXQ7CisjZW5kaWYgLyogREVCVUcgKi8KKwlsb2ctPmxfdGlja2V0X2NudCsrOworfQkvKiB4bG9nX3RpY2tldF9wdXQgKi8KKworCisvKgorICogR3JhYiB0aWNrZXQgb2ZmIGZyZWVsaXN0IG9yIGFsbG9jYXRpb24gc29tZSBtb3JlCisgKi8KK3hsb2dfdGlja2V0X3QgKgoreGxvZ190aWNrZXRfZ2V0KHhsb2dfdAkJKmxvZywKKwkJaW50CQl1bml0X2J5dGVzLAorCQlpbnQJCWNudCwKKwkJY2hhcgkJY2xpZW50LAorCQl1aW50CQl4ZmxhZ3MpCit7CisJeGxvZ190aWNrZXRfdAkqdGljOworCXVpbnQJCW51bV9oZWFkZXJzOworCVNQTERFQ0wocyk7CisKKyBhbGxvYzoKKwlpZiAobG9nLT5sX2ZyZWVsaXN0ID09IE5VTEwpCisJCXhsb2dfc3RhdGVfdGlja2V0X2FsbG9jKGxvZyk7CQkvKiBwb3RlbnRpYWxseSBzbGVlcCAqLworCisJcyA9IExPR19MT0NLKGxvZyk7CisJaWYgKGxvZy0+bF9mcmVlbGlzdCA9PSBOVUxMKSB7CisJCUxPR19VTkxPQ0sobG9nLCBzKTsKKwkJZ290byBhbGxvYzsKKwl9CisJdGljCQk9IGxvZy0+bF9mcmVlbGlzdDsKKwlsb2ctPmxfZnJlZWxpc3QJPSB0aWMtPnRfbmV4dDsKKwlpZiAobG9nLT5sX2ZyZWVsaXN0ID09IE5VTEwpCisJCWxvZy0+bF90YWlsID0gTlVMTDsKKwlsb2ctPmxfdGlja2V0X2NudC0tOworCUxPR19VTkxPQ0sobG9nLCBzKTsKKworCS8qCisJICogUGVybWFuZW50IHJlc2VydmF0aW9ucyBoYXZlIHVwIHRvICdjbnQnLTEgYWN0aXZlIGxvZyBvcGVyYXRpb25zCisJICogaW4gdGhlIGxvZy4gIEEgdW5pdCBpbiB0aGlzIGNhc2UgaXMgdGhlIGFtb3VudCBvZiBzcGFjZSBmb3Igb25lCisJICogb2YgdGhlc2UgbG9nIG9wZXJhdGlvbnMuICBOb3JtYWwgcmVzZXJ2YXRpb25zIGhhdmUgYSBjbnQgb2YgMQorCSAqIGFuZCB0aGVpciB1bml0IGFtb3VudCBpcyB0aGUgdG90YWwgYW1vdW50IG9mIHNwYWNlIHJlcXVpcmVkLgorCSAqCisJICogVGhlIGZvbGxvd2luZyBsaW5lcyBvZiBjb2RlIGFjY291bnQgZm9yIG5vbi10cmFuc2FjdGlvbiBkYXRhCisJICogd2hpY2ggb2NjdXB5IHNwYWNlIGluIHRoZSBvbi1kaXNrIGxvZy4gCisJICovCisKKwkvKiBmb3Igc3RhcnQtcmVjICovCisJdW5pdF9ieXRlcyArPSBzaXplb2YoeGxvZ19vcF9oZWFkZXJfdCk7IAorCisJLyogZm9yIHBhZGRpbmcgKi8KKwlpZiAoWEZTX1NCX1ZFUlNJT05fSEFTTE9HVjIoJmxvZy0+bF9tcC0+bV9zYikgJiYKKwkJbG9nLT5sX21wLT5tX3NiLnNiX2xvZ3N1bml0ID4gMSkgeworCQkvKiBsb2cgc3Ugcm91bmRvZmYgKi8KKwkJdW5pdF9ieXRlcyArPSBsb2ctPmxfbXAtPm1fc2Iuc2JfbG9nc3VuaXQ7ICAKKwl9IGVsc2UgeworCQkvKiBCQiByb3VuZG9mZiAqLworCQl1bml0X2J5dGVzICs9IEJCU0laRTsKKyAgICAgICAgfQorCisJLyogZm9yIGNvbW1pdC1yZWMgKi8KKwl1bml0X2J5dGVzICs9IHNpemVvZih4bG9nX29wX2hlYWRlcl90KTsKKyAKKwkvKiBmb3IgTFIgaGVhZGVycyAqLworCW51bV9oZWFkZXJzID0gKCh1bml0X2J5dGVzICsgbG9nLT5sX2ljbG9nX3NpemUtMSkgPj4gbG9nLT5sX2ljbG9nX3NpemVfbG9nKTsKKwl1bml0X2J5dGVzICs9IGxvZy0+bF9pY2xvZ19oc2l6ZSAqIG51bV9oZWFkZXJzOworCisJdGljLT50X3VuaXRfcmVzCQk9IHVuaXRfYnl0ZXM7CisJdGljLT50X2N1cnJfcmVzCQk9IHVuaXRfYnl0ZXM7CisJdGljLT50X2NudAkJPSBjbnQ7CisJdGljLT50X29jbnQJCT0gY250OworCXRpYy0+dF90aWQJCT0gKHhsb2dfdGlkX3QpKChfX3BzaW50X3QpdGljICYgMHhmZmZmZmZmZik7CisJdGljLT50X2NsaWVudGlkCQk9IGNsaWVudDsKKwl0aWMtPnRfZmxhZ3MJCT0gWExPR19USUNfSU5JVEVEOworCWlmICh4ZmxhZ3MgJiBYRlNfTE9HX1BFUk1fUkVTRVJWKQorCQl0aWMtPnRfZmxhZ3MgfD0gWExPR19USUNfUEVSTV9SRVNFUlY7CisJc3ZfaW5pdCgmKHRpYy0+dF9zZW1hKSwgU1ZfREVGQVVMVCwgImxvZ3RpY2siKTsKKworCXJldHVybiB0aWM7Cit9CS8qIHhsb2dfdGlja2V0X2dldCAqLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKgkJTG9nIGRlYnVnIHJvdXRpbmVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisjaWYgZGVmaW5lZChERUJVRykgJiYgIWRlZmluZWQoWExPR19OT0xPRykKKy8qCisgKiBNYWtlIHN1cmUgdGhhdCB0aGUgZGVzdGluYXRpb24gcHRyIGlzIHdpdGhpbiB0aGUgdmFsaWQgZGF0YSByZWdpb24gb2YKKyAqIG9uZSBvZiB0aGUgaWNsb2dzLiAgVGhpcyB1c2VzIGJhY2t1cCBwb2ludGVycyBzdG9yZWQgaW4gYSBkaWZmZXJlbnQKKyAqIHBhcnQgb2YgdGhlIGxvZyBpbiBjYXNlIHdlIHRyYXNoIHRoZSBsb2cgc3RydWN0dXJlLgorICovCit2b2lkCit4bG9nX3ZlcmlmeV9kZXN0X3B0cih4bG9nX3QgICAgICpsb2csCisJCSAgICAgX19wc2ludF90ICBwdHIpCit7CisJaW50IGk7CisJaW50IGdvb2RfcHRyID0gMDsKKworCWZvciAoaT0wOyBpIDwgbG9nLT5sX2ljbG9nX2J1ZnM7IGkrKykgeworCQlpZiAocHRyID49IChfX3BzaW50X3QpbG9nLT5sX2ljbG9nX2Jha1tpXSAmJgorCQkgICAgcHRyIDw9IChfX3BzaW50X3QpbG9nLT5sX2ljbG9nX2Jha1tpXStsb2ctPmxfaWNsb2dfc2l6ZSkKKwkJCWdvb2RfcHRyKys7CisJfQorCWlmICghIGdvb2RfcHRyKQorCQl4bG9nX3BhbmljKCJ4bG9nX3ZlcmlmeV9kZXN0X3B0cjogaW52YWxpZCBwdHIiKTsKK30JLyogeGxvZ192ZXJpZnlfZGVzdF9wdHIgKi8KKworU1RBVElDIHZvaWQKK3hsb2dfdmVyaWZ5X2dyYW50X2hlYWQoeGxvZ190ICpsb2csIGludCBlcXVhbHMpCit7CisgICAgaWYgKGxvZy0+bF9ncmFudF9yZXNlcnZlX2N5Y2xlID09IGxvZy0+bF9ncmFudF93cml0ZV9jeWNsZSkgeworCWlmIChlcXVhbHMpCisJICAgIEFTU0VSVChsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyA+PSBsb2ctPmxfZ3JhbnRfd3JpdGVfYnl0ZXMpOworCWVsc2UKKwkgICAgQVNTRVJUKGxvZy0+bF9ncmFudF9yZXNlcnZlX2J5dGVzID4gbG9nLT5sX2dyYW50X3dyaXRlX2J5dGVzKTsKKyAgICB9IGVsc2UgeworCUFTU0VSVChsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9jeWNsZS0xID09IGxvZy0+bF9ncmFudF93cml0ZV9jeWNsZSk7CisJQVNTRVJUKGxvZy0+bF9ncmFudF93cml0ZV9ieXRlcyA+PSBsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyk7CisgICAgfQorfQkvKiB4bG9nX3ZlcmlmeV9ncmFudF9oZWFkICovCisKKy8qIGNoZWNrIGlmIGl0IHdpbGwgZml0ICovCitTVEFUSUMgdm9pZAoreGxvZ192ZXJpZnlfdGFpbF9sc24oeGxvZ190CSAgICAqbG9nLAorCQkgICAgIHhsb2dfaW5fY29yZV90ICppY2xvZywKKwkJICAgICB4ZnNfbHNuX3QJICAgIHRhaWxfbHNuKQoreworICAgIGludCBibG9ja3M7CisKKyAgICBpZiAoQ1lDTEVfTFNOKHRhaWxfbHNuKSA9PSBsb2ctPmxfcHJldl9jeWNsZSkgeworCWJsb2NrcyA9CisJICAgIGxvZy0+bF9sb2dCQnNpemUgLSAobG9nLT5sX3ByZXZfYmxvY2sgLSBCTE9DS19MU04odGFpbF9sc24pKTsKKwlpZiAoYmxvY2tzIDwgQlRPQkIoaWNsb2ctPmljX29mZnNldCkrQlRPQkIobG9nLT5sX2ljbG9nX2hzaXplKSkKKwkgICAgeGxvZ19wYW5pYygieGxvZ192ZXJpZnlfdGFpbF9sc246IHJhbiBvdXQgb2YgbG9nIHNwYWNlIik7CisgICAgfSBlbHNlIHsKKwlBU1NFUlQoQ1lDTEVfTFNOKHRhaWxfbHNuKSsxID09IGxvZy0+bF9wcmV2X2N5Y2xlKTsKKworCWlmIChCTE9DS19MU04odGFpbF9sc24pID09IGxvZy0+bF9wcmV2X2Jsb2NrKQorCSAgICB4bG9nX3BhbmljKCJ4bG9nX3ZlcmlmeV90YWlsX2xzbjogdGFpbCB3cmFwcGVkIik7CisKKwlibG9ja3MgPSBCTE9DS19MU04odGFpbF9sc24pIC0gbG9nLT5sX3ByZXZfYmxvY2s7CisJaWYgKGJsb2NrcyA8IEJUT0JCKGljbG9nLT5pY19vZmZzZXQpICsgMSkKKwkgICAgeGxvZ19wYW5pYygieGxvZ192ZXJpZnlfdGFpbF9sc246IHJhbiBvdXQgb2YgbG9nIHNwYWNlIik7CisgICAgfQorfQkvKiB4bG9nX3ZlcmlmeV90YWlsX2xzbiAqLworCisvKgorICogUGVyZm9ybSBhIG51bWJlciBvZiBjaGVja3Mgb24gdGhlIGljbG9nIGJlZm9yZSB3cml0aW5nIHRvIGRpc2suCisgKgorICogMS4gTWFrZSBzdXJlIHRoZSBpY2xvZ3MgYXJlIHN0aWxsIGNpcmN1bGFyCisgKiAyLiBNYWtlIHN1cmUgd2UgaGF2ZSBhIGdvb2QgbWFnaWMgbnVtYmVyCisgKiAzLiBNYWtlIHN1cmUgd2UgZG9uJ3QgaGF2ZSBtYWdpYyBudW1iZXJzIGluIHRoZSBkYXRhCisgKiA0LiBDaGVjayBmaWVsZHMgb2YgZWFjaCBsb2cgb3BlcmF0aW9uIGhlYWRlciBmb3I6CisgKglBLiBWYWxpZCBjbGllbnQgaWRlbnRpZmllcgorICoJQi4gdGlkIHB0ciB2YWx1ZSBmYWxscyBpbiB2YWxpZCBwdHIgc3BhY2UgKHVzZXIgc3BhY2UgY29kZSkKKyAqCUMuIExlbmd0aCBpbiBsb2cgcmVjb3JkIGhlYWRlciBpcyBjb3JyZWN0IGFjY29yZGluZyB0byB0aGUKKyAqCQlpbmRpdmlkdWFsIG9wZXJhdGlvbiBoZWFkZXJzIHdpdGhpbiByZWNvcmQuCisgKiA1LiBXaGVuIGEgYndyaXRlIHdpbGwgb2NjdXIgd2l0aGluIDUgYmxvY2tzIG9mIHRoZSBmcm9udCBvZiB0aGUgcGh5c2ljYWwKKyAqCWxvZywgY2hlY2sgdGhlIHByZWNlZGluZyBibG9ja3Mgb2YgdGhlIHBoeXNpY2FsIGxvZyB0byBtYWtlIHN1cmUgYWxsCisgKgl0aGUgY3ljbGUgbnVtYmVycyBhZ3JlZSB3aXRoIHRoZSBjdXJyZW50IGN5Y2xlIG51bWJlci4KKyAqLworU1RBVElDIHZvaWQKK3hsb2dfdmVyaWZ5X2ljbG9nKHhsb2dfdAkgKmxvZywKKwkJICB4bG9nX2luX2NvcmVfdCAqaWNsb2csCisJCSAgaW50CQkgY291bnQsCisJCSAgYm9vbGVhbl90CSBzeW5jaW5nKQoreworCXhsb2dfb3BfaGVhZGVyX3QJKm9waGVhZDsKKwl4bG9nX2luX2NvcmVfdAkJKmljcHRyOworCXhsb2dfaW5fY29yZV8yX3QJKnhoZHI7CisJeGZzX2NhZGRyX3QJCXB0cjsKKwl4ZnNfY2FkZHJfdAkJYmFzZV9wdHI7CisJX19wc2ludF90CQlmaWVsZF9vZmZzZXQ7CisJX191aW50OF90CQljbGllbnRpZDsKKwlpbnQJCQlsZW4sIGksIGosIGssIG9wX2xlbjsKKwlpbnQJCQlpZHg7CisJU1BMREVDTChzKTsKKworCS8qIGNoZWNrIHZhbGlkaXR5IG9mIGljbG9nIHBvaW50ZXJzICovCisJcyA9IExPR19MT0NLKGxvZyk7CisJaWNwdHIgPSBsb2ctPmxfaWNsb2c7CisJZm9yIChpPTA7IGkgPCBsb2ctPmxfaWNsb2dfYnVmczsgaSsrKSB7CisJCWlmIChpY3B0ciA9PSAwKQorCQkJeGxvZ19wYW5pYygieGxvZ192ZXJpZnlfaWNsb2c6IGludmFsaWQgcHRyIik7CisJCWljcHRyID0gaWNwdHItPmljX25leHQ7CisJfQorCWlmIChpY3B0ciAhPSBsb2ctPmxfaWNsb2cpCisJCXhsb2dfcGFuaWMoInhsb2dfdmVyaWZ5X2ljbG9nOiBjb3JydXB0IGljbG9nIHJpbmciKTsKKwlMT0dfVU5MT0NLKGxvZywgcyk7CisKKwkvKiBjaGVjayBsb2cgbWFnaWMgbnVtYmVycyAqLworCXB0ciA9ICh4ZnNfY2FkZHJfdCkgJihpY2xvZy0+aWNfaGVhZGVyKTsKKwlpZiAoSU5UX0dFVCgqKHVpbnQgKilwdHIsIEFSQ0hfQ09OVkVSVCkgIT0gWExPR19IRUFERVJfTUFHSUNfTlVNKQorCQl4bG9nX3BhbmljKCJ4bG9nX3ZlcmlmeV9pY2xvZzogaW52YWxpZCBtYWdpYyBudW0iKTsKKworCWZvciAocHRyICs9IEJCU0laRTsgcHRyIDwgKCh4ZnNfY2FkZHJfdCkmKGljbG9nLT5pY19oZWFkZXIpKStjb3VudDsKKwkgICAgIHB0ciArPSBCQlNJWkUpIHsKKwkJaWYgKElOVF9HRVQoKih1aW50ICopcHRyLCBBUkNIX0NPTlZFUlQpID09IFhMT0dfSEVBREVSX01BR0lDX05VTSkKKwkJCXhsb2dfcGFuaWMoInhsb2dfdmVyaWZ5X2ljbG9nOiB1bmV4cGVjdGVkIG1hZ2ljIG51bSIpOworCX0KKworCS8qIGNoZWNrIGZpZWxkcyAqLworCWxlbiA9IElOVF9HRVQoaWNsb2ctPmljX2hlYWRlci5oX251bV9sb2dvcHMsIEFSQ0hfQ09OVkVSVCk7CisJcHRyID0gaWNsb2ctPmljX2RhdGFwOworCWJhc2VfcHRyID0gcHRyOworCW9waGVhZCA9ICh4bG9nX29wX2hlYWRlcl90ICopcHRyOworCXhoZHIgPSAoeGxvZ19pbl9jb3JlXzJfdCAqKSZpY2xvZy0+aWNfaGVhZGVyOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlvcGhlYWQgPSAoeGxvZ19vcF9oZWFkZXJfdCAqKXB0cjsKKworCQkvKiBjbGllbnRpZCBpcyBvbmx5IDEgYnl0ZSAqLworCQlmaWVsZF9vZmZzZXQgPSAoX19wc2ludF90KQorCQkJICAgICAgICgoeGZzX2NhZGRyX3QpJihvcGhlYWQtPm9oX2NsaWVudGlkKSAtIGJhc2VfcHRyKTsKKwkJaWYgKHN5bmNpbmcgPT0gQl9GQUxTRSB8fCAoZmllbGRfb2Zmc2V0ICYgMHgxZmYpKSB7CisJCQljbGllbnRpZCA9IG9waGVhZC0+b2hfY2xpZW50aWQ7CisJCX0gZWxzZSB7CisJCQlpZHggPSBCVE9CQlQoKHhmc19jYWRkcl90KSYob3BoZWFkLT5vaF9jbGllbnRpZCkgLSBpY2xvZy0+aWNfZGF0YXApOworCQkJaWYgKGlkeCA+PSAoWExPR19IRUFERVJfQ1lDTEVfU0laRSAvIEJCU0laRSkpIHsKKwkJCQlqID0gaWR4IC8gKFhMT0dfSEVBREVSX0NZQ0xFX1NJWkUgLyBCQlNJWkUpOworCQkJCWsgPSBpZHggJSAoWExPR19IRUFERVJfQ1lDTEVfU0laRSAvIEJCU0laRSk7CisJCQkJY2xpZW50aWQgPSBHRVRfQ0xJRU5UX0lEKHhoZHJbal0uaGljX3hoZWFkZXIueGhfY3ljbGVfZGF0YVtrXSwgQVJDSF9DT05WRVJUKTsKKwkJCX0gZWxzZSB7CisJCQkJY2xpZW50aWQgPSBHRVRfQ0xJRU5UX0lEKGljbG9nLT5pY19oZWFkZXIuaF9jeWNsZV9kYXRhW2lkeF0sIEFSQ0hfQ09OVkVSVCk7CisJCQl9CisJCX0KKwkJaWYgKGNsaWVudGlkICE9IFhGU19UUkFOU0FDVElPTiAmJiBjbGllbnRpZCAhPSBYRlNfTE9HKQorCQkJY21uX2VycihDRV9XQVJOLCAieGxvZ192ZXJpZnlfaWNsb2c6IGludmFsaWQgY2xpZW50aWQgJWQgb3AgMHglcCBvZmZzZXQgMHgleCIsIGNsaWVudGlkLCBvcGhlYWQsIGZpZWxkX29mZnNldCk7CisKKwkJLyogY2hlY2sgbGVuZ3RoICovCisJCWZpZWxkX29mZnNldCA9IChfX3BzaW50X3QpCisJCQkgICAgICAgKCh4ZnNfY2FkZHJfdCkmKG9waGVhZC0+b2hfbGVuKSAtIGJhc2VfcHRyKTsKKwkJaWYgKHN5bmNpbmcgPT0gQl9GQUxTRSB8fCAoZmllbGRfb2Zmc2V0ICYgMHgxZmYpKSB7CisJCQlvcF9sZW4gPSBJTlRfR0VUKG9waGVhZC0+b2hfbGVuLCBBUkNIX0NPTlZFUlQpOworCQl9IGVsc2UgeworCQkJaWR4ID0gQlRPQkJUKChfX3BzaW50X3QpJm9waGVhZC0+b2hfbGVuIC0KKwkJCQkgICAgKF9fcHNpbnRfdClpY2xvZy0+aWNfZGF0YXApOworCQkJaWYgKGlkeCA+PSAoWExPR19IRUFERVJfQ1lDTEVfU0laRSAvIEJCU0laRSkpIHsKKwkJCQlqID0gaWR4IC8gKFhMT0dfSEVBREVSX0NZQ0xFX1NJWkUgLyBCQlNJWkUpOworCQkJCWsgPSBpZHggJSAoWExPR19IRUFERVJfQ1lDTEVfU0laRSAvIEJCU0laRSk7CisJCQkJb3BfbGVuID0gSU5UX0dFVCh4aGRyW2pdLmhpY194aGVhZGVyLnhoX2N5Y2xlX2RhdGFba10sIEFSQ0hfQ09OVkVSVCk7CisJCQl9IGVsc2UgeworCQkJCW9wX2xlbiA9IElOVF9HRVQoaWNsb2ctPmljX2hlYWRlci5oX2N5Y2xlX2RhdGFbaWR4XSwgQVJDSF9DT05WRVJUKTsKKwkJCX0KKwkJfQorCQlwdHIgKz0gc2l6ZW9mKHhsb2dfb3BfaGVhZGVyX3QpICsgb3BfbGVuOworCX0KK30JLyogeGxvZ192ZXJpZnlfaWNsb2cgKi8KKyNlbmRpZiAvKiBERUJVRyAmJiAhWExPR19OT0xPRyAqLworCisvKgorICogTWFyayBhbGwgaWNsb2dzIElPRVJST1IuIExPR19MT0NLIGlzIGhlbGQgYnkgdGhlIGNhbGxlci4KKyAqLworU1RBVElDIGludAoreGxvZ19zdGF0ZV9pb2Vycm9yKAorCXhsb2dfdAkqbG9nKQoreworCXhsb2dfaW5fY29yZV90CSppY2xvZywgKmljOworCisJaWNsb2cgPSBsb2ctPmxfaWNsb2c7CisJaWYgKCEgKGljbG9nLT5pY19zdGF0ZSAmIFhMT0dfU1RBVEVfSU9FUlJPUikpIHsKKwkJLyoKKwkJICogTWFyayBhbGwgdGhlIGluY29yZSBsb2dzIElPRVJST1IuCisJCSAqIEZyb20gbm93IG9uLCBubyBsb2cgZmx1c2hlcyB3aWxsIHJlc3VsdC4KKwkJICovCisJCWljID0gaWNsb2c7CisJCWRvIHsKKwkJCWljLT5pY19zdGF0ZSA9IFhMT0dfU1RBVEVfSU9FUlJPUjsKKwkJCWljID0gaWMtPmljX25leHQ7CisJCX0gd2hpbGUgKGljICE9IGljbG9nKTsKKwkJcmV0dXJuICgwKTsKKwl9CisJLyoKKwkgKiBSZXR1cm4gbm9uLXplcm8sIGlmIHN0YXRlIHRyYW5zaXRpb24gaGFzIGFscmVhZHkgaGFwcGVuZWQuCisJICovCisJcmV0dXJuICgxKTsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIGZyb20geGZzX2ZvcmNlX3NodXRkb3duLCB3aGVuIHdlJ3JlIGZvcmNpYmx5CisgKiBzaHV0dGluZyBkb3duIHRoZSBmaWxlc3lzdGVtLCB0eXBpY2FsbHkgYmVjYXVzZSBvZiBhbiBJTyBlcnJvci4KKyAqIE91ciBtYWluIG9iamVjdGl2ZXMgaGVyZSBhcmUgdG8gbWFrZSBzdXJlIHRoYXQ6CisgKglhLiB0aGUgZmlsZXN5c3RlbSBnZXRzIG1hcmtlZCAnU0hVVERPV04nIGZvciBhbGwgaW50ZXJlc3RlZAorICoJICAgcGFydGllcyB0byBmaW5kIG91dCwgJ2F0b21pY2FsbHknLgorICoJYi4gdGhvc2Ugd2hvJ3JlIHNsZWVwaW5nIG9uIGxvZyByZXNlcnZhdGlvbnMsIHBpbm5lZCBvYmplY3RzIGFuZAorICoJICAgIG90aGVyIHJlc291cmNlcyBnZXQgd29rZW4gdXAsIGFuZCBiZSB0b2xkIHRoZSBiYWQgbmV3cy4KKyAqCWMuIG5vdGhpbmcgbmV3IGdldHMgcXVldWVkIHVwIGFmdGVyIChhKSBhbmQgKGIpIGFyZSBkb25lLgorICoJZC4gaWYgIWxvZ2Vycm9yLCBmbHVzaCB0aGUgaWNsb2dzIHRvIGRpc2ssIHRoZW4gc2VhbCB0aGVtIG9mZgorICoJICAgZm9yIGJ1c2luZXNzLgorICovCitpbnQKK3hmc19sb2dfZm9yY2VfdW1vdW50KAorCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAorCWludAkJCWxvZ2Vycm9yKQoreworCXhsb2dfdGlja2V0X3QJKnRpYzsKKwl4bG9nX3QJCSpsb2c7CisJaW50CQlyZXR2YWw7CisJU1BMREVDTChzKTsKKwlTUExERUNMKHMyKTsKKworCWxvZyA9IG1wLT5tX2xvZzsKKworCS8qCisJICogSWYgdGhpcyBoYXBwZW5zIGR1cmluZyBsb2cgcmVjb3ZlcnksIGRvbid0IHdvcnJ5IGFib3V0CisJICogbG9ja2luZzsgdGhlIGxvZyBpc24ndCBvcGVuIGZvciBidXNpbmVzcyB5ZXQuCisJICovCisJaWYgKCFsb2cgfHwKKwkgICAgbG9nLT5sX2ZsYWdzICYgWExPR19BQ1RJVkVfUkVDT1ZFUlkpIHsKKwkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX0ZTX1NIVVRET1dOOworCQlYRlNfQlVGX0RPTkUobXAtPm1fc2JfYnApOworCQlyZXR1cm4gKDApOworCX0KKworCS8qCisJICogU29tZWJvZHkgY291bGQndmUgYWxyZWFkeSBkb25lIHRoZSBoYXJkIHdvcmsgZm9yIHVzLgorCSAqIE5vIG5lZWQgdG8gZ2V0IGxvY2tzIGZvciB0aGlzLgorCSAqLworCWlmIChsb2dlcnJvciAmJiBsb2ctPmxfaWNsb2ctPmljX3N0YXRlICYgWExPR19TVEFURV9JT0VSUk9SKSB7CisJCUFTU0VSVChYTE9HX0ZPUkNFRF9TSFVURE9XTihsb2cpKTsKKwkJcmV0dXJuICgxKTsKKwl9CisJcmV0dmFsID0gMDsKKwkvKgorCSAqIFdlIG11c3QgaG9sZCBib3RoIHRoZSBHUkFOVCBsb2NrIGFuZCB0aGUgTE9HIGxvY2ssCisJICogYmVmb3JlIHdlIG1hcmsgdGhlIGZpbGVzeXN0ZW0gU0hVVERPV04gYW5kIHdha2UKKwkgKiBldmVyeWJvZHkgdXAgdG8gdGVsbCB0aGUgYmFkIG5ld3MuCisJICovCisJcyA9IEdSQU5UX0xPQ0sobG9nKTsKKwlzMiA9IExPR19MT0NLKGxvZyk7CisJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX0ZTX1NIVVRET1dOOworCVhGU19CVUZfRE9ORShtcC0+bV9zYl9icCk7CisJLyoKKwkgKiBUaGlzIGZsYWcgaXMgc29ydCBvZiByZWR1bmRhbnQgYmVjYXVzZSBvZiB0aGUgbW91bnQgZmxhZywgYnV0CisJICogaXQncyBnb29kIHRvIG1haW50YWluIHRoZSBzZXBhcmF0aW9uIGJldHdlZW4gdGhlIGxvZyBhbmQgdGhlIHJlc3QKKwkgKiBvZiBYRlMuCisJICovCisJbG9nLT5sX2ZsYWdzIHw9IFhMT0dfSU9fRVJST1I7CisKKwkvKgorCSAqIElmIHdlIGhpdCBhIGxvZyBlcnJvciwgd2Ugd2FudCB0byBtYXJrIGFsbCB0aGUgaWNsb2dzIElPRVJST1IKKwkgKiB3aGlsZSB3ZSdyZSBzdGlsbCBob2xkaW5nIHRoZSBsb2dsb2NrLgorCSAqLworCWlmIChsb2dlcnJvcikKKwkJcmV0dmFsID0geGxvZ19zdGF0ZV9pb2Vycm9yKGxvZyk7CisJTE9HX1VOTE9DSyhsb2csIHMyKTsKKworCS8qCisJICogV2UgZG9uJ3Qgd2FudCBhbnlib2R5IHdhaXRpbmcgZm9yIGxvZyByZXNlcnZhdGlvbnMKKwkgKiBhZnRlciB0aGlzLiBUaGF0IG1lYW5zIHdlIGhhdmUgdG8gd2FrZSB1cCBldmVyeWJvZHkKKwkgKiBxdWV1ZWQgdXAgb24gcmVzZXJ2ZV9oZWFkcSBhcyB3ZWxsIGFzIHdyaXRlX2hlYWRxLgorCSAqIEluIGFkZGl0aW9uLCB3ZSBtYWtlIHN1cmUgaW4geGxvZ197cmV9Z3JhbnRfbG9nX3NwYWNlCisJICogdGhhdCB3ZSBkb24ndCBlbnF1ZXVlIGFueXRoaW5nIG9uY2UgdGhlIFNIVVRET1dOIGZsYWcKKwkgKiBpcyBzZXQsIGFuZCB0aGlzIGFjdGlvbiBpcyBwcm90ZWN0ZWQgYnkgdGhlIEdSQU5UTE9DSy4KKwkgKi8KKwlpZiAoKHRpYyA9IGxvZy0+bF9yZXNlcnZlX2hlYWRxKSkgeworCQlkbyB7CisJCQlzdl9zaWduYWwoJnRpYy0+dF9zZW1hKTsKKwkJCXRpYyA9IHRpYy0+dF9uZXh0OworCQl9IHdoaWxlICh0aWMgIT0gbG9nLT5sX3Jlc2VydmVfaGVhZHEpOworCX0KKworCWlmICgodGljID0gbG9nLT5sX3dyaXRlX2hlYWRxKSkgeworCQlkbyB7CisJCQlzdl9zaWduYWwoJnRpYy0+dF9zZW1hKTsKKwkJCXRpYyA9IHRpYy0+dF9uZXh0OworCQl9IHdoaWxlICh0aWMgIT0gbG9nLT5sX3dyaXRlX2hlYWRxKTsKKwl9CisJR1JBTlRfVU5MT0NLKGxvZywgcyk7CisKKwlpZiAoISAobG9nLT5sX2ljbG9nLT5pY19zdGF0ZSAmIFhMT0dfU1RBVEVfSU9FUlJPUikpIHsKKwkJQVNTRVJUKCFsb2dlcnJvcik7CisJCS8qCisJCSAqIEZvcmNlIHRoZSBpbmNvcmUgbG9ncyB0byBkaXNrIGJlZm9yZSBzaHV0dGluZyB0aGUKKwkJICogbG9nIGRvd24gY29tcGxldGVseS4KKwkJICovCisJCXhsb2dfc3RhdGVfc3luY19hbGwobG9nLCBYRlNfTE9HX0ZPUkNFfFhGU19MT0dfU1lOQyk7CisJCXMyID0gTE9HX0xPQ0sobG9nKTsKKwkJcmV0dmFsID0geGxvZ19zdGF0ZV9pb2Vycm9yKGxvZyk7CisJCUxPR19VTkxPQ0sobG9nLCBzMik7CisJfQorCS8qCisJICogV2FrZSB1cCBldmVyeWJvZHkgd2FpdGluZyBvbiB4ZnNfbG9nX2ZvcmNlLgorCSAqIENhbGxiYWNrIGFsbCBsb2cgaXRlbSBjb21taXR0ZWQgZnVuY3Rpb25zIGFzIGlmIHRoZQorCSAqIGxvZyB3cml0ZXMgd2VyZSBjb21wbGV0ZWQuCisJICovCisJeGxvZ19zdGF0ZV9kb19jYWxsYmFjayhsb2csIFhGU19MSV9BQk9SVEVELCBOVUxMKTsKKworI2lmZGVmIFhGU0VSUk9SREVCVUcKKwl7CisJCXhsb2dfaW5fY29yZV90CSppY2xvZzsKKworCQlzID0gTE9HX0xPQ0sobG9nKTsKKwkJaWNsb2cgPSBsb2ctPmxfaWNsb2c7CisJCWRvIHsKKwkJCUFTU0VSVChpY2xvZy0+aWNfY2FsbGJhY2sgPT0gMCk7CisJCQlpY2xvZyA9IGljbG9nLT5pY19uZXh0OworCQl9IHdoaWxlIChpY2xvZyAhPSBsb2ctPmxfaWNsb2cpOworCQlMT0dfVU5MT0NLKGxvZywgcyk7CisJfQorI2VuZGlmCisJLyogcmV0dXJuIG5vbi16ZXJvIGlmIGxvZyBJT0VSUk9SIHRyYW5zaXRpb24gaGFkIGFscmVhZHkgaGFwcGVuZWQgKi8KKwlyZXR1cm4gKHJldHZhbCk7Cit9CisKK2ludAoreGxvZ19pY2xvZ3NfZW1wdHkoeGxvZ190ICpsb2cpCit7CisJeGxvZ19pbl9jb3JlX3QJKmljbG9nOworCisJaWNsb2cgPSBsb2ctPmxfaWNsb2c7CisJZG8geworCQkvKiBlbmRpYW5uZXNzIGRvZXMgbm90IG1hdHRlciBoZXJlLCB6ZXJvIGlzIHplcm8gaW4KKwkJICogYW55IGxhbmd1YWdlLgorCQkgKi8KKwkJaWYgKGljbG9nLT5pY19oZWFkZXIuaF9udW1fbG9nb3BzKQorCQkJcmV0dXJuKDApOworCQlpY2xvZyA9IGljbG9nLT5pY19uZXh0OworCX0gd2hpbGUgKGljbG9nICE9IGxvZy0+bF9pY2xvZyk7CisJcmV0dXJuKDEpOworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19sb2cuaCBiL2ZzL3hmcy94ZnNfbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRiMTIyZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfbG9nLmgKQEAgLTAsMCArMSwxODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmCV9fWEZTX0xPR19IX18KKyNkZWZpbmUgX19YRlNfTE9HX0hfXworCisvKiBnZXQgbHNuIGZpZWxkcyAqLworCisjZGVmaW5lIENZQ0xFX0xTTihsc24pICgodWludCkoKGxzbik+PjMyKSkKKyNkZWZpbmUgQkxPQ0tfTFNOKGxzbikgKCh1aW50KShsc24pKQorLyogdGhpcyBpcyB1c2VkIGluIGEgc3BvdCB3aGVyZSB3ZSBtaWdodCBvdGhlcndpc2UgZG91YmxlLWVuZGlhbi1mbGlwICovCisjZGVmaW5lIENZQ0xFX0xTTl9ESVNLKGxzbikgKCgodWludCAqKSYobHNuKSlbMF0pCisKKyNpZmRlZiBfX0tFUk5FTF9fCisvKgorICogQnkgY29tcGFyaW5nIGVhY2ggY29tcG5lbnQsIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgZXh0cmEKKyAqIGVuZGlhbiBpc3N1ZXMgaW4gdHJlYXRpbmcgdHdvIDMyIGJpdCBudW1iZXJzIGFzIG9uZSA2NCBiaXQgbnVtYmVyCisgKi8KK3N0YXRpYworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChfX0dOVUNfXyA9PSAyKSAmJiAoIChfX0dOVUNfTUlOT1JfXyA9PSA5NSkgfHwgKF9fR05VQ19NSU5PUl9fID09IDk2KSkKK19fYXR0cmlidXRlX18oKHVudXNlZCkpCS8qIGdjYyAyLjk1LCAyLjk2IG1pc2NvbXBpbGUgdGhpcyB3aGVuIGlubGluZWQgKi8KKyNlbHNlCitfX2lubGluZV9fCisjZW5kaWYKK3hmc19sc25fdAlfbHNuX2NtcCh4ZnNfbHNuX3QgbHNuMSwgeGZzX2xzbl90IGxzbjIpCit7CisJaWYgKENZQ0xFX0xTTihsc24xKSAhPSBDWUNMRV9MU04obHNuMikpCisJCXJldHVybiAoQ1lDTEVfTFNOKGxzbjEpPENZQ0xFX0xTTihsc24yKSk/IC05OTkgOiA5OTk7CisKKwlpZiAoQkxPQ0tfTFNOKGxzbjEpICE9IEJMT0NLX0xTTihsc24yKSkKKwkJcmV0dXJuIChCTE9DS19MU04obHNuMSk8QkxPQ0tfTFNOKGxzbjIpKT8gLTk5OSA6IDk5OTsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lCVhGU19MU05fQ01QKHgseSkgX2xzbl9jbXAoeCx5KQorCisvKgorICogTWFjcm9zLCBzdHJ1Y3R1cmVzLCBwcm90b3R5cGVzIGZvciBpbnRlcmZhY2UgdG8gdGhlIGxvZyBtYW5hZ2VyLgorICovCisKKy8qCisgKiBGbGFncyB0byB4ZnNfbG9nX21vdW50CisgKi8KKyNkZWZpbmUgWEZTX0xPR19SRUNPVkVSCQkweDEKKworLyoKKyAqIEZsYWdzIHRvIHhmc19sb2dfZG9uZSgpCisgKi8KKyNkZWZpbmUgWEZTX0xPR19SRUxfUEVSTV9SRVNFUlYJMHgxCisKKworLyoKKyAqIEZsYWdzIHRvIHhmc19sb2dfcmVzZXJ2ZSgpCisgKgorICoJWEZTX0xPR19TTEVFUDoJIElmIHNwYWNlIGlzIG5vdCBhdmFpbGFibGUsIHNsZWVwIChkZWZhdWx0KQorICoJWEZTX0xPR19OT1NMRUVQOiBJZiBzcGFjZSBpcyBub3QgYXZhaWxhYmxlLCByZXR1cm4gZXJyb3IKKyAqCVhGU19MT0dfUEVSTV9SRVNFUlY6IFBlcm1hbmVudCByZXNlcnZhdGlvbi4gIFdoZW4gd3JpdGVzIGFyZQorICoJCXBlcmZvcm1lZCBhZ2FpbnN0IHRoaXMgdHlwZSBvZiByZXNlcnZhdGlvbiwgdGhlIHJlc2VydmF0aW9uCisgKgkJaXMgbm90IGRlY3JlYXNlZC4gIExvbmcgcnVubmluZyB0cmFuc2FjdGlvbnMgc2hvdWxkIHVzZSB0aGlzLgorICovCisjZGVmaW5lIFhGU19MT0dfU0xFRVAJCTB4MAorI2RlZmluZSBYRlNfTE9HX05PU0xFRVAJCTB4MQorI2RlZmluZSBYRlNfTE9HX1BFUk1fUkVTRVJWCTB4MgorI2RlZmluZSBYRlNfTE9HX1JFU1ZfQUxMCShYRlNfTE9HX05PU0xFRVB8WEZTX0xPR19QRVJNX1JFU0VSVikKKworCisvKgorICogRmxhZ3MgdG8geGZzX2xvZ19mb3JjZSgpCisgKgorICoJWEZTX0xPR19TWU5DOglTeW5jaHJvbm91cyBmb3JjZSBpbi1jb3JlIGxvZyB0byBkaXNrCisgKglYRlNfTE9HX0ZPUkNFOglTdGFydCBpbi1jb3JlIGxvZyB3cml0ZSBub3cuCisgKglYRlNfTE9HX1VSR0U6CVN0YXJ0IHdyaXRlIHdpdGhpbiBzb21lIHdpbmRvdyBvZiB0aW1lLgorICoKKyAqIE5vdGU6IEVpdGhlciBYRlNfTE9HX0ZPUkNFIG9yIFhGU19MT0dfVVJHRSBtdXN0IGJlIHNldC4KKyAqLworI2RlZmluZSBYRlNfTE9HX1NZTkMJCTB4MQorI2RlZmluZSBYRlNfTE9HX0ZPUkNFCQkweDIKKyNkZWZpbmUgWEZTX0xPR19VUkdFCQkweDQKKworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKworCisvKiBMb2cgQ2xpZW50cyAqLworI2RlZmluZSBYRlNfVFJBTlNBQ1RJT04JCTB4NjkKKyNkZWZpbmUgWEZTX1ZPTFVNRQkJMHgyCisjZGVmaW5lIFhGU19MT0cJCQkweGFhCisKK3R5cGVkZWYgc3RydWN0IHhmc19sb2dfaW92ZWMgeworCXhmc19jYWRkcl90CQlpX2FkZHI7CQkvKiBiZWdpbm5pbmcgYWRkcmVzcyBvZiByZWdpb24gKi8KKwlpbnQJCWlfbGVuOwkJLyogbGVuZ3RoIGluIGJ5dGVzIG9mIHJlZ2lvbiAqLworfSB4ZnNfbG9nX2lvdmVjX3Q7CisKK3R5cGVkZWYgdm9pZCogeGZzX2xvZ190aWNrZXRfdDsKKworLyoKKyAqIFN0cnVjdHVyZSB1c2VkIHRvIHBhc3MgY2FsbGJhY2sgZnVuY3Rpb24gYW5kIHRoZSBmdW5jdGlvbidzIGFyZ3VtZW50CisgKiB0byB0aGUgbG9nIG1hbmFnZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19sb2dfY2FsbGJhY2sgeworCXN0cnVjdCB4ZnNfbG9nX2NhbGxiYWNrCSpjYl9uZXh0OworCXZvaWQJCQkoKmNiX2Z1bmMpKHZvaWQgKiwgaW50KTsKKwl2b2lkCQkJKmNiX2FyZzsKK30geGZzX2xvZ19jYWxsYmFja190OworCisKKyNpZmRlZiBfX0tFUk5FTF9fCisvKiBMb2cgbWFuYWdlciBpbnRlcmZhY2VzICovCitzdHJ1Y3QgeGZzX21vdW50OworeGZzX2xzbl90IHhmc19sb2dfZG9uZShzdHJ1Y3QgeGZzX21vdW50ICptcCwKKwkJICAgICAgIHhmc19sb2dfdGlja2V0X3QgdGlja2V0LAorCQkgICAgICAgdm9pZAkJKippY2xvZywKKwkJICAgICAgIHVpbnQJCWZsYWdzKTsKK2ludAkgIHhmc19sb2dfZm9yY2Uoc3RydWN0IHhmc19tb3VudCAqbXAsCisJCQl4ZnNfbHNuX3QJIGxzbiwKKwkJCXVpbnQJCSBmbGFncyk7CitpbnQJICB4ZnNfbG9nX21vdW50KHN0cnVjdCB4ZnNfbW91bnQJKm1wLAorCQkJc3RydWN0IHhmc19idWZ0YXJnCSpsb2dfdGFyZ2V0LAorCQkJeGZzX2RhZGRyX3QJCXN0YXJ0X2Jsb2NrLAorCQkJaW50CQkgCW51bV9iYmxvY2tzKTsKK2ludAkgIHhmc19sb2dfbW91bnRfZmluaXNoKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCBpbnQpOwordm9pZAkgIHhmc19sb2dfbW92ZV90YWlsKHN0cnVjdCB4ZnNfbW91bnQJKm1wLAorCQkJICAgIHhmc19sc25fdAkJdGFpbF9sc24pOworaW50CSAgeGZzX2xvZ19ub3RpZnkoc3RydWN0IHhmc19tb3VudAkqbXAsCisJCQkgdm9pZAkJCSppY2xvZywKKwkJCSB4ZnNfbG9nX2NhbGxiYWNrX3QJKmNhbGxiYWNrX2VudHJ5KTsKK2ludAkgIHhmc19sb2dfcmVsZWFzZV9pY2xvZyhzdHJ1Y3QgeGZzX21vdW50ICptcCwKKwkJCSB2b2lkCQkJICppY2xvZ19obmRsKTsKK2ludAkgIHhmc19sb2dfcmVzZXJ2ZShzdHJ1Y3QgeGZzX21vdW50ICptcCwKKwkJCSAgaW50CQkgICBsZW5ndGgsCisJCQkgIGludAkJICAgY291bnQsCisJCQkgIHhmc19sb2dfdGlja2V0X3QgKnRpY2tldCwKKwkJCSAgX191aW50OF90CSAgIGNsaWVudGlkLAorCQkJICB1aW50CQkgICBmbGFncyk7CitpbnQJICB4ZnNfbG9nX3dyaXRlKHN0cnVjdCB4ZnNfbW91bnQgKm1wLAorCQkJeGZzX2xvZ19pb3ZlY190ICByZWdpb25bXSwKKwkJCWludAkJIG5lbnRyaWVzLAorCQkJeGZzX2xvZ190aWNrZXRfdCB0aWNrZXQsCisJCQl4ZnNfbHNuX3QJICpzdGFydF9sc24pOworaW50CSAgeGZzX2xvZ191bm1vdW50KHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKK2ludAkgIHhmc19sb2dfdW5tb3VudF93cml0ZShzdHJ1Y3QgeGZzX21vdW50ICptcCk7Cit2b2lkICAgICAgeGZzX2xvZ191bm1vdW50X2RlYWxsb2Moc3RydWN0IHhmc19tb3VudCAqbXApOworaW50CSAgeGZzX2xvZ19mb3JjZV91bW91bnQoc3RydWN0IHhmc19tb3VudCAqbXAsIGludCBsb2dlcnJvcik7CitpbnQJICB4ZnNfbG9nX25lZWRfY292ZXJlZChzdHJ1Y3QgeGZzX21vdW50ICptcCk7CisKK3ZvaWQJICB4bG9nX2lvZG9uZShzdHJ1Y3QgeGZzX2J1ZiAqKTsKKworI2VuZGlmCisKKworZXh0ZXJuIGludCB4bG9nX2RlYnVnOwkJLyogc2V0IHRvIDEgdG8gZW5hYmxlIHJlYWwgbG9nICovCisKKworI2VuZGlmCS8qIF9fWEZTX0xPR19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbG9nX3ByaXYuaCBiL2ZzL3hmcy94ZnNfbG9nX3ByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzFlM2NlCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19sb2dfcHJpdi5oCkBAIC0wLDAgKzEsNTYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZglfX1hGU19MT0dfUFJJVl9IX18KKyNkZWZpbmUgX19YRlNfTE9HX1BSSVZfSF9fCisKK3N0cnVjdCB4ZnNfYnVmOworc3RydWN0IGt0cmFjZTsKK3N0cnVjdCBsb2c7CitzdHJ1Y3QgeGZzX2J1Zl9jYW5jZWw7CitzdHJ1Y3QgeGZzX21vdW50OworCisvKgorICogTWFjcm9zLCBzdHJ1Y3R1cmVzLCBwcm90b3R5cGVzIGZvciBpbnRlcm5hbCBsb2cgbWFuYWdlciB1c2UuCisgKi8KKworI2RlZmluZSBYTE9HX01JTl9JQ0xPR1MJCTIKKyNkZWZpbmUgWExPR19NRURfSUNMT0dTCQk0CisjZGVmaW5lIFhMT0dfTUFYX0lDTE9HUwkJOAorI2RlZmluZSBYTE9HX0NBTExCQUNLX1NJWkUJMTAKKyNkZWZpbmUgWExPR19IRUFERVJfTUFHSUNfTlVNCTB4RkVFRGJhYmUJLyogSW52YWxpZCBjeWNsZSBudW1iZXIgKi8KKyNkZWZpbmUgWExPR19WRVJTSU9OXzEJCTEKKyNkZWZpbmUgWExPR19WRVJTSU9OXzIJCTIJCS8qIExhcmdlIElDbG9ncywgTG9nIHN1bml0ICovCisjZGVmaW5lIFhMT0dfVkVSU0lPTl9PS0JJVFMJKFhMT0dfVkVSU0lPTl8xIHwgWExPR19WRVJTSU9OXzIpCisjZGVmaW5lIFhMT0dfUkVDT1JEX0JTSVpFCSgxNioxMDI0KQkvKiBldmVudHVhbGx5IDMyayAqLworI2RlZmluZSBYTE9HX0JJR19SRUNPUkRfQlNJWkUJKDMyKjEwMjQpCS8qIDMyayBidWZmZXJzICovCisjZGVmaW5lIFhMT0dfTUFYX1JFQ09SRF9CU0laRQkoMjU2KjEwMjQpCisjZGVmaW5lIFhMT0dfSEVBREVSX0NZQ0xFX1NJWkUJKDMyKjEwMjQpCS8qIGN5Y2xlIGRhdGEgaW4gaGVhZGVyICovCisjZGVmaW5lIFhMT0dfUkVDT1JEX0JTSElGVAkxNAkJLyogMTYzODQgPT0gMSA8PCAxNCAqLworI2RlZmluZSBYTE9HX0JJR19SRUNPUkRfQlNISUZUCTE1CQkvKiAzMmsgPT0gMSA8PCAxNSAqLworI2RlZmluZSBYTE9HX01BWF9SRUNPUkRfQlNISUZUCTE4CQkvKiAyNTZrID09IDEgPDwgMTggKi8KKyNkZWZpbmUgWExPR19CVE9MU1VOSVQobG9nLCBiKSAgKCgoYikrKGxvZyktPmxfbXAtPm1fc2Iuc2JfbG9nc3VuaXQtMSkgLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9nKS0+bF9tcC0+bV9zYi5zYl9sb2dzdW5pdCkKKyNkZWZpbmUgWExPR19MU1VOSVRUT0IobG9nLCBzdSkgKChzdSkgKiAobG9nKS0+bF9tcC0+bV9zYi5zYl9sb2dzdW5pdCkKKworI2RlZmluZSBYTE9HX0hFQURFUl9TSVpFCTUxMgorCisjZGVmaW5lIFhMT0dfUkVDX1NISUZUKGxvZykgXAorCUJUT0JCKDEgPDwgKFhGU19TQl9WRVJTSU9OX0hBU0xPR1YyKCZsb2ctPmxfbXAtPm1fc2IpID8gXAorCSBYTE9HX01BWF9SRUNPUkRfQlNISUZUIDogWExPR19CSUdfUkVDT1JEX0JTSElGVCkpCisjZGVmaW5lIFhMT0dfVE9UQUxfUkVDX1NISUZUKGxvZykgXAorCUJUT0JCKFhMT0dfTUFYX0lDTE9HUyA8PCAoWEZTX1NCX1ZFUlNJT05fSEFTTE9HVjIoJmxvZy0+bF9tcC0+bV9zYikgPyBcCisJIFhMT0dfTUFYX1JFQ09SRF9CU0hJRlQgOiBYTE9HX0JJR19SRUNPUkRfQlNISUZUKSkKKworLyoKKyAqICBzZXQgbHNucworICovCisKKyNkZWZpbmUgQVNTSUdOX0FOWV9MU05fSE9TVChsc24sY3ljbGUsYmxvY2spICBcCisgICAgeyBcCisJKGxzbikgPSAoKHhmc19sc25fdCkoY3ljbGUpPDwzMil8KGJsb2NrKTsgXAorICAgIH0KKyNkZWZpbmUgQVNTSUdOX0FOWV9MU05fRElTSyhsc24sY3ljbGUsYmxvY2spICBcCisgICAgeyBcCisJSU5UX1NFVCgoKHVpbnQgKikmKGxzbikpWzBdLCBBUkNIX0NPTlZFUlQsIChjeWNsZSkpOyBcCisJSU5UX1NFVCgoKHVpbnQgKikmKGxzbikpWzFdLCBBUkNIX0NPTlZFUlQsIChibG9jaykpOyBcCisgICAgfQorI2RlZmluZSBBU1NJR05fTFNOKGxzbixsb2cpIFwKKyAgICBBU1NJR05fQU5ZX0xTTl9ESVNLKGxzbiwobG9nKS0+bF9jdXJyX2N5Y2xlLChsb2cpLT5sX2N1cnJfYmxvY2spOworCisjZGVmaW5lIFhMT0dfU0VUKGYsYikJCSgoKGYpICYgKGIpKSA9PSAoYikpCisKKyNkZWZpbmUgR0VUX0NZQ0xFKHB0ciwgYXJjaCkgXAorICAgIChJTlRfR0VUKCoodWludCAqKShwdHIpLCBhcmNoKSA9PSBYTE9HX0hFQURFUl9NQUdJQ19OVU0gPyBcCisJIElOVF9HRVQoKigodWludCAqKShwdHIpKzEpLCBhcmNoKSA6IFwKKwkgSU5UX0dFVCgqKHVpbnQgKikocHRyKSwgYXJjaCkgXAorICAgICkKKworI2RlZmluZSBCTEtfQVZHKGJsazEsIGJsazIpCSgoYmxrMStibGsyKSA+PiAxKQorCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKy8qCisgKiBnZXQgY2xpZW50IGlkIGZyb20gcGFja2VkIGNvcHkuCisgKgorICogdGhpcyBoYWNrIGlzIGhlcmUgYmVjYXVzZSB0aGUgeGxvZ19wYWNrIGNvZGUgY29waWVzIGZvdXIgYnl0ZXMKKyAqIG9mIHhsb2dfb3BfaGVhZGVyIGNvbnRhaW5pbmcgdGhlIGZpZWxkcyBvaF9jbGllbnRpZCwgb2hfZmxhZ3MKKyAqIGFuZCBvaF9yZXMyIGludG8gdGhlIHBhY2tlZCBjb3B5LgorICoKKyAqIGxhdGVyIG9uIHRoaXMgZm91ciBieXRlIGNodW5rIGlzIHRyZWF0ZWQgYXMgYW4gaW50IGFuZCB0aGUKKyAqIGNsaWVudCBpZCBpcyBwdWxsZWQgb3V0LgorICoKKyAqIHRoaXMgaGFzIGVuZGlhbiBpc3N1ZXMsIG9mIGNvdXJzZS4KKyAqLworCisjaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorI2RlZmluZSBHRVRfQ0xJRU5UX0lEKGksYXJjaCkgXAorICAgICgoaSkgJiAweGZmKQorI2Vsc2UKKyNkZWZpbmUgR0VUX0NMSUVOVF9JRChpLGFyY2gpIFwKKyAgICAoKGkpID4+IDI0KQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWExPR19HUkFOVF9TVUJfU1BBQ0UpCit2b2lkIHhsb2dfZ3JhbnRfc3ViX3NwYWNlKHN0cnVjdCBsb2cgKmxvZywgaW50IGJ5dGVzLCBpbnQgdHlwZSk7CisjZGVmaW5lIFhMT0dfR1JBTlRfU1VCX1NQQUNFKGxvZyxieXRlcyx0eXBlKQlcCisJeGxvZ19ncmFudF9zdWJfc3BhY2UobG9nLGJ5dGVzLHR5cGUpCisjZWxzZQorI2RlZmluZSBYTE9HX0dSQU5UX1NVQl9TUEFDRShsb2csYnl0ZXMsdHlwZSkJCQkJXAorICAgIHsJCQkJCQkJCQlcCisJaWYgKHR5cGUgPT0gJ3cnKSB7CQkJCQkJXAorCQkobG9nKS0+bF9ncmFudF93cml0ZV9ieXRlcyAtPSAoYnl0ZXMpOwkJCVwKKwkJaWYgKChsb2cpLT5sX2dyYW50X3dyaXRlX2J5dGVzIDwgMCkgewkJCVwKKwkJCShsb2cpLT5sX2dyYW50X3dyaXRlX2J5dGVzICs9IChsb2cpLT5sX2xvZ3NpemU7CVwKKwkJCShsb2cpLT5sX2dyYW50X3dyaXRlX2N5Y2xlLS07CQkJXAorCQl9CQkJCQkJCVwKKwl9IGVsc2UgewkJCQkJCQlcCisJCShsb2cpLT5sX2dyYW50X3Jlc2VydmVfYnl0ZXMgLT0gKGJ5dGVzKTsJCVwKKwkJaWYgKChsb2cpLT5sX2dyYW50X3Jlc2VydmVfYnl0ZXMgPCAwKSB7CQkJXAorCQkJKGxvZyktPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyArPSAobG9nKS0+bF9sb2dzaXplO1wKKwkJCShsb2cpLT5sX2dyYW50X3Jlc2VydmVfY3ljbGUtLTsJCQlcCisJCX0JCQkJCQkJXAorCSB9CQkJCQkJCQlcCisgICAgfQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hMT0dfR1JBTlRfQUREX1NQQUNFKQordm9pZCB4bG9nX2dyYW50X2FkZF9zcGFjZShzdHJ1Y3QgbG9nICpsb2csIGludCBieXRlcywgaW50IHR5cGUpOworI2RlZmluZSBYTE9HX0dSQU5UX0FERF9TUEFDRShsb2csYnl0ZXMsdHlwZSkJXAorCXhsb2dfZ3JhbnRfYWRkX3NwYWNlKGxvZyxieXRlcyx0eXBlKQorI2Vsc2UKKyNkZWZpbmUgWExPR19HUkFOVF9BRERfU1BBQ0UobG9nLGJ5dGVzLHR5cGUpCQkJCVwKKyAgICB7CQkJCQkJCQkJXAorCWlmICh0eXBlID09ICd3JykgewkJCQkJCVwKKwkJKGxvZyktPmxfZ3JhbnRfd3JpdGVfYnl0ZXMgKz0gKGJ5dGVzKTsJCQlcCisJCWlmICgobG9nKS0+bF9ncmFudF93cml0ZV9ieXRlcyA+IChsb2cpLT5sX2xvZ3NpemUpIHsJXAorCQkJKGxvZyktPmxfZ3JhbnRfd3JpdGVfYnl0ZXMgLT0gKGxvZyktPmxfbG9nc2l6ZTsJXAorCQkJKGxvZyktPmxfZ3JhbnRfd3JpdGVfY3ljbGUrKzsJCQlcCisJCX0JCQkJCQkJXAorCX0gZWxzZSB7CQkJCQkJCVwKKwkJKGxvZyktPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyArPSAoYnl0ZXMpOwkJXAorCQlpZiAoKGxvZyktPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyA+IChsb2cpLT5sX2xvZ3NpemUpIHsJXAorCQkJKGxvZyktPmxfZ3JhbnRfcmVzZXJ2ZV9ieXRlcyAtPSAobG9nKS0+bF9sb2dzaXplO1wKKwkJCShsb2cpLT5sX2dyYW50X3Jlc2VydmVfY3ljbGUrKzsJCQlcCisJCX0JCQkJCQkJXAorCSB9CQkJCQkJCQlcCisgICAgfQorI2VuZGlmCisjZGVmaW5lIFhMT0dfSU5TX1RJQ0tFVFEocSx0aWMpCQkJCVwKKyAgICB7CQkJCQkJCVwKKwlpZiAocSkgewkJCQkJXAorCQkodGljKS0+dF9uZXh0CSAgICA9IChxKTsJCVwKKwkJKHRpYyktPnRfcHJldgkgICAgPSAocSktPnRfcHJldjsJXAorCQkocSktPnRfcHJldi0+dF9uZXh0ID0gKHRpYyk7CQlcCisJCShxKS0+dF9wcmV2CSAgICA9ICh0aWMpOwkJXAorCX0gZWxzZSB7CQkJCQlcCisJCSh0aWMpLT50X3ByZXYgPSAodGljKS0+dF9uZXh0ID0gKHRpYyk7CVwKKwkJKHEpID0gKHRpYyk7CQkJCVwKKwl9CQkJCQkJXAorCSh0aWMpLT50X2ZsYWdzIHw9IFhMT0dfVElDX0lOX1E7CQlcCisgICAgfQorI2RlZmluZSBYTE9HX0RFTF9USUNLRVRRKHEsdGljKQkJCQlcCisgICAgewkJCQkJCQlcCisJaWYgKCh0aWMpID09ICh0aWMpLT50X25leHQpIHsJCQlcCisJCShxKSA9IE5VTEw7CQkJCVwKKwl9IGVsc2UgewkJCQkJXAorCQkocSkgPSAodGljKS0+dF9uZXh0OwkJCVwKKwkJKHRpYyktPnRfbmV4dC0+dF9wcmV2ID0gKHRpYyktPnRfcHJldjsJXAorCQkodGljKS0+dF9wcmV2LT50X25leHQgPSAodGljKS0+dF9uZXh0OwlcCisJfQkJCQkJCVwKKwkodGljKS0+dF9uZXh0ID0gKHRpYyktPnRfcHJldiA9IE5VTEw7CQlcCisJKHRpYyktPnRfZmxhZ3MgJj0gflhMT0dfVElDX0lOX1E7CQlcCisgICAgfQorCisKKyNkZWZpbmUgR1JBTlRfTE9DSyhsb2cpCQltdXRleF9zcGlubG9jaygmKGxvZyktPmxfZ3JhbnRfbG9jaykKKyNkZWZpbmUgR1JBTlRfVU5MT0NLKGxvZywgcykJbXV0ZXhfc3BpbnVubG9jaygmKGxvZyktPmxfZ3JhbnRfbG9jaywgcykKKyNkZWZpbmUgTE9HX0xPQ0sobG9nKQkJbXV0ZXhfc3BpbmxvY2soJihsb2cpLT5sX2ljbG9nbG9jaykKKyNkZWZpbmUgTE9HX1VOTE9DSyhsb2csIHMpCW11dGV4X3NwaW51bmxvY2soJihsb2cpLT5sX2ljbG9nbG9jaywgcykKKworI2RlZmluZSB4bG9nX3BhbmljKGFyZ3MuLi4pCWNtbl9lcnIoQ0VfUEFOSUMsICMjIGFyZ3MpCisjZGVmaW5lIHhsb2dfZXhpdChhcmdzLi4uKQljbW5fZXJyKENFX1BBTklDLCAjIyBhcmdzKQorI2RlZmluZSB4bG9nX3dhcm4oYXJncy4uLikJY21uX2VycihDRV9XQVJOLCAjIyBhcmdzKQorCisvKgorICogSW4gY29yZSBsb2cgc3RhdGUKKyAqLworI2RlZmluZSBYTE9HX1NUQVRFX0FDVElWRSAgICAweDAwMDEgLyogQ3VycmVudCBJQyBsb2cgYmVpbmcgd3JpdHRlbiB0byAqLworI2RlZmluZSBYTE9HX1NUQVRFX1dBTlRfU1lOQyAweDAwMDIgLyogV2FudCB0byBzeW5jIHRoaXMgaWNsb2c7IG5vIG1vcmUgd3JpdGVzICovCisjZGVmaW5lIFhMT0dfU1RBVEVfU1lOQ0lORyAgIDB4MDAwNCAvKiBUaGlzIElDIGxvZyBpcyBzeW5jaW5nICovCisjZGVmaW5lIFhMT0dfU1RBVEVfRE9ORV9TWU5DIDB4MDAwOCAvKiBEb25lIHN5bmNpbmcgdG8gZGlzayAqLworI2RlZmluZSBYTE9HX1NUQVRFX0RPX0NBTExCQUNLIFwKKwkJCSAgICAgMHgwMDEwIC8qIFByb2Nlc3MgY2FsbGJhY2sgZnVuY3Rpb25zICovCisjZGVmaW5lIFhMT0dfU1RBVEVfQ0FMTEJBQ0sgIDB4MDAyMCAvKiBDYWxsYmFjayBmdW5jdGlvbnMgbm93ICovCisjZGVmaW5lIFhMT0dfU1RBVEVfRElSVFkgICAgIDB4MDA0MCAvKiBEaXJ0eSBJQyBsb2csIG5vdCByZWFkeSBmb3IgQUNUSVZFIHN0YXR1cyovCisjZGVmaW5lIFhMT0dfU1RBVEVfSU9FUlJPUiAgIDB4MDA4MCAvKiBJTyBlcnJvciBoYXBwZW5lZCBpbiBzeW5jJ2luZyBsb2cgKi8KKyNkZWZpbmUgWExPR19TVEFURV9BTEwJICAgICAweDdGRkYgLyogQWxsIHBvc3NpYmxlIHZhbGlkIGZsYWdzICovCisjZGVmaW5lIFhMT0dfU1RBVEVfTk9UVVNFRCAgIDB4ODAwMCAvKiBUaGlzIElDIGxvZyBub3QgYmVpbmcgdXNlZCAqLworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKworLyoKKyAqIEZsYWdzIHRvIGxvZyBvcGVyYXRpb24gaGVhZGVyCisgKgorICogVGhlIGZpcnN0IHdyaXRlIG9mIGEgbmV3IHRyYW5zYWN0aW9uIHdpbGwgYmUgcHJlY2VkZWQgd2l0aCBhIHN0YXJ0CisgKiByZWNvcmQsIFhMT0dfU1RBUlRfVFJBTlMuICBPbmNlIGEgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkLCBhIGNvbW1pdAorICogcmVjb3JkIGlzIHdyaXR0ZW4sIFhMT0dfQ09NTUlUX1RSQU5TLiAgSWYgYSBzaW5nbGUgcmVnaW9uIGNhbiBub3QgZml0IGludG8KKyAqIHRoZSByZW1haW5kZXIgb2YgdGhlIGN1cnJlbnQgYWN0aXZlIGluLWNvcmUgbG9nLCBpdCBpcyBzcGxpdCB1cCBpbnRvCisgKiBtdWx0aXBsZSByZWdpb25zLiAgRWFjaCBwYXJ0aWFsIHJlZ2lvbiB3aWxsIGJlIG1hcmtlZCB3aXRoIGEKKyAqIFhMT0dfQ09OVElOVUVfVFJBTlMgdW50aWwgdGhlIGxhc3Qgb25lLCB3aGljaCBnZXRzIG1hcmtlZCB3aXRoIFhMT0dfRU5EX1RSQU5TLgorICoKKyAqLworI2RlZmluZSBYTE9HX1NUQVJUX1RSQU5TCTB4MDEJLyogU3RhcnQgYSBuZXcgdHJhbnNhY3Rpb24gKi8KKyNkZWZpbmUgWExPR19DT01NSVRfVFJBTlMJMHgwMgkvKiBDb21taXQgdGhpcyB0cmFuc2FjdGlvbiAqLworI2RlZmluZSBYTE9HX0NPTlRJTlVFX1RSQU5TCTB4MDQJLyogQ29udCB0aGlzIHRyYW5zIGludG8gbmV3IHJlZ2lvbiAqLworI2RlZmluZSBYTE9HX1dBU19DT05UX1RSQU5TCTB4MDgJLyogQ29udCB0aGlzIHRyYW5zIGludG8gbmV3IHJlZ2lvbiAqLworI2RlZmluZSBYTE9HX0VORF9UUkFOUwkJMHgxMAkvKiBFbmQgYSBjb250aW51ZWQgdHJhbnNhY3Rpb24gKi8KKyNkZWZpbmUgWExPR19VTk1PVU5UX1RSQU5TCTB4MjAJLyogVW5tb3VudCBhIGZpbGVzeXN0ZW0gdHJhbnNhY3Rpb24gKi8KKyNkZWZpbmUgWExPR19TS0lQX1RSQU5TCQkoWExPR19DT01NSVRfVFJBTlMgfCBYTE9HX0NPTlRJTlVFX1RSQU5TIHwgXAorCQkJCSBYTE9HX1dBU19DT05UX1RSQU5TIHwgWExPR19FTkRfVFJBTlMgfCBcCisJCQkJIFhMT0dfVU5NT1VOVF9UUkFOUykKKworI2lmZGVmIF9fS0VSTkVMX18KKy8qCisgKiBGbGFncyB0byBsb2cgdGlja2V0CisgKi8KKyNkZWZpbmUgWExPR19USUNfSU5JVEVECQkweDEJLyogaGFzIGJlZW4gaW5pdGlhbGl6ZWQgKi8KKyNkZWZpbmUgWExPR19USUNfUEVSTV9SRVNFUlYJMHgyCS8qIHBlcm1hbmVudCByZXNlcnZhdGlvbiAqLworI2RlZmluZSBYTE9HX1RJQ19JTl9RCQkweDQKKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisKKyNkZWZpbmUgWExPR19VTk1PVU5UX1RZUEUJMHg1NTZlCS8qIFVuIGZvciBVbm1vdW50ICovCisKKy8qCisgKiBGbGFncyBmb3IgbG9nIHN0cnVjdHVyZQorICovCisjZGVmaW5lIFhMT0dfQ0hLU1VNX01JU01BVENICTB4MQkvKiB1c2VkIG9ubHkgZHVyaW5nIHJlY292ZXJ5ICovCisjZGVmaW5lIFhMT0dfQUNUSVZFX1JFQ09WRVJZCTB4MgkvKiBpbiB0aGUgbWlkZGxlIG9mIHJlY292ZXJ5ICovCisjZGVmaW5lCVhMT0dfUkVDT1ZFUllfTkVFREVECTB4NAkvKiBsb2cgd2FzIHJlY292ZXJlZCAqLworI2RlZmluZSBYTE9HX0lPX0VSUk9SCQkweDgJLyogbG9nIGhpdCBhbiBJL08gZXJyb3IsIGFuZCBiZWluZworCQkJCQkgICBzaHV0ZG93biAqLwordHlwZWRlZiBfX3VpbnQzMl90IHhsb2dfdGlkX3Q7CisKKworI2lmZGVmIF9fS0VSTkVMX18KKy8qCisgKiBCZWxvdyBhcmUgc3RhdGVzIGZvciBjb3ZlcmluZyBhbGxvY2F0aW9uIHRyYW5zYWN0aW9ucy4KKyAqIEJ5IGNvdmVyaW5nLCB3ZSBtZWFuIGNoYW5naW5nIHRoZSBoX3RhaWxfbHNuIGluIHRoZSBsYXN0IG9uLWRpc2sKKyAqIGxvZyB3cml0ZSBzdWNoIHRoYXQgbm8gYWxsb2NhdGlvbiB0cmFuc2FjdGlvbnMgd2lsbCBiZSByZS1kb25lIGR1cmluZworICogcmVjb3ZlcnkgYWZ0ZXIgYSBzeXN0ZW0gY3Jhc2guIFJlY292ZXJ5IHN0YXJ0cyBhdCB0aGUgbGFzdCBvbi1kaXNrCisgKiBsb2cgd3JpdGUuCisgKgorICogVGhlc2Ugc3RhdGVzIGFyZSB1c2VkIHRvIGluc2VydCBkdW1teSBsb2cgZW50cmllcyB0byBjb3ZlcgorICogc3BhY2UgYWxsb2NhdGlvbiB0cmFuc2FjdGlvbnMgd2hpY2ggY2FuIHVuZG8gbm9uLXRyYW5zYWN0aW9uYWwgY2hhbmdlcworICogYWZ0ZXIgYSBjcmFzaC4gV3JpdGVzIHRvIGEgZmlsZSB3aXRoIHNwYWNlCisgKiBhbHJlYWR5IGFsbG9jYXRlZCBkbyBub3QgcmVzdWx0IGluIGFueSB0cmFuc2FjdGlvbnMuIEFsbG9jYXRpb25zCisgKiBtaWdodCBpbmNsdWRlIHNwYWNlIGJleW9uZCB0aGUgRU9GLiBTbyBpZiB3ZSBqdXN0IHB1c2ggdGhlIEVPRiBhCisgKiBsaXR0bGUsIHRoZSBsYXN0IHRyYW5zYWN0aW9uIGZvciB0aGUgZmlsZSBjb3VsZCBjb250YWluIHRoZSB3cm9uZworICogc2l6ZS4gSWYgdGhlcmUgaXMgbm8gZmlsZSBzeXN0ZW0gYWN0aXZpdHksIGFmdGVyIGFuIGFsbG9jYXRpb24KKyAqIHRyYW5zYWN0aW9uLCBhbmQgdGhlIHN5c3RlbSBjcmFzaGVzLCB0aGUgYWxsb2NhdGlvbiB0cmFuc2FjdGlvbgorICogd2lsbCBnZXQgcmVwbGF5ZWQgYW5kIHRoZSBmaWxlIHdpbGwgYmUgdHJ1bmNhdGVkLiBUaGlzIGNvdWxkCisgKiBiZSBob3Vycy9kYXlzLy4uLiBhZnRlciB0aGUgYWxsb2NhdGlvbiBvY2N1cnJlZC4KKyAqCisgKiBUaGUgZml4IGZvciB0aGlzIGlzIHRvIGRvIHR3byBkdW1teSB0cmFuc2FjdGlvbnMgd2hlbiB0aGUKKyAqIHN5c3RlbSBpcyBpZGxlLiBXZSBuZWVkIHR3byBkdW1teSB0cmFuc2FjdGlvbiBiZWNhdXNlIHRoZSBoX3RhaWxfbHNuCisgKiBpbiB0aGUgbG9nIHJlY29yZCBoZWFkZXIgbmVlZHMgdG8gcG9pbnQgYmV5b25kIHRoZSBsYXN0IHBvc3NpYmxlCisgKiBub24tZHVtbXkgdHJhbnNhY3Rpb24uIFRoZSBmaXJzdCBkdW1teSBjaGFuZ2VzIHRoZSBoX3RhaWxfbHNuIHRvCisgKiB0aGUgZmlyc3QgdHJhbnNhY3Rpb24gYmVmb3JlIHRoZSBkdW1teS4gVGhlIHNlY29uZCBkdW1teSBjYXVzZXMKKyAqIGhfdGFpbF9sc24gdG8gcG9pbnQgdG8gdGhlIGZpcnN0IGR1bW15LiBSZWNvdmVyeSBzdGFydHMgYXQgaF90YWlsX2xzbi4KKyAqCisgKiBUaGVzZSBkdW1teSB0cmFuc2FjdGlvbnMgZ2V0IGNvbW1pdHRlZCB3aGVuIGV2ZXJ5dGhpbmcKKyAqIGlzIGlkbGUgKGFmdGVyIHRoZXJlIGhhcyBiZWVuIHNvbWUgYWN0aXZpdHkpLgorICoKKyAqIFRoZXJlIGFyZSA1IHN0YXRlcyB1c2VkIHRvIGNvbnRyb2wgdGhpcy4KKyAqCisgKiAgSURMRSAtLSBubyBsb2dnaW5nIGhhcyBiZWVuIGRvbmUgb24gdGhlIGZpbGUgc3lzdGVtIG9yCisgKgkJd2UgYXJlIGRvbmUgY292ZXJpbmcgcHJldmlvdXMgdHJhbnNhY3Rpb25zLgorICogIE5FRUQgLS0gbG9nZ2luZyBoYXMgb2NjdXJyZWQgYW5kIHdlIG5lZWQgYSBkdW1teSB0cmFuc2FjdGlvbgorICoJCXdoZW4gdGhlIGxvZyBiZWNvbWVzIGlkbGUuCisgKiAgRE9ORSAtLSB3ZSB3ZXJlIGluIHRoZSBORUVEIHN0YXRlIGFuZCBoYXZlIGNvbW1pdHRlZCBhIGR1bW15CisgKgkJdHJhbnNhY3Rpb24uCisgKiAgTkVFRDIgLS0gd2UgZGV0ZWN0ZWQgdGhhdCBhIGR1bW15IHRyYW5zYWN0aW9uIGhhcyBnb25lIHRvIHRoZQorICoJCW9uIGRpc2sgbG9nIHdpdGggbm8gb3RoZXIgdHJhbnNhY3Rpb25zLgorICogIERPTkUyIC0tIHdlIGNvbW1pdHRlZCBhIGR1bW15IHRyYW5zYWN0aW9uIHdoZW4gaW4gdGhlIE5FRUQyIHN0YXRlLgorICoKKyAqIFRoZXJlIGFyZSB0d28gcGxhY2VzIHdoZXJlIHdlIHN3aXRjaCBzdGF0ZXM6CisgKgorICogMS4pIEluIHhmc19zeW5jLCB3aGVuIHdlIGRldGVjdCBhbiBpZGxlIGxvZyBhbmQgYXJlIGluIE5FRUQgb3IgTkVFRDIuCisgKglXZSBjb21taXQgdGhlIGR1bW15IHRyYW5zYWN0aW9uIGFuZCBzd2l0Y2ggdG8gRE9ORSBvciBET05FMiwKKyAqCXJlc3BlY3RpdmVseS4gSW4gYWxsIG90aGVyIHN0YXRlcywgd2UgZG9uJ3QgZG8gYW55dGhpbmcuCisgKgorICogMi4pIFdoZW4gd2UgZmluaXNoIHdyaXRpbmcgdGhlIG9uLWRpc2sgbG9nICh4bG9nX3N0YXRlX2NsZWFuX2xvZykuCisgKgorICoJTm8gbWF0dGVyIHdoYXQgc3RhdGUgd2UgYXJlIGluLCBpZiB0aGlzIGlzbid0IHRoZSBkdW1teQorICoJdHJhbnNhY3Rpb24gZ29pbmcgb3V0LCB0aGUgbmV4dCBzdGF0ZSBpcyBORUVELgorICoJU28sIGlmIHdlIGFyZW4ndCBpbiB0aGUgRE9ORSBvciBET05FMiBzdGF0ZXMsIHRoZSBuZXh0IHN0YXRlCisgKglpcyBORUVELiBXZSBjYW4ndCBiZSBmaW5pc2hpbmcgYSB3cml0ZSBvZiB0aGUgZHVtbXkgcmVjb3JkCisgKgl1bmxlc3MgaXQgd2FzIGNvbW1pdHRlZCBhbmQgdGhlIHN0YXRlIHN3aXRjaGVkIHRvIERPTkUgb3IgRE9ORTIuCisgKgorICoJSWYgd2UgYXJlIGluIHRoZSBET05FIHN0YXRlIGFuZCB0aGlzIHdhcyBhIHdyaXRlIG9mIHRoZQorICoJCWR1bW15IHRyYW5zYWN0aW9uLCB3ZSBtb3ZlIHRvIE5FRUQyLgorICoKKyAqCUlmIHdlIGFyZSBpbiB0aGUgRE9ORTIgc3RhdGUgYW5kIHRoaXMgd2FzIGEgd3JpdGUgb2YgdGhlCisgKgkJZHVtbXkgdHJhbnNhY3Rpb24sIHdlIG1vdmUgdG8gSURMRS4KKyAqCisgKgorICogV3JpdGluZyBvbmx5IG9uZSBkdW1teSB0cmFuc2FjdGlvbiBjYW4gZ2V0IGFwcGVuZGVkIHRvCisgKiBvbmUgZmlsZSBzcGFjZSBhbGxvY2F0aW9uLiBXaGVuIHRoaXMgaGFwcGVucywgdGhlIGxvZyByZWNvdmVyeQorICogY29kZSByZXBsYXlzIHRoZSBzcGFjZSBhbGxvY2F0aW9uIGFuZCBhIGZpbGUgY291bGQgYmUgdHJ1bmNhdGVkLgorICogVGhpcyBpcyB3aHkgd2UgaGF2ZSB0aGUgTkVFRDIgYW5kIERPTkUyIHN0YXRlcyBiZWZvcmUgZ29pbmcgaWRsZS4KKyAqLworCisjZGVmaW5lIFhMT0dfU1RBVEVfQ09WRVJfSURMRQkwCisjZGVmaW5lIFhMT0dfU1RBVEVfQ09WRVJfTkVFRAkxCisjZGVmaW5lIFhMT0dfU1RBVEVfQ09WRVJfRE9ORQkyCisjZGVmaW5lIFhMT0dfU1RBVEVfQ09WRVJfTkVFRDIJMworI2RlZmluZSBYTE9HX1NUQVRFX0NPVkVSX0RPTkUyCTQKKworI2RlZmluZSBYTE9HX0NPVkVSX09QUwkJNQorCit0eXBlZGVmIHN0cnVjdCB4bG9nX3RpY2tldCB7CisJc3ZfdAkJICAgdF9zZW1hOwkgLyogc2xlZXAgb24gdGhpcyBzZW1hcGhvcmUJIDoyMCAqLworCXN0cnVjdCB4bG9nX3RpY2tldCAqdF9uZXh0OwkgLyoJCQkgICAgICAgICA6IDQgKi8KKwlzdHJ1Y3QgeGxvZ190aWNrZXQgKnRfcHJldjsJIC8qCQkJCSA6IDQgKi8KKwl4bG9nX3RpZF90CSAgIHRfdGlkOwkgLyogdHJhbnNhY3Rpb24gaWRlbnRpZmllcgkgOiA0ICovCisJaW50CQkgICB0X2N1cnJfcmVzOwkgLyogY3VycmVudCByZXNlcnZhdGlvbiBpbiBieXRlcyA6IDQgKi8KKwlpbnQJCSAgIHRfdW5pdF9yZXM7CSAvKiB1bml0IHJlc2VydmF0aW9uIGluIGJ5dGVzICAgIDogNCAqLworCV9fdWludDhfdAkgICB0X29jbnQ7CSAvKiBvcmlnaW5hbCBjb3VudAkJIDogMSAqLworCV9fdWludDhfdAkgICB0X2NudDsJIC8qIGN1cnJlbnQgY291bnQJCSA6IDEgKi8KKwlfX3VpbnQ4X3QJICAgdF9jbGllbnRpZDsJIC8qIHdobyBkb2VzIHRoaXMgYmVsb25nIHRvOwkgOiAxICovCisJX191aW50OF90CSAgIHRfZmxhZ3M7CSAvKiBwcm9wZXJ0aWVzIG9mIHJlc2VydmF0aW9uCSA6IDEgKi8KK30geGxvZ190aWNrZXRfdDsKKyNlbmRpZgorCisKK3R5cGVkZWYgc3RydWN0IHhsb2dfb3BfaGVhZGVyIHsKKwl4bG9nX3RpZF90IG9oX3RpZDsJLyogdHJhbnNhY3Rpb24gaWQgb2Ygb3BlcmF0aW9uCTogIDQgYiAqLworCWludAkgICBvaF9sZW47CS8qIGJ5dGVzIGluIGRhdGEgcmVnaW9uCQk6ICA0IGIgKi8KKwlfX3VpbnQ4X3QgIG9oX2NsaWVudGlkOwkvKiB3aG8gc2VudCBtZSB0aGlzCQk6ICAxIGIgKi8KKwlfX3VpbnQ4X3QgIG9oX2ZsYWdzOwkvKgkJCQk6ICAxIGIgKi8KKwl1c2hvcnQJICAgb2hfcmVzMjsJLyogMzIgYml0IGFsaWduCQkJOiAgMiBiICovCit9IHhsb2dfb3BfaGVhZGVyX3Q7CisKKworLyogdmFsaWQgdmFsdWVzIGZvciBoX2ZtdCAqLworI2RlZmluZSBYTE9HX0ZNVF9VTktOT1dOICAwCisjZGVmaW5lIFhMT0dfRk1UX0xJTlVYX0xFIDEKKyNkZWZpbmUgWExPR19GTVRfTElOVVhfQkUgMgorI2RlZmluZSBYTE9HX0ZNVF9JUklYX0JFICAzCisKKy8qIG91ciBmbXQgKi8KKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIFhMT0dfRk1UIFhMT0dfRk1UX0xJTlVYX0xFCisjZWxzZQorI2lmIF9fQllURV9PUkRFUiA9PSBfX0JJR19FTkRJQU4KKyNkZWZpbmUgWExPR19GTVQgWExPR19GTVRfTElOVVhfQkUKKyNlbHNlCisjZXJyb3IgdW5rbm93biBieXRlIG9yZGVyCisjZW5kaWYKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB4bG9nX3JlY19oZWFkZXIgeworCXVpbnQJICBoX21hZ2ljbm87CS8qIGxvZyByZWNvcmQgKExSKSBpZGVudGlmaWVyCQk6ICA0ICovCisJdWludAkgIGhfY3ljbGU7CS8qIHdyaXRlIGN5Y2xlIG9mIGxvZwkJCTogIDQgKi8KKwlpbnQJICBoX3ZlcnNpb247CS8qIExSIHZlcnNpb24JCQkJOiAgNCAqLworCWludAkgIGhfbGVuOwkvKiBsZW4gaW4gYnl0ZXM7IHNob3VsZCBiZSA2NC1iaXQgYWxpZ25lZDogNCAqLworCXhmc19sc25fdCBoX2xzbjsJLyogbHNuIG9mIHRoaXMgTFIJCQk6ICA4ICovCisJeGZzX2xzbl90IGhfdGFpbF9sc247CS8qIGxzbiBvZiAxc3QgTFIgdy8gYnVmZmVycyBub3QgY29tbWl0dGVkOiA4ICovCisJdWludAkgIGhfY2hrc3VtOwkvKiBtYXkgbm90IGJlIHVzZWQ7IG5vbi16ZXJvIGlmIHVzZWQJOiAgNCAqLworCWludAkgIGhfcHJldl9ibG9jazsgLyogYmxvY2sgbnVtYmVyIHRvIHByZXZpb3VzIExSCQk6ICA0ICovCisJaW50CSAgaF9udW1fbG9nb3BzOwkvKiBudW1iZXIgb2YgbG9nIG9wZXJhdGlvbnMgaW4gdGhpcyBMUgk6ICA0ICovCisJdWludAkgIGhfY3ljbGVfZGF0YVtYTE9HX0hFQURFUl9DWUNMRV9TSVpFIC8gQkJTSVpFXTsKKwkvKiBuZXcgZmllbGRzICovCisJaW50ICAgICAgIGhfZm10OyAgICAgICAgLyogZm9ybWF0IG9mIGxvZyByZWNvcmQgICAgICAgICAgICAgICAgIDogIDQgKi8KKwl1dWlkX3QgICAgaF9mc191dWlkOyAgICAvKiB1dWlkIG9mIEZTICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAxNiAqLworCWludCAgICAgICBoX3NpemU7CS8qIGljbG9nIHNpemUJCQkJOiAgNCAqLworfSB4bG9nX3JlY19oZWFkZXJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeGxvZ19yZWNfZXh0X2hlYWRlciB7CisJdWludAkgIHhoX2N5Y2xlOwkvKiB3cml0ZSBjeWNsZSBvZiBsb2cJCQk6IDQgKi8KKwl1aW50CSAgeGhfY3ljbGVfZGF0YVtYTE9HX0hFQURFUl9DWUNMRV9TSVpFIC8gQkJTSVpFXTsgLyoJOiAyNTYgKi8KK30geGxvZ19yZWNfZXh0X2hlYWRlcl90OworCisjaWZkZWYgX19LRVJORUxfXworLyoKKyAqIC0gQSBsb2cgcmVjb3JkIGhlYWRlciBpcyA1MTIgYnl0ZXMuICBUaGVyZSBpcyBwbGVudHkgb2Ygcm9vbSB0byBncm93IHRoZQorICoJeGxvZ19yZWNfaGVhZGVyX3QgaW50byB0aGUgcmVzZXJ2ZWQgc3BhY2UuCisgKiAtIGljX2RhdGEgZm9sbG93cywgc28gYSB3cml0ZSB0byBkaXNrIGNhbiBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG9mCisgKgl0aGUgaWNsb2cuCisgKiAtIGljX2ZvcmNlc2VtYSBpcyB1c2VkIHRvIGltcGxlbWVudCBzeW5jaHJvbm91cyBmb3JjaW5nIG9mIHRoZSBpY2xvZyB0byBkaXNrLgorICogLSBpY19uZXh0IGlzIHRoZSBwb2ludGVyIHRvIHRoZSBuZXh0IGljbG9nIGluIHRoZSByaW5nLgorICogLSBpY19icCBpcyBhIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB1c2VkIHRvIHdyaXRlIHRoaXMgaW5jb3JlIGxvZyB0byBkaXNrLgorICogLSBpY19sb2cgaXMgYSBwb2ludGVyIGJhY2sgdG8gdGhlIGdsb2JhbCBsb2cgc3RydWN0dXJlLgorICogLSBpY19jYWxsYmFjayBpcyBhIGxpbmtlZCBsaXN0IG9mIGNhbGxiYWNrIGZ1bmN0aW9uL2FyZ3VtZW50IHBhaXJzIHRvIGJlCisgKgljYWxsZWQgYWZ0ZXIgYW4gaWNsb2cgZmluaXNoZXMgd3JpdGluZy4KKyAqIC0gaWNfc2l6ZSBpcyB0aGUgZnVsbCBzaXplIG9mIHRoZSBoZWFkZXIgcGx1cyBkYXRhLgorICogLSBpY19vZmZzZXQgaXMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gaW4gdGhpcyBpY2xvZy4KKyAqIC0gaWNfcmVmY250IGlzIGJ1bXBlZCB3aGVuIHNvbWVvbmUgaXMgd3JpdGluZyB0byB0aGUgbG9nLgorICogLSBpY19zdGF0ZSBpcyB0aGUgc3RhdGUgb2YgdGhlIGljbG9nLgorICovCit0eXBlZGVmIHN0cnVjdCB4bG9nX2ljbG9nX2ZpZWxkcyB7CisJc3ZfdAkJCWljX2ZvcmNlc2VtYTsKKwlzdl90CQkJaWNfd3JpdGVzZW1hOworCXN0cnVjdCB4bG9nX2luX2NvcmUJKmljX25leHQ7CisJc3RydWN0IHhsb2dfaW5fY29yZQkqaWNfcHJldjsKKwlzdHJ1Y3QgeGZzX2J1ZgkJKmljX2JwOworCXN0cnVjdCBsb2cJCSppY19sb2c7CisJeGZzX2xvZ19jYWxsYmFja190CSppY19jYWxsYmFjazsKKwl4ZnNfbG9nX2NhbGxiYWNrX3QJKippY19jYWxsYmFja190YWlsOworI2lmZGVmIFhGU19MT0dfVFJBQ0UKKwlzdHJ1Y3Qga3RyYWNlCQkqaWNfdHJhY2U7CisjZW5kaWYKKwlpbnQJCQlpY19zaXplOworCWludAkJCWljX29mZnNldDsKKwlpbnQJCQlpY19yZWZjbnQ7CisJaW50CQkJaWNfYndyaXRlY250OworCXVzaG9ydF90CQlpY19zdGF0ZTsKKwljaGFyCQkJKmljX2RhdGFwOwkvKiBwb2ludGVyIHRvIGljbG9nIGRhdGEgKi8KK30geGxvZ19pY2xvZ19maWVsZHNfdDsKKwordHlwZWRlZiB1bmlvbiB4bG9nX2luX2NvcmUyIHsKKwl4bG9nX3JlY19oZWFkZXJfdAloaWNfaGVhZGVyOworCXhsb2dfcmVjX2V4dF9oZWFkZXJfdAloaWNfeGhlYWRlcjsKKwljaGFyCQkJaGljX3NlY3RvcltYTE9HX0hFQURFUl9TSVpFXTsKK30geGxvZ19pbl9jb3JlXzJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeGxvZ19pbl9jb3JlIHsKKwl4bG9nX2ljbG9nX2ZpZWxkc190CWhpY19maWVsZHM7CisJeGxvZ19pbl9jb3JlXzJfdAkqaGljX2RhdGE7Cit9IHhsb2dfaW5fY29yZV90OworCisvKgorICogRGVmaW5lcyB0byBzYXZlIG91ciBjb2RlIGZyb20gdGhpcyBnbG9wLgorICovCisjZGVmaW5lCWljX2ZvcmNlc2VtYQloaWNfZmllbGRzLmljX2ZvcmNlc2VtYQorI2RlZmluZSBpY193cml0ZXNlbWEJaGljX2ZpZWxkcy5pY193cml0ZXNlbWEKKyNkZWZpbmUJaWNfbmV4dAkJaGljX2ZpZWxkcy5pY19uZXh0CisjZGVmaW5lCWljX3ByZXYJCWhpY19maWVsZHMuaWNfcHJldgorI2RlZmluZQlpY19icAkJaGljX2ZpZWxkcy5pY19icAorI2RlZmluZQlpY19sb2cJCWhpY19maWVsZHMuaWNfbG9nCisjZGVmaW5lCWljX2NhbGxiYWNrCWhpY19maWVsZHMuaWNfY2FsbGJhY2sKKyNkZWZpbmUJaWNfY2FsbGJhY2tfdGFpbCBoaWNfZmllbGRzLmljX2NhbGxiYWNrX3RhaWwKKyNkZWZpbmUJaWNfdHJhY2UJaGljX2ZpZWxkcy5pY190cmFjZQorI2RlZmluZQlpY19zaXplCQloaWNfZmllbGRzLmljX3NpemUKKyNkZWZpbmUJaWNfb2Zmc2V0CWhpY19maWVsZHMuaWNfb2Zmc2V0CisjZGVmaW5lCWljX3JlZmNudAloaWNfZmllbGRzLmljX3JlZmNudAorI2RlZmluZQlpY19id3JpdGVjbnQJaGljX2ZpZWxkcy5pY19id3JpdGVjbnQKKyNkZWZpbmUJaWNfc3RhdGUJaGljX2ZpZWxkcy5pY19zdGF0ZQorI2RlZmluZSBpY19kYXRhcAloaWNfZmllbGRzLmljX2RhdGFwCisjZGVmaW5lIGljX2hlYWRlcgloaWNfZGF0YS0+aGljX2hlYWRlcgorCisvKgorICogVGhlIHJlc2VydmF0aW9uIGhlYWQgbHNuIGlzIG5vdCBtYWRlIHVwIG9mIGEgY3ljbGUgbnVtYmVyIGFuZCBibG9jayBudW1iZXIuCisgKiBJbnN0ZWFkLCBpdCB1c2VzIGEgY3ljbGUgbnVtYmVyIGFuZCBieXRlIG51bWJlci4gIExvZ3MgZG9uJ3QgZXhwZWN0IHRvCisgKiBvdmVyZmxvdyAzMSBiaXRzIHdvcnRoIG9mIGJ5dGUgb2Zmc2V0LCBzbyB1c2luZyBhIGJ5dGUgbnVtYmVyIHdpbGwgbWVhbgorICogdGhhdCByb3VuZCBvZmYgcHJvYmxlbXMgd29uJ3Qgb2NjdXIgd2hlbiByZWxlYXNpbmcgcGFydGlhbCByZXNlcnZhdGlvbnMuCisgKi8KK3R5cGVkZWYgc3RydWN0IGxvZyB7CisJLyogVGhlIGZvbGxvd2luZyBibG9jayBvZiBmaWVsZHMgYXJlIGNoYW5nZWQgd2hpbGUgaG9sZGluZyBpY2xvZ2xvY2sgKi8KKwlzZW1hX3QJCQlsX2ZsdXNoc2VtYTsgICAgLyogaWNsb2cgZmx1c2hpbmcgc2VtYXBob3JlICovCisJaW50CQkJbF9mbHVzaGNudDsJLyogIyBvZiBwcm9jcyB3YWl0aW5nIG9uIHRoaXMKKwkJCQkJCSAqIHNlbWEgKi8KKwlpbnQJCQlsX3RpY2tldF9jbnQ7CS8qIGZyZWUgdGlja2V0IGNvdW50ICovCisJaW50CQkJbF90aWNrZXRfdGNudDsJLyogdG90YWwgdGlja2V0IGNvdW50ICovCisJaW50CQkJbF9jb3ZlcmVkX3N0YXRlOy8qIHN0YXRlIG9mICJjb3ZlcmluZyBkaXNrCisJCQkJCQkgKiBsb2cgZW50cmllcyIgKi8KKwl4bG9nX3RpY2tldF90CQkqbF9mcmVlbGlzdDsgICAgLyogZnJlZSBsaXN0IG9mIHRpY2tldHMgKi8KKwl4bG9nX3RpY2tldF90CQkqbF91bm1vdW50X2ZyZWU7Lyoga21lbV9mcmVlIHRoZXNlIGFkZHJlc3NlcyAqLworCXhsb2dfdGlja2V0X3QJCSpsX3RhaWw7ICAgICAgICAvKiBmcmVlIGxpc3Qgb2YgdGlja2V0cyAqLworCXhsb2dfaW5fY29yZV90CQkqbF9pY2xvZzsgICAgICAgLyogaGVhZCBsb2cgcXVldWUJKi8KKwlsb2NrX3QJCQlsX2ljbG9nbG9jazsgICAgLyogZ3JhYiB0byBjaGFuZ2UgaWNsb2cgc3RhdGUgKi8KKwl4ZnNfbHNuX3QJCWxfdGFpbF9sc247ICAgICAvKiBsc24gb2YgMXN0IExSIHdpdGggdW5mbHVzaGVkCisJCQkJCQkgKiBidWZmZXJzICovCisJeGZzX2xzbl90CQlsX2xhc3Rfc3luY19sc247LyogbHNuIG9mIGxhc3QgTFIgb24gZGlzayAqLworCXN0cnVjdCB4ZnNfbW91bnQJKmxfbXA7CSAgICAgICAgLyogbW91bnQgcG9pbnQgKi8KKwlzdHJ1Y3QgeGZzX2J1ZgkJKmxfeGJ1ZjsgICAgICAgIC8qIGV4dHJhIGJ1ZmZlciBmb3IgbG9nCisJCQkJCQkgKiB3cmFwcGluZyAqLworCXN0cnVjdCB4ZnNfYnVmdGFyZwkqbF90YXJnOyAgICAgICAgLyogYnVmdGFyZyBvZiBsb2cgKi8KKwl4ZnNfZGFkZHJfdAkJbF9sb2dCQnN0YXJ0OyAgIC8qIHN0YXJ0IGJsb2NrIG9mIGxvZyAqLworCWludAkJCWxfbG9nc2l6ZTsgICAgICAvKiBzaXplIG9mIGxvZyBpbiBieXRlcyAqLworCWludAkJCWxfbG9nQkJzaXplOyAgICAvKiBzaXplIG9mIGxvZyBpbiBCQiBjaHVua3MgKi8KKwlpbnQJCQlsX2N1cnJfY3ljbGU7ICAgLyogQ3ljbGUgbnVtYmVyIG9mIGxvZyB3cml0ZXMgKi8KKwlpbnQJCQlsX3ByZXZfY3ljbGU7ICAgLyogQ3ljbGUgbnVtYmVyIGJlZm9yZSBsYXN0CisJCQkJCQkgKiBibG9jayBpbmNyZW1lbnQgKi8KKwlpbnQJCQlsX2N1cnJfYmxvY2s7ICAgLyogY3VycmVudCBsb2dpY2FsIGxvZyBibG9jayAqLworCWludAkJCWxfcHJldl9ibG9jazsgICAvKiBwcmV2aW91cyBsb2dpY2FsIGxvZyBibG9jayAqLworCWludAkJCWxfaWNsb2dfc2l6ZTsJLyogc2l6ZSBvZiBsb2cgaW4gYnl0ZXMgKi8KKwlpbnQJCQlsX2ljbG9nX3NpemVfbG9nOyAvKiBsb2cgcG93ZXIgc2l6ZSBvZiBsb2cgKi8KKwlpbnQJCQlsX2ljbG9nX2J1ZnM7CS8qIG51bWJlciBvZiBpY2xvZyBidWZmZXJzICovCisKKwkvKiBUaGUgZm9sbG93aW5nIGZpZWxkIGFyZSB1c2VkIGZvciBkZWJ1Z2dpbmc7IG5lZWQgdG8gaG9sZCBpY2xvZ2xvY2sgKi8KKwljaGFyCQkJKmxfaWNsb2dfYmFrW1hMT0dfTUFYX0lDTE9HU107CisKKwkvKiBUaGUgZm9sbG93aW5nIGJsb2NrIG9mIGZpZWxkcyBhcmUgY2hhbmdlZCB3aGlsZSBob2xkaW5nIGdyYW50X2xvY2sgKi8KKwlsb2NrX3QJCQlsX2dyYW50X2xvY2s7CisJeGxvZ190aWNrZXRfdAkJKmxfcmVzZXJ2ZV9oZWFkcTsKKwl4bG9nX3RpY2tldF90CQkqbF93cml0ZV9oZWFkcTsKKwlpbnQJCQlsX2dyYW50X3Jlc2VydmVfY3ljbGU7CisJaW50CQkJbF9ncmFudF9yZXNlcnZlX2J5dGVzOworCWludAkJCWxfZ3JhbnRfd3JpdGVfY3ljbGU7CisJaW50CQkJbF9ncmFudF93cml0ZV9ieXRlczsKKworCS8qIFRoZSBmb2xsb3dpbmcgZmllbGRzIGRvbid0IG5lZWQgbG9ja2luZyAqLworI2lmZGVmIFhGU19MT0dfVFJBQ0UKKwlzdHJ1Y3Qga3RyYWNlCQkqbF90cmFjZTsKKwlzdHJ1Y3Qga3RyYWNlCQkqbF9ncmFudF90cmFjZTsKKyNlbmRpZgorCXVpbnQJCQlsX2ZsYWdzOworCXVpbnQJCQlsX3F1b3Rhb2Zmc19mbGFnOyAvKiBYRlNfRFFfKiwgZm9yIFFVT1RBT0ZGcyAqLworCXN0cnVjdCB4ZnNfYnVmX2NhbmNlbAkqKmxfYnVmX2NhbmNlbF90YWJsZTsKKwlpbnQJCQlsX2ljbG9nX2hzaXplOyAgLyogc2l6ZSBvZiBpY2xvZyBoZWFkZXIgKi8KKwlpbnQJCQlsX2ljbG9nX2hlYWRzOyAgLyogIyBvZiBpY2xvZyBoZWFkZXIgc2VjdG9ycyAqLworCXVpbnQJCQlsX3NlY3RiYl9sb2c7ICAgLyogbG9nMiBvZiBzZWN0b3Igc2l6ZSBpbiBCQnMgKi8KKwl1aW50CQkJbF9zZWN0YmJfbWFzazsgIC8qIHNlY3RvciBzaXplIChpbiBCQnMpCisJCQkJCQkgKiBhbGlnbm1lbnQgbWFzayAqLworfSB4bG9nX3Q7CisKKworLyogY29tbW9uIHJvdXRpbmVzICovCitleHRlcm4geGZzX2xzbl90IHhsb2dfYXNzaWduX3RhaWxfbHNuKHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKK2V4dGVybiBpbnQJIHhsb2dfZmluZF9oZWFkKHhsb2dfdCAqbG9nLCB4ZnNfZGFkZHJfdCAqaGVhZF9ibGspOworZXh0ZXJuIGludAkgeGxvZ19maW5kX3RhaWwoeGxvZ190CSpsb2csCisJCQkJeGZzX2RhZGRyX3QgKmhlYWRfYmxrLAorCQkJCXhmc19kYWRkcl90ICp0YWlsX2JsaywKKwkJCQlpbnQgcmVhZG9ubHkpOworZXh0ZXJuIGludAkgeGxvZ19yZWNvdmVyKHhsb2dfdCAqbG9nLCBpbnQgcmVhZG9ubHkpOworZXh0ZXJuIGludAkgeGxvZ19yZWNvdmVyX2ZpbmlzaCh4bG9nX3QgKmxvZywgaW50IG1mc2lfZmxhZ3MpOworZXh0ZXJuIHZvaWQJIHhsb2dfcGFja19kYXRhKHhsb2dfdCAqbG9nLCB4bG9nX2luX2NvcmVfdCAqaWNsb2csIGludCk7CitleHRlcm4gdm9pZAkgeGxvZ19yZWNvdmVyX3Byb2Nlc3NfaXVubGlua3MoeGxvZ190ICpsb2cpOworCitleHRlcm4gc3RydWN0IHhmc19idWYgKnhsb2dfZ2V0X2JwKHhsb2dfdCAqLCBpbnQpOworZXh0ZXJuIHZvaWQJIHhsb2dfcHV0X2JwKHN0cnVjdCB4ZnNfYnVmICopOworZXh0ZXJuIGludAkgeGxvZ19icmVhZCh4bG9nX3QgKiwgeGZzX2RhZGRyX3QsIGludCwgc3RydWN0IHhmc19idWYgKik7CitleHRlcm4geGZzX2NhZGRyX3QgeGxvZ19hbGlnbih4bG9nX3QgKiwgeGZzX2RhZGRyX3QsIGludCwgc3RydWN0IHhmc19idWYgKik7CisKKy8qIGljbG9nIHRyYWNpbmcgKi8KKyNkZWZpbmUgWExPR19UUkFDRV9HUkFCX0ZMVVNIICAxCisjZGVmaW5lIFhMT0dfVFJBQ0VfUkVMX0ZMVVNIICAgMgorI2RlZmluZSBYTE9HX1RSQUNFX1NMRUVQX0ZMVVNIIDMKKyNkZWZpbmUgWExPR19UUkFDRV9XQUtFX0ZMVVNIICA0CisKKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZgkvKiBfX1hGU19MT0dfUFJJVl9IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbG9nX3JlY292ZXIuYyBiL2ZzL3hmcy94ZnNfbG9nX3JlY292ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODI0YjViCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19sb2dfcmVjb3Zlci5jCkBAIC0wLDAgKzEsNDA5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19hbGxvYy5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbWFwLmgiCisjaW5jbHVkZSAieGZzX2lub2RlX2l0ZW0uaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvYy5oIgorI2luY2x1ZGUgInhmc19sb2dfcHJpdi5oIgorI2luY2x1ZGUgInhmc19idWZfaXRlbS5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19sb2dfcmVjb3Zlci5oIgorI2luY2x1ZGUgInhmc19leHRmcmVlX2l0ZW0uaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnNfcHJpdi5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKKyNpbmNsdWRlICJ4ZnNfcXVvdGEuaCIKKyNpbmNsdWRlICJ4ZnNfcncuaCIKKworU1RBVElDIGludAl4bG9nX2ZpbmRfemVyb2VkKHhsb2dfdCAqLCB4ZnNfZGFkZHJfdCAqKTsKK1NUQVRJQyBpbnQJeGxvZ19jbGVhcl9zdGFsZV9ibG9ja3MoeGxvZ190ICosIHhmc19sc25fdCk7CitTVEFUSUMgdm9pZAl4bG9nX3JlY292ZXJfaW5zZXJ0X2l0ZW1fYmFja3EoeGxvZ19yZWNvdmVyX2l0ZW1fdCAqKnEsCisJCQkJCSAgICAgICB4bG9nX3JlY292ZXJfaXRlbV90ICppdGVtKTsKKyNpZiBkZWZpbmVkKERFQlVHKQorU1RBVElDIHZvaWQJeGxvZ19yZWNvdmVyX2NoZWNrX3N1bW1hcnkoeGxvZ190ICopOworU1RBVElDIHZvaWQJeGxvZ19yZWNvdmVyX2NoZWNrX2FpbCh4ZnNfbW91bnRfdCAqLCB4ZnNfbG9nX2l0ZW1fdCAqLCBpbnQpOworI2Vsc2UKKyNkZWZpbmUJeGxvZ19yZWNvdmVyX2NoZWNrX3N1bW1hcnkobG9nKQorI2RlZmluZQl4bG9nX3JlY292ZXJfY2hlY2tfYWlsKG1wLCBsaXAsIGdlbikKKyNlbmRpZgorCisKKy8qCisgKiBTZWN0b3IgYWxpZ25lZCBidWZmZXIgcm91dGluZXMgZm9yIGJ1ZmZlciBjcmVhdGUvcmVhZC93cml0ZS9hY2Nlc3MKKyAqLworCisjZGVmaW5lIFhMT0dfU0VDVE9SX1JPVU5EVVBfQkJDT1VOVChsb2csIGJicykJXAorCSggKChsb2cpLT5sX3NlY3RiYl9tYXNrICYmIChiYnMgJiAobG9nKS0+bF9zZWN0YmJfbWFzaykpID8gXAorCSgoYmJzICsgKGxvZyktPmxfc2VjdGJiX21hc2sgKyAxKSAmIH4obG9nKS0+bF9zZWN0YmJfbWFzaykgOiAoYmJzKSApCisjZGVmaW5lIFhMT0dfU0VDVE9SX1JPVU5ERE9XTl9CTEtOTyhsb2csIGJubykJKChibm8pICYgfihsb2cpLT5sX3NlY3RiYl9tYXNrKQorCit4ZnNfYnVmX3QgKgoreGxvZ19nZXRfYnAoCisJeGxvZ190CQkqbG9nLAorCWludAkJbnVtX2JibGtzKQoreworCUFTU0VSVChudW1fYmJsa3MgPiAwKTsKKworCWlmIChsb2ctPmxfc2VjdGJiX2xvZykgeworCQlpZiAobnVtX2JibGtzID4gMSkKKwkJCW51bV9iYmxrcyArPSBYTE9HX1NFQ1RPUl9ST1VORFVQX0JCQ09VTlQobG9nLCAxKTsKKwkJbnVtX2JibGtzID0gWExPR19TRUNUT1JfUk9VTkRVUF9CQkNPVU5UKGxvZywgbnVtX2JibGtzKTsKKwl9CisJcmV0dXJuIHhmc19idWZfZ2V0X25vYWRkcihCQlRPQihudW1fYmJsa3MpLCBsb2ctPmxfbXAtPm1fbG9nZGV2X3RhcmdwKTsKK30KKwordm9pZAoreGxvZ19wdXRfYnAoCisJeGZzX2J1Zl90CSpicCkKK3sKKwl4ZnNfYnVmX2ZyZWUoYnApOworfQorCisKKy8qCisgKiBuYmJsa3Mgc2hvdWxkIGJlIHVpbnQsIGJ1dCBvaCB3ZWxsLiAgSnVzdCB3YW50IHRvIGNhdGNoIHRoYXQgMzItYml0IGxlbmd0aC4KKyAqLworaW50Cit4bG9nX2JyZWFkKAorCXhsb2dfdAkJKmxvZywKKwl4ZnNfZGFkZHJfdAlibGtfbm8sCisJaW50CQluYmJsa3MsCisJeGZzX2J1Zl90CSpicCkKK3sKKwlpbnQJCWVycm9yOworCisJaWYgKGxvZy0+bF9zZWN0YmJfbG9nKSB7CisJCWJsa19ubyA9IFhMT0dfU0VDVE9SX1JPVU5ERE9XTl9CTEtOTyhsb2csIGJsa19ubyk7CisJCW5iYmxrcyA9IFhMT0dfU0VDVE9SX1JPVU5EVVBfQkJDT1VOVChsb2csIG5iYmxrcyk7CisJfQorCisJQVNTRVJUKG5iYmxrcyA+IDApOworCUFTU0VSVChCQlRPQihuYmJsa3MpIDw9IFhGU19CVUZfU0laRShicCkpOworCUFTU0VSVChicCk7CisKKwlYRlNfQlVGX1NFVF9BRERSKGJwLCBsb2ctPmxfbG9nQkJzdGFydCArIGJsa19ubyk7CisJWEZTX0JVRl9SRUFEKGJwKTsKKwlYRlNfQlVGX0JVU1koYnApOworCVhGU19CVUZfU0VUX0NPVU5UKGJwLCBCQlRPQihuYmJsa3MpKTsKKwlYRlNfQlVGX1NFVF9UQVJHRVQoYnAsIGxvZy0+bF9tcC0+bV9sb2dkZXZfdGFyZ3ApOworCisJeGZzYmRzdHJhdChsb2ctPmxfbXAsIGJwKTsKKwlpZiAoKGVycm9yID0geGZzX2lvd2FpdChicCkpKQorCQl4ZnNfaW9lcnJvcl9hbGVydCgieGxvZ19icmVhZCIsIGxvZy0+bF9tcCwKKwkJCQkgIGJwLCBYRlNfQlVGX0FERFIoYnApKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBXcml0ZSBvdXQgdGhlIGJ1ZmZlciBhdCB0aGUgZ2l2ZW4gYmxvY2sgZm9yIHRoZSBnaXZlbiBudW1iZXIgb2YgYmxvY2tzLgorICogVGhlIGJ1ZmZlciBpcyBrZXB0IGxvY2tlZCBhY3Jvc3MgdGhlIHdyaXRlIGFuZCBpcyByZXR1cm5lZCBsb2NrZWQuCisgKiBUaGlzIGNhbiBvbmx5IGJlIHVzZWQgZm9yIHN5bmNocm9ub3VzIGxvZyB3cml0ZXMuCisgKi8KK2ludAoreGxvZ19id3JpdGUoCisJeGxvZ190CQkqbG9nLAorCXhmc19kYWRkcl90CWJsa19ubywKKwlpbnQJCW5iYmxrcywKKwl4ZnNfYnVmX3QJKmJwKQoreworCWludAkJZXJyb3I7CisKKwlpZiAobG9nLT5sX3NlY3RiYl9sb2cpIHsKKwkJYmxrX25vID0gWExPR19TRUNUT1JfUk9VTkRET1dOX0JMS05PKGxvZywgYmxrX25vKTsKKwkJbmJibGtzID0gWExPR19TRUNUT1JfUk9VTkRVUF9CQkNPVU5UKGxvZywgbmJibGtzKTsKKwl9CisKKwlBU1NFUlQobmJibGtzID4gMCk7CisJQVNTRVJUKEJCVE9CKG5iYmxrcykgPD0gWEZTX0JVRl9TSVpFKGJwKSk7CisKKwlYRlNfQlVGX1NFVF9BRERSKGJwLCBsb2ctPmxfbG9nQkJzdGFydCArIGJsa19ubyk7CisJWEZTX0JVRl9aRVJPRkxBR1MoYnApOworCVhGU19CVUZfQlVTWShicCk7CisJWEZTX0JVRl9IT0xEKGJwKTsKKwlYRlNfQlVGX1BTRU1BKGJwLCBQUklCSU8pOworCVhGU19CVUZfU0VUX0NPVU5UKGJwLCBCQlRPQihuYmJsa3MpKTsKKwlYRlNfQlVGX1NFVF9UQVJHRVQoYnAsIGxvZy0+bF9tcC0+bV9sb2dkZXZfdGFyZ3ApOworCisJaWYgKChlcnJvciA9IHhmc19id3JpdGUobG9nLT5sX21wLCBicCkpKQorCQl4ZnNfaW9lcnJvcl9hbGVydCgieGxvZ19id3JpdGUiLCBsb2ctPmxfbXAsCisJCQkJICBicCwgWEZTX0JVRl9BRERSKGJwKSk7CisJcmV0dXJuIGVycm9yOworfQorCit4ZnNfY2FkZHJfdAoreGxvZ19hbGlnbigKKwl4bG9nX3QJCSpsb2csCisJeGZzX2RhZGRyX3QJYmxrX25vLAorCWludAkJbmJibGtzLAorCXhmc19idWZfdAkqYnApCit7CisJeGZzX2NhZGRyX3QJcHRyOworCisJaWYgKCFsb2ctPmxfc2VjdGJiX2xvZykKKwkJcmV0dXJuIFhGU19CVUZfUFRSKGJwKTsKKworCXB0ciA9IFhGU19CVUZfUFRSKGJwKSArIEJCVE9CKChpbnQpYmxrX25vICYgbG9nLT5sX3NlY3RiYl9tYXNrKTsKKwlBU1NFUlQoWEZTX0JVRl9TSVpFKGJwKSA+PQorCQlCQlRPQihuYmJsa3MgKyAoYmxrX25vICYgbG9nLT5sX3NlY3RiYl9tYXNrKSkpOworCXJldHVybiBwdHI7Cit9CisKKyNpZmRlZiBERUJVRworLyoKKyAqIGR1bXAgZGVidWcgc3VwZXJibG9jayBhbmQgbG9nIHJlY29yZCBpbmZvcm1hdGlvbgorICovCitTVEFUSUMgdm9pZAoreGxvZ19oZWFkZXJfY2hlY2tfZHVtcCgKKwl4ZnNfbW91bnRfdAkJKm1wLAorCXhsb2dfcmVjX2hlYWRlcl90CSpoZWFkKQoreworCWludAkJCWI7CisKKwlwcmludGsoIiVzOiAgU0IgOiB1dWlkID0gIiwgX19GVU5DVElPTl9fKTsKKwlmb3IgKGIgPSAwOyBiIDwgMTY7IGIrKykKKwkJcHJpbnRrKCIlMDJ4IiwoKHVuc2lnbmVkIGNoYXIgKikmbXAtPm1fc2Iuc2JfdXVpZClbYl0pOworCXByaW50aygiLCBmbXQgPSAlZFxuIiwgWExPR19GTVQpOworCXByaW50aygiICAgIGxvZyA6IHV1aWQgPSAiKTsKKwlmb3IgKGIgPSAwOyBiIDwgMTY7IGIrKykKKwkJcHJpbnRrKCIlMDJ4IiwoKHVuc2lnbmVkIGNoYXIgKikmaGVhZC0+aF9mc191dWlkKVtiXSk7CisJcHJpbnRrKCIsIGZtdCA9ICVkXG4iLCBJTlRfR0VUKGhlYWQtPmhfZm10LCBBUkNIX0NPTlZFUlQpKTsKK30KKyNlbHNlCisjZGVmaW5lIHhsb2dfaGVhZGVyX2NoZWNrX2R1bXAobXAsIGhlYWQpCisjZW5kaWYKKworLyoKKyAqIGNoZWNrIGxvZyByZWNvcmQgaGVhZGVyIGZvciByZWNvdmVyeQorICovCitTVEFUSUMgaW50Cit4bG9nX2hlYWRlcl9jaGVja19yZWNvdmVyKAorCXhmc19tb3VudF90CQkqbXAsCisJeGxvZ19yZWNfaGVhZGVyX3QJKmhlYWQpCit7CisJQVNTRVJUKElOVF9HRVQoaGVhZC0+aF9tYWdpY25vLCBBUkNIX0NPTlZFUlQpID09IFhMT0dfSEVBREVSX01BR0lDX05VTSk7CisKKwkvKgorCSAqIElSSVggZG9lc24ndCB3cml0ZSB0aGUgaF9mbXQgZmllbGQgYW5kIGxlYXZlcyBpdCB6ZXJvZWQKKwkgKiAoWExPR19GTVRfVU5LTk9XTikuIFRoaXMgc3RvcHMgdXMgZnJvbSB0cnlpbmcgdG8gcmVjb3ZlcgorCSAqIGEgZGlydHkgbG9nIGNyZWF0ZWQgaW4gSVJJWC4KKwkgKi8KKwlpZiAodW5saWtlbHkoSU5UX0dFVChoZWFkLT5oX2ZtdCwgQVJDSF9DT05WRVJUKSAhPSBYTE9HX0ZNVCkpIHsKKwkJeGxvZ193YXJuKAorCSJYRlM6IGRpcnR5IGxvZyB3cml0dGVuIGluIGluY29tcGF0aWJsZSBmb3JtYXQgLSBjYW4ndCByZWNvdmVyIik7CisJCXhsb2dfaGVhZGVyX2NoZWNrX2R1bXAobXAsIGhlYWQpOworCQlYRlNfRVJST1JfUkVQT1JUKCJ4bG9nX2hlYWRlcl9jaGVja19yZWNvdmVyKDEpIiwKKwkJCQkgWEZTX0VSUkxFVkVMX0hJR0gsIG1wKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCX0gZWxzZSBpZiAodW5saWtlbHkoIXV1aWRfZXF1YWwoJm1wLT5tX3NiLnNiX3V1aWQsICZoZWFkLT5oX2ZzX3V1aWQpKSkgeworCQl4bG9nX3dhcm4oCisJIlhGUzogZGlydHkgbG9nIGVudHJ5IGhhcyBtaXNtYXRjaGVkIHV1aWQgLSBjYW4ndCByZWNvdmVyIik7CisJCXhsb2dfaGVhZGVyX2NoZWNrX2R1bXAobXAsIGhlYWQpOworCQlYRlNfRVJST1JfUkVQT1JUKCJ4bG9nX2hlYWRlcl9jaGVja19yZWNvdmVyKDIpIiwKKwkJCQkgWEZTX0VSUkxFVkVMX0hJR0gsIG1wKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHJlYWQgdGhlIGhlYWQgYmxvY2sgb2YgdGhlIGxvZyBhbmQgY2hlY2sgdGhlIGhlYWRlcgorICovCitTVEFUSUMgaW50Cit4bG9nX2hlYWRlcl9jaGVja19tb3VudCgKKwl4ZnNfbW91bnRfdAkJKm1wLAorCXhsb2dfcmVjX2hlYWRlcl90CSpoZWFkKQoreworCUFTU0VSVChJTlRfR0VUKGhlYWQtPmhfbWFnaWNubywgQVJDSF9DT05WRVJUKSA9PSBYTE9HX0hFQURFUl9NQUdJQ19OVU0pOworCisJaWYgKHV1aWRfaXNfbmlsKCZoZWFkLT5oX2ZzX3V1aWQpKSB7CisJCS8qCisJCSAqIElSSVggZG9lc24ndCB3cml0ZSB0aGUgaF9mc191dWlkIG9yIGhfZm10IGZpZWxkcy4gSWYKKwkJICogaF9mc191dWlkIGlzIG5pbCwgd2UgYXNzdW1lIHRoaXMgbG9nIHdhcyBsYXN0IG1vdW50ZWQKKwkJICogYnkgSVJJWCBhbmQgY29udGludWUuCisJCSAqLworCQl4bG9nX3dhcm4oIlhGUzogbmlsIHV1aWQgaW4gbG9nIC0gSVJJWCBzdHlsZSBsb2ciKTsKKwl9IGVsc2UgaWYgKHVubGlrZWx5KCF1dWlkX2VxdWFsKCZtcC0+bV9zYi5zYl91dWlkLCAmaGVhZC0+aF9mc191dWlkKSkpIHsKKwkJeGxvZ193YXJuKCJYRlM6IGxvZyBoYXMgbWlzbWF0Y2hlZCB1dWlkIC0gY2FuJ3QgcmVjb3ZlciIpOworCQl4bG9nX2hlYWRlcl9jaGVja19kdW1wKG1wLCBoZWFkKTsKKwkJWEZTX0VSUk9SX1JFUE9SVCgieGxvZ19oZWFkZXJfY2hlY2tfbW91bnQiLAorCQkJCSBYRlNfRVJSTEVWRUxfSElHSCwgbXApOworCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJfQorCXJldHVybiAwOworfQorCitTVEFUSUMgdm9pZAoreGxvZ19yZWNvdmVyX2lvZG9uZSgKKwlzdHJ1Y3QgeGZzX2J1ZgkqYnApCit7CisJeGZzX21vdW50X3QJKm1wOworCisJQVNTRVJUKFhGU19CVUZfRlNQUklWQVRFKGJwLCB2b2lkICopKTsKKworCWlmIChYRlNfQlVGX0dFVEVSUk9SKGJwKSkgeworCQkvKgorCQkgKiBXZSdyZSBub3QgZ29pbmcgdG8gYm90aGVyIGFib3V0IHJldHJ5aW5nCisJCSAqIHRoaXMgZHVyaW5nIHJlY292ZXJ5LiBPbmUgc3RyaWtlIQorCQkgKi8KKwkJbXAgPSBYRlNfQlVGX0ZTUFJJVkFURShicCwgeGZzX21vdW50X3QgKik7CisJCXhmc19pb2Vycm9yX2FsZXJ0KCJ4bG9nX3JlY292ZXJfaW9kb25lIiwKKwkJCQkgIG1wLCBicCwgWEZTX0JVRl9BRERSKGJwKSk7CisJCXhmc19mb3JjZV9zaHV0ZG93bihtcCwgWEZTX01FVEFEQVRBX0lPX0VSUk9SKTsKKwl9CisJWEZTX0JVRl9TRVRfRlNQUklWQVRFKGJwLCBOVUxMKTsKKwlYRlNfQlVGX0NMUl9JT0RPTkVfRlVOQyhicCk7CisJeGZzX2Jpb2RvbmUoYnApOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGZpbmRzICh0byBhbiBhcHByb3hpbWF0aW9uKSB0aGUgZmlyc3QgYmxvY2sgaW4gdGhlIHBoeXNpY2FsCisgKiBsb2cgd2hpY2ggY29udGFpbnMgdGhlIGdpdmVuIGN5Y2xlLiAgSXQgdXNlcyBhIGJpbmFyeSBzZWFyY2ggYWxnb3JpdGhtLgorICogTm90ZSB0aGF0IHRoZSBhbGdvcml0aG0gY2FuIG5vdCBiZSBwZXJmZWN0IGJlY2F1c2UgdGhlIGRpc2sgd2lsbCBub3QKKyAqIG5lY2Vzc2FyaWx5IGJlIHBlcmZlY3QuCisgKi8KK2ludAoreGxvZ19maW5kX2N5Y2xlX3N0YXJ0KAorCXhsb2dfdAkJKmxvZywKKwl4ZnNfYnVmX3QJKmJwLAorCXhmc19kYWRkcl90CWZpcnN0X2JsaywKKwl4ZnNfZGFkZHJfdAkqbGFzdF9ibGssCisJdWludAkJY3ljbGUpCit7CisJeGZzX2NhZGRyX3QJb2Zmc2V0OworCXhmc19kYWRkcl90CW1pZF9ibGs7CisJdWludAkJbWlkX2N5Y2xlOworCWludAkJZXJyb3I7CisKKwltaWRfYmxrID0gQkxLX0FWRyhmaXJzdF9ibGssICpsYXN0X2Jsayk7CisJd2hpbGUgKG1pZF9ibGsgIT0gZmlyc3RfYmxrICYmIG1pZF9ibGsgIT0gKmxhc3RfYmxrKSB7CisJCWlmICgoZXJyb3IgPSB4bG9nX2JyZWFkKGxvZywgbWlkX2JsaywgMSwgYnApKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJb2Zmc2V0ID0geGxvZ19hbGlnbihsb2csIG1pZF9ibGssIDEsIGJwKTsKKwkJbWlkX2N5Y2xlID0gR0VUX0NZQ0xFKG9mZnNldCwgQVJDSF9DT05WRVJUKTsKKwkJaWYgKG1pZF9jeWNsZSA9PSBjeWNsZSkgeworCQkJKmxhc3RfYmxrID0gbWlkX2JsazsKKwkJCS8qIGxhc3RfaGFsZl9jeWNsZSA9PSBtaWRfY3ljbGUgKi8KKwkJfSBlbHNlIHsKKwkJCWZpcnN0X2JsayA9IG1pZF9ibGs7CisJCQkvKiBmaXJzdF9oYWxmX2N5Y2xlID09IG1pZF9jeWNsZSAqLworCQl9CisJCW1pZF9ibGsgPSBCTEtfQVZHKGZpcnN0X2JsaywgKmxhc3RfYmxrKTsKKwl9CisJQVNTRVJUKChtaWRfYmxrID09IGZpcnN0X2JsayAmJiBtaWRfYmxrKzEgPT0gKmxhc3RfYmxrKSB8fAorCSAgICAgICAobWlkX2JsayA9PSAqbGFzdF9ibGsgJiYgbWlkX2Jsay0xID09IGZpcnN0X2JsaykpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDaGVjayB0aGF0IHRoZSByYW5nZSBvZiBibG9ja3MgZG9lcyBub3QgY29udGFpbiB0aGUgY3ljbGUgbnVtYmVyCisgKiBnaXZlbi4gIFRoZSBzY2FuIG5lZWRzIHRvIG9jY3VyIGZyb20gZnJvbnQgdG8gYmFjayBhbmQgdGhlIHB0ciBpbnRvIHRoZQorICogcmVnaW9uIG11c3QgYmUgdXBkYXRlZCBzaW5jZSBhIGxhdGVyIHJvdXRpbmUgd2lsbCBuZWVkIHRvIHBlcmZvcm0gYW5vdGhlcgorICogdGVzdC4gIElmIHRoZSByZWdpb24gaXMgY29tcGxldGVseSBnb29kLCB3ZSBlbmQgdXAgcmV0dXJuaW5nIHRoZSBzYW1lCisgKiBsYXN0IGJsb2NrIG51bWJlci4KKyAqCisgKiBTZXQgYmxrbm8gdG8gLTEgaWYgd2UgZW5jb3VudGVyIG5vIGVycm9ycy4gIFRoaXMgaXMgYW4gaW52YWxpZCBibG9jayBudW1iZXIKKyAqIHNpbmNlIHdlIGRvbid0IGV2ZXIgZXhwZWN0IGxvZ3MgdG8gZ2V0IHRoaXMgbGFyZ2UuCisgKi8KK1NUQVRJQyBpbnQKK3hsb2dfZmluZF92ZXJpZnlfY3ljbGUoCisJeGxvZ190CQkqbG9nLAorCXhmc19kYWRkcl90CXN0YXJ0X2JsaywKKwlpbnQJCW5iYmxrcywKKwl1aW50CQlzdG9wX29uX2N5Y2xlX25vLAorCXhmc19kYWRkcl90CSpuZXdfYmxrKQoreworCXhmc19kYWRkcl90CWksIGo7CisJdWludAkJY3ljbGU7CisJeGZzX2J1Zl90CSpicDsKKwl4ZnNfZGFkZHJfdAlidWZibGtzOworCXhmc19jYWRkcl90CWJ1ZiA9IE5VTEw7CisJaW50CQllcnJvciA9IDA7CisKKwlidWZibGtzID0gMSA8PCBmZnMobmJibGtzKTsKKworCXdoaWxlICghKGJwID0geGxvZ19nZXRfYnAobG9nLCBidWZibGtzKSkpIHsKKwkJLyogY2FuJ3QgZ2V0IGVub3VnaCBtZW1vcnkgdG8gZG8gZXZlcnl0aGluZyBpbiBvbmUgYmlnIGJ1ZmZlciAqLworCQlidWZibGtzID4+PSAxOworCQlpZiAoYnVmYmxrcyA8PSBsb2ctPmxfc2VjdGJiX2xvZykKKwkJCXJldHVybiBFTk9NRU07CisJfQorCisJZm9yIChpID0gc3RhcnRfYmxrOyBpIDwgc3RhcnRfYmxrICsgbmJibGtzOyBpICs9IGJ1ZmJsa3MpIHsKKwkJaW50CWJjb3VudDsKKworCQliY291bnQgPSBtaW4oYnVmYmxrcywgKHN0YXJ0X2JsayArIG5iYmxrcyAtIGkpKTsKKworCQlpZiAoKGVycm9yID0geGxvZ19icmVhZChsb2csIGksIGJjb3VudCwgYnApKSkKKwkJCWdvdG8gb3V0OworCisJCWJ1ZiA9IHhsb2dfYWxpZ24obG9nLCBpLCBiY291bnQsIGJwKTsKKwkJZm9yIChqID0gMDsgaiA8IGJjb3VudDsgaisrKSB7CisJCQljeWNsZSA9IEdFVF9DWUNMRShidWYsIEFSQ0hfQ09OVkVSVCk7CisJCQlpZiAoY3ljbGUgPT0gc3RvcF9vbl9jeWNsZV9ubykgeworCQkJCSpuZXdfYmxrID0gaStqOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlidWYgKz0gQkJTSVpFOworCQl9CisJfQorCisJKm5ld19ibGsgPSAtMTsKKworb3V0OgorCXhsb2dfcHV0X2JwKGJwKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBQb3RlbnRpYWxseSBiYWNrdXAgb3ZlciBwYXJ0aWFsIGxvZyByZWNvcmQgd3JpdGUuCisgKgorICogSW4gdGhlIHR5cGljYWwgY2FzZSwgbGFzdF9ibGsgaXMgdGhlIG51bWJlciBvZiB0aGUgYmxvY2sgZGlyZWN0bHkgYWZ0ZXIKKyAqIGEgZ29vZCBsb2cgcmVjb3JkLiAgVGhlcmVmb3JlLCB3ZSBzdWJ0cmFjdCBvbmUgdG8gZ2V0IHRoZSBibG9jayBudW1iZXIKKyAqIG9mIHRoZSBsYXN0IGJsb2NrIGluIHRoZSBnaXZlbiBidWZmZXIuICBleHRyYV9iYmxrcyBjb250YWlucyB0aGUgbnVtYmVyCisgKiBvZiBibG9ja3Mgd2Ugd291bGQgaGF2ZSByZWFkIG9uIGEgcHJldmlvdXMgcmVhZC4gIFRoaXMgaGFwcGVucyB3aGVuIHRoZQorICogbGFzdCBsb2cgcmVjb3JkIGlzIHNwbGl0IG92ZXIgdGhlIGVuZCBvZiB0aGUgcGh5c2ljYWwgbG9nLgorICoKKyAqIGV4dHJhX2JibGtzIGlzIHRoZSBudW1iZXIgb2YgYmxvY2tzIHBvdGVudGlhbGx5IHZlcmlmaWVkIG9uIGEgcHJldmlvdXMKKyAqIGNhbGwgdG8gdGhpcyByb3V0aW5lLgorICovCitTVEFUSUMgaW50Cit4bG9nX2ZpbmRfdmVyaWZ5X2xvZ19yZWNvcmQoCisJeGxvZ190CQkJKmxvZywKKwl4ZnNfZGFkZHJfdAkJc3RhcnRfYmxrLAorCXhmc19kYWRkcl90CQkqbGFzdF9ibGssCisJaW50CQkJZXh0cmFfYmJsa3MpCit7CisJeGZzX2RhZGRyX3QJCWk7CisJeGZzX2J1Zl90CQkqYnA7CisJeGZzX2NhZGRyX3QJCW9mZnNldCA9IE5VTEw7CisJeGxvZ19yZWNfaGVhZGVyX3QJKmhlYWQgPSBOVUxMOworCWludAkJCWVycm9yID0gMDsKKwlpbnQJCQlzbWFsbG1lbSA9IDA7CisJaW50CQkJbnVtX2Jsa3MgPSAqbGFzdF9ibGsgLSBzdGFydF9ibGs7CisJaW50CQkJeGhkcnM7CisKKwlBU1NFUlQoc3RhcnRfYmxrICE9IDAgfHwgKmxhc3RfYmxrICE9IHN0YXJ0X2Jsayk7CisKKwlpZiAoIShicCA9IHhsb2dfZ2V0X2JwKGxvZywgbnVtX2Jsa3MpKSkgeworCQlpZiAoIShicCA9IHhsb2dfZ2V0X2JwKGxvZywgMSkpKQorCQkJcmV0dXJuIEVOT01FTTsKKwkJc21hbGxtZW0gPSAxOworCX0gZWxzZSB7CisJCWlmICgoZXJyb3IgPSB4bG9nX2JyZWFkKGxvZywgc3RhcnRfYmxrLCBudW1fYmxrcywgYnApKSkKKwkJCWdvdG8gb3V0OworCQlvZmZzZXQgPSB4bG9nX2FsaWduKGxvZywgc3RhcnRfYmxrLCBudW1fYmxrcywgYnApOworCQlvZmZzZXQgKz0gKChudW1fYmxrcyAtIDEpIDw8IEJCU0hJRlQpOworCX0KKworCWZvciAoaSA9ICgqbGFzdF9ibGspIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJaWYgKGkgPCBzdGFydF9ibGspIHsKKwkJCS8qIHZhbGlkIGxvZyByZWNvcmQgbm90IGZvdW5kICovCisJCQl4bG9nX3dhcm4oCisJCSJYRlM6IExvZyBpbmNvbnNpc3RlbnQgKGRpZG4ndCBmaW5kIHByZXZpb3VzIGhlYWRlcikiKTsKKwkJCUFTU0VSVCgwKTsKKwkJCWVycm9yID0gWEZTX0VSUk9SKEVJTyk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChzbWFsbG1lbSkgeworCQkJaWYgKChlcnJvciA9IHhsb2dfYnJlYWQobG9nLCBpLCAxLCBicCkpKQorCQkJCWdvdG8gb3V0OworCQkJb2Zmc2V0ID0geGxvZ19hbGlnbihsb2csIGksIDEsIGJwKTsKKwkJfQorCisJCWhlYWQgPSAoeGxvZ19yZWNfaGVhZGVyX3QgKilvZmZzZXQ7CisKKwkJaWYgKFhMT0dfSEVBREVSX01BR0lDX05VTSA9PQorCQkgICAgSU5UX0dFVChoZWFkLT5oX21hZ2ljbm8sIEFSQ0hfQ09OVkVSVCkpCisJCQlicmVhazsKKworCQlpZiAoIXNtYWxsbWVtKQorCQkJb2Zmc2V0IC09IEJCU0laRTsKKwl9CisKKwkvKgorCSAqIFdlIGhpdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwaHlzaWNhbCBsb2cgJiBzdGlsbCBubyBoZWFkZXIuICBSZXR1cm4KKwkgKiB0byBjYWxsZXIuICBJZiBjYWxsZXIgY2FuIGhhbmRsZSBhIHJldHVybiBvZiAtMSwgdGhlbiB0aGlzIHJvdXRpbmUKKwkgKiB3aWxsIGJlIGNhbGxlZCBhZ2FpbiBmb3IgdGhlIGVuZCBvZiB0aGUgcGh5c2ljYWwgbG9nLgorCSAqLworCWlmIChpID09IC0xKSB7CisJCWVycm9yID0gLTE7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogV2UgaGF2ZSB0aGUgZmluYWwgYmxvY2sgb2YgdGhlIGdvb2QgbG9nICh0aGUgZmlyc3QgYmxvY2sKKwkgKiBvZiB0aGUgbG9nIHJlY29yZCBfYmVmb3JlXyB0aGUgaGVhZC4gU28gd2UgY2hlY2sgdGhlIHV1aWQuCisJICovCisJaWYgKChlcnJvciA9IHhsb2dfaGVhZGVyX2NoZWNrX21vdW50KGxvZy0+bF9tcCwgaGVhZCkpKQorCQlnb3RvIG91dDsKKworCS8qCisJICogV2UgbWF5IGhhdmUgZm91bmQgYSBsb2cgcmVjb3JkIGhlYWRlciBiZWZvcmUgd2UgZXhwZWN0ZWQgb25lLgorCSAqIGxhc3RfYmxrIHdpbGwgYmUgdGhlIDFzdCBibG9jayAjIHdpdGggYSBnaXZlbiBjeWNsZSAjLiAgV2UgbWF5IGVuZAorCSAqIHVwIHJlYWRpbmcgYW4gZW50aXJlIGxvZyByZWNvcmQuICBJbiB0aGlzIGNhc2UsIHdlIGRvbid0IHdhbnQgdG8KKwkgKiByZXNldCBsYXN0X2Jsay4gIE9ubHkgd2hlbiBsYXN0X2JsayBwb2ludHMgaW4gdGhlIG1pZGRsZSBvZiBhIGxvZworCSAqIHJlY29yZCBkbyB3ZSB1cGRhdGUgbGFzdF9ibGsuCisJICovCisJaWYgKFhGU19TQl9WRVJTSU9OX0hBU0xPR1YyKCZsb2ctPmxfbXAtPm1fc2IpKSB7CisJCXVpbnQJaF9zaXplID0gSU5UX0dFVChoZWFkLT5oX3NpemUsIEFSQ0hfQ09OVkVSVCk7CisKKwkJeGhkcnMgPSBoX3NpemUgLyBYTE9HX0hFQURFUl9DWUNMRV9TSVpFOworCQlpZiAoaF9zaXplICUgWExPR19IRUFERVJfQ1lDTEVfU0laRSkKKwkJCXhoZHJzKys7CisJfSBlbHNlIHsKKwkJeGhkcnMgPSAxOworCX0KKworCWlmICgqbGFzdF9ibGsgLSBpICsgZXh0cmFfYmJsa3MKKwkJCSE9IEJUT0JCKElOVF9HRVQoaGVhZC0+aF9sZW4sIEFSQ0hfQ09OVkVSVCkpICsgeGhkcnMpCisJCSpsYXN0X2JsayA9IGk7CisKK291dDoKKwl4bG9nX3B1dF9icChicCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogSGVhZCBpcyBkZWZpbmVkIHRvIGJlIHRoZSBwb2ludCBvZiB0aGUgbG9nIHdoZXJlIHRoZSBuZXh0IGxvZyB3cml0ZQorICogd3JpdGUgY291bGQgZ28uICBUaGlzIG1lYW5zIHRoYXQgaW5jb21wbGV0ZSBMUiB3cml0ZXMgYXQgdGhlIGVuZCBhcmUKKyAqIGVsaW1pbmF0ZWQgd2hlbiBjYWxjdWxhdGluZyB0aGUgaGVhZC4gIFdlIGFyZW4ndCBndWFyYW50ZWVkIHRoYXQgcHJldmlvdXMKKyAqIExSIGhhdmUgY29tcGxldGUgdHJhbnNhY3Rpb25zLiAgV2Ugb25seSBrbm93IHRoYXQgYSBjeWNsZSBudW1iZXIgb2YKKyAqIGN1cnJlbnQgY3ljbGUgbnVtYmVyIC0xIHdvbid0IGJlIHByZXNlbnQgaW4gdGhlIGxvZyBpZiB3ZSBzdGFydCB3cml0aW5nCisgKiBmcm9tIG91ciBjdXJyZW50IGJsb2NrIG51bWJlci4KKyAqCisgKiBsYXN0X2JsayBjb250YWlucyB0aGUgYmxvY2sgbnVtYmVyIG9mIHRoZSBmaXJzdCBibG9jayB3aXRoIGEgZ2l2ZW4KKyAqIGN5Y2xlIG51bWJlci4KKyAqCisgKiBSZXR1cm46IHplcm8gaWYgbm9ybWFsLCBub24temVybyBpZiBlcnJvci4KKyAqLworaW50Cit4bG9nX2ZpbmRfaGVhZCgKKwl4bG9nX3QgCQkqbG9nLAorCXhmc19kYWRkcl90CSpyZXR1cm5faGVhZF9ibGspCit7CisJeGZzX2J1Zl90CSpicDsKKwl4ZnNfY2FkZHJfdAlvZmZzZXQ7CisJeGZzX2RhZGRyX3QJbmV3X2JsaywgZmlyc3RfYmxrLCBzdGFydF9ibGssIGxhc3RfYmxrLCBoZWFkX2JsazsKKwlpbnQJCW51bV9zY2FuX2JibGtzOworCXVpbnQJCWZpcnN0X2hhbGZfY3ljbGUsIGxhc3RfaGFsZl9jeWNsZTsKKwl1aW50CQlzdG9wX29uX2N5Y2xlOworCWludAkJZXJyb3IsIGxvZ19iYm51bSA9IGxvZy0+bF9sb2dCQnNpemU7CisKKwkvKiBJcyB0aGUgZW5kIG9mIHRoZSBsb2cgZGV2aWNlIHplcm9lZD8gKi8KKwlpZiAoKGVycm9yID0geGxvZ19maW5kX3plcm9lZChsb2csICZmaXJzdF9ibGspKSA9PSAtMSkgeworCQkqcmV0dXJuX2hlYWRfYmxrID0gZmlyc3RfYmxrOworCisJCS8qIElzIHRoZSB3aG9sZSBsb3QgemVyb2VkPyAqLworCQlpZiAoIWZpcnN0X2JsaykgeworCQkJLyogTGludXggWEZTIHNob3VsZG4ndCBnZW5lcmF0ZSB0b3RhbGx5IHplcm9lZCBsb2dzIC0KKwkJCSAqIG1rZnMgZXRjIHdyaXRlIGEgZHVtbXkgdW5tb3VudCByZWNvcmQgdG8gYSBmcmVzaAorCQkJICogbG9nIHNvIHdlIGNhbiBzdG9yZSB0aGUgdXVpZCBpbiB0aGVyZQorCQkJICovCisJCQl4bG9nX3dhcm4oIlhGUzogdG90YWxseSB6ZXJvZWQgbG9nIik7CisJCX0KKworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKGVycm9yKSB7CisJCXhsb2dfd2FybigiWEZTOiBlbXB0eSBsb2cgY2hlY2sgZmFpbGVkIik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwlmaXJzdF9ibGsgPSAwOwkJCS8qIGdldCBjeWNsZSAjIG9mIDFzdCBibG9jayAqLworCWJwID0geGxvZ19nZXRfYnAobG9nLCAxKTsKKwlpZiAoIWJwKQorCQlyZXR1cm4gRU5PTUVNOworCWlmICgoZXJyb3IgPSB4bG9nX2JyZWFkKGxvZywgMCwgMSwgYnApKSkKKwkJZ290byBicF9lcnI7CisJb2Zmc2V0ID0geGxvZ19hbGlnbihsb2csIDAsIDEsIGJwKTsKKwlmaXJzdF9oYWxmX2N5Y2xlID0gR0VUX0NZQ0xFKG9mZnNldCwgQVJDSF9DT05WRVJUKTsKKworCWxhc3RfYmxrID0gaGVhZF9ibGsgPSBsb2dfYmJudW0gLSAxOwkvKiBnZXQgY3ljbGUgIyBvZiBsYXN0IGJsb2NrICovCisJaWYgKChlcnJvciA9IHhsb2dfYnJlYWQobG9nLCBsYXN0X2JsaywgMSwgYnApKSkKKwkJZ290byBicF9lcnI7CisJb2Zmc2V0ID0geGxvZ19hbGlnbihsb2csIGxhc3RfYmxrLCAxLCBicCk7CisJbGFzdF9oYWxmX2N5Y2xlID0gR0VUX0NZQ0xFKG9mZnNldCwgQVJDSF9DT05WRVJUKTsKKwlBU1NFUlQobGFzdF9oYWxmX2N5Y2xlICE9IDApOworCisJLyoKKwkgKiBJZiB0aGUgMXN0IGhhbGYgY3ljbGUgbnVtYmVyIGlzIGVxdWFsIHRvIHRoZSBsYXN0IGhhbGYgY3ljbGUgbnVtYmVyLAorCSAqIHRoZW4gdGhlIGVudGlyZSBsb2cgaXMgc3RhbXBlZCB3aXRoIHRoZSBzYW1lIGN5Y2xlIG51bWJlci4gIEluIHRoaXMKKwkgKiBjYXNlLCBoZWFkX2JsayBjYW4ndCBiZSBzZXQgdG8gemVybyAod2hpY2ggbWFrZXMgc2Vuc2UpLiAgVGhlIGJlbG93CisJICogbWF0aCBkb2Vzbid0IHdvcmsgb3V0IHByb3Blcmx5IHdpdGggaGVhZF9ibGsgZXF1YWwgdG8gemVyby4gIEluc3RlYWQsCisJICogd2Ugc2V0IGl0IHRvIGxvZ19iYm51bSB3aGljaCBpcyBhbiBpbnZhbGlkIGJsb2NrIG51bWJlciwgYnV0IHRoaXMKKwkgKiB2YWx1ZSBtYWtlcyB0aGUgbWF0aCBjb3JyZWN0LiAgSWYgaGVhZF9ibGsgZG9lc24ndCBjaGFuZ2VkIHRocm91Z2gKKwkgKiBhbGwgdGhlIHRlc3RzIGJlbG93LCAqaGVhZF9ibGsgaXMgc2V0IHRvIHplcm8gYXQgdGhlIHZlcnkgZW5kIHJhdGhlcgorCSAqIHRoYW4gbG9nX2JibnVtLiAgSW4gYSBzZW5zZSwgbG9nX2JibnVtIGFuZCB6ZXJvIGFyZSB0aGUgc2FtZSBibG9jaworCSAqIGluIGEgY2lyY3VsYXIgZmlsZS4KKwkgKi8KKwlpZiAoZmlyc3RfaGFsZl9jeWNsZSA9PSBsYXN0X2hhbGZfY3ljbGUpIHsKKwkJLyoKKwkJICogSW4gdGhpcyBjYXNlIHdlIGJlbGlldmUgdGhhdCB0aGUgZW50aXJlIGxvZyBzaG91bGQgaGF2ZQorCQkgKiBjeWNsZSBudW1iZXIgbGFzdF9oYWxmX2N5Y2xlLiAgV2UgbmVlZCB0byBzY2FuIGJhY2t3YXJkcworCQkgKiBmcm9tIHRoZSBlbmQgdmVyaWZ5aW5nIHRoYXQgdGhlcmUgYXJlIG5vIGhvbGVzIHN0aWxsCisJCSAqIGNvbnRhaW5pbmcgbGFzdF9oYWxmX2N5Y2xlIC0gMS4gIElmIHdlIGZpbmQgc3VjaCBhIGhvbGUsCisJCSAqIHRoZW4gdGhlIHN0YXJ0IG9mIHRoYXQgaG9sZSB3aWxsIGJlIHRoZSBuZXcgaGVhZC4gIFRoZQorCQkgKiBzaW1wbGUgY2FzZSBsb29rcyBsaWtlCisJCSAqICAgICAgICB4IHwgeCAuLi4gfCB4IC0gMSB8IHgKKwkJICogQW5vdGhlciBjYXNlIHRoYXQgZml0cyB0aGlzIHBpY3R1cmUgd291bGQgYmUKKwkJICogICAgICAgIHggfCB4ICsgMSB8IHggLi4uIHwgeAorCQkgKiBJbiB0aGlzIGNhc2UgdGhlIGhlYWQgcmVhbGx5IGlzIHNvbXdoZXJlIGF0IHRoZSBlbmQgb2YgdGhlCisJCSAqIGxvZywgYXMgb25lIG9mIHRoZSBsYXRlc3Qgd3JpdGVzIGF0IHRoZSBiZWdpbm5pbmcgd2FzCisJCSAqIGluY29tcGxldGUuCisJCSAqIE9uZSBtb3JlIGNhc2UgaXMKKwkJICogICAgICAgIHggfCB4ICsgMSB8IHggLi4uIHwgeCAtIDEgfCB4CisJCSAqIFRoaXMgaXMgcmVhbGx5IHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgYWJvdmUgdHdvIGNhc2VzLCBhbmQKKwkJICogdGhlIGhlYWQgaGFzIHRvIGVuZCB1cCBhdCB0aGUgc3RhcnQgb2YgdGhlIHgtMSBob2xlIGF0IHRoZQorCQkgKiBlbmQgb2YgdGhlIGxvZy4KKwkJICoKKwkJICogSW4gdGhlIDI1NmsgbG9nIGNhc2UsIHdlIHdpbGwgcmVhZCBmcm9tIHRoZSBiZWdpbm5pbmcgdG8gdGhlCisJCSAqIGVuZCBvZiB0aGUgbG9nIGFuZCBzZWFyY2ggZm9yIGN5Y2xlIG51bWJlcnMgZXF1YWwgdG8geC0xLgorCQkgKiBXZSBkb24ndCB3b3JyeSBhYm91dCB0aGUgeCsxIGJsb2NrcyB0aGF0IHdlIGVuY291bnRlciwKKwkJICogYmVjYXVzZSB3ZSBrbm93IHRoYXQgdGhleSBjYW5ub3QgYmUgdGhlIGhlYWQgc2luY2UgdGhlIGxvZworCQkgKiBzdGFydGVkIHdpdGggeC4KKwkJICovCisJCWhlYWRfYmxrID0gbG9nX2JibnVtOworCQlzdG9wX29uX2N5Y2xlID0gbGFzdF9oYWxmX2N5Y2xlIC0gMTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBJbiB0aGlzIGNhc2Ugd2Ugd2FudCB0byBmaW5kIHRoZSBmaXJzdCBibG9jayB3aXRoIGN5Y2xlCisJCSAqIG51bWJlciBtYXRjaGluZyBsYXN0X2hhbGZfY3ljbGUuICBXZSBleHBlY3QgdGhlIGxvZyB0byBiZQorCQkgKiBzb21lIHZhcmlhdGlvbiBvbgorCQkgKiAgICAgICAgeCArIDEgLi4uIHwgeCAuLi4KKwkJICogVGhlIGZpcnN0IGJsb2NrIHdpdGggY3ljbGUgbnVtYmVyIHggKGxhc3RfaGFsZl9jeWNsZSkgd2lsbAorCQkgKiBiZSB3aGVyZSB0aGUgbmV3IGhlYWQgYmVsb25ncy4gIEZpcnN0IHdlIGRvIGEgYmluYXJ5IHNlYXJjaAorCQkgKiBmb3IgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgbGFzdF9oYWxmX2N5Y2xlLiAgVGhlIGJpbmFyeQorCQkgKiBzZWFyY2ggbWF5IG5vdCBiZSB0b3RhbGx5IGFjY3VyYXRlLCBzbyB0aGVuIHdlIHNjYW4gYmFjaworCQkgKiBmcm9tIHRoZXJlIGxvb2tpbmcgZm9yIG9jY3VycmVuY2VzIG9mIGxhc3RfaGFsZl9jeWNsZSBiZWZvcmUKKwkJICogdXMuICBJZiB0aGF0IGJhY2t3YXJkcyBzY2FuIHdyYXBzIGFyb3VuZCB0aGUgYmVnaW5uaW5nIG9mCisJCSAqIHRoZSBsb2csIHRoZW4gd2UgbG9vayBmb3Igb2NjdXJyZW5jZXMgb2YgbGFzdF9oYWxmX2N5Y2xlIC0gMQorCQkgKiBhdCB0aGUgZW5kIG9mIHRoZSBsb2cuICBUaGUgY2FzZXMgd2UncmUgbG9va2luZyBmb3IgbG9vaworCQkgKiBsaWtlCisJCSAqICAgICAgICB4ICsgMSAuLi4gfCB4IHwgeCArIDEgfCB4IC4uLgorCQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeIGJpbmFyeSBzZWFyY2ggc3RvcHBlZCBoZXJlCisJCSAqIG9yCisJCSAqICAgICAgICB4ICsgMSAuLi4gfCB4IC4uLiB8IHggLSAxIHwgeAorCQkgKiAgICAgICAgPC0tLS0tLS0tLT4gbGVzcyB0aGFuIHNjYW4gZGlzdGFuY2UKKwkJICovCisJCXN0b3Bfb25fY3ljbGUgPSBsYXN0X2hhbGZfY3ljbGU7CisJCWlmICgoZXJyb3IgPSB4bG9nX2ZpbmRfY3ljbGVfc3RhcnQobG9nLCBicCwgZmlyc3RfYmxrLAorCQkJCQkJJmhlYWRfYmxrLCBsYXN0X2hhbGZfY3ljbGUpKSkKKwkJCWdvdG8gYnBfZXJyOworCX0KKworCS8qCisJICogTm93IHZhbGlkYXRlIHRoZSBhbnN3ZXIuICBTY2FuIGJhY2sgc29tZSBudW1iZXIgb2YgbWF4aW11bSBwb3NzaWJsZQorCSAqIGJsb2NrcyBhbmQgbWFrZSBzdXJlIGVhY2ggb25lIGhhcyB0aGUgZXhwZWN0ZWQgY3ljbGUgbnVtYmVyLiAgVGhlCisJICogbWF4aW11bSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSB0b3RhbCBwb3NzaWJsZSBhbW91bnQgb2YgYnVmZmVyaW5nCisJICogaW4gdGhlIGluLWNvcmUgbG9nLiAgVGhlIGZvbGxvd2luZyBudW1iZXIgY2FuIGJlIG1hZGUgdGlnaHRlciBpZgorCSAqIHdlIGFjdHVhbGx5IGxvb2sgYXQgdGhlIGJsb2NrIHNpemUgb2YgdGhlIGZpbGVzeXN0ZW0uCisJICovCisJbnVtX3NjYW5fYmJsa3MgPSBYTE9HX1RPVEFMX1JFQ19TSElGVChsb2cpOworCWlmIChoZWFkX2JsayA+PSBudW1fc2Nhbl9iYmxrcykgeworCQkvKgorCQkgKiBXZSBhcmUgZ3VhcmFudGVlZCB0aGF0IHRoZSBlbnRpcmUgY2hlY2sgY2FuIGJlIHBlcmZvcm1lZAorCQkgKiBpbiBvbmUgYnVmZmVyLgorCQkgKi8KKwkJc3RhcnRfYmxrID0gaGVhZF9ibGsgLSBudW1fc2Nhbl9iYmxrczsKKwkJaWYgKChlcnJvciA9IHhsb2dfZmluZF92ZXJpZnlfY3ljbGUobG9nLAorCQkJCQkJc3RhcnRfYmxrLCBudW1fc2Nhbl9iYmxrcywKKwkJCQkJCXN0b3Bfb25fY3ljbGUsICZuZXdfYmxrKSkpCisJCQlnb3RvIGJwX2VycjsKKwkJaWYgKG5ld19ibGsgIT0gLTEpCisJCQloZWFkX2JsayA9IG5ld19ibGs7CisJfSBlbHNlIHsJCS8qIG5lZWQgdG8gcmVhZCAyIHBhcnRzIG9mIGxvZyAqLworCQkvKgorCQkgKiBXZSBhcmUgZ29pbmcgdG8gc2NhbiBiYWNrd2FyZHMgaW4gdGhlIGxvZyBpbiB0d28gcGFydHMuCisJCSAqIEZpcnN0IHdlIHNjYW4gdGhlIHBoeXNpY2FsIGVuZCBvZiB0aGUgbG9nLiAgSW4gdGhpcyBwYXJ0CisJCSAqIG9mIHRoZSBsb2csIHdlIGFyZSBsb29raW5nIGZvciBibG9ja3Mgd2l0aCBjeWNsZSBudW1iZXIKKwkJICogbGFzdF9oYWxmX2N5Y2xlIC0gMS4KKwkJICogSWYgd2UgZmluZCBvbmUsIHRoZW4gd2Uga25vdyB0aGF0IHRoZSBsb2cgc3RhcnRzIHRoZXJlLCBhcworCQkgKiB3ZSd2ZSBmb3VuZCBhIGhvbGUgdGhhdCBkaWRuJ3QgZ2V0IHdyaXR0ZW4gaW4gZ29pbmcgYXJvdW5kCisJCSAqIHRoZSBlbmQgb2YgdGhlIHBoeXNpY2FsIGxvZy4gIFRoZSBzaW1wbGUgY2FzZSBmb3IgdGhpcyBpcworCQkgKiAgICAgICAgeCArIDEgLi4uIHwgeCAuLi4gfCB4IC0gMSB8IHgKKwkJICogICAgICAgIDwtLS0tLS0tLS0+IGxlc3MgdGhhbiBzY2FuIGRpc3RhbmNlCisJCSAqIElmIGFsbCBvZiB0aGUgYmxvY2tzIGF0IHRoZSBlbmQgb2YgdGhlIGxvZyBoYXZlIGN5Y2xlIG51bWJlcgorCQkgKiBsYXN0X2hhbGZfY3ljbGUsIHRoZW4gd2UgY2hlY2sgdGhlIGJsb2NrcyBhdCB0aGUgc3RhcnQgb2YKKwkJICogdGhlIGxvZyBsb29raW5nIGZvciBvY2N1cnJlbmNlcyBvZiBsYXN0X2hhbGZfY3ljbGUuICBJZiB3ZQorCQkgKiBmaW5kIG9uZSwgdGhlbiBvdXIgY3VycmVudCBlc3RpbWF0ZSBmb3IgdGhlIGxvY2F0aW9uIG9mIHRoZQorCQkgKiBmaXJzdCBvY2N1cnJlbmNlIG9mIGxhc3RfaGFsZl9jeWNsZSBpcyB3cm9uZyBhbmQgd2UgbW92ZQorCQkgKiBiYWNrIHRvIHRoZSBob2xlIHdlJ3ZlIGZvdW5kLiAgVGhpcyBjYXNlIGxvb2tzIGxpa2UKKwkJICogICAgICAgIHggKyAxIC4uLiB8IHggfCB4ICsgMSB8IHggLi4uCisJCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gYmluYXJ5IHNlYXJjaCBzdG9wcGVkIGhlcmUKKwkJICogQW5vdGhlciBjYXNlIHdlIG5lZWQgdG8gaGFuZGxlIHRoYXQgb25seSBvY2N1cnMgaW4gMjU2aworCQkgKiBsb2dzIGlzCisJCSAqICAgICAgICB4ICsgMSAuLi4gfCB4IC4uLiB8IHgrMSB8IHggLi4uCisJCSAqICAgICAgICAgICAgICAgICAgIF4gYmluYXJ5IHNlYXJjaCBzdG9wcyBoZXJlCisJCSAqIEluIGEgMjU2ayBsb2csIHRoZSBzY2FuIGF0IHRoZSBlbmQgb2YgdGhlIGxvZyB3aWxsIHNlZSB0aGUKKwkJICogeCArIDEgYmxvY2tzLiAgV2UgbmVlZCB0byBza2lwIHBhc3QgdGhvc2Ugc2luY2UgdGhhdCBpcworCQkgKiBjZXJ0YWlubHkgbm90IHRoZSBoZWFkIG9mIHRoZSBsb2cuICBCeSBzZWFyY2hpbmcgZm9yCisJCSAqIGxhc3RfaGFsZl9jeWNsZS0xIHdlIGFjY29tcGxpc2ggdGhhdC4KKwkJICovCisJCXN0YXJ0X2JsayA9IGxvZ19iYm51bSAtIG51bV9zY2FuX2JibGtzICsgaGVhZF9ibGs7CisJCUFTU0VSVChoZWFkX2JsayA8PSBJTlRfTUFYICYmCisJCQkoeGZzX2RhZGRyX3QpIG51bV9zY2FuX2JibGtzIC0gaGVhZF9ibGsgPj0gMCk7CisJCWlmICgoZXJyb3IgPSB4bG9nX2ZpbmRfdmVyaWZ5X2N5Y2xlKGxvZywgc3RhcnRfYmxrLAorCQkJCQludW1fc2Nhbl9iYmxrcyAtIChpbnQpaGVhZF9ibGssCisJCQkJCShzdG9wX29uX2N5Y2xlIC0gMSksICZuZXdfYmxrKSkpCisJCQlnb3RvIGJwX2VycjsKKwkJaWYgKG5ld19ibGsgIT0gLTEpIHsKKwkJCWhlYWRfYmxrID0gbmV3X2JsazsKKwkJCWdvdG8gYmFkX2JsazsKKwkJfQorCisJCS8qCisJCSAqIFNjYW4gYmVnaW5uaW5nIG9mIGxvZyBub3cuICBUaGUgbGFzdCBwYXJ0IG9mIHRoZSBwaHlzaWNhbAorCQkgKiBsb2cgaXMgZ29vZC4gIFRoaXMgc2NhbiBuZWVkcyB0byB2ZXJpZnkgdGhhdCBpdCBkb2Vzbid0IGZpbmQKKwkJICogdGhlIGxhc3RfaGFsZl9jeWNsZS4KKwkJICovCisJCXN0YXJ0X2JsayA9IDA7CisJCUFTU0VSVChoZWFkX2JsayA8PSBJTlRfTUFYKTsKKwkJaWYgKChlcnJvciA9IHhsb2dfZmluZF92ZXJpZnlfY3ljbGUobG9nLAorCQkJCQlzdGFydF9ibGssIChpbnQpaGVhZF9ibGssCisJCQkJCXN0b3Bfb25fY3ljbGUsICZuZXdfYmxrKSkpCisJCQlnb3RvIGJwX2VycjsKKwkJaWYgKG5ld19ibGsgIT0gLTEpCisJCQloZWFkX2JsayA9IG5ld19ibGs7CisJfQorCisgYmFkX2JsazoKKwkvKgorCSAqIE5vdyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBoZWFkX2JsayBpcyBub3QgcG9pbnRpbmcgdG8gYSBibG9jayBpbgorCSAqIHRoZSBtaWRkbGUgb2YgYSBsb2cgcmVjb3JkLgorCSAqLworCW51bV9zY2FuX2JibGtzID0gWExPR19SRUNfU0hJRlQobG9nKTsKKwlpZiAoaGVhZF9ibGsgPj0gbnVtX3NjYW5fYmJsa3MpIHsKKwkJc3RhcnRfYmxrID0gaGVhZF9ibGsgLSBudW1fc2Nhbl9iYmxrczsgLyogZG9uJ3QgcmVhZCBoZWFkX2JsayAqLworCisJCS8qIHN0YXJ0IHB0ciBhdCBsYXN0IGJsb2NrIHB0ciBiZWZvcmUgaGVhZF9ibGsgKi8KKwkJaWYgKChlcnJvciA9IHhsb2dfZmluZF92ZXJpZnlfbG9nX3JlY29yZChsb2csIHN0YXJ0X2JsaywKKwkJCQkJCQkmaGVhZF9ibGssIDApKSA9PSAtMSkgeworCQkJZXJyb3IgPSBYRlNfRVJST1IoRUlPKTsKKwkJCWdvdG8gYnBfZXJyOworCQl9IGVsc2UgaWYgKGVycm9yKQorCQkJZ290byBicF9lcnI7CisJfSBlbHNlIHsKKwkJc3RhcnRfYmxrID0gMDsKKwkJQVNTRVJUKGhlYWRfYmxrIDw9IElOVF9NQVgpOworCQlpZiAoKGVycm9yID0geGxvZ19maW5kX3ZlcmlmeV9sb2dfcmVjb3JkKGxvZywgc3RhcnRfYmxrLAorCQkJCQkJCSZoZWFkX2JsaywgMCkpID09IC0xKSB7CisJCQkvKiBXZSBoaXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbG9nIGR1cmluZyBvdXIgc2VhcmNoICovCisJCQlzdGFydF9ibGsgPSBsb2dfYmJudW0gLSBudW1fc2Nhbl9iYmxrcyArIGhlYWRfYmxrOworCQkJbmV3X2JsayA9IGxvZ19iYm51bTsKKwkJCUFTU0VSVChzdGFydF9ibGsgPD0gSU5UX01BWCAmJgorCQkJCSh4ZnNfZGFkZHJfdCkgbG9nX2JibnVtLXN0YXJ0X2JsayA+PSAwKTsKKwkJCUFTU0VSVChoZWFkX2JsayA8PSBJTlRfTUFYKTsKKwkJCWlmICgoZXJyb3IgPSB4bG9nX2ZpbmRfdmVyaWZ5X2xvZ19yZWNvcmQobG9nLAorCQkJCQkJCXN0YXJ0X2JsaywgJm5ld19ibGssCisJCQkJCQkJKGludCloZWFkX2JsaykpID09IC0xKSB7CisJCQkJZXJyb3IgPSBYRlNfRVJST1IoRUlPKTsKKwkJCQlnb3RvIGJwX2VycjsKKwkJCX0gZWxzZSBpZiAoZXJyb3IpCisJCQkJZ290byBicF9lcnI7CisJCQlpZiAobmV3X2JsayAhPSBsb2dfYmJudW0pCisJCQkJaGVhZF9ibGsgPSBuZXdfYmxrOworCQl9IGVsc2UgaWYgKGVycm9yKQorCQkJZ290byBicF9lcnI7CisJfQorCisJeGxvZ19wdXRfYnAoYnApOworCWlmIChoZWFkX2JsayA9PSBsb2dfYmJudW0pCisJCSpyZXR1cm5faGVhZF9ibGsgPSAwOworCWVsc2UKKwkJKnJldHVybl9oZWFkX2JsayA9IGhlYWRfYmxrOworCS8qCisJICogV2hlbiByZXR1cm5pbmcgaGVyZSwgd2UgaGF2ZSBhIGdvb2QgYmxvY2sgbnVtYmVyLiAgQmFkIGJsb2NrCisJICogbWVhbnMgdGhhdCBkdXJpbmcgYSBwcmV2aW91cyBjcmFzaCwgd2UgZGlkbid0IGhhdmUgYSBjbGVhbiBicmVhaworCSAqIGZyb20gY3ljbGUgbnVtYmVyIE4gdG8gY3ljbGUgbnVtYmVyIE4tMS4gIEluIHRoaXMgY2FzZSwgd2UgbmVlZAorCSAqIHRvIGZpbmQgdGhlIGZpcnN0IGJsb2NrIHdpdGggY3ljbGUgbnVtYmVyIE4tMS4KKwkgKi8KKwlyZXR1cm4gMDsKKworIGJwX2VycjoKKwl4bG9nX3B1dF9icChicCk7CisKKwlpZiAoZXJyb3IpCisJICAgIHhsb2dfd2FybigiWEZTOiBmYWlsZWQgdG8gZmluZCBsb2cgaGVhZCIpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIEZpbmQgdGhlIHN5bmMgYmxvY2sgbnVtYmVyIG9yIHRoZSB0YWlsIG9mIHRoZSBsb2cuCisgKgorICogVGhpcyB3aWxsIGJlIHRoZSBibG9jayBudW1iZXIgb2YgdGhlIGxhc3QgcmVjb3JkIHRvIGhhdmUgaXRzCisgKiBhc3NvY2lhdGVkIGJ1ZmZlcnMgc3luY2VkIHRvIGRpc2suICBFdmVyeSBsb2cgcmVjb3JkIGhlYWRlciBoYXMKKyAqIGEgc3luYyBsc24gZW1iZWRkZWQgaW4gaXQuICBMU05zIGhvbGQgYmxvY2sgbnVtYmVycywgc28gaXQgaXMgZWFzeQorICogdG8gZ2V0IGEgc3luYyBibG9jayBudW1iZXIuICBUaGUgb25seSBjb25jZXJuIGlzIHRvIGZpZ3VyZSBvdXQgd2hpY2gKKyAqIGxvZyByZWNvcmQgaGVhZGVyIHRvIGJlbGlldmUuCisgKgorICogVGhlIGZvbGxvd2luZyBhbGdvcml0aG0gdXNlcyB0aGUgbG9nIHJlY29yZCBoZWFkZXIgd2l0aCB0aGUgbGFyZ2VzdAorICogbHNuLiAgVGhlIGVudGlyZSBsb2cgcmVjb3JkIGRvZXMgbm90IG5lZWQgdG8gYmUgdmFsaWQuICBXZSBvbmx5IGNhcmUKKyAqIHRoYXQgdGhlIGhlYWRlciBpcyB2YWxpZC4KKyAqCisgKiBXZSBjb3VsZCBzcGVlZCB1cCBzZWFyY2ggYnkgdXNpbmcgY3VycmVudCBoZWFkX2JsayBidWZmZXIsIGJ1dCBpdCBpcyBub3QKKyAqIGF2YWlsYWJsZS4KKyAqLworaW50Cit4bG9nX2ZpbmRfdGFpbCgKKwl4bG9nX3QJCQkqbG9nLAorCXhmc19kYWRkcl90CQkqaGVhZF9ibGssCisJeGZzX2RhZGRyX3QJCSp0YWlsX2JsaywKKwlpbnQJCQlyZWFkb25seSkKK3sKKwl4bG9nX3JlY19oZWFkZXJfdAkqcmhlYWQ7CisJeGxvZ19vcF9oZWFkZXJfdAkqb3BfaGVhZDsKKwl4ZnNfY2FkZHJfdAkJb2Zmc2V0ID0gTlVMTDsKKwl4ZnNfYnVmX3QJCSpicDsKKwlpbnQJCQllcnJvciwgaSwgZm91bmQ7CisJeGZzX2RhZGRyX3QJCXVtb3VudF9kYXRhX2JsazsKKwl4ZnNfZGFkZHJfdAkJYWZ0ZXJfdW1vdW50X2JsazsKKwl4ZnNfbHNuX3QJCXRhaWxfbHNuOworCWludAkJCWhibGtzOworCisJZm91bmQgPSAwOworCisJLyoKKwkgKiBGaW5kIHByZXZpb3VzIGxvZyByZWNvcmQKKwkgKi8KKwlpZiAoKGVycm9yID0geGxvZ19maW5kX2hlYWQobG9nLCBoZWFkX2JsaykpKQorCQlyZXR1cm4gZXJyb3I7CisKKwlicCA9IHhsb2dfZ2V0X2JwKGxvZywgMSk7CisJaWYgKCFicCkKKwkJcmV0dXJuIEVOT01FTTsKKwlpZiAoKmhlYWRfYmxrID09IDApIHsJCQkJLyogc3BlY2lhbCBjYXNlICovCisJCWlmICgoZXJyb3IgPSB4bG9nX2JyZWFkKGxvZywgMCwgMSwgYnApKSkKKwkJCWdvdG8gYnJlYWRfZXJyOworCQlvZmZzZXQgPSB4bG9nX2FsaWduKGxvZywgMCwgMSwgYnApOworCQlpZiAoR0VUX0NZQ0xFKG9mZnNldCwgQVJDSF9DT05WRVJUKSA9PSAwKSB7CisJCQkqdGFpbF9ibGsgPSAwOworCQkJLyogbGVhdmUgYWxsIG90aGVyIGxvZyBpbml0ZWQgdmFsdWVzIGFsb25lICovCisJCQlnb3RvIGV4aXQ7CisJCX0KKwl9CisKKwkvKgorCSAqIFNlYXJjaCBiYWNrd2FyZHMgbG9va2luZyBmb3IgbG9nIHJlY29yZCBoZWFkZXIgYmxvY2sKKwkgKi8KKwlBU1NFUlQoKmhlYWRfYmxrIDwgSU5UX01BWCk7CisJZm9yIChpID0gKGludCkoKmhlYWRfYmxrKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCWlmICgoZXJyb3IgPSB4bG9nX2JyZWFkKGxvZywgaSwgMSwgYnApKSkKKwkJCWdvdG8gYnJlYWRfZXJyOworCQlvZmZzZXQgPSB4bG9nX2FsaWduKGxvZywgaSwgMSwgYnApOworCQlpZiAoWExPR19IRUFERVJfTUFHSUNfTlVNID09CisJCSAgICBJTlRfR0VUKCoodWludCAqKW9mZnNldCwgQVJDSF9DT05WRVJUKSkgeworCQkJZm91bmQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJLyoKKwkgKiBJZiB3ZSBoYXZlbid0IGZvdW5kIHRoZSBsb2cgcmVjb3JkIGhlYWRlciBibG9jaywgc3RhcnQgbG9va2luZworCSAqIGFnYWluIGZyb20gdGhlIGVuZCBvZiB0aGUgcGh5c2ljYWwgbG9nLiAgWFhYbWlrZW46IFRoZXJlIHNob3VsZCBiZQorCSAqIGEgY2hlY2sgaGVyZSB0byBtYWtlIHN1cmUgd2UgZGlkbid0IHNlYXJjaCBtb3JlIHRoYW4gTiBibG9ja3MgaW4KKwkgKiB0aGUgcHJldmlvdXMgY29kZS4KKwkgKi8KKwlpZiAoIWZvdW5kKSB7CisJCWZvciAoaSA9IGxvZy0+bF9sb2dCQnNpemUgLSAxOyBpID49IChpbnQpKCpoZWFkX2Jsayk7IGktLSkgeworCQkJaWYgKChlcnJvciA9IHhsb2dfYnJlYWQobG9nLCBpLCAxLCBicCkpKQorCQkJCWdvdG8gYnJlYWRfZXJyOworCQkJb2Zmc2V0ID0geGxvZ19hbGlnbihsb2csIGksIDEsIGJwKTsKKwkJCWlmIChYTE9HX0hFQURFUl9NQUdJQ19OVU0gPT0KKwkJCSAgICBJTlRfR0VUKCoodWludCopb2Zmc2V0LCBBUkNIX0NPTlZFUlQpKSB7CisJCQkJZm91bmQgPSAyOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWlmICghZm91bmQpIHsKKwkJeGxvZ193YXJuKCJYRlM6IHhsb2dfZmluZF90YWlsOiBjb3VsZG4ndCBmaW5kIHN5bmMgcmVjb3JkIik7CisJCUFTU0VSVCgwKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCX0KKworCS8qIGZpbmQgYmxrX25vIG9mIHRhaWwgb2YgbG9nICovCisJcmhlYWQgPSAoeGxvZ19yZWNfaGVhZGVyX3QgKilvZmZzZXQ7CisJKnRhaWxfYmxrID0gQkxPQ0tfTFNOKElOVF9HRVQocmhlYWQtPmhfdGFpbF9sc24sIEFSQ0hfQ09OVkVSVCkpOworCisJLyoKKwkgKiBSZXNldCBsb2cgdmFsdWVzIGFjY29yZGluZyB0byB0aGUgc3RhdGUgb2YgdGhlIGxvZyB3aGVuIHdlCisJICogY3Jhc2hlZC4gIEluIHRoZSBjYXNlIHdoZXJlIGhlYWRfYmxrID09IDAsIHdlIGJ1bXAgY3Vycl9jeWNsZQorCSAqIG9uZSBiZWNhdXNlIHRoZSBuZXh0IHdyaXRlIHN0YXJ0cyBhIG5ldyBjeWNsZSByYXRoZXIgdGhhbgorCSAqIGNvbnRpbnVpbmcgdGhlIGN5Y2xlIG9mIHRoZSBsYXN0IGdvb2QgbG9nIHJlY29yZC4gIEF0IHRoaXMKKwkgKiBwb2ludCB3ZSBoYXZlIGd1YXJhbnRlZWQgdGhhdCBhbGwgcGFydGlhbCBsb2cgcmVjb3JkcyBoYXZlIGJlZW4KKwkgKiBhY2NvdW50ZWQgZm9yLiAgVGhlcmVmb3JlLCB3ZSBrbm93IHRoYXQgdGhlIGxhc3QgZ29vZCBsb2cgcmVjb3JkCisJICogd3JpdHRlbiB3YXMgY29tcGxldGUgYW5kIGVuZGVkIGV4YWN0bHkgb24gdGhlIGVuZCBib3VuZGFyeQorCSAqIG9mIHRoZSBwaHlzaWNhbCBsb2cuCisJICovCisJbG9nLT5sX3ByZXZfYmxvY2sgPSBpOworCWxvZy0+bF9jdXJyX2Jsb2NrID0gKGludCkqaGVhZF9ibGs7CisJbG9nLT5sX2N1cnJfY3ljbGUgPSBJTlRfR0VUKHJoZWFkLT5oX2N5Y2xlLCBBUkNIX0NPTlZFUlQpOworCWlmIChmb3VuZCA9PSAyKQorCQlsb2ctPmxfY3Vycl9jeWNsZSsrOworCWxvZy0+bF90YWlsX2xzbiA9IElOVF9HRVQocmhlYWQtPmhfdGFpbF9sc24sIEFSQ0hfQ09OVkVSVCk7CisJbG9nLT5sX2xhc3Rfc3luY19sc24gPSBJTlRfR0VUKHJoZWFkLT5oX2xzbiwgQVJDSF9DT05WRVJUKTsKKwlsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9jeWNsZSA9IGxvZy0+bF9jdXJyX2N5Y2xlOworCWxvZy0+bF9ncmFudF9yZXNlcnZlX2J5dGVzID0gQkJUT0IobG9nLT5sX2N1cnJfYmxvY2spOworCWxvZy0+bF9ncmFudF93cml0ZV9jeWNsZSA9IGxvZy0+bF9jdXJyX2N5Y2xlOworCWxvZy0+bF9ncmFudF93cml0ZV9ieXRlcyA9IEJCVE9CKGxvZy0+bF9jdXJyX2Jsb2NrKTsKKworCS8qCisJICogTG9vayBmb3IgdW5tb3VudCByZWNvcmQuICBJZiB3ZSBmaW5kIGl0LCB0aGVuIHdlIGtub3cgdGhlcmUKKwkgKiB3YXMgYSBjbGVhbiB1bm1vdW50LiAgU2luY2UgJ2knIGNvdWxkIGJlIHRoZSBsYXN0IGJsb2NrIGluCisJICogdGhlIHBoeXNpY2FsIGxvZywgd2UgY29udmVydCB0byBhIGxvZyBibG9jayBiZWZvcmUgY29tcGFyaW5nCisJICogdG8gdGhlIGhlYWRfYmxrLgorCSAqCisJICogU2F2ZSB0aGUgY3VycmVudCB0YWlsIGxzbiB0byB1c2UgdG8gcGFzcyB0bworCSAqIHhsb2dfY2xlYXJfc3RhbGVfYmxvY2tzKCkgYmVsb3cuICBXZSB3b24ndCB3YW50IHRvIGNsZWFyIHRoZQorCSAqIHVubW91bnQgcmVjb3JkIGlmIHRoZXJlIGlzIG9uZSwgc28gd2UgcGFzcyB0aGUgbHNuIG9mIHRoZQorCSAqIHVubW91bnQgcmVjb3JkIHJhdGhlciB0aGFuIHRoZSBibG9jayBhZnRlciBpdC4KKwkgKi8KKwlpZiAoWEZTX1NCX1ZFUlNJT05fSEFTTE9HVjIoJmxvZy0+bF9tcC0+bV9zYikpIHsKKwkJaW50CWhfc2l6ZSA9IElOVF9HRVQocmhlYWQtPmhfc2l6ZSwgQVJDSF9DT05WRVJUKTsKKwkJaW50CWhfdmVyc2lvbiA9IElOVF9HRVQocmhlYWQtPmhfdmVyc2lvbiwgQVJDSF9DT05WRVJUKTsKKworCQlpZiAoKGhfdmVyc2lvbiAmIFhMT0dfVkVSU0lPTl8yKSAmJgorCQkgICAgKGhfc2l6ZSA+IFhMT0dfSEVBREVSX0NZQ0xFX1NJWkUpKSB7CisJCQloYmxrcyA9IGhfc2l6ZSAvIFhMT0dfSEVBREVSX0NZQ0xFX1NJWkU7CisJCQlpZiAoaF9zaXplICUgWExPR19IRUFERVJfQ1lDTEVfU0laRSkKKwkJCQloYmxrcysrOworCQl9IGVsc2UgeworCQkJaGJsa3MgPSAxOworCQl9CisJfSBlbHNlIHsKKwkJaGJsa3MgPSAxOworCX0KKwlhZnRlcl91bW91bnRfYmxrID0gKGkgKyBoYmxrcyArIChpbnQpCisJCUJUT0JCKElOVF9HRVQocmhlYWQtPmhfbGVuLCBBUkNIX0NPTlZFUlQpKSkgJSBsb2ctPmxfbG9nQkJzaXplOworCXRhaWxfbHNuID0gbG9nLT5sX3RhaWxfbHNuOworCWlmICgqaGVhZF9ibGsgPT0gYWZ0ZXJfdW1vdW50X2JsayAmJgorCSAgICBJTlRfR0VUKHJoZWFkLT5oX251bV9sb2dvcHMsIEFSQ0hfQ09OVkVSVCkgPT0gMSkgeworCQl1bW91bnRfZGF0YV9ibGsgPSAoaSArIGhibGtzKSAlIGxvZy0+bF9sb2dCQnNpemU7CisJCWlmICgoZXJyb3IgPSB4bG9nX2JyZWFkKGxvZywgdW1vdW50X2RhdGFfYmxrLCAxLCBicCkpKSB7CisJCQlnb3RvIGJyZWFkX2VycjsKKwkJfQorCQlvZmZzZXQgPSB4bG9nX2FsaWduKGxvZywgdW1vdW50X2RhdGFfYmxrLCAxLCBicCk7CisJCW9wX2hlYWQgPSAoeGxvZ19vcF9oZWFkZXJfdCAqKW9mZnNldDsKKwkJaWYgKG9wX2hlYWQtPm9oX2ZsYWdzICYgWExPR19VTk1PVU5UX1RSQU5TKSB7CisJCQkvKgorCQkJICogU2V0IHRhaWwgYW5kIGxhc3Qgc3luYyBzbyB0aGF0IG5ld2x5IHdyaXR0ZW4KKwkJCSAqIGxvZyByZWNvcmRzIHdpbGwgcG9pbnQgcmVjb3ZlcnkgdG8gYWZ0ZXIgdGhlCisJCQkgKiBjdXJyZW50IHVubW91bnQgcmVjb3JkLgorCQkJICovCisJCQlBU1NJR05fQU5ZX0xTTl9IT1NUKGxvZy0+bF90YWlsX2xzbiwgbG9nLT5sX2N1cnJfY3ljbGUsCisJCQkJCWFmdGVyX3Vtb3VudF9ibGspOworCQkJQVNTSUdOX0FOWV9MU05fSE9TVChsb2ctPmxfbGFzdF9zeW5jX2xzbiwgbG9nLT5sX2N1cnJfY3ljbGUsCisJCQkJCWFmdGVyX3Vtb3VudF9ibGspOworCQkJKnRhaWxfYmxrID0gYWZ0ZXJfdW1vdW50X2JsazsKKwkJfQorCX0KKworCS8qCisJICogTWFrZSBzdXJlIHRoYXQgdGhlcmUgYXJlIG5vIGJsb2NrcyBpbiBmcm9udCBvZiB0aGUgaGVhZAorCSAqIHdpdGggdGhlIHNhbWUgY3ljbGUgbnVtYmVyIGFzIHRoZSBoZWFkLiAgVGhpcyBjYW4gaGFwcGVuCisJICogYmVjYXVzZSB3ZSBhbGxvdyBtdWx0aXBsZSBvdXRzdGFuZGluZyBsb2cgd3JpdGVzIGNvbmN1cnJlbnRseSwKKwkgKiBhbmQgdGhlIGxhdGVyIHdyaXRlcyBtaWdodCBtYWtlIGl0IG91dCBiZWZvcmUgZWFybGllciBvbmVzLgorCSAqCisJICogV2UgdXNlIHRoZSBsc24gZnJvbSBiZWZvcmUgbW9kaWZ5aW5nIGl0IHNvIHRoYXQgd2UnbGwgbmV2ZXIKKwkgKiBvdmVyd3JpdGUgdGhlIHVubW91bnQgcmVjb3JkIGFmdGVyIGEgY2xlYW4gdW5tb3VudC4KKwkgKgorCSAqIERvIHRoaXMgb25seSBpZiB3ZSBhcmUgZ29pbmcgdG8gcmVjb3ZlciB0aGUgZmlsZXN5c3RlbQorCSAqCisJICogTk9URTogVGhpcyB1c2VkIHRvIHNheSAiaWYgKCFyZWFkb25seSkiCisJICogSG93ZXZlciBvbiBMaW51eCwgd2UgY2FuICYgZG8gcmVjb3ZlciBhIHJlYWQtb25seSBmaWxlc3lzdGVtLgorCSAqIFdlIG9ubHkgc2tpcCByZWNvdmVyeSBpZiBOT1JFQ09WRVJZIGlzIHNwZWNpZmllZCBvbiBtb3VudCwKKwkgKiBpbiB3aGljaCBjYXNlIHdlIHdvdWxkIG5vdCBiZSBoZXJlLgorCSAqCisJICogQnV0Li4uIGlmIHRoZSAtZGV2aWNlLSBpdHNlbGYgaXMgcmVhZG9ubHksIGp1c3Qgc2tpcCB0aGlzLgorCSAqIFdlIGNhbid0IHJlY292ZXIgdGhpcyBkZXZpY2UgYW55d2F5LCBzbyBpdCB3b24ndCBtYXR0ZXIuCisJICovCisJaWYgKCF4ZnNfcmVhZG9ubHlfYnVmdGFyZyhsb2ctPmxfbXAtPm1fbG9nZGV2X3RhcmdwKSkgeworCQllcnJvciA9IHhsb2dfY2xlYXJfc3RhbGVfYmxvY2tzKGxvZywgdGFpbF9sc24pOworCX0KKworYnJlYWRfZXJyOgorZXhpdDoKKwl4bG9nX3B1dF9icChicCk7CisKKwlpZiAoZXJyb3IpCisJCXhsb2dfd2FybigiWEZTOiBmYWlsZWQgdG8gbG9jYXRlIGxvZyB0YWlsIik7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogSXMgdGhlIGxvZyB6ZXJvZWQgYXQgYWxsPworICoKKyAqIFRoZSBsYXN0IGJpbmFyeSBzZWFyY2ggc2hvdWxkIGJlIGNoYW5nZWQgdG8gcGVyZm9ybSBhbiBYIGJsb2NrIHJlYWQKKyAqIG9uY2UgWCBiZWNvbWVzIHNtYWxsIGVub3VnaC4gIFlvdSBjYW4gdGhlbiBzZWFyY2ggbGluZWFybHkgdGhyb3VnaAorICogdGhlIFggYmxvY2tzLiAgVGhpcyB3aWxsIGN1dCBkb3duIG9uIHRoZSBudW1iZXIgb2YgcmVhZHMgd2UgbmVlZCB0byBkby4KKyAqCisgKiBJZiB0aGUgbG9nIGlzIHBhcnRpYWxseSB6ZXJvZWQsIHRoaXMgcm91dGluZSB3aWxsIHBhc3MgYmFjayB0aGUgYmxrbm8KKyAqIG9mIHRoZSBmaXJzdCBibG9jayB3aXRoIGN5Y2xlIG51bWJlciAwLiAgSXQgd29uJ3QgaGF2ZSBhIGNvbXBsZXRlIExSCisgKiBwcmVjZWRpbmcgaXQuCisgKgorICogUmV0dXJuOgorICoJMCAgPT4gdGhlIGxvZyBpcyBjb21wbGV0ZWx5IHdyaXR0ZW4gdG8KKyAqCS0xID0+IHVzZSAqYmxrX25vIGFzIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgbG9nCisgKgk+MCA9PiBlcnJvciBoYXMgb2NjdXJyZWQKKyAqLworaW50Cit4bG9nX2ZpbmRfemVyb2VkKAorCXhsb2dfdAkJKmxvZywKKwl4ZnNfZGFkZHJfdAkqYmxrX25vKQoreworCXhmc19idWZfdAkqYnA7CisJeGZzX2NhZGRyX3QJb2Zmc2V0OworCXVpbnQJICAgICAgICBmaXJzdF9jeWNsZSwgbGFzdF9jeWNsZTsKKwl4ZnNfZGFkZHJfdAluZXdfYmxrLCBsYXN0X2Jsaywgc3RhcnRfYmxrOworCXhmc19kYWRkcl90ICAgICBudW1fc2Nhbl9iYmxrczsKKwlpbnQJICAgICAgICBlcnJvciwgbG9nX2JibnVtID0gbG9nLT5sX2xvZ0JCc2l6ZTsKKworCS8qIGNoZWNrIHRvdGFsbHkgemVyb2VkIGxvZyAqLworCWJwID0geGxvZ19nZXRfYnAobG9nLCAxKTsKKwlpZiAoIWJwKQorCQlyZXR1cm4gRU5PTUVNOworCWlmICgoZXJyb3IgPSB4bG9nX2JyZWFkKGxvZywgMCwgMSwgYnApKSkKKwkJZ290byBicF9lcnI7CisJb2Zmc2V0ID0geGxvZ19hbGlnbihsb2csIDAsIDEsIGJwKTsKKwlmaXJzdF9jeWNsZSA9IEdFVF9DWUNMRShvZmZzZXQsIEFSQ0hfQ09OVkVSVCk7CisJaWYgKGZpcnN0X2N5Y2xlID09IDApIHsJCS8qIGNvbXBsZXRlbHkgemVyb2VkIGxvZyAqLworCQkqYmxrX25vID0gMDsKKwkJeGxvZ19wdXRfYnAoYnApOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogY2hlY2sgcGFydGlhbGx5IHplcm9lZCBsb2cgKi8KKwlpZiAoKGVycm9yID0geGxvZ19icmVhZChsb2csIGxvZ19iYm51bS0xLCAxLCBicCkpKQorCQlnb3RvIGJwX2VycjsKKwlvZmZzZXQgPSB4bG9nX2FsaWduKGxvZywgbG9nX2JibnVtLTEsIDEsIGJwKTsKKwlsYXN0X2N5Y2xlID0gR0VUX0NZQ0xFKG9mZnNldCwgQVJDSF9DT05WRVJUKTsKKwlpZiAobGFzdF9jeWNsZSAhPSAwKSB7CQkvKiBsb2cgY29tcGxldGVseSB3cml0dGVuIHRvICovCisJCXhsb2dfcHV0X2JwKGJwKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChmaXJzdF9jeWNsZSAhPSAxKSB7CisJCS8qCisJCSAqIElmIHRoZSBjeWNsZSBvZiB0aGUgbGFzdCBibG9jayBpcyB6ZXJvLCB0aGUgY3ljbGUgb2YKKwkJICogdGhlIGZpcnN0IGJsb2NrIG11c3QgYmUgMS4gSWYgaXQncyBub3QsIG1heWJlIHdlJ3JlCisJCSAqIG5vdCBsb29raW5nIGF0IGEgbG9nLi4uIEJhaWwgb3V0LgorCQkgKi8KKwkJeGxvZ193YXJuKCJYRlM6IExvZyBpbmNvbnNpc3RlbnQgb3Igbm90IGEgbG9nIChsYXN0PT0wLCBmaXJzdCE9MSkiKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCX0KKworCS8qIHdlIGhhdmUgYSBwYXJ0aWFsbHkgemVyb2VkIGxvZyAqLworCWxhc3RfYmxrID0gbG9nX2JibnVtLTE7CisJaWYgKChlcnJvciA9IHhsb2dfZmluZF9jeWNsZV9zdGFydChsb2csIGJwLCAwLCAmbGFzdF9ibGssIDApKSkKKwkJZ290byBicF9lcnI7CisKKwkvKgorCSAqIFZhbGlkYXRlIHRoZSBhbnN3ZXIuICBCZWNhdXNlIHRoZXJlIGlzIG5vIHdheSB0byBndWFyYW50ZWUgdGhhdAorCSAqIHRoZSBlbnRpcmUgbG9nIGlzIG1hZGUgdXAgb2YgbG9nIHJlY29yZHMgd2hpY2ggYXJlIHRoZSBzYW1lIHNpemUsCisJICogd2Ugc2NhbiBvdmVyIHRoZSBkZWZpbmVkIG1heGltdW0gYmxvY2tzLiAgQXQgdGhpcyBwb2ludCwgdGhlIG1heGltdW0KKwkgKiBpcyBub3QgY2hvc2VuIHRvIG1lYW4gYW55dGhpbmcgc3BlY2lhbC4gICBYWFhtaWtlbgorCSAqLworCW51bV9zY2FuX2JibGtzID0gWExPR19UT1RBTF9SRUNfU0hJRlQobG9nKTsKKwlBU1NFUlQobnVtX3NjYW5fYmJsa3MgPD0gSU5UX01BWCk7CisKKwlpZiAobGFzdF9ibGsgPCBudW1fc2Nhbl9iYmxrcykKKwkJbnVtX3NjYW5fYmJsa3MgPSBsYXN0X2JsazsKKwlzdGFydF9ibGsgPSBsYXN0X2JsayAtIG51bV9zY2FuX2JibGtzOworCisJLyoKKwkgKiBXZSBzZWFyY2ggZm9yIGFueSBpbnN0YW5jZXMgb2YgY3ljbGUgbnVtYmVyIDAgdGhhdCBvY2N1ciBiZWZvcmUKKwkgKiBvdXIgY3VycmVudCBlc3RpbWF0ZSBvZiB0aGUgaGVhZC4gIFdoYXQgd2UncmUgdHJ5aW5nIHRvIGRldGVjdCBpcworCSAqICAgICAgICAxIC4uLiB8IDAgfCAxIHwgMC4uLgorCSAqICAgICAgICAgICAgICAgICAgICAgICBeIGJpbmFyeSBzZWFyY2ggZW5kcyBoZXJlCisJICovCisJaWYgKChlcnJvciA9IHhsb2dfZmluZF92ZXJpZnlfY3ljbGUobG9nLCBzdGFydF9ibGssCisJCQkJCSAoaW50KW51bV9zY2FuX2JibGtzLCAwLCAmbmV3X2JsaykpKQorCQlnb3RvIGJwX2VycjsKKwlpZiAobmV3X2JsayAhPSAtMSkKKwkJbGFzdF9ibGsgPSBuZXdfYmxrOworCisJLyoKKwkgKiBQb3RlbnRpYWxseSBiYWNrdXAgb3ZlciBwYXJ0aWFsIGxvZyByZWNvcmQgd3JpdGUuICBXZSBkb24ndCBuZWVkCisJICogdG8gc2VhcmNoIHRoZSBlbmQgb2YgdGhlIGxvZyBiZWNhdXNlIHdlIGtub3cgaXQgaXMgemVyby4KKwkgKi8KKwlpZiAoKGVycm9yID0geGxvZ19maW5kX3ZlcmlmeV9sb2dfcmVjb3JkKGxvZywgc3RhcnRfYmxrLAorCQkJCSZsYXN0X2JsaywgMCkpID09IC0xKSB7CisJICAgIGVycm9yID0gWEZTX0VSUk9SKEVJTyk7CisJICAgIGdvdG8gYnBfZXJyOworCX0gZWxzZSBpZiAoZXJyb3IpCisJICAgIGdvdG8gYnBfZXJyOworCisJKmJsa19ubyA9IGxhc3RfYmxrOworYnBfZXJyOgorCXhsb2dfcHV0X2JwKGJwKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBUaGVzZSBhcmUgc2ltcGxlIHN1YnJvdXRpbmVzIHVzZWQgYnkgeGxvZ19jbGVhcl9zdGFsZV9ibG9ja3MoKSBiZWxvdworICogdG8gaW5pdGlhbGl6ZSBhIGJ1ZmZlciBmdWxsIG9mIGVtcHR5IGxvZyByZWNvcmQgaGVhZGVycyBhbmQgd3JpdGUKKyAqIHRoZW0gaW50byB0aGUgbG9nLgorICovCitTVEFUSUMgdm9pZAoreGxvZ19hZGRfcmVjb3JkKAorCXhsb2dfdAkJCSpsb2csCisJeGZzX2NhZGRyX3QJCWJ1ZiwKKwlpbnQJCQljeWNsZSwKKwlpbnQJCQlibG9jaywKKwlpbnQJCQl0YWlsX2N5Y2xlLAorCWludAkJCXRhaWxfYmxvY2spCit7CisJeGxvZ19yZWNfaGVhZGVyX3QJKnJlY3AgPSAoeGxvZ19yZWNfaGVhZGVyX3QgKilidWY7CisKKwltZW1zZXQoYnVmLCAwLCBCQlNJWkUpOworCUlOVF9TRVQocmVjcC0+aF9tYWdpY25vLCBBUkNIX0NPTlZFUlQsIFhMT0dfSEVBREVSX01BR0lDX05VTSk7CisJSU5UX1NFVChyZWNwLT5oX2N5Y2xlLCBBUkNIX0NPTlZFUlQsIGN5Y2xlKTsKKwlJTlRfU0VUKHJlY3AtPmhfdmVyc2lvbiwgQVJDSF9DT05WRVJULAorCQkJWEZTX1NCX1ZFUlNJT05fSEFTTE9HVjIoJmxvZy0+bF9tcC0+bV9zYikgPyAyIDogMSk7CisJQVNTSUdOX0FOWV9MU05fRElTSyhyZWNwLT5oX2xzbiwgY3ljbGUsIGJsb2NrKTsKKwlBU1NJR05fQU5ZX0xTTl9ESVNLKHJlY3AtPmhfdGFpbF9sc24sIHRhaWxfY3ljbGUsIHRhaWxfYmxvY2spOworCUlOVF9TRVQocmVjcC0+aF9mbXQsIEFSQ0hfQ09OVkVSVCwgWExPR19GTVQpOworCW1lbWNweSgmcmVjcC0+aF9mc191dWlkLCAmbG9nLT5sX21wLT5tX3NiLnNiX3V1aWQsIHNpemVvZih1dWlkX3QpKTsKK30KKworU1RBVElDIGludAoreGxvZ193cml0ZV9sb2dfcmVjb3JkcygKKwl4bG9nX3QJCSpsb2csCisJaW50CQljeWNsZSwKKwlpbnQJCXN0YXJ0X2Jsb2NrLAorCWludAkJYmxvY2tzLAorCWludAkJdGFpbF9jeWNsZSwKKwlpbnQJCXRhaWxfYmxvY2spCit7CisJeGZzX2NhZGRyX3QJb2Zmc2V0OworCXhmc19idWZfdAkqYnA7CisJaW50CQliYWxpZ24sIGVhbGlnbjsKKwlpbnQJCXNlY3RiYiA9IFhMT0dfU0VDVE9SX1JPVU5EVVBfQkJDT1VOVChsb2csIDEpOworCWludAkJZW5kX2Jsb2NrID0gc3RhcnRfYmxvY2sgKyBibG9ja3M7CisJaW50CQlidWZibGtzOworCWludAkJZXJyb3IgPSAwOworCWludAkJaSwgaiA9IDA7CisKKwlidWZibGtzID0gMSA8PCBmZnMoYmxvY2tzKTsKKwl3aGlsZSAoIShicCA9IHhsb2dfZ2V0X2JwKGxvZywgYnVmYmxrcykpKSB7CisJCWJ1ZmJsa3MgPj49IDE7CisJCWlmIChidWZibGtzIDw9IGxvZy0+bF9zZWN0YmJfbG9nKQorCQkJcmV0dXJuIEVOT01FTTsKKwl9CisKKwkvKiBXZSBtYXkgbmVlZCB0byBkbyBhIHJlYWQgYXQgdGhlIHN0YXJ0IHRvIGZpbGwgaW4gcGFydCBvZgorCSAqIHRoZSBidWZmZXIgaW4gdGhlIHN0YXJ0aW5nIHNlY3RvciBub3QgY292ZXJlZCBieSB0aGUgZmlyc3QKKwkgKiB3cml0ZSBiZWxvdy4KKwkgKi8KKwliYWxpZ24gPSBYTE9HX1NFQ1RPUl9ST1VORERPV05fQkxLTk8obG9nLCBzdGFydF9ibG9jayk7CisJaWYgKGJhbGlnbiAhPSBzdGFydF9ibG9jaykgeworCQlpZiAoKGVycm9yID0geGxvZ19icmVhZChsb2csIHN0YXJ0X2Jsb2NrLCAxLCBicCkpKSB7CisJCQl4bG9nX3B1dF9icChicCk7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJaiA9IHN0YXJ0X2Jsb2NrIC0gYmFsaWduOworCX0KKworCWZvciAoaSA9IHN0YXJ0X2Jsb2NrOyBpIDwgZW5kX2Jsb2NrOyBpICs9IGJ1ZmJsa3MpIHsKKwkJaW50CQliY291bnQsIGVuZGNvdW50OworCisJCWJjb3VudCA9IG1pbihidWZibGtzLCBlbmRfYmxvY2sgLSBzdGFydF9ibG9jayk7CisJCWVuZGNvdW50ID0gYmNvdW50IC0gajsKKworCQkvKiBXZSBtYXkgbmVlZCB0byBkbyBhIHJlYWQgYXQgdGhlIGVuZCB0byBmaWxsIGluIHBhcnQgb2YKKwkJICogdGhlIGJ1ZmZlciBpbiB0aGUgZmluYWwgc2VjdG9yIG5vdCBjb3ZlcmVkIGJ5IHRoZSB3cml0ZS4KKwkJICogSWYgdGhpcyBpcyB0aGUgc2FtZSBzZWN0b3IgYXMgdGhlIGFib3ZlIHJlYWQsIHNraXAgaXQuCisJCSAqLworCQllYWxpZ24gPSBYTE9HX1NFQ1RPUl9ST1VORERPV05fQkxLTk8obG9nLCBlbmRfYmxvY2spOworCQlpZiAoaiA9PSAwICYmIChzdGFydF9ibG9jayArIGVuZGNvdW50ID4gZWFsaWduKSkgeworCQkJb2Zmc2V0ID0gWEZTX0JVRl9QVFIoYnApOworCQkJYmFsaWduID0gQkJUT0IoZWFsaWduIC0gc3RhcnRfYmxvY2spOworCQkJWEZTX0JVRl9TRVRfUFRSKGJwLCBvZmZzZXQgKyBiYWxpZ24sIEJCVE9CKHNlY3RiYikpOworCQkJaWYgKChlcnJvciA9IHhsb2dfYnJlYWQobG9nLCBlYWxpZ24sIHNlY3RiYiwgYnApKSkKKwkJCQlicmVhazsKKwkJCVhGU19CVUZfU0VUX1BUUihicCwgb2Zmc2V0LCBidWZibGtzKTsKKwkJfQorCisJCW9mZnNldCA9IHhsb2dfYWxpZ24obG9nLCBzdGFydF9ibG9jaywgZW5kY291bnQsIGJwKTsKKwkJZm9yICg7IGogPCBlbmRjb3VudDsgaisrKSB7CisJCQl4bG9nX2FkZF9yZWNvcmQobG9nLCBvZmZzZXQsIGN5Y2xlLCBpK2osCisJCQkJCXRhaWxfY3ljbGUsIHRhaWxfYmxvY2spOworCQkJb2Zmc2V0ICs9IEJCU0laRTsKKwkJfQorCQllcnJvciA9IHhsb2dfYndyaXRlKGxvZywgc3RhcnRfYmxvY2ssIGVuZGNvdW50LCBicCk7CisJCWlmIChlcnJvcikKKwkJCWJyZWFrOworCQlzdGFydF9ibG9jayArPSBlbmRjb3VudDsKKwkJaiA9IDA7CisJfQorCXhsb2dfcHV0X2JwKGJwKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGJsb3cgYXdheSBhbnkgaW5jb21wbGV0ZSBsb2cgd3JpdGVzIG91dAorICogaW4gZnJvbnQgb2YgdGhlIGxvZyBoZWFkLiAgV2UgZG8gdGhpcyBzbyB0aGF0IHdlIHdvbid0IGJlY29tZSBjb25mdXNlZAorICogaWYgd2UgY29tZSB1cCwgd3JpdGUgb25seSBhIGxpdHRsZSBiaXQgbW9yZSwgYW5kIHRoZW4gY3Jhc2ggYWdhaW4uCisgKiBJZiB3ZSBsZWF2ZSB0aGUgcGFydGlhbCBsb2cgcmVjb3JkcyBvdXQgdGhlcmUsIHRoaXMgc2l0dWF0aW9uIGNvdWxkCisgKiBjYXVzZSB1cyB0byB0aGluayB0aG9zZSBwYXJ0aWFsIHdyaXRlcyBhcmUgdmFsaWQgYmxvY2tzIHNpbmNlIHRoZXkKKyAqIGhhdmUgdGhlIGN1cnJlbnQgY3ljbGUgbnVtYmVyLiAgV2UgZ2V0IHJpZCBvZiB0aGVtIGJ5IG92ZXJ3cml0aW5nIHRoZW0KKyAqIHdpdGggZW1wdHkgbG9nIHJlY29yZHMgd2l0aCB0aGUgb2xkIGN5Y2xlIG51bWJlciByYXRoZXIgdGhhbiB0aGUKKyAqIGN1cnJlbnQgb25lLgorICoKKyAqIFRoZSB0YWlsIGxzbiBpcyBwYXNzZWQgaW4gcmF0aGVyIHRoYW4gdGFrZW4gZnJvbQorICogdGhlIGxvZyBzbyB0aGF0IHdlIHdpbGwgbm90IHdyaXRlIG92ZXIgdGhlIHVubW91bnQgcmVjb3JkIGFmdGVyIGEKKyAqIGNsZWFuIHVubW91bnQgaW4gYSA1MTIgYmxvY2sgbG9nLiAgRG9pbmcgc28gd291bGQgbGVhdmUgdGhlIGxvZyB3aXRob3V0CisgKiBhbnkgdmFsaWQgbG9nIHJlY29yZHMgaW4gaXQgdW50aWwgYSBuZXcgb25lIHdhcyB3cml0dGVuLiAgSWYgd2UgY3Jhc2hlZAorICogZHVyaW5nIHRoYXQgdGltZSB3ZSB3b3VsZCBub3QgYmUgYWJsZSB0byByZWNvdmVyLgorICovCitTVEFUSUMgaW50Cit4bG9nX2NsZWFyX3N0YWxlX2Jsb2NrcygKKwl4bG9nX3QJCSpsb2csCisJeGZzX2xzbl90CXRhaWxfbHNuKQoreworCWludAkJdGFpbF9jeWNsZSwgaGVhZF9jeWNsZTsKKwlpbnQJCXRhaWxfYmxvY2ssIGhlYWRfYmxvY2s7CisJaW50CQl0YWlsX2Rpc3RhbmNlLCBtYXhfZGlzdGFuY2U7CisJaW50CQlkaXN0YW5jZTsKKwlpbnQJCWVycm9yOworCisJdGFpbF9jeWNsZSA9IENZQ0xFX0xTTih0YWlsX2xzbik7CisJdGFpbF9ibG9jayA9IEJMT0NLX0xTTih0YWlsX2xzbik7CisJaGVhZF9jeWNsZSA9IGxvZy0+bF9jdXJyX2N5Y2xlOworCWhlYWRfYmxvY2sgPSBsb2ctPmxfY3Vycl9ibG9jazsKKworCS8qCisJICogRmlndXJlIG91dCB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgbmV3IGhlYWQgb2YgdGhlIGxvZworCSAqIGFuZCB0aGUgdGFpbC4gIFdlIHdhbnQgdG8gd3JpdGUgb3ZlciBhbnkgYmxvY2tzIGJleW9uZCB0aGUKKwkgKiBoZWFkIHRoYXQgd2UgbWF5IGhhdmUgd3JpdHRlbiBqdXN0IGJlZm9yZSB0aGUgY3Jhc2gsIGJ1dAorCSAqIHdlIGRvbid0IHdhbnQgdG8gb3ZlcndyaXRlIHRoZSB0YWlsIG9mIHRoZSBsb2cuCisJICovCisJaWYgKGhlYWRfY3ljbGUgPT0gdGFpbF9jeWNsZSkgeworCQkvKgorCQkgKiBUaGUgdGFpbCBpcyBiZWhpbmQgdGhlIGhlYWQgaW4gdGhlIHBoeXNpY2FsIGxvZywKKwkJICogc28gdGhlIGRpc3RhbmNlIGZyb20gdGhlIGhlYWQgdG8gdGhlIHRhaWwgaXMgdGhlCisJCSAqIGRpc3RhbmNlIGZyb20gdGhlIGhlYWQgdG8gdGhlIGVuZCBvZiB0aGUgbG9nIHBsdXMKKwkJICogdGhlIGRpc3RhbmNlIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgbG9nIHRvIHRoZQorCQkgKiB0YWlsLgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KGhlYWRfYmxvY2sgPCB0YWlsX2Jsb2NrIHx8IGhlYWRfYmxvY2sgPj0gbG9nLT5sX2xvZ0JCc2l6ZSkpIHsKKwkJCVhGU19FUlJPUl9SRVBPUlQoInhsb2dfY2xlYXJfc3RhbGVfYmxvY2tzKDEpIiwKKwkJCQkJIFhGU19FUlJMRVZFTF9MT1csIGxvZy0+bF9tcCk7CisJCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJCX0KKwkJdGFpbF9kaXN0YW5jZSA9IHRhaWxfYmxvY2sgKyAobG9nLT5sX2xvZ0JCc2l6ZSAtIGhlYWRfYmxvY2spOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFRoZSBoZWFkIGlzIGJlaGluZCB0aGUgdGFpbCBpbiB0aGUgcGh5c2ljYWwgbG9nLAorCQkgKiBzbyB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgaGVhZCB0byB0aGUgdGFpbCBpcyBqdXN0CisJCSAqIHRoZSB0YWlsIGJsb2NrIG1pbnVzIHRoZSBoZWFkIGJsb2NrLgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KGhlYWRfYmxvY2sgPj0gdGFpbF9ibG9jayB8fCBoZWFkX2N5Y2xlICE9ICh0YWlsX2N5Y2xlICsgMSkpKXsKKwkJCVhGU19FUlJPUl9SRVBPUlQoInhsb2dfY2xlYXJfc3RhbGVfYmxvY2tzKDIpIiwKKwkJCQkJIFhGU19FUlJMRVZFTF9MT1csIGxvZy0+bF9tcCk7CisJCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJCX0KKwkJdGFpbF9kaXN0YW5jZSA9IHRhaWxfYmxvY2sgLSBoZWFkX2Jsb2NrOworCX0KKworCS8qCisJICogSWYgdGhlIGhlYWQgaXMgcmlnaHQgdXAgYWdhaW5zdCB0aGUgdGFpbCwgd2UgY2FuJ3QgY2xlYXIKKwkgKiBhbnl0aGluZy4KKwkgKi8KKwlpZiAodGFpbF9kaXN0YW5jZSA8PSAwKSB7CisJCUFTU0VSVCh0YWlsX2Rpc3RhbmNlID09IDApOworCQlyZXR1cm4gMDsKKwl9CisKKwltYXhfZGlzdGFuY2UgPSBYTE9HX1RPVEFMX1JFQ19TSElGVChsb2cpOworCS8qCisJICogVGFrZSB0aGUgc21hbGxlciBvZiB0aGUgbWF4aW11bSBhbW91bnQgb2Ygb3V0c3RhbmRpbmcgSS9PCisJICogd2UgY291bGQgaGF2ZSBhbmQgdGhlIGRpc3RhbmNlIHRvIHRoZSB0YWlsIHRvIGNsZWFyIG91dC4KKwkgKiBXZSB0YWtlIHRoZSBzbWFsbGVyIHNvIHRoYXQgd2UgZG9uJ3Qgb3ZlcndyaXRlIHRoZSB0YWlsIGFuZAorCSAqIHdlIGRvbid0IHdhc3RlIGFsbCBkYXkgd3JpdGluZyBmcm9tIHRoZSBoZWFkIHRvIHRoZSB0YWlsCisJICogZm9yIG5vIHJlYXNvbi4KKwkgKi8KKwltYXhfZGlzdGFuY2UgPSBNSU4obWF4X2Rpc3RhbmNlLCB0YWlsX2Rpc3RhbmNlKTsKKworCWlmICgoaGVhZF9ibG9jayArIG1heF9kaXN0YW5jZSkgPD0gbG9nLT5sX2xvZ0JCc2l6ZSkgeworCQkvKgorCQkgKiBXZSBjYW4gc3RvbXAgYWxsIHRoZSBibG9ja3Mgd2UgbmVlZCB0byB3aXRob3V0CisJCSAqIHdyYXBwaW5nIGFyb3VuZCB0aGUgZW5kIG9mIHRoZSBsb2cuICBKdXN0IGRvIGl0CisJCSAqIGluIGEgc2luZ2xlIHdyaXRlLiAgVXNlIHRoZSBjeWNsZSBudW1iZXIgb2YgdGhlCisJCSAqIGN1cnJlbnQgY3ljbGUgbWludXMgb25lIHNvIHRoYXQgdGhlIGxvZyB3aWxsIGxvb2sgbGlrZToKKwkJICogICAgIG4gLi4uIHwgbiAtIDEgLi4uCisJCSAqLworCQllcnJvciA9IHhsb2dfd3JpdGVfbG9nX3JlY29yZHMobG9nLCAoaGVhZF9jeWNsZSAtIDEpLAorCQkJCWhlYWRfYmxvY2ssIG1heF9kaXN0YW5jZSwgdGFpbF9jeWNsZSwKKwkJCQl0YWlsX2Jsb2NrKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFdlIG5lZWQgdG8gd3JhcCBhcm91bmQgdGhlIGVuZCBvZiB0aGUgcGh5c2ljYWwgbG9nIGluCisJCSAqIG9yZGVyIHRvIGNsZWFyIGFsbCB0aGUgYmxvY2tzLiAgRG8gaXQgaW4gdHdvIHNlcGFyYXRlCisJCSAqIEkvT3MuICBUaGUgZmlyc3Qgd3JpdGUgc2hvdWxkIGJlIGZyb20gdGhlIGhlYWQgdG8gdGhlCisJCSAqIGVuZCBvZiB0aGUgcGh5c2ljYWwgbG9nLCBhbmQgaXQgc2hvdWxkIHVzZSB0aGUgY3VycmVudAorCQkgKiBjeWNsZSBudW1iZXIgbWludXMgb25lIGp1c3QgbGlrZSBhYm92ZS4KKwkJICovCisJCWRpc3RhbmNlID0gbG9nLT5sX2xvZ0JCc2l6ZSAtIGhlYWRfYmxvY2s7CisJCWVycm9yID0geGxvZ193cml0ZV9sb2dfcmVjb3Jkcyhsb2csIChoZWFkX2N5Y2xlIC0gMSksCisJCQkJaGVhZF9ibG9jaywgZGlzdGFuY2UsIHRhaWxfY3ljbGUsCisJCQkJdGFpbF9ibG9jayk7CisKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOworCisJCS8qCisJCSAqIE5vdyB3cml0ZSB0aGUgYmxvY2tzIGF0IHRoZSBzdGFydCBvZiB0aGUgcGh5c2ljYWwgbG9nLgorCQkgKiBUaGlzIHdyaXRlcyB0aGUgcmVtYWluZGVyIG9mIHRoZSBibG9ja3Mgd2Ugd2FudCB0byBjbGVhci4KKwkJICogSXQgdXNlcyB0aGUgY3VycmVudCBjeWNsZSBudW1iZXIgc2luY2Ugd2UncmUgbm93IG9uIHRoZQorCQkgKiBzYW1lIGN5Y2xlIGFzIHRoZSBoZWFkIHNvIHRoYXQgd2UgZ2V0OgorCQkgKiAgICBuIC4uLiBuIC4uLiB8IG4gLSAxIC4uLgorCQkgKiAgICBeXl5eXiBibG9ja3Mgd2UncmUgd3JpdGluZworCQkgKi8KKwkJZGlzdGFuY2UgPSBtYXhfZGlzdGFuY2UgLSAobG9nLT5sX2xvZ0JCc2l6ZSAtIGhlYWRfYmxvY2spOworCQllcnJvciA9IHhsb2dfd3JpdGVfbG9nX3JlY29yZHMobG9nLCBoZWFkX2N5Y2xlLCAwLCBkaXN0YW5jZSwKKwkJCQl0YWlsX2N5Y2xlLCB0YWlsX2Jsb2NrKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOworCX0KKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJCUxvZyByZWNvdmVyIHJvdXRpbmVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKK1NUQVRJQyB4bG9nX3JlY292ZXJfdCAqCit4bG9nX3JlY292ZXJfZmluZF90aWQoCisJeGxvZ19yZWNvdmVyX3QJCSpxLAorCXhsb2dfdGlkX3QJCXRpZCkKK3sKKwl4bG9nX3JlY292ZXJfdAkJKnAgPSBxOworCisJd2hpbGUgKHAgIT0gTlVMTCkgeworCQlpZiAocC0+cl9sb2dfdGlkID09IHRpZCkKKwkJICAgIGJyZWFrOworCQlwID0gcC0+cl9uZXh0OworCX0KKwlyZXR1cm4gcDsKK30KKworU1RBVElDIHZvaWQKK3hsb2dfcmVjb3Zlcl9wdXRfaGFzaHEoCisJeGxvZ19yZWNvdmVyX3QJCSoqcSwKKwl4bG9nX3JlY292ZXJfdAkJKnRyYW5zKQoreworCXRyYW5zLT5yX25leHQgPSAqcTsKKwkqcSA9IHRyYW5zOworfQorCitTVEFUSUMgdm9pZAoreGxvZ19yZWNvdmVyX2FkZF9pdGVtKAorCXhsb2dfcmVjb3Zlcl9pdGVtX3QJKippdGVtcSkKK3sKKwl4bG9nX3JlY292ZXJfaXRlbV90CSppdGVtOworCisJaXRlbSA9IGttZW1femFsbG9jKHNpemVvZih4bG9nX3JlY292ZXJfaXRlbV90KSwgS01fU0xFRVApOworCXhsb2dfcmVjb3Zlcl9pbnNlcnRfaXRlbV9iYWNrcShpdGVtcSwgaXRlbSk7Cit9CisKK1NUQVRJQyBpbnQKK3hsb2dfcmVjb3Zlcl9hZGRfdG9fY29udF90cmFucygKKwl4bG9nX3JlY292ZXJfdAkJKnRyYW5zLAorCXhmc19jYWRkcl90CQlkcCwKKwlpbnQJCQlsZW4pCit7CisJeGxvZ19yZWNvdmVyX2l0ZW1fdAkqaXRlbTsKKwl4ZnNfY2FkZHJfdAkJcHRyLCBvbGRfcHRyOworCWludAkJCW9sZF9sZW47CisKKwlpdGVtID0gdHJhbnMtPnJfaXRlbXE7CisJaWYgKGl0ZW0gPT0gMCkgeworCQkvKiBmaW5pc2ggY29weWluZyByZXN0IG9mIHRyYW5zIGhlYWRlciAqLworCQl4bG9nX3JlY292ZXJfYWRkX2l0ZW0oJnRyYW5zLT5yX2l0ZW1xKTsKKwkJcHRyID0gKHhmc19jYWRkcl90KSAmdHJhbnMtPnJfdGhlYWRlciArCisJCQkJc2l6ZW9mKHhmc190cmFuc19oZWFkZXJfdCkgLSBsZW47CisJCW1lbWNweShwdHIsIGRwLCBsZW4pOyAvKiBkLCBzLCBsICovCisJCXJldHVybiAwOworCX0KKwlpdGVtID0gaXRlbS0+cmlfcHJldjsKKworCW9sZF9wdHIgPSBpdGVtLT5yaV9idWZbaXRlbS0+cmlfY250LTFdLmlfYWRkcjsKKwlvbGRfbGVuID0gaXRlbS0+cmlfYnVmW2l0ZW0tPnJpX2NudC0xXS5pX2xlbjsKKworCXB0ciA9IGttZW1fcmVhbGxvYyhvbGRfcHRyLCBsZW4rb2xkX2xlbiwgb2xkX2xlbiwgMCk7CisJbWVtY3B5KCZwdHJbb2xkX2xlbl0sIGRwLCBsZW4pOyAvKiBkLCBzLCBsICovCisJaXRlbS0+cmlfYnVmW2l0ZW0tPnJpX2NudC0xXS5pX2xlbiArPSBsZW47CisJaXRlbS0+cmlfYnVmW2l0ZW0tPnJpX2NudC0xXS5pX2FkZHIgPSBwdHI7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGUgbmV4dCByZWdpb24gdG8gYWRkIGlzIHRoZSBzdGFydCBvZiBhIG5ldyByZWdpb24uICBJdCBjb3VsZCBiZQorICogYSB3aG9sZSByZWdpb24gb3IgaXQgY291bGQgYmUgdGhlIGZpcnN0IHBhcnQgb2YgYSBuZXcgcmVnaW9uLiAgQmVjYXVzZQorICogb2YgdGhpcywgdGhlIGFzc3VtcHRpb24gaGVyZSBpcyB0aGF0IHRoZSB0eXBlIGFuZCBzaXplIGZpZWxkcyBvZiBhbGwKKyAqIGZvcm1hdCBzdHJ1Y3R1cmVzIGZpdCBpbnRvIHRoZSBmaXJzdCAzMiBiaXRzIG9mIHRoZSBzdHJ1Y3R1cmUuCisgKgorICogVGhpcyB3b3JrcyBiZWNhdXNlIGFsbCByZWdpb25zIG11c3QgYmUgMzIgYml0IGFsaWduZWQuICBUaGVyZWZvcmUsIHdlCisgKiBlaXRoZXIgaGF2ZSBib3RoIGZpZWxkcyBvciB3ZSBoYXZlIG5laXRoZXIgZmllbGQuICBJbiB0aGUgY2FzZSB3ZSBoYXZlCisgKiBuZWl0aGVyIGZpZWxkLCB0aGUgZGF0YSBwYXJ0IG9mIHRoZSByZWdpb24gaXMgemVybyBsZW5ndGguICBXZSBvbmx5IGhhdmUKKyAqIGEgbG9nX29wX2hlYWRlciBhbmQgY2FuIHRocm93IGF3YXkgdGhlIGhlYWRlciBzaW5jZSBhIG5ldyBvbmUgd2lsbCBhcHBlYXIKKyAqIGxhdGVyLiAgSWYgd2UgaGF2ZSBhdCBsZWFzdCA0IGJ5dGVzLCB0aGVuIHdlIGNhbiBkZXRlcm1pbmUgaG93IG1hbnkgcmVnaW9ucworICogd2lsbCBhcHBlYXIgaW4gdGhlIGN1cnJlbnQgbG9nIGl0ZW0uCisgKi8KK1NUQVRJQyBpbnQKK3hsb2dfcmVjb3Zlcl9hZGRfdG9fdHJhbnMoCisJeGxvZ19yZWNvdmVyX3QJCSp0cmFucywKKwl4ZnNfY2FkZHJfdAkJZHAsCisJaW50CQkJbGVuKQoreworCXhmc19pbm9kZV9sb2dfZm9ybWF0X3QJKmluX2Y7CQkJLyogYW55IHdpbGwgZG8gKi8KKwl4bG9nX3JlY292ZXJfaXRlbV90CSppdGVtOworCXhmc19jYWRkcl90CQlwdHI7CisKKwlpZiAoIWxlbikKKwkJcmV0dXJuIDA7CisJaXRlbSA9IHRyYW5zLT5yX2l0ZW1xOworCWlmIChpdGVtID09IDApIHsKKwkJQVNTRVJUKCoodWludCAqKWRwID09IFhGU19UUkFOU19IRUFERVJfTUFHSUMpOworCQlpZiAobGVuID09IHNpemVvZih4ZnNfdHJhbnNfaGVhZGVyX3QpKQorCQkJeGxvZ19yZWNvdmVyX2FkZF9pdGVtKCZ0cmFucy0+cl9pdGVtcSk7CisJCW1lbWNweSgmdHJhbnMtPnJfdGhlYWRlciwgZHAsIGxlbik7IC8qIGQsIHMsIGwgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJcHRyID0ga21lbV9hbGxvYyhsZW4sIEtNX1NMRUVQKTsKKwltZW1jcHkocHRyLCBkcCwgbGVuKTsKKwlpbl9mID0gKHhmc19pbm9kZV9sb2dfZm9ybWF0X3QgKilwdHI7CisKKwlpZiAoaXRlbS0+cmlfcHJldi0+cmlfdG90YWwgIT0gMCAmJgorCSAgICAgaXRlbS0+cmlfcHJldi0+cmlfdG90YWwgPT0gaXRlbS0+cmlfcHJldi0+cmlfY250KSB7CisJCXhsb2dfcmVjb3Zlcl9hZGRfaXRlbSgmdHJhbnMtPnJfaXRlbXEpOworCX0KKwlpdGVtID0gdHJhbnMtPnJfaXRlbXE7CisJaXRlbSA9IGl0ZW0tPnJpX3ByZXY7CisKKwlpZiAoaXRlbS0+cmlfdG90YWwgPT0gMCkgewkJLyogZmlyc3QgcmVnaW9uIHRvIGJlIGFkZGVkICovCisJCWl0ZW0tPnJpX3RvdGFsCT0gaW5fZi0+aWxmX3NpemU7CisJCUFTU0VSVChpdGVtLT5yaV90b3RhbCA8PSBYTE9HX01BWF9SRUdJT05TX0lOX0lURU0pOworCQlpdGVtLT5yaV9idWYgPSBrbWVtX3phbGxvYygoaXRlbS0+cmlfdG90YWwgKgorCQkJCQkgICAgc2l6ZW9mKHhmc19sb2dfaW92ZWNfdCkpLCBLTV9TTEVFUCk7CisJfQorCUFTU0VSVChpdGVtLT5yaV90b3RhbCA+IGl0ZW0tPnJpX2NudCk7CisJLyogRGVzY3JpcHRpb24gcmVnaW9uIGlzIHJpX2J1ZlswXSAqLworCWl0ZW0tPnJpX2J1ZltpdGVtLT5yaV9jbnRdLmlfYWRkciA9IHB0cjsKKwlpdGVtLT5yaV9idWZbaXRlbS0+cmlfY250XS5pX2xlbiAgPSBsZW47CisJaXRlbS0+cmlfY250Kys7CisJcmV0dXJuIDA7Cit9CisKK1NUQVRJQyB2b2lkCit4bG9nX3JlY292ZXJfbmV3X3RpZCgKKwl4bG9nX3JlY292ZXJfdAkJKipxLAorCXhsb2dfdGlkX3QJCXRpZCwKKwl4ZnNfbHNuX3QJCWxzbikKK3sKKwl4bG9nX3JlY292ZXJfdAkJKnRyYW5zOworCisJdHJhbnMgPSBrbWVtX3phbGxvYyhzaXplb2YoeGxvZ19yZWNvdmVyX3QpLCBLTV9TTEVFUCk7CisJdHJhbnMtPnJfbG9nX3RpZCAgID0gdGlkOworCXRyYW5zLT5yX2xzbgkgICA9IGxzbjsKKwl4bG9nX3JlY292ZXJfcHV0X2hhc2hxKHEsIHRyYW5zKTsKK30KKworU1RBVElDIGludAoreGxvZ19yZWNvdmVyX3VubGlua190aWQoCisJeGxvZ19yZWNvdmVyX3QJCSoqcSwKKwl4bG9nX3JlY292ZXJfdAkJKnRyYW5zKQoreworCXhsb2dfcmVjb3Zlcl90CQkqdHA7CisJaW50CQkJZm91bmQgPSAwOworCisJQVNTRVJUKHRyYW5zICE9IDApOworCWlmICh0cmFucyA9PSAqcSkgeworCQkqcSA9ICgqcSktPnJfbmV4dDsKKwl9IGVsc2UgeworCQl0cCA9ICpxOworCQl3aGlsZSAodHAgIT0gMCkgeworCQkJaWYgKHRwLT5yX25leHQgPT0gdHJhbnMpIHsKKwkJCQlmb3VuZCA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCQl0cCA9IHRwLT5yX25leHQ7CisJCX0KKwkJaWYgKCFmb3VuZCkgeworCQkJeGxvZ193YXJuKAorCQkJICAgICAiWEZTOiB4bG9nX3JlY292ZXJfdW5saW5rX3RpZDogdHJhbnMgbm90IGZvdW5kIik7CisJCQlBU1NFUlQoMCk7CisJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJCX0KKwkJdHAtPnJfbmV4dCA9IHRwLT5yX25leHQtPnJfbmV4dDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK1NUQVRJQyB2b2lkCit4bG9nX3JlY292ZXJfaW5zZXJ0X2l0ZW1fYmFja3EoCisJeGxvZ19yZWNvdmVyX2l0ZW1fdAkqKnEsCisJeGxvZ19yZWNvdmVyX2l0ZW1fdAkqaXRlbSkKK3sKKwlpZiAoKnEgPT0gMCkgeworCQlpdGVtLT5yaV9wcmV2ID0gaXRlbS0+cmlfbmV4dCA9IGl0ZW07CisJCSpxID0gaXRlbTsKKwl9IGVsc2UgeworCQlpdGVtLT5yaV9uZXh0CQk9ICpxOworCQlpdGVtLT5yaV9wcmV2CQk9ICgqcSktPnJpX3ByZXY7CisJCSgqcSktPnJpX3ByZXYJCT0gaXRlbTsKKwkJaXRlbS0+cmlfcHJldi0+cmlfbmV4dAk9IGl0ZW07CisJfQorfQorCitTVEFUSUMgdm9pZAoreGxvZ19yZWNvdmVyX2luc2VydF9pdGVtX2Zyb250cSgKKwl4bG9nX3JlY292ZXJfaXRlbV90CSoqcSwKKwl4bG9nX3JlY292ZXJfaXRlbV90CSppdGVtKQoreworCXhsb2dfcmVjb3Zlcl9pbnNlcnRfaXRlbV9iYWNrcShxLCBpdGVtKTsKKwkqcSA9IGl0ZW07Cit9CisKK1NUQVRJQyBpbnQKK3hsb2dfcmVjb3Zlcl9yZW9yZGVyX3RyYW5zKAorCXhsb2dfdAkJCSpsb2csCisJeGxvZ19yZWNvdmVyX3QJCSp0cmFucykKK3sKKwl4bG9nX3JlY292ZXJfaXRlbV90CSpmaXJzdF9pdGVtLCAqaXRlbXEsICppdGVtcV9uZXh0OworCXhmc19idWZfbG9nX2Zvcm1hdF90CSpidWZfZjsKKwl4ZnNfYnVmX2xvZ19mb3JtYXRfdjFfdAkqb2J1Zl9mOworCXVzaG9ydAkJCWZsYWdzID0gMDsKKworCWZpcnN0X2l0ZW0gPSBpdGVtcSA9IHRyYW5zLT5yX2l0ZW1xOworCXRyYW5zLT5yX2l0ZW1xID0gTlVMTDsKKwlkbyB7CisJCWl0ZW1xX25leHQgPSBpdGVtcS0+cmlfbmV4dDsKKwkJYnVmX2YgPSAoeGZzX2J1Zl9sb2dfZm9ybWF0X3QgKilpdGVtcS0+cmlfYnVmWzBdLmlfYWRkcjsKKwkJc3dpdGNoIChJVEVNX1RZUEUoaXRlbXEpKSB7CisJCWNhc2UgWEZTX0xJX0JVRjoKKwkJCWZsYWdzID0gYnVmX2YtPmJsZl9mbGFnczsKKwkJCWJyZWFrOworCQljYXNlIFhGU19MSV82XzFfQlVGOgorCQljYXNlIFhGU19MSV81XzNfQlVGOgorCQkJb2J1Zl9mID0gKHhmc19idWZfbG9nX2Zvcm1hdF92MV90KilidWZfZjsKKwkJCWZsYWdzID0gb2J1Zl9mLT5ibGZfZmxhZ3M7CisJCQlicmVhazsKKwkJfQorCisJCXN3aXRjaCAoSVRFTV9UWVBFKGl0ZW1xKSkgeworCQljYXNlIFhGU19MSV9CVUY6CisJCWNhc2UgWEZTX0xJXzZfMV9CVUY6CisJCWNhc2UgWEZTX0xJXzVfM19CVUY6CisJCQlpZiAoIShmbGFncyAmIFhGU19CTElfQ0FOQ0VMKSkgeworCQkJCXhsb2dfcmVjb3Zlcl9pbnNlcnRfaXRlbV9mcm9udHEoJnRyYW5zLT5yX2l0ZW1xLAorCQkJCQkJCQlpdGVtcSk7CisJCQkJYnJlYWs7CisJCQl9CisJCWNhc2UgWEZTX0xJX0lOT0RFOgorCQljYXNlIFhGU19MSV82XzFfSU5PREU6CisJCWNhc2UgWEZTX0xJXzVfM19JTk9ERToKKwkJY2FzZSBYRlNfTElfRFFVT1Q6CisJCWNhc2UgWEZTX0xJX1FVT1RBT0ZGOgorCQljYXNlIFhGU19MSV9FRkQ6CisJCWNhc2UgWEZTX0xJX0VGSToKKwkJCXhsb2dfcmVjb3Zlcl9pbnNlcnRfaXRlbV9iYWNrcSgmdHJhbnMtPnJfaXRlbXEsIGl0ZW1xKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJeGxvZ193YXJuKAorCSJYRlM6IHhsb2dfcmVjb3Zlcl9yZW9yZGVyX3RyYW5zOiB1bnJlY29nbml6ZWQgdHlwZSBvZiBsb2cgb3BlcmF0aW9uIik7CisJCQlBU1NFUlQoMCk7CisJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJCX0KKwkJaXRlbXEgPSBpdGVtcV9uZXh0OworCX0gd2hpbGUgKGZpcnN0X2l0ZW0gIT0gaXRlbXEpOworCXJldHVybiAwOworfQorCisvKgorICogQnVpbGQgdXAgdGhlIHRhYmxlIG9mIGJ1ZiBjYW5jZWwgcmVjb3JkcyBzbyB0aGF0IHdlIGRvbid0IHJlcGxheQorICogY2FuY2VsbGVkIGRhdGEgaW4gdGhlIHNlY29uZCBwYXNzLiAgRm9yIGJ1ZmZlciByZWNvcmRzIHRoYXQgYXJlCisgKiBub3QgY2FuY2VsIHJlY29yZHMsIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gaGVyZSBzbyB3ZSBqdXN0IHJldHVybi4KKyAqCisgKiBJZiB3ZSBnZXQgYSBjYW5jZWwgcmVjb3JkIHdoaWNoIGlzIGFscmVhZHkgaW4gdGhlIHRhYmxlLCB0aGlzIGluZGljYXRlcworICogdGhhdCB0aGUgYnVmZmVyIHdhcyBjYW5jZWxsZWQgbXVsdGlwbGUgdGltZXMuICBJbiBvcmRlciB0byBlbnN1cmUKKyAqIHRoYXQgZHVyaW5nIHBhc3MgMiB3ZSBrZWVwIHRoZSByZWNvcmQgaW4gdGhlIHRhYmxlIHVudGlsIHdlIHJlYWNoIGl0cworICogbGFzdCBvY2N1cnJlbmNlIGluIHRoZSBsb2csIHdlIGtlZXAgYSByZWZlcmVuY2UgY291bnQgaW4gdGhlIGNhbmNlbAorICogcmVjb3JkIGluIHRoZSB0YWJsZSB0byB0ZWxsIHVzIGhvdyBtYW55IHRpbWVzIHdlIGV4cGVjdCB0byBzZWUgdGhpcworICogcmVjb3JkIGR1cmluZyB0aGUgc2Vjb25kIHBhc3MuCisgKi8KK1NUQVRJQyB2b2lkCit4bG9nX3JlY292ZXJfZG9fYnVmZmVyX3Bhc3MxKAorCXhsb2dfdAkJCSpsb2csCisJeGZzX2J1Zl9sb2dfZm9ybWF0X3QJKmJ1Zl9mKQoreworCXhmc19idWZfY2FuY2VsX3QJKmJjcDsKKwl4ZnNfYnVmX2NhbmNlbF90CSpuZXh0cDsKKwl4ZnNfYnVmX2NhbmNlbF90CSpwcmV2cDsKKwl4ZnNfYnVmX2NhbmNlbF90CSoqYnVja2V0OworCXhmc19idWZfbG9nX2Zvcm1hdF92MV90CSpvYnVmX2Y7CisJeGZzX2RhZGRyX3QJCWJsa25vID0gMDsKKwl1aW50CQkJbGVuID0gMDsKKwl1c2hvcnQJCQlmbGFncyA9IDA7CisKKwlzd2l0Y2ggKGJ1Zl9mLT5ibGZfdHlwZSkgeworCWNhc2UgWEZTX0xJX0JVRjoKKwkJYmxrbm8gPSBidWZfZi0+YmxmX2Jsa25vOworCQlsZW4gPSBidWZfZi0+YmxmX2xlbjsKKwkJZmxhZ3MgPSBidWZfZi0+YmxmX2ZsYWdzOworCQlicmVhazsKKwljYXNlIFhGU19MSV82XzFfQlVGOgorCWNhc2UgWEZTX0xJXzVfM19CVUY6CisJCW9idWZfZiA9ICh4ZnNfYnVmX2xvZ19mb3JtYXRfdjFfdCopYnVmX2Y7CisJCWJsa25vID0gKHhmc19kYWRkcl90KSBvYnVmX2YtPmJsZl9ibGtubzsKKwkJbGVuID0gb2J1Zl9mLT5ibGZfbGVuOworCQlmbGFncyA9IG9idWZfZi0+YmxmX2ZsYWdzOworCQlicmVhazsKKwl9CisKKwkvKgorCSAqIElmIHRoaXMgaXNuJ3QgYSBjYW5jZWwgYnVmZmVyIGl0ZW0sIHRoZW4ganVzdCByZXR1cm4uCisJICovCisJaWYgKCEoZmxhZ3MgJiBYRlNfQkxJX0NBTkNFTCkpCisJCXJldHVybjsKKworCS8qCisJICogSW5zZXJ0IGFuIHhmc19idWZfY2FuY2VsIHJlY29yZCBpbnRvIHRoZSBoYXNoIHRhYmxlIG9mCisJICogdGhlbS4gIElmIHRoZXJlIGlzIGFscmVhZHkgYW4gaWRlbnRpY2FsIHJlY29yZCwgYnVtcAorCSAqIGl0cyByZWZlcmVuY2UgY291bnQuCisJICovCisJYnVja2V0ID0gJmxvZy0+bF9idWZfY2FuY2VsX3RhYmxlWyhfX3VpbnQ2NF90KWJsa25vICUKKwkJCQkJICBYTE9HX0JDX1RBQkxFX1NJWkVdOworCS8qCisJICogSWYgdGhlIGhhc2ggYnVja2V0IGlzIGVtcHR5IHRoZW4ganVzdCBpbnNlcnQgYSBuZXcgcmVjb3JkIGludG8KKwkgKiB0aGUgYnVja2V0LgorCSAqLworCWlmICgqYnVja2V0ID09IE5VTEwpIHsKKwkJYmNwID0gKHhmc19idWZfY2FuY2VsX3QgKilrbWVtX2FsbG9jKHNpemVvZih4ZnNfYnVmX2NhbmNlbF90KSwKKwkJCQkJCSAgICAgS01fU0xFRVApOworCQliY3AtPmJjX2Jsa25vID0gYmxrbm87CisJCWJjcC0+YmNfbGVuID0gbGVuOworCQliY3AtPmJjX3JlZmNvdW50ID0gMTsKKwkJYmNwLT5iY19uZXh0ID0gTlVMTDsKKwkJKmJ1Y2tldCA9IGJjcDsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogVGhlIGhhc2ggYnVja2V0IGlzIG5vdCBlbXB0eSwgc28gc2VhcmNoIGZvciBkdXBsaWNhdGVzIG9mIG91cgorCSAqIHJlY29yZC4gIElmIHdlIGZpbmQgb25lIHRoZW0ganVzdCBidW1wIGl0cyByZWZjb3VudC4gIElmIG5vdAorCSAqIHRoZW4gYWRkIHVzIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QuCisJICovCisJcHJldnAgPSBOVUxMOworCW5leHRwID0gKmJ1Y2tldDsKKwl3aGlsZSAobmV4dHAgIT0gTlVMTCkgeworCQlpZiAobmV4dHAtPmJjX2Jsa25vID09IGJsa25vICYmIG5leHRwLT5iY19sZW4gPT0gbGVuKSB7CisJCQluZXh0cC0+YmNfcmVmY291bnQrKzsKKwkJCXJldHVybjsKKwkJfQorCQlwcmV2cCA9IG5leHRwOworCQluZXh0cCA9IG5leHRwLT5iY19uZXh0OworCX0KKwlBU1NFUlQocHJldnAgIT0gTlVMTCk7CisJYmNwID0gKHhmc19idWZfY2FuY2VsX3QgKilrbWVtX2FsbG9jKHNpemVvZih4ZnNfYnVmX2NhbmNlbF90KSwKKwkJCQkJICAgICBLTV9TTEVFUCk7CisJYmNwLT5iY19ibGtubyA9IGJsa25vOworCWJjcC0+YmNfbGVuID0gbGVuOworCWJjcC0+YmNfcmVmY291bnQgPSAxOworCWJjcC0+YmNfbmV4dCA9IE5VTEw7CisJcHJldnAtPmJjX25leHQgPSBiY3A7Cit9CisKKy8qCisgKiBDaGVjayB0byBzZWUgd2hldGhlciB0aGUgYnVmZmVyIGJlaW5nIHJlY292ZXJlZCBoYXMgYSBjb3JyZXNwb25kaW5nCisgKiBlbnRyeSBpbiB0aGUgYnVmZmVyIGNhbmNlbCByZWNvcmQgdGFibGUuICBJZiBpdCBkb2VzIHRoZW4gcmV0dXJuIDEKKyAqIHNvIHRoYXQgaXQgd2lsbCBiZSBjYW5jZWxsZWQsIG90aGVyd2lzZSByZXR1cm4gMC4gIElmIHRoZSBidWZmZXIgaXMKKyAqIGFjdHVhbGx5IGEgYnVmZmVyIGNhbmNlbCBpdGVtIChYRlNfQkxJX0NBTkNFTCBpcyBzZXQpLCB0aGVuIGRlY3JlbWVudAorICogdGhlIHJlZmNvdW50IG9uIHRoZSBlbnRyeSBpbiB0aGUgdGFibGUgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSB0YWJsZQorICogaWYgdGhpcyBpcyB0aGUgbGFzdCByZWZlcmVuY2UuCisgKgorICogV2UgcmVtb3ZlIHRoZSBjYW5jZWwgcmVjb3JkIGZyb20gdGhlIHRhYmxlIHdoZW4gd2UgZW5jb3VudGVyIGl0cworICogbGFzdCBvY2N1cnJlbmNlIGluIHRoZSBsb2cgc28gdGhhdCBpZiB0aGUgc2FtZSBidWZmZXIgaXMgcmUtdXNlZAorICogYWdhaW4gYWZ0ZXIgaXRzIGxhc3QgY2FuY2VsbGF0aW9uIHdlIGFjdHVhbGx5IHJlcGxheSB0aGUgY2hhbmdlcworICogbWFkZSBhdCB0aGF0IHBvaW50LgorICovCitTVEFUSUMgaW50Cit4bG9nX2NoZWNrX2J1ZmZlcl9jYW5jZWxsZWQoCisJeGxvZ190CQkJKmxvZywKKwl4ZnNfZGFkZHJfdAkJYmxrbm8sCisJdWludAkJCWxlbiwKKwl1c2hvcnQJCQlmbGFncykKK3sKKwl4ZnNfYnVmX2NhbmNlbF90CSpiY3A7CisJeGZzX2J1Zl9jYW5jZWxfdAkqcHJldnA7CisJeGZzX2J1Zl9jYW5jZWxfdAkqKmJ1Y2tldDsKKworCWlmIChsb2ctPmxfYnVmX2NhbmNlbF90YWJsZSA9PSBOVUxMKSB7CisJCS8qCisJCSAqIFRoZXJlIGlzIG5vdGhpbmcgaW4gdGhlIHRhYmxlIGJ1aWx0IGluIHBhc3Mgb25lLAorCQkgKiBzbyB0aGlzIGJ1ZmZlciBtdXN0IG5vdCBiZSBjYW5jZWxsZWQuCisJCSAqLworCQlBU1NFUlQoIShmbGFncyAmIFhGU19CTElfQ0FOQ0VMKSk7CisJCXJldHVybiAwOworCX0KKworCWJ1Y2tldCA9ICZsb2ctPmxfYnVmX2NhbmNlbF90YWJsZVsoX191aW50NjRfdClibGtubyAlCisJCQkJCSAgWExPR19CQ19UQUJMRV9TSVpFXTsKKwliY3AgPSAqYnVja2V0OworCWlmIChiY3AgPT0gTlVMTCkgeworCQkvKgorCQkgKiBUaGVyZSBpcyBubyBjb3JyZXNwb25kaW5nIGVudHJ5IGluIHRoZSB0YWJsZSBidWlsdAorCQkgKiBpbiBwYXNzIG9uZSwgc28gdGhpcyBidWZmZXIgaGFzIG5vdCBiZWVuIGNhbmNlbGxlZC4KKwkJICovCisJCUFTU0VSVCghKGZsYWdzICYgWEZTX0JMSV9DQU5DRUwpKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBTZWFyY2ggZm9yIGFuIGVudHJ5IGluIHRoZSBidWZmZXIgY2FuY2VsIHRhYmxlIHRoYXQKKwkgKiBtYXRjaGVzIG91ciBidWZmZXIuCisJICovCisJcHJldnAgPSBOVUxMOworCXdoaWxlIChiY3AgIT0gTlVMTCkgeworCQlpZiAoYmNwLT5iY19ibGtubyA9PSBibGtubyAmJiBiY3AtPmJjX2xlbiA9PSBsZW4pIHsKKwkJCS8qCisJCQkgKiBXZSd2ZSBnbyBhIG1hdGNoLCBzbyByZXR1cm4gMSBzbyB0aGF0IHRoZQorCQkJICogcmVjb3Zlcnkgb2YgdGhpcyBidWZmZXIgaXMgY2FuY2VsbGVkLgorCQkJICogSWYgdGhpcyBidWZmZXIgaXMgYWN0dWFsbHkgYSBidWZmZXIgY2FuY2VsCisJCQkgKiBsb2cgaXRlbSwgdGhlbiBkZWNyZW1lbnQgdGhlIHJlZmNvdW50IG9uIHRoZQorCQkJICogb25lIGluIHRoZSB0YWJsZSBhbmQgcmVtb3ZlIGl0IGlmIHRoaXMgaXMgdGhlCisJCQkgKiBsYXN0IHJlZmVyZW5jZS4KKwkJCSAqLworCQkJaWYgKGZsYWdzICYgWEZTX0JMSV9DQU5DRUwpIHsKKwkJCQliY3AtPmJjX3JlZmNvdW50LS07CisJCQkJaWYgKGJjcC0+YmNfcmVmY291bnQgPT0gMCkgeworCQkJCQlpZiAocHJldnAgPT0gTlVMTCkgeworCQkJCQkJKmJ1Y2tldCA9IGJjcC0+YmNfbmV4dDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXByZXZwLT5iY19uZXh0ID0gYmNwLT5iY19uZXh0OworCQkJCQl9CisJCQkJCWttZW1fZnJlZShiY3AsCisJCQkJCQkgIHNpemVvZih4ZnNfYnVmX2NhbmNlbF90KSk7CisJCQkJfQorCQkJfQorCQkJcmV0dXJuIDE7CisJCX0KKwkJcHJldnAgPSBiY3A7CisJCWJjcCA9IGJjcC0+YmNfbmV4dDsKKwl9CisJLyoKKwkgKiBXZSBkaWRuJ3QgZmluZCBhIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdGhlIHRhYmxlLCBzbworCSAqIHJldHVybiAwIHNvIHRoYXQgdGhlIGJ1ZmZlciBpcyBOT1QgY2FuY2VsbGVkLgorCSAqLworCUFTU0VSVCghKGZsYWdzICYgWEZTX0JMSV9DQU5DRUwpKTsKKwlyZXR1cm4gMDsKK30KKworU1RBVElDIGludAoreGxvZ19yZWNvdmVyX2RvX2J1ZmZlcl9wYXNzMigKKwl4bG9nX3QJCQkqbG9nLAorCXhmc19idWZfbG9nX2Zvcm1hdF90CSpidWZfZikKK3sKKwl4ZnNfYnVmX2xvZ19mb3JtYXRfdjFfdAkqb2J1Zl9mOworCXhmc19kYWRkcl90CQlibGtubyA9IDA7CisJdXNob3J0CQkJZmxhZ3MgPSAwOworCXVpbnQJCQlsZW4gPSAwOworCisJc3dpdGNoIChidWZfZi0+YmxmX3R5cGUpIHsKKwljYXNlIFhGU19MSV9CVUY6CisJCWJsa25vID0gYnVmX2YtPmJsZl9ibGtubzsKKwkJZmxhZ3MgPSBidWZfZi0+YmxmX2ZsYWdzOworCQlsZW4gPSBidWZfZi0+YmxmX2xlbjsKKwkJYnJlYWs7CisJY2FzZSBYRlNfTElfNl8xX0JVRjoKKwljYXNlIFhGU19MSV81XzNfQlVGOgorCQlvYnVmX2YgPSAoeGZzX2J1Zl9sb2dfZm9ybWF0X3YxX3QqKWJ1Zl9mOworCQlibGtubyA9ICh4ZnNfZGFkZHJfdCkgb2J1Zl9mLT5ibGZfYmxrbm87CisJCWZsYWdzID0gb2J1Zl9mLT5ibGZfZmxhZ3M7CisJCWxlbiA9ICh4ZnNfZGFkZHJfdCkgb2J1Zl9mLT5ibGZfbGVuOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4geGxvZ19jaGVja19idWZmZXJfY2FuY2VsbGVkKGxvZywgYmxrbm8sIGxlbiwgZmxhZ3MpOworfQorCisvKgorICogUGVyZm9ybSByZWNvdmVyeSBmb3IgYSBidWZmZXIgZnVsbCBvZiBpbm9kZXMuICBJbiB0aGVzZSBidWZmZXJzLAorICogdGhlIG9ubHkgZGF0YSB3aGljaCBzaG91bGQgYmUgcmVjb3ZlcmVkIGlzIHRoYXQgd2hpY2ggY29ycmVzcG9uZHMKKyAqIHRvIHRoZSBkaV9uZXh0X3VubGlua2VkIHBvaW50ZXJzIGluIHRoZSBvbiBkaXNrIGlub2RlIHN0cnVjdHVyZXMuCisgKiBUaGUgcmVzdCBvZiB0aGUgZGF0YSBmb3IgdGhlIGlub2RlcyBpcyBhbHdheXMgbG9nZ2VkIHRocm91Z2ggdGhlCisgKiBpbm9kZXMgdGhlbXNlbHZlcyByYXRoZXIgdGhhbiB0aGUgaW5vZGUgYnVmZmVyIGFuZCBpcyByZWNvdmVyZWQKKyAqIGluIHhsb2dfcmVjb3Zlcl9kb19pbm9kZV90cmFucygpLgorICoKKyAqIFRoZSBvbmx5IHRpbWUgd2hlbiBidWZmZXJzIGZ1bGwgb2YgaW5vZGVzIGFyZSBmdWxseSByZWNvdmVyZWQgaXMKKyAqIHdoZW4gdGhlIGJ1ZmZlciBpcyBmdWxsIG9mIG5ld2x5IGFsbG9jYXRlZCBpbm9kZXMuICBJbiB0aGlzIGNhc2UKKyAqIHRoZSBidWZmZXIgd2lsbCBub3QgYmUgbWFya2VkIGFzIGFuIGlub2RlIGJ1ZmZlciBhbmQgc28gd2lsbCBiZQorICogc2VudCB0byB4bG9nX3JlY292ZXJfZG9fcmVnX2J1ZmZlcigpIGJlbG93IGR1cmluZyByZWNvdmVyeS4KKyAqLworU1RBVElDIGludAoreGxvZ19yZWNvdmVyX2RvX2lub2RlX2J1ZmZlcigKKwl4ZnNfbW91bnRfdAkJKm1wLAorCXhsb2dfcmVjb3Zlcl9pdGVtX3QJKml0ZW0sCisJeGZzX2J1Zl90CQkqYnAsCisJeGZzX2J1Zl9sb2dfZm9ybWF0X3QJKmJ1Zl9mKQoreworCWludAkJCWk7CisJaW50CQkJaXRlbV9pbmRleDsKKwlpbnQJCQliaXQ7CisJaW50CQkJbmJpdHM7CisJaW50CQkJcmVnX2J1Zl9vZmZzZXQ7CisJaW50CQkJcmVnX2J1Zl9ieXRlczsKKwlpbnQJCQluZXh0X3VubGlua2VkX29mZnNldDsKKwlpbnQJCQlpbm9kZXNfcGVyX2J1ZjsKKwl4ZnNfYWdpbm9fdAkJKmxvZ2dlZF9uZXh0cDsKKwl4ZnNfYWdpbm9fdAkJKmJ1ZmZlcl9uZXh0cDsKKwl4ZnNfYnVmX2xvZ19mb3JtYXRfdjFfdAkqb2J1Zl9mOworCXVuc2lnbmVkIGludAkJKmRhdGFfbWFwID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQJCW1hcF9zaXplID0gMDsKKworCXN3aXRjaCAoYnVmX2YtPmJsZl90eXBlKSB7CisJY2FzZSBYRlNfTElfQlVGOgorCQlkYXRhX21hcCA9IGJ1Zl9mLT5ibGZfZGF0YV9tYXA7CisJCW1hcF9zaXplID0gYnVmX2YtPmJsZl9tYXBfc2l6ZTsKKwkJYnJlYWs7CisJY2FzZSBYRlNfTElfNl8xX0JVRjoKKwljYXNlIFhGU19MSV81XzNfQlVGOgorCQlvYnVmX2YgPSAoeGZzX2J1Zl9sb2dfZm9ybWF0X3YxX3QqKWJ1Zl9mOworCQlkYXRhX21hcCA9IG9idWZfZi0+YmxmX2RhdGFfbWFwOworCQltYXBfc2l6ZSA9IG9idWZfZi0+YmxmX21hcF9zaXplOworCQlicmVhazsKKwl9CisJLyoKKwkgKiBTZXQgdGhlIHZhcmlhYmxlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBjdXJyZW50IHJlZ2lvbiB0bworCSAqIDAgc28gdGhhdCB3ZSdsbCBpbml0aWFsaXplIHRoZW0gb24gdGhlIGZpcnN0IHBhc3MgdGhyb3VnaAorCSAqIHRoZSBsb29wLgorCSAqLworCXJlZ19idWZfb2Zmc2V0ID0gMDsKKwlyZWdfYnVmX2J5dGVzID0gMDsKKwliaXQgPSAwOworCW5iaXRzID0gMDsKKwlpdGVtX2luZGV4ID0gMDsKKwlpbm9kZXNfcGVyX2J1ZiA9IFhGU19CVUZfQ09VTlQoYnApID4+IG1wLT5tX3NiLnNiX2lub2RlbG9nOworCWZvciAoaSA9IDA7IGkgPCBpbm9kZXNfcGVyX2J1ZjsgaSsrKSB7CisJCW5leHRfdW5saW5rZWRfb2Zmc2V0ID0gKGkgKiBtcC0+bV9zYi5zYl9pbm9kZXNpemUpICsKKwkJCW9mZnNldG9mKHhmc19kaW5vZGVfdCwgZGlfbmV4dF91bmxpbmtlZCk7CisKKwkJd2hpbGUgKG5leHRfdW5saW5rZWRfb2Zmc2V0ID49CisJCSAgICAgICAocmVnX2J1Zl9vZmZzZXQgKyByZWdfYnVmX2J5dGVzKSkgeworCQkJLyoKKwkJCSAqIFRoZSBuZXh0IGRpX25leHRfdW5saW5rZWQgZmllbGQgaXMgYmV5b25kCisJCQkgKiB0aGUgY3VycmVudCBsb2dnZWQgcmVnaW9uLiAgRmluZCB0aGUgbmV4dAorCQkJICogbG9nZ2VkIHJlZ2lvbiB0aGF0IGNvbnRhaW5zIG9yIGlzIGJleW9uZAorCQkJICogdGhlIGN1cnJlbnQgZGlfbmV4dF91bmxpbmtlZCBmaWVsZC4KKwkJCSAqLworCQkJYml0ICs9IG5iaXRzOworCQkJYml0ID0geGZzX25leHRfYml0KGRhdGFfbWFwLCBtYXBfc2l6ZSwgYml0KTsKKworCQkJLyoKKwkJCSAqIElmIHRoZXJlIGFyZSBubyBtb3JlIGxvZ2dlZCByZWdpb25zIGluIHRoZQorCQkJICogYnVmZmVyLCB0aGVuIHdlJ3JlIGRvbmUuCisJCQkgKi8KKwkJCWlmIChiaXQgPT0gLTEpIHsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKworCQkJbmJpdHMgPSB4ZnNfY29udGlnX2JpdHMoZGF0YV9tYXAsIG1hcF9zaXplLAorCQkJCQkJCSBiaXQpOworCQkJQVNTRVJUKG5iaXRzID4gMCk7CisJCQlyZWdfYnVmX29mZnNldCA9IGJpdCA8PCBYRlNfQkxJX1NISUZUOworCQkJcmVnX2J1Zl9ieXRlcyA9IG5iaXRzIDw8IFhGU19CTElfU0hJRlQ7CisJCQlpdGVtX2luZGV4Kys7CisJCX0KKworCQkvKgorCQkgKiBJZiB0aGUgY3VycmVudCBsb2dnZWQgcmVnaW9uIHN0YXJ0cyBhZnRlciB0aGUgY3VycmVudAorCQkgKiBkaV9uZXh0X3VubGlua2VkIGZpZWxkLCB0aGVuIG1vdmUgb24gdG8gdGhlIG5leHQKKwkJICogZGlfbmV4dF91bmxpbmtlZCBmaWVsZC4KKwkJICovCisJCWlmIChuZXh0X3VubGlua2VkX29mZnNldCA8IHJlZ19idWZfb2Zmc2V0KSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCUFTU0VSVChpdGVtLT5yaV9idWZbaXRlbV9pbmRleF0uaV9hZGRyICE9IE5VTEwpOworCQlBU1NFUlQoKGl0ZW0tPnJpX2J1ZltpdGVtX2luZGV4XS5pX2xlbiAlIFhGU19CTElfQ0hVTkspID09IDApOworCQlBU1NFUlQoKHJlZ19idWZfb2Zmc2V0ICsgcmVnX2J1Zl9ieXRlcykgPD0gWEZTX0JVRl9DT1VOVChicCkpOworCisJCS8qCisJCSAqIFRoZSBjdXJyZW50IGxvZ2dlZCByZWdpb24gY29udGFpbnMgYSBjb3B5IG9mIHRoZQorCQkgKiBjdXJyZW50IGRpX25leHRfdW5saW5rZWQgZmllbGQuICBFeHRyYWN0IGl0cyB2YWx1ZQorCQkgKiBhbmQgY29weSBpdCB0byB0aGUgYnVmZmVyIGNvcHkuCisJCSAqLworCQlsb2dnZWRfbmV4dHAgPSAoeGZzX2FnaW5vX3QgKikKKwkJCSAgICAgICAoKGNoYXIgKikoaXRlbS0+cmlfYnVmW2l0ZW1faW5kZXhdLmlfYWRkcikgKworCQkJCShuZXh0X3VubGlua2VkX29mZnNldCAtIHJlZ19idWZfb2Zmc2V0KSk7CisJCWlmICh1bmxpa2VseSgqbG9nZ2VkX25leHRwID09IDApKSB7CisJCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbXAsCisJCQkJImJhZCBpbm9kZSBidWZmZXIgbG9nIHJlY29yZCAocHRyID0gMHglcCwgYnAgPSAweCVwKS4gIFhGUyB0cnlpbmcgdG8gcmVwbGF5IGJhZCAoMCkgaW5vZGUgZGlfbmV4dF91bmxpbmtlZCBmaWVsZCIsCisJCQkJaXRlbSwgYnApOworCQkJWEZTX0VSUk9SX1JFUE9SVCgieGxvZ19yZWNvdmVyX2RvX2lub2RlX2J1ZiIsCisJCQkJCSBYRlNfRVJSTEVWRUxfTE9XLCBtcCk7CisJCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJCX0KKworCQlidWZmZXJfbmV4dHAgPSAoeGZzX2FnaW5vX3QgKil4ZnNfYnVmX29mZnNldChicCwKKwkJCQkJICAgICAgbmV4dF91bmxpbmtlZF9vZmZzZXQpOworCQlJTlRfU0VUKCpidWZmZXJfbmV4dHAsIEFSQ0hfQ09OVkVSVCwgKmxvZ2dlZF9uZXh0cCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQZXJmb3JtIGEgJ25vcm1hbCcgYnVmZmVyIHJlY292ZXJ5LiAgRWFjaCBsb2dnZWQgcmVnaW9uIG9mIHRoZQorICogYnVmZmVyIHNob3VsZCBiZSBjb3BpZWQgb3ZlciB0aGUgY29ycmVzcG9uZGluZyByZWdpb24gaW4gdGhlCisgKiBnaXZlbiBidWZmZXIuICBUaGUgYml0bWFwIGluIHRoZSBidWYgbG9nIGZvcm1hdCBzdHJ1Y3R1cmUgaW5kaWNhdGVzCisgKiB3aGVyZSB0byBwbGFjZSB0aGUgbG9nZ2VkIGRhdGEuCisgKi8KKy8qQVJHU1VTRUQqLworU1RBVElDIHZvaWQKK3hsb2dfcmVjb3Zlcl9kb19yZWdfYnVmZmVyKAorCXhmc19tb3VudF90CQkqbXAsCisJeGxvZ19yZWNvdmVyX2l0ZW1fdAkqaXRlbSwKKwl4ZnNfYnVmX3QJCSpicCwKKwl4ZnNfYnVmX2xvZ19mb3JtYXRfdAkqYnVmX2YpCit7CisJaW50CQkJaTsKKwlpbnQJCQliaXQ7CisJaW50CQkJbmJpdHM7CisJeGZzX2J1Zl9sb2dfZm9ybWF0X3YxX3QJKm9idWZfZjsKKwl1bnNpZ25lZCBpbnQJCSpkYXRhX21hcCA9IE5VTEw7CisJdW5zaWduZWQgaW50CQltYXBfc2l6ZSA9IDA7CisJaW50ICAgICAgICAgICAgICAgICAgICAgZXJyb3I7CisKKwlzd2l0Y2ggKGJ1Zl9mLT5ibGZfdHlwZSkgeworCWNhc2UgWEZTX0xJX0JVRjoKKwkJZGF0YV9tYXAgPSBidWZfZi0+YmxmX2RhdGFfbWFwOworCQltYXBfc2l6ZSA9IGJ1Zl9mLT5ibGZfbWFwX3NpemU7CisJCWJyZWFrOworCWNhc2UgWEZTX0xJXzZfMV9CVUY6CisJY2FzZSBYRlNfTElfNV8zX0JVRjoKKwkJb2J1Zl9mID0gKHhmc19idWZfbG9nX2Zvcm1hdF92MV90KilidWZfZjsKKwkJZGF0YV9tYXAgPSBvYnVmX2YtPmJsZl9kYXRhX21hcDsKKwkJbWFwX3NpemUgPSBvYnVmX2YtPmJsZl9tYXBfc2l6ZTsKKwkJYnJlYWs7CisJfQorCWJpdCA9IDA7CisJaSA9IDE7ICAvKiAwIGlzIHRoZSBidWYgZm9ybWF0IHN0cnVjdHVyZSAqLworCXdoaWxlICgxKSB7CisJCWJpdCA9IHhmc19uZXh0X2JpdChkYXRhX21hcCwgbWFwX3NpemUsIGJpdCk7CisJCWlmIChiaXQgPT0gLTEpCisJCQlicmVhazsKKwkJbmJpdHMgPSB4ZnNfY29udGlnX2JpdHMoZGF0YV9tYXAsIG1hcF9zaXplLCBiaXQpOworCQlBU1NFUlQobmJpdHMgPiAwKTsKKwkJQVNTRVJUKGl0ZW0tPnJpX2J1ZltpXS5pX2FkZHIgIT0gMCk7CisJCUFTU0VSVChpdGVtLT5yaV9idWZbaV0uaV9sZW4gJSBYRlNfQkxJX0NIVU5LID09IDApOworCQlBU1NFUlQoWEZTX0JVRl9DT1VOVChicCkgPj0KKwkJICAgICAgICgodWludCliaXQgPDwgWEZTX0JMSV9TSElGVCkrKG5iaXRzPDxYRlNfQkxJX1NISUZUKSk7CisKKwkJLyoKKwkJICogRG8gYSBzYW5pdHkgY2hlY2sgaWYgdGhpcyBpcyBhIGRxdW90IGJ1ZmZlci4gSnVzdCBjaGVja2luZworCQkgKiB0aGUgZmlyc3QgZHF1b3QgaW4gdGhlIGJ1ZmZlciBzaG91bGQgZG8uIFhYWFRoaXMgaXMKKwkJICogcHJvYmFibHkgYSBnb29kIHRoaW5nIHRvIGRvIGZvciBvdGhlciBidWYgdHlwZXMgYWxzby4KKwkJICovCisJCWVycm9yID0gMDsKKwkJaWYgKGJ1Zl9mLT5ibGZfZmxhZ3MgJiAoWEZTX0JMSV9VRFFVT1RfQlVGfFhGU19CTElfR0RRVU9UX0JVRikpIHsKKwkJCWVycm9yID0geGZzX3FtX2RxY2hlY2soKHhmc19kaXNrX2RxdW90X3QgKikKKwkJCQkJICAgICAgIGl0ZW0tPnJpX2J1ZltpXS5pX2FkZHIsCisJCQkJCSAgICAgICAtMSwgMCwgWEZTX1FNT1BUX0RPV0FSTiwKKwkJCQkJICAgICAgICJkcXVvdF9idWZfcmVjb3ZlciIpOworCQl9CisJCWlmICghZXJyb3IpCisJCQltZW1jcHkoeGZzX2J1Zl9vZmZzZXQoYnAsCisJCQkJKHVpbnQpYml0IDw8IFhGU19CTElfU0hJRlQpLAkvKiBkZXN0ICovCisJCQkJaXRlbS0+cmlfYnVmW2ldLmlfYWRkciwJCS8qIHNvdXJjZSAqLworCQkJCW5iaXRzPDxYRlNfQkxJX1NISUZUKTsJCS8qIGxlbmd0aCAqLworCQlpKys7CisJCWJpdCArPSBuYml0czsKKwl9CisKKwkvKiBTaG91bGRuJ3QgYmUgYW55IG1vcmUgcmVnaW9ucyAqLworCUFTU0VSVChpID09IGl0ZW0tPnJpX3RvdGFsKTsKK30KKworLyoKKyAqIERvIHNvbWUgcHJpbWl0aXZlIGVycm9yIGNoZWNraW5nIG9uIG9uZGlzayBkcXVvdCBkYXRhIHN0cnVjdHVyZXMuCisgKi8KK2ludAoreGZzX3FtX2RxY2hlY2soCisJeGZzX2Rpc2tfZHF1b3RfdCAqZGRxLAorCXhmc19kcWlkX3QJIGlkLAorCXVpbnQJCSB0eXBlLAkgIC8qIHVzZWQgb25seSB3aGVuIElPX2RvcmVwYWlyIGlzIHRydWUgKi8KKwl1aW50CQkgZmxhZ3MsCisJY2hhcgkJICpzdHIpCit7CisJeGZzX2RxYmxrX3QJICpkID0gKHhmc19kcWJsa190ICopZGRxOworCWludAkJZXJycyA9IDA7CisKKwkvKgorCSAqIFdlIGNhbiBlbmNvdW50ZXIgYW4gdW5pbml0aWFsaXplZCBkcXVvdCBidWZmZXIgZm9yIDIgcmVhc29uczoKKwkgKiAxLiBJZiB3ZSBjcmFzaCB3aGlsZSBkZWxldGluZyB0aGUgcXVvdGFpbm9kZShzKSwgYW5kIHRob3NlIGJsa3MgZ290CisJICogICAgdXNlZCBmb3IgdXNlciBkYXRhLiBUaGlzIGlzIGJlY2F1c2Ugd2UgdGFrZSB0aGUgcGF0aCBvZiByZWd1bGFyCisJICogICAgZmlsZSBkZWxldGlvbjsgaG93ZXZlciwgdGhlIHNpemUgZmllbGQgb2YgcXVvdGFpbm9kZXMgaXMgbmV2ZXIKKwkgKiAgICB1cGRhdGVkLCBzbyBhbGwgdGhlIHRyaWNrcyB0aGF0IHdlIHBsYXkgaW4gaXRydW5jYXRlX2ZpbmlzaAorCSAqICAgIGRvbid0IHF1aXRlIG1hdHRlci4KKwkgKgorCSAqIDIuIFdlIGRvbid0IHBsYXkgdGhlIHF1b3RhIGJ1ZmZlcnMgd2hlbiB0aGVyZSdzIGEgcXVvdGFvZmYgbG9naXRlbS4KKwkgKiAgICBCdXQgdGhlIGFsbG9jYXRpb24gd2lsbCBiZSByZXBsYXllZCBzbyB3ZSdsbCBlbmQgdXAgd2l0aCBhbgorCSAqICAgIHVuaW5pdGlhbGl6ZWQgcXVvdGEgYmxvY2suCisJICoKKwkgKiBUaGlzIGlzIGFsbCBmaW5lOyB0aGluZ3MgYXJlIHN0aWxsIGNvbnNpc3RlbnQsIGFuZCB3ZSBoYXZlbid0IGxvc3QKKwkgKiBhbnkgcXVvdGEgaW5mb3JtYXRpb24uIEp1c3QgZG9uJ3QgY29tcGxhaW4gYWJvdXQgYmFkIGRxdW90IGJsa3MuCisJICovCisJaWYgKElOVF9HRVQoZGRxLT5kX21hZ2ljLCBBUkNIX0NPTlZFUlQpICE9IFhGU19EUVVPVF9NQUdJQykgeworCQlpZiAoZmxhZ3MgJiBYRlNfUU1PUFRfRE9XQVJOKQorCQkJY21uX2VycihDRV9BTEVSVCwKKwkJCSIlcyA6IFhGUyBkcXVvdCBJRCAweCV4LCBtYWdpYyAweCV4ICE9IDB4JXgiLAorCQkJc3RyLCBpZCwKKwkJCUlOVF9HRVQoZGRxLT5kX21hZ2ljLCBBUkNIX0NPTlZFUlQpLCBYRlNfRFFVT1RfTUFHSUMpOworCQllcnJzKys7CisJfQorCWlmIChJTlRfR0VUKGRkcS0+ZF92ZXJzaW9uLCBBUkNIX0NPTlZFUlQpICE9IFhGU19EUVVPVF9WRVJTSU9OKSB7CisJCWlmIChmbGFncyAmIFhGU19RTU9QVF9ET1dBUk4pCisJCQljbW5fZXJyKENFX0FMRVJULAorCQkJIiVzIDogWEZTIGRxdW90IElEIDB4JXgsIHZlcnNpb24gMHgleCAhPSAweCV4IiwKKwkJCXN0ciwgaWQsCisJCQlJTlRfR0VUKGRkcS0+ZF9tYWdpYywgQVJDSF9DT05WRVJUKSwgWEZTX0RRVU9UX1ZFUlNJT04pOworCQllcnJzKys7CisJfQorCisJaWYgKElOVF9HRVQoZGRxLT5kX2ZsYWdzLCBBUkNIX0NPTlZFUlQpICE9IFhGU19EUV9VU0VSICYmCisJICAgIElOVF9HRVQoZGRxLT5kX2ZsYWdzLCBBUkNIX0NPTlZFUlQpICE9IFhGU19EUV9HUk9VUCkgeworCQlpZiAoZmxhZ3MgJiBYRlNfUU1PUFRfRE9XQVJOKQorCQkJY21uX2VycihDRV9BTEVSVCwKKwkJCSIlcyA6IFhGUyBkcXVvdCBJRCAweCV4LCB1bmtub3duIGZsYWdzIDB4JXgiLAorCQkJc3RyLCBpZCwgSU5UX0dFVChkZHEtPmRfZmxhZ3MsIEFSQ0hfQ09OVkVSVCkpOworCQllcnJzKys7CisJfQorCisJaWYgKGlkICE9IC0xICYmIGlkICE9IElOVF9HRVQoZGRxLT5kX2lkLCBBUkNIX0NPTlZFUlQpKSB7CisJCWlmIChmbGFncyAmIFhGU19RTU9QVF9ET1dBUk4pCisJCQljbW5fZXJyKENFX0FMRVJULAorCQkJIiVzIDogb25kaXNrLWRxdW90IDB4JXAsIElEIG1pc21hdGNoOiAiCisJCQkiMHgleCBleHBlY3RlZCwgZm91bmQgaWQgMHgleCIsCisJCQlzdHIsIGRkcSwgaWQsIElOVF9HRVQoZGRxLT5kX2lkLCBBUkNIX0NPTlZFUlQpKTsKKwkJZXJycysrOworCX0KKworCWlmICghZXJycyAmJiBkZHEtPmRfaWQpIHsKKwkJaWYgKElOVF9HRVQoZGRxLT5kX2Jsa19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkgJiYKKwkJICAgIElOVF9HRVQoZGRxLT5kX2Jjb3VudCwgQVJDSF9DT05WRVJUKSA+PQorCQkJCUlOVF9HRVQoZGRxLT5kX2Jsa19zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJCWlmICghZGRxLT5kX2J0aW1lcikgeworCQkJCWlmIChmbGFncyAmIFhGU19RTU9QVF9ET1dBUk4pCisJCQkJCWNtbl9lcnIoQ0VfQUxFUlQsCisJCQkJCSIlcyA6IERxdW90IElEIDB4JXggKDB4JXApICIKKwkJCQkJIkJMSyBUSU1FUiBOT1QgU1RBUlRFRCIsCisJCQkJCXN0ciwgKGludCkKKwkJCQkJSU5UX0dFVChkZHEtPmRfaWQsIEFSQ0hfQ09OVkVSVCksIGRkcSk7CisJCQkJZXJycysrOworCQkJfQorCQl9CisJCWlmIChJTlRfR0VUKGRkcS0+ZF9pbm9fc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpICYmCisJCSAgICBJTlRfR0VUKGRkcS0+ZF9pY291bnQsIEFSQ0hfQ09OVkVSVCkgPj0KKwkJCQlJTlRfR0VUKGRkcS0+ZF9pbm9fc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpKSB7CisJCQlpZiAoIWRkcS0+ZF9pdGltZXIpIHsKKwkJCQlpZiAoZmxhZ3MgJiBYRlNfUU1PUFRfRE9XQVJOKQorCQkJCQljbW5fZXJyKENFX0FMRVJULAorCQkJCQkiJXMgOiBEcXVvdCBJRCAweCV4ICgweCVwKSAiCisJCQkJCSJJTk9ERSBUSU1FUiBOT1QgU1RBUlRFRCIsCisJCQkJCXN0ciwgKGludCkKKwkJCQkJSU5UX0dFVChkZHEtPmRfaWQsIEFSQ0hfQ09OVkVSVCksIGRkcSk7CisJCQkJZXJycysrOworCQkJfQorCQl9CisJCWlmIChJTlRfR0VUKGRkcS0+ZF9ydGJfc29mdGxpbWl0LCBBUkNIX0NPTlZFUlQpICYmCisJCSAgICBJTlRfR0VUKGRkcS0+ZF9ydGJjb3VudCwgQVJDSF9DT05WRVJUKSA+PQorCQkJCUlOVF9HRVQoZGRxLT5kX3J0Yl9zb2Z0bGltaXQsIEFSQ0hfQ09OVkVSVCkpIHsKKwkJCWlmICghZGRxLT5kX3J0YnRpbWVyKSB7CisJCQkJaWYgKGZsYWdzICYgWEZTX1FNT1BUX0RPV0FSTikKKwkJCQkJY21uX2VycihDRV9BTEVSVCwKKwkJCQkJIiVzIDogRHF1b3QgSUQgMHgleCAoMHglcCkgIgorCQkJCQkiUlRCTEsgVElNRVIgTk9UIFNUQVJURUQiLAorCQkJCQlzdHIsIChpbnQpCisJCQkJCUlOVF9HRVQoZGRxLT5kX2lkLCBBUkNIX0NPTlZFUlQpLCBkZHEpOworCQkJCWVycnMrKzsKKwkJCX0KKwkJfQorCX0KKworCWlmICghZXJycyB8fCAhKGZsYWdzICYgWEZTX1FNT1BUX0RRUkVQQUlSKSkKKwkJcmV0dXJuIGVycnM7CisKKwlpZiAoZmxhZ3MgJiBYRlNfUU1PUFRfRE9XQVJOKQorCQljbW5fZXJyKENFX05PVEUsICJSZS1pbml0aWFsaXppbmcgZHF1b3QgSUQgMHgleCIsIGlkKTsKKworCS8qCisJICogVHlwaWNhbGx5LCBhIHJlcGFpciBpcyBvbmx5IHJlcXVlc3RlZCBieSBxdW90YWNoZWNrLgorCSAqLworCUFTU0VSVChpZCAhPSAtMSk7CisJQVNTRVJUKGZsYWdzICYgWEZTX1FNT1BUX0RRUkVQQUlSKTsKKwltZW1zZXQoZCwgMCwgc2l6ZW9mKHhmc19kcWJsa190KSk7CisJSU5UX1NFVChkLT5kZF9kaXNrZHEuZF9tYWdpYywgQVJDSF9DT05WRVJULCBYRlNfRFFVT1RfTUFHSUMpOworCUlOVF9TRVQoZC0+ZGRfZGlza2RxLmRfdmVyc2lvbiwgQVJDSF9DT05WRVJULCBYRlNfRFFVT1RfVkVSU0lPTik7CisJSU5UX1NFVChkLT5kZF9kaXNrZHEuZF9pZCwgQVJDSF9DT05WRVJULCBpZCk7CisJSU5UX1NFVChkLT5kZF9kaXNrZHEuZF9mbGFncywgQVJDSF9DT05WRVJULCB0eXBlKTsKKworCXJldHVybiBlcnJzOworfQorCisvKgorICogUGVyZm9ybSBhIGRxdW90IGJ1ZmZlciByZWNvdmVyeS4KKyAqIFNpbXBsZSBhbGdvcml0aG06IGlmIHdlIGhhdmUgZm91bmQgYSBRVU9UQU9GRiBsb2dpdGVtIG9mIHRoZSBzYW1lIHR5cGUKKyAqIChpZS4gVVNSIG9yIEdSUCksIHRoZW4ganVzdCB0b3NzIHRoaXMgYnVmZmVyIGF3YXk7IGRvbid0IHJlY292ZXIgaXQuCisgKiBFbHNlLCB0cmVhdCBpdCBhcyBhIHJlZ3VsYXIgYnVmZmVyIGFuZCBkbyByZWNvdmVyeS4KKyAqLworU1RBVElDIHZvaWQKK3hsb2dfcmVjb3Zlcl9kb19kcXVvdF9idWZmZXIoCisJeGZzX21vdW50X3QJCSptcCwKKwl4bG9nX3QJCQkqbG9nLAorCXhsb2dfcmVjb3Zlcl9pdGVtX3QJKml0ZW0sCisJeGZzX2J1Zl90CQkqYnAsCisJeGZzX2J1Zl9sb2dfZm9ybWF0X3QJKmJ1Zl9mKQoreworCXVpbnQJCQl0eXBlOworCisJLyoKKwkgKiBGaWxlc3lzdGVtcyBhcmUgcmVxdWlyZWQgdG8gc2VuZCBpbiBxdW90YSBmbGFncyBhdCBtb3VudCB0aW1lLgorCSAqLworCWlmIChtcC0+bV9xZmxhZ3MgPT0gMCkgeworCQlyZXR1cm47CisJfQorCisJdHlwZSA9IDA7CisJaWYgKGJ1Zl9mLT5ibGZfZmxhZ3MgJiBYRlNfQkxJX1VEUVVPVF9CVUYpCisJCXR5cGUgfD0gWEZTX0RRX1VTRVI7CisJaWYgKGJ1Zl9mLT5ibGZfZmxhZ3MgJiBYRlNfQkxJX0dEUVVPVF9CVUYpCisJCXR5cGUgfD0gWEZTX0RRX0dST1VQOworCS8qCisJICogVGhpcyB0eXBlIG9mIHF1b3RhcyB3YXMgdHVybmVkIG9mZiwgc28gaWdub3JlIHRoaXMgYnVmZmVyCisJICovCisJaWYgKGxvZy0+bF9xdW90YW9mZnNfZmxhZyAmIHR5cGUpCisJCXJldHVybjsKKworCXhsb2dfcmVjb3Zlcl9kb19yZWdfYnVmZmVyKG1wLCBpdGVtLCBicCwgYnVmX2YpOworfQorCisvKgorICogVGhpcyByb3V0aW5lIHJlcGxheXMgYSBtb2RpZmljYXRpb24gbWFkZSB0byBhIGJ1ZmZlciBhdCBydW50aW1lLgorICogVGhlcmUgYXJlIGFjdHVhbGx5IHR3byB0eXBlcyBvZiBidWZmZXIsIHJlZ3VsYXIgYW5kIGlub2RlLCB3aGljaAorICogYXJlIGhhbmRsZWQgZGlmZmVyZW50bHkuICBJbm9kZSBidWZmZXJzIGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5CisgKiBpbiB0aGF0IHdlIG9ubHkgcmVjb3ZlciBhIHNwZWNpZmljIHNldCBvZiBkYXRhIGZyb20gdGhlbSwgbmFtZWx5CisgKiB0aGUgaW5vZGUgZGlfbmV4dF91bmxpbmtlZCBmaWVsZHMuICBUaGlzIGlzIGJlY2F1c2UgYWxsIG90aGVyIGlub2RlCisgKiBkYXRhIGlzIGFjdHVhbGx5IGxvZ2dlZCB2aWEgaW5vZGUgcmVjb3JkcyBhbmQgYW55IGRhdGEgd2UgcmVwbGF5CisgKiBoZXJlIHdoaWNoIG92ZXJsYXBzIHRoYXQgbWF5IGJlIHN0YWxlLgorICoKKyAqIFdoZW4gbWV0YS1kYXRhIGJ1ZmZlcnMgYXJlIGZyZWVkIGF0IHJ1biB0aW1lIHdlIGxvZyBhIGJ1ZmZlciBpdGVtCisgKiB3aXRoIHRoZSBYRlNfQkxJX0NBTkNFTCBiaXQgc2V0IHRvIGluZGljYXRlIHRoYXQgcHJldmlvdXMgY29waWVzCisgKiBvZiB0aGUgYnVmZmVyIGluIHRoZSBsb2cgc2hvdWxkIG5vdCBiZSByZXBsYXllZCBhdCByZWNvdmVyeSB0aW1lLgorICogVGhpcyBpcyBzbyB0aGF0IGlmIHRoZSBibG9ja3MgY292ZXJlZCBieSB0aGUgYnVmZmVyIGFyZSByZXVzZWQgZm9yCisgKiBmaWxlIGRhdGEgYmVmb3JlIHdlIGNyYXNoIHdlIGRvbid0IGVuZCB1cCByZXBsYXlpbmcgb2xkLCBmcmVlZAorICogbWV0YS1kYXRhIGludG8gYSB1c2VyJ3MgZmlsZS4KKyAqCisgKiBUbyBoYW5kbGUgdGhlIGNhbmNlbGxhdGlvbiBvZiBidWZmZXIgbG9nIGl0ZW1zLCB3ZSBtYWtlIHR3byBwYXNzZXMKKyAqIG92ZXIgdGhlIGxvZyBkdXJpbmcgcmVjb3ZlcnkuICBEdXJpbmcgdGhlIGZpcnN0IHdlIGJ1aWxkIGEgdGFibGUgb2YKKyAqIHRob3NlIGJ1ZmZlcnMgd2hpY2ggaGF2ZSBiZWVuIGNhbmNlbGxlZCwgYW5kIGR1cmluZyB0aGUgc2Vjb25kIHdlCisgKiBvbmx5IHJlcGxheSB0aG9zZSBidWZmZXJzIHdoaWNoIGRvIG5vdCBoYXZlIGNvcnJlc3BvbmRpbmcgY2FuY2VsCisgKiByZWNvcmRzIGluIHRoZSB0YWJsZS4gIFNlZSB4bG9nX3JlY292ZXJfZG9fYnVmZmVyX3Bhc3NbMSwyXSBhYm92ZQorICogZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHRhYmxlIG9mIGNhbmNlbCByZWNvcmRzLgorICovCitTVEFUSUMgaW50Cit4bG9nX3JlY292ZXJfZG9fYnVmZmVyX3RyYW5zKAorCXhsb2dfdAkJCSpsb2csCisJeGxvZ19yZWNvdmVyX2l0ZW1fdAkqaXRlbSwKKwlpbnQJCQlwYXNzKQoreworCXhmc19idWZfbG9nX2Zvcm1hdF90CSpidWZfZjsKKwl4ZnNfYnVmX2xvZ19mb3JtYXRfdjFfdAkqb2J1Zl9mOworCXhmc19tb3VudF90CQkqbXA7CisJeGZzX2J1Zl90CQkqYnA7CisJaW50CQkJZXJyb3I7CisJaW50CQkJY2FuY2VsOworCXhmc19kYWRkcl90CQlibGtubzsKKwlpbnQJCQlsZW47CisJdXNob3J0CQkJZmxhZ3M7CisKKwlidWZfZiA9ICh4ZnNfYnVmX2xvZ19mb3JtYXRfdCAqKWl0ZW0tPnJpX2J1ZlswXS5pX2FkZHI7CisKKwlpZiAocGFzcyA9PSBYTE9HX1JFQ09WRVJfUEFTUzEpIHsKKwkJLyoKKwkJICogSW4gdGhpcyBwYXNzIHdlJ3JlIG9ubHkgbG9va2luZyBmb3IgYnVmIGl0ZW1zCisJCSAqIHdpdGggdGhlIFhGU19CTElfQ0FOQ0VMIGJpdCBzZXQuCisJCSAqLworCQl4bG9nX3JlY292ZXJfZG9fYnVmZmVyX3Bhc3MxKGxvZywgYnVmX2YpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBJbiB0aGlzIHBhc3Mgd2Ugd2FudCB0byByZWNvdmVyIGFsbCB0aGUgYnVmZmVycworCQkgKiB3aGljaCBoYXZlIG5vdCBiZWVuIGNhbmNlbGxlZCBhbmQgYXJlIG5vdAorCQkgKiBjYW5jZWxsYXRpb24gYnVmZmVycyB0aGVtc2VsdmVzLiAgVGhlIHJvdXRpbmUKKwkJICogd2UgY2FsbCBoZXJlIHdpbGwgdGVsbCB1cyB3aGV0aGVyIG9yIG5vdCB0bworCQkgKiBjb250aW51ZSB3aXRoIHRoZSByZXBsYXkgb2YgdGhpcyBidWZmZXIuCisJCSAqLworCQljYW5jZWwgPSB4bG9nX3JlY292ZXJfZG9fYnVmZmVyX3Bhc3MyKGxvZywgYnVmX2YpOworCQlpZiAoY2FuY2VsKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlzd2l0Y2ggKGJ1Zl9mLT5ibGZfdHlwZSkgeworCWNhc2UgWEZTX0xJX0JVRjoKKwkJYmxrbm8gPSBidWZfZi0+YmxmX2Jsa25vOworCQlsZW4gPSBidWZfZi0+YmxmX2xlbjsKKwkJZmxhZ3MgPSBidWZfZi0+YmxmX2ZsYWdzOworCQlicmVhazsKKwljYXNlIFhGU19MSV82XzFfQlVGOgorCWNhc2UgWEZTX0xJXzVfM19CVUY6CisJCW9idWZfZiA9ICh4ZnNfYnVmX2xvZ19mb3JtYXRfdjFfdCopYnVmX2Y7CisJCWJsa25vID0gb2J1Zl9mLT5ibGZfYmxrbm87CisJCWxlbiA9IG9idWZfZi0+YmxmX2xlbjsKKwkJZmxhZ3MgPSBvYnVmX2YtPmJsZl9mbGFnczsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJeGZzX2ZzX2Ntbl9lcnIoQ0VfQUxFUlQsIGxvZy0+bF9tcCwKKwkJCSJ4ZnNfbG9nX3JlY292ZXI6IHVua25vd24gYnVmZmVyIHR5cGUgMHgleCwgZGV2ICVzIiwKKwkJCWJ1Zl9mLT5ibGZfdHlwZSwgWEZTX0JVRlRBUkdfTkFNRShsb2ctPmxfdGFyZykpOworCQlYRlNfRVJST1JfUkVQT1JUKCJ4bG9nX3JlY292ZXJfZG9fYnVmZmVyX3RyYW5zIiwKKwkJCQkgWEZTX0VSUkxFVkVMX0xPVywgbG9nLT5sX21wKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCX0KKworCW1wID0gbG9nLT5sX21wOworCWlmIChmbGFncyAmIFhGU19CTElfSU5PREVfQlVGKSB7CisJCWJwID0geGZzX2J1Zl9yZWFkX2ZsYWdzKG1wLT5tX2RkZXZfdGFyZ3AsIGJsa25vLCBsZW4sCisJCQkJCQkJCVhGU19CVUZfTE9DSyk7CisJfSBlbHNlIHsKKwkJYnAgPSB4ZnNfYnVmX3JlYWQobXAtPm1fZGRldl90YXJncCwgYmxrbm8sIGxlbiwgMCk7CisJfQorCWlmIChYRlNfQlVGX0lTRVJST1IoYnApKSB7CisJCXhmc19pb2Vycm9yX2FsZXJ0KCJ4bG9nX3JlY292ZXJfZG8uLihyZWFkIzEpIiwgbG9nLT5sX21wLAorCQkJCSAgYnAsIGJsa25vKTsKKwkJZXJyb3IgPSBYRlNfQlVGX0dFVEVSUk9SKGJwKTsKKwkJeGZzX2J1Zl9yZWxzZShicCk7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwllcnJvciA9IDA7CisJaWYgKGZsYWdzICYgWEZTX0JMSV9JTk9ERV9CVUYpIHsKKwkJZXJyb3IgPSB4bG9nX3JlY292ZXJfZG9faW5vZGVfYnVmZmVyKG1wLCBpdGVtLCBicCwgYnVmX2YpOworCX0gZWxzZSBpZiAoZmxhZ3MgJiAoWEZTX0JMSV9VRFFVT1RfQlVGIHwgWEZTX0JMSV9HRFFVT1RfQlVGKSkgeworCQl4bG9nX3JlY292ZXJfZG9fZHF1b3RfYnVmZmVyKG1wLCBsb2csIGl0ZW0sIGJwLCBidWZfZik7CisJfSBlbHNlIHsKKwkJeGxvZ19yZWNvdmVyX2RvX3JlZ19idWZmZXIobXAsIGl0ZW0sIGJwLCBidWZfZik7CisJfQorCWlmIChlcnJvcikKKwkJcmV0dXJuIFhGU19FUlJPUihlcnJvcik7CisKKwkvKgorCSAqIFBlcmZvcm0gZGVsYXllZCB3cml0ZSBvbiB0aGUgYnVmZmVyLiAgQXN5bmNocm9ub3VzIHdyaXRlcyB3aWxsIGJlCisJICogc2xvd2VyIHdoZW4gdGFraW5nIGludG8gYWNjb3VudCBhbGwgdGhlIGJ1ZmZlcnMgdG8gYmUgZmx1c2hlZC4KKwkgKgorCSAqIEFsc28gbWFrZSBzdXJlIHRoYXQgb25seSBpbm9kZSBidWZmZXJzIHdpdGggZ29vZCBzaXplcyBzdGF5IGluCisJICogdGhlIGJ1ZmZlciBjYWNoZS4gIFRoZSBrZXJuZWwgbW92ZXMgaW5vZGVzIGluIGJ1ZmZlcnMgb2YgMSBibG9jaworCSAqIG9yIFhGU19JTk9ERV9DTFVTVEVSX1NJWkUgYnl0ZXMsIHdoaWNoZXZlciBpcyBiaWdnZXIuICBUaGUgaW5vZGUKKwkgKiBidWZmZXJzIGluIHRoZSBsb2cgY2FuIGJlIGEgZGlmZmVyZW50IHNpemUgaWYgdGhlIGxvZyB3YXMgZ2VuZXJhdGVkCisJICogYnkgYW4gb2xkZXIga2VybmVsIHVzaW5nIHVuY2x1c3RlcmVkIGlub2RlIGJ1ZmZlcnMgb3IgYSBuZXdlciBrZXJuZWwKKwkgKiBydW5uaW5nIHdpdGggYSBkaWZmZXJlbnQgaW5vZGUgY2x1c3RlciBzaXplLiAgUmVnYXJkbGVzcywgaWYgdGhlCisJICogdGhlIGlub2RlIGJ1ZmZlciBzaXplIGlzbid0IE1BWChibG9ja3NpemUsIFhGU19JTk9ERV9DTFVTVEVSX1NJWkUpCisJICogZm9yICpvdXIqIHZhbHVlIG9mIFhGU19JTk9ERV9DTFVTVEVSX1NJWkUsIHRoZW4gd2UgbmVlZCB0byBrZWVwCisJICogdGhlIGJ1ZmZlciBvdXQgb2YgdGhlIGJ1ZmZlciBjYWNoZSBzbyB0aGF0IHRoZSBidWZmZXIgd29uJ3QKKwkgKiBvdmVybGFwIHdpdGggZnV0dXJlIHJlYWRzIG9mIHRob3NlIGlub2Rlcy4KKwkgKi8KKwlpZiAoWEZTX0RJTk9ERV9NQUdJQyA9PQorCSAgICBJTlRfR0VUKCooKF9fdWludDE2X3QgKikoeGZzX2J1Zl9vZmZzZXQoYnAsIDApKSksIEFSQ0hfQ09OVkVSVCkgJiYKKwkgICAgKFhGU19CVUZfQ09VTlQoYnApICE9IE1BWChsb2ctPmxfbXAtPm1fc2Iuc2JfYmxvY2tzaXplLAorCQkJKF9fdWludDMyX3QpWEZTX0lOT0RFX0NMVVNURVJfU0laRShsb2ctPmxfbXApKSkpIHsKKwkJWEZTX0JVRl9TVEFMRShicCk7CisJCWVycm9yID0geGZzX2J3cml0ZShtcCwgYnApOworCX0gZWxzZSB7CisJCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURShicCwgdm9pZCAqKSA9PSBOVUxMIHx8CisJCSAgICAgICBYRlNfQlVGX0ZTUFJJVkFURShicCwgeGZzX21vdW50X3QgKikgPT0gbXApOworCQlYRlNfQlVGX1NFVF9GU1BSSVZBVEUoYnAsIG1wKTsKKwkJWEZTX0JVRl9TRVRfSU9ET05FX0ZVTkMoYnAsIHhsb2dfcmVjb3Zlcl9pb2RvbmUpOworCQl4ZnNfYmR3cml0ZShtcCwgYnApOworCX0KKworCXJldHVybiAoZXJyb3IpOworfQorCitTVEFUSUMgaW50Cit4bG9nX3JlY292ZXJfZG9faW5vZGVfdHJhbnMoCisJeGxvZ190CQkJKmxvZywKKwl4bG9nX3JlY292ZXJfaXRlbV90CSppdGVtLAorCWludAkJCXBhc3MpCit7CisJeGZzX2lub2RlX2xvZ19mb3JtYXRfdAkqaW5fZjsKKwl4ZnNfbW91bnRfdAkJKm1wOworCXhmc19idWZfdAkJKmJwOworCXhmc19pbWFwX3QJCWltYXA7CisJeGZzX2Rpbm9kZV90CQkqZGlwOworCXhmc19pbm9fdAkJaW5vOworCWludAkJCWxlbjsKKwl4ZnNfY2FkZHJfdAkJc3JjOworCXhmc19jYWRkcl90CQlkZXN0OworCWludAkJCWVycm9yOworCWludAkJCWF0dHJfaW5kZXg7CisJdWludAkJCWZpZWxkczsKKwl4ZnNfZGlub2RlX2NvcmVfdAkqZGljcDsKKworCWlmIChwYXNzID09IFhMT0dfUkVDT1ZFUl9QQVNTMSkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlpbl9mID0gKHhmc19pbm9kZV9sb2dfZm9ybWF0X3QgKilpdGVtLT5yaV9idWZbMF0uaV9hZGRyOworCWlubyA9IGluX2YtPmlsZl9pbm87CisJbXAgPSBsb2ctPmxfbXA7CisJaWYgKElURU1fVFlQRShpdGVtKSA9PSBYRlNfTElfSU5PREUpIHsKKwkJaW1hcC5pbV9ibGtubyA9ICh4ZnNfZGFkZHJfdClpbl9mLT5pbGZfYmxrbm87CisJCWltYXAuaW1fbGVuID0gaW5fZi0+aWxmX2xlbjsKKwkJaW1hcC5pbV9ib2Zmc2V0ID0gaW5fZi0+aWxmX2JvZmZzZXQ7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogSXQncyBhbiBvbGQgaW5vZGUgZm9ybWF0IHJlY29yZC4gIFdlIGRvbid0IGtub3cgd2hlcmUKKwkJICogaXRzIGNsdXN0ZXIgaXMgbG9jYXRlZCBvbiBkaXNrLCBhbmQgd2UgY2FuJ3QgYWxsb3cKKwkJICogeGZzX2ltYXAoKSB0byBmaWd1cmUgaXQgb3V0IGJlY2F1c2UgdGhlIGlub2RlIGJ0cmVlcworCQkgKiBhcmUgbm90IHJlYWR5IHRvIGJlIHVzZWQuICBUaGVyZWZvcmUgZG8gbm90IHBhc3MgdGhlCisJCSAqIFhGU19JTUFQX0xPT0tVUCBmbGFnIHRvIHhmc19pbWFwKCkuICBUaGlzIHdpbGwgZ2l2ZQorCQkgKiB1cyBvbmx5IHRoZSBzaW5nbGUgYmxvY2sgaW4gd2hpY2ggdGhlIGlub2RlIGxpdmVzCisJCSAqIHJhdGhlciB0aGFuIGl0cyBjbHVzdGVyLCBzbyB3ZSBtdXN0IG1ha2Ugc3VyZSB0bworCQkgKiBpbnZhbGlkYXRlIHRoZSBidWZmZXIgd2hlbiB3ZSB3cml0ZSBpdCBvdXQgYmVsb3cuCisJCSAqLworCQlpbWFwLmltX2Jsa25vID0gMDsKKwkJeGZzX2ltYXAobG9nLT5sX21wLCBOVUxMLCBpbm8sICZpbWFwLCAwKTsKKwl9CisKKwkvKgorCSAqIElub2RlIGJ1ZmZlcnMgY2FuIGJlIGZyZWVkLCBsb29rIG91dCBmb3IgaXQsCisJICogYW5kIGRvIG5vdCByZXBsYXkgdGhlIGlub2RlLgorCSAqLworCWlmICh4bG9nX2NoZWNrX2J1ZmZlcl9jYW5jZWxsZWQobG9nLCBpbWFwLmltX2Jsa25vLCBpbWFwLmltX2xlbiwgMCkpCisJCXJldHVybiAwOworCisJYnAgPSB4ZnNfYnVmX3JlYWRfZmxhZ3MobXAtPm1fZGRldl90YXJncCwgaW1hcC5pbV9ibGtubywgaW1hcC5pbV9sZW4sCisJCQkJCQkJCVhGU19CVUZfTE9DSyk7CisJaWYgKFhGU19CVUZfSVNFUlJPUihicCkpIHsKKwkJeGZzX2lvZXJyb3JfYWxlcnQoInhsb2dfcmVjb3Zlcl9kby4uKHJlYWQjMikiLCBtcCwKKwkJCQkgIGJwLCBpbWFwLmltX2Jsa25vKTsKKwkJZXJyb3IgPSBYRlNfQlVGX0dFVEVSUk9SKGJwKTsKKwkJeGZzX2J1Zl9yZWxzZShicCk7CisJCXJldHVybiBlcnJvcjsKKwl9CisJZXJyb3IgPSAwOworCUFTU0VSVChpbl9mLT5pbGZfZmllbGRzICYgWEZTX0lMT0dfQ09SRSk7CisJZGlwID0gKHhmc19kaW5vZGVfdCAqKXhmc19idWZfb2Zmc2V0KGJwLCBpbWFwLmltX2JvZmZzZXQpOworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhlIHBsYWNlIHdlJ3JlIGZsdXNoaW5nIG91dCB0byByZWFsbHkgbG9va3MKKwkgKiBsaWtlIGFuIGlub2RlIQorCSAqLworCWlmICh1bmxpa2VseShJTlRfR0VUKGRpcC0+ZGlfY29yZS5kaV9tYWdpYywgQVJDSF9DT05WRVJUKSAhPSBYRlNfRElOT0RFX01BR0lDKSkgeworCQl4ZnNfYnVmX3JlbHNlKGJwKTsKKwkJeGZzX2ZzX2Ntbl9lcnIoQ0VfQUxFUlQsIG1wLAorCQkJInhmc19pbm9kZV9yZWNvdmVyOiBCYWQgaW5vZGUgbWFnaWMgbnVtYmVyLCBkaW5vIHB0ciA9IDB4JXAsIGRpbm8gYnAgPSAweCVwLCBpbm8gPSAlTGQiLAorCQkJZGlwLCBicCwgaW5vKTsKKwkJWEZTX0VSUk9SX1JFUE9SVCgieGxvZ19yZWNvdmVyX2RvX2lub2RlX3RyYW5zKDEpIiwKKwkJCQkgWEZTX0VSUkxFVkVMX0xPVywgbXApOworCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJfQorCWRpY3AgPSAoeGZzX2Rpbm9kZV9jb3JlX3QqKShpdGVtLT5yaV9idWZbMV0uaV9hZGRyKTsKKwlpZiAodW5saWtlbHkoZGljcC0+ZGlfbWFnaWMgIT0gWEZTX0RJTk9ERV9NQUdJQykpIHsKKwkJeGZzX2J1Zl9yZWxzZShicCk7CisJCXhmc19mc19jbW5fZXJyKENFX0FMRVJULCBtcCwKKwkJCSJ4ZnNfaW5vZGVfcmVjb3ZlcjogQmFkIGlub2RlIGxvZyByZWNvcmQsIHJlYyBwdHIgMHglcCwgaW5vICVMZCIsCisJCQlpdGVtLCBpbm8pOworCQlYRlNfRVJST1JfUkVQT1JUKCJ4bG9nX3JlY292ZXJfZG9faW5vZGVfdHJhbnMoMikiLAorCQkJCSBYRlNfRVJSTEVWRUxfTE9XLCBtcCk7CisJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwl9CisKKwkvKiBTa2lwIHJlcGxheSB3aGVuIHRoZSBvbiBkaXNrIGlub2RlIGlzIG5ld2VyIHRoYW4gdGhlIGxvZyBvbmUgKi8KKwlpZiAoZGljcC0+ZGlfZmx1c2hpdGVyIDwKKwkgICAgSU5UX0dFVChkaXAtPmRpX2NvcmUuZGlfZmx1c2hpdGVyLCBBUkNIX0NPTlZFUlQpKSB7CisJCS8qCisJCSAqIERlYWwgd2l0aCB0aGUgd3JhcCBjYXNlLCBESV9NQVhfRkxVU0ggaXMgbGVzcworCQkgKiB0aGFuIHNtYWxsZXIgbnVtYmVycworCQkgKi8KKwkJaWYgKChJTlRfR0VUKGRpcC0+ZGlfY29yZS5kaV9mbHVzaGl0ZXIsIEFSQ0hfQ09OVkVSVCkKKwkJCQkJCQk9PSBESV9NQVhfRkxVU0gpICYmCisJCSAgICAoZGljcC0+ZGlfZmx1c2hpdGVyIDwgKERJX01BWF9GTFVTSD4+MSkpKSB7CisJCQkvKiBkbyBub3RoaW5nICovCisJCX0gZWxzZSB7CisJCQl4ZnNfYnVmX3JlbHNlKGJwKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCS8qIFRha2UgdGhlIG9wcG9ydHVuaXR5IHRvIHJlc2V0IHRoZSBmbHVzaCBpdGVyYXRpb24gY291bnQgKi8KKwlkaWNwLT5kaV9mbHVzaGl0ZXIgPSAwOworCisJaWYgKHVubGlrZWx5KChkaWNwLT5kaV9tb2RlICYgU19JRk1UKSA9PSBTX0lGUkVHKSkgeworCQlpZiAoKGRpY3AtPmRpX2Zvcm1hdCAhPSBYRlNfRElOT0RFX0ZNVF9FWFRFTlRTKSAmJgorCQkgICAgKGRpY3AtPmRpX2Zvcm1hdCAhPSBYRlNfRElOT0RFX0ZNVF9CVFJFRSkpIHsKKwkJCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4bG9nX3JlY292ZXJfZG9faW5vZGVfdHJhbnMoMykiLAorCQkJCQkgWEZTX0VSUkxFVkVMX0xPVywgbXAsIGRpY3ApOworCQkJeGZzX2J1Zl9yZWxzZShicCk7CisJCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbXAsCisJCQkJInhmc19pbm9kZV9yZWNvdmVyOiBCYWQgcmVndWxhciBpbm9kZSBsb2cgcmVjb3JkLCByZWMgcHRyIDB4JXAsIGlubyBwdHIgPSAweCVwLCBpbm8gYnAgPSAweCVwLCBpbm8gJUxkIiwKKwkJCQlpdGVtLCBkaXAsIGJwLCBpbm8pOworCQkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCQl9CisJfSBlbHNlIGlmICh1bmxpa2VseSgoZGljcC0+ZGlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRkRJUikpIHsKKwkJaWYgKChkaWNwLT5kaV9mb3JtYXQgIT0gWEZTX0RJTk9ERV9GTVRfRVhURU5UUykgJiYKKwkJICAgIChkaWNwLT5kaV9mb3JtYXQgIT0gWEZTX0RJTk9ERV9GTVRfQlRSRUUpICYmCisJCSAgICAoZGljcC0+ZGlfZm9ybWF0ICE9IFhGU19ESU5PREVfRk1UX0xPQ0FMKSkgeworCQkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhsb2dfcmVjb3Zlcl9kb19pbm9kZV90cmFucyg0KSIsCisJCQkJCSAgICAgWEZTX0VSUkxFVkVMX0xPVywgbXAsIGRpY3ApOworCQkJeGZzX2J1Zl9yZWxzZShicCk7CisJCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbXAsCisJCQkJInhmc19pbm9kZV9yZWNvdmVyOiBCYWQgZGlyIGlub2RlIGxvZyByZWNvcmQsIHJlYyBwdHIgMHglcCwgaW5vIHB0ciA9IDB4JXAsIGlubyBicCA9IDB4JXAsIGlubyAlTGQiLAorCQkJCWl0ZW0sIGRpcCwgYnAsIGlubyk7CisJCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJCX0KKwl9CisJaWYgKHVubGlrZWx5KGRpY3AtPmRpX25leHRlbnRzICsgZGljcC0+ZGlfYW5leHRlbnRzID4gZGljcC0+ZGlfbmJsb2NrcykpeworCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGxvZ19yZWNvdmVyX2RvX2lub2RlX3RyYW5zKDUpIiwKKwkJCQkgICAgIFhGU19FUlJMRVZFTF9MT1csIG1wLCBkaWNwKTsKKwkJeGZzX2J1Zl9yZWxzZShicCk7CisJCXhmc19mc19jbW5fZXJyKENFX0FMRVJULCBtcCwKKwkJCSJ4ZnNfaW5vZGVfcmVjb3ZlcjogQmFkIGlub2RlIGxvZyByZWNvcmQsIHJlYyBwdHIgMHglcCwgZGlubyBwdHIgMHglcCwgZGlubyBicCAweCVwLCBpbm8gJUxkLCB0b3RhbCBleHRlbnRzID0gJWQsIG5ibG9ja3MgPSAlTGQiLAorCQkJaXRlbSwgZGlwLCBicCwgaW5vLAorCQkJZGljcC0+ZGlfbmV4dGVudHMgKyBkaWNwLT5kaV9hbmV4dGVudHMsCisJCQlkaWNwLT5kaV9uYmxvY2tzKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCX0KKwlpZiAodW5saWtlbHkoZGljcC0+ZGlfZm9ya29mZiA+IG1wLT5tX3NiLnNiX2lub2Rlc2l6ZSkpIHsKKwkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhsb2dfcmVjb3Zlcl9kb19pbm9kZV90cmFucyg2KSIsCisJCQkJICAgICBYRlNfRVJSTEVWRUxfTE9XLCBtcCwgZGljcCk7CisJCXhmc19idWZfcmVsc2UoYnApOworCQl4ZnNfZnNfY21uX2VycihDRV9BTEVSVCwgbXAsCisJCQkieGZzX2lub2RlX3JlY292ZXI6IEJhZCBpbm9kZSBsb2cgcmVjIHB0ciAweCVwLCBkaW5vIHB0ciAweCVwLCBkaW5vIGJwIDB4JXAsIGlubyAlTGQsIGZvcmtvZmYgMHgleCIsCisJCQlpdGVtLCBkaXAsIGJwLCBpbm8sIGRpY3AtPmRpX2ZvcmtvZmYpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJfQorCWlmICh1bmxpa2VseShpdGVtLT5yaV9idWZbMV0uaV9sZW4gPiBzaXplb2YoeGZzX2Rpbm9kZV9jb3JlX3QpKSkgeworCQlYRlNfQ09SUlVQVElPTl9FUlJPUigieGxvZ19yZWNvdmVyX2RvX2lub2RlX3RyYW5zKDcpIiwKKwkJCQkgICAgIFhGU19FUlJMRVZFTF9MT1csIG1wLCBkaWNwKTsKKwkJeGZzX2J1Zl9yZWxzZShicCk7CisJCXhmc19mc19jbW5fZXJyKENFX0FMRVJULCBtcCwKKwkJCSJ4ZnNfaW5vZGVfcmVjb3ZlcjogQmFkIGlub2RlIGxvZyByZWNvcmQgbGVuZ3RoICVkLCByZWMgcHRyIDB4JXAiLAorCQkJaXRlbS0+cmlfYnVmWzFdLmlfbGVuLCBpdGVtKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCX0KKworCS8qIFRoZSBjb3JlIGlzIGluIGluLWNvcmUgZm9ybWF0ICovCisJeGZzX3hsYXRlX2Rpbm9kZV9jb3JlKCh4ZnNfY2FkZHJfdCkmZGlwLT5kaV9jb3JlLAorCQkJICAgICAgKHhmc19kaW5vZGVfY29yZV90KilpdGVtLT5yaV9idWZbMV0uaV9hZGRyLCAtMSk7CisKKwkvKiB0aGUgcmVzdCBpcyBpbiBvbi1kaXNrIGZvcm1hdCAqLworCWlmIChpdGVtLT5yaV9idWZbMV0uaV9sZW4gPiBzaXplb2YoeGZzX2Rpbm9kZV9jb3JlX3QpKSB7CisJCW1lbWNweSgoeGZzX2NhZGRyX3QpIGRpcCArIHNpemVvZih4ZnNfZGlub2RlX2NvcmVfdCksCisJCQlpdGVtLT5yaV9idWZbMV0uaV9hZGRyICsgc2l6ZW9mKHhmc19kaW5vZGVfY29yZV90KSwKKwkJCWl0ZW0tPnJpX2J1ZlsxXS5pX2xlbiAgLSBzaXplb2YoeGZzX2Rpbm9kZV9jb3JlX3QpKTsKKwl9CisKKwlmaWVsZHMgPSBpbl9mLT5pbGZfZmllbGRzOworCXN3aXRjaCAoZmllbGRzICYgKFhGU19JTE9HX0RFViB8IFhGU19JTE9HX1VVSUQpKSB7CisJY2FzZSBYRlNfSUxPR19ERVY6CisJCUlOVF9TRVQoZGlwLT5kaV91LmRpX2RldiwgQVJDSF9DT05WRVJULCBpbl9mLT5pbGZfdS5pbGZ1X3JkZXYpOworCisJCWJyZWFrOworCWNhc2UgWEZTX0lMT0dfVVVJRDoKKwkJZGlwLT5kaV91LmRpX211dWlkID0gaW5fZi0+aWxmX3UuaWxmdV91dWlkOworCQlicmVhazsKKwl9CisKKwlpZiAoaW5fZi0+aWxmX3NpemUgPT0gMikKKwkJZ290byB3cml0ZV9pbm9kZV9idWZmZXI7CisJbGVuID0gaXRlbS0+cmlfYnVmWzJdLmlfbGVuOworCXNyYyA9IGl0ZW0tPnJpX2J1ZlsyXS5pX2FkZHI7CisJQVNTRVJUKGluX2YtPmlsZl9zaXplIDw9IDQpOworCUFTU0VSVCgoaW5fZi0+aWxmX3NpemUgPT0gMykgfHwgKGZpZWxkcyAmIFhGU19JTE9HX0FGT1JLKSk7CisJQVNTRVJUKCEoZmllbGRzICYgWEZTX0lMT0dfREZPUkspIHx8CisJICAgICAgIChsZW4gPT0gaW5fZi0+aWxmX2RzaXplKSk7CisKKwlzd2l0Y2ggKGZpZWxkcyAmIFhGU19JTE9HX0RGT1JLKSB7CisJY2FzZSBYRlNfSUxPR19EREFUQToKKwljYXNlIFhGU19JTE9HX0RFWFQ6CisJCW1lbWNweSgmZGlwLT5kaV91LCBzcmMsIGxlbik7CisJCWJyZWFrOworCisJY2FzZSBYRlNfSUxPR19EQlJPT1Q6CisJCXhmc19ibWJ0X3RvX2JtZHIoKHhmc19ibWJ0X2Jsb2NrX3QgKilzcmMsIGxlbiwKKwkJCQkgJihkaXAtPmRpX3UuZGlfYm1idCksCisJCQkJIFhGU19ERk9SS19EU0laRShkaXAsIG1wKSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJLyoKKwkJICogVGhlcmUgYXJlIG5vIGRhdGEgZm9yayBmbGFncyBzZXQuCisJCSAqLworCQlBU1NFUlQoKGZpZWxkcyAmIFhGU19JTE9HX0RGT1JLKSA9PSAwKTsKKwkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBJZiB3ZSBsb2dnZWQgYW55IGF0dHJpYnV0ZSBkYXRhLCByZWNvdmVyIGl0LiAgVGhlcmUgbWF5IG9yCisJICogbWF5IG5vdCBoYXZlIGJlZW4gYW55IG90aGVyIG5vbi1jb3JlIGRhdGEgbG9nZ2VkIGluIHRoaXMKKwkgKiB0cmFuc2FjdGlvbi4KKwkgKi8KKwlpZiAoaW5fZi0+aWxmX2ZpZWxkcyAmIFhGU19JTE9HX0FGT1JLKSB7CisJCWlmIChpbl9mLT5pbGZfZmllbGRzICYgWEZTX0lMT0dfREZPUkspIHsKKwkJCWF0dHJfaW5kZXggPSAzOworCQl9IGVsc2UgeworCQkJYXR0cl9pbmRleCA9IDI7CisJCX0KKwkJbGVuID0gaXRlbS0+cmlfYnVmW2F0dHJfaW5kZXhdLmlfbGVuOworCQlzcmMgPSBpdGVtLT5yaV9idWZbYXR0cl9pbmRleF0uaV9hZGRyOworCQlBU1NFUlQobGVuID09IGluX2YtPmlsZl9hc2l6ZSk7CisKKwkJc3dpdGNoIChpbl9mLT5pbGZfZmllbGRzICYgWEZTX0lMT0dfQUZPUkspIHsKKwkJY2FzZSBYRlNfSUxPR19BREFUQToKKwkJY2FzZSBYRlNfSUxPR19BRVhUOgorCQkJZGVzdCA9IFhGU19ERk9SS19BUFRSKGRpcCk7CisJCQlBU1NFUlQobGVuIDw9IFhGU19ERk9SS19BU0laRShkaXAsIG1wKSk7CisJCQltZW1jcHkoZGVzdCwgc3JjLCBsZW4pOworCQkJYnJlYWs7CisKKwkJY2FzZSBYRlNfSUxPR19BQlJPT1Q6CisJCQlkZXN0ID0gWEZTX0RGT1JLX0FQVFIoZGlwKTsKKwkJCXhmc19ibWJ0X3RvX2JtZHIoKHhmc19ibWJ0X2Jsb2NrX3QgKilzcmMsIGxlbiwKKwkJCQkJICh4ZnNfYm1kcl9ibG9ja190KilkZXN0LAorCQkJCQkgWEZTX0RGT1JLX0FTSVpFKGRpcCwgbXApKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQl4bG9nX3dhcm4oIlhGUzogeGxvZ19yZWNvdmVyX2RvX2lub2RlX3RyYW5zOiBJbnZhbGlkIGZsYWciKTsKKwkJCUFTU0VSVCgwKTsKKwkJCXhmc19idWZfcmVsc2UoYnApOworCQkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCQl9CisJfQorCit3cml0ZV9pbm9kZV9idWZmZXI6CisJaWYgKElURU1fVFlQRShpdGVtKSA9PSBYRlNfTElfSU5PREUpIHsKKwkJQVNTRVJUKFhGU19CVUZfRlNQUklWQVRFKGJwLCB2b2lkICopID09IE5VTEwgfHwKKwkJICAgICAgIFhGU19CVUZfRlNQUklWQVRFKGJwLCB4ZnNfbW91bnRfdCAqKSA9PSBtcCk7CisJCVhGU19CVUZfU0VUX0ZTUFJJVkFURShicCwgbXApOworCQlYRlNfQlVGX1NFVF9JT0RPTkVfRlVOQyhicCwgeGxvZ19yZWNvdmVyX2lvZG9uZSk7CisJCXhmc19iZHdyaXRlKG1wLCBicCk7CisJfSBlbHNlIHsKKwkJWEZTX0JVRl9TVEFMRShicCk7CisJCWVycm9yID0geGZzX2J3cml0ZShtcCwgYnApOworCX0KKworCXJldHVybiAoZXJyb3IpOworfQorCisvKgorICogUmVjb3ZlciBRVU9UQU9GRiByZWNvcmRzLiBXZSBzaW1wbHkgbWFrZSBhIG5vdGUgb2YgaXQgaW4gdGhlIHhsb2dfdAorICogc3RydWN0dXJlLCBzbyB0aGF0IHdlIGtub3cgbm90IHRvIGRvIGFueSBkcXVvdCBpdGVtIG9yIGRxdW90IGJ1ZmZlciByZWNvdmVyeSwKKyAqIG9mIHRoYXQgdHlwZS4KKyAqLworU1RBVElDIGludAoreGxvZ19yZWNvdmVyX2RvX3F1b3Rhb2ZmX3RyYW5zKAorCXhsb2dfdAkJCSpsb2csCisJeGxvZ19yZWNvdmVyX2l0ZW1fdAkqaXRlbSwKKwlpbnQJCQlwYXNzKQoreworCXhmc19xb2ZmX2xvZ2Zvcm1hdF90CSpxb2ZmX2Y7CisKKwlpZiAocGFzcyA9PSBYTE9HX1JFQ09WRVJfUEFTUzIpIHsKKwkJcmV0dXJuICgwKTsKKwl9CisKKwlxb2ZmX2YgPSAoeGZzX3FvZmZfbG9nZm9ybWF0X3QgKilpdGVtLT5yaV9idWZbMF0uaV9hZGRyOworCUFTU0VSVChxb2ZmX2YpOworCisJLyoKKwkgKiBUaGUgbG9naXRlbSBmb3JtYXQncyBmbGFnIHRlbGxzIHVzIGlmIHRoaXMgd2FzIHVzZXIgcXVvdGFvZmYsCisJICogZ3JvdXAgcXVvdGFvZmYgb3IgYm90aC4KKwkgKi8KKwlpZiAocW9mZl9mLT5xZl9mbGFncyAmIFhGU19VUVVPVEFfQUNDVCkKKwkJbG9nLT5sX3F1b3Rhb2Zmc19mbGFnIHw9IFhGU19EUV9VU0VSOworCWlmIChxb2ZmX2YtPnFmX2ZsYWdzICYgWEZTX0dRVU9UQV9BQ0NUKQorCQlsb2ctPmxfcXVvdGFvZmZzX2ZsYWcgfD0gWEZTX0RRX0dST1VQOworCisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqIFJlY292ZXIgYSBkcXVvdCByZWNvcmQKKyAqLworU1RBVElDIGludAoreGxvZ19yZWNvdmVyX2RvX2RxdW90X3RyYW5zKAorCXhsb2dfdAkJCSpsb2csCisJeGxvZ19yZWNvdmVyX2l0ZW1fdAkqaXRlbSwKKwlpbnQJCQlwYXNzKQoreworCXhmc19tb3VudF90CQkqbXA7CisJeGZzX2J1Zl90CQkqYnA7CisJc3RydWN0IHhmc19kaXNrX2RxdW90CSpkZHEsICpyZWNkZHE7CisJaW50CQkJZXJyb3I7CisJeGZzX2RxX2xvZ2Zvcm1hdF90CSpkcV9mOworCXVpbnQJCQl0eXBlOworCisJaWYgKHBhc3MgPT0gWExPR19SRUNPVkVSX1BBU1MxKSB7CisJCXJldHVybiAwOworCX0KKwltcCA9IGxvZy0+bF9tcDsKKworCS8qCisJICogRmlsZXN5c3RlbXMgYXJlIHJlcXVpcmVkIHRvIHNlbmQgaW4gcXVvdGEgZmxhZ3MgYXQgbW91bnQgdGltZS4KKwkgKi8KKwlpZiAobXAtPm1fcWZsYWdzID09IDApCisJCXJldHVybiAoMCk7CisKKwlyZWNkZHEgPSAoeGZzX2Rpc2tfZHF1b3RfdCAqKWl0ZW0tPnJpX2J1ZlsxXS5pX2FkZHI7CisJQVNTRVJUKHJlY2RkcSk7CisJLyoKKwkgKiBUaGlzIHR5cGUgb2YgcXVvdGFzIHdhcyB0dXJuZWQgb2ZmLCBzbyBpZ25vcmUgdGhpcyByZWNvcmQuCisJICovCisJdHlwZSA9IElOVF9HRVQocmVjZGRxLT5kX2ZsYWdzLCBBUkNIX0NPTlZFUlQpICYKKwkJCShYRlNfRFFfVVNFUiB8IFhGU19EUV9HUk9VUCk7CisJQVNTRVJUKHR5cGUpOworCWlmIChsb2ctPmxfcXVvdGFvZmZzX2ZsYWcgJiB0eXBlKQorCQlyZXR1cm4gKDApOworCisJLyoKKwkgKiBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCBxdW90YSB3YXMgX25vdF8gdHVybmVkIG9mZi4KKwkgKiBTaW5jZSB0aGUgbW91bnQgZmxhZ3MgYXJlIG5vdCBpbmRpY2F0aW5nIHRvIHVzIG90aGVyd2lzZSwgdGhpcworCSAqIG11c3QgbWVhbiB0aGF0IHF1b3RhIGlzIG9uLCBhbmQgdGhlIGRxdW90IG5lZWRzIHRvIGJlIHJlcGxheWVkLgorCSAqIFJlbWVtYmVyIHRoYXQgd2UgbWF5IG5vdCBoYXZlIGZ1bGx5IHJlY292ZXJlZCB0aGUgc3VwZXJibG9jayB5ZXQsCisJICogc28gd2UgY2FuJ3QgZG8gdGhlIHVzdWFsIHRyaWNrIG9mIGxvb2tpbmcgYXQgdGhlIFNCIHF1b3RhIGJpdHMuCisJICoKKwkgKiBUaGUgb3RoZXIgcG9zc2liaWxpdHksIG9mIGNvdXJzZSwgaXMgdGhhdCB0aGUgcXVvdGEgc3Vic3lzdGVtIHdhcworCSAqIHJlbW92ZWQgc2luY2UgdGhlIGxhc3QgbW91bnQgLSBFTk9TWVMuCisJICovCisJZHFfZiA9ICh4ZnNfZHFfbG9nZm9ybWF0X3QgKilpdGVtLT5yaV9idWZbMF0uaV9hZGRyOworCUFTU0VSVChkcV9mKTsKKwlpZiAoKGVycm9yID0geGZzX3FtX2RxY2hlY2socmVjZGRxLAorCQkJICAgZHFfZi0+cWxmX2lkLAorCQkJICAgMCwgWEZTX1FNT1BUX0RPV0FSTiwKKwkJCSAgICJ4bG9nX3JlY292ZXJfZG9fZHF1b3RfdHJhbnMgKGxvZyBjb3B5KSIpKSkgeworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJfQorCUFTU0VSVChkcV9mLT5xbGZfbGVuID09IDEpOworCisJZXJyb3IgPSB4ZnNfcmVhZF9idWYobXAsIG1wLT5tX2RkZXZfdGFyZ3AsCisJCQkgICAgIGRxX2YtPnFsZl9ibGtubywKKwkJCSAgICAgWEZTX0ZTQl9UT19CQihtcCwgZHFfZi0+cWxmX2xlbiksCisJCQkgICAgIDAsICZicCk7CisJaWYgKGVycm9yKSB7CisJCXhmc19pb2Vycm9yX2FsZXJ0KCJ4bG9nX3JlY292ZXJfZG8uLihyZWFkIzMpIiwgbXAsCisJCQkJICBicCwgZHFfZi0+cWxmX2Jsa25vKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlBU1NFUlQoYnApOworCWRkcSA9ICh4ZnNfZGlza19kcXVvdF90ICopeGZzX2J1Zl9vZmZzZXQoYnAsIGRxX2YtPnFsZl9ib2Zmc2V0KTsKKworCS8qCisJICogQXQgbGVhc3QgdGhlIG1hZ2ljIG51bSBwb3J0aW9uIHNob3VsZCBiZSBvbiBkaXNrIGJlY2F1c2UgdGhpcworCSAqIHdhcyBhbW9uZyBhIGNodW5rIG9mIGRxdW90cyBjcmVhdGVkIGVhcmxpZXIsIGFuZCB3ZSBkaWQgc29tZQorCSAqIG1pbmltYWwgaW5pdGlhbGl6YXRpb24gdGhlbi4KKwkgKi8KKwlpZiAoeGZzX3FtX2RxY2hlY2soZGRxLCBkcV9mLT5xbGZfaWQsIDAsIFhGU19RTU9QVF9ET1dBUk4sCisJCQkgICAieGxvZ19yZWNvdmVyX2RvX2RxdW90X3RyYW5zIikpIHsKKwkJeGZzX2J1Zl9yZWxzZShicCk7CisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKwl9CisKKwltZW1jcHkoZGRxLCByZWNkZHEsIGl0ZW0tPnJpX2J1ZlsxXS5pX2xlbik7CisKKwlBU1NFUlQoZHFfZi0+cWxmX3NpemUgPT0gMik7CisJQVNTRVJUKFhGU19CVUZfRlNQUklWQVRFKGJwLCB2b2lkICopID09IE5VTEwgfHwKKwkgICAgICAgWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhmc19tb3VudF90ICopID09IG1wKTsKKwlYRlNfQlVGX1NFVF9GU1BSSVZBVEUoYnAsIG1wKTsKKwlYRlNfQlVGX1NFVF9JT0RPTkVfRlVOQyhicCwgeGxvZ19yZWNvdmVyX2lvZG9uZSk7CisJeGZzX2Jkd3JpdGUobXAsIGJwKTsKKworCXJldHVybiAoMCk7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGNyZWF0ZSBhbiBpbi1jb3JlIGV4dGVudCBmcmVlIGludGVudAorICogaXRlbSBmcm9tIHRoZSBlZmkgZm9ybWF0IHN0cnVjdHVyZSB3aGljaCB3YXMgbG9nZ2VkIG9uIGRpc2suCisgKiBJdCBhbGxvY2F0ZXMgYW4gaW4tY29yZSBlZmksIGNvcGllcyB0aGUgZXh0ZW50cyBmcm9tIHRoZSBmb3JtYXQKKyAqIHN0cnVjdHVyZSBpbnRvIGl0LCBhbmQgYWRkcyB0aGUgZWZpIHRvIHRoZSBBSUwgd2l0aCB0aGUgZ2l2ZW4KKyAqIExTTi4KKyAqLworU1RBVElDIHZvaWQKK3hsb2dfcmVjb3Zlcl9kb19lZmlfdHJhbnMoCisJeGxvZ190CQkJKmxvZywKKwl4bG9nX3JlY292ZXJfaXRlbV90CSppdGVtLAorCXhmc19sc25fdAkJbHNuLAorCWludAkJCXBhc3MpCit7CisJeGZzX21vdW50X3QJCSptcDsKKwl4ZnNfZWZpX2xvZ19pdGVtX3QJKmVmaXA7CisJeGZzX2VmaV9sb2dfZm9ybWF0X3QJKmVmaV9mb3JtYXRwOworCVNQTERFQ0wocyk7CisKKwlpZiAocGFzcyA9PSBYTE9HX1JFQ09WRVJfUEFTUzEpIHsKKwkJcmV0dXJuOworCX0KKworCWVmaV9mb3JtYXRwID0gKHhmc19lZmlfbG9nX2Zvcm1hdF90ICopaXRlbS0+cmlfYnVmWzBdLmlfYWRkcjsKKwlBU1NFUlQoaXRlbS0+cmlfYnVmWzBdLmlfbGVuID09CisJICAgICAgIChzaXplb2YoeGZzX2VmaV9sb2dfZm9ybWF0X3QpICsKKwkJKChlZmlfZm9ybWF0cC0+ZWZpX25leHRlbnRzIC0gMSkgKiBzaXplb2YoeGZzX2V4dGVudF90KSkpKTsKKworCW1wID0gbG9nLT5sX21wOworCWVmaXAgPSB4ZnNfZWZpX2luaXQobXAsIGVmaV9mb3JtYXRwLT5lZmlfbmV4dGVudHMpOworCW1lbWNweSgoY2hhciAqKSYoZWZpcC0+ZWZpX2Zvcm1hdCksIChjaGFyICopZWZpX2Zvcm1hdHAsCisJICAgICAgc2l6ZW9mKHhmc19lZmlfbG9nX2Zvcm1hdF90KSArCisJICAgICAgKChlZmlfZm9ybWF0cC0+ZWZpX25leHRlbnRzIC0gMSkgKiBzaXplb2YoeGZzX2V4dGVudF90KSkpOworCWVmaXAtPmVmaV9uZXh0X2V4dGVudCA9IGVmaV9mb3JtYXRwLT5lZmlfbmV4dGVudHM7CisJZWZpcC0+ZWZpX2ZsYWdzIHw9IFhGU19FRklfQ09NTUlUVEVEOworCisJQUlMX0xPQ0sobXAscyk7CisJLyoKKwkgKiB4ZnNfdHJhbnNfdXBkYXRlX2FpbCgpIGRyb3BzIHRoZSBBSUwgbG9jay4KKwkgKi8KKwl4ZnNfdHJhbnNfdXBkYXRlX2FpbChtcCwgKHhmc19sb2dfaXRlbV90ICopZWZpcCwgbHNuLCBzKTsKK30KKworCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuIGFuIGVmZCBmb3JtYXQgc3RydWN0dXJlIGlzIGZvdW5kIGluCisgKiBhIGNvbW1pdHRlZCB0cmFuc2FjdGlvbiBpbiB0aGUgbG9nLiAgSXQncyBwdXJwb3NlIGlzIHRvIGNhbmNlbAorICogdGhlIGNvcnJlc3BvbmRpbmcgZWZpIGlmIGl0IHdhcyBzdGlsbCBpbiB0aGUgbG9nLiAgVG8gZG8gdGhpcworICogaXQgc2VhcmNoZXMgdGhlIEFJTCBmb3IgdGhlIGVmaSB3aXRoIGFuIGlkIGVxdWFsIHRvIHRoYXQgaW4gdGhlCisgKiBlZmQgZm9ybWF0IHN0cnVjdHVyZS4gIElmIHdlIGZpbmQgaXQsIHdlIHJlbW92ZSB0aGUgZWZpIGZyb20gdGhlCisgKiBBSUwgYW5kIGZyZWUgaXQuCisgKi8KK1NUQVRJQyB2b2lkCit4bG9nX3JlY292ZXJfZG9fZWZkX3RyYW5zKAorCXhsb2dfdAkJCSpsb2csCisJeGxvZ19yZWNvdmVyX2l0ZW1fdAkqaXRlbSwKKwlpbnQJCQlwYXNzKQoreworCXhmc19tb3VudF90CQkqbXA7CisJeGZzX2VmZF9sb2dfZm9ybWF0X3QJKmVmZF9mb3JtYXRwOworCXhmc19lZmlfbG9nX2l0ZW1fdAkqZWZpcCA9IE5VTEw7CisJeGZzX2xvZ19pdGVtX3QJCSpsaXA7CisJaW50CQkJZ2VuOworCWludAkJCW5leHRzOworCV9fdWludDY0X3QJCWVmaV9pZDsKKwlTUExERUNMKHMpOworCisJaWYgKHBhc3MgPT0gWExPR19SRUNPVkVSX1BBU1MxKSB7CisJCXJldHVybjsKKwl9CisKKwllZmRfZm9ybWF0cCA9ICh4ZnNfZWZkX2xvZ19mb3JtYXRfdCAqKWl0ZW0tPnJpX2J1ZlswXS5pX2FkZHI7CisJQVNTRVJUKGl0ZW0tPnJpX2J1ZlswXS5pX2xlbiA9PQorCSAgICAgICAoc2l6ZW9mKHhmc19lZmRfbG9nX2Zvcm1hdF90KSArCisJCSgoZWZkX2Zvcm1hdHAtPmVmZF9uZXh0ZW50cyAtIDEpICogc2l6ZW9mKHhmc19leHRlbnRfdCkpKSk7CisJZWZpX2lkID0gZWZkX2Zvcm1hdHAtPmVmZF9lZmlfaWQ7CisKKwkvKgorCSAqIFNlYXJjaCBmb3IgdGhlIGVmaSB3aXRoIHRoZSBpZCBpbiB0aGUgZWZkIGZvcm1hdCBzdHJ1Y3R1cmUKKwkgKiBpbiB0aGUgQUlMLgorCSAqLworCW1wID0gbG9nLT5sX21wOworCUFJTF9MT0NLKG1wLHMpOworCWxpcCA9IHhmc190cmFuc19maXJzdF9haWwobXAsICZnZW4pOworCXdoaWxlIChsaXAgIT0gTlVMTCkgeworCQlpZiAobGlwLT5saV90eXBlID09IFhGU19MSV9FRkkpIHsKKwkJCWVmaXAgPSAoeGZzX2VmaV9sb2dfaXRlbV90ICopbGlwOworCQkJaWYgKGVmaXAtPmVmaV9mb3JtYXQuZWZpX2lkID09IGVmaV9pZCkgeworCQkJCS8qCisJCQkJICogeGZzX3RyYW5zX2RlbGV0ZV9haWwoKSBkcm9wcyB0aGUKKwkJCQkgKiBBSUwgbG9jay4KKwkJCQkgKi8KKwkJCQl4ZnNfdHJhbnNfZGVsZXRlX2FpbChtcCwgbGlwLCBzKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlsaXAgPSB4ZnNfdHJhbnNfbmV4dF9haWwobXAsIGxpcCwgJmdlbiwgTlVMTCk7CisJfQorCWlmIChsaXAgPT0gTlVMTCkgeworCQlBSUxfVU5MT0NLKG1wLCBzKTsKKwl9CisKKwkvKgorCSAqIElmIHdlIGZvdW5kIGl0LCB0aGVuIGZyZWUgaXQgdXAuICBJZiBpdCB3YXNuJ3QgdGhlcmUsIGl0CisJICogbXVzdCBoYXZlIGJlZW4gb3ZlcndyaXR0ZW4gaW4gdGhlIGxvZy4gIE9oIHdlbGwuCisJICovCisJaWYgKGxpcCAhPSBOVUxMKSB7CisJCW5leHRzID0gZWZpcC0+ZWZpX2Zvcm1hdC5lZmlfbmV4dGVudHM7CisJCWlmIChuZXh0cyA+IFhGU19FRklfTUFYX0ZBU1RfRVhURU5UUykgeworCQkJa21lbV9mcmVlKGxpcCwgc2l6ZW9mKHhmc19lZmlfbG9nX2l0ZW1fdCkgKworCQkJCSAgKChuZXh0cyAtIDEpICogc2l6ZW9mKHhmc19leHRlbnRfdCkpKTsKKwkJfSBlbHNlIHsKKwkJCWttZW1fem9uZV9mcmVlKHhmc19lZmlfem9uZSwgZWZpcCk7CisJCX0KKwl9Cit9CisKKy8qCisgKiBQZXJmb3JtIHRoZSB0cmFuc2FjdGlvbgorICoKKyAqIElmIHRoZSB0cmFuc2FjdGlvbiBtb2RpZmllcyBhIGJ1ZmZlciBvciBpbm9kZSwgZG8gaXQgbm93LiAgT3RoZXJ3aXNlLAorICogRUZJcyBhbmQgRUZEcyBnZXQgcXVldWVkIHVwIGJ5IGFkZGluZyBlbnRyaWVzIGludG8gdGhlIEFJTCBmb3IgdGhlbS4KKyAqLworU1RBVElDIGludAoreGxvZ19yZWNvdmVyX2RvX3RyYW5zKAorCXhsb2dfdAkJCSpsb2csCisJeGxvZ19yZWNvdmVyX3QJCSp0cmFucywKKwlpbnQJCQlwYXNzKQoreworCWludAkJCWVycm9yID0gMDsKKwl4bG9nX3JlY292ZXJfaXRlbV90CSppdGVtLCAqZmlyc3RfaXRlbTsKKworCWlmICgoZXJyb3IgPSB4bG9nX3JlY292ZXJfcmVvcmRlcl90cmFucyhsb2csIHRyYW5zKSkpCisJCXJldHVybiBlcnJvcjsKKwlmaXJzdF9pdGVtID0gaXRlbSA9IHRyYW5zLT5yX2l0ZW1xOworCWRvIHsKKwkJLyoKKwkJICogd2UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCB0aGUgYmxvY2sgbnVtYmVyIGJlaW5nCisJCSAqIHRydW5jYXRlZCBpbiA+IDEgVEIgYnVmZmVycyBiZWNhdXNlIGluIHVzZXItbGFuZCwKKwkJICogd2UncmUgbm93IG4zMiBvciA2NC1iaXQgc28geGZzX2RhZGRyX3QgaXMgNjQtYml0cyBzbworCQkgKiB0aGUgYmxrbm8ncyB3aWxsIGdldCB0aHJvdWdoIHRoZSB1c2VyLW1vZGUgYnVmZmVyCisJCSAqIGNhY2hlIHByb3Blcmx5LiAgVGhlIG9ubHkgYmFkIGNhc2UgaXMgbzMyIGtlcm5lbHMKKwkJICogd2hlcmUgeGZzX2RhZGRyX3QgaXMgMzItYml0cyBidXQgbW91bnQgd2lsbCB3YXJuIHVzCisJCSAqIG9mZiBhID4gMSBUQiBmaWxlc3lzdGVtIGJlZm9yZSB3ZSBnZXQgaGVyZS4KKwkJICovCisJCWlmICgoSVRFTV9UWVBFKGl0ZW0pID09IFhGU19MSV9CVUYpIHx8CisJCSAgICAoSVRFTV9UWVBFKGl0ZW0pID09IFhGU19MSV82XzFfQlVGKSB8fAorCQkgICAgKElURU1fVFlQRShpdGVtKSA9PSBYRlNfTElfNV8zX0JVRikpIHsKKwkJCWlmICAoKGVycm9yID0geGxvZ19yZWNvdmVyX2RvX2J1ZmZlcl90cmFucyhsb2csIGl0ZW0sCisJCQkJCQkJCSBwYXNzKSkpCisJCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoKElURU1fVFlQRShpdGVtKSA9PSBYRlNfTElfSU5PREUpIHx8CisJCQkgICAoSVRFTV9UWVBFKGl0ZW0pID09IFhGU19MSV82XzFfSU5PREUpIHx8CisJCQkgICAoSVRFTV9UWVBFKGl0ZW0pID09IFhGU19MSV81XzNfSU5PREUpKSB7CisJCQlpZiAoKGVycm9yID0geGxvZ19yZWNvdmVyX2RvX2lub2RlX3RyYW5zKGxvZywgaXRlbSwKKwkJCQkJCQkJcGFzcykpKQorCQkJCWJyZWFrOworCQl9IGVsc2UgaWYgKElURU1fVFlQRShpdGVtKSA9PSBYRlNfTElfRUZJKSB7CisJCQl4bG9nX3JlY292ZXJfZG9fZWZpX3RyYW5zKGxvZywgaXRlbSwgdHJhbnMtPnJfbHNuLAorCQkJCQkJICBwYXNzKTsKKwkJfSBlbHNlIGlmIChJVEVNX1RZUEUoaXRlbSkgPT0gWEZTX0xJX0VGRCkgeworCQkJeGxvZ19yZWNvdmVyX2RvX2VmZF90cmFucyhsb2csIGl0ZW0sIHBhc3MpOworCQl9IGVsc2UgaWYgKElURU1fVFlQRShpdGVtKSA9PSBYRlNfTElfRFFVT1QpIHsKKwkJCWlmICgoZXJyb3IgPSB4bG9nX3JlY292ZXJfZG9fZHF1b3RfdHJhbnMobG9nLCBpdGVtLAorCQkJCQkJCQkgICBwYXNzKSkpCisJCQkJCWJyZWFrOworCQl9IGVsc2UgaWYgKChJVEVNX1RZUEUoaXRlbSkgPT0gWEZTX0xJX1FVT1RBT0ZGKSkgeworCQkJaWYgKChlcnJvciA9IHhsb2dfcmVjb3Zlcl9kb19xdW90YW9mZl90cmFucyhsb2csIGl0ZW0sCisJCQkJCQkJCSAgIHBhc3MpKSkKKwkJCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQl4bG9nX3dhcm4oIlhGUzogeGxvZ19yZWNvdmVyX2RvX3RyYW5zIik7CisJCQlBU1NFUlQoMCk7CisJCQllcnJvciA9IFhGU19FUlJPUihFSU8pOworCQkJYnJlYWs7CisJCX0KKwkJaXRlbSA9IGl0ZW0tPnJpX25leHQ7CisJfSB3aGlsZSAoZmlyc3RfaXRlbSAhPSBpdGVtKTsKKworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIEZyZWUgdXAgYW55IHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgdGhlIHRyYW5zYWN0aW9uCisgKgorICogUmVtZW1iZXIgdGhhdCBFRklzLCBFRkRzLCBhbmQgSVVOTElOS3MgYXJlIGhhbmRsZWQgbGF0ZXIuCisgKi8KK1NUQVRJQyB2b2lkCit4bG9nX3JlY292ZXJfZnJlZV90cmFucygKKwl4bG9nX3JlY292ZXJfdAkJKnRyYW5zKQoreworCXhsb2dfcmVjb3Zlcl9pdGVtX3QJKmZpcnN0X2l0ZW0sICppdGVtLCAqZnJlZV9pdGVtOworCWludAkJCWk7CisKKwlpdGVtID0gZmlyc3RfaXRlbSA9IHRyYW5zLT5yX2l0ZW1xOworCWRvIHsKKwkJZnJlZV9pdGVtID0gaXRlbTsKKwkJaXRlbSA9IGl0ZW0tPnJpX25leHQ7CisJCSAvKiBGcmVlIHRoZSByZWdpb25zIGluIHRoZSBpdGVtLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgZnJlZV9pdGVtLT5yaV9jbnQ7IGkrKykgeworCQkJa21lbV9mcmVlKGZyZWVfaXRlbS0+cmlfYnVmW2ldLmlfYWRkciwKKwkJCQkgIGZyZWVfaXRlbS0+cmlfYnVmW2ldLmlfbGVuKTsKKwkJfQorCQkvKiBGcmVlIHRoZSBpdGVtIGl0c2VsZiAqLworCQlrbWVtX2ZyZWUoZnJlZV9pdGVtLT5yaV9idWYsCisJCQkgIChmcmVlX2l0ZW0tPnJpX3RvdGFsICogc2l6ZW9mKHhmc19sb2dfaW92ZWNfdCkpKTsKKwkJa21lbV9mcmVlKGZyZWVfaXRlbSwgc2l6ZW9mKHhsb2dfcmVjb3Zlcl9pdGVtX3QpKTsKKwl9IHdoaWxlIChmaXJzdF9pdGVtICE9IGl0ZW0pOworCS8qIEZyZWUgdGhlIHRyYW5zYWN0aW9uIHJlY292ZXIgc3RydWN0dXJlICovCisJa21lbV9mcmVlKHRyYW5zLCBzaXplb2YoeGxvZ19yZWNvdmVyX3QpKTsKK30KKworU1RBVElDIGludAoreGxvZ19yZWNvdmVyX2NvbW1pdF90cmFucygKKwl4bG9nX3QJCQkqbG9nLAorCXhsb2dfcmVjb3Zlcl90CQkqKnEsCisJeGxvZ19yZWNvdmVyX3QJCSp0cmFucywKKwlpbnQJCQlwYXNzKQoreworCWludAkJCWVycm9yOworCisJaWYgKChlcnJvciA9IHhsb2dfcmVjb3Zlcl91bmxpbmtfdGlkKHEsIHRyYW5zKSkpCisJCXJldHVybiBlcnJvcjsKKwlpZiAoKGVycm9yID0geGxvZ19yZWNvdmVyX2RvX3RyYW5zKGxvZywgdHJhbnMsIHBhc3MpKSkKKwkJcmV0dXJuIGVycm9yOworCXhsb2dfcmVjb3Zlcl9mcmVlX3RyYW5zKHRyYW5zKTsJCQkvKiBubyBlcnJvciAqLworCXJldHVybiAwOworfQorCitTVEFUSUMgaW50Cit4bG9nX3JlY292ZXJfdW5tb3VudF90cmFucygKKwl4bG9nX3JlY292ZXJfdAkJKnRyYW5zKQoreworCS8qIERvIG5vdGhpbmcgbm93ICovCisJeGxvZ193YXJuKCJYRlM6IHhsb2dfcmVjb3Zlcl91bm1vdW50X3RyYW5zOiBVbm1vdW50IExSIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGVyZSBhcmUgdHdvIHZhbGlkIHN0YXRlcyBvZiB0aGUgcl9zdGF0ZSBmaWVsZC4gIDAgaW5kaWNhdGVzIHRoYXQgdGhlCisgKiB0cmFuc2FjdGlvbiBzdHJ1Y3R1cmUgaXMgaW4gYSBub3JtYWwgc3RhdGUuICBXZSBoYXZlIGVpdGhlciBzZWVuIHRoZQorICogc3RhcnQgb2YgdGhlIHRyYW5zYWN0aW9uIG9yIHRoZSBsYXN0IG9wZXJhdGlvbiB3ZSBhZGRlZCB3YXMgbm90IGEgcGFydGlhbAorICogb3BlcmF0aW9uLiAgSWYgdGhlIGxhc3Qgb3BlcmF0aW9uIHdlIGFkZGVkIHRvIHRoZSB0cmFuc2FjdGlvbiB3YXMgYQorICogcGFydGlhbCBvcGVyYXRpb24sIHdlIG5lZWQgdG8gbWFyayByX3N0YXRlIHdpdGggWExPR19XQVNfQ09OVF9UUkFOUy4KKyAqCisgKiBOT1RFOiBza2lwIExScyB3aXRoIDAgZGF0YSBsZW5ndGguCisgKi8KK1NUQVRJQyBpbnQKK3hsb2dfcmVjb3Zlcl9wcm9jZXNzX2RhdGEoCisJeGxvZ190CQkJKmxvZywKKwl4bG9nX3JlY292ZXJfdAkJKnJoYXNoW10sCisJeGxvZ19yZWNfaGVhZGVyX3QJKnJoZWFkLAorCXhmc19jYWRkcl90CQlkcCwKKwlpbnQJCQlwYXNzKQoreworCXhmc19jYWRkcl90CQlscDsKKwlpbnQJCQludW1fbG9nb3BzOworCXhsb2dfb3BfaGVhZGVyX3QJKm9oZWFkOworCXhsb2dfcmVjb3Zlcl90CQkqdHJhbnM7CisJeGxvZ190aWRfdAkJdGlkOworCWludAkJCWVycm9yOworCXVuc2lnbmVkIGxvbmcJCWhhc2g7CisJdWludAkJCWZsYWdzOworCisJbHAgPSBkcCArIElOVF9HRVQocmhlYWQtPmhfbGVuLCBBUkNIX0NPTlZFUlQpOworCW51bV9sb2dvcHMgPSBJTlRfR0VUKHJoZWFkLT5oX251bV9sb2dvcHMsIEFSQ0hfQ09OVkVSVCk7CisKKwkvKiBjaGVjayB0aGUgbG9nIGZvcm1hdCBtYXRjaGVzIG91ciBvd24gLSBlbHNlIHdlIGNhbid0IHJlY292ZXIgKi8KKwlpZiAoeGxvZ19oZWFkZXJfY2hlY2tfcmVjb3Zlcihsb2ctPmxfbXAsIHJoZWFkKSkKKwkJcmV0dXJuIChYRlNfRVJST1IoRUlPKSk7CisKKwl3aGlsZSAoKGRwIDwgbHApICYmIG51bV9sb2dvcHMpIHsKKwkJQVNTRVJUKGRwICsgc2l6ZW9mKHhsb2dfb3BfaGVhZGVyX3QpIDw9IGxwKTsKKwkJb2hlYWQgPSAoeGxvZ19vcF9oZWFkZXJfdCAqKWRwOworCQlkcCArPSBzaXplb2YoeGxvZ19vcF9oZWFkZXJfdCk7CisJCWlmIChvaGVhZC0+b2hfY2xpZW50aWQgIT0gWEZTX1RSQU5TQUNUSU9OICYmCisJCSAgICBvaGVhZC0+b2hfY2xpZW50aWQgIT0gWEZTX0xPRykgeworCQkJeGxvZ193YXJuKAorCQkiWEZTOiB4bG9nX3JlY292ZXJfcHJvY2Vzc19kYXRhOiBiYWQgY2xpZW50aWQiKTsKKwkJCUFTU0VSVCgwKTsKKwkJCXJldHVybiAoWEZTX0VSUk9SKEVJTykpOworCQl9CisJCXRpZCA9IElOVF9HRVQob2hlYWQtPm9oX3RpZCwgQVJDSF9DT05WRVJUKTsKKwkJaGFzaCA9IFhMT0dfUkhBU0godGlkKTsKKwkJdHJhbnMgPSB4bG9nX3JlY292ZXJfZmluZF90aWQocmhhc2hbaGFzaF0sIHRpZCk7CisJCWlmICh0cmFucyA9PSBOVUxMKSB7CQkgICAvKiBub3QgZm91bmQ7IGFkZCBuZXcgdGlkICovCisJCQlpZiAob2hlYWQtPm9oX2ZsYWdzICYgWExPR19TVEFSVF9UUkFOUykKKwkJCQl4bG9nX3JlY292ZXJfbmV3X3RpZCgmcmhhc2hbaGFzaF0sIHRpZCwKKwkJCQkJSU5UX0dFVChyaGVhZC0+aF9sc24sIEFSQ0hfQ09OVkVSVCkpOworCQl9IGVsc2UgeworCQkJQVNTRVJUKGRwK0lOVF9HRVQob2hlYWQtPm9oX2xlbiwgQVJDSF9DT05WRVJUKSA8PSBscCk7CisJCQlmbGFncyA9IG9oZWFkLT5vaF9mbGFncyAmIH5YTE9HX0VORF9UUkFOUzsKKwkJCWlmIChmbGFncyAmIFhMT0dfV0FTX0NPTlRfVFJBTlMpCisJCQkJZmxhZ3MgJj0gflhMT0dfQ09OVElOVUVfVFJBTlM7CisJCQlzd2l0Y2ggKGZsYWdzKSB7CisJCQljYXNlIFhMT0dfQ09NTUlUX1RSQU5TOgorCQkJCWVycm9yID0geGxvZ19yZWNvdmVyX2NvbW1pdF90cmFucyhsb2csCisJCQkJCQkmcmhhc2hbaGFzaF0sIHRyYW5zLCBwYXNzKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgWExPR19VTk1PVU5UX1RSQU5TOgorCQkJCWVycm9yID0geGxvZ19yZWNvdmVyX3VubW91bnRfdHJhbnModHJhbnMpOworCQkJCWJyZWFrOworCQkJY2FzZSBYTE9HX1dBU19DT05UX1RSQU5TOgorCQkJCWVycm9yID0geGxvZ19yZWNvdmVyX2FkZF90b19jb250X3RyYW5zKHRyYW5zLAorCQkJCQkJZHAsIElOVF9HRVQob2hlYWQtPm9oX2xlbiwKKwkJCQkJCQlBUkNIX0NPTlZFUlQpKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgWExPR19TVEFSVF9UUkFOUzoKKwkJCQl4bG9nX3dhcm4oCisJCQkiWEZTOiB4bG9nX3JlY292ZXJfcHJvY2Vzc19kYXRhOiBiYWQgdHJhbnNhY3Rpb24iKTsKKwkJCQlBU1NFUlQoMCk7CisJCQkJZXJyb3IgPSBYRlNfRVJST1IoRUlPKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMDoKKwkJCWNhc2UgWExPR19DT05USU5VRV9UUkFOUzoKKwkJCQllcnJvciA9IHhsb2dfcmVjb3Zlcl9hZGRfdG9fdHJhbnModHJhbnMsCisJCQkJCQlkcCwgSU5UX0dFVChvaGVhZC0+b2hfbGVuLAorCQkJCQkJCUFSQ0hfQ09OVkVSVCkpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQl4bG9nX3dhcm4oCisJCQkiWEZTOiB4bG9nX3JlY292ZXJfcHJvY2Vzc19kYXRhOiBiYWQgZmxhZyIpOworCQkJCUFTU0VSVCgwKTsKKwkJCQllcnJvciA9IFhGU19FUlJPUihFSU8pOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGVycm9yKQorCQkJCXJldHVybiBlcnJvcjsKKwkJfQorCQlkcCArPSBJTlRfR0VUKG9oZWFkLT5vaF9sZW4sIEFSQ0hfQ09OVkVSVCk7CisJCW51bV9sb2dvcHMtLTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQcm9jZXNzIGFuIGV4dGVudCBmcmVlIGludGVudCBpdGVtIHRoYXQgd2FzIHJlY292ZXJlZCBmcm9tCisgKiB0aGUgbG9nLiAgV2UgbmVlZCB0byBmcmVlIHRoZSBleHRlbnRzIHRoYXQgaXQgZGVzY3JpYmVzLgorICovCitTVEFUSUMgdm9pZAoreGxvZ19yZWNvdmVyX3Byb2Nlc3NfZWZpKAorCXhmc19tb3VudF90CQkqbXAsCisJeGZzX2VmaV9sb2dfaXRlbV90CSplZmlwKQoreworCXhmc19lZmRfbG9nX2l0ZW1fdAkqZWZkcDsKKwl4ZnNfdHJhbnNfdAkJKnRwOworCWludAkJCWk7CisJeGZzX2V4dGVudF90CQkqZXh0cDsKKwl4ZnNfZnNibG9ja190CQlzdGFydGJsb2NrX2ZzYjsKKworCUFTU0VSVCghKGVmaXAtPmVmaV9mbGFncyAmIFhGU19FRklfUkVDT1ZFUkVEKSk7CisKKwkvKgorCSAqIEZpcnN0IGNoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgZXh0ZW50cyBkZXNjcmliZWQgYnkgdGhlCisJICogRUZJLiAgSWYgYW55IGFyZSBiYWQsIHRoZW4gYXNzdW1lIHRoYXQgYWxsIGFyZSBiYWQgYW5kCisJICoganVzdCB0b3NzIHRoZSBFRkkuCisJICovCisJZm9yIChpID0gMDsgaSA8IGVmaXAtPmVmaV9mb3JtYXQuZWZpX25leHRlbnRzOyBpKyspIHsKKwkJZXh0cCA9ICYoZWZpcC0+ZWZpX2Zvcm1hdC5lZmlfZXh0ZW50c1tpXSk7CisJCXN0YXJ0YmxvY2tfZnNiID0gWEZTX0JCX1RPX0ZTQihtcCwKKwkJCQkgICBYRlNfRlNCX1RPX0RBRERSKG1wLCBleHRwLT5leHRfc3RhcnQpKTsKKwkJaWYgKChzdGFydGJsb2NrX2ZzYiA9PSAwKSB8fAorCQkgICAgKGV4dHAtPmV4dF9sZW4gPT0gMCkgfHwKKwkJICAgIChzdGFydGJsb2NrX2ZzYiA+PSBtcC0+bV9zYi5zYl9kYmxvY2tzKSB8fAorCQkgICAgKGV4dHAtPmV4dF9sZW4gPj0gbXAtPm1fc2Iuc2JfYWdibG9ja3MpKSB7CisJCQkvKgorCQkJICogVGhpcyB3aWxsIHB1bGwgdGhlIEVGSSBmcm9tIHRoZSBBSUwgYW5kCisJCQkgKiBmcmVlIHRoZSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIGl0LgorCQkJICovCisJCQl4ZnNfZWZpX3JlbGVhc2UoZWZpcCwgZWZpcC0+ZWZpX2Zvcm1hdC5lZmlfbmV4dGVudHMpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIDApOworCXhmc190cmFuc19yZXNlcnZlKHRwLCAwLCBYRlNfSVRSVU5DQVRFX0xPR19SRVMobXApLCAwLCAwLCAwKTsKKwllZmRwID0geGZzX3RyYW5zX2dldF9lZmQodHAsIGVmaXAsIGVmaXAtPmVmaV9mb3JtYXQuZWZpX25leHRlbnRzKTsKKworCWZvciAoaSA9IDA7IGkgPCBlZmlwLT5lZmlfZm9ybWF0LmVmaV9uZXh0ZW50czsgaSsrKSB7CisJCWV4dHAgPSAmKGVmaXAtPmVmaV9mb3JtYXQuZWZpX2V4dGVudHNbaV0pOworCQl4ZnNfZnJlZV9leHRlbnQodHAsIGV4dHAtPmV4dF9zdGFydCwgZXh0cC0+ZXh0X2xlbik7CisJCXhmc190cmFuc19sb2dfZWZkX2V4dGVudCh0cCwgZWZkcCwgZXh0cC0+ZXh0X3N0YXJ0LAorCQkJCQkgZXh0cC0+ZXh0X2xlbik7CisJfQorCisJZWZpcC0+ZWZpX2ZsYWdzIHw9IFhGU19FRklfUkVDT1ZFUkVEOworCXhmc190cmFuc19jb21taXQodHAsIDAsIE5VTEwpOworfQorCisvKgorICogVmVyaWZ5IHRoYXQgb25jZSB3ZSd2ZSBlbmNvdW50ZXJlZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBhbiBFRkkKKyAqIGluIHRoZSBBSUwgdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSBFRklzIGluIHRoZSBBSUwuCisgKi8KKyNpZiBkZWZpbmVkKERFQlVHKQorU1RBVElDIHZvaWQKK3hsb2dfcmVjb3Zlcl9jaGVja19haWwoCisJeGZzX21vdW50X3QJCSptcCwKKwl4ZnNfbG9nX2l0ZW1fdAkJKmxpcCwKKwlpbnQJCQlnZW4pCit7CisJaW50CQkJb3JpZ19nZW4gPSBnZW47CisKKwlkbyB7CisJCUFTU0VSVChsaXAtPmxpX3R5cGUgIT0gWEZTX0xJX0VGSSk7CisJCWxpcCA9IHhmc190cmFuc19uZXh0X2FpbChtcCwgbGlwLCAmZ2VuLCBOVUxMKTsKKwkJLyoKKwkJICogVGhlIGNoZWNrIHdpbGwgYmUgYm9ndXMgaWYgd2UgcmVzdGFydCBmcm9tIHRoZQorCQkgKiBiZWdpbm5pbmcgb2YgdGhlIEFJTCwgc28gQVNTRVJUIHRoYXQgd2UgZG9uJ3QuCisJCSAqIFdlIG5ldmVyIHNob3VsZCBzaW5jZSB3ZSdyZSBob2xkaW5nIHRoZSBBSUwgbG9jaworCQkgKiB0aGUgZW50aXJlIHRpbWUuCisJCSAqLworCQlBU1NFUlQoZ2VuID09IG9yaWdfZ2VuKTsKKwl9IHdoaWxlIChsaXAgIT0gTlVMTCk7Cit9CisjZW5kaWYJLyogREVCVUcgKi8KKworLyoKKyAqIFdoZW4gdGhpcyBpcyBjYWxsZWQsIGFsbCBvZiB0aGUgRUZJcyB3aGljaCBkaWQgbm90IGhhdmUKKyAqIGNvcnJlc3BvbmRpbmcgRUZEcyBzaG91bGQgYmUgaW4gdGhlIEFJTC4gIFdoYXQgd2UgZG8gbm93CisgKiBpcyBmcmVlIHRoZSBleHRlbnRzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIG9uZS4KKyAqCisgKiBTaW5jZSB3ZSBwcm9jZXNzIHRoZSBFRklzIGluIG5vcm1hbCB0cmFuc2FjdGlvbnMsIHRoZXkKKyAqIHdpbGwgYmUgcmVtb3ZlZCBhdCBzb21lIHBvaW50IGFmdGVyIHRoZSBjb21taXQuICBUaGlzIHByZXZlbnRzCisgKiB1cyBmcm9tIGp1c3Qgd2Fsa2luZyBkb3duIHRoZSBsaXN0IHByb2Nlc3NpbmcgZWFjaCBvbmUuCisgKiBXZSdsbCB1c2UgYSBmbGFnIGluIHRoZSBFRkkgdG8gc2tpcCB0aG9zZSB0aGF0IHdlJ3ZlIGFscmVhZHkKKyAqIHByb2Nlc3NlZCBhbmQgdXNlIHRoZSBBSUwgaXRlcmF0aW9uIG1lY2hhbmlzbSdzIGdlbmVyYXRpb24KKyAqIGNvdW50IHRvIHRyeSB0byBzcGVlZCB0aGlzIHVwIGF0IGxlYXN0IGEgYml0LgorICoKKyAqIFdoZW4gd2Ugc3RhcnQsIHdlIGtub3cgdGhhdCB0aGUgRUZJcyBhcmUgdGhlIG9ubHkgdGhpbmdzIGluCisgKiB0aGUgQUlMLiAgQXMgd2UgcHJvY2VzcyB0aGVtLCBob3dldmVyLCBvdGhlciBpdGVtcyBhcmUgYWRkZWQKKyAqIHRvIHRoZSBBSUwuICBTaW5jZSBldmVyeXRoaW5nIGFkZGVkIHRvIHRoZSBBSUwgbXVzdCBjb21lIGFmdGVyCisgKiBldmVyeXRoaW5nIGFscmVhZHkgaW4gdGhlIEFJTCwgd2Ugc3RvcCBwcm9jZXNzaW5nIGFzIHNvb24gYXMKKyAqIHdlIHNlZSBzb21ldGhpbmcgb3RoZXIgdGhhbiBhbiBFRkkgaW4gdGhlIEFJTC4KKyAqLworU1RBVElDIHZvaWQKK3hsb2dfcmVjb3Zlcl9wcm9jZXNzX2VmaXMoCisJeGxvZ190CQkJKmxvZykKK3sKKwl4ZnNfbG9nX2l0ZW1fdAkJKmxpcDsKKwl4ZnNfZWZpX2xvZ19pdGVtX3QJKmVmaXA7CisJaW50CQkJZ2VuOworCXhmc19tb3VudF90CQkqbXA7CisJU1BMREVDTChzKTsKKworCW1wID0gbG9nLT5sX21wOworCUFJTF9MT0NLKG1wLHMpOworCisJbGlwID0geGZzX3RyYW5zX2ZpcnN0X2FpbChtcCwgJmdlbik7CisJd2hpbGUgKGxpcCAhPSBOVUxMKSB7CisJCS8qCisJCSAqIFdlJ3JlIGRvbmUgd2hlbiB3ZSBzZWUgc29tZXRoaW5nIG90aGVyIHRoYW4gYW4gRUZJLgorCQkgKi8KKwkJaWYgKGxpcC0+bGlfdHlwZSAhPSBYRlNfTElfRUZJKSB7CisJCQl4bG9nX3JlY292ZXJfY2hlY2tfYWlsKG1wLCBsaXAsIGdlbik7CisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIFNraXAgRUZJcyB0aGF0IHdlJ3ZlIGFscmVhZHkgcHJvY2Vzc2VkLgorCQkgKi8KKwkJZWZpcCA9ICh4ZnNfZWZpX2xvZ19pdGVtX3QgKilsaXA7CisJCWlmIChlZmlwLT5lZmlfZmxhZ3MgJiBYRlNfRUZJX1JFQ09WRVJFRCkgeworCQkJbGlwID0geGZzX3RyYW5zX25leHRfYWlsKG1wLCBsaXAsICZnZW4sIE5VTEwpOworCQkJY29udGludWU7CisJCX0KKworCQlBSUxfVU5MT0NLKG1wLCBzKTsKKwkJeGxvZ19yZWNvdmVyX3Byb2Nlc3NfZWZpKG1wLCBlZmlwKTsKKwkJQUlMX0xPQ0sobXAscyk7CisJCWxpcCA9IHhmc190cmFuc19uZXh0X2FpbChtcCwgbGlwLCAmZ2VuLCBOVUxMKTsKKwl9CisJQUlMX1VOTE9DSyhtcCwgcyk7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgcGVyZm9ybXMgYSB0cmFuc2FjdGlvbiB0byBudWxsIG91dCBhIGJhZCBpbm9kZSBwb2ludGVyCisgKiBpbiBhbiBhZ2kgdW5saW5rZWQgaW5vZGUgaGFzaCBidWNrZXQuCisgKi8KK1NUQVRJQyB2b2lkCit4bG9nX3JlY292ZXJfY2xlYXJfYWdpX2J1Y2tldCgKKwl4ZnNfbW91bnRfdAkqbXAsCisJeGZzX2FnbnVtYmVyX3QJYWdubywKKwlpbnQJCWJ1Y2tldCkKK3sKKwl4ZnNfdHJhbnNfdAkqdHA7CisJeGZzX2FnaV90CSphZ2k7CisJeGZzX2J1Zl90CSphZ2licDsKKwlpbnQJCW9mZnNldDsKKwlpbnQJCWVycm9yOworCisJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19DTEVBUl9BR0lfQlVDS0VUKTsKKwl4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgMCwgWEZTX0NMRUFSX0FHSV9CVUNLRVRfTE9HX1JFUyhtcCksIDAsIDAsIDApOworCisJZXJyb3IgPSB4ZnNfdHJhbnNfcmVhZF9idWYobXAsIHRwLCBtcC0+bV9kZGV2X3RhcmdwLAorCQkJCSAgIFhGU19BR19EQUREUihtcCwgYWdubywgWEZTX0FHSV9EQUREUihtcCkpLAorCQkJCSAgIFhGU19GU1NfVE9fQkIobXAsIDEpLCAwLCAmYWdpYnApOworCWlmIChlcnJvcikgeworCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCBYRlNfVFJBTlNfQUJPUlQpOworCQlyZXR1cm47CisJfQorCisJYWdpID0gWEZTX0JVRl9UT19BR0koYWdpYnApOworCWlmIChJTlRfR0VUKGFnaS0+YWdpX21hZ2ljbnVtLCBBUkNIX0NPTlZFUlQpICE9IFhGU19BR0lfTUFHSUMpIHsKKwkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgWEZTX1RSQU5TX0FCT1JUKTsKKwkJcmV0dXJuOworCX0KKwlBU1NFUlQoSU5UX0dFVChhZ2ktPmFnaV9tYWdpY251bSwgQVJDSF9DT05WRVJUKSA9PSBYRlNfQUdJX01BR0lDKTsKKworCUlOVF9TRVQoYWdpLT5hZ2lfdW5saW5rZWRbYnVja2V0XSwgQVJDSF9DT05WRVJULCBOVUxMQUdJTk8pOworCW9mZnNldCA9IG9mZnNldG9mKHhmc19hZ2lfdCwgYWdpX3VubGlua2VkKSArCisJCSAoc2l6ZW9mKHhmc19hZ2lub190KSAqIGJ1Y2tldCk7CisJeGZzX3RyYW5zX2xvZ19idWYodHAsIGFnaWJwLCBvZmZzZXQsCisJCQkgIChvZmZzZXQgKyBzaXplb2YoeGZzX2FnaW5vX3QpIC0gMSkpOworCisJKHZvaWQpIHhmc190cmFuc19jb21taXQodHAsIDAsIE5VTEwpOworfQorCisvKgorICogeGxvZ19pdW5saW5rX3JlY292ZXIKKyAqCisgKiBUaGlzIGlzIGNhbGxlZCBkdXJpbmcgcmVjb3ZlcnkgdG8gcHJvY2VzcyBhbnkgaW5vZGVzIHdoaWNoCisgKiB3ZSB1bmxpbmtlZCBidXQgbm90IGZyZWVkIHdoZW4gdGhlIHN5c3RlbSBjcmFzaGVkLiAgVGhlc2UKKyAqIGlub2RlcyB3aWxsIGJlIG9uIHRoZSBsaXN0cyBpbiB0aGUgQUdJIGJsb2Nrcy4gIFdoYXQgd2UgZG8KKyAqIGhlcmUgaXMgc2NhbiBhbGwgdGhlIEFHSXMgYW5kIGZ1bGx5IHRydW5jYXRlIGFuZCBmcmVlIGFueQorICogaW5vZGVzIGZvdW5kIG9uIHRoZSBsaXN0cy4gIEVhY2ggaW5vZGUgaXMgcmVtb3ZlZCBmcm9tIHRoZQorICogbGlzdHMgd2hlbiBpdCBoYXMgYmVlbiBmdWxseSB0cnVuY2F0ZWQgYW5kIGlzIGZyZWVkLiAgVGhlCisgKiBmcmVlaW5nIG9mIHRoZSBpbm9kZSBhbmQgaXRzIHJlbW92YWwgZnJvbSB0aGUgbGlzdCBtdXN0IGJlCisgKiBhdG9taWMuCisgKi8KK3ZvaWQKK3hsb2dfcmVjb3Zlcl9wcm9jZXNzX2l1bmxpbmtzKAorCXhsb2dfdAkJKmxvZykKK3sKKwl4ZnNfbW91bnRfdAkqbXA7CisJeGZzX2FnbnVtYmVyX3QJYWdubzsKKwl4ZnNfYWdpX3QJKmFnaTsKKwl4ZnNfYnVmX3QJKmFnaWJwOworCXhmc19idWZfdAkqaWJwOworCXhmc19kaW5vZGVfdAkqZGlwOworCXhmc19pbm9kZV90CSppcDsKKwl4ZnNfYWdpbm9fdAlhZ2lubzsKKwl4ZnNfaW5vX3QJaW5vOworCWludAkJYnVja2V0OworCWludAkJZXJyb3I7CisJdWludAkJbXBfZG1ldm1hc2s7CisKKwltcCA9IGxvZy0+bF9tcDsKKworCS8qCisJICogUHJldmVudCBhbnkgRE1BUEkgZXZlbnQgZnJvbSBiZWluZyBzZW50IHdoaWxlIGluIHRoaXMgZnVuY3Rpb24uCisJICovCisJbXBfZG1ldm1hc2sgPSBtcC0+bV9kbWV2bWFzazsKKwltcC0+bV9kbWV2bWFzayA9IDA7CisKKwlmb3IgKGFnbm8gPSAwOyBhZ25vIDwgbXAtPm1fc2Iuc2JfYWdjb3VudDsgYWdubysrKSB7CisJCS8qCisJCSAqIEZpbmQgdGhlIGFnaSBmb3IgdGhpcyBhZy4KKwkJICovCisJCWFnaWJwID0geGZzX2J1Zl9yZWFkKG1wLT5tX2RkZXZfdGFyZ3AsCisJCQkJWEZTX0FHX0RBRERSKG1wLCBhZ25vLCBYRlNfQUdJX0RBRERSKG1wKSksCisJCQkJWEZTX0ZTU19UT19CQihtcCwgMSksIDApOworCQlpZiAoWEZTX0JVRl9JU0VSUk9SKGFnaWJwKSkgeworCQkJeGZzX2lvZXJyb3JfYWxlcnQoInhsb2dfcmVjb3Zlcl9wcm9jZXNzX2l1bmxpbmtzKCMxKSIsCisJCQkJbG9nLT5sX21wLCBhZ2licCwKKwkJCQlYRlNfQUdfREFERFIobXAsIGFnbm8sIFhGU19BR0lfREFERFIobXApKSk7CisJCX0KKwkJYWdpID0gWEZTX0JVRl9UT19BR0koYWdpYnApOworCQlBU1NFUlQoWEZTX0FHSV9NQUdJQyA9PQorCQkJSU5UX0dFVChhZ2ktPmFnaV9tYWdpY251bSwgQVJDSF9DT05WRVJUKSk7CisKKwkJZm9yIChidWNrZXQgPSAwOyBidWNrZXQgPCBYRlNfQUdJX1VOTElOS0VEX0JVQ0tFVFM7IGJ1Y2tldCsrKSB7CisKKwkJCWFnaW5vID0gSU5UX0dFVChhZ2ktPmFnaV91bmxpbmtlZFtidWNrZXRdLCBBUkNIX0NPTlZFUlQpOworCQkJd2hpbGUgKGFnaW5vICE9IE5VTExBR0lOTykgeworCisJCQkJLyoKKwkJCQkgKiBSZWxlYXNlIHRoZSBhZ2kgYnVmZmVyIHNvIHRoYXQgaXQgY2FuCisJCQkJICogYmUgYWNxdWlyZWQgaW4gdGhlIG5vcm1hbCBjb3Vyc2Ugb2YgdGhlCisJCQkJICogdHJhbnNhY3Rpb24gdG8gdHJ1bmNhdGUgYW5kIGZyZWUgdGhlIGlub2RlLgorCQkJCSAqLworCQkJCXhmc19idWZfcmVsc2UoYWdpYnApOworCisJCQkJaW5vID0gWEZTX0FHSU5PX1RPX0lOTyhtcCwgYWdubywgYWdpbm8pOworCQkJCWVycm9yID0geGZzX2lnZXQobXAsIE5VTEwsIGlubywgMCwgMCwgJmlwLCAwKTsKKwkJCQlBU1NFUlQoZXJyb3IgfHwgKGlwICE9IE5VTEwpKTsKKworCQkJCWlmICghZXJyb3IpIHsKKwkJCQkJLyoKKwkJCQkJICogR2V0IHRoZSBvbiBkaXNrIGlub2RlIHRvIGZpbmQgdGhlCisJCQkJCSAqIG5leHQgaW5vZGUgaW4gdGhlIGJ1Y2tldC4KKwkJCQkJICovCisJCQkJCWVycm9yID0geGZzX2l0b2JwKG1wLCBOVUxMLCBpcCwgJmRpcCwKKwkJCQkJCQkmaWJwLCAwKTsKKwkJCQkJQVNTRVJUKGVycm9yIHx8IChkaXAgIT0gTlVMTCkpOworCQkJCX0KKworCQkJCWlmICghZXJyb3IpIHsKKwkJCQkJQVNTRVJUKGlwLT5pX2QuZGlfbmxpbmsgPT0gMCk7CisKKwkJCQkJLyogc2V0dXAgZm9yIHRoZSBuZXh0IHBhc3MgKi8KKwkJCQkJYWdpbm8gPSBJTlRfR0VUKGRpcC0+ZGlfbmV4dF91bmxpbmtlZCwKKwkJCQkJCQlBUkNIX0NPTlZFUlQpOworCQkJCQl4ZnNfYnVmX3JlbHNlKGlicCk7CisJCQkJCS8qCisJCQkJCSAqIFByZXZlbnQgYW55IERNQVBJIGV2ZW50IGZyb20KKwkJCQkJICogYmVpbmcgc2VudCB3aGVuIHRoZQorCQkJCQkgKiByZWZlcmVuY2Ugb24gdGhlIGlub2RlIGlzCisJCQkJCSAqIGRyb3BwZWQuCisJCQkJCSAqLworCQkJCQlpcC0+aV9kLmRpX2RtZXZtYXNrID0gMDsKKworCQkJCQkvKgorCQkJCQkgKiBJZiB0aGlzIGlzIGEgbmV3IGlub2RlLCBoYW5kbGUKKwkJCQkJICogaXQgc3BlY2lhbGx5LiAgT3RoZXJ3aXNlLAorCQkJCQkgKiBqdXN0IGRyb3Agb3VyIHJlZmVyZW5jZSB0byB0aGUKKwkJCQkJICogaW5vZGUuICBJZiB0aGVyZSBhcmUgbm8KKwkJCQkJICogb3RoZXIgcmVmZXJlbmNlcywgdGhpcyB3aWxsCisJCQkJCSAqIHNlbmQgdGhlIGlub2RlIHRvCisJCQkJCSAqIHhmc19pbmFjdGl2ZSgpIHdoaWNoIHdpbGwKKwkJCQkJICogdHJ1bmNhdGUgdGhlIGZpbGUgYW5kIGZyZWUKKwkJCQkJICogdGhlIGlub2RlLgorCQkJCQkgKi8KKwkJCQkJaWYgKGlwLT5pX2QuZGlfbW9kZSA9PSAwKQorCQkJCQkJeGZzX2lwdXRfbmV3KGlwLCAwKTsKKwkJCQkJZWxzZQorCQkJCQkJVk5fUkVMRShYRlNfSVRPVihpcCkpOworCQkJCX0gZWxzZSB7CisJCQkJCS8qCisJCQkJCSAqIFdlIGNhbid0IHJlYWQgaW4gdGhlIGlub2RlCisJCQkJCSAqIHRoaXMgYnVja2V0IHBvaW50cyB0bywgb3IKKwkJCQkJICogdGhpcyBpbm9kZSBpcyBtZXNzZWQgdXAuICBKdXN0CisJCQkJCSAqIGRpdGNoIHRoaXMgYnVja2V0IG9mIGlub2Rlcy4gIFdlCisJCQkJCSAqIHdpbGwgbG9zZSBzb21lIGlub2RlcyBhbmQgc3BhY2UsCisJCQkJCSAqIGJ1dCBhdCBsZWFzdCB3ZSB3b24ndCBoYW5nLiAgQ2FsbAorCQkJCQkgKiB4bG9nX3JlY292ZXJfY2xlYXJfYWdpX2J1Y2tldCgpCisJCQkJCSAqIHRvIHBlcmZvcm0gYSB0cmFuc2FjdGlvbiB0byBjbGVhcgorCQkJCQkgKiB0aGUgaW5vZGUgcG9pbnRlciBpbiB0aGUgYnVja2V0LgorCQkJCQkgKi8KKwkJCQkJeGxvZ19yZWNvdmVyX2NsZWFyX2FnaV9idWNrZXQobXAsIGFnbm8sCisJCQkJCQkJYnVja2V0KTsKKworCQkJCQlhZ2lubyA9IE5VTExBR0lOTzsKKwkJCQl9CisKKwkJCQkvKgorCQkJCSAqIFJlYWNxdWlyZSB0aGUgYWdpYnVmZmVyIGFuZCBjb250aW51ZSBhcm91bmQKKwkJCQkgKiB0aGUgbG9vcC4KKwkJCQkgKi8KKwkJCQlhZ2licCA9IHhmc19idWZfcmVhZChtcC0+bV9kZGV2X3RhcmdwLAorCQkJCQkJWEZTX0FHX0RBRERSKG1wLCBhZ25vLAorCQkJCQkJCVhGU19BR0lfREFERFIobXApKSwKKwkJCQkJCVhGU19GU1NfVE9fQkIobXAsIDEpLCAwKTsKKwkJCQlpZiAoWEZTX0JVRl9JU0VSUk9SKGFnaWJwKSkgeworCQkJCQl4ZnNfaW9lcnJvcl9hbGVydCgKKwkJCQkieGxvZ19yZWNvdmVyX3Byb2Nlc3NfaXVubGlua3MoIzIpIiwKKwkJCQkJCWxvZy0+bF9tcCwgYWdpYnAsCisJCQkJCQlYRlNfQUdfREFERFIobXAsIGFnbm8sCisJCQkJCQkJWEZTX0FHSV9EQUREUihtcCkpKTsKKwkJCQl9CisJCQkJYWdpID0gWEZTX0JVRl9UT19BR0koYWdpYnApOworCQkJCUFTU0VSVChYRlNfQUdJX01BR0lDID09IElOVF9HRVQoCisJCQkJCWFnaS0+YWdpX21hZ2ljbnVtLCBBUkNIX0NPTlZFUlQpKTsKKwkJCX0KKwkJfQorCisJCS8qCisJCSAqIFJlbGVhc2UgdGhlIGJ1ZmZlciBmb3IgdGhlIGN1cnJlbnQgYWdpIHNvIHdlIGNhbgorCQkgKiBnbyBvbiB0byB0aGUgbmV4dCBvbmUuCisJCSAqLworCQl4ZnNfYnVmX3JlbHNlKGFnaWJwKTsKKwl9CisKKwltcC0+bV9kbWV2bWFzayA9IG1wX2RtZXZtYXNrOworfQorCisKKyNpZmRlZiBERUJVRworU1RBVElDIHZvaWQKK3hsb2dfcGFja19kYXRhX2NoZWNrc3VtKAorCXhsb2dfdAkJKmxvZywKKwl4bG9nX2luX2NvcmVfdAkqaWNsb2csCisJaW50CQlzaXplKQoreworCWludAkJaTsKKwl1aW50CQkqdXA7CisJdWludAkJY2hrc3VtID0gMDsKKworCXVwID0gKHVpbnQgKilpY2xvZy0+aWNfZGF0YXA7CisJLyogZGl2aWRlIGxlbmd0aCBieSA0IHRvIGdldCAjIHdvcmRzICovCisJZm9yIChpID0gMDsgaSA8IChzaXplID4+IDIpOyBpKyspIHsKKwkJY2hrc3VtIF49IElOVF9HRVQoKnVwLCBBUkNIX0NPTlZFUlQpOworCQl1cCsrOworCX0KKwlJTlRfU0VUKGljbG9nLT5pY19oZWFkZXIuaF9jaGtzdW0sIEFSQ0hfQ09OVkVSVCwgY2hrc3VtKTsKK30KKyNlbHNlCisjZGVmaW5lIHhsb2dfcGFja19kYXRhX2NoZWNrc3VtKGxvZywgaWNsb2csIHNpemUpCisjZW5kaWYKKworLyoKKyAqIFN0YW1wIGN5Y2xlIG51bWJlciBpbiBldmVyeSBibG9jaworICovCit2b2lkCit4bG9nX3BhY2tfZGF0YSgKKwl4bG9nX3QJCQkqbG9nLAorCXhsb2dfaW5fY29yZV90CQkqaWNsb2csCisJaW50CQkJcm91bmRvZmYpCit7CisJaW50CQkJaSwgaiwgazsKKwlpbnQJCQlzaXplID0gaWNsb2ctPmljX29mZnNldCArIHJvdW5kb2ZmOworCXVpbnQJCQljeWNsZV9sc247CisJeGZzX2NhZGRyX3QJCWRwOworCXhsb2dfaW5fY29yZV8yX3QJKnhoZHI7CisKKwl4bG9nX3BhY2tfZGF0YV9jaGVja3N1bShsb2csIGljbG9nLCBzaXplKTsKKworCWN5Y2xlX2xzbiA9IENZQ0xFX0xTTl9ESVNLKGljbG9nLT5pY19oZWFkZXIuaF9sc24pOworCisJZHAgPSBpY2xvZy0+aWNfZGF0YXA7CisJZm9yIChpID0gMDsgaSA8IEJUT0JCKHNpemUpICYmCisJCWkgPCAoWExPR19IRUFERVJfQ1lDTEVfU0laRSAvIEJCU0laRSk7IGkrKykgeworCQlpY2xvZy0+aWNfaGVhZGVyLmhfY3ljbGVfZGF0YVtpXSA9ICoodWludCAqKWRwOworCQkqKHVpbnQgKilkcCA9IGN5Y2xlX2xzbjsKKwkJZHAgKz0gQkJTSVpFOworCX0KKworCWlmIChYRlNfU0JfVkVSU0lPTl9IQVNMT0dWMigmbG9nLT5sX21wLT5tX3NiKSkgeworCQl4aGRyID0gKHhsb2dfaW5fY29yZV8yX3QgKikmaWNsb2ctPmljX2hlYWRlcjsKKwkJZm9yICggOyBpIDwgQlRPQkIoc2l6ZSk7IGkrKykgeworCQkJaiA9IGkgLyAoWExPR19IRUFERVJfQ1lDTEVfU0laRSAvIEJCU0laRSk7CisJCQlrID0gaSAlIChYTE9HX0hFQURFUl9DWUNMRV9TSVpFIC8gQkJTSVpFKTsKKwkJCXhoZHJbal0uaGljX3hoZWFkZXIueGhfY3ljbGVfZGF0YVtrXSA9ICoodWludCAqKWRwOworCQkJKih1aW50ICopZHAgPSBjeWNsZV9sc247CisJCQlkcCArPSBCQlNJWkU7CisJCX0KKworCQlmb3IgKGkgPSAxOyBpIDwgbG9nLT5sX2ljbG9nX2hlYWRzOyBpKyspIHsKKwkJCXhoZHJbaV0uaGljX3hoZWFkZXIueGhfY3ljbGUgPSBjeWNsZV9sc247CisJCX0KKwl9Cit9CisKKyNpZiBkZWZpbmVkKERFQlVHKSAmJiBkZWZpbmVkKFhGU19MT1VEX1JFQ09WRVJZKQorU1RBVElDIHZvaWQKK3hsb2dfdW5wYWNrX2RhdGFfY2hlY2tzdW0oCisJeGxvZ19yZWNfaGVhZGVyX3QJKnJoZWFkLAorCXhmc19jYWRkcl90CQlkcCwKKwl4bG9nX3QJCQkqbG9nKQoreworCXVpbnQJCQkqdXAgPSAodWludCAqKWRwOworCXVpbnQJCQljaGtzdW0gPSAwOworCWludAkJCWk7CisKKwkvKiBkaXZpZGUgbGVuZ3RoIGJ5IDQgdG8gZ2V0ICMgd29yZHMgKi8KKwlmb3IgKGk9MDsgaSA8IElOVF9HRVQocmhlYWQtPmhfbGVuLCBBUkNIX0NPTlZFUlQpID4+IDI7IGkrKykgeworCQljaGtzdW0gXj0gSU5UX0dFVCgqdXAsIEFSQ0hfQ09OVkVSVCk7CisJCXVwKys7CisJfQorCWlmIChjaGtzdW0gIT0gSU5UX0dFVChyaGVhZC0+aF9jaGtzdW0sIEFSQ0hfQ09OVkVSVCkpIHsKKwkgICAgaWYgKHJoZWFkLT5oX2Noa3N1bSB8fAorCQkoKGxvZy0+bF9mbGFncyAmIFhMT0dfQ0hLU1VNX01JU01BVENIKSA9PSAwKSkgeworCQkgICAgY21uX2VycihDRV9ERUJVRywKKwkJCSJYRlM6IExvZ1IgY2hrc3VtIG1pc21hdGNoOiB3YXMgKDB4JXgpIGlzICgweCV4KSIsCisJCQkgICAgSU5UX0dFVChyaGVhZC0+aF9jaGtzdW0sIEFSQ0hfQ09OVkVSVCksIGNoa3N1bSk7CisJCSAgICBjbW5fZXJyKENFX0RFQlVHLAorIlhGUzogRGlzcmVnYXJkIG1lc3NhZ2UgaWYgZmlsZXN5c3RlbSB3YXMgY3JlYXRlZCB3aXRoIG5vbi1ERUJVRyBrZXJuZWwiKTsKKwkJICAgIGlmIChYRlNfU0JfVkVSU0lPTl9IQVNMT0dWMigmbG9nLT5sX21wLT5tX3NiKSkgeworCQkJICAgIGNtbl9lcnIoQ0VfREVCVUcsCisJCQkJIlhGUzogTG9nUiB0aGlzIGlzIGEgTG9nVjIgZmlsZXN5c3RlbSIpOworCQkgICAgfQorCQkgICAgbG9nLT5sX2ZsYWdzIHw9IFhMT0dfQ0hLU1VNX01JU01BVENIOworCSAgICB9CisJfQorfQorI2Vsc2UKKyNkZWZpbmUgeGxvZ191bnBhY2tfZGF0YV9jaGVja3N1bShyaGVhZCwgZHAsIGxvZykKKyNlbmRpZgorCitTVEFUSUMgdm9pZAoreGxvZ191bnBhY2tfZGF0YSgKKwl4bG9nX3JlY19oZWFkZXJfdAkqcmhlYWQsCisJeGZzX2NhZGRyX3QJCWRwLAorCXhsb2dfdAkJCSpsb2cpCit7CisJaW50CQkJaSwgaiwgazsKKwl4bG9nX2luX2NvcmVfMl90CSp4aGRyOworCisJZm9yIChpID0gMDsgaSA8IEJUT0JCKElOVF9HRVQocmhlYWQtPmhfbGVuLCBBUkNIX0NPTlZFUlQpKSAmJgorCQkgIGkgPCAoWExPR19IRUFERVJfQ1lDTEVfU0laRSAvIEJCU0laRSk7IGkrKykgeworCQkqKHVpbnQgKilkcCA9ICoodWludCAqKSZyaGVhZC0+aF9jeWNsZV9kYXRhW2ldOworCQlkcCArPSBCQlNJWkU7CisJfQorCisJaWYgKFhGU19TQl9WRVJTSU9OX0hBU0xPR1YyKCZsb2ctPmxfbXAtPm1fc2IpKSB7CisJCXhoZHIgPSAoeGxvZ19pbl9jb3JlXzJfdCAqKXJoZWFkOworCQlmb3IgKCA7IGkgPCBCVE9CQihJTlRfR0VUKHJoZWFkLT5oX2xlbiwgQVJDSF9DT05WRVJUKSk7IGkrKykgeworCQkJaiA9IGkgLyAoWExPR19IRUFERVJfQ1lDTEVfU0laRSAvIEJCU0laRSk7CisJCQlrID0gaSAlIChYTE9HX0hFQURFUl9DWUNMRV9TSVpFIC8gQkJTSVpFKTsKKwkJCSoodWludCAqKWRwID0geGhkcltqXS5oaWNfeGhlYWRlci54aF9jeWNsZV9kYXRhW2tdOworCQkJZHAgKz0gQkJTSVpFOworCQl9CisJfQorCisJeGxvZ191bnBhY2tfZGF0YV9jaGVja3N1bShyaGVhZCwgZHAsIGxvZyk7Cit9CisKK1NUQVRJQyBpbnQKK3hsb2dfdmFsaWRfcmVjX2hlYWRlcigKKwl4bG9nX3QJCQkqbG9nLAorCXhsb2dfcmVjX2hlYWRlcl90CSpyaGVhZCwKKwl4ZnNfZGFkZHJfdAkJYmxrbm8pCit7CisJaW50CQkJaGxlbjsKKworCWlmICh1bmxpa2VseSgKKwkgICAgKElOVF9HRVQocmhlYWQtPmhfbWFnaWNubywgQVJDSF9DT05WRVJUKSAhPQorCQkJWExPR19IRUFERVJfTUFHSUNfTlVNKSkpIHsKKwkJWEZTX0VSUk9SX1JFUE9SVCgieGxvZ192YWxpZF9yZWNfaGVhZGVyKDEpIiwKKwkJCQlYRlNfRVJSTEVWRUxfTE9XLCBsb2ctPmxfbXApOworCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJfQorCWlmICh1bmxpa2VseSgKKwkgICAgKCFyaGVhZC0+aF92ZXJzaW9uIHx8CisJICAgIChJTlRfR0VUKHJoZWFkLT5oX3ZlcnNpb24sIEFSQ0hfQ09OVkVSVCkgJgorCQkJKH5YTE9HX1ZFUlNJT05fT0tCSVRTKSkgIT0gMCkpKSB7CisJCXhsb2dfd2FybigiWEZTOiAlczogdW5yZWNvZ25pc2VkIGxvZyB2ZXJzaW9uICglZCkuIiwKKwkJCV9fRlVOQ1RJT05fXywgSU5UX0dFVChyaGVhZC0+aF92ZXJzaW9uLCBBUkNIX0NPTlZFUlQpKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCX0KKworCS8qIExSIGJvZHkgbXVzdCBoYXZlIGRhdGEgb3IgaXQgd291bGRuJ3QgaGF2ZSBiZWVuIHdyaXR0ZW4gKi8KKwlobGVuID0gSU5UX0dFVChyaGVhZC0+aF9sZW4sIEFSQ0hfQ09OVkVSVCk7CisJaWYgKHVubGlrZWx5KCBobGVuIDw9IDAgfHwgaGxlbiA+IElOVF9NQVggKSkgeworCQlYRlNfRVJST1JfUkVQT1JUKCJ4bG9nX3ZhbGlkX3JlY19oZWFkZXIoMikiLAorCQkJCVhGU19FUlJMRVZFTF9MT1csIGxvZy0+bF9tcCk7CisJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwl9CisJaWYgKHVubGlrZWx5KCBibGtubyA+IGxvZy0+bF9sb2dCQnNpemUgfHwgYmxrbm8gPiBJTlRfTUFYICkpIHsKKwkJWEZTX0VSUk9SX1JFUE9SVCgieGxvZ192YWxpZF9yZWNfaGVhZGVyKDMpIiwKKwkJCQlYRlNfRVJSTEVWRUxfTE9XLCBsb2ctPmxfbXApOworCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogUmVhZCB0aGUgbG9nIGZyb20gdGFpbCB0byBoZWFkIGFuZCBwcm9jZXNzIHRoZSBsb2cgcmVjb3JkcyBmb3VuZC4KKyAqIEhhbmRsZSB0aGUgdHdvIGNhc2VzIHdoZXJlIHRoZSB0YWlsIGFuZCBoZWFkIGFyZSBpbiB0aGUgc2FtZSBjeWNsZQorICogYW5kIHdoZXJlIHRoZSBhY3RpdmUgcG9ydGlvbiBvZiB0aGUgbG9nIHdyYXBzIGFyb3VuZCB0aGUgZW5kIG9mCisgKiB0aGUgcGh5c2ljYWwgbG9nIHNlcGFyYXRlbHkuICBUaGUgcGFzcyBwYXJhbWV0ZXIgaXMgcGFzc2VkIHRocm91Z2gKKyAqIHRvIHRoZSByb3V0aW5lcyBjYWxsZWQgdG8gcHJvY2VzcyB0aGUgZGF0YSBhbmQgaXMgbm90IGxvb2tlZCBhdAorICogaGVyZS4KKyAqLworU1RBVElDIGludAoreGxvZ19kb19yZWNvdmVyeV9wYXNzKAorCXhsb2dfdAkJCSpsb2csCisJeGZzX2RhZGRyX3QJCWhlYWRfYmxrLAorCXhmc19kYWRkcl90CQl0YWlsX2JsaywKKwlpbnQJCQlwYXNzKQoreworCXhsb2dfcmVjX2hlYWRlcl90CSpyaGVhZDsKKwl4ZnNfZGFkZHJfdAkJYmxrX25vOworCXhmc19jYWRkcl90CQlidWZhZGRyLCBvZmZzZXQ7CisJeGZzX2J1Zl90CQkqaGJwLCAqZGJwOworCWludAkJCWVycm9yID0gMCwgaF9zaXplOworCWludAkJCWJibGtzLCBzcGxpdF9iYmxrczsKKwlpbnQJCQloYmxrcywgc3BsaXRfaGJsa3MsIHdyYXBwZWRfaGJsa3M7CisJeGxvZ19yZWNvdmVyX3QJCSpyaGFzaFtYTE9HX1JIQVNIX1NJWkVdOworCisJQVNTRVJUKGhlYWRfYmxrICE9IHRhaWxfYmxrKTsKKworCS8qCisJICogUmVhZCB0aGUgaGVhZGVyIG9mIHRoZSB0YWlsIGJsb2NrIGFuZCBnZXQgdGhlIGljbG9nIGJ1ZmZlciBzaXplIGZyb20KKwkgKiBoX3NpemUuICBVc2UgdGhpcyB0byB0ZWxsIGhvdyBtYW55IHNlY3RvcnMgbWFrZSB1cCB0aGUgbG9nIGhlYWRlci4KKwkgKi8KKwlpZiAoWEZTX1NCX1ZFUlNJT05fSEFTTE9HVjIoJmxvZy0+bF9tcC0+bV9zYikpIHsKKwkJLyoKKwkJICogV2hlbiB1c2luZyB2YXJpYWJsZSBsZW5ndGggaWNsb2dzLCByZWFkIGZpcnN0IHNlY3RvciBvZgorCQkgKiBpY2xvZyBoZWFkZXIgYW5kIGV4dHJhY3QgdGhlIGhlYWRlciBzaXplIGZyb20gaXQuICBHZXQgYQorCQkgKiBuZXcgaGJwIHRoYXQgaXMgdGhlIGNvcnJlY3Qgc2l6ZS4KKwkJICovCisJCWhicCA9IHhsb2dfZ2V0X2JwKGxvZywgMSk7CisJCWlmICghaGJwKQorCQkJcmV0dXJuIEVOT01FTTsKKwkJaWYgKChlcnJvciA9IHhsb2dfYnJlYWQobG9nLCB0YWlsX2JsaywgMSwgaGJwKSkpCisJCQlnb3RvIGJyZWFkX2VycjE7CisJCW9mZnNldCA9IHhsb2dfYWxpZ24obG9nLCB0YWlsX2JsaywgMSwgaGJwKTsKKwkJcmhlYWQgPSAoeGxvZ19yZWNfaGVhZGVyX3QgKilvZmZzZXQ7CisJCWVycm9yID0geGxvZ192YWxpZF9yZWNfaGVhZGVyKGxvZywgcmhlYWQsIHRhaWxfYmxrKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBicmVhZF9lcnIxOworCQloX3NpemUgPSBJTlRfR0VUKHJoZWFkLT5oX3NpemUsIEFSQ0hfQ09OVkVSVCk7CisJCWlmICgoSU5UX0dFVChyaGVhZC0+aF92ZXJzaW9uLCBBUkNIX0NPTlZFUlQpCisJCQkJJiBYTE9HX1ZFUlNJT05fMikgJiYKKwkJICAgIChoX3NpemUgPiBYTE9HX0hFQURFUl9DWUNMRV9TSVpFKSkgeworCQkJaGJsa3MgPSBoX3NpemUgLyBYTE9HX0hFQURFUl9DWUNMRV9TSVpFOworCQkJaWYgKGhfc2l6ZSAlIFhMT0dfSEVBREVSX0NZQ0xFX1NJWkUpCisJCQkJaGJsa3MrKzsKKwkJCXhsb2dfcHV0X2JwKGhicCk7CisJCQloYnAgPSB4bG9nX2dldF9icChsb2csIGhibGtzKTsKKwkJfSBlbHNlIHsKKwkJCWhibGtzID0gMTsKKwkJfQorCX0gZWxzZSB7CisJCUFTU0VSVChsb2ctPmxfc2VjdGJiX2xvZyA9PSAwKTsKKwkJaGJsa3MgPSAxOworCQloYnAgPSB4bG9nX2dldF9icChsb2csIDEpOworCQloX3NpemUgPSBYTE9HX0JJR19SRUNPUkRfQlNJWkU7CisJfQorCisJaWYgKCFoYnApCisJCXJldHVybiBFTk9NRU07CisJZGJwID0geGxvZ19nZXRfYnAobG9nLCBCVE9CQihoX3NpemUpKTsKKwlpZiAoIWRicCkgeworCQl4bG9nX3B1dF9icChoYnApOworCQlyZXR1cm4gRU5PTUVNOworCX0KKworCW1lbXNldChyaGFzaCwgMCwgc2l6ZW9mKHJoYXNoKSk7CisJaWYgKHRhaWxfYmxrIDw9IGhlYWRfYmxrKSB7CisJCWZvciAoYmxrX25vID0gdGFpbF9ibGs7IGJsa19ubyA8IGhlYWRfYmxrOyApIHsKKwkJCWlmICgoZXJyb3IgPSB4bG9nX2JyZWFkKGxvZywgYmxrX25vLCBoYmxrcywgaGJwKSkpCisJCQkJZ290byBicmVhZF9lcnIyOworCQkJb2Zmc2V0ID0geGxvZ19hbGlnbihsb2csIGJsa19ubywgaGJsa3MsIGhicCk7CisJCQlyaGVhZCA9ICh4bG9nX3JlY19oZWFkZXJfdCAqKW9mZnNldDsKKwkJCWVycm9yID0geGxvZ192YWxpZF9yZWNfaGVhZGVyKGxvZywgcmhlYWQsIGJsa19ubyk7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBicmVhZF9lcnIyOworCisJCQkvKiBibG9ja3MgaW4gZGF0YSBzZWN0aW9uICovCisJCQliYmxrcyA9IChpbnQpQlRPQkIoSU5UX0dFVChyaGVhZC0+aF9sZW4sIEFSQ0hfQ09OVkVSVCkpOworCQkJZXJyb3IgPSB4bG9nX2JyZWFkKGxvZywgYmxrX25vICsgaGJsa3MsIGJibGtzLCBkYnApOworCQkJaWYgKGVycm9yKQorCQkJCWdvdG8gYnJlYWRfZXJyMjsKKwkJCW9mZnNldCA9IHhsb2dfYWxpZ24obG9nLCBibGtfbm8gKyBoYmxrcywgYmJsa3MsIGRicCk7CisJCQl4bG9nX3VucGFja19kYXRhKHJoZWFkLCBvZmZzZXQsIGxvZyk7CisJCQlpZiAoKGVycm9yID0geGxvZ19yZWNvdmVyX3Byb2Nlc3NfZGF0YShsb2csCisJCQkJCQlyaGFzaCwgcmhlYWQsIG9mZnNldCwgcGFzcykpKQorCQkJCWdvdG8gYnJlYWRfZXJyMjsKKwkJCWJsa19ubyArPSBiYmxrcyArIGhibGtzOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogUGVyZm9ybSByZWNvdmVyeSBhcm91bmQgdGhlIGVuZCBvZiB0aGUgcGh5c2ljYWwgbG9nLgorCQkgKiBXaGVuIHRoZSBoZWFkIGlzIG5vdCBvbiB0aGUgc2FtZSBjeWNsZSBudW1iZXIgYXMgdGhlIHRhaWwsCisJCSAqIHdlIGNhbid0IGRvIGEgc2VxdWVudGlhbCByZWNvdmVyeSBhcyBhYm92ZS4KKwkJICovCisJCWJsa19ubyA9IHRhaWxfYmxrOworCQl3aGlsZSAoYmxrX25vIDwgbG9nLT5sX2xvZ0JCc2l6ZSkgeworCQkJLyoKKwkJCSAqIENoZWNrIGZvciBoZWFkZXIgd3JhcHBpbmcgYXJvdW5kIHBoeXNpY2FsIGVuZC1vZi1sb2cKKwkJCSAqLworCQkJb2Zmc2V0ID0gTlVMTDsKKwkJCXNwbGl0X2hibGtzID0gMDsKKwkJCXdyYXBwZWRfaGJsa3MgPSAwOworCQkJaWYgKGJsa19ubyArIGhibGtzIDw9IGxvZy0+bF9sb2dCQnNpemUpIHsKKwkJCQkvKiBSZWFkIGhlYWRlciBpbiBvbmUgcmVhZCAqLworCQkJCWVycm9yID0geGxvZ19icmVhZChsb2csIGJsa19ubywgaGJsa3MsIGhicCk7CisJCQkJaWYgKGVycm9yKQorCQkJCQlnb3RvIGJyZWFkX2VycjI7CisJCQkJb2Zmc2V0ID0geGxvZ19hbGlnbihsb2csIGJsa19ubywgaGJsa3MsIGhicCk7CisJCQl9IGVsc2UgeworCQkJCS8qIFRoaXMgTFIgaXMgc3BsaXQgYWNyb3NzIHBoeXNpY2FsIGxvZyBlbmQgKi8KKwkJCQlpZiAoYmxrX25vICE9IGxvZy0+bF9sb2dCQnNpemUpIHsKKwkJCQkJLyogc29tZSBkYXRhIGJlZm9yZSBwaHlzaWNhbCBsb2cgZW5kICovCisJCQkJCUFTU0VSVChibGtfbm8gPD0gSU5UX01BWCk7CisJCQkJCXNwbGl0X2hibGtzID0gbG9nLT5sX2xvZ0JCc2l6ZSAtIChpbnQpYmxrX25vOworCQkJCQlBU1NFUlQoc3BsaXRfaGJsa3MgPiAwKTsKKwkJCQkJaWYgKChlcnJvciA9IHhsb2dfYnJlYWQobG9nLCBibGtfbm8sCisJCQkJCQkJc3BsaXRfaGJsa3MsIGhicCkpKQorCQkJCQkJZ290byBicmVhZF9lcnIyOworCQkJCQlvZmZzZXQgPSB4bG9nX2FsaWduKGxvZywgYmxrX25vLAorCQkJCQkJCXNwbGl0X2hibGtzLCBoYnApOworCQkJCX0KKwkJCQkvKgorCQkJCSAqIE5vdGU6IHRoaXMgYmxhY2sgbWFnaWMgc3RpbGwgd29ya3Mgd2l0aAorCQkJCSAqIGxhcmdlIHNlY3RvciBzaXplcyAobm9uLTUxMikgb25seSBiZWNhdXNlOgorCQkJCSAqIC0gd2UgaW5jcmVhc2VkIHRoZSBidWZmZXIgc2l6ZSBvcmlnaW5hbGx5CisJCQkJICogICBieSAxIHNlY3RvciBnaXZpbmcgdXMgZW5vdWdoIGV4dHJhIHNwYWNlCisJCQkJICogICBmb3IgdGhlIHNlY29uZCByZWFkOworCQkJCSAqIC0gdGhlIGxvZyBzdGFydCBpcyBndWFyYW50ZWVkIHRvIGJlIHNlY3RvcgorCQkJCSAqICAgYWxpZ25lZDsKKwkJCQkgKiAtIHdlIHJlYWQgdGhlIGxvZyBlbmQgKExSIGhlYWRlciBzdGFydCkKKwkJCQkgKiAgIF9maXJzdF8sIHRoZW4gdGhlIGxvZyBzdGFydCAoTFIgaGVhZGVyIGVuZCkKKwkJCQkgKiAgIC0gb3JkZXIgaXMgaW1wb3J0YW50LgorCQkJCSAqLworCQkJCWJ1ZmFkZHIgPSBYRlNfQlVGX1BUUihoYnApOworCQkJCVhGU19CVUZfU0VUX1BUUihoYnAsCisJCQkJCQlidWZhZGRyICsgQkJUT0Ioc3BsaXRfaGJsa3MpLAorCQkJCQkJQkJUT0IoaGJsa3MgLSBzcGxpdF9oYmxrcykpOworCQkJCXdyYXBwZWRfaGJsa3MgPSBoYmxrcyAtIHNwbGl0X2hibGtzOworCQkJCWVycm9yID0geGxvZ19icmVhZChsb2csIDAsIHdyYXBwZWRfaGJsa3MsIGhicCk7CisJCQkJaWYgKGVycm9yKQorCQkJCQlnb3RvIGJyZWFkX2VycjI7CisJCQkJWEZTX0JVRl9TRVRfUFRSKGhicCwgYnVmYWRkciwgQkJUT0IoaGJsa3MpKTsKKwkJCQlpZiAoIW9mZnNldCkKKwkJCQkJb2Zmc2V0ID0geGxvZ19hbGlnbihsb2csIDAsCisJCQkJCQkJd3JhcHBlZF9oYmxrcywgaGJwKTsKKwkJCX0KKwkJCXJoZWFkID0gKHhsb2dfcmVjX2hlYWRlcl90ICopb2Zmc2V0OworCQkJZXJyb3IgPSB4bG9nX3ZhbGlkX3JlY19oZWFkZXIobG9nLCByaGVhZCwKKwkJCQkJCXNwbGl0X2hibGtzID8gYmxrX25vIDogMCk7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBicmVhZF9lcnIyOworCisJCQliYmxrcyA9IChpbnQpQlRPQkIoSU5UX0dFVChyaGVhZC0+aF9sZW4sIEFSQ0hfQ09OVkVSVCkpOworCQkJYmxrX25vICs9IGhibGtzOworCisJCQkvKiBSZWFkIGluIGRhdGEgZm9yIGxvZyByZWNvcmQgKi8KKwkJCWlmIChibGtfbm8gKyBiYmxrcyA8PSBsb2ctPmxfbG9nQkJzaXplKSB7CisJCQkJZXJyb3IgPSB4bG9nX2JyZWFkKGxvZywgYmxrX25vLCBiYmxrcywgZGJwKTsKKwkJCQlpZiAoZXJyb3IpCisJCQkJCWdvdG8gYnJlYWRfZXJyMjsKKwkJCQlvZmZzZXQgPSB4bG9nX2FsaWduKGxvZywgYmxrX25vLCBiYmxrcywgZGJwKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogVGhpcyBsb2cgcmVjb3JkIGlzIHNwbGl0IGFjcm9zcyB0aGUKKwkJCQkgKiBwaHlzaWNhbCBlbmQgb2YgbG9nICovCisJCQkJb2Zmc2V0ID0gTlVMTDsKKwkJCQlzcGxpdF9iYmxrcyA9IDA7CisJCQkJaWYgKGJsa19ubyAhPSBsb2ctPmxfbG9nQkJzaXplKSB7CisJCQkJCS8qIHNvbWUgZGF0YSBpcyBiZWZvcmUgdGhlIHBoeXNpY2FsCisJCQkJCSAqIGVuZCBvZiBsb2cgKi8KKwkJCQkJQVNTRVJUKCF3cmFwcGVkX2hibGtzKTsKKwkJCQkJQVNTRVJUKGJsa19ubyA8PSBJTlRfTUFYKTsKKwkJCQkJc3BsaXRfYmJsa3MgPQorCQkJCQkJbG9nLT5sX2xvZ0JCc2l6ZSAtIChpbnQpYmxrX25vOworCQkJCQlBU1NFUlQoc3BsaXRfYmJsa3MgPiAwKTsKKwkJCQkJaWYgKChlcnJvciA9IHhsb2dfYnJlYWQobG9nLCBibGtfbm8sCisJCQkJCQkJc3BsaXRfYmJsa3MsIGRicCkpKQorCQkJCQkJZ290byBicmVhZF9lcnIyOworCQkJCQlvZmZzZXQgPSB4bG9nX2FsaWduKGxvZywgYmxrX25vLAorCQkJCQkJCXNwbGl0X2JibGtzLCBkYnApOworCQkJCX0KKwkJCQkvKgorCQkJCSAqIE5vdGU6IHRoaXMgYmxhY2sgbWFnaWMgc3RpbGwgd29ya3Mgd2l0aAorCQkJCSAqIGxhcmdlIHNlY3RvciBzaXplcyAobm9uLTUxMikgb25seSBiZWNhdXNlOgorCQkJCSAqIC0gd2UgaW5jcmVhc2VkIHRoZSBidWZmZXIgc2l6ZSBvcmlnaW5hbGx5CisJCQkJICogICBieSAxIHNlY3RvciBnaXZpbmcgdXMgZW5vdWdoIGV4dHJhIHNwYWNlCisJCQkJICogICBmb3IgdGhlIHNlY29uZCByZWFkOworCQkJCSAqIC0gdGhlIGxvZyBzdGFydCBpcyBndWFyYW50ZWVkIHRvIGJlIHNlY3RvcgorCQkJCSAqICAgYWxpZ25lZDsKKwkJCQkgKiAtIHdlIHJlYWQgdGhlIGxvZyBlbmQgKExSIGhlYWRlciBzdGFydCkKKwkJCQkgKiAgIF9maXJzdF8sIHRoZW4gdGhlIGxvZyBzdGFydCAoTFIgaGVhZGVyIGVuZCkKKwkJCQkgKiAgIC0gb3JkZXIgaXMgaW1wb3J0YW50LgorCQkJCSAqLworCQkJCWJ1ZmFkZHIgPSBYRlNfQlVGX1BUUihkYnApOworCQkJCVhGU19CVUZfU0VUX1BUUihkYnAsCisJCQkJCQlidWZhZGRyICsgQkJUT0Ioc3BsaXRfYmJsa3MpLAorCQkJCQkJQkJUT0IoYmJsa3MgLSBzcGxpdF9iYmxrcykpOworCQkJCWlmICgoZXJyb3IgPSB4bG9nX2JyZWFkKGxvZywgd3JhcHBlZF9oYmxrcywKKwkJCQkJCWJibGtzIC0gc3BsaXRfYmJsa3MsIGRicCkpKQorCQkJCQlnb3RvIGJyZWFkX2VycjI7CisJCQkJWEZTX0JVRl9TRVRfUFRSKGRicCwgYnVmYWRkciwgaF9zaXplKTsKKwkJCQlpZiAoIW9mZnNldCkKKwkJCQkJb2Zmc2V0ID0geGxvZ19hbGlnbihsb2csIHdyYXBwZWRfaGJsa3MsCisJCQkJCQliYmxrcyAtIHNwbGl0X2JibGtzLCBkYnApOworCQkJfQorCQkJeGxvZ191bnBhY2tfZGF0YShyaGVhZCwgb2Zmc2V0LCBsb2cpOworCQkJaWYgKChlcnJvciA9IHhsb2dfcmVjb3Zlcl9wcm9jZXNzX2RhdGEobG9nLCByaGFzaCwKKwkJCQkJCQlyaGVhZCwgb2Zmc2V0LCBwYXNzKSkpCisJCQkJZ290byBicmVhZF9lcnIyOworCQkJYmxrX25vICs9IGJibGtzOworCQl9CisKKwkJQVNTRVJUKGJsa19ubyA+PSBsb2ctPmxfbG9nQkJzaXplKTsKKwkJYmxrX25vIC09IGxvZy0+bF9sb2dCQnNpemU7CisKKwkJLyogcmVhZCBmaXJzdCBwYXJ0IG9mIHBoeXNpY2FsIGxvZyAqLworCQl3aGlsZSAoYmxrX25vIDwgaGVhZF9ibGspIHsKKwkJCWlmICgoZXJyb3IgPSB4bG9nX2JyZWFkKGxvZywgYmxrX25vLCBoYmxrcywgaGJwKSkpCisJCQkJZ290byBicmVhZF9lcnIyOworCQkJb2Zmc2V0ID0geGxvZ19hbGlnbihsb2csIGJsa19ubywgaGJsa3MsIGhicCk7CisJCQlyaGVhZCA9ICh4bG9nX3JlY19oZWFkZXJfdCAqKW9mZnNldDsKKwkJCWVycm9yID0geGxvZ192YWxpZF9yZWNfaGVhZGVyKGxvZywgcmhlYWQsIGJsa19ubyk7CisJCQlpZiAoZXJyb3IpCisJCQkJZ290byBicmVhZF9lcnIyOworCQkJYmJsa3MgPSAoaW50KUJUT0JCKElOVF9HRVQocmhlYWQtPmhfbGVuLCBBUkNIX0NPTlZFUlQpKTsKKwkJCWlmICgoZXJyb3IgPSB4bG9nX2JyZWFkKGxvZywgYmxrX25vK2hibGtzLCBiYmxrcywgZGJwKSkpCisJCQkJZ290byBicmVhZF9lcnIyOworCQkJb2Zmc2V0ID0geGxvZ19hbGlnbihsb2csIGJsa19ubytoYmxrcywgYmJsa3MsIGRicCk7CisJCQl4bG9nX3VucGFja19kYXRhKHJoZWFkLCBvZmZzZXQsIGxvZyk7CisJCQlpZiAoKGVycm9yID0geGxvZ19yZWNvdmVyX3Byb2Nlc3NfZGF0YShsb2csIHJoYXNoLAorCQkJCQkJCXJoZWFkLCBvZmZzZXQsIHBhc3MpKSkKKwkJCQlnb3RvIGJyZWFkX2VycjI7CisJCQlibGtfbm8gKz0gYmJsa3MgKyBoYmxrczsKKwkJfQorCX0KKworIGJyZWFkX2VycjI6CisJeGxvZ19wdXRfYnAoZGJwKTsKKyBicmVhZF9lcnIxOgorCXhsb2dfcHV0X2JwKGhicCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogRG8gdGhlIHJlY292ZXJ5IG9mIHRoZSBsb2cuICBXZSBhY3R1YWxseSBkbyB0aGlzIGluIHR3byBwaGFzZXMuCisgKiBUaGUgdHdvIHBhc3NlcyBhcmUgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIGltcGxlbWVudCB0aGUgZnVuY3Rpb24KKyAqIG9mIGNhbmNlbGxpbmcgYSByZWNvcmQgd3JpdHRlbiBpbnRvIHRoZSBsb2cuICBUaGUgZmlyc3QgcGFzcworICogZGV0ZXJtaW5lcyB0aG9zZSB0aGluZ3Mgd2hpY2ggaGF2ZSBiZWVuIGNhbmNlbGxlZCwgYW5kIHRoZQorICogc2Vjb25kIHBhc3MgcmVwbGF5cyBsb2cgaXRlbXMgbm9ybWFsbHkgZXhjZXB0IGZvciB0aG9zZSB3aGljaAorICogaGF2ZSBiZWVuIGNhbmNlbGxlZC4gIFRoZSBoYW5kbGluZyBvZiB0aGUgcmVwbGF5IGFuZCBjYW5jZWxsYXRpb25zCisgKiB0YWtlcyBwbGFjZSBpbiB0aGUgbG9nIGl0ZW0gdHlwZSBzcGVjaWZpYyByb3V0aW5lcy4KKyAqCisgKiBUaGUgdGFibGUgb2YgaXRlbXMgd2hpY2ggaGF2ZSBjYW5jZWwgcmVjb3JkcyBpbiB0aGUgbG9nIGlzIGFsbG9jYXRlZAorICogYW5kIGZyZWVkIGF0IHRoaXMgbGV2ZWwsIHNpbmNlIG9ubHkgaGVyZSBkbyB3ZSBrbm93IHdoZW4gYWxsIG9mCisgKiB0aGUgbG9nIHJlY292ZXJ5IGhhcyBiZWVuIGNvbXBsZXRlZC4KKyAqLworU1RBVElDIGludAoreGxvZ19kb19sb2dfcmVjb3ZlcnkoCisJeGxvZ190CQkqbG9nLAorCXhmc19kYWRkcl90CWhlYWRfYmxrLAorCXhmc19kYWRkcl90CXRhaWxfYmxrKQoreworCWludAkJZXJyb3I7CisKKwlBU1NFUlQoaGVhZF9ibGsgIT0gdGFpbF9ibGspOworCisJLyoKKwkgKiBGaXJzdCBkbyBhIHBhc3MgdG8gZmluZCBhbGwgb2YgdGhlIGNhbmNlbGxlZCBidWYgbG9nIGl0ZW1zLgorCSAqIFN0b3JlIHRoZW0gaW4gdGhlIGJ1Zl9jYW5jZWxfdGFibGUgZm9yIHVzZSBpbiB0aGUgc2Vjb25kIHBhc3MuCisJICovCisJbG9nLT5sX2J1Zl9jYW5jZWxfdGFibGUgPQorCQkoeGZzX2J1Zl9jYW5jZWxfdCAqKilrbWVtX3phbGxvYyhYTE9HX0JDX1RBQkxFX1NJWkUgKgorCQkJCQkJIHNpemVvZih4ZnNfYnVmX2NhbmNlbF90KiksCisJCQkJCQkgS01fU0xFRVApOworCWVycm9yID0geGxvZ19kb19yZWNvdmVyeV9wYXNzKGxvZywgaGVhZF9ibGssIHRhaWxfYmxrLAorCQkJCSAgICAgIFhMT0dfUkVDT1ZFUl9QQVNTMSk7CisJaWYgKGVycm9yICE9IDApIHsKKwkJa21lbV9mcmVlKGxvZy0+bF9idWZfY2FuY2VsX3RhYmxlLAorCQkJICBYTE9HX0JDX1RBQkxFX1NJWkUgKiBzaXplb2YoeGZzX2J1Zl9jYW5jZWxfdCopKTsKKwkJbG9nLT5sX2J1Zl9jYW5jZWxfdGFibGUgPSBOVUxMOworCQlyZXR1cm4gZXJyb3I7CisJfQorCS8qCisJICogVGhlbiBkbyBhIHNlY29uZCBwYXNzIHRvIGFjdHVhbGx5IHJlY292ZXIgdGhlIGl0ZW1zIGluIHRoZSBsb2cuCisJICogV2hlbiBpdCBpcyBjb21wbGV0ZSBmcmVlIHRoZSB0YWJsZSBvZiBidWYgY2FuY2VsIGl0ZW1zLgorCSAqLworCWVycm9yID0geGxvZ19kb19yZWNvdmVyeV9wYXNzKGxvZywgaGVhZF9ibGssIHRhaWxfYmxrLAorCQkJCSAgICAgIFhMT0dfUkVDT1ZFUl9QQVNTMik7CisjaWZkZWYgREVCVUcKKwl7CisJCWludAlpOworCisJCWZvciAoaSA9IDA7IGkgPCBYTE9HX0JDX1RBQkxFX1NJWkU7IGkrKykKKwkJCUFTU0VSVChsb2ctPmxfYnVmX2NhbmNlbF90YWJsZVtpXSA9PSBOVUxMKTsKKwl9CisjZW5kaWYJLyogREVCVUcgKi8KKworCWttZW1fZnJlZShsb2ctPmxfYnVmX2NhbmNlbF90YWJsZSwKKwkJICBYTE9HX0JDX1RBQkxFX1NJWkUgKiBzaXplb2YoeGZzX2J1Zl9jYW5jZWxfdCopKTsKKwlsb2ctPmxfYnVmX2NhbmNlbF90YWJsZSA9IE5VTEw7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBEbyB0aGUgYWN0dWFsIHJlY292ZXJ5CisgKi8KK1NUQVRJQyBpbnQKK3hsb2dfZG9fcmVjb3ZlcigKKwl4bG9nX3QJCSpsb2csCisJeGZzX2RhZGRyX3QJaGVhZF9ibGssCisJeGZzX2RhZGRyX3QJdGFpbF9ibGspCit7CisJaW50CQllcnJvcjsKKwl4ZnNfYnVmX3QJKmJwOworCXhmc19zYl90CSpzYnA7CisKKwkvKgorCSAqIEZpcnN0IHJlcGxheSB0aGUgaW1hZ2VzIGluIHRoZSBsb2cuCisJICovCisJZXJyb3IgPSB4bG9nX2RvX2xvZ19yZWNvdmVyeShsb2csIGhlYWRfYmxrLCB0YWlsX2Jsayk7CisJaWYgKGVycm9yKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwlYRlNfYmZsdXNoKGxvZy0+bF9tcC0+bV9kZGV2X3RhcmdwKTsKKworCS8qCisJICogSWYgSU8gZXJyb3JzIGhhcHBlbmVkIGR1cmluZyByZWNvdmVyeSwgYmFpbCBvdXQuCisJICovCisJaWYgKFhGU19GT1JDRURfU0hVVERPV04obG9nLT5sX21wKSkgeworCQlyZXR1cm4gKEVJTyk7CisJfQorCisJLyoKKwkgKiBXZSBub3cgdXBkYXRlIHRoZSB0YWlsX2xzbiBzaW5jZSBtdWNoIG9mIHRoZSByZWNvdmVyeSBoYXMgY29tcGxldGVkCisJICogYW5kIHRoZXJlIG1heSBiZSBzcGFjZSBhdmFpbGFibGUgdG8gdXNlLiAgSWYgdGhlcmUgd2VyZSBubyBleHRlbnQKKwkgKiBvciBpdW5saW5rcywgd2UgY2FuIGZyZWUgdXAgdGhlIGVudGlyZSBsb2cgYW5kIHNldCB0aGUgdGFpbF9sc24gdG8KKwkgKiBiZSB0aGUgbGFzdF9zeW5jX2xzbi4gIFRoaXMgd2FzIHNldCBpbiB4bG9nX2ZpbmRfdGFpbCB0byBiZSB0aGUKKwkgKiBsc24gb2YgdGhlIGxhc3Qga25vd24gZ29vZCBMUiBvbiBkaXNrLiAgSWYgdGhlcmUgYXJlIGV4dGVudCBmcmVlcworCSAqIG9yIGl1bmxpbmtzIHRoZXkgd2lsbCBoYXZlIHNvbWUgZW50cmllcyBpbiB0aGUgQUlMOyBzbyB3ZSBsb29rIGF0CisJICogdGhlIEFJTCB0byBkZXRlcm1pbmUgaG93IHRvIHNldCB0aGUgdGFpbF9sc24uCisJICovCisJeGxvZ19hc3NpZ25fdGFpbF9sc24obG9nLT5sX21wKTsKKworCS8qCisJICogTm93IHRoYXQgd2UndmUgZmluaXNoZWQgcmVwbGF5aW5nIGFsbCBidWZmZXIgYW5kIGlub2RlCisJICogdXBkYXRlcywgcmUtcmVhZCBpbiB0aGUgc3VwZXJibG9jay4KKwkgKi8KKwlicCA9IHhmc19nZXRzYihsb2ctPmxfbXAsIDApOworCVhGU19CVUZfVU5ET05FKGJwKTsKKwlYRlNfQlVGX1JFQUQoYnApOworCXhmc2Jkc3RyYXQobG9nLT5sX21wLCBicCk7CisJaWYgKChlcnJvciA9IHhmc19pb3dhaXQoYnApKSkgeworCQl4ZnNfaW9lcnJvcl9hbGVydCgieGxvZ19kb19yZWNvdmVyIiwKKwkJCQkgIGxvZy0+bF9tcCwgYnAsIFhGU19CVUZfQUREUihicCkpOworCQlBU1NFUlQoMCk7CisJCXhmc19idWZfcmVsc2UoYnApOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJLyogQ29udmVydCBzdXBlcmJsb2NrIGZyb20gb24tZGlzayBmb3JtYXQgKi8KKwlzYnAgPSAmbG9nLT5sX21wLT5tX3NiOworCXhmc194bGF0ZXNiKFhGU19CVUZfVE9fU0JQKGJwKSwgc2JwLCAxLCBYRlNfU0JfQUxMX0JJVFMpOworCUFTU0VSVChzYnAtPnNiX21hZ2ljbnVtID09IFhGU19TQl9NQUdJQyk7CisJQVNTRVJUKFhGU19TQl9HT09EX1ZFUlNJT04oc2JwKSk7CisJeGZzX2J1Zl9yZWxzZShicCk7CisKKwl4bG9nX3JlY292ZXJfY2hlY2tfc3VtbWFyeShsb2cpOworCisJLyogTm9ybWFsIHRyYW5zYWN0aW9ucyBjYW4gbm93IG9jY3VyICovCisJbG9nLT5sX2ZsYWdzICY9IH5YTE9HX0FDVElWRV9SRUNPVkVSWTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFBlcmZvcm0gcmVjb3ZlcnkgYW5kIHJlLWluaXRpYWxpemUgc29tZSBsb2cgdmFyaWFibGVzIGluIHhsb2dfZmluZF90YWlsLgorICoKKyAqIFJldHVybiBlcnJvciBvciB6ZXJvLgorICovCitpbnQKK3hsb2dfcmVjb3ZlcigKKwl4bG9nX3QJCSpsb2csCisJaW50CQlyZWFkb25seSkKK3sKKwl4ZnNfZGFkZHJfdAloZWFkX2JsaywgdGFpbF9ibGs7CisJaW50CQllcnJvcjsKKworCS8qIGZpbmQgdGhlIHRhaWwgb2YgdGhlIGxvZyAqLworCWlmICgoZXJyb3IgPSB4bG9nX2ZpbmRfdGFpbChsb2csICZoZWFkX2JsaywgJnRhaWxfYmxrLCByZWFkb25seSkpKQorCQlyZXR1cm4gZXJyb3I7CisKKwlpZiAodGFpbF9ibGsgIT0gaGVhZF9ibGspIHsKKwkJLyogVGhlcmUgdXNlZCB0byBiZSBhIGNvbW1lbnQgaGVyZToKKwkJICoKKwkJICogZGlzYWxsb3cgcmVjb3Zlcnkgb24gcmVhZC1vbmx5IG1vdW50cy4gIG5vdGUgLS0gbW91bnQKKwkJICogY2hlY2tzIGZvciBFTk9TUEMgYW5kIHR1cm5zIGl0IGludG8gYW4gaW50ZWxsaWdlbnQKKwkJICogZXJyb3IgbWVzc2FnZS4KKwkJICogLi4uYnV0IHRoaXMgaXMgbm8gbG9uZ2VyIHRydWUuICBOb3csIHVubGVzcyB5b3Ugc3BlY2lmeQorCQkgKiBOT1JFQ09WRVJZIChpbiB3aGljaCBjYXNlIHRoaXMgZnVuY3Rpb24gd291bGQgbmV2ZXIgYmUKKwkJICogY2FsbGVkKSwgd2UganVzdCBnbyBhaGVhZCBhbmQgcmVjb3Zlci4gIFdlIGRvIHRoaXMgYWxsCisJCSAqIHVuZGVyIHRoZSB2ZnMgbGF5ZXIsIHNvIHdlIGNhbiBnZXQgYXdheSB3aXRoIGl0IHVubGVzcworCQkgKiB0aGUgZGV2aWNlIGl0c2VsZiBpcyByZWFkLW9ubHksIGluIHdoaWNoIGNhc2Ugd2UgZmFpbC4KKwkJICovCisJCWlmICgoZXJyb3IgPSB4ZnNfZGV2X2lzX3JlYWRfb25seShsb2ctPmxfbXAsCisJCQkJCQkicmVjb3ZlcnkgcmVxdWlyZWQiKSkpIHsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCisJCWNtbl9lcnIoQ0VfTk9URSwKKwkJCSJTdGFydGluZyBYRlMgcmVjb3Zlcnkgb24gZmlsZXN5c3RlbTogJXMgKGRldjogJXMpIiwKKwkJCWxvZy0+bF9tcC0+bV9mc25hbWUsIFhGU19CVUZUQVJHX05BTUUobG9nLT5sX3RhcmcpKTsKKworCQllcnJvciA9IHhsb2dfZG9fcmVjb3Zlcihsb2csIGhlYWRfYmxrLCB0YWlsX2Jsayk7CisJCWxvZy0+bF9mbGFncyB8PSBYTE9HX1JFQ09WRVJZX05FRURFRDsKKwl9CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogSW4gdGhlIGZpcnN0IHBhcnQgb2YgcmVjb3Zlcnkgd2UgcmVwbGF5IGlub2RlcyBhbmQgYnVmZmVycyBhbmQgYnVpbGQKKyAqIHVwIHRoZSBsaXN0IG9mIGV4dGVudCBmcmVlIGl0ZW1zIHdoaWNoIG5lZWQgdG8gYmUgcHJvY2Vzc2VkLiAgSGVyZQorICogd2UgcHJvY2VzcyB0aGUgZXh0ZW50IGZyZWUgaXRlbXMgYW5kIGNsZWFuIHVwIHRoZSBvbiBkaXNrIHVubGlua2VkCisgKiBpbm9kZSBsaXN0cy4gIFRoaXMgaXMgc2VwYXJhdGVkIGZyb20gdGhlIGZpcnN0IHBhcnQgb2YgcmVjb3Zlcnkgc28KKyAqIHRoYXQgdGhlIHJvb3QgYW5kIHJlYWwtdGltZSBiaXRtYXAgaW5vZGVzIGNhbiBiZSByZWFkIGluIGZyb20gZGlzayBpbgorICogYmV0d2VlbiB0aGUgdHdvIHN0YWdlcy4gIFRoaXMgaXMgbmVjZXNzYXJ5IHNvIHRoYXQgd2UgY2FuIGZyZWUgc3BhY2UKKyAqIGluIHRoZSByZWFsLXRpbWUgcG9ydGlvbiBvZiB0aGUgZmlsZSBzeXN0ZW0uCisgKi8KK2ludAoreGxvZ19yZWNvdmVyX2ZpbmlzaCgKKwl4bG9nX3QJCSpsb2csCisJaW50CQltZnNpX2ZsYWdzKQoreworCS8qCisJICogTm93IHdlJ3JlIHJlYWR5IHRvIGRvIHRoZSB0cmFuc2FjdGlvbnMgbmVlZGVkIGZvciB0aGUKKwkgKiByZXN0IG9mIHJlY292ZXJ5LiAgU3RhcnQgd2l0aCBjb21wbGV0aW5nIGFsbCB0aGUgZXh0ZW50CisJICogZnJlZSBpbnRlbnQgcmVjb3JkcyBhbmQgdGhlbiBwcm9jZXNzIHRoZSB1bmxpbmtlZCBpbm9kZQorCSAqIGxpc3RzLiAgQXQgdGhpcyBwb2ludCwgd2UgZXNzZW50aWFsbHkgcnVuIGluIG5vcm1hbCBtb2RlCisJICogZXhjZXB0IHRoYXQgd2UncmUgc3RpbGwgcGVyZm9ybWluZyByZWNvdmVyeSBhY3Rpb25zCisJICogcmF0aGVyIHRoYW4gYWNjZXB0aW5nIG5ldyByZXF1ZXN0cy4KKwkgKi8KKwlpZiAobG9nLT5sX2ZsYWdzICYgWExPR19SRUNPVkVSWV9ORUVERUQpIHsKKwkJeGxvZ19yZWNvdmVyX3Byb2Nlc3NfZWZpcyhsb2cpOworCQkvKgorCQkgKiBTeW5jIHRoZSBsb2cgdG8gZ2V0IGFsbCB0aGUgRUZJcyBvdXQgb2YgdGhlIEFJTC4KKwkJICogVGhpcyBpc24ndCBhYnNvbHV0ZWx5IG5lY2Vzc2FyeSwgYnV0IGl0IGhlbHBzIGluCisJCSAqIGNhc2UgdGhlIHVubGluayB0cmFuc2FjdGlvbnMgd291bGQgaGF2ZSBwcm9ibGVtcworCQkgKiBwdXNoaW5nIHRoZSBFRklzIG91dCBvZiB0aGUgd2F5LgorCQkgKi8KKwkJeGZzX2xvZ19mb3JjZShsb2ctPmxfbXAsICh4ZnNfbHNuX3QpMCwKKwkJCSAgICAgIChYRlNfTE9HX0ZPUkNFIHwgWEZTX0xPR19TWU5DKSk7CisKKwkJaWYgKCAobWZzaV9mbGFncyAmIFhGU19NRlNJX05PVU5MSU5LKSA9PSAwICkgeworCQkJeGxvZ19yZWNvdmVyX3Byb2Nlc3NfaXVubGlua3MobG9nKTsKKwkJfQorCisJCXhsb2dfcmVjb3Zlcl9jaGVja19zdW1tYXJ5KGxvZyk7CisKKwkJY21uX2VycihDRV9OT1RFLAorCQkJIkVuZGluZyBYRlMgcmVjb3Zlcnkgb24gZmlsZXN5c3RlbTogJXMgKGRldjogJXMpIiwKKwkJCWxvZy0+bF9tcC0+bV9mc25hbWUsIFhGU19CVUZUQVJHX05BTUUobG9nLT5sX3RhcmcpKTsKKwkJbG9nLT5sX2ZsYWdzICY9IH5YTE9HX1JFQ09WRVJZX05FRURFRDsKKwl9IGVsc2UgeworCQljbW5fZXJyKENFX0RFQlVHLAorCQkJIiFFbmRpbmcgY2xlYW4gWEZTIG1vdW50IGZvciBmaWxlc3lzdGVtOiAlcyIsCisJCQlsb2ctPmxfbXAtPm1fZnNuYW1lKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworI2lmIGRlZmluZWQoREVCVUcpCisvKgorICogUmVhZCBhbGwgb2YgdGhlIGFnZiBhbmQgYWdpIGNvdW50ZXJzIGFuZCBjaGVjayB0aGF0IHRoZXkKKyAqIGFyZSBjb25zaXN0ZW50IHdpdGggdGhlIHN1cGVyYmxvY2sgY291bnRlcnMuCisgKi8KK3ZvaWQKK3hsb2dfcmVjb3Zlcl9jaGVja19zdW1tYXJ5KAorCXhsb2dfdAkJKmxvZykKK3sKKwl4ZnNfbW91bnRfdAkqbXA7CisJeGZzX2FnZl90CSphZ2ZwOworCXhmc19hZ2lfdAkqYWdpcDsKKwl4ZnNfYnVmX3QJKmFnZmJwOworCXhmc19idWZfdAkqYWdpYnA7CisJeGZzX2RhZGRyX3QJYWdmZGFkZHI7CisJeGZzX2RhZGRyX3QJYWdpZGFkZHI7CisJeGZzX2J1Zl90CSpzYmJwOworI2lmZGVmIFhGU19MT1VEX1JFQ09WRVJZCisJeGZzX3NiX3QJKnNicDsKKyNlbmRpZgorCXhmc19hZ251bWJlcl90CWFnbm87CisJX191aW50NjRfdAlmcmVlYmxrczsKKwlfX3VpbnQ2NF90CWl0b3RhbDsKKwlfX3VpbnQ2NF90CWlmcmVlOworCisJbXAgPSBsb2ctPmxfbXA7CisKKwlmcmVlYmxrcyA9IDBMTDsKKwlpdG90YWwgPSAwTEw7CisJaWZyZWUgPSAwTEw7CisJZm9yIChhZ25vID0gMDsgYWdubyA8IG1wLT5tX3NiLnNiX2FnY291bnQ7IGFnbm8rKykgeworCQlhZ2ZkYWRkciA9IFhGU19BR19EQUREUihtcCwgYWdubywgWEZTX0FHRl9EQUREUihtcCkpOworCQlhZ2ZicCA9IHhmc19idWZfcmVhZChtcC0+bV9kZGV2X3RhcmdwLCBhZ2ZkYWRkciwKKwkJCQlYRlNfRlNTX1RPX0JCKG1wLCAxKSwgMCk7CisJCWlmIChYRlNfQlVGX0lTRVJST1IoYWdmYnApKSB7CisJCQl4ZnNfaW9lcnJvcl9hbGVydCgieGxvZ19yZWNvdmVyX2NoZWNrX3N1bW1hcnkoYWdmKSIsCisJCQkJCQltcCwgYWdmYnAsIGFnZmRhZGRyKTsKKwkJfQorCQlhZ2ZwID0gWEZTX0JVRl9UT19BR0YoYWdmYnApOworCQlBU1NFUlQoWEZTX0FHRl9NQUdJQyA9PQorCQkJSU5UX0dFVChhZ2ZwLT5hZ2ZfbWFnaWNudW0sIEFSQ0hfQ09OVkVSVCkpOworCQlBU1NFUlQoWEZTX0FHRl9HT09EX1ZFUlNJT04oCisJCQlJTlRfR0VUKGFnZnAtPmFnZl92ZXJzaW9ubnVtLCBBUkNIX0NPTlZFUlQpKSk7CisJCUFTU0VSVChJTlRfR0VUKGFnZnAtPmFnZl9zZXFubywgQVJDSF9DT05WRVJUKSA9PSBhZ25vKTsKKworCQlmcmVlYmxrcyArPSBJTlRfR0VUKGFnZnAtPmFnZl9mcmVlYmxrcywgQVJDSF9DT05WRVJUKSArCisJCQkgICAgSU5UX0dFVChhZ2ZwLT5hZ2ZfZmxjb3VudCwgQVJDSF9DT05WRVJUKTsKKwkJeGZzX2J1Zl9yZWxzZShhZ2ZicCk7CisKKwkJYWdpZGFkZHIgPSBYRlNfQUdfREFERFIobXAsIGFnbm8sIFhGU19BR0lfREFERFIobXApKTsKKwkJYWdpYnAgPSB4ZnNfYnVmX3JlYWQobXAtPm1fZGRldl90YXJncCwgYWdpZGFkZHIsCisJCQkJWEZTX0ZTU19UT19CQihtcCwgMSksIDApOworCQlpZiAoWEZTX0JVRl9JU0VSUk9SKGFnaWJwKSkgeworCQkJeGZzX2lvZXJyb3JfYWxlcnQoInhsb2dfcmVjb3Zlcl9jaGVja19zdW1tYXJ5KGFnaSkiLAorCQkJCQkgIG1wLCBhZ2licCwgYWdpZGFkZHIpOworCQl9CisJCWFnaXAgPSBYRlNfQlVGX1RPX0FHSShhZ2licCk7CisJCUFTU0VSVChYRlNfQUdJX01BR0lDID09CisJCQlJTlRfR0VUKGFnaXAtPmFnaV9tYWdpY251bSwgQVJDSF9DT05WRVJUKSk7CisJCUFTU0VSVChYRlNfQUdJX0dPT0RfVkVSU0lPTigKKwkJCUlOVF9HRVQoYWdpcC0+YWdpX3ZlcnNpb25udW0sIEFSQ0hfQ09OVkVSVCkpKTsKKwkJQVNTRVJUKElOVF9HRVQoYWdpcC0+YWdpX3NlcW5vLCBBUkNIX0NPTlZFUlQpID09IGFnbm8pOworCisJCWl0b3RhbCArPSBJTlRfR0VUKGFnaXAtPmFnaV9jb3VudCwgQVJDSF9DT05WRVJUKTsKKwkJaWZyZWUgKz0gSU5UX0dFVChhZ2lwLT5hZ2lfZnJlZWNvdW50LCBBUkNIX0NPTlZFUlQpOworCQl4ZnNfYnVmX3JlbHNlKGFnaWJwKTsKKwl9CisKKwlzYmJwID0geGZzX2dldHNiKG1wLCAwKTsKKyNpZmRlZiBYRlNfTE9VRF9SRUNPVkVSWQorCXNicCA9ICZtcC0+bV9zYjsKKwl4ZnNfeGxhdGVzYihYRlNfQlVGX1RPX1NCUChzYmJwKSwgc2JwLCAxLCBYRlNfU0JfQUxMX0JJVFMpOworCWNtbl9lcnIoQ0VfTk9URSwKKwkJInhsb2dfcmVjb3Zlcl9jaGVja19zdW1tYXJ5OiBzYl9pY291bnQgJUx1IGl0b3RhbCAlTHUiLAorCQlzYnAtPnNiX2ljb3VudCwgaXRvdGFsKTsKKwljbW5fZXJyKENFX05PVEUsCisJCSJ4bG9nX3JlY292ZXJfY2hlY2tfc3VtbWFyeTogc2JfaWZyZWUgJUx1IGl0b3RhbCAlTHUiLAorCQlzYnAtPnNiX2lmcmVlLCBpZnJlZSk7CisJY21uX2VycihDRV9OT1RFLAorCQkieGxvZ19yZWNvdmVyX2NoZWNrX3N1bW1hcnk6IHNiX2ZkYmxvY2tzICVMdSBmcmVlYmxrcyAlTHUiLAorCQlzYnAtPnNiX2ZkYmxvY2tzLCBmcmVlYmxrcyk7CisjaWYgMAorCS8qCisJICogVGhpcyBpcyB0dXJuZWQgb2ZmIHVudGlsIEkgYWNjb3VudCBmb3IgdGhlIGFsbG9jYXRpb24KKwkgKiBidHJlZSBibG9ja3Mgd2hpY2ggbGl2ZSBpbiBmcmVlIHNwYWNlLgorCSAqLworCUFTU0VSVChzYnAtPnNiX2ljb3VudCA9PSBpdG90YWwpOworCUFTU0VSVChzYnAtPnNiX2lmcmVlID09IGlmcmVlKTsKKwlBU1NFUlQoc2JwLT5zYl9mZGJsb2NrcyA9PSBmcmVlYmxrcyk7CisjZW5kaWYKKyNlbmRpZgorCXhmc19idWZfcmVsc2Uoc2JicCk7Cit9CisjZW5kaWYgLyogREVCVUcgKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfbG9nX3JlY292ZXIuaCBiL2ZzL3hmcy94ZnNfbG9nX3JlY292ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjE1OGI0Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19sb2dfcmVjb3Zlci5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZglfX1hGU19MT0dfUkVDT1ZFUl9IX18KKyNkZWZpbmUgX19YRlNfTE9HX1JFQ09WRVJfSF9fCisKKy8qCisgKiBNYWNyb3MsIHN0cnVjdHVyZXMsIHByb3RvdHlwZXMgZm9yIGludGVybmFsIGxvZyBtYW5hZ2VyIHVzZS4KKyAqLworCisjZGVmaW5lIFhMT0dfUkhBU0hfQklUUyAgNAorI2RlZmluZSBYTE9HX1JIQVNIX1NJWkUJMTYKKyNkZWZpbmUgWExPR19SSEFTSF9TSElGVCAyCisjZGVmaW5lIFhMT0dfUkhBU0godGlkKQlcCisJKCgoKF9fdWludDMyX3QpdGlkKT4+WExPR19SSEFTSF9TSElGVCkgJiAoWExPR19SSEFTSF9TSVpFLTEpKQorCisjZGVmaW5lIFhMT0dfTUFYX1JFR0lPTlNfSU5fSVRFTSAgIChYRlNfTUFYX0JMT0NLU0laRSAvIFhGU19CTElfQ0hVTksgLyAyICsgMSkKKworCisvKgorICogaXRlbSBoZWFkZXJzIGFyZSBpbiByaV9idWZbMF0uICBBZGRpdGlvbmFsIGJ1ZmZlcnMgZm9sbG93LgorICovCit0eXBlZGVmIHN0cnVjdCB4bG9nX3JlY292ZXJfaXRlbSB7CisJc3RydWN0IHhsb2dfcmVjb3Zlcl9pdGVtICpyaV9uZXh0OworCXN0cnVjdCB4bG9nX3JlY292ZXJfaXRlbSAqcmlfcHJldjsKKwlpbnQJCQkgcmlfdHlwZTsKKwlpbnQJCQkgcmlfY250OwkvKiBjb3VudCBvZiByZWdpb25zIGZvdW5kICovCisJaW50CQkJIHJpX3RvdGFsOwkvKiB0b3RhbCByZWdpb25zICovCisJeGZzX2xvZ19pb3ZlY190CQkgKnJpX2J1ZjsJLyogcHRyIHRvIHJlZ2lvbnMgYnVmZmVyICovCit9IHhsb2dfcmVjb3Zlcl9pdGVtX3Q7CisKK3N0cnVjdCB4bG9nX3RpZDsKK3R5cGVkZWYgc3RydWN0IHhsb2dfcmVjb3ZlciB7CisJc3RydWN0IHhsb2dfcmVjb3ZlciAqcl9uZXh0OworCXhsb2dfdGlkX3QJICAgIHJfbG9nX3RpZDsJCS8qIGxvZydzIHRyYW5zYWN0aW9uIGlkICovCisJeGZzX3RyYW5zX2hlYWRlcl90ICByX3RoZWFkZXI7CQkvKiB0cmFucyBoZWFkZXIgZm9yIHBhcnRpYWwgKi8KKwlpbnQJCSAgICByX3N0YXRlOwkJLyogbm90IG5lZWRlZCAqLworCXhmc19sc25fdAkgICAgcl9sc247CQkvKiB4YWN0IGxzbiAqLworCXhsb2dfcmVjb3Zlcl9pdGVtX3QgKnJfaXRlbXE7CQkvKiBxIGZvciBpdGVtcyAqLworfSB4bG9nX3JlY292ZXJfdDsKKworI2RlZmluZSBJVEVNX1RZUEUoaSkJKCoodXNob3J0ICopKGkpLT5yaV9idWZbMF0uaV9hZGRyKQorCisvKgorICogVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGxfYnVmX2NhbmNlbF90YWJsZSB1c2VkIGR1cmluZworICogcmVjb3ZlcnkuCisgKi8KKyNkZWZpbmUJWExPR19CQ19UQUJMRV9TSVpFCTY0CisKKyNkZWZpbmUJWExPR19SRUNPVkVSX1BBU1MxCTEKKyNkZWZpbmUJWExPR19SRUNPVkVSX1BBU1MyCTIKKworI2VuZGlmCS8qIF9fWEZTX0xPR19SRUNPVkVSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19tYWMuaCBiL2ZzL3hmcy94ZnNfbWFjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ1OWFhZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfbWFjLmgKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX01BQ19IX18KKyNkZWZpbmUgX19YRlNfTUFDX0hfXworCisvKgorICogTWFuZGF0b3J5IEFjY2VzcyBDb250cm9sCisgKgorICogTGF5b3V0IG9mIGEgY29tcG9zaXRlIE1BQyBsYWJlbDoKKyAqIG1sX2xpc3QgY29udGFpbnMgdGhlIGxpc3Qgb2YgY2F0ZWdvcmllcyAoTVNFTikgZm9sbG93ZWQgYnkgdGhlIGxpc3Qgb2YKKyAqIGRpdmlzaW9ucyAoTUlOVCkuIFRoaXMgaXMgYWN0dWFsbHkgYSBoZWFkZXIgZm9yIHRoZSBkYXRhIHN0cnVjdHVyZSB3aGljaAorICogd2lsbCBoYXZlIGFuIG1sX2xpc3Qgd2l0aCBtb3JlIHRoYW4gb25lIGVsZW1lbnQuCisgKgorICogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgIHwgbWxfbXNlbl90eXBlIHwgbWxfbWludF90eXBlIHwKKyAqICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgICB8IG1sX2xldmVsICAgICB8IG1sX2dyYWRlICAgICB8CisgKiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICAgfCBtbF9jYXRjb3VudCAgICAgICAgICAgICAgICAgfAorICogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgIHwgbWxfZGl2Y291bnQgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgICB8IGNhdGVnb3J5IDEgICAgICAgICAgICAgICAgICB8CisgKiAgICAgIHwgLiAuIC4gICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgfCBjYXRlZ29yeSBOICAgICAgICAgICAgICAgICAgfCAod2hlcmUgTiA9IG1sX2NhdGNvdW50KQorICogICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgIHwgZGl2aXNpb24gMSAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgfCAuIC4gLiAgICAgICAgICAgICAgICAgICAgICAgfAorICogICAgICB8IGRpdmlzaW9uIE0gICAgICAgICAgICAgICAgICB8ICh3aGVyZSBNID0gbWxfZGl2Y291bnQpCisgKiAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2RlZmluZSBYRlNfTUFDX01BWF9TRVRTCTI1MAordHlwZWRlZiBzdHJ1Y3QgeGZzX21hY19sYWJlbCB7CisJX191aW50OF90CW1sX21zZW5fdHlwZTsJLyogTVNFTiBsYWJlbCB0eXBlICovCisJX191aW50OF90CW1sX21pbnRfdHlwZTsJLyogTUlOVCBsYWJlbCB0eXBlICovCisJX191aW50OF90CW1sX2xldmVsOwkvKiBIaWVyYXJjaGljYWwgbGV2ZWwgKi8KKwlfX3VpbnQ4X3QJbWxfZ3JhZGU7CS8qIEhpZXJhcmNoaWNhbCBncmFkZSAqLworCV9fdWludDE2X3QJbWxfY2F0Y291bnQ7CS8qIENhdGVnb3J5IGNvdW50ICovCisJX191aW50MTZfdAltbF9kaXZjb3VudDsJLyogRGl2aXNpb24gY291bnQgKi8KKwkJCQkJLyogQ2F0ZWdvcnkgc2V0LCB0aGVuIERpdmlzaW9uIHNldCAqLworCV9fdWludDE2X3QJbWxfbGlzdFtYRlNfTUFDX01BWF9TRVRTXTsKK30geGZzX21hY19sYWJlbF90OworCisvKiBNU0VOIGxhYmVsIHR5cGUgbmFtZXMuIENob29zZSBhbiB1cHBlciBjYXNlIEFTQ0lJIGNoYXJhY3Rlci4gICovCisjZGVmaW5lIFhGU19NU0VOX0FETUlOX0xBQkVMCSdBJwkvKiBBZG1pbjogbG93PGFkbWluICE9IHRjc2VjPGhpZ2ggKi8KKyNkZWZpbmUgWEZTX01TRU5fRVFVQUxfTEFCRUwJJ0UnCS8qIFdpbGRjYXJkIC0gYWx3YXlzIGVxdWFsICovCisjZGVmaW5lIFhGU19NU0VOX0hJR0hfTEFCRUwJJ0gnCS8qIFN5c3RlbSBIaWdoIC0gYWx3YXlzIGRvbWluYXRlcyAqLworI2RlZmluZSBYRlNfTVNFTl9NTERfSElHSF9MQUJFTAknSScJLyogU3lzdGVtIEhpZ2gsIG11bHRpLWxldmVsIGRpciAqLworI2RlZmluZSBYRlNfTVNFTl9MT1dfTEFCRUwJJ0wnCS8qIFN5c3RlbSBMb3cgLSBhbHdheXMgZG9taW5hdGVkICovCisjZGVmaW5lIFhGU19NU0VOX01MRF9MQUJFTAknTScJLyogVENTRUMgbGFiZWwgb24gYSBtdWx0aS1sZXZlbCBkaXIgKi8KKyNkZWZpbmUgWEZTX01TRU5fTUxEX0xPV19MQUJFTAknTicJLyogU3lzdGVtIExvdywgbXVsdGktbGV2ZWwgZGlyICovCisjZGVmaW5lIFhGU19NU0VOX1RDU0VDX0xBQkVMCSdUJwkvKiBUQ1NFQyBsYWJlbCAqLworI2RlZmluZSBYRlNfTVNFTl9VTktOT1dOX0xBQkVMCSdVJwkvKiB1bmtub3duIGxhYmVsICovCisKKy8qIE1JTlQgbGFiZWwgdHlwZSBuYW1lcy4gQ2hvb3NlIGEgbG93ZXIgY2FzZSBBU0NJSSBjaGFyYWN0ZXIuICAqLworI2RlZmluZSBYRlNfTUlOVF9CSUJBX0xBQkVMCSdiJwkvKiBEdWFsIG9mIGEgVENTRUMgbGFiZWwgKi8KKyNkZWZpbmUgWEZTX01JTlRfRVFVQUxfTEFCRUwJJ2UnCS8qIFdpbGRjYXJkIC0gYWx3YXlzIGVxdWFsICovCisjZGVmaW5lIFhGU19NSU5UX0hJR0hfTEFCRUwJJ2gnCS8qIEhpZ2ggR3JhZGUgLSBhbHdheXMgZG9taW5hdGVzICovCisjZGVmaW5lIFhGU19NSU5UX0xPV19MQUJFTAknbCcJLyogTG93IEdyYWRlIC0gYWx3YXlzIGRvbWluYXRlZCAqLworCisvKiBPbi1kaXNrIFhGUyBleHRlbmRlZCBhdHRyaWJ1dGUgbmFtZXMgKi8KKyNkZWZpbmUgU0dJX01BQ19GSUxFCSJTR0lfTUFDX0ZJTEUiCisjZGVmaW5lIFNHSV9NQUNfRklMRV9TSVpFCShzaXplb2YoU0dJX01BQ19GSUxFKS0xKQorCisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpZmRlZiBDT05GSUdfRlNfUE9TSVhfTUFDCisKKy8qIE5PVCBZRVQgSU1QTEVNRU5URUQgKi8KKworI2RlZmluZSBNQUNFWEVDCQkwMDEwMAorI2RlZmluZSBNQUNXUklURQkwMDIwMAorI2RlZmluZSBNQUNSRUFECQkwMDQwMAorCitzdHJ1Y3QgeGZzX2lub2RlOworZXh0ZXJuIGludCAgeGZzX21hY19pYWNjZXNzKHN0cnVjdCB4ZnNfaW5vZGUgKiwgbW9kZV90LCBjcmVkX3QgKik7CisKKyNkZWZpbmUgX01BQ19YRlNfSUFDQ0VTUyhpLG0sYykgKHhmc19tYWNfaWFjY2VzcyhpLG0sYykpCisjZGVmaW5lIF9NQUNfVkFDQ0VTUyh2LGMsbSkJKHhmc19tYWNfdmFjY2Vzcyh2LGMsbSkpCisjZGVmaW5lIF9NQUNfRVhJU1RTCQl4ZnNfbWFjX3ZoYXNsYWJlbAorCisjZWxzZQorI2RlZmluZSBfTUFDX1hGU19JQUNDRVNTKGksbSxjKQkoMCkKKyNkZWZpbmUgX01BQ19WQUNDRVNTKHYsYyxtKQkoMCkKKyNkZWZpbmUgX01BQ19FWElTVFMJCShOVUxMKQorI2VuZGlmCisKKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZgkvKiBfX1hGU19NQUNfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX21hY3Jvcy5jIGIvZnMveGZzL3hmc19tYWNyb3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTRmNDZjCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19tYWNyb3MuYwpAQCAtMCwwICsxLDIxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNkZWZpbmUJWEZTX01BQ1JPX0MKKworI2luY2x1ZGUgInhmcy5oIgorI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2lub2RlX2l0ZW0uaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcC5oIgorI2luY2x1ZGUgInhmc19ydy5oIgorI2luY2x1ZGUgInhmc19sb2dfcHJpdi5oIgorI2luY2x1ZGUgInhmc19kYV9idHJlZS5oIgorI2luY2x1ZGUgInhmc19hdHRyX2xlYWYuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX2xlYWYuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9kYXRhLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfbGVhZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX2Jsb2NrLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfbm9kZS5oIgorI2luY2x1ZGUgInhmc19iaXQuaCIKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fSVNOVUxMRFNUQVJUQkxPQ0spCitpbnQKK2lzbnVsbGRzdGFydGJsb2NrKHhmc19kZnNibm9fdCB4KQoreworCXJldHVybiBJU05VTExEU1RBUlRCTE9DSyh4KTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19JU05VTExTVEFSVEJMT0NLKQoraW50Citpc251bGxzdGFydGJsb2NrKHhmc19mc2Jsb2NrX3QgeCkKK3sKKwlyZXR1cm4gSVNOVUxMU1RBUlRCTE9DSyh4KTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19OVUxMU1RBUlRCTE9DSykKK3hmc19mc2Jsb2NrX3QKK251bGxzdGFydGJsb2NrKGludCBrKQoreworCXJldHVybiBOVUxMU1RBUlRCTE9DSyhrKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19TVEFSVEJMT0NLVkFMKQoreGZzX2ZpbGJsa3NfdAorc3RhcnRibG9ja3ZhbCh4ZnNfZnNibG9ja190IHgpCit7CisJcmV0dXJuIFNUQVJUQkxPQ0tWQUwoeCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0FHX0NIRUNLX0RBRERSKQordm9pZAoreGZzX2FnX2NoZWNrX2RhZGRyKHhmc19tb3VudF90ICptcCwgeGZzX2RhZGRyX3QgZCwgeGZzX2V4dGxlbl90IGxlbikKK3sKKwlYRlNfQUdfQ0hFQ0tfREFERFIobXAsIGQsIGxlbik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0FHX0RBRERSKQoreGZzX2RhZGRyX3QKK3hmc19hZ19kYWRkcih4ZnNfbW91bnRfdCAqbXAsIHhmc19hZ251bWJlcl90IGFnbm8sIHhmc19kYWRkcl90IGQpCit7CisJcmV0dXJuIFhGU19BR19EQUREUihtcCwgYWdubywgZCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0FHX01BWExFVkVMUykKK2ludAoreGZzX2FnX21heGxldmVscyh4ZnNfbW91bnRfdCAqbXApCit7CisJcmV0dXJuIFhGU19BR19NQVhMRVZFTFMobXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BR0JfVE9fREFERFIpCit4ZnNfZGFkZHJfdAoreGZzX2FnYl90b19kYWRkcih4ZnNfbW91bnRfdCAqbXAsIHhmc19hZ251bWJlcl90IGFnbm8sIHhmc19hZ2Jsb2NrX3QgYWdibm8pCit7CisJcmV0dXJuIFhGU19BR0JfVE9fREFERFIobXAsIGFnbm8sIGFnYm5vKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQUdCX1RPX0ZTQikKK3hmc19mc2Jsb2NrX3QKK3hmc19hZ2JfdG9fZnNiKHhmc19tb3VudF90ICptcCwgeGZzX2FnbnVtYmVyX3QgYWdubywgeGZzX2FnYmxvY2tfdCBhZ2JubykKK3sKKwlyZXR1cm4gWEZTX0FHQl9UT19GU0IobXAsIGFnbm8sIGFnYm5vKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQUdCTE9DS19NQVgpCit4ZnNfYWdibG9ja190Cit4ZnNfYWdibG9ja19tYXgoeGZzX2FnYmxvY2tfdCBhLCB4ZnNfYWdibG9ja190IGIpCit7CisJcmV0dXJuIFhGU19BR0JMT0NLX01BWChhLCBiKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQUdCTE9DS19NSU4pCit4ZnNfYWdibG9ja190Cit4ZnNfYWdibG9ja19taW4oeGZzX2FnYmxvY2tfdCBhLCB4ZnNfYWdibG9ja190IGIpCit7CisJcmV0dXJuIFhGU19BR0JMT0NLX01JTihhLCBiKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQUdGX0JMT0NLKQoreGZzX2FnYmxvY2tfdAoreGZzX2FnZl9ibG9jayh4ZnNfbW91bnRfdCAqbXApCit7CisJcmV0dXJuIFhGU19BR0ZfQkxPQ0sobXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BR0ZfR09PRF9WRVJTSU9OKQoraW50Cit4ZnNfYWdmX2dvb2RfdmVyc2lvbih1bnNpZ25lZCB2KQoreworCXJldHVybiBYRlNfQUdGX0dPT0RfVkVSU0lPTih2KTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQUdGTF9CTE9DSykKK3hmc19hZ2Jsb2NrX3QKK3hmc19hZ2ZsX2Jsb2NrKHhmc19tb3VudF90ICptcCkKK3sKKwlyZXR1cm4gWEZTX0FHRkxfQkxPQ0sobXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BR0lfQkxPQ0spCit4ZnNfYWdibG9ja190Cit4ZnNfYWdpX2Jsb2NrKHhmc19tb3VudF90ICptcCkKK3sKKwlyZXR1cm4gWEZTX0FHSV9CTE9DSyhtcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0FHSV9HT09EX1ZFUlNJT04pCitpbnQKK3hmc19hZ2lfZ29vZF92ZXJzaW9uKHVuc2lnbmVkIHYpCit7CisJcmV0dXJuIFhGU19BR0lfR09PRF9WRVJTSU9OKHYpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BR0lOT19UT19BR0JOTykKK3hmc19hZ2Jsb2NrX3QKK3hmc19hZ2lub190b19hZ2Jubyh4ZnNfbW91bnRfdCAqbXAsIHhmc19hZ2lub190IGkpCit7CisJcmV0dXJuIFhGU19BR0lOT19UT19BR0JOTyhtcCwgaSk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0FHSU5PX1RPX0lOTykKK3hmc19pbm9fdAoreGZzX2FnaW5vX3RvX2lubyh4ZnNfbW91bnRfdCAqbXAsIHhmc19hZ251bWJlcl90IGEsIHhmc19hZ2lub190IGkpCit7CisJcmV0dXJuIFhGU19BR0lOT19UT19JTk8obXAsIGEsIGkpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BR0lOT19UT19PRkZTRVQpCitpbnQKK3hmc19hZ2lub190b19vZmZzZXQoeGZzX21vdW50X3QgKm1wLCB4ZnNfYWdpbm9fdCBpKQoreworCXJldHVybiBYRlNfQUdJTk9fVE9fT0ZGU0VUKG1wLCBpKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQUxMT0NfQkxPQ0tfTUFYUkVDUykKK2ludAoreGZzX2FsbG9jX2Jsb2NrX21heHJlY3MoaW50IGxldiwgeGZzX2J0cmVlX2N1cl90ICpjdXIpCit7CisJcmV0dXJuIFhGU19BTExPQ19CTE9DS19NQVhSRUNTKGxldiwgY3VyKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQUxMT0NfQkxPQ0tfTUlOUkVDUykKK2ludAoreGZzX2FsbG9jX2Jsb2NrX21pbnJlY3MoaW50IGxldiwgeGZzX2J0cmVlX2N1cl90ICpjdXIpCit7CisJcmV0dXJuIFhGU19BTExPQ19CTE9DS19NSU5SRUNTKGxldiwgY3VyKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQUxMT0NfQkxPQ0tfU0laRSkKKy8qQVJHU1VTRUQxKi8KK2ludAoreGZzX2FsbG9jX2Jsb2NrX3NpemUoaW50IGxldiwgeGZzX2J0cmVlX2N1cl90ICpjdXIpCit7CisJcmV0dXJuIFhGU19BTExPQ19CTE9DS19TSVpFKGxldiwgY3VyKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQUxMT0NfS0VZX0FERFIpCisvKkFSR1NVU0VEMyovCit4ZnNfYWxsb2Nfa2V5X3QgKgoreGZzX2FsbG9jX2tleV9hZGRyKHhmc19hbGxvY19ibG9ja190ICpiYiwgaW50IGksIHhmc19idHJlZV9jdXJfdCAqY3VyKQoreworCXJldHVybiBYRlNfQUxMT0NfS0VZX0FERFIoYmIsIGksIGN1cik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0FMTE9DX1BUUl9BRERSKQoreGZzX2FsbG9jX3B0cl90ICoKK3hmc19hbGxvY19wdHJfYWRkcih4ZnNfYWxsb2NfYmxvY2tfdCAqYmIsIGludCBpLCB4ZnNfYnRyZWVfY3VyX3QgKmN1cikKK3sKKwlyZXR1cm4gWEZTX0FMTE9DX1BUUl9BRERSKGJiLCBpLCBjdXIpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BTExPQ19SRUNfQUREUikKKy8qQVJHU1VTRUQzKi8KK3hmc19hbGxvY19yZWNfdCAqCit4ZnNfYWxsb2NfcmVjX2FkZHIoeGZzX2FsbG9jX2Jsb2NrX3QgKmJiLCBpbnQgaSwgeGZzX2J0cmVlX2N1cl90ICpjdXIpCit7CisJcmV0dXJuIFhGU19BTExPQ19SRUNfQUREUihiYiwgaSwgY3VyKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQVRUUl9MRUFGX0VOVFNJWkVfTE9DQUwpCitpbnQKK3hmc19hdHRyX2xlYWZfZW50c2l6ZV9sb2NhbChpbnQgbmxlbiwgaW50IHZsZW4pCit7CisJcmV0dXJuIFhGU19BVFRSX0xFQUZfRU5UU0laRV9MT0NBTChubGVuLCB2bGVuKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQVRUUl9MRUFGX0VOVFNJWkVfTE9DQUxfTUFYKQoraW50Cit4ZnNfYXR0cl9sZWFmX2VudHNpemVfbG9jYWxfbWF4KGludCBic2l6ZSkKK3sKKwlyZXR1cm4gWEZTX0FUVFJfTEVBRl9FTlRTSVpFX0xPQ0FMX01BWChic2l6ZSk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0FUVFJfTEVBRl9FTlRTSVpFX1JFTU9URSkKK2ludAoreGZzX2F0dHJfbGVhZl9lbnRzaXplX3JlbW90ZShpbnQgbmxlbikKK3sKKwlyZXR1cm4gWEZTX0FUVFJfTEVBRl9FTlRTSVpFX1JFTU9URShubGVuKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQVRUUl9MRUFGX05BTUUpCitjaGFyICoKK3hmc19hdHRyX2xlYWZfbmFtZSh4ZnNfYXR0cl9sZWFmYmxvY2tfdCAqbGVhZnAsIGludCBpZHgpCit7CisJcmV0dXJuIFhGU19BVFRSX0xFQUZfTkFNRShsZWFmcCwgaWR4KTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQVRUUl9MRUFGX05BTUVfTE9DQUwpCit4ZnNfYXR0cl9sZWFmX25hbWVfbG9jYWxfdCAqCit4ZnNfYXR0cl9sZWFmX25hbWVfbG9jYWwoeGZzX2F0dHJfbGVhZmJsb2NrX3QgKmxlYWZwLCBpbnQgaWR4KQoreworCXJldHVybiBYRlNfQVRUUl9MRUFGX05BTUVfTE9DQUwobGVhZnAsIGlkeCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0FUVFJfTEVBRl9OQU1FX1JFTU9URSkKK3hmc19hdHRyX2xlYWZfbmFtZV9yZW1vdGVfdCAqCit4ZnNfYXR0cl9sZWFmX25hbWVfcmVtb3RlKHhmc19hdHRyX2xlYWZibG9ja190ICpsZWFmcCwgaW50IGlkeCkKK3sKKwlyZXR1cm4gWEZTX0FUVFJfTEVBRl9OQU1FX1JFTU9URShsZWFmcCwgaWR4KTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQVRUUl9TRl9FTlRTSVpFKQoraW50Cit4ZnNfYXR0cl9zZl9lbnRzaXplKHhmc19hdHRyX3NmX2VudHJ5X3QgKnNmZXApCit7CisJcmV0dXJuIFhGU19BVFRSX1NGX0VOVFNJWkUoc2ZlcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0FUVFJfU0ZfRU5UU0laRV9CWU5BTUUpCitpbnQKK3hmc19hdHRyX3NmX2VudHNpemVfYnluYW1lKGludCBubGVuLCBpbnQgdmxlbikKK3sKKwlyZXR1cm4gWEZTX0FUVFJfU0ZfRU5UU0laRV9CWU5BTUUobmxlbiwgdmxlbik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0FUVFJfU0ZfTkVYVEVOVFJZKQoreGZzX2F0dHJfc2ZfZW50cnlfdCAqCit4ZnNfYXR0cl9zZl9uZXh0ZW50cnkoeGZzX2F0dHJfc2ZfZW50cnlfdCAqc2ZlcCkKK3sKKwlyZXR1cm4gWEZTX0FUVFJfU0ZfTkVYVEVOVFJZKHNmZXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19BVFRSX1NGX1RPVFNJWkUpCitpbnQKK3hmc19hdHRyX3NmX3RvdHNpemUoeGZzX2lub2RlX3QgKmRwKQoreworCXJldHVybiBYRlNfQVRUUl9TRl9UT1RTSVpFKGRwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQkhWVE9JKQoreGZzX2lub2RlX3QgKgoreGZzX2JodnRvaShiaHZfZGVzY190ICpiaHZwKQoreworCXJldHVybiBYRlNfQkhWVE9JKGJodnApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CSFZUT00pCit4ZnNfbW91bnRfdCAqCit4ZnNfYmh2dG9tKGJodl9kZXNjX3QgKmJkcCkKK3sKKwlyZXR1cm4gWEZTX0JIVlRPTShiZHApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19WRlNUT00pCit4ZnNfbW91bnRfdCAqCit4ZnNfdmZzdG9tKHZmc190ICp2ZnMpCit7CisJcmV0dXJuIFhGU19WRlNUT00odmZzKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQk1fTUFYTEVWRUxTKQoraW50Cit4ZnNfYm1fbWF4bGV2ZWxzKHhmc19tb3VudF90ICptcCwgaW50IHcpCit7CisJcmV0dXJuIFhGU19CTV9NQVhMRVZFTFMobXAsIHcpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CTUFQX0JMT0NLX0RNQVhSRUNTKQoraW50Cit4ZnNfYm1hcF9ibG9ja19kbWF4cmVjcyhpbnQgbGV2LCB4ZnNfYnRyZWVfY3VyX3QgKmN1cikKK3sKKwlyZXR1cm4gWEZTX0JNQVBfQkxPQ0tfRE1BWFJFQ1MobGV2LCBjdXIpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CTUFQX0JMT0NLX0RNSU5SRUNTKQoraW50Cit4ZnNfYm1hcF9ibG9ja19kbWlucmVjcyhpbnQgbGV2LCB4ZnNfYnRyZWVfY3VyX3QgKmN1cikKK3sKKwlyZXR1cm4gWEZTX0JNQVBfQkxPQ0tfRE1JTlJFQ1MobGV2LCBjdXIpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CTUFQX0JMT0NLX0RTSVpFKQoraW50Cit4ZnNfYm1hcF9ibG9ja19kc2l6ZShpbnQgbGV2LCB4ZnNfYnRyZWVfY3VyX3QgKmN1cikKK3sKKwlyZXR1cm4gWEZTX0JNQVBfQkxPQ0tfRFNJWkUobGV2LCBjdXIpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CTUFQX0JMT0NLX0lNQVhSRUNTKQoraW50Cit4ZnNfYm1hcF9ibG9ja19pbWF4cmVjcyhpbnQgbGV2LCB4ZnNfYnRyZWVfY3VyX3QgKmN1cikKK3sKKwlyZXR1cm4gWEZTX0JNQVBfQkxPQ0tfSU1BWFJFQ1MobGV2LCBjdXIpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CTUFQX0JMT0NLX0lNSU5SRUNTKQoraW50Cit4ZnNfYm1hcF9ibG9ja19pbWlucmVjcyhpbnQgbGV2LCB4ZnNfYnRyZWVfY3VyX3QgKmN1cikKK3sKKwlyZXR1cm4gWEZTX0JNQVBfQkxPQ0tfSU1JTlJFQ1MobGV2LCBjdXIpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CTUFQX0JMT0NLX0lTSVpFKQoraW50Cit4ZnNfYm1hcF9ibG9ja19pc2l6ZShpbnQgbGV2LCB4ZnNfYnRyZWVfY3VyX3QgKmN1cikKK3sKKwlyZXR1cm4gWEZTX0JNQVBfQkxPQ0tfSVNJWkUobGV2LCBjdXIpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CTUFQX0JST09UX0tFWV9BRERSKQorLypBUkdTVVNFRDMqLworeGZzX2JtYnRfa2V5X3QgKgoreGZzX2JtYXBfYnJvb3Rfa2V5X2FkZHIoeGZzX2JtYnRfYmxvY2tfdCAqYmIsIGludCBpLCBpbnQgc3opCit7CisJcmV0dXJuIFhGU19CTUFQX0JST09UX0tFWV9BRERSKGJiLCBpLCBzeik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JNQVBfQlJPT1RfTUFYUkVDUykKK2ludAoreGZzX2JtYXBfYnJvb3RfbWF4cmVjcyhpbnQgc3opCit7CisJcmV0dXJuIFhGU19CTUFQX0JST09UX01BWFJFQ1Moc3opOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CTUFQX0JST09UX05VTVJFQ1MpCitpbnQKK3hmc19ibWFwX2Jyb290X251bXJlY3MoeGZzX2JtZHJfYmxvY2tfdCAqYmIpCit7CisJcmV0dXJuIFhGU19CTUFQX0JST09UX05VTVJFQ1MoYmIpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CTUFQX0JST09UX1BUUl9BRERSKQoreGZzX2JtYnRfcHRyX3QgKgoreGZzX2JtYXBfYnJvb3RfcHRyX2FkZHIoeGZzX2JtYnRfYmxvY2tfdCAqYmIsIGludCBpLCBpbnQgc3opCit7CisJcmV0dXJuIFhGU19CTUFQX0JST09UX1BUUl9BRERSKGJiLCBpLCBzeik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JNQVBfQlJPT1RfUkVDX0FERFIpCisvKkFSR1NVU0VEMyovCit4ZnNfYm1idF9yZWNfdCAqCit4ZnNfYm1hcF9icm9vdF9yZWNfYWRkcih4ZnNfYm1idF9ibG9ja190ICpiYiwgaW50IGksIGludCBzeikKK3sKKwlyZXR1cm4gWEZTX0JNQVBfQlJPT1RfUkVDX0FERFIoYmIsIGksIHN6KTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQk1BUF9CUk9PVF9TUEFDRSkKK2ludAoreGZzX2JtYXBfYnJvb3Rfc3BhY2UoeGZzX2JtZHJfYmxvY2tfdCAqYmIpCit7CisJcmV0dXJuIFhGU19CTUFQX0JST09UX1NQQUNFKGJiKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQk1BUF9CUk9PVF9TUEFDRV9DQUxDKQoraW50Cit4ZnNfYm1hcF9icm9vdF9zcGFjZV9jYWxjKGludCBucmVjcykKK3sKKwlyZXR1cm4gWEZTX0JNQVBfQlJPT1RfU1BBQ0VfQ0FMQyhucmVjcyk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JNQVBfSUJMT0NLX1NJWkUpCisvKkFSR1NVU0VEMSovCitpbnQKK3hmc19ibWFwX2libG9ja19zaXplKGludCBsZXYsIHhmc19idHJlZV9jdXJfdCAqY3VyKQoreworCXJldHVybiBYRlNfQk1BUF9JQkxPQ0tfU0laRShsZXYsIGN1cik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JNQVBfSU5JVCkKK3ZvaWQKK3hmc19ibWFwX2luaXQoeGZzX2JtYXBfZnJlZV90ICpmbHAsIHhmc19mc2Jsb2NrX3QgKmZicCkKK3sKKwlYRlNfQk1BUF9JTklUKGZscCwgZmJwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQk1BUF9LRVlfREFERFIpCisvKkFSR1NVU0VEMyovCit4ZnNfYm1idF9rZXlfdCAqCit4ZnNfYm1hcF9rZXlfZGFkZHIoeGZzX2JtYnRfYmxvY2tfdCAqYmIsIGludCBpLCB4ZnNfYnRyZWVfY3VyX3QgKmN1cikKK3sKKwlyZXR1cm4gWEZTX0JNQVBfS0VZX0RBRERSKGJiLCBpLCBjdXIpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CTUFQX0tFWV9JQUREUikKKy8qQVJHU1VTRUQzKi8KK3hmc19ibWJ0X2tleV90ICoKK3hmc19ibWFwX2tleV9pYWRkcih4ZnNfYm1idF9ibG9ja190ICpiYiwgaW50IGksIHhmc19idHJlZV9jdXJfdCAqY3VyKQoreworCXJldHVybiBYRlNfQk1BUF9LRVlfSUFERFIoYmIsIGksIGN1cik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JNQVBfUFRSX0RBRERSKQoreGZzX2JtYnRfcHRyX3QgKgoreGZzX2JtYXBfcHRyX2RhZGRyKHhmc19ibWJ0X2Jsb2NrX3QgKmJiLCBpbnQgaSwgeGZzX2J0cmVlX2N1cl90ICpjdXIpCit7CisJcmV0dXJuIFhGU19CTUFQX1BUUl9EQUREUihiYiwgaSwgY3VyKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQk1BUF9QVFJfSUFERFIpCit4ZnNfYm1idF9wdHJfdCAqCit4ZnNfYm1hcF9wdHJfaWFkZHIoeGZzX2JtYnRfYmxvY2tfdCAqYmIsIGludCBpLCB4ZnNfYnRyZWVfY3VyX3QgKmN1cikKK3sKKwlyZXR1cm4gWEZTX0JNQVBfUFRSX0lBRERSKGJiLCBpLCBjdXIpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CTUFQX1JCTE9DS19EU0laRSkKKy8qQVJHU1VTRUQxKi8KK2ludAoreGZzX2JtYXBfcmJsb2NrX2RzaXplKGludCBsZXYsIHhmc19idHJlZV9jdXJfdCAqY3VyKQoreworCXJldHVybiBYRlNfQk1BUF9SQkxPQ0tfRFNJWkUobGV2LCBjdXIpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CTUFQX1JCTE9DS19JU0laRSkKKy8qQVJHU1VTRUQxKi8KK2ludAoreGZzX2JtYXBfcmJsb2NrX2lzaXplKGludCBsZXYsIHhmc19idHJlZV9jdXJfdCAqY3VyKQoreworCXJldHVybiBYRlNfQk1BUF9SQkxPQ0tfSVNJWkUobGV2LCBjdXIpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CTUFQX1JFQ19EQUREUikKKy8qQVJHU1VTRUQzKi8KK3hmc19ibWJ0X3JlY190ICoKK3hmc19ibWFwX3JlY19kYWRkcih4ZnNfYm1idF9ibG9ja190ICpiYiwgaW50IGksIHhmc19idHJlZV9jdXJfdCAqY3VyKQoreworCXJldHVybiBYRlNfQk1BUF9SRUNfREFERFIoYmIsIGksIGN1cik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JNQVBfUkVDX0lBRERSKQorLypBUkdTVVNFRDMqLworeGZzX2JtYnRfcmVjX3QgKgoreGZzX2JtYXBfcmVjX2lhZGRyKHhmc19ibWJ0X2Jsb2NrX3QgKmJiLCBpbnQgaSwgeGZzX2J0cmVlX2N1cl90ICpjdXIpCit7CisJcmV0dXJuIFhGU19CTUFQX1JFQ19JQUREUihiYiwgaSwgY3VyKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQk1BUF9TQU5JVFlfQ0hFQ0spCitpbnQKK3hmc19ibWFwX3Nhbml0eV9jaGVjayh4ZnNfbW91bnRfdCAqbXAsIHhmc19ibWJ0X2Jsb2NrX3QgKmJiLCBpbnQgbGV2ZWwpCit7CisJcmV0dXJuIFhGU19CTUFQX1NBTklUWV9DSEVDSyhtcCwgYmIsIGxldmVsKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQk1BUElfQUZMQUcpCitpbnQKK3hmc19ibWFwaV9hZmxhZyhpbnQgdykKK3sKKwlyZXR1cm4gWEZTX0JNQVBJX0FGTEFHKHcpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CTURSX1NQQUNFX0NBTEMpCitpbnQKK3hmc19ibWRyX3NwYWNlX2NhbGMoaW50IG5yZWNzKQoreworCXJldHVybiBYRlNfQk1EUl9TUEFDRV9DQUxDKG5yZWNzKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQk5PX0JMT0NLKQoreGZzX2FnYmxvY2tfdAoreGZzX2Jub19ibG9jayh4ZnNfbW91bnRfdCAqbXApCit7CisJcmV0dXJuIFhGU19CTk9fQkxPQ0sobXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CVFJFRV9MT05HX1BUUlMpCitpbnQKK3hmc19idHJlZV9sb25nX3B0cnMoeGZzX2J0bnVtX3QgYnRudW0pCit7CisJcmV0dXJuIFhGU19CVFJFRV9MT05HX1BUUlMoYnRudW0pOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CVUZfVE9fQUdGKQoreGZzX2FnZl90ICoKK3hmc19idWZfdG9fYWdmKHhmc19idWZfdCAqYnApCit7CisJcmV0dXJuIFhGU19CVUZfVE9fQUdGKGJwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQlVGX1RPX0FHRkwpCit4ZnNfYWdmbF90ICoKK3hmc19idWZfdG9fYWdmbCh4ZnNfYnVmX3QgKmJwKQoreworCXJldHVybiBYRlNfQlVGX1RPX0FHRkwoYnApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CVUZfVE9fQUdJKQoreGZzX2FnaV90ICoKK3hmc19idWZfdG9fYWdpKHhmc19idWZfdCAqYnApCit7CisJcmV0dXJuIFhGU19CVUZfVE9fQUdJKGJwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQlVGX1RPX0FMTE9DX0JMT0NLKQoreGZzX2FsbG9jX2Jsb2NrX3QgKgoreGZzX2J1Zl90b19hbGxvY19ibG9jayh4ZnNfYnVmX3QgKmJwKQoreworCXJldHVybiBYRlNfQlVGX1RPX0FMTE9DX0JMT0NLKGJwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQlVGX1RPX0JMT0NLKQoreGZzX2J0cmVlX2Jsb2NrX3QgKgoreGZzX2J1Zl90b19ibG9jayh4ZnNfYnVmX3QgKmJwKQoreworCXJldHVybiBYRlNfQlVGX1RPX0JMT0NLKGJwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQlVGX1RPX0JNQlRfQkxPQ0spCit4ZnNfYm1idF9ibG9ja190ICoKK3hmc19idWZfdG9fYm1idF9ibG9jayh4ZnNfYnVmX3QgKmJwKQoreworCXJldHVybiBYRlNfQlVGX1RPX0JNQlRfQkxPQ0soYnApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CVUZfVE9fRElOT0RFKQoreGZzX2Rpbm9kZV90ICoKK3hmc19idWZfdG9fZGlub2RlKHhmc19idWZfdCAqYnApCit7CisJcmV0dXJuIFhGU19CVUZfVE9fRElOT0RFKGJwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQlVGX1RPX0lOT0JUX0JMT0NLKQoreGZzX2lub2J0X2Jsb2NrX3QgKgoreGZzX2J1Zl90b19pbm9idF9ibG9jayh4ZnNfYnVmX3QgKmJwKQoreworCXJldHVybiBYRlNfQlVGX1RPX0lOT0JUX0JMT0NLKGJwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQlVGX1RPX0xCTE9DSykKK3hmc19idHJlZV9sYmxvY2tfdCAqCit4ZnNfYnVmX3RvX2xibG9jayh4ZnNfYnVmX3QgKmJwKQoreworCXJldHVybiBYRlNfQlVGX1RPX0xCTE9DSyhicCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0JVRl9UT19TQkxPQ0spCit4ZnNfYnRyZWVfc2Jsb2NrX3QgKgoreGZzX2J1Zl90b19zYmxvY2soeGZzX2J1Zl90ICpicCkKK3sKKwlyZXR1cm4gWEZTX0JVRl9UT19TQkxPQ0soYnApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19CVUZfVE9fU0JQKQoreGZzX3NiX3QgKgoreGZzX2J1Zl90b19zYnAoeGZzX2J1Zl90ICpicCkKK3sKKwlyZXR1cm4gWEZTX0JVRl9UT19TQlAoYnApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19DRk9SS19BU0laRSkKK2ludAoreGZzX2Nmb3JrX2FzaXplX2Rpc2soeGZzX2Rpbm9kZV9jb3JlX3QgKmRjcCwgeGZzX21vdW50X3QgKm1wKQoreworCXJldHVybiBYRlNfQ0ZPUktfQVNJWkVfRElTSyhkY3AsIG1wKTsKK30KK2ludAoreGZzX2Nmb3JrX2FzaXplKHhmc19kaW5vZGVfY29yZV90ICpkY3AsIHhmc19tb3VudF90ICptcCkKK3sKKwlyZXR1cm4gWEZTX0NGT1JLX0FTSVpFKGRjcCwgbXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19DRk9SS19CT0ZGKQoraW50Cit4ZnNfY2ZvcmtfYm9mZl9kaXNrKHhmc19kaW5vZGVfY29yZV90ICpkY3ApCit7CisJcmV0dXJuIFhGU19DRk9SS19CT0ZGX0RJU0soZGNwKTsKK30KK2ludAoreGZzX2Nmb3JrX2JvZmYoeGZzX2Rpbm9kZV9jb3JlX3QgKmRjcCkKK3sKKwlyZXR1cm4gWEZTX0NGT1JLX0JPRkYoZGNwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQ0ZPUktfRFNJWkUpCitpbnQKK3hmc19jZm9ya19kc2l6ZV9kaXNrKHhmc19kaW5vZGVfY29yZV90ICpkY3AsIHhmc19tb3VudF90ICptcCkKK3sKKwlyZXR1cm4gWEZTX0NGT1JLX0RTSVpFX0RJU0soZGNwLCBtcCk7Cit9CitpbnQKK3hmc19jZm9ya19kc2l6ZSh4ZnNfZGlub2RlX2NvcmVfdCAqZGNwLCB4ZnNfbW91bnRfdCAqbXApCit7CisJcmV0dXJuIFhGU19DRk9SS19EU0laRShkY3AsIG1wKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQ0ZPUktfRk1UX1NFVCkKK3ZvaWQKK3hmc19jZm9ya19mbXRfc2V0KHhmc19kaW5vZGVfY29yZV90ICpkY3AsIGludCB3LCBpbnQgbikKK3sKKwlYRlNfQ0ZPUktfRk1UX1NFVChkY3AsIHcsIG4pOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19DRk9SS19GT1JNQVQpCitpbnQKK3hmc19jZm9ya19mb3JtYXQoeGZzX2Rpbm9kZV9jb3JlX3QgKmRjcCwgaW50IHcpCit7CisJcmV0dXJuIFhGU19DRk9SS19GT1JNQVQoZGNwLCB3KTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfQ0ZPUktfTkVYVF9TRVQpCit2b2lkCit4ZnNfY2ZvcmtfbmV4dF9zZXQoeGZzX2Rpbm9kZV9jb3JlX3QgKmRjcCwgaW50IHcsIGludCBuKQoreworCVhGU19DRk9SS19ORVhUX1NFVChkY3AsIHcsIG4pOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19DRk9SS19ORVhURU5UUykKK2ludAoreGZzX2Nmb3JrX25leHRlbnRzX2Rpc2soeGZzX2Rpbm9kZV9jb3JlX3QgKmRjcCwgaW50IHcpCit7CisJcmV0dXJuIFhGU19DRk9SS19ORVhURU5UU19ESVNLKGRjcCwgdyk7Cit9CitpbnQKK3hmc19jZm9ya19uZXh0ZW50cyh4ZnNfZGlub2RlX2NvcmVfdCAqZGNwLCBpbnQgdykKK3sKKwlyZXR1cm4gWEZTX0NGT1JLX05FWFRFTlRTKGRjcCwgdyk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0NGT1JLX1EpCitpbnQKK3hmc19jZm9ya19xX2Rpc2soeGZzX2Rpbm9kZV9jb3JlX3QgKmRjcCkKK3sKKwlyZXR1cm4gWEZTX0NGT1JLX1FfRElTSyhkY3ApOworfQoraW50Cit4ZnNfY2ZvcmtfcSh4ZnNfZGlub2RlX2NvcmVfdCAqZGNwKQoreworCXJldHVybiBYRlNfQ0ZPUktfUShkY3ApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19DRk9SS19TSVpFKQoraW50Cit4ZnNfY2Zvcmtfc2l6ZV9kaXNrKHhmc19kaW5vZGVfY29yZV90ICpkY3AsIHhmc19tb3VudF90ICptcCwgaW50IHcpCit7CisJcmV0dXJuIFhGU19DRk9SS19TSVpFX0RJU0soZGNwLCBtcCwgdyk7Cit9CitpbnQKK3hmc19jZm9ya19zaXplKHhmc19kaW5vZGVfY29yZV90ICpkY3AsIHhmc19tb3VudF90ICptcCwgaW50IHcpCit7CisJcmV0dXJuIFhGU19DRk9SS19TSVpFKGRjcCwgbXAsIHcpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19DTlRfQkxPQ0spCit4ZnNfYWdibG9ja190Cit4ZnNfY250X2Jsb2NrKHhmc19tb3VudF90ICptcCkKK3sKKwlyZXR1cm4gWEZTX0NOVF9CTE9DSyhtcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RBX0NPT0tJRV9CTk8pCit4ZnNfZGFibGtfdAoreGZzX2RhX2Nvb2tpZV9ibm8oeGZzX21vdW50X3QgKm1wLCB4ZnNfb2ZmX3QgY29va2llKQoreworCXJldHVybiBYRlNfREFfQ09PS0lFX0JOTyhtcCwgY29va2llKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfREFfQ09PS0lFX0VOVFJZKQoraW50Cit4ZnNfZGFfY29va2llX2VudHJ5KHhmc19tb3VudF90ICptcCwgeGZzX29mZl90IGNvb2tpZSkKK3sKKwlyZXR1cm4gWEZTX0RBX0NPT0tJRV9FTlRSWShtcCwgY29va2llKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfREFfQ09PS0lFX0hBU0gpCisvKkFSR1NVU0VEMSovCit4ZnNfZGFoYXNoX3QKK3hmc19kYV9jb29raWVfaGFzaCh4ZnNfbW91bnRfdCAqbXAsIHhmc19vZmZfdCBjb29raWUpCit7CisJcmV0dXJuIFhGU19EQV9DT09LSUVfSEFTSChtcCwgY29va2llKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfREFfTUFLRV9CTk9FTlRSWSkKK19fdWludDMyX3QKK3hmc19kYV9tYWtlX2Jub2VudHJ5KHhmc19tb3VudF90ICptcCwgeGZzX2RhYmxrX3QgYm5vLCBpbnQgZW50cnkpCit7CisJcmV0dXJuIFhGU19EQV9NQUtFX0JOT0VOVFJZKG1wLCBibm8sIGVudHJ5KTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfREFfTUFLRV9DT09LSUUpCit4ZnNfb2ZmX3QKK3hmc19kYV9tYWtlX2Nvb2tpZSh4ZnNfbW91bnRfdCAqbXAsIHhmc19kYWJsa190IGJubywgaW50IGVudHJ5LAorCQkgICB4ZnNfZGFoYXNoX3QgaGFzaCkKK3sKKwlyZXR1cm4gWEZTX0RBX01BS0VfQ09PS0lFKG1wLCBibm8sIGVudHJ5LCBoYXNoKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfREFERFJfVE9fQUdCTk8pCit4ZnNfYWdibG9ja190Cit4ZnNfZGFkZHJfdG9fYWdibm8oeGZzX21vdW50X3QgKm1wLCB4ZnNfZGFkZHJfdCBkKQoreworCXJldHVybiBYRlNfREFERFJfVE9fQUdCTk8obXAsIGQpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19EQUREUl9UT19BR05PKQoreGZzX2FnbnVtYmVyX3QKK3hmc19kYWRkcl90b19hZ25vKHhmc19tb3VudF90ICptcCwgeGZzX2RhZGRyX3QgZCkKK3sKKwlyZXR1cm4gWEZTX0RBRERSX1RPX0FHTk8obXAsIGQpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19EQUREUl9UT19GU0IpCit4ZnNfZnNibG9ja190Cit4ZnNfZGFkZHJfdG9fZnNiKHhmc19tb3VudF90ICptcCwgeGZzX2RhZGRyX3QgZCkKK3sKKwlyZXR1cm4gWEZTX0RBRERSX1RPX0ZTQihtcCwgZCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RGT1JLX0FQVFIpCitjaGFyICoKK3hmc19kZm9ya19hcHRyKHhmc19kaW5vZGVfdCAqZGlwKQoreworCXJldHVybiBYRlNfREZPUktfQVBUUihkaXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ERk9SS19BU0laRSkKK2ludAoreGZzX2Rmb3JrX2FzaXplKHhmc19kaW5vZGVfdCAqZGlwLCB4ZnNfbW91bnRfdCAqbXApCit7CisJcmV0dXJuIFhGU19ERk9SS19BU0laRShkaXAsIG1wKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfREZPUktfQk9GRikKK2ludAoreGZzX2Rmb3JrX2JvZmYoeGZzX2Rpbm9kZV90ICpkaXApCit7CisJcmV0dXJuIFhGU19ERk9SS19CT0ZGKGRpcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RGT1JLX0RQVFIpCitjaGFyICoKK3hmc19kZm9ya19kcHRyKHhmc19kaW5vZGVfdCAqZGlwKQoreworCXJldHVybiBYRlNfREZPUktfRFBUUihkaXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ERk9SS19EU0laRSkKK2ludAoreGZzX2Rmb3JrX2RzaXplKHhmc19kaW5vZGVfdCAqZGlwLCB4ZnNfbW91bnRfdCAqbXApCit7CisJcmV0dXJuIFhGU19ERk9SS19EU0laRShkaXAsIG1wKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfREZPUktfTkVYVEVOVFMpCitpbnQKK3hmc19kZm9ya19uZXh0ZW50cyh4ZnNfZGlub2RlX3QgKmRpcCwgaW50IHcpCit7CisJcmV0dXJuIFhGU19ERk9SS19ORVhURU5UUyhkaXAsIHcpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ERk9SS19QVFIpCitjaGFyICoKK3hmc19kZm9ya19wdHIoeGZzX2Rpbm9kZV90ICpkaXAsIGludCB3KQoreworCXJldHVybiBYRlNfREZPUktfUFRSKGRpcCwgdyk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RGT1JLX1EpCitpbnQKK3hmc19kZm9ya19xKHhmc19kaW5vZGVfdCAqZGlwKQoreworCXJldHVybiBYRlNfREZPUktfUShkaXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ERk9SS19TSVpFKQoraW50Cit4ZnNfZGZvcmtfc2l6ZSh4ZnNfZGlub2RlX3QgKmRpcCwgeGZzX21vdW50X3QgKm1wLCBpbnQgdykKK3sKKwlyZXR1cm4gWEZTX0RGT1JLX1NJWkUoZGlwLCBtcCwgdyk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJTk9ERV9HT09EX1ZFUlNJT04pCitpbnQKK3hmc19kaW5vZGVfZ29vZF92ZXJzaW9uKGludCB2KQoreworCXJldHVybiBYRlNfRElOT0RFX0dPT0RfVkVSU0lPTih2KTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSX0xFQUZfRU5UU0laRV9CWUVOVFJZKQoraW50Cit4ZnNfZGlyX2xlYWZfZW50c2l6ZV9ieWVudHJ5KHhmc19kaXJfbGVhZl9lbnRyeV90ICplbnRyeSkKK3sKKwlyZXR1cm4gWEZTX0RJUl9MRUFGX0VOVFNJWkVfQllFTlRSWShlbnRyeSk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUl9MRUFGX0VOVFNJWkVfQllOQU1FKQoraW50Cit4ZnNfZGlyX2xlYWZfZW50c2l6ZV9ieW5hbWUoaW50IGxlbikKK3sKKwlyZXR1cm4gWEZTX0RJUl9MRUFGX0VOVFNJWkVfQllOQU1FKGxlbik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUl9MRUFGX05BTUVTVFJVQ1QpCit4ZnNfZGlyX2xlYWZfbmFtZV90ICoKK3hmc19kaXJfbGVhZl9uYW1lc3RydWN0KHhmc19kaXJfbGVhZmJsb2NrX3QgKmxlYWZwLCBpbnQgb2Zmc2V0KQoreworCXJldHVybiBYRlNfRElSX0xFQUZfTkFNRVNUUlVDVChsZWFmcCwgb2Zmc2V0KTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSX1NGX0FMTEZJVCkKK2ludAoreGZzX2Rpcl9zZl9hbGxmaXQoaW50IGNvdW50LCBpbnQgdG90YWxsZW4pCit7CisJcmV0dXJuIFhGU19ESVJfU0ZfQUxMRklUKGNvdW50LCB0b3RhbGxlbik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUl9TRl9FTlRTSVpFX0JZRU5UUlkpCitpbnQKK3hmc19kaXJfc2ZfZW50c2l6ZV9ieWVudHJ5KHhmc19kaXJfc2ZfZW50cnlfdCAqc2ZlcCkKK3sKKwlyZXR1cm4gWEZTX0RJUl9TRl9FTlRTSVpFX0JZRU5UUlkoc2ZlcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUl9TRl9FTlRTSVpFX0JZTkFNRSkKK2ludAoreGZzX2Rpcl9zZl9lbnRzaXplX2J5bmFtZShpbnQgbGVuKQoreworCXJldHVybiBYRlNfRElSX1NGX0VOVFNJWkVfQllOQU1FKGxlbik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUl9TRl9HRVRfRElSSU5PKQordm9pZAoreGZzX2Rpcl9zZl9nZXRfZGlyaW5vKHhmc19kaXJfaW5vX3QgKmZyb20sIHhmc19pbm9fdCAqdG8pCit7CisJWEZTX0RJUl9TRl9HRVRfRElSSU5PKGZyb20sIHRvKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSX1NGX05FWFRFTlRSWSkKK3hmc19kaXJfc2ZfZW50cnlfdCAqCit4ZnNfZGlyX3NmX25leHRlbnRyeSh4ZnNfZGlyX3NmX2VudHJ5X3QgKnNmZXApCit7CisJcmV0dXJuIFhGU19ESVJfU0ZfTkVYVEVOVFJZKHNmZXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ESVJfU0ZfUFVUX0RJUklOTykKK3ZvaWQKK3hmc19kaXJfc2ZfcHV0X2Rpcmlubyh4ZnNfaW5vX3QgKmZyb20sIHhmc19kaXJfaW5vX3QgKnRvKQoreworCVhGU19ESVJfU0ZfUFVUX0RJUklOTyhmcm9tLCB0byk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfQkxPQ0tfTEVBRl9QKQoreGZzX2RpcjJfbGVhZl9lbnRyeV90ICoKK3hmc19kaXIyX2Jsb2NrX2xlYWZfcCh4ZnNfZGlyMl9ibG9ja190YWlsX3QgKmJ0cCkKK3sKKwlyZXR1cm4gWEZTX0RJUjJfQkxPQ0tfTEVBRl9QKGJ0cCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfQkxPQ0tfVEFJTF9QKQoreGZzX2RpcjJfYmxvY2tfdGFpbF90ICoKK3hmc19kaXIyX2Jsb2NrX3RhaWxfcCh4ZnNfbW91bnRfdCAqbXAsIHhmc19kaXIyX2Jsb2NrX3QgKmJsb2NrKQoreworCXJldHVybiBYRlNfRElSMl9CTE9DS19UQUlMX1AobXAsIGJsb2NrKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSMl9CWVRFX1RPX0RBKQoreGZzX2RhYmxrX3QKK3hmc19kaXIyX2J5dGVfdG9fZGEoeGZzX21vdW50X3QgKm1wLCB4ZnNfZGlyMl9vZmZfdCBieSkKK3sKKwlyZXR1cm4gWEZTX0RJUjJfQllURV9UT19EQShtcCwgYnkpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ESVIyX0JZVEVfVE9fREFUQVBUUikKKy8qIEFSR1NVU0VEICovCit4ZnNfZGlyMl9kYXRhcHRyX3QKK3hmc19kaXIyX2J5dGVfdG9fZGF0YXB0cih4ZnNfbW91bnRfdCAqbXAsIHhmc19kaXIyX29mZl90IGJ5KQoreworCXJldHVybiBYRlNfRElSMl9CWVRFX1RPX0RBVEFQVFIobXAsIGJ5KTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSMl9CWVRFX1RPX0RCKQoreGZzX2RpcjJfZGJfdAoreGZzX2RpcjJfYnl0ZV90b19kYih4ZnNfbW91bnRfdCAqbXAsIHhmc19kaXIyX29mZl90IGJ5KQoreworCXJldHVybiBYRlNfRElSMl9CWVRFX1RPX0RCKG1wLCBieSk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfQllURV9UT19PRkYpCit4ZnNfZGlyMl9kYXRhX2FvZmZfdAoreGZzX2RpcjJfYnl0ZV90b19vZmYoeGZzX21vdW50X3QgKm1wLCB4ZnNfZGlyMl9vZmZfdCBieSkKK3sKKwlyZXR1cm4gWEZTX0RJUjJfQllURV9UT19PRkYobXAsIGJ5KTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSMl9EQV9UT19CWVRFKQoreGZzX2RpcjJfb2ZmX3QKK3hmc19kaXIyX2RhX3RvX2J5dGUoeGZzX21vdW50X3QgKm1wLCB4ZnNfZGFibGtfdCBkYSkKK3sKKwlyZXR1cm4gWEZTX0RJUjJfREFfVE9fQllURShtcCwgZGEpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ESVIyX0RBX1RPX0RCKQoreGZzX2RpcjJfZGJfdAoreGZzX2RpcjJfZGFfdG9fZGIoeGZzX21vdW50X3QgKm1wLCB4ZnNfZGFibGtfdCBkYSkKK3sKKwlyZXR1cm4gWEZTX0RJUjJfREFfVE9fREIobXAsIGRhKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSMl9EQVRBX0VOVFJZX1RBR19QKQoreGZzX2RpcjJfZGF0YV9vZmZfdCAqCit4ZnNfZGlyMl9kYXRhX2VudHJ5X3RhZ19wKHhmc19kaXIyX2RhdGFfZW50cnlfdCAqZGVwKQoreworCXJldHVybiBYRlNfRElSMl9EQVRBX0VOVFJZX1RBR19QKGRlcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfREFUQV9FTlRTSVpFKQoraW50Cit4ZnNfZGlyMl9kYXRhX2VudHNpemUoaW50IG4pCit7CisJcmV0dXJuIFhGU19ESVIyX0RBVEFfRU5UU0laRShuKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSMl9EQVRBX1VOVVNFRF9UQUdfUCkKK3hmc19kaXIyX2RhdGFfb2ZmX3QgKgoreGZzX2RpcjJfZGF0YV91bnVzZWRfdGFnX3AoeGZzX2RpcjJfZGF0YV91bnVzZWRfdCAqZHVwKQoreworCXJldHVybiBYRlNfRElSMl9EQVRBX1VOVVNFRF9UQUdfUChkdXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ESVIyX0RBVEFQVFJfVE9fQllURSkKKy8qIEFSR1NVU0VEICovCit4ZnNfZGlyMl9vZmZfdAoreGZzX2RpcjJfZGF0YXB0cl90b19ieXRlKHhmc19tb3VudF90ICptcCwgeGZzX2RpcjJfZGF0YXB0cl90IGRwKQoreworCXJldHVybiBYRlNfRElSMl9EQVRBUFRSX1RPX0JZVEUobXAsIGRwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSMl9EQVRBUFRSX1RPX0RCKQoreGZzX2RpcjJfZGJfdAoreGZzX2RpcjJfZGF0YXB0cl90b19kYih4ZnNfbW91bnRfdCAqbXAsIHhmc19kaXIyX2RhdGFwdHJfdCBkcCkKK3sKKwlyZXR1cm4gWEZTX0RJUjJfREFUQVBUUl9UT19EQihtcCwgZHApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ESVIyX0RBVEFQVFJfVE9fT0ZGKQoreGZzX2RpcjJfZGF0YV9hb2ZmX3QKK3hmc19kaXIyX2RhdGFwdHJfdG9fb2ZmKHhmc19tb3VudF90ICptcCwgeGZzX2RpcjJfZGF0YXB0cl90IGRwKQoreworCXJldHVybiBYRlNfRElSMl9EQVRBUFRSX1RPX09GRihtcCwgZHApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ESVIyX0RCX09GRl9UT19CWVRFKQoreGZzX2RpcjJfb2ZmX3QKK3hmc19kaXIyX2RiX29mZl90b19ieXRlKHhmc19tb3VudF90ICptcCwgeGZzX2RpcjJfZGJfdCBkYiwKKwkJCXhmc19kaXIyX2RhdGFfYW9mZl90IG8pCit7CisJcmV0dXJuIFhGU19ESVIyX0RCX09GRl9UT19CWVRFKG1wLCBkYiwgbyk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfREJfT0ZGX1RPX0RBVEFQVFIpCit4ZnNfZGlyMl9kYXRhcHRyX3QKK3hmc19kaXIyX2RiX29mZl90b19kYXRhcHRyKHhmc19tb3VudF90ICptcCwgeGZzX2RpcjJfZGJfdCBkYiwKKwkJCSAgIHhmc19kaXIyX2RhdGFfYW9mZl90IG8pCit7CisJcmV0dXJuIFhGU19ESVIyX0RCX09GRl9UT19EQVRBUFRSKG1wLCBkYiwgbyk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfREJfVE9fREEpCit4ZnNfZGFibGtfdAoreGZzX2RpcjJfZGJfdG9fZGEoeGZzX21vdW50X3QgKm1wLCB4ZnNfZGlyMl9kYl90IGRiKQoreworCXJldHVybiBYRlNfRElSMl9EQl9UT19EQShtcCwgZGIpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ESVIyX0RCX1RPX0ZEQikKK3hmc19kaXIyX2RiX3QKK3hmc19kaXIyX2RiX3RvX2ZkYih4ZnNfbW91bnRfdCAqbXAsIHhmc19kaXIyX2RiX3QgZGIpCit7CisJcmV0dXJuIFhGU19ESVIyX0RCX1RPX0ZEQihtcCwgZGIpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ESVIyX0RCX1RPX0ZESU5ERVgpCitpbnQKK3hmc19kaXIyX2RiX3RvX2ZkaW5kZXgoeGZzX21vdW50X3QgKm1wLCB4ZnNfZGlyMl9kYl90IGRiKQoreworCXJldHVybiBYRlNfRElSMl9EQl9UT19GRElOREVYKG1wLCBkYik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfTEVBRl9CRVNUU19QKQoreGZzX2RpcjJfZGF0YV9vZmZfdCAqCit4ZnNfZGlyMl9sZWFmX2Jlc3RzX3AoeGZzX2RpcjJfbGVhZl90YWlsX3QgKmx0cCkKK3sKKwlyZXR1cm4gWEZTX0RJUjJfTEVBRl9CRVNUU19QKGx0cCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfTEVBRl9UQUlMX1ApCit4ZnNfZGlyMl9sZWFmX3RhaWxfdCAqCit4ZnNfZGlyMl9sZWFmX3RhaWxfcCh4ZnNfbW91bnRfdCAqbXAsIHhmc19kaXIyX2xlYWZfdCAqbHApCit7CisJcmV0dXJuIFhGU19ESVIyX0xFQUZfVEFJTF9QKG1wLCBscCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfTUFYX0xFQUZfRU5UUykKK2ludAoreGZzX2RpcjJfbWF4X2xlYWZfZW50cyh4ZnNfbW91bnRfdCAqbXApCit7CisJcmV0dXJuIFhGU19ESVIyX01BWF9MRUFGX0VOVFMobXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ESVIyX1NGX0VOVFNJWkVfQllFTlRSWSkKK2ludAoreGZzX2RpcjJfc2ZfZW50c2l6ZV9ieWVudHJ5KHhmc19kaXIyX3NmX3QgKnNmcCwgeGZzX2RpcjJfc2ZfZW50cnlfdCAqc2ZlcCkKK3sKKwlyZXR1cm4gWEZTX0RJUjJfU0ZfRU5UU0laRV9CWUVOVFJZKHNmcCwgc2ZlcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfU0ZfRklSU1RFTlRSWSkKK3hmc19kaXIyX3NmX2VudHJ5X3QgKgoreGZzX2RpcjJfc2ZfZmlyc3RlbnRyeSh4ZnNfZGlyMl9zZl90ICpzZnApCit7CisJcmV0dXJuIFhGU19ESVIyX1NGX0ZJUlNURU5UUlkoc2ZwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSMl9TRl9FTlRTSVpFX0JZTkFNRSkKK2ludAoreGZzX2RpcjJfc2ZfZW50c2l6ZV9ieW5hbWUoeGZzX2RpcjJfc2ZfdCAqc2ZwLCBpbnQgbGVuKQoreworCXJldHVybiBYRlNfRElSMl9TRl9FTlRTSVpFX0JZTkFNRShzZnAsIGxlbik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfU0ZfR0VUX0lOVU1CRVIpCit4ZnNfaW50aW5vX3QKK3hmc19kaXIyX3NmX2dldF9pbnVtYmVyKHhmc19kaXIyX3NmX3QgKnNmcCwgeGZzX2RpcjJfaW5vdV90ICpmcm9tKQoreworCXJldHVybiBYRlNfRElSMl9TRl9HRVRfSU5VTUJFUihzZnAsIGZyb20pOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ESVIyX1NGX0dFVF9PRkZTRVQpCit4ZnNfZGlyMl9kYXRhX2FvZmZfdAoreGZzX2RpcjJfc2ZfZ2V0X29mZnNldCh4ZnNfZGlyMl9zZl9lbnRyeV90ICpzZmVwKQoreworCXJldHVybiBYRlNfRElSMl9TRl9HRVRfT0ZGU0VUKHNmZXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ESVIyX1NGX0hEUl9TSVpFKQoraW50Cit4ZnNfZGlyMl9zZl9oZHJfc2l6ZShpbnQgaThjb3VudCkKK3sKKwlyZXR1cm4gWEZTX0RJUjJfU0ZfSERSX1NJWkUoaThjb3VudCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfU0ZfSU5VTUJFUlApCit4ZnNfZGlyMl9pbm91X3QgKgoreGZzX2RpcjJfc2ZfaW51bWJlcnAoeGZzX2RpcjJfc2ZfZW50cnlfdCAqc2ZlcCkKK3sKKwlyZXR1cm4gWEZTX0RJUjJfU0ZfSU5VTUJFUlAoc2ZlcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0RJUjJfU0ZfTkVYVEVOVFJZKQoreGZzX2RpcjJfc2ZfZW50cnlfdCAqCit4ZnNfZGlyMl9zZl9uZXh0ZW50cnkoeGZzX2RpcjJfc2ZfdCAqc2ZwLCB4ZnNfZGlyMl9zZl9lbnRyeV90ICpzZmVwKQoreworCXJldHVybiBYRlNfRElSMl9TRl9ORVhURU5UUlkoc2ZwLCBzZmVwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRElSMl9TRl9QVVRfSU5VTUJFUikKK3ZvaWQKK3hmc19kaXIyX3NmX3B1dF9pbnVtYmVyKHhmc19kaXIyX3NmX3QgKnNmcCwgeGZzX2lub190ICpmcm9tLCB4ZnNfZGlyMl9pbm91X3QgKnRvKQoreworCVhGU19ESVIyX1NGX1BVVF9JTlVNQkVSKHNmcCwgZnJvbSwgdG8pOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19ESVIyX1NGX1BVVF9PRkZTRVQpCit2b2lkCit4ZnNfZGlyMl9zZl9wdXRfb2Zmc2V0KHhmc19kaXIyX3NmX2VudHJ5X3QgKnNmZXAsIHhmc19kaXIyX2RhdGFfYW9mZl90IG9mZikKK3sKKwlYRlNfRElSMl9TRl9QVVRfT0ZGU0VUKHNmZXAsIG9mZik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0VYVEZNVF9JTk9ERSApCit4ZnNfZXhudGZtdF90Cit4ZnNfZXh0Zm10X2lub2RlKHN0cnVjdCB4ZnNfaW5vZGUgKmlwKQoreworCXJldHVybiBYRlNfRVhURk1UX0lOT0RFKGlwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRVhUTEVOX01BWCkKK3hmc19leHRsZW5fdAoreGZzX2V4dGxlbl9tYXgoeGZzX2V4dGxlbl90IGEsIHhmc19leHRsZW5fdCBiKQoreworCXJldHVybiBYRlNfRVhUTEVOX01BWChhLCBiKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRVhUTEVOX01JTikKK3hmc19leHRsZW5fdAoreGZzX2V4dGxlbl9taW4oeGZzX2V4dGxlbl90IGEsIHhmc19leHRsZW5fdCBiKQoreworCXJldHVybiBYRlNfRVhUTEVOX01JTihhLCBiKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRklMQkxLU19NQVgpCit4ZnNfZmlsYmxrc190Cit4ZnNfZmlsYmxrc19tYXgoeGZzX2ZpbGJsa3NfdCBhLCB4ZnNfZmlsYmxrc190IGIpCit7CisJcmV0dXJuIFhGU19GSUxCTEtTX01BWChhLCBiKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRklMQkxLU19NSU4pCit4ZnNfZmlsYmxrc190Cit4ZnNfZmlsYmxrc19taW4oeGZzX2ZpbGJsa3NfdCBhLCB4ZnNfZmlsYmxrc190IGIpCit7CisJcmV0dXJuIFhGU19GSUxCTEtTX01JTihhLCBiKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRklMRU9GRl9NQVgpCit4ZnNfZmlsZW9mZl90Cit4ZnNfZmlsZW9mZl9tYXgoeGZzX2ZpbGVvZmZfdCBhLCB4ZnNfZmlsZW9mZl90IGIpCit7CisJcmV0dXJuIFhGU19GSUxFT0ZGX01BWChhLCBiKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRklMRU9GRl9NSU4pCit4ZnNfZmlsZW9mZl90Cit4ZnNfZmlsZW9mZl9taW4oeGZzX2ZpbGVvZmZfdCBhLCB4ZnNfZmlsZW9mZl90IGIpCit7CisJcmV0dXJuIFhGU19GSUxFT0ZGX01JTihhLCBiKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRlNCX1NBTklUWV9DSEVDSykKK2ludAoreGZzX2ZzYl9zYW5pdHlfY2hlY2soeGZzX21vdW50X3QgKm1wLCB4ZnNfZnNibG9ja190IGZzYm5vKQoreworCXJldHVybiBYRlNfRlNCX1NBTklUWV9DSEVDSyhtcCwgZnNibm8pOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19GU0JfVE9fQUdCTk8pCit4ZnNfYWdibG9ja190Cit4ZnNfZnNiX3RvX2FnYm5vKHhmc19tb3VudF90ICptcCwgeGZzX2ZzYmxvY2tfdCBmc2JubykKK3sKKwlyZXR1cm4gWEZTX0ZTQl9UT19BR0JOTyhtcCwgZnNibm8pOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19GU0JfVE9fQUdOTykKK3hmc19hZ251bWJlcl90Cit4ZnNfZnNiX3RvX2Fnbm8oeGZzX21vdW50X3QgKm1wLCB4ZnNfZnNibG9ja190IGZzYm5vKQoreworCXJldHVybiBYRlNfRlNCX1RPX0FHTk8obXAsIGZzYm5vKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfRlNCX1RPX0RBRERSKQoreGZzX2RhZGRyX3QKK3hmc19mc2JfdG9fZGFkZHIoeGZzX21vdW50X3QgKm1wLCB4ZnNfZnNibG9ja190IGZzYm5vKQoreworCXJldHVybiBYRlNfRlNCX1RPX0RBRERSKG1wLCBmc2Jubyk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0ZTQl9UT19EQikKK3hmc19kYWRkcl90Cit4ZnNfZnNiX3RvX2RiKHhmc19pbm9kZV90ICppcCwgeGZzX2ZzYmxvY2tfdCBmc2IpCit7CisJcmV0dXJuIFhGU19GU0JfVE9fREIoaXAsIGZzYik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0hEUl9CTE9DSykKK3hmc19hZ2Jsb2NrX3QKK3hmc19oZHJfYmxvY2soeGZzX21vdW50X3QgKm1wLCB4ZnNfZGFkZHJfdCBkKQoreworCXJldHVybiBYRlNfSERSX0JMT0NLKG1wLCBkKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSUFMTE9DX0JMT0NLUykKK3hmc19leHRsZW5fdAoreGZzX2lhbGxvY19ibG9ja3MoeGZzX21vdW50X3QgKm1wKQoreworCXJldHVybiBYRlNfSUFMTE9DX0JMT0NLUyhtcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lBTExPQ19GSU5EX0ZSRUUpCitpbnQKK3hmc19pYWxsb2NfZmluZF9mcmVlKHhmc19pbm9mcmVlX3QgKmZwKQoreworCXJldHVybiBYRlNfSUFMTE9DX0ZJTkRfRlJFRShmcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lBTExPQ19JTk9ERVMpCitpbnQKK3hmc19pYWxsb2NfaW5vZGVzKHhmc19tb3VudF90ICptcCkKK3sKKwlyZXR1cm4gWEZTX0lBTExPQ19JTk9ERVMobXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JQlRfQkxPQ0spCit4ZnNfYWdibG9ja190Cit4ZnNfaWJ0X2Jsb2NrKHhmc19tb3VudF90ICptcCkKK3sKKwlyZXR1cm4gWEZTX0lCVF9CTE9DSyhtcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lGT1JLX0FTSVpFKQoraW50Cit4ZnNfaWZvcmtfYXNpemUoeGZzX2lub2RlX3QgKmlwKQoreworCXJldHVybiBYRlNfSUZPUktfQVNJWkUoaXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JRk9SS19EU0laRSkKK2ludAoreGZzX2lmb3JrX2RzaXplKHhmc19pbm9kZV90ICppcCkKK3sKKwlyZXR1cm4gWEZTX0lGT1JLX0RTSVpFKGlwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSUZPUktfRk1UX1NFVCkKK3ZvaWQKK3hmc19pZm9ya19mbXRfc2V0KHhmc19pbm9kZV90ICppcCwgaW50IHcsIGludCBuKQoreworCVhGU19JRk9SS19GTVRfU0VUKGlwLCB3LCBuKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSUZPUktfRk9STUFUKQoraW50Cit4ZnNfaWZvcmtfZm9ybWF0KHhmc19pbm9kZV90ICppcCwgaW50IHcpCit7CisJcmV0dXJuIFhGU19JRk9SS19GT1JNQVQoaXAsIHcpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JRk9SS19ORVhUX1NFVCkKK3ZvaWQKK3hmc19pZm9ya19uZXh0X3NldCh4ZnNfaW5vZGVfdCAqaXAsIGludCB3LCBpbnQgbikKK3sKKwlYRlNfSUZPUktfTkVYVF9TRVQoaXAsIHcsIG4pOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JRk9SS19ORVhURU5UUykKK2ludAoreGZzX2lmb3JrX25leHRlbnRzKHhmc19pbm9kZV90ICppcCwgaW50IHcpCit7CisJcmV0dXJuIFhGU19JRk9SS19ORVhURU5UUyhpcCwgdyk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lGT1JLX1BUUikKK3hmc19pZm9ya190ICoKK3hmc19pZm9ya19wdHIoeGZzX2lub2RlX3QgKmlwLCBpbnQgdykKK3sKKwlyZXR1cm4gWEZTX0lGT1JLX1BUUihpcCwgdyk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lGT1JLX1EpCitpbnQKK3hmc19pZm9ya19xKHhmc19pbm9kZV90ICppcCkKK3sKKwlyZXR1cm4gWEZTX0lGT1JLX1EoaXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JRk9SS19TSVpFKQoraW50Cit4ZnNfaWZvcmtfc2l6ZSh4ZnNfaW5vZGVfdCAqaXAsIGludCB3KQoreworCXJldHVybiBYRlNfSUZPUktfU0laRShpcCwgdyk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lMT0dfRkJST09UKQoraW50Cit4ZnNfaWxvZ19mYnJvb3QoaW50IHcpCit7CisJcmV0dXJuIFhGU19JTE9HX0ZCUk9PVCh3KTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSUxPR19GREFUQSkKK2ludAoreGZzX2lsb2dfZmRhdGEoaW50IHcpCit7CisJcmV0dXJuIFhGU19JTE9HX0ZEQVRBKHcpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JTE9HX0ZFWFQpCitpbnQKK3hmc19pbG9nX2ZleHQoaW50IHcpCit7CisJcmV0dXJuIFhGU19JTE9HX0ZFWFQodyk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lOX01BWExFVkVMUykKK2ludAoreGZzX2luX21heGxldmVscyh4ZnNfbW91bnRfdCAqbXApCit7CisJcmV0dXJuIFhGU19JTl9NQVhMRVZFTFMobXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JTk9fQUdCTk9fQklUUykKK2ludAoreGZzX2lub19hZ2Jub19iaXRzKHhmc19tb3VudF90ICptcCkKK3sKKwlyZXR1cm4gWEZTX0lOT19BR0JOT19CSVRTKG1wKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSU5PX0FHSU5PX0JJVFMpCitpbnQKK3hmc19pbm9fYWdpbm9fYml0cyh4ZnNfbW91bnRfdCAqbXApCit7CisJcmV0dXJuIFhGU19JTk9fQUdJTk9fQklUUyhtcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lOT19BR05PX0JJVFMpCitpbnQKK3hmc19pbm9fYWdub19iaXRzKHhmc19tb3VudF90ICptcCkKK3sKKwlyZXR1cm4gWEZTX0lOT19BR05PX0JJVFMobXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JTk9fQklUUykKK2ludAoreGZzX2lub19iaXRzKHhmc19tb3VudF90ICptcCkKK3sKKwlyZXR1cm4gWEZTX0lOT19CSVRTKG1wKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSU5PX01BU0spCitfX3VpbnQzMl90Cit4ZnNfaW5vX21hc2soaW50IGspCit7CisJcmV0dXJuIFhGU19JTk9fTUFTSyhrKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSU5PX09GRlNFVF9CSVRTKQoraW50Cit4ZnNfaW5vX29mZnNldF9iaXRzKHhmc19tb3VudF90ICptcCkKK3sKKwlyZXR1cm4gWEZTX0lOT19PRkZTRVRfQklUUyhtcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lOT19UT19BR0JOTykKK3hmc19hZ2Jsb2NrX3QKK3hmc19pbm9fdG9fYWdibm8oeGZzX21vdW50X3QgKm1wLCB4ZnNfaW5vX3QgaSkKK3sKKwlyZXR1cm4gWEZTX0lOT19UT19BR0JOTyhtcCwgaSk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lOT19UT19BR0lOTykKK3hmc19hZ2lub190Cit4ZnNfaW5vX3RvX2FnaW5vKHhmc19tb3VudF90ICptcCwgeGZzX2lub190IGkpCit7CisJcmV0dXJuIFhGU19JTk9fVE9fQUdJTk8obXAsIGkpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JTk9fVE9fQUdOTykKK3hmc19hZ251bWJlcl90Cit4ZnNfaW5vX3RvX2Fnbm8oeGZzX21vdW50X3QgKm1wLCB4ZnNfaW5vX3QgaSkKK3sKKwlyZXR1cm4gWEZTX0lOT19UT19BR05PKG1wLCBpKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSU5PX1RPX0ZTQikKK3hmc19mc2Jsb2NrX3QKK3hmc19pbm9fdG9fZnNiKHhmc19tb3VudF90ICptcCwgeGZzX2lub190IGkpCit7CisJcmV0dXJuIFhGU19JTk9fVE9fRlNCKG1wLCBpKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSU5PX1RPX09GRlNFVCkKK2ludAoreGZzX2lub190b19vZmZzZXQoeGZzX21vdW50X3QgKm1wLCB4ZnNfaW5vX3QgaSkKK3sKKwlyZXR1cm4gWEZTX0lOT19UT19PRkZTRVQobXAsIGkpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JTk9CVF9CTE9DS19NQVhSRUNTKQoraW50Cit4ZnNfaW5vYnRfYmxvY2tfbWF4cmVjcyhpbnQgbGV2LCB4ZnNfYnRyZWVfY3VyX3QgKmN1cikKK3sKKwlyZXR1cm4gWEZTX0lOT0JUX0JMT0NLX01BWFJFQ1MobGV2LCBjdXIpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JTk9CVF9CTE9DS19NSU5SRUNTKQoraW50Cit4ZnNfaW5vYnRfYmxvY2tfbWlucmVjcyhpbnQgbGV2LCB4ZnNfYnRyZWVfY3VyX3QgKmN1cikKK3sKKwlyZXR1cm4gWEZTX0lOT0JUX0JMT0NLX01JTlJFQ1MobGV2LCBjdXIpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JTk9CVF9CTE9DS19TSVpFKQorLypBUkdTVVNFRDEqLworaW50Cit4ZnNfaW5vYnRfYmxvY2tfc2l6ZShpbnQgbGV2LCB4ZnNfYnRyZWVfY3VyX3QgKmN1cikKK3sKKwlyZXR1cm4gWEZTX0lOT0JUX0JMT0NLX1NJWkUobGV2LCBjdXIpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JTk9CVF9DTFJfRlJFRSkKK3ZvaWQKK3hmc19pbm9idF9jbHJfZnJlZSh4ZnNfaW5vYnRfcmVjX3QgKnJwLCBpbnQgaSkKK3sKKwlYRlNfSU5PQlRfQ0xSX0ZSRUUocnAsIGkpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JTk9CVF9JU19GUkVFKQoraW50Cit4ZnNfaW5vYnRfaXNfZnJlZSh4ZnNfaW5vYnRfcmVjX3QgKnJwLCBpbnQgaSkKK3sKKwlyZXR1cm4gWEZTX0lOT0JUX0lTX0ZSRUUocnAsIGkpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JTk9CVF9JU19MQVNUX1JFQykKK2ludAoreGZzX2lub2J0X2lzX2xhc3RfcmVjKHhmc19idHJlZV9jdXJfdCAqY3VyKQoreworCXJldHVybiBYRlNfSU5PQlRfSVNfTEFTVF9SRUMoY3VyKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSU5PQlRfS0VZX0FERFIpCisvKkFSR1NVU0VEMyovCit4ZnNfaW5vYnRfa2V5X3QgKgoreGZzX2lub2J0X2tleV9hZGRyKHhmc19pbm9idF9ibG9ja190ICpiYiwgaW50IGksIHhmc19idHJlZV9jdXJfdCAqY3VyKQoreworCXJldHVybiBYRlNfSU5PQlRfS0VZX0FERFIoYmIsIGksIGN1cik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lOT0JUX01BU0spCit4ZnNfaW5vZnJlZV90Cit4ZnNfaW5vYnRfbWFzayhpbnQgaSkKK3sKKwlyZXR1cm4gWEZTX0lOT0JUX01BU0soaSk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lOT0JUX01BU0tOKQoreGZzX2lub2ZyZWVfdAoreGZzX2lub2J0X21hc2tuKGludCBpLCBpbnQgbikKK3sKKwlyZXR1cm4gWEZTX0lOT0JUX01BU0tOKGksIG4pOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JTk9CVF9QVFJfQUREUikKK3hmc19pbm9idF9wdHJfdCAqCit4ZnNfaW5vYnRfcHRyX2FkZHIoeGZzX2lub2J0X2Jsb2NrX3QgKmJiLCBpbnQgaSwgeGZzX2J0cmVlX2N1cl90ICpjdXIpCit7CisJcmV0dXJuIFhGU19JTk9CVF9QVFJfQUREUihiYiwgaSwgY3VyKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfSU5PQlRfUkVDX0FERFIpCisvKkFSR1NVU0VEMyovCit4ZnNfaW5vYnRfcmVjX3QgKgoreGZzX2lub2J0X3JlY19hZGRyKHhmc19pbm9idF9ibG9ja190ICpiYiwgaW50IGksIHhmc19idHJlZV9jdXJfdCAqY3VyKQoreworCXJldHVybiBYRlNfSU5PQlRfUkVDX0FERFIoYmIsIGksIGN1cik7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lOT0JUX1NFVF9GUkVFKQordm9pZAoreGZzX2lub2J0X3NldF9mcmVlKHhmc19pbm9idF9yZWNfdCAqcnAsIGludCBpKQoreworCVhGU19JTk9CVF9TRVRfRlJFRShycCwgaSk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0lUT0JIVikKK2Jodl9kZXNjX3QgKgoreGZzX2l0b2Jodih4ZnNfaW5vZGVfdCAqaXApCit7CisJcmV0dXJuIFhGU19JVE9CSFYoaXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19JVE9WKQordm5vZGVfdCAqCit4ZnNfaXRvdih4ZnNfaW5vZGVfdCAqaXApCit7CisJcmV0dXJuIFhGU19JVE9WKGlwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfTEJMT0cpCitpbnQKK3hmc19sYmxvZyh4ZnNfbW91bnRfdCAqbXApCit7CisJcmV0dXJuIFhGU19MQkxPRyhtcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0xCU0laRSkKK2ludAoreGZzX2xic2l6ZSh4ZnNfbW91bnRfdCAqbXApCit7CisJcmV0dXJuIFhGU19MQlNJWkUobXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19MSUNfQUxMX0ZSRUUpCit2b2lkCit4ZnNfbGljX2FsbF9mcmVlKHhmc19sb2dfaXRlbV9jaHVua190ICpjcCkKK3sKKwlYRlNfTElDX0FMTF9GUkVFKGNwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfTElDX0FSRV9BTExfRlJFRSkKK2ludAoreGZzX2xpY19hcmVfYWxsX2ZyZWUoeGZzX2xvZ19pdGVtX2NodW5rX3QgKmNwKQoreworCXJldHVybiBYRlNfTElDX0FSRV9BTExfRlJFRShjcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0xJQ19DTEFJTSkKK3ZvaWQKK3hmc19saWNfY2xhaW0oeGZzX2xvZ19pdGVtX2NodW5rX3QgKmNwLCBpbnQgc2xvdCkKK3sKKwlYRlNfTElDX0NMQUlNKGNwLCBzbG90KTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfTElDX0RFU0NfVE9fQ0hVTkspCit4ZnNfbG9nX2l0ZW1fY2h1bmtfdCAqCit4ZnNfbGljX2Rlc2NfdG9fY2h1bmsoeGZzX2xvZ19pdGVtX2Rlc2NfdCAqZHApCit7CisJcmV0dXJuIFhGU19MSUNfREVTQ19UT19DSFVOSyhkcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0xJQ19ERVNDX1RPX1NMT1QpCitpbnQKK3hmc19saWNfZGVzY190b19zbG90KHhmc19sb2dfaXRlbV9kZXNjX3QgKmRwKQoreworCXJldHVybiBYRlNfTElDX0RFU0NfVE9fU0xPVChkcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0xJQ19JTklUKQordm9pZAoreGZzX2xpY19pbml0KHhmc19sb2dfaXRlbV9jaHVua190ICpjcCkKK3sKKwlYRlNfTElDX0lOSVQoY3ApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19MSUNfSU5JVF9TTE9UKQordm9pZAoreGZzX2xpY19pbml0X3Nsb3QoeGZzX2xvZ19pdGVtX2NodW5rX3QgKmNwLCBpbnQgc2xvdCkKK3sKKwlYRlNfTElDX0lOSVRfU0xPVChjcCwgc2xvdCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0xJQ19JU0ZSRUUpCitpbnQKK3hmc19saWNfaXNmcmVlKHhmc19sb2dfaXRlbV9jaHVua190ICpjcCwgaW50IHNsb3QpCit7CisJcmV0dXJuIFhGU19MSUNfSVNGUkVFKGNwLCBzbG90KTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfTElDX1JFTFNFKQordm9pZAoreGZzX2xpY19yZWxzZSh4ZnNfbG9nX2l0ZW1fY2h1bmtfdCAqY3AsIGludCBzbG90KQoreworCVhGU19MSUNfUkVMU0UoY3AsIHNsb3QpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19MSUNfU0xPVCkKK3hmc19sb2dfaXRlbV9kZXNjX3QgKgoreGZzX2xpY19zbG90KHhmc19sb2dfaXRlbV9jaHVua190ICpjcCwgaW50IHNsb3QpCit7CisJcmV0dXJuIFhGU19MSUNfU0xPVChjcCwgc2xvdCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX0xJQ19WQUNBTkNZKQoraW50Cit4ZnNfbGljX3ZhY2FuY3koeGZzX2xvZ19pdGVtX2NodW5rX3QgKmNwKQoreworCXJldHVybiBYRlNfTElDX1ZBQ0FOQ1koY3ApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19MSVRJTk8pCitpbnQKK3hmc19saXRpbm8oeGZzX21vdW50X3QgKm1wKQoreworCXJldHVybiBYRlNfTElUSU5PKG1wKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfTUFLRV9JUFRSKQoreGZzX2Rpbm9kZV90ICoKK3hmc19tYWtlX2lwdHIoeGZzX21vdW50X3QgKm1wLCB4ZnNfYnVmX3QgKmIsIGludCBvKQoreworCXJldHVybiBYRlNfTUFLRV9JUFRSKG1wLCBiLCBvKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfTUFTSzMySEkpCitfX3VpbnQzMl90Cit4ZnNfbWFzazMyaGkoaW50IG4pCit7CisJcmV0dXJuIFhGU19NQVNLMzJISShuKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfTUFTSzMyTE8pCitfX3VpbnQzMl90Cit4ZnNfbWFzazMybG8oaW50IG4pCit7CisJcmV0dXJuIFhGU19NQVNLMzJMTyhuKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfTUFTSzY0SEkpCitfX3VpbnQ2NF90Cit4ZnNfbWFzazY0aGkoaW50IG4pCit7CisJcmV0dXJuIFhGU19NQVNLNjRISShuKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfTUFTSzY0TE8pCitfX3VpbnQ2NF90Cit4ZnNfbWFzazY0bG8oaW50IG4pCit7CisJcmV0dXJuIFhGU19NQVNLNjRMTyhuKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfTUlOX0ZSRUVMSVNUKQoraW50Cit4ZnNfbWluX2ZyZWVsaXN0KHhmc19hZ2ZfdCAqYSwgeGZzX21vdW50X3QgKm1wKQoreworCXJldHVybiBYRlNfTUlOX0ZSRUVMSVNUKGEsIG1wKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfTUlOX0ZSRUVMSVNUX1BBRykKK2ludAoreGZzX21pbl9mcmVlbGlzdF9wYWcoeGZzX3BlcmFnX3QgKnBhZywgeGZzX21vdW50X3QgKm1wKQoreworCXJldHVybiBYRlNfTUlOX0ZSRUVMSVNUX1BBRyhwYWcsIG1wKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfTUlOX0ZSRUVMSVNUX1JBVykKK2ludAoreGZzX21pbl9mcmVlbGlzdF9yYXcodWludCBibCwgdWludCBjbCwgeGZzX21vdW50X3QgKm1wKQoreworCXJldHVybiBYRlNfTUlOX0ZSRUVMSVNUX1JBVyhibCwgY2wsIG1wKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfTVRPVkZTKQordmZzX3QgKgoreGZzX210b3Zmcyh4ZnNfbW91bnRfdCAqbXApCit7CisJcmV0dXJuIFhGU19NVE9WRlMobXApOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19PRkZCTk9fVE9fQUdJTk8pCit4ZnNfYWdpbm9fdAoreGZzX29mZmJub190b19hZ2lubyh4ZnNfbW91bnRfdCAqbXAsIHhmc19hZ2Jsb2NrX3QgYiwgaW50IG8pCit7CisJcmV0dXJuIFhGU19PRkZCTk9fVE9fQUdJTk8obXAsIGIsIG8pOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hGU19QUkVBTExPQ19CTE9DS1MpCit4ZnNfYWdibG9ja190Cit4ZnNfcHJlYWxsb2NfYmxvY2tzKHhmc19tb3VudF90ICptcCkKK3sKKwlyZXR1cm4gWEZTX1BSRUFMTE9DX0JMT0NLUyhtcCk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX1NCX0JMT0NLKQoreGZzX2FnYmxvY2tfdAoreGZzX3NiX2Jsb2NrKHhmc19tb3VudF90ICptcCkKK3sKKwlyZXR1cm4gWEZTX1NCX0JMT0NLKG1wKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfR09PRF9WRVJTSU9OKQoraW50Cit4ZnNfc2JfZ29vZF92ZXJzaW9uKHhmc19zYl90ICpzYnApCit7CisJcmV0dXJuIFhGU19TQl9HT09EX1ZFUlNJT04oc2JwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9BRERBVFRSKQordm9pZAoreGZzX3NiX3ZlcnNpb25fYWRkYXR0cih4ZnNfc2JfdCAqc2JwKQoreworCVhGU19TQl9WRVJTSU9OX0FEREFUVFIoc2JwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9BREREQUxJR04pCit2b2lkCit4ZnNfc2JfdmVyc2lvbl9hZGRkYWxpZ24oeGZzX3NiX3QgKnNicCkKK3sKKwlYRlNfU0JfVkVSU0lPTl9BREREQUxJR04oc2JwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9BREROTElOSykKK3ZvaWQKK3hmc19zYl92ZXJzaW9uX2FkZG5saW5rKHhmc19zYl90ICpzYnApCit7CisJWEZTX1NCX1ZFUlNJT05fQURETkxJTksoc2JwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9BRERRVU9UQSkKK3ZvaWQKK3hmc19zYl92ZXJzaW9uX2FkZHF1b3RhKHhmc19zYl90ICpzYnApCit7CisJWEZTX1NCX1ZFUlNJT05fQUREUVVPVEEoc2JwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9BRERTSEFSRUQpCit2b2lkCit4ZnNfc2JfdmVyc2lvbl9hZGRzaGFyZWQoeGZzX3NiX3QgKnNicCkKK3sKKwlYRlNfU0JfVkVSU0lPTl9BRERTSEFSRUQoc2JwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNBTElHTikKK2ludAoreGZzX3NiX3ZlcnNpb25faGFzYWxpZ24oeGZzX3NiX3QgKnNicCkKK3sKKwlyZXR1cm4gWEZTX1NCX1ZFUlNJT05fSEFTQUxJR04oc2JwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNBVFRSKQoraW50Cit4ZnNfc2JfdmVyc2lvbl9oYXNhdHRyKHhmc19zYl90ICpzYnApCit7CisJcmV0dXJuIFhGU19TQl9WRVJTSU9OX0hBU0FUVFIoc2JwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNEQUxJR04pCitpbnQKK3hmc19zYl92ZXJzaW9uX2hhc2RhbGlnbih4ZnNfc2JfdCAqc2JwKQoreworCXJldHVybiBYRlNfU0JfVkVSU0lPTl9IQVNEQUxJR04oc2JwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNESVJWMikKK2ludAoreGZzX3NiX3ZlcnNpb25faGFzZGlydjIoeGZzX3NiX3QgKnNicCkKK3sKKwlyZXR1cm4gWEZTX1NCX1ZFUlNJT05fSEFTRElSVjIoc2JwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNFWFRGTEdCSVQpCitpbnQKK3hmc19zYl92ZXJzaW9uX2hhc2V4dGZsZ2JpdCh4ZnNfc2JfdCAqc2JwKQoreworCXJldHVybiBYRlNfU0JfVkVSU0lPTl9IQVNFWFRGTEdCSVQoc2JwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNOTElOSykKK2ludAoreGZzX3NiX3ZlcnNpb25faGFzbmxpbmsoeGZzX3NiX3QgKnNicCkKK3sKKwlyZXR1cm4gWEZTX1NCX1ZFUlNJT05fSEFTTkxJTksoc2JwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNRVU9UQSkKK2ludAoreGZzX3NiX3ZlcnNpb25faGFzcXVvdGEoeGZzX3NiX3QgKnNicCkKK3sKKwlyZXR1cm4gWEZTX1NCX1ZFUlNJT05fSEFTUVVPVEEoc2JwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNTSEFSRUQpCitpbnQKK3hmc19zYl92ZXJzaW9uX2hhc3NoYXJlZCh4ZnNfc2JfdCAqc2JwKQoreworCXJldHVybiBYRlNfU0JfVkVSU0lPTl9IQVNTSEFSRUQoc2JwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9OVU0pCitpbnQKK3hmc19zYl92ZXJzaW9uX251bSh4ZnNfc2JfdCAqc2JwKQoreworCXJldHVybiBYRlNfU0JfVkVSU0lPTl9OVU0oc2JwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9TVUJBTElHTikKK3ZvaWQKK3hmc19zYl92ZXJzaW9uX3N1YmFsaWduKHhmc19zYl90ICpzYnApCit7CisJWEZTX1NCX1ZFUlNJT05fU1VCQUxJR04oc2JwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9TVUJTSEFSRUQpCit2b2lkCit4ZnNfc2JfdmVyc2lvbl9zdWJzaGFyZWQoeGZzX3NiX3QgKnNicCkKK3sKKwlYRlNfU0JfVkVSU0lPTl9TVUJTSEFSRUQoc2JwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNMT0dWMikKK2ludAoreGZzX3NiX3ZlcnNpb25faGFzbG9ndjIoeGZzX3NiX3QgKnNicCkKK3sKKwlyZXR1cm4gWEZTX1NCX1ZFUlNJT05fSEFTTE9HVjIoc2JwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNTRUNUT1IpCitpbnQKK3hmc19zYl92ZXJzaW9uX2hhc3NlY3Rvcih4ZnNfc2JfdCAqc2JwKQoreworCXJldHVybiBYRlNfU0JfVkVSU0lPTl9IQVNTRUNUT1Ioc2JwKTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9UT05FVykKK3Vuc2lnbmVkCit4ZnNfc2JfdmVyc2lvbl90b25ldyh1bnNpZ25lZCB2KQoreworCXJldHVybiBYRlNfU0JfVkVSU0lPTl9UT05FVyh2KTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9UT09MRCkKK3Vuc2lnbmVkCit4ZnNfc2JfdmVyc2lvbl90b29sZCh1bnNpZ25lZCB2KQoreworCXJldHVybiBYRlNfU0JfVkVSU0lPTl9UT09MRCh2KTsKK30KKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1NfQyB8fCAoWEZTX1dBTlRfU1BBQ0VfQyAmJiBYRlNTT19YTE9HX0dSQU5UX0FERF9TUEFDRSkKK3ZvaWQKK3hsb2dfZ3JhbnRfYWRkX3NwYWNlKHhsb2dfdCAqbG9nLCBpbnQgYnl0ZXMsIGludCB0eXBlKQoreworCVhMT0dfR1JBTlRfQUREX1NQQUNFKGxvZywgYnl0ZXMsIHR5cGUpOworfQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DU19DIHx8IChYRlNfV0FOVF9TUEFDRV9DICYmIFhGU1NPX1hMT0dfR1JBTlRfU1VCX1NQQUNFKQordm9pZAoreGxvZ19ncmFudF9zdWJfc3BhY2UoeGxvZ190ICpsb2csIGludCBieXRlcywgaW50IHR5cGUpCit7CisJWExPR19HUkFOVF9TVUJfU1BBQ0UobG9nLCBieXRlcywgdHlwZSk7Cit9CisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTX0MgfHwgKFhGU19XQU5UX1NQQUNFX0MgJiYgWEZTU09fWEZTX1NCX1ZFUlNJT05fSEFTTU9SRUJJVFMpCitpbnQKK3hmc19zYl92ZXJzaW9uX2hhc21vcmViaXRzKHhmc19zYl90ICpzYnApCit7CisJcmV0dXJuIFhGU19TQl9WRVJTSU9OX0hBU01PUkVCSVRTKHNicCk7Cit9CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19tYWNyb3MuaCBiL2ZzL3hmcy94ZnNfbWFjcm9zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE5MzA3NQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfbWFjcm9zLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19NQUNST1NfSF9fCisjZGVmaW5lCV9fWEZTX01BQ1JPU19IX18KKworLyoKKyAqIFNldCBmb3IgZGVidWcga2VybmVscyBhbmQgc2ltdWxhdGlvbgorICogVGhlc2UgcmVwbGFjZW1lbnRzIHNhdmUgc3BhY2UuCisgKiBVc2VkIGluIHhmc19tYWNyb3MuYy4KKyAqLworI2RlZmluZQlYRlNfV0FOVF9TUEFDRV9DCVwKKwkoIWRlZmluZWQoX1NUQU5EQUxPTkUpICYmIGRlZmluZWQoREVCVUcpKQorCisvKgorICogU2V0IGZvciBkZWJ1ZyBzaW11bGF0aW9uIGFuZCBrZXJuZWwgYnVpbGRzLCBidXQgbm90IGZvciBzdGFuZGFsb25lLgorICogVGhlc2UgcmVwbGFjZW1lbnRzIGRvIG5vdCBzYXZlIHNwYWNlLgorICogVXNlZCBpbiB4ZnNfbWFjcm9zLmMuCisgKi8KKyNkZWZpbmUJWEZTX1dBTlRfRlVOQ1NfQwlcCisJKCFkZWZpbmVkKF9TVEFOREFMT05FKSAmJiBkZWZpbmVkKERFQlVHKSkKKworLyoKKyAqIENvcnJlc3BvbmRpbmcgbmFtZXMgdXNlZCBpbiAuaCBmaWxlcy4KKyAqLworI2RlZmluZQlYRlNfV0FOVF9TUEFDRQkoWEZTX1dBTlRfU1BBQ0VfQyAmJiAhZGVmaW5lZChYRlNfTUFDUk9fQykpCisjZGVmaW5lCVhGU19XQU5UX0ZVTkNTCShYRlNfV0FOVF9GVU5DU19DICYmICFkZWZpbmVkKFhGU19NQUNST19DKSkKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgbWFjcm9zIHRoYXQgZ2V0IHR1cm5lZCBpbnRvIGZ1bmN0aW9ucyB0byBzYXZlIHNwYWNlLgorICovCisjZGVmaW5lCVhGU1NPX05VTExTVEFSVEJMT0NLIDEKKyNkZWZpbmUJWEZTU09fWEZTX0FHQl9UT19EQUREUiAxCisjZGVmaW5lIFhGU1NPX1hGU19BR0JfVE9fRlNCIDEKKyNkZWZpbmUJWEZTU09fWEZTX0FHSU5PX1RPX0lOTyAxCisjZGVmaW5lCVhGU1NPX1hGU19BTExPQ19CTE9DS19NSU5SRUNTIDEKKyNkZWZpbmUJWEZTU09fWEZTX0FUVFJfU0ZfTkVYVEVOVFJZIDEKKyNkZWZpbmUJWEZTU09fWEZTX0JNQVBfQkxPQ0tfRE1BWFJFQ1MgMQorI2RlZmluZQlYRlNTT19YRlNfQk1BUF9CTE9DS19JTUFYUkVDUyAxCisjZGVmaW5lCVhGU1NPX1hGU19CTUFQX0JMT0NLX0lNSU5SRUNTIDEKKyNkZWZpbmUJWEZTU09fWEZTX0JNQVBfSU5JVCAxCisjZGVmaW5lCVhGU1NPX1hGU19CTUFQX1BUUl9JQUREUiAxCisjZGVmaW5lCVhGU1NPX1hGU19CTUFQX1NBTklUWV9DSEVDSyAxCisjZGVmaW5lCVhGU1NPX1hGU19CTUFQSV9BRkxBRyAxCisjZGVmaW5lCVhGU1NPX1hGU19DRk9SS19TSVpFIDEKKyNkZWZpbmUJWEZTU09fWEZTX0RBX0NPT0tJRV9CTk8gMQorI2RlZmluZQlYRlNTT19YRlNfREFfQ09PS0lFX0VOVFJZIDEKKyNkZWZpbmUJWEZTU09fWEZTX0RBRERSX1RPX0FHQk5PIDEKKyNkZWZpbmUJWEZTU09fWEZTX0RBRERSX1RPX0ZTQiAxCisjZGVmaW5lCVhGU1NPX1hGU19ERk9SS19QVFIgMQorI2RlZmluZQlYRlNTT19YRlNfRElSX1NGX0dFVF9ESVJJTk8gMQorI2RlZmluZQlYRlNTT19YRlNfRElSX1NGX05FWFRFTlRSWSAxCisjZGVmaW5lCVhGU1NPX1hGU19ESVJfU0ZfUFVUX0RJUklOTyAxCisjZGVmaW5lCVhGU1NPX1hGU19GSUxCTEtTX01JTiAxCisjZGVmaW5lCVhGU1NPX1hGU19GU0JfU0FOSVRZX0NIRUNLIDEKKyNkZWZpbmUJWEZTU09fWEZTX0ZTQl9UT19EQUREUiAxCisjZGVmaW5lCVhGU1NPX1hGU19GU0JfVE9fREIgMQorI2RlZmluZQlYRlNTT19YRlNfSUFMTE9DX0lOT0RFUyAxCisjZGVmaW5lCVhGU1NPX1hGU19JRk9SS19BU0laRSAxCisjZGVmaW5lCVhGU1NPX1hGU19JRk9SS19EU0laRSAxCisjZGVmaW5lCVhGU1NPX1hGU19JRk9SS19GT1JNQVQgMQorI2RlZmluZQlYRlNTT19YRlNfSUZPUktfTkVYVF9TRVQgMQorI2RlZmluZQlYRlNTT19YRlNfSUZPUktfTkVYVEVOVFMgMQorI2RlZmluZQlYRlNTT19YRlNfSUZPUktfUFRSIDEKKyNkZWZpbmUJWEZTU09fWEZTX0lMT0dfRkJST09UIDEKKyNkZWZpbmUJWEZTU09fWEZTX0lMT0dfRkVYVCAxCisjZGVmaW5lCVhGU1NPX1hGU19JTk9fTUFTSyAxCisjZGVmaW5lCVhGU1NPX1hGU19JTk9fVE9fRlNCIDEKKyNkZWZpbmUJWEZTU09fWEZTX0lOT0RFX0NMRUFSX1JFQURfQUhFQUQgMQorI2RlZmluZQlYRlNTT19YRlNfTUlOX0ZSRUVMSVNUIDEKKyNkZWZpbmUgWEZTU09fWEZTX1NCX0dPT0RfVkVSU0lPTiAxCisjZGVmaW5lIFhGU1NPX1hGU19TQl9WRVJTSU9OX0hBU05MSU5LIDEKKyNkZWZpbmUJWEZTU09fWExPR19HUkFOVF9BRERfU1BBQ0UgMQorI2RlZmluZQlYRlNTT19YTE9HX0dSQU5UX1NVQl9TUEFDRSAxCisKKyNlbmRpZgkvKiBfX1hGU19NQUNST1NfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX21vdW50LmMgYi9mcy94ZnMveGZzX21vdW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU3NDIzYwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfbW91bnQuYwpAQCAtMCwwICsxLDE1ODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKyNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2FnLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvYy5oIgorI2luY2x1ZGUgInhmc19hdHRyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXIyX3NmLmgiCisjaW5jbHVkZSAieGZzX2Rpbm9kZS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19hbGxvYy5oIgorI2luY2x1ZGUgInhmc19ydGFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2JtYXAuaCIKKyNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCisjaW5jbHVkZSAieGZzX3J3LmgiCisjaW5jbHVkZSAieGZzX3F1b3RhLmgiCisjaW5jbHVkZSAieGZzX2Zzb3BzLmgiCisKK1NUQVRJQyB2b2lkCXhmc19tb3VudF9sb2dfc2J1bml0KHhmc19tb3VudF90ICosIF9faW50NjRfdCk7CitTVEFUSUMgaW50CXhmc191dWlkX21vdW50KHhmc19tb3VudF90ICopOworU1RBVElDIHZvaWQJeGZzX3V1aWRfdW5tb3VudCh4ZnNfbW91bnRfdCAqbXApOworCitzdGF0aWMgc3RydWN0IHsKKyAgICBzaG9ydCBvZmZzZXQ7CisgICAgc2hvcnQgdHlwZTsgICAgIC8qIDAgPSBpbnRlZ2VyCisJCSogMSA9IGJpbmFyeSAvIHN0cmluZyAobm8gdHJhbnNsYXRpb24pCisJCSovCit9IHhmc19zYl9pbmZvW10gPSB7CisgICAgeyBvZmZzZXRvZih4ZnNfc2JfdCwgc2JfbWFnaWNudW0pLCAgIDAgfSwKKyAgICB7IG9mZnNldG9mKHhmc19zYl90LCBzYl9ibG9ja3NpemUpLCAgMCB9LAorICAgIHsgb2Zmc2V0b2YoeGZzX3NiX3QsIHNiX2RibG9ja3MpLCAgICAwIH0sCisgICAgeyBvZmZzZXRvZih4ZnNfc2JfdCwgc2JfcmJsb2NrcyksICAgIDAgfSwKKyAgICB7IG9mZnNldG9mKHhmc19zYl90LCBzYl9yZXh0ZW50cyksICAgMCB9LAorICAgIHsgb2Zmc2V0b2YoeGZzX3NiX3QsIHNiX3V1aWQpLCAgICAgICAxIH0sCisgICAgeyBvZmZzZXRvZih4ZnNfc2JfdCwgc2JfbG9nc3RhcnQpLCAgIDAgfSwKKyAgICB7IG9mZnNldG9mKHhmc19zYl90LCBzYl9yb290aW5vKSwgICAgMCB9LAorICAgIHsgb2Zmc2V0b2YoeGZzX3NiX3QsIHNiX3JibWlubyksICAgICAwIH0sCisgICAgeyBvZmZzZXRvZih4ZnNfc2JfdCwgc2JfcnN1bWlubyksICAgIDAgfSwKKyAgICB7IG9mZnNldG9mKHhmc19zYl90LCBzYl9yZXh0c2l6ZSksICAgMCB9LAorICAgIHsgb2Zmc2V0b2YoeGZzX3NiX3QsIHNiX2FnYmxvY2tzKSwgICAwIH0sCisgICAgeyBvZmZzZXRvZih4ZnNfc2JfdCwgc2JfYWdjb3VudCksICAgIDAgfSwKKyAgICB7IG9mZnNldG9mKHhmc19zYl90LCBzYl9yYm1ibG9ja3MpLCAgMCB9LAorICAgIHsgb2Zmc2V0b2YoeGZzX3NiX3QsIHNiX2xvZ2Jsb2NrcyksICAwIH0sCisgICAgeyBvZmZzZXRvZih4ZnNfc2JfdCwgc2JfdmVyc2lvbm51bSksIDAgfSwKKyAgICB7IG9mZnNldG9mKHhmc19zYl90LCBzYl9zZWN0c2l6ZSksICAgMCB9LAorICAgIHsgb2Zmc2V0b2YoeGZzX3NiX3QsIHNiX2lub2Rlc2l6ZSksICAwIH0sCisgICAgeyBvZmZzZXRvZih4ZnNfc2JfdCwgc2JfaW5vcGJsb2NrKSwgIDAgfSwKKyAgICB7IG9mZnNldG9mKHhmc19zYl90LCBzYl9mbmFtZVswXSksICAgMSB9LAorICAgIHsgb2Zmc2V0b2YoeGZzX3NiX3QsIHNiX2Jsb2NrbG9nKSwgICAwIH0sCisgICAgeyBvZmZzZXRvZih4ZnNfc2JfdCwgc2Jfc2VjdGxvZyksICAgIDAgfSwKKyAgICB7IG9mZnNldG9mKHhmc19zYl90LCBzYl9pbm9kZWxvZyksICAgMCB9LAorICAgIHsgb2Zmc2V0b2YoeGZzX3NiX3QsIHNiX2lub3BibG9nKSwgICAwIH0sCisgICAgeyBvZmZzZXRvZih4ZnNfc2JfdCwgc2JfYWdibGtsb2cpLCAgIDAgfSwKKyAgICB7IG9mZnNldG9mKHhmc19zYl90LCBzYl9yZXh0c2xvZyksICAgMCB9LAorICAgIHsgb2Zmc2V0b2YoeGZzX3NiX3QsIHNiX2lucHJvZ3Jlc3MpLCAwIH0sCisgICAgeyBvZmZzZXRvZih4ZnNfc2JfdCwgc2JfaW1heF9wY3QpLCAgIDAgfSwKKyAgICB7IG9mZnNldG9mKHhmc19zYl90LCBzYl9pY291bnQpLCAgICAgMCB9LAorICAgIHsgb2Zmc2V0b2YoeGZzX3NiX3QsIHNiX2lmcmVlKSwgICAgICAwIH0sCisgICAgeyBvZmZzZXRvZih4ZnNfc2JfdCwgc2JfZmRibG9ja3MpLCAgIDAgfSwKKyAgICB7IG9mZnNldG9mKHhmc19zYl90LCBzYl9mcmV4dGVudHMpLCAgMCB9LAorICAgIHsgb2Zmc2V0b2YoeGZzX3NiX3QsIHNiX3VxdW90aW5vKSwgICAwIH0sCisgICAgeyBvZmZzZXRvZih4ZnNfc2JfdCwgc2JfZ3F1b3Rpbm8pLCAgIDAgfSwKKyAgICB7IG9mZnNldG9mKHhmc19zYl90LCBzYl9xZmxhZ3MpLCAgICAgMCB9LAorICAgIHsgb2Zmc2V0b2YoeGZzX3NiX3QsIHNiX2ZsYWdzKSwgICAgICAwIH0sCisgICAgeyBvZmZzZXRvZih4ZnNfc2JfdCwgc2Jfc2hhcmVkX3ZuKSwgIDAgfSwKKyAgICB7IG9mZnNldG9mKHhmc19zYl90LCBzYl9pbm9hbGlnbm10KSwgMCB9LAorICAgIHsgb2Zmc2V0b2YoeGZzX3NiX3QsIHNiX3VuaXQpLAkgMCB9LAorICAgIHsgb2Zmc2V0b2YoeGZzX3NiX3QsIHNiX3dpZHRoKSwJIDAgfSwKKyAgICB7IG9mZnNldG9mKHhmc19zYl90LCBzYl9kaXJibGtsb2cpLAkgMCB9LAorICAgIHsgb2Zmc2V0b2YoeGZzX3NiX3QsIHNiX2xvZ3NlY3Rsb2cpLCAwIH0sCisgICAgeyBvZmZzZXRvZih4ZnNfc2JfdCwgc2JfbG9nc2VjdHNpemUpLDAgfSwKKyAgICB7IG9mZnNldG9mKHhmc19zYl90LCBzYl9sb2dzdW5pdCksCSAwIH0sCisgICAgeyBvZmZzZXRvZih4ZnNfc2JfdCwgc2JfZmVhdHVyZXMyKSwJIDAgfSwKKyAgICB7IHNpemVvZih4ZnNfc2JfdCksCQkJIDAgfQorfTsKKworLyoKKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gYW4gaW5pdGlhbGl6ZWQgeGZzX21vdW50IHN0cnVjdHVyZS4KKyAqLworeGZzX21vdW50X3QgKgoreGZzX21vdW50X2luaXQodm9pZCkKK3sKKwl4ZnNfbW91bnRfdCAqbXA7CisKKwltcCA9IGttZW1femFsbG9jKHNpemVvZigqbXApLCBLTV9TTEVFUCk7CisKKwlBSUxfTE9DS0lOSVQoJm1wLT5tX2FpbF9sb2NrLCAieGZzX2FpbCIpOworCXNwaW5sb2NrX2luaXQoJm1wLT5tX3NiX2xvY2ssICJ4ZnNfc2IiKTsKKwltdXRleF9pbml0KCZtcC0+bV9pbG9jaywgTVVURVhfREVGQVVMVCwgInhmc19pbG9jayIpOworCWluaXRuc2VtYSgmbXAtPm1fZ3Jvd2xvY2ssIDEsICJ4ZnNfZ3JvdyIpOworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgQUlMLgorCSAqLworCXhmc190cmFuc19haWxfaW5pdChtcCk7CisKKwlhdG9taWNfc2V0KCZtcC0+bV9hY3RpdmVfdHJhbnMsIDApOworCisJcmV0dXJuIG1wOworfQorCisvKgorICogRnJlZSB1cCB0aGUgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhIG1vdW50IHN0cnVjdHVyZS4gIEFzc3VtZSB0aGF0CisgKiB0aGUgc3RydWN0dXJlIHdhcyBpbml0aWFsbHkgemVyb2VkLCBzbyB3ZSBjYW4gdGVsbCB3aGljaCBmaWVsZHMgZ290CisgKiBpbml0aWFsaXplZC4KKyAqLwordm9pZAoreGZzX21vdW50X2ZyZWUoCisJeGZzX21vdW50X3QgKm1wLAorCWludAkgICAgcmVtb3ZlX2JodikKK3sKKwlpZiAobXAtPm1faWhhc2gpCisJCXhmc19paGFzaF9mcmVlKG1wKTsKKwlpZiAobXAtPm1fY2hhc2gpCisJCXhmc19jaGFzaF9mcmVlKG1wKTsKKworCWlmIChtcC0+bV9wZXJhZykgeworCQlpbnQJYWdubzsKKworCQlmb3IgKGFnbm8gPSAwOyBhZ25vIDwgbXAtPm1fbWF4YWdpOyBhZ25vKyspCisJCQlpZiAobXAtPm1fcGVyYWdbYWdub10ucGFnYl9saXN0KQorCQkJCWttZW1fZnJlZShtcC0+bV9wZXJhZ1thZ25vXS5wYWdiX2xpc3QsCisJCQkJCQlzaXplb2YoeGZzX3BlcmFnX2J1c3lfdCkgKgorCQkJCQkJCVhGU19QQUdCX05VTV9TTE9UUyk7CisJCWttZW1fZnJlZShtcC0+bV9wZXJhZywKKwkJCSAgc2l6ZW9mKHhmc19wZXJhZ190KSAqIG1wLT5tX3NiLnNiX2FnY291bnQpOworCX0KKworCUFJTF9MT0NLX0RFU1RST1koJm1wLT5tX2FpbF9sb2NrKTsKKwlzcGlubG9ja19kZXN0cm95KCZtcC0+bV9zYl9sb2NrKTsKKwltdXRleF9kZXN0cm95KCZtcC0+bV9pbG9jayk7CisJZnJlZXNlbWEoJm1wLT5tX2dyb3dsb2NrKTsKKwlpZiAobXAtPm1fcXVvdGFpbmZvKQorCQlYRlNfUU1fRE9ORShtcCk7CisKKwlpZiAobXAtPm1fZnNuYW1lICE9IE5VTEwpCisJCWttZW1fZnJlZShtcC0+bV9mc25hbWUsIG1wLT5tX2ZzbmFtZV9sZW4pOworCisJaWYgKHJlbW92ZV9iaHYpIHsKKwkJc3RydWN0IHZmcwkqdmZzcCA9IFhGU19NVE9WRlMobXApOworCisJCWJodl9yZW1vdmVfYWxsX3Zmc29wcyh2ZnNwLCAwKTsKKwkJVkZTX1JFTU9WRUJIVih2ZnNwLCAmbXAtPm1fYmh2KTsKKwl9CisKKwlrbWVtX2ZyZWUobXAsIHNpemVvZih4ZnNfbW91bnRfdCkpOworfQorCisKKy8qCisgKiBDaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIFNCIGZvdW5kLgorICovCitTVEFUSUMgaW50Cit4ZnNfbW91bnRfdmFsaWRhdGVfc2IoCisJeGZzX21vdW50X3QJKm1wLAorCXhmc19zYl90CSpzYnApCit7CisJLyoKKwkgKiBJZiB0aGUgbG9nIGRldmljZSBhbmQgZGF0YSBkZXZpY2UgaGF2ZSB0aGUKKwkgKiBzYW1lIGRldmljZSBudW1iZXIsIHRoZSBsb2cgaXMgaW50ZXJuYWwuCisJICogQ29uc2VxdWVudGx5LCB0aGUgc2JfbG9nc3RhcnQgc2hvdWxkIGJlIG5vbi16ZXJvLiAgSWYKKwkgKiB3ZSBoYXZlIGEgemVybyBzYl9sb2dzdGFydCBpbiB0aGlzIGNhc2UsIHdlIG1heSBiZSB0cnlpbmcgdG8gbW91bnQKKwkgKiBhIHZvbHVtZSBmaWxlc3lzdGVtIGluIGEgbm9uLXZvbHVtZSBtYW5uZXIuCisJICovCisJaWYgKHNicC0+c2JfbWFnaWNudW0gIT0gWEZTX1NCX01BR0lDKSB7CisJCWNtbl9lcnIoQ0VfV0FSTiwgIlhGUzogYmFkIG1hZ2ljIG51bWJlciIpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVXUk9OR0ZTKTsKKwl9CisKKwlpZiAoIVhGU19TQl9HT09EX1ZFUlNJT04oc2JwKSkgeworCQljbW5fZXJyKENFX1dBUk4sICJYRlM6IGJhZCB2ZXJzaW9uIik7CisJCXJldHVybiBYRlNfRVJST1IoRVdST05HRlMpOworCX0KKworCWlmICh1bmxpa2VseSgKKwkgICAgc2JwLT5zYl9sb2dzdGFydCA9PSAwICYmIG1wLT5tX2xvZ2Rldl90YXJncCA9PSBtcC0+bV9kZGV2X3RhcmdwKSkgeworCQljbW5fZXJyKENFX1dBUk4sCisJIlhGUzogZmlsZXN5c3RlbSBpcyBtYXJrZWQgYXMgaGF2aW5nIGFuIGV4dGVybmFsIGxvZzsgIgorCSJzcGVjaWZ5IGxvZ2RldiBvbiB0aGVcbm1vdW50IGNvbW1hbmQgbGluZS4iKTsKKwkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhmc19tb3VudF92YWxpZGF0ZV9zYigxKSIsCisJCQkJICAgICBYRlNfRVJSTEVWRUxfSElHSCwgbXAsIHNicCk7CisJCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKKwl9CisKKwlpZiAodW5saWtlbHkoCisJICAgIHNicC0+c2JfbG9nc3RhcnQgIT0gMCAmJiBtcC0+bV9sb2dkZXZfdGFyZ3AgIT0gbXAtPm1fZGRldl90YXJncCkpIHsKKwkJY21uX2VycihDRV9XQVJOLAorCSJYRlM6IGZpbGVzeXN0ZW0gaXMgbWFya2VkIGFzIGhhdmluZyBhbiBpbnRlcm5hbCBsb2c7ICIKKwkiZG9uJ3Qgc3BlY2lmeSBsb2dkZXYgb25cbnRoZSBtb3VudCBjb21tYW5kIGxpbmUuIik7CisJCVhGU19DT1JSVVBUSU9OX0VSUk9SKCJ4ZnNfbW91bnRfdmFsaWRhdGVfc2IoMikiLAorCQkJCSAgICAgWEZTX0VSUkxFVkVMX0hJR0gsIG1wLCBzYnApOworCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJfQorCisJLyoKKwkgKiBNb3JlIHNhbml0eSBjaGVja2luZy4gVGhlc2Ugd2VyZSBzdG9sZW4gZGlyZWN0bHkgZnJvbQorCSAqIHhmc19yZXBhaXIuCisJICovCisJaWYgKHVubGlrZWx5KAorCSAgICBzYnAtPnNiX2FnY291bnQgPD0gMAkJCQkJfHwKKwkgICAgc2JwLT5zYl9zZWN0c2l6ZSA8IFhGU19NSU5fU0VDVE9SU0laRQkJCXx8CisJICAgIHNicC0+c2Jfc2VjdHNpemUgPiBYRlNfTUFYX1NFQ1RPUlNJWkUJCQl8fAorCSAgICBzYnAtPnNiX3NlY3Rsb2cgPCBYRlNfTUlOX1NFQ1RPUlNJWkVfTE9HCQkJfHwKKwkgICAgc2JwLT5zYl9zZWN0bG9nID4gWEZTX01BWF9TRUNUT1JTSVpFX0xPRwkJCXx8CisJICAgIHNicC0+c2JfYmxvY2tzaXplIDwgWEZTX01JTl9CTE9DS1NJWkUJCQl8fAorCSAgICBzYnAtPnNiX2Jsb2Nrc2l6ZSA+IFhGU19NQVhfQkxPQ0tTSVpFCQkJfHwKKwkgICAgc2JwLT5zYl9ibG9ja2xvZyA8IFhGU19NSU5fQkxPQ0tTSVpFX0xPRwkJCXx8CisJICAgIHNicC0+c2JfYmxvY2tsb2cgPiBYRlNfTUFYX0JMT0NLU0laRV9MT0cJCQl8fAorCSAgICBzYnAtPnNiX2lub2Rlc2l6ZSA8IFhGU19ESU5PREVfTUlOX1NJWkUJCQl8fAorCSAgICBzYnAtPnNiX2lub2Rlc2l6ZSA+IFhGU19ESU5PREVfTUFYX1NJWkUJCQl8fAorCSAgICAoc2JwLT5zYl9yZXh0c2l6ZSAqIHNicC0+c2JfYmxvY2tzaXplID4gWEZTX01BWF9SVEVYVFNJWkUpCXx8CisJICAgIChzYnAtPnNiX3JleHRzaXplICogc2JwLT5zYl9ibG9ja3NpemUgPCBYRlNfTUlOX1JURVhUU0laRSkJfHwKKwkgICAgc2JwLT5zYl9pbWF4X3BjdCA+IDEwMCkpIHsKKwkJY21uX2VycihDRV9XQVJOLCAiWEZTOiBTQiBzYW5pdHkgY2hlY2sgMSBmYWlsZWQiKTsKKwkJWEZTX0NPUlJVUFRJT05fRVJST1IoInhmc19tb3VudF92YWxpZGF0ZV9zYigzKSIsCisJCQkJICAgICBYRlNfRVJSTEVWRUxfTE9XLCBtcCwgc2JwKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCX0KKworCS8qCisJICogU2FuaXR5IGNoZWNrIEFHIGNvdW50LCBzaXplIGZpZWxkcyBhZ2FpbnN0IGRhdGEgc2l6ZSBmaWVsZAorCSAqLworCWlmICh1bmxpa2VseSgKKwkgICAgc2JwLT5zYl9kYmxvY2tzID09IDAgfHwKKwkgICAgc2JwLT5zYl9kYmxvY2tzID4KKwkgICAgICh4ZnNfZHJmc2Jub190KXNicC0+c2JfYWdjb3VudCAqIHNicC0+c2JfYWdibG9ja3MgfHwKKwkgICAgc2JwLT5zYl9kYmxvY2tzIDwgKHhmc19kcmZzYm5vX3QpKHNicC0+c2JfYWdjb3VudCAtIDEpICoKKwkJCSAgICAgIHNicC0+c2JfYWdibG9ja3MgKyBYRlNfTUlOX0FHX0JMT0NLUykpIHsKKwkJY21uX2VycihDRV9XQVJOLCAiWEZTOiBTQiBzYW5pdHkgY2hlY2sgMiBmYWlsZWQiKTsKKwkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX21vdW50X3ZhbGlkYXRlX3NiKDQpIiwKKwkJCQkgWEZTX0VSUkxFVkVMX0xPVywgbXApOworCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJfQorCisJQVNTRVJUKFBBR0VfU0hJRlQgPj0gc2JwLT5zYl9ibG9ja2xvZyk7CisJQVNTRVJUKHNicC0+c2JfYmxvY2tsb2cgPj0gQkJTSElGVCk7CisKKyNpZiBYRlNfQklHX0JMS05PUyAgICAgLyogTGltaXRlZCBieSBVTE9OR19NQVggb2YgcGFnZSBjYWNoZSBpbmRleCAqLworCWlmICh1bmxpa2VseSgKKwkgICAgKHNicC0+c2JfZGJsb2NrcyA+PiAoUEFHRV9TSElGVCAtIHNicC0+c2JfYmxvY2tsb2cpKSA+IFVMT05HX01BWCB8fAorCSAgICAoc2JwLT5zYl9yYmxvY2tzID4+IChQQUdFX1NISUZUIC0gc2JwLT5zYl9ibG9ja2xvZykpID4gVUxPTkdfTUFYKSkgeworI2Vsc2UgICAgICAgICAgICAgICAgICAvKiBMaW1pdGVkIGJ5IFVJTlRfTUFYIG9mIHNlY3RvcnMgKi8KKwlpZiAodW5saWtlbHkoCisJICAgIChzYnAtPnNiX2RibG9ja3MgPDwgKHNicC0+c2JfYmxvY2tsb2cgLSBCQlNISUZUKSkgPiBVSU5UX01BWCB8fAorCSAgICAoc2JwLT5zYl9yYmxvY2tzIDw8IChzYnAtPnNiX2Jsb2NrbG9nIC0gQkJTSElGVCkpID4gVUlOVF9NQVgpKSB7CisjZW5kaWYKKwkJY21uX2VycihDRV9XQVJOLAorCSJYRlM6IEZpbGUgc3lzdGVtIGlzIHRvbyBsYXJnZSB0byBiZSBtb3VudGVkIG9uIHRoaXMgc3lzdGVtLiIpOworCQlyZXR1cm4gWEZTX0VSUk9SKEUyQklHKTsKKwl9CisKKwlpZiAodW5saWtlbHkoc2JwLT5zYl9pbnByb2dyZXNzKSkgeworCQljbW5fZXJyKENFX1dBUk4sICJYRlM6IGZpbGUgc3lzdGVtIGJ1c3kiKTsKKwkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX21vdW50X3ZhbGlkYXRlX3NiKDUpIiwKKwkJCQkgWEZTX0VSUkxFVkVMX0xPVywgbXApOworCQlyZXR1cm4gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJfQorCisJLyoKKwkgKiBVbnRpbCB0aGlzIGlzIGZpeGVkIG9ubHkgcGFnZS1zaXplZCBvciBzbWFsbGVyIGRhdGEgYmxvY2tzIHdvcmsuCisJICovCisJaWYgKHVubGlrZWx5KHNicC0+c2JfYmxvY2tzaXplID4gUEFHRV9TSVpFKSkgeworCQljbW5fZXJyKENFX1dBUk4sCisJCSJYRlM6IEF0dGVtcHRlZCB0byBtb3VudCBmaWxlIHN5c3RlbSB3aXRoIGJsb2Nrc2l6ZSAlZCBieXRlcyIsCisJCQlzYnAtPnNiX2Jsb2Nrc2l6ZSk7CisJCWNtbl9lcnIoQ0VfV0FSTiwKKwkJIlhGUzogT25seSBwYWdlLXNpemVkICglZCkgb3IgbGVzcyBibG9ja3NpemVzIGN1cnJlbnRseSB3b3JrLiIsCisJCQlQQUdFX1NJWkUpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVOT1NZUyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3hmc19hZ251bWJlcl90Cit4ZnNfaW5pdGlhbGl6ZV9wZXJhZyh4ZnNfbW91bnRfdCAqbXAsIHhmc19hZ251bWJlcl90IGFnY291bnQpCit7CisJeGZzX2FnbnVtYmVyX3QJaW5kZXgsIG1heF9tZXRhZGF0YTsKKwl4ZnNfcGVyYWdfdAkqcGFnOworCXhmc19hZ2lub190CWFnaW5vOworCXhmc19pbm9fdAlpbm87CisJeGZzX3NiX3QJKnNicCA9ICZtcC0+bV9zYjsKKwl4ZnNfaW5vX3QJbWF4X2ludW0gPSBYRlNfTUFYSU5VTUJFUl8zMjsKKworCS8qIENoZWNrIHRvIHNlZSBpZiB0aGUgZmlsZXN5c3RlbSBjYW4gb3ZlcmZsb3cgMzIgYml0IGlub2RlcyAqLworCWFnaW5vID0gWEZTX09GRkJOT19UT19BR0lOTyhtcCwgc2JwLT5zYl9hZ2Jsb2NrcyAtIDEsIDApOworCWlubyA9IFhGU19BR0lOT19UT19JTk8obXAsIGFnY291bnQgLSAxLCBhZ2lubyk7CisKKwkvKiBDbGVhciB0aGUgbW91bnQgZmxhZyBpZiBubyBpbm9kZSBjYW4gb3ZlcmZsb3cgMzIgYml0cworCSAqIG9uIHRoaXMgZmlsZXN5c3RlbSwgb3IgaWYgc3BlY2lmaWNhbGx5IHJlcXVlc3RlZC4uCisJICovCisJaWYgKChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF8zMkJJVElOT09QVCkgJiYgaW5vID4gbWF4X2ludW0pIHsKKwkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UXzMyQklUSU5PREVTOworCX0gZWxzZSB7CisJCW1wLT5tX2ZsYWdzICY9IH5YRlNfTU9VTlRfMzJCSVRJTk9ERVM7CisJfQorCisJLyogSWYgd2UgY2FuIG92ZXJmbG93IHRoZW4gc2V0dXAgdGhlIGFnIGhlYWRlcnMgYWNjb3JkaW5nbHkgKi8KKwlpZiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfMzJCSVRJTk9ERVMpIHsKKwkJLyogQ2FsY3VsYXRlIGhvdyBtdWNoIHNob3VsZCBiZSByZXNlcnZlZCBmb3IgaW5vZGVzIHRvCisJCSAqIG1lZXQgdGhlIG1heCBpbm9kZSBwZXJjZW50YWdlLgorCQkgKi8KKwkJaWYgKG1wLT5tX21heGljb3VudCkgeworCQkJX191aW50NjRfdAlpY291bnQ7CisKKwkJCWljb3VudCA9IHNicC0+c2JfZGJsb2NrcyAqIHNicC0+c2JfaW1heF9wY3Q7CisJCQlkb19kaXYoaWNvdW50LCAxMDApOworCQkJaWNvdW50ICs9IHNicC0+c2JfYWdibG9ja3MgLSAxOworCQkJZG9fZGl2KGljb3VudCwgbXAtPm1faWFsbG9jX2Jsa3MpOworCQkJbWF4X21ldGFkYXRhID0gaWNvdW50OworCQl9IGVsc2UgeworCQkJbWF4X21ldGFkYXRhID0gYWdjb3VudDsKKwkJfQorCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBhZ2NvdW50OyBpbmRleCsrKSB7CisJCQlpbm8gPSBYRlNfQUdJTk9fVE9fSU5PKG1wLCBpbmRleCwgYWdpbm8pOworCQkJaWYgKGlubyA+IG1heF9pbnVtKSB7CisJCQkJaW5kZXgrKzsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogVGhpcyBhZyBpcyBwcmVmZXJlZCBmb3IgaW5vZGVzICovCisJCQlwYWcgPSAmbXAtPm1fcGVyYWdbaW5kZXhdOworCQkJcGFnLT5wYWdpX2lub2Rlb2sgPSAxOworCQkJaWYgKGluZGV4IDwgbWF4X21ldGFkYXRhKQorCQkJCXBhZy0+cGFnZl9tZXRhZGF0YSA9IDE7CisJCX0KKwl9IGVsc2UgeworCQkvKiBTZXR1cCBkZWZhdWx0IGJlaGF2aW9yIGZvciBzbWFsbGVyIGZpbGVzeXN0ZW1zICovCisJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGFnY291bnQ7IGluZGV4KyspIHsKKwkJCXBhZyA9ICZtcC0+bV9wZXJhZ1tpbmRleF07CisJCQlwYWctPnBhZ2lfaW5vZGVvayA9IDE7CisJCX0KKwl9CisJcmV0dXJuIGluZGV4OworfQorCisvKgorICogeGZzX3hsYXRlc2IKKyAqCisgKiAgICAgZGF0YSAgICAgICAtIG9uIGRpc2sgdmVyc2lvbiBvZiBzYgorICogICAgIHNiICAgICAgICAgLSBhIHN1cGVyYmxvY2sKKyAqICAgICBkaXIgICAgICAgIC0gY29udmVyc2lvbiBkaXJlY3Rpb246IDwwIC0gY29udmVydCBzYiB0byBidWYKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4wIC0gY29udmVydCBidWYgdG8gc2IKKyAqICAgICBmaWVsZHMgICAgIC0gd2hpY2ggZmllbGRzIHRvIGNvcHkgKGJpdG1hc2spCisgKi8KK3ZvaWQKK3hmc194bGF0ZXNiKAorCXZvaWQJCSpkYXRhLAorCXhmc19zYl90CSpzYiwKKwlpbnQJCWRpciwKKwlfX2ludDY0X3QJZmllbGRzKQoreworCXhmc19jYWRkcl90CWJ1Zl9wdHI7CisJeGZzX2NhZGRyX3QJbWVtX3B0cjsKKwl4ZnNfc2JfZmllbGRfdAlmOworCWludAkJZmlyc3Q7CisJaW50CQlzaXplOworCisJQVNTRVJUKGRpcik7CisJQVNTRVJUKGZpZWxkcyk7CisKKwlpZiAoIWZpZWxkcykKKwkJcmV0dXJuOworCisJYnVmX3B0ciA9ICh4ZnNfY2FkZHJfdClkYXRhOworCW1lbV9wdHIgPSAoeGZzX2NhZGRyX3Qpc2I7CisKKwl3aGlsZSAoZmllbGRzKSB7CisJCWYgPSAoeGZzX3NiX2ZpZWxkX3QpeGZzX2xvd2JpdDY0KChfX3VpbnQ2NF90KWZpZWxkcyk7CisJCWZpcnN0ID0geGZzX3NiX2luZm9bZl0ub2Zmc2V0OworCQlzaXplID0geGZzX3NiX2luZm9bZiArIDFdLm9mZnNldCAtIGZpcnN0OworCisJCUFTU0VSVCh4ZnNfc2JfaW5mb1tmXS50eXBlID09IDAgfHwgeGZzX3NiX2luZm9bZl0udHlwZSA9PSAxKTsKKworCQlpZiAoc2l6ZSA9PSAxIHx8IHhmc19zYl9pbmZvW2ZdLnR5cGUgPT0gMSkgeworCQkJaWYgKGRpciA+IDApIHsKKwkJCQltZW1jcHkobWVtX3B0ciArIGZpcnN0LCBidWZfcHRyICsgZmlyc3QsIHNpemUpOworCQkJfSBlbHNlIHsKKwkJCQltZW1jcHkoYnVmX3B0ciArIGZpcnN0LCBtZW1fcHRyICsgZmlyc3QsIHNpemUpOworCQkJfQorCQl9IGVsc2UgeworCQkJc3dpdGNoIChzaXplKSB7CisJCQljYXNlIDI6CisJCQkJSU5UX1hMQVRFKCooX191aW50MTZfdCopKGJ1Zl9wdHIrZmlyc3QpLAorCQkJCQkgICooX191aW50MTZfdCopKG1lbV9wdHIrZmlyc3QpLAorCQkJCQkgIGRpciwgQVJDSF9DT05WRVJUKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCQlJTlRfWExBVEUoKihfX3VpbnQzMl90KikoYnVmX3B0citmaXJzdCksCisJCQkJCSAgKihfX3VpbnQzMl90KikobWVtX3B0citmaXJzdCksCisJCQkJCSAgZGlyLCBBUkNIX0NPTlZFUlQpOworCQkJCWJyZWFrOworCQkJY2FzZSA4OgorCQkJCUlOVF9YTEFURSgqKF9fdWludDY0X3QqKShidWZfcHRyK2ZpcnN0KSwKKwkJCQkJICAqKF9fdWludDY0X3QqKShtZW1fcHRyK2ZpcnN0KSwgZGlyLCBBUkNIX0NPTlZFUlQpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlBU1NFUlQoMCk7CisJCQl9CisJCX0KKworCQlmaWVsZHMgJj0gfigxTEwgPDwgZik7CisJfQorfQorCisvKgorICogeGZzX3JlYWRzYgorICoKKyAqIERvZXMgdGhlIGluaXRpYWwgcmVhZCBvZiB0aGUgc3VwZXJibG9jay4KKyAqLworaW50Cit4ZnNfcmVhZHNiKHhmc19tb3VudF90ICptcCkKK3sKKwl1bnNpZ25lZCBpbnQJc2VjdG9yX3NpemU7CisJdW5zaWduZWQgaW50CWV4dHJhX2ZsYWdzOworCXhmc19idWZfdAkqYnA7CisJeGZzX3NiX3QJKnNicDsKKwlpbnQJCWVycm9yOworCisJQVNTRVJUKG1wLT5tX3NiX2JwID09IE5VTEwpOworCUFTU0VSVChtcC0+bV9kZGV2X3RhcmdwICE9IE5VTEwpOworCisJLyoKKwkgKiBBbGxvY2F0ZSBhIChsb2NrZWQpIGJ1ZmZlciB0byBob2xkIHRoZSBzdXBlcmJsb2NrLgorCSAqIFRoaXMgd2lsbCBiZSBrZXB0IGFyb3VuZCBhdCBhbGwgdGltZXMgdG8gb3B0aW1pemUKKwkgKiBhY2Nlc3MgdG8gdGhlIHN1cGVyYmxvY2suCisJICovCisJc2VjdG9yX3NpemUgPSB4ZnNfZ2V0c2l6ZV9idWZ0YXJnKG1wLT5tX2RkZXZfdGFyZ3ApOworCWV4dHJhX2ZsYWdzID0gWEZTX0JVRl9MT0NLIHwgWEZTX0JVRl9NQU5BR0UgfCBYRlNfQlVGX01BUFBFRDsKKworCWJwID0geGZzX2J1Zl9yZWFkX2ZsYWdzKG1wLT5tX2RkZXZfdGFyZ3AsIFhGU19TQl9EQUREUiwKKwkJCQlCVE9CQihzZWN0b3Jfc2l6ZSksIGV4dHJhX2ZsYWdzKTsKKwlpZiAoIWJwIHx8IFhGU19CVUZfSVNFUlJPUihicCkpIHsKKwkJY21uX2VycihDRV9XQVJOLCAiWEZTOiBTQiByZWFkIGZhaWxlZCIpOworCQllcnJvciA9IGJwID8gWEZTX0JVRl9HRVRFUlJPUihicCkgOiBFTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisJQVNTRVJUKFhGU19CVUZfSVNCVVNZKGJwKSk7CisJQVNTRVJUKFhGU19CVUZfVkFMVVNFTUEoYnApIDw9IDApOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBtb3VudCBzdHJ1Y3R1cmUgZnJvbSB0aGUgc3VwZXJibG9jay4KKwkgKiBCdXQgZmlyc3QgZG8gc29tZSBiYXNpYyBjb25zaXN0ZW5jeSBjaGVja2luZy4KKwkgKi8KKwlzYnAgPSBYRlNfQlVGX1RPX1NCUChicCk7CisJeGZzX3hsYXRlc2IoWEZTX0JVRl9QVFIoYnApLCAmKG1wLT5tX3NiKSwgMSwgWEZTX1NCX0FMTF9CSVRTKTsKKworCWVycm9yID0geGZzX21vdW50X3ZhbGlkYXRlX3NiKG1wLCAmKG1wLT5tX3NiKSk7CisJaWYgKGVycm9yKSB7CisJCWNtbl9lcnIoQ0VfV0FSTiwgIlhGUzogU0IgdmFsaWRhdGUgZmFpbGVkIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKgorCSAqIFdlIG11c3QgYmUgYWJsZSB0byBkbyBzZWN0b3Itc2l6ZWQgYW5kIHNlY3Rvci1hbGlnbmVkIElPLgorCSAqLworCWlmIChzZWN0b3Jfc2l6ZSA+IG1wLT5tX3NiLnNiX3NlY3RzaXplKSB7CisJCWNtbl9lcnIoQ0VfV0FSTiwKKwkJCSJYRlM6IGRldmljZSBzdXBwb3J0cyBvbmx5ICV1IGJ5dGUgc2VjdG9ycyAobm90ICV1KSIsCisJCQlzZWN0b3Jfc2l6ZSwgbXAtPm1fc2Iuc2Jfc2VjdHNpemUpOworCQllcnJvciA9IEVOT1NZUzsKKwkJZ290byBmYWlsOworCX0KKworCS8qCisJICogSWYgZGV2aWNlIHNlY3RvciBzaXplIGlzIHNtYWxsZXIgdGhhbiB0aGUgc3VwZXJibG9jayBzaXplLAorCSAqIHJlLXJlYWQgdGhlIHN1cGVyYmxvY2sgc28gdGhlIGJ1ZmZlciBpcyBjb3JyZWN0bHkgc2l6ZWQuCisJICovCisJaWYgKHNlY3Rvcl9zaXplIDwgbXAtPm1fc2Iuc2Jfc2VjdHNpemUpIHsKKwkJWEZTX0JVRl9VTk1BTkFHRShicCk7CisJCXhmc19idWZfcmVsc2UoYnApOworCQlzZWN0b3Jfc2l6ZSA9IG1wLT5tX3NiLnNiX3NlY3RzaXplOworCQlicCA9IHhmc19idWZfcmVhZF9mbGFncyhtcC0+bV9kZGV2X3RhcmdwLCBYRlNfU0JfREFERFIsCisJCQkJCUJUT0JCKHNlY3Rvcl9zaXplKSwgZXh0cmFfZmxhZ3MpOworCQlpZiAoIWJwIHx8IFhGU19CVUZfSVNFUlJPUihicCkpIHsKKwkJCWNtbl9lcnIoQ0VfV0FSTiwgIlhGUzogU0IgcmUtcmVhZCBmYWlsZWQiKTsKKwkJCWVycm9yID0gYnAgPyBYRlNfQlVGX0dFVEVSUk9SKGJwKSA6IEVOT01FTTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlBU1NFUlQoWEZTX0JVRl9JU0JVU1koYnApKTsKKwkJQVNTRVJUKFhGU19CVUZfVkFMVVNFTUEoYnApIDw9IDApOworCX0KKworCW1wLT5tX3NiX2JwID0gYnA7CisJeGZzX2J1Zl9yZWxzZShicCk7CisJQVNTRVJUKFhGU19CVUZfVkFMVVNFTUEoYnApID4gMCk7CisJcmV0dXJuIDA7CisKKyBmYWlsOgorCWlmIChicCkgeworCQlYRlNfQlVGX1VOTUFOQUdFKGJwKTsKKwkJeGZzX2J1Zl9yZWxzZShicCk7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworCisvKgorICogeGZzX21vdW50X2NvbW1vbgorICoKKyAqIE1vdW50IGluaXRpYWxpemF0aW9uIGNvZGUgZXN0YWJsaXNoaW5nIHZhcmlvdXMgbW91bnQKKyAqIGZpZWxkcyBmcm9tIHRoZSBzdXBlcmJsb2NrIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4KKyAqIG1vdW50IHN0cnVjdHVyZQorICovCit2b2lkCit4ZnNfbW91bnRfY29tbW9uKHhmc19tb3VudF90ICptcCwgeGZzX3NiX3QgKnNicCkKK3sKKwlpbnQJaTsKKworCW1wLT5tX2FnZnJvdG9yID0gbXAtPm1fYWdpcm90b3IgPSAwOworCXNwaW5sb2NrX2luaXQoJm1wLT5tX2FnaXJvdG9yX2xvY2ssICJtX2FnaXJvdG9yX2xvY2siKTsKKwltcC0+bV9tYXhhZ2kgPSBtcC0+bV9zYi5zYl9hZ2NvdW50OworCW1wLT5tX2Jsa2JpdF9sb2cgPSBzYnAtPnNiX2Jsb2NrbG9nICsgWEZTX05CQllMT0c7CisJbXAtPm1fYmxrYmJfbG9nID0gc2JwLT5zYl9ibG9ja2xvZyAtIEJCU0hJRlQ7CisJbXAtPm1fc2VjdGJiX2xvZyA9IHNicC0+c2Jfc2VjdGxvZyAtIEJCU0hJRlQ7CisJbXAtPm1fYWdub19sb2cgPSB4ZnNfaGlnaGJpdDMyKHNicC0+c2JfYWdjb3VudCAtIDEpICsgMTsKKwltcC0+bV9hZ2lub19sb2cgPSBzYnAtPnNiX2lub3BibG9nICsgc2JwLT5zYl9hZ2Jsa2xvZzsKKwltcC0+bV9saXRpbm8gPSBzYnAtPnNiX2lub2Rlc2l6ZSAtCisJCSgodWludClzaXplb2YoeGZzX2Rpbm9kZV9jb3JlX3QpICsgKHVpbnQpc2l6ZW9mKHhmc19hZ2lub190KSk7CisJbXAtPm1fYmxvY2ttYXNrID0gc2JwLT5zYl9ibG9ja3NpemUgLSAxOworCW1wLT5tX2Jsb2Nrd3NpemUgPSBzYnAtPnNiX2Jsb2Nrc2l6ZSA+PiBYRlNfV09SRExPRzsKKwltcC0+bV9ibG9ja3dtYXNrID0gbXAtPm1fYmxvY2t3c2l6ZSAtIDE7CisJSU5JVF9MSVNUX0hFQUQoJm1wLT5tX2RlbF9pbm9kZXMpOworCisJLyoKKwkgKiBTZXR1cCBmb3IgYXR0cmlidXRlcywgaW4gY2FzZSB0aGV5IGdldCBjcmVhdGVkLgorCSAqIFRoaXMgdmFsdWUgaXMgZm9yIGlub2RlcyBnZXR0aW5nIGF0dHJpYnV0ZXMgZm9yIHRoZSBmaXJzdCB0aW1lLAorCSAqIHRoZSBwZXItaW5vZGUgdmFsdWUgaXMgZm9yIG9sZCBhdHRyaWJ1dGUgdmFsdWVzLgorCSAqLworCUFTU0VSVChzYnAtPnNiX2lub2Rlc2l6ZSA+PSAyNTYgJiYgc2JwLT5zYl9pbm9kZXNpemUgPD0gMjA0OCk7CisJc3dpdGNoIChzYnAtPnNiX2lub2Rlc2l6ZSkgeworCWNhc2UgMjU2OgorCQltcC0+bV9hdHRyb2Zmc2V0ID0gWEZTX0xJVElOTyhtcCkgLSBYRlNfQk1EUl9TUEFDRV9DQUxDKDIpOworCQlicmVhazsKKwljYXNlIDUxMjoKKwljYXNlIDEwMjQ6CisJY2FzZSAyMDQ4OgorCQltcC0+bV9hdHRyb2Zmc2V0ID0gWEZTX0JNRFJfU1BBQ0VfQ0FMQygxMik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUFTU0VSVCgwKTsKKwl9CisJQVNTRVJUKG1wLT5tX2F0dHJvZmZzZXQgPCBYRlNfTElUSU5PKG1wKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCW1wLT5tX2FsbG9jX214cltpXSA9IFhGU19CVFJFRV9CTE9DS19NQVhSRUNTKHNicC0+c2JfYmxvY2tzaXplLAorCQkJeGZzX2FsbG9jLCBpID09IDApOworCQltcC0+bV9hbGxvY19tbnJbaV0gPSBYRlNfQlRSRUVfQkxPQ0tfTUlOUkVDUyhzYnAtPnNiX2Jsb2Nrc2l6ZSwKKwkJCXhmc19hbGxvYywgaSA9PSAwKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQltcC0+bV9ibWFwX2RteHJbaV0gPSBYRlNfQlRSRUVfQkxPQ0tfTUFYUkVDUyhzYnAtPnNiX2Jsb2Nrc2l6ZSwKKwkJCXhmc19ibWJ0LCBpID09IDApOworCQltcC0+bV9ibWFwX2RtbnJbaV0gPSBYRlNfQlRSRUVfQkxPQ0tfTUlOUkVDUyhzYnAtPnNiX2Jsb2Nrc2l6ZSwKKwkJCXhmc19ibWJ0LCBpID09IDApOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCW1wLT5tX2lub2J0X214cltpXSA9IFhGU19CVFJFRV9CTE9DS19NQVhSRUNTKHNicC0+c2JfYmxvY2tzaXplLAorCQkJeGZzX2lub2J0LCBpID09IDApOworCQltcC0+bV9pbm9idF9tbnJbaV0gPSBYRlNfQlRSRUVfQkxPQ0tfTUlOUkVDUyhzYnAtPnNiX2Jsb2Nrc2l6ZSwKKwkJCXhmc19pbm9idCwgaSA9PSAwKTsKKwl9CisKKwltcC0+bV9ic2l6ZSA9IFhGU19GU0JfVE9fQkIobXAsIDEpOworCW1wLT5tX2lhbGxvY19pbm9zID0gKGludClNQVgoKF9fdWludDE2X3QpWEZTX0lOT0RFU19QRVJfQ0hVTkssCisJCQkJCXNicC0+c2JfaW5vcGJsb2NrKTsKKwltcC0+bV9pYWxsb2NfYmxrcyA9IG1wLT5tX2lhbGxvY19pbm9zID4+IHNicC0+c2JfaW5vcGJsb2c7Cit9CisvKgorICogeGZzX21vdW50ZnMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIGZvbGxvd2luZyBvbiBhbiBpbml0aWFsIG1vdW50IG9mIGEgZmlsZSBzeXN0ZW06CisgKgktIHJlYWRzIHRoZSBzdXBlcmJsb2NrIGZyb20gZGlzayBhbmQgaW5pdCB0aGUgbW91bnQgc3RydWN0CisgKgktIGlmIHdlJ3JlIGEgMzItYml0IGtlcm5lbCwgZG8gYSBzaXplIGNoZWNrIG9uIHRoZSBzdXBlcmJsb2NrCisgKgkJc28gd2UgZG9uJ3QgbW91bnQgdGVyYWJ5dGUgZmlsZXN5c3RlbXMKKyAqCS0gaW5pdCBtb3VudCBzdHJ1Y3QgcmVhbHRpbWUgZmllbGRzCisgKgktIGFsbG9jYXRlIGlub2RlIGhhc2ggdGFibGUgZm9yIGZzCisgKgktIGluaXQgZGlyZWN0b3J5IG1hbmFnZXIKKyAqCS0gcGVyZm9ybSByZWNvdmVyeSBhbmQgaW5pdCB0aGUgbG9nIG1hbmFnZXIKKyAqLworaW50Cit4ZnNfbW91bnRmcygKKwl2ZnNfdAkJKnZmc3AsCisJeGZzX21vdW50X3QJKm1wLAorCWludAkJbWZzaV9mbGFncykKK3sKKwl4ZnNfYnVmX3QJKmJwOworCXhmc19zYl90CSpzYnAgPSAmKG1wLT5tX3NiKTsKKwl4ZnNfaW5vZGVfdAkqcmlwOworCXZub2RlX3QJCSpydnAgPSBOVUxMOworCWludAkJcmVhZGlvX2xvZywgd3JpdGVpb19sb2c7CisJeGZzX2RhZGRyX3QJZDsKKwlfX3VpbnQ2NF90CXJldDY0OworCV9faW50NjRfdAl1cGRhdGVfZmxhZ3M7CisJdWludAkJcXVvdGFtb3VudCwgcXVvdGFmbGFnczsKKwlpbnQJCWFnbm87CisJaW50CQl1dWlkX21vdW50ZWQgPSAwOworCWludAkJZXJyb3IgPSAwOworCisJaWYgKG1wLT5tX3NiX2JwID09IE5VTEwpIHsKKwkJaWYgKChlcnJvciA9IHhmc19yZWFkc2IobXApKSkgeworCQkJcmV0dXJuIChlcnJvcik7CisJCX0KKwl9CisJeGZzX21vdW50X2NvbW1vbihtcCwgc2JwKTsKKworCS8qCisJICogQ2hlY2sgaWYgc2JfYWdibG9ja3MgaXMgYWxpZ25lZCBhdCBzdHJpcGUgYm91bmRhcnkKKwkgKiBJZiBzYl9hZ2Jsb2NrcyBpcyBOT1QgYWxpZ25lZCB0dXJuIG9mZiBtX2RhbGlnbiBzaW5jZQorCSAqIGFsbG9jYXRvciBhbGlnbm1lbnQgaXMgd2l0aGluIGFuIGFnLCB0aGVyZWZvcmUgYWcgaGFzCisJICogdG8gYmUgYWxpZ25lZCBhdCBzdHJpcGUgYm91bmRhcnkuCisJICovCisJdXBkYXRlX2ZsYWdzID0gMExMOworCWlmIChtcC0+bV9kYWxpZ24gJiYgIShtZnNpX2ZsYWdzICYgWEZTX01GU0lfU0VDT05EKSkgeworCQkvKgorCQkgKiBJZiBzdHJpcGUgdW5pdCBhbmQgc3RyaXBlIHdpZHRoIGFyZSBub3QgbXVsdGlwbGVzCisJCSAqIG9mIHRoZSBmcyBibG9ja3NpemUgdHVybiBvZmYgYWxpZ25tZW50LgorCQkgKi8KKwkJaWYgKChCQlRPQihtcC0+bV9kYWxpZ24pICYgbXAtPm1fYmxvY2ttYXNrKSB8fAorCQkgICAgKEJCVE9CKG1wLT5tX3N3aWR0aCkgJiBtcC0+bV9ibG9ja21hc2spKSB7CisJCQlpZiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfUkVURVJSKSB7CisJCQkJY21uX2VycihDRV9XQVJOLAorCQkJCQkiWEZTOiBhbGlnbm1lbnQgY2hlY2sgMSBmYWlsZWQiKTsKKwkJCQllcnJvciA9IFhGU19FUlJPUihFSU5WQUwpOworCQkJCWdvdG8gZXJyb3IxOworCQkJfQorCQkJbXAtPm1fZGFsaWduID0gbXAtPm1fc3dpZHRoID0gMDsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBDb252ZXJ0IHRoZSBzdHJpcGUgdW5pdCBhbmQgd2lkdGggdG8gRlNCcy4KKwkJCSAqLworCQkJbXAtPm1fZGFsaWduID0gWEZTX0JCX1RPX0ZTQlQobXAsIG1wLT5tX2RhbGlnbik7CisJCQlpZiAobXAtPm1fZGFsaWduICYmIChzYnAtPnNiX2FnYmxvY2tzICUgbXAtPm1fZGFsaWduKSkgeworCQkJCWlmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9SRVRFUlIpIHsKKwkJCQkJZXJyb3IgPSBYRlNfRVJST1IoRUlOVkFMKTsKKwkJCQkJZ290byBlcnJvcjE7CisJCQkJfQorCQkJCXhmc19mc19jbW5fZXJyKENFX1dBUk4sIG1wLAorInN0cmlwZSBhbGlnbm1lbnQgdHVybmVkIG9mZjogc3VuaXQoJWQpL3N3aWR0aCglZCkgaW5jb21wYXRpYmxlIHdpdGggYWdzaXplKCVkKSIsCisJCQkJCW1wLT5tX2RhbGlnbiwgbXAtPm1fc3dpZHRoLAorCQkJCQlzYnAtPnNiX2FnYmxvY2tzKTsKKworCQkJCW1wLT5tX2RhbGlnbiA9IDA7CisJCQkJbXAtPm1fc3dpZHRoID0gMDsKKwkJCX0gZWxzZSBpZiAobXAtPm1fZGFsaWduKSB7CisJCQkJbXAtPm1fc3dpZHRoID0gWEZTX0JCX1RPX0ZTQlQobXAsIG1wLT5tX3N3aWR0aCk7CisJCQl9IGVsc2UgeworCQkJCWlmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9SRVRFUlIpIHsKKwkJCQkJeGZzX2ZzX2Ntbl9lcnIoQ0VfV0FSTiwgbXAsCisic3RyaXBlIGFsaWdubWVudCB0dXJuZWQgb2ZmOiBzdW5pdCglZCkgbGVzcyB0aGFuIGJzaXplKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCW1wLT5tX2RhbGlnbiwKKwkJCQkJCW1wLT5tX2Jsb2NrbWFzayArMSk7CisJCQkJCWVycm9yID0gWEZTX0VSUk9SKEVJTlZBTCk7CisJCQkJCWdvdG8gZXJyb3IxOworCQkJCX0KKwkJCQltcC0+bV9zd2lkdGggPSAwOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogVXBkYXRlIHN1cGVyYmxvY2sgd2l0aCBuZXcgdmFsdWVzCisJCSAqIGFuZCBsb2cgY2hhbmdlcworCQkgKi8KKwkJaWYgKFhGU19TQl9WRVJTSU9OX0hBU0RBTElHTihzYnApKSB7CisJCQlpZiAoc2JwLT5zYl91bml0ICE9IG1wLT5tX2RhbGlnbikgeworCQkJCXNicC0+c2JfdW5pdCA9IG1wLT5tX2RhbGlnbjsKKwkJCQl1cGRhdGVfZmxhZ3MgfD0gWEZTX1NCX1VOSVQ7CisJCQl9CisJCQlpZiAoc2JwLT5zYl93aWR0aCAhPSBtcC0+bV9zd2lkdGgpIHsKKwkJCQlzYnAtPnNiX3dpZHRoID0gbXAtPm1fc3dpZHRoOworCQkJCXVwZGF0ZV9mbGFncyB8PSBYRlNfU0JfV0lEVEg7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9OT0FMSUdOKSAhPSBYRlNfTU9VTlRfTk9BTElHTiAmJgorCQkgICAgWEZTX1NCX1ZFUlNJT05fSEFTREFMSUdOKCZtcC0+bV9zYikpIHsKKwkJCW1wLT5tX2RhbGlnbiA9IHNicC0+c2JfdW5pdDsKKwkJCW1wLT5tX3N3aWR0aCA9IHNicC0+c2Jfd2lkdGg7CisJfQorCisJeGZzX2FsbG9jX2NvbXB1dGVfbWF4bGV2ZWxzKG1wKTsKKwl4ZnNfYm1hcF9jb21wdXRlX21heGxldmVscyhtcCwgWEZTX0RBVEFfRk9SSyk7CisJeGZzX2JtYXBfY29tcHV0ZV9tYXhsZXZlbHMobXAsIFhGU19BVFRSX0ZPUkspOworCXhmc19pYWxsb2NfY29tcHV0ZV9tYXhsZXZlbHMobXApOworCisJaWYgKHNicC0+c2JfaW1heF9wY3QpIHsKKwkJX191aW50NjRfdAlpY291bnQ7CisKKwkJLyogTWFrZSBzdXJlIHRoZSBtYXhpbXVtIGlub2RlIGNvdW50IGlzIGEgbXVsdGlwbGUgb2YgdGhlCisJCSAqIHVuaXRzIHdlIGFsbG9jYXRlIGlub2RlcyBpbi4KKwkJICovCisKKwkJaWNvdW50ID0gc2JwLT5zYl9kYmxvY2tzICogc2JwLT5zYl9pbWF4X3BjdDsKKwkJZG9fZGl2KGljb3VudCwgMTAwKTsKKwkJZG9fZGl2KGljb3VudCwgbXAtPm1faWFsbG9jX2Jsa3MpOworCQltcC0+bV9tYXhpY291bnQgPSAoaWNvdW50ICogbXAtPm1faWFsbG9jX2Jsa3MpICA8PAorCQkJCSAgIHNicC0+c2JfaW5vcGJsb2c7CisJfSBlbHNlCisJCW1wLT5tX21heGljb3VudCA9IDA7CisKKwltcC0+bV9tYXhpb2Zmc2V0ID0geGZzX21heF9maWxlX29mZnNldChzYnAtPnNiX2Jsb2NrbG9nKTsKKworCS8qCisJICogWEZTIHVzZXMgdGhlIHV1aWQgZnJvbSB0aGUgc3VwZXJibG9jayBhcyB0aGUgdW5pcXVlCisJICogaWRlbnRpZmllciBmb3IgZnNpZC4gIFdlIGNhbiBub3QgdXNlIHRoZSB1dWlkIGZyb20gdGhlIHZvbHVtZQorCSAqIHNpbmNlIGEgc2luZ2xlIHBhcnRpdGlvbiBmaWxlc3lzdGVtIGlzIGlkZW50aWNhbCB0byBhIHNpbmdsZQorCSAqIHBhcnRpdGlvbiB2b2x1bWUvZmlsZXN5c3RlbS4KKwkgKi8KKwlpZiAoKG1mc2lfZmxhZ3MgJiBYRlNfTUZTSV9TRUNPTkQpID09IDAgJiYKKwkgICAgKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX05PVVVJRCkgPT0gMCkgeworCQlpZiAoeGZzX3V1aWRfbW91bnQobXApKSB7CisJCQllcnJvciA9IFhGU19FUlJPUihFSU5WQUwpOworCQkJZ290byBlcnJvcjE7CisJCX0KKwkJdXVpZF9tb3VudGVkPTE7CisJCXJldDY0ID0gdXVpZF9oYXNoNjQoJnNicC0+c2JfdXVpZCk7CisJCW1lbWNweSgmdmZzcC0+dmZzX2ZzaWQsICZyZXQ2NCwgc2l6ZW9mKHJldDY0KSk7CisJfQorCisJLyoKKwkgKiBTZXQgdGhlIGRlZmF1bHQgbWluaW11bSByZWFkIGFuZCB3cml0ZSBzaXplcyB1bmxlc3MKKwkgKiBhbHJlYWR5IHNwZWNpZmllZCBpbiBhIG1vdW50IG9wdGlvbi4KKwkgKiBXZSB1c2Ugc21hbGxlciBJL08gc2l6ZXMgd2hlbiB0aGUgZmlsZSBzeXN0ZW0KKwkgKiBpcyBiZWluZyB1c2VkIGZvciBORlMgc2VydmljZSAod3N5bmMgbW91bnQgb3B0aW9uKS4KKwkgKi8KKwlpZiAoIShtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9ERkxUX0lPU0laRSkpIHsKKwkJaWYgKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX1dTWU5DKSB7CisJCQlyZWFkaW9fbG9nID0gWEZTX1dTWU5DX1JFQURJT19MT0c7CisJCQl3cml0ZWlvX2xvZyA9IFhGU19XU1lOQ19XUklURUlPX0xPRzsKKwkJfSBlbHNlIHsKKwkJCXJlYWRpb19sb2cgPSBYRlNfUkVBRElPX0xPR19MQVJHRTsKKwkJCXdyaXRlaW9fbG9nID0gWEZTX1dSSVRFSU9fTE9HX0xBUkdFOworCQl9CisJfSBlbHNlIHsKKwkJcmVhZGlvX2xvZyA9IG1wLT5tX3JlYWRpb19sb2c7CisJCXdyaXRlaW9fbG9nID0gbXAtPm1fd3JpdGVpb19sb2c7CisJfQorCisJLyoKKwkgKiBTZXQgdGhlIG51bWJlciBvZiByZWFkYWhlYWQgYnVmZmVycyB0byB1c2UgYmFzZWQgb24KKwkgKiBwaHlzaWNhbCBtZW1vcnkgc2l6ZS4KKwkgKi8KKwlpZiAoeGZzX3BoeXNtZW0gPD0gNDA5NikJCS8qIDw9IDE2TUIgKi8KKwkJbXAtPm1fbnJlYWRhaGVhZHMgPSBYRlNfUldfTlJFQURBSEVBRF8xNk1COworCWVsc2UgaWYgKHhmc19waHlzbWVtIDw9IDgxOTIpCS8qIDw9IDMyTUIgKi8KKwkJbXAtPm1fbnJlYWRhaGVhZHMgPSBYRlNfUldfTlJFQURBSEVBRF8zMk1COworCWVsc2UKKwkJbXAtPm1fbnJlYWRhaGVhZHMgPSBYRlNfUldfTlJFQURBSEVBRF9LMzI7CisJaWYgKHNicC0+c2JfYmxvY2tsb2cgPiByZWFkaW9fbG9nKSB7CisJCW1wLT5tX3JlYWRpb19sb2cgPSBzYnAtPnNiX2Jsb2NrbG9nOworCX0gZWxzZSB7CisJCW1wLT5tX3JlYWRpb19sb2cgPSByZWFkaW9fbG9nOworCX0KKwltcC0+bV9yZWFkaW9fYmxvY2tzID0gMSA8PCAobXAtPm1fcmVhZGlvX2xvZyAtIHNicC0+c2JfYmxvY2tsb2cpOworCWlmIChzYnAtPnNiX2Jsb2NrbG9nID4gd3JpdGVpb19sb2cpIHsKKwkJbXAtPm1fd3JpdGVpb19sb2cgPSBzYnAtPnNiX2Jsb2NrbG9nOworCX0gZWxzZSB7CisJCW1wLT5tX3dyaXRlaW9fbG9nID0gd3JpdGVpb19sb2c7CisJfQorCW1wLT5tX3dyaXRlaW9fYmxvY2tzID0gMSA8PCAobXAtPm1fd3JpdGVpb19sb2cgLSBzYnAtPnNiX2Jsb2NrbG9nKTsKKworCS8qCisJICogU2V0IHRoZSBpbm9kZSBjbHVzdGVyIHNpemUgYmFzZWQgb24gdGhlIHBoeXNpY2FsIG1lbW9yeQorCSAqIHNpemUuICBUaGlzIG1heSBzdGlsbCBiZSBvdmVycmlkZGVuIGJ5IHRoZSBmaWxlIHN5c3RlbQorCSAqIGJsb2NrIHNpemUgaWYgaXQgaXMgbGFyZ2VyIHRoYW4gdGhlIGNob3NlbiBjbHVzdGVyIHNpemUuCisJICovCisJaWYgKHhmc19waHlzbWVtIDw9IGJ0b2MoMzIgKiAxMDI0ICogMTAyNCkpIHsgLyogPD0gMzIgTUIgKi8KKwkJbXAtPm1faW5vZGVfY2x1c3Rlcl9zaXplID0gWEZTX0lOT0RFX1NNQUxMX0NMVVNURVJfU0laRTsKKwl9IGVsc2UgeworCQltcC0+bV9pbm9kZV9jbHVzdGVyX3NpemUgPSBYRlNfSU5PREVfQklHX0NMVVNURVJfU0laRTsKKwl9CisJLyoKKwkgKiBTZXQgd2hldGhlciB3ZSdyZSB1c2luZyBpbm9kZSBhbGlnbm1lbnQuCisJICovCisJaWYgKFhGU19TQl9WRVJTSU9OX0hBU0FMSUdOKCZtcC0+bV9zYikgJiYKKwkgICAgbXAtPm1fc2Iuc2JfaW5vYWxpZ25tdCA+PQorCSAgICBYRlNfQl9UT19GU0JUKG1wLCBtcC0+bV9pbm9kZV9jbHVzdGVyX3NpemUpKQorCQltcC0+bV9pbm9hbGlnbl9tYXNrID0gbXAtPm1fc2Iuc2JfaW5vYWxpZ25tdCAtIDE7CisJZWxzZQorCQltcC0+bV9pbm9hbGlnbl9tYXNrID0gMDsKKwkvKgorCSAqIElmIHdlIGFyZSB1c2luZyBzdHJpcGUgYWxpZ25tZW50LCBjaGVjayB3aGV0aGVyCisJICogdGhlIHN0cmlwZSB1bml0IGlzIGEgbXVsdGlwbGUgb2YgdGhlIGlub2RlIGFsaWdubWVudAorCSAqLworCWlmIChtcC0+bV9kYWxpZ24gJiYgbXAtPm1faW5vYWxpZ25fbWFzayAmJgorCSAgICAhKG1wLT5tX2RhbGlnbiAmIG1wLT5tX2lub2FsaWduX21hc2spKQorCQltcC0+bV9zaW5vYWxpZ24gPSBtcC0+bV9kYWxpZ247CisJZWxzZQorCQltcC0+bV9zaW5vYWxpZ24gPSAwOworCS8qCisJICogQ2hlY2sgdGhhdCB0aGUgZGF0YSAoYW5kIGxvZyBpZiBzZXBhcmF0ZSkgYXJlIGFuIG9rIHNpemUuCisJICovCisJZCA9ICh4ZnNfZGFkZHJfdClYRlNfRlNCX1RPX0JCKG1wLCBtcC0+bV9zYi5zYl9kYmxvY2tzKTsKKwlpZiAoWEZTX0JCX1RPX0ZTQihtcCwgZCkgIT0gbXAtPm1fc2Iuc2JfZGJsb2NrcykgeworCQljbW5fZXJyKENFX1dBUk4sICJYRlM6IHNpemUgY2hlY2sgMSBmYWlsZWQiKTsKKwkJZXJyb3IgPSBYRlNfRVJST1IoRTJCSUcpOworCQlnb3RvIGVycm9yMTsKKwl9CisJZXJyb3IgPSB4ZnNfcmVhZF9idWYobXAsIG1wLT5tX2RkZXZfdGFyZ3AsCisJCQkgICAgIGQgLSBYRlNfRlNTX1RPX0JCKG1wLCAxKSwKKwkJCSAgICAgWEZTX0ZTU19UT19CQihtcCwgMSksIDAsICZicCk7CisJaWYgKCFlcnJvcikgeworCQl4ZnNfYnVmX3JlbHNlKGJwKTsKKwl9IGVsc2UgeworCQljbW5fZXJyKENFX1dBUk4sICJYRlM6IHNpemUgY2hlY2sgMiBmYWlsZWQiKTsKKwkJaWYgKGVycm9yID09IEVOT1NQQykgeworCQkJZXJyb3IgPSBYRlNfRVJST1IoRTJCSUcpOworCQl9CisJCWdvdG8gZXJyb3IxOworCX0KKworCWlmICgoKG1mc2lfZmxhZ3MgJiBYRlNfTUZTSV9DTElFTlQpID09IDApICYmCisJICAgIG1wLT5tX2xvZ2Rldl90YXJncCAhPSBtcC0+bV9kZGV2X3RhcmdwKSB7CisJCWQgPSAoeGZzX2RhZGRyX3QpWEZTX0ZTQl9UT19CQihtcCwgbXAtPm1fc2Iuc2JfbG9nYmxvY2tzKTsKKwkJaWYgKFhGU19CQl9UT19GU0IobXAsIGQpICE9IG1wLT5tX3NiLnNiX2xvZ2Jsb2NrcykgeworCQkJY21uX2VycihDRV9XQVJOLCAiWEZTOiBzaXplIGNoZWNrIDMgZmFpbGVkIik7CisJCQllcnJvciA9IFhGU19FUlJPUihFMkJJRyk7CisJCQlnb3RvIGVycm9yMTsKKwkJfQorCQllcnJvciA9IHhmc19yZWFkX2J1ZihtcCwgbXAtPm1fbG9nZGV2X3RhcmdwLAorCQkJCSAgICAgZCAtIFhGU19GU0JfVE9fQkIobXAsIDEpLAorCQkJCSAgICAgWEZTX0ZTQl9UT19CQihtcCwgMSksIDAsICZicCk7CisJCWlmICghZXJyb3IpIHsKKwkJCXhmc19idWZfcmVsc2UoYnApOworCQl9IGVsc2UgeworCQkJY21uX2VycihDRV9XQVJOLCAiWEZTOiBzaXplIGNoZWNrIDMgZmFpbGVkIik7CisJCQlpZiAoZXJyb3IgPT0gRU5PU1BDKSB7CisJCQkJZXJyb3IgPSBYRlNfRVJST1IoRTJCSUcpOworCQkJfQorCQkJZ290byBlcnJvcjE7CisJCX0KKwl9CisKKwkvKgorCSAqIEluaXRpYWxpemUgcmVhbHRpbWUgZmllbGRzIGluIHRoZSBtb3VudCBzdHJ1Y3R1cmUKKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX3J0bW91bnRfaW5pdChtcCkpKSB7CisJCWNtbl9lcnIoQ0VfV0FSTiwgIlhGUzogUlQgbW91bnQgZmFpbGVkIik7CisJCWdvdG8gZXJyb3IxOworCX0KKworCS8qCisJICogRm9yIGNsaWVudCBjYXNlIHdlIGFyZSBkb25lIG5vdworCSAqLworCWlmIChtZnNpX2ZsYWdzICYgWEZTX01GU0lfQ0xJRU5UKSB7CisJCXJldHVybigwKTsKKwl9CisKKwkvKgorCSAqICBDb3BpZXMgdGhlIGxvdyBvcmRlciBiaXRzIG9mIHRoZSB0aW1lc3RhbXAgYW5kIHRoZSByYW5kb21seQorCSAqICBzZXQgInNlcXVlbmNlIiBudW1iZXIgb3V0IG9mIGEgVVVJRC4KKwkgKi8KKwl1dWlkX2dldG5vZGV1bmlxKCZzYnAtPnNiX3V1aWQsIG1wLT5tX2ZpeGVkZnNpZCk7CisKKwkvKgorCSAqICBUaGUgdmZzIHN0cnVjdHVyZSBuZWVkcyB0byBoYXZlIGEgZmlsZSBzeXN0ZW0gaW5kZXBlbmRlbnQKKwkgKiAgd2F5IG9mIGNoZWNraW5nIGZvciB0aGUgaW52YXJpYW50IGZpbGUgc3lzdGVtIElELiAgU2luY2UgaXQKKwkgKiAgY2FuJ3QgbG9vayBhdCBtb3VudCBzdHJ1Y3R1cmVzIGl0IGhhcyBhIHBvaW50ZXIgdG8gdGhlIGRhdGEKKwkgKiAgaW4gdGhlIG1vdW50IHN0cnVjdHVyZS4KKwkgKgorCSAqICBGaWxlIHN5c3RlbXMgdGhhdCBkb24ndCBzdXBwb3J0IHVzZXIgbGV2ZWwgZmlsZSBoYW5kbGVzIChpLmUuCisJICogIGFsbCBvZiB0aGVtIGV4Y2VwdCBmb3IgWEZTKSB3aWxsIGxlYXZlIHZmc19hbHRmc2lkIGFzIE5VTEwuCisJICovCisJdmZzcC0+dmZzX2FsdGZzaWQgPSAoeGZzX2ZzaWRfdCAqKW1wLT5tX2ZpeGVkZnNpZDsKKwltcC0+bV9kbWV2bWFzayA9IDA7CS8qIG5vdCBwZXJzaXN0ZW50OyBzZXQgYWZ0ZXIgZWFjaCBtb3VudCAqLworCisJLyoKKwkgKiBTZWxlY3QgdGhlIHJpZ2h0IGRpcmVjdG9yeSBtYW5hZ2VyLgorCSAqLworCW1wLT5tX2Rpcm9wcyA9CisJCVhGU19TQl9WRVJTSU9OX0hBU0RJUlYyKCZtcC0+bV9zYikgPworCQkJeGZzdjJfZGlyb3BzIDoKKwkJCXhmc3YxX2Rpcm9wczsKKworCS8qCisJICogSW5pdGlhbGl6ZSBkaXJlY3RvcnkgbWFuYWdlcidzIGVudHJpZXMuCisJICovCisJWEZTX0RJUl9NT1VOVChtcCk7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIGF0dHJpYnV0ZSBtYW5hZ2VyJ3MgZW50cmllcy4KKwkgKi8KKwltcC0+bV9hdHRyX21hZ2ljcGN0ID0gKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSAqIDM3KSAvIDEwMDsKKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgcHJlY29tcHV0ZWQgdHJhbnNhY3Rpb24gcmVzZXJ2YXRpb25zIHZhbHVlcy4KKwkgKi8KKwl4ZnNfdHJhbnNfaW5pdChtcCk7CisKKwkvKgorCSAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSBpbm9kZSBoYXNoIHRhYmxlIGZvciB0aGlzCisJICogZmlsZSBzeXN0ZW0uCisJICovCisJeGZzX2loYXNoX2luaXQobXApOworCXhmc19jaGFzaF9pbml0KG1wKTsKKworCS8qCisJICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIHBlci1hZyBkYXRhLgorCSAqLworCWluaXRfcndzZW0oJm1wLT5tX3BlcmFnbG9jayk7CisJbXAtPm1fcGVyYWcgPQorCQlrbWVtX3phbGxvYyhzYnAtPnNiX2FnY291bnQgKiBzaXplb2YoeGZzX3BlcmFnX3QpLCBLTV9TTEVFUCk7CisKKwltcC0+bV9tYXhhZ2kgPSB4ZnNfaW5pdGlhbGl6ZV9wZXJhZyhtcCwgc2JwLT5zYl9hZ2NvdW50KTsKKworCS8qCisJICogbG9nJ3MgbW91bnQtdGltZSBpbml0aWFsaXphdGlvbi4gUGVyZm9ybSAxc3QgcGFydCByZWNvdmVyeSBpZiBuZWVkZWQKKwkgKi8KKwlpZiAobGlrZWx5KHNicC0+c2JfbG9nYmxvY2tzID4gMCkpIHsJLyogY2hlY2sgZm9yIHZvbHVtZSBjYXNlICovCisJCWVycm9yID0geGZzX2xvZ19tb3VudChtcCwgbXAtPm1fbG9nZGV2X3RhcmdwLAorCQkJCSAgICAgIFhGU19GU0JfVE9fREFERFIobXAsIHNicC0+c2JfbG9nc3RhcnQpLAorCQkJCSAgICAgIFhGU19GU0JfVE9fQkIobXAsIHNicC0+c2JfbG9nYmxvY2tzKSk7CisJCWlmIChlcnJvcikgeworCQkJY21uX2VycihDRV9XQVJOLCAiWEZTOiBsb2cgbW91bnQgZmFpbGVkIik7CisJCQlnb3RvIGVycm9yMjsKKwkJfQorCX0gZWxzZSB7CS8qIE5vIGxvZyBoYXMgYmVlbiBkZWZpbmVkICovCisJCWNtbl9lcnIoQ0VfV0FSTiwgIlhGUzogbm8gbG9nIGRlZmluZWQiKTsKKwkJWEZTX0VSUk9SX1JFUE9SVCgieGZzX21vdW50ZnNfaW50KDEpIiwgWEZTX0VSUkxFVkVMX0xPVywgbXApOworCQllcnJvciA9IFhGU19FUlJPUihFRlNDT1JSVVBURUQpOworCQlnb3RvIGVycm9yMjsKKwl9CisKKwkvKgorCSAqIEdldCBhbmQgc2FuaXR5LWNoZWNrIHRoZSByb290IGlub2RlLgorCSAqIFNhdmUgdGhlIHBvaW50ZXIgdG8gaXQgaW4gdGhlIG1vdW50IHN0cnVjdHVyZS4KKwkgKi8KKwllcnJvciA9IHhmc19pZ2V0KG1wLCBOVUxMLCBzYnAtPnNiX3Jvb3Rpbm8sIDAsIFhGU19JTE9DS19FWENMLCAmcmlwLCAwKTsKKwlpZiAoZXJyb3IpIHsKKwkJY21uX2VycihDRV9XQVJOLCAiWEZTOiBmYWlsZWQgdG8gcmVhZCByb290IGlub2RlIik7CisJCWdvdG8gZXJyb3IzOworCX0KKworCUFTU0VSVChyaXAgIT0gTlVMTCk7CisJcnZwID0gWEZTX0lUT1YocmlwKTsKKworCWlmICh1bmxpa2VseSgocmlwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgIT0gU19JRkRJUikpIHsKKwkJY21uX2VycihDRV9XQVJOLCAiWEZTOiBjb3JydXB0ZWQgcm9vdCBpbm9kZSIpOworCQlwcmRldigiUm9vdCBpbm9kZSAlbGx1IGlzIG5vdCBhIGRpcmVjdG9yeSIsCisJCSAgICAgIG1wLT5tX2RkZXZfdGFyZ3AsICh1bnNpZ25lZCBsb25nIGxvbmcpcmlwLT5pX2lubyk7CisJCXhmc19pdW5sb2NrKHJpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQlYRlNfRVJST1JfUkVQT1JUKCJ4ZnNfbW91bnRmc19pbnQoMikiLCBYRlNfRVJSTEVWRUxfTE9XLAorCQkJCSBtcCk7CisJCWVycm9yID0gWEZTX0VSUk9SKEVGU0NPUlJVUFRFRCk7CisJCWdvdG8gZXJyb3I0OworCX0KKwltcC0+bV9yb290aXAgPSByaXA7CS8qIHNhdmUgaXQgKi8KKworCXhmc19pdW5sb2NrKHJpcCwgWEZTX0lMT0NLX0VYQ0wpOworCisJLyoKKwkgKiBJbml0aWFsaXplIHJlYWx0aW1lIGlub2RlIHBvaW50ZXJzIGluIHRoZSBtb3VudCBzdHJ1Y3R1cmUKKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX3J0bW91bnRfaW5vZGVzKG1wKSkpIHsKKwkJLyoKKwkJICogRnJlZSB1cCB0aGUgcm9vdCBpbm9kZS4KKwkJICovCisJCWNtbl9lcnIoQ0VfV0FSTiwgIlhGUzogZmFpbGVkIHRvIHJlYWQgUlQgaW5vZGVzIik7CisJCWdvdG8gZXJyb3I0OworCX0KKworCS8qCisJICogSWYgZnMgaXMgbm90IG1vdW50ZWQgcmVhZG9ubHksIHRoZW4gdXBkYXRlIHRoZSBzdXBlcmJsb2NrCisJICogdW5pdCBhbmQgd2lkdGggY2hhbmdlcy4KKwkgKi8KKwlpZiAodXBkYXRlX2ZsYWdzICYmICEodmZzcC0+dmZzX2ZsYWcgJiBWRlNfUkRPTkxZKSkKKwkJeGZzX21vdW50X2xvZ19zYnVuaXQobXAsIHVwZGF0ZV9mbGFncyk7CisKKwkvKgorCSAqIEluaXRpYWxpc2UgdGhlIFhGUyBxdW90YSBtYW5hZ2VtZW50IHN1YnN5c3RlbSBmb3IgdGhpcyBtb3VudAorCSAqLworCWlmICgoZXJyb3IgPSBYRlNfUU1fSU5JVChtcCwgJnF1b3RhbW91bnQsICZxdW90YWZsYWdzKSkpCisJCWdvdG8gZXJyb3I0OworCisJLyoKKwkgKiBGaW5pc2ggcmVjb3ZlcmluZyB0aGUgZmlsZSBzeXN0ZW0uICBUaGlzIHBhcnQgbmVlZGVkIHRvIGJlCisJICogZGVsYXllZCB1bnRpbCBhZnRlciB0aGUgcm9vdCBhbmQgcmVhbC10aW1lIGJpdG1hcCBpbm9kZXMKKwkgKiB3ZXJlIGNvbnNpc3RlbnRseSByZWFkIGluLgorCSAqLworCWVycm9yID0geGZzX2xvZ19tb3VudF9maW5pc2gobXAsIG1mc2lfZmxhZ3MpOworCWlmIChlcnJvcikgeworCQljbW5fZXJyKENFX1dBUk4sICJYRlM6IGxvZyBtb3VudCBmaW5pc2ggZmFpbGVkIik7CisJCWdvdG8gZXJyb3I0OworCX0KKworCS8qCisJICogQ29tcGxldGUgdGhlIHF1b3RhIGluaXRpYWxpc2F0aW9uLCBwb3N0LWxvZy1yZXBsYXkgY29tcG9uZW50LgorCSAqLworCWlmICgoZXJyb3IgPSBYRlNfUU1fTU9VTlQobXAsIHF1b3RhbW91bnQsIHF1b3RhZmxhZ3MsIG1mc2lfZmxhZ3MpKSkKKwkJZ290byBlcnJvcjQ7CisKKwlyZXR1cm4gMDsKKworIGVycm9yNDoKKwkvKgorCSAqIEZyZWUgdXAgdGhlIHJvb3QgaW5vZGUuCisJICovCisJVk5fUkVMRShydnApOworIGVycm9yMzoKKwl4ZnNfbG9nX3VubW91bnRfZGVhbGxvYyhtcCk7CisgZXJyb3IyOgorCXhmc19paGFzaF9mcmVlKG1wKTsKKwl4ZnNfY2hhc2hfZnJlZShtcCk7CisJZm9yIChhZ25vID0gMDsgYWdubyA8IHNicC0+c2JfYWdjb3VudDsgYWdubysrKQorCQlpZiAobXAtPm1fcGVyYWdbYWdub10ucGFnYl9saXN0KQorCQkJa21lbV9mcmVlKG1wLT5tX3BlcmFnW2Fnbm9dLnBhZ2JfbGlzdCwKKwkJCSAgc2l6ZW9mKHhmc19wZXJhZ19idXN5X3QpICogWEZTX1BBR0JfTlVNX1NMT1RTKTsKKwlrbWVtX2ZyZWUobXAtPm1fcGVyYWcsIHNicC0+c2JfYWdjb3VudCAqIHNpemVvZih4ZnNfcGVyYWdfdCkpOworCW1wLT5tX3BlcmFnID0gTlVMTDsKKwkvKiBGQUxMVEhST1VHSCAqLworIGVycm9yMToKKwlpZiAodXVpZF9tb3VudGVkKQorCQl4ZnNfdXVpZF91bm1vdW50KG1wKTsKKwl4ZnNfZnJlZXNiKG1wKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiB4ZnNfdW5tb3VudGZzCisgKgorICogVGhpcyBmbHVzaGVzIG91dCB0aGUgaW5vZGVzLGRxdW90cyBhbmQgdGhlIHN1cGVyYmxvY2ssIHVubW91bnRzIHRoZQorICogbG9nIGFuZCBtYWtlcyBzdXJlIHRoYXQgaW5jb3JlIHN0cnVjdHVyZXMgYXJlIGZyZWVkLgorICovCitpbnQKK3hmc191bm1vdW50ZnMoeGZzX21vdW50X3QgKm1wLCBzdHJ1Y3QgY3JlZCAqY3IpCit7CisJc3RydWN0IHZmcwkqdmZzcCA9IFhGU19NVE9WRlMobXApOworI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoSU5EVUNFX0lPX0VSUk9SKQorCWludDY0X3QJCWZzaWQ7CisjZW5kaWYKKworCXhmc19pZmx1c2hfYWxsKG1wLCBYRlNfRkxVU0hfQUxMKTsKKworCVhGU19RTV9EUVBVUkdFQUxMKG1wLAorCQlYRlNfUU1PUFRfVVFVT1RBIHwgWEZTX1FNT1BUX0dRVU9UQSB8IFhGU19RTU9QVF9VTU9VTlRJTkcpOworCisJLyoKKwkgKiBGbHVzaCBvdXQgdGhlIGxvZyBzeW5jaHJvbm91c2x5IHNvIHRoYXQgd2Uga25vdyBmb3Igc3VyZQorCSAqIHRoYXQgbm90aGluZyBpcyBwaW5uZWQuICBUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIGJmbHVzaCgpCisJICogd2lsbCBza2lwIHBpbm5lZCBidWZmZXJzLgorCSAqLworCXhmc19sb2dfZm9yY2UobXAsICh4ZnNfbHNuX3QpMCwgWEZTX0xPR19GT1JDRSB8IFhGU19MT0dfU1lOQyk7CisKKwl4ZnNfYmludmFsKG1wLT5tX2RkZXZfdGFyZ3ApOworCWlmIChtcC0+bV9ydGRldl90YXJncCkgeworCQl4ZnNfYmludmFsKG1wLT5tX3J0ZGV2X3RhcmdwKTsKKwl9CisKKwl4ZnNfdW5tb3VudGZzX3dyaXRlc2IobXApOworCisJeGZzX3VubW91bnRmc193YWl0KG1wKTsgCQkvKiB3YWl0IGZvciBhc3luYyBidWZzICovCisKKwl4ZnNfbG9nX3VubW91bnQobXApOwkJCS8qIERvbmUhIE5vIG1vcmUgZnMgb3BzLiAqLworCisJeGZzX2ZyZWVzYihtcCk7CisKKwkvKgorCSAqIEFsbCBpbm9kZXMgZnJvbSB0aGlzIG1vdW50IHBvaW50IHNob3VsZCBiZSBmcmVlZC4KKwkgKi8KKwlBU1NFUlQobXAtPm1faW5vZGVzID09IE5VTEwpOworCisJLyoKKwkgKiBXZSBtYXkgaGF2ZSBidWZzIHRoYXQgYXJlIGluIHRoZSBwcm9jZXNzIG9mIGdldHRpbmcgd3JpdHRlbiBzdGlsbC4KKwkgKiBXZSBtdXN0IHdhaXQgZm9yIHRoZSBJL08gY29tcGxldGlvbiBvZiB0aG9zZS4gVGhlIHN5bmMgZmxhZyBoZXJlCisJICogZG9lcyBhIHR3byBwYXNzIGl0ZXJhdGlvbiB0aHJ1IHRoZSBidWZjYWNoZS4KKwkgKi8KKwlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpIHsKKwkJeGZzX2luY29yZV9yZWxzZShtcC0+bV9kZGV2X3RhcmdwLCAwLCAxKTsgLyogc3luY2hyb25vdXMgKi8KKwl9CisKKwl4ZnNfdW5tb3VudGZzX2Nsb3NlKG1wLCBjcik7CisJaWYgKChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9OT1VVSUQpID09IDApCisJCXhmc191dWlkX3VubW91bnQobXApOworCisjaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChJTkRVQ0VfSU9fRVJST1IpCisJLyoKKwkgKiBjbGVhciBhbGwgZXJyb3IgdGFncyBvbiB0aGlzIGZpbGVzeXN0ZW0KKwkgKi8KKwltZW1jcHkoJmZzaWQsICZ2ZnNwLT52ZnNfZnNpZCwgc2l6ZW9mKGludDY0X3QpKTsKKwl4ZnNfZXJyb3J0YWdfY2xlYXJhbGxfdW1vdW50KGZzaWQsIG1wLT5tX2ZzbmFtZSwgMCk7CisjZW5kaWYKKwlYRlNfSU9ET05FKHZmc3ApOworCXhmc19tb3VudF9mcmVlKG1wLCAxKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZAoreGZzX3VubW91bnRmc19jbG9zZSh4ZnNfbW91bnRfdCAqbXAsIHN0cnVjdCBjcmVkICpjcikKK3sKKwlpZiAobXAtPm1fbG9nZGV2X3RhcmdwICE9IG1wLT5tX2RkZXZfdGFyZ3ApCisJCXhmc19mcmVlX2J1ZnRhcmcobXAtPm1fbG9nZGV2X3RhcmdwLCAxKTsKKwlpZiAobXAtPm1fcnRkZXZfdGFyZ3ApCisJCXhmc19mcmVlX2J1ZnRhcmcobXAtPm1fcnRkZXZfdGFyZ3AsIDEpOworCXhmc19mcmVlX2J1ZnRhcmcobXAtPm1fZGRldl90YXJncCwgMCk7Cit9CisKK3ZvaWQKK3hmc191bm1vdW50ZnNfd2FpdCh4ZnNfbW91bnRfdCAqbXApCit7CisJaWYgKG1wLT5tX2xvZ2Rldl90YXJncCAhPSBtcC0+bV9kZGV2X3RhcmdwKQorCQl4ZnNfd2FpdF9idWZ0YXJnKG1wLT5tX2xvZ2Rldl90YXJncCk7CisJaWYgKG1wLT5tX3J0ZGV2X3RhcmdwKQorCQl4ZnNfd2FpdF9idWZ0YXJnKG1wLT5tX3J0ZGV2X3RhcmdwKTsKKwl4ZnNfd2FpdF9idWZ0YXJnKG1wLT5tX2RkZXZfdGFyZ3ApOworfQorCitpbnQKK3hmc191bm1vdW50ZnNfd3JpdGVzYih4ZnNfbW91bnRfdCAqbXApCit7CisJeGZzX2J1Zl90CSpzYnA7CisJeGZzX3NiX3QJKnNiOworCWludAkJZXJyb3IgPSAwOworCisJLyoKKwkgKiBza2lwIHN1cGVyYmxvY2sgd3JpdGUgaWYgZnMgaXMgcmVhZC1vbmx5LCBvcgorCSAqIGlmIHdlIGFyZSBkb2luZyBhIGZvcmNlZCB1bW91bnQuCisJICovCisJc2JwID0geGZzX2dldHNiKG1wLCAwKTsKKwlpZiAoIShYRlNfTVRPVkZTKG1wKS0+dmZzX2ZsYWcgJiBWRlNfUkRPTkxZIHx8CisJCVhGU19GT1JDRURfU0hVVERPV04obXApKSkgeworCQkvKgorCQkgKiBtYXJrIHNoYXJlZC1yZWFkb25seSBpZiBkZXNpcmVkCisJCSAqLworCQlzYiA9IFhGU19CVUZfVE9fU0JQKHNicCk7CisJCWlmIChtcC0+bV9ta19zaGFyZWRybykgeworCQkJaWYgKCEoc2ItPnNiX2ZsYWdzICYgWEZTX1NCRl9SRUFET05MWSkpCisJCQkJc2ItPnNiX2ZsYWdzIHw9IFhGU19TQkZfUkVBRE9OTFk7CisJCQlpZiAoIVhGU19TQl9WRVJTSU9OX0hBU1NIQVJFRChzYikpCisJCQkJWEZTX1NCX1ZFUlNJT05fQUREU0hBUkVEKHNiKTsKKwkJCXhmc19mc19jbW5fZXJyKENFX05PVEUsIG1wLAorCQkJCSJVbm1vdW50aW5nLCBtYXJraW5nIHNoYXJlZCByZWFkLW9ubHkiKTsKKwkJfQorCQlYRlNfQlVGX1VORE9ORShzYnApOworCQlYRlNfQlVGX1VOUkVBRChzYnApOworCQlYRlNfQlVGX1VOREVMQVlXUklURShzYnApOworCQlYRlNfQlVGX1dSSVRFKHNicCk7CisJCVhGU19CVUZfVU5BU1lOQyhzYnApOworCQlBU1NFUlQoWEZTX0JVRl9UQVJHRVQoc2JwKSA9PSBtcC0+bV9kZGV2X3RhcmdwKTsKKwkJeGZzYmRzdHJhdChtcCwgc2JwKTsKKwkJLyogTmV2ZXJtaW5kIGVycm9ycyB3ZSBtaWdodCBnZXQgaGVyZS4gKi8KKwkJZXJyb3IgPSB4ZnNfaW93YWl0KHNicCk7CisJCWlmIChlcnJvcikKKwkJCXhmc19pb2Vycm9yX2FsZXJ0KCJ4ZnNfdW5tb3VudGZzX3dyaXRlc2IiLAorCQkJCQkgIG1wLCBzYnAsIFhGU19CVUZfQUREUihzYnApKTsKKwkJaWYgKGVycm9yICYmIG1wLT5tX21rX3NoYXJlZHJvKQorCQkJeGZzX2ZzX2Ntbl9lcnIoQ0VfQUxFUlQsIG1wLCAiU3VwZXJibG9jayB3cml0ZSBlcnJvciBkZXRlY3RlZCB3aGlsZSB1bm1vdW50aW5nLiAgRmlsZXN5c3RlbSBtYXkgbm90IGJlIG1hcmtlZCBzaGFyZWQgcmVhZG9ubHkiKTsKKwl9CisJeGZzX2J1Zl9yZWxzZShzYnApOworCXJldHVybiAoZXJyb3IpOworfQorCisvKgorICogeGZzX21vZF9zYigpIGNhbiBiZSB1c2VkIHRvIGNvcHkgYXJiaXRyYXJ5IGNoYW5nZXMgdG8gdGhlCisgKiBpbi1jb3JlIHN1cGVyYmxvY2sgaW50byB0aGUgc3VwZXJibG9jayBidWZmZXIgdG8gYmUgbG9nZ2VkLgorICogSXQgZG9lcyBub3QgcHJvdmlkZSB0aGUgaGlnaGVyIGxldmVsIG9mIGxvY2tpbmcgdGhhdCBpcworICogbmVlZGVkIHRvIHByb3RlY3QgdGhlIGluLWNvcmUgc3VwZXJibG9jayBmcm9tIGNvbmN1cnJlbnQKKyAqIGFjY2Vzcy4KKyAqLwordm9pZAoreGZzX21vZF9zYih4ZnNfdHJhbnNfdCAqdHAsIF9faW50NjRfdCBmaWVsZHMpCit7CisJeGZzX2J1Zl90CSpicDsKKwlpbnQJCWZpcnN0OworCWludAkJbGFzdDsKKwl4ZnNfbW91bnRfdAkqbXA7CisJeGZzX3NiX3QJKnNicDsKKwl4ZnNfc2JfZmllbGRfdAlmOworCisJQVNTRVJUKGZpZWxkcyk7CisJaWYgKCFmaWVsZHMpCisJCXJldHVybjsKKwltcCA9IHRwLT50X21vdW50cDsKKwlicCA9IHhmc190cmFuc19nZXRzYih0cCwgbXAsIDApOworCXNicCA9IFhGU19CVUZfVE9fU0JQKGJwKTsKKwlmaXJzdCA9IHNpemVvZih4ZnNfc2JfdCk7CisJbGFzdCA9IDA7CisKKwkvKiB0cmFuc2xhdGUvY29weSAqLworCisJeGZzX3hsYXRlc2IoWEZTX0JVRl9QVFIoYnApLCAmKG1wLT5tX3NiKSwgLTEsIGZpZWxkcyk7CisKKwkvKiBmaW5kIG1vZGlmaWVkIHJhbmdlICovCisKKwlmID0gKHhmc19zYl9maWVsZF90KXhmc19sb3diaXQ2NCgoX191aW50NjRfdClmaWVsZHMpOworCUFTU0VSVCgoMUxMIDw8IGYpICYgWEZTX1NCX01PRF9CSVRTKTsKKwlmaXJzdCA9IHhmc19zYl9pbmZvW2ZdLm9mZnNldDsKKworCWYgPSAoeGZzX3NiX2ZpZWxkX3QpeGZzX2hpZ2hiaXQ2NCgoX191aW50NjRfdClmaWVsZHMpOworCUFTU0VSVCgoMUxMIDw8IGYpICYgWEZTX1NCX01PRF9CSVRTKTsKKwlsYXN0ID0geGZzX3NiX2luZm9bZiArIDFdLm9mZnNldCAtIDE7CisKKwl4ZnNfdHJhbnNfbG9nX2J1Zih0cCwgYnAsIGZpcnN0LCBsYXN0KTsKK30KKworLyoKKyAqIHhmc19tb2RfaW5jb3JlX3NiX3VubG9ja2VkKCkgaXMgYSB1dGlsaXR5IHJvdXRpbmUgY29tbW9uIHVzZWQgdG8gYXBwbHkKKyAqIGEgZGVsdGEgdG8gYSBzcGVjaWZpZWQgZmllbGQgaW4gdGhlIGluLWNvcmUgc3VwZXJibG9jay4gIFNpbXBseQorICogc3dpdGNoIG9uIHRoZSBmaWVsZCBpbmRpY2F0ZWQgYW5kIGFwcGx5IHRoZSBkZWx0YSB0byB0aGF0IGZpZWxkLgorICogRmllbGRzIGFyZSBub3QgYWxsb3dlZCB0byBkaXAgYmVsb3cgemVybywgc28gaWYgdGhlIGRlbHRhIHdvdWxkCisgKiBkbyB0aGlzIGRvIG5vdCBhcHBseSBpdCBhbmQgcmV0dXJuIEVJTlZBTC4KKyAqCisgKiBUaGUgU0JfTE9DSyBtdXN0IGJlIGhlbGQgd2hlbiB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkLgorICovCitTVEFUSUMgaW50Cit4ZnNfbW9kX2luY29yZV9zYl91bmxvY2tlZCh4ZnNfbW91bnRfdCAqbXAsIHhmc19zYl9maWVsZF90IGZpZWxkLAorCQkJaW50IGRlbHRhLCBpbnQgcnN2ZCkKK3sKKwlpbnQJCXNjb3VudGVyOwkvKiBzaG9ydCBjb3VudGVyIGZvciAzMiBiaXQgZmllbGRzICovCisJbG9uZyBsb25nCWxjb3VudGVyOwkvKiBsb25nIGNvdW50ZXIgZm9yIDY0IGJpdCBmaWVsZHMgKi8KKwlsb25nIGxvbmcJcmVzX3VzZWQsIHJlbTsKKworCS8qCisJICogV2l0aCB0aGUgaW4tY29yZSBzdXBlcmJsb2NrIHNwaW4gbG9jayBoZWxkLCBzd2l0Y2gKKwkgKiBvbiB0aGUgaW5kaWNhdGVkIGZpZWxkLiAgQXBwbHkgdGhlIGRlbHRhIHRvIHRoZQorCSAqIHByb3BlciBmaWVsZC4gIElmIHRoZSBmaWVsZHMgdmFsdWUgd291bGQgZGlwIGJlbG93CisJICogMCwgdGhlbiBkbyBub3QgYXBwbHkgdGhlIGRlbHRhIGFuZCByZXR1cm4gRUlOVkFMLgorCSAqLworCXN3aXRjaCAoZmllbGQpIHsKKwljYXNlIFhGU19TQlNfSUNPVU5UOgorCQlsY291bnRlciA9IChsb25nIGxvbmcpbXAtPm1fc2Iuc2JfaWNvdW50OworCQlsY291bnRlciArPSBkZWx0YTsKKwkJaWYgKGxjb3VudGVyIDwgMCkgeworCQkJQVNTRVJUKDApOworCQkJcmV0dXJuIChYRlNfRVJST1IoRUlOVkFMKSk7CisJCX0KKwkJbXAtPm1fc2Iuc2JfaWNvdW50ID0gbGNvdW50ZXI7CisJCXJldHVybiAoMCk7CisJY2FzZSBYRlNfU0JTX0lGUkVFOgorCQlsY291bnRlciA9IChsb25nIGxvbmcpbXAtPm1fc2Iuc2JfaWZyZWU7CisJCWxjb3VudGVyICs9IGRlbHRhOworCQlpZiAobGNvdW50ZXIgPCAwKSB7CisJCQlBU1NFUlQoMCk7CisJCQlyZXR1cm4gKFhGU19FUlJPUihFSU5WQUwpKTsKKwkJfQorCQltcC0+bV9zYi5zYl9pZnJlZSA9IGxjb3VudGVyOworCQlyZXR1cm4gKDApOworCWNhc2UgWEZTX1NCU19GREJMT0NLUzoKKworCQlsY291bnRlciA9IChsb25nIGxvbmcpbXAtPm1fc2Iuc2JfZmRibG9ja3M7CisJCXJlc191c2VkID0gKGxvbmcgbG9uZykobXAtPm1fcmVzYmxrcyAtIG1wLT5tX3Jlc2Jsa3NfYXZhaWwpOworCisJCWlmIChkZWx0YSA+IDApIHsJCS8qIFB1dHRpbmcgYmxvY2tzIGJhY2sgKi8KKwkJCWlmIChyZXNfdXNlZCA+IGRlbHRhKSB7CisJCQkJbXAtPm1fcmVzYmxrc19hdmFpbCArPSBkZWx0YTsKKwkJCX0gZWxzZSB7CisJCQkJcmVtID0gZGVsdGEgLSByZXNfdXNlZDsKKwkJCQltcC0+bV9yZXNibGtzX2F2YWlsID0gbXAtPm1fcmVzYmxrczsKKwkJCQlsY291bnRlciArPSByZW07CisJCQl9CisJCX0gZWxzZSB7CQkJCS8qIFRha2luZyBibG9ja3MgYXdheSAqLworCisJCQlsY291bnRlciArPSBkZWx0YTsKKworCQkvKgorCQkgKiBJZiB3ZXJlIG91dCBvZiBibG9ja3MsIHVzZSBhbnkgYXZhaWxhYmxlIHJlc2VydmVkIGJsb2NrcyBpZgorCQkgKiB3ZXJlIGFsbG93ZWQgdG8uCisJCSAqLworCisJCQlpZiAobGNvdW50ZXIgPCAwKSB7CisJCQkJaWYgKHJzdmQpIHsKKwkJCQkJbGNvdW50ZXIgPSAobG9uZyBsb25nKW1wLT5tX3Jlc2Jsa3NfYXZhaWwgKyBkZWx0YTsKKwkJCQkJaWYgKGxjb3VudGVyIDwgMCkgeworCQkJCQkJcmV0dXJuIChYRlNfRVJST1IoRU5PU1BDKSk7CisJCQkJCX0KKwkJCQkJbXAtPm1fcmVzYmxrc19hdmFpbCA9IGxjb3VudGVyOworCQkJCQlyZXR1cm4gKDApOworCQkJCX0gZWxzZSB7CS8qIG5vdCByZXNlcnZlZCAqLworCQkJCQlyZXR1cm4gKFhGU19FUlJPUihFTk9TUEMpKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQltcC0+bV9zYi5zYl9mZGJsb2NrcyA9IGxjb3VudGVyOworCQlyZXR1cm4gKDApOworCWNhc2UgWEZTX1NCU19GUkVYVEVOVFM6CisJCWxjb3VudGVyID0gKGxvbmcgbG9uZyltcC0+bV9zYi5zYl9mcmV4dGVudHM7CisJCWxjb3VudGVyICs9IGRlbHRhOworCQlpZiAobGNvdW50ZXIgPCAwKSB7CisJCQlyZXR1cm4gKFhGU19FUlJPUihFTk9TUEMpKTsKKwkJfQorCQltcC0+bV9zYi5zYl9mcmV4dGVudHMgPSBsY291bnRlcjsKKwkJcmV0dXJuICgwKTsKKwljYXNlIFhGU19TQlNfREJMT0NLUzoKKwkJbGNvdW50ZXIgPSAobG9uZyBsb25nKW1wLT5tX3NiLnNiX2RibG9ja3M7CisJCWxjb3VudGVyICs9IGRlbHRhOworCQlpZiAobGNvdW50ZXIgPCAwKSB7CisJCQlBU1NFUlQoMCk7CisJCQlyZXR1cm4gKFhGU19FUlJPUihFSU5WQUwpKTsKKwkJfQorCQltcC0+bV9zYi5zYl9kYmxvY2tzID0gbGNvdW50ZXI7CisJCXJldHVybiAoMCk7CisJY2FzZSBYRlNfU0JTX0FHQ09VTlQ6CisJCXNjb3VudGVyID0gbXAtPm1fc2Iuc2JfYWdjb3VudDsKKwkJc2NvdW50ZXIgKz0gZGVsdGE7CisJCWlmIChzY291bnRlciA8IDApIHsKKwkJCUFTU0VSVCgwKTsKKwkJCXJldHVybiAoWEZTX0VSUk9SKEVJTlZBTCkpOworCQl9CisJCW1wLT5tX3NiLnNiX2FnY291bnQgPSBzY291bnRlcjsKKwkJcmV0dXJuICgwKTsKKwljYXNlIFhGU19TQlNfSU1BWF9QQ1Q6CisJCXNjb3VudGVyID0gbXAtPm1fc2Iuc2JfaW1heF9wY3Q7CisJCXNjb3VudGVyICs9IGRlbHRhOworCQlpZiAoc2NvdW50ZXIgPCAwKSB7CisJCQlBU1NFUlQoMCk7CisJCQlyZXR1cm4gKFhGU19FUlJPUihFSU5WQUwpKTsKKwkJfQorCQltcC0+bV9zYi5zYl9pbWF4X3BjdCA9IHNjb3VudGVyOworCQlyZXR1cm4gKDApOworCWNhc2UgWEZTX1NCU19SRVhUU0laRToKKwkJc2NvdW50ZXIgPSBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKKwkJc2NvdW50ZXIgKz0gZGVsdGE7CisJCWlmIChzY291bnRlciA8IDApIHsKKwkJCUFTU0VSVCgwKTsKKwkJCXJldHVybiAoWEZTX0VSUk9SKEVJTlZBTCkpOworCQl9CisJCW1wLT5tX3NiLnNiX3JleHRzaXplID0gc2NvdW50ZXI7CisJCXJldHVybiAoMCk7CisJY2FzZSBYRlNfU0JTX1JCTUJMT0NLUzoKKwkJc2NvdW50ZXIgPSBtcC0+bV9zYi5zYl9yYm1ibG9ja3M7CisJCXNjb3VudGVyICs9IGRlbHRhOworCQlpZiAoc2NvdW50ZXIgPCAwKSB7CisJCQlBU1NFUlQoMCk7CisJCQlyZXR1cm4gKFhGU19FUlJPUihFSU5WQUwpKTsKKwkJfQorCQltcC0+bV9zYi5zYl9yYm1ibG9ja3MgPSBzY291bnRlcjsKKwkJcmV0dXJuICgwKTsKKwljYXNlIFhGU19TQlNfUkJMT0NLUzoKKwkJbGNvdW50ZXIgPSAobG9uZyBsb25nKW1wLT5tX3NiLnNiX3JibG9ja3M7CisJCWxjb3VudGVyICs9IGRlbHRhOworCQlpZiAobGNvdW50ZXIgPCAwKSB7CisJCQlBU1NFUlQoMCk7CisJCQlyZXR1cm4gKFhGU19FUlJPUihFSU5WQUwpKTsKKwkJfQorCQltcC0+bV9zYi5zYl9yYmxvY2tzID0gbGNvdW50ZXI7CisJCXJldHVybiAoMCk7CisJY2FzZSBYRlNfU0JTX1JFWFRFTlRTOgorCQlsY291bnRlciA9IChsb25nIGxvbmcpbXAtPm1fc2Iuc2JfcmV4dGVudHM7CisJCWxjb3VudGVyICs9IGRlbHRhOworCQlpZiAobGNvdW50ZXIgPCAwKSB7CisJCQlBU1NFUlQoMCk7CisJCQlyZXR1cm4gKFhGU19FUlJPUihFSU5WQUwpKTsKKwkJfQorCQltcC0+bV9zYi5zYl9yZXh0ZW50cyA9IGxjb3VudGVyOworCQlyZXR1cm4gKDApOworCWNhc2UgWEZTX1NCU19SRVhUU0xPRzoKKwkJc2NvdW50ZXIgPSBtcC0+bV9zYi5zYl9yZXh0c2xvZzsKKwkJc2NvdW50ZXIgKz0gZGVsdGE7CisJCWlmIChzY291bnRlciA8IDApIHsKKwkJCUFTU0VSVCgwKTsKKwkJCXJldHVybiAoWEZTX0VSUk9SKEVJTlZBTCkpOworCQl9CisJCW1wLT5tX3NiLnNiX3JleHRzbG9nID0gc2NvdW50ZXI7CisJCXJldHVybiAoMCk7CisJZGVmYXVsdDoKKwkJQVNTRVJUKDApOworCQlyZXR1cm4gKFhGU19FUlJPUihFSU5WQUwpKTsKKwl9Cit9CisKKy8qCisgKiB4ZnNfbW9kX2luY29yZV9zYigpIGlzIHVzZWQgdG8gY2hhbmdlIGEgZmllbGQgaW4gdGhlIGluLWNvcmUKKyAqIHN1cGVyYmxvY2sgc3RydWN0dXJlIGJ5IHRoZSBzcGVjaWZpZWQgZGVsdGEuICBUaGlzIG1vZGlmaWNhdGlvbgorICogaXMgcHJvdGVjdGVkIGJ5IHRoZSBTQl9MT0NLLiAgSnVzdCB1c2UgdGhlIHhmc19tb2RfaW5jb3JlX3NiX3VubG9ja2VkKCkKKyAqIHJvdXRpbmUgdG8gZG8gdGhlIHdvcmsuCisgKi8KK2ludAoreGZzX21vZF9pbmNvcmVfc2IoeGZzX21vdW50X3QgKm1wLCB4ZnNfc2JfZmllbGRfdCBmaWVsZCwgaW50IGRlbHRhLCBpbnQgcnN2ZCkKK3sKKwl1bnNpZ25lZCBsb25nCXM7CisJaW50CXN0YXR1czsKKworCXMgPSBYRlNfU0JfTE9DSyhtcCk7CisJc3RhdHVzID0geGZzX21vZF9pbmNvcmVfc2JfdW5sb2NrZWQobXAsIGZpZWxkLCBkZWx0YSwgcnN2ZCk7CisJWEZTX1NCX1VOTE9DSyhtcCwgcyk7CisJcmV0dXJuIChzdGF0dXMpOworfQorCisvKgorICogeGZzX21vZF9pbmNvcmVfc2JfYmF0Y2goKSBpcyB1c2VkIHRvIGNoYW5nZSBtb3JlIHRoYW4gb25lIGZpZWxkCisgKiBpbiB0aGUgaW4tY29yZSBzdXBlcmJsb2NrIHN0cnVjdHVyZSBhdCBhIHRpbWUuICBUaGlzIG1vZGlmaWNhdGlvbgorICogaXMgcHJvdGVjdGVkIGJ5IGEgbG9jayBpbnRlcm5hbCB0byB0aGlzIG1vZHVsZS4gIFRoZSBmaWVsZHMgYW5kCisgKiBjaGFuZ2VzIHRvIHRob3NlIGZpZWxkcyBhcmUgc3BlY2lmaWVkIGluIHRoZSBhcnJheSBvZiB4ZnNfbW9kX3NiCisgKiBzdHJ1Y3R1cmVzIHBhc3NlZCBpbi4KKyAqCisgKiBFaXRoZXIgYWxsIG9mIHRoZSBzcGVjaWZpZWQgZGVsdGFzIHdpbGwgYmUgYXBwbGllZCBvciBub25lIG9mCisgKiB0aGVtIHdpbGwuICBJZiBhbnkgbW9kaWZpZWQgZmllbGQgZGlwcyBiZWxvdyAwLCB0aGVuIGFsbCBtb2RpZmljYXRpb25zCisgKiB3aWxsIGJlIGJhY2tlZCBvdXQgYW5kIEVJTlZBTCB3aWxsIGJlIHJldHVybmVkLgorICovCitpbnQKK3hmc19tb2RfaW5jb3JlX3NiX2JhdGNoKHhmc19tb3VudF90ICptcCwgeGZzX21vZF9zYl90ICptc2IsIHVpbnQgbm1zYiwgaW50IHJzdmQpCit7CisJdW5zaWduZWQgbG9uZwlzOworCWludAkJc3RhdHVzPTA7CisJeGZzX21vZF9zYl90CSptc2JwOworCisJLyoKKwkgKiBMb29wIHRocm91Z2ggdGhlIGFycmF5IG9mIG1vZCBzdHJ1Y3R1cmVzIGFuZCBhcHBseSBlYWNoCisJICogaW5kaXZpZHVhbGx5LiAgSWYgYW55IGZhaWwsIHRoZW4gYmFjayBvdXQgYWxsIHRob3NlCisJICogd2hpY2ggaGF2ZSBhbHJlYWR5IGJlZW4gYXBwbGllZC4gIERvIGFsbCBvZiB0aGlzIHdpdGhpbgorCSAqIHRoZSBzY29wZSBvZiB0aGUgU0JfTE9DSyBzbyB0aGF0IGFsbCBvZiB0aGUgY2hhbmdlcyB3aWxsCisJICogYmUgYXRvbWljLgorCSAqLworCXMgPSBYRlNfU0JfTE9DSyhtcCk7CisJbXNicCA9ICZtc2JbMF07CisJZm9yIChtc2JwID0gJm1zYnBbMF07IG1zYnAgPCAobXNiICsgbm1zYik7IG1zYnArKykgeworCQkvKgorCQkgKiBBcHBseSB0aGUgZGVsdGEgYXQgaW5kZXggbi4gIElmIGl0IGZhaWxzLCBicmVhaworCQkgKiBmcm9tIHRoZSBsb29wIHNvIHdlJ2xsIGZhbGwgaW50byB0aGUgdW5kbyBsb29wCisJCSAqIGJlbG93LgorCQkgKi8KKwkJc3RhdHVzID0geGZzX21vZF9pbmNvcmVfc2JfdW5sb2NrZWQobXAsIG1zYnAtPm1zYl9maWVsZCwKKwkJCQkJCSAgICBtc2JwLT5tc2JfZGVsdGEsIHJzdmQpOworCQlpZiAoc3RhdHVzICE9IDApIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyoKKwkgKiBJZiB3ZSBkaWRuJ3QgY29tcGxldGUgdGhlIGxvb3AgYWJvdmUsIHRoZW4gYmFjayBvdXQKKwkgKiBhbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBzdXBlcmJsb2NrLiAgSWYgeW91IGFkZCBjb2RlCisJICogYmV0d2VlbiB0aGUgbG9vcCBhYm92ZSBhbmQgaGVyZSwgbWFrZSBzdXJlIHRoYXQgeW91CisJICogcHJlc2VydmUgdGhlIHZhbHVlIG9mIHN0YXR1cy4gTG9vcCBiYWNrIHVudGlsCisJICogd2Ugc3RlcCBiZWxvdyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheS4gIE1ha2Ugc3VyZQorCSAqIHdlIGRvbid0IHRvdWNoIGFueXRoaW5nIGJhY2sgdGhlcmUuCisJICovCisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCW1zYnAtLTsKKwkJd2hpbGUgKG1zYnAgPj0gbXNiKSB7CisJCQlzdGF0dXMgPSB4ZnNfbW9kX2luY29yZV9zYl91bmxvY2tlZChtcCwKKwkJCQkgICAgbXNicC0+bXNiX2ZpZWxkLCAtKG1zYnAtPm1zYl9kZWx0YSksIHJzdmQpOworCQkJQVNTRVJUKHN0YXR1cyA9PSAwKTsKKwkJCW1zYnAtLTsKKwkJfQorCX0KKwlYRlNfU0JfVU5MT0NLKG1wLCBzKTsKKwlyZXR1cm4gKHN0YXR1cyk7Cit9CisKKy8qCisgKiB4ZnNfZ2V0c2IoKSBpcyBjYWxsZWQgdG8gb2J0YWluIHRoZSBidWZmZXIgZm9yIHRoZSBzdXBlcmJsb2NrLgorICogVGhlIGJ1ZmZlciBpcyByZXR1cm5lZCBsb2NrZWQgYW5kIHJlYWQgaW4gZnJvbSBkaXNrLgorICogVGhlIGJ1ZmZlciBzaG91bGQgYmUgcmVsZWFzZWQgd2l0aCBhIGNhbGwgdG8geGZzX2JyZWxzZSgpLgorICoKKyAqIElmIHRoZSBmbGFncyBwYXJhbWV0ZXIgaXMgQlVGX1RSWUxPQ0ssIHRoZW4gd2UnbGwgb25seSByZXR1cm4KKyAqIHRoZSBzdXBlcmJsb2NrIGJ1ZmZlciBpZiBpdCBjYW4gYmUgbG9ja2VkIHdpdGhvdXQgc2xlZXBpbmcuCisgKiBJZiBpdCBjYW4ndCB0aGVuIHdlJ2xsIHJldHVybiBOVUxMLgorICovCit4ZnNfYnVmX3QgKgoreGZzX2dldHNiKAorCXhmc19tb3VudF90CSptcCwKKwlpbnQJCWZsYWdzKQoreworCXhmc19idWZfdAkqYnA7CisKKwlBU1NFUlQobXAtPm1fc2JfYnAgIT0gTlVMTCk7CisJYnAgPSBtcC0+bV9zYl9icDsKKwlpZiAoZmxhZ3MgJiBYRlNfQlVGX1RSWUxPQ0spIHsKKwkJaWYgKCFYRlNfQlVGX0NQU0VNQShicCkpIHsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfSBlbHNlIHsKKwkJWEZTX0JVRl9QU0VNQShicCwgUFJJQklPKTsKKwl9CisJWEZTX0JVRl9IT0xEKGJwKTsKKwlBU1NFUlQoWEZTX0JVRl9JU0RPTkUoYnApKTsKKwlyZXR1cm4gKGJwKTsKK30KKworLyoKKyAqIFVzZWQgdG8gZnJlZSB0aGUgc3VwZXJibG9jayBhbG9uZyB2YXJpb3VzIGVycm9yIHBhdGhzLgorICovCit2b2lkCit4ZnNfZnJlZXNiKAorCXhmc19tb3VudF90CSptcCkKK3sKKwl4ZnNfYnVmX3QJKmJwOworCisJLyoKKwkgKiBVc2UgeGZzX2dldHNiKCkgc28gdGhhdCB0aGUgYnVmZmVyIHdpbGwgYmUgbG9ja2VkCisJICogd2hlbiB3ZSBjYWxsIHhmc19idWZfcmVsc2UoKS4KKwkgKi8KKwlicCA9IHhmc19nZXRzYihtcCwgMCk7CisJWEZTX0JVRl9VTk1BTkFHRShicCk7CisJeGZzX2J1Zl9yZWxzZShicCk7CisJbXAtPm1fc2JfYnAgPSBOVUxMOworfQorCisvKgorICogU2VlIGlmIHRoZSBVVUlEIGlzIHVuaXF1ZSBhbW9uZyBtb3VudGVkIFhGUyBmaWxlc3lzdGVtcy4KKyAqIE1vdW50IGZhaWxzIGlmIFVVSUQgaXMgbmlsIG9yIGEgRlMgd2l0aCB0aGUgc2FtZSBVVUlEIGlzIGFscmVhZHkgbW91bnRlZC4KKyAqLworU1RBVElDIGludAoreGZzX3V1aWRfbW91bnQoCisJeGZzX21vdW50X3QJKm1wKQoreworCWlmICh1dWlkX2lzX25pbCgmbXAtPm1fc2Iuc2JfdXVpZCkpIHsKKwkJY21uX2VycihDRV9XQVJOLAorCQkJIlhGUzogRmlsZXN5c3RlbSAlcyBoYXMgbmlsIFVVSUQgLSBjYW4ndCBtb3VudCIsCisJCQltcC0+bV9mc25hbWUpOworCQlyZXR1cm4gLTE7CisJfQorCWlmICghdXVpZF90YWJsZV9pbnNlcnQoJm1wLT5tX3NiLnNiX3V1aWQpKSB7CisJCWNtbl9lcnIoQ0VfV0FSTiwKKwkJCSJYRlM6IEZpbGVzeXN0ZW0gJXMgaGFzIGR1cGxpY2F0ZSBVVUlEIC0gY2FuJ3QgbW91bnQiLAorCQkJbXAtPm1fZnNuYW1lKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlbW92ZSBmaWxlc3lzdGVtIGZyb20gdGhlIFVVSUQgdGFibGUuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfdXVpZF91bm1vdW50KAorCXhmc19tb3VudF90CSptcCkKK3sKKwl1dWlkX3RhYmxlX3JlbW92ZSgmbXAtPm1fc2Iuc2JfdXVpZCk7Cit9CisKKy8qCisgKiBVc2VkIHRvIGxvZyBjaGFuZ2VzIHRvIHRoZSBzdXBlcmJsb2NrIHVuaXQgYW5kIHdpZHRoIGZpZWxkcyB3aGljaCBjb3VsZAorICogYmUgYWx0ZXJlZCBieSB0aGUgbW91bnQgb3B0aW9ucy4gT25seSB0aGUgZmlyc3Qgc3VwZXJibG9jayBpcyB1cGRhdGVkLgorICovCitTVEFUSUMgdm9pZAoreGZzX21vdW50X2xvZ19zYnVuaXQoCisJeGZzX21vdW50X3QJKm1wLAorCV9faW50NjRfdAlmaWVsZHMpCit7CisJeGZzX3RyYW5zX3QJKnRwOworCisJQVNTRVJUKGZpZWxkcyAmIChYRlNfU0JfVU5JVHxYRlNfU0JfV0lEVEh8WEZTX1NCX1VVSUQpKTsKKworCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfU0JfVU5JVCk7CisJaWYgKHhmc190cmFuc19yZXNlcnZlKHRwLCAwLCBtcC0+bV9zYi5zYl9zZWN0c2l6ZSArIDEyOCwgMCwgMCwKKwkJCQlYRlNfREVGQVVMVF9MT0dfQ09VTlQpKSB7CisJCXhmc190cmFuc19jYW5jZWwodHAsIDApOworCQlyZXR1cm47CisJfQorCXhmc19tb2Rfc2IodHAsIGZpZWxkcyk7CisJeGZzX3RyYW5zX2NvbW1pdCh0cCwgMCwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX21vdW50LmggYi9mcy94ZnMveGZzX21vdW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZjNjIwMQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfbW91bnQuaApAQCAtMCwwICsxLDU3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfTU9VTlRfSF9fCisjZGVmaW5lCV9fWEZTX01PVU5UX0hfXworCisKK3R5cGVkZWYgc3RydWN0IHhmc190cmFuc19yZXNlcnZhdGlvbnMgeworCXVpbnQJdHJfd3JpdGU7CS8qIGV4dGVudCBhbGxvYyB0cmFucyAqLworCXVpbnQJdHJfaXRydW5jYXRlOwkvKiB0cnVuY2F0ZSB0cmFucyAqLworCXVpbnQJdHJfcmVuYW1lOwkvKiByZW5hbWUgdHJhbnMgKi8KKwl1aW50CXRyX2xpbms7CS8qIGxpbmsgdHJhbnMgKi8KKwl1aW50CXRyX3JlbW92ZTsJLyogdW5saW5rIHRyYW5zICovCisJdWludAl0cl9zeW1saW5rOwkvKiBzeW1saW5rIHRyYW5zICovCisJdWludAl0cl9jcmVhdGU7CS8qIGNyZWF0ZSB0cmFucyAqLworCXVpbnQJdHJfbWtkaXI7CS8qIG1rZGlyIHRyYW5zICovCisJdWludAl0cl9pZnJlZTsJLyogaW5vZGUgZnJlZSB0cmFucyAqLworCXVpbnQJdHJfaWNoYW5nZTsJLyogaW5vZGUgdXBkYXRlIHRyYW5zICovCisJdWludAl0cl9ncm93ZGF0YTsJLyogZnMgZGF0YSBzZWN0aW9uIGdyb3cgdHJhbnMgKi8KKwl1aW50CXRyX3N3cml0ZTsJLyogc3luYyB3cml0ZSBpbm9kZSB0cmFucyAqLworCXVpbnQJdHJfYWRkYWZvcms7CS8qIGN2dCBpbm9kZSB0byBhdHRyaWJ1dGVkIHRyYW5zICovCisJdWludAl0cl93cml0ZWlkOwkvKiB3cml0ZSBzZXR1aWQvc2V0Z2lkIGZpbGUgKi8KKwl1aW50CXRyX2F0dHJpbnZhbDsJLyogYXR0ciBmb3JrIGJ1ZmZlciBpbnZhbGlkYXRpb24gKi8KKwl1aW50CXRyX2F0dHJzZXQ7CS8qIHNldC9jcmVhdGUgYW4gYXR0cmlidXRlICovCisJdWludAl0cl9hdHRycm07CS8qIHJlbW92ZSBhbiBhdHRyaWJ1dGUgKi8KKwl1aW50CXRyX2NsZWFyYWdpOwkvKiBjbGVhciBiYWQgYWdpIHVubGlua2VkIGlubyBidWNrZXQgKi8KKwl1aW50CXRyX2dyb3dydGFsbG9jOwkvKiBncm93IHJlYWx0aW1lIGFsbG9jYXRpb25zICovCisJdWludAl0cl9ncm93cnR6ZXJvOwkvKiBncm93IHJlYWx0aW1lIHplcm9pbmcgKi8KKwl1aW50CXRyX2dyb3dydGZyZWU7CS8qIGdyb3cgcmVhbHRpbWUgZnJlZWluZyAqLworfSB4ZnNfdHJhbnNfcmVzZXJ2YXRpb25zX3Q7CisKKworI2lmbmRlZiBfX0tFUk5FTF9fCisvKgorICogTW92ZWQgaGVyZSBmcm9tIHhmc19hZy5oIHRvIGF2b2lkIHJlb3JkZXJpbmcgaGVhZGVyIGZpbGVzCisgKi8KKyNkZWZpbmUgWEZTX0RBRERSX1RPX0FHTk8obXAsZCkgXAorCSgoeGZzX2FnbnVtYmVyX3QpKFhGU19CQl9UT19GU0JUKG1wLCBkKSAvIChtcCktPm1fc2Iuc2JfYWdibG9ja3MpKQorI2RlZmluZSBYRlNfREFERFJfVE9fQUdCTk8obXAsZCkgXAorCSgoeGZzX2FnYmxvY2tfdCkoWEZTX0JCX1RPX0ZTQlQobXAsIGQpICUgKG1wKS0+bV9zYi5zYl9hZ2Jsb2NrcykpCisjZWxzZQorc3RydWN0IGNyZWQ7CitzdHJ1Y3QgbG9nOworc3RydWN0IHZmczsKK3N0cnVjdCB2bm9kZTsKK3N0cnVjdCB4ZnNfbW91bnRfYXJnczsKK3N0cnVjdCB4ZnNfaWhhc2g7CitzdHJ1Y3QgeGZzX2NoYXNoOworc3RydWN0IHhmc19pbm9kZTsKK3N0cnVjdCB4ZnNfcGVyYWc7CitzdHJ1Y3QgeGZzX2lvY29yZTsKK3N0cnVjdCB4ZnNfYm1idF9pcmVjOworc3RydWN0IHhmc19ibWFwX2ZyZWU7CisKKyNkZWZpbmUJQUlMX0xPQ0tfVAkJbG9ja190CisjZGVmaW5lCUFJTF9MT0NLSU5JVCh4LHkpCXNwaW5sb2NrX2luaXQoeCx5KQorI2RlZmluZQlBSUxfTE9DS19ERVNUUk9ZKHgpCXNwaW5sb2NrX2Rlc3Ryb3koeCkKKyNkZWZpbmUJQUlMX0xPQ0sobXAscykJCXM9bXV0ZXhfc3BpbmxvY2soJihtcCktPm1fYWlsX2xvY2spCisjZGVmaW5lCUFJTF9VTkxPQ0sobXAscykJbXV0ZXhfc3BpbnVubG9jaygmKG1wKS0+bV9haWxfbG9jaywgcykKKworCisvKgorICogUHJvdG90eXBlcyBhbmQgZnVuY3Rpb25zIGZvciB0aGUgRGF0YSBNaWdyYXRpb24gc3Vic3lzdGVtLgorICovCisKK3R5cGVkZWYgaW50CSgqeGZzX3NlbmRfZGF0YV90KShpbnQsIHN0cnVjdCB2bm9kZSAqLAorCQkJeGZzX29mZl90LCBzaXplX3QsIGludCwgdnJ3bG9ja190ICopOwordHlwZWRlZiBpbnQJKCp4ZnNfc2VuZF9tbWFwX3QpKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqLCB1aW50KTsKK3R5cGVkZWYgaW50CSgqeGZzX3NlbmRfZGVzdHJveV90KShzdHJ1Y3Qgdm5vZGUgKiwgZG1fcmlnaHRfdCk7Cit0eXBlZGVmIGludAkoKnhmc19zZW5kX25hbWVzcF90KShkbV9ldmVudHR5cGVfdCwgc3RydWN0IHZmcyAqLAorCQkJc3RydWN0IHZub2RlICosCisJCQlkbV9yaWdodF90LCBzdHJ1Y3Qgdm5vZGUgKiwgZG1fcmlnaHRfdCwKKwkJCWNoYXIgKiwgY2hhciAqLCBtb2RlX3QsIGludCwgaW50KTsKK3R5cGVkZWYgdm9pZAkoKnhmc19zZW5kX3VubW91bnRfdCkoc3RydWN0IHZmcyAqLCBzdHJ1Y3Qgdm5vZGUgKiwKKwkJCWRtX3JpZ2h0X3QsIG1vZGVfdCwgaW50LCBpbnQpOworCit0eXBlZGVmIHN0cnVjdCB4ZnNfZG1vcHMgeworCXhmc19zZW5kX2RhdGFfdAkJeGZzX3NlbmRfZGF0YTsKKwl4ZnNfc2VuZF9tbWFwX3QJCXhmc19zZW5kX21tYXA7CisJeGZzX3NlbmRfZGVzdHJveV90CXhmc19zZW5kX2Rlc3Ryb3k7CisJeGZzX3NlbmRfbmFtZXNwX3QJeGZzX3NlbmRfbmFtZXNwOworCXhmc19zZW5kX3VubW91bnRfdAl4ZnNfc2VuZF91bm1vdW50OworfSB4ZnNfZG1vcHNfdDsKKworI2RlZmluZSBYRlNfU0VORF9EQVRBKG1wLCBldix2cCxvZmYsbGVuLGZsLGxvY2spIFwKKwkoKihtcCktPm1fZG1fb3BzLnhmc19zZW5kX2RhdGEpKGV2LHZwLG9mZixsZW4sZmwsbG9jaykKKyNkZWZpbmUgWEZTX1NFTkRfTU1BUChtcCwgdm1hLGZsKSBcCisJKCoobXApLT5tX2RtX29wcy54ZnNfc2VuZF9tbWFwKSh2bWEsZmwpCisjZGVmaW5lIFhGU19TRU5EX0RFU1RST1kobXAsIHZwLHJpZ2h0KSBcCisJKCoobXApLT5tX2RtX29wcy54ZnNfc2VuZF9kZXN0cm95KSh2cCxyaWdodCkKKyNkZWZpbmUgWEZTX1NFTkRfTkFNRVNQKG1wLCBldixiMSxyMSxiMixyMixuMSxuMixtb2RlLHJ2YWwsZmwpIFwKKwkoKihtcCktPm1fZG1fb3BzLnhmc19zZW5kX25hbWVzcCkoZXYsTlVMTCxiMSxyMSxiMixyMixuMSxuMixtb2RlLHJ2YWwsZmwpCisjZGVmaW5lIFhGU19TRU5EX1BSRVVOTU9VTlQobXAsIHZmcyxiMSxyMSxiMixyMixuMSxuMixtb2RlLHJ2YWwsZmwpIFwKKwkoKihtcCktPm1fZG1fb3BzLnhmc19zZW5kX25hbWVzcCkoRE1fRVZFTlRfUFJFVU5NT1VOVCx2ZnMsYjEscjEsYjIscjIsbjEsbjIsbW9kZSxydmFsLGZsKQorI2RlZmluZSBYRlNfU0VORF9VTk1PVU5UKG1wLCB2ZnNwLHZwLHJpZ2h0LG1vZGUscnZhbCxmbCkgXAorCSgqKG1wKS0+bV9kbV9vcHMueGZzX3NlbmRfdW5tb3VudCkodmZzcCx2cCxyaWdodCxtb2RlLHJ2YWwsZmwpCisKKworLyoKKyAqIFByb3RvdHlwZXMgYW5kIGZ1bmN0aW9ucyBmb3IgdGhlIFF1b3RhIE1hbmFnZW1lbnQgc3Vic3lzdGVtLgorICovCisKK3N0cnVjdCB4ZnNfZHF1b3Q7CitzdHJ1Y3QgeGZzX2RxdHJ4b3BzOworc3RydWN0IHhmc19xdW90YWluZm87CisKK3R5cGVkZWYgaW50CSgqeGZzX3FtaW5pdF90KShzdHJ1Y3QgeGZzX21vdW50ICosIHVpbnQgKiwgdWludCAqKTsKK3R5cGVkZWYgaW50CSgqeGZzX3FtbW91bnRfdCkoc3RydWN0IHhmc19tb3VudCAqLCB1aW50LCB1aW50LCBpbnQpOwordHlwZWRlZiBpbnQJKCp4ZnNfcW11bm1vdW50X3QpKHN0cnVjdCB4ZnNfbW91bnQgKik7Cit0eXBlZGVmIHZvaWQJKCp4ZnNfcW1kb25lX3QpKHN0cnVjdCB4ZnNfbW91bnQgKik7Cit0eXBlZGVmIHZvaWQJKCp4ZnNfZHFyZWxlX3QpKHN0cnVjdCB4ZnNfZHF1b3QgKik7Cit0eXBlZGVmIGludAkoKnhmc19kcWF0dGFjaF90KShzdHJ1Y3QgeGZzX2lub2RlICosIHVpbnQpOwordHlwZWRlZiB2b2lkCSgqeGZzX2RxZGV0YWNoX3QpKHN0cnVjdCB4ZnNfaW5vZGUgKik7Cit0eXBlZGVmIGludAkoKnhmc19kcXB1cmdlYWxsX3QpKHN0cnVjdCB4ZnNfbW91bnQgKiwgdWludCk7Cit0eXBlZGVmIGludAkoKnhmc19kcXZvcGFsbG9jX3QpKHN0cnVjdCB4ZnNfbW91bnQgKiwKKwkJCXN0cnVjdCB4ZnNfaW5vZGUgKiwgdWlkX3QsIGdpZF90LCB1aW50LAorCQkJc3RydWN0IHhmc19kcXVvdCAqKiwgc3RydWN0IHhmc19kcXVvdCAqKik7Cit0eXBlZGVmIHZvaWQJKCp4ZnNfZHF2b3BjcmVhdGVfdCkoc3RydWN0IHhmc190cmFucyAqLCBzdHJ1Y3QgeGZzX2lub2RlICosCisJCQlzdHJ1Y3QgeGZzX2RxdW90ICosIHN0cnVjdCB4ZnNfZHF1b3QgKik7Cit0eXBlZGVmIGludAkoKnhmc19kcXZvcHJlbmFtZV90KShzdHJ1Y3QgeGZzX2lub2RlICoqKTsKK3R5cGVkZWYgc3RydWN0IHhmc19kcXVvdCAqICgqeGZzX2Rxdm9wY2hvd25fdCkoCisJCQlzdHJ1Y3QgeGZzX3RyYW5zICosIHN0cnVjdCB4ZnNfaW5vZGUgKiwKKwkJCXN0cnVjdCB4ZnNfZHF1b3QgKiosIHN0cnVjdCB4ZnNfZHF1b3QgKik7Cit0eXBlZGVmIGludAkoKnhmc19kcXZvcGNob3ducmVzdl90KShzdHJ1Y3QgeGZzX3RyYW5zICosIHN0cnVjdCB4ZnNfaW5vZGUgKiwKKwkJCXN0cnVjdCB4ZnNfZHF1b3QgKiwgc3RydWN0IHhmc19kcXVvdCAqLCB1aW50KTsKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX3Ftb3BzIHsKKwl4ZnNfcW1pbml0X3QJCXhmc19xbWluaXQ7CisJeGZzX3FtZG9uZV90CQl4ZnNfcW1kb25lOworCXhmc19xbW1vdW50X3QJCXhmc19xbW1vdW50OworCXhmc19xbXVubW91bnRfdAkJeGZzX3FtdW5tb3VudDsKKwl4ZnNfZHFyZWxlX3QJCXhmc19kcXJlbGU7CisJeGZzX2RxYXR0YWNoX3QJCXhmc19kcWF0dGFjaDsKKwl4ZnNfZHFkZXRhY2hfdAkJeGZzX2RxZGV0YWNoOworCXhmc19kcXB1cmdlYWxsX3QJeGZzX2RxcHVyZ2VhbGw7CisJeGZzX2Rxdm9wYWxsb2NfdAl4ZnNfZHF2b3BhbGxvYzsKKwl4ZnNfZHF2b3BjcmVhdGVfdAl4ZnNfZHF2b3BjcmVhdGU7CisJeGZzX2Rxdm9wcmVuYW1lX3QJeGZzX2Rxdm9wcmVuYW1lOworCXhmc19kcXZvcGNob3duX3QJeGZzX2Rxdm9wY2hvd247CisJeGZzX2Rxdm9wY2hvd25yZXN2X3QJeGZzX2Rxdm9wY2hvd25yZXN2OworCXN0cnVjdCB4ZnNfZHF0cnhvcHMJKnhmc19kcXRyeG9wczsKK30geGZzX3Ftb3BzX3Q7CisKKyNkZWZpbmUgWEZTX1FNX0lOSVQobXAsIG1udCwgZmwpIFwKKwkoKihtcCktPm1fcW1fb3BzLnhmc19xbWluaXQpKG1wLCBtbnQsIGZsKQorI2RlZmluZSBYRlNfUU1fTU9VTlQobXAsIG1udCwgZmwsIG1mc2lfZmxhZ3MpIFwKKwkoKihtcCktPm1fcW1fb3BzLnhmc19xbW1vdW50KShtcCwgbW50LCBmbCwgbWZzaV9mbGFncykKKyNkZWZpbmUgWEZTX1FNX1VOTU9VTlQobXApIFwKKwkoKihtcCktPm1fcW1fb3BzLnhmc19xbXVubW91bnQpKG1wKQorI2RlZmluZSBYRlNfUU1fRE9ORShtcCkgXAorCSgqKG1wKS0+bV9xbV9vcHMueGZzX3FtZG9uZSkobXApCisjZGVmaW5lIFhGU19RTV9EUVJFTEUobXAsIGRxKSBcCisJKCoobXApLT5tX3FtX29wcy54ZnNfZHFyZWxlKShkcSkKKyNkZWZpbmUgWEZTX1FNX0RRQVRUQUNIKG1wLCBpcCwgZmwpIFwKKwkoKihtcCktPm1fcW1fb3BzLnhmc19kcWF0dGFjaCkoaXAsIGZsKQorI2RlZmluZSBYRlNfUU1fRFFERVRBQ0gobXAsIGlwKSBcCisJKCoobXApLT5tX3FtX29wcy54ZnNfZHFkZXRhY2gpKGlwKQorI2RlZmluZSBYRlNfUU1fRFFQVVJHRUFMTChtcCwgZmwpIFwKKwkoKihtcCktPm1fcW1fb3BzLnhmc19kcXB1cmdlYWxsKShtcCwgZmwpCisjZGVmaW5lIFhGU19RTV9EUVZPUEFMTE9DKG1wLCBpcCwgdWlkLCBnaWQsIGZsLCBkcTEsIGRxMikgXAorCSgqKG1wKS0+bV9xbV9vcHMueGZzX2Rxdm9wYWxsb2MpKG1wLCBpcCwgdWlkLCBnaWQsIGZsLCBkcTEsIGRxMikKKyNkZWZpbmUgWEZTX1FNX0RRVk9QQ1JFQVRFKG1wLCB0cCwgaXAsIGRxMSwgZHEyKSBcCisJKCoobXApLT5tX3FtX29wcy54ZnNfZHF2b3BjcmVhdGUpKHRwLCBpcCwgZHExLCBkcTIpCisjZGVmaW5lIFhGU19RTV9EUVZPUFJFTkFNRShtcCwgaXApIFwKKwkoKihtcCktPm1fcW1fb3BzLnhmc19kcXZvcHJlbmFtZSkoaXApCisjZGVmaW5lIFhGU19RTV9EUVZPUENIT1dOKG1wLCB0cCwgaXAsIGRxcCwgZHEpIFwKKwkoKihtcCktPm1fcW1fb3BzLnhmc19kcXZvcGNob3duKSh0cCwgaXAsIGRxcCwgZHEpCisjZGVmaW5lIFhGU19RTV9EUVZPUENIT1dOUkVTVihtcCwgdHAsIGlwLCBkcTEsIGRxMiwgZmwpIFwKKwkoKihtcCktPm1fcW1fb3BzLnhmc19kcXZvcGNob3ducmVzdikodHAsIGlwLCBkcTEsIGRxMiwgZmwpCisKKworLyoKKyAqIFByb3RvdHlwZXMgYW5kIGZ1bmN0aW9ucyBmb3IgSS9PIGNvcmUgbW9kdWxhcml6YXRpb24uCisgKi8KKwordHlwZWRlZiBpbnQJCSgqeGZzX2lvaW5pdF90KShzdHJ1Y3QgdmZzICosCisJCQkJc3RydWN0IHhmc19tb3VudF9hcmdzICosIGludCk7Cit0eXBlZGVmIGludAkJKCp4ZnNfYm1hcGlfdCkoc3RydWN0IHhmc190cmFucyAqLCB2b2lkICosCisJCQkJeGZzX2ZpbGVvZmZfdCwgeGZzX2ZpbGJsa3NfdCwgaW50LAorCQkJCXhmc19mc2Jsb2NrX3QgKiwgeGZzX2V4dGxlbl90LAorCQkJCXN0cnVjdCB4ZnNfYm1idF9pcmVjICosIGludCAqLAorCQkJCXN0cnVjdCB4ZnNfYm1hcF9mcmVlICopOwordHlwZWRlZiBpbnQJCSgqeGZzX2JtYXBfZW9mX3QpKHZvaWQgKiwgeGZzX2ZpbGVvZmZfdCwgaW50LCBpbnQgKik7Cit0eXBlZGVmIGludAkJKCp4ZnNfaW9tYXBfd3JpdGVfZGlyZWN0X3QpKAorCQkJCXZvaWQgKiwgbG9mZl90LCBzaXplX3QsIGludCwKKwkJCQlzdHJ1Y3QgeGZzX2JtYnRfaXJlYyAqLCBpbnQgKiwgaW50KTsKK3R5cGVkZWYgaW50CQkoKnhmc19pb21hcF93cml0ZV9kZWxheV90KSgKKwkJCQl2b2lkICosIGxvZmZfdCwgc2l6ZV90LCBpbnQsCisJCQkJc3RydWN0IHhmc19ibWJ0X2lyZWMgKiwgaW50ICopOwordHlwZWRlZiBpbnQJCSgqeGZzX2lvbWFwX3dyaXRlX2FsbG9jYXRlX3QpKAorCQkJCXZvaWQgKiwgc3RydWN0IHhmc19ibWJ0X2lyZWMgKiwgaW50ICopOwordHlwZWRlZiBpbnQJCSgqeGZzX2lvbWFwX3dyaXRlX3Vud3JpdHRlbl90KSgKKwkJCQl2b2lkICosIGxvZmZfdCwgc2l6ZV90KTsKK3R5cGVkZWYgdWludAkJKCp4ZnNfbGNrX21hcF9zaGFyZWRfdCkodm9pZCAqKTsKK3R5cGVkZWYgdm9pZAkJKCp4ZnNfbG9ja190KSh2b2lkICosIHVpbnQpOwordHlwZWRlZiB2b2lkCQkoKnhmc19sb2NrX2RlbW90ZV90KSh2b2lkICosIHVpbnQpOwordHlwZWRlZiBpbnQJCSgqeGZzX2xvY2tfbm93YWl0X3QpKHZvaWQgKiwgdWludCk7Cit0eXBlZGVmIHZvaWQJCSgqeGZzX3VubGtfdCkodm9pZCAqLCB1bnNpZ25lZCBpbnQpOwordHlwZWRlZiB4ZnNfZnNpemVfdAkoKnhmc19zaXplX3QpKHZvaWQgKik7Cit0eXBlZGVmIHhmc19mc2l6ZV90CSgqeGZzX2lvZG9uZV90KShzdHJ1Y3QgdmZzICopOworCit0eXBlZGVmIHN0cnVjdCB4ZnNfaW9vcHMgeworCXhmc19pb2luaXRfdAkJCXhmc19pb2luaXQ7CisJeGZzX2JtYXBpX3QJCQl4ZnNfYm1hcGlfZnVuYzsKKwl4ZnNfYm1hcF9lb2ZfdAkJCXhmc19ibWFwX2VvZl9mdW5jOworCXhmc19pb21hcF93cml0ZV9kaXJlY3RfdAl4ZnNfaW9tYXBfd3JpdGVfZGlyZWN0OworCXhmc19pb21hcF93cml0ZV9kZWxheV90CQl4ZnNfaW9tYXBfd3JpdGVfZGVsYXk7CisJeGZzX2lvbWFwX3dyaXRlX2FsbG9jYXRlX3QJeGZzX2lvbWFwX3dyaXRlX2FsbG9jYXRlOworCXhmc19pb21hcF93cml0ZV91bndyaXR0ZW5fdAl4ZnNfaW9tYXBfd3JpdGVfdW53cml0dGVuOworCXhmc19sb2NrX3QJCQl4ZnNfaWxvY2s7CisJeGZzX2xja19tYXBfc2hhcmVkX3QJCXhmc19sY2tfbWFwX3NoYXJlZDsKKwl4ZnNfbG9ja19kZW1vdGVfdAkJeGZzX2lsb2NrX2RlbW90ZTsKKwl4ZnNfbG9ja19ub3dhaXRfdAkJeGZzX2lsb2NrX25vd2FpdDsKKwl4ZnNfdW5sa190CQkJeGZzX3VubG9jazsKKwl4ZnNfc2l6ZV90CQkJeGZzX3NpemVfZnVuYzsKKwl4ZnNfaW9kb25lX3QJCQl4ZnNfaW9kb25lOworfSB4ZnNfaW9vcHNfdDsKKworI2RlZmluZSBYRlNfSU9JTklUKHZmc3AsIGFyZ3MsIGZsYWdzKSBcCisJKCoobXApLT5tX2lvX29wcy54ZnNfaW9pbml0KSh2ZnNwLCBhcmdzLCBmbGFncykKKyNkZWZpbmUgWEZTX0JNQVBJKG1wLCB0cmFucyxpbyxibm8sbGVuLGYsZmlyc3QsdG90LG12YWwsbm1hcCxmbGlzdCkJXAorCSgqKG1wKS0+bV9pb19vcHMueGZzX2JtYXBpX2Z1bmMpIFwKKwkJKHRyYW5zLChpbyktPmlvX29iaixibm8sbGVuLGYsZmlyc3QsdG90LG12YWwsbm1hcCxmbGlzdCkKKyNkZWZpbmUgWEZTX0JNQVBfRU9GKG1wLCBpbywgZW5kb2ZmLCB3aGljaGZvcmssIGVvZikgXAorCSgqKG1wKS0+bV9pb19vcHMueGZzX2JtYXBfZW9mX2Z1bmMpIFwKKwkJKChpbyktPmlvX29iaiwgZW5kb2ZmLCB3aGljaGZvcmssIGVvZikKKyNkZWZpbmUgWEZTX0lPTUFQX1dSSVRFX0RJUkVDVChtcCwgaW8sIG9mZnNldCwgY291bnQsIGZsYWdzLCBtdmFsLCBubWFwLCBmb3VuZClcCisJKCoobXApLT5tX2lvX29wcy54ZnNfaW9tYXBfd3JpdGVfZGlyZWN0KSBcCisJCSgoaW8pLT5pb19vYmosIG9mZnNldCwgY291bnQsIGZsYWdzLCBtdmFsLCBubWFwLCBmb3VuZCkKKyNkZWZpbmUgWEZTX0lPTUFQX1dSSVRFX0RFTEFZKG1wLCBpbywgb2Zmc2V0LCBjb3VudCwgZmxhZ3MsIG12YWwsIG5tYXApIFwKKwkoKihtcCktPm1faW9fb3BzLnhmc19pb21hcF93cml0ZV9kZWxheSkgXAorCQkoKGlvKS0+aW9fb2JqLCBvZmZzZXQsIGNvdW50LCBmbGFncywgbXZhbCwgbm1hcCkKKyNkZWZpbmUgWEZTX0lPTUFQX1dSSVRFX0FMTE9DQVRFKG1wLCBpbywgbXZhbCwgbm1hcCkgXAorCSgqKG1wKS0+bV9pb19vcHMueGZzX2lvbWFwX3dyaXRlX2FsbG9jYXRlKSBcCisJCSgoaW8pLT5pb19vYmosIG12YWwsIG5tYXApCisjZGVmaW5lIFhGU19JT01BUF9XUklURV9VTldSSVRURU4obXAsIGlvLCBvZmZzZXQsIGNvdW50KSBcCisJKCoobXApLT5tX2lvX29wcy54ZnNfaW9tYXBfd3JpdGVfdW53cml0dGVuKSBcCisJCSgoaW8pLT5pb19vYmosIG9mZnNldCwgY291bnQpCisjZGVmaW5lIFhGU19MQ0tfTUFQX1NIQVJFRChtcCwgaW8pIFwKKwkoKihtcCktPm1faW9fb3BzLnhmc19sY2tfbWFwX3NoYXJlZCkoKGlvKS0+aW9fb2JqKQorI2RlZmluZSBYRlNfSUxPQ0sobXAsIGlvLCBtb2RlKSBcCisJKCoobXApLT5tX2lvX29wcy54ZnNfaWxvY2spKChpbyktPmlvX29iaiwgbW9kZSkKKyNkZWZpbmUgWEZTX0lMT0NLX05PV0FJVChtcCwgaW8sIG1vZGUpIFwKKwkoKihtcCktPm1faW9fb3BzLnhmc19pbG9ja19ub3dhaXQpKChpbyktPmlvX29iaiwgbW9kZSkKKyNkZWZpbmUgWEZTX0lVTkxPQ0sobXAsIGlvLCBtb2RlKSBcCisJKCoobXApLT5tX2lvX29wcy54ZnNfdW5sb2NrKSgoaW8pLT5pb19vYmosIG1vZGUpCisjZGVmaW5lIFhGU19JTE9DS19ERU1PVEUobXAsIGlvLCBtb2RlKSBcCisJKCoobXApLT5tX2lvX29wcy54ZnNfaWxvY2tfZGVtb3RlKSgoaW8pLT5pb19vYmosIG1vZGUpCisjZGVmaW5lIFhGU19TSVpFKG1wLCBpbykgXAorCSgqKG1wKS0+bV9pb19vcHMueGZzX3NpemVfZnVuYykoKGlvKS0+aW9fb2JqKQorI2RlZmluZSBYRlNfSU9ET05FKHZmc3ApIFwKKwkoKihtcCktPm1faW9fb3BzLnhmc19pb2RvbmUpKHZmc3ApCisKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX21vdW50IHsKKwliaHZfZGVzY190CQltX2JodjsJCS8qIHZmcyB4ZnMgYmVoYXZpb3IgKi8KKwl4ZnNfdGlkX3QJCW1fdGlkOwkJLyogbmV4dCB1bnVzZWQgdGlkIGZvciBmcyAqLworCUFJTF9MT0NLX1QJCW1fYWlsX2xvY2s7CS8qIGZzIEFJTCBtdXRleCAqLworCXhmc19haWxfZW50cnlfdAkJbV9haWw7CQkvKiBmcyBhY3RpdmUgbG9nIGl0ZW0gbGlzdCAqLworCXVpbnQJCQltX2FpbF9nZW47CS8qIGZzIEFJTCBnZW5lcmF0aW9uIGNvdW50ICovCisJeGZzX3NiX3QJCW1fc2I7CQkvKiBjb3B5IG9mIGZzIHN1cGVyYmxvY2sgKi8KKwlsb2NrX3QJCQltX3NiX2xvY2s7CS8qIHNiIGNvdW50ZXIgbXV0ZXggKi8KKwlzdHJ1Y3QgeGZzX2J1ZgkJKm1fc2JfYnA7CS8qIGJ1ZmZlciBmb3Igc3VwZXJibG9jayAqLworCWNoYXIJCQkqbV9mc25hbWU7CS8qIGZpbGVzeXN0ZW0gbmFtZSAqLworCWludAkJCW1fZnNuYW1lX2xlbjsJLyogc3RybGVuIG9mIGZzIG5hbWUgKi8KKwlpbnQJCQltX2JzaXplOwkvKiBmcyBsb2dpY2FsIGJsb2NrIHNpemUgKi8KKwl4ZnNfYWdudW1iZXJfdAkJbV9hZ2Zyb3RvcjsJLyogbGFzdCBhZyB3aGVyZSBzcGFjZSBmb3VuZCAqLworCXhmc19hZ251bWJlcl90CQltX2FnaXJvdG9yOwkvKiBsYXN0IGFnIGRpciBpbm9kZSBhbGxvY2VkICovCisJbG9ja190CQkJbV9hZ2lyb3Rvcl9sb2NrOy8qIC4uIGFuZCBsb2NrIHByb3RlY3RpbmcgaXQgKi8KKwl4ZnNfYWdudW1iZXJfdAkJbV9tYXhhZ2k7CS8qIGhpZ2hlc3QgaW5vZGUgYWxsb2MgZ3JvdXAgKi8KKwl1aW50CQkJbV9paHNpemU7CS8qIHNpemUgb2YgbmV4dCBmaWVsZCAqLworCXN0cnVjdCB4ZnNfaWhhc2gJKm1faWhhc2g7CS8qIGZzIHByaXZhdGUgaW5vZGUgaGFzaCB0YWJsZSovCisJc3RydWN0IHhmc19pbm9kZQkqbV9pbm9kZXM7CS8qIGFjdGl2ZSBpbm9kZSBsaXN0ICovCisJc3RydWN0IGxpc3RfaGVhZAltX2RlbF9pbm9kZXM7CS8qIGlub2RlcyB0byByZWNsYWltICovCisJbXV0ZXhfdAkJCW1faWxvY2s7CS8qIGlub2RlIGxpc3QgbXV0ZXggKi8KKwl1aW50CQkJbV9pcmVjbGFpbXM7CS8qIGNvdW50IG9mIGNhbGxzIHRvIHJlY2xhaW0qLworCXVpbnQJCQltX3JlYWRpb19sb2c7CS8qIG1pbiByZWFkIHNpemUgbG9nIGJ5dGVzICovCisJdWludAkJCW1fcmVhZGlvX2Jsb2NrczsgLyogbWluIHJlYWQgc2l6ZSBibG9ja3MgKi8KKwl1aW50CQkJbV93cml0ZWlvX2xvZzsJLyogbWluIHdyaXRlIHNpemUgbG9nIGJ5dGVzICovCisJdWludAkJCW1fd3JpdGVpb19ibG9ja3M7IC8qIG1pbiB3cml0ZSBzaXplIGJsb2NrcyAqLworCXN0cnVjdCBsb2cJCSptX2xvZzsJCS8qIGxvZyBzcGVjaWZpYyBzdHVmZiAqLworCWludAkJCW1fbG9nYnVmczsJLyogbnVtYmVyIG9mIGxvZyBidWZmZXJzICovCisJaW50CQkJbV9sb2dic2l6ZTsJLyogc2l6ZSBvZiBlYWNoIGxvZyBidWZmZXIgKi8KKwl1aW50CQkJbV9yc3VtbGV2ZWxzOwkvKiBydCBzdW1tYXJ5IGxldmVscyAqLworCXVpbnQJCQltX3JzdW1zaXplOwkvKiBzaXplIG9mIHJ0IHN1bW1hcnksIGJ5dGVzICovCisJc3RydWN0IHhmc19pbm9kZQkqbV9yYm1pcDsJLyogcG9pbnRlciB0byBiaXRtYXAgaW5vZGUgKi8KKwlzdHJ1Y3QgeGZzX2lub2RlCSptX3JzdW1pcDsJLyogcG9pbnRlciB0byBzdW1tYXJ5IGlub2RlICovCisJc3RydWN0IHhmc19pbm9kZQkqbV9yb290aXA7CS8qIHBvaW50ZXIgdG8gcm9vdCBkaXJlY3RvcnkgKi8KKwlzdHJ1Y3QgeGZzX3F1b3RhaW5mbwkqbV9xdW90YWluZm87CS8qIGRpc2sgcXVvdGEgaW5mb3JtYXRpb24gKi8KKwl4ZnNfYnVmdGFyZ190CQkqbV9kZGV2X3RhcmdwOwkvKiBzYXZlcyB0YWtpbmcgdGhlIGFkZHJlc3MgKi8KKwl4ZnNfYnVmdGFyZ190CQkqbV9sb2dkZXZfdGFyZ3A7LyogcHRyIHRvIGxvZyBkZXZpY2UgKi8KKwl4ZnNfYnVmdGFyZ190CQkqbV9ydGRldl90YXJncDsJLyogcHRyIHRvIHJ0IGRldmljZSAqLworI2RlZmluZSBtX2RldgkJbV9kZGV2X3RhcmdwLT5wYnJfZGV2CisJX191aW50OF90CQltX2RpcmNvb2tfZWxvZzsJLyogbG9nIGQtY29va2llIGVudHJ5IGJpdHMgKi8KKwlfX3VpbnQ4X3QJCW1fYmxrYml0X2xvZzsJLyogYmxvY2tsb2cgKyBOQkJZICovCisJX191aW50OF90CQltX2Jsa2JiX2xvZzsJLyogYmxvY2tsb2cgLSBCQlNISUZUICovCisJX191aW50OF90CQltX2Fnbm9fbG9nOwkvKiBsb2cgI2FnJ3MgKi8KKwlfX3VpbnQ4X3QJCW1fYWdpbm9fbG9nOwkvKiAjYml0cyBmb3IgYWdpbm8gaW4gaW51bSAqLworCV9fdWludDhfdAkJbV9ucmVhZGFoZWFkczsJLyogI3JlYWRhaGVhZCBidWZmZXJzICovCisJX191aW50MTZfdAkJbV9pbm9kZV9jbHVzdGVyX3NpemU7LyogbWluIGlub2RlIGJ1ZiBzaXplICovCisJdWludAkJCW1fYmxvY2ttYXNrOwkvKiBzYl9ibG9ja3NpemUtMSAqLworCXVpbnQJCQltX2Jsb2Nrd3NpemU7CS8qIHNiX2Jsb2Nrc2l6ZSBpbiB3b3JkcyAqLworCXVpbnQJCQltX2Jsb2Nrd21hc2s7CS8qIGJsb2Nrd3NpemUtMSAqLworCXVpbnQJCQltX2FsbG9jX214clsyXTsJLyogWEZTX0FMTE9DX0JMT0NLX01BWFJFQ1MgKi8KKwl1aW50CQkJbV9hbGxvY19tbnJbMl07CS8qIFhGU19BTExPQ19CTE9DS19NSU5SRUNTICovCisJdWludAkJCW1fYm1hcF9kbXhyWzJdOwkvKiBYRlNfQk1BUF9CTE9DS19ETUFYUkVDUyAqLworCXVpbnQJCQltX2JtYXBfZG1uclsyXTsJLyogWEZTX0JNQVBfQkxPQ0tfRE1JTlJFQ1MgKi8KKwl1aW50CQkJbV9pbm9idF9teHJbMl07CS8qIFhGU19JTk9CVF9CTE9DS19NQVhSRUNTICovCisJdWludAkJCW1faW5vYnRfbW5yWzJdOwkvKiBYRlNfSU5PQlRfQkxPQ0tfTUlOUkVDUyAqLworCXVpbnQJCQltX2FnX21heGxldmVsczsJLyogWEZTX0FHX01BWExFVkVMUyAqLworCXVpbnQJCQltX2JtX21heGxldmVsc1syXTsgLyogWEZTX0JNX01BWExFVkVMUyAqLworCXVpbnQJCQltX2luX21heGxldmVsczsJLyogWEZTX0lOX01BWExFVkVMUyAqLworCXN0cnVjdCB4ZnNfcGVyYWcJKm1fcGVyYWc7CS8qIHBlci1hZyBhY2NvdW50aW5nIGluZm8gKi8KKwlzdHJ1Y3Qgcndfc2VtYXBob3JlCW1fcGVyYWdsb2NrOwkvKiBsb2NrIGZvciBtX3BlcmFnIChwb2ludGVyKSAqLworCXNlbWFfdAkJCW1fZ3Jvd2xvY2s7CS8qIGdyb3dmcyBtdXRleCAqLworCWludAkJCW1fZml4ZWRmc2lkWzJdOwkvKiB1bmNoYW5nZWQgZm9yIGxpZmUgb2YgRlMgKi8KKwl1aW50CQkJbV9kbWV2bWFzazsJLyogRE1JIGV2ZW50cyBmb3IgdGhpcyBGUyAqLworCXVpbnQJCQltX2ZsYWdzOwkvKiBnbG9iYWwgbW91bnQgZmxhZ3MgKi8KKwl1aW50CQkJbV9hdHRyb2Zmc2V0OwkvKiBpbm9kZSBhdHRyaWJ1dGUgb2Zmc2V0ICovCisJdWludAkJCW1fZGlyX25vZGVfZW50czsgLyogI2VudHJpZXMgaW4gYSBkaXIgZGFub2RlICovCisJdWludAkJCW1fYXR0cl9ub2RlX2VudHM7IC8qICNlbnRyaWVzIGluIGF0dHIgZGFub2RlICovCisJaW50CQkJbV9pYWxsb2NfaW5vczsJLyogaW5vZGVzIGluIGlub2RlIGFsbG9jYXRpb24gKi8KKwlpbnQJCQltX2lhbGxvY19ibGtzOwkvKiBibG9ja3MgaW4gaW5vZGUgYWxsb2NhdGlvbiAqLworCWludAkJCW1fbGl0aW5vOwkvKiBzaXplIG9mIGlub2RlIHVuaW9uIGFyZWEgKi8KKwlpbnQJCQltX2lub2FsaWduX21hc2s7LyogbWFzayBzYl9pbm9hbGlnbm10IGlmIHVzZWQgKi8KKwl1aW50CQkJbV9xZmxhZ3M7CS8qIHF1b3RhIHN0YXR1cyBmbGFncyAqLworCXhmc190cmFuc19yZXNlcnZhdGlvbnNfdCBtX3Jlc2VydmF0aW9uczsvKiBwcmVjb21wdXRlZCByZXMgdmFsdWVzICovCisJX191aW50NjRfdAkJbV9tYXhpY291bnQ7CS8qIG1heGltdW0gaW5vZGUgY291bnQgKi8KKwlfX3VpbnQ2NF90CQltX21heGlvZmZzZXQ7CS8qIG1heGltdW0gaW5vZGUgb2Zmc2V0ICovCisJX191aW50NjRfdAkJbV9yZXNibGtzOwkvKiB0b3RhbCByZXNlcnZlZCBibG9ja3MgKi8KKwlfX3VpbnQ2NF90CQltX3Jlc2Jsa3NfYXZhaWw7LyogYXZhaWxhYmxlIHJlc2VydmVkIGJsb2NrcyAqLworI2lmIFhGU19CSUdfSU5VTVMKKwl4ZnNfaW5vX3QJCW1faW5vYWRkOwkvKiBhZGQgdmFsdWUgZm9yIGlubzY0X29mZnNldCAqLworI2VuZGlmCisJaW50CQkJbV9kYWxpZ247CS8qIHN0cmlwZSB1bml0ICovCisJaW50CQkJbV9zd2lkdGg7CS8qIHN0cmlwZSB3aWR0aCAqLworCWludAkJCW1fc2lub2FsaWduOwkvKiBzdHJpcGUgdW5pdCBpbm9kZSBhbGlnbm1udCAqLworCWludAkJCW1fYXR0cl9tYWdpY3BjdDsvKiAzNyUgb2YgdGhlIGJsb2Nrc2l6ZSAqLworCWludAkJCW1fZGlyX21hZ2ljcGN0OwkvKiAzNyUgb2YgdGhlIGRpciBibG9ja3NpemUgKi8KKwlfX3VpbnQ4X3QJCW1fbWtfc2hhcmVkcm87CS8qIG1hcmsgc2hhcmVkIHJvIG9uIHVubW91bnQgKi8KKwlfX3VpbnQ4X3QJCW1faW5vZGVfcXVpZXNjZTsvKiBjYWxsIHF1aWVzY2Ugb24gbmV3IGlub2Rlcy4KKwkJCQkJCSAgIGZpZWxkIGdvdmVybmVkIGJ5IG1faWxvY2sgKi8KKwlfX3VpbnQ4X3QJCW1fc2VjdGJiX2xvZzsJLyogc2VjdGxvZyAtIEJCU0hJRlQgKi8KKwlfX3VpbnQ4X3QJCW1fZGlydmVyc2lvbjsJLyogMSBvciAyICovCisJeGZzX2Rpcm9wc190CQltX2Rpcm9wczsJLyogdGFibGUgb2YgZGlyIGZ1bmNzICovCisJaW50CQkJbV9kaXJibGtzaXplOwkvKiBkaXJlY3RvcnkgYmxvY2sgc3otLWJ5dGVzICovCisJaW50CQkJbV9kaXJibGtmc2JzOwkvKiBkaXJlY3RvcnkgYmxvY2sgc3otLWZzYnMgKi8KKwl4ZnNfZGFibGtfdAkJbV9kaXJkYXRhYmxrOwkvKiBibG9ja25vIG9mIGRpciBkYXRhIHYyICovCisJeGZzX2RhYmxrX3QJCW1fZGlybGVhZmJsazsJLyogYmxvY2tubyBvZiBkaXIgbm9uLWRhdGEgdjIgKi8KKwl4ZnNfZGFibGtfdAkJbV9kaXJmcmVlYmxrOwkvKiBibG9ja25vIG9mIGRpcmZyZWVpbmRleCB2MiAqLworCXVpbnQJCQltX2Noc2l6ZTsJLyogc2l6ZSBvZiBuZXh0IGZpZWxkICovCisJc3RydWN0IHhmc19jaGFzaAkqbV9jaGFzaDsJLyogZnMgcHJpdmF0ZSBpbm9kZSBwZXItY2x1c3RlcgorCQkJCQkJICogaGFzaCB0YWJsZSAqLworCXN0cnVjdCB4ZnNfZG1vcHMJbV9kbV9vcHM7CS8qIHZlY3RvciBvZiBETUkgb3BzICovCisJc3RydWN0IHhmc19xbW9wcwltX3FtX29wczsJLyogdmVjdG9yIG9mIFhRTSBvcHMgKi8KKwlzdHJ1Y3QgeGZzX2lvb3BzCW1faW9fb3BzOwkvKiB2ZWN0b3Igb2YgSS9PIG9wcyAqLworCWF0b21pY190CQltX2FjdGl2ZV90cmFuczsJLyogbnVtYmVyIHRyYW5zIGZyb3plbiAqLworfSB4ZnNfbW91bnRfdDsKKworLyoKKyAqIEZsYWdzIGZvciBtX2ZsYWdzLgorICovCisjZGVmaW5lCVhGU19NT1VOVF9XU1lOQwkJMHgwMDAwMDAwMQkvKiBmb3IgbmZzIC0gYWxsIG1ldGFkYXRhIG9wcworCQkJCQkJICAgbXVzdCBiZSBzeW5jaHJvbm91cyBleGNlcHQKKwkJCQkJCSAgIGZvciBzcGFjZSBhbGxvY2F0aW9ucyAqLworI2RlZmluZQlYRlNfTU9VTlRfSU5PNjQJCTB4MDAwMDAwMDIKKwkJCSAgICAgLyogMHgwMDAwMDAwNAktLSBjdXJyZW50bHkgdW51c2VkICovCisJCQkgICAgIC8qIDB4MDAwMDAwMDgJLS0gY3VycmVudGx5IHVudXNlZCAqLworI2RlZmluZSBYRlNfTU9VTlRfRlNfU0hVVERPV04JMHgwMDAwMDAxMAkvKiBhdG9taWMgc3RvcCBvZiBhbGwgZmlsZXN5c3RlbQorCQkJCQkJICAgb3BlcmF0aW9ucywgdHlwaWNhbGx5IGZvcgorCQkJCQkJICAgZGlzayBlcnJvcnMgaW4gbWV0YWRhdGEgKi8KKyNkZWZpbmUgWEZTX01PVU5UX05PQVRJTUUJMHgwMDAwMDAyMAkvKiBkb24ndCBtb2RpZnkgaW5vZGUgYWNjZXNzCisJCQkJCQkgICB0aW1lcyBvbiByZWFkcyAqLworI2RlZmluZSBYRlNfTU9VTlRfUkVURVJSCTB4MDAwMDAwNDAgICAgICAvKiByZXR1cm4gYWxpZ25tZW50IGVycm9ycyB0bworCQkJCQkJICAgdXNlciAqLworI2RlZmluZSBYRlNfTU9VTlRfTk9BTElHTgkweDAwMDAwMDgwCS8qIHR1cm4gb2ZmIHN0cmlwZSBhbGlnbm1lbnQKKwkJCQkJCSAgIGFsbG9jYXRpb25zICovCisJCQkgICAgIC8qIDB4MDAwMDAxMDAJLS0gY3VycmVudGx5IHVudXNlZCAqLworCQkJICAgICAvKgkweDAwMDAwMjAwCS0tIGN1cnJlbnRseSB1bnVzZWQgKi8KKyNkZWZpbmUgWEZTX01PVU5UX05PUkVDT1ZFUlkJMHgwMDAwMDQwMAkvKiBubyByZWNvdmVyeSAtIGRpcnR5IGZzICovCisjZGVmaW5lIFhGU19NT1VOVF9TSEFSRUQJMHgwMDAwMDgwMAkvKiBzaGFyZWQgbW91bnQgKi8KKyNkZWZpbmUgWEZTX01PVU5UX0RGTFRfSU9TSVpFCTB4MDAwMDEwMDAJLyogc2V0IGRlZmF1bHQgaS9vIHNpemUgKi8KKyNkZWZpbmUgWEZTX01PVU5UX09TWU5DSVNPU1lOQwkweDAwMDAyMDAwCS8qIG9fc3luYyBpcyBSRUFMTFkgb19zeW5jICovCisJCQkJCQkvKiBvc3luY2lzZHN5bmMgaXMgbm93IGRlZmF1bHQqLworI2RlZmluZSBYRlNfTU9VTlRfMzJCSVRJTk9ERVMJMHgwMDAwNDAwMAkvKiBkbyBub3QgY3JlYXRlIGlub2RlcyBhYm92ZQorCQkJCQkJICogMzIgYml0cyBpbiBzaXplICovCisjZGVmaW5lIFhGU19NT1VOVF8zMkJJVElOT09QVAkweDAwMDA4MDAwCS8qIHNhdmVkIG1vdW50IG9wdGlvbiBzdGF0ZSAqLworI2RlZmluZSBYRlNfTU9VTlRfTk9VVUlECTB4MDAwMTAwMDAJLyogaWdub3JlIHV1aWQgZHVyaW5nIG1vdW50ICovCisjZGVmaW5lIFhGU19NT1VOVF9OT0xPR0ZMVVNICTB4MDAwMjAwMDAKKyNkZWZpbmUgWEZTX01PVU5UX0lERUxFVEUJMHgwMDA0MDAwMAkvKiBkZWxldGUgZW1wdHkgaW5vZGUgY2x1c3RlcnMqLworI2RlZmluZSBYRlNfTU9VTlRfU1dBTExPQwkweDAwMDgwMDAwCS8qIHR1cm4gb24gc3RyaXBlIHdpZHRoCisJCQkJCQkgKiBhbGxvY2F0aW9uICovCisjZGVmaW5lIFhGU19NT1VOVF9JSEFTSFNJWkUJMHgwMDEwMDAwMAkvKiBpbm9kZSBoYXNoIHRhYmxlIHNpemUgKi8KKyNkZWZpbmUgWEZTX01PVU5UX0RJUlNZTkMJMHgwMDIwMDAwMAkvKiBzeW5jaHJvbm91cyBkaXJlY3Rvcnkgb3BzICovCisKKy8qCisgKiBEZWZhdWx0IG1pbmltdW0gcmVhZCBhbmQgd3JpdGUgc2l6ZXMuCisgKi8KKyNkZWZpbmUgWEZTX1JFQURJT19MT0dfTEFSR0UJMTYKKyNkZWZpbmUgWEZTX1dSSVRFSU9fTE9HX0xBUkdFCTE2CisKKy8qCisgKiBNYXggYW5kIG1pbiB2YWx1ZXMgZm9yIFVJTyBhbmQgbW91bnQtb3B0aW9uIGRlZmluZWQgSS9PIHNpemVzOworICogbWluIHZhbHVlIGNhbid0IGJlIGxlc3MgdGhhbiBhIHBhZ2UuICBDdXJyZW50bHkgdW51c2VkLgorICovCisjZGVmaW5lIFhGU19NQVhfSU9fTE9HCQkxNgkvKiA2NEsgKi8KKyNkZWZpbmUgWEZTX01JTl9JT19MT0cJCVBBR0VfU0hJRlQKKworLyoKKyAqIFN5bmNocm9ub3VzIHJlYWQgYW5kIHdyaXRlIHNpemVzLiAgVGhpcyBzaG91bGQgYmUKKyAqIGJldHRlciBmb3IgTkZTdjIgd3N5bmMgZmlsZXN5c3RlbXMuCisgKi8KKyNkZWZpbmUJWEZTX1dTWU5DX1JFQURJT19MT0cJMTUJLyogMzJLICovCisjZGVmaW5lCVhGU19XU1lOQ19XUklURUlPX0xPRwkxNAkvKiAxNksgKi8KKworI2RlZmluZSBYRlNfTUFYSU9GRlNFVChtcCkJKChtcCktPm1fbWF4aW9mZnNldCkKKworI2RlZmluZSBYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKQkoKG1wKS0+bV9mbGFncyAmIFhGU19NT1VOVF9GU19TSFVURE9XTikKKyNkZWZpbmUgeGZzX2ZvcmNlX3NodXRkb3duKG0sZikJXAorCVZGU19GT1JDRV9TSFVURE9XTigoWEZTX01UT1ZGUyhtKSksIGYsIF9fRklMRV9fLCBfX0xJTkVfXykKKworLyoKKyAqIEZsYWdzIHNlbnQgdG8geGZzX2ZvcmNlX3NodXRkb3duLgorICovCisjZGVmaW5lIFhGU19NRVRBREFUQV9JT19FUlJPUgkweDEKKyNkZWZpbmUgWEZTX0xPR19JT19FUlJPUgkweDIKKyNkZWZpbmUgWEZTX0ZPUkNFX1VNT1VOVAkweDQKKyNkZWZpbmUgWEZTX0NPUlJVUFRfSU5DT1JFCTB4OAkvKiBDb3JydXB0IGluLW1lbW9yeSBkYXRhIHN0cnVjdHVyZXMgKi8KKyNkZWZpbmUgWEZTX1NIVVRET1dOX1JFTU9URV9SRVEgMHgxMAkvKiBTaHV0ZG93biBjYW1lIGZyb20gcmVtb3RlIGNlbGwgKi8KKworLyoKKyAqIHhmbGFncyBmb3IgeGZzX3N5bmNzdWIKKyAqLworI2RlZmluZSBYRlNfWFNZTkNfUkVMT0MJCTB4MDEKKworLyoKKyAqIEZsYWdzIGZvciB4ZnNfbW91bnRmcworICovCisjZGVmaW5lIFhGU19NRlNJX1NFQ09ORAkJMHgwMQkvKiBTZWNvbmRhcnkgbW91bnQgLS0gc2tpcCBzdHVmZiAqLworI2RlZmluZSBYRlNfTUZTSV9DTElFTlQJCTB4MDIJLyogSXMgYSBjbGllbnQgLS0gc2tpcCBsb3RzIG9mIHN0dWZmICovCisjZGVmaW5lIFhGU19NRlNJX05PVU5MSU5LCTB4MDgJLyogU2tpcCB1bmxpbmtlZCBpbm9kZSBwcm9jZXNzaW5nIGluICovCisJCQkJCS8qIGxvZyByZWNvdmVyeSAqLworI2RlZmluZSBYRlNfTUZTSV9OT19RVU9UQUNIRUNLCTB4MTAJLyogU2tpcCBxdW90YWNoZWNrIHByb2Nlc3NpbmcgKi8KKworLyoKKyAqIE1hY3JvcyBmb3IgZ2V0dGluZyBmcm9tIG1vdW50IHRvIHZmcyBhbmQgYmFjay4KKyAqLworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfTVRPVkZTKQorc3RydWN0IHZmcyAqeGZzX210b3Zmcyh4ZnNfbW91bnRfdCAqbXApOworI2RlZmluZQlYRlNfTVRPVkZTKG1wKQkJeGZzX210b3ZmcyhtcCkKKyNlbHNlCisjZGVmaW5lCVhGU19NVE9WRlMobXApCQkoYmh2dG92ZnMoJihtcCktPm1fYmh2KSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQkhWVE9NKQoreGZzX21vdW50X3QgKnhmc19iaHZ0b20oYmh2X2Rlc2NfdCAqYmRwKTsKKyNkZWZpbmUJWEZTX0JIVlRPTShiZHApCXhmc19iaHZ0b20oYmRwKQorI2Vsc2UKKyNkZWZpbmUgWEZTX0JIVlRPTShiZHApCQkoKHhmc19tb3VudF90ICopQkhWX1BEQVRBKGJkcCkpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX1ZGU1RPTSkKK3hmc19tb3VudF90ICp4ZnNfdmZzdG9tKHZmc190ICp2ZnMpOworI2RlZmluZSBYRlNfVkZTVE9NKHZmcykgeGZzX3Zmc3RvbSh2ZnMpCisjZWxzZQorI2RlZmluZSBYRlNfVkZTVE9NKHZmcykJCVwKKwkoWEZTX0JIVlRPTShiaHZfbG9va3VwKFZGU19CSFZIRUFEKHZmcyksICZ4ZnNfdmZzb3BzKSkpCisjZW5kaWYKKworCisvKgorICogTW92ZWQgaGVyZSBmcm9tIHhmc19hZy5oIHRvIGF2b2lkIHJlb3JkZXJpbmcgaGVhZGVyIGZpbGVzCisgKi8KKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfREFERFJfVE9fQUdOTykKK3hmc19hZ251bWJlcl90IHhmc19kYWRkcl90b19hZ25vKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZGFkZHJfdCBkKTsKKyNkZWZpbmUgWEZTX0RBRERSX1RPX0FHTk8obXAsZCkgICAgICAgICB4ZnNfZGFkZHJfdG9fYWdubyhtcCxkKQorI2Vsc2UKKworc3RhdGljIGlubGluZSB4ZnNfYWdudW1iZXJfdCBYRlNfREFERFJfVE9fQUdOTyh4ZnNfbW91bnRfdCAqbXAsIHhmc19kYWRkcl90IGQpCit7CisJZCA9IFhGU19CQl9UT19GU0JUKG1wLCBkKTsKKwlkb19kaXYoZCwgbXAtPm1fc2Iuc2JfYWdibG9ja3MpOworCXJldHVybiAoeGZzX2FnbnVtYmVyX3QpIGQ7Cit9CisKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfREFERFJfVE9fQUdCTk8pCit4ZnNfYWdibG9ja190IHhmc19kYWRkcl90b19hZ2JubyhzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RhZGRyX3QgZCk7CisjZGVmaW5lIFhGU19EQUREUl9UT19BR0JOTyhtcCxkKSAgICAgICAgeGZzX2RhZGRyX3RvX2FnYm5vKG1wLGQpCisjZWxzZQorCitzdGF0aWMgaW5saW5lIHhmc19hZ2Jsb2NrX3QgWEZTX0RBRERSX1RPX0FHQk5PKHhmc19tb3VudF90ICptcCwgeGZzX2RhZGRyX3QgZCkKK3sKKwlkID0gWEZTX0JCX1RPX0ZTQlQobXAsIGQpOworCXJldHVybiAoeGZzX2FnYmxvY2tfdCkgZG9fZGl2KGQsIG1wLT5tX3NiLnNiX2FnYmxvY2tzKTsKK30KKworI2VuZGlmCisKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBpcyBmb3IgdXNlIGJ5IHRoZSB4ZnNfbW9kX2luY29yZV9zYl9iYXRjaCgpIHJvdXRpbmUuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19tb2Rfc2IgeworCXhmc19zYl9maWVsZF90CW1zYl9maWVsZDsJLyogRmllbGQgdG8gbW9kaWZ5LCBzZWUgYmVsb3cgKi8KKwlpbnQJCW1zYl9kZWx0YTsJLyogQ2hhbmdlIHRvIG1ha2UgdG8gc3BlY2lmaWVkIGZpZWxkICovCit9IHhmc19tb2Rfc2JfdDsKKworI2RlZmluZQlYRlNfTU9VTlRfSUxPQ0sobXApCW11dGV4X2xvY2soJigobXApLT5tX2lsb2NrKSwgUElOT0QpCisjZGVmaW5lCVhGU19NT1VOVF9JVU5MT0NLKG1wKQltdXRleF91bmxvY2soJigobXApLT5tX2lsb2NrKSkKKyNkZWZpbmUJWEZTX1NCX0xPQ0sobXApCQltdXRleF9zcGlubG9jaygmKG1wKS0+bV9zYl9sb2NrKQorI2RlZmluZQlYRlNfU0JfVU5MT0NLKG1wLHMpCW11dGV4X3NwaW51bmxvY2soJihtcCktPm1fc2JfbG9jaywocykpCisKK2V4dGVybiB4ZnNfbW91bnRfdCAqeGZzX21vdW50X2luaXQodm9pZCk7CitleHRlcm4gdm9pZAl4ZnNfbW9kX3NiKHhmc190cmFuc190ICosIF9faW50NjRfdCk7CitleHRlcm4gdm9pZAl4ZnNfbW91bnRfZnJlZSh4ZnNfbW91bnRfdCAqbXAsIGludCByZW1vdmVfYmh2KTsKK2V4dGVybiBpbnQJeGZzX21vdW50ZnMoc3RydWN0IHZmcyAqLCB4ZnNfbW91bnRfdCAqbXAsIGludCk7CisKK2V4dGVybiBpbnQJeGZzX3VubW91bnRmcyh4ZnNfbW91bnRfdCAqLCBzdHJ1Y3QgY3JlZCAqKTsKK2V4dGVybiB2b2lkCXhmc191bm1vdW50ZnNfd2FpdCh4ZnNfbW91bnRfdCAqKTsKK2V4dGVybiB2b2lkCXhmc191bm1vdW50ZnNfY2xvc2UoeGZzX21vdW50X3QgKiwgc3RydWN0IGNyZWQgKik7CitleHRlcm4gaW50CXhmc191bm1vdW50ZnNfd3JpdGVzYih4ZnNfbW91bnRfdCAqKTsKK2V4dGVybiBpbnQJeGZzX3VubW91bnRfZmx1c2goeGZzX21vdW50X3QgKiwgaW50KTsKK2V4dGVybiBpbnQJeGZzX21vZF9pbmNvcmVfc2IoeGZzX21vdW50X3QgKiwgeGZzX3NiX2ZpZWxkX3QsIGludCwgaW50KTsKK2V4dGVybiBpbnQJeGZzX21vZF9pbmNvcmVfc2JfYmF0Y2goeGZzX21vdW50X3QgKiwgeGZzX21vZF9zYl90ICosCisJCQl1aW50LCBpbnQpOworZXh0ZXJuIHN0cnVjdCB4ZnNfYnVmICp4ZnNfZ2V0c2IoeGZzX21vdW50X3QgKiwgaW50KTsKK2V4dGVybiBpbnQJeGZzX3JlYWRzYih4ZnNfbW91bnRfdCAqbXApOworZXh0ZXJuIHZvaWQJeGZzX2ZyZWVzYih4ZnNfbW91bnRfdCAqKTsKK2V4dGVybiB2b2lkCXhmc19kb19mb3JjZV9zaHV0ZG93bihiaHZfZGVzY190ICosIGludCwgY2hhciAqLCBpbnQpOworZXh0ZXJuIGludAl4ZnNfc3luY3N1Yih4ZnNfbW91bnRfdCAqLCBpbnQsIGludCwgaW50ICopOworZXh0ZXJuIHhmc19hZ251bWJlcl90CXhmc19pbml0aWFsaXplX3BlcmFnKHhmc19tb3VudF90ICosIHhmc19hZ251bWJlcl90KTsKK2V4dGVybiB2b2lkCXhmc194bGF0ZXNiKHZvaWQgKiwgc3RydWN0IHhmc19zYiAqLCBpbnQsIF9faW50NjRfdCk7CisKK2V4dGVybiBzdHJ1Y3QgdmZzb3BzIHhmc192ZnNvcHM7CitleHRlcm4gc3RydWN0IHZub2Rlb3BzIHhmc192bm9kZW9wczsKKworZXh0ZXJuIHN0cnVjdCB4ZnNfZG1vcHMgeGZzX2RtY29yZV9zdHViOworZXh0ZXJuIHN0cnVjdCB4ZnNfcW1vcHMgeGZzX3FtY29yZV9zdHViOworZXh0ZXJuIHN0cnVjdCB4ZnNfaW9vcHMgeGZzX2lvY29yZV94ZnM7CisKK2V4dGVybiBpbnQJeGZzX2luaXQodm9pZCk7CitleHRlcm4gdm9pZAl4ZnNfY2xlYW51cCh2b2lkKTsKKworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmCS8qIF9fWEZTX01PVU5UX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19xbW9wcy5jIGIvZnMveGZzL3hmc19xbW9wcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNDBjOTIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX3Ftb3BzLmMKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4JIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpbmNsdWRlICJ4ZnMuaCIKKworI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKworCitTVEFUSUMgc3RydWN0IHhmc19kcXVvdCAqCit4ZnNfZHF2b3BjaG93bl9kZWZhdWx0KAorCXN0cnVjdCB4ZnNfdHJhbnMJKnRwLAorCXN0cnVjdCB4ZnNfaW5vZGUJKmlwLAorCXN0cnVjdCB4ZnNfZHF1b3QJKipkcXAsCisJc3RydWN0IHhmc19kcXVvdAkqZHEpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKK3hmc19xbW9wc190CXhmc19xbWNvcmVfc3R1YiA9IHsKKwkueGZzX3FtaW5pdAkJPSAoeGZzX3FtaW5pdF90KSBmc19ub2VyciwKKwkueGZzX3FtZG9uZQkJPSAoeGZzX3FtZG9uZV90KSBmc19ub2VyciwKKwkueGZzX3FtbW91bnQJCT0gKHhmc19xbW1vdW50X3QpIGZzX25vZXJyLAorCS54ZnNfcW11bm1vdW50CQk9ICh4ZnNfcW11bm1vdW50X3QpIGZzX25vZXJyLAorCS54ZnNfZHFyZWxlCQk9ICh4ZnNfZHFyZWxlX3QpIGZzX25vZXJyLAorCS54ZnNfZHFhdHRhY2gJCT0gKHhmc19kcWF0dGFjaF90KSBmc19ub2VyciwKKwkueGZzX2RxZGV0YWNoCQk9ICh4ZnNfZHFkZXRhY2hfdCkgZnNfbm9lcnIsCisJLnhmc19kcXB1cmdlYWxsCQk9ICh4ZnNfZHFwdXJnZWFsbF90KSBmc19ub2VyciwKKwkueGZzX2Rxdm9wYWxsb2MJCT0gKHhmc19kcXZvcGFsbG9jX3QpIGZzX25vZXJyLAorCS54ZnNfZHF2b3BjcmVhdGUJPSAoeGZzX2Rxdm9wY3JlYXRlX3QpIGZzX25vZXJyLAorCS54ZnNfZHF2b3ByZW5hbWUJPSAoeGZzX2Rxdm9wcmVuYW1lX3QpIGZzX25vZXJyLAorCS54ZnNfZHF2b3BjaG93bgkJPSB4ZnNfZHF2b3BjaG93bl9kZWZhdWx0LAorCS54ZnNfZHF2b3BjaG93bnJlc3YJPSAoeGZzX2Rxdm9wY2hvd25yZXN2X3QpIGZzX25vZXJyLAorfTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfcXVvdGEuaCBiL2ZzL3hmcy94ZnNfcXVvdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDNlYzRlCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19xdW90YS5oCkBAIC0wLDAgKzEsMzU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19RVU9UQV9IX18KKyNkZWZpbmUgX19YRlNfUVVPVEFfSF9fCisKKy8qCisgKiBUaGUgb25kaXNrIGZvcm0gb2YgYSBkcXVvdCBzdHJ1Y3R1cmUuCisgKi8KKyNkZWZpbmUgWEZTX0RRVU9UX01BR0lDCQkweDQ0NTEJCS8qICdEUScgKi8KKyNkZWZpbmUgWEZTX0RRVU9UX1ZFUlNJT04JKHVfaW50OF90KTB4MDEJLyogbGF0ZXN0IHZlcnNpb24gbnVtYmVyICovCisKKy8qCisgKiB1aWRfdCBhbmQgZ2lkX3QgYXJlIGhhcmQtY29kZWQgdG8gMzIgYml0cyBpbiB0aGUgaW5vZGUuCisgKiBIZW5jZSwgYW4gJ2lkJyBpbiBhIGRxdW90IGlzIDMyIGJpdHMuLgorICovCit0eXBlZGVmIF9faW50MzJfdAl4ZnNfZHFpZF90OworCisvKgorICogRXZlbnRob3VnaCB1c2VycyBtYXkgbm90IGhhdmUgcXVvdGEgbGltaXRzIG9jY3VweWluZyBhbGwgNjQtYml0cywKKyAqIHRoZXkgbWF5IG5lZWQgNjQtYml0IGFjY291bnRpbmcuIEhlbmNlLCA2NC1iaXQgcXVvdGEtY291bnRlcnMsCisgKiBhbmQgcXVvdGEtbGltaXRzLiBUaGlzIGlzIGEgd2FzdGUgaW4gdGhlIGNvbW1vbiBjYXNlLCBidXQgaGV5IC4uLgorICovCit0eXBlZGVmIF9fdWludDY0X3QJeGZzX3FjbnRfdDsKK3R5cGVkZWYgX191aW50MTZfdAl4ZnNfcXdhcm5jbnRfdDsKKworLyoKKyAqIFRoaXMgaXMgdGhlIG1haW4gcG9ydGlvbiBvZiB0aGUgb24tZGlzayByZXByZXNlbnRhdGlvbiBvZiBxdW90YQorICogaW5mb3JtYXRpb24gZm9yIGEgdXNlci4gVGhpcyBpcyB0aGUgcV9jb3JlIG9mIHRoZSB4ZnNfZHF1b3RfdCB0aGF0CisgKiBpcyBrZXB0IGluIGtlcm5lbCBtZW1vcnkuIFdlIHBhZCB0aGlzIHdpdGggc29tZSBtb3JlIGV4cGFuc2lvbiByb29tCisgKiB0byBjb25zdHJ1Y3QgdGhlIG9uIGRpc2sgc3RydWN0dXJlLgorICovCit0eXBlZGVmIHN0cnVjdAl4ZnNfZGlza19kcXVvdCB7CisvKjE2Ki8JdV9pbnQxNl90CWRfbWFnaWM7CS8qIGRxdW90IG1hZ2ljID0gWEZTX0RRVU9UX01BR0lDICovCisvKjggKi8JdV9pbnQ4X3QJZF92ZXJzaW9uOwkvKiBkcXVvdCB2ZXJzaW9uICovCisvKjggKi8JdV9pbnQ4X3QJZF9mbGFnczsJLyogWEZTX0RRX1VTRVIvUFJPSi9HUk9VUCAqLworLyozMiovCXhmc19kcWlkX3QJZF9pZDsJCS8qIHVzZXIscHJvamVjdCxncm91cCBpZCAqLworLyo2NCovCXhmc19xY250X3QJZF9ibGtfaGFyZGxpbWl0Oy8qIGFic29sdXRlIGxpbWl0IG9uIGRpc2sgYmxrcyAqLworLyo2NCovCXhmc19xY250X3QJZF9ibGtfc29mdGxpbWl0Oy8qIHByZWZlcnJlZCBsaW1pdCBvbiBkaXNrIGJsa3MgKi8KKy8qNjQqLwl4ZnNfcWNudF90CWRfaW5vX2hhcmRsaW1pdDsvKiBtYXhpbXVtICMgYWxsb2NhdGVkIGlub2RlcyAqLworLyo2NCovCXhmc19xY250X3QJZF9pbm9fc29mdGxpbWl0Oy8qIHByZWZlcnJlZCBpbm9kZSBsaW1pdCAqLworLyo2NCovCXhmc19xY250X3QJZF9iY291bnQ7CS8qIGRpc2sgYmxvY2tzIG93bmVkIGJ5IHRoZSB1c2VyICovCisvKjY0Ki8JeGZzX3FjbnRfdAlkX2ljb3VudDsJLyogaW5vZGVzIG93bmVkIGJ5IHRoZSB1c2VyICovCisvKjMyKi8JX19pbnQzMl90CWRfaXRpbWVyOwkvKiB6ZXJvIGlmIHdpdGhpbiBpbm9kZSBsaW1pdHMgaWYgbm90LAorCQkJCQkgICB0aGlzIGlzIHdoZW4gd2UgcmVmdXNlIHNlcnZpY2UgKi8KKy8qMzIqLwlfX2ludDMyX3QJZF9idGltZXI7CS8qIHNpbWlsYXIgdG8gYWJvdmU7IGZvciBkaXNrIGJsb2NrcyAqLworLyoxNiovCXhmc19xd2FybmNudF90CWRfaXdhcm5zOwkvKiB3YXJuaW5ncyBpc3N1ZWQgd3J0IG51bSBpbm9kZXMgKi8KKy8qMTYqLwl4ZnNfcXdhcm5jbnRfdAlkX2J3YXJuczsJLyogd2FybmluZ3MgaXNzdWVkIHdydCBkaXNrIGJsb2NrcyAqLworLyozMiovCV9faW50MzJfdAlkX3BhZDA7CQkvKiA2NCBiaXQgYWxpZ24gKi8KKy8qNjQqLwl4ZnNfcWNudF90CWRfcnRiX2hhcmRsaW1pdDsvKiBhYnNvbHV0ZSBsaW1pdCBvbiByZWFsdGltZSBibGtzICovCisvKjY0Ki8JeGZzX3FjbnRfdAlkX3J0Yl9zb2Z0bGltaXQ7LyogcHJlZmVycmVkIGxpbWl0IG9uIFJUIGRpc2sgYmxrcyAqLworLyo2NCovCXhmc19xY250X3QJZF9ydGJjb3VudDsJLyogcmVhbHRpbWUgYmxvY2tzIG93bmVkICovCisvKjMyKi8JX19pbnQzMl90CWRfcnRidGltZXI7CS8qIHNpbWlsYXIgdG8gYWJvdmU7IGZvciBSVCBkaXNrIGJsb2NrcyAqLworLyoxNiovCXhmc19xd2FybmNudF90CWRfcnRid2FybnM7CS8qIHdhcm5pbmdzIGlzc3VlZCB3cnQgUlQgZGlzayBibG9ja3MgKi8KKy8qMTYqLwlfX3VpbnQxNl90CWRfcGFkOworfSB4ZnNfZGlza19kcXVvdF90OworCisvKgorICogVGhpcyBpcyB3aGF0IGdvZXMgb24gZGlzay4gVGhpcyBpcyBzZXBhcmF0ZWQgZnJvbSB0aGUgeGZzX2Rpc2tfZHF1b3QgYmVjYXVzZQorICogY2FycnlpbmcgdGhlIHVubmVjZXNzYXJ5IHBhZGRpbmcgd291bGQgYmUgYSB3YXN0ZSBvZiBtZW1vcnkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19kcWJsayB7CisJeGZzX2Rpc2tfZHF1b3RfdCAgZGRfZGlza2RxOwkvKiBwb3J0aW9uIHRoYXQgbGl2ZXMgaW5jb3JlIGFzIHdlbGwgKi8KKwljaGFyCQkgIGRkX2ZpbGxbMzJdOwkvKiBmaWxsaW5nIGZvciBwb3N0ZXJpdHkgKi8KK30geGZzX2RxYmxrX3Q7CisKKy8qCisgKiBmbGFncyBmb3IgcV9mbGFncyBmaWVsZCBpbiB0aGUgZHF1b3QuCisgKi8KKyNkZWZpbmUgWEZTX0RRX1VTRVIJCTB4MDAwMQkJLyogYSB1c2VyIHF1b3RhICovCisvKiAjZGVmaW5lIFhGU19EUV9QUk9KCQkweDAwMDIJCS0tIHByb2plY3QgcXVvdGEgKElSSVgpICovCisjZGVmaW5lIFhGU19EUV9HUk9VUAkJMHgwMDA0CQkvKiBhIGdyb3VwIHF1b3RhICovCisjZGVmaW5lIFhGU19EUV9GTE9DS0VECQkweDAwMDgJCS8qIGZsdXNoIGxvY2sgdGFrZW4gKi8KKyNkZWZpbmUgWEZTX0RRX0RJUlRZCQkweDAwMTAJCS8qIGRxdW90IGlzIGRpcnR5ICovCisjZGVmaW5lIFhGU19EUV9XQU5UCQkweDAwMjAJCS8qIGZvciBsb29rdXAvcmVjbGFpbSByYWNlICovCisjZGVmaW5lIFhGU19EUV9JTkFDVElWRQkJMHgwMDQwCQkvKiBkcSBvZmYgbXBsaXN0ICYgaGFzaGxpc3QgKi8KKyNkZWZpbmUgWEZTX0RRX01BUktFUgkJMHgwMDgwCQkvKiBzZW50aW5lbCAqLworCisvKgorICogSW4gdGhlIHdvcnN0IGNhc2UsIHdoZW4gYm90aCB1c2VyIGFuZCBncm91cCBxdW90YXMgYXJlIG9uLAorICogd2UgY2FuIGhhdmUgYSBtYXggb2YgdGhyZWUgZHF1b3RzIGNoYW5naW5nIGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uLgorICovCisjZGVmaW5lIFhGU19EUVVPVF9MT0dSRVMobXApCShzaXplb2YoeGZzX2Rpc2tfZHF1b3RfdCkgKiAzKQorCisKKy8qCisgKiBUaGVzZSBhcmUgdGhlIHN0cnVjdHVyZXMgdXNlZCB0byBsYXkgb3V0IGRxdW90cyBhbmQgcXVvdGFvZmYKKyAqIHJlY29yZHMgb24gdGhlIGxvZy4gUXVpdGUgc2ltaWxhciB0byB0aG9zZSBvZiBpbm9kZXMuCisgKi8KKworLyoKKyAqIGxvZyBmb3JtYXQgc3RydWN0IGZvciBkcXVvdHMuCisgKiBUaGUgZmlyc3QgdHdvIGZpZWxkcyBtdXN0IGJlIHRoZSB0eXBlIGFuZCBzaXplIGZpdHRpbmcgaW50bworICogMzIgYml0cyA6IGxvZ19yZWNvdmVyeSBjb2RlIGFzc3VtZXMgdGhhdC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RxX2xvZ2Zvcm1hdCB7CisJX191aW50MTZfdAkJcWxmX3R5cGU7ICAgICAgLyogZHF1b3QgbG9nIGl0ZW0gdHlwZSAqLworCV9fdWludDE2X3QJCXFsZl9zaXplOyAgICAgIC8qIHNpemUgb2YgdGhpcyBpdGVtICovCisJeGZzX2RxaWRfdAkJcWxmX2lkOwkgICAgICAgLyogdXNyL2dycCBpZCBudW1iZXIgOiAzMiBiaXRzICovCisJX19pbnQ2NF90CQlxbGZfYmxrbm87ICAgICAvKiBibGtubyBvZiBkcXVvdCBidWZmZXIgKi8KKwlfX2ludDMyX3QJCXFsZl9sZW47ICAgICAgIC8qIGxlbiBvZiBkcXVvdCBidWZmZXIgKi8KKwlfX3VpbnQzMl90CQlxbGZfYm9mZnNldDsgICAvKiBvZmYgb2YgZHF1b3QgaW4gYnVmZmVyICovCit9IHhmc19kcV9sb2dmb3JtYXRfdDsKKworLyoKKyAqIGxvZyBmb3JtYXQgc3RydWN0IGZvciBRVU9UQU9GRiByZWNvcmRzLgorICogVGhlIGZpcnN0IHR3byBmaWVsZHMgbXVzdCBiZSB0aGUgdHlwZSBhbmQgc2l6ZSBmaXR0aW5nIGludG8KKyAqIDMyIGJpdHMgOiBsb2dfcmVjb3ZlcnkgY29kZSBhc3N1bWVzIHRoYXQuCisgKiBXZSB3cml0ZSB0d28gTElfUVVPVEFPRkYgbG9naXRlbXMgcGVyIHF1b3Rhb2ZmLCB0aGUgbGFzdCBvbmUga2VlcHMgYSBwb2ludGVyCisgKiB0byB0aGUgZmlyc3QgYW5kIGVuc3VyZXMgdGhhdCB0aGUgZmlyc3QgbG9naXRlbSBpcyB0YWtlbiBvdXQgb2YgdGhlIEFJTAorICogb25seSB3aGVuIHRoZSBsYXN0IG9uZSBpcyBzZWN1cmVseSBjb21taXR0ZWQuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc19xb2ZmX2xvZ2Zvcm1hdCB7CisJdW5zaWduZWQgc2hvcnQJCXFmX3R5cGU7CS8qIHF1b3Rhb2ZmIGxvZyBpdGVtIHR5cGUgKi8KKwl1bnNpZ25lZCBzaG9ydAkJcWZfc2l6ZTsJLyogc2l6ZSBvZiB0aGlzIGl0ZW0gKi8KKwl1bnNpZ25lZCBpbnQJCXFmX2ZsYWdzOwkvKiBVU1IgYW5kL29yIEdSUCAqLworCWNoYXIJCQlxZl9wYWRbMTJdOwkvKiBwYWRkaW5nIGZvciBmdXR1cmUgKi8KK30geGZzX3FvZmZfbG9nZm9ybWF0X3Q7CisKKworLyoKKyAqIERpc2sgcXVvdGFzIHN0YXR1cyBpbiBtX3FmbGFncywgYW5kIGFsc28gc2JfcWZsYWdzLiAxNiBiaXRzLgorICovCisjZGVmaW5lIFhGU19VUVVPVEFfQUNDVAkweDAwMDEgIC8qIHVzZXIgcXVvdGEgYWNjb3VudGluZyBPTiAqLworI2RlZmluZSBYRlNfVVFVT1RBX0VORkQJMHgwMDAyICAvKiB1c2VyIHF1b3RhIGxpbWl0cyBlbmZvcmNlZCAqLworI2RlZmluZSBYRlNfVVFVT1RBX0NIS0QJMHgwMDA0ICAvKiBxdW90YWNoZWNrIHJ1biBvbiB1c3IgcXVvdGFzICovCisjZGVmaW5lIFhGU19QUVVPVEFfQUNDVAkweDAwMDggIC8qIChJUklYKSBwcm9qZWN0IHF1b3RhIGFjY291bnRpbmcgT04gKi8KKyNkZWZpbmUgWEZTX0dRVU9UQV9FTkZECTB4MDAxMCAgLyogZ3JvdXAgcXVvdGEgbGltaXRzIGVuZm9yY2VkICovCisjZGVmaW5lIFhGU19HUVVPVEFfQ0hLRAkweDAwMjAgIC8qIHF1b3RhY2hlY2sgcnVuIG9uIGdycCBxdW90YXMgKi8KKyNkZWZpbmUgWEZTX0dRVU9UQV9BQ0NUCTB4MDA0MCAgLyogZ3JvdXAgcXVvdGEgYWNjb3VudGluZyBPTiAqLworCisvKgorICogSW5jb3JlIG9ubHkgZmxhZ3MgZm9yIHF1b3Rhb2ZmIC0gdGhlc2UgYml0cyBnZXQgY2xlYXJlZCB3aGVuIHF1b3RhKHMpCisgKiBhcmUgaW4gdGhlIHByb2Nlc3Mgb2YgZ2V0dGluZyB0dXJuZWQgb2ZmLiBUaGVzZSBmbGFncyBhcmUgaW4gbV9xZmxhZ3MgYnV0CisgKiBuZXZlciBpbiBzYl9xZmxhZ3MuCisgKi8KKyNkZWZpbmUgWEZTX1VRVU9UQV9BQ1RJVkUJMHgwMDgwICAvKiB1cXVvdGFzIGFyZSBiZWluZyB0dXJuZWQgb2ZmICovCisjZGVmaW5lIFhGU19HUVVPVEFfQUNUSVZFCTB4MDEwMCAgLyogZ3F1b3RhcyBhcmUgYmVpbmcgdHVybmVkIG9mZiAqLworCisvKgorICogQ2hlY2tpbmcgWEZTX0lTXypRVU9UQV9PTigpIHdoaWxlIGhvbGRpbmcgYW55IGlub2RlIGxvY2sgZ3VhcmFudGVlcworICogcXVvdGEgd2lsbCBiZSBub3QgYmUgc3dpdGNoZWQgb2ZmIGFzIGxvbmcgYXMgdGhhdCBpbm9kZSBsb2NrIGlzIGhlbGQuCisgKi8KKyNkZWZpbmUgWEZTX0lTX1FVT1RBX09OKG1wKQkoKG1wKS0+bV9xZmxhZ3MgJiAoWEZTX1VRVU9UQV9BQ1RJVkUgfCBcCisJCQkJCQkgICBYRlNfR1FVT1RBX0FDVElWRSkpCisjZGVmaW5lIFhGU19JU19VUVVPVEFfT04obXApCSgobXApLT5tX3FmbGFncyAmIFhGU19VUVVPVEFfQUNUSVZFKQorI2RlZmluZSBYRlNfSVNfR1FVT1RBX09OKG1wKQkoKG1wKS0+bV9xZmxhZ3MgJiBYRlNfR1FVT1RBX0FDVElWRSkKKworLyoKKyAqIEZsYWdzIHRvIHRlbGwgdmFyaW91cyBmdW5jdGlvbnMgd2hhdCB0byBkby4gTm90IGFsbCBvZiB0aGVzZSBhcmUgbWVhbmluZ2Z1bAorICogdG8gYSBzaW5nbGUgZnVuY3Rpb24uIE5vbmUgb2YgdGhlc2UgWEZTX1FNT1BUXyogZmxhZ3MgYXJlIG1lYW50IHRvIGhhdmUKKyAqIHBlcnNpc3RlbnQgdmFsdWVzIChpZS4gdGhlaXIgdmFsdWVzIGNhbiBhbmQgd2lsbCBjaGFuZ2UgYmV0d2VlbiB2ZXJzaW9ucykKKyAqLworI2RlZmluZSBYRlNfUU1PUFRfRFFMT0NLCTB4MDAwMDAwMSAvKiBkcWxvY2sgKi8KKyNkZWZpbmUgWEZTX1FNT1BUX0RRQUxMT0MJMHgwMDAwMDAyIC8qIGFsbG9jIGRxdW90IG9uZGlzayBpZiBuZWVkZWQgKi8KKyNkZWZpbmUgWEZTX1FNT1BUX1VRVU9UQQkweDAwMDAwMDQgLyogdXNlciBkcXVvdCByZXF1ZXN0ZWQgKi8KKyNkZWZpbmUgWEZTX1FNT1BUX0dRVU9UQQkweDAwMDAwMDggLyogZ3JvdXAgZHF1b3QgcmVxdWVzdGVkICovCisjZGVmaW5lIFhGU19RTU9QVF9GT1JDRV9SRVMJMHgwMDAwMDEwIC8qIGlnbm9yZSBxdW90YSBsaW1pdHMgKi8KKyNkZWZpbmUgWEZTX1FNT1BUX0RRU1VTRVIJMHgwMDAwMDIwIC8qIGRvbid0IGNhY2hlIHN1cGVyIHVzZXJzIGRxdW90ICovCisjZGVmaW5lIFhGU19RTU9QVF9TQlZFUlNJT04JMHgwMDAwMDQwIC8qIGNoYW5nZSBzdXBlcmJsb2NrIHZlcnNpb24gbnVtICovCisjZGVmaW5lIFhGU19RTU9QVF9RVU9UQU9GRgkweDAwMDAwODAgLyogcXVvdGFzIGFyZSBiZWluZyB0dXJuZWQgb2ZmICovCisjZGVmaW5lIFhGU19RTU9QVF9VTU9VTlRJTkcJMHgwMDAwMTAwIC8qIGZpbGVzeXMgaXMgYmVpbmcgdW5tb3VudGVkICovCisjZGVmaW5lIFhGU19RTU9QVF9ET0xPRwkJMHgwMDAwMjAwIC8qIGxvZyBidWYgY2hhbmdlcyAoaW4gcXVvdGFjaGVjaykgKi8KKyNkZWZpbmUgWEZTX1FNT1BUX0RPV0FSTiAgICAgICAgMHgwMDAwNDAwIC8qIGluY3JlYXNlIHdhcm5pbmcgY250IGlmIG5lY2Vzc2FyeSAqLworI2RlZmluZSBYRlNfUU1PUFRfSUxPQ0tFRAkweDAwMDA4MDAgLyogaW5vZGUgaXMgYWxyZWFkeSBsb2NrZWQgKGV4Y2wpICovCisjZGVmaW5lIFhGU19RTU9QVF9EUVJFUEFJUgkweDAwMDEwMDAgLyogcmVwYWlyIGRxdW90LCBpZiBkYW1hZ2VkLiAqLworCisvKgorICogZmxhZ3MgdG8geGZzX3RyYW5zX21vZF9kcXVvdCB0byBpbmRpY2F0ZSB3aGljaCBmaWVsZCBuZWVkcyB0byBiZQorICogbW9kaWZpZWQuCisgKi8KKyNkZWZpbmUgWEZTX1FNT1BUX1JFU19SRUdCTEtTCTB4MDAxMDAwMAorI2RlZmluZSBYRlNfUU1PUFRfUkVTX1JUQkxLUwkweDAwMjAwMDAKKyNkZWZpbmUgWEZTX1FNT1BUX0JDT1VOVAkweDAwNDAwMDAKKyNkZWZpbmUgWEZTX1FNT1BUX0lDT1VOVAkweDAwODAwMDAKKyNkZWZpbmUgWEZTX1FNT1BUX1JUQkNPVU5UCTB4MDEwMDAwMAorI2RlZmluZSBYRlNfUU1PUFRfREVMQkNPVU5UCTB4MDIwMDAwMAorI2RlZmluZSBYRlNfUU1PUFRfREVMUlRCQ09VTlQJMHgwNDAwMDAwCisjZGVmaW5lIFhGU19RTU9QVF9SRVNfSU5PUwkweDA4MDAwMDAKKworLyoKKyAqIGZsYWdzIGZvciBkcWZsdXNoIGFuZCBkcWZsdXNoX2FsbC4KKyAqLworI2RlZmluZSBYRlNfUU1PUFRfU1lOQwkJMHgxMDAwMDAwCisjZGVmaW5lIFhGU19RTU9QVF9BU1lOQwkJMHgyMDAwMDAwCisjZGVmaW5lIFhGU19RTU9QVF9ERUxXUkkJMHg0MDAwMDAwCisKKy8qCisgKiBmbGFncyBmb3IgZHFhbGxvYy4KKyAqLworI2RlZmluZSBYRlNfUU1PUFRfSU5IRVJJVAkweDgwMDAwMDAKKworLyoKKyAqIGZsYWdzIHRvIHhmc190cmFuc19tb2RfZHF1b3QuCisgKi8KKyNkZWZpbmUgWEZTX1RSQU5TX0RRX1JFU19CTEtTCVhGU19RTU9QVF9SRVNfUkVHQkxLUworI2RlZmluZSBYRlNfVFJBTlNfRFFfUkVTX1JUQkxLUwlYRlNfUU1PUFRfUkVTX1JUQkxLUworI2RlZmluZSBYRlNfVFJBTlNfRFFfUkVTX0lOT1MJWEZTX1FNT1BUX1JFU19JTk9TCisjZGVmaW5lIFhGU19UUkFOU19EUV9CQ09VTlQJWEZTX1FNT1BUX0JDT1VOVAorI2RlZmluZSBYRlNfVFJBTlNfRFFfREVMQkNPVU5UCVhGU19RTU9QVF9ERUxCQ09VTlQKKyNkZWZpbmUgWEZTX1RSQU5TX0RRX0lDT1VOVAlYRlNfUU1PUFRfSUNPVU5UCisjZGVmaW5lIFhGU19UUkFOU19EUV9SVEJDT1VOVAlYRlNfUU1PUFRfUlRCQ09VTlQKKyNkZWZpbmUgWEZTX1RSQU5TX0RRX0RFTFJUQkNPVU5UIFhGU19RTU9QVF9ERUxSVEJDT1VOVAorCisKKyNkZWZpbmUgWEZTX1FNT1BUX1FVT1RBTEwJKFhGU19RTU9QVF9VUVVPVEF8WEZTX1FNT1BUX0dRVU9UQSkKKyNkZWZpbmUgWEZTX1FNT1BUX1JFU0JMS19NQVNLCShYRlNfUU1PUFRfUkVTX1JFR0JMS1MgfCBYRlNfUU1PUFRfUkVTX1JUQkxLUykKKworI2lmZGVmIF9fS0VSTkVMX18KKy8qCisgKiBUaGlzIGNoZWNrIGlzIGRvbmUgdHlwaWNhbGx5IHdpdGhvdXQgaG9sZGluZyB0aGUgaW5vZGUgbG9jazsKKyAqIHRoYXQgbWF5IHNlZW0gcmFjZXksIGJ1dCBpdCBpcyBoYXJtbGVzcyBpbiB0aGUgY29udGV4dCB0aGF0IGl0IGlzIHVzZWQuCisgKiBUaGUgaW5vZGUgY2Fubm90IGdvIGluYWN0aXZlIGFzIGxvbmcgYSByZWZlcmVuY2UgaXMga2VwdCwgYW5kCisgKiB0aGVyZWZvcmUgaWYgZHF1b3Qocykgd2VyZSBhdHRhY2hlZCwgdGhleSdsbCBzdGF5IGNvbnNpc3RlbnQuCisgKiBJZiwgZm9yIGV4YW1wbGUsIHRoZSBvd25lcnNoaXAgb2YgdGhlIGlub2RlIGNoYW5nZXMgd2hpbGUKKyAqIHdlIGRpZG4ndCBoYXZlIHRoZSBpbm9kZSBsb2NrZWQsIHRoZSBhcHByb3ByaWF0ZSBkcXVvdChzKSB3aWxsIGJlCisgKiBhdHRhY2hlZCBhdG9taWNhbGx5LgorICovCisjZGVmaW5lIFhGU19OT1RfRFFBVFRBQ0hFRChtcCwgaXApICgoWEZTX0lTX1VRVU9UQV9PTihtcCkgJiZcCisJCQkJICAgICAoaXApLT5pX3VkcXVvdCA9PSBOVUxMKSB8fCBcCisJCQkJICAgIChYRlNfSVNfR1FVT1RBX09OKG1wKSAmJiBcCisJCQkJICAgICAoaXApLT5pX2dkcXVvdCA9PSBOVUxMKSkKKworI2RlZmluZSBYRlNfUU1fTkVFRF9RVU9UQUNIRUNLKG1wKSAoKFhGU19JU19VUVVPVEFfT04obXApICYmIFwKKwkJCQkgICAgIChtcC0+bV9zYi5zYl9xZmxhZ3MgJiBcCisJCQkJICAgICAgWEZTX1VRVU9UQV9DSEtEKSA9PSAwKSB8fCBcCisJCQkJICAgIChYRlNfSVNfR1FVT1RBX09OKG1wKSAmJiBcCisJCQkJICAgICAobXAtPm1fc2Iuc2JfcWZsYWdzICYgXAorCQkJCSAgICAgIFhGU19HUVVPVEFfQ0hLRCkgPT0gMCkpCisKKyNkZWZpbmUgWEZTX01PVU5UX1FVT1RBX0FMTAkoWEZTX1VRVU9UQV9BQ0NUfFhGU19VUVVPVEFfRU5GRHxcCisJCQkJIFhGU19VUVVPVEFfQ0hLRHxYRlNfR1FVT1RBX0FDQ1R8XAorCQkJCSBYRlNfR1FVT1RBX0VORkR8WEZTX0dRVU9UQV9DSEtEKQorI2RlZmluZSBYRlNfTU9VTlRfUVVPVEFfTUFTSwkoWEZTX01PVU5UX1FVT1RBX0FMTCB8IFhGU19VUVVPVEFfQUNUSVZFIHwgXAorCQkJCSBYRlNfR1FVT1RBX0FDVElWRSkKKworCisvKgorICogVGhlIHN0cnVjdHVyZSBrZXB0IGluc2lkZSB0aGUgeGZzX3RyYW5zX3Qga2VlcCB0cmFjayBvZiBkcXVvdCBjaGFuZ2VzCisgKiB3aXRoaW4gYSB0cmFuc2FjdGlvbiBhbmQgYXBwbHkgdGhlbSBsYXRlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RxdHJ4IHsKKwlzdHJ1Y3QgeGZzX2RxdW90ICpxdF9kcXVvdDsJICAvKiB0aGUgZHF1b3QgdGhpcyByZWZlcnMgdG8gKi8KKwl1bG9uZwkJcXRfYmxrX3JlczsJICAvKiBibGtzIHJlc2VydmVkIG9uIGEgZHF1b3QgKi8KKwl1bG9uZwkJcXRfYmxrX3Jlc191c2VkOyAgLyogYmxrcyB1c2VkIGZyb20gdGhlIHJlc2VydmF0aW9uICovCisJdWxvbmcJCXF0X2lub19yZXM7CSAgLyogaW5vZGUgcmVzZXJ2ZWQgb24gYSBkcXVvdCAqLworCXVsb25nCQlxdF9pbm9fcmVzX3VzZWQ7ICAvKiBpbm9kZXMgdXNlZCBmcm9tIHRoZSByZXNlcnZhdGlvbiAqLworCWxvbmcJCXF0X2Jjb3VudF9kZWx0YTsgIC8qIGRxdW90IGJsayBjb3VudCBjaGFuZ2VzICovCisJbG9uZwkJcXRfZGVsYmNudF9kZWx0YTsgLyogZGVsYXllZCBkcXVvdCBibGsgY291bnQgY2hhbmdlcyAqLworCWxvbmcJCXF0X2ljb3VudF9kZWx0YTsgIC8qIGRxdW90IGlub2RlIGNvdW50IGNoYW5nZXMgKi8KKwl1bG9uZwkJcXRfcnRibGtfcmVzOwkgIC8qICMgYmxrcyByZXNlcnZlZCBvbiBhIGRxdW90ICovCisJdWxvbmcJCXF0X3J0YmxrX3Jlc191c2VkOy8qICMgYmxrcyB1c2VkIGZyb20gcmVzZXJ2YXRpb24gKi8KKwlsb25nCQlxdF9ydGJjb3VudF9kZWx0YTsvKiBkcXVvdCByZWFsdGltZSBibGsgY2hhbmdlcyAqLworCWxvbmcJCXF0X2RlbHJ0Yl9kZWx0YTsgIC8qIGRlbGF5ZWQgUlQgYmxrIGNvdW50IGNoYW5nZXMgKi8KK30geGZzX2RxdHJ4X3Q7CisKKy8qCisgKiBEcXVvdCB0cmFuc2FjdGlvbiBmdW5jdGlvbnMsIHVzZWQgaWYgcXVvdGEgaXMgZW5hYmxlZC4KKyAqLwordHlwZWRlZiB2b2lkCSgqcW9fZHVwX2RxaW5mb190KShzdHJ1Y3QgeGZzX3RyYW5zICosIHN0cnVjdCB4ZnNfdHJhbnMgKik7Cit0eXBlZGVmIHZvaWQJKCpxb19tb2RfZHF1b3RfYnlpbm9fdCkoc3RydWN0IHhmc190cmFucyAqLAorCQkJCXN0cnVjdCB4ZnNfaW5vZGUgKiwgdWludCwgbG9uZyk7Cit0eXBlZGVmIHZvaWQJKCpxb19mcmVlX2RxaW5mb190KShzdHJ1Y3QgeGZzX3RyYW5zICopOwordHlwZWRlZiB2b2lkCSgqcW9fYXBwbHlfZHF1b3RfZGVsdGFzX3QpKHN0cnVjdCB4ZnNfdHJhbnMgKik7Cit0eXBlZGVmIHZvaWQJKCpxb191bnJlc2VydmVfYW5kX21vZF9kcXVvdHNfdCkoc3RydWN0IHhmc190cmFucyAqKTsKK3R5cGVkZWYgaW50CSgqcW9fcmVzZXJ2ZV9xdW90YV9uYmxrc190KSgKKwkJCQlzdHJ1Y3QgeGZzX3RyYW5zICosIHN0cnVjdCB4ZnNfbW91bnQgKiwKKwkJCQlzdHJ1Y3QgeGZzX2lub2RlICosIGxvbmcsIGxvbmcsIHVpbnQpOwordHlwZWRlZiBpbnQJKCpxb19yZXNlcnZlX3F1b3RhX2J5ZHF1b3RzX3QpKAorCQkJCXN0cnVjdCB4ZnNfdHJhbnMgKiwgc3RydWN0IHhmc19tb3VudCAqLAorCQkJCXN0cnVjdCB4ZnNfZHF1b3QgKiwgc3RydWN0IHhmc19kcXVvdCAqLAorCQkJCWxvbmcsIGxvbmcsIHVpbnQpOwordHlwZWRlZiBzdHJ1Y3QgeGZzX2RxdHJ4b3BzIHsKKwlxb19kdXBfZHFpbmZvX3QJCQlxb19kdXBfZHFpbmZvOworCXFvX2ZyZWVfZHFpbmZvX3QJCXFvX2ZyZWVfZHFpbmZvOworCXFvX21vZF9kcXVvdF9ieWlub190CQlxb19tb2RfZHF1b3RfYnlpbm87CisJcW9fYXBwbHlfZHF1b3RfZGVsdGFzX3QJCXFvX2FwcGx5X2RxdW90X2RlbHRhczsKKwlxb19yZXNlcnZlX3F1b3RhX25ibGtzX3QJcW9fcmVzZXJ2ZV9xdW90YV9uYmxrczsKKwlxb19yZXNlcnZlX3F1b3RhX2J5ZHF1b3RzX3QJcW9fcmVzZXJ2ZV9xdW90YV9ieWRxdW90czsKKwlxb191bnJlc2VydmVfYW5kX21vZF9kcXVvdHNfdAlxb191bnJlc2VydmVfYW5kX21vZF9kcXVvdHM7Cit9IHhmc19kcXRyeG9wc190OworCisjZGVmaW5lIFhGU19EUVRSWE9QKG1wLCB0cCwgb3AsIGFyZ3MuLi4pIFwKKwkJKChtcCktPm1fcW1fb3BzLnhmc19kcXRyeG9wcyA/IFwKKwkJKChtcCktPm1fcW1fb3BzLnhmc19kcXRyeG9wcy0+b3ApKHRwLCAjIyBhcmdzKSA6IDApCisKKyNkZWZpbmUgWEZTX0RRVFJYT1BfVk9JRChtcCwgdHAsIG9wLCBhcmdzLi4uKSBcCisJCSgobXApLT5tX3FtX29wcy54ZnNfZHF0cnhvcHMgPyBcCisJCSgobXApLT5tX3FtX29wcy54ZnNfZHF0cnhvcHMtPm9wKSh0cCwgIyMgYXJncykgOiAodm9pZCkwKQorCisjZGVmaW5lIFhGU19UUkFOU19EVVBfRFFJTkZPKG1wLCBvdHAsIG50cCkgXAorCVhGU19EUVRSWE9QX1ZPSUQobXAsIG90cCwgcW9fZHVwX2RxaW5mbywgbnRwKQorI2RlZmluZSBYRlNfVFJBTlNfRlJFRV9EUUlORk8obXAsIHRwKSBcCisJWEZTX0RRVFJYT1BfVk9JRChtcCwgdHAsIHFvX2ZyZWVfZHFpbmZvKQorI2RlZmluZSBYRlNfVFJBTlNfTU9EX0RRVU9UX0JZSU5PKG1wLCB0cCwgaXAsIGZpZWxkLCBkZWx0YSkgXAorCVhGU19EUVRSWE9QX1ZPSUQobXAsIHRwLCBxb19tb2RfZHF1b3RfYnlpbm8sIGlwLCBmaWVsZCwgZGVsdGEpCisjZGVmaW5lIFhGU19UUkFOU19BUFBMWV9EUVVPVF9ERUxUQVMobXAsIHRwKSBcCisJWEZTX0RRVFJYT1BfVk9JRChtcCwgdHAsIHFvX2FwcGx5X2RxdW90X2RlbHRhcykKKyNkZWZpbmUgWEZTX1RSQU5TX1JFU0VSVkVfUVVPVEFfTkJMS1MobXAsIHRwLCBpcCwgbmJsa3MsIG5pbm9zLCBmbCkgXAorCVhGU19EUVRSWE9QKG1wLCB0cCwgcW9fcmVzZXJ2ZV9xdW90YV9uYmxrcywgbXAsIGlwLCBuYmxrcywgbmlub3MsIGZsKQorI2RlZmluZSBYRlNfVFJBTlNfUkVTRVJWRV9RVU9UQV9CWURRVU9UUyhtcCwgdHAsIHVkLCBnZCwgbmIsIG5pLCBmbCkgXAorCVhGU19EUVRSWE9QKG1wLCB0cCwgcW9fcmVzZXJ2ZV9xdW90YV9ieWRxdW90cywgbXAsIHVkLCBnZCwgbmIsIG5pLCBmbCkKKyNkZWZpbmUgWEZTX1RSQU5TX1VOUkVTRVJWRV9BTkRfTU9EX0RRVU9UUyhtcCwgdHApIFwKKwlYRlNfRFFUUlhPUF9WT0lEKG1wLCB0cCwgcW9fdW5yZXNlcnZlX2FuZF9tb2RfZHF1b3RzKQorCisjZGVmaW5lIFhGU19UUkFOU19SRVNFUlZFX0JMS1FVT1RBKG1wLCB0cCwgaXAsIG5ibGtzKSBcCisJWEZTX1RSQU5TX1JFU0VSVkVfUVVPVEFfTkJMS1MobXAsIHRwLCBpcCwgbmJsa3MsIDAsIFwKKwkJCQlYRlNfUU1PUFRfUkVTX1JFR0JMS1MpCisjZGVmaW5lIFhGU19UUkFOU19SRVNFUlZFX0JMS1FVT1RBX0ZPUkNFKG1wLCB0cCwgaXAsIG5ibGtzKSBcCisJWEZTX1RSQU5TX1JFU0VSVkVfUVVPVEFfTkJMS1MobXAsIHRwLCBpcCwgbmJsa3MsIDAsIFwKKwkJCQlYRlNfUU1PUFRfUkVTX1JFR0JMS1MgfCBYRlNfUU1PUFRfRk9SQ0VfUkVTKQorI2RlZmluZSBYRlNfVFJBTlNfVU5SRVNFUlZFX0JMS1FVT1RBKG1wLCB0cCwgaXAsIG5ibGtzKSBcCisJWEZTX1RSQU5TX1JFU0VSVkVfUVVPVEFfTkJMS1MobXAsIHRwLCBpcCwgLShuYmxrcyksIDAsIFwKKwkJCQlYRlNfUU1PUFRfUkVTX1JFR0JMS1MpCisjZGVmaW5lIFhGU19UUkFOU19SRVNFUlZFX1FVT1RBKG1wLCB0cCwgdWQsIGdkLCBuYiwgbmksIGYpIFwKKwlYRlNfVFJBTlNfUkVTRVJWRV9RVU9UQV9CWURRVU9UUyhtcCwgdHAsIHVkLCBnZCwgbmIsIG5pLCBcCisJCQkJZiB8IFhGU19RTU9QVF9SRVNfUkVHQkxLUykKKyNkZWZpbmUgWEZTX1RSQU5TX1VOUkVTRVJWRV9RVU9UQShtcCwgdHAsIHVkLCBnZCwgbmIsIG5pLCBmKSBcCisJWEZTX1RSQU5TX1JFU0VSVkVfUVVPVEFfQllEUVVPVFMobXAsIHRwLCB1ZCwgZ2QsIC0obmIpLCAtKG5pKSwgXAorCQkJCWYgfCBYRlNfUU1PUFRfUkVTX1JFR0JMS1MpCisKK2V4dGVybiBpbnQgeGZzX3FtX2RxY2hlY2soeGZzX2Rpc2tfZHF1b3RfdCAqLCB4ZnNfZHFpZF90LCB1aW50LCB1aW50LCBjaGFyICopOworCitleHRlcm4gc3RydWN0IGJodl92ZnNvcHMgeGZzX3Ftb3BzOworCisjZW5kaWYJLyogX19LRVJORUxfXyAqLworCisjZW5kaWYJLyogX19YRlNfUVVPVEFfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3JlZmNhY2hlLmggYi9mcy94ZnMveGZzX3JlZmNhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q4ZGRmZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfcmVmY2FjaGUuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19SRUZDQUNIRV9IX18KKyNkZWZpbmUgX19YRlNfUkVGQ0FDSEVfSF9fCisKKyNpZmRlZiBIQVZFX1JFRkNBQ0hFCisvKgorICogTWF4aW11bSBzaXplIChpbiBpbm9kZXMpIGZvciB0aGUgTkZTIHJlZmVyZW5jZSBjYWNoZQorICovCisjZGVmaW5lIFhGU19SRUZDQUNIRV9TSVpFX01BWAk1MTIKKworc3RydWN0IHhmc19pbm9kZTsKK3N0cnVjdCB4ZnNfbW91bnQ7CisKK2V4dGVybiB2b2lkIHhmc19yZWZjYWNoZV9pbnNlcnQoc3RydWN0IHhmc19pbm9kZSAqKTsKK2V4dGVybiB2b2lkIHhmc19yZWZjYWNoZV9wdXJnZV9pcChzdHJ1Y3QgeGZzX2lub2RlICopOworZXh0ZXJuIHZvaWQgeGZzX3JlZmNhY2hlX3B1cmdlX21wKHN0cnVjdCB4ZnNfbW91bnQgKik7CitleHRlcm4gdm9pZCB4ZnNfcmVmY2FjaGVfcHVyZ2Vfc29tZShzdHJ1Y3QgeGZzX21vdW50ICopOworZXh0ZXJuIHZvaWQgeGZzX3JlZmNhY2hlX3Jlc2l6ZShpbnQpOworZXh0ZXJuIHZvaWQgeGZzX3JlZmNhY2hlX2Rlc3Ryb3kodm9pZCk7CisKK2V4dGVybiB2b2lkIHhmc19yZWZjYWNoZV9pdW5sb2NrKHN0cnVjdCB4ZnNfaW5vZGUgKiwgdWludCk7CisKKyNlbHNlCisKKyNkZWZpbmUgeGZzX3JlZmNhY2hlX2luc2VydChpcCkJCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgeGZzX3JlZmNhY2hlX3B1cmdlX2lwKGlwKQlkbyB7IH0gd2hpbGUgKDApCisjZGVmaW5lIHhmc19yZWZjYWNoZV9wdXJnZV9tcChtcCkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSB4ZnNfcmVmY2FjaGVfcHVyZ2Vfc29tZShtcCkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSB4ZnNfcmVmY2FjaGVfcmVzaXplKHNpemUpCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgeGZzX3JlZmNhY2hlX2Rlc3Ryb3koKQkJZG8geyB9IHdoaWxlICgwKQorCisjZGVmaW5lIHhmc19yZWZjYWNoZV9pdW5sb2NrKGlwLCBmbGFncykJeGZzX2l1bmxvY2soaXAsIGZsYWdzKQorCisjZW5kaWYKKworI2VuZGlmCS8qIF9fWEZTX1JFRkNBQ0hFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19yZW5hbWUuYyBiL2ZzL3hmcy94ZnNfcmVuYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IxM2Y5YQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfcmVuYW1lLmMKQEAgLTAsMCArMSw2NzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKyNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19ibWFwLmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisjaW5jbHVkZSAieGZzX3F1b3RhLmgiCisjaW5jbHVkZSAieGZzX3JlZmNhY2hlLmgiCisjaW5jbHVkZSAieGZzX3V0aWxzLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zX3NwYWNlLmgiCisjaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2Rpcl9sZWFmLmgiCisKKworLyoKKyAqIEdpdmVuIGFuIGFycmF5IG9mIHVwIHRvIDQgaW5vZGUgcG9pbnRlcnMsIHVubG9jayB0aGUgcG9pbnRlZCB0byBpbm9kZXMuCisgKiBJZiB0aGVyZSBhcmUgZmV3ZXIgdGhhbiA0IGVudHJpZXMgaW4gdGhlIGFycmF5LCB0aGUgZW1wdHkgZW50cmllcyB3aWxsCisgKiBiZSBhdCB0aGUgZW5kIGFuZCB3aWxsIGhhdmUgTlVMTCBwb2ludGVycyBpbiB0aGVtLgorICovCitTVEFUSUMgdm9pZAoreGZzX3JlbmFtZV91bmxvY2s0KAorCXhmc19pbm9kZV90CSoqaV90YWIsCisJdWludAkJbG9ja19tb2RlKQoreworCWludAlpOworCisJeGZzX2l1bmxvY2soaV90YWJbMF0sIGxvY2tfbW9kZSk7CisJZm9yIChpID0gMTsgaSA8IDQ7IGkrKykgeworCQlpZiAoaV90YWJbaV0gPT0gTlVMTCkgeworCQkJYnJlYWs7CisJCX0KKwkJLyoKKwkJICogV2F0Y2ggb3V0IGZvciBkdXBsaWNhdGUgZW50cmllcyBpbiB0aGUgdGFibGUuCisJCSAqLworCQlpZiAoaV90YWJbaV0gIT0gaV90YWJbaS0xXSkgeworCQkJeGZzX2l1bmxvY2soaV90YWJbaV0sIGxvY2tfbW9kZSk7CisJCX0KKwl9Cit9CisKKyNpZmRlZiBERUJVRworaW50IHhmc19yZW5hbWVfc2tpcCwgeGZzX3JlbmFtZV9uc2tpcDsKKyNlbmRpZgorCisvKgorICogVGhlIGZvbGxvd2luZyByb3V0aW5lIHdpbGwgYWNxdWlyZSB0aGUgbG9ja3MgcmVxdWlyZWQgZm9yIGEgcmVuYW1lCisgKiBvcGVyYXRpb24uIFRoZSBjb2RlIHVuZGVyc3RhbmRzIHRoZSBzZW1hbnRpY3Mgb2YgcmVuYW1lcyBhbmQgd2lsbAorICogdmFsaWRhdGUgdGhhdCBuYW1lMSBleGlzdHMgdW5kZXIgZHAxICYgdGhhdCBuYW1lMiBtYXkgb3IgbWF5IG5vdAorICogZXhpc3QgdW5kZXIgZHAyLgorICoKKyAqIFdlIGFyZSByZW5hbWluZyBkcDEvbmFtZTEgdG8gZHAyL25hbWUyLgorICoKKyAqIFJldHVybiBFTk9FTlQgaWYgZHAxIGRvZXMgbm90IGV4aXN0LCBvdGhlciBsb29rdXAgZXJyb3JzLCBvciAwIGZvciBzdWNjZXNzLgorICovCitTVEFUSUMgaW50Cit4ZnNfbG9ja19mb3JfcmVuYW1lKAorCXhmc19pbm9kZV90CSpkcDEsCS8qIG9sZCAoc291cmNlKSBkaXJlY3RvcnkgaW5vZGUgKi8KKwl4ZnNfaW5vZGVfdAkqZHAyLAkvKiBuZXcgKHRhcmdldCkgZGlyZWN0b3J5IGlub2RlICovCisJdm5hbWVfdAkJKnZuYW1lMSwvKiBvbGQgZW50cnkgbmFtZSAqLworCXZuYW1lX3QJCSp2bmFtZTIsLyogbmV3IGVudHJ5IG5hbWUgKi8KKwl4ZnNfaW5vZGVfdAkqKmlwcDEsCS8qIGlub2RlIG9mIG9sZCBlbnRyeSAqLworCXhmc19pbm9kZV90CSoqaXBwMiwJLyogaW5vZGUgb2YgbmV3IGVudHJ5LCBpZiBpdAorCQkJCSAgIGFscmVhZHkgZXhpc3RzLCBOVUxMIG90aGVyd2lzZS4gKi8KKwl4ZnNfaW5vZGVfdAkqKmlfdGFiLC8qIGFycmF5IG9mIGlub2RlIHJldHVybmVkLCBzb3J0ZWQgKi8KKwlpbnQJCSpudW1faW5vZGVzKSAgLyogbnVtYmVyIG9mIGlub2RlcyBpbiBhcnJheSAqLworeworCXhmc19pbm9kZV90CQkqaXAxLCAqaXAyLCAqdGVtcDsKKwl4ZnNfaW5vX3QJCWludW0xLCBpbnVtMjsKKwlpbnQJCQllcnJvcjsKKwlpbnQJCQlpLCBqOworCXVpbnQJCQlsb2NrX21vZGU7CisJaW50CQkJZGlmZl9kaXJzID0gKGRwMSAhPSBkcDIpOworCisJaXAyID0gTlVMTDsKKworCS8qCisJICogRmlyc3QsIGZpbmQgb3V0IHRoZSBjdXJyZW50IGludW1zIG9mIHRoZSBlbnRyaWVzIHNvIHRoYXQgd2UKKwkgKiBjYW4gZGV0ZXJtaW5lIHRoZSBpbml0aWFsIGxvY2tpbmcgb3JkZXIuICBXZSdsbCBoYXZlIHRvCisJICogc2FuaXR5IGNoZWNrIHN0dWZmIGFmdGVyIGFsbCB0aGUgbG9ja3MgaGF2ZSBiZWVuIGFjcXVpcmVkCisJICogdG8gc2VlIGlmIHdlIHN0aWxsIGhhdmUgdGhlIHJpZ2h0IGlub2RlcywgZGlyZWN0b3JpZXMsIGV0Yy4KKwkgKi8KKwlsb2NrX21vZGUgPSB4ZnNfaWxvY2tfbWFwX3NoYXJlZChkcDEpOworCWVycm9yID0geGZzX2dldF9kaXJfZW50cnkodm5hbWUxLCAmaXAxKTsKKwlpZiAoZXJyb3IpIHsKKwkJeGZzX2l1bmxvY2tfbWFwX3NoYXJlZChkcDEsIGxvY2tfbW9kZSk7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwlpbnVtMSA9IGlwMS0+aV9pbm87CisKKwlBU1NFUlQoaXAxKTsKKwlJVFJBQ0UoaXAxKTsKKworCS8qCisJICogVW5sb2NrIGRwMSBhbmQgbG9jayBkcDIgaWYgdGhleSBhcmUgZGlmZmVyZW50LgorCSAqLworCisJaWYgKGRpZmZfZGlycykgeworCQl4ZnNfaXVubG9ja19tYXBfc2hhcmVkKGRwMSwgbG9ja19tb2RlKTsKKwkJbG9ja19tb2RlID0geGZzX2lsb2NrX21hcF9zaGFyZWQoZHAyKTsKKwl9CisKKwllcnJvciA9IHhmc19kaXJfbG9va3VwX2ludChYRlNfSVRPQkhWKGRwMiksIGxvY2tfbW9kZSwKKwkJCQkgICB2bmFtZTIsICZpbnVtMiwgJmlwMik7CisJaWYgKGVycm9yID09IEVOT0VOVCkgewkJLyogdGFyZ2V0IGRvZXMgbm90IG5lZWQgdG8gZXhpc3QuICovCisJCWludW0yID0gMDsKKwl9IGVsc2UgaWYgKGVycm9yKSB7CisJCS8qCisJCSAqIElmIGRwMiBhbmQgZHAxIGFyZSB0aGUgc2FtZSwgdGhlIG5leHQgbGluZSB1bmxvY2tzIGRwMS4KKwkJICogR290IGl0PworCQkgKi8KKwkJeGZzX2l1bmxvY2tfbWFwX3NoYXJlZChkcDIsIGxvY2tfbW9kZSk7CisJCUlSRUxFIChpcDEpOworCQlyZXR1cm4gZXJyb3I7CisJfSBlbHNlIHsKKwkJSVRSQUNFKGlwMik7CisJfQorCisJLyoKKwkgKiBpX3RhYiBjb250YWlucyBhIGxpc3Qgb2YgcG9pbnRlcnMgdG8gaW5vZGVzLiAgV2UgaW5pdGlhbGl6ZQorCSAqIHRoZSB0YWJsZSBoZXJlICYgd2UnbGwgc29ydCBpdC4gIFdlIHdpbGwgdGhlbiB1c2UgaXQgdG8KKwkgKiBvcmRlciB0aGUgYWNxdWlzaXRpb24gb2YgdGhlIGlub2RlIGxvY2tzLgorCSAqCisJICogTm90ZSB0aGF0IHRoZSB0YWJsZSBtYXkgY29udGFpbiBkdXBsaWNhdGVzLiAgZS5nLiwgZHAxID09IGRwMi4KKwkgKi8KKwlpX3RhYlswXSA9IGRwMTsKKwlpX3RhYlsxXSA9IGRwMjsKKwlpX3RhYlsyXSA9IGlwMTsKKwlpZiAoaW51bTIgPT0gMCkgeworCQkqbnVtX2lub2RlcyA9IDM7CisJCWlfdGFiWzNdID0gTlVMTDsKKwl9IGVsc2UgeworCQkqbnVtX2lub2RlcyA9IDQ7CisJCWlfdGFiWzNdID0gaXAyOworCX0KKworCS8qCisJICogU29ydCB0aGUgZWxlbWVudHMgdmlhIGJ1YmJsZSBzb3J0LiAgKFJlbWVtYmVyLCB0aGVyZSBhcmUgYXQKKwkgKiBtb3N0IDQgZWxlbWVudHMgdG8gc29ydCwgc28gdGhpcyBpcyBhZGVxdWF0ZS4pCisJICovCisJZm9yIChpPTA7IGkgPCAqbnVtX2lub2RlczsgaSsrKSB7CisJCWZvciAoaj0xOyBqIDwgKm51bV9pbm9kZXM7IGorKykgeworCQkJaWYgKGlfdGFiW2pdLT5pX2lubyA8IGlfdGFiW2otMV0tPmlfaW5vKSB7CisJCQkJdGVtcCA9IGlfdGFiW2pdOworCQkJCWlfdGFiW2pdID0gaV90YWJbai0xXTsKKwkJCQlpX3RhYltqLTFdID0gdGVtcDsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICogV2UgaGF2ZSBkcDIgbG9ja2VkLiBJZiBpdCBpc24ndCBmaXJzdCwgdW5sb2NrIGl0LgorCSAqIElmIGl0IGlzIGZpcnN0LCB0ZWxsIHhmc19sb2NrX2lub2RlcyBzbyBpdCBjYW4gc2tpcCBpdAorCSAqIHdoZW4gbG9ja2luZy4gaWYgZHAxID09IGRwMiwgeGZzX2xvY2tfaW5vZGVzIHdpbGwgc2tpcCBib3RoCisJICogc2luY2UgdGhleSBhcmUgZXF1YWwuIHhmc19sb2NrX2lub2RlcyBuZWVkcyBhbGwgdGhlc2UgaW5vZGVzCisJICogc28gdGhhdCBpdCBjYW4gdW5sb2NrIGFuZCByZXRyeSBpZiB0aGVyZSBtaWdodCBiZSBhIGRlYWQtbG9jaworCSAqIHBvdGVudGlhbCB3aXRoIHRoZSBsb2cuCisJICovCisKKwlpZiAoaV90YWJbMF0gPT0gZHAyICYmIGxvY2tfbW9kZSA9PSBYRlNfSUxPQ0tfU0hBUkVEKSB7CisjaWZkZWYgREVCVUcKKwkJeGZzX3JlbmFtZV9za2lwKys7CisjZW5kaWYKKwkJeGZzX2xvY2tfaW5vZGVzKGlfdGFiLCAqbnVtX2lub2RlcywgMSwgWEZTX0lMT0NLX1NIQVJFRCk7CisJfSBlbHNlIHsKKyNpZmRlZiBERUJVRworCQl4ZnNfcmVuYW1lX25za2lwKys7CisjZW5kaWYKKwkJeGZzX2l1bmxvY2tfbWFwX3NoYXJlZChkcDIsIGxvY2tfbW9kZSk7CisJCXhmc19sb2NrX2lub2RlcyhpX3RhYiwgKm51bV9pbm9kZXMsIDAsIFhGU19JTE9DS19TSEFSRUQpOworCX0KKworCS8qCisJICogU2V0IHRoZSByZXR1cm4gdmFsdWUuIE51bGwgb3V0IGFueSB1bnVzZWQgZW50cmllcyBpbiBpX3RhYi4KKwkgKi8KKwkqaXBwMSA9ICppcHAyID0gTlVMTDsKKwlmb3IgKGk9MDsgaSA8ICpudW1faW5vZGVzOyBpKyspIHsKKwkJaWYgKGlfdGFiW2ldLT5pX2lubyA9PSBpbnVtMSkgeworCQkJKmlwcDEgPSBpX3RhYltpXTsKKwkJfQorCQlpZiAoaV90YWJbaV0tPmlfaW5vID09IGludW0yKSB7CisJCQkqaXBwMiA9IGlfdGFiW2ldOworCQl9CisJfQorCWZvciAoO2kgPCA0OyBpKyspIHsKKwkJaV90YWJbaV0gPSBOVUxMOworCX0KKwlyZXR1cm4gMDsKK30KKworCitpbnQgcmVuYW1lX3doaWNoX2Vycm9yX3JldHVybiA9IDA7CisKKy8qCisgKiB4ZnNfcmVuYW1lCisgKi8KK2ludAoreGZzX3JlbmFtZSgKKwliaHZfZGVzY190CSpzcmNfZGlyX2JkcCwKKwl2bmFtZV90CQkqc3JjX3ZuYW1lLAorCXZub2RlX3QJCSp0YXJnZXRfZGlyX3ZwLAorCXZuYW1lX3QJCSp0YXJnZXRfdm5hbWUsCisJY3JlZF90CQkqY3JlZHApCit7CisJeGZzX3RyYW5zX3QJKnRwOworCXhmc19pbm9kZV90CSpzcmNfZHAsICp0YXJnZXRfZHAsICpzcmNfaXAsICp0YXJnZXRfaXA7CisJeGZzX21vdW50X3QJKm1wOworCWludAkJbmV3X3BhcmVudDsJCS8qIG1vdmluZyB0byBhIG5ldyBkaXIgKi8KKwlpbnQJCXNyY19pc19kaXJlY3Rvcnk7CS8qIHNyY19uYW1lIGlzIGEgZGlyZWN0b3J5ICovCisJaW50CQllcnJvcjsKKwl4ZnNfYm1hcF9mcmVlX3QgZnJlZV9saXN0OworCXhmc19mc2Jsb2NrX3QgICBmaXJzdF9ibG9jazsKKwlpbnQJCWNhbmNlbF9mbGFnczsKKwlpbnQJCWNvbW1pdHRlZDsKKwl4ZnNfaW5vZGVfdAkqaW5vZGVzWzRdOworCWludAkJdGFyZ2V0X2lwX2Ryb3BwZWQgPSAwOwkvKiBkcm9wcGVkIHRhcmdldF9pcCBsaW5rPyAqLworCXZub2RlX3QJCSpzcmNfZGlyX3ZwOworCWJodl9kZXNjX3QJKnRhcmdldF9kaXJfYmRwOworCWludAkJc3BhY2VyZXM7CisJaW50CQl0YXJnZXRfbGlua196ZXJvID0gMDsKKwlpbnQJCW51bV9pbm9kZXM7CisJY2hhcgkJKnNyY19uYW1lID0gVk5BTUUoc3JjX3ZuYW1lKTsKKwljaGFyCQkqdGFyZ2V0X25hbWUgPSBWTkFNRSh0YXJnZXRfdm5hbWUpOworCWludAkJc3JjX25hbWVsZW4gPSBWTkFNRUxFTihzcmNfdm5hbWUpOworCWludAkJdGFyZ2V0X25hbWVsZW4gPSBWTkFNRUxFTih0YXJnZXRfdm5hbWUpOworCisJc3JjX2Rpcl92cCA9IEJIVl9UT19WTk9ERShzcmNfZGlyX2JkcCk7CisJdm5fdHJhY2VfZW50cnkoc3JjX2Rpcl92cCwgInhmc19yZW5hbWUiLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisJdm5fdHJhY2VfZW50cnkodGFyZ2V0X2Rpcl92cCwgInhmc19yZW5hbWUiLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisKKwkvKgorCSAqIEZpbmQgdGhlIFhGUyBiZWhhdmlvciBkZXNjcmlwdG9yIGZvciB0aGUgdGFyZ2V0IGRpcmVjdG9yeQorCSAqIHZub2RlIHNpbmNlIGl0IHdhcyBub3QgaGFuZGVkIHRvIHVzLgorCSAqLworCXRhcmdldF9kaXJfYmRwID0gdm5fYmh2X2xvb2t1cF91bmxvY2tlZChWTl9CSFZfSEVBRCh0YXJnZXRfZGlyX3ZwKSwKKwkJCQkJCSZ4ZnNfdm5vZGVvcHMpOworCWlmICh0YXJnZXRfZGlyX2JkcCA9PSBOVUxMKSB7CisJCXJldHVybiBYRlNfRVJST1IoRVhERVYpOworCX0KKworCXNyY19kcCA9IFhGU19CSFZUT0koc3JjX2Rpcl9iZHApOworCXRhcmdldF9kcCA9IFhGU19CSFZUT0kodGFyZ2V0X2Rpcl9iZHApOworCW1wID0gc3JjX2RwLT5pX21vdW50OworCisJaWYgKERNX0VWRU5UX0VOQUJMRUQoc3JjX2Rpcl92cC0+dl92ZnNwLCBzcmNfZHAsIERNX0VWRU5UX1JFTkFNRSkgfHwKKwkgICAgRE1fRVZFTlRfRU5BQkxFRCh0YXJnZXRfZGlyX3ZwLT52X3Zmc3AsCisJCQkJdGFyZ2V0X2RwLCBETV9FVkVOVF9SRU5BTUUpKSB7CisJCWVycm9yID0gWEZTX1NFTkRfTkFNRVNQKG1wLCBETV9FVkVOVF9SRU5BTUUsCisJCQkJCXNyY19kaXJfdnAsIERNX1JJR0hUX05VTEwsCisJCQkJCXRhcmdldF9kaXJfdnAsIERNX1JJR0hUX05VTEwsCisJCQkJCXNyY19uYW1lLCB0YXJnZXRfbmFtZSwKKwkJCQkJMCwgMCwgMCk7CisJCWlmIChlcnJvcikgeworCQkJcmV0dXJuIGVycm9yOworCQl9CisJfQorCS8qIFJldHVybiB0aHJvdWdoIHN0ZF9yZXR1cm4gYWZ0ZXIgdGhpcyBwb2ludC4gKi8KKworCS8qCisJICogTG9jayBhbGwgdGhlIHBhcnRpY2lwYXRpbmcgaW5vZGVzLiBEZXBlbmRpbmcgdXBvbiB3aGV0aGVyCisJICogdGhlIHRhcmdldF9uYW1lIGV4aXN0cyBpbiB0aGUgdGFyZ2V0IGRpcmVjdG9yeSwgYW5kCisJICogd2hldGhlciB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBpcyB0aGUgc2FtZSBhcyB0aGUgc291cmNlCisJICogZGlyZWN0b3J5LCB3ZSBjYW4gbG9jayBmcm9tIDIgdG8gNCBpbm9kZXMuCisJICogeGZzX2xvY2tfZm9yX3JlbmFtZSgpIHdpbGwgcmV0dXJuIEVOT0VOVCBpZiBzcmNfbmFtZQorCSAqIGRvZXMgbm90IGV4aXN0IGluIHRoZSBzb3VyY2UgZGlyZWN0b3J5LgorCSAqLworCXRwID0gTlVMTDsKKwllcnJvciA9IHhmc19sb2NrX2Zvcl9yZW5hbWUoc3JjX2RwLCB0YXJnZXRfZHAsIHNyY192bmFtZSwKKwkJCXRhcmdldF92bmFtZSwgJnNyY19pcCwgJnRhcmdldF9pcCwgaW5vZGVzLAorCQkJJm51bV9pbm9kZXMpOworCisJaWYgKGVycm9yKSB7CisJCXJlbmFtZV93aGljaF9lcnJvcl9yZXR1cm4gPSBfX0xJTkVfXzsKKwkJLyoKKwkJICogV2UgaGF2ZSBub3RoaW5nIGxvY2tlZCwgbm8gaW5vZGUgcmVmZXJlbmNlcywgYW5kCisJCSAqIG5vIHRyYW5zYWN0aW9uLCBzbyBqdXN0IGdldCBvdXQuCisJCSAqLworCQlnb3RvIHN0ZF9yZXR1cm47CisJfQorCisJQVNTRVJUKHNyY19pcCAhPSBOVUxMKTsKKworCWlmICgoc3JjX2lwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRkRJUikgeworCQkvKgorCQkgKiBDaGVjayBmb3IgbGluayBjb3VudCBvdmVyZmxvdyBvbiB0YXJnZXRfZHAKKwkJICovCisJCWlmICh0YXJnZXRfaXAgPT0gTlVMTCAmJiAoc3JjX2RwICE9IHRhcmdldF9kcCkgJiYKKwkJICAgIHRhcmdldF9kcC0+aV9kLmRpX25saW5rID49IFhGU19NQVhMSU5LKSB7CisJCQlyZW5hbWVfd2hpY2hfZXJyb3JfcmV0dXJuID0gX19MSU5FX187CisJCQllcnJvciA9IFhGU19FUlJPUihFTUxJTkspOworCQkJeGZzX3JlbmFtZV91bmxvY2s0KGlub2RlcywgWEZTX0lMT0NLX1NIQVJFRCk7CisJCQlnb3RvIHJlbGVfcmV0dXJuOworCQl9CisJfQorCisJbmV3X3BhcmVudCA9IChzcmNfZHAgIT0gdGFyZ2V0X2RwKTsKKwlzcmNfaXNfZGlyZWN0b3J5ID0gKChzcmNfaXAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSA9PSBTX0lGRElSKTsKKworCS8qCisJICogRHJvcCB0aGUgbG9ja3Mgb24gb3VyIGlub2RlcyBzbyB0aGF0IHdlIGNhbiBzdGFydCB0aGUgdHJhbnNhY3Rpb24uCisJICovCisJeGZzX3JlbmFtZV91bmxvY2s0KGlub2RlcywgWEZTX0lMT0NLX1NIQVJFRCk7CisKKwlYRlNfQk1BUF9JTklUKCZmcmVlX2xpc3QsICZmaXJzdF9ibG9jayk7CisJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19SRU5BTUUpOworCWNhbmNlbF9mbGFncyA9IFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVM7CisJc3BhY2VyZXMgPSBYRlNfUkVOQU1FX1NQQUNFX1JFUyhtcCwgdGFyZ2V0X25hbWVsZW4pOworCWVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIHNwYWNlcmVzLCBYRlNfUkVOQU1FX0xPR19SRVMobXApLCAwLAorCQkJWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywgWEZTX1JFTkFNRV9MT0dfQ09VTlQpOworCWlmIChlcnJvciA9PSBFTk9TUEMpIHsKKwkJc3BhY2VyZXMgPSAwOworCQllcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCAwLCBYRlNfUkVOQU1FX0xPR19SRVMobXApLCAwLAorCQkJCVhGU19UUkFOU19QRVJNX0xPR19SRVMsIFhGU19SRU5BTUVfTE9HX0NPVU5UKTsKKwl9CisJaWYgKGVycm9yKSB7CisJCXJlbmFtZV93aGljaF9lcnJvcl9yZXR1cm4gPSBfX0xJTkVfXzsKKwkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgMCk7CisJCWdvdG8gcmVsZV9yZXR1cm47CisJfQorCisJLyoKKwkgKiBBdHRhY2ggdGhlIGRxdW90cyB0byB0aGUgaW5vZGVzCisJICovCisJaWYgKChlcnJvciA9IFhGU19RTV9EUVZPUFJFTkFNRShtcCwgaW5vZGVzKSkpIHsKKwkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgY2FuY2VsX2ZsYWdzKTsKKwkJcmVuYW1lX3doaWNoX2Vycm9yX3JldHVybiA9IF9fTElORV9fOworCQlnb3RvIHJlbGVfcmV0dXJuOworCX0KKworCS8qCisJICogUmVhY3F1aXJlIHRoZSBpbm9kZSBsb2NrcyB3ZSBkcm9wcGVkIGFib3ZlLgorCSAqLworCXhmc19sb2NrX2lub2Rlcyhpbm9kZXMsIG51bV9pbm9kZXMsIDAsIFhGU19JTE9DS19FWENMKTsKKworCS8qCisJICogSm9pbiBhbGwgdGhlIGlub2RlcyB0byB0aGUgdHJhbnNhY3Rpb24uIEZyb20gdGhpcyBwb2ludCBvbiwKKwkgKiB3ZSBjYW4gcmVseSBvbiBlaXRoZXIgdHJhbnNfY29tbWl0IG9yIHRyYW5zX2NhbmNlbCB0byB1bmxvY2sKKwkgKiB0aGVtLiAgTm90ZSB0aGF0IHdlIG5lZWQgdG8gYWRkIGEgdm5vZGUgcmVmZXJlbmNlIHRvIHRoZQorCSAqIGRpcmVjdG9yaWVzIHNpbmNlIHRyYW5zX2NvbW1pdCAmIHRyYW5zX2NhbmNlbCB3aWxsIGRlY3JlbWVudAorCSAqIHRoZW0gd2hlbiB0aGV5IHVubG9jayB0aGUgaW5vZGVzLiAgQWxzbywgd2UgbmVlZCB0byBiZSBjYXJlZnVsCisJICogbm90IHRvIGFkZCBhbiBpbm9kZSB0byB0aGUgdHJhbnNhY3Rpb24gbW9yZSB0aGFuIG9uY2UuCisJICovCisJVk5fSE9MRChzcmNfZGlyX3ZwKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIHNyY19kcCwgWEZTX0lMT0NLX0VYQ0wpOworCWlmIChuZXdfcGFyZW50KSB7CisJCVZOX0hPTEQodGFyZ2V0X2Rpcl92cCk7CisJCXhmc190cmFuc19pam9pbih0cCwgdGFyZ2V0X2RwLCBYRlNfSUxPQ0tfRVhDTCk7CisJfQorCWlmICgoc3JjX2lwICE9IHNyY19kcCkgJiYgKHNyY19pcCAhPSB0YXJnZXRfZHApKSB7CisJCXhmc190cmFuc19pam9pbih0cCwgc3JjX2lwLCBYRlNfSUxPQ0tfRVhDTCk7CisJfQorCWlmICgodGFyZ2V0X2lwICE9IE5VTEwpICYmCisJICAgICh0YXJnZXRfaXAgIT0gc3JjX2lwKSAmJgorCSAgICAodGFyZ2V0X2lwICE9IHNyY19kcCkgJiYKKwkgICAgKHRhcmdldF9pcCAhPSB0YXJnZXRfZHApKSB7CisJCXhmc190cmFuc19pam9pbih0cCwgdGFyZ2V0X2lwLCBYRlNfSUxPQ0tfRVhDTCk7CisJfQorCisJLyoKKwkgKiBTZXQgdXAgdGhlIHRhcmdldC4KKwkgKi8KKwlpZiAodGFyZ2V0X2lwID09IE5VTEwpIHsKKwkJLyoKKwkJICogSWYgdGhlcmUncyBubyBzcGFjZSByZXNlcnZhdGlvbiwgY2hlY2sgdGhlIGVudHJ5IHdpbGwKKwkJICogZml0IGJlZm9yZSBhY3R1YWxseSBpbnNlcnRpbmcgaXQuCisJCSAqLworCQlpZiAoc3BhY2VyZXMgPT0gMCAmJgorCQkgICAgKGVycm9yID0gWEZTX0RJUl9DQU5FTlRFUihtcCwgdHAsIHRhcmdldF9kcCwgdGFyZ2V0X25hbWUsCisJCQkJdGFyZ2V0X25hbWVsZW4pKSkgeworCQkJcmVuYW1lX3doaWNoX2Vycm9yX3JldHVybiA9IF9fTElORV9fOworCQkJZ290byBlcnJvcl9yZXR1cm47CisJCX0KKwkJLyoKKwkJICogSWYgdGFyZ2V0IGRvZXMgbm90IGV4aXN0IGFuZCB0aGUgcmVuYW1lIGNyb3NzZXMKKwkJICogZGlyZWN0b3JpZXMsIGFkanVzdCB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBsaW5rIGNvdW50CisJCSAqIHRvIGFjY291bnQgZm9yIHRoZSAiLi4iIHJlZmVyZW5jZSBmcm9tIHRoZSBuZXcgZW50cnkuCisJCSAqLworCQllcnJvciA9IFhGU19ESVJfQ1JFQVRFTkFNRShtcCwgdHAsIHRhcmdldF9kcCwgdGFyZ2V0X25hbWUsCisJCQkJCSAgIHRhcmdldF9uYW1lbGVuLCBzcmNfaXAtPmlfaW5vLAorCQkJCQkgICAmZmlyc3RfYmxvY2ssICZmcmVlX2xpc3QsIHNwYWNlcmVzKTsKKwkJaWYgKGVycm9yID09IEVOT1NQQykgeworCQkJcmVuYW1lX3doaWNoX2Vycm9yX3JldHVybiA9IF9fTElORV9fOworCQkJZ290byBlcnJvcl9yZXR1cm47CisJCX0KKwkJaWYgKGVycm9yKSB7CisJCQlyZW5hbWVfd2hpY2hfZXJyb3JfcmV0dXJuID0gX19MSU5FX187CisJCQlnb3RvIGFib3J0X3JldHVybjsKKwkJfQorCQl4ZnNfaWNoZ3RpbWUodGFyZ2V0X2RwLCBYRlNfSUNIR1RJTUVfTU9EIHwgWEZTX0lDSEdUSU1FX0NIRyk7CisKKwkJaWYgKG5ld19wYXJlbnQgJiYgc3JjX2lzX2RpcmVjdG9yeSkgeworCQkJZXJyb3IgPSB4ZnNfYnVtcGxpbmsodHAsIHRhcmdldF9kcCk7CisJCQlpZiAoZXJyb3IpIHsKKwkJCQlyZW5hbWVfd2hpY2hfZXJyb3JfcmV0dXJuID0gX19MSU5FX187CisJCQkJZ290byBhYm9ydF9yZXR1cm47CisJCQl9CisJCX0KKwl9IGVsc2UgeyAvKiB0YXJnZXRfaXAgIT0gTlVMTCAqLworCisJCS8qCisJCSAqIElmIHRhcmdldCBleGlzdHMgYW5kIGl0J3MgYSBkaXJlY3RvcnksIGNoZWNrIHRoYXQgYm90aAorCQkgKiB0YXJnZXQgYW5kIHNvdXJjZSBhcmUgZGlyZWN0b3JpZXMgYW5kIHRoYXQgdGFyZ2V0IGNhbiBiZQorCQkgKiBkZXN0cm95ZWQsIG9yIHRoYXQgbmVpdGhlciBpcyBhIGRpcmVjdG9yeS4KKwkJICovCisJCWlmICgodGFyZ2V0X2lwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRkRJUikgeworCQkJLyoKKwkJCSAqIE1ha2Ugc3VyZSB0YXJnZXQgZGlyIGlzIGVtcHR5LgorCQkJICovCisJCQlpZiAoIShYRlNfRElSX0lTRU1QVFkodGFyZ2V0X2lwLT5pX21vdW50LCB0YXJnZXRfaXApKSB8fAorCQkJICAgICh0YXJnZXRfaXAtPmlfZC5kaV9ubGluayA+IDIpKSB7CisJCQkJZXJyb3IgPSBYRlNfRVJST1IoRUVYSVNUKTsKKwkJCQlyZW5hbWVfd2hpY2hfZXJyb3JfcmV0dXJuID0gX19MSU5FX187CisJCQkJZ290byBlcnJvcl9yZXR1cm47CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBMaW5rIHRoZSBzb3VyY2UgaW5vZGUgdW5kZXIgdGhlIHRhcmdldCBuYW1lLgorCQkgKiBJZiB0aGUgc291cmNlIGlub2RlIGlzIGEgZGlyZWN0b3J5IGFuZCB3ZSBhcmUgbW92aW5nCisJCSAqIGl0IGFjcm9zcyBkaXJlY3RvcmllcywgaXRzICIuLiIgZW50cnkgd2lsbCBiZQorCQkgKiBpbmNvbnNpc3RlbnQgdW50aWwgd2UgcmVwbGFjZSB0aGF0IGRvd24gYmVsb3cuCisJCSAqCisJCSAqIEluIGNhc2UgdGhlcmUgaXMgYWxyZWFkeSBhbiBlbnRyeSB3aXRoIHRoZSBzYW1lCisJCSAqIG5hbWUgYXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSwgcmVtb3ZlIGl0IGZpcnN0LgorCQkgKi8KKwkJZXJyb3IgPSBYRlNfRElSX1JFUExBQ0UobXAsIHRwLCB0YXJnZXRfZHAsIHRhcmdldF9uYW1lLAorCQkJdGFyZ2V0X25hbWVsZW4sIHNyY19pcC0+aV9pbm8sICZmaXJzdF9ibG9jaywKKwkJCSZmcmVlX2xpc3QsIHNwYWNlcmVzKTsKKwkJaWYgKGVycm9yKSB7CisJCQlyZW5hbWVfd2hpY2hfZXJyb3JfcmV0dXJuID0gX19MSU5FX187CisJCQlnb3RvIGFib3J0X3JldHVybjsKKwkJfQorCQl4ZnNfaWNoZ3RpbWUodGFyZ2V0X2RwLCBYRlNfSUNIR1RJTUVfTU9EIHwgWEZTX0lDSEdUSU1FX0NIRyk7CisKKwkJLyoKKwkJICogRGVjcmVtZW50IHRoZSBsaW5rIGNvdW50IG9uIHRoZSB0YXJnZXQgc2luY2UgdGhlIHRhcmdldAorCQkgKiBkaXIgbm8gbG9uZ2VyIHBvaW50cyB0byBpdC4KKwkJICovCisJCWVycm9yID0geGZzX2Ryb3BsaW5rKHRwLCB0YXJnZXRfaXApOworCQlpZiAoZXJyb3IpIHsKKwkJCXJlbmFtZV93aGljaF9lcnJvcl9yZXR1cm4gPSBfX0xJTkVfXzsKKwkJCWdvdG8gYWJvcnRfcmV0dXJuOworCQl9CisJCXRhcmdldF9pcF9kcm9wcGVkID0gMTsKKworCQlpZiAoc3JjX2lzX2RpcmVjdG9yeSkgeworCQkJLyoKKwkJCSAqIERyb3AgdGhlIGxpbmsgZnJvbSB0aGUgb2xkICIuIiBlbnRyeS4KKwkJCSAqLworCQkJZXJyb3IgPSB4ZnNfZHJvcGxpbmsodHAsIHRhcmdldF9pcCk7CisJCQlpZiAoZXJyb3IpIHsKKwkJCQlyZW5hbWVfd2hpY2hfZXJyb3JfcmV0dXJuID0gX19MSU5FX187CisJCQkJZ290byBhYm9ydF9yZXR1cm47CisJCQl9CisJCX0KKworCQkvKiBEbyB0aGlzIHRlc3Qgd2hpbGUgd2Ugc3RpbGwgaG9sZCB0aGUgbG9ja3MgKi8KKwkJdGFyZ2V0X2xpbmtfemVybyA9ICh0YXJnZXRfaXApLT5pX2QuZGlfbmxpbms9PTA7CisKKwl9IC8qIHRhcmdldF9pcCAhPSBOVUxMICovCisKKwkvKgorCSAqIFJlbW92ZSB0aGUgc291cmNlLgorCSAqLworCWlmIChuZXdfcGFyZW50ICYmIHNyY19pc19kaXJlY3RvcnkpIHsKKworCQkvKgorCQkgKiBSZXdyaXRlIHRoZSAiLi4iIGVudHJ5IHRvIHBvaW50IHRvIHRoZSBuZXcKKwkJICogZGlyZWN0b3J5LgorCQkgKi8KKwkJZXJyb3IgPSBYRlNfRElSX1JFUExBQ0UobXAsIHRwLCBzcmNfaXAsICIuLiIsIDIsCisJCQkJCXRhcmdldF9kcC0+aV9pbm8sICZmaXJzdF9ibG9jaywKKwkJCQkJJmZyZWVfbGlzdCwgc3BhY2VyZXMpOworCQlBU1NFUlQoZXJyb3IgIT0gRUVYSVNUKTsKKwkJaWYgKGVycm9yKSB7CisJCQlyZW5hbWVfd2hpY2hfZXJyb3JfcmV0dXJuID0gX19MSU5FX187CisJCQlnb3RvIGFib3J0X3JldHVybjsKKwkJfQorCQl4ZnNfaWNoZ3RpbWUoc3JjX2lwLCBYRlNfSUNIR1RJTUVfTU9EIHwgWEZTX0lDSEdUSU1FX0NIRyk7CisKKwl9IGVsc2UgeworCQkvKgorCQkgKiBXZSBhbHdheXMgd2FudCB0byBoaXQgdGhlIGN0aW1lIG9uIHRoZSBzb3VyY2UgaW5vZGUuCisJCSAqIFdlIGRvIGl0IGluIHRoZSBpZiBjbGF1c2UgYWJvdmUgZm9yIHRoZSAnbmV3X3BhcmVudCAmJgorCQkgKiBzcmNfaXNfZGlyZWN0b3J5JyBjYXNlLCBhbmQgaGVyZSB3ZSBnZXQgYWxsIHRoZSBvdGhlcgorCQkgKiBjYXNlcy4gIFRoaXMgaXNuJ3Qgc3RyaWN0bHkgcmVxdWlyZWQgYnkgdGhlIHN0YW5kYXJkcworCQkgKiBzaW5jZSB0aGUgc291cmNlIGlub2RlIGlzbid0IHJlYWxseSBiZWluZyBjaGFuZ2VkLAorCQkgKiBidXQgb2xkIHVuaXggZmlsZSBzeXN0ZW1zIGRpZCBpdCBhbmQgc29tZSBpbmNyZW1lbnRhbAorCQkgKiBiYWNrdXAgcHJvZ3JhbXMgd29uJ3Qgd29yayB3aXRob3V0IGl0LgorCQkgKi8KKwkJeGZzX2ljaGd0aW1lKHNyY19pcCwgWEZTX0lDSEdUSU1FX0NIRyk7CisJfQorCisJLyoKKwkgKiBBZGp1c3QgdGhlIGxpbmsgY291bnQgb24gc3JjX2RwLiAgVGhpcyBpcyBuZWNlc3Nhcnkgd2hlbgorCSAqIHJlbmFtaW5nIGEgZGlyZWN0b3J5LCBlaXRoZXIgd2l0aGluIG9uZSBwYXJlbnQgd2hlbgorCSAqIHRoZSB0YXJnZXQgZXhpc3RlZCwgb3IgYWNyb3NzIHR3byBwYXJlbnQgZGlyZWN0b3JpZXMuCisJICovCisJaWYgKHNyY19pc19kaXJlY3RvcnkgJiYgKG5ld19wYXJlbnQgfHwgdGFyZ2V0X2lwICE9IE5VTEwpKSB7CisKKwkJLyoKKwkJICogRGVjcmVtZW50IGxpbmsgY291bnQgb24gc3JjX2RpcmVjdG9yeSBzaW5jZSB0aGUKKwkJICogZW50cnkgdGhhdCdzIG1vdmVkIG5vIGxvbmdlciBwb2ludHMgdG8gaXQuCisJCSAqLworCQllcnJvciA9IHhmc19kcm9wbGluayh0cCwgc3JjX2RwKTsKKwkJaWYgKGVycm9yKSB7CisJCQlyZW5hbWVfd2hpY2hfZXJyb3JfcmV0dXJuID0gX19MSU5FX187CisJCQlnb3RvIGFib3J0X3JldHVybjsKKwkJfQorCX0KKworCWVycm9yID0gWEZTX0RJUl9SRU1PVkVOQU1FKG1wLCB0cCwgc3JjX2RwLCBzcmNfbmFtZSwgc3JjX25hbWVsZW4sCisJCQlzcmNfaXAtPmlfaW5vLCAmZmlyc3RfYmxvY2ssICZmcmVlX2xpc3QsIHNwYWNlcmVzKTsKKwlpZiAoZXJyb3IpIHsKKwkJcmVuYW1lX3doaWNoX2Vycm9yX3JldHVybiA9IF9fTElORV9fOworCQlnb3RvIGFib3J0X3JldHVybjsKKwl9CisJeGZzX2ljaGd0aW1lKHNyY19kcCwgWEZTX0lDSEdUSU1FX01PRCB8IFhGU19JQ0hHVElNRV9DSEcpOworCisJLyoKKwkgKiBVcGRhdGUgdGhlIGdlbmVyYXRpb24gY291bnRzIG9uIGFsbCB0aGUgZGlyZWN0b3J5IGlub2RlcworCSAqIHRoYXQgd2UncmUgbW9kaWZ5aW5nLgorCSAqLworCXNyY19kcC0+aV9nZW4rKzsKKwl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBzcmNfZHAsIFhGU19JTE9HX0NPUkUpOworCisJaWYgKG5ld19wYXJlbnQpIHsKKwkJdGFyZ2V0X2RwLT5pX2dlbisrOworCQl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCB0YXJnZXRfZHAsIFhGU19JTE9HX0NPUkUpOworCX0KKworCS8qCisJICogSWYgdGhlcmUgd2FzIGEgdGFyZ2V0IGlub2RlLCB0YWtlIGFuIGV4dHJhIHJlZmVyZW5jZSBvbgorCSAqIGl0IGhlcmUgc28gdGhhdCBpdCBkb2Vzbid0IGdvIHRvIHhmc19pbmFjdGl2ZSgpIGZyb20KKwkgKiB3aXRoaW4gdGhlIGNvbW1pdC4KKwkgKi8KKwlpZiAodGFyZ2V0X2lwICE9IE5VTEwpIHsKKwkJSUhPTEQodGFyZ2V0X2lwKTsKKwl9CisKKwkvKgorCSAqIElmIHRoaXMgaXMgYSBzeW5jaHJvbm91cyBtb3VudCwgbWFrZSBzdXJlIHRoYXQgdGhlCisJICogcmVuYW1lIHRyYW5zYWN0aW9uIGdvZXMgdG8gZGlzayBiZWZvcmUgcmV0dXJuaW5nIHRvCisJICogdGhlIHVzZXIuCisJICovCisJaWYgKG1wLT5tX2ZsYWdzICYgKFhGU19NT1VOVF9XU1lOQ3xYRlNfTU9VTlRfRElSU1lOQykpIHsKKwkJeGZzX3RyYW5zX3NldF9zeW5jKHRwKTsKKwl9CisKKwkvKgorCSAqIFRha2UgcmVmcy4gZm9yIHZvcF9saW5rX3JlbW92ZWQgY2FsbHMgYmVsb3cuICBObyBuZWVkIHRvIHdvcnJ5CisJICogYWJvdXQgZGlyZWN0b3J5IHJlZnMuIGJlY2F1c2UgdGhlIGNhbGxlciBob2xkcyB0aGVtLgorCSAqCisJICogRG8gaG9sZHMgYmVmb3JlIHRoZSB4ZnNfYm1hcF9maW5pc2ggc2luY2UgaXQgbWlnaHQgcmVsZSB0aGVtIGRvd24KKwkgKiB0byB6ZXJvLgorCSAqLworCisJaWYgKHRhcmdldF9pcF9kcm9wcGVkKQorCQlJSE9MRCh0YXJnZXRfaXApOworCUlIT0xEKHNyY19pcCk7CisKKwllcnJvciA9IHhmc19ibWFwX2ZpbmlzaCgmdHAsICZmcmVlX2xpc3QsIGZpcnN0X2Jsb2NrLCAmY29tbWl0dGVkKTsKKwlpZiAoZXJyb3IpIHsKKwkJeGZzX2JtYXBfY2FuY2VsKCZmcmVlX2xpc3QpOworCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCAoWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUyB8CisJCQkJIFhGU19UUkFOU19BQk9SVCkpOworCQlpZiAodGFyZ2V0X2lwICE9IE5VTEwpIHsKKwkJCUlSRUxFKHRhcmdldF9pcCk7CisJCX0KKwkJaWYgKHRhcmdldF9pcF9kcm9wcGVkKSB7CisJCQlJUkVMRSh0YXJnZXRfaXApOworCQl9CisJCUlSRUxFKHNyY19pcCk7CisJCWdvdG8gc3RkX3JldHVybjsKKwl9CisKKwkvKgorCSAqIHRyYW5zX2NvbW1pdCB3aWxsIHVubG9jayBzcmNfaXAsIHRhcmdldF9pcCAmIGRlY3JlbWVudAorCSAqIHRoZSB2bm9kZSByZWZlcmVuY2VzLgorCSAqLworCWVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwgWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUywgTlVMTCk7CisJaWYgKHRhcmdldF9pcCAhPSBOVUxMKSB7CisJCXhmc19yZWZjYWNoZV9wdXJnZV9pcCh0YXJnZXRfaXApOworCQlJUkVMRSh0YXJnZXRfaXApOworCX0KKwkvKgorCSAqIExldCBpbnRlcnBvc2VkIGZpbGUgc3lzdGVtcyBrbm93IGFib3V0IHJlbW92ZWQgbGlua3MuCisJICovCisJaWYgKHRhcmdldF9pcF9kcm9wcGVkKSB7CisJCVZPUF9MSU5LX1JFTU9WRUQoWEZTX0lUT1YodGFyZ2V0X2lwKSwgdGFyZ2V0X2Rpcl92cCwKKwkJCQkJdGFyZ2V0X2xpbmtfemVybyk7CisJCUlSRUxFKHRhcmdldF9pcCk7CisJfQorCisJRlNDX05PVElGWV9OQU1FX0NIQU5HRUQoWEZTX0lUT1Yoc3JjX2lwKSk7CisKKwlJUkVMRShzcmNfaXApOworCisJLyogRmFsbCB0aHJvdWdoIHRvIHN0ZF9yZXR1cm4gd2l0aCBlcnJvciA9IDAgb3IgZXJybm8gZnJvbQorCSAqIHhmc190cmFuc19jb21taXQJICovCitzdGRfcmV0dXJuOgorCWlmIChETV9FVkVOVF9FTkFCTEVEKHNyY19kaXJfdnAtPnZfdmZzcCwgc3JjX2RwLCBETV9FVkVOVF9QT1NUUkVOQU1FKSB8fAorCSAgICBETV9FVkVOVF9FTkFCTEVEKHRhcmdldF9kaXJfdnAtPnZfdmZzcCwKKwkJCQl0YXJnZXRfZHAsIERNX0VWRU5UX1BPU1RSRU5BTUUpKSB7CisJCSh2b2lkKSBYRlNfU0VORF9OQU1FU1AgKG1wLCBETV9FVkVOVF9QT1NUUkVOQU1FLAorCQkJCQlzcmNfZGlyX3ZwLCBETV9SSUdIVF9OVUxMLAorCQkJCQl0YXJnZXRfZGlyX3ZwLCBETV9SSUdIVF9OVUxMLAorCQkJCQlzcmNfbmFtZSwgdGFyZ2V0X25hbWUsCisJCQkJCTAsIGVycm9yLCAwKTsKKwl9CisJcmV0dXJuIGVycm9yOworCisgYWJvcnRfcmV0dXJuOgorCWNhbmNlbF9mbGFncyB8PSBYRlNfVFJBTlNfQUJPUlQ7CisJLyogRkFMTFRIUk9VR0ggKi8KKyBlcnJvcl9yZXR1cm46CisJeGZzX2JtYXBfY2FuY2VsKCZmcmVlX2xpc3QpOworCXhmc190cmFuc19jYW5jZWwodHAsIGNhbmNlbF9mbGFncyk7CisJZ290byBzdGRfcmV0dXJuOworCisgcmVsZV9yZXR1cm46CisJSVJFTEUoc3JjX2lwKTsKKwlpZiAodGFyZ2V0X2lwICE9IE5VTEwpIHsKKwkJSVJFTEUodGFyZ2V0X2lwKTsKKwl9CisJZ290byBzdGRfcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19ydGFsbG9jLmMgYi9mcy94ZnMveGZzX3J0YWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzM3ODIyCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19ydGFsbG9jLmMKQEAgLTAsMCArMSwyNDY5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisvKgorICogRnJlZSByZWFsdGltZSBzcGFjZSBhbGxvY2F0aW9uIGZvciBYRlMuCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jLmgiCisjaW5jbHVkZSAieGZzX2JtYXAuaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCisjaW5jbHVkZSAieGZzX3J0YWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfZnNvcHMuaCIKKyNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKKyNpbmNsdWRlICJ4ZnNfcncuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgorI2luY2x1ZGUgInhmc190cmFuc19zcGFjZS5oIgorCisKKy8qCisgKiBQcm90b3R5cGVzIGZvciBpbnRlcm5hbCBmdW5jdGlvbnMuCisgKi8KKworCitTVEFUSUMgaW50IHhmc19ydGFsbG9jYXRlX3JhbmdlKHhmc19tb3VudF90ICosIHhmc190cmFuc190ICosIHhmc19ydGJsb2NrX3QsCisJCXhmc19leHRsZW5fdCwgeGZzX2J1Zl90ICoqLCB4ZnNfZnNibG9ja190ICopOworU1RBVElDIGludCB4ZnNfcnRhbnlfc3VtbWFyeSh4ZnNfbW91bnRfdCAqLCB4ZnNfdHJhbnNfdCAqLCBpbnQsIGludCwKKwkJeGZzX3J0YmxvY2tfdCwgeGZzX2J1Zl90ICoqLCB4ZnNfZnNibG9ja190ICosIGludCAqKTsKK1NUQVRJQyBpbnQgeGZzX3J0Y2hlY2tfcmFuZ2UoeGZzX21vdW50X3QgKiwgeGZzX3RyYW5zX3QgKiwgeGZzX3J0YmxvY2tfdCwKKwkJeGZzX2V4dGxlbl90LCBpbnQsIHhmc19ydGJsb2NrX3QgKiwgaW50ICopOworU1RBVElDIGludCB4ZnNfcnRmaW5kX2JhY2soeGZzX21vdW50X3QgKiwgeGZzX3RyYW5zX3QgKiwgeGZzX3J0YmxvY2tfdCwKKwkJeGZzX3J0YmxvY2tfdCwgeGZzX3J0YmxvY2tfdCAqKTsKK1NUQVRJQyBpbnQgeGZzX3J0ZmluZF9mb3J3KHhmc19tb3VudF90ICosIHhmc190cmFuc190ICosIHhmc19ydGJsb2NrX3QsCisJCXhmc19ydGJsb2NrX3QsIHhmc19ydGJsb2NrX3QgKik7CitTVEFUSUMgaW50IHhmc19ydGdldF9zdW1tYXJ5KCB4ZnNfbW91bnRfdCAqLCB4ZnNfdHJhbnNfdCAqLCBpbnQsCisJCXhmc19ydGJsb2NrX3QsIHhmc19idWZfdCAqKiwgeGZzX2ZzYmxvY2tfdCAqLCB4ZnNfc3VtaW5mb190ICopOworU1RBVElDIGludCB4ZnNfcnRtb2RpZnlfcmFuZ2UoeGZzX21vdW50X3QgKiwgeGZzX3RyYW5zX3QgKiwgeGZzX3J0YmxvY2tfdCwKKwkJeGZzX2V4dGxlbl90LCBpbnQpOworU1RBVElDIGludCB4ZnNfcnRtb2RpZnlfc3VtbWFyeSh4ZnNfbW91bnRfdCAqLCB4ZnNfdHJhbnNfdCAqLCBpbnQsCisJCXhmc19ydGJsb2NrX3QsIGludCwgeGZzX2J1Zl90ICoqLCB4ZnNfZnNibG9ja190ICopOworCisvKgorICogSW50ZXJuYWwgZnVuY3Rpb25zLgorICovCisKKy8qCisgKiB4ZnNfbG93Yml0MzI6IGdldCBsb3cgYml0IHNldCBvdXQgb2YgMzItYml0IGFyZ3VtZW50LCAtMSBpZiBub25lIHNldC4KKyAqLworU1RBVElDIGludAoreGZzX2xvd2JpdDMyKAorCV9fdWludDMyX3QJdikKK3sKKwlpZiAodikKKwkJcmV0dXJuIGZmcyh2KSAtIDE7CisJcmV0dXJuIC0xOworfQorCisvKgorICogQWxsb2NhdGUgc3BhY2UgdG8gdGhlIGJpdG1hcCBvciBzdW1tYXJ5IGZpbGUsIGFuZCB6ZXJvIGl0LCBmb3IgZ3Jvd2ZzLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfZ3Jvd2ZzX3J0X2FsbG9jKAorCXhmc19tb3VudF90CSptcCwJCS8qIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50ICovCisJeGZzX2V4dGxlbl90CW9ibG9ja3MsCS8qIG9sZCBjb3VudCBvZiBibG9ja3MgKi8KKwl4ZnNfZXh0bGVuX3QJbmJsb2NrcywJLyogbmV3IGNvdW50IG9mIGJsb2NrcyAqLworCXhmc19pbm9fdAlpbm8pCQkvKiBpbm9kZSBudW1iZXIgKGJpdG1hcC9zdW1tYXJ5KSAqLworeworCXhmc19maWxlb2ZmX3QJYm5vOwkJLyogYmxvY2sgbnVtYmVyIGluIGZpbGUgKi8KKwl4ZnNfYnVmX3QJKmJwOwkJLyogdGVtcG9yYXJ5IGJ1ZmZlciBmb3IgemVyb2luZyAqLworCWludAkJY2FuY2VsZmxhZ3M7CS8qIGZsYWdzIGZvciB4ZnNfdHJhbnNfY2FuY2VsICovCisJaW50CQljb21taXR0ZWQ7CS8qIHRyYW5zYWN0aW9uIGNvbW1pdHRlZCBmbGFnICovCisJeGZzX2RhZGRyX3QJZDsJCS8qIGRpc2sgYmxvY2sgYWRkcmVzcyAqLworCWludAkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwl4ZnNfZnNibG9ja190CWZpcnN0YmxvY2s7CS8qIGZpcnN0IGJsb2NrIGFsbG9jYXRlZCBpbiB4YWN0aW9uICovCisJeGZzX2JtYXBfZnJlZV90CWZsaXN0OwkJLyogbGlzdCBvZiBmcmVlZCBibG9ja3MgKi8KKwl4ZnNfZnNibG9ja190CWZzYm5vOwkJLyogZmlsZXN5c3RlbSBibG9jayBmb3IgYm5vICovCisJeGZzX2lub2RlX3QJKmlwOwkJLyogcG9pbnRlciB0byBpbmNvcmUgaW5vZGUgKi8KKwl4ZnNfYm1idF9pcmVjX3QJbWFwOwkJLyogYmxvY2sgbWFwIG91dHB1dCAqLworCWludAkJbm1hcDsJCS8qIG51bWJlciBvZiBibG9jayBtYXBzICovCisJaW50CQlyZXNibGtzOwkvKiBzcGFjZSByZXNlcnZhdGlvbiAqLworCXhmc190cmFuc190CSp0cDsJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKworCS8qCisJICogQWxsb2NhdGUgc3BhY2UgdG8gdGhlIGZpbGUsIGFzIG5lY2Vzc2FyeS4KKwkgKi8KKwl3aGlsZSAob2Jsb2NrcyA8IG5ibG9ja3MpIHsKKwkJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19HUk9XRlNSVF9BTExPQyk7CisJCXJlc2Jsa3MgPSBYRlNfR1JPV0ZTUlRfU1BBQ0VfUkVTKG1wLCBuYmxvY2tzIC0gb2Jsb2Nrcyk7CisJCWNhbmNlbGZsYWdzID0gMDsKKwkJLyoKKwkJICogUmVzZXJ2ZSBzcGFjZSAmIGxvZyBmb3Igb25lIGV4dGVudCBhZGRlZCB0byB0aGUgZmlsZS4KKwkJICovCisJCWlmICgoZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgcmVzYmxrcywKKwkJCQlYRlNfR1JPV1JUQUxMT0NfTE9HX1JFUyhtcCksIDAsCisJCQkJWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywKKwkJCQlYRlNfREVGQVVMVF9QRVJNX0xPR19DT1VOVCkpKQorCQkJZ290byBlcnJvcl9leGl0OworCQljYW5jZWxmbGFncyA9IFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVM7CisJCS8qCisJCSAqIExvY2sgdGhlIGlub2RlLgorCQkgKi8KKwkJaWYgKChlcnJvciA9IHhmc190cmFuc19pZ2V0KG1wLCB0cCwgaW5vLCAwLCBYRlNfSUxPQ0tfRVhDTCwgJmlwKSkpCisJCQlnb3RvIGVycm9yX2V4aXQ7CisJCVhGU19CTUFQX0lOSVQoJmZsaXN0LCAmZmlyc3RibG9jayk7CisJCS8qCisJCSAqIEFsbG9jYXRlIGJsb2NrcyB0byB0aGUgYml0bWFwIGZpbGUuCisJCSAqLworCQlubWFwID0gMTsKKwkJY2FuY2VsZmxhZ3MgfD0gWEZTX1RSQU5TX0FCT1JUOworCQllcnJvciA9IHhmc19ibWFwaSh0cCwgaXAsIG9ibG9ja3MsIG5ibG9ja3MgLSBvYmxvY2tzLAorCQkJWEZTX0JNQVBJX1dSSVRFIHwgWEZTX0JNQVBJX01FVEFEQVRBLCAmZmlyc3RibG9jaywKKwkJCXJlc2Jsa3MsICZtYXAsICZubWFwLCAmZmxpc3QpOworCQlpZiAoIWVycm9yICYmIG5tYXAgPCAxKQorCQkJZXJyb3IgPSBYRlNfRVJST1IoRU5PU1BDKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBlcnJvcl9leGl0OworCQkvKgorCQkgKiBGcmVlIGFueSBibG9ja3MgZnJlZWQgdXAgaW4gdGhlIHRyYW5zYWN0aW9uLCB0aGVuIGNvbW1pdC4KKwkJICovCisJCWVycm9yID0geGZzX2JtYXBfZmluaXNoKCZ0cCwgJmZsaXN0LCBmaXJzdGJsb2NrLCAmY29tbWl0dGVkKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBlcnJvcl9leGl0OworCQl4ZnNfdHJhbnNfY29tbWl0KHRwLCBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTLCBOVUxMKTsKKwkJLyoKKwkJICogTm93IHdlIG5lZWQgdG8gY2xlYXIgdGhlIGFsbG9jYXRlZCBibG9ja3MuCisJCSAqIERvIHRoaXMgb25lIGJsb2NrIHBlciB0cmFuc2FjdGlvbiwgdG8ga2VlcCBpdCBzaW1wbGUuCisJCSAqLworCQljYW5jZWxmbGFncyA9IDA7CisJCWZvciAoYm5vID0gbWFwLmJyX3N0YXJ0b2ZmLCBmc2JubyA9IG1hcC5icl9zdGFydGJsb2NrOworCQkgICAgIGJubyA8IG1hcC5icl9zdGFydG9mZiArIG1hcC5icl9ibG9ja2NvdW50OworCQkgICAgIGJubysrLCBmc2JubysrKSB7CisJCQl0cCA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX0dST1dGU1JUX1pFUk8pOworCQkJLyoKKwkJCSAqIFJlc2VydmUgbG9nIGZvciBvbmUgYmxvY2sgemVyb2luZy4KKwkJCSAqLworCQkJaWYgKChlcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCAwLAorCQkJCQlYRlNfR1JPV1JUWkVST19MT0dfUkVTKG1wKSwgMCwgMCwgMCkpKQorCQkJCWdvdG8gZXJyb3JfZXhpdDsKKwkJCS8qCisJCQkgKiBMb2NrIHRoZSBiaXRtYXAgaW5vZGUuCisJCQkgKi8KKwkJCWlmICgoZXJyb3IgPSB4ZnNfdHJhbnNfaWdldChtcCwgdHAsIGlubywgMCwgWEZTX0lMT0NLX0VYQ0wsCisJCQkJCSZpcCkpKQorCQkJCWdvdG8gZXJyb3JfZXhpdDsKKwkJCS8qCisJCQkgKiBHZXQgYSBidWZmZXIgZm9yIHRoZSBibG9jay4KKwkJCSAqLworCQkJZCA9IFhGU19GU0JfVE9fREFERFIobXAsIGZzYm5vKTsKKwkJCWJwID0geGZzX3RyYW5zX2dldF9idWYodHAsIG1wLT5tX2RkZXZfdGFyZ3AsIGQsCisJCQkJbXAtPm1fYnNpemUsIDApOworCQkJaWYgKGJwID09IE5VTEwpIHsKKwkJCQllcnJvciA9IFhGU19FUlJPUihFSU8pOworCQkJCWdvdG8gZXJyb3JfZXhpdDsKKwkJCX0KKwkJCW1lbXNldChYRlNfQlVGX1BUUihicCksIDAsIG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSk7CisJCQl4ZnNfdHJhbnNfbG9nX2J1Zih0cCwgYnAsIDAsIG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSAtIDEpOworCQkJLyoKKwkJCSAqIENvbW1pdCB0aGUgdHJhbnNhY3Rpb24uCisJCQkgKi8KKwkJCXhmc190cmFuc19jb21taXQodHAsIDAsIE5VTEwpOworCQl9CisJCS8qCisJCSAqIEdvIG9uIHRvIHRoZSBuZXh0IGV4dGVudCwgaWYgYW55LgorCQkgKi8KKwkJb2Jsb2NrcyA9IG1hcC5icl9zdGFydG9mZiArIG1hcC5icl9ibG9ja2NvdW50OworCX0KKwlyZXR1cm4gMDsKK2Vycm9yX2V4aXQ6CisJeGZzX3RyYW5zX2NhbmNlbCh0cCwgY2FuY2VsZmxhZ3MpOworCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIEF0dGVtcHQgdG8gYWxsb2NhdGUgYW4gZXh0ZW50IG1pbmxlbjw9bGVuPD1tYXhsZW4gc3RhcnRpbmcgZnJvbQorICogYml0bWFwIGJsb2NrIGJibm8uICBJZiB3ZSBkb24ndCBnZXQgbWF4bGVuIHRoZW4gdXNlIHByb2QgdG8gdHJpbQorICogdGhlIGxlbmd0aCwgaWYgZ2l2ZW4uICBSZXR1cm5zIGVycm9yOyByZXR1cm5zIHN0YXJ0aW5nIGJsb2NrIGluICpydGJsb2NrLgorICogVGhlIGxlbmd0aHMgYXJlIGFsbCBpbiBydGV4dGVudHMuCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19ydGFsbG9jYXRlX2V4dGVudF9ibG9jaygKKwl4ZnNfbW91bnRfdAkqbXAsCQkvKiBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfcnRibG9ja190CWJibm8sCQkvKiBiaXRtYXAgYmxvY2sgbnVtYmVyICovCisJeGZzX2V4dGxlbl90CW1pbmxlbiwJCS8qIG1pbmltdW0gbGVuZ3RoIHRvIGFsbG9jYXRlICovCisJeGZzX2V4dGxlbl90CW1heGxlbiwJCS8qIG1heGltdW0gbGVuZ3RoIHRvIGFsbG9jYXRlICovCisJeGZzX2V4dGxlbl90CSpsZW4sCQkvKiBvdXQ6IGFjdHVhbCBsZW5ndGggYWxsb2NhdGVkICovCisJeGZzX3J0YmxvY2tfdAkqbmV4dHAsCQkvKiBvdXQ6IG5leHQgYmxvY2sgdG8gdHJ5ICovCisJeGZzX2J1Zl90CSoqcmJwcCwJCS8qIGluL291dDogc3VtbWFyeSBibG9jayBidWZmZXIgKi8KKwl4ZnNfZnNibG9ja190CSpyc2IsCQkvKiBpbi9vdXQ6IHN1bW1hcnkgYmxvY2sgbnVtYmVyICovCisJeGZzX2V4dGxlbl90CXByb2QsCQkvKiBleHRlbnQgcHJvZHVjdCBmYWN0b3IgKi8KKwl4ZnNfcnRibG9ja190CSpydGJsb2NrKQkvKiBvdXQ6IHN0YXJ0IGJsb2NrIGFsbG9jYXRlZCAqLworeworCXhmc19ydGJsb2NrX3QJYmVzdGk7CQkvKiBiZXN0IHJ0YmxvY2sgZm91bmQgc28gZmFyICovCisJeGZzX3J0YmxvY2tfdAliZXN0bGVuOwkvKiBiZXN0IGxlbmd0aCBmb3VuZCBzbyBmYXIgKi8KKwl4ZnNfcnRibG9ja190CWVuZDsJCS8qIGxhc3QgcnRibG9jayBpbiBjaHVuayAqLworCWludAkJZXJyb3I7CQkvKiBlcnJvciB2YWx1ZSAqLworCXhmc19ydGJsb2NrX3QJaTsJCS8qIGN1cnJlbnQgcnRibG9jayB0cnlpbmcgKi8KKwl4ZnNfcnRibG9ja190CW5leHQ7CQkvKiBuZXh0IHJ0YmxvY2sgdG8gdHJ5ICovCisJaW50CQlzdGF0OwkJLyogc3RhdHVzIGZyb20gaW50ZXJuYWwgY2FsbHMgKi8KKworCS8qCisJICogTG9vcCBvdmVyIGFsbCB0aGUgZXh0ZW50cyBzdGFydGluZyBpbiB0aGlzIGJpdG1hcCBibG9jaywKKwkgKiBsb29raW5nIGZvciBvbmUgdGhhdCdzIGxvbmcgZW5vdWdoLgorCSAqLworCWZvciAoaSA9IFhGU19CTE9DS1RPQklUKG1wLCBiYm5vKSwgYmVzdGkgPSAtMSwgYmVzdGxlbiA9IDAsCisJCWVuZCA9IFhGU19CTE9DS1RPQklUKG1wLCBiYm5vICsgMSkgLSAxOworCSAgICAgaSA8PSBlbmQ7CisJICAgICBpKyspIHsKKwkJLyoKKwkJICogU2VlIGlmIHRoZXJlJ3MgYSBmcmVlIGV4dGVudCBvZiBtYXhsZW4gc3RhcnRpbmcgYXQgaS4KKwkJICogSWYgaXQncyBub3Qgc28gdGhlbiBuZXh0IHdpbGwgY29udGFpbiB0aGUgZmlyc3Qgbm9uLWZyZWUuCisJCSAqLworCQllcnJvciA9IHhmc19ydGNoZWNrX3JhbmdlKG1wLCB0cCwgaSwgbWF4bGVuLCAxLCAmbmV4dCwgJnN0YXQpOworCQlpZiAoZXJyb3IpIHsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQlpZiAoc3RhdCkgeworCQkJLyoKKwkJCSAqIGkgZm9yIG1heGxlbiBpcyBhbGwgZnJlZSwgYWxsb2NhdGUgYW5kIHJldHVybiB0aGF0LgorCQkJICovCisJCQllcnJvciA9IHhmc19ydGFsbG9jYXRlX3JhbmdlKG1wLCB0cCwgaSwgbWF4bGVuLCByYnBwLAorCQkJCXJzYik7CisJCQlpZiAoZXJyb3IpIHsKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQl9CisJCQkqbGVuID0gbWF4bGVuOworCQkJKnJ0YmxvY2sgPSBpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJLyoKKwkJICogSW4gdGhlIGNhc2Ugd2hlcmUgd2UgaGF2ZSBhIHZhcmlhYmxlLXNpemVkIGFsbG9jYXRpb24KKwkJICogcmVxdWVzdCwgZmlndXJlIG91dCBob3cgYmlnIHRoaXMgZnJlZSBwaWVjZSBpcywKKwkJICogYW5kIGlmIGl0J3MgYmlnIGVub3VnaCBmb3IgdGhlIG1pbmltdW0sIGFuZCB0aGUgYmVzdAorCQkgKiBzbyBmYXIsIHJlbWVtYmVyIGl0LgorCQkgKi8KKwkJaWYgKG1pbmxlbiA8IG1heGxlbikgeworCQkJeGZzX3J0YmxvY2tfdAl0aGlzbGVuOwkvKiB0aGlzIGV4dGVudCBzaXplICovCisKKwkJCXRoaXNsZW4gPSBuZXh0IC0gaTsKKwkJCWlmICh0aGlzbGVuID49IG1pbmxlbiAmJiB0aGlzbGVuID4gYmVzdGxlbikgeworCQkJCWJlc3RpID0gaTsKKwkJCQliZXN0bGVuID0gdGhpc2xlbjsKKwkJCX0KKwkJfQorCQkvKgorCQkgKiBJZiBub3QgZG9uZSB5ZXQsIGZpbmQgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGZyZWUgc3BhY2UuCisJCSAqLworCQlpZiAobmV4dCA8IGVuZCkgeworCQkJZXJyb3IgPSB4ZnNfcnRmaW5kX2ZvcncobXAsIHRwLCBuZXh0LCBlbmQsICZpKTsKKwkJCWlmIChlcnJvcikgeworCQkJCXJldHVybiBlcnJvcjsKKwkJCX0KKwkJfSBlbHNlCisJCQlicmVhazsKKwl9CisJLyoKKwkgKiBTZWFyY2hlZCB0aGUgd2hvbGUgdGhpbmcgJiBkaWRuJ3QgZmluZCBhIG1heGxlbiBmcmVlIGV4dGVudC4KKwkgKi8KKwlpZiAobWlubGVuIDwgbWF4bGVuICYmIGJlc3RpICE9IC0xKSB7CisJCXhmc19leHRsZW5fdAlwOwkvKiBhbW91bnQgdG8gdHJpbSBsZW5ndGggYnkgKi8KKworCQkvKgorCQkgKiBJZiBzaXplIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIHByb2QsIG1ha2UgdGhhdCBzby4KKwkJICovCisJCWlmIChwcm9kID4gMSAmJiAocCA9IGRvX21vZChiZXN0bGVuLCBwcm9kKSkpCisJCQliZXN0bGVuIC09IHA7CisJCS8qCisJCSAqIEFsbG9jYXRlIGJlc3RpIGZvciBiZXN0bGVuICYgcmV0dXJuIHRoYXQuCisJCSAqLworCQllcnJvciA9IHhmc19ydGFsbG9jYXRlX3JhbmdlKG1wLCB0cCwgYmVzdGksIGJlc3RsZW4sIHJicHAsIHJzYik7CisJCWlmIChlcnJvcikgeworCQkJcmV0dXJuIGVycm9yOworCQl9CisJCSpsZW4gPSBiZXN0bGVuOworCQkqcnRibG9jayA9IGJlc3RpOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBBbGxvY2F0aW9uIGZhaWxlZC4gIFNldCAqbmV4dHAgdG8gdGhlIG5leHQgYmxvY2sgdG8gdHJ5LgorCSAqLworCSpuZXh0cCA9IG5leHQ7CisJKnJ0YmxvY2sgPSBOVUxMUlRCTE9DSzsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEFsbG9jYXRlIGFuIGV4dGVudCBvZiBsZW5ndGggbWlubGVuPD1sZW48PW1heGxlbiwgc3RhcnRpbmcgYXQgYmxvY2sKKyAqIGJuby4gIElmIHdlIGRvbid0IGdldCBtYXhsZW4gdGhlbiB1c2UgcHJvZCB0byB0cmltIHRoZSBsZW5ndGgsIGlmIGdpdmVuLgorICogUmV0dXJucyBlcnJvcjsgcmV0dXJucyBzdGFydGluZyBibG9jayBpbiAqcnRibG9jay4KKyAqIFRoZSBsZW5ndGhzIGFyZSBhbGwgaW4gcnRleHRlbnRzLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfcnRhbGxvY2F0ZV9leHRlbnRfZXhhY3QoCisJeGZzX21vdW50X3QJKm1wLAkJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX3J0YmxvY2tfdAlibm8sCQkvKiBzdGFydGluZyBibG9jayBudW1iZXIgdG8gYWxsb2NhdGUgKi8KKwl4ZnNfZXh0bGVuX3QJbWlubGVuLAkJLyogbWluaW11bSBsZW5ndGggdG8gYWxsb2NhdGUgKi8KKwl4ZnNfZXh0bGVuX3QJbWF4bGVuLAkJLyogbWF4aW11bSBsZW5ndGggdG8gYWxsb2NhdGUgKi8KKwl4ZnNfZXh0bGVuX3QJKmxlbiwJCS8qIG91dDogYWN0dWFsIGxlbmd0aCBhbGxvY2F0ZWQgKi8KKwl4ZnNfYnVmX3QJKipyYnBwLAkJLyogaW4vb3V0OiBzdW1tYXJ5IGJsb2NrIGJ1ZmZlciAqLworCXhmc19mc2Jsb2NrX3QJKnJzYiwJCS8qIGluL291dDogc3VtbWFyeSBibG9jayBudW1iZXIgKi8KKwl4ZnNfZXh0bGVuX3QJcHJvZCwJCS8qIGV4dGVudCBwcm9kdWN0IGZhY3RvciAqLworCXhmc19ydGJsb2NrX3QJKnJ0YmxvY2spCS8qIG91dDogc3RhcnQgYmxvY2sgYWxsb2NhdGVkICovCit7CisJaW50CQllcnJvcjsJCS8qIGVycm9yIHZhbHVlICovCisJeGZzX2V4dGxlbl90CWk7CQkvKiBleHRlbnQgbGVuZ3RoIHRyaW1tZWQgZHVlIHRvIHByb2QgKi8KKwlpbnQJCWlzZnJlZTsJCS8qIGV4dGVudCBpcyBmcmVlICovCisJeGZzX3J0YmxvY2tfdAluZXh0OwkJLyogbmV4dCBibG9jayB0byB0cnkgKGR1bW15KSAqLworCisJQVNTRVJUKG1pbmxlbiAlIHByb2QgPT0gMCAmJiBtYXhsZW4gJSBwcm9kID09IDApOworCS8qCisJICogQ2hlY2sgaWYgdGhlIHJhbmdlIGluIHF1ZXN0aW9uIChmb3IgbWF4bGVuKSBpcyBmcmVlLgorCSAqLworCWVycm9yID0geGZzX3J0Y2hlY2tfcmFuZ2UobXAsIHRwLCBibm8sIG1heGxlbiwgMSwgJm5leHQsICZpc2ZyZWUpOworCWlmIChlcnJvcikgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCWlmIChpc2ZyZWUpIHsKKwkJLyoKKwkJICogSWYgaXQgaXMsIGFsbG9jYXRlIGl0IGFuZCByZXR1cm4gc3VjY2Vzcy4KKwkJICovCisJCWVycm9yID0geGZzX3J0YWxsb2NhdGVfcmFuZ2UobXAsIHRwLCBibm8sIG1heGxlbiwgcmJwcCwgcnNiKTsKKwkJaWYgKGVycm9yKSB7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJKmxlbiA9IG1heGxlbjsKKwkJKnJ0YmxvY2sgPSBibm87CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIElmIG5vdCwgYWxsb2NhdGUgd2hhdCB0aGVyZSBpcywgaWYgaXQncyBhdCBsZWFzdCBtaW5sZW4uCisJICovCisJbWF4bGVuID0gbmV4dCAtIGJubzsKKwlpZiAobWF4bGVuIDwgbWlubGVuKSB7CisJCS8qCisJCSAqIEZhaWxlZCwgcmV0dXJuIGZhaWx1cmUgc3RhdHVzLgorCQkgKi8KKwkJKnJ0YmxvY2sgPSBOVUxMUlRCTE9DSzsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogVHJpbSBvZmYgdGFpbCBvZiBleHRlbnQsIGlmIHByb2QgaXMgc3BlY2lmaWVkLgorCSAqLworCWlmIChwcm9kID4gMSAmJiAoaSA9IG1heGxlbiAlIHByb2QpKSB7CisJCW1heGxlbiAtPSBpOworCQlpZiAobWF4bGVuIDwgbWlubGVuKSB7CisJCQkvKgorCQkJICogTm93IHdlIGNhbid0IGRvIGl0LCByZXR1cm4gZmFpbHVyZSBzdGF0dXMuCisJCQkgKi8KKwkJCSpydGJsb2NrID0gTlVMTFJUQkxPQ0s7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwkvKgorCSAqIEFsbG9jYXRlIHdoYXQgd2UgY2FuIGFuZCByZXR1cm4gaXQuCisJICovCisJZXJyb3IgPSB4ZnNfcnRhbGxvY2F0ZV9yYW5nZShtcCwgdHAsIGJubywgbWF4bGVuLCByYnBwLCByc2IpOworCWlmIChlcnJvcikgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCSpsZW4gPSBtYXhsZW47CisJKnJ0YmxvY2sgPSBibm87CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBhbiBleHRlbnQgb2YgbGVuZ3RoIG1pbmxlbjw9bGVuPD1tYXhsZW4sIHN0YXJ0aW5nIGFzIG5lYXIKKyAqIHRvIGJubyBhcyBwb3NzaWJsZS4gIElmIHdlIGRvbid0IGdldCBtYXhsZW4gdGhlbiB1c2UgcHJvZCB0byB0cmltCisgKiB0aGUgbGVuZ3RoLCBpZiBnaXZlbi4gIFRoZSBsZW5ndGhzIGFyZSBhbGwgaW4gcnRleHRlbnRzLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfcnRhbGxvY2F0ZV9leHRlbnRfbmVhcigKKwl4ZnNfbW91bnRfdAkqbXAsCQkvKiBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfcnRibG9ja190CWJubywJCS8qIHN0YXJ0aW5nIGJsb2NrIG51bWJlciB0byBhbGxvY2F0ZSAqLworCXhmc19leHRsZW5fdAltaW5sZW4sCQkvKiBtaW5pbXVtIGxlbmd0aCB0byBhbGxvY2F0ZSAqLworCXhmc19leHRsZW5fdAltYXhsZW4sCQkvKiBtYXhpbXVtIGxlbmd0aCB0byBhbGxvY2F0ZSAqLworCXhmc19leHRsZW5fdAkqbGVuLAkJLyogb3V0OiBhY3R1YWwgbGVuZ3RoIGFsbG9jYXRlZCAqLworCXhmc19idWZfdAkqKnJicHAsCQkvKiBpbi9vdXQ6IHN1bW1hcnkgYmxvY2sgYnVmZmVyICovCisJeGZzX2ZzYmxvY2tfdAkqcnNiLAkJLyogaW4vb3V0OiBzdW1tYXJ5IGJsb2NrIG51bWJlciAqLworCXhmc19leHRsZW5fdAlwcm9kLAkJLyogZXh0ZW50IHByb2R1Y3QgZmFjdG9yICovCisJeGZzX3J0YmxvY2tfdAkqcnRibG9jaykJLyogb3V0OiBzdGFydCBibG9jayBhbGxvY2F0ZWQgKi8KK3sKKwlpbnQJCWFueTsJCS8qIGFueSB1c2VmdWwgZXh0ZW50cyBmcm9tIHN1bW1hcnkgKi8KKwl4ZnNfcnRibG9ja190CWJibm87CQkvKiBiaXRtYXAgYmxvY2sgbnVtYmVyICovCisJaW50CQllcnJvcjsJCS8qIGVycm9yIHZhbHVlICovCisJaW50CQlpOwkJLyogYml0bWFwIGJsb2NrIG9mZnNldCAobG9vcCBjb250cm9sKSAqLworCWludAkJajsJCS8qIHNlY29uZGFyeSBsb29wIGNvbnRyb2wgKi8KKwlpbnQJCWxvZzJsZW47CS8qIGxvZzIgb2YgbWlubGVuICovCisJeGZzX3J0YmxvY2tfdAluOwkJLyogbmV4dCBibG9jayB0byB0cnkgKi8KKwl4ZnNfcnRibG9ja190CXI7CQkvKiByZXN1bHQgYmxvY2sgKi8KKworCUFTU0VSVChtaW5sZW4gJSBwcm9kID09IDAgJiYgbWF4bGVuICUgcHJvZCA9PSAwKTsKKwkvKgorCSAqIElmIHRoZSBibG9jayBudW1iZXIgZ2l2ZW4gaXMgb2ZmIHRoZSBlbmQsIHNpbGVudGx5IHNldCBpdCB0bworCSAqIHRoZSBsYXN0IGJsb2NrLgorCSAqLworCWlmIChibm8gPj0gbXAtPm1fc2Iuc2JfcmV4dGVudHMpCisJCWJubyA9IG1wLT5tX3NiLnNiX3JleHRlbnRzIC0gMTsKKwkvKgorCSAqIFRyeSB0aGUgZXhhY3QgYWxsb2NhdGlvbiBmaXJzdC4KKwkgKi8KKwllcnJvciA9IHhmc19ydGFsbG9jYXRlX2V4dGVudF9leGFjdChtcCwgdHAsIGJubywgbWlubGVuLCBtYXhsZW4sIGxlbiwKKwkJcmJwcCwgcnNiLCBwcm9kLCAmcik7CisJaWYgKGVycm9yKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJLyoKKwkgKiBJZiB0aGUgZXhhY3QgYWxsb2NhdGlvbiB3b3JrZWQsIHJldHVybiB0aGF0LgorCSAqLworCWlmIChyICE9IE5VTExSVEJMT0NLKSB7CisJCSpydGJsb2NrID0gcjsKKwkJcmV0dXJuIDA7CisJfQorCWJibm8gPSBYRlNfQklUVE9CTE9DSyhtcCwgYm5vKTsKKwlpID0gMDsKKwlsb2cybGVuID0geGZzX2hpZ2hiaXQzMihtaW5sZW4pOworCS8qCisJICogTG9vcCBvdmVyIGFsbCBiaXRtYXAgYmxvY2tzIChiYm5vICsgaSBpcyBjdXJyZW50IGJsb2NrKS4KKwkgKi8KKwlmb3IgKDs7KSB7CisJCS8qCisJCSAqIEdldCBzdW1tYXJ5IGluZm9ybWF0aW9uIG9mIGV4dGVudHMgb2YgYWxsIHVzZWZ1bCBsZXZlbHMKKwkJICogc3RhcnRpbmcgaW4gdGhpcyBiaXRtYXAgYmxvY2suCisJCSAqLworCQllcnJvciA9IHhmc19ydGFueV9zdW1tYXJ5KG1wLCB0cCwgbG9nMmxlbiwgbXAtPm1fcnN1bWxldmVscyAtIDEsCisJCQliYm5vICsgaSwgcmJwcCwgcnNiLCAmYW55KTsKKwkJaWYgKGVycm9yKSB7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJLyoKKwkJICogSWYgdGhlcmUgYXJlIGFueSB1c2VmdWwgZXh0ZW50cyBzdGFydGluZyBoZXJlLCB0cnkKKwkJICogYWxsb2NhdGluZyBvbmUuCisJCSAqLworCQlpZiAoYW55KSB7CisJCQkvKgorCQkJICogT24gdGhlIHBvc2l0aXZlIHNpZGUgb2YgdGhlIHN0YXJ0aW5nIGxvY2F0aW9uLgorCQkJICovCisJCQlpZiAoaSA+PSAwKSB7CisJCQkJLyoKKwkJCQkgKiBUcnkgdG8gYWxsb2NhdGUgYW4gZXh0ZW50IHN0YXJ0aW5nIGluCisJCQkJICogdGhpcyBibG9jay4KKwkJCQkgKi8KKwkJCQllcnJvciA9IHhmc19ydGFsbG9jYXRlX2V4dGVudF9ibG9jayhtcCwgdHAsCisJCQkJCWJibm8gKyBpLCBtaW5sZW4sIG1heGxlbiwgbGVuLCAmbiwgcmJwcCwKKwkJCQkJcnNiLCBwcm9kLCAmcik7CisJCQkJaWYgKGVycm9yKSB7CisJCQkJCXJldHVybiBlcnJvcjsKKwkJCQl9CisJCQkJLyoKKwkJCQkgKiBJZiBpdCB3b3JrZWQsIHJldHVybiBpdC4KKwkJCQkgKi8KKwkJCQlpZiAociAhPSBOVUxMUlRCTE9DSykgeworCQkJCQkqcnRibG9jayA9IHI7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKwkJCS8qCisJCQkgKiBPbiB0aGUgbmVnYXRpdmUgc2lkZSBvZiB0aGUgc3RhcnRpbmcgbG9jYXRpb24uCisJCQkgKi8KKwkJCWVsc2UgewkJLyogaSA8IDAgKi8KKwkJCQkvKgorCQkJCSAqIExvb3AgYmFja3dhcmRzIHRocm91Z2ggdGhlIGJpdG1hcCBibG9ja3MgZnJvbQorCQkJCSAqIHRoZSBzdGFydGluZyBwb2ludC0xIHVwIHRvIHdoZXJlIHdlIGFyZSBub3cuCisJCQkJICogVGhlcmUgc2hvdWxkIGJlIGFuIGV4dGVudCB3aGljaCBlbmRzIGluIHRoaXMKKwkJCQkgKiBiaXRtYXAgYmxvY2sgYW5kIGlzIGxvbmcgZW5vdWdoLgorCQkJCSAqLworCQkJCWZvciAoaiA9IC0xOyBqID4gaTsgai0tKSB7CisJCQkJCS8qCisJCQkJCSAqIEdyYWIgdGhlIHN1bW1hcnkgaW5mb3JtYXRpb24gZm9yCisJCQkJCSAqIHRoaXMgYml0bWFwIGJsb2NrLgorCQkJCQkgKi8KKwkJCQkJZXJyb3IgPSB4ZnNfcnRhbnlfc3VtbWFyeShtcCwgdHAsCisJCQkJCQlsb2cybGVuLCBtcC0+bV9yc3VtbGV2ZWxzIC0gMSwKKwkJCQkJCWJibm8gKyBqLCByYnBwLCByc2IsICZhbnkpOworCQkJCQlpZiAoZXJyb3IpIHsKKwkJCQkJCXJldHVybiBlcnJvcjsKKwkJCQkJfQorCQkJCQkvKgorCQkJCQkgKiBJZiB0aGVyZSdzIG5vIGV4dGVudCBnaXZlbiBpbiB0aGUKKwkJCQkJICogc3VtbWFyeSB0aGF0IG1lYW5zIHRoZSBleHRlbnQgd2UKKwkJCQkJICogZm91bmQgbXVzdCBjYXJyeSBvdmVyIGZyb20gYW4KKwkJCQkJICogZWFybGllciBibG9jay4gIElmIHRoZXJlIGlzIGFuCisJCQkJCSAqIGV4dGVudCBnaXZlbiwgd2UndmUgYWxyZWFkeSB0cmllZAorCQkJCQkgKiB0aGF0IGFsbG9jYXRpb24sIGRvbid0IGRvIGl0IGFnYWluLgorCQkJCQkgKi8KKwkJCQkJaWYgKGFueSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQllcnJvciA9IHhmc19ydGFsbG9jYXRlX2V4dGVudF9ibG9jayhtcCwKKwkJCQkJCXRwLCBiYm5vICsgaiwgbWlubGVuLCBtYXhsZW4sCisJCQkJCQlsZW4sICZuLCByYnBwLCByc2IsIHByb2QsICZyKTsKKwkJCQkJaWYgKGVycm9yKSB7CisJCQkJCQlyZXR1cm4gZXJyb3I7CisJCQkJCX0KKwkJCQkJLyoKKwkJCQkJICogSWYgaXQgd29ya3MsIHJldHVybiB0aGUgZXh0ZW50LgorCQkJCQkgKi8KKwkJCQkJaWYgKHIgIT0gTlVMTFJUQkxPQ0spIHsKKwkJCQkJCSpydGJsb2NrID0gcjsKKwkJCQkJCXJldHVybiAwOworCQkJCQl9CisJCQkJfQorCQkJCS8qCisJCQkJICogVGhlcmUgd2VyZW4ndCBpbnRlcnZlbmluZyBiaXRtYXAgYmxvY2tzCisJCQkJICogd2l0aCBhIGxvbmcgZW5vdWdoIGV4dGVudCwgb3IgdGhlCisJCQkJICogYWxsb2NhdGlvbiBkaWRuJ3Qgd29yayBmb3Igc29tZSByZWFzb24KKwkJCQkgKiAoaS5lLiBpdCdzIGEgbGl0dGxlICogdG9vIHNob3J0KS4KKwkJCQkgKiBUcnkgdG8gYWxsb2NhdGUgZnJvbSB0aGUgc3VtbWFyeSBibG9jaworCQkJCSAqIHRoYXQgd2UgZm91bmQuCisJCQkJICovCisJCQkJZXJyb3IgPSB4ZnNfcnRhbGxvY2F0ZV9leHRlbnRfYmxvY2sobXAsIHRwLAorCQkJCQliYm5vICsgaSwgbWlubGVuLCBtYXhsZW4sIGxlbiwgJm4sIHJicHAsCisJCQkJCXJzYiwgcHJvZCwgJnIpOworCQkJCWlmIChlcnJvcikgeworCQkJCQlyZXR1cm4gZXJyb3I7CisJCQkJfQorCQkJCS8qCisJCQkJICogSWYgaXQgd29ya3MsIHJldHVybiB0aGUgZXh0ZW50LgorCQkJCSAqLworCQkJCWlmIChyICE9IE5VTExSVEJMT0NLKSB7CisJCQkJCSpydGJsb2NrID0gcjsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorCQl9CisJCS8qCisJCSAqIExvb3AgY29udHJvbC4gIElmIHdlIHdlcmUgb24gdGhlIHBvc2l0aXZlIHNpZGUsIGFuZCB0aGVyZSdzCisJCSAqIHN0aWxsIG1vcmUgYmxvY2tzIG9uIHRoZSBuZWdhdGl2ZSBzaWRlLCBnbyB0aGVyZS4KKwkJICovCisJCWlmIChpID4gMCAmJiAoaW50KWJibm8gLSBpID49IDApCisJCQlpID0gLWk7CisJCS8qCisJCSAqIElmIHBvc2l0aXZlLCBhbmQgbm8gbW9yZSBuZWdhdGl2ZSwgYnV0IHRoZXJlIGFyZSBtb3JlCisJCSAqIHBvc2l0aXZlLCBnbyB0aGVyZS4KKwkJICovCisJCWVsc2UgaWYgKGkgPiAwICYmIChpbnQpYmJubyArIGkgPCBtcC0+bV9zYi5zYl9yYm1ibG9ja3MgLSAxKQorCQkJaSsrOworCQkvKgorCQkgKiBJZiBuZWdhdGl2ZSBvciAwIChqdXN0IHN0YXJ0ZWQpLCBhbmQgdGhlcmUgYXJlIHBvc2l0aXZlCisJCSAqIGJsb2NrcyB0byBnbywgZ28gdGhlcmUuICBUaGUgMCBjYXNlIG1vdmVzIHRvIGJsb2NrIDEuCisJCSAqLworCQllbHNlIGlmIChpIDw9IDAgJiYgKGludCliYm5vIC0gaSA8IG1wLT5tX3NiLnNiX3JibWJsb2NrcyAtIDEpCisJCQlpID0gMSAtIGk7CisJCS8qCisJCSAqIElmIG5lZ2F0aXZlIG9yIDAgYW5kIHRoZXJlIGFyZSBtb3JlIG5lZ2F0aXZlIGJsb2NrcywKKwkJICogZ28gdGhlcmUuCisJCSAqLworCQllbHNlIGlmIChpIDw9IDAgJiYgKGludCliYm5vICsgaSA+IDApCisJCQlpLS07CisJCS8qCisJCSAqIE11c3QgYmUgZG9uZS4gIFJldHVybiBmYWlsdXJlLgorCQkgKi8KKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCSpydGJsb2NrID0gTlVMTFJUQkxPQ0s7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBhbiBleHRlbnQgb2YgbGVuZ3RoIG1pbmxlbjw9bGVuPD1tYXhsZW4sIHdpdGggbm8gcG9zaXRpb24KKyAqIHNwZWNpZmllZC4gIElmIHdlIGRvbid0IGdldCBtYXhsZW4gdGhlbiB1c2UgcHJvZCB0byB0cmltCisgKiB0aGUgbGVuZ3RoLCBpZiBnaXZlbi4gIFRoZSBsZW5ndGhzIGFyZSBhbGwgaW4gcnRleHRlbnRzLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfcnRhbGxvY2F0ZV9leHRlbnRfc2l6ZSgKKwl4ZnNfbW91bnRfdAkqbXAsCQkvKiBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfZXh0bGVuX3QJbWlubGVuLAkJLyogbWluaW11bSBsZW5ndGggdG8gYWxsb2NhdGUgKi8KKwl4ZnNfZXh0bGVuX3QJbWF4bGVuLAkJLyogbWF4aW11bSBsZW5ndGggdG8gYWxsb2NhdGUgKi8KKwl4ZnNfZXh0bGVuX3QJKmxlbiwJCS8qIG91dDogYWN0dWFsIGxlbmd0aCBhbGxvY2F0ZWQgKi8KKwl4ZnNfYnVmX3QJKipyYnBwLAkJLyogaW4vb3V0OiBzdW1tYXJ5IGJsb2NrIGJ1ZmZlciAqLworCXhmc19mc2Jsb2NrX3QJKnJzYiwJCS8qIGluL291dDogc3VtbWFyeSBibG9jayBudW1iZXIgKi8KKwl4ZnNfZXh0bGVuX3QJcHJvZCwJCS8qIGV4dGVudCBwcm9kdWN0IGZhY3RvciAqLworCXhmc19ydGJsb2NrX3QJKnJ0YmxvY2spCS8qIG91dDogc3RhcnQgYmxvY2sgYWxsb2NhdGVkICovCit7CisJaW50CQllcnJvcjsJCS8qIGVycm9yIHZhbHVlICovCisJaW50CQlpOwkJLyogYml0bWFwIGJsb2NrIG51bWJlciAqLworCWludAkJbDsJCS8qIGxldmVsIG51bWJlciAobG9vcCBjb250cm9sKSAqLworCXhmc19ydGJsb2NrX3QJbjsJCS8qIG5leHQgYmxvY2sgdG8gYmUgdHJpZWQgKi8KKwl4ZnNfcnRibG9ja190CXI7CQkvKiByZXN1bHQgYmxvY2sgbnVtYmVyICovCisJeGZzX3N1bWluZm9fdAlzdW07CQkvKiBzdW1tYXJ5IGluZm9ybWF0aW9uIGZvciBleHRlbnRzICovCisKKwlBU1NFUlQobWlubGVuICUgcHJvZCA9PSAwICYmIG1heGxlbiAlIHByb2QgPT0gMCk7CisJLyoKKwkgKiBMb29wIG92ZXIgYWxsIHRoZSBsZXZlbHMgc3RhcnRpbmcgd2l0aCBtYXhsZW4uCisJICogQXQgZWFjaCBsZXZlbCwgbG9vayBhdCBhbGwgdGhlIGJpdG1hcCBibG9ja3MsIHRvIHNlZSBpZiB0aGVyZQorCSAqIGFyZSBleHRlbnRzIHN0YXJ0aW5nIHRoZXJlIHRoYXQgYXJlIGxvbmcgZW5vdWdoICg+PSBtYXhsZW4pLgorCSAqIE5vdGUsIG9ubHkgb24gdGhlIGluaXRpYWwgbGV2ZWwgY2FuIHRoZSBhbGxvY2F0aW9uIGZhaWwgaWYKKwkgKiB0aGUgc3VtbWFyeSBzYXlzIHRoZXJlJ3MgYW4gZXh0ZW50LgorCSAqLworCWZvciAobCA9IHhmc19oaWdoYml0MzIobWF4bGVuKTsgbCA8IG1wLT5tX3JzdW1sZXZlbHM7IGwrKykgeworCQkvKgorCQkgKiBMb29wIG92ZXIgYWxsIHRoZSBiaXRtYXAgYmxvY2tzLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IG1wLT5tX3NiLnNiX3JibWJsb2NrczsgaSsrKSB7CisJCQkvKgorCQkJICogR2V0IHRoZSBzdW1tYXJ5IGZvciB0aGlzIGxldmVsL2Jsb2NrLgorCQkJICovCisJCQllcnJvciA9IHhmc19ydGdldF9zdW1tYXJ5KG1wLCB0cCwgbCwgaSwgcmJwcCwgcnNiLAorCQkJCSZzdW0pOworCQkJaWYgKGVycm9yKSB7CisJCQkJcmV0dXJuIGVycm9yOworCQkJfQorCQkJLyoKKwkJCSAqIE5vdGhpbmcgdGhlcmUsIG9uIHRvIHRoZSBuZXh0IGJsb2NrLgorCQkJICovCisJCQlpZiAoIXN1bSkKKwkJCQljb250aW51ZTsKKwkJCS8qCisJCQkgKiBUcnkgYWxsb2NhdGluZyB0aGUgZXh0ZW50LgorCQkJICovCisJCQllcnJvciA9IHhmc19ydGFsbG9jYXRlX2V4dGVudF9ibG9jayhtcCwgdHAsIGksIG1heGxlbiwKKwkJCQltYXhsZW4sIGxlbiwgJm4sIHJicHAsIHJzYiwgcHJvZCwgJnIpOworCQkJaWYgKGVycm9yKSB7CisJCQkJcmV0dXJuIGVycm9yOworCQkJfQorCQkJLyoKKwkJCSAqIElmIGl0IHdvcmtlZCwgcmV0dXJuIHRoYXQuCisJCQkgKi8KKwkJCWlmIChyICE9IE5VTExSVEJMT0NLKSB7CisJCQkJKnJ0YmxvY2sgPSByOworCQkJCXJldHVybiAwOworCQkJfQorCQkJLyoKKwkJCSAqIElmIHRoZSAibmV4dCBibG9jayB0byB0cnkiIHJldHVybmVkIGZyb20gdGhlCisJCQkgKiBhbGxvY2F0b3IgaXMgYmV5b25kIHRoZSBuZXh0IGJpdG1hcCBibG9jaywKKwkJCSAqIHNraXAgdG8gdGhhdCBiaXRtYXAgYmxvY2suCisJCQkgKi8KKwkJCWlmIChYRlNfQklUVE9CTE9DSyhtcCwgbikgPiBpICsgMSkKKwkJCQlpID0gWEZTX0JJVFRPQkxPQ0sobXAsIG4pIC0gMTsKKwkJfQorCX0KKwkvKgorCSAqIERpZG4ndCBmaW5kIGFueSBtYXhsZW4gYmxvY2tzLiAgVHJ5IHNtYWxsZXIgb25lcywgdW5sZXNzCisJICogd2UncmUgYXNraW5nIGZvciBhIGZpeGVkIHNpemUgZXh0ZW50LgorCSAqLworCWlmIChtaW5sZW4gPiAtLW1heGxlbikgeworCQkqcnRibG9jayA9IE5VTExSVEJMT0NLOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBMb29wIG92ZXIgc2l6ZXMsIGZyb20gbWF4bGVuIGRvd24gdG8gbWlubGVuLgorCSAqIFRoaXMgdGltZSwgd2hlbiB3ZSBkbyB0aGUgYWxsb2NhdGlvbnMsIGFsbG93IHNtYWxsZXIgb25lcworCSAqIHRvIHN1Y2NlZWQuCisJICovCisJZm9yIChsID0geGZzX2hpZ2hiaXQzMihtYXhsZW4pOyBsID49IHhmc19oaWdoYml0MzIobWlubGVuKTsgbC0tKSB7CisJCS8qCisJCSAqIExvb3Agb3ZlciBhbGwgdGhlIGJpdG1hcCBibG9ja3MsIHRyeSBhbiBhbGxvY2F0aW9uCisJCSAqIHN0YXJ0aW5nIGluIHRoYXQgYmxvY2suCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgbXAtPm1fc2Iuc2JfcmJtYmxvY2tzOyBpKyspIHsKKwkJCS8qCisJCQkgKiBHZXQgdGhlIHN1bW1hcnkgaW5mb3JtYXRpb24gZm9yIHRoaXMgbGV2ZWwvYmxvY2suCisJCQkgKi8KKwkJCWVycm9yID0JeGZzX3J0Z2V0X3N1bW1hcnkobXAsIHRwLCBsLCBpLCByYnBwLCByc2IsCisJCQkJCQkgICZzdW0pOworCQkJaWYgKGVycm9yKSB7CisJCQkJcmV0dXJuIGVycm9yOworCQkJfQorCQkJLyoKKwkJCSAqIElmIG5vdGhpbmcgdGhlcmUsIGdvIG9uIHRvIG5leHQuCisJCQkgKi8KKwkJCWlmICghc3VtKQorCQkJCWNvbnRpbnVlOworCQkJLyoKKwkJCSAqIFRyeSB0aGUgYWxsb2NhdGlvbi4gIE1ha2Ugc3VyZSB0aGUgc3BlY2lmaWVkCisJCQkgKiBtaW5sZW4vbWF4bGVuIGFyZSBpbiB0aGUgcG9zc2libGUgcmFuZ2UgZm9yCisJCQkgKiB0aGlzIHN1bW1hcnkgbGV2ZWwuCisJCQkgKi8KKwkJCWVycm9yID0geGZzX3J0YWxsb2NhdGVfZXh0ZW50X2Jsb2NrKG1wLCB0cCwgaSwKKwkJCQkJWEZTX1JUTUFYKG1pbmxlbiwgMSA8PCBsKSwKKwkJCQkJWEZTX1JUTUlOKG1heGxlbiwgKDEgPDwgKGwgKyAxKSkgLSAxKSwKKwkJCQkJbGVuLCAmbiwgcmJwcCwgcnNiLCBwcm9kLCAmcik7CisJCQlpZiAoZXJyb3IpIHsKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQl9CisJCQkvKgorCQkJICogSWYgaXQgd29ya2VkLCByZXR1cm4gdGhhdCBleHRlbnQuCisJCQkgKi8KKwkJCWlmIChyICE9IE5VTExSVEJMT0NLKSB7CisJCQkJKnJ0YmxvY2sgPSByOworCQkJCXJldHVybiAwOworCQkJfQorCQkJLyoKKwkJCSAqIElmIHRoZSAibmV4dCBibG9jayB0byB0cnkiIHJldHVybmVkIGZyb20gdGhlCisJCQkgKiBhbGxvY2F0b3IgaXMgYmV5b25kIHRoZSBuZXh0IGJpdG1hcCBibG9jaywKKwkJCSAqIHNraXAgdG8gdGhhdCBiaXRtYXAgYmxvY2suCisJCQkgKi8KKwkJCWlmIChYRlNfQklUVE9CTE9DSyhtcCwgbikgPiBpICsgMSkKKwkJCQlpID0gWEZTX0JJVFRPQkxPQ0sobXAsIG4pIC0gMTsKKwkJfQorCX0KKwkvKgorCSAqIEdvdCBub3RoaW5nLCByZXR1cm4gZmFpbHVyZS4KKwkgKi8KKwkqcnRibG9jayA9IE5VTExSVEJMT0NLOworCXJldHVybiAwOworfQorCisvKgorICogTWFyayBhbiBleHRlbnQgc3BlY2lmaWVkIGJ5IHN0YXJ0IGFuZCBsZW4gYWxsb2NhdGVkLgorICogVXBkYXRlcyBhbGwgdGhlIHN1bW1hcnkgaW5mb3JtYXRpb24gYXMgd2VsbCBhcyB0aGUgYml0bWFwLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfcnRhbGxvY2F0ZV9yYW5nZSgKKwl4ZnNfbW91bnRfdAkqbXAsCQkvKiBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfcnRibG9ja190CXN0YXJ0LAkJLyogc3RhcnQgYmxvY2sgdG8gYWxsb2NhdGUgKi8KKwl4ZnNfZXh0bGVuX3QJbGVuLAkJLyogbGVuZ3RoIHRvIGFsbG9jYXRlICovCisJeGZzX2J1Zl90CSoqcmJwcCwJCS8qIGluL291dDogc3VtbWFyeSBibG9jayBidWZmZXIgKi8KKwl4ZnNfZnNibG9ja190CSpyc2IpCQkvKiBpbi9vdXQ6IHN1bW1hcnkgYmxvY2sgbnVtYmVyICovCit7CisJeGZzX3J0YmxvY2tfdAllbmQ7CQkvKiBlbmQgb2YgdGhlIGFsbG9jYXRlZCBleHRlbnQgKi8KKwlpbnQJCWVycm9yOwkJLyogZXJyb3IgdmFsdWUgKi8KKwl4ZnNfcnRibG9ja190CXBvc3RibG9jazsJLyogZmlyc3QgYmxvY2sgYWxsb2NhdGVkID4gZW5kICovCisJeGZzX3J0YmxvY2tfdAlwcmVibG9jazsJLyogZmlyc3QgYmxvY2sgYWxsb2NhdGVkIDwgc3RhcnQgKi8KKworCWVuZCA9IHN0YXJ0ICsgbGVuIC0gMTsKKwkvKgorCSAqIEFzc3VtZSB3ZSdyZSBhbGxvY2F0aW5nIG91dCBvZiB0aGUgbWlkZGxlIG9mIGEgZnJlZSBleHRlbnQuCisJICogV2UgbmVlZCB0byBmaW5kIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiB0aGUgZXh0ZW50IHNvIHdlIGNhbgorCSAqIHByb3Blcmx5IHVwZGF0ZSB0aGUgc3VtbWFyeS4KKwkgKi8KKwllcnJvciA9IHhmc19ydGZpbmRfYmFjayhtcCwgdHAsIHN0YXJ0LCAwLCAmcHJlYmxvY2spOworCWlmIChlcnJvcikgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCS8qCisJICogRmluZCB0aGUgbmV4dCBhbGxvY2F0ZWQgYmxvY2sgKGVuZCBvZiBmcmVlIGV4dGVudCkuCisJICovCisJZXJyb3IgPSB4ZnNfcnRmaW5kX2ZvcncobXAsIHRwLCBlbmQsIG1wLT5tX3NiLnNiX3JleHRlbnRzIC0gMSwKKwkJJnBvc3RibG9jayk7CisJaWYgKGVycm9yKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJLyoKKwkgKiBEZWNyZW1lbnQgdGhlIHN1bW1hcnkgaW5mb3JtYXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZW50aXJlCisJICogKG9sZCkgZnJlZSBleHRlbnQuCisJICovCisJZXJyb3IgPSB4ZnNfcnRtb2RpZnlfc3VtbWFyeShtcCwgdHAsCisJCVhGU19SVEJMT0NLTE9HKHBvc3RibG9jayArIDEgLSBwcmVibG9jayksCisJCVhGU19CSVRUT0JMT0NLKG1wLCBwcmVibG9jayksIC0xLCByYnBwLCByc2IpOworCWlmIChlcnJvcikgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCS8qCisJICogSWYgdGhlcmUgYXJlIGJsb2NrcyBub3QgYmVpbmcgYWxsb2NhdGVkIGF0IHRoZSBmcm9udCBvZiB0aGUKKwkgKiBvbGQgZXh0ZW50LCBhZGQgc3VtbWFyeSBkYXRhIGZvciB0aGVtIHRvIGJlIGZyZWUuCisJICovCisJaWYgKHByZWJsb2NrIDwgc3RhcnQpIHsKKwkJZXJyb3IgPSB4ZnNfcnRtb2RpZnlfc3VtbWFyeShtcCwgdHAsCisJCQlYRlNfUlRCTE9DS0xPRyhzdGFydCAtIHByZWJsb2NrKSwKKwkJCVhGU19CSVRUT0JMT0NLKG1wLCBwcmVibG9jayksIDEsIHJicHAsIHJzYik7CisJCWlmIChlcnJvcikgeworCQkJcmV0dXJuIGVycm9yOworCQl9CisJfQorCS8qCisJICogSWYgdGhlcmUgYXJlIGJsb2NrcyBub3QgYmVpbmcgYWxsb2NhdGVkIGF0IHRoZSBlbmQgb2YgdGhlCisJICogb2xkIGV4dGVudCwgYWRkIHN1bW1hcnkgZGF0YSBmb3IgdGhlbSB0byBiZSBmcmVlLgorCSAqLworCWlmIChwb3N0YmxvY2sgPiBlbmQpIHsKKwkJZXJyb3IgPSB4ZnNfcnRtb2RpZnlfc3VtbWFyeShtcCwgdHAsCisJCQlYRlNfUlRCTE9DS0xPRyhwb3N0YmxvY2sgLSBlbmQpLAorCQkJWEZTX0JJVFRPQkxPQ0sobXAsIGVuZCArIDEpLCAxLCByYnBwLCByc2IpOworCQlpZiAoZXJyb3IpIHsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCX0KKwkvKgorCSAqIE1vZGlmeSB0aGUgYml0bWFwIHRvIG1hcmsgdGhpcyBleHRlbnQgYWxsb2NhdGVkLgorCSAqLworCWVycm9yID0geGZzX3J0bW9kaWZ5X3JhbmdlKG1wLCB0cCwgc3RhcnQsIGxlbiwgMCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBmcmVlIGV4dGVudHMgaW4gdGhlIHNpemUgcmFuZ2UgZ2l2ZW4KKyAqIGJ5IGxvdyBhbmQgaGlnaCwgZm9yIHRoZSBiaXRtYXAgYmxvY2sgYmJuby4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX3J0YW55X3N1bW1hcnkoCisJeGZzX21vdW50X3QJKm1wLAkJLyogZmlsZSBzeXN0ZW0gbW91bnQgc3RydWN0dXJlICovCisJeGZzX3RyYW5zX3QJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCWludAkJbG93LAkJLyogbG93IGxvZzIgZXh0ZW50IHNpemUgKi8KKwlpbnQJCWhpZ2gsCQkvKiBoaWdoIGxvZzIgZXh0ZW50IHNpemUgKi8KKwl4ZnNfcnRibG9ja190CWJibm8sCQkvKiBiaXRtYXAgYmxvY2sgbnVtYmVyICovCisJeGZzX2J1Zl90CSoqcmJwcCwJCS8qIGluL291dDogc3VtbWFyeSBibG9jayBidWZmZXIgKi8KKwl4ZnNfZnNibG9ja190CSpyc2IsCQkvKiBpbi9vdXQ6IHN1bW1hcnkgYmxvY2sgbnVtYmVyICovCisJaW50CQkqc3RhdCkJCS8qIG91dDogYW55IGdvb2QgZXh0ZW50cyBoZXJlPyAqLworeworCWludAkJZXJyb3I7CQkvKiBlcnJvciB2YWx1ZSAqLworCWludAkJbG9nOwkJLyogbG9vcCBjb3VudGVyLCBsb2cyIG9mIGV4dC4gc2l6ZSAqLworCXhmc19zdW1pbmZvX3QJc3VtOwkJLyogc3VtbWFyeSBkYXRhICovCisKKwkvKgorCSAqIExvb3Agb3ZlciBsb2dzIG9mIGV4dGVudCBzaXplcy4gIE9yZGVyIGlzIGlycmVsZXZhbnQuCisJICovCisJZm9yIChsb2cgPSBsb3c7IGxvZyA8PSBoaWdoOyBsb2crKykgeworCQkvKgorCQkgKiBHZXQgb25lIHN1bW1hcnkgZGF0dW0uCisJCSAqLworCQllcnJvciA9IHhmc19ydGdldF9zdW1tYXJ5KG1wLCB0cCwgbG9nLCBiYm5vLCByYnBwLCByc2IsICZzdW0pOworCQlpZiAoZXJyb3IpIHsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQkvKgorCQkgKiBJZiB0aGVyZSBhcmUgYW55LCByZXR1cm4gc3VjY2Vzcy4KKwkJICovCisJCWlmIChzdW0pIHsKKwkJCSpzdGF0ID0gMTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCS8qCisJICogRm91bmQgbm90aGluZywgcmV0dXJuIGZhaWx1cmUuCisJICovCisJKnN0YXQgPSAwOworCXJldHVybiAwOworfQorCisvKgorICogR2V0IGEgYnVmZmVyIGZvciB0aGUgYml0bWFwIG9yIHN1bW1hcnkgZmlsZSBibG9jayBzcGVjaWZpZWQuCisgKiBUaGUgYnVmZmVyIGlzIHJldHVybmVkIHJlYWQgYW5kIGxvY2tlZC4KKyAqLworU1RBVElDIGludAkJCQkvKiBlcnJvciAqLworeGZzX3J0YnVmX2dldCgKKwl4ZnNfbW91bnRfdAkqbXAsCQkvKiBmaWxlIHN5c3RlbSBtb3VudCBzdHJ1Y3R1cmUgKi8KKwl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX3J0YmxvY2tfdAlibG9jaywJCS8qIGJsb2NrIG51bWJlciBpbiBiaXRtYXAgb3Igc3VtbWFyeSAqLworCWludAkJaXNzdW0sCQkvKiBpcyBzdW1tYXJ5IG5vdCBiaXRtYXAgKi8KKwl4ZnNfYnVmX3QJKipicHApCQkvKiBvdXRwdXQ6IGJ1ZmZlciBmb3IgdGhlIGJsb2NrICovCit7CisJeGZzX2J1Zl90CSpicDsJCS8qIGJsb2NrIGJ1ZmZlciwgcmVzdWx0ICovCisJeGZzX2RhZGRyX3QJZDsJCS8qIGRpc2sgYWRkciBvZiBibG9jayAqLworCWludAkJZXJyb3I7CQkvKiBlcnJvciB2YWx1ZSAqLworCXhmc19mc2Jsb2NrX3QJZnNiOwkJLyogZnMgYmxvY2sgbnVtYmVyIGZvciBibG9jayAqLworCXhmc19pbm9kZV90CSppcDsJCS8qIGJpdG1hcCBvciBzdW1tYXJ5IGlub2RlICovCisKKwlpcCA9IGlzc3VtID8gbXAtPm1fcnN1bWlwIDogbXAtPm1fcmJtaXA7CisJLyoKKwkgKiBNYXAgZnJvbSB0aGUgZmlsZSBvZmZzZXQgKGJsb2NrKSBhbmQgaW5vZGUgbnVtYmVyIHRvIHRoZQorCSAqIGZpbGUgc3lzdGVtIGJsb2NrLgorCSAqLworCWVycm9yID0geGZzX2JtYXBpX3NpbmdsZSh0cCwgaXAsIFhGU19EQVRBX0ZPUkssICZmc2IsIGJsb2NrKTsKKwlpZiAoZXJyb3IpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlBU1NFUlQoZnNiICE9IE5VTExGU0JMT0NLKTsKKwkvKgorCSAqIENvbnZlcnQgdG8gZGlzayBhZGRyZXNzIGZvciBidWZmZXIgY2FjaGUuCisJICovCisJZCA9IFhGU19GU0JfVE9fREFERFIobXAsIGZzYik7CisJLyoKKwkgKiBSZWFkIHRoZSBidWZmZXIuCisJICovCisJZXJyb3IgPSB4ZnNfdHJhbnNfcmVhZF9idWYobXAsIHRwLCBtcC0+bV9kZGV2X3RhcmdwLCBkLAorCQkJCSAgIG1wLT5tX2JzaXplLCAwLCAmYnApOworCWlmIChlcnJvcikgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCUFTU0VSVChicCAmJiAhWEZTX0JVRl9HRVRFUlJPUihicCkpOworCSpicHAgPSBicDsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIERFQlVHCisvKgorICogQ2hlY2sgdGhhdCB0aGUgZ2l2ZW4gZXh0ZW50IChibG9jayByYW5nZSkgaXMgYWxsb2NhdGVkIGFscmVhZHkuCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19ydGNoZWNrX2FsbG9jX3JhbmdlKAorCXhmc19tb3VudF90CSptcCwJCS8qIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50ICovCisJeGZzX3RyYW5zX3QJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19ydGJsb2NrX3QJYm5vLAkJLyogc3RhcnRpbmcgYmxvY2sgbnVtYmVyIG9mIGV4dGVudCAqLworCXhmc19leHRsZW5fdAlsZW4sCQkvKiBsZW5ndGggb2YgZXh0ZW50ICovCisJaW50CQkqc3RhdCkJCS8qIG91dDogMSBmb3IgYWxsb2NhdGVkLCAwIGZvciBub3QgKi8KK3sKKwl4ZnNfcnRibG9ja190CW5ldzsJCS8qIGR1bW15IGZvciB4ZnNfcnRjaGVja19yYW5nZSAqLworCisJcmV0dXJuIHhmc19ydGNoZWNrX3JhbmdlKG1wLCB0cCwgYm5vLCBsZW4sIDAsICZuZXcsIHN0YXQpOworfQorI2VuZGlmCisKKyNpZmRlZiBERUJVRworLyoKKyAqIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGJsb2NrIGluIHRoZSBiaXRtYXAgaGFzIHRoZSBnaXZlbiB2YWx1ZS4KKyAqLworU1RBVElDIGludAkJCQkvKiAxIGZvciBtYXRjaGVzLCAwIGZvciBub3QgKi8KK3hmc19ydGNoZWNrX2JpdCgKKwl4ZnNfbW91bnRfdAkqbXAsCQkvKiBmaWxlIHN5c3RlbSBtb3VudCBzdHJ1Y3R1cmUgKi8KKwl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX3J0YmxvY2tfdAlzdGFydCwJCS8qIGJpdCAoYmxvY2spIHRvIGNoZWNrICovCisJaW50CQl2YWwpCQkvKiAxIGZvciBmcmVlLCAwIGZvciBhbGxvY2F0ZWQgKi8KK3sKKwlpbnQJCWJpdDsJCS8qIGJpdCBudW1iZXIgaW4gdGhlIHdvcmQgKi8KKwl4ZnNfcnRibG9ja190CWJsb2NrOwkJLyogYml0bWFwIGJsb2NrIG51bWJlciAqLworCXhmc19idWZfdAkqYnA7CQkvKiBidWYgZm9yIHRoZSBibG9jayAqLworCXhmc19ydHdvcmRfdAkqYnVmcDsJCS8qIHBvaW50ZXIgaW50byB0aGUgYnVmZmVyICovCisJLyogUkVGRVJFTkNFRCAqLworCWludAkJZXJyb3I7CQkvKiBlcnJvciB2YWx1ZSAqLworCXhmc19ydHdvcmRfdAl3ZGlmZjsJCS8qIGRpZmZlcmVuY2UgYmV0d2VlbiBiaXQgJiBleHBlY3RlZCAqLworCWludAkJd29yZDsJCS8qIHdvcmQgbnVtYmVyIGluIHRoZSBidWZmZXIgKi8KKwl4ZnNfcnR3b3JkX3QJd3ZhbDsJCS8qIHdvcmQgdmFsdWUgZnJvbSBidWZmZXIgKi8KKworCWJsb2NrID0gWEZTX0JJVFRPQkxPQ0sobXAsIHN0YXJ0KTsKKwllcnJvciA9IHhmc19ydGJ1Zl9nZXQobXAsIHRwLCBibG9jaywgMCwgJmJwKTsKKwlidWZwID0gKHhmc19ydHdvcmRfdCAqKVhGU19CVUZfUFRSKGJwKTsKKwl3b3JkID0gWEZTX0JJVFRPV09SRChtcCwgc3RhcnQpOworCWJpdCA9IChpbnQpKHN0YXJ0ICYgKFhGU19OQldPUkQgLSAxKSk7CisJd3ZhbCA9IGJ1ZnBbd29yZF07CisJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOworCXdkaWZmID0gKHd2YWwgXiAtdmFsKSAmICgoeGZzX3J0d29yZF90KTEgPDwgYml0KTsKKwlyZXR1cm4gIXdkaWZmOworfQorI2VuZGlmCS8qIERFQlVHICovCisKKyNpZiAwCisvKgorICogQ2hlY2sgdGhhdCB0aGUgZ2l2ZW4gZXh0ZW50IChibG9jayByYW5nZSkgaXMgZnJlZSBhbHJlYWR5LgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfcnRjaGVja19mcmVlX3JhbmdlKAorCXhmc19tb3VudF90CSptcCwJCS8qIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50ICovCisJeGZzX3RyYW5zX3QJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19ydGJsb2NrX3QJYm5vLAkJLyogc3RhcnRpbmcgYmxvY2sgbnVtYmVyIG9mIGV4dGVudCAqLworCXhmc19leHRsZW5fdAlsZW4sCQkvKiBsZW5ndGggb2YgZXh0ZW50ICovCisJaW50CQkqc3RhdCkJCS8qIG91dDogMSBmb3IgZnJlZSwgMCBmb3Igbm90ICovCit7CisJeGZzX3J0YmxvY2tfdAluZXc7CQkvKiBkdW1teSBmb3IgeGZzX3J0Y2hlY2tfcmFuZ2UgKi8KKworCXJldHVybiB4ZnNfcnRjaGVja19yYW5nZShtcCwgdHAsIGJubywgbGVuLCAxLCAmbmV3LCBzdGF0KTsKK30KKyNlbmRpZgorCisvKgorICogQ2hlY2sgdGhhdCB0aGUgZ2l2ZW4gcmFuZ2UgaXMgZWl0aGVyIGFsbCBhbGxvY2F0ZWQgKHZhbCA9IDApIG9yCisgKiBhbGwgZnJlZSAodmFsID0gMSkuCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19ydGNoZWNrX3JhbmdlKAorCXhmc19tb3VudF90CSptcCwJCS8qIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50ICovCisJeGZzX3RyYW5zX3QJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19ydGJsb2NrX3QJc3RhcnQsCQkvKiBzdGFydGluZyBibG9jayBudW1iZXIgb2YgZXh0ZW50ICovCisJeGZzX2V4dGxlbl90CWxlbiwJCS8qIGxlbmd0aCBvZiBleHRlbnQgKi8KKwlpbnQJCXZhbCwJCS8qIDEgZm9yIGZyZWUsIDAgZm9yIGFsbG9jYXRlZCAqLworCXhmc19ydGJsb2NrX3QJKm5ldywJCS8qIG91dDogZmlyc3QgYmxvY2sgbm90IG1hdGNoaW5nICovCisJaW50CQkqc3RhdCkJCS8qIG91dDogMSBmb3IgbWF0Y2hlcywgMCBmb3Igbm90ICovCit7CisJeGZzX3J0d29yZF90CSpiOwkJLyogY3VycmVudCB3b3JkIGluIGJ1ZmZlciAqLworCWludAkJYml0OwkJLyogYml0IG51bWJlciBpbiB0aGUgd29yZCAqLworCXhmc19ydGJsb2NrX3QJYmxvY2s7CQkvKiBiaXRtYXAgYmxvY2sgbnVtYmVyICovCisJeGZzX2J1Zl90CSpicDsJCS8qIGJ1ZiBmb3IgdGhlIGJsb2NrICovCisJeGZzX3J0d29yZF90CSpidWZwOwkJLyogc3RhcnRpbmcgd29yZCBpbiBidWZmZXIgKi8KKwlpbnQJCWVycm9yOwkJLyogZXJyb3IgdmFsdWUgKi8KKwl4ZnNfcnRibG9ja190CWk7CQkvKiBjdXJyZW50IGJpdCBudW1iZXIgcmVsLiB0byBzdGFydCAqLworCXhmc19ydGJsb2NrX3QJbGFzdGJpdDsJLyogbGFzdCB1c2VmdWwgYml0IGluIHdvcmQgKi8KKwl4ZnNfcnR3b3JkX3QJbWFzazsJCS8qIG1hc2sgb2YgcmVsZXZhbnQgYml0cyBmb3IgdmFsdWUgKi8KKwl4ZnNfcnR3b3JkX3QJd2RpZmY7CQkvKiBkaWZmZXJlbmNlIGZyb20gd2FudGVkIHZhbHVlICovCisJaW50CQl3b3JkOwkJLyogd29yZCBudW1iZXIgaW4gdGhlIGJ1ZmZlciAqLworCisJLyoKKwkgKiBDb21wdXRlIHN0YXJ0aW5nIGJpdG1hcCBibG9jayBudW1iZXIKKwkgKi8KKwlibG9jayA9IFhGU19CSVRUT0JMT0NLKG1wLCBzdGFydCk7CisJLyoKKwkgKiBSZWFkIHRoZSBiaXRtYXAgYmxvY2suCisJICovCisJZXJyb3IgPSB4ZnNfcnRidWZfZ2V0KG1wLCB0cCwgYmxvY2ssIDAsICZicCk7CisJaWYgKGVycm9yKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJYnVmcCA9ICh4ZnNfcnR3b3JkX3QgKilYRlNfQlVGX1BUUihicCk7CisJLyoKKwkgKiBDb21wdXRlIHRoZSBzdGFydGluZyB3b3JkJ3MgYWRkcmVzcywgYW5kIHN0YXJ0aW5nIGJpdC4KKwkgKi8KKwl3b3JkID0gWEZTX0JJVFRPV09SRChtcCwgc3RhcnQpOworCWIgPSAmYnVmcFt3b3JkXTsKKwliaXQgPSAoaW50KShzdGFydCAmIChYRlNfTkJXT1JEIC0gMSkpOworCS8qCisJICogMCAoYWxsb2NhdGVkKSA9PiBhbGwgemVybydzOyAxIChmcmVlKSA9PiBhbGwgb25lJ3MuCisJICovCisJdmFsID0gLXZhbDsKKwkvKgorCSAqIElmIG5vdCBzdGFydGluZyBvbiBhIHdvcmQgYm91bmRhcnksIGRlYWwgd2l0aCB0aGUgZmlyc3QKKwkgKiAocGFydGlhbCkgd29yZC4KKwkgKi8KKwlpZiAoYml0KSB7CisJCS8qCisJCSAqIENvbXB1dGUgZmlyc3QgYml0IG5vdCBleGFtaW5lZC4KKwkJICovCisJCWxhc3RiaXQgPSBYRlNfUlRNSU4oYml0ICsgbGVuLCBYRlNfTkJXT1JEKTsKKwkJLyoKKwkJICogTWFzayBvZiByZWxldmFudCBiaXRzLgorCQkgKi8KKwkJbWFzayA9ICgoKHhmc19ydHdvcmRfdCkxIDw8IChsYXN0Yml0IC0gYml0KSkgLSAxKSA8PCBiaXQ7CisJCS8qCisJCSAqIENvbXB1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGFjdHVhbCBhbmQgZGVzaXJlZCB2YWx1ZS4KKwkJICovCisJCWlmICgod2RpZmYgPSAoKmIgXiB2YWwpICYgbWFzaykpIHsKKwkJCS8qCisJCQkgKiBEaWZmZXJlbnQsIGNvbXB1dGUgZmlyc3Qgd3JvbmcgYml0IGFuZCByZXR1cm4uCisJCQkgKi8KKwkJCXhmc190cmFuc19icmVsc2UodHAsIGJwKTsKKwkJCWkgPSBYRlNfUlRMT0JJVCh3ZGlmZikgLSBiaXQ7CisJCQkqbmV3ID0gc3RhcnQgKyBpOworCQkJKnN0YXQgPSAwOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaSA9IGxhc3RiaXQgLSBiaXQ7CisJCS8qCisJCSAqIEdvIG9uIHRvIG5leHQgYmxvY2sgaWYgdGhhdCdzIHdoZXJlIHRoZSBuZXh0IHdvcmQgaXMKKwkJICogYW5kIHdlIG5lZWQgdGhlIG5leHQgd29yZC4KKwkJICovCisJCWlmICgrK3dvcmQgPT0gWEZTX0JMT0NLV1NJWkUobXApICYmIGkgPCBsZW4pIHsKKwkJCS8qCisJCQkgKiBJZiBkb25lIHdpdGggdGhpcyBibG9jaywgZ2V0IHRoZSBuZXh0IG9uZS4KKwkJCSAqLworCQkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOworCQkJZXJyb3IgPSB4ZnNfcnRidWZfZ2V0KG1wLCB0cCwgKytibG9jaywgMCwgJmJwKTsKKwkJCWlmIChlcnJvcikgeworCQkJCXJldHVybiBlcnJvcjsKKwkJCX0KKwkJCWIgPSBidWZwID0gKHhmc19ydHdvcmRfdCAqKVhGU19CVUZfUFRSKGJwKTsKKwkJCXdvcmQgPSAwOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIEdvIG9uIHRvIHRoZSBuZXh0IHdvcmQgaW4gdGhlIGJ1ZmZlci4KKwkJCSAqLworCQkJYisrOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogU3RhcnRpbmcgb24gYSB3b3JkIGJvdW5kYXJ5LCBubyBwYXJ0aWFsIHdvcmQuCisJCSAqLworCQlpID0gMDsKKwl9CisJLyoKKwkgKiBMb29wIG92ZXIgd2hvbGUgd29yZHMgaW4gYnVmZmVycy4gIFdoZW4gd2UgdXNlIHVwIG9uZSBidWZmZXIKKwkgKiB3ZSBtb3ZlIG9uIHRvIHRoZSBuZXh0IG9uZS4KKwkgKi8KKwl3aGlsZSAobGVuIC0gaSA+PSBYRlNfTkJXT1JEKSB7CisJCS8qCisJCSAqIENvbXB1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGFjdHVhbCBhbmQgZGVzaXJlZCB2YWx1ZS4KKwkJICovCisJCWlmICgod2RpZmYgPSAqYiBeIHZhbCkpIHsKKwkJCS8qCisJCQkgKiBEaWZmZXJlbnQsIGNvbXB1dGUgZmlyc3Qgd3JvbmcgYml0IGFuZCByZXR1cm4uCisJCQkgKi8KKwkJCXhmc190cmFuc19icmVsc2UodHAsIGJwKTsKKwkJCWkgKz0gWEZTX1JUTE9CSVQod2RpZmYpOworCQkJKm5ldyA9IHN0YXJ0ICsgaTsKKwkJCSpzdGF0ID0gMDsKKwkJCXJldHVybiAwOworCQl9CisJCWkgKz0gWEZTX05CV09SRDsKKwkJLyoKKwkJICogR28gb24gdG8gbmV4dCBibG9jayBpZiB0aGF0J3Mgd2hlcmUgdGhlIG5leHQgd29yZCBpcworCQkgKiBhbmQgd2UgbmVlZCB0aGUgbmV4dCB3b3JkLgorCQkgKi8KKwkJaWYgKCsrd29yZCA9PSBYRlNfQkxPQ0tXU0laRShtcCkgJiYgaSA8IGxlbikgeworCQkJLyoKKwkJCSAqIElmIGRvbmUgd2l0aCB0aGlzIGJsb2NrLCBnZXQgdGhlIG5leHQgb25lLgorCQkJICovCisJCQl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBicCk7CisJCQllcnJvciA9IHhmc19ydGJ1Zl9nZXQobXAsIHRwLCArK2Jsb2NrLCAwLCAmYnApOworCQkJaWYgKGVycm9yKSB7CisJCQkJcmV0dXJuIGVycm9yOworCQkJfQorCQkJYiA9IGJ1ZnAgPSAoeGZzX3J0d29yZF90ICopWEZTX0JVRl9QVFIoYnApOworCQkJd29yZCA9IDA7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogR28gb24gdG8gdGhlIG5leHQgd29yZCBpbiB0aGUgYnVmZmVyLgorCQkJICovCisJCQliKys7CisJCX0KKwl9CisJLyoKKwkgKiBJZiBub3QgZW5kaW5nIG9uIGEgd29yZCBib3VuZGFyeSwgZGVhbCB3aXRoIHRoZSBsYXN0CisJICogKHBhcnRpYWwpIHdvcmQuCisJICovCisJaWYgKChsYXN0Yml0ID0gbGVuIC0gaSkpIHsKKwkJLyoKKwkJICogTWFzayBvZiByZWxldmFudCBiaXRzLgorCQkgKi8KKwkJbWFzayA9ICgoeGZzX3J0d29yZF90KTEgPDwgbGFzdGJpdCkgLSAxOworCQkvKgorCQkgKiBDb21wdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBhY3R1YWwgYW5kIGRlc2lyZWQgdmFsdWUuCisJCSAqLworCQlpZiAoKHdkaWZmID0gKCpiIF4gdmFsKSAmIG1hc2spKSB7CisJCQkvKgorCQkJICogRGlmZmVyZW50LCBjb21wdXRlIGZpcnN0IHdyb25nIGJpdCBhbmQgcmV0dXJuLgorCQkJICovCisJCQl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBicCk7CisJCQlpICs9IFhGU19SVExPQklUKHdkaWZmKTsKKwkJCSpuZXcgPSBzdGFydCArIGk7CisJCQkqc3RhdCA9IDA7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlCisJCQlpID0gbGVuOworCX0KKwkvKgorCSAqIFN1Y2Nlc3NmdWwsIHJldHVybi4KKwkgKi8KKwl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBicCk7CisJKm5ldyA9IHN0YXJ0ICsgaTsKKwkqc3RhdCA9IDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDb3B5IGFuZCB0cmFuc2Zvcm0gdGhlIHN1bW1hcnkgZmlsZSwgZ2l2ZW4gdGhlIG9sZCBhbmQgbmV3CisgKiBwYXJhbWV0ZXJzIGluIHRoZSBtb3VudCBzdHJ1Y3R1cmVzLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfcnRjb3B5X3N1bW1hcnkoCisJeGZzX21vdW50X3QJKm9tcCwJCS8qIG9sZCBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc19tb3VudF90CSpubXAsCQkvKiBuZXcgZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl4ZnNfdHJhbnNfdAkqdHApCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCit7CisJeGZzX3J0YmxvY2tfdAliYm5vOwkJLyogYml0bWFwIGJsb2NrIG51bWJlciAqLworCXhmc19idWZfdAkqYnA7CQkvKiBzdW1tYXJ5IGJ1ZmZlciAqLworCWludAkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwlpbnQJCWxvZzsJCS8qIHN1bW1hcnkgbGV2ZWwgbnVtYmVyIChsb2cgbGVuZ3RoKSAqLworCXhmc19zdW1pbmZvX3QJc3VtOwkJLyogc3VtbWFyeSBkYXRhICovCisJeGZzX2ZzYmxvY2tfdAlzdW1ibm87CQkvKiBzdW1tYXJ5IGJsb2NrIG51bWJlciAqLworCisJYnAgPSBOVUxMOworCWZvciAobG9nID0gb21wLT5tX3JzdW1sZXZlbHMgLSAxOyBsb2cgPj0gMDsgbG9nLS0pIHsKKwkJZm9yIChiYm5vID0gb21wLT5tX3NiLnNiX3JibWJsb2NrcyAtIDE7CisJCSAgICAgKHhmc19zcnRibG9ja190KWJibm8gPj0gMDsKKwkJICAgICBiYm5vLS0pIHsKKwkJCWVycm9yID0geGZzX3J0Z2V0X3N1bW1hcnkob21wLCB0cCwgbG9nLCBiYm5vLCAmYnAsCisJCQkJJnN1bWJubywgJnN1bSk7CisJCQlpZiAoZXJyb3IpCisJCQkJcmV0dXJuIGVycm9yOworCQkJaWYgKHN1bSA9PSAwKQorCQkJCWNvbnRpbnVlOworCQkJZXJyb3IgPSB4ZnNfcnRtb2RpZnlfc3VtbWFyeShvbXAsIHRwLCBsb2csIGJibm8sIC1zdW0sCisJCQkJJmJwLCAmc3VtYm5vKTsKKwkJCWlmIChlcnJvcikKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQllcnJvciA9IHhmc19ydG1vZGlmeV9zdW1tYXJ5KG5tcCwgdHAsIGxvZywgYmJubywgc3VtLAorCQkJCSZicCwgJnN1bWJubyk7CisJCQlpZiAoZXJyb3IpCisJCQkJcmV0dXJuIGVycm9yOworCQkJQVNTRVJUKHN1bSA+IDApOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKgorICogU2VhcmNoaW5nIGJhY2t3YXJkIGZyb20gc3RhcnQgdG8gbGltaXQsIGZpbmQgdGhlIGZpcnN0IGJsb2NrIHdob3NlCisgKiBhbGxvY2F0ZWQvZnJlZSBzdGF0ZSBpcyBkaWZmZXJlbnQgZnJvbSBzdGFydCdzLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfcnRmaW5kX2JhY2soCisJeGZzX21vdW50X3QJKm1wLAkJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX3J0YmxvY2tfdAlzdGFydCwJCS8qIHN0YXJ0aW5nIGJsb2NrIHRvIGxvb2sgYXQgKi8KKwl4ZnNfcnRibG9ja190CWxpbWl0LAkJLyogbGFzdCBibG9jayB0byBsb29rIGF0ICovCisJeGZzX3J0YmxvY2tfdAkqcnRibG9jaykJLyogb3V0OiBzdGFydCBibG9jayBmb3VuZCAqLworeworCXhmc19ydHdvcmRfdAkqYjsJCS8qIGN1cnJlbnQgd29yZCBpbiBidWZmZXIgKi8KKwlpbnQJCWJpdDsJCS8qIGJpdCBudW1iZXIgaW4gdGhlIHdvcmQgKi8KKwl4ZnNfcnRibG9ja190CWJsb2NrOwkJLyogYml0bWFwIGJsb2NrIG51bWJlciAqLworCXhmc19idWZfdAkqYnA7CQkvKiBidWYgZm9yIHRoZSBibG9jayAqLworCXhmc19ydHdvcmRfdAkqYnVmcDsJCS8qIHN0YXJ0aW5nIHdvcmQgaW4gYnVmZmVyICovCisJaW50CQllcnJvcjsJCS8qIGVycm9yIHZhbHVlICovCisJeGZzX3J0YmxvY2tfdAlmaXJzdGJpdDsJLyogZmlyc3QgdXNlZnVsIGJpdCBpbiB0aGUgd29yZCAqLworCXhmc19ydGJsb2NrX3QJaTsJCS8qIGN1cnJlbnQgYml0IG51bWJlciByZWwuIHRvIHN0YXJ0ICovCisJeGZzX3J0YmxvY2tfdAlsZW47CQkvKiBsZW5ndGggb2YgaW5zcGVjdGVkIGFyZWEgKi8KKwl4ZnNfcnR3b3JkX3QJbWFzazsJCS8qIG1hc2sgb2YgcmVsZXZhbnQgYml0cyBmb3IgdmFsdWUgKi8KKwl4ZnNfcnR3b3JkX3QJd2FudDsJCS8qIG1hc2sgZm9yICJnb29kIiB2YWx1ZXMgKi8KKwl4ZnNfcnR3b3JkX3QJd2RpZmY7CQkvKiBkaWZmZXJlbmNlIGZyb20gd2FudGVkIHZhbHVlICovCisJaW50CQl3b3JkOwkJLyogd29yZCBudW1iZXIgaW4gdGhlIGJ1ZmZlciAqLworCisJLyoKKwkgKiBDb21wdXRlIGFuZCByZWFkIGluIHN0YXJ0aW5nIGJpdG1hcCBibG9jayBmb3Igc3RhcnRpbmcgYmxvY2suCisJICovCisJYmxvY2sgPSBYRlNfQklUVE9CTE9DSyhtcCwgc3RhcnQpOworCWVycm9yID0geGZzX3J0YnVmX2dldChtcCwgdHAsIGJsb2NrLCAwLCAmYnApOworCWlmIChlcnJvcikgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCWJ1ZnAgPSAoeGZzX3J0d29yZF90ICopWEZTX0JVRl9QVFIoYnApOworCS8qCisJICogR2V0IHRoZSBmaXJzdCB3b3JkJ3MgaW5kZXggJiBwb2ludCB0byBpdC4KKwkgKi8KKwl3b3JkID0gWEZTX0JJVFRPV09SRChtcCwgc3RhcnQpOworCWIgPSAmYnVmcFt3b3JkXTsKKwliaXQgPSAoaW50KShzdGFydCAmIChYRlNfTkJXT1JEIC0gMSkpOworCWxlbiA9IHN0YXJ0IC0gbGltaXQgKyAxOworCS8qCisJICogQ29tcHV0ZSBtYXRjaCB2YWx1ZSwgYmFzZWQgb24gdGhlIGJpdCBhdCBzdGFydDogaWYgMSAoZnJlZSkKKwkgKiB0aGVuIGFsbC1vbmVzLCBlbHNlIGFsbC16ZXJvZXMuCisJICovCisJd2FudCA9ICgqYiAmICgoeGZzX3J0d29yZF90KTEgPDwgYml0KSkgPyAtMSA6IDA7CisJLyoKKwkgKiBJZiB0aGUgc3RhcnRpbmcgcG9zaXRpb24gaXMgbm90IHdvcmQtYWxpZ25lZCwgZGVhbCB3aXRoIHRoZQorCSAqIHBhcnRpYWwgd29yZC4KKwkgKi8KKwlpZiAoYml0IDwgWEZTX05CV09SRCAtIDEpIHsKKwkJLyoKKwkJICogQ2FsY3VsYXRlIGZpcnN0IChsZWZ0bW9zdCkgYml0IG51bWJlciB0byBsb29rIGF0LAorCQkgKiBhbmQgbWFzayBmb3IgYWxsIHRoZSByZWxldmFudCBiaXRzIGluIHRoaXMgd29yZC4KKwkJICovCisJCWZpcnN0Yml0ID0gWEZTX1JUTUFYKCh4ZnNfc3J0YmxvY2tfdCkoYml0IC0gbGVuICsgMSksIDApOworCQltYXNrID0gKCgoeGZzX3J0d29yZF90KTEgPDwgKGJpdCAtIGZpcnN0Yml0ICsgMSkpIC0gMSkgPDwKKwkJCWZpcnN0Yml0OworCQkvKgorCQkgKiBDYWxjdWxhdGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdmFsdWUgdGhlcmUKKwkJICogYW5kIHdoYXQgd2UncmUgbG9va2luZyBmb3IuCisJCSAqLworCQlpZiAoKHdkaWZmID0gKCpiIF4gd2FudCkgJiBtYXNrKSkgeworCQkJLyoKKwkJCSAqIERpZmZlcmVudC4gIE1hcmsgd2hlcmUgd2UgYXJlIGFuZCByZXR1cm4uCisJCQkgKi8KKwkJCXhmc190cmFuc19icmVsc2UodHAsIGJwKTsKKwkJCWkgPSBiaXQgLSBYRlNfUlRISUJJVCh3ZGlmZik7CisJCQkqcnRibG9jayA9IHN0YXJ0IC0gaSArIDE7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpID0gYml0IC0gZmlyc3RiaXQgKyAxOworCQkvKgorCQkgKiBHbyBvbiB0byBwcmV2aW91cyBibG9jayBpZiB0aGF0J3Mgd2hlcmUgdGhlIHByZXZpb3VzIHdvcmQgaXMKKwkJICogYW5kIHdlIG5lZWQgdGhlIHByZXZpb3VzIHdvcmQuCisJCSAqLworCQlpZiAoLS13b3JkID09IC0xICYmIGkgPCBsZW4pIHsKKwkJCS8qCisJCQkgKiBJZiBkb25lIHdpdGggdGhpcyBibG9jaywgZ2V0IHRoZSBwcmV2aW91cyBvbmUuCisJCQkgKi8KKwkJCXhmc190cmFuc19icmVsc2UodHAsIGJwKTsKKwkJCWVycm9yID0geGZzX3J0YnVmX2dldChtcCwgdHAsIC0tYmxvY2ssIDAsICZicCk7CisJCQlpZiAoZXJyb3IpIHsKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQl9CisJCQlidWZwID0gKHhmc19ydHdvcmRfdCAqKVhGU19CVUZfUFRSKGJwKTsKKwkJCXdvcmQgPSBYRlNfQkxPQ0tXTUFTSyhtcCk7CisJCQliID0gJmJ1ZnBbd29yZF07CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogR28gb24gdG8gdGhlIHByZXZpb3VzIHdvcmQgaW4gdGhlIGJ1ZmZlci4KKwkJCSAqLworCQkJYi0tOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogU3RhcnRpbmcgb24gYSB3b3JkIGJvdW5kYXJ5LCBubyBwYXJ0aWFsIHdvcmQuCisJCSAqLworCQlpID0gMDsKKwl9CisJLyoKKwkgKiBMb29wIG92ZXIgd2hvbGUgd29yZHMgaW4gYnVmZmVycy4gIFdoZW4gd2UgdXNlIHVwIG9uZSBidWZmZXIKKwkgKiB3ZSBtb3ZlIG9uIHRvIHRoZSBwcmV2aW91cyBvbmUuCisJICovCisJd2hpbGUgKGxlbiAtIGkgPj0gWEZTX05CV09SRCkgeworCQkvKgorCQkgKiBDb21wdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBhY3R1YWwgYW5kIGRlc2lyZWQgdmFsdWUuCisJCSAqLworCQlpZiAoKHdkaWZmID0gKmIgXiB3YW50KSkgeworCQkJLyoKKwkJCSAqIERpZmZlcmVudCwgbWFyayB3aGVyZSB3ZSBhcmUgYW5kIHJldHVybi4KKwkJCSAqLworCQkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOworCQkJaSArPSBYRlNfTkJXT1JEIC0gMSAtIFhGU19SVEhJQklUKHdkaWZmKTsKKwkJCSpydGJsb2NrID0gc3RhcnQgLSBpICsgMTsKKwkJCXJldHVybiAwOworCQl9CisJCWkgKz0gWEZTX05CV09SRDsKKwkJLyoKKwkJICogR28gb24gdG8gcHJldmlvdXMgYmxvY2sgaWYgdGhhdCdzIHdoZXJlIHRoZSBwcmV2aW91cyB3b3JkIGlzCisJCSAqIGFuZCB3ZSBuZWVkIHRoZSBwcmV2aW91cyB3b3JkLgorCQkgKi8KKwkJaWYgKC0td29yZCA9PSAtMSAmJiBpIDwgbGVuKSB7CisJCQkvKgorCQkJICogSWYgZG9uZSB3aXRoIHRoaXMgYmxvY2ssIGdldCB0aGUgcHJldmlvdXMgb25lLgorCQkJICovCisJCQl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBicCk7CisJCQllcnJvciA9IHhmc19ydGJ1Zl9nZXQobXAsIHRwLCAtLWJsb2NrLCAwLCAmYnApOworCQkJaWYgKGVycm9yKSB7CisJCQkJcmV0dXJuIGVycm9yOworCQkJfQorCQkJYnVmcCA9ICh4ZnNfcnR3b3JkX3QgKilYRlNfQlVGX1BUUihicCk7CisJCQl3b3JkID0gWEZTX0JMT0NLV01BU0sobXApOworCQkJYiA9ICZidWZwW3dvcmRdOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIEdvIG9uIHRvIHRoZSBwcmV2aW91cyB3b3JkIGluIHRoZSBidWZmZXIuCisJCQkgKi8KKwkJCWItLTsKKwkJfQorCX0KKwkvKgorCSAqIElmIG5vdCBlbmRpbmcgb24gYSB3b3JkIGJvdW5kYXJ5LCBkZWFsIHdpdGggdGhlIGxhc3QKKwkgKiAocGFydGlhbCkgd29yZC4KKwkgKi8KKwlpZiAobGVuIC0gaSkgeworCQkvKgorCQkgKiBDYWxjdWxhdGUgZmlyc3QgKGxlZnRtb3N0KSBiaXQgbnVtYmVyIHRvIGxvb2sgYXQsCisJCSAqIGFuZCBtYXNrIGZvciBhbGwgdGhlIHJlbGV2YW50IGJpdHMgaW4gdGhpcyB3b3JkLgorCQkgKi8KKwkJZmlyc3RiaXQgPSBYRlNfTkJXT1JEIC0gKGxlbiAtIGkpOworCQltYXNrID0gKCgoeGZzX3J0d29yZF90KTEgPDwgKGxlbiAtIGkpKSAtIDEpIDw8IGZpcnN0Yml0OworCQkvKgorCQkgKiBDb21wdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBhY3R1YWwgYW5kIGRlc2lyZWQgdmFsdWUuCisJCSAqLworCQlpZiAoKHdkaWZmID0gKCpiIF4gd2FudCkgJiBtYXNrKSkgeworCQkJLyoKKwkJCSAqIERpZmZlcmVudCwgbWFyayB3aGVyZSB3ZSBhcmUgYW5kIHJldHVybi4KKwkJCSAqLworCQkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOworCQkJaSArPSBYRlNfTkJXT1JEIC0gMSAtIFhGU19SVEhJQklUKHdkaWZmKTsKKwkJCSpydGJsb2NrID0gc3RhcnQgLSBpICsgMTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UKKwkJCWkgPSBsZW47CisJfQorCS8qCisJICogTm8gbWF0Y2gsIHJldHVybiB0aGF0IHdlIHNjYW5uZWQgdGhlIHdob2xlIGFyZWEuCisJICovCisJeGZzX3RyYW5zX2JyZWxzZSh0cCwgYnApOworCSpydGJsb2NrID0gc3RhcnQgLSBpICsgMTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNlYXJjaGluZyBmb3J3YXJkIGZyb20gc3RhcnQgdG8gbGltaXQsIGZpbmQgdGhlIGZpcnN0IGJsb2NrIHdob3NlCisgKiBhbGxvY2F0ZWQvZnJlZSBzdGF0ZSBpcyBkaWZmZXJlbnQgZnJvbSBzdGFydCdzLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfcnRmaW5kX2ZvcncoCisJeGZzX21vdW50X3QJKm1wLAkJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX3J0YmxvY2tfdAlzdGFydCwJCS8qIHN0YXJ0aW5nIGJsb2NrIHRvIGxvb2sgYXQgKi8KKwl4ZnNfcnRibG9ja190CWxpbWl0LAkJLyogbGFzdCBibG9jayB0byBsb29rIGF0ICovCisJeGZzX3J0YmxvY2tfdAkqcnRibG9jaykJLyogb3V0OiBzdGFydCBibG9jayBmb3VuZCAqLworeworCXhmc19ydHdvcmRfdAkqYjsJCS8qIGN1cnJlbnQgd29yZCBpbiBidWZmZXIgKi8KKwlpbnQJCWJpdDsJCS8qIGJpdCBudW1iZXIgaW4gdGhlIHdvcmQgKi8KKwl4ZnNfcnRibG9ja190CWJsb2NrOwkJLyogYml0bWFwIGJsb2NrIG51bWJlciAqLworCXhmc19idWZfdAkqYnA7CQkvKiBidWYgZm9yIHRoZSBibG9jayAqLworCXhmc19ydHdvcmRfdAkqYnVmcDsJCS8qIHN0YXJ0aW5nIHdvcmQgaW4gYnVmZmVyICovCisJaW50CQllcnJvcjsJCS8qIGVycm9yIHZhbHVlICovCisJeGZzX3J0YmxvY2tfdAlpOwkJLyogY3VycmVudCBiaXQgbnVtYmVyIHJlbC4gdG8gc3RhcnQgKi8KKwl4ZnNfcnRibG9ja190CWxhc3RiaXQ7CS8qIGxhc3QgdXNlZnVsIGJpdCBpbiB0aGUgd29yZCAqLworCXhmc19ydGJsb2NrX3QJbGVuOwkJLyogbGVuZ3RoIG9mIGluc3BlY3RlZCBhcmVhICovCisJeGZzX3J0d29yZF90CW1hc2s7CQkvKiBtYXNrIG9mIHJlbGV2YW50IGJpdHMgZm9yIHZhbHVlICovCisJeGZzX3J0d29yZF90CXdhbnQ7CQkvKiBtYXNrIGZvciAiZ29vZCIgdmFsdWVzICovCisJeGZzX3J0d29yZF90CXdkaWZmOwkJLyogZGlmZmVyZW5jZSBmcm9tIHdhbnRlZCB2YWx1ZSAqLworCWludAkJd29yZDsJCS8qIHdvcmQgbnVtYmVyIGluIHRoZSBidWZmZXIgKi8KKworCS8qCisJICogQ29tcHV0ZSBhbmQgcmVhZCBpbiBzdGFydGluZyBiaXRtYXAgYmxvY2sgZm9yIHN0YXJ0aW5nIGJsb2NrLgorCSAqLworCWJsb2NrID0gWEZTX0JJVFRPQkxPQ0sobXAsIHN0YXJ0KTsKKwllcnJvciA9IHhmc19ydGJ1Zl9nZXQobXAsIHRwLCBibG9jaywgMCwgJmJwKTsKKwlpZiAoZXJyb3IpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlidWZwID0gKHhmc19ydHdvcmRfdCAqKVhGU19CVUZfUFRSKGJwKTsKKwkvKgorCSAqIEdldCB0aGUgZmlyc3Qgd29yZCdzIGluZGV4ICYgcG9pbnQgdG8gaXQuCisJICovCisJd29yZCA9IFhGU19CSVRUT1dPUkQobXAsIHN0YXJ0KTsKKwliID0gJmJ1ZnBbd29yZF07CisJYml0ID0gKGludCkoc3RhcnQgJiAoWEZTX05CV09SRCAtIDEpKTsKKwlsZW4gPSBsaW1pdCAtIHN0YXJ0ICsgMTsKKwkvKgorCSAqIENvbXB1dGUgbWF0Y2ggdmFsdWUsIGJhc2VkIG9uIHRoZSBiaXQgYXQgc3RhcnQ6IGlmIDEgKGZyZWUpCisJICogdGhlbiBhbGwtb25lcywgZWxzZSBhbGwtemVyb2VzLgorCSAqLworCXdhbnQgPSAoKmIgJiAoKHhmc19ydHdvcmRfdCkxIDw8IGJpdCkpID8gLTEgOiAwOworCS8qCisJICogSWYgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGlzIG5vdCB3b3JkLWFsaWduZWQsIGRlYWwgd2l0aCB0aGUKKwkgKiBwYXJ0aWFsIHdvcmQuCisJICovCisJaWYgKGJpdCkgeworCQkvKgorCQkgKiBDYWxjdWxhdGUgbGFzdCAocmlnaHRtb3N0KSBiaXQgbnVtYmVyIHRvIGxvb2sgYXQsCisJCSAqIGFuZCBtYXNrIGZvciBhbGwgdGhlIHJlbGV2YW50IGJpdHMgaW4gdGhpcyB3b3JkLgorCQkgKi8KKwkJbGFzdGJpdCA9IFhGU19SVE1JTihiaXQgKyBsZW4sIFhGU19OQldPUkQpOworCQltYXNrID0gKCgoeGZzX3J0d29yZF90KTEgPDwgKGxhc3RiaXQgLSBiaXQpKSAtIDEpIDw8IGJpdDsKKwkJLyoKKwkJICogQ2FsY3VsYXRlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHZhbHVlIHRoZXJlCisJCSAqIGFuZCB3aGF0IHdlJ3JlIGxvb2tpbmcgZm9yLgorCQkgKi8KKwkJaWYgKCh3ZGlmZiA9ICgqYiBeIHdhbnQpICYgbWFzaykpIHsKKwkJCS8qCisJCQkgKiBEaWZmZXJlbnQuICBNYXJrIHdoZXJlIHdlIGFyZSBhbmQgcmV0dXJuLgorCQkJICovCisJCQl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBicCk7CisJCQlpID0gWEZTX1JUTE9CSVQod2RpZmYpIC0gYml0OworCQkJKnJ0YmxvY2sgPSBzdGFydCArIGkgLSAxOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaSA9IGxhc3RiaXQgLSBiaXQ7CisJCS8qCisJCSAqIEdvIG9uIHRvIG5leHQgYmxvY2sgaWYgdGhhdCdzIHdoZXJlIHRoZSBuZXh0IHdvcmQgaXMKKwkJICogYW5kIHdlIG5lZWQgdGhlIG5leHQgd29yZC4KKwkJICovCisJCWlmICgrK3dvcmQgPT0gWEZTX0JMT0NLV1NJWkUobXApICYmIGkgPCBsZW4pIHsKKwkJCS8qCisJCQkgKiBJZiBkb25lIHdpdGggdGhpcyBibG9jaywgZ2V0IHRoZSBwcmV2aW91cyBvbmUuCisJCQkgKi8KKwkJCXhmc190cmFuc19icmVsc2UodHAsIGJwKTsKKwkJCWVycm9yID0geGZzX3J0YnVmX2dldChtcCwgdHAsICsrYmxvY2ssIDAsICZicCk7CisJCQlpZiAoZXJyb3IpIHsKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQl9CisJCQliID0gYnVmcCA9ICh4ZnNfcnR3b3JkX3QgKilYRlNfQlVGX1BUUihicCk7CisJCQl3b3JkID0gMDsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBHbyBvbiB0byB0aGUgcHJldmlvdXMgd29yZCBpbiB0aGUgYnVmZmVyLgorCQkJICovCisJCQliKys7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBTdGFydGluZyBvbiBhIHdvcmQgYm91bmRhcnksIG5vIHBhcnRpYWwgd29yZC4KKwkJICovCisJCWkgPSAwOworCX0KKwkvKgorCSAqIExvb3Agb3ZlciB3aG9sZSB3b3JkcyBpbiBidWZmZXJzLiAgV2hlbiB3ZSB1c2UgdXAgb25lIGJ1ZmZlcgorCSAqIHdlIG1vdmUgb24gdG8gdGhlIG5leHQgb25lLgorCSAqLworCXdoaWxlIChsZW4gLSBpID49IFhGU19OQldPUkQpIHsKKwkJLyoKKwkJICogQ29tcHV0ZSBkaWZmZXJlbmNlIGJldHdlZW4gYWN0dWFsIGFuZCBkZXNpcmVkIHZhbHVlLgorCQkgKi8KKwkJaWYgKCh3ZGlmZiA9ICpiIF4gd2FudCkpIHsKKwkJCS8qCisJCQkgKiBEaWZmZXJlbnQsIG1hcmsgd2hlcmUgd2UgYXJlIGFuZCByZXR1cm4uCisJCQkgKi8KKwkJCXhmc190cmFuc19icmVsc2UodHAsIGJwKTsKKwkJCWkgKz0gWEZTX1JUTE9CSVQod2RpZmYpOworCQkJKnJ0YmxvY2sgPSBzdGFydCArIGkgLSAxOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaSArPSBYRlNfTkJXT1JEOworCQkvKgorCQkgKiBHbyBvbiB0byBuZXh0IGJsb2NrIGlmIHRoYXQncyB3aGVyZSB0aGUgbmV4dCB3b3JkIGlzCisJCSAqIGFuZCB3ZSBuZWVkIHRoZSBuZXh0IHdvcmQuCisJCSAqLworCQlpZiAoKyt3b3JkID09IFhGU19CTE9DS1dTSVpFKG1wKSAmJiBpIDwgbGVuKSB7CisJCQkvKgorCQkJICogSWYgZG9uZSB3aXRoIHRoaXMgYmxvY2ssIGdldCB0aGUgbmV4dCBvbmUuCisJCQkgKi8KKwkJCXhmc190cmFuc19icmVsc2UodHAsIGJwKTsKKwkJCWVycm9yID0geGZzX3J0YnVmX2dldChtcCwgdHAsICsrYmxvY2ssIDAsICZicCk7CisJCQlpZiAoZXJyb3IpIHsKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQl9CisJCQliID0gYnVmcCA9ICh4ZnNfcnR3b3JkX3QgKilYRlNfQlVGX1BUUihicCk7CisJCQl3b3JkID0gMDsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBHbyBvbiB0byB0aGUgbmV4dCB3b3JkIGluIHRoZSBidWZmZXIuCisJCQkgKi8KKwkJCWIrKzsKKwkJfQorCX0KKwkvKgorCSAqIElmIG5vdCBlbmRpbmcgb24gYSB3b3JkIGJvdW5kYXJ5LCBkZWFsIHdpdGggdGhlIGxhc3QKKwkgKiAocGFydGlhbCkgd29yZC4KKwkgKi8KKwlpZiAoKGxhc3RiaXQgPSBsZW4gLSBpKSkgeworCQkvKgorCQkgKiBDYWxjdWxhdGUgbWFzayBmb3IgYWxsIHRoZSByZWxldmFudCBiaXRzIGluIHRoaXMgd29yZC4KKwkJICovCisJCW1hc2sgPSAoKHhmc19ydHdvcmRfdCkxIDw8IGxhc3RiaXQpIC0gMTsKKwkJLyoKKwkJICogQ29tcHV0ZSBkaWZmZXJlbmNlIGJldHdlZW4gYWN0dWFsIGFuZCBkZXNpcmVkIHZhbHVlLgorCQkgKi8KKwkJaWYgKCh3ZGlmZiA9ICgqYiBeIHdhbnQpICYgbWFzaykpIHsKKwkJCS8qCisJCQkgKiBEaWZmZXJlbnQsIG1hcmsgd2hlcmUgd2UgYXJlIGFuZCByZXR1cm4uCisJCQkgKi8KKwkJCXhmc190cmFuc19icmVsc2UodHAsIGJwKTsKKwkJCWkgKz0gWEZTX1JUTE9CSVQod2RpZmYpOworCQkJKnJ0YmxvY2sgPSBzdGFydCArIGkgLSAxOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZQorCQkJaSA9IGxlbjsKKwl9CisJLyoKKwkgKiBObyBtYXRjaCwgcmV0dXJuIHRoYXQgd2Ugc2Nhbm5lZCB0aGUgd2hvbGUgYXJlYS4KKwkgKi8KKwl4ZnNfdHJhbnNfYnJlbHNlKHRwLCBicCk7CisJKnJ0YmxvY2sgPSBzdGFydCArIGkgLSAxOworCXJldHVybiAwOworfQorCisvKgorICogTWFyayBhbiBleHRlbnQgc3BlY2lmaWVkIGJ5IHN0YXJ0IGFuZCBsZW4gZnJlZWQuCisgKiBVcGRhdGVzIGFsbCB0aGUgc3VtbWFyeSBpbmZvcm1hdGlvbiBhcyB3ZWxsIGFzIHRoZSBiaXRtYXAuCisgKi8KK1NUQVRJQyBpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19ydGZyZWVfcmFuZ2UoCisJeGZzX21vdW50X3QJKm1wLAkJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX3J0YmxvY2tfdAlzdGFydCwJCS8qIHN0YXJ0aW5nIGJsb2NrIHRvIGZyZWUgKi8KKwl4ZnNfZXh0bGVuX3QJbGVuLAkJLyogbGVuZ3RoIHRvIGZyZWUgKi8KKwl4ZnNfYnVmX3QJKipyYnBwLAkJLyogaW4vb3V0OiBzdW1tYXJ5IGJsb2NrIGJ1ZmZlciAqLworCXhmc19mc2Jsb2NrX3QJKnJzYikJCS8qIGluL291dDogc3VtbWFyeSBibG9jayBudW1iZXIgKi8KK3sKKwl4ZnNfcnRibG9ja190CWVuZDsJCS8qIGVuZCBvZiB0aGUgZnJlZWQgZXh0ZW50ICovCisJaW50CQllcnJvcjsJCS8qIGVycm9yIHZhbHVlICovCisJeGZzX3J0YmxvY2tfdAlwb3N0YmxvY2s7CS8qIGZpcnN0IGJsb2NrIGZyZWVkID4gZW5kICovCisJeGZzX3J0YmxvY2tfdAlwcmVibG9jazsJLyogZmlyc3QgYmxvY2sgZnJlZWQgPCBzdGFydCAqLworCisJZW5kID0gc3RhcnQgKyBsZW4gLSAxOworCS8qCisJICogTW9kaWZ5IHRoZSBiaXRtYXAgdG8gbWFyayB0aGlzIGV4dGVudCBmcmVlZC4KKwkgKi8KKwllcnJvciA9IHhmc19ydG1vZGlmeV9yYW5nZShtcCwgdHAsIHN0YXJ0LCBsZW4sIDEpOworCWlmIChlcnJvcikgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCS8qCisJICogQXNzdW1lIHdlJ3JlIGZyZWVpbmcgb3V0IG9mIHRoZSBtaWRkbGUgb2YgYW4gYWxsb2NhdGVkIGV4dGVudC4KKwkgKiBXZSBuZWVkIHRvIGZpbmQgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIHRoZSBleHRlbnQgc28gd2UgY2FuCisJICogcHJvcGVybHkgdXBkYXRlIHRoZSBzdW1tYXJ5LgorCSAqLworCWVycm9yID0geGZzX3J0ZmluZF9iYWNrKG1wLCB0cCwgc3RhcnQsIDAsICZwcmVibG9jayk7CisJaWYgKGVycm9yKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJLyoKKwkgKiBGaW5kIHRoZSBuZXh0IGFsbG9jYXRlZCBibG9jayAoZW5kIG9mIGFsbG9jYXRlZCBleHRlbnQpLgorCSAqLworCWVycm9yID0geGZzX3J0ZmluZF9mb3J3KG1wLCB0cCwgZW5kLCBtcC0+bV9zYi5zYl9yZXh0ZW50cyAtIDEsCisJCSZwb3N0YmxvY2spOworCS8qCisJICogSWYgdGhlcmUgYXJlIGJsb2NrcyBub3QgYmVpbmcgZnJlZWQgYXQgdGhlIGZyb250IG9mIHRoZQorCSAqIG9sZCBleHRlbnQsIGFkZCBzdW1tYXJ5IGRhdGEgZm9yIHRoZW0gdG8gYmUgYWxsb2NhdGVkLgorCSAqLworCWlmIChwcmVibG9jayA8IHN0YXJ0KSB7CisJCWVycm9yID0geGZzX3J0bW9kaWZ5X3N1bW1hcnkobXAsIHRwLAorCQkJWEZTX1JUQkxPQ0tMT0coc3RhcnQgLSBwcmVibG9jayksCisJCQlYRlNfQklUVE9CTE9DSyhtcCwgcHJlYmxvY2spLCAtMSwgcmJwcCwgcnNiKTsKKwkJaWYgKGVycm9yKSB7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwl9CisJLyoKKwkgKiBJZiB0aGVyZSBhcmUgYmxvY2tzIG5vdCBiZWluZyBmcmVlZCBhdCB0aGUgZW5kIG9mIHRoZQorCSAqIG9sZCBleHRlbnQsIGFkZCBzdW1tYXJ5IGRhdGEgZm9yIHRoZW0gdG8gYmUgYWxsb2NhdGVkLgorCSAqLworCWlmIChwb3N0YmxvY2sgPiBlbmQpIHsKKwkJZXJyb3IgPSB4ZnNfcnRtb2RpZnlfc3VtbWFyeShtcCwgdHAsCisJCQlYRlNfUlRCTE9DS0xPRyhwb3N0YmxvY2sgLSBlbmQpLAorCQkJWEZTX0JJVFRPQkxPQ0sobXAsIGVuZCArIDEpLCAtMSwgcmJwcCwgcnNiKTsKKwkJaWYgKGVycm9yKSB7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwl9CisJLyoKKwkgKiBJbmNyZW1lbnQgdGhlIHN1bW1hcnkgaW5mb3JtYXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgZW50aXJlCisJICogKG5ldykgZnJlZSBleHRlbnQuCisJICovCisJZXJyb3IgPSB4ZnNfcnRtb2RpZnlfc3VtbWFyeShtcCwgdHAsCisJCVhGU19SVEJMT0NLTE9HKHBvc3RibG9jayArIDEgLSBwcmVibG9jayksCisJCVhGU19CSVRUT0JMT0NLKG1wLCBwcmVibG9jayksIDEsIHJicHAsIHJzYik7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogUmVhZCBhbmQgcmV0dXJuIHRoZSBzdW1tYXJ5IGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIGV4dGVudCBzaXplLAorICogYml0bWFwIGJsb2NrIGNvbWJpbmF0aW9uLgorICogS2VlcHMgdHJhY2sgb2YgYSBjdXJyZW50IHN1bW1hcnkgYmxvY2ssIHNvIHdlIGRvbid0IGtlZXAgcmVhZGluZworICogaXQgZnJvbSB0aGUgYnVmZmVyIGNhY2hlLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfcnRnZXRfc3VtbWFyeSgKKwl4ZnNfbW91bnRfdAkqbXAsCQkvKiBmaWxlIHN5c3RlbSBtb3VudCBzdHJ1Y3R1cmUgKi8KKwl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJaW50CQlsb2csCQkvKiBsb2cyIG9mIGV4dGVudCBzaXplICovCisJeGZzX3J0YmxvY2tfdAliYm5vLAkJLyogYml0bWFwIGJsb2NrIG51bWJlciAqLworCXhmc19idWZfdAkqKnJicHAsCQkvKiBpbi9vdXQ6IHN1bW1hcnkgYmxvY2sgYnVmZmVyICovCisJeGZzX2ZzYmxvY2tfdAkqcnNiLAkJLyogaW4vb3V0OiBzdW1tYXJ5IGJsb2NrIG51bWJlciAqLworCXhmc19zdW1pbmZvX3QJKnN1bSkJCS8qIG91dDogc3VtbWFyeSBpbmZvIGZvciB0aGlzIGJsb2NrICovCit7CisJeGZzX2J1Zl90CSpicDsJCS8qIGJ1ZmZlciBmb3Igc3VtbWFyeSBibG9jayAqLworCWludAkJZXJyb3I7CQkvKiBlcnJvciB2YWx1ZSAqLworCXhmc19mc2Jsb2NrX3QJc2I7CQkvKiBzdW1tYXJ5IGZzYmxvY2sgKi8KKwlpbnQJCXNvOwkJLyogaW5kZXggaW50byB0aGUgc3VtbWFyeSBmaWxlICovCisJeGZzX3N1bWluZm9fdAkqc3A7CQkvKiBwb2ludGVyIHRvIHJldHVybmVkIGRhdGEgKi8KKworCS8qCisJICogQ29tcHV0ZSBlbnRyeSBudW1iZXIgaW4gdGhlIHN1bW1hcnkgZmlsZS4KKwkgKi8KKwlzbyA9IFhGU19TVU1PRkZTKG1wLCBsb2csIGJibm8pOworCS8qCisJICogQ29tcHV0ZSB0aGUgYmxvY2sgbnVtYmVyIGluIHRoZSBzdW1tYXJ5IGZpbGUuCisJICovCisJc2IgPSBYRlNfU1VNT0ZGU1RPQkxPQ0sobXAsIHNvKTsKKwkvKgorCSAqIElmIHdlIGhhdmUgYW4gb2xkIGJ1ZmZlciwgYW5kIHRoZSBibG9jayBudW1iZXIgbWF0Y2hlcywgdXNlIHRoYXQuCisJICovCisJaWYgKHJicHAgJiYgKnJicHAgJiYgKnJzYiA9PSBzYikKKwkJYnAgPSAqcmJwcDsKKwkvKgorCSAqIE90aGVyd2lzZSB3ZSBoYXZlIHRvIGdldCB0aGUgYnVmZmVyLgorCSAqLworCWVsc2UgeworCQkvKgorCQkgKiBJZiB0aGVyZSB3YXMgYW4gb2xkIG9uZSwgZ2V0IHJpZCBvZiBpdCBmaXJzdC4KKwkJICovCisJCWlmIChyYnBwICYmICpyYnBwKQorCQkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgKnJicHApOworCQllcnJvciA9IHhmc19ydGJ1Zl9nZXQobXAsIHRwLCBzYiwgMSwgJmJwKTsKKwkJaWYgKGVycm9yKSB7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJLyoKKwkJICogUmVtZW1iZXIgdGhpcyBidWZmZXIgYW5kIGJsb2NrIGZvciB0aGUgbmV4dCBjYWxsLgorCQkgKi8KKwkJaWYgKHJicHApIHsKKwkJCSpyYnBwID0gYnA7CisJCQkqcnNiID0gc2I7CisJCX0KKwl9CisJLyoKKwkgKiBQb2ludCB0byB0aGUgc3VtbWFyeSBpbmZvcm1hdGlvbiAmIGNvcHkgaXQgb3V0LgorCSAqLworCXNwID0gWEZTX1NVTVBUUihtcCwgYnAsIHNvKTsKKwkqc3VtID0gKnNwOworCS8qCisJICogRHJvcCB0aGUgYnVmZmVyIGlmIHdlJ3JlIG5vdCBhc2tlZCB0byByZW1lbWJlciBpdC4KKwkgKi8KKwlpZiAoIXJicHApCisJCXhmc190cmFuc19icmVsc2UodHAsIGJwKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNldCB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgYml0bWFwIGJpdHMgdG8gdGhlIGdpdmVuIHZhbHVlLgorICogRG8gd2hhdGV2ZXIgSS9PIGFuZCBsb2dnaW5nIGlzIHJlcXVpcmVkLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfcnRtb2RpZnlfcmFuZ2UoCisJeGZzX21vdW50X3QJKm1wLAkJLyogZmlsZSBzeXN0ZW0gbW91bnQgcG9pbnQgKi8KKwl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX3J0YmxvY2tfdAlzdGFydCwJCS8qIHN0YXJ0aW5nIGJsb2NrIHRvIG1vZGlmeSAqLworCXhmc19leHRsZW5fdAlsZW4sCQkvKiBsZW5ndGggb2YgZXh0ZW50IHRvIG1vZGlmeSAqLworCWludAkJdmFsKQkJLyogMSBmb3IgZnJlZSwgMCBmb3IgYWxsb2NhdGVkICovCit7CisJeGZzX3J0d29yZF90CSpiOwkJLyogY3VycmVudCB3b3JkIGluIGJ1ZmZlciAqLworCWludAkJYml0OwkJLyogYml0IG51bWJlciBpbiB0aGUgd29yZCAqLworCXhmc19ydGJsb2NrX3QJYmxvY2s7CQkvKiBiaXRtYXAgYmxvY2sgbnVtYmVyICovCisJeGZzX2J1Zl90CSpicDsJCS8qIGJ1ZiBmb3IgdGhlIGJsb2NrICovCisJeGZzX3J0d29yZF90CSpidWZwOwkJLyogc3RhcnRpbmcgd29yZCBpbiBidWZmZXIgKi8KKwlpbnQJCWVycm9yOwkJLyogZXJyb3IgdmFsdWUgKi8KKwl4ZnNfcnR3b3JkX3QJKmZpcnN0OwkJLyogZmlyc3QgdXNlZCB3b3JkIGluIHRoZSBidWZmZXIgKi8KKwlpbnQJCWk7CQkvKiBjdXJyZW50IGJpdCBudW1iZXIgcmVsLiB0byBzdGFydCAqLworCWludAkJbGFzdGJpdDsJLyogbGFzdCB1c2VmdWwgYml0IGluIHdvcmQgKi8KKwl4ZnNfcnR3b3JkX3QJbWFzazsJCS8qIG1hc2sgbyBmcmVsZXZhbnQgYml0cyBmb3IgdmFsdWUgKi8KKwlpbnQJCXdvcmQ7CQkvKiB3b3JkIG51bWJlciBpbiB0aGUgYnVmZmVyICovCisKKwkvKgorCSAqIENvbXB1dGUgc3RhcnRpbmcgYml0bWFwIGJsb2NrIG51bWJlci4KKwkgKi8KKwlibG9jayA9IFhGU19CSVRUT0JMT0NLKG1wLCBzdGFydCk7CisJLyoKKwkgKiBSZWFkIHRoZSBiaXRtYXAgYmxvY2ssIGFuZCBwb2ludCB0byBpdHMgZGF0YS4KKwkgKi8KKwllcnJvciA9IHhmc19ydGJ1Zl9nZXQobXAsIHRwLCBibG9jaywgMCwgJmJwKTsKKwlpZiAoZXJyb3IpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKwlidWZwID0gKHhmc19ydHdvcmRfdCAqKVhGU19CVUZfUFRSKGJwKTsKKwkvKgorCSAqIENvbXB1dGUgdGhlIHN0YXJ0aW5nIHdvcmQncyBhZGRyZXNzLCBhbmQgc3RhcnRpbmcgYml0LgorCSAqLworCXdvcmQgPSBYRlNfQklUVE9XT1JEKG1wLCBzdGFydCk7CisJZmlyc3QgPSBiID0gJmJ1ZnBbd29yZF07CisJYml0ID0gKGludCkoc3RhcnQgJiAoWEZTX05CV09SRCAtIDEpKTsKKwkvKgorCSAqIDAgKGFsbG9jYXRlZCkgPT4gYWxsIHplcm9lczsgMSAoZnJlZSkgPT4gYWxsIG9uZXMuCisJICovCisJdmFsID0gLXZhbDsKKwkvKgorCSAqIElmIG5vdCBzdGFydGluZyBvbiBhIHdvcmQgYm91bmRhcnksIGRlYWwgd2l0aCB0aGUgZmlyc3QKKwkgKiAocGFydGlhbCkgd29yZC4KKwkgKi8KKwlpZiAoYml0KSB7CisJCS8qCisJCSAqIENvbXB1dGUgZmlyc3QgYml0IG5vdCBjaGFuZ2VkIGFuZCBtYXNrIG9mIHJlbGV2YW50IGJpdHMuCisJCSAqLworCQlsYXN0Yml0ID0gWEZTX1JUTUlOKGJpdCArIGxlbiwgWEZTX05CV09SRCk7CisJCW1hc2sgPSAoKCh4ZnNfcnR3b3JkX3QpMSA8PCAobGFzdGJpdCAtIGJpdCkpIC0gMSkgPDwgYml0OworCQkvKgorCQkgKiBTZXQvY2xlYXIgdGhlIGFjdGl2ZSBiaXRzLgorCQkgKi8KKwkJaWYgKHZhbCkKKwkJCSpiIHw9IG1hc2s7CisJCWVsc2UKKwkJCSpiICY9IH5tYXNrOworCQlpID0gbGFzdGJpdCAtIGJpdDsKKwkJLyoKKwkJICogR28gb24gdG8gdGhlIG5leHQgYmxvY2sgaWYgdGhhdCdzIHdoZXJlIHRoZSBuZXh0IHdvcmQgaXMKKwkJICogYW5kIHdlIG5lZWQgdGhlIG5leHQgd29yZC4KKwkJICovCisJCWlmICgrK3dvcmQgPT0gWEZTX0JMT0NLV1NJWkUobXApICYmIGkgPCBsZW4pIHsKKwkJCS8qCisJCQkgKiBMb2cgdGhlIGNoYW5nZWQgcGFydCBvZiB0aGlzIGJsb2NrLgorCQkJICogR2V0IHRoZSBuZXh0IG9uZS4KKwkJCSAqLworCQkJeGZzX3RyYW5zX2xvZ19idWYodHAsIGJwLAorCQkJCSh1aW50KSgoY2hhciAqKWZpcnN0IC0gKGNoYXIgKilidWZwKSwKKwkJCQkodWludCkoKGNoYXIgKiliIC0gKGNoYXIgKilidWZwKSk7CisJCQllcnJvciA9IHhmc19ydGJ1Zl9nZXQobXAsIHRwLCArK2Jsb2NrLCAwLCAmYnApOworCQkJaWYgKGVycm9yKSB7CisJCQkJcmV0dXJuIGVycm9yOworCQkJfQorCQkJZmlyc3QgPSBiID0gYnVmcCA9ICh4ZnNfcnR3b3JkX3QgKilYRlNfQlVGX1BUUihicCk7CisJCQl3b3JkID0gMDsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBHbyBvbiB0byB0aGUgbmV4dCB3b3JkIGluIHRoZSBidWZmZXIKKwkJCSAqLworCQkJYisrOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogU3RhcnRpbmcgb24gYSB3b3JkIGJvdW5kYXJ5LCBubyBwYXJ0aWFsIHdvcmQuCisJCSAqLworCQlpID0gMDsKKwl9CisJLyoKKwkgKiBMb29wIG92ZXIgd2hvbGUgd29yZHMgaW4gYnVmZmVycy4gIFdoZW4gd2UgdXNlIHVwIG9uZSBidWZmZXIKKwkgKiB3ZSBtb3ZlIG9uIHRvIHRoZSBuZXh0IG9uZS4KKwkgKi8KKwl3aGlsZSAobGVuIC0gaSA+PSBYRlNfTkJXT1JEKSB7CisJCS8qCisJCSAqIFNldCB0aGUgd29yZCB2YWx1ZSBjb3JyZWN0bHkuCisJCSAqLworCQkqYiA9IHZhbDsKKwkJaSArPSBYRlNfTkJXT1JEOworCQkvKgorCQkgKiBHbyBvbiB0byB0aGUgbmV4dCBibG9jayBpZiB0aGF0J3Mgd2hlcmUgdGhlIG5leHQgd29yZCBpcworCQkgKiBhbmQgd2UgbmVlZCB0aGUgbmV4dCB3b3JkLgorCQkgKi8KKwkJaWYgKCsrd29yZCA9PSBYRlNfQkxPQ0tXU0laRShtcCkgJiYgaSA8IGxlbikgeworCQkJLyoKKwkJCSAqIExvZyB0aGUgY2hhbmdlZCBwYXJ0IG9mIHRoaXMgYmxvY2suCisJCQkgKiBHZXQgdGhlIG5leHQgb25lLgorCQkJICovCisJCQl4ZnNfdHJhbnNfbG9nX2J1Zih0cCwgYnAsCisJCQkJKHVpbnQpKChjaGFyICopZmlyc3QgLSAoY2hhciAqKWJ1ZnApLAorCQkJCSh1aW50KSgoY2hhciAqKWIgLSAoY2hhciAqKWJ1ZnApKTsKKwkJCWVycm9yID0geGZzX3J0YnVmX2dldChtcCwgdHAsICsrYmxvY2ssIDAsICZicCk7CisJCQlpZiAoZXJyb3IpIHsKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQl9CisJCQlmaXJzdCA9IGIgPSBidWZwID0gKHhmc19ydHdvcmRfdCAqKVhGU19CVUZfUFRSKGJwKTsKKwkJCXdvcmQgPSAwOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIEdvIG9uIHRvIHRoZSBuZXh0IHdvcmQgaW4gdGhlIGJ1ZmZlcgorCQkJICovCisJCQliKys7CisJCX0KKwl9CisJLyoKKwkgKiBJZiBub3QgZW5kaW5nIG9uIGEgd29yZCBib3VuZGFyeSwgZGVhbCB3aXRoIHRoZSBsYXN0CisJICogKHBhcnRpYWwpIHdvcmQuCisJICovCisJaWYgKChsYXN0Yml0ID0gbGVuIC0gaSkpIHsKKwkJLyoKKwkJICogQ29tcHV0ZSBhIG1hc2sgb2YgcmVsZXZhbnQgYml0cy4KKwkJICovCisJCWJpdCA9IDA7CisJCW1hc2sgPSAoKHhmc19ydHdvcmRfdCkxIDw8IGxhc3RiaXQpIC0gMTsKKwkJLyoKKwkJICogU2V0L2NsZWFyIHRoZSBhY3RpdmUgYml0cy4KKwkJICovCisJCWlmICh2YWwpCisJCQkqYiB8PSBtYXNrOworCQllbHNlCisJCQkqYiAmPSB+bWFzazsKKwkJYisrOworCX0KKwkvKgorCSAqIExvZyBhbnkgcmVtYWluaW5nIGNoYW5nZWQgYnl0ZXMuCisJICovCisJaWYgKGIgPiBmaXJzdCkKKwkJeGZzX3RyYW5zX2xvZ19idWYodHAsIGJwLCAodWludCkoKGNoYXIgKilmaXJzdCAtIChjaGFyICopYnVmcCksCisJCQkodWludCkoKGNoYXIgKiliIC0gKGNoYXIgKilidWZwIC0gMSkpOworCXJldHVybiAwOworfQorCisvKgorICogUmVhZCBhbmQgbW9kaWZ5IHRoZSBzdW1tYXJ5IGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIGV4dGVudCBzaXplLAorICogYml0bWFwIGJsb2NrIGNvbWJpbmF0aW9uLgorICogS2VlcHMgdHJhY2sgb2YgYSBjdXJyZW50IHN1bW1hcnkgYmxvY2ssIHNvIHdlIGRvbid0IGtlZXAgcmVhZGluZworICogaXQgZnJvbSB0aGUgYnVmZmVyIGNhY2hlLgorICovCitTVEFUSUMgaW50CQkJCS8qIGVycm9yICovCit4ZnNfcnRtb2RpZnlfc3VtbWFyeSgKKwl4ZnNfbW91bnRfdAkqbXAsCQkvKiBmaWxlIHN5c3RlbSBtb3VudCBwb2ludCAqLworCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwlpbnQJCWxvZywJCS8qIGxvZzIgb2YgZXh0ZW50IHNpemUgKi8KKwl4ZnNfcnRibG9ja190CWJibm8sCQkvKiBiaXRtYXAgYmxvY2sgbnVtYmVyICovCisJaW50CQlkZWx0YSwJCS8qIGNoYW5nZSB0byBtYWtlIHRvIHN1bW1hcnkgaW5mbyAqLworCXhmc19idWZfdAkqKnJicHAsCQkvKiBpbi9vdXQ6IHN1bW1hcnkgYmxvY2sgYnVmZmVyICovCisJeGZzX2ZzYmxvY2tfdAkqcnNiKQkJLyogaW4vb3V0OiBzdW1tYXJ5IGJsb2NrIG51bWJlciAqLworeworCXhmc19idWZfdAkqYnA7CQkvKiBidWZmZXIgZm9yIHRoZSBzdW1tYXJ5IGJsb2NrICovCisJaW50CQllcnJvcjsJCS8qIGVycm9yIHZhbHVlICovCisJeGZzX2ZzYmxvY2tfdAlzYjsJCS8qIHN1bW1hcnkgZnNibG9jayAqLworCWludAkJc287CQkvKiBpbmRleCBpbnRvIHRoZSBzdW1tYXJ5IGZpbGUgKi8KKwl4ZnNfc3VtaW5mb190CSpzcDsJCS8qIHBvaW50ZXIgdG8gcmV0dXJuZWQgZGF0YSAqLworCisJLyoKKwkgKiBDb21wdXRlIGVudHJ5IG51bWJlciBpbiB0aGUgc3VtbWFyeSBmaWxlLgorCSAqLworCXNvID0gWEZTX1NVTU9GRlMobXAsIGxvZywgYmJubyk7CisJLyoKKwkgKiBDb21wdXRlIHRoZSBibG9jayBudW1iZXIgaW4gdGhlIHN1bW1hcnkgZmlsZS4KKwkgKi8KKwlzYiA9IFhGU19TVU1PRkZTVE9CTE9DSyhtcCwgc28pOworCS8qCisJICogSWYgd2UgaGF2ZSBhbiBvbGQgYnVmZmVyLCBhbmQgdGhlIGJsb2NrIG51bWJlciBtYXRjaGVzLCB1c2UgdGhhdC4KKwkgKi8KKwlpZiAocmJwcCAmJiAqcmJwcCAmJiAqcnNiID09IHNiKQorCQlicCA9ICpyYnBwOworCS8qCisJICogT3RoZXJ3aXNlIHdlIGhhdmUgdG8gZ2V0IHRoZSBidWZmZXIuCisJICovCisJZWxzZSB7CisJCS8qCisJCSAqIElmIHRoZXJlIHdhcyBhbiBvbGQgb25lLCBnZXQgcmlkIG9mIGl0IGZpcnN0LgorCQkgKi8KKwkJaWYgKHJicHAgJiYgKnJicHApCisJCQl4ZnNfdHJhbnNfYnJlbHNlKHRwLCAqcmJwcCk7CisJCWVycm9yID0geGZzX3J0YnVmX2dldChtcCwgdHAsIHNiLCAxLCAmYnApOworCQlpZiAoZXJyb3IpIHsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCQkvKgorCQkgKiBSZW1lbWJlciB0aGlzIGJ1ZmZlciBhbmQgYmxvY2sgZm9yIHRoZSBuZXh0IGNhbGwuCisJCSAqLworCQlpZiAocmJwcCkgeworCQkJKnJicHAgPSBicDsKKwkJCSpyc2IgPSBzYjsKKwkJfQorCX0KKwkvKgorCSAqIFBvaW50IHRvIHRoZSBzdW1tYXJ5IGluZm9ybWF0aW9uLCBtb2RpZnkgYW5kIGxvZyBpdC4KKwkgKi8KKwlzcCA9IFhGU19TVU1QVFIobXAsIGJwLCBzbyk7CisJKnNwICs9IGRlbHRhOworCXhmc190cmFuc19sb2dfYnVmKHRwLCBicCwgKHVpbnQpKChjaGFyICopc3AgLSAoY2hhciAqKVhGU19CVUZfUFRSKGJwKSksCisJCSh1aW50KSgoY2hhciAqKXNwIC0gKGNoYXIgKilYRlNfQlVGX1BUUihicCkgKyBzaXplb2YoKnNwKSAtIDEpKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFZpc2libGUgKGV4cG9ydGVkKSBmdW5jdGlvbnMuCisgKi8KKworLyoKKyAqIEdyb3cgdGhlIHJlYWx0aW1lIGFyZWEgb2YgdGhlIGZpbGVzeXN0ZW0uCisgKi8KK2ludAoreGZzX2dyb3dmc19ydCgKKwl4ZnNfbW91bnRfdAkqbXAsCQkvKiBtb3VudCBwb2ludCBmb3IgZmlsZXN5c3RlbSAqLworCXhmc19ncm93ZnNfcnRfdAkqaW4pCQkvKiBncm93ZnMgcnQgaW5wdXQgc3RydWN0ICovCit7CisJeGZzX3J0YmxvY2tfdAlibWJubzsJCS8qIGJpdG1hcCBibG9jayBudW1iZXIgKi8KKwl4ZnNfYnVmX3QJKmJwOwkJLyogdGVtcG9yYXJ5IGJ1ZmZlciAqLworCWludAkJY2FuY2VsZmxhZ3M7CS8qIGZsYWdzIGZvciB4ZnNfdHJhbnNfY2FuY2VsICovCisJaW50CQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCXhmc19pbm9kZV90CSppcDsJCS8qIGJpdG1hcCBpbm9kZSwgdXNlZCBhcyBsb2NrICovCisJeGZzX21vdW50X3QJKm5tcDsJCS8qIG5ldyAoZmFrZSkgbW91bnQgc3RydWN0dXJlICovCisJeGZzX2RyZnNibm9fdAlucmJsb2NrczsJLyogbmV3IG51bWJlciBvZiByZWFsdGltZSBibG9ja3MgKi8KKwl4ZnNfZXh0bGVuX3QJbnJibWJsb2NrczsJLyogbmV3IG51bWJlciBvZiBydCBiaXRtYXAgYmxvY2tzICovCisJeGZzX2RydGJub190CW5yZXh0ZW50czsJLyogbmV3IG51bWJlciBvZiByZWFsdGltZSBleHRlbnRzICovCisJdWludDhfdAkJbnJleHRzbG9nOwkvKiBuZXcgbG9nMiBvZiBzYl9yZXh0ZW50cyAqLworCXhmc19leHRsZW5fdAlucnN1bWJsb2NrczsJLyogbmV3IG51bWJlciBvZiBzdW1tYXJ5IGJsb2NrcyAqLworCXVpbnQJCW5yc3VtbGV2ZWxzOwkvKiBuZXcgcnQgc3VtbWFyeSBsZXZlbHMgKi8KKwl1aW50CQlucnN1bXNpemU7CS8qIG5ldyBzaXplIG9mIHJ0IHN1bW1hcnksIGJ5dGVzICovCisJeGZzX3NiX3QJKm5zYnA7CQkvKiBuZXcgc3VwZXJibG9jayAqLworCXhmc19leHRsZW5fdAlyYm1ibG9ja3M7CS8qIGN1cnJlbnQgbnVtYmVyIG9mIHJ0IGJpdG1hcCBibG9ja3MgKi8KKwl4ZnNfZXh0bGVuX3QJcnN1bWJsb2NrczsJLyogY3VycmVudCBudW1iZXIgb2YgcnQgc3VtbWFyeSBibGtzICovCisJeGZzX3NiX3QJKnNicDsJCS8qIG9sZCBzdXBlcmJsb2NrICovCisJeGZzX2ZzYmxvY2tfdAlzdW1ibm87CQkvKiBzdW1tYXJ5IGJsb2NrIG51bWJlciAqLworCXhmc190cmFuc190CSp0cDsJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKworCXNicCA9ICZtcC0+bV9zYjsKKwkvKgorCSAqIEluaXRpYWwgZXJyb3IgY2hlY2tpbmcuCisJICovCisJaWYgKG1wLT5tX3J0ZGV2X3RhcmdwIHx8IG1wLT5tX3JibWlwID09IE5VTEwgfHwKKwkgICAgKG5yYmxvY2tzID0gaW4tPm5ld2Jsb2NrcykgPD0gc2JwLT5zYl9yYmxvY2tzIHx8CisJICAgIChzYnAtPnNiX3JibG9ja3MgJiYgKGluLT5leHRzaXplICE9IHNicC0+c2JfcmV4dHNpemUpKSkKKwkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCS8qCisJICogUmVhZCBpbiB0aGUgbGFzdCBibG9jayBvZiB0aGUgZGV2aWNlLCBtYWtlIHN1cmUgaXQgZXhpc3RzLgorCSAqLworCWVycm9yID0geGZzX3JlYWRfYnVmKG1wLCBtcC0+bV9ydGRldl90YXJncCwKKwkJCVhGU19GU0JfVE9fQkIobXAsIGluLT5uZXdibG9ja3MgLSAxKSwKKwkJCVhGU19GU0JfVE9fQkIobXAsIDEpLCAwLCAmYnApOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCUFTU0VSVChicCk7CisJeGZzX2J1Zl9yZWxzZShicCk7CisJLyoKKwkgKiBDYWxjdWxhdGUgbmV3IHBhcmFtZXRlcnMuICBUaGVzZSBhcmUgdGhlIGZpbmFsIHZhbHVlcyB0byBiZSByZWFjaGVkLgorCSAqLworCW5yZXh0ZW50cyA9IG5yYmxvY2tzOworCWRvX2RpdihucmV4dGVudHMsIGluLT5leHRzaXplKTsKKwlucmJtYmxvY2tzID0gcm91bmR1cF82NChucmV4dGVudHMsIE5CQlkgKiBzYnAtPnNiX2Jsb2Nrc2l6ZSk7CisJbnJleHRzbG9nID0geGZzX2hpZ2hiaXQzMihucmV4dGVudHMpOworCW5yc3VtbGV2ZWxzID0gbnJleHRzbG9nICsgMTsKKwlucnN1bXNpemUgPSAodWludClzaXplb2YoeGZzX3N1bWluZm9fdCkgKiBucnN1bWxldmVscyAqIG5yYm1ibG9ja3M7CisJbnJzdW1ibG9ja3MgPSBYRlNfQl9UT19GU0IobXAsIG5yc3Vtc2l6ZSk7CisJbnJzdW1zaXplID0gWEZTX0ZTQl9UT19CKG1wLCBucnN1bWJsb2Nrcyk7CisJLyoKKwkgKiBOZXcgc3VtbWFyeSBzaXplIGNhbid0IGJlIG1vcmUgdGhhbiBoYWxmIHRoZSBzaXplIG9mCisJICogdGhlIGxvZy4gIFRoaXMgcHJldmVudHMgdXMgZnJvbSBnZXR0aW5nIGEgbG9nIG92ZXJmbG93LAorCSAqIHNpbmNlIHdlJ2xsIGxvZyBiYXNpY2FsbHkgdGhlIHdob2xlIHN1bW1hcnkgZmlsZSBhdCBvbmNlLgorCSAqLworCWlmIChucnN1bWJsb2NrcyA+IChtcC0+bV9zYi5zYl9sb2dibG9ja3MgPj4gMSkpCisJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKwkvKgorCSAqIEdldCB0aGUgb2xkIGJsb2NrIGNvdW50cyBmb3IgYml0bWFwIGFuZCBzdW1tYXJ5IGlub2Rlcy4KKwkgKiBUaGVzZSBjYW4ndCBjaGFuZ2Ugc2luY2Ugb3RoZXIgZ3Jvd2ZzIGNhbGxlcnMgYXJlIGxvY2tlZCBvdXQuCisJICovCisJcmJtYmxvY2tzID0gWEZTX0JfVE9fRlNCKG1wLCBtcC0+bV9yYm1pcC0+aV9kLmRpX3NpemUpOworCXJzdW1ibG9ja3MgPSBYRlNfQl9UT19GU0IobXAsIG1wLT5tX3JzdW1pcC0+aV9kLmRpX3NpemUpOworCS8qCisJICogQWxsb2NhdGUgc3BhY2UgdG8gdGhlIGJpdG1hcCBhbmQgc3VtbWFyeSBmaWxlcywgYXMgbmVjZXNzYXJ5LgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfZ3Jvd2ZzX3J0X2FsbG9jKG1wLCByYm1ibG9ja3MsIG5yYm1ibG9ja3MsCisJCQltcC0+bV9zYi5zYl9yYm1pbm8pKSkKKwkJcmV0dXJuIGVycm9yOworCWlmICgoZXJyb3IgPSB4ZnNfZ3Jvd2ZzX3J0X2FsbG9jKG1wLCByc3VtYmxvY2tzLCBucnN1bWJsb2NrcywKKwkJCW1wLT5tX3NiLnNiX3JzdW1pbm8pKSkKKwkJcmV0dXJuIGVycm9yOworCW5tcCA9IE5VTEw7CisJLyoKKwkgKiBMb29wIG92ZXIgdGhlIGJpdG1hcCBibG9ja3MuCisJICogV2Ugd2lsbCBkbyBldmVyeXRoaW5nIG9uZSBiaXRtYXAgYmxvY2sgYXQgYSB0aW1lLgorCSAqIFNraXAgdGhlIGN1cnJlbnQgYmxvY2sgaWYgaXQgaXMgZXhhY3RseSBmdWxsLgorCSAqIFRoaXMgYWxzbyBkZWFscyB3aXRoIHRoZSBjYXNlIHdoZXJlIHRoZXJlIHdlcmUgbm8gcnRleHRlbnRzIGJlZm9yZS4KKwkgKi8KKwlmb3IgKGJtYm5vID0gc2JwLT5zYl9yYm1ibG9ja3MgLQorCQkgICAgICgoc2JwLT5zYl9yZXh0ZW50cyAmICgoMSA8PCBtcC0+bV9ibGtiaXRfbG9nKSAtIDEpKSAhPSAwKTsKKwkgICAgIGJtYm5vIDwgbnJibWJsb2NrczsKKwkgICAgIGJtYm5vKyspIHsKKwkJLyoKKwkJICogQWxsb2NhdGUgYSBuZXcgKGZha2UpIG1vdW50L3NiLgorCQkgKi8KKwkJbm1wID0ga21lbV9hbGxvYyhzaXplb2YoKm5tcCksIEtNX1NMRUVQKTsKKwkJKm5tcCA9ICptcDsKKwkJbnNicCA9ICZubXAtPm1fc2I7CisJCS8qCisJCSAqIENhbGN1bGF0ZSBuZXcgc2IgYW5kIG1vdW50IGZpZWxkcyBmb3IgdGhpcyByb3VuZC4KKwkJICovCisJCW5zYnAtPnNiX3JleHRzaXplID0gaW4tPmV4dHNpemU7CisJCW5zYnAtPnNiX3JibWJsb2NrcyA9IGJtYm5vICsgMTsKKwkJbnNicC0+c2JfcmJsb2NrcyA9CisJCQlYRlNfUlRNSU4obnJibG9ja3MsCisJCQkJICBuc2JwLT5zYl9yYm1ibG9ja3MgKiBOQkJZICoKKwkJCQkgIG5zYnAtPnNiX2Jsb2Nrc2l6ZSAqIG5zYnAtPnNiX3JleHRzaXplKTsKKwkJbnNicC0+c2JfcmV4dGVudHMgPSBuc2JwLT5zYl9yYmxvY2tzOworCQlkb19kaXYobnNicC0+c2JfcmV4dGVudHMsIG5zYnAtPnNiX3JleHRzaXplKTsKKwkJbnNicC0+c2JfcmV4dHNsb2cgPSB4ZnNfaGlnaGJpdDMyKG5zYnAtPnNiX3JleHRlbnRzKTsKKwkJbnJzdW1sZXZlbHMgPSBubXAtPm1fcnN1bWxldmVscyA9IG5zYnAtPnNiX3JleHRzbG9nICsgMTsKKwkJbnJzdW1zaXplID0KKwkJCSh1aW50KXNpemVvZih4ZnNfc3VtaW5mb190KSAqIG5yc3VtbGV2ZWxzICoKKwkJCW5zYnAtPnNiX3JibWJsb2NrczsKKwkJbnJzdW1ibG9ja3MgPSBYRlNfQl9UT19GU0IobXAsIG5yc3Vtc2l6ZSk7CisJCW5tcC0+bV9yc3Vtc2l6ZSA9IG5yc3Vtc2l6ZSA9IFhGU19GU0JfVE9fQihtcCwgbnJzdW1ibG9ja3MpOworCQkvKgorCQkgKiBTdGFydCBhIHRyYW5zYWN0aW9uLCBnZXQgdGhlIGxvZyByZXNlcnZhdGlvbi4KKwkJICovCisJCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfR1JPV0ZTUlRfRlJFRSk7CisJCWNhbmNlbGZsYWdzID0gMDsKKwkJaWYgKChlcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCAwLAorCQkJCVhGU19HUk9XUlRGUkVFX0xPR19SRVMobm1wKSwgMCwgMCwgMCkpKQorCQkJZ290byBlcnJvcl9leGl0OworCQkvKgorCQkgKiBMb2NrIG91dCBvdGhlciBjYWxsZXJzIGJ5IGdyYWJiaW5nIHRoZSBiaXRtYXAgaW5vZGUgbG9jay4KKwkJICovCisJCWlmICgoZXJyb3IgPSB4ZnNfdHJhbnNfaWdldChtcCwgdHAsIDAsIG1wLT5tX3NiLnNiX3JibWlubywKKwkJCQlYRlNfSUxPQ0tfRVhDTCwgJmlwKSkpCisJCQlnb3RvIGVycm9yX2V4aXQ7CisJCUFTU0VSVChpcCA9PSBtcC0+bV9yYm1pcCk7CisJCS8qCisJCSAqIFVwZGF0ZSB0aGUgYml0bWFwIGlub2RlJ3Mgc2l6ZS4KKwkJICovCisJCW1wLT5tX3JibWlwLT5pX2QuZGlfc2l6ZSA9CisJCQluc2JwLT5zYl9yYm1ibG9ja3MgKiBuc2JwLT5zYl9ibG9ja3NpemU7CisJCXhmc190cmFuc19sb2dfaW5vZGUodHAsIG1wLT5tX3JibWlwLCBYRlNfSUxPR19DT1JFKTsKKwkJY2FuY2VsZmxhZ3MgfD0gWEZTX1RSQU5TX0FCT1JUOworCQkvKgorCQkgKiBHZXQgdGhlIHN1bW1hcnkgaW5vZGUgaW50byB0aGUgdHJhbnNhY3Rpb24uCisJCSAqLworCQlpZiAoKGVycm9yID0geGZzX3RyYW5zX2lnZXQobXAsIHRwLCBtcC0+bV9zYi5zYl9yc3VtaW5vLAorCQkJCTAsIFhGU19JTE9DS19FWENMLCAmaXApKSkKKwkJCWdvdG8gZXJyb3JfZXhpdDsKKwkJQVNTRVJUKGlwID09IG1wLT5tX3JzdW1pcCk7CisJCS8qCisJCSAqIFVwZGF0ZSB0aGUgc3VtbWFyeSBpbm9kZSdzIHNpemUuCisJCSAqLworCQltcC0+bV9yc3VtaXAtPmlfZC5kaV9zaXplID0gbm1wLT5tX3JzdW1zaXplOworCQl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBtcC0+bV9yc3VtaXAsIFhGU19JTE9HX0NPUkUpOworCQkvKgorCQkgKiBDb3B5IHN1bW1hcnkgZGF0YSBmcm9tIG9sZCB0byBuZXcgc2l6ZXMuCisJCSAqIERvIHRoaXMgd2hlbiB0aGUgcmVhbCBzaXplIChub3QgYmxvY2stYWxpZ25lZCkgY2hhbmdlcy4KKwkJICovCisJCWlmIChzYnAtPnNiX3JibWJsb2NrcyAhPSBuc2JwLT5zYl9yYm1ibG9ja3MgfHwKKwkJICAgIG1wLT5tX3JzdW1sZXZlbHMgIT0gbm1wLT5tX3JzdW1sZXZlbHMpIHsKKwkJCWVycm9yID0geGZzX3J0Y29weV9zdW1tYXJ5KG1wLCBubXAsIHRwKTsKKwkJCWlmIChlcnJvcikKKwkJCQlnb3RvIGVycm9yX2V4aXQ7CisJCX0KKwkJLyoKKwkJICogVXBkYXRlIHN1cGVyYmxvY2sgZmllbGRzLgorCQkgKi8KKwkJaWYgKG5zYnAtPnNiX3JleHRzaXplICE9IHNicC0+c2JfcmV4dHNpemUpCisJCQl4ZnNfdHJhbnNfbW9kX3NiKHRwLCBYRlNfVFJBTlNfU0JfUkVYVFNJWkUsCisJCQkJbnNicC0+c2JfcmV4dHNpemUgLSBzYnAtPnNiX3JleHRzaXplKTsKKwkJaWYgKG5zYnAtPnNiX3JibWJsb2NrcyAhPSBzYnAtPnNiX3JibWJsb2NrcykKKwkJCXhmc190cmFuc19tb2Rfc2IodHAsIFhGU19UUkFOU19TQl9SQk1CTE9DS1MsCisJCQkJbnNicC0+c2JfcmJtYmxvY2tzIC0gc2JwLT5zYl9yYm1ibG9ja3MpOworCQlpZiAobnNicC0+c2JfcmJsb2NrcyAhPSBzYnAtPnNiX3JibG9ja3MpCisJCQl4ZnNfdHJhbnNfbW9kX3NiKHRwLCBYRlNfVFJBTlNfU0JfUkJMT0NLUywKKwkJCQluc2JwLT5zYl9yYmxvY2tzIC0gc2JwLT5zYl9yYmxvY2tzKTsKKwkJaWYgKG5zYnAtPnNiX3JleHRlbnRzICE9IHNicC0+c2JfcmV4dGVudHMpCisJCQl4ZnNfdHJhbnNfbW9kX3NiKHRwLCBYRlNfVFJBTlNfU0JfUkVYVEVOVFMsCisJCQkJbnNicC0+c2JfcmV4dGVudHMgLSBzYnAtPnNiX3JleHRlbnRzKTsKKwkJaWYgKG5zYnAtPnNiX3JleHRzbG9nICE9IHNicC0+c2JfcmV4dHNsb2cpCisJCQl4ZnNfdHJhbnNfbW9kX3NiKHRwLCBYRlNfVFJBTlNfU0JfUkVYVFNMT0csCisJCQkJbnNicC0+c2JfcmV4dHNsb2cgLSBzYnAtPnNiX3JleHRzbG9nKTsKKwkJLyoKKwkJICogRnJlZSBuZXcgZXh0ZW50LgorCQkgKi8KKwkJYnAgPSBOVUxMOworCQllcnJvciA9IHhmc19ydGZyZWVfcmFuZ2Uobm1wLCB0cCwgc2JwLT5zYl9yZXh0ZW50cywKKwkJCW5zYnAtPnNiX3JleHRlbnRzIC0gc2JwLT5zYl9yZXh0ZW50cywgJmJwLCAmc3VtYm5vKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBlcnJvcl9leGl0OworCQkvKgorCQkgKiBNYXJrIG1vcmUgYmxvY2tzIGZyZWUgaW4gdGhlIHN1cGVyYmxvY2suCisJCSAqLworCQl4ZnNfdHJhbnNfbW9kX3NiKHRwLCBYRlNfVFJBTlNfU0JfRlJFWFRFTlRTLAorCQkJbnNicC0+c2JfcmV4dGVudHMgLSBzYnAtPnNiX3JleHRlbnRzKTsKKwkJLyoKKwkJICogRnJlZSB0aGUgZmFrZSBtcCBzdHJ1Y3R1cmUuCisJCSAqLworCQlrbWVtX2ZyZWUobm1wLCBzaXplb2YoKm5tcCkpOworCQlubXAgPSBOVUxMOworCQkvKgorCQkgKiBVcGRhdGUgbXAgdmFsdWVzIGludG8gdGhlIHJlYWwgbXAgc3RydWN0dXJlLgorCQkgKi8KKwkJbXAtPm1fcnN1bWxldmVscyA9IG5yc3VtbGV2ZWxzOworCQltcC0+bV9yc3Vtc2l6ZSA9IG5yc3Vtc2l6ZTsKKwkJLyoKKwkJICogQ29tbWl0IHRoZSB0cmFuc2FjdGlvbi4KKwkJICovCisJCXhmc190cmFuc19jb21taXQodHAsIDAsIE5VTEwpOworCX0KKwlyZXR1cm4gMDsKKworCS8qCisJICogRXJyb3IgcGF0aHMgY29tZSBoZXJlLgorCSAqLworZXJyb3JfZXhpdDoKKwlpZiAobm1wKQorCQlrbWVtX2ZyZWUobm1wLCBzaXplb2YoKm5tcCkpOworCXhmc190cmFuc19jYW5jZWwodHAsIGNhbmNlbGZsYWdzKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBBbGxvY2F0ZSBhbiBleHRlbnQgaW4gdGhlIHJlYWx0aW1lIHN1YnZvbHVtZSwgd2l0aCB0aGUgdXN1YWwgYWxsb2NhdGlvbgorICogcGFyYW1ldGVycy4gIFRoZSBsZW5ndGggdW5pdHMgYXJlIGFsbCBpbiByZWFsdGltZSBleHRlbnRzLCBhcyBpcyB0aGUKKyAqIHJlc3VsdCBibG9jayBudW1iZXIuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19ydGFsbG9jYXRlX2V4dGVudCgKKwl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX3J0YmxvY2tfdAlibm8sCQkvKiBzdGFydGluZyBibG9jayBudW1iZXIgdG8gYWxsb2NhdGUgKi8KKwl4ZnNfZXh0bGVuX3QJbWlubGVuLAkJLyogbWluaW11bSBsZW5ndGggdG8gYWxsb2NhdGUgKi8KKwl4ZnNfZXh0bGVuX3QJbWF4bGVuLAkJLyogbWF4aW11bSBsZW5ndGggdG8gYWxsb2NhdGUgKi8KKwl4ZnNfZXh0bGVuX3QJKmxlbiwJCS8qIG91dDogYWN0dWFsIGxlbmd0aCBhbGxvY2F0ZWQgKi8KKwl4ZnNfYWxsb2N0eXBlX3QJdHlwZSwJCS8qIGFsbG9jYXRpb24gdHlwZSBYRlNfQUxMT0NUWVBFLi4uICovCisJaW50CQl3YXNkZWwsCQkvKiB3YXMgYSBkZWxheWVkIGFsbG9jYXRpb24gZXh0ZW50ICovCisJeGZzX2V4dGxlbl90CXByb2QsCQkvKiBleHRlbnQgcHJvZHVjdCBmYWN0b3IgKi8KKwl4ZnNfcnRibG9ja190CSpydGJsb2NrKQkvKiBvdXQ6IHN0YXJ0IGJsb2NrIGFsbG9jYXRlZCAqLworeworCWludAkJZXJyb3I7CQkvKiBlcnJvciB2YWx1ZSAqLworCXhmc19pbm9kZV90CSppcDsJCS8qIGlub2RlIGZvciBiaXRtYXAgZmlsZSAqLworCXhmc19tb3VudF90CSptcDsJCS8qIGZpbGUgc3lzdGVtIG1vdW50IHN0cnVjdHVyZSAqLworCXhmc19ydGJsb2NrX3QJcjsJCS8qIHJlc3VsdCBhbGxvY2F0ZWQgYmxvY2sgKi8KKwl4ZnNfZnNibG9ja190CXNiOwkJLyogc3VtbWFyeSBmaWxlIGJsb2NrIG51bWJlciAqLworCXhmc19idWZfdAkqc3VtYnA7CQkvKiBzdW1tYXJ5IGZpbGUgYmxvY2sgYnVmZmVyICovCisKKwlBU1NFUlQobWlubGVuID4gMCAmJiBtaW5sZW4gPD0gbWF4bGVuKTsKKwltcCA9IHRwLT50X21vdW50cDsKKwkvKgorCSAqIElmIHByb2QgaXMgc2V0IHRoZW4gZmlndXJlIG91dCB3aGF0IHRvIGRvIHRvIG1pbmxlbiBhbmQgbWF4bGVuLgorCSAqLworCWlmIChwcm9kID4gMSkgeworCQl4ZnNfZXh0bGVuX3QJaTsKKworCQlpZiAoKGkgPSBtYXhsZW4gJSBwcm9kKSkKKwkJCW1heGxlbiAtPSBpOworCQlpZiAoKGkgPSBtaW5sZW4gJSBwcm9kKSkKKwkJCW1pbmxlbiArPSBwcm9kIC0gaTsKKwkJaWYgKG1heGxlbiA8IG1pbmxlbikgeworCQkJKnJ0YmxvY2sgPSBOVUxMUlRCTE9DSzsKKwkJCXJldHVybiAwOworCQl9CisJfQorCS8qCisJICogTG9jayBvdXQgb3RoZXIgY2FsbGVycyBieSBncmFiYmluZyB0aGUgYml0bWFwIGlub2RlIGxvY2suCisJICovCisJZXJyb3IgPSB4ZnNfdHJhbnNfaWdldChtcCwgdHAsIG1wLT5tX3NiLnNiX3JibWlubywgMCwgWEZTX0lMT0NLX0VYQ0wsICZpcCk7CisJaWYgKGVycm9yKSB7CisJCXJldHVybiBlcnJvcjsKKwl9CisJc3VtYnAgPSBOVUxMOworCS8qCisJICogQWxsb2NhdGUgYnkgc2l6ZSwgb3IgbmVhciBhbm90aGVyIGJsb2NrLCBvciBleGFjdGx5IGF0IHNvbWUgYmxvY2suCisJICovCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBYRlNfQUxMT0NUWVBFX0FOWV9BRzoKKwkJZXJyb3IgPSB4ZnNfcnRhbGxvY2F0ZV9leHRlbnRfc2l6ZShtcCwgdHAsIG1pbmxlbiwgbWF4bGVuLCBsZW4sCisJCQkJJnN1bWJwLAkmc2IsIHByb2QsICZyKTsKKwkJYnJlYWs7CisJY2FzZSBYRlNfQUxMT0NUWVBFX05FQVJfQk5POgorCQllcnJvciA9IHhmc19ydGFsbG9jYXRlX2V4dGVudF9uZWFyKG1wLCB0cCwgYm5vLCBtaW5sZW4sIG1heGxlbiwKKwkJCQlsZW4sICZzdW1icCwgJnNiLCBwcm9kLCAmcik7CisJCWJyZWFrOworCWNhc2UgWEZTX0FMTE9DVFlQRV9USElTX0JOTzoKKwkJZXJyb3IgPSB4ZnNfcnRhbGxvY2F0ZV9leHRlbnRfZXhhY3QobXAsIHRwLCBibm8sIG1pbmxlbiwgbWF4bGVuLAorCQkJCWxlbiwgJnN1bWJwLCAmc2IsIHByb2QsICZyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQVNTRVJUKDApOworCX0KKwlpZiAoZXJyb3IpIHsKKwkJcmV0dXJuIGVycm9yOworCX0KKwkvKgorCSAqIElmIGl0IHdvcmtlZCwgdXBkYXRlIHRoZSBzdXBlcmJsb2NrLgorCSAqLworCWlmIChyICE9IE5VTExSVEJMT0NLKSB7CisJCWxvbmcJc2xlbiA9IChsb25nKSpsZW47CisKKwkJQVNTRVJUKCpsZW4gPj0gbWlubGVuICYmICpsZW4gPD0gbWF4bGVuKTsKKwkJaWYgKHdhc2RlbCkKKwkJCXhmc190cmFuc19tb2Rfc2IodHAsIFhGU19UUkFOU19TQl9SRVNfRlJFWFRFTlRTLCAtc2xlbik7CisJCWVsc2UKKwkJCXhmc190cmFuc19tb2Rfc2IodHAsIFhGU19UUkFOU19TQl9GUkVYVEVOVFMsIC1zbGVuKTsKKwl9CisJKnJ0YmxvY2sgPSByOworCXJldHVybiAwOworfQorCisvKgorICogRnJlZSBhbiBleHRlbnQgaW4gdGhlIHJlYWx0aW1lIHN1YnZvbHVtZS4gIExlbmd0aCBpcyBleHByZXNzZWQgaW4KKyAqIHJlYWx0aW1lIGV4dGVudHMsIGFzIGlzIHRoZSBibG9jayBudW1iZXIuCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19ydGZyZWVfZXh0ZW50KAorCXhmc190cmFuc190CSp0cCwJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfcnRibG9ja190CWJubywJCS8qIHN0YXJ0aW5nIGJsb2NrIG51bWJlciB0byBmcmVlICovCisJeGZzX2V4dGxlbl90CWxlbikJCS8qIGxlbmd0aCBvZiBleHRlbnQgZnJlZWQgKi8KK3sKKwlpbnQJCWVycm9yOwkJLyogZXJyb3IgdmFsdWUgKi8KKwl4ZnNfaW5vZGVfdAkqaXA7CQkvKiBiaXRtYXAgZmlsZSBpbm9kZSAqLworCXhmc19tb3VudF90CSptcDsJCS8qIGZpbGUgc3lzdGVtIG1vdW50IHN0cnVjdHVyZSAqLworCXhmc19mc2Jsb2NrX3QJc2I7CQkvKiBzdW1tYXJ5IGZpbGUgYmxvY2sgbnVtYmVyICovCisJeGZzX2J1Zl90CSpzdW1icDsJCS8qIHN1bW1hcnkgZmlsZSBibG9jayBidWZmZXIgKi8KKworCW1wID0gdHAtPnRfbW91bnRwOworCS8qCisJICogU3luY2hyb25pemUgYnkgbG9ja2luZyB0aGUgYml0bWFwIGlub2RlLgorCSAqLworCWVycm9yID0geGZzX3RyYW5zX2lnZXQobXAsIHRwLCBtcC0+bV9zYi5zYl9yYm1pbm8sIDAsIFhGU19JTE9DS19FWENMLCAmaXApOworCWlmIChlcnJvcikgeworCQlyZXR1cm4gZXJyb3I7CisJfQorI2lmIGRlZmluZWQoX19LRVJORUxfXykgJiYgZGVmaW5lZChERUJVRykKKwkvKgorCSAqIENoZWNrIHRvIHNlZSB0aGF0IHRoaXMgd2hvbGUgcmFuZ2UgaXMgY3VycmVudGx5IGFsbG9jYXRlZC4KKwkgKi8KKwl7CisJCWludAlzdGF0OwkJLyogcmVzdWx0IGZyb20gY2hlY2tpbmcgcmFuZ2UgKi8KKworCQllcnJvciA9IHhmc19ydGNoZWNrX2FsbG9jX3JhbmdlKG1wLCB0cCwgYm5vLCBsZW4sICZzdGF0KTsKKwkJaWYgKGVycm9yKSB7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKwkJQVNTRVJUKHN0YXQpOworCX0KKyNlbmRpZgorCXN1bWJwID0gTlVMTDsKKwkvKgorCSAqIEZyZWUgdGhlIHJhbmdlIG9mIHJlYWx0aW1lIGJsb2Nrcy4KKwkgKi8KKwllcnJvciA9IHhmc19ydGZyZWVfcmFuZ2UobXAsIHRwLCBibm8sIGxlbiwgJnN1bWJwLCAmc2IpOworCWlmIChlcnJvcikgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCS8qCisJICogTWFyayBtb3JlIGJsb2NrcyBmcmVlIGluIHRoZSBzdXBlcmJsb2NrLgorCSAqLworCXhmc190cmFuc19tb2Rfc2IodHAsIFhGU19UUkFOU19TQl9GUkVYVEVOVFMsIChsb25nKWxlbik7CisJLyoKKwkgKiBJZiB3ZSd2ZSBub3cgZnJlZWQgYWxsIHRoZSBibG9ja3MsIHJlc2V0IHRoZSBmaWxlIHNlcXVlbmNlCisJICogbnVtYmVyIHRvIDAuCisJICovCisJaWYgKHRwLT50X2ZyZXh0ZW50c19kZWx0YSArIG1wLT5tX3NiLnNiX2ZyZXh0ZW50cyA9PQorCSAgICBtcC0+bV9zYi5zYl9yZXh0ZW50cykgeworCQlpZiAoIShpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19ORVdSVEJNKSkKKwkJCWlwLT5pX2QuZGlfZmxhZ3MgfD0gWEZTX0RJRkxBR19ORVdSVEJNOworCQkqKF9fdWludDY0X3QgKikmaXAtPmlfZC5kaV9hdGltZSA9IDA7CisJCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLCBYRlNfSUxPR19DT1JFKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIHJlYWx0aW1lIGZpZWxkcyBpbiB0aGUgbW91bnQgc3RydWN0dXJlLgorICovCitpbnQJCQkJLyogZXJyb3IgKi8KK3hmc19ydG1vdW50X2luaXQoCisJeGZzX21vdW50X3QJKm1wKQkvKiBmaWxlIHN5c3RlbSBtb3VudCBzdHJ1Y3R1cmUgKi8KK3sKKwl4ZnNfYnVmX3QJKmJwOwkvKiBidWZmZXIgZm9yIGxhc3QgYmxvY2sgb2Ygc3Vidm9sdW1lICovCisJeGZzX2RhZGRyX3QJZDsJLyogYWRkcmVzcyBvZiBsYXN0IGJsb2NrIG9mIHN1YnZvbHVtZSAqLworCWludAkJZXJyb3I7CS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCXhmc19zYl90CSpzYnA7CS8qIGZpbGVzeXN0ZW0gc3VwZXJibG9jayBjb3B5IGluIG1vdW50ICovCisKKwlzYnAgPSAmbXAtPm1fc2I7CisJaWYgKHNicC0+c2JfcmJsb2NrcyA9PSAwKQorCQlyZXR1cm4gMDsKKwlpZiAobXAtPm1fcnRkZXZfdGFyZ3AgPT0gTlVMTCkgeworCQljbW5fZXJyKENFX1dBUk4sCisJIlhGUzogVGhpcyBmaWxlc3lzdGVtIGhhcyBhIHJlYWx0aW1lIHZvbHVtZSwgdXNlIHJ0ZGV2PWRldmljZSBvcHRpb24iKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFTk9ERVYpOworCX0KKwltcC0+bV9yc3VtbGV2ZWxzID0gc2JwLT5zYl9yZXh0c2xvZyArIDE7CisJbXAtPm1fcnN1bXNpemUgPQorCQkodWludClzaXplb2YoeGZzX3N1bWluZm9fdCkgKiBtcC0+bV9yc3VtbGV2ZWxzICoKKwkJc2JwLT5zYl9yYm1ibG9ja3M7CisJbXAtPm1fcnN1bXNpemUgPSByb3VuZHVwKG1wLT5tX3JzdW1zaXplLCBzYnAtPnNiX2Jsb2Nrc2l6ZSk7CisJbXAtPm1fcmJtaXAgPSBtcC0+bV9yc3VtaXAgPSBOVUxMOworCS8qCisJICogQ2hlY2sgdGhhdCB0aGUgcmVhbHRpbWUgc2VjdGlvbiBpcyBhbiBvayBzaXplLgorCSAqLworCWQgPSAoeGZzX2RhZGRyX3QpWEZTX0ZTQl9UT19CQihtcCwgbXAtPm1fc2Iuc2JfcmJsb2Nrcyk7CisJaWYgKFhGU19CQl9UT19GU0IobXAsIGQpICE9IG1wLT5tX3NiLnNiX3JibG9ja3MpIHsKKwkJY21uX2VycihDRV9XQVJOLCAiWEZTOiByZWFsdGltZSBtb3VudCAtLSAlbGx1ICE9ICVsbHUiLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgWEZTX0JCX1RPX0ZTQihtcCwgZCksCisJCQkodW5zaWduZWQgbG9uZyBsb25nKSBtcC0+bV9zYi5zYl9yYmxvY2tzKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFMkJJRyk7CisJfQorCWVycm9yID0geGZzX3JlYWRfYnVmKG1wLCBtcC0+bV9ydGRldl90YXJncCwKKwkJCQlkIC0gWEZTX0ZTQl9UT19CQihtcCwgMSksCisJCQkJWEZTX0ZTQl9UT19CQihtcCwgMSksIDAsICZicCk7CisJaWYgKGVycm9yKSB7CisJCWNtbl9lcnIoQ0VfV0FSTiwKKwkiWEZTOiByZWFsdGltZSBtb3VudCAtLSB4ZnNfcmVhZF9idWYgZmFpbGVkLCByZXR1cm5lZCAlZCIsIGVycm9yKTsKKwkJaWYgKGVycm9yID09IEVOT1NQQykKKwkJCXJldHVybiBYRlNfRVJST1IoRTJCSUcpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCXhmc19idWZfcmVsc2UoYnApOworCXJldHVybiAwOworfQorCisvKgorICogR2V0IHRoZSBiaXRtYXAgYW5kIHN1bW1hcnkgaW5vZGVzIGludG8gdGhlIG1vdW50IHN0cnVjdHVyZQorICogYXQgbW91bnQgdGltZS4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX3J0bW91bnRfaW5vZGVzKAorCXhmc19tb3VudF90CSptcCkJCS8qIGZpbGUgc3lzdGVtIG1vdW50IHN0cnVjdHVyZSAqLworeworCWludAkJZXJyb3I7CQkvKiBlcnJvciByZXR1cm4gdmFsdWUgKi8KKwl4ZnNfc2JfdAkqc2JwOworCisJc2JwID0gJm1wLT5tX3NiOworCWlmIChzYnAtPnNiX3JibWlubyA9PSBOVUxMRlNJTk8pCisJCXJldHVybiAwOworCWVycm9yID0geGZzX2lnZXQobXAsIE5VTEwsIHNicC0+c2JfcmJtaW5vLCAwLCAwLCAmbXAtPm1fcmJtaXAsIDApOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCUFTU0VSVChtcC0+bV9yYm1pcCAhPSBOVUxMKTsKKwlBU1NFUlQoc2JwLT5zYl9yc3VtaW5vICE9IE5VTExGU0lOTyk7CisJZXJyb3IgPSB4ZnNfaWdldChtcCwgTlVMTCwgc2JwLT5zYl9yc3VtaW5vLCAwLCAwLCAmbXAtPm1fcnN1bWlwLCAwKTsKKwlpZiAoZXJyb3IpIHsKKwkJVk5fUkVMRShYRlNfSVRPVihtcC0+bV9yYm1pcCkpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCUFTU0VSVChtcC0+bV9yc3VtaXAgIT0gTlVMTCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQaWNrIGFuIGV4dGVudCBmb3IgYWxsb2NhdGlvbiBhdCB0aGUgc3RhcnQgb2YgYSBuZXcgcmVhbHRpbWUgZmlsZS4KKyAqIFVzZSB0aGUgc2VxdWVuY2UgbnVtYmVyIHN0b3JlZCBpbiB0aGUgYXRpbWUgZmllbGQgb2YgdGhlIGJpdG1hcCBpbm9kZS4KKyAqIFRyYW5zbGF0ZSB0aGlzIHRvIGEgZnJhY3Rpb24gb2YgdGhlIHJ0ZXh0ZW50cywgYW5kIHJldHVybiB0aGUgcHJvZHVjdAorICogb2YgcnRleHRlbnRzIGFuZCB0aGUgZnJhY3Rpb24uCisgKiBUaGUgZnJhY3Rpb24gc2VxdWVuY2UgaXMgMCwgMS8yLCAxLzQsIDMvNCwgMS84LCAuLi4sIDcvOCwgMS8xNiwgLi4uCisgKi8KK2ludAkJCQkJLyogZXJyb3IgKi8KK3hmc19ydHBpY2tfZXh0ZW50KAorCXhmc19tb3VudF90CSptcCwJCS8qIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50ICovCisJeGZzX3RyYW5zX3QJKnRwLAkJLyogdHJhbnNhY3Rpb24gcG9pbnRlciAqLworCXhmc19leHRsZW5fdAlsZW4sCQkvKiBhbGxvY2F0aW9uIGxlbmd0aCAocnRleHRlbnRzKSAqLworCXhmc19ydGJsb2NrX3QJKnBpY2spCQkvKiByZXN1bHQgcnQgZXh0ZW50ICovCit7CisJeGZzX3J0YmxvY2tfdAliOwkJLyogcmVzdWx0IGJsb2NrICovCisJaW50CQllcnJvcjsJCS8qIGVycm9yIHJldHVybiB2YWx1ZSAqLworCXhmc19pbm9kZV90CSppcDsJCS8qIGJpdG1hcCBpbmNvcmUgaW5vZGUgKi8KKwlpbnQJCWxvZzI7CQkvKiBsb2cgb2Ygc2VxdWVuY2UgbnVtYmVyICovCisJX191aW50NjRfdAlyZXNpZDsJCS8qIHJlc2lkdWFsIGFmdGVyIGxvZyByZW1vdmVkICovCisJX191aW50NjRfdAlzZXE7CQkvKiBzZXF1ZW5jZSBudW1iZXIgb2YgZmlsZSBjcmVhdGlvbiAqLworCV9fdWludDY0X3QJKnNlcXA7CQkvKiBwb2ludGVyIHRvIHNlcW5vIGluIGlub2RlICovCisKKwllcnJvciA9IHhmc190cmFuc19pZ2V0KG1wLCB0cCwgbXAtPm1fc2Iuc2JfcmJtaW5vLCAwLCBYRlNfSUxPQ0tfRVhDTCwgJmlwKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwlBU1NFUlQoaXAgPT0gbXAtPm1fcmJtaXApOworCXNlcXAgPSAoX191aW50NjRfdCAqKSZpcC0+aV9kLmRpX2F0aW1lOworCWlmICghKGlwLT5pX2QuZGlfZmxhZ3MgJiBYRlNfRElGTEFHX05FV1JUQk0pKSB7CisJCWlwLT5pX2QuZGlfZmxhZ3MgfD0gWEZTX0RJRkxBR19ORVdSVEJNOworCQkqc2VxcCA9IDA7CisJfQorCXNlcSA9ICpzZXFwOworCWlmICgobG9nMiA9IHhmc19oaWdoYml0NjQoc2VxKSkgPT0gLTEpCisJCWIgPSAwOworCWVsc2UgeworCQlyZXNpZCA9IHNlcSAtICgxVUxMIDw8IGxvZzIpOworCQliID0gKG1wLT5tX3NiLnNiX3JleHRlbnRzICogKChyZXNpZCA8PCAxKSArIDFVTEwpKSA+PgorCQkgICAgKGxvZzIgKyAxKTsKKwkJaWYgKGIgPj0gbXAtPm1fc2Iuc2JfcmV4dGVudHMpCisJCQliID0gZG9fbW9kKGIsIG1wLT5tX3NiLnNiX3JleHRlbnRzKTsKKwkJaWYgKGIgKyBsZW4gPiBtcC0+bV9zYi5zYl9yZXh0ZW50cykKKwkJCWIgPSBtcC0+bV9zYi5zYl9yZXh0ZW50cyAtIGxlbjsKKwl9CisJKnNlcXAgPSBzZXEgKyAxOworCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLCBYRlNfSUxPR19DT1JFKTsKKwkqcGljayA9IGI7CisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBERUJVRworLyoKKyAqIERlYnVnIGNvZGU6IHByaW50IG91dCB0aGUgdmFsdWUgb2YgYSByYW5nZSBpbiB0aGUgYml0bWFwLgorICovCit2b2lkCit4ZnNfcnRwcmludF9yYW5nZSgKKwl4ZnNfbW91bnRfdAkqbXAsCQkvKiBmaWxlIHN5c3RlbSBtb3VudCBzdHJ1Y3R1cmUgKi8KKwl4ZnNfdHJhbnNfdAkqdHAsCQkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX3J0YmxvY2tfdAlzdGFydCwJCS8qIHN0YXJ0aW5nIGJsb2NrIHRvIHByaW50ICovCisJeGZzX2V4dGxlbl90CWxlbikJCS8qIGxlbmd0aCB0byBwcmludCAqLworeworCXhmc19leHRsZW5fdAlpOwkJLyogYmxvY2sgbnVtYmVyIGluIHRoZSBleHRlbnQgKi8KKworCXByaW50aygiJUxkOiAiLCAobG9uZyBsb25nKXN0YXJ0KTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCXByaW50aygiJWQiLCB4ZnNfcnRjaGVja19iaXQobXAsIHRwLCBzdGFydCArIGksIDEpKTsKKwlwcmludGsoIlxuIik7Cit9CisKKy8qCisgKiBEZWJ1ZyBjb2RlOiBwcmludCB0aGUgc3VtbWFyeSBmaWxlLgorICovCit2b2lkCit4ZnNfcnRwcmludF9zdW1tYXJ5KAorCXhmc19tb3VudF90CSptcCwJCS8qIGZpbGUgc3lzdGVtIG1vdW50IHN0cnVjdHVyZSAqLworCXhmc190cmFuc190CSp0cCkJCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KK3sKKwl4ZnNfc3VtaW5mb190CWM7CQkvKiBzdW1tYXJ5IGRhdGEgKi8KKwl4ZnNfcnRibG9ja190CWk7CQkvKiBiaXRtYXAgYmxvY2sgbnVtYmVyICovCisJaW50CQlsOwkJLyogc3VtbWFyeSBpbmZvcm1hdGlvbiBsZXZlbCAqLworCWludAkJcDsJCS8qIGZsYWcgZm9yIHByaW50ZWQgYW55dGhpbmcgKi8KKwl4ZnNfZnNibG9ja190CXNiOwkJLyogc3VtbWFyeSBibG9jayBudW1iZXIgKi8KKwl4ZnNfYnVmX3QJKnN1bWJwOwkJLyogc3VtbWFyeSBibG9jayBidWZmZXIgKi8KKworCXN1bWJwID0gTlVMTDsKKwlmb3IgKGwgPSAwOyBsIDwgbXAtPm1fcnN1bWxldmVsczsgbCsrKSB7CisJCWZvciAocCA9IDAsIGkgPSAwOyBpIDwgbXAtPm1fc2Iuc2JfcmJtYmxvY2tzOyBpKyspIHsKKwkJCSh2b2lkKXhmc19ydGdldF9zdW1tYXJ5KG1wLCB0cCwgbCwgaSwgJnN1bWJwLCAmc2IsICZjKTsKKwkJCWlmIChjKSB7CisJCQkJaWYgKCFwKSB7CisJCQkJCXByaW50aygiJUxkLSVMZDoiLCAxTEwgPDwgbCwKKwkJCQkJCVhGU19SVE1JTigoMUxMIDw8IGwpICsKKwkJCQkJCQkgICgoMUxMIDw8IGwpIC0gMUxMKSwKKwkJCQkJCQkgbXAtPm1fc2Iuc2JfcmV4dGVudHMpKTsKKwkJCQkJcCA9IDE7CisJCQkJfQorCQkJCXByaW50aygiICVMZDolZCIsIChsb25nIGxvbmcpaSwgYyk7CisJCQl9CisJCX0KKwkJaWYgKHApCisJCQlwcmludGsoIlxuIik7CisJfQorCWlmIChzdW1icCkKKwkJeGZzX3RyYW5zX2JyZWxzZSh0cCwgc3VtYnApOworfQorI2VuZGlmCS8qIERFQlVHICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3J0YWxsb2MuaCBiL2ZzL3hmcy94ZnNfcnRhbGxvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNzEwMjYKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX3J0YWxsb2MuaApAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfUlRBTExPQ19IX18KKyNkZWZpbmUJX19YRlNfUlRBTExPQ19IX18KKworc3RydWN0IHhmc19tb3VudDsKK3N0cnVjdCB4ZnNfdHJhbnM7CisKKyNkZWZpbmUgWEZTX0lTX1JFQUxUSU1FX0lOT0RFKGlwKSAoKGlwKS0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19SRUFMVElNRSkKKworLyogTWluIGFuZCBtYXggcnQgZXh0ZW50IHNpemVzLCBzcGVjaWZpZWQgaW4gYnl0ZXMgKi8KKyNkZWZpbmUJWEZTX01BWF9SVEVYVFNJWkUJKDEwMjQgKiAxMDI0ICogMTAyNCkJLyogMUdCICovCisjZGVmaW5lCVhGU19ERkxfUlRFWFRTSVpFCSg2NCAqIDEwMjQpCSAgICAgICAgLyogNjRLQiAqLworI2RlZmluZQlYRlNfTUlOX1JURVhUU0laRQkoNCAqIDEwMjQpCQkvKiA0S0IgKi8KKworLyoKKyAqIENvbnN0YW50cyBmb3IgYml0IG1hbmlwdWxhdGlvbnMuCisgKi8KKyNkZWZpbmUJWEZTX05CQllMT0cJMwkJLyogbG9nMihOQkJZKSAqLworI2RlZmluZQlYRlNfV09SRExPRwkyCQkvKiBsb2cyKHNpemVvZih4ZnNfcnR3b3JkX3QpKSAqLworI2RlZmluZQlYRlNfTkJXT1JETE9HCShYRlNfTkJCWUxPRyArIFhGU19XT1JETE9HKQorI2RlZmluZQlYRlNfTkJXT1JECSgxIDw8IFhGU19OQldPUkRMT0cpCisjZGVmaW5lCVhGU19XT1JETUFTSwkoKDEgPDwgWEZTX1dPUkRMT0cpIC0gMSkKKworI2RlZmluZQlYRlNfQkxPQ0tTSVpFKG1wKQkoKG1wKS0+bV9zYi5zYl9ibG9ja3NpemUpCisjZGVmaW5lCVhGU19CTE9DS01BU0sobXApCSgobXApLT5tX2Jsb2NrbWFzaykKKyNkZWZpbmUJWEZTX0JMT0NLV1NJWkUobXApCSgobXApLT5tX2Jsb2Nrd3NpemUpCisjZGVmaW5lCVhGU19CTE9DS1dNQVNLKG1wKQkoKG1wKS0+bV9ibG9ja3dtYXNrKQorCisvKgorICogU3VtbWFyeSBhbmQgYml0IG1hbmlwdWxhdGlvbiBtYWNyb3MuCisgKi8KKyNkZWZpbmUJWEZTX1NVTU9GRlMobXAsbHMsYmIpCSgoaW50KSgobHMpICogKG1wKS0+bV9zYi5zYl9yYm1ibG9ja3MgKyAoYmIpKSkKKyNkZWZpbmUJWEZTX1NVTU9GRlNUT0JMT0NLKG1wLHMpCVwKKwkoKChzKSAqICh1aW50KXNpemVvZih4ZnNfc3VtaW5mb190KSkgPj4gKG1wKS0+bV9zYi5zYl9ibG9ja2xvZykKKyNkZWZpbmUJWEZTX1NVTVBUUihtcCxicCxzbykJXAorCSgoeGZzX3N1bWluZm9fdCAqKSgoY2hhciAqKVhGU19CVUZfUFRSKGJwKSArIFwKKwkJKCgoc28pICogKHVpbnQpc2l6ZW9mKHhmc19zdW1pbmZvX3QpKSAmIFhGU19CTE9DS01BU0sobXApKSkpCisKKyNkZWZpbmUJWEZTX0JJVFRPQkxPQ0sobXAsYmkpCSgoYmkpID4+IChtcCktPm1fYmxrYml0X2xvZykKKyNkZWZpbmUJWEZTX0JMT0NLVE9CSVQobXAsYmIpCSgoYmIpIDw8IChtcCktPm1fYmxrYml0X2xvZykKKyNkZWZpbmUJWEZTX0JJVFRPV09SRChtcCxiaSkJXAorCSgoaW50KSgoKGJpKSA+PiBYRlNfTkJXT1JETE9HKSAmIFhGU19CTE9DS1dNQVNLKG1wKSkpCisKKyNkZWZpbmUJWEZTX1JUTUlOKGEsYikJKChhKSA8IChiKSA/IChhKSA6IChiKSkKKyNkZWZpbmUJWEZTX1JUTUFYKGEsYikJKChhKSA+IChiKSA/IChhKSA6IChiKSkKKworI2RlZmluZQlYRlNfUlRMT0JJVCh3KQl4ZnNfbG93Yml0MzIodykKKyNkZWZpbmUJWEZTX1JUSElCSVQodykJeGZzX2hpZ2hiaXQzMih3KQorCisjaWYgWEZTX0JJR19CTEtOT1MKKyNkZWZpbmUJWEZTX1JUQkxPQ0tMT0coYikJeGZzX2hpZ2hiaXQ2NChiKQorI2Vsc2UKKyNkZWZpbmUJWEZTX1JUQkxPQ0tMT0coYikJeGZzX2hpZ2hiaXQzMihiKQorI2VuZGlmCisKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2lmZGVmIENPTkZJR19YRlNfUlQKKy8qCisgKiBGdW5jdGlvbiBwcm90b3R5cGVzIGZvciBleHBvcnRlZCBmdW5jdGlvbnMuCisgKi8KKworLyoKKyAqIEFsbG9jYXRlIGFuIGV4dGVudCBpbiB0aGUgcmVhbHRpbWUgc3Vidm9sdW1lLCB3aXRoIHRoZSB1c3VhbCBhbGxvY2F0aW9uCisgKiBwYXJhbWV0ZXJzLiAgVGhlIGxlbmd0aCB1bml0cyBhcmUgYWxsIGluIHJlYWx0aW1lIGV4dGVudHMsIGFzIGlzIHRoZQorICogcmVzdWx0IGJsb2NrIG51bWJlci4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX3J0YWxsb2NhdGVfZXh0ZW50KAorCXN0cnVjdCB4ZnNfdHJhbnMJKnRwLAkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisJeGZzX3J0YmxvY2tfdAkJYm5vLAkvKiBzdGFydGluZyBibG9jayBudW1iZXIgdG8gYWxsb2NhdGUgKi8KKwl4ZnNfZXh0bGVuX3QJCW1pbmxlbiwJLyogbWluaW11bSBsZW5ndGggdG8gYWxsb2NhdGUgKi8KKwl4ZnNfZXh0bGVuX3QJCW1heGxlbiwJLyogbWF4aW11bSBsZW5ndGggdG8gYWxsb2NhdGUgKi8KKwl4ZnNfZXh0bGVuX3QJCSpsZW4sCS8qIG91dDogYWN0dWFsIGxlbmd0aCBhbGxvY2F0ZWQgKi8KKwl4ZnNfYWxsb2N0eXBlX3QJCXR5cGUsCS8qIGFsbG9jYXRpb24gdHlwZSBYRlNfQUxMT0NUWVBFLi4uICovCisJaW50CQkJd2FzZGVsLAkvKiB3YXMgYSBkZWxheWVkIGFsbG9jYXRpb24gZXh0ZW50ICovCisJeGZzX2V4dGxlbl90CQlwcm9kLAkvKiBleHRlbnQgcHJvZHVjdCBmYWN0b3IgKi8KKwl4ZnNfcnRibG9ja190CQkqcnRibG9jayk7IC8qIG91dDogc3RhcnQgYmxvY2sgYWxsb2NhdGVkICovCisKKy8qCisgKiBGcmVlIGFuIGV4dGVudCBpbiB0aGUgcmVhbHRpbWUgc3Vidm9sdW1lLiAgTGVuZ3RoIGlzIGV4cHJlc3NlZCBpbgorICogcmVhbHRpbWUgZXh0ZW50cywgYXMgaXMgdGhlIGJsb2NrIG51bWJlci4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX3J0ZnJlZV9leHRlbnQoCisJc3RydWN0IHhmc190cmFucwkqdHAsCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfcnRibG9ja190CQlibm8sCS8qIHN0YXJ0aW5nIGJsb2NrIG51bWJlciB0byBmcmVlICovCisJeGZzX2V4dGxlbl90CQlsZW4pOwkvKiBsZW5ndGggb2YgZXh0ZW50IGZyZWVkICovCisKKy8qCisgKiBJbml0aWFsaXplIHJlYWx0aW1lIGZpZWxkcyBpbiB0aGUgbW91bnQgc3RydWN0dXJlLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfcnRtb3VudF9pbml0KAorCXN0cnVjdCB4ZnNfbW91bnQJKm1wKTsJLyogZmlsZSBzeXN0ZW0gbW91bnQgc3RydWN0dXJlICovCisKKy8qCisgKiBHZXQgdGhlIGJpdG1hcCBhbmQgc3VtbWFyeSBpbm9kZXMgaW50byB0aGUgbW91bnQgc3RydWN0dXJlCisgKiBhdCBtb3VudCB0aW1lLgorICovCitpbnQJCQkJCS8qIGVycm9yICovCit4ZnNfcnRtb3VudF9pbm9kZXMoCisJc3RydWN0IHhmc19tb3VudAkqbXApOwkvKiBmaWxlIHN5c3RlbSBtb3VudCBzdHJ1Y3R1cmUgKi8KKworLyoKKyAqIFBpY2sgYW4gZXh0ZW50IGZvciBhbGxvY2F0aW9uIGF0IHRoZSBzdGFydCBvZiBhIG5ldyByZWFsdGltZSBmaWxlLgorICogVXNlIHRoZSBzZXF1ZW5jZSBudW1iZXIgc3RvcmVkIGluIHRoZSBhdGltZSBmaWVsZCBvZiB0aGUgYml0bWFwIGlub2RlLgorICogVHJhbnNsYXRlIHRoaXMgdG8gYSBmcmFjdGlvbiBvZiB0aGUgcnRleHRlbnRzLCBhbmQgcmV0dXJuIHRoZSBwcm9kdWN0CisgKiBvZiBydGV4dGVudHMgYW5kIHRoZSBmcmFjdGlvbi4KKyAqIFRoZSBmcmFjdGlvbiBzZXF1ZW5jZSBpcyAwLCAxLzIsIDEvNCwgMy80LCAxLzgsIC4uLiwgNy84LCAxLzE2LCAuLi4KKyAqLworaW50CQkJCQkvKiBlcnJvciAqLworeGZzX3J0cGlja19leHRlbnQoCisJc3RydWN0IHhmc19tb3VudAkqbXAsCS8qIGZpbGUgc3lzdGVtIG1vdW50IHBvaW50ICovCisJc3RydWN0IHhmc190cmFucwkqdHAsCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfZXh0bGVuX3QJCWxlbiwJLyogYWxsb2NhdGlvbiBsZW5ndGggKHJ0ZXh0ZW50cykgKi8KKwl4ZnNfcnRibG9ja190CQkqcGljayk7CS8qIHJlc3VsdCBydCBleHRlbnQgKi8KKworLyoKKyAqIERlYnVnIGNvZGU6IHByaW50IG91dCB0aGUgdmFsdWUgb2YgYSByYW5nZSBpbiB0aGUgYml0bWFwLgorICovCit2b2lkCit4ZnNfcnRwcmludF9yYW5nZSgKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCwJLyogZmlsZSBzeXN0ZW0gbW91bnQgc3RydWN0dXJlICovCisJc3RydWN0IHhmc190cmFucwkqdHAsCS8qIHRyYW5zYWN0aW9uIHBvaW50ZXIgKi8KKwl4ZnNfcnRibG9ja190CQlzdGFydCwJLyogc3RhcnRpbmcgYmxvY2sgdG8gcHJpbnQgKi8KKwl4ZnNfZXh0bGVuX3QJCWxlbik7CS8qIGxlbmd0aCB0byBwcmludCAqLworCisvKgorICogRGVidWcgY29kZTogcHJpbnQgdGhlIHN1bW1hcnkgZmlsZS4KKyAqLwordm9pZAoreGZzX3J0cHJpbnRfc3VtbWFyeSgKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCwJLyogZmlsZSBzeXN0ZW0gbW91bnQgc3RydWN0dXJlICovCisJc3RydWN0IHhmc190cmFucwkqdHApOwkvKiB0cmFuc2FjdGlvbiBwb2ludGVyICovCisKKy8qCisgKiBHcm93IHRoZSByZWFsdGltZSBhcmVhIG9mIHRoZSBmaWxlc3lzdGVtLgorICovCitpbnQKK3hmc19ncm93ZnNfcnQoCisJc3RydWN0IHhmc19tb3VudAkqbXAsCS8qIGZpbGUgc3lzdGVtIG1vdW50IHN0cnVjdHVyZSAqLworCXhmc19ncm93ZnNfcnRfdAkJKmluKTsJLyogdXNlciBzdXBwbGllZCBncm93ZnMgc3RydWN0ICovCisKKyNlbHNlCisjIGRlZmluZSB4ZnNfcnRhbGxvY2F0ZV9leHRlbnQodCxiLG1pbixtYXgsbCxhLGYscCxyYikgIChFTk9TWVMpCisjIGRlZmluZSB4ZnNfcnRmcmVlX2V4dGVudCh0LGIsbCkgICAgICAgICAgICAgICAgICAgICAgIChFTk9TWVMpCisjIGRlZmluZSB4ZnNfcnRwaWNrX2V4dGVudChtLHQsbCxyYikgICAgICAgICAgICAgICAgICAgIChFTk9TWVMpCisjIGRlZmluZSB4ZnNfZ3Jvd2ZzX3J0KG1wLGluKSAgICAgICAgICAgICAgICAgICAgICAgICAgIChFTk9TWVMpCisjIGRlZmluZSB4ZnNfcnRtb3VudF9pbml0KG0pICAgICgoKG1wKS0+bV9zYi5zYl9yYmxvY2tzID09IDApPyAwIDogKEVOT1NZUykpCisjIGRlZmluZSB4ZnNfcnRtb3VudF9pbm9kZXMobSkgICgoKG1wKS0+bV9zYi5zYl9yYmxvY2tzID09IDApPyAwIDogKEVOT1NZUykpCisjZW5kaWYJLyogQ09ORklHX1hGU19SVCAqLworCisjZW5kaWYJLyogX19LRVJORUxfXyAqLworCisjZW5kaWYJLyogX19YRlNfUlRBTExPQ19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfcncuYyBiL2ZzL3hmcy94ZnNfcncuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2ZmN2FlCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19ydy5jCkBAIC0wLDAgKzEsMzU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisjaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc190eXBlcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19hZy5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMi5oIgorI2luY2x1ZGUgInhmc19kbWFwaS5oIgorI2luY2x1ZGUgInhmc19tb3VudC5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19pdGFibGUuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2F0dHIuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19ibWFwLmgiCisjaW5jbHVkZSAieGZzX2FjbC5oIgorI2luY2x1ZGUgInhmc19tYWMuaCIKKyNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKKyNpbmNsdWRlICJ4ZnNfYnVmX2l0ZW0uaCIKKyNpbmNsdWRlICJ4ZnNfcncuaCIKKworLyoKKyAqIFRoaXMgaXMgYSBzdWJyb3V0aW5lIGZvciB4ZnNfd3JpdGUoKSBhbmQgb3RoZXIgd3JpdGVycyAoeGZzX2lvY3RsKQorICogd2hpY2ggY2xlYXJzIHRoZSBzZXR1aWQgYW5kIHNldGdpZCBiaXRzIHdoZW4gYSBmaWxlIGlzIHdyaXR0ZW4uCisgKi8KK2ludAoreGZzX3dyaXRlX2NsZWFyX3NldHVpZCgKKwl4ZnNfaW5vZGVfdAkqaXApCit7CisJeGZzX21vdW50X3QJKm1wOworCXhmc190cmFuc190CSp0cDsKKwlpbnQJCWVycm9yOworCisJbXAgPSBpcC0+aV9tb3VudDsKKwl0cCA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX1dSSVRFSUQpOworCWlmICgoZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgMCwKKwkJCQkgICAgICBYRlNfV1JJVEVJRF9MT0dfUkVTKG1wKSwKKwkJCQkgICAgICAwLCAwLCAwKSkpIHsKKwkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgMCk7CisJCXJldHVybiBlcnJvcjsKKwl9CisJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgWEZTX0lMT0NLX0VYQ0wpOworCXhmc190cmFuc19paG9sZCh0cCwgaXApOworCWlwLT5pX2QuZGlfbW9kZSAmPSB+U19JU1VJRDsKKworCS8qCisJICogTm90ZSB0aGF0IHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgbWFuZGF0b3J5CisJICogZmlsZSBsb2NraW5nIGJlaW5nIGRpc2FibGVkIGhlcmUgYmVjYXVzZSB3ZSBvbmx5CisJICogY2xlYXIgdGhlIFNfSVNHSUQgYml0IGlmIHRoZSBHcm91cCBleGVjdXRlIGJpdCBpcworCSAqIG9uLCBidXQgaWYgaXQgd2FzIG9uIHRoZW4gbWFuZGF0b3J5IGxvY2tpbmcgd291bGRuJ3QKKwkgKiBoYXZlIGJlZW4gZW5hYmxlZC4KKwkgKi8KKwlpZiAoaXAtPmlfZC5kaV9tb2RlICYgU19JWEdSUCkgeworCQlpcC0+aV9kLmRpX21vZGUgJj0gflNfSVNHSUQ7CisJfQorCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLCBYRlNfSUxPR19DT1JFKTsKKwl4ZnNfdHJhbnNfc2V0X3N5bmModHApOworCWVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwgMCwgTlVMTCk7CisJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZvcmNlIGEgc2h1dGRvd24gb2YgdGhlIGZpbGVzeXN0ZW0gaW5zdGFudGx5IHdoaWxlIGtlZXBpbmcKKyAqIHRoZSBmaWxlc3lzdGVtIGNvbnNpc3RlbnQuIFdlIGRvbid0IGRvIGFuIHVubW91bnQgaGVyZTsganVzdCBzaHV0ZG93bgorICogdGhlIHNob3AsIG1ha2Ugc3VyZSB0aGF0IGFic29sdXRlbHkgbm90aGluZyBwZXJzaXN0ZW50IGhhcHBlbnMgdG8KKyAqIHRoaXMgZmlsZXN5c3RlbSBhZnRlciB0aGlzIHBvaW50LgorICovCisKK3ZvaWQKK3hmc19kb19mb3JjZV9zaHV0ZG93bigKKwliaHZfZGVzY190CSpiZHAsCisJaW50CQlmbGFncywKKwljaGFyCQkqZm5hbWUsCisJaW50CQlsbm51bSkKK3sKKwlpbnQJCWxvZ2Vycm9yOworCXhmc19tb3VudF90CSptcDsKKworCW1wID0gWEZTX0JIVlRPTShiZHApOworCWxvZ2Vycm9yID0gZmxhZ3MgJiBYRlNfTE9HX0lPX0VSUk9SOworCisJaWYgKCEoZmxhZ3MgJiBYRlNfRk9SQ0VfVU1PVU5UKSkgeworCQljbW5fZXJyKENFX05PVEUsCisJCSJ4ZnNfZm9yY2Vfc2h1dGRvd24oJXMsMHgleCkgY2FsbGVkIGZyb20gbGluZSAlZCBvZiBmaWxlICVzLiAgUmV0dXJuIGFkZHJlc3MgPSAweCVwIiwKKwkJCW1wLT5tX2ZzbmFtZSxmbGFncyxsbm51bSxmbmFtZSxfX3JldHVybl9hZGRyZXNzKTsKKwl9CisJLyoKKwkgKiBObyBuZWVkIHRvIGR1cGxpY2F0ZSBlZmZvcnRzLgorCSAqLworCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSAmJiAhbG9nZXJyb3IpCisJCXJldHVybjsKKworCS8qCisJICogVGhpcyBmbGFncyBYRlNfTU9VTlRfRlNfU0hVVERPV04sIG1ha2VzIHN1cmUgdGhhdCB3ZSBkb24ndAorCSAqIHF1ZXVlIHVwIGFueWJvZHkgbmV3IG9uIHRoZSBsb2cgcmVzZXJ2YXRpb25zLCBhbmQgd2FrZXMgdXAKKwkgKiBldmVyeWJvZHkgd2hvJ3Mgc2xlZXBpbmcgb24gbG9nIHJlc2VydmF0aW9ucyBhbmQgdGVsbHMKKwkgKiB0aGVtIHRoZSBiYWQgbmV3cy4KKwkgKi8KKwlpZiAoeGZzX2xvZ19mb3JjZV91bW91bnQobXAsIGxvZ2Vycm9yKSkKKwkJcmV0dXJuOworCisJaWYgKGZsYWdzICYgWEZTX0NPUlJVUFRfSU5DT1JFKSB7CisJCXhmc19jbW5fZXJyKFhGU19QVEFHX1NIVVRET1dOX0NPUlJVUFQsIENFX0FMRVJULCBtcCwKKyAgICAiQ29ycnVwdGlvbiBvZiBpbi1tZW1vcnkgZGF0YSBkZXRlY3RlZC4gIFNodXR0aW5nIGRvd24gZmlsZXN5c3RlbTogJXMiLAorCQkJbXAtPm1fZnNuYW1lKTsKKwkJaWYgKFhGU19FUlJMRVZFTF9ISUdIIDw9IHhmc19lcnJvcl9sZXZlbCkgeworCQkJeGZzX3N0YWNrX3RyYWNlKCk7CisJCX0KKwl9IGVsc2UgaWYgKCEoZmxhZ3MgJiBYRlNfRk9SQ0VfVU1PVU5UKSkgeworCQlpZiAobG9nZXJyb3IpIHsKKwkJCXhmc19jbW5fZXJyKFhGU19QVEFHX1NIVVRET1dOX0xPR0VSUk9SLCBDRV9BTEVSVCwgbXAsCisJCQkiTG9nIEkvTyBFcnJvciBEZXRlY3RlZC4gIFNodXR0aW5nIGRvd24gZmlsZXN5c3RlbTogJXMiLAorCQkJCW1wLT5tX2ZzbmFtZSk7CisJCX0gZWxzZSBpZiAoIShmbGFncyAmIFhGU19TSFVURE9XTl9SRU1PVEVfUkVRKSkgeworCQkJeGZzX2Ntbl9lcnIoWEZTX1BUQUdfU0hVVERPV05fSU9FUlJPUiwgQ0VfQUxFUlQsIG1wLAorCQkJCSJJL08gRXJyb3IgRGV0ZWN0ZWQuICBTaHV0dGluZyBkb3duIGZpbGVzeXN0ZW06ICVzIiwKKwkJCQltcC0+bV9mc25hbWUpOworCQl9CisJfQorCWlmICghKGZsYWdzICYgWEZTX0ZPUkNFX1VNT1VOVCkpIHsKKwkJY21uX2VycihDRV9BTEVSVCwKKwkJIlBsZWFzZSB1bW91bnQgdGhlIGZpbGVzeXN0ZW0sIGFuZCByZWN0aWZ5IHRoZSBwcm9ibGVtKHMpIik7CisJfQorfQorCisKKy8qCisgKiBDYWxsZWQgd2hlbiB3ZSB3YW50IHRvIHN0b3AgYSBidWZmZXIgZnJvbSBnZXR0aW5nIHdyaXR0ZW4gb3IgcmVhZC4KKyAqIFdlIGF0dGFjaCB0aGUgRUlPIGVycm9yLCBtdWNrIHdpdGggaXRzIGZsYWdzLCBhbmQgY2FsbCBiaW9kb25lCisgKiBzbyB0aGF0IHRoZSBwcm9wZXIgaW9kb25lIGNhbGxiYWNrcyBnZXQgY2FsbGVkLgorICovCitpbnQKK3hmc19iaW9lcnJvcigKKwl4ZnNfYnVmX3QgKmJwKQoreworCisjaWZkZWYgWEZTRVJST1JERUJVRworCUFTU0VSVChYRlNfQlVGX0lTUkVBRChicCkgfHwgYnAtPmJfaW9kb25lKTsKKyNlbmRpZgorCisJLyoKKwkgKiBObyBuZWVkIHRvIHdhaXQgdW50aWwgdGhlIGJ1ZmZlciBpcyB1bnBpbm5lZC4KKwkgKiBXZSBhcmVuJ3QgZmx1c2hpbmcgaXQuCisJICovCisJeGZzX2J1ZnRyYWNlKCJYRlMgSU9FUlJPUiIsIGJwKTsKKwlYRlNfQlVGX0VSUk9SKGJwLCBFSU8pOworCS8qCisJICogV2UncmUgY2FsbGluZyBiaW9kb25lLCBzbyBkZWxldGUgQl9ET05FIGZsYWcuIEVpdGhlciB3YXkKKwkgKiB3ZSBoYXZlIHRvIGNhbGwgdGhlIGlvZG9uZSBjYWxsYmFjaywgYW5kIGNhbGxpbmcgYmlvZG9uZQorCSAqIHByb2JhYmx5IGlzIHRoZSBiZXN0IHdheSBzaW5jZSBpdCB0YWtlcyBjYXJlIG9mCisJICogR1JJTyBhcyB3ZWxsLgorCSAqLworCVhGU19CVUZfVU5SRUFEKGJwKTsKKwlYRlNfQlVGX1VOREVMQVlXUklURShicCk7CisJWEZTX0JVRl9VTkRPTkUoYnApOworCVhGU19CVUZfU1RBTEUoYnApOworCisJWEZTX0JVRl9DTFJfQkRTVFJBVF9GVU5DKGJwKTsKKwl4ZnNfYmlvZG9uZShicCk7CisKKwlyZXR1cm4gKEVJTyk7Cit9CisKKy8qCisgKiBTYW1lIGFzIHhmc19iaW9lcnJvciwgZXhjZXB0IHRoYXQgd2UgYXJlIHJlbGVhc2luZyB0aGUgYnVmZmVyCisgKiBoZXJlIG91cnNlbHZlcywgYW5kIGF2b2lkaW5nIHRoZSBiaW9kb25lIGNhbGwuCisgKiBUaGlzIGlzIG1lYW50IGZvciB1c2VyZGF0YSBlcnJvcnM7IG1ldGFkYXRhIGJ1ZnMgY29tZSB3aXRoCisgKiBpb2RvbmUgZnVuY3Rpb25zIGF0dGFjaGVkLCBzbyB0aGF0IHdlIGNhbiB0cmFjayBkb3duIGVycm9ycy4KKyAqLworaW50Cit4ZnNfYmlvZXJyb3JfcmVsc2UoCisJeGZzX2J1Zl90ICpicCkKK3sKKwlpbnQ2NF90IGZsOworCisJQVNTRVJUKFhGU19CVUZfSU9ET05FX0ZVTkMoYnApICE9IHhmc19idWZfaW9kb25lX2NhbGxiYWNrcyk7CisJQVNTRVJUKFhGU19CVUZfSU9ET05FX0ZVTkMoYnApICE9IHhsb2dfaW9kb25lKTsKKworCXhmc19idWZ0cmFjZSgiWEZTIElPRVJSRUxTRSIsIGJwKTsKKwlmbCA9IFhGU19CVUZfQkZMQUdTKGJwKTsKKwkvKgorCSAqIE5vIG5lZWQgdG8gd2FpdCB1bnRpbCB0aGUgYnVmZmVyIGlzIHVucGlubmVkLgorCSAqIFdlIGFyZW4ndCBmbHVzaGluZyBpdC4KKwkgKgorCSAqIGNodW5raG9sZCBleHBlY3RzIEJfRE9ORSB0byBiZSBzZXQsIHdoZXRoZXIKKwkgKiB3ZSBhY3R1YWxseSBmaW5pc2ggdGhlIEkvTyBvciBub3QuIFdlIGRvbid0IHdhbnQgdG8KKwkgKiBjaGFuZ2UgdGhhdCBpbnRlcmZhY2UuCisJICovCisJWEZTX0JVRl9VTlJFQUQoYnApOworCVhGU19CVUZfVU5ERUxBWVdSSVRFKGJwKTsKKwlYRlNfQlVGX0RPTkUoYnApOworCVhGU19CVUZfU1RBTEUoYnApOworCVhGU19CVUZfQ0xSX0lPRE9ORV9GVU5DKGJwKTsKKwlYRlNfQlVGX0NMUl9CRFNUUkFUX0ZVTkMoYnApOworCWlmICghKGZsICYgWEZTX0JfQVNZTkMpKSB7CisJCS8qCisJCSAqIE1hcmsgYl9lcnJvciBhbmQgQl9FUlJPUiBfYm90aF8uCisJCSAqIExvdCdzIG9mIGNodW5rY2FjaGUgY29kZSBhc3N1bWVzIHRoYXQuCisJCSAqIFRoZXJlJ3Mgbm8gcmVhc29uIHRvIG1hcmsgZXJyb3IgZm9yCisJCSAqIEFTWU5DIGJ1ZmZlcnMuCisJCSAqLworCQlYRlNfQlVGX0VSUk9SKGJwLCBFSU8pOworCQlYRlNfQlVGX1ZfSU9ET05FU0VNQShicCk7CisJfSBlbHNlIHsKKwkJeGZzX2J1Zl9yZWxzZShicCk7CisJfQorCXJldHVybiAoRUlPKTsKK30KKy8qCisgKiBQcmludHMgb3V0IGFuIEFMRVJUIG1lc3NhZ2UgYWJvdXQgSS9PIGVycm9yLgorICovCit2b2lkCit4ZnNfaW9lcnJvcl9hbGVydCgKKwljaGFyCQkJKmZ1bmMsCisJc3RydWN0IHhmc19tb3VudAkqbXAsCisJeGZzX2J1Zl90CQkqYnAsCisJeGZzX2RhZGRyX3QJCWJsa25vKQoreworCWNtbl9lcnIoQ0VfQUxFUlQsCisgIkkvTyBlcnJvciBpbiBmaWxlc3lzdGVtIChcIiVzXCIpIG1ldGEtZGF0YSBkZXYgJXMgYmxvY2sgMHglbGx4IgorICIgICAgICAgKFwiJXNcIikgZXJyb3IgJWQgYnVmIGNvdW50ICV1IiwKKwkJKCFtcCB8fCAhbXAtPm1fZnNuYW1lKSA/ICIoZnMgbmFtZSBub3Qgc2V0KSIgOiBtcC0+bV9mc25hbWUsCisJCVhGU19CVUZUQVJHX05BTUUoYnAtPnBiX3RhcmdldCksCisJCShfX3VpbnQ2NF90KWJsa25vLAorCQlmdW5jLAorCQlYRlNfQlVGX0dFVEVSUk9SKGJwKSwKKwkJWEZTX0JVRl9DT1VOVChicCkpOworfQorCisvKgorICogVGhpcyBpc24ndCBhbiBhYnNvbHV0ZSByZXF1aXJlbWVudCwgYnV0IGl0IGlzCisgKiBqdXN0IGEgZ29vZCBpZGVhIHRvIGNhbGwgeGZzX3JlYWRfYnVmIGluc3RlYWQgb2YKKyAqIGRpcmVjdGx5IGRvaW5nIGEgcmVhZF9idWYgY2FsbC4gRm9yIG9uZSwgd2Ugc2hvdWxkbid0CisgKiBiZSBkb2luZyB0aGlzIGRpc2sgcmVhZCBpZiB3ZSBhcmUgaW4gU0hVVERPV04gc3RhdGUgYW55d2F5LAorICogc28gdGhpcyBzdG9wcyB0aGF0IGZyb20gaGFwcGVuaW5nLiBTZWNvbmRseSwgdGhpcyBkb2VzIGFsbAorICogdGhlIGVycm9yIGNoZWNraW5nIHN0dWZmIGFuZCB0aGUgYnJlbHNlIGlmIGFwcHJvcHJpYXRlIGZvcgorICogdGhlIGNhbGxlciwgc28gdGhlIGNvZGUgY2FuIGJlIGEgbGl0dGxlIGxlYW5lci4KKyAqLworCitpbnQKK3hmc19yZWFkX2J1ZigKKwlzdHJ1Y3QgeGZzX21vdW50ICptcCwKKwl4ZnNfYnVmdGFyZ190CSAqdGFyZ2V0LAorCXhmc19kYWRkcl90CSBibGtubywKKwlpbnQgICAgICAgICAgICAgIGxlbiwKKwl1aW50ICAgICAgICAgICAgIGZsYWdzLAorCXhmc19idWZfdAkgKipicHApCit7CisJeGZzX2J1Zl90CSAqYnA7CisJaW50CQkgZXJyb3I7CisKKwlpZiAoZmxhZ3MpCisJCWJwID0geGZzX2J1Zl9yZWFkX2ZsYWdzKHRhcmdldCwgYmxrbm8sIGxlbiwgZmxhZ3MpOworCWVsc2UKKwkJYnAgPSB4ZnNfYnVmX3JlYWQodGFyZ2V0LCBibGtubywgbGVuLCBmbGFncyk7CisJaWYgKCFicCkKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCWVycm9yID0gWEZTX0JVRl9HRVRFUlJPUihicCk7CisJaWYgKGJwICYmICFlcnJvciAmJiAhWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpIHsKKwkJKmJwcCA9IGJwOworCX0gZWxzZSB7CisJCSpicHAgPSBOVUxMOworCQlpZiAoZXJyb3IpIHsKKwkJCXhmc19pb2Vycm9yX2FsZXJ0KCJ4ZnNfcmVhZF9idWYiLCBtcCwgYnAsIFhGU19CVUZfQUREUihicCkpOworCQl9IGVsc2UgeworCQkJZXJyb3IgPSBYRlNfRVJST1IoRUlPKTsKKwkJfQorCQlpZiAoYnApIHsKKwkJCVhGU19CVUZfVU5ET05FKGJwKTsKKwkJCVhGU19CVUZfVU5ERUxBWVdSSVRFKGJwKTsKKwkJCVhGU19CVUZfU1RBTEUoYnApOworCQkJLyoKKwkJCSAqIGJyZWxzZSBjbGVhcnMgQl9FUlJPUiBhbmQgYl9lcnJvcgorCQkJICovCisJCQl4ZnNfYnVmX3JlbHNlKGJwKTsKKwkJfQorCX0KKwlyZXR1cm4gKGVycm9yKTsKK30KKworLyoKKyAqIFdyYXBwZXIgYXJvdW5kIGJ3cml0ZSgpIHNvIHRoYXQgd2UgY2FuIHRyYXAKKyAqIHdyaXRlIGVycm9ycywgYW5kIGFjdCBhY2NvcmRpbmdseS4KKyAqLworaW50Cit4ZnNfYndyaXRlKAorCXN0cnVjdCB4ZnNfbW91bnQgKm1wLAorCXN0cnVjdCB4ZnNfYnVmCSAqYnApCit7CisJaW50CWVycm9yOworCisJLyoKKwkgKiBYWFhzdXAgaG93IGRvZXMgdGhpcyB3b3JrIGZvciBxdW90YXMuCisJICovCisJWEZTX0JVRl9TRVRfQkRTVFJBVF9GVU5DKGJwLCB4ZnNfYmRzdHJhdF9jYik7CisJWEZTX0JVRl9TRVRfRlNQUklWQVRFMyhicCwgbXApOworCVhGU19CVUZfV1JJVEUoYnApOworCisJaWYgKChlcnJvciA9IFhGU19id3JpdGUoYnApKSkgeworCQlBU1NFUlQobXApOworCQkvKgorCQkgKiBDYW5ub3QgcHV0IGEgYnVmdHJhY2UgaGVyZSBzaW5jZSBpZiB0aGUgYnVmZmVyIGlzIG5vdAorCQkgKiBCX0hPTEQgdGhlbiB3ZSB3aWxsIGJyZWxzZSgpIHRoZSBidWZmZXIgYmVmb3JlIHJldHVybmluZworCQkgKiBmcm9tIGJ3cml0ZSBhbmQgd2UgY291bGQgYmUgdHJhY2luZyBhIGJ1ZmZlciB0aGF0IGhhcworCQkgKiBiZWVuIHJldXNlZC4KKwkJICovCisJCXhmc19mb3JjZV9zaHV0ZG93bihtcCwgWEZTX01FVEFEQVRBX0lPX0VSUk9SKTsKKwl9CisJcmV0dXJuIChlcnJvcik7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3J3LmggYi9mcy94ZnMveGZzX3J3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhiMTBiZgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfcncuaApAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYJX19YRlNfUldfSF9fCisjZGVmaW5lCV9fWEZTX1JXX0hfXworCitzdHJ1Y3QgeGZzX2J1ZjsKK3N0cnVjdCB4ZnNfaW5vZGU7CitzdHJ1Y3QgeGZzX21vdW50OworCisvKgorICogTWF4aW11bSBjb3VudCBvZiBibWFwcyB1c2VkIGJ5IHJlYWQgYW5kIHdyaXRlIHBhdGhzLgorICovCisjZGVmaW5lCVhGU19NQVhfUldfTkJNQVBTCTQKKworLyoKKyAqIENvdW50cyBvZiByZWFkYWhlYWQgYnVmZmVycyB0byB1c2UgYmFzZWQgb24gcGh5c2ljYWwgbWVtb3J5IHNpemUuCisgKiBOb25lIG9mIHRoZXNlIHNob3VsZCBiZSBtb3JlIHRoYW4gWEZTX01BWF9SV19OQk1BUFMuCisgKi8KKyNkZWZpbmUJWEZTX1JXX05SRUFEQUhFQURfMTZNQgkyCisjZGVmaW5lCVhGU19SV19OUkVBREFIRUFEXzMyTUIJMworI2RlZmluZQlYRlNfUldfTlJFQURBSEVBRF9LMzIJNAorI2RlZmluZQlYRlNfUldfTlJFQURBSEVBRF9LNjQJNAorCisvKgorICogTWF4aW11bSBzaXplIG9mIGEgYnVmZmVyIHRoYXQgd2VcJ2xsIG1hcC4gIE1ha2luZyB0aGlzCisgKiB0b28gYmlnIHdpbGwgZGVncmFkZSBwZXJmb3JtYW5jZSBkdWUgdG8gdGhlIG51bWJlciBvZgorICogcGFnZXMgd2hpY2ggbmVlZCB0byBiZSBnYXRoZXJlZC4gIE1ha2luZyBpdCB0b28gc21hbGwKKyAqIHdpbGwgcHJldmVudCB1cyBmcm9tIGRvaW5nIGxhcmdlIEkvT1wncyB0byBoYXJkd2FyZSB0aGF0CisgKiBuZWVkcyBpdC4KKyAqCisgKiBUaGlzIGlzIGN1cnJlbnRseSBzZXQgdG8gNTEyIEtCLgorICovCisjZGVmaW5lCVhGU19NQVhfQk1BUF9MRU5fQkIJMTAyNAorI2RlZmluZQlYRlNfTUFYX0JNQVBfTEVOX0JZVEVTCTUyNDI4OAorCisvKgorICogQ29udmVydCB0aGUgZ2l2ZW4gZmlsZSBzeXN0ZW0gYmxvY2sgdG8gYSBkaXNrIGJsb2NrLgorICogV2UgaGF2ZSB0byB0cmVhdCBpdCBkaWZmZXJlbnRseSBiYXNlZCBvbiB3aGV0aGVyIHRoZQorICogZmlsZSBpcyBhIHJlYWwgdGltZSBmaWxlIG9yIG5vdCwgYmVjYXVzZSB0aGUgYm1hcCBjb2RlCisgKiBkb2VzLgorICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19GU0JfVE9fREIpCit4ZnNfZGFkZHJfdCB4ZnNfZnNiX3RvX2RiKHN0cnVjdCB4ZnNfaW5vZGUgKmlwLCB4ZnNfZnNibG9ja190IGZzYik7CisjZGVmaW5lCVhGU19GU0JfVE9fREIoaXAsZnNiKQl4ZnNfZnNiX3RvX2RiKGlwLGZzYikKKyNlbHNlCisjZGVmaW5lCVhGU19GU0JfVE9fREIoaXAsZnNiKSBcCisJCSgoKGlwKS0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19SRUFMVElNRSkgPyBcCisJCSAoeGZzX2RhZGRyX3QpWEZTX0ZTQl9UT19CQigoaXApLT5pX21vdW50LCAoZnNiKSkgOiBcCisJCSBYRlNfRlNCX1RPX0RBRERSKChpcCktPmlfbW91bnQsIChmc2IpKSkKKyNlbmRpZgorCisjZGVmaW5lIFhGU19GU0JfVE9fREJfSU8oaW8sZnNiKSBcCisJCSgoKGlvKS0+aW9fZmxhZ3MgJiBYRlNfSU9DT1JFX1JUKSA/IFwKKwkJIFhGU19GU0JfVE9fQkIoKGlvKS0+aW9fbW91bnQsIChmc2IpKSA6IFwKKwkJIFhGU19GU0JfVE9fREFERFIoKGlvKS0+aW9fbW91bnQsIChmc2IpKSkKKworLyoKKyAqIFByb3RvdHlwZXMgZm9yIGZ1bmN0aW9ucyBpbiB4ZnNfcncuYy4KKyAqLworCitpbnQKK3hmc193cml0ZV9jbGVhcl9zZXR1aWQoCisJc3RydWN0IHhmc19pbm9kZQkqaXApOworCitpbnQKK3hmc19id3JpdGUoCisJc3RydWN0IHhmc19tb3VudAkqbXAsCisJc3RydWN0IHhmc19idWYJCSpicCk7CisKK2ludAoreGZzX2Jpb2Vycm9yKAorCXN0cnVjdCB4ZnNfYnVmCQkqYik7CisKK2ludAoreGZzX2Jpb2Vycm9yX3JlbHNlKAorCXN0cnVjdCB4ZnNfYnVmCQkqYik7CisKK2ludAoreGZzX3JlYWRfYnVmKAorCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAorCXhmc19idWZ0YXJnX3QJCSp0YXJnZXQsCisJeGZzX2RhZGRyX3QJCWJsa25vLAorCWludAkJCWxlbiwKKwl1aW50CQkJZmxhZ3MsCisJc3RydWN0IHhmc19idWYJCSoqYnBwKTsKKwordm9pZAoreGZzX2lvZXJyb3JfYWxlcnQoCisJY2hhcgkJCSpmdW5jLAorCXN0cnVjdCB4ZnNfbW91bnQJKm1wLAorCXhmc19idWZfdAkJKmJwLAorCXhmc19kYWRkcl90CQlibGtubyk7CisKKworLyoKKyAqIFByb3RvdHlwZXMgZm9yIGZ1bmN0aW9ucyBpbiB4ZnNfdm5vZGVvcHMuYy4KKyAqLworCitpbnQKK3hmc19yd2xvY2soCisJYmh2X2Rlc2NfdAkJKmJkcCwKKwl2cndsb2NrX3QJCXdyaXRlX2xvY2spOworCit2b2lkCit4ZnNfcnd1bmxvY2soCisJYmh2X2Rlc2NfdAkJKmJkcCwKKwl2cndsb2NrX3QJCXdyaXRlX2xvY2spOworCitpbnQKK3hmc19jaGFuZ2VfZmlsZV9zcGFjZSgKKwliaHZfZGVzY190CQkqYmRwLAorCWludAkJCWNtZCwKKwl4ZnNfZmxvY2s2NF90CQkqYmYsCisJeGZzX29mZl90CQlvZmZzZXQsCisJY3JlZF90CQkJKmNyZWRwLAorCWludAkJCWZsYWdzKTsKKworaW50Cit4ZnNfc2V0X2RtYXR0cnMoCisJYmh2X2Rlc2NfdAkJKmJkcCwKKwl1X2ludAkJCWV2bWFzaywKKwl1X2ludDE2X3QJCXN0YXRlLAorCWNyZWRfdAkJCSpjcmVkcCk7CisKKyNlbmRpZiAvKiBfX1hGU19SV19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfc2IuaCBiL2ZzL3hmcy94ZnNfc2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDA5MGE4Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc19zYi5oCkBAIC0wLDAgKzEsNTgzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19TQl9IX18KKyNkZWZpbmUJX19YRlNfU0JfSF9fCisKKy8qCisgKiBTdXBlciBibG9jaworICogRml0cyBpbnRvIGEgc2VjdG9yLXNpemVkIGJ1ZmZlciBhdCBhZGRyZXNzIDAgb2YgZWFjaCBhbGxvY2F0aW9uIGdyb3VwLgorICogT25seSB0aGUgZmlyc3Qgb2YgdGhlc2UgaXMgZXZlciB1cGRhdGVkIGV4Y2VwdCBkdXJpbmcgZ3Jvd2ZzLgorICovCisKK3N0cnVjdCB4ZnNfYnVmOworc3RydWN0IHhmc19tb3VudDsKKworI2RlZmluZQlYRlNfU0JfTUFHSUMJCTB4NTg0NjUzNDIJLyogJ1hGU0InICovCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OXzEJMQkJLyogNS4zLCA2LjAuMSwgNi4xICovCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OXzIJMgkJLyogNi4yIC0gYXR0cmlidXRlcyAqLworI2RlZmluZQlYRlNfU0JfVkVSU0lPTl8zCTMJCS8qIDYuMiAtIG5ldyBpbm9kZSB2ZXJzaW9uICovCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OXzQJNAkJLyogNi4yKyAtIGJpdG1hc2sgdmVyc2lvbiAqLworI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9OVU1CSVRTCQkweDAwMGYKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fQUxMRkJJVFMJCTB4ZmZmMAorI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9TQVNIRkJJVFMJMHhmMDAwCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX1JFQUxGQklUUwkweDBmZjAKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fQVRUUkJJVAkJMHgwMDEwCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX05MSU5LQklUCQkweDAwMjAKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fUVVPVEFCSVQJCTB4MDA0MAorI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9BTElHTkJJVAkJMHgwMDgwCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX0RBTElHTkJJVAkweDAxMDAKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fU0hBUkVEQklUCTB4MDIwMAorI2RlZmluZSBYRlNfU0JfVkVSU0lPTl9MT0dWMkJJVAkJMHgwNDAwCisjZGVmaW5lIFhGU19TQl9WRVJTSU9OX1NFQ1RPUkJJVAkweDA4MDAKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fRVhURkxHQklUCTB4MTAwMAorI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9ESVJWMkJJVAkJMHgyMDAwCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX01PUkVCSVRTQklUCTB4ODAwMAorI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9PS1NBU0hGQklUUwlcCisJKFhGU19TQl9WRVJTSU9OX0VYVEZMR0JJVCB8IFwKKwkgWEZTX1NCX1ZFUlNJT05fRElSVjJCSVQpCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX09LUkVBTEZCSVRTCVwKKwkoWEZTX1NCX1ZFUlNJT05fQVRUUkJJVCB8IFwKKwkgWEZTX1NCX1ZFUlNJT05fTkxJTktCSVQgfCBcCisJIFhGU19TQl9WRVJTSU9OX1FVT1RBQklUIHwgXAorCSBYRlNfU0JfVkVSU0lPTl9BTElHTkJJVCB8IFwKKwkgWEZTX1NCX1ZFUlNJT05fREFMSUdOQklUIHwgXAorCSBYRlNfU0JfVkVSU0lPTl9TSEFSRURCSVQgfCBcCisJIFhGU19TQl9WRVJTSU9OX0xPR1YyQklUIHwgXAorCSBYRlNfU0JfVkVSU0lPTl9TRUNUT1JCSVQpCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX09LU0FTSEJJVFMJXAorCShYRlNfU0JfVkVSU0lPTl9OVU1CSVRTIHwgXAorCSBYRlNfU0JfVkVSU0lPTl9SRUFMRkJJVFMgfCBcCisJIFhGU19TQl9WRVJTSU9OX09LU0FTSEZCSVRTKQorI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9PS1JFQUxCSVRTCVwKKwkoWEZTX1NCX1ZFUlNJT05fTlVNQklUUyB8IFwKKwkgWEZTX1NCX1ZFUlNJT05fT0tSRUFMRkJJVFMgfCBcCisJIFhGU19TQl9WRVJTSU9OX09LU0FTSEZCSVRTKQorI2RlZmluZSBYRlNfU0JfVkVSU0lPTl9NS0ZTKGlhLGRpYSxleHRmbGFnLGRpcnYyLG5hLHNmbGFnLG1vcmViaXRzKQlcCisJKCgoaWEpIHx8IChkaWEpIHx8IChleHRmbGFnKSB8fCAoZGlydjIpIHx8IChuYSkgfHwgKHNmbGFnKSB8fCBcCisJICAobW9yZWJpdHMpKSA/IFwKKwkJKFhGU19TQl9WRVJTSU9OXzQgfCBcCisJCSAoKGlhKSA/IFhGU19TQl9WRVJTSU9OX0FMSUdOQklUIDogMCkgfCBcCisJCSAoKGRpYSkgPyBYRlNfU0JfVkVSU0lPTl9EQUxJR05CSVQgOiAwKSB8IFwKKwkJICgoZXh0ZmxhZykgPyBYRlNfU0JfVkVSU0lPTl9FWFRGTEdCSVQgOiAwKSB8IFwKKwkJICgoZGlydjIpID8gWEZTX1NCX1ZFUlNJT05fRElSVjJCSVQgOiAwKSB8IFwKKwkJICgobmEpID8gWEZTX1NCX1ZFUlNJT05fTE9HVjJCSVQgOiAwKSB8IFwKKwkJICgoc2ZsYWcpID8gWEZTX1NCX1ZFUlNJT05fU0VDVE9SQklUIDogMCkgfCBcCisJCSAoKG1vcmViaXRzKSA/IFhGU19TQl9WRVJTSU9OX01PUkVCSVRTQklUIDogMCkpIDogXAorCQlYRlNfU0JfVkVSU0lPTl8xKQorCisvKgorICogVGhlcmUgYXJlIHR3byB3b3JkcyB0byBob2xkIFhGUyAiZmVhdHVyZSIgYml0czogdGhlIG9yaWdpbmFsCisgKiB3b3JkLCBzYl92ZXJzaW9ubnVtLCBhbmQgc2JfZmVhdHVyZXMyLiAgV2hlbmV2ZXIgYSBiaXQgaXMgc2V0IGluCisgKiBzYl9mZWF0dXJlczIsIHRoZSBmZWF0dXJlIGJpdCBYRlNfU0JfVkVSU0lPTl9NT1JFQklUU0JJVCBtdXN0IGJlIHNldC4KKyAqCisgKiBUaGVzZSBkZWZpbmVzIHJlcHJlc2VudCBiaXRzIGluIHNiX2ZlYXR1cmVzMi4KKyAqLworI2RlZmluZSBYRlNfU0JfVkVSU0lPTjJfUkVBTEZCSVRTCTB4MDBmZmZmZmYJLyogTWFzazogZmVhdHVyZXMgKi8KKyNkZWZpbmUgWEZTX1NCX1ZFUlNJT04yX1JFU0VSVkVEMUJJVAkweDAwMDAwMDAxCisjZGVmaW5lIFhGU19TQl9WRVJTSU9OMl9TQVNIRkJJVFMJMHhmZjAwMDAwMAkvKiBNYXNrOiBmZWF0dXJlcyB0aGF0CisJCQkJCQkJICAgcmVxdWlyZSBjaGFuZ2luZworCQkJCQkJCSAgIFBST00gYW5kIFNBU0ggKi8KKworI2RlZmluZQlYRlNfU0JfVkVSU0lPTjJfT0tSRUFMRkJJVFMJXAorCSgwKQorI2RlZmluZQlYRlNfU0JfVkVSU0lPTjJfT0tTQVNIRkJJVFMJXAorCSgwKQorI2RlZmluZSBYRlNfU0JfVkVSU0lPTjJfT0tSRUFMQklUUwlcCisJKFhGU19TQl9WRVJTSU9OMl9PS1JFQUxGQklUUyB8CVwKKwkgWEZTX1NCX1ZFUlNJT04yX09LU0FTSEZCSVRTICkKKworLyoKKyAqIG1rZnMgbWFjcm8gdG8gc2V0IHVwIHNiX2ZlYXR1cmVzMiB3b3JkCisgKi8KKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT04yX01LRlMoeHl6KQlcCisJKCh4eXopID8gMCA6IDApCisKK3R5cGVkZWYgc3RydWN0IHhmc19zYgoreworCV9fdWludDMyX3QJc2JfbWFnaWNudW07CS8qIG1hZ2ljIG51bWJlciA9PSBYRlNfU0JfTUFHSUMgKi8KKwlfX3VpbnQzMl90CXNiX2Jsb2Nrc2l6ZTsJLyogbG9naWNhbCBibG9jayBzaXplLCBieXRlcyAqLworCXhmc19kcmZzYm5vX3QJc2JfZGJsb2NrczsJLyogbnVtYmVyIG9mIGRhdGEgYmxvY2tzICovCisJeGZzX2RyZnNibm9fdAlzYl9yYmxvY2tzOwkvKiBudW1iZXIgb2YgcmVhbHRpbWUgYmxvY2tzICovCisJeGZzX2RydGJub190CXNiX3JleHRlbnRzOwkvKiBudW1iZXIgb2YgcmVhbHRpbWUgZXh0ZW50cyAqLworCXV1aWRfdAkJc2JfdXVpZDsJLyogZmlsZSBzeXN0ZW0gdW5pcXVlIGlkICovCisJeGZzX2Rmc2Jub190CXNiX2xvZ3N0YXJ0OwkvKiBzdGFydGluZyBibG9jayBvZiBsb2cgaWYgaW50ZXJuYWwgKi8KKwl4ZnNfaW5vX3QJc2Jfcm9vdGlubzsJLyogcm9vdCBpbm9kZSBudW1iZXIgKi8KKwl4ZnNfaW5vX3QJc2JfcmJtaW5vOwkvKiBiaXRtYXAgaW5vZGUgZm9yIHJlYWx0aW1lIGV4dGVudHMgKi8KKwl4ZnNfaW5vX3QJc2JfcnN1bWlubzsJLyogc3VtbWFyeSBpbm9kZSBmb3IgcnQgYml0bWFwICovCisJeGZzX2FnYmxvY2tfdAlzYl9yZXh0c2l6ZTsJLyogcmVhbHRpbWUgZXh0ZW50IHNpemUsIGJsb2NrcyAqLworCXhmc19hZ2Jsb2NrX3QJc2JfYWdibG9ja3M7CS8qIHNpemUgb2YgYW4gYWxsb2NhdGlvbiBncm91cCAqLworCXhmc19hZ251bWJlcl90CXNiX2FnY291bnQ7CS8qIG51bWJlciBvZiBhbGxvY2F0aW9uIGdyb3VwcyAqLworCXhmc19leHRsZW5fdAlzYl9yYm1ibG9ja3M7CS8qIG51bWJlciBvZiBydCBiaXRtYXAgYmxvY2tzICovCisJeGZzX2V4dGxlbl90CXNiX2xvZ2Jsb2NrczsJLyogbnVtYmVyIG9mIGxvZyBibG9ja3MgKi8KKwlfX3VpbnQxNl90CXNiX3ZlcnNpb25udW07CS8qIGhlYWRlciB2ZXJzaW9uID09IFhGU19TQl9WRVJTSU9OICovCisJX191aW50MTZfdAlzYl9zZWN0c2l6ZTsJLyogdm9sdW1lIHNlY3RvciBzaXplLCBieXRlcyAqLworCV9fdWludDE2X3QJc2JfaW5vZGVzaXplOwkvKiBpbm9kZSBzaXplLCBieXRlcyAqLworCV9fdWludDE2X3QJc2JfaW5vcGJsb2NrOwkvKiBpbm9kZXMgcGVyIGJsb2NrICovCisJY2hhcgkJc2JfZm5hbWVbMTJdOwkvKiBmaWxlIHN5c3RlbSBuYW1lICovCisJX191aW50OF90CXNiX2Jsb2NrbG9nOwkvKiBsb2cyIG9mIHNiX2Jsb2Nrc2l6ZSAqLworCV9fdWludDhfdAlzYl9zZWN0bG9nOwkvKiBsb2cyIG9mIHNiX3NlY3RzaXplICovCisJX191aW50OF90CXNiX2lub2RlbG9nOwkvKiBsb2cyIG9mIHNiX2lub2Rlc2l6ZSAqLworCV9fdWludDhfdAlzYl9pbm9wYmxvZzsJLyogbG9nMiBvZiBzYl9pbm9wYmxvY2sgKi8KKwlfX3VpbnQ4X3QJc2JfYWdibGtsb2c7CS8qIGxvZzIgb2Ygc2JfYWdibG9ja3MgKHJvdW5kZWQgdXApICovCisJX191aW50OF90CXNiX3JleHRzbG9nOwkvKiBsb2cyIG9mIHNiX3JleHRlbnRzICovCisJX191aW50OF90CXNiX2lucHJvZ3Jlc3M7CS8qIG1rZnMgaXMgaW4gcHJvZ3Jlc3MsIGRvbid0IG1vdW50ICovCisJX191aW50OF90CXNiX2ltYXhfcGN0OwkvKiBtYXggJSBvZiBmcyBmb3IgaW5vZGUgc3BhY2UgKi8KKwkJCQkJLyogc3RhdGlzdGljcyAqLworCS8qCisJICogVGhlc2UgZmllbGRzIG11c3QgcmVtYWluIGNvbnRpZ3VvdXMuICBJZiB5b3UgcmVhbGx5CisJICogd2FudCB0byBjaGFuZ2UgdGhlaXIgbGF5b3V0LCBtYWtlIHN1cmUgeW91IGZpeCB0aGUKKwkgKiBjb2RlIGluIHhmc190cmFuc19hcHBseV9zYl9kZWx0YXMoKS4KKwkgKi8KKwlfX3VpbnQ2NF90CXNiX2ljb3VudDsJLyogYWxsb2NhdGVkIGlub2RlcyAqLworCV9fdWludDY0X3QJc2JfaWZyZWU7CS8qIGZyZWUgaW5vZGVzICovCisJX191aW50NjRfdAlzYl9mZGJsb2NrczsJLyogZnJlZSBkYXRhIGJsb2NrcyAqLworCV9fdWludDY0X3QJc2JfZnJleHRlbnRzOwkvKiBmcmVlIHJlYWx0aW1lIGV4dGVudHMgKi8KKwkvKgorCSAqIEVuZCBjb250aWd1b3VzIGZpZWxkcy4KKwkgKi8KKwl4ZnNfaW5vX3QJc2JfdXF1b3Rpbm87CS8qIHVzZXIgcXVvdGEgaW5vZGUgKi8KKwl4ZnNfaW5vX3QJc2JfZ3F1b3Rpbm87CS8qIGdyb3VwIHF1b3RhIGlub2RlICovCisJX191aW50MTZfdAlzYl9xZmxhZ3M7CS8qIHF1b3RhIGZsYWdzICovCisJX191aW50OF90CXNiX2ZsYWdzOwkvKiBtaXNjLiBmbGFncyAqLworCV9fdWludDhfdAlzYl9zaGFyZWRfdm47CS8qIHNoYXJlZCB2ZXJzaW9uIG51bWJlciAqLworCXhmc19leHRsZW5fdAlzYl9pbm9hbGlnbm10OwkvKiBpbm9kZSBjaHVuayBhbGlnbm1lbnQsIGZzYmxvY2tzICovCisJX191aW50MzJfdAlzYl91bml0OwkvKiBzdHJpcGUgb3IgcmFpZCB1bml0ICovCisJX191aW50MzJfdAlzYl93aWR0aDsJLyogc3RyaXBlIG9yIHJhaWQgd2lkdGggKi8KKwlfX3VpbnQ4X3QJc2JfZGlyYmxrbG9nOwkvKiBsb2cyIG9mIGRpciBibG9jayBzaXplIChmc2JzKSAqLworCV9fdWludDhfdAlzYl9sb2dzZWN0bG9nOwkvKiBsb2cyIG9mIHRoZSBsb2cgc2VjdG9yIHNpemUgKi8KKwlfX3VpbnQxNl90CXNiX2xvZ3NlY3RzaXplOwkvKiBzZWN0b3Igc2l6ZSBmb3IgdGhlIGxvZywgYnl0ZXMgKi8KKwlfX3VpbnQzMl90CXNiX2xvZ3N1bml0OwkvKiBzdHJpcGUgdW5pdCBzaXplIGZvciB0aGUgbG9nICovCisJX191aW50MzJfdAlzYl9mZWF0dXJlczI7CS8qIGFkZGl0b25hbCBmZWF0dXJlIGJpdHMgKi8KK30geGZzX3NiX3Q7CisKKy8qCisgKiBTZXF1ZW5jZSBudW1iZXIgdmFsdWVzIGZvciB0aGUgZmllbGRzLgorICovCit0eXBlZGVmIGVudW0geworCVhGU19TQlNfTUFHSUNOVU0sIFhGU19TQlNfQkxPQ0tTSVpFLCBYRlNfU0JTX0RCTE9DS1MsIFhGU19TQlNfUkJMT0NLUywKKwlYRlNfU0JTX1JFWFRFTlRTLCBYRlNfU0JTX1VVSUQsIFhGU19TQlNfTE9HU1RBUlQsIFhGU19TQlNfUk9PVElOTywKKwlYRlNfU0JTX1JCTUlOTywgWEZTX1NCU19SU1VNSU5PLCBYRlNfU0JTX1JFWFRTSVpFLCBYRlNfU0JTX0FHQkxPQ0tTLAorCVhGU19TQlNfQUdDT1VOVCwgWEZTX1NCU19SQk1CTE9DS1MsIFhGU19TQlNfTE9HQkxPQ0tTLAorCVhGU19TQlNfVkVSU0lPTk5VTSwgWEZTX1NCU19TRUNUU0laRSwgWEZTX1NCU19JTk9ERVNJWkUsCisJWEZTX1NCU19JTk9QQkxPQ0ssIFhGU19TQlNfRk5BTUUsIFhGU19TQlNfQkxPQ0tMT0csCisJWEZTX1NCU19TRUNUTE9HLCBYRlNfU0JTX0lOT0RFTE9HLCBYRlNfU0JTX0lOT1BCTE9HLCBYRlNfU0JTX0FHQkxLTE9HLAorCVhGU19TQlNfUkVYVFNMT0csIFhGU19TQlNfSU5QUk9HUkVTUywgWEZTX1NCU19JTUFYX1BDVCwgWEZTX1NCU19JQ09VTlQsCisJWEZTX1NCU19JRlJFRSwgWEZTX1NCU19GREJMT0NLUywgWEZTX1NCU19GUkVYVEVOVFMsIFhGU19TQlNfVVFVT1RJTk8sCisJWEZTX1NCU19HUVVPVElOTywgWEZTX1NCU19RRkxBR1MsIFhGU19TQlNfRkxBR1MsIFhGU19TQlNfU0hBUkVEX1ZOLAorCVhGU19TQlNfSU5PQUxJR05NVCwgWEZTX1NCU19VTklULCBYRlNfU0JTX1dJRFRILCBYRlNfU0JTX0RJUkJMS0xPRywKKwlYRlNfU0JTX0xPR1NFQ1RMT0csIFhGU19TQlNfTE9HU0VDVFNJWkUsIFhGU19TQlNfTE9HU1VOSVQsCisJWEZTX1NCU19GRUFUVVJFUzIsCisJWEZTX1NCU19GSUVMRENPVU5UCit9IHhmc19zYl9maWVsZF90OworCisvKgorICogTWFzayB2YWx1ZXMsIGRlZmluZWQgYmFzZWQgb24gdGhlIHhmc19zYl9maWVsZF90IHZhbHVlcy4KKyAqIE9ubHkgZGVmaW5lIHRoZSBvbmVzIHdlJ3JlIHVzaW5nLgorICovCisjZGVmaW5lCVhGU19TQl9NVkFMKHgpCQkoMUxMIDw8IFhGU19TQlNfICMjIHgpCisjZGVmaW5lCVhGU19TQl9VVUlECQlYRlNfU0JfTVZBTChVVUlEKQorI2RlZmluZQlYRlNfU0JfRk5BTUUJCVhGU19TQl9NVkFMKEZOQU1FKQorI2RlZmluZQlYRlNfU0JfUk9PVElOTwkJWEZTX1NCX01WQUwoUk9PVElOTykKKyNkZWZpbmUJWEZTX1NCX1JCTUlOTwkJWEZTX1NCX01WQUwoUkJNSU5PKQorI2RlZmluZQlYRlNfU0JfUlNVTUlOTwkJWEZTX1NCX01WQUwoUlNVTUlOTykKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05OVU0JWEZTX1NCX01WQUwoVkVSU0lPTk5VTSkKKyNkZWZpbmUgWEZTX1NCX1VRVU9USU5PCQlYRlNfU0JfTVZBTChVUVVPVElOTykKKyNkZWZpbmUgWEZTX1NCX0dRVU9USU5PCQlYRlNfU0JfTVZBTChHUVVPVElOTykKKyNkZWZpbmUgWEZTX1NCX1FGTEFHUwkJWEZTX1NCX01WQUwoUUZMQUdTKQorI2RlZmluZSBYRlNfU0JfU0hBUkVEX1ZOCVhGU19TQl9NVkFMKFNIQVJFRF9WTikKKyNkZWZpbmUgWEZTX1NCX1VOSVQJCVhGU19TQl9NVkFMKFVOSVQpCisjZGVmaW5lIFhGU19TQl9XSURUSAkJWEZTX1NCX01WQUwoV0lEVEgpCisjZGVmaW5lCVhGU19TQl9OVU1fQklUUwkJKChpbnQpWEZTX1NCU19GSUVMRENPVU5UKQorI2RlZmluZQlYRlNfU0JfQUxMX0JJVFMJCSgoMUxMIDw8IFhGU19TQl9OVU1fQklUUykgLSAxKQorI2RlZmluZQlYRlNfU0JfTU9EX0JJVFMJCVwKKwkoWEZTX1NCX1VVSUQgfCBYRlNfU0JfUk9PVElOTyB8IFhGU19TQl9SQk1JTk8gfCBYRlNfU0JfUlNVTUlOTyB8IFwKKwkgWEZTX1NCX1ZFUlNJT05OVU0gfCBYRlNfU0JfVVFVT1RJTk8gfCBYRlNfU0JfR1FVT1RJTk8gfCBcCisJIFhGU19TQl9RRkxBR1MgfCBYRlNfU0JfU0hBUkVEX1ZOIHwgWEZTX1NCX1VOSVQgfCBYRlNfU0JfV0lEVEgpCisKKy8qCisgKiBNaXNjLiBGbGFncyAtIHdhcm5pbmcgLSB0aGVzZSB3aWxsIGJlIGNsZWFyZWQgYnkgeGZzX3JlcGFpciB1bmxlc3MKKyAqIGEgZmVhdHVyZSBiaXQgaXMgc2V0IHdoZW4gdGhlIGZsYWcgaXMgdXNlZC4KKyAqLworI2RlZmluZSBYRlNfU0JGX05PRkxBR1MJCTB4MDAJLyogbm8gZmxhZ3Mgc2V0ICovCisjZGVmaW5lIFhGU19TQkZfUkVBRE9OTFkJMHgwMQkvKiBvbmx5IHJlYWQtb25seSBtb3VudHMgYWxsb3dlZCAqLworCisvKgorICogZGVmaW5lIG1heC4gc2hhcmVkIHZlcnNpb24gd2UgY2FuIGludGVyb3BlcmF0ZSB3aXRoCisgKi8KKyNkZWZpbmUgWEZTX1NCX01BWF9TSEFSRURfVk4JMAorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX05VTSkKK2ludCB4ZnNfc2JfdmVyc2lvbl9udW0oeGZzX3NiX3QgKnNicCk7CisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX05VTShzYnApCXhmc19zYl92ZXJzaW9uX251bShzYnApCisjZWxzZQorI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9OVU0oc2JwKQkoKHNicCktPnNiX3ZlcnNpb25udW0gJiBYRlNfU0JfVkVSU0lPTl9OVU1CSVRTKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX1NCX0dPT0RfVkVSU0lPTikKK2ludCB4ZnNfc2JfZ29vZF92ZXJzaW9uKHhmc19zYl90ICpzYnApOworI2RlZmluZQlYRlNfU0JfR09PRF9WRVJTSU9OKHNicCkJeGZzX3NiX2dvb2RfdmVyc2lvbihzYnApCisjZWxzZQorI2RlZmluZQlYRlNfU0JfR09PRF9WRVJTSU9OX0lOVChzYnApCVwKKwkoKCgoc2JwKS0+c2JfdmVyc2lvbm51bSA+PSBYRlNfU0JfVkVSU0lPTl8xKSAmJiBcCisJICAoKHNicCktPnNiX3ZlcnNpb25udW0gPD0gWEZTX1NCX1ZFUlNJT05fMykpIHx8IFwKKwkgICAoKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQpICYmIFwKKwkgICAgISgoKHNicCktPnNiX3ZlcnNpb25udW0gJiB+WEZTX1NCX1ZFUlNJT05fT0tSRUFMQklUUykgfHwgXAorCSAgICAgICgoKHNicCktPnNiX3ZlcnNpb25udW0gJiBYRlNfU0JfVkVSU0lPTl9NT1JFQklUU0JJVCkgJiYgXAorCSAgICAgICAoKHNicCktPnNiX2ZlYXR1cmVzMiAmIH5YRlNfU0JfVkVSU0lPTjJfT0tSRUFMQklUUykpKQorCisjaWZkZWYgX19LRVJORUxfXworI2RlZmluZQlYRlNfU0JfR09PRF9WRVJTSU9OKHNicCkJXAorCShYRlNfU0JfR09PRF9WRVJTSU9OX0lOVChzYnApICYmIFwKKwkgIChzYnApLT5zYl9zaGFyZWRfdm4gPD0gWEZTX1NCX01BWF9TSEFSRURfVk4pICkpCisjZWxzZQorLyoKKyAqIGV4dHJhIDIgcGFyZW4ncyBoZXJlICgoIHRvIHVuY29uZnVzZSBwYXJlbi1tYXRjaGluZyBlZGl0b3JzCisgKiBsaWtlIHZpIGJlY2F1c2UgWEZTX1NCX0dPT0RfVkVSU0lPTl9JTlQgaXMgYSBwYXJ0aWFsIGV4cHJlc3Npb24KKyAqIGFuZCB0aGUgdHdvIFhGU19TQl9HT09EX1ZFUlNJT04ncyBlYWNoIDIgbW9yZSBjbG9zZSBwYXJlbidzIHRvCisgKiBjb21wbGV0ZSB0aGUgZXhwcmVzc2lvbi4KKyAqLworI2RlZmluZSBYRlNfU0JfR09PRF9WRVJTSU9OKHNicCkJXAorCShYRlNfU0JfR09PRF9WRVJTSU9OX0lOVChzYnApICYmIFwKKwkgICghKChzYnApLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT05fU0hBUkVEQklUKSB8fCBcCisJICAgKHNicCktPnNiX3NoYXJlZF92biA8PSBYRlNfU0JfTUFYX1NIQVJFRF9WTikpICkpCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworI2VuZGlmCisKKyNkZWZpbmUJWEZTX1NCX0dPT0RfU0FTSF9WRVJTSU9OKHNicCkJXAorCSgoKChzYnApLT5zYl92ZXJzaW9ubnVtID49IFhGU19TQl9WRVJTSU9OXzEpICYmIFwKKwkgICgoc2JwKS0+c2JfdmVyc2lvbm51bSA8PSBYRlNfU0JfVkVSU0lPTl8zKSkgfHwgXAorCSAoKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQpICYmIFwKKwkgICEoKHNicCktPnNiX3ZlcnNpb25udW0gJiB+WEZTX1NCX1ZFUlNJT05fT0tTQVNIQklUUykpKQorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX1RPTkVXKQordW5zaWduZWQgeGZzX3NiX3ZlcnNpb25fdG9uZXcodW5zaWduZWQgdik7CisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX1RPTkVXKHYpCXhmc19zYl92ZXJzaW9uX3RvbmV3KHYpCisjZWxzZQorI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9UT05FVyh2KQlcCisJKCgoKHYpID09IFhGU19TQl9WRVJTSU9OXzEpID8gXAorCQkwIDogXAorCQkoKCh2KSA9PSBYRlNfU0JfVkVSU0lPTl8yKSA/IFwKKwkJCVhGU19TQl9WRVJTSU9OX0FUVFJCSVQgOiBcCisJCQkoWEZTX1NCX1ZFUlNJT05fQVRUUkJJVCB8IFhGU19TQl9WRVJTSU9OX05MSU5LQklUKSkpIHwgXAorCSBYRlNfU0JfVkVSU0lPTl80KQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX1NCX1ZFUlNJT05fVE9PTEQpCit1bnNpZ25lZCB4ZnNfc2JfdmVyc2lvbl90b29sZCh1bnNpZ25lZCB2KTsKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fVE9PTEQodikJeGZzX3NiX3ZlcnNpb25fdG9vbGQodikKKyNlbHNlCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX1RPT0xEKHYpCVwKKwkoKCh2KSAmIChYRlNfU0JfVkVSU0lPTl9RVU9UQUJJVCB8IFhGU19TQl9WRVJTSU9OX0FMSUdOQklUKSkgPyBcCisJCTAgOiBcCisJCSgoKHYpICYgWEZTX1NCX1ZFUlNJT05fTkxJTktCSVQpID8gXAorCQkJWEZTX1NCX1ZFUlNJT05fMyA6IFwKKwkJCSgoKHYpICYgWEZTX1NCX1ZFUlNJT05fQVRUUkJJVCkgPyAgXAorCQkJCVhGU19TQl9WRVJTSU9OXzIgOiBcCisJCQkJWEZTX1NCX1ZFUlNJT05fMSkpKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX1NCX1ZFUlNJT05fSEFTQVRUUikKK2ludCB4ZnNfc2JfdmVyc2lvbl9oYXNhdHRyKHhmc19zYl90ICpzYnApOworI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9IQVNBVFRSKHNicCkJeGZzX3NiX3ZlcnNpb25faGFzYXR0cihzYnApCisjZWxzZQorI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9IQVNBVFRSKHNicCkJXAorCSgoKHNicCktPnNiX3ZlcnNpb25udW0gPT0gWEZTX1NCX1ZFUlNJT05fMikgfHwgXAorCSAoKHNicCktPnNiX3ZlcnNpb25udW0gPT0gWEZTX1NCX1ZFUlNJT05fMykgfHwgXAorCSAoKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQpICYmIFwKKwkgICgoc2JwKS0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX0FUVFJCSVQpKSkKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX0FEREFUVFIpCit2b2lkIHhmc19zYl92ZXJzaW9uX2FkZGF0dHIoeGZzX3NiX3QgKnNicCk7CisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX0FEREFUVFIoc2JwKQl4ZnNfc2JfdmVyc2lvbl9hZGRhdHRyKHNicCkKKyNlbHNlCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX0FEREFUVFIoc2JwKQlcCisJKChzYnApLT5zYl92ZXJzaW9ubnVtID0gXAorCSAoKChzYnApLT5zYl92ZXJzaW9ubnVtID09IFhGU19TQl9WRVJTSU9OXzEpID8gXAorCQlYRlNfU0JfVkVSU0lPTl8yIDogXAorCQkoKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQpID8gXAorCQkJKChzYnApLT5zYl92ZXJzaW9ubnVtIHwgWEZTX1NCX1ZFUlNJT05fQVRUUkJJVCkgOiBcCisJCQkoWEZTX1NCX1ZFUlNJT05fNCB8IFhGU19TQl9WRVJTSU9OX0FUVFJCSVQpKSkpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNOTElOSykKK2ludCB4ZnNfc2JfdmVyc2lvbl9oYXNubGluayh4ZnNfc2JfdCAqc2JwKTsKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fSEFTTkxJTksoc2JwKQl4ZnNfc2JfdmVyc2lvbl9oYXNubGluayhzYnApCisjZWxzZQorI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9IQVNOTElOSyhzYnApCVwKKwkoKChzYnApLT5zYl92ZXJzaW9ubnVtID09IFhGU19TQl9WRVJTSU9OXzMpIHx8IFwKKwkgKChYRlNfU0JfVkVSU0lPTl9OVU0oc2JwKSA9PSBYRlNfU0JfVkVSU0lPTl80KSAmJiBcCisJICAoKHNicCktPnNiX3ZlcnNpb25udW0gJiBYRlNfU0JfVkVSU0lPTl9OTElOS0JJVCkpKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX1NCX1ZFUlNJT05fQURETkxJTkspCit2b2lkIHhmc19zYl92ZXJzaW9uX2FkZG5saW5rKHhmc19zYl90ICpzYnApOworI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9BREROTElOSyhzYnApCXhmc19zYl92ZXJzaW9uX2FkZG5saW5rKHNicCkKKyNlbHNlCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX0FERE5MSU5LKHNicCkJXAorCSgoc2JwKS0+c2JfdmVyc2lvbm51bSA9IFwKKwkgKChzYnApLT5zYl92ZXJzaW9ubnVtIDw9IFhGU19TQl9WRVJTSU9OXzIgPyBcCisJCVhGU19TQl9WRVJTSU9OXzMgOiBcCisJCSgoc2JwKS0+c2JfdmVyc2lvbm51bSB8IFhGU19TQl9WRVJTSU9OX05MSU5LQklUKSkpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNRVU9UQSkKK2ludCB4ZnNfc2JfdmVyc2lvbl9oYXNxdW90YSh4ZnNfc2JfdCAqc2JwKTsKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fSEFTUVVPVEEoc2JwKQl4ZnNfc2JfdmVyc2lvbl9oYXNxdW90YShzYnApCisjZWxzZQorI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9IQVNRVU9UQShzYnApCVwKKwkoKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQpICYmIFwKKwkgKChzYnApLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT05fUVVPVEFCSVQpKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX1NCX1ZFUlNJT05fQUREUVVPVEEpCit2b2lkIHhmc19zYl92ZXJzaW9uX2FkZHF1b3RhKHhmc19zYl90ICpzYnApOworI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9BRERRVU9UQShzYnApCXhmc19zYl92ZXJzaW9uX2FkZHF1b3RhKHNicCkKKyNlbHNlCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX0FERFFVT1RBKHNicCkJXAorCSgoc2JwKS0+c2JfdmVyc2lvbm51bSA9IFwKKwkgKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQgPyBcCisJCSgoc2JwKS0+c2JfdmVyc2lvbm51bSB8IFhGU19TQl9WRVJTSU9OX1FVT1RBQklUKSA6IFwKKwkJKFhGU19TQl9WRVJTSU9OX1RPTkVXKChzYnApLT5zYl92ZXJzaW9ubnVtKSB8IFwKKwkJIFhGU19TQl9WRVJTSU9OX1FVT1RBQklUKSkpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNBTElHTikKK2ludCB4ZnNfc2JfdmVyc2lvbl9oYXNhbGlnbih4ZnNfc2JfdCAqc2JwKTsKKyNkZWZpbmUJWEZTX1NCX1ZFUlNJT05fSEFTQUxJR04oc2JwKQl4ZnNfc2JfdmVyc2lvbl9oYXNhbGlnbihzYnApCisjZWxzZQorI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9IQVNBTElHTihzYnApCVwKKwkoKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQpICYmIFwKKwkgKChzYnApLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT05fQUxJR05CSVQpKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX1NCX1ZFUlNJT05fU1VCQUxJR04pCit2b2lkIHhmc19zYl92ZXJzaW9uX3N1YmFsaWduKHhmc19zYl90ICpzYnApOworI2RlZmluZQlYRlNfU0JfVkVSU0lPTl9TVUJBTElHTihzYnApCXhmc19zYl92ZXJzaW9uX3N1YmFsaWduKHNicCkKKyNlbHNlCisjZGVmaW5lCVhGU19TQl9WRVJTSU9OX1NVQkFMSUdOKHNicCkJXAorCSgoc2JwKS0+c2JfdmVyc2lvbm51bSA9IFwKKwkgWEZTX1NCX1ZFUlNJT05fVE9PTEQoKHNicCktPnNiX3ZlcnNpb25udW0gJiB+WEZTX1NCX1ZFUlNJT05fQUxJR05CSVQpKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX1NCX1ZFUlNJT05fSEFTREFMSUdOKQoraW50IHhmc19zYl92ZXJzaW9uX2hhc2RhbGlnbih4ZnNfc2JfdCAqc2JwKTsKKyNkZWZpbmUgWEZTX1NCX1ZFUlNJT05fSEFTREFMSUdOKHNicCkJeGZzX3NiX3ZlcnNpb25faGFzZGFsaWduKHNicCkKKyNlbHNlCisjZGVmaW5lIFhGU19TQl9WRVJTSU9OX0hBU0RBTElHTihzYnApCVwKKwkoKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQpICYmIFwKKwkgKChzYnApLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT05fREFMSUdOQklUKSkKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX0FERERBTElHTikKK2ludCB4ZnNfc2JfdmVyc2lvbl9hZGRkYWxpZ24oeGZzX3NiX3QgKnNicCk7CisjZGVmaW5lIFhGU19TQl9WRVJTSU9OX0FERERBTElHTihzYnApCXhmc19zYl92ZXJzaW9uX2FkZGRhbGlnbihzYnApCisjZWxzZQorI2RlZmluZSBYRlNfU0JfVkVSU0lPTl9BREREQUxJR04oc2JwKQlcCisJKChzYnApLT5zYl92ZXJzaW9ubnVtID0gXAorCQkoKHNicCktPnNiX3ZlcnNpb25udW0gfCBYRlNfU0JfVkVSU0lPTl9EQUxJR05CSVQpKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX1NCX1ZFUlNJT05fSEFTU0hBUkVEKQoraW50IHhmc19zYl92ZXJzaW9uX2hhc3NoYXJlZCh4ZnNfc2JfdCAqc2JwKTsKKyNkZWZpbmUgWEZTX1NCX1ZFUlNJT05fSEFTU0hBUkVEKHNicCkJeGZzX3NiX3ZlcnNpb25faGFzc2hhcmVkKHNicCkKKyNlbHNlCisjZGVmaW5lIFhGU19TQl9WRVJTSU9OX0hBU1NIQVJFRChzYnApCVwKKwkoKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQpICYmIFwKKwkgKChzYnApLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT05fU0hBUkVEQklUKSkKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX0FERFNIQVJFRCkKK2ludCB4ZnNfc2JfdmVyc2lvbl9hZGRzaGFyZWQoeGZzX3NiX3QgKnNicCk7CisjZGVmaW5lIFhGU19TQl9WRVJTSU9OX0FERFNIQVJFRChzYnApCXhmc19zYl92ZXJzaW9uX2FkZHNoYXJlZChzYnApCisjZWxzZQorI2RlZmluZSBYRlNfU0JfVkVSU0lPTl9BRERTSEFSRUQoc2JwKQlcCisJKChzYnApLT5zYl92ZXJzaW9ubnVtID0gXAorCQkoKHNicCktPnNiX3ZlcnNpb25udW0gfCBYRlNfU0JfVkVSU0lPTl9TSEFSRURCSVQpKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX1NCX1ZFUlNJT05fU1VCU0hBUkVEKQoraW50IHhmc19zYl92ZXJzaW9uX3N1YnNoYXJlZCh4ZnNfc2JfdCAqc2JwKTsKKyNkZWZpbmUgWEZTX1NCX1ZFUlNJT05fU1VCU0hBUkVEKHNicCkJeGZzX3NiX3ZlcnNpb25fc3Vic2hhcmVkKHNicCkKKyNlbHNlCisjZGVmaW5lIFhGU19TQl9WRVJTSU9OX1NVQlNIQVJFRChzYnApCVwKKwkoKHNicCktPnNiX3ZlcnNpb25udW0gPSBcCisJCSgoc2JwKS0+c2JfdmVyc2lvbm51bSAmIH5YRlNfU0JfVkVSU0lPTl9TSEFSRURCSVQpKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX1NCX1ZFUlNJT05fSEFTRElSVjIpCitpbnQgeGZzX3NiX3ZlcnNpb25faGFzZGlydjIoeGZzX3NiX3QgKnNicCk7CisjZGVmaW5lIFhGU19TQl9WRVJTSU9OX0hBU0RJUlYyKHNicCkJeGZzX3NiX3ZlcnNpb25faGFzZGlydjIoc2JwKQorI2Vsc2UKKyNkZWZpbmUgWEZTX1NCX1ZFUlNJT05fSEFTRElSVjIoc2JwKQlcCisJKChYRlNfU0JfVkVSU0lPTl9OVU0oc2JwKSA9PSBYRlNfU0JfVkVSU0lPTl80KSAmJiBcCisJICgoc2JwKS0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX0RJUlYyQklUKSkKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19TQl9WRVJTSU9OX0hBU0xPR1YyKQoraW50IHhmc19zYl92ZXJzaW9uX2hhc2xvZ3YyKHhmc19zYl90ICpzYnApOworI2RlZmluZSBYRlNfU0JfVkVSU0lPTl9IQVNMT0dWMihzYnApICAgeGZzX3NiX3ZlcnNpb25faGFzbG9ndjIoc2JwKQorI2Vsc2UKKyNkZWZpbmUgWEZTX1NCX1ZFUlNJT05fSEFTTE9HVjIoc2JwKSAgIFwKKwkoKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQpICYmIFwKKwkoKHNicCktPnNiX3ZlcnNpb25udW0gJiBYRlNfU0JfVkVSU0lPTl9MT0dWMkJJVCkpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNFWFRGTEdCSVQpCitpbnQgeGZzX3NiX3ZlcnNpb25faGFzZXh0ZmxnYml0KHhmc19zYl90ICpzYnApOworI2RlZmluZSBYRlNfU0JfVkVSU0lPTl9IQVNFWFRGTEdCSVQoc2JwKQl4ZnNfc2JfdmVyc2lvbl9oYXNleHRmbGdiaXQoc2JwKQorI2Vsc2UKKyNkZWZpbmUgWEZTX1NCX1ZFUlNJT05fSEFTRVhURkxHQklUKHNicCkJXAorCSgoWEZTX1NCX1ZFUlNJT05fTlVNKHNicCkgPT0gWEZTX1NCX1ZFUlNJT05fNCkgJiYgXAorCSAoKHNicCktPnNiX3ZlcnNpb25udW0gJiBYRlNfU0JfVkVSU0lPTl9FWFRGTEdCSVQpKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX1NCX1ZFUlNJT05fQURERVhURkxHQklUKQoraW50IHhmc19zYl92ZXJzaW9uX2FkZGV4dGZsZ2JpdCh4ZnNfc2JfdCAqc2JwKTsKKyNkZWZpbmUgWEZTX1NCX1ZFUlNJT05fQURERVhURkxHQklUKHNicCkJeGZzX3NiX3ZlcnNpb25fYWRkZXh0ZmxnYml0KHNicCkKKyNlbHNlCisjZGVmaW5lIFhGU19TQl9WRVJTSU9OX0FEREVYVEZMR0JJVChzYnApCVwKKwkoKHNicCktPnNiX3ZlcnNpb25udW0gPSBcCisJCSgoc2JwKS0+c2JfdmVyc2lvbm51bSB8IFhGU19TQl9WRVJTSU9OX0VYVEZMR0JJVCkpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9TVUJFWFRGTEdCSVQpCitpbnQgeGZzX3NiX3ZlcnNpb25fc3ViZXh0ZmxnYml0KHhmc19zYl90ICpzYnApOworI2RlZmluZSBYRlNfU0JfVkVSU0lPTl9TVUJFWFRGTEdCSVQoc2JwKQl4ZnNfc2JfdmVyc2lvbl9zdWJleHRmbGdiaXQoc2JwKQorI2Vsc2UKKyNkZWZpbmUgWEZTX1NCX1ZFUlNJT05fU1VCRVhURkxHQklUKHNicCkJXAorCSgoc2JwKS0+c2JfdmVyc2lvbm51bSA9IFwKKwkJKChzYnApLT5zYl92ZXJzaW9ubnVtICYgflhGU19TQl9WRVJTSU9OX0VYVEZMR0JJVCkpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfU0JfVkVSU0lPTl9IQVNTRUNUT1IpCitpbnQgeGZzX3NiX3ZlcnNpb25faGFzc2VjdG9yKHhmc19zYl90ICpzYnApOworI2RlZmluZSBYRlNfU0JfVkVSU0lPTl9IQVNTRUNUT1Ioc2JwKSAgIHhmc19zYl92ZXJzaW9uX2hhc3NlY3RvcihzYnApCisjZWxzZQorI2RlZmluZSBYRlNfU0JfVkVSU0lPTl9IQVNTRUNUT1Ioc2JwKSAgIFwKKwkoKFhGU19TQl9WRVJTSU9OX05VTShzYnApID09IFhGU19TQl9WRVJTSU9OXzQpICYmIFwKKwkoKHNicCktPnNiX3ZlcnNpb25udW0gJiBYRlNfU0JfVkVSU0lPTl9TRUNUT1JCSVQpKQorI2VuZGlmCisKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX1NCX1ZFUlNJT05fSEFTTU9SRUJJVFNCSVQpCitpbnQgeGZzX3NiX3ZlcnNpb25faGFzbW9yZWJpdHMoeGZzX3NiX3QgKnNicCk7CisjZGVmaW5lIFhGU19TQl9WRVJTSU9OX0hBU01PUkVCSVRTKHNicCkJeGZzX3NiX3ZlcnNpb25faGFzbW9yZWJpdHMoc2JwKQorI2Vsc2UKKyNkZWZpbmUgWEZTX1NCX1ZFUlNJT05fSEFTTU9SRUJJVFMoc2JwKQlcCisJKChYRlNfU0JfVkVSU0lPTl9OVU0oc2JwKSA9PSBYRlNfU0JfVkVSU0lPTl80KSAmJiBcCisJICgoc2JwKS0+c2JfdmVyc2lvbm51bSAmIFhGU19TQl9WRVJTSU9OX01PUkVCSVRTQklUKSkKKyNlbmRpZgorCisvKgorICogc2JfZmVhdHVyZXMyIGJpdCB2ZXJzaW9uIG1hY3Jvcy4KKyAqCisgKiBGb3IgZXhhbXBsZSwgZm9yIGEgYml0IGRlZmluZWQgYXMgWEZTX1NCX1ZFUlNJT04yX1lCSVQsIGhhcyBhIG1hY3JvOgorICoKKyAqIFNCX1ZFUlNJT05fSEFTWUJJVCh4ZnNfc2JfdCAqc2JwKQorICoJKChYRlNfU0JfVkVSU0lPTl9IQVNNT1JFQklUUyhzYnApICYmCisgKgkgKChzYnApLT5zYl92ZXJzaW9ubnVtICYgWEZTX1NCX1ZFUlNJT04yX1lCSVQpCisgKi8KKworLyoKKyAqIGVuZCBvZiBzdXBlcmJsb2NrIHZlcnNpb24gbWFjcm9zCisgKi8KKworI2RlZmluZSBYRlNfU0JfREFERFIJKCh4ZnNfZGFkZHJfdCkwKQkvKiBkYWRkciBpbiBmaWxlc3lzdGVtL2FnICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19TQl9CTE9DSykKK3hmc19hZ2Jsb2NrX3QgeGZzX3NiX2Jsb2NrKHN0cnVjdCB4ZnNfbW91bnQgKm1wKTsKKyNkZWZpbmUJWEZTX1NCX0JMT0NLKG1wKQl4ZnNfc2JfYmxvY2sobXApCisjZWxzZQorI2RlZmluZQlYRlNfU0JfQkxPQ0sobXApCVhGU19IRFJfQkxPQ0sobXAsIFhGU19TQl9EQUREUikKKyNlbmRpZgorCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19IRFJfQkxPQ0spCit4ZnNfYWdibG9ja190IHhmc19oZHJfYmxvY2soc3RydWN0IHhmc19tb3VudCAqbXAsIHhmc19kYWRkcl90IGQpOworI2RlZmluZQlYRlNfSERSX0JMT0NLKG1wLGQpCXhmc19oZHJfYmxvY2sobXAsZCkKKyNlbHNlCisjZGVmaW5lCVhGU19IRFJfQkxPQ0sobXAsZCkJKCh4ZnNfYWdibG9ja190KShYRlNfQkJfVE9fRlNCVChtcCxkKSkpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0RBRERSX1RPX0ZTQikKK3hmc19mc2Jsb2NrX3QgeGZzX2RhZGRyX3RvX2ZzYihzdHJ1Y3QgeGZzX21vdW50ICptcCwgeGZzX2RhZGRyX3QgZCk7CisjZGVmaW5lCVhGU19EQUREUl9UT19GU0IobXAsZCkJCXhmc19kYWRkcl90b19mc2IobXAsZCkKKyNlbHNlCisjZGVmaW5lCVhGU19EQUREUl9UT19GU0IobXAsZCkgXAorCVhGU19BR0JfVE9fRlNCKG1wLCBYRlNfREFERFJfVE9fQUdOTyhtcCxkKSwgWEZTX0RBRERSX1RPX0FHQk5PKG1wLGQpKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19GU0JfVE9fREFERFIpCit4ZnNfZGFkZHJfdCB4ZnNfZnNiX3RvX2RhZGRyKHN0cnVjdCB4ZnNfbW91bnQgKm1wLCB4ZnNfZnNibG9ja190IGZzYm5vKTsKKyNkZWZpbmUJWEZTX0ZTQl9UT19EQUREUihtcCxmc2JubykJeGZzX2ZzYl90b19kYWRkcihtcCxmc2JubykKKyNlbHNlCisjZGVmaW5lCVhGU19GU0JfVE9fREFERFIobXAsZnNibm8pIFwKKwlYRlNfQUdCX1RPX0RBRERSKG1wLCBYRlNfRlNCX1RPX0FHTk8obXAsZnNibm8pLCBcCisJCQkgWEZTX0ZTQl9UT19BR0JOTyhtcCxmc2JubykpCisjZW5kaWYKKworI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfQlVGX1RPX1NCUCkKK3hmc19zYl90ICp4ZnNfYnVmX3RvX3NicChzdHJ1Y3QgeGZzX2J1ZiAqYnApOworI2RlZmluZSBYRlNfQlVGX1RPX1NCUChicCkJeGZzX2J1Zl90b19zYnAoYnApCisjZWxzZQorI2RlZmluZSBYRlNfQlVGX1RPX1NCUChicCkJKCh4ZnNfc2JfdCAqKVhGU19CVUZfUFRSKGJwKSkKKyNlbmRpZgorCisvKgorICogRmlsZSBzeXN0ZW0gc2VjdG9yIHRvIGJhc2ljIGJsb2NrIGNvbnZlcnNpb25zLgorICovCisjZGVmaW5lIFhGU19GU1NfVE9fQkIobXAsc2VjKQkoKHNlYykgPDwgKG1wKS0+bV9zZWN0YmJfbG9nKQorI2RlZmluZSBYRlNfQkJfVE9fRlNTKG1wLGJiKQlcCisJKCgoYmIpICsgKFhGU19GU1NfVE9fQkIobXAsMSkgLSAxKSkgPj4gKG1wKS0+bV9zZWN0YmJfbG9nKQorI2RlZmluZSBYRlNfQkJfVE9fRlNTVChtcCxiYikJKChiYikgPj4gKG1wKS0+bV9zZWN0YmJfbG9nKQorCisvKgorICogRmlsZSBzeXN0ZW0gc2VjdG9yIHRvIGJ5dGUgY29udmVyc2lvbnMuCisgKi8KKyNkZWZpbmUgWEZTX0ZTU19UT19CKG1wLHNlY3RubykJKCh4ZnNfZnNpemVfdCkoc2VjdG5vKSA8PCAobXApLT5tX3NiLnNiX3NlY3Rsb2cpCisjZGVmaW5lIFhGU19CX1RPX0ZTU1QobXAsYikJKCgoX191aW50NjRfdCkoYikpID4+IChtcCktPm1fc2Iuc2Jfc2VjdGxvZykKKworLyoKKyAqIEZpbGUgc3lzdGVtIGJsb2NrIHRvIGJhc2ljIGJsb2NrIGNvbnZlcnNpb25zLgorICovCisjZGVmaW5lCVhGU19GU0JfVE9fQkIobXAsZnNibm8pCSgoZnNibm8pIDw8IChtcCktPm1fYmxrYmJfbG9nKQorI2RlZmluZQlYRlNfQkJfVE9fRlNCKG1wLGJiKQlcCisJKCgoYmIpICsgKFhGU19GU0JfVE9fQkIobXAsMSkgLSAxKSkgPj4gKG1wKS0+bV9ibGtiYl9sb2cpCisjZGVmaW5lCVhGU19CQl9UT19GU0JUKG1wLGJiKQkoKGJiKSA+PiAobXApLT5tX2Jsa2JiX2xvZykKKyNkZWZpbmUJWEZTX0JCX0ZTQl9PRkZTRVQobXAsYmIpICgoYmIpICYgKChtcCktPm1fYnNpemUgLSAxKSkKKworLyoKKyAqIEZpbGUgc3lzdGVtIGJsb2NrIHRvIGJ5dGUgY29udmVyc2lvbnMuCisgKi8KKyNkZWZpbmUgWEZTX0ZTQl9UT19CKG1wLGZzYm5vKQkoKHhmc19mc2l6ZV90KShmc2JubykgPDwgKG1wKS0+bV9zYi5zYl9ibG9ja2xvZykKKyNkZWZpbmUgWEZTX0JfVE9fRlNCKG1wLGIpCVwKKwkoKCgoX191aW50NjRfdCkoYikpICsgKG1wKS0+bV9ibG9ja21hc2spID4+IChtcCktPm1fc2Iuc2JfYmxvY2tsb2cpCisjZGVmaW5lIFhGU19CX1RPX0ZTQlQobXAsYikJKCgoX191aW50NjRfdCkoYikpID4+IChtcCktPm1fc2Iuc2JfYmxvY2tsb2cpCisjZGVmaW5lIFhGU19CX0ZTQl9PRkZTRVQobXAsYikJKChiKSAmIChtcCktPm1fYmxvY2ttYXNrKQorCisjZW5kaWYJLyogX19YRlNfU0JfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zLmMgYi9mcy94ZnMveGZzX3RyYW5zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RiMGUyMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfdHJhbnMuYwpAQCAtMCwwICsxLDEzMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKyNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2FnLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zX3ByaXYuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2FsbG9jLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlLmgiCisjaW5jbHVkZSAieGZzX2JtYXAuaCIKKyNpbmNsdWRlICJ4ZnNfZGFfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfcXVvdGEuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnNfc3BhY2UuaCIKKworCitTVEFUSUMgdm9pZAl4ZnNfdHJhbnNfYXBwbHlfc2JfZGVsdGFzKHhmc190cmFuc190ICopOworU1RBVElDIHVpbnQJeGZzX3RyYW5zX2NvdW50X3ZlY3MoeGZzX3RyYW5zX3QgKik7CitTVEFUSUMgdm9pZAl4ZnNfdHJhbnNfZmlsbF92ZWNzKHhmc190cmFuc190ICosIHhmc19sb2dfaW92ZWNfdCAqKTsKK1NUQVRJQyB2b2lkCXhmc190cmFuc191bmNvbW1pdCh4ZnNfdHJhbnNfdCAqLCB1aW50KTsKK1NUQVRJQyB2b2lkCXhmc190cmFuc19jb21taXR0ZWQoeGZzX3RyYW5zX3QgKiwgaW50KTsKK1NUQVRJQyB2b2lkCXhmc190cmFuc19jaHVua19jb21taXR0ZWQoeGZzX2xvZ19pdGVtX2NodW5rX3QgKiwgeGZzX2xzbl90LCBpbnQpOworU1RBVElDIHZvaWQJeGZzX3RyYW5zX2ZyZWUoeGZzX3RyYW5zX3QgKik7CisKK2ttZW1fem9uZV90CQkqeGZzX3RyYW5zX3pvbmU7CisKKworLyoKKyAqIEluaXRpYWxpemUgdGhlIHByZWNvbXB1dGVkIHRyYW5zYWN0aW9uIHJlc2VydmF0aW9uIHZhbHVlcworICogaW4gdGhlIG1vdW50IHN0cnVjdHVyZS4KKyAqLwordm9pZAoreGZzX3RyYW5zX2luaXQoCisJeGZzX21vdW50X3QJKm1wKQoreworCXhmc190cmFuc19yZXNlcnZhdGlvbnNfdAkqcmVzcDsKKworCXJlc3AgPSAmKG1wLT5tX3Jlc2VydmF0aW9ucyk7CisJcmVzcC0+dHJfd3JpdGUgPQorCQkodWludCkoWEZTX0NBTENfV1JJVEVfTE9HX1JFUyhtcCkgKyBYRlNfRFFVT1RfTE9HUkVTKG1wKSk7CisJcmVzcC0+dHJfaXRydW5jYXRlID0KKwkJKHVpbnQpKFhGU19DQUxDX0lUUlVOQ0FURV9MT0dfUkVTKG1wKSArIFhGU19EUVVPVF9MT0dSRVMobXApKTsKKwlyZXNwLT50cl9yZW5hbWUgPQorCQkodWludCkoWEZTX0NBTENfUkVOQU1FX0xPR19SRVMobXApICsgWEZTX0RRVU9UX0xPR1JFUyhtcCkpOworCXJlc3AtPnRyX2xpbmsgPSAodWludClYRlNfQ0FMQ19MSU5LX0xPR19SRVMobXApOworCXJlc3AtPnRyX3JlbW92ZSA9CisJCSh1aW50KShYRlNfQ0FMQ19SRU1PVkVfTE9HX1JFUyhtcCkgKyBYRlNfRFFVT1RfTE9HUkVTKG1wKSk7CisJcmVzcC0+dHJfc3ltbGluayA9CisJCSh1aW50KShYRlNfQ0FMQ19TWU1MSU5LX0xPR19SRVMobXApICsgWEZTX0RRVU9UX0xPR1JFUyhtcCkpOworCXJlc3AtPnRyX2NyZWF0ZSA9CisJCSh1aW50KShYRlNfQ0FMQ19DUkVBVEVfTE9HX1JFUyhtcCkgKyBYRlNfRFFVT1RfTE9HUkVTKG1wKSk7CisJcmVzcC0+dHJfbWtkaXIgPQorCQkodWludCkoWEZTX0NBTENfTUtESVJfTE9HX1JFUyhtcCkgKyBYRlNfRFFVT1RfTE9HUkVTKG1wKSk7CisJcmVzcC0+dHJfaWZyZWUgPQorCQkodWludCkoWEZTX0NBTENfSUZSRUVfTE9HX1JFUyhtcCkgKyBYRlNfRFFVT1RfTE9HUkVTKG1wKSk7CisJcmVzcC0+dHJfaWNoYW5nZSA9CisJCSh1aW50KShYRlNfQ0FMQ19JQ0hBTkdFX0xPR19SRVMobXApICsgWEZTX0RRVU9UX0xPR1JFUyhtcCkpOworCXJlc3AtPnRyX2dyb3dkYXRhID0gKHVpbnQpWEZTX0NBTENfR1JPV0RBVEFfTE9HX1JFUyhtcCk7CisJcmVzcC0+dHJfc3dyaXRlID0gKHVpbnQpWEZTX0NBTENfU1dSSVRFX0xPR19SRVMobXApOworCXJlc3AtPnRyX3dyaXRlaWQgPSAodWludClYRlNfQ0FMQ19XUklURUlEX0xPR19SRVMobXApOworCXJlc3AtPnRyX2FkZGFmb3JrID0KKwkJKHVpbnQpKFhGU19DQUxDX0FEREFGT1JLX0xPR19SRVMobXApICsgWEZTX0RRVU9UX0xPR1JFUyhtcCkpOworCXJlc3AtPnRyX2F0dHJpbnZhbCA9ICh1aW50KVhGU19DQUxDX0FUVFJJTlZBTF9MT0dfUkVTKG1wKTsKKwlyZXNwLT50cl9hdHRyc2V0ID0KKwkJKHVpbnQpKFhGU19DQUxDX0FUVFJTRVRfTE9HX1JFUyhtcCkgKyBYRlNfRFFVT1RfTE9HUkVTKG1wKSk7CisJcmVzcC0+dHJfYXR0cnJtID0KKwkJKHVpbnQpKFhGU19DQUxDX0FUVFJSTV9MT0dfUkVTKG1wKSArIFhGU19EUVVPVF9MT0dSRVMobXApKTsKKwlyZXNwLT50cl9jbGVhcmFnaSA9ICh1aW50KVhGU19DQUxDX0NMRUFSX0FHSV9CVUNLRVRfTE9HX1JFUyhtcCk7CisJcmVzcC0+dHJfZ3Jvd3J0YWxsb2MgPSAodWludClYRlNfQ0FMQ19HUk9XUlRBTExPQ19MT0dfUkVTKG1wKTsKKwlyZXNwLT50cl9ncm93cnR6ZXJvID0gKHVpbnQpWEZTX0NBTENfR1JPV1JUWkVST19MT0dfUkVTKG1wKTsKKwlyZXNwLT50cl9ncm93cnRmcmVlID0gKHVpbnQpWEZTX0NBTENfR1JPV1JURlJFRV9MT0dfUkVTKG1wKTsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gYWxsb2NhdGUgYSB0cmFuc2FjdGlvbiBzdHJ1Y3R1cmUuCisgKiBUaGUgdHlwZSBwYXJhbWV0ZXIgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIHRoZSB0cmFuc2FjdGlvbi4gIFRoZXNlCisgKiBhcmUgZW51bWVyYXRlZCBpbiB4ZnNfdHJhbnMuaC4KKyAqCisgKiBEeW5hbWljYWxseSBhbGxvY2F0ZSB0aGUgdHJhbnNhY3Rpb24gc3RydWN0dXJlIGZyb20gdGhlIHRyYW5zYWN0aW9uCisgKiB6b25lLCBpbml0aWFsaXplIGl0LCBhbmQgcmV0dXJuIGl0IHRvIHRoZSBjYWxsZXIuCisgKi8KK3hmc190cmFuc190ICoKK3hmc190cmFuc19hbGxvYygKKwl4ZnNfbW91bnRfdAkqbXAsCisJdWludAkJdHlwZSkKK3sKKwlmc19jaGVja19mcm96ZW4oWEZTX01UT1ZGUyhtcCksIFNCX0ZSRUVaRV9UUkFOUyk7CisJYXRvbWljX2luYygmbXAtPm1fYWN0aXZlX3RyYW5zKTsKKworCXJldHVybiAoX3hmc190cmFuc19hbGxvYyhtcCwgdHlwZSkpOworCit9CisKK3hmc190cmFuc190ICoKK194ZnNfdHJhbnNfYWxsb2MoCisJeGZzX21vdW50X3QJKm1wLAorCXVpbnQJCXR5cGUpCit7CisJeGZzX3RyYW5zX3QJKnRwOworCisJQVNTRVJUKHhmc190cmFuc196b25lICE9IE5VTEwpOworCXRwID0ga21lbV96b25lX3phbGxvYyh4ZnNfdHJhbnNfem9uZSwgS01fU0xFRVApOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSB0cmFuc2FjdGlvbiBzdHJ1Y3R1cmUuCisJICovCisJdHAtPnRfbWFnaWMgPSBYRlNfVFJBTlNfTUFHSUM7CisJdHAtPnRfdHlwZSA9IHR5cGU7CisJdHAtPnRfbW91bnRwID0gbXA7CisJdHAtPnRfaXRlbXNfZnJlZSA9IFhGU19MSUNfTlVNX1NMT1RTOworCXRwLT50X2J1c3lfZnJlZSA9IFhGU19MQkNfTlVNX1NMT1RTOworCVhGU19MSUNfSU5JVCgmKHRwLT50X2l0ZW1zKSk7CisJWEZTX0xCQ19JTklUKCYodHAtPnRfYnVzeSkpOworCisJcmV0dXJuICh0cCk7Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB0byBjcmVhdGUgYSBuZXcgdHJhbnNhY3Rpb24gd2hpY2ggd2lsbCBzaGFyZSB0aGUKKyAqIHBlcm1hbmVudCBsb2cgcmVzZXJ2YXRpb24gb2YgdGhlIGdpdmVuIHRyYW5zYWN0aW9uLiAgVGhlIHJlbWFpbmluZworICogdW51c2VkIGJsb2NrIGFuZCBydCBleHRlbnQgcmVzZXJ2YXRpb25zIGFyZSBhbHNvIGluaGVyaXRlZC4gIFRoaXMKKyAqIGltcGxpZXMgdGhhdCB0aGUgb3JpZ2luYWwgdHJhbnNhY3Rpb24gaXMgbm8gbG9uZ2VyIGFsbG93ZWQgdG8gYWxsb2NhdGUKKyAqIGJsb2Nrcy4gIExvY2tzIGFuZCBsb2cgaXRlbXMsIGhvd2V2ZXIsIGFyZSBubyBpbmhlcml0ZWQuICBUaGV5IG11c3QKKyAqIGJlIGFkZGVkIHRvIHRoZSBuZXcgdHJhbnNhY3Rpb24gZXhwbGljaXRseS4KKyAqLworeGZzX3RyYW5zX3QgKgoreGZzX3RyYW5zX2R1cCgKKwl4ZnNfdHJhbnNfdAkqdHApCit7CisJeGZzX3RyYW5zX3QJKm50cDsKKworCW50cCA9IGttZW1fem9uZV96YWxsb2MoeGZzX3RyYW5zX3pvbmUsIEtNX1NMRUVQKTsKKworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgbmV3IHRyYW5zYWN0aW9uIHN0cnVjdHVyZS4KKwkgKi8KKwludHAtPnRfbWFnaWMgPSBYRlNfVFJBTlNfTUFHSUM7CisJbnRwLT50X3R5cGUgPSB0cC0+dF90eXBlOworCW50cC0+dF9tb3VudHAgPSB0cC0+dF9tb3VudHA7CisJbnRwLT50X2l0ZW1zX2ZyZWUgPSBYRlNfTElDX05VTV9TTE9UUzsKKwludHAtPnRfYnVzeV9mcmVlID0gWEZTX0xCQ19OVU1fU0xPVFM7CisJWEZTX0xJQ19JTklUKCYobnRwLT50X2l0ZW1zKSk7CisJWEZTX0xCQ19JTklUKCYobnRwLT50X2J1c3kpKTsKKworCUFTU0VSVCh0cC0+dF9mbGFncyAmIFhGU19UUkFOU19QRVJNX0xPR19SRVMpOworCisjaWYgZGVmaW5lZChYTE9HX05PTE9HKSB8fCBkZWZpbmVkKERFQlVHKQorCUFTU0VSVCgheGxvZ19kZWJ1ZyB8fCB0cC0+dF90aWNrZXQgIT0gTlVMTCk7CisjZWxzZQorCUFTU0VSVCh0cC0+dF90aWNrZXQgIT0gTlVMTCk7CisjZW5kaWYKKwludHAtPnRfZmxhZ3MgPSBYRlNfVFJBTlNfUEVSTV9MT0dfUkVTIHwgKHRwLT50X2ZsYWdzICYgWEZTX1RSQU5TX1JFU0VSVkUpOworCW50cC0+dF90aWNrZXQgPSB0cC0+dF90aWNrZXQ7CisJbnRwLT50X2Jsa19yZXMgPSB0cC0+dF9ibGtfcmVzIC0gdHAtPnRfYmxrX3Jlc191c2VkOworCXRwLT50X2Jsa19yZXMgPSB0cC0+dF9ibGtfcmVzX3VzZWQ7CisJbnRwLT50X3J0eF9yZXMgPSB0cC0+dF9ydHhfcmVzIC0gdHAtPnRfcnR4X3Jlc191c2VkOworCXRwLT50X3J0eF9yZXMgPSB0cC0+dF9ydHhfcmVzX3VzZWQ7CisJUEZMQUdTX0RVUCgmdHAtPnRfcGZsYWdzLCAmbnRwLT50X3BmbGFncyk7CisKKwlYRlNfVFJBTlNfRFVQX0RRSU5GTyh0cC0+dF9tb3VudHAsIHRwLCBudHApOworCisJYXRvbWljX2luYygmdHAtPnRfbW91bnRwLT5tX2FjdGl2ZV90cmFucyk7CisJcmV0dXJuIG50cDsKK30KKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHRvIHJlc2VydmUgZnJlZSBkaXNrIGJsb2NrcyBhbmQgbG9nIHNwYWNlIGZvciB0aGUKKyAqIGdpdmVuIHRyYW5zYWN0aW9uLiAgVGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlIGFsbG9jYXRpbmcgYW55IHJlc291cmNlcworICogd2l0aGluIHRoZSB0cmFuc2FjdGlvbi4KKyAqCisgKiBUaGlzIHdpbGwgcmV0dXJuIEVOT1NQQyBpZiB0aGVyZSBhcmUgbm90IGVub3VnaCBibG9ja3MgYXZhaWxhYmxlLgorICogSXQgd2lsbCBzbGVlcCB3YWl0aW5nIGZvciBhdmFpbGFibGUgbG9nIHNwYWNlLgorICogVGhlIG9ubHkgdmFsaWQgdmFsdWUgZm9yIHRoZSBmbGFncyBwYXJhbWV0ZXIgaXMgWEZTX1JFU19MT0dfUEVSTSwgd2hpY2gKKyAqIGlzIHVzZWQgYnkgbG9uZyBydW5uaW5nIHRyYW5zYWN0aW9ucy4gIElmIGFueSBvbmUgb2YgdGhlIHJlc2VydmF0aW9ucworICogZmFpbHMgdGhlbiB0aGV5IHdpbGwgYWxsIGJlIGJhY2tlZCBvdXQuCisgKgorICogVGhpcyBkb2VzIG5vdCBkbyBxdW90YSByZXNlcnZhdGlvbnMuIFRoYXQgdHlwaWNhbGx5IGlzIGRvbmUgYnkgdGhlCisgKiBjYWxsZXIgYWZ0ZXJ3YXJkcy4KKyAqLworaW50Cit4ZnNfdHJhbnNfcmVzZXJ2ZSgKKwl4ZnNfdHJhbnNfdAkqdHAsCisJdWludAkJYmxvY2tzLAorCXVpbnQJCWxvZ3NwYWNlLAorCXVpbnQJCXJ0ZXh0ZW50cywKKwl1aW50CQlmbGFncywKKwl1aW50CQlsb2djb3VudCkKK3sKKwlpbnQJCWxvZ19mbGFnczsKKwlpbnQJCWVycm9yOworCWludAlyc3ZkOworCisJZXJyb3IgPSAwOworCXJzdmQgPSAodHAtPnRfZmxhZ3MgJiBYRlNfVFJBTlNfUkVTRVJWRSkgIT0gMDsKKworCS8qIE1hcmsgdGhpcyB0aHJlYWQgYXMgYmVpbmcgaW4gYSB0cmFuc2FjdGlvbiAqLworICAgICAgICBQRkxBR1NfU0VUX0ZTVFJBTlMoJnRwLT50X3BmbGFncyk7CisKKwkvKgorCSAqIEF0dGVtcHQgdG8gcmVzZXJ2ZSB0aGUgbmVlZGVkIGRpc2sgYmxvY2tzIGJ5IGRlY3JlbWVudGluZworCSAqIHRoZSBudW1iZXIgbmVlZGVkIGZyb20gdGhlIG51bWJlciBhdmFpbGFibGUuICBUaGlzIHdpbGwKKwkgKiBmYWlsIGlmIHRoZSBjb3VudCB3b3VsZCBnbyBiZWxvdyB6ZXJvLgorCSAqLworCWlmIChibG9ja3MgPiAwKSB7CisJCWVycm9yID0geGZzX21vZF9pbmNvcmVfc2IodHAtPnRfbW91bnRwLCBYRlNfU0JTX0ZEQkxPQ0tTLAorCQkJCQkgIC1ibG9ja3MsIHJzdmQpOworCQlpZiAoZXJyb3IgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgUEZMQUdTX1JFU1RPUkVfRlNUUkFOUygmdHAtPnRfcGZsYWdzKTsKKwkJCXJldHVybiAoWEZTX0VSUk9SKEVOT1NQQykpOworCQl9CisJCXRwLT50X2Jsa19yZXMgKz0gYmxvY2tzOworCX0KKworCS8qCisJICogUmVzZXJ2ZSB0aGUgbG9nIHNwYWNlIG5lZWRlZCBmb3IgdGhpcyB0cmFuc2FjdGlvbi4KKwkgKi8KKwlpZiAobG9nc3BhY2UgPiAwKSB7CisJCUFTU0VSVCgodHAtPnRfbG9nX3JlcyA9PSAwKSB8fCAodHAtPnRfbG9nX3JlcyA9PSBsb2dzcGFjZSkpOworCQlBU1NFUlQoKHRwLT50X2xvZ19jb3VudCA9PSAwKSB8fAorCQkJKHRwLT50X2xvZ19jb3VudCA9PSBsb2djb3VudCkpOworCQlpZiAoZmxhZ3MgJiBYRlNfVFJBTlNfUEVSTV9MT0dfUkVTKSB7CisJCQlsb2dfZmxhZ3MgPSBYRlNfTE9HX1BFUk1fUkVTRVJWOworCQkJdHAtPnRfZmxhZ3MgfD0gWEZTX1RSQU5TX1BFUk1fTE9HX1JFUzsKKwkJfSBlbHNlIHsKKwkJCUFTU0VSVCh0cC0+dF90aWNrZXQgPT0gTlVMTCk7CisJCQlBU1NFUlQoISh0cC0+dF9mbGFncyAmIFhGU19UUkFOU19QRVJNX0xPR19SRVMpKTsKKwkJCWxvZ19mbGFncyA9IDA7CisJCX0KKworCQllcnJvciA9IHhmc19sb2dfcmVzZXJ2ZSh0cC0+dF9tb3VudHAsIGxvZ3NwYWNlLCBsb2djb3VudCwKKwkJCQkJJnRwLT50X3RpY2tldCwKKwkJCQkJWEZTX1RSQU5TQUNUSU9OLCBsb2dfZmxhZ3MpOworCQlpZiAoZXJyb3IpIHsKKwkJCWdvdG8gdW5kb19ibG9ja3M7CisJCX0KKwkJdHAtPnRfbG9nX3JlcyA9IGxvZ3NwYWNlOworCQl0cC0+dF9sb2dfY291bnQgPSBsb2djb3VudDsKKwl9CisKKwkvKgorCSAqIEF0dGVtcHQgdG8gcmVzZXJ2ZSB0aGUgbmVlZGVkIHJlYWx0aW1lIGV4dGVudHMgYnkgZGVjcmVtZW50aW5nCisJICogdGhlIG51bWJlciBuZWVkZWQgZnJvbSB0aGUgbnVtYmVyIGF2YWlsYWJsZS4gIFRoaXMgd2lsbAorCSAqIGZhaWwgaWYgdGhlIGNvdW50IHdvdWxkIGdvIGJlbG93IHplcm8uCisJICovCisJaWYgKHJ0ZXh0ZW50cyA+IDApIHsKKwkJZXJyb3IgPSB4ZnNfbW9kX2luY29yZV9zYih0cC0+dF9tb3VudHAsIFhGU19TQlNfRlJFWFRFTlRTLAorCQkJCQkgIC1ydGV4dGVudHMsIHJzdmQpOworCQlpZiAoZXJyb3IpIHsKKwkJCWVycm9yID0gWEZTX0VSUk9SKEVOT1NQQyk7CisJCQlnb3RvIHVuZG9fbG9nOworCQl9CisJCXRwLT50X3J0eF9yZXMgKz0gcnRleHRlbnRzOworCX0KKworCXJldHVybiAwOworCisJLyoKKwkgKiBFcnJvciBjYXNlcyBqdW1wIHRvIG9uZSBvZiB0aGVzZSBsYWJlbHMgdG8gdW5kbyBhbnkKKwkgKiByZXNlcnZhdGlvbnMgd2hpY2ggaGF2ZSBhbHJlYWR5IGJlZW4gcGVyZm9ybWVkLgorCSAqLwordW5kb19sb2c6CisJaWYgKGxvZ3NwYWNlID4gMCkgeworCQlpZiAoZmxhZ3MgJiBYRlNfVFJBTlNfUEVSTV9MT0dfUkVTKSB7CisJCQlsb2dfZmxhZ3MgPSBYRlNfTE9HX1JFTF9QRVJNX1JFU0VSVjsKKwkJfSBlbHNlIHsKKwkJCWxvZ19mbGFncyA9IDA7CisJCX0KKwkJeGZzX2xvZ19kb25lKHRwLT50X21vdW50cCwgdHAtPnRfdGlja2V0LCBOVUxMLCBsb2dfZmxhZ3MpOworCQl0cC0+dF90aWNrZXQgPSBOVUxMOworCQl0cC0+dF9sb2dfcmVzID0gMDsKKwkJdHAtPnRfZmxhZ3MgJj0gflhGU19UUkFOU19QRVJNX0xPR19SRVM7CisJfQorCit1bmRvX2Jsb2NrczoKKwlpZiAoYmxvY2tzID4gMCkgeworCQkodm9pZCkgeGZzX21vZF9pbmNvcmVfc2IodHAtPnRfbW91bnRwLCBYRlNfU0JTX0ZEQkxPQ0tTLAorCQkJCQkgYmxvY2tzLCByc3ZkKTsKKwkJdHAtPnRfYmxrX3JlcyA9IDA7CisJfQorCisgICAgICAgIFBGTEFHU19SRVNUT1JFX0ZTVFJBTlMoJnRwLT50X3BmbGFncyk7CisKKwlyZXR1cm4gKGVycm9yKTsKK30KKworCisvKgorICogVGhpcyBpcyBjYWxsZWQgdG8gc2V0IHRoZSBhIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBnaXZlbgorICogdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkIHRvIGRpc2suICBUaGUgdHJhbnNhY3Rpb24gcG9pbnRlciBhbmQgdGhlCisgKiBhcmd1bWVudCBwb2ludGVyIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayByb3V0aW5lLgorICoKKyAqIE9ubHkgb25lIGNhbGxiYWNrIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggYW55IHNpbmdsZSB0cmFuc2FjdGlvbi4KKyAqLwordm9pZAoreGZzX3RyYW5zX2NhbGxiYWNrKAorCXhmc190cmFuc190CQkqdHAsCisJeGZzX3RyYW5zX2NhbGxiYWNrX3QJY2FsbGJhY2ssCisJdm9pZAkJCSphcmcpCit7CisJQVNTRVJUKHRwLT50X2NhbGxiYWNrID09IE5VTEwpOworCXRwLT50X2NhbGxiYWNrID0gY2FsbGJhY2s7CisJdHAtPnRfY2FsbGFyZyA9IGFyZzsKK30KKworCisvKgorICogUmVjb3JkIHRoZSBpbmRpY2F0ZWQgY2hhbmdlIHRvIHRoZSBnaXZlbiBmaWVsZCBmb3IgYXBwbGljYXRpb24KKyAqIHRvIHRoZSBmaWxlIHN5c3RlbSdzIHN1cGVyYmxvY2sgd2hlbiB0aGUgdHJhbnNhY3Rpb24gY29tbWl0cy4KKyAqIEZvciBub3csIGp1c3Qgc3RvcmUgdGhlIGNoYW5nZSBpbiB0aGUgdHJhbnNhY3Rpb24gc3RydWN0dXJlLgorICoKKyAqIE1hcmsgdGhlIHRyYW5zYWN0aW9uIHN0cnVjdHVyZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBzdXBlcmJsb2NrCisgKiBuZWVkcyB0byBiZSB1cGRhdGVkIGJlZm9yZSBjb21taXR0aW5nLgorICovCit2b2lkCit4ZnNfdHJhbnNfbW9kX3NiKAorCXhmc190cmFuc190CSp0cCwKKwl1aW50CQlmaWVsZCwKKwlsb25nCQlkZWx0YSkKK3sKKworCXN3aXRjaCAoZmllbGQpIHsKKwljYXNlIFhGU19UUkFOU19TQl9JQ09VTlQ6CisJCXRwLT50X2ljb3VudF9kZWx0YSArPSBkZWx0YTsKKwkJYnJlYWs7CisJY2FzZSBYRlNfVFJBTlNfU0JfSUZSRUU6CisJCXRwLT50X2lmcmVlX2RlbHRhICs9IGRlbHRhOworCQlicmVhazsKKwljYXNlIFhGU19UUkFOU19TQl9GREJMT0NLUzoKKwkJLyoKKwkJICogVHJhY2sgdGhlIG51bWJlciBvZiBibG9ja3MgYWxsb2NhdGVkIGluIHRoZQorCQkgKiB0cmFuc2FjdGlvbi4gIE1ha2Ugc3VyZSBpdCBkb2VzIG5vdCBleGNlZWQgdGhlCisJCSAqIG51bWJlciByZXNlcnZlZC4KKwkJICovCisJCWlmIChkZWx0YSA8IDApIHsKKwkJCXRwLT50X2Jsa19yZXNfdXNlZCArPSAodWludCktZGVsdGE7CisJCQlBU1NFUlQodHAtPnRfYmxrX3Jlc191c2VkIDw9IHRwLT50X2Jsa19yZXMpOworCQl9CisJCXRwLT50X2ZkYmxvY2tzX2RlbHRhICs9IGRlbHRhOworCQlicmVhazsKKwljYXNlIFhGU19UUkFOU19TQl9SRVNfRkRCTE9DS1M6CisJCS8qCisJCSAqIFRoZSBhbGxvY2F0aW9uIGhhcyBhbHJlYWR5IGJlZW4gYXBwbGllZCB0byB0aGUKKwkJICogaW4tY29yZSBzdXBlcmJsb2NrJ3MgY291bnRlci4gIFRoaXMgc2hvdWxkIG9ubHkKKwkJICogYmUgYXBwbGllZCB0byB0aGUgb24tZGlzayBzdXBlcmJsb2NrLgorCQkgKi8KKwkJQVNTRVJUKGRlbHRhIDwgMCk7CisJCXRwLT50X3Jlc19mZGJsb2Nrc19kZWx0YSArPSBkZWx0YTsKKwkJYnJlYWs7CisJY2FzZSBYRlNfVFJBTlNfU0JfRlJFWFRFTlRTOgorCQkvKgorCQkgKiBUcmFjayB0aGUgbnVtYmVyIG9mIGJsb2NrcyBhbGxvY2F0ZWQgaW4gdGhlCisJCSAqIHRyYW5zYWN0aW9uLiAgTWFrZSBzdXJlIGl0IGRvZXMgbm90IGV4Y2VlZCB0aGUKKwkJICogbnVtYmVyIHJlc2VydmVkLgorCQkgKi8KKwkJaWYgKGRlbHRhIDwgMCkgeworCQkJdHAtPnRfcnR4X3Jlc191c2VkICs9ICh1aW50KS1kZWx0YTsKKwkJCUFTU0VSVCh0cC0+dF9ydHhfcmVzX3VzZWQgPD0gdHAtPnRfcnR4X3Jlcyk7CisJCX0KKwkJdHAtPnRfZnJleHRlbnRzX2RlbHRhICs9IGRlbHRhOworCQlicmVhazsKKwljYXNlIFhGU19UUkFOU19TQl9SRVNfRlJFWFRFTlRTOgorCQkvKgorCQkgKiBUaGUgYWxsb2NhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGFwcGxpZWQgdG8gdGhlCisJCSAqIGluLWNvcmUgc3VwZXJibG9ja3MncyBjb3VudGVyLiAgVGhpcyBzaG91bGQgb25seQorCQkgKiBiZSBhcHBsaWVkIHRvIHRoZSBvbi1kaXNrIHN1cGVyYmxvY2suCisJCSAqLworCQlBU1NFUlQoZGVsdGEgPCAwKTsKKwkJdHAtPnRfcmVzX2ZyZXh0ZW50c19kZWx0YSArPSBkZWx0YTsKKwkJYnJlYWs7CisJY2FzZSBYRlNfVFJBTlNfU0JfREJMT0NLUzoKKwkJQVNTRVJUKGRlbHRhID4gMCk7CisJCXRwLT50X2RibG9ja3NfZGVsdGEgKz0gZGVsdGE7CisJCWJyZWFrOworCWNhc2UgWEZTX1RSQU5TX1NCX0FHQ09VTlQ6CisJCUFTU0VSVChkZWx0YSA+IDApOworCQl0cC0+dF9hZ2NvdW50X2RlbHRhICs9IGRlbHRhOworCQlicmVhazsKKwljYXNlIFhGU19UUkFOU19TQl9JTUFYUENUOgorCQl0cC0+dF9pbWF4cGN0X2RlbHRhICs9IGRlbHRhOworCQlicmVhazsKKwljYXNlIFhGU19UUkFOU19TQl9SRVhUU0laRToKKwkJdHAtPnRfcmV4dHNpemVfZGVsdGEgKz0gZGVsdGE7CisJCWJyZWFrOworCWNhc2UgWEZTX1RSQU5TX1NCX1JCTUJMT0NLUzoKKwkJdHAtPnRfcmJtYmxvY2tzX2RlbHRhICs9IGRlbHRhOworCQlicmVhazsKKwljYXNlIFhGU19UUkFOU19TQl9SQkxPQ0tTOgorCQl0cC0+dF9yYmxvY2tzX2RlbHRhICs9IGRlbHRhOworCQlicmVhazsKKwljYXNlIFhGU19UUkFOU19TQl9SRVhURU5UUzoKKwkJdHAtPnRfcmV4dGVudHNfZGVsdGEgKz0gZGVsdGE7CisJCWJyZWFrOworCWNhc2UgWEZTX1RSQU5TX1NCX1JFWFRTTE9HOgorCQl0cC0+dF9yZXh0c2xvZ19kZWx0YSArPSBkZWx0YTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQVNTRVJUKDApOworCQlyZXR1cm47CisJfQorCisJdHAtPnRfZmxhZ3MgfD0gKFhGU19UUkFOU19TQl9ESVJUWSB8IFhGU19UUkFOU19ESVJUWSk7Cit9CisKKy8qCisgKiB4ZnNfdHJhbnNfYXBwbHlfc2JfZGVsdGFzKCkgaXMgY2FsbGVkIGZyb20gdGhlIGNvbW1pdCBjb2RlCisgKiB0byBicmluZyB0aGUgc3VwZXJibG9jayBidWZmZXIgaW50byB0aGUgY3VycmVudCB0cmFuc2FjdGlvbgorICogYW5kIG1vZGlmeSBpdCBhcyByZXF1ZXN0ZWQgYnkgZWFybGllciBjYWxscyB0byB4ZnNfdHJhbnNfbW9kX3NiKCkuCisgKgorICogRm9yIG5vdyB3ZSBqdXN0IGxvb2sgYXQgZWFjaCBmaWVsZCBhbGxvd2VkIHRvIGNoYW5nZSBhbmQgY2hhbmdlCisgKiBpdCBpZiBuZWNlc3NhcnkuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfdHJhbnNfYXBwbHlfc2JfZGVsdGFzKAorCXhmc190cmFuc190CSp0cCkKK3sKKwl4ZnNfc2JfdAkqc2JwOworCXhmc19idWZfdAkqYnA7CisJaW50CQl3aG9sZSA9IDA7CisKKwlicCA9IHhmc190cmFuc19nZXRzYih0cCwgdHAtPnRfbW91bnRwLCAwKTsKKwlzYnAgPSBYRlNfQlVGX1RPX1NCUChicCk7CisKKwkvKgorCSAqIENoZWNrIHRoYXQgc3VwZXJibG9jayBtb2RzIG1hdGNoIHRoZSBtb2RzIG1hZGUgdG8gQUdGIGNvdW50ZXJzLgorCSAqLworCUFTU0VSVCgodHAtPnRfZmRibG9ja3NfZGVsdGEgKyB0cC0+dF9yZXNfZmRibG9ja3NfZGVsdGEpID09CisJICAgICAgICh0cC0+dF9hZ19mcmVlYmxrc19kZWx0YSArIHRwLT50X2FnX2ZsaXN0X2RlbHRhICsKKwkJdHAtPnRfYWdfYnRyZWVfZGVsdGEpKTsKKworCWlmICh0cC0+dF9pY291bnRfZGVsdGEgIT0gMCkgeworCQlJTlRfTU9EKHNicC0+c2JfaWNvdW50LCBBUkNIX0NPTlZFUlQsIHRwLT50X2ljb3VudF9kZWx0YSk7CisJfQorCWlmICh0cC0+dF9pZnJlZV9kZWx0YSAhPSAwKSB7CisJCUlOVF9NT0Qoc2JwLT5zYl9pZnJlZSwgQVJDSF9DT05WRVJULCB0cC0+dF9pZnJlZV9kZWx0YSk7CisJfQorCisJaWYgKHRwLT50X2ZkYmxvY2tzX2RlbHRhICE9IDApIHsKKwkJSU5UX01PRChzYnAtPnNiX2ZkYmxvY2tzLCBBUkNIX0NPTlZFUlQsIHRwLT50X2ZkYmxvY2tzX2RlbHRhKTsKKwl9CisJaWYgKHRwLT50X3Jlc19mZGJsb2Nrc19kZWx0YSAhPSAwKSB7CisJCUlOVF9NT0Qoc2JwLT5zYl9mZGJsb2NrcywgQVJDSF9DT05WRVJULCB0cC0+dF9yZXNfZmRibG9ja3NfZGVsdGEpOworCX0KKworCWlmICh0cC0+dF9mcmV4dGVudHNfZGVsdGEgIT0gMCkgeworCQlJTlRfTU9EKHNicC0+c2JfZnJleHRlbnRzLCBBUkNIX0NPTlZFUlQsIHRwLT50X2ZyZXh0ZW50c19kZWx0YSk7CisJfQorCWlmICh0cC0+dF9yZXNfZnJleHRlbnRzX2RlbHRhICE9IDApIHsKKwkJSU5UX01PRChzYnAtPnNiX2ZyZXh0ZW50cywgQVJDSF9DT05WRVJULCB0cC0+dF9yZXNfZnJleHRlbnRzX2RlbHRhKTsKKwl9CisJaWYgKHRwLT50X2RibG9ja3NfZGVsdGEgIT0gMCkgeworCQlJTlRfTU9EKHNicC0+c2JfZGJsb2NrcywgQVJDSF9DT05WRVJULCB0cC0+dF9kYmxvY2tzX2RlbHRhKTsKKwkJd2hvbGUgPSAxOworCX0KKwlpZiAodHAtPnRfYWdjb3VudF9kZWx0YSAhPSAwKSB7CisJCUlOVF9NT0Qoc2JwLT5zYl9hZ2NvdW50LCBBUkNIX0NPTlZFUlQsIHRwLT50X2FnY291bnRfZGVsdGEpOworCQl3aG9sZSA9IDE7CisJfQorCWlmICh0cC0+dF9pbWF4cGN0X2RlbHRhICE9IDApIHsKKwkJSU5UX01PRChzYnAtPnNiX2ltYXhfcGN0LCBBUkNIX0NPTlZFUlQsIHRwLT50X2ltYXhwY3RfZGVsdGEpOworCQl3aG9sZSA9IDE7CisJfQorCWlmICh0cC0+dF9yZXh0c2l6ZV9kZWx0YSAhPSAwKSB7CisJCUlOVF9NT0Qoc2JwLT5zYl9yZXh0c2l6ZSwgQVJDSF9DT05WRVJULCB0cC0+dF9yZXh0c2l6ZV9kZWx0YSk7CisJCXdob2xlID0gMTsKKwl9CisJaWYgKHRwLT50X3JibWJsb2Nrc19kZWx0YSAhPSAwKSB7CisJCUlOVF9NT0Qoc2JwLT5zYl9yYm1ibG9ja3MsIEFSQ0hfQ09OVkVSVCwgdHAtPnRfcmJtYmxvY2tzX2RlbHRhKTsKKwkJd2hvbGUgPSAxOworCX0KKwlpZiAodHAtPnRfcmJsb2Nrc19kZWx0YSAhPSAwKSB7CisJCUlOVF9NT0Qoc2JwLT5zYl9yYmxvY2tzLCBBUkNIX0NPTlZFUlQsIHRwLT50X3JibG9ja3NfZGVsdGEpOworCQl3aG9sZSA9IDE7CisJfQorCWlmICh0cC0+dF9yZXh0ZW50c19kZWx0YSAhPSAwKSB7CisJCUlOVF9NT0Qoc2JwLT5zYl9yZXh0ZW50cywgQVJDSF9DT05WRVJULCB0cC0+dF9yZXh0ZW50c19kZWx0YSk7CisJCXdob2xlID0gMTsKKwl9CisJaWYgKHRwLT50X3JleHRzbG9nX2RlbHRhICE9IDApIHsKKwkJSU5UX01PRChzYnAtPnNiX3JleHRzbG9nLCBBUkNIX0NPTlZFUlQsIHRwLT50X3JleHRzbG9nX2RlbHRhKTsKKwkJd2hvbGUgPSAxOworCX0KKworCWlmICh3aG9sZSkKKwkJLyoKKwkJICogTG9nIHRoZSB3aG9sZSB0aGluZywgdGhlIGZpZWxkcyBhcmUgZGlzY29udGlndW91cy4KKwkJICovCisJCXhmc190cmFuc19sb2dfYnVmKHRwLCBicCwgMCwgc2l6ZW9mKHhmc19zYl90KSAtIDEpOworCWVsc2UKKwkJLyoKKwkJICogU2luY2UgYWxsIHRoZSBtb2RpZmlhYmxlIGZpZWxkcyBhcmUgY29udGlndW91cywgd2UKKwkJICogY2FuIGdldCBhd2F5IHdpdGggdGhpcy4KKwkJICovCisJCXhmc190cmFuc19sb2dfYnVmKHRwLCBicCwgb2Zmc2V0b2YoeGZzX3NiX3QsIHNiX2ljb3VudCksCisJCQkJICBvZmZzZXRvZih4ZnNfc2JfdCwgc2JfZnJleHRlbnRzKSArCisJCQkJICBzaXplb2Yoc2JwLT5zYl9mcmV4dGVudHMpIC0gMSk7CisKKwlYRlNfTVRPVkZTKHRwLT50X21vdW50cCktPnZmc19zdXBlci0+c19kaXJ0ID0gMTsKK30KKworLyoKKyAqIHhmc190cmFuc191bnJlc2VydmVfYW5kX21vZF9zYigpIGlzIGNhbGxlZCB0byByZWxlYXNlIHVudXNlZAorICogcmVzZXJ2YXRpb25zIGFuZCBhcHBseSBzdXBlcmJsb2NrIGNvdW50ZXIgY2hhbmdlcyB0byB0aGUgaW4tY29yZQorICogc3VwZXJibG9jay4KKyAqCisgKiBUaGlzIGlzIGRvbmUgZWZmaWNpZW50bHkgd2l0aCBhIHNpbmdsZSBjYWxsIHRvIHhmc19tb2RfaW5jb3JlX3NiX2JhdGNoKCkuCisgKi8KK3ZvaWQKK3hmc190cmFuc191bnJlc2VydmVfYW5kX21vZF9zYigKKwl4ZnNfdHJhbnNfdAkqdHApCit7CisJeGZzX21vZF9zYl90CW1zYlsxNF07CS8qIElmIHlvdSBhZGQgY2FzZXMsIGFkZCBlbnRyaWVzICovCisJeGZzX21vZF9zYl90CSptc2JwOworCS8qIFJFRkVSRU5DRUQgKi8KKwlpbnQJCWVycm9yOworCWludAkJcnN2ZDsKKworCW1zYnAgPSBtc2I7CisJcnN2ZCA9ICh0cC0+dF9mbGFncyAmIFhGU19UUkFOU19SRVNFUlZFKSAhPSAwOworCisJLyoKKwkgKiBSZWxlYXNlIGFueSByZXNlcnZlZCBibG9ja3MuICBBbnkgdGhhdCB3ZXJlIGFsbG9jYXRlZAorCSAqIHdpbGwgYmUgdGFrZW4gYmFjayBhZ2FpbiBieSBmZGJsb2Nrc19kZWx0YSBiZWxvdy4KKwkgKi8KKwlpZiAodHAtPnRfYmxrX3JlcyA+IDApIHsKKwkJbXNicC0+bXNiX2ZpZWxkID0gWEZTX1NCU19GREJMT0NLUzsKKwkJbXNicC0+bXNiX2RlbHRhID0gdHAtPnRfYmxrX3JlczsKKwkJbXNicCsrOworCX0KKworCS8qCisJICogUmVsZWFzZSBhbnkgcmVzZXJ2ZWQgcmVhbCB0aW1lIGV4dGVudHMgLiAgQW55IHRoYXQgd2VyZQorCSAqIGFsbG9jYXRlZCB3aWxsIGJlIHRha2VuIGJhY2sgYWdhaW4gYnkgZnJleHRlbnRzX2RlbHRhIGJlbG93LgorCSAqLworCWlmICh0cC0+dF9ydHhfcmVzID4gMCkgeworCQltc2JwLT5tc2JfZmllbGQgPSBYRlNfU0JTX0ZSRVhURU5UUzsKKwkJbXNicC0+bXNiX2RlbHRhID0gdHAtPnRfcnR4X3JlczsKKwkJbXNicCsrOworCX0KKworCS8qCisJICogQXBwbHkgYW55IHN1cGVyYmxvY2sgbW9kaWZpY2F0aW9ucyB0byB0aGUgaW4tY29yZSB2ZXJzaW9uLgorCSAqIFRoZSB0X3Jlc19mZGJsb2Nrc19kZWx0YSBhbmQgdF9yZXNfZnJleHRlbnRzX2RlbHRhIGZpZWxkcyBhcmUKKwkgKiBleHBsaWNpdHkgTk9UIGFwcGxpZWQgdG8gdGhlIGluLWNvcmUgc3VwZXJibG9jay4KKwkgKiBUaGUgaWRlYSBpcyB0aGF0IHRoYXQgaGFzIGFscmVhZHkgYmVlbiBkb25lLgorCSAqLworCWlmICh0cC0+dF9mbGFncyAmIFhGU19UUkFOU19TQl9ESVJUWSkgeworCQlpZiAodHAtPnRfaWNvdW50X2RlbHRhICE9IDApIHsKKwkJCW1zYnAtPm1zYl9maWVsZCA9IFhGU19TQlNfSUNPVU5UOworCQkJbXNicC0+bXNiX2RlbHRhID0gKGludCl0cC0+dF9pY291bnRfZGVsdGE7CisJCQltc2JwKys7CisJCX0KKwkJaWYgKHRwLT50X2lmcmVlX2RlbHRhICE9IDApIHsKKwkJCW1zYnAtPm1zYl9maWVsZCA9IFhGU19TQlNfSUZSRUU7CisJCQltc2JwLT5tc2JfZGVsdGEgPSAoaW50KXRwLT50X2lmcmVlX2RlbHRhOworCQkJbXNicCsrOworCQl9CisJCWlmICh0cC0+dF9mZGJsb2Nrc19kZWx0YSAhPSAwKSB7CisJCQltc2JwLT5tc2JfZmllbGQgPSBYRlNfU0JTX0ZEQkxPQ0tTOworCQkJbXNicC0+bXNiX2RlbHRhID0gKGludCl0cC0+dF9mZGJsb2Nrc19kZWx0YTsKKwkJCW1zYnArKzsKKwkJfQorCQlpZiAodHAtPnRfZnJleHRlbnRzX2RlbHRhICE9IDApIHsKKwkJCW1zYnAtPm1zYl9maWVsZCA9IFhGU19TQlNfRlJFWFRFTlRTOworCQkJbXNicC0+bXNiX2RlbHRhID0gKGludCl0cC0+dF9mcmV4dGVudHNfZGVsdGE7CisJCQltc2JwKys7CisJCX0KKwkJaWYgKHRwLT50X2RibG9ja3NfZGVsdGEgIT0gMCkgeworCQkJbXNicC0+bXNiX2ZpZWxkID0gWEZTX1NCU19EQkxPQ0tTOworCQkJbXNicC0+bXNiX2RlbHRhID0gKGludCl0cC0+dF9kYmxvY2tzX2RlbHRhOworCQkJbXNicCsrOworCQl9CisJCWlmICh0cC0+dF9hZ2NvdW50X2RlbHRhICE9IDApIHsKKwkJCW1zYnAtPm1zYl9maWVsZCA9IFhGU19TQlNfQUdDT1VOVDsKKwkJCW1zYnAtPm1zYl9kZWx0YSA9IChpbnQpdHAtPnRfYWdjb3VudF9kZWx0YTsKKwkJCW1zYnArKzsKKwkJfQorCQlpZiAodHAtPnRfaW1heHBjdF9kZWx0YSAhPSAwKSB7CisJCQltc2JwLT5tc2JfZmllbGQgPSBYRlNfU0JTX0lNQVhfUENUOworCQkJbXNicC0+bXNiX2RlbHRhID0gKGludCl0cC0+dF9pbWF4cGN0X2RlbHRhOworCQkJbXNicCsrOworCQl9CisJCWlmICh0cC0+dF9yZXh0c2l6ZV9kZWx0YSAhPSAwKSB7CisJCQltc2JwLT5tc2JfZmllbGQgPSBYRlNfU0JTX1JFWFRTSVpFOworCQkJbXNicC0+bXNiX2RlbHRhID0gKGludCl0cC0+dF9yZXh0c2l6ZV9kZWx0YTsKKwkJCW1zYnArKzsKKwkJfQorCQlpZiAodHAtPnRfcmJtYmxvY2tzX2RlbHRhICE9IDApIHsKKwkJCW1zYnAtPm1zYl9maWVsZCA9IFhGU19TQlNfUkJNQkxPQ0tTOworCQkJbXNicC0+bXNiX2RlbHRhID0gKGludCl0cC0+dF9yYm1ibG9ja3NfZGVsdGE7CisJCQltc2JwKys7CisJCX0KKwkJaWYgKHRwLT50X3JibG9ja3NfZGVsdGEgIT0gMCkgeworCQkJbXNicC0+bXNiX2ZpZWxkID0gWEZTX1NCU19SQkxPQ0tTOworCQkJbXNicC0+bXNiX2RlbHRhID0gKGludCl0cC0+dF9yYmxvY2tzX2RlbHRhOworCQkJbXNicCsrOworCQl9CisJCWlmICh0cC0+dF9yZXh0ZW50c19kZWx0YSAhPSAwKSB7CisJCQltc2JwLT5tc2JfZmllbGQgPSBYRlNfU0JTX1JFWFRFTlRTOworCQkJbXNicC0+bXNiX2RlbHRhID0gKGludCl0cC0+dF9yZXh0ZW50c19kZWx0YTsKKwkJCW1zYnArKzsKKwkJfQorCQlpZiAodHAtPnRfcmV4dHNsb2dfZGVsdGEgIT0gMCkgeworCQkJbXNicC0+bXNiX2ZpZWxkID0gWEZTX1NCU19SRVhUU0xPRzsKKwkJCW1zYnAtPm1zYl9kZWx0YSA9IChpbnQpdHAtPnRfcmV4dHNsb2dfZGVsdGE7CisJCQltc2JwKys7CisJCX0KKwl9CisKKwkvKgorCSAqIElmIHdlIG5lZWQgdG8gY2hhbmdlIGFueXRoaW5nLCBkbyBpdC4KKwkgKi8KKwlpZiAobXNicCA+IG1zYikgeworCQllcnJvciA9IHhmc19tb2RfaW5jb3JlX3NiX2JhdGNoKHRwLT50X21vdW50cCwgbXNiLAorCQkJKHVpbnQpKG1zYnAgLSBtc2IpLCByc3ZkKTsKKwkJQVNTRVJUKGVycm9yID09IDApOworCX0KK30KKworCisvKgorICogeGZzX3RyYW5zX2NvbW1pdAorICoKKyAqIENvbW1pdCB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24gdG8gdGhlIGxvZyBhL3N5bmNocm9ub3VzbHkuCisgKgorICogWEZTIGRpc2sgZXJyb3IgaGFuZGxpbmcgbWVjaGFuaXNtIGlzIG5vdCBiYXNlZCBvbiBhIHR5cGljYWwKKyAqIHRyYW5zYWN0aW9uIGFib3J0IG1lY2hhbmlzbS4gTG9naWNhbGx5IGFmdGVyIHRoZSBmaWxlc3lzdGVtCisgKiBnZXRzIG1hcmtlZCAnU0hVVERPV04nLCB3ZSBjYW4ndCBsZXQgYW55IG5ldyB0cmFuc2FjdGlvbnMKKyAqIGJlIGR1cmFibGUgLSBpZS4gY29tbWl0dGVkIHRvIGRpc2sgLSBiZWNhdXNlIHNvbWUgbWV0YWRhdGEgbWlnaHQKKyAqIGJlIGluY29uc2lzdGVudC4gSW4gc3VjaCBjYXNlcywgdGhpcyByZXR1cm5zIGFuIGVycm9yLCBhbmQgdGhlCisgKiBjYWxsZXIgbWF5IGFzc3VtZSB0aGF0IGFsbCBsb2NrZWQgb2JqZWN0cyBqb2luZWQgdG8gdGhlIHRyYW5zYWN0aW9uCisgKiBoYXZlIGFscmVhZHkgYmVlbiB1bmxvY2tlZCBhcyBpZiB0aGUgY29tbWl0IGhhZCBzdWNjZWVkZWQuCisgKiBEbyBub3QgcmVmZXJlbmNlIHRoZSB0cmFuc2FjdGlvbiBzdHJ1Y3R1cmUgYWZ0ZXIgdGhpcyBjYWxsLgorICovCisgLypBUkdTVVNFRCovCitpbnQKK3hmc190cmFuc19jb21taXQoCisJeGZzX3RyYW5zX3QJKnRwLAorCXVpbnQJCWZsYWdzLAorCXhmc19sc25fdAkqY29tbWl0X2xzbl9wKQoreworCXhmc19sb2dfaW92ZWNfdAkJKmxvZ192ZWN0b3I7CisJaW50CQkJbnZlYzsKKwl4ZnNfbW91bnRfdAkJKm1wOworCXhmc19sc25fdAkJY29tbWl0X2xzbjsKKwkvKiBSRUZFUkVOQ0VEICovCisJaW50CQkJZXJyb3I7CisJaW50CQkJbG9nX2ZsYWdzOworCWludAkJCXN5bmM7CisjZGVmaW5lCVhGU19UUkFOU19MT0dWRUNfQ09VTlQJMTYKKwl4ZnNfbG9nX2lvdmVjX3QJCWxvZ192ZWN0b3JfZmFzdFtYRlNfVFJBTlNfTE9HVkVDX0NPVU5UXTsKKyNpZiBkZWZpbmVkKFhMT0dfTk9MT0cpIHx8IGRlZmluZWQoREVCVUcpCisJc3RhdGljIHhmc19sc25fdAl0cmFuc19sc24gPSAxOworI2VuZGlmCisJdm9pZAkJCSpjb21taXRfaWNsb2c7CisJaW50CQkJc2h1dGRvd247CisKKwljb21taXRfbHNuID0gLTE7CisKKwkvKgorCSAqIERldGVybWluZSB3aGV0aGVyIHRoaXMgY29tbWl0IGlzIHJlbGVhc2luZyBhIHBlcm1hbmVudAorCSAqIGxvZyByZXNlcnZhdGlvbiBvciBub3QuCisJICovCisJaWYgKGZsYWdzICYgWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUykgeworCQlBU1NFUlQodHAtPnRfZmxhZ3MgJiBYRlNfVFJBTlNfUEVSTV9MT0dfUkVTKTsKKwkJbG9nX2ZsYWdzID0gWEZTX0xPR19SRUxfUEVSTV9SRVNFUlY7CisJfSBlbHNlIHsKKwkJbG9nX2ZsYWdzID0gMDsKKwl9CisJbXAgPSB0cC0+dF9tb3VudHA7CisKKwkvKgorCSAqIElmIHRoZXJlIGlzIG5vdGhpbmcgdG8gYmUgbG9nZ2VkIGJ5IHRoZSB0cmFuc2FjdGlvbiwKKwkgKiB0aGVuIHVubG9jayBhbGwgb2YgdGhlIGl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUKKwkgKiB0cmFuc2FjdGlvbiBhbmQgZnJlZSB0aGUgdHJhbnNhY3Rpb24gc3RydWN0dXJlLgorCSAqIEFsc28gbWFrZSBzdXJlIHRvIHJldHVybiBhbnkgcmVzZXJ2ZWQgYmxvY2tzIHRvCisJICogdGhlIGZyZWUgcG9vbC4KKwkgKi8KK3NodXRfdXNfZG93bjoKKwlzaHV0ZG93biA9IFhGU19GT1JDRURfU0hVVERPV04obXApID8gRUlPIDogMDsKKwlpZiAoISh0cC0+dF9mbGFncyAmIFhGU19UUkFOU19ESVJUWSkgfHwgc2h1dGRvd24pIHsKKwkJeGZzX3RyYW5zX3VucmVzZXJ2ZV9hbmRfbW9kX3NiKHRwKTsKKwkJLyoKKwkJICogSXQgaXMgaW5kZWVkIHBvc3NpYmxlIGZvciB0aGUgdHJhbnNhY3Rpb24gdG8gYmUKKwkJICogbm90IGRpcnR5IGJ1dCB0aGUgZHFpbmZvIHBvcnRpb24gdG8gYmUuIEFsbCB0aGF0CisJCSAqIG1lYW5zIGlzIHRoYXQgd2UgaGF2ZSBzb21lIChub24tcGVyc2lzdGVudCkgcXVvdGEKKwkJICogcmVzZXJ2YXRpb25zIHRoYXQgbmVlZCB0byBiZSB1bnJlc2VydmVkLgorCQkgKi8KKwkJWEZTX1RSQU5TX1VOUkVTRVJWRV9BTkRfTU9EX0RRVU9UUyhtcCwgdHApOworCQlpZiAodHAtPnRfdGlja2V0KSB7CisJCQljb21taXRfbHNuID0geGZzX2xvZ19kb25lKG1wLCB0cC0+dF90aWNrZXQsCisJCQkJCQkJTlVMTCwgbG9nX2ZsYWdzKTsKKwkJCWlmIChjb21taXRfbHNuID09IC0xICYmICFzaHV0ZG93bikKKwkJCQlzaHV0ZG93biA9IFhGU19FUlJPUihFSU8pOworCQl9CisgICAgICAgICAgICAgICAgUEZMQUdTX1JFU1RPUkVfRlNUUkFOUygmdHAtPnRfcGZsYWdzKTsKKwkJeGZzX3RyYW5zX2ZyZWVfaXRlbXModHAsIHNodXRkb3duPyBYRlNfVFJBTlNfQUJPUlQgOiAwKTsKKwkJeGZzX3RyYW5zX2ZyZWVfYnVzeSh0cCk7CisJCXhmc190cmFuc19mcmVlKHRwKTsKKwkJWEZTX1NUQVRTX0lOQyh4c190cmFuc19lbXB0eSk7CisJCWlmIChjb21taXRfbHNuX3ApCisJCQkqY29tbWl0X2xzbl9wID0gY29tbWl0X2xzbjsKKwkJcmV0dXJuIChzaHV0ZG93bik7CisJfQorI2lmIGRlZmluZWQoWExPR19OT0xPRykgfHwgZGVmaW5lZChERUJVRykKKwlBU1NFUlQoIXhsb2dfZGVidWcgfHwgdHAtPnRfdGlja2V0ICE9IE5VTEwpOworI2Vsc2UKKwlBU1NFUlQodHAtPnRfdGlja2V0ICE9IE5VTEwpOworI2VuZGlmCisKKwkvKgorCSAqIElmIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBzdXBlcmJsb2NrLCB0aGVuIGRvIGl0IG5vdy4KKwkgKi8KKwlpZiAodHAtPnRfZmxhZ3MgJiBYRlNfVFJBTlNfU0JfRElSVFkpIHsKKwkJeGZzX3RyYW5zX2FwcGx5X3NiX2RlbHRhcyh0cCk7CisJfQorCVhGU19UUkFOU19BUFBMWV9EUVVPVF9ERUxUQVMobXAsIHRwKTsKKworCS8qCisJICogQXNrIGVhY2ggbG9nIGl0ZW0gaG93IG1hbnkgbG9nX3ZlY3RvciBlbnRyaWVzIGl0IHdpbGwKKwkgKiBuZWVkIHNvIHdlIGNhbiBmaWd1cmUgb3V0IGhvdyBtYW55IHRvIGFsbG9jYXRlLgorCSAqIFRyeSB0byBhdm9pZCB0aGUga21lbV9hbGxvYygpIGNhbGwgaW4gdGhlIGNvbW1vbiBjYXNlCisJICogYnkgdXNpbmcgYSB2ZWN0b3IgZnJvbSB0aGUgc3RhY2sgd2hlbiBpdCBmaXRzLgorCSAqLworCW52ZWMgPSB4ZnNfdHJhbnNfY291bnRfdmVjcyh0cCk7CisKKwlpZiAobnZlYyA9PSAwKSB7CisJCXhmc19mb3JjZV9zaHV0ZG93bihtcCwgWEZTX0xPR19JT19FUlJPUik7CisJCWdvdG8gc2h1dF91c19kb3duOworCX0KKworCisJaWYgKG52ZWMgPD0gWEZTX1RSQU5TX0xPR1ZFQ19DT1VOVCkgeworCQlsb2dfdmVjdG9yID0gbG9nX3ZlY3Rvcl9mYXN0OworCX0gZWxzZSB7CisJCWxvZ192ZWN0b3IgPSAoeGZzX2xvZ19pb3ZlY190ICopa21lbV9hbGxvYyhudmVjICoKKwkJCQkJCSAgIHNpemVvZih4ZnNfbG9nX2lvdmVjX3QpLAorCQkJCQkJICAgS01fU0xFRVApOworCX0KKworCS8qCisJICogRmlsbCBpbiB0aGUgbG9nX3ZlY3RvciBhbmQgcGluIHRoZSBsb2dnZWQgaXRlbXMsIGFuZAorCSAqIHRoZW4gd3JpdGUgdGhlIHRyYW5zYWN0aW9uIHRvIHRoZSBsb2cuCisJICovCisJeGZzX3RyYW5zX2ZpbGxfdmVjcyh0cCwgbG9nX3ZlY3Rvcik7CisKKwkvKgorCSAqIElnbm9yZSBlcnJvcnMgaGVyZS4geGZzX2xvZ19kb25lIHdvdWxkIGRvIHRoZSByaWdodCB0aGluZy4KKwkgKiBXZSBuZWVkIHRvIHB1dCB0aGUgdGlja2V0LCBldGMuIGF3YXkuCisJICovCisJZXJyb3IgPSB4ZnNfbG9nX3dyaXRlKG1wLCBsb2dfdmVjdG9yLCBudmVjLCB0cC0+dF90aWNrZXQsCisJCQkgICAgICYodHAtPnRfbHNuKSk7CisKKyNpZiBkZWZpbmVkKFhMT0dfTk9MT0cpIHx8IGRlZmluZWQoREVCVUcpCisJaWYgKHhsb2dfZGVidWcpIHsKKwkJY29tbWl0X2xzbiA9IHhmc19sb2dfZG9uZShtcCwgdHAtPnRfdGlja2V0LAorCQkJCQkgICZjb21taXRfaWNsb2csIGxvZ19mbGFncyk7CisJfSBlbHNlIHsKKwkJY29tbWl0X2xzbiA9IDA7CisJCXRwLT50X2xzbiA9IHRyYW5zX2xzbisrOworCX0KKyNlbHNlCisJLyoKKwkgKiBUaGlzIGlzIHRoZSByZWd1bGFyIGNhc2UuICBBdCB0aGlzIHBvaW50IChhZnRlciB0aGUgY2FsbCBmaW5pc2hlcyksCisJICogdGhlIHRyYW5zYWN0aW9uIGlzIGNvbW1pdHRlZCBpbmNvcmUgYW5kIGNvdWxkIGdvIG91dCB0byBkaXNrIGF0CisJICogYW55IHRpbWUuICBIb3dldmVyLCBhbGwgdGhlIGl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24KKwkgKiBhcmUgc3RpbGwgbG9ja2VkIGFuZCBwaW5uZWQgaW4gbWVtb3J5LgorCSAqLworCWNvbW1pdF9sc24gPSB4ZnNfbG9nX2RvbmUobXAsIHRwLT50X3RpY2tldCwgJmNvbW1pdF9pY2xvZywgbG9nX2ZsYWdzKTsKKyNlbmRpZgorCisJdHAtPnRfY29tbWl0X2xzbiA9IGNvbW1pdF9sc247CisJaWYgKG52ZWMgPiBYRlNfVFJBTlNfTE9HVkVDX0NPVU5UKSB7CisJCWttZW1fZnJlZShsb2dfdmVjdG9yLCBudmVjICogc2l6ZW9mKHhmc19sb2dfaW92ZWNfdCkpOworCX0KKworCWlmIChjb21taXRfbHNuX3ApCisJCSpjb21taXRfbHNuX3AgPSBjb21taXRfbHNuOworCisJLyoKKwkgKiBJZiB3ZSBnb3QgYSBsb2cgd3JpdGUgZXJyb3IuIFVucGluIHRoZSBsb2dpdGVtcyB0aGF0IHdlCisJICogaGFkIHBpbm5lZCwgY2xlYW4gdXAsIGZyZWUgdHJhbnMgc3RydWN0dXJlLCBhbmQgcmV0dXJuIGVycm9yLgorCSAqLworCWlmIChlcnJvciB8fCBjb21taXRfbHNuID09IC0xKSB7CisgICAgICAgICAgICAgICAgUEZMQUdTX1JFU1RPUkVfRlNUUkFOUygmdHAtPnRfcGZsYWdzKTsKKwkJeGZzX3RyYW5zX3VuY29tbWl0KHRwLCBmbGFnc3xYRlNfVFJBTlNfQUJPUlQpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJfQorCisJLyoKKwkgKiBPbmNlIHRoZSB0cmFuc2FjdGlvbiBoYXMgY29tbWl0dGVkLCB1bnVzZWQKKwkgKiByZXNlcnZhdGlvbnMgbmVlZCB0byBiZSByZWxlYXNlZCBhbmQgY2hhbmdlcyB0bworCSAqIHRoZSBzdXBlcmJsb2NrIG5lZWQgdG8gYmUgcmVmbGVjdGVkIGluIHRoZSBpbi1jb3JlCisJICogdmVyc2lvbi4gIERvIHRoYXQgbm93LgorCSAqLworCXhmc190cmFuc191bnJlc2VydmVfYW5kX21vZF9zYih0cCk7CisKKwlzeW5jID0gdHAtPnRfZmxhZ3MgJiBYRlNfVFJBTlNfU1lOQzsKKworCS8qCisJICogVGVsbCB0aGUgTE0gdG8gY2FsbCB0aGUgdHJhbnNhY3Rpb24gY29tcGxldGlvbiByb3V0aW5lCisJICogd2hlbiB0aGUgbG9nIHdyaXRlIHdpdGggTFNOIGNvbW1pdF9sc24gY29tcGxldGVzIChlLmcuCisJICogd2hlbiB0aGUgdHJhbnNhY3Rpb24gY29tbWl0IHJlYWxseSBoaXRzIHRoZSBvbi1kaXNrIGxvZykuCisJICogQWZ0ZXIgdGhpcyBjYWxsIHdlIGNhbm5vdCByZWZlcmVuY2UgdHAsIGJlY2F1c2UgdGhlIGNhbGwKKwkgKiBjYW4gaGFwcGVuIGF0IGFueSB0aW1lIGFuZCB0aGUgY2FsbCB3aWxsIGZyZWUgdGhlIHRyYW5zYWN0aW9uCisJICogc3RydWN0dXJlIHBvaW50ZWQgdG8gYnkgdHAuICBUaGUgb25seSBjYXNlIHdoZXJlIHdlIGNhbGwKKwkgKiB0aGUgY29tcGxldGlvbiByb3V0aW5lICh4ZnNfdHJhbnNfY29tbWl0dGVkKSBkaXJlY3RseSBpcworCSAqIGlmIHRoZSBsb2cgaXMgdHVybmVkIG9mZiBvbiBhIGRlYnVnIGtlcm5lbCBvciB3ZSdyZQorCSAqIHJ1bm5pbmcgaW4gc2ltdWxhdGlvbiBtb2RlICh0aGUgbG9nIGlzIGV4cGxpY2l0bHkgdHVybmVkCisJICogb2ZmKS4KKwkgKi8KKwl0cC0+dF9sb2djYi5jYl9mdW5jID0gKHZvaWQoKikodm9pZCosIGludCkpeGZzX3RyYW5zX2NvbW1pdHRlZDsKKwl0cC0+dF9sb2djYi5jYl9hcmcgPSB0cDsKKworCS8qCisJICogV2UgbmVlZCB0byBwYXNzIHRoZSBpY2xvZyBidWZmZXIgd2hpY2ggd2FzIHVzZWQgZm9yIHRoZQorCSAqIHRyYW5zYWN0aW9uIGNvbW1pdCByZWNvcmQgaW50byB0aGlzIGZ1bmN0aW9uLCBhbmQgYXR0YWNoCisJICogdGhlIGNhbGxiYWNrIHRvIGl0LiBUaGUgY2FsbGJhY2sgbXVzdCBiZSBhdHRhY2hlZCBiZWZvcmUKKwkgKiB0aGUgaXRlbXMgYXJlIHVubG9ja2VkIHRvIGF2b2lkIHJhY2luZyB3aXRoIG90aGVyIHRocmVhZHMKKwkgKiB3YWl0aW5nIGZvciBhbiBpdGVtIHRvIHVubG9jay4KKwkgKi8KKwlzaHV0ZG93biA9IHhmc19sb2dfbm90aWZ5KG1wLCBjb21taXRfaWNsb2csICYodHAtPnRfbG9nY2IpKTsKKworCS8qCisJICogTWFyayB0aGlzIHRocmVhZCBhcyBubyBsb25nZXIgYmVpbmcgaW4gYSB0cmFuc2FjdGlvbgorCSAqLworCVBGTEFHU19SRVNUT1JFX0ZTVFJBTlMoJnRwLT50X3BmbGFncyk7CisKKwkvKgorCSAqIE9uY2UgYWxsIHRoZSBpdGVtcyBvZiB0aGUgdHJhbnNhY3Rpb24gaGF2ZSBiZWVuIGNvcGllZAorCSAqIHRvIHRoZSBpbiBjb3JlIGxvZyBhbmQgdGhlIGNhbGxiYWNrIGlzIGF0dGFjaGVkLCB0aGUKKwkgKiBpdGVtcyBjYW4gYmUgdW5sb2NrZWQuCisJICoKKwkgKiBUaGlzIHdpbGwgZnJlZSBkZXNjcmlwdG9ycyBwb2ludGluZyB0byBpdGVtcyB3aGljaCB3ZXJlCisJICogbm90IGxvZ2dlZCBzaW5jZSB0aGVyZSBpcyBub3RoaW5nIG1vcmUgdG8gZG8gd2l0aCB0aGVtLgorCSAqIEZvciBpdGVtcyB3aGljaCB3ZXJlIGxvZ2dlZCwgd2Ugd2lsbCBrZWVwIHBvaW50ZXJzIHRvIHRoZW0KKwkgKiBzbyB0aGV5IGNhbiBiZSB1bnBpbm5lZCBhZnRlciB0aGUgdHJhbnNhY3Rpb24gY29tbWl0cyB0byBkaXNrLgorCSAqIFRoaXMgd2lsbCBhbHNvIHN0YW1wIGVhY2ggbW9kaWZpZWQgbWV0YS1kYXRhIGl0ZW0gd2l0aAorCSAqIHRoZSBjb21taXQgbHNuIG9mIHRoaXMgdHJhbnNhY3Rpb24gZm9yIGRlcGVuZGVuY3kgdHJhY2tpbmcKKwkgKiBwdXJwb3Nlcy4KKwkgKi8KKwl4ZnNfdHJhbnNfdW5sb2NrX2l0ZW1zKHRwLCBjb21taXRfbHNuKTsKKworCS8qCisJICogSWYgd2UgZGV0ZWN0ZWQgYSBsb2cgZXJyb3IgZWFybGllciwgZmluaXNoIGNvbW1pdHRpbmcKKwkgKiB0aGUgdHJhbnNhY3Rpb24gbm93ICh1bnBpbiBsb2cgaXRlbXMsIGV0YykuCisJICoKKwkgKiBPcmRlciBpcyBjcml0aWNhbCBoZXJlLCB0byBhdm9pZCB1c2luZyB0aGUgdHJhbnNhY3Rpb24KKwkgKiBwb2ludGVyIGFmdGVyIGl0cyBiZWVuIGZyZWVkIChieSB4ZnNfdHJhbnNfY29tbWl0dGVkCisJICogZWl0aGVyIGhlcmUgbm93LCBvciBhcyBhIGNhbGxiYWNrKS4gIFdlIGNhbm5vdCBkbyB0aGlzCisJICogc3RlcCBpbnNpZGUgeGZzX2xvZ19ub3RpZnkgYXMgd2FzIGRvbmUgZWFybGllciBiZWNhdXNlCisJICogb2YgdGhpcyBpc3N1ZS4KKwkgKi8KKwlpZiAoc2h1dGRvd24pCisJCXhmc190cmFuc19jb21taXR0ZWQodHAsIFhGU19MSV9BQk9SVEVEKTsKKworCS8qCisJICogTm93IHRoYXQgdGhlIHhmc190cmFuc19jb21taXR0ZWQgY2FsbGJhY2sgaGFzIGJlZW4gYXR0YWNoZWQsCisJICogYW5kIHRoZSBpdGVtcyBhcmUgcmVsZWFzZWQgd2UgY2FuIGZpbmFsbHkgYWxsb3cgdGhlIGljbG9nIHRvCisJICogZ28gdG8gZGlzay4KKwkgKi8KKwllcnJvciA9IHhmc19sb2dfcmVsZWFzZV9pY2xvZyhtcCwgY29tbWl0X2ljbG9nKTsKKworCS8qCisJICogSWYgdGhlIHRyYW5zYWN0aW9uIG5lZWRzIHRvIGJlIHN5bmNocm9ub3VzLCB0aGVuIGZvcmNlIHRoZQorCSAqIGxvZyBvdXQgbm93IGFuZCB3YWl0IGZvciBpdC4KKwkgKi8KKwlpZiAoc3luYykgeworCQlpZiAoIWVycm9yKQorCQkJZXJyb3IgPSB4ZnNfbG9nX2ZvcmNlKG1wLCBjb21taXRfbHNuLAorCQkJCSAgICAgIFhGU19MT0dfRk9SQ0UgfCBYRlNfTE9HX1NZTkMpOworCQlYRlNfU1RBVFNfSU5DKHhzX3RyYW5zX3N5bmMpOworCX0gZWxzZSB7CisJCVhGU19TVEFUU19JTkMoeHNfdHJhbnNfYXN5bmMpOworCX0KKworCXJldHVybiAoZXJyb3IpOworfQorCisKKy8qCisgKiBUb3RhbCB1cCB0aGUgbnVtYmVyIG9mIGxvZyBpb3ZlY3MgbmVlZGVkIHRvIGNvbW1pdCB0aGlzCisgKiB0cmFuc2FjdGlvbi4gIFRoZSB0cmFuc2FjdGlvbiBpdHNlbGYgbmVlZHMgb25lIGZvciB0aGUKKyAqIHRyYW5zYWN0aW9uIGhlYWRlci4gIEFzayBlYWNoIGRpcnR5IGl0ZW0gaW4gdHVybiBob3cgbWFueQorICogaXQgbmVlZHMgdG8gZ2V0IHRoZSB0b3RhbC4KKyAqLworU1RBVElDIHVpbnQKK3hmc190cmFuc19jb3VudF92ZWNzKAorCXhmc190cmFuc190CSp0cCkKK3sKKwlpbnQJCQludmVjczsKKwl4ZnNfbG9nX2l0ZW1fZGVzY190CSpsaWRwOworCisJbnZlY3MgPSAxOworCWxpZHAgPSB4ZnNfdHJhbnNfZmlyc3RfaXRlbSh0cCk7CisJQVNTRVJUKGxpZHAgIT0gTlVMTCk7CisKKwkvKiBJbiB0aGUgbm9uLWRlYnVnIGNhc2Ugd2UgbmVlZCB0byBzdGFydCBiYWlsaW5nIG91dCBpZiB3ZQorCSAqIGRpZG4ndCBmaW5kIGEgbG9nX2l0ZW0gaGVyZSwgcmV0dXJuIHplcm8gYW5kIGxldCB0cmFuc19jb21taXQKKwkgKiBkZWFsIHdpdGggaXQuCisJICovCisJaWYgKGxpZHAgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAobGlkcCAhPSBOVUxMKSB7CisJCS8qCisJCSAqIFNraXAgaXRlbXMgd2hpY2ggYXJlbid0IGRpcnR5IGluIHRoaXMgdHJhbnNhY3Rpb24uCisJCSAqLworCQlpZiAoIShsaWRwLT5saWRfZmxhZ3MgJiBYRlNfTElEX0RJUlRZKSkgeworCQkJbGlkcCA9IHhmc190cmFuc19uZXh0X2l0ZW0odHAsIGxpZHApOworCQkJY29udGludWU7CisJCX0KKwkJbGlkcC0+bGlkX3NpemUgPSBJT1BfU0laRShsaWRwLT5saWRfaXRlbSk7CisJCW52ZWNzICs9IGxpZHAtPmxpZF9zaXplOworCQlsaWRwID0geGZzX3RyYW5zX25leHRfaXRlbSh0cCwgbGlkcCk7CisJfQorCisJcmV0dXJuIG52ZWNzOworfQorCisvKgorICogQ2FsbGVkIGZyb20gdGhlIHRyYW5zX2NvbW1pdCBjb2RlIHdoZW4gd2Ugbm90aWNlIHRoYXQKKyAqIHRoZSBmaWxlc3lzdGVtIGlzIGluIHRoZSBtaWRkbGUgb2YgYSBmb3JjZWQgc2h1dGRvd24uCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfdHJhbnNfdW5jb21taXQoCisJeGZzX3RyYW5zX3QJKnRwLAorCXVpbnQJCWZsYWdzKQoreworCXhmc19sb2dfaXRlbV9kZXNjX3QJKmxpZHA7CisKKwlmb3IgKGxpZHAgPSB4ZnNfdHJhbnNfZmlyc3RfaXRlbSh0cCk7CisJICAgICBsaWRwICE9IE5VTEw7CisJICAgICBsaWRwID0geGZzX3RyYW5zX25leHRfaXRlbSh0cCwgbGlkcCkpIHsKKwkJLyoKKwkJICogVW5waW4gYWxsIGJ1dCB0aG9zZSB0aGF0IGFyZW4ndCBkaXJ0eS4KKwkJICovCisJCWlmIChsaWRwLT5saWRfZmxhZ3MgJiBYRlNfTElEX0RJUlRZKQorCQkJSU9QX1VOUElOX1JFTU9WRShsaWRwLT5saWRfaXRlbSwgdHApOworCX0KKworCXhmc190cmFuc191bnJlc2VydmVfYW5kX21vZF9zYih0cCk7CisJWEZTX1RSQU5TX1VOUkVTRVJWRV9BTkRfTU9EX0RRVU9UUyh0cC0+dF9tb3VudHAsIHRwKTsKKworCXhmc190cmFuc19mcmVlX2l0ZW1zKHRwLCBmbGFncyk7CisJeGZzX3RyYW5zX2ZyZWVfYnVzeSh0cCk7CisJeGZzX3RyYW5zX2ZyZWUodHApOworfQorCisvKgorICogRmlsbCBpbiB0aGUgdmVjdG9yIHdpdGggcG9pbnRlcnMgdG8gZGF0YSB0byBiZSBsb2dnZWQKKyAqIGJ5IHRoaXMgdHJhbnNhY3Rpb24uICBUaGUgdHJhbnNhY3Rpb24gaGVhZGVyIHRha2VzCisgKiB0aGUgZmlyc3QgdmVjdG9yLCBhbmQgdGhlbiBlYWNoIGRpcnR5IGl0ZW0gdGFrZXMgdGhlCisgKiBudW1iZXIgb2YgdmVjdG9ycyBpdCBpbmRpY2F0ZWQgaXQgbmVlZGVkIGluIHhmc190cmFuc19jb3VudF92ZWNzKCkuCisgKgorICogQXMgZWFjaCBpdGVtIGZpbGxzIGluIHRoZSBlbnRyaWVzIGl0IG5lZWRzLCBhbHNvIHBpbiB0aGUgaXRlbQorICogc28gdGhhdCBpdCBjYW5ub3QgYmUgZmx1c2hlZCBvdXQgdW50aWwgdGhlIGxvZyB3cml0ZSBjb21wbGV0ZXMuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfdHJhbnNfZmlsbF92ZWNzKAorCXhmc190cmFuc190CQkqdHAsCisJeGZzX2xvZ19pb3ZlY190CQkqbG9nX3ZlY3RvcikKK3sKKwl4ZnNfbG9nX2l0ZW1fZGVzY190CSpsaWRwOworCXhmc19sb2dfaW92ZWNfdAkJKnZlY3A7CisJdWludAkJCW5pdGVtczsKKworCS8qCisJICogU2tpcCBvdmVyIHRoZSBlbnRyeSBmb3IgdGhlIHRyYW5zYWN0aW9uIGhlYWRlciwgd2UnbGwKKwkgKiBmaWxsIHRoYXQgaW4gYXQgdGhlIGVuZC4KKwkgKi8KKwl2ZWNwID0gbG9nX3ZlY3RvciArIDE7CQkvKiBwb2ludGVyIGFyaXRobWV0aWMgKi8KKworCW5pdGVtcyA9IDA7CisJbGlkcCA9IHhmc190cmFuc19maXJzdF9pdGVtKHRwKTsKKwlBU1NFUlQobGlkcCAhPSBOVUxMKTsKKwl3aGlsZSAobGlkcCAhPSBOVUxMKSB7CisJCS8qCisJCSAqIFNraXAgaXRlbXMgd2hpY2ggYXJlbid0IGRpcnR5IGluIHRoaXMgdHJhbnNhY3Rpb24uCisJCSAqLworCQlpZiAoIShsaWRwLT5saWRfZmxhZ3MgJiBYRlNfTElEX0RJUlRZKSkgeworCQkJbGlkcCA9IHhmc190cmFuc19uZXh0X2l0ZW0odHAsIGxpZHApOworCQkJY29udGludWU7CisJCX0KKwkJLyoKKwkJICogVGhlIGl0ZW0gbWF5IGJlIG1hcmtlZCBkaXJ0eSBidXQgbm90IGxvZyBhbnl0aGluZy4KKwkJICogVGhpcyBjYW4gYmUgdXNlZCB0byBnZXQgY2FsbGVkIHdoZW4gYSB0cmFuc2FjdGlvbgorCQkgKiBpcyBjb21taXR0ZWQuCisJCSAqLworCQlpZiAobGlkcC0+bGlkX3NpemUpIHsKKwkJCW5pdGVtcysrOworCQl9CisJCUlPUF9GT1JNQVQobGlkcC0+bGlkX2l0ZW0sIHZlY3ApOworCQl2ZWNwICs9IGxpZHAtPmxpZF9zaXplOwkJLyogcG9pbnRlciBhcml0aG1ldGljICovCisJCUlPUF9QSU4obGlkcC0+bGlkX2l0ZW0pOworCQlsaWRwID0geGZzX3RyYW5zX25leHRfaXRlbSh0cCwgbGlkcCk7CisJfQorCisJLyoKKwkgKiBOb3cgdGhhdCB3ZSd2ZSBjb3VudGVkIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhpcworCSAqIHRyYW5zYWN0aW9uLCBmaWxsIGluIHRoZSB0cmFuc2FjdGlvbiBoZWFkZXIuCisJICovCisJdHAtPnRfaGVhZGVyLnRoX21hZ2ljID0gWEZTX1RSQU5TX0hFQURFUl9NQUdJQzsKKwl0cC0+dF9oZWFkZXIudGhfdHlwZSA9IHRwLT50X3R5cGU7CisJdHAtPnRfaGVhZGVyLnRoX251bV9pdGVtcyA9IG5pdGVtczsKKwlsb2dfdmVjdG9yLT5pX2FkZHIgPSAoeGZzX2NhZGRyX3QpJnRwLT50X2hlYWRlcjsKKwlsb2dfdmVjdG9yLT5pX2xlbiA9IHNpemVvZih4ZnNfdHJhbnNfaGVhZGVyX3QpOworfQorCisKKy8qCisgKiBVbmxvY2sgYWxsIG9mIHRoZSB0cmFuc2FjdGlvbidzIGl0ZW1zIGFuZCBmcmVlIHRoZSB0cmFuc2FjdGlvbi4KKyAqIFRoZSB0cmFuc2FjdGlvbiBtdXN0IG5vdCBoYXZlIG1vZGlmaWVkIGFueSBvZiBpdHMgaXRlbXMsIGJlY2F1c2UKKyAqIHRoZXJlIGlzIG5vIHdheSB0byByZXN0b3JlIHRoZW0gdG8gdGhlaXIgcHJldmlvdXMgc3RhdGUuCisgKgorICogSWYgdGhlIHRyYW5zYWN0aW9uIGhhcyBtYWRlIGEgbG9nIHJlc2VydmF0aW9uLCBtYWtlIHN1cmUgdG8gcmVsZWFzZQorICogaXQgYXMgd2VsbC4KKyAqLwordm9pZAoreGZzX3RyYW5zX2NhbmNlbCgKKwl4ZnNfdHJhbnNfdAkJKnRwLAorCWludAkJCWZsYWdzKQoreworCWludAkJCWxvZ19mbGFnczsKKyNpZmRlZiBERUJVRworCXhmc19sb2dfaXRlbV9jaHVua190CSpsaWNwOworCXhmc19sb2dfaXRlbV9kZXNjX3QJKmxpZHA7CisJeGZzX2xvZ19pdGVtX3QJCSpsaXA7CisJaW50CQkJaTsKKyNlbmRpZgorCisJLyoKKwkgKiBTZWUgaWYgdGhlIGNhbGxlciBpcyBiZWluZyB0b28gbGF6eSB0byBmaWd1cmUgb3V0IGlmCisJICogdGhlIHRyYW5zYWN0aW9uIHJlYWxseSBuZWVkcyBhbiBhYm9ydC4KKwkgKi8KKwlpZiAoKGZsYWdzICYgWEZTX1RSQU5TX0FCT1JUKSAmJiAhKHRwLT50X2ZsYWdzICYgWEZTX1RSQU5TX0RJUlRZKSkKKwkJZmxhZ3MgJj0gflhGU19UUkFOU19BQk9SVDsKKwkvKgorCSAqIFNlZSBpZiB0aGUgY2FsbGVyIGlzIHJlbHlpbmcgb24gdXMgdG8gc2h1dCBkb3duIHRoZQorCSAqIGZpbGVzeXN0ZW0uICBUaGlzIGhhcHBlbnMgaW4gcGF0aHMgd2hlcmUgd2UgZGV0ZWN0CisJICogY29ycnVwdGlvbiBhbmQgZGVjaWRlIHRvIGdpdmUgdXAuCisJICovCisJaWYgKCh0cC0+dF9mbGFncyAmIFhGU19UUkFOU19ESVJUWSkgJiYKKwkgICAgIVhGU19GT1JDRURfU0hVVERPV04odHAtPnRfbW91bnRwKSkKKwkJeGZzX2ZvcmNlX3NodXRkb3duKHRwLT50X21vdW50cCwgWEZTX0NPUlJVUFRfSU5DT1JFKTsKKyNpZmRlZiBERUJVRworCWlmICghKGZsYWdzICYgWEZTX1RSQU5TX0FCT1JUKSkgeworCQlsaWNwID0gJih0cC0+dF9pdGVtcyk7CisJCXdoaWxlIChsaWNwICE9IE5VTEwpIHsKKwkJCWxpZHAgPSBsaWNwLT5saWNfZGVzY3M7CisJCQlmb3IgKGkgPSAwOyBpIDwgbGljcC0+bGljX3VudXNlZDsgaSsrLCBsaWRwKyspIHsKKwkJCQlpZiAoWEZTX0xJQ19JU0ZSRUUobGljcCwgaSkpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJbGlwID0gbGlkcC0+bGlkX2l0ZW07CisJCQkJaWYgKCFYRlNfRk9SQ0VEX1NIVVRET1dOKHRwLT50X21vdW50cCkpCisJCQkJCUFTU0VSVCghKGxpcC0+bGlfdHlwZSA9PSBYRlNfTElfRUZEKSk7CisJCQl9CisJCQlsaWNwID0gbGljcC0+bGljX25leHQ7CisJCX0KKwl9CisjZW5kaWYKKwl4ZnNfdHJhbnNfdW5yZXNlcnZlX2FuZF9tb2Rfc2IodHApOworCVhGU19UUkFOU19VTlJFU0VSVkVfQU5EX01PRF9EUVVPVFModHAtPnRfbW91bnRwLCB0cCk7CisKKwlpZiAodHAtPnRfdGlja2V0KSB7CisJCWlmIChmbGFncyAmIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMpIHsKKwkJCUFTU0VSVCh0cC0+dF9mbGFncyAmIFhGU19UUkFOU19QRVJNX0xPR19SRVMpOworCQkJbG9nX2ZsYWdzID0gWEZTX0xPR19SRUxfUEVSTV9SRVNFUlY7CisJCX0gZWxzZSB7CisJCQlsb2dfZmxhZ3MgPSAwOworCQl9CisJCXhmc19sb2dfZG9uZSh0cC0+dF9tb3VudHAsIHRwLT50X3RpY2tldCwgTlVMTCwgbG9nX2ZsYWdzKTsKKwl9CisKKwkvKiBtYXJrIHRoaXMgdGhyZWFkIGFzIG5vIGxvbmdlciBiZWluZyBpbiBhIHRyYW5zYWN0aW9uICovCisgICAgICAgIFBGTEFHU19SRVNUT1JFX0ZTVFJBTlMoJnRwLT50X3BmbGFncyk7CisKKwl4ZnNfdHJhbnNfZnJlZV9pdGVtcyh0cCwgZmxhZ3MpOworCXhmc190cmFuc19mcmVlX2J1c3kodHApOworCXhmc190cmFuc19mcmVlKHRwKTsKK30KKworCisvKgorICogRnJlZSB0aGUgdHJhbnNhY3Rpb24gc3RydWN0dXJlLiAgSWYgdGhlcmUgaXMgbW9yZSBjbGVhbiB1cAorICogdG8gZG8gd2hlbiB0aGUgc3RydWN0dXJlIGlzIGZyZWVkLCBhZGQgaXQgaGVyZS4KKyAqLworU1RBVElDIHZvaWQKK3hmc190cmFuc19mcmVlKAorCXhmc190cmFuc190CSp0cCkKK3sKKwlhdG9taWNfZGVjKCZ0cC0+dF9tb3VudHAtPm1fYWN0aXZlX3RyYW5zKTsKKwlYRlNfVFJBTlNfRlJFRV9EUUlORk8odHAtPnRfbW91bnRwLCB0cCk7CisJa21lbV96b25lX2ZyZWUoeGZzX3RyYW5zX3pvbmUsIHRwKTsKK30KKworCisvKgorICogVEhJUyBTSE9VTEQgQkUgUkVXUklUVEVOIFRPIFVTRSB4ZnNfdHJhbnNfbmV4dF9pdGVtKCkuCisgKgorICogVGhpcyBpcyB0eXBpY2FsbHkgY2FsbGVkIGJ5IHRoZSBMTSB3aGVuIGEgdHJhbnNhY3Rpb24gaGFzIGJlZW4gZnVsbHkKKyAqIGNvbW1pdHRlZCB0byBkaXNrLiAgSXQgbmVlZHMgdG8gdW5waW4gdGhlIGl0ZW1zIHdoaWNoIGhhdmUKKyAqIGJlZW4gbG9nZ2VkIGJ5IHRoZSB0cmFuc2FjdGlvbiBhbmQgdXBkYXRlIHRoZWlyIHBvc2l0aW9ucworICogaW4gdGhlIEFJTCBpZiBuZWNlc3NhcnkuCisgKiBUaGlzIGFsc28gZ2V0cyBjYWxsZWQgd2hlbiB0aGUgdHJhbnNhY3Rpb25zIGRpZG4ndCBnZXQgd3JpdHRlbiBvdXQKKyAqIGJlY2F1c2Ugb2YgYW4gSS9PIGVycm9yLiBBYm9ydGZsYWcgJiBYRlNfTElfQUJPUlRFRCBpcyBzZXQgdGhlbi4KKyAqCisgKiBDYWxsIHhmc190cmFuc19jaHVua19jb21taXR0ZWQoKSB0byBwcm9jZXNzIHRoZSBpdGVtcyBpbgorICogZWFjaCBjaHVuay4KKyAqLworU1RBVElDIHZvaWQKK3hmc190cmFuc19jb21taXR0ZWQoCisJeGZzX3RyYW5zX3QJKnRwLAorCWludAkJYWJvcnRmbGFnKQoreworCXhmc19sb2dfaXRlbV9jaHVua190CSpsaWNwOworCXhmc19sb2dfaXRlbV9jaHVua190CSpuZXh0X2xpY3A7CisJeGZzX2xvZ19idXN5X2NodW5rX3QJKmxiY3A7CisJeGZzX2xvZ19idXN5X3Nsb3RfdAkqbGJzcDsKKwlpbnQJCQlpOworCisJLyoKKwkgKiBDYWxsIHRoZSB0cmFuc2FjdGlvbidzIGNvbXBsZXRpb24gY2FsbGJhY2sgaWYgdGhlcmUKKwkgKiBpcyBvbmUuCisJICovCisJaWYgKHRwLT50X2NhbGxiYWNrICE9IE5VTEwpIHsKKwkJdHAtPnRfY2FsbGJhY2sodHAsIHRwLT50X2NhbGxhcmcpOworCX0KKworCS8qCisJICogU3BlY2lhbCBjYXNlIHRoZSBjaHVuayBlbWJlZGRlZCBpbiB0aGUgdHJhbnNhY3Rpb24uCisJICovCisJbGljcCA9ICYodHAtPnRfaXRlbXMpOworCWlmICghKFhGU19MSUNfQVJFX0FMTF9GUkVFKGxpY3ApKSkgeworCQl4ZnNfdHJhbnNfY2h1bmtfY29tbWl0dGVkKGxpY3AsIHRwLT50X2xzbiwgYWJvcnRmbGFnKTsKKwl9CisKKwkvKgorCSAqIFByb2Nlc3MgdGhlIGl0ZW1zIGluIGVhY2ggY2h1bmsgaW4gdHVybi4KKwkgKi8KKwlsaWNwID0gbGljcC0+bGljX25leHQ7CisJd2hpbGUgKGxpY3AgIT0gTlVMTCkgeworCQlBU1NFUlQoIVhGU19MSUNfQVJFX0FMTF9GUkVFKGxpY3ApKTsKKwkJeGZzX3RyYW5zX2NodW5rX2NvbW1pdHRlZChsaWNwLCB0cC0+dF9sc24sIGFib3J0ZmxhZyk7CisJCW5leHRfbGljcCA9IGxpY3AtPmxpY19uZXh0OworCQlrbWVtX2ZyZWUobGljcCwgc2l6ZW9mKHhmc19sb2dfaXRlbV9jaHVua190KSk7CisJCWxpY3AgPSBuZXh0X2xpY3A7CisJfQorCisJLyoKKwkgKiBDbGVhciBhbGwgdGhlIHBlci1BRyBidXN5IGxpc3QgaXRlbXMgbGlzdGVkIGluIHRoaXMgdHJhbnNhY3Rpb24KKwkgKi8KKwlsYmNwID0gJnRwLT50X2J1c3k7CisJd2hpbGUgKGxiY3AgIT0gTlVMTCkgeworCQlmb3IgKGkgPSAwLCBsYnNwID0gbGJjcC0+bGJjX2J1c3k7IGkgPCBsYmNwLT5sYmNfdW51c2VkOyBpKyssIGxic3ArKykgeworCQkJaWYgKCFYRlNfTEJDX0lTRlJFRShsYmNwLCBpKSkgeworCQkJCXhmc19hbGxvY19jbGVhcl9idXN5KHRwLCBsYnNwLT5sYmNfYWcsCisJCQkJCQkgICAgIGxic3AtPmxiY19pZHgpOworCQkJfQorCQl9CisJCWxiY3AgPSBsYmNwLT5sYmNfbmV4dDsKKwl9CisJeGZzX3RyYW5zX2ZyZWVfYnVzeSh0cCk7CisKKwkvKgorCSAqIFRoYXQncyBpdCBmb3IgdGhlIHRyYW5zYWN0aW9uIHN0cnVjdHVyZS4gIEZyZWUgaXQuCisJICovCisJeGZzX3RyYW5zX2ZyZWUodHApOworfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgdG8gcGVyZm9ybSB0aGUgY29tbWl0IHByb2Nlc3NpbmcgZm9yIGVhY2gKKyAqIGl0ZW0gZGVzY3JpYmVkIGJ5IHRoZSBnaXZlbiBjaHVuay4KKyAqCisgKiBUaGUgY29tbWl0IHByb2Nlc3NpbmcgY29uc2lzdHMgb2YgdW5sb2NraW5nIGl0ZW1zIHdoaWNoIHdlcmUKKyAqIGhlbGQgbG9ja2VkIHdpdGggdGhlIFNZTkNfVU5MT0NLIGF0dHJpYnV0ZSwgY2FsbGluZyB0aGUgY29tbWl0dGVkCisgKiByb3V0aW5lIG9mIGVhY2ggbG9nZ2VkIGl0ZW0sIHVwZGF0aW5nIHRoZSBpdGVtJ3MgcG9zaXRpb24gaW4gdGhlIEFJTAorICogaWYgbmVjZXNzYXJ5LCBhbmQgdW5waW5uaW5nIGVhY2ggaXRlbS4gIElmIHRoZSBjb21taXR0ZWQgcm91dGluZQorICogcmV0dXJucyAtMSwgdGhlbiBkbyBub3RoaW5nIGZ1cnRoZXIgd2l0aCB0aGUgaXRlbSBiZWNhdXNlIGl0CisgKiBtYXkgaGF2ZSBiZWVuIGZyZWVkLgorICoKKyAqIFNpbmNlIGl0ZW1zIGFyZSB1bmxvY2tlZCB3aGVuIHRoZXkgYXJlIGNvcGllZCB0byB0aGUgaW5jb3JlCisgKiBsb2csIGl0IGlzIHBvc3NpYmxlIGZvciB0d28gdHJhbnNhY3Rpb25zIHRvIGJlIGNvbXBsZXRpbmcKKyAqIGFuZCBtYW5pcHVsYXRpbmcgdGhlIHNhbWUgaXRlbSBzaW11bHRhbmVvdXNseS4gIFRoZSBBSUwgbG9jaworICogd2lsbCBwcm90ZWN0IHRoZSBsc24gZmllbGQgb2YgZWFjaCBpdGVtLiAgVGhlIHZhbHVlIG9mIHRoaXMKKyAqIGZpZWxkIGNhbiBuZXZlciBnbyBiYWNrd2FyZHMuCisgKgorICogV2UgdW5waW4gdGhlIGl0ZW1zIGFmdGVyIHJlcG9zaXRpb25pbmcgdGhlbSBpbiB0aGUgQUlMLCBiZWNhdXNlCisgKiBvdGhlcndpc2UgdGhleSBjb3VsZCBiZSBpbW1lZGlhdGVseSBmbHVzaGVkIGFuZCB3ZSdkIGhhdmUgdG8gcmFjZQorICogd2l0aCB0aGUgZmx1c2hlciB0cnlpbmcgdG8gcHVsbCB0aGUgaXRlbSBmcm9tIHRoZSBBSUwgYXMgd2UgYWRkIGl0LgorICovCitTVEFUSUMgdm9pZAoreGZzX3RyYW5zX2NodW5rX2NvbW1pdHRlZCgKKwl4ZnNfbG9nX2l0ZW1fY2h1bmtfdAkqbGljcCwKKwl4ZnNfbHNuX3QJCWxzbiwKKwlpbnQJCQlhYm9ydGVkKQoreworCXhmc19sb2dfaXRlbV9kZXNjX3QJKmxpZHA7CisJeGZzX2xvZ19pdGVtX3QJCSpsaXA7CisJeGZzX2xzbl90CQlpdGVtX2xzbjsKKwlzdHJ1Y3QgeGZzX21vdW50CSptcDsKKwlpbnQJCQlpOworCVNQTERFQ0wocyk7CisKKwlsaWRwID0gbGljcC0+bGljX2Rlc2NzOworCWZvciAoaSA9IDA7IGkgPCBsaWNwLT5saWNfdW51c2VkOyBpKyssIGxpZHArKykgeworCQlpZiAoWEZTX0xJQ19JU0ZSRUUobGljcCwgaSkpIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbGlwID0gbGlkcC0+bGlkX2l0ZW07CisJCWlmIChhYm9ydGVkKQorCQkJbGlwLT5saV9mbGFncyB8PSBYRlNfTElfQUJPUlRFRDsKKworCQkvKgorCQkgKiBTZW5kIGluIHRoZSBBQk9SVEVEIGZsYWcgdG8gdGhlIENPTU1JVFRFRCByb3V0aW5lCisJCSAqIHNvIHRoYXQgaXQga25vd3Mgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gd2FzIGFib3J0ZWQKKwkJICogb3Igbm90LgorCQkgKi8KKwkJaXRlbV9sc24gPSBJT1BfQ09NTUlUVEVEKGxpcCwgbHNuKTsKKworCQkvKgorCQkgKiBJZiB0aGUgY29tbWl0dGVkIHJvdXRpbmUgcmV0dXJucyAtMSwgbWFrZQorCQkgKiBubyBtb3JlIHJlZmVyZW5jZXMgdG8gdGhlIGl0ZW0uCisJCSAqLworCQlpZiAoWEZTX0xTTl9DTVAoaXRlbV9sc24sICh4ZnNfbHNuX3QpLTEpID09IDApIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogSWYgdGhlIHJldHVybmVkIGxzbiBpcyBncmVhdGVyIHRoYW4gd2hhdCBpdAorCQkgKiBjb250YWluZWQgYmVmb3JlLCB1cGRhdGUgdGhlIGxvY2F0aW9uIG9mIHRoZQorCQkgKiBpdGVtIGluIHRoZSBBSUwuICBJZiBpdCBpcyBub3QsIHRoZW4gZG8gbm90aGluZy4KKwkJICogSXRlbXMgY2FuIG5ldmVyIG1vdmUgYmFja3dhcmRzIGluIHRoZSBBSUwuCisJCSAqCisJCSAqIFdoaWxlIHRoZSBuZXcgbHNuIHNob3VsZCB1c3VhbGx5IGJlIGdyZWF0ZXIsIGl0CisJCSAqIGlzIHBvc3NpYmxlIHRoYXQgYSBsYXRlciB0cmFuc2FjdGlvbiBjb21wbGV0aW5nCisJCSAqIHNpbXVsdGFuZW91c2x5IHdpdGggYW4gZWFybGllciBvbmUgdXNpbmcgdGhlCisJCSAqIHNhbWUgaXRlbSBjb3VsZCBjb21wbGV0ZSBmaXJzdCB3aXRoIGEgaGlnaGVyIGxzbi4KKwkJICogVGhpcyB3b3VsZCBjYXVzZSB0aGUgZWFybGllciB0cmFuc2FjdGlvbiB0byBmYWlsCisJCSAqIHRoZSB0ZXN0IGJlbG93LgorCQkgKi8KKwkJbXAgPSBsaXAtPmxpX21vdW50cDsKKwkJQUlMX0xPQ0sobXAscyk7CisJCWlmIChYRlNfTFNOX0NNUChpdGVtX2xzbiwgbGlwLT5saV9sc24pID4gMCkgeworCQkJLyoKKwkJCSAqIFRoaXMgd2lsbCBzZXQgdGhlIGl0ZW0ncyBsc24gdG8gaXRlbV9sc24KKwkJCSAqIGFuZCB1cGRhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBpdGVtIGluCisJCQkgKiB0aGUgQUlMLgorCQkJICoKKwkJCSAqIHhmc190cmFuc191cGRhdGVfYWlsKCkgZHJvcHMgdGhlIEFJTCBsb2NrLgorCQkJICovCisJCQl4ZnNfdHJhbnNfdXBkYXRlX2FpbChtcCwgbGlwLCBpdGVtX2xzbiwgcyk7CisJCX0gZWxzZSB7CisJCQlBSUxfVU5MT0NLKG1wLCBzKTsKKwkJfQorCisJCS8qCisJCSAqIE5vdyB0aGF0IHdlJ3ZlIHJlcG9zaXRpb25lZCB0aGUgaXRlbSBpbiB0aGUgQUlMLAorCQkgKiB1bnBpbiBpdCBzbyBpdCBjYW4gYmUgZmx1c2hlZC4gUGFzcyBpbmZvcm1hdGlvbgorCQkgKiBhYm91dCBidWZmZXIgc3RhbGUgc3RhdGUgZG93biBmcm9tIHRoZSBsb2cgaXRlbQorCQkgKiBmbGFncywgaWYgYW55b25lIGVsc2Ugc3RhbGVzIHRoZSBidWZmZXIgd2UgZG8gbm90CisJCSAqIHdhbnQgdG8gcGF5IGFueSBhdHRlbnRpb24gdG8gaXQuCisJCSAqLworCQlJT1BfVU5QSU4obGlwLCBsaWRwLT5saWRfZmxhZ3MgJiBYRlNfTElEX0JVRl9TVEFMRSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFucy5oIGIvZnMveGZzL3hmc190cmFucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMzdjY2IKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX3RyYW5zLmgKQEAgLTAsMCArMSwxMDQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZglfX1hGU19UUkFOU19IX18KKyNkZWZpbmUJX19YRlNfVFJBTlNfSF9fCisKKy8qCisgKiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgd3JpdHRlbiBpbiB0aGUgbG9nIGF0IHRoZSBoZWFkIG9mCisgKiBldmVyeSB0cmFuc2FjdGlvbi4gSXQgaWRlbnRpZmllcyB0aGUgdHlwZSBhbmQgaWQgb2YgdGhlCisgKiB0cmFuc2FjdGlvbiwgYW5kIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgaXRlbXMgbG9nZ2VkIGJ5CisgKiB0aGUgdHJhbnNhY3Rpb24gc28gd2Uga25vdyBob3cgbWFueSB0byBleHBlY3QgZHVyaW5nIHJlY292ZXJ5LgorICoKKyAqIERvIG5vdCBjaGFuZ2UgdGhlIGJlbG93IHN0cnVjdHVyZSB3aXRob3V0IHJlZG9pbmcgdGhlIGNvZGUgaW4KKyAqIHhsb2dfcmVjb3Zlcl9hZGRfdG9fdHJhbnMoKSBhbmQgeGxvZ19yZWNvdmVyX2FkZF90b19jb250X3RyYW5zKCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc190cmFuc19oZWFkZXIgeworCXVpbnQJCXRoX21hZ2ljOwkJLyogbWFnaWMgbnVtYmVyICovCisJdWludAkJdGhfdHlwZTsJCS8qIHRyYW5zYWN0aW9uIHR5cGUgKi8KKwlfX2ludDMyX3QJdGhfdGlkOwkJCS8qIHRyYW5zYWN0aW9uIGlkICh1bnVzZWQpICovCisJdWludAkJdGhfbnVtX2l0ZW1zOwkJLyogbnVtIGl0ZW1zIGxvZ2dlZCBieSB0cmFucyAqLworfSB4ZnNfdHJhbnNfaGVhZGVyX3Q7CisKKyNkZWZpbmUJWEZTX1RSQU5TX0hFQURFUl9NQUdJQwkweDU0NTI0MTRlCS8qIFRSQU4gKi8KKworLyoKKyAqIExvZyBpdGVtIHR5cGVzLgorICovCisjZGVmaW5lCVhGU19MSV81XzNfQlVGCQkweDEyMzQJLyogdjEgYnVmcywgMS1ibG9jayBpbm9kZSBidWZmZXJzICovCisjZGVmaW5lCVhGU19MSV81XzNfSU5PREUJMHgxMjM1CS8qIDEtYmxvY2sgaW5vZGUgYnVmZmVycyAqLworI2RlZmluZQlYRlNfTElfRUZJCQkweDEyMzYKKyNkZWZpbmUJWEZTX0xJX0VGRAkJMHgxMjM3CisjZGVmaW5lCVhGU19MSV9JVU5MSU5LCQkweDEyMzgKKyNkZWZpbmUJWEZTX0xJXzZfMV9JTk9ERQkweDEyMzkJLyogNEsgbm9uLWFsaWduZWQgaW5vZGUgYnVmcyAqLworI2RlZmluZQlYRlNfTElfNl8xX0JVRgkJMHgxMjNhCS8qIHYxLCA0SyBpbm9kZSBidWZmZXJzICovCisjZGVmaW5lCVhGU19MSV9JTk9ERQkJMHgxMjNiCS8qIGFsaWduZWQgaW5vIGNodW5rcywgdmFyLXNpemUgaWJ1ZnMgKi8KKyNkZWZpbmUJWEZTX0xJX0JVRgkJMHgxMjNjCS8qIHYyIGJ1ZnMsIHZhcmlhYmxlIHNpemVkIGlub2RlIGJ1ZnMgKi8KKyNkZWZpbmUJWEZTX0xJX0RRVU9UCQkweDEyM2QKKyNkZWZpbmUJWEZTX0xJX1FVT1RBT0ZGCQkweDEyM2UKKworLyoKKyAqIFRyYW5zYWN0aW9uIHR5cGVzLiAgVXNlZCB0byBkaXN0aW5ndWlzaCB0eXBlcyBvZiBidWZmZXJzLgorICovCisjZGVmaW5lIFhGU19UUkFOU19TRVRBVFRSX05PVF9TSVpFCTEKKyNkZWZpbmUgWEZTX1RSQU5TX1NFVEFUVFJfU0laRQkJMgorI2RlZmluZSBYRlNfVFJBTlNfSU5BQ1RJVkUJCTMKKyNkZWZpbmUgWEZTX1RSQU5TX0NSRUFURQkJNAorI2RlZmluZSBYRlNfVFJBTlNfQ1JFQVRFX1RSVU5DCQk1CisjZGVmaW5lIFhGU19UUkFOU19UUlVOQ0FURV9GSUxFCQk2CisjZGVmaW5lIFhGU19UUkFOU19SRU1PVkUJCTcKKyNkZWZpbmUgWEZTX1RSQU5TX0xJTksJCQk4CisjZGVmaW5lIFhGU19UUkFOU19SRU5BTUUJCTkKKyNkZWZpbmUgWEZTX1RSQU5TX01LRElSCQkJMTAKKyNkZWZpbmUgWEZTX1RSQU5TX1JNRElSCQkJMTEKKyNkZWZpbmUgWEZTX1RSQU5TX1NZTUxJTksJCTEyCisjZGVmaW5lIFhGU19UUkFOU19TRVRfRE1BVFRSUwkJMTMKKyNkZWZpbmUgWEZTX1RSQU5TX0dST1dGUwkJMTQKKyNkZWZpbmUgWEZTX1RSQU5TX1NUUkFUX1dSSVRFCQkxNQorI2RlZmluZSBYRlNfVFJBTlNfRElPU1RSQVQJCTE2CisjZGVmaW5lCVhGU19UUkFOU19XUklURV9TWU5DCQkxNworI2RlZmluZQlYRlNfVFJBTlNfV1JJVEVJRAkJMTgKKyNkZWZpbmUJWEZTX1RSQU5TX0FEREFGT1JLCQkxOQorI2RlZmluZQlYRlNfVFJBTlNfQVRUUklOVkFMCQkyMAorI2RlZmluZQlYRlNfVFJBTlNfQVRSVU5DQVRFCQkyMQorI2RlZmluZQlYRlNfVFJBTlNfQVRUUl9TRVQJCTIyCisjZGVmaW5lCVhGU19UUkFOU19BVFRSX1JNCQkyMworI2RlZmluZQlYRlNfVFJBTlNfQVRUUl9GTEFHCQkyNAorI2RlZmluZQlYRlNfVFJBTlNfQ0xFQVJfQUdJX0JVQ0tFVAkyNQorI2RlZmluZSBYRlNfVFJBTlNfUU1fU0JDSEFOR0UJCTI2CisvKgorICogRHVtbXkgZW50cmllcyBzaW5jZSB3ZSB1c2UgdGhlIHRyYW5zYWN0aW9uIHR5cGUgdG8gaW5kZXggaW50byB0aGUKKyAqIHRyYW5zX3R5cGVbXSBpbiB4bG9nX3JlY292ZXJfcHJpbnRfdHJhbnNfaGVhZCgpCisgKi8KKyNkZWZpbmUgWEZTX1RSQU5TX0RVTU1ZMQkJMjcKKyNkZWZpbmUgWEZTX1RSQU5TX0RVTU1ZMgkJMjgKKyNkZWZpbmUgWEZTX1RSQU5TX1FNX1FVT1RBT0ZGCQkyOQorI2RlZmluZSBYRlNfVFJBTlNfUU1fRFFBTExPQwkJMzAKKyNkZWZpbmUgWEZTX1RSQU5TX1FNX1NFVFFMSU0JCTMxCisjZGVmaW5lIFhGU19UUkFOU19RTV9EUUNMVVNURVIJCTMyCisjZGVmaW5lIFhGU19UUkFOU19RTV9RSU5PQ1JFQVRFCQkzMworI2RlZmluZSBYRlNfVFJBTlNfUU1fUVVPVEFPRkZfRU5ECTM0CisjZGVmaW5lIFhGU19UUkFOU19TQl9VTklUCQkzNQorI2RlZmluZSBYRlNfVFJBTlNfRlNZTkNfVFMJCTM2CisjZGVmaW5lCVhGU19UUkFOU19HUk9XRlNSVF9BTExPQwkzNworI2RlZmluZQlYRlNfVFJBTlNfR1JPV0ZTUlRfWkVSTwkJMzgKKyNkZWZpbmUJWEZTX1RSQU5TX0dST1dGU1JUX0ZSRUUJCTM5CisjZGVmaW5lCVhGU19UUkFOU19TV0FQRVhUCQk0MAorLyogbmV3IHRyYW5zYWN0aW9uIHR5cGVzIG5lZWQgdG8gYmUgcmVmbGVjdGVkIGluIHhmc19sb2dwcmludCg4KSAqLworCisKKyNpZmRlZiBfX0tFUk5FTF9fCitzdHJ1Y3QgeGZzX2J1ZjsKK3N0cnVjdCB4ZnNfYnVmdGFyZzsKK3N0cnVjdCB4ZnNfZWZkX2xvZ19pdGVtOworc3RydWN0IHhmc19lZmlfbG9nX2l0ZW07CitzdHJ1Y3QgeGZzX2lub2RlOworc3RydWN0IHhmc19pdGVtX29wczsKK3N0cnVjdCB4ZnNfbG9nX2lvdmVjOworc3RydWN0IHhmc19sb2dfaXRlbTsKK3N0cnVjdCB4ZnNfbG9nX2l0ZW1fZGVzYzsKK3N0cnVjdCB4ZnNfbW91bnQ7CitzdHJ1Y3QgeGZzX3RyYW5zOworc3RydWN0IHhmc19kcXVvdF9hY2N0OworCit0eXBlZGVmIHN0cnVjdCB4ZnNfYWlsX2VudHJ5IHsKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCSphaWxfZm9ydzsJLyogQUlMIGZvcncgcG9pbnRlciAqLworCXN0cnVjdCB4ZnNfbG9nX2l0ZW0JKmFpbF9iYWNrOwkvKiBBSUwgYmFjayBwb2ludGVyICovCit9IHhmc19haWxfZW50cnlfdDsKKworLyoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHBhc3NlZCBhcyBhIHBhcmFtZXRlciB0byB4ZnNfdHJhbnNfcHVzaF9haWwoKQorICogYW5kIGlzIHVzZWQgdG8gdHJhY2sgdGhlIHdoYXQgTFNOIHRoZSB3YWl0aW5nIHByb2Nlc3NlcyBhcmUKKyAqIHdhaXRpbmcgdG8gYmVjb21lIHVudXNlZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgeGZzX2FpbF90aWNrZXQgeworCXhmc19sc25fdAkJYXRfbHNuOwkJLyogbHNuIHdhaXRpbiBmb3IgKi8KKwlzdHJ1Y3QgeGZzX2FpbF90aWNrZXQJKmF0X2Zvcnc7CS8qIHdhaXQgbGlzdCBwdHIgKi8KKwlzdHJ1Y3QgeGZzX2FpbF90aWNrZXQJKmF0X2JhY2s7CS8qIHdhaXQgbGlzdCBwdHIgKi8KKwlzdl90CQkJYXRfc2VtYTsJLyogd2FpdCBzZW1hICovCit9IHhmc19haWxfdGlja2V0X3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2xvZ19pdGVtIHsKKwl4ZnNfYWlsX2VudHJ5X3QJCQlsaV9haWw7CQkvKiBBSUwgcG9pbnRlcnMgKi8KKwl4ZnNfbHNuX3QJCQlsaV9sc247CQkvKiBsYXN0IG9uLWRpc2sgbHNuICovCisJc3RydWN0IHhmc19sb2dfaXRlbV9kZXNjCSpsaV9kZXNjOwkvKiBwdHIgdG8gY3VycmVudCBkZXNjKi8KKwlzdHJ1Y3QgeGZzX21vdW50CQkqbGlfbW91bnRwOwkvKiBwdHIgdG8gZnMgbW91bnQgKi8KKwl1aW50CQkJCWxpX3R5cGU7CS8qIGl0ZW0gdHlwZSAqLworCXVpbnQJCQkJbGlfZmxhZ3M7CS8qIG1pc2MgZmxhZ3MgKi8KKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtCQkqbGlfYmlvX2xpc3Q7CS8qIGJ1ZmZlciBpdGVtIGxpc3QgKi8KKwl2b2lkCQkJCSgqbGlfY2IpKHN0cnVjdCB4ZnNfYnVmICosCisJCQkJCQkgc3RydWN0IHhmc19sb2dfaXRlbSAqKTsKKwkJCQkJCQkvKiBidWZmZXIgaXRlbSBpb2RvbmUgKi8KKwkJCQkJCQkvKiBjYWxsYmFjayBmdW5jICovCisJc3RydWN0IHhmc19pdGVtX29wcwkJKmxpX29wczsJLyogZnVuY3Rpb24gbGlzdCAqLworfSB4ZnNfbG9nX2l0ZW1fdDsKKworI2RlZmluZQlYRlNfTElfSU5fQUlMCTB4MQorI2RlZmluZSBYRlNfTElfQUJPUlRFRAkweDIKKwordHlwZWRlZiBzdHJ1Y3QgeGZzX2l0ZW1fb3BzIHsKKwl1aW50ICgqaW9wX3NpemUpKHhmc19sb2dfaXRlbV90ICopOworCXZvaWQgKCppb3BfZm9ybWF0KSh4ZnNfbG9nX2l0ZW1fdCAqLCBzdHJ1Y3QgeGZzX2xvZ19pb3ZlYyAqKTsKKwl2b2lkICgqaW9wX3BpbikoeGZzX2xvZ19pdGVtX3QgKik7CisJdm9pZCAoKmlvcF91bnBpbikoeGZzX2xvZ19pdGVtX3QgKiwgaW50KTsKKwl2b2lkICgqaW9wX3VucGluX3JlbW92ZSkoeGZzX2xvZ19pdGVtX3QgKiwgc3RydWN0IHhmc190cmFucyAqKTsKKwl1aW50ICgqaW9wX3RyeWxvY2spKHhmc19sb2dfaXRlbV90ICopOworCXZvaWQgKCppb3BfdW5sb2NrKSh4ZnNfbG9nX2l0ZW1fdCAqKTsKKwl4ZnNfbHNuX3QgKCppb3BfY29tbWl0dGVkKSh4ZnNfbG9nX2l0ZW1fdCAqLCB4ZnNfbHNuX3QpOworCXZvaWQgKCppb3BfcHVzaCkoeGZzX2xvZ19pdGVtX3QgKik7CisJdm9pZCAoKmlvcF9hYm9ydCkoeGZzX2xvZ19pdGVtX3QgKik7CisJdm9pZCAoKmlvcF9wdXNoYnVmKSh4ZnNfbG9nX2l0ZW1fdCAqKTsKKwl2b2lkICgqaW9wX2NvbW1pdHRpbmcpKHhmc19sb2dfaXRlbV90ICosIHhmc19sc25fdCk7Cit9IHhmc19pdGVtX29wc190OworCisjZGVmaW5lIElPUF9TSVpFKGlwKQkJKCooaXApLT5saV9vcHMtPmlvcF9zaXplKShpcCkKKyNkZWZpbmUgSU9QX0ZPUk1BVChpcCx2cCkJKCooaXApLT5saV9vcHMtPmlvcF9mb3JtYXQpKGlwLCB2cCkKKyNkZWZpbmUgSU9QX1BJTihpcCkJCSgqKGlwKS0+bGlfb3BzLT5pb3BfcGluKShpcCkKKyNkZWZpbmUgSU9QX1VOUElOKGlwLCBmbGFncykJKCooaXApLT5saV9vcHMtPmlvcF91bnBpbikoaXAsIGZsYWdzKQorI2RlZmluZSBJT1BfVU5QSU5fUkVNT1ZFKGlwLHRwKSAoKihpcCktPmxpX29wcy0+aW9wX3VucGluX3JlbW92ZSkoaXAsIHRwKQorI2RlZmluZSBJT1BfVFJZTE9DSyhpcCkJCSgqKGlwKS0+bGlfb3BzLT5pb3BfdHJ5bG9jaykoaXApCisjZGVmaW5lIElPUF9VTkxPQ0soaXApCQkoKihpcCktPmxpX29wcy0+aW9wX3VubG9jaykoaXApCisjZGVmaW5lIElPUF9DT01NSVRURUQoaXAsIGxzbikJKCooaXApLT5saV9vcHMtPmlvcF9jb21taXR0ZWQpKGlwLCBsc24pCisjZGVmaW5lIElPUF9QVVNIKGlwKQkJKCooaXApLT5saV9vcHMtPmlvcF9wdXNoKShpcCkKKyNkZWZpbmUgSU9QX0FCT1JUKGlwKQkJKCooaXApLT5saV9vcHMtPmlvcF9hYm9ydCkoaXApCisjZGVmaW5lIElPUF9QVVNIQlVGKGlwKQkJKCooaXApLT5saV9vcHMtPmlvcF9wdXNoYnVmKShpcCkKKyNkZWZpbmUgSU9QX0NPTU1JVFRJTkcoaXAsIGxzbikgKCooaXApLT5saV9vcHMtPmlvcF9jb21taXR0aW5nKShpcCwgbHNuKQorCisvKgorICogUmV0dXJuIHZhbHVlcyBmb3IgdGhlIElPUF9UUllMT0NLKCkgcm91dGluZXMuCisgKi8KKyNkZWZpbmUJWEZTX0lURU1fU1VDQ0VTUwkwCisjZGVmaW5lCVhGU19JVEVNX1BJTk5FRAkJMQorI2RlZmluZQlYRlNfSVRFTV9MT0NLRUQJCTIKKyNkZWZpbmUJWEZTX0lURU1fRkxVU0hJTkcJMworI2RlZmluZSBYRlNfSVRFTV9QVVNIQlVGCTQKKworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKworLyoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gdHJhY2sgbG9nIGl0ZW1zIGFzc29jaWF0ZWQgd2l0aAorICogYSB0cmFuc2FjdGlvbi4gIEl0IHBvaW50cyB0byB0aGUgbG9nIGl0ZW0gYW5kIGtlZXBzIHNvbWUKKyAqIGZsYWdzIHRvIHRyYWNrIHRoZSBzdGF0ZSBvZiB0aGUgbG9nIGl0ZW0uICBJdCBhbHNvIHRyYWNrcworICogdGhlIGFtb3VudCBvZiBzcGFjZSBuZWVkZWQgdG8gbG9nIHRoZSBpdGVtIGl0IGRlc2NyaWJlcworICogb25jZSB3ZSBnZXQgdG8gY29tbWl0IHByb2Nlc3NpbmcgKHNlZSB4ZnNfdHJhbnNfY29tbWl0KCkpLgorICovCit0eXBlZGVmIHN0cnVjdCB4ZnNfbG9nX2l0ZW1fZGVzYyB7CisJeGZzX2xvZ19pdGVtX3QJKmxpZF9pdGVtOworCXVzaG9ydAkJbGlkX3NpemU7CisJdW5zaWduZWQgY2hhcglsaWRfZmxhZ3M7CisJdW5zaWduZWQgY2hhcglsaWRfaW5kZXg7Cit9IHhmc19sb2dfaXRlbV9kZXNjX3Q7CisKKyNkZWZpbmUgWEZTX0xJRF9ESVJUWQkJMHgxCisjZGVmaW5lIFhGU19MSURfUElOTkVECQkweDIKKyNkZWZpbmUgWEZTX0xJRF9CVUZfU1RBTEUJMHg4CisKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIG1haW50YWluIGEgY2h1bmsgbGlzdCBvZiBsb2dfaXRlbV9kZXNjCisgKiBzdHJ1Y3R1cmVzLiBUaGUgZnJlZSBmaWVsZCBpcyBhIGJpdG1hc2sgaW5kaWNhdGluZyB3aGljaCBkZXNjcmlwdG9ycworICogaW4gdGhpcyBjaHVuaydzIGFycmF5IGFyZSBmcmVlLiAgVGhlIHVudXNlZCBmaWVsZCBpcyB0aGUgZmlyc3QgdmFsdWUKKyAqIG5vdCB1c2VkIHNpbmNlIHRoaXMgY2h1bmsgd2FzIGFsbG9jYXRlZC4KKyAqLworI2RlZmluZQlYRlNfTElDX05VTV9TTE9UUwkxNQordHlwZWRlZiBzdHJ1Y3QgeGZzX2xvZ19pdGVtX2NodW5rIHsKKwlzdHJ1Y3QgeGZzX2xvZ19pdGVtX2NodW5rCSpsaWNfbmV4dDsKKwl1c2hvcnQJCQkJbGljX2ZyZWU7CisJdXNob3J0CQkJCWxpY191bnVzZWQ7CisJeGZzX2xvZ19pdGVtX2Rlc2NfdAkJbGljX2Rlc2NzW1hGU19MSUNfTlVNX1NMT1RTXTsKK30geGZzX2xvZ19pdGVtX2NodW5rX3Q7CisKKyNkZWZpbmUJWEZTX0xJQ19NQVhfU0xPVAkoWEZTX0xJQ19OVU1fU0xPVFMgLSAxKQorI2RlZmluZQlYRlNfTElDX0ZSRUVNQVNLCSgoMSA8PCBYRlNfTElDX05VTV9TTE9UUykgLSAxKQorCisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBnaXZlbiBjaHVuay4gIFNldCB0aGUgY2h1bmsncyBmcmVlIGRlc2NyaXB0b3IgbWFzaworICogdG8gaW5kaWNhdGUgdGhhdCBhbGwgZGVzY3JpcHRvcnMgYXJlIGZyZWUuICBUaGUgY2FsbGVyIGdldHMgdG8gc2V0CisgKiBsaWNfdW51c2VkIHRvIHRoZSByaWdodCB2YWx1ZSAoMCBtYXRjaGVzIGFsbCBmcmVlKS4gIFRoZQorICogbGljX2Rlc2NzLmxpZF9pbmRleCB2YWx1ZXMgYXJlIHNldCB1cCBhcyBlYWNoIGRlc2MgaXMgYWxsb2NhdGVkLgorICovCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19MSUNfSU5JVCkKK3ZvaWQgeGZzX2xpY19pbml0KHhmc19sb2dfaXRlbV9jaHVua190ICpjcCk7CisjZGVmaW5lCVhGU19MSUNfSU5JVChjcCkJeGZzX2xpY19pbml0KGNwKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0xJQ19JTklUKGNwKQkoKGNwKS0+bGljX2ZyZWUgPSBYRlNfTElDX0ZSRUVNQVNLKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19MSUNfSU5JVF9TTE9UKQordm9pZCB4ZnNfbGljX2luaXRfc2xvdCh4ZnNfbG9nX2l0ZW1fY2h1bmtfdCAqY3AsIGludCBzbG90KTsKKyNkZWZpbmUJWEZTX0xJQ19JTklUX1NMT1QoY3Asc2xvdCkJeGZzX2xpY19pbml0X3Nsb3QoY3AsIHNsb3QpCisjZWxzZQorI2RlZmluZQlYRlNfTElDX0lOSVRfU0xPVChjcCxzbG90KQlcCisJKChjcCktPmxpY19kZXNjc1tzbG90XS5saWRfaW5kZXggPSAodW5zaWduZWQgY2hhcikoc2xvdCkpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0xJQ19WQUNBTkNZKQoraW50IHhmc19saWNfdmFjYW5jeSh4ZnNfbG9nX2l0ZW1fY2h1bmtfdCAqY3ApOworI2RlZmluZQlYRlNfTElDX1ZBQ0FOQ1koY3ApCQl4ZnNfbGljX3ZhY2FuY3koY3ApCisjZWxzZQorI2RlZmluZQlYRlNfTElDX1ZBQ0FOQ1koY3ApCQkoKChjcCktPmxpY19mcmVlKSAmIFhGU19MSUNfRlJFRU1BU0spCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0xJQ19BTExfRlJFRSkKK3ZvaWQgeGZzX2xpY19hbGxfZnJlZSh4ZnNfbG9nX2l0ZW1fY2h1bmtfdCAqY3ApOworI2RlZmluZQlYRlNfTElDX0FMTF9GUkVFKGNwKQkJeGZzX2xpY19hbGxfZnJlZShjcCkKKyNlbHNlCisjZGVmaW5lCVhGU19MSUNfQUxMX0ZSRUUoY3ApCQkoKGNwKS0+bGljX2ZyZWUgPSBYRlNfTElDX0ZSRUVNQVNLKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19MSUNfQVJFX0FMTF9GUkVFKQoraW50IHhmc19saWNfYXJlX2FsbF9mcmVlKHhmc19sb2dfaXRlbV9jaHVua190ICpjcCk7CisjZGVmaW5lCVhGU19MSUNfQVJFX0FMTF9GUkVFKGNwKQl4ZnNfbGljX2FyZV9hbGxfZnJlZShjcCkKKyNlbHNlCisjZGVmaW5lCVhGU19MSUNfQVJFX0FMTF9GUkVFKGNwKQkoKChjcCktPmxpY19mcmVlICYgWEZTX0xJQ19GUkVFTUFTSykgPT1cCisJCQkJCVhGU19MSUNfRlJFRU1BU0spCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0xJQ19JU0ZSRUUpCitpbnQgeGZzX2xpY19pc2ZyZWUoeGZzX2xvZ19pdGVtX2NodW5rX3QgKmNwLCBpbnQgc2xvdCk7CisjZGVmaW5lCVhGU19MSUNfSVNGUkVFKGNwLHNsb3QpCXhmc19saWNfaXNmcmVlKGNwLHNsb3QpCisjZWxzZQorI2RlZmluZQlYRlNfTElDX0lTRlJFRShjcCxzbG90KQkoKGNwKS0+bGljX2ZyZWUgJiAoMSA8PCAoc2xvdCkpKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19MSUNfQ0xBSU0pCit2b2lkIHhmc19saWNfY2xhaW0oeGZzX2xvZ19pdGVtX2NodW5rX3QgKmNwLCBpbnQgc2xvdCk7CisjZGVmaW5lCVhGU19MSUNfQ0xBSU0oY3Asc2xvdCkJCXhmc19saWNfY2xhaW0oY3Asc2xvdCkKKyNlbHNlCisjZGVmaW5lCVhGU19MSUNfQ0xBSU0oY3Asc2xvdCkJCSgoY3ApLT5saWNfZnJlZSAmPSB+KDEgPDwgKHNsb3QpKSkKKyNlbmRpZgorI2lmIFhGU19XQU5UX0ZVTkNTIHx8IChYRlNfV0FOVF9TUEFDRSAmJiBYRlNTT19YRlNfTElDX1JFTFNFKQordm9pZCB4ZnNfbGljX3JlbHNlKHhmc19sb2dfaXRlbV9jaHVua190ICpjcCwgaW50IHNsb3QpOworI2RlZmluZQlYRlNfTElDX1JFTFNFKGNwLHNsb3QpCQl4ZnNfbGljX3JlbHNlKGNwLHNsb3QpCisjZWxzZQorI2RlZmluZQlYRlNfTElDX1JFTFNFKGNwLHNsb3QpCQkoKGNwKS0+bGljX2ZyZWUgfD0gMSA8PCAoc2xvdCkpCisjZW5kaWYKKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0xJQ19TTE9UKQoreGZzX2xvZ19pdGVtX2Rlc2NfdCAqeGZzX2xpY19zbG90KHhmc19sb2dfaXRlbV9jaHVua190ICpjcCwgaW50IHNsb3QpOworI2RlZmluZQlYRlNfTElDX1NMT1QoY3Asc2xvdCkJCXhmc19saWNfc2xvdChjcCxzbG90KQorI2Vsc2UKKyNkZWZpbmUJWEZTX0xJQ19TTE9UKGNwLHNsb3QpCQkoJigoY3ApLT5saWNfZGVzY3Nbc2xvdF0pKQorI2VuZGlmCisjaWYgWEZTX1dBTlRfRlVOQ1MgfHwgKFhGU19XQU5UX1NQQUNFICYmIFhGU1NPX1hGU19MSUNfREVTQ19UT19TTE9UKQoraW50IHhmc19saWNfZGVzY190b19zbG90KHhmc19sb2dfaXRlbV9kZXNjX3QgKmRwKTsKKyNkZWZpbmUJWEZTX0xJQ19ERVNDX1RPX1NMT1QoZHApCXhmc19saWNfZGVzY190b19zbG90KGRwKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0xJQ19ERVNDX1RPX1NMT1QoZHApCSgodWludCkoKGRwKS0+bGlkX2luZGV4KSkKKyNlbmRpZgorLyoKKyAqIENhbGN1bGF0ZSB0aGUgYWRkcmVzcyBvZiBhIGNodW5rIGdpdmVuIGEgZGVzY3JpcHRvciBwb2ludGVyOgorICogZHAgLSBkcC0+bGlkX2luZGV4IGdpdmUgdGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSBsaWNfZGVzY3MgYXJyYXkuCisgKiBGcm9tIHRoaXMgd2Ugc3VidHJhY3QgdGhlIG9mZnNldCBvZiB0aGUgbGljX2Rlc2NzIGZpZWxkIGluIGEgY2h1bmsuCisgKiBBbGwgb2YgdGhpcyB5aWVsZHMgdGhlIGFkZHJlc3Mgb2YgdGhlIGNodW5rLCB3aGljaCBpcworICogY2FzdCB0byBhIGNodW5rIHBvaW50ZXIuCisgKi8KKyNpZiBYRlNfV0FOVF9GVU5DUyB8fCAoWEZTX1dBTlRfU1BBQ0UgJiYgWEZTU09fWEZTX0xJQ19ERVNDX1RPX0NIVU5LKQoreGZzX2xvZ19pdGVtX2NodW5rX3QgKnhmc19saWNfZGVzY190b19jaHVuayh4ZnNfbG9nX2l0ZW1fZGVzY190ICpkcCk7CisjZGVmaW5lCVhGU19MSUNfREVTQ19UT19DSFVOSyhkcCkJeGZzX2xpY19kZXNjX3RvX2NodW5rKGRwKQorI2Vsc2UKKyNkZWZpbmUJWEZTX0xJQ19ERVNDX1RPX0NIVU5LKGRwKQkoKHhmc19sb2dfaXRlbV9jaHVua190KikgXAorCQkJCQkoKCh4ZnNfY2FkZHJfdCkoKGRwKSAtIChkcCktPmxpZF9pbmRleCkpIC1cCisJCQkJCSh4ZnNfY2FkZHJfdCkoKCh4ZnNfbG9nX2l0ZW1fY2h1bmtfdCopIFwKKwkJCQkJMCktPmxpY19kZXNjcykpKQorI2VuZGlmCisKKyNpZmRlZiBfX0tFUk5FTF9fCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBtYWludGFpbiBhIGxpc3Qgb2YgYmxvY2sgcmFuZ2VzIHRoYXQgaGF2ZSBiZWVuCisgKiBmcmVlZCBpbiB0aGUgdHJhbnNhY3Rpb24uICBUaGUgcmFuZ2VzIGFyZSBsaXN0ZWQgaW4gdGhlIHBlcmFnW10gYnVzeSBsaXN0CisgKiBiZXR3ZWVuIHdoZW4gdGhleSdyZSBmcmVlZCBhbmQgdGhlIHRyYW5zYWN0aW9uIGlzIGNvbW1pdHRlZCB0byBkaXNrLgorICovCisKK3R5cGVkZWYgc3RydWN0IHhmc19sb2dfYnVzeV9zbG90IHsKKwl4ZnNfYWdudW1iZXJfdAkJbGJjX2FnOworCXVzaG9ydAkJCWxiY19pZHg7CS8qIGluZGV4IGluIHBlcmFnLmJ1c3lbXSAqLworfSB4ZnNfbG9nX2J1c3lfc2xvdF90OworCisjZGVmaW5lIFhGU19MQkNfTlVNX1NMT1RTCTMxCit0eXBlZGVmIHN0cnVjdCB4ZnNfbG9nX2J1c3lfY2h1bmsgeworCXN0cnVjdCB4ZnNfbG9nX2J1c3lfY2h1bmsJKmxiY19uZXh0OworCXVpbnQJCQkJbGJjX2ZyZWU7CS8qIGJpdG1hc2sgb2YgZnJlZSBzbG90cyAqLworCXVzaG9ydAkJCQlsYmNfdW51c2VkOwkvKiBmaXJzdCB1bnVzZWQgKi8KKwl4ZnNfbG9nX2J1c3lfc2xvdF90CQlsYmNfYnVzeVtYRlNfTEJDX05VTV9TTE9UU107Cit9IHhmc19sb2dfYnVzeV9jaHVua190OworCisjZGVmaW5lCVhGU19MQkNfTUFYX1NMT1QJKFhGU19MQkNfTlVNX1NMT1RTIC0gMSkKKyNkZWZpbmUJWEZTX0xCQ19GUkVFTUFTSwkoKDFVIDw8IFhGU19MQkNfTlVNX1NMT1RTKSAtIDEpCisKKyNkZWZpbmUJWEZTX0xCQ19JTklUKGNwKQkoKGNwKS0+bGJjX2ZyZWUgPSBYRlNfTEJDX0ZSRUVNQVNLKQorI2RlZmluZQlYRlNfTEJDX0NMQUlNKGNwLCBzbG90KQkoKGNwKS0+bGJjX2ZyZWUgJj0gfigxIDw8IChzbG90KSkpCisjZGVmaW5lCVhGU19MQkNfU0xPVChjcCwgc2xvdCkJKCYoKGNwKS0+bGJjX2J1c3lbKHNsb3QpXSkpCisjZGVmaW5lCVhGU19MQkNfVkFDQU5DWShjcCkJKCgoY3ApLT5sYmNfZnJlZSkgJiBYRlNfTEJDX0ZSRUVNQVNLKQorI2RlZmluZQlYRlNfTEJDX0lTRlJFRShjcCwgc2xvdCkgKChjcCktPmxiY19mcmVlICYgKDEgPDwgKHNsb3QpKSkKKworLyoKKyAqIFRoaXMgaXMgdGhlIHR5cGUgb2YgZnVuY3Rpb24gd2hpY2ggY2FuIGJlIGdpdmVuIHRvIHhmc190cmFuc19jYWxsYmFjaygpCisgKiB0byBiZSBjYWxsZWQgdXBvbiB0aGUgdHJhbnNhY3Rpb24ncyBjb21taXQgdG8gZGlzay4KKyAqLwordHlwZWRlZiB2b2lkICgqeGZzX3RyYW5zX2NhbGxiYWNrX3QpKHN0cnVjdCB4ZnNfdHJhbnMgKiwgdm9pZCAqKTsKKworLyoKKyAqIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSBtYWludGFpbmVkIGZvciBldmVyeSBhY3RpdmUgdHJhbnNhY3Rpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IHhmc190cmFucyB7CisJdW5zaWduZWQgaW50CQl0X21hZ2ljOwkvKiBtYWdpYyBudW1iZXIgKi8KKwl4ZnNfbG9nX2NhbGxiYWNrX3QJdF9sb2djYjsJLyogbG9nIGNhbGxiYWNrIHN0cnVjdCAqLworCXN0cnVjdCB4ZnNfdHJhbnMJKnRfZm9ydzsJLyogYXN5bmMgbGlzdCBwb2ludGVycyAqLworCXN0cnVjdCB4ZnNfdHJhbnMJKnRfYmFjazsJLyogYXN5bmMgbGlzdCBwb2ludGVycyAqLworCXVuc2lnbmVkIGludAkJdF90eXBlOwkJLyogdHJhbnNhY3Rpb24gdHlwZSAqLworCXVuc2lnbmVkIGludAkJdF9sb2dfcmVzOwkvKiBhbXQgb2YgbG9nIHNwYWNlIHJlc3ZkICovCisJdW5zaWduZWQgaW50CQl0X2xvZ19jb3VudDsJLyogY291bnQgZm9yIHBlcm0gbG9nIHJlcyAqLworCXVuc2lnbmVkIGludAkJdF9ibGtfcmVzOwkvKiAjIG9mIGJsb2NrcyByZXN2ZCAqLworCXVuc2lnbmVkIGludAkJdF9ibGtfcmVzX3VzZWQ7CS8qICMgb2YgcmVzdmQgYmxvY2tzIHVzZWQgKi8KKwl1bnNpZ25lZCBpbnQJCXRfcnR4X3JlczsJLyogIyBvZiBydCBleHRlbnRzIHJlc3ZkICovCisJdW5zaWduZWQgaW50CQl0X3J0eF9yZXNfdXNlZDsJLyogIyBvZiByZXN2ZCBydCBleHRlbnRzIHVzZWQgKi8KKwl4ZnNfbG9nX3RpY2tldF90CXRfdGlja2V0OwkvKiBsb2cgbWdyIHRpY2tldCAqLworCXNlbWFfdAkJCXRfc2VtYTsJCS8qIHNlbWEgZm9yIGNvbW1pdCBjb21wbGV0aW9uICovCisJeGZzX2xzbl90CQl0X2xzbjsJCS8qIGxvZyBzZXEgbnVtIG9mIHN0YXJ0IG9mCisJCQkJCQkgKiB0cmFuc2FjdGlvbi4gKi8KKwl4ZnNfbHNuX3QJCXRfY29tbWl0X2xzbjsJLyogbG9nIHNlcSBudW0gb2YgZW5kIG9mCisJCQkJCQkgKiB0cmFuc2FjdGlvbi4gKi8KKwlzdHJ1Y3QgeGZzX21vdW50CSp0X21vdW50cDsJLyogcHRyIHRvIGZzIG1vdW50IHN0cnVjdCAqLworCXN0cnVjdCB4ZnNfZHF1b3RfYWNjdCAgICp0X2RxaW5mbzsJLyogYWNjdGluZyBpbmZvIGZvciBkcXVvdHMgKi8KKwl4ZnNfdHJhbnNfY2FsbGJhY2tfdAl0X2NhbGxiYWNrOwkvKiB0cmFuc2FjdGlvbiBjYWxsYmFjayAqLworCXZvaWQJCQkqdF9jYWxsYXJnOwkvKiBjYWxsYmFjayBhcmcgKi8KKwl1bnNpZ25lZCBpbnQJCXRfZmxhZ3M7CS8qIG1pc2MgZmxhZ3MgKi8KKwlsb25nCQkJdF9pY291bnRfZGVsdGE7CS8qIHN1cGVyYmxvY2sgaWNvdW50IGNoYW5nZSAqLworCWxvbmcJCQl0X2lmcmVlX2RlbHRhOwkvKiBzdXBlcmJsb2NrIGlmcmVlIGNoYW5nZSAqLworCWxvbmcJCQl0X2ZkYmxvY2tzX2RlbHRhOyAvKiBzdXBlcmJsb2NrIGZkYmxvY2tzIGNoZyAqLworCWxvbmcJCQl0X3Jlc19mZGJsb2Nrc19kZWx0YTsgLyogb24tZGlzayBvbmx5IGNoZyAqLworCWxvbmcJCQl0X2ZyZXh0ZW50c19kZWx0YTsvKiBzdXBlcmJsb2NrIGZyZWV4dGVudHMgY2hnKi8KKwlsb25nCQkJdF9yZXNfZnJleHRlbnRzX2RlbHRhOyAvKiBvbi1kaXNrIG9ubHkgY2hnICovCisJbG9uZwkJCXRfYWdfZnJlZWJsa3NfZGVsdGE7IC8qIGRlYnVnZ2luZyBjb3VudGVyICovCisJbG9uZwkJCXRfYWdfZmxpc3RfZGVsdGE7IC8qIGRlYnVnZ2luZyBjb3VudGVyICovCisJbG9uZwkJCXRfYWdfYnRyZWVfZGVsdGE7IC8qIGRlYnVnZ2luZyBjb3VudGVyICovCisJbG9uZwkJCXRfZGJsb2Nrc19kZWx0YTsvKiBzdXBlcmJsb2NrIGRibG9ja3MgY2hhbmdlICovCisJbG9uZwkJCXRfYWdjb3VudF9kZWx0YTsvKiBzdXBlcmJsb2NrIGFnY291bnQgY2hhbmdlICovCisJbG9uZwkJCXRfaW1heHBjdF9kZWx0YTsvKiBzdXBlcmJsb2NrIGltYXhwY3QgY2hhbmdlICovCisJbG9uZwkJCXRfcmV4dHNpemVfZGVsdGE7Lyogc3VwZXJibG9jayByZXh0c2l6ZSBjaGcgKi8KKwlsb25nCQkJdF9yYm1ibG9ja3NfZGVsdGE7Lyogc3VwZXJibG9jayByYm1ibG9ja3MgY2hnICovCisJbG9uZwkJCXRfcmJsb2Nrc19kZWx0YTsvKiBzdXBlcmJsb2NrIHJibG9ja3MgY2hhbmdlICovCisJbG9uZwkJCXRfcmV4dGVudHNfZGVsdGE7Lyogc3VwZXJibG9ja3MgcmV4dGVudHMgY2hnICovCisJbG9uZwkJCXRfcmV4dHNsb2dfZGVsdGE7Lyogc3VwZXJibG9ja3MgcmV4dHNsb2cgY2hnICovCisJdW5zaWduZWQgaW50CQl0X2l0ZW1zX2ZyZWU7CS8qIGxvZyBpdGVtIGRlc2NzIGZyZWUgKi8KKwl4ZnNfbG9nX2l0ZW1fY2h1bmtfdAl0X2l0ZW1zOwkvKiBmaXJzdCBsb2cgaXRlbSBkZXNjIGNodW5rICovCisJeGZzX3RyYW5zX2hlYWRlcl90CXRfaGVhZGVyOwkvKiBoZWFkZXIgZm9yIGluLWxvZyB0cmFucyAqLworCXVuc2lnbmVkIGludAkJdF9idXN5X2ZyZWU7CS8qIGJ1c3kgZGVzY3MgZnJlZSAqLworCXhmc19sb2dfYnVzeV9jaHVua190CXRfYnVzeTsJCS8qIGJ1c3kvYXN5bmMgZnJlZSBibG9ja3MgKi8KKyAgICAgICAgeGZzX3BmbGFnc190ICAgICAgICAgICAgdF9wZmxhZ3M7ICAgICAgIC8qIHNhdmVkIHBmbGFncyBzdGF0ZSAqLworfSB4ZnNfdHJhbnNfdDsKKworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKworCisjZGVmaW5lCVhGU19UUkFOU19NQUdJQwkJMHg1NDUyNDE0RQkvKiAnVFJBTicgKi8KKy8qCisgKiBWYWx1ZXMgZm9yIHRfZmxhZ3MuCisgKi8KKyNkZWZpbmUJWEZTX1RSQU5TX0RJUlRZCQkweDAxCS8qIHNvbWV0aGluZyBuZWVkcyB0byBiZSBsb2dnZWQgKi8KKyNkZWZpbmUJWEZTX1RSQU5TX1NCX0RJUlRZCTB4MDIJLyogc3VwZXJibG9jayBpcyBtb2RpZmllZCAqLworI2RlZmluZQlYRlNfVFJBTlNfUEVSTV9MT0dfUkVTCTB4MDQJLyogeGFjdCB0b29rIGEgcGVybWFuZW50IGxvZyByZXMgKi8KKyNkZWZpbmUJWEZTX1RSQU5TX1NZTkMJCTB4MDgJLyogbWFrZSBjb21taXQgc3luY2hyb25vdXMgKi8KKyNkZWZpbmUgWEZTX1RSQU5TX0RRX0RJUlRZCTB4MTAJLyogYXQgbGVhc3Qgb25lIGRxdW90IGluIHRyeCBkaXJ0eSAqLworI2RlZmluZSBYRlNfVFJBTlNfUkVTRVJWRQkweDIwICAgIC8qIE9LIHRvIHVzZSByZXNlcnZlZCBkYXRhIGJsb2NrcyAqLworCisvKgorICogVmFsdWVzIGZvciBjYWxsIGZsYWdzIHBhcmFtZXRlci4KKyAqLworI2RlZmluZQlYRlNfVFJBTlNfTk9TTEVFUAkJMHgxCisjZGVmaW5lCVhGU19UUkFOU19XQUlUCQkJMHgyCisjZGVmaW5lCVhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMJMHg0CisjZGVmaW5lCVhGU19UUkFOU19BQk9SVAkJCTB4OAorCisvKgorICogRmllbGQgdmFsdWVzIGZvciB4ZnNfdHJhbnNfbW9kX3NiLgorICovCisjZGVmaW5lCVhGU19UUkFOU19TQl9JQ09VTlQJCTB4MDAwMDAwMDEKKyNkZWZpbmUJWEZTX1RSQU5TX1NCX0lGUkVFCQkweDAwMDAwMDAyCisjZGVmaW5lCVhGU19UUkFOU19TQl9GREJMT0NLUwkJMHgwMDAwMDAwNAorI2RlZmluZQlYRlNfVFJBTlNfU0JfUkVTX0ZEQkxPQ0tTCTB4MDAwMDAwMDgKKyNkZWZpbmUJWEZTX1RSQU5TX1NCX0ZSRVhURU5UUwkJMHgwMDAwMDAxMAorI2RlZmluZQlYRlNfVFJBTlNfU0JfUkVTX0ZSRVhURU5UUwkweDAwMDAwMDIwCisjZGVmaW5lCVhGU19UUkFOU19TQl9EQkxPQ0tTCQkweDAwMDAwMDQwCisjZGVmaW5lCVhGU19UUkFOU19TQl9BR0NPVU5UCQkweDAwMDAwMDgwCisjZGVmaW5lCVhGU19UUkFOU19TQl9JTUFYUENUCQkweDAwMDAwMTAwCisjZGVmaW5lCVhGU19UUkFOU19TQl9SRVhUU0laRQkJMHgwMDAwMDIwMAorI2RlZmluZQlYRlNfVFJBTlNfU0JfUkJNQkxPQ0tTCQkweDAwMDAwNDAwCisjZGVmaW5lCVhGU19UUkFOU19TQl9SQkxPQ0tTCQkweDAwMDAwODAwCisjZGVmaW5lCVhGU19UUkFOU19TQl9SRVhURU5UUwkJMHgwMDAwMTAwMAorI2RlZmluZQlYRlNfVFJBTlNfU0JfUkVYVFNMT0cJCTB4MDAwMDIwMDAKKworCisvKgorICogVmFyaW91cyBsb2cgcmVzZXJ2YXRpb24gdmFsdWVzLgorICogVGhlc2UgYXJlIGJhc2VkIG9uIHRoZSBzaXplIG9mIHRoZSBmaWxlIHN5c3RlbSBibG9jaworICogYmVjYXVzZSB0aGF0IGlzIHdoYXQgbW9zdCB0cmFuc2FjdGlvbnMgbWFuaXB1bGF0ZS4KKyAqIEVhY2ggYWRkcyBpbiBhbiBhZGRpdGlvbmFsIDEyOCBieXRlcyBwZXIgaXRlbSBsb2dnZWQgdG8KKyAqIHRyeSB0byBhY2NvdW50IGZvciB0aGUgb3ZlcmhlYWQgb2YgdGhlIHRyYW5zYWN0aW9uIG1lY2hhbmlzbS4KKyAqCisgKiBOb3RlOgorICogTW9zdCBvZiB0aGUgcmVzZXJ2YXRpb25zIHVuZGVyZXN0aW1hdGUgdGhlIG51bWJlciBvZiBhbGxvY2F0aW9uCisgKiBncm91cHMgaW50byB3aGljaCB0aGV5IGNvdWxkIGZyZWUgZXh0ZW50cyBpbiB0aGUgeGZzX2JtYXBfZmluaXNoKCkKKyAqIGNhbGwuICBUaGlzIGlzIGJlY2F1c2UgdGhlIG51bWJlciBpbiB0aGUgd29yc3QgY2FzZSBpcyBxdWl0ZSBoaWdoCisgKiBhbmQgcXVpdGUgdW51c3VhbC4gIEluIG9yZGVyIHRvIGZpeCB0aGlzIHdlIG5lZWQgdG8gY2hhbmdlCisgKiB4ZnNfYm1hcF9maW5pc2goKSB0byBmcmVlIGV4dGVudHMgaW4gb25seSBhIHNpbmdsZSBBRyBhdCBhIHRpbWUuCisgKiBUaGlzIHdpbGwgcmVxdWlyZSBjaGFuZ2VzIHRvIHRoZSBFRkkgY29kZSBhcyB3ZWxsLCBob3dldmVyLCBzbyB0aGF0CisgKiB0aGUgRUZJIGZvciB0aGUgZXh0ZW50cyBub3QgZnJlZWQgaXMgbG9nZ2VkIGFnYWluIGluIGVhY2ggdHJhbnNhY3Rpb24uCisgKiBTZWUgYnVnIDI2MTkxNy4KKyAqLworCisvKgorICogUGVyLWV4dGVudCBsb2cgcmVzZXJ2YXRpb24gZm9yIHRoZSBhbGxvY2F0aW9uIGJ0cmVlIGNoYW5nZXMKKyAqIGludm9sdmVkIGluIGZyZWVpbmcgb3IgYWxsb2NhdGluZyBhbiBleHRlbnQuCisgKiAyIHRyZWVzICogKDIgYmxvY2tzL2xldmVsICogbWF4IGRlcHRoIC0gMSkgKiBibG9jayBzaXplCisgKi8KKyNkZWZpbmUJWEZTX0FMTE9DRlJFRV9MT0dfUkVTKG1wLG54KSBcCisJKChueCkgKiAoMiAqIFhGU19GU0JfVE9fQigobXApLCAyICogWEZTX0FHX01BWExFVkVMUyhtcCkgLSAxKSkpCisjZGVmaW5lCVhGU19BTExPQ0ZSRUVfTE9HX0NPVU5UKG1wLG54KSBcCisJKChueCkgKiAoMiAqICgyICogWEZTX0FHX01BWExFVkVMUyhtcCkgLSAxKSkpCisKKy8qCisgKiBQZXItZGlyZWN0b3J5IGxvZyByZXNlcnZhdGlvbiBmb3IgYW55IGRpcmVjdG9yeSBjaGFuZ2UuCisgKiBkaXIgYmxvY2tzOiAoMSBidHJlZSBibG9jayBwZXIgbGV2ZWwgKyBkYXRhIGJsb2NrICsgZnJlZSBibG9jaykgKiBkYmxvY2sgc2l6ZQorICogYm1hcCBidHJlZTogKGxldmVscyArIDIpICogbWF4IGRlcHRoICogYmxvY2sgc2l6ZQorICogdjIgZGlyZWN0b3J5IGJsb2NrcyBjYW4gYmUgZnJhZ21lbnRlZCBiZWxvdyB0aGUgZGlyYmxrc2l6ZSBkb3duIHRvIHRoZSBmc2IKKyAqIHNpemUsIHNvIGFjY291bnQgZm9yIHRoYXQgaW4gdGhlIERBRU5URVIgbWFjcm9zLgorICovCisjZGVmaW5lCVhGU19ESVJPUF9MT0dfUkVTKG1wKQlcCisJKFhGU19GU0JfVE9fQihtcCwgWEZTX0RBRU5URVJfQkxPQ0tTKG1wLCBYRlNfREFUQV9GT1JLKSkgKyBcCisJIChYRlNfRlNCX1RPX0IobXAsIFhGU19EQUVOVEVSX0JNQVBTKG1wLCBYRlNfREFUQV9GT1JLKSArIDEpKSkKKyNkZWZpbmUJWEZTX0RJUk9QX0xPR19DT1VOVChtcCkJXAorCShYRlNfREFFTlRFUl9CTE9DS1MobXAsIFhGU19EQVRBX0ZPUkspICsgXAorCSBYRlNfREFFTlRFUl9CTUFQUyhtcCwgWEZTX0RBVEFfRk9SSykgKyAxKQorCisvKgorICogSW4gYSB3cml0ZSB0cmFuc2FjdGlvbiB3ZSBjYW4gYWxsb2NhdGUgYSBtYXhpbXVtIG9mIDIKKyAqIGV4dGVudHMuICBUaGlzIGdpdmVzOgorICogICAgdGhlIGlub2RlIGdldHRpbmcgdGhlIG5ldyBleHRlbnRzOiBpbm9kZSBzaXplCisgKiAgICB0aGUgaW5vZGVcJ3MgYm1hcCBidHJlZTogbWF4IGRlcHRoICogYmxvY2sgc2l6ZQorICogICAgdGhlIGFnZnMgb2YgdGhlIGFncyBmcm9tIHdoaWNoIHRoZSBleHRlbnRzIGFyZSBhbGxvY2F0ZWQ6IDIgKiBzZWN0b3IKKyAqICAgIHRoZSBzdXBlcmJsb2NrIGZyZWUgYmxvY2sgY291bnRlcjogc2VjdG9yIHNpemUKKyAqICAgIHRoZSBhbGxvY2F0aW9uIGJ0cmVlczogMiBleHRzICogMiB0cmVlcyAqICgyICogbWF4IGRlcHRoIC0gMSkgKiBibG9jayBzaXplCisgKiBBbmQgdGhlIGJtYXBfZmluaXNoIHRyYW5zYWN0aW9uIGNhbiBmcmVlIGJtYXAgYmxvY2tzIGluIGEgam9pbjoKKyAqICAgIHRoZSBhZ2ZzIG9mIHRoZSBhZ3MgY29udGFpbmluZyB0aGUgYmxvY2tzOiAyICogc2VjdG9yIHNpemUKKyAqICAgIHRoZSBhZ2ZscyBvZiB0aGUgYWdzIGNvbnRhaW5pbmcgdGhlIGJsb2NrczogMiAqIHNlY3RvciBzaXplCisgKiAgICB0aGUgc3VwZXIgYmxvY2sgZnJlZSBibG9jayBjb3VudGVyOiBzZWN0b3Igc2l6ZQorICogICAgdGhlIGFsbG9jYXRpb24gYnRyZWVzOiAyIGV4dHMgKiAyIHRyZWVzICogKDIgKiBtYXggZGVwdGggLSAxKSAqIGJsb2NrIHNpemUKKyAqLworI2RlZmluZSBYRlNfQ0FMQ19XUklURV9MT0dfUkVTKG1wKSBcCisJKE1BWCggXAorCSAoKG1wKS0+bV9zYi5zYl9pbm9kZXNpemUgKyBcCisJICBYRlNfRlNCX1RPX0IoKG1wKSwgWEZTX0JNX01BWExFVkVMUyhtcCwgWEZTX0RBVEFfRk9SSykpICsgXAorCSAgKDIgKiAobXApLT5tX3NiLnNiX3NlY3RzaXplKSArIFwKKwkgIChtcCktPm1fc2Iuc2Jfc2VjdHNpemUgKyBcCisJICBYRlNfQUxMT0NGUkVFX0xPR19SRVMobXAsIDIpICsgXAorCSAgKDEyOCAqICg0ICsgWEZTX0JNX01BWExFVkVMUyhtcCwgWEZTX0RBVEFfRk9SSykgKyBYRlNfQUxMT0NGUkVFX0xPR19DT1VOVChtcCwgMikpKSksXAorCSAoKDIgKiAobXApLT5tX3NiLnNiX3NlY3RzaXplKSArIFwKKwkgICgyICogKG1wKS0+bV9zYi5zYl9zZWN0c2l6ZSkgKyBcCisJICAobXApLT5tX3NiLnNiX3NlY3RzaXplICsgXAorCSAgWEZTX0FMTE9DRlJFRV9MT0dfUkVTKG1wLCAyKSArIFwKKwkgICgxMjggKiAoNSArIFhGU19BTExPQ0ZSRUVfTE9HX0NPVU5UKG1wLCAyKSkpKSkpCisKKyNkZWZpbmUJWEZTX1dSSVRFX0xPR19SRVMobXApCSgobXApLT5tX3Jlc2VydmF0aW9ucy50cl93cml0ZSkKKworLyoKKyAqIEluIHRydW5jYXRpbmcgYSBmaWxlIHdlIGZyZWUgdXAgdG8gdHdvIGV4dGVudHMgYXQgb25jZS4gIFdlIGNhbiBtb2RpZnk6CisgKiAgICB0aGUgaW5vZGUgYmVpbmcgdHJ1bmNhdGVkOiBpbm9kZSBzaXplCisgKiAgICB0aGUgaW5vZGVcJ3MgYm1hcCBidHJlZTogKG1heCBkZXB0aCArIDEpICogYmxvY2sgc2l6ZQorICogQW5kIHRoZSBibWFwX2ZpbmlzaCB0cmFuc2FjdGlvbiBjYW4gZnJlZSB0aGUgYmxvY2tzIGFuZCBibWFwIGJsb2NrczoKKyAqICAgIHRoZSBhZ2YgZm9yIGVhY2ggb2YgdGhlIGFnczogNCAqIHNlY3RvciBzaXplCisgKiAgICB0aGUgYWdmbCBmb3IgZWFjaCBvZiB0aGUgYWdzOiA0ICogc2VjdG9yIHNpemUKKyAqICAgIHRoZSBzdXBlciBibG9jayB0byByZWZsZWN0IHRoZSBmcmVlZCBibG9ja3M6IHNlY3RvciBzaXplCisgKiAgICB3b3JzdCBjYXNlIHNwbGl0IGluIGFsbG9jYXRpb24gYnRyZWVzIHBlciBleHRlbnQgYXNzdW1pbmcgNCBleHRlbnRzOgorICoJCTQgZXh0cyAqIDIgdHJlZXMgKiAoMiAqIG1heCBkZXB0aCAtIDEpICogYmxvY2sgc2l6ZQorICogICAgdGhlIGlub2RlIGJ0cmVlOiBtYXggZGVwdGggKiBibG9ja3NpemUKKyAqICAgIHRoZSBhbGxvY2F0aW9uIGJ0cmVlczogMiB0cmVlcyAqIChtYXggZGVwdGggLSAxKSAqIGJsb2NrIHNpemUKKyAqLworI2RlZmluZQlYRlNfQ0FMQ19JVFJVTkNBVEVfTE9HX1JFUyhtcCkgXAorCShNQVgoIFwKKwkgKChtcCktPm1fc2Iuc2JfaW5vZGVzaXplICsgXAorCSAgWEZTX0ZTQl9UT19CKChtcCksIFhGU19CTV9NQVhMRVZFTFMobXAsIFhGU19EQVRBX0ZPUkspICsgMSkgKyBcCisJICAoMTI4ICogKDIgKyBYRlNfQk1fTUFYTEVWRUxTKG1wLCBYRlNfREFUQV9GT1JLKSkpKSwgXAorCSAoKDQgKiAobXApLT5tX3NiLnNiX3NlY3RzaXplKSArIFwKKwkgICg0ICogKG1wKS0+bV9zYi5zYl9zZWN0c2l6ZSkgKyBcCisJICAobXApLT5tX3NiLnNiX3NlY3RzaXplICsgXAorCSAgWEZTX0FMTE9DRlJFRV9MT0dfUkVTKG1wLCA0KSArIFwKKwkgICgxMjggKiAoOSArIFhGU19BTExPQ0ZSRUVfTE9HX0NPVU5UKG1wLCA0KSkpICsgXAorCSAgKDEyOCAqIDUpICsgXAorCSAgWEZTX0FMTE9DRlJFRV9MT0dfUkVTKG1wLCAxKSArIFwKKwkgICAoMTI4ICogKDIgKyBYRlNfSUFMTE9DX0JMT0NLUyhtcCkgKyBYRlNfSU5fTUFYTEVWRUxTKG1wKSArIFwKKwkgICAgWEZTX0FMTE9DRlJFRV9MT0dfQ09VTlQobXAsIDEpKSkpKSkKKworI2RlZmluZQlYRlNfSVRSVU5DQVRFX0xPR19SRVMobXApICAgKChtcCktPm1fcmVzZXJ2YXRpb25zLnRyX2l0cnVuY2F0ZSkKKworLyoKKyAqIEluIHJlbmFtaW5nIGEgZmlsZXMgd2UgY2FuIG1vZGlmeToKKyAqICAgIHRoZSBmb3VyIGlub2RlcyBpbnZvbHZlZDogNCAqIGlub2RlIHNpemUKKyAqICAgIHRoZSB0d28gZGlyZWN0b3J5IGJ0cmVlczogMiAqIChtYXggZGVwdGggKyB2MikgKiBkaXIgYmxvY2sgc2l6ZQorICogICAgdGhlIHR3byBkaXJlY3RvcnkgYm1hcCBidHJlZXM6IDIgKiBtYXggZGVwdGggKiBibG9jayBzaXplCisgKiBBbmQgdGhlIGJtYXBfZmluaXNoIHRyYW5zYWN0aW9uIGNhbiBmcmVlIGRpciBhbmQgYm1hcCBibG9ja3MgKHR3byBzZXRzCisgKglvZiBibWFwIGJsb2NrcykgZ2l2aW5nOgorICogICAgdGhlIGFnZiBmb3IgdGhlIGFncyBpbiB3aGljaCB0aGUgYmxvY2tzIGxpdmU6IDMgKiBzZWN0b3Igc2l6ZQorICogICAgdGhlIGFnZmwgZm9yIHRoZSBhZ3MgaW4gd2hpY2ggdGhlIGJsb2NrcyBsaXZlOiAzICogc2VjdG9yIHNpemUKKyAqICAgIHRoZSBzdXBlcmJsb2NrIGZvciB0aGUgZnJlZSBibG9jayBjb3VudDogc2VjdG9yIHNpemUKKyAqICAgIHRoZSBhbGxvY2F0aW9uIGJ0cmVlczogMyBleHRzICogMiB0cmVlcyAqICgyICogbWF4IGRlcHRoIC0gMSkgKiBibG9jayBzaXplCisgKi8KKyNkZWZpbmUJWEZTX0NBTENfUkVOQU1FX0xPR19SRVMobXApIFwKKwkoTUFYKCBcCisJICgoNCAqIChtcCktPm1fc2Iuc2JfaW5vZGVzaXplKSArIFwKKwkgICgyICogWEZTX0RJUk9QX0xPR19SRVMobXApKSArIFwKKwkgICgxMjggKiAoNCArIDIgKiBYRlNfRElST1BfTE9HX0NPVU5UKG1wKSkpKSwgXAorCSAoKDMgKiAobXApLT5tX3NiLnNiX3NlY3RzaXplKSArIFwKKwkgICgzICogKG1wKS0+bV9zYi5zYl9zZWN0c2l6ZSkgKyBcCisJICAobXApLT5tX3NiLnNiX3NlY3RzaXplICsgXAorCSAgWEZTX0FMTE9DRlJFRV9MT0dfUkVTKG1wLCAzKSArIFwKKwkgICgxMjggKiAoNyArIFhGU19BTExPQ0ZSRUVfTE9HX0NPVU5UKG1wLCAzKSkpKSkpCisKKyNkZWZpbmUJWEZTX1JFTkFNRV9MT0dfUkVTKG1wKQkoKG1wKS0+bV9yZXNlcnZhdGlvbnMudHJfcmVuYW1lKQorCisvKgorICogRm9yIGNyZWF0aW5nIGEgbGluayB0byBhbiBpbm9kZToKKyAqICAgIHRoZSBwYXJlbnQgZGlyZWN0b3J5IGlub2RlOiBpbm9kZSBzaXplCisgKiAgICB0aGUgbGlua2VkIGlub2RlOiBpbm9kZSBzaXplCisgKiAgICB0aGUgZGlyZWN0b3J5IGJ0cmVlIGNvdWxkIHNwbGl0OiAobWF4IGRlcHRoICsgdjIpICogZGlyIGJsb2NrIHNpemUKKyAqICAgIHRoZSBkaXJlY3RvcnkgYm1hcCBidHJlZSBjb3VsZCBqb2luIG9yIHNwbGl0OiAobWF4IGRlcHRoICsgdjIpICogYmxvY2tzaXplCisgKiBBbmQgdGhlIGJtYXBfZmluaXNoIHRyYW5zYWN0aW9uIGNhbiBmcmVlIHNvbWUgYm1hcCBibG9ja3MgZ2l2aW5nOgorICogICAgdGhlIGFnZiBmb3IgdGhlIGFnIGluIHdoaWNoIHRoZSBibG9ja3MgbGl2ZTogc2VjdG9yIHNpemUKKyAqICAgIHRoZSBhZ2ZsIGZvciB0aGUgYWcgaW4gd2hpY2ggdGhlIGJsb2NrcyBsaXZlOiBzZWN0b3Igc2l6ZQorICogICAgdGhlIHN1cGVyYmxvY2sgZm9yIHRoZSBmcmVlIGJsb2NrIGNvdW50OiBzZWN0b3Igc2l6ZQorICogICAgdGhlIGFsbG9jYXRpb24gYnRyZWVzOiAyIHRyZWVzICogKDIgKiBtYXggZGVwdGggLSAxKSAqIGJsb2NrIHNpemUKKyAqLworI2RlZmluZQlYRlNfQ0FMQ19MSU5LX0xPR19SRVMobXApIFwKKwkoTUFYKCBcCisJICgobXApLT5tX3NiLnNiX2lub2Rlc2l6ZSArIFwKKwkgIChtcCktPm1fc2Iuc2JfaW5vZGVzaXplICsgXAorCSAgWEZTX0RJUk9QX0xPR19SRVMobXApICsgXAorCSAgKDEyOCAqICgyICsgWEZTX0RJUk9QX0xPR19DT1VOVChtcCkpKSksIFwKKwkgKChtcCktPm1fc2Iuc2Jfc2VjdHNpemUgKyBcCisJICAobXApLT5tX3NiLnNiX3NlY3RzaXplICsgXAorCSAgKG1wKS0+bV9zYi5zYl9zZWN0c2l6ZSArIFwKKwkgIFhGU19BTExPQ0ZSRUVfTE9HX1JFUyhtcCwgMSkgKyBcCisJICAoMTI4ICogKDMgKyBYRlNfQUxMT0NGUkVFX0xPR19DT1VOVChtcCwgMSkpKSkpKQorCisjZGVmaW5lCVhGU19MSU5LX0xPR19SRVMobXApCSgobXApLT5tX3Jlc2VydmF0aW9ucy50cl9saW5rKQorCisvKgorICogRm9yIHJlbW92aW5nIGEgZGlyZWN0b3J5IGVudHJ5IHdlIGNhbiBtb2RpZnk6CisgKiAgICB0aGUgcGFyZW50IGRpcmVjdG9yeSBpbm9kZTogaW5vZGUgc2l6ZQorICogICAgdGhlIHJlbW92ZWQgaW5vZGU6IGlub2RlIHNpemUKKyAqICAgIHRoZSBkaXJlY3RvcnkgYnRyZWUgY291bGQgam9pbjogKG1heCBkZXB0aCArIHYyKSAqIGRpciBibG9jayBzaXplCisgKiAgICB0aGUgZGlyZWN0b3J5IGJtYXAgYnRyZWUgY291bGQgam9pbiBvciBzcGxpdDogKG1heCBkZXB0aCArIHYyKSAqIGJsb2Nrc2l6ZQorICogQW5kIHRoZSBibWFwX2ZpbmlzaCB0cmFuc2FjdGlvbiBjYW4gZnJlZSB0aGUgZGlyIGFuZCBibWFwIGJsb2NrcyBnaXZpbmc6CisgKiAgICB0aGUgYWdmIGZvciB0aGUgYWcgaW4gd2hpY2ggdGhlIGJsb2NrcyBsaXZlOiAyICogc2VjdG9yIHNpemUKKyAqICAgIHRoZSBhZ2ZsIGZvciB0aGUgYWcgaW4gd2hpY2ggdGhlIGJsb2NrcyBsaXZlOiAyICogc2VjdG9yIHNpemUKKyAqICAgIHRoZSBzdXBlcmJsb2NrIGZvciB0aGUgZnJlZSBibG9jayBjb3VudDogc2VjdG9yIHNpemUKKyAqICAgIHRoZSBhbGxvY2F0aW9uIGJ0cmVlczogMiBleHRzICogMiB0cmVlcyAqICgyICogbWF4IGRlcHRoIC0gMSkgKiBibG9jayBzaXplCisgKi8KKyNkZWZpbmUJWEZTX0NBTENfUkVNT1ZFX0xPR19SRVMobXApCVwKKwkoTUFYKCBcCisJICgobXApLT5tX3NiLnNiX2lub2Rlc2l6ZSArIFwKKwkgIChtcCktPm1fc2Iuc2JfaW5vZGVzaXplICsgXAorCSAgWEZTX0RJUk9QX0xPR19SRVMobXApICsgXAorCSAgKDEyOCAqICgyICsgWEZTX0RJUk9QX0xPR19DT1VOVChtcCkpKSksIFwKKwkgKCgyICogKG1wKS0+bV9zYi5zYl9zZWN0c2l6ZSkgKyBcCisJICAoMiAqIChtcCktPm1fc2Iuc2Jfc2VjdHNpemUpICsgXAorCSAgKG1wKS0+bV9zYi5zYl9zZWN0c2l6ZSArIFwKKwkgIFhGU19BTExPQ0ZSRUVfTE9HX1JFUyhtcCwgMikgKyBcCisJICAoMTI4ICogKDUgKyBYRlNfQUxMT0NGUkVFX0xPR19DT1VOVChtcCwgMikpKSkpKQorCisjZGVmaW5lCVhGU19SRU1PVkVfTE9HX1JFUyhtcCkJKChtcCktPm1fcmVzZXJ2YXRpb25zLnRyX3JlbW92ZSkKKworLyoKKyAqIEZvciBzeW1saW5rIHdlIGNhbiBtb2RpZnk6CisgKiAgICB0aGUgcGFyZW50IGRpcmVjdG9yeSBpbm9kZTogaW5vZGUgc2l6ZQorICogICAgdGhlIG5ldyBpbm9kZTogaW5vZGUgc2l6ZQorICogICAgdGhlIGlub2RlIGJ0cmVlIGVudHJ5OiAxIGJsb2NrCisgKiAgICB0aGUgZGlyZWN0b3J5IGJ0cmVlOiAobWF4IGRlcHRoICsgdjIpICogZGlyIGJsb2NrIHNpemUKKyAqICAgIHRoZSBkaXJlY3RvcnkgaW5vZGVcJ3MgYm1hcCBidHJlZTogKG1heCBkZXB0aCArIHYyKSAqIGJsb2NrIHNpemUKKyAqICAgIHRoZSBibG9ja3MgZm9yIHRoZSBzeW1saW5rOiAxIEtCCisgKiBPciBpbiB0aGUgZmlyc3QgeGFjdCB3ZSBhbGxvY2F0ZSBzb21lIGlub2RlcyBnaXZpbmc6CisgKiAgICB0aGUgYWdpIGFuZCBhZ2Ygb2YgdGhlIGFnIGdldHRpbmcgdGhlIG5ldyBpbm9kZXM6IDIgKiBzZWN0b3JzaXplCisgKiAgICB0aGUgaW5vZGUgYmxvY2tzIGFsbG9jYXRlZDogWEZTX0lBTExPQ19CTE9DS1MgKiBibG9ja3NpemUKKyAqICAgIHRoZSBpbm9kZSBidHJlZTogbWF4IGRlcHRoICogYmxvY2tzaXplCisgKiAgICB0aGUgYWxsb2NhdGlvbiBidHJlZXM6IDIgdHJlZXMgKiAoMiAqIG1heCBkZXB0aCAtIDEpICogYmxvY2sgc2l6ZQorICovCisjZGVmaW5lCVhGU19DQUxDX1NZTUxJTktfTE9HX1JFUyhtcCkJCVwKKwkoTUFYKCBcCisJICgobXApLT5tX3NiLnNiX2lub2Rlc2l6ZSArIFwKKwkgIChtcCktPm1fc2Iuc2JfaW5vZGVzaXplICsgXAorCSAgWEZTX0ZTQl9UT19CKG1wLCAxKSArIFwKKwkgIFhGU19ESVJPUF9MT0dfUkVTKG1wKSArIFwKKwkgIDEwMjQgKyBcCisJICAoMTI4ICogKDQgKyBYRlNfRElST1BfTE9HX0NPVU5UKG1wKSkpKSwgXAorCSAoMiAqIChtcCktPm1fc2Iuc2Jfc2VjdHNpemUgKyBcCisJICBYRlNfRlNCX1RPX0IoKG1wKSwgWEZTX0lBTExPQ19CTE9DS1MoKG1wKSkpICsgXAorCSAgWEZTX0ZTQl9UT19CKChtcCksIFhGU19JTl9NQVhMRVZFTFMobXApKSArIFwKKwkgIFhGU19BTExPQ0ZSRUVfTE9HX1JFUyhtcCwgMSkgKyBcCisJICAoMTI4ICogKDIgKyBYRlNfSUFMTE9DX0JMT0NLUyhtcCkgKyBYRlNfSU5fTUFYTEVWRUxTKG1wKSArIFwKKwkgICBYRlNfQUxMT0NGUkVFX0xPR19DT1VOVChtcCwgMSkpKSkpKQorCisjZGVmaW5lCVhGU19TWU1MSU5LX0xPR19SRVMobXApCSgobXApLT5tX3Jlc2VydmF0aW9ucy50cl9zeW1saW5rKQorCisvKgorICogRm9yIGNyZWF0ZSB3ZSBjYW4gbW9kaWZ5OgorICogICAgdGhlIHBhcmVudCBkaXJlY3RvcnkgaW5vZGU6IGlub2RlIHNpemUKKyAqICAgIHRoZSBuZXcgaW5vZGU6IGlub2RlIHNpemUKKyAqICAgIHRoZSBpbm9kZSBidHJlZSBlbnRyeTogYmxvY2sgc2l6ZQorICogICAgdGhlIHN1cGVyYmxvY2sgZm9yIHRoZSBubGluayBmbGFnOiBzZWN0b3Igc2l6ZQorICogICAgdGhlIGRpcmVjdG9yeSBidHJlZTogKG1heCBkZXB0aCArIHYyKSAqIGRpciBibG9jayBzaXplCisgKiAgICB0aGUgZGlyZWN0b3J5IGlub2RlXCdzIGJtYXAgYnRyZWU6IChtYXggZGVwdGggKyB2MikgKiBibG9jayBzaXplCisgKiBPciBpbiB0aGUgZmlyc3QgeGFjdCB3ZSBhbGxvY2F0ZSBzb21lIGlub2RlcyBnaXZpbmc6CisgKiAgICB0aGUgYWdpIGFuZCBhZ2Ygb2YgdGhlIGFnIGdldHRpbmcgdGhlIG5ldyBpbm9kZXM6IDIgKiBzZWN0b3JzaXplCisgKiAgICB0aGUgc3VwZXJibG9jayBmb3IgdGhlIG5saW5rIGZsYWc6IHNlY3RvciBzaXplCisgKiAgICB0aGUgaW5vZGUgYmxvY2tzIGFsbG9jYXRlZDogWEZTX0lBTExPQ19CTE9DS1MgKiBibG9ja3NpemUKKyAqICAgIHRoZSBpbm9kZSBidHJlZTogbWF4IGRlcHRoICogYmxvY2tzaXplCisgKiAgICB0aGUgYWxsb2NhdGlvbiBidHJlZXM6IDIgdHJlZXMgKiAobWF4IGRlcHRoIC0gMSkgKiBibG9jayBzaXplCisgKi8KKyNkZWZpbmUJWEZTX0NBTENfQ1JFQVRFX0xPR19SRVMobXApCQlcCisJKE1BWCggXAorCSAoKG1wKS0+bV9zYi5zYl9pbm9kZXNpemUgKyBcCisJICAobXApLT5tX3NiLnNiX2lub2Rlc2l6ZSArIFwKKwkgIChtcCktPm1fc2Iuc2Jfc2VjdHNpemUgKyBcCisJICBYRlNfRlNCX1RPX0IobXAsIDEpICsgXAorCSAgWEZTX0RJUk9QX0xPR19SRVMobXApICsgXAorCSAgKDEyOCAqICgzICsgWEZTX0RJUk9QX0xPR19DT1VOVChtcCkpKSksIFwKKwkgKDMgKiAobXApLT5tX3NiLnNiX3NlY3RzaXplICsgXAorCSAgWEZTX0ZTQl9UT19CKChtcCksIFhGU19JQUxMT0NfQkxPQ0tTKChtcCkpKSArIFwKKwkgIFhGU19GU0JfVE9fQigobXApLCBYRlNfSU5fTUFYTEVWRUxTKG1wKSkgKyBcCisJICBYRlNfQUxMT0NGUkVFX0xPR19SRVMobXAsIDEpICsgXAorCSAgKDEyOCAqICgyICsgWEZTX0lBTExPQ19CTE9DS1MobXApICsgWEZTX0lOX01BWExFVkVMUyhtcCkgKyBcCisJICAgWEZTX0FMTE9DRlJFRV9MT0dfQ09VTlQobXAsIDEpKSkpKSkKKworI2RlZmluZQlYRlNfQ1JFQVRFX0xPR19SRVMobXApCSgobXApLT5tX3Jlc2VydmF0aW9ucy50cl9jcmVhdGUpCisKKy8qCisgKiBNYWtpbmcgYSBuZXcgZGlyZWN0b3J5IGlzIHRoZSBzYW1lIGFzIGNyZWF0aW5nIGEgbmV3IGZpbGUuCisgKi8KKyNkZWZpbmUJWEZTX0NBTENfTUtESVJfTE9HX1JFUyhtcCkJWEZTX0NBTENfQ1JFQVRFX0xPR19SRVMobXApCisKKyNkZWZpbmUJWEZTX01LRElSX0xPR19SRVMobXApCSgobXApLT5tX3Jlc2VydmF0aW9ucy50cl9ta2RpcikKKworLyoKKyAqIEluIGZyZWVpbmcgYW4gaW5vZGUgd2UgY2FuIG1vZGlmeToKKyAqICAgIHRoZSBpbm9kZSBiZWluZyBmcmVlZDogaW5vZGUgc2l6ZQorICogICAgdGhlIHN1cGVyIGJsb2NrIGZyZWUgaW5vZGUgY291bnRlcjogc2VjdG9yIHNpemUKKyAqICAgIHRoZSBhZ2kgaGFzaCBsaXN0IGFuZCBjb3VudGVyczogc2VjdG9yIHNpemUKKyAqICAgIHRoZSBpbm9kZSBidHJlZSBlbnRyeTogYmxvY2sgc2l6ZQorICogICAgdGhlIG9uIGRpc2sgaW5vZGUgYmVmb3JlIG91cnMgaW4gdGhlIGFnaSBoYXNoIGxpc3Q6IGlub2RlIGNsdXN0ZXIgc2l6ZQorICogICAgdGhlIGlub2RlIGJ0cmVlOiBtYXggZGVwdGggKiBibG9ja3NpemUKKyAqICAgIHRoZSBhbGxvY2F0aW9uIGJ0cmVlczogMiB0cmVlcyAqIChtYXggZGVwdGggLSAxKSAqIGJsb2NrIHNpemUKKyAqLworI2RlZmluZQlYRlNfQ0FMQ19JRlJFRV9MT0dfUkVTKG1wKSBcCisJKChtcCktPm1fc2Iuc2JfaW5vZGVzaXplICsgXAorCSAobXApLT5tX3NiLnNiX3NlY3RzaXplICsgXAorCSAobXApLT5tX3NiLnNiX3NlY3RzaXplICsgXAorCSBYRlNfRlNCX1RPX0IoKG1wKSwgMSkgKyBcCisJIE1BWCgoX191aW50MTZfdClYRlNfRlNCX1RPX0IoKG1wKSwgMSksIFhGU19JTk9ERV9DTFVTVEVSX1NJWkUobXApKSArIFwKKwkgKDEyOCAqIDUpICsgXAorCSAgWEZTX0FMTE9DRlJFRV9MT0dfUkVTKG1wLCAxKSArIFwKKwkgICgxMjggKiAoMiArIFhGU19JQUxMT0NfQkxPQ0tTKG1wKSArIFhGU19JTl9NQVhMRVZFTFMobXApICsgXAorCSAgIFhGU19BTExPQ0ZSRUVfTE9HX0NPVU5UKG1wLCAxKSkpKQorCisKKyNkZWZpbmUJWEZTX0lGUkVFX0xPR19SRVMobXApCSgobXApLT5tX3Jlc2VydmF0aW9ucy50cl9pZnJlZSkKKworLyoKKyAqIFdoZW4gb25seSBjaGFuZ2luZyB0aGUgaW5vZGUgd2UgbG9nIHRoZSBpbm9kZSBhbmQgcG9zc2libHkgdGhlIHN1cGVyYmxvY2sKKyAqIFdlIGFsc28gYWRkIGEgYml0IG9mIHNsb3AgZm9yIHRoZSB0cmFuc2FjdGlvbiBzdHVmZi4KKyAqLworI2RlZmluZQlYRlNfQ0FMQ19JQ0hBTkdFX0xPR19SRVMobXApCSgobXApLT5tX3NiLnNiX2lub2Rlc2l6ZSArIFwKKwkJCQkJIChtcCktPm1fc2Iuc2Jfc2VjdHNpemUgKyA1MTIpCisKKyNkZWZpbmUJWEZTX0lDSEFOR0VfTE9HX1JFUyhtcCkJKChtcCktPm1fcmVzZXJ2YXRpb25zLnRyX2ljaGFuZ2UpCisKKy8qCisgKiBHcm93aW5nIHRoZSBkYXRhIHNlY3Rpb24gb2YgdGhlIGZpbGVzeXN0ZW0uCisgKglzdXBlcmJsb2NrCisgKglhZ2kgYW5kIGFnZgorICoJYWxsb2NhdGlvbiBidHJlZXMKKyAqLworI2RlZmluZQlYRlNfQ0FMQ19HUk9XREFUQV9MT0dfUkVTKG1wKSBcCisJKChtcCktPm1fc2Iuc2Jfc2VjdHNpemUgKiAzICsgXAorCSBYRlNfQUxMT0NGUkVFX0xPR19SRVMobXAsIDEpICsgXAorCSAoMTI4ICogKDMgKyBYRlNfQUxMT0NGUkVFX0xPR19DT1VOVChtcCwgMSkpKSkKKworI2RlZmluZQlYRlNfR1JPV0RBVEFfTE9HX1JFUyhtcCkgICAgKChtcCktPm1fcmVzZXJ2YXRpb25zLnRyX2dyb3dkYXRhKQorCisvKgorICogR3Jvd2luZyB0aGUgcnQgc2VjdGlvbiBvZiB0aGUgZmlsZXN5c3RlbS4KKyAqIEluIHRoZSBmaXJzdCBzZXQgb2YgdHJhbnNhY3Rpb25zIChBTExPQykgd2UgYWxsb2NhdGUgc3BhY2UgdG8gdGhlCisgKiBiaXRtYXAgb3Igc3VtbWFyeSBmaWxlcy4KKyAqCXN1cGVyYmxvY2s6IHNlY3RvciBzaXplCisgKglhZ2Ygb2YgdGhlIGFnIGZyb20gd2hpY2ggdGhlIGV4dGVudCBpcyBhbGxvY2F0ZWQ6IHNlY3RvciBzaXplCisgKglibWFwIGJ0cmVlIGZvciBiaXRtYXAvc3VtbWFyeSBpbm9kZTogbWF4IGRlcHRoICogYmxvY2tzaXplCisgKgliaXRtYXAvc3VtbWFyeSBpbm9kZTogaW5vZGUgc2l6ZQorICoJYWxsb2NhdGlvbiBidHJlZXMgZm9yIDEgYmxvY2sgYWxsb2M6IDIgKiAoMiAqIG1heGRlcHRoIC0gMSkgKiBibG9ja3NpemUKKyAqLworI2RlZmluZQlYRlNfQ0FMQ19HUk9XUlRBTExPQ19MT0dfUkVTKG1wKSBcCisJKDIgKiAobXApLT5tX3NiLnNiX3NlY3RzaXplICsgXAorCSBYRlNfRlNCX1RPX0IoKG1wKSwgWEZTX0JNX01BWExFVkVMUyhtcCwgWEZTX0RBVEFfRk9SSykpICsgXAorCSAobXApLT5tX3NiLnNiX2lub2Rlc2l6ZSArIFwKKwkgWEZTX0FMTE9DRlJFRV9MT0dfUkVTKG1wLCAxKSArIFwKKwkgKDEyOCAqIFwKKwkgICgzICsgWEZTX0JNX01BWExFVkVMUyhtcCwgWEZTX0RBVEFfRk9SSykgKyBcCisJICAgWEZTX0FMTE9DRlJFRV9MT0dfQ09VTlQobXAsIDEpKSkpCisKKyNkZWZpbmUJWEZTX0dST1dSVEFMTE9DX0xPR19SRVMobXApCSgobXApLT5tX3Jlc2VydmF0aW9ucy50cl9ncm93cnRhbGxvYykKKworLyoKKyAqIEdyb3dpbmcgdGhlIHJ0IHNlY3Rpb24gb2YgdGhlIGZpbGVzeXN0ZW0uCisgKiBJbiB0aGUgc2Vjb25kIHNldCBvZiB0cmFuc2FjdGlvbnMgKFpFUk8pIHdlIHplcm8gdGhlIG5ldyBtZXRhZGF0YSBibG9ja3MuCisgKglvbmUgYml0bWFwL3N1bW1hcnkgYmxvY2s6IGJsb2Nrc2l6ZQorICovCisjZGVmaW5lCVhGU19DQUxDX0dST1dSVFpFUk9fTE9HX1JFUyhtcCkgXAorCSgobXApLT5tX3NiLnNiX2Jsb2Nrc2l6ZSArIDEyOCkKKworI2RlZmluZQlYRlNfR1JPV1JUWkVST19MT0dfUkVTKG1wKQkoKG1wKS0+bV9yZXNlcnZhdGlvbnMudHJfZ3Jvd3J0emVybykKKworLyoKKyAqIEdyb3dpbmcgdGhlIHJ0IHNlY3Rpb24gb2YgdGhlIGZpbGVzeXN0ZW0uCisgKiBJbiB0aGUgdGhpcmQgc2V0IG9mIHRyYW5zYWN0aW9ucyAoRlJFRSkgd2UgdXBkYXRlIG1ldGFkYXRhIHdpdGhvdXQKKyAqIGFsbG9jYXRpbmcgYW55IG5ldyBibG9ja3MuCisgKglzdXBlcmJsb2NrOiBzZWN0b3Igc2l6ZQorICoJYml0bWFwIGlub2RlOiBpbm9kZSBzaXplCisgKglzdW1tYXJ5IGlub2RlOiBpbm9kZSBzaXplCisgKglvbmUgYml0bWFwIGJsb2NrOiBibG9ja3NpemUKKyAqCXN1bW1hcnkgYmxvY2tzOiBuZXcgc3VtbWFyeSBzaXplCisgKi8KKyNkZWZpbmUJWEZTX0NBTENfR1JPV1JURlJFRV9MT0dfUkVTKG1wKSBcCisJKChtcCktPm1fc2Iuc2Jfc2VjdHNpemUgKyBcCisJIDIgKiAobXApLT5tX3NiLnNiX2lub2Rlc2l6ZSArIFwKKwkgKG1wKS0+bV9zYi5zYl9ibG9ja3NpemUgKyBcCisJIChtcCktPm1fcnN1bXNpemUgKyBcCisJICgxMjggKiA1KSkKKworI2RlZmluZQlYRlNfR1JPV1JURlJFRV9MT0dfUkVTKG1wKQkoKG1wKS0+bV9yZXNlcnZhdGlvbnMudHJfZ3Jvd3J0ZnJlZSkKKworLyoKKyAqIExvZ2dpbmcgdGhlIGlub2RlIG1vZGlmaWNhdGlvbiB0aW1lc3RhbXAgb24gYSBzeW5jaHJvbm91cyB3cml0ZS4KKyAqCWlub2RlCisgKi8KKyNkZWZpbmUJWEZTX0NBTENfU1dSSVRFX0xPR19SRVMobXApIFwKKwkoKG1wKS0+bV9zYi5zYl9pbm9kZXNpemUgKyAxMjgpCisKKyNkZWZpbmUJWEZTX1NXUklURV9MT0dfUkVTKG1wKQkoKG1wKS0+bV9yZXNlcnZhdGlvbnMudHJfc3dyaXRlKQorCisvKgorICogTG9nZ2luZyB0aGUgaW5vZGUgdGltZXN0YW1wcyBvbiBhbiBmc3luYyAtLSBzYW1lIGFzIFNXUklURQorICogYXMgbG9uZyBhcyBTV1JJVEUgbG9ncyB0aGUgZW50aXJlIGlub2RlIGNvcmUKKyAqLworI2RlZmluZSBYRlNfRlNZTkNfVFNfTE9HX1JFUyhtcCkgICAgICAgICgobXApLT5tX3Jlc2VydmF0aW9ucy50cl9zd3JpdGUpCisKKy8qCisgKiBMb2dnaW5nIHRoZSBpbm9kZSBtb2RlIGJpdHMgd2hlbiB3cml0aW5nIGEgc2V0dWlkL3NldGdpZCBmaWxlCisgKglpbm9kZQorICovCisjZGVmaW5lCVhGU19DQUxDX1dSSVRFSURfTE9HX1JFUyhtcCkgXAorCSgobXApLT5tX3NiLnNiX2lub2Rlc2l6ZSArIDEyOCkKKworI2RlZmluZQlYRlNfV1JJVEVJRF9MT0dfUkVTKG1wKQkoKG1wKS0+bV9yZXNlcnZhdGlvbnMudHJfc3dyaXRlKQorCisvKgorICogQ29udmVydGluZyB0aGUgaW5vZGUgZnJvbSBub24tYXR0cmlidXRlZCB0byBhdHRyaWJ1dGVkLgorICoJdGhlIGlub2RlIGJlaW5nIGNvbnZlcnRlZDogaW5vZGUgc2l6ZQorICoJYWdmIGJsb2NrIGFuZCBzdXBlcmJsb2NrIChmb3IgYmxvY2sgYWxsb2NhdGlvbikKKyAqCXRoZSBuZXcgYmxvY2sgKGRpcmVjdG9yeSBzaXplZCkKKyAqCWJtYXAgYmxvY2tzIGZvciB0aGUgbmV3IGRpcmVjdG9yeSBibG9jaworICoJYWxsb2NhdGlvbiBidHJlZXMKKyAqLworI2RlZmluZQlYRlNfQ0FMQ19BRERBRk9SS19MT0dfUkVTKG1wKQlcCisJKChtcCktPm1fc2Iuc2JfaW5vZGVzaXplICsgXAorCSAobXApLT5tX3NiLnNiX3NlY3RzaXplICogMiArIFwKKwkgKG1wKS0+bV9kaXJibGtzaXplICsgXAorCSAoWEZTX0RJUl9JU19WMShtcCkgPyAwIDogXAorCSAgICBYRlNfRlNCX1RPX0IobXAsIChYRlNfREFFTlRFUl9CTUFQMUIobXAsIFhGU19EQVRBX0ZPUkspICsgMSkpKSArIFwKKwkgWEZTX0FMTE9DRlJFRV9MT0dfUkVTKG1wLCAxKSArIFwKKwkgKDEyOCAqICg0ICsgXAorCQkgKFhGU19ESVJfSVNfVjEobXApID8gMCA6IFwKKwkJCSBYRlNfREFFTlRFUl9CTUFQMUIobXAsIFhGU19EQVRBX0ZPUkspICsgMSkgKyBcCisJCSBYRlNfQUxMT0NGUkVFX0xPR19DT1VOVChtcCwgMSkpKSkKKworI2RlZmluZQlYRlNfQUREQUZPUktfTE9HX1JFUyhtcCkJKChtcCktPm1fcmVzZXJ2YXRpb25zLnRyX2FkZGFmb3JrKQorCisvKgorICogUmVtb3ZpbmcgdGhlIGF0dHJpYnV0ZSBmb3JrIG9mIGEgZmlsZQorICogICAgdGhlIGlub2RlIGJlaW5nIHRydW5jYXRlZDogaW5vZGUgc2l6ZQorICogICAgdGhlIGlub2RlXCdzIGJtYXAgYnRyZWU6IG1heCBkZXB0aCAqIGJsb2NrIHNpemUKKyAqIEFuZCB0aGUgYm1hcF9maW5pc2ggdHJhbnNhY3Rpb24gY2FuIGZyZWUgdGhlIGJsb2NrcyBhbmQgYm1hcCBibG9ja3M6CisgKiAgICB0aGUgYWdmIGZvciBlYWNoIG9mIHRoZSBhZ3M6IDQgKiBzZWN0b3Igc2l6ZQorICogICAgdGhlIGFnZmwgZm9yIGVhY2ggb2YgdGhlIGFnczogNCAqIHNlY3RvciBzaXplCisgKiAgICB0aGUgc3VwZXIgYmxvY2sgdG8gcmVmbGVjdCB0aGUgZnJlZWQgYmxvY2tzOiBzZWN0b3Igc2l6ZQorICogICAgd29yc3QgY2FzZSBzcGxpdCBpbiBhbGxvY2F0aW9uIGJ0cmVlcyBwZXIgZXh0ZW50IGFzc3VtaW5nIDQgZXh0ZW50czoKKyAqCQk0IGV4dHMgKiAyIHRyZWVzICogKDIgKiBtYXggZGVwdGggLSAxKSAqIGJsb2NrIHNpemUKKyAqLworI2RlZmluZQlYRlNfQ0FMQ19BVFRSSU5WQUxfTE9HX1JFUyhtcCkJXAorCShNQVgoIFwKKwkgKChtcCktPm1fc2Iuc2JfaW5vZGVzaXplICsgXAorCSAgWEZTX0ZTQl9UT19CKChtcCksIFhGU19CTV9NQVhMRVZFTFMobXAsIFhGU19BVFRSX0ZPUkspKSArIFwKKwkgICgxMjggKiAoMSArIFhGU19CTV9NQVhMRVZFTFMobXAsIFhGU19BVFRSX0ZPUkspKSkpLCBcCisJICgoNCAqIChtcCktPm1fc2Iuc2Jfc2VjdHNpemUpICsgXAorCSAgKDQgKiAobXApLT5tX3NiLnNiX3NlY3RzaXplKSArIFwKKwkgIChtcCktPm1fc2Iuc2Jfc2VjdHNpemUgKyBcCisJICBYRlNfQUxMT0NGUkVFX0xPR19SRVMobXAsIDQpICsgXAorCSAgKDEyOCAqICg5ICsgWEZTX0FMTE9DRlJFRV9MT0dfQ09VTlQobXAsIDQpKSkpKSkKKworI2RlZmluZQlYRlNfQVRUUklOVkFMX0xPR19SRVMobXApCSgobXApLT5tX3Jlc2VydmF0aW9ucy50cl9hdHRyaW52YWwpCisKKy8qCisgKiBTZXR0aW5nIGFuIGF0dHJpYnV0ZS4KKyAqCXRoZSBpbm9kZSBnZXR0aW5nIHRoZSBhdHRyaWJ1dGUKKyAqCXRoZSBzdXBlcmJsb2NrIGZvciBhbGxvY2F0aW9ucworICoJdGhlIGFnZnMgZXh0ZW50cyBhcmUgYWxsb2NhdGVkIGZyb20KKyAqCXRoZSBhdHRyaWJ1dGUgYnRyZWUgKiBtYXggZGVwdGgKKyAqCXRoZSBpbm9kZSBhbGxvY2F0aW9uIGJ0cmVlCisgKiBTaW5jZSBhdHRyaWJ1dGUgdHJhbnNhY3Rpb24gc3BhY2UgaXMgZGVwZW5kZW50IG9uIHRoZSBzaXplIG9mIHRoZSBhdHRyaWJ1dGUsCisgKiB0aGUgY2FsY3VsYXRpb24gaXMgZG9uZSBwYXJ0aWFsbHkgYXQgbW91bnQgdGltZSBhbmQgcGFydGlhbGx5IGF0IHJ1bnRpbWUuCisgKi8KKyNkZWZpbmUJWEZTX0NBTENfQVRUUlNFVF9MT0dfUkVTKG1wKQlcCisJKChtcCktPm1fc2Iuc2JfaW5vZGVzaXplICsgXAorCSAobXApLT5tX3NiLnNiX3NlY3RzaXplICsgXAorCSAgWEZTX0ZTQl9UT19CKChtcCksIFhGU19EQV9OT0RFX01BWERFUFRIKSArIFwKKwkgICgxMjggKiAoMiArIFhGU19EQV9OT0RFX01BWERFUFRIKSkpCisKKyNkZWZpbmUJWEZTX0FUVFJTRVRfTE9HX1JFUyhtcCwgZXh0KQlcCisJKChtcCktPm1fcmVzZXJ2YXRpb25zLnRyX2F0dHJzZXQgKyBcCisJIChleHQgKiAobXApLT5tX3NiLnNiX3NlY3RzaXplKSArIFwKKwkgKGV4dCAqIFhGU19GU0JfVE9fQigobXApLCBYRlNfQk1fTUFYTEVWRUxTKG1wLCBYRlNfQVRUUl9GT1JLKSkpICsgXAorCSAoMTI4ICogKGV4dCArIChleHQgKiBYRlNfQk1fTUFYTEVWRUxTKG1wLCBYRlNfQVRUUl9GT1JLKSkpKSkKKworLyoKKyAqIFJlbW92aW5nIGFuIGF0dHJpYnV0ZS4KKyAqICAgIHRoZSBpbm9kZTogaW5vZGUgc2l6ZQorICogICAgdGhlIGF0dHJpYnV0ZSBidHJlZSBjb3VsZCBqb2luOiBtYXggZGVwdGggKiBibG9jayBzaXplCisgKiAgICB0aGUgaW5vZGUgYm1hcCBidHJlZSBjb3VsZCBqb2luIG9yIHNwbGl0OiBtYXggZGVwdGggKiBibG9jayBzaXplCisgKiBBbmQgdGhlIGJtYXBfZmluaXNoIHRyYW5zYWN0aW9uIGNhbiBmcmVlIHRoZSBhdHRyIGJsb2NrcyBmcmVlZCBnaXZpbmc6CisgKiAgICB0aGUgYWdmIGZvciB0aGUgYWcgaW4gd2hpY2ggdGhlIGJsb2NrcyBsaXZlOiAyICogc2VjdG9yIHNpemUKKyAqICAgIHRoZSBhZ2ZsIGZvciB0aGUgYWcgaW4gd2hpY2ggdGhlIGJsb2NrcyBsaXZlOiAyICogc2VjdG9yIHNpemUKKyAqICAgIHRoZSBzdXBlcmJsb2NrIGZvciB0aGUgZnJlZSBibG9jayBjb3VudDogc2VjdG9yIHNpemUKKyAqICAgIHRoZSBhbGxvY2F0aW9uIGJ0cmVlczogMiBleHRzICogMiB0cmVlcyAqICgyICogbWF4IGRlcHRoIC0gMSkgKiBibG9jayBzaXplCisgKi8KKyNkZWZpbmUJWEZTX0NBTENfQVRUUlJNX0xPR19SRVMobXApCVwKKwkoTUFYKCBcCisJICAoKG1wKS0+bV9zYi5zYl9pbm9kZXNpemUgKyBcCisJICBYRlNfRlNCX1RPX0IoKG1wKSwgWEZTX0RBX05PREVfTUFYREVQVEgpICsgXAorCSAgWEZTX0ZTQl9UT19CKChtcCksIFhGU19CTV9NQVhMRVZFTFMobXAsIFhGU19BVFRSX0ZPUkspKSArIFwKKwkgICgxMjggKiAoMSArIFhGU19EQV9OT0RFX01BWERFUFRIICsgWEZTX0JNX01BWExFVkVMUyhtcCwgWEZTX0RBVEFfRk9SSykpKSksIFwKKwkgKCgyICogKG1wKS0+bV9zYi5zYl9zZWN0c2l6ZSkgKyBcCisJICAoMiAqIChtcCktPm1fc2Iuc2Jfc2VjdHNpemUpICsgXAorCSAgKG1wKS0+bV9zYi5zYl9zZWN0c2l6ZSArIFwKKwkgIFhGU19BTExPQ0ZSRUVfTE9HX1JFUyhtcCwgMikgKyBcCisJICAoMTI4ICogKDUgKyBYRlNfQUxMT0NGUkVFX0xPR19DT1VOVChtcCwgMikpKSkpKQorCisjZGVmaW5lCVhGU19BVFRSUk1fTE9HX1JFUyhtcCkJKChtcCktPm1fcmVzZXJ2YXRpb25zLnRyX2F0dHJybSkKKworLyoKKyAqIENsZWFyaW5nIGEgYmFkIGFnaW5vIG51bWJlciBpbiBhbiBhZ2kgaGFzaCBidWNrZXQuCisgKi8KKyNkZWZpbmUJWEZTX0NBTENfQ0xFQVJfQUdJX0JVQ0tFVF9MT0dfUkVTKG1wKSBcCisJKChtcCktPm1fc2Iuc2Jfc2VjdHNpemUgKyAxMjgpCisKKyNkZWZpbmUJWEZTX0NMRUFSX0FHSV9CVUNLRVRfTE9HX1JFUyhtcCkgICgobXApLT5tX3Jlc2VydmF0aW9ucy50cl9jbGVhcmFnaSkKKworCisvKgorICogVmFyaW91cyBsb2cgY291bnQgdmFsdWVzLgorICovCisjZGVmaW5lCVhGU19ERUZBVUxUX0xPR19DT1VOVAkJMQorI2RlZmluZQlYRlNfREVGQVVMVF9QRVJNX0xPR19DT1VOVAkyCisjZGVmaW5lCVhGU19JVFJVTkNBVEVfTE9HX0NPVU5UCQkyCisjZGVmaW5lIFhGU19JTkFDVElWRV9MT0dfQ09VTlQJCTIKKyNkZWZpbmUJWEZTX0NSRUFURV9MT0dfQ09VTlQJCTIKKyNkZWZpbmUJWEZTX01LRElSX0xPR19DT1VOVAkJMworI2RlZmluZQlYRlNfU1lNTElOS19MT0dfQ09VTlQJCTMKKyNkZWZpbmUJWEZTX1JFTU9WRV9MT0dfQ09VTlQJCTIKKyNkZWZpbmUJWEZTX0xJTktfTE9HX0NPVU5UCQkyCisjZGVmaW5lCVhGU19SRU5BTUVfTE9HX0NPVU5UCQkyCisjZGVmaW5lCVhGU19XUklURV9MT0dfQ09VTlQJCTIKKyNkZWZpbmUJWEZTX0FEREFGT1JLX0xPR19DT1VOVAkJMgorI2RlZmluZQlYRlNfQVRUUklOVkFMX0xPR19DT1VOVAkJMQorI2RlZmluZQlYRlNfQVRUUlNFVF9MT0dfQ09VTlQJCTMKKyNkZWZpbmUJWEZTX0FUVFJSTV9MT0dfQ09VTlQJCTMKKworLyoKKyAqIEhlcmUgd2UgY2VudHJhbGl6ZSB0aGUgc3BlY2lmaWNhdGlvbiBvZiBYRlMgbWV0YS1kYXRhIGJ1ZmZlcgorICogcmVmZXJlbmNlIGNvdW50IHZhbHVlcy4gIFRoaXMgZGV0ZXJtaW5lIGhvdyBoYXJkIHRoZSBidWZmZXIKKyAqIGNhY2hlIHRyaWVzIHRvIGhvbGQgb250byB0aGUgYnVmZmVyLgorICovCisjZGVmaW5lCVhGU19BR0ZfUkVGCQk0CisjZGVmaW5lCVhGU19BR0lfUkVGCQk0CisjZGVmaW5lCVhGU19BR0ZMX1JFRgkJMworI2RlZmluZQlYRlNfSU5PX0JUUkVFX1JFRgkzCisjZGVmaW5lCVhGU19BTExPQ19CVFJFRV9SRUYJMgorI2RlZmluZQlYRlNfQk1BUF9CVFJFRV9SRUYJMgorI2RlZmluZQlYRlNfRElSX0JUUkVFX1JFRgkyCisjZGVmaW5lCVhGU19BVFRSX0JUUkVFX1JFRgkxCisjZGVmaW5lCVhGU19JTk9fUkVGCQkxCisjZGVmaW5lCVhGU19EUVVPVF9SRUYJCTEKKworI2lmZGVmIF9fS0VSTkVMX18KKy8qCisgKiBYRlMgdHJhbnNhY3Rpb24gbWVjaGFuaXNtIGV4cG9ydGVkIGludGVyZmFjZXMgdGhhdCBhcmUKKyAqIGFjdHVhbGx5IG1hY3Jvcy4KKyAqLworI2RlZmluZQl4ZnNfdHJhbnNfZ2V0X2xvZ19yZXModHApCSgodHApLT50X2xvZ19yZXMpCisjZGVmaW5lCXhmc190cmFuc19nZXRfbG9nX2NvdW50KHRwKQkoKHRwKS0+dF9sb2dfY291bnQpCisjZGVmaW5lCXhmc190cmFuc19nZXRfYmxvY2tfcmVzKHRwKQkoKHRwKS0+dF9ibGtfcmVzKQorI2RlZmluZQl4ZnNfdHJhbnNfc2V0X3N5bmModHApCQkoKHRwKS0+dF9mbGFncyB8PSBYRlNfVFJBTlNfU1lOQykKKworI2lmZGVmIERFQlVHCisjZGVmaW5lCXhmc190cmFuc19hZ2Jsb2Nrc19kZWx0YSh0cCwgZCkJKCh0cCktPnRfYWdfZnJlZWJsa3NfZGVsdGEgKz0gKGxvbmcpZCkKKyNkZWZpbmUJeGZzX3RyYW5zX2FnZmxpc3RfZGVsdGEodHAsIGQpCSgodHApLT50X2FnX2ZsaXN0X2RlbHRhICs9IChsb25nKWQpCisjZGVmaW5lCXhmc190cmFuc19hZ2J0cmVlX2RlbHRhKHRwLCBkKQkoKHRwKS0+dF9hZ19idHJlZV9kZWx0YSArPSAobG9uZylkKQorI2Vsc2UKKyNkZWZpbmUJeGZzX3RyYW5zX2FnYmxvY2tzX2RlbHRhKHRwLCBkKQorI2RlZmluZQl4ZnNfdHJhbnNfYWdmbGlzdF9kZWx0YSh0cCwgZCkKKyNkZWZpbmUJeGZzX3RyYW5zX2FnYnRyZWVfZGVsdGEodHAsIGQpCisjZW5kaWYKKworLyoKKyAqIFhGUyB0cmFuc2FjdGlvbiBtZWNoYW5pc20gZXhwb3J0ZWQgaW50ZXJmYWNlcy4KKyAqLwordm9pZAkJeGZzX3RyYW5zX2luaXQoc3RydWN0IHhmc19tb3VudCAqKTsKK3hmc190cmFuc190CSp4ZnNfdHJhbnNfYWxsb2Moc3RydWN0IHhmc19tb3VudCAqLCB1aW50KTsKK3hmc190cmFuc190CSpfeGZzX3RyYW5zX2FsbG9jKHN0cnVjdCB4ZnNfbW91bnQgKiwgdWludCk7Cit4ZnNfdHJhbnNfdAkqeGZzX3RyYW5zX2R1cCh4ZnNfdHJhbnNfdCAqKTsKK2ludAkJeGZzX3RyYW5zX3Jlc2VydmUoeGZzX3RyYW5zX3QgKiwgdWludCwgdWludCwgdWludCwKKwkJCQkgIHVpbnQsIHVpbnQpOwordm9pZAkJeGZzX3RyYW5zX2NhbGxiYWNrKHhmc190cmFuc190ICosCisJCQkJICAgdm9pZCAoKikoeGZzX3RyYW5zX3QgKiwgdm9pZCAqKSwgdm9pZCAqKTsKK3ZvaWQJCXhmc190cmFuc19tb2Rfc2IoeGZzX3RyYW5zX3QgKiwgdWludCwgbG9uZyk7CitzdHJ1Y3QgeGZzX2J1ZgkqeGZzX3RyYW5zX2dldF9idWYoeGZzX3RyYW5zX3QgKiwgc3RydWN0IHhmc19idWZ0YXJnICosIHhmc19kYWRkcl90LAorCQkJCSAgIGludCwgdWludCk7CitpbnQJCXhmc190cmFuc19yZWFkX2J1ZihzdHJ1Y3QgeGZzX21vdW50ICosIHhmc190cmFuc190ICosCisJCQkJICAgc3RydWN0IHhmc19idWZ0YXJnICosIHhmc19kYWRkcl90LCBpbnQsIHVpbnQsCisJCQkJICAgc3RydWN0IHhmc19idWYgKiopOworc3RydWN0IHhmc19idWYJKnhmc190cmFuc19nZXRzYih4ZnNfdHJhbnNfdCAqLCBzdHJ1Y3QgeGZzX21vdW50ICosIGludCk7CisKK3ZvaWQJCXhmc190cmFuc19icmVsc2UoeGZzX3RyYW5zX3QgKiwgc3RydWN0IHhmc19idWYgKik7Cit2b2lkCQl4ZnNfdHJhbnNfYmpvaW4oeGZzX3RyYW5zX3QgKiwgc3RydWN0IHhmc19idWYgKik7Cit2b2lkCQl4ZnNfdHJhbnNfYmhvbGQoeGZzX3RyYW5zX3QgKiwgc3RydWN0IHhmc19idWYgKik7Cit2b2lkCQl4ZnNfdHJhbnNfYmludmFsKHhmc190cmFuc190ICosIHN0cnVjdCB4ZnNfYnVmICopOwordm9pZAkJeGZzX3RyYW5zX2lub2RlX2J1Zih4ZnNfdHJhbnNfdCAqLCBzdHJ1Y3QgeGZzX2J1ZiAqKTsKK3ZvaWQJCXhmc190cmFuc19pbm9kZV9idWYoeGZzX3RyYW5zX3QgKiwgc3RydWN0IHhmc19idWYgKik7Cit2b2lkCQl4ZnNfdHJhbnNfc3RhbGVfaW5vZGVfYnVmKHhmc190cmFuc190ICosIHN0cnVjdCB4ZnNfYnVmICopOwordm9pZAkJeGZzX3RyYW5zX2RxdW90X2J1Zih4ZnNfdHJhbnNfdCAqLCBzdHJ1Y3QgeGZzX2J1ZiAqLCB1aW50KTsKK3ZvaWQJCXhmc190cmFuc19pbm9kZV9hbGxvY19idWYoeGZzX3RyYW5zX3QgKiwgc3RydWN0IHhmc19idWYgKik7CitpbnQJCXhmc190cmFuc19pZ2V0KHN0cnVjdCB4ZnNfbW91bnQgKiwgeGZzX3RyYW5zX3QgKiwKKwkJCSAgICAgICB4ZnNfaW5vX3QgLCB1aW50LCB1aW50LCBzdHJ1Y3QgeGZzX2lub2RlICoqKTsKK3ZvaWQJCXhmc190cmFuc19pam9pbih4ZnNfdHJhbnNfdCAqLCBzdHJ1Y3QgeGZzX2lub2RlICosIHVpbnQpOwordm9pZAkJeGZzX3RyYW5zX2lob2xkKHhmc190cmFuc190ICosIHN0cnVjdCB4ZnNfaW5vZGUgKik7Cit2b2lkCQl4ZnNfdHJhbnNfaWhvbGRfcmVsZWFzZSh4ZnNfdHJhbnNfdCAqLCBzdHJ1Y3QgeGZzX2lub2RlICopOwordm9pZAkJeGZzX3RyYW5zX2xvZ19idWYoeGZzX3RyYW5zX3QgKiwgc3RydWN0IHhmc19idWYgKiwgdWludCwgdWludCk7Cit2b2lkCQl4ZnNfdHJhbnNfbG9nX2lub2RlKHhmc190cmFuc190ICosIHN0cnVjdCB4ZnNfaW5vZGUgKiwgdWludCk7CitzdHJ1Y3QgeGZzX2VmaV9sb2dfaXRlbQkqeGZzX3RyYW5zX2dldF9lZmkoeGZzX3RyYW5zX3QgKiwgdWludCk7Cit2b2lkCQl4ZnNfZWZpX3JlbGVhc2Uoc3RydWN0IHhmc19lZmlfbG9nX2l0ZW0gKiwgdWludCk7Cit2b2lkCQl4ZnNfdHJhbnNfbG9nX2VmaV9leHRlbnQoeGZzX3RyYW5zX3QgKiwKKwkJCQkJIHN0cnVjdCB4ZnNfZWZpX2xvZ19pdGVtICosCisJCQkJCSB4ZnNfZnNibG9ja190LAorCQkJCQkgeGZzX2V4dGxlbl90KTsKK3N0cnVjdCB4ZnNfZWZkX2xvZ19pdGVtCSp4ZnNfdHJhbnNfZ2V0X2VmZCh4ZnNfdHJhbnNfdCAqLAorCQkJCSAgc3RydWN0IHhmc19lZmlfbG9nX2l0ZW0gKiwKKwkJCQkgIHVpbnQpOwordm9pZAkJeGZzX3RyYW5zX2xvZ19lZmRfZXh0ZW50KHhmc190cmFuc190ICosCisJCQkJCSBzdHJ1Y3QgeGZzX2VmZF9sb2dfaXRlbSAqLAorCQkJCQkgeGZzX2ZzYmxvY2tfdCwKKwkJCQkJIHhmc19leHRsZW5fdCk7CitpbnQJCXhmc190cmFuc19jb21taXQoeGZzX3RyYW5zX3QgKiwgdWludCBmbGFncywgeGZzX2xzbl90ICopOwordm9pZAkJeGZzX3RyYW5zX2NhbmNlbCh4ZnNfdHJhbnNfdCAqLCBpbnQpOwordm9pZAkJeGZzX3RyYW5zX2FpbF9pbml0KHN0cnVjdCB4ZnNfbW91bnQgKik7Cit4ZnNfbHNuX3QJeGZzX3RyYW5zX3B1c2hfYWlsKHN0cnVjdCB4ZnNfbW91bnQgKiwgeGZzX2xzbl90KTsKK3hmc19sc25fdAl4ZnNfdHJhbnNfdGFpbF9haWwoc3RydWN0IHhmc19tb3VudCAqKTsKK3ZvaWQJCXhmc190cmFuc191bmxvY2tlZF9pdGVtKHN0cnVjdCB4ZnNfbW91bnQgKiwKKwkJCQkJeGZzX2xvZ19pdGVtX3QgKik7Cit4ZnNfbG9nX2J1c3lfc2xvdF90ICp4ZnNfdHJhbnNfYWRkX2J1c3koeGZzX3RyYW5zX3QgKnRwLAorCQkJCQl4ZnNfYWdudW1iZXJfdCBhZywKKwkJCQkJeGZzX2V4dGxlbl90IGlkeCk7CisKKyNlbmRpZgkvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZgkvKiBfX1hGU19UUkFOU19IX18gKi8KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnNfYWlsLmMgYi9mcy94ZnMveGZzX3RyYW5zX2FpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYzVlYWIKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX3RyYW5zX2FpbC5jCkBAIC0wLDAgKzEsNTk2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisjaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc190eXBlcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnNfcHJpdi5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorCitTVEFUSUMgdm9pZCB4ZnNfYWlsX2luc2VydCh4ZnNfYWlsX2VudHJ5X3QgKiwgeGZzX2xvZ19pdGVtX3QgKik7CitTVEFUSUMgeGZzX2xvZ19pdGVtX3QgKiB4ZnNfYWlsX2RlbGV0ZSh4ZnNfYWlsX2VudHJ5X3QgKiwgeGZzX2xvZ19pdGVtX3QgKik7CitTVEFUSUMgeGZzX2xvZ19pdGVtX3QgKiB4ZnNfYWlsX21pbih4ZnNfYWlsX2VudHJ5X3QgKik7CitTVEFUSUMgeGZzX2xvZ19pdGVtX3QgKiB4ZnNfYWlsX25leHQoeGZzX2FpbF9lbnRyeV90ICosIHhmc19sb2dfaXRlbV90ICopOworCisjaWZkZWYgREVCVUcKK1NUQVRJQyB2b2lkIHhmc19haWxfY2hlY2soeGZzX2FpbF9lbnRyeV90ICopOworI2Vsc2UKKyNkZWZpbmUJeGZzX2FpbF9jaGVjayhhKQorI2VuZGlmIC8qIERFQlVHICovCisKKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBsb2cgbWFuYWdlciBjb2RlIHRvIGRldGVybWluZSB0aGUgTFNOCisgKiBvZiB0aGUgdGFpbCBvZiB0aGUgbG9nLiAgVGhpcyBpcyBleGFjdGx5IHRoZSBMU04gb2YgdGhlIGZpcnN0CisgKiBpdGVtIGluIHRoZSBBSUwuICBJZiB0aGUgQUlMIGlzIGVtcHR5LCB0aGVuIHRoaXMgZnVuY3Rpb24KKyAqIHJldHVybnMgMC4KKyAqCisgKiBXZSBuZWVkIHRoZSBBSUwgbG9jayBpbiBvcmRlciB0byBnZXQgYSBjb2hlcmVudCByZWFkIG9mIHRoZQorICogbHNuIG9mIHRoZSBsYXN0IGl0ZW0gaW4gdGhlIEFJTC4KKyAqLworeGZzX2xzbl90Cit4ZnNfdHJhbnNfdGFpbF9haWwoCisJeGZzX21vdW50X3QJKm1wKQoreworCXhmc19sc25fdAlsc247CisJeGZzX2xvZ19pdGVtX3QJKmxpcDsKKwlTUExERUNMKHMpOworCisJQUlMX0xPQ0sobXAscyk7CisJbGlwID0geGZzX2FpbF9taW4oJihtcC0+bV9haWwpKTsKKwlpZiAobGlwID09IE5VTEwpIHsKKwkJbHNuID0gKHhmc19sc25fdCkwOworCX0gZWxzZSB7CisJCWxzbiA9IGxpcC0+bGlfbHNuOworCX0KKwlBSUxfVU5MT0NLKG1wLCBzKTsKKworCXJldHVybiBsc247Cit9CisKKy8qCisgKiB4ZnNfdHJhbnNfcHVzaF9haWwKKyAqCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIG1vdmUgdGhlIHRhaWwgb2YgdGhlIEFJTAorICogZm9yd2FyZC4gIEl0IGRvZXMgdGhpcyBieSB0cnlpbmcgdG8gZmx1c2ggaXRlbXMgaW4gdGhlIEFJTAorICogd2hvc2UgbHNucyBhcmUgYmVsb3cgdGhlIGdpdmVuIHRocmVzaG9sZF9sc24uCisgKgorICogVGhlIHJvdXRpbmUgcmV0dXJucyB0aGUgbHNuIG9mIHRoZSB0YWlsIG9mIHRoZSBsb2cuCisgKi8KK3hmc19sc25fdAoreGZzX3RyYW5zX3B1c2hfYWlsKAorCXhmc19tb3VudF90CQkqbXAsCisJeGZzX2xzbl90CQl0aHJlc2hvbGRfbHNuKQoreworCXhmc19sc25fdAkJbHNuOworCXhmc19sb2dfaXRlbV90CQkqbGlwOworCWludAkJCWdlbjsKKwlpbnQJCQlyZXN0YXJ0czsKKwlpbnQJCQlsb2NrX3Jlc3VsdDsKKwlpbnQJCQlmbHVzaF9sb2c7CisJU1BMREVDTChzKTsKKworI2RlZmluZQlYRlNfVFJBTlNfUFVTSF9BSUxfUkVTVEFSVFMJMTAKKworCUFJTF9MT0NLKG1wLHMpOworCWxpcCA9IHhmc190cmFuc19maXJzdF9haWwobXAsICZnZW4pOworCWlmIChsaXAgPT0gTlVMTCB8fCBYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkgeworCQkvKgorCQkgKiBKdXN0IHJldHVybiBpZiB0aGUgQUlMIGlzIGVtcHR5LgorCQkgKi8KKwkJQUlMX1VOTE9DSyhtcCwgcyk7CisJCXJldHVybiAoeGZzX2xzbl90KTA7CisJfQorCisJWEZTX1NUQVRTX0lOQyh4c19wdXNoX2FpbCk7CisKKwkvKgorCSAqIFdoaWxlIHRoZSBpdGVtIHdlIGFyZSBsb29raW5nIGF0IGlzIGJlbG93IHRoZSBnaXZlbiB0aHJlc2hvbGQKKwkgKiB0cnkgdG8gZmx1c2ggaXQgb3V0LiAgTWFrZSBzdXJlIHRvIGxpbWl0IHRoZSBudW1iZXIgb2YgdGltZXMKKwkgKiB3ZSBhbGxvdyB4ZnNfdHJhbnNfbmV4dF9haWwoKSB0byByZXN0YXJ0IHNjYW5uaW5nIGZyb20gdGhlCisJICogYmVnaW5uaW5nIG9mIHRoZSBsaXN0LiAgV2UnZCBsaWtlIG5vdCB0byBzdG9wIHVudGlsIHdlJ3ZlIGF0IGxlYXN0CisJICogdHJpZWQgdG8gcHVzaCBvbiBldmVyeXRoaW5nIGluIHRoZSBBSUwgd2l0aCBhbiBMU04gbGVzcyB0aGFuCisJICogdGhlIGdpdmVuIHRocmVzaG9sZC4gSG93ZXZlciwgd2UgbWF5IGdpdmUgdXAgYmVmb3JlIHRoYXQgaWYKKwkgKiB3ZSByZWFsaXplIHRoYXQgd2UndmUgYmVlbiBob2xkaW5nIHRoZSBBSUxfTE9DSyBmb3IgJ3RvbyBsb25nJywKKwkgKiBibG9ja2luZyBpbnRlcnJ1cHRzLiBDdXJyZW50bHksIHRvbyBsb25nIGlzIDwgNTAwdXMgcm91Z2hseS4KKwkgKi8KKwlmbHVzaF9sb2cgPSAwOworCXJlc3RhcnRzID0gMDsKKwl3aGlsZSAoKChyZXN0YXJ0cyA8IFhGU19UUkFOU19QVVNIX0FJTF9SRVNUQVJUUykgJiYKKwkJKFhGU19MU05fQ01QKGxpcC0+bGlfbHNuLCB0aHJlc2hvbGRfbHNuKSA8IDApKSkgeworCQkvKgorCQkgKiBJZiB3ZSBjYW4gbG9jayB0aGUgaXRlbSB3aXRob3V0IHNsZWVwaW5nLCB1bmxvY2sKKwkJICogdGhlIEFJTCBsb2NrIGFuZCBmbHVzaCB0aGUgaXRlbS4gIFRoZW4gcmUtZ3JhYiB0aGUKKwkJICogQUlMIGxvY2sgc28gd2UgY2FuIGxvb2sgZm9yIHRoZSBuZXh0IGl0ZW0gb24gdGhlCisJCSAqIEFJTC4gIFNpbmNlIHdlIHVubG9jayB0aGUgQUlMIHdoaWxlIHdlIGZsdXNoIHRoZQorCQkgKiBpdGVtLCB0aGUgbmV4dCByb3V0aW5lIG1heSBzdGFydCBvdmVyIGFnYWluIGF0IHRoZQorCQkgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0IGlmIGFueXRoaW5nIGhhcyBjaGFuZ2VkLgorCQkgKiBUaGF0IGlzIHdoYXQgdGhlIGdlbmVyYXRpb24gY291bnQgaXMgZm9yLgorCQkgKgorCQkgKiBJZiB3ZSBjYW4ndCBsb2NrIHRoZSBpdGVtLCBlaXRoZXIgaXRzIGhvbGRlciB3aWxsIGZsdXNoCisJCSAqIGl0IG9yIGl0IGlzIGFscmVhZHkgYmVpbmcgZmx1c2hlZCBvciBpdCBpcyBiZWluZyByZWxvZ2dlZC4KKwkJICogSW4gYW55IG9mIHRoZXNlIGNhc2UgaXQgaXMgYmVpbmcgdGFrZW4gY2FyZSBvZiBhbmQgd2UKKwkJICogY2FuIGp1c3Qgc2tpcCB0byB0aGUgbmV4dCBpdGVtIGluIHRoZSBsaXN0LgorCQkgKi8KKwkJbG9ja19yZXN1bHQgPSBJT1BfVFJZTE9DSyhsaXApOworCQlzd2l0Y2ggKGxvY2tfcmVzdWx0KSB7CisJCSAgICAgIGNhc2UgWEZTX0lURU1fU1VDQ0VTUzoKKwkJCUFJTF9VTkxPQ0sobXAsIHMpOworCQkJWEZTX1NUQVRTX0lOQyh4c19wdXNoX2FpbF9zdWNjZXNzKTsKKwkJCUlPUF9QVVNIKGxpcCk7CisJCQlBSUxfTE9DSyhtcCxzKTsKKwkJCWJyZWFrOworCisJCSAgICAgIGNhc2UgWEZTX0lURU1fUFVTSEJVRjoKKwkJCUFJTF9VTkxPQ0sobXAsIHMpOworCQkJWEZTX1NUQVRTX0lOQyh4c19wdXNoX2FpbF9wdXNoYnVmKTsKKyNpZmRlZiBYRlNSQUNFREVCVUcKKwkJCWRlbGF5X2Zvcl9pbnRyKCk7CisJCQlkZWxheSgzMDApOworI2VuZGlmCisJCQlBU1NFUlQobGlwLT5saV9vcHMtPmlvcF9wdXNoYnVmKTsKKwkJCUFTU0VSVChsaXApOworCQkJSU9QX1BVU0hCVUYobGlwKTsKKwkJCUFJTF9MT0NLKG1wLHMpOworCQkJYnJlYWs7CisKKwkJICAgICAgY2FzZSBYRlNfSVRFTV9QSU5ORUQ6CisJCQlYRlNfU1RBVFNfSU5DKHhzX3B1c2hfYWlsX3Bpbm5lZCk7CisJCQlmbHVzaF9sb2cgPSAxOworCQkJYnJlYWs7CisKKwkJICAgICAgY2FzZSBYRlNfSVRFTV9MT0NLRUQ6CisJCQlYRlNfU1RBVFNfSU5DKHhzX3B1c2hfYWlsX2xvY2tlZCk7CisJCQlicmVhazsKKworCQkgICAgICBjYXNlIFhGU19JVEVNX0ZMVVNISU5HOgorCQkJWEZTX1NUQVRTX0lOQyh4c19wdXNoX2FpbF9mbHVzaGluZyk7CisJCQlicmVhazsKKworCQkgICAgICBkZWZhdWx0OgorCQkJQVNTRVJUKDApOworCQkJYnJlYWs7CisJCX0KKworCQlsaXAgPSB4ZnNfdHJhbnNfbmV4dF9haWwobXAsIGxpcCwgJmdlbiwgJnJlc3RhcnRzKTsKKwkJaWYgKGxpcCA9PSBOVUxMKSB7CisJCQlicmVhazsKKwkJfQorCQlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpIHsKKwkJCS8qCisJCQkgKiBKdXN0IHJldHVybiBpZiB3ZSBzaHV0IGRvd24gZHVyaW5nIHRoZSBsYXN0IHRyeS4KKwkJCSAqLworCQkJQUlMX1VOTE9DSyhtcCwgcyk7CisJCQlyZXR1cm4gKHhmc19sc25fdCkwOworCQl9CisKKwl9CisKKwlpZiAoZmx1c2hfbG9nKSB7CisJCS8qCisJCSAqIElmIHNvbWV0aGluZyB3ZSBuZWVkIHRvIHB1c2ggb3V0IHdhcyBwaW5uZWQsIHRoZW4KKwkJICogcHVzaCBvdXQgdGhlIGxvZyBzbyBpdCB3aWxsIGJlY29tZSB1bnBpbm5lZCBhbmQKKwkJICogbW92ZSBmb3J3YXJkIGluIHRoZSBBSUwuCisJCSAqLworCQlBSUxfVU5MT0NLKG1wLCBzKTsKKwkJWEZTX1NUQVRTX0lOQyh4c19wdXNoX2FpbF9mbHVzaCk7CisJCXhmc19sb2dfZm9yY2UobXAsICh4ZnNfbHNuX3QpMCwgWEZTX0xPR19GT1JDRSk7CisJCUFJTF9MT0NLKG1wLCBzKTsKKwl9CisKKwlsaXAgPSB4ZnNfYWlsX21pbigmKG1wLT5tX2FpbCkpOworCWlmIChsaXAgPT0gTlVMTCkgeworCQlsc24gPSAoeGZzX2xzbl90KTA7CisJfSBlbHNlIHsKKwkJbHNuID0gbGlwLT5saV9sc247CisJfQorCisJQUlMX1VOTE9DSyhtcCwgcyk7CisJcmV0dXJuIGxzbjsKK30JLyogeGZzX3RyYW5zX3B1c2hfYWlsICovCisKKworLyoKKyAqIFRoaXMgaXMgdG8gYmUgY2FsbGVkIHdoZW4gYW4gaXRlbSBpcyB1bmxvY2tlZCB0aGF0IG1heSBoYXZlCisgKiBiZWVuIGluIHRoZSBBSUwuICBJdCB3aWxsIHdha2UgdXAgdGhlIGZpcnN0IG1lbWJlciBvZiB0aGUgQUlMCisgKiB3YWl0IGxpc3QgaWYgdGhpcyBpdGVtJ3MgdW5sb2NraW5nIG1pZ2h0IGFsbG93IGl0IHRvIHByb2dyZXNzLgorICogSWYgdGhlIGl0ZW0gaXMgaW4gdGhlIEFJTCwgdGhlbiB3ZSBuZWVkIHRvIGdldCB0aGUgQUlMIGxvY2sKKyAqIHdoaWxlIGRvaW5nIG91ciBjaGVja2luZyBzbyB3ZSBkb24ndCByYWNlIHdpdGggc29tZW9uZSBnb2luZworICogdG8gc2xlZXAgd2FpdGluZyBmb3IgdGhpcyBldmVudCBpbiB4ZnNfdHJhbnNfcHVzaF9haWwoKS4KKyAqLwordm9pZAoreGZzX3RyYW5zX3VubG9ja2VkX2l0ZW0oCisJeGZzX21vdW50X3QJKm1wLAorCXhmc19sb2dfaXRlbV90CSpsaXApCit7CisJeGZzX2xvZ19pdGVtX3QJKm1pbl9saXA7CisKKwkvKgorCSAqIElmIHdlJ3JlIGZvcmNpYmx5IHNodXR0aW5nIGRvd24sIHdlIG1heSBoYXZlCisJICogdW5sb2NrZWQgbG9nIGl0ZW1zIGFyYml0cmFyaWx5LiBUaGUgbGFzdCB0aGluZworCSAqIHdlIHdhbnQgdG8gZG8gaXMgdG8gbW92ZSB0aGUgdGFpbCBvZiB0aGUgbG9nCisJICogb3ZlciBzb21lIHBvdGVudGlhbGx5IHZhbGlkIGRhdGEuCisJICovCisJaWYgKCEobGlwLT5saV9mbGFncyAmIFhGU19MSV9JTl9BSUwpIHx8CisJICAgIFhGU19GT1JDRURfU0hVVERPV04obXApKSB7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFRoaXMgaXMgdGhlIG9uZSBjYXNlIHdoZXJlIHdlIGNhbiBjYWxsIGludG8geGZzX2FpbF9taW4oKQorCSAqIHdpdGhvdXQgaG9sZGluZyB0aGUgQUlMIGxvY2sgYmVjYXVzZSB3ZSBvbmx5IGNhcmUgYWJvdXQgdGhlCisJICogY2FzZSB3aGVyZSB3ZSBhcmUgYXQgdGhlIHRhaWwgb2YgdGhlIEFJTC4gIElmIHRoZSBvYmplY3QgaXNuJ3QKKwkgKiBhdCB0aGUgdGFpbCwgaXQgZG9lc24ndCBtYXR0ZXIgd2hhdCByZXN1bHQgd2UgZ2V0IGJhY2suICBUaGlzCisJICogaXMgc2xpZ2h0bHkgcmFjeSBiZWNhdXNlIHNpbmNlIHdlIHdlcmUganVzdCB1bmxvY2tlZCwgd2UgY291bGQKKwkgKiBnbyB0byBzbGVlcCBiZXR3ZWVuIHRoZSBjYWxsIHRvIHhmc19haWxfbWluIGFuZCB0aGUgY2FsbCB0bworCSAqIHhmc19sb2dfbW92ZV90YWlsLCBoYXZlIHNvbWVvbmUgZWxzZSBsb2NrIHVzLCBjb21taXQgdG8gdXMgZGlzaywKKwkgKiBtb3ZlIHVzIG91dCBvZiB0aGUgdGFpbCBvZiB0aGUgQUlMLCBhbmQgdGhlbiB3ZSB3YWtlIHVwLiAgSG93ZXZlciwKKwkgKiB0aGUgY2FsbCB0byB4ZnNfbG9nX21vdmVfdGFpbCgpIGRvZXNuJ3QgZG8gYW55dGhpbmcgaWYgdGhlcmUncworCSAqIG5vdCBlbm91Z2ggZnJlZSBzcGFjZSB0byB3YWtlIHBlb3BsZSB1cCBzbyB3ZSdyZSBzYWZlIGNhbGxpbmcgaXQuCisJICovCisJbWluX2xpcCA9IHhmc19haWxfbWluKCZtcC0+bV9haWwpOworCisJaWYgKG1pbl9saXAgPT0gbGlwKQorCQl4ZnNfbG9nX21vdmVfdGFpbChtcCwgMSk7Cit9CS8qIHhmc190cmFuc191bmxvY2tlZF9pdGVtICovCisKKworLyoKKyAqIFVwZGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGl0ZW0gaW4gdGhlIEFJTCB3aXRoIHRoZSBuZXcKKyAqIGxzbi4gIElmIGl0IGlzIG5vdCB5ZXQgaW4gdGhlIEFJTCwgYWRkIGl0LiAgT3RoZXJ3aXNlLCBtb3ZlCisgKiBpdCB0byBpdHMgbmV3IHBvc2l0aW9uIGJ5IHJlbW92aW5nIGl0IGFuZCByZS1hZGRpbmcgaXQuCisgKgorICogV2FrZXVwIGFueW9uZSB3aXRoIGFuIGxzbiBsZXNzIHRoYW4gdGhlIGl0ZW0ncyBsc24uICBJZiB0aGUgaXRlbQorICogd2UgbW92ZSBpbiB0aGUgQUlMIGlzIHRoZSBtaW5pbXVtIG9uZSwgdXBkYXRlIHRoZSB0YWlsIGxzbiBpbiB0aGUKKyAqIGxvZyBtYW5hZ2VyLgorICoKKyAqIEluY3JlbWVudCB0aGUgQUlMJ3MgZ2VuZXJhdGlvbiBjb3VudCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0cmVlCisgKiBoYXMgY2hhbmdlZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIEFJTCBsb2NrIGhlbGQuICBUaGUgbG9jaworICogaXMgZHJvcHBlZCBiZWZvcmUgcmV0dXJuaW5nLCBzbyB0aGUgY2FsbGVyIG11c3QgcGFzcyBpbiB0aGUKKyAqIGNvb2tpZSByZXR1cm5lZCBieSBBSUxfTE9DSy4KKyAqLwordm9pZAoreGZzX3RyYW5zX3VwZGF0ZV9haWwoCisJeGZzX21vdW50X3QJKm1wLAorCXhmc19sb2dfaXRlbV90CSpsaXAsCisJeGZzX2xzbl90CWxzbiwKKwl1bnNpZ25lZCBsb25nCXMpCit7CisJeGZzX2FpbF9lbnRyeV90CQkqYWlscDsKKwl4ZnNfbG9nX2l0ZW1fdAkJKmRsaXA9TlVMTDsKKwl4ZnNfbG9nX2l0ZW1fdAkJKm1saXA7CS8qIHB0ciB0byBtaW5pbXVtIGxpcCAqLworCisJYWlscCA9ICYobXAtPm1fYWlsKTsKKwltbGlwID0geGZzX2FpbF9taW4oYWlscCk7CisKKwlpZiAobGlwLT5saV9mbGFncyAmIFhGU19MSV9JTl9BSUwpIHsKKwkJZGxpcCA9IHhmc19haWxfZGVsZXRlKGFpbHAsIGxpcCk7CisJCUFTU0VSVChkbGlwID09IGxpcCk7CisJfSBlbHNlIHsKKwkJbGlwLT5saV9mbGFncyB8PSBYRlNfTElfSU5fQUlMOworCX0KKworCWxpcC0+bGlfbHNuID0gbHNuOworCisJeGZzX2FpbF9pbnNlcnQoYWlscCwgbGlwKTsKKwltcC0+bV9haWxfZ2VuKys7CisKKwlpZiAobWxpcCA9PSBkbGlwKSB7CisJCW1saXAgPSB4ZnNfYWlsX21pbigmKG1wLT5tX2FpbCkpOworCQlBSUxfVU5MT0NLKG1wLCBzKTsKKwkJeGZzX2xvZ19tb3ZlX3RhaWwobXAsIG1saXAtPmxpX2xzbik7CisJfSBlbHNlIHsKKwkJQUlMX1VOTE9DSyhtcCwgcyk7CisJfQorCisKK30JLyogeGZzX3RyYW5zX3VwZGF0ZV9haWwgKi8KKworLyoKKyAqIERlbGV0ZSB0aGUgZ2l2ZW4gaXRlbSBmcm9tIHRoZSBBSUwuICBJdCBtdXN0IGFscmVhZHkgYmUgaW4KKyAqIHRoZSBBSUwuCisgKgorICogV2FrZXVwIGFueW9uZSB3aXRoIGFuIGxzbiBsZXNzIHRoYW4gaXRlbSdzIGxzbi4gICAgSWYgdGhlIGl0ZW0KKyAqIHdlIGRlbGV0ZSBpbiB0aGUgQUlMIGlzIHRoZSBtaW5pbXVtIG9uZSwgdXBkYXRlIHRoZSB0YWlsIGxzbiBpbiB0aGUKKyAqIGxvZyBtYW5hZ2VyLgorICoKKyAqIENsZWFyIHRoZSBJTl9BSUwgZmxhZyBmcm9tIHRoZSBpdGVtLCByZXNldCBpdHMgbHNuIHRvIDAsIGFuZAorICogYnVtcCB0aGUgQUlMJ3MgZ2VuZXJhdGlvbiBjb3VudCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0cmVlCisgKiBoYXMgY2hhbmdlZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIEFJTCBsb2NrIGhlbGQuICBUaGUgbG9jaworICogaXMgZHJvcHBlZCBiZWZvcmUgcmV0dXJuaW5nLCBzbyB0aGUgY2FsbGVyIG11c3QgcGFzcyBpbiB0aGUKKyAqIGNvb2tpZSByZXR1cm5lZCBieSBBSUxfTE9DSy4KKyAqLwordm9pZAoreGZzX3RyYW5zX2RlbGV0ZV9haWwoCisJeGZzX21vdW50X3QJKm1wLAorCXhmc19sb2dfaXRlbV90CSpsaXAsCisJdW5zaWduZWQgbG9uZwlzKQoreworCXhmc19haWxfZW50cnlfdAkJKmFpbHA7CisJeGZzX2xvZ19pdGVtX3QJCSpkbGlwOworCXhmc19sb2dfaXRlbV90CQkqbWxpcDsKKworCWlmIChsaXAtPmxpX2ZsYWdzICYgWEZTX0xJX0lOX0FJTCkgeworCQlhaWxwID0gJihtcC0+bV9haWwpOworCQltbGlwID0geGZzX2FpbF9taW4oYWlscCk7CisJCWRsaXAgPSB4ZnNfYWlsX2RlbGV0ZShhaWxwLCBsaXApOworCQlBU1NFUlQoZGxpcCA9PSBsaXApOworCisKKwkJbGlwLT5saV9mbGFncyAmPSB+WEZTX0xJX0lOX0FJTDsKKwkJbGlwLT5saV9sc24gPSAwOworCQltcC0+bV9haWxfZ2VuKys7CisKKwkJaWYgKG1saXAgPT0gZGxpcCkgeworCQkJbWxpcCA9IHhmc19haWxfbWluKCYobXAtPm1fYWlsKSk7CisJCQlBSUxfVU5MT0NLKG1wLCBzKTsKKwkJCXhmc19sb2dfbW92ZV90YWlsKG1wLCAobWxpcCA/IG1saXAtPmxpX2xzbiA6IDApKTsKKwkJfSBlbHNlIHsKKwkJCUFJTF9VTkxPQ0sobXAsIHMpOworCQl9CisJfQorCWVsc2UgeworCQkvKgorCQkgKiBJZiB0aGUgZmlsZSBzeXN0ZW0gaXMgbm90IGJlaW5nIHNodXRkb3duLCB3ZSBhcmUgaW4KKwkJICogc2VyaW91cyB0cm91YmxlIGlmIHdlIGdldCB0byB0aGlzIHN0YWdlLgorCQkgKi8KKwkJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQorCQkJQUlMX1VOTE9DSyhtcCwgcyk7CisJCWVsc2UgeworCQkJeGZzX2Ntbl9lcnIoWEZTX1BUQUdfQUlMREVMRVRFLCBDRV9BTEVSVCwgbXAsCisJCQkJInhmc190cmFuc19kZWxldGVfYWlsOiBhdHRlbXB0aW5nIHRvIGRlbGV0ZSBhIGxvZyBpdGVtIHRoYXQgaXMgbm90IGluIHRoZSBBSUwiKTsKKwkJCXhmc19mb3JjZV9zaHV0ZG93bihtcCwgWEZTX0NPUlJVUFRfSU5DT1JFKTsKKwkJCUFJTF9VTkxPQ0sobXAsIHMpOworCQl9CisJfQorfQorCisKKworLyoKKyAqIFJldHVybiB0aGUgaXRlbSBpbiB0aGUgQUlMIHdpdGggdGhlIHNtYWxsZXN0IGxzbi4KKyAqIFJldHVybiB0aGUgY3VycmVudCB0cmVlIGdlbmVyYXRpb24gbnVtYmVyIGZvciB1c2UKKyAqIGluIGNhbGxzIHRvIHhmc190cmFuc19uZXh0X2FpbCgpLgorICovCit4ZnNfbG9nX2l0ZW1fdCAqCit4ZnNfdHJhbnNfZmlyc3RfYWlsKAorCXhmc19tb3VudF90CSptcCwKKwlpbnQJCSpnZW4pCit7CisJeGZzX2xvZ19pdGVtX3QJKmxpcDsKKworCWxpcCA9IHhmc19haWxfbWluKCYobXAtPm1fYWlsKSk7CisJKmdlbiA9IChpbnQpbXAtPm1fYWlsX2dlbjsKKworCXJldHVybiAobGlwKTsKK30KKworLyoKKyAqIElmIHRoZSBnZW5lcmF0aW9uIGNvdW50IG9mIHRoZSB0cmVlIGhhcyBub3QgY2hhbmdlZCBzaW5jZSB0aGUKKyAqIGNhbGxlciBsYXN0IHRvb2sgc29tZXRoaW5nIGZyb20gdGhlIEFJTCwgdGhlbiByZXR1cm4gdGhlIGVsbXQKKyAqIGluIHRoZSB0cmVlIHdoaWNoIGZvbGxvd3MgdGhlIG9uZSBnaXZlbi4gIElmIHRoZSBjb3VudCBoYXMgY2hhbmdlZCwKKyAqIHRoZW4gcmV0dXJuIHRoZSBtaW5pbXVtIGVsbXQgb2YgdGhlIEFJTCBhbmQgYnVtcCB0aGUgcmVzdGFydHMgY291bnRlcgorICogaWYgb25lIGlzIGdpdmVuLgorICovCit4ZnNfbG9nX2l0ZW1fdCAqCit4ZnNfdHJhbnNfbmV4dF9haWwoCisJeGZzX21vdW50X3QJKm1wLAorCXhmc19sb2dfaXRlbV90CSpsaXAsCisJaW50CQkqZ2VuLAorCWludAkJKnJlc3RhcnRzKQoreworCXhmc19sb2dfaXRlbV90CSpubGlwOworCisJQVNTRVJUKG1wICYmIGxpcCAmJiBnZW4pOworCWlmIChtcC0+bV9haWxfZ2VuID09ICpnZW4pIHsKKwkJbmxpcCA9IHhmc19haWxfbmV4dCgmKG1wLT5tX2FpbCksIGxpcCk7CisJfSBlbHNlIHsKKwkJbmxpcCA9IHhmc19haWxfbWluKCYobXAtPm1fYWlsKSk7CisJCSpnZW4gPSAoaW50KW1wLT5tX2FpbF9nZW47CisJCWlmIChyZXN0YXJ0cyAhPSBOVUxMKSB7CisJCQlYRlNfU1RBVFNfSU5DKHhzX3B1c2hfYWlsX3Jlc3RhcnRzKTsKKwkJCSgqcmVzdGFydHMpKys7CisJCX0KKwl9CisKKwlyZXR1cm4gKG5saXApOworfQorCisKKy8qCisgKiBUaGUgYWN0aXZlIGl0ZW0gbGlzdCAoQUlMKSBpcyBhIGRvdWJseSBsaW5rZWQgbGlzdCBvZiBsb2cKKyAqIGl0ZW1zIHNvcnRlZCBieSBhc2NlbmRpbmcgbHNuLiAgVGhlIGJhc2Ugb2YgdGhlIGxpc3QgaXMKKyAqIGEgZm9ydy9iYWNrIHBvaW50ZXIgcGFpciBlbWJlZGRlZCBpbiB0aGUgeGZzIG1vdW50IHN0cnVjdHVyZS4KKyAqIFRoZSBiYXNlIGlzIGluaXRpYWxpemVkIHdpdGggYm90aCBwb2ludGVycyBwb2ludGluZyB0byB0aGUKKyAqIGJhc2UuICBUaGlzIGNhc2UgYWx3YXlzIG5lZWRzIHRvIGJlIGRpc3Rpbmd1aXNoZWQsIGJlY2F1c2UKKyAqIHRoZSBiYXNlIGhhcyBubyBsc24gdG8gbG9vayBhdC4gIFdlIGFsbW9zdCBhbHdheXMgaW5zZXJ0CisgKiBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0LCBzbyBvbiBpbnNlcnRzIHdlIHNlYXJjaCBmcm9tIHRoZQorICogZW5kIG9mIHRoZSBsaXN0IHRvIGZpbmQgd2hlcmUgdGhlIG5ldyBpdGVtIGJlbG9uZ3MuCisgKi8KKworLyoKKyAqIEluaXRpYWxpemUgdGhlIGRvdWJseSBsaW5rZWQgbGlzdCB0byBwb2ludCBvbmx5IHRvIGl0c2VsZi4KKyAqLwordm9pZAoreGZzX3RyYW5zX2FpbF9pbml0KAorCXhmc19tb3VudF90CSptcCkKK3sKKwltcC0+bV9haWwuYWlsX2ZvcncgPSAoeGZzX2xvZ19pdGVtX3QqKSYobXAtPm1fYWlsKTsKKwltcC0+bV9haWwuYWlsX2JhY2sgPSAoeGZzX2xvZ19pdGVtX3QqKSYobXAtPm1fYWlsKTsKK30KKworLyoKKyAqIEluc2VydCB0aGUgZ2l2ZW4gbG9nIGl0ZW0gaW50byB0aGUgQUlMLgorICogV2UgYWxtb3N0IGFsd2F5cyBpbnNlcnQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCwgc28gb24gaW5zZXJ0cworICogd2Ugc2VhcmNoIGZyb20gdGhlIGVuZCBvZiB0aGUgbGlzdCB0byBmaW5kIHdoZXJlIHRoZQorICogbmV3IGl0ZW0gYmVsb25ncy4KKyAqLworU1RBVElDIHZvaWQKK3hmc19haWxfaW5zZXJ0KAorCXhmc19haWxfZW50cnlfdAkqYmFzZSwKKwl4ZnNfbG9nX2l0ZW1fdAkqbGlwKQorLyogQVJHU1VTRUQgKi8KK3sKKwl4ZnNfbG9nX2l0ZW1fdAkqbmV4dF9saXA7CisKKwkvKgorCSAqIElmIHRoZSBsaXN0IGlzIGVtcHR5LCBqdXN0IGluc2VydCB0aGUgaXRlbS4KKwkgKi8KKwlpZiAoYmFzZS0+YWlsX2JhY2sgPT0gKHhmc19sb2dfaXRlbV90KiliYXNlKSB7CisJCWJhc2UtPmFpbF9mb3J3ID0gbGlwOworCQliYXNlLT5haWxfYmFjayA9IGxpcDsKKwkJbGlwLT5saV9haWwuYWlsX2ZvcncgPSAoeGZzX2xvZ19pdGVtX3QqKWJhc2U7CisJCWxpcC0+bGlfYWlsLmFpbF9iYWNrID0gKHhmc19sb2dfaXRlbV90KiliYXNlOworCQlyZXR1cm47CisJfQorCisJbmV4dF9saXAgPSBiYXNlLT5haWxfYmFjazsKKwl3aGlsZSAoKG5leHRfbGlwICE9ICh4ZnNfbG9nX2l0ZW1fdCopYmFzZSkgJiYKKwkgICAgICAgKFhGU19MU05fQ01QKG5leHRfbGlwLT5saV9sc24sIGxpcC0+bGlfbHNuKSA+IDApKSB7CisJCW5leHRfbGlwID0gbmV4dF9saXAtPmxpX2FpbC5haWxfYmFjazsKKwl9CisJQVNTRVJUKChuZXh0X2xpcCA9PSAoeGZzX2xvZ19pdGVtX3QqKWJhc2UpIHx8CisJICAgICAgIChYRlNfTFNOX0NNUChuZXh0X2xpcC0+bGlfbHNuLCBsaXAtPmxpX2xzbikgPD0gMCkpOworCWxpcC0+bGlfYWlsLmFpbF9mb3J3ID0gbmV4dF9saXAtPmxpX2FpbC5haWxfZm9ydzsKKwlsaXAtPmxpX2FpbC5haWxfYmFjayA9IG5leHRfbGlwOworCW5leHRfbGlwLT5saV9haWwuYWlsX2ZvcncgPSBsaXA7CisJbGlwLT5saV9haWwuYWlsX2ZvcnctPmxpX2FpbC5haWxfYmFjayA9IGxpcDsKKworCXhmc19haWxfY2hlY2soYmFzZSk7CisJcmV0dXJuOworfQorCisvKgorICogRGVsZXRlIHRoZSBnaXZlbiBpdGVtIGZyb20gdGhlIEFJTC4gIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGl0ZW0uCisgKi8KKy8qQVJHU1VTRUQqLworU1RBVElDIHhmc19sb2dfaXRlbV90ICoKK3hmc19haWxfZGVsZXRlKAorCXhmc19haWxfZW50cnlfdAkqYmFzZSwKKwl4ZnNfbG9nX2l0ZW1fdAkqbGlwKQorLyogQVJHU1VTRUQgKi8KK3sKKwlsaXAtPmxpX2FpbC5haWxfZm9ydy0+bGlfYWlsLmFpbF9iYWNrID0gbGlwLT5saV9haWwuYWlsX2JhY2s7CisJbGlwLT5saV9haWwuYWlsX2JhY2stPmxpX2FpbC5haWxfZm9ydyA9IGxpcC0+bGlfYWlsLmFpbF9mb3J3OworCWxpcC0+bGlfYWlsLmFpbF9mb3J3ID0gTlVMTDsKKwlsaXAtPmxpX2FpbC5haWxfYmFjayA9IE5VTEw7CisKKwl4ZnNfYWlsX2NoZWNrKGJhc2UpOworCXJldHVybiBsaXA7Cit9CisKKy8qCisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBBSUwuCisgKiBJZiB0aGUgQUlMIGlzIGVtcHR5LCB0aGVuIHJldHVybiBOVUxMLgorICovCitTVEFUSUMgeGZzX2xvZ19pdGVtX3QgKgoreGZzX2FpbF9taW4oCisJeGZzX2FpbF9lbnRyeV90CSpiYXNlKQorLyogQVJHU1VTRUQgKi8KK3sKKwlyZWdpc3RlciB4ZnNfbG9nX2l0ZW1fdCAqZm9ydyA9IGJhc2UtPmFpbF9mb3J3OworCWlmIChmb3J3ID09ICh4ZnNfbG9nX2l0ZW1fdCopYmFzZSkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGZvcnc7Cit9CisKKy8qCisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBpdGVtIHdoaWNoIGZvbGxvd3MKKyAqIHRoZSBnaXZlbiBpdGVtIGluIHRoZSBBSUwuICBJZiB0aGUgZ2l2ZW4gaXRlbQorICogaXMgdGhlIGxhc3QgaXRlbSBpbiB0aGUgbGlzdCwgdGhlbiByZXR1cm4gTlVMTC4KKyAqLworU1RBVElDIHhmc19sb2dfaXRlbV90ICoKK3hmc19haWxfbmV4dCgKKwl4ZnNfYWlsX2VudHJ5X3QJKmJhc2UsCisJeGZzX2xvZ19pdGVtX3QJKmxpcCkKKy8qIEFSR1NVU0VEICovCit7CisJaWYgKGxpcC0+bGlfYWlsLmFpbF9mb3J3ID09ICh4ZnNfbG9nX2l0ZW1fdCopYmFzZSkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGxpcC0+bGlfYWlsLmFpbF9mb3J3OworCit9CisKKyNpZmRlZiBERUJVRworLyoKKyAqIENoZWNrIHRoYXQgdGhlIGxpc3QgaXMgc29ydGVkIGFzIGl0IHNob3VsZCBiZS4KKyAqLworU1RBVElDIHZvaWQKK3hmc19haWxfY2hlY2soCisJeGZzX2FpbF9lbnRyeV90ICpiYXNlKQoreworCXhmc19sb2dfaXRlbV90CSpsaXA7CisJeGZzX2xvZ19pdGVtX3QJKnByZXZfbGlwOworCisJbGlwID0gYmFzZS0+YWlsX2Zvcnc7CisJaWYgKGxpcCA9PSAoeGZzX2xvZ19pdGVtX3QqKWJhc2UpIHsKKwkJLyoKKwkJICogTWFrZSBzdXJlIHRoZSBwb2ludGVycyBhcmUgY29ycmVjdCB3aGVuIHRoZSBsaXN0CisJCSAqIGlzIGVtcHR5LgorCQkgKi8KKwkJQVNTRVJUKGJhc2UtPmFpbF9iYWNrID09ICh4ZnNfbG9nX2l0ZW1fdCopYmFzZSk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFdhbGsgdGhlIGxpc3QgY2hlY2tpbmcgZm9yd2FyZCBhbmQgYmFja3dhcmQgcG9pbnRlcnMsCisJICogbHNuIG9yZGVyaW5nLCBhbmQgdGhhdCBldmVyeSBlbnRyeSBoYXMgdGhlIFhGU19MSV9JTl9BSUwKKwkgKiBmbGFnIHNldC4KKwkgKi8KKwlwcmV2X2xpcCA9ICh4ZnNfbG9nX2l0ZW1fdCopYmFzZTsKKwl3aGlsZSAobGlwICE9ICh4ZnNfbG9nX2l0ZW1fdCopYmFzZSkgeworCQlpZiAocHJldl9saXAgIT0gKHhmc19sb2dfaXRlbV90KiliYXNlKSB7CisJCQlBU1NFUlQocHJldl9saXAtPmxpX2FpbC5haWxfZm9ydyA9PSBsaXApOworCQkJQVNTRVJUKFhGU19MU05fQ01QKHByZXZfbGlwLT5saV9sc24sIGxpcC0+bGlfbHNuKSA8PSAwKTsKKwkJfQorCQlBU1NFUlQobGlwLT5saV9haWwuYWlsX2JhY2sgPT0gcHJldl9saXApOworCQlBU1NFUlQoKGxpcC0+bGlfZmxhZ3MgJiBYRlNfTElfSU5fQUlMKSAhPSAwKTsKKwkJcHJldl9saXAgPSBsaXA7CisJCWxpcCA9IGxpcC0+bGlfYWlsLmFpbF9mb3J3OworCX0KKwlBU1NFUlQobGlwID09ICh4ZnNfbG9nX2l0ZW1fdCopYmFzZSk7CisJQVNTRVJUKGJhc2UtPmFpbF9iYWNrID09IHByZXZfbGlwKTsKK30KKyNlbmRpZiAvKiBERUJVRyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFuc19idWYuYyBiL2ZzL3hmcy94ZnNfdHJhbnNfYnVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk2ODJiOQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfdHJhbnNfYnVmLmMKQEAgLTAsMCArMSwxMDkzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworCisjaW5jbHVkZSAieGZzLmgiCisjaW5jbHVkZSAieGZzX21hY3Jvcy5oIgorI2luY2x1ZGUgInhmc190eXBlcy5oIgorI2luY2x1ZGUgInhmc19pbnVtLmgiCisjaW5jbHVkZSAieGZzX2xvZy5oIgorI2luY2x1ZGUgInhmc190cmFucy5oIgorI2luY2x1ZGUgInhmc19idWZfaXRlbS5oIgorI2luY2x1ZGUgInhmc19zYi5oIgorI2luY2x1ZGUgInhmc19hZy5oIgorI2luY2x1ZGUgInhmc19kaXIuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnNfcHJpdi5oIgorI2luY2x1ZGUgInhmc19lcnJvci5oIgorI2luY2x1ZGUgInhmc19ydy5oIgorCisKK1NUQVRJQyB4ZnNfYnVmX3QgKnhmc190cmFuc19idWZfaXRlbV9tYXRjaCh4ZnNfdHJhbnNfdCAqLCB4ZnNfYnVmdGFyZ190ICosCisJCXhmc19kYWRkcl90LCBpbnQpOworU1RBVElDIHhmc19idWZfdCAqeGZzX3RyYW5zX2J1Zl9pdGVtX21hdGNoX2FsbCh4ZnNfdHJhbnNfdCAqLCB4ZnNfYnVmdGFyZ190ICosCisJCXhmc19kYWRkcl90LCBpbnQpOworCisKKy8qCisgKiBHZXQgYW5kIGxvY2sgdGhlIGJ1ZmZlciBmb3IgdGhlIGNhbGxlciBpZiBpdCBpcyBub3QgYWxyZWFkeQorICogbG9ja2VkIHdpdGhpbiB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24uICBJZiBpdCBpcyBhbHJlYWR5IGxvY2tlZAorICogd2l0aGluIHRoZSB0cmFuc2FjdGlvbiwganVzdCBpbmNyZW1lbnQgaXRzIGxvY2sgcmVjdXJzaW9uIGNvdW50CisgKiBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byBpdC4KKyAqCisgKiBVc2UgdGhlIGZhc3QgcGF0aCBmdW5jdGlvbiB4ZnNfdHJhbnNfYnVmX2l0ZW1fbWF0Y2goKSBvciB0aGUgYnVmZmVyCisgKiBjYWNoZSByb3V0aW5lIGluY29yZV9tYXRjaCgpIHRvIGZpbmQgdGhlIGJ1ZmZlcgorICogaWYgaXQgaXMgYWxyZWFkeSBvd25lZCBieSB0aGlzIHRyYW5zYWN0aW9uLgorICoKKyAqIElmIHdlIGRvbid0IGFscmVhZHkgb3duIHRoZSBidWZmZXIsIHVzZSBnZXRfYnVmKCkgdG8gZ2V0IGl0LgorICogSWYgaXQgZG9lc24ndCB5ZXQgaGF2ZSBhbiBhc3NvY2lhdGVkIHhmc19idWZfbG9nX2l0ZW0gc3RydWN0dXJlLAorICogdGhlbiBhbGxvY2F0ZSBvbmUgYW5kIGFkZCB0aGUgaXRlbSB0byB0aGlzIHRyYW5zYWN0aW9uLgorICoKKyAqIElmIHRoZSB0cmFuc2FjdGlvbiBwb2ludGVyIGlzIE5VTEwsIG1ha2UgdGhpcyBqdXN0IGEgbm9ybWFsCisgKiBnZXRfYnVmKCkgY2FsbC4KKyAqLworeGZzX2J1Zl90ICoKK3hmc190cmFuc19nZXRfYnVmKHhmc190cmFuc190CSp0cCwKKwkJICB4ZnNfYnVmdGFyZ190CSp0YXJnZXRfZGV2LAorCQkgIHhmc19kYWRkcl90CWJsa25vLAorCQkgIGludAkJbGVuLAorCQkgIHVpbnQJCWZsYWdzKQoreworCXhmc19idWZfdAkJKmJwOworCXhmc19idWZfbG9nX2l0ZW1fdAkqYmlwOworCisJaWYgKGZsYWdzID09IDApCisJCWZsYWdzID0gWEZTX0JVRl9MT0NLIHwgWEZTX0JVRl9NQVBQRUQ7CisKKwkvKgorCSAqIERlZmF1bHQgdG8gYSBub3JtYWwgZ2V0X2J1ZigpIGNhbGwgaWYgdGhlIHRwIGlzIE5VTEwuCisJICovCisJaWYgKHRwID09IE5VTEwpIHsKKwkJYnAgPSB4ZnNfYnVmX2dldF9mbGFncyh0YXJnZXRfZGV2LCBibGtubywgbGVuLAorCQkJCQkJCWZsYWdzIHwgQlVGX0JVU1kpOworCQlyZXR1cm4oYnApOworCX0KKworCS8qCisJICogSWYgd2UgZmluZCB0aGUgYnVmZmVyIGluIHRoZSBjYWNoZSB3aXRoIHRoaXMgdHJhbnNhY3Rpb24KKwkgKiBwb2ludGVyIGluIGl0cyBiX2ZzcHJpdmF0ZTIgZmllbGQsIHRoZW4gd2Uga25vdyB3ZSBhbHJlYWR5CisJICogaGF2ZSBpdCBsb2NrZWQuICBJbiB0aGlzIGNhc2Ugd2UganVzdCBpbmNyZW1lbnQgdGhlIGxvY2sKKwkgKiByZWN1cnNpb24gY291bnQgYW5kIHJldHVybiB0aGUgYnVmZmVyIHRvIHRoZSBjYWxsZXIuCisJICovCisJaWYgKHRwLT50X2l0ZW1zLmxpY19uZXh0ID09IE5VTEwpIHsKKwkJYnAgPSB4ZnNfdHJhbnNfYnVmX2l0ZW1fbWF0Y2godHAsIHRhcmdldF9kZXYsIGJsa25vLCBsZW4pOworCX0gZWxzZSB7CisJCWJwICA9IHhmc190cmFuc19idWZfaXRlbV9tYXRjaF9hbGwodHAsIHRhcmdldF9kZXYsIGJsa25vLCBsZW4pOworCX0KKwlpZiAoYnAgIT0gTlVMTCkgeworCQlBU1NFUlQoWEZTX0JVRl9WQUxVU0VNQShicCkgPD0gMCk7CisJCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKHRwLT50X21vdW50cCkpIHsKKwkJCXhmc19idWZ0cmFjZSgiVFJBTlMgR0VUIFJFQ1VSIFNIVVQiLCBicCk7CisJCQlYRlNfQlVGX1NVUEVSX1NUQUxFKGJwKTsKKwkJfQorCQkvKgorCQkgKiBJZiB0aGUgYnVmZmVyIGlzIHN0YWxlIHRoZW4gaXQgd2FzIGJpbnZhbCdlZAorCQkgKiBzaW5jZSBsYXN0IHJlYWQuICBUaGlzIGRvZXNuJ3QgbWF0dGVyIHNpbmNlIHRoZQorCQkgKiBjYWxsZXIgaXNuJ3QgYWxsb3dlZCB0byB1c2UgdGhlIGRhdGEgYW55d2F5LgorCQkgKi8KKwkJZWxzZSBpZiAoWEZTX0JVRl9JU1NUQUxFKGJwKSkgeworCQkJeGZzX2J1ZnRyYWNlKCJUUkFOUyBHRVQgUkVDVVIgU1RBTEUiLCBicCk7CisJCQlBU1NFUlQoIVhGU19CVUZfSVNERUxBWVdSSVRFKGJwKSk7CisJCX0KKwkJQVNTRVJUKFhGU19CVUZfRlNQUklWQVRFMihicCwgeGZzX3RyYW5zX3QgKikgPT0gdHApOworCQliaXAgPSBYRlNfQlVGX0ZTUFJJVkFURShicCwgeGZzX2J1Zl9sb2dfaXRlbV90ICopOworCQlBU1NFUlQoYmlwICE9IE5VTEwpOworCQlBU1NFUlQoYXRvbWljX3JlYWQoJmJpcC0+YmxpX3JlZmNvdW50KSA+IDApOworCQliaXAtPmJsaV9yZWN1cisrOworCQl4ZnNfYnVmdHJhY2UoIlRSQU5TIEdFVCBSRUNVUiIsIGJwKTsKKwkJeGZzX2J1Zl9pdGVtX3RyYWNlKCJHRVQgUkVDVVIiLCBiaXApOworCQlyZXR1cm4gKGJwKTsKKwl9CisKKwkvKgorCSAqIFdlIGFsd2F5cyBzcGVjaWZ5IHRoZSBCVUZfQlVTWSBmbGFnIHdpdGhpbiBhIHRyYW5zYWN0aW9uIHNvCisJICogdGhhdCBnZXRfYnVmIGRvZXMgbm90IHRyeSB0byBwdXNoIG91dCBhIGRlbGF5ZWQgd3JpdGUgYnVmZmVyCisJICogd2hpY2ggbWlnaHQgY2F1c2UgYW5vdGhlciB0cmFuc2FjdGlvbiB0byB0YWtlIHBsYWNlIChpZiB0aGUKKwkgKiBidWZmZXIgd2FzIGRlbGF5ZWQgYWxsb2MpLiAgU3VjaCByZWN1cnNpdmUgdHJhbnNhY3Rpb25zIGNhbgorCSAqIGVhc2lseSBkZWFkbG9jayB3aXRoIG91ciBjdXJyZW50IHRyYW5zYWN0aW9uIGFzIHdlbGwgYXMgY2F1c2UKKwkgKiB1cyB0byBydW4gb3V0IG9mIHN0YWNrIHNwYWNlLgorCSAqLworCWJwID0geGZzX2J1Zl9nZXRfZmxhZ3ModGFyZ2V0X2RldiwgYmxrbm8sIGxlbiwgZmxhZ3MgfCBCVUZfQlVTWSk7CisJaWYgKGJwID09IE5VTEwpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJQVNTRVJUKCFYRlNfQlVGX0dFVEVSUk9SKGJwKSk7CisKKwkvKgorCSAqIFRoZSB4ZnNfYnVmX2xvZ19pdGVtIHBvaW50ZXIgaXMgc3RvcmVkIGluIGJfZnNwcml2YXRlLiAgSWYKKwkgKiBpdCBkb2Vzbid0IGhhdmUgb25lIHlldCwgdGhlbiBhbGxvY2F0ZSBvbmUgYW5kIGluaXRpYWxpemUgaXQuCisJICogVGhlIGNoZWNrcyB0byBzZWUgaWYgb25lIGlzIHRoZXJlIGFyZSBpbiB4ZnNfYnVmX2l0ZW1faW5pdCgpLgorCSAqLworCXhmc19idWZfaXRlbV9pbml0KGJwLCB0cC0+dF9tb3VudHApOworCisJLyoKKwkgKiBTZXQgdGhlIHJlY3Vyc2lvbiBjb3VudCBmb3IgdGhlIGJ1ZmZlciB3aXRoaW4gdGhpcyB0cmFuc2FjdGlvbgorCSAqIHRvIDAuCisJICovCisJYmlwID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhmc19idWZfbG9nX2l0ZW1fdCopOworCUFTU0VSVCghKGJpcC0+YmxpX2ZsYWdzICYgWEZTX0JMSV9TVEFMRSkpOworCUFTU0VSVCghKGJpcC0+YmxpX2Zvcm1hdC5ibGZfZmxhZ3MgJiBYRlNfQkxJX0NBTkNFTCkpOworCUFTU0VSVCghKGJpcC0+YmxpX2ZsYWdzICYgWEZTX0JMSV9MT0dHRUQpKTsKKwliaXAtPmJsaV9yZWN1ciA9IDA7CisKKwkvKgorCSAqIFRha2UgYSByZWZlcmVuY2UgZm9yIHRoaXMgdHJhbnNhY3Rpb24gb24gdGhlIGJ1ZiBpdGVtLgorCSAqLworCWF0b21pY19pbmMoJmJpcC0+YmxpX3JlZmNvdW50KTsKKworCS8qCisJICogR2V0IGEgbG9nX2l0ZW1fZGVzYyB0byBwb2ludCBhdCB0aGUgbmV3IGl0ZW0uCisJICovCisJKHZvaWQpIHhmc190cmFuc19hZGRfaXRlbSh0cCwgKHhmc19sb2dfaXRlbV90KiliaXApOworCisJLyoKKwkgKiBJbml0aWFsaXplIGJfZnNwcml2YXRlMiBzbyB3ZSBjYW4gZmluZCBpdCB3aXRoIGluY29yZV9tYXRjaCgpCisJICogYWJvdmUuCisJICovCisJWEZTX0JVRl9TRVRfRlNQUklWQVRFMihicCwgdHApOworCisJeGZzX2J1ZnRyYWNlKCJUUkFOUyBHRVQiLCBicCk7CisJeGZzX2J1Zl9pdGVtX3RyYWNlKCJHRVQiLCBiaXApOworCXJldHVybiAoYnApOworfQorCisvKgorICogR2V0IGFuZCBsb2NrIHRoZSBzdXBlcmJsb2NrIGJ1ZmZlciBvZiB0aGlzIGZpbGUgc3lzdGVtIGZvciB0aGUKKyAqIGdpdmVuIHRyYW5zYWN0aW9uLgorICoKKyAqIFdlIGRvbid0IG5lZWQgdG8gdXNlIGluY29yZV9tYXRjaCgpIGhlcmUsIGJlY2F1c2UgdGhlIHN1cGVyYmxvY2sKKyAqIGJ1ZmZlciBpcyBhIHByaXZhdGUgYnVmZmVyIHdoaWNoIHdlIGtlZXAgYSBwb2ludGVyIHRvIGluIHRoZQorICogbW91bnQgc3RydWN0dXJlLgorICovCit4ZnNfYnVmX3QgKgoreGZzX3RyYW5zX2dldHNiKHhmc190cmFuc190CSp0cCwKKwkJc3RydWN0IHhmc19tb3VudCAqbXAsCisJCWludAkJZmxhZ3MpCit7CisJeGZzX2J1Zl90CQkqYnA7CisJeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXA7CisKKwkvKgorCSAqIERlZmF1bHQgdG8ganVzdCB0cnlpbmcgdG8gbG9jayB0aGUgc3VwZXJibG9jayBidWZmZXIKKwkgKiBpZiB0cCBpcyBOVUxMLgorCSAqLworCWlmICh0cCA9PSBOVUxMKSB7CisJCXJldHVybiAoeGZzX2dldHNiKG1wLCBmbGFncykpOworCX0KKworCS8qCisJICogSWYgdGhlIHN1cGVyYmxvY2sgYnVmZmVyIGFscmVhZHkgaGFzIHRoaXMgdHJhbnNhY3Rpb24KKwkgKiBwb2ludGVyIGluIGl0cyBiX2ZzcHJpdmF0ZTIgZmllbGQsIHRoZW4gd2Uga25vdyB3ZSBhbHJlYWR5CisJICogaGF2ZSBpdCBsb2NrZWQuICBJbiB0aGlzIGNhc2Ugd2UganVzdCBpbmNyZW1lbnQgdGhlIGxvY2sKKwkgKiByZWN1cnNpb24gY291bnQgYW5kIHJldHVybiB0aGUgYnVmZmVyIHRvIHRoZSBjYWxsZXIuCisJICovCisJYnAgPSBtcC0+bV9zYl9icDsKKwlpZiAoWEZTX0JVRl9GU1BSSVZBVEUyKGJwLCB4ZnNfdHJhbnNfdCAqKSA9PSB0cCkgeworCQliaXAgPSBYRlNfQlVGX0ZTUFJJVkFURShicCwgeGZzX2J1Zl9sb2dfaXRlbV90Kik7CisJCUFTU0VSVChiaXAgIT0gTlVMTCk7CisJCUFTU0VSVChhdG9taWNfcmVhZCgmYmlwLT5ibGlfcmVmY291bnQpID4gMCk7CisJCWJpcC0+YmxpX3JlY3VyKys7CisJCXhmc19idWZfaXRlbV90cmFjZSgiR0VUU0IgUkVDVVIiLCBiaXApOworCQlyZXR1cm4gKGJwKTsKKwl9CisKKwlicCA9IHhmc19nZXRzYihtcCwgZmxhZ3MpOworCWlmIChicCA9PSBOVUxMKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qCisJICogVGhlIHhmc19idWZfbG9nX2l0ZW0gcG9pbnRlciBpcyBzdG9yZWQgaW4gYl9mc3ByaXZhdGUuICBJZgorCSAqIGl0IGRvZXNuJ3QgaGF2ZSBvbmUgeWV0LCB0aGVuIGFsbG9jYXRlIG9uZSBhbmQgaW5pdGlhbGl6ZSBpdC4KKwkgKiBUaGUgY2hlY2tzIHRvIHNlZSBpZiBvbmUgaXMgdGhlcmUgYXJlIGluIHhmc19idWZfaXRlbV9pbml0KCkuCisJICovCisJeGZzX2J1Zl9pdGVtX2luaXQoYnAsIG1wKTsKKworCS8qCisJICogU2V0IHRoZSByZWN1cnNpb24gY291bnQgZm9yIHRoZSBidWZmZXIgd2l0aGluIHRoaXMgdHJhbnNhY3Rpb24KKwkgKiB0byAwLgorCSAqLworCWJpcCA9IFhGU19CVUZfRlNQUklWQVRFKGJwLCB4ZnNfYnVmX2xvZ19pdGVtX3QqKTsKKwlBU1NFUlQoIShiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfU1RBTEUpKTsKKwlBU1NFUlQoIShiaXAtPmJsaV9mb3JtYXQuYmxmX2ZsYWdzICYgWEZTX0JMSV9DQU5DRUwpKTsKKwlBU1NFUlQoIShiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfTE9HR0VEKSk7CisJYmlwLT5ibGlfcmVjdXIgPSAwOworCisJLyoKKwkgKiBUYWtlIGEgcmVmZXJlbmNlIGZvciB0aGlzIHRyYW5zYWN0aW9uIG9uIHRoZSBidWYgaXRlbS4KKwkgKi8KKwlhdG9taWNfaW5jKCZiaXAtPmJsaV9yZWZjb3VudCk7CisKKwkvKgorCSAqIEdldCBhIGxvZ19pdGVtX2Rlc2MgdG8gcG9pbnQgYXQgdGhlIG5ldyBpdGVtLgorCSAqLworCSh2b2lkKSB4ZnNfdHJhbnNfYWRkX2l0ZW0odHAsICh4ZnNfbG9nX2l0ZW1fdCopYmlwKTsKKworCS8qCisJICogSW5pdGlhbGl6ZSBiX2ZzcHJpdmF0ZTIgc28gd2UgY2FuIGZpbmQgaXQgd2l0aCBpbmNvcmVfbWF0Y2goKQorCSAqIGFib3ZlLgorCSAqLworCVhGU19CVUZfU0VUX0ZTUFJJVkFURTIoYnAsIHRwKTsKKworCXhmc19idWZfaXRlbV90cmFjZSgiR0VUU0IiLCBiaXApOworCXJldHVybiAoYnApOworfQorCisjaWZkZWYgREVCVUcKK3hmc19idWZ0YXJnX3QgKnhmc19lcnJvcl90YXJnZXQ7CitpbnQJeGZzX2RvX2Vycm9yOworaW50CXhmc19yZXFfbnVtOworaW50CXhmc19lcnJvcl9tb2QgPSAzMzsKKyNlbmRpZgorCisvKgorICogR2V0IGFuZCBsb2NrIHRoZSBidWZmZXIgZm9yIHRoZSBjYWxsZXIgaWYgaXQgaXMgbm90IGFscmVhZHkKKyAqIGxvY2tlZCB3aXRoaW4gdGhlIGdpdmVuIHRyYW5zYWN0aW9uLiAgSWYgaXQgaGFzIG5vdCB5ZXQgYmVlbgorICogcmVhZCBpbiwgcmVhZCBpdCBmcm9tIGRpc2suIElmIGl0IGlzIGFscmVhZHkgbG9ja2VkCisgKiB3aXRoaW4gdGhlIHRyYW5zYWN0aW9uIGFuZCBhbHJlYWR5IHJlYWQgaW4sIGp1c3QgaW5jcmVtZW50IGl0cworICogbG9jayByZWN1cnNpb24gY291bnQgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gaXQuCisgKgorICogVXNlIHRoZSBmYXN0IHBhdGggZnVuY3Rpb24geGZzX3RyYW5zX2J1Zl9pdGVtX21hdGNoKCkgb3IgdGhlIGJ1ZmZlcgorICogY2FjaGUgcm91dGluZSBpbmNvcmVfbWF0Y2goKSB0byBmaW5kIHRoZSBidWZmZXIKKyAqIGlmIGl0IGlzIGFscmVhZHkgb3duZWQgYnkgdGhpcyB0cmFuc2FjdGlvbi4KKyAqCisgKiBJZiB3ZSBkb24ndCBhbHJlYWR5IG93biB0aGUgYnVmZmVyLCB1c2UgcmVhZF9idWYoKSB0byBnZXQgaXQuCisgKiBJZiBpdCBkb2Vzbid0IHlldCBoYXZlIGFuIGFzc29jaWF0ZWQgeGZzX2J1Zl9sb2dfaXRlbSBzdHJ1Y3R1cmUsCisgKiB0aGVuIGFsbG9jYXRlIG9uZSBhbmQgYWRkIHRoZSBpdGVtIHRvIHRoaXMgdHJhbnNhY3Rpb24uCisgKgorICogSWYgdGhlIHRyYW5zYWN0aW9uIHBvaW50ZXIgaXMgTlVMTCwgbWFrZSB0aGlzIGp1c3QgYSBub3JtYWwKKyAqIHJlYWRfYnVmKCkgY2FsbC4KKyAqLworaW50Cit4ZnNfdHJhbnNfcmVhZF9idWYoCisJeGZzX21vdW50X3QJKm1wLAorCXhmc190cmFuc190CSp0cCwKKwl4ZnNfYnVmdGFyZ190CSp0YXJnZXQsCisJeGZzX2RhZGRyX3QJYmxrbm8sCisJaW50CQlsZW4sCisJdWludAkJZmxhZ3MsCisJeGZzX2J1Zl90CSoqYnBwKQoreworCXhmc19idWZfdAkJKmJwOworCXhmc19idWZfbG9nX2l0ZW1fdAkqYmlwOworCWludAkJCWVycm9yOworCisJaWYgKGZsYWdzID09IDApCisJCWZsYWdzID0gWEZTX0JVRl9MT0NLIHwgWEZTX0JVRl9NQVBQRUQ7CisKKwkvKgorCSAqIERlZmF1bHQgdG8gYSBub3JtYWwgZ2V0X2J1ZigpIGNhbGwgaWYgdGhlIHRwIGlzIE5VTEwuCisJICovCisJaWYgKHRwID09IE5VTEwpIHsKKwkJYnAgPSB4ZnNfYnVmX3JlYWRfZmxhZ3ModGFyZ2V0LCBibGtubywgbGVuLCBmbGFncyB8IEJVRl9CVVNZKTsKKwkJaWYgKCFicCkKKwkJCXJldHVybiBYRlNfRVJST1IoRU5PTUVNKTsKKworCQlpZiAoKGJwICE9IE5VTEwpICYmIChYRlNfQlVGX0dFVEVSUk9SKGJwKSAhPSAwKSkgeworCQkJeGZzX2lvZXJyb3JfYWxlcnQoInhmc190cmFuc19yZWFkX2J1ZiIsIG1wLAorCQkJCQkgIGJwLCBibGtubyk7CisJCQllcnJvciA9IFhGU19CVUZfR0VURVJST1IoYnApOworCQkJeGZzX2J1Zl9yZWxzZShicCk7CisJCQlyZXR1cm4gZXJyb3I7CisJCX0KKyNpZmRlZiBERUJVRworCQlpZiAoeGZzX2RvX2Vycm9yICYmIChicCAhPSBOVUxMKSkgeworCQkJaWYgKHhmc19lcnJvcl90YXJnZXQgPT0gdGFyZ2V0KSB7CisJCQkJaWYgKCgoeGZzX3JlcV9udW0rKykgJSB4ZnNfZXJyb3JfbW9kKSA9PSAwKSB7CisJCQkJCXhmc19idWZfcmVsc2UoYnApOworCQkJCQlwcmludGsoIlJldHVybmluZyBlcnJvciFcbiIpOworCQkJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJCQkJfQorCQkJfQorCQl9CisjZW5kaWYKKwkJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQorCQkJZ290byBzaHV0ZG93bl9hYm9ydDsKKwkJKmJwcCA9IGJwOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIElmIHdlIGZpbmQgdGhlIGJ1ZmZlciBpbiB0aGUgY2FjaGUgd2l0aCB0aGlzIHRyYW5zYWN0aW9uCisJICogcG9pbnRlciBpbiBpdHMgYl9mc3ByaXZhdGUyIGZpZWxkLCB0aGVuIHdlIGtub3cgd2UgYWxyZWFkeQorCSAqIGhhdmUgaXQgbG9ja2VkLiAgSWYgaXQgaXMgYWxyZWFkeSByZWFkIGluIHdlIGp1c3QgaW5jcmVtZW50CisJICogdGhlIGxvY2sgcmVjdXJzaW9uIGNvdW50IGFuZCByZXR1cm4gdGhlIGJ1ZmZlciB0byB0aGUgY2FsbGVyLgorCSAqIElmIHRoZSBidWZmZXIgaXMgbm90IHlldCByZWFkIGluLCB0aGVuIHdlIHJlYWQgaXQgaW4sIGluY3JlbWVudAorCSAqIHRoZSBsb2NrIHJlY3Vyc2lvbiBjb3VudCwgYW5kIHJldHVybiBpdCB0byB0aGUgY2FsbGVyLgorCSAqLworCWlmICh0cC0+dF9pdGVtcy5saWNfbmV4dCA9PSBOVUxMKSB7CisJCWJwID0geGZzX3RyYW5zX2J1Zl9pdGVtX21hdGNoKHRwLCB0YXJnZXQsIGJsa25vLCBsZW4pOworCX0gZWxzZSB7CisJCWJwID0geGZzX3RyYW5zX2J1Zl9pdGVtX21hdGNoX2FsbCh0cCwgdGFyZ2V0LCBibGtubywgbGVuKTsKKwl9CisJaWYgKGJwICE9IE5VTEwpIHsKKwkJQVNTRVJUKFhGU19CVUZfVkFMVVNFTUEoYnApIDw9IDApOworCQlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUyKGJwLCB4ZnNfdHJhbnNfdCAqKSA9PSB0cCk7CisJCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURShicCwgdm9pZCAqKSAhPSBOVUxMKTsKKwkJQVNTRVJUKChYRlNfQlVGX0lTRVJST1IoYnApKSA9PSAwKTsKKwkJaWYgKCEoWEZTX0JVRl9JU0RPTkUoYnApKSkgeworCQkJeGZzX2J1ZnRyYWNlKCJSRUFEX0JVRl9JTkNPUkUgIURPTkUiLCBicCk7CisJCQlBU1NFUlQoIVhGU19CVUZfSVNBU1lOQyhicCkpOworCQkJWEZTX0JVRl9SRUFEKGJwKTsKKwkJCXhmc2Jkc3RyYXQodHAtPnRfbW91bnRwLCBicCk7CisJCQl4ZnNfaW93YWl0KGJwKTsKKwkJCWlmIChYRlNfQlVGX0dFVEVSUk9SKGJwKSAhPSAwKSB7CisJCQkJeGZzX2lvZXJyb3JfYWxlcnQoInhmc190cmFuc19yZWFkX2J1ZiIsIG1wLAorCQkJCQkJICBicCwgYmxrbm8pOworCQkJCWVycm9yID0gWEZTX0JVRl9HRVRFUlJPUihicCk7CisJCQkJeGZzX2J1Zl9yZWxzZShicCk7CisJCQkJLyoKKwkJCQkgKiBXZSBjYW4gZ3JhY2VmdWxseSByZWNvdmVyIGZyb20gbW9zdAorCQkJCSAqIHJlYWQgZXJyb3JzLiBPbmVzIHdlIGNhbid0IGFyZSB0aG9zZQorCQkJCSAqIHRoYXQgaGFwcGVuIGFmdGVyIHRoZSB0cmFuc2FjdGlvbidzCisJCQkJICogYWxyZWFkeSBkaXJ0eS4KKwkJCQkgKi8KKwkJCQlpZiAodHAtPnRfZmxhZ3MgJiBYRlNfVFJBTlNfRElSVFkpCisJCQkJCXhmc19mb3JjZV9zaHV0ZG93bih0cC0+dF9tb3VudHAsCisJCQkJCQkJICAgWEZTX01FVEFEQVRBX0lPX0VSUk9SKTsKKwkJCQlyZXR1cm4gZXJyb3I7CisJCQl9CisJCX0KKwkJLyoKKwkJICogV2UgbmV2ZXIgbG9ja2VkIHRoaXMgYnVmIG91cnNlbHZlcywgc28gd2Ugc2hvdWxkbid0CisJCSAqIGJyZWxzZSBpdCBlaXRoZXIuIEp1c3QgZ2V0IG91dC4KKwkJICovCisJCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkgeworCQkJeGZzX2J1ZnRyYWNlKCJSRUFEX0JVRl9JTkNPUkUgWEZTU0hVVEROIiwgYnApOworCQkJKmJwcCA9IE5VTEw7CisJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJCX0KKworCisJCWJpcCA9IFhGU19CVUZfRlNQUklWQVRFKGJwLCB4ZnNfYnVmX2xvZ19pdGVtX3QqKTsKKwkJYmlwLT5ibGlfcmVjdXIrKzsKKworCQlBU1NFUlQoYXRvbWljX3JlYWQoJmJpcC0+YmxpX3JlZmNvdW50KSA+IDApOworCQl4ZnNfYnVmX2l0ZW1fdHJhY2UoIlJFQUQgUkVDVVIiLCBiaXApOworCQkqYnBwID0gYnA7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogV2UgYWx3YXlzIHNwZWNpZnkgdGhlIEJVRl9CVVNZIGZsYWcgd2l0aGluIGEgdHJhbnNhY3Rpb24gc28KKwkgKiB0aGF0IGdldF9idWYgZG9lcyBub3QgdHJ5IHRvIHB1c2ggb3V0IGEgZGVsYXllZCB3cml0ZSBidWZmZXIKKwkgKiB3aGljaCBtaWdodCBjYXVzZSBhbm90aGVyIHRyYW5zYWN0aW9uIHRvIHRha2UgcGxhY2UgKGlmIHRoZQorCSAqIGJ1ZmZlciB3YXMgZGVsYXllZCBhbGxvYykuICBTdWNoIHJlY3Vyc2l2ZSB0cmFuc2FjdGlvbnMgY2FuCisJICogZWFzaWx5IGRlYWRsb2NrIHdpdGggb3VyIGN1cnJlbnQgdHJhbnNhY3Rpb24gYXMgd2VsbCBhcyBjYXVzZQorCSAqIHVzIHRvIHJ1biBvdXQgb2Ygc3RhY2sgc3BhY2UuCisJICovCisJYnAgPSB4ZnNfYnVmX3JlYWRfZmxhZ3ModGFyZ2V0LCBibGtubywgbGVuLCBmbGFncyB8IEJVRl9CVVNZKTsKKwlpZiAoYnAgPT0gTlVMTCkgeworCQkqYnBwID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChYRlNfQlVGX0dFVEVSUk9SKGJwKSAhPSAwKSB7CisJICAgIFhGU19CVUZfU1VQRVJfU1RBTEUoYnApOworCQl4ZnNfYnVmdHJhY2UoIlJFQUQgRVJST1IiLCBicCk7CisJCWVycm9yID0gWEZTX0JVRl9HRVRFUlJPUihicCk7CisKKwkJeGZzX2lvZXJyb3JfYWxlcnQoInhmc190cmFuc19yZWFkX2J1ZiIsIG1wLAorCQkJCSAgYnAsIGJsa25vKTsKKwkJaWYgKHRwLT50X2ZsYWdzICYgWEZTX1RSQU5TX0RJUlRZKQorCQkJeGZzX2ZvcmNlX3NodXRkb3duKHRwLT50X21vdW50cCwgWEZTX01FVEFEQVRBX0lPX0VSUk9SKTsKKwkJeGZzX2J1Zl9yZWxzZShicCk7CisJCXJldHVybiBlcnJvcjsKKwl9CisjaWZkZWYgREVCVUcKKwlpZiAoeGZzX2RvX2Vycm9yICYmICEodHAtPnRfZmxhZ3MgJiBYRlNfVFJBTlNfRElSVFkpKSB7CisJCWlmICh4ZnNfZXJyb3JfdGFyZ2V0ID09IHRhcmdldCkgeworCQkJaWYgKCgoeGZzX3JlcV9udW0rKykgJSB4ZnNfZXJyb3JfbW9kKSA9PSAwKSB7CisJCQkJeGZzX2ZvcmNlX3NodXRkb3duKHRwLT50X21vdW50cCwKKwkJCQkJCSAgIFhGU19NRVRBREFUQV9JT19FUlJPUik7CisJCQkJeGZzX2J1Zl9yZWxzZShicCk7CisJCQkJcHJpbnRrKCJSZXR1cm5pbmcgZXJyb3IgaW4gdHJhbnMhXG4iKTsKKwkJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKwlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCisJCWdvdG8gc2h1dGRvd25fYWJvcnQ7CisKKwkvKgorCSAqIFRoZSB4ZnNfYnVmX2xvZ19pdGVtIHBvaW50ZXIgaXMgc3RvcmVkIGluIGJfZnNwcml2YXRlLiAgSWYKKwkgKiBpdCBkb2Vzbid0IGhhdmUgb25lIHlldCwgdGhlbiBhbGxvY2F0ZSBvbmUgYW5kIGluaXRpYWxpemUgaXQuCisJICogVGhlIGNoZWNrcyB0byBzZWUgaWYgb25lIGlzIHRoZXJlIGFyZSBpbiB4ZnNfYnVmX2l0ZW1faW5pdCgpLgorCSAqLworCXhmc19idWZfaXRlbV9pbml0KGJwLCB0cC0+dF9tb3VudHApOworCisJLyoKKwkgKiBTZXQgdGhlIHJlY3Vyc2lvbiBjb3VudCBmb3IgdGhlIGJ1ZmZlciB3aXRoaW4gdGhpcyB0cmFuc2FjdGlvbgorCSAqIHRvIDAuCisJICovCisJYmlwID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhmc19idWZfbG9nX2l0ZW1fdCopOworCUFTU0VSVCghKGJpcC0+YmxpX2ZsYWdzICYgWEZTX0JMSV9TVEFMRSkpOworCUFTU0VSVCghKGJpcC0+YmxpX2Zvcm1hdC5ibGZfZmxhZ3MgJiBYRlNfQkxJX0NBTkNFTCkpOworCUFTU0VSVCghKGJpcC0+YmxpX2ZsYWdzICYgWEZTX0JMSV9MT0dHRUQpKTsKKwliaXAtPmJsaV9yZWN1ciA9IDA7CisKKwkvKgorCSAqIFRha2UgYSByZWZlcmVuY2UgZm9yIHRoaXMgdHJhbnNhY3Rpb24gb24gdGhlIGJ1ZiBpdGVtLgorCSAqLworCWF0b21pY19pbmMoJmJpcC0+YmxpX3JlZmNvdW50KTsKKworCS8qCisJICogR2V0IGEgbG9nX2l0ZW1fZGVzYyB0byBwb2ludCBhdCB0aGUgbmV3IGl0ZW0uCisJICovCisJKHZvaWQpIHhmc190cmFuc19hZGRfaXRlbSh0cCwgKHhmc19sb2dfaXRlbV90KiliaXApOworCisJLyoKKwkgKiBJbml0aWFsaXplIGJfZnNwcml2YXRlMiBzbyB3ZSBjYW4gZmluZCBpdCB3aXRoIGluY29yZV9tYXRjaCgpCisJICogYWJvdmUuCisJICovCisJWEZTX0JVRl9TRVRfRlNQUklWQVRFMihicCwgdHApOworCisJeGZzX2J1ZnRyYWNlKCJUUkFOUyBSRUFEIiwgYnApOworCXhmc19idWZfaXRlbV90cmFjZSgiUkVBRCIsIGJpcCk7CisJKmJwcCA9IGJwOworCXJldHVybiAwOworCitzaHV0ZG93bl9hYm9ydDoKKwkvKgorCSAqIHRoZSB0aGVvcnkgaGVyZSBpcyB0aGF0IGJ1ZmZlciBpcyBnb29kIGJ1dCB3ZSdyZQorCSAqIGJhaWxpbmcgb3V0IGJlY2F1c2UgdGhlIGZpbGVzeXN0ZW0gaXMgYmVpbmcgZm9yY2libHkKKwkgKiBzaHV0IGRvd24uICBTbyB3ZSBzaG91bGQgbGVhdmUgdGhlIGJfZmxhZ3MgYWxvbmUgc2luY2UKKwkgKiB0aGUgYnVmZmVyJ3Mgbm90IHN0YWxlZCBhbmQganVzdCBnZXQgb3V0LgorCSAqLworI2lmIGRlZmluZWQoREVCVUcpCisJaWYgKFhGU19CVUZfSVNTVEFMRShicCkgJiYgWEZTX0JVRl9JU0RFTEFZV1JJVEUoYnApKQorCQljbW5fZXJyKENFX05PVEUsICJhYm91dCB0byBwb3AgYXNzZXJ0LCBicCA9PSAweCVwIiwgYnApOworI2VuZGlmCisJQVNTRVJUKChYRlNfQlVGX0JGTEFHUyhicCkgJiAoWEZTX0JfU1RBTEV8WEZTX0JfREVMV1JJKSkgIT0KKwkJCQkJCShYRlNfQl9TVEFMRXxYRlNfQl9ERUxXUkkpKTsKKworCXhmc19idWZ0cmFjZSgiUkVBRF9CVUYgWEZTU0hVVEROIiwgYnApOworCXhmc19idWZfcmVsc2UoYnApOworCSpicHAgPSBOVUxMOworCXJldHVybiBYRlNfRVJST1IoRUlPKTsKK30KKworCisvKgorICogUmVsZWFzZSB0aGUgYnVmZmVyIGJwIHdoaWNoIHdhcyBwcmV2aW91c2x5IGFjcXVpcmVkIHdpdGggb25lIG9mIHRoZQorICogeGZzX3RyYW5zXy4uLiBidWZmZXIgYWxsb2NhdGlvbiByb3V0aW5lcyBpZiB0aGUgYnVmZmVyIGhhcyBub3QKKyAqIGJlZW4gbW9kaWZpZWQgd2l0aGluIHRoaXMgdHJhbnNhY3Rpb24uICBJZiB0aGUgYnVmZmVyIGlzIG1vZGlmaWVkCisgKiB3aXRoaW4gdGhpcyB0cmFuc2FjdGlvbiwgZG8gZGVjcmVtZW50IHRoZSByZWN1cnNpb24gY291bnQgYnV0IGRvCisgKiBub3QgcmVsZWFzZSB0aGUgYnVmZmVyIGV2ZW4gaWYgdGhlIGNvdW50IGdvZXMgdG8gMC4gIElmIHRoZSBidWZmZXIgaXMgbm90CisgKiBtb2RpZmllZCB3aXRoaW4gdGhlIHRyYW5zYWN0aW9uLCBkZWNyZW1lbnQgdGhlIHJlY3Vyc2lvbiBjb3VudCBhbmQKKyAqIHJlbGVhc2UgdGhlIGJ1ZmZlciBpZiB0aGUgcmVjdXJzaW9uIGNvdW50IGdvZXMgdG8gMC4KKyAqCisgKiBJZiB0aGUgYnVmZmVyIGlzIHRvIGJlIHJlbGVhc2VkIGFuZCBpdCB3YXMgbm90IG1vZGlmaWVkIGJlZm9yZQorICogdGhpcyB0cmFuc2FjdGlvbiBiZWdhbiwgdGhlbiBmcmVlIHRoZSBidWZfbG9nX2l0ZW0gYXNzb2NpYXRlZCB3aXRoIGl0LgorICoKKyAqIElmIHRoZSB0cmFuc2FjdGlvbiBwb2ludGVyIGlzIE5VTEwsIG1ha2UgdGhpcyBqdXN0IGEgbm9ybWFsCisgKiBicmVsc2UoKSBjYWxsLgorICovCit2b2lkCit4ZnNfdHJhbnNfYnJlbHNlKHhmc190cmFuc190CSp0cCwKKwkJIHhmc19idWZfdAkqYnApCit7CisJeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXA7CisJeGZzX2xvZ19pdGVtX3QJCSpsaXA7CisJeGZzX2xvZ19pdGVtX2Rlc2NfdAkqbGlkcDsKKworCS8qCisJICogRGVmYXVsdCB0byBhIG5vcm1hbCBicmVsc2UoKSBjYWxsIGlmIHRoZSB0cCBpcyBOVUxMLgorCSAqLworCWlmICh0cCA9PSBOVUxMKSB7CisJCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURTIoYnAsIHZvaWQgKikgPT0gTlVMTCk7CisJCS8qCisJCSAqIElmIHRoZXJlJ3MgYSBidWYgbG9nIGl0ZW0gYXR0YWNoZWQgdG8gdGhlIGJ1ZmZlciwKKwkJICogdGhlbiBsZXQgdGhlIEFJTCBrbm93IHRoYXQgdGhlIGJ1ZmZlciBpcyBiZWluZworCQkgKiB1bmxvY2tlZC4KKwkJICovCisJCWlmIChYRlNfQlVGX0ZTUFJJVkFURShicCwgdm9pZCAqKSAhPSBOVUxMKSB7CisJCQlsaXAgPSBYRlNfQlVGX0ZTUFJJVkFURShicCwgeGZzX2xvZ19pdGVtX3QgKik7CisJCQlpZiAobGlwLT5saV90eXBlID09IFhGU19MSV9CVUYpIHsKKwkJCQliaXAgPSBYRlNfQlVGX0ZTUFJJVkFURShicCx4ZnNfYnVmX2xvZ19pdGVtX3QqKTsKKwkJCQl4ZnNfdHJhbnNfdW5sb2NrZWRfaXRlbSgKKwkJCQkJCWJpcC0+YmxpX2l0ZW0ubGlfbW91bnRwLAorCQkJCQkJbGlwKTsKKwkJCX0KKwkJfQorCQl4ZnNfYnVmX3JlbHNlKGJwKTsKKwkJcmV0dXJuOworCX0KKworCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURTIoYnAsIHhmc190cmFuc190ICopID09IHRwKTsKKwliaXAgPSBYRlNfQlVGX0ZTUFJJVkFURShicCwgeGZzX2J1Zl9sb2dfaXRlbV90ICopOworCUFTU0VSVChiaXAtPmJsaV9pdGVtLmxpX3R5cGUgPT0gWEZTX0xJX0JVRik7CisJQVNTRVJUKCEoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX1NUQUxFKSk7CisJQVNTRVJUKCEoYmlwLT5ibGlfZm9ybWF0LmJsZl9mbGFncyAmIFhGU19CTElfQ0FOQ0VMKSk7CisJQVNTRVJUKGF0b21pY19yZWFkKCZiaXAtPmJsaV9yZWZjb3VudCkgPiAwKTsKKworCS8qCisJICogRmluZCB0aGUgaXRlbSBkZXNjcmlwdG9yIHBvaW50aW5nIHRvIHRoaXMgYnVmZmVyJ3MKKwkgKiBsb2cgaXRlbS4gIEl0IG11c3QgYmUgdGhlcmUuCisJICovCisJbGlkcCA9IHhmc190cmFuc19maW5kX2l0ZW0odHAsICh4ZnNfbG9nX2l0ZW1fdCopYmlwKTsKKwlBU1NFUlQobGlkcCAhPSBOVUxMKTsKKworCS8qCisJICogSWYgdGhlIHJlbGVhc2UgaXMganVzdCBmb3IgYSByZWN1cnNpdmUgbG9jaywKKwkgKiB0aGVuIGRlY3JlbWVudCB0aGUgY291bnQgYW5kIHJldHVybi4KKwkgKi8KKwlpZiAoYmlwLT5ibGlfcmVjdXIgPiAwKSB7CisJCWJpcC0+YmxpX3JlY3VyLS07CisJCXhmc19idWZfaXRlbV90cmFjZSgiUkVMU0UgUkVDVVIiLCBiaXApOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBJZiB0aGUgYnVmZmVyIGlzIGRpcnR5IHdpdGhpbiB0aGlzIHRyYW5zYWN0aW9uLCB3ZSBjYW4ndAorCSAqIHJlbGVhc2UgaXQgdW50aWwgd2UgY29tbWl0LgorCSAqLworCWlmIChsaWRwLT5saWRfZmxhZ3MgJiBYRlNfTElEX0RJUlRZKSB7CisJCXhmc19idWZfaXRlbV90cmFjZSgiUkVMU0UgRElSVFkiLCBiaXApOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBJZiB0aGUgYnVmZmVyIGhhcyBiZWVuIGludmFsaWRhdGVkLCB0aGVuIHdlIGNhbid0IHJlbGVhc2UKKwkgKiBpdCB1bnRpbCB0aGUgdHJhbnNhY3Rpb24gY29tbWl0cyB0byBkaXNrIHVubGVzcyBpdCBpcyByZS1kaXJ0aWVkCisJICogYXMgcGFydCBvZiB0aGlzIHRyYW5zYWN0aW9uLiAgVGhpcyBwcmV2ZW50cyB1cyBmcm9tIHB1bGxpbmcKKwkgKiB0aGUgaXRlbSBmcm9tIHRoZSBBSUwgYmVmb3JlIHdlIHNob3VsZC4KKwkgKi8KKwlpZiAoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX1NUQUxFKSB7CisJCXhmc19idWZfaXRlbV90cmFjZSgiUkVMU0UgU1RBTEUiLCBiaXApOworCQlyZXR1cm47CisJfQorCisJQVNTRVJUKCEoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX0xPR0dFRCkpOworCXhmc19idWZfaXRlbV90cmFjZSgiUkVMU0UiLCBiaXApOworCisJLyoKKwkgKiBGcmVlIHVwIHRoZSBsb2cgaXRlbSBkZXNjcmlwdG9yIHRyYWNraW5nIHRoZSByZWxlYXNlZCBpdGVtLgorCSAqLworCXhmc190cmFuc19mcmVlX2l0ZW0odHAsIGxpZHApOworCisJLyoKKwkgKiBDbGVhciB0aGUgaG9sZCBmbGFnIGluIHRoZSBidWYgbG9nIGl0ZW0gaWYgaXQgaXMgc2V0LgorCSAqIFdlIHdvdWxkbid0IHdhbnQgdGhlIG5leHQgdXNlciBvZiB0aGUgYnVmZmVyIHRvCisJICogZ2V0IGNvbmZ1c2VkLgorCSAqLworCWlmIChiaXAtPmJsaV9mbGFncyAmIFhGU19CTElfSE9MRCkgeworCQliaXAtPmJsaV9mbGFncyAmPSB+WEZTX0JMSV9IT0xEOworCX0KKworCS8qCisJICogRHJvcCBvdXIgcmVmZXJlbmNlIHRvIHRoZSBidWYgbG9nIGl0ZW0uCisJICovCisJYXRvbWljX2RlYygmYmlwLT5ibGlfcmVmY291bnQpOworCisJLyoKKwkgKiBJZiB0aGUgYnVmIGl0ZW0gaXMgbm90IHRyYWNraW5nIGRhdGEgaW4gdGhlIGxvZywgdGhlbgorCSAqIHdlIG11c3QgZnJlZSBpdCBiZWZvcmUgcmVsZWFzaW5nIHRoZSBidWZmZXIgYmFjayB0byB0aGUKKwkgKiBmcmVlIHBvb2wuICBCZWZvcmUgcmVsZWFzaW5nIHRoZSBidWZmZXIgdG8gdGhlIGZyZWUgcG9vbCwKKwkgKiBjbGVhciB0aGUgdHJhbnNhY3Rpb24gcG9pbnRlciBpbiBiX2ZzcHJpdmF0ZTIgdG8gZGlzc29sdmUKKwkgKiBpdHMgcmVsYXRpb24gdG8gdGhpcyB0cmFuc2FjdGlvbi4KKwkgKi8KKwlpZiAoIXhmc19idWZfaXRlbV9kaXJ0eShiaXApKSB7CisvKioqCisJCUFTU0VSVChicC0+Yl9waW5jb3VudCA9PSAwKTsKKyoqKi8KKwkJQVNTRVJUKGF0b21pY19yZWFkKCZiaXAtPmJsaV9yZWZjb3VudCkgPT0gMCk7CisJCUFTU0VSVCghKGJpcC0+YmxpX2l0ZW0ubGlfZmxhZ3MgJiBYRlNfTElfSU5fQUlMKSk7CisJCUFTU0VSVCghKGJpcC0+YmxpX2ZsYWdzICYgWEZTX0JMSV9JTk9ERV9BTExPQ19CVUYpKTsKKwkJeGZzX2J1Zl9pdGVtX3JlbHNlKGJwKTsKKwkJYmlwID0gTlVMTDsKKwl9CisJWEZTX0JVRl9TRVRfRlNQUklWQVRFMihicCwgTlVMTCk7CisKKwkvKgorCSAqIElmIHdlJ3ZlIHN0aWxsIGdvdCBhIGJ1ZiBsb2cgaXRlbSBvbiB0aGUgYnVmZmVyLCB0aGVuCisJICogdGVsbCB0aGUgQUlMIHRoYXQgdGhlIGJ1ZmZlciBpcyBiZWluZyB1bmxvY2tlZC4KKwkgKi8KKwlpZiAoYmlwICE9IE5VTEwpIHsKKwkJeGZzX3RyYW5zX3VubG9ja2VkX2l0ZW0oYmlwLT5ibGlfaXRlbS5saV9tb3VudHAsCisJCQkJCSh4ZnNfbG9nX2l0ZW1fdCopYmlwKTsKKwl9CisKKwl4ZnNfYnVmX3JlbHNlKGJwKTsKKwlyZXR1cm47Cit9CisKKy8qCisgKiBBZGQgdGhlIGxvY2tlZCBidWZmZXIgdG8gdGhlIHRyYW5zYWN0aW9uLgorICogVGhlIGJ1ZmZlciBtdXN0IGJlIGxvY2tlZCwgYW5kIGl0IGNhbm5vdCBiZSBhc3NvY2lhdGVkIHdpdGggYW55CisgKiB0cmFuc2FjdGlvbi4KKyAqCisgKiBJZiB0aGUgYnVmZmVyIGRvZXMgbm90IHlldCBoYXZlIGEgYnVmIGxvZyBpdGVtIGFzc29jaWF0ZWQgd2l0aCBpdCwKKyAqIHRoZW4gYWxsb2NhdGUgb25lIGZvciBpdC4gIFRoZW4gYWRkIHRoZSBidWYgaXRlbSB0byB0aGUgdHJhbnNhY3Rpb24uCisgKi8KK3ZvaWQKK3hmc190cmFuc19iam9pbih4ZnNfdHJhbnNfdAkqdHAsCisJCXhmc19idWZfdAkqYnApCit7CisJeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXA7CisKKwlBU1NFUlQoWEZTX0JVRl9JU0JVU1koYnApKTsKKwlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUyKGJwLCB2b2lkICopID09IE5VTEwpOworCisJLyoKKwkgKiBUaGUgeGZzX2J1Zl9sb2dfaXRlbSBwb2ludGVyIGlzIHN0b3JlZCBpbiBiX2ZzcHJpdmF0ZS4gIElmCisJICogaXQgZG9lc24ndCBoYXZlIG9uZSB5ZXQsIHRoZW4gYWxsb2NhdGUgb25lIGFuZCBpbml0aWFsaXplIGl0LgorCSAqIFRoZSBjaGVja3MgdG8gc2VlIGlmIG9uZSBpcyB0aGVyZSBhcmUgaW4geGZzX2J1Zl9pdGVtX2luaXQoKS4KKwkgKi8KKwl4ZnNfYnVmX2l0ZW1faW5pdChicCwgdHAtPnRfbW91bnRwKTsKKwliaXAgPSBYRlNfQlVGX0ZTUFJJVkFURShicCwgeGZzX2J1Zl9sb2dfaXRlbV90ICopOworCUFTU0VSVCghKGJpcC0+YmxpX2ZsYWdzICYgWEZTX0JMSV9TVEFMRSkpOworCUFTU0VSVCghKGJpcC0+YmxpX2Zvcm1hdC5ibGZfZmxhZ3MgJiBYRlNfQkxJX0NBTkNFTCkpOworCUFTU0VSVCghKGJpcC0+YmxpX2ZsYWdzICYgWEZTX0JMSV9MT0dHRUQpKTsKKworCS8qCisJICogVGFrZSBhIHJlZmVyZW5jZSBmb3IgdGhpcyB0cmFuc2FjdGlvbiBvbiB0aGUgYnVmIGl0ZW0uCisJICovCisJYXRvbWljX2luYygmYmlwLT5ibGlfcmVmY291bnQpOworCisJLyoKKwkgKiBHZXQgYSBsb2dfaXRlbV9kZXNjIHRvIHBvaW50IGF0IHRoZSBuZXcgaXRlbS4KKwkgKi8KKwkodm9pZCkgeGZzX3RyYW5zX2FkZF9pdGVtKHRwLCAoeGZzX2xvZ19pdGVtX3QgKiliaXApOworCisJLyoKKwkgKiBJbml0aWFsaXplIGJfZnNwcml2YXRlMiBzbyB3ZSBjYW4gZmluZCBpdCB3aXRoIGluY29yZV9tYXRjaCgpCisJICogaW4geGZzX3RyYW5zX2dldF9idWYoKSBhbmQgZnJpZW5kcyBhYm92ZS4KKwkgKi8KKwlYRlNfQlVGX1NFVF9GU1BSSVZBVEUyKGJwLCB0cCk7CisKKwl4ZnNfYnVmX2l0ZW1fdHJhY2UoIkJKT0lOIiwgYmlwKTsKK30KKworLyoKKyAqIE1hcmsgdGhlIGJ1ZmZlciBhcyBub3QgbmVlZGluZyB0byBiZSB1bmxvY2tlZCB3aGVuIHRoZSBidWYgaXRlbSdzCisgKiBJT1BfVU5MT0NLKCkgcm91dGluZSBpcyBjYWxsZWQuICBUaGUgYnVmZmVyIG11c3QgYWxyZWFkeSBiZSBsb2NrZWQKKyAqIGFuZCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHRyYW5zYWN0aW9uLgorICovCisvKiBBUkdTVVNFRCAqLwordm9pZAoreGZzX3RyYW5zX2Job2xkKHhmc190cmFuc190CSp0cCwKKwkJeGZzX2J1Zl90CSpicCkKK3sKKwl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcDsKKworCUFTU0VSVChYRlNfQlVGX0lTQlVTWShicCkpOworCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURTIoYnAsIHhmc190cmFuc190ICopID09IHRwKTsKKwlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHZvaWQgKikgIT0gTlVMTCk7CisKKwliaXAgPSBYRlNfQlVGX0ZTUFJJVkFURShicCwgeGZzX2J1Zl9sb2dfaXRlbV90ICopOworCUFTU0VSVCghKGJpcC0+YmxpX2ZsYWdzICYgWEZTX0JMSV9TVEFMRSkpOworCUFTU0VSVCghKGJpcC0+YmxpX2Zvcm1hdC5ibGZfZmxhZ3MgJiBYRlNfQkxJX0NBTkNFTCkpOworCUFTU0VSVChhdG9taWNfcmVhZCgmYmlwLT5ibGlfcmVmY291bnQpID4gMCk7CisJYmlwLT5ibGlfZmxhZ3MgfD0gWEZTX0JMSV9IT0xEOworCXhmc19idWZfaXRlbV90cmFjZSgiQkhPTEQiLCBiaXApOworfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgdG8gbWFyayBieXRlcyBmaXJzdCB0aHJvdWdoIGxhc3QgaW5jbHVzaXZlIG9mIHRoZSBnaXZlbgorICogYnVmZmVyIGFzIG5lZWRpbmcgdG8gYmUgbG9nZ2VkIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIGNvbW1pdHRlZC4KKyAqIFRoZSBidWZmZXIgbXVzdCBhbHJlYWR5IGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24uCisgKgorICogRmlyc3QgYW5kIGxhc3QgYXJlIG51bWJlcnMgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGlzIGJ1ZmZlciwKKyAqIHNvIHRoZSBmaXJzdCBieXRlIGluIHRoZSBidWZmZXIgaXMgbnVtYmVyZWQgMCByZWdhcmRsZXNzIG9mIHRoZQorICogdmFsdWUgb2YgYl9ibGtuby4KKyAqLwordm9pZAoreGZzX3RyYW5zX2xvZ19idWYoeGZzX3RyYW5zX3QJKnRwLAorCQkgIHhmc19idWZfdAkqYnAsCisJCSAgdWludAkJZmlyc3QsCisJCSAgdWludAkJbGFzdCkKK3sKKwl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJpcDsKKwl4ZnNfbG9nX2l0ZW1fZGVzY190CSpsaWRwOworCisJQVNTRVJUKFhGU19CVUZfSVNCVVNZKGJwKSk7CisJQVNTRVJUKFhGU19CVUZfRlNQUklWQVRFMihicCwgeGZzX3RyYW5zX3QgKikgPT0gdHApOworCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURShicCwgdm9pZCAqKSAhPSBOVUxMKTsKKwlBU1NFUlQoKGZpcnN0IDw9IGxhc3QpICYmIChsYXN0IDwgWEZTX0JVRl9DT1VOVChicCkpKTsKKwlBU1NFUlQoKFhGU19CVUZfSU9ET05FX0ZVTkMoYnApID09IE5VTEwpIHx8CisJICAgICAgIChYRlNfQlVGX0lPRE9ORV9GVU5DKGJwKSA9PSB4ZnNfYnVmX2lvZG9uZV9jYWxsYmFja3MpKTsKKworCS8qCisJICogTWFyayB0aGUgYnVmZmVyIGFzIG5lZWRpbmcgdG8gYmUgd3JpdHRlbiBvdXQgZXZlbnR1YWxseSwKKwkgKiBhbmQgc2V0IGl0cyBpb2RvbmUgZnVuY3Rpb24gdG8gcmVtb3ZlIHRoZSBidWZmZXIncyBidWYgbG9nCisJICogaXRlbSBmcm9tIHRoZSBBSUwgYW5kIGZyZWUgaXQgd2hlbiB0aGUgYnVmZmVyIGlzIGZsdXNoZWQKKwkgKiB0byBkaXNrLiAgU2VlIHhmc19idWZfYXR0YWNoX2lvZG9uZSgpIGZvciBtb3JlIGRldGFpbHMKKwkgKiBvbiBsaV9jYiBhbmQgeGZzX2J1Zl9pb2RvbmVfY2FsbGJhY2tzKCkuCisJICogSWYgd2UgZW5kIHVwIGFib3J0aW5nIHRoaXMgdHJhbnNhY3Rpb24sIHdlIHRyYXAgdGhpcyBidWZmZXIKKwkgKiBpbnNpZGUgdGhlIGJfYmRzdHJhdCBjYWxsYmFjayBzbyB0aGF0IHRoaXMgd29uJ3QgZ2V0IHdyaXR0ZW4gdG8KKwkgKiBkaXNrLgorCSAqLworCVhGU19CVUZfREVMQVlXUklURShicCk7CisJWEZTX0JVRl9ET05FKGJwKTsKKworCWJpcCA9IFhGU19CVUZfRlNQUklWQVRFKGJwLCB4ZnNfYnVmX2xvZ19pdGVtX3QgKik7CisJQVNTRVJUKGF0b21pY19yZWFkKCZiaXAtPmJsaV9yZWZjb3VudCkgPiAwKTsKKwlYRlNfQlVGX1NFVF9JT0RPTkVfRlVOQyhicCwgeGZzX2J1Zl9pb2RvbmVfY2FsbGJhY2tzKTsKKwliaXAtPmJsaV9pdGVtLmxpX2NiID0gKHZvaWQoKikoeGZzX2J1Zl90Kix4ZnNfbG9nX2l0ZW1fdCopKXhmc19idWZfaW9kb25lOworCisJLyoKKwkgKiBJZiB3ZSBpbnZhbGlkYXRlZCB0aGUgYnVmZmVyIHdpdGhpbiB0aGlzIHRyYW5zYWN0aW9uLCB0aGVuCisJICogY2FuY2VsIHRoZSBpbnZhbGlkYXRpb24gbm93IHRoYXQgd2UncmUgZGlydHlpbmcgdGhlIGJ1ZmZlcgorCSAqIGFnYWluLiAgVGhlcmUgYXJlIG5vIHJhY2VzIHdpdGggdGhlIGNvZGUgaW4geGZzX2J1Zl9pdGVtX3VucGluKCksCisJICogYmVjYXVzZSB3ZSBoYXZlIGEgcmVmZXJlbmNlIHRvIHRoZSBidWZmZXIgdGhpcyBlbnRpcmUgdGltZS4KKwkgKi8KKwlpZiAoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX1NUQUxFKSB7CisJCXhmc19idWZfaXRlbV90cmFjZSgiQkxPRyBVTlNUQUxFIiwgYmlwKTsKKwkJYmlwLT5ibGlfZmxhZ3MgJj0gflhGU19CTElfU1RBTEU7CisJCUFTU0VSVChYRlNfQlVGX0lTU1RBTEUoYnApKTsKKwkJWEZTX0JVRl9VTlNUQUxFKGJwKTsKKwkJYmlwLT5ibGlfZm9ybWF0LmJsZl9mbGFncyAmPSB+WEZTX0JMSV9DQU5DRUw7CisJfQorCisJbGlkcCA9IHhmc190cmFuc19maW5kX2l0ZW0odHAsICh4ZnNfbG9nX2l0ZW1fdCopYmlwKTsKKwlBU1NFUlQobGlkcCAhPSBOVUxMKTsKKworCXRwLT50X2ZsYWdzIHw9IFhGU19UUkFOU19ESVJUWTsKKwlsaWRwLT5saWRfZmxhZ3MgfD0gWEZTX0xJRF9ESVJUWTsKKwlsaWRwLT5saWRfZmxhZ3MgJj0gflhGU19MSURfQlVGX1NUQUxFOworCWJpcC0+YmxpX2ZsYWdzIHw9IFhGU19CTElfTE9HR0VEOworCXhmc19idWZfaXRlbV9sb2coYmlwLCBmaXJzdCwgbGFzdCk7CisJeGZzX2J1Zl9pdGVtX3RyYWNlKCJCTE9HIiwgYmlwKTsKK30KKworCisvKgorICogVGhpcyBjYWxsZWQgdG8gaW52YWxpZGF0ZSBhIGJ1ZmZlciB0aGF0IGlzIGJlaW5nIHVzZWQgd2l0aGluCisgKiBhIHRyYW5zYWN0aW9uLiAgVHlwaWNhbGx5IHRoaXMgaXMgYmVjYXVzZSB0aGUgYmxvY2tzIGluIHRoZQorICogYnVmZmVyIGFyZSBiZWluZyBmcmVlZCwgc28gd2UgbmVlZCB0byBwcmV2ZW50IGl0IGZyb20gYmVpbmcKKyAqIHdyaXR0ZW4gb3V0IHdoZW4gd2UncmUgZG9uZS4gIEFsbG93aW5nIGl0IHRvIGJlIHdyaXR0ZW4gYWdhaW4KKyAqIG1pZ2h0IG92ZXJ3cml0ZSBkYXRhIGluIHRoZSBmcmVlIGJsb2NrcyBpZiB0aGV5IGFyZSByZWFsbG9jYXRlZAorICogdG8gYSBmaWxlLgorICoKKyAqIFdlIHByZXZlbnQgdGhlIGJ1ZmZlciBmcm9tIGJlaW5nIHdyaXR0ZW4gb3V0IGJ5IGNsZWFyaW5nIHRoZQorICogQl9ERUxXUkkgZmxhZy4gIFdlIGNhbid0IGFsd2F5cworICogZ2V0IHJpZCBvZiB0aGUgYnVmIGxvZyBpdGVtIGF0IHRoaXMgcG9pbnQsIHRob3VnaCwgYmVjYXVzZQorICogdGhlIGJ1ZmZlciBtYXkgc3RpbGwgYmUgcGlubmVkIGJ5IGFub3RoZXIgdHJhbnNhY3Rpb24uICBJZiB0aGF0CisgKiBpcyB0aGUgY2FzZSwgdGhlbiB3ZSdsbCB3YWl0IHVudGlsIHRoZSBidWZmZXIgaXMgY29tbWl0dGVkIHRvCisgKiBkaXNrIGZvciB0aGUgbGFzdCB0aW1lICh3ZSBjYW4gdGVsbCBieSB0aGUgcmVmIGNvdW50KSBhbmQKKyAqIGZyZWUgaXQgaW4geGZzX2J1Zl9pdGVtX3VucGluKCkuICBVbnRpbCBpdCBpcyBjbGVhbmVkIHVwIHdlCisgKiB3aWxsIGtlZXAgdGhlIGJ1ZmZlciBsb2NrZWQgc28gdGhhdCB0aGUgYnVmZmVyIGFuZCBidWYgbG9nIGl0ZW0KKyAqIGFyZSBub3QgcmV1c2VkLgorICovCit2b2lkCit4ZnNfdHJhbnNfYmludmFsKAorCXhmc190cmFuc190CSp0cCwKKwl4ZnNfYnVmX3QJKmJwKQoreworCXhmc19sb2dfaXRlbV9kZXNjX3QJKmxpZHA7CisJeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXA7CisKKwlBU1NFUlQoWEZTX0JVRl9JU0JVU1koYnApKTsKKwlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUyKGJwLCB4ZnNfdHJhbnNfdCAqKSA9PSB0cCk7CisJQVNTRVJUKFhGU19CVUZfRlNQUklWQVRFKGJwLCB2b2lkICopICE9IE5VTEwpOworCisJYmlwID0gWEZTX0JVRl9GU1BSSVZBVEUoYnAsIHhmc19idWZfbG9nX2l0ZW1fdCAqKTsKKwlsaWRwID0geGZzX3RyYW5zX2ZpbmRfaXRlbSh0cCwgKHhmc19sb2dfaXRlbV90KiliaXApOworCUFTU0VSVChsaWRwICE9IE5VTEwpOworCUFTU0VSVChhdG9taWNfcmVhZCgmYmlwLT5ibGlfcmVmY291bnQpID4gMCk7CisKKwlpZiAoYmlwLT5ibGlfZmxhZ3MgJiBYRlNfQkxJX1NUQUxFKSB7CisJCS8qCisJCSAqIElmIHRoZSBidWZmZXIgaXMgYWxyZWFkeSBpbnZhbGlkYXRlZCwgdGhlbgorCQkgKiBqdXN0IHJldHVybi4KKwkJICovCisJCUFTU0VSVCghKFhGU19CVUZfSVNERUxBWVdSSVRFKGJwKSkpOworCQlBU1NFUlQoWEZTX0JVRl9JU1NUQUxFKGJwKSk7CisJCUFTU0VSVCghKGJpcC0+YmxpX2ZsYWdzICYgKFhGU19CTElfTE9HR0VEIHwgWEZTX0JMSV9ESVJUWSkpKTsKKwkJQVNTRVJUKCEoYmlwLT5ibGlfZm9ybWF0LmJsZl9mbGFncyAmIFhGU19CTElfSU5PREVfQlVGKSk7CisJCUFTU0VSVChiaXAtPmJsaV9mb3JtYXQuYmxmX2ZsYWdzICYgWEZTX0JMSV9DQU5DRUwpOworCQlBU1NFUlQobGlkcC0+bGlkX2ZsYWdzICYgWEZTX0xJRF9ESVJUWSk7CisJCUFTU0VSVCh0cC0+dF9mbGFncyAmIFhGU19UUkFOU19ESVJUWSk7CisJCXhmc19idWZ0cmFjZSgiWEZTX0JJTlZBTCBSRUNVUiIsIGJwKTsKKwkJeGZzX2J1Zl9pdGVtX3RyYWNlKCJCSU5WQUwgUkVDVVIiLCBiaXApOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBDbGVhciB0aGUgZGlydHkgYml0IGluIHRoZSBidWZmZXIgYW5kIHNldCB0aGUgU1RBTEUgZmxhZworCSAqIGluIHRoZSBidWYgbG9nIGl0ZW0uICBUaGUgU1RBTEUgZmxhZyB3aWxsIGJlIHVzZWQgaW4KKwkgKiB4ZnNfYnVmX2l0ZW1fdW5waW4oKSB0byBkZXRlcm1pbmUgaWYgaXQgc2hvdWxkIGNsZWFuIHVwCisJICogd2hlbiB0aGUgbGFzdCByZWZlcmVuY2UgdG8gdGhlIGJ1ZiBpdGVtIGlzIGdpdmVuIHVwLgorCSAqIFdlIHNldCB0aGUgWEZTX0JMSV9DQU5DRUwgZmxhZyBpbiB0aGUgYnVmIGxvZyBmb3JtYXQgc3RydWN0dXJlCisJICogYW5kIGxvZyB0aGUgYnVmIGl0ZW0uICBUaGlzIHdpbGwgYmUgdXNlZCBhdCByZWNvdmVyeSB0aW1lCisJICogdG8gZGV0ZXJtaW5lIHRoYXQgY29waWVzIG9mIHRoZSBidWZmZXIgaW4gdGhlIGxvZyBiZWZvcmUKKwkgKiB0aGlzIHNob3VsZCBub3QgYmUgcmVwbGF5ZWQuCisJICogV2UgbWFyayB0aGUgaXRlbSBkZXNjcmlwdG9yIGFuZCB0aGUgdHJhbnNhY3Rpb24gZGlydHkgc28KKwkgKiB0aGF0IHdlJ2xsIGhvbGQgdGhlIGJ1ZmZlciB1bnRpbCBhZnRlciB0aGUgY29tbWl0LgorCSAqCisJICogU2luY2Ugd2UncmUgaW52YWxpZGF0aW5nIHRoZSBidWZmZXIsIHdlIGFsc28gY2xlYXIgdGhlIHN0YXRlCisJICogYWJvdXQgd2hpY2ggcGFydHMgb2YgdGhlIGJ1ZmZlciBoYXZlIGJlZW4gbG9nZ2VkLiAgV2UgYWxzbworCSAqIGNsZWFyIHRoZSBmbGFnIGluZGljYXRpbmcgdGhhdCB0aGlzIGlzIGFuIGlub2RlIGJ1ZmZlciBzaW5jZQorCSAqIHRoZSBkYXRhIGluIHRoZSBidWZmZXIgd2lsbCBubyBsb25nZXIgYmUgdmFsaWQuCisJICoKKwkgKiBXZSBzZXQgdGhlIHN0YWxlIGJpdCBpbiB0aGUgYnVmZmVyIGFzIHdlbGwgc2luY2Ugd2UncmUgZ2V0dGluZworCSAqIHJpZCBvZiBpdC4KKwkgKi8KKwlYRlNfQlVGX1VOREVMQVlXUklURShicCk7CisJWEZTX0JVRl9TVEFMRShicCk7CisJYmlwLT5ibGlfZmxhZ3MgfD0gWEZTX0JMSV9TVEFMRTsKKwliaXAtPmJsaV9mbGFncyAmPSB+KFhGU19CTElfTE9HR0VEIHwgWEZTX0JMSV9ESVJUWSk7CisJYmlwLT5ibGlfZm9ybWF0LmJsZl9mbGFncyAmPSB+WEZTX0JMSV9JTk9ERV9CVUY7CisJYmlwLT5ibGlfZm9ybWF0LmJsZl9mbGFncyB8PSBYRlNfQkxJX0NBTkNFTDsKKwltZW1zZXQoKGNoYXIgKikoYmlwLT5ibGlfZm9ybWF0LmJsZl9kYXRhX21hcCksIDAsCisJICAgICAgKGJpcC0+YmxpX2Zvcm1hdC5ibGZfbWFwX3NpemUgKiBzaXplb2YodWludCkpKTsKKwlsaWRwLT5saWRfZmxhZ3MgfD0gWEZTX0xJRF9ESVJUWXxYRlNfTElEX0JVRl9TVEFMRTsKKwl0cC0+dF9mbGFncyB8PSBYRlNfVFJBTlNfRElSVFk7CisJeGZzX2J1ZnRyYWNlKCJYRlNfQklOVkFMIiwgYnApOworCXhmc19idWZfaXRlbV90cmFjZSgiQklOVkFMIiwgYmlwKTsKK30KKworLyoKKyAqIFRoaXMgY2FsbCBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIGJ1ZmZlciBjb250YWlucyBvbi1kaXNrCisgKiBpbm9kZXMgd2hpY2ggbXVzdCBiZSBoYW5kbGVkIHNwZWNpYWxseSBkdXJpbmcgcmVjb3ZlcnkuICBUaGV5CisgKiByZXF1aXJlIHNwZWNpYWwgaGFuZGxpbmcgYmVjYXVzZSBvbmx5IHRoZSBkaV9uZXh0X3VubGlua2VkIGZyb20KKyAqIHRoZSBpbm9kZXMgaW4gdGhlIGJ1ZmZlciBzaG91bGQgYmUgcmVjb3ZlcmVkLiAgVGhlIHJlc3Qgb2YgdGhlCisgKiBkYXRhIGluIHRoZSBidWZmZXIgaXMgbG9nZ2VkIHZpYSB0aGUgaW5vZGVzIHRoZW1zZWx2ZXMuCisgKgorICogQWxsIHdlIGRvIGlzIHNldCB0aGUgWEZTX0JMSV9JTk9ERV9CVUYgZmxhZyBpbiB0aGUgYnVmZmVyJ3MgbG9nCisgKiBmb3JtYXQgc3RydWN0dXJlIHNvIHRoYXQgd2UnbGwga25vdyB3aGF0IHRvIGRvIGF0IHJlY292ZXJ5IHRpbWUuCisgKi8KKy8qIEFSR1NVU0VEICovCit2b2lkCit4ZnNfdHJhbnNfaW5vZGVfYnVmKAorCXhmc190cmFuc190CSp0cCwKKwl4ZnNfYnVmX3QJKmJwKQoreworCXhmc19idWZfbG9nX2l0ZW1fdAkqYmlwOworCisJQVNTRVJUKFhGU19CVUZfSVNCVVNZKGJwKSk7CisJQVNTRVJUKFhGU19CVUZfRlNQUklWQVRFMihicCwgeGZzX3RyYW5zX3QgKikgPT0gdHApOworCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURShicCwgdm9pZCAqKSAhPSBOVUxMKTsKKworCWJpcCA9IFhGU19CVUZfRlNQUklWQVRFKGJwLCB4ZnNfYnVmX2xvZ19pdGVtX3QgKik7CisJQVNTRVJUKGF0b21pY19yZWFkKCZiaXAtPmJsaV9yZWZjb3VudCkgPiAwKTsKKworCWJpcC0+YmxpX2Zvcm1hdC5ibGZfZmxhZ3MgfD0gWEZTX0JMSV9JTk9ERV9CVUY7Cit9CisKKy8qCisgKiBUaGlzIGNhbGwgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBidWZmZXIgaXMgZ29pbmcgdG8KKyAqIGJlIHN0YWxlZCBhbmQgd2FzIGFuIGlub2RlIGJ1ZmZlci4gVGhpcyBtZWFucyBpdCBnZXRzCisgKiBzcGVjaWFsIHByb2Nlc3NpbmcgZHVyaW5nIHVucGluIC0gd2hlcmUgYW55IGlub2RlcyAKKyAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgYnVmZmVyIHNob3VsZCBiZSByZW1vdmVkIGZyb20gYWlsLgorICogVGhlcmUgaXMgYWxzbyBzcGVjaWFsIHByb2Nlc3NpbmcgZHVyaW5nIHJlY292ZXJ5LAorICogYW55IHJlcGxheSBvZiB0aGUgaW5vZGVzIGluIHRoZSBidWZmZXIgbmVlZHMgdG8gYmUKKyAqIHByZXZlbnRlZCBhcyB0aGUgYnVmZmVyIG1heSBoYXZlIGJlZW4gcmV1c2VkLgorICovCit2b2lkCit4ZnNfdHJhbnNfc3RhbGVfaW5vZGVfYnVmKAorCXhmc190cmFuc190CSp0cCwKKwl4ZnNfYnVmX3QJKmJwKQoreworCXhmc19idWZfbG9nX2l0ZW1fdAkqYmlwOworCisJQVNTRVJUKFhGU19CVUZfSVNCVVNZKGJwKSk7CisJQVNTRVJUKFhGU19CVUZfRlNQUklWQVRFMihicCwgeGZzX3RyYW5zX3QgKikgPT0gdHApOworCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURShicCwgdm9pZCAqKSAhPSBOVUxMKTsKKworCWJpcCA9IFhGU19CVUZfRlNQUklWQVRFKGJwLCB4ZnNfYnVmX2xvZ19pdGVtX3QgKik7CisJQVNTRVJUKGF0b21pY19yZWFkKCZiaXAtPmJsaV9yZWZjb3VudCkgPiAwKTsKKworCWJpcC0+YmxpX2ZsYWdzIHw9IFhGU19CTElfU1RBTEVfSU5PREU7CisJYmlwLT5ibGlfaXRlbS5saV9jYiA9ICh2b2lkKCopKHhmc19idWZfdCoseGZzX2xvZ19pdGVtX3QqKSkKKwkJeGZzX2J1Zl9pb2RvbmU7Cit9CisKKworCisvKgorICogTWFyayB0aGUgYnVmZmVyIGFzIGJlaW5nIG9uZSB3aGljaCBjb250YWlucyBuZXdseSBhbGxvY2F0ZWQKKyAqIGlub2Rlcy4gIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgZXZlbiBpZiB0aGlzIGJ1ZmZlciBpcworICogcmVsb2dnZWQgYXMgYW4gJ2lub2RlIGJ1Zicgd2Ugc3RpbGwgcmVjb3ZlciBhbGwgb2YgdGhlIGlub2RlCisgKiBpbWFnZXMgaW4gdGhlIGZhY2Ugb2YgYSBjcmFzaC4gIFRoaXMgd29ya3MgaW4gY29vcmRpbmF0aW9uIHdpdGgKKyAqIHhmc19idWZfaXRlbV9jb21taXR0ZWQoKSB0byBlbnN1cmUgdGhhdCB0aGUgYnVmZmVyIHJlbWFpbnMgaW4gdGhlCisgKiBBSUwgYXQgaXRzIG9yaWdpbmFsIGxvY2F0aW9uIGV2ZW4gYWZ0ZXIgaXQgaGFzIGJlZW4gcmVsb2dnZWQuCisgKi8KKy8qIEFSR1NVU0VEICovCit2b2lkCit4ZnNfdHJhbnNfaW5vZGVfYWxsb2NfYnVmKAorCXhmc190cmFuc190CSp0cCwKKwl4ZnNfYnVmX3QJKmJwKQoreworCXhmc19idWZfbG9nX2l0ZW1fdAkqYmlwOworCisJQVNTRVJUKFhGU19CVUZfSVNCVVNZKGJwKSk7CisJQVNTRVJUKFhGU19CVUZfRlNQUklWQVRFMihicCwgeGZzX3RyYW5zX3QgKikgPT0gdHApOworCUFTU0VSVChYRlNfQlVGX0ZTUFJJVkFURShicCwgdm9pZCAqKSAhPSBOVUxMKTsKKworCWJpcCA9IFhGU19CVUZfRlNQUklWQVRFKGJwLCB4ZnNfYnVmX2xvZ19pdGVtX3QgKik7CisJQVNTRVJUKGF0b21pY19yZWFkKCZiaXAtPmJsaV9yZWZjb3VudCkgPiAwKTsKKworCWJpcC0+YmxpX2ZsYWdzIHw9IFhGU19CTElfSU5PREVfQUxMT0NfQlVGOworfQorCisKKy8qCisgKiBTaW1pbGFyIHRvIHhmc190cmFuc19pbm9kZV9idWYoKSwgdGhpcyBtYXJrcyB0aGUgYnVmZmVyIGFzIGEgY2x1c3RlciBvZgorICogZHF1b3RzLiBIb3dldmVyLCB1bmxpa2UgaW4gaW5vZGUgYnVmZmVyIHJlY292ZXJ5LCBkcXVvdCBidWZmZXJzIGdldAorICogcmVjb3ZlcmVkIGluIHRoZWlyIGVudGlyZXR5LiAoSGVuY2UsIG5vIFhGU19CTElfRFFVT1RfQUxMT0NfQlVGIGZsYWcpLgorICogVGhlIG9ubHkgdGhpbmcgdGhhdCBtYWtlcyBkcXVvdCBidWZmZXJzIGRpZmZlcmVudCBmcm9tIHJlZ3VsYXIKKyAqIGJ1ZmZlcnMgaXMgdGhhdCB3ZSBtdXN0IG5vdCByZXBsYXkgZHF1b3QgYnVmcyB3aGVuIHJlY292ZXJpbmcKKyAqIGlmIGEgX2NvcnJlc3BvbmRpbmdfIHF1b3Rhb2ZmIGhhcyBoYXBwZW5lZC4gV2UgYWxzbyBoYXZlIHRvIGRpc3Rpbmd1aXNoCisgKiBiZXR3ZWVuIHVzciBkcXVvdCBidWZzIGFuZCBncnAgZHF1b3QgYnVmcywgYmVjYXVzZSB1c3IgYW5kIGdycCBxdW90YXMKKyAqIGNhbiBiZSB0dXJuZWQgb2ZmIGluZGVwZW5kZW50bHkuCisgKi8KKy8qIEFSR1NVU0VEICovCit2b2lkCit4ZnNfdHJhbnNfZHF1b3RfYnVmKAorCXhmc190cmFuc190CSp0cCwKKwl4ZnNfYnVmX3QJKmJwLAorCXVpbnQJCXR5cGUpCit7CisJeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXA7CisKKwlBU1NFUlQoWEZTX0JVRl9JU0JVU1koYnApKTsKKwlBU1NFUlQoWEZTX0JVRl9GU1BSSVZBVEUyKGJwLCB4ZnNfdHJhbnNfdCAqKSA9PSB0cCk7CisJQVNTRVJUKFhGU19CVUZfRlNQUklWQVRFKGJwLCB2b2lkICopICE9IE5VTEwpOworCUFTU0VSVCh0eXBlID09IFhGU19CTElfVURRVU9UX0JVRiB8fAorCSAgICAgICB0eXBlID09IFhGU19CTElfR0RRVU9UX0JVRik7CisKKwliaXAgPSBYRlNfQlVGX0ZTUFJJVkFURShicCwgeGZzX2J1Zl9sb2dfaXRlbV90ICopOworCUFTU0VSVChhdG9taWNfcmVhZCgmYmlwLT5ibGlfcmVmY291bnQpID4gMCk7CisKKwliaXAtPmJsaV9mb3JtYXQuYmxmX2ZsYWdzIHw9IHR5cGU7Cit9CisKKy8qCisgKiBDaGVjayB0byBzZWUgaWYgYSBidWZmZXIgbWF0Y2hpbmcgdGhlIGdpdmVuIHBhcmFtZXRlcnMgaXMgYWxyZWFkeQorICogYSBwYXJ0IG9mIHRoZSBnaXZlbiB0cmFuc2FjdGlvbi4gIE9ubHkgY2hlY2sgdGhlIGZpcnN0LCBlbWJlZGRlZAorICogY2h1bmssIHNpbmNlIHdlIGRvbid0IHdhbnQgdG8gc3BlbmQgYWxsIGRheSBzY2FubmluZyBsYXJnZSB0cmFuc2FjdGlvbnMuCisgKi8KK1NUQVRJQyB4ZnNfYnVmX3QgKgoreGZzX3RyYW5zX2J1Zl9pdGVtX21hdGNoKAorCXhmc190cmFuc190CSp0cCwKKwl4ZnNfYnVmdGFyZ190CSp0YXJnZXQsCisJeGZzX2RhZGRyX3QJYmxrbm8sCisJaW50CQlsZW4pCit7CisJeGZzX2xvZ19pdGVtX2NodW5rX3QJKmxpY3A7CisJeGZzX2xvZ19pdGVtX2Rlc2NfdAkqbGlkcDsKKwl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJsaXA7CisJeGZzX2J1Zl90CQkqYnA7CisJaW50CQkJaTsKKworCWJwID0gTlVMTDsKKwlsZW4gPSBCQlRPQihsZW4pOworCWxpY3AgPSAmdHAtPnRfaXRlbXM7CisJaWYgKCFYRlNfTElDX0FSRV9BTExfRlJFRShsaWNwKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgbGljcC0+bGljX3VudXNlZDsgaSsrKSB7CisJCQkvKgorCQkJICogU2tpcCB1bm9jY3VwaWVkIHNsb3RzLgorCQkJICovCisJCQlpZiAoWEZTX0xJQ19JU0ZSRUUobGljcCwgaSkpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJbGlkcCA9IFhGU19MSUNfU0xPVChsaWNwLCBpKTsKKwkJCWJsaXAgPSAoeGZzX2J1Zl9sb2dfaXRlbV90ICopbGlkcC0+bGlkX2l0ZW07CisJCQlpZiAoYmxpcC0+YmxpX2l0ZW0ubGlfdHlwZSAhPSBYRlNfTElfQlVGKSB7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWJwID0gYmxpcC0+YmxpX2J1ZjsKKwkJCWlmICgoWEZTX0JVRl9UQVJHRVQoYnApID09IHRhcmdldCkgJiYKKwkJCSAgICAoWEZTX0JVRl9BRERSKGJwKSA9PSBibGtubykgJiYKKwkJCSAgICAoWEZTX0JVRl9DT1VOVChicCkgPT0gbGVuKSkgeworCQkJCS8qCisJCQkJICogV2UgZm91bmQgaXQuICBCcmVhayBvdXQgYW5kCisJCQkJICogcmV0dXJuIHRoZSBwb2ludGVyIHRvIHRoZSBidWZmZXIuCisJCQkJICovCisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCWJwID0gTlVMTDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gYnA7Cit9CisKKy8qCisgKiBDaGVjayB0byBzZWUgaWYgYSBidWZmZXIgbWF0Y2hpbmcgdGhlIGdpdmVuIHBhcmFtZXRlcnMgaXMgYWxyZWFkeQorICogYSBwYXJ0IG9mIHRoZSBnaXZlbiB0cmFuc2FjdGlvbi4gIENoZWNrIGFsbCB0aGUgY2h1bmtzLCB3ZQorICogd2FudCB0byBiZSB0aG9yb3VnaC4KKyAqLworU1RBVElDIHhmc19idWZfdCAqCit4ZnNfdHJhbnNfYnVmX2l0ZW1fbWF0Y2hfYWxsKAorCXhmc190cmFuc190CSp0cCwKKwl4ZnNfYnVmdGFyZ190CSp0YXJnZXQsCisJeGZzX2RhZGRyX3QJYmxrbm8sCisJaW50CQlsZW4pCit7CisJeGZzX2xvZ19pdGVtX2NodW5rX3QJKmxpY3A7CisJeGZzX2xvZ19pdGVtX2Rlc2NfdAkqbGlkcDsKKwl4ZnNfYnVmX2xvZ19pdGVtX3QJKmJsaXA7CisJeGZzX2J1Zl90CQkqYnA7CisJaW50CQkJaTsKKworCWJwID0gTlVMTDsKKwlsZW4gPSBCQlRPQihsZW4pOworCWZvciAobGljcCA9ICZ0cC0+dF9pdGVtczsgbGljcCAhPSBOVUxMOyBsaWNwID0gbGljcC0+bGljX25leHQpIHsKKwkJaWYgKFhGU19MSUNfQVJFX0FMTF9GUkVFKGxpY3ApKSB7CisJCQlBU1NFUlQobGljcCA9PSAmdHAtPnRfaXRlbXMpOworCQkJQVNTRVJUKGxpY3AtPmxpY19uZXh0ID09IE5VTEwpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IGxpY3AtPmxpY191bnVzZWQ7IGkrKykgeworCQkJLyoKKwkJCSAqIFNraXAgdW5vY2N1cGllZCBzbG90cy4KKwkJCSAqLworCQkJaWYgKFhGU19MSUNfSVNGUkVFKGxpY3AsIGkpKSB7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWxpZHAgPSBYRlNfTElDX1NMT1QobGljcCwgaSk7CisJCQlibGlwID0gKHhmc19idWZfbG9nX2l0ZW1fdCAqKWxpZHAtPmxpZF9pdGVtOworCQkJaWYgKGJsaXAtPmJsaV9pdGVtLmxpX3R5cGUgIT0gWEZTX0xJX0JVRikgeworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlicCA9IGJsaXAtPmJsaV9idWY7CisJCQlpZiAoKFhGU19CVUZfVEFSR0VUKGJwKSA9PSB0YXJnZXQpICYmCisJCQkgICAgKFhGU19CVUZfQUREUihicCkgPT0gYmxrbm8pICYmCisJCQkgICAgKFhGU19CVUZfQ09VTlQoYnApID09IGxlbikpIHsKKwkJCQkvKgorCQkJCSAqIFdlIGZvdW5kIGl0LiAgQnJlYWsgb3V0IGFuZAorCQkJCSAqIHJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgYnVmZmVyLgorCQkJCSAqLworCQkJCXJldHVybiBicDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnNfZXh0ZnJlZS5jIGIvZnMveGZzL3hmc190cmFuc19leHRmcmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMyNTlhMQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfdHJhbnNfZXh0ZnJlZS5jCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX3RyYW5zX3ByaXYuaCIKKyNpbmNsdWRlICJ4ZnNfZXh0ZnJlZV9pdGVtLmgiCisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGFsbG9jYXRlIGFuICJleHRlbnQgZnJlZSBpbnRlbnRpb24iCisgKiBsb2cgaXRlbSB0aGF0IHdpbGwgaG9sZCBuZXh0ZW50cyB3b3J0aCBvZiBleHRlbnRzLiAgVGhlCisgKiBjYWxsZXIgbXVzdCB1c2UgYWxsIG5leHRlbnRzIGV4dGVudHMsIGJlY2F1c2Ugd2UgYXJlIG5vdAorICogZmxleGlibGUgYWJvdXQgdGhpcyBhdCBhbGwuCisgKi8KK3hmc19lZmlfbG9nX2l0ZW1fdCAqCit4ZnNfdHJhbnNfZ2V0X2VmaSh4ZnNfdHJhbnNfdAkqdHAsCisJCSAgdWludAkJbmV4dGVudHMpCit7CisJeGZzX2VmaV9sb2dfaXRlbV90CSplZmlwOworCisJQVNTRVJUKHRwICE9IE5VTEwpOworCUFTU0VSVChuZXh0ZW50cyA+IDApOworCisJZWZpcCA9IHhmc19lZmlfaW5pdCh0cC0+dF9tb3VudHAsIG5leHRlbnRzKTsKKwlBU1NFUlQoZWZpcCAhPSBOVUxMKTsKKworCS8qCisJICogR2V0IGEgbG9nX2l0ZW1fZGVzYyB0byBwb2ludCBhdCB0aGUgbmV3IGl0ZW0uCisJICovCisJKHZvaWQpIHhmc190cmFuc19hZGRfaXRlbSh0cCwgKHhmc19sb2dfaXRlbV90KillZmlwKTsKKworCXJldHVybiAoZWZpcCk7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIGRlc2NyaWJlZAorICogZXh0ZW50IGlzIHRvIGJlIGxvZ2dlZCBhcyBuZWVkaW5nIHRvIGJlIGZyZWVkLiAgSXQgc2hvdWxkCisgKiBiZSBjYWxsZWQgb25jZSBmb3IgZWFjaCBleHRlbnQgdG8gYmUgZnJlZWQuCisgKi8KK3ZvaWQKK3hmc190cmFuc19sb2dfZWZpX2V4dGVudCh4ZnNfdHJhbnNfdAkJKnRwLAorCQkJIHhmc19lZmlfbG9nX2l0ZW1fdAkqZWZpcCwKKwkJCSB4ZnNfZnNibG9ja190CQlzdGFydF9ibG9jaywKKwkJCSB4ZnNfZXh0bGVuX3QJCWV4dF9sZW4pCit7CisJeGZzX2xvZ19pdGVtX2Rlc2NfdAkqbGlkcDsKKwl1aW50CQkJbmV4dF9leHRlbnQ7CisJeGZzX2V4dGVudF90CQkqZXh0cDsKKworCWxpZHAgPSB4ZnNfdHJhbnNfZmluZF9pdGVtKHRwLCAoeGZzX2xvZ19pdGVtX3QqKWVmaXApOworCUFTU0VSVChsaWRwICE9IE5VTEwpOworCisJdHAtPnRfZmxhZ3MgfD0gWEZTX1RSQU5TX0RJUlRZOworCWxpZHAtPmxpZF9mbGFncyB8PSBYRlNfTElEX0RJUlRZOworCisJbmV4dF9leHRlbnQgPSBlZmlwLT5lZmlfbmV4dF9leHRlbnQ7CisJQVNTRVJUKG5leHRfZXh0ZW50IDwgZWZpcC0+ZWZpX2Zvcm1hdC5lZmlfbmV4dGVudHMpOworCWV4dHAgPSAmKGVmaXAtPmVmaV9mb3JtYXQuZWZpX2V4dGVudHNbbmV4dF9leHRlbnRdKTsKKwlleHRwLT5leHRfc3RhcnQgPSBzdGFydF9ibG9jazsKKwlleHRwLT5leHRfbGVuID0gZXh0X2xlbjsKKwllZmlwLT5lZmlfbmV4dF9leHRlbnQrKzsKK30KKworCisvKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB0byBhbGxvY2F0ZSBhbiAiZXh0ZW50IGZyZWUgZG9uZSIKKyAqIGxvZyBpdGVtIHRoYXQgd2lsbCBob2xkIG5leHRlbnRzIHdvcnRoIG9mIGV4dGVudHMuICBUaGUKKyAqIGNhbGxlciBtdXN0IHVzZSBhbGwgbmV4dGVudHMgZXh0ZW50cywgYmVjYXVzZSB3ZSBhcmUgbm90CisgKiBmbGV4aWJsZSBhYm91dCB0aGlzIGF0IGFsbC4KKyAqLworeGZzX2VmZF9sb2dfaXRlbV90ICoKK3hmc190cmFuc19nZXRfZWZkKHhmc190cmFuc190CQkqdHAsCisJCSAgeGZzX2VmaV9sb2dfaXRlbV90CSplZmlwLAorCQkgIHVpbnQJCQluZXh0ZW50cykKK3sKKwl4ZnNfZWZkX2xvZ19pdGVtX3QJKmVmZHA7CisKKwlBU1NFUlQodHAgIT0gTlVMTCk7CisJQVNTRVJUKG5leHRlbnRzID4gMCk7CisKKwllZmRwID0geGZzX2VmZF9pbml0KHRwLT50X21vdW50cCwgZWZpcCwgbmV4dGVudHMpOworCUFTU0VSVChlZmRwICE9IE5VTEwpOworCisJLyoKKwkgKiBHZXQgYSBsb2dfaXRlbV9kZXNjIHRvIHBvaW50IGF0IHRoZSBuZXcgaXRlbS4KKwkgKi8KKwkodm9pZCkgeGZzX3RyYW5zX2FkZF9pdGVtKHRwLCAoeGZzX2xvZ19pdGVtX3QqKWVmZHApOworCisJcmV0dXJuIChlZmRwKTsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZGVzY3JpYmVkCisgKiBleHRlbnQgaXMgdG8gYmUgbG9nZ2VkIGFzIGhhdmluZyBiZWVuIGZyZWVkLiAgSXQgc2hvdWxkCisgKiBiZSBjYWxsZWQgb25jZSBmb3IgZWFjaCBleHRlbnQgZnJlZWQuCisgKi8KK3ZvaWQKK3hmc190cmFuc19sb2dfZWZkX2V4dGVudCh4ZnNfdHJhbnNfdAkJKnRwLAorCQkJIHhmc19lZmRfbG9nX2l0ZW1fdAkqZWZkcCwKKwkJCSB4ZnNfZnNibG9ja190CQlzdGFydF9ibG9jaywKKwkJCSB4ZnNfZXh0bGVuX3QJCWV4dF9sZW4pCit7CisJeGZzX2xvZ19pdGVtX2Rlc2NfdAkqbGlkcDsKKwl1aW50CQkJbmV4dF9leHRlbnQ7CisJeGZzX2V4dGVudF90CQkqZXh0cDsKKworCWxpZHAgPSB4ZnNfdHJhbnNfZmluZF9pdGVtKHRwLCAoeGZzX2xvZ19pdGVtX3QqKWVmZHApOworCUFTU0VSVChsaWRwICE9IE5VTEwpOworCisJdHAtPnRfZmxhZ3MgfD0gWEZTX1RSQU5TX0RJUlRZOworCWxpZHAtPmxpZF9mbGFncyB8PSBYRlNfTElEX0RJUlRZOworCisJbmV4dF9leHRlbnQgPSBlZmRwLT5lZmRfbmV4dF9leHRlbnQ7CisJQVNTRVJUKG5leHRfZXh0ZW50IDwgZWZkcC0+ZWZkX2Zvcm1hdC5lZmRfbmV4dGVudHMpOworCWV4dHAgPSAmKGVmZHAtPmVmZF9mb3JtYXQuZWZkX2V4dGVudHNbbmV4dF9leHRlbnRdKTsKKwlleHRwLT5leHRfc3RhcnQgPSBzdGFydF9ibG9jazsKKwlleHRwLT5leHRfbGVuID0gZXh0X2xlbjsKKwllZmRwLT5lZmRfbmV4dF9leHRlbnQrKzsKK30KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfdHJhbnNfaW5vZGUuYyBiL2ZzL3hmcy94ZnNfdHJhbnNfaW5vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmMzNzA2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc190cmFuc19pbm9kZS5jCkBAIC0wLDAgKzEsMzQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnNfcHJpdi5oIgorI2luY2x1ZGUgInhmc19hbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19ibWFwX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2lhbGxvY19idHJlZS5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorCisjaWZkZWYgWEZTX1RSQU5TX0RFQlVHCitTVEFUSUMgdm9pZAoreGZzX3RyYW5zX2lub2RlX2Jyb290X2RlYnVnKAorCXhmc19pbm9kZV90CSppcCk7CisjZWxzZQorI2RlZmluZQl4ZnNfdHJhbnNfaW5vZGVfYnJvb3RfZGVidWcoaXApCisjZW5kaWYKKworCisvKgorICogR2V0IGFuZCBsb2NrIHRoZSBpbm9kZSBmb3IgdGhlIGNhbGxlciBpZiBpdCBpcyBub3QgYWxyZWFkeQorICogbG9ja2VkIHdpdGhpbiB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24uICBJZiBpdCBpcyBhbHJlYWR5IGxvY2tlZAorICogd2l0aGluIHRoZSB0cmFuc2FjdGlvbiwganVzdCBpbmNyZW1lbnQgaXRzIGxvY2sgcmVjdXJzaW9uIGNvdW50CisgKiBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byBpdC4KKyAqCisgKiBGb3IgYW4gaW5vZGUgdG8gYmUgbG9ja2VkIGluIGEgdHJhbnNhY3Rpb24sIHRoZSBpbm9kZSBsb2NrLCBhcworICogb3Bwb3NlZCB0byB0aGUgaW8gbG9jaywgbXVzdCBiZSB0YWtlbiBleGNsdXNpdmVseS4gIFRoaXMgZW5zdXJlcworICogdGhhdCB0aGUgaW5vZGUgY2FuIGJlIGludm9sdmVkIGluIG9ubHkgMSB0cmFuc2FjdGlvbiBhdCBhIHRpbWUuCisgKiBMb2NrIHJlY3Vyc2lvbiBpcyBoYW5kbGVkIG9uIHRoZSBpbyBsb2NrLCBidXQgb25seSBmb3IgbG9jayBtb2RlcworICogb2YgZXF1YWwgb3IgbGVzc2VyIHN0cmVuZ3RoLiAgVGhhdCBpcywgeW91IGNhbiByZWN1ciBvbiB0aGUgaW8gbG9jaworICogaGVsZCBFWENMIHdpdGggYSBTSEFSRUQgcmVxdWVzdCBidXQgbm90IHZpY2UgdmVyc2EuICBBbHNvLCBpZgorICogdGhlIGlub2RlIGlzIGFscmVhZHkgYSBwYXJ0IG9mIHRoZSB0cmFuc2FjdGlvbiB0aGVuIHlvdSBjYW5ub3QKKyAqIGdvIGZyb20gbm90IGhvbGRpbmcgdGhlIGlvIGxvY2sgdG8gaGF2aW5nIGl0IEVYQ0wgb3IgU0hBUkVELgorICoKKyAqIFVzZSB0aGUgaW5vZGUgY2FjaGUgcm91dGluZSB4ZnNfaW5vZGVfaW5jb3JlKCkgdG8gZmluZCB0aGUgaW5vZGUKKyAqIGlmIGl0IGlzIGFscmVhZHkgb3duZWQgYnkgdGhpcyB0cmFuc2FjdGlvbi4KKyAqCisgKiBJZiB3ZSBkb24ndCBhbHJlYWR5IG93biB0aGUgaW5vZGUsIHVzZSB4ZnNfaWdldCgpIHRvIGdldCBpdC4KKyAqIFNpbmNlIHRoZSBpbm9kZSBsb2cgaXRlbSBzdHJ1Y3R1cmUgaXMgZW1iZWRkZWQgaW4gdGhlIGluY29yZQorICogaW5vZGUgc3RydWN0dXJlIGFuZCBpcyBpbml0aWFsaXplZCB3aGVuIHRoZSBpbm9kZSBpcyBicm91Z2h0CisgKiBpbnRvIG1lbW9yeSwgdGhlcmUgaXMgbm90aGluZyB0byBkbyB3aXRoIGl0IGhlcmUuCisgKgorICogSWYgdGhlIGdpdmVuIHRyYW5zYWN0aW9uIHBvaW50ZXIgaXMgTlVMTCwganVzdCBjYWxsIHhmc19pZ2V0KCkuCisgKiBUaGlzIHNpbXBsaWZpZXMgY29kZSB3aGljaCBtdXN0IGhhbmRsZSBib3RoIGNhc2VzLgorICovCitpbnQKK3hmc190cmFuc19pZ2V0KAorCXhmc19tb3VudF90CSptcCwKKwl4ZnNfdHJhbnNfdAkqdHAsCisJeGZzX2lub190CWlubywKKwl1aW50CQlmbGFncywKKwl1aW50CQlsb2NrX2ZsYWdzLAorCXhmc19pbm9kZV90CSoqaXBwKQoreworCWludAkJCWVycm9yOworCXhmc19pbm9kZV90CQkqaXA7CisJeGZzX2lub2RlX2xvZ19pdGVtX3QJKmlpcDsKKworCS8qCisJICogSWYgdGhlIHRyYW5zYWN0aW9uIHBvaW50ZXIgaXMgTlVMTCwganVzdCBjYWxsIHRoZSBub3JtYWwKKwkgKiB4ZnNfaWdldCgpLgorCSAqLworCWlmICh0cCA9PSBOVUxMKQorCQlyZXR1cm4geGZzX2lnZXQobXAsIE5VTEwsIGlubywgZmxhZ3MsIGxvY2tfZmxhZ3MsIGlwcCwgMCk7CisKKwkvKgorCSAqIElmIHdlIGZpbmQgdGhlIGlub2RlIGluIGNvcmUgd2l0aCB0aGlzIHRyYW5zYWN0aW9uCisJICogcG9pbnRlciBpbiBpdHMgaV90cmFuc3AgZmllbGQsIHRoZW4gd2Uga25vdyB3ZSBhbHJlYWR5CisJICogaGF2ZSBpdCBsb2NrZWQuICBJbiB0aGlzIGNhc2Ugd2UganVzdCBpbmNyZW1lbnQgdGhlIGxvY2sKKwkgKiByZWN1cnNpb24gY291bnQgYW5kIHJldHVybiB0aGUgaW5vZGUgdG8gdGhlIGNhbGxlci4KKwkgKiBBc3NlcnQgdGhhdCB0aGUgaW5vZGUgaXMgYWxyZWFkeSBsb2NrZWQgaW4gdGhlIG1vZGUgcmVxdWVzdGVkCisJICogYnkgdGhlIGNhbGxlci4gIFdlIGNhbm5vdCBkbyBsb2NrIHByb21vdGlvbnMgeWV0LCBzbworCSAqIGRpZSBpZiBzb21lb25lIGdldHMgdGhpcyB3cm9uZy4KKwkgKi8KKwlpZiAoKGlwID0geGZzX2lub2RlX2luY29yZSh0cC0+dF9tb3VudHAsIGlubywgdHApKSAhPSBOVUxMKSB7CisJCS8qCisJCSAqIE1ha2Ugc3VyZSB0aGF0IHRoZSBpbm9kZSBsb2NrIGlzIGhlbGQgRVhDTCBhbmQKKwkJICogdGhhdCB0aGUgaW8gbG9jayBpcyBuZXZlciB1cGdyYWRlZCB3aGVuIHRoZSBpbm9kZQorCQkgKiBpcyBhbHJlYWR5IGEgcGFydCBvZiB0aGUgdHJhbnNhY3Rpb24uCisJCSAqLworCQlBU1NFUlQoaXAtPmlfaXRlbXAgIT0gTlVMTCk7CisJCUFTU0VSVChsb2NrX2ZsYWdzICYgWEZTX0lMT0NLX0VYQ0wpOworCQlBU1NFUlQoaXNtcmxvY2tlZCgmaXAtPmlfbG9jaywgTVJfVVBEQVRFKSk7CisJCUFTU0VSVCgoIShsb2NrX2ZsYWdzICYgWEZTX0lPTE9DS19FWENMKSkgfHwKKwkJICAgICAgIGlzbXJsb2NrZWQoJmlwLT5pX2lvbG9jaywgTVJfVVBEQVRFKSk7CisJCUFTU0VSVCgoIShsb2NrX2ZsYWdzICYgWEZTX0lPTE9DS19FWENMKSkgfHwKKwkJICAgICAgIChpcC0+aV9pdGVtcC0+aWxpX2ZsYWdzICYgWEZTX0lMSV9JT0xPQ0tFRF9FWENMKSk7CisJCUFTU0VSVCgoIShsb2NrX2ZsYWdzICYgWEZTX0lPTE9DS19TSEFSRUQpKSB8fAorCQkgICAgICAgaXNtcmxvY2tlZCgmaXAtPmlfaW9sb2NrLCAoTVJfVVBEQVRFIHwgTVJfQUNDRVNTKSkpOworCQlBU1NFUlQoKCEobG9ja19mbGFncyAmIFhGU19JT0xPQ0tfU0hBUkVEKSkgfHwKKwkJICAgICAgIChpcC0+aV9pdGVtcC0+aWxpX2ZsYWdzICYgWEZTX0lMSV9JT0xPQ0tFRF9BTlkpKTsKKworCQlpZiAobG9ja19mbGFncyAmIChYRlNfSU9MT0NLX1NIQVJFRCB8IFhGU19JT0xPQ0tfRVhDTCkpIHsKKwkJCWlwLT5pX2l0ZW1wLT5pbGlfaW9sb2NrX3JlY3VyKys7CisJCX0KKwkJaWYgKGxvY2tfZmxhZ3MgJiBYRlNfSUxPQ0tfRVhDTCkgeworCQkJaXAtPmlfaXRlbXAtPmlsaV9pbG9ja19yZWN1cisrOworCQl9CisJCSppcHAgPSBpcDsKKwkJcmV0dXJuIDA7CisJfQorCisJQVNTRVJUKGxvY2tfZmxhZ3MgJiBYRlNfSUxPQ0tfRVhDTCk7CisJZXJyb3IgPSB4ZnNfaWdldCh0cC0+dF9tb3VudHAsIHRwLCBpbm8sIGZsYWdzLCBsb2NrX2ZsYWdzLCAmaXAsIDApOworCWlmIChlcnJvcikgeworCQlyZXR1cm4gZXJyb3I7CisJfQorCUFTU0VSVChpcCAhPSBOVUxMKTsKKworCS8qCisJICogR2V0IGEgbG9nX2l0ZW1fZGVzYyB0byBwb2ludCBhdCB0aGUgbmV3IGl0ZW0uCisJICovCisJaWYgKGlwLT5pX2l0ZW1wID09IE5VTEwpCisJCXhmc19pbm9kZV9pdGVtX2luaXQoaXAsIG1wKTsKKwlpaXAgPSBpcC0+aV9pdGVtcDsKKwkodm9pZCkgeGZzX3RyYW5zX2FkZF9pdGVtKHRwLCAoeGZzX2xvZ19pdGVtX3QgKikoaWlwKSk7CisKKwl4ZnNfdHJhbnNfaW5vZGVfYnJvb3RfZGVidWcoaXApOworCisJLyoKKwkgKiBJZiB0aGUgSU8gbG9jayBoYXMgYmVlbiBhY3F1aXJlZCwgbWFyayB0aGF0IGluCisJICogdGhlIGlub2RlIGxvZyBpdGVtIHNvIHdlJ2xsIGtub3cgdG8gdW5sb2NrIGl0CisJICogd2hlbiB0aGUgdHJhbnNhY3Rpb24gY29tbWl0cy4KKwkgKi8KKwlBU1NFUlQoaWlwLT5pbGlfZmxhZ3MgPT0gMCk7CisJaWYgKGxvY2tfZmxhZ3MgJiBYRlNfSU9MT0NLX0VYQ0wpIHsKKwkJaWlwLT5pbGlfZmxhZ3MgfD0gWEZTX0lMSV9JT0xPQ0tFRF9FWENMOworCX0gZWxzZSBpZiAobG9ja19mbGFncyAmIFhGU19JT0xPQ0tfU0hBUkVEKSB7CisJCWlpcC0+aWxpX2ZsYWdzIHw9IFhGU19JTElfSU9MT0NLRURfU0hBUkVEOworCX0KKworCS8qCisJICogSW5pdGlhbGl6ZSBpX3RyYW5zcCBzbyB3ZSBjYW4gZmluZCBpdCB3aXRoIHhmc19pbm9kZV9pbmNvcmUoKQorCSAqIGFib3ZlLgorCSAqLworCWlwLT5pX3RyYW5zcCA9IHRwOworCisJKmlwcCA9IGlwOworCXJldHVybiAwOworfQorCisvKgorICogQWRkIHRoZSBsb2NrZWQgaW5vZGUgdG8gdGhlIHRyYW5zYWN0aW9uLgorICogVGhlIGlub2RlIG11c3QgYmUgbG9ja2VkLCBhbmQgaXQgY2Fubm90IGJlIGFzc29jaWF0ZWQgd2l0aCBhbnkKKyAqIHRyYW5zYWN0aW9uLiAgVGhlIGNhbGxlciBtdXN0IHNwZWNpZnkgdGhlIGxvY2tzIGFscmVhZHkgaGVsZAorICogb24gdGhlIGlub2RlLgorICovCit2b2lkCit4ZnNfdHJhbnNfaWpvaW4oCisJeGZzX3RyYW5zX3QJKnRwLAorCXhmc19pbm9kZV90CSppcCwKKwl1aW50CQlsb2NrX2ZsYWdzKQoreworCXhmc19pbm9kZV9sb2dfaXRlbV90CSppaXA7CisKKwlBU1NFUlQoaXAtPmlfdHJhbnNwID09IE5VTEwpOworCUFTU0VSVChpc21ybG9ja2VkKCZpcC0+aV9sb2NrLCBNUl9VUERBVEUpKTsKKwlBU1NFUlQobG9ja19mbGFncyAmIFhGU19JTE9DS19FWENMKTsKKwlpZiAoaXAtPmlfaXRlbXAgPT0gTlVMTCkKKwkJeGZzX2lub2RlX2l0ZW1faW5pdChpcCwgaXAtPmlfbW91bnQpOworCWlpcCA9IGlwLT5pX2l0ZW1wOworCUFTU0VSVChpaXAtPmlsaV9mbGFncyA9PSAwKTsKKwlBU1NFUlQoaWlwLT5pbGlfaWxvY2tfcmVjdXIgPT0gMCk7CisJQVNTRVJUKGlpcC0+aWxpX2lvbG9ja19yZWN1ciA9PSAwKTsKKworCS8qCisJICogR2V0IGEgbG9nX2l0ZW1fZGVzYyB0byBwb2ludCBhdCB0aGUgbmV3IGl0ZW0uCisJICovCisJKHZvaWQpIHhmc190cmFuc19hZGRfaXRlbSh0cCwgKHhmc19sb2dfaXRlbV90KikoaWlwKSk7CisKKwl4ZnNfdHJhbnNfaW5vZGVfYnJvb3RfZGVidWcoaXApOworCisJLyoKKwkgKiBJZiB0aGUgSU8gbG9jayBpcyBhbHJlYWR5IGhlbGQsIG1hcmsgdGhhdCBpbiB0aGUgaW5vZGUgbG9nIGl0ZW0uCisJICovCisJaWYgKGxvY2tfZmxhZ3MgJiBYRlNfSU9MT0NLX0VYQ0wpIHsKKwkJaWlwLT5pbGlfZmxhZ3MgfD0gWEZTX0lMSV9JT0xPQ0tFRF9FWENMOworCX0gZWxzZSBpZiAobG9ja19mbGFncyAmIFhGU19JT0xPQ0tfU0hBUkVEKSB7CisJCWlpcC0+aWxpX2ZsYWdzIHw9IFhGU19JTElfSU9MT0NLRURfU0hBUkVEOworCX0KKworCS8qCisJICogSW5pdGlhbGl6ZSBpX3RyYW5zcCBzbyB3ZSBjYW4gZmluZCBpdCB3aXRoIHhmc19pbm9kZV9pbmNvcmUoKQorCSAqIGluIHhmc190cmFuc19pZ2V0KCkgYWJvdmUuCisJICovCisJaXAtPmlfdHJhbnNwID0gdHA7Cit9CisKKworCisvKgorICogTWFyayB0aGUgaW5vZGUgYXMgbm90IG5lZWRpbmcgdG8gYmUgdW5sb2NrZWQgd2hlbiB0aGUgaW5vZGUgaXRlbSdzCisgKiBJT1BfVU5MT0NLKCkgcm91dGluZSBpcyBjYWxsZWQuICBUaGUgaW5vZGUgbXVzdCBhbHJlYWR5IGJlIGxvY2tlZAorICogYW5kIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24uCisgKi8KKy8qQVJHU1VTRUQqLwordm9pZAoreGZzX3RyYW5zX2lob2xkKAorCXhmc190cmFuc190CSp0cCwKKwl4ZnNfaW5vZGVfdAkqaXApCit7CisJQVNTRVJUKGlwLT5pX3RyYW5zcCA9PSB0cCk7CisJQVNTRVJUKGlwLT5pX2l0ZW1wICE9IE5VTEwpOworCUFTU0VSVChpc21ybG9ja2VkKCZpcC0+aV9sb2NrLCBNUl9VUERBVEUpKTsKKworCWlwLT5pX2l0ZW1wLT5pbGlfZmxhZ3MgfD0gWEZTX0lMSV9IT0xEOworfQorCisvKgorICogQ2FuY2VsIHRoZSBwcmV2aW91cyBpbm9kZSBob2xkIHJlcXVlc3QgbWFkZSBvbiB0aGlzIGlub2RlCisgKiBmb3IgdGhpcyB0cmFuc2FjdGlvbi4KKyAqLworLypBUkdTVVNFRCovCit2b2lkCit4ZnNfdHJhbnNfaWhvbGRfcmVsZWFzZSgKKwl4ZnNfdHJhbnNfdAkqdHAsCisJeGZzX2lub2RlX3QJKmlwKQoreworCUFTU0VSVChpcC0+aV90cmFuc3AgPT0gdHApOworCUFTU0VSVChpcC0+aV9pdGVtcCAhPSBOVUxMKTsKKwlBU1NFUlQoaXNtcmxvY2tlZCgmaXAtPmlfbG9jaywgTVJfVVBEQVRFKSk7CisJQVNTRVJUKGlwLT5pX2l0ZW1wLT5pbGlfZmxhZ3MgJiBYRlNfSUxJX0hPTEQpOworCisJaXAtPmlfaXRlbXAtPmlsaV9mbGFncyAmPSB+WEZTX0lMSV9IT0xEOworfQorCisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB0byBtYXJrIHRoZSBmaWVsZHMgaW5kaWNhdGVkIGluIGZpZWxkbWFzayBhcyBuZWVkaW5nCisgKiB0byBiZSBsb2dnZWQgd2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgY29tbWl0dGVkLiAgVGhlIGlub2RlIG11c3QKKyAqIGFscmVhZHkgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiB0cmFuc2FjdGlvbi4KKyAqCisgKiBUaGUgdmFsdWVzIGZvciBmaWVsZG1hc2sgYXJlIGRlZmluZWQgaW4geGZzX2lub2RlX2l0ZW0uaC4gIFdlIGFsd2F5cworICogbG9nIGFsbCBvZiB0aGUgY29yZSBpbm9kZSBpZiBhbnkgb2YgaXQgaGFzIGNoYW5nZWQsIGFuZCB3ZSBhbHdheXMgbG9nCisgKiBhbGwgb2YgdGhlIGlubGluZSBkYXRhL2V4dGVudHMvYi10cmVlIHJvb3QgaWYgYW55IG9mIHRoZW0gaGFzIGNoYW5nZWQuCisgKi8KK3ZvaWQKK3hmc190cmFuc19sb2dfaW5vZGUoCisJeGZzX3RyYW5zX3QJKnRwLAorCXhmc19pbm9kZV90CSppcCwKKwl1aW50CQlmbGFncykKK3sKKwl4ZnNfbG9nX2l0ZW1fZGVzY190CSpsaWRwOworCisJQVNTRVJUKGlwLT5pX3RyYW5zcCA9PSB0cCk7CisJQVNTRVJUKGlwLT5pX2l0ZW1wICE9IE5VTEwpOworCUFTU0VSVChpc21ybG9ja2VkKCZpcC0+aV9sb2NrLCBNUl9VUERBVEUpKTsKKworCWxpZHAgPSB4ZnNfdHJhbnNfZmluZF9pdGVtKHRwLCAoeGZzX2xvZ19pdGVtX3QqKShpcC0+aV9pdGVtcCkpOworCUFTU0VSVChsaWRwICE9IE5VTEwpOworCisJdHAtPnRfZmxhZ3MgfD0gWEZTX1RSQU5TX0RJUlRZOworCWxpZHAtPmxpZF9mbGFncyB8PSBYRlNfTElEX0RJUlRZOworCisJLyoKKwkgKiBBbHdheXMgT1IgaW4gdGhlIGJpdHMgZnJvbSB0aGUgaWxpX2xhc3RfZmllbGRzIGZpZWxkLgorCSAqIFRoaXMgaXMgdG8gY29vcmRpbmF0ZSB3aXRoIHRoZSB4ZnNfaWZsdXNoKCkgYW5kIHhmc19pZmx1c2hfZG9uZSgpCisJICogcm91dGluZXMgaW4gdGhlIGV2ZW50dWFsIGNsZWFyaW5nIG9mIHRoZSBpbGZfZmllbGRzIGJpdHMuCisJICogU2VlIHRoZSBiaWcgY29tbWVudCBpbiB4ZnNfaWZsdXNoKCkgZm9yIGFuIGV4cGxhbmF0aW9uIG9mCisJICogdGhpcyBjb29yaW5hdGlvbiBtZWNoYW5pc20uCisJICovCisJZmxhZ3MgfD0gaXAtPmlfaXRlbXAtPmlsaV9sYXN0X2ZpZWxkczsKKwlpcC0+aV9pdGVtcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzIHw9IGZsYWdzOworfQorCisjaWZkZWYgWEZTX1RSQU5TX0RFQlVHCisvKgorICogS2VlcCB0cmFjayBvZiB0aGUgc3RhdGUgb2YgdGhlIGlub2RlIGJ0cmVlIHJvb3QgdG8gbWFrZSBzdXJlIHdlCisgKiBsb2cgaXQgcHJvcGVybHkuCisgKi8KK1NUQVRJQyB2b2lkCit4ZnNfdHJhbnNfaW5vZGVfYnJvb3RfZGVidWcoCisJeGZzX2lub2RlX3QJKmlwKQoreworCXhmc19pbm9kZV9sb2dfaXRlbV90CSppaXA7CisKKwlBU1NFUlQoaXAtPmlfaXRlbXAgIT0gTlVMTCk7CisJaWlwID0gaXAtPmlfaXRlbXA7CisJaWYgKGlpcC0+aWxpX3Jvb3Rfc2l6ZSAhPSAwKSB7CisJCUFTU0VSVChpaXAtPmlsaV9vcmlnX3Jvb3QgIT0gTlVMTCk7CisJCWttZW1fZnJlZShpaXAtPmlsaV9vcmlnX3Jvb3QsIGlpcC0+aWxpX3Jvb3Rfc2l6ZSk7CisJCWlpcC0+aWxpX3Jvb3Rfc2l6ZSA9IDA7CisJCWlpcC0+aWxpX29yaWdfcm9vdCA9IE5VTEw7CisJfQorCWlmIChpcC0+aV9kLmRpX2Zvcm1hdCA9PSBYRlNfRElOT0RFX0ZNVF9CVFJFRSkgeworCQlBU1NFUlQoKGlwLT5pX2RmLmlmX2Jyb290ICE9IE5VTEwpICYmCisJCSAgICAgICAoaXAtPmlfZGYuaWZfYnJvb3RfYnl0ZXMgPiAwKSk7CisJCWlpcC0+aWxpX3Jvb3Rfc2l6ZSA9IGlwLT5pX2RmLmlmX2Jyb290X2J5dGVzOworCQlpaXAtPmlsaV9vcmlnX3Jvb3QgPQorCQkJKGNoYXIqKWttZW1fYWxsb2MoaWlwLT5pbGlfcm9vdF9zaXplLCBLTV9TTEVFUCk7CisJCW1lbWNweShpaXAtPmlsaV9vcmlnX3Jvb3QsIChjaGFyKikoaXAtPmlfZGYuaWZfYnJvb3QpLAorCQkgICAgICBpaXAtPmlsaV9yb290X3NpemUpOworCX0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFuc19pdGVtLmMgYi9mcy94ZnMveGZzX3RyYW5zX2l0ZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjhhNzU2Ci0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc190cmFuc19pdGVtLmMKQEAgLTAsMCArMSw1NTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKyNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisKK1NUQVRJQyBpbnQJeGZzX3RyYW5zX3VubG9ja19jaHVuayh4ZnNfbG9nX2l0ZW1fY2h1bmtfdCAqLAorCQkJCQlpbnQsIGludCwgeGZzX2xzbl90KTsKKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHRvIGFkZCB0aGUgZ2l2ZW4gbG9nIGl0ZW0gdG8gdGhlIHRyYW5zYWN0aW9uJ3MKKyAqIGxpc3Qgb2YgbG9nIGl0ZW1zLiAgSXQgbXVzdCBmaW5kIGEgZnJlZSBsb2cgaXRlbSBkZXNjcmlwdG9yCisgKiBvciBhbGxvY2F0ZSBhIG5ldyBvbmUgYW5kIGFkZCB0aGUgaXRlbSB0byB0aGF0IGRlc2NyaXB0b3IuCisgKiBUaGUgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gaXRlbSBkZXNjcmlwdG9yIHVzZWQgdG8gcG9pbnQKKyAqIHRvIHRoZSBuZXcgaXRlbS4gIFRoZSBsb2cgaXRlbSB3aWxsIG5vdyBwb2ludCB0byBpdHMgbmV3IGRlc2NyaXB0b3IKKyAqIHdpdGggaXRzIGxpX2Rlc2MgZmllbGQuCisgKi8KK3hmc19sb2dfaXRlbV9kZXNjX3QgKgoreGZzX3RyYW5zX2FkZF9pdGVtKHhmc190cmFuc190ICp0cCwgeGZzX2xvZ19pdGVtX3QgKmxpcCkKK3sKKwl4ZnNfbG9nX2l0ZW1fZGVzY190CSpsaWRwOworCXhmc19sb2dfaXRlbV9jaHVua190CSpsaWNwOworCWludAkJCWk9MDsKKworCS8qCisJICogSWYgdGhlcmUgYXJlIG5vIGZyZWUgZGVzY3JpcHRvcnMsIGFsbG9jYXRlIGEgbmV3IGNodW5rCisJICogb2YgdGhlbSBhbmQgcHV0IGl0IGF0IHRoZSBmcm9udCBvZiB0aGUgY2h1bmsgbGlzdC4KKwkgKi8KKwlpZiAodHAtPnRfaXRlbXNfZnJlZSA9PSAwKSB7CisJCWxpY3AgPSAoeGZzX2xvZ19pdGVtX2NodW5rX3QqKQorCQkgICAgICAga21lbV9hbGxvYyhzaXplb2YoeGZzX2xvZ19pdGVtX2NodW5rX3QpLCBLTV9TTEVFUCk7CisJCUFTU0VSVChsaWNwICE9IE5VTEwpOworCQkvKgorCQkgKiBJbml0aWFsaXplIHRoZSBjaHVuaywgYW5kIHRoZW4KKwkJICogY2xhaW0gdGhlIGZpcnN0IHNsb3QgaW4gdGhlIG5ld2x5IGFsbG9jYXRlZCBjaHVuay4KKwkJICovCisJCVhGU19MSUNfSU5JVChsaWNwKTsKKwkJWEZTX0xJQ19DTEFJTShsaWNwLCAwKTsKKwkJbGljcC0+bGljX3VudXNlZCA9IDE7CisJCVhGU19MSUNfSU5JVF9TTE9UKGxpY3AsIDApOworCQlsaWRwID0gWEZTX0xJQ19TTE9UKGxpY3AsIDApOworCisJCS8qCisJCSAqIExpbmsgaW4gdGhlIG5ldyBjaHVuayBhbmQgdXBkYXRlIHRoZSBmcmVlIGNvdW50LgorCQkgKi8KKwkJbGljcC0+bGljX25leHQgPSB0cC0+dF9pdGVtcy5saWNfbmV4dDsKKwkJdHAtPnRfaXRlbXMubGljX25leHQgPSBsaWNwOworCQl0cC0+dF9pdGVtc19mcmVlID0gWEZTX0xJQ19OVU1fU0xPVFMgLSAxOworCisJCS8qCisJCSAqIEluaXRpYWxpemUgdGhlIGRlc2NyaXB0b3IgYW5kIHRoZSBnZW5lcmljIHBvcnRpb24KKwkJICogb2YgdGhlIGxvZyBpdGVtLgorCQkgKgorCQkgKiBQb2ludCB0aGUgbmV3IHNsb3QgYXQgdGhpcyBpdGVtIGFuZCByZXR1cm4gaXQuCisJCSAqIEFsc28gcG9pbnQgdGhlIGxvZyBpdGVtIGF0IGl0cyBjdXJyZW50bHkgYWN0aXZlCisJCSAqIGRlc2NyaXB0b3IgYW5kIHNldCB0aGUgaXRlbSdzIG1vdW50IHBvaW50ZXIuCisJCSAqLworCQlsaWRwLT5saWRfaXRlbSA9IGxpcDsKKwkJbGlkcC0+bGlkX2ZsYWdzID0gMDsKKwkJbGlkcC0+bGlkX3NpemUgPSAwOworCQlsaXAtPmxpX2Rlc2MgPSBsaWRwOworCQlsaXAtPmxpX21vdW50cCA9IHRwLT50X21vdW50cDsKKwkJcmV0dXJuIChsaWRwKTsKKwl9CisKKwkvKgorCSAqIEZpbmQgdGhlIGZyZWUgZGVzY3JpcHRvci4gSXQgaXMgc29tZXdoZXJlIGluIHRoZSBjaHVua2xpc3QKKwkgKiBvZiBkZXNjcmlwdG9ycy4KKwkgKi8KKwlsaWNwID0gJnRwLT50X2l0ZW1zOworCXdoaWxlIChsaWNwICE9IE5VTEwpIHsKKwkJaWYgKFhGU19MSUNfVkFDQU5DWShsaWNwKSkgeworCQkJaWYgKGxpY3AtPmxpY191bnVzZWQgPD0gWEZTX0xJQ19NQVhfU0xPVCkgeworCQkJCWkgPSBsaWNwLT5saWNfdW51c2VkOworCQkJCUFTU0VSVChYRlNfTElDX0lTRlJFRShsaWNwLCBpKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlmb3IgKGkgPSAwOyBpIDw9IFhGU19MSUNfTUFYX1NMT1Q7IGkrKykgeworCQkJCWlmIChYRlNfTElDX0lTRlJFRShsaWNwLCBpKSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlBU1NFUlQoaSA8PSBYRlNfTElDX01BWF9TTE9UKTsKKwkJCWJyZWFrOworCQl9CisJCWxpY3AgPSBsaWNwLT5saWNfbmV4dDsKKwl9CisJQVNTRVJUKGxpY3AgIT0gTlVMTCk7CisJLyoKKwkgKiBJZiB3ZSBmaW5kIGEgZnJlZSBkZXNjcmlwdG9yLCBjbGFpbSBpdCwKKwkgKiBpbml0aWFsaXplIGl0LCBhbmQgcmV0dXJuIGl0LgorCSAqLworCVhGU19MSUNfQ0xBSU0obGljcCwgaSk7CisJaWYgKGxpY3AtPmxpY191bnVzZWQgPD0gaSkgeworCQlsaWNwLT5saWNfdW51c2VkID0gaSArIDE7CisJCVhGU19MSUNfSU5JVF9TTE9UKGxpY3AsIGkpOworCX0KKwlsaWRwID0gWEZTX0xJQ19TTE9UKGxpY3AsIGkpOworCXRwLT50X2l0ZW1zX2ZyZWUtLTsKKwlsaWRwLT5saWRfaXRlbSA9IGxpcDsKKwlsaWRwLT5saWRfZmxhZ3MgPSAwOworCWxpZHAtPmxpZF9zaXplID0gMDsKKwlsaXAtPmxpX2Rlc2MgPSBsaWRwOworCWxpcC0+bGlfbW91bnRwID0gdHAtPnRfbW91bnRwOworCXJldHVybiAobGlkcCk7Cit9CisKKy8qCisgKiBGcmVlIHRoZSBnaXZlbiBkZXNjcmlwdG9yLgorICoKKyAqIFRoaXMgcmVxdWlyZXMgc2V0dGluZyB0aGUgYml0IGluIHRoZSBjaHVuaydzIGZyZWUgbWFzayBjb3JyZXNwb25kaW5nCisgKiB0byB0aGUgZ2l2ZW4gc2xvdC4KKyAqLwordm9pZAoreGZzX3RyYW5zX2ZyZWVfaXRlbSh4ZnNfdHJhbnNfdAkqdHAsIHhmc19sb2dfaXRlbV9kZXNjX3QgKmxpZHApCit7CisJdWludAkJCXNsb3Q7CisJeGZzX2xvZ19pdGVtX2NodW5rX3QJKmxpY3A7CisJeGZzX2xvZ19pdGVtX2NodW5rX3QJKipsaWNwcDsKKworCXNsb3QgPSBYRlNfTElDX0RFU0NfVE9fU0xPVChsaWRwKTsKKwlsaWNwID0gWEZTX0xJQ19ERVNDX1RPX0NIVU5LKGxpZHApOworCVhGU19MSUNfUkVMU0UobGljcCwgc2xvdCk7CisJbGlkcC0+bGlkX2l0ZW0tPmxpX2Rlc2MgPSBOVUxMOworCXRwLT50X2l0ZW1zX2ZyZWUrKzsKKworCS8qCisJICogSWYgdGhlcmUgYXJlIG5vIG1vcmUgdXNlZCBpdGVtcyBpbiB0aGUgY2h1bmsgYW5kIHRoaXMgaXMgbm90CisJICogdGhlIGNodW5rIGVtYmVkZGVkIGluIHRoZSB0cmFuc2FjdGlvbiBzdHJ1Y3R1cmUsIHRoZW4gZnJlZQorCSAqIHRoZSBjaHVuay4gRmlyc3QgcHVsbCBpdCBmcm9tIHRoZSBjaHVuayBsaXN0IGFuZCB0aGVuCisJICogZnJlZSBpdCBiYWNrIHRvIHRoZSBoZWFwLiAgV2UgZGlkbid0IGJvdGhlciB3aXRoIGEgZG91Ymx5CisJICogbGlua2VkIGxpc3QgaGVyZSBiZWNhdXNlIHRoZSBsaXN0cyBzaG91bGQgYmUgdmVyeSBzaG9ydAorCSAqIGFuZCB0aGlzIGlzIG5vdCBhIHBlcmZvcm1hbmNlIHBhdGguICBJdCdzIGJldHRlciB0byBzYXZlCisJICogdGhlIG1lbW9yeSBvZiB0aGUgZXh0cmEgcG9pbnRlci4KKwkgKgorCSAqIEFsc28gZGVjcmVtZW50IHRoZSB0cmFuc2FjdGlvbiBzdHJ1Y3R1cmUncyBjb3VudCBvZiBmcmVlIGl0ZW1zCisJICogYnkgdGhlIG51bWJlciBpbiBhIGNodW5rIHNpbmNlIHdlIGFyZSBmcmVlaW5nIGFuIGVtcHR5IGNodW5rLgorCSAqLworCWlmIChYRlNfTElDX0FSRV9BTExfRlJFRShsaWNwKSAmJiAobGljcCAhPSAmKHRwLT50X2l0ZW1zKSkpIHsKKwkJbGljcHAgPSAmKHRwLT50X2l0ZW1zLmxpY19uZXh0KTsKKwkJd2hpbGUgKCpsaWNwcCAhPSBsaWNwKSB7CisJCQlBU1NFUlQoKmxpY3BwICE9IE5VTEwpOworCQkJbGljcHAgPSAmKCgqbGljcHApLT5saWNfbmV4dCk7CisJCX0KKwkJKmxpY3BwID0gbGljcC0+bGljX25leHQ7CisJCWttZW1fZnJlZShsaWNwLCBzaXplb2YoeGZzX2xvZ19pdGVtX2NodW5rX3QpKTsKKwkJdHAtPnRfaXRlbXNfZnJlZSAtPSBYRlNfTElDX05VTV9TTE9UUzsKKwl9Cit9CisKKy8qCisgKiBUaGlzIGlzIGNhbGxlZCB0byBmaW5kIHRoZSBkZXNjcmlwdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuCisgKiBsb2cgaXRlbS4gIEl0IHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBkZXNjcmlwdG9yLgorICogVGhlIGxvZyBpdGVtIE1VU1QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgZGVzY3JpcHRvciBpbiB0aGUgZ2l2ZW4KKyAqIHRyYW5zYWN0aW9uLiAgVGhpcyByb3V0aW5lIGRvZXMgbm90IHJldHVybiBOVUxMLCBpdCBwYW5pY3MuCisgKgorICogVGhlIGRlc2NyaXB0b3IgcG9pbnRlciBpcyBrZXB0IGluIHRoZSBsb2cgaXRlbSdzIGxpX2Rlc2MgZmllbGQuCisgKiBKdXN0IHJldHVybiBpdC4KKyAqLworLypBUkdTVVNFRCovCit4ZnNfbG9nX2l0ZW1fZGVzY190ICoKK3hmc190cmFuc19maW5kX2l0ZW0oeGZzX3RyYW5zX3QJKnRwLCB4ZnNfbG9nX2l0ZW1fdCAqbGlwKQoreworCUFTU0VSVChsaXAtPmxpX2Rlc2MgIT0gTlVMTCk7CisKKwlyZXR1cm4gKGxpcC0+bGlfZGVzYyk7Cit9CisKKworLyoKKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGRlc2NyaXB0b3IgaW4gdGhlIGNodW5rIGxpc3QuCisgKiBUaGlzIGRvZXMgbm90IHJldHVybiBOVUxMIGlmIHRoZXJlIGFyZSBub25lLCBpdCBwYW5pY3MuCisgKgorICogVGhlIGZpcnN0IGRlc2NyaXB0b3IgbXVzdCBiZSBpbiBlaXRoZXIgdGhlIGZpcnN0IG9yIHNlY29uZCBjaHVuay4KKyAqIFRoaXMgaXMgYmVjYXVzZSB0aGUgb25seSBjaHVuayBhbGxvd2VkIHRvIGJlIGVtcHR5IGlzIHRoZSBmaXJzdC4KKyAqIEFsbCBvdGhlcnMgYXJlIGZyZWVkIHdoZW4gdGhleSBiZWNvbWUgZW1wdHkuCisgKgorICogQXQgc29tZSBwb2ludCB0aGlzIGFuZCB4ZnNfdHJhbnNfbmV4dF9pdGVtKCkgc2hvdWxkIGJlIG9wdGltaXplZAorICogdG8gcXVpY2tseSBsb29rIGF0IHRoZSBtYXNrIHRvIGRldGVybWluZSBpZiB0aGVyZSBpcyBhbnl0aGluZyB0bworICogbG9vayBhdC4KKyAqLworeGZzX2xvZ19pdGVtX2Rlc2NfdCAqCit4ZnNfdHJhbnNfZmlyc3RfaXRlbSh4ZnNfdHJhbnNfdCAqdHApCit7CisJeGZzX2xvZ19pdGVtX2NodW5rX3QJKmxpY3A7CisJaW50CQkJaTsKKworCWxpY3AgPSAmdHAtPnRfaXRlbXM7CisJLyoKKwkgKiBJZiBpdCdzIG5vdCBpbiB0aGUgZmlyc3QgY2h1bmssIHNraXAgdG8gdGhlIHNlY29uZC4KKwkgKi8KKwlpZiAoWEZTX0xJQ19BUkVfQUxMX0ZSRUUobGljcCkpIHsKKwkJbGljcCA9IGxpY3AtPmxpY19uZXh0OworCX0KKworCS8qCisJICogUmV0dXJuIHRoZSBmaXJzdCBub24tZnJlZSBkZXNjcmlwdG9yIGluIHRoZSBjaHVuay4KKwkgKi8KKwlBU1NFUlQoIVhGU19MSUNfQVJFX0FMTF9GUkVFKGxpY3ApKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGljcC0+bGljX3VudXNlZDsgaSsrKSB7CisJCWlmIChYRlNfTElDX0lTRlJFRShsaWNwLCBpKSkgeworCQkJY29udGludWU7CisJCX0KKworCQlyZXR1cm4gKFhGU19MSUNfU0xPVChsaWNwLCBpKSk7CisJfQorCWNtbl9lcnIoQ0VfV0FSTiwgInhmc190cmFuc19maXJzdF9pdGVtKCkgLS0gbm8gZmlyc3QgaXRlbSIpOworCXJldHVybihOVUxMKTsKK30KKworCisvKgorICogR2l2ZW4gYSBkZXNjcmlwdG9yLCByZXR1cm4gdGhlIG5leHQgZGVzY3JpcHRvciBpbiB0aGUgY2h1bmsgbGlzdC4KKyAqIFRoaXMgcmV0dXJucyBOVUxMIGlmIHRoZXJlIGFyZSBubyBtb3JlIHVzZWQgZGVzY3JpcHRvcnMgaW4gdGhlIGxpc3QuCisgKgorICogV2UgZG8gdGhpcyBieSBmaXJzdCBsb2NhdGluZyB0aGUgY2h1bmsgaW4gd2hpY2ggdGhlIGRlc2NyaXB0b3IgcmVzaWRlcywKKyAqIGFuZCB0aGVuIHNjYW5uaW5nIGZvcndhcmQgaW4gdGhlIGNodW5rIGFuZCB0aGUgbGlzdCBmb3IgdGhlIG5leHQKKyAqIHVzZWQgZGVzY3JpcHRvci4KKyAqLworLypBUkdTVVNFRCovCit4ZnNfbG9nX2l0ZW1fZGVzY190ICoKK3hmc190cmFuc19uZXh0X2l0ZW0oeGZzX3RyYW5zX3QgKnRwLCB4ZnNfbG9nX2l0ZW1fZGVzY190ICpsaWRwKQoreworCXhmc19sb2dfaXRlbV9jaHVua190CSpsaWNwOworCWludAkJCWk7CisKKwlsaWNwID0gWEZTX0xJQ19ERVNDX1RPX0NIVU5LKGxpZHApOworCisJLyoKKwkgKiBGaXJzdCBzZWFyY2ggdGhlIHJlc3Qgb2YgdGhlIGNodW5rLiBUaGUgZm9yIGxvb3Aga2VlcHMgdXMKKwkgKiBmcm9tIHJlZmVyZW5jaW5nIHRoaW5ncyBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgY2h1bmsuCisJICovCisJZm9yIChpID0gKGludClYRlNfTElDX0RFU0NfVE9fU0xPVChsaWRwKSArIDE7IGkgPCBsaWNwLT5saWNfdW51c2VkOyBpKyspIHsKKwkJaWYgKFhGU19MSUNfSVNGUkVFKGxpY3AsIGkpKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCXJldHVybiAoWEZTX0xJQ19TTE9UKGxpY3AsIGkpKTsKKwl9CisKKwkvKgorCSAqIE5vdyBzZWFyY2ggdGhlIG5leHQgY2h1bmsuICBJdCBtdXN0IGJlIHRoZXJlLCBiZWNhdXNlIHRoZQorCSAqIG5leHQgY2h1bmsgd291bGQgaGF2ZSBiZWVuIGZyZWVkIGlmIGl0IHdlcmUgZW1wdHkuCisJICogSWYgdGhlcmUgaXMgbm8gbmV4dCBjaHVuaywgcmV0dXJuIE5VTEwuCisJICovCisJaWYgKGxpY3AtPmxpY19uZXh0ID09IE5VTEwpIHsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwlsaWNwID0gbGljcC0+bGljX25leHQ7CisJQVNTRVJUKCFYRlNfTElDX0FSRV9BTExfRlJFRShsaWNwKSk7CisJZm9yIChpID0gMDsgaSA8IGxpY3AtPmxpY191bnVzZWQ7IGkrKykgeworCQlpZiAoWEZTX0xJQ19JU0ZSRUUobGljcCwgaSkpIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcmV0dXJuIChYRlNfTElDX1NMT1QobGljcCwgaSkpOworCX0KKwlBU1NFUlQoMCk7CisJLyogTk9UUkVBQ0hFRCAqLworCXJldHVybiBOVUxMOyAvKiBrZWVwIGdjYyBxdWl0ZSAqLworfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgdG8gdW5sb2NrIGFsbCBvZiB0aGUgaXRlbXMgb2YgYSB0cmFuc2FjdGlvbiBhbmQgdG8gZnJlZQorICogYWxsIHRoZSBkZXNjcmlwdG9ycyBvZiB0aGF0IHRyYW5zYWN0aW9uLgorICoKKyAqIEl0IHdhbGtzIHRoZSBsaXN0IG9mIGRlc2NyaXB0b3JzIGFuZCB1bmxvY2tzIGVhY2ggaXRlbS4gIEl0IGZyZWVzCisgKiBlYWNoIGNodW5rIGV4Y2VwdCB0aGF0IGVtYmVkZGVkIGluIHRoZSB0cmFuc2FjdGlvbiBhcyBpdCBnb2VzIGFsb25nLgorICovCit2b2lkCit4ZnNfdHJhbnNfZnJlZV9pdGVtcygKKwl4ZnNfdHJhbnNfdAkqdHAsCisJaW50CQlmbGFncykKK3sKKwl4ZnNfbG9nX2l0ZW1fY2h1bmtfdAkqbGljcDsKKwl4ZnNfbG9nX2l0ZW1fY2h1bmtfdAkqbmV4dF9saWNwOworCWludAkJCWFib3J0OworCisJYWJvcnQgPSBmbGFncyAmIFhGU19UUkFOU19BQk9SVDsKKwlsaWNwID0gJnRwLT50X2l0ZW1zOworCS8qCisJICogU3BlY2lhbCBjYXNlIHRoZSBlbWJlZGRlZCBjaHVuayBzbyB3ZSBkb24ndCBmcmVlIGl0IGJlbG93LgorCSAqLworCWlmICghWEZTX0xJQ19BUkVfQUxMX0ZSRUUobGljcCkpIHsKKwkJKHZvaWQpIHhmc190cmFuc191bmxvY2tfY2h1bmsobGljcCwgMSwgYWJvcnQsIE5VTExDT01NSVRMU04pOworCQlYRlNfTElDX0FMTF9GUkVFKGxpY3ApOworCQlsaWNwLT5saWNfdW51c2VkID0gMDsKKwl9CisJbGljcCA9IGxpY3AtPmxpY19uZXh0OworCisJLyoKKwkgKiBVbmxvY2sgZWFjaCBpdGVtIGluIGVhY2ggY2h1bmsgYW5kIGZyZWUgdGhlIGNodW5rcy4KKwkgKi8KKwl3aGlsZSAobGljcCAhPSBOVUxMKSB7CisJCUFTU0VSVCghWEZTX0xJQ19BUkVfQUxMX0ZSRUUobGljcCkpOworCQkodm9pZCkgeGZzX3RyYW5zX3VubG9ja19jaHVuayhsaWNwLCAxLCBhYm9ydCwgTlVMTENPTU1JVExTTik7CisJCW5leHRfbGljcCA9IGxpY3AtPmxpY19uZXh0OworCQlrbWVtX2ZyZWUobGljcCwgc2l6ZW9mKHhmc19sb2dfaXRlbV9jaHVua190KSk7CisJCWxpY3AgPSBuZXh0X2xpY3A7CisJfQorCisJLyoKKwkgKiBSZXNldCB0aGUgdHJhbnNhY3Rpb24gc3RydWN0dXJlJ3MgZnJlZSBpdGVtIGNvdW50LgorCSAqLworCXRwLT50X2l0ZW1zX2ZyZWUgPSBYRlNfTElDX05VTV9TTE9UUzsKKwl0cC0+dF9pdGVtcy5saWNfbmV4dCA9IE5VTEw7Cit9CisKKworCisvKgorICogVGhpcyBpcyBjYWxsZWQgdG8gdW5sb2NrIHRoZSBpdGVtcyBhc3NvY2lhdGVkIHdpdGggYSB0cmFuc2FjdGlvbi4KKyAqIEl0ZW1zIHdoaWNoIHdlcmUgbm90IGxvZ2dlZCBzaG91bGQgYmUgZnJlZWQuCisgKiBUaG9zZSB3aGljaCB3ZXJlIGxvZ2dlZCBtdXN0IHN0aWxsIGJlIHRyYWNrZWQgc28gdGhleSBjYW4gYmUgdW5waW5uZWQKKyAqIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGNvbW1pdHMuCisgKi8KK3ZvaWQKK3hmc190cmFuc191bmxvY2tfaXRlbXMoeGZzX3RyYW5zX3QgKnRwLCB4ZnNfbHNuX3QgY29tbWl0X2xzbikKK3sKKwl4ZnNfbG9nX2l0ZW1fY2h1bmtfdAkqbGljcDsKKwl4ZnNfbG9nX2l0ZW1fY2h1bmtfdAkqbmV4dF9saWNwOworCXhmc19sb2dfaXRlbV9jaHVua190CSoqbGljcHA7CisJaW50CQkJZnJlZWQ7CisKKwlmcmVlZCA9IDA7CisJbGljcCA9ICZ0cC0+dF9pdGVtczsKKworCS8qCisJICogU3BlY2lhbCBjYXNlIHRoZSBlbWJlZGRlZCBjaHVuayBzbyB3ZSBkb24ndCBmcmVlLgorCSAqLworCWlmICghWEZTX0xJQ19BUkVfQUxMX0ZSRUUobGljcCkpIHsKKwkJZnJlZWQgPSB4ZnNfdHJhbnNfdW5sb2NrX2NodW5rKGxpY3AsIDAsIDAsIGNvbW1pdF9sc24pOworCX0KKwlsaWNwcCA9ICYodHAtPnRfaXRlbXMubGljX25leHQpOworCWxpY3AgPSBsaWNwLT5saWNfbmV4dDsKKworCS8qCisJICogVW5sb2NrIGVhY2ggaXRlbSBpbiBlYWNoIGNodW5rLCBmcmVlIG5vbi1kaXJ0eSBkZXNjcmlwdG9ycywKKwkgKiBhbmQgZnJlZSBlbXB0eSBjaHVua3MuCisJICovCisJd2hpbGUgKGxpY3AgIT0gTlVMTCkgeworCQlBU1NFUlQoIVhGU19MSUNfQVJFX0FMTF9GUkVFKGxpY3ApKTsKKwkJZnJlZWQgKz0geGZzX3RyYW5zX3VubG9ja19jaHVuayhsaWNwLCAwLCAwLCBjb21taXRfbHNuKTsKKwkJbmV4dF9saWNwID0gbGljcC0+bGljX25leHQ7CisJCWlmIChYRlNfTElDX0FSRV9BTExfRlJFRShsaWNwKSkgeworCQkJKmxpY3BwID0gbmV4dF9saWNwOworCQkJa21lbV9mcmVlKGxpY3AsIHNpemVvZih4ZnNfbG9nX2l0ZW1fY2h1bmtfdCkpOworCQkJZnJlZWQgLT0gWEZTX0xJQ19OVU1fU0xPVFM7CisJCX0gZWxzZSB7CisJCQlsaWNwcCA9ICYobGljcC0+bGljX25leHQpOworCQl9CisJCUFTU0VSVCgqbGljcHAgPT0gbmV4dF9saWNwKTsKKwkJbGljcCA9IG5leHRfbGljcDsKKwl9CisKKwkvKgorCSAqIEZpeCB0aGUgZnJlZSBkZXNjcmlwdG9yIGNvdW50IGluIHRoZSB0cmFuc2FjdGlvbi4KKwkgKi8KKwl0cC0+dF9pdGVtc19mcmVlICs9IGZyZWVkOworfQorCisvKgorICogVW5sb2NrIGVhY2ggaXRlbSBwb2ludGVkIHRvIGJ5IGEgZGVzY3JpcHRvciBpbiB0aGUgZ2l2ZW4gY2h1bmsuCisgKiBTdGFtcCB0aGUgY29tbWl0IGxzbiBpbnRvIGVhY2ggaXRlbSBpZiBuZWNlc3NhcnkuCisgKiBGcmVlIGRlc2NyaXB0b3JzIHBvaW50aW5nIHRvIGl0ZW1zIHdoaWNoIGFyZSBub3QgZGlydHkgaWYgZnJlZWluZ19jaHVuaworICogaXMgemVyby4gSWYgZnJlZWluZ19jaHVuayBpcyBub24temVybywgdGhlbiB3ZSBuZWVkIHRvIHVubG9jayBhbGwKKyAqIGl0ZW1zIGluIHRoZSBjaHVuay4KKyAqIAorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgZGVzY3JpcHRvcnMgZnJlZWQuCisgKi8KK1NUQVRJQyBpbnQKK3hmc190cmFuc191bmxvY2tfY2h1bmsoCisJeGZzX2xvZ19pdGVtX2NodW5rX3QJKmxpY3AsCisJaW50CQkJZnJlZWluZ19jaHVuaywKKwlpbnQJCQlhYm9ydCwKKwl4ZnNfbHNuX3QJCWNvbW1pdF9sc24pCit7CisJeGZzX2xvZ19pdGVtX2Rlc2NfdAkqbGlkcDsKKwl4ZnNfbG9nX2l0ZW1fdAkJKmxpcDsKKwlpbnQJCQlpOworCWludAkJCWZyZWVkOworCisJZnJlZWQgPSAwOworCWxpZHAgPSBsaWNwLT5saWNfZGVzY3M7CisJZm9yIChpID0gMDsgaSA8IGxpY3AtPmxpY191bnVzZWQ7IGkrKywgbGlkcCsrKSB7CisJCWlmIChYRlNfTElDX0lTRlJFRShsaWNwLCBpKSkgeworCQkJY29udGludWU7CisJCX0KKwkJbGlwID0gbGlkcC0+bGlkX2l0ZW07CisJCWxpcC0+bGlfZGVzYyA9IE5VTEw7CisKKwkJaWYgKGNvbW1pdF9sc24gIT0gTlVMTENPTU1JVExTTikKKwkJCUlPUF9DT01NSVRUSU5HKGxpcCwgY29tbWl0X2xzbik7CisJCWlmIChhYm9ydCkKKwkJCWxpcC0+bGlfZmxhZ3MgfD0gWEZTX0xJX0FCT1JURUQ7CisJCUlPUF9VTkxPQ0sobGlwKTsKKworCQkvKgorCQkgKiBGcmVlIHRoZSBkZXNjcmlwdG9yIGlmIHRoZSBpdGVtIGlzIG5vdCBkaXJ0eQorCQkgKiB3aXRoaW4gdGhpcyB0cmFuc2FjdGlvbiBhbmQgdGhlIGNhbGxlciBpcyBub3QKKwkJICogZ29pbmcgdG8ganVzdCBmcmVlIHRoZSBlbnRpcmUgdGhpbmcgcmVnYXJkbGVzcy4KKwkJICovCisJCWlmICghKGZyZWVpbmdfY2h1bmspICYmCisJCSAgICAoIShsaWRwLT5saWRfZmxhZ3MgJiBYRlNfTElEX0RJUlRZKSB8fCBhYm9ydCkpIHsKKwkJCVhGU19MSUNfUkVMU0UobGljcCwgaSk7CisJCQlmcmVlZCsrOworCQl9CisJfQorCisJcmV0dXJuIChmcmVlZCk7Cit9CisKKworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIHRvIGFkZCB0aGUgZ2l2ZW4gYnVzeSBpdGVtIHRvIHRoZSB0cmFuc2FjdGlvbidzCisgKiBsaXN0IG9mIGJ1c3kgaXRlbXMuICBJdCBtdXN0IGZpbmQgYSBmcmVlIGJ1c3kgaXRlbSBkZXNjcmlwdG9yCisgKiBvciBhbGxvY2F0ZSBhIG5ldyBvbmUgYW5kIGFkZCB0aGUgaXRlbSB0byB0aGF0IGRlc2NyaXB0b3IuCisgKiBUaGUgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gYnVzeSBkZXNjcmlwdG9yIHVzZWQgdG8gcG9pbnQKKyAqIHRvIHRoZSBuZXcgYnVzeSBlbnRyeS4gIFRoZSBsb2cgYnVzeSBlbnRyeSB3aWxsIG5vdyBwb2ludCB0byBpdHMgbmV3CisgKiBkZXNjcmlwdG9yIHdpdGggaXRzID8/Pz8gZmllbGQuCisgKi8KK3hmc19sb2dfYnVzeV9zbG90X3QgKgoreGZzX3RyYW5zX2FkZF9idXN5KHhmc190cmFuc190ICp0cCwgeGZzX2FnbnVtYmVyX3QgYWcsIHhmc19leHRsZW5fdCBpZHgpCit7CisJeGZzX2xvZ19idXN5X2NodW5rX3QJKmxiY3A7CisJeGZzX2xvZ19idXN5X3Nsb3RfdAkqbGJzcDsKKwlpbnQJCQlpPTA7CisKKwkvKgorCSAqIElmIHRoZXJlIGFyZSBubyBmcmVlIGRlc2NyaXB0b3JzLCBhbGxvY2F0ZSBhIG5ldyBjaHVuaworCSAqIG9mIHRoZW0gYW5kIHB1dCBpdCBhdCB0aGUgZnJvbnQgb2YgdGhlIGNodW5rIGxpc3QuCisJICovCisJaWYgKHRwLT50X2J1c3lfZnJlZSA9PSAwKSB7CisJCWxiY3AgPSAoeGZzX2xvZ19idXN5X2NodW5rX3QqKQorCQkgICAgICAga21lbV9hbGxvYyhzaXplb2YoeGZzX2xvZ19idXN5X2NodW5rX3QpLCBLTV9TTEVFUCk7CisJCUFTU0VSVChsYmNwICE9IE5VTEwpOworCQkvKgorCQkgKiBJbml0aWFsaXplIHRoZSBjaHVuaywgYW5kIHRoZW4KKwkJICogY2xhaW0gdGhlIGZpcnN0IHNsb3QgaW4gdGhlIG5ld2x5IGFsbG9jYXRlZCBjaHVuay4KKwkJICovCisJCVhGU19MQkNfSU5JVChsYmNwKTsKKwkJWEZTX0xCQ19DTEFJTShsYmNwLCAwKTsKKwkJbGJjcC0+bGJjX3VudXNlZCA9IDE7CisJCWxic3AgPSBYRlNfTEJDX1NMT1QobGJjcCwgMCk7CisKKwkJLyoKKwkJICogTGluayBpbiB0aGUgbmV3IGNodW5rIGFuZCB1cGRhdGUgdGhlIGZyZWUgY291bnQuCisJCSAqLworCQlsYmNwLT5sYmNfbmV4dCA9IHRwLT50X2J1c3kubGJjX25leHQ7CisJCXRwLT50X2J1c3kubGJjX25leHQgPSBsYmNwOworCQl0cC0+dF9idXN5X2ZyZWUgPSBYRlNfTElDX05VTV9TTE9UUyAtIDE7CisKKwkJLyoKKwkJICogSW5pdGlhbGl6ZSB0aGUgZGVzY3JpcHRvciBhbmQgdGhlIGdlbmVyaWMgcG9ydGlvbgorCQkgKiBvZiB0aGUgbG9nIGl0ZW0uCisJCSAqCisJCSAqIFBvaW50IHRoZSBuZXcgc2xvdCBhdCB0aGlzIGl0ZW0gYW5kIHJldHVybiBpdC4KKwkJICogQWxzbyBwb2ludCB0aGUgbG9nIGl0ZW0gYXQgaXRzIGN1cnJlbnRseSBhY3RpdmUKKwkJICogZGVzY3JpcHRvciBhbmQgc2V0IHRoZSBpdGVtJ3MgbW91bnQgcG9pbnRlci4KKwkJICovCisJCWxic3AtPmxiY19hZyA9IGFnOworCQlsYnNwLT5sYmNfaWR4ID0gaWR4OworCQlyZXR1cm4gKGxic3ApOworCX0KKworCS8qCisJICogRmluZCB0aGUgZnJlZSBkZXNjcmlwdG9yLiBJdCBpcyBzb21ld2hlcmUgaW4gdGhlIGNodW5rbGlzdAorCSAqIG9mIGRlc2NyaXB0b3JzLgorCSAqLworCWxiY3AgPSAmdHAtPnRfYnVzeTsKKwl3aGlsZSAobGJjcCAhPSBOVUxMKSB7CisJCWlmIChYRlNfTEJDX1ZBQ0FOQ1kobGJjcCkpIHsKKwkJCWlmIChsYmNwLT5sYmNfdW51c2VkIDw9IFhGU19MQkNfTUFYX1NMT1QpIHsKKwkJCQlpID0gbGJjcC0+bGJjX3VudXNlZDsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJLyogb3V0LW9mLW9yZGVyIHZhY2FuY3kgKi8KKwkJCQlwcmludGsoIk9PTyB2YWNhbmN5IGxiY3AgMHglcFxuIiwgbGJjcCk7CisJCQkJQVNTRVJUKDApOworCQkJfQorCQl9CisJCWxiY3AgPSBsYmNwLT5sYmNfbmV4dDsKKwl9CisJQVNTRVJUKGxiY3AgIT0gTlVMTCk7CisJLyoKKwkgKiBJZiB3ZSBmaW5kIGEgZnJlZSBkZXNjcmlwdG9yLCBjbGFpbSBpdCwKKwkgKiBpbml0aWFsaXplIGl0LCBhbmQgcmV0dXJuIGl0LgorCSAqLworCVhGU19MQkNfQ0xBSU0obGJjcCwgaSk7CisJaWYgKGxiY3AtPmxiY191bnVzZWQgPD0gaSkgeworCQlsYmNwLT5sYmNfdW51c2VkID0gaSArIDE7CisJfQorCWxic3AgPSBYRlNfTEJDX1NMT1QobGJjcCwgaSk7CisJdHAtPnRfYnVzeV9mcmVlLS07CisJbGJzcC0+bGJjX2FnID0gYWc7CisJbGJzcC0+bGJjX2lkeCA9IGlkeDsKKwlyZXR1cm4gKGxic3ApOworfQorCisKKy8qCisgKiB4ZnNfdHJhbnNfZnJlZV9idXN5CisgKiBGcmVlIGFsbCBvZiB0aGUgYnVzeSBsaXN0cyBmcm9tIGEgdHJhbnNhY3Rpb24KKyAqLwordm9pZAoreGZzX3RyYW5zX2ZyZWVfYnVzeSh4ZnNfdHJhbnNfdCAqdHApCit7CisJeGZzX2xvZ19idXN5X2NodW5rX3QJKmxiY3A7CisJeGZzX2xvZ19idXN5X2NodW5rX3QJKmxiY3E7CisKKwlsYmNwID0gdHAtPnRfYnVzeS5sYmNfbmV4dDsKKwl3aGlsZSAobGJjcCAhPSBOVUxMKSB7CisJCWxiY3EgPSBsYmNwLT5sYmNfbmV4dDsKKwkJa21lbV9mcmVlKGxiY3AsIHNpemVvZih4ZnNfbG9nX2J1c3lfY2h1bmtfdCkpOworCQlsYmNwID0gbGJjcTsKKwl9CisKKwlYRlNfTEJDX0lOSVQoJnRwLT50X2J1c3kpOworCXRwLT50X2J1c3kubGJjX3VudXNlZCA9IDA7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zX3ByaXYuaCBiL2ZzL3hmcy94ZnNfdHJhbnNfcHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZGFlN2QKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX3RyYW5zX3ByaXYuaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAyIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfVFJBTlNfUFJJVl9IX18KKyNkZWZpbmUJX19YRlNfVFJBTlNfUFJJVl9IX18KKworc3RydWN0IHhmc19sb2dfaXRlbTsKK3N0cnVjdCB4ZnNfbG9nX2l0ZW1fZGVzYzsKK3N0cnVjdCB4ZnNfbW91bnQ7CitzdHJ1Y3QgeGZzX3RyYW5zOworCisvKgorICogRnJvbSB4ZnNfdHJhbnNfaXRlbS5jCisgKi8KK3N0cnVjdCB4ZnNfbG9nX2l0ZW1fZGVzYwkqeGZzX3RyYW5zX2FkZF9pdGVtKHN0cnVjdCB4ZnNfdHJhbnMgKiwKKwkJCQkJICAgIHN0cnVjdCB4ZnNfbG9nX2l0ZW0gKik7Cit2b2lkCQkJCXhmc190cmFuc19mcmVlX2l0ZW0oc3RydWN0IHhmc190cmFucyAqLAorCQkJCQkgICAgc3RydWN0IHhmc19sb2dfaXRlbV9kZXNjICopOworc3RydWN0IHhmc19sb2dfaXRlbV9kZXNjCSp4ZnNfdHJhbnNfZmluZF9pdGVtKHN0cnVjdCB4ZnNfdHJhbnMgKiwKKwkJCQkJICAgICBzdHJ1Y3QgeGZzX2xvZ19pdGVtICopOworc3RydWN0IHhmc19sb2dfaXRlbV9kZXNjCSp4ZnNfdHJhbnNfZmlyc3RfaXRlbShzdHJ1Y3QgeGZzX3RyYW5zICopOworc3RydWN0IHhmc19sb2dfaXRlbV9kZXNjCSp4ZnNfdHJhbnNfbmV4dF9pdGVtKHN0cnVjdCB4ZnNfdHJhbnMgKiwKKwkJCQkJICAgICBzdHJ1Y3QgeGZzX2xvZ19pdGVtX2Rlc2MgKik7Cit2b2lkCQkJCXhmc190cmFuc19mcmVlX2l0ZW1zKHN0cnVjdCB4ZnNfdHJhbnMgKiwgaW50KTsKK3ZvaWQJCQkJeGZzX3RyYW5zX3VubG9ja19pdGVtcyhzdHJ1Y3QgeGZzX3RyYW5zICosCisJCQkJCQkJeGZzX2xzbl90KTsKK3ZvaWQJCQkJeGZzX3RyYW5zX2ZyZWVfYnVzeSh4ZnNfdHJhbnNfdCAqdHApOworeGZzX2xvZ19idXN5X3Nsb3RfdAkJKnhmc190cmFuc19hZGRfYnVzeSh4ZnNfdHJhbnNfdCAqdHAsCisJCQkJCQkgICAgeGZzX2FnbnVtYmVyX3QgYWcsCisJCQkJCQkgICAgeGZzX2V4dGxlbl90IGlkeCk7CisKKy8qCisgKiBGcm9tIHhmc190cmFuc19haWwuYworICovCit2b2lkCQkJeGZzX3RyYW5zX3VwZGF0ZV9haWwoc3RydWN0IHhmc19tb3VudCAqLAorCQkJCSAgICAgc3RydWN0IHhmc19sb2dfaXRlbSAqLCB4ZnNfbHNuX3QsCisJCQkJICAgICB1bnNpZ25lZCBsb25nKTsKK3ZvaWQJCQl4ZnNfdHJhbnNfZGVsZXRlX2FpbChzdHJ1Y3QgeGZzX21vdW50ICosCisJCQkJICAgICBzdHJ1Y3QgeGZzX2xvZ19pdGVtICosIHVuc2lnbmVkIGxvbmcpOworc3RydWN0IHhmc19sb2dfaXRlbQkqeGZzX3RyYW5zX2ZpcnN0X2FpbChzdHJ1Y3QgeGZzX21vdW50ICosIGludCAqKTsKK3N0cnVjdCB4ZnNfbG9nX2l0ZW0JKnhmc190cmFuc19uZXh0X2FpbChzdHJ1Y3QgeGZzX21vdW50ICosCisJCQkJICAgICBzdHJ1Y3QgeGZzX2xvZ19pdGVtICosIGludCAqLCBpbnQgKik7CisKKworI2VuZGlmCS8qIF9fWEZTX1RSQU5TX1BSSVZfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3RyYW5zX3NwYWNlLmggYi9mcy94ZnMveGZzX3RyYW5zX3NwYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkxZDE3MwotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfdHJhbnNfc3BhY2UuaApAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisjaWZuZGVmIF9fWEZTX1RSQU5TX1NQQUNFX0hfXworI2RlZmluZSBfX1hGU19UUkFOU19TUEFDRV9IX18KKworLyoKKyAqIENvbXBvbmVudHMgb2Ygc3BhY2UgcmVzZXJ2YXRpb25zLgorICovCisjZGVmaW5lIFhGU19NQVhfQ09OVElHX0VYVEVOVFNfUEVSX0JMT0NLKG1wKSAgICBcCisJCSgoKG1wKS0+bV9hbGxvY19teHJbMF0pIC0gKChtcCktPm1fYWxsb2NfbW5yWzBdKSkKKyNkZWZpbmUJWEZTX0VYVEVOVEFERF9TUEFDRV9SRVMobXAsdykJKFhGU19CTV9NQVhMRVZFTFMobXAsdykgLSAxKQorI2RlZmluZSBYRlNfTkVYVEVOVEFERF9TUEFDRV9SRVMobXAsYix3KVwKKwkoKChiICsgWEZTX01BWF9DT05USUdfRVhURU5UU19QRVJfQkxPQ0sobXApIC0gMSkgLyBcCisJICBYRlNfTUFYX0NPTlRJR19FWFRFTlRTX1BFUl9CTE9DSyhtcCkpICogXAorCSAgWEZTX0VYVEVOVEFERF9TUEFDRV9SRVMobXAsdykpCisjZGVmaW5lCVhGU19EQUVOVEVSXzFCKG1wLHcpCSgodykgPT0gWEZTX0RBVEFfRk9SSyA/IChtcCktPm1fZGlyYmxrZnNicyA6IDEpCisjZGVmaW5lCVhGU19EQUVOVEVSX0RCUyhtcCx3KQlcCisJKFhGU19EQV9OT0RFX01BWERFUFRIICsgXAorCSAoKFhGU19ESVJfSVNfVjIobXApICYmICh3KSA9PSBYRlNfREFUQV9GT1JLKSA/IDIgOiAwKSkKKyNkZWZpbmUJWEZTX0RBRU5URVJfQkxPQ0tTKG1wLHcpCVwKKwkoWEZTX0RBRU5URVJfMUIobXAsdykgKiBYRlNfREFFTlRFUl9EQlMobXAsdykpCisjZGVmaW5lCVhGU19EQUVOVEVSX0JNQVAxQihtcCx3KQlcCisJWEZTX05FWFRFTlRBRERfU1BBQ0VfUkVTKG1wLCBYRlNfREFFTlRFUl8xQihtcCwgdyksIHcpCisjZGVmaW5lCVhGU19EQUVOVEVSX0JNQVBTKG1wLHcpCQlcCisJKFhGU19EQUVOVEVSX0RCUyhtcCx3KSAqIFhGU19EQUVOVEVSX0JNQVAxQihtcCx3KSkKKyNkZWZpbmUJWEZTX0RBRU5URVJfU1BBQ0VfUkVTKG1wLHcpCVwKKwkoWEZTX0RBRU5URVJfQkxPQ0tTKG1wLHcpICsgWEZTX0RBRU5URVJfQk1BUFMobXAsdykpCisjZGVmaW5lCVhGU19EQVJFTU9WRV9TUEFDRV9SRVMobXAsdykJWEZTX0RBRU5URVJfQk1BUFMobXAsdykKKyNkZWZpbmUJWEZTX0RJUkVOVEVSX01BWF9TUExJVChtcCxubCkJXAorCSgoKG1wKS0+bV9zYi5zYl9ibG9ja3NpemUgPT0gNTEyICYmIFwKKwkgIFhGU19ESVJfSVNfVjEobXApICYmIFwKKwkgIChubCkgPj0gWEZTX0RJUl9MRUFGX0NBTl9ET1VCTEVfU1BMSVRfTEVOKSA/IDIgOiAxKQorI2RlZmluZQlYRlNfRElSRU5URVJfU1BBQ0VfUkVTKG1wLG5sKQlcCisJKFhGU19EQUVOVEVSX1NQQUNFX1JFUyhtcCwgWEZTX0RBVEFfRk9SSykgKiBcCisJIFhGU19ESVJFTlRFUl9NQVhfU1BMSVQobXAsbmwpKQorI2RlZmluZQlYRlNfRElSUkVNT1ZFX1NQQUNFX1JFUyhtcCkJXAorCVhGU19EQVJFTU9WRV9TUEFDRV9SRVMobXAsIFhGU19EQVRBX0ZPUkspCisjZGVmaW5lCVhGU19JQUxMT0NfU1BBQ0VfUkVTKG1wKQlcCisJKFhGU19JQUxMT0NfQkxPQ0tTKG1wKSArIFhGU19JTl9NQVhMRVZFTFMobXApLTEpCisKKy8qCisgKiBTcGFjZSByZXNlcnZhdGlvbiB2YWx1ZXMgZm9yIHZhcmlvdXMgdHJhbnNhY3Rpb25zLgorICovCisjZGVmaW5lCVhGU19BRERBRk9SS19TUEFDRV9SRVMobXApCVwKKwkoKG1wKS0+bV9kaXJibGtmc2JzICsgXAorCSAoWEZTX0RJUl9JU19WMShtcCkgPyAwIDogWEZTX0RBRU5URVJfQk1BUDFCKG1wLCBYRlNfREFUQV9GT1JLKSkpCisjZGVmaW5lCVhGU19BVFRSUk1fU1BBQ0VfUkVTKG1wKQlcCisJWEZTX0RBUkVNT1ZFX1NQQUNFX1JFUyhtcCwgWEZTX0FUVFJfRk9SSykKKy8qIFRoaXMgbWFjcm8gaXMgbm90IHVzZWQgLSBzZWUgaW5saW5lIGNvZGUgaW4geGZzX2F0dHJfc2V0ICovCisjZGVmaW5lCVhGU19BVFRSU0VUX1NQQUNFX1JFUyhtcCwgdikJXAorCShYRlNfREFFTlRFUl9TUEFDRV9SRVMobXAsIFhGU19BVFRSX0ZPUkspICsgWEZTX0JfVE9fRlNCKG1wLCB2KSkKKyNkZWZpbmUJWEZTX0NSRUFURV9TUEFDRV9SRVMobXAsbmwpCVwKKwkoWEZTX0lBTExPQ19TUEFDRV9SRVMobXApICsgWEZTX0RJUkVOVEVSX1NQQUNFX1JFUyhtcCxubCkpCisjZGVmaW5lCVhGU19ESU9TVFJBVF9TUEFDRV9SRVMobXAsIHYpCVwKKwkoWEZTX0VYVEVOVEFERF9TUEFDRV9SRVMobXAsIFhGU19EQVRBX0ZPUkspICsgKHYpKQorI2RlZmluZQlYRlNfR1JPV0ZTX1NQQUNFX1JFUyhtcCkJXAorCSgyICogWEZTX0FHX01BWExFVkVMUyhtcCkpCisjZGVmaW5lCVhGU19HUk9XRlNSVF9TUEFDRV9SRVMobXAsYikJXAorCSgoYikgKyBYRlNfRVhURU5UQUREX1NQQUNFX1JFUyhtcCwgWEZTX0RBVEFfRk9SSykpCisjZGVmaW5lCVhGU19MSU5LX1NQQUNFX1JFUyhtcCxubCkJXAorCVhGU19ESVJFTlRFUl9TUEFDRV9SRVMobXAsbmwpCisjZGVmaW5lCVhGU19NS0RJUl9TUEFDRV9SRVMobXAsbmwpCVwKKwkoWEZTX0lBTExPQ19TUEFDRV9SRVMobXApICsgWEZTX0RJUkVOVEVSX1NQQUNFX1JFUyhtcCxubCkpCisjZGVmaW5lCVhGU19RTV9EUUFMTE9DX1NQQUNFX1JFUyhtcCkJXAorCShYRlNfRVhURU5UQUREX1NQQUNFX1JFUyhtcCwgWEZTX0RBVEFfRk9SSykgKyBcCisJIFhGU19EUVVPVF9DTFVTVEVSX1NJWkVfRlNCKQorI2RlZmluZQlYRlNfUU1fUUlOT0NSRUFURV9TUEFDRV9SRVMobXApCVwKKwlYRlNfSUFMTE9DX1NQQUNFX1JFUyhtcCkKKyNkZWZpbmUJWEZTX1JFTU9WRV9TUEFDRV9SRVMobXApCVwKKwlYRlNfRElSUkVNT1ZFX1NQQUNFX1JFUyhtcCkKKyNkZWZpbmUJWEZTX1JFTkFNRV9TUEFDRV9SRVMobXAsbmwpCVwKKwkoWEZTX0RJUlJFTU9WRV9TUEFDRV9SRVMobXApICsgWEZTX0RJUkVOVEVSX1NQQUNFX1JFUyhtcCxubCkpCisjZGVmaW5lCVhGU19TWU1MSU5LX1NQQUNFX1JFUyhtcCxubCxiKQlcCisJKFhGU19JQUxMT0NfU1BBQ0VfUkVTKG1wKSArIFhGU19ESVJFTlRFUl9TUEFDRV9SRVMobXAsbmwpICsgKGIpKQorCisjZW5kaWYJLyogX19YRlNfVFJBTlNfU1BBQ0VfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3R5cGVzLmggYi9mcy94ZnMveGZzX3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ2MDlkMgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfdHlwZXMuaApAQCAtMCwwICsxLDE4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKyNpZm5kZWYgX19YRlNfVFlQRVNfSF9fCisjZGVmaW5lCV9fWEZTX1RZUEVTX0hfXworCisjaWZkZWYgX19LRVJORUxfXworCisvKgorICogUE9TSVggRXh0ZW5zaW9ucworICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJCXVjaGFyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0CQl1c2hvcnRfdDsKK3R5cGVkZWYgdW5zaWduZWQgaW50CQl1aW50X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcJCXVsb25nX3Q7CisKKy8qCisgKiBBZGRpdGlvbmFsIHR5cGUgZGVjbGFyYXRpb25zIGZvciBYRlMKKyAqLwordHlwZWRlZiBzaWduZWQgY2hhcgkJX19pbnQ4X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIJCV9fdWludDhfdDsKK3R5cGVkZWYgc2lnbmVkIHNob3J0IGludAlfX2ludDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IGludAlfX3VpbnQxNl90OwordHlwZWRlZiBzaWduZWQgaW50CQlfX2ludDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludAkJX191aW50MzJfdDsKK3R5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyBpbnQJX19pbnQ2NF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgaW50CV9fdWludDY0X3Q7CisKK3R5cGVkZWYgZW51bSB7IEJfRkFMU0UsQl9UUlVFIH0JYm9vbGVhbl90OwordHlwZWRlZiBfX2ludDY0X3QJCXByaWRfdDsJCS8qIHByb2plY3QgSUQgKi8KK3R5cGVkZWYgX191aW50MzJfdAkJaW5zdF90OwkJLyogYW4gaW5zdHJ1Y3Rpb24gKi8KKwordHlwZWRlZiBfX3M2NAkJCXhmc19vZmZfdDsJLyogPGZpbGUgb2Zmc2V0PiB0eXBlICovCit0eXBlZGVmIF9fdTY0CQkJeGZzX2lub190OwkvKiA8aW5vZGU+IHR5cGUgKi8KK3R5cGVkZWYgX19zNjQJCQl4ZnNfZGFkZHJfdDsJLyogPGRpc2sgYWRkcmVzcz4gdHlwZSAqLwordHlwZWRlZiBjaGFyICoJCQl4ZnNfY2FkZHJfdDsJLyogPGNvcmUgYWRkcmVzcz4gdHlwZSAqLwordHlwZWRlZiBfX3UzMgkJCXhmc19kZXZfdDsKKworLyogX19wc2ludF90IGlzIHRoZSBzYW1lIHNpemUgYXMgYSBwb2ludGVyICovCisjaWYgKEJJVFNfUEVSX0xPTkcgPT0gMzIpCit0eXBlZGVmIF9faW50MzJfdCBfX3BzaW50X3Q7Cit0eXBlZGVmIF9fdWludDMyX3QgX19wc3Vuc2lnbmVkX3Q7CisjZWxpZiAoQklUU19QRVJfTE9ORyA9PSA2NCkKK3R5cGVkZWYgX19pbnQ2NF90IF9fcHNpbnRfdDsKK3R5cGVkZWYgX191aW50NjRfdCBfX3BzdW5zaWduZWRfdDsKKyNlbHNlCisjZXJyb3IgQklUU19QRVJfTE9ORyBtdXN0IGJlIDMyIG9yIDY0CisjZW5kaWYKKworI2VuZGlmCS8qIF9fS0VSTkVMX18gKi8KKwordHlwZWRlZiBfX3VpbnQzMl90CXhmc19hZ2Jsb2NrX3Q7CS8qIGJsb2Nrbm8gaW4gYWxsb2MuIGdyb3VwICovCit0eXBlZGVmCV9fdWludDMyX3QJeGZzX2V4dGxlbl90OwkvKiBleHRlbnQgbGVuZ3RoIGluIGJsb2NrcyAqLwordHlwZWRlZglfX3VpbnQzMl90CXhmc19hZ251bWJlcl90OwkvKiBhbGxvY2F0aW9uIGdyb3VwIG51bWJlciAqLwordHlwZWRlZiBfX2ludDMyX3QJeGZzX2V4dG51bV90OwkvKiAjIG9mIGV4dGVudHMgaW4gYSBmaWxlICovCit0eXBlZGVmIF9faW50MTZfdAl4ZnNfYWV4dG51bV90OwkvKiAjIGV4dGVudHMgaW4gYW4gYXR0cmlidXRlIGZvcmsgKi8KK3R5cGVkZWYJX19pbnQ2NF90CXhmc19mc2l6ZV90OwkvKiBieXRlcyBpbiBhIGZpbGUgKi8KK3R5cGVkZWYgX191aW50NjRfdAl4ZnNfdWZzaXplX3Q7CS8qIHVuc2lnbmVkIGJ5dGVzIGluIGEgZmlsZSAqLworCit0eXBlZGVmCV9faW50MzJfdAl4ZnNfc3VtaW5mb190OwkvKiB0eXBlIG9mIGJpdG1hcCBzdW1tYXJ5IGluZm8gKi8KK3R5cGVkZWYJX19pbnQzMl90CXhmc19ydHdvcmRfdDsJLyogd29yZCB0eXBlIGZvciBiaXRtYXAgbWFuaXB1bGF0aW9ucyAqLworCit0eXBlZGVmCV9faW50NjRfdAl4ZnNfbHNuX3Q7CS8qIGxvZyBzZXF1ZW5jZSBudW1iZXIgKi8KK3R5cGVkZWYJX19pbnQzMl90CXhmc190aWRfdDsJLyogdHJhbnNhY3Rpb24gaWRlbnRpZmllciAqLworCit0eXBlZGVmCV9fdWludDMyX3QJeGZzX2RhYmxrX3Q7CS8qIGRpci9hdHRyIGJsb2NrIG51bWJlciAoaW4gZmlsZSkgKi8KK3R5cGVkZWYJX191aW50MzJfdAl4ZnNfZGFoYXNoX3Q7CS8qIGRpci9hdHRyIGhhc2ggdmFsdWUgKi8KKwordHlwZWRlZiBfX3VpbnQxNl90CXhmc19wcmlkX3Q7CS8qIHByaWRfdCB0cnVuY2F0ZWQgdG8gMTZiaXRzIGluIFhGUyAqLworCisvKgorICogVGhlc2UgdHlwZXMgYXJlIDY0IGJpdHMgb24gZGlzayBidXQgYXJlIGVpdGhlciAzMiBvciA2NCBiaXRzIGluIG1lbW9yeS4KKyAqIERpc2sgYmFzZWQgdHlwZXM6CisgKi8KK3R5cGVkZWYgX191aW50NjRfdAl4ZnNfZGZzYm5vX3Q7CS8qIGJsb2Nrbm8gaW4gZmlsZXN5c3RlbSAoYWdub3xhZ2JubykgKi8KK3R5cGVkZWYgX191aW50NjRfdAl4ZnNfZHJmc2Jub190OwkvKiBibG9ja25vIGluIGZpbGVzeXN0ZW0gKHJhdykgKi8KK3R5cGVkZWYJX191aW50NjRfdAl4ZnNfZHJ0Ym5vX3Q7CS8qIGV4dGVudCAoYmxvY2spIGluIHJlYWx0aW1lIGFyZWEgKi8KK3R5cGVkZWYJX191aW50NjRfdAl4ZnNfZGZpbG9mZl90OwkvKiBibG9jayBudW1iZXIgaW4gYSBmaWxlICovCit0eXBlZGVmCV9fdWludDY0X3QJeGZzX2RmaWxibGtzX3Q7CS8qIG51bWJlciBvZiBibG9ja3MgaW4gYSBmaWxlICovCisKKy8qCisgKiBNZW1vcnkgYmFzZWQgdHlwZXMgYXJlIGNvbmRpdGlvbmFsLgorICovCisjaWYgWEZTX0JJR19CTEtOT1MKK3R5cGVkZWYJX191aW50NjRfdAl4ZnNfZnNibG9ja190OwkvKiBibG9ja25vIGluIGZpbGVzeXN0ZW0gKGFnbm98YWdibm8pICovCit0eXBlZGVmIF9fdWludDY0X3QJeGZzX3Jmc2Jsb2NrX3Q7CS8qIGJsb2Nrbm8gaW4gZmlsZXN5c3RlbSAocmF3KSAqLwordHlwZWRlZiBfX3VpbnQ2NF90CXhmc19ydGJsb2NrX3Q7CS8qIGV4dGVudCAoYmxvY2spIGluIHJlYWx0aW1lIGFyZWEgKi8KK3R5cGVkZWYJX19pbnQ2NF90CXhmc19zcnRibG9ja190OwkvKiBzaWduZWQgdmVyc2lvbiBvZiB4ZnNfcnRibG9ja190ICovCisjZWxzZQordHlwZWRlZglfX3VpbnQzMl90CXhmc19mc2Jsb2NrX3Q7CS8qIGJsb2Nrbm8gaW4gZmlsZXN5c3RlbSAoYWdub3xhZ2JubykgKi8KK3R5cGVkZWYgX191aW50MzJfdAl4ZnNfcmZzYmxvY2tfdDsJLyogYmxvY2tubyBpbiBmaWxlc3lzdGVtIChyYXcpICovCit0eXBlZGVmIF9fdWludDMyX3QJeGZzX3J0YmxvY2tfdDsJLyogZXh0ZW50IChibG9jaykgaW4gcmVhbHRpbWUgYXJlYSAqLwordHlwZWRlZglfX2ludDMyX3QJeGZzX3NydGJsb2NrX3Q7CS8qIHNpZ25lZCB2ZXJzaW9uIG9mIHhmc19ydGJsb2NrX3QgKi8KKyNlbmRpZgordHlwZWRlZiBfX3VpbnQ2NF90CXhmc19maWxlb2ZmX3Q7CS8qIGJsb2NrIG51bWJlciBpbiBhIGZpbGUgKi8KK3R5cGVkZWYgX19pbnQ2NF90CXhmc19zZmlsb2ZmX3Q7CS8qIHNpZ25lZCBibG9jayBudW1iZXIgaW4gYSBmaWxlICovCit0eXBlZGVmIF9fdWludDY0X3QJeGZzX2ZpbGJsa3NfdDsJLyogbnVtYmVyIG9mIGJsb2NrcyBpbiBhIGZpbGUgKi8KKwordHlwZWRlZiBfX3VpbnQ4X3QJeGZzX2FyY2hfdDsJLyogYXJjaGl0ZWN0dXJlIG9mIGFuIHhmcyBmcyAqLworCisvKgorICogTnVsbCB2YWx1ZXMgZm9yIHRoZSB0eXBlcy4KKyAqLworI2RlZmluZQlOVUxMREZTQk5PCSgoeGZzX2Rmc2Jub190KS0xKQorI2RlZmluZQlOVUxMRFJGU0JOTwkoKHhmc19kcmZzYm5vX3QpLTEpCisjZGVmaW5lCU5VTExEUlRCTk8JKCh4ZnNfZHJ0Ym5vX3QpLTEpCisjZGVmaW5lCU5VTExERklMT0ZGCSgoeGZzX2RmaWxvZmZfdCktMSkKKworI2RlZmluZQlOVUxMRlNCTE9DSwkoKHhmc19mc2Jsb2NrX3QpLTEpCisjZGVmaW5lCU5VTExSRlNCTE9DSwkoKHhmc19yZnNibG9ja190KS0xKQorI2RlZmluZQlOVUxMUlRCTE9DSwkoKHhmc19ydGJsb2NrX3QpLTEpCisjZGVmaW5lCU5VTExGSUxFT0ZGCSgoeGZzX2ZpbGVvZmZfdCktMSkKKworI2RlZmluZQlOVUxMQUdCTE9DSwkoKHhmc19hZ2Jsb2NrX3QpLTEpCisjZGVmaW5lCU5VTExBR05VTUJFUgkoKHhmc19hZ251bWJlcl90KS0xKQorI2RlZmluZQlOVUxMRVhUTlVNCSgoeGZzX2V4dG51bV90KS0xKQorCisjZGVmaW5lIE5VTExDT01NSVRMU04JKCh4ZnNfbHNuX3QpLTEpCisKKy8qCisgKiBNYXggdmFsdWVzIGZvciBleHRsZW4sIGV4dG51bSwgYWV4dG51bS4KKyAqLworI2RlZmluZQlNQVhFWFRMRU4JKCh4ZnNfZXh0bGVuX3QpMHgwMDFmZmZmZikJLyogMjEgYml0cyAqLworI2RlZmluZQlNQVhFWFROVU0JKCh4ZnNfZXh0bnVtX3QpMHg3ZmZmZmZmZikJLyogc2lnbmVkIGludCAqLworI2RlZmluZQlNQVhBRVhUTlVNCSgoeGZzX2FleHRudW1fdCkweDdmZmYpCQkvKiBzaWduZWQgc2hvcnQgKi8KKworLyoKKyAqIE1BWE5BTUVMRU4gaXMgdGhlIGxlbmd0aCAoaW5jbHVkaW5nIHRoZSB0ZXJtaW5hdGluZyBudWxsKSBvZgorICogdGhlIGxvbmdlc3QgcGVybWlzc2libGUgZmlsZSAoY29tcG9uZW50KSBuYW1lLgorICovCisjZGVmaW5lIE1BWE5BTUVMRU4JMjU2CisKK3R5cGVkZWYgc3RydWN0IHhmc19kaXJlbnQgewkJLyogZGF0YSBmcm9tIHJlYWRkaXIoKSAqLworCXhmc19pbm9fdAlkX2lubzsJCS8qIGlub2RlIG51bWJlciBvZiBlbnRyeSAqLworCXhmc19vZmZfdAlkX29mZjsJCS8qIG9mZnNldCBvZiBkaXNrIGRpcmVjdG9yeSBlbnRyeSAqLworCXVuc2lnbmVkIHNob3J0CWRfcmVjbGVuOwkvKiBsZW5ndGggb2YgdGhpcyByZWNvcmQgKi8KKwljaGFyCQlkX25hbWVbMV07CS8qIG5hbWUgb2YgZmlsZSAqLworfSB4ZnNfZGlyZW50X3Q7CisKKyNkZWZpbmUgRElSRU5UQkFTRVNJWkUJCSgoKHhmc19kaXJlbnRfdCAqKTApLT5kX25hbWUgLSAoY2hhciAqKTApCisjZGVmaW5lIERJUkVOVFNJWkUobmFtZWxlbikJXAorCSgoRElSRU5UQkFTRVNJWkUgKyAobmFtZWxlbikgKyBcCisJCXNpemVvZih4ZnNfb2ZmX3QpKSAmIH4oc2l6ZW9mKHhmc19vZmZfdCkgLSAxKSkKKwordHlwZWRlZiBlbnVtIHsKKwlYRlNfTE9PS1VQX0VRaSwgWEZTX0xPT0tVUF9MRWksIFhGU19MT09LVVBfR0VpCit9IHhmc19sb29rdXBfdDsKKwordHlwZWRlZiBlbnVtIHsKKwlYRlNfQlROVU1fQk5PaSwgWEZTX0JUTlVNX0NOVGksIFhGU19CVE5VTV9CTUFQaSwgWEZTX0JUTlVNX0lOT2ksCisJWEZTX0JUTlVNX01BWAorfSB4ZnNfYnRudW1fdDsKKworI2VuZGlmCS8qIF9fWEZTX1RZUEVTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc191dGlscy5jIGIvZnMveGZzL3hmc191dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNmI5NDUKLS0tIC9kZXYvbnVsbAorKysgYi9mcy94ZnMveGZzX3V0aWxzLmMKQEAgLTAsMCArMSw0ODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKyNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19ibWFwLmgiCisjaW5jbHVkZSAieGZzX2Vycm9yLmgiCisjaW5jbHVkZSAieGZzX3F1b3RhLmgiCisjaW5jbHVkZSAieGZzX3J3LmgiCisjaW5jbHVkZSAieGZzX2l0YWJsZS5oIgorI2luY2x1ZGUgInhmc191dGlscy5oIgorCisvKgorICogeGZzX2dldF9kaXJfZW50cnkgaXMgdXNlZCB0byBnZXQgYSByZWZlcmVuY2UgdG8gYW4gaW5vZGUgZ2l2ZW4KKyAqIGl0cyBwYXJlbnQgZGlyZWN0b3J5IGlub2RlIGFuZCB0aGUgbmFtZSBvZiB0aGUgZmlsZS4JIEl0IGRvZXMKKyAqIG5vdCBsb2NrIHRoZSBjaGlsZCBpbm9kZSwgYW5kIGl0IHVubG9ja3MgdGhlIGRpcmVjdG9yeSBiZWZvcmUKKyAqIHJldHVybmluZy4gIFRoZSBkaXJlY3RvcnkncyBnZW5lcmF0aW9uIG51bWJlciBpcyByZXR1cm5lZCBmb3IKKyAqIHVzZSBieSBhIGxhdGVyIGNhbGwgdG8geGZzX2xvY2tfZGlyX2FuZF9lbnRyeS4KKyAqLworaW50Cit4ZnNfZ2V0X2Rpcl9lbnRyeSgKKwl2bmFtZV90CQkqZGVudHJ5LAorCXhmc19pbm9kZV90CSoqaXBwKQoreworCXZub2RlX3QJCSp2cDsKKwliaHZfZGVzY190CSpiZHA7CisKKwl2cCA9IFZOQU1FX1RPX1ZOT0RFKGRlbnRyeSk7CisJYmRwID0gdm5fYmh2X2xvb2t1cF91bmxvY2tlZChWTl9CSFZfSEVBRCh2cCksICZ4ZnNfdm5vZGVvcHMpOworCWlmICghYmRwKSB7CisJCSppcHAgPSBOVUxMOworCQlyZXR1cm4gWEZTX0VSUk9SKEVOT0VOVCk7CisJfQorCVZOX0hPTEQodnApOworCSppcHAgPSBYRlNfQkhWVE9JKGJkcCk7CisJcmV0dXJuIDA7Cit9CisKK2ludAoreGZzX2Rpcl9sb29rdXBfaW50KAorCWJodl9kZXNjX3QJKmRpcl9iZHAsCisJdWludAkJbG9ja19tb2RlLAorCXZuYW1lX3QJCSpkZW50cnksCisJeGZzX2lub190CSppbnVtLAorCXhmc19pbm9kZV90CSoqaXBwKQoreworCXZub2RlX3QJCSpkaXJfdnA7CisJeGZzX2lub2RlX3QJKmRwOworCWludAkJZXJyb3I7CisKKwlkaXJfdnAgPSBCSFZfVE9fVk5PREUoZGlyX2JkcCk7CisJdm5fdHJhY2VfZW50cnkoZGlyX3ZwLCBfX0ZVTkNUSU9OX18sIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKworCWRwID0gWEZTX0JIVlRPSShkaXJfYmRwKTsKKworCWVycm9yID0gWEZTX0RJUl9MT09LVVAoZHAtPmlfbW91bnQsIE5VTEwsIGRwLAorCQkJCVZOQU1FKGRlbnRyeSksIFZOQU1FTEVOKGRlbnRyeSksIGludW0pOworCWlmICghZXJyb3IpIHsKKwkJLyoKKwkJICogVW5sb2NrIHRoZSBkaXJlY3RvcnkuIFdlIGRvIHRoaXMgYmVjYXVzZSB3ZSBjYW4ndAorCQkgKiBob2xkIHRoZSBkaXJlY3RvcnkgbG9jayB3aGlsZSBkb2luZyB0aGUgdm5fZ2V0KCkKKwkJICogaW4geGZzX2lnZXQoKS4gIERvaW5nIHNvIGNvdWxkIGNhdXNlIHVzIHRvIGhvbGQKKwkJICogYSBsb2NrIHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBpbm9kZSB0byBmaW5pc2gKKwkJICogYmVpbmcgaW5hY3RpdmUgd2hpbGUgaXQncyB3YWl0aW5nIGZvciBhIGxvZworCQkgKiByZXNlcnZhdGlvbiBpbiB0aGUgaW5hY3RpdmUgcm91dGluZS4KKwkJICovCisJCXhmc19pdW5sb2NrKGRwLCBsb2NrX21vZGUpOworCQllcnJvciA9IHhmc19pZ2V0KGRwLT5pX21vdW50LCBOVUxMLCAqaW51bSwgMCwgMCwgaXBwLCAwKTsKKwkJeGZzX2lsb2NrKGRwLCBsb2NrX21vZGUpOworCisJCWlmIChlcnJvcikgeworCQkJKmlwcCA9IE5VTEw7CisJCX0gZWxzZSBpZiAoKCppcHApLT5pX2QuZGlfbW9kZSA9PSAwKSB7CisJCQkvKgorCQkJICogVGhlIGlub2RlIGhhcyBiZWVuIGZyZWVkLiAgU29tZXRoaW5nIGlzCisJCQkgKiB3cm9uZyBzbyBqdXN0IGdldCBvdXQgb2YgaGVyZS4KKwkJCSAqLworCQkJeGZzX2l1bmxvY2soZHAsIGxvY2tfbW9kZSk7CisJCQl4ZnNfaXB1dF9uZXcoKmlwcCwgMCk7CisJCQkqaXBwID0gTlVMTDsKKwkJCXhmc19pbG9jayhkcCwgbG9ja19tb2RlKTsKKwkJCWVycm9yID0gWEZTX0VSUk9SKEVOT0VOVCk7CisJCX0KKwl9CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogQWxsb2NhdGVzIGEgbmV3IGlub2RlIGZyb20gZGlzayBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUKKyAqIGluY29yZSBjb3B5LiBUaGlzIHJvdXRpbmUgd2lsbCBpbnRlcm5hbGx5IGNvbW1pdCB0aGUgY3VycmVudAorICogdHJhbnNhY3Rpb24gYW5kIGFsbG9jYXRlIGEgbmV3IG9uZSBpZiB0aGUgU3BhY2UgTWFuYWdlciBuZWVkZWQKKyAqIHRvIGRvIGFuIGFsbG9jYXRpb24gdG8gcmVwbGVuaXNoIHRoZSBpbm9kZSBmcmVlLWxpc3QuCisgKgorICogVGhpcyByb3V0aW5lIGlzIGRlc2lnbmVkIHRvIGJlIGNhbGxlZCBmcm9tIHhmc19jcmVhdGUgYW5kCisgKiB4ZnNfY3JlYXRlX2Rpci4KKyAqCisgKi8KK2ludAoreGZzX2Rpcl9pYWxsb2MoCisJeGZzX3RyYW5zX3QJKip0cHAsCQkvKiBpbnB1dDogY3VycmVudCB0cmFuc2FjdGlvbjsKKwkJCQkJICAgb3V0cHV0OiBtYXkgYmUgYSBuZXcgdHJhbnNhY3Rpb24uICovCisJeGZzX2lub2RlX3QJKmRwLAkJLyogZGlyZWN0b3J5IHdpdGhpbiB3aG9zZSBhbGxvY2F0ZQorCQkJCQkgICB0aGUgaW5vZGUuICovCisJbW9kZV90CQltb2RlLAorCW5saW5rX3QJCW5saW5rLAorCXhmc19kZXZfdAlyZGV2LAorCWNyZWRfdAkJKmNyZWRwLAorCXByaWRfdAkJcHJpZCwJCS8qIHByb2plY3QgaWQgKi8KKwlpbnQJCW9rYWxsb2MsCS8qIG9rIHRvIGFsbG9jYXRlIG5ldyBzcGFjZSAqLworCXhmc19pbm9kZV90CSoqaXBwLAkJLyogcG9pbnRlciB0byBpbm9kZTsgaXQgd2lsbCBiZQorCQkJCQkgICBsb2NrZWQuICovCisJaW50CQkqY29tbWl0dGVkKQorCit7CisJeGZzX3RyYW5zX3QJKnRwOworCXhmc190cmFuc190CSpudHA7CisJeGZzX2lub2RlX3QJKmlwOworCXhmc19idWZfdAkqaWFsbG9jX2NvbnRleHQgPSBOVUxMOworCWJvb2xlYW5fdAljYWxsX2FnYWluID0gQl9GQUxTRTsKKwlpbnQJCWNvZGU7CisJdWludAkJbG9nX3JlczsKKwl1aW50CQlsb2dfY291bnQ7CisJdm9pZAkJKmRxaW5mbzsKKwl1aW50CQl0ZmxhZ3M7CisKKwl0cCA9ICp0cHA7CisJQVNTRVJUKHRwLT50X2ZsYWdzICYgWEZTX1RSQU5TX1BFUk1fTE9HX1JFUyk7CisKKwkvKgorCSAqIHhmc19pYWxsb2Mgd2lsbCByZXR1cm4gYSBwb2ludGVyIHRvIGFuIGluY29yZSBpbm9kZSBpZgorCSAqIHRoZSBTcGFjZSBNYW5hZ2VyIGhhcyBhbiBhdmFpbGFibGUgaW5vZGUgb24gdGhlIGZyZWUKKwkgKiBsaXN0LiBPdGhlcndpc2UsIGl0IHdpbGwgZG8gYW4gYWxsb2NhdGlvbiBhbmQgcmVwbGVuaXNoCisJICogdGhlIGZyZWVsaXN0LiAgU2luY2Ugd2UgY2FuIG9ubHkgZG8gb25lIGFsbG9jYXRpb24gcGVyCisJICogdHJhbnNhY3Rpb24gd2l0aG91dCBkZWFkbG9ja3MsIHdlIHdpbGwgbmVlZCB0byBjb21taXQgdGhlCisJICogY3VycmVudCB0cmFuc2FjdGlvbiBhbmQgc3RhcnQgYSBuZXcgb25lLiAgV2Ugd2lsbCB0aGVuCisJICogbmVlZCB0byBjYWxsIHhmc19pYWxsb2MgYWdhaW4gdG8gZ2V0IHRoZSBpbm9kZS4KKwkgKgorCSAqIElmIHhmc19pYWxsb2MgZGlkIGFuIGFsbG9jYXRpb24gdG8gcmVwbGVuaXNoIHRoZSBmcmVlbGlzdCwKKwkgKiBpdCByZXR1cm5zIHRoZSBicCBjb250YWluaW5nIHRoZSBoZWFkIG9mIHRoZSBmcmVlbGlzdCBhcworCSAqIGlhbGxvY19jb250ZXh0LiBXZSB3aWxsIGhvbGQgYSBsb2NrIG9uIGl0IGFjcm9zcyB0aGUKKwkgKiB0cmFuc2FjdGlvbiBjb21taXQgc28gdGhhdCBubyBvdGhlciBwcm9jZXNzIGNhbiBzdGVhbAorCSAqIHRoZSBpbm9kZShzKSB0aGF0IHdlJ3ZlIGp1c3QgYWxsb2NhdGVkLgorCSAqLworCWNvZGUgPSB4ZnNfaWFsbG9jKHRwLCBkcCwgbW9kZSwgbmxpbmssIHJkZXYsIGNyZWRwLCBwcmlkLCBva2FsbG9jLAorCQkJICAmaWFsbG9jX2NvbnRleHQsICZjYWxsX2FnYWluLCAmaXApOworCisJLyoKKwkgKiBSZXR1cm4gYW4gZXJyb3IgaWYgd2Ugd2VyZSB1bmFibGUgdG8gYWxsb2NhdGUgYSBuZXcgaW5vZGUuCisJICogVGhpcyBzaG91bGQgb25seSBoYXBwZW4gaWYgd2UgcnVuIG91dCBvZiBzcGFjZSBvbiBkaXNrIG9yCisJICogZW5jb3VudGVyIGEgZGlzayBlcnJvci4KKwkgKi8KKwlpZiAoY29kZSkgeworCQkqaXBwID0gTlVMTDsKKwkJcmV0dXJuIGNvZGU7CisJfQorCWlmICghY2FsbF9hZ2FpbiAmJiAoaXAgPT0gTlVMTCkpIHsKKwkJKmlwcCA9IE5VTEw7CisJCXJldHVybiBYRlNfRVJST1IoRU5PU1BDKTsKKwl9CisKKwkvKgorCSAqIElmIGNhbGxfYWdhaW4gaXMgc2V0LCB0aGVuIHdlIHdlcmUgdW5hYmxlIHRvIGdldCBhbgorCSAqIGlub2RlIGluIG9uZSBvcGVyYXRpb24uICBXZSBuZWVkIHRvIGNvbW1pdCB0aGUgY3VycmVudAorCSAqIHRyYW5zYWN0aW9uIGFuZCBjYWxsIHhmc19pYWxsb2MoKSBhZ2Fpbi4gIEl0IGlzIGd1YXJhbnRlZWQKKwkgKiB0byBzdWNjZWVkIHRoZSBzZWNvbmQgdGltZS4KKwkgKi8KKwlpZiAoY2FsbF9hZ2FpbikgeworCisJCS8qCisJCSAqIE5vcm1hbGx5LCB4ZnNfdHJhbnNfY29tbWl0IHJlbGVhc2VzIGFsbCB0aGUgbG9ja3MuCisJCSAqIFdlIGNhbGwgYmhvbGQgdG8gaGFuZyBvbiB0byB0aGUgaWFsbG9jX2NvbnRleHQgYWNyb3NzCisJCSAqIHRoZSBjb21taXQuICBIb2xkaW5nIHRoaXMgYnVmZmVyIHByZXZlbnRzIGFueSBvdGhlcgorCQkgKiBwcm9jZXNzZXMgZnJvbSBkb2luZyBhbnkgYWxsb2NhdGlvbnMgaW4gdGhpcworCQkgKiBhbGxvY2F0aW9uIGdyb3VwLgorCQkgKi8KKwkJeGZzX3RyYW5zX2Job2xkKHRwLCBpYWxsb2NfY29udGV4dCk7CisJCS8qCisJCSAqIFNhdmUgdGhlIGxvZyByZXNlcnZhdGlvbiBzbyB3ZSBjYW4gdXNlCisJCSAqIHRoZW0gaW4gdGhlIG5leHQgdHJhbnNhY3Rpb24uCisJCSAqLworCQlsb2dfcmVzID0geGZzX3RyYW5zX2dldF9sb2dfcmVzKHRwKTsKKwkJbG9nX2NvdW50ID0geGZzX3RyYW5zX2dldF9sb2dfY291bnQodHApOworCisJCS8qCisJCSAqIFdlIHdhbnQgdGhlIHF1b3RhIGNoYW5nZXMgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXh0CisJCSAqIHRyYW5zYWN0aW9uLCBOT1QgdGhpcyBvbmUuIFNvLCBkZXRhY2ggdGhlIGRxaW5mbyBmcm9tIHRoaXMKKwkJICogYW5kIGF0dGFjaCBpdCB0byB0aGUgbmV4dCB0cmFuc2FjdGlvbi4KKwkJICovCisJCWRxaW5mbyA9IE5VTEw7CisJCXRmbGFncyA9IDA7CisJCWlmICh0cC0+dF9kcWluZm8pIHsKKwkJCWRxaW5mbyA9ICh2b2lkICopdHAtPnRfZHFpbmZvOworCQkJdHAtPnRfZHFpbmZvID0gTlVMTDsKKwkJCXRmbGFncyA9IHRwLT50X2ZsYWdzICYgWEZTX1RSQU5TX0RRX0RJUlRZOworCQkJdHAtPnRfZmxhZ3MgJj0gfihYRlNfVFJBTlNfRFFfRElSVFkpOworCQl9CisKKwkJbnRwID0geGZzX3RyYW5zX2R1cCh0cCk7CisJCWNvZGUgPSB4ZnNfdHJhbnNfY29tbWl0KHRwLCAwLCBOVUxMKTsKKwkJdHAgPSBudHA7CisJCWlmIChjb21taXR0ZWQgIT0gTlVMTCkgeworCQkJKmNvbW1pdHRlZCA9IDE7CisJCX0KKwkJLyoKKwkJICogSWYgd2UgZ2V0IGFuIGVycm9yIGR1cmluZyB0aGUgY29tbWl0IHByb2Nlc3NpbmcsCisJCSAqIHJlbGVhc2UgdGhlIGJ1ZmZlciB0aGF0IGlzIHN0aWxsIGhlbGQgYW5kIHJldHVybgorCQkgKiB0byB0aGUgY2FsbGVyLgorCQkgKi8KKwkJaWYgKGNvZGUpIHsKKwkJCXhmc19idWZfcmVsc2UoaWFsbG9jX2NvbnRleHQpOworCQkJaWYgKGRxaW5mbykgeworCQkJCXRwLT50X2RxaW5mbyA9IGRxaW5mbzsKKwkJCQlYRlNfVFJBTlNfRlJFRV9EUUlORk8odHAtPnRfbW91bnRwLCB0cCk7CisJCQl9CisJCQkqdHBwID0gbnRwOworCQkJKmlwcCA9IE5VTEw7CisJCQlyZXR1cm4gY29kZTsKKwkJfQorCQljb2RlID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsIGxvZ19yZXMsIDAsCisJCQkJCSBYRlNfVFJBTlNfUEVSTV9MT0dfUkVTLCBsb2dfY291bnQpOworCQkvKgorCQkgKiBSZS1hdHRhY2ggdGhlIHF1b3RhIGluZm8gdGhhdCB3ZSBkZXRhY2hlZCBmcm9tIHByZXYgdHJ4LgorCQkgKi8KKwkJaWYgKGRxaW5mbykgeworCQkJdHAtPnRfZHFpbmZvID0gZHFpbmZvOworCQkJdHAtPnRfZmxhZ3MgfD0gdGZsYWdzOworCQl9CisKKwkJaWYgKGNvZGUpIHsKKwkJCXhmc19idWZfcmVsc2UoaWFsbG9jX2NvbnRleHQpOworCQkJKnRwcCA9IG50cDsKKwkJCSppcHAgPSBOVUxMOworCQkJcmV0dXJuIGNvZGU7CisJCX0KKwkJeGZzX3RyYW5zX2Jqb2luKHRwLCBpYWxsb2NfY29udGV4dCk7CisKKwkJLyoKKwkJICogQ2FsbCBpYWxsb2MgYWdhaW4uIFNpbmNlIHdlJ3ZlIGxvY2tlZCBvdXQgYWxsCisJCSAqIG90aGVyIGFsbG9jYXRpb25zIGluIHRoaXMgYWxsb2NhdGlvbiBncm91cCwKKwkJICogdGhpcyBjYWxsIHNob3VsZCBhbHdheXMgc3VjY2VlZC4KKwkJICovCisJCWNvZGUgPSB4ZnNfaWFsbG9jKHRwLCBkcCwgbW9kZSwgbmxpbmssIHJkZXYsIGNyZWRwLCBwcmlkLAorCQkJCSAgb2thbGxvYywgJmlhbGxvY19jb250ZXh0LCAmY2FsbF9hZ2FpbiwgJmlwKTsKKworCQkvKgorCQkgKiBJZiB3ZSBnZXQgYW4gZXJyb3IgYXQgdGhpcyBwb2ludCwgcmV0dXJuIHRvIHRoZSBjYWxsZXIKKwkJICogc28gdGhhdCB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBjYW4gYmUgYWJvcnRlZC4KKwkJICovCisJCWlmIChjb2RlKSB7CisJCQkqdHBwID0gdHA7CisJCQkqaXBwID0gTlVMTDsKKwkJCXJldHVybiBjb2RlOworCQl9CisJCUFTU0VSVCAoKCFjYWxsX2FnYWluKSAmJiAoaXAgIT0gTlVMTCkpOworCisJfSBlbHNlIHsKKwkJaWYgKGNvbW1pdHRlZCAhPSBOVUxMKSB7CisJCQkqY29tbWl0dGVkID0gMDsKKwkJfQorCX0KKworCSppcHAgPSBpcDsKKwkqdHBwID0gdHA7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIERlY3JlbWVudCB0aGUgbGluayBjb3VudCBvbiBhbiBpbm9kZSAmIGxvZyB0aGUgY2hhbmdlLgorICogSWYgdGhpcyBjYXVzZXMgdGhlIGxpbmsgY291bnQgdG8gZ28gdG8gemVybywgaW5pdGlhdGUgdGhlCisgKiBsb2dnaW5nIGFjdGl2aXR5IHJlcXVpcmVkIHRvIHRydW5jYXRlIGEgZmlsZS4KKyAqLworaW50CQkJCS8qIGVycm9yICovCit4ZnNfZHJvcGxpbmsoCisJeGZzX3RyYW5zX3QgKnRwLAorCXhmc19pbm9kZV90ICppcCkKK3sKKwlpbnQJZXJyb3I7CisKKwl4ZnNfaWNoZ3RpbWUoaXAsIFhGU19JQ0hHVElNRV9DSEcpOworCisJQVNTRVJUIChpcC0+aV9kLmRpX25saW5rID4gMCk7CisJaXAtPmlfZC5kaV9ubGluay0tOworCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLCBYRlNfSUxPR19DT1JFKTsKKworCWVycm9yID0gMDsKKwlpZiAoaXAtPmlfZC5kaV9ubGluayA9PSAwKSB7CisJCS8qCisJCSAqIFdlJ3JlIGRyb3BwaW5nIHRoZSBsYXN0IGxpbmsgdG8gdGhpcyBmaWxlLgorCQkgKiBNb3ZlIHRoZSBvbi1kaXNrIGlub2RlIHRvIHRoZSBBR0kgdW5saW5rZWQgbGlzdC4KKwkJICogRnJvbSB4ZnNfaW5hY3RpdmUoKSB3ZSB3aWxsIHB1bGwgdGhlIGlub2RlIGZyb20KKwkJICogdGhlIGxpc3QgYW5kIGZyZWUgaXQuCisJCSAqLworCQllcnJvciA9IHhmc19pdW5saW5rKHRwLCBpcCk7CisJfQorCXJldHVybiBlcnJvcjsKK30KKworLyoKKyAqIFRoaXMgZ2V0cyBjYWxsZWQgd2hlbiB0aGUgaW5vZGUncyB2ZXJzaW9uIG5lZWRzIHRvIGJlIGNoYW5nZWQgZnJvbSAxIHRvIDIuCisgKiBDdXJyZW50bHkgdGhpcyBoYXBwZW5zIHdoZW4gdGhlIG5saW5rIGZpZWxkIG92ZXJmbG93cyB0aGUgb2xkIDE2LWJpdCB2YWx1ZQorICogb3Igd2hlbiBjaHByb2ogaXMgY2FsbGVkIHRvIGNoYW5nZSB0aGUgcHJvamVjdCBmb3IgdGhlIGZpcnN0IHRpbWUuCisgKiBBcyBhIHNpZGUgZWZmZWN0IHRoZSBzdXBlcmJsb2NrIHZlcnNpb24gd2lsbCBhbHNvIGdldCByZXYnZAorICogdG8gY29udGFpbiB0aGUgTkxJTksgYml0LgorICovCit2b2lkCit4ZnNfYnVtcF9pbm9fdmVyczIoCisJeGZzX3RyYW5zX3QJKnRwLAorCXhmc19pbm9kZV90CSppcCkKK3sKKwl4ZnNfbW91bnRfdAkqbXA7CisJdW5zaWduZWQgbG9uZwkJczsKKworCUFTU0VSVChpc21ybG9ja2VkICgmaXAtPmlfbG9jaywgTVJfVVBEQVRFKSk7CisJQVNTRVJUKGlwLT5pX2QuZGlfdmVyc2lvbiA9PSBYRlNfRElOT0RFX1ZFUlNJT05fMSk7CisKKwlpcC0+aV9kLmRpX3ZlcnNpb24gPSBYRlNfRElOT0RFX1ZFUlNJT05fMjsKKwlpcC0+aV9kLmRpX29ubGluayA9IDA7CisJbWVtc2V0KCYoaXAtPmlfZC5kaV9wYWRbMF0pLCAwLCBzaXplb2YoaXAtPmlfZC5kaV9wYWQpKTsKKwltcCA9IHRwLT50X21vdW50cDsKKwlpZiAoIVhGU19TQl9WRVJTSU9OX0hBU05MSU5LKCZtcC0+bV9zYikpIHsKKwkJcyA9IFhGU19TQl9MT0NLKG1wKTsKKwkJaWYgKCFYRlNfU0JfVkVSU0lPTl9IQVNOTElOSygmbXAtPm1fc2IpKSB7CisJCQlYRlNfU0JfVkVSU0lPTl9BREROTElOSygmbXAtPm1fc2IpOworCQkJWEZTX1NCX1VOTE9DSyhtcCwgcyk7CisJCQl4ZnNfbW9kX3NiKHRwLCBYRlNfU0JfVkVSU0lPTk5VTSk7CisJCX0gZWxzZSB7CisJCQlYRlNfU0JfVU5MT0NLKG1wLCBzKTsKKwkJfQorCX0KKwkvKiBDYWxsZXIgbXVzdCBsb2cgdGhlIGlub2RlICovCit9CisKKy8qCisgKiBJbmNyZW1lbnQgdGhlIGxpbmsgY291bnQgb24gYW4gaW5vZGUgJiBsb2cgdGhlIGNoYW5nZS4KKyAqLworaW50Cit4ZnNfYnVtcGxpbmsoCisJeGZzX3RyYW5zX3QgKnRwLAorCXhmc19pbm9kZV90ICppcCkKK3sKKwlpZiAoaXAtPmlfZC5kaV9ubGluayA+PSBYRlNfTUFYTElOSykKKwkJcmV0dXJuIFhGU19FUlJPUihFTUxJTkspOworCXhmc19pY2hndGltZShpcCwgWEZTX0lDSEdUSU1FX0NIRyk7CisKKwlBU1NFUlQoaXAtPmlfZC5kaV9ubGluayA+IDApOworCWlwLT5pX2QuZGlfbmxpbmsrKzsKKwlpZiAoKGlwLT5pX2QuZGlfdmVyc2lvbiA9PSBYRlNfRElOT0RFX1ZFUlNJT05fMSkgJiYKKwkgICAgKGlwLT5pX2QuZGlfbmxpbmsgPiBYRlNfTUFYTElOS18xKSkgeworCQkvKgorCQkgKiBUaGUgaW5vZGUgaGFzIGluY3JlYXNlZCBpdHMgbnVtYmVyIG9mIGxpbmtzIGJleW9uZAorCQkgKiB3aGF0IGNhbiBmaXQgaW4gYW4gb2xkIGZvcm1hdCBpbm9kZS4gIEl0IG5vdyBuZWVkcworCQkgKiB0byBiZSBjb252ZXJ0ZWQgdG8gYSB2ZXJzaW9uIDIgaW5vZGUgd2l0aCBhIDMyIGJpdAorCQkgKiBsaW5rIGNvdW50LiAgSWYgdGhpcyBpcyB0aGUgZmlyc3QgaW5vZGUgaW4gdGhlIGZpbGUKKwkJICogc3lzdGVtIHRvIGRvIHRoaXMsIHRoZW4gd2UgbmVlZCB0byBidW1wIHRoZSBzdXBlcmJsb2NrCisJCSAqIHZlcnNpb24gbnVtYmVyIGFzIHdlbGwuCisJCSAqLworCQl4ZnNfYnVtcF9pbm9fdmVyczIodHAsIGlwKTsKKwl9CisKKwl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUcnkgdG8gdHJ1bmNhdGUgdGhlIGdpdmVuIGZpbGUgdG8gMCBsZW5ndGguICBDdXJyZW50bHkgY2FsbGVkCisgKiBvbmx5IG91dCBvZiB4ZnNfcmVtb3ZlIHdoZW4gaXQgaGFzIHRvIHRydW5jYXRlIGEgZmlsZSB0byBmcmVlCisgKiB1cCBzcGFjZSBmb3IgdGhlIHJlbW92ZSB0byBwcm9jZWVkLgorICovCitpbnQKK3hmc190cnVuY2F0ZV9maWxlKAorCXhmc19tb3VudF90CSptcCwKKwl4ZnNfaW5vZGVfdAkqaXApCit7CisJeGZzX3RyYW5zX3QJKnRwOworCWludAkJZXJyb3I7CisKKyNpZmRlZiBRVU9UQURFQlVHCisJLyoKKwkgKiBUaGlzIGlzIGNhbGxlZCB0byB0cnVuY2F0ZSB0aGUgcXVvdGFpbm9kZXMgdG9vLgorCSAqLworCWlmIChYRlNfSVNfVVFVT1RBX09OKG1wKSkgeworCQlpZiAoaXAtPmlfaW5vICE9IG1wLT5tX3NiLnNiX3VxdW90aW5vKQorCQkJQVNTRVJUKGlwLT5pX3VkcXVvdCk7CisJfQorCWlmIChYRlNfSVNfR1FVT1RBX09OKG1wKSkgeworCQlpZiAoaXAtPmlfaW5vICE9IG1wLT5tX3NiLnNiX2dxdW90aW5vKQorCQkJQVNTRVJUKGlwLT5pX2dkcXVvdCk7CisJfQorI2VuZGlmCisJLyoKKwkgKiBNYWtlIHRoZSBjYWxsIHRvIHhmc19pdHJ1bmNhdGVfc3RhcnQgYmVmb3JlIHN0YXJ0aW5nIHRoZQorCSAqIHRyYW5zYWN0aW9uLCBiZWNhdXNlIHdlIGNhbm5vdCBtYWtlIHRoZSBjYWxsIHdoaWxlIHdlJ3JlCisJICogaW4gYSB0cmFuc2FjdGlvbi4KKwkgKi8KKwl4ZnNfaWxvY2soaXAsIFhGU19JT0xPQ0tfRVhDTCk7CisJeGZzX2l0cnVuY2F0ZV9zdGFydChpcCwgWEZTX0lUUlVOQ19ERUZJTklURSwgKHhmc19mc2l6ZV90KTApOworCisJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19UUlVOQ0FURV9GSUxFKTsKKwlpZiAoKGVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsIFhGU19JVFJVTkNBVEVfTE9HX1JFUyhtcCksIDAsCisJCQkJICAgICAgWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywKKwkJCQkgICAgICBYRlNfSVRSVU5DQVRFX0xPR19DT1VOVCkpKSB7CisJCXhmc190cmFuc19jYW5jZWwodHAsIDApOworCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lPTE9DS19FWENMKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCS8qCisJICogRm9sbG93IHRoZSBub3JtYWwgdHJ1bmNhdGUgbG9ja2luZyBwcm90b2NvbC4gIFNpbmNlIHdlCisJICogaG9sZCB0aGUgaW5vZGUgaW4gdGhlIHRyYW5zYWN0aW9uLCB3ZSBrbm93IHRoYXQgaXQncyBudW1iZXIKKwkgKiBvZiByZWZlcmVuY2VzIHdpbGwgc3RheSBjb25zdGFudC4KKwkgKi8KKwl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCBYRlNfSUxPQ0tfRVhDTCB8IFhGU19JT0xPQ0tfRVhDTCk7CisJeGZzX3RyYW5zX2lob2xkKHRwLCBpcCk7CisJLyoKKwkgKiBTaWduYWwgYSBzeW5jIHhhY3Rpb24uICBUaGUgb25seSBjYXNlIHdoZXJlIHRoYXQgaXNuJ3QKKwkgKiB0aGUgY2FzZSBpcyBpZiB3ZSdyZSB0cnVuY2F0aW5nIGFuIGFscmVhZHkgdW5saW5rZWQgZmlsZQorCSAqIG9uIGEgd3N5bmMgZnMuICBJbiB0aGF0IGNhc2UsIHdlIGtub3cgdGhlIGJsb2NrcyBjYW4ndAorCSAqIHJlYXBwZWFyIGluIHRoZSBmaWxlIGJlY2F1c2UgdGhlIGxpbmtzIHRvIGZpbGUgYXJlCisJICogcGVybWFuZW50bHkgdG9hc3QuICBDdXJyZW50bHksIHdlJ3JlIGFsd2F5cyBnb2luZyB0bworCSAqIHdhbnQgYSBzeW5jIHRyYW5zYWN0aW9uIGJlY2F1c2UgdGhpcyBjb2RlIGlzIGJlaW5nCisJICogY2FsbGVkIGZyb20gcGxhY2VzIHdoZXJlIG5saW5rIGlzIGd1YXJhbnRlZWQgdG8gYmUgMQorCSAqIGJ1dCBJJ20gbGVhdmluZyB0aGUgdGVzdHMgaW4gdG8gcHJvdGVjdCBhZ2FpbnN0IGZ1dHVyZQorCSAqIGNoYW5nZXMgLS0gcmNjLgorCSAqLworCWVycm9yID0geGZzX2l0cnVuY2F0ZV9maW5pc2goJnRwLCBpcCwgKHhmc19mc2l6ZV90KTAsCisJCQkJICAgICBYRlNfREFUQV9GT1JLLAorCQkJCSAgICAgKChpcC0+aV9kLmRpX25saW5rICE9IDAgfHwKKwkJCQkgICAgICAgIShtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9XU1lOQykpCisJCQkJICAgICAgPyAxIDogMCkpOworCWlmIChlcnJvcikgeworCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTIHwKKwkJCQkgWEZTX1RSQU5TX0FCT1JUKTsKKwl9IGVsc2UgeworCQl4ZnNfaWNoZ3RpbWUoaXAsIFhGU19JQ0hHVElNRV9NT0QgfCBYRlNfSUNIR1RJTUVfQ0hHKTsKKwkJZXJyb3IgPSB4ZnNfdHJhbnNfY29tbWl0KHRwLCBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTLAorCQkJCQkgTlVMTCk7CisJfQorCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCB8IFhGU19JT0xPQ0tfRVhDTCk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3V0aWxzLmggYi9mcy94ZnMveGZzX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFlZDZhNQotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfdXRpbHMuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdvdWxkIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKgorICogRnVydGhlciwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZCB3aXRob3V0IGFueSB3YXJyYW50eSB0aGF0IGl0IGlzCisgKiBmcmVlIG9mIHRoZSByaWdodGZ1bCBjbGFpbSBvZiBhbnkgdGhpcmQgcGVyc29uIHJlZ2FyZGluZyBpbmZyaW5nZW1lbnQKKyAqIG9yIHRoZSBsaWtlLiAgQW55IGxpY2Vuc2UgcHJvdmlkZWQgaGVyZWluLCB3aGV0aGVyIGltcGxpZWQgb3IKKyAqIG90aGVyd2lzZSwgYXBwbGllcyBvbmx5IHRvIHRoaXMgc29mdHdhcmUgZmlsZS4gIFBhdGVudCBsaWNlbnNlcywgaWYKKyAqIGFueSwgcHJvdmlkZWQgaGVyZWluIGRvIG5vdCBhcHBseSB0byBjb21iaW5hdGlvbnMgb2YgdGhpcyBwcm9ncmFtIHdpdGgKKyAqIG90aGVyIHNvZnR3YXJlLCBvciBhbnkgb3RoZXIgcHJvZHVjdCB3aGF0c29ldmVyLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OQorICogVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvbnRhY3QgaW5mb3JtYXRpb246IFNpbGljb24gR3JhcGhpY3MsIEluYy4sIDE2MDAgQW1waGl0aGVhdHJlIFBrd3ksCisgKiBNb3VudGFpbiBWaWV3LCBDQSAgOTQwNDMsIG9yOgorICoKKyAqIGh0dHA6Ly93d3cuc2dpLmNvbQorICoKKyAqIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGlzIG5vdGljZSwgc2VlOgorICoKKyAqIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9HZW5JbmZvL1NHSUdQTE5vdGljZUV4cGxhbi8KKyAqLworI2lmbmRlZiBfX1hGU19VVElMU19IX18KKyNkZWZpbmUgX19YRlNfVVRJTFNfSF9fCisKKyNkZWZpbmUgSVJFTEUoaXApCVZOX1JFTEUoWEZTX0lUT1YoaXApKQorI2RlZmluZSBJSE9MRChpcCkJVk5fSE9MRChYRlNfSVRPVihpcCkpCisjZGVmaW5lCUlUUkFDRShpcCkJdm5fdHJhY2VfcmVmKFhGU19JVE9WKGlwKSwgX19GSUxFX18sIF9fTElORV9fLCBcCisJCQkJKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpCisKK2V4dGVybiBpbnQgeGZzX3JlbmFtZSAoYmh2X2Rlc2NfdCAqLCB2bmFtZV90ICosIHZub2RlX3QgKiwgdm5hbWVfdCAqLCBjcmVkX3QgKik7CitleHRlcm4gaW50IHhmc19nZXRfZGlyX2VudHJ5ICh2bmFtZV90ICosIHhmc19pbm9kZV90ICoqKTsKK2V4dGVybiBpbnQgeGZzX2Rpcl9sb29rdXBfaW50IChiaHZfZGVzY190ICosIHVpbnQsIHZuYW1lX3QgKiwgeGZzX2lub190ICosCisJCQkJeGZzX2lub2RlX3QgKiopOworZXh0ZXJuIGludCB4ZnNfdHJ1bmNhdGVfZmlsZSAoeGZzX21vdW50X3QgKiwgeGZzX2lub2RlX3QgKik7CitleHRlcm4gaW50IHhmc19kaXJfaWFsbG9jICh4ZnNfdHJhbnNfdCAqKiwgeGZzX2lub2RlX3QgKiwgbW9kZV90LCBubGlua190LAorCQkJCXhmc19kZXZfdCwgY3JlZF90ICosIHByaWRfdCwgaW50LAorCQkJCXhmc19pbm9kZV90ICoqLCBpbnQgKik7CitleHRlcm4gaW50IHhmc19kcm9wbGluayAoeGZzX3RyYW5zX3QgKiwgeGZzX2lub2RlX3QgKik7CitleHRlcm4gaW50IHhmc19idW1wbGluayAoeGZzX3RyYW5zX3QgKiwgeGZzX2lub2RlX3QgKik7CitleHRlcm4gdm9pZCB4ZnNfYnVtcF9pbm9fdmVyczIgKHhmc190cmFuc190ICosIHhmc19pbm9kZV90ICopOworCisjZW5kaWYJLyogX19YRlNfVVRJTFNfSF9fICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3Zmc29wcy5jIGIvZnMveGZzL3hmc192ZnNvcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGFhZTljCi0tLSAvZGV2L251bGwKKysrIGIvZnMveGZzL3hmc192ZnNvcHMuYwpAQCAtMCwwICsxLDE5NDEgQEAKKy8qCisgKiBYRlMgZmlsZXN5c3RlbSBvcGVyYXRpb25zLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDA1IFNpbGljb24gR3JhcGhpY3MsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3b3VsZCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorICoKKyAqIEZ1cnRoZXIsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQgd2l0aG91dCBhbnkgd2FycmFudHkgdGhhdCBpdCBpcworICogZnJlZSBvZiB0aGUgcmlnaHRmdWwgY2xhaW0gb2YgYW55IHRoaXJkIHBlcnNvbiByZWdhcmRpbmcgaW5mcmluZ2VtZW50CisgKiBvciB0aGUgbGlrZS4gIEFueSBsaWNlbnNlIHByb3ZpZGVkIGhlcmVpbiwgd2hldGhlciBpbXBsaWVkIG9yCisgKiBvdGhlcndpc2UsIGFwcGxpZXMgb25seSB0byB0aGlzIHNvZnR3YXJlIGZpbGUuICBQYXRlbnQgbGljZW5zZXMsIGlmCisgKiBhbnksIHByb3ZpZGVkIGhlcmVpbiBkbyBub3QgYXBwbHkgdG8gY29tYmluYXRpb25zIG9mIHRoaXMgcHJvZ3JhbSB3aXRoCisgKiBvdGhlciBzb2Z0d2FyZSwgb3IgYW55IG90aGVyIHByb2R1Y3Qgd2hhdHNvZXZlci4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkKKyAqIFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb250YWN0IGluZm9ybWF0aW9uOiBTaWxpY29uIEdyYXBoaWNzLCBJbmMuLCAxNjAwIEFtcGhpdGhlYXRyZSBQa3d5LAorICogTW91bnRhaW4gVmlldywgQ0EgIDk0MDQzLCBvcjoKKyAqCisgKiBodHRwOi8vd3d3LnNnaS5jb20KKyAqCisgKiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhpcyBub3RpY2UsIHNlZToKKyAqCisgKiBodHRwOi8vb3NzLnNnaS5jb20vcHJvamVjdHMvR2VuSW5mby9TR0lHUExOb3RpY2VFeHBsYW4vCisgKi8KKworI2luY2x1ZGUgInhmcy5oIgorI2luY2x1ZGUgInhmc19tYWNyb3MuaCIKKyNpbmNsdWRlICJ4ZnNfdHlwZXMuaCIKKyNpbmNsdWRlICJ4ZnNfaW51bS5oIgorI2luY2x1ZGUgInhmc19sb2cuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnMuaCIKKyNpbmNsdWRlICJ4ZnNfc2IuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyLmgiCisjaW5jbHVkZSAieGZzX2RpcjIuaCIKKyNpbmNsdWRlICJ4ZnNfZG1hcGkuaCIKKyNpbmNsdWRlICJ4ZnNfbW91bnQuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcF9idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2NfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jLmgiCisjaW5jbHVkZSAieGZzX2F0dHJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX3NmLmgiCisjaW5jbHVkZSAieGZzX2RpcjJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlub2RlLmgiCisjaW5jbHVkZSAieGZzX2lub2RlX2l0ZW0uaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfYWcuaCIKKyNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKKyNpbmNsdWRlICJ4ZnNfYm1hcC5oIgorI2luY2x1ZGUgInhmc19kYV9idHJlZS5oIgorI2luY2x1ZGUgInhmc19ydy5oIgorI2luY2x1ZGUgInhmc19yZWZjYWNoZS5oIgorI2luY2x1ZGUgInhmc19idWZfaXRlbS5oIgorI2luY2x1ZGUgInhmc19leHRmcmVlX2l0ZW0uaCIKKyNpbmNsdWRlICJ4ZnNfcXVvdGEuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl90cmFjZS5oIgorI2luY2x1ZGUgInhmc19hY2wuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0ci5oIgorI2luY2x1ZGUgInhmc19jbG50LmgiCisjaW5jbHVkZSAieGZzX2xvZ19wcml2LmgiCisKK1NUQVRJQyBpbnQgeGZzX3N5bmMoYmh2X2Rlc2NfdCAqLCBpbnQsIGNyZWRfdCAqKTsKKworaW50Cit4ZnNfaW5pdCh2b2lkKQoreworCWV4dGVybiBrbWVtX3pvbmVfdAkqeGZzX2JtYXBfZnJlZV9pdGVtX3pvbmU7CisJZXh0ZXJuIGttZW1fem9uZV90CSp4ZnNfYnRyZWVfY3VyX3pvbmU7CisJZXh0ZXJuIGttZW1fem9uZV90CSp4ZnNfdHJhbnNfem9uZTsKKwlleHRlcm4ga21lbV96b25lX3QJKnhmc19idWZfaXRlbV96b25lOworCWV4dGVybiBrbWVtX3pvbmVfdAkqeGZzX2RhYnVmX3pvbmU7CisjaWZkZWYgWEZTX0RBQlVGX0RFQlVHCisJZXh0ZXJuIGxvY2tfdAkgICAgICAgIHhmc19kYWJ1Zl9nbG9iYWxfbG9jazsKKwlzcGlubG9ja19pbml0KCZ4ZnNfZGFidWZfZ2xvYmFsX2xvY2ssICJ4ZnNkYSIpOworI2VuZGlmCisKKwkvKgorCSAqIEluaXRpYWxpemUgYWxsIG9mIHRoZSB6b25lIGFsbG9jYXRvcnMgd2UgdXNlLgorCSAqLworCXhmc19ibWFwX2ZyZWVfaXRlbV96b25lID0ga21lbV96b25lX2luaXQoc2l6ZW9mKHhmc19ibWFwX2ZyZWVfaXRlbV90KSwKKwkJCQkJCSAieGZzX2JtYXBfZnJlZV9pdGVtIik7CisJeGZzX2J0cmVlX2N1cl96b25lID0ga21lbV96b25lX2luaXQoc2l6ZW9mKHhmc19idHJlZV9jdXJfdCksCisJCQkJCSAgICAieGZzX2J0cmVlX2N1ciIpOworCXhmc19pbm9kZV96b25lID0ga21lbV96b25lX2luaXQoc2l6ZW9mKHhmc19pbm9kZV90KSwgInhmc19pbm9kZSIpOworCXhmc190cmFuc196b25lID0ga21lbV96b25lX2luaXQoc2l6ZW9mKHhmc190cmFuc190KSwgInhmc190cmFucyIpOworCXhmc19kYV9zdGF0ZV96b25lID0KKwkJa21lbV96b25lX2luaXQoc2l6ZW9mKHhmc19kYV9zdGF0ZV90KSwgInhmc19kYV9zdGF0ZSIpOworCXhmc19kYWJ1Zl96b25lID0ga21lbV96b25lX2luaXQoc2l6ZW9mKHhmc19kYWJ1Zl90KSwgInhmc19kYWJ1ZiIpOworCisJLyoKKwkgKiBUaGUgc2l6ZSBvZiB0aGUgem9uZSBhbGxvY2F0ZWQgYnVmIGxvZyBpdGVtIGlzIHRoZSBtYXhpbXVtCisJICogc2l6ZSBwb3NzaWJsZSB1bmRlciBYRlMuICBUaGlzIHdhc3RlcyBhIGxpdHRsZSBiaXQgb2YgbWVtb3J5LAorCSAqIGJ1dCBpdCBpcyBtdWNoIGZhc3Rlci4KKwkgKi8KKwl4ZnNfYnVmX2l0ZW1fem9uZSA9CisJCWttZW1fem9uZV9pbml0KChzaXplb2YoeGZzX2J1Zl9sb2dfaXRlbV90KSArCisJCQkJKCgoWEZTX01BWF9CTE9DS1NJWkUgLyBYRlNfQkxJX0NIVU5LKSAvCisJCQkJICBOQldPUkQpICogc2l6ZW9mKGludCkpKSwKKwkJCSAgICAgICAieGZzX2J1Zl9pdGVtIik7CisJeGZzX2VmZF96b25lID0ga21lbV96b25lX2luaXQoKHNpemVvZih4ZnNfZWZkX2xvZ19pdGVtX3QpICsKKwkJCQkgICAgICAgKChYRlNfRUZEX01BWF9GQVNUX0VYVEVOVFMgLSAxKSAqIHNpemVvZih4ZnNfZXh0ZW50X3QpKSksCisJCQkJICAgICAgInhmc19lZmRfaXRlbSIpOworCXhmc19lZmlfem9uZSA9IGttZW1fem9uZV9pbml0KChzaXplb2YoeGZzX2VmaV9sb2dfaXRlbV90KSArCisJCQkJICAgICAgICgoWEZTX0VGSV9NQVhfRkFTVF9FWFRFTlRTIC0gMSkgKiBzaXplb2YoeGZzX2V4dGVudF90KSkpLAorCQkJCSAgICAgICJ4ZnNfZWZpX2l0ZW0iKTsKKwl4ZnNfaWZvcmtfem9uZSA9IGttZW1fem9uZV9pbml0KHNpemVvZih4ZnNfaWZvcmtfdCksICJ4ZnNfaWZvcmsiKTsKKwl4ZnNfaWxpX3pvbmUgPSBrbWVtX3pvbmVfaW5pdChzaXplb2YoeGZzX2lub2RlX2xvZ19pdGVtX3QpLCAieGZzX2lsaSIpOworCXhmc19jaGFzaGxpc3Rfem9uZSA9IGttZW1fem9uZV9pbml0KHNpemVvZih4ZnNfY2hhc2hsaXN0X3QpLAorCQkJCQkgICAgInhmc19jaGFzaGxpc3QiKTsKKwl4ZnNfYWNsX3pvbmVfaW5pdCh4ZnNfYWNsX3pvbmUsICJ4ZnNfYWNsIik7CisKKwkvKgorCSAqIEFsbG9jYXRlIGdsb2JhbCB0cmFjZSBidWZmZXJzLgorCSAqLworI2lmZGVmIFhGU19BTExPQ19UUkFDRQorCXhmc19hbGxvY190cmFjZV9idWYgPSBrdHJhY2VfYWxsb2MoWEZTX0FMTE9DX1RSQUNFX1NJWkUsIEtNX1NMRUVQKTsKKyNlbmRpZgorI2lmZGVmIFhGU19CTUFQX1RSQUNFCisJeGZzX2JtYXBfdHJhY2VfYnVmID0ga3RyYWNlX2FsbG9jKFhGU19CTUFQX1RSQUNFX1NJWkUsIEtNX1NMRUVQKTsKKyNlbmRpZgorI2lmZGVmIFhGU19CTUJUX1RSQUNFCisJeGZzX2JtYnRfdHJhY2VfYnVmID0ga3RyYWNlX2FsbG9jKFhGU19CTUJUX1RSQUNFX1NJWkUsIEtNX1NMRUVQKTsKKyNlbmRpZgorI2lmZGVmIFhGU19ESVJfVFJBQ0UKKwl4ZnNfZGlyX3RyYWNlX2J1ZiA9IGt0cmFjZV9hbGxvYyhYRlNfRElSX1RSQUNFX1NJWkUsIEtNX1NMRUVQKTsKKyNlbmRpZgorI2lmZGVmIFhGU19BVFRSX1RSQUNFCisJeGZzX2F0dHJfdHJhY2VfYnVmID0ga3RyYWNlX2FsbG9jKFhGU19BVFRSX1RSQUNFX1NJWkUsIEtNX1NMRUVQKTsKKyNlbmRpZgorI2lmZGVmIFhGU19ESVIyX1RSQUNFCisJeGZzX2RpcjJfdHJhY2VfYnVmID0ga3RyYWNlX2FsbG9jKFhGU19ESVIyX0dUUkFDRV9TSVpFLCBLTV9TTEVFUCk7CisjZW5kaWYKKworCXhmc19kaXJfc3RhcnR1cCgpOworCisjaWYgKGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoSU5EVUNFX0lPX0VSUk9SKSkKKwl4ZnNfZXJyb3JfdGVzdF9pbml0KCk7CisjZW5kaWYgLyogREVCVUcgfHwgSU5EVUNFX0lPX0VSUk9SICovCisKKwl4ZnNfaW5pdF9wcm9jZnMoKTsKKwl4ZnNfc3lzY3RsX3JlZ2lzdGVyKCk7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK3hmc19jbGVhbnVwKHZvaWQpCit7CisJZXh0ZXJuIGttZW1fem9uZV90CSp4ZnNfYm1hcF9mcmVlX2l0ZW1fem9uZTsKKwlleHRlcm4ga21lbV96b25lX3QJKnhmc19idHJlZV9jdXJfem9uZTsKKwlleHRlcm4ga21lbV96b25lX3QJKnhmc19pbm9kZV96b25lOworCWV4dGVybiBrbWVtX3pvbmVfdAkqeGZzX3RyYW5zX3pvbmU7CisJZXh0ZXJuIGttZW1fem9uZV90CSp4ZnNfZGFfc3RhdGVfem9uZTsKKwlleHRlcm4ga21lbV96b25lX3QJKnhmc19kYWJ1Zl96b25lOworCWV4dGVybiBrbWVtX3pvbmVfdAkqeGZzX2VmZF96b25lOworCWV4dGVybiBrbWVtX3pvbmVfdAkqeGZzX2VmaV96b25lOworCWV4dGVybiBrbWVtX3pvbmVfdAkqeGZzX2J1Zl9pdGVtX3pvbmU7CisJZXh0ZXJuIGttZW1fem9uZV90CSp4ZnNfY2hhc2hsaXN0X3pvbmU7CisKKwl4ZnNfY2xlYW51cF9wcm9jZnMoKTsKKwl4ZnNfc3lzY3RsX3VucmVnaXN0ZXIoKTsKKwl4ZnNfcmVmY2FjaGVfZGVzdHJveSgpOworCXhmc19hY2xfem9uZV9kZXN0cm95KHhmc19hY2xfem9uZSk7CisKKyNpZmRlZiBYRlNfRElSMl9UUkFDRQorCWt0cmFjZV9mcmVlKHhmc19kaXIyX3RyYWNlX2J1Zik7CisjZW5kaWYKKyNpZmRlZiBYRlNfQVRUUl9UUkFDRQorCWt0cmFjZV9mcmVlKHhmc19hdHRyX3RyYWNlX2J1Zik7CisjZW5kaWYKKyNpZmRlZiBYRlNfRElSX1RSQUNFCisJa3RyYWNlX2ZyZWUoeGZzX2Rpcl90cmFjZV9idWYpOworI2VuZGlmCisjaWZkZWYgWEZTX0JNQlRfVFJBQ0UKKwlrdHJhY2VfZnJlZSh4ZnNfYm1idF90cmFjZV9idWYpOworI2VuZGlmCisjaWZkZWYgWEZTX0JNQVBfVFJBQ0UKKwlrdHJhY2VfZnJlZSh4ZnNfYm1hcF90cmFjZV9idWYpOworI2VuZGlmCisjaWZkZWYgWEZTX0FMTE9DX1RSQUNFCisJa3RyYWNlX2ZyZWUoeGZzX2FsbG9jX3RyYWNlX2J1Zik7CisjZW5kaWYKKworCWttZW1fY2FjaGVfZGVzdHJveSh4ZnNfYm1hcF9mcmVlX2l0ZW1fem9uZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KHhmc19idHJlZV9jdXJfem9uZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KHhmc19pbm9kZV96b25lKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koeGZzX3RyYW5zX3pvbmUpOworCWttZW1fY2FjaGVfZGVzdHJveSh4ZnNfZGFfc3RhdGVfem9uZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KHhmc19kYWJ1Zl96b25lKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koeGZzX2J1Zl9pdGVtX3pvbmUpOworCWttZW1fY2FjaGVfZGVzdHJveSh4ZnNfZWZkX3pvbmUpOworCWttZW1fY2FjaGVfZGVzdHJveSh4ZnNfZWZpX3pvbmUpOworCWttZW1fY2FjaGVfZGVzdHJveSh4ZnNfaWZvcmtfem9uZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KHhmc19pbGlfem9uZSk7CisJa21lbV9jYWNoZV9kZXN0cm95KHhmc19jaGFzaGxpc3Rfem9uZSk7Cit9CisKKy8qCisgKiB4ZnNfc3RhcnRfZmxhZ3MKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGZpbGxzIGluIHhmc19tb3VudF90IGZpZWxkcyBiYXNlZCBvbiBtb3VudCBhcmdzLgorICogTm90ZTogdGhlIHN1cGVyYmxvY2sgaGFzIF9ub3RfIHlldCBiZWVuIHJlYWQgaW4uCisgKi8KK1NUQVRJQyBpbnQKK3hmc19zdGFydF9mbGFncygKKwlzdHJ1Y3QgdmZzCQkqdmZzLAorCXN0cnVjdCB4ZnNfbW91bnRfYXJncwkqYXAsCisJc3RydWN0IHhmc19tb3VudAkqbXApCit7CisJLyogVmFsdWVzIGFyZSBpbiBCQnMgKi8KKwlpZiAoKGFwLT5mbGFncyAmIFhGU01OVF9OT0FMSUdOKSAhPSBYRlNNTlRfTk9BTElHTikgeworCQkvKgorCQkgKiBBdCB0aGlzIHBvaW50IHRoZSBzdXBlcmJsb2NrIGhhcyBub3QgYmVlbiByZWFkCisJCSAqIGluLCB0aGVyZWZvcmUgd2UgZG8gbm90IGtub3cgdGhlIGJsb2NrIHNpemUuCisJCSAqIEJlZm9yZSB0aGUgbW91bnQgY2FsbCBlbmRzIHdlIHdpbGwgY29udmVydAorCQkgKiB0aGVzZSB0byBGU0JzLgorCQkgKi8KKwkJbXAtPm1fZGFsaWduID0gYXAtPnN1bml0OworCQltcC0+bV9zd2lkdGggPSBhcC0+c3dpZHRoOworCX0KKworCWlmIChhcC0+bG9nYnVmcyAhPSAtMSAmJgorI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoWExPR19OT0xPRykKKwkgICAgYXAtPmxvZ2J1ZnMgIT0gMCAmJgorI2VuZGlmCisJICAgIChhcC0+bG9nYnVmcyA8IFhMT0dfTUlOX0lDTE9HUyB8fAorCSAgICAgYXAtPmxvZ2J1ZnMgPiBYTE9HX01BWF9JQ0xPR1MpKSB7CisJCWNtbl9lcnIoQ0VfV0FSTiwKKwkJCSJYRlM6IGludmFsaWQgbG9nYnVmcyB2YWx1ZTogJWQgW25vdCAlZC0lZF0iLAorCQkJYXAtPmxvZ2J1ZnMsIFhMT0dfTUlOX0lDTE9HUywgWExPR19NQVhfSUNMT0dTKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCX0KKwltcC0+bV9sb2didWZzID0gYXAtPmxvZ2J1ZnM7CisJaWYgKGFwLT5sb2didWZzaXplICE9IC0xICYmCisJICAgIGFwLT5sb2didWZzaXplICE9IDE2ICogMTAyNCAmJgorCSAgICBhcC0+bG9nYnVmc2l6ZSAhPSAzMiAqIDEwMjQgJiYKKwkgICAgYXAtPmxvZ2J1ZnNpemUgIT0gNjQgKiAxMDI0ICYmCisJICAgIGFwLT5sb2didWZzaXplICE9IDEyOCAqIDEwMjQgJiYKKwkgICAgYXAtPmxvZ2J1ZnNpemUgIT0gMjU2ICogMTAyNCkgeworCQljbW5fZXJyKENFX1dBUk4sCisJIlhGUzogaW52YWxpZCBsb2didWZzaXplOiAlZCBbbm90IDE2aywzMmssNjRrLDEyOGsgb3IgMjU2a10iLAorCQkJYXAtPmxvZ2J1ZnNpemUpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisJfQorCW1wLT5tX2loc2l6ZSA9IGFwLT5paGFzaHNpemU7CisJbXAtPm1fbG9nYnNpemUgPSBhcC0+bG9nYnVmc2l6ZTsKKwltcC0+bV9mc25hbWVfbGVuID0gc3RybGVuKGFwLT5mc25hbWUpICsgMTsKKwltcC0+bV9mc25hbWUgPSBrbWVtX2FsbG9jKG1wLT5tX2ZzbmFtZV9sZW4sIEtNX1NMRUVQKTsKKwlzdHJjcHkobXAtPm1fZnNuYW1lLCBhcC0+ZnNuYW1lKTsKKworCWlmIChhcC0+ZmxhZ3MgJiBYRlNNTlRfV1NZTkMpCisJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9XU1lOQzsKKyNpZiBYRlNfQklHX0lOVU1TCisJaWYgKGFwLT5mbGFncyAmIFhGU01OVF9JTk82NCkgeworCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfSU5PNjQ7CisJCW1wLT5tX2lub2FkZCA9IFhGU19JTk82NF9PRkZTRVQ7CisJfQorI2VuZGlmCisJaWYgKGFwLT5mbGFncyAmIFhGU01OVF9OT0FUSU1FKQorCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfTk9BVElNRTsKKworCWlmIChhcC0+ZmxhZ3MgJiBYRlNNTlRfUkVURVJSKQorCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfUkVURVJSOworCisJaWYgKGFwLT5mbGFncyAmIFhGU01OVF9OT0FMSUdOKQorCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfTk9BTElHTjsKKworCWlmIChhcC0+ZmxhZ3MgJiBYRlNNTlRfU1dBTExPQykKKwkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX1NXQUxMT0M7CisKKwlpZiAoYXAtPmZsYWdzICYgWEZTTU5UX09TWU5DSVNPU1lOQykKKwkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX09TWU5DSVNPU1lOQzsKKworCWlmIChhcC0+ZmxhZ3MgJiBYRlNNTlRfMzJCSVRJTk9ERVMpCisJCW1wLT5tX2ZsYWdzIHw9IChYRlNfTU9VTlRfMzJCSVRJTk9ERVMgfCBYRlNfTU9VTlRfMzJCSVRJTk9PUFQpOworCisJaWYgKGFwLT5mbGFncyAmIFhGU01OVF9JT1NJWkUpIHsKKwkJaWYgKGFwLT5pb3NpemVsb2cgPiBYRlNfTUFYX0lPX0xPRyB8fAorCQkgICAgYXAtPmlvc2l6ZWxvZyA8IFhGU19NSU5fSU9fTE9HKSB7CisJCQljbW5fZXJyKENFX1dBUk4sCisJCSJYRlM6IGludmFsaWQgbG9nIGlvc2l6ZTogJWQgW25vdCAlZC0lZF0iLAorCQkJCWFwLT5pb3NpemVsb2csIFhGU19NSU5fSU9fTE9HLAorCQkJCVhGU19NQVhfSU9fTE9HKTsKKwkJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKwkJfQorCisJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9ERkxUX0lPU0laRTsKKwkJbXAtPm1fcmVhZGlvX2xvZyA9IG1wLT5tX3dyaXRlaW9fbG9nID0gYXAtPmlvc2l6ZWxvZzsKKwl9CisKKwlpZiAoYXAtPmZsYWdzICYgWEZTTU5UX0lIQVNIU0laRSkKKwkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX0lIQVNIU0laRTsKKworCWlmIChhcC0+ZmxhZ3MgJiBYRlNNTlRfSURFTEVURSkKKwkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX0lERUxFVEU7CisKKwlpZiAoYXAtPmZsYWdzICYgWEZTTU5UX0RJUlNZTkMpCisJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9ESVJTWU5DOworCisJLyoKKwkgKiBubyByZWNvdmVyeSBmbGFnIHJlcXVpcmVzIGEgcmVhZC1vbmx5IG1vdW50CisJICovCisJaWYgKGFwLT5mbGFncyAmIFhGU01OVF9OT1JFQ09WRVJZKSB7CisJCWlmICghKHZmcy0+dmZzX2ZsYWcgJiBWRlNfUkRPTkxZKSkgeworCQkJY21uX2VycihDRV9XQVJOLAorCSJYRlM6IHRyaWVkIHRvIG1vdW50IGEgRlMgcmVhZC13cml0ZSB3aXRob3V0IHJlY292ZXJ5ISIpOworCQkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCQl9CisJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9OT1JFQ09WRVJZOworCX0KKworCWlmIChhcC0+ZmxhZ3MgJiBYRlNNTlRfTk9VVUlEKQorCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfTk9VVUlEOworCWlmIChhcC0+ZmxhZ3MgJiBYRlNNTlRfTk9MT0dGTFVTSCkKKwkJbXAtPm1fZmxhZ3MgfD0gWEZTX01PVU5UX05PTE9HRkxVU0g7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZmlsbHMgaW4geGZzX21vdW50X3QgZmllbGRzIGJhc2VkIG9uIG1vdW50IGFyZ3MuCisgKiBOb3RlOiB0aGUgc3VwZXJibG9jayBfaGFzXyBub3cgYmVlbiByZWFkIGluLgorICovCitTVEFUSUMgaW50Cit4ZnNfZmluaXNoX2ZsYWdzKAorCXN0cnVjdCB2ZnMJCSp2ZnMsCisJc3RydWN0IHhmc19tb3VudF9hcmdzCSphcCwKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCkKK3sKKwlpbnQJCQlyb25seSA9ICh2ZnMtPnZmc19mbGFnICYgVkZTX1JET05MWSk7CisKKwkvKiBGYWlsIGEgbW91bnQgd2hlcmUgdGhlIGxvZ2J1ZiBpcyBzbWFsbGVyIHRoZW4gdGhlIGxvZyBzdHJpcGUgKi8KKwlpZiAoWEZTX1NCX1ZFUlNJT05fSEFTTE9HVjIoJm1wLT5tX3NiKSkgeworCQlpZiAoKGFwLT5sb2didWZzaXplID09IC0xKSAmJgorCQkgICAgKG1wLT5tX3NiLnNiX2xvZ3N1bml0ID4gWExPR19CSUdfUkVDT1JEX0JTSVpFKSkgeworCQkJbXAtPm1fbG9nYnNpemUgPSBtcC0+bV9zYi5zYl9sb2dzdW5pdDsKKwkJfSBlbHNlIGlmIChhcC0+bG9nYnVmc2l6ZSA8IG1wLT5tX3NiLnNiX2xvZ3N1bml0KSB7CisJCQljbW5fZXJyKENFX1dBUk4sCisJIlhGUzogbG9nYnVmIHNpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gbG9nIHN0cmlwZSBzaXplIik7CisJCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBGYWlsIGEgbW91bnQgaWYgdGhlIGxvZ2J1ZiBpcyBsYXJnZXIgdGhhbiAzMksgKi8KKwkJaWYgKGFwLT5sb2didWZzaXplID4gWExPR19CSUdfUkVDT1JEX0JTSVpFKSB7CisJCQljbW5fZXJyKENFX1dBUk4sCisJIlhGUzogbG9nYnVmIHNpemUgZm9yIHZlcnNpb24gMSBsb2dzIG11c3QgYmUgMTZLIG9yIDMySyIpOworCQkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCQl9CisJfQorCisJLyoKKwkgKiBwcm9oaWJpdCByL3cgbW91bnRzIG9mIHJlYWQtb25seSBmaWxlc3lzdGVtcworCSAqLworCWlmICgobXAtPm1fc2Iuc2JfZmxhZ3MgJiBYRlNfU0JGX1JFQURPTkxZKSAmJiAhcm9ubHkpIHsKKwkJY21uX2VycihDRV9XQVJOLAorCSJYRlM6IGNhbm5vdCBtb3VudCBhIHJlYWQtb25seSBmaWxlc3lzdGVtIGFzIHJlYWQtd3JpdGUiKTsKKwkJcmV0dXJuIFhGU19FUlJPUihFUk9GUyk7CisJfQorCisJLyoKKwkgKiBkaXNhbGxvdyBtb3VudCBhdHRlbXB0cyB3aXRoIChJUklYKSBwcm9qZWN0IHF1b3RhIGVuYWJsZWQKKwkgKi8KKwlpZiAoWEZTX1NCX1ZFUlNJT05fSEFTUVVPVEEoJm1wLT5tX3NiKSAmJgorCSAgICAobXAtPm1fc2Iuc2JfcWZsYWdzICYgWEZTX1BRVU9UQV9BQ0NUKSkgeworCQljbW5fZXJyKENFX1dBUk4sCisJIlhGUzogY2Fubm90IG1vdW50IGEgZmlsZXN5c3RlbSB3aXRoIElSSVggcHJvamVjdCBxdW90YSBlbmFibGVkIik7CisJCXJldHVybiBYRlNfRVJST1IoRU5PU1lTKTsKKwl9CisKKwkvKgorCSAqIGNoZWNrIGZvciBzaGFyZWQgbW91bnQuCisJICovCisJaWYgKGFwLT5mbGFncyAmIFhGU01OVF9TSEFSRUQpIHsKKwkJaWYgKCFYRlNfU0JfVkVSU0lPTl9IQVNTSEFSRUQoJm1wLT5tX3NiKSkKKwkJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKworCQkvKgorCQkgKiBGb3IgSVJJWCA2LjUsIHNoYXJlZCBtb3VudHMgbXVzdCBoYXZlIHRoZSBzaGFyZWQKKwkJICogdmVyc2lvbiBiaXQgc2V0LCBoYXZlIHRoZSBwZXJzaXN0ZW50IHJlYWRvbmx5CisJCSAqIGZpZWxkIHNldCwgbXVzdCBiZSB2ZXJzaW9uIDAgYW5kIGNhbiBvbmx5IGJlIG1vdW50ZWQKKwkJICogcmVhZC1vbmx5LgorCQkgKi8KKwkJaWYgKCFyb25seSB8fCAhKG1wLT5tX3NiLnNiX2ZsYWdzICYgWEZTX1NCRl9SRUFET05MWSkgfHwKKwkJICAgICAobXAtPm1fc2Iuc2Jfc2hhcmVkX3ZuICE9IDApKQorCQkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCisJCW1wLT5tX2ZsYWdzIHw9IFhGU19NT1VOVF9TSEFSRUQ7CisKKwkJLyoKKwkJICogU2hhcmVkIFhGUyBWMCBjYW4ndCBkZWFsIHdpdGggRE1JLiAgUmV0dXJuIEVJTlZBTC4KKwkJICovCisJCWlmIChtcC0+bV9zYi5zYl9zaGFyZWRfdm4gPT0gMCAmJiAoYXAtPmZsYWdzICYgWEZTTU5UX0RNQVBJKSkKKwkJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHhmc19tb3VudAorICoKKyAqIFRoZSBmaWxlIHN5c3RlbSBjb25maWd1cmF0aW9ucyBhcmU6CisgKgkoMSkgZGV2aWNlIChwYXJ0aXRpb24pIHdpdGggZGF0YSBhbmQgaW50ZXJuYWwgbG9nCisgKgkoMikgbG9naWNhbCB2b2x1bWUgd2l0aCBkYXRhIGFuZCBsb2cgc3Vidm9sdW1lcy4KKyAqCSgzKSBsb2dpY2FsIHZvbHVtZSB3aXRoIGRhdGEsIGxvZywgYW5kIHJlYWx0aW1lIHN1YnZvbHVtZXMuCisgKgorICogV2Ugb25seSBoYXZlIHRvIGhhbmRsZSBvcGVuaW5nIHRoZSBsb2cgYW5kIHJlYWx0aW1lIHZvbHVtZXMgaGVyZSBpZgorICogdGhleSBhcmUgcHJlc2VudC4gIFRoZSBkYXRhIHN1YnZvbHVtZSBoYXMgYWxyZWFkeSBiZWVuIG9wZW5lZCBieQorICogZ2V0X3NiX2JkZXYoKSBhbmQgaXMgc3RvcmVkIGluIHZmc3AtPnZmc19zdXBlci0+c19iZGV2LgorICovCitTVEFUSUMgaW50Cit4ZnNfbW91bnQoCisJc3RydWN0IGJodl9kZXNjCQkqYmh2cCwKKwlzdHJ1Y3QgeGZzX21vdW50X2FyZ3MJKmFyZ3MsCisJY3JlZF90CQkJKmNyZWRwKQoreworCXN0cnVjdCB2ZnMJCSp2ZnNwID0gYmh2dG92ZnMoYmh2cCk7CisJc3RydWN0IGJodl9kZXNjCQkqcDsKKwlzdHJ1Y3QgeGZzX21vdW50CSptcCA9IFhGU19CSFZUT00oYmh2cCk7CisJc3RydWN0IGJsb2NrX2RldmljZQkqZGRldiwgKmxvZ2RldiwgKnJ0ZGV2OworCWludAkJCWZsYWdzID0gMCwgZXJyb3I7CisKKwlkZGV2ID0gdmZzcC0+dmZzX3N1cGVyLT5zX2JkZXY7CisJbG9nZGV2ID0gcnRkZXYgPSBOVUxMOworCisJLyoKKwkgKiBTZXR1cCB4ZnNfbW91bnQgZnVuY3Rpb24gdmVjdG9ycyBmcm9tIGF2YWlsYWJsZSBiZWhhdmlvcnMKKwkgKi8KKwlwID0gdmZzX2Jodl9sb29rdXAodmZzcCwgVkZTX1BPU0lUSU9OX0RNKTsKKwltcC0+bV9kbV9vcHMgPSBwID8gKih4ZnNfZG1vcHNfdCAqKSB2ZnNfYmh2X2N1c3RvbShwKSA6IHhmc19kbWNvcmVfc3R1YjsKKwlwID0gdmZzX2Jodl9sb29rdXAodmZzcCwgVkZTX1BPU0lUSU9OX1FNKTsKKwltcC0+bV9xbV9vcHMgPSBwID8gKih4ZnNfcW1vcHNfdCAqKSB2ZnNfYmh2X2N1c3RvbShwKSA6IHhmc19xbWNvcmVfc3R1YjsKKwlwID0gdmZzX2Jodl9sb29rdXAodmZzcCwgVkZTX1BPU0lUSU9OX0lPKTsKKwltcC0+bV9pb19vcHMgPSBwID8gKih4ZnNfaW9vcHNfdCAqKSB2ZnNfYmh2X2N1c3RvbShwKSA6IHhmc19pb2NvcmVfeGZzOworCisJLyoKKwkgKiBPcGVuIHJlYWwgdGltZSBhbmQgbG9nIGRldmljZXMgLSBvcmRlciBpcyBpbXBvcnRhbnQuCisJICovCisJaWYgKGFyZ3MtPmxvZ25hbWVbMF0pIHsKKwkJZXJyb3IgPSB4ZnNfYmxrZGV2X2dldChtcCwgYXJncy0+bG9nbmFtZSwgJmxvZ2Rldik7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwl9CisJaWYgKGFyZ3MtPnJ0bmFtZVswXSkgeworCQllcnJvciA9IHhmc19ibGtkZXZfZ2V0KG1wLCBhcmdzLT5ydG5hbWUsICZydGRldik7CisJCWlmIChlcnJvcikgeworCQkJeGZzX2Jsa2Rldl9wdXQobG9nZGV2KTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCisJCWlmIChydGRldiA9PSBkZGV2IHx8IHJ0ZGV2ID09IGxvZ2RldikgeworCQkJY21uX2VycihDRV9XQVJOLAorCSJYRlM6IENhbm5vdCBtb3VudCBmaWxlc3lzdGVtIHdpdGggaWRlbnRpY2FsIHJ0ZGV2IGFuZCBkZGV2L2xvZ2Rldi4iKTsKKwkJCXhmc19ibGtkZXZfcHV0KGxvZ2Rldik7CisJCQl4ZnNfYmxrZGV2X3B1dChydGRldik7CisJCQlyZXR1cm4gRUlOVkFMOworCQl9CisJfQorCisJLyoKKwkgKiBTZXR1cCB4ZnNfbW91bnQgYnVmZmVyIHRhcmdldCBwb2ludGVycworCSAqLworCWVycm9yID0gRU5PTUVNOworCW1wLT5tX2RkZXZfdGFyZ3AgPSB4ZnNfYWxsb2NfYnVmdGFyZyhkZGV2LCAwKTsKKwlpZiAoIW1wLT5tX2RkZXZfdGFyZ3ApIHsKKwkJeGZzX2Jsa2Rldl9wdXQobG9nZGV2KTsKKwkJeGZzX2Jsa2Rldl9wdXQocnRkZXYpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCWlmIChydGRldikgeworCQltcC0+bV9ydGRldl90YXJncCA9IHhmc19hbGxvY19idWZ0YXJnKHJ0ZGV2LCAxKTsKKwkJaWYgKCFtcC0+bV9ydGRldl90YXJncCkKKwkJCWdvdG8gZXJyb3IwOworCX0KKwltcC0+bV9sb2dkZXZfdGFyZ3AgPSAobG9nZGV2ICYmIGxvZ2RldiAhPSBkZGV2KSA/CisJCQkJeGZzX2FsbG9jX2J1ZnRhcmcobG9nZGV2LCAxKSA6IG1wLT5tX2RkZXZfdGFyZ3A7CisJaWYgKCFtcC0+bV9sb2dkZXZfdGFyZ3ApCisJCWdvdG8gZXJyb3IwOworCisJLyoKKwkgKiBTZXR1cCBmbGFncyBiYXNlZCBvbiBtb3VudCgyKSBvcHRpb25zIGFuZCB0aGVuIHRoZSBzdXBlcmJsb2NrCisJICovCisJZXJyb3IgPSB4ZnNfc3RhcnRfZmxhZ3ModmZzcCwgYXJncywgbXApOworCWlmIChlcnJvcikKKwkJZ290byBlcnJvcjE7CisJZXJyb3IgPSB4ZnNfcmVhZHNiKG1wKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gZXJyb3IxOworCWVycm9yID0geGZzX2ZpbmlzaF9mbGFncyh2ZnNwLCBhcmdzLCBtcCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycm9yMjsKKworCS8qCisJICogU2V0dXAgeGZzX21vdW50IGJ1ZmZlciB0YXJnZXQgcG9pbnRlcnMgYmFzZWQgb24gc3VwZXJibG9jaworCSAqLworCWVycm9yID0geGZzX3NldHNpemVfYnVmdGFyZyhtcC0+bV9kZGV2X3RhcmdwLCBtcC0+bV9zYi5zYl9ibG9ja3NpemUsCisJCQkJICAgIG1wLT5tX3NiLnNiX3NlY3RzaXplKTsKKwlpZiAoIWVycm9yICYmIGxvZ2RldiAmJiBsb2dkZXYgIT0gZGRldikgeworCQl1bnNpZ25lZCBpbnQJbG9nX3NlY3Rvcl9zaXplID0gQkJTSVpFOworCisJCWlmIChYRlNfU0JfVkVSU0lPTl9IQVNTRUNUT1IoJm1wLT5tX3NiKSkKKwkJCWxvZ19zZWN0b3Jfc2l6ZSA9IG1wLT5tX3NiLnNiX2xvZ3NlY3RzaXplOworCQllcnJvciA9IHhmc19zZXRzaXplX2J1ZnRhcmcobXAtPm1fbG9nZGV2X3RhcmdwLAorCQkJCQkgICAgbXAtPm1fc2Iuc2JfYmxvY2tzaXplLAorCQkJCQkgICAgbG9nX3NlY3Rvcl9zaXplKTsKKwl9CisJaWYgKCFlcnJvciAmJiBydGRldikKKwkJZXJyb3IgPSB4ZnNfc2V0c2l6ZV9idWZ0YXJnKG1wLT5tX3J0ZGV2X3RhcmdwLAorCQkJCQkgICAgbXAtPm1fc2Iuc2JfYmxvY2tzaXplLAorCQkJCQkgICAgbXAtPm1fc2Iuc2Jfc2VjdHNpemUpOworCWlmIChlcnJvcikKKwkJZ290byBlcnJvcjI7CisKKwllcnJvciA9IFhGU19JT0lOSVQodmZzcCwgYXJncywgZmxhZ3MpOworCWlmICghZXJyb3IpCisJCXJldHVybiAwOworZXJyb3IyOgorCWlmIChtcC0+bV9zYl9icCkKKwkJeGZzX2ZyZWVzYihtcCk7CitlcnJvcjE6CisJeGZzX2JpbnZhbChtcC0+bV9kZGV2X3RhcmdwKTsKKwlpZiAobG9nZGV2ICYmIGxvZ2RldiAhPSBkZGV2KQorCQl4ZnNfYmludmFsKG1wLT5tX2xvZ2Rldl90YXJncCk7CisJaWYgKHJ0ZGV2KQorCQl4ZnNfYmludmFsKG1wLT5tX3J0ZGV2X3RhcmdwKTsKK2Vycm9yMDoKKwl4ZnNfdW5tb3VudGZzX2Nsb3NlKG1wLCBjcmVkcCk7CisJcmV0dXJuIGVycm9yOworfQorCitTVEFUSUMgaW50Cit4ZnNfdW5tb3VudCgKKwliaHZfZGVzY190CSpiZHAsCisJaW50CQlmbGFncywKKwljcmVkX3QJCSpjcmVkcCkKK3sKKwlzdHJ1Y3QgdmZzCSp2ZnNwID0gYmh2dG92ZnMoYmRwKTsKKwl4ZnNfbW91bnRfdAkqbXAgPSBYRlNfQkhWVE9NKGJkcCk7CisJeGZzX2lub2RlX3QJKnJpcDsKKwl2bm9kZV90CQkqcnZwOworCWludAkJdW5tb3VudF9ldmVudF93YW50ZWQgPSAwOworCWludAkJdW5tb3VudF9ldmVudF9mbGFncyA9IDA7CisJaW50CQl4ZnNfdW5tb3VudGZzX25lZWRlZCA9IDA7CisJaW50CQllcnJvcjsKKworCXJpcCA9IG1wLT5tX3Jvb3RpcDsKKwlydnAgPSBYRlNfSVRPVihyaXApOworCisJaWYgKHZmc3AtPnZmc19mbGFnICYgVkZTX0RNSSkgeworCQllcnJvciA9IFhGU19TRU5EX1BSRVVOTU9VTlQobXAsIHZmc3AsCisJCQkJcnZwLCBETV9SSUdIVF9OVUxMLCBydnAsIERNX1JJR0hUX05VTEwsCisJCQkJTlVMTCwgTlVMTCwgMCwgMCwKKwkJCQkobXAtPm1fZG1ldm1hc2sgJiAoMTw8RE1fRVZFTlRfUFJFVU5NT1VOVCkpPworCQkJCQkwOkRNX0ZMQUdTX1VOV0FOVEVEKTsKKwkJCWlmIChlcnJvcikKKwkJCQlyZXR1cm4gWEZTX0VSUk9SKGVycm9yKTsKKwkJdW5tb3VudF9ldmVudF93YW50ZWQgPSAxOworCQl1bm1vdW50X2V2ZW50X2ZsYWdzID0gKG1wLT5tX2RtZXZtYXNrICYgKDE8PERNX0VWRU5UX1VOTU9VTlQpKT8KKwkJCQkJMCA6IERNX0ZMQUdTX1VOV0FOVEVEOworCX0KKworCS8qCisJICogRmlyc3QgYmxvdyBhbnkgcmVmZXJlbmNlZCBpbm9kZSBmcm9tIHRoaXMgZmlsZSBzeXN0ZW0KKwkgKiBvdXQgb2YgdGhlIHJlZmVyZW5jZSBjYWNoZSwgYW5kIGRlbGV0ZSB0aGUgdGltZXIuCisJICovCisJeGZzX3JlZmNhY2hlX3B1cmdlX21wKG1wKTsKKworCVhGU19iZmx1c2gobXAtPm1fZGRldl90YXJncCk7CisJZXJyb3IgPSB4ZnNfdW5tb3VudF9mbHVzaChtcCwgMCk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKworCUFTU0VSVCh2bl9jb3VudChydnApID09IDEpOworCisJLyoKKwkgKiBEcm9wIHRoZSByZWZlcmVuY2UgY291bnQKKwkgKi8KKwlWTl9SRUxFKHJ2cCk7CisKKwkvKgorCSAqIElmIHdlJ3JlIGZvcmNpbmcgYSBzaHV0ZG93biwgdHlwaWNhbGx5IGJlY2F1c2Ugb2YgYSBtZWRpYSBlcnJvciwKKwkgKiB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBpbnZhbGlkYXRlIGRpcnR5IHBhZ2VzIHRoYXQgYmVsb25nIHRvCisJICogcmVmZXJlbmNlZCB2bm9kZXMgYXMgd2VsbC4KKwkgKi8KKwlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpIHsKKwkJZXJyb3IgPSB4ZnNfc3luYygmbXAtPm1fYmh2LAorCQkJIChTWU5DX1dBSVQgfCBTWU5DX0NMT1NFKSwgY3JlZHApOworCQlBU1NFUlQoZXJyb3IgIT0gRUZTQ09SUlVQVEVEKTsKKwl9CisJeGZzX3VubW91bnRmc19uZWVkZWQgPSAxOworCitvdXQ6CisJLyoJU2VuZCBETUFQSSBldmVudCwgaWYgcmVxdWlyZWQuCisJICoJVGhlbiBkbyB4ZnNfdW5tb3VudGZzKCkgaWYgbmVlZGVkLgorCSAqCVRoZW4gcmV0dXJuIGVycm9yIChvciB6ZXJvKS4KKwkgKi8KKwlpZiAodW5tb3VudF9ldmVudF93YW50ZWQpIHsKKwkJLyogTm90ZTogbXAgc3RydWN0dXJlIG11c3Qgc3RpbGwgZXhpc3QgZm9yCisJCSAqIFhGU19TRU5EX1VOTU9VTlQoKSBjYWxsLgorCQkgKi8KKwkJWEZTX1NFTkRfVU5NT1VOVChtcCwgdmZzcCwgZXJyb3IgPT0gMCA/IHJ2cCA6IE5VTEwsCisJCQlETV9SSUdIVF9OVUxMLCAwLCBlcnJvciwgdW5tb3VudF9ldmVudF9mbGFncyk7CisJfQorCWlmICh4ZnNfdW5tb3VudGZzX25lZWRlZCkgeworCQkvKgorCQkgKiBDYWxsIGNvbW1vbiB1bm1vdW50IGZ1bmN0aW9uIHRvIGZsdXNoIHRvIGRpc2sKKwkJICogYW5kIGZyZWUgdGhlIHN1cGVyIGJsb2NrIGJ1ZmZlciAmIG1vdW50IHN0cnVjdHVyZXMuCisJCSAqLworCQl4ZnNfdW5tb3VudGZzKG1wLCBjcmVkcCk7CisJfQorCisJcmV0dXJuIFhGU19FUlJPUihlcnJvcik7Cit9CisKKyNkZWZpbmUgUkVNT1VOVF9SRUFET05MWV9GTEFHUwkoU1lOQ19SRU1PVU5UfFNZTkNfQVRUUnxTWU5DX1dBSVQpCisKK1NUQVRJQyBpbnQKK3hmc19tbnR1cGRhdGUoCisJYmh2X2Rlc2NfdAkJCSpiZHAsCisJaW50CQkJCSpmbGFncywKKwlzdHJ1Y3QgeGZzX21vdW50X2FyZ3MJCSphcmdzKQoreworCXN0cnVjdCB2ZnMJKnZmc3AgPSBiaHZ0b3ZmcyhiZHApOworCXhmc19tb3VudF90CSptcCA9IFhGU19CSFZUT00oYmRwKTsKKwlpbnQJCXBpbmNvdW50LCBlcnJvcjsKKwlpbnQJCWNvdW50ID0gMDsKKworCWlmIChhcmdzLT5mbGFncyAmIFhGU01OVF9OT0FUSU1FKQorCQltcC0+bV9mbGFncyB8PSBYRlNfTU9VTlRfTk9BVElNRTsKKwllbHNlCisJCW1wLT5tX2ZsYWdzICY9IH5YRlNfTU9VTlRfTk9BVElNRTsKKworCWlmICghKHZmc3AtPnZmc19mbGFnICYgVkZTX1JET05MWSkpIHsKKwkJVkZTX1NZTkModmZzcCwgU1lOQ19GU0RBVEF8U1lOQ19CREZMVVNIfFNZTkNfQVRUUiwgTlVMTCwgZXJyb3IpOworCX0KKworCWlmICgqZmxhZ3MgJiBNU19SRE9OTFkpIHsKKwkJeGZzX3JlZmNhY2hlX3B1cmdlX21wKG1wKTsKKwkJeGZzX2ZsdXNoX2J1ZnRhcmcobXAtPm1fZGRldl90YXJncCwgMCk7CisJCXhmc19maW5pc2hfcmVjbGFpbV9hbGwobXAsIDApOworCisJCS8qIFRoaXMgbG9vcCBtdXN0IHJ1biBhdCBsZWFzdCB0d2ljZS4KKwkJICogVGhlIGZpcnN0IGluc3RhbmNlIG9mIHRoZSBsb29wIHdpbGwgZmx1c2gKKwkJICogbW9zdCBtZXRhIGRhdGEgYnV0IHRoYXQgd2lsbCBnZW5lcmF0ZSBtb3JlCisJCSAqIG1ldGEgZGF0YSAodHlwaWNhbGx5IGRpcmVjdG9yeSB1cGRhdGVzKS4KKwkJICogV2hpY2ggdGhlbiBtdXN0IGJlIGZsdXNoZWQgYW5kIGxvZ2dlZCBiZWZvcmUKKwkJICogd2UgY2FuIHdyaXRlIHRoZSB1bm1vdW50IHJlY29yZC4KKwkJICovIAorCQlkbyB7CisJCQlWRlNfU1lOQyh2ZnNwLCBSRU1PVU5UX1JFQURPTkxZX0ZMQUdTLCBOVUxMLCBlcnJvcik7CisJCQlwaW5jb3VudCA9IHhmc19mbHVzaF9idWZ0YXJnKG1wLT5tX2RkZXZfdGFyZ3AsIDEpOworCQkJaWYgKCFwaW5jb3VudCkgeworCQkJCWRlbGF5KDUwKTsKKwkJCQljb3VudCsrOworCQkJfQorCQl9IHdoaWxlIChjb3VudCA8IDIpOworCisJCS8qIE9rIG5vdyB3cml0ZSBvdXQgYW4gdW5tb3VudCByZWNvcmQgKi8KKwkJeGZzX2xvZ191bm1vdW50X3dyaXRlKG1wKTsKKwkJeGZzX3VubW91bnRmc193cml0ZXNiKG1wKTsKKwkJdmZzcC0+dmZzX2ZsYWcgfD0gVkZTX1JET05MWTsKKwl9IGVsc2UgeworCQl2ZnNwLT52ZnNfZmxhZyAmPSB+VkZTX1JET05MWTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHhmc191bm1vdW50X2ZsdXNoIGltcGxlbWVudHMgYSBzZXQgb2YgZmx1c2ggb3BlcmF0aW9uIG9uIHNwZWNpYWwKKyAqIGlub2Rlcywgd2hpY2ggYXJlIG5lZWRlZCBhcyBhIHNlcGFyYXRlIHNldCBvZiBvcGVyYXRpb25zIHNvIHRoYXQKKyAqIHRoZXkgY2FuIGJlIGNhbGxlZCBhcyBwYXJ0IG9mIHJlbG9jYXRpb24gcHJvY2Vzcy4KKyAqLworaW50Cit4ZnNfdW5tb3VudF9mbHVzaCgKKwl4ZnNfbW91bnRfdAkqbXAsCQkvKiBNb3VudCBzdHJ1Y3R1cmUgd2UgYXJlIGdldHRpbmcKKwkJCQkJICAgcmlkIG9mLiAqLworCWludCAgICAgICAgICAgICByZWxvY2F0aW9uKQkvKiBDYWxsZWQgZnJvbSB2ZnMgcmVsb2NhdGlvbi4gKi8KK3sKKwl4ZnNfaW5vZGVfdAkqcmlwID0gbXAtPm1fcm9vdGlwOworCXhmc19pbm9kZV90CSpyYm1pcDsKKwl4ZnNfaW5vZGVfdAkqcnN1bWlwID0gTlVMTDsKKwl2bm9kZV90CQkqcnZwID0gWEZTX0lUT1YocmlwKTsKKwlpbnQJCWVycm9yOworCisJeGZzX2lsb2NrKHJpcCwgWEZTX0lMT0NLX0VYQ0wpOworCXhmc19pZmxvY2socmlwKTsKKworCS8qCisJICogRmx1c2ggb3V0IHRoZSByZWFsIHRpbWUgaW5vZGVzLgorCSAqLworCWlmICgocmJtaXAgPSBtcC0+bV9yYm1pcCkgIT0gTlVMTCkgeworCQl4ZnNfaWxvY2socmJtaXAsIFhGU19JTE9DS19FWENMKTsKKwkJeGZzX2lmbG9jayhyYm1pcCk7CisJCWVycm9yID0geGZzX2lmbHVzaChyYm1pcCwgWEZTX0lGTFVTSF9TWU5DKTsKKwkJeGZzX2l1bmxvY2socmJtaXAsIFhGU19JTE9DS19FWENMKTsKKworCQlpZiAoZXJyb3IgPT0gRUZTQ09SUlVQVEVEKQorCQkJZ290byBmc2NvcnJ1cHRfb3V0OworCisJCUFTU0VSVCh2bl9jb3VudChYRlNfSVRPVihyYm1pcCkpID09IDEpOworCisJCXJzdW1pcCA9IG1wLT5tX3JzdW1pcDsKKwkJeGZzX2lsb2NrKHJzdW1pcCwgWEZTX0lMT0NLX0VYQ0wpOworCQl4ZnNfaWZsb2NrKHJzdW1pcCk7CisJCWVycm9yID0geGZzX2lmbHVzaChyc3VtaXAsIFhGU19JRkxVU0hfU1lOQyk7CisJCXhmc19pdW5sb2NrKHJzdW1pcCwgWEZTX0lMT0NLX0VYQ0wpOworCisJCWlmIChlcnJvciA9PSBFRlNDT1JSVVBURUQpCisJCQlnb3RvIGZzY29ycnVwdF9vdXQ7CisKKwkJQVNTRVJUKHZuX2NvdW50KFhGU19JVE9WKHJzdW1pcCkpID09IDEpOworCX0KKworCS8qCisJICogU3luY2hyb25vdXNseSBmbHVzaCByb290IGlub2RlIHRvIGRpc2sKKwkgKi8KKwllcnJvciA9IHhmc19pZmx1c2gocmlwLCBYRlNfSUZMVVNIX1NZTkMpOworCWlmIChlcnJvciA9PSBFRlNDT1JSVVBURUQpCisJCWdvdG8gZnNjb3JydXB0X291dDI7CisKKwlpZiAodm5fY291bnQocnZwKSAhPSAxICYmICFyZWxvY2F0aW9uKSB7CisJCXhmc19pdW5sb2NrKHJpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQlyZXR1cm4gWEZTX0VSUk9SKEVCVVNZKTsKKwl9CisKKwkvKgorCSAqIFJlbGVhc2UgZHF1b3QgdGhhdCByb290aW5vZGUsIHJibWlubyBhbmQgcnN1bWlubyBtaWdodCBiZSBob2xkaW5nLAorCSAqIGZsdXNoIGFuZCBwdXJnZSB0aGUgcXVvdGEgaW5vZGVzLgorCSAqLworCWVycm9yID0gWEZTX1FNX1VOTU9VTlQobXApOworCWlmIChlcnJvciA9PSBFRlNDT1JSVVBURUQpCisJCWdvdG8gZnNjb3JydXB0X291dDI7CisKKwlpZiAocmJtaXApIHsKKwkJVk5fUkVMRShYRlNfSVRPVihyYm1pcCkpOworCQlWTl9SRUxFKFhGU19JVE9WKHJzdW1pcCkpOworCX0KKworCXhmc19pdW5sb2NrKHJpcCwgWEZTX0lMT0NLX0VYQ0wpOworCXJldHVybiAwOworCitmc2NvcnJ1cHRfb3V0OgorCXhmc19pZnVubG9jayhyaXApOworCitmc2NvcnJ1cHRfb3V0MjoKKwl4ZnNfaXVubG9jayhyaXAsIFhGU19JTE9DS19FWENMKTsKKworCXJldHVybiBYRlNfRVJST1IoRUZTQ09SUlVQVEVEKTsKK30KKworLyoKKyAqIHhmc19yb290IGV4dHJhY3RzIHRoZSByb290IHZub2RlIGZyb20gYSB2ZnMuCisgKgorICogdmZzcCAtLSB0aGUgdmZzIHN0cnVjdCBmb3IgdGhlIGRlc2lyZWQgZmlsZSBzeXN0ZW0KKyAqIHZwcCAgLS0gYWRkcmVzcyBvZiB0aGUgY2FsbGVyJ3Mgdm5vZGUgcG9pbnRlciB3aGljaCBzaG91bGQgYmUKKyAqICAgICAgICAgc2V0IHRvIHRoZSBkZXNpcmVkIGZzIHJvb3Qgdm5vZGUKKyAqLworU1RBVElDIGludAoreGZzX3Jvb3QoCisJYmh2X2Rlc2NfdAkqYmRwLAorCXZub2RlX3QJCSoqdnBwKQoreworCXZub2RlX3QJCSp2cDsKKworCXZwID0gWEZTX0lUT1YoKFhGU19CSFZUT00oYmRwKSktPm1fcm9vdGlwKTsKKwlWTl9IT0xEKHZwKTsKKwkqdnBwID0gdnA7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB4ZnNfc3RhdHZmcworICoKKyAqIEZpbGwgaW4gdGhlIHN0YXR2ZnMgc3RydWN0dXJlIGZvciB0aGUgZ2l2ZW4gZmlsZSBzeXN0ZW0uICBXZSB1c2UKKyAqIHRoZSBzdXBlcmJsb2NrIGxvY2sgaW4gdGhlIG1vdW50IHN0cnVjdHVyZSB0byBlbnN1cmUgYSBjb25zaXN0ZW50CisgKiBzbmFwc2hvdCBvZiB0aGUgY291bnRlcnMgcmV0dXJuZWQuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19zdGF0dmZzKAorCWJodl9kZXNjX3QJKmJkcCwKKwl4ZnNfc3RhdGZzX3QJKnN0YXRwLAorCXZub2RlX3QJCSp2cCkKK3sKKwlfX3VpbnQ2NF90CWZha2Vpbm9zOworCXhmc19leHRsZW5fdAlsc2l6ZTsKKwl4ZnNfbW91bnRfdAkqbXA7CisJeGZzX3NiX3QJKnNicDsKKwl1bnNpZ25lZCBsb25nCXM7CisJdTY0IGlkOworCisJbXAgPSBYRlNfQkhWVE9NKGJkcCk7CisJc2JwID0gJihtcC0+bV9zYik7CisKKwlzdGF0cC0+Zl90eXBlID0gWEZTX1NCX01BR0lDOworCisJcyA9IFhGU19TQl9MT0NLKG1wKTsKKwlzdGF0cC0+Zl9ic2l6ZSA9IHNicC0+c2JfYmxvY2tzaXplOworCWxzaXplID0gc2JwLT5zYl9sb2dzdGFydCA/IHNicC0+c2JfbG9nYmxvY2tzIDogMDsKKwlzdGF0cC0+Zl9ibG9ja3MgPSBzYnAtPnNiX2RibG9ja3MgLSBsc2l6ZTsKKwlzdGF0cC0+Zl9iZnJlZSA9IHN0YXRwLT5mX2JhdmFpbCA9IHNicC0+c2JfZmRibG9ja3M7CisJZmFrZWlub3MgPSBzdGF0cC0+Zl9iZnJlZSA8PCBzYnAtPnNiX2lub3BibG9nOworI2lmIFhGU19CSUdfSU5VTVMKKwlmYWtlaW5vcyArPSBtcC0+bV9pbm9hZGQ7CisjZW5kaWYKKwlzdGF0cC0+Zl9maWxlcyA9CisJICAgIE1JTihzYnAtPnNiX2ljb3VudCArIGZha2Vpbm9zLCAoX191aW50NjRfdClYRlNfTUFYSU5VTUJFUik7CisJaWYgKG1wLT5tX21heGljb3VudCkKKyNpZiBYRlNfQklHX0lOVU1TCisJCWlmICghbXAtPm1faW5vYWRkKQorI2VuZGlmCisJCQlzdGF0cC0+Zl9maWxlcyA9IG1pbl90KHR5cGVvZihzdGF0cC0+Zl9maWxlcyksCisJCQkJCQlzdGF0cC0+Zl9maWxlcywKKwkJCQkJCW1wLT5tX21heGljb3VudCk7CisJc3RhdHAtPmZfZmZyZWUgPSBzdGF0cC0+Zl9maWxlcyAtIChzYnAtPnNiX2ljb3VudCAtIHNicC0+c2JfaWZyZWUpOworCVhGU19TQl9VTkxPQ0sobXAsIHMpOworCisJaWQgPSBodWdlX2VuY29kZV9kZXYobXAtPm1fZGV2KTsKKwlzdGF0cC0+Zl9mc2lkLnZhbFswXSA9ICh1MzIpaWQ7CisJc3RhdHAtPmZfZnNpZC52YWxbMV0gPSAodTMyKShpZCA+PiAzMik7CisJc3RhdHAtPmZfbmFtZWxlbiA9IE1BWE5BTUVMRU4gLSAxOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIHhmc19zeW5jIGZsdXNoZXMgYW55IHBlbmRpbmcgSS9PIHRvIGZpbGUgc3lzdGVtIHZmc3AuCisgKgorICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB2ZnNfc3luYygpIHRvIG1ha2Ugc3VyZSB0aGF0IHRoaW5ncyBtYWtlIGl0CisgKiBvdXQgdG8gZGlzayBldmVudHVhbGx5LCBvbiBzeW5jKCkgc3lzdGVtIGNhbGxzIHRvIGZsdXNoIG91dCBldmVyeXRoaW5nLAorICogYW5kIHdoZW4gdGhlIGZpbGUgc3lzdGVtIGlzIHVubW91bnRlZC4gIEZvciB0aGUgdmZzX3N5bmMoKSBjYXNlLCBhbGwKKyAqIHdlIHJlYWxseSBuZWVkIHRvIGRvIGlzIHN5bmMgb3V0IHRoZSBsb2cgdG8gbWFrZSBhbGwgb2Ygb3VyIG1ldGEtZGF0YQorICogdXBkYXRlcyBwZXJtYW5lbnQgKGV4Y2VwdCBmb3IgdGltZXN0YW1wcykuICBGb3IgY2FsbHMgZnJvbSBwZmx1c2hkKCksCisgKiBkaXJ0eSBwYWdlcyBhcmUga2VwdCBtb3ZpbmcgYnkgY2FsbGluZyBwZGZsdXNoKCkgb24gdGhlIGlub2RlcworICogY29udGFpbmluZyB0aGVtLiAgV2UgYWxzbyBmbHVzaCB0aGUgaW5vZGVzIHRoYXQgd2UgY2FuIGxvY2sgd2l0aG91dAorICogc2xlZXBpbmcgYW5kIHRoZSBzdXBlcmJsb2NrIGlmIHdlIGNhbiBsb2NrIGl0IHdpdGhvdXQgc2xlZXBpbmcgZnJvbQorICogdmZzX3N5bmMoKSBzbyB0aGF0IGl0ZW1zIGF0IHRoZSB0YWlsIG9mIHRoZSBsb2cgYXJlIGFsd2F5cyBtb3Zpbmcgb3V0LgorICoKKyAqIEZsYWdzOgorICogICAgICBTWU5DX0JERkxVU0ggLSBXZSdyZSBiZWluZyBjYWxsZWQgZnJvbSB2ZnNfc3luYygpIHNvIHdlIGRvbid0IHdhbnQKKyAqCQkgICAgICAgdG8gc2xlZXAgaWYgd2UgY2FuIGhlbHAgaXQuICBBbGwgd2UgcmVhbGx5IG5lZWQKKyAqCQkgICAgICAgdG8gZG8gaXMgZW5zdXJlIHRoYXQgdGhlIGxvZyBpcyBzeW5jZWQgYXQgbGVhc3QKKyAqCQkgICAgICAgcGVyaW9kaWNhbGx5LiAgV2UgYWxzbyBwdXNoIHRoZSBpbm9kZXMgYW5kCisgKgkJICAgICAgIHN1cGVyYmxvY2sgaWYgd2UgY2FuIGxvY2sgdGhlbSB3aXRob3V0IHNsZWVwaW5nCisgKgkJCWFuZCB0aGV5IGFyZSBub3QgcGlubmVkLgorICogICAgICBTWU5DX0FUVFIgICAgLSBXZSBuZWVkIHRvIGZsdXNoIHRoZSBpbm9kZXMuICBJZiBTWU5DX0JERkxVU0ggaXMgbm90CisgKgkJICAgICAgIHNldCwgdGhlbiB3ZSByZWFsbHkgd2FudCB0byBsb2NrIGVhY2ggaW5vZGUgYW5kIGZsdXNoCisgKgkJICAgICAgIGl0LgorICogICAgICBTWU5DX1dBSVQgICAgLSBBbGwgdGhlIGZsdXNoZXMgdGhhdCB0YWtlIHBsYWNlIGluIHRoaXMgY2FsbCBzaG91bGQKKyAqCQkgICAgICAgYmUgc3luY2hyb25vdXMuCisgKiAgICAgIFNZTkNfREVMV1JJICAtIFRoaXMgdGVsbHMgdXMgdG8gcHVzaCBkaXJ0eSBwYWdlcyBhc3NvY2lhdGVkIHdpdGgKKyAqCQkgICAgICAgaW5vZGVzLiAgU1lOQ19XQUlUIGFuZCBTWU5DX0JERkxVU0ggYXJlIHVzZWQgdG8KKyAqCQkgICAgICAgZGV0ZXJtaW5lIGlmIHRoZXkgc2hvdWxkIGJlIGZsdXNoZWQgc3luYywgYXN5bmMsIG9yCisgKgkJICAgICAgIGRlbHdyaS4KKyAqICAgICAgU1lOQ19DTE9TRSAgIC0gVGhpcyBmbGFnIGlzIHBhc3NlZCB3aGVuIHRoZSBzeXN0ZW0gaXMgYmVpbmcKKyAqCQkgICAgICAgdW5tb3VudGVkLiAgV2Ugc2hvdWxkIHN5bmMgYW5kIGludmFsaWRhdGUgZXZlcnRoaW5nLgorICogICAgICBTWU5DX0ZTREFUQSAgLSBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBjYWxsZXIgd291bGQgbGlrZSB0byBtYWtlCisgKgkJICAgICAgIHN1cmUgdGhlIHN1cGVyYmxvY2sgaXMgc2FmZSBvbiBkaXNrLiAgV2UgY2FuIGVuc3VyZQorICoJCSAgICAgICB0aGlzIGJ5IHNpbXBseSBtYWtlaW5nIHN1cmUgdGhlIGxvZyBnZXRzIGZsdXNoZWQKKyAqCQkgICAgICAgaWYgU1lOQ19CREZMVVNIIGlzIHNldCwgYW5kIGJ5IGFjdHVhbGx5IHdyaXRpbmcgaXQKKyAqCQkgICAgICAgb3V0IG90aGVyd2lzZS4KKyAqCisgKi8KKy8qQVJHU1VTRUQqLworU1RBVElDIGludAoreGZzX3N5bmMoCisJYmh2X2Rlc2NfdAkqYmRwLAorCWludAkJZmxhZ3MsCisJY3JlZF90CQkqY3JlZHApCit7CisJeGZzX21vdW50X3QJKm1wOworCisJbXAgPSBYRlNfQkhWVE9NKGJkcCk7CisJcmV0dXJuICh4ZnNfc3luY3N1YihtcCwgZmxhZ3MsIDAsIE5VTEwpKTsKK30KKworLyoKKyAqIHhmcyBzeW5jIHJvdXRpbmUgZm9yIGludGVybmFsIHVzZQorICoKKyAqIFRoaXMgcm91dGluZSBzdXBwb3J0cyBhbGwgb2YgdGhlIGZsYWdzIGRlZmluZWQgZm9yIHRoZSBnZW5lcmljIFZGU19TWU5DCisgKiBpbnRlcmZhY2UgYXMgZXhwbGFpbmVkIGFib3ZlIHVuZGVyIHhmc19zeW5jLiAgSW4gdGhlIGludGVyZXN0cyBvZiBub3QKKyAqIGNoYW5naW5nIGludGVyZmFjZXMgd2l0aGluIHRoZSA2LjUgZmFtaWx5LCBhZGRpdGlvbmFsIGludGVybmFsbGx5LQorICogcmVxdWlyZWQgZnVuY3Rpb25zIGFyZSBzcGVjaWZpZWQgd2l0aGluIGEgc2VwYXJhdGUgeGZsYWdzIHBhcmFtZXRlciwKKyAqIG9ubHkgYXZhaWxhYmxlIGJ5IGNhbGxpbmcgdGhpcyByb3V0aW5lLgorICoKKyAqLworU1RBVElDIGludAoreGZzX3N5bmNfaW5vZGVzKAorCXhmc19tb3VudF90CSptcCwKKwlpbnQJCWZsYWdzLAorCWludCAgICAgICAgICAgICB4ZmxhZ3MsCisJaW50ICAgICAgICAgICAgICpieXBhc3NlZCkKK3sKKwl4ZnNfaW5vZGVfdAkqaXAgPSBOVUxMOworCXhmc19pbm9kZV90CSppcF9uZXh0OworCXhmc19idWZfdAkqYnA7CisJdm5vZGVfdAkJKnZwID0gTlVMTDsKKwl2bWFwX3QJCXZtYXA7CisJaW50CQllcnJvcjsKKwlpbnQJCWxhc3RfZXJyb3I7CisJdWludDY0X3QJZmZsYWc7CisJdWludAkJbG9ja19mbGFnczsKKwl1aW50CQliYXNlX2xvY2tfZmxhZ3M7CisJYm9vbGVhbl90CW1vdW50X2xvY2tlZDsKKwlib29sZWFuX3QJdm5vZGVfcmVmZWQ7CisJaW50CQlwcmVlbXB0OworCXhmc19kaW5vZGVfdAkqZGlwOworCXhmc19pcHRyX3QJKmlwb2ludGVyOworI2lmZGVmIERFQlVHCisJYm9vbGVhbl90CWlwb2ludGVyX2luID0gQl9GQUxTRTsKKworI2RlZmluZSBJUE9JTlRFUl9TRVQJaXBvaW50ZXJfaW4gPSBCX1RSVUUKKyNkZWZpbmUgSVBPSU5URVJfQ0xSCWlwb2ludGVyX2luID0gQl9GQUxTRQorI2Vsc2UKKyNkZWZpbmUgSVBPSU5URVJfU0VUCisjZGVmaW5lIElQT0lOVEVSX0NMUgorI2VuZGlmCisKKworLyogSW5zZXJ0IGEgbWFya2VyIHJlY29yZCBpbnRvIHRoZSBpbm9kZSBsaXN0IGFmdGVyIGlub2RlIGlwLiBUaGUgbGlzdAorICogbXVzdCBiZSBsb2NrZWQgd2hlbiB0aGlzIGlzIGNhbGxlZC4gQWZ0ZXIgdGhlIGNhbGwgdGhlIGxpc3Qgd2lsbCBubworICogbG9uZ2VyIGJlIGxvY2tlZC4KKyAqLworI2RlZmluZSBJUE9JTlRFUl9JTlNFUlQoaXAsIG1wKQl7IFwKKwkJQVNTRVJUKGlwb2ludGVyX2luID09IEJfRkFMU0UpOyBcCisJCWlwb2ludGVyLT5pcF9tbmV4dCA9IGlwLT5pX21uZXh0OyBcCisJCWlwb2ludGVyLT5pcF9tcHJldiA9IGlwOyBcCisJCWlwLT5pX21uZXh0ID0gKHhmc19pbm9kZV90ICopaXBvaW50ZXI7IFwKKwkJaXBvaW50ZXItPmlwX21uZXh0LT5pX21wcmV2ID0gKHhmc19pbm9kZV90ICopaXBvaW50ZXI7IFwKKwkJcHJlZW1wdCA9IDA7IFwKKwkJWEZTX01PVU5UX0lVTkxPQ0sobXApOyBcCisJCW1vdW50X2xvY2tlZCA9IEJfRkFMU0U7IFwKKwkJSVBPSU5URVJfU0VUOyBcCisJfQorCisvKiBSZW1vdmUgdGhlIG1hcmtlciBmcm9tIHRoZSBpbm9kZSBsaXN0LiBJZiB0aGUgbWFya2VyIHdhcyB0aGUgb25seSBpdGVtCisgKiBpbiB0aGUgbGlzdCB0aGVuIHRoZXJlIGFyZSBubyByZW1haW5pbmcgaW5vZGVzIGFuZCB3ZSBzaG91bGQgemVybyBvdXQKKyAqIHRoZSB3aG9sZSBsaXN0LiBJZiB3ZSBhcmUgdGhlIGN1cnJlbnQgaGVhZCBvZiB0aGUgbGlzdCB0aGVuIG1vdmUgdGhlIGhlYWQKKyAqIHBhc3QgdXMuCisgKi8KKyNkZWZpbmUgSVBPSU5URVJfUkVNT1ZFKGlwLCBtcCkJeyBcCisJCUFTU0VSVChpcG9pbnRlcl9pbiA9PSBCX1RSVUUpOyBcCisJCWlmIChpcG9pbnRlci0+aXBfbW5leHQgIT0gKHhmc19pbm9kZV90ICopaXBvaW50ZXIpIHsgXAorCQkJaXAgPSBpcG9pbnRlci0+aXBfbW5leHQ7IFwKKwkJCWlwLT5pX21wcmV2ID0gaXBvaW50ZXItPmlwX21wcmV2OyBcCisJCQlpcG9pbnRlci0+aXBfbXByZXYtPmlfbW5leHQgPSBpcDsgXAorCQkJaWYgKG1wLT5tX2lub2RlcyA9PSAoeGZzX2lub2RlX3QgKilpcG9pbnRlcikgeyBcCisJCQkJbXAtPm1faW5vZGVzID0gaXA7IFwKKwkJCX0gXAorCQl9IGVsc2UgeyBcCisJCQlBU1NFUlQobXAtPm1faW5vZGVzID09ICh4ZnNfaW5vZGVfdCAqKWlwb2ludGVyKTsgXAorCQkJbXAtPm1faW5vZGVzID0gTlVMTDsgXAorCQkJaXAgPSBOVUxMOyBcCisJCX0gXAorCQlJUE9JTlRFUl9DTFI7IFwKKwl9CisKKyNkZWZpbmUgWEZTX1BSRUVNUFRfTUFTSwkweDdmCisKKwlpZiAoYnlwYXNzZWQpCisJCSpieXBhc3NlZCA9IDA7CisJaWYgKFhGU19NVE9WRlMobXApLT52ZnNfZmxhZyAmIFZGU19SRE9OTFkpCisJCXJldHVybiAwOworCWVycm9yID0gMDsKKwlsYXN0X2Vycm9yID0gMDsKKwlwcmVlbXB0ID0gMDsKKworCS8qIEFsbG9jYXRlIGEgcmVmZXJlbmNlIG1hcmtlciAqLworCWlwb2ludGVyID0gKHhmc19pcHRyX3QgKilrbWVtX3phbGxvYyhzaXplb2YoeGZzX2lwdHJfdCksIEtNX1NMRUVQKTsKKworCWZmbGFnID0gWEZTX0JfQVNZTkM7CQkvKiBkZWZhdWx0IGlzIGRvbid0IHdhaXQgKi8KKwlpZiAoZmxhZ3MgJiBTWU5DX0JERkxVU0gpCisJCWZmbGFnID0gWEZTX0JfREVMV1JJOworCWlmIChmbGFncyAmIFNZTkNfV0FJVCkKKwkJZmZsYWcgPSAwOwkJLyogc3luY2hyb25vdXMgb3ZlcnJpZGVzIGFsbCAqLworCisJYmFzZV9sb2NrX2ZsYWdzID0gWEZTX0lMT0NLX1NIQVJFRDsKKwlpZiAoZmxhZ3MgJiAoU1lOQ19ERUxXUkkgfCBTWU5DX0NMT1NFKSkgeworCQkvKgorCQkgKiBXZSBuZWVkIHRoZSBJL08gbG9jayBpZiB3ZSdyZSBnb2luZyB0byBjYWxsIGFueSBvZgorCQkgKiB0aGUgZmx1c2gvaW52YWwgcm91dGluZXMuCisJCSAqLworCQliYXNlX2xvY2tfZmxhZ3MgfD0gWEZTX0lPTE9DS19TSEFSRUQ7CisJfQorCisJWEZTX01PVU5UX0lMT0NLKG1wKTsKKworCWlwID0gbXAtPm1faW5vZGVzOworCisJbW91bnRfbG9ja2VkID0gQl9UUlVFOworCXZub2RlX3JlZmVkICA9IEJfRkFMU0U7CisKKwlJUE9JTlRFUl9DTFI7CisKKwlkbyB7CisJCUFTU0VSVChpcG9pbnRlcl9pbiA9PSBCX0ZBTFNFKTsKKwkJQVNTRVJUKHZub2RlX3JlZmVkID09IEJfRkFMU0UpOworCisJCWxvY2tfZmxhZ3MgPSBiYXNlX2xvY2tfZmxhZ3M7CisKKwkJLyoKKwkJICogVGhlcmUgd2VyZSBubyBpbm9kZXMgaW4gdGhlIGxpc3QsIGp1c3QgYnJlYWsgb3V0CisJCSAqIG9mIHRoZSBsb29wLgorCQkgKi8KKwkJaWYgKGlwID09IE5VTEwpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogV2UgZm91bmQgYW5vdGhlciBzeW5jIHRocmVhZCBtYXJrZXIgLSBza2lwIGl0CisJCSAqLworCQlpZiAoaXAtPmlfbW91bnQgPT0gTlVMTCkgeworCQkJaXAgPSBpcC0+aV9tbmV4dDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJdnAgPSBYRlNfSVRPVl9OVUxMKGlwKTsKKworCQkvKgorCQkgKiBJZiB0aGUgdm5vZGUgaXMgZ29uZSB0aGVuIHRoaXMgaXMgYmVpbmcgdG9ybiBkb3duLAorCQkgKiBjYWxsIHJlY2xhaW0gaWYgaXQgaXMgZmx1c2hlZCwgZWxzZSBsZXQgcmVndWxhciBmbHVzaAorCQkgKiBjb2RlIGRlYWwgd2l0aCBpdCBsYXRlciBpbiB0aGUgbG9vcC4KKwkJICovCisKKwkJaWYgKHZwID09IE5VTEwpIHsKKwkJCS8qIFNraXAgb25lcyBhbHJlYWR5IGluIHJlY2xhaW0gKi8KKwkJCWlmIChpcC0+aV9mbGFncyAmIFhGU19JUkVDTEFJTSkgeworCQkJCWlwID0gaXAtPmlfbW5leHQ7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoeGZzX2lsb2NrX25vd2FpdChpcCwgWEZTX0lMT0NLX0VYQ0wpID09IDApIHsKKwkJCQlpcCA9IGlwLT5pX21uZXh0OworCQkJfSBlbHNlIGlmICgoeGZzX2lwaW5jb3VudChpcCkgPT0gMCkgJiYKKwkJCQkgICAgeGZzX2lmbG9ja19ub3dhaXQoaXApKSB7CisJCQkJSVBPSU5URVJfSU5TRVJUKGlwLCBtcCk7CisKKwkJCQl4ZnNfZmluaXNoX3JlY2xhaW0oaXAsIDEsCisJCQkJCQlYRlNfSUZMVVNIX0RFTFdSSV9FTFNFX0FTWU5DKTsKKworCQkJCVhGU19NT1VOVF9JTE9DSyhtcCk7CisJCQkJbW91bnRfbG9ja2VkID0gQl9UUlVFOworCQkJCUlQT0lOVEVSX1JFTU9WRShpcCwgbXApOworCQkJfSBlbHNlIHsKKwkJCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQkJCWlwID0gaXAtPmlfbW5leHQ7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChWTl9CQUQodnApKSB7CisJCQlpcCA9IGlwLT5pX21uZXh0OworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkgJiYgIShmbGFncyAmIFNZTkNfQ0xPU0UpKSB7CisJCQlYRlNfTU9VTlRfSVVOTE9DSyhtcCk7CisJCQlrbWVtX2ZyZWUoaXBvaW50ZXIsIHNpemVvZih4ZnNfaXB0cl90KSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qCisJCSAqIElmIHRoaXMgaXMganVzdCB2ZnNfc3luYygpIG9yIHBmbHVzaGQoKSBjYWxsaW5nCisJCSAqIHRoZW4gd2UgY2FuIHNraXAgaW5vZGVzIGZvciB3aGljaCBpdCBsb29rcyBsaWtlCisJCSAqIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uICBTaW5jZSB3ZSBkb24ndCBoYXZlIHRoZQorCQkgKiBpbm9kZSBsb2NrZWQgdGhpcyBpcyByYWNleSwgYnV0IHRoZXNlIGFyZSBwZXJpb2RpYworCQkgKiBjYWxscyBzbyBpdCBkb2Vzbid0IG1hdHRlci4gIEZvciB0aGUgb3RoZXJzIHdlIHdhbnQKKwkJICogdG8ga25vdyBmb3Igc3VyZSwgc28gd2UgYXQgbGVhc3QgdHJ5IHRvIGxvY2sgdGhlbS4KKwkJICovCisJCWlmIChmbGFncyAmIFNZTkNfQkRGTFVTSCkgeworCQkJaWYgKCgoaXAtPmlfaXRlbXAgPT0gTlVMTCkgfHwKKwkJCSAgICAgIShpcC0+aV9pdGVtcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICYKKwkJCSAgICAgICBYRlNfSUxPR19BTEwpKSAmJgorCQkJICAgIChpcC0+aV91cGRhdGVfY29yZSA9PSAwKSkgeworCQkJCWlwID0gaXAtPmlfbW5leHQ7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBUcnkgdG8gbG9jayB3aXRob3V0IHNsZWVwaW5nLiAgV2UncmUgb3V0IG9mIG9yZGVyIHdpdGgKKwkJICogdGhlIGlub2RlIGxpc3QgbG9jayBoZXJlLCBzbyBpZiB3ZSBmYWlsIHdlIG5lZWQgdG8gZHJvcAorCQkgKiB0aGUgbW91bnQgbG9jayBhbmQgdHJ5IGFnYWluLiAgSWYgd2UncmUgY2FsbGVkIGZyb20KKwkJICogYmRmbHVzaCgpIGhlcmUsIHRoZW4gZG9uJ3QgYm90aGVyLgorCQkgKgorCQkgKiBUaGUgaW5vZGUgbG9jayBoZXJlIGFjdHVhbGx5IGNvb3JkaW5hdGVzIHdpdGggdGhlCisJCSAqIGFsbW9zdCBzcHVyaW91cyBpbm9kZSBsb2NrIGluIHhmc19pcmVjbGFpbSgpIHRvIHByZXZlbnQKKwkJICogdGhlIHZub2RlIHdlIGhhbmRsZSBoZXJlIHdpdGhvdXQgYSByZWZlcmVuY2UgZnJvbQorCQkgKiBiZWluZyBmcmVlZCB3aGlsZSB3ZSByZWZlcmVuY2UgaXQuICBJZiB3ZSBsb2NrIHRoZSBpbm9kZQorCQkgKiB3aGlsZSBpdCdzIG9uIHRoZSBtb3VudCBsaXN0IGhlcmUsIHRoZW4gdGhlIHNwdXJpb3VzIGlub2RlCisJCSAqIGxvY2sgaW4geGZzX2lyZWNsYWltKCkgYWZ0ZXIgdGhlIGlub2RlIGlzIHB1bGxlZCBmcm9tCisJCSAqIHRoZSBtb3VudCBsaXN0IHdpbGwgc2xlZXAgdW50aWwgd2UgcmVsZWFzZSBpdCBoZXJlLgorCQkgKiBUaGlzIGtlZXBzIHRoZSB2bm9kZSBmcm9tIGJlaW5nIGZyZWVkIHdoaWxlIHdlIHJlZmVyZW5jZQorCQkgKiBpdC4gIEl0IGlzIGFsc28gY2hlYXBlciBhbmQgc2ltcGxlciB0aGFuIGFjdHVhbGx5IGRvaW5nCisJCSAqIGEgdm5fZ2V0KCkgZm9yIGV2ZXJ5IGlub2RlIHdlIHRvdWNoIGhlcmUuCisJCSAqLworCQlpZiAoeGZzX2lsb2NrX25vd2FpdChpcCwgbG9ja19mbGFncykgPT0gMCkgeworCisJCQlpZiAoKGZsYWdzICYgU1lOQ19CREZMVVNIKSB8fCAodnAgPT0gTlVMTCkpIHsKKwkJCQlpcCA9IGlwLT5pX21uZXh0OworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKgorCQkJICogV2UgbmVlZCB0byB1bmxvY2sgdGhlIGlub2RlIGxpc3QgbG9jayBpbiBvcmRlcgorCQkJICogdG8gbG9jayB0aGUgaW5vZGUuIEluc2VydCBhIG1hcmtlciByZWNvcmQgaW50bworCQkJICogdGhlIGlub2RlIGxpc3QgdG8gcmVtZW1iZXIgb3VyIHBvc2l0aW9uLCBkcm9wcGluZworCQkJICogdGhlIGxvY2sgaXMgbm93IGRvbmUgaW5zaWRlIHRoZSBJUE9JTlRFUl9JTlNFUlQKKwkJCSAqIG1hY3JvLgorCQkJICoKKwkJCSAqIFdlIGFsc28gdXNlIHRoZSBpbm9kZSBsaXN0IGxvY2sgdG8gcHJvdGVjdCB1cworCQkJICogaW4gdGFraW5nIGEgc25hcHNob3Qgb2YgdGhlIHZub2RlIHZlcnNpb24gbnVtYmVyCisJCQkgKiBmb3IgdXNlIGluIGNhbGxpbmcgdm5fZ2V0KCkuCisJCQkgKi8KKwkJCVZNQVAodnAsIHZtYXApOworCQkJSVBPSU5URVJfSU5TRVJUKGlwLCBtcCk7CisKKwkJCXZwID0gdm5fZ2V0KHZwLCAmdm1hcCk7CisJCQlpZiAodnAgPT0gTlVMTCkgeworCQkJCS8qCisJCQkJICogVGhlIHZub2RlIHdhcyByZWNsYWltZWQgb25jZSB3ZSBsZXQgZ28KKwkJCQkgKiBvZiB0aGUgaW5vZGUgbGlzdCBsb2NrLiAgU2tpcCB0byB0aGUKKwkJCQkgKiBuZXh0IGxpc3QgZW50cnkuIFJlbW92ZSB0aGUgbWFya2VyLgorCQkJCSAqLworCisJCQkJWEZTX01PVU5UX0lMT0NLKG1wKTsKKworCQkJCW1vdW50X2xvY2tlZCA9IEJfVFJVRTsKKwkJCQl2bm9kZV9yZWZlZCAgPSBCX0ZBTFNFOworCisJCQkJSVBPSU5URVJfUkVNT1ZFKGlwLCBtcCk7CisKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJeGZzX2lsb2NrKGlwLCBsb2NrX2ZsYWdzKTsKKworCQkJQVNTRVJUKHZwID09IFhGU19JVE9WKGlwKSk7CisJCQlBU1NFUlQoaXAtPmlfbW91bnQgPT0gbXApOworCisJCQl2bm9kZV9yZWZlZCA9IEJfVFJVRTsKKwkJfQorCisJCS8qIEZyb20gaGVyZSBvbiBpbiB0aGUgbG9vcCB3ZSBtYXkgaGF2ZSBhIG1hcmtlciByZWNvcmQKKwkJICogaW4gdGhlIGlub2RlIGxpc3QuCisJCSAqLworCisJCWlmICgoZmxhZ3MgJiBTWU5DX0NMT1NFKSAgJiYgKHZwICE9IE5VTEwpKSB7CisJCQkvKgorCQkJICogVGhpcyBpcyB0aGUgc2h1dGRvd24gY2FzZS4gIFdlIGp1c3QgbmVlZCB0bworCQkJICogZmx1c2ggYW5kIGludmFsaWRhdGUgYWxsIHRoZSBwYWdlcyBhc3NvY2lhdGVkCisJCQkgKiB3aXRoIHRoZSBpbm9kZS4gIERyb3AgdGhlIGlub2RlIGxvY2sgc2luY2UKKwkJCSAqIHdlIGNhbid0IGhvbGQgaXQgYWNyb3NzIGNhbGxzIHRvIHRoZSBidWZmZXIKKwkJCSAqIGNhY2hlLgorCQkJICoKKwkJCSAqIFdlIGRvbid0IHNldCB0aGUgVlJFTUFQUElORyBiaXQgaW4gdGhlIHZub2RlCisJCQkgKiBoZXJlLCBiZWNhdXNlIHdlIGRvbid0IGhvbGQgdGhlIHZub2RlIGxvY2sKKwkJCSAqIGV4Y2x1c2l2ZWx5LiAgSXQgZG9lc24ndCByZWFsbHkgbWF0dGVyLCB0aG91Z2gsCisJCQkgKiBiZWNhdXNlIHdlIG9ubHkgY29tZSBoZXJlIHdoZW4gd2UncmUgc2h1dHRpbmcKKwkJCSAqIGRvd24gYW55d2F5LgorCQkJICovCisJCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisKKwkJCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkgeworCQkJCVZPUF9UT1NTX1BBR0VTKHZwLCAwLCAtMSwgRklfUkVNQVBGKTsKKwkJCX0gZWxzZSB7CisJCQkJVk9QX0ZMVVNISU5WQUxfUEFHRVModnAsIDAsIC0xLCBGSV9SRU1BUEYpOworCQkJfQorCisJCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOworCisJCX0gZWxzZSBpZiAoKGZsYWdzICYgU1lOQ19ERUxXUkkpICYmICh2cCAhPSBOVUxMKSkgeworCQkJaWYgKFZOX0RJUlRZKHZwKSkgeworCQkJCS8qIFdlIG5lZWQgdG8gaGF2ZSBkcm9wcGVkIHRoZSBsb2NrIGhlcmUsCisJCQkJICogc28gaW5zZXJ0IGEgbWFya2VyIGlmIHdlIGhhdmUgbm90IGFscmVhZHkKKwkJCQkgKiBkb25lIHNvLgorCQkJCSAqLworCQkJCWlmIChtb3VudF9sb2NrZWQpIHsKKwkJCQkJSVBPSU5URVJfSU5TRVJUKGlwLCBtcCk7CisJCQkJfQorCisJCQkJLyoKKwkJCQkgKiBEcm9wIHRoZSBpbm9kZSBsb2NrIHNpbmNlIHdlIGNhbid0IGhvbGQgaXQKKwkJCQkgKiBhY3Jvc3MgY2FsbHMgdG8gdGhlIGJ1ZmZlciBjYWNoZS4KKwkJCQkgKi8KKwkJCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisJCQkJVk9QX0ZMVVNIX1BBR0VTKHZwLCAoeGZzX29mZl90KTAsIC0xLAorCQkJCQkJCWZmbGFnLCBGSV9OT05FLCBlcnJvcik7CisJCQkJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKwkJCX0KKworCQl9CisKKwkJaWYgKGZsYWdzICYgU1lOQ19CREZMVVNIKSB7CisJCQlpZiAoKGZsYWdzICYgU1lOQ19BVFRSKSAmJgorCQkJICAgICgoaXAtPmlfdXBkYXRlX2NvcmUpIHx8CisJCQkgICAgICgoaXAtPmlfaXRlbXAgIT0gTlVMTCkgJiYKKwkJCSAgICAgIChpcC0+aV9pdGVtcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICE9IDApKSkpIHsKKworCQkJCS8qIEluc2VydCBtYXJrZXIgYW5kIGRyb3AgbG9jayBpZiBub3QgYWxyZWFkeQorCQkJCSAqIGRvbmUuCisJCQkJICovCisJCQkJaWYgKG1vdW50X2xvY2tlZCkgeworCQkJCQlJUE9JTlRFUl9JTlNFUlQoaXAsIG1wKTsKKwkJCQl9CisKKwkJCQkvKgorCQkJCSAqIFdlIGRvbid0IHdhbnQgdGhlIHBlcmlvZGljIGZsdXNoaW5nIG9mIHRoZQorCQkJCSAqIGlub2RlcyBieSB2ZnNfc3luYygpIHRvIGludGVyZmVyZSB3aXRoCisJCQkJICogSS9PIHRvIHRoZSBmaWxlLCBlc3BlY2lhbGx5IHJlYWQgSS9PCisJCQkJICogd2hlcmUgaXQgaXMgb25seSB0aGUgYWNjZXNzIHRpbWUgc3RhbXAKKwkJCQkgKiB0aGF0IGlzIGJlaW5nIGZsdXNoZWQgb3V0LiAgVG8gcHJldmVudAorCQkJCSAqIGxvbmcgcGVyaW9kcyB3aGVyZSB3ZSBoYXZlIGJvdGggaW5vZGUKKwkJCQkgKiBsb2NrcyBoZWxkIHNoYXJlZCBoZXJlIHdoaWxlIHJlYWRpbmcgdGhlCisJCQkJICogaW5vZGUncyBidWZmZXIgaW4gZnJvbSBkaXNrLCB3ZSBkcm9wIHRoZQorCQkJCSAqIGlub2RlIGxvY2sgd2hpbGUgcmVhZGluZyBpbiB0aGUgaW5vZGUKKwkJCQkgKiBidWZmZXIuICBXZSBoYXZlIHRvIHJlbGVhc2UgdGhlIGJ1ZmZlcgorCQkJCSAqIGFuZCByZWFjcXVpcmUgdGhlIGlub2RlIGxvY2sgc28gdGhhdCB0aGV5CisJCQkJICogYXJlIGFjcXVpcmVkIGluIHRoZSBwcm9wZXIgb3JkZXIgKGlub2RlCisJCQkJICogbG9ja3MgZmlyc3QpLiAgVGhlIGJ1ZmZlciB3aWxsIGdvIGF0IHRoZQorCQkJCSAqIGVuZCBvZiB0aGUgbHJ1IGNoYWluLCB0aG91Z2gsIHNvIHdlIGNhbgorCQkJCSAqIGV4cGVjdCBpdCB0byBzdGlsbCBiZSB0aGVyZSB3aGVuIHdlIGdvCisJCQkJICogZm9yIGl0IGFnYWluIGluIHhmc19pZmx1c2goKS4KKwkJCQkgKi8KKwkJCQlpZiAoKHhmc19pcGluY291bnQoaXApID09IDApICYmCisJCQkJICAgIHhmc19pZmxvY2tfbm93YWl0KGlwKSkgeworCisJCQkJCXhmc19pZnVubG9jayhpcCk7CisJCQkJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKworCQkJCQllcnJvciA9IHhmc19pdG9icChtcCwgTlVMTCwgaXAsCisJCQkJCQkJICAmZGlwLCAmYnAsIDApOworCQkJCQlpZiAoIWVycm9yKSB7CisJCQkJCQl4ZnNfYnVmX3JlbHNlKGJwKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8qIEJhaWxpbmcgb3V0LCByZW1vdmUgdGhlCisJCQkJCQkgKiBtYXJrZXIgYW5kIGZyZWUgaXQuCisJCQkJCQkgKi8KKwkJCQkJCVhGU19NT1VOVF9JTE9DSyhtcCk7CisKKwkJCQkJCUlQT0lOVEVSX1JFTU9WRShpcCwgbXApOworCisJCQkJCQlYRlNfTU9VTlRfSVVOTE9DSyhtcCk7CisKKwkJCQkJCUFTU0VSVCghKGxvY2tfZmxhZ3MgJgorCQkJCQkJCVhGU19JT0xPQ0tfU0hBUkVEKSk7CisKKwkJCQkJCWttZW1fZnJlZShpcG9pbnRlciwKKwkJCQkJCQlzaXplb2YoeGZzX2lwdHJfdCkpOworCQkJCQkJcmV0dXJuICgwKTsKKwkJCQkJfQorCisJCQkJCS8qCisJCQkJCSAqIFNpbmNlIHdlIGRyb3BwZWQgdGhlIGlub2RlIGxvY2ssCisJCQkJCSAqIHRoZSBpbm9kZSBtYXkgaGF2ZSBiZWVuIHJlY2xhaW1lZC4KKwkJCQkJICogVGhlcmVmb3JlLCB3ZSByZWFjcXVpcmUgdGhlIG1vdW50CisJCQkJCSAqIGxvY2sgYW5kIGNoZWNrIHRvIHNlZSBpZiB3ZSB3ZXJlIHRoZQorCQkJCQkgKiBpbm9kZSByZWNsYWltZWQuIElmIHRoaXMgaGFwcGVuZWQKKwkJCQkJICogdGhlbiB0aGUgaXBvaW50ZXIgbWFya2VyIHdpbGwgbm8KKwkJCQkJICogbG9uZ2VyIHBvaW50IGJhY2sgYXQgdXMuIEluIHRoaXMKKwkJCQkJICogY2FzZSwgbW92ZSBpcCBhbG9uZyB0byB0aGUgaW5vZGUKKwkJCQkJICogYWZ0ZXIgdGhlIG1hcmtlciwgcmVtb3ZlIHRoZSBtYXJrZXIKKwkJCQkJICogYW5kIGNvbnRpbnVlLgorCQkJCQkgKi8KKwkJCQkJWEZTX01PVU5UX0lMT0NLKG1wKTsKKwkJCQkJbW91bnRfbG9ja2VkID0gQl9UUlVFOworCisJCQkJCWlmIChpcCAhPSBpcG9pbnRlci0+aXBfbXByZXYpIHsKKwkJCQkJCUlQT0lOVEVSX1JFTU9WRShpcCwgbXApOworCisJCQkJCQlBU1NFUlQoIXZub2RlX3JlZmVkKTsKKwkJCQkJCUFTU0VSVCghKGxvY2tfZmxhZ3MgJgorCQkJCQkJCVhGU19JT0xPQ0tfU0hBUkVEKSk7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCisJCQkJCUFTU0VSVChpcC0+aV9tb3VudCA9PSBtcCk7CisKKwkJCQkJaWYgKHhmc19pbG9ja19ub3dhaXQoaXAsCisJCQkJCQkgICAgWEZTX0lMT0NLX1NIQVJFRCkgPT0gMCkgeworCQkJCQkJQVNTRVJUKGlwLT5pX21vdW50ID09IG1wKTsKKwkJCQkJCS8qCisJCQkJCQkgKiBXZSBmYWlsZWQgdG8gcmVhY3F1aXJlCisJCQkJCQkgKiB0aGUgaW5vZGUgbG9jayB3aXRob3V0CisJCQkJCQkgKiBzbGVlcGluZywgc28ganVzdCBza2lwCisJCQkJCQkgKiB0aGUgaW5vZGUgZm9yIG5vdy4gIFdlCisJCQkJCQkgKiBjbGVhciB0aGUgSUxPQ0sgYml0IGZyb20KKwkJCQkJCSAqIHRoZSBsb2NrX2ZsYWdzIHNvIHRoYXQgd2UKKwkJCQkJCSAqIHdvbid0IHRyeSB0byBkcm9wIGEgbG9jaworCQkJCQkJICogd2UgZG9uJ3QgaG9sZCBiZWxvdy4KKwkJCQkJCSAqLworCQkJCQkJbG9ja19mbGFncyAmPSB+WEZTX0lMT0NLX1NIQVJFRDsKKwkJCQkJCUlQT0lOVEVSX1JFTU9WRShpcF9uZXh0LCBtcCk7CisJCQkJCX0gZWxzZSBpZiAoKHhmc19pcGluY291bnQoaXApID09IDApICYmCisJCQkJCQkgICB4ZnNfaWZsb2NrX25vd2FpdChpcCkpIHsKKwkJCQkJCUFTU0VSVChpcC0+aV9tb3VudCA9PSBtcCk7CisJCQkJCQkvKgorCQkJCQkJICogU2luY2UgdGhpcyBpcyB2ZnNfc3luYygpCisJCQkJCQkgKiBjYWxsaW5nIHdlIG9ubHkgZmx1c2ggdGhlCisJCQkJCQkgKiBpbm9kZSBvdXQgaWYgd2UgY2FuIGxvY2sKKwkJCQkJCSAqIGl0IHdpdGhvdXQgc2xlZXBpbmcgYW5kCisJCQkJCQkgKiBpdCBpcyBub3QgcGlubmVkLiAgRHJvcAorCQkJCQkJICogdGhlIG1vdW50IGxvY2sgaGVyZSBzbworCQkJCQkJICogdGhhdCB3ZSBkb24ndCBob2xkIGl0IGZvcgorCQkJCQkJICogdG9vIGxvbmcuIFdlIGFscmVhZHkgaGF2ZQorCQkJCQkJICogYSBtYXJrZXIgaW4gdGhlIGxpc3QgaGVyZS4KKwkJCQkJCSAqLworCQkJCQkJWEZTX01PVU5UX0lVTkxPQ0sobXApOworCQkJCQkJbW91bnRfbG9ja2VkID0gQl9GQUxTRTsKKwkJCQkJCWVycm9yID0geGZzX2lmbHVzaChpcCwKKwkJCQkJCQkgICBYRlNfSUZMVVNIX0RFTFdSSSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlBU1NFUlQoaXAtPmlfbW91bnQgPT0gbXApOworCQkJCQkJSVBPSU5URVJfUkVNT1ZFKGlwX25leHQsIG1wKTsKKwkJCQkJfQorCQkJCX0KKworCQkJfQorCisJCX0gZWxzZSB7CisJCQlpZiAoKGZsYWdzICYgU1lOQ19BVFRSKSAmJgorCQkJICAgICgoaXAtPmlfdXBkYXRlX2NvcmUpIHx8CisJCQkgICAgICgoaXAtPmlfaXRlbXAgIT0gTlVMTCkgJiYKKwkJCSAgICAgIChpcC0+aV9pdGVtcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICE9IDApKSkpIHsKKwkJCQlpZiAobW91bnRfbG9ja2VkKSB7CisJCQkJCUlQT0lOVEVSX0lOU0VSVChpcCwgbXApOworCQkJCX0KKworCQkJCWlmIChmbGFncyAmIFNZTkNfV0FJVCkgeworCQkJCQl4ZnNfaWZsb2NrKGlwKTsKKwkJCQkJZXJyb3IgPSB4ZnNfaWZsdXNoKGlwLAorCQkJCQkJCSAgIFhGU19JRkxVU0hfU1lOQyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyoKKwkJCQkJICogSWYgd2UgY2FuJ3QgYWNxdWlyZSB0aGUgZmx1c2gKKwkJCQkJICogbG9jaywgdGhlbiB0aGUgaW5vZGUgaXMgYWxyZWFkeQorCQkJCQkgKiBiZWluZyBmbHVzaGVkIHNvIGRvbid0IGJvdGhlcgorCQkJCQkgKiB3YWl0aW5nLiAgSWYgd2UgY2FuIGxvY2sgaXQgdGhlbgorCQkJCQkgKiBkbyBhIGRlbHdyaSBmbHVzaCBzbyB3ZSBjYW4KKwkJCQkJICogY29tYmluZSBtdWx0aXBsZSBpbm9kZSBmbHVzaGVzCisJCQkJCSAqIGluIGVhY2ggZGlzayB3cml0ZS4KKwkJCQkJICovCisJCQkJCWlmICh4ZnNfaWZsb2NrX25vd2FpdChpcCkpIHsKKwkJCQkJCWVycm9yID0geGZzX2lmbHVzaChpcCwKKwkJCQkJCQkgICBYRlNfSUZMVVNIX0RFTFdSSSk7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAoYnlwYXNzZWQpCisJCQkJCQkoKmJ5cGFzc2VkKSsrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChsb2NrX2ZsYWdzICE9IDApIHsKKwkJCXhmc19pdW5sb2NrKGlwLCBsb2NrX2ZsYWdzKTsKKwkJfQorCisJCWlmICh2bm9kZV9yZWZlZCkgeworCQkJLyoKKwkJCSAqIElmIHdlIGhhZCB0byB0YWtlIGEgcmVmZXJlbmNlIG9uIHRoZSB2bm9kZQorCQkJICogYWJvdmUsIHRoZW4gd2FpdCB1bnRpbCBhZnRlciB3ZSd2ZSB1bmxvY2tlZAorCQkJICogdGhlIGlub2RlIHRvIHJlbGVhc2UgdGhlIHJlZmVyZW5jZS4gIFRoaXMgaXMKKwkJCSAqIGJlY2F1c2Ugd2UgY2FuIGJlIGFscmVhZHkgaG9sZGluZyB0aGUgaW5vZGUKKwkJCSAqIGxvY2sgd2hlbiBWTl9SRUxFKCkgY2FsbHMgeGZzX2luYWN0aXZlKCkuCisJCQkgKgorCQkJICogTWFrZSBzdXJlIHRvIGRyb3AgdGhlIG1vdW50IGxvY2sgYmVmb3JlIGNhbGxpbmcKKwkJCSAqIFZOX1JFTEUoKSBzbyB0aGF0IHdlIGRvbid0IHRyaXAgb3ZlciBvdXJzZWx2ZXMgaWYKKwkJCSAqIHdlIGhhdmUgdG8gZ28gZm9yIHRoZSBtb3VudCBsb2NrIGFnYWluIGluIHRoZQorCQkJICogaW5hY3RpdmUgY29kZS4KKwkJCSAqLworCQkJaWYgKG1vdW50X2xvY2tlZCkgeworCQkJCUlQT0lOVEVSX0lOU0VSVChpcCwgbXApOworCQkJfQorCisJCQlWTl9SRUxFKHZwKTsKKworCQkJdm5vZGVfcmVmZWQgPSBCX0ZBTFNFOworCQl9CisKKwkJaWYgKGVycm9yKSB7CisJCQlsYXN0X2Vycm9yID0gZXJyb3I7CisJCX0KKworCQkvKgorCQkgKiBiYWlsIG91dCBpZiB0aGUgZmlsZXN5c3RlbSBpcyBjb3JydXB0ZWQuCisJCSAqLworCQlpZiAoZXJyb3IgPT0gRUZTQ09SUlVQVEVEKSAgeworCQkJaWYgKCFtb3VudF9sb2NrZWQpIHsKKwkJCQlYRlNfTU9VTlRfSUxPQ0sobXApOworCQkJCUlQT0lOVEVSX1JFTU9WRShpcCwgbXApOworCQkJfQorCQkJWEZTX01PVU5UX0lVTkxPQ0sobXApOworCQkJQVNTRVJUKGlwb2ludGVyX2luID09IEJfRkFMU0UpOworCQkJa21lbV9mcmVlKGlwb2ludGVyLCBzaXplb2YoeGZzX2lwdHJfdCkpOworCQkJcmV0dXJuIFhGU19FUlJPUihlcnJvcik7CisJCX0KKworCQkvKiBMZXQgb3RoZXIgdGhyZWFkcyBoYXZlIGEgY2hhbmNlIGF0IHRoZSBtb3VudCBsb2NrCisJCSAqIGlmIHdlIGhhdmUgbG9vcGVkIG1hbnkgdGltZXMgd2l0aG91dCBkcm9wcGluZyB0aGUKKwkJICogbG9jay4KKwkJICovCisJCWlmICgoKytwcmVlbXB0ICYgWEZTX1BSRUVNUFRfTUFTSykgPT0gMCkgeworCQkJaWYgKG1vdW50X2xvY2tlZCkgeworCQkJCUlQT0lOVEVSX0lOU0VSVChpcCwgbXApOworCQkJfQorCQl9CisKKwkJaWYgKG1vdW50X2xvY2tlZCA9PSBCX0ZBTFNFKSB7CisJCQlYRlNfTU9VTlRfSUxPQ0sobXApOworCQkJbW91bnRfbG9ja2VkID0gQl9UUlVFOworCQkJSVBPSU5URVJfUkVNT1ZFKGlwLCBtcCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCUFTU0VSVChpcG9pbnRlcl9pbiA9PSBCX0ZBTFNFKTsKKwkJaXAgPSBpcC0+aV9tbmV4dDsKKworCX0gd2hpbGUgKGlwICE9IG1wLT5tX2lub2Rlcyk7CisKKwlYRlNfTU9VTlRfSVVOTE9DSyhtcCk7CisKKwlBU1NFUlQoaXBvaW50ZXJfaW4gPT0gQl9GQUxTRSk7CisKKwlrbWVtX2ZyZWUoaXBvaW50ZXIsIHNpemVvZih4ZnNfaXB0cl90KSk7CisJcmV0dXJuIFhGU19FUlJPUihsYXN0X2Vycm9yKTsKK30KKworLyoKKyAqIHhmcyBzeW5jIHJvdXRpbmUgZm9yIGludGVybmFsIHVzZQorICoKKyAqIFRoaXMgcm91dGluZSBzdXBwb3J0cyBhbGwgb2YgdGhlIGZsYWdzIGRlZmluZWQgZm9yIHRoZSBnZW5lcmljIFZGU19TWU5DCisgKiBpbnRlcmZhY2UgYXMgZXhwbGFpbmVkIGFib3ZlIHVuZGVyIHhmc19zeW5jLiAgSW4gdGhlIGludGVyZXN0cyBvZiBub3QKKyAqIGNoYW5naW5nIGludGVyZmFjZXMgd2l0aGluIHRoZSA2LjUgZmFtaWx5LCBhZGRpdGlvbmFsIGludGVybmFsbGx5LQorICogcmVxdWlyZWQgZnVuY3Rpb25zIGFyZSBzcGVjaWZpZWQgd2l0aGluIGEgc2VwYXJhdGUgeGZsYWdzIHBhcmFtZXRlciwKKyAqIG9ubHkgYXZhaWxhYmxlIGJ5IGNhbGxpbmcgdGhpcyByb3V0aW5lLgorICoKKyAqLworaW50Cit4ZnNfc3luY3N1YigKKwl4ZnNfbW91bnRfdAkqbXAsCisJaW50CQlmbGFncywKKwlpbnQgICAgICAgICAgICAgeGZsYWdzLAorCWludCAgICAgICAgICAgICAqYnlwYXNzZWQpCit7CisJaW50CQllcnJvciA9IDA7CisJaW50CQlsYXN0X2Vycm9yID0gMDsKKwl1aW50CQlsb2dfZmxhZ3MgPSBYRlNfTE9HX0ZPUkNFOworCXhmc19idWZfdAkqYnA7CisJeGZzX2J1Zl9sb2dfaXRlbV90CSpiaXA7CisKKwkvKgorCSAqIFN5bmMgb3V0IHRoZSBsb2cuICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgbG9nIGlzIHBlcmlvZGljYWxseQorCSAqIGZsdXNoZWQgZXZlbiBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIGFjdGl2aXR5IHRvIGZpbGwgaXQgdXAuCisJICovCisJaWYgKGZsYWdzICYgU1lOQ19XQUlUKQorCQlsb2dfZmxhZ3MgfD0gWEZTX0xPR19TWU5DOworCisJeGZzX2xvZ19mb3JjZShtcCwgKHhmc19sc25fdCkwLCBsb2dfZmxhZ3MpOworCisJaWYgKGZsYWdzICYgKFNZTkNfQVRUUnxTWU5DX0RFTFdSSSkpIHsKKwkJaWYgKGZsYWdzICYgU1lOQ19CREZMVVNIKQorCQkJeGZzX2ZpbmlzaF9yZWNsYWltX2FsbChtcCwgMSk7CisJCWVsc2UKKwkJCWVycm9yID0geGZzX3N5bmNfaW5vZGVzKG1wLCBmbGFncywgeGZsYWdzLCBieXBhc3NlZCk7CisJfQorCisJLyoKKwkgKiBGbHVzaGluZyBvdXQgZGlydHkgZGF0YSBhYm92ZSBwcm9iYWJseSBnZW5lcmF0ZWQgbW9yZQorCSAqIGxvZyBhY3Rpdml0eSwgc28gaWYgdGhpcyBpc24ndCB2ZnNfc3luYygpIHRoZW4gZmx1c2gKKwkgKiB0aGUgbG9nIGFnYWluLgorCSAqLworCWlmIChmbGFncyAmIFNZTkNfREVMV1JJKSB7CisJCXhmc19sb2dfZm9yY2UobXAsICh4ZnNfbHNuX3QpMCwgbG9nX2ZsYWdzKTsKKwl9CisKKwlpZiAoZmxhZ3MgJiBTWU5DX0ZTREFUQSkgeworCQkvKgorCQkgKiBJZiB0aGlzIGlzIHZmc19zeW5jKCkgdGhlbiBvbmx5IHN5bmMgdGhlIHN1cGVyYmxvY2sKKwkJICogaWYgd2UgY2FuIGxvY2sgaXQgd2l0aG91dCBzbGVlcGluZyBhbmQgaXQgaXMgbm90IHBpbm5lZC4KKwkJICovCisJCWlmIChmbGFncyAmIFNZTkNfQkRGTFVTSCkgeworCQkJYnAgPSB4ZnNfZ2V0c2IobXAsIFhGU19CVUZfVFJZTE9DSyk7CisJCQlpZiAoYnAgIT0gTlVMTCkgeworCQkJCWJpcCA9IFhGU19CVUZfRlNQUklWQVRFKGJwLHhmc19idWZfbG9nX2l0ZW1fdCopOworCQkJCWlmICgoYmlwICE9IE5VTEwpICYmCisJCQkJICAgIHhmc19idWZfaXRlbV9kaXJ0eShiaXApKSB7CisJCQkJCWlmICghKFhGU19CVUZfSVNQSU5ORUQoYnApKSkgeworCQkJCQkJWEZTX0JVRl9BU1lOQyhicCk7CisJCQkJCQllcnJvciA9IHhmc19id3JpdGUobXAsIGJwKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXhmc19idWZfcmVsc2UoYnApOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJeGZzX2J1Zl9yZWxzZShicCk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJYnAgPSB4ZnNfZ2V0c2IobXAsIDApOworCQkJLyoKKwkJCSAqIElmIHRoZSBidWZmZXIgaXMgcGlubmVkIHRoZW4gcHVzaCBvbiB0aGUgbG9nIHNvCisJCQkgKiB3ZSB3b24ndCBnZXQgc3R1Y2sgd2FpdGluZyBpbiB0aGUgd3JpdGUgZm9yCisJCQkgKiBzb21lb25lLCBtYXliZSBvdXJzZWx2ZXMsIHRvIGZsdXNoIHRoZSBsb2cuCisJCQkgKiBFdmVuIHRob3VnaCB3ZSBqdXN0IHB1c2hlZCB0aGUgbG9nIGFib3ZlLCB3ZQorCQkJICogZGlkIG5vdCBoYXZlIHRoZSBzdXBlcmJsb2NrIGJ1ZmZlciBsb2NrZWQgYXQKKwkJCSAqIHRoYXQgcG9pbnQgc28gaXQgY2FuIGJlY29tZSBwaW5uZWQgaW4gYmV0d2VlbgorCQkJICogdGhlcmUgYW5kIGhlcmUuCisJCQkgKi8KKwkJCWlmIChYRlNfQlVGX0lTUElOTkVEKGJwKSkKKwkJCQl4ZnNfbG9nX2ZvcmNlKG1wLCAoeGZzX2xzbl90KTAsIFhGU19MT0dfRk9SQ0UpOworCQkJaWYgKGZsYWdzICYgU1lOQ19XQUlUKQorCQkJCVhGU19CVUZfVU5BU1lOQyhicCk7CisJCQllbHNlCisJCQkJWEZTX0JVRl9BU1lOQyhicCk7CisJCQllcnJvciA9IHhmc19id3JpdGUobXAsIGJwKTsKKwkJfQorCQlpZiAoZXJyb3IpIHsKKwkJCWxhc3RfZXJyb3IgPSBlcnJvcjsKKwkJfQorCX0KKworCS8qCisJICogSWYgdGhpcyBpcyB0aGUgcGVyaW9kaWMgc3luYywgdGhlbiBraWNrIHNvbWUgZW50cmllcyBvdXQgb2YKKwkgKiB0aGUgcmVmZXJlbmNlIGNhY2hlLiAgVGhpcyBlbnN1cmVzIHRoYXQgaWRsZSBlbnRyaWVzIGFyZQorCSAqIGV2ZW50dWFsbHkga2lja2VkIG91dCBvZiB0aGUgY2FjaGUuCisJICovCisJaWYgKGZsYWdzICYgU1lOQ19SRUZDQUNIRSkgeworCQl4ZnNfcmVmY2FjaGVfcHVyZ2Vfc29tZShtcCk7CisJfQorCisJLyoKKwkgKiBOb3cgY2hlY2sgdG8gc2VlIGlmIHRoZSBsb2cgbmVlZHMgYSAiZHVtbXkiIHRyYW5zYWN0aW9uLgorCSAqLworCisJaWYgKCEoZmxhZ3MgJiBTWU5DX1JFTU9VTlQpICYmIHhmc19sb2dfbmVlZF9jb3ZlcmVkKG1wKSkgeworCQl4ZnNfdHJhbnNfdCAqdHA7CisJCXhmc19pbm9kZV90ICppcDsKKworCQkvKgorCQkgKiBQdXQgYSBkdW1teSB0cmFuc2FjdGlvbiBpbiB0aGUgbG9nIHRvIHRlbGwKKwkJICogcmVjb3ZlcnkgdGhhdCBhbGwgb3RoZXJzIGFyZSBPSy4KKwkJICovCisJCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfRFVNTVkxKTsKKwkJaWYgKChlcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCAwLAorCQkJCVhGU19JQ0hBTkdFX0xPR19SRVMobXApLAorCQkJCTAsIDAsIDApKSkgIHsKKwkJCXhmc190cmFuc19jYW5jZWwodHAsIDApOworCQkJcmV0dXJuIGVycm9yOworCQl9CisKKwkJaXAgPSBtcC0+bV9yb290aXA7CisJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCisJCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKKwkJeGZzX3RyYW5zX2lob2xkKHRwLCBpcCk7CisJCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLCBYRlNfSUxPR19DT1JFKTsKKwkJZXJyb3IgPSB4ZnNfdHJhbnNfY29tbWl0KHRwLCAwLCBOVUxMKTsKKwkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwkJeGZzX2xvZ19mb3JjZShtcCwgKHhmc19sc25fdCkwLCBsb2dfZmxhZ3MpOworCX0KKworCS8qCisJICogV2hlbiBzaHV0dGluZyBkb3duLCB3ZSBuZWVkIHRvIGluc3VyZSB0aGF0IHRoZSBBSUwgaXMgcHVzaGVkCisJICogdG8gZGlzayBvciB0aGUgZmlsZXN5c3RlbSBjYW4gYXBwZWFyIGNvcnJ1cHQgZnJvbSB0aGUgUFJPTS4KKwkgKi8KKwlpZiAoKGZsYWdzICYgKFNZTkNfQ0xPU0V8U1lOQ19XQUlUKSkgPT0gKFNZTkNfQ0xPU0V8U1lOQ19XQUlUKSkgeworCQlYRlNfYmZsdXNoKG1wLT5tX2RkZXZfdGFyZ3ApOworCQlpZiAobXAtPm1fcnRkZXZfdGFyZ3ApIHsKKwkJCVhGU19iZmx1c2gobXAtPm1fcnRkZXZfdGFyZ3ApOworCQl9CisJfQorCisJcmV0dXJuIFhGU19FUlJPUihsYXN0X2Vycm9yKTsKK30KKworLyoKKyAqIHhmc192Z2V0IC0gY2FsbGVkIGJ5IERNQVBJIGFuZCBORlNEIHRvIGdldCB2bm9kZSBmcm9tIGZpbGUgaGFuZGxlCisgKi8KK1NUQVRJQyBpbnQKK3hmc192Z2V0KAorCWJodl9kZXNjX3QJKmJkcCwKKwl2bm9kZV90CQkqKnZwcCwKKwlmaWRfdAkJKmZpZHApCit7CisJeGZzX21vdW50X3QJKm1wID0gWEZTX0JIVlRPTShiZHApOworCXhmc19maWRfdAkqeGZpZCA9IChzdHJ1Y3QgeGZzX2ZpZCAqKWZpZHA7CisJeGZzX2lub2RlX3QJKmlwOworCWludAkJZXJyb3I7CisJeGZzX2lub190CWlubzsKKwl1bnNpZ25lZCBpbnQJaWdlbjsKKworCS8qCisJICogSW52YWxpZC4gIFNpbmNlIGhhbmRsZXMgY2FuIGJlIGNyZWF0ZWQgaW4gdXNlciBzcGFjZSBhbmQgcGFzc2VkIGluCisJICogdmlhIGdldGhhbmRsZSgpLCB0aGlzIGlzIG5vdCBjYXVzZSBmb3IgYSBwYW5pYy4KKwkgKi8KKwlpZiAoeGZpZC0+eGZzX2ZpZF9sZW4gIT0gc2l6ZW9mKCp4ZmlkKSAtIHNpemVvZih4ZmlkLT54ZnNfZmlkX2xlbikpCisJCXJldHVybiBYRlNfRVJST1IoRUlOVkFMKTsKKworCWlubyAgPSB4ZmlkLT54ZnNfZmlkX2lubzsKKwlpZ2VuID0geGZpZC0+eGZzX2ZpZF9nZW47CisKKwkvKgorCSAqIE5GUyBjYW4gc29tZXRpbWVzIHNlbmQgcmVxdWVzdHMgZm9yIGlubyAwLiAgRmFpbCB0aGVtIGdyYWNlZnVsbHkuCisJICovCisJaWYgKGlubyA9PSAwKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVTVEFMRSk7CisKKwllcnJvciA9IHhmc19pZ2V0KG1wLCBOVUxMLCBpbm8sIDAsIFhGU19JTE9DS19TSEFSRUQsICZpcCwgMCk7CisJaWYgKGVycm9yKSB7CisJCSp2cHAgPSBOVUxMOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJaWYgKGlwID09IE5VTEwpIHsKKwkJKnZwcCA9IE5VTEw7CisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKwl9CisKKwlpZiAoaXAtPmlfZC5kaV9tb2RlID09IDAgfHwgaXAtPmlfZC5kaV9nZW4gIT0gaWdlbikgeworCQl4ZnNfaXB1dF9uZXcoaXAsIFhGU19JTE9DS19TSEFSRUQpOworCQkqdnBwID0gTlVMTDsKKwkJcmV0dXJuIFhGU19FUlJPUihFTk9FTlQpOworCX0KKworCSp2cHAgPSBYRlNfSVRPVihpcCk7CisJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOworCXJldHVybiAwOworfQorCisKKyNkZWZpbmUgTU5UT1BUX0xPR0JVRlMJImxvZ2J1ZnMiCS8qIG51bWJlciBvZiBYRlMgbG9nIGJ1ZmZlcnMgKi8KKyNkZWZpbmUgTU5UT1BUX0xPR0JTSVpFCSJsb2dic2l6ZSIJLyogc2l6ZSBvZiBYRlMgbG9nIGJ1ZmZlcnMgKi8KKyNkZWZpbmUgTU5UT1BUX0xPR0RFVgkibG9nZGV2IgkvKiBsb2cgZGV2aWNlICovCisjZGVmaW5lIE1OVE9QVF9SVERFVgkicnRkZXYiCQkvKiByZWFsdGltZSBJL08gZGV2aWNlICovCisjZGVmaW5lIE1OVE9QVF9CSU9TSVpFCSJiaW9zaXplIgkvKiBsb2cyIG9mIHByZWZlcnJlZCBidWZmZXJlZCBpbyBzaXplICovCisjZGVmaW5lIE1OVE9QVF9XU1lOQwkid3N5bmMiCQkvKiBzYWZlLW1vZGUgbmZzIGNvbXBhdGlibGUgbW91bnQgKi8KKyNkZWZpbmUgTU5UT1BUX0lOTzY0CSJpbm82NCIJCS8qIGZvcmNlIGlub2RlcyBpbnRvIDY0LWJpdCByYW5nZSAqLworI2RlZmluZSBNTlRPUFRfTk9BTElHTgkibm9hbGlnbiIJLyogdHVybiBvZmYgc3RyaXBlIGFsaWdubWVudCAqLworI2RlZmluZSBNTlRPUFRfU1dBTExPQwkic3dhbGxvYyIJLyogdHVybiBvbiBzdHJpcGUgd2lkdGggYWxsb2NhdGlvbiAqLworI2RlZmluZSBNTlRPUFRfU1VOSVQJInN1bml0IgkJLyogZGF0YSB2b2x1bWUgc3RyaXBlIHVuaXQgKi8KKyNkZWZpbmUgTU5UT1BUX1NXSURUSAkic3dpZHRoIgkvKiBkYXRhIHZvbHVtZSBzdHJpcGUgd2lkdGggKi8KKyNkZWZpbmUgTU5UT1BUX05PVVVJRAkibm91dWlkIgkvKiBpZ25vcmUgZmlsZXN5c3RlbSBVVUlEICovCisjZGVmaW5lIE1OVE9QVF9NVFBUCSJtdHB0IgkJLyogZmlsZXN5c3RlbSBtb3VudCBwb2ludCAqLworI2RlZmluZSBNTlRPUFRfSUhBU0hTSVpFICAgICJpaGFzaHNpemUiICAgIC8qIHNpemUgb2YgaW5vZGUgaGFzaCB0YWJsZSAqLworI2RlZmluZSBNTlRPUFRfTk9SRUNPVkVSWSAgICJub3JlY292ZXJ5IiAgIC8qIGRvbid0IHJ1biBYRlMgcmVjb3ZlcnkgKi8KKyNkZWZpbmUgTU5UT1BUX05PTE9HRkxVU0ggICAibm9sb2dmbHVzaCIgICAvKiBkb24ndCBoYXJkIGZsdXNoIG9uIGxvZyB3cml0ZXMgKi8KKyNkZWZpbmUgTU5UT1BUX09TWU5DSVNPU1lOQyAib3N5bmNpc29zeW5jIiAvKiBvX3N5bmMgaXMgUkVBTExZIG9fc3luYyAqLworI2RlZmluZSBNTlRPUFRfNjRCSVRJTk9ERSAgICJpbm9kZTY0IgkvKiBpbm9kZXMgY2FuIGJlIGFsbG9jYXRlZCBhbnl3aGVyZSAqLworI2RlZmluZSBNTlRPUFRfSUtFRVAJImlrZWVwIgkJLyogZG8gbm90IGZyZWUgZW1wdHkgaW5vZGUgY2x1c3RlcnMgKi8KKyNkZWZpbmUgTU5UT1BUX05PSUtFRVAJIm5vaWtlZXAiCS8qIGZyZWUgZW1wdHkgaW5vZGUgY2x1c3RlcnMgKi8KKworCitpbnQKK3hmc19wYXJzZWFyZ3MoCisJc3RydWN0IGJodl9kZXNjCQkqYmh2LAorCWNoYXIJCQkqb3B0aW9ucywKKwlzdHJ1Y3QgeGZzX21vdW50X2FyZ3MJKmFyZ3MsCisJaW50CQkJdXBkYXRlKQoreworCXN0cnVjdCB2ZnMJCSp2ZnNwID0gYmh2dG92ZnMoYmh2KTsKKwljaGFyCQkJKnRoaXNfY2hhciwgKnZhbHVlLCAqZW92OworCWludAkJCWRzdW5pdCwgZHN3aWR0aCwgdm9sX2RzdW5pdCwgdm9sX2Rzd2lkdGg7CisJaW50CQkJaW9zaXplOworCisjaWYgMAkvKiBYWFg6IG9mZiBieSBkZWZhdWx0LCB1bnRpbCBzb21lIHJlbWFpbmluZyBpc3N1ZXMgaXJvbmVkIG91dCAqLworCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9JREVMRVRFOyAvKiBkZWZhdWx0IHRvIG9uICovCisjZW5kaWYKKworCWlmICghb3B0aW9ucykKKwkJcmV0dXJuIDA7CisKKwlpb3NpemUgPSBkc3VuaXQgPSBkc3dpZHRoID0gdm9sX2RzdW5pdCA9IHZvbF9kc3dpZHRoID0gMDsKKworCXdoaWxlICgodGhpc19jaGFyID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7CisJCWlmICghKnRoaXNfY2hhcikKKwkJCWNvbnRpbnVlOworCQlpZiAoKHZhbHVlID0gc3RyY2hyKHRoaXNfY2hhciwgJz0nKSkgIT0gTlVMTCkKKwkJCSp2YWx1ZSsrID0gMDsKKworCQlpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9MT0dCVUZTKSkgeworCQkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKSB7CisJCQkJcHJpbnRrKCJYRlM6ICVzIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudFxuIiwKKwkJCQkJTU5UT1BUX0xPR0JVRlMpOworCQkJCXJldHVybiBFSU5WQUw7CisJCQl9CisJCQlhcmdzLT5sb2didWZzID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsICZlb3YsIDEwKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX0xPR0JTSVpFKSkgeworCQkJaW50CWxhc3QsIGluX2tpbG9ieXRlcyA9IDA7CisKKwkJCWlmICghdmFsdWUgfHwgISp2YWx1ZSkgeworCQkJCXByaW50aygiWEZTOiAlcyBvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnRcbiIsCisJCQkJCU1OVE9QVF9MT0dCU0laRSk7CisJCQkJcmV0dXJuIEVJTlZBTDsKKwkJCX0KKwkJCWxhc3QgPSBzdHJsZW4odmFsdWUpIC0gMTsKKwkJCWlmICh2YWx1ZVtsYXN0XSA9PSAnSycgfHwgdmFsdWVbbGFzdF0gPT0gJ2snKSB7CisJCQkJaW5fa2lsb2J5dGVzID0gMTsKKwkJCQl2YWx1ZVtsYXN0XSA9ICdcMCc7CisJCQl9CisJCQlhcmdzLT5sb2didWZzaXplID0gc2ltcGxlX3N0cnRvdWwodmFsdWUsICZlb3YsIDEwKTsKKwkJCWlmIChpbl9raWxvYnl0ZXMpCisJCQkJYXJncy0+bG9nYnVmc2l6ZSA8PD0gMTA7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9MT0dERVYpKSB7CisJCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpIHsKKwkJCQlwcmludGsoIlhGUzogJXMgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iLAorCQkJCQlNTlRPUFRfTE9HREVWKTsKKwkJCQlyZXR1cm4gRUlOVkFMOworCQkJfQorCQkJc3RybmNweShhcmdzLT5sb2duYW1lLCB2YWx1ZSwgTUFYTkFNRUxFTik7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9NVFBUKSkgeworCQkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKSB7CisJCQkJcHJpbnRrKCJYRlM6ICVzIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudFxuIiwKKwkJCQkJTU5UT1BUX01UUFQpOworCQkJCXJldHVybiBFSU5WQUw7CisJCQl9CisJCQlzdHJuY3B5KGFyZ3MtPm10cHQsIHZhbHVlLCBNQVhOQU1FTEVOKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX1JUREVWKSkgeworCQkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKSB7CisJCQkJcHJpbnRrKCJYRlM6ICVzIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudFxuIiwKKwkJCQkJTU5UT1BUX1JUREVWKTsKKwkJCQlyZXR1cm4gRUlOVkFMOworCQkJfQorCQkJc3RybmNweShhcmdzLT5ydG5hbWUsIHZhbHVlLCBNQVhOQU1FTEVOKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX0JJT1NJWkUpKSB7CisJCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpIHsKKwkJCQlwcmludGsoIlhGUzogJXMgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iLAorCQkJCQlNTlRPUFRfQklPU0laRSk7IAorCQkJCXJldHVybiBFSU5WQUw7CisJCQl9CisJCQlpb3NpemUgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgJmVvdiwgMTApOworCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX0lPU0laRTsKKwkJCWFyZ3MtPmlvc2l6ZWxvZyA9ICh1aW50OF90KSBpb3NpemU7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9JSEFTSFNJWkUpKSB7CisJCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpIHsKKwkJCQlwcmludGsoIlhGUzogJXMgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iLAorCQkJCQl0aGlzX2NoYXIpOyAKKwkJCQlyZXR1cm4gRUlOVkFMOworCQkJfQorCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX0lIQVNIU0laRTsKKwkJCWFyZ3MtPmloYXNoc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsKHZhbHVlLCAmZW92LCAxMCk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9XU1lOQykpIHsKKwkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9XU1lOQzsKKwkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX09TWU5DSVNPU1lOQykpIHsKKwkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9PU1lOQ0lTT1NZTkM7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9OT1JFQ09WRVJZKSkgeworCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX05PUkVDT1ZFUlk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsIE1OVE9QVF9JTk82NCkpIHsKKwkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9JTk82NDsKKyNpZiAhWEZTX0JJR19JTlVNUworCQkJcHJpbnRrKCJYRlM6ICVzIG9wdGlvbiBub3QgYWxsb3dlZCBvbiB0aGlzIHN5c3RlbVxuIiwKKwkJCQlNTlRPUFRfSU5PNjQpOworCQkJcmV0dXJuIEVJTlZBTDsKKyNlbmRpZgorCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfTk9BTElHTikpIHsKKwkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9OT0FMSUdOOworCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfU1dBTExPQykpIHsKKwkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9TV0FMTE9DOworCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfU1VOSVQpKSB7CisJCQlpZiAoIXZhbHVlIHx8ICEqdmFsdWUpIHsKKwkJCQlwcmludGsoIlhGUzogJXMgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50XG4iLAorCQkJCQlNTlRPUFRfU1VOSVQpOworCQkJCXJldHVybiBFSU5WQUw7CisJCQl9CisJCQlkc3VuaXQgPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgJmVvdiwgMTApOworCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfU1dJRFRIKSkgeworCQkJaWYgKCF2YWx1ZSB8fCAhKnZhbHVlKSB7CisJCQkJcHJpbnRrKCJYRlM6ICVzIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudFxuIiwKKwkJCQkJTU5UT1BUX1NXSURUSCk7CisJCQkJcmV0dXJuIEVJTlZBTDsKKwkJCX0KKwkJCWRzd2lkdGggPSBzaW1wbGVfc3RydG91bCh2YWx1ZSwgJmVvdiwgMTApOworCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfNjRCSVRJTk9ERSkpIHsKKwkJCWFyZ3MtPmZsYWdzICY9IH5YRlNNTlRfMzJCSVRJTk9ERVM7CisjaWYgIVhGU19CSUdfSU5VTVMKKwkJCXByaW50aygiWEZTOiAlcyBvcHRpb24gbm90IGFsbG93ZWQgb24gdGhpcyBzeXN0ZW1cbiIsCisJCQkJTU5UT1BUXzY0QklUSU5PREUpOworCQkJcmV0dXJuIEVJTlZBTDsKKyNlbmRpZgorCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfTk9VVUlEKSkgeworCQkJYXJncy0+ZmxhZ3MgfD0gWEZTTU5UX05PVVVJRDsKKwkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX05PTE9HRkxVU0gpKSB7CisJCQlhcmdzLT5mbGFncyB8PSBYRlNNTlRfTk9MT0dGTFVTSDsKKwkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfY2hhciwgTU5UT1BUX0lLRUVQKSkgeworCQkJYXJncy0+ZmxhZ3MgJj0gflhGU01OVF9JREVMRVRFOworCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCBNTlRPUFRfTk9JS0VFUCkpIHsKKwkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9JREVMRVRFOworCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19jaGFyLCAib3N5bmNpc2RzeW5jIikpIHsKKwkJCS8qIG5vLW9wLCB0aGlzIGlzIG5vdyB0aGUgZGVmYXVsdCAqLworcHJpbnRrKCJYRlM6IG9zeW5jaXNkc3luYyBpcyBub3cgdGhlIGRlZmF1bHQsIG9wdGlvbiBpcyBkZXByZWNhdGVkLlxuIik7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh0aGlzX2NoYXIsICJpcml4c2dpZCIpKSB7CitwcmludGsoIlhGUzogaXJpeHNnaWQgaXMgbm93IGEgc3lzY3RsKDIpIHZhcmlhYmxlLCBvcHRpb24gaXMgZGVwcmVjYXRlZC5cbiIpOworCQl9IGVsc2UgeworCQkJcHJpbnRrKCJYRlM6IHVua25vd24gbW91bnQgb3B0aW9uIFslc10uXG4iLCB0aGlzX2NoYXIpOworCQkJcmV0dXJuIEVJTlZBTDsKKwkJfQorCX0KKworCWlmIChhcmdzLT5mbGFncyAmIFhGU01OVF9OT1JFQ09WRVJZKSB7CisJCWlmICgodmZzcC0+dmZzX2ZsYWcgJiBWRlNfUkRPTkxZKSA9PSAwKSB7CisJCQlwcmludGsoIlhGUzogbm8tcmVjb3ZlcnkgbW91bnRzIG11c3QgYmUgcmVhZC1vbmx5LlxuIik7CisJCQlyZXR1cm4gRUlOVkFMOworCQl9CisJfQorCisJaWYgKChhcmdzLT5mbGFncyAmIFhGU01OVF9OT0FMSUdOKSAmJiAoZHN1bml0IHx8IGRzd2lkdGgpKSB7CisJCXByaW50aygKKwkiWEZTOiBzdW5pdCBhbmQgc3dpZHRoIG9wdGlvbnMgaW5jb21wYXRpYmxlIHdpdGggdGhlIG5vYWxpZ24gb3B0aW9uXG4iKTsKKwkJcmV0dXJuIEVJTlZBTDsKKwl9CisKKwlpZiAoKGRzdW5pdCAmJiAhZHN3aWR0aCkgfHwgKCFkc3VuaXQgJiYgZHN3aWR0aCkpIHsKKwkJcHJpbnRrKCJYRlM6IHN1bml0IGFuZCBzd2lkdGggbXVzdCBiZSBzcGVjaWZpZWQgdG9nZXRoZXJcbiIpOworCQlyZXR1cm4gRUlOVkFMOworCX0KKworCWlmIChkc3VuaXQgJiYgKGRzd2lkdGggJSBkc3VuaXQgIT0gMCkpIHsKKwkJcHJpbnRrKAorCSJYRlM6IHN0cmlwZSB3aWR0aCAoJWQpIG11c3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgc3RyaXBlIHVuaXQgKCVkKVxuIiwKKwkJCWRzd2lkdGgsIGRzdW5pdCk7CisJCXJldHVybiBFSU5WQUw7CisJfQorCisJaWYgKChhcmdzLT5mbGFncyAmIFhGU01OVF9OT0FMSUdOKSAhPSBYRlNNTlRfTk9BTElHTikgeworCQlpZiAoZHN1bml0KSB7CisJCQlhcmdzLT5zdW5pdCA9IGRzdW5pdDsKKwkJCWFyZ3MtPmZsYWdzIHw9IFhGU01OVF9SRVRFUlI7CisJCX0gZWxzZSB7CisJCQlhcmdzLT5zdW5pdCA9IHZvbF9kc3VuaXQ7CisJCX0KKwkJZHN3aWR0aCA/IChhcmdzLT5zd2lkdGggPSBkc3dpZHRoKSA6CisJCQkgIChhcmdzLT5zd2lkdGggPSB2b2xfZHN3aWR0aCk7CisJfSBlbHNlIHsKKwkJYXJncy0+c3VuaXQgPSBhcmdzLT5zd2lkdGggPSAwOworCX0KKworCXJldHVybiAwOworfQorCitpbnQKK3hmc19zaG93YXJncygKKwlzdHJ1Y3QgYmh2X2Rlc2MJCSpiaHYsCisJc3RydWN0IHNlcV9maWxlCQkqbSkKK3sKKwlzdGF0aWMgc3RydWN0IHByb2NfeGZzX2luZm8geworCQlpbnQJZmxhZzsKKwkJY2hhcgkqc3RyOworCX0geGZzX2luZm9bXSA9IHsKKwkJLyogdGhlIGZldyBzaW1wbGUgb25lcyB3ZSBjYW4gZ2V0IGZyb20gdGhlIG1vdW50IHN0cnVjdCAqLworCQl7IFhGU19NT1VOVF9XU1lOQywJCSIsIiBNTlRPUFRfV1NZTkMgfSwKKwkJeyBYRlNfTU9VTlRfSU5PNjQsCQkiLCIgTU5UT1BUX0lOTzY0IH0sCisJCXsgWEZTX01PVU5UX05PQUxJR04sCQkiLCIgTU5UT1BUX05PQUxJR04gfSwKKwkJeyBYRlNfTU9VTlRfU1dBTExPQywJCSIsIiBNTlRPUFRfU1dBTExPQyB9LAorCQl7IFhGU19NT1VOVF9OT1VVSUQsCQkiLCIgTU5UT1BUX05PVVVJRCB9LAorCQl7IFhGU19NT1VOVF9OT1JFQ09WRVJZLAkJIiwiIE1OVE9QVF9OT1JFQ09WRVJZIH0sCisJCXsgWEZTX01PVU5UX09TWU5DSVNPU1lOQywJIiwiIE1OVE9QVF9PU1lOQ0lTT1NZTkMgfSwKKwkJeyBYRlNfTU9VTlRfTk9MT0dGTFVTSCwJCSIsIiBNTlRPUFRfTk9MT0dGTFVTSCB9LAorCQl7IFhGU19NT1VOVF9JREVMRVRFLAkJIiwiIE1OVE9QVF9OT0lLRUVQIH0sCisJCXsgMCwgTlVMTCB9CisJfTsKKwlzdHJ1Y3QgcHJvY194ZnNfaW5mbwkqeGZzX2luZm9wOworCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gWEZTX0JIVlRPTShiaHYpOworCisJZm9yICh4ZnNfaW5mb3AgPSB4ZnNfaW5mbzsgeGZzX2luZm9wLT5mbGFnOyB4ZnNfaW5mb3ArKykgeworCQlpZiAobXAtPm1fZmxhZ3MgJiB4ZnNfaW5mb3AtPmZsYWcpCisJCQlzZXFfcHV0cyhtLCB4ZnNfaW5mb3AtPnN0cik7CisJfQorCisJaWYgKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX0lIQVNIU0laRSkKKwkJc2VxX3ByaW50ZihtLCAiLCIgTU5UT1BUX0lIQVNIU0laRSAiPSVkIiwgbXAtPm1faWhzaXplKTsKKworCWlmIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9ERkxUX0lPU0laRSkKKwkJc2VxX3ByaW50ZihtLCAiLCIgTU5UT1BUX0JJT1NJWkUgIj0lZCIsIG1wLT5tX3dyaXRlaW9fbG9nKTsKKworCWlmIChtcC0+bV9sb2didWZzID4gMCkKKwkJc2VxX3ByaW50ZihtLCAiLCIgTU5UT1BUX0xPR0JVRlMgIj0lZCIsIG1wLT5tX2xvZ2J1ZnMpOworCisJaWYgKG1wLT5tX2xvZ2JzaXplID4gMCkKKwkJc2VxX3ByaW50ZihtLCAiLCIgTU5UT1BUX0xPR0JTSVpFICI9JWQiLCBtcC0+bV9sb2dic2l6ZSk7CisKKwlpZiAobXAtPm1fZGRldl90YXJncCAhPSBtcC0+bV9sb2dkZXZfdGFyZ3ApCisJCXNlcV9wcmludGYobSwgIiwiIE1OVE9QVF9MT0dERVYgIj0lcyIsCisJCQkJWEZTX0JVRlRBUkdfTkFNRShtcC0+bV9sb2dkZXZfdGFyZ3ApKTsKKworCWlmIChtcC0+bV9ydGRldl90YXJncCAmJiBtcC0+bV9kZGV2X3RhcmdwICE9IG1wLT5tX3J0ZGV2X3RhcmdwKQorCQlzZXFfcHJpbnRmKG0sICIsIiBNTlRPUFRfUlRERVYgIj0lcyIsCisJCQkJWEZTX0JVRlRBUkdfTkFNRShtcC0+bV9ydGRldl90YXJncCkpOworCisJaWYgKG1wLT5tX2RhbGlnbiA+IDApCisJCXNlcV9wcmludGYobSwgIiwiIE1OVE9QVF9TVU5JVCAiPSVkIiwKKwkJCQkoaW50KVhGU19GU0JfVE9fQkIobXAsIG1wLT5tX2RhbGlnbikpOworCisJaWYgKG1wLT5tX3N3aWR0aCA+IDApCisJCXNlcV9wcmludGYobSwgIiwiIE1OVE9QVF9TV0lEVEggIj0lZCIsCisJCQkJKGludClYRlNfRlNCX1RPX0JCKG1wLCBtcC0+bV9zd2lkdGgpKTsKKworCWlmICghKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UXzMyQklUSU5PT1BUKSkKKwkJc2VxX3ByaW50ZihtLCAiLCIgTU5UT1BUXzY0QklUSU5PREUpOworCQorCXJldHVybiAwOworfQorCitTVEFUSUMgdm9pZAoreGZzX2ZyZWV6ZSgKKwliaHZfZGVzY190CSpiZHApCit7CisJeGZzX21vdW50X3QJKm1wID0gWEZTX0JIVlRPTShiZHApOworCisJd2hpbGUgKGF0b21pY19yZWFkKCZtcC0+bV9hY3RpdmVfdHJhbnMpID4gMCkKKwkJZGVsYXkoMTAwKTsKKworCS8qIFB1c2ggdGhlIHN1cGVyYmxvY2sgYW5kIHdyaXRlIGFuIHVubW91bnQgcmVjb3JkICovCisJeGZzX2xvZ191bm1vdW50X3dyaXRlKG1wKTsKKwl4ZnNfdW5tb3VudGZzX3dyaXRlc2IobXApOworfQorCisKK3Zmc29wc190IHhmc192ZnNvcHMgPSB7CisJQkhWX0lERU5USVRZX0lOSVQoVkZTX0JIVl9YRlMsVkZTX1BPU0lUSU9OX1hGUyksCisJLnZmc19wYXJzZWFyZ3MJCT0geGZzX3BhcnNlYXJncywKKwkudmZzX3Nob3dhcmdzCQk9IHhmc19zaG93YXJncywKKwkudmZzX21vdW50CQk9IHhmc19tb3VudCwKKwkudmZzX3VubW91bnQJCT0geGZzX3VubW91bnQsCisJLnZmc19tbnR1cGRhdGUJCT0geGZzX21udHVwZGF0ZSwKKwkudmZzX3Jvb3QJCT0geGZzX3Jvb3QsCisJLnZmc19zdGF0dmZzCQk9IHhmc19zdGF0dmZzLAorCS52ZnNfc3luYwkJPSB4ZnNfc3luYywKKwkudmZzX3ZnZXQJCT0geGZzX3ZnZXQsCisJLnZmc19kbWFwaW9wcwkJPSAodmZzX2RtYXBpb3BzX3QpZnNfbm9zeXMsCisJLnZmc19xdW90YWN0bAkJPSAodmZzX3F1b3RhY3RsX3QpZnNfbm9zeXMsCisJLnZmc19pbml0X3Zub2RlCQk9IHhmc19pbml0aWFsaXplX3Zub2RlLAorCS52ZnNfZm9yY2Vfc2h1dGRvd24JPSB4ZnNfZG9fZm9yY2Vfc2h1dGRvd24sCisJLnZmc19mcmVlemUJCT0geGZzX2ZyZWV6ZSwKK307CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX3Zub2Rlb3BzLmMgYi9mcy94ZnMveGZzX3Zub2Rlb3BzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAwOTI5NgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL3hmcy94ZnNfdm5vZGVvcHMuYwpAQCAtMCwwICsxLDQ3MTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNCBTaWxpY29uIEdyYXBoaWNzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd291bGQgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqCisgKiBGdXJ0aGVyLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgYW55IHdhcnJhbnR5IHRoYXQgaXQgaXMKKyAqIGZyZWUgb2YgdGhlIHJpZ2h0ZnVsIGNsYWltIG9mIGFueSB0aGlyZCBwZXJzb24gcmVnYXJkaW5nIGluZnJpbmdlbWVudAorICogb3IgdGhlIGxpa2UuICBBbnkgbGljZW5zZSBwcm92aWRlZCBoZXJlaW4sIHdoZXRoZXIgaW1wbGllZCBvcgorICogb3RoZXJ3aXNlLCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBzb2Z0d2FyZSBmaWxlLiAgUGF0ZW50IGxpY2Vuc2VzLCBpZgorICogYW55LCBwcm92aWRlZCBoZXJlaW4gZG8gbm90IGFwcGx5IHRvIGNvbWJpbmF0aW9ucyBvZiB0aGlzIHByb2dyYW0gd2l0aAorICogb3RoZXIgc29mdHdhcmUsIG9yIGFueSBvdGhlciBwcm9kdWN0IHdoYXRzb2V2ZXIuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5CisgKiBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogQ29udGFjdCBpbmZvcm1hdGlvbjogU2lsaWNvbiBHcmFwaGljcywgSW5jLiwgMTYwMCBBbXBoaXRoZWF0cmUgUGt3eSwKKyAqIE1vdW50YWluIFZpZXcsIENBICA5NDA0Mywgb3I6CisgKgorICogaHR0cDovL3d3dy5zZ2kuY29tCisgKgorICogRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRoaXMgbm90aWNlLCBzZWU6CisgKgorICogaHR0cDovL29zcy5zZ2kuY29tL3Byb2plY3RzL0dlbkluZm8vU0dJR1BMTm90aWNlRXhwbGFuLworICovCisKKyNpbmNsdWRlICJ4ZnMuaCIKKyNpbmNsdWRlICJ4ZnNfbWFjcm9zLmgiCisjaW5jbHVkZSAieGZzX3R5cGVzLmgiCisjaW5jbHVkZSAieGZzX2ludW0uaCIKKyNpbmNsdWRlICJ4ZnNfbG9nLmgiCisjaW5jbHVkZSAieGZzX3RyYW5zLmgiCisjaW5jbHVkZSAieGZzX3NiLmgiCisjaW5jbHVkZSAieGZzX2FnLmgiCisjaW5jbHVkZSAieGZzX2Rpci5oIgorI2luY2x1ZGUgInhmc19kaXIyLmgiCisjaW5jbHVkZSAieGZzX2RtYXBpLmgiCisjaW5jbHVkZSAieGZzX21vdW50LmgiCisjaW5jbHVkZSAieGZzX2FsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKKyNpbmNsdWRlICJ4ZnNfaWFsbG9jX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2l0YWJsZS5oIgorI2luY2x1ZGUgInhmc19idHJlZS5oIgorI2luY2x1ZGUgInhmc19pYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfYXR0cl9zZi5oIgorI2luY2x1ZGUgInhmc19kaXJfc2YuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyMl9zZi5oIgorI2luY2x1ZGUgInhmc19kaW5vZGUuaCIKKyNpbmNsdWRlICJ4ZnNfaW5vZGVfaXRlbS5oIgorI2luY2x1ZGUgInhmc19pbm9kZS5oIgorI2luY2x1ZGUgInhmc19ibWFwLmgiCisjaW5jbHVkZSAieGZzX2RhX2J0cmVlLmgiCisjaW5jbHVkZSAieGZzX2F0dHIuaCIKKyNpbmNsdWRlICJ4ZnNfcncuaCIKKyNpbmNsdWRlICJ4ZnNfcmVmY2FjaGUuaCIKKyNpbmNsdWRlICJ4ZnNfZXJyb3IuaCIKKyNpbmNsdWRlICJ4ZnNfYml0LmgiCisjaW5jbHVkZSAieGZzX3J0YWxsb2MuaCIKKyNpbmNsdWRlICJ4ZnNfcXVvdGEuaCIKKyNpbmNsdWRlICJ4ZnNfdXRpbHMuaCIKKyNpbmNsdWRlICJ4ZnNfdHJhbnNfc3BhY2UuaCIKKyNpbmNsdWRlICJ4ZnNfZGlyX2xlYWYuaCIKKyNpbmNsdWRlICJ4ZnNfbWFjLmgiCisjaW5jbHVkZSAieGZzX2xvZ19wcml2LmgiCisKKworLyoKKyAqIFRoZSBtYXhpbXVtIHBhdGhsZW4gaXMgMTAyNCBieXRlcy4gU2luY2UgdGhlIG1pbmltdW0gZmlsZSBzeXN0ZW0KKyAqIGJsb2Nrc2l6ZSBpcyA1MTIgYnl0ZXMsIHdlIGNhbiBnZXQgYSBtYXggb2YgMiBleHRlbnRzIGJhY2sgZnJvbQorICogYm1hcGkuCisgKi8KKyNkZWZpbmUgU1lNTElOS19NQVBTIDIKKworLyoKKyAqIEZvciB4ZnMsIHdlIGNoZWNrIHRoYXQgdGhlIGZpbGUgaXNuJ3QgdG9vIGJpZyB0byBiZSBvcGVuZWQgYnkgdGhpcyBrZXJuZWwuCisgKiBObyBvdGhlciBvcGVuIGFjdGlvbiBpcyByZXF1aXJlZCBmb3IgcmVndWxhciBmaWxlcy4gIERldmljZXMgYXJlIGhhbmRsZWQKKyAqIHRocm91Z2ggdGhlIHNwZWNmcyBmaWxlIHN5c3RlbSwgcGlwZXMgdGhyb3VnaCBmaWZvZnMuICBEZXZpY2UgYW5kCisgKiBmaWZvIHZub2RlcyBhcmUgIndyYXBwZWQiIGJ5IHNwZWNmcyBhbmQgZmlmb2ZzIHZub2RlcywgcmVzcGVjdGl2ZWx5LAorICogd2hlbiBhIG5ldyB2bm9kZSBpcyBmaXJzdCBsb29rZWQgdXAgb3IgY3JlYXRlZC4KKyAqLworU1RBVElDIGludAoreGZzX29wZW4oCisJYmh2X2Rlc2NfdAkqYmRwLAorCWNyZWRfdAkJKmNyZWRwKQoreworCWludAkJbW9kZTsKKwl2bm9kZV90CQkqdnA7CisJeGZzX2lub2RlX3QJKmlwOworCisJdnAgPSBCSFZfVE9fVk5PREUoYmRwKTsKKwlpcCA9IFhGU19CSFZUT0koYmRwKTsKKworCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKGlwLT5pX21vdW50KSkKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCisJLyoKKwkgKiBJZiBpdCdzIGEgZGlyZWN0b3J5IHdpdGggYW55IGJsb2NrcywgcmVhZC1haGVhZCBibG9jayAwCisJICogYXMgd2UncmUgYWxtb3N0IGNlcnRhaW4gdG8gaGF2ZSB0aGUgbmV4dCBvcGVyYXRpb24gYmUgYSByZWFkIHRoZXJlLgorCSAqLworCWlmICh2cC0+dl90eXBlID09IFZESVIgJiYgaXAtPmlfZC5kaV9uZXh0ZW50cyA+IDApIHsKKwkJbW9kZSA9IHhmc19pbG9ja19tYXBfc2hhcmVkKGlwKTsKKwkJaWYgKGlwLT5pX2QuZGlfbmV4dGVudHMgPiAwKQorCQkJKHZvaWQpeGZzX2RhX3JlYWRhX2J1ZihOVUxMLCBpcCwgMCwgWEZTX0RBVEFfRk9SSyk7CisJCXhmc19pdW5sb2NrKGlwLCBtb2RlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIHhmc19nZXRhdHRyCisgKi8KK1NUQVRJQyBpbnQKK3hmc19nZXRhdHRyKAorCWJodl9kZXNjX3QJKmJkcCwKKwl2YXR0cl90CQkqdmFwLAorCWludAkJZmxhZ3MsCisJY3JlZF90CQkqY3JlZHApCit7CisJeGZzX2lub2RlX3QJKmlwOworCXhmc19tb3VudF90CSptcDsKKwl2bm9kZV90CQkqdnA7CisKKwl2cCAgPSBCSFZfVE9fVk5PREUoYmRwKTsKKwl2bl90cmFjZV9lbnRyeSh2cCwgX19GVU5DVElPTl9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisKKwlpcCA9IFhGU19CSFZUT0koYmRwKTsKKwltcCA9IGlwLT5pX21vdW50OworCisJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisKKwlpZiAoIShmbGFncyAmIEFUVFJfTEFaWSkpCisJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisKKwl2YXAtPnZhX3NpemUgPSBpcC0+aV9kLmRpX3NpemU7CisJaWYgKHZhcC0+dmFfbWFzayA9PSBYRlNfQVRfU0laRSkKKwkJZ290byBhbGxfZG9uZTsKKworCXZhcC0+dmFfbmJsb2NrcyA9CisJCVhGU19GU0JfVE9fQkIobXAsIGlwLT5pX2QuZGlfbmJsb2NrcyArIGlwLT5pX2RlbGF5ZWRfYmxrcyk7CisJdmFwLT52YV9ub2RlaWQgPSBpcC0+aV9pbm87CisjaWYgWEZTX0JJR19JTlVNUworCXZhcC0+dmFfbm9kZWlkICs9IG1wLT5tX2lub2FkZDsKKyNlbmRpZgorCXZhcC0+dmFfbmxpbmsgPSBpcC0+aV9kLmRpX25saW5rOworCisJLyoKKwkgKiBRdWljayBleGl0IGZvciBub24tc3RhdCBjYWxsZXJzCisJICovCisJaWYgKCh2YXAtPnZhX21hc2sgJgorCSAgICB+KFhGU19BVF9TSVpFfFhGU19BVF9GU0lEfFhGU19BVF9OT0RFSUR8CisJICAgICAgWEZTX0FUX05MSU5LfFhGU19BVF9CTEtTSVpFKSkgPT0gMCkKKwkJZ290byBhbGxfZG9uZTsKKworCS8qCisJICogQ29weSBmcm9tIGluLWNvcmUgaW5vZGUuCisJICovCisJdmFwLT52YV90eXBlID0gdnAtPnZfdHlwZTsKKwl2YXAtPnZhX21vZGUgPSBpcC0+aV9kLmRpX21vZGUgJiBNT0RFTUFTSzsKKwl2YXAtPnZhX3VpZCA9IGlwLT5pX2QuZGlfdWlkOworCXZhcC0+dmFfZ2lkID0gaXAtPmlfZC5kaV9naWQ7CisJdmFwLT52YV9wcm9qaWQgPSBpcC0+aV9kLmRpX3Byb2ppZDsKKworCS8qCisJICogQ2hlY2sgdm5vZGUgdHlwZSBibG9jay9jaGFyIHZzLiBldmVyeXRoaW5nIGVsc2UuCisJICogRG8gaXQgd2l0aCBiaXRtYXNrIGJlY2F1c2UgdGhhdCdzIGZhc3RlciB0aGFuIGxvb2tpbmcKKwkgKiBmb3IgbXVsdGlwbGUgdmFsdWVzIGluZGl2aWR1YWxseS4KKwkgKi8KKwlpZiAoKCgxIDw8IHZwLT52X3R5cGUpICYgKCgxPDxWQkxLKSB8ICgxPDxWQ0hSKSkpID09IDApIHsKKwkJdmFwLT52YV9yZGV2ID0gMDsKKworCQlpZiAoIShpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19SRUFMVElNRSkpIHsKKworI2lmIDAKKwkJCS8qIExhcmdlIGJsb2NrIHNpemVzIGNvbmZ1c2UgdmFyaW91cworCQkJICogdXNlciBzcGFjZSBwcm9ncmFtcywgc28gbGV0dGluZyB0aGUKKwkJCSAqIHN0cmlwZSBzaXplIHRocm91Z2ggaXMgbm90IGEgZ29vZAorCQkJICogaWRlYSBmb3Igbm93LgorCQkJICovCisJCQl2YXAtPnZhX2Jsb2Nrc2l6ZSA9IG1wLT5tX3N3aWR0aCA/CisJCQkJLyoKKwkJCQkgKiBJZiB0aGUgdW5kZXJseWluZyB2b2x1bWUgaXMgYSBzdHJpcGUsIHRoZW4KKwkJCQkgKiByZXR1cm4gdGhlIHN0cmlwZSB3aWR0aCBpbiBieXRlcyBhcyB0aGUKKwkJCQkgKiByZWNvbW1lbmRlZCBJL08gc2l6ZS4KKwkJCQkgKi8KKwkJCQkobXAtPm1fc3dpZHRoIDw8IG1wLT5tX3NiLnNiX2Jsb2NrbG9nKSA6CisJCQkJLyoKKwkJCQkgKiBSZXR1cm4gdGhlIGxhcmdlc3Qgb2YgdGhlIHByZWZlcnJlZCBidWZmZXIKKwkJCQkgKiBzaXplcyBzaW5jZSBkb2luZyBzbWFsbCBJL09zIGludG8gbGFyZ2VyCisJCQkJICogYnVmZmVycyBjYXVzZXMgYnVmZmVycyB0byBiZSBkZWNvbW1pc3Npb25lZC4KKwkJCQkgKiBUaGUgdmFsdWUgcmV0dXJuZWQgaXMgaW4gYnl0ZXMuCisJCQkJICovCisJCQkJKDEgPDwgKGludClNQVgobXAtPm1fcmVhZGlvX2xvZywKKwkJCQkJICAgICAgIG1wLT5tX3dyaXRlaW9fbG9nKSk7CisKKyNlbHNlCisJCQl2YXAtPnZhX2Jsb2Nrc2l6ZSA9CisJCQkJLyoKKwkJCQkgKiBSZXR1cm4gdGhlIGxhcmdlc3Qgb2YgdGhlIHByZWZlcnJlZCBidWZmZXIKKwkJCQkgKiBzaXplcyBzaW5jZSBkb2luZyBzbWFsbCBJL09zIGludG8gbGFyZ2VyCisJCQkJICogYnVmZmVycyBjYXVzZXMgYnVmZmVycyB0byBiZSBkZWNvbW1pc3Npb25lZC4KKwkJCQkgKiBUaGUgdmFsdWUgcmV0dXJuZWQgaXMgaW4gYnl0ZXMuCisJCQkJICovCisJCQkJMSA8PCAoaW50KU1BWChtcC0+bV9yZWFkaW9fbG9nLAorCQkJCQkgICAgICAgbXAtPm1fd3JpdGVpb19sb2cpOworI2VuZGlmCisJCX0gZWxzZSB7CisKKwkJCS8qCisJCQkgKiBJZiB0aGUgZmlsZSBibG9ja3MgYXJlIGJlaW5nIGFsbG9jYXRlZCBmcm9tIGEKKwkJCSAqIHJlYWx0aW1lIHBhcnRpdGlvbiwgdGhlbiByZXR1cm4gdGhlIGlub2RlJ3MKKwkJCSAqIHJlYWx0aW1lIGV4dGVudCBzaXplIG9yIHRoZSByZWFsdGltZSB2b2x1bWUncworCQkJICogZXh0ZW50IHNpemUuCisJCQkgKi8KKwkJCXZhcC0+dmFfYmxvY2tzaXplID0gaXAtPmlfZC5kaV9leHRzaXplID8KKwkJCQkoaXAtPmlfZC5kaV9leHRzaXplIDw8IG1wLT5tX3NiLnNiX2Jsb2NrbG9nKSA6CisJCQkJKG1wLT5tX3NiLnNiX3JleHRzaXplIDw8IG1wLT5tX3NiLnNiX2Jsb2NrbG9nKTsKKwkJfQorCX0gZWxzZSB7CisJCXZhcC0+dmFfcmRldiA9IGlwLT5pX2RmLmlmX3UyLmlmX3JkZXY7CisJCXZhcC0+dmFfYmxvY2tzaXplID0gQkxLREVWX0lPU0laRTsKKwl9CisKKwl2YXAtPnZhX2F0aW1lLnR2X3NlYyA9IGlwLT5pX2QuZGlfYXRpbWUudF9zZWM7CisJdmFwLT52YV9hdGltZS50dl9uc2VjID0gaXAtPmlfZC5kaV9hdGltZS50X25zZWM7CisJdmFwLT52YV9tdGltZS50dl9zZWMgPSBpcC0+aV9kLmRpX210aW1lLnRfc2VjOworCXZhcC0+dmFfbXRpbWUudHZfbnNlYyA9IGlwLT5pX2QuZGlfbXRpbWUudF9uc2VjOworCXZhcC0+dmFfY3RpbWUudHZfc2VjID0gaXAtPmlfZC5kaV9jdGltZS50X3NlYzsKKwl2YXAtPnZhX2N0aW1lLnR2X25zZWMgPSBpcC0+aV9kLmRpX2N0aW1lLnRfbnNlYzsKKworCS8qCisJICogRXhpdCBmb3Igc3RhdCBjYWxsZXJzLiAgU2VlIGlmIGFueSBvZiB0aGUgcmVzdCBvZiB0aGUgZmllbGRzCisJICogdG8gYmUgZmlsbGVkIGluIGFyZSBuZWVkZWQuCisJICovCisJaWYgKCh2YXAtPnZhX21hc2sgJgorCSAgICAgKFhGU19BVF9YRkxBR1N8WEZTX0FUX0VYVFNJWkV8WEZTX0FUX05FWFRFTlRTfFhGU19BVF9BTkVYVEVOVFN8CisJICAgICAgWEZTX0FUX0dFTkNPVU5UfFhGU19BVF9WQ09ERSkpID09IDApCisJCWdvdG8gYWxsX2RvbmU7CisKKwkvKgorCSAqIENvbnZlcnQgZGlfZmxhZ3MgdG8geGZsYWdzLgorCSAqLworCXZhcC0+dmFfeGZsYWdzID0geGZzX2lwMnhmbGFncyhpcCk7CisKKwkvKgorCSAqIEV4aXQgZm9yIGlub2RlIHJldmFsaWRhdGUuICBTZWUgaWYgYW55IG9mIHRoZSByZXN0IG9mCisJICogdGhlIGZpZWxkcyB0byBiZSBmaWxsZWQgaW4gYXJlIG5lZWRlZC4KKwkgKi8KKwlpZiAoKHZhcC0+dmFfbWFzayAmCisJICAgICAoWEZTX0FUX0VYVFNJWkV8WEZTX0FUX05FWFRFTlRTfFhGU19BVF9BTkVYVEVOVFN8CisJICAgICAgWEZTX0FUX0dFTkNPVU5UfFhGU19BVF9WQ09ERSkpID09IDApCisJCWdvdG8gYWxsX2RvbmU7CisKKwl2YXAtPnZhX2V4dHNpemUgPSBpcC0+aV9kLmRpX2V4dHNpemUgPDwgbXAtPm1fc2Iuc2JfYmxvY2tsb2c7CisJdmFwLT52YV9uZXh0ZW50cyA9CisJCShpcC0+aV9kZi5pZl9mbGFncyAmIFhGU19JRkVYVEVOVFMpID8KKwkJCWlwLT5pX2RmLmlmX2J5dGVzIC8gc2l6ZW9mKHhmc19ibWJ0X3JlY190KSA6CisJCQlpcC0+aV9kLmRpX25leHRlbnRzOworCWlmIChpcC0+aV9hZnApCisJCXZhcC0+dmFfYW5leHRlbnRzID0KKwkJCShpcC0+aV9hZnAtPmlmX2ZsYWdzICYgWEZTX0lGRVhURU5UUykgPworCQkJCWlwLT5pX2FmcC0+aWZfYnl0ZXMgLyBzaXplb2YoeGZzX2JtYnRfcmVjX3QpIDoKKwkJCQkgaXAtPmlfZC5kaV9hbmV4dGVudHM7CisJZWxzZQorCQl2YXAtPnZhX2FuZXh0ZW50cyA9IDA7CisJdmFwLT52YV9nZW4gPSBpcC0+aV9kLmRpX2dlbjsKKworIGFsbF9kb25lOgorCWlmICghKGZsYWdzICYgQVRUUl9MQVpZKSkKKwkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOworCXJldHVybiAwOworfQorCisKKy8qCisgKiB4ZnNfc2V0YXR0cgorICovCitpbnQKK3hmc19zZXRhdHRyKAorCWJodl9kZXNjX3QJCSpiZHAsCisJdmF0dHJfdAkJCSp2YXAsCisJaW50CQkJZmxhZ3MsCisJY3JlZF90CQkJKmNyZWRwKQoreworCXhmc19pbm9kZV90CQkqaXA7CisJeGZzX3RyYW5zX3QJCSp0cDsKKwl4ZnNfbW91bnRfdAkJKm1wOworCWludAkJCW1hc2s7CisJaW50CQkJY29kZTsKKwl1aW50CQkJbG9ja19mbGFnczsKKwl1aW50CQkJY29tbWl0X2ZsYWdzPTA7CisJdWlkX3QJCQl1aWQ9MCwgaXVpZD0wOworCWdpZF90CQkJZ2lkPTAsIGlnaWQ9MDsKKwlpbnQJCQl0aW1lZmxhZ3MgPSAwOworCXZub2RlX3QJCQkqdnA7CisJeGZzX3ByaWRfdAkJcHJvamlkPTAsIGlwcm9qaWQ9MDsKKwlpbnQJCQltYW5kbG9ja19iZWZvcmUsIG1hbmRsb2NrX2FmdGVyOworCXN0cnVjdCB4ZnNfZHF1b3QJKnVkcXAsICpnZHFwLCAqb2xkZHF1b3QxLCAqb2xkZHF1b3QyOworCWludAkJCWZpbGVfb3duZXI7CisJaW50CQkJbmVlZF9pb2xvY2sgPSAoZmxhZ3MgJiBBVFRSX0RNSSkgPT0gMDsKKworCXZwID0gQkhWX1RPX1ZOT0RFKGJkcCk7CisJdm5fdHJhY2VfZW50cnkodnAsIF9fRlVOQ1RJT05fXywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCisJaWYgKHZwLT52X3Zmc3AtPnZmc19mbGFnICYgVkZTX1JET05MWSkKKwkJcmV0dXJuIFhGU19FUlJPUihFUk9GUyk7CisKKwkvKgorCSAqIENhbm5vdCBzZXQgY2VydGFpbiBhdHRyaWJ1dGVzLgorCSAqLworCW1hc2sgPSB2YXAtPnZhX21hc2s7CisJaWYgKG1hc2sgJiBYRlNfQVRfTk9TRVQpIHsKKwkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCX0KKworCWlwID0gWEZTX0JIVlRPSShiZHApOworCW1wID0gaXAtPmlfbW91bnQ7CisKKwlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKworCS8qCisJICogVGltZXN0YW1wcyBkbyBub3QgbmVlZCB0byBiZSBsb2dnZWQgYW5kIGhlbmNlIGRvIG5vdAorCSAqIG5lZWQgdG8gYmUgZG9uZSB3aXRoaW4gYSB0cmFuc2FjdGlvbi4KKwkgKi8KKwlpZiAobWFzayAmIFhGU19BVF9VUERUSU1FUykgeworCQlBU1NFUlQoKG1hc2sgJiB+WEZTX0FUX1VQRFRJTUVTKSA9PSAwKTsKKwkJdGltZWZsYWdzID0gKChtYXNrICYgWEZTX0FUX1VQREFUSU1FKSA/IFhGU19JQ0hHVElNRV9BQ0MgOiAwKSB8CisJCQkgICAgKChtYXNrICYgWEZTX0FUX1VQRENUSU1FKSA/IFhGU19JQ0hHVElNRV9DSEcgOiAwKSB8CisJCQkgICAgKChtYXNrICYgWEZTX0FUX1VQRE1USU1FKSA/IFhGU19JQ0hHVElNRV9NT0QgOiAwKTsKKwkJeGZzX2ljaGd0aW1lKGlwLCB0aW1lZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisKKwlvbGRkcXVvdDEgPSBvbGRkcXVvdDIgPSBOVUxMOworCXVkcXAgPSBnZHFwID0gTlVMTDsKKworCS8qCisJICogSWYgZGlzayBxdW90YXMgaXMgb24sIHdlIG1ha2Ugc3VyZSB0aGF0IHRoZSBkcXVvdHMgZG8gZXhpc3Qgb24gZGlzaywKKwkgKiBiZWZvcmUgd2Ugc3RhcnQgYW55IG90aGVyIHRyYW5zYWN0aW9ucy4gVHJ5aW5nIHRvIGRvIHRoaXMgbGF0ZXIKKwkgKiBpcyBtZXNzeS4gV2UgZG9uJ3QgY2FyZSB0byB0YWtlIGEgcmVhZGxvY2sgdG8gbG9vayBhdCB0aGUgaWRzCisJICogaW4gaW5vZGUgaGVyZSwgYmVjYXVzZSB3ZSBjYW4ndCBob2xkIGl0IGFjcm9zcyB0aGUgdHJhbnNfcmVzZXJ2ZS4KKwkgKiBJZiB0aGUgSURzIGRvIGNoYW5nZSBiZWZvcmUgd2UgdGFrZSB0aGUgaWxvY2ssIHdlJ3JlIGNvdmVyZWQKKwkgKiBiZWNhdXNlIHRoZSBpXypkcXVvdCBmaWVsZHMgd2lsbCBnZXQgdXBkYXRlZCBhbnl3YXkuCisJICovCisJaWYgKFhGU19JU19RVU9UQV9PTihtcCkgJiYgKG1hc2sgJiAoWEZTX0FUX1VJRHxYRlNfQVRfR0lEKSkpIHsKKwkJdWludAlxZmxhZ3MgPSAwOworCisJCWlmIChtYXNrICYgWEZTX0FUX1VJRCkgeworCQkJdWlkID0gdmFwLT52YV91aWQ7CisJCQlxZmxhZ3MgfD0gWEZTX1FNT1BUX1VRVU9UQTsKKwkJfSBlbHNlIHsKKwkJCXVpZCA9IGlwLT5pX2QuZGlfdWlkOworCQl9CisJCWlmIChtYXNrICYgWEZTX0FUX0dJRCkgeworCQkJZ2lkID0gdmFwLT52YV9naWQ7CisJCQlxZmxhZ3MgfD0gWEZTX1FNT1BUX0dRVU9UQTsKKwkJfSAgZWxzZSB7CisJCQlnaWQgPSBpcC0+aV9kLmRpX2dpZDsKKwkJfQorCQkvKgorCQkgKiBXZSB0YWtlIGEgcmVmZXJlbmNlIHdoZW4gd2UgaW5pdGlhbGl6ZSB1ZHFwIGFuZCBnZHFwLAorCQkgKiBzbyBpdCBpcyBpbXBvcnRhbnQgdGhhdCB3ZSBuZXZlciBibGluZGx5IGRvdWJsZSB0cmlwIG9uCisJCSAqIHRoZSBzYW1lIHZhcmlhYmxlLiBTZWUgeGZzX2NyZWF0ZSgpIGZvciBhbiBleGFtcGxlLgorCQkgKi8KKwkJQVNTRVJUKHVkcXAgPT0gTlVMTCk7CisJCUFTU0VSVChnZHFwID09IE5VTEwpOworCQljb2RlID0gWEZTX1FNX0RRVk9QQUxMT0MobXAsIGlwLCB1aWQsZ2lkLCBxZmxhZ3MsICZ1ZHFwLCAmZ2RxcCk7CisJCWlmIChjb2RlKQorCQkJcmV0dXJuIChjb2RlKTsKKwl9CisKKwkvKgorCSAqIEZvciB0aGUgb3RoZXIgYXR0cmlidXRlcywgd2UgYWNxdWlyZSB0aGUgaW5vZGUgbG9jayBhbmQKKwkgKiBmaXJzdCBkbyBhbiBlcnJvciBjaGVja2luZyBwYXNzLgorCSAqLworCXRwID0gTlVMTDsKKwlsb2NrX2ZsYWdzID0gWEZTX0lMT0NLX0VYQ0w7CisJaWYgKCEobWFzayAmIFhGU19BVF9TSVpFKSkgeworCQlpZiAoKG1hc2sgIT0gKFhGU19BVF9DVElNRXxYRlNfQVRfQVRJTUV8WEZTX0FUX01USU1FKSkgfHwKKwkJICAgIChtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9XU1lOQykpIHsKKwkJCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfU0VUQVRUUl9OT1RfU0laRSk7CisJCQljb21taXRfZmxhZ3MgPSAwOworCQkJaWYgKChjb2RlID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsCisJCQkJCQkgICAgIFhGU19JQ0hBTkdFX0xPR19SRVMobXApLCAwLAorCQkJCQkJICAgICAwLCAwKSkpIHsKKwkJCQlsb2NrX2ZsYWdzID0gMDsKKwkJCQlnb3RvIGVycm9yX3JldHVybjsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWlmIChETV9FVkVOVF9FTkFCTEVEICh2cC0+dl92ZnNwLCBpcCwgRE1fRVZFTlRfVFJVTkNBVEUpICYmCisJCSAgICAhKGZsYWdzICYgQVRUUl9ETUkpKSB7CisJCQlpbnQgZG1mbGFncyA9IEFUX0RFTEFZX0ZMQUcoZmxhZ3MpIHwgRE1fU0VNX0ZMQUdfV1I7CisJCQljb2RlID0gWEZTX1NFTkRfREFUQShtcCwgRE1fRVZFTlRfVFJVTkNBVEUsIHZwLAorCQkJCXZhcC0+dmFfc2l6ZSwgMCwgZG1mbGFncywgTlVMTCk7CisJCQlpZiAoY29kZSkgeworCQkJCWxvY2tfZmxhZ3MgPSAwOworCQkJCWdvdG8gZXJyb3JfcmV0dXJuOworCQkJfQorCQl9CisJCWlmIChuZWVkX2lvbG9jaykKKwkJCWxvY2tfZmxhZ3MgfD0gWEZTX0lPTE9DS19FWENMOworCX0KKworCXhmc19pbG9jayhpcCwgbG9ja19mbGFncyk7CisKKwkvKiBib29sZWFuOiBhcmUgd2UgdGhlIGZpbGUgb3duZXI/ICovCisJZmlsZV9vd25lciA9IChjdXJyZW50X2ZzdWlkKGNyZWRwKSA9PSBpcC0+aV9kLmRpX3VpZCk7CisKKwkvKgorCSAqIENoYW5nZSB2YXJpb3VzIHByb3BlcnRpZXMgb2YgYSBmaWxlLgorCSAqIE9ubHkgdGhlIG93bmVyIG9yIHVzZXJzIHdpdGggQ0FQX0ZPV05FUgorCSAqIGNhcGFiaWxpdHkgbWF5IGRvIHRoZXNlIHRoaW5ncy4KKwkgKi8KKwlpZiAobWFzayAmCisJICAgIChYRlNfQVRfTU9ERXxYRlNfQVRfWEZMQUdTfFhGU19BVF9FWFRTSVpFfFhGU19BVF9VSUR8CisJICAgICBYRlNfQVRfR0lEfFhGU19BVF9QUk9KSUQpKSB7CisJCS8qCisJCSAqIENBUF9GT1dORVIgb3ZlcnJpZGVzIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorCQkgKgorCQkgKiBUaGUgdXNlciBJRCBvZiB0aGUgY2FsbGluZyBwcm9jZXNzIG11c3QgYmUgZXF1YWwKKwkJICogdG8gdGhlIGZpbGUgb3duZXIgSUQsIGV4Y2VwdCBpbiBjYXNlcyB3aGVyZSB0aGUKKwkJICogQ0FQX0ZTRVRJRCBjYXBhYmlsaXR5IGlzIGFwcGxpY2FibGUuCisJCSAqLworCQlpZiAoIWZpbGVfb3duZXIgJiYgIWNhcGFibGUoQ0FQX0ZPV05FUikpIHsKKwkJCWNvZGUgPSBYRlNfRVJST1IoRVBFUk0pOworCQkJZ290byBlcnJvcl9yZXR1cm47CisJCX0KKworCQkvKgorCQkgKiBDQVBfRlNFVElEIG92ZXJyaWRlcyB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKwkJICoKKwkJICogVGhlIGVmZmVjdGl2ZSB1c2VyIElEIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3Mgc2hhbGwgbWF0Y2gKKwkJICogdGhlIGZpbGUgb3duZXIgd2hlbiBzZXR0aW5nIHRoZSBzZXQtdXNlci1JRCBhbmQKKwkJICogc2V0LWdyb3VwLUlEIGJpdHMgb24gdGhhdCBmaWxlLgorCQkgKgorCQkgKiBUaGUgZWZmZWN0aXZlIGdyb3VwIElEIG9yIG9uZSBvZiB0aGUgc3VwcGxlbWVudGFyeSBncm91cAorCQkgKiBJRHMgb2YgdGhlIGNhbGxpbmcgcHJvY2VzcyBzaGFsbCBtYXRjaCB0aGUgZ3JvdXAgb3duZXIgb2YKKwkJICogdGhlIGZpbGUgd2hlbiBzZXR0aW5nIHRoZSBzZXQtZ3JvdXAtSUQgYml0IG9uIHRoYXQgZmlsZQorCQkgKi8KKwkJaWYgKG1hc2sgJiBYRlNfQVRfTU9ERSkgeworCQkJbW9kZV90IG0gPSAwOworCisJCQlpZiAoKHZhcC0+dmFfbW9kZSAmIFNfSVNVSUQpICYmICFmaWxlX293bmVyKQorCQkJCW0gfD0gU19JU1VJRDsKKwkJCWlmICgodmFwLT52YV9tb2RlICYgU19JU0dJRCkgJiYKKwkJCSAgICAhaW5fZ3JvdXBfcCgoZ2lkX3QpaXAtPmlfZC5kaV9naWQpKQorCQkJCW0gfD0gU19JU0dJRDsKKyNpZiAwCisJCQkvKiBMaW51eCBhbGxvd3MgdGhpcywgSXJpeCBkb2Vzbid0LiAqLworCQkJaWYgKCh2YXAtPnZhX21vZGUgJiBTX0lTVlRYKSAmJiB2cC0+dl90eXBlICE9IFZESVIpCisJCQkJbSB8PSBTX0lTVlRYOworI2VuZGlmCisJCQlpZiAobSAmJiAhY2FwYWJsZShDQVBfRlNFVElEKSkKKwkJCQl2YXAtPnZhX21vZGUgJj0gfm07CisJCX0KKwl9CisKKwkvKgorCSAqIENoYW5nZSBmaWxlIG93bmVyc2hpcC4gIE11c3QgYmUgdGhlIG93bmVyIG9yIHByaXZpbGVnZWQuCisJICogSWYgdGhlIHN5c3RlbSB3YXMgY29uZmlndXJlZCB3aXRoIHRoZSAicmVzdHJpY3RlZF9jaG93biIKKwkgKiBvcHRpb24sIHRoZSBvd25lciBpcyBub3QgcGVybWl0dGVkIHRvIGdpdmUgYXdheSB0aGUgZmlsZSwKKwkgKiBhbmQgY2FuIGNoYW5nZSB0aGUgZ3JvdXAgaWQgb25seSB0byBhIGdyb3VwIG9mIHdoaWNoIGhlCisJICogb3Igc2hlIGlzIGEgbWVtYmVyLgorCSAqLworCWlmIChtYXNrICYgKFhGU19BVF9VSUR8WEZTX0FUX0dJRHxYRlNfQVRfUFJPSklEKSkgeworCQkvKgorCQkgKiBUaGVzZSBJRHMgY291bGQgaGF2ZSBjaGFuZ2VkIHNpbmNlIHdlIGxhc3QgbG9va2VkIGF0IHRoZW0uCisJCSAqIEJ1dCwgd2UncmUgYXNzdXJlZCB0aGF0IGlmIHRoZSBvd25lcnNoaXAgZGlkIGNoYW5nZQorCQkgKiB3aGlsZSB3ZSBkaWRuJ3QgaGF2ZSB0aGUgaW5vZGUgbG9ja2VkLCBpbm9kZSdzIGRxdW90KHMpCisJCSAqIHdvdWxkIGhhdmUgY2hhbmdlZCBhbHNvLgorCQkgKi8KKwkJaXVpZCA9IGlwLT5pX2QuZGlfdWlkOworCQlpcHJvamlkID0gaXAtPmlfZC5kaV9wcm9qaWQ7CisJCWlnaWQgPSBpcC0+aV9kLmRpX2dpZDsKKwkJZ2lkID0gKG1hc2sgJiBYRlNfQVRfR0lEKSA/IHZhcC0+dmFfZ2lkIDogaWdpZDsKKwkJdWlkID0gKG1hc2sgJiBYRlNfQVRfVUlEKSA/IHZhcC0+dmFfdWlkIDogaXVpZDsKKwkJcHJvamlkID0gKG1hc2sgJiBYRlNfQVRfUFJPSklEKSA/ICh4ZnNfcHJpZF90KXZhcC0+dmFfcHJvamlkIDoKKwkJCSBpcHJvamlkOworCisJCS8qCisJCSAqIENBUF9DSE9XTiBvdmVycmlkZXMgdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisJCSAqCisJCSAqIElmIF9QT1NJWF9DSE9XTl9SRVNUUklDVEVEIGlzIGRlZmluZWQsIHRoaXMgY2FwYWJpbGl0eQorCQkgKiBzaGFsbCBvdmVycmlkZSB0aGUgcmVzdHJpY3Rpb24gdGhhdCBhIHByb2Nlc3MgY2Fubm90CisJCSAqIGNoYW5nZSB0aGUgdXNlciBJRCBvZiBhIGZpbGUgaXQgb3ducyBhbmQgdGhlIHJlc3RyaWN0aW9uCisJCSAqIHRoYXQgdGhlIGdyb3VwIElEIHN1cHBsaWVkIHRvIHRoZSBjaG93bigpIGZ1bmN0aW9uCisJCSAqIHNoYWxsIGJlIGVxdWFsIHRvIGVpdGhlciB0aGUgZ3JvdXAgSUQgb3Igb25lIG9mIHRoZQorCQkgKiBzdXBwbGVtZW50YXJ5IGdyb3VwIElEcyBvZiB0aGUgY2FsbGluZyBwcm9jZXNzLgorCQkgKgorCQkgKiBYWFg6IEhvdyBkb2VzIHJlc3RyaWN0ZWRfY2hvd24gYWZmZWN0IHByb2ppZD8KKwkJICovCisJCWlmIChyZXN0cmljdGVkX2Nob3duICYmCisJCSAgICAoaXVpZCAhPSB1aWQgfHwgKGlnaWQgIT0gZ2lkICYmCisJCQkJICAgICAhaW5fZ3JvdXBfcCgoZ2lkX3QpZ2lkKSkpICYmCisJCSAgICAhY2FwYWJsZShDQVBfQ0hPV04pKSB7CisJCQljb2RlID0gWEZTX0VSUk9SKEVQRVJNKTsKKwkJCWdvdG8gZXJyb3JfcmV0dXJuOworCQl9CisJCS8qCisJCSAqIERvIGEgcXVvdGEgcmVzZXJ2YXRpb24gb25seSBpZiB1aWQgb3IgZ2lkIGlzIGFjdHVhbGx5CisJCSAqIGdvaW5nIHRvIGNoYW5nZS4KKwkJICovCisJCWlmICgoWEZTX0lTX1VRVU9UQV9PTihtcCkgJiYgaXVpZCAhPSB1aWQpIHx8CisJCSAgICAoWEZTX0lTX0dRVU9UQV9PTihtcCkgJiYgaWdpZCAhPSBnaWQpKSB7CisJCQlBU1NFUlQodHApOworCQkJY29kZSA9IFhGU19RTV9EUVZPUENIT1dOUkVTVihtcCwgdHAsIGlwLCB1ZHFwLCBnZHFwLAorCQkJCQkJY2FwYWJsZShDQVBfRk9XTkVSKSA/CisJCQkJCQlYRlNfUU1PUFRfRk9SQ0VfUkVTIDogMCk7CisJCQlpZiAoY29kZSkJLyogb3V0IG9mIHF1b3RhICovCisJCQkJZ290byBlcnJvcl9yZXR1cm47CisJCX0KKwl9CisKKwkvKgorCSAqIFRydW5jYXRlIGZpbGUuICBNdXN0IGhhdmUgd3JpdGUgcGVybWlzc2lvbiBhbmQgbm90IGJlIGEgZGlyZWN0b3J5LgorCSAqLworCWlmIChtYXNrICYgWEZTX0FUX1NJWkUpIHsKKwkJLyogU2hvcnQgY2lyY3VpdCB0aGUgdHJ1bmNhdGUgY2FzZSBmb3IgemVybyBsZW5ndGggZmlsZXMgKi8KKwkJaWYgKCh2YXAtPnZhX3NpemUgPT0gMCkgJiYKKwkJICAgKGlwLT5pX2QuZGlfc2l6ZSA9PSAwKSAmJiAoaXAtPmlfZC5kaV9uZXh0ZW50cyA9PSAwKSkgeworCQkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwkJCWxvY2tfZmxhZ3MgJj0gflhGU19JTE9DS19FWENMOworCQkJaWYgKG1hc2sgJiBYRlNfQVRfQ1RJTUUpCisJCQkJeGZzX2ljaGd0aW1lKGlwLCBYRlNfSUNIR1RJTUVfTU9EIHwgWEZTX0lDSEdUSU1FX0NIRyk7CisJCQljb2RlID0gMDsKKwkJCWdvdG8gZXJyb3JfcmV0dXJuOworCQl9CisKKwkJaWYgKHZwLT52X3R5cGUgPT0gVkRJUikgeworCQkJY29kZSA9IFhGU19FUlJPUihFSVNESVIpOworCQkJZ290byBlcnJvcl9yZXR1cm47CisJCX0gZWxzZSBpZiAodnAtPnZfdHlwZSAhPSBWUkVHKSB7CisJCQljb2RlID0gWEZTX0VSUk9SKEVJTlZBTCk7CisJCQlnb3RvIGVycm9yX3JldHVybjsKKwkJfQorCQkvKgorCQkgKiBNYWtlIHN1cmUgdGhhdCB0aGUgZHF1b3RzIGFyZSBhdHRhY2hlZCB0byB0aGUgaW5vZGUuCisJCSAqLworCQlpZiAoKGNvZGUgPSBYRlNfUU1fRFFBVFRBQ0gobXAsIGlwLCBYRlNfUU1PUFRfSUxPQ0tFRCkpKQorCQkJZ290byBlcnJvcl9yZXR1cm47CisJfQorCisJLyoKKwkgKiBDaGFuZ2UgZmlsZSBhY2Nlc3Mgb3IgbW9kaWZpZWQgdGltZXMuCisJICovCisJaWYgKG1hc2sgJiAoWEZTX0FUX0FUSU1FfFhGU19BVF9NVElNRSkpIHsKKwkJaWYgKCFmaWxlX293bmVyKSB7CisJCQlpZiAoKGZsYWdzICYgQVRUUl9VVElNRSkgJiYKKwkJCSAgICAhY2FwYWJsZShDQVBfRk9XTkVSKSkgeworCQkJCWNvZGUgPSBYRlNfRVJST1IoRVBFUk0pOworCQkJCWdvdG8gZXJyb3JfcmV0dXJuOworCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBDaGFuZ2UgZXh0ZW50IHNpemUgb3IgcmVhbHRpbWUgZmxhZy4KKwkgKi8KKwlpZiAobWFzayAmIChYRlNfQVRfRVhUU0laRXxYRlNfQVRfWEZMQUdTKSkgeworCQkvKgorCQkgKiBDYW4ndCBjaGFuZ2UgZXh0ZW50IHNpemUgaWYgYW55IGV4dGVudHMgYXJlIGFsbG9jYXRlZC4KKwkJICovCisJCWlmICgoaXAtPmlfZC5kaV9uZXh0ZW50cyB8fCBpcC0+aV9kZWxheWVkX2Jsa3MpICYmCisJCSAgICAobWFzayAmIFhGU19BVF9FWFRTSVpFKSAmJgorCQkgICAgKChpcC0+aV9kLmRpX2V4dHNpemUgPDwgbXAtPm1fc2Iuc2JfYmxvY2tsb2cpICE9CisJCSAgICAgdmFwLT52YV9leHRzaXplKSApIHsKKwkJCWNvZGUgPSBYRlNfRVJST1IoRUlOVkFMKTsJLyogRUZCSUc/ICovCisJCQlnb3RvIGVycm9yX3JldHVybjsKKwkJfQorCisJCS8qCisJCSAqIENhbid0IHNldCBleHRlbnQgc2l6ZSB1bmxlc3MgdGhlIGZpbGUgaXMgbWFya2VkLCBvcgorCQkgKiBhYm91dCB0byBiZSBtYXJrZWQgYXMgYSByZWFsdGltZSBmaWxlLgorCQkgKgorCQkgKiBUaGlzIGNoZWNrIHdpbGwgYmUgcmVtb3ZlZCB3aGVuIGZpeGVkIHNpemUgZXh0ZW50cworCQkgKiB3aXRoIGJ1ZmZlcmVkIGRhdGEgd3JpdGVzIGlzIGltcGxlbWVudGVkLgorCQkgKgorCQkgKi8KKwkJaWYgKChtYXNrICYgWEZTX0FUX0VYVFNJWkUpCQkJJiYKKwkJICAgICgoaXAtPmlfZC5kaV9leHRzaXplIDw8IG1wLT5tX3NiLnNiX2Jsb2NrbG9nKSAhPQorCQkgICAgIHZhcC0+dmFfZXh0c2l6ZSkgJiYKKwkJICAgICghKChpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19SRUFMVElNRSkgfHwKKwkJICAgICAgICgobWFzayAmIFhGU19BVF9YRkxBR1MpICYmCisJCQkodmFwLT52YV94ZmxhZ3MgJiBYRlNfWEZMQUdfUkVBTFRJTUUpKSkpKSB7CisJCQljb2RlID0gWEZTX0VSUk9SKEVJTlZBTCk7CisJCQlnb3RvIGVycm9yX3JldHVybjsKKwkJfQorCisJCS8qCisJCSAqIENhbid0IGNoYW5nZSByZWFsdGltZSBmbGFnIGlmIGFueSBleHRlbnRzIGFyZSBhbGxvY2F0ZWQuCisJCSAqLworCQlpZiAoaXAtPmlfZC5kaV9uZXh0ZW50cyAmJiAobWFzayAmIFhGU19BVF9YRkxBR1MpICYmCisJCSAgICAoaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUkVBTFRJTUUpICE9CisJCSAgICAodmFwLT52YV94ZmxhZ3MgJiBYRlNfWEZMQUdfUkVBTFRJTUUpKSB7CisJCQljb2RlID0gWEZTX0VSUk9SKEVJTlZBTCk7CS8qIEVGQklHPyAqLworCQkJZ290byBlcnJvcl9yZXR1cm47CisJCX0KKwkJLyoKKwkJICogRXh0ZW50IHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBhcHByb3ByaWF0ZSBibG9jaworCQkgKiBzaXplLCBpZiBzZXQgYXQgYWxsLgorCQkgKi8KKwkJaWYgKChtYXNrICYgWEZTX0FUX0VYVFNJWkUpICYmIHZhcC0+dmFfZXh0c2l6ZSAhPSAwKSB7CisJCQl4ZnNfZXh0bGVuX3QJc2l6ZTsKKworCQkJaWYgKChpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19SRUFMVElNRSkgfHwKKwkJCSAgICAoKG1hc2sgJiBYRlNfQVRfWEZMQUdTKSAmJgorCQkJICAgICh2YXAtPnZhX3hmbGFncyAmIFhGU19YRkxBR19SRUFMVElNRSkpKSB7CisJCQkJc2l6ZSA9IG1wLT5tX3NiLnNiX3JleHRzaXplIDw8CisJCQkJICAgICAgIG1wLT5tX3NiLnNiX2Jsb2NrbG9nOworCQkJfSBlbHNlIHsKKwkJCQlzaXplID0gbXAtPm1fc2Iuc2JfYmxvY2tzaXplOworCQkJfQorCQkJaWYgKHZhcC0+dmFfZXh0c2l6ZSAlIHNpemUpIHsKKwkJCQljb2RlID0gWEZTX0VSUk9SKEVJTlZBTCk7CisJCQkJZ290byBlcnJvcl9yZXR1cm47CisJCQl9CisJCX0KKwkJLyoKKwkJICogSWYgcmVhbHRpbWUgZmxhZyBpcyBzZXQgdGhlbiBtdXN0IGhhdmUgcmVhbHRpbWUgZGF0YS4KKwkJICovCisJCWlmICgobWFzayAmIFhGU19BVF9YRkxBR1MpICYmCisJCSAgICAodmFwLT52YV94ZmxhZ3MgJiBYRlNfWEZMQUdfUkVBTFRJTUUpKSB7CisJCQlpZiAoKG1wLT5tX3NiLnNiX3JibG9ja3MgPT0gMCkgfHwKKwkJCSAgICAobXAtPm1fc2Iuc2JfcmV4dHNpemUgPT0gMCkgfHwKKwkJCSAgICAoaXAtPmlfZC5kaV9leHRzaXplICUgbXAtPm1fc2Iuc2JfcmV4dHNpemUpKSB7CisJCQkJY29kZSA9IFhGU19FUlJPUihFSU5WQUwpOworCQkJCWdvdG8gZXJyb3JfcmV0dXJuOworCQkJfQorCQl9CisKKwkJLyoKKwkJICogQ2FuJ3QgbW9kaWZ5IGFuIGltbXV0YWJsZS9hcHBlbmQtb25seSBmaWxlIHVubGVzcworCQkgKiB3ZSBoYXZlIGFwcHJvcHJpYXRlIHBlcm1pc3Npb24uCisJCSAqLworCQlpZiAoKG1hc2sgJiBYRlNfQVRfWEZMQUdTKSAmJgorCQkgICAgKGlwLT5pX2QuZGlfZmxhZ3MgJgorCQkJCShYRlNfRElGTEFHX0lNTVVUQUJMRXxYRlNfRElGTEFHX0FQUEVORCkgfHwKKwkJICAgICAodmFwLT52YV94ZmxhZ3MgJgorCQkJCShYRlNfWEZMQUdfSU1NVVRBQkxFIHwgWEZTX1hGTEFHX0FQUEVORCkpKSAmJgorCQkgICAgIWNhcGFibGUoQ0FQX0xJTlVYX0lNTVVUQUJMRSkpIHsKKwkJCWNvZGUgPSBYRlNfRVJST1IoRVBFUk0pOworCQkJZ290byBlcnJvcl9yZXR1cm47CisJCX0KKwl9CisKKwkvKgorCSAqIE5vdyB3ZSBjYW4gbWFrZSB0aGUgY2hhbmdlcy4gIEJlZm9yZSB3ZSBqb2luIHRoZSBpbm9kZQorCSAqIHRvIHRoZSB0cmFuc2FjdGlvbiwgaWYgWEZTX0FUX1NJWkUgaXMgc2V0IHRoZW4gdGFrZSBjYXJlIG9mCisJICogdGhlIHBhcnQgb2YgdGhlIHRydW5jYXRpb24gdGhhdCBtdXN0IGJlIGRvbmUgd2l0aG91dCB0aGUKKwkgKiBpbm9kZSBsb2NrLiAgVGhpcyBuZWVkcyB0byBiZSBkb25lIGJlZm9yZSBqb2luaW5nIHRoZSBpbm9kZQorCSAqIHRvIHRoZSB0cmFuc2FjdGlvbiwgYmVjYXVzZSB0aGUgaW5vZGUgY2Fubm90IGJlIHVubG9ja2VkCisJICogb25jZSBpdCBpcyBhIHBhcnQgb2YgdGhlIHRyYW5zYWN0aW9uLgorCSAqLworCWlmIChtYXNrICYgWEZTX0FUX1NJWkUpIHsKKwkJY29kZSA9IDA7CisJCWlmICh2YXAtPnZhX3NpemUgPiBpcC0+aV9kLmRpX3NpemUpCisJCQljb2RlID0geGZzX2lncm93X3N0YXJ0KGlwLCB2YXAtPnZhX3NpemUsIGNyZWRwKTsKKwkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwkJaWYgKCFjb2RlKQorCQkJY29kZSA9IHhmc19pdHJ1bmNhdGVfZGF0YShpcCwgdmFwLT52YV9zaXplKTsKKwkJaWYgKGNvZGUpIHsKKwkJCUFTU0VSVCh0cCA9PSBOVUxMKTsKKwkJCWxvY2tfZmxhZ3MgJj0gflhGU19JTE9DS19FWENMOworCQkJQVNTRVJUKGxvY2tfZmxhZ3MgPT0gWEZTX0lPTE9DS19FWENMKTsKKwkJCWdvdG8gZXJyb3JfcmV0dXJuOworCQl9CisJCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfU0VUQVRUUl9TSVpFKTsKKwkJaWYgKChjb2RlID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsCisJCQkJCSAgICAgWEZTX0lUUlVOQ0FURV9MT0dfUkVTKG1wKSwgMCwKKwkJCQkJICAgICBYRlNfVFJBTlNfUEVSTV9MT0dfUkVTLAorCQkJCQkgICAgIFhGU19JVFJVTkNBVEVfTE9HX0NPVU5UKSkpIHsKKwkJCXhmc190cmFuc19jYW5jZWwodHAsIDApOworCQkJaWYgKG5lZWRfaW9sb2NrKQorCQkJCXhmc19pdW5sb2NrKGlwLCBYRlNfSU9MT0NLX0VYQ0wpOworCQkJcmV0dXJuIGNvZGU7CisJCX0KKwkJY29tbWl0X2ZsYWdzID0gWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUzsKKwkJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJfQorCisJaWYgKHRwKSB7CisJCXhmc190cmFuc19pam9pbih0cCwgaXAsIGxvY2tfZmxhZ3MpOworCQl4ZnNfdHJhbnNfaWhvbGQodHAsIGlwKTsKKwl9CisKKwkvKiBkZXRlcm1pbmUgd2hldGhlciBtYW5kYXRvcnkgbG9ja2luZyBtb2RlIGNoYW5nZXMgKi8KKwltYW5kbG9ja19iZWZvcmUgPSBNQU5ETE9DSyh2cCwgaXAtPmlfZC5kaV9tb2RlKTsKKworCS8qCisJICogVHJ1bmNhdGUgZmlsZS4gIE11c3QgaGF2ZSB3cml0ZSBwZXJtaXNzaW9uIGFuZCBub3QgYmUgYSBkaXJlY3RvcnkuCisJICovCisJaWYgKG1hc2sgJiBYRlNfQVRfU0laRSkgeworCQlpZiAodmFwLT52YV9zaXplID4gaXAtPmlfZC5kaV9zaXplKSB7CisJCQl4ZnNfaWdyb3dfZmluaXNoKHRwLCBpcCwgdmFwLT52YV9zaXplLAorCQkJICAgICEoZmxhZ3MgJiBBVFRSX0RNSSkpOworCQl9IGVsc2UgaWYgKCh2YXAtPnZhX3NpemUgPD0gaXAtPmlfZC5kaV9zaXplKSB8fAorCQkJICAgKCh2YXAtPnZhX3NpemUgPT0gMCkgJiYgaXAtPmlfZC5kaV9uZXh0ZW50cykpIHsKKwkJCS8qCisJCQkgKiBzaWduYWwgYSBzeW5jIHRyYW5zYWN0aW9uIHVubGVzcworCQkJICogd2UncmUgdHJ1bmNhdGluZyBhbiBhbHJlYWR5IHVubGlua2VkCisJCQkgKiBmaWxlIG9uIGEgd3N5bmMgZmlsZXN5c3RlbQorCQkJICovCisJCQljb2RlID0geGZzX2l0cnVuY2F0ZV9maW5pc2goJnRwLCBpcCwKKwkJCQkJICAgICh4ZnNfZnNpemVfdCl2YXAtPnZhX3NpemUsCisJCQkJCSAgICBYRlNfREFUQV9GT1JLLAorCQkJCQkgICAgKChpcC0+aV9kLmRpX25saW5rICE9IDAgfHwKKwkJCQkJICAgICAgIShtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9XU1lOQykpCisJCQkJCSAgICAgPyAxIDogMCkpOworCQkJaWYgKGNvZGUpIHsKKwkJCQlnb3RvIGFib3J0X3JldHVybjsKKwkJCX0KKwkJfQorCQkvKgorCQkgKiBIYXZlIHRvIGRvIHRoaXMgZXZlbiBpZiB0aGUgZmlsZSdzIHNpemUgZG9lc24ndCBjaGFuZ2UuCisJCSAqLworCQl0aW1lZmxhZ3MgfD0gWEZTX0lDSEdUSU1FX01PRCB8IFhGU19JQ0hHVElNRV9DSEc7CisJfQorCisJLyoKKwkgKiBDaGFuZ2UgZmlsZSBhY2Nlc3MgbW9kZXMuCisJICovCisJaWYgKG1hc2sgJiBYRlNfQVRfTU9ERSkgeworCQlpcC0+aV9kLmRpX21vZGUgJj0gU19JRk1UOworCQlpcC0+aV9kLmRpX21vZGUgfD0gdmFwLT52YV9tb2RlICYgflNfSUZNVDsKKworCQl4ZnNfdHJhbnNfbG9nX2lub2RlICh0cCwgaXAsIFhGU19JTE9HX0NPUkUpOworCQl0aW1lZmxhZ3MgfD0gWEZTX0lDSEdUSU1FX0NIRzsKKwl9CisKKwkvKgorCSAqIENoYW5nZSBmaWxlIG93bmVyc2hpcC4gIE11c3QgYmUgdGhlIG93bmVyIG9yIHByaXZpbGVnZWQuCisJICogSWYgdGhlIHN5c3RlbSB3YXMgY29uZmlndXJlZCB3aXRoIHRoZSAicmVzdHJpY3RlZF9jaG93biIKKwkgKiBvcHRpb24sIHRoZSBvd25lciBpcyBub3QgcGVybWl0dGVkIHRvIGdpdmUgYXdheSB0aGUgZmlsZSwKKwkgKiBhbmQgY2FuIGNoYW5nZSB0aGUgZ3JvdXAgaWQgb25seSB0byBhIGdyb3VwIG9mIHdoaWNoIGhlCisJICogb3Igc2hlIGlzIGEgbWVtYmVyLgorCSAqLworCWlmIChtYXNrICYgKFhGU19BVF9VSUR8WEZTX0FUX0dJRHxYRlNfQVRfUFJPSklEKSkgeworCQkvKgorCQkgKiBDQVBfRlNFVElEIG92ZXJyaWRlcyB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKwkJICoKKwkJICogVGhlIHNldC11c2VyLUlEIGFuZCBzZXQtZ3JvdXAtSUQgYml0cyBvZiBhIGZpbGUgd2lsbCBiZQorCQkgKiBjbGVhcmVkIHVwb24gc3VjY2Vzc2Z1bCByZXR1cm4gZnJvbSBjaG93bigpCisJCSAqLworCQlpZiAoKGlwLT5pX2QuZGlfbW9kZSAmIChTX0lTVUlEfFNfSVNHSUQpKSAmJgorCQkgICAgIWNhcGFibGUoQ0FQX0ZTRVRJRCkpIHsKKwkJCWlwLT5pX2QuZGlfbW9kZSAmPSB+KFNfSVNVSUR8U19JU0dJRCk7CisJCX0KKworCQkvKgorCQkgKiBDaGFuZ2UgdGhlIG93bmVyc2hpcHMgYW5kIHJlZ2lzdGVyIHF1b3RhIG1vZGlmaWNhdGlvbnMKKwkJICogaW4gdGhlIHRyYW5zYWN0aW9uLgorCQkgKi8KKwkJaWYgKGl1aWQgIT0gdWlkKSB7CisJCQlpZiAoWEZTX0lTX1VRVU9UQV9PTihtcCkpIHsKKwkJCQlBU1NFUlQobWFzayAmIFhGU19BVF9VSUQpOworCQkJCUFTU0VSVCh1ZHFwKTsKKwkJCQlvbGRkcXVvdDEgPSBYRlNfUU1fRFFWT1BDSE9XTihtcCwgdHAsIGlwLAorCQkJCQkJCSZpcC0+aV91ZHF1b3QsIHVkcXApOworCQkJfQorCQkJaXAtPmlfZC5kaV91aWQgPSB1aWQ7CisJCX0KKwkJaWYgKGlnaWQgIT0gZ2lkKSB7CisJCQlpZiAoWEZTX0lTX0dRVU9UQV9PTihtcCkpIHsKKwkJCQlBU1NFUlQobWFzayAmIFhGU19BVF9HSUQpOworCQkJCUFTU0VSVChnZHFwKTsKKwkJCQlvbGRkcXVvdDIgPSBYRlNfUU1fRFFWT1BDSE9XTihtcCwgdHAsIGlwLAorCQkJCQkJCSZpcC0+aV9nZHF1b3QsIGdkcXApOworCQkJfQorCQkJaXAtPmlfZC5kaV9naWQgPSBnaWQ7CisJCX0KKwkJaWYgKGlwcm9qaWQgIT0gcHJvamlkKSB7CisJCQlpcC0+aV9kLmRpX3Byb2ppZCA9IHByb2ppZDsKKwkJCS8qCisJCQkgKiBXZSBtYXkgaGF2ZSB0byByZXYgdGhlIGlub2RlIGFzIHdlbGwgYXMKKwkJCSAqIHRoZSBzdXBlcmJsb2NrIHZlcnNpb24gbnVtYmVyIHNpbmNlIHByb2ppZHMgZGlkbid0CisJCQkgKiBleGlzdCBiZWZvcmUgRElOT0RFX1ZFUlNJT05fMiBhbmQgU0JfVkVSU0lPTl9OTElOSy4KKwkJCSAqLworCQkJaWYgKGlwLT5pX2QuZGlfdmVyc2lvbiA9PSBYRlNfRElOT0RFX1ZFUlNJT05fMSkKKwkJCQl4ZnNfYnVtcF9pbm9fdmVyczIodHAsIGlwKTsKKwkJfQorCisJCXhmc190cmFuc19sb2dfaW5vZGUgKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CisJCXRpbWVmbGFncyB8PSBYRlNfSUNIR1RJTUVfQ0hHOworCX0KKworCisJLyoKKwkgKiBDaGFuZ2UgZmlsZSBhY2Nlc3Mgb3IgbW9kaWZpZWQgdGltZXMuCisJICovCisJaWYgKG1hc2sgJiAoWEZTX0FUX0FUSU1FfFhGU19BVF9NVElNRSkpIHsKKwkJaWYgKG1hc2sgJiBYRlNfQVRfQVRJTUUpIHsKKwkJCWlwLT5pX2QuZGlfYXRpbWUudF9zZWMgPSB2YXAtPnZhX2F0aW1lLnR2X3NlYzsKKwkJCWlwLT5pX2QuZGlfYXRpbWUudF9uc2VjID0gdmFwLT52YV9hdGltZS50dl9uc2VjOworCQkJaXAtPmlfdXBkYXRlX2NvcmUgPSAxOworCQkJdGltZWZsYWdzICY9IH5YRlNfSUNIR1RJTUVfQUNDOworCQl9CisJCWlmIChtYXNrICYgWEZTX0FUX01USU1FKSB7CisJCQlpcC0+aV9kLmRpX210aW1lLnRfc2VjID0gdmFwLT52YV9tdGltZS50dl9zZWM7CisJCQlpcC0+aV9kLmRpX210aW1lLnRfbnNlYyA9IHZhcC0+dmFfbXRpbWUudHZfbnNlYzsKKwkJCXRpbWVmbGFncyAmPSB+WEZTX0lDSEdUSU1FX01PRDsKKwkJCXRpbWVmbGFncyB8PSBYRlNfSUNIR1RJTUVfQ0hHOworCQl9CisJCWlmICh0cCAmJiAoZmxhZ3MgJiBBVFRSX1VUSU1FKSkKKwkJCXhmc190cmFuc19sb2dfaW5vZGUgKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CisJfQorCisJLyoKKwkgKiBDaGFuZ2UgWEZTLWFkZGVkIGF0dHJpYnV0ZXMuCisJICovCisJaWYgKG1hc2sgJiAoWEZTX0FUX0VYVFNJWkV8WEZTX0FUX1hGTEFHUykpIHsKKwkJaWYgKG1hc2sgJiBYRlNfQVRfRVhUU0laRSkgeworCQkJLyoKKwkJCSAqIENvbnZlcnRpbmcgYnl0ZXMgdG8gZnMgYmxvY2tzLgorCQkJICovCisJCQlpcC0+aV9kLmRpX2V4dHNpemUgPSB2YXAtPnZhX2V4dHNpemUgPj4KKwkJCQltcC0+bV9zYi5zYl9ibG9ja2xvZzsKKwkJfQorCQlpZiAobWFzayAmIFhGU19BVF9YRkxBR1MpIHsKKwkJCXVpbnQJZGlfZmxhZ3M7CisKKwkJCS8qIGNhbid0IHNldCBQUkVBTExPQyB0aGlzIHdheSwganVzdCBwcmVzZXJ2ZSBpdCAqLworCQkJZGlfZmxhZ3MgPSAoaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUFJFQUxMT0MpOworCQkJaWYgKHZhcC0+dmFfeGZsYWdzICYgWEZTX1hGTEFHX0lNTVVUQUJMRSkKKwkJCQlkaV9mbGFncyB8PSBYRlNfRElGTEFHX0lNTVVUQUJMRTsKKwkJCWlmICh2YXAtPnZhX3hmbGFncyAmIFhGU19YRkxBR19BUFBFTkQpCisJCQkJZGlfZmxhZ3MgfD0gWEZTX0RJRkxBR19BUFBFTkQ7CisJCQlpZiAodmFwLT52YV94ZmxhZ3MgJiBYRlNfWEZMQUdfU1lOQykKKwkJCQlkaV9mbGFncyB8PSBYRlNfRElGTEFHX1NZTkM7CisJCQlpZiAodmFwLT52YV94ZmxhZ3MgJiBYRlNfWEZMQUdfTk9BVElNRSkKKwkJCQlkaV9mbGFncyB8PSBYRlNfRElGTEFHX05PQVRJTUU7CisJCQlpZiAodmFwLT52YV94ZmxhZ3MgJiBYRlNfWEZMQUdfTk9EVU1QKQorCQkJCWRpX2ZsYWdzIHw9IFhGU19ESUZMQUdfTk9EVU1QOworCQkJaWYgKChpcC0+aV9kLmRpX21vZGUgJiBTX0lGTVQpID09IFNfSUZESVIpIHsKKwkJCQlpZiAodmFwLT52YV94ZmxhZ3MgJiBYRlNfWEZMQUdfUlRJTkhFUklUKQorCQkJCQlkaV9mbGFncyB8PSBYRlNfRElGTEFHX1JUSU5IRVJJVDsKKwkJCQlpZiAodmFwLT52YV94ZmxhZ3MgJiBYRlNfWEZMQUdfTk9TWU1MSU5LUykKKwkJCQkJZGlfZmxhZ3MgfD0gWEZTX0RJRkxBR19OT1NZTUxJTktTOworCQkJfSBlbHNlIHsKKwkJCQlpZiAodmFwLT52YV94ZmxhZ3MgJiBYRlNfWEZMQUdfUkVBTFRJTUUpIHsKKwkJCQkJZGlfZmxhZ3MgfD0gWEZTX0RJRkxBR19SRUFMVElNRTsKKwkJCQkJaXAtPmlfaW9jb3JlLmlvX2ZsYWdzIHw9IFhGU19JT0NPUkVfUlQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJaXAtPmlfaW9jb3JlLmlvX2ZsYWdzICY9IH5YRlNfSU9DT1JFX1JUOworCQkJCX0KKwkJCX0KKwkJCWlwLT5pX2QuZGlfZmxhZ3MgPSBkaV9mbGFnczsKKwkJfQorCQl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CisJCXRpbWVmbGFncyB8PSBYRlNfSUNIR1RJTUVfQ0hHOworCX0KKworCS8qCisJICogQ2hhbmdlIGZpbGUgaW5vZGUgY2hhbmdlIHRpbWUgb25seSBpZiBYRlNfQVRfQ1RJTUUgc2V0CisJICogQU5EIHdlIGhhdmUgYmVlbiBjYWxsZWQgYnkgYSBETUkgZnVuY3Rpb24uCisJICovCisKKwlpZiAoIChmbGFncyAmIEFUVFJfRE1JKSAmJiAobWFzayAmIFhGU19BVF9DVElNRSkgKSB7CisJCWlwLT5pX2QuZGlfY3RpbWUudF9zZWMgPSB2YXAtPnZhX2N0aW1lLnR2X3NlYzsKKwkJaXAtPmlfZC5kaV9jdGltZS50X25zZWMgPSB2YXAtPnZhX2N0aW1lLnR2X25zZWM7CisJCWlwLT5pX3VwZGF0ZV9jb3JlID0gMTsKKwkJdGltZWZsYWdzICY9IH5YRlNfSUNIR1RJTUVfQ0hHOworCX0KKworCS8qCisJICogU2VuZCBvdXQgdGltZXN0YW1wIGNoYW5nZXMgdGhhdCBuZWVkIHRvIGJlIHNldCB0byB0aGUKKwkgKiBjdXJyZW50IHRpbWUuICBOb3QgZG9uZSB3aGVuIGNhbGxlZCBieSBhIERNSSBmdW5jdGlvbi4KKwkgKi8KKwlpZiAodGltZWZsYWdzICYmICEoZmxhZ3MgJiBBVFRSX0RNSSkpCisJCXhmc19pY2hndGltZShpcCwgdGltZWZsYWdzKTsKKworCVhGU19TVEFUU19JTkMoeHNfaWdfYXR0cmNoZyk7CisKKwkvKgorCSAqIElmIHRoaXMgaXMgYSBzeW5jaHJvbm91cyBtb3VudCwgbWFrZSBzdXJlIHRoYXQgdGhlCisJICogdHJhbnNhY3Rpb24gZ29lcyB0byBkaXNrIGJlZm9yZSByZXR1cm5pbmcgdG8gdGhlIHVzZXIuCisJICogVGhpcyBpcyBzbGlnaHRseSBzdWItb3B0aW1hbCBpbiB0aGF0IHRydW5jYXRlcyByZXF1aXJlCisJICogdHdvIHN5bmMgdHJhbnNhY3Rpb25zIGluc3RlYWQgb2Ygb25lIGZvciB3c3luYyBmaWxlc3l0ZW1zLgorCSAqIE9uZSBmb3IgdGhlIHRydW5jYXRlIGFuZCBvbmUgZm9yIHRoZSB0aW1lc3RhbXBzIHNpbmNlIHdlCisJICogZG9uJ3Qgd2FudCB0byBjaGFuZ2UgdGhlIHRpbWVzdGFtcHMgdW5sZXNzIHdlJ3JlIHN1cmUgdGhlCisJICogdHJ1bmNhdGUgd29ya2VkLiAgVHJ1bmNhdGVzIGFyZSBsZXNzIHRoYW4gMSUgb2YgdGhlIGxhZGRpcworCSAqIG1peCBzbyB0aGlzIHByb2JhYmx5IGlzbid0IHdvcnRoIHRoZSB0cm91YmxlIHRvIG9wdGltaXplLgorCSAqLworCWNvZGUgPSAwOworCWlmICh0cCkgeworCQlpZiAobXAtPm1fZmxhZ3MgJiBYRlNfTU9VTlRfV1NZTkMpCisJCQl4ZnNfdHJhbnNfc2V0X3N5bmModHApOworCisJCWNvZGUgPSB4ZnNfdHJhbnNfY29tbWl0KHRwLCBjb21taXRfZmxhZ3MsIE5VTEwpOworCX0KKworCS8qCisJICogSWYgdGhlIChyZWd1bGFyKSBmaWxlJ3MgbWFuZGF0b3J5IGxvY2tpbmcgbW9kZSBjaGFuZ2VkLCB0aGVuCisJICogbm90aWZ5IHRoZSB2bm9kZS4gIFdlIGRvIHRoaXMgdW5kZXIgdGhlIGlub2RlIGxvY2sgdG8gcHJldmVudAorCSAqIHJhY2luZyBjYWxscyB0byB2b3Bfdm5vZGVfY2hhbmdlLgorCSAqLworCW1hbmRsb2NrX2FmdGVyID0gTUFORExPQ0sodnAsIGlwLT5pX2QuZGlfbW9kZSk7CisJaWYgKG1hbmRsb2NrX2JlZm9yZSAhPSBtYW5kbG9ja19hZnRlcikgeworCQlWT1BfVk5PREVfQ0hBTkdFKHZwLCBWQ0hBTkdFX0ZMQUdTX0VORl9MT0NLSU5HLAorCQkJCSBtYW5kbG9ja19hZnRlcik7CisJfQorCisJeGZzX2l1bmxvY2soaXAsIGxvY2tfZmxhZ3MpOworCisJLyoKKwkgKiBSZWxlYXNlIGFueSBkcXVvdChzKSB0aGUgaW5vZGUgaGFkIGtlcHQgYmVmb3JlIGNob3duLgorCSAqLworCVhGU19RTV9EUVJFTEUobXAsIG9sZGRxdW90MSk7CisJWEZTX1FNX0RRUkVMRShtcCwgb2xkZHF1b3QyKTsKKwlYRlNfUU1fRFFSRUxFKG1wLCB1ZHFwKTsKKwlYRlNfUU1fRFFSRUxFKG1wLCBnZHFwKTsKKworCWlmIChjb2RlKSB7CisJCXJldHVybiBjb2RlOworCX0KKworCWlmIChETV9FVkVOVF9FTkFCTEVEKHZwLT52X3Zmc3AsIGlwLCBETV9FVkVOVF9BVFRSSUJVVEUpICYmCisJICAgICEoZmxhZ3MgJiBBVFRSX0RNSSkpIHsKKwkJKHZvaWQpIFhGU19TRU5EX05BTUVTUChtcCwgRE1fRVZFTlRfQVRUUklCVVRFLCB2cCwgRE1fUklHSFRfTlVMTCwKKwkJCQkJTlVMTCwgRE1fUklHSFRfTlVMTCwgTlVMTCwgTlVMTCwKKwkJCQkJMCwgMCwgQVRfREVMQVlfRkxBRyhmbGFncykpOworCX0KKwlyZXR1cm4gMDsKKworIGFib3J0X3JldHVybjoKKwljb21taXRfZmxhZ3MgfD0gWEZTX1RSQU5TX0FCT1JUOworCS8qIEZBTExUSFJPVUdIICovCisgZXJyb3JfcmV0dXJuOgorCVhGU19RTV9EUVJFTEUobXAsIHVkcXApOworCVhGU19RTV9EUVJFTEUobXAsIGdkcXApOworCWlmICh0cCkgeworCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCBjb21taXRfZmxhZ3MpOworCX0KKwlpZiAobG9ja19mbGFncyAhPSAwKSB7CisJCXhmc19pdW5sb2NrKGlwLCBsb2NrX2ZsYWdzKTsKKwl9CisJcmV0dXJuIGNvZGU7Cit9CisKKworLyoKKyAqIHhmc19hY2Nlc3MKKyAqIE51bGwgY29udmVyc2lvbiBmcm9tIHZub2RlIG1vZGUgYml0cyB0byBpbm9kZSBtb2RlIGJpdHMsIGFzIGluIGVmcy4KKyAqLworU1RBVElDIGludAoreGZzX2FjY2VzcygKKwliaHZfZGVzY190CSpiZHAsCisJaW50CQltb2RlLAorCWNyZWRfdAkJKmNyZWRwKQoreworCXhmc19pbm9kZV90CSppcDsKKwlpbnQJCWVycm9yOworCisJdm5fdHJhY2VfZW50cnkoQkhWX1RPX1ZOT0RFKGJkcCksIF9fRlVOQ1RJT05fXywKKwkJCQkJICAgICAgIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKworCWlwID0gWEZTX0JIVlRPSShiZHApOworCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisJZXJyb3IgPSB4ZnNfaWFjY2VzcyhpcCwgbW9kZSwgY3JlZHApOworCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworLyoKKyAqIHhmc19yZWFkbGluaworICoKKyAqLworU1RBVElDIGludAoreGZzX3JlYWRsaW5rKAorCWJodl9kZXNjX3QJKmJkcCwKKwl1aW9fdAkJKnVpb3AsCisJaW50CQlpb2ZsYWdzLAorCWNyZWRfdAkJKmNyZWRwKQoreworCXhmc19pbm9kZV90ICAgICAqaXA7CisJaW50CQljb3VudDsKKwl4ZnNfb2ZmX3QJb2Zmc2V0OworCWludAkJcGF0aGxlbjsKKwl2bm9kZV90CQkqdnA7CisJaW50CQllcnJvciA9IDA7CisJeGZzX21vdW50X3QJKm1wOworCWludCAgICAgICAgICAgICBubWFwczsKKwl4ZnNfYm1idF9pcmVjX3QgbXZhbFtTWU1MSU5LX01BUFNdOworCXhmc19kYWRkcl90CWQ7CisJaW50CQlieXRlX2NudDsKKwlpbnQJCW47CisJeGZzX2J1Zl90CSpicDsKKworCXZwID0gQkhWX1RPX1ZOT0RFKGJkcCk7CisJdm5fdHJhY2VfZW50cnkodnAsIF9fRlVOQ1RJT05fXywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCisJaXAgPSBYRlNfQkhWVE9JKGJkcCk7CisJbXAgPSBpcC0+aV9tb3VudDsKKworCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCisJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKworCUFTU0VSVCgoaXAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSA9PSBTX0lGTE5LKTsKKworCW9mZnNldCA9IHVpb3AtPnVpb19vZmZzZXQ7CisJY291bnQgPSB1aW9wLT51aW9fcmVzaWQ7CisKKwlpZiAob2Zmc2V0IDwgMCkgeworCQllcnJvciA9IFhGU19FUlJPUihFSU5WQUwpOworCQlnb3RvIGVycm9yX3JldHVybjsKKwl9CisJaWYgKGNvdW50IDw9IDApIHsKKwkJZXJyb3IgPSAwOworCQlnb3RvIGVycm9yX3JldHVybjsKKwl9CisKKwlpZiAoIShpb2ZsYWdzICYgSU9fSU5WSVMpKSB7CisJCXhmc19pY2hndGltZShpcCwgWEZTX0lDSEdUSU1FX0FDQyk7CisJfQorCisJLyoKKwkgKiBTZWUgaWYgdGhlIHN5bWxpbmsgaXMgc3RvcmVkIGlubGluZS4KKwkgKi8KKwlwYXRobGVuID0gKGludClpcC0+aV9kLmRpX3NpemU7CisKKwlpZiAoaXAtPmlfZGYuaWZfZmxhZ3MgJiBYRlNfSUZJTkxJTkUpIHsKKwkJZXJyb3IgPSB1aW9fcmVhZChpcC0+aV9kZi5pZl91MS5pZl9kYXRhLCBwYXRobGVuLCB1aW9wKTsKKwl9CisJZWxzZSB7CisJCS8qCisJCSAqIFN5bWxpbmsgbm90IGlubGluZS4gIENhbGwgYm1hcCB0byBnZXQgaXQgaW4uCisJCSAqLworCQlubWFwcyA9IFNZTUxJTktfTUFQUzsKKworCQllcnJvciA9IHhmc19ibWFwaShOVUxMLCBpcCwgMCwgWEZTX0JfVE9fRlNCKG1wLCBwYXRobGVuKSwKKwkJCQkgIDAsIE5VTEwsIDAsIG12YWwsICZubWFwcywgTlVMTCk7CisKKwkJaWYgKGVycm9yKSB7CisJCQlnb3RvIGVycm9yX3JldHVybjsKKwkJfQorCisJCWZvciAobiA9IDA7IG4gPCBubWFwczsgbisrKSB7CisJCQlkID0gWEZTX0ZTQl9UT19EQUREUihtcCwgbXZhbFtuXS5icl9zdGFydGJsb2NrKTsKKwkJCWJ5dGVfY250ID0gWEZTX0ZTQl9UT19CKG1wLCBtdmFsW25dLmJyX2Jsb2NrY291bnQpOworCQkJYnAgPSB4ZnNfYnVmX3JlYWQobXAtPm1fZGRldl90YXJncCwgZCwKKwkJCQkgICAgICBCVE9CQihieXRlX2NudCksIDApOworCQkJZXJyb3IgPSBYRlNfQlVGX0dFVEVSUk9SKGJwKTsKKwkJCWlmIChlcnJvcikgeworCQkJCXhmc19pb2Vycm9yX2FsZXJ0KCJ4ZnNfcmVhZGxpbmsiLAorCQkJCQkgIGlwLT5pX21vdW50LCBicCwgWEZTX0JVRl9BRERSKGJwKSk7CisJCQkJeGZzX2J1Zl9yZWxzZShicCk7CisJCQkJZ290byBlcnJvcl9yZXR1cm47CisJCQl9CisJCQlpZiAocGF0aGxlbiA8IGJ5dGVfY250KQorCQkJCWJ5dGVfY250ID0gcGF0aGxlbjsKKwkJCXBhdGhsZW4gLT0gYnl0ZV9jbnQ7CisKKwkJCWVycm9yID0gdWlvX3JlYWQoWEZTX0JVRl9QVFIoYnApLCBieXRlX2NudCwgdWlvcCk7CisJCQl4ZnNfYnVmX3JlbHNlIChicCk7CisJCX0KKworCX0KKworCitlcnJvcl9yZXR1cm46CisKKwl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworLyoKKyAqIHhmc19mc3luYworICoKKyAqIFRoaXMgaXMgY2FsbGVkIHRvIHN5bmMgdGhlIGlub2RlIGFuZCBpdHMgZGF0YSBvdXQgdG8gZGlzay4KKyAqIFdlIG5lZWQgdG8gaG9sZCB0aGUgSS9PIGxvY2sgd2hpbGUgZmx1c2hpbmcgdGhlIGRhdGEsIGFuZAorICogdGhlIGlub2RlIGxvY2sgd2hpbGUgZmx1c2hpbmcgdGhlIGlub2RlLiAgVGhlIGlub2RlIGxvY2sgQ0FOTk9UCisgKiBiZSBoZWxkIHdoaWxlIGZsdXNoaW5nIHRoZSBkYXRhLCBzbyBhY3F1aXJlIGFmdGVyIHdlJ3JlIGRvbmUKKyAqIHdpdGggdGhhdC4KKyAqLworU1RBVElDIGludAoreGZzX2ZzeW5jKAorCWJodl9kZXNjX3QJKmJkcCwKKwlpbnQJCWZsYWcsCisJY3JlZF90CQkqY3JlZHAsCisJeGZzX29mZl90CXN0YXJ0LAorCXhmc19vZmZfdAlzdG9wKQoreworCXhmc19pbm9kZV90CSppcDsKKwl4ZnNfdHJhbnNfdAkqdHA7CisJaW50CQllcnJvcjsKKworCXZuX3RyYWNlX2VudHJ5KEJIVl9UT19WTk9ERShiZHApLAorCQkJX19GVU5DVElPTl9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisKKwlpcCA9IFhGU19CSFZUT0koYmRwKTsKKworCUFTU0VSVChzdGFydCA+PSAwICYmIHN0b3AgPj0gLTEpOworCisJaWYgKFhGU19GT1JDRURfU0hVVERPV04oaXAtPmlfbW91bnQpKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisKKwkvKgorCSAqIFdlIGFsd2F5cyBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSByZXF1aXJlZCBpbm9kZSBzdGF0ZQorCSAqIGlzIHNhZmUgb24gZGlzay4gIFRoZSB2bm9kZSBtaWdodCBiZSBjbGVhbiBidXQgYmVjYXVzZQorCSAqIG9mIGNvbW1pdHRlZCB0cmFuc2FjdGlvbnMgdGhhdCBoYXZlbid0IGhpdCB0aGUgZGlzayB5ZXQuCisJICogTGlrZXdpc2UsIHRoZXJlIGNvdWxkIGJlIHVuZmx1c2hlZCBub24tdHJhbnNhY3Rpb25hbAorCSAqIGNoYW5nZXMgdG8gdGhlIGlub2RlIGNvcmUgdGhhdCBoYXZlIHRvIGdvIHRvIGRpc2suCisJICoKKwkgKiBUaGUgZm9sbG93aW5nIGNvZGUgZGVwZW5kcyBvbiBvbmUgYXNzdW1wdGlvbjogIHRoYXQKKwkgKiBhbnkgdHJhbnNhY3Rpb24gdGhhdCBjaGFuZ2VzIGFuIGlub2RlIGxvZ3MgdGhlIGNvcmUKKwkgKiBiZWNhdXNlIGl0IGhhcyB0byBjaGFuZ2Ugc29tZSBmaWVsZCBpbiB0aGUgaW5vZGUgY29yZQorCSAqICh0eXBpY2FsbHkgbmV4dGVudHMgb3IgbmJsb2NrcykuICBUaGF0IGFzc3VtcHRpb24KKwkgKiBpbXBsaWVzIHRoYXQgYW55IHRyYW5zYWN0aW9ucyBhZ2FpbnN0IGFuIGlub2RlIHdpbGwKKwkgKiBjYXRjaCBhbnkgbm9uLXRyYW5zYWN0aW9uYWwgdXBkYXRlcy4gIElmIGlub2RlLWFsdGVyaW5nCisJICogdHJhbnNhY3Rpb25zIGV4aXN0IHRoYXQgdmlvbGF0ZSB0aGlzIGFzc3VtcHRpb24sIHRoZQorCSAqIGNvZGUgYnJlYWtzLiAgUmlnaHQgbm93LCBpdCBmaWd1cmVzIHRoYXQgaWYgdGhlIGludm9sdmVkCisJICogdXBkYXRlXyogZmllbGQgaXMgY2xlYXIgYW5kIHRoZSBpbm9kZSBpcyB1bnBpbm5lZCwgdGhlCisJICogaW5vZGUgaXMgY2xlYW4uICBFaXRoZXIgaXQncyBiZWVuIGZsdXNoZWQgb3IgaXQncyBiZWVuCisJICogY29tbWl0dGVkIGFuZCB0aGUgY29tbWl0IGhhcyBoaXQgdGhlIGRpc2sgdW5waW5uaW5nIHRoZSBpbm9kZS4KKwkgKiAoTm90ZSB0aGF0IHhmc19pbm9kZV9pdGVtX2Zvcm1hdCgpIGNhbGxlZCBhdCBjb21taXQgY2xlYXJzCisJICogdGhlIHVwZGF0ZV8qIGZpZWxkcy4pCisJICovCisJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKworCS8qIElmIHdlIGFyZSBmbHVzaGluZyBkYXRhIHRoZW4gd2UgY2FyZSBhYm91dCB1cGRhdGVfc2l6ZQorCSAqIGJlaW5nIHNldCwgb3RoZXJ3aXNlIHdlIGNhcmUgYWJvdXQgdXBkYXRlX2NvcmUKKwkgKi8KKwlpZiAoKGZsYWcgJiBGU1lOQ19EQVRBKSA/CisJCQkoaXAtPmlfdXBkYXRlX3NpemUgPT0gMCkgOgorCQkJKGlwLT5pX3VwZGF0ZV9jb3JlID09IDApKSB7CisJCS8qCisJCSAqIFRpbWVzdGFtcHMvc2l6ZSBoYXZlbid0IGNoYW5nZWQgc2luY2UgbGFzdCBpbm9kZQorCQkgKiBmbHVzaCBvciBpbm9kZSB0cmFuc2FjdGlvbiBjb21taXQuICBUaGF0IG1lYW5zCisJCSAqIGVpdGhlciBub3RoaW5nIGdvdCB3cml0dGVuIG9yIGEgdHJhbnNhY3Rpb24KKwkJICogY29tbWl0dGVkIHdoaWNoIGNhdWdodCB0aGUgdXBkYXRlcy4JSWYgdGhlCisJCSAqIGxhdHRlciBoYXBwZW5lZCBhbmQgdGhlIHRyYW5zYWN0aW9uIGhhc24ndAorCQkgKiBoaXQgdGhlIGRpc2sgeWV0LCB0aGUgaW5vZGUgd2lsbCBiZSBzdGlsbAorCQkgKiBiZSBwaW5uZWQuICBJZiBpdCBpcywgZm9yY2UgdGhlIGxvZy4KKwkJICovCisKKwkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOworCisJCWlmICh4ZnNfaXBpbmNvdW50KGlwKSkgeworCQkJeGZzX2xvZ19mb3JjZShpcC0+aV9tb3VudCwgKHhmc19sc25fdCkwLAorCQkJCSAgICAgIFhGU19MT0dfRk9SQ0UgfAorCQkJCSAgICAgICgoZmxhZyAmIEZTWU5DX1dBSVQpCisJCQkJICAgICAgID8gWEZTX0xPR19TWU5DIDogMCkpOworCQl9CisJCWVycm9yID0gMDsKKwl9IGVsc2UJeworCQkvKgorCQkgKiBLaWNrIG9mZiBhIHRyYW5zYWN0aW9uIHRvIGxvZyB0aGUgaW5vZGUKKwkJICogY29yZSB0byBnZXQgdGhlIHVwZGF0ZXMuICBNYWtlIGl0CisJCSAqIHN5bmMgaWYgRlNZTkNfV0FJVCBpcyBwYXNzZWQgaW4gKHdoaWNoCisJCSAqIGlzIGRvbmUgYnkgZXZlcnlib2R5IGJ1dCBzcGVjZnMpLiAgVGhlCisJCSAqIHN5bmMgdHJhbnNhY3Rpb24gd2lsbCBhbHNvIGZvcmNlIHRoZSBsb2cuCisJCSAqLworCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisJCXRwID0geGZzX3RyYW5zX2FsbG9jKGlwLT5pX21vdW50LCBYRlNfVFJBTlNfRlNZTkNfVFMpOworCQlpZiAoKGVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsCisJCQkJWEZTX0ZTWU5DX1RTX0xPR19SRVMoaXAtPmlfbW91bnQpLAorCQkJCTAsIDAsIDApKSkgIHsKKwkJCXhmc190cmFuc19jYW5jZWwodHAsIDApOworCQkJcmV0dXJuIGVycm9yOworCQl9CisJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCisJCS8qCisJCSAqIE5vdGUgLSBpdCdzIHBvc3NpYmxlIHRoYXQgd2UgbWlnaHQgaGF2ZSBwdXNoZWQKKwkJICogb3Vyc2VsdmVzIG91dCBvZiB0aGUgd2F5IGR1cmluZyB0cmFuc19yZXNlcnZlCisJCSAqIHdoaWNoIHdvdWxkIGZsdXNoIHRoZSBpbm9kZS4JIEJ1dCB0aGVyZSdzIG5vCisJCSAqIGd1YXJhbnRlZSB0aGF0IHRoZSBpbm9kZSBidWZmZXIgaGFzIGFjdHVhbGx5CisJCSAqIGdvbmUgb3V0IHlldCAoaXQncyBkZWx3cmkpLglQbHVzIHRoZSBidWZmZXIKKwkJICogY291bGQgYmUgcGlubmVkIGFueXdheSBpZiBpdCdzIHBhcnQgb2YgYW4KKwkJICogaW5vZGUgaW4gYW5vdGhlciByZWNlbnQgdHJhbnNhY3Rpb24uCSBTbyB3ZQorCQkgKiBwbGF5IGl0IHNhZmUgYW5kIGZpcmUgb2ZmIHRoZSB0cmFuc2FjdGlvbiBhbnl3YXkuCisJCSAqLworCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCXhmc190cmFuc19paG9sZCh0cCwgaXApOworCQl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CisJCWlmIChmbGFnICYgRlNZTkNfV0FJVCkKKwkJCXhmc190cmFuc19zZXRfc3luYyh0cCk7CisJCWVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwgMCwgTlVMTCk7CisKKwkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwl9CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgYnkgeGZzX2luYWN0aXZlIHRvIGZyZWUgYW55IGJsb2NrcyBiZXlvbmQgZW9mLAorICogd2hlbiB0aGUgbGluayBjb3VudCBpc24ndCB6ZXJvLgorICovCitTVEFUSUMgaW50Cit4ZnNfaW5hY3RpdmVfZnJlZV9lb2ZibG9ja3MoCisJeGZzX21vdW50X3QJKm1wLAorCXhmc19pbm9kZV90CSppcCkKK3sKKwl4ZnNfdHJhbnNfdAkqdHA7CisJaW50CQllcnJvcjsKKwl4ZnNfZmlsZW9mZl90CWVuZF9mc2I7CisJeGZzX2ZpbGVvZmZfdAlsYXN0X2ZzYjsKKwl4ZnNfZmlsYmxrc190CW1hcF9sZW47CisJaW50CQluaW1hcHM7CisJeGZzX2JtYnRfaXJlY190CWltYXA7CisKKwkvKgorCSAqIEZpZ3VyZSBvdXQgaWYgdGhlcmUgYXJlIGFueSBibG9ja3MgYmV5b25kIHRoZSBlbmQKKwkgKiBvZiB0aGUgZmlsZS4gIElmIG5vdCwgdGhlbiB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLgorCSAqLworCWVuZF9mc2IgPSBYRlNfQl9UT19GU0IobXAsICgoeGZzX3Vmc2l6ZV90KWlwLT5pX2QuZGlfc2l6ZSkpOworCWxhc3RfZnNiID0gWEZTX0JfVE9fRlNCKG1wLCAoeGZzX3Vmc2l6ZV90KVhGU19NQVhJT0ZGU0VUKG1wKSk7CisJbWFwX2xlbiA9IGxhc3RfZnNiIC0gZW5kX2ZzYjsKKwlpZiAobWFwX2xlbiA8PSAwKQorCQlyZXR1cm4gKDApOworCisJbmltYXBzID0gMTsKKwl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOworCWVycm9yID0geGZzX2JtYXBpKE5VTEwsIGlwLCBlbmRfZnNiLCBtYXBfbGVuLCAwLAorCQkJICBOVUxMLCAwLCAmaW1hcCwgJm5pbWFwcywgTlVMTCk7CisJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOworCisJaWYgKCFlcnJvciAmJiAobmltYXBzICE9IDApICYmCisJICAgIChpbWFwLmJyX3N0YXJ0YmxvY2sgIT0gSE9MRVNUQVJUQkxPQ0spKSB7CisJCS8qCisJCSAqIEF0dGFjaCB0aGUgZHF1b3RzIHRvIHRoZSBpbm9kZSB1cCBmcm9udC4KKwkJICovCisJCWlmICgoZXJyb3IgPSBYRlNfUU1fRFFBVFRBQ0gobXAsIGlwLCAwKSkpCisJCQlyZXR1cm4gKGVycm9yKTsKKworCQkvKgorCQkgKiBUaGVyZSBhcmUgYmxvY2tzIGFmdGVyIHRoZSBlbmQgb2YgZmlsZS4KKwkJICogRnJlZSB0aGVtIHVwIG5vdyBieSB0cnVuY2F0aW5nIHRoZSBmaWxlIHRvCisJCSAqIGl0cyBjdXJyZW50IHNpemUuCisJCSAqLworCQl0cCA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX0lOQUNUSVZFKTsKKworCQkvKgorCQkgKiBEbyB0aGUgeGZzX2l0cnVuY2F0ZV9zdGFydCgpIGNhbGwgYmVmb3JlCisJCSAqIHJlc2VydmluZyBhbnkgbG9nIHNwYWNlIGJlY2F1c2UKKwkJICogaXRydW5jYXRlX3N0YXJ0IHdpbGwgY2FsbCBpbnRvIHRoZSBidWZmZXIKKwkJICogY2FjaGUgYW5kIHdlIGNhbid0CisJCSAqIGRvIHRoYXQgd2l0aGluIGEgdHJhbnNhY3Rpb24uCisJCSAqLworCQl4ZnNfaWxvY2soaXAsIFhGU19JT0xPQ0tfRVhDTCk7CisJCXhmc19pdHJ1bmNhdGVfc3RhcnQoaXAsIFhGU19JVFJVTkNfREVGSU5JVEUsCisJCQkJICAgIGlwLT5pX2QuZGlfc2l6ZSk7CisKKwkJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgMCwKKwkJCQkJICBYRlNfSVRSVU5DQVRFX0xPR19SRVMobXApLAorCQkJCQkgIDAsIFhGU19UUkFOU19QRVJNX0xPR19SRVMsCisJCQkJCSAgWEZTX0lUUlVOQ0FURV9MT0dfQ09VTlQpOworCQlpZiAoZXJyb3IpIHsKKwkJCUFTU0VSVChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSk7CisJCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCAwKTsKKwkJCXhmc19pdW5sb2NrKGlwLCBYRlNfSU9MT0NLX0VYQ0wpOworCQkJcmV0dXJuIChlcnJvcik7CisJCX0KKworCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwKKwkJCQlYRlNfSU9MT0NLX0VYQ0wgfAorCQkJCVhGU19JTE9DS19FWENMKTsKKwkJeGZzX3RyYW5zX2lob2xkKHRwLCBpcCk7CisKKwkJZXJyb3IgPSB4ZnNfaXRydW5jYXRlX2ZpbmlzaCgmdHAsIGlwLAorCQkJCQkgICAgIGlwLT5pX2QuZGlfc2l6ZSwKKwkJCQkJICAgICBYRlNfREFUQV9GT1JLLAorCQkJCQkgICAgIDApOworCQkvKgorCQkgKiBJZiB3ZSBnZXQgYW4gZXJyb3IgYXQgdGhpcyBwb2ludCB3ZQorCQkgKiBzaW1wbHkgZG9uJ3QgYm90aGVyIHRydW5jYXRpbmcgdGhlIGZpbGUuCisJCSAqLworCQlpZiAoZXJyb3IpIHsKKwkJCXhmc190cmFuc19jYW5jZWwodHAsCisJCQkJCSAoWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUyB8CisJCQkJCSAgWEZTX1RSQU5TX0FCT1JUKSk7CisJCX0gZWxzZSB7CisJCQllcnJvciA9IHhmc190cmFuc19jb21taXQodHAsCisJCQkJCQlYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTLAorCQkJCQkJTlVMTCk7CisJCX0KKwkJeGZzX2l1bmxvY2soaXAsIFhGU19JT0xPQ0tfRVhDTCB8IFhGU19JTE9DS19FWENMKTsKKwl9CisJcmV0dXJuIChlcnJvcik7Cit9CisKKy8qCisgKiBGcmVlIGEgc3ltbGluayB0aGF0IGhhcyBibG9ja3MgYXNzb2NpYXRlZCB3aXRoIGl0LgorICovCitTVEFUSUMgaW50Cit4ZnNfaW5hY3RpdmVfc3ltbGlua19ybXQoCisJeGZzX2lub2RlX3QJKmlwLAorCXhmc190cmFuc190CSoqdHBwKQoreworCXhmc19idWZfdAkqYnA7CisJaW50CQljb21taXR0ZWQ7CisJaW50CQlkb25lOworCWludAkJZXJyb3I7CisJeGZzX2ZzYmxvY2tfdAlmaXJzdF9ibG9jazsKKwl4ZnNfYm1hcF9mcmVlX3QJZnJlZV9saXN0OworCWludAkJaTsKKwl4ZnNfbW91bnRfdAkqbXA7CisJeGZzX2JtYnRfaXJlY190CW12YWxbU1lNTElOS19NQVBTXTsKKwlpbnQJCW5tYXBzOworCXhmc190cmFuc190CSpudHA7CisJaW50CQlzaXplOworCXhmc190cmFuc190CSp0cDsKKworCXRwID0gKnRwcDsKKwltcCA9IGlwLT5pX21vdW50OworCUFTU0VSVChpcC0+aV9kLmRpX3NpemUgPiBYRlNfSUZPUktfRFNJWkUoaXApKTsKKwkvKgorCSAqIFdlJ3JlIGZyZWVpbmcgYSBzeW1saW5rIHRoYXQgaGFzIHNvbWUKKwkgKiBibG9ja3MgYWxsb2NhdGVkIHRvIGl0LiAgRnJlZSB0aGUKKwkgKiBibG9ja3MgaGVyZS4gIFdlIGtub3cgdGhhdCB3ZSd2ZSBnb3QKKwkgKiBlaXRoZXIgMSBvciAyIGV4dGVudHMgYW5kIHRoYXQgd2UgY2FuCisJICogZnJlZSB0aGVtIGFsbCBpbiBvbmUgYnVubWFwaSBjYWxsLgorCSAqLworCUFTU0VSVChpcC0+aV9kLmRpX25leHRlbnRzID4gMCAmJiBpcC0+aV9kLmRpX25leHRlbnRzIDw9IDIpOworCWlmICgoZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgMCwgWEZTX0lUUlVOQ0FURV9MT0dfUkVTKG1wKSwgMCwKKwkJCVhGU19UUkFOU19QRVJNX0xPR19SRVMsIFhGU19JVFJVTkNBVEVfTE9HX0NPVU5UKSkpIHsKKwkJQVNTRVJUKFhGU19GT1JDRURfU0hVVERPV04obXApKTsKKwkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgMCk7CisJCSp0cHAgPSBOVUxMOworCQlyZXR1cm4gZXJyb3I7CisJfQorCS8qCisJICogTG9jayB0aGUgaW5vZGUsIGZpeCB0aGUgc2l6ZSwgYW5kIGpvaW4gaXQgdG8gdGhlIHRyYW5zYWN0aW9uLgorCSAqIEhvbGQgaXQgc28gaW4gdGhlIG5vcm1hbCBwYXRoLCB3ZSBzdGlsbCBoYXZlIGl0IGxvY2tlZCBmb3IKKwkgKiB0aGUgc2Vjb25kIHRyYW5zYWN0aW9uLiAgSW4gdGhlIGVycm9yIHBhdGhzIHdlIG5lZWQgaXQKKwkgKiBoZWxkIHNvIHRoZSBjYW5jZWwgd29uJ3QgcmVsZSBpdCwgc2VlIGJlbG93LgorCSAqLworCXhmc19pbG9jayhpcCwgWEZTX0lPTE9DS19FWENMIHwgWEZTX0lMT0NLX0VYQ0wpOworCXNpemUgPSAoaW50KWlwLT5pX2QuZGlfc2l6ZTsKKwlpcC0+aV9kLmRpX3NpemUgPSAwOworCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JTE9DS19FWENMIHwgWEZTX0lPTE9DS19FWENMKTsKKwl4ZnNfdHJhbnNfaWhvbGQodHAsIGlwKTsKKwl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CisJLyoKKwkgKiBGaW5kIHRoZSBibG9jayhzKSBzbyB3ZSBjYW4gaW52YWwgYW5kIHVubWFwIHRoZW0uCisJICovCisJZG9uZSA9IDA7CisJWEZTX0JNQVBfSU5JVCgmZnJlZV9saXN0LCAmZmlyc3RfYmxvY2spOworCW5tYXBzID0gc2l6ZW9mKG12YWwpIC8gc2l6ZW9mKG12YWxbMF0pOworCWlmICgoZXJyb3IgPSB4ZnNfYm1hcGkodHAsIGlwLCAwLCBYRlNfQl9UT19GU0IobXAsIHNpemUpLAorCQkJWEZTX0JNQVBJX01FVEFEQVRBLCAmZmlyc3RfYmxvY2ssIDAsIG12YWwsICZubWFwcywKKwkJCSZmcmVlX2xpc3QpKSkKKwkJZ290byBlcnJvcjA7CisJLyoKKwkgKiBJbnZhbGlkYXRlIHRoZSBibG9jayhzKS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbm1hcHM7IGkrKykgeworCQlicCA9IHhmc190cmFuc19nZXRfYnVmKHRwLCBtcC0+bV9kZGV2X3RhcmdwLAorCQkJWEZTX0ZTQl9UT19EQUREUihtcCwgbXZhbFtpXS5icl9zdGFydGJsb2NrKSwKKwkJCVhGU19GU0JfVE9fQkIobXAsIG12YWxbaV0uYnJfYmxvY2tjb3VudCksIDApOworCQl4ZnNfdHJhbnNfYmludmFsKHRwLCBicCk7CisJfQorCS8qCisJICogVW5tYXAgdGhlIGRlYWQgYmxvY2socykgdG8gdGhlIGZyZWVfbGlzdC4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2J1bm1hcGkodHAsIGlwLCAwLCBzaXplLCBYRlNfQk1BUElfTUVUQURBVEEsIG5tYXBzLAorCQkJJmZpcnN0X2Jsb2NrLCAmZnJlZV9saXN0LCAmZG9uZSkpKQorCQlnb3RvIGVycm9yMTsKKwlBU1NFUlQoZG9uZSk7CisJLyoKKwkgKiBDb21taXQgdGhlIGZpcnN0IHRyYW5zYWN0aW9uLiAgVGhpcyBsb2dzIHRoZSBFRkkgYW5kIHRoZSBpbm9kZS4KKwkgKi8KKwlpZiAoKGVycm9yID0geGZzX2JtYXBfZmluaXNoKCZ0cCwgJmZyZWVfbGlzdCwgZmlyc3RfYmxvY2ssICZjb21taXR0ZWQpKSkKKwkJZ290byBlcnJvcjE7CisJLyoKKwkgKiBUaGUgdHJhbnNhY3Rpb24gbXVzdCBoYXZlIGJlZW4gY29tbWl0dGVkLCBzaW5jZSB0aGVyZSB3ZXJlCisJICogYWN0dWFsbHkgZXh0ZW50cyBmcmVlZCBieSB4ZnNfYnVubWFwaS4gIFNlZSB4ZnNfYm1hcF9maW5pc2guCisJICogVGhlIG5ldyB0cCBoYXMgdGhlIGV4dGVudCBmcmVlaW5nIGFuZCBFRkRzLgorCSAqLworCUFTU0VSVChjb21taXR0ZWQpOworCS8qCisJICogVGhlIGZpcnN0IHhhY3Qgd2FzIGNvbW1pdHRlZCwgc28gYWRkIHRoZSBpbm9kZSB0byB0aGUgbmV3IG9uZS4KKwkgKiBNYXJrIGl0IGRpcnR5IHNvIGl0IHdpbGwgYmUgbG9nZ2VkIGFuZCBtb3ZlZCBmb3J3YXJkIGluIHRoZSBsb2cgYXMKKwkgKiBwYXJ0IG9mIGV2ZXJ5IGNvbW1pdC4KKwkgKi8KKwl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCBYRlNfSUxPQ0tfRVhDTCB8IFhGU19JT0xPQ0tfRVhDTCk7CisJeGZzX3RyYW5zX2lob2xkKHRwLCBpcCk7CisJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgaXAsIFhGU19JTE9HX0NPUkUpOworCS8qCisJICogR2V0IGEgbmV3LCBlbXB0eSB0cmFuc2FjdGlvbiB0byByZXR1cm4gdG8gb3VyIGNhbGxlci4KKwkgKi8KKwludHAgPSB4ZnNfdHJhbnNfZHVwKHRwKTsKKwkvKgorCSAqIENvbW1pdCB0aGUgdHJhbnNhY3Rpb24gY29udGFpbmluZyBleHRlbnQgZnJlZWluZyBhbmQgRUZEJ3MuCisJICogSWYgd2UgZ2V0IGFuIGVycm9yIG9uIHRoZSBjb21taXQgaGVyZSBvciBvbiB0aGUgcmVzZXJ2ZSBiZWxvdywKKwkgKiB3ZSBuZWVkIHRvIHVubG9jayB0aGUgaW5vZGUgc2luY2UgdGhlIG5ldyB0cmFuc2FjdGlvbiBkb2Vzbid0CisJICogaGF2ZSB0aGUgaW5vZGUgYXR0YWNoZWQuCisJICovCisJZXJyb3IgPSB4ZnNfdHJhbnNfY29tbWl0KHRwLCAwLCBOVUxMKTsKKwl0cCA9IG50cDsKKwlpZiAoZXJyb3IpIHsKKwkJQVNTRVJUKFhGU19GT1JDRURfU0hVVERPV04obXApKTsKKwkJZ290byBlcnJvcjA7CisJfQorCS8qCisJICogUmVtb3ZlIHRoZSBtZW1vcnkgZm9yIGV4dGVudCBkZXNjcmlwdGlvbnMgKGp1c3QgYm9va2tlZXBpbmcpLgorCSAqLworCWlmIChpcC0+aV9kZi5pZl9ieXRlcykKKwkJeGZzX2lkYXRhX3JlYWxsb2MoaXAsIC1pcC0+aV9kZi5pZl9ieXRlcywgWEZTX0RBVEFfRk9SSyk7CisJQVNTRVJUKGlwLT5pX2RmLmlmX2J5dGVzID09IDApOworCS8qCisJICogUHV0IGFuIGl0cnVuY2F0ZSBsb2cgcmVzZXJ2YXRpb24gaW4gdGhlIG5ldyB0cmFuc2FjdGlvbgorCSAqIGZvciBvdXIgY2FsbGVyLgorCSAqLworCWlmICgoZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgMCwgWEZTX0lUUlVOQ0FURV9MT0dfUkVTKG1wKSwgMCwKKwkJCVhGU19UUkFOU19QRVJNX0xPR19SRVMsIFhGU19JVFJVTkNBVEVfTE9HX0NPVU5UKSkpIHsKKwkJQVNTRVJUKFhGU19GT1JDRURfU0hVVERPV04obXApKTsKKwkJZ290byBlcnJvcjA7CisJfQorCS8qCisJICogUmV0dXJuIHdpdGggdGhlIGlub2RlIGxvY2tlZCBidXQgbm90IGpvaW5lZCB0byB0aGUgdHJhbnNhY3Rpb24uCisJICovCisJKnRwcCA9IHRwOworCXJldHVybiAwOworCisgZXJyb3IxOgorCXhmc19ibWFwX2NhbmNlbCgmZnJlZV9saXN0KTsKKyBlcnJvcjA6CisJLyoKKwkgKiBIYXZlIHRvIGNvbWUgaGVyZSB3aXRoIHRoZSBpbm9kZSBsb2NrZWQgYW5kIGVpdGhlcgorCSAqIChoZWxkIGFuZCBpbiB0aGUgdHJhbnNhY3Rpb24pIG9yIChub3QgaW4gdGhlIHRyYW5zYWN0aW9uKS4KKwkgKiBJZiB0aGUgaW5vZGUgaXNuJ3QgaGVsZCB0aGVuIGNhbmNlbCB3b3VsZCBpcHV0IGl0LCBidXQKKwkgKiB0aGF0J3Mgd3Jvbmcgc2luY2UgdGhpcyBpcyBpbmFjdGl2ZSBhbmQgdGhlIHZub2RlIHJlZgorCSAqIGNvdW50IGlzIDAgYWxyZWFkeS4KKwkgKiBDYW5jZWwgd29uJ3QgZG8gYW55dGhpbmcgdG8gdGhlIGlub2RlIGlmIGhlbGQsIGJ1dCBpdCBzdGlsbAorCSAqIG5lZWRzIHRvIGJlIGxvY2tlZCB1bnRpbCB0aGUgY2FuY2VsIGlzIGRvbmUsIGlmIGl0IHdhcworCSAqIGpvaW5lZCB0byB0aGUgdHJhbnNhY3Rpb24uCisJICovCisJeGZzX3RyYW5zX2NhbmNlbCh0cCwgWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUyB8IFhGU19UUkFOU19BQk9SVCk7CisJeGZzX2l1bmxvY2soaXAsIFhGU19JT0xPQ0tfRVhDTCB8IFhGU19JTE9DS19FWENMKTsKKwkqdHBwID0gTlVMTDsKKwlyZXR1cm4gZXJyb3I7CisKK30KKworU1RBVElDIGludAoreGZzX2luYWN0aXZlX3N5bWxpbmtfbG9jYWwoCisJeGZzX2lub2RlX3QJKmlwLAorCXhmc190cmFuc190CSoqdHBwKQoreworCWludAkJZXJyb3I7CisKKwlBU1NFUlQoaXAtPmlfZC5kaV9zaXplIDw9IFhGU19JRk9SS19EU0laRShpcCkpOworCS8qCisJICogV2UncmUgZnJlZWluZyBhIHN5bWxpbmsgd2hpY2ggZml0IGludG8KKwkgKiB0aGUgaW5vZGUuICBKdXN0IGZyZWUgdGhlIG1lbW9yeSB1c2VkCisJICogdG8gaG9sZCB0aGUgb2xkIHN5bWxpbmsuCisJICovCisJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSgqdHBwLCAwLAorCQkJCSAgWEZTX0lUUlVOQ0FURV9MT0dfUkVTKGlwLT5pX21vdW50KSwKKwkJCQkgIDAsIFhGU19UUkFOU19QRVJNX0xPR19SRVMsCisJCQkJICBYRlNfSVRSVU5DQVRFX0xPR19DT1VOVCk7CisKKwlpZiAoZXJyb3IpIHsKKwkJeGZzX3RyYW5zX2NhbmNlbCgqdHBwLCAwKTsKKwkJKnRwcCA9IE5VTEw7CisJCXJldHVybiAoZXJyb3IpOworCX0KKwl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMIHwgWEZTX0lPTE9DS19FWENMKTsKKworCS8qCisJICogWmVybyBsZW5ndGggc3ltbGlua3MgX2Nhbl8gZXhpc3QuCisJICovCisJaWYgKGlwLT5pX2RmLmlmX2J5dGVzID4gMCkgeworCQl4ZnNfaWRhdGFfcmVhbGxvYyhpcCwKKwkJCQkgIC0oaXAtPmlfZGYuaWZfYnl0ZXMpLAorCQkJCSAgWEZTX0RBVEFfRk9SSyk7CisJCUFTU0VSVChpcC0+aV9kZi5pZl9ieXRlcyA9PSAwKTsKKwl9CisJcmV0dXJuICgwKTsKK30KKworLyoKKyAqCisgKi8KK1NUQVRJQyBpbnQKK3hmc19pbmFjdGl2ZV9hdHRycygKKwl4ZnNfaW5vZGVfdAkqaXAsCisJeGZzX3RyYW5zX3QJKip0cHApCit7CisJeGZzX3RyYW5zX3QJKnRwOworCWludAkJZXJyb3I7CisJeGZzX21vdW50X3QJKm1wOworCisJQVNTRVJUKGlzbXJsb2NrZWQoJmlwLT5pX2lvbG9jaywgTVJfVVBEQVRFKSk7CisJdHAgPSAqdHBwOworCW1wID0gaXAtPmlfbW91bnQ7CisJQVNTRVJUKGlwLT5pX2QuZGlfZm9ya29mZiAhPSAwKTsKKwl4ZnNfdHJhbnNfY29tbWl0KHRwLCBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTLCBOVUxMKTsKKwl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCisJZXJyb3IgPSB4ZnNfYXR0cl9pbmFjdGl2ZShpcCk7CisJaWYgKGVycm9yKSB7CisJCSp0cHAgPSBOVUxMOworCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lPTE9DS19FWENMKTsKKwkJcmV0dXJuIChlcnJvcik7IC8qIGdvdG8gb3V0Ki8KKwl9CisKKwl0cCA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX0lOQUNUSVZFKTsKKwllcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCAwLAorCQkJCSAgWEZTX0lGUkVFX0xPR19SRVMobXApLAorCQkJCSAgMCwgWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywKKwkJCQkgIFhGU19JTkFDVElWRV9MT0dfQ09VTlQpOworCWlmIChlcnJvcikgeworCQlBU1NFUlQoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpOworCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCAwKTsKKwkJKnRwcCA9IE5VTEw7CisJCXhmc19pdW5sb2NrKGlwLCBYRlNfSU9MT0NLX0VYQ0wpOworCQlyZXR1cm4gKGVycm9yKTsKKwl9CisKKwl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCBYRlNfSU9MT0NLX0VYQ0wgfCBYRlNfSUxPQ0tfRVhDTCk7CisJeGZzX3RyYW5zX2lob2xkKHRwLCBpcCk7CisJeGZzX2lkZXN0cm95X2ZvcmsoaXAsIFhGU19BVFRSX0ZPUkspOworCisJQVNTRVJUKGlwLT5pX2QuZGlfYW5leHRlbnRzID09IDApOworCisJKnRwcCA9IHRwOworCXJldHVybiAoMCk7Cit9CisKK1NUQVRJQyBpbnQKK3hmc19yZWxlYXNlKAorCWJodl9kZXNjX3QJKmJkcCkKK3sKKwl4ZnNfaW5vZGVfdAkqaXA7CisJdm5vZGVfdAkJKnZwOworCXhmc19tb3VudF90CSptcDsKKwlpbnQJCWVycm9yOworCisJdnAgPSBCSFZfVE9fVk5PREUoYmRwKTsKKwlpcCA9IFhGU19CSFZUT0koYmRwKTsKKworCWlmICgodnAtPnZfdHlwZSAhPSBWUkVHKSB8fCAoaXAtPmlfZC5kaV9tb2RlID09IDApKSB7CisJCXJldHVybiAwOworCX0KKworCS8qIElmIHRoaXMgaXMgYSByZWFkLW9ubHkgbW91bnQsIGRvbid0IGRvIHRoaXMgKHdvdWxkIGdlbmVyYXRlIEkvTykgKi8KKwlpZiAodnAtPnZfdmZzcC0+dmZzX2ZsYWcgJiBWRlNfUkRPTkxZKQorCQlyZXR1cm4gMDsKKworI2lmZGVmIEhBVkVfUkVGQ0FDSEUKKwkvKiBJZiB3ZSBhcmUgaW4gdGhlIE5GUyByZWZlcmVuY2UgY2FjaGUgdGhlbiBkb24ndCBkbyB0aGlzIG5vdyAqLworCWlmIChpcC0+aV9yZWZjYWNoZSkKKwkJcmV0dXJuIDA7CisjZW5kaWYKKworCW1wID0gaXAtPmlfbW91bnQ7CisKKwlpZiAoaXAtPmlfZC5kaV9ubGluayAhPSAwKSB7CisJCWlmICgoKChpcC0+aV9kLmRpX21vZGUgJiBTX0lGTVQpID09IFNfSUZSRUcpICYmCisJCSAgICAgKChpcC0+aV9kLmRpX3NpemUgPiAwKSB8fCAoVk5fQ0FDSEVEKHZwKSA+IDApKSAmJgorCQkgICAgIChpcC0+aV9kZi5pZl9mbGFncyAmIFhGU19JRkVYVEVOVFMpKSAgJiYKKwkJICAgICghKGlwLT5pX2QuZGlfZmxhZ3MgJiAoWEZTX0RJRkxBR19QUkVBTExPQ3xYRlNfRElGTEFHX0FQUEVORCkpKSkgeworCQkJaWYgKChlcnJvciA9IHhmc19pbmFjdGl2ZV9mcmVlX2VvZmJsb2NrcyhtcCwgaXApKSkKKwkJCQlyZXR1cm4gKGVycm9yKTsKKwkJCS8qIFVwZGF0ZSBsaW51eCBpbm9kZSBibG9jayBjb3VudCBhZnRlciBmcmVlIGFib3ZlICovCisJCQlMSU5WRlNfR0VUX0lQKHZwKS0+aV9ibG9ja3MgPSBYRlNfRlNCX1RPX0JCKG1wLAorCQkJCWlwLT5pX2QuZGlfbmJsb2NrcyArIGlwLT5pX2RlbGF5ZWRfYmxrcyk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHhmc19pbmFjdGl2ZQorICoKKyAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIHZub2RlIHJlZmVyZW5jZSBjb3VudCBmb3IgdGhlIHZub2RlCisgKiBnb2VzIHRvIHplcm8uICBJZiB0aGUgZmlsZSBoYXMgYmVlbiB1bmxpbmtlZCwgdGhlbiBpdCBtdXN0CisgKiBub3cgYmUgdHJ1bmNhdGVkLiAgQWxzbywgd2UgY2xlYXIgYWxsIG9mIHRoZSByZWFkLWFoZWFkIHN0YXRlCisgKiBrZXB0IGZvciB0aGUgaW5vZGUgaGVyZSBzaW5jZSB0aGUgZmlsZSBpcyBub3cgY2xvc2VkLgorICovCitTVEFUSUMgaW50Cit4ZnNfaW5hY3RpdmUoCisJYmh2X2Rlc2NfdAkqYmRwLAorCWNyZWRfdAkJKmNyZWRwKQoreworCXhmc19pbm9kZV90CSppcDsKKwl2bm9kZV90CQkqdnA7CisJeGZzX2JtYXBfZnJlZV90CWZyZWVfbGlzdDsgCisJeGZzX2ZzYmxvY2tfdAlmaXJzdF9ibG9jazsKKwlpbnQJCWNvbW1pdHRlZDsKKwl4ZnNfdHJhbnNfdAkqdHA7CisJeGZzX21vdW50X3QJKm1wOworCWludAkJZXJyb3I7CisJaW50CQl0cnVuY2F0ZTsKKworCXZwID0gQkhWX1RPX1ZOT0RFKGJkcCk7CisJdm5fdHJhY2VfZW50cnkodnAsIF9fRlVOQ1RJT05fXywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCisJaXAgPSBYRlNfQkhWVE9JKGJkcCk7CisKKwkvKgorCSAqIElmIHRoZSBpbm9kZSBpcyBhbHJlYWR5IGZyZWUsIHRoZW4gdGhlcmUgY2FuIGJlIG5vdGhpbmcKKwkgKiB0byBjbGVhbiB1cCBoZXJlLgorCSAqLworCWlmIChpcC0+aV9kLmRpX21vZGUgPT0gMCB8fCBWTl9CQUQodnApKSB7CisJCUFTU0VSVChpcC0+aV9kZi5pZl9yZWFsX2J5dGVzID09IDApOworCQlBU1NFUlQoaXAtPmlfZGYuaWZfYnJvb3RfYnl0ZXMgPT0gMCk7CisJCXJldHVybiBWTl9JTkFDVElWRV9DQUNIRTsKKwl9CisKKwkvKgorCSAqIE9ubHkgZG8gYSB0cnVuY2F0ZSBpZiBpdCdzIGEgcmVndWxhciBmaWxlIHdpdGgKKwkgKiBzb21lIGFjdHVhbCBzcGFjZSBpbiBpdC4gIEl0J3MgT0sgdG8gbG9vayBhdCB0aGUKKwkgKiBpbm9kZSdzIGZpZWxkcyB3aXRob3V0IHRoZSBsb2NrIGJlY2F1c2Ugd2UncmUgdGhlCisJICogb25seSBvbmUgd2l0aCBhIHJlZmVyZW5jZSB0byB0aGUgaW5vZGUuCisJICovCisJdHJ1bmNhdGUgPSAoKGlwLT5pX2QuZGlfbmxpbmsgPT0gMCkgJiYKKwkgICAgKChpcC0+aV9kLmRpX3NpemUgIT0gMCkgfHwgKGlwLT5pX2QuZGlfbmV4dGVudHMgPiAwKSkgJiYKKwkgICAgKChpcC0+aV9kLmRpX21vZGUgJiBTX0lGTVQpID09IFNfSUZSRUcpKTsKKworCW1wID0gaXAtPmlfbW91bnQ7CisKKwlpZiAoaXAtPmlfZC5kaV9ubGluayA9PSAwICYmCisJICAgIERNX0VWRU5UX0VOQUJMRUQodnAtPnZfdmZzcCwgaXAsIERNX0VWRU5UX0RFU1RST1kpKSB7CisJCSh2b2lkKSBYRlNfU0VORF9ERVNUUk9ZKG1wLCB2cCwgRE1fUklHSFRfTlVMTCk7CisJfQorCisJZXJyb3IgPSAwOworCisJLyogSWYgdGhpcyBpcyBhIHJlYWQtb25seSBtb3VudCwgZG9uJ3QgZG8gdGhpcyAod291bGQgZ2VuZXJhdGUgSS9PKSAqLworCWlmICh2cC0+dl92ZnNwLT52ZnNfZmxhZyAmIFZGU19SRE9OTFkpCisJCWdvdG8gb3V0OworCisJaWYgKGlwLT5pX2QuZGlfbmxpbmsgIT0gMCkgeworCQlpZiAoKCgoaXAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSA9PSBTX0lGUkVHKSAmJgorCQkgICAgICgoaXAtPmlfZC5kaV9zaXplID4gMCkgfHwgKFZOX0NBQ0hFRCh2cCkgPiAwKSkgJiYKKwkJICAgICAoaXAtPmlfZGYuaWZfZmxhZ3MgJiBYRlNfSUZFWFRFTlRTKSkgICYmCisJCSAgICAoIShpcC0+aV9kLmRpX2ZsYWdzICYgKFhGU19ESUZMQUdfUFJFQUxMT0N8WEZTX0RJRkxBR19BUFBFTkQpKSB8fAorCQkgICAgIChpcC0+aV9kZWxheWVkX2Jsa3MgIT0gMCkpKSB7CisJCQlpZiAoKGVycm9yID0geGZzX2luYWN0aXZlX2ZyZWVfZW9mYmxvY2tzKG1wLCBpcCkpKQorCQkJCXJldHVybiAoVk5fSU5BQ1RJVkVfQ0FDSEUpOworCQkJLyogVXBkYXRlIGxpbnV4IGlub2RlIGJsb2NrIGNvdW50IGFmdGVyIGZyZWUgYWJvdmUgKi8KKwkJCUxJTlZGU19HRVRfSVAodnApLT5pX2Jsb2NrcyA9IFhGU19GU0JfVE9fQkIobXAsCisJCQkJaXAtPmlfZC5kaV9uYmxvY2tzICsgaXAtPmlfZGVsYXllZF9ibGtzKTsKKwkJfQorCQlnb3RvIG91dDsKKwl9CisKKwlBU1NFUlQoaXAtPmlfZC5kaV9ubGluayA9PSAwKTsKKworCWlmICgoZXJyb3IgPSBYRlNfUU1fRFFBVFRBQ0gobXAsIGlwLCAwKSkpCisJCXJldHVybiAoVk5fSU5BQ1RJVkVfQ0FDSEUpOworCisJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19JTkFDVElWRSk7CisJaWYgKHRydW5jYXRlKSB7CisJCS8qCisJCSAqIERvIHRoZSB4ZnNfaXRydW5jYXRlX3N0YXJ0KCkgY2FsbCBiZWZvcmUKKwkJICogcmVzZXJ2aW5nIGFueSBsb2cgc3BhY2UgYmVjYXVzZSBpdHJ1bmNhdGVfc3RhcnQKKwkJICogd2lsbCBjYWxsIGludG8gdGhlIGJ1ZmZlciBjYWNoZSBhbmQgd2UgY2FuJ3QKKwkJICogZG8gdGhhdCB3aXRoaW4gYSB0cmFuc2FjdGlvbi4KKwkJICovCisJCXhmc19pbG9jayhpcCwgWEZTX0lPTE9DS19FWENMKTsKKworCQl4ZnNfaXRydW5jYXRlX3N0YXJ0KGlwLCBYRlNfSVRSVU5DX0RFRklOSVRFLCAwKTsKKworCQllcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCAwLAorCQkJCQkgIFhGU19JVFJVTkNBVEVfTE9HX1JFUyhtcCksCisJCQkJCSAgMCwgWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywKKwkJCQkJICBYRlNfSVRSVU5DQVRFX0xPR19DT1VOVCk7CisJCWlmIChlcnJvcikgeworCQkJLyogRG9uJ3QgY2FsbCBpdHJ1bmNhdGVfY2xlYW51cCAqLworCQkJQVNTRVJUKFhGU19GT1JDRURfU0hVVERPV04obXApKTsKKwkJCXhmc190cmFuc19jYW5jZWwodHAsIDApOworCQkJeGZzX2l1bmxvY2soaXAsIFhGU19JT0xPQ0tfRVhDTCk7CisJCQlyZXR1cm4gKFZOX0lOQUNUSVZFX0NBQ0hFKTsKKwkJfQorCisJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCBYRlNfSU9MT0NLX0VYQ0wgfCBYRlNfSUxPQ0tfRVhDTCk7CisJCXhmc190cmFuc19paG9sZCh0cCwgaXApOworCisJCS8qCisJCSAqIG5vcm1hbGx5LCB3ZSBoYXZlIHRvIHJ1biB4ZnNfaXRydW5jYXRlX2ZpbmlzaCBzeW5jLgorCQkgKiBCdXQgaWYgZmlsZXN5c3RlbSBpcyB3c3luYyBhbmQgd2UncmUgaW4gdGhlIGluYWN0aXZlCisJCSAqIHBhdGgsIHRoZW4gd2Uga25vdyB0aGF0IG5saW5rID09IDAsIGFuZCB0aGF0IHRoZQorCQkgKiB4YWN0aW9uIHRoYXQgbWFkZSBubGluayA9PSAwIGlzIHBlcm1hbmVudGx5IGNvbW1pdHRlZAorCQkgKiBzaW5jZSB4ZnNfcmVtb3ZlIHJ1bnMgYXMgYSBzeW5jaHJvbm91cyB0cmFuc2FjdGlvbi4KKwkJICovCisJCWVycm9yID0geGZzX2l0cnVuY2F0ZV9maW5pc2goJnRwLCBpcCwgMCwgWEZTX0RBVEFfRk9SSywKKwkJCQkoIShtcC0+bV9mbGFncyAmIFhGU19NT1VOVF9XU1lOQykgPyAxIDogMCkpOworCisJCWlmIChlcnJvcikgeworCQkJeGZzX3RyYW5zX2NhbmNlbCh0cCwKKwkJCQlYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTIHwgWEZTX1RSQU5TX0FCT1JUKTsKKwkJCXhmc19pdW5sb2NrKGlwLCBYRlNfSU9MT0NLX0VYQ0wgfCBYRlNfSUxPQ0tfRVhDTCk7CisJCQlyZXR1cm4gKFZOX0lOQUNUSVZFX0NBQ0hFKTsKKwkJfQorCX0gZWxzZSBpZiAoKGlwLT5pX2QuZGlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRkxOSykgeworCisJCS8qCisJCSAqIElmIHdlIGdldCBhbiBlcnJvciB3aGlsZSBjbGVhbmluZyB1cCBhCisJCSAqIHN5bWxpbmsgd2UgYmFpbCBvdXQuCisJCSAqLworCQllcnJvciA9IChpcC0+aV9kLmRpX3NpemUgPiBYRlNfSUZPUktfRFNJWkUoaXApKSA/CisJCQl4ZnNfaW5hY3RpdmVfc3ltbGlua19ybXQoaXAsICZ0cCkgOgorCQkJeGZzX2luYWN0aXZlX3N5bWxpbmtfbG9jYWwoaXAsICZ0cCk7CisKKwkJaWYgKGVycm9yKSB7CisJCQlBU1NFUlQodHAgPT0gTlVMTCk7CisJCQlyZXR1cm4gKFZOX0lOQUNUSVZFX0NBQ0hFKTsKKwkJfQorCisJCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JT0xPQ0tfRVhDTCB8IFhGU19JTE9DS19FWENMKTsKKwkJeGZzX3RyYW5zX2lob2xkKHRwLCBpcCk7CisJfSBlbHNlIHsKKwkJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgMCwKKwkJCQkJICBYRlNfSUZSRUVfTE9HX1JFUyhtcCksCisJCQkJCSAgMCwgWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywKKwkJCQkJICBYRlNfSU5BQ1RJVkVfTE9HX0NPVU5UKTsKKwkJaWYgKGVycm9yKSB7CisJCQlBU1NFUlQoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpOworCQkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgMCk7CisJCQlyZXR1cm4gKFZOX0lOQUNUSVZFX0NBQ0hFKTsKKwkJfQorCisJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wgfCBYRlNfSU9MT0NLX0VYQ0wpOworCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCBYRlNfSU9MT0NLX0VYQ0wgfCBYRlNfSUxPQ0tfRVhDTCk7CisJCXhmc190cmFuc19paG9sZCh0cCwgaXApOworCX0KKworCS8qCisJICogSWYgdGhlcmUgYXJlIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWxlCisJICogdGhlbiBibG93IHRoZW0gYXdheSBub3cuICBUaGUgY29kZSBjYWxscyBhIHJvdXRpbmUKKwkgKiB0aGF0IHJlY3Vyc2l2ZWx5IGRlY29uc3RydWN0cyB0aGUgYXR0cmlidXRlIGZvcmsuCisJICogV2UgbmVlZCB0byBqdXN0IGNvbW1pdCB0aGUgY3VycmVudCB0cmFuc2FjdGlvbgorCSAqIGJlY2F1c2Ugd2UgY2FuJ3QgdXNlIGl0IGZvciB4ZnNfYXR0cl9pbmFjdGl2ZSgpLgorCSAqLworCWlmIChpcC0+aV9kLmRpX2FuZXh0ZW50cyA+IDApIHsKKwkJZXJyb3IgPSB4ZnNfaW5hY3RpdmVfYXR0cnMoaXAsICZ0cCk7CisJCS8qCisJCSAqIElmIHdlIGdvdCBhbiBlcnJvciwgdGhlIHRyYW5zYWN0aW9uIGlzIGFscmVhZHkKKwkJICogY2FuY2VsbGVkLCBhbmQgdGhlIGlub2RlIGlzIHVubG9ja2VkLiBKdXN0IGdldCBvdXQuCisJCSAqLworCQkgaWYgKGVycm9yKQorCQkJIHJldHVybiAoVk5fSU5BQ1RJVkVfQ0FDSEUpOworCX0gZWxzZSBpZiAoaXAtPmlfYWZwKSB7CisJCXhmc19pZGVzdHJveV9mb3JrKGlwLCBYRlNfQVRUUl9GT1JLKTsKKwl9CisKKwkvKgorCSAqIEZyZWUgdGhlIGlub2RlLgorCSAqLworCVhGU19CTUFQX0lOSVQoJmZyZWVfbGlzdCwgJmZpcnN0X2Jsb2NrKTsKKwllcnJvciA9IHhmc19pZnJlZSh0cCwgaXAsICZmcmVlX2xpc3QpOworCWlmIChlcnJvcikgeworCQkvKgorCQkgKiBJZiB3ZSBmYWlsIHRvIGZyZWUgdGhlIGlub2RlLCBzaHV0IGRvd24uICBUaGUgY2FuY2VsCisJCSAqIG1pZ2h0IGRvIHRoYXQsIHdlIG5lZWQgdG8gbWFrZSBzdXJlLiAgT3RoZXJ3aXNlIHRoZQorCQkgKiBpbm9kZSBtaWdodCBiZSBsb3N0IGZvciBhIGxvbmcgdGltZSBvciBmb3JldmVyLgorCQkgKi8KKwkJaWYgKCFYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkgeworCQkJY21uX2VycihDRV9OT1RFLAorCQkieGZzX2luYWN0aXZlOgl4ZnNfaWZyZWUoKSByZXR1cm5lZCBhbiBlcnJvciA9ICVkIG9uICVzIiwKKwkJCQllcnJvciwgbXAtPm1fZnNuYW1lKTsKKwkJCXhmc19mb3JjZV9zaHV0ZG93bihtcCwgWEZTX01FVEFEQVRBX0lPX0VSUk9SKTsKKwkJfQorCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTfFhGU19UUkFOU19BQk9SVCk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogQ3JlZGl0IHRoZSBxdW90YSBhY2NvdW50KHMpLiBUaGUgaW5vZGUgaXMgZ29uZS4KKwkJICovCisJCVhGU19UUkFOU19NT0RfRFFVT1RfQllJTk8obXAsIHRwLCBpcCwgWEZTX1RSQU5TX0RRX0lDT1VOVCwgLTEpOworCisJCS8qCisJCSAqIEp1c3QgaWdub3JlIGVycm9ycyBhdCB0aGlzIHBvaW50LiAgVGhlcmUgaXMKKwkJICogbm90aGluZyB3ZSBjYW4gZG8gZXhjZXB0IHRvIHRyeSB0byBrZWVwIGdvaW5nLgorCQkgKi8KKwkJKHZvaWQpIHhmc19ibWFwX2ZpbmlzaCgmdHAsICAmZnJlZV9saXN0LCBmaXJzdF9ibG9jaywKKwkJCQkgICAgICAgJmNvbW1pdHRlZCk7CisJCSh2b2lkKSB4ZnNfdHJhbnNfY29tbWl0KHRwLCBYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTLCBOVUxMKTsKKwl9CisJLyoKKwkgKiBSZWxlYXNlIHRoZSBkcXVvdHMgaGVsZCBieSBpbm9kZSwgaWYgYW55LgorCSAqLworCVhGU19RTV9EUURFVEFDSChtcCwgaXApOworCisJeGZzX2l1bmxvY2soaXAsIFhGU19JT0xPQ0tfRVhDTCB8IFhGU19JTE9DS19FWENMKTsKKworIG91dDoKKwlyZXR1cm4gVk5fSU5BQ1RJVkVfQ0FDSEU7Cit9CisKKworLyoKKyAqIHhmc19sb29rdXAKKyAqLworU1RBVElDIGludAoreGZzX2xvb2t1cCgKKwliaHZfZGVzY190CQkqZGlyX2JkcCwKKwl2bmFtZV90CQkJKmRlbnRyeSwKKwl2bm9kZV90CQkJKip2cHAsCisJaW50CQkJZmxhZ3MsCisJdm5vZGVfdAkJCSpyZGlyLAorCWNyZWRfdAkJCSpjcmVkcCkKK3sKKwl4ZnNfaW5vZGVfdAkJKmRwLCAqaXA7CisJeGZzX2lub190CQllX2ludW07CisJaW50CQkJZXJyb3I7CisJdWludAkJCWxvY2tfbW9kZTsKKwl2bm9kZV90CQkJKmRpcl92cDsKKworCWRpcl92cCA9IEJIVl9UT19WTk9ERShkaXJfYmRwKTsKKwl2bl90cmFjZV9lbnRyeShkaXJfdnAsIF9fRlVOQ1RJT05fXywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCisJZHAgPSBYRlNfQkhWVE9JKGRpcl9iZHApOworCisJaWYgKFhGU19GT1JDRURfU0hVVERPV04oZHAtPmlfbW91bnQpKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisKKwlsb2NrX21vZGUgPSB4ZnNfaWxvY2tfbWFwX3NoYXJlZChkcCk7CisJZXJyb3IgPSB4ZnNfZGlyX2xvb2t1cF9pbnQoZGlyX2JkcCwgbG9ja19tb2RlLCBkZW50cnksICZlX2ludW0sICZpcCk7CisJaWYgKCFlcnJvcikgeworCQkqdnBwID0gWEZTX0lUT1YoaXApOworCQlJVFJBQ0UoaXApOworCX0KKwl4ZnNfaXVubG9ja19tYXBfc2hhcmVkKGRwLCBsb2NrX21vZGUpOworCXJldHVybiBlcnJvcjsKK30KKworCisvKgorICogeGZzX2NyZWF0ZSAoY3JlYXRlIGEgbmV3IGZpbGUpLgorICovCitTVEFUSUMgaW50Cit4ZnNfY3JlYXRlKAorCWJodl9kZXNjX3QJCSpkaXJfYmRwLAorCXZuYW1lX3QJCQkqZGVudHJ5LAorCXZhdHRyX3QJCQkqdmFwLAorCXZub2RlX3QJCQkqKnZwcCwKKwljcmVkX3QJCQkqY3JlZHApCit7CisJY2hhcgkJCSpuYW1lID0gVk5BTUUoZGVudHJ5KTsKKwl2bm9kZV90CQkJKmRpcl92cDsKKwl4ZnNfaW5vZGVfdAkJKmRwLCAqaXA7CisJdm5vZGVfdAkJICAgICAgICAqdnA9TlVMTDsKKwl4ZnNfdHJhbnNfdAkJKnRwOworCXhmc19tb3VudF90CSAgICAgICAgKm1wOworCXhmc19kZXZfdAkJcmRldjsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBlcnJvcjsKKwl4ZnNfYm1hcF9mcmVlX3QJCWZyZWVfbGlzdDsKKwl4ZnNfZnNibG9ja190CQlmaXJzdF9ibG9jazsKKwlib29sZWFuX3QJCWRwX2pvaW5lZF90b190cmFuczsKKwlpbnQJCQlkbV9ldmVudF9zZW50ID0gMDsKKwl1aW50CQkJY2FuY2VsX2ZsYWdzOworCWludAkJCWNvbW1pdHRlZDsKKwl4ZnNfcHJpZF90CQlwcmlkOworCXN0cnVjdCB4ZnNfZHF1b3QJKnVkcXAsICpnZHFwOworCXVpbnQJCQlyZXNibGtzOworCWludAkJCWRtX2RpX21vZGU7CisJaW50CQkJbmFtZWxlbjsKKworCUFTU0VSVCghKnZwcCk7CisJZGlyX3ZwID0gQkhWX1RPX1ZOT0RFKGRpcl9iZHApOworCXZuX3RyYWNlX2VudHJ5KGRpcl92cCwgX19GVU5DVElPTl9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisKKwlkcCA9IFhGU19CSFZUT0koZGlyX2JkcCk7CisJbXAgPSBkcC0+aV9tb3VudDsKKworCWRtX2RpX21vZGUgPSB2YXAtPnZhX21vZGV8VlRUT0lGKHZhcC0+dmFfdHlwZSk7CisJbmFtZWxlbiA9IFZOQU1FTEVOKGRlbnRyeSk7CisKKwlpZiAoRE1fRVZFTlRfRU5BQkxFRChkaXJfdnAtPnZfdmZzcCwgZHAsIERNX0VWRU5UX0NSRUFURSkpIHsKKwkJZXJyb3IgPSBYRlNfU0VORF9OQU1FU1AobXAsIERNX0VWRU5UX0NSRUFURSwKKwkJCQlkaXJfdnAsIERNX1JJR0hUX05VTEwsIE5VTEwsCisJCQkJRE1fUklHSFRfTlVMTCwgbmFtZSwgTlVMTCwKKwkJCQlkbV9kaV9tb2RlLCAwLCAwKTsKKworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJCWRtX2V2ZW50X3NlbnQgPSAxOworCX0KKworCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCisJLyogUmV0dXJuIHRocm91Z2ggc3RkX3JldHVybiBhZnRlciB0aGlzIHBvaW50LiAqLworCisJdWRxcCA9IGdkcXAgPSBOVUxMOworCWlmICh2YXAtPnZhX21hc2sgJiBYRlNfQVRfUFJPSklEKQorCQlwcmlkID0gKHhmc19wcmlkX3QpdmFwLT52YV9wcm9qaWQ7CisJZWxzZQorCQlwcmlkID0gKHhmc19wcmlkX3QpZGZsdHByaWQ7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYWxsb2NhdGVkIGRxdW90KHMpIG9uIGRpc2suCisJICovCisJZXJyb3IgPSBYRlNfUU1fRFFWT1BBTExPQyhtcCwgZHAsCisJCQljdXJyZW50X2ZzdWlkKGNyZWRwKSwgY3VycmVudF9mc2dpZChjcmVkcCksCisJCQlYRlNfUU1PUFRfUVVPVEFMTHxYRlNfUU1PUFRfSU5IRVJJVCwgJnVkcXAsICZnZHFwKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gc3RkX3JldHVybjsKKworCWlwID0gTlVMTDsKKwlkcF9qb2luZWRfdG9fdHJhbnMgPSBCX0ZBTFNFOworCisJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19DUkVBVEUpOworCWNhbmNlbF9mbGFncyA9IFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVM7CisJcmVzYmxrcyA9IFhGU19DUkVBVEVfU1BBQ0VfUkVTKG1wLCBuYW1lbGVuKTsKKwkvKgorCSAqIEluaXRpYWxseSBhc3N1bWUgdGhhdCB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCBhbmQKKwkgKiByZXNlcnZlIHRoZSByZXNvdXJjZXMgZm9yIHRoYXQgY2FzZS4gIElmIHRoYXQgaXMgbm90CisJICogdGhlIGNhc2Ugd2UnbGwgZHJvcCB0aGUgb25lIHdlIGhhdmUgYW5kIGdldCBhIG1vcmUKKwkgKiBhcHByb3ByaWF0ZSB0cmFuc2FjdGlvbiBsYXRlci4KKwkgKi8KKwllcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCByZXNibGtzLCBYRlNfQ1JFQVRFX0xPR19SRVMobXApLCAwLAorCQkJWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywgWEZTX0NSRUFURV9MT0dfQ09VTlQpOworCWlmIChlcnJvciA9PSBFTk9TUEMpIHsKKwkJcmVzYmxrcyA9IDA7CisJCWVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsIFhGU19DUkVBVEVfTE9HX1JFUyhtcCksIDAsCisJCQkJWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywgWEZTX0NSRUFURV9MT0dfQ09VTlQpOworCX0KKwlpZiAoZXJyb3IpIHsKKwkJY2FuY2VsX2ZsYWdzID0gMDsKKwkJZHAgPSBOVUxMOworCQlnb3RvIGVycm9yX3JldHVybjsKKwl9CisKKwl4ZnNfaWxvY2soZHAsIFhGU19JTE9DS19FWENMKTsKKworCVhGU19CTUFQX0lOSVQoJmZyZWVfbGlzdCwgJmZpcnN0X2Jsb2NrKTsKKworCUFTU0VSVChpcCA9PSBOVUxMKTsKKworCS8qCisJICogUmVzZXJ2ZSBkaXNrIHF1b3RhIGFuZCB0aGUgaW5vZGUuCisJICovCisJZXJyb3IgPSBYRlNfVFJBTlNfUkVTRVJWRV9RVU9UQShtcCwgdHAsIHVkcXAsIGdkcXAsIHJlc2Jsa3MsIDEsIDApOworCWlmIChlcnJvcikKKwkJZ290byBlcnJvcl9yZXR1cm47CisKKwlpZiAocmVzYmxrcyA9PSAwICYmCisJICAgIChlcnJvciA9IFhGU19ESVJfQ0FORU5URVIobXAsIHRwLCBkcCwgbmFtZSwgbmFtZWxlbikpKQorCQlnb3RvIGVycm9yX3JldHVybjsKKwlyZGV2ID0gKHZhcC0+dmFfbWFzayAmIFhGU19BVF9SREVWKSA/IHZhcC0+dmFfcmRldiA6IDA7CisJZXJyb3IgPSB4ZnNfZGlyX2lhbGxvYygmdHAsIGRwLAorCQkJTUFLRUlNT0RFKHZhcC0+dmFfdHlwZSx2YXAtPnZhX21vZGUpLCAxLAorCQkJcmRldiwgY3JlZHAsIHByaWQsIHJlc2Jsa3MgPiAwLAorCQkJJmlwLCAmY29tbWl0dGVkKTsKKwlpZiAoZXJyb3IpIHsKKwkJaWYgKGVycm9yID09IEVOT1NQQykKKwkJCWdvdG8gZXJyb3JfcmV0dXJuOworCQlnb3RvIGFib3J0X3JldHVybjsKKwl9CisJSVRSQUNFKGlwKTsKKworCS8qCisJICogQXQgdGhpcyBwb2ludCwgd2UndmUgZ290dGVuIGEgbmV3bHkgYWxsb2NhdGVkIGlub2RlLgorCSAqIEl0IGlzIGxvY2tlZCAoYW5kIGpvaW5lZCB0byB0aGUgdHJhbnNhY3Rpb24pLgorCSAqLworCisJQVNTRVJUKGlzbXJsb2NrZWQgKCZpcC0+aV9sb2NrLCBNUl9VUERBVEUpKTsKKworCS8qCisJICogTm93IHdlIGpvaW4gdGhlIGRpcmVjdG9yeSBpbm9kZSB0byB0aGUgdHJhbnNhY3Rpb24uCisJICogV2UgZG8gbm90IGRvIGl0IGVhcmxpZXIgYmVjYXVzZSB4ZnNfZGlyX2lhbGxvYworCSAqIG1pZ2h0IGNvbW1pdCB0aGUgcHJldmlvdXMgdHJhbnNhY3Rpb24gKGFuZCByZWxlYXNlCisJICogYWxsIHRoZSBsb2NrcykuCisJICovCisKKwlWTl9IT0xEKGRpcl92cCk7CisJeGZzX3RyYW5zX2lqb2luKHRwLCBkcCwgWEZTX0lMT0NLX0VYQ0wpOworCWRwX2pvaW5lZF90b190cmFucyA9IEJfVFJVRTsKKworCWVycm9yID0gWEZTX0RJUl9DUkVBVEVOQU1FKG1wLCB0cCwgZHAsIG5hbWUsIG5hbWVsZW4sIGlwLT5pX2lubywKKwkJJmZpcnN0X2Jsb2NrLCAmZnJlZV9saXN0LAorCQlyZXNibGtzID8gcmVzYmxrcyAtIFhGU19JQUxMT0NfU1BBQ0VfUkVTKG1wKSA6IDApOworCWlmIChlcnJvcikgeworCQlBU1NFUlQoZXJyb3IgIT0gRU5PU1BDKTsKKwkJZ290byBhYm9ydF9yZXR1cm47CisJfQorCXhmc19pY2hndGltZShkcCwgWEZTX0lDSEdUSU1FX01PRCB8IFhGU19JQ0hHVElNRV9DSEcpOworCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGRwLCBYRlNfSUxPR19DT1JFKTsKKworCS8qCisJICogSWYgdGhpcyBpcyBhIHN5bmNocm9ub3VzIG1vdW50LCBtYWtlIHN1cmUgdGhhdCB0aGUKKwkgKiBjcmVhdGUgdHJhbnNhY3Rpb24gZ29lcyB0byBkaXNrIGJlZm9yZSByZXR1cm5pbmcgdG8KKwkgKiB0aGUgdXNlci4KKwkgKi8KKwlpZiAobXAtPm1fZmxhZ3MgJiAoWEZTX01PVU5UX1dTWU5DfFhGU19NT1VOVF9ESVJTWU5DKSkgeworCQl4ZnNfdHJhbnNfc2V0X3N5bmModHApOworCX0KKworCWRwLT5pX2dlbisrOworCisJLyoKKwkgKiBBdHRhY2ggdGhlIGRxdW90KHMpIHRvIHRoZSBpbm9kZXMgYW5kIG1vZGlmeSB0aGVtIGluY29yZS4KKwkgKiBUaGVzZSBpZHMgb2YgdGhlIGlub2RlIGNvdWxkbid0IGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgbmV3CisJICogaW5vZGUgaGFzIGJlZW4gbG9ja2VkIGV2ZXIgc2luY2UgaXQgd2FzIGNyZWF0ZWQuCisJICovCisJWEZTX1FNX0RRVk9QQ1JFQVRFKG1wLCB0cCwgaXAsIHVkcXAsIGdkcXApOworCisJLyoKKwkgKiB4ZnNfdHJhbnNfY29tbWl0IG5vcm1hbGx5IGRlY3JlbWVudHMgdGhlIHZub2RlIHJlZiBjb3VudAorCSAqIHdoZW4gaXQgdW5sb2NrcyB0aGUgaW5vZGUuIFNpbmNlIHdlIHdhbnQgdG8gcmV0dXJuIHRoZQorCSAqIHZub2RlIHRvIHRoZSBjYWxsZXIsIHdlIGJ1bXAgdGhlIHZub2RlIHJlZiBjb3VudCBub3cuCisJICovCisJSUhPTEQoaXApOworCXZwID0gWEZTX0lUT1YoaXApOworCisJZXJyb3IgPSB4ZnNfYm1hcF9maW5pc2goJnRwLCAmZnJlZV9saXN0LCBmaXJzdF9ibG9jaywgJmNvbW1pdHRlZCk7CisJaWYgKGVycm9yKSB7CisJCXhmc19ibWFwX2NhbmNlbCgmZnJlZV9saXN0KTsKKwkJZ290byBhYm9ydF9yZWxlOworCX0KKworCWVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwgWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUywgTlVMTCk7CisJaWYgKGVycm9yKSB7CisJCUlSRUxFKGlwKTsKKwkJdHAgPSBOVUxMOworCQlnb3RvIGVycm9yX3JldHVybjsKKwl9CisKKwlYRlNfUU1fRFFSRUxFKG1wLCB1ZHFwKTsKKwlYRlNfUU1fRFFSRUxFKG1wLCBnZHFwKTsKKworCS8qCisJICogUHJvcG9nYXRlIHRoZSBmYWN0IHRoYXQgdGhlIHZub2RlIGNoYW5nZWQgYWZ0ZXIgdGhlCisJICogeGZzX2lub2RlIGxvY2tzIGhhdmUgYmVlbiByZWxlYXNlZC4KKwkgKi8KKwlWT1BfVk5PREVfQ0hBTkdFKHZwLCBWQ0hBTkdFX0ZMQUdTX1RSVU5DQVRFRCwgMyk7CisKKwkqdnBwID0gdnA7CisKKwkvKiBGYWxsdGhyb3VnaCB0byBzdGRfcmV0dXJuIHdpdGggZXJyb3IgPSAwICAqLworCitzdGRfcmV0dXJuOgorCWlmICggKCp2cHAgfHwgKGVycm9yICE9IDAgJiYgZG1fZXZlbnRfc2VudCAhPSAwKSkgJiYKKwkJCURNX0VWRU5UX0VOQUJMRUQoZGlyX3ZwLT52X3Zmc3AsIFhGU19CSFZUT0koZGlyX2JkcCksCisJCQkJCQkJRE1fRVZFTlRfUE9TVENSRUFURSkpIHsKKwkJKHZvaWQpIFhGU19TRU5EX05BTUVTUChtcCwgRE1fRVZFTlRfUE9TVENSRUFURSwKKwkJCWRpcl92cCwgRE1fUklHSFRfTlVMTCwKKwkJCSp2cHAgPyB2cDpOVUxMLAorCQkJRE1fUklHSFRfTlVMTCwgbmFtZSwgTlVMTCwKKwkJCWRtX2RpX21vZGUsIGVycm9yLCAwKTsKKwl9CisJcmV0dXJuIGVycm9yOworCisgYWJvcnRfcmV0dXJuOgorCWNhbmNlbF9mbGFncyB8PSBYRlNfVFJBTlNfQUJPUlQ7CisJLyogRkFMTFRIUk9VR0ggKi8KKyBlcnJvcl9yZXR1cm46CisKKwlpZiAodHAgIT0gTlVMTCkKKwkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgY2FuY2VsX2ZsYWdzKTsKKworCWlmICghZHBfam9pbmVkX3RvX3RyYW5zICYmIChkcCAhPSBOVUxMKSkKKwkJeGZzX2l1bmxvY2soZHAsIFhGU19JTE9DS19FWENMKTsKKwlYRlNfUU1fRFFSRUxFKG1wLCB1ZHFwKTsKKwlYRlNfUU1fRFFSRUxFKG1wLCBnZHFwKTsKKworCWdvdG8gc3RkX3JldHVybjsKKworIGFib3J0X3JlbGU6CisJLyoKKwkgKiBXYWl0IHVudGlsIGFmdGVyIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGlzIGFib3J0ZWQgdG8KKwkgKiByZWxlYXNlIHRoZSBpbm9kZS4gIFRoaXMgcHJldmVudHMgcmVjdXJzaXZlIHRyYW5zYWN0aW9ucworCSAqIGFuZCBkZWFkbG9ja3MgZnJvbSB4ZnNfaW5hY3RpdmUuCisJICovCisJY2FuY2VsX2ZsYWdzIHw9IFhGU19UUkFOU19BQk9SVDsKKwl4ZnNfdHJhbnNfY2FuY2VsKHRwLCBjYW5jZWxfZmxhZ3MpOworCUlSRUxFKGlwKTsKKworCVhGU19RTV9EUVJFTEUobXAsIHVkcXApOworCVhGU19RTV9EUVJFTEUobXAsIGdkcXApOworCisJZ290byBzdGRfcmV0dXJuOworfQorCisjaWZkZWYgREVCVUcKKy8qCisgKiBTb21lIGNvdW50ZXJzIHRvIHNlZSBpZiAoYW5kIGhvdyBvZnRlbikgd2UgYXJlIGhpdHRpbmcgc29tZSBkZWFkbG9jaworICogcHJldmVudGlvbiBjb2RlIHBhdGhzLgorICovCisKK2ludCB4ZnNfcm1fbG9ja3M7CitpbnQgeGZzX3JtX2xvY2tfZGVsYXlzOworaW50IHhmc19ybV9hdHRlbXB0czsKKyNlbmRpZgorCisvKgorICogVGhlIGZvbGxvd2luZyByb3V0aW5lIHdpbGwgbG9jayB0aGUgaW5vZGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAqIGRpcmVjdG9yeSBhbmQgdGhlIG5hbWVkIGVudHJ5IGluIHRoZSBkaXJlY3RvcnkuIFRoZSBsb2NrcyBhcmUKKyAqIGFjcXVpcmVkIGluIGluY3JlYXNpbmcgaW5vZGUgbnVtYmVyLgorICoKKyAqIElmIHRoZSBlbnRyeSBpcyAiLi4iLCB0aGVuIG9ubHkgdGhlIGRpcmVjdG9yeSBpcyBsb2NrZWQuIFRoZQorICogdm5vZGUgcmVmIGNvdW50IHdpbGwgc3RpbGwgaW5jbHVkZSB0aGF0IGZyb20gdGhlIC4uIGVudHJ5IGluCisgKiB0aGlzIGNhc2UuCisgKgorICogVGhlcmUgaXMgYSBkZWFkbG9jayB3ZSBuZWVkIHRvIHdvcnJ5IGFib3V0LiBJZiB0aGUgbG9ja2VkIGRpcmVjdG9yeSBpcworICogaW4gdGhlIEFJTCwgaXQgbWlnaHQgYmUgYmxvY2tpbmcgdXAgdGhlIGxvZy4gVGhlIG5leHQgaW5vZGUgd2UgbG9jaworICogY291bGQgYmUgYWxyZWFkeSBsb2NrZWQgYnkgYW5vdGhlciB0aHJlYWQgd2FpdGluZyBmb3IgbG9nIHNwYWNlIChlLmcKKyAqIGEgcGVybWFuZW50IGxvZyByZXNlcnZhdGlvbiB3aXRoIGEgbG9uZyBydW5uaW5nIHRyYW5zYWN0aW9uIChzZWUKKyAqIHhmc19pdHJ1bmNhdGVfZmluaXNoKSkuIFRvIHNvbHZlIHRoaXMsIHdlIG11c3QgY2hlY2sgaWYgdGhlIGRpcmVjdG9yeQorICogaXMgaW4gdGhlIGFpbCBhbmQgdXNlIGxvY2tfbm93YWl0LiBJZiB3ZSBjYW4ndCBsb2NrLCB3ZSBuZWVkIHRvCisgKiBkcm9wIHRoZSBpbm9kZSBsb2NrIG9uIHRoZSBkaXJlY3RvcnkgYW5kIHRyeSBhZ2Fpbi4geGZzX2l1bmxvY2sgd2lsbAorICogcG90ZW50aWFsbHkgcHVzaCB0aGUgdGFpbCBpZiB3ZSB3ZXJlIGhvbGRpbmcgdXAgdGhlIGxvZy4KKyAqLworU1RBVElDIGludAoreGZzX2xvY2tfZGlyX2FuZF9lbnRyeSgKKwl4ZnNfaW5vZGVfdAkqZHAsCisJdm5hbWVfdAkJKmRlbnRyeSwKKwl4ZnNfaW5vZGVfdAkqaXApCS8qIGlub2RlIG9mIGVudHJ5ICduYW1lJyAqLworeworCWludAkJYXR0ZW1wdHM7CisJeGZzX2lub190CWVfaW51bTsKKwl4ZnNfaW5vZGVfdAkqaXBzWzJdOworCXhmc19sb2dfaXRlbV90CSpscDsKKworI2lmZGVmIERFQlVHCisJeGZzX3JtX2xvY2tzKys7CisjZW5kaWYKKwlhdHRlbXB0cyA9IDA7CisKK2FnYWluOgorCXhmc19pbG9jayhkcCwgWEZTX0lMT0NLX0VYQ0wpOworCisJZV9pbnVtID0gaXAtPmlfaW5vOworCisJSVRSQUNFKGlwKTsKKworCS8qCisJICogV2Ugd2FudCB0byBsb2NrIGluIGluY3JlYXNpbmcgaW51bS4gU2luY2Ugd2UndmUgYWxyZWFkeQorCSAqIGFjcXVpcmVkIHRoZSBsb2NrIG9uIHRoZSBkaXJlY3RvcnksIHdlIG1heSBuZWVkIHRvIHJlbGVhc2UKKwkgKiBpZiBpZiB0aGUgaW51bSBvZiB0aGUgZW50cnkgdHVybnMgb3V0IHRvIGJlIGxlc3MuCisJICovCisJaWYgKGVfaW51bSA+IGRwLT5pX2lubykgeworCQkvKgorCQkgKiBXZSBhcmUgYWxyZWFkeSBpbiB0aGUgcmlnaHQgb3JkZXIsIHNvIGp1c3QKKwkJICogbG9jayBvbiB0aGUgaW5vZGUgb2YgdGhlIGVudHJ5LgorCQkgKiBXZSBuZWVkIHRvIHVzZSBub3dhaXQgaWYgZHAgaXMgaW4gdGhlIEFJTC4KKwkJICovCisKKwkJbHAgPSAoeGZzX2xvZ19pdGVtX3QgKilkcC0+aV9pdGVtcDsKKwkJaWYgKGxwICYmIChscC0+bGlfZmxhZ3MgJiBYRlNfTElfSU5fQUlMKSkgeworCQkJaWYgKCF4ZnNfaWxvY2tfbm93YWl0KGlwLCBYRlNfSUxPQ0tfRVhDTCkpIHsKKwkJCQlhdHRlbXB0cysrOworI2lmZGVmIERFQlVHCisJCQkJeGZzX3JtX2F0dGVtcHRzKys7CisjZW5kaWYKKworCQkJCS8qCisJCQkJICogVW5sb2NrIGRwIGFuZCB0cnkgYWdhaW4uCisJCQkJICogeGZzX2l1bmxvY2sgd2lsbCB0cnkgdG8gcHVzaCB0aGUgdGFpbAorCQkJCSAqIGlmIHRoZSBpbm9kZSBpcyBpbiB0aGUgQUlMLgorCQkJCSAqLworCisJCQkJeGZzX2l1bmxvY2soZHAsIFhGU19JTE9DS19FWENMKTsKKworCQkJCWlmICgoYXR0ZW1wdHMgJSA1KSA9PSAwKSB7CisJCQkJCWRlbGF5KDEpOyAvKiBEb24ndCBqdXN0IHNwaW4gdGhlIENQVSAqLworI2lmZGVmIERFQlVHCisJCQkJCXhmc19ybV9sb2NrX2RlbGF5cysrOworI2VuZGlmCisJCQkJfQorCQkJCWdvdG8gYWdhaW47CisJCQl9CisJCX0gZWxzZSB7CisJCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwkJfQorCX0gZWxzZSBpZiAoZV9pbnVtIDwgZHAtPmlfaW5vKSB7CisJCXhmc19pdW5sb2NrKGRwLCBYRlNfSUxPQ0tfRVhDTCk7CisKKwkJaXBzWzBdID0gaXA7CisJCWlwc1sxXSA9IGRwOworCQl4ZnNfbG9ja19pbm9kZXMoaXBzLCAyLCAwLCBYRlNfSUxPQ0tfRVhDTCk7CisJfQorCS8qIGVsc2UJIGVfaW51bSA9PSBkcC0+aV9pbm8gKi8KKwkvKiAgICAgVGhpcyBjYW4gaGFwcGVuIGlmIHdlJ3JlIGFza2VkIHRvIGxvY2sgL3gvLi4KKwkgKiAgICAgdGhlIGVudHJ5IGlzICIuLiIsIHdoaWNoIGlzIGFsc28gdGhlIHBhcmVudCBkaXJlY3RvcnkuCisJICovCisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIERFQlVHCitpbnQgeGZzX2xvY2tlZF9uOworaW50IHhmc19zbWFsbF9yZXRyaWVzOworaW50IHhmc19taWRkbGVfcmV0cmllczsKK2ludCB4ZnNfbG90c19yZXRyaWVzOworaW50IHhmc19sb2NrX2RlbGF5czsKKyNlbmRpZgorCisvKgorICogVGhlIGZvbGxvd2luZyByb3V0aW5lIHdpbGwgbG9jayBuIGlub2RlcyBpbiBleGNsdXNpdmUgbW9kZS4KKyAqIFdlIGFzc3VtZSB0aGUgY2FsbGVyIGNhbGxzIHVzIHdpdGggdGhlIGlub2RlcyBpbiBpX2lubyBvcmRlci4KKyAqCisgKiBXZSBuZWVkIHRvIGRldGVjdCBkZWFkbG9jayB3aGVyZSBhbiBpbm9kZSB0aGF0IHdlIGxvY2sKKyAqIGlzIGluIHRoZSBBSUwgYW5kIHdlIHN0YXJ0IHdhaXRpbmcgZm9yIGFub3RoZXIgaW5vZGUgdGhhdCBpcyBsb2NrZWQKKyAqIGJ5IGEgdGhyZWFkIGluIGEgbG9uZyBydW5uaW5nIHRyYW5zYWN0aW9uIChzdWNoIGFzIHRydW5jYXRlKS4gVGhpcyBjYW4KKyAqIHJlc3VsdCBpbiBkZWFkbG9jayBzaW5jZSB0aGUgbG9uZyBydW5uaW5nIHRyYW5zIG1pZ2h0IG5lZWQgdG8gd2FpdAorICogZm9yIHRoZSBpbm9kZSB3ZSBqdXN0IGxvY2tlZCBpbiBvcmRlciB0byBwdXNoIHRoZSB0YWlsIGFuZCBmcmVlIHNwYWNlCisgKiBpbiB0aGUgbG9nLgorICovCit2b2lkCit4ZnNfbG9ja19pbm9kZXMoCisJeGZzX2lub2RlX3QJKippcHMsCisJaW50CQlpbm9kZXMsCisJaW50CQlmaXJzdF9sb2NrZWQsCisJdWludAkJbG9ja19tb2RlKQoreworCWludAkJYXR0ZW1wdHMgPSAwLCBpLCBqLCB0cnlfbG9jazsKKwl4ZnNfbG9nX2l0ZW1fdAkqbHA7CisKKwlBU1NFUlQoaXBzICYmIChpbm9kZXMgPj0gMikpOyAvKiB3ZSBuZWVkIGF0IGxlYXN0IHR3byAqLworCisJaWYgKGZpcnN0X2xvY2tlZCkgeworCQl0cnlfbG9jayA9IDE7CisJCWkgPSAxOworCX0gZWxzZSB7CisJCXRyeV9sb2NrID0gMDsKKwkJaSA9IDA7CisJfQorCithZ2FpbjoKKwlmb3IgKDsgaSA8IGlub2RlczsgaSsrKSB7CisJCUFTU0VSVChpcHNbaV0pOworCisJCWlmIChpICYmIChpcHNbaV0gPT0gaXBzW2ktMV0pKQkvKiBBbHJlYWR5IGxvY2tlZCAqLworCQkJY29udGludWU7CisKKwkJLyoKKwkJICogSWYgdHJ5X2xvY2sgaXMgbm90IHNldCB5ZXQsIG1ha2Ugc3VyZSBhbGwgbG9ja2VkIGlub2RlcworCQkgKiBhcmUgbm90IGluIHRoZSBBSUwuCisJCSAqIElmIGFueSBhcmUsIHNldCB0cnlfbG9jayB0byBiZSB1c2VkIGxhdGVyLgorCQkgKi8KKworCQlpZiAoIXRyeV9sb2NrKSB7CisJCQlmb3IgKGogPSAoaSAtIDEpOyBqID49IDAgJiYgIXRyeV9sb2NrOyBqLS0pIHsKKwkJCQlscCA9ICh4ZnNfbG9nX2l0ZW1fdCAqKWlwc1tqXS0+aV9pdGVtcDsKKwkJCQlpZiAobHAgJiYgKGxwLT5saV9mbGFncyAmIFhGU19MSV9JTl9BSUwpKSB7CisJCQkJCXRyeV9sb2NrKys7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLyoKKwkJICogSWYgYW55IG9mIHRoZSBwcmV2aW91cyBsb2NrcyB3ZSBoYXZlIGxvY2tlZCBpcyBpbiB0aGUgQUlMLAorCQkgKiB3ZSBtdXN0IFRSWSB0byBnZXQgdGhlIHNlY29uZCBhbmQgc3Vic2VxdWVudCBsb2Nrcy4gSWYKKwkJICogd2UgY2FuJ3QgZ2V0IGFueSwgd2UgbXVzdCByZWxlYXNlIGFsbCB3ZSBoYXZlCisJCSAqIGFuZCB0cnkgYWdhaW4uCisJCSAqLworCisJCWlmICh0cnlfbG9jaykgeworCQkJLyogdHJ5X2xvY2sgbXVzdCBiZSAwIGlmIGkgaXMgMC4gKi8KKwkJCS8qCisJCQkgKiB0cnlfbG9jayBtZWFucyB3ZSBoYXZlIGFuIGlub2RlIGxvY2tlZAorCQkJICogdGhhdCBpcyBpbiB0aGUgQUlMLgorCQkJICovCisJCQlBU1NFUlQoaSAhPSAwKTsKKwkJCWlmICgheGZzX2lsb2NrX25vd2FpdChpcHNbaV0sIGxvY2tfbW9kZSkpIHsKKwkJCQlhdHRlbXB0cysrOworCisJCQkJLyoKKwkJCQkgKiBVbmxvY2sgYWxsIHByZXZpb3VzIGd1eXMgYW5kIHRyeSBhZ2Fpbi4KKwkJCQkgKiB4ZnNfaXVubG9jayB3aWxsIHRyeSB0byBwdXNoIHRoZSB0YWlsCisJCQkJICogaWYgdGhlIGlub2RlIGlzIGluIHRoZSBBSUwuCisJCQkJICovCisKKwkJCQlmb3IoaiA9IGkgLSAxOyBqID49IDA7IGotLSkgeworCisJCQkJCS8qCisJCQkJCSAqIENoZWNrIHRvIHNlZSBpZiB3ZSd2ZSBhbHJlYWR5CisJCQkJCSAqIHVubG9ja2VkIHRoaXMgb25lLgorCQkJCQkgKiBOb3QgdGhlIGZpcnN0IG9uZSBnb2luZyBiYWNrLAorCQkJCQkgKiBhbmQgdGhlIGlub2RlIHB0ciBpcyB0aGUgc2FtZS4KKwkJCQkJICovCisJCQkJCWlmICgoaiAhPSAoaSAtIDEpKSAmJiBpcHNbal0gPT0KKwkJCQkJCQkJaXBzW2orMV0pCisJCQkJCQljb250aW51ZTsKKworCQkJCQl4ZnNfaXVubG9jayhpcHNbal0sIGxvY2tfbW9kZSk7CisJCQkJfQorCisJCQkJaWYgKChhdHRlbXB0cyAlIDUpID09IDApIHsKKwkJCQkJZGVsYXkoMSk7IC8qIERvbid0IGp1c3Qgc3BpbiB0aGUgQ1BVICovCisjaWZkZWYgREVCVUcKKwkJCQkJeGZzX2xvY2tfZGVsYXlzKys7CisjZW5kaWYKKwkJCQl9CisJCQkJaSA9IDA7CisJCQkJdHJ5X2xvY2sgPSAwOworCQkJCWdvdG8gYWdhaW47CisJCQl9CisJCX0gZWxzZSB7CisJCQl4ZnNfaWxvY2soaXBzW2ldLCBsb2NrX21vZGUpOworCQl9CisJfQorCisjaWZkZWYgREVCVUcKKwlpZiAoYXR0ZW1wdHMpIHsKKwkJaWYgKGF0dGVtcHRzIDwgNSkgeGZzX3NtYWxsX3JldHJpZXMrKzsKKwkJZWxzZSBpZiAoYXR0ZW1wdHMgPCAxMDApIHhmc19taWRkbGVfcmV0cmllcysrOworCQllbHNlIHhmc19sb3RzX3JldHJpZXMrKzsKKwl9IGVsc2UgeworCQl4ZnNfbG9ja2VkX24rKzsKKwl9CisjZW5kaWYKK30KKworI2lmZGVmCURFQlVHCisjZGVmaW5lCVJFTU9WRV9ERUJVR19UUkFDRSh4KQl7cmVtb3ZlX3doaWNoX2Vycm9yX3JldHVybiA9ICh4KTt9CitpbnQgcmVtb3ZlX3doaWNoX2Vycm9yX3JldHVybiA9IDA7CisjZWxzZSAvKiAhIERFQlVHICovCisjZGVmaW5lCVJFTU9WRV9ERUJVR19UUkFDRSh4KQorI2VuZGlmCS8qICEgREVCVUcgKi8KKworCisvKgorICogeGZzX3JlbW92ZQorICoKKyAqLworU1RBVElDIGludAoreGZzX3JlbW92ZSgKKwliaHZfZGVzY190CQkqZGlyX2JkcCwKKwl2bmFtZV90CQkJKmRlbnRyeSwKKwljcmVkX3QJCQkqY3JlZHApCit7CisJdm5vZGVfdAkJCSpkaXJfdnA7CisJY2hhcgkJCSpuYW1lID0gVk5BTUUoZGVudHJ5KTsKKwl4ZnNfaW5vZGVfdCAgICAgICAgICAgICAqZHAsICppcDsKKwl4ZnNfdHJhbnNfdCAgICAgICAgICAgICAqdHAgPSBOVUxMOworCXhmc19tb3VudF90CQkqbXA7CisJaW50ICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSAwOworCXhmc19ibWFwX2ZyZWVfdCAgICAgICAgIGZyZWVfbGlzdDsKKwl4ZnNfZnNibG9ja190ICAgICAgICAgICBmaXJzdF9ibG9jazsKKwlpbnQJCQljYW5jZWxfZmxhZ3M7CisJaW50CQkJY29tbWl0dGVkOworCWludAkJCWRtX2RpX21vZGUgPSAwOworCWludAkJCWxpbmtfemVybzsKKwl1aW50CQkJcmVzYmxrczsKKwlpbnQJCQluYW1lbGVuOworCisJZGlyX3ZwID0gQkhWX1RPX1ZOT0RFKGRpcl9iZHApOworCXZuX3RyYWNlX2VudHJ5KGRpcl92cCwgX19GVU5DVElPTl9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisKKwlkcCA9IFhGU19CSFZUT0koZGlyX2JkcCk7CisJbXAgPSBkcC0+aV9tb3VudDsKKworCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCisJbmFtZWxlbiA9IFZOQU1FTEVOKGRlbnRyeSk7CisKKwlpZiAoRE1fRVZFTlRfRU5BQkxFRChkaXJfdnAtPnZfdmZzcCwgZHAsIERNX0VWRU5UX1JFTU9WRSkpIHsKKwkJZXJyb3IgPSBYRlNfU0VORF9OQU1FU1AobXAsIERNX0VWRU5UX1JFTU9WRSwgZGlyX3ZwLAorCQkJCQlETV9SSUdIVF9OVUxMLCBOVUxMLCBETV9SSUdIVF9OVUxMLAorCQkJCQluYW1lLCBOVUxMLCAwLCAwLCAwKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOworCX0KKworCS8qIEZyb20gdGhpcyBwb2ludCBvbiwgcmV0dXJuIHRocm91Z2ggc3RkX3JldHVybiAqLworCWlwID0gTlVMTDsKKworCS8qCisJICogV2UgbmVlZCB0byBnZXQgYSByZWZlcmVuY2UgdG8gaXAgYmVmb3JlIHdlIGdldCBvdXIgbG9nCisJICogcmVzZXJ2YXRpb24uIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCB3ZSBjYW5ub3QgY2FsbAorCSAqIHhmc19pZ2V0IGZvciBhbiBpbm9kZSBmb3Igd2hpY2ggd2UgZG8gbm90IGhhdmUgYSByZWZlcmVuY2UKKwkgKiBvbmNlIHdlJ3ZlIGFjcXVpcmVkIGEgbG9nIHJlc2VydmF0aW9uLiBUaGlzIGlzIGJlY2F1c2UgdGhlCisJICogaW5vZGUgd2UgYXJlIHRyeWluZyB0byBnZXQgbWlnaHQgYmUgaW4geGZzX2luYWN0aXZlIGdvaW5nCisJICogZm9yIGEgbG9nIHJlc2VydmF0aW9uLiBTaW5jZSB3ZSdsbCBoYXZlIHRvIHdhaXQgZm9yIHRoZQorCSAqIGluYWN0aXZlIGNvZGUgdG8gY29tcGxldGUgYmVmb3JlIHJldHVybmluZyBmcm9tIHhmc19pZ2V0LAorCSAqIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3QgaGF2ZSBsb2cgc3BhY2UgcmVzZXJ2ZWQKKwkgKiB3aGVuIHdlIGNhbGwgeGZzX2lnZXQuICBJbnN0ZWFkIHdlIGdldCBhbiB1bmxvY2tlZCByZWZlcmVjZQorCSAqIHRvIHRoZSBpbm9kZSBiZWZvcmUgZ2V0dGluZyBvdXIgbG9nIHJlc2VydmF0aW9uLgorCSAqLworCWVycm9yID0geGZzX2dldF9kaXJfZW50cnkoZGVudHJ5LCAmaXApOworCWlmIChlcnJvcikgeworCQlSRU1PVkVfREVCVUdfVFJBQ0UoX19MSU5FX18pOworCQlnb3RvIHN0ZF9yZXR1cm47CisJfQorCisJZG1fZGlfbW9kZSA9IGlwLT5pX2QuZGlfbW9kZTsKKworCXZuX3RyYWNlX2VudHJ5KFhGU19JVE9WKGlwKSwgX19GVU5DVElPTl9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisKKwlJVFJBQ0UoaXApOworCisJZXJyb3IgPSBYRlNfUU1fRFFBVFRBQ0gobXAsIGRwLCAwKTsKKwlpZiAoIWVycm9yICYmIGRwICE9IGlwKQorCQllcnJvciA9IFhGU19RTV9EUUFUVEFDSChtcCwgaXAsIDApOworCWlmIChlcnJvcikgeworCQlSRU1PVkVfREVCVUdfVFJBQ0UoX19MSU5FX18pOworCQlJUkVMRShpcCk7CisJCWdvdG8gc3RkX3JldHVybjsKKwl9CisKKwl0cCA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX1JFTU9WRSk7CisJY2FuY2VsX2ZsYWdzID0gWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUzsKKwkvKgorCSAqIFdlIHRyeSB0byBnZXQgdGhlIHJlYWwgc3BhY2UgcmVzZXJ2YXRpb24gZmlyc3QsCisJICogYWxsb3dpbmcgZm9yIGRpcmVjdG9yeSBidHJlZSBkZWxldGlvbihzKSBpbXBseWluZworCSAqIHBvc3NpYmxlIGJtYXAgaW5zZXJ0KHMpLiAgSWYgd2UgY2FuJ3QgZ2V0IHRoZSBzcGFjZQorCSAqIHJlc2VydmF0aW9uIHRoZW4gd2UgdXNlIDAgaW5zdGVhZCwgYW5kIGF2b2lkIHRoZSBibWFwCisJICogYnRyZWUgaW5zZXJ0KHMpIGluIHRoZSBkaXJlY3RvcnkgY29kZSBieSwgaWYgdGhlIGJtYXAKKwkgKiBpbnNlcnQgdHJpZXMgdG8gaGFwcGVuLCBpbnN0ZWFkIHRyaW1taW5nIHRoZSBMQVNUCisJICogYmxvY2sgZnJvbSB0aGUgZGlyZWN0b3J5LgorCSAqLworCXJlc2Jsa3MgPSBYRlNfUkVNT1ZFX1NQQUNFX1JFUyhtcCk7CisJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgcmVzYmxrcywgWEZTX1JFTU9WRV9MT0dfUkVTKG1wKSwgMCwKKwkJCVhGU19UUkFOU19QRVJNX0xPR19SRVMsIFhGU19SRU1PVkVfTE9HX0NPVU5UKTsKKwlpZiAoZXJyb3IgPT0gRU5PU1BDKSB7CisJCXJlc2Jsa3MgPSAwOworCQllcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCAwLCBYRlNfUkVNT1ZFX0xPR19SRVMobXApLCAwLAorCQkJCVhGU19UUkFOU19QRVJNX0xPR19SRVMsIFhGU19SRU1PVkVfTE9HX0NPVU5UKTsKKwl9CisJaWYgKGVycm9yKSB7CisJCUFTU0VSVChlcnJvciAhPSBFTk9TUEMpOworCQlSRU1PVkVfREVCVUdfVFJBQ0UoX19MSU5FX18pOworCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCAwKTsKKwkJSVJFTEUoaXApOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJZXJyb3IgPSB4ZnNfbG9ja19kaXJfYW5kX2VudHJ5KGRwLCBkZW50cnksIGlwKTsKKwlpZiAoZXJyb3IpIHsKKwkJUkVNT1ZFX0RFQlVHX1RSQUNFKF9fTElORV9fKTsKKwkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgY2FuY2VsX2ZsYWdzKTsKKwkJSVJFTEUoaXApOworCQlnb3RvIHN0ZF9yZXR1cm47CisJfQorCisJLyoKKwkgKiBBdCB0aGlzIHBvaW50LCB3ZSd2ZSBnb3R0ZW4gYm90aCB0aGUgZGlyZWN0b3J5IGFuZCB0aGUgZW50cnkKKwkgKiBpbm9kZXMgbG9ja2VkLgorCSAqLworCXhmc190cmFuc19pam9pbih0cCwgZHAsIFhGU19JTE9DS19FWENMKTsKKwlpZiAoZHAgIT0gaXApIHsKKwkJLyoKKwkJICogSW5jcmVtZW50IHZub2RlIHJlZiBjb3VudCBvbmx5IGluIHRoaXMgY2FzZSBzaW5jZQorCQkgKiB0aGVyZSdzIGFuIGV4dHJhIHZub2RlIHJlZmVyZW5jZSBpbiB0aGUgY2FzZSB3aGVyZQorCQkgKiBkcCA9PSBpcC4KKwkJICovCisJCUlIT0xEKGRwKTsKKwkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgWEZTX0lMT0NLX0VYQ0wpOworCX0KKworCS8qCisJICogRW50cnkgbXVzdCBleGlzdCBzaW5jZSB3ZSBkaWQgYSBsb29rdXAgaW4geGZzX2xvY2tfZGlyX2FuZF9lbnRyeS4KKwkgKi8KKwlYRlNfQk1BUF9JTklUKCZmcmVlX2xpc3QsICZmaXJzdF9ibG9jayk7CisJZXJyb3IgPSBYRlNfRElSX1JFTU9WRU5BTUUobXAsIHRwLCBkcCwgbmFtZSwgbmFtZWxlbiwgaXAtPmlfaW5vLAorCQkmZmlyc3RfYmxvY2ssICZmcmVlX2xpc3QsIDApOworCWlmIChlcnJvcikgeworCQlBU1NFUlQoZXJyb3IgIT0gRU5PRU5UKTsKKwkJUkVNT1ZFX0RFQlVHX1RSQUNFKF9fTElORV9fKTsKKwkJZ290byBlcnJvcjE7CisJfQorCXhmc19pY2hndGltZShkcCwgWEZTX0lDSEdUSU1FX01PRCB8IFhGU19JQ0hHVElNRV9DSEcpOworCisJZHAtPmlfZ2VuKys7CisJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgZHAsIFhGU19JTE9HX0NPUkUpOworCisJZXJyb3IgPSB4ZnNfZHJvcGxpbmsodHAsIGlwKTsKKwlpZiAoZXJyb3IpIHsKKwkJUkVNT1ZFX0RFQlVHX1RSQUNFKF9fTElORV9fKTsKKwkJZ290byBlcnJvcjE7CisJfQorCisJLyogRGV0ZXJtaW5lIGlmIHRoaXMgaXMgdGhlIGxhc3QgbGluayB3aGlsZQorCSAqIHdlIGFyZSBpbiB0aGUgdHJhbnNhY3Rpb24uCisJICovCisJbGlua196ZXJvID0gKGlwKS0+aV9kLmRpX25saW5rPT0wOworCisJLyoKKwkgKiBUYWtlIGFuIGV4dHJhIHJlZiBvbiB0aGUgaW5vZGUgc28gdGhhdCBpdCBkb2Vzbid0CisJICogZ28gdG8geGZzX2luYWN0aXZlKCkgZnJvbSB3aXRoaW4gdGhlIGNvbW1pdC4KKwkgKi8KKwlJSE9MRChpcCk7CisKKwkvKgorCSAqIElmIHRoaXMgaXMgYSBzeW5jaHJvbm91cyBtb3VudCwgbWFrZSBzdXJlIHRoYXQgdGhlCisJICogcmVtb3ZlIHRyYW5zYWN0aW9uIGdvZXMgdG8gZGlzayBiZWZvcmUgcmV0dXJuaW5nIHRvCisJICogdGhlIHVzZXIuCisJICovCisJaWYgKG1wLT5tX2ZsYWdzICYgKFhGU19NT1VOVF9XU1lOQ3xYRlNfTU9VTlRfRElSU1lOQykpIHsKKwkJeGZzX3RyYW5zX3NldF9zeW5jKHRwKTsKKwl9CisKKwllcnJvciA9IHhmc19ibWFwX2ZpbmlzaCgmdHAsICZmcmVlX2xpc3QsIGZpcnN0X2Jsb2NrLCAmY29tbWl0dGVkKTsKKwlpZiAoZXJyb3IpIHsKKwkJUkVNT1ZFX0RFQlVHX1RSQUNFKF9fTElORV9fKTsKKwkJZ290byBlcnJvcl9yZWxlOworCX0KKworCWVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwgWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUywgTlVMTCk7CisJaWYgKGVycm9yKSB7CisJCUlSRUxFKGlwKTsKKwkJZ290byBzdGRfcmV0dXJuOworCX0KKworCS8qCisJICogQmVmb3JlIHdlIGRyb3Agb3VyIGV4dHJhIHJlZmVyZW5jZSB0byB0aGUgaW5vZGUsIHB1cmdlIGl0CisJICogZnJvbSB0aGUgcmVmY2FjaGUgaWYgaXQgaXMgdGhlcmUuICBCeSB3YWl0aW5nIHVudGlsIGFmdGVyd2FyZHMKKwkgKiB0byBkbyB0aGUgSVJFTEUsIHdlIGVuc3VyZSB0aGF0IHdlIHdvbid0IGdvIGluYWN0aXZlIGluIHRoZQorCSAqIHhmc19yZWZjYWNoZV9wdXJnZV9pcCByb3V0aW5lIChhbHRob3VnaCB0aGF0IHdvdWxkIGJlIE9LKS4KKwkgKi8KKwl4ZnNfcmVmY2FjaGVfcHVyZ2VfaXAoaXApOworCisJdm5fdHJhY2VfZXhpdChYRlNfSVRPVihpcCksIF9fRlVOQ1RJT05fXywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCisJLyoKKwkgKiBMZXQgaW50ZXJwb3NlZCBmaWxlIHN5c3RlbXMga25vdyBhYm91dCByZW1vdmVkIGxpbmtzLgorCSAqLworCVZPUF9MSU5LX1JFTU9WRUQoWEZTX0lUT1YoaXApLCBkaXJfdnAsIGxpbmtfemVybyk7CisKKwlJUkVMRShpcCk7CisKKy8qCUZhbGwgdGhyb3VnaCB0byBzdGRfcmV0dXJuIHdpdGggZXJyb3IgPSAwICovCisgc3RkX3JldHVybjoKKwlpZiAoRE1fRVZFTlRfRU5BQkxFRChkaXJfdnAtPnZfdmZzcCwgZHAsCisJCQkJCQlETV9FVkVOVF9QT1NUUkVNT1ZFKSkgeworCQkodm9pZCkgWEZTX1NFTkRfTkFNRVNQKG1wLCBETV9FVkVOVF9QT1NUUkVNT1ZFLAorCQkJCWRpcl92cCwgRE1fUklHSFRfTlVMTCwKKwkJCQlOVUxMLCBETV9SSUdIVF9OVUxMLAorCQkJCW5hbWUsIE5VTEwsIGRtX2RpX21vZGUsIGVycm9yLCAwKTsKKwl9CisJcmV0dXJuIGVycm9yOworCisgZXJyb3IxOgorCXhmc19ibWFwX2NhbmNlbCgmZnJlZV9saXN0KTsKKwljYW5jZWxfZmxhZ3MgfD0gWEZTX1RSQU5TX0FCT1JUOworCXhmc190cmFuc19jYW5jZWwodHAsIGNhbmNlbF9mbGFncyk7CisJZ290byBzdGRfcmV0dXJuOworCisgZXJyb3JfcmVsZToKKwkvKgorCSAqIEluIHRoaXMgY2FzZSBtYWtlIHN1cmUgdG8gbm90IHJlbGVhc2UgdGhlIGlub2RlIHVudGlsIGFmdGVyCisJICogdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gaXMgYWJvcnRlZC4gIFJlbGVhc2luZyBpdCBiZWZvcmVoYW5kCisJICogY2FuIGNhdXNlIHVzIHRvIGdvIHRvIHhmc19pbmFjdGl2ZSBhbmQgc3RhcnQgYSByZWN1cnNpdmUKKwkgKiB0cmFuc2FjdGlvbiB3aGljaCBjYW4gZWFzaWx5IGRlYWRsb2NrIHdpdGggdGhlIGN1cnJlbnQgb25lLgorCSAqLworCXhmc19ibWFwX2NhbmNlbCgmZnJlZV9saXN0KTsKKwljYW5jZWxfZmxhZ3MgfD0gWEZTX1RSQU5TX0FCT1JUOworCXhmc190cmFuc19jYW5jZWwodHAsIGNhbmNlbF9mbGFncyk7CisKKwkvKgorCSAqIEJlZm9yZSB3ZSBkcm9wIG91ciBleHRyYSByZWZlcmVuY2UgdG8gdGhlIGlub2RlLCBwdXJnZSBpdAorCSAqIGZyb20gdGhlIHJlZmNhY2hlIGlmIGl0IGlzIHRoZXJlLiAgQnkgd2FpdGluZyB1bnRpbCBhZnRlcndhcmRzCisJICogdG8gZG8gdGhlIElSRUxFLCB3ZSBlbnN1cmUgdGhhdCB3ZSB3b24ndCBnbyBpbmFjdGl2ZSBpbiB0aGUKKwkgKiB4ZnNfcmVmY2FjaGVfcHVyZ2VfaXAgcm91dGluZSAoYWx0aG91Z2ggdGhhdCB3b3VsZCBiZSBPSykuCisJICovCisJeGZzX3JlZmNhY2hlX3B1cmdlX2lwKGlwKTsKKworCUlSRUxFKGlwKTsKKworCWdvdG8gc3RkX3JldHVybjsKK30KKworCisvKgorICogeGZzX2xpbmsKKyAqCisgKi8KK1NUQVRJQyBpbnQKK3hmc19saW5rKAorCWJodl9kZXNjX3QJCSp0YXJnZXRfZGlyX2JkcCwKKwl2bm9kZV90CQkJKnNyY192cCwKKwl2bmFtZV90CQkJKmRlbnRyeSwKKwljcmVkX3QJCQkqY3JlZHApCit7CisJeGZzX2lub2RlX3QJCSp0ZHAsICpzaXA7CisJeGZzX3RyYW5zX3QJCSp0cDsKKwl4ZnNfbW91bnRfdAkJKm1wOworCXhmc19pbm9kZV90CQkqaXBzWzJdOworCWludAkJCWVycm9yOworCXhmc19ibWFwX2ZyZWVfdCAgICAgICAgIGZyZWVfbGlzdDsKKwl4ZnNfZnNibG9ja190ICAgICAgICAgICBmaXJzdF9ibG9jazsKKwlpbnQJCQljYW5jZWxfZmxhZ3M7CisJaW50CQkJY29tbWl0dGVkOworCXZub2RlX3QJCQkqdGFyZ2V0X2Rpcl92cDsKKwliaHZfZGVzY190CQkqc3JjX2JkcDsKKwlpbnQJCQlyZXNibGtzOworCWNoYXIJCQkqdGFyZ2V0X25hbWUgPSBWTkFNRShkZW50cnkpOworCWludAkJCXRhcmdldF9uYW1lbGVuOworCisJdGFyZ2V0X2Rpcl92cCA9IEJIVl9UT19WTk9ERSh0YXJnZXRfZGlyX2JkcCk7CisJdm5fdHJhY2VfZW50cnkodGFyZ2V0X2Rpcl92cCwgX19GVU5DVElPTl9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisJdm5fdHJhY2VfZW50cnkoc3JjX3ZwLCBfX0ZVTkNUSU9OX18sIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKworCXRhcmdldF9uYW1lbGVuID0gVk5BTUVMRU4oZGVudHJ5KTsKKwlpZiAoc3JjX3ZwLT52X3R5cGUgPT0gVkRJUikKKwkJcmV0dXJuIFhGU19FUlJPUihFUEVSTSk7CisKKwkvKgorCSAqIEZvciBub3csIG1hbnVhbGx5IGZpbmQgdGhlIFhGUyBiZWhhdmlvciBkZXNjcmlwdG9yIGZvcgorCSAqIHRoZSBzb3VyY2Ugdm5vZGUuICBJZiBpdCBkb2Vzbid0IGV4aXN0IHRoZW4gc29tZXRoaW5nCisJICogaXMgd3JvbmcgYW5kIHdlIHNob3VsZCBqdXN0IHJldHVybiBhbiBlcnJvci4KKwkgKiBFdmVudHVhbGx5IHdlIG5lZWQgdG8gZmlndXJlIG91dCBob3cgbGluayBpcyBnb2luZyB0bworCSAqIHdvcmsgaW4gdGhlIGZhY2Ugb2Ygc3RhY2tlZCB2bm9kZXMuCisJICovCisJc3JjX2JkcCA9IHZuX2Jodl9sb29rdXBfdW5sb2NrZWQoVk5fQkhWX0hFQUQoc3JjX3ZwKSwgJnhmc192bm9kZW9wcyk7CisJaWYgKHNyY19iZHAgPT0gTlVMTCkgeworCQlyZXR1cm4gWEZTX0VSUk9SKEVYREVWKTsKKwl9CisJc2lwID0gWEZTX0JIVlRPSShzcmNfYmRwKTsKKwl0ZHAgPSBYRlNfQkhWVE9JKHRhcmdldF9kaXJfYmRwKTsKKwltcCA9IHRkcC0+aV9tb3VudDsKKwlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKworCWlmIChETV9FVkVOVF9FTkFCTEVEKHNyY192cC0+dl92ZnNwLCB0ZHAsIERNX0VWRU5UX0xJTkspKSB7CisJCWVycm9yID0gWEZTX1NFTkRfTkFNRVNQKG1wLCBETV9FVkVOVF9MSU5LLAorCQkJCQl0YXJnZXRfZGlyX3ZwLCBETV9SSUdIVF9OVUxMLAorCQkJCQlzcmNfdnAsIERNX1JJR0hUX05VTEwsCisJCQkJCXRhcmdldF9uYW1lLCBOVUxMLCAwLCAwLCAwKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOworCX0KKworCS8qIFJldHVybiB0aHJvdWdoIHN0ZF9yZXR1cm4gYWZ0ZXIgdGhpcyBwb2ludC4gKi8KKworCWVycm9yID0gWEZTX1FNX0RRQVRUQUNIKG1wLCBzaXAsIDApOworCWlmICghZXJyb3IgJiYgc2lwICE9IHRkcCkKKwkJZXJyb3IgPSBYRlNfUU1fRFFBVFRBQ0gobXAsIHRkcCwgMCk7CisJaWYgKGVycm9yKQorCQlnb3RvIHN0ZF9yZXR1cm47CisKKwl0cCA9IHhmc190cmFuc19hbGxvYyhtcCwgWEZTX1RSQU5TX0xJTkspOworCWNhbmNlbF9mbGFncyA9IFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVM7CisJcmVzYmxrcyA9IFhGU19MSU5LX1NQQUNFX1JFUyhtcCwgdGFyZ2V0X25hbWVsZW4pOworCWVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIHJlc2Jsa3MsIFhGU19MSU5LX0xPR19SRVMobXApLCAwLAorCQkJWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywgWEZTX0xJTktfTE9HX0NPVU5UKTsKKwlpZiAoZXJyb3IgPT0gRU5PU1BDKSB7CisJCXJlc2Jsa3MgPSAwOworCQllcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCAwLCBYRlNfTElOS19MT0dfUkVTKG1wKSwgMCwKKwkJCQlYRlNfVFJBTlNfUEVSTV9MT0dfUkVTLCBYRlNfTElOS19MT0dfQ09VTlQpOworCX0KKwlpZiAoZXJyb3IpIHsKKwkJY2FuY2VsX2ZsYWdzID0gMDsKKwkJZ290byBlcnJvcl9yZXR1cm47CisJfQorCisJaWYgKHNpcC0+aV9pbm8gPCB0ZHAtPmlfaW5vKSB7CisJCWlwc1swXSA9IHNpcDsKKwkJaXBzWzFdID0gdGRwOworCX0gZWxzZSB7CisJCWlwc1swXSA9IHRkcDsKKwkJaXBzWzFdID0gc2lwOworCX0KKworCXhmc19sb2NrX2lub2RlcyhpcHMsIDIsIDAsIFhGU19JTE9DS19FWENMKTsKKworCS8qCisJICogSW5jcmVtZW50IHZub2RlIHJlZiBjb3VudHMgc2luY2UgeGZzX3RyYW5zX2NvbW1pdCAmCisJICogeGZzX3RyYW5zX2NhbmNlbCB3aWxsIGJvdGggdW5sb2NrIHRoZSBpbm9kZXMgYW5kCisJICogZGVjcmVtZW50IHRoZSBhc3NvY2lhdGVkIHJlZiBjb3VudHMuCisJICovCisJVk5fSE9MRChzcmNfdnApOworCVZOX0hPTEQodGFyZ2V0X2Rpcl92cCk7CisJeGZzX3RyYW5zX2lqb2luKHRwLCBzaXAsIFhGU19JTE9DS19FWENMKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIHRkcCwgWEZTX0lMT0NLX0VYQ0wpOworCisJLyoKKwkgKiBJZiB0aGUgc291cmNlIGhhcyB0b28gbWFueSBsaW5rcywgd2UgY2FuJ3QgbWFrZSBhbnkgbW9yZSB0byBpdC4KKwkgKi8KKwlpZiAoc2lwLT5pX2QuZGlfbmxpbmsgPj0gWEZTX01BWExJTkspIHsKKwkJZXJyb3IgPSBYRlNfRVJST1IoRU1MSU5LKTsKKwkJZ290byBlcnJvcl9yZXR1cm47CisJfQorCisJaWYgKHJlc2Jsa3MgPT0gMCAmJgorCSAgICAoZXJyb3IgPSBYRlNfRElSX0NBTkVOVEVSKG1wLCB0cCwgdGRwLCB0YXJnZXRfbmFtZSwKKwkJCXRhcmdldF9uYW1lbGVuKSkpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCisJWEZTX0JNQVBfSU5JVCgmZnJlZV9saXN0LCAmZmlyc3RfYmxvY2spOworCisJZXJyb3IgPSBYRlNfRElSX0NSRUFURU5BTUUobXAsIHRwLCB0ZHAsIHRhcmdldF9uYW1lLCB0YXJnZXRfbmFtZWxlbiwKKwkJCQkgICBzaXAtPmlfaW5vLCAmZmlyc3RfYmxvY2ssICZmcmVlX2xpc3QsCisJCQkJICAgcmVzYmxrcyk7CisJaWYgKGVycm9yKQorCQlnb3RvIGFib3J0X3JldHVybjsKKwl4ZnNfaWNoZ3RpbWUodGRwLCBYRlNfSUNIR1RJTUVfTU9EIHwgWEZTX0lDSEdUSU1FX0NIRyk7CisJdGRwLT5pX2dlbisrOworCXhmc190cmFuc19sb2dfaW5vZGUodHAsIHRkcCwgWEZTX0lMT0dfQ09SRSk7CisKKwllcnJvciA9IHhmc19idW1wbGluayh0cCwgc2lwKTsKKwlpZiAoZXJyb3IpIHsKKwkJZ290byBhYm9ydF9yZXR1cm47CisJfQorCisJLyoKKwkgKiBJZiB0aGlzIGlzIGEgc3luY2hyb25vdXMgbW91bnQsIG1ha2Ugc3VyZSB0aGF0IHRoZQorCSAqIGxpbmsgdHJhbnNhY3Rpb24gZ29lcyB0byBkaXNrIGJlZm9yZSByZXR1cm5pbmcgdG8KKwkgKiB0aGUgdXNlci4KKwkgKi8KKwlpZiAobXAtPm1fZmxhZ3MgJiAoWEZTX01PVU5UX1dTWU5DfFhGU19NT1VOVF9ESVJTWU5DKSkgeworCQl4ZnNfdHJhbnNfc2V0X3N5bmModHApOworCX0KKworCWVycm9yID0geGZzX2JtYXBfZmluaXNoICgmdHAsICZmcmVlX2xpc3QsIGZpcnN0X2Jsb2NrLCAmY29tbWl0dGVkKTsKKwlpZiAoZXJyb3IpIHsKKwkJeGZzX2JtYXBfY2FuY2VsKCZmcmVlX2xpc3QpOworCQlnb3RvIGFib3J0X3JldHVybjsKKwl9CisKKwllcnJvciA9IHhmc190cmFuc19jb21taXQodHAsIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMsIE5VTEwpOworCWlmIChlcnJvcikgeworCQlnb3RvIHN0ZF9yZXR1cm47CisJfQorCisJLyogRmFsbCB0aHJvdWdoIHRvIHN0ZF9yZXR1cm4gd2l0aCBlcnJvciA9IDAuICovCitzdGRfcmV0dXJuOgorCWlmIChETV9FVkVOVF9FTkFCTEVEKHNyY192cC0+dl92ZnNwLCBzaXAsCisJCQkJCQlETV9FVkVOVF9QT1NUTElOSykpIHsKKwkJKHZvaWQpIFhGU19TRU5EX05BTUVTUChtcCwgRE1fRVZFTlRfUE9TVExJTkssCisJCQkJdGFyZ2V0X2Rpcl92cCwgRE1fUklHSFRfTlVMTCwKKwkJCQlzcmNfdnAsIERNX1JJR0hUX05VTEwsCisJCQkJdGFyZ2V0X25hbWUsIE5VTEwsIDAsIGVycm9yLCAwKTsKKwl9CisJcmV0dXJuIGVycm9yOworCisgYWJvcnRfcmV0dXJuOgorCWNhbmNlbF9mbGFncyB8PSBYRlNfVFJBTlNfQUJPUlQ7CisJLyogRkFMTFRIUk9VR0ggKi8KKyBlcnJvcl9yZXR1cm46CisJeGZzX3RyYW5zX2NhbmNlbCh0cCwgY2FuY2VsX2ZsYWdzKTsKKworCWdvdG8gc3RkX3JldHVybjsKK30KKy8qCisgKiB4ZnNfbWtkaXIKKyAqCisgKi8KK1NUQVRJQyBpbnQKK3hmc19ta2RpcigKKwliaHZfZGVzY190CQkqZGlyX2JkcCwKKwl2bmFtZV90CQkJKmRlbnRyeSwKKwl2YXR0cl90CQkJKnZhcCwKKwl2bm9kZV90CQkJKip2cHAsCisJY3JlZF90CQkJKmNyZWRwKQoreworCWNoYXIJCQkqZGlyX25hbWUgPSBWTkFNRShkZW50cnkpOworCXhmc19pbm9kZV90ICAgICAgICAgICAgICpkcDsKKwl4ZnNfaW5vZGVfdAkJKmNkcDsJLyogaW5vZGUgb2YgY3JlYXRlZCBkaXIgKi8KKwl2bm9kZV90CQkJKmN2cDsJLyogdm5vZGUgb2YgY3JlYXRlZCBkaXIgKi8KKwl4ZnNfdHJhbnNfdAkJKnRwOworCXhmc19tb3VudF90CQkqbXA7CisJaW50CQkJY2FuY2VsX2ZsYWdzOworCWludAkJCWVycm9yOworCWludAkJCWNvbW1pdHRlZDsKKwl4ZnNfYm1hcF9mcmVlX3QgICAgICAgICBmcmVlX2xpc3Q7CisJeGZzX2ZzYmxvY2tfdCAgICAgICAgICAgZmlyc3RfYmxvY2s7CisJdm5vZGVfdAkJCSpkaXJfdnA7CisJYm9vbGVhbl90CQlkcF9qb2luZWRfdG9fdHJhbnM7CisJYm9vbGVhbl90CQljcmVhdGVkID0gQl9GQUxTRTsKKwlpbnQJCQlkbV9ldmVudF9zZW50ID0gMDsKKwl4ZnNfcHJpZF90CQlwcmlkOworCXN0cnVjdCB4ZnNfZHF1b3QJKnVkcXAsICpnZHFwOworCXVpbnQJCQlyZXNibGtzOworCWludAkJCWRtX2RpX21vZGU7CisJaW50CQkJZGlyX25hbWVsZW47CisKKwlkaXJfdnAgPSBCSFZfVE9fVk5PREUoZGlyX2JkcCk7CisJZHAgPSBYRlNfQkhWVE9JKGRpcl9iZHApOworCW1wID0gZHAtPmlfbW91bnQ7CisKKwlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKworCWRpcl9uYW1lbGVuID0gVk5BTUVMRU4oZGVudHJ5KTsKKworCXRwID0gTlVMTDsKKwlkcF9qb2luZWRfdG9fdHJhbnMgPSBCX0ZBTFNFOworCWRtX2RpX21vZGUgPSB2YXAtPnZhX21vZGV8VlRUT0lGKHZhcC0+dmFfdHlwZSk7CisKKwlpZiAoRE1fRVZFTlRfRU5BQkxFRChkaXJfdnAtPnZfdmZzcCwgZHAsIERNX0VWRU5UX0NSRUFURSkpIHsKKwkJZXJyb3IgPSBYRlNfU0VORF9OQU1FU1AobXAsIERNX0VWRU5UX0NSRUFURSwKKwkJCQkJZGlyX3ZwLCBETV9SSUdIVF9OVUxMLCBOVUxMLAorCQkJCQlETV9SSUdIVF9OVUxMLCBkaXJfbmFtZSwgTlVMTCwKKwkJCQkJZG1fZGlfbW9kZSwgMCwgMCk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwkJZG1fZXZlbnRfc2VudCA9IDE7CisJfQorCisJLyogUmV0dXJuIHRocm91Z2ggc3RkX3JldHVybiBhZnRlciB0aGlzIHBvaW50LiAqLworCisJdm5fdHJhY2VfZW50cnkoZGlyX3ZwLCBfX0ZVTkNUSU9OX18sIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKworCW1wID0gZHAtPmlfbW91bnQ7CisJdWRxcCA9IGdkcXAgPSBOVUxMOworCWlmICh2YXAtPnZhX21hc2sgJiBYRlNfQVRfUFJPSklEKQorCQlwcmlkID0gKHhmc19wcmlkX3QpdmFwLT52YV9wcm9qaWQ7CisJZWxzZQorCQlwcmlkID0gKHhmc19wcmlkX3QpZGZsdHByaWQ7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgYWxsb2NhdGVkIGRxdW90KHMpIG9uIGRpc2suCisJICovCisJZXJyb3IgPSBYRlNfUU1fRFFWT1BBTExPQyhtcCwgZHAsCisJCQljdXJyZW50X2ZzdWlkKGNyZWRwKSwgY3VycmVudF9mc2dpZChjcmVkcCksCisJCQlYRlNfUU1PUFRfUVVPVEFMTCB8IFhGU19RTU9QVF9JTkhFUklULCAmdWRxcCwgJmdkcXApOworCWlmIChlcnJvcikKKwkJZ290byBzdGRfcmV0dXJuOworCisJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19NS0RJUik7CisJY2FuY2VsX2ZsYWdzID0gWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUzsKKwlyZXNibGtzID0gWEZTX01LRElSX1NQQUNFX1JFUyhtcCwgZGlyX25hbWVsZW4pOworCWVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIHJlc2Jsa3MsIFhGU19NS0RJUl9MT0dfUkVTKG1wKSwgMCwKKwkJCQkgIFhGU19UUkFOU19QRVJNX0xPR19SRVMsIFhGU19NS0RJUl9MT0dfQ09VTlQpOworCWlmIChlcnJvciA9PSBFTk9TUEMpIHsKKwkJcmVzYmxrcyA9IDA7CisJCWVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsIFhGU19NS0RJUl9MT0dfUkVTKG1wKSwgMCwKKwkJCQkJICBYRlNfVFJBTlNfUEVSTV9MT0dfUkVTLAorCQkJCQkgIFhGU19NS0RJUl9MT0dfQ09VTlQpOworCX0KKwlpZiAoZXJyb3IpIHsKKwkJY2FuY2VsX2ZsYWdzID0gMDsKKwkJZHAgPSBOVUxMOworCQlnb3RvIGVycm9yX3JldHVybjsKKwl9CisKKwl4ZnNfaWxvY2soZHAsIFhGU19JTE9DS19FWENMKTsKKworCS8qCisJICogQ2hlY2sgZm9yIGRpcmVjdG9yeSBsaW5rIGNvdW50IG92ZXJmbG93LgorCSAqLworCWlmIChkcC0+aV9kLmRpX25saW5rID49IFhGU19NQVhMSU5LKSB7CisJCWVycm9yID0gWEZTX0VSUk9SKEVNTElOSyk7CisJCWdvdG8gZXJyb3JfcmV0dXJuOworCX0KKworCS8qCisJICogUmVzZXJ2ZSBkaXNrIHF1b3RhIGFuZCB0aGUgaW5vZGUuCisJICovCisJZXJyb3IgPSBYRlNfVFJBTlNfUkVTRVJWRV9RVU9UQShtcCwgdHAsIHVkcXAsIGdkcXAsIHJlc2Jsa3MsIDEsIDApOworCWlmIChlcnJvcikKKwkJZ290byBlcnJvcl9yZXR1cm47CisKKwlpZiAocmVzYmxrcyA9PSAwICYmCisJICAgIChlcnJvciA9IFhGU19ESVJfQ0FORU5URVIobXAsIHRwLCBkcCwgZGlyX25hbWUsIGRpcl9uYW1lbGVuKSkpCisJCWdvdG8gZXJyb3JfcmV0dXJuOworCS8qCisJICogY3JlYXRlIHRoZSBkaXJlY3RvcnkgaW5vZGUuCisJICovCisJZXJyb3IgPSB4ZnNfZGlyX2lhbGxvYygmdHAsIGRwLAorCQkJTUFLRUlNT0RFKHZhcC0+dmFfdHlwZSx2YXAtPnZhX21vZGUpLCAyLAorCQkJMCwgY3JlZHAsIHByaWQsIHJlc2Jsa3MgPiAwLAorCQkmY2RwLCBOVUxMKTsKKwlpZiAoZXJyb3IpIHsKKwkJaWYgKGVycm9yID09IEVOT1NQQykKKwkJCWdvdG8gZXJyb3JfcmV0dXJuOworCQlnb3RvIGFib3J0X3JldHVybjsKKwl9CisJSVRSQUNFKGNkcCk7CisKKwkvKgorCSAqIE5vdyB3ZSBhZGQgdGhlIGRpcmVjdG9yeSBpbm9kZSB0byB0aGUgdHJhbnNhY3Rpb24uCisJICogV2Ugd2FpdGVkIHVudGlsIG5vdyBzaW5jZSB4ZnNfZGlyX2lhbGxvYyBtaWdodCBzdGFydAorCSAqIGEgbmV3IHRyYW5zYWN0aW9uLiAgSGFkIHdlIGpvaW5lZCB0aGUgdHJhbnNhY3Rpb24KKwkgKiBlYXJsaWVyLCB0aGUgbG9ja3MgbWlnaHQgaGF2ZSBnb3R0ZW4gcmVsZWFzZWQuCisJICovCisJVk5fSE9MRChkaXJfdnApOworCXhmc190cmFuc19pam9pbih0cCwgZHAsIFhGU19JTE9DS19FWENMKTsKKwlkcF9qb2luZWRfdG9fdHJhbnMgPSBCX1RSVUU7CisKKwlYRlNfQk1BUF9JTklUKCZmcmVlX2xpc3QsICZmaXJzdF9ibG9jayk7CisKKwllcnJvciA9IFhGU19ESVJfQ1JFQVRFTkFNRShtcCwgdHAsIGRwLCBkaXJfbmFtZSwgZGlyX25hbWVsZW4sCisJCQljZHAtPmlfaW5vLCAmZmlyc3RfYmxvY2ssICZmcmVlX2xpc3QsCisJCQlyZXNibGtzID8gcmVzYmxrcyAtIFhGU19JQUxMT0NfU1BBQ0VfUkVTKG1wKSA6IDApOworCWlmIChlcnJvcikgeworCQlBU1NFUlQoZXJyb3IgIT0gRU5PU1BDKTsKKwkJZ290byBlcnJvcjE7CisJfQorCXhmc19pY2hndGltZShkcCwgWEZTX0lDSEdUSU1FX01PRCB8IFhGU19JQ0hHVElNRV9DSEcpOworCisJLyoKKwkgKiBCdW1wIHRoZSBpbiBtZW1vcnkgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHBhcmVudCBkaXJlY3RvcnkKKwkgKiBzbyB0aGF0IG90aGVyIHByb2Nlc3NlcyBhY2Nlc3NpbmcgaXQgd2lsbCByZWNvZ25pemUgdGhhdAorCSAqIHRoZSBkaXJlY3RvcnkgaGFzIGNoYW5nZWQuCisJICovCisJZHAtPmlfZ2VuKys7CisKKwllcnJvciA9IFhGU19ESVJfSU5JVChtcCwgdHAsIGNkcCwgZHApOworCWlmIChlcnJvcikgeworCQlnb3RvIGVycm9yMjsKKwl9CisKKwljZHAtPmlfZ2VuID0gMTsKKwllcnJvciA9IHhmc19idW1wbGluayh0cCwgZHApOworCWlmIChlcnJvcikgeworCQlnb3RvIGVycm9yMjsKKwl9CisKKwljdnAgPSBYRlNfSVRPVihjZHApOworCisJY3JlYXRlZCA9IEJfVFJVRTsKKworCSp2cHAgPSBjdnA7CisJSUhPTEQoY2RwKTsKKworCS8qCisJICogQXR0YWNoIHRoZSBkcXVvdHMgdG8gdGhlIG5ldyBpbm9kZSBhbmQgbW9kaWZ5IHRoZSBpY291bnQgaW5jb3JlLgorCSAqLworCVhGU19RTV9EUVZPUENSRUFURShtcCwgdHAsIGNkcCwgdWRxcCwgZ2RxcCk7CisKKwkvKgorCSAqIElmIHRoaXMgaXMgYSBzeW5jaHJvbm91cyBtb3VudCwgbWFrZSBzdXJlIHRoYXQgdGhlCisJICogbWtkaXIgdHJhbnNhY3Rpb24gZ29lcyB0byBkaXNrIGJlZm9yZSByZXR1cm5pbmcgdG8KKwkgKiB0aGUgdXNlci4KKwkgKi8KKwlpZiAobXAtPm1fZmxhZ3MgJiAoWEZTX01PVU5UX1dTWU5DfFhGU19NT1VOVF9ESVJTWU5DKSkgeworCQl4ZnNfdHJhbnNfc2V0X3N5bmModHApOworCX0KKworCWVycm9yID0geGZzX2JtYXBfZmluaXNoKCZ0cCwgJmZyZWVfbGlzdCwgZmlyc3RfYmxvY2ssICZjb21taXR0ZWQpOworCWlmIChlcnJvcikgeworCQlJUkVMRShjZHApOworCQlnb3RvIGVycm9yMjsKKwl9CisKKwllcnJvciA9IHhmc190cmFuc19jb21taXQodHAsIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMsIE5VTEwpOworCVhGU19RTV9EUVJFTEUobXAsIHVkcXApOworCVhGU19RTV9EUVJFTEUobXAsIGdkcXApOworCWlmIChlcnJvcikgeworCQlJUkVMRShjZHApOworCX0KKworCS8qIEZhbGwgdGhyb3VnaCB0byBzdGRfcmV0dXJuIHdpdGggZXJyb3IgPSAwIG9yIGVycm5vIGZyb20KKwkgKiB4ZnNfdHJhbnNfY29tbWl0LiAqLworCitzdGRfcmV0dXJuOgorCWlmICggKGNyZWF0ZWQgfHwgKGVycm9yICE9IDAgJiYgZG1fZXZlbnRfc2VudCAhPSAwKSkgJiYKKwkJCURNX0VWRU5UX0VOQUJMRUQoZGlyX3ZwLT52X3Zmc3AsIFhGU19CSFZUT0koZGlyX2JkcCksCisJCQkJCQlETV9FVkVOVF9QT1NUQ1JFQVRFKSkgeworCQkodm9pZCkgWEZTX1NFTkRfTkFNRVNQKG1wLCBETV9FVkVOVF9QT1NUQ1JFQVRFLAorCQkJCQlkaXJfdnAsIERNX1JJR0hUX05VTEwsCisJCQkJCWNyZWF0ZWQgPyBYRlNfSVRPVihjZHApOk5VTEwsCisJCQkJCURNX1JJR0hUX05VTEwsCisJCQkJCWRpcl9uYW1lLCBOVUxMLAorCQkJCQlkbV9kaV9tb2RlLCBlcnJvciwgMCk7CisJfQorCXJldHVybiBlcnJvcjsKKworIGVycm9yMjoKKyBlcnJvcjE6CisJeGZzX2JtYXBfY2FuY2VsKCZmcmVlX2xpc3QpOworIGFib3J0X3JldHVybjoKKwljYW5jZWxfZmxhZ3MgfD0gWEZTX1RSQU5TX0FCT1JUOworIGVycm9yX3JldHVybjoKKwl4ZnNfdHJhbnNfY2FuY2VsKHRwLCBjYW5jZWxfZmxhZ3MpOworCVhGU19RTV9EUVJFTEUobXAsIHVkcXApOworCVhGU19RTV9EUVJFTEUobXAsIGdkcXApOworCisJaWYgKCFkcF9qb2luZWRfdG9fdHJhbnMgJiYgKGRwICE9IE5VTEwpKSB7CisJCXhmc19pdW5sb2NrKGRwLCBYRlNfSUxPQ0tfRVhDTCk7CisJfQorCisJZ290byBzdGRfcmV0dXJuOworfQorCisKKy8qCisgKiB4ZnNfcm1kaXIKKyAqCisgKi8KK1NUQVRJQyBpbnQKK3hmc19ybWRpcigKKwliaHZfZGVzY190CQkqZGlyX2JkcCwKKwl2bmFtZV90CQkJKmRlbnRyeSwKKwljcmVkX3QJCQkqY3JlZHApCit7CisJY2hhcgkJCSpuYW1lID0gVk5BTUUoZGVudHJ5KTsKKwl4ZnNfaW5vZGVfdCAgICAgICAgICAgICAqZHA7CisJeGZzX2lub2RlX3QgICAgICAgICAgICAgKmNkcDsgICAvKiBjaGlsZCBkaXJlY3RvcnkgKi8KKwl4ZnNfdHJhbnNfdCAgICAgICAgICAgICAqdHA7CisJeGZzX21vdW50X3QJCSptcDsKKwlpbnQgICAgICAgICAgICAgICAgICAgICBlcnJvcjsKKwl4ZnNfYm1hcF9mcmVlX3QgICAgICAgICBmcmVlX2xpc3Q7CisJeGZzX2ZzYmxvY2tfdCAgICAgICAgICAgZmlyc3RfYmxvY2s7CisJaW50CQkJY2FuY2VsX2ZsYWdzOworCWludAkJCWNvbW1pdHRlZDsKKwl2bm9kZV90CQkJKmRpcl92cDsKKwlpbnQJCQlkbV9kaV9tb2RlID0gMDsKKwlpbnQJCQlsYXN0X2NkcF9saW5rOworCWludAkJCW5hbWVsZW47CisJdWludAkJCXJlc2Jsa3M7CisKKwlkaXJfdnAgPSBCSFZfVE9fVk5PREUoZGlyX2JkcCk7CisJZHAgPSBYRlNfQkhWVE9JKGRpcl9iZHApOworCW1wID0gZHAtPmlfbW91bnQ7CisKKwl2bl90cmFjZV9lbnRyeShkaXJfdnAsIF9fRlVOQ1RJT05fXywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCisJaWYgKFhGU19GT1JDRURfU0hVVERPV04oWEZTX0JIVlRPSShkaXJfYmRwKS0+aV9tb3VudCkpCisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKwluYW1lbGVuID0gVk5BTUVMRU4oZGVudHJ5KTsKKworCWlmIChETV9FVkVOVF9FTkFCTEVEKGRpcl92cC0+dl92ZnNwLCBkcCwgRE1fRVZFTlRfUkVNT1ZFKSkgeworCQllcnJvciA9IFhGU19TRU5EX05BTUVTUChtcCwgRE1fRVZFTlRfUkVNT1ZFLAorCQkJCQlkaXJfdnAsIERNX1JJR0hUX05VTEwsCisJCQkJCU5VTEwsIERNX1JJR0hUX05VTEwsCisJCQkJCW5hbWUsIE5VTEwsIDAsIDAsIDApOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gWEZTX0VSUk9SKGVycm9yKTsKKwl9CisKKwkvKiBSZXR1cm4gdGhyb3VnaCBzdGRfcmV0dXJuIGFmdGVyIHRoaXMgcG9pbnQuICovCisKKwljZHAgPSBOVUxMOworCisJLyoKKwkgKiBXZSBuZWVkIHRvIGdldCBhIHJlZmVyZW5jZSB0byBjZHAgYmVmb3JlIHdlIGdldCBvdXIgbG9nCisJICogcmVzZXJ2YXRpb24uICBUaGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQgd2UgY2Fubm90IGNhbGwKKwkgKiB4ZnNfaWdldCBmb3IgYW4gaW5vZGUgZm9yIHdoaWNoIHdlIGRvIG5vdCBoYXZlIGEgcmVmZXJlbmNlCisJICogb25jZSB3ZSd2ZSBhY3F1aXJlZCBhIGxvZyByZXNlcnZhdGlvbi4gIFRoaXMgaXMgYmVjYXVzZSB0aGUKKwkgKiBpbm9kZSB3ZSBhcmUgdHJ5aW5nIHRvIGdldCBtaWdodCBiZSBpbiB4ZnNfaW5hY3RpdmUgZ29pbmcKKwkgKiBmb3IgYSBsb2cgcmVzZXJ2YXRpb24uICBTaW5jZSB3ZSdsbCBoYXZlIHRvIHdhaXQgZm9yIHRoZQorCSAqIGluYWN0aXZlIGNvZGUgdG8gY29tcGxldGUgYmVmb3JlIHJldHVybmluZyBmcm9tIHhmc19pZ2V0LAorCSAqIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3QgaGF2ZSBsb2cgc3BhY2UgcmVzZXJ2ZWQKKwkgKiB3aGVuIHdlIGNhbGwgeGZzX2lnZXQuICBJbnN0ZWFkIHdlIGdldCBhbiB1bmxvY2tlZCByZWZlcmVjZQorCSAqIHRvIHRoZSBpbm9kZSBiZWZvcmUgZ2V0dGluZyBvdXIgbG9nIHJlc2VydmF0aW9uLgorCSAqLworCWVycm9yID0geGZzX2dldF9kaXJfZW50cnkoZGVudHJ5LCAmY2RwKTsKKwlpZiAoZXJyb3IpIHsKKwkJUkVNT1ZFX0RFQlVHX1RSQUNFKF9fTElORV9fKTsKKwkJZ290byBzdGRfcmV0dXJuOworCX0KKwltcCA9IGRwLT5pX21vdW50OworCWRtX2RpX21vZGUgPSBjZHAtPmlfZC5kaV9tb2RlOworCisJLyoKKwkgKiBHZXQgdGhlIGRxdW90cyBmb3IgdGhlIGlub2Rlcy4KKwkgKi8KKwllcnJvciA9IFhGU19RTV9EUUFUVEFDSChtcCwgZHAsIDApOworCWlmICghZXJyb3IgJiYgZHAgIT0gY2RwKQorCQllcnJvciA9IFhGU19RTV9EUUFUVEFDSChtcCwgY2RwLCAwKTsKKwlpZiAoZXJyb3IpIHsKKwkJSVJFTEUoY2RwKTsKKwkJUkVNT1ZFX0RFQlVHX1RSQUNFKF9fTElORV9fKTsKKwkJZ290byBzdGRfcmV0dXJuOworCX0KKworCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfUk1ESVIpOworCWNhbmNlbF9mbGFncyA9IFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVM7CisJLyoKKwkgKiBXZSB0cnkgdG8gZ2V0IHRoZSByZWFsIHNwYWNlIHJlc2VydmF0aW9uIGZpcnN0LAorCSAqIGFsbG93aW5nIGZvciBkaXJlY3RvcnkgYnRyZWUgZGVsZXRpb24ocykgaW1wbHlpbmcKKwkgKiBwb3NzaWJsZSBibWFwIGluc2VydChzKS4gIElmIHdlIGNhbid0IGdldCB0aGUgc3BhY2UKKwkgKiByZXNlcnZhdGlvbiB0aGVuIHdlIHVzZSAwIGluc3RlYWQsIGFuZCBhdm9pZCB0aGUgYm1hcAorCSAqIGJ0cmVlIGluc2VydChzKSBpbiB0aGUgZGlyZWN0b3J5IGNvZGUgYnksIGlmIHRoZSBibWFwCisJICogaW5zZXJ0IHRyaWVzIHRvIGhhcHBlbiwgaW5zdGVhZCB0cmltbWluZyB0aGUgTEFTVAorCSAqIGJsb2NrIGZyb20gdGhlIGRpcmVjdG9yeS4KKwkgKi8KKwlyZXNibGtzID0gWEZTX1JFTU9WRV9TUEFDRV9SRVMobXApOworCWVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIHJlc2Jsa3MsIFhGU19SRU1PVkVfTE9HX1JFUyhtcCksIDAsCisJCQlYRlNfVFJBTlNfUEVSTV9MT0dfUkVTLCBYRlNfREVGQVVMVF9MT0dfQ09VTlQpOworCWlmIChlcnJvciA9PSBFTk9TUEMpIHsKKwkJcmVzYmxrcyA9IDA7CisJCWVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsIFhGU19SRU1PVkVfTE9HX1JFUyhtcCksIDAsCisJCQkJWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywgWEZTX0RFRkFVTFRfTE9HX0NPVU5UKTsKKwl9CisJaWYgKGVycm9yKSB7CisJCUFTU0VSVChlcnJvciAhPSBFTk9TUEMpOworCQljYW5jZWxfZmxhZ3MgPSAwOworCQlJUkVMRShjZHApOworCQlnb3RvIGVycm9yX3JldHVybjsKKwl9CisJWEZTX0JNQVBfSU5JVCgmZnJlZV9saXN0LCAmZmlyc3RfYmxvY2spOworCisJLyoKKwkgKiBOb3cgbG9jayB0aGUgY2hpbGQgZGlyZWN0b3J5IGlub2RlIGFuZCB0aGUgcGFyZW50IGRpcmVjdG9yeQorCSAqIGlub2RlIGluIHRoZSBwcm9wZXIgb3JkZXIuICBUaGlzIHdpbGwgdGFrZSBjYXJlIG9mIHZhbGlkYXRpbmcKKwkgKiB0aGF0IHRoZSBkaXJlY3RvcnkgZW50cnkgZm9yIHRoZSBjaGlsZCBkaXJlY3RvcnkgaW5vZGUgaGFzCisJICogbm90IGNoYW5nZWQgd2hpbGUgd2Ugd2VyZSBvYnRhaW5pbmcgYSBsb2cgcmVzZXJ2YXRpb24uCisJICovCisJZXJyb3IgPSB4ZnNfbG9ja19kaXJfYW5kX2VudHJ5KGRwLCBkZW50cnksIGNkcCk7CisJaWYgKGVycm9yKSB7CisJCXhmc190cmFuc19jYW5jZWwodHAsIGNhbmNlbF9mbGFncyk7CisJCUlSRUxFKGNkcCk7CisJCWdvdG8gc3RkX3JldHVybjsKKwl9CisKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIGRwLCBYRlNfSUxPQ0tfRVhDTCk7CisJaWYgKGRwICE9IGNkcCkgeworCQkvKgorCQkgKiBPbmx5IGluY3JlbWVudCB0aGUgcGFyZW50IGRpcmVjdG9yeSB2bm9kZSBjb3VudCBpZgorCQkgKiB3ZSBkaWRuJ3QgYnVtcCBpdCBpbiBsb29raW5nIHVwIGNkcC4gIFRoZSBvbmx5IHRpbWUKKwkJICogd2UgZG9uJ3QgYnVtcCBpdCBpcyB3aGVuIHdlJ3JlIGxvb2tpbmcgdXAgIi4iLgorCQkgKi8KKwkJVk5fSE9MRChkaXJfdnApOworCX0KKworCUlUUkFDRShjZHApOworCXhmc190cmFuc19pam9pbih0cCwgY2RwLCBYRlNfSUxPQ0tfRVhDTCk7CisKKwlBU1NFUlQoY2RwLT5pX2QuZGlfbmxpbmsgPj0gMik7CisJaWYgKGNkcC0+aV9kLmRpX25saW5rICE9IDIpIHsKKwkJZXJyb3IgPSBYRlNfRVJST1IoRU5PVEVNUFRZKTsKKwkJZ290byBlcnJvcl9yZXR1cm47CisJfQorCWlmICghWEZTX0RJUl9JU0VNUFRZKG1wLCBjZHApKSB7CisJCWVycm9yID0gWEZTX0VSUk9SKEVOT1RFTVBUWSk7CisJCWdvdG8gZXJyb3JfcmV0dXJuOworCX0KKworCWVycm9yID0gWEZTX0RJUl9SRU1PVkVOQU1FKG1wLCB0cCwgZHAsIG5hbWUsIG5hbWVsZW4sIGNkcC0+aV9pbm8sCisJCSZmaXJzdF9ibG9jaywgJmZyZWVfbGlzdCwgcmVzYmxrcyk7CisJaWYgKGVycm9yKSB7CisJCWdvdG8gZXJyb3IxOworCX0KKworCXhmc19pY2hndGltZShkcCwgWEZTX0lDSEdUSU1FX01PRCB8IFhGU19JQ0hHVElNRV9DSEcpOworCisJLyoKKwkgKiBCdW1wIHRoZSBpbiBtZW1vcnkgZ2VuZXJhdGlvbiBjb3VudCBvbiB0aGUgcGFyZW50CisJICogZGlyZWN0b3J5IHNvIHRoYXQgb3RoZXIgY2FuIGtub3cgdGhhdCBpdCBoYXMgY2hhbmdlZC4KKwkgKi8KKwlkcC0+aV9nZW4rKzsKKworCS8qCisJICogRHJvcCB0aGUgbGluayBmcm9tIGNkcCdzICIuLiIuCisJICovCisJZXJyb3IgPSB4ZnNfZHJvcGxpbmsodHAsIGRwKTsKKwlpZiAoZXJyb3IpIHsKKwkJZ290byBlcnJvcjE7CisJfQorCisJLyoKKwkgKiBEcm9wIHRoZSBsaW5rIGZyb20gZHAgdG8gY2RwLgorCSAqLworCWVycm9yID0geGZzX2Ryb3BsaW5rKHRwLCBjZHApOworCWlmIChlcnJvcikgeworCQlnb3RvIGVycm9yMTsKKwl9CisKKwkvKgorCSAqIERyb3AgdGhlICIuIiBsaW5rIGZyb20gY2RwIHRvIHNlbGYuCisJICovCisJZXJyb3IgPSB4ZnNfZHJvcGxpbmsodHAsIGNkcCk7CisJaWYgKGVycm9yKSB7CisJCWdvdG8gZXJyb3IxOworCX0KKworCS8qIERldGVybWluZSB0aGVzZSBiZWZvcmUgY29tbWl0dGluZyB0cmFuc2FjdGlvbiAqLworCWxhc3RfY2RwX2xpbmsgPSAoY2RwKS0+aV9kLmRpX25saW5rPT0wOworCisJLyoKKwkgKiBUYWtlIGFuIGV4dHJhIHJlZiBvbiB0aGUgY2hpbGQgdm5vZGUgc28gdGhhdCBpdAorCSAqIGRvZXMgbm90IGdvIHRvIHhmc19pbmFjdGl2ZSgpIGZyb20gd2l0aGluIHRoZSBjb21taXQuCisJICovCisJSUhPTEQoY2RwKTsKKworCS8qCisJICogSWYgdGhpcyBpcyBhIHN5bmNocm9ub3VzIG1vdW50LCBtYWtlIHN1cmUgdGhhdCB0aGUKKwkgKiBybWRpciB0cmFuc2FjdGlvbiBnb2VzIHRvIGRpc2sgYmVmb3JlIHJldHVybmluZyB0bworCSAqIHRoZSB1c2VyLgorCSAqLworCWlmIChtcC0+bV9mbGFncyAmIChYRlNfTU9VTlRfV1NZTkN8WEZTX01PVU5UX0RJUlNZTkMpKSB7CisJCXhmc190cmFuc19zZXRfc3luYyh0cCk7CisJfQorCisJZXJyb3IgPSB4ZnNfYm1hcF9maW5pc2ggKCZ0cCwgJmZyZWVfbGlzdCwgZmlyc3RfYmxvY2ssICZjb21taXR0ZWQpOworCWlmIChlcnJvcikgeworCQl4ZnNfYm1hcF9jYW5jZWwoJmZyZWVfbGlzdCk7CisJCXhmc190cmFuc19jYW5jZWwodHAsIChYRlNfVFJBTlNfUkVMRUFTRV9MT0dfUkVTIHwKKwkJCQkgWEZTX1RSQU5TX0FCT1JUKSk7CisJCUlSRUxFKGNkcCk7CisJCWdvdG8gc3RkX3JldHVybjsKKwl9CisKKwllcnJvciA9IHhmc190cmFuc19jb21taXQodHAsIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMsIE5VTEwpOworCWlmIChlcnJvcikgeworCQlJUkVMRShjZHApOworCQlnb3RvIHN0ZF9yZXR1cm47CisJfQorCisKKwkvKgorCSAqIExldCBpbnRlcnBvc2VkIGZpbGUgc3lzdGVtcyBrbm93IGFib3V0IHJlbW92ZWQgbGlua3MuCisJICovCisJVk9QX0xJTktfUkVNT1ZFRChYRlNfSVRPVihjZHApLCBkaXJfdnAsIGxhc3RfY2RwX2xpbmspOworCisJSVJFTEUoY2RwKTsKKworCS8qIEZhbGwgdGhyb3VnaCB0byBzdGRfcmV0dXJuIHdpdGggZXJyb3IgPSAwIG9yIHRoZSBlcnJubworCSAqIGZyb20geGZzX3RyYW5zX2NvbW1pdC4gKi8KK3N0ZF9yZXR1cm46CisJaWYgKERNX0VWRU5UX0VOQUJMRUQoZGlyX3ZwLT52X3Zmc3AsIGRwLCBETV9FVkVOVF9QT1NUUkVNT1ZFKSkgeworCQkodm9pZCkgWEZTX1NFTkRfTkFNRVNQKG1wLCBETV9FVkVOVF9QT1NUUkVNT1ZFLAorCQkJCQlkaXJfdnAsIERNX1JJR0hUX05VTEwsCisJCQkJCU5VTEwsIERNX1JJR0hUX05VTEwsCisJCQkJCW5hbWUsIE5VTEwsIGRtX2RpX21vZGUsCisJCQkJCWVycm9yLCAwKTsKKwl9CisJcmV0dXJuIGVycm9yOworCisgZXJyb3IxOgorCXhmc19ibWFwX2NhbmNlbCgmZnJlZV9saXN0KTsKKwljYW5jZWxfZmxhZ3MgfD0gWEZTX1RSQU5TX0FCT1JUOworIGVycm9yX3JldHVybjoKKwl4ZnNfdHJhbnNfY2FuY2VsKHRwLCBjYW5jZWxfZmxhZ3MpOworCWdvdG8gc3RkX3JldHVybjsKK30KKworCisvKgorICogeGZzX3JlYWRkaXIKKyAqCisgKiBSZWFkIGRwJ3MgZW50cmllcyBzdGFydGluZyBhdCB1aW9wLT51aW9fb2Zmc2V0IGFuZCB0cmFuc2xhdGUgdGhlbSBpbnRvCisgKiBidWZzaXplIGJ5dGVzIHdvcnRoIG9mIHN0cnVjdCBkaXJlbnRzIHN0YXJ0aW5nIGF0IGJ1ZmJhc2UuCisgKi8KK1NUQVRJQyBpbnQKK3hmc19yZWFkZGlyKAorCWJodl9kZXNjX3QJKmRpcl9iZHAsCisJdWlvX3QJCSp1aW9wLAorCWNyZWRfdAkJKmNyZWRwLAorCWludAkJKmVvZnApCit7CisJeGZzX2lub2RlX3QJKmRwOworCXhmc190cmFuc190CSp0cCA9IE5VTEw7CisJaW50CQllcnJvciA9IDA7CisJdWludAkJbG9ja19tb2RlOworCXhmc19vZmZfdAlzdGFydF9vZmZzZXQ7CisKKwl2bl90cmFjZV9lbnRyeShCSFZfVE9fVk5PREUoZGlyX2JkcCksIF9fRlVOQ1RJT05fXywKKwkJCQkJICAgICAgIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKwlkcCA9IFhGU19CSFZUT0koZGlyX2JkcCk7CisKKwlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihkcC0+aV9tb3VudCkpIHsKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCX0KKworCWxvY2tfbW9kZSA9IHhmc19pbG9ja19tYXBfc2hhcmVkKGRwKTsKKwlzdGFydF9vZmZzZXQgPSB1aW9wLT51aW9fb2Zmc2V0OworCWVycm9yID0gWEZTX0RJUl9HRVRERU5UUyhkcC0+aV9tb3VudCwgdHAsIGRwLCB1aW9wLCBlb2ZwKTsKKwlpZiAoc3RhcnRfb2Zmc2V0ICE9IHVpb3AtPnVpb19vZmZzZXQpIHsKKwkJeGZzX2ljaGd0aW1lKGRwLCBYRlNfSUNIR1RJTUVfQUNDKTsKKwl9CisJeGZzX2l1bmxvY2tfbWFwX3NoYXJlZChkcCwgbG9ja19tb2RlKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKworLyoKKyAqIHhmc19zeW1saW5rCisgKgorICovCitTVEFUSUMgaW50Cit4ZnNfc3ltbGluaygKKwliaHZfZGVzY190CQkqZGlyX2JkcCwKKwl2bmFtZV90CQkJKmRlbnRyeSwKKwl2YXR0cl90CQkJKnZhcCwKKwljaGFyCQkJKnRhcmdldF9wYXRoLAorCXZub2RlX3QJCQkqKnZwcCwKKwljcmVkX3QJCQkqY3JlZHApCit7CisJeGZzX3RyYW5zX3QJCSp0cDsKKwl4ZnNfbW91bnRfdAkJKm1wOworCXhmc19pbm9kZV90CQkqZHA7CisJeGZzX2lub2RlX3QJCSppcDsKKwlpbnQJCQllcnJvcjsKKwlpbnQJCQlwYXRobGVuOworCXhmc19ibWFwX2ZyZWVfdAkJZnJlZV9saXN0OworCXhmc19mc2Jsb2NrX3QJCWZpcnN0X2Jsb2NrOworCWJvb2xlYW5fdAkJZHBfam9pbmVkX3RvX3RyYW5zOworCXZub2RlX3QJCQkqZGlyX3ZwOworCXVpbnQJCQljYW5jZWxfZmxhZ3M7CisJaW50CQkJY29tbWl0dGVkOworCXhmc19maWxlb2ZmX3QJCWZpcnN0X2ZzYjsKKwl4ZnNfZmlsYmxrc190CQlmc19ibG9ja3M7CisJaW50CQkJbm1hcHM7CisJeGZzX2JtYnRfaXJlY190CQltdmFsW1NZTUxJTktfTUFQU107CisJeGZzX2RhZGRyX3QJCWQ7CisJY2hhcgkJCSpjdXJfY2h1bms7CisJaW50CQkJYnl0ZV9jbnQ7CisJaW50CQkJbjsKKwl4ZnNfYnVmX3QJCSpicDsKKwl4ZnNfcHJpZF90CQlwcmlkOworCXN0cnVjdCB4ZnNfZHF1b3QJKnVkcXAsICpnZHFwOworCXVpbnQJCQlyZXNibGtzOworCWNoYXIJCQkqbGlua19uYW1lID0gVk5BTUUoZGVudHJ5KTsKKwlpbnQJCQlsaW5rX25hbWVsZW47CisKKwkqdnBwID0gTlVMTDsKKwlkaXJfdnAgPSBCSFZfVE9fVk5PREUoZGlyX2JkcCk7CisJZHAgPSBYRlNfQkhWVE9JKGRpcl9iZHApOworCWRwX2pvaW5lZF90b190cmFucyA9IEJfRkFMU0U7CisJZXJyb3IgPSAwOworCWlwID0gTlVMTDsKKwl0cCA9IE5VTEw7CisKKwl2bl90cmFjZV9lbnRyeShkaXJfdnAsIF9fRlVOQ1RJT05fXywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCisJbXAgPSBkcC0+aV9tb3VudDsKKworCWlmIChYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSkKKwkJcmV0dXJuIFhGU19FUlJPUihFSU8pOworCisJbGlua19uYW1lbGVuID0gVk5BTUVMRU4oZGVudHJ5KTsKKworCS8qCisJICogQ2hlY2sgY29tcG9uZW50IGxlbmd0aHMgb2YgdGhlIHRhcmdldCBwYXRoIG5hbWUuCisJICovCisJcGF0aGxlbiA9IHN0cmxlbih0YXJnZXRfcGF0aCk7CisJaWYgKHBhdGhsZW4gPj0gTUFYUEFUSExFTikgICAgICAvKiB0b3RhbCBzdHJpbmcgdG9vIGxvbmcgKi8KKwkJcmV0dXJuIFhGU19FUlJPUihFTkFNRVRPT0xPTkcpOworCWlmIChwYXRobGVuID49IE1BWE5BTUVMRU4pIHsgICAgLyogaXMgYW55IGNvbXBvbmVudCB0b28gbG9uZz8gKi8KKwkJaW50IGxlbiwgdG90YWw7CisJCWNoYXIgKnBhdGg7CisKKwkJZm9yKHRvdGFsID0gMCwgcGF0aCA9IHRhcmdldF9wYXRoOyB0b3RhbCA8IHBhdGhsZW47KSB7CisJCQkvKgorCQkJICogU2tpcCBhbnkgc2xhc2hlcy4KKwkJCSAqLworCQkJd2hpbGUoKnBhdGggPT0gJy8nKSB7CisJCQkJdG90YWwrKzsKKwkJCQlwYXRoKys7CisJCQl9CisKKwkJCS8qCisJCQkgKiBDb3VudCB1cCB0byB0aGUgbmV4dCBzbGFzaCBvciBlbmQgb2YgcGF0aC4KKwkJCSAqIEVycm9yIG91dCBpZiB0aGUgY29tcG9uZW50IGlzIGJpZ2dlciB0aGFuIE1BWE5BTUVMRU4uCisJCQkgKi8KKwkJCWZvcihsZW4gPSAwOyAqcGF0aCAhPSAnLycgJiYgdG90YWwgPCBwYXRobGVuO3RvdGFsKyssIHBhdGgrKykgeworCQkJCWlmICgrK2xlbiA+PSBNQVhOQU1FTEVOKSB7CisJCQkJCWVycm9yID0gRU5BTUVUT09MT05HOworCQkJCQlyZXR1cm4gZXJyb3I7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYgKERNX0VWRU5UX0VOQUJMRUQoZGlyX3ZwLT52X3Zmc3AsIGRwLCBETV9FVkVOVF9TWU1MSU5LKSkgeworCQllcnJvciA9IFhGU19TRU5EX05BTUVTUChtcCwgRE1fRVZFTlRfU1lNTElOSywgZGlyX3ZwLAorCQkJCQlETV9SSUdIVF9OVUxMLCBOVUxMLCBETV9SSUdIVF9OVUxMLAorCQkJCQlsaW5rX25hbWUsIHRhcmdldF9wYXRoLCAwLCAwLCAwKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOworCX0KKworCS8qIFJldHVybiB0aHJvdWdoIHN0ZF9yZXR1cm4gYWZ0ZXIgdGhpcyBwb2ludC4gKi8KKworCXVkcXAgPSBnZHFwID0gTlVMTDsKKwlpZiAodmFwLT52YV9tYXNrICYgWEZTX0FUX1BST0pJRCkKKwkJcHJpZCA9ICh4ZnNfcHJpZF90KXZhcC0+dmFfcHJvamlkOworCWVsc2UKKwkJcHJpZCA9ICh4ZnNfcHJpZF90KWRmbHRwcmlkOworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGFsbG9jYXRlZCBkcXVvdChzKSBvbiBkaXNrLgorCSAqLworCWVycm9yID0gWEZTX1FNX0RRVk9QQUxMT0MobXAsIGRwLAorCQkJY3VycmVudF9mc3VpZChjcmVkcCksIGN1cnJlbnRfZnNnaWQoY3JlZHApLAorCQkJWEZTX1FNT1BUX1FVT1RBTEwgfCBYRlNfUU1PUFRfSU5IRVJJVCwgJnVkcXAsICZnZHFwKTsKKwlpZiAoZXJyb3IpCisJCWdvdG8gc3RkX3JldHVybjsKKworCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfU1lNTElOSyk7CisJY2FuY2VsX2ZsYWdzID0gWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUzsKKwkvKgorCSAqIFRoZSBzeW1saW5rIHdpbGwgZml0IGludG8gdGhlIGlub2RlIGRhdGEgZm9yaz8KKwkgKiBUaGVyZSBjYW4ndCBiZSBhbnkgYXR0cmlidXRlcyBzbyB3ZSBnZXQgdGhlIHdob2xlIHZhcmlhYmxlIHBhcnQuCisJICovCisJaWYgKHBhdGhsZW4gPD0gWEZTX0xJVElOTyhtcCkpCisJCWZzX2Jsb2NrcyA9IDA7CisJZWxzZQorCQlmc19ibG9ja3MgPSBYRlNfQl9UT19GU0IobXAsIHBhdGhsZW4pOworCXJlc2Jsa3MgPSBYRlNfU1lNTElOS19TUEFDRV9SRVMobXAsIGxpbmtfbmFtZWxlbiwgZnNfYmxvY2tzKTsKKwllcnJvciA9IHhmc190cmFuc19yZXNlcnZlKHRwLCByZXNibGtzLCBYRlNfU1lNTElOS19MT0dfUkVTKG1wKSwgMCwKKwkJCVhGU19UUkFOU19QRVJNX0xPR19SRVMsIFhGU19TWU1MSU5LX0xPR19DT1VOVCk7CisJaWYgKGVycm9yID09IEVOT1NQQyAmJiBmc19ibG9ja3MgPT0gMCkgeworCQlyZXNibGtzID0gMDsKKwkJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgMCwgWEZTX1NZTUxJTktfTE9HX1JFUyhtcCksIDAsCisJCQkJWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywgWEZTX1NZTUxJTktfTE9HX0NPVU5UKTsKKwl9CisJaWYgKGVycm9yKSB7CisJCWNhbmNlbF9mbGFncyA9IDA7CisJCWRwID0gTlVMTDsKKwkJZ290byBlcnJvcl9yZXR1cm47CisJfQorCisJeGZzX2lsb2NrKGRwLCBYRlNfSUxPQ0tfRVhDTCk7CisKKwkvKgorCSAqIENoZWNrIHdoZXRoZXIgdGhlIGRpcmVjdG9yeSBhbGxvd3MgbmV3IHN5bWxpbmtzIG9yIG5vdC4KKwkgKi8KKwlpZiAoZHAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfTk9TWU1MSU5LUykgeworCQllcnJvciA9IFhGU19FUlJPUihFUEVSTSk7CisJCWdvdG8gZXJyb3JfcmV0dXJuOworCX0KKworCS8qCisJICogUmVzZXJ2ZSBkaXNrIHF1b3RhIDogYmxvY2tzIGFuZCBpbm9kZS4KKwkgKi8KKwllcnJvciA9IFhGU19UUkFOU19SRVNFUlZFX1FVT1RBKG1wLCB0cCwgdWRxcCwgZ2RxcCwgcmVzYmxrcywgMSwgMCk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycm9yX3JldHVybjsKKworCS8qCisJICogQ2hlY2sgZm9yIGFiaWxpdHkgdG8gZW50ZXIgZGlyZWN0b3J5IGVudHJ5LCBpZiBubyBzcGFjZSByZXNlcnZlZC4KKwkgKi8KKwlpZiAocmVzYmxrcyA9PSAwICYmCisJICAgIChlcnJvciA9IFhGU19ESVJfQ0FORU5URVIobXAsIHRwLCBkcCwgbGlua19uYW1lLCBsaW5rX25hbWVsZW4pKSkKKwkJZ290byBlcnJvcl9yZXR1cm47CisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBibWFwIGZyZWVsaXN0IHByaW9yIHRvIGNhbGxpbmcgZWl0aGVyCisJICogYm1hcGkgb3IgdGhlIGRpcmVjdG9yeSBjcmVhdGUgY29kZS4KKwkgKi8KKwlYRlNfQk1BUF9JTklUKCZmcmVlX2xpc3QsICZmaXJzdF9ibG9jayk7CisKKwkvKgorCSAqIEFsbG9jYXRlIGFuIGlub2RlIGZvciB0aGUgc3ltbGluay4KKwkgKi8KKwllcnJvciA9IHhmc19kaXJfaWFsbG9jKCZ0cCwgZHAsIFNfSUZMTksgfCAodmFwLT52YV9tb2RlJn5TX0lGTVQpLAorCQkJICAgICAgIDEsIDAsIGNyZWRwLCBwcmlkLCByZXNibGtzID4gMCwgJmlwLCBOVUxMKTsKKwlpZiAoZXJyb3IpIHsKKwkJaWYgKGVycm9yID09IEVOT1NQQykKKwkJCWdvdG8gZXJyb3JfcmV0dXJuOworCQlnb3RvIGVycm9yMTsKKwl9CisJSVRSQUNFKGlwKTsKKworCVZOX0hPTEQoZGlyX3ZwKTsKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIGRwLCBYRlNfSUxPQ0tfRVhDTCk7CisJZHBfam9pbmVkX3RvX3RyYW5zID0gQl9UUlVFOworCisJLyoKKwkgKiBBbHNvIGF0dGFjaCB0aGUgZHF1b3QocykgdG8gaXQsIGlmIGFwcGxpY2FibGUuCisJICovCisJWEZTX1FNX0RRVk9QQ1JFQVRFKG1wLCB0cCwgaXAsIHVkcXAsIGdkcXApOworCisJaWYgKHJlc2Jsa3MpCisJCXJlc2Jsa3MgLT0gWEZTX0lBTExPQ19TUEFDRV9SRVMobXApOworCS8qCisJICogSWYgdGhlIHN5bWxpbmsgd2lsbCBmaXQgaW50byB0aGUgaW5vZGUsIHdyaXRlIGl0IGlubGluZS4KKwkgKi8KKwlpZiAocGF0aGxlbiA8PSBYRlNfSUZPUktfRFNJWkUoaXApKSB7CisJCXhmc19pZGF0YV9yZWFsbG9jKGlwLCBwYXRobGVuLCBYRlNfREFUQV9GT1JLKTsKKwkJbWVtY3B5KGlwLT5pX2RmLmlmX3UxLmlmX2RhdGEsIHRhcmdldF9wYXRoLCBwYXRobGVuKTsKKwkJaXAtPmlfZC5kaV9zaXplID0gcGF0aGxlbjsKKworCQkvKgorCQkgKiBUaGUgaW5vZGUgd2FzIGluaXRpYWxseSBjcmVhdGVkIGluIGV4dGVudCBmb3JtYXQuCisJCSAqLworCQlpcC0+aV9kZi5pZl9mbGFncyAmPSB+KFhGU19JRkVYVEVOVFMgfCBYRlNfSUZCUk9PVCk7CisJCWlwLT5pX2RmLmlmX2ZsYWdzIHw9IFhGU19JRklOTElORTsKKworCQlpcC0+aV9kLmRpX2Zvcm1hdCA9IFhGU19ESU5PREVfRk1UX0xPQ0FMOworCQl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgWEZTX0lMT0dfRERBVEEgfCBYRlNfSUxPR19DT1JFKTsKKworCX0gZWxzZSB7CisJCWZpcnN0X2ZzYiA9IDA7CisJCW5tYXBzID0gU1lNTElOS19NQVBTOworCisJCWVycm9yID0geGZzX2JtYXBpKHRwLCBpcCwgZmlyc3RfZnNiLCBmc19ibG9ja3MsCisJCQkJICBYRlNfQk1BUElfV1JJVEUgfCBYRlNfQk1BUElfTUVUQURBVEEsCisJCQkJICAmZmlyc3RfYmxvY2ssIHJlc2Jsa3MsIG12YWwsICZubWFwcywKKwkJCQkgICZmcmVlX2xpc3QpOworCQlpZiAoZXJyb3IpIHsKKwkJCWdvdG8gZXJyb3IxOworCQl9CisKKwkJaWYgKHJlc2Jsa3MpCisJCQlyZXNibGtzIC09IGZzX2Jsb2NrczsKKwkJaXAtPmlfZC5kaV9zaXplID0gcGF0aGxlbjsKKwkJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgaXAsIFhGU19JTE9HX0NPUkUpOworCisJCWN1cl9jaHVuayA9IHRhcmdldF9wYXRoOworCQlmb3IgKG4gPSAwOyBuIDwgbm1hcHM7IG4rKykgeworCQkJZCA9IFhGU19GU0JfVE9fREFERFIobXAsIG12YWxbbl0uYnJfc3RhcnRibG9jayk7CisJCQlieXRlX2NudCA9IFhGU19GU0JfVE9fQihtcCwgbXZhbFtuXS5icl9ibG9ja2NvdW50KTsKKwkJCWJwID0geGZzX3RyYW5zX2dldF9idWYodHAsIG1wLT5tX2RkZXZfdGFyZ3AsIGQsCisJCQkJCSAgICAgICBCVE9CQihieXRlX2NudCksIDApOworCQkJQVNTRVJUKGJwICYmICFYRlNfQlVGX0dFVEVSUk9SKGJwKSk7CisJCQlpZiAocGF0aGxlbiA8IGJ5dGVfY250KSB7CisJCQkJYnl0ZV9jbnQgPSBwYXRobGVuOworCQkJfQorCQkJcGF0aGxlbiAtPSBieXRlX2NudDsKKworCQkJbWVtY3B5KFhGU19CVUZfUFRSKGJwKSwgY3VyX2NodW5rLCBieXRlX2NudCk7CisJCQljdXJfY2h1bmsgKz0gYnl0ZV9jbnQ7CisKKwkJCXhmc190cmFuc19sb2dfYnVmKHRwLCBicCwgMCwgYnl0ZV9jbnQgLSAxKTsKKwkJfQorCX0KKworCS8qCisJICogQ3JlYXRlIHRoZSBkaXJlY3RvcnkgZW50cnkgZm9yIHRoZSBzeW1saW5rLgorCSAqLworCWVycm9yID0gWEZTX0RJUl9DUkVBVEVOQU1FKG1wLCB0cCwgZHAsIGxpbmtfbmFtZSwgbGlua19uYW1lbGVuLAorCQkJaXAtPmlfaW5vLCAmZmlyc3RfYmxvY2ssICZmcmVlX2xpc3QsIHJlc2Jsa3MpOworCWlmIChlcnJvcikgeworCQlnb3RvIGVycm9yMTsKKwl9CisJeGZzX2ljaGd0aW1lKGRwLCBYRlNfSUNIR1RJTUVfTU9EIHwgWEZTX0lDSEdUSU1FX0NIRyk7CisJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgZHAsIFhGU19JTE9HX0NPUkUpOworCisJLyoKKwkgKiBCdW1wIHRoZSBpbiBtZW1vcnkgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHBhcmVudCBkaXJlY3RvcnkKKwkgKiBzbyB0aGF0IG90aGVyIHByb2Nlc3NlcyBhY2Nlc3NpbmcgaXQgd2lsbCByZWNvZ25pemUgdGhhdAorCSAqIHRoZSBkaXJlY3RvcnkgaGFzIGNoYW5nZWQuCisJICovCisJZHAtPmlfZ2VuKys7CisKKwkvKgorCSAqIElmIHRoaXMgaXMgYSBzeW5jaHJvbm91cyBtb3VudCwgbWFrZSBzdXJlIHRoYXQgdGhlCisJICogc3ltbGluayB0cmFuc2FjdGlvbiBnb2VzIHRvIGRpc2sgYmVmb3JlIHJldHVybmluZyB0bworCSAqIHRoZSB1c2VyLgorCSAqLworCWlmIChtcC0+bV9mbGFncyAmIChYRlNfTU9VTlRfV1NZTkN8WEZTX01PVU5UX0RJUlNZTkMpKSB7CisJCXhmc190cmFuc19zZXRfc3luYyh0cCk7CisJfQorCisJLyoKKwkgKiB4ZnNfdHJhbnNfY29tbWl0IG5vcm1hbGx5IGRlY3JlbWVudHMgdGhlIHZub2RlIHJlZiBjb3VudAorCSAqIHdoZW4gaXQgdW5sb2NrcyB0aGUgaW5vZGUuIFNpbmNlIHdlIHdhbnQgdG8gcmV0dXJuIHRoZQorCSAqIHZub2RlIHRvIHRoZSBjYWxsZXIsIHdlIGJ1bXAgdGhlIHZub2RlIHJlZiBjb3VudCBub3cuCisJICovCisJSUhPTEQoaXApOworCisJZXJyb3IgPSB4ZnNfYm1hcF9maW5pc2goJnRwLCAmZnJlZV9saXN0LCBmaXJzdF9ibG9jaywgJmNvbW1pdHRlZCk7CisJaWYgKGVycm9yKSB7CisJCWdvdG8gZXJyb3IyOworCX0KKwllcnJvciA9IHhmc190cmFuc19jb21taXQodHAsIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMsIE5VTEwpOworCVhGU19RTV9EUVJFTEUobXAsIHVkcXApOworCVhGU19RTV9EUVJFTEUobXAsIGdkcXApOworCisJLyogRmFsbCB0aHJvdWdoIHRvIHN0ZF9yZXR1cm4gd2l0aCBlcnJvciA9IDAgb3IgZXJybm8gZnJvbQorCSAqIHhmc190cmFuc19jb21taXQJKi8KK3N0ZF9yZXR1cm46CisJaWYgKERNX0VWRU5UX0VOQUJMRUQoZGlyX3ZwLT52X3Zmc3AsIFhGU19CSFZUT0koZGlyX2JkcCksCisJCQkgICAgIERNX0VWRU5UX1BPU1RTWU1MSU5LKSkgeworCQkodm9pZCkgWEZTX1NFTkRfTkFNRVNQKG1wLCBETV9FVkVOVF9QT1NUU1lNTElOSywKKwkJCQkJZGlyX3ZwLCBETV9SSUdIVF9OVUxMLAorCQkJCQllcnJvciA/IE5VTEwgOiBYRlNfSVRPVihpcCksCisJCQkJCURNX1JJR0hUX05VTEwsIGxpbmtfbmFtZSwgdGFyZ2V0X3BhdGgsCisJCQkJCTAsIGVycm9yLCAwKTsKKwl9CisKKwlpZiAoIWVycm9yKSB7CisJCXZub2RlX3QgKnZwOworCisJCUFTU0VSVChpcCk7CisJCXZwID0gWEZTX0lUT1YoaXApOworCQkqdnBwID0gdnA7CisJfQorCXJldHVybiBlcnJvcjsKKworIGVycm9yMjoKKwlJUkVMRShpcCk7CisgZXJyb3IxOgorCXhmc19ibWFwX2NhbmNlbCgmZnJlZV9saXN0KTsKKwljYW5jZWxfZmxhZ3MgfD0gWEZTX1RSQU5TX0FCT1JUOworIGVycm9yX3JldHVybjoKKwl4ZnNfdHJhbnNfY2FuY2VsKHRwLCBjYW5jZWxfZmxhZ3MpOworCVhGU19RTV9EUVJFTEUobXAsIHVkcXApOworCVhGU19RTV9EUVJFTEUobXAsIGdkcXApOworCisJaWYgKCFkcF9qb2luZWRfdG9fdHJhbnMgJiYgKGRwICE9IE5VTEwpKSB7CisJCXhmc19pdW5sb2NrKGRwLCBYRlNfSUxPQ0tfRVhDTCk7CisJfQorCisJZ290byBzdGRfcmV0dXJuOworfQorCisKKy8qCisgKiB4ZnNfZmlkMgorICoKKyAqIEEgZmlkIHJvdXRpbmUgdGhhdCB0YWtlcyBhIHBvaW50ZXIgdG8gYSBwcmV2aW91c2x5IGFsbG9jYXRlZAorICogZmlkIHN0cnVjdHVyZSAobGlrZSB4ZnNfZmFzdF9maWQpIGJ1dCB1c2VzIGEgNjQgYml0IGlub2RlIG51bWJlci4KKyAqLworU1RBVElDIGludAoreGZzX2ZpZDIoCisJYmh2X2Rlc2NfdAkqYmRwLAorCWZpZF90CQkqZmlkcCkKK3sKKwl4ZnNfaW5vZGVfdAkqaXA7CisJeGZzX2ZpZDJfdAkqeGZpZDsKKworCXZuX3RyYWNlX2VudHJ5KEJIVl9UT19WTk9ERShiZHApLCBfX0ZVTkNUSU9OX18sCisJCQkJICAgICAgIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKwlBU1NFUlQoc2l6ZW9mKGZpZF90KSA+PSBzaXplb2YoeGZzX2ZpZDJfdCkpOworCisJeGZpZCA9ICh4ZnNfZmlkMl90ICopZmlkcDsKKwlpcCA9IFhGU19CSFZUT0koYmRwKTsKKwl4ZmlkLT5maWRfbGVuID0gc2l6ZW9mKHhmc19maWQyX3QpIC0gc2l6ZW9mKHhmaWQtPmZpZF9sZW4pOworCXhmaWQtPmZpZF9wYWQgPSAwOworCS8qCisJICogdXNlIG1lbWNweSBiZWNhdXNlIHRoZSBpbm9kZSBpcyBhIGxvbmcgbG9uZyBhbmQgdGhlcmUncyBubworCSAqIGFzc3VyYW5jZSB0aGF0IHhmaWQtPmZpZF9pbm8gaXMgcHJvcGVybHkgYWxpZ25lZC4KKwkgKi8KKwltZW1jcHkoJnhmaWQtPmZpZF9pbm8sICZpcC0+aV9pbm8sIHNpemVvZih4ZmlkLT5maWRfaW5vKSk7CisJeGZpZC0+ZmlkX2dlbiA9IGlwLT5pX2QuZGlfZ2VuOworCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIHhmc19yd2xvY2sKKyAqLworaW50Cit4ZnNfcndsb2NrKAorCWJodl9kZXNjX3QJKmJkcCwKKwl2cndsb2NrX3QJbG9ja3R5cGUpCit7CisJeGZzX2lub2RlX3QJKmlwOworCXZub2RlX3QJCSp2cDsKKworCXZwID0gQkhWX1RPX1ZOT0RFKGJkcCk7CisJaWYgKHZwLT52X3R5cGUgPT0gVkRJUikKKwkJcmV0dXJuIDE7CisJaXAgPSBYRlNfQkhWVE9JKGJkcCk7CisJaWYgKGxvY2t0eXBlID09IFZSV0xPQ0tfV1JJVEUpIHsKKwkJeGZzX2lsb2NrKGlwLCBYRlNfSU9MT0NLX0VYQ0wpOworCX0gZWxzZSBpZiAobG9ja3R5cGUgPT0gVlJXTE9DS19UUllfUkVBRCkgeworCQlyZXR1cm4gKHhmc19pbG9ja19ub3dhaXQoaXAsIFhGU19JT0xPQ0tfU0hBUkVEKSk7CisJfSBlbHNlIGlmIChsb2NrdHlwZSA9PSBWUldMT0NLX1RSWV9XUklURSkgeworCQlyZXR1cm4gKHhmc19pbG9ja19ub3dhaXQoaXAsIFhGU19JT0xPQ0tfRVhDTCkpOworCX0gZWxzZSB7CisJCUFTU0VSVCgobG9ja3R5cGUgPT0gVlJXTE9DS19SRUFEKSB8fAorCQkgICAgICAgKGxvY2t0eXBlID09IFZSV0xPQ0tfV1JJVEVfRElSRUNUKSk7CisJCXhmc19pbG9jayhpcCwgWEZTX0lPTE9DS19TSEFSRUQpOworCX0KKworCXJldHVybiAxOworfQorCisKKy8qCisgKiB4ZnNfcnd1bmxvY2sKKyAqLwordm9pZAoreGZzX3J3dW5sb2NrKAorCWJodl9kZXNjX3QJKmJkcCwKKwl2cndsb2NrX3QJbG9ja3R5cGUpCit7CisJeGZzX2lub2RlX3QgICAgICppcDsKKwl2bm9kZV90CQkqdnA7CisKKwl2cCA9IEJIVl9UT19WTk9ERShiZHApOworCWlmICh2cC0+dl90eXBlID09IFZESVIpCisJCXJldHVybjsKKwlpcCA9IFhGU19CSFZUT0koYmRwKTsKKwlpZiAobG9ja3R5cGUgPT0gVlJXTE9DS19XUklURSkgeworCQkvKgorCQkgKiBJbiB0aGUgd3JpdGUgY2FzZSwgd2UgbWF5IGhhdmUgYWRkZWQgYSBuZXcgZW50cnkgdG8KKwkJICogdGhlIHJlZmVyZW5jZSBjYWNoZS4gIFRoaXMgbWlnaHQgc3RvcmUgYSBwb2ludGVyIHRvCisJCSAqIGFuIGlub2RlIHRvIGJlIHJlbGVhc2VkIGluIHRoaXMgaW5vZGUuICBJZiBpdCBpcyB0aGVyZSwKKwkJICogY2xlYXIgdGhlIHBvaW50ZXIgYW5kIHJlbGVhc2UgdGhlIGlub2RlIGFmdGVyIHVubG9ja2luZworCQkgKiB0aGlzIG9uZS4KKwkJICovCisJCXhmc19yZWZjYWNoZV9pdW5sb2NrKGlwLCBYRlNfSU9MT0NLX0VYQ0wpOworCX0gZWxzZSB7CisJCUFTU0VSVCgobG9ja3R5cGUgPT0gVlJXTE9DS19SRUFEKSB8fAorCQkgICAgICAgKGxvY2t0eXBlID09IFZSV0xPQ0tfV1JJVEVfRElSRUNUKSk7CisJCXhmc19pdW5sb2NrKGlwLCBYRlNfSU9MT0NLX1NIQVJFRCk7CisJfQorCXJldHVybjsKK30KKworU1RBVElDIGludAoreGZzX2lub2RlX2ZsdXNoKAorCWJodl9kZXNjX3QJKmJkcCwKKwlpbnQJCWZsYWdzKQoreworCXhmc19pbm9kZV90CSppcDsKKwl4ZnNfbW91bnRfdAkqbXA7CisJeGZzX2lub2RlX2xvZ19pdGVtX3QgKmlpcDsKKwlpbnQJCWVycm9yID0gMDsKKworCWlwID0gWEZTX0JIVlRPSShiZHApOworCW1wID0gaXAtPmlfbW91bnQ7CisJaWlwID0gaXAtPmlfaXRlbXA7CisKKwlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKworCS8qCisJICogQnlwYXNzIGlub2RlcyB3aGljaCBoYXZlIGFscmVhZHkgYmVlbiBjbGVhbmVkIGJ5CisJICogdGhlIGlub2RlIGZsdXNoIGNsdXN0ZXJpbmcgY29kZSBpbnNpZGUgeGZzX2lmbHVzaAorCSAqLworCWlmICgoaXAtPmlfdXBkYXRlX2NvcmUgPT0gMCkgJiYKKwkgICAgKChpaXAgPT0gTlVMTCkgfHwgIShpaXAtPmlsaV9mb3JtYXQuaWxmX2ZpZWxkcyAmIFhGU19JTE9HX0FMTCkpKQorCQlyZXR1cm4gMDsKKworCWlmIChmbGFncyAmIEZMVVNIX0xPRykgeworCQlpZiAoaWlwICYmIGlpcC0+aWxpX2xhc3RfbHNuKSB7CisJCQl4bG9nX3QJCSpsb2cgPSBtcC0+bV9sb2c7CisJCQl4ZnNfbHNuX3QJc3luY19sc247CisJCQlpbnQJCXMsIGxvZ19mbGFncyA9IFhGU19MT0dfRk9SQ0U7CisKKwkJCXMgPSBHUkFOVF9MT0NLKGxvZyk7CisJCQlzeW5jX2xzbiA9IGxvZy0+bF9sYXN0X3N5bmNfbHNuOworCQkJR1JBTlRfVU5MT0NLKGxvZywgcyk7CisKKwkJCWlmICgoWEZTX0xTTl9DTVAoaWlwLT5pbGlfbGFzdF9sc24sIHN5bmNfbHNuKSA8PSAwKSkKKwkJCQlyZXR1cm4gMDsKKworCQkJaWYgKGZsYWdzICYgRkxVU0hfU1lOQykKKwkJCQlsb2dfZmxhZ3MgfD0gWEZTX0xPR19TWU5DOworCQkJcmV0dXJuIHhmc19sb2dfZm9yY2UobXAsIGlpcC0+aWxpX2xhc3RfbHNuLCBsb2dfZmxhZ3MpOworCQl9CisJfQorCisJLyoKKwkgKiBXZSBtYWtlIHRoaXMgbm9uLWJsb2NraW5nIGlmIHRoZSBpbm9kZSBpcyBjb250ZW5kZWQsCisJICogcmV0dXJuIEVBR0FJTiB0byBpbmRpY2F0ZSB0byB0aGUgY2FsbGVyIHRoYXQgdGhleQorCSAqIGRpZCBub3Qgc3VjY2VlZC4gVGhpcyBwcmV2ZW50cyB0aGUgZmx1c2ggcGF0aCBmcm9tCisJICogYmxvY2tpbmcgb24gaW5vZGVzIGluc2lkZSBhbm90aGVyIG9wZXJhdGlvbiByaWdodAorCSAqIG5vdywgdGhleSBnZXQgY2F1Z2h0IGxhdGVyIGJ5IHhmc19zeW5jLgorCSAqLworCWlmIChmbGFncyAmIEZMVVNIX0lOT0RFKSB7CisJCWludAlmbHVzaF9mbGFnczsKKworCQlpZiAoeGZzX2lwaW5jb3VudChpcCkpCisJCQlyZXR1cm4gRUFHQUlOOworCisJCWlmIChmbGFncyAmIEZMVVNIX1NZTkMpIHsKKwkJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisJCQl4ZnNfaWZsb2NrKGlwKTsKKwkJfSBlbHNlIGlmICh4ZnNfaWxvY2tfbm93YWl0KGlwLCBYRlNfSUxPQ0tfU0hBUkVEKSkgeworCQkJaWYgKHhmc19pcGluY291bnQoaXApIHx8ICF4ZnNfaWZsb2NrX25vd2FpdChpcCkpIHsKKwkJCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisJCQkJcmV0dXJuIEVBR0FJTjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJldHVybiBFQUdBSU47CisJCX0KKworCQlpZiAoZmxhZ3MgJiBGTFVTSF9TWU5DKQorCQkJZmx1c2hfZmxhZ3MgPSBYRlNfSUZMVVNIX1NZTkM7CisJCWVsc2UKKwkJCWZsdXNoX2ZsYWdzID0gWEZTX0lGTFVTSF9BU1lOQzsKKworCQllcnJvciA9IHhmc19pZmx1c2goaXAsIGZsdXNoX2ZsYWdzKTsKKwkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19TSEFSRUQpOworCX0KKworCXJldHVybiBlcnJvcjsKK30KKworCitpbnQKK3hmc19zZXRfZG1hdHRycyAoCisJYmh2X2Rlc2NfdAkqYmRwLAorCXVfaW50CQlldm1hc2ssCisJdV9pbnQxNl90CXN0YXRlLAorCWNyZWRfdAkJKmNyZWRwKQoreworCXhmc19pbm9kZV90ICAgICAqaXA7CisJeGZzX3RyYW5zX3QJKnRwOworCXhmc19tb3VudF90CSptcDsKKwlpbnQJCWVycm9yOworCisJaWYgKCFjYXBhYmxlKENBUF9TWVNfQURNSU4pKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVQRVJNKTsKKworCWlwID0gWEZTX0JIVlRPSShiZHApOworCW1wID0gaXAtPmlfbW91bnQ7CisKKwlpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihtcCkpCisJCXJldHVybiBYRlNfRVJST1IoRUlPKTsKKworCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfU0VUX0RNQVRUUlMpOworCWVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsIFhGU19JQ0hBTkdFX0xPR19SRVMgKG1wKSwgMCwgMCwgMCk7CisJaWYgKGVycm9yKSB7CisJCXhmc190cmFuc19jYW5jZWwodHAsIDApOworCQlyZXR1cm4gZXJyb3I7CisJfQorCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCXhmc190cmFuc19pam9pbih0cCwgaXAsIFhGU19JTE9DS19FWENMKTsKKworCWlwLT5pX2lvY29yZS5pb19kbWV2bWFzayA9IGlwLT5pX2QuZGlfZG1ldm1hc2sgPSBldm1hc2s7CisJaXAtPmlfaW9jb3JlLmlvX2Rtc3RhdGUgID0gaXAtPmlfZC5kaV9kbXN0YXRlICA9IHN0YXRlOworCisJeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgaXAsIFhGU19JTE9HX0NPUkUpOworCUlIT0xEKGlwKTsKKwllcnJvciA9IHhmc190cmFuc19jb21taXQodHAsIDAsIE5VTEwpOworCisJcmV0dXJuIGVycm9yOworfQorCisKKy8qCisgKiB4ZnNfcmVjbGFpbQorICovCitTVEFUSUMgaW50Cit4ZnNfcmVjbGFpbSgKKwliaHZfZGVzY190CSpiZHApCit7CisJeGZzX2lub2RlX3QJKmlwOworCXZub2RlX3QJCSp2cDsKKworCXZwID0gQkhWX1RPX1ZOT0RFKGJkcCk7CisJaXAgPSBYRlNfQkhWVE9JKGJkcCk7CisKKwl2bl90cmFjZV9lbnRyeSh2cCwgX19GVU5DVElPTl9fLCAoaW5zdF90ICopX19yZXR1cm5fYWRkcmVzcyk7CisKKwlBU1NFUlQoIVZOX01BUFBFRCh2cCkpOworCisJLyogYmFkIGlub2RlLCBnZXQgb3V0IGhlcmUgQVNBUCAqLworCWlmIChWTl9CQUQodnApKSB7CisJCXhmc19pcmVjbGFpbShpcCk7CisJCXJldHVybiAwOworCX0KKworCWlmICgoaXAtPmlfZC5kaV9tb2RlICYgU19JRk1UKSA9PSBTX0lGUkVHKSB7CisJCWlmIChpcC0+aV9kLmRpX3NpemUgPiAwKSB7CisJCQkvKgorCQkJICogRmx1c2ggYW5kIGludmFsaWRhdGUgYW55IGRhdGEgbGVmdCBhcm91bmQgdGhhdCBpcworCQkJICogYSBwYXJ0IG9mIHRoaXMgZmlsZS4KKwkJCSAqCisJCQkgKiBHZXQgdGhlIGlub2RlJ3MgaS9vIGxvY2sgc28gdGhhdCBidWZmZXJzIGFyZSBwdXNoZWQKKwkJCSAqIG91dCB3aGlsZSBob2xkaW5nIHRoZSBwcm9wZXIgbG9jay4gIFdlIGNhbid0IGhvbGQKKwkJCSAqIHRoZSBpbm9kZSBsb2NrIGhlcmUgc2luY2UgZmx1c2hpbmcgb3V0IGJ1ZmZlcnMgbWF5CisJCQkgKiBjYXVzZSB1cyB0byB0cnkgdG8gZ2V0IHRoZSBsb2NrIGluIHhmc19zdHJhdGVneSgpLgorCQkJICoKKwkJCSAqIFdlIGRvbid0IGhhdmUgdG8gY2FsbCByZW1hcGYoKSBoZXJlLCBiZWNhdXNlIHRoZXJlCisJCQkgKiBjYW5ub3QgYmUgYW55IG1hcHBlZCBmaWxlIHJlZmVyZW5jZXMgdG8gdGhpcyB2bm9kZQorCQkJICogc2luY2UgaXQgaXMgYmVpbmcgcmVjbGFpbWVkLgorCQkJICovCisJCQl4ZnNfaWxvY2soaXAsIFhGU19JT0xPQ0tfRVhDTCk7CisKKwkJCS8qCisJCQkgKiBJZiB3ZSBoaXQgYW4gSU8gZXJyb3IsIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlCisJCQkgKiBidWZmZXIgYW5kIHBhZ2UgY2FjaGVzIG9mIGZpbGUgZGF0YSBmb3IKKwkJCSAqIHRoZSBmaWxlIGFyZSB0b3NzZWQgYXdheS4gV2UgZG9uJ3Qgd2FudCB0byB1c2UKKwkJCSAqIFZPUF9GTFVTSElOVkFMX1BBR0VTIGhlcmUgYmVjYXVzZSB3ZSBkb24ndCB3YW50IGRpcnR5CisJCQkgKiBwYWdlcyB0byBzdGF5IGF0dGFjaGVkIHRvIHRoZSB2bm9kZSwgYnV0IGJlCisJCQkgKiBtYXJrZWQgUF9CQUQuIHBkZmx1c2gvdm5vZGVfcGFnZWJhZAorCQkJICogaGF0ZXMgdGhhdC4KKwkJCSAqLworCQkJaWYgKCFYRlNfRk9SQ0VEX1NIVVRET1dOKGlwLT5pX21vdW50KSkgeworCQkJCVZPUF9GTFVTSElOVkFMX1BBR0VTKHZwLCAwLCAtMSwgRklfTk9ORSk7CisJCQl9IGVsc2UgeworCQkJCVZPUF9UT1NTX1BBR0VTKHZwLCAwLCAtMSwgRklfTk9ORSk7CisJCQl9CisKKwkJCUFTU0VSVChWTl9DQUNIRUQodnApID09IDApOworCQkJQVNTRVJUKFhGU19GT1JDRURfU0hVVERPV04oaXAtPmlfbW91bnQpIHx8CisJCQkgICAgICAgaXAtPmlfZGVsYXllZF9ibGtzID09IDApOworCQkJeGZzX2l1bmxvY2soaXAsIFhGU19JT0xPQ0tfRVhDTCk7CisJCX0gZWxzZSBpZiAoWEZTX0ZPUkNFRF9TSFVURE9XTihpcC0+aV9tb3VudCkpIHsKKwkJCS8qCisJCQkgKiBkaV9zaXplIGZpZWxkIG1heSBub3QgYmUgcXVpdGUgYWNjdXJhdGUgaWYgd2UncmUKKwkJCSAqIHNodXR0aW5nIGRvd24uCisJCQkgKi8KKwkJCVZPUF9UT1NTX1BBR0VTKHZwLCAwLCAtMSwgRklfTk9ORSk7CisJCQlBU1NFUlQoVk5fQ0FDSEVEKHZwKSA9PSAwKTsKKwkJfQorCX0KKworCS8qIElmIHdlIGhhdmUgbm90aGluZyB0byBmbHVzaCB3aXRoIHRoaXMgaW5vZGUgdGhlbiBjb21wbGV0ZSB0aGUKKwkgKiB0ZWFyZG93biBub3csIG90aGVyd2lzZSBicmVhayB0aGUgbGluayBiZXR3ZWVuIHRoZSB4ZnMgaW5vZGUKKwkgKiBhbmQgdGhlIGxpbnV4IGlub2RlIGFuZCBjbGVhbiB1cCB0aGUgeGZzIGlub2RlIGxhdGVyLiBUaGlzCisJICogYXZvaWRzIGZsdXNoaW5nIHRoZSBpbm9kZSB0byBkaXNrIGR1cmluZyB0aGUgZGVsZXRlIG9wZXJhdGlvbgorCSAqIGl0c2VsZi4KKwkgKi8KKwlpZiAoIWlwLT5pX3VwZGF0ZV9jb3JlICYmIChpcC0+aV9pdGVtcCA9PSBOVUxMKSkgeworCQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwkJeGZzX2lmbG9jayhpcCk7CisJCXJldHVybiB4ZnNfZmluaXNoX3JlY2xhaW0oaXAsIDEsIFhGU19JRkxVU0hfREVMV1JJX0VMU0VfU1lOQyk7CisJfSBlbHNlIHsKKwkJeGZzX21vdW50X3QJKm1wID0gaXAtPmlfbW91bnQ7CisKKwkJLyogUHJvdGVjdCBzeW5jIGZyb20gdXMgKi8KKwkJWEZTX01PVU5UX0lMT0NLKG1wKTsKKwkJdm5fYmh2X3JlbW92ZShWTl9CSFZfSEVBRCh2cCksIFhGU19JVE9CSFYoaXApKTsKKwkJbGlzdF9hZGRfdGFpbCgmaXAtPmlfcmVjbGFpbSwgJm1wLT5tX2RlbF9pbm9kZXMpOworCQlpcC0+aV9mbGFncyB8PSBYRlNfSVJFQ0xBSU1BQkxFOworCQlYRlNfTU9VTlRfSVVOTE9DSyhtcCk7CisJfQorCXJldHVybiAwOworfQorCitpbnQKK3hmc19maW5pc2hfcmVjbGFpbSgKKwl4ZnNfaW5vZGVfdAkqaXAsCisJaW50CQlsb2NrZWQsCisJaW50CQlzeW5jX21vZGUpCit7CisJeGZzX2loYXNoX3QJKmloID0gaXAtPmlfaGFzaDsKKwl2bm9kZV90CQkqdnAgPSBYRlNfSVRPVl9OVUxMKGlwKTsKKwlpbnQJCWVycm9yOworCisJaWYgKHZwICYmIFZOX0JBRCh2cCkpCisJCWdvdG8gcmVjbGFpbTsKKworCS8qIFRoZSBoYXNoIGxvY2sgaGVyZSBwcm90ZWN0cyBhIHRocmVhZCBpbiB4ZnNfaWdldF9jb3JlIGZyb20KKwkgKiByYWNpbmcgd2l0aCB1cyBvbiBsaW5raW5nIHRoZSBpbm9kZSBiYWNrIHdpdGggYSB2bm9kZS4KKwkgKiBPbmNlIHdlIGhhdmUgdGhlIFhGU19JUkVDTEFJTSBmbGFnIHNldCBpdCB3aWxsIG5vdCB0b3VjaAorCSAqIHVzLgorCSAqLworCXdyaXRlX2xvY2soJmloLT5paF9sb2NrKTsKKwlpZiAoKGlwLT5pX2ZsYWdzICYgWEZTX0lSRUNMQUlNKSB8fAorCSAgICAoIShpcC0+aV9mbGFncyAmIFhGU19JUkVDTEFJTUFCTEUpICYmIHZwID09IE5VTEwpKSB7CisJCXdyaXRlX3VubG9jaygmaWgtPmloX2xvY2spOworCQlpZiAobG9ja2VkKSB7CisJCQl4ZnNfaWZ1bmxvY2soaXApOworCQkJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwkJfQorCQlyZXR1cm4oMSk7CisJfQorCWlwLT5pX2ZsYWdzIHw9IFhGU19JUkVDTEFJTTsKKwl3cml0ZV91bmxvY2soJmloLT5paF9sb2NrKTsKKworCS8qCisJICogSWYgdGhlIGlub2RlIGlzIHN0aWxsIGRpcnR5LCB0aGVuIGZsdXNoIGl0IG91dC4gIElmIHRoZSBpbm9kZQorCSAqIGlzIG5vdCBpbiB0aGUgQUlMLCB0aGVuIGl0IHdpbGwgYmUgT0sgdG8gZmx1c2ggaXQgZGVsd3JpIGFzCisJICogbG9uZyBhcyB4ZnNfaWZsdXNoKCkgZG9lcyBub3Qga2VlcCBhbnkgcmVmZXJlbmNlcyB0byB0aGUgaW5vZGUuCisJICogV2UgbGVhdmUgdGhhdCBkZWNpc2lvbiB1cCB0byB4ZnNfaWZsdXNoKCkgc2luY2UgaXQgaGFzIHRoZQorCSAqIGtub3dsZWRnZSBvZiB3aGV0aGVyIGl0J3MgT0sgdG8gc2ltcGx5IGRvIGEgZGVsd3JpIGZsdXNoIG9mCisJICogdGhlIGlub2RlIG9yIHdoZXRoZXIgd2UgbmVlZCB0byB3YWl0IHVudGlsIHRoZSBpbm9kZSBpcworCSAqIHB1bGxlZCBmcm9tIHRoZSBBSUwuCisJICogV2UgZ2V0IHRoZSBmbHVzaCBsb2NrIHJlZ2FyZGxlc3MsIHRob3VnaCwganVzdCB0byBtYWtlIHN1cmUKKwkgKiB3ZSBkb24ndCBmcmVlIGl0IHdoaWxlIGl0IGlzIGJlaW5nIGZsdXNoZWQuCisJICovCisJaWYgKCFYRlNfRk9SQ0VEX1NIVVRET1dOKGlwLT5pX21vdW50KSkgeworCQlpZiAoIWxvY2tlZCkgeworCQkJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCQl4ZnNfaWZsb2NrKGlwKTsKKwkJfQorCisJCWlmIChpcC0+aV91cGRhdGVfY29yZSB8fAorCQkgICAgKChpcC0+aV9pdGVtcCAhPSBOVUxMKSAmJgorCQkgICAgIChpcC0+aV9pdGVtcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzICE9IDApKSkgeworCQkJZXJyb3IgPSB4ZnNfaWZsdXNoKGlwLCBzeW5jX21vZGUpOworCQkJLyoKKwkJCSAqIElmIHdlIGhpdCBhbiBlcnJvciwgdHlwaWNhbGx5IGJlY2F1c2Ugb2YgZmlsZXN5c3RlbQorCQkJICogc2h1dGRvd24sIHdlIGRvbid0IG5lZWQgdG8gbGV0IHZuX3JlY2xhaW0gdG8ga25vdworCQkJICogYmVjYXVzZSB3ZSdyZSBnb25uYSByZWNsYWltIHRoZSBpbm9kZSBhbnl3YXkuCisJCQkgKi8KKwkJCWlmIChlcnJvcikgeworCQkJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCQkJZ290byByZWNsYWltOworCQkJfQorCQkJeGZzX2lmbG9jayhpcCk7IC8qIHN5bmNocm9uaXplIHdpdGggeGZzX2lmbHVzaF9kb25lICovCisJCX0KKworCQlBU1NFUlQoaXAtPmlfdXBkYXRlX2NvcmUgPT0gMCk7CisJCUFTU0VSVChpcC0+aV9pdGVtcCA9PSBOVUxMIHx8CisJCSAgICAgICBpcC0+aV9pdGVtcC0+aWxpX2Zvcm1hdC5pbGZfZmllbGRzID09IDApOworCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCX0gZWxzZSBpZiAobG9ja2VkKSB7CisJCS8qCisJCSAqIFdlIGFyZSBub3QgaW50ZXJlc3RlZCBpbiBkb2luZyBhbiBpZmx1c2ggaWYgd2UncmUKKwkJICogaW4gdGhlIHByb2Nlc3Mgb2Ygc2h1dHRpbmcgZG93biB0aGUgZmlsZXN5c3RlbSBmb3JjaWJseS4KKwkJICogU28sIGp1c3QgcmVjbGFpbSB0aGUgaW5vZGUuCisJCSAqLworCQl4ZnNfaWZ1bmxvY2soaXApOworCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCX0KKworIHJlY2xhaW06CisJeGZzX2lyZWNsYWltKGlwKTsKKwlyZXR1cm4gMDsKK30KKworaW50Cit4ZnNfZmluaXNoX3JlY2xhaW1fYWxsKHhmc19tb3VudF90ICptcCwgaW50IG5vYmxvY2spCit7CisJaW50CQlwdXJnZWQ7CisJeGZzX2lub2RlX3QJKmlwLCAqbjsKKwlpbnQJCWRvbmUgPSAwOworCisJd2hpbGUgKCFkb25lKSB7CisJCXB1cmdlZCA9IDA7CisJCVhGU19NT1VOVF9JTE9DSyhtcCk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpcCwgbiwgJm1wLT5tX2RlbF9pbm9kZXMsIGlfcmVjbGFpbSkgeworCQkJaWYgKG5vYmxvY2spIHsKKwkJCQlpZiAoeGZzX2lsb2NrX25vd2FpdChpcCwgWEZTX0lMT0NLX0VYQ0wpID09IDApCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICh4ZnNfaXBpbmNvdW50KGlwKSB8fAorCQkJCSAgICAheGZzX2lmbG9ja19ub3dhaXQoaXApKSB7CisJCQkJCXhmc19pdW5sb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKwkJCVhGU19NT1VOVF9JVU5MT0NLKG1wKTsKKwkJCXhmc19maW5pc2hfcmVjbGFpbShpcCwgbm9ibG9jaywKKwkJCQlYRlNfSUZMVVNIX0RFTFdSSV9FTFNFX0FTWU5DKTsKKwkJCXB1cmdlZCA9IDE7CisJCQlicmVhazsKKwkJfQorCisJCWRvbmUgPSAhcHVyZ2VkOworCX0KKworCVhGU19NT1VOVF9JVU5MT0NLKG1wKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHhmc19hbGxvY19maWxlX3NwYWNlKCkKKyAqICAgICAgVGhpcyByb3V0aW5lIGFsbG9jYXRlcyBkaXNrIHNwYWNlIGZvciB0aGUgZ2l2ZW4gZmlsZS4KKyAqCisgKglJZiBhbGxvY190eXBlID09IDAsIHRoaXMgcmVxdWVzdCBpcyBmb3IgYW4gQUxMT0NTUCB0eXBlCisgKglyZXF1ZXN0IHdoaWNoIHdpbGwgY2hhbmdlIHRoZSBmaWxlIHNpemUuICBJbiB0aGlzIGNhc2UsIG5vCisgKglETUFQSSBldmVudCB3aWxsIGJlIGdlbmVyYXRlZCBieSB0aGUgY2FsbC4gIEEgVFJVTkNBVEUgZXZlbnQKKyAqCXdpbGwgYmUgZ2VuZXJhdGVkIGxhdGVyIGJ5IHhmc19zZXRhdHRyLgorICoKKyAqCUlmIGFsbG9jX3R5cGUgIT0gMCwgdGhpcyByZXF1ZXN0IGlzIGZvciBhIFJFU1ZTUCB0eXBlCisgKglyZXF1ZXN0LCBhbmQgYSBETUFQSSBETV9FVkVOVF9XUklURSB3aWxsIGJlIGdlbmVyYXRlZCBpZiB0aGUKKyAqCWxvd2VyIGJsb2NrIGJvdW5kYXJ5IGJ5dGUgYWRkcmVzcyBpcyBsZXNzIHRoYW4gdGhlIGZpbGUncworICoJbGVuZ3RoLgorICoKKyAqIFJFVFVSTlM6CisgKiAgICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gb24gZXJyb3IKKyAqCisgKi8KK2ludAoreGZzX2FsbG9jX2ZpbGVfc3BhY2UoCisJeGZzX2lub2RlX3QJCSppcCwKKwl4ZnNfb2ZmX3QJCW9mZnNldCwKKwl4ZnNfb2ZmX3QJCWxlbiwKKwlpbnQJCQlhbGxvY190eXBlLAorCWludAkJCWF0dHJfZmxhZ3MpCit7CisJeGZzX2ZpbGJsa3NfdAkJYWxsb2NhdGVkX2ZzYjsKKwl4ZnNfZmlsYmxrc190CQlhbGxvY2F0ZXNpemVfZnNiOworCWludAkJCWNvbW1pdHRlZDsKKwl4ZnNfb2ZmX3QJCWNvdW50OworCXhmc19maWxibGtzX3QJCWRhdGFibG9ja3M7CisJaW50CQkJZXJyb3I7CisJeGZzX2ZzYmxvY2tfdAkJZmlyc3Rmc2I7CisJeGZzX2JtYXBfZnJlZV90CQlmcmVlX2xpc3Q7CisJeGZzX2JtYnRfaXJlY190CQkqaW1hcHA7CisJeGZzX2JtYnRfaXJlY190CQlpbWFwc1sxXTsKKwl4ZnNfbW91bnRfdAkJKm1wOworCWludAkJCW51bXJ0ZXh0ZW50czsKKwlpbnQJCQlyZWNjb3VudDsKKwl1aW50CQkJcmVzYmxrczsKKwlpbnQJCQlydDsKKwlpbnQJCQlydGV4dHNpemU7CisJeGZzX2ZpbGVvZmZfdAkJc3RhcnRvZmZzZXRfZnNiOworCXhmc190cmFuc190CQkqdHA7CisJaW50CQkJeGZzX2JtYXBpX2ZsYWdzOworCisJdm5fdHJhY2VfZW50cnkoWEZTX0lUT1YoaXApLCBfX0ZVTkNUSU9OX18sIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKwltcCA9IGlwLT5pX21vdW50OworCisJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVJTyk7CisKKwkvKgorCSAqIGRldGVybWluZSBpZiB0aGlzIGlzIGEgcmVhbHRpbWUgZmlsZQorCSAqLworCWlmICgocnQgPSBYRlNfSVNfUkVBTFRJTUVfSU5PREUoaXApKSAhPSAwKSB7CisJCWlmIChpcC0+aV9kLmRpX2V4dHNpemUpCisJCQlydGV4dHNpemUgPSBpcC0+aV9kLmRpX2V4dHNpemU7CisJCWVsc2UKKwkJCXJ0ZXh0c2l6ZSA9IG1wLT5tX3NiLnNiX3JleHRzaXplOworCX0gZWxzZQorCQlydGV4dHNpemUgPSAwOworCisJaWYgKChlcnJvciA9IFhGU19RTV9EUUFUVEFDSChtcCwgaXAsIDApKSkKKwkJcmV0dXJuIGVycm9yOworCisJaWYgKGxlbiA8PSAwKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisKKwljb3VudCA9IGxlbjsKKwllcnJvciA9IDA7CisJaW1hcHAgPSAmaW1hcHNbMF07CisJcmVjY291bnQgPSAxOworCXhmc19ibWFwaV9mbGFncyA9IFhGU19CTUFQSV9XUklURSB8IChhbGxvY190eXBlID8gWEZTX0JNQVBJX1BSRUFMTE9DIDogMCk7CisJc3RhcnRvZmZzZXRfZnNiCT0gWEZTX0JfVE9fRlNCVChtcCwgb2Zmc2V0KTsKKwlhbGxvY2F0ZXNpemVfZnNiID0gWEZTX0JfVE9fRlNCKG1wLCBjb3VudCk7CisKKwkvKglHZW5lcmF0ZSBhIERNQVBJIGV2ZW50IGlmIG5lZWRlZC4JKi8KKwlpZiAoYWxsb2NfdHlwZSAhPSAwICYmIG9mZnNldCA8IGlwLT5pX2QuZGlfc2l6ZSAmJgorCQkJKGF0dHJfZmxhZ3MmQVRUUl9ETUkpID09IDAgICYmCisJCQlETV9FVkVOVF9FTkFCTEVEKFhGU19NVE9WRlMobXApLCBpcCwgRE1fRVZFTlRfV1JJVEUpKSB7CisJCXhmc19vZmZfdCAgICAgICAgICAgZW5kX2RtaV9vZmZzZXQ7CisKKwkJZW5kX2RtaV9vZmZzZXQgPSBvZmZzZXQrbGVuOworCQlpZiAoZW5kX2RtaV9vZmZzZXQgPiBpcC0+aV9kLmRpX3NpemUpCisJCQllbmRfZG1pX29mZnNldCA9IGlwLT5pX2QuZGlfc2l6ZTsKKwkJZXJyb3IgPSBYRlNfU0VORF9EQVRBKG1wLCBETV9FVkVOVF9XUklURSwgWEZTX0lUT1YoaXApLAorCQkJb2Zmc2V0LCBlbmRfZG1pX29mZnNldCAtIG9mZnNldCwKKwkJCTAsIE5VTEwpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4oZXJyb3IpOworCX0KKworCS8qCisJICogYWxsb2NhdGUgZmlsZSBzcGFjZSB1bnRpbCBkb25lIG9yIHVudGlsIHRoZXJlIGlzIGFuIGVycm9yCisJICovCityZXRyeToKKwl3aGlsZSAoYWxsb2NhdGVzaXplX2ZzYiAmJiAhZXJyb3IpIHsKKwkJLyoKKwkJICogZGV0ZXJtaW5lIGlmIHJlc2VydmluZyBzcGFjZSBvbgorCQkgKiB0aGUgZGF0YSBvciByZWFsdGltZSBwYXJ0aXRpb24uCisJCSAqLworCQlpZiAocnQpIHsKKwkJCXhmc19maWxlb2ZmX3QgcywgZTsKKworCQkJcyA9IHN0YXJ0b2Zmc2V0X2ZzYjsKKwkJCWRvX2RpdihzLCBydGV4dHNpemUpOworCQkJcyAqPSBydGV4dHNpemU7CisJCQllID0gcm91bmR1cF82NChzdGFydG9mZnNldF9mc2IgKyBhbGxvY2F0ZXNpemVfZnNiLAorCQkJCXJ0ZXh0c2l6ZSk7CisJCQludW1ydGV4dGVudHMgPSAoaW50KShlIC0gcykgLyBtcC0+bV9zYi5zYl9yZXh0c2l6ZTsKKwkJCWRhdGFibG9ja3MgPSAwOworCQl9IGVsc2UgeworCQkJZGF0YWJsb2NrcyA9IGFsbG9jYXRlc2l6ZV9mc2I7CisJCQludW1ydGV4dGVudHMgPSAwOworCQl9CisKKwkJLyoKKwkJICogYWxsb2NhdGUgYW5kIHNldHVwIHRoZSB0cmFuc2FjdGlvbgorCQkgKi8KKwkJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19ESU9TVFJBVCk7CisJCXJlc2Jsa3MgPSBYRlNfRElPU1RSQVRfU1BBQ0VfUkVTKG1wLCBkYXRhYmxvY2tzKTsKKwkJZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwKKwkJCQkJICByZXNibGtzLAorCQkJCQkgIFhGU19XUklURV9MT0dfUkVTKG1wKSwKKwkJCQkJICBudW1ydGV4dGVudHMsCisJCQkJCSAgWEZTX1RSQU5TX1BFUk1fTE9HX1JFUywKKwkJCQkJICBYRlNfV1JJVEVfTE9HX0NPVU5UKTsKKworCQkvKgorCQkgKiBjaGVjayBmb3IgcnVubmluZyBvdXQgb2Ygc3BhY2UKKwkJICovCisJCWlmIChlcnJvcikgeworCQkJLyoKKwkJCSAqIEZyZWUgdGhlIHRyYW5zYWN0aW9uIHN0cnVjdHVyZS4KKwkJCSAqLworCQkJQVNTRVJUKGVycm9yID09IEVOT1NQQyB8fCBYRlNfRk9SQ0VEX1NIVVRET1dOKG1wKSk7CisJCQl4ZnNfdHJhbnNfY2FuY2VsKHRwLCAwKTsKKwkJCWJyZWFrOworCQl9CisJCXhmc19pbG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQllcnJvciA9IFhGU19UUkFOU19SRVNFUlZFX1FVT1RBX0JZRFFVT1RTKG1wLCB0cCwKKwkJCQlpcC0+aV91ZHF1b3QsIGlwLT5pX2dkcXVvdCwgcmVzYmxrcywgMCwgcnQgPworCQkJCVhGU19RTU9QVF9SRVNfUlRCTEtTIDogWEZTX1FNT1BUX1JFU19SRUdCTEtTKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBlcnJvcjE7CisKKwkJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQl4ZnNfdHJhbnNfaWhvbGQodHAsIGlwKTsKKworCQkvKgorCQkgKiBpc3N1ZSB0aGUgYm1hcGkoKSBjYWxsIHRvIGFsbG9jYXRlIHRoZSBibG9ja3MKKwkJICovCisJCVhGU19CTUFQX0lOSVQoJmZyZWVfbGlzdCwgJmZpcnN0ZnNiKTsKKwkJZXJyb3IgPSB4ZnNfYm1hcGkodHAsIGlwLCBzdGFydG9mZnNldF9mc2IsCisJCQkJICBhbGxvY2F0ZXNpemVfZnNiLCB4ZnNfYm1hcGlfZmxhZ3MsCisJCQkJICAmZmlyc3Rmc2IsIDAsIGltYXBwLCAmcmVjY291bnQsCisJCQkJICAmZnJlZV9saXN0KTsKKwkJaWYgKGVycm9yKSB7CisJCQlnb3RvIGVycm9yMDsKKwkJfQorCisJCS8qCisJCSAqIGNvbXBsZXRlIHRoZSB0cmFuc2FjdGlvbgorCQkgKi8KKwkJZXJyb3IgPSB4ZnNfYm1hcF9maW5pc2goJnRwLCAmZnJlZV9saXN0LCBmaXJzdGZzYiwgJmNvbW1pdHRlZCk7CisJCWlmIChlcnJvcikgeworCQkJZ290byBlcnJvcjA7CisJCX0KKworCQllcnJvciA9IHhmc190cmFuc19jb21taXQodHAsIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMsIE5VTEwpOworCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCQlpZiAoZXJyb3IpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJYWxsb2NhdGVkX2ZzYiA9IGltYXBwLT5icl9ibG9ja2NvdW50OworCisJCWlmIChyZWNjb3VudCA9PSAwKSB7CisJCQllcnJvciA9IFhGU19FUlJPUihFTk9TUEMpOworCQkJYnJlYWs7CisJCX0KKworCQlzdGFydG9mZnNldF9mc2IgKz0gYWxsb2NhdGVkX2ZzYjsKKwkJYWxsb2NhdGVzaXplX2ZzYiAtPSBhbGxvY2F0ZWRfZnNiOworCX0KK2RtYXBpX2Vub3NwY19jaGVjazoKKwlpZiAoZXJyb3IgPT0gRU5PU1BDICYmIChhdHRyX2ZsYWdzJkFUVFJfRE1JKSA9PSAwICYmCisJICAgIERNX0VWRU5UX0VOQUJMRUQoWEZTX01UT1ZGUyhtcCksIGlwLCBETV9FVkVOVF9OT1NQQUNFKSkgeworCisJCWVycm9yID0gWEZTX1NFTkRfTkFNRVNQKG1wLCBETV9FVkVOVF9OT1NQQUNFLAorCQkJCVhGU19JVE9WKGlwKSwgRE1fUklHSFRfTlVMTCwKKwkJCQlYRlNfSVRPVihpcCksIERNX1JJR0hUX05VTEwsCisJCQkJTlVMTCwgTlVMTCwgMCwgMCwgMCk7IC8qIERlbGF5IGZsYWcgaW50ZW50aW9uYWxseSB1bnVzZWQgKi8KKwkJaWYgKGVycm9yID09IDApCisJCQlnb3RvIHJldHJ5OwkvKiBNYXliZSBETUFQSSBhcHAuIGhhcyBtYWRlIHNwYWNlICovCisJCS8qIGVsc2UgZmFsbCB0aHJvdWdoIHdpdGggZXJyb3IgZnJvbSBYRlNfU0VORF9EQVRBICovCisJfQorCisJcmV0dXJuIGVycm9yOworCisgZXJyb3IwOgorCXhmc19ibWFwX2NhbmNlbCgmZnJlZV9saXN0KTsKKyBlcnJvcjE6CisJeGZzX3RyYW5zX2NhbmNlbCh0cCwgWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUyB8IFhGU19UUkFOU19BQk9SVCk7CisJeGZzX2l1bmxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKKwlnb3RvIGRtYXBpX2Vub3NwY19jaGVjazsKK30KKworLyoKKyAqIFplcm8gZmlsZSBieXRlcyBiZXR3ZWVuIHN0YXJ0b2ZmIGFuZCBlbmRvZmYgaW5jbHVzaXZlLgorICogVGhlIGlvbG9jayBpcyBoZWxkIGV4Y2x1c2l2ZSBhbmQgbm8gYmxvY2tzIGFyZSBidWZmZXJlZC4KKyAqLworU1RBVElDIGludAoreGZzX3plcm9fcmVtYWluaW5nX2J5dGVzKAorCXhmc19pbm9kZV90CQkqaXAsCisJeGZzX29mZl90CQlzdGFydG9mZiwKKwl4ZnNfb2ZmX3QJCWVuZG9mZikKK3sKKwl4ZnNfYm1idF9pcmVjX3QJCWltYXA7CisJeGZzX2ZpbGVvZmZfdAkJb2Zmc2V0X2ZzYjsKKwl4ZnNfb2ZmX3QJCWxhc3RvZmZzZXQ7CisJeGZzX29mZl90CQlvZmZzZXQ7CisJeGZzX2J1Zl90CQkqYnA7CisJeGZzX21vdW50X3QJCSptcCA9IGlwLT5pX21vdW50OworCWludAkJCW5pbWFwOworCWludAkJCWVycm9yID0gMDsKKworCWJwID0geGZzX2J1Zl9nZXRfbm9hZGRyKG1wLT5tX3NiLnNiX2Jsb2Nrc2l6ZSwKKwkJCQlpcC0+aV9kLmRpX2ZsYWdzICYgWEZTX0RJRkxBR19SRUFMVElNRSA/CisJCQkJbXAtPm1fcnRkZXZfdGFyZ3AgOiBtcC0+bV9kZGV2X3RhcmdwKTsKKworCWZvciAob2Zmc2V0ID0gc3RhcnRvZmY7IG9mZnNldCA8PSBlbmRvZmY7IG9mZnNldCA9IGxhc3RvZmZzZXQgKyAxKSB7CisJCW9mZnNldF9mc2IgPSBYRlNfQl9UT19GU0JUKG1wLCBvZmZzZXQpOworCQluaW1hcCA9IDE7CisJCWVycm9yID0geGZzX2JtYXBpKE5VTEwsIGlwLCBvZmZzZXRfZnNiLCAxLCAwLCBOVUxMLCAwLCAmaW1hcCwKKwkJCSZuaW1hcCwgTlVMTCk7CisJCWlmIChlcnJvciB8fCBuaW1hcCA8IDEpCisJCQlicmVhazsKKwkJQVNTRVJUKGltYXAuYnJfYmxvY2tjb3VudCA+PSAxKTsKKwkJQVNTRVJUKGltYXAuYnJfc3RhcnRvZmYgPT0gb2Zmc2V0X2ZzYik7CisJCWxhc3RvZmZzZXQgPSBYRlNfRlNCX1RPX0IobXAsIGltYXAuYnJfc3RhcnRvZmYgKyAxKSAtIDE7CisJCWlmIChsYXN0b2Zmc2V0ID4gZW5kb2ZmKQorCQkJbGFzdG9mZnNldCA9IGVuZG9mZjsKKwkJaWYgKGltYXAuYnJfc3RhcnRibG9jayA9PSBIT0xFU1RBUlRCTE9DSykKKwkJCWNvbnRpbnVlOworCQlBU1NFUlQoaW1hcC5icl9zdGFydGJsb2NrICE9IERFTEFZU1RBUlRCTE9DSyk7CisJCWlmIChpbWFwLmJyX3N0YXRlID09IFhGU19FWFRfVU5XUklUVEVOKQorCQkJY29udGludWU7CisJCVhGU19CVUZfVU5ET05FKGJwKTsKKwkJWEZTX0JVRl9VTldSSVRFKGJwKTsKKwkJWEZTX0JVRl9SRUFEKGJwKTsKKwkJWEZTX0JVRl9TRVRfQUREUihicCwgWEZTX0ZTQl9UT19EQihpcCwgaW1hcC5icl9zdGFydGJsb2NrKSk7CisJCXhmc2Jkc3RyYXQobXAsIGJwKTsKKwkJaWYgKChlcnJvciA9IHhmc19pb3dhaXQoYnApKSkgeworCQkJeGZzX2lvZXJyb3JfYWxlcnQoInhmc196ZXJvX3JlbWFpbmluZ19ieXRlcyhyZWFkKSIsCisJCQkJCSAgbXAsIGJwLCBYRlNfQlVGX0FERFIoYnApKTsKKwkJCWJyZWFrOworCQl9CisJCW1lbXNldChYRlNfQlVGX1BUUihicCkgKworCQkJKG9mZnNldCAtIFhGU19GU0JfVE9fQihtcCwgaW1hcC5icl9zdGFydG9mZikpLAorCQkgICAgICAwLCBsYXN0b2Zmc2V0IC0gb2Zmc2V0ICsgMSk7CisJCVhGU19CVUZfVU5ET05FKGJwKTsKKwkJWEZTX0JVRl9VTlJFQUQoYnApOworCQlYRlNfQlVGX1dSSVRFKGJwKTsKKwkJeGZzYmRzdHJhdChtcCwgYnApOworCQlpZiAoKGVycm9yID0geGZzX2lvd2FpdChicCkpKSB7CisJCQl4ZnNfaW9lcnJvcl9hbGVydCgieGZzX3plcm9fcmVtYWluaW5nX2J5dGVzKHdyaXRlKSIsCisJCQkJCSAgbXAsIGJwLCBYRlNfQlVGX0FERFIoYnApKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXhmc19idWZfZnJlZShicCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogeGZzX2ZyZWVfZmlsZV9zcGFjZSgpCisgKiAgICAgIFRoaXMgcm91dGluZSBmcmVlcyBkaXNrIHNwYWNlIGZvciB0aGUgZ2l2ZW4gZmlsZS4KKyAqCisgKglUaGlzIHJvdXRpbmUgaXMgb25seSBjYWxsZWQgYnkgeGZzX2NoYW5nZV9maWxlX3NwYWNlCisgKglmb3IgYW4gVU5SRVNWU1AgdHlwZSBjYWxsLgorICoKKyAqIFJFVFVSTlM6CisgKiAgICAgICAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgZXJybm8gb24gZXJyb3IKKyAqCisgKi8KK1NUQVRJQyBpbnQKK3hmc19mcmVlX2ZpbGVfc3BhY2UoCisJeGZzX2lub2RlX3QJCSppcCwKKwl4ZnNfb2ZmX3QJCW9mZnNldCwKKwl4ZnNfb2ZmX3QJCWxlbiwKKwlpbnQJCQlhdHRyX2ZsYWdzKQoreworCWludAkJCWNvbW1pdHRlZDsKKwlpbnQJCQlkb25lOworCXhmc19vZmZfdAkJZW5kX2RtaV9vZmZzZXQ7CisJeGZzX2ZpbGVvZmZfdAkJZW5kb2Zmc2V0X2ZzYjsKKwlpbnQJCQllcnJvcjsKKwl4ZnNfZnNibG9ja190CQlmaXJzdGZzYjsKKwl4ZnNfYm1hcF9mcmVlX3QJCWZyZWVfbGlzdDsKKwl4ZnNfb2ZmX3QJCWlsZW47CisJeGZzX2JtYnRfaXJlY190CQlpbWFwOworCXhmc19vZmZfdAkJaW9mZnNldDsKKwl4ZnNfZXh0bGVuX3QJCW1vZD0wOworCXhmc19tb3VudF90CQkqbXA7CisJaW50CQkJbmltYXA7CisJdWludAkJCXJlc2Jsa3M7CisJaW50CQkJcm91bmRpbmc7CisJaW50CQkJcnQ7CisJeGZzX2ZpbGVvZmZfdAkJc3RhcnRvZmZzZXRfZnNiOworCXhmc190cmFuc190CQkqdHA7CisJaW50CQkJbmVlZF9pb2xvY2sgPSAoYXR0cl9mbGFncyAmIEFUVFJfRE1JKSA9PSAwOworCisJdm5fdHJhY2VfZW50cnkoWEZTX0lUT1YoaXApLCBfX0ZVTkNUSU9OX18sIChpbnN0X3QgKilfX3JldHVybl9hZGRyZXNzKTsKKwltcCA9IGlwLT5pX21vdW50OworCisJaWYgKChlcnJvciA9IFhGU19RTV9EUUFUVEFDSChtcCwgaXAsIDApKSkKKwkJcmV0dXJuIGVycm9yOworCisJZXJyb3IgPSAwOworCWlmIChsZW4gPD0gMCkJLyogaWYgbm90aGluZyBiZWluZyBmcmVlZCAqLworCQlyZXR1cm4gZXJyb3I7CisJcnQgPSAoaXAtPmlfZC5kaV9mbGFncyAmIFhGU19ESUZMQUdfUkVBTFRJTUUpOworCXN0YXJ0b2Zmc2V0X2ZzYgk9IFhGU19CX1RPX0ZTQihtcCwgb2Zmc2V0KTsKKwllbmRfZG1pX29mZnNldCA9IG9mZnNldCArIGxlbjsKKwllbmRvZmZzZXRfZnNiID0gWEZTX0JfVE9fRlNCVChtcCwgZW5kX2RtaV9vZmZzZXQpOworCisJaWYgKG9mZnNldCA8IGlwLT5pX2QuZGlfc2l6ZSAmJgorCSAgICAoYXR0cl9mbGFncyAmIEFUVFJfRE1JKSA9PSAwICYmCisJICAgIERNX0VWRU5UX0VOQUJMRUQoWEZTX01UT1ZGUyhtcCksIGlwLCBETV9FVkVOVF9XUklURSkpIHsKKwkJaWYgKGVuZF9kbWlfb2Zmc2V0ID4gaXAtPmlfZC5kaV9zaXplKQorCQkJZW5kX2RtaV9vZmZzZXQgPSBpcC0+aV9kLmRpX3NpemU7CisJCWVycm9yID0gWEZTX1NFTkRfREFUQShtcCwgRE1fRVZFTlRfV1JJVEUsIFhGU19JVE9WKGlwKSwKKwkJCQlvZmZzZXQsIGVuZF9kbWlfb2Zmc2V0IC0gb2Zmc2V0LAorCQkJCUFUX0RFTEFZX0ZMQUcoYXR0cl9mbGFncyksIE5VTEwpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4oZXJyb3IpOworCX0KKworCWlmIChuZWVkX2lvbG9jaykKKwkJeGZzX2lsb2NrKGlwLCBYRlNfSU9MT0NLX0VYQ0wpOworCXJvdW5kaW5nID0gTUFYKChfX3VpbnQ4X3QpKDEgPDwgbXAtPm1fc2Iuc2JfYmxvY2tsb2cpLAorCQkJKF9fdWludDhfdClOQlBQKTsKKwlpbGVuID0gbGVuICsgKG9mZnNldCAmIChyb3VuZGluZyAtIDEpKTsKKwlpb2Zmc2V0ID0gb2Zmc2V0ICYgfihyb3VuZGluZyAtIDEpOworCWlmIChpbGVuICYgKHJvdW5kaW5nIC0gMSkpCisJCWlsZW4gPSAoaWxlbiArIHJvdW5kaW5nKSAmIH4ocm91bmRpbmcgLSAxKTsKKwl4ZnNfaW52YWxfY2FjaGVkX3BhZ2VzKFhGU19JVE9WKGlwKSwgJihpcC0+aV9pb2NvcmUpLCBpb2Zmc2V0LCAwLCAwKTsKKwkvKgorCSAqIE5lZWQgdG8gemVybyB0aGUgc3R1ZmYgd2UncmUgbm90IGZyZWVpbmcsIG9uIGRpc2suCisJICogSWYgaXRzIGEgcmVhbHRpbWUgZmlsZSAmIGNhbid0IHVzZSB1bndyaXR0ZW4gZXh0ZW50cyB0aGVuIHdlCisJICogYWN0dWFsbHkgbmVlZCB0byB6ZXJvIHRoZSBleHRlbnQgZWRnZXMuICBPdGhlcndpc2UgeGZzX2J1bm1hcGkKKwkgKiB3aWxsIHRha2UgY2FyZSBvZiBpdCBmb3IgdXMuCisJICovCisJaWYgKHJ0ICYmICFYRlNfU0JfVkVSU0lPTl9IQVNFWFRGTEdCSVQoJm1wLT5tX3NiKSkgeworCQluaW1hcCA9IDE7CisJCWVycm9yID0geGZzX2JtYXBpKE5VTEwsIGlwLCBzdGFydG9mZnNldF9mc2IsIDEsIDAsIE5VTEwsIDAsCisJCQkmaW1hcCwgJm5pbWFwLCBOVUxMKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXRfdW5sb2NrX2lvbG9jazsKKwkJQVNTRVJUKG5pbWFwID09IDAgfHwgbmltYXAgPT0gMSk7CisJCWlmIChuaW1hcCAmJiBpbWFwLmJyX3N0YXJ0YmxvY2sgIT0gSE9MRVNUQVJUQkxPQ0spIHsKKwkJCXhmc19kYWRkcl90CWJsb2NrOworCisJCQlBU1NFUlQoaW1hcC5icl9zdGFydGJsb2NrICE9IERFTEFZU1RBUlRCTE9DSyk7CisJCQlibG9jayA9IGltYXAuYnJfc3RhcnRibG9jazsKKwkJCW1vZCA9IGRvX2RpdihibG9jaywgbXAtPm1fc2Iuc2JfcmV4dHNpemUpOworCQkJaWYgKG1vZCkKKwkJCQlzdGFydG9mZnNldF9mc2IgKz0gbXAtPm1fc2Iuc2JfcmV4dHNpemUgLSBtb2Q7CisJCX0KKwkJbmltYXAgPSAxOworCQllcnJvciA9IHhmc19ibWFwaShOVUxMLCBpcCwgZW5kb2Zmc2V0X2ZzYiAtIDEsIDEsIDAsIE5VTEwsIDAsCisJCQkmaW1hcCwgJm5pbWFwLCBOVUxMKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBvdXRfdW5sb2NrX2lvbG9jazsKKwkJQVNTRVJUKG5pbWFwID09IDAgfHwgbmltYXAgPT0gMSk7CisJCWlmIChuaW1hcCAmJiBpbWFwLmJyX3N0YXJ0YmxvY2sgIT0gSE9MRVNUQVJUQkxPQ0spIHsKKwkJCUFTU0VSVChpbWFwLmJyX3N0YXJ0YmxvY2sgIT0gREVMQVlTVEFSVEJMT0NLKTsKKwkJCW1vZCsrOworCQkJaWYgKG1vZCAmJiAobW9kICE9IG1wLT5tX3NiLnNiX3JleHRzaXplKSkKKwkJCQllbmRvZmZzZXRfZnNiIC09IG1vZDsKKwkJfQorCX0KKwlpZiAoKGRvbmUgPSAoZW5kb2Zmc2V0X2ZzYiA8PSBzdGFydG9mZnNldF9mc2IpKSkKKwkJLyoKKwkJICogT25lIGNvbnRpZ3VvdXMgcGllY2UgdG8gY2xlYXIKKwkJICovCisJCWVycm9yID0geGZzX3plcm9fcmVtYWluaW5nX2J5dGVzKGlwLCBvZmZzZXQsIG9mZnNldCArIGxlbiAtIDEpOworCWVsc2UgeworCQkvKgorCQkgKiBTb21lIGZ1bGwgYmxvY2tzLCBwb3NzaWJseSB0d28gcGllY2VzIHRvIGNsZWFyCisJCSAqLworCQlpZiAob2Zmc2V0IDwgWEZTX0ZTQl9UT19CKG1wLCBzdGFydG9mZnNldF9mc2IpKQorCQkJZXJyb3IgPSB4ZnNfemVyb19yZW1haW5pbmdfYnl0ZXMoaXAsIG9mZnNldCwKKwkJCQlYRlNfRlNCX1RPX0IobXAsIHN0YXJ0b2Zmc2V0X2ZzYikgLSAxKTsKKwkJaWYgKCFlcnJvciAmJgorCQkgICAgWEZTX0ZTQl9UT19CKG1wLCBlbmRvZmZzZXRfZnNiKSA8IG9mZnNldCArIGxlbikKKwkJCWVycm9yID0geGZzX3plcm9fcmVtYWluaW5nX2J5dGVzKGlwLAorCQkJCVhGU19GU0JfVE9fQihtcCwgZW5kb2Zmc2V0X2ZzYiksCisJCQkJb2Zmc2V0ICsgbGVuIC0gMSk7CisJfQorCisJLyoKKwkgKiBmcmVlIGZpbGUgc3BhY2UgdW50aWwgZG9uZSBvciB1bnRpbCB0aGVyZSBpcyBhbiBlcnJvcgorCSAqLworCXJlc2Jsa3MgPSBYRlNfRElPU1RSQVRfU1BBQ0VfUkVTKG1wLCAwKTsKKwl3aGlsZSAoIWVycm9yICYmICFkb25lKSB7CisKKwkJLyoKKwkJICogYWxsb2NhdGUgYW5kIHNldHVwIHRoZSB0cmFuc2FjdGlvbgorCQkgKi8KKwkJdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19ESU9TVFJBVCk7CisJCWVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsCisJCQkJCSAgcmVzYmxrcywKKwkJCQkJICBYRlNfV1JJVEVfTE9HX1JFUyhtcCksCisJCQkJCSAgMCwKKwkJCQkJICBYRlNfVFJBTlNfUEVSTV9MT0dfUkVTLAorCQkJCQkgIFhGU19XUklURV9MT0dfQ09VTlQpOworCisJCS8qCisJCSAqIGNoZWNrIGZvciBydW5uaW5nIG91dCBvZiBzcGFjZQorCQkgKi8KKwkJaWYgKGVycm9yKSB7CisJCQkvKgorCQkJICogRnJlZSB0aGUgdHJhbnNhY3Rpb24gc3RydWN0dXJlLgorCQkJICovCisJCQlBU1NFUlQoZXJyb3IgPT0gRU5PU1BDIHx8IFhGU19GT1JDRURfU0hVVERPV04obXApKTsKKwkJCXhmc190cmFuc19jYW5jZWwodHAsIDApOworCQkJYnJlYWs7CisJCX0KKwkJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCWVycm9yID0gWEZTX1RSQU5TX1JFU0VSVkVfUVVPVEEobXAsIHRwLAorCQkJCWlwLT5pX3VkcXVvdCwgaXAtPmlfZ2RxdW90LCByZXNibGtzLCAwLCBydCA/CisJCQkJWEZTX1FNT1BUX1JFU19SVEJMS1MgOiBYRlNfUU1PUFRfUkVTX1JFR0JMS1MpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGVycm9yMTsKKworCQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJCXhmc190cmFuc19paG9sZCh0cCwgaXApOworCisJCS8qCisJCSAqIGlzc3VlIHRoZSBidW5tYXBpKCkgY2FsbCB0byBmcmVlIHRoZSBibG9ja3MKKwkJICovCisJCVhGU19CTUFQX0lOSVQoJmZyZWVfbGlzdCwgJmZpcnN0ZnNiKTsKKwkJZXJyb3IgPSB4ZnNfYnVubWFwaSh0cCwgaXAsIHN0YXJ0b2Zmc2V0X2ZzYiwKKwkJCQkgIGVuZG9mZnNldF9mc2IgLSBzdGFydG9mZnNldF9mc2IsCisJCQkJICAwLCAyLCAmZmlyc3Rmc2IsICZmcmVlX2xpc3QsICZkb25lKTsKKwkJaWYgKGVycm9yKSB7CisJCQlnb3RvIGVycm9yMDsKKwkJfQorCisJCS8qCisJCSAqIGNvbXBsZXRlIHRoZSB0cmFuc2FjdGlvbgorCQkgKi8KKwkJZXJyb3IgPSB4ZnNfYm1hcF9maW5pc2goJnRwLCAmZnJlZV9saXN0LCBmaXJzdGZzYiwgJmNvbW1pdHRlZCk7CisJCWlmIChlcnJvcikgeworCQkJZ290byBlcnJvcjA7CisJCX0KKworCQllcnJvciA9IHhmc190cmFuc19jb21taXQodHAsIFhGU19UUkFOU19SRUxFQVNFX0xPR19SRVMsIE5VTEwpOworCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCX0KKworIG91dF91bmxvY2tfaW9sb2NrOgorCWlmIChuZWVkX2lvbG9jaykKKwkJeGZzX2l1bmxvY2soaXAsIFhGU19JT0xPQ0tfRVhDTCk7CisJcmV0dXJuIGVycm9yOworCisgZXJyb3IwOgorCXhmc19ibWFwX2NhbmNlbCgmZnJlZV9saXN0KTsKKyBlcnJvcjE6CisJeGZzX3RyYW5zX2NhbmNlbCh0cCwgWEZTX1RSQU5TX1JFTEVBU0VfTE9HX1JFUyB8IFhGU19UUkFOU19BQk9SVCk7CisJeGZzX2l1bmxvY2soaXAsIG5lZWRfaW9sb2NrID8gKFhGU19JTE9DS19FWENMIHwgWEZTX0lPTE9DS19FWENMKSA6CisJCSAgICBYRlNfSUxPQ0tfRVhDTCk7CisJcmV0dXJuIGVycm9yOworfQorCisvKgorICogeGZzX2NoYW5nZV9maWxlX3NwYWNlKCkKKyAqICAgICAgVGhpcyByb3V0aW5lIGFsbG9jYXRlcyBvciBmcmVlcyBkaXNrIHNwYWNlIGZvciB0aGUgZ2l2ZW4gZmlsZS4KKyAqICAgICAgVGhlIHVzZXIgc3BlY2lmaWVkIHBhcmFtZXRlcnMgYXJlIGNoZWNrZWQgZm9yIGFsaWdubWVudCBhbmQgc2l6ZQorICogICAgICBsaW1pdGF0aW9ucy4KKyAqCisgKiBSRVRVUk5TOgorICogICAgICAgMCBvbiBzdWNjZXNzCisgKiAgICAgIGVycm5vIG9uIGVycm9yCisgKgorICovCitpbnQKK3hmc19jaGFuZ2VfZmlsZV9zcGFjZSgKKwliaHZfZGVzY190CSpiZHAsCisJaW50CQljbWQsCisJeGZzX2Zsb2NrNjRfdAkqYmYsCisJeGZzX29mZl90CW9mZnNldCwKKwljcmVkX3QJCSpjcmVkcCwKKwlpbnQJCWF0dHJfZmxhZ3MpCit7CisJaW50CQljbHJwcmVhbGxvYzsKKwlpbnQJCWVycm9yOworCXhmc19mc2l6ZV90CWZzaXplOworCXhmc19pbm9kZV90CSppcDsKKwl4ZnNfbW91bnRfdAkqbXA7CisJaW50CQlzZXRwcmVhbGxvYzsKKwl4ZnNfb2ZmX3QJc3RhcnRvZmZzZXQ7CisJeGZzX29mZl90CWxsZW47CisJeGZzX3RyYW5zX3QJKnRwOworCXZhdHRyX3QJCXZhOworCXZub2RlX3QJCSp2cDsKKworCXZwID0gQkhWX1RPX1ZOT0RFKGJkcCk7CisJdm5fdHJhY2VfZW50cnkodnAsIF9fRlVOQ1RJT05fXywgKGluc3RfdCAqKV9fcmV0dXJuX2FkZHJlc3MpOworCisJaXAgPSBYRlNfQkhWVE9JKGJkcCk7CisJbXAgPSBpcC0+aV9tb3VudDsKKworCS8qCisJICogbXVzdCBiZSBhIHJlZ3VsYXIgZmlsZSBhbmQgaGF2ZSB3cml0ZSBwZXJtaXNzaW9uCisJICovCisJaWYgKHZwLT52X3R5cGUgIT0gVlJFRykKKwkJcmV0dXJuIFhGU19FUlJPUihFSU5WQUwpOworCisJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfU0hBUkVEKTsKKworCWlmICgoZXJyb3IgPSB4ZnNfaWFjY2VzcyhpcCwgU19JV1VTUiwgY3JlZHApKSkgeworCQl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX1NIQVJFRCk7CisKKwlzd2l0Y2ggKGJmLT5sX3doZW5jZSkgeworCWNhc2UgMDogLypTRUVLX1NFVCovCisJCWJyZWFrOworCWNhc2UgMTogLypTRUVLX0NVUiovCisJCWJmLT5sX3N0YXJ0ICs9IG9mZnNldDsKKwkJYnJlYWs7CisJY2FzZSAyOiAvKlNFRUtfRU5EKi8KKwkJYmYtPmxfc3RhcnQgKz0gaXAtPmlfZC5kaV9zaXplOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisJfQorCisJbGxlbiA9IGJmLT5sX2xlbiA+IDAgPyBiZi0+bF9sZW4gLSAxIDogYmYtPmxfbGVuOworCisJaWYgKCAgIChiZi0+bF9zdGFydCA8IDApCisJICAgIHx8IChiZi0+bF9zdGFydCA+IFhGU19NQVhJT0ZGU0VUKG1wKSkKKwkgICAgfHwgKGJmLT5sX3N0YXJ0ICsgbGxlbiA8IDApCisJICAgIHx8IChiZi0+bF9zdGFydCArIGxsZW4gPiBYRlNfTUFYSU9GRlNFVChtcCkpKQorCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisKKwliZi0+bF93aGVuY2UgPSAwOworCisJc3RhcnRvZmZzZXQgPSBiZi0+bF9zdGFydDsKKwlmc2l6ZSA9IGlwLT5pX2QuZGlfc2l6ZTsKKworCS8qCisJICogWEZTX0lPQ19SRVNWU1AgYW5kIFhGU19JT0NfVU5SRVNWU1Agd2lsbCByZXNlcnZlIG9yIHVucmVzZXJ2ZQorCSAqIGZpbGUgc3BhY2UuCisJICogVGhlc2UgY2FsbHMgZG8gTk9UIHplcm8gdGhlIGRhdGEgc3BhY2UgYWxsb2NhdGVkIHRvIHRoZSBmaWxlLAorCSAqIG5vciBkbyB0aGV5IGNoYW5nZSB0aGUgZmlsZSBzaXplLgorCSAqCisJICogWEZTX0lPQ19BTExPQ1NQIGFuZCBYRlNfSU9DX0ZSRUVTUCB3aWxsIGFsbG9jYXRlIGFuZCBmcmVlIGZpbGUKKwkgKiBzcGFjZS4KKwkgKiBUaGVzZSBjYWxscyBjYXVzZSB0aGUgbmV3IGZpbGUgZGF0YSB0byBiZSB6ZXJvZWQgYW5kIHRoZSBmaWxlCisJICogc2l6ZSB0byBiZSBjaGFuZ2VkLgorCSAqLworCXNldHByZWFsbG9jID0gY2xycHJlYWxsb2MgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFhGU19JT0NfUkVTVlNQOgorCWNhc2UgWEZTX0lPQ19SRVNWU1A2NDoKKwkJZXJyb3IgPSB4ZnNfYWxsb2NfZmlsZV9zcGFjZShpcCwgc3RhcnRvZmZzZXQsIGJmLT5sX2xlbiwKKwkJCQkJCQkJMSwgYXR0cl9mbGFncyk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwkJc2V0cHJlYWxsb2MgPSAxOworCQlicmVhazsKKworCWNhc2UgWEZTX0lPQ19VTlJFU1ZTUDoKKwljYXNlIFhGU19JT0NfVU5SRVNWU1A2NDoKKwkJaWYgKChlcnJvciA9IHhmc19mcmVlX2ZpbGVfc3BhY2UoaXAsIHN0YXJ0b2Zmc2V0LCBiZi0+bF9sZW4sCisJCQkJCQkJCWF0dHJfZmxhZ3MpKSkKKwkJCXJldHVybiBlcnJvcjsKKwkJYnJlYWs7CisKKwljYXNlIFhGU19JT0NfQUxMT0NTUDoKKwljYXNlIFhGU19JT0NfQUxMT0NTUDY0OgorCWNhc2UgWEZTX0lPQ19GUkVFU1A6CisJY2FzZSBYRlNfSU9DX0ZSRUVTUDY0OgorCQlpZiAoc3RhcnRvZmZzZXQgPiBmc2l6ZSkgeworCQkJZXJyb3IgPSB4ZnNfYWxsb2NfZmlsZV9zcGFjZShpcCwgZnNpemUsCisJCQkJCXN0YXJ0b2Zmc2V0IC0gZnNpemUsIDAsIGF0dHJfZmxhZ3MpOworCQkJaWYgKGVycm9yKQorCQkJCWJyZWFrOworCQl9CisKKwkJdmEudmFfbWFzayA9IFhGU19BVF9TSVpFOworCQl2YS52YV9zaXplID0gc3RhcnRvZmZzZXQ7CisKKwkJZXJyb3IgPSB4ZnNfc2V0YXR0cihiZHAsICZ2YSwgYXR0cl9mbGFncywgY3JlZHApOworCisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKworCQljbHJwcmVhbGxvYyA9IDE7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJQVNTRVJUKDApOworCQlyZXR1cm4gWEZTX0VSUk9SKEVJTlZBTCk7CisJfQorCisJLyoKKwkgKiB1cGRhdGUgdGhlIGlub2RlIHRpbWVzdGFtcCwgbW9kZSwgYW5kIHByZWFsbG9jIGZsYWcgYml0cworCSAqLworCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfV1JJVEVJRCk7CisKKwlpZiAoKGVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsIFhGU19XUklURUlEX0xPR19SRVMobXApLAorCQkJCSAgICAgIDAsIDAsIDApKSkgeworCQkvKiBBU1NFUlQoMCk7ICovCisJCXhmc190cmFuc19jYW5jZWwodHAsIDApOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisKKwl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJeGZzX3RyYW5zX2lob2xkKHRwLCBpcCk7CisKKwlpZiAoKGF0dHJfZmxhZ3MgJiBBVFRSX0RNSSkgPT0gMCkgeworCQlpcC0+aV9kLmRpX21vZGUgJj0gflNfSVNVSUQ7CisKKwkJLyoKKwkJICogTm90ZSB0aGF0IHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgbWFuZGF0b3J5CisJCSAqIGZpbGUgbG9ja2luZyBiZWluZyBkaXNhYmxlZCBoZXJlIGJlY2F1c2Ugd2Ugb25seQorCQkgKiBjbGVhciB0aGUgU19JU0dJRCBiaXQgaWYgdGhlIEdyb3VwIGV4ZWN1dGUgYml0IGlzCisJCSAqIG9uLCBidXQgaWYgaXQgd2FzIG9uIHRoZW4gbWFuZGF0b3J5IGxvY2tpbmcgd291bGRuJ3QKKwkJICogaGF2ZSBiZWVuIGVuYWJsZWQuCisJCSAqLworCQlpZiAoaXAtPmlfZC5kaV9tb2RlICYgU19JWEdSUCkKKwkJCWlwLT5pX2QuZGlfbW9kZSAmPSB+U19JU0dJRDsKKworCQl4ZnNfaWNoZ3RpbWUoaXAsIFhGU19JQ0hHVElNRV9NT0QgfCBYRlNfSUNIR1RJTUVfQ0hHKTsKKwl9CisJaWYgKHNldHByZWFsbG9jKQorCQlpcC0+aV9kLmRpX2ZsYWdzIHw9IFhGU19ESUZMQUdfUFJFQUxMT0M7CisJZWxzZSBpZiAoY2xycHJlYWxsb2MpCisJCWlwLT5pX2QuZGlfZmxhZ3MgJj0gflhGU19ESUZMQUdfUFJFQUxMT0M7CisKKwl4ZnNfdHJhbnNfbG9nX2lub2RlKHRwLCBpcCwgWEZTX0lMT0dfQ09SRSk7CisJeGZzX3RyYW5zX3NldF9zeW5jKHRwKTsKKworCWVycm9yID0geGZzX3RyYW5zX2NvbW1pdCh0cCwgMCwgTlVMTCk7CisKKwl4ZnNfaXVubG9jayhpcCwgWEZTX0lMT0NLX0VYQ0wpOworCisJcmV0dXJuIGVycm9yOworfQorCit2bm9kZW9wc190IHhmc192bm9kZW9wcyA9IHsKKwlCSFZfSURFTlRJVFlfSU5JVChWTl9CSFZfWEZTLFZOT0RFX1BPU0lUSU9OX1hGUyksCisJLnZvcF9vcGVuCQk9IHhmc19vcGVuLAorCS52b3BfcmVhZAkJPSB4ZnNfcmVhZCwKKyNpZmRlZiBIQVZFX1NFTkRGSUxFCisJLnZvcF9zZW5kZmlsZQkJPSB4ZnNfc2VuZGZpbGUsCisjZW5kaWYKKwkudm9wX3dyaXRlCQk9IHhmc193cml0ZSwKKwkudm9wX2lvY3RsCQk9IHhmc19pb2N0bCwKKwkudm9wX2dldGF0dHIJCT0geGZzX2dldGF0dHIsCisJLnZvcF9zZXRhdHRyCQk9IHhmc19zZXRhdHRyLAorCS52b3BfYWNjZXNzCQk9IHhmc19hY2Nlc3MsCisJLnZvcF9sb29rdXAJCT0geGZzX2xvb2t1cCwKKwkudm9wX2NyZWF0ZQkJPSB4ZnNfY3JlYXRlLAorCS52b3BfcmVtb3ZlCQk9IHhmc19yZW1vdmUsCisJLnZvcF9saW5rCQk9IHhmc19saW5rLAorCS52b3BfcmVuYW1lCQk9IHhmc19yZW5hbWUsCisJLnZvcF9ta2RpcgkJPSB4ZnNfbWtkaXIsCisJLnZvcF9ybWRpcgkJPSB4ZnNfcm1kaXIsCisJLnZvcF9yZWFkZGlyCQk9IHhmc19yZWFkZGlyLAorCS52b3Bfc3ltbGluawkJPSB4ZnNfc3ltbGluaywKKwkudm9wX3JlYWRsaW5rCQk9IHhmc19yZWFkbGluaywKKwkudm9wX2ZzeW5jCQk9IHhmc19mc3luYywKKwkudm9wX2luYWN0aXZlCQk9IHhmc19pbmFjdGl2ZSwKKwkudm9wX2ZpZDIJCT0geGZzX2ZpZDIsCisJLnZvcF9yd2xvY2sJCT0geGZzX3J3bG9jaywKKwkudm9wX3J3dW5sb2NrCQk9IHhmc19yd3VubG9jaywKKwkudm9wX2JtYXAJCT0geGZzX2JtYXAsCisJLnZvcF9yZWNsYWltCQk9IHhmc19yZWNsYWltLAorCS52b3BfYXR0cl9nZXQJCT0geGZzX2F0dHJfZ2V0LAorCS52b3BfYXR0cl9zZXQJCT0geGZzX2F0dHJfc2V0LAorCS52b3BfYXR0cl9yZW1vdmUJPSB4ZnNfYXR0cl9yZW1vdmUsCisJLnZvcF9hdHRyX2xpc3QJCT0geGZzX2F0dHJfbGlzdCwKKwkudm9wX2xpbmtfcmVtb3ZlZAk9ICh2b3BfbGlua19yZW1vdmVkX3QpZnNfbm92YWwsCisJLnZvcF92bm9kZV9jaGFuZ2UJPSAodm9wX3Zub2RlX2NoYW5nZV90KWZzX25vdmFsLAorCS52b3BfdG9zc3BhZ2VzCQk9IGZzX3Rvc3NwYWdlcywKKwkudm9wX2ZsdXNoaW52YWxfcGFnZXMJPSBmc19mbHVzaGludmFsX3BhZ2VzLAorCS52b3BfZmx1c2hfcGFnZXMJPSBmc19mbHVzaF9wYWdlcywKKwkudm9wX3JlbGVhc2UJCT0geGZzX3JlbGVhc2UsCisJLnZvcF9pZmx1c2gJCT0geGZzX2lub2RlX2ZsdXNoLAorfTsK